ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1lYyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1lYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQ2MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9kZWJ1Z2ZzLWVjCkBAIC0wLDAgKzEsMjAgQEAKK1doYXQ6CQkvc3lzL2tlcm5lbC9kZWJ1Zy9lYy8qL3tncGUsdXNlX2dsb2JhbF9sb2NrLGlvfQorRGF0ZToJCUp1bHkgMjAxMAorQ29udGFjdDoJVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4KK0Rlc2NyaXB0aW9uOgorCitHZW5lcmFsIGluZm9ybWF0aW9uIGxpa2Ugd2hpY2ggR1BFIGlzIGFzc2lnbmVkIHRvIHRoZSBFQyBhbmQgd2hldGhlcgordGhlIGdsb2JhbCBsb2NrIHNob3VsZCBnZXQgdXNlZC4KK0tub3dpbmcgdGhlIEVDIEdQRSBvbmUgY2FuIHdhdGNoIHRoZSBhbW91bnQgb2YgSFcgZXZlbnRzIHJlbGF0ZWQgdG8KK3RoZSBFQyBoZXJlIChYWSAtPiBHUEUgbnVtYmVyIGZyb20gL3N5cy9rZXJuZWwvZGVidWcvZWMvKi9ncGUpOgorL3N5cy9maXJtd2FyZS9hY3BpL2ludGVycnVwdHMvZ3BlWFkKKworVGhlIGlvIGZpbGUgaXMgYmluYXJ5IGFuZCBhIHVzZXJzcGFjZSB0b29sIGxvY2F0ZWQgaGVyZToKK2Z0cDovL2Z0cC5zdXNlLmNvbS9wdWIvcGVvcGxlL3RyZW5uL3NvdXJjZXMvZWMvCitzaG91bGQgZ2V0IHVzZWQgdG8gcmVhZCBvdXQgdGhlIDI1NiBFbWJlZGRlZCBDb250cm9sbGVyIHJlZ2lzdGVycworb3Igd3JpdGluZyB0byB0aGVtLgorCitDQVVUSU9OOiBEbyBub3Qgd3JpdGUgdG8gdGhlIEVtYmVkZGVkIENvbnRyb2xsZXIgaWYgeW91IGRvbid0IGtub3cKK3doYXQgeW91IGFyZSBkb2luZyEgUmVib290aW5nIGFmdGVyd2FyZHMgYWxzbyBpcyBhIGdvb2QgaWRlYS4KK1RoaXMgY2FuIGluZmx1ZW5jZSB0aGUgd2F5IHlvdXIgbWFjaGluZSBpcyBjb29sZWQgYW5kIGZhbnMgbWF5Citub3QgZ2V0IHN3aXRjaGVkIG9uIGFnYWluIGFmdGVyIHlvdSBkaWQgYSB3cm9uZyB3cml0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1rbWVtdHJhY2UgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2RlYnVnZnMta21lbXRyYWNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTZhOTJhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1rbWVtdHJhY2UKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1XaGF0OgkJL3N5cy9rZXJuZWwvZGVidWcva21lbXRyYWNlLwotRGF0ZToJCUp1bHkgMjAwOAotQ29udGFjdDoJRWR1YXJkIC0gR2FicmllbCBNdW50ZWFudSA8ZWR1YXJkLm11bnRlYW51QGxpbnV4MzYwLnJvPgotRGVzY3JpcHRpb246Ci0KLUluIGttZW10cmFjZS1lbmFibGVkIGtlcm5lbHMsIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGNyZWF0ZWQ6Ci0KLS9zeXMva2VybmVsL2RlYnVnL2ttZW10cmFjZS8KLQljcHU8bj4JCSgwNDAwKQlQZXItQ1BVIHRyYWNpbmcgZGF0YSwgc2VlIGJlbG93LiAoYmluYXJ5KQotCXRvdGFsX292ZXJydW5zCSgwNDAwKQlUb3RhbCBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2VyZSBkcm9wcGVkIGZyb20KLQkJCQljcHU8bj4gZmlsZXMgYmVjYXVzZSBvZiBmdWxsIGJ1ZmZlciBjb25kaXRpb24sCi0JCQkJbm9uLWJpbmFyeS4gKHRleHQpCi0JYWJpX3ZlcnNpb24JKDA0MDApCUtlcm5lbCdzIGttZW10cmFjZSBBQkkgdmVyc2lvbi4gKHRleHQpCi0KLUVhY2ggcGVyLUNQVSBmaWxlIHNob3VsZCBiZSByZWFkIGFjY29yZGluZyB0byB0aGUgcmVsYXkgaW50ZXJmYWNlLiBUaGF0IGlzLAotdGhlIHJlYWRlciBzaG91bGQgc2V0IGFmZmluaXR5IHRvIHRoYXQgc3BlY2lmaWMgQ1BVIGFuZCwgYXMgY3VycmVudGx5IGRvbmUgYnkKLXRoZSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gKHRob3VnaCB0aGVyZSBhcmUgb3RoZXIgbWV0aG9kcyksIHVzZSBwb2xsKCkgd2l0aAotYW4gaW5maW5pdGUgdGltZW91dCBiZWZvcmUgZXZlcnkgcmVhZCgpLiBPdGhlcndpc2UsIGVycm9uZW91cyBkYXRhIG1heSBiZQotcmVhZC4gVGhlIGJpbmFyeSBkYXRhIGhhcyB0aGUgZm9sbG93aW5nIF9jb3JlXyBmb3JtYXQ6Ci0KLQlFdmVudCBJRAkoMSBieXRlKQlVbnNpZ25lZCBpbnRlZ2VyLCBvbmUgb2Y6Ci0JCTAgLSByZXByZXNlbnRzIGFuIGFsbG9jYXRpb24gKEtNRU1UUkFDRV9FVkVOVF9BTExPQykKLQkJMSAtIHJlcHJlc2VudHMgYSBmcmVlaW5nIG9mIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeQotCQkgICAgKEtNRU1UUkFDRV9FVkVOVF9GUkVFKQotCVR5cGUgSUQJCSgxIGJ5dGUpCVVuc2lnbmVkIGludGVnZXIsIG9uZSBvZjoKLQkJMCAtIHRoaXMgaXMgYSBrbWFsbG9jKCkgLyBrZnJlZSgpCi0JCTEgLSB0aGlzIGlzIGEga21lbV9jYWNoZV9hbGxvYygpIC8ga21lbV9jYWNoZV9mcmVlKCkKLQkJMiAtIHRoaXMgaXMgYSBfX2dldF9mcmVlX3BhZ2VzKCkgZXQgYWwuCi0JRXZlbnQgc2l6ZQkoMiBieXRlcykJVW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlCi0JCQkJCXNpemUgb2YgdGhpcyBldmVudC4gVXNlZCB0byBleHRlbmQKLQkJCQkJa21lbXRyYWNlLiBEaXNjYXJkIHRoZSBieXRlcyB5b3UKLQkJCQkJZG9uJ3Qga25vdyBhYm91dC4KLQlTZXF1ZW5jZSBudW1iZXIJKDQgYnl0ZXMpCVNpZ25lZCBpbnRlZ2VyIHVzZWQgdG8gcmVvcmRlciBkYXRhCi0JCQkJCWxvZ2dlZCBvbiBTTVAgbWFjaGluZXMuIFdyYXBhcm91bmQKLQkJCQkJbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQsIGFsdGhvdWdoCi0JCQkJCWl0IGlzIHVubGlrZWx5LgotCUNhbGxlciBhZGRyZXNzCSg4IGJ5dGVzKQlSZXR1cm4gYWRkcmVzcyB0byB0aGUgY2FsbGVyLgotCVBvaW50ZXIgdG8gbWVtCSg4IGJ5dGVzKQlQb2ludGVyIHRvIHRhcmdldCBtZW1vcnkgYXJlYS4gQ2FuIGJlCi0JCQkJCU5VTEwsIGJ1dCBub3QgYWxsIHN1Y2ggY2FsbHMgbWlnaHQgYmUKLQkJCQkJcmVjb3JkZWQuCi0KLUluIGNhc2Ugb2YgS01FTVRSQUNFX0VWRU5UX0FMTE9DIGV2ZW50cywgdGhlIG5leHQgZmllbGRzIGZvbGxvdzoKLQotCVJlcXVlc3RlZCBieXRlcwkoOCBieXRlcykJVG90YWwgbnVtYmVyIG9mIHJlcXVlc3RlZCBieXRlcywKLQkJCQkJdW5zaWduZWQsIG11c3Qgbm90IGJlIHplcm8uCi0JQWxsb2NhdGVkIGJ5dGVzICg4IGJ5dGVzKQlUb3RhbCBudW1iZXIgb2YgYWN0dWFsbHkgYWxsb2NhdGVkCi0JCQkJCWJ5dGVzLCB1bnNpZ25lZCwgbXVzdCBub3QgYmUgbG93ZXIKLQkJCQkJdGhhbiByZXF1ZXN0ZWQgYnl0ZXMuCi0JUmVxdWVzdGVkIGZsYWdzCSg0IGJ5dGVzKQlHRlAgZmxhZ3Mgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4KLQlUYXJnZXQgQ1BVCSg0IGJ5dGVzKQlTaWduZWQgaW50ZWdlciwgdmFsaWQgZm9yIGV2ZW50IGlkIDEuCi0JCQkJCUlmIGVxdWFsIHRvIC0xLCB0YXJnZXQgQ1BVIGlzIHRoZSBzYW1lCi0JCQkJCWFzIG9yaWdpbiBDUFUsIGJ1dCB0aGUgcmV2ZXJzZSBtaWdodAotCQkJCQlub3QgYmUgdHJ1ZS4KLQotVGhlIGRhdGEgaXMgbWFkZSBhdmFpbGFibGUgaW4gdGhlIHNhbWUgZW5kaWFubmVzcyB0aGUgbWFjaGluZSBoYXMuCi0KLU90aGVyIGV2ZW50IGlkcyBhbmQgdHlwZSBpZHMgbWF5IGJlIGRlZmluZWQgYW5kIGFkZGVkLiBPdGhlciBmaWVsZHMgbWF5IGJlCi1hZGRlZCBieSBpbmNyZWFzaW5nIGV2ZW50IHNpemUsIGJ1dCBzZWUgYmVsb3cgZm9yIGRldGFpbHMuCi1FdmVyeSBtb2RpZmljYXRpb24gdG8gdGhlIEFCSSwgaW5jbHVkaW5nIG5ldyBpZCBkZWZpbml0aW9ucywgYXJlIGZvbGxvd2VkCi1ieSBidW1waW5nIHRoZSBBQkkgdmVyc2lvbiBieSBvbmUuCi0KLUFkZGluZyBuZXcgZGF0YSB0byB0aGUgcGFja2V0IChmZWF0dXJlcykgaXMgZG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBtYW5kYXRvcnkKLWRhdGE6Ci0JRmVhdHVyZSBzaXplCSgyIGJ5dGUpCi0JRmVhdHVyZSBJRAkoMSBieXRlKQotCUZlYXR1cmUgZGF0YQkoRmVhdHVyZSBzaXplIC0gMyBieXRlcykKLQotCi1Vc2VyczoKLQlrbWVtdHJhY2UtdXNlciAtIGdpdDovL3JlcG8ub3IuY3ova21lbXRyYWNlLXVzZXIuZ2l0Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQppbmRleCAyNWJlMzI1Li5mOTc5ZDgyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1wY2kKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtcGNpCkBAIC0xMzksMyArMTM5LDMwIEBACiBEZXNjcmlwdGlvbjoKIAkJVGhpcyBzeW1ib2xpYyBsaW5rIHBvaW50cyB0byB0aGUgUENJIGhvdHBsdWcgY29udHJvbGxlciBkcml2ZXIKIAkJbW9kdWxlIHRoYXQgbWFuYWdlcyB0aGUgaG90cGx1ZyBzbG90LgorCitXaGF0OgkJL3N5cy9idXMvcGNpL2RldmljZXMvLi4uL2xhYmVsCitEYXRlOgkJSnVseSAyMDEwCitDb250YWN0OglOYXJlbmRyYSBLIDxuYXJlbmRyYV9rQGRlbGwuY29tPiwgbGludXgtYnVnc0BkZWxsLmNvbQorRGVzY3JpcHRpb246CisJCVJlYWRpbmcgdGhpcyBhdHRyaWJ1dGUgd2lsbCBwcm92aWRlIHRoZSBmaXJtd2FyZQorCQlnaXZlbiBuYW1lKFNNQklPUyB0eXBlIDQxIHN0cmluZykgb2YgdGhlIFBDSSBkZXZpY2UuCisJCVRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBjcmVhdGVkIG9ubHkgaWYgdGhlIGZpcm13YXJlCisJCWhhcyBnaXZlbiBhIG5hbWUgdG8gdGhlIFBDSSBkZXZpY2UuCitVc2VyczoKKwkJVXNlcnNwYWNlIGFwcGxpY2F0aW9ucyBpbnRlcmVzdGVkIGluIGtub3dpbmcgdGhlCisJCWZpcm13YXJlIGFzc2lnbmVkIG5hbWUgb2YgdGhlIFBDSSBkZXZpY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9wY2kvZGV2aWNlcy8uLi4vaW5kZXgKK0RhdGU6CQlKdWx5IDIwMTAKK0NvbnRhY3Q6CU5hcmVuZHJhIEsgPG5hcmVuZHJhX2tAZGVsbC5jb20+LCBsaW51eC1idWdzQGRlbGwuY29tCitEZXNjcmlwdGlvbjoKKwkJUmVhZGluZyB0aGlzIGF0dHJpYnV0ZSB3aWxsIHByb3ZpZGUgdGhlIGZpcm13YXJlCisJCWdpdmVuIGluc3RhbmNlKFNNQklPUyB0eXBlIDQxIGRldmljZSB0eXBlIGluc3RhbmNlKQorCQlvZiB0aGUgUENJIGRldmljZS4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGNyZWF0ZWQKKwkJb25seSBpZiB0aGUgZmlybXdhcmUgaGFzIGdpdmVuIGEgZGV2aWNlIHR5cGUgaW5zdGFuY2UKKwkJdG8gdGhlIFBDSSBkZXZpY2UuCitVc2VyczoKKwkJVXNlcnNwYWNlIGFwcGxpY2F0aW9ucyBpbnRlcmVzdGVkIGluIGtub3dpbmcgdGhlCisJCWZpcm13YXJlIGFzc2lnbmVkIGRldmljZSB0eXBlIGluc3RhbmNlIG9mIHRoZSBQQ0kKKwkJZGV2aWNlIHRoYXQgY2FuIGhlbHAgaW4gdW5kZXJzdGFuZGluZyB0aGUgZmlybXdhcmUKKwkJaW50ZW5kZWQgb3JkZXIgb2YgdGhlIFBDSSBkZXZpY2UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeQppbmRleCBhYmE3ZDk4Li43NDA1ZGUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1tZW1vcnkKQEAgLTcsNyArNyw3IEBACiAJCWFkZGVkIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgdG8gcmVwcmVzZW50IGhvdC1hZGQvcmVtb3ZlCiAJCW9wZXJhdGlvbnMuCiBVc2VyczoJCWhvdHBsdWcgbWVtb3J5IGFkZC9yZW1vdmUgdG9vbHMKLQkJaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vcHJvamVjdHMvcG93ZXJwYy11dGlscy8KKwkJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL3dpa2lzL2Rpc3BsYXkvTGludXhQL3Bvd2VycGMtdXRpbHMKIAogV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcmVtb3ZhYmxlCiBEYXRlOgkJSnVuZSAyMDA4CkBAIC0xOSw3ICsxOSw3IEBACiAJCWlkZW50aWZ5IHJlbW92YWJsZSBzZWN0aW9ucyBvZiB0aGUgbWVtb3J5IGJlZm9yZSBhdHRlbXB0aW5nCiAJCXBvdGVudGlhbGx5IGV4cGVuc2l2ZSBob3QtcmVtb3ZlIG1lbW9yeSBvcGVyYXRpb24KIFVzZXJzOgkJaG90cGx1ZyBtZW1vcnkgcmVtb3ZlIHRvb2xzCi0JCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCisJCWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93aWtpcy9kaXNwbGF5L0xpbnV4UC9wb3dlcnBjLXV0aWxzCQogCiBXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9waHlzX2RldmljZQogRGF0ZToJCVNlcHRlbWJlciAyMDA4CkBAIC01OCw3ICs1OCw3IEBACiAJCWJ5IHJvb3QgdG8gb2ZmbGluZSB0aGF0IHNlY3Rpb24uCiAJCSMgZWNobyBvZmZsaW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvc3RhdGUKIFVzZXJzOgkJaG90cGx1ZyBtZW1vcnkgcmVtb3ZlIHRvb2xzCi0JCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCisJCWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93aWtpcy9kaXNwbGF5L0xpbnV4UC9wb3dlcnBjLXV0aWxzCiAKIAogV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5WC9ub2RlWQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLWNwdQppbmRleCA4NGE3MTBmLi43NTY0ZTg4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLWNwdQorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtc3lzdGVtLWNwdQpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCUN1cnJlbnRseSwgb25seSBBTUQgRmFtaWx5IDEwaCBQcm9jZXNzb3JzIHN1cHBvcnQgY2FjaGUgaW5kZXgKIAkJZGlzYWJsZSwgYW5kIG9ubHkgZm9yIHRoZWlyIEwzIGNhY2hlcy4gIFNlZSB0aGUgQklPUyBhbmQKIAkJS2VybmVsIERldmVsb3BlcidzIEd1aWRlIGF0Ci0JCWh0dHA6Ly93d3cuYW1kLmNvbS91cy1lbi9hc3NldHMvY29udGVudF90eXBlL3doaXRlX3BhcGVyc19hbmRfdGVjaF9kb2NzLzMxMTE2LVB1YmxpYy1HSC1CS0RHXzMuMjBfMi00LTA5LnBkZgorCQlodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL0VtYmVkZGVkX1RlY2hEb2NzLzMxMTE2LVB1YmxpYy1HSC1CS0RHXzMtMjhfNS0yOC0wOS5wZGYJCiAJCWZvciBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGFuZCBvdGhlciBkZXRhaWxzIG9uIHRoZQogCQljYWNoZSBpbmRleCBkaXNhYmxlLgogVXNlcnM6ICAgIGpvYWNoaW0uZGVndWFyYUBhbWQuY29tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmUgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmUKaW5kZXggODgzNDBhMi4uMDYzYmRhNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZQpAQCAtMzMsMTkgKzMzLDYgQEAKIAkJbGVmdC4gRS5nLiBhIHJldHVybmVkIHZhbHVlIG9mIDEzOCBtZWFucyAxLjM4CiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4va29uZV9kcml2ZXJfdmVyc2lvbgotRGF0ZToJCU1hcmNoIDIwMTAKLUNvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci1EZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgZHJpdmVyIHZlcnNpb24uCi0JCVRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyBpcyAidjxtYWpvcj4uPG1pbm9yPi48cGF0Y2hsZXZlbD4iLgotCQlUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGJ5IHRoZSB1c2VybGFuZCB0b29scyB0byBmaW5kIHRoZSBzeXNmcy0KLQkJcGF0aHMgb2YgaW5zdGFsbGVkIGtvbmUtbWljZSBhbmQgZGV0ZXJtaW5lIHRoZSBjYXBhYmlsaXRlcyBvZgotCQl0aGUgZHJpdmVyLiBWZXJzaW9ucyBvZiB0aGlzIGRyaXZlciBmb3Igb2xkIGtlcm5lbHMgcmVwbGFjZQotCQl1c2JoaWQgaW5zdGVhZCBvZiBnZW5lcmljLXVzYi4gVGhlIHdheSB0byBzY2FuIGZvciB0aGlzIGZpbGUKLQkJaGFzIGJlZW4gY2hvc2VuIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IHdheSBmb3IgYWxsIHN1cHBvcnRlZAotCQlrZXJuZWwgdmVyc2lvbnMuCi0JCVRoaXMgZmlsZSBpcyByZWFkb25seS4KLQogV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vcHJvZmlsZVsxLTVdCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCmluZGV4IGQ2YTgwMWYuLjI4NzVmMWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlcgpAQCAtMTE0LDMgKzExNCwxOCBAQAogCQlpZiB0aGlzIGZpbGUgY29udGFpbnMgIjEiLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4gIEl0IG1heSBiZQogCQlkaXNhYmxlZCBieSB3cml0aW5nICIwIiB0byB0aGlzIGZpbGUsIGluIHdoaWNoIGNhc2UgYWxsIGRldmljZXMKIAkJd2lsbCBiZSBzdXNwZW5kZWQgYW5kIHJlc3VtZWQgc3luY2hyb25vdXNseS4KKworV2hhdDoJCS9zeXMvcG93ZXIvd2FrZXVwX2NvdW50CitEYXRlOgkJSnVseSAyMDEwCitDb250YWN0OglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvcG93ZXIvd2FrZXVwX2NvdW50IGZpbGUgYWxsb3dzIHVzZXIgc3BhY2UgdG8gcHV0IHRoZQorCQlzeXN0ZW0gaW50byBhIHNsZWVwIHN0YXRlIHdoaWxlIHRha2luZyBpbnRvIGFjY291bnQgdGhlCisJCWNvbmN1cnJlbnQgYXJyaXZhbCBvZiB3YWtldXAgZXZlbnRzLiAgUmVhZGluZyBmcm9tIGl0IHJldHVybnMKKwkJdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cyBhbmQgaXQgYmxvY2tzIGlmCisJCXNvbWUgd2FrZXVwIGV2ZW50cyBhcmUgYmVpbmcgcHJvY2Vzc2VkIGF0IHRoZSB0aW1lIHRoZSBmaWxlIGlzCisJCXJlYWQgZnJvbS4gIFdyaXRpbmcgdG8gaXQgd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIGN1cnJlbnQKKwkJbnVtYmVyIG9mIHdha2V1cCBldmVudHMgaXMgZXF1YWwgdG8gdGhlIHdyaXR0ZW4gdmFsdWUgYW5kLCBpZgorCQlzdWNjZXNzZnVsLCB3aWxsIG1ha2UgdGhlIGtlcm5lbCBhYm9ydCBhIHN1YnNlcXVlbnQgdHJhbnNpdGlvbgorCQl0byBhIHNsZWVwIHN0YXRlIGlmIGFueSB3YWtldXAgZXZlbnRzIGFyZSByZXBvcnRlZCBhZnRlciB0aGUKKwkJd3JpdGUgaGFzIHJldHVybmVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCmluZGV4IGVjYTlmNmUuLjRmYjg4ZjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcworKysgYi9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKQEAgLTMzMSw3ICszMzEsNyBAQAogCiBNa2luaXRyZAogLS0tLS0tLS0KLW8gIDxmdHA6Ly9yYXdoaWRlLnJlZGhhdC5jb20vcHViL3Jhd2hpZGUvU1JQTVMvU1JQTVMvPgorbyAgPGh0dHBzOi8vY29kZS5sYXVuY2hwYWQubmV0L2luaXRyZC10b29scy9tYWluPgogCiBFMmZzcHJvZ3MKIC0tLS0tLS0tLQpAQCAtMzQzLDExICszNDMsMTEgQEAKIAogUmVpc2VyZnNwcm9ncwogLS0tLS0tLS0tLS0tLQotbyAgPGh0dHA6Ly93d3cubmFtZXN5cy5jb20vcHViL3JlaXNlcmZzcHJvZ3MvcmVpc2VyZnNwcm9ncy0zLjYuMy50YXIuZ3o+CitvICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy9yZWlzZXJmcy8+CiAKIFhmc3Byb2dzCiAtLS0tLS0tLQotbyAgPGZ0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcy9kb3dubG9hZC8+CitvICA8ZnRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMveGZzLz4KIAogUGNtY2lhdXRpbHMKIC0tLS0tLS0tLS0tCkBAIC0zODcsMTggKzM4NywxOCBAQAogCiBtY2Vsb2cKIC0tLS0tLQotbyA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2NwdS9tY2UvbWNlbG9nLz4KK28gPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9jcHUvbWNlLz4KIAogTmV0d29ya2luZwogKioqKioqKioqKgogCiBQUFAKIC0tLQotbyAgPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwcC9wcHAtMi40LjAudGFyLmd6PgorbyAgPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwcC8+CiAKIElzZG40ay11dGlscwogLS0tLS0tLS0tLS0tCi1vICA8ZnRwOi8vZnRwLmlzZG40bGludXguZGUvcHViL2lzZG40bGludXgvdXRpbHMvaXNkbjRrLXV0aWxzLnYzLjFwcmUxLnRhci5nej4KK28gIDxmdHA6Ly9mdHAuaXNkbjRsaW51eC5kZS9wdWIvaXNkbjRsaW51eC91dGlscy8+CiAKIE5GUy11dGlscwogLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZXZpY2UtZHJpdmVycy50bXBsCmluZGV4IDFiMmRkNGYuLmVjZDM1ZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZXZpY2UtZHJpdmVycy50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZXZpY2UtZHJpdmVycy50bXBsCkBAIC0xMTEsNiArMTExLDcgQEAKIDwhLS0KIFghRWRyaXZlcnMvYmFzZS9pbnRlcmZhY2UuYwogLS0+CishSWluY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKICFFZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKICFFZHJpdmVycy9iYXNlL2J1cy5jCiAgICAgIDwvc2VjdDE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwKaW5kZXggNjNjNTI4Zi4uZTNhOTdmZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJhcGkueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZiYXBpLnhtbApAQCAtMTIsMTAgKzEyLDEyIEBACiA8b3RoZXJuYW1lIHJvbGU9Im1pIj5PLiBDLjwvb3RoZXJuYW1lPgogPGFmZmlsaWF0aW9uPjxhZGRyZXNzPjxlbWFpbD5yamttQG1ldHpsZXJicm9zLmRlPC9lbWFpbD48L2FkZHJlc3M+PC9hZmZpbGlhdGlvbj4KIDwvYXV0aG9yPgorPC9hdXRob3Jncm91cD4KKzxhdXRob3Jncm91cD4KIDxhdXRob3I+CiA8Zmlyc3RuYW1lPk1hdXJvPC9maXJzdG5hbWU+Ci08c3VybmFtZT5DaGVoYWI8L3N1cm5hbWU+CiA8b3RoZXJuYW1lIHJvbGU9Im1pIj5DYXJ2YWxobzwvb3RoZXJuYW1lPgorPHN1cm5hbWU+Q2hlaGFiPC9zdXJuYW1lPgogPGFmZmlsaWF0aW9uPjxhZGRyZXNzPjxlbWFpbD5tY2hlaGFiQHJlZGhhdC5jb208L2VtYWlsPjwvYWRkcmVzcz48L2FmZmlsaWF0aW9uPgogPGNvbnRyaWI+UG9ydGVkIGRvY3VtZW50IHRvIERvY2Jvb2sgWE1MLjwvY29udHJpYj4KIDwvYXV0aG9yPgpAQCAtMjMsMTMgKzI1LDI0IEBACiA8Y29weXJpZ2h0PgogCTx5ZWFyPjIwMDI8L3llYXI+CiAJPHllYXI+MjAwMzwveWVhcj4KLQk8eWVhcj4yMDA5PC95ZWFyPgogCTxob2xkZXI+Q29udmVyZ2VuY2UgR21iSDwvaG9sZGVyPgogPC9jb3B5cmlnaHQ+Cis8Y29weXJpZ2h0PgorCTx5ZWFyPjIwMDktMjAxMDwveWVhcj4KKwk8aG9sZGVyPk1hdXJvIENhcnZhbGhvIENoZWhhYjwvaG9sZGVyPgorPC9jb3B5cmlnaHQ+CiAKIDxyZXZoaXN0b3J5PgogPCEtLSBQdXQgZG9jdW1lbnQgcmV2aXNpb25zIGhlcmUsIG5ld2VzdCBmaXJzdC4gLS0+CiA8cmV2aXNpb24+CisJPHJldm51bWJlcj4yLjAuMzwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMTAtMDctMDM8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPm1jYzwvYXV0aG9yaW5pdGlhbHM+CisJPHJldnJlbWFyaz4KKwkJQWRkIHNvbWUgZnJvbnRlbmQgY2FwYWJpbGl0aWVzIGZsYWdzLCBwcmVzZW50IG9uIGtlcm5lbCwgYnV0IG1pc3NpbmcgYXQgdGhlIHNwZWNzLgorCTwvcmV2cmVtYXJrPgorPC9yZXZpc2lvbj4KKzxyZXZpc2lvbj4KIAk8cmV2bnVtYmVyPjIuMC4yPC9yZXZudW1iZXI+CiAJPGRhdGU+MjAwOS0xMC0yNTwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+bWNjPC9hdXRob3Jpbml0aWFscz4KQEAgLTYzLDcgKzc2LDcgQEAKIAogCiA8dGl0bGU+TElOVVggRFZCIEFQSTwvdGl0bGU+Ci08c3VidGl0bGU+VmVyc2lvbiAzPC9zdWJ0aXRsZT4KKzxzdWJ0aXRsZT5WZXJzaW9uIDUuMjwvc3VidGl0bGU+CiA8IS0tIEFERCBUSEUgQ0hBUFRFUlMgSEVSRSAtLT4KICAgPGNoYXB0ZXIgaWQ9ImR2Yl9pbnRyb2R1dGlvbiI+CiAgICAgJnN1Yi1pbnRybzsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLmgueG1sCmluZGV4IGI5OTY0NGYuLmQwOGUwZDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC5oLnhtbApAQCAtNjMsNiArNjMsNyBAQAogICAgICAgICBGRV9DQU5fOFZTQiAgICAgICAgICAgICAgICAgICAgID0gMHgyMDAwMDAsCiAgICAgICAgIEZFX0NBTl8xNlZTQiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDAwMCwKICAgICAgICAgRkVfSEFTX0VYVEVOREVEX0NBUFMgICAgICAgICAgICA9IDB4ODAwMDAwLCAgIC8qIFdlIG5lZWQgbW9yZSBiaXRzcGFjZSBmb3IgbmV3ZXIgQVBJcywgaW5kaWNhdGUgdGhpcy4gKi8KKyAgICAgICAgRkVfQ0FOX1RVUkJPX0ZFQyAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMCwgIC8qIGZyb250ZW5kIHN1cHBvcnRzICJ0dXJibyBmZWMgbW9kdWxhdGlvbiIgKi8KICAgICAgICAgRkVfQ0FOXzJHX01PRFVMQVRJT04gICAgICAgICAgICA9IDB4MTAwMDAwMDAsIC8qIGZyb250ZW5kIHN1cHBvcnRzICIybmQgZ2VuZXJhdGlvbiBtb2R1bGF0aW9uIiAoRFZCLVMyKSAqLwogICAgICAgICBGRV9ORUVEU19CRU5ESU5HICAgICAgICAgICAgICAgID0gMHgyMDAwMDAwMCwgLyogbm90IHN1cHBvcnRlZCBhbnltb3JlLCBkb24ndCB1c2UgKGZyb250ZW5kIHJlcXVpcmVzIGZyZXF1ZW5jeSBiZW5kaW5nKSAqLwogICAgICAgICBGRV9DQU5fUkVDT1ZFUiAgICAgICAgICAgICAgICAgID0gMHg0MDAwMDAwMCwgLyogZnJvbnRlbmQgY2FuIHJlY292ZXIgZnJvbSBhIGNhYmxlIHVucGx1ZyBhdXRvbWF0aWNhbGx5ICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCmluZGV4IDMwMGJhMWYuLjc4ZDc1NmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCkBAIC02NCw4ICs2NCwxNCBAQAogCUZFX0NBTl9CQU5EV0lEVEhfQVVUTyAgICAgICAgID0gMHg0MDAwMCwKIAlGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyAgICA9IDB4ODAwMDAsCiAJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPICAgICAgICAgPSAweDEwMDAwMCwKLQlGRV9DQU5fTVVURV9UUyAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMDAsCi0JRkVfQ0FOX0NMRUFOX1NFVFVQICAgICAgICAgICAgPSAweDQwMDAwMDAwCisJRkVfQ0FOXzhWU0IgICAgICAgICAgICAgICAgICAgPSAweDIwMDAwMCwKKwlGRV9DQU5fMTZWU0IgICAgICAgICAgICAgICAgICA9IDB4NDAwMDAwLAorCUZFX0hBU19FWFRFTkRFRF9DQVBTICAgICAgICAgID0gMHg4MDAwMDAsCisJRkVfQ0FOX1RVUkJPX0ZFQyAgICAgICAgICAgICAgPSAweDgwMDAwMDAsCisJRkVfQ0FOXzJHX01PRFVMQVRJT04gICAgICAgICAgPSAweDEwMDAwMDAwLAorCUZFX05FRURTX0JFTkRJTkcgICAgICAgICAgICAgID0gMHgyMDAwMDAwMCwKKwlGRV9DQU5fUkVDT1ZFUiAgICAgICAgICAgICAgICA9IDB4NDAwMDAwMDAsCisJRkVfQ0FOX01VVEVfVFMgICAgICAgICAgICAgICAgPSAweDgwMDAwMDAwCiAJfSBmZV9jYXBzX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tnZGIudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZ2RiLnRtcGwKaW5kZXggNTVmMTJhYy4uNDkwZDg2MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tnZGIudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2dkYi50bXBsCkBAIC0xOTksMTAgKzE5OSwzMyBAQAogICAgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBrZXJuZWwgYnVpbHQtaW4gb3IgYSBrZXJuZWwgbG9hZGFibGUgbW9kdWxlLgogICAgWW91IGNhbiBvbmx5IG1ha2UgdXNlIG9mIDxjb25zdGFudD5rZ2Rid2FpdDwvY29uc3RhbnQ+IGFuZCBlYXJseQogICAgZGVidWdnaW5nIGlmIHlvdSBidWlsZCBrZ2Rib2MgaW50byB0aGUga2VybmVsIGFzIGEgYnVpbHQtaW4uCisgICA8cGFyYT5PcHRpb25hbGx5IHlvdSBjYW4gZWxlY3QgdG8gYWN0aXZhdGUga21zIChLZXJuZWwgTW9kZQorICAgU2V0dGluZykgaW50ZWdyYXRpb24uICBXaGVuIHlvdSB1c2Uga21zIHdpdGgga2dkYm9jIGFuZCB5b3UgaGF2ZSBhCisgICB2aWRlbyBkcml2ZXIgdGhhdCBoYXMgYXRvbWljIG1vZGUgc2V0dGluZyBob29rcywgaXQgaXMgcG9zc2libGUgdG8KKyAgIGVudGVyIHRoZSBkZWJ1Z2dlciBvbiB0aGUgZ3JhcGhpY3MgY29uc29sZS4gIFdoZW4gdGhlIGtlcm5lbAorICAgZXhlY3V0aW9uIGlzIHJlc3VtZWQsIHRoZSBwcmV2aW91cyBncmFwaGljcyBtb2RlIHdpbGwgYmUgcmVzdG9yZWQuCisgICBUaGlzIGludGVncmF0aW9uIGNhbiBzZXJ2ZSBhcyBhIHVzZWZ1bCB0b29sIHRvIGFpZCBpbiBkaWFnbm9zaW5nCisgICBjcmFzaGVzIG9yIGRvaW5nIGFuYWx5c2lzIG9mIG1lbW9yeSB3aXRoIGtkYiB3aGlsZSBhbGxvd2luZyB0aGUKKyAgIGZ1bGwgZ3JhcGhpY3MgY29uc29sZSBhcHBsaWNhdGlvbnMgdG8gcnVuLgorICAgPC9wYXJhPgogICAgPC9wYXJhPgogICAgPHNlY3QyIGlkPSJrZ2Rib2NBcmdzIj4KICAgIDx0aXRsZT5rZ2Rib2MgYXJndW1lbnRzPC90aXRsZT4KLSAgIDxwYXJhPlVzYWdlOiA8Y29uc3RhbnQ+a2dkYm9jPVtrYmRdW1ssXXNlcmlhbF9kZXZpY2VdWyxiYXVkXTwvY29uc3RhbnQ+PC9wYXJhPgorICAgPHBhcmE+VXNhZ2U6IDxjb25zdGFudD5rZ2Rib2M9W2ttc11bWyxda2JkXVtbLF1zZXJpYWxfZGV2aWNlXVssYmF1ZF08L2NvbnN0YW50PjwvcGFyYT4KKyAgIDxwYXJhPlRoZSBvcmRlciBsaXN0ZWQgYWJvdmUgbXVzdCBiZSBvYnNlcnZlZCBpZiB5b3UgdXNlIGFueSBvZiB0aGUKKyAgIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvZ2V0aGVyLgorICAgPC9wYXJhPgorICAgPHBhcmE+QWJicmV2aWF0aW9uczoKKyAgIDxpdGVtaXplZGxpc3Q+CisgICA8bGlzdGl0ZW0+PHBhcmE+a21zID0gS2VybmVsIE1vZGUgU2V0dGluZzwvcGFyYT48L2xpc3RpdGVtPgorICAgPGxpc3RpdGVtPjxwYXJhPmtiZCA9IEtleWJvYXJkPC9wYXJhPjwvbGlzdGl0ZW0+CisgICA8L2l0ZW1pemVkbGlzdD4KKyAgIDwvcGFyYT4KKyAgIDxwYXJhPllvdSBjYW4gY29uZmlndXJlIGtnZGJvYyB0byB1c2UgdGhlIGtleWJvYXJkLCBhbmQgb3IgYSBzZXJpYWwKKyAgIGRldmljZSBkZXBlbmRpbmcgb24gaWYgeW91IGFyZSB1c2luZyBrZGIgYW5kIG9yIGtnZGIsIGluIG9uZSBvZiB0aGUKKyAgIGZvbGxvd2luZyBzY2VuYXJpb3MuICBUaGUgb3JkZXIgbGlzdGVkIGFib3ZlIG11c3QgYmUgb2JzZXJ2ZWQgaWYKKyAgIHlvdSB1c2UgYW55IG9mIHRoZSBvcHRpb25hbCBjb25maWd1cmF0aW9ucyB0b2dldGhlci4gIFVzaW5nIGttcyArCisgICBvbmx5IGdkYiBpcyBnZW5lcmFsbHkgbm90IGEgdXNlZnVsIGNvbWJpbmF0aW9uLjwvcGFyYT4KICAgIDxzZWN0MyBpZD0ia2dkYm9jQXJnczEiPgogICAgPHRpdGxlPlVzaW5nIGxvYWRhYmxlIG1vZHVsZSBvciBidWlsdC1pbjwvdGl0bGU+CiAgICA8cGFyYT4KQEAgLTIxMiw3ICsyMzUsNyBAQAogICAgPGxpc3RpdGVtPgogICAgPHBhcmE+QXMgYSBrZXJuZWwgbG9hZGFibGUgbW9kdWxlOjwvcGFyYT4KICAgIDxwYXJhPlVzZSB0aGUgY29tbWFuZDogPGNvbnN0YW50Pm1vZHByb2JlIGtnZGJvYyBrZ2Rib2M9Jmx0O3R0eS1kZXZpY2UmZ3Q7LFtiYXVkXTwvY29uc3RhbnQ+PC9wYXJhPgotICAgPHBhcmE+SGVyZSBhcmUgdHdvIGV4YW1wbGVzIG9mIGhvdyB5b3UgbWlnaHQgZm9ybWF0ZSB0aGUga2dkYm9jCisgICA8cGFyYT5IZXJlIGFyZSB0d28gZXhhbXBsZXMgb2YgaG93IHlvdSBtaWdodCBmb3JtYXQgdGhlIGtnZGJvYwogICAgc3RyaW5nLiBUaGUgZmlyc3QgaXMgZm9yIGFuIHg4NiB0YXJnZXQgdXNpbmcgdGhlIGZpcnN0IHNlcmlhbCBwb3J0LgogICAgVGhlIHNlY29uZCBleGFtcGxlIGlzIGZvciB0aGUgQVJNIFZlcnNhdGlsZSBBQiB1c2luZyB0aGUgc2Vjb25kCiAgICBzZXJpYWwgcG9ydC4KQEAgLTI0MCw2ICsyNjMsOSBAQAogICAgPC9zZWN0Mz4KICAgIDxzZWN0MyBpZD0ia2dkYm9jQXJnczMiPgogICAgPHRpdGxlPk1vcmUgZXhhbXBsZXM8L3RpdGxlPgorICAgPHBhcmE+WW91IGNhbiBjb25maWd1cmUga2dkYm9jIHRvIHVzZSB0aGUga2V5Ym9hcmQsIGFuZCBvciBhIHNlcmlhbAorICAgZGV2aWNlIGRlcGVuZGluZyBvbiBpZiB5b3UgYXJlIHVzaW5nIGtkYiBhbmQgb3Iga2dkYiwgaW4gb25lIG9mIHRoZQorICAgZm9sbG93aW5nIHNjZW5hcmlvcy48L3BhcmE+CiAgICA8cGFyYT5Zb3UgY2FuIGNvbmZpZ3VyZSBrZ2Rib2MgdG8gdXNlIHRoZSBrZXlib2FyZCwgYW5kIG9yIGEgc2VyaWFsIGRldmljZQogICAgZGVwZW5kaW5nIG9uIGlmIHlvdSBhcmUgdXNpbmcga2RiIGFuZCBvciBrZ2RiLCBpbiBvbmUgb2YgdGhlCiAgICBmb2xsb3dpbmcgc2NlbmFyaW9zLgpAQCAtMjU1LDYgKzI4MSwxMiBAQAogICAgPGxpc3RpdGVtPjxwYXJhPmtkYiB3aXRoIGEga2V5Ym9hcmQ8L3BhcmE+CiAgICA8cGFyYT48Y29uc3RhbnQ+a2dkYm9jPWtiZDwvY29uc3RhbnQ+PC9wYXJhPgogICAgPC9saXN0aXRlbT4KKyAgIDxsaXN0aXRlbT48cGFyYT5rZGIgd2l0aCBrZXJuZWwgbW9kZSBzZXR0aW5nPC9wYXJhPgorICAgPHBhcmE+PGNvbnN0YW50PmtnZGJvYz1rbXMsa2JkPC9jb25zdGFudD48L3BhcmE+CisgICA8L2xpc3RpdGVtPgorICAgPGxpc3RpdGVtPjxwYXJhPmtkYiB3aXRoIGtlcm5lbCBtb2RlIHNldHRpbmcgYW5kIGtnZGIgb3ZlciBhIHNlcmlhbCBwb3J0PC9wYXJhPgorICAgPHBhcmE+PGNvbnN0YW50PmtnZGJvYz1rbXMsa2JkLHR0eVMwLDExNTIwMDwvY29uc3RhbnQ+PC9wYXJhPgorICAgPC9saXN0aXRlbT4KICAgIDwvb3JkZXJlZGxpc3Q+CiAgICA8L3BhcmE+CiAgICA8L3NlY3QzPgpAQCAtNjM3LDYgKzY2OSw4IEBACiAgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIGxvZ2ljIHRvIHBlcmZvcm0gc2FmZSBtZW1vcnkgcmVhZHMgYW5kIHdyaXRlcyB0byBtZW1vcnkgd2hpbGUgdXNpbmcgdGhlIGRlYnVnZ2VyPC9wYXJhPjwvbGlzdGl0ZW0+CiAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QSBmdWxsIGltcGxlbWVudGF0aW9uIGZvciBzb2Z0d2FyZSBicmVha3BvaW50cyB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGUgYXJjaDwvcGFyYT48L2xpc3RpdGVtPgogICAgICAgPGxpc3RpdGVtPjxwYXJhPlRoZSBBUEkgdG8gaW52b2tlIGVpdGhlciB0aGUga2RiIG9yIGtnZGIgZnJvbnRlbmQgdG8gdGhlIGRlYnVnIGNvcmUuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIHN0cnVjdHVyZXMgYW5kIGNhbGxiYWNrIEFQSSBmb3IgYXRvbWljIGtlcm5lbCBtb2RlIHNldHRpbmcuPC9wYXJhPgorICAgICAgPHBhcmE+Tk9URToga2dkYm9jIGlzIHdoZXJlIHRoZSBrbXMgY2FsbGJhY2tzIGFyZSBpbnZva2VkLjwvcGFyYT48L2xpc3RpdGVtPgogICAgICAgPC9pdGVtaXplZGxpc3Q+CiAgICAgICA8L3BhcmE+CiAgICAgICA8L2xpc3RpdGVtPgpAQCAtNzQ3LDYgKzc4MSw4IEBACiAgIDwvc2VjdDE+CiAgIDxzZWN0MSBpZD0ia2dkYm9jRGVzaWduIj4KICAgPHRpdGxlPmtnZGJvYyBpbnRlcm5hbHM8L3RpdGxlPgorICA8c2VjdDI+CisgIDx0aXRsZT5rZ2Rib2MgYW5kIHVhcnRzPC90aXRsZT4KICAgPHBhcmE+CiAgIFRoZSBrZ2Rib2MgZHJpdmVyIGlzIGFjdHVhbGx5IGEgdmVyeSB0aGluIGRyaXZlciB0aGF0IHJlbGllcyBvbiB0aGUKICAgdW5kZXJseWluZyBsb3cgbGV2ZWwgdG8gdGhlIGhhcmR3YXJlIGRyaXZlciBoYXZpbmcgInBvbGxpbmcgaG9va3MiCkBAIC03NTQsMTEgKzc5MCw4IEBACiAgIGltcGxlbWVudGF0aW9uIG9mIGtnZGJvYyBpdCB0aGUgc2VyaWFsX2NvcmUgd2FzIGNoYW5nZWQgdG8gZXhwb3NlIGEKICAgbG93IGxldmVsIFVBUlQgaG9vayBmb3IgZG9pbmcgcG9sbGVkIG1vZGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBhCiAgIHNpbmdsZSBjaGFyYWN0ZXIgd2hpbGUgaW4gYW4gYXRvbWljIGNvbnRleHQuICBXaGVuIGtnZGIgbWFrZXMgYW4gSS9PCi0gIHJlcXVlc3QgdG8gdGhlIGRlYnVnZ2VyLCBrZ2Rib2MgaW52b2tlcyBhIGNhbGwgYmFjayBpbiB0aGUgc2VyaWFsCi0gIGNvcmUgd2hpY2ggaW4gdHVybiB1c2VzIHRoZSBjYWxsIGJhY2sgaW4gdGhlIFVBUlQgZHJpdmVyLiAgSXQgaXMKLSAgY2VydGFpbmx5IHBvc3NpYmxlIHRvIGV4dGVuZCBrZ2Rib2MgdG8gd29yayB3aXRoIG5vbi1VQVJUIGJhc2VkCi0gIGNvbnNvbGVzIGluIHRoZSBmdXR1cmUuCi0gIDwvcGFyYT4KKyAgcmVxdWVzdCB0byB0aGUgZGVidWdnZXIsIGtnZGJvYyBpbnZva2VzIGEgY2FsbGJhY2sgaW4gdGhlIHNlcmlhbAorICBjb3JlIHdoaWNoIGluIHR1cm4gdXNlcyB0aGUgY2FsbGJhY2sgaW4gdGhlIFVBUlQgZHJpdmVyLjwvcGFyYT4KICAgPHBhcmE+CiAgIFdoZW4gdXNpbmcga2dkYm9jIHdpdGggYSBVQVJULCB0aGUgVUFSVCBkcml2ZXIgbXVzdCBpbXBsZW1lbnQgdHdvIGNhbGxiYWNrcyBpbiB0aGUgPGNvbnN0YW50PnN0cnVjdCB1YXJ0X29wczwvY29uc3RhbnQ+LiBFeGFtcGxlIGZyb20gZHJpdmVycy84MjUwLmM6PHByb2dyYW1saXN0aW5nPgogI2lmZGVmIENPTkZJR19DT05TT0xFX1BPTEwKQEAgLTc3Miw5ICs4MDUsNjggQEAKICAgdGhhdCB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCBhbmQgaGF2ZSB0byByZXN0b3JlCiAgIHRoZSBzdGF0ZSBvZiB0aGUgVUFSVCBjaGlwIG9uIHJldHVybiBzdWNoIHRoYXQgdGhlIHN5c3RlbSBjYW4gcmV0dXJuCiAgIHRvIG5vcm1hbCB3aGVuIHRoZSBkZWJ1Z2dlciBkZXRhY2hlcy4gIFlvdSBuZWVkIHRvIGJlIHZlcnkgY2FyZWZ1bAotICB3aXRoIGFueSBraW5kIG9mIGxvY2sgeW91IGNvbnNpZGVyLCBiZWNhdXNlIGZhaWxpbmcgaGVyZSBpcyBtb3N0CisgIHdpdGggYW55IGtpbmQgb2YgbG9jayB5b3UgY29uc2lkZXIsIGJlY2F1c2UgZmFpbGluZyBoZXJlIGlzIG1vc3QgbGlrZWx5CiAgIGdvaW5nIHRvIG1lYW4gcHJlc3NpbmcgdGhlIHJlc2V0IGJ1dHRvbi4KICAgPC9wYXJhPgorICA8L3NlY3QyPgorICA8c2VjdDIgaWQ9ImtnZGJvY0tiZCI+CisgIDx0aXRsZT5rZ2Rib2MgYW5kIGtleWJvYXJkczwvdGl0bGU+CisgIDxwYXJhPlRoZSBrZ2Rib2MgZHJpdmVyIGNvbnRhaW5zIGxvZ2ljIHRvIGNvbmZpZ3VyZSBjb21tdW5pY2F0aW9ucworICB3aXRoIGFuIGF0dGFjaGVkIGtleWJvYXJkLiAgVGhlIGtleWJvYXJkIGluZnJhc3RydWN0dXJlIGlzIG9ubHkKKyAgY29tcGlsZWQgaW50byB0aGUga2VybmVsIHdoZW4gQ09ORklHX0tEQl9LRVlCT0FSRD15IGlzIHNldCBpbiB0aGUKKyAga2VybmVsIGNvbmZpZ3VyYXRpb24uPC9wYXJhPgorICA8cGFyYT5UaGUgY29yZSBwb2xsZWQga2V5Ym9hcmQgZHJpdmVyIGRyaXZlciBmb3IgUFMvMiB0eXBlIGtleWJvYXJkcworICBpcyBpbiBkcml2ZXJzL2NoYXIva2RiX2tleWJvYXJkLmMuICBUaGlzIGRyaXZlciBpcyBob29rZWQgaW50byB0aGUKKyAgZGVidWcgY29yZSB3aGVuIGtnZGJvYyBwb3B1bGF0ZXMgdGhlIGNhbGxiYWNrIGluIHRoZSBhcnJheQorICBjYWxsZWQgPGNvbnN0YW50PmtkYl9wb2xsX2Z1bmNzW108L2NvbnN0YW50Pi4gIFRoZQorICBrZGJfZ2V0X2tiZF9jaGFyKCkgaXMgdGhlIHRvcC1sZXZlbCBmdW5jdGlvbiB3aGljaCBwb2xscyBoYXJkd2FyZQorICBmb3Igc2luZ2xlIGNoYXJhY3RlciBpbnB1dC4KKyAgPC9wYXJhPgorICA8L3NlY3QyPgorICA8c2VjdDIgaWQ9ImtnZGJvY0ttcyI+CisgIDx0aXRsZT5rZ2Rib2MgYW5kIGttczwvdGl0bGU+CisgIDxwYXJhPlRoZSBrZ2Rib2MgZHJpdmVyIGNvbnRhaW5zIGxvZ2ljIHRvIHJlcXVlc3QgdGhlIGdyYXBoaWNzCisgIGRpc3BsYXkgdG8gc3dpdGNoIHRvIGEgdGV4dCBjb250ZXh0IHdoZW4geW91IGFyZSB1c2luZworICAia2dkYm9jPWttcyxrYmQiLCBwcm92aWRlZCB0aGF0IHlvdSBoYXZlIGEgdmlkZW8gZHJpdmVyIHdoaWNoIGhhcyBhCisgIGZyYW1lIGJ1ZmZlciBjb25zb2xlIGFuZCBhdG9taWMga2VybmVsIG1vZGUgc2V0dGluZyBzdXBwb3J0LjwvcGFyYT4KKyAgPHBhcmE+CisgIEV2ZXJ5IHRpbWUgdGhlIGtlcm5lbAorICBkZWJ1Z2dlciBpcyBlbnRlcmVkIGl0IGNhbGxzIGtnZGJvY19wcmVfZXhwX2hhbmRsZXIoKSB3aGljaCBpbiB0dXJuCisgIGNhbGxzIGNvbl9kZWJ1Z19lbnRlcigpIGluIHRoZSB2aXJ0dWFsIGNvbnNvbGUgbGF5ZXIuICBPbiByZXN1bWluZyBrZXJuZWwKKyAgZXhlY3V0aW9uLCB0aGUga2VybmVsIGRlYnVnZ2VyIGNhbGxzIGtnZGJvY19wb3N0X2V4cF9oYW5kbGVyKCkgd2hpY2gKKyAgaW4gdHVybiBjYWxscyBjb25fZGVidWdfbGVhdmUoKS48L3BhcmE+CisgIDxwYXJhPkFueSB2aWRlbyBkcml2ZXIgdGhhdCB3YW50cyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGtlcm5lbAorICBkZWJ1Z2dlciBhbmQgdGhlIGF0b21pYyBrbXMgY2FsbGJhY2tzIG11c3QgaW1wbGVtZW50IHRoZQorICBtb2RlX3NldF9iYXNlX2F0b21pYywgZmJfZGVidWdfZW50ZXIgYW5kIGZiX2RlYnVnX2xlYXZlIG9wZXJhdGlvbnMuCisgIEZvciB0aGUgZmJfZGVidWdfZW50ZXIgYW5kIGZiX2RlYnVnX2xlYXZlIHRoZSBvcHRpb24gZXhpc3RzIHRvIHVzZQorICB0aGUgZ2VuZXJpYyBkcm0gZmIgaGVscGVyIGZ1bmN0aW9ucyBvciBpbXBsZW1lbnQgc29tZXRoaW5nIGN1c3RvbSBmb3IKKyAgdGhlIGhhcmR3YXJlLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKKyAgLm1vZGVfc2V0X2Jhc2VfYXRvbWljIG9wZXJhdGlvbiBpbgorICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmM6CisgIDxpbmZvcm1hbGV4YW1wbGU+CisgIDxwcm9ncmFtbGlzdGluZz4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIGludGVsX2hlbHBlcl9mdW5jcyA9IHsKK1suLi5dCisgICAgICAgIC5tb2RlX3NldF9iYXNlX2F0b21pYyA9IGludGVsX3BpcGVfc2V0X2Jhc2VfYXRvbWljLAorWy4uLl0KK307CisgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgIDwvaW5mb3JtYWxleGFtcGxlPgorICA8L3BhcmE+CisgIDxwYXJhPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGk5MTUgZHJpdmVyIGluaXRpYWxpemVzIHRoZSBmYl9kZWJ1Z19lbnRlciBhbmQgZmJfZGVidWdfbGVhdmUgZnVuY3Rpb25zIHRvIHVzZSB0aGUgZ2VuZXJpYyBkcm0gaGVscGVycyBpbgorICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jOgorICA8aW5mb3JtYWxleGFtcGxlPgorICA8cHJvZ3JhbWxpc3Rpbmc+CitzdGF0aWMgc3RydWN0IGZiX29wcyBpbnRlbGZiX29wcyA9IHsKK1suLi5dCisgICAgICAgLmZiX2RlYnVnX2VudGVyID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19lbnRlciwKKyAgICAgICAuZmJfZGVidWdfbGVhdmUgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlLAorWy4uLl0KK307CisgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgIDwvaW5mb3JtYWxleGFtcGxlPgorICA8L3BhcmE+CisgIDwvc2VjdDI+CiAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KICAgPGNoYXB0ZXIgaWQ9ImNyZWRpdHMiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtZW50aXRpZXMudG1wbAppbmRleCA1ZDRkNDBmNC4uNmFlOTcxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwKQEAgLTIxOCw2ICsyMTgsNyBAQAogPCFFTlRJVFkgc3ViLWRldi10ZWxldGV4dCBTWVNURU0gInY0bC9kZXYtdGVsZXRleHQueG1sIj4KIDwhRU5USVRZIHN1Yi1kcml2ZXIgU1lTVEVNICJ2NGwvZHJpdmVyLnhtbCI+CiA8IUVOVElUWSBzdWItbGlidjRsIFNZU1RFTSAidjRsL2xpYnY0bC54bWwiPgorPCFFTlRJVFkgc3ViLWxpcmNfZGV2aWNlX2ludGVyZmFjZSBTWVNURU0gInY0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sIj4KIDwhRU5USVRZIHN1Yi1yZW1vdGVfY29udHJvbGxlcnMgU1lTVEVNICJ2NGwvcmVtb3RlX2NvbnRyb2xsZXJzLnhtbCI+CiA8IUVOVElUWSBzdWItZmRsLWFwcGVuZGl4IFNZU1RFTSAidjRsL2ZkbC1hcHBlbmRpeC54bWwiPgogPCFFTlRJVFkgc3ViLWNsb3NlIFNZU1RFTSAidjRsL2Z1bmMtY2xvc2UueG1sIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLnRtcGwKaW5kZXggZWVhNTY0Yi4uZjExMDQ4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLnRtcGwKQEAgLTI4LDcgKzI4LDcgQEAKIDx0aXRsZT5MSU5VWCBNRURJQSBJTkZSQVNUUlVDVFVSRSBBUEk8L3RpdGxlPgogCiA8Y29weXJpZ2h0PgotCTx5ZWFyPjIwMDk8L3llYXI+CisJPHllYXI+MjAwOS0yMDEwPC95ZWFyPgogCTxob2xkZXI+TGludXhUViBEZXZlbG9wZXJzPC9ob2xkZXI+CiA8L2NvcHlyaWdodD4KIApAQCAtNjEsNyArNjEsNyBAQAogCQlpbiBmYWN0IGl0IGNvdmVycyBzZXZlcmFsIGRpZmZlcmVudCB2aWRlbyBzdGFuZGFyZHMgaW5jbHVkaW5nCiAJCURWQi1ULCBEVkItUywgRFZCLUMgYW5kIEFUU0MuIFRoZSBBUEkgaXMgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQKIAkJdG8gZG9jdW1tZW50IHN1cHBvcnQgYWxzbyBmb3IgRFZCLVMyLCBJU0RCLVQgYW5kIElTREItUy48L3BhcmE+Ci0JPHBhcmE+VGhlIHRoaXJkIHBhcnQgY292ZXJzIG90aGVyIEFQSSdzIHVzZWQgYnkgYWxsIG1lZGlhIGluZnJhc3RydWN0dXJlIGRldmljZXM8L3BhcmE+CisJPHBhcmE+VGhlIHRoaXJkIHBhcnQgY292ZXJzIFJlbW90ZSBDb250cm9sbGVyIEFQSTwvcGFyYT4KIAk8cGFyYT5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbmQgZm9yIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgY29kZSwKIAkJc2VlOiA8dWxpbmsgdXJsPSJodHRwOi8vbGludXh0di5vcmciPmh0dHA6Ly9saW51eHR2Lm9yZzwvdWxpbms+LjwvcGFyYT4KIAk8cGFyYT5Gb3IgZGlzY3Vzc2luZyBpbXByb3ZlbWVudHMsIHJlcG9ydGluZyB0cm91Ymxlcywgc2VuZGluZyBuZXcgZHJpdmVycywgZXRjLCBwbGVhc2UgbWFpbCB0bzogPHVsaW5rIHVybD0iaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwjbGludXgtbWVkaWEiPkxpbnV4IE1lZGlhIE1haWxpbmcgTGlzdCAoTE1NTCkuPC91bGluaz4uPC9wYXJhPgpAQCAtODYsNyArODYsNyBAQAogPC9hdXRob3I+CiA8L2F1dGhvcmdyb3VwPgogPGNvcHlyaWdodD4KLQk8eWVhcj4yMDA5PC95ZWFyPgorCTx5ZWFyPjIwMDktMjAxMDwveWVhcj4KIAk8aG9sZGVyPk1hdXJvIENhcnZhbGhvIENoZWhhYjwvaG9sZGVyPgogPC9jb3B5cmlnaHQ+CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogPC9yZXZoaXN0b3J5PgogPC9wYXJ0aW5mbz4KIAotPHRpdGxlPk90aGVyIEFQSSdzIHVzZWQgYnkgbWVkaWEgaW5mcmFzdHJ1Y3R1cmUgZHJpdmVyczwvdGl0bGU+Cis8dGl0bGU+UmVtb3RlIENvbnRyb2xsZXIgQVBJPC90aXRsZT4KIDxjaGFwdGVyIGlkPSJyZW1vdGVfY29udHJvbGxlcnMiPgogJnN1Yi1yZW1vdGVfY29udHJvbGxlcnM7CiA8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc2NzaS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Njc2kudG1wbAppbmRleCBkODdmNDU2Li4zMjRiNTM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc2NzaS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9zY3NpLnRtcGwKQEAgLTM5Myw3ICszOTMsNyBAQAogICAgICAgICA8L3BhcmE+CiAgICAgICAgIDxwYXJhPgogICAgICAgICAgIEZvciBkb2N1bWVudGF0aW9uIHNlZQotICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly93d3cudG9ycXVlLm5ldC9zZy9zZGVidWcyNi5odG1sJz5odHRwOi8vd3d3LnRvcnF1ZS5uZXQvc2cvc2RlYnVnMjYuaHRtbDwvdWxpbms+CisgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL3NnLmRhbm55LmN6L3NnL3NkZWJ1ZzI2Lmh0bWwnPmh0dHA6Ly9zZy5kYW5ueS5jei9zZy9zZGVidWcyNi5odG1sPC91bGluaz4KICAgICAgICAgPC9wYXJhPgogPCEtLSAhRWRyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgLS0+CiAgICAgICA8L3NlY3QyPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3N0eWxlc2hlZXQueHNsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3N0eWxlc2hlZXQueHNsCmluZGV4IDI1NGMxZDUuLjg1YjI1MjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9zdHlsZXNoZWV0LnhzbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc3R5bGVzaGVldC54c2wKQEAgLTYsNCArNiw1IEBACiA8cGFyYW0gbmFtZT0iY2FsbG91dC5ncmFwaGljcyI+MDwvcGFyYW0+CiA8IS0tIDxwYXJhbSBuYW1lPSJwYXBlci50eXBlIj5BNDwvcGFyYW0+IC0tPgogPHBhcmFtIG5hbWU9ImdlbmVyYXRlLnNlY3Rpb24udG9jLmxldmVsIj4yPC9wYXJhbT4KKzxwYXJhbSBuYW1lPSJ1c2UuaWQuYXMuZmlsZW5hbWUiPjE8L3BhcmFtPgogPC9zdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb21wYXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb21wYXQueG1sCmluZGV4IGI0MmI5MzUuLjU0NDQ3ZjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tcGF0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbXBhdC54bWwKQEAgLTEwOTEsOCArMTA5MSw5IEBACiB1bnRpbCB0aGUgdGltZSBpbiB0aGUgdGltZXN0YW1wIGZpZWxkIGhhcyBhcnJpdmVkLiBJIHdvdWxkIGxpa2UgdG8KIGZvbGxvdyBTR0kncyBsZWFkLCBhbmQgYWRvcHQgYSBtdWx0aW1lZGlhIHRpbWVzdGFtcGluZyBzeXN0ZW0gbGlrZQogdGhlaXIgVVNUIChVbmFkanVzdGVkIFN5c3RlbSBUaW1lKS4gU2VlCi1odHRwOi8vcmVhbGl0eS5zZ2kuY29tL2NwaXJhenppX2VuZ3IvbGcvdGltZS9pbnRyby5odG1sLiBbVGhpcyBsaW5rIGlzCi1ubyBsb25nZXIgdmFsaWQuXSBVU1QgdXNlcyB0aW1lc3RhbXBzIHRoYXQgYXJlIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMKK2h0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3JlYWxpdHkuc2dpLmNvbQorL2NwaXJhenppX2VuZ3IvbGcvdGltZS9pbnRyby5odG1sLiAKK1VTVCB1c2VzIHRpbWVzdGFtcHMgdGhhdCBhcmUgNjQtYml0IHNpZ25lZCBpbnRlZ2VycwogKG5vdCBzdHJ1Y3QgdGltZXZhbCdzKSBhbmQgZ2l2ZW4gaW4gbmFub3NlY29uZCB1bml0cy4gVGhlIFVTVCBjbG9jawogc3RhcnRzIGF0IHplcm8gd2hlbiB0aGUgc3lzdGVtIGlzIGJvb3RlZCBhbmQgcnVucyBjb250aW51b3VzbHkgYW5kCiB1bmlmb3JtbHkuIEl0IHRha2VzIGEgbGl0dGxlIG92ZXIgMjkyIHllYXJzIGZvciBVU1QgdG8gb3ZlcmZsb3cuIFRoZXJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZkbC1hcHBlbmRpeC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZkbC1hcHBlbmRpeC54bWwKaW5kZXggYjZjZTUwZC4uYWUyMjM5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mZGwtYXBwZW5kaXgueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmRsLWFwcGVuZGl4LnhtbApAQCAtMiw3ICsyLDcgQEAKICAgICAgVGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSAxLjEgaW4gRG9jQm9vawogICAgICBNYXJrdXAgYnkgRXJpYyBCYXVkYWlzIDxiYXVkYWlzQG9rc3RhdGUuZWR1PgogICAgICBNYWludGFpbmVkIGJ5IHRoZSBHTk9NRSBEb2N1bWVudGF0aW9uIFByb2plY3QKLSAgICAgaHR0cDovL2RldmVsb3Blci5nbm9tZS5vcmcvcHJvamVjdHMvZ2RwCisgICAgIGh0dHA6Ly9saXZlLmdub21lLm9yZy9Eb2N1bWVudGF0aW9uUHJvamVjdAogICAgICBWZXJzaW9uOiAxLjAuMQogICAgICBMYXN0IE1vZGlmaWVkOiBOb3YgMTYsIDIwMDAKIC0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTMyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2xpcmNfZGV2aWNlX2ludGVyZmFjZS54bWwKQEAgLTAsMCArMSwyMzUgQEAKKzxzZWN0aW9uIGlkPSJsaXJjX2RldiI+Cis8dGl0bGU+TElSQyBEZXZpY2UgSW50ZXJmYWNlPC90aXRsZT4KKworCis8c2VjdGlvbiBpZD0ibGlyY19kZXZfaW50cm8iPgorPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisKKzxwYXJhPlRoZSBMSVJDIGRldmljZSBpbnRlcmZhY2UgaXMgYSBiaS1kaXJlY3Rpb25hbCBpbnRlcmZhY2UgZm9yCit0cmFuc3BvcnRpbmcgcmF3IElSIGRhdGEgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGtlcm5lbHNwYWNlLiBGdW5kYW1lbnRhbGx5LAoraXQgaXMganVzdCBhIGNoYXJkZXYgKC9kZXYvbGlyY1gsIGZvciBYID0gMCwgMSwgMiwgLi4uKSwgd2l0aCBhIG51bWJlcgorb2Ygc3RhbmRhcmQgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZpbmVkIG9uIGl0LiBXaXRoIHJlc3BlY3QgdG8KK3RyYW5zcG9ydGluZyByYXcgSVIgZGF0YSB0byBhbmQgZnJvLCB0aGUgZXNzZW50aWFsIGZvcHMgYXJlIHJlYWQsIHdyaXRlCithbmQgaW9jdGwuPC9wYXJhPgorCis8cGFyYT5FeGFtcGxlIGRtZXNnIG91dHB1dCB1cG9uIGEgZHJpdmVyIHJlZ2lzdGVyaW5nIHcvTElSQzo8L3BhcmE+CisgIDxibG9ja3F1b3RlPgorICAgIDxwYXJhPiQgZG1lc2cgfGdyZXAgbGlyY19kZXY8L3BhcmE+CisgICAgPHBhcmE+bGlyY19kZXY6IElSIFJlbW90ZSBDb250cm9sIGRyaXZlciByZWdpc3RlcmVkLCBtYWpvciAyNDg8L3BhcmE+CisgICAgPHBhcmE+cmMgcmMwOiBsaXJjX2RldjogZHJpdmVyIGlyLWxpcmMtY29kZWMgKG1jZXVzYikgcmVnaXN0ZXJlZCBhdCBtaW5vciA9IDA8L3BhcmE+CisgIDwvYmxvY2txdW90ZT4KKworPHBhcmE+V2hhdCB5b3Ugc2hvdWxkIHNlZSBmb3IgYSBjaGFyZGV2OjwvcGFyYT4KKyAgPGJsb2NrcXVvdGU+CisgICAgPHBhcmE+JCBscyAtbCAvZGV2L2xpcmMqPC9wYXJhPgorICAgIDxwYXJhPmNydy1ydy0tLS0gMSByb290IHJvb3QgMjQ4LCAwIEp1bCAgMiAyMjoyMCAvZGV2L2xpcmMwPC9wYXJhPgorICA8L2Jsb2NrcXVvdGU+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJsaXJjX3JlYWQiPgorPHRpdGxlPkxJUkMgcmVhZCBmb3A8L3RpdGxlPgorCis8cGFyYT5UaGUgbGlyY2QgdXNlcnNwYWNlIGRhZW1vbiByZWFkcyByYXcgSVIgZGF0YSBmcm9tIHRoZSBMSVJDIGNoYXJkZXYuIFRoZQorZXhhY3QgZm9ybWF0IG9mIHRoZSBkYXRhIGRlcGVuZHMgb24gd2hhdCBtb2RlcyBhIGRyaXZlciBzdXBwb3J0cywgYW5kIHdoYXQKK21vZGUgaGFzIGJlZW4gc2VsZWN0ZWQuIGxpcmNkIG9idGFpbnMgc3VwcG9ydGVkIG1vZGVzIGFuZCBzZXRzIHRoZSBhY3RpdmUgbW9kZQordmlhIHRoZSBpb2N0bCBpbnRlcmZhY2UsIGRldGFpbGVkIGF0IDx4cmVmIGxpbmtlbmQ9ImxpcmNfaW9jdGwiLz4uIFRoZSBnZW5lcmFsbHkKK3ByZWZlcnJlZCBtb2RlIGlzIExJUkNfTU9ERV9NT0RFMiwgaW4gd2hpY2ggcGFja2V0cyBjb250YWluaW5nIGFuIGludCB2YWx1ZQorZGVzY3JpYmluZyBhbiBJUiBzaWduYWwgYXJlIHJlYWQgZnJvbSB0aGUgY2hhcmRldi48L3BhcmE+CisKKzxwYXJhPlNlZSBhbHNvIDx1bGluayB1cmw9Imh0dHA6Ly93d3cubGlyYy5vcmcvaHRtbC90ZWNobmljYWwuaHRtbCI+aHR0cDovL3d3dy5saXJjLm9yZy9odG1sL3RlY2huaWNhbC5odG1sPC91bGluaz4gZm9yIG1vcmUgaW5mby48L3BhcmE+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJsaXJjX3dyaXRlIj4KKzx0aXRsZT5MSVJDIHdyaXRlIGZvcDwvdGl0bGU+CisKKzxwYXJhPlRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIGNoYXJkZXYgaXMgYSBwdWxzZS9zcGFjZSBzZXF1ZW5jZSBvZiBpbnRlZ2VyCit2YWx1ZXMuIFB1bHNlcyBhbmQgc3BhY2VzIGFyZSBvbmx5IG1hcmtlZCBpbXBsaWNpdGx5IGJ5IHRoZWlyIHBvc2l0aW9uLiBUaGUKK2RhdGEgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggYSBwdWxzZSwgdGhlcmVmb3JlLCB0aGUgZGF0YSBtdXN0IGFsd2F5cyBpbmNsdWRlCithbiB1bmV2ZW50IG51bWJlciBvZiBzYW1wbGVzLiBUaGUgd3JpdGUgZnVuY3Rpb24gbXVzdCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMKK2JlZW4gdHJhbnNtaXR0ZWQgYnkgdGhlIGhhcmR3YXJlLjwvcGFyYT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9ImxpcmNfaW9jdGwiPgorPHRpdGxlPkxJUkMgaW9jdGwgZm9wPC90aXRsZT4KKworPHBhcmE+VGhlIExJUkMgZGV2aWNlJ3MgaW9jdGwgZGVmaW5pdGlvbiBpcyBib3VuZCBieSB0aGUgaW9jdGwgZnVuY3Rpb24KK2RlZmluaXRpb24gb2Ygc3RydWN0IGZpbGVfb3BlcmF0aW9ucywgbGVhdmluZyB1cyB3aXRoIGFuIHVuc2lnbmVkIGludAorZm9yIHRoZSBpb2N0bCBjb21tYW5kIGFuZCBhbiB1bnNpZ25lZCBsb25nIGZvciB0aGUgYXJnLiBGb3IgdGhlIHB1cnBvc2VzCitvZiBpb2N0bCBwb3J0YWJpbGl0eSBhY3Jvc3MgMzItYml0IGFuZCA2NC1iaXQsIHRoZXNlIHZhbHVlcyBhcmUgY2FwcGVkCit0byB0aGVpciAzMi1iaXQgc2l6ZXMuPC9wYXJhPgorCis8cGFyYT5UaGUgZm9sbG93aW5nIGlvY3RscyBjYW4gYmUgdXNlZCB0byBjaGFuZ2Ugc3BlY2lmaWMgaGFyZHdhcmUgc2V0dGluZ3MuCitJbiBnZW5lcmFsIGVhY2ggZHJpdmVyIHNob3VsZCBoYXZlIGEgZGVmYXVsdCBzZXQgb2Ygc2V0dGluZ3MuIFRoZSBkcml2ZXIKK2ltcGxlbWVudGF0aW9uIGlzIGV4cGVjdGVkIHRvIHJlLWFwcGx5IHRoZSBkZWZhdWx0IHNldHRpbmdzIHdoZW4gdGhlIGRldmljZQoraXMgY2xvc2VkIGJ5IHVzZXItc3BhY2UsIHNvIHRoYXQgZXZlcnkgYXBwbGljYXRpb24gb3BlbmluZyB0aGUgZGV2aWNlIGNhbiByZWx5CitvbiB3b3JraW5nIHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MgaW5pdGlhbGx5LjwvcGFyYT4KKworPHZhcmlhYmxlbGlzdD4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX0dFVF9GRUFUVVJFUzwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5PYnZpb3VzbHksIGdldCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBkZXZpY2UncyBmZWF0dXJlcy4gSWYgYSBkcml2ZXIKKyAgICAgIGRvZXMgbm90IGFubm91bmNlIHN1cHBvcnQgb2YgY2VydGFpbiBmZWF0dXJlcywgY2FsbGluZyBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAgaW9jdGxzIGlzIHVuZGVmaW5lZC48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+TElSQ19HRVRfU0VORF9NT0RFPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPkdldCBzdXBwb3J0ZWQgdHJhbnNtaXQgbW9kZS4gT25seSBMSVJDX01PREVfUFVMU0UgaXMgc3VwcG9ydGVkIGJ5IGxpcmNkLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX0dFVF9SRUNfTU9ERTwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5HZXQgc3VwcG9ydGVkIHJlY2VpdmUgbW9kZXMuIE9ubHkgTElSQ19NT0RFX01PREUyIGFuZCBMSVJDX01PREVfTElSQ0NPREUKKyAgICAgIGFyZSBzdXBwb3J0ZWQgYnkgbGlyY2QuPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPkxJUkNfR0VUX1NFTkRfQ0FSUklFUjwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5HZXQgY2FycmllciBmcmVxdWVuY3kgKGluIEh6KSBjdXJyZW50bHkgdXNlZCBmb3IgdHJhbnNtaXQuPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPkxJUkNfR0VUX1JFQ19DQVJSSUVSPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPkdldCBjYXJyaWVyIGZyZXF1ZW5jeSAoaW4gSHopIGN1cnJlbnRseSB1c2VkIGZvciBJUiByZWNlcHRpb24uPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPkxJUkNfe0csU31FVF97U0VORCxSRUN9X0RVVFlfQ1lDTEU8L3Rlcm0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+R2V0L3NldCB0aGUgZHV0eSBjeWNsZSAoZnJvbSAwIHRvIDEwMCkgb2YgdGhlIGNhcnJpZXIgc2lnbmFsLiBDdXJyZW50bHksCisgICAgICBubyBzcGVjaWFsIG1lYW5pbmcgaXMgZGVmaW5lZCBmb3IgMCBvciAxMDAsIGJ1dCB0aGlzIGNvdWxkIGJlIHVzZWQgdG8gc3dpdGNoCisgICAgICBvZmYgY2FycmllciBnZW5lcmF0aW9uIGluIHRoZSBmdXR1cmUsIHNvIHRoZXNlIHZhbHVlcyBzaG91bGQgYmUgcmVzZXJ2ZWQuPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPkxJUkNfR0VUX1JFQ19SRVNPTFVUSU9OPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlNvbWUgcmVjZWl2ZXIgaGF2ZSBtYXhpbXVtIHJlc29sdXRpb24gd2hpY2ggaXMgZGVmaW5lZCBieSBpbnRlcm5hbAorICAgICAgc2FtcGxlIHJhdGUgb3IgZGF0YSBmb3JtYXQgbGltaXRhdGlvbnMuIEUuZy4gaXQncyBjb21tb24gdGhhdCBzaWduYWxzIGNhbgorICAgICAgb25seSBiZSByZXBvcnRlZCBpbiA1MCBtaWNyb3NlY29uZCBzdGVwcy4gVGhpcyBpbnRlZ2VyIHZhbHVlIGlzIHVzZWQgYnkKKyAgICAgIGxpcmNkIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBhZXBzIHRvbGVyYW5jZSB2YWx1ZSBpbiB0aGUgbGlyY2QKKyAgICAgIGNvbmZpZyBmaWxlLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX0dFVF9Ne0lOLEFYfV9USU1FT1VUPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlNvbWUgZGV2aWNlcyBoYXZlIGludGVybmFsIHRpbWVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCB3aGVuCisgICAgICB0aGVyZSdzIG5vIElSIGFjdGl2aXR5IGZvciBhIGxvbmcgdGltZS4gVGhpcyBjYW4gaGVscCBsaXJjZCBpbiBkZXRlY3RpbmcKKyAgICAgIHRoYXQgYSBJUiBzaWduYWwgaXMgZmluaXNoZWQgYW5kIGNhbiBzcGVlZCB1cCB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KKyAgICAgIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aXRoIHRoZSBtaW5pbXVtL21heGltdW0gdGltZW91dCB0aGF0IGNhbiBiZQorICAgICAgc2V0LiBTb21lIGRldmljZXMgaGF2ZSBhIGZpeGVkIHRpbWVvdXQsIGluIHRoYXQgY2FzZSBib3RoIGlvY3RscyB3aWxsCisgICAgICByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZXZlbiB0aG91Z2ggdGhlIHRpbWVvdXQgY2Fubm90IGJlIGNoYW5nZWQuPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPkxJUkNfR0VUX017SU4sQVh9X0ZJTFRFUl97UFVMU0UsU1BBQ0V9PC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlNvbWUgZGV2aWNlcyBhcmUgYWJsZSB0byBmaWx0ZXIgb3V0IHNwaWtlcyBpbiB0aGUgaW5jb21pbmcgc2lnbmFsCisgICAgICB1c2luZyBnaXZlbiBmaWx0ZXIgcnVsZXMuIFRoZXNlIGlvY3RscyByZXR1cm4gdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcworICAgICAgdGhhdCBkZXNjcmliZSB0aGUgYm91bmRzIG9mIHRoZSBwb3NzaWJsZSBmaWx0ZXJzLiBGaWx0ZXIgc2V0dGluZ3MgZGVwZW5kCisgICAgICBvbiB0aGUgSVIgcHJvdG9jb2xzIHRoYXQgYXJlIGV4cGVjdGVkLiBsaXJjZCBkZXJpdmVzIHRoZSBzZXR0aW5ncyBmcm9tCisgICAgICBhbGwgcHJvdG9jb2xzIGRlZmluaXRpb25zIGZvdW5kIGluIGl0cyBjb25maWcgZmlsZS48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+TElSQ19HRVRfTEVOR1RIPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlJldHJpZXZlcyB0aGUgY29kZSBsZW5ndGggaW4gYml0cyAob25seSBmb3IgTElSQ19NT0RFX0xJUkNDT0RFKS4KKyAgICAgIFJlYWRzIG9uIHRoZSBkZXZpY2UgbXVzdCBiZSBkb25lIGluIGJsb2NrcyBtYXRjaGluZyB0aGUgYml0IGNvdW50LgorICAgICAgVGhlIGJpdCBjb3VsZCBzaG91bGQgYmUgcm91bmRlZCB1cCBzbyB0aGF0IGl0IG1hdGNoZXMgZnVsbCBieXRlcy48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+TElSQ19TRVRfe1NFTkQsUkVDfV9NT0RFPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlNldCBzZW5kL3JlY2VpdmUgbW9kZS4gTGFyZ2VseSBvYnNvbGV0ZSBmb3Igc2VuZCwgYXMgb25seQorICAgICAgTElSQ19NT0RFX1BVTFNFIGlzIHN1cHBvcnRlZC48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+TElSQ19TRVRfe1NFTkQsUkVDfV9DQVJSSUVSPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlNldCBzZW5kL3JlY2VpdmUgY2FycmllciAoaW4gSHopLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX1NFVF9UUkFOU01JVFRFUl9NQVNLPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlRoaXMgZW5hYmxlcyB0aGUgZ2l2ZW4gc2V0IG9mIHRyYW5zbWl0dGVycy4gVGhlIGZpcnN0IHRyYW5zbWl0dGVyCisgICAgICBpcyBlbmNvZGVkIGJ5IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQsIGV0Yy4gV2hlbiBhbiBpbnZhbGlkIGJpdCBtYXNrCisgICAgICBpcyBnaXZlbiwgaS5lLiBhIGJpdCBpcyBzZXQsIGV2ZW4gdGhvdWdoIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzbyBtYW55CisgICAgICB0cmFuc2l0dGVycywgdGhlbiB0aGlzIGlvY3RsIHJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdHJhbnNpdHRlcnMKKyAgICAgIGFuZCBkb2VzIG5vdGhpbmcgb3RoZXJ3aXNlLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX1NFVF9SRUNfVElNRU9VVDwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5TZXRzIHRoZSBpbnRlZ2VyIHZhbHVlIGZvciBJUiBpbmFjdGl2aXR5IHRpbWVvdXQgKGNmLgorICAgICAgTElSQ19HRVRfTUlOX1RJTUVPVVQgYW5kIExJUkNfR0VUX01BWF9USU1FT1VUKS4gQSB2YWx1ZSBvZiAwIChpZgorICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSkgZGlzYWJsZXMgYWxsIGhhcmR3YXJlIHRpbWVvdXRzIGFuZCBkYXRhIHNob3VsZAorICAgICAgYmUgcmVwb3J0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4gSWYgdGhlIGV4YWN0IHZhbHVlIGNhbm5vdCBiZSBzZXQsIHRoZW4KKyAgICAgIHRoZSBuZXh0IHBvc3NpYmxlIHZhbHVlIF9ncmVhdGVyXyB0aGFuIHRoZSBnaXZlbiB2YWx1ZSBzaG91bGQgYmUgc2V0LjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX1NFVF9SRUNfVElNRU9VVF9SRVBPUlRTPC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPkVuYWJsZSAoMSkgb3IgZGlzYWJsZSAoMCkgdGltZW91dCByZXBvcnRzIGluIExJUkNfTU9ERV9NT0RFMi4gQnkKKyAgICAgIGRlZmF1bHQsIHRpbWVvdXQgcmVwb3J0cyBzaG91bGQgYmUgdHVybmVkIG9mZi48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+TElSQ19TRVRfUkVDX0ZJTFRFUl97LFBVTFNFLFNQQUNFfTwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5QdWxzZXMvc3BhY2VzIHNob3J0ZXIgdGhhbiB0aGlzIGFyZSBmaWx0ZXJlZCBvdXQgYnkgaGFyZHdhcmUuIElmCisgICAgICBmaWx0ZXJzIGNhbm5vdCBiZSBzZXQgaW5kZXBlbmRlbnRseSBmb3IgcHVsc2Uvc3BhY2UsIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICBpb2N0bHMgbXVzdCByZXR1cm4gYW4gZXJyb3IgYW5kIExJUkNfU0VUX1JFQ19GSUxURVIgc2hhbGwgYmUgdXNlZCBpbnN0ZWFkLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX1NFVF9NRUFTVVJFX0NBUlJJRVJfTU9ERTwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5FbmFibGUgKDEpL2Rpc2FibGUgKDApIG1lYXN1cmUgbW9kZS4gSWYgZW5hYmxlZCwgZnJvbSB0aGUgbmV4dCBrZXkKKyAgICAgIHByZXNzIG9uLCB0aGUgZHJpdmVyIHdpbGwgc2VuZCBMSVJDX01PREUyX0ZSRVFVRU5DWSBwYWNrZXRzLiBCeSBkZWZhdWx0CisgICAgICB0aGlzIHNob3VsZCBiZSB0dXJuZWQgb2ZmLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX1NFVF9SRUNfe0RVVFlfQ1lDTEUsQ0FSUklFUn1fUkFOR0U8L3Rlcm0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+VG8gc2V0IGEgcmFuZ2UgdXNlIExJUkNfU0VUX1JFQ19EVVRZX0NZQ0xFX1JBTkdFL0xJUkNfU0VUX1JFQ19DQVJSSUVSX1JBTkdFCisgICAgICB3aXRoIHRoZSBsb3dlciBib3VuZCBmaXJzdCBhbmQgbGF0ZXIgTElSQ19TRVRfUkVDX0RVVFlfQ1lDTEUvTElSQ19TRVRfUkVDX0NBUlJJRVIKKyAgICAgIHdpdGggdGhlIHVwcGVyIGJvdW5kLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX05PVElGWV9ERUNPREU8L3Rlcm0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+VGhpcyBpb2N0bCBpcyBjYWxsZWQgYnkgbGlyY2Qgd2hlbmV2ZXIgYSBzdWNjZXNzZnVsIGRlY29kaW5nIG9mIGFuCisgICAgICBpbmNvbWluZyBJUiBzaWduYWwgY291bGQgYmUgZG9uZS4gVGhpcyBjYW4gYmUgdXNlZCBieSBzdXBwb3J0aW5nIGhhcmR3YXJlCisgICAgICB0byBnaXZlIHZpc3VhbCBmZWVkYmFjayB0byB0aGUgdXNlciBlLmcuIGJ5IGZsYXNoaW5nIGEgTEVELjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT5MSVJDX1NFVFVQX3tTVEFSVCxFTkR9PC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlNldHRpbmcgb2Ygc2V2ZXJhbCBkcml2ZXIgcGFyYW1ldGVycyBjYW4gYmUgb3B0aW1pemVkIGJ5IGVuY2Fwc3VsYXRpbmcKKyAgICAgIHRoZSBhY2NvcmRpbmcgaW9jdGwgY2FsbHMgd2l0aCBMSVJDX1NFVFVQX1NUQVJUL0xJUkNfU0VUVVBfRU5ELiBXaGVuIGEKKyAgICAgIGRyaXZlciByZWNlaXZlcyBhIExJUkNfU0VUVVBfU1RBUlQgaW9jdGwgaXQgY2FuIGNob29zZSB0byBub3QgY29tbWl0CisgICAgICBmdXJ0aGVyIHNldHRpbmcgY2hhbmdlcyB0byB0aGUgaGFyZHdhcmUgdW50aWwgYSBMSVJDX1NFVFVQX0VORCBpcyByZWNlaXZlZC4KKyAgICAgIEJ1dCB0aGlzIGlzIG9wZW4gdG8gdGhlIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBhbmQgZXZlcnkgZHJpdmVyIG11c3QgYWxzbworICAgICAgaGFuZGxlIHBhcmFtZXRlciBjaGFuZ2VzIHdoaWNoIGFyZSBub3QgZW5jYXBzdWxhdGVkIGJ5IExJUkNfU0VUVVBfU1RBUlQKKyAgICAgIGFuZCBMSVJDX1NFVFVQX0VORC4gRHJpdmVycyBjYW4gYWxzbyBjaG9vc2UgdG8gaWdub3JlIHRoZXNlIGlvY3Rscy48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPC9zZWN0aW9uPgorPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sCmluZGV4IDczZjVlYWIuLjNjM2I2NjdiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3JlbW90ZV9jb250cm9sbGVycy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sCkBAIC0xNzMsMyArMTczLDUgQEAKIDxwYXJhPlRoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlcGxhY2UgdGhlIGtleW1hcCB0YWJsZXMuPC9wYXJhPgogJnN1Yi1rZXl0YWJsZS1jOwogPC9zZWN0aW9uPgorCismc3ViLWxpcmNfZGV2aWNlX2ludGVyZmFjZTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSE9XVE8gYi9Eb2N1bWVudGF0aW9uL0hPV1RPCmluZGV4IDQwYWRhOTMuLjM2NWJkYTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vSE9XVE8KKysrIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwpAQCAtMTg3LDcgKzE4Nyw3IEBACiBJZiB5b3UgZG8gbm90IGtub3cgd2hlcmUgeW91IHdhbnQgdG8gc3RhcnQsIGJ1dCB5b3Ugd2FudCB0byBsb29rIGZvcgogc29tZSB0YXNrIHRvIHN0YXJ0IGRvaW5nIHRvIGpvaW4gaW50byB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSwKIGdvIHRvIHRoZSBMaW51eCBLZXJuZWwgSmFuaXRvcidzIHByb2plY3Q6Ci0JaHR0cDovL2phbml0b3Iua2VybmVsbmV3Ymllcy5vcmcvCisJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnL0tlcm5lbEphbml0b3JzCQogSXQgaXMgYSBncmVhdCBwbGFjZSB0byBzdGFydC4gIEl0IGRlc2NyaWJlcyBhIGxpc3Qgb2YgcmVsYXRpdmVseSBzaW1wbGUKIHByb2JsZW1zIHRoYXQgbmVlZCB0byBiZSBjbGVhbmVkIHVwIGFuZCBmaXhlZCB3aXRoaW4gdGhlIExpbnV4IGtlcm5lbAogc291cmNlIHRyZWUuICBXb3JraW5nIHdpdGggdGhlIGRldmVsb3BlcnMgaW4gY2hhcmdlIG9mIHRoaXMgcHJvamVjdCwgeW91CkBAIC0zMTUsNyArMzE1LDcgQEAKIGludGVyZmFjZSB3aGljaCBzaG93cyBwYXRjaCBwb3N0aW5ncywgYW55IGNvbW1lbnRzIG9uIGEgcGF0Y2ggb3IKIHJldmlzaW9ucyB0byBpdCwgYW5kIG1haW50YWluZXJzIGNhbiBtYXJrIHBhdGNoZXMgYXMgdW5kZXIgcmV2aWV3LAogYWNjZXB0ZWQsIG9yIHJlamVjdGVkLiAgTW9zdCBvZiB0aGVzZSBwYXRjaHdvcmsgc2l0ZXMgYXJlIGxpc3RlZCBhdAotaHR0cDovL3BhdGNod29yay5rZXJuZWwub3JnLyBvciBodHRwOi8vcGF0Y2h3b3JrLm96bGFicy5vcmcvLgoraHR0cDovL3BhdGNod29yay5rZXJuZWwub3JnLy4KIAogMi42LnggLW5leHQga2VybmVsIHRyZWUgZm9yIGludGVncmF0aW9uIHRlc3RzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU5NSw3ICs1OTUsNyBAQAogCiAtLS0tLS0tLS0tCiBUaGFua3MgdG8gUGFvbG8gQ2lhcnJvY2NoaSB3aG8gYWxsb3dlZCB0aGUgIkRldmVsb3BtZW50IFByb2Nlc3MiCi0oaHR0cDovL2xpbnV4LnRhci5iei9hcnRpY2xlcy8yLjYtZGV2ZWxvcG1lbnRfcHJvY2Vzcykgc2VjdGlvbgorKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzk0Mzg2Lykgc2VjdGlvbgogdG8gYmUgYmFzZWQgb24gdGV4dCBoZSBoYWQgd3JpdHRlbiwgYW5kIHRvIFJhbmR5IER1bmxhcCBhbmQgR2Vycml0CiBIdWl6ZW5nYSBmb3Igc29tZSBvZiB0aGUgbGlzdCBvZiB0aGluZ3MgeW91IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBzYXkuCiBBbHNvIHRoYW5rcyB0byBQYXQgTW9jaGVsLCBIYW5uYSBMaW5kZXIsIFJhbmR5IER1bmxhcCwgS2F5IFNpZXZlcnMsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dAppbmRleCA3ZjZkZTZlLi42MTQ4ZDQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKQEAgLTU4MSw3ICs1ODEsNyBAQAogOC4gVmVuZG9yIGFuZCBkZXZpY2UgaWRlbnRpZmljYXRpb25zCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotT25lIGlzIG5vdCBub3QgcmVxdWlyZWQgdG8gYWRkIG5ldyBkZXZpY2UgaWRzIHRvIGluY2x1ZGUvbGludXgvcGNpX2lkcy5oLgorT25lIGlzIG5vdCByZXF1aXJlZCB0byBhZGQgbmV3IGRldmljZSBpZHMgdG8gaW5jbHVkZS9saW51eC9wY2lfaWRzLmguCiBQbGVhc2UgYWRkIFBDSV9WRU5ET1JfSURfeHh4IGZvciB2ZW5kb3JzIGFuZCBhIGhleCBjb25zdGFudCBmb3IgZGV2aWNlIGlkcy4KIAogUENJX1ZFTkRPUl9JRF94eHggY29uc3RhbnRzIGFyZSByZS11c2VkLiBUaGUgZGV2aWNlIGlkcyBhcmUgYXJiaXRyYXJ5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9SVEZQLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CmluZGV4IDVhZWE0NTkuLmM0MzQ2MGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL1JURlAudHh0CkBAIC02MDYsNyArNjA2LDcgQEAKICxZZWFyPSIyMDA2IgogLHBhZ2VzPSJ2MiAxMjMtMTM4IgogLG5vdGU9IkF2YWlsYWJsZToKLVx1cmx7aHR0cDovL3d3dy5saW51eHN5bXBvc2l1bS5vcmcvMjAwNi92aWV3X2Fic3RyYWN0LnBocD9jb250ZW50X2tleT0xODR9CitcdXJse2h0dHA6Ly93d3cubGludXhzeW1wb3NpdW0ub3JnLzIwMDYvaW5kZXhfMjAwNi5waHB9CiBcdXJse2h0dHA6Ly93d3cucmRyb3AuY29tL3VzZXJzL3BhdWxtY2svUkNVL09MU3J0UkNVLjIwMDYuMDguMTFhLnBkZn0KIFtWaWV3ZWQgSmFudWFyeSAxLCAyMDA3XSIKICxhbm5vdGF0aW9uPSIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCmluZGV4IDQ5NDdmZDguLjM4ZDJhYWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJaHR0cDovL3d3dy5mZW5ydXMub3JnL2hvdy10by1ub3Qtd3JpdGUtYS1kZXZpY2UtZHJpdmVyLXBhcGVyLnBkZgogCiBLZXJuZWwgSmFuaXRvcjoKLQlodHRwOi8vamFuaXRvci5rZXJuZWxuZXdiaWVzLm9yZy8KKwlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSmFuaXRvcnMKIAogR0lULCBGYXN0IFZlcnNpb24gQ29udHJvbCBTeXN0ZW06CiAJaHR0cDovL2dpdC1zY20uY29tLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hb2UvYW9lLnR4dCBiL0RvY3VtZW50YXRpb24vYW9lL2FvZS50eHQKaW5kZXggM2E0ZGJlNC4uYjVhYWRhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hb2UvYW9lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FvZS9hb2UudHh0CkBAIC0xLDYgKzEsNiBAQAogVGhlIEV0aGVyRHJpdmUgKFIpIEhPV1RPIGZvciB1c2VycyBvZiAyLjYga2VybmVscyBpcyBmb3VuZCBhdCAuLi4KIAotICBodHRwOi8vd3d3LmNvcmFpZC5jb20vc3VwcG9ydC9saW51eC9FdGhlckRyaXZlLTIuNi1IT1dUTy5odG1sCisgIGh0dHA6Ly93d3cuY29yYWlkLmNvbS9TVVBQT1JUL0V0aGVyRHJpdmUtSEJBICAKIAogICBJdCBoYXMgbWFueSB0aXBzIGFuZCBoaW50cyEKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcHBhcm1vci50eHQgYi9Eb2N1bWVudGF0aW9uL2FwcGFybW9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2MxZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hcHBhcm1vci50eHQKQEAgLTAsMCArMSwzOSBAQAorLS0tIFdoYXQgaXMgQXBwQXJtb3I/IC0tLQorCitBcHBBcm1vciBpcyBNQUMgc3R5bGUgc2VjdXJpdHkgZXh0ZW5zaW9uIGZvciB0aGUgTGludXgga2VybmVsLiAgSXQgaW1wbGVtZW50cworYSB0YXNrIGNlbnRlcmVkIHBvbGljeSwgd2l0aCB0YXNrICJwcm9maWxlcyIgYmVpbmcgY3JlYXRlZCBhbmQgbG9hZGVkCitmcm9tIHVzZXIgc3BhY2UuICBUYXNrcyBvbiB0aGUgc3lzdGVtIHRoYXQgZG8gbm90IGhhdmUgYSBwcm9maWxlIGRlZmluZWQgZm9yCit0aGVtIHJ1biBpbiBhbiB1bmNvbmZpbmVkIHN0YXRlIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gc3RhbmRhcmQgTGludXggREFDCitwZXJtaXNzaW9ucy4KKworLS0tIEhvdyB0byBlbmFibGUvZGlzYWJsZSAtLS0KKworc2V0IENPTkZJR19TRUNVUklUWV9BUFBBUk1PUj15CisKK0lmIEFwcEFybW9yIHNob3VsZCBiZSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBzZWN1cml0eSBtb2R1bGUgdGhlbgorICAgc2V0IENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSJhcHBhcm1vciIKKyAgIGFuZCBDT05GSUdfU0VDVVJJVFlfQVBQQVJNT1JfQk9PVFBBUkFNX1ZBTFVFPTEKKworQnVpbGQgdGhlIGtlcm5lbAorCitJZiBBcHBBcm1vciBpcyBub3QgdGhlIGRlZmF1bHQgc2VjdXJpdHkgbW9kdWxlIGl0IGNhbiBiZSBlbmFibGVkIGJ5IHBhc3NpbmcKK3NlY3VyaXR5PWFwcGFybW9yIG9uIHRoZSBrZXJuZWwncyBjb21tYW5kIGxpbmUuCisKK0lmIEFwcEFybW9yIGlzIHRoZSBkZWZhdWx0IHNlY3VyaXR5IG1vZHVsZSBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgcGFzc2luZworYXBwYXJtb3I9MCwgc2VjdXJpdHk9WFhYWCAod2hlcmUgWFhYIGlzIHZhbGlkIHNlY3VyaXR5IG1vZHVsZSksIG9uIHRoZQora2VybmVsJ3MgY29tbWFuZCBsaW5lCisKK0ZvciBBcHBBcm1vciB0byBlbmZvcmNlIGFueSByZXN0cmljdGlvbnMgYmV5b25kIHN0YW5kYXJkIExpbnV4IERBQyBwZXJtaXNzaW9ucworcG9saWN5IG11c3QgYmUgbG9hZGVkIGludG8gdGhlIGtlcm5lbCBmcm9tIHVzZXIgc3BhY2UgKHNlZSB0aGUgRG9jdW1lbnRhdGlvbgorYW5kIHRvb2xzIGxpbmtzKS4KKworLS0tIERvY3VtZW50YXRpb24gLS0tCisKK0RvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSB3aWtpLgorCistLS0gTGlua3MgLS0tCisKK01haWxpbmcgTGlzdCAtIGFwcGFybW9yQGxpc3RzLnVidW50dS5jb20KK1dpa2kgLSBodHRwOi8vYXBwYXJtb3Iud2lraS5rZXJuZWwub3JnLworVXNlciBzcGFjZSB0b29scyAtIGh0dHBzOi8vbGF1bmNocGFkLm5ldC9hcHBhcm1vcgorS2VybmVsIG1vZHVsZSAtIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qai9hcHBhcm1vci1kZXYuZ2l0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9JWFAyMDAwIGIvRG9jdW1lbnRhdGlvbi9hcm0vSVhQMjAwMAppbmRleCBlMDE0OGI2Li42OGQyMWQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9JWFAyMDAwCisrKyBiL0RvY3VtZW50YXRpb24vYXJtL0lYUDIwMDAKQEAgLTE0LDcgKzE0LDcgQEAKIGludGVyZmFjZXMgKFVUT1BJQSwgU1BJLCBldGMpLCBhIFBDSSBob3N0IGJyaWRnZSwgb25lIHNlcmlhbCBwb3J0LAogZmxhc2ggaW50ZXJmYWNlLCBhbmQgc29tZSBvdGhlciBvZGRzIGFuZCBlbmRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgogCi1odHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vbmV0d29yay9wcm9kdWN0cy9ucGZhbWlseS9peHAyeHh4Lmh0bQoraHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20KIAogMi4gTGludXggU3VwcG9ydAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9JWFA0eHggYi9Eb2N1bWVudGF0aW9uL2FybS9JWFA0eHgKaW5kZXggNzJmYmNjNC4uMTMzYzVmYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vSVhQNHh4CisrKyBiL0RvY3VtZW50YXRpb24vYXJtL0lYUDR4eApAQCAtNDUsNyArNDUsNyBAQAogSWYgeW91IG5lZWQgdG8gdXNlIGFueSBvZiB0aGUgYWJvdmUsIHlvdSBuZWVkIHRvIGRvd25sb2FkIEludGVsJ3MKIHNvZnR3YXJlIGZyb206CiAKLSAgIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9uZXR3b3JrL3Byb2R1Y3RzL25wZmFtaWx5L2l4cDQyNXN3cjEuaHRtCisgICBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vbmV0d29yay9wcm9kdWN0cy9ucGZhbWlseS9peHA0MjUuaHRtICAgIAogCiBETyBOT1QgUE9TVCBRVUVTVElPTlMgVE8gVEhFIExJTlVYIE1BSUxJTkcgTElTVFMgUkVHQVJESU5HIFRIRSBQUk9QSUVUQVJZCiBTT0ZUV0FSRS4KQEAgLTUzLDcgKzUzLDcgQEAKIFRoZXJlIGFyZSBzZXZlcmFsIHdlYnNpdGVzIHRoYXQgcHJvdmlkZSBkaXJlY3Rpb25zL3BvaW50ZXJzIG9uIHVzaW5nCiBJbnRlbCdzIHNvZnR3YXJlOgogCi1odHRwOi8vaXhwNHh4LW9zZGcuc291cmNlZm9yZ2UubmV0LyAKKyAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvaXhwNHh4LW9zZGcvCiAgICBPcGVuIFNvdXJjZSBEZXZlbG9wZXIncyBHdWlkZSBmb3IgdXNpbmcgdUNsaW51eCBhbmQgdGhlIEludGVsIGxpYnJhcmllcyAKIAogaHR0cDovL2dhdGV3YXltYWtlci5zb3VyY2Vmb3JnZS5uZXQvIApAQCAtMTEyLDIxICsxMTIsMjEgQEAKICAgIEZpbmFsbHksIHRoZXJlIGlzIGFuIElERSBwb3J0IGhhbmdpbmcgb2ZmIHRoZSBleHBhbnNpb24gYnVzLgogCiBHYXRld29ya3MgQXZpbGEgTmV0d29yayBQbGF0Zm9ybQotaHR0cDovL3d3dy5nYXRld29ya3MuY29tL2F2aWxhX3NiYy5odG0KK2h0dHA6Ly93d3cuZ2F0ZXdvcmtzLmNvbS9zdXBwb3J0L292ZXJ2aWV3LnBocAogCiAgICBUaGUgQXZpbGEgcGxhdGZvcm0gaXMgYmFzaWNhbGx5IGFuZCBJWERQNDI1IHdpdGggdGhlIDQgUENJIHNsb3RzCiAgICByZXBsYWNlZCB3aXRoIG1pbmktUENJIHNsb3RzIGFuZCBhIENGIElERSBpbnRlcmZhY2UgaGFuZ2luZyBvZmYKICAgIHRoZSBleHBhbnNpb24gYnVzLgogCiBJbnRlbCBJWERQNDI1IERldmVsb3BtZW50IFBsYXRmb3JtCi1odHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vbmV0d29yay9wcm9kdWN0cy9ucGZhbWlseS9peGRwNDI1Lmh0bQoraHR0cDovL3d3dy5pbnRlbC5jb20vZGVzaWduL25ldHdvcmsvcHJvZHVjdHMvbnBmYW1pbHkvaXhkcGc0MjUuaHRtICAKIAogICAgVGhpcyBpcyBJbnRlbCdzIHN0YW5kYXJkIHJlZmVyZW5jZSBwbGF0Zm9ybSBmb3IgdGhlIElYRFA0MjUgYW5kIGlzIAogICAgYWxzbyBrbm93biBhcyB0aGUgUmljaGZpZWxkIGJvYXJkLiBJdCBjb250YWlucyA0IFBDSSBzbG90cywgMTZNQgogICAgb2YgZmxhc2gsIHR3byAxMC8xMDAgcG9ydHMgYW5kIG9uZSBBRFNMIHBvcnQuCiAKIEludGVsIElYRFA0NjUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0KLWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9uZXR3b3JrL3Byb2R1Y3RzL25wZmFtaWx5L2l4ZHA0NjUuaHRtCitodHRwOi8vd3d3LmludGVsLmNvbS9kZXNpZ24vbmV0d29yay9wcm9kdWN0cy9ucGZhbWlseS9peGRwNDY1Lmh0bQogCiAgICBUaGlzIGlzIGJhc2ljYWxseSBhbiBJWERQNDI1IHdpdGggYW4gSVhQNDY1IGFuZCAzMk0gb2YgZmxhc2ggaW5zdGVhZAogICAgb2YganVzdCAxNi4KQEAgLTE0MSwxNSArMTQxLDEzIEBACiAgICBhIHBpdm90X3Jvb3QgdG8gTkZTLgogCiBNb3Rvcm9sYSBQclBNQzExMDAgUHJvY2Vzc29yIE1lemFuaW5lIENhcmQKLWh0dHA6Ly93d3cuZm91bnRhaW5zeXMuY29tL2RhdGFzaGVldC9QclBNQzExMDAucGRmCitodHRwOi8vd3d3LmZvdW50YWluc3lzLmNvbQogCiAgICBUaGUgUHJQTUMxMTAwIGlzIGJhc2VkIG9uIHRoZSBJWENQMTEwMCBhbmQgaXMgbWVhbnQgdG8gcGx1ZyBpbnRvCiAgICBhbmQgSVhQMjQwMC8yODAwIHN5c3RlbSB0byBhY3QgYXMgdGhlIHN5c3RlbSBjb250cm9sbGVyLiBJdCBzaW1wbHkKICAgIGNvbnRhaW5zIGEgQ1BVIGFuZCAxNk1CIG9mIGZsYXNoIG9uIHRoZSBib2FyZCBhbmQgbmVlZHMgdG8gYmUKICAgIHBsdWdnZWQgaW50byBhIGNhcnJpZXIgYm9hcmQgdG8gZnVuY3Rpb24uIEN1cnJlbnRseSBMaW51eCBvbmx5CiAgICBzdXBwb3J0cyB0aGUgTW90b3JvbGEgUHJQTUMgY2FycmllciBib2FyZCBmb3IgdGhpcyBwbGF0Zm9ybS4KLSAgIFNlZSBodHRwczovL21jZy5tb3Rvcm9sYS5jb20vdXMvZHMvcGRmL2RzMDE0NC5wZGYgZm9yIGluZm8KLSAgIG9uIHRoZSBjYXJyaWVyIGJvYXJkLgogCiA1LiBUT0RPIExJU1QKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vUkVBRE1FIGIvRG9jdW1lbnRhdGlvbi9hcm0vUkVBRE1FCmluZGV4IGQ5ODc4M2YuLmFlYTM0MDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXJtL1JFQURNRQorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9SRUFETUUKQEAgLTQxLDEyICs0MSwxMiBAQAogLS0tLS0tLS0tLS0tLS0tCiAKICAgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byB0aGUgcGF0Y2ggc3lzdGVtLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvcGF0Y2hlcy9pbmZvLmh0bWwgIEFsd2F5cyBpbmNsdWRlIHNvbWUKKyAgaHR0cDovL3d3dy5hcm0ubGludXgub3JnLnVrL2RldmVsb3Blci9wYXRjaGVzL2luZm8ucGhwIEFsd2F5cyBpbmNsdWRlIHNvbWUKICAgZXhwbGFuYXRpb24gYXMgdG8gd2hhdCB0aGUgcGF0Y2ggZG9lcyBhbmQgd2h5IGl0IGlzIG5lZWRlZC4KIAogICBCdWcgcmVwb3J0cyBzaG91bGQgYmUgc2VudCB0byBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmFybS5saW51eC5vcmcudWssCiAgIG9yIHN1Ym1pdHRlZCB0aHJvdWdoIHRoZSB3ZWIgZm9ybSBhdAotICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZm9ybXMvc29sdXRpb24uc2h0bWwKKyAgaHR0cDovL3d3dy5hcm0ubGludXgub3JnLnVrL2RldmVsb3Blci8gCiAKICAgV2hlbiBzZW5kaW5nIGJ1ZyByZXBvcnRzLCBwbGVhc2UgZW5zdXJlIHRoYXQgdGhleSBjb250YWluIGFsbCByZWxldmFudAogICBpbmZvcm1hdGlvbiwgZWcuIHRoZSBrZXJuZWwgbWVzc2FnZXMgdGhhdCB3ZXJlIHByaW50ZWQgYmVmb3JlL2R1cmluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0Fzc2FiZXQgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvQXNzYWJldAppbmRleCA5MWY3Y2U3Li4wOGI4ODVkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvQXNzYWJldAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvQXNzYWJldApAQCAtMiw4ICsyLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFBsZWFzZSBzZWU6Ci1odHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vc3Ryb25nL3F1aWNrbGlzdC9ldmFsLXBsYXQvc2EtMTExMC5odG0KLWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9zdHJvbmcvZ3VpZGVzLzI3ODI3OC5odG0KK2h0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tCiAKIEFsc28gc29tZSBub3RlcyBmcm9tIEpvaG4gRyBEb3JzZXkgPGpkNXFAYW5kcmV3LmNtdS5lZHU+OgogaHR0cDovL3d3dy5jcy5jbXUuZWR1L353ZWFyYWJsZS9zb2Z0d2FyZS9hc3NhYmV0Lmh0bWwKQEAgLTY0LDcgKzYzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBjb21tYW5kcyB1c2VkIGhlcmUgYXJlIGV4cGxhaW5lZCBpbiBUaGUgUmVkQm9vdCBVc2VyJ3MgR3VpZGUgYXZhaWxhYmxlCi1vbi1saW5lIGF0IGh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vZWNvcy9kb2NzLWxhdGVzdC9yZWRib290L3JlZGJvb3QuaHRtbC4KK29uLWxpbmUgYXQgaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9lY29zL2RvY3MuaHRtbC4KIFBsZWFzZSByZWZlciB0byBpdCBmb3IgZXhwbGFuYXRpb25zLgogCiBJZiB5b3UgaGF2ZSBhIENGIG5ldHdvcmsgY2FyZCAobXkgQXNzYWJldCBraXQgY29udGFpbmVkIGEgQ0YrIExQLUUgZnJvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0JydXR1cyBiL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9CcnV0dXMKaW5kZXggYjFjZmQ0MC4uNmEzYWE5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0JydXR1cworKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvQnJ1dHVzCkBAIC0xLDcgKzEsNyBAQAogQnJ1dHVzIGlzIGFuIGV2YWx1YXRpb24gcGxhdGZvcm0gZm9yIHRoZSBTQTExMDAgbWFudWZhY3R1cmVkIGJ5IEludGVsLiAgCiBGb3IgbW9yZSBkZXRhaWxzLCBzZWU6CiAKLWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9zdHJvbmcvYXBwbG5vdHMvc2ExMTAwbHgvZ2V0c3RhcnQuaHRtCitodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbQogCiBUbyBjb21waWxlIGZvciBCcnV0dXMsIHlvdSBtdXN0IGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9GcmVlQmlyZCBiL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9GcmVlQmlyZAppbmRleCBlZGEyOGIzLi5mYjIzYjc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvRnJlZUJpcmQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0ZyZWVCaXJkCkBAIC0xLDUgKzEsNSBAQAogRnJlZWJpcmQtMS4xIGlzIHByb2R1Y2VkIGJ5IExlZ25lZChDKSAsSW5jLgotKGh0dHA6Ly93d3cubGVnZW5kLmNvbS5jbikKK2h0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy5sZWdlbmQuY29tLmNuCiBhbmQgc29mdHdhcmUvbGludXggbWFpbmF0aW5lZCBieSBDb3ZlbnRpdmUoQyksSW5jLgogKGh0dHA6Ly93d3cuY292ZW50aXZlLmNvbSkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0dyYXBoaWNzQ2xpZW50IGIvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0dyYXBoaWNzQ2xpZW50CmluZGV4IDZjOWM0ZjUuLjg2N2JiMzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9HcmFwaGljc0NsaWVudAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvR3JhcGhpY3NDbGllbnQKQEAgLTcxLDcgKzcxLDcgQEAKIC0gc2VyaWFsIHBvcnRzICh0dHlTWzAtMl0pCiAgIC0gdHR5UzAgaXMgZGVmYXVsdCBmb3Igc2VyaWFsIGNvbnNvbGUKIC0gU21hcnQgSS9PIChBREMsIGtleXBhZCwgZGlnaXRhbCBpbnB1dHMsIGV0YykKLSAgU2VlIGh0dHA6Ly93d3cuYXBwbGllZGRhdGEuY29tL2RldmVsb3BlcnMvbGludXggZm9yIElPQ1RMIGRvY3VtZW50YXRpb24KKyAgU2VlIGh0dHA6Ly93d3cuZXVyb3RlY2gtaW5jLmNvbS9saW51eC1zYmMuYXNwIGZvciBJT0NUTCBkb2N1bWVudGF0aW9uCiAgIGFuZCBleGFtcGxlIHVzZXIgc3BhY2UgY29kZS4gcHMvMiBrZXliZCBpcyBtdWx0aXBsZXhlZCB0aHJvdWdoIHRoaXMgZHJpdmVyCiAKIFRvIGRvOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0dyYXBoaWNzTWFzdGVyIGIvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0dyYXBoaWNzTWFzdGVyCmluZGV4IGVlN2M2NTkuLjkxNDUwODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9HcmFwaGljc01hc3RlcgorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvR3JhcGhpY3NNYXN0ZXIKQEAgLTI4LDcgKzI4LDcgQEAKIC0gc2VyaWFsIHBvcnRzICh0dHlTWzAtMl0pCiAgIC0gdHR5UzAgaXMgZGVmYXVsdCBmb3Igc2VyaWFsIGNvbnNvbGUKIC0gU21hcnQgSS9PIChBREMsIGtleXBhZCwgZGlnaXRhbCBpbnB1dHMsIGV0YykKLSAgU2VlIGh0dHA6Ly93d3cuYXBwbGllZGRhdGEuY29tL2RldmVsb3BlcnMvbGludXggZm9yIElPQ1RMIGRvY3VtZW50YXRpb24KKyAgU2VlIGh0dHA6Ly93d3cuZXVyb3RlY2gtaW5jLmNvbS9saW51eC1zYmMuYXNwIGZvciBJT0NUTCBkb2N1bWVudGF0aW9uCiAgIGFuZCBleGFtcGxlIHVzZXIgc3BhY2UgY29kZS4gcHMvMiBrZXliZCBpcyBtdWx0aXBsZXhlZCB0aHJvdWdoIHRoaXMgZHJpdmVyCiAKIFRvIGRvOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL0l0c3kgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvSXRzeQppbmRleCAzYjU5NDUzLi40NGI5NDk5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvSXRzeQorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvSXRzeQpAQCAtNCw3ICs0LDcgQEAKIAogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZToKIAotCWh0dHA6Ly93d3cucmVzZWFyY2guZGlnaXRhbC5jb20vd3JsL2l0c3kvaW5kZXguaHRtbAorCWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9kb3dubG9hZHMvY3JsL2l0c3kvCiAKIE5vdGVzIG9uIGluaXRpYWwgMi40IEl0c3kgc3VwcG9ydCAoOC8yNy8yMDAwKSA6CiBUaGUgcG9ydCB3YXMgZG9uZSBvbiBhbiBJdHN5IHZlcnNpb24gMS41IG1hY2hpbmUgd2l0aCBhIGRhdWdodGVyY2FyZCB3aXRoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvUExFQiBiL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9QTEVCCmluZGV4IDkyY2FlMDY2Li5iOWM4YTYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvUExFQgorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvUExFQgpAQCAtNiw2ICs2LDYgQEAKIAogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZToKIAotCWh0dHA6Ly93d3cuY3NlLnVuc3cuZWR1LmF1L35wbGViLworCWh0dHA6Ly93d3cuY3NlLnVuc3cuZWR1LmF1CiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL1ZpY3RvciBiL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9WaWN0b3IKaW5kZXggZjkzOGEyOS4uOWNmZjQxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vU0ExMTAwL1ZpY3RvcgorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvVmljdG9yCkBAIC0zLDcgKzMsNyBAQAogCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFZpY3Rvciwgc2VlOgogCi0JaHR0cDovL3d3dy52aXN1YWlkZS5jb20vdmljdG9yCisJaHR0cDovL3d3dy5odW1hbndhcmUuY29tL2VuLXVzYS9wcm9kdWN0cwogCiBPZiBjb3Vyc2UgVmljdG9yIGlzIHVzaW5nIExpbnV4IGFzIGl0cyBtYWluIG9wZXJhdGluZyBzeXN0ZW0uCiBUaGUgVmljdG9yIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBpcyBtYWludGFpbmVkIGJ5IE5pY29sYXMgUGl0cmU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvbmFub0VuZ2luZSBiL0RvY3VtZW50YXRpb24vYXJtL1NBMTEwMC9uYW5vRW5naW5lCmluZGV4IGZjNDMxY2IuLjQ4YTc5MzRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvbmFub0VuZ2luZQorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TQTExMDAvbmFub0VuZ2luZQpAQCAtNyw1ICs3LDUgQEAKIChSZWY6IFN0dWFydCBBZGFtcyA8c2phQGJyaWdodHN0YXJlbmcuY29tPikKIAogQWxzbyB2aXNpdCBMYXJyeSBEb29saXR0bGUncyAiTGludXggZm9yIHRoZSBuYW5vRW5naW5lIiBzaXRlOgotaHR0cDovL3JlY3ljbGUubGJsLmdvdi9+bGRvb2xpdHQvYnNlLworaHR0cDovL3d3dy5icmlnaHRzdGFyZW5nLmNvbS9hcm0vbmFub2VuZy5odG0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vYXJtL21lbW9yeS50eHQKaW5kZXggZWIwZmFlMS4uNzcxZDQ4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vbWVtb3J5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9tZW1vcnkudHh0CkBAIC0zMyw3ICszMywxMyBAQAogCiBmZmZlMDAwMAlmZmZlZmZmZglYU2NhbGUgY2FjaGUgZmx1c2ggYXJlYS4gIFRoaXMgaXMgdXNlZAogCQkJCWluIHByb2MteHNjYWxlLlMgdG8gZmx1c2ggdGhlIHdob2xlIGRhdGEKLQkJCQljYWNoZS4gIEZyZWUgZm9yIG90aGVyIHVzYWdlIG9uIG5vbi1YU2NhbGUuCisJCQkJY2FjaGUuIChYU2NhbGUgZG9lcyBub3QgaGF2ZSBUQ00uKQorCitmZmZlODAwMAlmZmZlZmZmZglEVENNIG1hcHBpbmcgYXJlYSBmb3IgcGxhdGZvcm1zIHdpdGgKKwkJCQlEVENNIG1vdW50ZWQgaW5zaWRlIHRoZSBDUFUuCisKK2ZmZmUwMDAwCWZmZmU3ZmZmCUlUQ00gbWFwcGluZyBhcmVhIGZvciBwbGF0Zm9ybXMgd2l0aAorCQkJCUlUQ00gbW91bnRlZCBpbnNpZGUgdGhlIENQVS4KIAogZmZmMDAwMDAJZmZmZGZmZmYJRml4bWFwIG1hcHBpbmcgcmVnaW9uLiAgQWRkcmVzc2VzIHByb3ZpZGVkCiAJCQkJYnkgZml4X3RvX3ZpcnQoKSB3aWxsIGJlIGxvY2F0ZWQgaGVyZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtL3RjbS50eHQgYi9Eb2N1bWVudGF0aW9uL2FybS90Y20udHh0CmluZGV4IDc3ZmQ5MzcuLjdjMTU4NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXJtL3RjbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcm0vdGNtLnR4dApAQCAtMTksOCArMTksOCBAQAogc3lzdGVtIGNvbnRyb2wgY29wcm9jZXNzb3IuIERvY3VtZW50YXRpb24gZnJvbSBBUk0gY2FuIGJlIGZvdW5kCiBhdCBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tLCBzZWFyY2ggZm9yICJUQ00gU3RhdHVzIFJlZ2lzdGVyIgogdG8gc2VlIGRvY3VtZW50cyBmb3IgYWxsIENQVXMuIFJlYWRpbmcgdGhpcyByZWdpc3RlciB5b3UgY2FuCi1kZXRlcm1pbmUgaWYgSVRDTSAoYml0IDApIGFuZC9vciBEVENNIChiaXQgMTYpIGlzIHByZXNlbnQgaW4gdGhlCi1tYWNoaW5lLgorZGV0ZXJtaW5lIGlmIElUQ00gKGJpdHMgMS0wKSBhbmQvb3IgRFRDTSAoYml0IDE3LTE2KSBpcyBwcmVzZW50CitpbiB0aGUgbWFjaGluZS4KIAogVGhlcmUgaXMgZnVydGhlciBhIFRDTSByZWdpb24gcmVnaXN0ZXIgKHNlYXJjaCBmb3IgIlRDTSBSZWdpb24KIFJlZ2lzdGVycyIgYXQgdGhlIEFSTSBzaXRlKSB0aGF0IGNhbiByZXBvcnQgYW5kIG1vZGlmeSB0aGUgbG9jYXRpb24KQEAgLTM1LDcgKzM1LDE1IEBACiB0aGUgTU1VLCBidXQgbm90aWNlIHRoYXQgdGhlIFRDTSBpZiBvZnRlbiB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUKIHRoZSBNTVUgaXMgdHVybmVkIG9mZi4gVG8gYXZvaWQgY29uZnVzaW9uIHRoZSBjdXJyZW50IExpbnV4CiBpbXBsZW1lbnRhdGlvbiB3aWxsIG1hcCB0aGUgVENNIDEgdG8gMSBmcm9tIHBoeXNpY2FsIHRvIHZpcnR1YWwKLW1lbW9yeSBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBtYWNoaW5lLgorbWVtb3J5IGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGtlcm5lbC4gQ3VycmVudGx5IExpbnV4Cit3aWxsIG1hcCBJVENNIHRvIDB4ZmZmZTAwMDAgYW5kIG9uLCBhbmQgRFRDTSB0byAweGZmZmU4MDAwIGFuZAorb24sIHN1cHBvcnRpbmcgYSBtYXhpbXVtIG9mIDMyS2lCIG9mIElUQ00gYW5kIDMyS2lCIG9mIERUQ00uCisKK05ld2VyIHZlcnNpb25zIG9mIHRoZSByZWdpb24gcmVnaXN0ZXJzIGFsc28gc3VwcG9ydCBkaXZpZGluZyB0aGVzZQorVENNcyBpbiB0d28gc2VwYXJhdGUgYmFua3MsIHNvIGZvciBleGFtcGxlIGFuIDhLaUIgSVRDTSBpcyBkaXZpZGVkCitpbnRvIHR3byA0S2lCIGJhbmtzIHdpdGggaXRzIG93biBjb250cm9sIHJlZ2lzdGVycy4gVGhlIGlkZWEgaXMgdG8KK2JlIGFibGUgdG8gbG9jayBhbmQgaGlkZSBvbmUgb2YgdGhlIGJhbmtzIGZvciB1c2UgYnkgdGhlIHNlY3VyZQord29ybGQgKFRydXN0Wm9uZSkuCiAKIFRDTSBpcyB1c2VkIGZvciBhIGZldyB0aGluZ3M6CiAKQEAgLTY1LDE4ICs3MywxOCBAQAogICBtZW1vcnkuIFN1Y2ggYSBoZWFwIGlzIGdyZWF0IGZvciB0aGluZ3MgbGlrZSBzYXZpbmcKICAgZGV2aWNlIHN0YXRlIHdoZW4gc2h1dHRpbmcgb2ZmIGRldmljZSBwb3dlciBkb21haW5zLgogCi1BIG1hY2hpbmUgdGhhdCBoYXMgVENNIG1lbW9yeSBzaGFsbCBzZWxlY3QgSEFWRV9UQ00gaW4KLWFyY2gvYXJtL0tjb25maWcgZm9yIGl0c2VsZiwgYW5kIHRoZW4gdGhlCi1yZXN0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHdpbGwgZGVwZW5kIG9uIHRoZSBwaHlzaWNhbAotbG9jYXRpb24gYW5kIHNpemUgb2YgSVRDTSBhbmQgRFRDTSB0byBiZSBkZWZpbmVkIGluCi1tYWNoL21lbW9yeS5oIGZvciB0aGUgbWFjaGluZS4gQ29kZSB0aGF0IG5lZWRzIHRvIHVzZQotVENNIHNoYWxsICNpbmNsdWRlIDxhc20vdGNtLmg+IElmIHRoZSBUQ00gaXMgbm90IGxvY2F0ZWQKLWF0IHRoZSBwbGFjZSBnaXZlbiBpbiBtZW1vcnkuaCBpdCB3aWxsIGJlIG1vdmVkIHVzaW5nCi10aGUgVENNIFJlZ2lvbiByZWdpc3RlcnMuCitBIG1hY2hpbmUgdGhhdCBoYXMgVENNIG1lbW9yeSBzaGFsbCBzZWxlY3QgSEFWRV9UQ00gZnJvbQorYXJjaC9hcm0vS2NvbmZpZyBmb3IgaXRzZWxmLiBDb2RlIHRoYXQgbmVlZHMgdG8gdXNlIFRDTSBzaGFsbAorI2luY2x1ZGUgPGFzbS90Y20uaD4KIAogRnVuY3Rpb25zIHRvIGdvIGludG8gaXRjbSBjYW4gYmUgdGFnZ2VkIGxpa2UgdGhpczoKIGludCBfX3RjbWZ1bmMgZm9vKGludCBiYXIpOwogCitTaW5jZSB0aGVzZSBhcmUgbWFya2VkIHRvIGJlY29tZSBsb25nX2NhbGxzIGFuZCB5b3UgbWF5IHdhbnQKK3RvIGhhdmUgZnVuY3Rpb25zIGNhbGxlZCBsb2NhbGx5IGluc2lkZSB0aGUgVENNIHdpdGhvdXQKK3dhc3Rpbmcgc3BhY2UsIHRoZXJlIGlzIGFsc28gdGhlIF9fdGNtbG9jYWxmdW5jIHByZWZpeCB0aGF0Cit3aWxsIG1ha2UgdGhlIGNhbGwgcmVsYXRpdmUuCisKIFZhcmlhYmxlcyB0byBnbyBpbnRvIGR0Y20gY2FuIGJlIHRhZ2dlZCBsaWtlIHRoaXM6CiBpbnQgX190Y21kYXRhIGZvbzsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9iaW5mbXRfbWlzYy50eHQgYi9Eb2N1bWVudGF0aW9uL2JpbmZtdF9taXNjLnR4dAppbmRleCBmNjA5ZWJmLi5jMWVkNjk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2JpbmZtdF9taXNjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2JpbmZtdF9taXNjLnR4dApAQCAtMTExLDYgKzExMSw2IEBACiAKIAogVGhlcmUgaXMgYSB3ZWIgcGFnZSBhYm91dCBiaW5mbXRfbWlzYyBhdAotaHR0cDovL3d3dy50YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGUvfnJndWVudGgvbGludXgvYmluZm10X21pc2MuaHRtbAoraHR0cDovL3d3dy50YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGUKIAogUmljaGFyZCBHw7xudGhlciA8cmd1ZW50aEB0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKaW5kZXggNTA4YjViMi4uYjlhODNkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dApAQCAtNyw3ICs3LDcgQEAKIAogTGFzdCBVcGRhdGVkIE1heSAyLCAyMDAyCiBTZXB0ZW1iZXIgMjAwMzogVXBkYXRlZCBJL08gU2NoZWR1bGVyIHBvcnRpb25zCi0JTmljayBQaWdnaW4gPHBpZ2dpbkBjeWJlcm9uZS5jb20uYXU+CisJTmljayBQaWdnaW4gPG5waWdnaW5Aa2VybmVsLmRrPgogCiBJbnRyb2R1Y3Rpb246CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvcGFyaWRlLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvcGFyaWRlLnR4dAppbmRleCBlNDMxMjY3Li5lZTY3MTdlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3BhcmlkZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9wYXJpZGUudHh0CkBAIC00MTIsNiArNDEyLDYgQEAKIFlvdSBtaWdodCBhbHNvIGZpbmQgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24gb24gdGhlIGxpbnV4LXBhcnBvcnQKIHdlYiBwYWdlcyAoYWx0aG91Z2ggdGhleSBhcmUgbm90IGFsd2F5cyB1cCB0byBkYXRlKSBhdAogCi0JaHR0cDovL3d3dy50b3JxdWUubmV0L3BhcnBvcnQvCisJaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vd3d3LnRvcnF1ZS5uZXQvcGFycG9ydC8KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3BhY2tldC13cml0aW5nLnR4dCBiL0RvY3VtZW50YXRpb24vY2Ryb20vcGFja2V0LXdyaXRpbmcudHh0CmluZGV4IDFjNDA3NzcuLjEzYzI1MWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vcGFja2V0LXdyaXRpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2Ryb20vcGFja2V0LXdyaXRpbmcudHh0CkBAIC05NSw3ICs5NSw3IEBACiAKIFNpbmNlIExpbnV4IDIuNi4yMCwgdGhlIHBrdGNkdmQgbW9kdWxlIGhhcyBhIHN5c2ZzIGludGVyZmFjZQogYW5kIGNhbiBiZSBjb250cm9sbGVkIGJ5IGl0LiBGb3IgZXhhbXBsZSB0aGUgInBrdGNkdmQiIHRvb2wgdXNlcwotdGhpcyBpbnRlcmZhY2UuIChzZWUgaHR0cDovL3Blb3BsZS5mcmVlbmV0LmRlL0JhbGFHaSNwa3RjZHZkICkKK3RoaXMgaW50ZXJmYWNlLiAoc2VlIGh0dHA6Ly90b20uaXN0LWltLXdlYi5kZS9kb3dubG9hZC9wa3RjZHZkICkKIAogInBrdGNkdmQiIHdvcmtzIHNpbWlsYXIgdG8gInBrdHNldHVwIiwgZS5nLjoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0CmluZGV4IDUxNjgyYWIuLjVkMGQ1NjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVzZXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQKQEAgLTY5MSw3ICs2OTEsNyBAQAogICAgY2F0LCBybWRpciBjb21tYW5kcyBmcm9tIHRoZSBzaGVsbCwgb3IgdGhlaXIgZXF1aXZhbGVudCBmcm9tIEMuCiAgLSB2aWEgdGhlIEMgbGlicmFyeSBsaWJjcHVzZXQuCiAgLSB2aWEgdGhlIEMgbGlicmFyeSBsaWJjZ3JvdXAuCi0gICAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9lY3RzL2xpYmNnLykKKyAgIChodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmNnLykKICAtIHZpYSB0aGUgcHl0aG9uIGFwcGxpY2F0aW9uIGNzZXQuCiAgICAoaHR0cDovL2RldmVsb3Blci5ub3ZlbGwuY29tL3dpa2kvaW5kZXgucGhwL0NwdXNldCkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dCBiL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyYjAyOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKQEAgLTAsMCArMSwyNTggQEAKK0NvcHlyaWdodCAyMDEwIE5pY29sYXMgUGFsaXggPG5wYWxpeEBkaWt1LmRrPgorQ29weXJpZ2h0IDIwMTAgSnVsaWEgTGF3YWxsIDxqdWxpYUBkaWt1LmRrPgorQ29weXJpZ2h0IDIwMTAgR2lsbGVzIE11bGxlciA8R2lsbGVzLk11bGxlckBsaXA2LmZyPgorCisKKyBHZXR0aW5nIENvY2NpbmVsbGUKK35+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBzZW1hbnRpYyBwYXRjaGVzIGluY2x1ZGVkIGluIHRoZSBrZXJuZWwgdXNlIHRoZSAndmlydHVhbCBydWxlJworZmVhdHVyZSB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiBDb2NjaW5lbGxlIHZlcnNpb24gMC4xLjExLgorCitDb2NjaW5lbGxlICg+PTAuMi4wKSBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgcGFja2FnZSBtYW5hZ2VyCitvZiBtYW55IGRpc3RyaWJ1dGlvbnMsIGUuZy4gOgorCisgLSBEZWJpYW4gKD49c3F1ZWV6ZSkKKyAtIEZlZG9yYSAoPj0xMykKKyAtIFVidW50dSAoPj0xMC4wNCBMdWNpZCBMeW54KQorIC0gT3BlblNVU0UKKyAtIEFyY2ggTGludXgKKyAtIE5ldEJTRAorIC0gRnJlZUJTRAorCisKK1lvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiByZWxlYXNlZCBmcm9tIHRoZSBDb2NjaW5lbGxlIGhvbWVwYWdlIGF0CitodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLworCitPbmNlIHlvdSBoYXZlIGl0LCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgIAkuL2NvbmZpZ3VyZQorICAgICAgICBtYWtlCisKK2FzIGEgcmVndWxhciB1c2VyLCBhbmQgaW5zdGFsbCBpdCB3aXRoCisKKyAgICAgICAgc3VkbyBtYWtlIGluc3RhbGwKKworCisgVXNpbmcgQ29jY2luZWxsZSBvbiB0aGUgTGludXgga2VybmVsCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBIENvY2NpbmVsbGUtc3BlY2lmaWMgdGFyZ2V0IGlzIGRlZmluZWQgaW4gdGhlIHRvcCBsZXZlbAorTWFrZWZpbGUuIFRoaXMgdGFyZ2V0IGlzIG5hbWVkICdjb2NjaWNoZWNrJyBhbmQgY2FsbHMgdGhlICdjb2NjaWNoZWNrJworZnJvbnQtZW5kIGluIHRoZSAnc2NyaXB0cycgZGlyZWN0b3J5LgorCitGb3VyIG1vZGVzIGFyZSBkZWZpbmVkOiByZXBvcnQsIHBhdGNoLCBjb250ZXh0LCBhbmQgb3JnLiBUaGUgbW9kZSB0bwordXNlIGlzIHNwZWNpZmllZCBieSBzZXR0aW5nIHRoZSBNT0RFIHZhcmlhYmxlIHdpdGggJ01PREU9PG1vZGU+Jy4KKworJ3JlcG9ydCcgZ2VuZXJhdGVzIGEgbGlzdCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgZmlsZTpsaW5lOmNvbHVtbi1jb2x1bW46IG1lc3NhZ2UKKworJ3BhdGNoJyBwcm9wb3NlcyBhIGZpeCwgd2hlbiBwb3NzaWJsZS4KKworJ2NvbnRleHQnIGhpZ2hsaWdodHMgbGluZXMgb2YgaW50ZXJlc3QgYW5kIHRoZWlyIGNvbnRleHQgaW4gYQorZGlmZi1saWtlIHN0eWxlLkxpbmVzIG9mIGludGVyZXN0IGFyZSBpbmRpY2F0ZWQgd2l0aCAnLScuCisKKydvcmcnIGdlbmVyYXRlcyBhIHJlcG9ydCBpbiB0aGUgT3JnIG1vZGUgZm9ybWF0IG9mIEVtYWNzLgorCitOb3RlIHRoYXQgbm90IGFsbCBzZW1hbnRpYyBwYXRjaGVzIGltcGxlbWVudCBhbGwgbW9kZXMuCisKK1RvIG1ha2UgYSByZXBvcnQgZm9yIGV2ZXJ5IHNlbWFudGljIHBhdGNoLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9cmVwb3J0CisKK05COiBUaGUgJ3JlcG9ydCcgbW9kZSBpcyB0aGUgZGVmYXVsdCBvbmUuCisKK1RvIHByb2R1Y2UgcGF0Y2hlcywgcnVuOgorCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9cGF0Y2gKKworCitUaGUgY29jY2ljaGVjayB0YXJnZXQgYXBwbGllcyBldmVyeSBzZW1hbnRpYyBwYXRjaCBhdmFpbGFibGUgaW4gdGhlCitzdWJkaXJlY3RvcmllcyBvZiAnc2NyaXB0cy9jb2NjaW5lbGxlJyB0byB0aGUgZW50aXJlIExpbnV4IGtlcm5lbC4KKworRm9yIGVhY2ggc2VtYW50aWMgcGF0Y2gsIGEgY2hhbmdlbG9nIG1lc3NhZ2UgaXMgcHJvcG9zZWQuICBJdCBnaXZlcyBhCitkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSBiZWluZyBjaGVja2VkIGJ5IHRoZSBzZW1hbnRpYyBwYXRjaCwgYW5kCitpbmNsdWRlcyBhIHJlZmVyZW5jZSB0byBDb2NjaW5lbGxlLgorCitBcyBhbnkgc3RhdGljIGNvZGUgYW5hbHl6ZXIsIENvY2NpbmVsbGUgcHJvZHVjZXMgZmFsc2UKK3Bvc2l0aXZlcy4gVGh1cywgcmVwb3J0cyBtdXN0IGJlIGNhcmVmdWxseSBjaGVja2VkLCBhbmQgcGF0Y2hlcworcmV2aWV3ZWQuCisKKworIFVzaW5nIENvY2NpbmVsbGUgd2l0aCBhIHNpbmdsZSBzZW1hbnRpYyBwYXRjaAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIG9wdGlvbmFsIG1ha2UgdmFyaWFibGUgQ09DQ0kgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYSBzaW5nbGUKK3NlbWFudGljIHBhdGNoLiBJbiB0aGF0IGNhc2UsIHRoZSB2YXJpYWJsZSBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGgKK3RoZSBuYW1lIG9mIHRoZSBzZW1hbnRpYyBwYXRjaCB0byBhcHBseS4KKworRm9yIGluc3RhbmNlOgorCisJbWFrZSBjb2NjaWNoZWNrIENPQ0NJPTxteV9TUC5jb2NjaT4gTU9ERT1wYXRjaAorb3IKKwltYWtlIGNvY2NpY2hlY2sgQ09DQ0k9PG15X1NQLmNvY2NpPiBNT0RFPXJlcG9ydAorCisKKyBQcm9wb3NpbmcgbmV3IHNlbWFudGljIHBhdGNoZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK05ldyBzZW1hbnRpYyBwYXRjaGVzIGNhbiBiZSBwcm9wb3NlZCBhbmQgc3VibWl0dGVkIGJ5IGtlcm5lbAorZGV2ZWxvcGVycy4gRm9yIHNha2Ugb2YgY2xhcml0eSwgdGhleSBzaG91bGQgYmUgb3JnYW5pemVkIGluIHRoZQorc3ViZGlyZWN0b3JpZXMgb2YgJ3NjcmlwdHMvY29jY2luZWxsZS8nLgorCisKKyBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgJ3JlcG9ydCcgbW9kZQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisncmVwb3J0JyBnZW5lcmF0ZXMgYSBsaXN0IGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICBmaWxlOmxpbmU6Y29sdW1uLWNvbHVtbjogbWVzc2FnZQorCitFeGFtcGxlOgorCitSdW5uaW5nCisKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0LgorCis8c21wbD4KK0ByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KUAKK2V4cHJlc3Npb24geDsKK3Bvc2l0aW9uIHA7CitAQAorCisgRVJSX1BUUkBwKFBUUl9FUlIoeCkpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorcCA8PCByLnA7Cit4IDw8IHIueDsKK0BACisKK21zZz0iRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCAlcyIgJSAoeCkKK2NvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQorPC9zbXBsPgorCitUaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6CisKKy9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jOjE4ODo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZworL2hvbWUvdXNlci9saW51eC9jcnlwdG8vYXV0aGVuYy5jOjYxOTo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGF1dGgKKy9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjIyNzo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZworCisKKyBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgJ3BhdGNoJyBtb2RlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1doZW4gdGhlICdwYXRjaCcgbW9kZSBpcyBhdmFpbGFibGUsIGl0IHByb3Bvc2VzIGEgZml4IGZvciBlYWNoIHByb2JsZW0KK2lkZW50aWZpZWQuCisKK0V4YW1wbGU6CisKK1J1bm5pbmcKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1wYXRjaCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvZXJyX2Nhc3QuY29jY2kKKword2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQuCisKKzxzbXBsPgorQCBkZXBlbmRzIG9uICFjb250ZXh0ICYmIHBhdGNoICYmICFvcmcgJiYgIXJlcG9ydCBACitleHByZXNzaW9uIHg7CitAQAorCistIEVSUl9QVFIoUFRSX0VSUih4KSkKKysgRVJSX0NBU1QoeCkKKzwvc21wbD4KKworVGhpcyBTbVBMIGV4Y2VycHQgZ2VuZXJhdGVzIHBhdGNoIGh1bmtzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzoKKworZGlmZiAtdSAtcCBhL2NyeXB0by9jdHIuYyBiL2NyeXB0by9jdHIuYworLS0tIGEvY3J5cHRvL2N0ci5jIDIwMTAtMDUtMjYgMTA6NDk6MzguMDAwMDAwMDAwICswMjAwCisrKysgYi9jcnlwdG8vY3RyLmMgMjAxMC0wNi0wMyAyMzo0NDo0OS4wMDAwMDAwMDAgKzAyMDAKK0BAIC0xODUsNyArMTg1LDcgQEAgc3RhdGljIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmNyeXB0b19jdAorIAlhbGcgPSBjcnlwdG9fYXR0cl9hbGcodGJbMV0sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisgCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOworIAlpZiAoSVNfRVJSKGFsZykpCistCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CisgCisgCS8qIEJsb2NrIHNpemUgbXVzdCBiZSA+PSA0IGJ5dGVzLiAqLworIAllcnIgPSAtRUlOVkFMOworCisgRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlICdjb250ZXh0JyBtb2RlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKydjb250ZXh0JyBoaWdobGlnaHRzIGxpbmVzIG9mIGludGVyZXN0IGFuZCB0aGVpciBjb250ZXh0CitpbiBhIGRpZmYtbGlrZSBzdHlsZS4KKworTk9URTogVGhlIGRpZmYtbGlrZSBvdXRwdXQgZ2VuZXJhdGVkIGlzIE5PVCBhbiBhcHBsaWNhYmxlIHBhdGNoLiBUaGUKKyAgICAgIGludGVudCBvZiB0aGUgJ2NvbnRleHQnIG1vZGUgaXMgdG8gaGlnaGxpZ2h0IHRoZSBpbXBvcnRhbnQgbGluZXMKKyAgICAgIChhbm5vdGF0ZWQgd2l0aCBtaW51cywgJy0nKSBhbmQgZ2l2ZXMgc29tZSBzdXJyb3VuZGluZyBjb250ZXh0CisgICAgICBsaW5lcyBhcm91bmQuIFRoaXMgb3V0cHV0IGNhbiBiZSB1c2VkIHdpdGggdGhlIGRpZmYgbW9kZSBvZgorICAgICAgRW1hY3MgdG8gcmV2aWV3IHRoZSBjb2RlLgorCitFeGFtcGxlOgorCitSdW5uaW5nCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9Y29udGV4dCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvZXJyX2Nhc3QuY29jY2kKKword2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQuCisKKzxzbXBsPgorQCBkZXBlbmRzIG9uIGNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgIXJlcG9ydEAKK2V4cHJlc3Npb24geDsKK0BACisKKyogRVJSX1BUUihQVFJfRVJSKHgpKQorPC9zbXBsPgorCitUaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgZGlmZiBodW5rcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6CisKK2RpZmYgLXUgLXAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmMgL3RtcC9ub3RoaW5nCistLS0gL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmMJMjAxMC0wNS0yNiAxMDo0OTozOC4wMDAwMDAwMDAgKzAyMDAKKysrKyAvdG1wL25vdGhpbmcKK0BAIC0xODUsNyArMTg1LDYgQEAgc3RhdGljIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmNyeXB0b19jdAorIAlhbGcgPSBjcnlwdG9fYXR0cl9hbGcodGJbMV0sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisgCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOworIAlpZiAoSVNfRVJSKGFsZykpCistCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworIAorIAkvKiBCbG9jayBzaXplIG11c3QgYmUgPj0gNCBieXRlcy4gKi8KKyAJZXJyID0gLUVJTlZBTDsKKworIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSAnb3JnJyBtb2RlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKydvcmcnIGdlbmVyYXRlcyBhIHJlcG9ydCBpbiB0aGUgT3JnIG1vZGUgZm9ybWF0IG9mIEVtYWNzLgorCitFeGFtcGxlOgorCitSdW5uaW5nCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9b3JnIENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9lcnJfY2FzdC5jb2NjaQorCit3aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdC4KKworPHNtcGw+CitAciBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAob3JnIHx8IHJlcG9ydClACitleHByZXNzaW9uIHg7Citwb3NpdGlvbiBwOworQEAKKworIEVSUl9QVFJAcChQVFJfRVJSKHgpKQorCitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uIG9yZ0AKK3AgPDwgci5wOworeCA8PCByLng7CitAQAorCittc2c9IkVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggJXMiICUgKHgpCittc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQorY29jY2lsaWIub3JnLnByaW50X3RvZG8ocFswXSwgbXNnX3NhZmUpCis8L3NtcGw+CisKK1RoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBPcmcgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6CisKKyogVE9ETyBbW3ZpZXc6L2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmM6OmZhY2U9b3ZsLWZhY2UxOjpsaW5iPTE4ODo6Y29sYj05Ojpjb2xlPTE2XVtFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZ11dCisqIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2F1dGhlbmMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9NjE5Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYXV0aF1dCisqIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj0yMjc6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGddXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcmVkZW50aWFscy50eHQgYi9Eb2N1bWVudGF0aW9uL2NyZWRlbnRpYWxzLnR4dAppbmRleCBhMmRiMzUyLi45OTViYWYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NyZWRlbnRpYWxzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NyZWRlbnRpYWxzLnR4dApAQCAtNDE3LDYgKzQxNyw5IEBACiBUaGlzIGRvZXMgYWxsIHRoZSBSQ1UgbWFnaWMgaW5zaWRlIG9mIGl0LiAgVGhlIGNhbGxlciBtdXN0IGNhbGwgcHV0X2NyZWQoKSBvbgogdGhlIGNyZWRlbnRpYWxzIHNvIG9idGFpbmVkIHdoZW4gdGhleSdyZSBmaW5pc2hlZCB3aXRoLgogCisgWypdIE5vdGU6IFRoZSByZXN1bHQgb2YgX190YXNrX2NyZWQoKSBzaG91bGQgbm90IGJlIHBhc3NlZCBkaXJlY3RseSB0bworICAgICBnZXRfY3JlZCgpIGFzIHRoaXMgbWF5IHJhY2Ugd2l0aCBjb21taXRfY3JlZCgpLgorCiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGFjY2VzcyBiaXRzIG9mIGFub3RoZXIgdGFzaydzCiBjcmVkZW50aWFscywgaGlkaW5nIHRoZSBSQ1UgbWFnaWMgZnJvbSB0aGUgY2FsbGVyOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcKaW5kZXggYTVhMzQ1MC4uMjI3ODY5MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZwpAQCAtMjgxLDcgKzI4MSw3IEBACiB1c2VyLXNwYWNlIGFuZCBrZXJuZWwtc3BhY2UgYWRkcmVzc2VzLCBtaXh0dXJlIG9mIGJpZy1lbmRpYW4gYW5kCiBzbWFsbC1lbmRpYW4gcXVhbnRpdGllcywgdGhlIHBhc3Npbmcgb2YgaW50ZWdlciB2YWx1ZXMgd2hlcmUgYSBzZXQgb2YgYml0CiBmbGFncyBpcyBleHBlY3RlZCwgYW5kIHNvIG9uLiAgU3BhcnNlIG11c3QgYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgKGl0IGNhbgotYmUgZm91bmQgYXQgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9kZXZlbC9zcGFyc2UvIGlmIHlvdXIKK2JlIGZvdW5kIGF0IGh0dHBzOi8vc3BhcnNlLndpa2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlIGlmIHlvdXIKIGRpc3RyaWJ1dG9yIGRvZXMgbm90IHBhY2thZ2UgaXQpOyBpdCBjYW4gdGhlbiBiZSBydW4gb24gdGhlIGNvZGUgYnkgYWRkaW5nCiAiQz0xIiB0byB5b3VyIG1ha2UgY29tbWFuZC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1jcnlwdC50eHQKaW5kZXggNjY4MGNhYi4uNTI0ZGU5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0CkBAIC0zNiw3ICszNiw3IEBACiA9PT09PT09PT09PT09PT0KIExVS1MgKExpbnV4IFVuaWZpZWQgS2V5IFNldHVwKSBpcyBub3cgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2V0IHVwIGRpc2sKIGVuY3J5cHRpb24gd2l0aCBkbS1jcnlwdCB1c2luZyB0aGUgJ2NyeXB0c2V0dXAnIHV0aWxpdHksIHNlZQotaHR0cDovL2x1a3MuZW5kb3JwaGluLm9yZy8KK2h0dHA6Ly9jbGVtZW5zLmVuZG9ycGhpbi5vcmcvY3J5cHRvZ3JhcGh5CiAKIFtbCiAjIS9iaW4vc2gKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CmluZGV4IDFkODNkMTIuLmYyZGE3ODEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dApAQCAtMTUxNyw3ICsxNTE3LDcgQEAKIAkJICAgIC4uLgogCiAJCVRoZSBkcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gbWF5IGJlIG9idGFpbmVkIGZyb20KLQkJaHR0cDovL3d3dy5wcm94aW1pdHkuY29tLmF1L35icmlhbi93aW5yYWRpby8KKwkJaHR0cDovL3d3dy53aW5yYWRpby5jb20vCiAKICA4MiBibG9jawlJMk8gaGFyZCBkaXNrCiAJCSAgMCA9IC9kZXYvaTJvL2hkYWcJMzNyZCBJMk8gaGFyZCBkaXNrLCB3aG9sZSBkaXNrCkBAIC0xNzIzLDcgKzE3MjMsNyBAQAogCQkgIDEgPSAvZGV2L2NvbWVkaTEJU2Vjb25kIGNvbWVkaSBkZXZpY2UKIAkJICAgIC4uLgogCi0JCVNlZSBodHRwOi8vc3RtLmxibC5nb3YvY29tZWRpIG9yIGh0dHA6Ly93d3cubGxwLmZ1LWJlcmxpbi5kZS8uCisJCVNlZSBodHRwOi8vc3RtLmxibC5nb3YvY29tZWRpLgogCiAgOTggYmxvY2sJVXNlci1tb2RlIHZpcnR1YWwgYmxvY2sgZGV2aWNlCiAJCSAgMCA9IC9kZXYvdWJkYQkJRmlyc3QgdXNlci1tb2RlIGJsb2NrIGRldmljZQpAQCAtMTk4NCw3ICsxOTg0LDcgQEAKICAgICAgICAgICAgICAgICAyNTYgTmV0V2FyZSB2b2x1bWVzIGNhbiBiZSBzdXBwb3J0ZWQgaW4gYSBzaW5nbGUKICAgICAgICAgICAgICAgICBtYWNoaW5lLgogCi0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2ptZXJrZXkvbndmcworICAgICAgICAgICAgICAgIGh0dHA6Ly9jZ2ZhLnRlbGVwYWMucHQvZnRwMi9rZXJuZWwub3JnL2xpbnV4L2tlcm5lbC9wZW9wbGUvam1lcmtleS9ud2ZzLwogCiAgICAgICAgICAgICAgICAgMCA9IC9kZXYvbndmcy92MCAgICBGaXJzdCBOZXRXYXJlIChOV0ZTKSBMb2dpY2FsIFZvbHVtZQogICAgICAgICAgICAgICAgIDEgPSAvZGV2L253ZnMvdjEgICAgU2Vjb25kIE5ldFdhcmUgKE5XRlMpIExvZ2ljYWwgVm9sdW1lCkBAIC0yNTkxLDcgKzI1OTEsOCBAQAogCQkgIDEgPSAvZGV2L2ludGVybWV6em8xCVNlY29uZCBjYWNoZSBtYW5hZ2VyCiAJCSAgICAuLi4KIAotCQlTZWUgaHR0cDovL3d3dy5pbnRlci1tZXp6by5vcmcvIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCQlTZWUgaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwODAxMTUxOTUyNDEvCisJCWh0dHA6Ly9pbnRlci1tZXp6by5vcmcvaW5kZXguaHRtbAogCiAxODYgY2hhcglPYmplY3QtYmFzZWQgc3RvcmFnZSBjb250cm9sIGRldmljZQogCQkgIDAgPSAvZGV2L29iZDAJCUZpcnN0IG9iZCBjb250cm9sIGRldmljZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvZmFxLnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL2ZhcS50eHQKaW5kZXggMjUxMWEzMy4uMTIxODMyZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvZmFxLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9mYXEudHh0CkBAIC03Niw3ICs3Niw3IEBACiAJCXRoZSBUdXhCb3ggQ1ZTIG1hbnkgaW50ZXJlc3RpbmcgRFZCIGFwcGxpY2F0aW9ucyBhbmQgdGhlIGRCb3gyCiAJCURWQiBzb3VyY2UKIAotCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZHZic2FrLworCWh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzLwkKIAkJRFZCIFN3aXNzIEFybXkgS25pZmUgbGlicmFyeSBhbmQgdXRpbGl0aWVzCiAKIAlodHRwOi8vd3d3Lm5lbmllLm9yZy9taXNjL21wc3lzLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBiL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUKaW5kZXggMjM5Y2JkYi4uMzUwOTU5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCkBAIC0yNiw3ICsyNiw3IEBACiAJCSJkZWMzMDAwcyIsICJ2cDcwNDEiLCAiZGlidXNiIiwgIm54dDIwMDIiLCAibnh0MjAwNCIsCiAJCSJvcjUxMjExIiwgIm9yNTExMzJfcWFtIiwgIm9yNTExMzJfdnNiIiwgImJsdWViaXJkIiwKIAkJIm9wZXJhMSIsICJjeDIzMXh4IiwgImN4MTgiLCAiY3gyMzg4NSIsICJwdnJ1c2IyIiwgIm1wYzcxOCIsCi0JCSJhZjkwMTUiLCAibmdlbmUiKTsKKwkJImFmOTAxNSIsICJuZ2VuZSIsICJhejYwMjciKTsKIAogIyBDaGVjayBhcmdzCiBzeW50YXgoKSBpZiAoc2NhbGFyKEBBUkdWKSAhPSAxKTsKQEAgLTUxOCwxMSArNTE4LDExIEBACiBzdWIgYWY5MDE1IHsKIAlteSAkc291cmNlZmlsZSA9ICJkb3dubG9hZC5hc2h4P2ZpbGU9NTciOwogCW15ICR1cmwgPSAiaHR0cDovL3d3dy5pdGUuY29tLnR3L0VOL1NlcnZpY2VzLyRzb3VyY2VmaWxlIjsKLQlteSAkaGFzaCA9ICJmZjViMDk2ZWQ0N2MwODA4NzBlYWNkYWIyZGUzM2FkNiI7CisJbXkgJGhhc2ggPSAiZTNmMDg5MzUxNTgwMzhkMzg1YWQzODI0NDJmNGJiMmQiOwogCW15ICRvdXRmaWxlID0gImR2Yi11c2ItYWY5MDE1LmZ3IjsKIAlteSAkdG1wZGlyID0gdGVtcGRpcihESVIgPT4gIi90bXAiLCBDTEVBTlVQID0+IDEpOwotCW15ICRmd29mZnNldCA9IDB4MjI3MDg7Ci0JbXkgJGZ3bGVuZ3RoID0gMTgyMjU7CisJbXkgJGZ3b2Zmc2V0ID0gMHgyNTY5MDsKKwlteSAkZndsZW5ndGggPSAxODcyNTsKIAlteSAoJGNodW5rbGVuZ3RoLCAkYnVmLCAkcmNvdW50KTsKIAogCWNoZWNrc3RhbmRhcmQoKTsKQEAgLTU2Nyw2ICs1NjcsMjMgQEAKICAgICAiJGZpbGUxLCAkZmlsZTIiOwogfQogCitzdWIgYXo2MDI3eworICAgIG15ICRmaWxlID0gIkFaNjAyN19MaW51eF9Ecml2ZXIudGFyLmd6IjsKKyAgICBteSAkdXJsID0gImh0dHA6Ly9saW51eC50ZXJyYXRlYy5kZS9maWxlcy8kZmlsZSI7CisgICAgbXkgJGZpcm13YXJlID0gImR2Yi11c2ItYXo2MDI3LTAzLmZ3IjsKKworICAgIHdnZXRmaWxlKCRmaWxlLCAkdXJsKTsKKworICAgICN1bnRhcgorICAgIGlmKCBzeXN0ZW0oInRhciB4enZmICRmaWxlICRmaXJtd2FyZSIpKXsKKyAgICAgICAgZGllICJmYWlsZWQgdG8gdW50YXIgZmlybXdhcmUiOworICAgIH0KKyAgICBpZiggc3lzdGVtKCJybSAkZmlsZSIpKXsKKyAgICAgICAgZGllICgidW5hYmxlIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBmaWxlcyIpOworICAgIH0KKworICAgICRmaXJtd2FyZTsKK30KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFV0aWxpdGllcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2ZyYW1lYnVmZmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZmIvZnJhbWVidWZmZXIudHh0CmluZGV4IGZlNzllM2MuLjU4YzVhZTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmIvZnJhbWVidWZmZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmIvZnJhbWVidWZmZXIudHh0CkBAIC0zMzAsNyArMzMwLDcgQEAKIAogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGZic2V0IGNhbiBiZSBmb3VuZCBhdAogCi0gICAgaHR0cDovL2hvbWUudHZkLmJlL2NyMjY4NjQvTGludXgvZmJkZXYvCisgICAgaHR0cDovL3d3dy5saW51eC1mYmRldi5vcmcvIAogCiAgIAogMTAuIENyZWRpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggY2Q2NDhkYi4uNzFmMGZlYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtOTMsNyArOTMsNyBAQAogCWlucHV0cy4gIFRoaXMgZnJhbWV3b3JrIHdhcyBuZXZlciB3aWRlbHkgdXNlZCwgYW5kIG1vc3QgYXR0ZW1wdHMgdG8KIAl1c2UgaXQgd2VyZSBicm9rZW4uICBEcml2ZXJzIHNob3VsZCBpbnN0ZWFkIGJlIGV4cG9zaW5nIGRvbWFpbi1zcGVjaWZpYwogCWludGVyZmFjZXMgZWl0aGVyIHRvIGtlcm5lbCBvciB0byB1c2Vyc3BhY2UuCi1XaG86CVBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KK1dobzoJUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xMTYsMjkgKzExNiw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglQQ01DSUEgY29udHJvbCBpb2N0bCAobmVlZGVkIGZvciBwY21jaWEtY3MgW2NhcmRtZ3IsIGNhcmRjdGxdKQotV2hlbjoJMi42LjM1LzIuNi4zNgotRmlsZXM6CWRyaXZlcnMvcGNtY2lhLzogcGNtY2lhX2lvY3RsLmMKLVdoeToJV2l0aCB0aGUgMTYtYml0IFBDTUNJQSBzdWJzeXN0ZW0gbm93IGJlaGF2aW5nIChhbG1vc3QpIGxpa2UgYQotCW5vcm1hbCBob3RwbHVnZ2FibGUgYnVzLCBhbmQgd2l0aCBpdCB1c2luZyB0aGUgZGVmYXVsdCBrZXJuZWwKLQlpbmZyYXN0cnVjdHVyZSAoaG90cGx1ZywgZHJpdmVyIGNvcmUsIHN5c2ZzKSBrZWVwaW5nIHRoZSBQQ01DSUEKLQljb250cm9sIGlvY3RsIG5lZWRlZCBieSBjYXJkbWdyIGFuZCBjYXJkY3RsIGZyb20gcGNtY2lhLWNzIGlzCi0JdW5uZWNlc3NhcnkgYW5kIHBvdGVudGlhbGx5IGhhcm1mdWwgKGl0IGRvZXMgbm90IHByb3ZpZGUgZm9yCi0JcHJvcGVyIGxvY2tpbmcpLCBhbmQgbWFrZXMgZnVydGhlciBjbGVhbnVwcyBhbmQgaW50ZWdyYXRpb24gb2YgdGhlCi0JUENNQ0lBIHN1YnN5c3RlbSBpbnRvIHRoZSBMaW51eCBrZXJuZWwgZGV2aWNlIGRyaXZlciBtb2RlbCBtb3JlCi0JZGlmZmljdWx0LiBUaGUgZmVhdHVyZXMgcHJvdmlkZWQgYnkgY2FyZG1nciBhbmQgY2FyZGN0bCBhcmUgZWl0aGVyCi0JaGFuZGxlZCBieSB0aGUga2VybmVsIGl0c2VsZiBub3cgb3IgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3Ci0JcGNtY2lhdXRpbHMgcGFja2FnZSBhdmFpbGFibGUgYXQKLQlodHRwOi8va2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL3BjbWNpYS8KLQotCUZvciBhbGwgYXJjaGl0ZWN0dXJlcyBleGNlcHQgQVJNLCB0aGUgYXNzb2NpYXRlZCBjb25maWcgc3ltYm9sCi0JaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGtlcm5lbCAyLjYuMzQ7IGZvciBBUk0sIGl0IHdpbGwgYmUgbGlrZWx5Ci0JYmUgcmVtb3ZlZCBmcm9tIGtlcm5lbCAyLjYuMzUuIFRoZSBhY3R1YWwgY29kZSB3aWxsIHRoZW4gbGlrZWx5Ci0JYmUgcmVtb3ZlZCBmcm9tIGtlcm5lbCAyLjYuMzYuCi1XaG86CURvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLm5ldD4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CXN5c19zeXNjdGwKIFdoZW46CVNlcHRlbWJlciAyMDEwCiBPcHRpb246IENPTkZJR19TWVNDVExfU1lTQ0FMTApAQCAtMzAzLDE1ICsyODAsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDogQ09ORklHX05GX0NUX0FDQ1QKLVdoZW46IDIuNi4yOQotV2h5OiAgQWNjb3VudGluZyBjYW4gbm93IGJlIGVuYWJsZWQvZGlzYWJsZWQgd2l0aG91dCBrZXJuZWwgcmVjb21waWxhdGlvbi4KLSAgICAgIEN1cnJlbnRseSB1c2VkIG9ubHkgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmZWF0dXJlIHRoYXQgaXMgYWxzbwotICAgICAgY29udHJvbGxlZCBieSBhIGtlcm5lbC9tb2R1bGUvc3lzZnMvc3lzY3RsIHBhcmFtZXRlci4KLVdobzogIEtyenlzenRvZiBQaW90ciBPbGVkemtpIDxvbGVAYW5zLnBsPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJc3lzZnMgdWkgZm9yIGNoYW5naW5nIHA0LWNsb2NrbW9kIHBhcmFtZXRlcnMKIFdoZW46CVNlcHRlbWJlciAyMDA5CiBXaHk6CVNlZSBjb21taXRzIDEyOWY4YWU5YjFiNWJlOTQ1MTdkYTc2MDA5ZWE5NTZlODkxMDRjZTggYW5kCkBAIC0zNzcsMTYgKzM0NSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJbG9ja19wb2xpY3lfcndzZW1fKiBhbmQgdW5sb2NrX3BvbGljeV9yd3NlbV8qIHdpbGwgbm90IGJlCi0JZXhwb3J0ZWQgaW50ZXJmYWNlIGFueW1vcmUuCi1XaGVuOgkyLjYuMzMKLVdoeToJY3B1X3BvbGljeV9yd3NlbSBoYXMgYSBuZXcgY2xlYW5lciBkZWZpbml0aW9uIG1ha2luZyBpdCBsb2NhbCB0bwotCWNwdWZyZXEgY29yZSBhbmQgY29udGFpbmVkIGluc2lkZSBjcHVmcmVxLmMuIE90aGVyIGRlcGVuZGVudAotCWRyaXZlcnMgc2hvdWxkIG5vdCB1c2UgaXQgaW4gb3JkZXIgdG8gc2FmZWx5IGF2b2lkIGxvY2tkZXAgaXNzdWVzLgotV2hvOglWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0Oglzb3VuZC1zbG90L3NlcnZpY2UtKiBtb2R1bGUgYWxpYXNlcyBhbmQgcmVsYXRlZCBjbHV0dGVycyBpbgogCXNvdW5kL3NvdW5kX2NvcmUuYwogV2hlbjoJQXVndXN0IDIwMTAKQEAgLTQ1OSw1NyArNDE3LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0Ogl1c2J2aWRlbyBxdWlja2NhbV9tZXNzZW5nZXIgZHJpdmVyCi1XaGVuOgkyLjYuMzUKLUZpbGVzOglkcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5bY2hdCi1XaHk6CW9ic29sZXRlIHY0bDEgZHJpdmVyIHJlcGxhY2VkIGJ5IGdzcGNhX3N0djA2eHgKLVdobzoJSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XaGF0OglvdjUxMSB2NGwxIGRyaXZlcgotV2hlbjoJMi42LjM1Ci1GaWxlczoJZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5bY2hdCi1XaHk6CW9ic29sZXRlIHY0bDEgZHJpdmVyIHJlcGxhY2VkIGJ5IGdzcGNhX292NTE5Ci1XaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hhdDoJdzk5NjhjZiB2NGwxIGRyaXZlcgotV2hlbjoJMi42LjM1Ci1GaWxlczoJZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmKi5bY2hdCi1XaHk6CW9ic29sZXRlIHY0bDEgZHJpdmVyIHJlcGxhY2VkIGJ5IGdzcGNhX292NTE5Ci1XaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hhdDoJb3ZjYW1jaGlwIHNlbnNvciBmcmFtZXdvcmsKLVdoZW46CTIuNi4zNQotRmlsZXM6CWRyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwLyoKLVdoeToJT25seSB1c2VkIGJ5IG9ic29sZXRlZCB2NGwxIGRyaXZlcnMKLVdobzoJSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XaGF0OglzdHY2ODAgdjRsMSBkcml2ZXIKLVdoZW46CTIuNi4zNQotRmlsZXM6CWRyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLltjaF0KLVdoeToJb2Jzb2xldGUgdjRsMSBkcml2ZXIgcmVwbGFjZWQgYnkgZ3NwY2Ffc3R2MDY4MAotV2hvOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoYXQ6CXpjMDMwMSB2NGwgZHJpdmVyCi1XaGVuOgkyLjYuMzUKLUZpbGVzOglkcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS8qCi1XaHk6CUR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGdzcGNhX3pjM3h4IGRyaXZlciwgemMwMzAxIG9ubHkKLQlzdXBwb3J0cyAyIFVTQi1JRCdzIChiZWNhdXNlIGl0IG9ubHkgc3VwcG9ydHMgYSBsaW1pdGVkIHNldCBvZgotCXNlbnNvcnMpIHdpY2ggYXJlIGFsc28gc3VwcG9ydGVkIGJ5IHRoZSBnc3BjYV96YzN4eCBkcml2ZXIKLQkod2hpY2ggc3VwcG9ydHMgNTMgVVNCLUlEJ3MgaW4gdG90YWwpCi1XaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJc3lzZnMtY2xhc3MtcmZraWxsIHN0YXRlIGZpbGUKIFdoZW46CUZlYiAyMDE0CiBGaWxlczoJbmV0L3Jma2lsbC9jb3JlLmMKQEAgLTUzOCwyNyArNDQ1LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglLVk0gbWVtb3J5IGFsaWFzZXMgc3VwcG9ydAotV2hlbjoJSnVseSAyMDEwCi1XaHk6CU1lbW9yeSBhbGlhc2luZyBzdXBwb3J0IGlzIHVzZWQgZm9yIHNwZWVkaW5nIHVwIGd1ZXN0IHZnYSBhY2Nlc3MKLQl0aHJvdWdoIHRoZSB2Z2Egd2luZG93cy4KLQotCU1vZGVybiB1c2Vyc3BhY2Ugbm8gbG9uZ2VyIHVzZXMgdGhpcyBmZWF0dXJlLCBzbyBpdCdzIGp1c3QgYml0cm90dGVkCi0JY29kZSBhbmQgY2FuIGJlIHJlbW92ZWQgd2l0aCBubyBpbXBhY3QuCi1XaG86CUF2aSBLaXZpdHkgPGF2aUByZWRoYXQuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoYXQ6CUtWTSBrZXJuZWwtYWxsb2NhdGVkIG1lbW9yeSBzbG90cwotV2hlbjoJSnVseSAyMDEwCi1XaHk6CVNpbmNlIDIuNi4yNSwga3ZtIHN1cHBvcnRzIHVzZXItYWxsb2NhdGVkIG1lbW9yeSBzbG90cywgd2hpY2ggYXJlCi0JbXVjaCBtb3JlIGZsZXhpYmxlIHRoYW4ga2VybmVsLWFsbG9jYXRlZCBzbG90cy4gIEFsbCBjdXJyZW50IHVzZXJzcGFjZQotCXN1cHBvcnRzIHRoZSBuZXdlciBpbnRlcmZhY2UgYW5kIHRoaXMgY29kZSBjYW4gYmUgcmVtb3ZlZCB3aXRoIG5vCi0JaW1wYWN0LgotV2hvOglBdmkgS2l2aXR5IDxhdmlAcmVkaGF0LmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglLVk0gcGFyYXZpcnQgbW11IGhvc3Qgc3VwcG9ydAogV2hlbjoJSmFudWFyeSAyMDExCiBXaHk6CVRoZSBwYXJhdmlydCBtbXUgaG9zdCBzdXBwb3J0IGlzIHNsb3dlciB0aGFuIG5vbi1wYXJhdmlydCBtbXUsIGJvdGgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvOXAudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy85cC50eHQKaW5kZXggYzAyMzZlNy4uZjk3NjVlOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy85cC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy85cC50eHQKQEAgLTEyOCw3ICsxMjgsNyBAQAogUkVTT1VSQ0VTCiA9PT09PT09PT0KIAotT3VyIGN1cnJlbnQgcmVjb21tZW5kYXRpb24gaXMgdG8gdXNlIEluZmVybm8gKGh0dHA6Ly93d3cudml0YW51b3ZhLmNvbS9pbmZlcm5vKQorT3VyIGN1cnJlbnQgcmVjb21tZW5kYXRpb24gaXMgdG8gdXNlIEluZmVybm8gKGh0dHA6Ly93d3cudml0YW51b3ZhLmNvbS9uZmVybm8vaW5kZXguaHRtbCkKIGFzIHRoZSA5cCBzZXJ2ZXIuICBZb3UgY2FuIHN0YXJ0IGEgOXAgc2VydmVyIHVuZGVyIEluZmVybm8gYnkgaXNzdWluZyB0aGUKIGZvbGxvd2luZyBjb21tYW5kOgogICAgOyBzdHl4bGlzdGVuIC1BIHRjcCEqITU2NCBleHBvcnQgJyNVKicKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2FmZnMudHh0CmluZGV4IDJkMTUyNDQ2Li44MWFjNDg4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2FmZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZmcy50eHQKQEAgLTIxNiw0ICsyMTYsNCBAQAogCiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYW4gQW1pZ2EgRW11bGF0b3IgZm9yIExpbnV4LCBsb29rIGF0CiAKLWh0dHA6Ly93d3cuZnJlaWJ1cmcubGludXguZGUvfnVhZS8KK2h0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy5mcmVpYnVyZy5saW51eC5kZS9+dWFlLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9iZWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYmVmcy50eHQKaW5kZXggNjczOTFhMS4uNmU0OWMzNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9iZWZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2JlZnMudHh0CkBAIC0zMSw3ICszMSw3IEBACiAKIFdIQVQgSVMgVEhJUyBEUklWRVI/CiA9PT09PT09PT09PT09PT09PT0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIG5hdGl2ZSBmaWxlc3lzdGVtIG9mIEJlT1MgPGh0dHA6Ly93d3cuYmUuY29tLz4KK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIG5hdGl2ZSBmaWxlc3lzdGVtIG9mIEJlT1MgaHR0cDovL3d3dy5iZWluY29ycG9yYXRlZC5jb20vIAogZm9yIHRoZSBsaW51eCAyLjQuMSBhbmQgbGF0ZXIga2VybmVscy4gQ3VycmVudGx5IGl0IGlzIGEgcmVhZC1vbmx5CiBpbXBsZW1lbnRhdGlvbi4KIApAQCAtNjEsNyArNjEsNyBAQAogCiBUaGUgbGludXgga2VybmVsIGhhcyBtYW55IGNvbXBpbGUtdGltZSBvcHRpb25zLiBNb3N0IG9mIHRoZW0gYXJlIGJleW9uZCB0aGUKIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuIEkgc3VnZ2VzdCB0aGUgS2VybmVsLUhPV1RPIGRvY3VtZW50IGFzIGEgZ29vZCBnZW5lcmFsCi1yZWZlcmVuY2Ugb24gdGhpcyB0b3BpYy4gPGh0dHA6Ly93d3cubGludXguY29tL2hvd3RvL0tlcm5lbC1IT1dUTy5odG1sPgorcmVmZXJlbmNlIG9uIHRoaXMgdG9waWMuIGh0dHA6Ly93d3cubGludXhkb2NzLm9yZy9IT1dUT3MvS2VybmVsLUhPV1RPLTQuaHRtbCAKIAogSG93ZXZlciwgdG8gdXNlIHRoZSBCZUZTIG1vZHVsZSwgeW91IG11c3QgZW5hYmxlIGl0IGF0IGNvbmZpZ3VyZSB0aW1lLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lzb2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMudHh0CmluZGV4IDNjMzY3YzMuLmJhMGE5MzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMudHh0CkBAIC00MSw3ICs0MSw3IEBACiAgIHNic2VjdG9yPXh4eCAgU2Vzc2lvbiBiZWdpbnMgZnJvbSBzZWN0b3IgeHh4CiAKIFJlY29tbWVuZGVkIGRvY3VtZW50cyBhYm91dCBJU08gOTY2MCBzdGFuZGFyZCBhcmUgbG9jYXRlZCBhdDoKLWh0dHA6Ly93d3cueS1hZGFnaW8uY29tL3B1YmxpYy9zdGFuZGFyZHMvaXNvX2Nkcm9tci90b2NvbnQuaHRtCitodHRwOi8vd3d3LnktYWRhZ2lvLmNvbS8KIGZ0cDovL2Z0cC5lY21hLmNoL2VjbWEtc3QvRWNtYS0xMTkucGRmCiBRdW90aW5nIGZyb20gdGhlIFBERiAiVGhpcyAybmQgRWRpdGlvbiBvZiBTdGFuZGFyZCBFQ01BLTExOSBpcyB0ZWNobmljYWxseSAKIGlkZW50aWNhbCB3aXRoIElTTyA5NjYwLiIsIHNvIGl0IGlzIGEgdmFsaWQgYW5kIGdyYXRpcyBzdWJzdGl0dXRlIG9mIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzcm9vdC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy9uZnNyb290LnR4dAppbmRleCAzYmEwYjk0Li5mMjQzMGE3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy9uZnNyb290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy9uZnNyb290LnR4dApAQCAtMTI0LDYgKzEyNCw4IEBACiAKICAgPGhvc3RuYW1lPglOYW1lIG9mIHRoZSBjbGllbnQuIE1heSBiZSBzdXBwbGllZCBieSBhdXRvY29uZmlndXJhdGlvbiwKICAgCQlidXQgaXRzIGFic2VuY2Ugd2lsbCBub3QgdHJpZ2dlciBhdXRvY29uZmlndXJhdGlvbi4KKwkJSWYgc3BlY2lmaWVkIGFuZCBESENQIGlzIHVzZWQsIHRoZSB1c2VyIHByb3ZpZGVkIGhvc3RuYW1lIHdpbGwKKwkJYmUgY2FycmllZCBpbiB0aGUgREhDUCByZXF1ZXN0IHRvIGhvcGVmdWxseSB1cGRhdGUgRE5TIHJlY29yZC4KIAogICAJCURlZmF1bHQ6IENsaWVudCBJUCBhZGRyZXNzIGlzIHVzZWQgaW4gQVNDSUkgbm90YXRpb24uCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDlmYjZjYmUuLjhmZTg4OTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtNzMsOSArNzMsOSBAQAogZG9jdW1lbnQuCiAKIFRoZSAgIGxhdGVzdCAgIHZlcnNpb24gICAgb2YgICB0aGlzICAgZG9jdW1lbnQgICBpcyAgICBhdmFpbGFibGUgICBvbmxpbmUgICBhdAotaHR0cDovL3NrYXJvLm5pZ2h0Y3Jhd2xlci5jb20vfmJiL0RvY3MvUHJvYyBhcyBIVE1MIHZlcnNpb24uCitodHRwOi8vdGxkcC5vcmcvTERQL0xpbnV4LUZpbGVzeXN0ZW0tSGllcmFyY2h5L2h0bWwvcHJvYy5odG1sCiAKLUlmICB0aGUgYWJvdmUgIGRpcmVjdGlvbiBkb2VzICBub3Qgd29ya3MgIGZvciB5b3UsICB5cHUgY291bGQgIHRyeSB0aGUgIGtlcm5lbAorSWYgIHRoZSBhYm92ZSAgZGlyZWN0aW9uIGRvZXMgIG5vdCB3b3JrcyAgZm9yIHlvdSwgIHlvdSBjb3VsZCAgdHJ5IHRoZSAga2VybmVsCiBtYWlsaW5nICBsaXN0ICBhdCAgbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZyAgYW5kL29yIHRyeSAgdG8gIHJlYWNoICBtZSAgYXQKIGNvbWFuZGFudGVAemFyYWxpbnV4LmNvbS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy1wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy1wY2kudHh0CmluZGV4IDg1MzU0YjMuLjc0ZWFhYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMtcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLXBjaS50eHQKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICBsb2NhbF9jcHVzCSAgIG5lYXJieSBDUFUgbWFzayAoY3B1bWFzaywgcm8pCiAgICAgICAgcmVtb3ZlCQkgICByZW1vdmUgZGV2aWNlIGZyb20ga2VybmVsJ3MgbGlzdCAoYXNjaWksIHdvKQogICAgICAgIHJlc291cmNlCQkgICBQQ0kgcmVzb3VyY2UgaG9zdCBhZGRyZXNzZXMgKGFzY2lpLCBybykKLSAgICAgICByZXNvdXJjZTAuLk4JICAgUENJIHJlc291cmNlIE4sIGlmIHByZXNlbnQgKGJpbmFyeSwgbW1hcCkKKyAgICAgICByZXNvdXJjZTAuLk4JICAgUENJIHJlc291cmNlIE4sIGlmIHByZXNlbnQgKGJpbmFyeSwgbW1hcCwgcndbMV0pCiAgICAgICAgcmVzb3VyY2UwX3djLi5OX3djICBQQ0kgV0MgbWFwIHJlc291cmNlIE4sIGlmIHByZWZldGNoYWJsZSAoYmluYXJ5LCBtbWFwKQogICAgICAgIHJvbQkJICAgUENJIFJPTSByZXNvdXJjZSwgaWYgcHJlc2VudCAoYmluYXJ5LCBybykKICAgICAgICBzdWJzeXN0ZW1fZGV2aWNlCSAgIFBDSSBzdWJzeXN0ZW0gZGV2aWNlIChhc2NpaSwgcm8pCkBAIC01NCwxMyArNTQsMTYgQEAKICAgYmluYXJ5IC0gZmlsZSBjb250YWlucyBiaW5hcnkgZGF0YQogICBjcHVtYXNrIC0gZmlsZSBjb250YWlucyBhIGNwdW1hc2sgdHlwZQogCitbMV0gcncgZm9yIFJFU09VUkNFX0lPIChJL08gcG9ydCkgcmVnaW9ucyBvbmx5CisKIFRoZSByZWFkIG9ubHkgZmlsZXMgYXJlIGluZm9ybWF0aW9uYWwsIHdyaXRlcyB0byB0aGVtIHdpbGwgYmUgaWdub3JlZCwgd2l0aAogdGhlIGV4Y2VwdGlvbiBvZiB0aGUgJ3JvbScgZmlsZS4gIFdyaXRhYmxlIGZpbGVzIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KIGFjdGlvbnMgb24gdGhlIGRldmljZSAoZS5nLiBjaGFuZ2luZyBjb25maWcgc3BhY2UsIGRldGFjaGluZyBhIGRldmljZSkuCiBtbWFwYWJsZSBmaWxlcyBhcmUgYXZhaWxhYmxlIHZpYSBhbiBtbWFwIG9mIHRoZSBmaWxlIGF0IG9mZnNldCAwIGFuZCBjYW4gYmUKIHVzZWQgdG8gZG8gYWN0dWFsIGRldmljZSBwcm9ncmFtbWluZyBmcm9tIHVzZXJzcGFjZS4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcwogZG9uJ3Qgc3VwcG9ydCBtbWFwcGluZyBvZiBjZXJ0YWluIHJlc291cmNlcywgc28gYmUgc3VyZSB0byBjaGVjayB0aGUgcmV0dXJuCi12YWx1ZSBmcm9tIGFueSBhdHRlbXB0ZWQgbW1hcC4KK3ZhbHVlIGZyb20gYW55IGF0dGVtcHRlZCBtbWFwLiAgVGhlIG1vc3Qgbm90YWJsZSBvZiB0aGVzZSBhcmUgSS9PIHBvcnQKK3Jlc291cmNlcywgd2hpY2ggYWxzbyBwcm92aWRlIHJlYWQvd3JpdGUgYWNjZXNzLgogCiBUaGUgJ2VuYWJsZScgZmlsZSBwcm92aWRlcyBhIGNvdW50ZXIgdGhhdCBpbmRpY2F0ZXMgaG93IG1hbnkgdGltZXMgdGhlIGRldmljZSAKIGhhcyBiZWVuIGVuYWJsZWQuICBJZiB0aGUgJ2VuYWJsZScgZmlsZSBjdXJyZW50bHkgcmV0dXJucyAnNCcsIGFuZCBhICcxJyBpcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLnR4dAppbmRleCA5MzFjODA2Li41ZDEzMzVmYWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0CkBAIC00LDcgKzQsNyBAQAogUGF0cmljayBNb2NoZWwJPG1vY2hlbEBvc2RsLm9yZz4KIE1pa2UgTXVycGh5IDxtYW11cnBoQGNzLmNsZW1zb24uZWR1PgogCi1SZXZpc2VkOiAgICAyMiBGZWJydWFyeSAyMDA5CitSZXZpc2VkOiAgICAxNSBKdWx5IDIwMTAKIE9yaWdpbmFsOiAgIDEwIEphbnVhcnkgMjAwMwogCiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiBzdHJ1Y3Qgc3lzZnNfb3BzIHsKICAgICAgICAgc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICosIHN0cnVjdCBhdHRyaWJ1dGUgKiwgY2hhciAqKTsKLSAgICAgICAgc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qga29iamVjdCAqLCBzdHJ1Y3QgYXR0cmlidXRlICosIGNvbnN0IGNoYXIgKik7CisgICAgICAgIHNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGtvYmplY3QgKiwgc3RydWN0IGF0dHJpYnV0ZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiB9OwogCiBbIFN1YnN5c3RlbXMgc2hvdWxkIGhhdmUgYWxyZWFkeSBkZWZpbmVkIGEgc3RydWN0IGtvYmpfdHlwZSBhcyBhCkBAIC0xMzksMTggKzEzOSwyMiBAQAogCiBUbyBpbGx1c3RyYXRlOgogCisjZGVmaW5lIHRvX2RldihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCiAjZGVmaW5lIHRvX2Rldl9hdHRyKF9hdHRyKSBjb250YWluZXJfb2YoX2F0dHIsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlLCBhdHRyKQotI2RlZmluZSB0b19kZXYoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBkZXZpY2UsIGtvYmopCiAKLXN0YXRpYyBzc2l6ZV90Ci1kZXZfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBidWYpCitzdGF0aWMgc3NpemVfdCBkZXZfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWYpCiB7Ci0gICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogZGV2X2F0dHIgPSB0b19kZXZfYXR0cihhdHRyKTsKLSAgICAgICAgc3RydWN0IGRldmljZSAqIGRldiA9IHRvX2Rldihrb2JqKTsKLSAgICAgICAgc3NpemVfdCByZXQgPSAwOworICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIgPSB0b19kZXZfYXR0cihhdHRyKTsKKyAgICAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmopOworICAgICAgICBzc2l6ZV90IHJldCA9IC1FSU87CiAKICAgICAgICAgaWYgKGRldl9hdHRyLT5zaG93KQotICAgICAgICAgICAgICAgIHJldCA9IGRldl9hdHRyLT5zaG93KGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICByZXQgPSBkZXZfYXR0ci0+c2hvdyhkZXYsIGRldl9hdHRyLCBidWYpOworICAgICAgICBpZiAocmV0ID49IChzc2l6ZV90KVBBR0VfU0laRSkgeworICAgICAgICAgICAgICAgIHByaW50X3N5bWJvbCgiZGV2X2F0dHJfc2hvdzogJXMgcmV0dXJuZWQgYmFkIGNvdW50XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylkZXZfYXR0ci0+c2hvdyk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTYzLDEwICsxNjcsOSBAQAogc3BlY2lmaWVkIHdoZW4gZGVjbGFyaW5nIHRoZSBhdHRyaWJ1dGUuIFRoZSBtZXRob2QgdHlwZXMgc2hvdWxkIGJlIGFzCiBzaW1wbGUgYXMgdGhvc2UgZGVmaW5lZCBmb3IgZGV2aWNlIGF0dHJpYnV0ZXM6CiAKLXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqIGF0dHIsCi0gICAgICAgICAgICAgICAgY2hhciAqIGJ1Zik7Ci1zc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogYXR0ciwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1Zik7Citzc2l6ZV90ICgqc2hvdykoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKK3NzaXplX3QgKCpzdG9yZSkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogCiBJT1csIHRoZXkgc2hvdWxkIHRha2Ugb25seSBhbiBvYmplY3QsIGFuIGF0dHJpYnV0ZSwgYW5kIGEgYnVmZmVyIGFzIHBhcmFtZXRlcnMuCiAKQEAgLTIwOSw4ICsyMTIsOCBAQAogCiAtIHNob3coKSBzaG91bGQgYWx3YXlzIHVzZSBzbnByaW50ZigpLiAKIAotLSBzdG9yZSgpIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGZyb20gdGhlIGJ1ZmZlci4gVGhpcwotICBjYW4gYmUgZG9uZSB1c2luZyBzdHJsZW4oKS4KKy0gc3RvcmUoKSBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBmcm9tIHRoZSBidWZmZXIuIElmIHRoZQorICBlbnRpcmUgYnVmZmVyIGhhcyBiZWVuIHVzZWQsIGp1c3QgcmV0dXJuIHRoZSBjb3VudCBhcmd1bWVudC4KIAogLSBzaG93KCkgb3Igc3RvcmUoKSBjYW4gYWx3YXlzIHJldHVybiBlcnJvcnMuIElmIGEgYmFkIHZhbHVlIGNvbWVzCiAgIHRocm91Z2gsIGJlIHN1cmUgdG8gcmV0dXJuIGFuIGVycm9yLgpAQCAtMjIzLDE1ICsyMjYsMTggQEAKIAogQSB2ZXJ5IHNpbXBsZSAoYW5kIG5haXZlKSBpbXBsZW1lbnRhdGlvbiBvZiBhIGRldmljZSBhdHRyaWJ1dGUgaXM6CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRldi0+bmFtZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX25hbWUoc3RydWN0IGRldmljZSAqIGRldiwgY29uc3QgY2hhciAqIGJ1ZikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3NjYW5mKGJ1ZiwgIiUyMHMiLCBkZXYtPm5hbWUpOwotCXJldHVybiBzdHJubGVuKGJ1ZiwgUEFHRV9TSVpFKTsKKyAgICAgICAgc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSwgIiUuKnMiLAorICAgICAgICAgICAgICAgICAoaW50KW1pbihjb3VudCwgc2l6ZW9mKGRldi0+bmFtZSkgLSAxKSwgYnVmKTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIHN0b3JlX25hbWUpOwpAQCAtMzI3LDcgKzMzMyw3IEBACiBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSB7CiAgICAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgICAgICAgIGF0dHI7CiAgICAgICAgIHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYnVzX3R5cGUgKiwgY2hhciAqIGJ1Zik7Ci0gICAgICAgIHNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGJ1c190eXBlICosIGNvbnN0IGNoYXIgKiBidWYpOworICAgICAgICBzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBidXNfdHlwZSAqLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpOwogfTsKIAogRGVjbGFyaW5nOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZmF0LnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZhdC50eHQKaW5kZXggZWVkNTIwZi4uZWFkNzY0YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZmF0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ZmYXQudHh0CkBAIC0xNjUsNyArMTY1LDggQEAKIElmIHlvdSBwbGFuIHRvIG1ha2UgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHZmYXQgZmlsZXN5c3RlbSwgcGxlYXNlCiBnZXQgdGhlIHRlc3Qgc3VpdGUgdGhhdCBjb21lcyB3aXRoIHRoZSB2ZmF0IGRpc3RyaWJ1dGlvbiBhdAogCi0gIGh0dHA6Ly9ibXJjLmJlcmtlbGV5LmVkdS9wZW9wbGUvY2hhZmZlZS92ZmF0Lmh0bWwKKyAgaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vYm1yYy5iZXJrZWxleS5lZHUvCisgIHBlb3BsZS9jaGFmZmVlL3ZmYXQuaHRtbAogCiBUaGlzIHRlc3RzIHF1aXRlIGEgZmV3IHBhcnRzIG9mIHRoZSB2ZmF0IGZpbGVzeXN0ZW0gYW5kIGFkZGl0aW9uYWwKIHRlc3RzIGZvciBuZXcgZmVhdHVyZXMgb3IgdW50ZXN0ZWQgZmVhdHVyZXMgd291bGQgYmUgYXBwcmVjaWF0ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQKaW5kZXggOTg3OGY1MC4uN2JmZjNlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy94ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dApAQCAtMTMxLDE3ICsxMzEsNiBAQAogCURvbid0IGNoZWNrIGZvciBkb3VibGUgbW91bnRlZCBmaWxlIHN5c3RlbXMgdXNpbmcgdGhlIGZpbGUgc3lzdGVtIHV1aWQuCiAJVGhpcyBpcyB1c2VmdWwgdG8gbW91bnQgTFZNIHNuYXBzaG90IHZvbHVtZXMuCiAKLSAgb3N5bmNpc29zeW5jCi0JTWFrZSBPX1NZTkMgd3JpdGVzIGltcGxlbWVudCB0cnVlIE9fU1lOQy4gIFdJVEhPVVQgdGhpcyBvcHRpb24sCi0JTGludXggWEZTIGJlaGF2ZXMgYXMgaWYgYW4gIm9zeW5jaXNkc3luYyIgb3B0aW9uIGlzIHVzZWQsCi0Jd2hpY2ggd2lsbCBtYWtlIHdyaXRlcyB0byBmaWxlcyBvcGVuZWQgd2l0aCB0aGUgT19TWU5DIGZsYWcgc2V0Ci0JYmVoYXZlIGFzIGlmIHRoZSBPX0RTWU5DIGZsYWcgaGFkIGJlZW4gdXNlZCBpbnN0ZWFkLgotCVRoaXMgY2FuIHJlc3VsdCBpbiBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aG91dCBjb21wcm9taXNpbmcKLQlkYXRhIHNhZmV0eS4KLQlIb3dldmVyIGlmIHRoaXMgb3B0aW9uIGlzIG5vdCBpbiBlZmZlY3QsIHRpbWVzdGFtcCB1cGRhdGVzIGZyb20KLQlPX1NZTkMgd3JpdGVzIGNhbiBiZSBsb3N0IGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcy4KLQlJZiB0aW1lc3RhbXAgdXBkYXRlcyBhcmUgY3JpdGljYWwsIHVzZSB0aGUgb3N5bmNpc29zeW5jIG9wdGlvbi4KLQogICB1cXVvdGEvdXNycXVvdGEvdXFub2VuZm9yY2UvcXVvdGEKIAlVc2VyIGRpc2sgcXVvdGEgYWNjb3VudGluZyBlbmFibGVkLCBhbmQgbGltaXRzIChvcHRpb25hbGx5KQogCWVuZm9yY2VkLiAgUmVmZXIgdG8geGZzX3F1b3RhKDgpIGZvciBmdXJ0aGVyIGRldGFpbHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlX2NsYXNzL2hvdHBsdWctc2NyaXB0IGIvRG9jdW1lbnRhdGlvbi9maXJtd2FyZV9jbGFzcy9ob3RwbHVnLXNjcmlwdAppbmRleCAxOTkwMTMwLi44MTQzYTk1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlX2NsYXNzL2hvdHBsdWctc2NyaXB0CisrKyBiL0RvY3VtZW50YXRpb24vZmlybXdhcmVfY2xhc3MvaG90cGx1Zy1zY3JpcHQKQEAgLTYsMTEgKzYsMTIgQEAKIAogSE9UUExVR19GV19ESVI9L3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS8KIAotZWNobyAxID4gL3N5cy8kREVWUEFUSC9sb2FkaW5nCi1jYXQgJEhPVFBMVUdfRldfRElSLyRGSVJNV0FSRSA+IC9zeXMvJERFVlBBVEgvZGF0YQotZWNobyAwID4gL3N5cy8kREVWUEFUSC9sb2FkaW5nCi0KLSMgVG8gY2FuY2VsIHRoZSBsb2FkIGluIGNhc2Ugb2YgZXJyb3I6Ci0jCi0jCWVjaG8gLTEgPiAvc3lzLyRERVZQQVRIL2xvYWRpbmcKLSMKK2lmIFsgIiRTVUJTWVNURU0iID09ICJmaXJtd2FyZSIgLWEgIiRBQ1RJT04iID09ICJhZGQiIF07IHRoZW4KKyAgaWYgWyAtZiAkSE9UUExVR19GV19ESVIvJEZJUk1XQVJFIF07IHRoZW4KKyAgICBlY2hvIDEgPiAvc3lzLyRERVZQQVRIL2xvYWRpbmcKKyAgICBjYXQgJEhPVFBMVUdfRldfRElSLyRGSVJNV0FSRSA+IC9zeXMvJERFVlBBVEgvZGF0YQorICAgIGVjaG8gMCA+IC9zeXMvJERFVlBBVEgvbG9hZGluZworICBlbHNlCisgICAgZWNobyAtMSA+IC9zeXMvJERFVlBBVEgvbG9hZGluZworICBmaQorZmkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNiBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNgppbmRleCBmNDMyN2RiLi5kOGZhYmUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI2CkBAIC02LDcgKzYsNyBAQAogICAgIFByZWZpeDogJ2FkbTEwMjYnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDJjLCAweDJkLCAweDJlCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIEFuYWxvZyBEZXZpY2VzIHdlYnNpdGUKLSAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYW5hbG9nLmNvbS9lbi9wcm9kLzAsLDc2Nl84MjVfQURNMTAyNiwwMC5odG1sCisgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm9uc2VtaS5jb20vUG93ZXJTb2x1dGlvbnMvcHJvZHVjdC5kbz9pZD1BRE0xMDI2CiAKIEF1dGhvcnM6CiAgICAgICAgIFBoaWxpcCBQb2tvcm55IDxwcG9rb3JueUBwZW5ndWluY29tcHV0aW5nLmNvbT4gZm9yIFBlbmd1aW4gQ29tcHV0aW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2c3NjBhIGIvRG9jdW1lbnRhdGlvbi9od21vbi9nNzYwYQppbmRleCBlMDMyZWViLi5jZmM4OTQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2c3NjBhCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZzc2MGEKQEAgLTUsNyArNSw3IEBACiAgICogR2xvYmFsIE1peGVkLW1vZGUgVGVjaG5vbG9neSBJbmMuIEc3NjBBCiAgICAgUHJlZml4OiAnZzc2MGEnCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIEdNVCB3ZWJzaXRlCi0gICAgICBodHRwOi8vd3d3LmdtdC5jb20udHcvZGF0YXNoZWV0L2c3NjBhLnBkZgorICAgICAgaHR0cDovL3d3dy5nbXQuY29tLnR3L3Byb2R1Y3QvZGF0YXNoZWV0L0VEUy03NjBBLnBkZgogCiBBdXRob3I6IEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2dsNTE4c20gYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2dsNTE4c20KaW5kZXggMjI5ZjhiNy4uMjZmOWYzYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9nbDUxOHNtCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZ2w1MThzbQpAQCAtNSwxMSArNSwxMCBAQAogICAqIEdlbmVzeXMgTG9naWMgR0w1MThTTSByZWxlYXNlIDB4MDAKICAgICBQcmVmaXg6ICdnbDUxOHNtJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyYyBhbmQgMHgyZAotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5nZW5lc3lzbG9naWMuY29tL3BkZgogICAqIEdlbmVzeXMgTG9naWMgR0w1MThTTSByZWxlYXNlIDB4ODAKICAgICBQcmVmaXg6ICdnbDUxOHNtJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyYyBhbmQgMHgyZAotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5nZW5lc3lzbG9naWMuY29tL3BkZgorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5nZW5lc3lzbG9naWMuY29tLwogCiBBdXRob3JzOgogICAgICAgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9ocGZhbGwuYyBiL0RvY3VtZW50YXRpb24vaHdtb24vaHBmYWxsLmMKaW5kZXggNjgxZWMyMi4uYTRhOGZjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9ocGZhbGwuYworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2hwZmFsbC5jCkBAIC0xLDcgKzEsNyBAQAogLyogRGlzayBwcm90ZWN0aW9uIGZvciBIUCBtYWNoaW5lcy4KICAqCiAgKiBDb3B5cmlnaHQgMjAwOCBFcmljIFBpZWwKLSAqIENvcHlyaWdodCAyMDA5IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqIENvcHlyaWdodCAyMDA5IFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgogICoKICAqIEdQTHYyLgogICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2s4dGVtcCBiL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wCmluZGV4IDAwMDVjNzEuLjcxNmRjMjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wCkBAIC01LDcgKzUsNyBAQAogICAqIEFNRCBBdGhsb242NC9GWCBvciBPcHRlcm9uIENQVXMKICAgICBQcmVmaXg6ICdrOHRlbXAnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IFBDSSBzcGFjZQotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5hbWQuY29tL3VzLWVuL2Fzc2V0cy9jb250ZW50X3R5cGUvd2hpdGVfcGFwZXJzX2FuZF90ZWNoX2RvY3MvMzI1NTkucGRmCisgICAgRGF0YXNoZWV0OiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy8zMjU1OS5wZGYKIAogQXV0aG9yOiBSdWRvbGYgTWFyZWsKIENvbnRhY3Q6IFJ1ZG9sZiBNYXJlayA8ci5tYXJla0Bhc3NlbWJsZXIuY3o+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKaW5kZXggYTc2YWVmZS4uYjk4ZTBlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04NQpAQCAtOSwxNSArOSwxNSBAQAogICAqIEFuYWxvZyBEZXZpY2VzIEFETTEwMjcKICAgICBQcmVmaXg6ICdhZG0xMDI3JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyYywgMHgyZCwgMHgyZQotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5hbmFsb2cuY29tL2VuL3Byb2QvMCwsNzY2XzgyNV9BRE0xMDI3LDAwLmh0bWwKKyAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cub25zZW1pLmNvbS9Qb3dlclNvbHV0aW9ucy9wcm9kdWN0LmRvP2lkPUFETTEwMjcKICAgKiBBbmFsb2cgRGV2aWNlcyBBRFQ3NDYzCiAgICAgUHJlZml4OiAnYWR0NzQ2MycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMsIDB4MmQsIDB4MmUKLSAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cuYW5hbG9nLmNvbS9lbi9wcm9kLzAsLDc2Nl84MjVfQURUNzQ2MywwMC5odG1sCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3Lm9uc2VtaS5jb20vUG93ZXJTb2x1dGlvbnMvcHJvZHVjdC5kbz9pZD1BRFQ3NDYzCiAgICogU01TQyBFTUM2RDEwMCwgU01TQyBFTUM2RDEwMQogICAgIFByZWZpeDogJ2VtYzZkMTAwJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyYywgMHgyZCwgMHgyZQotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL3Rvb2xzL2Rpc2NvbnRpbnVlZC82ZDEwMC5wZGYKKyAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cuc21zYy5jb20vbWVkaWEvRG93bmxvYWRzX1B1YmxpYy9kaXNjb250aW51ZWQvNmQxMDAucGRmIAogICAqIFNNU0MgRU1DNkQxMDIKICAgICBQcmVmaXg6ICdlbWM2ZDEwMicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMsIDB4MmQsIDB4MmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vcGtndGVtcCBiL0RvY3VtZW50YXRpb24vaHdtb24vcGtndGVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUxZmIwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9wa2d0ZW1wCkBAIC0wLDAgKzEsMzYgQEAKK0tlcm5lbCBkcml2ZXIgcGtndGVtcAorPT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogSW50ZWwgZmFtaWx5CisgICAgUHJlZml4OiAncGtndGVtcCcKKyAgICBDUFVJRDoKKyAgICBEYXRhc2hlZXQ6IEludGVsIDY0IGFuZCBJQS0zMiBBcmNoaXRlY3R1cmVzIFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbAorICAgICAgICAgICAgICAgVm9sdW1lIDNBOiBTeXN0ZW0gUHJvZ3JhbW1pbmcgR3VpZGUKKworQXV0aG9yOiBGZW5naHVhIFl1CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBwZXJtaXRzIHJlYWRpbmcgcGFja2FnZSBsZXZlbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZW1iZWRkZWQgaW5zaWRlCitJbnRlbCBDUFUgcGFja2FnZS4gVGhlIHNlbnNvcnMgY2FuIGJlIGluIGNvcmUsIHVuY29yZSwgbWVtb3J5IGNvbnRyb2xsZXIsIG9yCitvdGhlciBjb21wb25lbnRzIGluIGEgcGFja2FnZS4gVGhlIGZlYXR1cmUgaXMgZmlyc3QgaW1wbGVtZW50ZWQgaW4gSW50ZWwgU2FuZHkKK0JyaWRnZSBwbGF0Zm9ybS4KKworVGVtcGVyYXR1cmUgaXMgbWVhc3VyZWQgaW4gZGVncmVlcyBDZWxzaXVzIGFuZCBtZWFzdXJlbWVudCByZXNvbHV0aW9uIGlzCisxIGRlZ3JlZSBDLiBWYWxpZCB0ZW1wZXJhdHVyZXMgYXJlIGZyb20gMCB0byBUak1heCBkZWdyZWVzIEMsIGJlY2F1c2UgdGhlIGFjdHVhbAordmFsdWUgb2YgdGVtcGVyYXR1cmUgcmVnaXN0ZXIgaXMgaW4gZmFjdCBhIGRlbHRhIGZyb20gVGpNYXguCisKK1RlbXBlcmF0dXJlIGtub3duIGFzIFRqTWF4IGlzIHRoZSBtYXhpbXVtIGp1bmN0aW9uIHRlbXBlcmF0dXJlIG9mIHBhY2thZ2UuCitXZSBnZXQgdGhpcyBmcm9tIE1TUl9JQTMyX1RFTVBFUkFUVVJFX1RBUkdFVC4gSWYgdGhlIE1TUiBpcyBub3QgYWNjZXNzaWJsZSwKK3dlIGRlZmluZSBUak1heCBhcyAxMDAgZGVncmVlcyBDZWxzaXVzLiBBdCB0aGlzIHRlbXBlcmF0dXJlLCBwcm90ZWN0aW9uCittZWNoYW5pc20gd2lsbCBwZXJmb3JtIGFjdGlvbnMgdG8gZm9yY2libHkgY29vbCBkb3duIHRoZSBwYWNrYWdlLiBBbGFybQorbWF5IGJlIHJhaXNlZCwgaWYgdGhlIHRlbXBlcmF0dXJlIGdyb3dzIGVub3VnaCAobW9yZSB0aGFuIFRqTWF4KSB0byB0cmlnZ2VyCit0aGUgT3V0LU9mLVNwZWMgYml0LiBGb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgZXhwb3J0ZWQgc3lzZnMgZmlsZXM6CisKK3RlbXAxX2lucHV0CSAgLSBQYWNrYWdlIHRlbXBlcmF0dXJlIChpbiBtaWxsaWRlZ3JlZXMgQ2Vsc2l1cykuCit0ZW1wMV9tYXggICAgICAgIC0gQWxsIGNvb2xpbmcgZGV2aWNlcyBzaG91bGQgYmUgdHVybmVkIG9uLgordGVtcDFfY3JpdAkgIC0gTWF4aW11bSBqdW5jdGlvbiB0ZW1wZXJhdHVyZSAoaW4gbWlsbGlkZWdyZWVzIENlbHNpdXMpLgordGVtcDFfY3JpdF9hbGFybSAtIFNldCB3aGVuIE91dC1vZi1zcGVjIGJpdCBpcyBzZXQsIG5ldmVyIGNsZWFycy4KKwkJICAgIENvcnJlY3QgQ1BVIG9wZXJhdGlvbiBpcyBubyBsb25nZXIgZ3VhcmFudGVlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCmluZGV4IDQyYzg0MzEuLjJhMTMzNzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTEKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMQpAQCAtNywxMyArNywxMCBAQAogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCiAgICAgUHJlZml4OiAnc21zYzQ3bTEnCiAgICAgRGF0YXNoZWV0czoKLSAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvNDdiMjd4LnBkZgotICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vZGF0YXNoZWV0cy80N20xMHgucGRmCi0gICAgICAgIGh0dHA6Ly93d3cuc21zYy5jb20vbWFpbi9kYXRhc2hlZXRzLzQ3bTExMi5wZGYKLSAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL3Rvb2xzL2Rpc2NvbnRpbnVlZC80N20xM3gucGRmCi0gICAgICAgIGh0dHA6Ly93d3cuc21zYy5jb20vbWFpbi9kYXRhc2hlZXRzLzQ3bTE0eC5wZGYKLSAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL3Rvb2xzL2Rpc2NvbnRpbnVlZC80N20xNXgucGRmCi0gICAgICAgIGh0dHA6Ly93d3cuc21zYy5jb20vbWFpbi9kYXRhc2hlZXRzLzQ3bTE5Mi5wZGYKKyAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tZWRpYS9Eb3dubG9hZHNfUHVibGljL0RhdGFfU2hlZXRzLzQ3YjI3Mi5wZGYKKyAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tZWRpYS9Eb3dubG9hZHNfUHVibGljL0RhdGFfU2hlZXRzLzQ3bTEweC5wZGYKKyAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tZWRpYS9Eb3dubG9hZHNfUHVibGljL0RhdGFfU2hlZXRzLzQ3bTExMi5wZGYKKyAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS8KICAgKiBTTVNDIExQQzQ3TTI5MgogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCiAgICAgUHJlZml4OiAnc21zYzQ3bTInCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3RobWM1MCBiL0RvY3VtZW50YXRpb24vaHdtb24vdGhtYzUwCmluZGV4IDk2MzljYTkuLjhhNzc3MmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdGhtYzUwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdGhtYzUwCkBAIC05LDcgKzksNyBAQAogICAqIFRleGFzIEluc3RydW1lbnRzIFRITUM1MAogICAgIFByZWZpeDogJ3RobWM1MCcKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMgLSAweDJlCi0gICAgRGF0YXNoZWV0OiBodHRwOi8vZm9jdXMudGkuY29tL2RvY3MvcHJvZC9mb2xkZXJzL3ByaW50L3RobWM1MC5odG1sCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LnRpLmNvbS8gCiAKIEF1dGhvcjogS3J6eXN6dG9mIEhlbHQgPGtyenlzenRvZi5oMUB3cC5wbD4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi92aWE2ODZhIGIvRG9jdW1lbnRhdGlvbi9od21vbi92aWE2ODZhCmluZGV4IGQ2NTFiMjUuLmU1ZjkwYWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdmlhNjg2YQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3ZpYTY4NmEKQEAgLTUsNyArNSw3IEBACiAgICogVmlhIFZUODJDNjg2QSwgVlQ4MkM2ODZCICBTb3V0aGJyaWRnZSBJbnRlZ3JhdGVkIEhhcmR3YXJlIE1vbml0b3IKICAgICBQcmVmaXg6ICd2aWE2ODZhJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJU0EgaW4gUENJLXNwYWNlIGVuY29kZWQgYWRkcmVzcwotICAgIERhdGFzaGVldDogT24gcmVxdWVzdCB0aHJvdWdoIHdlYiBmb3JtIChodHRwOi8vd3d3LnZpYS5jb20udHcvZW4vc3VwcG9ydC9kYXRhc2hlZXRzLykKKyAgICBEYXRhc2hlZXQ6IE9uIHJlcXVlc3QgdGhyb3VnaCB3ZWIgZm9ybSAoaHR0cDovL3d3dy52aWEuY29tLnR3L2VuL3Jlc291cmNlcy9kb3dubG9hZC1jZW50ZXIvKQogCiBBdXRob3JzOgogICAgICAgICBLecO2c3RpIE3DpGxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2hmCmluZGV4IDQ0ZGQyYmMuLmZiMTQ1ZTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgpAQCAtNSwyMyArNSwxOSBAQAogICAqIFdpbmJvbmQgVzgzNjI3SEYgKElTQSBhY2Nlc3NlcyBPTkxZKQogICAgIFByZWZpeDogJ3c4MzYyN2hmJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJU0EgYWRkcmVzcyByZXRyaWV2ZWQgZnJvbSBTdXBlciBJL08gcmVnaXN0ZXJzCi0gICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQuY29tL1BERi9zaGVldC93ODM2MjdoZi5wZGYKICAgKiBXaW5ib25kIFc4MzYyN1RIRgogICAgIFByZWZpeDogJ3c4MzYyN3RoZicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSVNBIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gU3VwZXIgSS9PIHJlZ2lzdGVycwotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy53aW5ib25kLmNvbS9QREYvc2hlZXQvdzgzNjI3dGhmLnBkZgogICAqIFdpbmJvbmQgVzgzNjk3SEYKICAgICBQcmVmaXg6ICd3ODM2OTdoZicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSVNBIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gU3VwZXIgSS9PIHJlZ2lzdGVycwotICAgIERhdGFzaGVldDogaHR0cDovL3d3dy53aW5ib25kLmNvbS9QREYvc2hlZXQvNjk3aGYucGRmCiAgICogV2luYm9uZCBXODM2MzdIRgogICAgIFByZWZpeDogJ3c4MzYzN2hmJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJU0EgYWRkcmVzcyByZXRyaWV2ZWQgZnJvbSBTdXBlciBJL08gcmVnaXN0ZXJzCi0gICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQuY29tL1BERi9zaGVldC93ODM2MzdoZi5wZGYKICAgKiBXaW5ib25kIFc4MzY4N1RIRgogICAgIFByZWZpeDogJ3c4MzY4N3RoZicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSVNBIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gU3VwZXIgSS9PIHJlZ2lzdGVycwotICAgIERhdGFzaGVldDogUHJvdmlkZWQgYnkgV2luYm9uZCBvbiByZXF1ZXN0CisgICAgRGF0YXNoZWV0OiBQcm92aWRlZCBieSBXaW5ib25kIG9uIHJlcXVlc3QoaHR0cDovL3d3dy53aW5ib25kLmNvbS9ocS9lbnUpCiAKIEF1dGhvcnM6CiAgICAgICAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc4MWQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc4MWQKaW5kZXggYzkxZTBiNi4uZWNiYzFlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3ODFkCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzgxZApAQCAtOSw3ICs5LDcgQEAKICAgKiBXaW5ib25kIFc4Mzc4MkQKICAgICBQcmVmaXg6ICd3ODM3ODJkJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyOCAtIDB4MmYsIElTQSAweDI5MCAoOCBJL08gcG9ydHMpCi0gICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQuY29tL1BERi9zaGVldC93ODM3ODJkLnBkZgorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy53aW5ib25kLmNvbQogICAqIFdpbmJvbmQgVzgzNzgzUwogICAgIFByZWZpeDogJ3c4Mzc4M3MnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDJkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MmQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MmQKaW5kZXggMTRhNjY4ZS4uOGEwMjNjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3OTJkCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzkyZApAQCAtNSw3ICs1LDcgQEAKICAgKiBXaW5ib25kIFc4Mzc5MkQKICAgICBQcmVmaXg6ICd3ODM3OTJkJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyYyAtIDB4MmYKLSAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cud2luYm9uZC5jb20udHcvRS1XSU5CT05ESFRNL3BhcnRuZXIvUERGcmVzdWx0LmFzcD9QbmFtZT0xMDM1CisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQuY29tLnR3CiAKIEF1dGhvcjogQ2h1bmhhbyBIdWFuZwogQ29udGFjdDogRFpTaGVuIDxEWlNoZW5AV2luYm9uZC5jb20udHc+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUKaW5kZXggYWNiYzY1YS4uNWQ0NjM0MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1hbGkxNTM1CisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNQpAQCAtMyw3ICszLDcgQEAKIFN1cHBvcnRlZCBhZGFwdGVyczoKICAgKiBBY2VyIExhYnMsIEluYy4gQUxJIDE1MzUgKHNvdXRoIGJyaWRnZSkKICAgICBEYXRhc2hlZXQ6IE5vdyB1bmRlciBOREEKLQlodHRwOi8vd3d3LmFsaS5jb20udHcvZW5nL3N1cHBvcnQvZGF0YXNoZWV0X3JlcXVlc3QucGhwCisJaHR0cDovL3d3dy5hbGkuY29tLnR3LwogCiBBdXRob3JzOgogCUZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMKaW5kZXggNTQ2OTE2OS4uNDFiMWEwNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1hbGkxNTYzCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtYWxpMTU2MwpAQCAtMyw3ICszLDcgQEAKIFN1cHBvcnRlZCBhZGFwdGVyczoKICAgKiBBY2VyIExhYnMsIEluYy4gQUxJIDE1NjMgKHNvdXRoIGJyaWRnZSkKICAgICBEYXRhc2hlZXQ6IE5vdyB1bmRlciBOREEKLQlodHRwOi8vd3d3LmFsaS5jb20udHcvZW5nL3N1cHBvcnQvZGF0YXNoZWV0X3JlcXVlc3QucGhwCisJaHR0cDovL3d3dy5hbGkuY29tLnR3LwogCiBBdXRob3I6IFBhdHJpY2sgTW9jaGVsIDxtb2NoZWxAZGlnaXRhbGltcGxhbnQub3JnPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMKaW5kZXggNjAwZGE5MC4uNDI4ODhkOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1hbGkxNXgzCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtYWxpMTV4MwpAQCAtMyw3ICszLDcgQEAKIFN1cHBvcnRlZCBhZGFwdGVyczoKICAgKiBBY2VyIExhYnMsIEluYy4gQUxJIDE1MzMgYW5kIDE1NDNDIChzb3V0aCBicmlkZ2UpCiAgICAgRGF0YXNoZWV0OiBOb3cgdW5kZXIgTkRBCi0JaHR0cDovL3d3dy5hbGkuY29tLnR3L2VuZy9zdXBwb3J0L2RhdGFzaGVldF9yZXF1ZXN0LnBocAorCWh0dHA6Ly93d3cuYWxpLmNvbS50dy8KIAogQXV0aG9yczoKIAlGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NCBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGlpeDQKaW5kZXggYWM1NDBjNy4uNDc1YmI0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBpaXg0CkBAIC05Nyw0ICs5Nyw0IEBACiB0aGUgU01CdXMgb24gYWxsIElCTSBzeXN0ZW1zIChkZXRlY3RlZCB1c2luZyBETUkgZGF0YS4pCiAKIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCByZWFkOgotaHR0cDovL3d3dy5sbS1zZW5zb3JzLm9yZy9icm93c2VyL2xtLXNlbnNvcnMvdHJ1bmsvUkVBRE1FLnRoaW5rcGFkCitodHRwOi8vd3d3LmxtLXNlbnNvcnMub3JnL2Jyb3dzZXIvbG0tc2Vuc29ycy90cnVuay9SRUFETUUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtc2lzNjMwIGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1zaXM2MzAKaW5kZXggNjI5ZWEyYzMuLjBiOTY5NzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtc2lzNjMwCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtc2lzNjMwCkBAIC0yLDcgKzIsNyBAQAogCiBTdXBwb3J0ZWQgYWRhcHRlcnM6CiAgICogU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCAoU2lTKQotCTYzMCBjaGlwc2V0IChEYXRhc2hlZXQ6IGF2YWlsYWJsZSBhdCBodHRwOi8vYW1hbHlzaC5iZWkudC1vbmxpbmUuZGUvZG9jcy9TSVMvKQorCTYzMCBjaGlwc2V0IChEYXRhc2hlZXQ6IGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnNmci1mcmVzaC5jb20vbGludXgpCiAJNzMwIGNoaXBzZXQKICAgKiBQb3NzaWJsZSBvdGhlciBTaVMgY2hpcHNldHMgPwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lhNjQvYWxpYXNpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9pYTY0L2FsaWFzaW5nLnR4dAppbmRleCBhYTNlOTUzLi41YTRkZWE2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lhNjQvYWxpYXNpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaWE2NC9hbGlhc2luZy50eHQKQEAgLTE2OCw4ICsxNjgsNiBAQAogCiAgICAgbW1hcCBvZiAweDAtMHg5RkZGRiAvZGV2L21lbSBieSAiaHdpbmZvIiBvbiBIUCBzeDEwMDAgd2l0aCBWR0EgZW5hYmxlZAogCi0gICAgICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tL3Nob3dfYnVnLmNnaT9pZD0xNDA4NTguCi0KICAgICAgIFRoZSBFRkkgbWVtb3J5IG1hcCByZXBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKICAgICAgICAgMHgwMDAwMC0weDlGRkZGIFdCIG9ubHkKICAgICAgICAgMHhBMDAwMC0weEJGRkZGIFVDIG9ubHkgKFZHQSBmcmFtZSBidWZmZXIpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lhNjQvc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vaWE2NC9zZXJpYWwudHh0CmluZGV4IDA0MGI5NzcuLjY4NjljNzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaWE2NC9zZXJpYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaWE2NC9zZXJpYWwudHh0CkBAIC0xMzMsNyArMTMzLDcgQEAKIAogCiAKLVsxXSBodHRwOi8vd3d3LmRpZzY0Lm9yZy9zcGVjaWZpY2F0aW9ucy9ESUc2NF9QQ0RQdjIwLnBkZgorWzFdIGh0dHA6Ly93d3cuZGlnNjQub3JnL3NwZWNpZmljYXRpb25zL2FncmVlbWVudCAKICAgICBUaGUgdGFibGUgd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCBhcyB0aGUgIkhDRFAiIGZvciAiSGVhZGxlc3MKICAgICBDb25zb2xlL0RlYnVnIFBvcnQuIiAgVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyB0aGUgIlBDRFAiIGZvcgogICAgICJQcmltYXJ5IENvbnNvbGUgYW5kIERlYnVnIFBvcnQgRGV2aWNlcy4iCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQKaW5kZXggYWZlM2Y4ZC4uZTUwOTJkNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnR4dApAQCAtNSw3ICs1LDcgQEAKICAgZGVzY3JpYmVkIGluIGNoYXB0ZXIgMTEgb2YgdGhlIEluZmluaUJhbmQgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24uCiAKICAgVG8gdXNlIHRoZSB2ZXJicywgdGhlIGxpYmlidmVyYnMgbGlicmFyeSwgYXZhaWxhYmxlIGZyb20KLSAgPGh0dHA6Ly9vcGVuaWIub3JnLz4sIGlzIHJlcXVpcmVkLiAgbGliaWJ2ZXJicyBjb250YWlucyBhCisgIGh0dHA6Ly93d3cub3BlbmZhYnJpY3Mub3JnLywgaXMgcmVxdWlyZWQuICBsaWJpYnZlcmJzIGNvbnRhaW5zIGEKICAgZGV2aWNlLWluZGVwZW5kZW50IEFQSSBmb3IgdXNpbmcgdGhlIGliX3V2ZXJicyBpbnRlcmZhY2UuCiAgIGxpYmlidmVyYnMgYWxzbyByZXF1aXJlcyBhcHByb3ByaWF0ZSBkZXZpY2UtZGVwZW5kZW50IGtlcm5lbCBhbmQKICAgdXNlcnNwYWNlIGRyaXZlciBmb3IgeW91ciBJbmZpbmlCYW5kIGhhcmR3YXJlLiAgRm9yIGV4YW1wbGUsIHRvIHVzZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9hcHBsZXRvdWNoLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvYXBwbGV0b3VjaC50eHQKaW5kZXggNGY3YzYzMy4uYjEzZGUzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9hcHBsZXRvdWNoLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2FwcGxldG91Y2gudHh0CkBAIC04Miw0ICs4Miw0IEBACiAtLS0tLS0KIAogWzFdOiBodHRwOi8vam9oYW5uZXMuc2lwc29sdXRpb25zLm5ldC9Qb3dlckJvb2svdG91Y2hwYWQvCi1bMl06IGh0dHA6Ly93ZWIudGVsaWEuY29tL351ODk0MDQzNDAvdG91Y2hwYWQvaW5kZXguaHRtbAorWzJdOiBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8qL2h0dHA6Ly93ZWIudGVsaWEuY29tL351ODk0MDQzNDAvdG91Y2hwYWQvaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9iY201OTc0LnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvYmNtNTk3NC50eHQKaW5kZXggNWUyMmRjZi4uNzRkMzg3NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9iY201OTc0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2JjbTU5NzQudHh0CkBAIC02Miw0ICs2Miw0IEBACiAtLS0tLQogCiBbMV0gaHR0cDovL3VidW50dWZvcnVtcy5vcmcvc2hvd3RocmVhZC5waHA/dD04NDAwNDAKLVsyXSBodHRwOi8vaHR0cDovL2JpdG1hdGgub3JnL2NvZGUvCitbMl0gaHR0cDovL2JpdG1hdGgub3JnL2NvZGUvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2lmb3JjZS1wcm90b2NvbC50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2lmb3JjZS1wcm90b2NvbC50eHQKaW5kZXggM2FjOTI0MS4uMmQ1ZmJmZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9pZm9yY2UtcHJvdG9jb2wudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvaWZvcmNlLXByb3RvY29sLnR4dApAQCAtMjUxLDcgKzI1MSw3IEBACiAKICoqIEF1dGhvciBvZiB0aGlzIGRvY3VtZW50ICoqCiBKb2hhbm4gRGVuZXV4IDxqb2hhbm4uZGVuZXV4QGdtYWlsLmNvbT4KLUhvbWUgcGFnZSBhdCBodHRwOi8vd3d3LmVzaWwudW5pdi1tcnMuZnIvfmpkZW5ldXgvcHJvamVjdHMvZmYvCitIb21lIHBhZ2UgYXQgaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vd3d3LmVzaWwudW5pdi1tcnMuZnIKIAogQWRkaXRpb25zIGJ5IFZvanRlY2ggUGF2bGlrLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L211bHRpLXRvdWNoLXByb3RvY29sLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0CmluZGV4IGMwZmMxYzcuLmJkY2JhMTU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L211bHRpLXRvdWNoLXByb3RvY29sLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L211bHRpLXRvdWNoLXByb3RvY29sLnR4dApAQCAtNiwzMSArNiwxNDkgQEAKIEludHJvZHVjdGlvbgogLS0tLS0tLS0tLS0tCiAKLUluIG9yZGVyIHRvIHV0aWxpemUgdGhlIGZ1bGwgcG93ZXIgb2YgdGhlIG5ldyBtdWx0aS10b3VjaCBkZXZpY2VzLCBhIHdheSB0bwotcmVwb3J0IGRldGFpbGVkIGZpbmdlciBkYXRhIHRvIHVzZXIgc3BhY2UgaXMgbmVlZGVkLiBUaGlzIGRvY3VtZW50Ci1kZXNjcmliZXMgdGhlIG11bHRpLXRvdWNoIChNVCkgcHJvdG9jb2wgd2hpY2ggYWxsb3dzIGtlcm5lbCBkcml2ZXJzIHRvCi1yZXBvcnQgZGV0YWlscyBmb3IgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBmaW5nZXJzLgorSW4gb3JkZXIgdG8gdXRpbGl6ZSB0aGUgZnVsbCBwb3dlciBvZiB0aGUgbmV3IG11bHRpLXRvdWNoIGFuZCBtdWx0aS11c2VyCitkZXZpY2VzLCBhIHdheSB0byByZXBvcnQgZGV0YWlsZWQgZGF0YSBmcm9tIG11bHRpcGxlIGNvbnRhY3RzLCBpLmUuLAorb2JqZWN0cyBpbiBkaXJlY3QgY29udGFjdCB3aXRoIHRoZSBkZXZpY2Ugc3VyZmFjZSwgaXMgbmVlZGVkLiAgVGhpcworZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBtdWx0aS10b3VjaCAoTVQpIHByb3RvY29sIHdoaWNoIGFsbG93cyBrZXJuZWwKK2RyaXZlcnMgdG8gcmVwb3J0IGRldGFpbHMgZm9yIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgY29udGFjdHMuCisKK1RoZSBwcm90b2NvbCBpcyBkaXZpZGVkIGludG8gdHdvIHR5cGVzLCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKK2hhcmR3YXJlLiBGb3IgZGV2aWNlcyBoYW5kbGluZyBhbm9ueW1vdXMgY29udGFjdHMgKHR5cGUgQSksIHRoZSBwcm90b2NvbAorZGVzY3JpYmVzIGhvdyB0byBzZW5kIHRoZSByYXcgZGF0YSBmb3IgYWxsIGNvbnRhY3RzIHRvIHRoZSByZWNlaXZlci4gRm9yCitkZXZpY2VzIGNhcGFibGUgb2YgdHJhY2tpbmcgaWRlbnRpZmlhYmxlIGNvbnRhY3RzICh0eXBlIEIpLCB0aGUgcHJvdG9jb2wKK2Rlc2NyaWJlcyBob3cgdG8gc2VuZCB1cGRhdGVzIGZvciBpbmRpdmlkdWFsIGNvbnRhY3RzIHZpYSBldmVudCBzbG90cy4KIAogCi1Vc2FnZQotLS0tLS0KK1Byb3RvY29sIFVzYWdlCistLS0tLS0tLS0tLS0tLQogCi1Bbm9ueW1vdXMgZmluZ2VyIGRldGFpbHMgYXJlIHNlbnQgc2VxdWVudGlhbGx5IGFzIHNlcGFyYXRlIHBhY2tldHMgb2YgQUJTCi1ldmVudHMuIE9ubHkgdGhlIEFCU19NVCBldmVudHMgYXJlIHJlY29nbml6ZWQgYXMgcGFydCBvZiBhIGZpbmdlcgotcGFja2V0LiBUaGUgZW5kIG9mIGEgcGFja2V0IGlzIG1hcmtlZCBieSBjYWxsaW5nIHRoZSBpbnB1dF9tdF9zeW5jKCkKLWZ1bmN0aW9uLCB3aGljaCBnZW5lcmF0ZXMgYSBTWU5fTVRfUkVQT1JUIGV2ZW50LiBUaGlzIGluc3RydWN0cyB0aGUKLXJlY2VpdmVyIHRvIGFjY2VwdCB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmluZ2VyIGFuZCBwcmVwYXJlIHRvIHJlY2VpdmUKLWFub3RoZXIuIFRoZSBlbmQgb2YgYSBtdWx0aS10b3VjaCB0cmFuc2ZlciBpcyBtYXJrZWQgYnkgY2FsbGluZyB0aGUgdXN1YWwKK0NvbnRhY3QgZGV0YWlscyBhcmUgc2VudCBzZXF1ZW50aWFsbHkgYXMgc2VwYXJhdGUgcGFja2V0cyBvZiBBQlNfTVQKK2V2ZW50cy4gT25seSB0aGUgQUJTX01UIGV2ZW50cyBhcmUgcmVjb2duaXplZCBhcyBwYXJ0IG9mIGEgY29udGFjdAorcGFja2V0LiBTaW5jZSB0aGVzZSBldmVudHMgYXJlIGlnbm9yZWQgYnkgY3VycmVudCBzaW5nbGUtdG91Y2ggKFNUKQorYXBwbGljYXRpb25zLCB0aGUgTVQgcHJvdG9jb2wgY2FuIGJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgU1QgcHJvdG9jb2wKK2luIGFuIGV4aXN0aW5nIGRyaXZlci4KKworRHJpdmVycyBmb3IgdHlwZSBBIGRldmljZXMgc2VwYXJhdGUgY29udGFjdCBwYWNrZXRzIGJ5IGNhbGxpbmcKK2lucHV0X210X3N5bmMoKSBhdCB0aGUgZW5kIG9mIGVhY2ggcGFja2V0LiBUaGlzIGdlbmVyYXRlcyBhIFNZTl9NVF9SRVBPUlQKK2V2ZW50LCB3aGljaCBpbnN0cnVjdHMgdGhlIHJlY2VpdmVyIHRvIGFjY2VwdCB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQKK2NvbnRhY3QgYW5kIHByZXBhcmUgdG8gcmVjZWl2ZSBhbm90aGVyLgorCitEcml2ZXJzIGZvciB0eXBlIEIgZGV2aWNlcyBzZXBhcmF0ZSBjb250YWN0IHBhY2tldHMgYnkgY2FsbGluZworaW5wdXRfbXRfc2xvdCgpLCB3aXRoIGEgc2xvdCBhcyBhcmd1bWVudCwgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhY2tldC4KK1RoaXMgZ2VuZXJhdGVzIGFuIEFCU19NVF9TTE9UIGV2ZW50LCB3aGljaCBpbnN0cnVjdHMgdGhlIHJlY2VpdmVyIHRvCitwcmVwYXJlIGZvciB1cGRhdGVzIG9mIHRoZSBnaXZlbiBzbG90LgorCitBbGwgZHJpdmVycyBtYXJrIHRoZSBlbmQgb2YgYSBtdWx0aS10b3VjaCB0cmFuc2ZlciBieSBjYWxsaW5nIHRoZSB1c3VhbAogaW5wdXRfc3luYygpIGZ1bmN0aW9uLiBUaGlzIGluc3RydWN0cyB0aGUgcmVjZWl2ZXIgdG8gYWN0IHVwb24gZXZlbnRzCi1hY2N1bXVsYXRlZCBzaW5jZSBsYXN0IEVWX1NZTi9TWU5fUkVQT1JUIGFuZCBwcmVwYXJlIHRvIHJlY2VpdmUgYSBuZXcKLXNldCBvZiBldmVudHMvcGFja2V0cy4KK2FjY3VtdWxhdGVkIHNpbmNlIGxhc3QgRVZfU1lOL1NZTl9SRVBPUlQgYW5kIHByZXBhcmUgdG8gcmVjZWl2ZSBhIG5ldyBzZXQKK29mIGV2ZW50cy9wYWNrZXRzLgorCitUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0YXRlbGVzcyB0eXBlIEEgcHJvdG9jb2wgYW5kIHRoZSBzdGF0ZWZ1bAordHlwZSBCIHNsb3QgcHJvdG9jb2wgbGllcyBpbiB0aGUgdXNhZ2Ugb2YgaWRlbnRpZmlhYmxlIGNvbnRhY3RzIHRvIHJlZHVjZQordGhlIGFtb3VudCBvZiBkYXRhIHNlbnQgdG8gdXNlcnNwYWNlLiBUaGUgc2xvdCBwcm90b2NvbCByZXF1aXJlcyB0aGUgdXNlIG9mCit0aGUgQUJTX01UX1RSQUNLSU5HX0lELCBlaXRoZXIgcHJvdmlkZWQgYnkgdGhlIGhhcmR3YXJlIG9yIGNvbXB1dGVkIGZyb20KK3RoZSByYXcgZGF0YSBbNV0uCisKK0ZvciB0eXBlIEEgZGV2aWNlcywgdGhlIGtlcm5lbCBkcml2ZXIgc2hvdWxkIGdlbmVyYXRlIGFuIGFyYml0cmFyeQorZW51bWVyYXRpb24gb2YgdGhlIGZ1bGwgc2V0IG9mIGFub255bW91cyBjb250YWN0cyBjdXJyZW50bHkgb24gdGhlCitzdXJmYWNlLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIHBhY2tldHMgYXBwZWFyIGluIHRoZSBldmVudCBzdHJlYW0gaXMgbm90CitpbXBvcnRhbnQuICBFdmVudCBmaWx0ZXJpbmcgYW5kIGZpbmdlciB0cmFja2luZyBpcyBsZWZ0IHRvIHVzZXIgc3BhY2UgWzNdLgorCitGb3IgdHlwZSBCIGRldmljZXMsIHRoZSBrZXJuZWwgZHJpdmVyIHNob3VsZCBhc3NvY2lhdGUgYSBzbG90IHdpdGggZWFjaAoraWRlbnRpZmllZCBjb250YWN0LCBhbmQgdXNlIHRoYXQgc2xvdCB0byBwcm9wYWdhdGUgY2hhbmdlcyBmb3IgdGhlIGNvbnRhY3QuCitDcmVhdGlvbiwgcmVwbGFjZW1lbnQgYW5kIGRlc3RydWN0aW9uIG9mIGNvbnRhY3RzIGlzIGFjaGlldmVkIGJ5IG1vZGlmeWluZwordGhlIEFCU19NVF9UUkFDS0lOR19JRCBvZiB0aGUgYXNzb2NpYXRlZCBzbG90LiAgQSBub24tbmVnYXRpdmUgdHJhY2tpbmcgaWQKK2lzIGludGVycHJldGVkIGFzIGEgY29udGFjdCwgYW5kIHRoZSB2YWx1ZSAtMSBkZW5vdGVzIGFuIHVudXNlZCBzbG90LiAgQQordHJhY2tpbmcgaWQgbm90IHByZXZpb3VzbHkgcHJlc2VudCBpcyBjb25zaWRlcmVkIG5ldywgYW5kIGEgdHJhY2tpbmcgaWQgbm8KK2xvbmdlciBwcmVzZW50IGlzIGNvbnNpZGVyZWQgcmVtb3ZlZC4gIFNpbmNlIG9ubHkgY2hhbmdlcyBhcmUgcHJvcGFnYXRlZCwKK3RoZSBmdWxsIHN0YXRlIG9mIGVhY2ggaW5pdGlhdGVkIGNvbnRhY3QgaGFzIHRvIHJlc2lkZSBpbiB0aGUgcmVjZWl2aW5nCitlbmQuICBVcG9uIHJlY2VpdmluZyBhbiBNVCBldmVudCwgb25lIHNpbXBseSB1cGRhdGVzIHRoZSBhcHByb3ByaWF0ZQorYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IHNsb3QuCisKKworUHJvdG9jb2wgRXhhbXBsZSBBCistLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSBpcyB3aGF0IGEgbWluaW1hbCBldmVudCBzZXF1ZW5jZSBmb3IgYSB0d28tY29udGFjdCB0b3VjaCB3b3VsZCBsb29rCitsaWtlIGZvciBhIHR5cGUgQSBkZXZpY2U6CisKKyAgIEFCU19NVF9QT1NJVElPTl9YIHhbMF0KKyAgIEFCU19NVF9QT1NJVElPTl9ZIHlbMF0KKyAgIFNZTl9NVF9SRVBPUlQKKyAgIEFCU19NVF9QT1NJVElPTl9YIHhbMV0KKyAgIEFCU19NVF9QT1NJVElPTl9ZIHlbMV0KKyAgIFNZTl9NVF9SRVBPUlQKKyAgIFNZTl9SRVBPUlQKKworVGhlIHNlcXVlbmNlIGFmdGVyIG1vdmluZyBvbmUgb2YgdGhlIGNvbnRhY3RzIGxvb2tzIGV4YWN0bHkgdGhlIHNhbWU7IHRoZQorcmF3IGRhdGEgZm9yIGFsbCBwcmVzZW50IGNvbnRhY3RzIGFyZSBzZW50IGJldHdlZW4gZXZlcnkgc3luY2hyb25pemF0aW9uCit3aXRoIFNZTl9SRVBPUlQuCisKK0hlcmUgaXMgdGhlIHNlcXVlbmNlIGFmdGVyIGxpZnRpbmcgdGhlIGZpcnN0IGNvbnRhY3Q6CisKKyAgIEFCU19NVF9QT1NJVElPTl9YIHhbMV0KKyAgIEFCU19NVF9QT1NJVElPTl9ZIHlbMV0KKyAgIFNZTl9NVF9SRVBPUlQKKyAgIFNZTl9SRVBPUlQKKworQW5kIGhlcmUgaXMgdGhlIHNlcXVlbmNlIGFmdGVyIGxpZnRpbmcgdGhlIHNlY29uZCBjb250YWN0OgorCisgICBTWU5fTVRfUkVQT1JUCisgICBTWU5fUkVQT1JUCisKK0lmIHRoZSBkcml2ZXIgcmVwb3J0cyBvbmUgb2YgQlROX1RPVUNIIG9yIEFCU19QUkVTU1VSRSBpbiBhZGRpdGlvbiB0byB0aGUKK0FCU19NVCBldmVudHMsIHRoZSBsYXN0IFNZTl9NVF9SRVBPUlQgZXZlbnQgbWF5IGJlIG9taXR0ZWQuIE90aGVyd2lzZSwgdGhlCitsYXN0IFNZTl9SRVBPUlQgd2lsbCBiZSBkcm9wcGVkIGJ5IHRoZSBpbnB1dCBjb3JlLCByZXN1bHRpbmcgaW4gbm8KK3plcm8tY29udGFjdCBldmVudCByZWFjaGluZyB1c2VybGFuZC4KKworCitQcm90b2NvbCBFeGFtcGxlIEIKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlIGlzIHdoYXQgYSBtaW5pbWFsIGV2ZW50IHNlcXVlbmNlIGZvciBhIHR3by1jb250YWN0IHRvdWNoIHdvdWxkIGxvb2sKK2xpa2UgZm9yIGEgdHlwZSBCIGRldmljZToKKworICAgQUJTX01UX1NMT1QgMAorICAgQUJTX01UX1RSQUNLSU5HX0lEIDQ1CisgICBBQlNfTVRfUE9TSVRJT05fWCB4WzBdCisgICBBQlNfTVRfUE9TSVRJT05fWSB5WzBdCisgICBBQlNfTVRfU0xPVCAxCisgICBBQlNfTVRfVFJBQ0tJTkdfSUQgNDYKKyAgIEFCU19NVF9QT1NJVElPTl9YIHhbMV0KKyAgIEFCU19NVF9QT1NJVElPTl9ZIHlbMV0KKyAgIFNZTl9SRVBPUlQKKworSGVyZSBpcyB0aGUgc2VxdWVuY2UgYWZ0ZXIgbW92aW5nIGNvbnRhY3QgNDUgaW4gdGhlIHggZGlyZWN0aW9uOgorCisgICBBQlNfTVRfU0xPVCAwCisgICBBQlNfTVRfUE9TSVRJT05fWCB4WzBdCisgICBTWU5fUkVQT1JUCisKK0hlcmUgaXMgdGhlIHNlcXVlbmNlIGFmdGVyIGxpZnRpbmcgdGhlIGNvbnRhY3QgaW4gc2xvdCAwOgorCisgICBBQlNfTVRfVFJBQ0tJTkdfSUQgLTEKKyAgIFNZTl9SRVBPUlQKKworVGhlIHNsb3QgYmVpbmcgbW9kaWZpZWQgaXMgYWxyZWFkeSAwLCBzbyB0aGUgQUJTX01UX1NMT1QgaXMgb21pdHRlZC4gIFRoZQorbWVzc2FnZSByZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBvZiBzbG90IDAgd2l0aCBjb250YWN0IDQ1LCB0aGVyZWJ5CitkZXN0cm95aW5nIGNvbnRhY3QgNDUgYW5kIGZyZWVpbmcgc2xvdCAwIHRvIGJlIHJldXNlZCBmb3IgYW5vdGhlciBjb250YWN0LgorCitGaW5hbGx5LCBoZXJlIGlzIHRoZSBzZXF1ZW5jZSBhZnRlciBsaWZ0aW5nIHRoZSBzZWNvbmQgY29udGFjdDoKKworICAgQUJTX01UX1NMT1QgMQorICAgQUJTX01UX1RSQUNLSU5HX0lEIC0xCisgICBTWU5fUkVQT1JUCisKKworRXZlbnQgVXNhZ2UKKy0tLS0tLS0tLS0tCiAKIEEgc2V0IG9mIEFCU19NVCBldmVudHMgd2l0aCB0aGUgZGVzaXJlZCBwcm9wZXJ0aWVzIGlzIGRlZmluZWQuIFRoZSBldmVudHMKIGFyZSBkaXZpZGVkIGludG8gY2F0ZWdvcmllcywgdG8gYWxsb3cgZm9yIHBhcnRpYWwgaW1wbGVtZW50YXRpb24uICBUaGUKIG1pbmltdW0gc2V0IGNvbnNpc3RzIG9mIEFCU19NVF9QT1NJVElPTl9YIGFuZCBBQlNfTVRfUE9TSVRJT05fWSwgd2hpY2gKLWFsbG93cyBmb3IgbXVsdGlwbGUgZmluZ2VycyB0byBiZSB0cmFja2VkLiAgSWYgdGhlIGRldmljZSBzdXBwb3J0cyBpdCwgdGhlCithbGxvd3MgZm9yIG11bHRpcGxlIGNvbnRhY3RzIHRvIGJlIHRyYWNrZWQuICBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIGl0LCB0aGUKIEFCU19NVF9UT1VDSF9NQUpPUiBhbmQgQUJTX01UX1dJRFRIX01BSk9SIG1heSBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIHNpemUKLW9mIHRoZSBjb250YWN0IGFyZWEgYW5kIGFwcHJvYWNoaW5nIGZpbmdlciwgcmVzcGVjdGl2ZWx5Lgorb2YgdGhlIGNvbnRhY3QgYXJlYSBhbmQgYXBwcm9hY2hpbmcgY29udGFjdCwgcmVzcGVjdGl2ZWx5LgogCiBUaGUgVE9VQ0ggYW5kIFdJRFRIIHBhcmFtZXRlcnMgaGF2ZSBhIGdlb21ldHJpY2FsIGludGVycHJldGF0aW9uOyBpbWFnaW5lCiBsb29raW5nIHRocm91Z2ggYSB3aW5kb3cgYXQgc29tZW9uZSBnZW50bHkgaG9sZGluZyBhIGZpbmdlciBhZ2FpbnN0IHRoZQpAQCAtNDEsNTYgKzE1OSwyNiBAQAogQUJTX01UX1dJRFRIX01BSk9SLiBOb3cgaW1hZ2luZSB0aGUgcGVyc29uIHByZXNzaW5nIHRoZSBmaW5nZXIgaGFyZGVyCiBhZ2FpbnN0IHRoZSBnbGFzcy4gVGhlIGlubmVyIHJlZ2lvbiB3aWxsIGluY3JlYXNlLCBhbmQgaW4gZ2VuZXJhbCwgdGhlCiByYXRpbyBBQlNfTVRfVE9VQ0hfTUFKT1IgLyBBQlNfTVRfV0lEVEhfTUFKT1IsIHdoaWNoIGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4KLXVuaXR5LCBpcyByZWxhdGVkIHRvIHRoZSBmaW5nZXIgcHJlc3N1cmUuIEZvciBwcmVzc3VyZS1iYXNlZCBkZXZpY2VzLAordW5pdHksIGlzIHJlbGF0ZWQgdG8gdGhlIGNvbnRhY3QgcHJlc3N1cmUuIEZvciBwcmVzc3VyZS1iYXNlZCBkZXZpY2VzLAogQUJTX01UX1BSRVNTVVJFIG1heSBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIHByZXNzdXJlIG9uIHRoZSBjb250YWN0IGFyZWEKIGluc3RlYWQuCiAKLUluIGFkZGl0aW9uIHRvIHRoZSBNQUpPUiBwYXJhbWV0ZXJzLCB0aGUgb3ZhbCBzaGFwZSBvZiB0aGUgZmluZ2VyIGNhbiBiZQorSW4gYWRkaXRpb24gdG8gdGhlIE1BSk9SIHBhcmFtZXRlcnMsIHRoZSBvdmFsIHNoYXBlIG9mIHRoZSBjb250YWN0IGNhbiBiZQogZGVzY3JpYmVkIGJ5IGFkZGluZyB0aGUgTUlOT1IgcGFyYW1ldGVycywgc3VjaCB0aGF0IE1BSk9SIGFuZCBNSU5PUiBhcmUgdGhlCiBtYWpvciBhbmQgbWlub3IgYXhpcyBvZiBhbiBlbGxpcHNlLiBGaW5hbGx5LCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIG92YWwKIHNoYXBlIGNhbiBiZSBkZXNjcmliZSB3aXRoIHRoZSBPUklFTlRBVElPTiBwYXJhbWV0ZXIuCiAKIFRoZSBBQlNfTVRfVE9PTF9UWVBFIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgdG91Y2hpbmcgdG9vbCBpcyBhCi1maW5nZXIgb3IgYSBwZW4gb3Igc29tZXRoaW5nIGVsc2UuICBEZXZpY2VzIHdpdGggbW9yZSBncmFudWxhciBpbmZvcm1hdGlvbgorY29udGFjdCBvciBhIHBlbiBvciBzb21ldGhpbmcgZWxzZS4gIERldmljZXMgd2l0aCBtb3JlIGdyYW51bGFyIGluZm9ybWF0aW9uCiBtYXkgc3BlY2lmeSBnZW5lcmFsIHNoYXBlcyBhcyBibG9icywgaS5lLiwgYXMgYSBzZXF1ZW5jZSBvZiByZWN0YW5ndWxhcgogc2hhcGVzIGdyb3VwZWQgdG9nZXRoZXIgYnkgYW4gQUJTX01UX0JMT0JfSUQuIEZpbmFsbHksIGZvciB0aGUgZmV3IGRldmljZXMKIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgaXQsIHRoZSBBQlNfTVRfVFJBQ0tJTkdfSUQgZXZlbnQgbWF5IGJlIHVzZWQgdG8KLXJlcG9ydCBmaW5nZXIgdHJhY2tpbmcgZnJvbSBoYXJkd2FyZSBbNV0uCityZXBvcnQgY29udGFjdCB0cmFja2luZyBmcm9tIGhhcmR3YXJlIFs1XS4KIAotSGVyZSBpcyB3aGF0IGEgbWluaW1hbCBldmVudCBzZXF1ZW5jZSBmb3IgYSB0d28tZmluZ2VyIHRvdWNoIHdvdWxkIGxvb2sKLWxpa2U6Ci0KLSAgIEFCU19NVF9QT1NJVElPTl9YCi0gICBBQlNfTVRfUE9TSVRJT05fWQotICAgU1lOX01UX1JFUE9SVAotICAgQUJTX01UX1BPU0lUSU9OX1gKLSAgIEFCU19NVF9QT1NJVElPTl9ZCi0gICBTWU5fTVRfUkVQT1JUCi0gICBTWU5fUkVQT1JUCi0KLUhlcmUgaXMgdGhlIHNlcXVlbmNlIGFmdGVyIGxpZnRpbmcgb25lIG9mIHRoZSBmaW5nZXJzOgotCi0gICBBQlNfTVRfUE9TSVRJT05fWAotICAgQUJTX01UX1BPU0lUSU9OX1kKLSAgIFNZTl9NVF9SRVBPUlQKLSAgIFNZTl9SRVBPUlQKLQotQW5kIGhlcmUgaXMgdGhlIHNlcXVlbmNlIGFmdGVyIGxpZnRpbmcgdGhlIHJlbWFpbmluZyBmaW5nZXI6Ci0KLSAgIFNZTl9NVF9SRVBPUlQKLSAgIFNZTl9SRVBPUlQKLQotSWYgdGhlIGRyaXZlciByZXBvcnRzIG9uZSBvZiBCVE5fVE9VQ0ggb3IgQUJTX1BSRVNTVVJFIGluIGFkZGl0aW9uIHRvIHRoZQotQUJTX01UIGV2ZW50cywgdGhlIGxhc3QgU1lOX01UX1JFUE9SVCBldmVudCBtYXkgYmUgb21pdHRlZC4gT3RoZXJ3aXNlLCB0aGUKLWxhc3QgU1lOX1JFUE9SVCB3aWxsIGJlIGRyb3BwZWQgYnkgdGhlIGlucHV0IGNvcmUsIHJlc3VsdGluZyBpbiBubwotemVyby1maW5nZXIgZXZlbnQgcmVhY2hpbmcgdXNlcmxhbmQuCiAKIEV2ZW50IFNlbWFudGljcwogLS0tLS0tLS0tLS0tLS0tCiAKLVRoZSB3b3JkICJjb250YWN0IiBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgdG9vbCB3aGljaCBpcyBpbiBkaXJlY3QgY29udGFjdAotd2l0aCB0aGUgc3VyZmFjZS4gQSBmaW5nZXIsIGEgcGVuIG9yIGEgcnViYmVyIGFsbCBjbGFzc2lmeSBhcyBjb250YWN0cy4KLQogQUJTX01UX1RPVUNIX01BSk9SCiAKIFRoZSBsZW5ndGggb2YgdGhlIG1ham9yIGF4aXMgb2YgdGhlIGNvbnRhY3QuIFRoZSBsZW5ndGggc2hvdWxkIGJlIGdpdmVuIGluCkBAIC0xNTcsMTUgKzI0NSwxNiBAQAogQUJTX01UX0JMT0JfSUQKIAogVGhlIEJMT0JfSUQgZ3JvdXBzIHNldmVyYWwgcGFja2V0cyB0b2dldGhlciBpbnRvIG9uZSBhcmJpdHJhcmlseSBzaGFwZWQKLWNvbnRhY3QuIFRoaXMgaXMgYSBsb3ctbGV2ZWwgYW5vbnltb3VzIGdyb3VwaW5nLCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZAotd2l0aCB0aGUgaGlnaC1sZXZlbCB0cmFja2luZ0lEIFs1XS4gTW9zdCBrZXJuZWwgZHJpdmVycyB3aWxsIG5vdCBoYXZlIGJsb2IKLWNhcGFiaWxpdHksIGFuZCBjYW4gc2FmZWx5IG9taXQgdGhlIGV2ZW50LgorY29udGFjdC4gVGhpcyBpcyBhIGxvdy1sZXZlbCBhbm9ueW1vdXMgZ3JvdXBpbmcgZm9yIHR5cGUgQSBkZXZpY2VzLCBhbmQKK3Nob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aGUgaGlnaC1sZXZlbCB0cmFja2luZ0lEIFs1XS4gTW9zdCB0eXBlIEEKK2RldmljZXMgZG8gbm90IGhhdmUgYmxvYiBjYXBhYmlsaXR5LCBzbyBkcml2ZXJzIGNhbiBzYWZlbHkgb21pdCB0aGlzIGV2ZW50LgogCiBBQlNfTVRfVFJBQ0tJTkdfSUQKIAogVGhlIFRSQUNLSU5HX0lEIGlkZW50aWZpZXMgYW4gaW5pdGlhdGVkIGNvbnRhY3QgdGhyb3VnaG91dCBpdHMgbGlmZSBjeWNsZQotWzVdLiBUaGVyZSBhcmUgY3VycmVudGx5IG9ubHkgYSBmZXcgZGV2aWNlcyB0aGF0IHN1cHBvcnQgaXQsIHNvIHRoaXMgZXZlbnQKLXNob3VsZCBub3JtYWxseSBiZSBvbWl0dGVkLgorWzVdLiBUaGlzIGV2ZW50IGlzIG1hbmRhdG9yeSBmb3IgdHlwZSBCIGRldmljZXMuIFRoZSB2YWx1ZSByYW5nZSBvZiB0aGUKK1RSQUNLSU5HX0lEIHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8gZW5zdXJlIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBvZiBhCitjb250YWN0IG1haW50YWluZWQgb3ZlciBhbiBleHRlbmRlZCBwZXJpb2Qgb2YgdGltZS4KIAogCiBFdmVudCBDb21wdXRhdGlvbgpAQCAtMTkyLDIwICsyODEsMTEgQEAKIEZpbmdlciBUcmFja2luZwogLS0tLS0tLS0tLS0tLS0tCiAKLVRoZSBrZXJuZWwgZHJpdmVyIHNob3VsZCBnZW5lcmF0ZSBhbiBhcmJpdHJhcnkgZW51bWVyYXRpb24gb2YgdGhlIHNldCBvZgotYW5vbnltb3VzIGNvbnRhY3RzIGN1cnJlbnRseSBvbiB0aGUgc3VyZmFjZS4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBwYWNrZXRzCi1hcHBlYXIgaW4gdGhlIGV2ZW50IHN0cmVhbSBpcyBub3QgaW1wb3J0YW50LgotCiBUaGUgcHJvY2VzcyBvZiBmaW5nZXIgdHJhY2tpbmcsIGkuZS4sIHRvIGFzc2lnbiBhIHVuaXF1ZSB0cmFja2luZ0lEIHRvIGVhY2gKLWluaXRpYXRlZCBjb250YWN0IG9uIHRoZSBzdXJmYWNlLCBpcyBsZWZ0IHRvIHVzZXIgc3BhY2U7IHByZWZlcmFibHkgdGhlCi1tdWx0aS10b3VjaCBYIGRyaXZlciBbM10uIEluIHRoYXQgZHJpdmVyLCB0aGUgdHJhY2tpbmdJRCBzdGF5cyB0aGUgc2FtZSBhbmQKLXVuaXF1ZSB1bnRpbCB0aGUgY29udGFjdCB2YW5pc2hlcyAod2hlbiB0aGUgZmluZ2VyIGxlYXZlcyB0aGUgc3VyZmFjZSkuIFRoZQotcHJvYmxlbSBvZiBhc3NpZ25pbmcgYSBzZXQgb2YgYW5vbnltb3VzIGZpbmdlcnMgdG8gYSBzZXQgb2YgaWRlbnRpZmllZAotZmluZ2VycyBpcyBhIGV1Y2xpZGlhbiBiaXBhcnRpdGUgbWF0Y2hpbmcgcHJvYmxlbSBhdCBlYWNoIGV2ZW50IHVwZGF0ZSwgYW5kCi1yZWxpZXMgb24gYSBzdWZmaWNpZW50bHkgcmFwaWQgdXBkYXRlIHJhdGUuCi0KLVRoZXJlIGFyZSBhIGZldyBkZXZpY2VzIHRoYXQgc3VwcG9ydCB0cmFja2luZ0lEIGluIGhhcmR3YXJlLiBVc2VyIHNwYWNlIGNhbgotbWFrZSB1c2Ugb2YgdGhlc2UgbmF0aXZlIGlkZW50aWZpZXJzIHRvIHJlZHVjZSBiYW5kd2lkdGggYW5kIGNwdSB1c2FnZS4KK2luaXRpYXRlZCBjb250YWN0IG9uIHRoZSBzdXJmYWNlLCBpcyBhIEV1Y2xpZGlhbiBCaXBhcnRpdGUgTWF0Y2hpbmcKK3Byb2JsZW0uICBBdCBlYWNoIGV2ZW50IHN5bmNocm9uaXphdGlvbiwgdGhlIHNldCBvZiBhY3R1YWwgY29udGFjdHMgaXMKK21hdGNoZWQgdG8gdGhlIHNldCBvZiBjb250YWN0cyBmcm9tIHRoZSBwcmV2aW91cyBzeW5jaHJvbml6YXRpb24uIEEgZnVsbAoraW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIFszXS4KIAogCiBHZXN0dXJlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9zZW50ZWxpYy50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3NlbnRlbGljLnR4dAppbmRleCBiMzVhZmZkLi5iMmVmMTI1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L3NlbnRlbGljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3NlbnRlbGljLnR4dApAQCAtMzQxLDcgKzM0MSw3IEBACiBGU1Agc3VwcG9ydHMgYmFzaWMgUFMvMiBjb21tYW5kaW5nIHNldCBhbmQgbW9kZXMsIHJlZmVyIHRvIGZvbGxvd2luZyBVUkwgZm9yCiBkZXRhaWxzIGFib3V0IFBTLzIgY29tbWFuZHM6CiAKLWh0dHA6Ly93d3cuY29tcHV0ZXItZW5naW5lZXJpbmcub3JnL2luZGV4LnBocD90aXRsZT1QUy8yX01vdXNlX0ludGVyZmFjZQoraHR0cDovL3d3dy5jb21wdXRlci1lbmdpbmVlcmluZy5vcmcvcHMybW91c2UvCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQcm9ncmFtbWluZyBTZXF1ZW5jZSBmb3IgRGV0ZXJtaW5pbmcgUGFja2V0IFBhcnNpbmcgRmxvdwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC94cGFkLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQveHBhZC50eHQKaW5kZXggYWFlMGQ0MC4uN2NjOWE0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC94cGFkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3hwYWQudHh0CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogMS4gaHR0cDovL2V1Yy5qcC9wZXJpcGhzL3hib3gtY29udHJvbGxlci5qYS5odG1sIChJVE8gVGFrYXl1a2kpCiAyLiBodHRwOi8veHBhZC54Ym94LXNjZW5lLmNvbS8KLTMuIGh0dHA6Ly93d3cueGJveGhhY2t6LmNvbS9IYWNrei1SZWZlcmVuY2UuaHRtCiszLiBodHRwOi8vd3d3Lm1hcmtvc3dlYi5jb20vd3d3L3hib3hoYWNrei5jb20vIAogCiA0LiAvcHJvYy9idXMvdXNiL2RldmljZXMgLSBkdW1wIGZyb20gSW50ZXJBY3QgUG93ZXJQYWQgUHJvIChHZXJtYW55KToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnRlbF90eHQudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnRlbF90eHQudHh0CmluZGV4IDVkYzU5YjAuLjg0OWRlMWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW50ZWxfdHh0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ludGVsX3R4dC50eHQKQEAgLTI1LDIwICsyNSwxOCBAQAogSW50ZWwgVFhUIGhhcyBiZWVuIHByZXNlbnRlZCBhdCB2YXJpb3VzIGV2ZW50cyBvdmVyIHRoZSBwYXN0IGZldwogeWVhcnMsIHNvbWUgb2Ygd2hpY2ggYXJlOgogICAgICAgTGludXhUQUcgMjAwODoKLSAgICAgICAgICBodHRwOi8vd3d3LmxpbnV4dGFnLm9yZy8yMDA4L2VuL2NvbmYvZXZlbnRzL3ZwLWRvbm5lcnN0YWcvCi0gICAgICAgICAgZGV0YWlscy5odG1sP3RhbGtpZD0xMTAKKyAgICAgICAgICBodHRwOi8vd3d3LmxpbnV4dGFnLm9yZy8yMDA4L2VuL2NvbmYvZXZlbnRzL3ZwLWRvbm5lcnN0YWcuaHRtbAogICAgICAgVFJVU1QyMDA4OgotICAgICAgICAgIGh0dHA6Ly93d3cudHJ1c3QyMDA4LmV1L2Rvd25sb2Fkcy9LZXlub3RlLVNwZWFrZXJzLworICAgICAgICAgIGh0dHA6Ly93d3cudHJ1c3QtY29uZmVyZW5jZS5ldS9kb3dubG9hZHMvS2V5bm90ZS1TcGVha2Vycy8KICAgICAgICAgICAzX0RhdmlkLUdyYXdyb2NrX1RoZS1Gcm9udC1Eb29yLW9mLVRydXN0ZWQtQ29tcHV0aW5nLnBkZgotICAgICAgSURGIDIwMDgsIFNoYW5naGFpOgotICAgICAgICAgIGh0dHA6Ly9pbnRlbGRldmVsb3BlcmZvcnVtLmNvbS5lZGdlc3VpdGUubmV0L3NoYW5naGFpXzIwMDgvCi0gICAgICAgICAgYWVwL1BST1MwMDMvaW5kZXguaHRtbAorICAgICAgSURGLCBTaGFuZ2hhaToKKyAgICAgICAgICBodHRwOi8vd3d3LnByY2lkZi5jb20uY24vaW5kZXhfZW4uaHRtbAogICAgICAgSURGcyAyMDA2LCAyMDA3IChJJ20gbm90IHN1cmUgaWYvd2hlcmUgdGhleSBhcmUgb25saW5lKQogCiBUcnVzdGVkIEJvb3QgUHJvamVjdCBPdmVydmlldzoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRydXN0ZWQgQm9vdCAodGJvb3QpIGlzIGFuIG9wZW4gc291cmNlLCBwcmUtIGtlcm5lbC9WTU0gbW9kdWxlIHRoYXQKK1RydXN0ZWQgQm9vdCAodGJvb3QpIGlzIGFuIG9wZW4gc291cmNlLCBwcmUta2VybmVsL1ZNTSBtb2R1bGUgdGhhdAogdXNlcyBJbnRlbCBUWFQgdG8gcGVyZm9ybSBhIG1lYXN1cmVkIGFuZCB2ZXJpZmllZCBsYXVuY2ggb2YgYW4gT1MKIGtlcm5lbC9WTU0uCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dAppbmRleCBkZDU4MDZmLi4yZWMzZDdkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CkBAIC03NCw3ICs3NCw3IEBACiAweDEwCTAwLTBGCWRyaXZlcnMvY2hhci9zMzkwL3ZtY3AuaAogMHgxMglhbGwJbGludXgvZnMuaAogCQlsaW51eC9ibGtwZy5oCi0weDFiCWFsbAlJbmZpbmlCYW5kIFN1YnN5c3RlbQk8aHR0cDovL3d3dy5vcGVuaWIub3JnLz4KKzB4MWIJYWxsCUluZmluaUJhbmQgU3Vic3lzdGVtCTxodHRwOi8vaW5maW5pYmFuZC5zb3VyY2Vmb3JnZS5uZXQvPgogMHgyMAlhbGwJZHJpdmVycy9jZHJvbS9jbTIwNi5oCiAweDIyCWFsbAlzY3NpL3NnLmgKICcjJwkwMC0zRglJRUVFIDEzOTQgU3Vic3lzdGVtCUJsb2NrIGZvciB0aGUgZW50aXJlIHN1YnN5c3RlbQpAQCAtMTkwLDcgKzE5MCw3IEBACiAnWycJMDAtMDcJbGludXgvdXNiL3RtYy5oCQlVU0IgVGVzdCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlcwogCQkJCQk8bWFpbHRvOmdyZWdraEBzdXNlLmRlPgogJ2EnCWFsbAlsaW51eC9hdG0qLmgsIGxpbnV4L3NvbmV0LmgJQVRNIG9uIGxpbnV4Ci0JCQkJCTxodHRwOi8vbHJjd3d3LmVwZmwuY2gvbGludXgtYXRtL21hZ2ljLmh0bWw+CisJCQkJCTxodHRwOi8vbHJjd3d3LmVwZmwuY2gvPgogJ2InCTAwLUZGCQkJCWNvbmZsaWN0ISBiaXQzIHZtZSBob3N0IGJyaWRnZQogCQkJCQk8bWFpbHRvOm5hdGFsaWFAbmlraGVmay5uaWtoZWYubmw+CiAnYicJMDAtMEYJbWVkaWEvYnQ4MTkuaAkJY29uZmxpY3QhCkBAIC0yMjUsNyArMjI1LDcgQEAKICdrJwkwMC0wRglsaW51eC9zcGkvc3BpZGV2LmgJY29uZmxpY3QhCiAnaycJMDAtMDUJdmlkZW8va3lyby5oCQljb25mbGljdCEKICdsJwkwMC0zRglsaW51eC90Y2ZzX2ZzLmgJCXRyYW5zcGFyZW50IGNyeXB0b2dyYXBoaWMgZmlsZSBzeXN0ZW0KLQkJCQkJPGh0dHA6Ly9taWtvbm9zLmRpYS51bmlzYS5pdC90Y2ZzPgorCQkJCQk8aHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vbWlrb25vcy5kaWEudW5pc2EuaXQvdGNmcz4KICdsJwk0MC03RglsaW51eC91ZGZfZnNfaS5oCWluIGRldmVsb3BtZW50OgogCQkJCQk8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC11ZGYvPgogJ20nCTAwLTA5CWxpbnV4L21tdGltZXIuaAkJY29uZmxpY3QhCkBAIC0yNTIsNyArMjUyLDcgQEAKIAkJCQkJPG1haWx0bzpnaW9tZXR0aUBsaW51eC5pdD4KICdxJwkwMC0xRglsaW51eC9zZXJpby5oCiAncScJODAtRkYJbGludXgvdGVsZXBob255LmgJSW50ZXJuZXQgUGhvbmVKQUNLLCBJbnRlcm5ldCBMaW5lSkFDSwotCQlsaW51eC9peGp1c2VyLmgJCTxodHRwOi8vd3d3LnF1aWNrbmV0Lm5ldD4KKwkJbGludXgvaXhqdXNlci5oCQk8aHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vd3d3LnF1aWNrbmV0Lm5ldD4KICdyJwkwMC0xRglsaW51eC9tc2Rvc19mcy5oIGFuZCBmcy9mYXQvZGlyLmMKICdzJwlhbGwJbGludXgvY2RrLmgKICd0JwkwMC03RglsaW51eC9pZl9wcHAuaApAQCAtMjg2LDcgKzI4Niw3IEBACiAweDg5CUYwLUZGCWxpbnV4L3NvY2tpb3MuaAkJU0lPQ0RFVlBSSVZBVEUgcmFuZ2UKIDB4OEIJYWxsCWxpbnV4L3dpcmVsZXNzLmgKIDB4OEMJMDAtM0YJCQkJV2lOUkFEaU8gZHJpdmVyCi0JCQkJCTxodHRwOi8vd3d3LnByb3hpbWl0eS5jb20uYXUvfmJyaWFuL3dpbnJhZGlvLz4KKwkJCQkJPGh0dHA6Ly93d3cud2lucmFkaW8uY29tLmF1Lz4KIDB4OTAJMDAJZHJpdmVycy9jZHJvbS9zYnBjZC5oCiAweDkyCTAwLTBGCWRyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKIDB4OTMJNjAtN0YJbGludXgvYXV0b19mcy5oCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lzZG4vSU5URVJGQUNFLkNBUEkgYi9Eb2N1bWVudGF0aW9uL2lzZG4vSU5URVJGQUNFLkNBUEkKaW5kZXggZjE3MjA5MS4uMzA5ZWI1ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pc2RuL0lOVEVSRkFDRS5DQVBJCisrKyBiL0RvY3VtZW50YXRpb24vaXNkbi9JTlRFUkZBQ0UuQ0FQSQpAQCAtMTEzLDEyICsxMTMsMTYgQEAKIGludCAoKmxvYWRfZmlybXdhcmUpKHN0cnVjdCBjYXBpX2N0ciAqY3RybHIsIGNhcGlsb2FkZGF0YSAqbGRhdGEpCiAJKG9wdGlvbmFsKSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNlbmRpbmcgZmlybXdhcmUgYW5kCiAJY29uZmlndXJhdGlvbiBkYXRhIHRvIHRoZSBkZXZpY2UKKwlUaGUgZnVuY3Rpb24gbWF5IHJldHVybiBiZWZvcmUgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorCUNvbXBsZXRpb24gbXVzdCBiZSBzaWduYWxsZWQgYnkgYSBjYWxsIHRvIGNhcGlfY3RyX3JlYWR5KCkuCiAJUmV0dXJuIHZhbHVlOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKIAlDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LgogCiB2b2lkICgqcmVzZXRfY3RyKShzdHJ1Y3QgY2FwaV9jdHIgKmN0cmxyKQotCShvcHRpb25hbCkgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwZXJmb3JtaW5nIGEgcmVzZXQgb24KLQl0aGUgZGV2aWNlLCByZWxlYXNpbmcgYWxsIHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zCisJKG9wdGlvbmFsKSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0b3BwaW5nIHRoZSBkZXZpY2UsCisJcmVsZWFzaW5nIGFsbCByZWdpc3RlcmVkIGFwcGxpY2F0aW9ucworCVRoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisJQ29tcGxldGlvbiBtdXN0IGJlIHNpZ25hbGxlZCBieSBhIGNhbGwgdG8gY2FwaV9jdHJfZG93bigpLgogCUNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQuCiAKIHZvaWQgKCpyZWdpc3Rlcl9hcHBsKShzdHJ1Y3QgY2FwaV9jdHIgKmN0cmxyLCB1MTYgYXBwbGlkLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRSBiL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUKaW5kZXggNjc4MzQzNy4uY2ZiMTg4NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRQorKysgYi9Eb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FCkBAIC0zNiw3ICszNiw3IEBACiAgICAgIGh0dHA6Ly93d3cubWhlc3NsZXIuZGUvaTRsZmFxLwogICBJdCBjYW4gYmUgdmlld2VkIG9ubGluZSwgb3IgZG93bmxvYWRlZCBpbiBzZ21sL3RleHQvaHRtbCBmb3JtYXQuCiAgIFRoZSBGQVEgY2FuIGFsc28gYmUgdmlld2VkIG9ubGluZSBhdAotICAgICBodHRwOi8vd3d3LmlzZG40aW51eC5kZS9mYXEvCisgICAgIGh0dHA6Ly93d3cuaXNkbjRsaW51eC5kZS9mYXEvCiAgIG9yIGRvd25sb2FkZWQgZnJvbQogICAgICBmdHA6Ly9mdHAuaXNkbjRsaW51eC5kZS9wdWIvaXNkbjRsaW51eC9GQVEvCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXggYi9Eb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FLkhpU2F4CmluZGV4IDAzMWM4ZDguLjk5ZTg3YTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXgKKysrIGIvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5IaVNheApAQCAtNDg2LDcgKzQ4Niw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBTZWUKLSAgIGh0dHA6Ly93d3cuc3R1ZC51bmktd3VwcGVydGFsLmRlL35lYTAxNDEvcGNtY2lhLmh0bWwKKyAgIGh0dHA6Ly93d3cubGludXgubm8vdGVsZXNfY3MudHh0IAogZm9yIGluc3RydWN0aW9ucy4KIAogQXBwZW5kaXg6IExpbnV4IGFuZCBJU0ROLWxlYXNlZCBsaW5lcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5naWdhc2V0IGIvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5naWdhc2V0CmluZGV4IGU0NzJkZjguLmVmMzM0M2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuZ2lnYXNldAorKysgYi9Eb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FLmdpZ2FzZXQKQEAgLTQ3LDkgKzQ3LDkgQEAKIAogMS4yLiBTb2Z0d2FyZQogICAgICAtLS0tLS0tLQotICAgICBUaGUgZHJpdmVyIHdvcmtzIHdpdGggSVNETjRsaW51eCBhbmQgc28gY2FuIGJlIHVzZWQgd2l0aCBhbnkgc29mdHdhcmUKLSAgICAgd2hpY2ggaXMgYWJsZSB0byB1c2UgSVNETjRsaW51eCBmb3IgSVNETiBjb25uZWN0aW9ucyAodm9pY2Ugb3IgZGF0YSkuCi0gICAgIEV4cGVyaW1lbnRhbCBLZXJuZWwgQ0FQSSBzdXBwb3J0IGlzIGF2YWlsYWJsZSBhcyBhIGNvbXBpbGF0aW9uIG9wdGlvbi4KKyAgICAgVGhlIGRyaXZlciB3b3JrcyB3aXRoIHRoZSBLZXJuZWwgQ0FQSSBzdWJzeXN0ZW0gYXMgd2VsbCBhcyB0aGUgb2xkCisgICAgIElTRE40TGludXggc3Vic3lzdGVtLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBzb2Z0d2FyZSB3aGljaCBpcyBhYmxlCisgICAgIHRvIHVzZSBDQVBJIDIuMCBvciBJU0RONExpbnV4IGZvciBJU0ROIGNvbm5lY3Rpb25zICh2b2ljZSBvciBkYXRhKS4KIAogICAgICBUaGVyZSBhcmUgc29tZSB1c2VyIHNwYWNlIHRvb2xzIGF2YWlsYWJsZSBhdAogICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2dpZ2FzZXQzMDd4LwpAQCAtMTUyLDYxICsxNTIsNDIgQEAKICAgICAgLSBHSUdWRVJfRldCQVNFOiByZXRyaWV2ZSB0aGUgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICBVcG9uIHJldHVybiwgdmVyc2lvbltdIGlzIGZpbGxlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KIAotMi4zLiBJU0RONGxpbnV4Ci0gICAgIC0tLS0tLS0tLS0KLSAgICAgVGhpcyBpcyB0aGUgIm5vcm1hbCIgbW9kZSBvZiBvcGVyYXRpb24uIEFmdGVyIGxvYWRpbmcgdGhlIG1vZHVsZSB5b3UgY2FuCi0gICAgIHNldCB1cCB0aGUgSVNETiBzeXN0ZW0ganVzdCBhcyB5b3UnZCBkbyB3aXRoIGFueSBJU0ROIGNhcmQgc3VwcG9ydGVkIGJ5Ci0gICAgIHRoZSBJU0RONExpbnV4IHN1YnN5c3RlbS4gTW9zdCBkaXN0cmlidXRpb25zIHByb3ZpZGUgc29tZSBjb25maWd1cmF0aW9uCi0gICAgIHV0aWxpdHkuIElmIG5vdCwgeW91IGNhbiB1c2Ugc29tZSBIT1dUT3MgbGlrZQotICAgICAgICAgaHR0cDovL3d3dy5saW51eGhhdmVuLmRlL2RsaHAvSE9XVE8vREUtSVNETi1IT1dUTy01Lmh0bWwKLSAgICAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIGJlY2F1c2UgeW91IGhhdmUgc29tZSBkZXZpY2UgbGlrZSBTWDEwMCB3aGVyZQotICAgICBkZWJ1ZyBvdXRwdXQgKHNlZSBzZWN0aW9uIDMuMi4pIHNob3dzIHNvbWV0aGluZyBsaWtlIHRoaXMgd2hlbiBkaWFsaW5nCi0gICAgICAgICBDTUQgUmVjZWl2ZWQ6IEVSUk9SCi0gICAgICAgICBBdmFpbGFibGUgUGFyYW1zOiAwCi0gICAgICAgICBDb25uZWN0aW9uIFN0YXRlOiAwLCBSZXNwb25zZTogLTEKLSAgICAgICAgIGdpZ2FzZXRfcHJvY2Vzc19yZXNwb25zZTogcmVzcF9jb2RlIC0xIGluIENvblN0YXRlIDAgIQotICAgICAgICAgVGltZW91dCBvY2N1cnJlZAotICAgICB5b3UgcHJvYmFibHkgbmVlZCB0byB1c2UgdW5pbW9kZW0gbW9kZS4gKHNlZSBzZWN0aW9uIDIuNS4pCi0KLTIuNC4gQ0FQSQorMi4zLiBDQVBJCiAgICAgIC0tLS0KICAgICAgSWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRoIENBUEkgc3VwcG9ydCAoa2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uCi0gICAgIEdJR0FTRVRfQ0FQSSwgZXhwZXJpbWVudGFsKSBpdCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggQ0FQSSAyLjAga2VybmVsIGFuZAotICAgICB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucy4gRm9yIHVzZXIgc3BhY2UgYWNjZXNzLCB0aGUgbW9kdWxlIGNhcGkua28gbXVzdAotICAgICBiZSBsb2FkZWQuIFRoZSBjYXBpaW5pdCBjb21tYW5kIChpbmNsdWRlZCBpbiB0aGUgY2FwaTRrLXV0aWxzIHBhY2thZ2UpCi0gICAgIGRvZXMgdGhpcyBmb3IgeW91LgorICAgICBHSUdBU0VUX0NBUEkpIHRoZSBkZXZpY2VzIHdpbGwgc2hvdyB1cCBhcyBDQVBJIGNvbnRyb2xsZXJzIGFzIHNvb24gYXMgdGhlCisgICAgIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQsIGFuZCBjYW4gdGhlbiBiZSB1c2VkIHdpdGggQ0FQSSAyLjAKKyAgICAga2VybmVsIGFuZCB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucy4gRm9yIHVzZXIgc3BhY2UgYWNjZXNzLCB0aGUgbW9kdWxlCisgICAgIGNhcGkua28gbXVzdCBiZSBsb2FkZWQuCiAKLSAgICAgVGhlIENBUEkgdmFyaWFudCBvZiB0aGUgZHJpdmVyIHN1cHBvcnRzIGxlZ2FjeSBJU0RONExpbnV4IGFwcGxpY2F0aW9ucwotICAgICB2aWEgdGhlIGNhcGlkcnYgY29tcGF0aWJpbGl0eSBkcml2ZXIuIFRoZSBrZXJuZWwgbW9kdWxlIGNhcGlkcnYua28gbXVzdAotICAgICBiZSBsb2FkZWQgZXhwbGljaXRseSB3aXRoIHRoZSBjb21tYW5kCisgICAgIExlZ2FjeSBJU0RONExpbnV4IGFwcGxpY2F0aW9ucyBhcmUgc3VwcG9ydGVkIHZpYSB0aGUgY2FwaWRydgorICAgICBjb21wYXRpYmlsaXR5IGRyaXZlci4gVGhlIGtlcm5lbCBtb2R1bGUgY2FwaWRydi5rbyBtdXN0IGJlIGxvYWRlZAorICAgICBleHBsaWNpdGx5IHdpdGggdGhlIGNvbW1hbmQKICAgICAgICAgbW9kcHJvYmUgY2FwaWRydgogICAgICBpZiBuZWVkZWQsIGFuZCBjYW5ub3QgYmUgdW5sb2FkZWQgYWdhaW4gd2l0aG91dCB1bmxvYWRpbmcgdGhlIGRyaXZlcgogICAgICBmaXJzdC4gKFRoZXNlIGFyZSBsaW1pdGF0aW9ucyBvZiBjYXBpZHJ2LikKIAotICAgICBUaGUgbm90ZSBhYm91dCB1bmltb2RlbSBtb2RlIGluIHRoZSBwcmVjZWRpbmcgc2VjdGlvbiBhcHBsaWVzIGhlcmUsIHRvby4KKyAgICAgTW9zdCBkaXN0cmlidXRpb25zIGhhbmRsZSBsb2FkaW5nIGFuZCB1bmxvYWRpbmcgb2YgdGhlIHZhcmlvdXMgQ0FQSQorICAgICBtb2R1bGVzIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBjb21tYW5kIGNhcGlpbml0KDEpIGZyb20gdGhlIGNhcGk0ay11dGlscworICAgICBwYWNrYWdlIG9yIGEgc2ltaWxhciBtZWNoYW5pc20uIE5vdGUgdGhhdCBjYXBpaW5pdCgxKSBjYW5ub3QgdW5sb2FkIHRoZQorICAgICBHaWdhc2V0IGRyaXZlcnMgYmVjYXVzZSBpdCBkb2Vzbid0IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBtb2R1bGUgcGVyCisgICAgIGRyaXZlci4KKworMi40LiBJU0RONExpbnV4CisgICAgIC0tLS0tLS0tLS0KKyAgICAgSWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRob3V0IENBUEkgc3VwcG9ydCAobmF0aXZlIElTRE40TGludXgKKyAgICAgdmFyaWFudCksIGl0IHJlZ2lzdGVycyB0aGUgZGV2aWNlIHdpdGggdGhlIGxlZ2FjeSBJU0RONExpbnV4IHN1YnN5c3RlbQorICAgICBhZnRlciBsb2FkaW5nIHRoZSBtb2R1bGUuIEl0IGNhbiB0aGVuIGJlIHVzZWQgd2l0aCBJU0RONExpbnV4CisgICAgIGFwcGxpY2F0aW9ucyBvbmx5LiBNb3N0IGRpc3RyaWJ1dGlvbnMgcHJvdmlkZSBzb21lIGNvbmZpZ3VyYXRpb24gdXRpbGl0eQorICAgICBmb3Igc2V0dGluZyB1cCB0aGF0IHN1YnN5c3RlbS4gT3RoZXJ3aXNlIHlvdSBjYW4gdXNlIHNvbWUgSE9XVE9zIGxpa2UKKyAgICAgICAgIGh0dHA6Ly93d3cubGludXhoYXZlbi5kZS9kbGhwL0hPV1RPL0RFLUlTRE4tSE9XVE8tNS5odG1sCisKIAogMi41LiBVbmltb2RlbSBtb2RlCiAgICAgIC0tLS0tLS0tLS0tLS0KLSAgICAgVGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgZGV2aWNlcyBbZS5nLiBTWDEwMF0gYXMgdGhleSBoYXZlIHByb2JsZW1zIHdpdGgKLSAgICAgdGhlICJub3JtYWwiIGNvbW1hbmRzLgotCi0gICAgIElmIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgY29tbWFuZCBsaW5lIHRvb2wgZ2lnYWNvbnRyLCB5b3UgY2FuIGVudGVyCi0gICAgIHVuaW1vZGVtIG1vZGUgdXNpbmcKLSAgICAgICAgIGdpZ2Fjb250ciAtLW1vZGUgdW5pbW9kZW0KLSAgICAgWW91IGNhbiBzd2l0Y2ggYmFjayB1c2luZwotICAgICAgICAgZ2lnYWNvbnRyIC0tbW9kZSBpc2RuCi0KLSAgICAgWW91IGNhbiBhbHNvIHB1dCB0aGUgZHJpdmVyIGRpcmVjdGx5IGludG8gVW5pbW9kZW0gbW9kZSB3aGVuIGl0J3MgbG9hZGVkLAotICAgICBieSBwYXNzaW5nIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHN0YXJ0bW9kZT0wIHRvIHRoZSBoYXJkd2FyZSBzcGVjaWZpYwotICAgICBtb2R1bGUsIGUuZy4KLQltb2Rwcm9iZSB1c2JfZ2lnYXNldCBzdGFydG1vZGU9MAotICAgICBvciBieSBhZGRpbmcgYSBsaW5lIGxpa2UKLQlvcHRpb25zIHVzYl9naWdhc2V0IHN0YXJ0bW9kZT0wCi0gICAgIHRvIGFuIGFwcHJvcHJpYXRlIG1vZHVsZSBjb25maWd1cmF0aW9uIGZpbGUsIGxpa2UgL2V0Yy9tb2Rwcm9iZS5kL2dpZ2FzZXQKLSAgICAgb3IgL2V0Yy9tb2Rwcm9iZS5jb25mLmxvY2FsLgotCiAgICAgIEluIHRoaXMgbW9kZSB0aGUgZGV2aWNlIHdvcmtzIGxpa2UgYSBtb2RlbSBjb25uZWN0ZWQgdG8gYSBzZXJpYWwgcG9ydAogICAgICAodGhlIC9kZXYvdHR5R1UwLCAuLi4gbWVudGlvbmVkIGFib3ZlKSB3aGljaCB1bmRlcnN0YW5kcyB0aGUgY29tbWFuZHMKKwogICAgICAgICAgQVRaICAgICAgICAgICAgICAgICBpbml0LCByZXNldAogICAgICAgICAgICAgID0+IE9LIG9yIEVSUk9SCiAgICAgICAgICBBVEQKQEAgLTIzNCw2ICsyMTUsMzEgQEAKICAgICAgdG8gYW4gYXBwcm9wcmlhdGUgbW9kdWxlIGNvbmZpZ3VyYXRpb24gZmlsZSwgbGlrZSAvZXRjL21vZHByb2JlLmQvZ2lnYXNldAogICAgICBvciAvZXRjL21vZHByb2JlLmNvbmYubG9jYWwuCiAKKyAgICAgVW5pbW9kZW0gbW9kZSBpcyBuZWVkZWQgZm9yIG1ha2luZyBzb21lIGRldmljZXMgW2UuZy4gU1gxMDBdIHdvcmsgd2hpY2gKKyAgICAgZG8gbm90IHN1cHBvcnQgdGhlIHJlZ3VsYXIgR2lnYXNldCBjb21tYW5kIHNldC4gSWYgZGVidWcgb3V0cHV0IChzZWUKKyAgICAgc2VjdGlvbiAzLjIuKSBzaG93cyBzb21ldGhpbmcgbGlrZSB0aGlzIHdoZW4gZGlhbGluZzoKKyAgICAgICAgIENNRCBSZWNlaXZlZDogRVJST1IKKyAgICAgICAgIEF2YWlsYWJsZSBQYXJhbXM6IDAKKyAgICAgICAgIENvbm5lY3Rpb24gU3RhdGU6IDAsIFJlc3BvbnNlOiAtMQorICAgICAgICAgZ2lnYXNldF9wcm9jZXNzX3Jlc3BvbnNlOiByZXNwX2NvZGUgLTEgaW4gQ29uU3RhdGUgMCAhCisgICAgICAgICBUaW1lb3V0IG9jY3VycmVkCisgICAgIHRoZW4gc3dpdGNoaW5nIHRvIHVuaW1vZGVtIG1vZGUgbWF5IGhlbHAuCisKKyAgICAgSWYgeW91IGhhdmUgaW5zdGFsbGVkIHRoZSBjb21tYW5kIGxpbmUgdG9vbCBnaWdhY29udHIsIHlvdSBjYW4gZW50ZXIKKyAgICAgdW5pbW9kZW0gbW9kZSB1c2luZworICAgICAgICAgZ2lnYWNvbnRyIC0tbW9kZSB1bmltb2RlbQorICAgICBZb3UgY2FuIHN3aXRjaCBiYWNrIHVzaW5nCisgICAgICAgICBnaWdhY29udHIgLS1tb2RlIGlzZG4KKworICAgICBZb3UgY2FuIGFsc28gcHV0IHRoZSBkcml2ZXIgZGlyZWN0bHkgaW50byBVbmltb2RlbSBtb2RlIHdoZW4gaXQncyBsb2FkZWQsCisgICAgIGJ5IHBhc3NpbmcgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgc3RhcnRtb2RlPTAgdG8gdGhlIGhhcmR3YXJlIHNwZWNpZmljCisgICAgIG1vZHVsZSwgZS5nLgorCW1vZHByb2JlIHVzYl9naWdhc2V0IHN0YXJ0bW9kZT0wCisgICAgIG9yIGJ5IGFkZGluZyBhIGxpbmUgbGlrZQorCW9wdGlvbnMgdXNiX2dpZ2FzZXQgc3RhcnRtb2RlPTAKKyAgICAgdG8gYW4gYXBwcm9wcmlhdGUgbW9kdWxlIGNvbmZpZ3VyYXRpb24gZmlsZSwgbGlrZSAvZXRjL21vZHByb2JlLmQvZ2lnYXNldAorICAgICBvciAvZXRjL21vZHByb2JlLmNvbmYubG9jYWwuCisKIDIuNi4gQ2FsbC1JRCAoQ0lEKSBtb2RlCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDYWxsLUlEcyBhcmUgbnVtYmVycyB1c2VkIHRvIHRhZyBjb21tYW5kcyB0bywgYW5kIHJlc3BvbnNlcyBmcm9tLCB0aGUKQEAgLTI2Myw3ICsyNjksMjIgQEAKICAgICAgY2hhbmdlIGl0cyBDSUQgbW9kZSB3aGlsZSB0aGUgZHJpdmVyIGlzIGxvYWRlZCwgZWcuCiAgICAgICAgIGVjaG8gMCA+IC9zeXMvY2xhc3MvdHR5L3R0eUdVMC9jaWRtb2RlCiAKLTIuNy4gVW5yZWdpc3RlcmVkIFdpcmVsZXNzIERldmljZXMgKE0xMDEvTTEwNSkKKzIuNy4gRGlhbGluZyBOdW1iZXJzCisgICAgIC0tLS0tLS0tLS0tLS0tLQorICAgICBUaGUgY2FsbGVkIHBhcnR5IG51bWJlciBwcm92aWRlZCBieSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlhbGluZyBvdXQgbXVzdAorICAgICBiZSBhIHB1YmxpYyBuZXR3b3JrIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsIGRpYWxpbmcgcGxhbiwgd2l0aG91dAorICAgICBhbnkgZGlhbCBwcmVmaXggZm9yIGdldHRpbmcgYW4gb3V0c2lkZSBsaW5lLgorCisgICAgIEludGVybmFsIGNhbGxzIGNhbiBiZSBtYWRlIGJ5IHByb3ZpZGluZyBhbiBpbnRlcm5hbCBleHRlbnNpb24gbnVtYmVyCisgICAgIHByZWZpeGVkIHdpdGggIioqIiAodHdvIGFzdGVyaXNrcykgYXMgdGhlIGNhbGxlZCBwYXJ0eSBudW1iZXIuIFNvIHRvIGRpYWwKKyAgICAgZWcuIHRoZSBmaXJzdCByZWdpc3RlcmVkIERFQ1QgaGFuZHNldCwgZ2l2ZSAiKioxMSIgYXMgdGhlIGNhbGxlZCBwYXJ0eQorICAgICBudW1iZXIuIERpYWxpbmcgIioqKiIgKHRocmVlIGFzdGVyaXNrcykgY2FsbHMgYWxsIGV4dGVuc2lvbnMKKyAgICAgc2ltdWx0YW5lb3VzbHkgKGdsb2JhbCBjYWxsKS4KKworICAgICBUaGlzIGhvbGRzIGZvciBib3RoIENBUEkgMi4wIGFuZCBJU0RONExpbnV4IGFwcGxpY2F0aW9ucy4gVW5pbW9kZW0gbW9kZQorICAgICBkb2VzIG5vdCBzdXBwb3J0IGludGVybmFsIGNhbGxzLgorCisyLjguIFVucmVnaXN0ZXJlZCBXaXJlbGVzcyBEZXZpY2VzIChNMTAxL00xMDUpCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIHNlcl9naWdhc2V0IGFuZCB1c2JfZ2lnYXNldCBkcml2ZXJzIGlzIHRvIGFsbG93CiAgICAgIHRoZSBNMTAxIGFuZCBNMTA1IHdpcmVsZXNzIGRldmljZXMgdG8gYmUgdXNlZCBhcyBJU0ROIGRldmljZXMgZm9yIElTRE4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vamFfSlAvSE9XVE8gYi9Eb2N1bWVudGF0aW9uL2phX0pQL0hPV1RPCmluZGV4IDU1NDc2OTguLmI2MzMwMWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vamFfSlAvSE9XVE8KKysrIGIvRG9jdW1lbnRhdGlvbi9qYV9KUC9IT1dUTwpAQCAtMjIzLDcgKzIyMyw3IEBACiDjgYLjgarjgZ/jgYzjganjgZPjgYvjgonjgrnjgr/jg7zjg4jjgZfjgaboia/jgYTjgYvjgo/jgYvjgonjgarjgYTjgYzjgIFMaW51eCDjgqvjg7zjg43jg6vplovnmbrjgrPjg5/jg6UKIOODi+ODhuOCo+OBq+WPguWKoOOBl+OBpuS9leOBi+OBmeOCi+OBk+OBqOOCkuOBleOBjOOBl+OBpuOBhOOCi+WgtOWQiOOBq+OBr+OAgUxpbnV4IGtlcm5lbAogSmFuaXRvcidzIOODl+ODreOCuOOCp+OCr+ODiOOBq+OBhOOBkeOBsOiJr+OBhOOBp+OBl+OCh+OBhiAtCi0JaHR0cDovL2phbml0b3Iua2VybmVsbmV3Ymllcy5vcmcvCisJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnL0tlcm5lbEphbml0b3JzCiDjgZPjgZPjga/jgZ3jga7jgojjgYbjgarjgrnjgr/jg7zjg4jjgpLjgZnjgovjga7jgavjgYbjgaPjgabjgaTjgZHjga7loLTmiYDjgafjgZnjgILjgZPjgZPjgavjga/jgIEKIExpbnV4IOOCq+ODvOODjeODq+OCveODvOOCueODhOODquODvOOBruS4reOBq+WQq+OBvuOCjOOCi+OAgeOBjeOCjOOBhOOBq+OBl+OAgeS/ruato+OBl+OBquOBkeOCjOOBsOOBqgog44KJ44Gq44GE44CB5Y2Y57SU44Gq5ZWP6aGM44Gu44Oq44K544OI44GM6KiY6L+w44GV44KM44Gm44GE44G+44GZ44CC44GT44Gu44OX44Ot44K444Kn44Kv44OI44Gr6Zai44KP44KLCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2phX0pQL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9qYV9KUC9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCBhOWRjMTI0Li5mMTA3YzgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2phX0pQL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vamFfSlAvU3VibWl0dGluZ1BhdGNoZXMKQEAgLTk3LDcgKzk3LDcgQEAKIGh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0CiAKIEFuZHJldyBNb3J0b24ncyBwYXRjaCBzY3JpcHRzOgotaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4L3BhdGNoZXMvCitodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35ha3BtL3N0dWZmL3RwcC50eHQKIOOBk+OBruODquODs+OCr+OBruWFiOOBruOCueOCr+ODquODl+ODiOOBruS7o+OCj+OCiuOBqOOBl+OBpuOAgXF1aWx0IOOBjOODkeODg+ODgeODnuODjeOCuOODoeODs+ODiAog44OE44O844Or44Go44GX44Gm5o6o5aWo44GV44KM44Gm44GE44G+44GZKOS4iuOBruODquODs+OCr+OCkuimi+OBpuOBj+OBoOOBleOBhCnjgIIKIApAQCAtMjEwLDcgKzIxMCw3IEBACiAg44O756e75qSN5oCn44Gu44Gq44GE44Kz44O844OJ44GL44KJ56e75qSN5oCn44Gu44GC44KL44Kz44O844OJ44G444Gu572u44GN5o+b44GIKOWwj+OBleOBhOevhOWbsuOBpwogICAg44GC44KM44Gw44Ki44O844Kt44OG44Kv44OB44Oj54m55pyJ44Gu44GT44Go44Gn44KC5LuW44Gu5Lq644GM44Kz44OU44O844Gn44GN44G+44GZKQogIOODu+S9nOiAheOChOODoeODs+ODhuODiuOBq+OCiOOCi+S/ruatoyjjgZnjgarjgo/jgaEgcGF0Y2ggbW9ua2V5IOOBruWGjei7oumAgeODouODvOODiSkKLVVSTDogPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9idW5rL3RyaXZpYWwvPgorRU1BSUw6IDx0cml2aWFsQGtlcm5lbC5vcmc+CiAKIDcpIE1JTUUg44KE44Oq44Oz44Kv44KE5Zyn57iu44OV44Kh44Kk44Or44KE5re75LuY44OV44Kh44Kk44Or44Gn44Gv44Gq44GP44OX44Os44Kk44Oz44OG44Kt44K544OI44Gu44G/CiAKQEAgLTUzNCw3ICs1MzQsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBbmRyZXcgTW9ydG9uLCAiVGhlIHBlcmZlY3QgcGF0Y2giICh0cHApLgotICA8aHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4L3BhdGNoZXMvc3R1ZmYvdHBwLnR4dD4KKyAgPGh0dHA6Ly91c2Vyd2ViLmtlcm5lbC5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dD4KIAogSmVmZiBHYXJ6aWssICJMaW51eCBrZXJuZWwgcGF0Y2ggc3VibWlzc2lvbiBmb3JtYXQiLgogICA8aHR0cDovL2xpbnV4Lnl5ei51cy9wYXRjaC1mb3JtYXQuaHRtbD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CmluZGV4IDYzNGM2MjUuLjFlNTE2NWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dApAQCAtMjIsMTEgKzIyLDMzIEBACiAKIEtBRkxBR1MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BZGRpdGlvbmFsIG9wdGlvbnMgdG8gdGhlIGFzc2VtYmxlci4KK0FkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgYXNzZW1ibGVyIChmb3IgYnVpbHQtaW4gYW5kIG1vZHVsZXMpLgorCitBRkxBR1NfTU9EVUxFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRkdGlvbmFsIG1vZHVsZSBzcGVjaWZpYyBvcHRpb25zIHRvIHVzZSBmb3IgJChBUykuCisKK0FGTEFHU19LRVJORUwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBZGR0aW9uYWwgb3B0aW9ucyBmb3IgJChBUykgd2hlbiB1c2VkIGZvciBhc3NlbWJsZXIKK2NvZGUgZm9yIGNvZGUgdGhhdCBpcyBjb21waWxlZCBhcyBidWlsdC1pbi4KIAogS0NGTEFHUwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgQyBjb21waWxlci4KK0FkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgQyBjb21waWxlciAoZm9yIGJ1aWx0LWluIGFuZCBtb2R1bGVzKS4KKworQ0ZMQUdTX0tFUk5FTAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FkZHRpb25hbCBvcHRpb25zIGZvciAkKENDKSB3aGVuIHVzZWQgdG8gY29tcGlsZQorY29kZSB0aGF0IGlzIGNvbXBpbGVkIGFzIGJ1aWx0LWluLgorCitDRkxBR1NfTU9EVUxFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRkdGlvbmFsIG1vZHVsZSBzcGVjaWZpYyBvcHRpb25zIHRvIHVzZSBmb3IgJChDQykuCisKK0xERkxBR1NfTU9EVUxFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRkaXRpb25hbCBvcHRpb25zIHVzZWQgZm9yICQoTEQpIHdoZW4gbGlua2luZyBtb2R1bGVzLgogCiBLQlVJTERfVkVSQk9TRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQwLDE1ICs2MiwxNSBAQAogbW9kdWxlcy4KIFRoZSBkaXJlY3RvcnkgY2FuIGJlIHNwZWNpZmllZCBpbiBzZXZlcmFsIHdheXM6CiAxKSBVc2UgIk09Li4uIiBvbiB0aGUgY29tbWFuZCBsaW5lCi0yKSBFbnZpcm9ubW5ldCB2YXJpYWJsZSBLQlVJTERfRVhUTU9ECi0zKSBFbnZpcm9ubW5ldCB2YXJpYWJsZSBTVUJESVJTCisyKSBFbnZpcm9ubWVudCB2YXJpYWJsZSBLQlVJTERfRVhUTU9ECiszKSBFbnZpcm9ubWVudCB2YXJpYWJsZSBTVUJESVJTCiBUaGUgcG9zc2liaWxpdGllcyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciB0aGV5IHRha2UgcHJlY2VkZW5jZS4KIFVzaW5nICJNPS4uLiIgd2lsbCBhbHdheXMgb3ZlcnJpZGUgdGhlIG90aGVycy4KIAogS0JVSUxEX09VVFBVVAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNwZWNpZnkgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2hlbiBidWlsZGluZyB0aGUga2VybmVsLgotVGhlIG91dHB1dCBkaXJlY3RvcnkgY2FuIGFsc28gYmUgc3BlY2lmaWNlZCB1c2luZyAiTz0uLi4iLgorVGhlIG91dHB1dCBkaXJlY3RvcnkgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHVzaW5nICJPPS4uLiIuCiBTZXR0aW5nICJPPS4uLiIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIEtCVUlMRF9PVVRQVVQuCiAKIEFSQ0gKQEAgLTkwLDcgKzExMiw3IEBACiAgICAgJDMgLSBrZXJuZWwgbWFwIGZpbGUKICAgICAkNCAtIGRlZmF1bHQgaW5zdGFsbCBwYXRoICh1c2Ugcm9vdCBkaXJlY3RvcnkgaWYgYmxhbmspCiAKLVRoZSBpbXBsbWVudGF0aW9uIG9mICJtYWtlIGluc3RhbGwiIGlzIGFyY2hpdGVjdHVyZSBzcGVjaWZpYworVGhlIGltcGxlbWVudGF0aW9uIG9mICJtYWtlIGluc3RhbGwiIGlzIGFyY2hpdGVjdHVyZSBzcGVjaWZpYwogYW5kIGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgYWJvdmUuCiAKIElOU1RBTExLRVJORUwgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIHRoZSBwb3NzaWJpbGl0eSB0bwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLnR4dAppbmRleCBiMmNiMTZlLi5jY2E0NmIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLnR4dApAQCAtNjUsNyArNjUsNyBAQAogZmlsZW5hbWUgdGhhdCBjb250YWlucyBjb25maWcgc3ltYm9scyB0aGF0IHRoZSB1c2VyIHJlcXVpcmVzIHRvIGJlCiBzZXQgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gIElmIEtDT05GSUdfQUxMQ09ORklHIGlzIHVzZWQgd2l0aG91dCBhCiBmaWxlbmFtZSwgIm1ha2UgKmNvbmZpZyIgY2hlY2tzIGZvciBhIGZpbGUgbmFtZWQKLSJhbGx7eWVzL21vZC9uby9yYW5kb219LmNvbmZpZyIgKGNvcnJlc3BvbmRpbmcgdG8gdGhlICpjb25maWcgY29tbWFuZAorImFsbHt5ZXMvbW9kL25vL2RlZi9yYW5kb219LmNvbmZpZyIgKGNvcnJlc3BvbmRpbmcgdG8gdGhlICpjb25maWcgY29tbWFuZAogdGhhdCB3YXMgdXNlZCkgZm9yIHN5bWJvbCB2YWx1ZXMgdGhhdCBhcmUgdG8gYmUgZm9yY2VkLiAgSWYgdGhpcyBmaWxlCiBpcyBub3QgZm91bmQsIGl0IGNoZWNrcyBmb3IgYSBmaWxlIG5hbWVkICJhbGwuY29uZmlnIiB0byBjb250YWluIGZvcmNlZAogdmFsdWVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKaW5kZXggNzFjNjAyZC4uYzM3NTMxMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJI2RyaXZlcnMvaXNkbi9pNGwvTWFrZWZpbGUKIAkJIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBJU0ROIHN1YnN5c3RlbSBhbmQgZGV2aWNlIGRyaXZlcnMuCiAJCSMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KLQkJb2JqLSQoQ09ORklHX0lTRE4pICAgICAgICAgICAgICs9IGlzZG4ubworCQlvYmotJChDT05GSUdfSVNETl9JNEwpICAgICAgICAgKz0gaXNkbi5vCiAJCW9iai0kKENPTkZJR19JU0ROX1BQUF9CU0RDT01QKSArPSBpc2RuX2JzZGNvbXAubwogCiAtLS0gMy4zIExvYWRhYmxlIG1vZHVsZSBnb2FscyAtIG9iai1tCkBAIC0xODcsMzQgKzE4NywzNSBAQAogCU5vdGU6IEluIHRoaXMgZXhhbXBsZSAkKENPTkZJR19JU0ROX1BQUF9CU0RDT01QKSBldmFsdWF0ZXMgdG8gJ20nCiAKIAlJZiBhIGtlcm5lbCBtb2R1bGUgaXMgYnVpbHQgZnJvbSBzZXZlcmFsIHNvdXJjZSBmaWxlcywgeW91IHNwZWNpZnkKLQl0aGF0IHlvdSB3YW50IHRvIGJ1aWxkIGEgbW9kdWxlIGluIHRoZSBzYW1lIHdheSBhcyBhYm92ZS4KLQotCUtidWlsZCBuZWVkcyB0byBrbm93IHdoaWNoIHRoZSBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGJ1aWxkIHlvdXIKLQltb2R1bGUgZnJvbSwgc28geW91IGhhdmUgdG8gdGVsbCBpdCBieSBzZXR0aW5nIGFuCi0JJCg8bW9kdWxlX25hbWU+LW9ianMpIHZhcmlhYmxlLgorCXRoYXQgeW91IHdhbnQgdG8gYnVpbGQgYSBtb2R1bGUgaW4gdGhlIHNhbWUgd2F5IGFzIGFib3ZlOyBob3dldmVyLAorCWtidWlsZCBuZWVkcyB0byBrbm93IHdoaWNoIG9iamVjdCBmaWxlcyB5b3Ugd2FudCB0byBidWlsZCB5b3VyCisJbW9kdWxlIGZyb20sIHNvIHlvdSBoYXZlIHRvIHRlbGwgaXQgYnkgc2V0dGluZyBhICQoPG1vZHVsZV9uYW1lPi15KQorCXZhcmlhYmxlLgogCiAJRXhhbXBsZToKIAkJI2RyaXZlcnMvaXNkbi9pNGwvTWFrZWZpbGUKLQkJb2JqLSQoQ09ORklHX0lTRE4pICs9IGlzZG4ubwotCQlpc2RuLW9ianMgOj0gaXNkbl9uZXRfbGliLm8gaXNkbl92MTEwLm8gaXNkbl9jb21tb24ubworCQlvYmotJChDT05GSUdfSVNETl9JNEwpICs9IGlzZG4ubworCQlpc2RuLXkgOj0gaXNkbl9uZXRfbGliLm8gaXNkbl92MTEwLm8gaXNkbl9jb21tb24ubwogCiAJSW4gdGhpcyBleGFtcGxlLCB0aGUgbW9kdWxlIG5hbWUgd2lsbCBiZSBpc2RuLm8uIEtidWlsZCB3aWxsCi0JY29tcGlsZSB0aGUgb2JqZWN0cyBsaXN0ZWQgaW4gJChpc2RuLW9ianMpIGFuZCB0aGVuIHJ1bgorCWNvbXBpbGUgdGhlIG9iamVjdHMgbGlzdGVkIGluICQoaXNkbi15KSBhbmQgdGhlbiBydW4KIAkiJChMRCkgLXIiIG9uIHRoZSBsaXN0IG9mIHRoZXNlIGZpbGVzIHRvIGdlbmVyYXRlIGlzZG4uby4KIAotCUtidWlsZCByZWNvZ25pc2VzIG9iamVjdHMgdXNlZCBmb3IgY29tcG9zaXRlIG9iamVjdHMgYnkgdGhlIHN1ZmZpeAotCS1vYmpzLCBhbmQgdGhlIHN1ZmZpeCAteS4gVGhpcyBhbGxvd3MgdGhlIE1ha2VmaWxlcyB0byB1c2UKLQl0aGUgdmFsdWUgb2YgYSBDT05GSUdfIHN5bWJvbCB0byBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIHBhcnQKLQlvZiBhIGNvbXBvc2l0ZSBvYmplY3QuCisJRHVlIHRvIGtidWlsZCByZWNvZ25pemluZyAkKDxtb2R1bGVfbmFtZT4teSkgZm9yIGNvbXBvc2l0ZSBvYmplY3RzLAorCXlvdSBjYW4gdXNlIHRoZSB2YWx1ZSBvZiBhIENPTkZJR18gc3ltYm9sIHRvIG9wdGlvbmFsbHkgaW5jbHVkZSBhbgorCW9iamVjdCBmaWxlIGFzIHBhcnQgb2YgYSBjb21wb3NpdGUgb2JqZWN0LgogCiAJRXhhbXBsZToKIAkJI2ZzL2V4dDIvTWFrZWZpbGUKLQkgICAgICAgIG9iai0kKENPTkZJR19FWFQyX0ZTKSAgICAgICAgKz0gZXh0Mi5vCi0JCWV4dDIteSAgICAgICAgICAgICAgICAgICAgICAgOj0gYmFsbG9jLm8gYml0bWFwLm8KLQkgICAgICAgIGV4dDItJChDT05GSUdfRVhUMl9GU19YQVRUUikgKz0geGF0dHIubworCSAgICAgICAgb2JqLSQoQ09ORklHX0VYVDJfRlMpICs9IGV4dDIubworCQlleHQyLXkgOj0gYmFsbG9jLm8gZGlyLm8gZmlsZS5vIGlhbGxvYy5vIGlub2RlLm8gaW9jdGwubyBcCisJCQkgIG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8KKwkgICAgICAgIGV4dDItJChDT05GSUdfRVhUMl9GU19YQVRUUikgKz0geGF0dHIubyB4YXR0cl91c2VyLm8gXAorCQkJCQkJeGF0dHJfdHJ1c3RlZC5vCiAKLQlJbiB0aGlzIGV4YW1wbGUsIHhhdHRyLm8gaXMgb25seSBwYXJ0IG9mIHRoZSBjb21wb3NpdGUgb2JqZWN0Ci0JZXh0Mi5vIGlmICQoQ09ORklHX0VYVDJfRlNfWEFUVFIpIGV2YWx1YXRlcyB0byAneScuCisJSW4gdGhpcyBleGFtcGxlLCB4YXR0ci5vLCB4YXR0cl91c2VyLm8gYW5kIHhhdHRyX3RydXN0ZWQubyBhcmUgb25seQorCXBhcnQgb2YgdGhlIGNvbXBvc2l0ZSBvYmplY3QgZXh0Mi5vIGlmICQoQ09ORklHX0VYVDJfRlNfWEFUVFIpCisJZXZhbHVhdGVzIHRvICd5Jy4KIAogCU5vdGU6IE9mIGNvdXJzZSwgd2hlbiB5b3UgYXJlIGJ1aWxkaW5nIG9iamVjdHMgaW50byB0aGUga2VybmVsLAogCXRoZSBzeW50YXggYWJvdmUgd2lsbCBhbHNvIHdvcmsuIFNvLCBpZiB5b3UgaGF2ZSBDT05GSUdfRVhUMl9GUz15LApAQCAtMjQ0LDEyICsyNDUsMTIgQEAKIAltYXkgY29udGFpbiBib3RoIGEgYnVpbHQtaW4ubyBhbmQgYSBsaWIuYSBmaWxlLgogCiAJRXhhbXBsZToKLQkJI2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUKLQkJbGliLXkgICAgOj0gY2hlY2tzdW0ubyBkZWxheS5vCisJCSNhcmNoL3g4Ni9saWIvTWFrZWZpbGUKKwkJbGliLXkgICAgOj0gZGVsYXkubwogCi0JVGhpcyB3aWxsIGNyZWF0ZSBhIGxpYnJhcnkgbGliLmEgYmFzZWQgb24gY2hlY2tzdW0ubyBhbmQgZGVsYXkuby4KLQlGb3Iga2J1aWxkIHRvIGFjdHVhbGx5IHJlY29nbml6ZSB0aGF0IHRoZXJlIGlzIGEgbGliLmEgYmVpbmcgYnVpbHQsCi0JdGhlIGRpcmVjdG9yeSBzaGFsbCBiZSBsaXN0ZWQgaW4gbGlicy15LgorCVRoaXMgd2lsbCBjcmVhdGUgYSBsaWJyYXJ5IGxpYi5hIGJhc2VkIG9uIGRlbGF5Lm8uIEZvciBrYnVpbGQgdG8KKwlhY3R1YWxseSByZWNvZ25pemUgdGhhdCB0aGVyZSBpcyBhIGxpYi5hIGJlaW5nIGJ1aWx0LCB0aGUgZGlyZWN0b3J5CisJc2hhbGwgYmUgbGlzdGVkIGluIGxpYnMteS4KIAlTZWUgYWxzbyAiNi4zIExpc3QgZGlyZWN0b3JpZXMgdG8gdmlzaXQgd2hlbiBkZXNjZW5kaW5nIi4KIAogCVVzZSBvZiBsaWIteSBpcyBub3JtYWxseSByZXN0cmljdGVkIHRvIGxpYi8gYW5kIGFyY2gvKi9saWIuCkBAIC0yODQsNDMgKzI4NSw0MCBAQAogLS0tIDMuNyBDb21waWxhdGlvbiBmbGFncwogCiAgICAgY2NmbGFncy15LCBhc2ZsYWdzLXkgYW5kIGxkZmxhZ3MteQotCVRoZSB0aHJlZSBmbGFncyBsaXN0ZWQgYWJvdmUgYXBwbGllcyBvbmx5IHRvIHRoZSBrYnVpbGQgbWFrZWZpbGUKLQl3aGVyZSB0aGV5IGFyZSBhc3NpZ25lZC4gVGhleSBhcmUgdXNlZCBmb3IgYWxsIHRoZSBub3JtYWwKLQljYywgYXMgYW5kIGxkIGludm9jYXRpb24gaGFwcGVuaWduIGR1cmluZyBhIHJlY3Vyc2l2ZSBidWlsZC4KKwlUaGVzZSB0aHJlZSBmbGFncyBhcHBseSBvbmx5IHRvIHRoZSBrYnVpbGQgbWFrZWZpbGUgaW4gd2hpY2ggdGhleQorCWFyZSBhc3NpZ25lZC4gVGhleSBhcmUgdXNlZCBmb3IgYWxsIHRoZSBub3JtYWwgY2MsIGFzIGFuZCBsZAorCWludm9jYXRpb25zIGhhcHBlbmluZyBkdXJpbmcgYSByZWN1cnNpdmUgYnVpbGQuCiAJTm90ZTogRmxhZ3Mgd2l0aCB0aGUgc2FtZSBiZWhhdmlvdXIgd2VyZSBwcmV2aW91c2x5IG5hbWVkOgogCUVYVFJBX0NGTEFHUywgRVhUUkFfQUZMQUdTIGFuZCBFWFRSQV9MREZMQUdTLgotCVRoZXkgYXJlIHlldCBzdXBwb3J0ZWQgYnV0IHRoZWlyIHVzZSBhcmUgZGVwcmVjYXRlZC4KKwlUaGV5IGFyZSBzdGlsbCBzdXBwb3J0ZWQgYnV0IHRoZWlyIHVzYWdlIGlzIGRlcHJlY2F0ZWQuCiAKLQljY2ZsYWdzLXkgc3BlY2lmaWVzIG9wdGlvbnMgZm9yIGNvbXBpbGluZyBDIGZpbGVzIHdpdGggJChDQykuCisJY2NmbGFncy15IHNwZWNpZmllcyBvcHRpb25zIGZvciBjb21waWxpbmcgd2l0aCAkKENDKS4KIAogCUV4YW1wbGU6Ci0JCSMgZHJpdmVycy9zb3VuZC9lbXUxMGsxL01ha2VmaWxlCi0JCWNjZmxhZ3MteSArPSAtSSQob2JqKQotCQljY2ZsYWdzLSQoREVCVUcpICs9IC1ERU1VMTBLMV9ERUJVRwotCisJCSMgZHJpdmVycy9hY3BpL01ha2VmaWxlCisJCWNjZmxhZ3MteSA6PSAtT3MKKwkJY2NmbGFncy0kKENPTkZJR19BQ1BJX0RFQlVHKSArPSAtREFDUElfREVCVUdfT1VUUFVUCiAKIAlUaGlzIHZhcmlhYmxlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSB0b3AgTWFrZWZpbGUgb3ducyB0aGUKIAl2YXJpYWJsZSAkKEtCVUlMRF9DRkxBR1MpIGFuZCB1c2VzIGl0IGZvciBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlCiAJZW50aXJlIHRyZWUuCiAKLQlhc2ZsYWdzLXkgaXMgYSBzaW1pbGFyIHN0cmluZyBmb3IgcGVyLWRpcmVjdG9yeSBvcHRpb25zCi0Jd2hlbiBjb21waWxpbmcgYXNzZW1ibHkgbGFuZ3VhZ2Ugc291cmNlLgorCWFzZmxhZ3MteSBzcGVjaWZpZXMgb3B0aW9ucyBmb3IgYXNzZW1ibGluZyB3aXRoICQoQVMpLgogCiAJRXhhbXBsZToKLQkJI2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQotCQlhc2ZsYWdzLXkgOj0gLXRyYWRpdGlvbmFsCisJCSNhcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQorCQlhc2ZsYWdzLXkgOj0gLWFuc2kKIAotCi0JbGRmbGFncy15IGlzIGEgc3RyaW5nIGZvciBwZXItZGlyZWN0b3J5IG9wdGlvbnMgdG8gJChMRCkuCisJbGRmbGFncy15IHNwZWNpZmllcyBvcHRpb25zIGZvciBsaW5raW5nIHdpdGggJChMRCkuCiAKIAlFeGFtcGxlOgotCQkjYXJjaC9tNjhrL2Zwc3AwNDAvTWFrZWZpbGUKLQkJbGRmbGFncy15IDo9IC14CisJCSNhcmNoL2NyaXMvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisJCWxkZmxhZ3MteSArPSAtVCAkKHNyY3RyZWUpLyQoc3JjKS9kZWNvbXByZXNzXyQoYXJjaC15KS5sZHMKIAogICAgIHN1YmRpci1jY2ZsYWdzLXksIHN1YmRpci1hc2ZsYWdzLXkKLQlUaGUgdHdvIGZsYWdzIGxpc3RlZCBhYm92ZSBhcmUgc2ltaWxhciB0byBjY2ZsYWdzLXkgYW5kIGFzLWZhbGdzLXkuCi0JVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgc3ViZGlyLSB2YXJpYW50cyBoYXMgZWZmZWN0IGZvciB0aGUga2J1aWxkCi0JZmlsZSB3aGVyZSB0ZXkgYXJlIHByZXNlbnQgYW5kIGFsbCBzdWJkaXJlY3Rvcmllcy4KKwlUaGUgdHdvIGZsYWdzIGxpc3RlZCBhYm92ZSBhcmUgc2ltaWxhciB0byBjY2ZsYWdzLXkgYW5kIGFzZmxhZ3MteS4KKwlUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBzdWJkaXItIHZhcmlhbnRzIGhhdmUgZWZmZWN0IGZvciB0aGUga2J1aWxkCisJZmlsZSB3aGVyZSB0aGV5IGFyZSBwcmVzZW50IGFuZCBhbGwgc3ViZGlyZWN0b3JpZXMuCiAJT3B0aW9ucyBzcGVjaWZpZWQgdXNpbmcgc3ViZGlyLSogYXJlIGFkZGVkIHRvIHRoZSBjb21tYW5kbGluZSBiZWZvcmUKIAl0aGUgb3B0aW9ucyBzcGVjaWZpZWQgdXNpbmcgdGhlIG5vbi1zdWJkaXIgdmFyaWFudHMuCiAKQEAgLTM0MCwxOCArMzM4LDE4IEBACiAJCUNGTEFHU19haGExNTJ4Lm8gPSAgIC1EQUhBMTUyWF9TVEFUIC1EQVVUT0NPTkYKIAkJQ0ZMQUdTX2dkdGgubyAgICA9ICMgLURERUJVR19HRFRIPTIgLURfX1NFUklBTF9fIC1EX19DT00yX18gXAogCQkJCSAgICAgLURHRFRIX1NUQVRJU1RJQ1MKLQkJQ0ZMQUdTX3NlYWdhdGUubyA9ICAgLURBUkJJVFJBVEUgLURQQVJJVFkgLURTRUFHQVRFX1VTRV9BU00KIAotCVRoZXNlIHRocmVlIGxpbmVzIHNwZWNpZnkgY29tcGlsYXRpb24gZmxhZ3MgZm9yIGFoYTE1MngubywKLQlnZHRoLm8sIGFuZCBzZWFnYXRlLm8KKwlUaGVzZSB0d28gbGluZXMgc3BlY2lmeSBjb21waWxhdGlvbiBmbGFncyBmb3IgYWhhMTUyeC5vIGFuZCBnZHRoLm8uCiAKIAkkKEFGTEFHU18kQCkgaXMgYSBzaW1pbGFyIGZlYXR1cmUgZm9yIHNvdXJjZSBmaWxlcyBpbiBhc3NlbWJseQogCWxhbmd1YWdlcy4KIAogCUV4YW1wbGU6CiAJCSMgYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCi0JCUFGTEFHU19oZWFkLWFybXYubyA6PSAtRFRFWFRBRERSPSQoVEVYVEFERFIpIC10cmFkaXRpb25hbAotCQlBRkxBR1NfaGVhZC1hcm1vLm8gOj0gLURURVhUQUREUj0kKFRFWFRBRERSKSAtdHJhZGl0aW9uYWwKKwkJQUZMQUdTX2hlYWQubyAgICAgICAgOj0gLURURVhUX09GRlNFVD0kKFRFWFRfT0ZGU0VUKQorCQlBRkxBR1NfY3J1bmNoLWJpdHMubyA6PSAtV2EsLW1jcHU9ZXA5MzEyCisJCUFGTEFHU19pd21teHQubyAgICAgIDo9IC1XYSwtbWNwdT1pd21teHQKKwogCiAtLS0gMy45IERlcGVuZGVuY3kgdHJhY2tpbmcKIApAQCAtOTIzLDE2ICs5MjEsMzMgQEAKIAlUaGUgZmlyc3QgZXhhbXBsZSB1dGlsaXNlcyB0aGUgdHJpY2sgdGhhdCBhIGNvbmZpZyBvcHRpb24gZXhwYW5kcwogCXRvICd5JyB3aGVuIHNlbGVjdGVkLgogCi0gICAgQ0ZMQUdTX0tFUk5FTAkkKENDKSBvcHRpb25zIHNwZWNpZmljIGZvciBidWlsdC1pbgorICAgIEtCVUlMRF9BRkxBR1NfS0VSTkVMCSQoQVMpIG9wdGlvbnMgc3BlY2lmaWMgZm9yIGJ1aWx0LWluCiAKLQkkKENGTEFHU19LRVJORUwpIGNvbnRhaW5zIGV4dHJhIEMgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBjb21waWxlCisJJChLQlVJTERfQUZMQUdTX0tFUk5FTCkgY29udGFpbnMgZXh0cmEgQyBjb21waWxlciBmbGFncyB1c2VkIHRvIGNvbXBpbGUKIAlyZXNpZGVudCBrZXJuZWwgY29kZS4KIAotICAgIENGTEFHU19NT0RVTEUJJChDQykgb3B0aW9ucyBzcGVjaWZpYyBmb3IgbW9kdWxlcworICAgIEtCVUlMRF9BRkxBR1NfTU9EVUxFICAgT3B0aW9ucyBmb3IgJChBUykgd2hlbiBidWlsZGluZyBtb2R1bGVzCiAKLQkkKENGTEFHU19NT0RVTEUpIGNvbnRhaW5zIGV4dHJhIEMgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBjb21waWxlIGNvZGUKLQlmb3IgbG9hZGFibGUga2VybmVsIG1vZHVsZXMuCisJJChLQlVJTERfQUZMQUdTX01PRFVMRSkgaXMgdXNlZCB0byBhZGQgYXJjaCBzcGVjaWZpYyBvcHRpb25zIHRoYXQKKwlhcmUgdXNlZCBmb3IgJChBUykuCisJRnJvbSBjb21tYW5kbGluZSBBRkxBR1NfTU9EVUxFIHNoYWxsIGJlIHVzZWQgKHNlZSBrYnVpbGQudHh0KS4KIAorICAgIEtCVUlMRF9DRkxBR1NfS0VSTkVMCSQoQ0MpIG9wdGlvbnMgc3BlY2lmaWMgZm9yIGJ1aWx0LWluCisKKwkkKEtCVUlMRF9DRkxBR1NfS0VSTkVMKSBjb250YWlucyBleHRyYSBDIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gY29tcGlsZQorCXJlc2lkZW50IGtlcm5lbCBjb2RlLgorCisgICAgS0JVSUxEX0NGTEFHU19NT0RVTEUgICBPcHRpb25zIGZvciAkKENDKSB3aGVuIGJ1aWxkaW5nIG1vZHVsZXMKKworCSQoS0JVSUxEX0NGTEFHU19NT0RVTEUpIGlzIHVzZWQgdG8gYWRkIGFyY2ggc3BlY2lmaWMgb3B0aW9ucyB0aGF0CisJYXJlIHVzZWQgZm9yICQoQ0MpLgorCUZyb20gY29tbWFuZGxpbmUgQ0ZMQUdTX01PRFVMRSBzaGFsbCBiZSB1c2VkIChzZWUga2J1aWxkLnR4dCkuCisKKyAgICBLQlVJTERfTERGTEFHU19NT0RVTEUgICBPcHRpb25zIGZvciAkKExEKSB3aGVuIGxpbmtpbmcgbW9kdWxlcworCisJJChLQlVJTERfTERGTEFHU19NT0RVTEUpIGlzIHVzZWQgdG8gYWRkIGFyY2ggc3BlY2lmaWMgb3B0aW9ucworCXVzZWQgd2hlbiBsaW5raW5nIG1vZHVsZXMuIFRoaXMgaXMgb2Z0ZW4gYSBsaW5rZXIgc2NyaXB0LgorCUZyb20gY29tbWFuZGxpbmUgTERGTEFHU19NT0RVTEUgc2hhbGwgYmUgdXNlZCAoc2VlIGtidWlsZC50eHQpLgogCiAtLS0gNi4yIEFkZCBwcmVyZXF1aXNpdGVzIHRvIGFyY2hwcmVwYXJlOgogCkBAIC0xMTc2LDE0ICsxMTkxLDE0IEBACiA9PT0gNyBLYnVpbGQgc3ludGF4IGZvciBleHBvcnRlZCBoZWFkZXJzCiAKIFRoZSBrZXJuZWwgaW5jbHVkZSBhIHNldCBvZiBoZWFkZXJzIHRoYXQgaXMgZXhwb3J0ZWQgdG8gdXNlcnNwYWNlLgotTWFueSBoZWFkZXJzIGNhbiBiZSBleHBvcnRlZCBhcy1pcyBidXQgb3RoZXIgaGVhZGVycyByZXF1aXJlcyAgYQorTWFueSBoZWFkZXJzIGNhbiBiZSBleHBvcnRlZCBhcy1pcyBidXQgb3RoZXIgaGVhZGVycyByZXF1aXJlIGEKIG1pbmltYWwgcHJlLXByb2Nlc3NpbmcgYmVmb3JlIHRoZXkgYXJlIHJlYWR5IGZvciB1c2VyLXNwYWNlLgogVGhlIHByZS1wcm9jZXNzaW5nIGRvZXM6CiAtIGRyb3Aga2VybmVsIHNwZWNpZmljIGFubm90YXRpb25zCiAtIGRyb3AgaW5jbHVkZSBvZiBjb21waWxlci5oCi0tIGRyb3AgYWxsIHNlY3Rpb25zIHRoYXQgaXMga2VybmVsIGludGVybmF0IChndWFyZGVkIGJ5IGlmZGVmIF9fS0VSTkVMX18pCistIGRyb3AgYWxsIHNlY3Rpb25zIHRoYXQgYXJlIGtlcm5lbCBpbnRlcm5hbCAoZ3VhcmRlZCBieSBpZmRlZiBfX0tFUk5FTF9fKQogCi1FYWNoIHJlbGV2YW50IGRpcmVjdG9yeSBjb250YWluIGEgZmlsZSBuYW1lICJLYnVpbGQiIHdoaWNoIHNwZWNpZnkgdGhlCitFYWNoIHJlbGV2YW50IGRpcmVjdG9yeSBjb250YWlucyBhIGZpbGUgbmFtZSAiS2J1aWxkIiB3aGljaCBzcGVjaWZpZXMgdGhlCiBoZWFkZXJzIHRvIGJlIGV4cG9ydGVkLgogU2VlIHN1YnNlcXVlbnQgY2hhcHRlciBmb3IgdGhlIHN5bnRheCBvZiB0aGUgS2J1aWxkIGZpbGUuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3MudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKaW5kZXggZWM4ZDMxZWUuLjcxNWVhYWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3MudHh0CkBAIC03NSw3ICs3NSw3IEBACiAKICAgICAgKiBUaXRsZTogIkNvbmNlcHR1YWwgQXJjaGl0ZWN0dXJlIG9mIHRoZSBMaW51eCBLZXJuZWwiCiAgICAgICAgQXV0aG9yOiBJdmFuIFQuIEJvd21hbi4KLSAgICAgICBVUkw6IGh0dHA6Ly9wbGcudXdhdGVybG9vLmNhL35pdGJvd21hbi9wYXBlcnMvQ1M3NDZHLWExLmh0bWwKKyAgICAgICBVUkw6IGh0dHA6Ly9wbGcudXdhdGVybG9vLmNhLwogICAgICAgIEtleXdvcmRzOiBjb25jZXB0dWFsIHNvZnR3YXJlIGFyY2hpdGVjdHVyZSwgZXh0cmFjdGVkIGRlc2lnbiwKICAgICAgICByZXZlcnNlIGVuZ2luZWVyaW5nLCBzeXN0ZW0gc3RydWN0dXJlLgogICAgICAgIERlc2NyaXB0aW9uOiBDb25jZXB0dWFsIHNvZnR3YXJlIGFyY2hpdGVjdHVyZSBvZiB0aGUgTGludXgga2VybmVsLApAQCAtODQsNyArODQsNyBAQAogCiAgICAgICogVGl0bGU6ICJDb25jcmV0ZSBBcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IEtlcm5lbCIKICAgICAgICBBdXRob3I6IEl2YW4gVC4gQm93bWFuLCBTYWhlZW0gU2lkZGlxaSwgYW5kIE1leWVyIEMuIFRhbnVhbi4KLSAgICAgICBVUkw6IGh0dHA6Ly9wbGcudXdhdGVybG9vLmNhL35pdGJvd21hbi9wYXBlcnMvQ1M3NDZHLWEyLmh0bWwKKyAgICAgICBVUkw6IGh0dHA6Ly9wbGcudXdhdGVybG9vLmNhLwogICAgICAgIEtleXdvcmRzOiBjb25jcmV0ZSBhcmNoaXRlY3R1cmUsIGV4dHJhY3RlZCBkZXNpZ24sIHJldmVyc2UKICAgICAgICBlbmdpbmVlcmluZywgc3lzdGVtIHN0cnVjdHVyZSwgZGVwZW5kZW5jaWVzLgogICAgICAgIERlc2NyaXB0aW9uOiBDb25jcmV0ZSBhcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbCwKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgKiBUaXRsZTogIkxpbnV4IGFzIGEgQ2FzZSBTdHVkeTogSXRzIEV4dHJhY3RlZCBTb2Z0d2FyZQogICAgICAgIEFyY2hpdGVjdHVyZSIKICAgICAgICBBdXRob3I6IEl2YW4gVC4gQm93bWFuLCBSaWNoYXJkIEMuIEhvbHQgYW5kIE5laWwgVi4gQnJld3N0ZXIuCi0gICAgICAgVVJMOiBodHRwOi8vcGxnLnV3YXRlcmxvby5jYS9+aXRib3dtYW4vcGFwZXJzL2xpbnV4Y2FzZS5odG1sCisgICAgICAgVVJMOiBodHRwOi8vcGxnLnV3YXRlcmxvby5jYS8KICAgICAgICBLZXl3b3Jkczogc29mdHdhcmUgYXJjaGl0ZWN0dXJlLCBhcmNoaXRlY3R1cmUgcmVjb3ZlcnksCiAgICAgICAgcmVkb2N1bWVudGF0aW9uLgogICAgICAgIERlc2NyaXB0aW9uOiBQYXBlciBhcHBlYXJlZCBhdCBJQ1NFJzk5LCBMb3MgQW5nZWxlcywgTWF5IDE2LTIyLApAQCAtMTA0LDcgKzEwNCw3IEBACiAKICAgICAgKiBUaXRsZTogIk92ZXJ2aWV3IG9mIHRoZSBWaXJ0dWFsIEZpbGUgU3lzdGVtIgogICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuYXRuZi5jc2lyby5hdS9+cmdvb2NoL2xpbnV4L3Zmcy50eHQKKyAgICAgICBVUkw6IGh0dHA6Ly93d3cubWptd2lyZWQubmV0L2tlcm5lbC9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKICAgICAgICBLZXl3b3JkczogVkZTLCBGaWxlIFN5c3RlbSwgbW91bnRpbmcgZmlsZXN5c3RlbXMsIG9wZW5pbmcgZmlsZXMsCiAgICAgICAgZGVudHJpZXMsIGRjYWNoZS4KICAgICAgICBEZXNjcmlwdGlvbjogQnJpZWYgaW50cm9kdWN0aW9uIHRvIHRoZSBMaW51eCBWaXJ0dWFsIEZpbGUgU3lzdGVtLgpAQCAtMjY3LDE1ICsyNjcsMTMgQEAKICAgICAgKiBUaXRsZTogIktlcm5lbCBBUEkgY2hhbmdlcyBmcm9tIDIuMCB0byAyLjIiCiAgICAgICAgQXV0aG9yOiBSaWNoYXJkIEdvb2NoLgogICAgICAgIFVSTDoKLSAgICAgICBodHRwOi8vd3d3LmF0bmYuY3Npcm8uYXUvfnJnb29jaC9saW51eC9kb2NzL3BvcnRpbmctdG8tMi4yLmh0bWwKKyAgICAgICBodHRwOi8vd3d3LmxpbnV4aHEuY29tL2d1aWRlcy9MS01QRy9ub2RlMjguaHRtbCAKICAgICAgICBLZXl3b3JkczogMi4yLCBjaGFuZ2VzLgogICAgICAgIERlc2NyaXB0aW9uOiBLZXJuZWwgZnVuY3Rpb25zL3N0cnVjdHVyZXMvdmFyaWFibGVzIHdoaWNoIGNoYW5nZWQKICAgICAgICBmcm9tIDIuMC54IHRvIDIuMi54LgogCiAgICAgICogVGl0bGU6ICJLZXJuZWwgQVBJIGNoYW5nZXMgZnJvbSAyLjIgdG8gMi40IgogICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6Ci0gICAgICAgaHR0cDovL3d3dy5hdG5mLmNzaXJvLmF1L35yZ29vY2gvbGludXgvZG9jcy9wb3J0aW5nLXRvLTIuNC5odG1sCiAgICAgICAgS2V5d29yZHM6IDIuNCwgY2hhbmdlcy4KICAgICAgICBEZXNjcmlwdGlvbjogS2VybmVsIGZ1bmN0aW9ucy9zdHJ1Y3R1cmVzL3ZhcmlhYmxlcyB3aGljaCBjaGFuZ2VkCiAgICAgICAgZnJvbSAyLjIueCB0byAyLjQueC4KQEAgLTI5MCw3ICsyODgsNiBAQAogICAgICAgIAogICAgICAqIFRpdGxlOiAiSS9PIEV2ZW50IEhhbmRsaW5nIFVuZGVyIExpbnV4IgogICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuYXRuZi5jc2lyby5hdS9+cmdvb2NoL2xpbnV4L2RvY3MvaW8tZXZlbnRzLmh0bWwKICAgICAgICBLZXl3b3JkczogSU8sIEkvTywgc2VsZWN0KDIpLCBwb2xsKDIpLCBGRHMsIGFpb19yZWFkKDIpLCByZWFkaW5lc3MKICAgICAgICBldmVudCBxdWV1ZXMuCiAgICAgICAgRGVzY3JpcHRpb246IEZyb20gdGhlIEludHJvZHVjdGlvbjogIkkvTyBFdmVudCBoYW5kbGluZyBpcyBhYm91dApAQCAtMzg2LDY0ICszODMsNjQgQEAKIAogICAgICAqIFRpdGxlOiAiUG9ydGluZyBEZXZpY2UgRHJpdmVycyBUbyBMaW51eCAyLjI6IHBhcnQgSUkiCiAgICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS8xOTk5LTA2L2dlYXJfMDEuaHRtbAorICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzIzOCAKICAgICAgICBLZXl3b3JkczogcG9ydHMsIHBvcnRpbmcuCiAgICAgICAgRGVzY3JpcHRpb246IFNlY29uZCBwYXJ0IG9uIHBvcnRpbmcgZnJvbSAyLjAgdG8gMi4yIGtlcm5lbHMuCiAKICAgICAgKiBUaXRsZTogIkhvdyBUbyBNYWtlIFN1cmUgWW91ciBEcml2ZXIgV2lsbCBXb3JrIE9uIFRoZSBQb3dlcgogICAgICAgIE1hY2ludG9zaCIKICAgICAgICBBdXRob3I6IFBhdWwgTWFja2VycmFzLgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tLzE5OTktMDcvZ2Vhcl8wMS5odG1sCisgICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvMjYxCiAgICAgICAgS2V5d29yZHM6IE1hYywgUG93ZXIgTWFjaW50b3NoLCBwb3J0aW5nLCBkcml2ZXJzLCBjb21wYXRpYmlsaXR5LgogICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKICAgICAgKiBUaXRsZTogIkFuIEludHJvZHVjdGlvbiB0byBTQ1NJIERyaXZlcnMiCiAgICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS8xOTk5LTA4L2dlYXJfMDEuaHRtbAorICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzI4NAogICAgICAgIEtleXdvcmRzOiBTQ1NJLCBkZXZpY2UsIGRyaXZlci4KICAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCiAgICAgICogVGl0bGU6ICJBZHZhbmNlZCBTQ1NJIERyaXZlcnMgQW5kIE90aGVyIFRhbGVzIgogICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vMTk5OS0wOS9nZWFyXzAxLmh0bWwKKyAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zMDcKICAgICAgICBLZXl3b3JkczogU0NTSSwgZGV2aWNlLCBkcml2ZXIsIGFkdmFuY2VkLgogICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKICAgICAgKiBUaXRsZTogIldyaXRpbmcgTGludXggTW91c2UgRHJpdmVycyIKICAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tLzE5OTktMTAvZ2Vhcl8wMS5odG1sCisgICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvMzMwCiAgICAgICAgS2V5d29yZHM6IG1vdXNlLCBkcml2ZXIsIGdwbS4KICAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCiAgICAgICogVGl0bGU6ICJNb3JlIG9uIE1vdXNlIERyaXZlcnMiCiAgICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS8xOTk5LTExL2dlYXJfMDEuaHRtbAorICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzM1NgogICAgICAgIEtleXdvcmRzOiBtb3VzZSwgZHJpdmVyLCBncG0sIHJhY2VzLCBhc3luY2hyb25vdXMgSS9PLgogICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc3RpbGwgc2F5cyBpdCBhbGwuCiAKICAgICAgKiBUaXRsZTogIldyaXRpbmcgVmlkZW80bGludXggUmFkaW8gRHJpdmVyIgogICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vMTk5OS0xMi9nZWFyXzAxLmh0bWwKKyAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zODEKICAgICAgICBLZXl3b3JkczogdmlkZW80bGludXgsIGRyaXZlciwgcmFkaW8sIHJhZGlvIGRldmljZXMuCiAgICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIAogICAgICAqIFRpdGxlOiAiVmlkZW80bGludXggRHJpdmVycywgUGFydCAxOiBWaWRlby1DYXB0dXJlIERldmljZSIKICAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tLzIwMDAtMDEvZ2Vhcl8wMS5odG1sCisgICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDA2CiAgICAgICAgS2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKICAgICAgICBjYW1lcmEgZHJpdmVyLgogICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKICAgICAgKiBUaXRsZTogIlZpZGVvNGxpbnV4IERyaXZlcnMsIFBhcnQgMjogVmlkZW8tY2FwdHVyZSBEZXZpY2VzIgogICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vMjAwMC0wMi9nZWFyXzAxLmh0bWwKKyAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC80MjkKICAgICAgICBLZXl3b3JkczogdmlkZW80bGludXgsIGRyaXZlciwgdmlkZW8gY2FwdHVyZSwgY2FwdHVyZSBkZXZpY2VzLAogICAgICAgIGNhbWVyYSBkcml2ZXIsIGNvbnRyb2wsIHF1ZXJ5IGNhcGFiaWxpdGllcywgY2FwYWJpbGl0eSwgZmFjaWxpdHkuCiAgICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIAogICAgICAqIFRpdGxlOiAiUENJIE1hbmFnZW1lbnQgaW4gTGludXggMi4yIgogICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vMjAwMC0wMy9nZWFyXzAxLmh0bWwKKyAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC80NTIKICAgICAgICBLZXl3b3JkczogUENJLCBidXMsIGJ1cy1tYXN0ZXJpbmcuCiAgICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIApAQCAtNTAyLDcgKzQ5OSw3IEBACiAgICAgICAgCiAgICAgICogVGl0bGU6ICJBIExpbnV4IHZtIFJFQURNRSIKICAgICAgICBBdXRob3I6IEthbm9qIFNhcmNhci4KLSAgICAgICBVUkw6IGh0dHA6Ly9yZWFsaXR5LnNnaS5jb20va2Fub2pfZW5nci92bTIyOS5odG1sCisgICAgICAgVVJMOiBodHRwOi8va29zLmVuaXgub3JnL3B1Yi9saW51eC12bW0uaHRtbAogICAgICAgIEtleXdvcmRzOiB2aXJ0dWFsIG1lbW9yeSwgbW0sIHBnZCwgdm1hLCBwYWdlLCBwYWdlIGZsYWdzLCBwYWdlCiAgICAgICAgY2FjaGUsIHN3YXAgY2FjaGUsIGtzd2FwZC4KICAgICAgICBEZXNjcmlwdGlvbjogVGVsZWdyYXBoaWMsIHNob3J0IGRlc2NyaXB0aW9ucyBhbmQgZGVmaW5pdGlvbnMKQEAgLTY1OSw3ICs2NTYsNyBAQAogCiAgICAgICogTmFtZTogIkxpbnV4IEtlcm5lbCBTb3VyY2UgUmVmZXJlbmNlIgogICAgICAgIEF1dGhvcjogVGhvbWFzIEdyYWljaGVuLgotICAgICAgIFVSTDogaHR0cDovL2lubm9taW5hdGUub3JnL35ncmFpY2hlbi9wcm9qZWN0cy9sa3NyLworICAgICAgIFVSTDogaHR0cDovL21hcmMuaW5mby8/bD1saW51eC1rZXJuZWwmbT05NjQ0NjY0MDEwMjIwNSZ3PTQKICAgICAgICBLZXl3b3JkczogQ1ZTLCB3ZWIsIGN2c3dlYiwgYnJvd3Npbmcgc291cmNlIGNvZGUuCiAgICAgICAgRGVzY3JpcHRpb246IFdlYiBpbnRlcmZhY2UgdG8gYSBDVlMgc2VydmVyIHdpdGggdGhlIGtlcm5lbAogICAgICAgIHNvdXJjZXMuICJIZXJlIHlvdSBjYW4gaGF2ZSBhIGxvb2sgYXQgYW55IGZpbGUgb2YgdGhlIExpbnV4IGtlcm5lbApAQCAtNjgyLDcgKzY3OSw3IEBACiAgICAgICAgcHJvZHVjZWQgZHVyaW5nIHRoZSB3ZWVrLiBQdWJsaXNoZWQgZXZlcnkgVGh1cnNkYXkuCiAKICAgICAgKiBOYW1lOiAiS2VybmVsIFRyYWZmaWMiCi0gICAgICAgVVJMOiBodHRwOi8va3Quem9yay5uZXQva2VybmVsLXRyYWZmaWMvCisgICAgICAgVVJMOiBodHRwOi8va3QuZWFydGgubGkva2VybmVsLXRyYWZmaWMvaW5kZXguaHRtbAogICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0LCB3ZWVrbHkga2VybmVsIG5ld3MuCiAgICAgICAgRGVzY3JpcHRpb246IFdlZWtseSBuZXdzbGV0dGVyIGNvdmVyaW5nIHRoZSBtb3N0IHJlbGV2YW50CiAgICAgICAgZGlzY3Vzc2lvbnMgb2YgdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDhhYmRmZDcuLjcxZDI4NjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC05Miw2ICs5Miw3IEBACiAJCQlEb2N1bWVudGF0aW9uL3Njc2kvLgogCVNFQ1VSSVRZIERpZmZlcmVudCBzZWN1cml0eSBtb2RlbHMgYXJlIGVuYWJsZWQuCiAJU0VMSU5VWCBTRUxpbnV4IHN1cHBvcnQgaXMgZW5hYmxlZC4KKwlBUFBBUk1PUiBBcHBBcm1vciBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJU0VSSUFMCVNlcmlhbCBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJU0gJU3VwZXJIIGFyY2hpdGVjdHVyZSBpcyBlbmFibGVkLgogCVNNUAlUaGUga2VybmVsIGlzIGFuIFNNUCBrZXJuZWwuCkBAIC0xMTQsNiArMTE1LDcgQEAKIAkJCU1vcmUgWDg2LTY0IGJvb3Qgb3B0aW9ucyBjYW4gYmUgZm91bmQgaW4KIAkJCURvY3VtZW50YXRpb24veDg2L3g4Nl82NC9ib290LW9wdGlvbnMudHh0IC4KIAlYODYJRWl0aGVyIDMyYml0IG9yIDY0Yml0IHg4NiAoc2FtZSBhcyBYODYtMzIrWDg2LTY0KQorCVhFTglYZW4gc3VwcG9ydCBpcyBlbmFibGVkCiAKIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIHRleHQgaW5kaWNhdGVzIHRoYXQgdGhlIG9wdGlvbjoKIApAQCAtMTE0Miw5ICsxMTQ0LDEyIEBACiAJa2dkYm9jPQkJW0tHREIsSFddIGtnZGIgb3ZlciBjb25zb2xlcy4KIAkJCVJlcXVpcmVzIGEgdHR5IGRyaXZlciB0aGF0IHN1cHBvcnRzIGNvbnNvbGUgcG9sbGluZywKIAkJCW9yIGEgc3VwcG9ydGVkIHBvbGxpbmcga2V5Ym9hcmQgZHJpdmVyIChub24tdXNiKS4KLQkJCVNlcmlhbCBvbmx5IGZvcm1hdDogPHNlcmlhbF9kZXZpY2U+WyxiYXVkXQotCQkJa2V5Ym9hcmQgb25seSBmb3JtYXQ6IGtiZAotCQkJa2V5Ym9hcmQgYW5kIHNlcmlhbCBmb3JtYXQ6IGtiZCw8c2VyaWFsX2RldmljZT5bLGJhdWRdCisJCQkgU2VyaWFsIG9ubHkgZm9ybWF0OiA8c2VyaWFsX2RldmljZT5bLGJhdWRdCisJCQkga2V5Ym9hcmQgb25seSBmb3JtYXQ6IGtiZAorCQkJIGtleWJvYXJkIGFuZCBzZXJpYWwgZm9ybWF0OiBrYmQsPHNlcmlhbF9kZXZpY2U+WyxiYXVkXQorCQkJT3B0aW9uYWwgS2VybmVsIG1vZGUgc2V0dGluZzoKKwkJCSBrbXMsIGtiZCBmb3JtYXQ6IGttcyxrYmQKKwkJCSBrbXMsIGtiZCBhbmQgc2VyaWFsIGZvcm1hdDoga21zLGtiZCw8c2VyX2Rldj5bLGJhdWRdCiAKIAlrZ2Rid2FpdAlbS0dEQl0gU3RvcCBrZXJuZWwgZXhlY3V0aW9uIGFuZCBlbnRlciB0aGUKIAkJCWtlcm5lbCBkZWJ1Z2dlciBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHkuCkBAIC0xNTk2LDggKzE2MDEsNyBAQAogCQkJW05FVEZJTFRFUl0gRW5hYmxlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZmxvdyBhY2NvdW50aW5nCiAJCQkwIHRvIGRpc2FibGUgYWNjb3VudGluZwogCQkJMSB0byBlbmFibGUgYWNjb3VudGluZwotCQkJRGVmYXVsdCB2YWx1ZSBkZXBlbmRzIG9uIENPTkZJR19ORl9DVF9BQ0NUIHRoYXQgaXMKLQkJCWdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gMi42LjI5LgorCQkJRGVmYXVsdCB2YWx1ZSBpcyAwLgogCiAJbmZzYWRkcnM9CVtORlNdCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzcm9vdC50eHQuCkBAIC0xODExLDYgKzE4MTUsOCBAQAogCiAJbm91c2IJCVtVU0JdIERpc2FibGUgdGhlIFVTQiBzdWJzeXN0ZW0KIAorCW5vd2F0Y2hkb2cJW0tOTF0gRGlzYWJsZSB0aGUgbG9ja3VwIGRldGVjdG9yLgorCiAJbm93YgkJW0FSTV0KIAogCW5veDJhcGljCVtYODYtNjQsQVBJQ10gRG8gbm90IGVuYWJsZSB4MkFQSUMgbW9kZS4KQEAgLTE5NjksNiArMTk3NSw4IEBACiAJCW5vcm9tCQlbWDg2XSBEbyBub3QgYXNzaWduIGFkZHJlc3Mgc3BhY2UgdG8KIAkJCQlleHBhbnNpb24gUk9NcyB0aGF0IGRvIG5vdCBhbHJlYWR5IGhhdmUKIAkJCQlCSU9TIGFzc2lnbmVkIGFkZHJlc3MgcmFuZ2VzLgorCQlub2JhcgkJW1g4Nl0gRG8gbm90IGFzc2lnbiBhZGRyZXNzIHNwYWNlIHRvIHRoZQorCQkJCUJBUnMgdGhhdCB3ZXJlbid0IGFzc2lnbmVkIGJ5IHRoZSBCSU9TLgogCQlpcnFtYXNrPTB4TU1NTQlbWDg2XSBTZXQgYSBiaXQgbWFzayBvZiBJUlFzIGFsbG93ZWQgdG8gYmUKIAkJCQlhc3NpZ25lZCBhdXRvbWF0aWNhbGx5IHRvIFBDSSBkZXZpY2VzLiBZb3UgY2FuCiAJCQkJbWFrZSB0aGUga2VybmVsIGV4Y2x1ZGUgSVJRcyBvZiB5b3VyIElTQSBjYXJkcwpAQCAtMjMxMSw2ICsyMzE5LDEzIEBACiAJCQlJZiBlbmFibGVkIGF0IGJvb3QgdGltZSwgL3NlbGludXgvZGlzYWJsZSBjYW4gYmUgdXNlZAogCQkJbGF0ZXIgdG8gZGlzYWJsZSBwcmlvciB0byBpbml0aWFsIHBvbGljeSBsb2FkLgogCisJYXBwYXJtb3I9CVtBUFBBUk1PUl0gRGlzYWJsZSBvciBlbmFibGUgQXBwQXJtb3IgYXQgYm9vdCB0aW1lCisJCQlGb3JtYXQ6IHsgIjAiIHwgIjEiIH0KKwkJCVNlZSBzZWN1cml0eS9hcHBhcm1vci9LY29uZmlnIGhlbHAgdGV4dAorCQkJMCAtLSBkaXNhYmxlLgorCQkJMSAtLSBlbmFibGUuCisJCQlEZWZhdWx0IHZhbHVlIGlzIHNldCB2aWEga2VybmVsIGNvbmZpZyBvcHRpb24uCisKIAlzZXJpYWxudW1iZXIJW0JVR1M9WDg2LTMyXQogCiAJc2hhcGVycz0JW05FVF0KQEAgLTI4NzgsNiArMjg5MywxNiBAQAogCXhkPQkJW0hXLFhUXSBPcmlnaW5hbCBYVCBwcmUtSURFIChSTEwgZW5jb2RlZCkgZGlza3MuCiAJeGRfZ2VvPQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL2Jsb2NrL3hkLmMuCiAKKwl4ZW5fZW11bF91bnBsdWc9CQlbSFcsWDg2LFhFTl0KKwkJCVVucGx1ZyBYZW4gZW11bGF0ZWQgZGV2aWNlcworCQkJRm9ybWF0OiBbdW5wbHVnMCxdW3VucGx1ZzFdCisJCQlpZGUtZGlza3MgLS0gdW5wbHVnIHByaW1hcnkgbWFzdGVyIElERSBkZXZpY2VzCisJCQlhdXgtaWRlLWRpc2tzIC0tIHVucGx1ZyBub24tcHJpbWFyeS1tYXN0ZXIgSURFIGRldmljZXMKKwkJCW5pY3MgLS0gdW5wbHVnIG5ldHdvcmsgZGV2aWNlcworCQkJYWxsIC0tIHVucGx1ZyBhbGwgZW11bGF0ZWQgZGV2aWNlcyAoTklDcyBhbmQgSURFIGRpc2tzKQorCQkJaWdub3JlIC0tIGNvbnRpbnVlIGxvYWRpbmcgdGhlIFhlbiBwbGF0Zm9ybSBQQ0kgZHJpdmVyIGV2ZW4KKwkJCQlpZiB0aGUgdmVyc2lvbiBjaGVjayBmYWlsZWQKKwogCXhpcmMycHNfY3M9CVtORVQsUENNQ0lBXQogCQkJRm9ybWF0OgogCQkJPGlycT4sPGlycV9tYXNrPiw8aW8+LDxmdWxsX2R1cGxleD4sPGRvX3NvdW5kPiw8bG9ja3VwX2hhY2s+Wyw8aXJxMj5bLDxpcnEzPlssPGlycTQ+XV1dCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tvX0tSL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi9rb19LUi9IT1dUTwppbmRleCAwMjlmY2E5Li5lM2E1NWI2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tvX0tSL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24va29fS1IvSE9XVE8KQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAgICAg7Jis67CU66W4IO2MqOy5mOuTpOydhCDrp4zrk5zripQg67KV7JeQIOq0gO2VnCDtm4zrpa3tlZwg64uk66W4IOusuOyEnOuTpOydtCDsnojri6QuCiAgICAgIlRoZSBQZXJmZWN0IFBhdGNoIgotICAgICAgICBodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0CisgICAgICAgIGh0dHA6Ly91c2Vyd2ViLmtlcm5lbC5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAogICAgICJMaW51eCBrZXJuZWwgcGF0Y2ggc3VibWlzc2lvbiBmb3JtYXQiCiAgICAgICAgIGh0dHA6Ly9saW51eC55eXoudXMvcGF0Y2gtZm9ybWF0Lmh0bWwKIApAQCAtMTkyLDcgKzE5Miw3IEBACiAKIOyXrOufrOu2hOydtCDslrTrlJTshJwg7Iuc7J6R7ZW07JW8IO2VoOynhCDrqqjrpbTsp4Drp4wg7Luk64SQIOqwnOuwnCDsu6TrrqTri4jti7Dsl5Ag7LC47Jes7ZWgIOyImAog7J6I64qUIOydvOuTpOydhCDssL7quLgg7JuQ7ZWc64uk66m0IOumrOuIheyKpCDsu6TrhJAgSmFuaXRvciDtlITroZzsoJ3tirjrpbwg7IK07Y6067SQ6528LgotICAgICAgICAgaHR0cDovL2phbml0b3Iua2VybmVsbmV3Ymllcy5vcmcvCisJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnL0tlcm5lbEphbml0b3JzCiDqt7jqs7PsnYAg7Iuc7J6R7ZWY6riw7JeQIO2bjOulre2VnCDsnqXshozsnbTri6QuIOq3uOqzs+ydgCDrpqzriIXsiqQg7Luk64SQIOyGjOyKpCDtirjrpqzrgrTsl5AKIOqwhOuLqO2eiCDsoJXrpqzrkJjqs6Ag7IiY7KCV65CgIOyImCDsnojripQg66y47KCc65Ok7JeQIOq0gO2VmOyXrCDshKTrqoXtlZzri6QuIOyXrOufrOu2hOydgCDsnbQKIO2UhOuhnOygne2KuOulvCDrjIDtkZztlZjripQg6rCc67Cc7J6Q65Ok6rO8IOydvO2VmOuptOyEnCDsnpDsi6DsnZgg7Yyo7LmY66W8IOumrOuIheyKpCDsu6TrhJAg7Yq466as7JeQCkBAIC01OTYsNyArNTk2LDcgQEAKIAog7J206rKD7J20IOustOyXh+yduOyngCDrjZQg7J6Q7IS47ZWcIOqyg+ydhCDslYzqs6Ag7Iu264uk66m0IOuLpOydjCDrrLjshJzsnZggQ2hhZ2VMb2cg7ZWt7J2EIOu0kOudvC4KICAgICJUaGUgUGVyZmVjdCBQYXRjaCIKLSAgICBodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0CisgICAgaHR0cDovL3VzZXJ3ZWIua2VybmVsLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0CiAKIAogCkBAIC02MTAsNyArNjEwLDcgQEAKIAogCiAtLS0tLS0tLS0tCi0i6rCc67CcIO2UhOuhnOyEuOyKpCIoaHR0cDovL2xpbnV4LnRhci5nei9hcnRpY2xlcy8yLjYtZGV2ZWxvcG1lbnRfcHJvY2Vzcykg7IS57IWY7J2ECisi6rCc67CcIO2UhOuhnOyEuOyKpCIoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvOTQzODYvKSDshLnshZjsnYQKIOyekeyEse2VmOuKlOuNsCDsnojslrQg7LC46rOg7ZWgIOusuOyEnOulvCDsgqzsmqntlZjrj4TroZ0g7ZeI65297ZW07KSAIFBhb2xvIENpYXJyb2NjaGnsl5DqsowKIOqwkOyCrO2VnOuLpC4g7Jes65+s67aE65Ok7J20IOunkO2VtOyVvCDtlaAg6rKD6rO8IOunkO2VtOyEnOuKlCDslYjrkJjripQg6rKD7J2YIOuqqeuhnSDspJEg7J2867aA66W8IOygnOqzte2VtOykgAogUmFuZHkgRHVubGFw6rO8IEdlcnJpdCBIdWl6ZW5nYeyXkOqyjCDqsJDsgqztlZzri6QuIOuYkO2VnCDqsoDthqDsmYAg7J2Y6rKsIOq3uOumrOqzoApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dCBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKaW5kZXggNjY1MzAxNy4uMTc2MmI4MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CkBAIC0yODUsNiArMjg1LDcgQEAKIC0gc3BhcmM2NCAoUmV0dXJuIHByb2JlcyBub3QgeWV0IGltcGxlbWVudGVkLikKIC0gYXJtCiAtIHBwYworLSBtaXBzCiAKIDMuIENvbmZpZ3VyaW5nIEtwcm9iZXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vYXBpLnR4dCBiL0RvY3VtZW50YXRpb24va3ZtL2FwaS50eHQKaW5kZXggYTIzNzUxOC4uNWY1YjY0OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rdm0vYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2t2bS9hcGkudHh0CkBAIC0xMjYsNiArMTI2LDEwIEBACiBrdm0gYWRqdXN0cyBubXNycyB0byByZWZsZWN0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIG1zcnMgYW5kIGZpbGxzIGluCiB0aGUgaW5kaWNlcyBhcnJheSB3aXRoIHRoZWlyIG51bWJlcnMuCiAKK05vdGU6IGlmIGt2bSBpbmRpY2F0ZXMgc3VwcG9ydHMgTUNFIChLVk1fQ0FQX01DRSksIHRoZW4gdGhlIE1DRSBiYW5rIE1TUnMgYXJlCitub3QgcmV0dXJuZWQgaW4gdGhlIE1TUiBsaXN0LCBhcyBkaWZmZXJlbnQgdmNwdXMgY2FuIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyCitvZiBiYW5rcywgYXMgc2V0IHZpYSB0aGUgS1ZNX1g4Nl9TRVRVUF9NQ0UgaW9jdGwuCisKIDQuNCBLVk1fQ0hFQ0tfRVhURU5TSU9OCiAKIENhcGFiaWxpdHk6IGJhc2ljCkBAIC0xNjAsMjkgKzE2NCw3IEBACiBQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24gKGluKQogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgogCi1zdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24gewotCV9fdTMyIHNsb3Q7Ci0JX191MzIgZmxhZ3M7Ci0JX191NjQgZ3Vlc3RfcGh5c19hZGRyOwotCV9fdTY0IG1lbW9yeV9zaXplOyAvKiBieXRlcyAqLwotfTsKLQotLyogZm9yIGt2bV9tZW1vcnlfcmVnaW9uOjpmbGFncyAqLwotI2RlZmluZSBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUyAgMVVMCi0KLVRoaXMgaW9jdGwgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBvciBtb2RpZnkgYSBndWVzdCBwaHlzaWNhbCBtZW1vcnkKLXNsb3QuICBXaGVuIGNoYW5naW5nIGFuIGV4aXN0aW5nIHNsb3QsIGl0IG1heSBiZSBtb3ZlZCBpbiB0aGUgZ3Vlc3QKLXBoeXNpY2FsIG1lbW9yeSBzcGFjZSwgb3IgaXRzIGZsYWdzIG1heSBiZSBtb2RpZmllZC4gIEl0IG1heSBub3QgYmUKLXJlc2l6ZWQuICBTbG90cyBtYXkgbm90IG92ZXJsYXAuCi0KLVRoZSBmbGFncyBmaWVsZCBzdXBwb3J0cyBqdXN0IG9uZSBmbGFnLCBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUywgd2hpY2gKLWluc3RydWN0cyBrdm0gdG8ga2VlcCB0cmFjayBvZiB3cml0ZXMgdG8gbWVtb3J5IHdpdGhpbiB0aGUgc2xvdC4gIFNlZQotdGhlIEtWTV9HRVRfRElSVFlfTE9HIGlvY3RsLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OIGlvY3RsIGluc3RlYWQKLW9mIHRoaXMgQVBJLCBpZiBhdmFpbGFibGUuICBUaGlzIG5ld2VyIEFQSSBhbGxvd3MgcGxhY2luZyBndWVzdCBtZW1vcnkKLWF0IHNwZWNpZmllZCBsb2NhdGlvbnMgaW4gdGhlIGhvc3QgYWRkcmVzcyBzcGFjZSwgeWllbGRpbmcgYmV0dGVyCi1jb250cm9sIGFuZCBlYXN5IGFjY2Vzcy4KK1RoaXMgaW9jdGwgaXMgb2Jzb2xldGUgYW5kIGhhcyBiZWVuIHJlbW92ZWQuCiAKIDQuNiBLVk1fQ1JFQVRFX1ZDUFUKIApAQCAtMjI2LDE3ICsyMDgsNyBAQAogUGFyYW1ldGVyczogc3RydWN0IGt2bV9tZW1vcnlfYWxpYXMgKGluKQogUmV0dXJuczogMCAoc3VjY2VzcyksIC0xIChlcnJvcikKIAotc3RydWN0IGt2bV9tZW1vcnlfYWxpYXMgewotCV9fdTMyIHNsb3Q7ICAvKiB0aGlzIGhhcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBtZW1vcnkgc2xvdHMgKi8KLQlfX3UzMiBmbGFnczsKLQlfX3U2NCBndWVzdF9waHlzX2FkZHI7Ci0JX191NjQgbWVtb3J5X3NpemU7Ci0JX191NjQgdGFyZ2V0X3BoeXNfYWRkcjsKLX07Ci0KLURlZmluZXMgYSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIHJlZ2lvbiBhcyBhbiBhbGlhcyB0byBhbm90aGVyCi1yZWdpb24uICBVc2VmdWwgZm9yIGFsaWFzZWQgYWRkcmVzcywgZm9yIGV4YW1wbGUgdGhlIFZHQSBsb3cgbWVtb3J5Ci13aW5kb3cuIFNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHVzZXJzcGFjZSBtZW1vcnkuCitUaGlzIGlvY3RsIGlzIG9ic29sZXRlIGFuZCBoYXMgYmVlbiByZW1vdmVkLgogCiA0LjkgS1ZNX1JVTgogCkBAIC04OTIsNiArODY0LDE3NCBAQAogVGhpcyBpb2N0bCBpcyBvbmx5IHVzZWZ1bCBhZnRlciBLVk1fQ1JFQVRFX0lSUUNISVAuICBXaXRob3V0IGFuIGluLWtlcm5lbAogaXJxY2hpcCwgdGhlIG11bHRpcHJvY2Vzc2luZyBzdGF0ZSBtdXN0IGJlIG1haW50YWluZWQgYnkgdXNlcnNwYWNlLgogCis0LjM5IEtWTV9TRVRfSURFTlRJVFlfTUFQX0FERFIKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9TRVRfSURFTlRJVFlfTUFQX0FERFIKK0FyY2hpdGVjdHVyZXM6IHg4NgorVHlwZTogdm0gaW9jdGwKK1BhcmFtZXRlcnM6IHVuc2lnbmVkIGxvbmcgaWRlbnRpdHkgKGluKQorUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorCitUaGlzIGlvY3RsIGRlZmluZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBvbmUtcGFnZSByZWdpb24gaW4gdGhlIGd1ZXN0CitwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLiAgVGhlIHJlZ2lvbiBtdXN0IGJlIHdpdGhpbiB0aGUgZmlyc3QgNEdCIG9mIHRoZQorZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBhbmQgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbnkgbWVtb3J5IHNsb3QKK29yIGFueSBtbWlvIGFkZHJlc3MuICBUaGUgZ3Vlc3QgbWF5IG1hbGZ1bmN0aW9uIGlmIGl0IGFjY2Vzc2VzIHRoaXMgbWVtb3J5CityZWdpb24uCisKK1RoaXMgaW9jdGwgaXMgcmVxdWlyZWQgb24gSW50ZWwtYmFzZWQgaG9zdHMuICBUaGlzIGlzIG5lZWRlZCBvbiBJbnRlbCBoYXJkd2FyZQorYmVjYXVzZSBvZiBhIHF1aXJrIGluIHRoZSB2aXJ0dWFsaXphdGlvbiBpbXBsZW1lbnRhdGlvbiAoc2VlIHRoZSBpbnRlcm5hbHMKK2RvY3VtZW50YXRpb24gd2hlbiBpdCBwb3BzIGludG8gZXhpc3RlbmNlKS4KKworNC40MCBLVk1fU0VUX0JPT1RfQ1BVX0lECisKK0NhcGFiaWxpdHk6IEtWTV9DQVBfU0VUX0JPT1RfQ1BVX0lECitBcmNoaXRlY3R1cmVzOiB4ODYsIGlhNjQKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiB1bnNpZ25lZCBsb25nIHZjcHVfaWQKK1JldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKworRGVmaW5lIHdoaWNoIHZjcHUgaXMgdGhlIEJvb3RzdHJhcCBQcm9jZXNzb3IgKEJTUCkuICBWYWx1ZXMgYXJlIHRoZSBzYW1lCithcyB0aGUgdmNwdSBpZCBpbiBLVk1fQ1JFQVRFX1ZDUFUuICBJZiB0aGlzIGlvY3RsIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0CitpcyB2Y3B1IDAuCisKKzQuNDEgS1ZNX0dFVF9YU0FWRQorCitDYXBhYmlsaXR5OiBLVk1fQ0FQX1hTQVZFCitBcmNoaXRlY3R1cmVzOiB4ODYKK1R5cGU6IHZjcHUgaW9jdGwKK1BhcmFtZXRlcnM6IHN0cnVjdCBrdm1feHNhdmUgKG91dCkKK1JldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKworc3RydWN0IGt2bV94c2F2ZSB7CisJX191MzIgcmVnaW9uWzEwMjRdOworfTsKKworVGhpcyBpb2N0bCB3b3VsZCBjb3B5IGN1cnJlbnQgdmNwdSdzIHhzYXZlIHN0cnVjdCB0byB0aGUgdXNlcnNwYWNlLgorCis0LjQyIEtWTV9TRVRfWFNBVkUKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9YU0FWRQorQXJjaGl0ZWN0dXJlczogeDg2CitUeXBlOiB2Y3B1IGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX3hzYXZlIChpbikKK1JldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKworc3RydWN0IGt2bV94c2F2ZSB7CisJX191MzIgcmVnaW9uWzEwMjRdOworfTsKKworVGhpcyBpb2N0bCB3b3VsZCBjb3B5IHVzZXJzcGFjZSdzIHhzYXZlIHN0cnVjdCB0byB0aGUga2VybmVsLgorCis0LjQzIEtWTV9HRVRfWENSUworCitDYXBhYmlsaXR5OiBLVk1fQ0FQX1hDUlMKK0FyY2hpdGVjdHVyZXM6IHg4NgorVHlwZTogdmNwdSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV94Y3JzIChvdXQpCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisKK3N0cnVjdCBrdm1feGNyIHsKKwlfX3UzMiB4Y3I7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgdmFsdWU7Cit9OworCitzdHJ1Y3Qga3ZtX3hjcnMgeworCV9fdTMyIG5yX3hjcnM7CisJX191MzIgZmxhZ3M7CisJc3RydWN0IGt2bV94Y3IgeGNyc1tLVk1fTUFYX1hDUlNdOworCV9fdTY0IHBhZGRpbmdbMTZdOworfTsKKworVGhpcyBpb2N0bCB3b3VsZCBjb3B5IGN1cnJlbnQgdmNwdSdzIHhjcnMgdG8gdGhlIHVzZXJzcGFjZS4KKworNC40NCBLVk1fU0VUX1hDUlMKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9YQ1JTCitBcmNoaXRlY3R1cmVzOiB4ODYKK1R5cGU6IHZjcHUgaW9jdGwKK1BhcmFtZXRlcnM6IHN0cnVjdCBrdm1feGNycyAoaW4pCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisKK3N0cnVjdCBrdm1feGNyIHsKKwlfX3UzMiB4Y3I7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgdmFsdWU7Cit9OworCitzdHJ1Y3Qga3ZtX3hjcnMgeworCV9fdTMyIG5yX3hjcnM7CisJX191MzIgZmxhZ3M7CisJc3RydWN0IGt2bV94Y3IgeGNyc1tLVk1fTUFYX1hDUlNdOworCV9fdTY0IHBhZGRpbmdbMTZdOworfTsKKworVGhpcyBpb2N0bCB3b3VsZCBzZXQgdmNwdSdzIHhjciB0byB0aGUgdmFsdWUgdXNlcnNwYWNlIHNwZWNpZmllZC4KKworNC40NSBLVk1fR0VUX1NVUFBPUlRFRF9DUFVJRAorCitDYXBhYmlsaXR5OiBLVk1fQ0FQX0VYVF9DUFVJRAorQXJjaGl0ZWN0dXJlczogeDg2CitUeXBlOiBzeXN0ZW0gaW9jdGwKK1BhcmFtZXRlcnM6IHN0cnVjdCBrdm1fY3B1aWQyIChpbi9vdXQpCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisKK3N0cnVjdCBrdm1fY3B1aWQyIHsKKwlfX3UzMiBuZW50OworCV9fdTMyIHBhZGRpbmc7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgZW50cmllc1swXTsKK307CisKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWCAxCisjZGVmaW5lIEtWTV9DUFVJRF9GTEFHX1NUQVRFRlVMX0ZVTkMgICAgMgorI2RlZmluZSBLVk1fQ1BVSURfRkxBR19TVEFURV9SRUFEX05FWFQgIDQKKworc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgeworCV9fdTMyIGZ1bmN0aW9uOworCV9fdTMyIGluZGV4OworCV9fdTMyIGZsYWdzOworCV9fdTMyIGVheDsKKwlfX3UzMiBlYng7CisJX191MzIgZWN4OworCV9fdTMyIGVkeDsKKwlfX3UzMiBwYWRkaW5nWzNdOworfTsKKworVGhpcyBpb2N0bCByZXR1cm5zIHg4NiBjcHVpZCBmZWF0dXJlcyB3aGljaCBhcmUgc3VwcG9ydGVkIGJ5IGJvdGggdGhlIGhhcmR3YXJlCithbmQga3ZtLiAgVXNlcnNwYWNlIGNhbiB1c2UgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoaXMgaW9jdGwgdG8KK2NvbnN0cnVjdCBjcHVpZCBpbmZvcm1hdGlvbiAoZm9yIEtWTV9TRVRfQ1BVSUQyKSB0aGF0IGlzIGNvbnNpc3RlbnQgd2l0aAoraGFyZHdhcmUsIGtlcm5lbCwgYW5kIHVzZXJzcGFjZSBjYXBhYmlsaXRpZXMsIGFuZCB3aXRoIHVzZXIgcmVxdWlyZW1lbnRzIChmb3IKK2V4YW1wbGUsIHRoZSB1c2VyIG1heSB3aXNoIHRvIGNvbnN0cmFpbiBjcHVpZCB0byBlbXVsYXRlIG9sZGVyIGhhcmR3YXJlLAorb3IgZm9yIGZlYXR1cmUgY29uc2lzdGVuY3kgYWNyb3NzIGEgY2x1c3RlcikuCisKK1VzZXJzcGFjZSBpbnZva2VzIEtWTV9HRVRfU1VQUE9SVEVEX0NQVUlEIGJ5IHBhc3NpbmcgYSBrdm1fY3B1aWQyIHN0cnVjdHVyZQord2l0aCB0aGUgJ25lbnQnIGZpZWxkIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB2YXJpYWJsZS1zaXplCithcnJheSAnZW50cmllcycuICBJZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaXMgdG9vIGxvdyB0byBkZXNjcmliZSB0aGUgY3B1CitjYXBhYmlsaXRpZXMsIGFuIGVycm9yIChFMkJJRykgaXMgcmV0dXJuZWQuICBJZiB0aGUgbnVtYmVyIGlzIHRvbyBoaWdoLAordGhlICduZW50JyBmaWVsZCBpcyBhZGp1c3RlZCBhbmQgYW4gZXJyb3IgKEVOT01FTSkgaXMgcmV0dXJuZWQuICBJZiB0aGUKK251bWJlciBpcyBqdXN0IHJpZ2h0LCB0aGUgJ25lbnQnIGZpZWxkIGlzIGFkanVzdGVkIHRvIHRoZSBudW1iZXIgb2YgdmFsaWQKK2VudHJpZXMgaW4gdGhlICdlbnRyaWVzJyBhcnJheSwgd2hpY2ggaXMgdGhlbiBmaWxsZWQuCisKK1RoZSBlbnRyaWVzIHJldHVybmVkIGFyZSB0aGUgaG9zdCBjcHVpZCBhcyByZXR1cm5lZCBieSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sCit3aXRoIHVua25vd24gb3IgdW5zdXBwb3J0ZWQgZmVhdHVyZXMgbWFza2VkIG91dC4gIFRoZSBmaWVsZHMgaW4gZWFjaCBlbnRyeQorYXJlIGRlZmluZWQgYXMgZm9sbG93czoKKworICBmdW5jdGlvbjogdGhlIGVheCB2YWx1ZSB1c2VkIHRvIG9idGFpbiB0aGUgZW50cnkKKyAgaW5kZXg6IHRoZSBlY3ggdmFsdWUgdXNlZCB0byBvYnRhaW4gdGhlIGVudHJ5IChmb3IgZW50cmllcyB0aGF0IGFyZQorICAgICAgICAgYWZmZWN0ZWQgYnkgZWN4KQorICBmbGFnczogYW4gT1Igb2YgemVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgIEtWTV9DUFVJRF9GTEFHX1NJR05JRkNBTlRfSU5ERVg6CisgICAgICAgICAgIGlmIHRoZSBpbmRleCBmaWVsZCBpcyB2YWxpZAorICAgICAgICBLVk1fQ1BVSURfRkxBR19TVEFURUZVTF9GVU5DOgorICAgICAgICAgICBpZiBjcHVpZCBmb3IgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHN1Y2Nlc3NpdmUKKyAgICAgICAgICAgaW52b2NhdGlvbnM7IHRoZXJlIHdpbGwgYmUgc2V2ZXJhbCBlbnRyaWVzIHdpdGggdGhlIHNhbWUgZnVuY3Rpb24sCisgICAgICAgICAgIGFsbCB3aXRoIHRoaXMgZmxhZyBzZXQKKyAgICAgICAgS1ZNX0NQVUlEX0ZMQUdfU1RBVEVfUkVBRF9ORVhUOgorICAgICAgICAgICBmb3IgS1ZNX0NQVUlEX0ZMQUdfU1RBVEVGVUxfRlVOQyBlbnRyaWVzLCBzZXQgaWYgdGhpcyBlbnRyeSBpcworICAgICAgICAgICB0aGUgZmlyc3QgZW50cnkgdG8gYmUgcmVhZCBieSBhIGNwdQorICAgZWF4LCBlYngsIGVjeCwgZWR4OiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IKKyAgICAgICAgIHRoaXMgZnVuY3Rpb24vaW5kZXggY29tYmluYXRpb24KKwogNS4gVGhlIGt2bV9ydW4gc3RydWN0dXJlCiAKIEFwcGxpY2F0aW9uIGNvZGUgb2J0YWlucyBhIHBvaW50ZXIgdG8gdGhlIGt2bV9ydW4gc3RydWN0dXJlIGJ5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2t2bS9tbXUudHh0IGIvRG9jdW1lbnRhdGlvbi9rdm0vbW11LnR4dAppbmRleCBhYWVkNmFiLi4xNDJjYzUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2t2bS9tbXUudHh0CisrKyBiL0RvY3VtZW50YXRpb24va3ZtL21tdS50eHQKQEAgLTc3LDEwICs3NywxMCBAQAogCiBHdWVzdCBtZW1vcnkgKGdwYSkgaXMgcGFydCBvZiB0aGUgdXNlciBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMKIHVzaW5nIGt2bS4gIFVzZXJzcGFjZSBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiBiZXR3ZWVuIGd1ZXN0IGFkZHJlc3NlcyBhbmQgdXNlcgotYWRkcmVzc2VzIChncGEtPmh2YSk7IG5vdGUgdGhhdCB0d28gZ3BhcyBtYXkgYWxpYXMgdG8gdGhlIHNhbWUgZ3ZhLCBidXQgbm90CithZGRyZXNzZXMgKGdwYS0+aHZhKTsgbm90ZSB0aGF0IHR3byBncGFzIG1heSBhbGlhcyB0byB0aGUgc2FtZSBodmEsIGJ1dCBub3QKIHZpY2UgdmVyc2EuCiAKLVRoZXNlIGd2YXMgbWF5IGJlIGJhY2tlZCB1c2luZyBhbnkgbWV0aG9kIGF2YWlsYWJsZSB0byB0aGUgaG9zdDogYW5vbnltb3VzCitUaGVzZSBodmFzIG1heSBiZSBiYWNrZWQgdXNpbmcgYW55IG1ldGhvZCBhdmFpbGFibGUgdG8gdGhlIGhvc3Q6IGFub255bW91cwogbWVtb3J5LCBmaWxlIGJhY2tlZCBtZW1vcnksIGFuZCBkZXZpY2UgbWVtb3J5LiAgTWVtb3J5IG1pZ2h0IGJlIHBhZ2VkIGJ5IHRoZQogaG9zdCBhdCBhbnkgdGltZS4KIApAQCAtMTYxLDcgKzE2MSw3IEBACiAgIHJvbGUuY3I0X3BhZToKICAgICBDb250YWlucyB0aGUgdmFsdWUgb2YgY3I0LnBhZSBmb3Igd2hpY2ggdGhlIHBhZ2UgaXMgdmFsaWQgKGUuZy4gd2hldGhlcgogICAgIDMyLWJpdCBvciA2NC1iaXQgZ3B0ZXMgYXJlIGluIHVzZSkuCi0gIHJvbGUuY3I0X254ZToKKyAgcm9sZS5ueGU6CiAgICAgQ29udGFpbnMgdGhlIHZhbHVlIG9mIGVmZXIubnhlIGZvciB3aGljaCB0aGUgcGFnZSBpcyB2YWxpZC4KICAgcm9sZS5jcjBfd3A6CiAgICAgQ29udGFpbnMgdGhlIHZhbHVlIG9mIGNyMC53cCBmb3Igd2hpY2ggdGhlIHBhZ2UgaXMgdmFsaWQuCkBAIC0xODAsNyArMTgwLDkgQEAKICAgICBndWVzdCBwYWdlcyBhcyBsZWF2ZXMuCiAgIGdmbnM6CiAgICAgQW4gYXJyYXkgb2YgNTEyIGd1ZXN0IGZyYW1lIG51bWJlcnMsIG9uZSBmb3IgZWFjaCBwcmVzZW50IHB0ZS4gIFVzZWQgdG8KLSAgICBwZXJmb3JtIGEgcmV2ZXJzZSBtYXAgZnJvbSBhIHB0ZSB0byBhIGdmbi4KKyAgICBwZXJmb3JtIGEgcmV2ZXJzZSBtYXAgZnJvbSBhIHB0ZSB0byBhIGdmbi4gV2hlbiByb2xlLmRpcmVjdCBpcyBzZXQsIGFueQorICAgIGVsZW1lbnQgb2YgdGhpcyBhcnJheSBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBnZm4gZmllbGQgd2hlbiB1c2VkLCBpbgorICAgIHRoaXMgY2FzZSwgdGhlIGFycmF5IG9mIGdmbnMgaXMgbm90IGFsbG9jYXRlZC4gU2VlIHJvbGUuZGlyZWN0IGFuZCBnZm4uCiAgIHNsb3RfYml0bWFwOgogICAgIEEgYml0bWFwIGNvbnRhaW5pbmcgb25lIGJpdCBwZXIgbWVtb3J5IHNsb3QuICBJZiB0aGUgcGFnZSBjb250YWlucyBhIHB0ZQogICAgIG1hcHBpbmcgYSBwYWdlIGZyb20gbWVtb3J5IHNsb3QgbiwgdGhlbiBiaXQgbiBvZiBzbG90X2JpdG1hcCB3aWxsIGJlIHNldApAQCAtMjk2LDYgKzI5OCw0OCBAQAogICAtIGxvb2sgdXAgYWZmZWN0ZWQgc3B0ZXMgdGhyb3VnaCByZXZlcnNlIG1hcAogICAtIGRyb3AgKG9yIHVwZGF0ZSkgdHJhbnNsYXRpb25zCiAKK0VtdWxhdGluZyBjcjAud3AKKz09PT09PT09PT09PT09PT0KKworSWYgdGRwIGlzIG5vdCBlbmFibGVkLCB0aGUgaG9zdCBtdXN0IGtlZXAgY3IwLndwPTEgc28gcGFnZSB3cml0ZSBwcm90ZWN0aW9uCit3b3JrcyBmb3IgdGhlIGd1ZXN0IGtlcm5lbCwgbm90IGd1ZXN0IGd1ZXN0IHVzZXJzcGFjZS4gIFdoZW4gdGhlIGd1ZXN0CitjcjAud3A9MSwgdGhpcyBkb2VzIG5vdCBwcmVzZW50IGEgcHJvYmxlbS4gIEhvd2V2ZXIgd2hlbiB0aGUgZ3Vlc3QgY3IwLndwPTAsCit3ZSBjYW5ub3QgbWFwIHRoZSBwZXJtaXNzaW9ucyBmb3IgZ3B0ZS51PTEsIGdwdGUudz0wIHRvIGFueSBzcHRlICh0aGUKK3NlbWFudGljcyByZXF1aXJlIGFsbG93aW5nIGFueSBndWVzdCBrZXJuZWwgYWNjZXNzIHBsdXMgdXNlciByZWFkIGFjY2VzcykuCisKK1dlIGhhbmRsZSB0aGlzIGJ5IG1hcHBpbmcgdGhlIHBlcm1pc3Npb25zIHRvIHR3byBwb3NzaWJsZSBzcHRlcywgZGVwZW5kaW5nCitvbiBmYXVsdCB0eXBlOgorCistIGtlcm5lbCB3cml0ZSBmYXVsdDogc3B0ZS51PTAsIHNwdGUudz0xIChhbGxvd3MgZnVsbCBrZXJuZWwgYWNjZXNzLAorICBkaXNhbGxvd3MgdXNlciBhY2Nlc3MpCistIHJlYWQgZmF1bHQ6IHNwdGUudT0xLCBzcHRlLnc9MCAoYWxsb3dzIGZ1bGwgcmVhZCBhY2Nlc3MsIGRpc2FsbG93cyBrZXJuZWwKKyAgd3JpdGUgYWNjZXNzKQorCisodXNlciB3cml0ZSBmYXVsdHMgZ2VuZXJhdGUgYSAjUEYpCisKK0xhcmdlIHBhZ2VzCis9PT09PT09PT09PQorCitUaGUgbW11IHN1cHBvcnRzIGFsbCBjb21iaW5hdGlvbnMgb2YgbGFyZ2UgYW5kIHNtYWxsIGd1ZXN0IGFuZCBob3N0IHBhZ2VzLgorU3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW5jbHVkZSA0aywgMk0sIDRNLCBhbmQgMUcuICA0TSBwYWdlcyBhcmUgdHJlYXRlZCBhcwordHdvIHNlcGFyYXRlIDJNIHBhZ2VzLCBvbiBib3RoIGd1ZXN0IGFuZCBob3N0LCBzaW5jZSB0aGUgbW11IGFsd2F5cyB1c2VzIFBBRQorcGFnaW5nLgorCitUbyBpbnN0YW50aWF0ZSBhIGxhcmdlIHNwdGUsIGZvdXIgY29uc3RyYWludHMgbXVzdCBiZSBzYXRpc2ZpZWQ6CisKKy0gdGhlIHNwdGUgbXVzdCBwb2ludCB0byBhIGxhcmdlIGhvc3QgcGFnZQorLSB0aGUgZ3Vlc3QgcHRlIG11c3QgYmUgYSBsYXJnZSBwdGUgb2YgYXQgbGVhc3QgZXF1aXZhbGVudCBzaXplIChpZiB0ZHAgaXMKKyAgZW5hYmxlZCwgdGhlcmUgaXMgbm8gZ3Vlc3QgcHRlIGFuZCB0aGlzIGNvbmRpdGlvbiBpcyBzYXRpc2lmaWVkKQorLSBpZiB0aGUgc3B0ZSB3aWxsIGJlIHdyaXRlYWJsZSwgdGhlIGxhcmdlIHBhZ2UgZnJhbWUgbWF5IG5vdCBvdmVybGFwIGFueQorICB3cml0ZS1wcm90ZWN0ZWQgcGFnZXMKKy0gdGhlIGd1ZXN0IHBhZ2UgbXVzdCBiZSB3aG9sbHkgY29udGFpbmVkIGJ5IGEgc2luZ2xlIG1lbW9yeSBzbG90CisKK1RvIGNoZWNrIHRoZSBsYXN0IHR3byBjb25kaXRpb25zLCB0aGUgbW11IG1haW50YWlucyBhIC0+d3JpdGVfY291bnQgc2V0IG9mCithcnJheXMgZm9yIGVhY2ggbWVtb3J5IHNsb3QgYW5kIGxhcmdlIHBhZ2Ugc2l6ZS4gIEV2ZXJ5IHdyaXRlIHByb3RlY3RlZCBwYWdlCitjYXVzZXMgaXRzIHdyaXRlX2NvdW50IHRvIGJlIGluY3JlbWVudGVkLCB0aHVzIHByZXZlbnRpbmcgaW5zdGFudGlhdGlvbiBvZgorYSBsYXJnZSBzcHRlLiAgVGhlIGZyYW1lcyBhdCB0aGUgZW5kIG9mIGFuIHVuYWxpZ25lZCBtZW1vcnkgc2xvdCBoYXZlCithcnRpZmljaWNhbGx5IGluZmxhdGVkIC0+d3JpdGVfY291bnRzIHNvIHRoZXkgY2FuIG5ldmVyIGJlIGluc3RhbnRpYXRlZC4KKwogRnVydGhlciByZWFkaW5nCiA9PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vbXNyLnR4dCBiL0RvY3VtZW50YXRpb24va3ZtL21zci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkY2ZlOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24va3ZtL21zci50eHQKQEAgLTAsMCArMSwxNTMgQEAKK0tWTS1zcGVjaWZpYyBNU1JzLgorR2xhdWJlciBDb3N0YSA8Z2xvbW1lckByZWRoYXQuY29tPiwgUmVkIEhhdCBJbmMsIDIwMTAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0tWTSBtYWtlcyB1c2Ugb2Ygc29tZSBjdXN0b20gTVNScyB0byBzZXJ2aWNlIHNvbWUgcmVxdWVzdHMuCitBdCBwcmVzZW50LCB0aGlzIGZhY2lsaXR5IGlzIG9ubHkgdXNlZCBieSBrdm1jbG9jay4KKworQ3VzdG9tIE1TUnMgaGF2ZSBhIHJhbmdlIHJlc2VydmVkIGZvciB0aGVtLCB0aGF0IGdvZXMgZnJvbQorMHg0YjU2NGQwMCB0byAweDRiNTY0ZGZmLiBUaGVyZSBhcmUgTVNScyBvdXRzaWRlIHRoaXMgYXJlYSwKK2J1dCB0aGV5IGFyZSBkZXByZWNhdGVkIGFuZCB0aGVpciB1c2UgaXMgZGlzY291cmFnZWQuCisKK0N1c3RvbSBNU1IgbGlzdAorLS0tLS0tLS0KKworVGhlIGN1cnJlbnQgc3VwcG9ydGVkIEN1c3RvbSBNU1IgbGlzdCBpczoKKworTVNSX0tWTV9XQUxMX0NMT0NLX05FVzogICAweDRiNTY0ZDAwCisKKwlkYXRhOiA0LWJ5dGUgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBtZW1vcnkgYXJlYSB3aGljaCBtdXN0IGJlCisJaW4gZ3Vlc3QgUkFNLiBUaGlzIG1lbW9yeSBpcyBleHBlY3RlZCB0byBob2xkIGEgY29weSBvZiB0aGUgZm9sbG93aW5nCisJc3RydWN0dXJlOgorCisJc3RydWN0IHB2Y2xvY2tfd2FsbF9jbG9jayB7CisJCXUzMiAgIHZlcnNpb247CisJCXUzMiAgIHNlYzsKKwkJdTMyICAgbnNlYzsKKwl9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCXdob3NlIGRhdGEgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGh5cGVydmlzb3IuIFRoZSBoeXBlcnZpc29yIGlzIG9ubHkKKwlndWFyYW50ZWVkIHRvIHVwZGF0ZSB0aGlzIGRhdGEgYXQgdGhlIG1vbWVudCBvZiBNU1Igd3JpdGUuCisJVXNlcnMgdGhhdCB3YW50IHRvIHJlbGlhYmx5IHF1ZXJ5IHRoaXMgaW5mb3JtYXRpb24gbW9yZSB0aGFuIG9uY2UgaGF2ZQorCXRvIHdyaXRlIG1vcmUgdGhhbiBvbmNlIHRvIHRoaXMgTVNSLiBGaWVsZHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorCisJCXZlcnNpb246IGd1ZXN0IGhhcyB0byBjaGVjayB2ZXJzaW9uIGJlZm9yZSBhbmQgYWZ0ZXIgZ3JhYmJpbmcKKwkJdGltZSBpbmZvcm1hdGlvbiBhbmQgY2hlY2sgdGhhdCB0aGV5IGFyZSBib3RoIGVxdWFsIGFuZCBldmVuLgorCQlBbiBvZGQgdmVyc2lvbiBpbmRpY2F0ZXMgYW4gaW4tcHJvZ3Jlc3MgdXBkYXRlLgorCisJCXNlYzogbnVtYmVyIG9mIHNlY29uZHMgZm9yIHdhbGxjbG9jay4KKworCQluc2VjOiBudW1iZXIgb2YgbmFub3NlY29uZHMgZm9yIHdhbGxjbG9jay4KKworCU5vdGUgdGhhdCBhbHRob3VnaCBNU1JzIGFyZSBwZXItQ1BVIGVudGl0aWVzLCB0aGUgZWZmZWN0IG9mIHRoaXMKKwlwYXJ0aWN1bGFyIE1TUiBpcyBnbG9iYWwuCisKKwlBdmFpbGFiaWxpdHkgb2YgdGhpcyBNU1IgbXVzdCBiZSBjaGVja2VkIHZpYSBiaXQgMyBpbiAweDQwMDAwMDEgY3B1aWQKKwlsZWFmIHByaW9yIHRvIHVzYWdlLgorCitNU1JfS1ZNX1NZU1RFTV9USU1FX05FVzogIDB4NGI1NjRkMDEKKworCWRhdGE6IDQtYnl0ZSBhbGlnbmVkIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBtZW1vcnkgYXJlYSB3aGljaCBtdXN0IGJlIGluCisJZ3Vlc3QgUkFNLCBwbHVzIGFuIGVuYWJsZSBiaXQgaW4gYml0IDAuIFRoaXMgbWVtb3J5IGlzIGV4cGVjdGVkIHRvIGhvbGQKKwlhIGNvcHkgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKwlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyB7CisJCXUzMiAgIHZlcnNpb247CisJCXUzMiAgIHBhZDA7CisJCXU2NCAgIHRzY190aW1lc3RhbXA7CisJCXU2NCAgIHN5c3RlbV90aW1lOworCQl1MzIgICB0c2NfdG9fc3lzdGVtX211bDsKKwkJczggICAgdHNjX3NoaWZ0OworCQl1OCAgICBmbGFnczsKKwkJdTggICAgcGFkWzJdOworCX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOyAvKiAzMiBieXRlcyAqLworCisJd2hvc2UgZGF0YSB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgaHlwZXJ2aXNvciBwZXJpb2RpY2FsbHkuIE9ubHkgb25lCisJd3JpdGUsIG9yIHJlZ2lzdHJhdGlvbiwgaXMgbmVlZGVkIGZvciBlYWNoIFZDUFUuIFRoZSBpbnRlcnZhbCBiZXR3ZWVuCisJdXBkYXRlcyBvZiB0aGlzIHN0cnVjdHVyZSBpcyBhcmJpdHJhcnkgYW5kIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4KKwlUaGUgaHlwZXJ2aXNvciBtYXkgdXBkYXRlIHRoaXMgc3RydWN0dXJlIGF0IGFueSB0aW1lIGl0IHNlZXMgZml0IHVudGlsCisJYW55dGhpbmcgd2l0aCBiaXQwID09IDAgaXMgd3JpdHRlbiB0byBpdC4KKworCUZpZWxkcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisKKwkJdmVyc2lvbjogZ3Vlc3QgaGFzIHRvIGNoZWNrIHZlcnNpb24gYmVmb3JlIGFuZCBhZnRlciBncmFiYmluZworCQl0aW1lIGluZm9ybWF0aW9uIGFuZCBjaGVjayB0aGF0IHRoZXkgYXJlIGJvdGggZXF1YWwgYW5kIGV2ZW4uCisJCUFuIG9kZCB2ZXJzaW9uIGluZGljYXRlcyBhbiBpbi1wcm9ncmVzcyB1cGRhdGUuCisKKwkJdHNjX3RpbWVzdGFtcDogdGhlIHRzYyB2YWx1ZSBhdCB0aGUgY3VycmVudCBWQ1BVIGF0IHRoZSB0aW1lCisJCW9mIHRoZSB1cGRhdGUgb2YgdGhpcyBzdHJ1Y3R1cmUuIEd1ZXN0cyBjYW4gc3VidHJhY3QgdGhpcyB2YWx1ZQorCQlmcm9tIGN1cnJlbnQgdHNjIHRvIGRlcml2ZSBhIG5vdGlvbiBvZiBlbGFwc2VkIHRpbWUgc2luY2UgdGhlCisJCXN0cnVjdHVyZSB1cGRhdGUuCisKKwkJc3lzdGVtX3RpbWU6IGEgaG9zdCBub3Rpb24gb2YgbW9ub3RvbmljIHRpbWUsIGluY2x1ZGluZyBzbGVlcAorCQl0aW1lIGF0IHRoZSB0aW1lIHRoaXMgc3RydWN0dXJlIHdhcyBsYXN0IHVwZGF0ZWQuIFVuaXQgaXMKKwkJbmFub3NlY29uZHMuCisKKwkJdHNjX3RvX3N5c3RlbV9tdWw6IGEgZnVuY3Rpb24gb2YgdGhlIHRzYyBmcmVxdWVuY3kuIE9uZSBoYXMKKwkJdG8gbXVsdGlwbHkgYW55IHRzYy1yZWxhdGVkIHF1YW50aXR5IGJ5IHRoaXMgdmFsdWUgdG8gZ2V0CisJCWEgdmFsdWUgaW4gbmFub3NlY29uZHMsIGJlc2lkZXMgZGl2aWRpbmcgYnkgMl50c2Nfc2hpZnQKKworCQl0c2Nfc2hpZnQ6IGN5Y2xlIHRvIG5hbm9zZWNvbmQgZGl2aWRlciwgYXMgYSBwb3dlciBvZiB0d28sIHRvCisJCWFsbG93IGZvciBzaGlmdCByaWdodHMuIE9uZSBoYXMgdG8gc2hpZnQgcmlnaHQgYW55IHRzYy1yZWxhdGVkCisJCXF1YW50aXR5IGJ5IHRoaXMgdmFsdWUgdG8gZ2V0IGEgdmFsdWUgaW4gbmFub3NlY29uZHMsIGJlc2lkZXMKKwkJbXVsdGlwbHlpbmcgYnkgdHNjX3RvX3N5c3RlbV9tdWwuCisKKwkJV2l0aCB0aGlzIGluZm9ybWF0aW9uLCBndWVzdHMgY2FuIGRlcml2ZSBwZXItQ1BVIHRpbWUgYnkKKwkJZG9pbmc6CisKKwkJCXRpbWUgPSAoY3VycmVudF90c2MgLSB0c2NfdGltZXN0YW1wKQorCQkJdGltZSA9ICh0aW1lICogdHNjX3RvX3N5c3RlbV9tdWwpID4+IHRzY19zaGlmdAorCQkJdGltZSA9IHRpbWUgKyBzeXN0ZW1fdGltZQorCisJCWZsYWdzOiBiaXRzIGluIHRoaXMgZmllbGQgaW5kaWNhdGUgZXh0ZW5kZWQgY2FwYWJpbGl0aWVzCisJCWNvb3JkaW5hdGVkIGJldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgaHlwZXJ2aXNvci4gQXZhaWxhYmlsaXR5CisJCW9mIHNwZWNpZmljIGZsYWdzIGhhcyB0byBiZSBjaGVja2VkIGluIDB4NDAwMDAwMDEgY3B1aWQgbGVhZi4KKwkJQ3VycmVudCBmbGFncyBhcmU6CisKKwkJIGZsYWcgYml0ICAgfCBjcHVpZCBiaXQgICAgfCBtZWFuaW5nCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAgICB8CSAgICAgICAgICAgfCB0aW1lIG1lYXN1cmVzIHRha2VuIGFjcm9zcworCQkgICAgIDAgICAgICB8CSAgIDI0ICAgICAgfCBtdWx0aXBsZSBjcHVzIGFyZSBndWFyYW50ZWVkIHRvCisJCQkgICAgfAkJICAgfCBiZSBtb25vdG9uaWMKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQXZhaWxhYmlsaXR5IG9mIHRoaXMgTVNSIG11c3QgYmUgY2hlY2tlZCB2aWEgYml0IDMgaW4gMHg0MDAwMDAxIGNwdWlkCisJbGVhZiBwcmlvciB0byB1c2FnZS4KKworCitNU1JfS1ZNX1dBTExfQ0xPQ0s6ICAweDExCisKKwlkYXRhIGFuZCBmdW5jdGlvbmluZzogc2FtZSBhcyBNU1JfS1ZNX1dBTExfQ0xPQ0tfTkVXLiBVc2UgdGhhdCBpbnN0ZWFkLgorCisJVGhpcyBNU1IgZmFsbHMgb3V0c2lkZSB0aGUgcmVzZXJ2ZWQgS1ZNIHJhbmdlIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUKKwlmdXR1cmUuIEl0cyB1c2FnZSBpcyBkZXByZWNhdGVkLgorCisJQXZhaWxhYmlsaXR5IG9mIHRoaXMgTVNSIG11c3QgYmUgY2hlY2tlZCB2aWEgYml0IDAgaW4gMHg0MDAwMDAxIGNwdWlkCisJbGVhZiBwcmlvciB0byB1c2FnZS4KKworTVNSX0tWTV9TWVNURU1fVElNRTogMHgxMgorCisJZGF0YSBhbmQgZnVuY3Rpb25pbmc6IHNhbWUgYXMgTVNSX0tWTV9TWVNURU1fVElNRV9ORVcuIFVzZSB0aGF0IGluc3RlYWQuCisKKwlUaGlzIE1TUiBmYWxscyBvdXRzaWRlIHRoZSByZXNlcnZlZCBLVk0gcmFuZ2UgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZQorCWZ1dHVyZS4gSXRzIHVzYWdlIGlzIGRlcHJlY2F0ZWQuCisKKwlBdmFpbGFiaWxpdHkgb2YgdGhpcyBNU1IgbXVzdCBiZSBjaGVja2VkIHZpYSBiaXQgMCBpbiAweDQwMDAwMDEgY3B1aWQKKwlsZWFmIHByaW9yIHRvIHVzYWdlLgorCisJVGhlIHN1Z2dlc3RlZCBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBrdm1jbG9jayBwcmVzZW5jZSBpcyB0aGVuOgorCisJCWlmICgha3ZtX3BhcmFfYXZhaWxhYmxlKCkpICAgIC8qIHJlZmVyIHRvIGNwdWlkLnR4dCAqLworCQkJcmV0dXJuIE5PTl9QUkVTRU5UOworCisJCWZsYWdzID0gY3B1aWRfZWF4KDB4NDAwMDAwMDEpOworCQlpZiAoZmxhZ3MgJiAzKSB7CisJCQltc3Jfa3ZtX3N5c3RlbV90aW1lID0gTVNSX0tWTV9TWVNURU1fVElNRV9ORVc7CisJCQltc3Jfa3ZtX3dhbGxfY2xvY2sgPSBNU1JfS1ZNX1dBTExfQ0xPQ0tfTkVXOworCQkJcmV0dXJuIFBSRVNFTlQ7CisJCX0gZWxzZSBpZiAoZmxhZ3MgJiAwKSB7CisJCQltc3Jfa3ZtX3N5c3RlbV90aW1lID0gTVNSX0tWTV9TWVNURU1fVElNRTsKKwkJCW1zcl9rdm1fd2FsbF9jbG9jayA9IE1TUl9LVk1fV0FMTF9DTE9DSzsKKwkJCXJldHVybiBQUkVTRU5UOworCQl9IGVsc2UKKwkJCXJldHVybiBOT05fUFJFU0VOVDsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3ZtL3Jldmlldy1jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9rdm0vcmV2aWV3LWNoZWNrbGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwNDc1YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24va3ZtL3Jldmlldy1jaGVja2xpc3QudHh0CkBAIC0wLDAgKzEsMzggQEAKK1JldmlldyBjaGVja2xpc3QgZm9yIGt2bSBwYXRjaGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisxLiAgVGhlIHBhdGNoIG11c3QgZm9sbG93IERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgYW5kCisgICAgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4KKworMi4gIFBhdGNoZXMgc2hvdWxkIGJlIGFnYWluc3Qga3ZtLmdpdCBtYXN0ZXIgYnJhbmNoLgorCiszLiAgSWYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgYSBuZXcgdXNlcnNwYWNlIEFQSToKKyAgICAtIHRoZSBBUEkgbXVzdCBiZSBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24va3ZtL2FwaS50eHQKKyAgICAtIHRoZSBBUEkgbXVzdCBiZSBkaXNjb3ZlcmFibGUgdXNpbmcgS1ZNX0NIRUNLX0VYVEVOU0lPTgorCis0LiAgTmV3IHN0YXRlIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvciBzYXZlL3Jlc3RvcmUuCisKKzUuICBOZXcgZmVhdHVyZXMgbXVzdCBkZWZhdWx0IHRvIG9mZiAodXNlcnNwYWNlIHNob3VsZCBleHBsaWNpdGx5IHJlcXVlc3QgdGhlbSkuCisgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGNhbiBhbmQgc2hvdWxkIGRlZmF1bHQgdG8gb24uCisKKzYuICBOZXcgY3B1IGZlYXR1cmVzIHNob3VsZCBiZSBleHBvc2VkIHZpYSBLVk1fR0VUX1NVUFBPUlRFRF9DUFVJRDIKKworNy4gIEVtdWxhdG9yIGNoYW5nZXMgc2hvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IHVuaXQgdGVzdHMgZm9yIHFlbXUta3ZtLmdpdAorICAgIGt2bS90ZXN0IGRpcmVjdG9yeS4KKworOC4gIENoYW5nZXMgc2hvdWxkIGJlIHZlbmRvciBuZXV0cmFsIHdoZW4gcG9zc2libGUuICBDaGFuZ2VzIHRvIGNvbW1vbiBjb2RlCisgICAgYXJlIGJldHRlciB0aGFuIGR1cGxpY2F0aW5nIGNoYW5nZXMgdG8gdmVuZG9yIGNvZGUuCisKKzkuICBTaW1pbGFybHksIHByZWZlciBjaGFuZ2VzIHRvIGFyY2ggaW5kZXBlbmRlbnQgY29kZSB0aGFuIHRvIGFyY2ggZGVwZW5kZW50CisgICAgY29kZS4KKworMTAuIFVzZXIva2VybmVsIGludGVyZmFjZXMgYW5kIGd1ZXN0L2hvc3QgaW50ZXJmYWNlcyBtdXN0IGJlIDY0LWJpdCBjbGVhbgorICAgIChhbGwgdmFyaWFibGVzIGFuZCBzaXplcyBuYXR1cmFsbHkgYWxpZ25lZCBvbiA2NC1iaXQ7IHVzZSBzcGVjaWZpYyB0eXBlcworICAgIG9ubHkgLSB1NjQgcmF0aGVyIHRoYW4gdWxvbmcpLgorCisxMS4gTmV3IGd1ZXN0IHZpc2libGUgZmVhdHVyZXMgbXVzdCBlaXRoZXIgYmUgZG9jdW1lbnRlZCBpbiBhIGhhcmR3YXJlIG1hbnVhbAorICAgIG9yIGJlIGFjY29tcGFuaWVkIGJ5IGRvY3VtZW50YXRpb24uCisKKzEyLiBGZWF0dXJlcyBtdXN0IGJlIHJvYnVzdCBhZ2FpbnN0IHJlc2V0IGFuZCBrZXhlYyAtIGZvciBleGFtcGxlLCBzaGFyZWQKKyAgICBob3N0L2d1ZXN0IG1lbW9yeSBtdXN0IGJlIHVuc2hhcmVkIHRvIHByZXZlbnQgdGhlIGhvc3QgZnJvbSB3cml0aW5nIHRvCisgICAgZ3Vlc3QgbWVtb3J5IHRoYXQgdGhlIGd1ZXN0IGhhcyBub3QgcmVzZXJ2ZWQgZm9yIHRoaXMgcHVycG9zZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy9hY2VyLXdtaS50eHQgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvYWNlci13bWkudHh0CmluZGV4IDA3NjhmY2MuLjRiZWFmYTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy9hY2VyLXdtaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL2FjZXItd21pLnR4dApAQCAtMTczLDcgKzE3Myw3IEBACiAqKioqKioqCiAKIE9sYWYgVGF1YmVyLCB3aG8gZGlkIHRoZSByZWFsIGhhcmQgd29yayB3aGVuIGhlIGRldmVsb3BlZCBhY2VyaGsKLWh0dHA6Ly93d3cuaW5mb3JtYXRpay5odS1iZXJsaW4uZGUvfnRhdWJlci9hY2VyaGsKK2h0dHA6Ly93d3cuY2FrZXkuZGUvYWNlcmhrLwogQWxsIHRoZSBhdXRob3JzIG9mIGxhcHRvcCBBQ1BJIG1vZHVsZXMgaW4gdGhlIGtlcm5lbCwgd2hvc2Ugd29yawogd2FzIGFuIGluc3BpcmF0aW9uIGluIHRoZSBlYXJseSBkYXlzIG9mIGFjZXJfYWNwaQogTWF0aGlldSBTZWdhdWQsIHdobyBzb2x2ZWQgdGhlIHByb2JsZW0gd2l0aCBoYXZpbmcgdG8gbW9kcHJvYmUgdGhlIGRyaXZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CmluZGV4IGZjMTU1MzguLmY2ZjgwMjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKQEAgLTk2MCw3MCArOTYwLDIxIEBACiAJc3Vic3lzdGVtLCBhbmQgZm9sbG93IGFsbCBvZiB0aGUgaHdtb24gZ3VpZGVsaW5lcyBhdAogCURvY3VtZW50YXRpb24vaHdtb24uCiAKK0VYUEVSSU1FTlRBTDogRW1iZWRkZWQgY29udHJvbGxlciByZWdpc3RlciBkdW1wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1FWFBFUklNRU5UQUw6IEVtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZHVtcCAtLSAvcHJvYy9hY3BpL2libS9lY2R1bXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmZWF0dXJlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgdGhpbmtwYWQgZHJpdmVyIGFueW1vcmUuCitJbnN0ZWFkIHRoZSBFQyBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCAvc3lzL2tlcm5lbC9kZWJ1Zy9lYyB3aXRoCithIHVzZXJzcGFjZSB0b29sIHdoaWNoIGNhbiBiZSBmb3VuZCBoZXJlOgorZnRwOi8vZnRwLnN1c2UuY29tL3B1Yi9wZW9wbGUvdHJlbm4vc291cmNlcy9lYwogCi1UaGlzIGZlYXR1cmUgaXMgbWFya2VkIEVYUEVSSU1FTlRBTCBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbgotZGlyZWN0bHkgYWNjZXNzZXMgaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIFVTRQotV0lUSCBDQVVUSU9OISBUbyB1c2UgdGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlCi1leHBlcmltZW50YWw9MSBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCi0KLVRoaXMgZmVhdHVyZSBkdW1wcyB0aGUgdmFsdWVzIG9mIDI1NiBlbWJlZGRlZCBjb250cm9sbGVyCi1yZWdpc3RlcnMuIFZhbHVlcyB3aGljaCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgcmVnaXN0ZXJzCi13ZXJlIGR1bXBlZCBhcmUgbWFya2VkIHdpdGggYSBzdGFyOgotCi1bcm9vdEB4NDAgaWJtLWFjcGldIyBjYXQgL3Byb2MvYWNwaS9pYm0vZWNkdW1wCi1FQyAgICAgICArMDAgKzAxICswMiArMDMgKzA0ICswNSArMDYgKzA3ICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGYKLUVDIDB4MDA6ICBhNyAgNDcgIDg3ICAwMSAgZmUgIDk2ICAwMCAgMDggIDAxICAwMCAgY2IgIDAwICAwMCAgMDAgIDQwICAwMAotRUMgMHgxMDogIDAwICAwMCAgZmYgIGZmICBmNCAgM2MgIDg3ICAwOSAgMDEgIGZmICA0MiAgMDEgIGZmICBmZiAgMGQgIDAwCi1FQyAweDIwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMyAgNDMgIDAwICAwMCAgODAKLUVDIDB4MzA6ICAwMSAgMDcgIDFhICAwMCAgMzAgIDA0ICAwMCAgMDAgKjg1ICAwMCAgMDAgIDEwICAwMCAgNTAgIDAwICAwMAotRUMgMHg0MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDE0ICAwMSAgMDAgIDA0ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCi1FQyAweDUwOiAgMDAgIGMwICAwMiAgMGQgIDAwICAwMSAgMDEgIDAyICAwMiAgMDMgIDAzICAwMyAgMDMgKmJjICowMiAqYmMKLUVDIDB4NjA6ICowMiAqYmMgKjAyICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAotRUMgMHg3MDogIDAwICAwMCAgMDAgIDAwICAwMCAgMTIgIDMwICA0MCAqMjQgKjI2ICoyYyAqMjcgKjIwICA4MCAqMWYgIDgwCi1FQyAweDgwOiAgMDAgIDAwICAwMCAgMDYgKjM3ICowZSAgMDMgIDAwICAwMCAgMDAgIDBlICAwNyAgMDAgIDAwICAwMCAgMDAKLUVDIDB4OTA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAotRUMgMHhhMDogKmZmICAwOSAgZmYgIDA5ICBmZiAgZmYgKjY0ICAwMCAqMDAgKjAwICphMiAgNDEgKmZmICpmZiAqZTAgIDAwCi1FQyAweGIwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKLUVDIDB4YzA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAotRUMgMHhkMDogIDAzICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCi1FQyAweGUwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAxMSAgMjAgIDQ5ICAwNCAgMjQgIDA2ICA1NSAgMDMKLUVDIDB4ZjA6ICAzMSAgNTUgIDQ4ICA1NCAgMzUgIDM4ICA1NyAgNTcgIDA4ICAyZiAgNDUgIDczICAwNyAgNjUgIDZjICAxYQotCi1UaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWdpc3RlciBob2xkaW5nIHRoZSBmYW4KK1VzZSBpdCB0byBkZXRlcm1pbmUgdGhlIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGZhbgogc3BlZWQgb24gc29tZSBtb2RlbHMuIFRvIGRvIHRoYXQsIGRvIHRoZSBmb2xsb3dpbmc6Ci0KIAktIG1ha2Ugc3VyZSB0aGUgYmF0dGVyeSBpcyBmdWxseSBjaGFyZ2VkCiAJLSBtYWtlIHN1cmUgdGhlIGZhbiBpcyBydW5uaW5nCi0JLSBydW4gJ2NhdCAvcHJvYy9hY3BpL2libS9lY2R1bXAnIHNldmVyYWwgdGltZXMsIG9uY2UgcGVyIHNlY29uZCBvciBzbworCS0gdXNlIGFib3ZlIG1lbnRpb25lZCB0b29sIHRvIHJlYWQgb3V0IHRoZSBFQwogCi1UaGUgZmlyc3Qgc3RlcCBtYWtlcyBzdXJlIHZhcmlvdXMgY2hhcmdpbmctcmVsYXRlZCB2YWx1ZXMgZG9uJ3QKLXZhcnkuIFRoZSBzZWNvbmQgZW5zdXJlcyB0aGF0IHRoZSBmYW4tcmVsYXRlZCB2YWx1ZXMgZG8gdmFyeSwgc2luY2UKLXRoZSBmYW4gc3BlZWQgZmx1Y3R1YXRlcyBhIGJpdC4gVGhlIHRoaXJkIHdpbGwgKGhvcGVmdWxseSkgbWFyayB0aGUKLWZhbiByZWdpc3RlciB3aXRoIGEgc3RhcjoKLQotW3Jvb3RAeDQwIGlibS1hY3BpXSMgY2F0IC9wcm9jL2FjcGkvaWJtL2VjZHVtcAotRUMgICAgICAgKzAwICswMSArMDIgKzAzICswNCArMDUgKzA2ICswNyArMDggKzA5ICswYSArMGIgKzBjICswZCArMGUgKzBmCi1FQyAweDAwOiAgYTcgIDQ3ICA4NyAgMDEgIGZlICA5NiAgMDAgIDA4ICAwMSAgMDAgIGNiICAwMCAgMDAgIDAwICA0MCAgMDAKLUVDIDB4MTA6ICAwMCAgMDAgIGZmICBmZiAgZjQgIDNjICA4NyAgMDkgIDAxICBmZiAgNDIgIDAxICBmZiAgZmYgIDBkICAwMAotRUMgMHgyMDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDMgIDQzICAwMCAgMDAgIDgwCi1FQyAweDMwOiAgMDEgIDA3ICAxYSAgMDAgIDMwICAwNCAgMDAgIDAwICA4NSAgMDAgIDAwICAxMCAgMDAgIDUwICAwMCAgMDAKLUVDIDB4NDA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAxNCAgMDEgIDAwICAwNCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAotRUMgMHg1MDogIDAwICBjMCAgMDIgIDBkICAwMCAgMDEgIDAxICAwMiAgMDIgIDAzICAwMyAgMDMgIDAzICBiYyAgMDIgIGJjCi1FQyAweDYwOiAgMDIgIGJjICAwMiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKLUVDIDB4NzA6ICAwMCAgMDAgIDAwICAwMCAgMDAgIDEyICAzMCAgNDAgIDI0ICAyNyAgMmMgIDI3ICAyMSAgODAgIDFmICA4MAotRUMgMHg4MDogIDAwICAwMCAgMDAgIDA2ICpiZSAgMGQgIDAzICAwMCAgMDAgIDAwICAwZSAgMDcgIDAwICAwMCAgMDAgIDAwCi1FQyAweDkwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKLUVDIDB4YTA6ICBmZiAgMDkgIGZmICAwOSAgZmYgIGZmICA2NCAgMDAgIDAwICAwMCAgYTIgIDQxICBmZiAgZmYgIGUwICAwMAotRUMgMHhiMDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwCi1FQyAweGMwOiAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAKLUVDIDB4ZDA6ICAwMyAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMAotRUMgMHhlMDogIDAwICAwMCAgMDAgIDAwICAwMCAgMDAgIDAwICAwMCAgMTEgIDIwICA0OSAgMDQgIDI0ICAwNiAgNTUgIDAzCi1FQyAweGYwOiAgMzEgIDU1ICA0OCAgNTQgIDM1ICAzOCAgNTcgIDU3ICAwOCAgMmYgIDQ1ICA3MyAgMDcgIDY1ICA2YyAgMWEKLQotQW5vdGhlciBzZXQgb2YgdmFsdWVzIHRoYXQgdmFyaWVzIG9mdGVuIGlzIHRoZSB0ZW1wZXJhdHVyZQorT2Z0ZW4gZmFuIGFuZCB0ZW1wZXJhdHVyZSB2YWx1ZXMgdmFyeSBiZXR3ZWVuCiByZWFkaW5ncy4gU2luY2UgdGVtcGVyYXR1cmVzIGRvbid0IGNoYW5nZSB2YXJ5IGZhc3QsIHlvdSBjYW4gdGFrZQogc2V2ZXJhbCBxdWljayBkdW1wcyB0byBlbGltaW5hdGUgdGhlbS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZG0udHh0IGIvRG9jdW1lbnRhdGlvbi9sZG0udHh0CmluZGV4IDcxODA4NWIuLjRmODBlZGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGRtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xkbS50eHQKQEAgLTk4LDcgKzk4LDcgQEAKIFRoZXJlIGlzIGFuIE92ZXJ2aWV3IG9mIHRoZSBMRE0gdG9nZXRoZXIgd2l0aCBjb21wbGV0ZSBUZWNobmljYWwgRG9jdW1lbnRhdGlvbi4KIEl0IGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQuCiAKLSAgaHR0cDovL3d3dy5saW51eC1udGZzLm9yZy9jb250ZW50L3ZpZXcvMTkvMzcvCisgIGh0dHA6Ly93d3cubGludXgtbnRmcy5vcmcvCiAKIElmIHlvdSBoYXZlIGFueSBMRE0gcXVlc3Rpb25zIHRoYXQgYXJlbid0IGFuc3dlcmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLCBlbWFpbAogbWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21kLnR4dCBiL0RvY3VtZW50YXRpb24vbWQudHh0CmluZGV4IGU0ZTg5M2UuLmE4MWM3YjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWQudHh0CkBAIC0xLDUgKzEsNSBAQAogVG9vbHMgdGhhdCBtYW5hZ2UgbWQgZGV2aWNlcyBjYW4gYmUgZm91bmQgYXQKLSAgIGh0dHA6Ly93d3cuPGNvdW50cnk+Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL3JhaWQvLi4uLgorICAgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9yYWlkLyAKIAogCiBCb290IHRpbWUgYXNzZW1ibHkgb2YgUkFJRCBhcnJheXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2MycG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL21pc2MtZGV2aWNlcy9jMnBvcnQudHh0CmluZGV4IGQ5YmY5M2UuLmVhNzM0NDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2MycG9ydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvYzJwb3J0LnR4dApAQCAtMzIsMTAgKzMyLDEwIEBACiBTaWxpY29uIExhYm9yYXRvcmllcyBzaXRlXSwgc2VlOgogCiAtIEFOMTI3OiBGTEFTSCBQcm9ncmFtbWluZyB2aWEgdGhlIEMyIEludGVyZmFjZSBhdAotaHR0cDovL3d3dy5zaWxhYnMuY29tL3B1YmxpYy9kb2N1bWVudHMvdHB1Yl9kb2MvYW5vdGUvTWljcm9jb250cm9sbGVycy9TbWFsbF9Gb3JtX0ZhY3Rvci9lbi9hbjEyNy5wZGYsIGFuZAoraHR0cDovL3d3dy5zaWxhYnMuY29tL1N1cHBvcnQgRG9jdW1lbnRzL1RlY2huaWNhbERvY3MvYW4xMjcucGRmIAogCiAtIEMyIFNwZWNpZmljYXRpb24gYXQKLWh0dHA6Ly93d3cuc2lsYWJzLmNvbS9wdWJsaWMvZG9jdW1lbnRzL3RwdWJfZG9jL3NwZWMvTWljcm9jb250cm9sbGVycy9lbi9DMnNwZWMucGRmLAoraHR0cDovL3d3dy5zaWxhYnMuY29tL3BhZ2VzL0Rvd25sb2FkRG9jLmFzcHg/RklMRVVSTD1TdXBwb3J0JTIwRG9jdW1lbnRzL1RlY2huaWNhbERvY3MvYW4xMjcucGRmJnNyYz1TZWFyY2hSZXN1bHRzCiAKIGhvd2V2ZXIgaXQgaW1wbGVtZW50cyBhIHR3byB3aXJlIHNlcmlhbCBjb21tdW5pY2F0aW9uIHByb3RvY29sIChiaXQKIGJhbmdpbmcpIGRlc2lnbmVkIHRvIGVuYWJsZSBpbi1zeXN0ZW0gcHJvZ3JhbW1pbmcsIGRlYnVnZ2luZywgYW5kCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL210ZC9uYW5kX2VjYy50eHQgYi9Eb2N1bWVudGF0aW9uL210ZC9uYW5kX2VjYy50eHQKaW5kZXggMjc0ODIxYi4uOTkwZWZkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tdGQvbmFuZF9lY2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbXRkL25hbmRfZWNjLnR4dApAQCAtOTEsNyArOTEsNyBAQAogRUNDIDIgICBjcDUgICBjcDQgICBjcDMgICBjcDIgICBjcDEgICBjcDAgICAgICAxICAgICAxCiAKIEkgZGV0ZWN0ZWQgYWZ0ZXIgd3JpdGluZyB0aGlzIHRoYXQgU1QgYXBwbGljYXRpb24gbm90ZSBBTjE4MjMKLShodHRwOi8vd3d3LnN0LmNvbS9zdG9ubGluZS9ib29rcy9wZGYvZG9jcy8xMDEyMy5wZGYpIGdpdmVzIGEgbXVjaAorKGh0dHA6Ly93d3cuc3QuY29tL3N0b25saW5lLykgZ2l2ZXMgYSBtdWNoCiBuaWNlciBwaWN0dXJlLihidXQgdGhleSB1c2UgbGluZSBwYXJpdHkgYXMgdGVybSB3aGVyZSBJIHVzZSByb3cgcGFyaXR5KQogT2ggd2VsbCwgSSdtIGdyYXBoaWNhbGx5IGNoYWxsZW5nZWQsIHNvIHN1ZmZlciB3aXRoIG1lIGZvciBhIG1vbWVudCA6LSkKIEFuZCBJIGNvdWxkIG5vdCByZXVzZSB0aGUgU1QgcGljdHVyZSBhbnl3YXkgZm9yIGNvcHlyaWdodCByZWFzb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzNjNTA5LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8zYzUwOS50eHQKaW5kZXggM2M0NWQ1ZC4uZGNjOWVhZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzNjNTA5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvM2M1MDkudHh0CkBAIC0zMSw3ICszMSw3IEBACiBMYXJnZSBwb3J0aW9ucyBvZiB0aGlzIGRvY3VtZW50YXRpb24gd2VyZSBoZWF2aWx5IGJvcnJvd2VkIGZyb20gdGhlIGd1aWRlCiB3cml0dGVuIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgdGhlIDNjNTA5IGRyaXZlciwgRG9uYWxkIEJlY2tlci4gVGhlIG1hc3RlcgogY29weSBvZiB0aGF0IGRvY3VtZW50LCB3aGljaCBjb250YWlucyBub3RlcyBvbiBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgZHJpdmVyLAotY3VycmVudGx5IHJlc2lkZXMgb24gU2N5bGQgd2ViIHNlcnZlcjogaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay8zYzUwOS5odG1sLgorY3VycmVudGx5IHJlc2lkZXMgb24gU2N5bGQgd2ViIHNlcnZlcjogaHR0cDovL3d3dy5zY3lsZC5jb20vLgogCiAKICgxKSBTcGVjaWFsIERyaXZlciBGZWF0dXJlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5pcHcyMTAwIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5pcHcyMTAwCmluZGV4IGYzZmNhYTQuLjZmODVlMWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjEwMAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvUkVBRE1FLmlwdzIxMDAKQEAgLTcyLDggKzcyLDcgQEAKIHNvbHV0aW9uIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gZGV2ZWxvcG1lbnQsIHBsZWFzZQogb2J0YWluIGEgdGVzdGVkIGRyaXZlciBmcm9tIEludGVsIEN1c3RvbWVyIFN1cHBvcnQgYXQ6CiAKLWh0dHA6Ly9zdXBwb3J0LmludGVsLmNvbS9zdXBwb3J0L25vdGVib29rL3NiL0NTLTAwNjQwOC5odG0KLQoraHR0cDovL3d3dy5pbnRlbC5jb20vc3VwcG9ydC93aXJlbGVzcy9zYi9DUy0wMDY0MDguaHRtCiAKIDEuIEludHJvZHVjdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjIwMCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuaXB3MjIwMAppbmRleCA4MGM3Mjg1Li42MTZhOGU1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvUkVBRE1FLmlwdzIyMDAKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5pcHcyMjAwCkBAIC04NSw3ICs4NSw3IEBACiBzb2x1dGlvbiBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuIGRldmVsb3BtZW50LCBwbGVhc2UgCiBvYnRhaW4gYSB0ZXN0ZWQgZHJpdmVyIGZyb20gSW50ZWwgQ3VzdG9tZXIgU3VwcG9ydCBhdDoKIAotaHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL3N1cHBvcnQvbm90ZWJvb2svc2IvQ1MtMDA2NDA4Lmh0bQoraHR0cDovL3N1cHBvcnQuaW50ZWwuY29tCiAKIAogMS4gICBJbnRyb2R1Y3Rpb24KQEAgLTE3MSw3ICsxNzEsNyBAQAogICAKICAgbGVkCiAJQ2FuIGJlIHVzZWQgdG8gdHVybiBvbiBleHBlcmltZW50YWwgTEVEIGNvZGUuCi0JMCA9IE9mZiwgMSA9IE9uLiAgRGVmYXVsdCBpcyAwLgorCTAgPSBPZmYsIDEgPSBPbi4gIERlZmF1bHQgaXMgMS4KIAogICBtb2RlCiAJQ2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IG1vZGUgb2YgdGhlIGFkYXB0ZXIuICAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuc2IxMDAwIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5zYjEwMDAKaW5kZXggZjgyZDQyNS4uZjkyYzJhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5zYjEwMDAKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1JFQURNRS5zYjEwMDAKQEAgLTI3LDggKzI3LDggQEAKICAgIGluIEZyYW5jbydzIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbiAudGFyLmd6IGZpbGUuICBTdXBwb3J0IGZvcgogICAgdGhlIHNiMTAwMCBkcml2ZXIgY2FuIGJlIGZvdW5kIGF0OgogCi0gICAgICBodHRwOi8vaG9tZS5hZGVscGhpYS5uZXQvfnNpZ2xlcmNtL3NiMTAwMC5odG1sCi0gICAgICBodHRwOi8vbGludXhwb3dlci5jeC9+Y2FibGUvCisgICAgICBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8qL2h0dHA6Ly9ob21lLmFkZWxwaGlhLm5ldC9+c2lnbGVyY20vc2IxMDAwLmh0bWwKKyAgICAgIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL2xpbnV4cG93ZXIuY3gvfmNhYmxlLwogCiAgICBhbG9uZyB3aXRoIHRoZXNlIHV0aWxpdGllcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2FyY25ldC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXJjbmV0LnR4dAppbmRleCA3OTYwMTI1Li45ZmY1Nzk1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXJjbmV0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXJjbmV0LnR4dApAQCAtNjgsNyArNjgsNyBAQAogbGlzdCwgbWFpbCB0byBsaW51eC1hcmNuZXRAdGljaHkuY2gudWouZWR1LnBsLgogCiBUaGVyZSBhcmUgYXJjaGl2ZXMgb2YgdGhlIG1haWxpbmcgbGlzdCBhdDoKLQlodHRwOi8vdGljaHkuY2gudWouZWR1LnBsL2xpc3RzL2xpbnV4LWFyY25ldAorCWh0dHA6Ly9lcGlzdG9sYXJ5Lm9yZy9tYWlsbWFuL2xpc3RpbmZvLmNnaS9hcmNuZXQKIAogVGhlIHBlb3BsZSBvbiBsaW51eC1uZXRAdmdlci5rZXJuZWwub3JnIGhhdmUgYWxzbyBiZWVuIGtub3duIHRvIGJlIHZlcnkKIGhlbHBmdWwsIGVzcGVjaWFsbHkgd2hlbiB3ZSdyZSB0YWxraW5nIGFib3V0IEFMUEhBIExpbnV4IGtlcm5lbHMgdGhhdCBtYXkgb3IKQEAgLTc5LDcgKzc5LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogWW91IGNhbiB0cnkgbXkgQVJDTkVUIHBhZ2Ugb24gdGhlIFdvcmxkIFdpZGUgV2ViIGF0OgotCWh0dHA6Ly93d3cud29ybGR2aXNpb25zLmNhL35hcGVud2Fyci9hcmNuZXQvCisJaHR0cDovL3d3dy5xaXMubmV0L35qc2NobWl0ei9hcmNuZXQvCQogCiBBbHNvLCBTTUMgKG9uZSBvZiB0aGUgY29tcGFuaWVzIHRoYXQgbWFrZXMgQVJDbmV0IGNhcmRzKSBoYXMgYSBXV1cgc2l0ZSB5b3UKIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4sIHdoaWNoIGluY2x1ZGVzIHNldmVyYWwgZHJpdmVycyBmb3IgdmFyaW91cyBjYXJkcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CmluZGV4IDYxZjUxNmIuLmQyYjYyYjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKQEAgLTQ5LDYgKzQ5LDcgQEAKIDMuMwlDb25maWd1cmluZyBCb25kaW5nIE1hbnVhbGx5IHdpdGggSWZlbnNsYXZlCiAzLjMuMQkJQ29uZmlndXJpbmcgTXVsdGlwbGUgQm9uZHMgTWFudWFsbHkKIDMuNAlDb25maWd1cmluZyBCb25kaW5nIE1hbnVhbGx5IHZpYSBTeXNmcworMy41CU92ZXJyaWRpbmcgQ29uZmlndXJhdGlvbiBmb3IgU3BlY2lhbCBDYXNlcwogCiA0LiBRdWVyeWluZyBCb25kaW5nIENvbmZpZ3VyYXRpb24KIDQuMQlCb25kaW5nIENvbmZpZ3VyYXRpb24KQEAgLTEzMTgsOCArMTMxOSw4NyBAQAogZWNobyArZXRoMiA+IC9zeXMvY2xhc3MvbmV0L2JvbmQxL2JvbmRpbmcvc2xhdmVzCiBlY2hvICtldGgzID4gL3N5cy9jbGFzcy9uZXQvYm9uZDEvYm9uZGluZy9zbGF2ZXMKIAorMy41IE92ZXJyaWRpbmcgQ29uZmlndXJhdGlvbiBmb3IgU3BlY2lhbCBDYXNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2hlbiB1c2luZyB0aGUgYm9uZGluZyBkcml2ZXIsIHRoZSBwaHlzaWNhbCBwb3J0IHdoaWNoIHRyYW5zbWl0cyBhIGZyYW1lIGlzCit0eXBpY2FsbHkgc2VsZWN0ZWQgYnkgdGhlIGJvbmRpbmcgZHJpdmVyLCBhbmQgaXMgbm90IHJlbGV2YW50IHRvIHRoZSB1c2VyIG9yCitzeXN0ZW0gYWRtaW5pc3RyYXRvci4gIFRoZSBvdXRwdXQgcG9ydCBpcyBzaW1wbHkgc2VsZWN0ZWQgdXNpbmcgdGhlIHBvbGljaWVzIG9mCit0aGUgc2VsZWN0ZWQgYm9uZGluZyBtb2RlLiAgT24gb2NjYXNpb24gaG93ZXZlciwgaXQgaXMgaGVscGZ1bCB0byBkaXJlY3QgY2VydGFpbgorY2xhc3NlcyBvZiB0cmFmZmljIHRvIGNlcnRhaW4gcGh5c2ljYWwgaW50ZXJmYWNlcyBvbiBvdXRwdXQgdG8gaW1wbGVtZW50CitzbGlnaHRseSBtb3JlIGNvbXBsZXggcG9saWNpZXMuICBGb3IgZXhhbXBsZSwgdG8gcmVhY2ggYSB3ZWIgc2VydmVyIG92ZXIgYQorYm9uZGVkIGludGVyZmFjZSBpbiB3aGljaCBldGgwIGNvbm5lY3RzIHRvIGEgcHJpdmF0ZSBuZXR3b3JrLCB3aGlsZSBldGgxCitjb25uZWN0cyB2aWEgYSBwdWJsaWMgbmV0d29yaywgaXQgbWF5IGJlIGRlc2lyb3VzIHRvIGJpYXMgdGhlIGJvbmQgdG8gc2VuZCBzYWlkCit0cmFmZmljIG92ZXIgZXRoMCBmaXJzdCwgdXNpbmcgZXRoMSBvbmx5IGFzIGEgZmFsbCBiYWNrLCB3aGlsZSBhbGwgb3RoZXIgdHJhZmZpYworY2FuIHNhZmVseSBiZSBzZW50IG92ZXIgZWl0aGVyIGludGVyZmFjZS4gIFN1Y2ggY29uZmlndXJhdGlvbnMgbWF5IGJlIGFjaGlldmVkCit1c2luZyB0aGUgdHJhZmZpYyBjb250cm9sIHV0aWxpdGllcyBpbmhlcmVudCBpbiBsaW51eC4KIAotNC4gUXVlcnlpbmcgQm9uZGluZyBDb25maWd1cmF0aW9uIAorQnkgZGVmYXVsdCB0aGUgYm9uZGluZyBkcml2ZXIgaXMgbXVsdGlxdWV1ZSBhd2FyZSBhbmQgMTYgcXVldWVzIGFyZSBjcmVhdGVkCit3aGVuIHRoZSBkcml2ZXIgaW5pdGlhbGl6ZXMgKHNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbXVsdGlxdWV1ZS50eHQKK2ZvciBkZXRhaWxzKS4gIElmIG1vcmUgb3IgbGVzcyBxdWV1ZXMgYXJlIGRlc2lyZWQgdGhlIG1vZHVsZSBwYXJhbWV0ZXIKK3R4X3F1ZXVlcyBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhpcyB2YWx1ZS4gIFRoZXJlIGlzIG5vIHN5c2ZzIHBhcmFtZXRlcgorYXZhaWxhYmxlIGFzIHRoZSBhbGxvY2F0aW9uIGlzIGRvbmUgYXQgbW9kdWxlIGluaXQgdGltZS4KKworVGhlIG91dHB1dCBvZiB0aGUgZmlsZSAvcHJvYy9uZXQvYm9uZGluZy9ib25kWCBoYXMgY2hhbmdlZCBzbyB0aGUgb3V0cHV0IFF1ZXVlCitJRCBpcyBub3cgcHJpbnRlZCBmb3IgZWFjaCBzbGF2ZToKKworQm9uZGluZyBNb2RlOiBmYXVsdC10b2xlcmFuY2UgKGFjdGl2ZS1iYWNrdXApCitQcmltYXJ5IFNsYXZlOiBOb25lCitDdXJyZW50bHkgQWN0aXZlIFNsYXZlOiBldGgwCitNSUkgU3RhdHVzOiB1cAorTUlJIFBvbGxpbmcgSW50ZXJ2YWwgKG1zKTogMAorVXAgRGVsYXkgKG1zKTogMAorRG93biBEZWxheSAobXMpOiAwCisKK1NsYXZlIEludGVyZmFjZTogZXRoMAorTUlJIFN0YXR1czogdXAKK0xpbmsgRmFpbHVyZSBDb3VudDogMAorUGVybWFuZW50IEhXIGFkZHI6IDAwOjFhOmEwOjEyOjhmOmNiCitTbGF2ZSBxdWV1ZSBJRDogMAorCitTbGF2ZSBJbnRlcmZhY2U6IGV0aDEKK01JSSBTdGF0dXM6IHVwCitMaW5rIEZhaWx1cmUgQ291bnQ6IDAKK1Blcm1hbmVudCBIVyBhZGRyOiAwMDoxYTphMDoxMjo4ZjpjYworU2xhdmUgcXVldWUgSUQ6IDIKKworVGhlIHF1ZXVlX2lkIGZvciBhIHNsYXZlIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGNvbW1hbmQ6CisKKyMgZWNobyAiZXRoMToyIiA+IC9zeXMvY2xhc3MvbmV0L2JvbmQwL2JvbmRpbmcvcXVldWVfaWQKKworQW55IGludGVyZmFjZSB0aGF0IG5lZWRzIGEgcXVldWVfaWQgc2V0IHNob3VsZCBzZXQgaXQgd2l0aCBtdWx0aXBsZSBjYWxscworbGlrZSB0aGUgb25lIGFib3ZlIHVudGlsIHByb3BlciBwcmlvcml0aWVzIGFyZSBzZXQgZm9yIGFsbCBpbnRlcmZhY2VzLiAgT24KK2Rpc3RyaWJ1dGlvbnMgdGhhdCBhbGxvdyBjb25maWd1cmF0aW9uIHZpYSBpbml0c2NyaXB0cywgbXVsdGlwbGUgJ3F1ZXVlX2lkJworYXJndW1lbnRzIGNhbiBiZSBhZGRlZCB0byBCT05ESU5HX09QVFMgdG8gc2V0IGFsbCBuZWVkZWQgc2xhdmUgcXVldWVzLgorCitUaGVzZSBxdWV1ZSBpZCdzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRjIHV0aWxpdHkgdG8gY29uZmlndXJlCithIG11bHRpcXVldWUgcWRpc2MgYW5kIGZpbHRlcnMgdG8gYmlhcyBjZXJ0YWluIHRyYWZmaWMgdG8gdHJhbnNtaXQgb24gY2VydGFpbgorc2xhdmUgZGV2aWNlcy4gIEZvciBpbnN0YW5jZSwgc2F5IHdlIHdhbnRlZCwgaW4gdGhlIGFib3ZlIGNvbmZpZ3VyYXRpb24gdG8KK2ZvcmNlIGFsbCB0cmFmZmljIGJvdW5kIHRvIDE5Mi4xNjguMS4xMDAgdG8gdXNlIGV0aDEgaW4gdGhlIGJvbmQgYXMgaXRzIG91dHB1dAorZGV2aWNlLiBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIHdvdWxkIGFjY29tcGxpc2ggdGhpczoKKworIyB0YyBxZGlzYyBhZGQgZGV2IGJvbmQwIGhhbmRsZSAxIHJvb3QgbXVsdGlxCisKKyMgdGMgZmlsdGVyIGFkZCBkZXYgYm9uZDAgcHJvdG9jb2wgaXAgcGFyZW50IDE6IHByaW8gMSB1MzIgbWF0Y2ggaXAgZHN0IFwKKwkxOTIuMTY4LjEuMTAwIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcgMgorCitUaGVzZSBjb21tYW5kcyB0ZWxsIHRoZSBrZXJuZWwgdG8gYXR0YWNoIGEgbXVsdGlxdWV1ZSBxdWV1ZSBkaXNjaXBsaW5lIHRvIHRoZQorYm9uZDAgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgdHJhZmZpYyBlbnF1ZXVlZCB0byBpdCwgc3VjaCB0aGF0IHBhY2tldHMgd2l0aCBhIGRzdAoraXAgb2YgMTkyLjE2OC4xLjEwMCBoYXZlIHRoZWlyIG91dHB1dCBxdWV1ZSBtYXBwaW5nIHZhbHVlIG92ZXJ3cml0dGVuIHRvIDIuCitUaGlzIHZhbHVlIGlzIHRoZW4gcGFzc2VkIGludG8gdGhlIGRyaXZlciwgY2F1c2luZyB0aGUgbm9ybWFsIG91dHB1dCBwYXRoCitzZWxlY3Rpb24gcG9saWN5IHRvIGJlIG92ZXJyaWRkZW4sIHNlbGVjdGluZyBpbnN0ZWFkIHFpZCAyLCB3aGljaCBtYXBzIHRvIGV0aDEuCisKK05vdGUgdGhhdCBxaWQgdmFsdWVzIGJlZ2luIGF0IDEuICBRaWQgMCBpcyByZXNlcnZlZCB0byBpbml0aWF0ZSB0byB0aGUgZHJpdmVyCit0aGF0IG5vcm1hbCBvdXRwdXQgcG9saWN5IHNlbGVjdGlvbiBzaG91bGQgdGFrZSBwbGFjZS4gIE9uZSBiZW5lZml0IHRvIHNpbXBseQorbGVhdmluZyB0aGUgcWlkIGZvciBhIHNsYXZlIHRvIDAgaXMgdGhlIG11bHRpcXVldWUgYXdhcmVuZXNzIGluIHRoZSBib25kaW5nCitkcml2ZXIgdGhhdCBpcyBub3cgcHJlc2VudC4gIFRoaXMgYXdhcmVuZXNzIGFsbG93cyB0YyBmaWx0ZXJzIHRvIGJlIHBsYWNlZCBvbgorc2xhdmUgZGV2aWNlcyBhcyB3ZWxsIGFzIGJvbmQgZGV2aWNlcyBhbmQgdGhlIGJvbmRpbmcgZHJpdmVyIHdpbGwgc2ltcGx5IGFjdCBhcworYSBwYXNzLXRocm91Z2ggZm9yIHNlbGVjdGluZyBvdXRwdXQgcXVldWVzIG9uIHRoZSBzbGF2ZSBkZXZpY2UgcmF0aGVyIHRoYW4gCitvdXRwdXQgcG9ydCBzZWxlY3Rpb24uCisKK1RoaXMgZmVhdHVyZSBmaXJzdCBhcHBlYXJlZCBpbiBib25kaW5nIGRyaXZlciB2ZXJzaW9uIDMuNy4wIGFuZCBzdXBwb3J0IGZvcgorb3V0cHV0IHNsYXZlIHNlbGVjdGlvbiB3YXMgbGltaXRlZCB0byByb3VuZC1yb2JpbiBhbmQgYWN0aXZlLWJhY2t1cCBtb2Rlcy4KKworNCBRdWVyeWluZyBCb25kaW5nIENvbmZpZ3VyYXRpb24KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiA0LjEgQm9uZGluZyBDb25maWd1cmF0aW9uCkBAIC0yNDMyLDcgKzI1MTIsNyBAQAogaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vYm9uZGluZy1kZXZlbAogCiBEb25hbGQgQmVja2VyJ3MgRXRoZXJuZXQgRHJpdmVycyBhbmQgZGlhZyBwcm9ncmFtcyBtYXkgYmUgZm91bmQgYXQgOgotIC0gaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay8KKyAtIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay8gCiAKIFlvdSB3aWxsIGFsc28gZmluZCBhIGxvdCBvZiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgRXRoZXJuZXQsIE5XYXksIE1JSSwKIGV0Yy4gYXQgd3d3LnNjeWxkLmNvbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYWlmL3NwaV9wb3J0aW5nLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYWlmL3NwaV9wb3J0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQ3YzkyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NhaWYvc3BpX3BvcnRpbmcudHh0CkBAIC0wLDAgKzEsMjA4IEBACistIENBSUYgU1BJIHBvcnRpbmcgLQorCistIENBSUYgU1BJIGJhc2ljczoKKworUnVubmluZyBDQUlGIG92ZXIgU1BJIG5lZWRzIHNvbWUgZXh0cmEgc2V0dXAsIG93aW5nIHRvIHRoZSBuYXR1cmUgb2YgU1BJLgorVHdvIGV4dHJhIEdQSU9zIGhhdmUgYmVlbiBhZGRlZCBpbiBvcmRlciB0byBuZWdvdGlhdGUgdGhlIHRyYW5zZmVycworIGJldHdlZW4gdGhlIG1hc3RlciBhbmQgdGhlIHNsYXZlLiBUaGUgbWluaW11bSByZXF1aXJlbWVudCBmb3IgcnVubmluZworQ0FJRiBvdmVyIFNQSSBpcyBhIFNQSSBzbGF2ZSBjaGlwIGFuZCB0d28gR1BJT3MgKG1vcmUgZGV0YWlscyBiZWxvdykuCitQbGVhc2Ugbm90ZSB0aGF0IHJ1bm5pbmcgYXMgYSBzbGF2ZSBpbXBsaWVzIHRoYXQgeW91IG5lZWQgdG8ga2VlcCB1cAord2l0aCB0aGUgbWFzdGVyIGNsb2NrLiBBbiBvdmVycnVuIG9yIHVuZGVycnVuIGV2ZW50IGlzIGZhdGFsLgorCistIENBSUYgU1BJIGZyYW1ld29yazoKKworVG8gbWFrZSBwb3J0aW5nIGFzIGVhc3kgYXMgcG9zc2libGUsIHRoZSBDQUlGIFNQSSBoYXMgYmVlbiBkaXZpZGVkIGluCit0d28gcGFydHMuIFRoZSBmaXJzdCBwYXJ0IChjYWxsZWQgdGhlIGludGVyZmFjZSBwYXJ0KSBkZWFscyB3aXRoIGFsbAorZ2VuZXJpYyBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgbGVuZ3RoIGZyYW1pbmcsIFNQSSBmcmFtZSBuZWdvdGlhdGlvbgorYW5kIFNQSSBmcmFtZSBkZWxpdmVyeSBhbmQgdHJhbnNtaXNzaW9uLiBUaGUgb3RoZXIgcGFydCBpcyB0aGUgQ0FJRgorU1BJIHNsYXZlIGRldmljZSBwYXJ0LCB3aGljaCBpcyB0aGUgbW9kdWxlIHRoYXQgeW91IGhhdmUgdG8gd3JpdGUgaWYKK3lvdSB3YW50IHRvIHJ1biBTUEkgQ0FJRiBvbiBhIG5ldyBoYXJkd2FyZS4gVGhpcyBwYXJ0IHRha2VzIGNhcmUgb2YKK3RoZSBwaHlzaWNhbCBoYXJkd2FyZSwgYm90aCB3aXRoIHJlZ2FyZCB0byBTUEkgYW5kIHRvIEdQSU9zLgorCistIEltcGxlbWVudGluZyBhIENBSUYgU1BJIGRldmljZToKKworCS0gRnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGUgQ0FJRiBTUEkgc2xhdmUgZGV2aWNlOgorCisJSW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgU1BJIGRldmljZSB5b3Ugd2lsbCwgYXMgYSBtaW5pbXVtLAorCW5lZWQgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKwlmdW5jdGlvbnM6CisKKwlpbnQgKCppbml0X3hmZXIpIChzdHJ1Y3QgY2ZzcGlfeGZlciAqIHhmZXIsIHN0cnVjdCBjZnNwaV9kZXYgKmRldik6CisKKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgQ0FJRiBTUEkgaW50ZXJmYWNlIHRvIGdpdmUKKwl5b3UgYSBjaGFuY2UgdG8gc2V0IHVwIHlvdXIgaGFyZHdhcmUgdG8gYmUgcmVhZHkgdG8gcmVjZWl2ZQorCWEgc3RyZWFtIG9mIGRhdGEgZnJvbSB0aGUgbWFzdGVyLiBUaGUgeGZlciBzdHJ1Y3R1cmUgY29udGFpbnMKKwlib3RoIHBoeXNpY2FsIGFuZCBsb2dpY2FsIGFkcmVzc2VzLCBhcyB3ZWxsIGFzIHRoZSB0b3RhbCBsZW5ndGgKKwlvZiB0aGUgdHJhbnNmZXIgaW4gYm90aCBkaXJlY3Rpb25zLlRoZSBkZXYgcGFyYW1ldGVyIGNhbiBiZSB1c2VkCisJdG8gbWFwIHRvIGRpZmZlcmVudCBDQUlGIFNQSSBzbGF2ZSBkZXZpY2VzLgorCisJdm9pZCAoKnNpZ194ZmVyKSAoYm9vbCB4ZmVyLCBzdHJ1Y3QgY2ZzcGlfZGV2ICpkZXYpOgorCisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIENBSUYgU1BJIGludGVyZmFjZSB3aGVuIHRoZSBvdXRwdXQKKwkoU1BJX0lOVCkgR1BJTyBuZWVkcyB0byBjaGFuZ2Ugc3RhdGUuIFRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSB4ZmVyCisJdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEdQSU8gc2hvdWxkIGJlIGFzc2VydGVkIChISUdIKSBvcgorCWRlYXNzZXJ0ZWQgKExPVykuIFRoZSBkZXYgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIG1hcCB0byBkaWZmZXJlbnQgQ0FJRgorCVNQSSBzbGF2ZSBkZXZpY2VzLgorCisJLSBGdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZSBDQUlGIFNQSSBpbnRlcmZhY2U6CisKKwl2b2lkICgqc3NfY2IpIChib29sIGFzc2VydCwgc3RydWN0IGNmc3BpX2lmYyAqaWZjKTsKKworCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBDQUlGIFNQSSBzbGF2ZSBkZXZpY2UgaW4gb3JkZXIgdG8KKwlzaWduYWwgYSBjaGFuZ2Ugb2Ygc3RhdGUgb2YgdGhlIGlucHV0IEdQSU8gKFNTKSB0byB0aGUgaW50ZXJmYWNlLgorCU9ubHkgYWN0aXZlIGVkZ2VzIGFyZSBtYW5kYXRvcnkgdG8gYmUgcmVwb3J0ZWQuCisJVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gSVJRIGNvbnRleHQgKHJlY29tbWVuZGVkIGluIG9yZGVyCisJbm90IHRvIGludHJvZHVjZSBsYXRlbmN5KS4gVGhlIGlmYyBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBwb2ludGVyCisJcmV0dXJuZWQgZnJvbSB0aGUgcGxhdGZvcm0gcHJvYmUgZnVuY3Rpb24gaW4gdGhlIFNQSSBkZXZpY2Ugc3RydWN0dXJlLgorCisJdm9pZCAoKnhmZXJfZG9uZV9jYikgKHN0cnVjdCBjZnNwaV9pZmMgKmlmYyk7CisKKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgQ0FJRiBTUEkgc2xhdmUgZGV2aWNlIGluIG9yZGVyIHRvCisJcmVwb3J0IHRoYXQgYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUKKwljYWxsZWQgb25jZSBib3RoIHRoZSB0cmFuc21pc3Npb24gYW5kIHRoZSByZWNlcHRpb24gYXJlIGNvbXBsZXRlZC4KKwlUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCAocmVjb21tZW5kZWQgaW4gb3JkZXIKKwlub3QgdG8gaW50cm9kdWNlIGxhdGVuY3kpLiBUaGUgaWZjIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHBvaW50ZXIKKwlyZXR1cm5lZCBmcm9tIHRoZSBwbGF0Zm9ybSBwcm9iZSBmdW5jdGlvbiBpbiB0aGUgU1BJIGRldmljZSBzdHJ1Y3R1cmUuCisKKwktIENvbm5lY3RpbmcgdGhlIGJpdHMgYW5kIHBpZWNlczoKKworCQktIEZpbGxpbmcgaW4gdGhlIFNQSSBzbGF2ZSBkZXZpY2Ugc3RydWN0dXJlOgorCisJCUNvbm5lY3QgdGhlIG5lY2Vzc2FyeSBjYWxsYmFjayBmdW5jdGlvbnMuCisJCUluZGljYXRlIGNsb2NrIHNwZWVkICh1c2VkIHRvIGNhbGN1bGF0ZSB0b2dnbGUgZGVsYXlzKS4KKwkJQ2hvc2UgYSBzdWl0YWJsZSBuYW1lIChoZWxwcyBkZWJ1Z2dpbmcgaWYgeW91IHVzZSBzZXZlcmFsIENBSUYKKwkJU1BJIHNsYXZlIGRldmljZXMpLgorCQlBc3NpZ24geW91ciBwcml2YXRlIGRhdGEgKGNhbiBiZSB1c2VkIHRvIG1hcCB0byB5b3VyIHN0cnVjdHVyZSkuCisKKwkJLSBGaWxsaW5nIGluIHRoZSBTUEkgc2xhdmUgcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZToKKwkJQWRkIG5hbWUgb2YgZHJpdmVyIHRvIGNvbm5lY3QgdG8gKCJjZnNwaV9zc3BpIikuCisJCUFzc2lnbiB0aGUgU1BJIHNsYXZlIGRldmljZSBzdHJ1Y3R1cmUgYXMgcGxhdGZvcm0gZGF0YS4KKworLSBQYWRkaW5nOgorCitJbiBvcmRlciB0byBvcHRpbWl6ZSB0aHJvdWdocHV0LCBhIG51bWJlciBvZiBTUEkgcGFkZGluZyBvcHRpb25zIGFyZSBwcm92aWRlZC4KK1BhZGRpbmcgY2FuIGJlIGVuYWJsZWQgaW5kZXBlbmRlbnRseSBmb3IgdXBsaW5rIGFuZCBkb3dubGluayB0cmFuc2ZlcnMuCitQYWRkaW5nIGNhbiBiZSBlbmFibGVkIGZvciB0aGUgaGVhZCwgdGhlIHRhaWwgYW5kIGZvciB0aGUgdG90YWwgZnJhbWUgc2l6ZS4KK1RoZSBwYWRkaW5nIG5lZWRzIHRvIGJlIGNvcnJlY3RseSBjb25maWd1cmVkIG9uIGJvdGggc2lkZXMgb2YgdGhlIGxpbmsuCitUaGUgcGFkZGluZyBjYW4gYmUgY2hhbmdlZCB2aWEgbW9kdWxlIHBhcmFtZXRlcnMgaW4gY2ZzcGlfc3NwaS5jIG9yIHZpYQordGhlIHN5c2ZzIGRpcmVjdG9yeSBvZiB0aGUgY2ZzcGlfc3NwaSBkcml2ZXIgKGJlZm9yZSBkZXZpY2UgcmVnaXN0cmF0aW9uKS4KKworLSBDQUlGIFNQSSBkZXZpY2UgdGVtcGxhdGU6CisKKy8qCisgKglDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIEFCIDIwMTAKKyAqCUF1dGhvcjogRGFuaWVsIE1hcnRlbnNzb24gLyBEYW5pZWwuTWFydGVuc3NvbkBzdGVyaWNzc29uLmNvbQorICoJTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHZlcnNpb24gMi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX3NwaS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBzc3BpX3N0cnVjdCB7CisJc3RydWN0IGNmc3BpX2RldiBzZGV2OworCXN0cnVjdCBjZnNwaV94ZmVyICp4ZmVyOworfTsKKworc3RhdGljIHN0cnVjdCBzc3BpX3N0cnVjdCBzbGF2ZTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNsYXZlX2RldmljZTsKKworc3RhdGljIGlycXJldHVybl90IHNzcGlfaXJxKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwkvKiBZb3Ugb25seSBuZWVkIHRvIHRyaWdnZXIgb24gYW4gZWRnZSB0byB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZQorCSAqIFNTIHNpZ25hbC4gT25jZSBhIGVkZ2UgaXMgZGV0ZWN0ZWQsIHRoZSBzc19jYigpIGZ1bmN0aW9uIHNob3VsZCBiZQorCSAqIGNhbGxlZCB3aXRoIHRoZSBwYXJhbWV0ZXIgYXNzZXJ0IHNldCB0byB0cnVlLiBJdCBpcyBPSworCSAqIChhbmQgZXZlbiBhZHZpc2VkKSB0byBjYWxsIHRoZSBzc19jYigpIGZ1bmN0aW9uIGluIElSUSBjb250ZXh0IGluCisJICogb3JkZXIgbm90IHRvIGFkZCBhbnkgZGVsYXkuICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNzcGlfY29tcGxldGUodm9pZCAqY29udGV4dCkKK3sKKwkvKiBOb3JtYWxseSB0aGUgRE1BIG9yIHRoZSBTUEkgZnJhbWV3b3JrIHdpbGwgY2FsbCB5b3UgYmFjaworCSAqIGluIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMuIFRoZSBvbmx5IHRoaW5nIHlvdSBuZWVkIHRvCisJICogZG8gaXMgdG8gY2FsbCB0aGUgeGZlcl9kb25lX2NiKCkgZnVuY3Rpb24sIHByb3ZpZGluZyB0aGUgcG9pbnRlcgorCSAqIHRvIHRoZSBDQUlGIFNQSSBpbnRlcmZhY2UuIEl0IGlzIE9LIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgorCSAqIGZyb20gSVJRIGNvbnRleHQuICovCit9CisKK3N0YXRpYyBpbnQgc3NwaV9pbml0X3hmZXIoc3RydWN0IGNmc3BpX3hmZXIgKnhmZXIsIHN0cnVjdCBjZnNwaV9kZXYgKmRldikKK3sKKwkvKiBTdG9yZSB0cmFuc2ZlciBpbmZvLiBGb3IgYSBub3JtYWwgaW1wbGVtZW50YXRpb24geW91IHNob3VsZAorCSAqIHNldCB1cCB5b3VyIERNQSBoZXJlIGFuZCBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIHJlYWR5IHRvCisJICogcmVjZWl2ZSB0aGUgZGF0YSBmcm9tIHRoZSBtYXN0ZXIgU1BJLiAqLworCisJc3RydWN0IHNzcGlfc3RydWN0ICpzc3BpID0gKHN0cnVjdCBzc3BpX3N0cnVjdCAqKWRldi0+cHJpdjsKKworCXNzcGktPnhmZXIgPSB4ZmVyOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3NwaV9zaWdfeGZlcihib29sIHhmZXIsIHN0cnVjdCBjZnNwaV9kZXYgKmRldikKK3sKKwkvKiBJZiB4ZmVyIGlzIHRydWUgdGhlbiB5b3Ugc2hvdWxkIGFzc2VydCB0aGUgU1BJX0lOVCB0byBpbmRpY2F0ZSB0bworCSAqIHRoZSBtYXN0ZXIgdGhhdCB5b3UgYXJlIHJlYWR5IHRvIHJlY2lldmUgdGhlIGRhdGEgZnJvbSB0aGUgbWFzdGVyCisJICogU1BJLiBJZiB4ZmVyIGlzIGZhbHNlIHRoZW4geW91IHNob3VsZCBkZS1hc3NlcnQgU1BJX0lOVCB0byBpbmRpY2F0ZQorCSAqIHRoYXQgdGhlIHRyYW5zZmVyIGlzIGRvbmUuCisJICovCisKKwlzdHJ1Y3Qgc3NwaV9zdHJ1Y3QgKnNzcGkgPSAoc3RydWN0IHNzcGlfc3RydWN0ICopZGV2LT5wcml2OworfQorCitzdGF0aWMgdm9pZCBzc3BpX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qCisJICogSGVyZSB5b3Ugc2hvdWxkIHJlbGVhc2UgeW91ciBTUEkgZGV2aWNlIHJlc291cmNlcy4KKwkgKi8KK30KKworc3RhdGljIGludCBfX2luaXQgc3NwaV9pbml0KHZvaWQpCit7CisJLyogSGVyZSB5b3Ugc2hvdWxkIGluaXRpYWxpemUgeW91ciBTUEkgZGV2aWNlIGJ5IHByb3ZpZGluZyB0aGUKKwkgKiBuZWNlc3NhcnkgZnVuY3Rpb25zLCBjbG9jayBzcGVlZCwgbmFtZSBhbmQgcHJpdmF0ZSBkYXRhLiBPbmNlCisJICogZG9uZSwgeW91IGNhbiByZWdpc3RlciB5b3VyIGRldmljZSB3aXRoIHRoZQorCSAqIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisJICogd2l0aCB0aGUgQ0FJRiBTUEkgaW50ZXJmYWNlIGluaXRpYWxpemVkLiBUaGlzIGlzIHByb2JhYmx5IGFsc28KKwkgKiB0aGUgcGxhY2Ugd2hlcmUgeW91IHNob3VsZCBzZXQgdXAgeW91ciBHUElPcywgaW50ZXJydXB0cyBhbmQgU1BJCisJICogcmVzb3VyY2VzLiAqLworCisJaW50IHJlcyA9IDA7CisKKwkvKiBJbml0aWFsaXplIHNsYXZlIGRldmljZS4gKi8KKwlzbGF2ZS5zZGV2LmluaXRfeGZlciA9IHNzcGlfaW5pdF94ZmVyOworCXNsYXZlLnNkZXYuc2lnX3hmZXIgPSBzc3BpX3NpZ194ZmVyOworCXNsYXZlLnNkZXYuY2xrX21oeiA9IDEzOworCXNsYXZlLnNkZXYucHJpdiA9ICZzbGF2ZTsKKwlzbGF2ZS5zZGV2Lm5hbWUgPSAic3BpX3NzcGkiOworCXNsYXZlX2RldmljZS5kZXYucmVsZWFzZSA9IHNzcGlfcmVsZWFzZTsKKworCS8qIEluaXRpYWxpemUgcGxhdGZvcm0gZGV2aWNlLiAqLworCXNsYXZlX2RldmljZS5uYW1lID0gImNmc3BpX3NzcGkiOworCXNsYXZlX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9ICZzbGF2ZS5zZGV2OworCisJLyogUmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlLiAqLworCXJlcyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2xhdmVfZGV2aWNlKTsKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNzcGlfaW5pdDogZmFpbGVkIHRvIHJlZ2lzdGVyIGRldi5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX2RlbCgmc2xhdmVfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc3NwaV9pbml0KTsKK21vZHVsZV9leGl0KHNzcGlfZXhpdCk7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGVjbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZWNuZXQudHh0CmluZGV4IGQ4OTY4OTUuLmUxMmE0OTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZWNuZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZWNuZXQudHh0CkBAIC00LDcgKzQsNyBAQAogMSkgT3RoZXIgZG9jdW1lbnRhdGlvbi4uLi4KIAogICAgbyBQcm9qZWN0IEhvbWUgUGFnZXMKLSAgICAgICBodHRwOi8vd3d3LmNoeWd3eW4uY29tL0RFQ25ldC8gICAgICAgICAgICAgICAgICAgICAgLSBLZXJuZWwgaW5mbworICAgICAgIGh0dHA6Ly93d3cuY2h5Z3d5bi5jb20vICAgICAgICAgICAgICAgICAgICAgIAkgICAgLSBLZXJuZWwgaW5mbwogICAgICAgIGh0dHA6Ly9saW51eC1kZWNuZXQuc291cmNlZm9yZ2UubmV0LyAgICAgICAgICAgICAgICAtIFVzZXJsYW5kIHRvb2xzCiAgICAgICAgaHR0cDovL3d3dy5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXgtZGVjbmV0LyAgIC0gU3RhdHVzIHBhZ2UKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZvcmUyMDBlLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9mb3JlMjAwZS50eHQKaW5kZXggYjFmMzM3Zi4uNmUwZDJhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZvcmUyMDBlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZm9yZTIwMGUudHh0CkBAIC0zOSw3ICszOSw3IEBACiBGb3JlVGhvdWdodCBDRC1ST00gc3VwcGxpZWQgd2l0aCB5b3VyIGFkYXB0ZXIgYnkgRk9SRSBTeXN0ZW1zLgogCiBZb3UgY2FuIGFsc28gZ2V0IHRoZSBsYXRlc3QgZmlybXdhcmUgaW1hZ2VzIGZyb20gRk9SRSBTeXN0ZW1zIGF0Ci1odHRwOi8vd3d3LmZvcmUuY29tLiBSZWdpc3RlciBUQUNUaWNzIE9ubGluZSBhbmQgZ28gdG8KK2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRk9SRV9TeXN0ZW1zLiBSZWdpc3RlciBUQUNUaWNzIE9ubGluZSBhbmQgZ28gdG8KIHRoZSAnc29mdHdhcmUgdXBkYXRlcycgcGFnZXMuIFRoZSBmaXJtd2FyZSBiaW5hcmllcyBhcmUgcGFydCBvZgogdGhlIHZhcmlvdXMgRm9yZVRob3VnaHQgc29mdHdhcmUgZGlzdHJpYnV0aW9ucy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAppbmRleCBkMDUzNmI1Li5mMzUwYzY5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtOTAzLDcgKzkwMyw3IEBACiBhcnBfbm90aWZ5IC0gQk9PTEVBTgogCURlZmluZSBtb2RlIGZvciBub3RpZmljYXRpb24gb2YgYWRkcmVzcyBhbmQgZGV2aWNlIGNoYW5nZXMuCiAJMCAtIChkZWZhdWx0KTogZG8gbm90aGluZwotCTEgLSBHZW5lcmF0ZSBncmF0dWl0b3VzIGFycCByZXBsaWVzIHdoZW4gZGV2aWNlIGlzIGJyb3VnaHQgdXAKKwkxIC0gR2VuZXJhdGUgZ3JhdHVpdG91cyBhcnAgcmVxdWVzdHMgd2hlbiBkZXZpY2UgaXMgYnJvdWdodCB1cAogCSAgICBvciBoYXJkd2FyZSBhZGRyZXNzIGNoYW5nZXMuCiAKIGFycF9hY2NlcHQgLSBCT09MRUFOCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBkZHAudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwZGRwLnR4dAppbmRleCA2NjFhNTU1Li5iYTVjMjE3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBkZHAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcGRkcC50eHQKQEAgLTM2LDExICszNiw2IEBACiBCYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHVzZXIgc3BhY2UgdG9vbHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UbyBlbmFibGUgQXBwbGVUYWxrLUlQIGRlY2Fwc3VsYXRpb24vZW5jYXBzdWxhdGlvbiB5b3Ugd2lsbCBuZWVkIHRoZSAKLXByb3BlciB0b29scy4gWW91IGNhbiBnZXQgdGhlIHRvb2xzIGZvciBkZWNhcHN1bGF0aW9uIGZyb20KLWh0dHA6Ly9zcGFjczEuc3BhY3MuazEyLndpLnVzL35qc2NobHN0L2luZGV4Lmh0bWwgYW5kIGZvciBlbmNhcHN1bGF0aW9uCi1mcm9tIGh0dHA6Ly93d3cubWF0aHMudW5tLmVkdS9+YnJhZGZvcmQvbHRwYy5odG1sCi0KIEkgd2lsbCBicmllZmx5IGRlc2NyaWJlIHRoZSBvcGVyYXRpb24gb2YgdGhlIHRvb2xzLCBidXQgeW91IHdpbGwKIG5lZWQgdG8gY29uc3VsdCB0aGUgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIGZvciBlYWNoIHNldCBvZiB0b29scy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwaGFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dAppbmRleCA1NWVhYzRhLi42NzBiNzJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dApAQCAtMjIsNyArMjIsNyBAQAogICAgIC0gQWxsIHZhcmlhbnRzIG9mIEludGVycGhhc2UgQVRNIFBDSSAoaSlDaGlwIGFkYXB0ZXIgY2FyZHMgYXJlIHN1cHBvcnRlZCwgCiAgICAgICBpbmNsdWRpbmcgeDU3NSAoT0MzLCBjb250cm9sIG1lbW9yeSAxMjhLICwgNTEySyBhbmQgcGFja2V0IG1lbW9yeSAxMjhLLCAKICAgICAgIDUxMksgYW5kIDFNKSwgeDUyNSAoVVRQMjUpIGFuZCB4NTMxIChEUzMgYW5kIEUzKS4gU2VlIAotICAgICAgaHR0cDovL3d3dy5pcGhhc2UuY29tL3NpdGUvaXBoYXNlLXdlYi8/ZXBpX21lbnVJdGVtSUQ9ZTE5NmYwNGI0YjNiNDA1MDJmMTUwODgyZTIxMDQ2YTAKKyAgICAgIGh0dHA6Ly93d3cuaXBoYXNlLmNvbS8KICAgICAgIGZvciBkZXRhaWxzLgogICAgIC0gT25seSB4ODYgcGxhdGZvcm1zIGFyZSBzdXBwb3J0ZWQuCiAgICAgLSBTTVAgaXMgc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKaW5kZXggOThmNzFhNS4uMDczODk0ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0CkBAIC04LDcgKzgsNyBAQAogcmF3IGFjY2VzcyB0byBuZXR3b3JrIGludGVyZmFjZS4KIAogWW91IGNhbiBmaW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0OgotICAgIGh0dHA6Ly9wdXNhLnV2LmVzL351bGlzc2VzL3BhY2tldF9tbWFwLworICAgIGh0dHA6Ly93aWtpLmlweHdhcnpvbmUuY29tL2luZGV4LnBocDU/dGl0bGU9TGludXhfcGFja2V0X21tYXAKIAogSG93dG8gY2FuIGJlIGZvdW5kIGF0OgogICAgIGh0dHA6Ly93aWtpLmdudS1sb2cubmV0IChwYWNrZXRfbW1hcCkKQEAgLTU2LDcgKzU2LDcgQEAKIAogSSdtIGF3YXJlIG9mIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgUEFDS0VUX01NQVAgaW4gbGlicGNhcDoKIAotICAgIGh0dHA6Ly9wdXNhLnV2LmVzL351bGlzc2VzL3BhY2tldF9tbWFwLyAgKGJ5IFNpbW9uIFBhdGFyaW4sIGJhc2VkIG9uIGxpYnBjYXAgMC42LjIpCisgICAgaHR0cDovL3dpa2kuaXB4d2Fyem9uZS5jb20vCQkgICAgIChieSBTaW1vbiBQYXRhcmluLCBiYXNlZCBvbiBsaWJwY2FwIDAuNi4yKQogICAgIGh0dHA6Ly9wdWJsaWMubGFubC5nb3YvY3B3LyAgICAgICAgICAgICAgKGJ5IFBoaWwgV29vZCwgYmFzZWQgb24gbGFzdGVzdCBsaWJwY2FwKQogCiBUaGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gdW5kZXJzdGFuZApAQCAtNDkzLDYgKzQ5MywzMiBAQAogICAgIHBmZC5ldmVudHMgPSBQT0xMT1VUOwogICAgIHJldHZhbCA9IHBvbGwoJnBmZCwgMSwgdGltZW91dCk7CiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKysgUEFDS0VUX1RJTUVTVEFNUAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgUEFDS0VUX1RJTUVTVEFNUCBzZXR0aW5nIGRldGVybWluZXMgdGhlIHNvdXJjZSBvZiB0aGUgdGltZXN0YW1wIGluCit0aGUgcGFja2V0IG1ldGEgaW5mb3JtYXRpb24uICBJZiB5b3VyIE5JQyBpcyBjYXBhYmxlIG9mIHRpbWVzdGFtcGluZworcGFja2V0cyBpbiBoYXJkd2FyZSwgeW91IGNhbiByZXF1ZXN0IHRob3NlIGhhcmR3YXJlIHRpbWVzdGFtcHMgdG8gdXNlZC4KK05vdGU6IHlvdSBtYXkgbmVlZCB0byBlbmFibGUgdGhlIGdlbmVyYXRpb24gb2YgaGFyZHdhcmUgdGltZXN0YW1wcyB3aXRoCitTSU9DU0hXVFNUQU1QLgorCitQQUNLRVRfVElNRVNUQU1QIGFjY2VwdHMgdGhlIHNhbWUgaW50ZWdlciBiaXQgZmllbGQgYXMKK1NPX1RJTUVTVEFNUElORy4gIEhvd2V2ZXIsIG9ubHkgdGhlIFNPRl9USU1FU1RBTVBJTkdfU1lTX0hBUkRXQVJFCithbmQgU09GX1RJTUVTVEFNUElOR19SQVdfSEFSRFdBUkUgdmFsdWVzIGFyZSByZWNvZ25pemVkIGJ5CitQQUNLRVRfVElNRVNUQU1QLiAgU09GX1RJTUVTVEFNUElOR19TWVNfSEFSRFdBUkUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyCitTT0ZfVElNRVNUQU1QSU5HX1JBV19IQVJEV0FSRSBpZiBib3RoIGJpdHMgYXJlIHNldC4KKworICAgIGludCByZXEgPSAwOworICAgIHJlcSB8PSBTT0ZfVElNRVNUQU1QSU5HX1NZU19IQVJEV0FSRTsKKyAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfUEFDS0VULCBQQUNLRVRfVElNRVNUQU1QLCAodm9pZCAqKSAmcmVxLCBzaXplb2YocmVxKSkKKworSWYgUEFDS0VUX1RJTUVTVEFNUCBpcyBub3Qgc2V0LCBhIHNvZnR3YXJlIHRpbWVzdGFtcCBnZW5lcmF0ZWQgaW5zaWRlCit0aGUgbmV0d29ya2luZyBzdGFjayBpcyB1c2VkICh0aGUgYmVoYXZpb3IgYmVmb3JlIHRoaXMgc2V0dGluZyB3YXMgYWRkZWQpLgorCitTZWUgaW5jbHVkZS9saW51eC9uZXRfdHN0YW1wLmggYW5kIERvY3VtZW50YXRpb24vbmV0d29ya2luZy90aW1lc3RhbXBpbmcKK2ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhhcmR3YXJlIHRpbWVzdGFtcHMuCisKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiArIFRIQU5LUwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BrdGdlbi50eHQKaW5kZXggNjFiYjY0NS4uNzVlNGZkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BrdGdlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BrdGdlbi50eHQKQEAgLTE1MSw2ICsxNTEsOCBAQAogCiAgcGdzZXQgc3RvcCAgICAJICAgICAgICAgIGFib3J0cyBpbmplY3Rpb24uIEFsc28sIF5DIGFib3J0cyBnZW5lcmF0b3IuCiAKKyBwZ3NldCAicmF0ZSAzMDBNIiAgICAgICAgc2V0IHJhdGUgdG8gMzAwIE1iL3MKKyBwZ3NldCAicmF0ZXAgMTAwMDAwMCIgICAgc2V0IHJhdGUgdG8gMU1wcHMKIAogRXhhbXBsZSBzY3JpcHRzCiA9PT09PT09PT09PT09PT0KQEAgLTI0MSw2ICsyNDMsOSBAQAogZmxvd3MKIGZsb3dsZW4KIAorcmF0ZQorcmF0ZXAKKwogUmVmZXJlbmNlczoKIGZ0cDovL3JvYnVyLnNsdS5zZS9wdWIvTGludXgvbmV0LWRldmVsb3BtZW50L3BrdGdlbi10ZXN0aW5nLwogZnRwOi8vcm9idXIuc2x1LnNlL3B1Yi9MaW51eC9uZXQtZGV2ZWxvcG1lbnQvcGt0Z2VuLXRlc3RpbmcvZXhhbXBsZXMvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcmF5X2NzLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yYXlfY3MudHh0CmluZGV4IDE0NWQyN2EuLmMwYzEyMzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yYXlfY3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yYXlfY3MudHh0CkBAIC0xMyw4ICsxMyw4IEBACiAKIEFzIG9mIGtlcm5lbCAyLjMuMTgsIHRoZSByYXlfY3MgZHJpdmVyIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbAogc291cmNlLiAgTXkgd2ViIHBhZ2UgZm9yIHRoZSBkZXZlbG9wbWVudCBvZiByYXlfY3MgaXMgYXQKLWh0dHA6Ly93b3JsZC5zdGQuY29tL35jb3JleS9yYXlsaW5rLmh0bWwgYW5kIEkgY2FuIGJlIGVtYWlsZWQgYXQKLWNvcmV5QHdvcmxkLnN0ZC5jb20KK2h0dHA6Ly93ZWIucmFsaW5rdGVjaC5jb20vcmFsaW5rL0hvbWUvU3VwcG9ydC9MaW51eC5odG1sIAorYW5kIEkgY2FuIGJlIGVtYWlsZWQgYXQgY29yZXlAd29ybGQuc3RkLmNvbQogCiBUaGUga2VybmVsIGRyaXZlciBpcyBiYXNlZCBvbiByYXlfY3MtMS42Mi50Z3oKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3MyaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3MyaW8udHh0CmluZGV4IGMzZDZiNGQuLjlkNGUwZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zMmlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvczJpby50eHQKQEAgLTEzMyw3ICsxMzMsOCBAQAogKiogRm9yIEFNRCBvcHRlcm9uIHBsYXRmb3JtcyB3aXRoIDgxMzEgY2hpcHNldCwgTU1SQkM9MSBhbmQgTU9TVD0xIGFyZSAKIHJlY29tbWVuZGVkIGFzIHNhZmUgcGFyYW1ldGVycy4KIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmV2aWV3IHRoZSBBTUQ4MTMxIGVycmF0YSBhdAotaHR0cDovL3d3dy5hbWQuY29tL3VzLWVuL2Fzc2V0cy9jb250ZW50X3R5cGUvd2hpdGVfcGFwZXJzX2FuZF90ZWNoX2RvY3MvMjYzMTAucGRmCitodHRwOi8vdmlwLmFtZC5jb20vdXMtZW4vYXNzZXRzL2NvbnRlbnRfdHlwZS93aGl0ZV9wYXBlcnNfYW5kX3RlY2hfZG9jcy8KKzI2MzEwX0FNRC04MTMxX0h5cGVyVHJhbnNwb3J0X1BDSS1YX1R1bm5lbF9SZXZpc2lvbl9HdWlkZV9yZXZfM18xOC5wZGYKIAogNi4gIEF2YWlsYWJsZSBEb3dubG9hZHMKIE5ldGVyaW9uICJzMmlvIiBkcml2ZXIgaW4gUmVkIEhhdCBhbmQgU3VzZSAyLjYtYmFzZWQgZGlzdHJpYnV0aW9ucyBpcyBrZXB0IHVwIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RsYW4udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RsYW4udHh0CmluZGV4IDdlNmFhNWIuLjM0NTUwZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90bGFuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdGxhbi50eHQKQEAgLTIsNyArMiw3IEBACiAoQykgMTk5OCBKYW1lcyBCYW5rcwogKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuIDx0bW1AaW1hZ2UuZGssIHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4KIAotRm9yIGRyaXZlciBpbmZvcm1hdGlvbi91cGRhdGVzIHZpc2l0IGh0dHA6Ly9vcGVuc291cmNlLmNvbXBhcS5jb20KK0ZvciBkcml2ZXIgaW5mb3JtYXRpb24vdXBkYXRlcyB2aXNpdCBodHRwOi8vd3d3LmNvbXBhcS5jb20KIAogCiBUTEFOIGRyaXZlciBmb3IgTGludXgsIHZlcnNpb24gMS4xNGEKQEAgLTExMyw1ICsxMTMsNSBAQAogCiBUaGVyZSBpcyBhbHNvIGEgdGxhbiBtYWlsaW5nIGxpc3Qgd2hpY2ggeW91IGNhbiBqb2luIGJ5IHNlbmRpbmcgInN1YnNjcmliZSB0bGFuIgogaW4gdGhlIGJvZHkgb2YgYW4gZW1haWwgdG8gbWFqb3Jkb21vQHZ1c2VyLnZ1LnVuaW9uLmVkdS4KLVRoZXJlIGlzIGFsc28gYSB0bGFuIHdlYnNpdGUgYXQgaHR0cDovL29wZW5zb3VyY2UuY29tcGFxLmNvbQorVGhlcmUgaXMgYWxzbyBhIHRsYW4gd2Vic2l0ZSBhdCBodHRwOi8vd3d3LmNvbXBhcS5jb20KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3VkcGxpdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3VkcGxpdGUudHh0CmluZGV4IDg1NWQ4ZGEuLmQ3MjdhMzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy91ZHBsaXRlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdWRwbGl0ZS50eHQKQEAgLTExLDExICsxMSwxMyBAQAogICBUaGlzIGZpbGUgYnJpZWZseSBkZXNjcmliZXMgdGhlIGV4aXN0aW5nIGtlcm5lbCBzdXBwb3J0IGFuZCB0aGUgc29ja2V0IEFQSS4KICAgRm9yIGluLWRlcHRoIGluZm9ybWF0aW9uLCB5b3UgY2FuIGNvbnN1bHQ6CiAKLSAgIG8gVGhlIFVEUC1MaXRlIEhvbWVwYWdlOiBodHRwOi8vd3d3LmVyZy5hYmRuLmFjLnVrL3VzZXJzL2dlcnJpdC91ZHAtbGl0ZS8KKyAgIG8gVGhlIFVEUC1MaXRlIEhvbWVwYWdlOgorCWh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy5lcmcuYWJkbi5hYy51ay91c2Vycy9nZXJyaXQvdWRwLWxpdGUvIAogICAgICAgIEZyb20gaGVyZSB5b3UgY2FuIGFsc28gZG93bmxvYWQgc29tZSBleGFtcGxlIGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlLgogCiAgICBvIFRoZSBVRFAtTGl0ZSBIT1dUTyBvbgotICAgICAgIGh0dHA6Ly93d3cuZXJnLmFiZG4uYWMudWsvdXNlcnMvZ2Vycml0L3VkcC1saXRlL2ZpbGVzL1VEUC1MaXRlLUhPV1RPLnR4dAorICAgICAgIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy5lcmcuYWJkbi5hYy51ay91c2Vycy9nZXJyaXQvdWRwLWxpdGUvCisJZmlsZXMvVURQLUxpdGUtSE9XVE8udHh0CiAKICAgIG8gVGhlIFdpcmVzaGFyayBVRFAtTGl0ZSBXaUtpICh3aXRoIGNhcHR1cmUgZmlsZXMpOgogICAgICAgIGh0dHA6Ly93aWtpLndpcmVzaGFyay5vcmcvTGlnaHR3ZWlnaHRfVXNlcl9EYXRhZ3JhbV9Qcm90b2NvbApAQCAtMjYsMTIgKzI4LDcgQEAKICAgSSkgQVBQTElDQVRJT05TCiAKICAgU2V2ZXJhbCBhcHBsaWNhdGlvbnMgaGF2ZSBiZWVuIHBvcnRlZCBzdWNjZXNzZnVsbHkgdG8gVURQLUxpdGUuIEV0aGVyZWFsCi0gIChub3cgY2FsbGVkIHdpcmVzaGFyaykgaGFzIFVEUC1MaXRldjQvdjYgc3VwcG9ydCBieSBkZWZhdWx0LiBUaGUgdGFyYmFsbCBvbgotCi0gICBodHRwOi8vd3d3LmVyZy5hYmRuLmFjLnVrL3VzZXJzL2dlcnJpdC91ZHAtbGl0ZS9maWxlcy91ZHBsaXRlX2xpbnV4LnRhci5negotCi0gIGhhcyBzb3VyY2UgY29kZSBmb3Igc2V2ZXJhbCB2NC92NiBjbGllbnQtc2VydmVyIGFuZCBuZXR3b3JrIHRlc3RpbmcgZXhhbXBsZXMuCi0KKyAgKG5vdyBjYWxsZWQgd2lyZXNoYXJrKSBoYXMgVURQLUxpdGV2NC92NiBzdXBwb3J0IGJ5IGRlZmF1bHQuIAogICBQb3J0aW5nIGFwcGxpY2F0aW9ucyB0byBVRFAtTGl0ZSBpcyBzdHJhaWdodGZvcndhcmQ6IG9ubHkgc29ja2V0IGxldmVsIGFuZAogICBJUFBST1RPIG5lZWQgdG8gYmUgY2hhbmdlZDsgc2VuZGVycyBhZGRpdGlvbmFsbHkgc2V0IHRoZSBjaGVja3N1bSBjb3ZlcmFnZQogICBsZW5ndGggKGRlZmF1bHQgPSBoZWFkZXIgbGVuZ3RoID0gOCkuIERldGFpbHMgYXJlIGluIHRoZSBuZXh0IHNlY3Rpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2F2ZWxhbi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2F2ZWxhbi50eHQKaW5kZXggYWZhNmU1Mi4uOTBlMGFjNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhdmVsYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YXZlbGFuLnR4dApAQCAtNTAsNyArNTAsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0KIAlvIENvbmZpZyA6CU5vdCB5ZXQgaW4ga2VybmVsCiAJbyBMb2NhdGlvbiA6CVBjbWNpYSBwYWNrYWdlIDMuMS4xMCsKLQlvIG9uLWxpbmUgZG9jIDoJaHR0cDovL3d3dy5mYXN0YS5maC1kb3J0bXVuZC5kZS91c2Vycy9hbmR5L3d2bGFuLworCW8gb24tbGluZSBkb2MgOgorCWh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy5mYXN0YS5maC1kb3J0bXVuZC5kZS91c2Vycy9hbmR5L3d2bGFuLwkKIAogCVRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBvZiBXYXZlbGFuIElFRUUsCiB3aGljaCBpcyA4MDIuMTEgY29tcGF0aWJsZS4gRGVwZW5kaW5nIG9uIHZlcnNpb24sIGl0IGlzIDIgTWIvcyBvciAxMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wYWRhdGEudHh0IGIvRG9jdW1lbnRhdGlvbi9wYWRhdGEudHh0CmluZGV4IDI2OWQ3ZDBkLi40NzNlYmYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3BhZGF0YS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wYWRhdGEudHh0CkBAIC0xLDUgKzEsNSBAQAogVGhlIHBhZGF0YSBwYXJhbGxlbCBleGVjdXRpb24gbWVjaGFuaXNtCi1MYXN0IHVwZGF0ZWQgZm9yIDIuNi4zNAorTGFzdCB1cGRhdGVkIGZvciAyLjYuMzYKIAogUGFkYXRhIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZSBrZXJuZWwgY2FuIGZhcm0gd29yayBvdXQgdG8gYmUgZG9uZSBpbgogcGFyYWxsZWwgb24gbXVsdGlwbGUgQ1BVcyB3aGlsZSByZXRhaW5pbmcgdGhlIG9yZGVyaW5nIG9mIHRhc2tzLiAgSXQgd2FzCkBAIC0xMywzMSArMTMsODYgQEAKIAogICAgICNpbmNsdWRlIDxsaW51eC9wYWRhdGEuaD4KIAotICAgIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywKLQkJCQkgICAgICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpOworICAgIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCisJCQkJCSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqcGNwdW1hc2ssCisJCQkJCSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY2JjcHVtYXNrKTsKIAotVGhlIGNwdW1hc2sgZGVzY3JpYmVzIHdoaWNoIHByb2Nlc3NvcnMgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgd29yawotc3VibWl0dGVkIHRvIHRoaXMgaW5zdGFuY2UuICBUaGUgd29ya3F1ZXVlIHdxIGlzIHdoZXJlIHRoZSB3b3JrIHdpbGwKLWFjdHVhbGx5IGJlIGRvbmU7IGl0IHNob3VsZCBiZSBhIG11bHRpdGhyZWFkZWQgcXVldWUsIG5hdHVyYWxseS4KK1RoZSBwY3B1bWFzayBkZXNjcmliZXMgd2hpY2ggcHJvY2Vzc29ycyB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSB3b3JrCitzdWJtaXR0ZWQgdG8gdGhpcyBpbnN0YW5jZSBpbiBwYXJhbGxlbC4gVGhlIGNiY3B1bWFzayBkZWZpbmVzIHdoaWNoCitwcm9jZXNzb3JzIGFyZSBhbGxvd2VkIHRvIHVzZSBhcyB0aGUgc2VyaWFsaXphdGlvbiBjYWxsYmFjayBwcm9jZXNzb3IuCitUaGUgd29ya3F1ZXVlIHdxIGlzIHdoZXJlIHRoZSB3b3JrIHdpbGwgYWN0dWFsbHkgYmUgZG9uZTsgaXQgc2hvdWxkIGJlCithIG11bHRpdGhyZWFkZWQgcXVldWUsIG5hdHVyYWxseS4KKworVG8gYWxsb2NhdGUgYSBwYWRhdGEgaW5zdGFuY2Ugd2l0aCB0aGUgY3B1X3Bvc3NpYmxlX21hc2sgZm9yIGJvdGgKK2NwdW1hc2tzIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGNhbiBiZSB1c2VkOgorCisgICAgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jX3Bvc3NpYmxlKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSk7CisKK05vdGU6IFBhZGF0YSBtYWludGFpbnMgdHdvIGtpbmRzIG9mIGNwdW1hc2tzIGludGVybmFsbHkuIFRoZSB1c2VyIHN1cHBsaWVkCitjcHVtYXNrcywgc3VibWl0dGVkIGJ5IHBhZGF0YV9hbGxvYy9wYWRhdGFfYWxsb2NfcG9zc2libGUgYW5kIHRoZSAndXNhYmxlJworY3B1bWFza3MuIFRoZSB1c2FibGUgY3B1bWFza3MgYXJlIGFsd2F5cyB0aGUgc3Vic2V0IG9mIGFjdGl2ZSBjcHVzIGluIHRoZQordXNlciBzdXBwbGllZCBjcHVtYXNrcywgdGhlc2UgYXJlIHRoZSBjcHVtYXNrcyBwYWRhdGEgYWN0dWFsbHkgdXNlLiBTbworaXQgaXMgbGVnYWwgdG8gc3VwcGx5IGEgY3B1bWFzayB0byBwYWRhdGEgdGhhdCBjb250YWlucyBvZmZsaW5lIGNwdXMuCitPbmNlIGEgb2ZmbGluZSBjcHUgaW4gdGhlIHVzZXIgc3VwcGxpZWQgY3B1bWFzayBjb21lcyBvbmxpbmUsIHBhZGF0YQoraXMgZ29pbmcgdG8gdXNlIGl0LgogCiBUaGVyZSBhcmUgZnVuY3Rpb25zIGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHRoZSBpbnN0YW5jZToKIAotICAgIHZvaWQgcGFkYXRhX3N0YXJ0KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTsKKyAgICBpbnQgcGFkYXRhX3N0YXJ0KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTsKICAgICB2b2lkIHBhZGF0YV9zdG9wKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTsKIAotVGhlc2UgZnVuY3Rpb25zIGxpdGVyYWxseSBkbyBub3RoaW5nIGJleW9uZCBzZXR0aW5nIG9yIGNsZWFyaW5nIHRoZQotInBhZGF0YV9zdGFydCgpIHdhcyBjYWxsZWQiIGZsYWc7IGlmIHRoYXQgZmxhZyBpcyBub3Qgc2V0LCBvdGhlciBmdW5jdGlvbnMKLXdpbGwgcmVmdXNlIHRvIHdvcmsuCitUaGVzZSBmdW5jdGlvbnMgYXJlIHNldHRpbmcgb3IgY2xlYXJpbmcgdGhlICJQQURBVEFfSU5JVCIgZmxhZzsKK2lmIHRoYXQgZmxhZyBpcyBub3Qgc2V0LCBvdGhlciBmdW5jdGlvbnMgd2lsbCByZWZ1c2UgdG8gd29yay4KK3BhZGF0YV9zdGFydCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyAoZmxhZyBzZXQpIG9yIC1FSU5WQUwgaWYgdGhlCitwYWRhdGEgY3B1bWFzayBjb250YWlucyBubyBhY3RpdmUgY3B1IChmbGFnIG5vdCBzZXQpLgorcGFkYXRhX3N0b3AgY2xlYXJzIHRoZSBmbGFnIGFuZCBibG9ja3MgdW50aWwgdGhlIHBhZGF0YSBpbnN0YW5jZQoraXMgdW51c2VkLgogCiBUaGUgbGlzdCBvZiBDUFVzIHRvIGJlIHVzZWQgY2FuIGJlIGFkanVzdGVkIHdpdGggdGhlc2UgZnVuY3Rpb25zOgogCi0gICAgaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKyAgICBpbnQgcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKwkJCSAgICBjcHVtYXNrX3Zhcl90IHBjcHVtYXNrLAorCQkJICAgIGNwdW1hc2tfdmFyX3QgY2JjcHVtYXNrKTsKKyAgICBpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAogCQkJICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTsKLSAgICBpbnQgcGFkYXRhX2FkZF9jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpOwotICAgIGludCBwYWRhdGFfcmVtb3ZlX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSk7CisgICAgaW50IHBhZGF0YV9hZGRfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1LCBpbnQgbWFzayk7CisgICAgaW50IHBhZGF0YV9yZW1vdmVfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1LCBpbnQgbWFzayk7CiAKLUNoYW5naW5nIHRoZSBDUFUgbWFzayBoYXMgdGhlIGxvb2sgb2YgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiwgdGhvdWdoLCBzbyBpdAotcHJvYmFibHkgc2hvdWxkIG5vdCBiZSBkb25lIHdpdGggZ3JlYXQgZnJlcXVlbmN5LgorQ2hhbmdpbmcgdGhlIENQVSBtYXNrcyBhcmUgZXhwZW5zaXZlIG9wZXJhdGlvbnMsIHRob3VnaCwgc28gaXQgc2hvdWxkIG5vdCBiZQorZG9uZSB3aXRoIGdyZWF0IGZyZXF1ZW5jeS4KKworSXQncyBwb3NzaWJsZSB0byBjaGFuZ2UgYm90aCBjcHVtYXNrcyBvZiBhIHBhZGF0YSBpbnN0YW5jZSB3aXRoCitwYWRhdGFfc2V0X2NwdW1hc2tzIGJ5IHNwZWNpZnlpbmcgdGhlIGNwdW1hc2tzIGZvciBwYXJhbGxlbCBleGVjdXRpb24gKHBjcHVtYXNrKQorYW5kIGZvciB0aGUgc2VyaWFsIGNhbGxiYWNrIGZ1bmN0aW9uIChjYmNwdW1hc2spLiBwYWRhdGFfc2V0X2NwdW1hc2sgaXMgdG8KK2NoYW5nZSBqdXN0IG9uZSBvZiB0aGUgY3B1bWFza3MuIEhlcmUgY3B1bWFza190eXBlIGlzIG9uZSBvZiBQQURBVEFfQ1BVX1NFUklBTCwKK1BBREFUQV9DUFVfUEFSQUxMRUwgYW5kIGNwdW1hc2sgc3BlY2lmaWVzIHRoZSBuZXcgY3B1bWFzayB0byB1c2UuCitUbyBzaW1wbHkgYWRkIG9yIHJlbW92ZSBvbmUgY3B1IGZyb20gYSBjZXJ0YWluIGNwdW1hc2sgdGhlIGZ1bmN0aW9ucworcGFkYXRhX2FkZF9jcHUvcGFkYXRhX3JlbW92ZV9jcHUgYXJlIHVzZWQuIGNwdSBzcGVjaWZpZXMgdGhlIGNwdSB0byBhZGQgb3IKK3JlbW92ZSBhbmQgbWFzayBpcyBvbmUgb2YgUEFEQVRBX0NQVV9TRVJJQUwsIFBBREFUQV9DUFVfUEFSQUxMRUwuCisKK0lmIGEgdXNlciBpcyBpbnRlcmVzdGVkIGluIHBhZGF0YSBjcHVtYXNrIGNoYW5nZXMsIGhlIGNhbiByZWdpc3RlciB0bwordGhlIHBhZGF0YSBjcHVtYXNrIGNoYW5nZSBub3RpZmllcjoKKworICAgIGludCBwYWRhdGFfcmVnaXN0ZXJfY3B1bWFza19ub3RpZmllcihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKwkJCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrKTsKKworVG8gdW5yZWdpc3RlciBmcm9tIHRoYXQgbm90aWZpZXI6CisKKyAgICBpbnQgcGFkYXRhX3VucmVnaXN0ZXJfY3B1bWFza19ub3RpZmllcihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKwkJCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2spOworCitUaGUgcGFkYXRhIGNwdW1hc2sgY2hhbmdlIG5vdGlmaWVyIG5vdGlmaWVzIGFib3V0IGNoYW5nZXMgb2YgdGhlIHVzYWJsZQorY3B1bWFza3MsIGkuZS4gdGhlIHN1YnNldCBvZiBhY3RpdmUgY3B1cyBpbiB0aGUgdXNlciBzdXBwbGllZCBjcHVtYXNrLgorCitQYWRhdGEgY2FsbHMgdGhlIG5vdGlmaWVyIGNoYWluIHdpdGg6CisKKyAgICBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZwaW5zdC0+Y3B1bWFza19jaGFuZ2Vfbm90aWZpZXIsCisJCQkJIG5vdGlmaWNhdGlvbl9tYXNrLAorCQkJCSAmcGRfbmV3LT5jcHVtYXNrKTsKKworSGVyZSBjcHVtYXNrX2NoYW5nZV9ub3RpZmllciBpcyByZWdpc3RlcmVkIG5vdGlmaWVyLCBub3RpZmljYXRpb25fbWFzaworaXMgb25lIG9mIFBBREFUQV9DUFVfU0VSSUFMLCBQQURBVEFfQ1BVX1BBUkFMTEVMIGFuZCBjcHVtYXNrIGlzIGEgcG9pbnRlcgordG8gYSBzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgdGhhdCBjb250YWlucyB0aGUgbmV3IGNwdW1hc2sgaW5mb3JtYXRpb25zLgogCiBBY3R1YWxseSBzdWJtaXR0aW5nIHdvcmsgdG8gdGhlIHBhZGF0YSBpbnN0YW5jZSByZXF1aXJlcyB0aGUgY3JlYXRpb24gb2YgYQogcGFkYXRhX3ByaXYgc3RydWN0dXJlOgpAQCAtNTAsNyArMTA1LDcgQEAKIAogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGVtYmVkZGVkIHdpdGhpbiBzb21lIGxhcmdlcgogc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSB3b3JrIHRvIGJlIGRvbmUuICBNb3N0IGl0cyBmaWVsZHMgYXJlIHByaXZhdGUgdG8KLXBhZGF0YSwgYnV0IHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBhbmQgdGhlCitwYWRhdGEsIGJ1dCB0aGUgc3RydWN0dXJlIHNob3VsZCBiZSB6ZXJvZWQgYXQgaW5pdGlhbGlzYXRpb24gdGltZSwgYW5kIHRoZQogcGFyYWxsZWwoKSBhbmQgc2VyaWFsKCkgZnVuY3Rpb25zIHNob3VsZCBiZSBwcm92aWRlZC4gIFRob3NlIGZ1bmN0aW9ucyB3aWxsCiBiZSBjYWxsZWQgaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyB0aGUgd29yayBkb25lIGFzIHdlIHdpbGwgc2VlCiBtb21lbnRhcmlseS4KQEAgLTYzLDEyICsxMTgsMTAgQEAKIFRoZSBwaW5zdCBhbmQgcGFkYXRhIHN0cnVjdHVyZXMgbXVzdCBiZSBzZXQgdXAgYXMgZGVzY3JpYmVkIGFib3ZlOyBjYl9jcHUKIHNwZWNpZmllcyB3aGljaCBDUFUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZmluYWwgY2FsbGJhY2sgd2hlbiB0aGUgd29yayBpcwogZG9uZTsgaXQgbXVzdCBiZSBpbiB0aGUgY3VycmVudCBpbnN0YW5jZSdzIENQVSBtYXNrLiAgVGhlIHJldHVybiB2YWx1ZSBmcm9tCi1wYWRhdGFfZG9fcGFyYWxsZWwoKSBpcyBhIGxpdHRsZSBzdHJhbmdlOyB6ZXJvIGlzIGFuIGVycm9yIHJldHVybgotaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsZXIgZm9yZ290IHRoZSBwYWRhdGFfc3RhcnQoKSBmb3JtYWxpdGllcy4gIC1FQlVTWQotbWVhbnMgdGhhdCBzb21lYm9keSwgc29tZXdoZXJlIGVsc2UgaXMgbWVzc2luZyB3aXRoIHRoZSBpbnN0YW5jZSdzIENQVQotbWFzaywgd2hpbGUgLUVJTlZBTCBpcyBhIGNvbXBsYWludCBhYm91dCBjYl9jcHUgbm90IGJlaW5nIGluIHRoYXQgQ1BVIG1hc2suCi1JZiBhbGwgZ29lcyB3ZWxsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC1FSU5QUk9HUkVTUywgaW5kaWNhdGluZyB0aGF0Ci10aGUgd29yayBpcyBpbiBwcm9ncmVzcy4KK3BhZGF0YV9kb19wYXJhbGxlbCgpIGlzIHplcm8gb24gc3VjY2VzcywgaW5kaWNhdGluZyB0aGF0IHRoZSB3b3JrIGlzIGluCitwcm9ncmVzcy4gLUVCVVNZIG1lYW5zIHRoYXQgc29tZWJvZHksIHNvbWV3aGVyZSBlbHNlIGlzIG1lc3Npbmcgd2l0aCB0aGUKK2luc3RhbmNlJ3MgQ1BVIG1hc2ssIHdoaWxlIC1FSU5WQUwgaXMgYSBjb21wbGFpbnQgYWJvdXQgY2JfY3B1IG5vdCBiZWluZworaW4gdGhhdCBDUFUgbWFzayBvciBhYm91dCBhIG5vdCBydW5uaW5nIGluc3RhbmNlLgogCiBFYWNoIHRhc2sgc3VibWl0dGVkIHRvIHBhZGF0YV9kb19wYXJhbGxlbCgpIHdpbGwsIGluIHR1cm4sIGJlIHBhc3NlZCB0bwogZXhhY3RseSBvbmUgY2FsbCB0byB0aGUgYWJvdmUtbWVudGlvbmVkIHBhcmFsbGVsKCkgZnVuY3Rpb24sIG9uIG9uZSBDUFUsIHNvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BjbWNpYS9kcml2ZXItY2hhbmdlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3BjbWNpYS9kcml2ZXItY2hhbmdlcy50eHQKaW5kZXggNjFiYzRlOS4uMjZjMGY5YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wY21jaWEvZHJpdmVyLWNoYW5nZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dApAQCAtMSw0ICsxLDE2IEBACiBUaGlzIGZpbGUgZGV0YWlscyBjaGFuZ2VzIGluIDIuNiB3aGljaCBhZmZlY3QgUENNQ0lBIGNhcmQgZHJpdmVyIGF1dGhvcnM6CisqIHBjbWNpYV9yZXF1ZXN0X2lvIGNoYW5nZXMgKGFzIG9mIDIuNi4zNikKKyAgIEluc3RlYWQgb2YgaW9fcmVxX3QsIGRyaXZlcnMgYXJlIG5vdyByZXF1ZXN0ZWQgdG8gZmlsbCBvdXQKKyAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldi0+cmVzb3VyY2VbMCwxXSBmb3IgdXAgdG8gdHdvIGlvcG9ydAorICAgcmFuZ2VzLiBBZnRlciBhIGNhbGwgdG8gcGNtY2lhX3JlcXVlc3RfaW8oKSwgdGhlIHBvcnRzIGZvdW5kIHRoZXJlCisgICBhcmUgcmVzZXJ2ZWQsIGFmdGVyIGNhbGxpbmcgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbigpLCB0aGV5IG1heQorICAgYmUgdXNlZC4KKworKiBObyBkZXZfaW5mb190LCBubyBjc190eXBlcy5oIChhcyBvZiAyLjYuMzYpCisgICBkZXZfaW5mb190IGFuZCBhIGZldyBvdGhlciB0eXBlZGVmcyBhcmUgcmVtb3ZlZC4gTm8gbG9uZ2VyIHVzZSB0aGVtCisgICBpbiBQQ01DSUEgZGV2aWNlIGRyaXZlcnMuIEFsc28sIGRvIG5vdCBpbmNsdWRlIHBjbWNpYS9jc190eXBlcy5oLCBhcworICAgdGhpcyBmaWxlIGlzIGdvbmUuCisKICogTm8gZGV2X25vZGVfdCAoYXMgb2YgMi42LjM1KQogICAgVGhlcmUgaXMgbm8gbW9yZSBuZWVkIHRvIGZpbGwgb3V0IGEgImRldl9ub2RlX3QiIHN0cnVjdHVyZS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9hcG0tYWNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2FwbS1hY3BpLnR4dAppbmRleCAxYmQ3OTlkLi42Y2M0MjNkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2FwbS1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2FwbS1hY3BpLnR4dApAQCAtMjgsNSArMjgsNSBAQAogR28gYWhlYWQgYW5kIHN0YXJ0IGJvdGguICBJZiBBQ1BJIG9yIEFQTSBpcyBub3QgYXZhaWxhYmxlIG9uIHlvdXIKIHN5c3RlbSB0aGUgYXNzb2NpYXRlZCBkYWVtb24gd2lsbCBleGl0IGdyYWNlZnVsbHkuCiAKLSAgYXBtZDogICBodHRwOi8vd29ybGR2aXNpb25zLmNhL35hcGVud2Fyci9hcG1kLworICBhcG1kOiAgIGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9wb29sL21haW4vYS9hcG1kLwogICBhY3BpZDogIGh0dHA6Ly9hY3BpZC5zZi5uZXQvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQKaW5kZXggMTU1NTAwMS4uZGRkNzgxNzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQKQEAgLTE3OSw4ICsxNzksNyBAQAogCiBUbyB2ZXJpZnkgdGhhdCB0aGUgU1RSIHdvcmtzLCBpdCBpcyBnZW5lcmFsbHkgbW9yZSBjb252ZW5pZW50IHRvIHVzZSB0aGUgczJyYW0KIHRvb2wgYXZhaWxhYmxlIGZyb20gaHR0cDovL3N1c3BlbmQuc2YubmV0IGFuZCBkb2N1bWVudGVkIGF0Ci1odHRwOi8vZW4ub3BlbnN1c2Uub3JnL3MycmFtIC4gIEhvd2V2ZXIsIGJlZm9yZSBkb2luZyB0aGF0IGl0IGlzIHJlY29tbWVuZGVkIHRvCi1jYXJyeSBvdXQgU1RSIHRlc3RpbmcgdXNpbmcgdGhlIGZhY2lsaXR5IGRlc2NyaWJlZCBpbiBzZWN0aW9uIDEuCitodHRwOi8vZW4ub3BlbnN1c2Uub3JnL1NEQjpTdXNwZW5kX3RvX1JBTS4KIAogTmFtZWx5LCBhZnRlciB3cml0aW5nICJmcmVlemVyIiwgImRldmljZXMiLCAicGxhdGZvcm0iLCAicHJvY2Vzc29ycyIsIG9yICJjb3JlIgogaW50byAvc3lzL3Bvd2VyL3BtX3Rlc3QgKGF2YWlsYWJsZSBpZiB0aGUga2VybmVsIGlzIGNvbXBpbGVkIHdpdGgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdHJpY2tzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdHJpY2tzLnR4dAppbmRleCAzYjI2YmI1Li5hMWI4ZjcyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3RyaWNrcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci90cmlja3MudHh0CkBAIC0xLDYgKzEsNiBAQAogCXN3c3VzcC9TMyB0cmlja3MKIAl+fn5+fn5+fn5+fn5+fn5+Ci1QYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CitQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KIAogSWYgeW91IHdhbnQgdG8gdHJpY2sgc3dzdXNwL1MzIGludG8gd29ya2luZywgeW91IG1pZ2h0IHdhbnQgdG8gdHJ5OgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0CmluZGV4IDJiMzU4NDkuLjNlNjI3MmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0CkBAIC02NywxMSArNjcsMTEgQEAKICAgUE9TVGluZyBiaW9zIHdvcmtzLiBPbGUgUm9obmUgaGFzIHBhdGNoIHRvIGRvIGp1c3QgdGhhdCBhdAogICBodHRwOi8vZGV2LmdlbnRvby5vcmcvfm1hcmluZWFtL3BhdGNoLXJhZGVvbmZiLTIuNi4xMS1yYzItbW0yLgogCi0oOCkgb24gc29tZSBzeXN0ZW1zLCB5b3UgY2FuIHVzZSB0aGUgdmlkZW9fcG9zdCB1dGlsaXR5IG1lbnRpb25lZCBoZXJlOgotICBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY3MC4gRG8gZWNobyAzID4gL3N5cy9wb3dlci9zdGF0ZQotICAmJiAvdXNyL3NiaW4vdmlkZW9fcG9zdCAtIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZGlzcGxheSBpbiBjb25zb2xlIG1vZGUuCi0gIElmICB5b3UgYXJlIGluIFgsIHlvdSBjYW4gc3dpdGNoIHRvIGEgdmlydHVhbCB0ZXJtaW5hbCBhbmQgYmFjayB0byBYIHVzaW5nCi0gIENUUkwrQUxUK0YxIC0gQ1RSTCtBTFQrRjcgdG8gZ2V0IHRoZSBkaXNwbGF5IHdvcmtpbmcgaW4gZ3JhcGhpY2FsIG1vZGUgYWdhaW4uCisoOCkgb24gc29tZSBzeXN0ZW1zLCB5b3UgY2FuIHVzZSB0aGUgdmlkZW9fcG9zdCB1dGlsaXR5IGFuZCBvciAKKyAgZG8gZWNobyAzID4gL3N5cy9wb3dlci9zdGF0ZSAgJiYgL3Vzci9zYmluL3ZpZGVvX3Bvc3QgLSB3aGljaCB3aWxsIAorICBpbml0aWFsaXplIHRoZSBkaXNwbGF5IGluIGNvbnNvbGUgbW9kZS4gSWYgeW91IGFyZSBpbiBYLCB5b3UgY2FuIHN3aXRjaAorICB0byBhIHZpcnR1YWwgdGVybWluYWwgYW5kIGJhY2sgdG8gWCB1c2luZyAgQ1RSTCtBTFQrRjEgLSBDVFJMK0FMVCtGNyB0byBnZXQKKyAgdGhlIGRpc3BsYXkgd29ya2luZyBpbiBncmFwaGljYWwgbW9kZSBhZ2Fpbi4KIAogTm93LCBpZiB5b3UgcGFzcyBhY3BpX3NsZWVwPXNvbWV0aGluZywgYW5kIGl0IGRvZXMgbm90IHdvcmsgd2l0aCB5b3VyCiBiaW9zLCB5b3UnbGwgZ2V0IGEgaGFyZCBjcmFzaCBkdXJpbmcgcmVzdW1lLiBCZSBjYXJlZnVsLiBBbHNvIGl0IGlzCkBAIC0xNzcsNyArMTc3LDcgQEAKIEFzdXMgQTdWOFgJICAgIG5WaWRpYSBSSVZBIFROVDIgbW9kZWwgNjQJICBzM19iaW9zLHMzX21vZGUgKDQpCiAKIAotKCopIGZyb20gaHR0cDovL3d3dy51YnVudHVsaW51eC5vcmcvd2lraS9Ib2FyeVBNUmVzdWx0cywgbm90IHN1cmUKKygqKSBmcm9tIGh0dHBzOi8vd2lraS51YnVudHUuY29tL0hvYXJ5UE1SZXN1bHRzLCBub3Qgc3VyZQogICAgIHdoaWNoIG9wdGlvbnMgdG8gdXNlLiBJZiB5b3Uga25vdywgcGxlYXNlIHRlbGwgbWUuCiAKICgqKiopIFRvIGJlIHRlc3RlZCB3aXRoIGEgbmV3ZXIga2VybmVsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dAppbmRleCA0NmQyMjEwLi41NjhmYTA4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dApAQCAtMTA0OCw3ICsxMDQ4LDcgQEAKIAogCiBkdGMgc291cmNlIGNvZGUgY2FuIGJlIGZvdW5kIGF0Ci08aHR0cDovL296bGFicy5vcmcvfmRnaWJzb24vZHRjL2R0Yy50YXIuZ3o+Cis8aHR0cDovL2dpdC5qZGwuY29tL2dpdHdlYi8/cD1kdGMuZ2l0PgogCiBXQVJOSU5HOiBUaGlzIHZlcnNpb24gaXMgc3RpbGwgaW4gZWFybHkgZGV2ZWxvcG1lbnQgc3RhZ2U7IHRoZQogcmVzdWx0aW5nIGRldmljZS10cmVlICJibG9icyIgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkIHdpdGggdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9kaXUudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvZGl1LnR4dAppbmRleCBkZWIzNWRlLi5iNjZjYjZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9kaXUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2RpdS50eHQKQEAgLTQsMTAgKzQsMTcgQEAKIGRyaXZlIERWSSBtb25pdG9ycy4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiZnNsLWRpdSIuCistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImZzbCxkaXUiIG9yICJmc2wsbXBjNTEyMS1kaXUiLgogLSByZWcgOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIERJVSByZWdpc3RlcgogICBzZXQuCi0tIEludGVycnVwdHMgOiBvbmUgRElVIGludGVycnVwdCBzaG91bGQgYmUgZGVzY3JpYmUgaGVyZS4KKy0gaW50ZXJydXB0cyA6IG9uZSBESVUgaW50ZXJydXB0IHNob3VsZCBiZSBkZXNjcmliZWQgaGVyZS4KKy0gaW50ZXJydXB0LXBhcmVudCA6IHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorICBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gZWRpZCA6IHZlcmJhdGltIEVESUQgZGF0YSBibG9jayBkZXNjcmliaW5nIGF0dGFjaGVkIGRpc3BsYXkuCisgIERhdGEgZnJvbSB0aGUgZGV0YWlsZWQgdGltaW5nIGRlc2NyaXB0b3Igd2lsbCBiZSB1c2VkIHRvCisgIHByb2dyYW0gdGhlIGRpc3BsYXkgY29udHJvbGxlci4KIAogRXhhbXBsZSAoTVBDODYxMEhQQ0QpOgogCWRpc3BsYXlAMmMwMDAgewpAQCAtMTYsMyArMjMsMTIgQEAKIAkJaW50ZXJydXB0cyA9IDw3MiAyPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJfTsKKworRXhhbXBsZSBmb3IgTVBDNTEyMToKKwlkaXNwbGF5QDIxMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWRpdSI7CisJCXJlZyA9IDwweDIxMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDY0IDB4OD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCQllZGlkID0gW2VkaWQtZGF0YV07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2kyYy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9pMmMudHh0CmluZGV4IDUwZGEyMDMuLjFlYWNkNmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2kyYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvaTJjLnR4dApAQCAtMjAsNiArMjAsNyBAQAogIC0gZnNsLHByZXNlcnZlLWNsb2NraW5nIDogYm9vbGVhbjsgaWYgZGVmaW5lZCwgdGhlIGNsb2NrIHNldHRpbmdzCiAgICBmcm9tIHRoZSBib290bG9hZGVyIGFyZSBwcmVzZXJ2ZWQgKG5vdCB0b3VjaGVkKS4KICAtIGNsb2NrLWZyZXF1ZW5jeSA6IGRlc2lyZWQgSTJDIGJ1cyBjbG9jayBmcmVxdWVuY3kgaW4gSHouCisgLSBmc2wsdGltZW91dCA6IEkyQyBidXMgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCiAKIEV4YW1wbGVzIDoKIApAQCAtNTksNCArNjAsNSBAQAogCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJCWZzbCx0aW1lb3V0ID0gPDEwMDAwPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ydC1tdXRleC1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi9ydC1tdXRleC1kZXNpZ24udHh0CmluZGV4IDhkZjBiNzguLjMzZWQ4MDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcnQtbXV0ZXgtZGVzaWduLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3J0LW11dGV4LWRlc2lnbi50eHQKQEAgLTM2NCw3ICszNjQsNyBAQAogCiBUaGUgZnVuY3Rpb25zIGltcGxlbWVudGluZyB0aGUgdGFzayBhZGp1c3RtZW50cyBhcmUgcnRfbXV0ZXhfYWRqdXN0X3ByaW8sCiBfX3J0X211dGV4X2FkanVzdF9wcmlvIChzYW1lIGFzIHRoZSBmb3JtZXIsIGJ1dCBleHBlY3RzIHRoZSB0YXNrIHBpX2xvY2sKLXRvIGFscmVhZHkgYmUgdGFrZW4pLCBydF9tdXRleF9nZXRfcHJpbywgYW5kIHJ0X211dGV4X3NldHByaW8uCit0byBhbHJlYWR5IGJlIHRha2VuKSwgcnRfbXV0ZXhfZ2V0cHJpbywgYW5kIHJ0X211dGV4X3NldHByaW8uCiAKIHJ0X211dGV4X2dldHByaW8gYW5kIHJ0X211dGV4X3NldHByaW8gYXJlIG9ubHkgdXNlZCBpbiBfX3J0X211dGV4X2FkanVzdF9wcmlvLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0CmluZGV4IDFlYjU3NmEuLjg2ZjlmNzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0CkBAIC0yNTMxLDUgKzI1MzEsNSBAQAogPT09PT09PT09PT09PT0KIFNwZWNpYWwgdGhhbmtzIHRvIE5lYWxlIEZlcmd1c29uIHdobyBtYWludGFpbnMgYSBtdWNoCiBwcmV0dGllciBIVE1MIHZlcnNpb24gb2YgdGhpcyBwYWdlIGF0Ci1odHRwOi8vcGVuZ3VpbnZtLnByaW5jZXRvbi5lZHUvbm90ZXMuaHRtbCNEZWJ1ZzM5MAoraHR0cDovL2xpbnV4dm0ub3JnL3Blbmd1aW52bS8KIEJvYiBHcmFpbmdlciBTdGVmYW4gQmFkZXIgJiBvdGhlcnMgZm9yIHJlcG9ydGluZyBidWdzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQnVzTG9naWMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL0J1c0xvZ2ljLnR4dAppbmRleCA5ODAyM2JhLi5kN2ZiYzk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQnVzTG9naWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9CdXNMb2dpYy50eHQKQEAgLTQ3LDcgKzQ3LDcgQEAKIFRoZSBsYXRlc3QgaW5mb3JtYXRpb24gb24gTGludXggc3VwcG9ydCBmb3IgQnVzTG9naWMgU0NTSSBIb3N0IEFkYXB0ZXJzLCBhcwogd2VsbCBhcyB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZSBvZiB0aGlzIGRyaXZlciBhbmQgdGhlIGxhdGVzdCBmaXJtd2FyZSBmb3IgdGhlCiBCVC05NDgvOTU4Lzk1OEQsIHdpbGwgYWx3YXlzIGJlIGF2YWlsYWJsZSBmcm9tIG15IExpbnV4IEhvbWUgUGFnZSBhdCBVUkwKLSJodHRwOi8vd3d3LmRhbmRlbGlvbi5jb20vTGludXgvIi4KKyJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RhbmRlbGlvbi8iLgogCiBCdWcgcmVwb3J0cyBzaG91bGQgYmUgc2VudCB2aWEgZWxlY3Ryb25pYyBtYWlsIHRvICJsbnpAZGFuZGVsaW9uLmNvbSIuICBQbGVhc2UKIGluY2x1ZGUgd2l0aCB0aGUgYnVnIHJlcG9ydCB0aGUgY29tcGxldGUgY29uZmlndXJhdGlvbiBtZXNzYWdlcyByZXBvcnRlZCBieSB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubHBmYyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubHBmYwppbmRleCBlNzU5ZTkyLi4zMzdjOTI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLmxwZmMKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCkBAIC04MDcsNyArODA3LDcgQEAKIAkgIGxwZmNfZGlzY19kb25lL2xwZmNfZG9fZHBjIGNsZWFudXAgLSBscGZjX2Rpc2NfZG9uZSBjYW4gcmV0dXJuCiAJICB2b2lkIC0gbW92ZSBscGZjX2RvX2RwYyBhbmQgbHBmY19kaXNjX2RvbmUgdG8gbHBmY19oYmFkaXNjLmMgLQogCSAgcmVtb3ZlIGNoZWNraW5nIG9mIGxpc3QgZW1wdGluZXNzIGJlZm9yZSBjYWxsaW5nIGxwZmNfZGlzY19kb25lLAotCSAgaXQgaGFuZGxlcyB0aGUgZW10cHkgbGlzdCBjYXNlIGp1c3QgZmluZSBhbmQgdGhlIGFkZGl0aW9uYWwKKwkgIGl0IGhhbmRsZXMgdGhlIGVtcHR5IGxpc3QgY2FzZSBqdXN0IGZpbmUgYW5kIHRoZSBhZGRpdGlvbmFsCiAJICBpbnN0cnVjdGlvbnMgY29zdCBsZXNzIHRoZW4gdGhlIGJ1c3Rsb2NrZWQgc3BpbmxvY2sgb3BlcmF0aW9ucy4KIAkqIEludGVncmF0ZWQgcGF0Y2ggZnJvbSBDaHJpc3RvcGggSGVsbHdpZzogVGhpcyBhZGRzIGEgbmV3IDY0Yml0CiAJICBjb3VudGVyIGluc3RlYWQsIGJyZF9ubyBpc24ndCByZXVzZWQgYW55bW9yZS4gIEFsc28gc29tZSB0aW55CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZAppbmRleCAzOGU5ZTdjLi41ZTA3ZDMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWQKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiAzLglDb252ZXJ0IHBjaV9tb2R1bGVfaW5pdCB0byBwY2lfcmVnaXN0ZXJfZHJpdmVyCiAJQ29udmVydCBmcm9tIHBjaV9tb2R1bGVfaW5pdCB0byBwY2lfcmVnaXN0ZXJfZHJpdmVyCi0JKGZyb206aHR0cDovL2tlcm5lbGphbml0b3JzLm9yZy9UT0RPKQorCShmcm9tOmh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZy9LZXJuZWxKYW5pdG9ycy9UT0RPKQogCQktIFNpZ25lZC1vZmYtYnk6IERvbWVuIFB1bmNlciA8ZG9tZW5AY29kZXJvY2sub3JnPgogCiA0LglVc2UgdGhlIHByZSBkZWZpbmVkIERNQSBtYXNrIGNvbnN0YW50cyBmcm9tIGRtYS1tYXBwaW5nLmgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9GbGFzaFBvaW50LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9GbGFzaFBvaW50LnR4dAppbmRleCAxNTQwYTkyLi41YjVmMjljIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvRmxhc2hQb2ludC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0ZsYXNoUG9pbnQudHh0CkBAIC0xMyw3ICsxMyw3IEBACiBob3N0IGFkYXB0ZXJzLiAgQWxsIG9mIEJ1c0xvZ2ljJ3Mgb3RoZXIgU0NTSSBob3N0IGFkYXB0ZXJzLCBpbmNsdWRpbmcgdGhlCiBNdWx0aU1hc3RlciBsaW5lLCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4gIExpbnV4CiBkcml2ZXJzIGFuZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBvbiBPY3RvYmVyIDE1dGggYXQKLWh0dHA6Ly93d3cuZGFuZGVsaW9uLmNvbS9MaW51eC8uCitodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RhbmRlbGlvbi8uCiAKICJNeWxleCBpcyBjb21taXR0ZWQgdG8gc3VwcG9ydGluZyB0aGUgTGludXggY29tbXVuaXR5LCIgc2F5cyBQZXRlciBTaGFtYm9yYSwKIHZpY2UgcHJlc2lkZW50IG9mIG1hcmtldGluZyBmb3IgTXlsZXguICAiV2UgaGF2ZSBzdXBwb3J0ZWQgTGludXggZHJpdmVyCkBAIC0yNyw3ICsyNyw3IEBACiBTUEFSQywgU0dJIE1JUFMsIE1vdG9yb2xhIDY4aywgRGlnaXRhbCBBbHBoYSBBWFAgYW5kIE1vdG9yb2xhIFBvd2VyUEMKIG1hY2hpbmVzLiAgSXQgc3VwcG9ydHMgYSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlLCBpbmNsdWRpbmcgdGhlIFggV2luZG93CiBTeXN0ZW0sIEVtYWNzLCBhbmQgVENQL0lQIG5ldHdvcmtpbmcuICBGdXJ0aGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5saW51eC5vcmcgYW5kIGh0dHA6Ly93d3cuc3NjLmNvbS9saW51eC4KK2h0dHA6Ly93d3cubGludXgub3JnIGFuZCBodHRwOi8vd3d3LnNzYy5jb20vLgogCiBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL015bGV4LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9NeWxleC50eHQKaW5kZXggY2RmNjkyOS4uMzc5N2YzZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL015bGV4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvTXlsZXgudHh0CkBAIC0yLDQgKzIsNCBAQAogTXlsZXggKGZvcm1lcmx5IEJ1c0xvZ2ljKSBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludCBTQ1NJIEhvc3QgQWRhcHRlcnMuCiAKIFRoZSBNeWxleCBEQUM5NjAgUENJIFJBSUQgQ29udHJvbGxlcnMgYXJlIG5vdyBzdXBwb3J0ZWQuICBQbGVhc2UgY29uc3VsdAotaHR0cDovL3d3dy5kYW5kZWxpb24uY29tL0xpbnV4LyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgREFDOTYwIGRyaXZlci4KK2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZGFuZGVsaW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBEQUM5NjAgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL05pbmphU0NTSS50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvTmluamFTQ1NJLnR4dAppbmRleCAzMjI5YjY0Li5hYzhkYjhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvTmluamFTQ1NJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvTmluamFTQ1NJLnR4dApAQCAtMyw4ICszLDYgQEAKIAogMS4gQ29tbWVudAogIFRoaXMgaXMgV29ya2JpdCBjb3JwLidzKGh0dHA6Ly93d3cud29ya2JpdC5jby5qcC8pIE5pbmphU0NTSS0zCi0oaHR0cDovL3d3dy53b3JrYml0LmNvLmpwL3RzL3pfbmozci5odG1sKSBhbmQgTmluamFTQ1NJLTMyQmkKLShodHRwOi8vd3d3LndvcmtiaXQuY28uanAvdHMvel9uanNjMzJiaS5odG1sKSBQQ01DSUEgY2FyZCBkcml2ZXIgbW9kdWxlCiBmb3IgTGludXguCiAKIDIuIE15IExpbnV4IGVudmlyb25tZW50CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvYWljNzl4eC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljNzl4eC50eHQKaW5kZXggYzAxNGVjYy4uMTZlMDU0YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzc5eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9haWM3OXh4LnR4dApAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAgICAgICBodHRwOi8vd3d3LmFkYXB0ZWMuY29tL2J1eS1jYWJsZXMvLgogCiAgICBFdXJvcGUKLSAgICAtIFZpc2l0IG91ciBXZWIgc2l0ZSBhdCBodHRwOi8vd3d3LmFkYXB0ZWMtZXVyb3BlLmNvbS8uCisgICAgLSBWaXNpdCBvdXIgV2ViIHNpdGUgYXQgaHR0cDovL3d3dy5hZGFwdGVjLmNvbS9lbi1VUy9fY29tbW9uL3dvcmxkX2luZGV4LgogICAgIC0gVG8gc3BlYWsgd2l0aCBhIFRlY2huaWNhbCBTdXBwb3J0IFNwZWNpYWxpc3QsIGNhbGwsIG9yIGVtYWlsLAogICAgICAgKiBHZXJtYW46ICArNDkgODkgNDM2NiA1NTIyLCBNb25kYXktRnJpZGF5LCA5OjAwLTE3OjAwIENFVCwKICAgICAgICAgaHR0cDovL2Fzay1kZS5hZGFwdGVjLmNvbS8uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eC50eHQKaW5kZXggYjdlMjM4Yy4uMThmOGQxOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4LnR4dApAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgICBodHRwOi8vd3d3LmFkYXB0ZWMuY29tL2J1eS1jYWJsZXMvLgogCiAgICBFdXJvcGUKLSAgICAtIFZpc2l0IG91ciBXZWIgc2l0ZSBhdCBodHRwOi8vd3d3LmFkYXB0ZWMtZXVyb3BlLmNvbS8uCisgICAgLSBWaXNpdCBvdXIgV2ViIHNpdGUgYXQgaHR0cDovL3d3dy5hZGFwdGVjLmNvbS9lbi1VUy9fY29tbW9uL3dvcmxkX2luZGV4LgogICAgIC0gVG8gc3BlYWsgd2l0aCBhIFRlY2huaWNhbCBTdXBwb3J0IFNwZWNpYWxpc3QsIGNhbGwsIG9yIGVtYWlsLAogICAgICAgKiBHZXJtYW46ICArNDkgODkgNDM2NiA1NTIyLCBNb25kYXktRnJpZGF5LCA5OjAwLTE3OjAwIENFVCwKICAgICAgICAgaHR0cDovL2Fzay1kZS5hZGFwdGVjLmNvbS8uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvaHBzYS50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaHBzYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNjU4MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9ocHNhLnR4dApAQCAtMCwwICsxLDEwNyBAQAorCitIUFNBIC0gSGV3bGV0dCBQYWNrYXJkIFNtYXJ0IEFycmF5IGRyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgaHBzYSBTQ1NJIGRyaXZlciBmb3IgSFAgU21hcnQgQXJyYXkgY29udHJvbGxlcnMuCitUaGUgaHBzYSBkcml2ZXIgaXMgaW50ZW5kZWQgdG8gc3VwcGxhbnQgdGhlIGNjaXNzIGRyaXZlciBmb3IgbmV3ZXIKK1NtYXJ0IEFycmF5IGNvbnRyb2xsZXJzLiAgVGhlIGhwc2EgZHJpdmVyIGlzIGEgU0NTSSBkcml2ZXIsIHdoaWxlIHRoZQorY2Npc3MgZHJpdmVyIGlzIGEgImJsb2NrIiBkcml2ZXIuICBBY3R1YWxseSBjY2lzcyBpcyBib3RoIGEgYmxvY2sKK2RyaXZlciAoZm9yIGxvZ2ljYWwgZHJpdmVzKSBBTkQgYSBTQ1NJIGRyaXZlciAoZm9yIHRhcGUgZHJpdmVzKS4gVGhpcworInNwbGl0LWJyYWluZWQiIGRlc2lnbiBvZiB0aGUgY2Npc3MgZHJpdmVyIGlzIGEgc291cmNlIG9mIGV4Y2VzcworY29tcGxleGl0eSBhbmQgZWxpbWluYXRpbmcgdGhhdCBjb21wbGV4aXR5IGlzIG9uZSBvZiB0aGUgcmVhc29ucworZm9yIGhwc2EgdG8gZXhpc3QuCisKK1N1cHBvcnRlZCBkZXZpY2VzOgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NtYXJ0IEFycmF5IFAyMTIKK1NtYXJ0IEFycmF5IFA0MTAKK1NtYXJ0IEFycmF5IFA0MTBpCitTbWFydCBBcnJheSBQNDExCitTbWFydCBBcnJheSBQODEyCitTbWFydCBBcnJheSBQNzEybQorU21hcnQgQXJyYXkgUDcxMW0KK1N0b3JhZ2VXb3JrcyBQMTIxMG0KKworQWRkaXRpb25hbGx5LCBvbGRlciBTbWFydCBBcnJheXMgbWF5IHdvcmsgd2l0aCB0aGUgaHBzYSBkcml2ZXIgaWYgdGhlIGtlcm5lbAorYm9vdCBwYXJhbWV0ZXIgImhwc2FfYWxsb3dfYW55PTEiIGlzIHNwZWNpZmllZCwgaG93ZXZlciB0aGVzZSBhcmUgbm90IHRlc3RlZAorbm9yIHN1cHBvcnRlZCBieSBIUCB3aXRoIHRoaXMgZHJpdmVyLiAgRm9yIG9sZGVyIFNtYXJ0IEFycmF5cywgdGhlIGNjaXNzCitkcml2ZXIgc2hvdWxkIHN0aWxsIGJlIHVzZWQuCisKK0hQU0Egc3BlY2lmaWMgZW50cmllcyBpbiAvc3lzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEluIGFkZGl0aW9uIHRvIHRoZSBnZW5lcmljIFNDU0kgYXR0cmlidXRlcyBhdmFpbGFibGUgaW4gL3N5cywgaHBzYSBzdXBwb3J0cworICB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgSFBTQSBzcGVjaWZpYyBob3N0IGF0dHJpYnV0ZXM6CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC9zeXMvY2xhc3Mvc2NzaV9ob3N0L2hvc3QqL3Jlc2NhbgorICAvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0Ki9maXJtd2FyZV9yZXZpc2lvbgorCisgIHRoZSBob3N0ICJyZXNjYW4iIGF0dHJpYnV0ZSBpcyBhIHdyaXRlIG9ubHkgYXR0cmlidXRlLiAgV3JpdGluZyB0byB0aGlzCisgIGF0dHJpYnV0ZSB3aWxsIGNhdXNlIHRoZSBkcml2ZXIgdG8gc2NhbiBmb3IgbmV3LCBjaGFuZ2VkLCBvciByZW1vdmVkIGRldmljZXMKKyAgKGUuZy4gaG90LXBsdWdnZWQgdGFwZSBkcml2ZXMsIG9yIG5ld2x5IGNvbmZpZ3VyZWQgb3IgZGVsZXRlZCBsb2dpY2FsIGRyaXZlcywKKyAgZXRjLikgYW5kIG5vdGlmeSB0aGUgU0NTSSBtaWRsYXllciBvZiBhbnkgY2hhbmdlcyBkZXRlY3RlZC4gIE5vcm1hbGx5IHRoaXMgaXMKKyAgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgYnkgSFAncyBBcnJheSBDb25maWd1cmF0aW9uIFV0aWxpdHkgKGVpdGhlciB0aGUgR1VJIG9yCisgIGNvbW1hbmQgbGluZSB2YXJpZXR5KSBzbyBmb3IgbG9naWNhbCBkcml2ZSBjaGFuZ2VzLCB0aGUgdXNlciBzaG91bGQgbm90CisgIG5vcm1hbGx5IGhhdmUgdG8gdXNlIHRoaXMuICBJdCBtYXkgYmUgdXNlZnVsIHdoZW4gaG90IHBsdWdnaW5nIGRldmljZXMgbGlrZQorICB0YXBlIGRyaXZlcywgb3IgZW50aXJlIHN0b3JhZ2UgYm94ZXMgY29udGFpbmluZyBwcmUtY29uZmlndXJlZCBsb2dpY2FsIGRyaXZlcy4KKworICBUaGUgImZpcm13YXJlX3JldmlzaW9uIiBhdHRyaWJ1dGUgY29udGFpbnMgdGhlIGZpcm13YXJlIHZlcnNpb24gb2YgdGhlIFNtYXJ0IEFycmF5LgorICBGb3IgZXhhbXBsZToKKworCXJvb3RAaG9zdDovc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0NCMgY2F0IGZpcm13YXJlX3JldmlzaW9uCisJNy4xNAorCisgIEhQU0Egc3BlY2lmaWMgZGlzayBhdHRyaWJ1dGVzOgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvc3lzL2NsYXNzL3Njc2lfZGlzay9jOmI6dDpsL2RldmljZS91bmlxdWVfaWQKKyAgL3N5cy9jbGFzcy9zY3NpX2Rpc2svYzpiOnQ6bC9kZXZpY2UvcmFpZF9sZXZlbAorICAvc3lzL2NsYXNzL3Njc2lfZGlzay9jOmI6dDpsL2RldmljZS9sdW5pZAorCisgICh3aGVyZSBjOmI6dDpsIGFyZSB0aGUgY29udHJvbGxlciwgYnVzLCB0YXJnZXQgYW5kIGx1biBvZiB0aGUgZGV2aWNlKQorCisgIEZvciBleGFtcGxlOgorCisJcm9vdEBob3N0Oi9zeXMvY2xhc3Mvc2NzaV9kaXNrLzQ6MDowOjAvZGV2aWNlIyBjYXQgdW5pcXVlX2lkCisJNjAwNTA4QjEwMDEwNDQzOTUzNTUzMjMwMzc1NzBGNzcKKwlyb290QGhvc3Q6L3N5cy9jbGFzcy9zY3NpX2Rpc2svNDowOjA6MC9kZXZpY2UjIGNhdCBsdW5pZAorCTB4MDAwMDAwNDAwMDAwMDAwMAorCXJvb3RAaG9zdDovc3lzL2NsYXNzL3Njc2lfZGlzay80OjA6MDowL2RldmljZSMgY2F0IHJhaWRfbGV2ZWwKKwlSQUlEIDAKKworSFBTQSBzcGVjaWZpYyBpb2N0bHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFwcGxpY2F0aW9ucyB3cml0dGVuIGZvciB0aGUgY2Npc3MgZHJpdmVyLCBtYW55LCBidXQKKyAgbm90IGFsbCBvZiB0aGUgaW9jdGxzIHN1cHBvcnRlZCBieSB0aGUgY2Npc3MgZHJpdmVyIGFyZSBhbHNvIHN1cHBvcnRlZCBieSB0aGUKKyAgaHBzYSBkcml2ZXIuICBUaGUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlc2UgYXJlIGRlc2NyaWJlZCBpbgorICBpbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKKworICBDQ0lTU19ERVJFR0RJU0sKKyAgQ0NJU1NfUkVHTkVXRElTSworICBDQ0lTU19SRUdORVdECisKKyAgVGhlIGFib3ZlIHRocmVlIGlvY3RscyBhbGwgZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZywgd2hpY2ggaXMgdG8gY2F1c2UgdGhlIGRyaXZlcgorICB0byByZXNjYW4gZm9yIG5ldyBkZXZpY2VzLiAgVGhpcyBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgYXMgd3JpdGluZyB0byB0aGUKKyAgaHBzYSBzcGVjaWZpYyBob3N0ICJyZXNjYW4iIGF0dHJpYnV0ZS4KKworICBDQ0lTU19HRVRQQ0lJTkZPCisKKwlSZXR1cm5zIFBDSSBkb21haW4sIGJ1cywgZGV2aWNlIGFuZCBmdW5jdGlvbiBhbmQgImJvYXJkIElEIiAoUENJIHN1YnN5c3RlbSBJRCkuCisKKyAgQ0NJU1NfR0VURFJJVlZFUgorCisJUmV0dXJucyBkcml2ZXIgdmVyc2lvbiBpbiB0aHJlZSBieXRlcyBlbmNvZGVkIGFzOgorCQkobWFqb3JfdmVyc2lvbiA8PCAxNikgfCAobWlub3JfdmVyc2lvbiA8PCA4KSB8IChzdWJtaW5vcl92ZXJzaW9uKQorCisgIENDSVNTX1BBU1NUSFJVCisgIENDSVNTX0JJR19QQVNTVEhSVQorCisJQWxsb3dzICJCTUlDIiBhbmQgIkNJU1MiIGNvbW1hbmRzIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBTbWFydCBBcnJheS4KKwlUaGVzZSBhcmUgdXNlZCBleHRlbnNpdmVseSBieSB0aGUgSFAgQXJyYXkgQ29uZmlndXJhdGlvbiBVdGlsaXR5LCBTTk1QIHN0b3JhZ2UKKwlhZ2VudHMsIGV0Yy4gIFNlZSBjY2lzc192b2xfc3RhdHVzIGF0IGh0dHA6Ly9jY2lzcy5zZi5uZXQgZm9yIHNvbWUgZXhhbXBsZXMuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2libW1jYS50eHQKaW5kZXggMzkyMGYyOC4uNDVkNjFhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2libW1jYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL2libW1jYS50eHQKQEAgLTExMDksNyArMTEwOSw3IEBACiAgICAgIFE6IFdoZXJlIGNhbiBJIGZpbmQgdGhlIGxhdGVzdCBpbmZvIGFib3V0IHRoaXMgZHJpdmVyPwogICAgICBBOiBTZWUgdGhlIGZpbGUgTUFJTlRBSU5FUlMgZm9yIHRoZSBjdXJyZW50IFdXVy1hZGRyZXNzLCB3aGljaCBvZmZlcnMKICAgICAgICAgdXBkYXRlcywgaW5mbyBhbmQgUS9BIGxpc3RzLiBBdCB0aGlzIGZpbGUncyBvcmlnaW4sIHRoZSB3ZWJhZGRyZXNzCi0Jd2FzOiBodHRwOi8vd3d3LnVuaS1tYWluei5kZS9+bGFuZ20wMDAvbGludXguaHRtbAorCXdhczogaHR0cDovL3d3dy5zdGFmZi51bmktbWFpbnouZGUvbWxhbmcvbGludXguaHRtbAogICAgICBROiBNeSBTQ1NJLWFkYXB0ZXIgaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIGRyaXZlciwgd2hhdCBjYW4gSSBkbz8KICAgICAgQTogSnVzdCBmb3JjZSBpdCB0byBiZSByZWNvZ25pemVkIGJ5IGtlcm5lbCBwYXJhbWV0ZXJzLiBTZWUgc2VjdGlvbiA1LjEuCiAgICAgICAgIElmIHRoaXMgcmVhbGx5IGhhcHBlbnMsIGRvIGFsc28gc2VuZCBlLW1haWwgdG8gdGhlIG1haW50YWluZXIsIGFzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvb3NzdC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvb3NzdC50eHQKaW5kZXggMmIyMTg5MC4uYWQ4NmM2ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL29zc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9vc3N0LnR4dApAQCAtMTM1LDcgKzEzNSw3IEBACiBhIENWUyByZXBvc2l0b3J5IGFuZCBzb21lIHdlYiBwYWdlcy4gCiBUaGUgdGVzdGVyJ3MgcGFnZXMgd2hpY2ggY29udGFpbiByZWNlbnQgbmV3cyBhbmQgdXBkYXRlZCBkcml2ZXJzIHRvIGRvd25sb2FkCiBjYW4gYmUgZm91bmQgb24KLWh0dHA6Ly9saW51eDEub25zdHJlYW0ubmwvdGVzdC8KK2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvb3NzdC8KIAogSWYgeW91IGZpbmQgYW55IHByb2JsZW1zLCBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIHRlc3RlcidzIHBhZ2UgaW4gb3JkZXIKIHRvIHNlZSB3aGV0aGVyIHRoZSBwcm9ibGVtIGlzIGFscmVhZHkga25vd24gYW5kIHNvbHZlZC4gT3RoZXJ3aXNlLCBwbGVhc2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9wcGEudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQKaW5kZXggMDY3YWMzOS4uMDVmZjQ3ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQKQEAgLTEsMTMgKzEsMTMgQEAKIC0tLS0tLS0tIFRlcnNlIHdoZXJlIHRvIGdldCBaSVAgRHJpdmUgaGVscCBpbmZvIC0tLS0tLS0tCiAKIEdlbmVyYWwgSW9tZWdhIFpJUCBkcml2ZSBwYWdlIGZvciBMaW51eDoKLWh0dHA6Ly93d3cudG9ycXVlLm5ldC9+Y2FtcGJlbGwvCitodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8qL2h0dHA6Ly93d3cudG9ycXVlLm5ldC9+Y2FtcGJlbGwvCiAKIERyaXZlciBhcmNoaXZlIGZvciBvbGQgZHJpdmVyczoKLWh0dHA6Ly93d3cudG9ycXVlLm5ldC9+Y2FtcGJlbGwvcHBhLworaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vd3d3LnRvcnF1ZS5uZXQvfmNhbXBiZWxsL3BwYQogCiBMaW51eCBQYXJwb3J0IHBhZ2UgKHBhcmFsbGVsIHBvcnQpCi1odHRwOi8vd3d3LnRvcnF1ZS5uZXQvcGFycG9ydC8KK2h0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyovaHR0cDovL3d3dy50b3JxdWUubmV0L3BhcnBvcnQvCiAKIEVtYWlsIGxpc3QgZm9yIExpbnV4IFBhcnBvcnQKIGxpbnV4LXBhcnBvcnRAdG9ycXVlLm5ldApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2ktZ2VuZXJpYy50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1nZW5lcmljLnR4dAppbmRleCBjMzhlMmIzLi4wYTIyYWI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1nZW5lcmljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1nZW5lcmljLnR4dApAQCAtMzQsMTEgKzM0LDExIEBACiBUaGlzIGRlc2NyaWJlcyB0aGUgc2cgdmVyc2lvbiAzIGRyaXZlciBmb3VuZCBpbiB0aGUgbGsgMi40IHNlcmllcy4KIFRoZSBMRFAgcmVuZGVycyBkb2N1bWVudHMgaW4gc2luZ2xlIGFuZCBtdWx0aXBsZSBwYWdlIEhUTUwsIHBvc3RzY3JpcHQKIGFuZCBwZGYuIFRoaXMgZG9jdW1lbnQgY2FuIGFsc28gYmUgZm91bmQgYXQ6Ci1odHRwOi8vd3d3LnRvcnF1ZS5uZXQvc2cvcC9zZ192M19oby5odG1sCitodHRwOi8vc2cuZGFubnkuY3ovc2cvcC9zZ192M19oby5odG1sCiAKIERvY3VtZW50YXRpb24gZm9yIHRoZSB2ZXJzaW9uIDIgc2cgZHJpdmVyIGZvdW5kIGluIHRoZSBsayAyLjIgc2VyaWVzIGNhbgotYmUgZm91bmQgYXQgaHR0cDovL3d3dy50b3JxdWUubmV0L3NnL3Avc2NzaS1nZW5lcmljLnR4dCAuIEEgbGFyZ2VyIHZlcnNpb24KLWlzIGF0OiAgaHR0cDovL3d3dy50b3JxdWUubmV0L3NnL3Avc2NzaS1nZW5lcmljX2xvbmcudHh0IC4KK2JlIGZvdW5kIGF0IGh0dHA6Ly9zZy5kYW5ueS5jei9zZy8uIEEgbGFyZ2VyIHZlcnNpb24KK2lzIGF0OiBodHRwOi8vc2cuZGFubnkuY3ovc2cvcC9zY3NpLWdlbmVyaWNfbG9uZy50eHQuCiAKIFRoZSBvcmlnaW5hbCBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2cgZHJpdmVyIChwcmlvciB0byBsayAyLjIuNikgY2FuIGJlCiBmb3VuZCBhdCBodHRwOi8vd3d3LnRvcnF1ZS5uZXQvc2cvcC9vcmlnaW5hbC9TQ1NJLVByb2dyYW1taW5nLUhPV1RPLnR4dApAQCAtNjEsNyArNjEsNyBAQAogICAtIHNnX3V0aWxzICAgIGZvciB0aGUgc2cgdmVyc2lvbiAyIChhbmQgb3JpZ2luYWwpIGRyaXZlciBmb3VuZCBpbiBsayAyLjIKICAgICAgICAgICAgICAgICBhbmQgZWFybGllcgogQm90aCBwYWNrYWdlcyB3aWxsIHdvcmsgaW4gdGhlIGxrIDIuNCBzZXJpZXMgaG93ZXZlciBzZzNfdXRpbHMgb2ZmZXJzIG1vcmUKLWNhcGFiaWxpdGllcy4gVGhleSBjYW4gYmUgZm91bmQgYXQ6IGh0dHA6Ly93d3cudG9ycXVlLm5ldC9zZyBhbmQgCitjYXBhYmlsaXRpZXMuIFRoZXkgY2FuIGJlIGZvdW5kIGF0OiBodHRwOi8vc2cuZGFubnkuY3ovc2cvc2czX3V0aWxzLmh0bWwgYW5kIAogZnJlc2htZWF0Lm5ldAogCiBBbm90aGVyIGFwcHJvYWNoIGlzIHRvIGxvb2sgYXQgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgc2cgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2kudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2kudHh0CmluZGV4IGRkMWJiZjQuLjNkOTlkMzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS50eHQKQEAgLTQsOCArNCw4IEBACiB0aGUgU0NTSSBzdWJzeXN0ZW0gaW4gdGhlIExpbnV4IGtlcm5lbCAobGspIDIuNCBzZXJpZXMuIFNlZToKIGh0dHA6Ly93d3cudGxkcC5vcmcvSE9XVE8vU0NTSS0yLjQtSE9XVE8gLiBUaGUgTERQIGhhcyBzaW5nbGUKIGFuZCBtdWx0aXBsZSBwYWdlIEhUTUwgcmVuZGVyaW5ncyBhcyB3ZWxsIGFzIHBvc3RzY3JpcHQgYW5kIHBkZi4KLUl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3cudG9ycXVlLm5ldC9zY3NpL1NDU0ktMi40LUhPV1RPIC4KLQorSXQgY2FuIGFsc28gYmUgZm91bmQgYXQ6CitodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8qL2h0dHA6Ly93d3cudG9ycXVlLm5ldC9zY3NpL1NDU0ktMi40LUhPV1RPCiAKIE5vdGVzIG9uIHVzaW5nIG1vZHVsZXMgaW4gdGhlIFNDU0kgc3Vic3lzdGVtCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0CmluZGV4IGRlNjcyMjkuLjU3MGVmMmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX21pZF9sb3dfYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9taWRfbG93X2FwaS50eHQKQEAgLTQzLDcgKzQzLDcgQEAKIHR5cGljYWxseSBEb2N1bWVudGF0aW9uL3Njc2kgLiBNb3N0IGRvY3VtZW50cyBhcmUgaW4gcGxhaW4KIChpLmUuIEFTQ0lJKSB0ZXh0LiBUaGlzIGZpbGUgaXMgbmFtZWQgc2NzaV9taWRfbG93X2FwaS50eHQgYW5kIGNhbiBiZSAKIGZvdW5kIGluIHRoYXQgZGlyZWN0b3J5LiBBIG1vcmUgcmVjZW50IGNvcHkgb2YgdGhpcyBkb2N1bWVudCBtYXkgYmUgZm91bmQKLWF0IGh0dHA6Ly93d3cudG9ycXVlLm5ldC9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0Lmd6IC4gCithdCBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDA3MDEwNzE4MzM1N3JuXzEvc2cudG9ycXVlLm5ldC9zY3NpLy4gCiBNYW55IExMRHMgYXJlIGRvY3VtZW50ZWQgdGhlcmUgKGUuZy4gYWljN3h4eC50eHQpLiBUaGUgU0NTSSBtaWQtbGV2ZWwgaXMKIGJyaWVmbHkgZGVzY3JpYmVkIGluIHNjc2kudHh0IHdoaWNoIGNvbnRhaW5zIGEgdXJsIHRvIGEgZG9jdW1lbnQgCiBkZXNjcmliaW5nIHRoZSBTQ1NJIHN1YnN5c3RlbSBpbiB0aGUgbGsgMi40IHNlcmllcy4gVHdvIHVwcGVyIGxldmVsIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvbW94YS1zbWFydGlvIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvbW94YS1zbWFydGlvCmluZGV4IDUzMzdlODAuLmQxMDQ0MzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2VyaWFsL21veGEtc21hcnRpbworKysgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9tb3hhLXNtYXJ0aW8KQEAgLTc2LDcgKzc2LDcgQEAKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluIHRoaXMgdmVyc2lvbi4gUGxlYXNlIHJlZmVyIHRvIEdOVSBHZW5lcmFsCiAgICBQdWJsaWMgTGljZW5zZSBhbm5vdW5jZW1lbnQgaW4gZWFjaCBzb3VyY2UgY29kZSBmaWxlIGZvciBtb3JlIGRldGFpbC4KIAotICAgSW4gTW94YSdzIFdlYiBzaXRlcywgeW91IG1heSBhbHdheXMgZmluZCBsYXRlc3QgZHJpdmVyIGF0IGh0dHA6Ly93ZWIubW94YS5jb20uCisgICBJbiBNb3hhJ3MgV2ViIHNpdGVzLCB5b3UgbWF5IGFsd2F5cyBmaW5kIGxhdGVzdCBkcml2ZXIgYXQgaHR0cDovL3d3dy5tb3hhLmNvbS8uCiAKICAgIFRoaXMgdmVyc2lvbiBvZiBkcml2ZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBMb2FkYWJsZSBNb2R1bGUgKE1vZHVsZSBkcml2ZXIpCiAgICBvciBidWlsdC1pbiBpbnRvIGtlcm5lbCAoU3RhdGljIGRyaXZlcikuIFlvdSBtYXkgcmVmZXIgdG8gZm9sbG93aW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CmluZGV4IDIwNzViYmIuLjdmNGRjZWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CkBAIC0xMjg1LDcgKzEyODUsNyBAQAogICAgIGFib3V0IHRoaXMgZHJpdmVyLiAgTm90ZSB0aGF0IGl0IGhhcyBiZWVuIGRpc2NvbnRpbnVlZCwgYnV0IHRoZSAKICAgICBWb3lldHJhIFR1cnRsZSBCZWFjaCBrbm93bGVkZ2UgYmFzZSBlbnRyeSBmb3IgaXQgaXMgc3RpbGwgYXZhaWxhYmxlCiAgICAgYXQKLQlodHRwOi8vd3d3LnR1cnRsZWJlYWNoLmNvbS9zaXRlL2tiX2Z0cC83OTAuYXNwCisJaHR0cDovL3d3dy50dXJ0bGViZWFjaC5jb20KIAogICBNb2R1bGUgc25kLW1zbmQtcGlubmFjbGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLnR4dAppbmRleCBiZGFmZGJkLi4yNzhjYzIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQKQEAgLTU2Miw3ICs1NjIsNyBAQAogU2VuZCBhIGJ1ZyByZXBvcnQgZWl0aGVyIHRoZSBmb2xsb3dpbmdzOgogCiBrZXJuZWwtYnVnemlsbGE6OgotICBodHRwOi8vYnVnbWUubGludXgtZm91bmRhdGlvbi5vcmcvCisgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy8KIGFsc2EtZGV2ZWwgTUw6OgogICBhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9EQUkudHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9EQUkudHh0CmluZGV4IDBlYmQ3ZWEuLmM5Njc5MjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvREFJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL0RBSS50eHQKQEAgLTEzLDcgKzEzLDcgQEAKIGZyYW1lIGlzIDIxdVMgbG9uZyBhbmQgaXMgZGl2aWRlZCBpbnRvIDEzIHRpbWUgc2xvdHMuCiAKIFRoZSBBQzk3IHNwZWNpZmljYXRpb24gY2FuIGJlIGZvdW5kIGF0IDotCi1odHRwOi8vd3d3LmludGVsLmNvbS9kZXNpZ24vY2hpcHNldHMvYXVkaW8vYWM5N19yMjMucGRmCitodHRwOi8vd3d3LmludGVsLmNvbS9wL2VuX1VTL2J1c2luZXNzL2Rlc2lnbgogCiAKIEkyUwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2NvZGVjLnR4dAppbmRleCAxZTk1MzQyLi4zN2JhM2E3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2NvZGVjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2NvZGVjLnR4dApAQCAtMTQzLDcgKzE0Myw3IEBACiB9OwogCiBQbGVhc2UgcmVmZXIgdG8gdGhlIEFMU0EgZHJpdmVyIFBDTSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotaHR0cDovL3d3dy5hbHNhLXByb2plY3Qub3JnL35pd2FpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIvYzQzNi5odG0KK2h0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy9+aXdhaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLwogCiAKIDUgLSBEQVBNIGRlc2NyaXB0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9wbGF0Zm9ybS50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BsYXRmb3JtLnR4dAppbmRleCBiNjgxZDE3Li4wNmQ4MzU5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BsYXRmb3JtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BsYXRmb3JtLnR4dApAQCAtMzksNyArMzksNyBAQAogfTsKIAogUGxlYXNlIHJlZmVyIHRvIHRoZSBBTFNBIGRyaXZlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9mIGF1ZGlvIERNQS4KLWh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy9+aXdhaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyL2M0MzYuaHRtCitodHRwOi8vd3d3LmFsc2EtcHJvamVjdC5vcmcvfml3YWkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci8KIAogQW4gZXhhbXBsZSBETUEgZHJpdmVyIGlzIHNvYy9weGEvcHhhMnh4LXBjbS5jCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL1JFQURNRS5PU1MgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuT1NTCmluZGV4IGZkNDJiMDUuLmM2MTVkZWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL1JFQURNRS5PU1MKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUkVBRE1FLk9TUwpAQCAtMzYsNyArMzYsNyBAQAogCiBQYWNrYWdlcyAic25kLXV0aWwtMy44LnRhci5neiIgYW5kICJzbmQtZGF0YS0wLjEudGFyLloiCiBjb250YWluIHVzZWZ1bCB1dGlsaXRpZXMgdG8gYmUgdXNlZCB3aXRoIHRoaXMgZHJpdmVyLgotU2VlIGh0dHA6Ly93d3cub3BlbnNvdW5kLmNvbS9vc3NmcmVlL2dldHRpbmcuaHRtbCBmb3IKK1NlZSBodHRwOi8vd3d3Lm9wZW5zb3VuZC5jb20vb3NzZnJlZS8gZm9yCiBkb3dubG9hZCBpbnN0cnVjdGlvbnMuCiAKIElmIHlvdSBhcmUgbG9va2luZyBmb3IgdGhlIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMsIHBsZWFzZQpAQCAtMTQzOCw3ICsxNDM4LDcgQEAKIFRoZXJlIGFyZSBzb21lIGNvbW1vbiBhdWRpbyBjaGlwc2V0cyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIHlldC4gRm9yIGV4YW1wbGUKIFNpZXJyYSBBcmlhIGFuZCBJQk0gTXdhdmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBhcmNoaXRlY3R1cmVzCiBnZXQgc29tZSBzdXBwb3J0IGluIGZ1dHVyZSBidXQgSSBjYW4ndCBtYWtlIGFueSBwcm9taXNlcy4gSnVzdCBsb29rCi1hdCB0aGUgaG9tZSBwYWdlIChodHRwOi8vd3d3Lm9wZW5zb3VuZC5jb20vb3NzZnJlZS9uZXdfY2FyZHMuaHRtbCkKK2F0IHRoZSBob21lIHBhZ2UgKGh0dHA6Ly93d3cub3BlbnNvdW5kLmNvbS9vc3NmcmVlLykKIGZvciBsYXRlc3QgaW5mby4KIAogSW5mb3JtYXRpb24gYWJvdXQgdW5zdXBwb3J0ZWQgc291bmQgY2FyZHMgYW5kIGNoaXBzZXRzIGlzIHdlbGNvbWUgYXMgd2VsbApAQCAtMTQ0OSw3ICsxNDQ5LDYgQEAKIEhhbm51IFNhdm9sYWluZW4KIGhhbm51QG9wZW5zb3VuZC5jb20KIAotUGVyc29uYWwgaG9tZSBwYWdlOgkgICBodHRwOi8vd3d3LmNvbXB1c29uaWMuZmkvfmhhbm51CiBob21lIHBhZ2Ugb2YgT1NTL0ZyZWU6IGh0dHA6Ly93d3cub3BlbnNvdW5kLmNvbS9vc3NmcmVlCiAKIGhvbWUgcGFnZSBvZiBjb21tZXJjaWFsIE9TUwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0CmluZGV4IDliNjU5YzcuLjQ5MDlkNDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKQEAgLTEsNSArMSw1IEBACiBDb3B5cmlnaHQgMjAwNCBMaW51cyBUb3J2YWxkcwotQ29weXJpZ2h0IDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorQ29weXJpZ2h0IDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiBDb3B5cmlnaHQgMjAwNiBCb2IgQ29wZWxhbmQgPG1lQGJvYmNvcGVsYW5kLmNvbT4KIAogVXNpbmcgc3BhcnNlIGZvciB0eXBlY2hlY2tpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCA1ZmRiYjYxLi44MmIyZGExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0xOTYsNyArMTk2LDcgQEAKIAogbGVnYWN5X3ZhX2xheW91dAogCi1JZiBub24temVybywgdGhpcyBzeXNjdGwgZGlzYWJsZXMgdGhlIG5ldyAzMi1iaXQgbW1hcCBtbWFwIGxheW91dCAtIHRoZSBrZXJuZWwKK0lmIG5vbi16ZXJvLCB0aGlzIHN5c2N0bCBkaXNhYmxlcyB0aGUgbmV3IDMyLWJpdCBtbWFwIGxheW91dCAtIHRoZSBrZXJuZWwKIHdpbGwgdXNlIHRoZSBsZWdhY3kgKDIuNCkgbGF5b3V0IGZvciBhbGwgcHJvY2Vzc2VzLgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWxlcGhvbnkvaXhqLnR4dCBiL0RvY3VtZW50YXRpb24vdGVsZXBob255L2l4ai50eHQKaW5kZXggNDRkMTI0MDAuLjRmYjMxNGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdGVsZXBob255L2l4ai50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWxlcGhvbnkvaXhqLnR4dApAQCAtMTA4LDE0ICsxMDgsOSBAQAogCiAxLjQgIFdoZXJlIHRvIGdldCB0aGluZ3MKIAotWW91IGNhbiBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgZnJvbToKK0luZm8gb24gbGF0ZXN0IHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgYXJlIGhlcmU6CiAKLWh0dHA6Ly93d3cucXVpY2tuZXQubmV0L2RldmVsb3AuaHRtCi0KLVlvdSBjYW4gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgZnJvbToKLQotaHR0cDovL3d3dy5xdWlja25ldC5uZXQvZGV2ZWxvcC5odG0KLQoraHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvKi9odHRwOi8vd3d3LnF1aWNrbmV0Lm5ldC9kZXZlbG9wLmh0bQogCiAxLjUgIE1haWxpbmcgTGlzdAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RpbWVycy90aW1lcnMtaG93dG8udHh0IGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvdGltZXJzLWhvd3RvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVmMjlkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvdGltZXJzLWhvd3RvLnR4dApAQCAtMCwwICsxLDEwNSBAQAorZGVsYXlzIC0gSW5mb3JtYXRpb24gb24gdGhlIHZhcmlvdXMga2VybmVsIGRlbGF5IC8gc2xlZXAgbWVjaGFuaXNtcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGRvY3VtZW50IHNlZWtzIHRvIGFuc3dlciB0aGUgY29tbW9uIHF1ZXN0aW9uOiAiV2hhdCBpcyB0aGUKK1JpZ2h0V2F5IChUTSkgdG8gaW5zZXJ0IGEgZGVsYXk/IgorCitUaGlzIHF1ZXN0aW9uIGlzIG1vc3Qgb2Z0ZW4gZmFjZWQgYnkgZHJpdmVyIHdyaXRlcnMgd2hvIGhhdmUgdG8KK2RlYWwgd2l0aCBoYXJkd2FyZSBkZWxheXMgYW5kIHdobyBtYXkgbm90IGJlIHRoZSBtb3N0IGludGltYXRlbHkKK2ZhbWlsaWFyIHdpdGggdGhlIGlubmVyIHdvcmtpbmdzIG9mIHRoZSBMaW51eCBLZXJuZWwuCisKKworSW5zZXJ0aW5nIERlbGF5cworLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QsIGFuZCBtb3N0IGltcG9ydGFudCwgcXVlc3Rpb24geW91IG5lZWQgdG8gYXNrIGlzICJJcyBteQorY29kZSBpbiBhbiBhdG9taWMgY29udGV4dD8iICBUaGlzIHNob3VsZCBiZSBmb2xsb3dlZCBjbG9zZWx5IGJ5ICJEb2VzCitpdCByZWFsbHkgbmVlZCB0byBkZWxheSBpbiBhdG9taWMgY29udGV4dD8iIElmIHNvLi4uCisKK0FUT01JQyBDT05URVhUOgorCVlvdSBtdXN0IHVzZSB0aGUgKmRlbGF5IGZhbWlseSBvZiBmdW5jdGlvbnMuIFRoZXNlCisJZnVuY3Rpb25zIHVzZSB0aGUgamlmZmllIGVzdGltYXRpb24gb2YgY2xvY2sgc3BlZWQKKwlhbmQgd2lsbCBidXN5IHdhaXQgZm9yIGVub3VnaCBsb29wIGN5Y2xlcyB0byBhY2hpZXZlCisJdGhlIGRlc2lyZWQgZGVsYXk6CisKKwluZGVsYXkodW5zaWduZWQgbG9uZyBuc2VjcykKKwl1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKKwltZGVsYXkodW5zZ2luZWQgbG9uZyBtc2VjcykKKworCXVkZWxheSBpcyB0aGUgZ2VuZXJhbGx5IHByZWZlcnJlZCBBUEk7IG5kZWxheS1sZXZlbAorCXByZWNpc2lvbiBtYXkgbm90IGFjdHVhbGx5IGV4aXN0IG9uIG1hbnkgbm9uLVBDIGRldmljZXMuCisKKwltZGVsYXkgaXMgbWFjcm8gd3JhcHBlciBhcm91bmQgdWRlbGF5LCB0byBhY2NvdW50IGZvcgorCXBvc3NpYmxlIG92ZXJmbG93IHdoZW4gcGFzc2luZyBsYXJnZSBhcmd1bWVudHMgdG8gdWRlbGF5LgorCUluIGdlbmVyYWwsIHVzZSBvZiBtZGVsYXkgaXMgZGlzY291cmFnZWQgYW5kIGNvZGUgc2hvdWxkCisJYmUgcmVmYWN0b3JlZCB0byBhbGxvdyBmb3IgdGhlIHVzZSBvZiBtc2xlZXAuCisKK05PTi1BVE9NSUMgQ09OVEVYVDoKKwlZb3Ugc2hvdWxkIHVzZSB0aGUgKnNsZWVwW19yYW5nZV0gZmFtaWx5IG9mIGZ1bmN0aW9ucy4KKwlUaGVyZSBhcmUgYSBmZXcgbW9yZSBvcHRpb25zIGhlcmUsIHdoaWxlIGFueSBvZiB0aGVtIG1heQorCXdvcmsgY29ycmVjdGx5LCB1c2luZyB0aGUgInJpZ2h0IiBzbGVlcCBmdW5jdGlvbiB3aWxsCisJaGVscCB0aGUgc2NoZWR1bGVyLCBwb3dlciBtYW5hZ2VtZW50LCBhbmQganVzdCBtYWtlIHlvdXIKKwlkcml2ZXIgYmV0dGVyIDopCisKKwktLSBCYWNrZWQgYnkgYnVzeS13YWl0IGxvb3A6CisJCXVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQorCS0tIEJhY2tlZCBieSBocnRpbWVyczoKKwkJdXNsZWVwX3JhbmdlKHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCkKKwktLSBCYWNrZWQgYnkgamlmZmllcyAvIGxlZ2FjeV90aW1lcnMKKwkJbXNsZWVwKHVuc2lnbmVkIGxvbmcgbXNlY3MpCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHVuc2lnbmVkIGxvbmcgbXNlY3MpCisKKwlVbmxpa2UgdGhlICpkZWxheSBmYW1pbHksIHRoZSB1bmRlcmx5aW5nIG1lY2hhbmlzbQorCWRyaXZpbmcgZWFjaCBvZiB0aGVzZSBjYWxscyB2YXJpZXMsIHRodXMgdGhlcmUgYXJlCisJcXVpcmtzIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YuCisKKworCVNMRUVQSU5HIEZPUiAiQSBGRVciIFVTRUNTICggPCB+MTB1cz8gKToKKwkJKiBVc2UgdWRlbGF5CisKKwkJLSBXaHkgbm90IHVzbGVlcD8KKwkJCU9uIHNsb3dlciBzeXN0ZW1zLCAoZW1iZWRkZWQsIE9SIHBlcmhhcHMgYSBzcGVlZC0KKwkJCXN0ZXBwZWQgUEMhKSB0aGUgb3ZlcmhlYWQgb2Ygc2V0dGluZyB1cCB0aGUgaHJ0aW1lcnMKKwkJCWZvciB1c2xlZXAgKm1heSogbm90IGJlIHdvcnRoIGl0LiBTdWNoIGFuIGV2YWx1YXRpb24KKwkJCXdpbGwgb2J2aW91c2x5IGRlcGVuZCBvbiB5b3VyIHNwZWNpZmljIHNpdHVhdGlvbiwgYnV0CisJCQlpdCBpcyBzb21ldGhpbmcgdG8gYmUgYXdhcmUgb2YuCisKKwlTTEVFUElORyBGT1IgflVTRUNTIE9SIFNNQUxMIE1TRUNTICggMTB1cyAtIDIwbXMpOgorCQkqIFVzZSB1c2xlZXBfcmFuZ2UKKworCQktIFdoeSBub3QgbXNsZWVwIGZvciAoMW1zIC0gMjBtcyk/CisJCQlFeHBsYWluZWQgb3JpZ2luYWxseSBoZXJlOgorCQkJCWh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvOC8zLzI1MAorCQkJbXNsZWVwKDF+MjApIG1heSBub3QgZG8gd2hhdCB0aGUgY2FsbGVyIGludGVuZHMsIGFuZAorCQkJd2lsbCBvZnRlbiBzbGVlcCBsb25nZXIgKH4yMCBtcyBhY3R1YWwgc2xlZXAgZm9yIGFueQorCQkJdmFsdWUgZ2l2ZW4gaW4gdGhlIDF+MjBtcyByYW5nZSkuIEluIG1hbnkgY2FzZXMgdGhpcworCQkJaXMgbm90IHRoZSBkZXNpcmVkIGJlaGF2aW9yLgorCisJCS0gV2h5IGlzIHRoZXJlIG5vICJ1c2xlZXAiIC8gV2hhdCBpcyBhIGdvb2QgcmFuZ2U/CisJCQlTaW5jZSB1c2xlZXBfcmFuZ2UgaXMgYnVpbHQgb24gdG9wIG9mIGhydGltZXJzLCB0aGUKKwkJCXdha2V1cCB3aWxsIGJlIHZlcnkgcHJlY2lzZSAoaXNoKSwgdGh1cyBhIHNpbXBsZQorCQkJdXNsZWVwIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSBpbnRyb2R1Y2UgYSBsYXJnZSBudW1iZXIKKwkJCW9mIHVuZGVzaXJlZCBpbnRlcnJ1cHRzLgorCisJCQlXaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSByYW5nZSwgdGhlIHNjaGVkdWxlciBpcworCQkJZnJlZSB0byBjb2FsZXNjZSB5b3VyIHdha2V1cCB3aXRoIGFueSBvdGhlciB3YWtldXAKKwkJCXRoYXQgbWF5IGhhdmUgaGFwcGVuZWQgZm9yIG90aGVyIHJlYXNvbnMsIG9yIGF0IHRoZQorCQkJd29yc3QgY2FzZSwgZmlyZSBhbiBpbnRlcnJ1cHQgZm9yIHlvdXIgdXBwZXIgYm91bmQuCisKKwkJCVRoZSBsYXJnZXIgYSByYW5nZSB5b3Ugc3VwcGx5LCB0aGUgZ3JlYXRlciBhIGNoYW5jZQorCQkJdGhhdCB5b3Ugd2lsbCBub3QgdHJpZ2dlciBhbiBpbnRlcnJ1cHQ7IHRoaXMgc2hvdWxkCisJCQliZSBiYWxhbmNlZCB3aXRoIHdoYXQgaXMgYW4gYWNjZXB0YWJsZSB1cHBlciBib3VuZCBvbgorCQkJZGVsYXkgLyBwZXJmb3JtYW5jZSBmb3IgeW91ciBzcGVjaWZpYyBjb2RlIHBhdGguIEV4YWN0CisJCQl0b2xlcmFuY2VzIGhlcmUgYXJlIHZlcnkgc2l0dWF0aW9uIHNwZWNpZmljLCB0aHVzIGl0CisJCQlpcyBsZWZ0IHRvIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIGEgcmVhc29uYWJsZSByYW5nZS4KKworCVNMRUVQSU5HIEZPUiBMQVJHRVIgTVNFQ1MgKCAxMG1zKyApCisJCSogVXNlIG1zbGVlcCBvciBwb3NzaWJseSBtc2xlZXBfaW50ZXJydXB0aWJsZQorCisJCS0gV2hhdCdzIHRoZSBkaWZmZXJlbmNlPworCQkJbXNsZWVwIHNldHMgdGhlIGN1cnJlbnQgdGFzayB0byBUQVNLX1VOSU5URVJSVVBUSUJMRQorCQkJd2hlcmVhcyBtc2xlZXBfaW50ZXJydXB0aWJsZSBzZXRzIHRoZSBjdXJyZW50IHRhc2sgdG8KKwkJCVRBU0tfSU5URVJSVVBUSUJMRSBiZWZvcmUgc2NoZWR1bGluZyB0aGUgc2xlZXAuIEluCisJCQlzaG9ydCwgdGhlIGRpZmZlcmVuY2UgaXMgd2hldGhlciB0aGUgc2xlZXAgY2FuIGJlIGVuZGVkCisJCQllYXJseSBieSBhIHNpZ25hbC4gSW4gZ2VuZXJhbCwganVzdCB1c2UgbXNsZWVwIHVubGVzcworCQkJeW91IGtub3cgeW91IGhhdmUgYSBuZWVkIGZvciB0aGUgaW50ZXJydXB0aWJsZSB2YXJpYW50LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90b21veW8udHh0IGIvRG9jdW1lbnRhdGlvbi90b21veW8udHh0CmluZGV4IGIzYTIzMmMuLjIwMGEyZDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdG9tb3lvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RvbW95by50eHQKQEAgLTMsOCArMyw4IEBACiBUT01PWU8gaXMgYSBuYW1lLWJhc2VkIE1BQyBleHRlbnNpb24gKExTTSBtb2R1bGUpIGZvciB0aGUgTGludXgga2VybmVsLgogCiBMaXZlQ0QtYmFzZWQgdHV0b3JpYWxzIGFyZSBhdmFpbGFibGUgYXQKLWh0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvZW4vMS42LngvMXN0LXN0ZXAvdWJ1bnR1OC4wNC1saXZlLwotaHR0cDovL3RvbW95by5zb3VyY2Vmb3JnZS5qcC9lbi8xLjYueC8xc3Qtc3RlcC9jZW50b3M1LWxpdmUvIC4KK2h0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvMS43LzFzdC1zdGVwL3VidW50dTEwLjA0LWxpdmUvCitodHRwOi8vdG9tb3lvLnNvdXJjZWZvcmdlLmpwLzEuNy8xc3Qtc3RlcC9jZW50b3M1LWxpdmUvIC4KIFRob3VnaCB0aGVzZSB0dXRvcmlhbHMgdXNlIG5vbi1MU00gdmVyc2lvbiBvZiBUT01PWU8sIHRoZXkgYXJlIHVzZWZ1bCBmb3IgeW91CiB0byBrbm93IHdoYXQgVE9NT1lPIGlzLgogCkBAIC0xMywxMiArMTMsMTIgQEAKIEJ1aWxkIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfU0VDVVJJVFlfVE9NT1lPPXkgYW5kIHBhc3MgInNlY3VyaXR5PXRvbW95byIgb24KIGtlcm5lbCdzIGNvbW1hbmQgbGluZS4KIAotUGxlYXNlIHNlZSBodHRwOi8vdG9tb3lvLnNvdXJjZWZvcmdlLmpwL2VuLzIuMi54LyBmb3IgZGV0YWlscy4KK1BsZWFzZSBzZWUgaHR0cDovL3RvbW95by5zb3VyY2Vmb3JnZS5qcC8yLjMvIGZvciBkZXRhaWxzLgogCiAtLS0gV2hlcmUgaXMgZG9jdW1lbnRhdGlvbj8gLS0tCiAKIFVzZXIgPC0+IEtlcm5lbCBpbnRlcmZhY2UgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvZW4vMi4yLngvcG9saWN5LXJlZmVyZW5jZS5odG1sIC4KK2h0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvMi4zL3BvbGljeS1yZWZlcmVuY2UuaHRtbCAuCiAKIE1hdGVyaWFscyB3ZSBwcmVwYXJlZCBmb3Igc2VtaW5hcnMgYW5kIHN5bXBvc2l1bXMgYXJlIGF2YWlsYWJsZSBhdAogaHR0cDovL3NvdXJjZWZvcmdlLmpwL3Byb2plY3RzL3RvbW95by9kb2NzLz9jYXRlZ29yeV9pZD01MzImbGFuZ3VhZ2VfaWQ9MSAuCkBAIC01MCw2ICs1MCw2IEBACiBTRUxpbnV4L1NNQUNLL0FwcEFybW9yIGV0Yy4gd2hlbiB5b3Ugd2FudCB0byB1c2UgVE9NT1lPLgogCiBXZSBob3BlIHRoYXQgTFNNIGJlY29tZXMgc3RhY2thYmxlIGluIGZ1dHVyZS4gTWVhbndoaWxlLCB5b3UgY2FuIHVzZSBub24tTFNNCi12ZXJzaW9uIG9mIFRPTU9ZTywgYXZhaWxhYmxlIGF0IGh0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvZW4vMS42LngvIC4KK3ZlcnNpb24gb2YgVE9NT1lPLCBhdmFpbGFibGUgYXQgaHR0cDovL3RvbW95by5zb3VyY2Vmb3JnZS5qcC8xLjcvIC4KIExTTSB2ZXJzaW9uIG9mIFRPTU9ZTyBpcyBhIHN1YnNldCBvZiBub24tTFNNIHZlcnNpb24gb2YgVE9NT1lPLiBXZSBhcmUgcGxhbm5pbmcKIHRvIHBvcnQgbm9uLUxTTSB2ZXJzaW9uJ3MgZnVuY3Rpb25hbGl0aWVzIHRvIExTTSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0CmluZGV4IGYxZjgxYWYuLmRjNTJiZDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dApAQCAtMTMsNiArMTMsOSBAQAogd2FudCBtb3JlIGV4cGxhbmF0aW9uIG9mIGEgZmVhdHVyZSBpbiB0ZXJtcyBvZiBjb21tb24gY29kZSwgcmV2aWV3IHRoZSBjb21tb24KIGZ0cmFjZS50eHQgZmlsZS4KIAorSWRlYWxseSwgZXZlcnlvbmUgd2hvIHdpc2hlcyB0byByZXRhaW4gcGVyZm9ybWFuY2Ugd2hpbGUgc3VwcG9ydGluZyB0cmFjaW5nIGluCit0aGVpciBrZXJuZWwgc2hvdWxkIG1ha2UgaXQgYWxsIHRoZSB3YXkgdG8gZHluYW1pYyBmdHJhY2Ugc3VwcG9ydC4KKwogCiBQcmVyZXF1aXNpdGVzCiAtLS0tLS0tLS0tLS0tCkBAIC0yMTUsNyArMjE4LDcgQEAKIGV4aXRpbmcgb2YgYSBmdW5jdGlvbi4gIE9uIGV4aXQsIHRoZSB2YWx1ZSBpcyBjb21wYXJlZCBhbmQgaWYgaXQgZG9lcyBub3QKIG1hdGNoLCB0aGVuIGl0IHdpbGwgcGFuaWMgdGhlIGtlcm5lbC4gIFRoaXMgaXMgbGFyZ2VseSBhIHNhbml0eSBjaGVjayBmb3IgYmFkCiBjb2RlIGdlbmVyYXRpb24gd2l0aCBnY2MuICBJZiBnY2MgZm9yIHlvdXIgcG9ydCBzYW5lbHkgdXBkYXRlcyB0aGUgZnJhbWUKLXBvaW50ZXIgdW5kZXIgZGlmZmVyZW50IG9waXRtaXphdGlvbiBsZXZlbHMsIHRoZW4gaWdub3JlIHRoaXMgb3B0aW9uLgorcG9pbnRlciB1bmRlciBkaWZmZXJlbnQgb3B0aW1pemF0aW9uIGxldmVscywgdGhlbiBpZ25vcmUgdGhpcyBvcHRpb24uCiAKIEhvd2V2ZXIsIGFkZGluZyBzdXBwb3J0IGZvciBpdCBpc24ndCB0ZXJyaWJseSBkaWZmaWN1bHQuICBJbiB5b3VyIGFzc2VtYmx5IGNvZGUKIHRoYXQgY2FsbHMgcHJlcGFyZV9mdHJhY2VfcmV0dXJuKCksIHBhc3MgdGhlIGZyYW1lIHBvaW50ZXIgYXMgdGhlIDNyZCBhcmd1bWVudC4KQEAgLTIzNCw3ICsyMzcsNyBAQAogCiAKIEhBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogWW91IG5lZWQgdmVyeSBmZXcgdGhpbmdzIHRvIGdldCB0aGUgc3lzY2FsbHMgdHJhY2luZyBpbiBhbiBhcmNoLgogCkBAIC0yNTAsMTIgKzI1MywxNTIgQEAKIEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotU2VlIHNjcmlwdHMvcmVjb3JkbWNvdW50LnBsIGZvciBtb3JlIGluZm8uCi0KLTxkZXRhaWxzIHRvIGJlIGZpbGxlZD4KK1NlZSBzY3JpcHRzL3JlY29yZG1jb3VudC5wbCBmb3IgbW9yZSBpbmZvLiAgSnVzdCBmaWxsIGluIHRoZSBhcmNoLXNwZWNpZmljCitkZXRhaWxzIGZvciBob3cgdG8gbG9jYXRlIHRoZSBhZGRyZXNzZXMgb2YgbWNvdW50IGNhbGwgc2l0ZXMgdmlhIG9iamR1bXAuCitUaGlzIG9wdGlvbiBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB3aXRob3V0IGFsc28gaW1wbGVtZW50aW5nIGR5bmFtaWMgZnRyYWNlLgogCiAKIEhBVkVfRFlOQU1JQ19GVFJBQ0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3Ugd2lsbCBmaXJzdCBuZWVkIEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQgYW5kIEhBVkVfRlVOQ1RJT05fVFJBQ0VSLCBzbworc2Nyb2xsIHlvdXIgcmVhZGVyIGJhY2sgdXAgaWYgeW91IGdvdCBvdmVyIGVhZ2VyLgorCitPbmNlIHRob3NlIGFyZSBvdXQgb2YgdGhlIHdheSwgeW91IHdpbGwgbmVlZCB0byBpbXBsZW1lbnQ6CisJLSBhc20vZnRyYWNlLmg6CisJCS0gTUNPVU5UX0FERFIKKwkJLSBmdHJhY2VfY2FsbF9hZGp1c3QoKQorCQktIHN0cnVjdCBkeW5fYXJjaF9mdHJhY2V7fQorCS0gYXNtIGNvZGU6CisJCS0gbWNvdW50KCkgKG5ldyBzdHViKQorCQktIGZ0cmFjZV9jYWxsZXIoKQorCQktIGZ0cmFjZV9jYWxsKCkKKwkJLSBmdHJhY2Vfc3R1YigpCisJLSBDIGNvZGU6CisJCS0gZnRyYWNlX2R5bl9hcmNoX2luaXQoKQorCQktIGZ0cmFjZV9tYWtlX25vcCgpCisJCS0gZnRyYWNlX21ha2VfY2FsbCgpCisJCS0gZnRyYWNlX3VwZGF0ZV9mdHJhY2VfZnVuYygpCisKK0ZpcnN0IHlvdSB3aWxsIG5lZWQgdG8gZmlsbCBvdXQgc29tZSBhcmNoIGRldGFpbHMgaW4geW91ciBhc20vZnRyYWNlLmguCisKK0RlZmluZSBNQ09VTlRfQUREUiBhcyB0aGUgYWRkcmVzcyBvZiB5b3VyIG1jb3VudCBzeW1ib2wgc2ltaWxhciB0bzoKKwkjZGVmaW5lIE1DT1VOVF9BRERSICgodW5zaWduZWQgbG9uZyltY291bnQpCitTaW5jZSBubyBvbmUgZWxzZSB3aWxsIGhhdmUgYSBkZWNsIGZvciB0aGF0IGZ1bmN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvOgorCWV4dGVybiB2b2lkIG1jb3VudCh2b2lkKTsKKworWW91IHdpbGwgYWxzbyBuZWVkIHRoZSBoZWxwZXIgZnVuY3Rpb24gZnRyYWNlX2NhbGxfYWRqdXN0KCkuICBNb3N0IHBlb3BsZQord2lsbCBiZSBhYmxlIHRvIHN0dWIgaXQgb3V0IGxpa2Ugc286CisJc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZ0cmFjZV9jYWxsX2FkanVzdCh1bnNpZ25lZCBsb25nIGFkZHIpCisJeworCQlyZXR1cm4gYWRkcjsKKwl9Cis8ZGV0YWlscyB0byBiZSBmaWxsZWQ+CisKK0xhc3RseSB5b3Ugd2lsbCBuZWVkIHRoZSBjdXN0b20gZHluX2FyY2hfZnRyYWNlIHN0cnVjdHVyZS4gIElmIHlvdSBuZWVkCitzb21lIGV4dHJhIHN0YXRlIHdoZW4gcnVudGltZSBwYXRjaGluZyBhcmJpdHJhcnkgY2FsbCBzaXRlcywgdGhpcyBpcyB0aGUKK3BsYWNlLiAgRm9yIG5vdyB0aG91Z2gsIGNyZWF0ZSBhbiBlbXB0eSBzdHJ1Y3Q6CisJc3RydWN0IGR5bl9hcmNoX2Z0cmFjZSB7CisJCS8qIE5vIGV4dHJhIGRhdGEgbmVlZGVkICovCisJfTsKKworV2l0aCB0aGUgaGVhZGVyIG91dCBvZiB0aGUgd2F5LCB3ZSBjYW4gZmlsbCBvdXQgdGhlIGFzc2VtYmx5IGNvZGUuICBXaGlsZSB3ZQorZGlkIGFscmVhZHkgY3JlYXRlIGEgbWNvdW50KCkgZnVuY3Rpb24gZWFybGllciwgZHluYW1pYyBmdHJhY2Ugb25seSB3YW50cyBhCitzdHViIGZ1bmN0aW9uLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBtY291bnQoKSB3aWxsIG9ubHkgYmUgdXNlZCBkdXJpbmcgYm9vdAorYW5kIHRoZW4gYWxsIHJlZmVyZW5jZXMgdG8gaXQgd2lsbCBiZSBwYXRjaGVkIG91dCBuZXZlciB0byByZXR1cm4uICBJbnN0ZWFkLAordGhlIGd1dHMgb2YgdGhlIG9sZCBtY291bnQoKSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGZ0cmFjZV9jYWxsZXIoKQorZnVuY3Rpb24uICBCZWNhdXNlIHRoZSB0d28gYXJlIGhhcmQgdG8gbWVyZ2UsIGl0IHdpbGwgbW9zdCBsaWtlbHkgYmUgYSBsb3QKK2Vhc2llciB0byBoYXZlIHR3byBzZXBhcmF0ZSBkZWZpbml0aW9ucyBzcGxpdCB1cCBieSAjaWZkZWZzLiAgU2FtZSBnb2VzIGZvcgordGhlIGZ0cmFjZV9zdHViKCkgYXMgdGhhdCB3aWxsIG5vdyBiZSBpbmxpbmVkIGluIGZ0cmFjZV9jYWxsZXIoKS4KKworQmVmb3JlIHdlIGdldCBjb25mdXNlZCBhbnltb3JlLCBsZXQncyBjaGVjayBvdXQgc29tZSBwc2V1ZG8gY29kZSBzbyB5b3UgY2FuCitpbXBsZW1lbnQgeW91ciBvd24gc3R1ZmYgaW4gYXNzZW1ibHk6CisKK3ZvaWQgbWNvdW50KHZvaWQpCit7CisJcmV0dXJuOworfQorCit2b2lkIGZ0cmFjZV9jYWxsZXIodm9pZCkKK3sKKwkvKiBpbXBsZW1lbnQgSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVCBpZiB5b3UgZGVzaXJlICovCisKKwkvKiBzYXZlIGFsbCBzdGF0ZSBuZWVkZWQgYnkgdGhlIEFCSSAoc2VlIHBhcmFncmFwaCBhYm92ZSkgKi8KKworCXVuc2lnbmVkIGxvbmcgZnJvbXBjID0gLi4uOworCXVuc2lnbmVkIGxvbmcgc2VsZnBjID0gPHJldHVybiBhZGRyZXNzPiAtIE1DT1VOVF9JTlNOX1NJWkU7CisKK2Z0cmFjZV9jYWxsOgorCWZ0cmFjZV9zdHViKGZyb21wYywgc2VsZnBjKTsKKworCS8qIHJlc3RvcmUgYWxsIHN0YXRlIG5lZWRlZCBieSB0aGUgQUJJICovCisKK2Z0cmFjZV9zdHViOgorCXJldHVybjsKK30KKworVGhpcyBtaWdodCBsb29rIGEgbGl0dGxlIG9kZCBhdCBmaXJzdCwgYnV0IGtlZXAgaW4gbWluZCB0aGF0IHdlIHdpbGwgYmUgcnVudGltZQorcGF0Y2hpbmcgbXVsdGlwbGUgdGhpbmdzLiAgRmlyc3QsIG9ubHkgZnVuY3Rpb25zIHRoYXQgd2UgYWN0dWFsbHkgd2FudCB0byB0cmFjZQord2lsbCBiZSBwYXRjaGVkIHRvIGNhbGwgZnRyYWNlX2NhbGxlcigpLiAgU2Vjb25kLCBzaW5jZSB3ZSBvbmx5IGhhdmUgb25lIHRyYWNlcgorYWN0aXZlIGF0IGEgdGltZSwgd2Ugd2lsbCBwYXRjaCB0aGUgZnRyYWNlX2NhbGxlcigpIGZ1bmN0aW9uIGl0c2VsZiB0byBjYWxsIHRoZQorc3BlY2lmaWMgdHJhY2VyIGluIHF1ZXN0aW9uLiAgVGhhdCBpcyB0aGUgcG9pbnQgb2YgdGhlIGZ0cmFjZV9jYWxsIGxhYmVsLgorCitXaXRoIHRoYXQgaW4gbWluZCwgbGV0J3MgbW92ZSBvbiB0byB0aGUgQyBjb2RlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSBkb2luZyB0aGUKK3J1bnRpbWUgcGF0Y2hpbmcuICBZb3UnbGwgbmVlZCBhIGxpdHRsZSBrbm93bGVkZ2Ugb2YgeW91ciBhcmNoJ3Mgb3Bjb2RlcyBpbgorb3JkZXIgdG8gbWFrZSBpdCB0aHJvdWdoIHRoZSBuZXh0IHNlY3Rpb24uCisKK0V2ZXJ5IGFyY2ggaGFzIGFuIGluaXQgY2FsbGJhY2sgZnVuY3Rpb24uICBJZiB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgZWFybHkgb24KK3RvIGluaXRpYWxpemUgc29tZSBzdGF0ZSwgdGhpcyBpcyB0aGUgdGltZSB0byBkbyB0aGF0LiAgT3RoZXJ3aXNlLCB0aGlzIHNpbXBsZQorZnVuY3Rpb24gYmVsb3cgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgcGVvcGxlOgorCitpbnQgX19pbml0IGZ0cmFjZV9keW5fYXJjaF9pbml0KHZvaWQgKmRhdGEpCit7CisJLyogcmV0dXJuIHZhbHVlIGlzIGRvbmUgaW5kaXJlY3RseSB2aWEgZGF0YSAqLworCSoodW5zaWduZWQgbG9uZyAqKWRhdGEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK1RoZXJlIGFyZSB0d28gZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgdG8gZG8gcnVudGltZSBwYXRjaGluZyBvZiBhcmJpdHJhcnkKK2Z1bmN0aW9ucy4gIFRoZSBmaXJzdCBpcyB1c2VkIHRvIHR1cm4gdGhlIG1jb3VudCBjYWxsIHNpdGUgaW50byBhIG5vcCAod2hpY2gKK2lzIHdoYXQgaGVscHMgdXMgcmV0YWluIHJ1bnRpbWUgcGVyZm9ybWFuY2Ugd2hlbiBub3QgdHJhY2luZykuICBUaGUgc2Vjb25kIGlzCit1c2VkIHRvIHR1cm4gdGhlIG1jb3VudCBjYWxsIHNpdGUgaW50byBhIGNhbGwgdG8gYW4gYXJiaXRyYXJ5IGxvY2F0aW9uIChidXQKK3R5cGljYWxseSB0aGF0IGlzIGZ0cmFjZXJfY2FsbGVyKCkpLiAgU2VlIHRoZSBnZW5lcmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4KK2xpbnV4L2Z0cmFjZS5oIGZvciB0aGUgZnVuY3Rpb25zOgorCWZ0cmFjZV9tYWtlX25vcCgpCisJZnRyYWNlX21ha2VfY2FsbCgpCitUaGUgcmVjLT5pcCB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbWNvdW50IGNhbGwgc2l0ZSB0aGF0IHdhcyBjb2xsZWN0ZWQKK2J5IHRoZSBzY3JpcHRzL3JlY29yZG1jb3VudC5wbCBkdXJpbmcgYnVpbGQgdGltZS4KKworVGhlIGxhc3QgZnVuY3Rpb24gaXMgdXNlZCB0byBkbyBydW50aW1lIHBhdGNoaW5nIG9mIHRoZSBhY3RpdmUgdHJhY2VyLiAgVGhpcword2lsbCBiZSBtb2RpZnlpbmcgdGhlIGFzc2VtYmx5IGNvZGUgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmdHJhY2VfY2FsbCBzeW1ib2wKK2luc2lkZSBvZiB0aGUgZnRyYWNlX2NhbGxlcigpIGZ1bmN0aW9uLiAgU28geW91IHNob3VsZCBoYXZlIHN1ZmZpY2llbnQgcGFkZGluZworYXQgdGhhdCBsb2NhdGlvbiB0byBzdXBwb3J0IHRoZSBuZXcgZnVuY3Rpb24gY2FsbHMgeW91J2xsIGJlIGluc2VydGluZy4gIFNvbWUKK3Blb3BsZSB3aWxsIGJlIHVzaW5nIGEgImNhbGwiIHR5cGUgaW5zdHJ1Y3Rpb24gd2hpbGUgb3RoZXJzIHdpbGwgYmUgdXNpbmcgYQorImJyYW5jaCIgdHlwZSBpbnN0cnVjdGlvbi4gIFNwZWNpZmljYWxseSwgdGhlIGZ1bmN0aW9uIGlzOgorCWZ0cmFjZV91cGRhdGVfZnRyYWNlX2Z1bmMoKQorCisKK0hBVkVfRFlOQU1JQ19GVFJBQ0UgKyBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmdW5jdGlvbiBncmFwaGVyIG5lZWRzIGEgZmV3IHR3ZWFrcyBpbiBvcmRlciB0byB3b3JrIHdpdGggZHluYW1pYyBmdHJhY2UuCitCYXNpY2FsbHksIHlvdSB3aWxsIG5lZWQgdG86CisJLSB1cGRhdGU6CisJCS0gZnRyYWNlX2NhbGxlcigpCisJCS0gZnRyYWNlX2dyYXBoX2NhbGwoKQorCQktIGZ0cmFjZV9ncmFwaF9jYWxsZXIoKQorCS0gaW1wbGVtZW50OgorCQktIGZ0cmFjZV9lbmFibGVfZnRyYWNlX2dyYXBoX2NhbGxlcigpCisJCS0gZnRyYWNlX2Rpc2FibGVfZnRyYWNlX2dyYXBoX2NhbGxlcigpCiAKIDxkZXRhaWxzIHRvIGJlIGZpbGxlZD4KK1F1aWNrIG5vdGVzOgorCS0gYWRkIGEgbm9wIHN0dWIgYWZ0ZXIgdGhlIGZ0cmFjZV9jYWxsIGxvY2F0aW9uIG5hbWVkIGZ0cmFjZV9ncmFwaF9jYWxsOworCSAgc3R1YiBuZWVkcyB0byBiZSBsYXJnZSBlbm91Z2ggdG8gc3VwcG9ydCBhIGNhbGwgdG8gZnRyYWNlX2dyYXBoX2NhbGxlcigpCisJLSB1cGRhdGUgZnRyYWNlX2dyYXBoX2NhbGxlcigpIHRvIHdvcmsgd2l0aCBiZWluZyBjYWxsZWQgYnkgdGhlIG5ldworCSAgZnRyYWNlX2NhbGxlcigpIHNpbmNlIHNvbWUgc2VtYW50aWNzIG1heSBoYXZlIGNoYW5nZWQKKwktIGZ0cmFjZV9lbmFibGVfZnRyYWNlX2dyYXBoX2NhbGxlcigpIHdpbGwgcnVudGltZSBwYXRjaCB0aGUKKwkgIGZ0cmFjZV9ncmFwaF9jYWxsIGxvY2F0aW9uIHdpdGggYSBjYWxsIHRvIGZ0cmFjZV9ncmFwaF9jYWxsZXIoKQorCS0gZnRyYWNlX2Rpc2FibGVfZnRyYWNlX2dyYXBoX2NhbGxlcigpIHdpbGwgcnVudGltZSBwYXRjaCB0aGUKKwkgIGZ0cmFjZV9ncmFwaF9jYWxsIGxvY2F0aW9uIHdpdGggbm9wcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rbWVtdHJhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rbWVtdHJhY2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzA4NzM1Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2Uva21lbXRyYWNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0JCQlrbWVtdHJhY2UgLSBLZXJuZWwgTWVtb3J5IFRyYWNlcgotCi0JCQkgIGJ5IEVkdWFyZCAtIEdhYnJpZWwgTXVudGVhbnUKLQkJCSAgICAgPGVkdWFyZC5tdW50ZWFudUBsaW51eDM2MC5ybz4KLQotSS4gSW50cm9kdWN0aW9uCi09PT09PT09PT09PT09PT0KLQota21lbXRyYWNlIGhlbHBzIGtlcm5lbCBkZXZlbG9wZXJzIGZpZ3VyZSBvdXQgdHdvIHRoaW5nczoKLTEpIGhvdyBkaWZmZXJlbnQgYWxsb2NhdG9ycyAoU0xBQiwgU0xVQiBldGMuKSBwZXJmb3JtCi0yKSBob3cga2VybmVsIGNvZGUgYWxsb2NhdGVzIG1lbW9yeSBhbmQgaG93IG11Y2gKLQotVG8gZG8gdGhpcywgd2UgdHJhY2UgZXZlcnkgYWxsb2NhdGlvbiBhbmQgZXhwb3J0IGluZm9ybWF0aW9uIHRvIHRoZSB1c2Vyc3BhY2UKLXRocm91Z2ggdGhlIHJlbGF5IGludGVyZmFjZS4gV2UgZXhwb3J0IHRoaW5ncyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkCi1ieXRlcywgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBhbGxvY2F0ZWQgKGkuZS4gaW5jbHVkaW5nIGludGVybmFsCi1mcmFnbWVudGF0aW9uKSwgd2hldGhlciB0aGlzIGlzIGEgc2xhYiBhbGxvY2F0aW9uIG9yIGEgcGxhaW4ga21hbGxvYygpIGFuZCBzbwotb24uCi0KLVRoZSBhY3R1YWwgYW5hbHlzaXMgaXMgcGVyZm9ybWVkIGJ5IGEgdXNlcnNwYWNlIHRvb2wgKHNlZSBzZWN0aW9uIElJSSBmb3IKLWRldGFpbHMgb24gd2hlcmUgdG8gZ2V0IGl0IGZyb20pLiBJdCBsb2dzIHRoZSBkYXRhIGV4cG9ydGVkIGJ5IHRoZSBrZXJuZWwsCi1wcm9jZXNzZXMgaXQgYW5kIChhcyBvZiB3cml0aW5nIHRoaXMpIGNhbiBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci0tIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCBhbmQgZnJhZ21lbnRhdGlvbiBwZXIgY2FsbC1zaXRlCi0tIHRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCBhbmQgZnJhZ21lbnRhdGlvbiBwZXIgYWxsb2NhdGlvbgotLSB0b3RhbCBtZW1vcnkgYWxsb2NhdGVkIGFuZCBmcmFnbWVudGF0aW9uIGluIHRoZSBjb2xsZWN0ZWQgZGF0YXNldAotLSBudW1iZXIgb2YgY3Jvc3MtQ1BVIGFsbG9jYXRpb24gYW5kIGZyZWVzIChtYWtlcyBzZW5zZSBpbiBOVU1BIGVudmlyb25tZW50cykKLQotTW9yZW92ZXIsIGl0IGNhbiBwb3RlbnRpYWxseSBmaW5kIGluY29uc2lzdGVudCBhbmQgZXJyb25lb3VzIGJlaGF2aW9yIGluCi1rZXJuZWwgY29kZSwgc3VjaCBhcyB1c2luZyBzbGFiIGZyZWUgZnVuY3Rpb25zIG9uIGttYWxsb2MnZWQgbWVtb3J5IG9yCi1hbGxvY2F0aW5nIGxlc3MgbWVtb3J5IHRoYW4gcmVxdWVzdGVkIChidXQgbm90IHRydWx5IGZhaWxlZCBhbGxvY2F0aW9ucykuCi0KLWttZW10cmFjZSBhbHNvIG1ha2VzIHByb3Zpc2lvbnMgZm9yIHRyYWNpbmcgb24gc29tZSBhcmNoIGFuZCBhbmFseXNpbmcgdGhlCi1kYXRhIG9uIGFub3RoZXIuCi0KLUlJLiBEZXNpZ24gYW5kIGdvYWxzCi09PT09PT09PT09PT09PT09PT09PQotCi1rbWVtdHJhY2Ugd2FzIGRlc2lnbmVkIHRvIGhhbmRsZSByYXRoZXIgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLiBUaHVzLCBpdCB1c2VzCi10aGUgcmVsYXkgaW50ZXJmYWNlIHRvIGV4cG9ydCB3aGF0ZXZlciBpcyBsb2dnZWQgdG8gdXNlcnNwYWNlLCB3aGljaCB0aGVuCi1zdG9yZXMgaXQuIEFuYWx5c2lzIGFuZCByZXBvcnRpbmcgaXMgZG9uZSBhc3luY2hyb25vdXNseSwgdGhhdCBpcywgYWZ0ZXIgdGhlCi1kYXRhIGlzIGNvbGxlY3RlZCBhbmQgc3RvcmVkLiBCeSBkZXNpZ24sIGl0IGFsbG93cyBvbmUgdG8gbG9nIGFuZCBhbmFseXNlCi1vbiBkaWZmZXJlbnQgbWFjaGluZXMgYW5kIGRpZmZlcmVudCBhcmNoZXMuCi0KLUFzIG9mIHdyaXRpbmcgdGhpcywgdGhlIEFCSSBpcyBub3QgY29uc2lkZXJlZCBzdGFibGUsIHRob3VnaCBpdCBtaWdodCBub3QKLWNoYW5nZSBtdWNoLiBIb3dldmVyLCBubyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IGNvbXBhdGliaWxpdHkgeWV0LiBXaGVuCi1kZWVtZWQgc3RhYmxlLCB0aGUgQUJJIHNob3VsZCBzdGlsbCBhbGxvdyBlYXN5IGV4dGVuc2lvbiB3aGlsZSBtYWludGFpbmluZwotYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVGhpcyBpcyBkZXNjcmliZWQgZnVydGhlciBpbiBEb2N1bWVudGF0aW9uL0FCSS4KLQotU3VtbWFyeSBvZiBkZXNpZ24gZ29hbHM6Ci0JLSBhbGxvdyBsb2dnaW5nIGFuZCBhbmFseXNpcyB0byBiZSBkb25lIGFjcm9zcyBkaWZmZXJlbnQgbWFjaGluZXMKLQktIGJlIGZhc3QgYW5kIGFudGljaXBhdGUgdXNhZ2UgaW4gaGlnaC1sb2FkIGVudmlyb25tZW50cyAoKikKLQktIGJlIHJlYXNvbmFibHkgZXh0ZW5zaWJsZQotCS0gbWFrZSBpdCBwb3NzaWJsZSBmb3IgR05VL0xpbnV4IGRpc3RyaWJ1dGlvbnMgdG8gaGF2ZSBrbWVtdHJhY2UKLQlpbmNsdWRlZCBpbiB0aGVpciByZXBvc2l0b3JpZXMKLQotKCopIC0gb25lIG9mIHRoZSByZWFzb25zIFBla2thIEVuYmVyZydzIG9yaWdpbmFsIHVzZXJzcGFjZSBkYXRhIGFuYWx5c2lzCi0gICAgdG9vbCdzIGNvZGUgd2FzIHJld3JpdHRlbiBmcm9tIFBlcmwgdG8gQyAoYWx0aG91Z2ggdGhpcyBpcyBtb3JlIHRoYW4gYQotICAgIHNpbXBsZSBjb252ZXJzaW9uKQotCi0KLUlJSS4gUXVpY2sgdXNhZ2UgZ3VpZGUKLT09PT09PT09PT09PT09PT09PT09PT0KLQotMSkgR2V0IGEga2VybmVsIHRoYXQgc3VwcG9ydHMga21lbXRyYWNlIGFuZCBidWlsZCBpdCBhY2NvcmRpbmdseSAoaS5lLiBlbmFibGUKLUNPTkZJR19LTUVNVFJBQ0UpLgotCi0yKSBHZXQgdGhlIHVzZXJzcGFjZSB0b29sIGFuZCBidWlsZCBpdDoKLSQgZ2l0IGNsb25lIGdpdDovL3JlcG8ub3IuY3ova21lbXRyYWNlLXVzZXIuZ2l0CQkjIGN1cnJlbnQgcmVwb3NpdG9yeQotJCBjZCBrbWVtdHJhY2UtdXNlci8KLSQgLi9hdXRvZ2VuLnNoCi0kIC4vY29uZmlndXJlCi0kIG1ha2UKLQotMykgQm9vdCB0aGUga21lbXRyYWNlLWVuYWJsZWQga2VybmVsIGlmIHlvdSBoYXZlbid0LCBwcmVmZXJhYmx5IGluIHRoZQotJ3NpbmdsZScgcnVubGV2ZWwgKHNvIHRoYXQgcmVsYXkgYnVmZmVycyBkb24ndCBmaWxsIHVwIGVhc2lseSksIGFuZCBydW4KLWttZW10cmFjZToKLSMgJyQnIGRvZXMgbm90IG1lYW4gdXNlciwgYnV0IHJvb3QgaGVyZS4KLSQgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCi0kIG1vdW50IC10IHByb2Mgbm9uZSAvcHJvYwotJCBjZCBwYXRoL3RvL2ttZW10cmFjZS11c2VyLwotJCAuL2ttZW10cmFjZWQKLVdhaXQgYSBiaXQsIHRoZW4gc3RvcCBpdCB3aXRoIENUUkwrQy4KLSQgY2F0IC9zeXMva2VybmVsL2RlYnVnL2ttZW10cmFjZS90b3RhbF9vdmVycnVucwkjIENoZWNrIGlmIHdlIGRpZG4ndAotCQkJCQkJCSMgb3ZlcnJ1biwgc2hvdWxkCi0JCQkJCQkJIyBiZSB6ZXJvLgotJCAoT3B0aW9uYWxseSkgW1J1biBrbWVtdHJhY2VfY2hlY2sgc2VwYXJhdGVseSBvbiBlYWNoIGNwdVswLTldKi5vdXQgZmlsZSB0bwotCQljaGVjayBpdHMgY29ycmVjdG5lc3NdCi0kIC4va21lbXRyYWNlLXJlcG9ydAotCi1Ob3cgeW91IHNob3VsZCBoYXZlIGEgbmljZSBhbmQgc2hvcnQgc3VtbWFyeSBvZiBob3cgdGhlIGFsbG9jYXRvciBwZXJmb3Jtcy4KLQotSVYuIEZBUSBhbmQga25vd24gaXNzdWVzCi09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUTogJ2NhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtdHJhY2UvdG90YWxfb3ZlcnJ1bnMnIGlzIG5vbi16ZXJvLCBob3cgZG8gSSBmaXgKLXRoaXM/IFNob3VsZCBJIHdvcnJ5PwotQTogSWYgaXQncyBub24temVybywgdGhpcyBhZmZlY3RzIGttZW10cmFjZSdzIGFjY3VyYWN5LCBkZXBlbmRpbmcgb24gaG93Ci1sYXJnZSB0aGUgbnVtYmVyIGlzLiBZb3UgY2FuIGZpeCBpdCBieSBzdXBwbHlpbmcgYSBoaWdoZXIKLSdrbWVtdHJhY2Uuc3ViYnVmcz1OJyBrZXJuZWwgcGFyYW1ldGVyLgotLS0tCi0KLVE6IGttZW10cmFjZV9jaGVjayByZXBvcnRzIGVycm9ycywgaG93IGRvIEkgZml4IHRoaXM/IFNob3VsZCBJIHdvcnJ5PwotQTogVGhpcyBpcyBhIGJ1ZyBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkLiBJdCBjYW4gb2NjdXIgZm9yIGEgdmFyaWV0eSBvZgotcmVhc29uczoKLQktIHBvc3NpYmxlIGJ1Z3MgaW4gcmVsYXkgY29kZQotCS0gcG9zc2libGUgbWlzdXNlIG9mIHJlbGF5IGJ5IGttZW10cmFjZQotCS0gdGltZXN0YW1wcyBiZWluZyBjb2xsZWN0ZWQgdW5vcmRlcmx5Ci1PciB5b3UgbWF5IGZpeCBpdCB5b3Vyc2VsZiBhbmQgc2VuZCB1cyBhIHBhdGNoLgotLS0tCi0KLVE6IGttZW10cmFjZV9yZXBvcnQgc2hvd3MgbWFueSBlcnJvcnMsIGhvdyBkbyBJIGZpeCB0aGlzPyBTaG91bGQgSSB3b3JyeT8KLUE6IFRoaXMgaXMgYSBrbm93biBpc3N1ZSBhbmQgSSdtIHdvcmtpbmcgb24gaXQuIFRoZXNlIG1pZ2h0IGJlIHRydWUgZXJyb3JzCi1pbiBrZXJuZWwgY29kZSwgd2hpY2ggbWF5IGhhdmUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIChlLmcuIGFsbG9jYXRpbmcgbWVtb3J5Ci13aXRoIGttZW1fY2FjaGVfYWxsb2MoKSBhbmQgZnJlZWluZyBpdCB3aXRoIGtmcmVlKCkpLiBQZWtrYSBFbmJlcmcgcG9pbnRlZAotb3V0IHRoaXMgYmVoYXZpb3IgbWF5IHdvcmsgd2l0aCBTTEFCLCBidXQgbWF5IGZhaWwgd2l0aCBvdGhlciBhbGxvY2F0b3JzLgotCi1JdCBtYXkgYWxzbyBiZSBkdWUgdG8gbGFjayBvZiB0cmFjaW5nIGluIHNvbWUgdW51c3VhbCBhbGxvY2F0b3IgZnVuY3Rpb25zLgotCi1XZSBkb24ndCB3YW50IGJ1ZyByZXBvcnRzIHJlZ2FyZGluZyB0aGlzIGlzc3VlIHlldC4KLS0tLQotCi1WLiBTZWUgYWxzbwotPT09PT09PT09PT0KLQotRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKLURvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1rbWVtdHJhY2UKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dAppbmRleCBlYzk0NzQ4Li41Zjc3ZDk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dApAQCAtNDIsNyArNDIsNyBAQAogICArfC1vZmZzKEZFVENIQVJHKSA6IEZldGNoIG1lbW9yeSBhdCBGRVRDSEFSRyArfC0gb2ZmcyBhZGRyZXNzLigqKikKICAgTkFNRT1GRVRDSEFSRyA6IFNldCBOQU1FIGFzIHRoZSBhcmd1bWVudCBuYW1lIG9mIEZFVENIQVJHLgogICBGRVRDSEFSRzpUWVBFIDogU2V0IFRZUEUgYXMgdGhlIHR5cGUgb2YgRkVUQ0hBUkcuIEN1cnJlbnRseSwgYmFzaWMgdHlwZXMKLQkJICAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpIGFyZSBzdXBwb3J0ZWQuCisJCSAgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSBhbmQgc3RyaW5nIGFyZSBzdXBwb3J0ZWQuCiAKICAgKCopIG9ubHkgZm9yIHJldHVybiBwcm9iZS4KICAgKCoqKSB0aGlzIGlzIHVzZWZ1bCBmb3IgZmV0Y2hpbmcgYSBmaWVsZCBvZiBkYXRhIHN0cnVjdHVyZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CmluZGV4IDYyODAxM2YuLjliN2UxOTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CkBAIC04LDYyICs4LDYgQEAKIAogICBUYWJsZSBvZiBDb250ZW50cwogCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQogICAxLiBJbnRyb2R1Y3Rpb24KIAogICAgICAxLjEgSG93IGlzIFVzZXIgTW9kZSBMaW51eCBEaWZmZXJlbnQ/CkBAIC0yNzcsOCArMjIxLDcgQEAKIAogICAxLiBEb3dubG9hZCB0aGUgbGF0ZXN0IFVNTCBwYXRjaCBmcm9tCiAKLSAgICAgdGhlIGRvd25sb2FkIHBhZ2UgPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9yZ2UubmV0L2RsLQotICAgICBzZi5odG1sPgorICAgICB0aGUgZG93bmxvYWQgcGFnZSA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQvCiAKICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgZmlsZSBpcyB1bWwtcGF0Y2gtMi40LjAtcHJlcmVsZWFzZS5iejIuCiAKQEAgLTQzOCw3ICszODEsNyBAQAogICBhcyBtb2R1bGVzLCBlc3BlY2lhbGx5IGZpbGVzeXN0ZW1zIGFuZCBuZXR3b3JrIHByb3RvY29scyBhbmQgZmlsdGVycywKICAgc28gbW9zdCBzeW1ib2xzIHdoaWNoIG5lZWQgdG8gYmUgZXhwb3J0ZWQgcHJvYmFibHkgYWxyZWFkeSBhcmUuCiAgIEhvd2V2ZXIsIGlmIHlvdSBkbyBmaW5kIHN5bWJvbHMgdGhhdCBuZWVkIGV4cG9ydGluZywgbGV0ICB1cwotICA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQvY29udGFjdHMuaHRtbD4gIGtub3csIGFuZAorICA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQvPiAga25vdywgYW5kCiAgIHRoZXknbGwgYmUgInRha2VuIGNhcmUgb2YiLgogCiAKQEAgLTQ5OCw4ICs0NDEsOCBAQAogCiAgIFlvdSB3aWxsIG5lZWQgYSBmaWxlc3lzdGVtIHRvIGJvb3QgVU1MIGZyb20uICBUaGVyZSBhcmUgYSBudW1iZXIKICAgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tICBoZXJlICA8aHR0cDovL3VzZXItbW9kZS0KLSAgbGludXguc291cmNlZm9yZ2UubmV0L2RsLXNmLmh0bWw+IC4gIFRoZXJlIGFyZSBhbHNvICBzZXZlcmFsIHRvb2xzCi0gIDxodHRwOi8vdXNlci1tb2RlLWxpbnV4LnNvdXJjZWZvcmdlLm5ldC9mc19tYWtpbmcuaHRtbD4gIHdoaWNoIGNhbiBiZQorICBsaW51eC5zb3VyY2Vmb3JnZS5uZXQvPiAuICBUaGVyZSBhcmUgYWxzbyAgc2V2ZXJhbCB0b29scworICA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQvPiAgd2hpY2ggY2FuIGJlCiAgIHVzZWQgdG8gZ2VuZXJhdGUgVU1MLWNvbXBhdGlibGUgZmlsZXN5c3RlbSBpbWFnZXMgZnJvbSBtZWRpYS4KICAgVGhlIGtlcm5lbCB3aWxsIGJvb3QgdXAgYW5kIHByZXNlbnQgeW91IHdpdGggYSBsb2dpbiBwcm9tcHQuCiAKQEAgLTEyMzYsNyArMTE3OSw3IEBACiAKIAogICBIYXJhbGQncyBvcmlnaW5hbCBSRUFETUUgaXMgaGVyZSA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2UtCi0gIGZvcmdlLm5ldC90ZXh0L21jYXN0LnR4dD4gIGFuZCBleHBsYWlucyB0aGVzZSBpbiBkZXRhaWwsIGFzIHdlbGwgYXMKKyAgZm9yZ2UubmV0Lz4gIGFuZCBleHBsYWlucyB0aGVzZSBpbiBkZXRhaWwsIGFzIHdlbGwgYXMKICAgc29tZSBvdGhlciBpc3N1ZXMuCiAKIApAQCAtMTMxMSw3ICsxMjU0LDcgQEAKICAga2VybmVsLgogCiAgIFRoZXNlIHdlcmUgcG9pbnRlZCBvdXQgYnkgVGltIFJvYmluc29uIDx0aW1ybyBhdCB0cmtyIGRvdCBuZXQ+IGluCi0gIDxodHRwOi8vd3d3Lmdlb2NyYXdsZXIuY29tL2xpc3RzLzMvU291cmNlRm9yZ2UvNTk3LzAvPiBuYW1lPSJ0aGlzIHVtbC0KKyAgPGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vPiBuYW1lPSJ0aGlzIHVtbC0KICAgdXNlciBwb3N0Ij4gLgogCiAKQEAgLTIwMzgsNyArMTk4MSw3IEBACiAKICAgdW1sX21vbyBpcyBpbnN0YWxsZWQgd2l0aCB0aGUgVU1MIGRlYiBhbmQgUlBNLiAgSWYgeW91IGRpZG4ndCBpbnN0YWxsCiAgIFVNTCBmcm9tIG9uZSBvZiB0aG9zZSBwYWNrYWdlcywgeW91IGNhbiBhbHNvIGdldCBpdCBmcm9tIHRoZSBVTUwKLSAgdXRpbGl0aWVzIDxodHRwOi8vdXNlci1tb2RlLWxpbnV4LnNvdXJjZWZvcmdlLm5ldC9kbC1zZi5odG1sI1VNTAorICB1dGlsaXRpZXMgPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9yZ2UubmV0LwogICB1dGlsaXRpZXM+ICB0YXIgZmlsZSBpbiB0b29scy9tb28uCiAKIApAQCAtNDU5OSw3ICs0NTQyLDcgQEAKIAogICBNaWNoYWVsIEplbm5pbmdzIDxtaWtlamVuIGF0IGhldmFuZXQuY29tPiAgc2VudCBpbiBzb21lIG1hdGVyaWFsIHdoaWNoCiAgIGlzIG5vdyBncmFjaW5nIHRoZSB0b3Agb2YgdGhlICBpbmRleCAgcGFnZSA8aHR0cDovL3VzZXItbW9kZS0KLSAgbGludXguc291cmNlZm9yZ2UubmV0L2luZGV4Lmh0bWw+ICBvZiB0aGlzIHNpdGUuCisgIGxpbnV4LnNvdXJjZWZvcmdlLm5ldC8+ICBvZiB0aGlzIHNpdGUuCiAKICAgU0dJIDxodHRwOi8vd3d3LnNnaS5jb20+ICAoYW5kIG1vcmUgc3BlY2lmaWNhbGx5IFJhbGYgQmFlY2hsZSA8cmFsZiBhdAogICB1bmkta29ibGVuei5kZT4gKSBnYXZlIG1lIGFuIGFjY291bnQgb24gb3NzLnNnaS5jb20KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2xpbnV4LmluZiBiL0RvY3VtZW50YXRpb24vdXNiL2xpbnV4LmluZgppbmRleCAyZjcyMTdkLi5hZjcxZDg3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9saW51eC5pbmYKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvbGludXguaW5mCkBAIC05LDcgKzksNyBAQAogOwogOyBNaWNyb3NvZnQgb25seSBkaXJlY3RseSBzdXBwb3J0cyBSTkRJUyBkcml2ZXJzLCBhbmQgYnVuZGxlZCB0aGVtIGludG8gWFAuCiA7IFRoZSBNaWNyb3NvZnQgIlJlbW90ZSBORElTIFVTQiBEcml2ZXIgS2l0IiBpcyBjdXJyZW50bHkgZm91bmQgYXQ6Ci07ICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvaHdkZXYvcmVzb3VyY2VzL0hXc2VydmljZXMvcm5kaXMubXNweAorOyAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2RldmljZS9uZXR3b3JrL25kaXMvcm1uZGlzLm1zcHgKIAogCiBbVmVyc2lvbl0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL210b3VjaHVzYi50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9tdG91Y2h1c2IudHh0CmluZGV4IGU0M2NmZmYuLjg2MzAyY2QgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL210b3VjaHVzYi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvbXRvdWNodXNiLnR4dApAQCAtNTQsMTAgKzU0LDYgQEAKIHJlcXVlc3RlZCBmcm9tIHRoZSB1c2Vyc3BhY2UgKEFuZCB0aGUgZHJpdmVycyB3b3VsZCBoYW5kbGUgdGhlIHZlbmRvciBzcGVjaWZpYwogdGFza3MpLgogCi1BRERJVElPTkFMIElORk9STUFUSU9OL1VQREFURVMvWCBDT05GSUdVUkFUSU9OIEVYQU1QTEU6Ci0KLWh0dHA6Ly9ncm9vbWxha2VsYWJzLmNvbS9ncmFuZGFtcC9jb2RlL21pY3JvdG91Y2gvCi0KIFRPRE86CiAKIEltcGxlbWVudCBhIGNvbnRyb2wgdXJiIGFnYWluIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBhbmQgZnJvbSB0aGUgZGV2aWNlCkBAIC02OCw3ICs2NCw3IEBACiBJIGFtIG5vdCBhIE1pY3JvVG91Y2gvM00gZW1wbG95ZWUsIG5vciBoYXZlIEkgZXZlciBiZWVuLiAgM00gZG9lcyBub3Qgc3VwcG9ydCAKIHRoaXMgZHJpdmVyISAgSWYgeW91IHdhbnQgdG91Y2ggZHJpdmVycyBvbmx5IHN1cHBvcnRlZCB3aXRoaW4gWCwgcGxlYXNlIGdvIHRvOgogCi1odHRwOi8vd3d3LjNtLmNvbS8zTVRvdWNoU3lzdGVtcy9kb3dubG9hZHMvCitodHRwOi8vd3d3LjNtLmNvbS8zTVRvdWNoU3lzdGVtcy8KIAogVEhBTktTOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CmluZGV4IGY0ZDIxNDUuLjViZDc5MjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CkBAIC04Myw3ICs4Myw3IEBACiAgIHBhcmFtZXRlcnMuICBlLmcuIG1vZHByb2JlIHZpc29yIHZlbmRvcj0weDU0YyBwcm9kdWN0PTB4NjYKICAgCiAgIFRoZXJlIGlzIGEgd2VicGFnZSBhbmQgbWFpbGluZyBsaXN0cyBmb3IgdGhpcyBwb3J0aW9uIG9mIHRoZSBkcml2ZXIgYXQ6Ci0gIGh0dHA6Ly91c2J2aXNvci5zb3VyY2Vmb3JnZS5uZXQvCisgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdXNidmlzb3IvCiAKICAgRm9yIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMgd2l0aCB0aGlzIGRyaXZlciwgcGxlYXNlIGNvbnRhY3QgR3JlZwogICBLcm9haC1IYXJ0bWFuIGF0IGdyZWdAa3JvYWguY29tCkBAIC0xODQsNyArMTg0LDcgQEAKICAgICBmdW5jdGlvbmFsaXR5LgogICAKICAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6Ci0gICAgICAgIGh0dHA6Ly9taXNjLm51L2h1Z2gva2V5c3Bhbi5odG1sCisgICAgICAgIGh0dHA6Ly93d3cuY2FybmF0aW9uc29mdHdhcmUuY29tL2Nhcm5hdGlvbi9LZXlzcGFuLmh0bWwKICAgIAogICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMgZHJpdmVyLCBwbGVhc2UgY29udGFjdCBIdWdoCiAgIEJsZW1pbmdzIGF0IGh1Z2hAbWlzYy5udQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKaW5kZXggZDc0OWQ0MS4uZDcyZmQyYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgICA8L3RyPgogICAgPHRyPgogICAgIDx0ZD4KLSAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZHMvdmlkZW80bGludXgvQVBJL1Y0TDJfQVBJIj5WNEwyIEFQSTwvYT4KKyAgICAgPGEgaHJlZj0iaHR0cDovL3Y0bDJzcGVjLmJ5dGVzZXgub3JnL3NwZWMtc2luZ2xlL3Y0bDIuaHRtbCI+VjRMMiBBUEk8L2E+CiAgICAgPC90ZD4KICAgICA8dGQ+U2hvdWxkIGJlIHVzZWQgZm9yIG5ldyBwcm9qZWN0cwogICAgIDwvdGQ+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKaW5kZXggMTZjYTAzMC4uODdjNDYzNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQpAQCAtMTcsOSArMTcsOSBAQAogIDE2IC0+IERWQldvcmxkIERWQi1TMiAyMDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDAwMToyMDA1XQogIDE3IC0+IE5ldFVQIER1YWwgRFZCLVMyIENJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMWI1NToyYTJjXQogIDE4IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDoyMjExXQotIDE5IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDoyMjE1XQotIDIwIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDoyMjUxXQotIDIxIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDoyMjkxLDAwNzA6MjI5NV0KKyAxOSAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTI3NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6MjIxNSwwMDcwOjIyMWQsMDA3MDoyMmYyXQorIDIwIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDoyMjUxLDAwNzA6MjI1OSwwMDcwOjIyZjFdCisgMjEgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjEyMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswMDcwOjIyOTEsMDA3MDoyMjk1LDAwNzA6MjI5OSwwMDcwOjIyOWQsMDA3MDoyMmYwLDAwNzA6MjJmMywwMDcwOjIyZjQsMDA3MDoyMmY1XQogIDIyIC0+IE15Z2ljYSBYODUwNiBETUItVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTo4NjUxXQogIDIzIC0+IE1hZ2ljLVBybyBQcm9IRFRWIEV4dHJlbWUgMiAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTo4NjU3XQogIDI0IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxODUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo4NTQxXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAppbmRleCAzYTYyM2FhLi41YzU2ODc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eApAQCAtNzIsMyArNzIsNCBAQAogIDczIC0+IFJlZGRvIERWQi1DIFVTQiBUViBCb3ggICAgICAgICAgICAgICAgICAgKGVtMjg3MCkKICA3NCAtPiBBY3Rpb25tYXN0ZXIvTGluWGNlbC9EaWdpdHVzIFZDMjExQSAgICAgIChlbTI4MDApCiAgNzUgLT4gRGlrb20gREszMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW0yODgyKQorIDc2IC0+IEtXb3JsZCBQbHVzVFYgMzQwVSBvciBVQjQzNS1RIChBVFNDKSAgICAgKGVtMjg3MCkgICAgICAgIFsxYjgwOmEzNDBdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKaW5kZXggMTM4N2E2OS4uNDAwMGMyOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNApAQCAtMTc4LDQgKzE3OCw1IEBACiAxNzcgLT4gSGF3ZWxsIEhXLTQwNE03CiAxNzggLT4gQmVob2xkZXIgQmVob2xkVFYgSDcgICAgICAgICAgICAgICAgICAgICBbNWFjZTo3MTkwXQogMTc5IC0+IEJlaG9sZGVyIEJlaG9sZFRWIEE3ICAgICAgICAgICAgICAgICAgICAgWzVhY2U6NzA5MF0KLTE4MCAtPiBBdmVybWVkaWEgTTczM0EgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNDYxOjQxNTUsMTQ2MTo0MjU1XQorMTgwIC0+IEF2ZXJtZWRpYSBQQ0kgTTczM0EgICAgICAgICAgICAgICAgICAgICAgWzE0NjE6NDE1NSwxNDYxOjQyNTVdCisxODEgLT4gVGVjaG9UcmVuZCBUVC1idWRnZXQgVC0zMDAwICAgICAgICAgICAgICBbMTNjMjoyODA0XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NRY2FtLnR4dAppbmRleCBkMjMwODc4ZS4uODk3N2U3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQKQEAgLTIwMywxMSArMjAzLDExIEBACiAgIGh0dHA6Ly92NGwyc3BlYy5ieXRlc2V4Lm9yZy8KIAogU29tZSB3ZWIgcGFnZXMgYWJvdXQgdGhlIHF1aWNrY2FtczoKLSAgIGh0dHA6Ly93d3cuZGtmei1oZWlkZWxiZXJnLmRlL01hY3JvbW9sL3dlZGVtYW5uL21pbmktSE9XVE8tY3FjYW0uaHRtbAorICAgaHR0cDovL3d3dy5waW5nb3Vpbi1sYW5kLmNvbS9ob3d0by9RdWlja0NhbS1IT1dUTy5odG1sCiAKICAgIGh0dHA6Ly93d3cuY3J5bndyLmNvbS9xY3BjLyAgICAgICAgICAgIFF1aWNrQ2FtIFRoaXJkLVBhcnR5IERyaXZlcnMKICAgIGh0dHA6Ly93d3cuY3J5bndyLmNvbS9xY3BjL3JlLmh0bWwgICAgIFNvbWUgUmV2ZXJzZSBFbmdpbmVlcmluZwotICAgaHR0cDovL2NzZS51bmwuZWR1L35jbHVlbmluZy9ncWNhbS8gICAgdjRsIGNsaWVudAorICAgaHR0cDovL3d3dy53aXJlbGVzc2NvdWNoLm5ldC9zb2Z0d2FyZS9ncWNhbS8gICB2NGwgY2xpZW50CiAgICBodHRwOi8vcGhvYm9zLmlsbHRlbC5kZW52ZXIuY28udXMvcHViL3FjcmVhZC8gZG9lc24ndCB1c2UgdjRsCiAgICBmdHA6Ly9mdHAuY3MudW5tLmVkdS9wdWIvY2hyaXMvcXVpY2tjYW0vICAgSGFzIGxvdHMgb2YgZHJpdmVycwogICAgaHR0cDovL3d3dy5jcy5kdWtlLmVkdS9+cmV5bm9sZHMvcXVpY2tjYW0vIEhhcyBsb3RzIG9mIGluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5jcGlhIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuY3BpYQppbmRleCAxOWNkM2JmLi44YTc0N2ZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5jcGlhCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLmNwaWEKQEAgLTE4NSw3ICsxODUsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBSRUZFUkVOQ0VTCiAKLSAgIDEuIGh0dHA6Ly93d3cucmlzYy51bmktbGluei5hYy5hdC9wZW9wbGUvcHByZWdsZXIKKyAgIDEuIGh0dHA6Ly93d3cucmlzYy51bmktbGluei5hYy5hdC8KICAgICAgIG1haWx0bzpQZXRlcl9QcmVnbGVyQGVtYWlsLmNvbQogICAgMi4gc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcCBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCB0cmVlCiAgICAzLiBodHRwOi8vd2ViY2FtLnNvdXJjZWZvcmdlLm5ldC8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLml2dHYgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5pdnR2CmluZGV4IDczZGYyMmMuLjQyYjA2NjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLml2dHYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuaXZ0dgpAQCAtMTAsNyArMTAsNyBAQAogTk9URTogdGhpcyBkcml2ZXIgcmVxdWlyZXMgdGhlIGxhdGVzdCBlbmNvZGVyIGZpcm13YXJlICh2ZXJzaW9uIDIuMDYuMDM5LCBzaXplCiAzNzY4MzYgYnl0ZXMpLiBHZXQgdGhlIGZpcm13YXJlIGZyb20gaGVyZToKIAotaHR0cDovL2RsLml2dHZkcml2ZXIub3JnL2l2dHYvZmlybXdhcmUvZmlybXdhcmUudGFyLmd6CitodHRwOi8vZGwuaXZ0dmRyaXZlci5vcmcvaXZ0di9maXJtd2FyZS8KIAogTk9URTogJ25vcm1hbCcgVFYgYXBwbGljYXRpb25zIGRvIG5vdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIsIHlvdSBuZWVkCiBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbiBoYW5kbGUgTVBFRyBpbnB1dCBzdWNoIGFzIG1wbGF5ZXIsIHhpbmUsIE15dGhUViwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4gYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuCmluZGV4IDBlODllNzYuLjAwZTNmOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4KKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbgpAQCAtMTc0LDcgKzE3NCw3IEBACiBXZSBkbyBub3QgdGFsayBhYm91dCBob3cgdGhlIGF1ZGlvIGlzIGJyb2FkY2FzdCAhCiAKIEEgcmF0aGVyIGdvb2Qgc2l0ZXMgYWJvdXQgdGhlIFRWIHN0YW5kYXJkcyBhcmU6Ci1odHRwOi8vd3d3LnNvbnkuanAvU2VydmljZUFyZWEvVm9sdGFnZV9tYXAvCitodHRwOi8vd3d3LnNvbnkuanAvc3VwcG9ydC8KIGh0dHA6Ly9pbmZvLmVsZWN0cm9uaWN3ZXJrc3RhdHQuZGUvYmVyZWljaGUvZmVybnNlaHRlY2huaWsvZnJlcXVlbnplbl91bmRfbm9ybWVuL0Zlcm5zZWhub3JtZW4vCiBhbmQgaHR0cDovL3d3dy5jYWJsLmNvbS9yZXN0YXVyYW50L2NoYW5uZWwuaHRtbAogCkBAIC0zMzAsNyArMzMwLDcgQEAKIGRldGFpbHMgKHN0cnVjdHMvaW9jdGxzKS4KIAogSW5mb3JtYXRpb24gLSB2aWRlbzRsaW51eDoKLWh0dHA6Ly9yb2FkcnVubmVyLnN3YW5zZWEubGludXgub3JnLnVrL3Y0bGFwaS5zaHRtbAoraHR0cDovL2xpbnV4LmJ5dGVzZXgub3JnL3Y0bDIvQVBJLmh0bWwKIERvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKIC91c3IvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oCiAKQEAgLTM5MCw3ICszOTAsNyBAQAogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIGlucHV0IGxpbmVzICh2aWRlbyBzb3VyY2UgY29ubmVjdGVkL25vcm0pLgogCiBGb3IgcHJvZ3JhbW1pbmcgZXhhbXBsZSwgcGxlYXNlLCBsb29rIGF0IGxhdnJlYy5jIGFuZCBsYXZwbGF5LmMgY29kZSBpbgotbGF2dG9vbHMtMS4ycDIgcGFja2FnZSAoVVJMOiBodHRwOi8vd3d3LmNpY2VzZS5teC9+bWlyc2V2L0RDMTBwbHVzLykKK2xhdnRvb2xzLTEuMnAyIHBhY2thZ2UgKFVSTDogaHR0cDovL3d3dy5jaWNlc2UubXgvKQogYW5kIHRoZSAnZXhhbXBsZXMnIGRpcmVjdG9yeSBpbiB0aGUgb3JpZ2luYWwgQnV6IGRyaXZlciBkaXN0cmlidXRpb24uCiAKIEFkZGl0aW9uYWwgbm90ZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BlcnM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ2FyZHMgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ2FyZHMKaW5kZXggZDMzODk2NS4uMTIyMTdmYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NhcmRzCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DYXJkcwpAQCAtODAyLDcgKzgwMiw3IEBACiAKIAogCi1KVFQvIEp1c3R5IENvcnAuaHR0cDovL3d3dy5qdXN0eS5jby5qcC8gKHd3dy5qdHQuY29tLmpwIHdlYnNpdGUgZG93bikKK0pUVC8gSnVzdHkgQ29ycC4oaHR0cDovL3d3dy5qdHQubmUuanAvKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBKVFQtMDIgKEpUVCBUVikgIlRWIHdhdGNobWF0ZSBwcm8iIChidDg0OCkKIApAQCAtODI4LDcgKzgyOCw3IEBACiAgICBFbGluZSBWaXNpb24gVFZNYXN0ZXIgLyBUVk1hc3RlciBGTSAoRUxWLVRWTS8gRUxWLVRWTS1GTSkgPSBMUjI2ICAoYnQ4NzgpCiAgICBFbGluZSBWaXNpb24gVFZNYXN0ZXItMjAwMCAoRUxWLVRWTS0yMDAwLCBFTFYtVFZNLTIwMDAtRk0pPSBMUjEzOCAoc2FhNzEzeCkKIAotU3Bpcml0IGh0dHA6Ly93d3cuc3Bpcml0bW9kZW1zLmNvbS5hdS8KK1NwaXJpdCAKIC0tLS0tLQogICAgU3Bpcml0IFRWIFR1bmVyL1ZpZGVvIENhcHR1cmUgQ2FyZCAoYnQ4NDgpCiAKQEAgLTk1OSw2ICs5NTksNiBAQAogCiBIb29udGVjaAogLS0tLS0tLS0KLWh0dHA6Ly93d3cuaG9vbnRlY2guY29tL2tvcmVhbi9kb3dubG9hZC9kb3duX2RyaXZlcl9saXN0MDMuaHRtbAoraHR0cDovL3d3dy5ob29udGVjaC5kZS8KICAgIEhBUlQgVmlzaW9uIDg0OCAoSC1BUlQgVmlzaW9uIDg0OCkKICAgIEhBUlQgVmlzaW9uIDg3OCAoSC1BcnQgVmlzaW9uIDg3OCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9NQUtFREVWIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L01BS0VERVYKaW5kZXggNmMyOWJhNC4uOWQxMTJmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L01BS0VERVYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L01BS0VERVYKQEAgLTE0LDcgKzE0LDcgQEAKIAlsbiAtcyAvZGV2LyR7MX0wIC9kZXYvJDEKIH0KIAotIyBzZWUgaHR0cDovL3JvYWRydW5uZXIuc3dhbnNlYS51ay5saW51eC5vcmcvdjRsYXBpLnNodG1sCisjIHNlZSBodHRwOi8vbGludXguYnl0ZXNleC5vcmcvdjRsMi9BUEkuaHRtbAogCiBlY2hvICIqKiogbmV3IGRldmljZSBuYW1lcyAqKioiCiBtYWtlZGV2IHZpZGVvIDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9TcGVjcyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9TcGVjcwppbmRleCA3OWI5ZTU3Li5mMzI0NjZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvU3BlY3MKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L1NwZWNzCkBAIC0xLDMgKzEsMyBAQAogUGhpbGlwcwkJaHR0cDovL3d3dy5TZW1pY29uZHVjdG9ycy5DT00vcGlwLwotQ29uZXhhbnQJaHR0cDovL3d3dy5jb25leGFudC5jb20vdGVjaGluZm8vZGVmYXVsdC5hc3AKLU1pY3JvbmFzCWh0dHA6Ly93d3cubWljcm9uYXMuZGUvcGFnZXMvcHJvZHVjdF9kb2N1bWVudGF0aW9uL2luZGV4Lmh0bWwKK0NvbmV4YW50CWh0dHA6Ly93d3cuY29uZXhhbnQuY29tLworTWljcm9uYXMJaHR0cDovL3d3dy5taWNyb25hcy5jb20vZW4vaG9tZS9pbmRleC5odG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4ODgvaGF1cHBhdWdlLXdpbnR2LWN4ODgtaXIudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDg4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dAppbmRleCBmYWNjZWU2Li5mNDMyOWEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4ODgvaGF1cHBhdWdlLXdpbnR2LWN4ODgtaXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3g4OC9oYXVwcGF1Z2Utd2ludHYtY3g4OC1pci50eHQKQEAgLTQ0LDcgKzQ0LDcgQEAKIFRoaXMgZGF0YSBzaGVldCAoZ29vZ2xlIHNlYXJjaCkgc2VlbXMgdG8gaGF2ZSBhIGxvdmVseSBkZXNjcmlwdGlvbiBvZiB0aGUKIFJDNSBiYXNpY3MKIAotaHR0cDovL3VzZXJzLnBhbmRvcmEuYmUvbmVueWEvZWxlY3Ryb25pY3MvcmM1LyAgYW5kIG1vcmUgZGF0YQoraHR0cDovL3d3dy5uZW55YS5iZS9iZW9yL2VsZWN0cm9uaWNzL3JjNS5odG0gIGFuZCBtb3JlIGRhdGEKIAogaHR0cDovL3d3dy5lZS53YXNoaW5ndG9uLmVkdS9jaXJjdWl0X2FyY2hpdmUvdGV4dC9pcl9kZWNvZGUudHh0CiBhbmQgZXZlbiBhIHJlZmVyZW5jZSB0byBob3cgdG8gZGVjb2RlIGEgYmktcGhhc2UgZGF0YSBzdHJlYW0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZ3NwY2EudHh0CmluZGV4IGYxM2ViMDMuLjU2YmE3YmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZ3NwY2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZ3NwY2EudHh0CkBAIC0yOSw4ICsyOSwxMiBAQAogemMzeHgJCTA0MWU6NDAzNAlDcmVhdGl2ZSBJbnN0YW50IFAwNjIwCiB6YzN4eAkJMDQxZTo0MDM1CUNyZWF0aXZlIEluc3RhbnQgUDA2MjBECiB6YzN4eAkJMDQxZTo0MDM2CUNyZWF0aXZlIExpdmUgIQorc3E5MzB4CQkwNDFlOjQwMzgJQ3JlYXRpdmUgSm95LUlUCiB6YzN4eAkJMDQxZTo0MDNhCUNyZWF0aXZlIE54IFBybyAyCiBzcGNhNTYxCQkwNDFlOjQwM2IJQ3JlYXRpdmUgV2ViY2FtIFZpc3RhIChWRjAwMTApCitzcTkzMHgJCTA0MWU6NDAzYwlDcmVhdGl2ZSBMaXZlISBVbHRyYQorc3E5MzB4CQkwNDFlOjQwM2QJQ3JlYXRpdmUgTGl2ZSEgVWx0cmEgZm9yIE5vdGVib29rcworc3E5MzB4CQkwNDFlOjQwNDEJQ3JlYXRpdmUgTGl2ZSEgTW90aW9uCiB6YzN4eAkJMDQxZTo0MDUxCUNyZWF0aXZlIExpdmUhQ2FtIE5vdGVib29rIFBybyAoVkYwMjUwKQogb3Y1MTkJCTA0MWU6NDA1MglDcmVhdGl2ZSBMaXZlISBWSVNUQSBJTQogemMzeHgJCTA0MWU6NDA1MwlDcmVhdGl2ZSBMaXZlIUNhbSBWaWRlbyBJTQpAQCAtMTM4LDYgKzE0Miw3IEBACiBmaW5lcGl4CQkwNGNiOjAxM2YJRnVqaWZpbG0gRmluZVBpeCBGNDIwCiBzdW5wbHVzCQkwNGYxOjEwMDEJSlZDIEdDIEE1MAogc3BjYTU2MQkJMDRmYzowNTYxCUZsZXhjYW0gMTAwCitzcGNhMTUyOAkwNGZjOjE1MjgJU3VucGx1cyBNRDgwIGNsb25lCiBzdW5wbHVzCQkwNGZjOjUwMGMJU3VucGx1cyBDQTUwMEMKIHN1bnBsdXMJCTA0ZmM6NTA0YQlBaXB0ZWsgTWluaSBQZW5DYW0gMS4zCiBzdW5wbHVzCQkwNGZjOjUwNGIJTWF4ZWxsIE1heFBvY2tldCBMRSAxLjMKQEAgLTI1Myw2ICsyNTgsNyBAQAogcGFjNzMwMgkJMDkzYToyNjIxCVBBQzczMXgKIHBhYzczMDIJCTA5M2E6MjYyMglHZW5pdXMgRXllIDMxMgogcGFjNzMwMgkJMDkzYToyNjI0CVBBQzczMDIKK3BhYzczMDIJCTA5M2E6MjYyNQlHZW5pdXMgaVNsaW0gMzEwCiBwYWM3MzAyCQkwOTNhOjI2MjYJTGFidGVjIDIyMDAKIHBhYzczMDIJCTA5M2E6MjYyOAlHZW5pdXMgaUxvb2sgMzAwCiBwYWM3MzAyCQkwOTNhOjI2MjkJR2VuaW91cyBpU2xpbSAzMDAKQEAgLTM2Miw2ICszNjgsOCBAQAogc3E5MDVjCQkyNzcwOjkwNWMJQWxsIDExIGtub3duIGNhbWVyYXMgd2l0aCB0aGlzIElECiBzcTkwNQkJMjc3MDo5MTIwCUFsbCAyNCBrbm93biBjYW1lcmFzIHdpdGggdGhpcyBJRAogc3E5MDVjCQkyNzcwOjkxM2QJQWxsIDQga25vd24gY2FtZXJhcyB3aXRoIHRoaXMgSUQKK3NxOTMweAkJMjc3MDo5MzBiCVN3ZWV4IE1vdGlvbiBUcmFja2luZyAvIEktVGVjIGlDYW0gVHJhY2VyCitzcTkzMHgJCTI3NzA6OTMwYwlUcnVzdCBXQi0zNTAwVCAvIE5TRyBSb2JiaWUgMi4wCiBzcGNhNTAwCQkyODk5OjAxMmMJVG9wdHJvIEluZHVzdHJpYWwKIG92NTE5CQk4MDIwOmVmMDQJb3Y1MTkKIHNwY2E1MDgJCTgwODY6MDExMAlJbnRlbCBFYXN5IFBDIENhbWVyYQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9oYXVwcGF1Z2Utd2ludHYtY3g4OC1pci50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dAppbmRleCBmYWNjZWU2Li5hMmZkMzYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dApAQCAtNDQsNyArNDQsNyBAQAogVGhpcyBkYXRhIHNoZWV0IChnb29nbGUgc2VhcmNoKSBzZWVtcyB0byBoYXZlIGEgbG92ZWx5IGRlc2NyaXB0aW9uIG9mIHRoZQogUkM1IGJhc2ljcwogCi1odHRwOi8vdXNlcnMucGFuZG9yYS5iZS9uZW55YS9lbGVjdHJvbmljcy9yYzUvICBhbmQgbW9yZSBkYXRhCitodHRwOi8vd3d3Lm5lbnlhLmJlL2Jlb3IvZWxlY3Ryb25pY3MvcmM1Lmh0bSBhbmQgbW9yZSBkYXRhCiAKIGh0dHA6Ly93d3cuZWUud2FzaGluZ3Rvbi5lZHUvY2lyY3VpdF9hcmNoaXZlL3RleHQvaXJfZGVjb2RlLnR4dAogYW5kIGV2ZW4gYSByZWZlcmVuY2UgdG8gaG93IHRvIGRlY29kZSBhIGJpLXBoYXNlIGRhdGEgc3RyZWFtLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9pYm1jYW0udHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9pYm1jYW0udHh0CmluZGV4IDM5N2E5NGUuLmE1MTA1NTIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2libWNhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9pYm1jYW0udHh0CkBAIC0yNyw5ICsyNyw4IEBACiAKIFhpcmxpbmsgIkMtSXQiIGNhbWVyYSwgYWxzbyBrbm93biBhcyAiSUJNIFBDIENhbWVyYSIuCiBUaGUgZGV2aWNlIHVzZXMgcHJvcHJpZXRhcnkgQVNJQyAoYW5kIGNvbXByZXNzaW9uIG1ldGhvZCk7Ci1pdCBpcyBtYW51ZmFjdHVyZWQgYnkgWGlybGluay4gU2VlIGh0dHA6Ly93d3cueGlybGluay5jb20vCi0ocmVuYW1lZCB0byBodHRwOi8vd3d3LnZlby5jb20pLCBodHRwOi8vd3d3LmlibXBjY2FtZXJhLmNvbSwKLW9yIGh0dHA6Ly93d3cuYy1pdG5vdy5jb20vIGZvciBkZXRhaWxzIGFuZCBwaWN0dXJlcy4KK2l0IGlzIG1hbnVmYWN0dXJlZCBieSBYaXJsaW5rLiBTZWUgaHR0cDovL3hpcmxpbmt3ZWJjYW0uc291cmNlZm9yZ2UubmV0LCAKK2h0dHA6Ly93d3cuaWJtcGNjYW1lcmEuY29tLCBvciBodHRwOi8vd3d3LmMtaXRub3cuY29tLyBmb3IgZGV0YWlscyBhbmQgcGljdHVyZXMuCiAKIFRoaXMgdmVyeSBjaGlwc2V0ICgiWCBDaGlwIiwgYXMgbWFya2VkIGF0IHRoZSBmYWN0b3J5KQogaXMgdXNlZCBpbiBzZXZlcmFsIG90aGVyIGNhbWVyYXMsIGFuZCB0aGV5IGFyZSBzdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc2U0MDEudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zZTQwMS50eHQKaW5kZXggN2I5ZDFjOS4uYmQ2NTI2ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zZTQwMS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zZTQwMS50eHQKQEAgLTQ5LDYgKzQ5LDYgQEAKIEhFTFA6CiAKIFRoZSBsYXRlc3QgaW5mbyBvbiB0aGlzIGRyaXZlciBjYW4gYmUgZm91bmQgYXQ6Ci1odHRwOi8vd3d3LmNoZWxsby5ubC9+ai52cmVla2VuL3NlNDAxLworaHR0cDovL21lbWJlcnMuY2hlbGxvLm5sL35qLnZyZWVrZW4vc2U0MDEvCiBBbmQgcXVlc3Rpb25zIHRvIG1lIGNhbiBiZSBzZW5kIHRvOgogcGUxcnhxQGFtc2F0Lm9yZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC93OTk2Ni50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY2LnR4dAppbmRleCA3OGE2NTEyLi44NTUwMjQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY2LnR4dApAQCAtMjQsNyArMjQsNyBAQAogaXMgY2FsbGVkIFZJREVPX1BBTEVUVEVfWVVWNDIyICgxNiBicHApLgogCiBBIG1pbmltYWwgdGVzdCBhcHBsaWNhdGlvbiAod2l0aCBzb3VyY2UpIGlzIGF2YWlsYWJsZSBmcm9tOgotICBodHRwOi8vaGVtLmZ5cmlzdG9yZy5jb20vbW9ndWwvdzk5NjYuaHRtbAorICBodHRwOi8vd3d3LnNsYWNrd2FyZXN1cHBvcnQuY29tL2hvd3Rvcy9XZWJjYW0tSE9XVE8KIAogVGhlIHNsb3cgZnJhbWVyYXRlIGlzIGR1ZSB0byBtaXNzaW5nIERNQSBFQ1AgcmVhZCBzdXBwb3J0IGluIHRoZQogcGFycG9ydCBkcml2ZXJzLiBJIG1pZ2h0IGFkZCB3b3JraW5nIEVQUCBzdXBwb3J0IGxhdGVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9wYWdlLXR5cGVzLmMgYi9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2UtdHlwZXMuYwppbmRleCA2NmU5MzU4Li5jY2Q5NTFmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2UtdHlwZXMuYworKysgYi9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2UtdHlwZXMuYwpAQCAtNjk0LDcgKzY5NCw3IEBACiAjZW5kaWYKICIgICAgICAgICAgICAtbHwtLWxpc3QgICAgICAgICAgICAgICAgICBTaG93IHBhZ2UgZGV0YWlscyBpbiByYW5nZXNcbiIKICIgICAgICAgICAgICAtTHwtLWxpc3QtZWFjaCAgICAgICAgICAgICBTaG93IHBhZ2UgZGV0YWlscyBvbmUgYnkgb25lXG4iCi0iICAgICAgICAgICAgLU58LS1uby1zdW1tYXJ5ICAgICAgICAgICAgRG9uJ3Qgc2hvdyBzdW1tYXkgaW5mb1xuIgorIiAgICAgICAgICAgIC1OfC0tbm8tc3VtbWFyeSAgICAgICAgICAgIERvbid0IHNob3cgc3VtbWFyeSBpbmZvXG4iCiAiICAgICAgICAgICAgLVh8LS1od3BvaXNvbiAgICAgICAgICAgICAgaHdwb2lzb24gcGFnZXNcbiIKICIgICAgICAgICAgICAteHwtLXVucG9pc29uICAgICAgICAgICAgICB1bnBvaXNvbiBwYWdlc1xuIgogIiAgICAgICAgICAgIC1ofC0taGVscCAgICAgICAgICAgICAgICAgIFNob3cgdGhpcyB1c2FnZSBtZXNzYWdlXG4iCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDgyIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ4MgppbmRleCAyOTliOTFjLi41NmY4ZWRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDgyCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0ODIKQEAgLTYsOCArNiw4IEBACiAgICAgUHJlZml4OiAnZHMyNDgyJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBOb25lCiAgICAgRGF0YXNoZWV0czoKLSAgICAgICAgaHR0cDovL3BkZnNlcnYubWF4aW0taWMuY29tL2VuL2RzL0RTMjQ4Mi0xMDAtRFMyNDgyUy0xMDAucGRmCi0gICAgICAgIGh0dHA6Ly9wZGZzZXJ2Lm1heGltLWljLmNvbS9lbi9kcy9EUzI0ODItODAwLURTMjQ4MlMtODAwLnBkZgorICAgICAgICBodHRwOi8vZGF0YXNoZWV0cy5tYXhpbS1pYy5jb20vZW4vZHMvRFMyNDgyLTEwMC5wZGYKKyAgICAgICAgaHR0cDovL2RhdGFzaGVldHMubWF4aW0taWMuY29tL2VuL2RzL0RTMjQ4Mi04MDAucGRmCiAKIEF1dGhvcjogQmVuIEdhcmRuZXIgPGJnYXJkbmVyQHdhYnRlYy5jb20+CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9teGMtdzEgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvbXhjLXcxCmluZGV4IDk3ZjYxOTkuLjM4YmUxYWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9teGMtdzEKKysrIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL214Yy13MQpAQCAtNSw3ICs1LDggQEAKICAgKiBGcmVlc2NhbGUgTVgyNywgTVgzMSBhbmQgcHJvYmFibHkgb3RoZXIgaS5NWCBTb0NzCiAgICAgRGF0YXNoZWV0czoKICAgICAgICAgaHR0cDovL3d3dy5mcmVlc2NhbGUuY29tL2ZpbGVzLzMyYml0L2RvYy9kYXRhX3NoZWV0L01DSU1YMzEucGRmP2Zwc3A9MQotCWh0dHA6Ly93d3cuZnJlZXNjYWxlLmNvbS9maWxlcy9kc3AvTUNJTVgyNy5wZGY/ZnBzcD0xCisJaHR0cDovL2NhY2hlLmZyZWVzY2FsZS5jb20vZmlsZXMvZHNwL2RvYy9hcmNoaXZlL01DSU1YMjcucGRmP2ZzcmNoPTEmV1RfVFlQRT0KKwlEYXRhJTIwU2hlZXRzJldUX1ZFTkRPUj1GUkVFU0NBTEUmV1RfRklMRV9GT1JNQVQ9cGRmJldUX0FTU0VUPURvY3VtZW50YXRpb24KIAogQXV0aG9yOiBPcmlnaW5hbGx5IGJhc2VkIG9uIEZyZWVzY2FsZSBjb2RlLCBwcmVwYXJlZCBmb3IgbWFpbmxpbmUgYnkKIAlTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvb21hcC1oZHEgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvb21hcC1oZHEKaW5kZXggY2E3MjJlMC4uODg0ZGMyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL29tYXAtaGRxCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9vbWFwLWhkcQpAQCAtNyw3ICs3LDcgQEAKIAogQSB1c2VmdWwgbGluayBhYm91dCBIRFEgYmFzaWNzOgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvYW4vc2x1YTQwOC9zbHVhNDA4LnBkZgoraHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvYW4vc2x1YTQwOGEvc2x1YTQwOGEucGRmCiAKIERlc2NyaXB0aW9uOgogPT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3poX0NOL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi96aF9DTi9IT1dUTwppbmRleCAzZDgwZThhLi42OTE2MDc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3poX0NOL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vemhfQ04vSE9XVE8KQEAgLTExMiw3ICsxMTIsNyBAQAogCiAgICAg5YW25LuW5YWz5LqO5aaC5L2V5q2j56Gu5Zyw55Sf5oiQ6KGl5LiB55qE5LyY56eA5paH5qGj5YyF5ous77yaCiAgICAgIlRoZSBQZXJmZWN0IFBhdGNoIgotICAgICAgICBodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0CisgICAgICAgIGh0dHA6Ly91c2Vyd2ViLmtlcm5lbC5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAogICAgICJMaW51eCBrZXJuZWwgcGF0Y2ggc3VibWlzc2lvbiBmb3JtYXQiCiAgICAgICAgIGh0dHA6Ly9saW51eC55eXoudXMvcGF0Y2gtZm9ybWF0Lmh0bWwKIApAQCAtMTY4LDcgKzE2OCw3IEBACiAKIOWmguaenOS9oOaDs+WKoOWFpeWGheaguOW8gOWPkeekvuWMuuW5tuWNj+WKqeWujOaIkOS4gOS6m+S7u+WKoe+8jOWNtOaJvuS4jeWIsOS7juWTqumHjOW8gOWni++8jOWPr+S7peiuv+mXrgog4oCcTGludXjlhoXmoLjmiL/nrqHlkZjigJ3orqHliJLvvJoKLQlodHRwOi8vamFuaXRvci5rZXJuZWxuZXdiaWVzLm9yZy8KKwlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSmFuaXRvcnMKIOi/meaYr+aegeS9s+eahOi1t+eCueOAguWug+aPkOS+m+S4gOS4quebuOWvueeugOWNleeahOS7u+WKoeWIl+ihqO+8jOWIl+WHuuWGheaguOS7o+eggeS4remcgOimgeiiq+mHjeaWsAog5pW055CG5oiW6ICF5pS55q2j55qE5Zyw5pa544CC6YCa6L+H5ZKM6LSf6LSj6L+Z5Liq6K6h5YiS55qE5byA5Y+R6ICF5Lus5LiA5ZCM5bel5L2c77yM5L2g5Lya5a2m5Yiw5bCG6KGl5LiBCiDpm4bmiJDov5vlhoXmoLjnmoTln7rmnKzljp/nkIbjgILlpoLmnpzov5jmsqHmnInlhrPlrprkuIvkuIDmraXopoHlgZrku4DkuYjnmoTor53vvIzkvaDov5jlj6/og73kvJrlvpfliLDmlrkKQEAgLTUxNSw3ICs1MTUsNyBAQAogCiDmg7Pkuobop6PlroPlhbfkvZPlupTor6XnnIvotbfmnaXlg4/ku4DkuYjvvIzor7fmn6XpmIXku6XkuIvmlofmoaPkuK3nmoTigJxDaGFuZ2VMb2figJ3nq6DoioLvvJoKICAg4oCcVGhlIFBlcmZlY3QgUGF0Y2jigJ0KLSAgICAgIGh0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9wYXRjaGVzL3N0dWZmL3RwcC50eHQKKyAgCSBodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35ha3BtL3N0dWZmL3RwcC50eHQKIAogCiDov5nkupvkuovmg4XmnInml7blgJnlgZrotbfmnaXlvojpmr7jgILopoHlnKjku7vkvZXmlrnpnaLpg73lgZrliLDlroznvo7lj6/og73pnIDopoHlpb3lh6DlubTml7bpl7TjgILov5nmmK8KQEAgLTUyNSw3ICs1MjUsNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0KIOaEn+iwolBhb2xvIENpYXJyb2NjaGnlhYHorrjigJzlvIDlj5HmtYHnqIvigJ3pg6jliIbln7rkuo7ku5bmiYDlhpnnmoTmlofnq6AKLShodHRwOi8vbGludXgudGFyLmJ6L2FydGljbGVzLzIuNi1kZXZlbG9wbWVudF9wcm9jZXNzKe+8jOaEn+iwolJhbmR5CisoaHR0cDovL3d3dy5rZXJuZWx0cmF2ZWwubmV0L25ld2JpZS8yLjYtZGV2ZWxvcG1lbnRfcHJvY2VzcynvvIzmhJ/osKJSYW5keQogRHVubGFw5ZKMR2Vycml0IEh1aXplbmdh5a6M5ZaE5LqG5bqU6K+l6K+05ZKM5LiN6K+l6K+055qE5YiX6KGo44CC5oSf6LCiUGF0IE1vY2hlbCwgSGFubmEKIExpbmRlciwgUmFuZHkgRHVubGFwLCBLYXkgU2lldmVycywgVm9qdGVjaCBQYXZsaWssIEphbiBLYXJhLCBKb3NoIEJveWVyLAogS2VlcyBDb29rLCBBbmRyZXcgTW9ydG9uLCBBbmRpIEtsZWVuLCBWYWRpbSBMb2Jhbm92LCBKZXNwZXIgSnVobCwgQWRyaWFuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3poX0NOL1N1Ym1pdHRpbmdEcml2ZXJzIGIvRG9jdW1lbnRhdGlvbi96aF9DTi9TdWJtaXR0aW5nRHJpdmVycwppbmRleCA1ZjQ4MTVjLi5jMjdiMGY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3poX0NOL1N1Ym1pdHRpbmdEcml2ZXJzCisrKyBiL0RvY3VtZW50YXRpb24vemhfQ04vU3VibWl0dGluZ0RyaXZlcnMKQEAgLTE2NSw0ICsxNjUsNCBAQAogCWh0dHA6Ly93d3cuZmVucnVzLm9yZy9ob3ctdG8tbm90LXdyaXRlLWEtZGV2aWNlLWRyaXZlci1wYXBlci5wZGYKIAog5YaF5qC45riF5rSB5belIChLZXJuZWwgSmFuaXRvcik6Ci0JaHR0cDovL2phbml0b3Iua2VybmVsbmV3Ymllcy5vcmcvCisJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnL0tlcm5lbEphbml0b3JzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3poX0NOL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi96aF9DTi9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCA5ODVjOTJlLi45YTFhNmUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3poX0NOL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vemhfQ04vU3VibWl0dGluZ1BhdGNoZXMKQEAgLTgzLDcgKzgzLDcgQEAKIGh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0CiAKIEFuZHJldyBNb3J0b24g55qE6KGl5LiB6ISa5pysOgotaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4L3BhdGNoZXMvCitodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35ha3BtL3N0dWZmL3BhdGNoLXNjcmlwdHMudGFyLmd6CiDkvZzkuLrov5nkupvohJrmnKznmoTmm7/ku6PvvIxxdWlsdCDmmK/lgLzlvpfmjqjojZDnmoTooaXkuIHnrqHnkIblt6Xlhbco55yL5LiK6Z2i55qE6ZO+5o6lKeOAggogCiAyKeaPj+i/sOS9oOeahOaUueWKqOOAggpAQCAtMTY2LDcgKzE2Niw3IEBACiAgIOS6uuaLt+i0ne+8jOWPquimgeWug+aYr+eQkOeijueahO+8iQogICDku7vkvZXmlofku7bnmoTkvZzogIUv57u05oqk6ICF5a+56K+l5paH5Lu255qE5pS55Yqo77yI5L6L5aaCIHBhdGNoIG1vbmtleSDlnKjph43kvKDmqKHlvI/kuIvvvIkKIAotVVJMOiA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2J1bmsvdHJpdmlhbC8+CitFTUFJTDogdHJpdmlhbEBrZXJuZWwub3JnCiAKICjor5Hms6jvvIzlhbPkuo7igJznkJDnoo7ooaXkuIHigJ3nmoTkuIDkupvor7TmmI7vvJrlm6DkuLrljp/mlofnmoTov5nkuIDpg6jliIblhpnlvpfmr5TovoPnroDljZXvvIzmiYDku6XkuI3lvpfkuI0KIOi/neS+i+WGmeS4gOS4i+ivkeazqOOAgiJ0cml2aWFsIui/meS4quiLseaWh+WNleivjeeahOacrOaEj+aYr+KAnOeQkOeijueahO+8jOS4jemHjeimgeeahOOAguKAneS9huaYr+WcqOi/memHjApAQCAtMzk0LDcgKzM5NCw3IEBACiAtLS0tLS0tLS0tLS0tLS0tCiAKIEFuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCi0gIDxodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0PgorICA8aHR0cDovL3VzZXJ3ZWIua2VybmVsLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0PgogCiBKZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdCIuCiAgIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi96aF9DTi9zcGFyc2UudHh0IGIvRG9jdW1lbnRhdGlvbi96aF9DTi9zcGFyc2UudHh0CmluZGV4IDc1OTkyYTYuLmNjMTQ0ZTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vemhfQ04vc3BhcnNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3poX0NOL3NwYXJzZS50eHQKQEAgLTIyLDcgKzIyLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDb3B5cmlnaHQgMjAwNCBMaW51cyBUb3J2YWxkcwotQ29weXJpZ2h0IDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorQ29weXJpZ2h0IDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiBDb3B5cmlnaHQgMjAwNiBCb2IgQ29wZWxhbmQgPG1lQGJvYmNvcGVsYW5kLmNvbT4KIAog5L2/55SoIHNwYXJzZSDlt6XlhbflgZrnsbvlnovmo4Dmn6UKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggZGIzZDBmNS4uMTAwYTNmNSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMxMywxMSArMzEzLDkgQEAKIEY6CWRyaXZlcnMvaHdtb24vYWRtMTAyOS5jCiAKIEFETTgyMTEgV0lSRUxFU1MgRFJJVkVSCi1NOglNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL2xpbnV4d2lyZWxlc3Mub3JnLwotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9td3UvbWFjODAyMTEtZHJpdmVycy5naXQKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS4qCiAKIEFEVDc0NlggRkFOIERSSVZFUgpAQCAtMTM2OSw3ICsxMzY3LDcgQEAKIE06CUVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKLUY6CWRyaXZlcnMvbmV0L2JueDJ4KgorRjoJZHJpdmVycy9uZXQvYm54MngvCiAKIEJST0FEQ09NIFRHMyBHSUdBQklUIEVUSEVSTkVUIERSSVZFUgogTToJTWF0dCBDYXJsc29uIDxtY2FybHNvbkBicm9hZGNvbS5jb20+CkBAIC0xNTcxLDYgKzE1NjksMTYgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvY2xhc3NtYXRlLWxhcHRvcC5jCiAKK0NPQ0NJTkVMTEUvU2VtYW50aWMgUGF0Y2hlcyAoU21QTCkKK006CUp1bGlhIExhd2FsbCA8anVsaWFAZGlrdS5kaz4KK006CUdpbGxlcyBNdWxsZXIgPEdpbGxlcy5NdWxsZXJAbGlwNi5mcj4KK006CU5pY29sYXMgUGFsaXggPG5wYWxpeEBkaWt1LmRrPgorTDoJY29jY2lAZGlrdS5kayAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitXOglodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLworUzoJU3VwcG9ydGVkCitGOglzY3JpcHRzL2NvY2NpbmVsbGUvCitGOglzY3JpcHRzL2NvY2NpY2hlY2sKKwogQ09EQSBGSUxFIFNZU1RFTQogTToJSmFuIEhhcmtlcyA8amFoYXJrZXNAY3MuY211LmVkdT4KIE06CWNvZGFAY3MuY211LmVkdQpAQCAtMTc3MSw2ICsxNzc5LDEzIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC8KIAorQ1hHQjRWRiBFVEhFUk5FVCBEUklWRVIgKENYR0I0VkYpCitNOglDYXNleSBMZWVkb20gPGxlZWRvbUBjaGVsc2lvLmNvbT4KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuY2hlbHNpby5jb20KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9uZXQvY3hnYjR2Zi8KKwogQ1lCRVJQUk8gRkIgRFJJVkVSCiBNOglSdXNzZWxsIEtpbmcgPGxpbnV4QGFybS5saW51eC5vcmcudWs+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQpAQCAtMjYyMCw2ICsyNjM1LDE0IEBACiBGOglEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NwcWFycmF5LnR4dAogRjoJZHJpdmVycy9ibG9jay9jcHFhcnJheS4qCiAKK0hFV0xFVFQtUEFDS0FSRCBTTUFSVCBBUlJBWSBSQUlEIERSSVZFUiAoaHBzYSkKK006CVN0ZXBoZW4gTS4gQ2FtZXJvbiA8c2NhbWVyb25AYmVhcmRvZy5jY2UuaHAuY29tPgorTDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCitTOglTdXBwb3J0ZWQKK0Y6CURvY3VtZW50YXRpb24vc2NzaS9ocHNhLnR4dAorRjoJZHJpdmVycy9zY3NpL2hwc2EqLltjaF0KK0Y6CWluY2x1ZGUvbGludXgvY2Npc3MqLmgKKwogSEVXTEVUVC1QQUNLQVJEIFNNQVJUIENJU1MgUkFJRCBEUklWRVIgKGNjaXNzKQogTToJTWlrZSBNaWxsZXIgPG1pa2UubWlsbGVyQGhwLmNvbT4KIEw6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQpAQCAtMzI1Myw4ICszMjc2LDggQEAKIAogS0VSTkVMIEJVSUxEICsgZmlsZXMgYmVsb3cgc2NyaXB0cy8gKHVubGVzcyBtYWludGFpbmVkIGVsc2V3aGVyZSkKIE06CU1pY2hhbCBNYXJlayA8bW1hcmVrQHN1c2UuY3o+Ci1UOglnaXQgZ2l0Oi8vcmVwby5vci5jei9saW51eC1rYnVpbGQuZ2l0IGZvci1uZXh0Ci1UOglnaXQgZ2l0Oi8vcmVwby5vci5jei9saW51eC1rYnVpbGQuZ2l0IGZvci1saW51cworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tbWFyZWsva2J1aWxkLTIuNi5naXQgZm9yLW5leHQKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbW1hcmVrL2tidWlsZC0yLjYuZ2l0IHJjLWZpeGVzCiBMOglsaW51eC1rYnVpbGRAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2tidWlsZC8KQEAgLTMzODAsMTMgKzM0MDMsNiBAQAogRjoJbW0va21lbWxlYWsuYwogRjoJbW0va21lbWxlYWstdGVzdC5jCiAKLUtNRU1UUkFDRQotTToJRWR1YXJkIC0gR2FicmllbCBNdW50ZWFudSA8ZWR1YXJkLm11bnRlYW51QGxpbnV4MzYwLnJvPgotUzoJTWFpbnRhaW5lZAotRjoJRG9jdW1lbnRhdGlvbi90cmFjZS9rbWVtdHJhY2UudHh0Ci1GOglpbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oCi1GOglrZXJuZWwvdHJhY2Uva21lbXRyYWNlLmMKLQogS1BST0JFUwogTToJQW5hbnRoIE4gTWF2aW5ha2F5YW5haGFsbGkgPGFuYW50aEBpbi5pYm0uY29tPgogTToJQW5pbCBTIEtlc2hhdmFtdXJ0aHkgPGFuaWwucy5rZXNoYXZhbXVydGh5QGludGVsLmNvbT4KQEAgLTM2ODYsNyArMzcwMiw3IEBACiBNQVJWRUxMIE1XTDhLIFdJUkVMRVNTIERSSVZFUgogTToJTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9kZCBGaXhlcwogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYwogCiBNQVJWRUxMIFNPQyBNTUMvU0QvU0RJTyBDT05UUk9MTEVSIERSSVZFUgpAQCAtMzkxNSwxNyArMzkzMSwxOSBAQAogUzoJTWFpbnRhaW5lZAogRjoJbmV0L3NjaGVkL3NjaF9uZXRlbS5jCiAKLU5FVEVSSU9OIChTMklPKSAxMEdiRSBEUklWRVIgKHhmcmFtZS92eGdlKQotTToJUmFta3Jpc2huYSBWZXBhIDxyYW0udmVwYUBuZXRlcmlvbi5jb20+Ci1NOglSYXN0YXB1ciBTYW50b3NoIDxzYW50b3NoLnJhc3RhcHVyQG5ldGVyaW9uLmNvbT4KLU06CVNpdmFrdW1hciBTdWJyYW1hbmkgPHNpdmFrdW1hci5zdWJyYW1hbmlAbmV0ZXJpb24uY29tPgotTToJU3JlZW5pdmFzYSBIb25udXIgPHNyZWVuaXZhc2EuaG9ubnVyQG5ldGVyaW9uLmNvbT4KK05FVEVSSU9OIDEwR2JFIERSSVZFUlMgKHMyaW8vdnhnZSkKK006CVJhbWtyaXNobmEgVmVwYSA8cmFta3Jpc2huYS52ZXBhQGV4YXIuY29tPgorTToJU2l2YWt1bWFyIFN1YnJhbWFuaSA8c2l2YWt1bWFyLnN1YnJhbWFuaUBleGFyLmNvbT4KK006CVNyZWVuaXZhc2EgSG9ubnVyIDxzcmVlbml2YXNhLmhvbm51ckBleGFyLmNvbT4KK006CUpvbiBNYXNvbiA8am9uLm1hc29uQGV4YXIuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3RyYWMubmV0ZXJpb24uY29tL2NnaS1iaW4vdHJhYy5jZ2kvd2lraS9MaW51eD9Bbm9ueW1vdXMKIFc6CWh0dHA6Ly90cmFjLm5ldGVyaW9uLmNvbS9jZ2ktYmluL3RyYWMuY2dpL3dpa2kvWDMxMDBMaW51eD9Bbm9ueW1vdXMKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3MyaW8udHh0CiBGOglkcml2ZXJzL25ldC9zMmlvKgorRjoJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Z4Z2UudHh0CitGOglkcml2ZXJzL25ldC92eGdlLwogCiBORVRGSUxURVIvSVBUQUJMRVMvSVBDSEFJTlMKIFA6CVJ1c3R5IFJ1c3NlbGwKQEAgLTQyNzIsMTAgKzQyOTAsOSBAQAogRjoJZnMvZXhvZnMvCiAKIFA1NCBXSVJFTEVTUyBEUklWRVIKLU06CU1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgorTToJQ2hyaXN0aWFuIExhbXBhcnRlciA8Y2h1bmtlZXlAZ29vZ2xlbWFpbC5jb20+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9wcmlzbTU0Lm9yZwotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9td3UvbWFjODAyMTEtZHJpdmVycy5naXQKK1c6CWh0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL3VzZXJzL0RyaXZlcnMvcDU0CiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvCiAKQEAgLTQ1MzcsNyArNDU1NCw3IEBACiBNOgkiTHVpcyBSLiBSb2RyaWd1ZXoiIDxtY2dyb2ZAZ21haWwuY29tPgogTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vcHJpc201NC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ic29sZXRlCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0LwogCiBQUk9NSVNFIERDNDAzMCBDQUNISU5HIERJU0sgQ09OVFJPTExFUiBEUklWRVIKQEAgLTQ3MTcsNyArNDczNCw3IEBACiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvCiAKIFJBTURJU0sgUkFNIEJMT0NLIERFVklDRSBEUklWRVIKLU06CU5pY2sgUGlnZ2luIDxucGlnZ2luQHN1c2UuZGU+CitNOglOaWNrIFBpZ2dpbiA8bnBpZ2dpbkBrZXJuZWwuZGs+CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3JhbWRpc2sudHh0CiBGOglkcml2ZXJzL2Jsb2NrL2JyZC5jCkBAIC00NzMzLDkgKzQ3NTAsOCBAQAogRjoJZHJpdmVycy9yYXBpZGlvLwogCiBSQVlMSU5LL1dFQkdFQVIgODAyLjExIFdJUkVMRVNTIExBTiBEUklWRVIKLU06CUNvcmV5IFRob21hcyA8Y29yZXl0aG9tYXNAY2hhcnRlci5uZXQ+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5KgogCiBSQ1VUT1JUVVJFIE1PRFVMRQpAQCAtNTA2MSw2ICs1MDc3LDE0IEBACiBGOglpbmNsdWRlL2xpbnV4L3NlbGludXgqCiBGOglzZWN1cml0eS9zZWxpbnV4LwogCitBUFBBUk1PUiBTRUNVUklUWSBNT0RVTEUKK006CUpvaG4gSm9oYW5zZW4gPGpvaG4uam9oYW5zZW5AY2Fub25pY2FsLmNvbT4KK0w6CWFwcGFybW9yQGxpc3RzLnVidW50dS5jb20gKHN1YnNjcmliZXJzLW9ubHksIGdlbmVyYWwgZGlzY3Vzc2lvbikKK1c6CWFwcGFybW9yLndpa2kua2VybmVsLm9yZworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qai9hcHBhcm1vci1kZXYuZ2l0CitTOglTdXBwb3J0ZWQKK0Y6CXNlY3VyaXR5L2FwcGFybW9yLworCiBTRU5TQUJMRSBQSEFOVE9NCiBNOglKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgogUzoJTWFpbnRhaW5lZApAQCAtNTMzNiw3ICs1MzYwLDcgQEAKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZGF2ZW0vc3BhcmMtbmV4dC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL3NwYXJjLwotRjoJZHJpdmVycy9zYnVzCitGOglkcml2ZXJzL3NidXMvCiAKIFNQQVJDIFNFUklBTCBEUklWRVJTCiBNOgkiRGF2aWQgUy4gTWlsbGVyIiA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KQEAgLTU2MDUsNyArNTYyOSw3IEBACiBMOgl0b21veW8tZGV2QGxpc3RzLnNvdXJjZWZvcmdlLmpwIChzdWJzY3JpYmVycy1vbmx5LCBmb3IgZGV2ZWxvcGVycyBpbiBKYXBhbmVzZSkKIEw6CXRvbW95by11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5qcCAoc3Vic2NyaWJlcnMtb25seSwgZm9yIHVzZXJzIGluIEphcGFuZXNlKQogVzoJaHR0cDovL3RvbW95by5zb3VyY2Vmb3JnZS5qcC8KLVQ6CXF1aWx0IGh0dHA6Ly9zdm4uc291cmNlZm9yZ2UuanAvc3Zucm9vdC90b21veW8vdHJ1bmsvMi4yLngvdG9tb3lvLWxzbS9wYXRjaGVzLworVDoJcXVpbHQgaHR0cDovL3N2bi5zb3VyY2Vmb3JnZS5qcC9zdm5yb290L3RvbW95by90cnVuay8yLjMueC90b21veW8tbHNtL3BhdGNoZXMvCiBTOglNYWludGFpbmVkCiBGOglzZWN1cml0eS90b21veW8vCiAKQEAgLTU2NTQsNyArNTY3OCw3IEBACiBNOglTdGV2ZW4gUm9zdGVkdCA8cm9zdGVkdEBnb29kbWlzLm9yZz4KIE06CUZyZWRlcmljIFdlaXNiZWNrZXIgPGZ3ZWlzYmVjQGdtYWlsLmNvbT4KIE06CUluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvbGludXgtMi42LXRpcC5naXQgdHJhY2luZy9jb3JlCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC9saW51eC0yLjYtdGlwLmdpdCBwZXJmL2NvcmUKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dAogRjoJYXJjaC8qLyovKi9mdHJhY2UuaApAQCAtNjA2MCwxMCArNjA4NCw5IEBACiBGOglkcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS8KIAogVVNCIFpEMTIwMSBEUklWRVIKLU06CUplcm9lbiBWcmVla2VuIDxwZTFyeHFAYW1zYXQub3JnPgotTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vbGludXgtbGMxMDAwMjAuc291cmNlZm9yZ2UubmV0Ci1TOglNYWludGFpbmVkCitTOglPcnBoYW4KIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS4qCiAKIFVTQiBaUjM2NFhYIERSSVZFUgpAQCAtNjI0MywyMCArNjI2NiwxNCBAQAogCiBXQVRDSERPRyBERVZJQ0UgRFJJVkVSUwogTToJV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4KK0w6CWxpbnV4LXdhdGNoZG9nQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5saW51eC13YXRjaGRvZy5vcmcvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3dpbS9saW51eC0yLjYtd2F0Y2hkb2cuZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3dhdGNoZG9nLwogRjoJZHJpdmVycy93YXRjaGRvZy8KIEY6CWluY2x1ZGUvbGludXgvd2F0Y2hkb2cuaAogCi1XQVZFTEFOIE5FVFdPUksgRFJJVkVSICYgV0lSRUxFU1MgRVhURU5TSU9OUwotTToJSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgotTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4LwotUzoJTWFpbnRhaW5lZAotRjoJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhdmVsYW4udHh0Ci1GOglkcml2ZXJzL3N0YWdpbmcvd2F2ZWxhbi8KLQogV0Q3MDAwIFNDU0kgRFJJVkVSCiBNOglNaXJvc2xhdiBaYWdvcmFjIDx6YWdhQGZseS5jYy5mZXIuaHI+CiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCA4ODZiZjA0Li43NDMxYzI4IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSAyCiBQQVRDSExFVkVMID0gNgogU1VCTEVWRUwgPSAzNQotRVhUUkFWRVJTSU9OID0gLXJjNgorRVhUUkFWRVJTSU9OID0KIE5BTUUgPSBTaGVlcCBvbiBNZXRoCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0zMzIsMTAgKzMzMiw5IEBACiAKIENIRUNLRkxBR1MgICAgIDo9IC1EX19saW51eF9fIC1EbGludXggLURfX1NURENfXyAtRHVuaXggLURfX3VuaXhfXyBcCiAJCSAgLVdiaXR3aXNlIC1Xbm8tcmV0dXJuLXZvaWQgJChDRikKLU1PREZMQUdTCT0gLURNT0RVTEUKLUNGTEFHU19NT0RVTEUgICA9ICQoTU9ERkxBR1MpCi1BRkxBR1NfTU9EVUxFICAgPSAkKE1PREZMQUdTKQotTERGTEFHU19NT0RVTEUgID0gLVQgJChzcmN0cmVlKS9zY3JpcHRzL21vZHVsZS1jb21tb24ubGRzCitDRkxBR1NfTU9EVUxFICAgPQorQUZMQUdTX01PRFVMRSAgID0KK0xERkxBR1NfTU9EVUxFICA9CiBDRkxBR1NfS0VSTkVMCT0KIEFGTEFHU19LRVJORUwJPQogQ0ZMQUdTX0dDT1YJPSAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UKQEAgLTM1NCw3ICszNTMsMTIgQEAKIAkJICAgLVdlcnJvci1pbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiBcCiAJCSAgIC1Xbm8tZm9ybWF0LXNlY3VyaXR5IFwKIAkJICAgLWZuby1kZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcworS0JVSUxEX0FGTEFHU19LRVJORUwgOj0KK0tCVUlMRF9DRkxBR1NfS0VSTkVMIDo9CiBLQlVJTERfQUZMQUdTICAgOj0gLURfX0FTU0VNQkxZX18KK0tCVUlMRF9BRkxBR1NfTU9EVUxFICA6PSAtRE1PRFVMRQorS0JVSUxEX0NGTEFHU19NT0RVTEUgIDo9IC1ETU9EVUxFCitLQlVJTERfTERGTEFHU19NT0RVTEUgOj0gLVQgJChzcmN0cmVlKS9zY3JpcHRzL21vZHVsZS1jb21tb24ubGRzCiAKICMgUmVhZCBLRVJORUxSRUxFQVNFIGZyb20gaW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2UgKGlmIGl0IGV4aXN0cykKIEtFUk5FTFJFTEVBU0UgPSAkKHNoZWxsIGNhdCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSAyPiAvZGV2L251bGwpCkBAIC0zNjksNiArMzczLDggQEAKIGV4cG9ydCBLQlVJTERfQ1BQRkxBR1MgTk9TVERJTkNfRkxBR1MgTElOVVhJTkNMVURFIE9CSkNPUFlGTEFHUyBMREZMQUdTCiBleHBvcnQgS0JVSUxEX0NGTEFHUyBDRkxBR1NfS0VSTkVMIENGTEFHU19NT0RVTEUgQ0ZMQUdTX0dDT1YKIGV4cG9ydCBLQlVJTERfQUZMQUdTIEFGTEFHU19LRVJORUwgQUZMQUdTX01PRFVMRQorZXhwb3J0IEtCVUlMRF9BRkxBR1NfTU9EVUxFIEtCVUlMRF9DRkxBR1NfTU9EVUxFIEtCVUlMRF9MREZMQUdTX01PRFVMRQorZXhwb3J0IEtCVUlMRF9BRkxBR1NfS0VSTkVMIEtCVUlMRF9DRkxBR1NfS0VSTkVMCiAKICMgV2hlbiBjb21waWxpbmcgb3V0LW9mLXRyZWUgbW9kdWxlcywgcHV0IE1PRFZFUkRJUiBpbiB0aGUgbW9kdWxlCiAjIHRyZWUgcmF0aGVyIHRoYW4gaW4gdGhlIGtlcm5lbCB0cmVlLiBUaGUga2VybmVsIHRyZWUgbWlnaHQKQEAgLTQxMiw5ICs0MTgsOSBAQAogIyBvZiBtYWtlIHNvIC5jb25maWcgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgY2FzZSBlaXRoZXIgKGZvciAqY29uZmlnKS4KIAogbm8tZG90LWNvbmZpZy10YXJnZXRzIDo9IGNsZWFuIG1ycHJvcGVyIGRpc3RjbGVhbiBcCi0JCQkgY3Njb3BlIFRBR1MgdGFncyBoZWxwICVkb2NzIGNoZWNrJSBcCisJCQkgY3Njb3BlIFRBR1MgdGFncyBoZWxwICVkb2NzIGNoZWNrJSBjb2NjaWNoZWNrIFwKIAkJCSBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBoZWFkZXJzXyUgXAotCQkJIGtlcm5lbHJlbGVhc2Uga2VybmVsdmVyc2lvbgorCQkJIGtlcm5lbHZlcnNpb24gJXNyYy1wa2cKIAogY29uZmlnLXRhcmdldHMgOj0gMAogbWl4ZWQtdGFyZ2V0cyAgOj0gMApAQCAtNTI2LDcgKzUzMiw3IEBACiAjIFRoZSBhbGw6IHRhcmdldCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRhcmdldCBpcyBnaXZlbiBvbiB0aGUKICMgY29tbWFuZCBsaW5lLgogIyBUaGlzIGFsbG93IGEgdXNlciB0byBpc3N1ZSBvbmx5ICdtYWtlJyB0byBidWlsZCBhIGtlcm5lbCBpbmNsdWRpbmcgbW9kdWxlcwotIyBEZWZhdWx0cyB2bWxpbnV4IGJ1dCBpdCBpcyB1c3VhbGx5IG92ZXJyaWRkZW4gaW4gdGhlIGFyY2ggbWFrZWZpbGUKKyMgRGVmYXVsdHMgdG8gdm1saW51eCwgYnV0IHRoZSBhcmNoIG1ha2VmaWxlIHVzdWFsbHkgYWRkcyBmdXJ0aGVyIHRhcmdldHMKIGFsbDogdm1saW51eAogCiBpZmRlZiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUKQEAgLTU1Nyw2ICs1NjMsMTAgQEAKIEtCVUlMRF9BRkxBR1MJKz0gLWdkd2FyZi0yCiBlbmRpZgogCitpZmRlZiBDT05GSUdfREVCVUdfSU5GT19SRURVQ0VECitLQlVJTERfQ0ZMQUdTIAkrPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZmVtaXQtc3RydWN0LWRlYnVnLWJhc2Vvbmx5KQorZW5kaWYKKwogaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogS0JVSUxEX0NGTEFHUwkrPSAtcGcKIGVuZGlmCkBAIC02MDMsNyArNjEzLDcgQEAKICMgVXNlIC0tYnVpbGQtaWQgd2hlbiBhdmFpbGFibGUuCiBMREZMQUdTX0JVSUxEX0lEID0gJChwYXRzdWJzdCAtV2wkKGNvbW1hKSUsJSxcCiAJCQkgICAgICAkKGNhbGwgY2MtbGRvcHRpb24sIC1XbCQoY29tbWEpLS1idWlsZC1pZCwpKQotTERGTEFHU19NT0RVTEUgKz0gJChMREZMQUdTX0JVSUxEX0lEKQorS0JVSUxEX0xERkxBR1NfTU9EVUxFICs9ICQoTERGTEFHU19CVUlMRF9JRCkKIExERkxBR1Nfdm1saW51eCArPSAkKExERkxBR1NfQlVJTERfSUQpCiAKIGlmZXEgKCQoQ09ORklHX1NUUklQX0FTTV9TWU1TKSx5KQpAQCAtMTE1OCw2ICsxMTY4LDggQEAKICMgcnBtIHRhcmdldCBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiBwYWNrYWdlLWRpcgk6PSAkKHNyY3RyZWUpL3NjcmlwdHMvcGFja2FnZQogCislc3JjLXBrZzogRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSAkQAogJXBrZzogaW5jbHVkZS9jb25maWcva2VybmVsLnJlbGVhc2UgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSAkQAogcnBtOiBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSBGT1JDRQpAQCAtMTIwOSw4ICsxMjIxLDkgQEAKIAlAZWNobyAgJyAgaW5jbHVkZWNoZWNrICAgIC0gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBpbmNsdWRlZCBoZWFkZXIgZmlsZXMnCiAJQGVjaG8gICcgIGV4cG9ydF9yZXBvcnQgICAtIExpc3QgdGhlIHVzYWdlcyBvZiBhbGwgZXhwb3J0ZWQgc3ltYm9scycKIAlAZWNobyAgJyAgaGVhZGVyc19jaGVjayAgIC0gU2FuaXR5IGNoZWNrIG9uIGV4cG9ydGVkIGhlYWRlcnMnCi0JQGVjaG8gICcgIGhlYWRlcmRlcCAgICAgICAtIERldGVjdCBpbmNsdXNpb24gY3ljbGVzIGluIGhlYWRlcnMnOyBcCi0JIGVjaG8gICcnCisJQGVjaG8gICcgIGhlYWRlcmRlcCAgICAgICAtIERldGVjdCBpbmNsdXNpb24gY3ljbGVzIGluIGhlYWRlcnMnCisJQCQoTUFLRSkgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLmhlbHAgY2hlY2tlci1oZWxwCisJQGVjaG8gICcnCiAJQGVjaG8gICdLZXJuZWwgcGFja2FnaW5nOicKIAlAJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSBoZWxwCiAJQGVjaG8gICcnCkBAIC0xMzY5LDYgKzEzODIsOSBAQAogCQktbmFtZSAnKi5baGNTXScgLXR5cGUgZiAtcHJpbnQgfCBzb3J0IFwKIAkJfCB4YXJncyAkKFBFUkwpIC13ICQoc3JjdHJlZSkvc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwKIAorY29jY2ljaGVjazoKKwkkKFEpJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy8kQAorCiBuYW1lc3BhY2VjaGVjazoKIAkkKFBFUkwpICQoc3JjdHJlZSkvc2NyaXB0cy9uYW1lc3BhY2UucGwKIApAQCAtMTM5Myw5ICsxNDA5LDkgQEAKIAkkKE9CSkRVTVApIC1kIHZtbGludXggJCQoZmluZCAuIC1uYW1lICcqLmtvJykgfCBcCiAJJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQ0hFQ0tTVEFDS19BUkNIKQogCi1rZXJuZWxyZWxlYXNlOgotCSQoaWYgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSksICQoUSllY2hvICQoS0VSTkVMUkVMRUFTRSksIFwKLQkkKGVycm9yIGtlcm5lbHJlbGVhc2Ugbm90IHZhbGlkIC0gcnVuICdtYWtlIHByZXBhcmUnIHRvIHVwZGF0ZSBpdCkpCitrZXJuZWxyZWxlYXNlOiBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZQorCUBlY2hvICQoS0VSTkVMUkVMRUFTRSkKKwoga2VybmVsdmVyc2lvbjoKIAlAZWNobyAkKEtFUk5FTFZFUlNJT04pCiAKQEAgLTE0NzIsNiArMTQ4OCw3IEBACiAgICAgICAgICAgICAgICAgICAkKGlmICQoS0JVSUxEX01PRFVMRVMpLDsgcm0gLWYgJChNT0RWRVJESVIpLyopCiAKIGFfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChLQlVJTERfQUZMQUdTKSAkKEFGTEFHU19LRVJORUwpIFwKKwkgICQoS0JVSUxEX0FGTEFHU19LRVJORUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSAgJChOT1NURElOQ19GTEFHUykgJChMSU5VWElOQ0xVREUpICQoS0JVSUxEX0NQUEZMQUdTKSBcCiAJICAkKG1vZGtlcm5fYWZsYWdzKSAkKEVYVFJBX0FGTEFHUykgJChBRkxBR1NfJChiYXNldGFyZ2V0KS5vKQogCmRpZmYgLS1naXQgYS9hcmNoL0tjb25maWcgYi9hcmNoL0tjb25maWcKaW5kZXggYWNkYTUxMi4uNDg3N2E4YyAxMDA2NDQKLS0tIGEvYXJjaC9LY29uZmlnCisrKyBiL2FyY2gvS2NvbmZpZwpAQCAtMTUxLDQgKzE1MSwxMSBAQAogY29uZmlnIEhBVkVfVVNFUl9SRVRVUk5fTk9USUZJRVIKIAlib29sCiAKK2NvbmZpZyBIQVZFX1BFUkZfRVZFTlRTX05NSQorCWJvb2wKKwloZWxwCisJICBTeXN0ZW0gaGFyZHdhcmUgY2FuIGdlbmVyYXRlIGFuIE5NSSB1c2luZyB0aGUgcGVyZiBldmVudAorCSAgc3Vic3lzdGVtLiAgQWxzbyBoYXMgc3VwcG9ydCBmb3IgY2FsY3VsYXRpbmcgQ1BVIGN5Y2xlIGV2ZW50cworCSAgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGNsb2NrIGN5Y2xlcyBpbiBhIGdpdmVuIHBlcmlvZC4KKwogc291cmNlICJrZXJuZWwvZ2Nvdi9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDY1NWI0YWUuLjllMTA4ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTAsNiArMTAsNyBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCBIQVZFX0FPVVQKIAlzZWxlY3QgSEFWRV9JREUKKwlzZWxlY3QgSEFWRV9NRU1CTE9DSwogCXNlbGVjdCBSVENfTElCCiAJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCiAJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgKCFDUFVfMzJ2NkspCkBAIC0yNCw2ICsyNSw3IEBACiAJc2VsZWN0IEhBVkVfS0VSTkVMX0xaTUEKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBQRVJGX1VTRV9WTUFMTE9DCisJc2VsZWN0IEhBVkVfUkVHU19BTkRfU1RBQ0tfQUNDRVNTX0FQSQogCWhlbHAKIAkgIFRoZSBBUk0gc2VyaWVzIGlzIGEgbGluZSBvZiBsb3ctcG93ZXItY29uc3VtcHRpb24gUklTQyBjaGlwIGRlc2lnbnMKIAkgIGxpY2Vuc2VkIGJ5IEFSTSBMdGQgYW5kIHRhcmdldGVkIGF0IGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQKQEAgLTUxLDcgKzUzLDcgQEAKIGNvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAogCWJvb2wKIAlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKLQlkZWZhdWx0IHkgaWYgU01QICYmICFMT0NBTF9USU1FUlMKKwlkZWZhdWx0IHkgaWYgU01QCiAKIGNvbmZpZyBIQVZFX1RDTQogCWJvb2wKQEAgLTI5Nyw2ICsyOTksNyBAQAogCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBBUk1fR0lDCisJc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIENhdml1bSBOZXR3b3JrcyBDTlMzWFhYIHBsYXRmb3JtLgogCkBAIC00MzUsMjEgKzQzOCw2IEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgSW50ZWwncyBJWFA0WFggKFhTY2FsZSkgZmFtaWx5IG9mIHByb2Nlc3NvcnMuCiAKLWNvbmZpZyBBUkNIX0w3MjAwCi0JYm9vbCAiTGlua1VwLUw3MjAwIgotCXNlbGVjdCBDUFVfQVJNNzIwVAotCXNlbGVjdCBGSVEKLQlzZWxlY3QgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIGEgTGlua1VwIFN5c3RlbXMKLQkgIEw3MjAwIFNvZnR3YXJlIERldmVsb3BtZW50IEJvYXJkIHdoaWNoIHVzZXMgYW4gQVJNNzIwVCBwcm9jZXNzb3IuCi0JICBJbmZvcm1hdGlvbiBvbiB0aGlzIGJvYXJkIGNhbiBiZSBvYnRhaW5lZCBhdDoKLQotCSAgPGh0dHA6Ly93d3cubGlua3Vwc3lzLmNvbS8+Ci0KLQkgIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgY29tbWVudHMgYWJvdXQgdGhlIExpbnV4IGtlcm5lbCBwb3J0Ci0JICB0byB0aGlzIGJvYXJkLCBzZW5kIGUtbWFpbCB0byA8c2poaWxsQGNvdHcuY29tPi4KLQogY29uZmlnIEFSQ0hfRE9WRQogCWJvb2wgIk1hcnZlbGwgRG92ZSIKIAlzZWxlY3QgUENJCkBAIC00NzgsNiArNDY2LDE5IEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgTG9raSAoODhSQzg0ODApIFNvQy4KIAorY29uZmlnIEFSQ0hfTFBDMzJYWAorCWJvb2wgIk5YUCBMUEMzMlhYIgorCXNlbGVjdCBDUFVfQVJNOTI2VAorCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBIQVZFX0lERQorCXNlbGVjdCBBUk1fQU1CQQorCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQorCXNlbGVjdCBDT01NT05fQ0xLREVWCisJc2VsZWN0IEdFTkVSSUNfVElNRQorCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIE5YUCBMUEMzMlhYIGZhbWlseSBvZiBwcm9jZXNzb3JzCisKIGNvbmZpZyBBUkNIX01WNzhYWDAKIAlib29sICJNYXJ2ZWxsIE1WNzh4eDAiCiAJc2VsZWN0IENQVV9GRVJPQ0VPTgpAQCAtNTgyLDYgKzU4Myw3IEBACiAJYm9vbCAiUXVhbGNvbW0gTVNNIgogCXNlbGVjdCBIQVZFX0NMSwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgUXVhbGNvbW0gTVNNL1FTRCBiYXNlZCBzeXN0ZW1zLiAgVGhpcyBydW5zIG9uIHRoZQogCSAgYXBwcyBwcm9jZXNzb3Igb2YgdGhlIE1TTS9RU0QgYW5kIGRlcGVuZHMgb24gYSBzaGFyZWQgbWVtb3J5CkBAIC03MTUsNyArNzE3LDYgQEAKIGNvbmZpZyBBUkNIX0xIN0E0MFgKIAlib29sICJTaGFycCBMSDdBNDBYIgogCXNlbGVjdCBDUFVfQVJNOTIyVAotCXNlbGVjdCBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaWYgIUxIN0E0MFhfQ09OVElHTUVNCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRSBpZiAhTEg3QTQwWF9DT05USUdNRU0KIAlzZWxlY3QgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQKIAloZWxwCkBAIC04NDEsNiArODQyLDggQEAKIAogc291cmNlICJhcmNoL2FybS9tYWNoLWxva2kvS2NvbmZpZyIKIAorc291cmNlICJhcmNoL2FybS9tYWNoLWxwYzMyeHgvS2NvbmZpZyIKKwogc291cmNlICJhcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbXY3OHh4MC9LY29uZmlnIgpAQCAtMTAyNywxMSArMTAzMCw2IEBACiAKIHNvdXJjZSAiYXJjaC9hcm0vY29tbW9uL0tjb25maWciCiAKLWNvbmZpZyBGT1JDRV9NQVhfWk9ORU9SREVSCi0JaW50Ci0JZGVwZW5kcyBvbiBTQTExMTEKLQlkZWZhdWx0ICI5IgotCiBtZW51ICJCdXMgc3VwcG9ydCIKIAogY29uZmlnIEFSTV9BTUJBCkBAIC0xMDU2LDcgKzEwNTQsNyBAQAogCWJvb2wKIAogY29uZmlnIFBDSQotCWJvb2wgIlBDSSBzdXBwb3J0IiBpZiBBUkNIX0lOVEVHUkFUT1JfQVAgfHwgQVJDSF9WRVJTQVRJTEVfUEIgfHwgQVJDSF9JWFA0WFggfHwgQVJDSF9LUzg2OTUgfHwgTUFDSF9BUk1DT1JFCisJYm9vbCAiUENJIHN1cHBvcnQiIGlmIEFSQ0hfSU5URUdSQVRPUl9BUCB8fCBBUkNIX1ZFUlNBVElMRV9QQiB8fCBBUkNIX0lYUDRYWCB8fCBBUkNIX0tTODY5NSB8fCBNQUNIX0FSTUNPUkUgfHwgQVJDSF9DTlMzWFhYCiAJaGVscAogCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBhIFBDSSBtb3RoZXJib2FyZC4gUENJIGlzIHRoZSBuYW1lIG9mIGEKIAkgIGJ1cyBzeXN0ZW0sIGkuZS4gdGhlIHdheSB0aGUgQ1BVIHRhbGtzIHRvIHRoZSBvdGhlciBzdHVmZiBpbnNpZGUKQEAgLTExNjgsOSArMTE2NiwxMCBAQAogY29uZmlnIExPQ0FMX1RJTUVSUwogCWJvb2wgIlVzZSBsb2NhbCB0aW1lciBpbnRlcnJ1cHRzIgogCWRlcGVuZHMgb24gU01QICYmIChSRUFMVklFV19FQl9BUk0xMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IFwKLQkJUkVBTFZJRVdfRUJfQTlNUCB8fCBNQUNIX1JFQUxWSUVXX1BCWCB8fCBBUkNIX09NQVA0IHx8IEFSQ0hfVTg1MDApCisJCVJFQUxWSUVXX0VCX0E5TVAgfHwgTUFDSF9SRUFMVklFV19QQlggfHwgQVJDSF9PTUFQNCB8fCBcCisJCUFSQ0hfVTg1MDAgfHwgQVJDSF9WRVhQUkVTU19DQTlYNCkKIAlkZWZhdWx0IHkKLQlzZWxlY3QgSEFWRV9BUk1fVFdEIGlmIChBUkNIX1JFQUxWSUVXIHx8IEFSQ0hfT01BUDQgfHwgQVJDSF9VODUwMCkKKwlzZWxlY3QgSEFWRV9BUk1fVFdEIGlmIChBUkNIX1JFQUxWSUVXIHx8IEFSQ0hfVkVYUFJFU1MgfHwgQVJDSF9PTUFQNCB8fCBBUkNIX1U4NTAwKQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBsb2NhbCB0aW1lcnMgb24gU01QIHBsYXRmb3JtcywgcmF0aGVyIHRoZW4gdGhlCiAJICBsZWdhY3kgSVBJIGJyb2FkY2FzdCBtZXRob2QuICBMb2NhbCB0aW1lcnMgYWxsb3dzIHRoZSBzeXN0ZW0KQEAgLTExODEsMTAgKzExODAsMTAgQEAKIAogY29uZmlnIEhaCiAJaW50Ci0JZGVmYXVsdCAxMjggaWYgQVJDSF9MNzIwMAogCWRlZmF1bHQgMjAwIGlmIEFSQ0hfRUJTQTExMCB8fCBBUkNIX1MzQzI0MTAgfHwgQVJDSF9TNVA2NDQwIHx8IEFSQ0hfUzVQNjQ0MiB8fCBBUkNIX1M1UFYyMTAKIAlkZWZhdWx0IE9NQVBfMzJLX1RJTUVSX0haIGlmIEFSQ0hfT01BUCAmJiBPTUFQXzMyS19USU1FUgogCWRlZmF1bHQgQVQ5MV9USU1FUl9IWiBpZiBBUkNIX0FUOTEKKwlkZWZhdWx0IFNITU9CSUxFX1RJTUVSX0haIGlmIEFSQ0hfU0hNT0JJTEUKIAlkZWZhdWx0IDEwMAogCiBjb25maWcgVEhVTUIyX0tFUk5FTApAQCAtMTIzNywxMCArMTIzNiw2IEBACiBjb25maWcgQVJDSF9IQVNfSE9MRVNfTUVNT1JZTU9ERUwKIAlib29sCiAKLSMgRGlzY29udGlnbWVtIGlzIGRlcHJlY2F0ZWQKLWNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKLQlib29sCi0KIGNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlib29sCiAKQEAgLTEyNDgsMTMgKzEyNDMsNyBAQAogCWRlZl9ib29sIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCiBjb25maWcgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMCi0JZGVmX2Jvb2wgQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFICYmIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQotCi1jb25maWcgTk9ERVNfU0hJRlQKLQlpbnQKLQlkZWZhdWx0ICI0IiBpZiBBUkNIX0xIN0E0MFgKLQlkZWZhdWx0ICIyIgotCWRlcGVuZHMgb24gTkVFRF9NVUxUSVBMRV9OT0RFUworCWRlZl9ib29sIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCiBjb25maWcgSElHSE1FTQogCWJvb2wgIkhpZ2ggTWVtb3J5IFN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCkBAIC0xMjg2LDggKzEyNzUsMzMgQEAKIAkgIEVuYWJsZSBoYXJkd2FyZSBwZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIHBlcmYgZXZlbnRzLiBJZgogCSAgZGlzYWJsZWQsIHBlcmYgZXZlbnRzIHdpbGwgdXNlIHNvZnR3YXJlIGV2ZW50cyBvbmx5LgogCitjb25maWcgU1BBUlNFX0lSUQorCWRlZl9ib29sIG4KKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3BhcnNlIGlycXMuIFRoaXMgaXMgdXNlZnVsIGluIGdlbmVyYWwKKwkgIGFzIG1vc3QgQ1BVcyBoYXZlIGEgZmFpcmx5IHNwYXJzZSBhcnJheSBvZiBJUlEgdmVjdG9ycywgd2hpY2gKKwkgIHRoZSBpcnFfZGVzYyB0aGVuIG1hcHMgZGlyZWN0bHkgb24gdG8uIFN5c3RlbXMgd2l0aCBhIGhpZ2gKKwkgIG51bWJlciBvZiBvZmYtY2hpcCBJUlFzIHdpbGwgd2FudCB0byB0cmVhdCB0aGlzIGFzCisJICBleHBlcmltZW50YWwgdW50aWwgdGhleSBoYXZlIGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZC4KKwogc291cmNlICJtbS9LY29uZmlnIgogCitjb25maWcgRk9SQ0VfTUFYX1pPTkVPUkRFUgorCWludCAiTWF4aW11bSB6b25lIG9yZGVyIiBpZiBBUkNIX1NITU9CSUxFCisJcmFuZ2UgMTEgNjQgaWYgQVJDSF9TSE1PQklMRQorCWRlZmF1bHQgIjkiIGlmIFNBMTExMQorCWRlZmF1bHQgIjExIgorCWhlbHAKKwkgIFRoZSBrZXJuZWwgbWVtb3J5IGFsbG9jYXRvciBkaXZpZGVzIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkKKwkgIGJsb2NrcyBpbnRvICJ6b25lcyIsIHdoZXJlIGVhY2ggem9uZSBpcyBhIHBvd2VyIG9mIHR3byBudW1iZXIgb2YKKwkgIHBhZ2VzLiAgVGhpcyBvcHRpb24gc2VsZWN0cyB0aGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdCB0aGUga2VybmVsCisJICBrZWVwcyBpbiB0aGUgbWVtb3J5IGFsbG9jYXRvci4gIElmIHlvdSBuZWVkIHRvIGFsbG9jYXRlIHZlcnkgbGFyZ2UKKwkgIGJsb2NrcyBvZiBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LCB0aGVuIHlvdSBtYXkgbmVlZCB0bworCSAgaW5jcmVhc2UgdGhpcyB2YWx1ZS4KKworCSAgVGhpcyBjb25maWcgb3B0aW9uIGlzIGFjdHVhbGx5IG1heGltdW0gb3JkZXIgcGx1cyBvbmUuIEZvciBleGFtcGxlLAorCSAgYSB2YWx1ZSBvZiAxMSBtZWFucyB0aGF0IHRoZSBsYXJnZXN0IGZyZWUgbWVtb3J5IGJsb2NrIGlzIDJeMTAgcGFnZXMuCisKIGNvbmZpZyBMRURTCiAJYm9vbCAiVGltZXIgYW5kIENQVSB1c2FnZSBMRURzIgogCWRlcGVuZHMgb24gQVJDSF9DREI4OTcxMiB8fCBBUkNIX0VCU0ExMTAgfHwgXApAQCAtMTM3MSw2ICsxMzg1LDI0IEBACiAJICBIb3dldmVyLCBpZiB0aGUgQ1BVIGRhdGEgY2FjaGUgaXMgdXNpbmcgYSB3cml0ZS1hbGxvY2F0ZSBtb2RlLAogCSAgdGhpcyBvcHRpb24gaXMgdW5saWtlbHkgdG8gcHJvdmlkZSBhbnkgcGVyZm9ybWFuY2UgZ2Fpbi4KIAorY29uZmlnIENDX1NUQUNLUFJPVEVDVE9SCisJYm9vbCAiRW5hYmxlIC1mc3RhY2stcHJvdGVjdG9yIGJ1ZmZlciBvdmVyZmxvdyBkZXRlY3Rpb24gKEVYUEVSSU1FTlRBTCkiCisJaGVscAorCSAgVGhpcyBvcHRpb24gdHVybnMgb24gdGhlIC1mc3RhY2stcHJvdGVjdG9yIEdDQyBmZWF0dXJlLiBUaGlzCisJICBmZWF0dXJlIHB1dHMsIGF0IHRoZSBiZWdpbm5pbmcgb2YgZnVuY3Rpb25zLCBhIGNhbmFyeSB2YWx1ZSBvbgorCSAgdGhlIHN0YWNrIGp1c3QgYmVmb3JlIHRoZSByZXR1cm4gYWRkcmVzcywgYW5kIHZhbGlkYXRlcworCSAgdGhlIHZhbHVlIGp1c3QgYmVmb3JlIGFjdHVhbGx5IHJldHVybmluZy4gIFN0YWNrIGJhc2VkIGJ1ZmZlcgorCSAgb3ZlcmZsb3dzICh0aGF0IG5lZWQgdG8gb3ZlcndyaXRlIHRoaXMgcmV0dXJuIGFkZHJlc3MpIG5vdyBhbHNvCisJICBvdmVyd3JpdGUgdGhlIGNhbmFyeSwgd2hpY2ggZ2V0cyBkZXRlY3RlZCBhbmQgdGhlIGF0dGFjayBpcyB0aGVuCisJICBuZXV0cmFsaXplZCB2aWEgYSBrZXJuZWwgcGFuaWMuCisJICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgZ2NjIHZlcnNpb24gNC4yIG9yIGFib3ZlLgorCitjb25maWcgREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QKKwlib29sICJQcm92aWRlIG9sZCB3YXkgdG8gcGFzcyBrZXJuZWwgcGFyYW1ldGVycyIKKwloZWxwCisJICBUaGlzIHdhcyBkZXByZWNhdGVkIGluIDIwMDEgYW5kIGFubm91bmNlZCB0byBsaXZlIG9uIGZvciA1IHllYXJzLgorCSAgU29tZSBvbGQgYm9vdCBsb2FkZXJzIHN0aWxsIHVzZSB0aGlzIHdheS4KKwogZW5kbWVudQogCiBtZW51ICJCb290IG9wdGlvbnMiCkBAIC0xNDgxLDYgKzE1MTMsMTA1IEBACiAJICBTaG91bGQgdGhlIGF0YWdzIHVzZWQgdG8gYm9vdCB0aGUga2VybmVsIGJlIGV4cG9ydGVkIGluIGFuICJhdGFncyIKIAkgIGZpbGUgaW4gcHJvY2ZzLiBVc2VmdWwgd2l0aCBrZXhlYy4KIAorY29uZmlnIEFVVE9fWlJFTEFERFIKKwlib29sICJBdXRvIGNhbGN1bGF0aW9uIG9mIHRoZSBkZWNvbXByZXNzZWQga2VybmVsIGltYWdlIGFkZHJlc3MiCisJZGVwZW5kcyBvbiAhWkJPT1RfUk9NICYmICFBUkNIX1UzMDAKKwloZWxwCisJICBaUkVMQUREUiBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUgZGVjb21wcmVzc2VkIGtlcm5lbAorCSAgaW1hZ2Ugd2lsbCBiZSBwbGFjZWQuIElmIEFVVE9fWlJFTEFERFIgaXMgc2VsZWN0ZWQsIHRoZSBhZGRyZXNzCisJICB3aWxsIGJlIGRldGVybWluZWQgYXQgcnVuLXRpbWUgYnkgbWFza2luZyB0aGUgY3VycmVudCBJUCB3aXRoCisJICAweGY4MDAwMDAwLiBUaGlzIGFzc3VtZXMgdGhlIHpJbWFnZSBiZWluZyBwbGFjZWQgaW4gdGhlIGZpcnN0IDEyOE1CCisJICBmcm9tIHN0YXJ0IG9mIG1lbW9yeS4KKworY29uZmlnIFpSRUxBRERSCisJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkZWNvbXByZXNzZWQga2VybmVsIGltYWdlIgorCWRlcGVuZHMgb24gIUFVVE9fWlJFTEFERFIKKwlkZWZhdWx0IDB4MDAwMDgwMDAgaWYgQVJDSF9CQ01SSU5HIHx8XAorCQlBUkNIX0NOUzNYWFggfHxcCisJCUFSQ0hfRE9WRSB8fFwKKwkJQVJDSF9FQlNBMTEwIHx8XAorCQlBUkNIX0ZPT1RCUklER0UgfHxcCisJCUFSQ0hfSU5URUdSQVRPUiB8fFwKKwkJQVJDSF9JT1AxM1hYIHx8XAorCQlBUkNIX0lPUDMzWCB8fFwKKwkJQVJDSF9JWFAyMDAwIHx8XAorCQlBUkNIX0lYUDIzWFggfHxcCisJCUFSQ0hfSVhQNFhYIHx8XAorCQlBUkNIX0tJUktXT09EIHx8XAorCQlBUkNIX0tTODY5NSB8fFwKKwkJQVJDSF9MT0tJIHx8XAorCQlBUkNIX01NUCB8fFwKKwkJQVJDSF9NVjc4WFgwIHx8XAorCQlBUkNIX05PTUFESUsgfHxcCisJCUFSQ0hfTlVDOTNYIHx8XAorCQlBUkNIX05TOVhYWCB8fFwKKwkJQVJDSF9PUklPTjVYIHx8XAorCQlBUkNIX1NQRUFSM1hYIHx8XAorCQlBUkNIX1NQRUFSNlhYIHx8XAorCQlBUkNIX1U4NTAwIHx8XAorCQlBUkNIX1ZFUlNBVElMRSB8fFwKKwkJQVJDSF9XOTBYOTAwCisJZGVmYXVsdCAweDA4MDA4MDAwIGlmIEFSQ0hfTVgxIHx8XAorCQlBUkNIX1NIQVJLCisJZGVmYXVsdCAweDEwMDA4MDAwIGlmIEFSQ0hfTVNNIHx8XAorCQlBUkNIX09NQVAxIHx8XAorCQlBUkNIX1JQQworCWRlZmF1bHQgMHgyMDAwODAwMCBpZiBBUkNIX1M1UDY0NDAgfHxcCisJCUFSQ0hfUzVQNjQ0MiB8fFwKKwkJQVJDSF9TNVBDMTAwIHx8XAorCQlBUkNIX1M1UFYyMTAKKwlkZWZhdWx0IDB4MzAwMDgwMDAgaWYgQVJDSF9TM0MyNDEwIHx8XAorCQlBUkNIX1MzQzI0MDAgfHxcCisJCUFSQ0hfUzNDMjQxMiB8fFwKKwkJQVJDSF9TM0MyNDE2IHx8XAorCQlBUkNIX1MzQzI0NDAgfHxcCisJCUFSQ0hfUzNDMjQ0MworCWRlZmF1bHQgMHg0MDAwODAwMCBpZiBBUkNIX1NUTVAzNzhYIHx8XAorCQlBUkNIX1NUTVAzN1hYIHx8XAorCQlBUkNIX1NINzM3MiB8fFwKKwkJQVJDSF9TSDczNzcKKwlkZWZhdWx0IDB4NTAwMDgwMDAgaWYgQVJDSF9TM0M2NFhYIHx8XAorCQlBUkNIX1NINzM2NworCWRlZmF1bHQgMHg2MDAwODAwMCBpZiBBUkNIX1ZFWFBSRVNTCisJZGVmYXVsdCAweDgwMDA4MDAwIGlmIEFSQ0hfTVgyNSB8fFwKKwkJQVJDSF9NWDMgfHxcCisJCUFSQ0hfTkVUWCB8fFwKKwkJQVJDSF9PTUFQMlBMVVMgfHxcCisJCUFSQ0hfUE5YNDAwOAorCWRlZmF1bHQgMHg5MDAwODAwMCBpZiBBUkNIX01YNSB8fFwKKwkJQVJDSF9NWDkxMjMxCisJZGVmYXVsdCAweGEwMDA4MDAwIGlmIEFSQ0hfSU9QMzJYIHx8XAorCQlBUkNIX1BYQSB8fFwKKwkJTUFDSF9NWDI3CisJZGVmYXVsdCAweGMwMDA4MDAwIGlmIEFSQ0hfTEg3QTQwWCB8fFwKKwkJTUFDSF9NWDIxCisJZGVmYXVsdCAweGYwMDA4MDAwIGlmIEFSQ0hfQUFFQzIwMDAgfHxcCisJCUFSQ0hfTDcyMDAKKwlkZWZhdWx0IDB4YzAwMjgwMDAgaWYgQVJDSF9DTFBTNzExWAorCWRlZmF1bHQgMHg3MDAwODAwMCBpZiBBUkNIX0FUOTEgJiYgKEFSQ0hfQVQ5MUNBUDkgfHwgQVJDSF9BVDkxU0FNOUc0NSkKKwlkZWZhdWx0IDB4MjAwMDgwMDAgaWYgQVJDSF9BVDkxICYmICEoQVJDSF9BVDkxQ0FQOSB8fCBBUkNIX0FUOTFTQU05RzQ1KQorCWRlZmF1bHQgMHhjMDAwODAwMCBpZiBBUkNIX0RBVklOQ0kgJiYgQVJDSF9EQVZJTkNJX0RBOFhYCisJZGVmYXVsdCAweDgwMDA4MDAwIGlmIEFSQ0hfREFWSU5DSSAmJiAhQVJDSF9EQVZJTkNJX0RBOFhYCisJZGVmYXVsdCAweDAwMDA4MDAwIGlmIEFSQ0hfRVA5M1hYICYmIEVQOTNYWF9TRENFM19TWU5DX1BIWVNfT0ZGU0VUCisJZGVmYXVsdCAweGMwMDA4MDAwIGlmIEFSQ0hfRVA5M1hYICYmIEVQOTNYWF9TRENFMF9QSFlTX09GRlNFVAorCWRlZmF1bHQgMHhkMDAwODAwMCBpZiBBUkNIX0VQOTNYWCAmJiBFUDkzWFhfU0RDRTFfUEhZU19PRkZTRVQKKwlkZWZhdWx0IDB4ZTAwMDgwMDAgaWYgQVJDSF9FUDkzWFggJiYgRVA5M1hYX1NEQ0UyX1BIWVNfT0ZGU0VUCisJZGVmYXVsdCAweGYwMDA4MDAwIGlmIEFSQ0hfRVA5M1hYICYmIEVQOTNYWF9TRENFM19BU1lOQ19QSFlTX09GRlNFVAorCWRlZmF1bHQgMHgwMDAwODAwMCBpZiBBUkNIX0dFTUlOSSAmJiBHRU1JTklfTUVNX1NXQVAKKwlkZWZhdWx0IDB4MTAwMDgwMDAgaWYgQVJDSF9HRU1JTkkgJiYgIUdFTUlOSV9NRU1fU1dBUAorCWRlZmF1bHQgMHg3MDAwODAwMCBpZiBBUkNIX1JFQUxWSUVXICYmIFJFQUxWSUVXX0hJR0hfUEhZU19PRkZTRVQKKwlkZWZhdWx0IDB4MDAwMDgwMDAgaWYgQVJDSF9SRUFMVklFVyAmJiAhUkVBTFZJRVdfSElHSF9QSFlTX09GRlNFVAorCWRlZmF1bHQgMHhjMDIwODAwMCBpZiBBUkNIX1NBMTEwMCAmJiBTQTExMTEKKwlkZWZhdWx0IDB4YzAwMDgwMDAgaWYgQVJDSF9TQTExMDAgJiYgIVNBMTExMQorCWRlZmF1bHQgMHgzMDEwODAwMCBpZiBBUkNIX1MzQzI0MTAgJiYgUE1fSDE5NDAKKwlkZWZhdWx0IDB4MjhFMDgwMDAgaWYgQVJDSF9VMzAwICYmIE1BQ0hfVTMwMF9TSU5HTEVfUkFNCisJZGVmYXVsdCAweDQ4MDA4MDAwIGlmIEFSQ0hfVTMwMCAmJiAhTUFDSF9VMzAwX1NJTkdMRV9SQU0KKwloZWxwCisJICBaUkVMQUREUiBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUgZGVjb21wcmVzc2VkIGtlcm5lbAorCSAgaW1hZ2Ugd2lsbCBiZSBwbGFjZWQuIFpSRUxBRERSIGhhcyB0byBiZSBzcGVjaWZpZWQgd2hlbiB0aGUKKwkgIGFzc3VtcHRpb24gb2YgQVVUT19aUkVMQUREUiBpcyBub3QgdmFsaWQsIG9yIHdoZW4gWkJPT1RfUk9NIGlzCisJICBzZWxlY3RlZC4KKwogZW5kbWVudQogCiBtZW51ICJDUFUgUG93ZXIgTWFuYWdlbWVudCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggNjRiYTMxMy4uNjNkOTk4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDEwIEBACiBLQlVJTERfQ0ZMQUdTCSs9LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLW1hcGNzIC1tbm8tc2NoZWQtcHJvbG9nCiBlbmRpZgogCitpZmVxICgkKENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUikseSkKK0tCVUlMRF9DRkxBR1MJKz0tZnN0YWNrLXByb3RlY3RvcgorZW5kaWYKKwogaWZlcSAoJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pLHkpCiBLQlVJTERfQ1BQRkxBR1MJKz0gLW1iaWctZW5kaWFuCiBBUwkJKz0gLUVCCkBAIC0xMzksMTQgKzE0MywxNCBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDRYWCkJCTo9IGl4cDR4eAogbWFjaGluZS0kKENPTkZJR19BUkNIX0tJUktXT09EKQkJOj0ga2lya3dvb2QKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9LUzg2OTUpCQk6PSBrczg2OTUKLW1hY2hpbmUtJChDT05GSUdfQVJDSF9MNzIwMCkJCTo9IGw3MjAwCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTEg3QTQwWCkJCTo9IGxoN2E0MHgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9MT0tJKSAJCTo9IGxva2kKK21hY2hpbmUtJChDT05GSUdfQVJDSF9MUEMzMlhYKQkJOj0gbHBjMzJ4eAogbWFjaGluZS0kKENPTkZJR19BUkNIX01NUCkJCTo9IG1tcAogbWFjaGluZS0kKENPTkZJR19BUkNIX01TTSkJCTo9IG1zbQogbWFjaGluZS0kKENPTkZJR19BUkNIX01WNzhYWDApCQk6PSBtdjc4eHgwCi1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgxKQkJOj0gbXgxCi1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyKQkJOj0gbXgyCittYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgxKQkJOj0gaW14CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyKQkJOj0gaW14CiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyNSkJCTo9IG14MjUKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NWDMpCQk6PSBteDMKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NWDUpCQk6PSBteDUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L01ha2VmaWxlCmluZGV4IDRhNTkwZjQuLmY3MDUyMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQpAQCAtMTQsMTggKzE0LDE2IEBACiBNS0lNQUdFICAgICAgICAgOj0gJChzcmN0cmVlKS9zY3JpcHRzL21rdWJvb3Quc2gKIAogaWZuZXEgKCQoTUFDSElORSksKQotaW5jbHVkZSAkKHNyY3RyZWUpLyQoTUFDSElORSkvTWFrZWZpbGUuYm9vdAorLWluY2x1ZGUgJChzcmN0cmVlKS8kKE1BQ0hJTkUpL01ha2VmaWxlLmJvb3QKIGVuZGlmCiAKICMgTm90ZTogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYWx3YXlzIGJlIHRydWU6Ci0jICAgWlJFTEFERFIgPT0gdmlydF90b19waHlzKFBBR0VfT0ZGU0VUICsgVEVYVF9PRkZTRVQpCiAjICAgUEFSQU1TX1BIWVMgbXVzdCBiZSB3aXRoaW4gNE1CIG9mIFpSRUxBRERSCiAjICAgSU5JVFJEX1BIWVMgbXVzdCBiZSBpbiBSQU0KLVpSRUxBRERSICAgIDo9ICQoenJlbGFkZHIteSkKIFBBUkFNU19QSFlTIDo9ICQocGFyYW1zX3BoeXMteSkKIElOSVRSRF9QSFlTIDo9ICQoaW5pdHJkX3BoeXMteSkKIAotZXhwb3J0IFpSRUxBRERSIElOSVRSRF9QSFlTIFBBUkFNU19QSFlTCitleHBvcnQgSU5JVFJEX1BIWVMgUEFSQU1TX1BIWVMKIAogdGFyZ2V0cyA6PSBJbWFnZSB6SW1hZ2UgeGlwSW1hZ2UgYm9vdHBJbWFnZSB1SW1hZ2UKIApAQCAtNjcsNyArNjUsNyBAQAogaWZlcSAoJChDT05GSUdfWkJPT1RfUk9NKSx5KQogJChvYmopL3VJbWFnZTogTE9BREFERFI9JChDT05GSUdfWkJPT1RfUk9NX1RFWFQpCiBlbHNlCi0kKG9iaikvdUltYWdlOiBMT0FEQUREUj0kKFpSRUxBRERSKQorJChvYmopL3VJbWFnZTogTE9BREFERFI9JChDT05GSUdfWlJFTEFERFIpCiBlbmRpZgogCiBpZmVxICgkKENPTkZJR19USFVNQjJfS0VSTkVMKSx5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDUzZmFhOTAuLjc2MzZjOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAjIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eiBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CiAjCiAKK0FGTEFHU19oZWFkLm8gKz0gLURURVhUX09GRlNFVD0kKFRFWFRfT0ZGU0VUKQogSEVBRAk9IGhlYWQubwogT0JKUwk9IG1pc2MubyBkZWNvbXByZXNzLm8KIEZPTlRDCT0gJChzcmN0cmVlKS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZm9udF9hY29ybl84eDguYwpAQCAtMTksMTAgKzIwLDYgQEAKIE9CSlMJCSs9IGhlYWQtc2hhcmsubyBvZnctc2hhcmsubwogZW5kaWYKIAotaWZlcSAoJChDT05GSUdfQVJDSF9MNzIwMCkseSkKLU9CSlMJCSs9IGhlYWQtbDcyMDAubwotZW5kaWYKLQogaWZlcSAoJChDT05GSUdfQVJDSF9QNzIwVCkseSkKICMgQm9ycm93IHRoaXMgY29kZSBmcm9tIFNBMTEwMAogT0JKUwkJKz0gaGVhZC1zYTExMDAubwpAQCAtNzEsNiArNjgsOSBAQAogCQkgcGlnZ3kuJChzdWZmaXhfeSkgcGlnZ3kuJChzdWZmaXhfeSkubyBcCiAJCSBmb250Lm8gZm9udC5jIGhlYWQubyBtaXNjLm8gJChPQkpTKQogCisjIE1ha2Ugc3VyZSBmaWxlcyBhcmUgcmVtb3ZlZCBkdXJpbmcgY2xlYW4KK2V4dHJhLXkgICAgICAgKz0gcGlnZ3kuZ3ppcCBwaWdneS5sem8gcGlnZ3kubHptYSBsaWIxZnVuY3MuUworCiBpZmVxICgkKENPTkZJR19GVU5DVElPTl9UUkFDRVIpLHkpCiBPUklHX0NGTEFHUyA6PSAkKEtCVUlMRF9DRkxBR1MpCiBLQlVJTERfQ0ZMQUdTID0gJChzdWJzdCAtcGcsICwgJChPUklHX0NGTEFHUykpCkBAIC03OSwxOSArNzksOSBAQAogRVhUUkFfQ0ZMQUdTICA6PSAtZnBpYyAtZm5vLWJ1aWx0aW4KIEVYVFJBX0FGTEFHUyAgOj0gLVdhLC1tYXJjaD1hbGwKIAotIyBTdXBwbHkgWlJFTEFERFIsIElOSVRSRF9QSFlTIGFuZCBQQVJBTVNfUEhZUyB0byB0aGUgZGVjb21wcmVzc29yIHZpYQotIyBsaW5rZXIgc3ltYm9scy4gIFdlIG9ubHkgZGVmaW5lIGluaXRyZF9waHlzIGFuZCBwYXJhbXNfcGh5cyBpZiB0aGUKLSMgbWFjaGluZSBjbGFzcyBkZWZpbmVkIHRoZSBjb3JyZXNwb25kaW5nIG1ha2VmaWxlIHZhcmlhYmxlLgotTERGTEFHU192bWxpbnV4IDo9IC0tZGVmc3ltIHpyZWxhZGRyPSQoWlJFTEFERFIpCiBpZmVxICgkKENPTkZJR19DUFVfRU5ESUFOX0JFOCkseSkKIExERkxBR1Nfdm1saW51eCArPSAtLWJlOAogZW5kaWYKLWlmbmVxICgkKElOSVRSRF9QSFlTKSwpCi1MREZMQUdTX3ZtbGludXggKz0gLS1kZWZzeW0gaW5pdHJkX3BoeXM9JChJTklUUkRfUEhZUykKLWVuZGlmCi1pZm5lcSAoJChQQVJBTVNfUEhZUyksKQotTERGTEFHU192bWxpbnV4ICs9IC0tZGVmc3ltIHBhcmFtc19waHlzPSQoUEFSQU1TX1BIWVMpCi1lbmRpZgogIyA/CiBMREZMQUdTX3ZtbGludXggKz0gLXAKICMgUmVwb3J0IHVucmVzb2x2ZWQgc3ltYm9sIHJlZmVyZW5jZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZS5kZWJ1ZyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZS5kZWJ1ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxYTAzNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUuZGVidWcKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIGxpbnV4L2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQotIwotIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eAotIwotCi1DT01QUkVTU0VEX0VYVFJBPS4uLy4uL2xpYi9sbF9jaGFyX3dyLm8KLU9CSkVDVFM9bWlzYy1kZWJ1Zy5vIGxsX2NoYXJfd3IuYW91dC5vCi0KLUNGTEFHUz0tRF9fS0VSTkVMX18gLU8yIC1EU1REQ19IRUFERVJTIC1EU1RBTkRBTE9ORV9ERUJVRyAtV2FsbCAtSS4uLy4uLy4uLy4uL2luY2x1ZGUgLWMKLQotdGVzdC1nemlwOiBwaWdneS5hb3V0Lm8gJChPQkpFQ1RTKQotCSQoQ0MpIC1vICRAICQoT0JKRUNUUykgcGlnZ3kuYW91dC5vCi0KLW1pc2MtZGVidWcubzogbWlzYy5jCi0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pc2MuYwotCi1waWdneS5hb3V0Lm86IHBpZ2d5Lm8KLQlhcm0tbGludXhlbGYtb2JqY29weSAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgLUkgZWxmMzItYXJtIC1PIGFybS1hb3V0MzItbGludXggcGlnZ3kubyBwaWdneS5hb3V0Lm8KLQotbGxfY2hhcl93ci5hb3V0Lm86ICQoQ09NUFJFU1NFRF9FWFRSQSkKLQlhcm0tbGludXhlbGYtb2JqY29weSAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgLUkgZWxmMzItYXJtIC1PIGFybS1hb3V0MzItbGludXggJChDT01QUkVTU0VEX0VYVFJBKSBsbF9jaGFyX3dyLmFvdXQubwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1sNzIwMC5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtbDcyMDAuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlM2IyMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1sNzIwMC5TCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogCi0gKiBsaW51eC9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1sNzIwMC5TCi0gKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZSBIaWxsIDxzamhpbGxAY290dy5jb20+Ci0gKiAKLSAqIFNvbWUgY29kZSBib3Jyb3dlZCBmcm9tIE5pY29sYXMgUGl0cmUncyAnaGVhZC1zYTExMDAuUycgZmlsZS4gVGhpcwotICogaXMgbWVyZ2VkIHdpdGggaGVhZC5TIGJ5IHRoZSBsaW5rZXIuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpZm5kZWYgQ09ORklHX0FSQ0hfTDcyMDAKLSNlcnJvciBXaGF0IGFtIEkgZG9pbmcgaGVyZS4uLgotI2VuZGlmCi0KLQkJLnNlY3Rpb24gICAgICAgICIuc3RhcnQiLCAiYXgiCi0KLV9fTDcyMDBfc3RhcnQ6Ci0JCW1vdglyMCwgIzB4MDAxMDAwMDAJCUAgRkxBU0ggYWRkcmVzcyBvZiBpbml0cmQKLQkJbW92CXIyLCAjMHhmMTAwMDAwMAkJQCBSQU0gYWRkcmVzcyBvZiBpbml0cmQKLQkJYWRkCXIzLCByMiwgIzB4MDA3MDAwMDAJQCBTaXplIG9mIGluaXRyZCAKLTE6Ci0JCWxkbWlhICAgcjAhLCB7cjQsIHI1LCByNiwgcjd9Ci0JCXN0bWlhICAgcjIhLCB7cjQsIHI1LCByNiwgcjd9Ci0JCWNtcAlyMiwgcjMKLQkJYmxlCTFiCi0KLQkJbW92CXI4LCAjMAkJCUAgWmVybyBpdCBvdXQKLQkJbW92CXI3LCAjTUFDSF9UWVBFX0w3MjAwCUAgU2V0IGFyY2hpdGVjdHVyZSBJRApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggYzUxOTFiMS4uYWJmNGQ2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC0xNzAsOSArMTcwLDE2IEBACiAKIAkJLnRleHQKIAkJYWRyCXIwLCBMQzAKLSBBUk0oCQlsZG1pYQlyMCwge3IxLCByMiwgcjMsIHI0LCByNSwgcjYsIHIxMSwgaXAsIHNwfSkKLSBUSFVNQigJCWxkbWlhCXIwLCB7cjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjExLCBpcH0JKQorIEFSTSgJCWxkbWlhCXIwLCB7cjEsIHIyLCByMywgcjUsIHI2LCByMTEsIGlwLCBzcH0pCisgVEhVTUIoCQlsZG1pYQlyMCwge3IxLCByMiwgcjMsIHI1LCByNiwgcjExLCBpcH0JKQogIFRIVU1CKAkJbGRyCXNwLCBbcjAsICMzMl0JCQkJKQorI2lmZGVmIENPTkZJR19BVVRPX1pSRUxBRERSCisJCUAgZGV0ZXJtaW5lIGZpbmFsIGtlcm5lbCBpbWFnZSBhZGRyZXNzCisJCWFuZAlyNCwgcGMsICMweGY4MDAwMDAwCisJCWFkZAlyNCwgcjQsICNURVhUX09GRlNFVAorI2Vsc2UKKwkJbGRyCXI0LCA9Q09ORklHX1pSRUxBRERSCisjZW5kaWYKIAkJc3VicwlyMCwgcjAsIHIxCQlAIGNhbGN1bGF0ZSB0aGUgZGVsdGEgb2Zmc2V0CiAKIAkJCQkJCUAgaWYgZGVsdGEgaXMgemVybywgd2UgYXJlCkBAIC0zMTAsMTggKzMxNywxNyBAQAogTEMwOgkJLndvcmQJTEMwCQkJQCByMQogCQkud29yZAlfX2Jzc19zdGFydAkJQCByMgogCQkud29yZAlfZW5kCQkJQCByMwotCQkud29yZAl6cmVsYWRkcgkJQCByNAogCQkud29yZAlfc3RhcnQJCQlAIHI1CiAJCS53b3JkCV9pbWFnZV9zaXplCQlAIHI2CiAJCS53b3JkCV9nb3Rfc3RhcnQJCUAgcjExCiAJCS53b3JkCV9nb3RfZW5kCQlAIGlwCi0JCS53b3JkCXVzZXJfc3RhY2srNDA5NgkJQCBzcAorCQkud29yZAl1c2VyX3N0YWNrX2VuZAkJQCBzcAogTEMxOgkJLndvcmQJcmVsb2NfZW5kIC0gcmVsb2Nfc3RhcnQKIAkJLnNpemUJTEMwLCAuIC0gTEMwCiAKICNpZmRlZiBDT05GSUdfQVJDSF9SUEMKIAkJLmdsb2JsCXBhcmFtcwotcGFyYW1zOgkJbGRyCXIwLCA9cGFyYW1zX3BoeXMKK3BhcmFtczoJCWxkcglyMCwgPTB4MTAwMDAxMDAJCUAgcGFyYW1zX3BoeXMgZm9yIFJQQwogCQltb3YJcGMsIGxyCiAJCS5sdG9yZwogCQkuYWxpZ24KQEAgLTMzOSw5ICszNDUsOCBAQAogICogIHI0ID0ga2VybmVsIGV4ZWN1dGlvbiBhZGRyZXNzCiAgKiAgcjcgPSBhcmNoaXRlY3R1cmUgbnVtYmVyCiAgKiAgcjggPSBhdGFncyBwb2ludGVyCi0gKiAgcjkgPSBydW4tdGltZSBhZGRyZXNzIG9mICJzdGFydCIgICg/Pz8pCiAgKiBPbiBleGl0LAotICogIHIxLCByMiwgcjMsIHI5LCByMTAsIHIxMiBjb3JydXB0ZWQKKyAqICByMCwgcjEsIHIyLCByMywgcjksIHIxMCwgcjEyIGNvcnJ1cHRlZAogICogVGhpcyByb3V0aW5lIG11c3QgcHJlc2VydmU6CiAgKiAgcjQsIHI1LCByNiwgcjcsIHI4CiAgKi8KQEAgLTM5NiwxMiArNDAxLDE4IEBACiAKIAkJbW92CXIwLCAjMAogCQltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBjYWNoZSB2MworCQkvKgorCQkgKiA/PyBBUk12MyBNTVUgZG9lcyBub3QgYWxsb3cgcmVhZGluZyB0aGUgY29udHJvbCByZWdpc3RlciwKKwkJICogZG9lcyB0aGlzIHJlYWxseSB3b3JrIG9uIEFSTXYzIE1QVT8KKwkJICovCiAJCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJQCByZWFkIGNvbnRyb2wgcmVnCiAJCQkJCQlAIC4uLi4gLi4uLiAuLi4uIFdDLk0KIAkJb3JyCXIwLCByMCwgIzB4MDAwZAkJQCAuLi4uIC4uLi4gLi4uLiAxMS4xCisJCS8qID8/IHRoaXMgb3ZlcndyaXRlcyB0aGUgdmFsdWUgY29uc3RydWN0ZWQgYWJvdmU/ICovCiAJCW1vdglyMCwgIzAKIAkJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAlAIHdyaXRlIGNvbnRyb2wgcmVnCiAKKwkJLyogPz8gaW52YWxpZGF0ZSBmb3IgdGhlIHNlY29uZCB0aW1lPyAqLwogCQltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBjYWNoZSB2MwogCQltb3YJcGMsIGxyCiAKQEAgLTc3MSw4ICs3ODIsMTAgQEAKICAqIFR1cm4gb2ZmIHRoZSBDYWNoZSBhbmQgTU1VLiAgQVJNdjMgZG9lcyBub3Qgc3VwcG9ydAogICogcmVhZGluZyB0aGUgY29udHJvbCByZWdpc3RlciwgYnV0IEFSTXY0IGRvZXMuCiAgKgotICogT24gZXhpdCwgcjAsIHIxLCByMiwgcjMsIHI5LCByMTIgY29ycnVwdGVkCi0gKiBUaGlzIHJvdXRpbmUgbXVzdCBwcmVzZXJ2ZTogcjQsIHI2LCByNworICogT24gZXhpdCwKKyAqICByMCwgcjEsIHIyLCByMywgcjksIHIxMiBjb3JydXB0ZWQKKyAqIFRoaXMgcm91dGluZSBtdXN0IHByZXNlcnZlOgorICogIHI0LCByNiwgcjcKICAqLwogCQkuYWxpZ24JNQogY2FjaGVfb2ZmOgltb3YJcjMsICMxMgkJCUAgY2FjaGVfb2ZmIGZ1bmN0aW9uCkBAIC04NDUsNyArODU4LDcgQEAKICAqIENsZWFuIGFuZCBmbHVzaCB0aGUgY2FjaGUgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kuCiAgKgogICogT24gZXhpdCwKLSAqICByMSwgcjIsIHIzLCByOSwgcjExLCByMTIgY29ycnVwdGVkCisgKiAgcjEsIHIyLCByMywgcjksIHIxMCwgcjExLCByMTIgY29ycnVwdGVkCiAgKiBUaGlzIHJvdXRpbmUgbXVzdCBwcmVzZXJ2ZToKICAqICByMCwgcjQsIHI1LCByNiwgcjcKICAqLwpAQCAtOTg4LDcgKzEwMDEsNyBAQAogX19hcm12M19tbXVfY2FjaGVfZmx1c2g6CiBfX2FybXYzX21wdV9jYWNoZV9mbHVzaDoKIAkJbW92CXIxLCAjMAotCQltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBjYWNoZSB2MworCQltY3IJcDE1LCAwLCByMSwgYzcsIGMwLCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBjYWNoZSB2MwogCQltb3YJcGMsIGxyCiAKIC8qCkBAIC0xMDAxLDYgKzEwMTQsNyBAQAogcGhleGJ1ZjoJLnNwYWNlCTEyCiAJCS5zaXplCXBoZXhidWYsIC4gLSBwaGV4YnVmCiAKK0AgcGhleCBjb3JydXB0cyB7cjAsIHIxLCByMiwgcjN9CiBwaGV4OgkJYWRyCXIzLCBwaGV4YnVmCiAJCW1vdglyMiwgIzAKIAkJc3RyYglyMiwgW3IzLCByMV0KQEAgLTEwMTUsNiArMTAyOSw3IEBACiAJCXN0cmIJcjIsIFtyMywgcjFdCiAJCWIJMWIKIAorQCBwdXRzIGNvcnJ1cHRzIHtyMCwgcjEsIHIyLCByM30KIHB1dHM6CQlsb2Fkc3AJcjMsIHIxCiAxOgkJbGRyYglyMiwgW3IwXSwgIzEKIAkJdGVxCXIyLCAjMApAQCAtMTAyOSwxMiArMTA0NCwxNCBAQAogCQl0ZXEJcjAsICMwCiAJCWJuZQkxYgogCQltb3YJcGMsIGxyCitAIHB1dGMgY29ycnVwdHMge3IwLCByMSwgcjIsIHIzfQogcHV0YzoKIAkJbW92CXIyLCByMAogCQltb3YJcjAsICMwCiAJCWxvYWRzcAlyMywgcjEKIAkJYgkyYgogCitAIG1lbWR1bXAgY29ycnVwdHMge3IwLCByMSwgcjIsIHIzLCByMTAsIHIxMSwgcjEyLCBscn0KIG1lbWR1bXA6CW1vdglyMTIsIHIwCiAJCW1vdglyMTAsIGxyCiAJCW1vdglyMTEsICMwCkBAIC0xMDcwLDMgKzEwODcsNCBAQAogCQkuYWxpZ24KIAkJLnNlY3Rpb24gIi5zdGFjayIsICJ3IgogdXNlcl9zdGFjazoJLnNwYWNlCTQwOTYKK3VzZXJfc3RhY2tfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggZDJiMmVmNC4uZTY1M2E2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0yOCw5ICsyOCw2IEBACiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKLSNpZmRlZiBTVEFOREFMT05FX0RFQlVHCi0jZGVmaW5lIHB1dHN0ciBwcmludGYKLSNlbHNlCiAKIHN0YXRpYyB2b2lkIHB1dHN0cihjb25zdCBjaGFyICpwdHIpOwogZXh0ZXJuIHZvaWQgZXJyb3IoY2hhciAqeCk7CkBAIC0xMTYsNyArMTEzLDYgQEAKIAlmbHVzaCgpOwogfQogCi0jZW5kaWYKIAogdm9pZCAqbWVtY3B5KHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKIHsKQEAgLTE4Niw3ICsxODIsNiBAQAogCiBleHRlcm4gdm9pZCBkb19kZWNvbXByZXNzKHU4ICppbnB1dCwgaW50IGxlbiwgdTggKm91dHB1dCwgdm9pZCAoKmVycm9yKShjaGFyICp4KSk7CiAKLSNpZm5kZWYgU1RBTkRBTE9ORV9ERUJVRwogCiB1bnNpZ25lZCBsb25nCiBkZWNvbXByZXNzX2tlcm5lbCh1bnNpZ25lZCBsb25nIG91dHB1dF9zdGFydCwgdW5zaWduZWQgbG9uZyBmcmVlX21lbV9wdHJfcCwKQEAgLTIxMSwxOCArMjA2LDMgQEAKIAlwdXRzdHIoIiBkb25lLCBib290aW5nIHRoZSBrZXJuZWwuXG4iKTsKIAlyZXR1cm4gb3V0cHV0X3B0cjsKIH0KLSNlbHNlCi0KLWNoYXIgb3V0cHV0X2J1ZmZlclsxNTAwKjEwMjRdOwotCi1pbnQgbWFpbigpCi17Ci0Jb3V0cHV0X2RhdGEgPSBvdXRwdXRfYnVmZmVyOwotCi0JcHV0c3RyKCJVbmNvbXByZXNzaW5nIExpbnV4Li4uIik7Ci0JZGVjb21wcmVzcyhpbnB1dF9kYXRhLCBpbnB1dF9kYXRhX2VuZCAtIGlucHV0X2RhdGEsCi0JCQlOVUxMLCBOVUxMLCBvdXRwdXRfZGF0YSwgTlVMTCwgZXJyb3IpOwotCXB1dHN0cigiZG9uZS5cbiIpOwotCXJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggMzM3NzQxZi4uN2RmYTlhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtMTA4LDYgKzEwOCw1MSBAQAogCXNwaW5fdW5sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKIH0KIAorc3RhdGljIGludCBnaWNfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gZ2ljX2Rpc3RfYmFzZShpcnEpOworCXVuc2lnbmVkIGludCBnaWNpcnEgPSBnaWNfaXJxKGlycSk7CisJdTMyIGVuYWJsZW1hc2sgPSAxIDw8IChnaWNpcnEgJSAzMik7CisJdTMyIGVuYWJsZW9mZiA9IChnaWNpcnEgLyAzMikgKiA0OworCXUzMiBjb25mbWFzayA9IDB4MiA8PCAoKGdpY2lycSAlIDE2KSAqIDIpOworCXUzMiBjb25mb2ZmID0gKGdpY2lycSAvIDE2KSAqIDQ7CisJYm9vbCBlbmFibGVkID0gZmFsc2U7CisJdTMyIHZhbDsKKworCS8qIEludGVycnVwdCBjb25maWd1cmF0aW9uIGZvciBTR0lzIGNhbid0IGJlIGNoYW5nZWQgKi8KKwlpZiAoZ2ljaXJxIDwgMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHR5cGUgIT0gSVJRX1RZUEVfTEVWRUxfSElHSCAmJiB0eXBlICE9IElSUV9UWVBFX0VER0VfUklTSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisKKwl2YWwgPSByZWFkbChiYXNlICsgR0lDX0RJU1RfQ09ORklHICsgY29uZm9mZik7CisJaWYgKHR5cGUgPT0gSVJRX1RZUEVfTEVWRUxfSElHSCkKKwkJdmFsICY9IH5jb25mbWFzazsKKwllbHNlIGlmICh0eXBlID09IElSUV9UWVBFX0VER0VfUklTSU5HKQorCQl2YWwgfD0gY29uZm1hc2s7CisKKwkvKgorCSAqIEFzIHJlY29tbWVuZGVkIGJ5IHRoZSBzcGVjLCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgYmVmb3JlIGNoYW5naW5nCisJICogdGhlIGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlpZiAocmVhZGwoYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQgKyBlbmFibGVvZmYpICYgZW5hYmxlbWFzaykgeworCQl3cml0ZWwoZW5hYmxlbWFzaywgYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUiArIGVuYWJsZW9mZik7CisJCWVuYWJsZWQgPSB0cnVlOworCX0KKworCXdyaXRlbCh2YWwsIGJhc2UgKyBHSUNfRElTVF9DT05GSUcgKyBjb25mb2ZmKTsKKworCWlmIChlbmFibGVkKQorCQl3cml0ZWwoZW5hYmxlbWFzaywgYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQgKyBlbmFibGVvZmYpOworCisJc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgaW50IGdpY19zZXRfY3B1KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrX3ZhbCkKIHsKQEAgLTE2MSw2ICsyMDYsNyBAQAogCS5hY2sJCT0gZ2ljX2Fja19pcnEsCiAJLm1hc2sJCT0gZ2ljX21hc2tfaXJxLAogCS51bm1hc2sJCT0gZ2ljX3VubWFza19pcnEsCisJLnNldF90eXBlCT0gZ2ljX3NldF90eXBlLAogI2lmZGVmIENPTkZJR19TTVAKIAkuc2V0X2FmZmluaXR5CT0gZ2ljX3NldF9jcHUsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwppbmRleCA2ZjgwNjY1Li41MTdkNTBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC0xODUsMTMgKzE4NSwxMCBAQAogCX0sCiB9OwogCi12b2lkIF9faW5pdCBzYTExMTFfYWRqdXN0X3pvbmVzKGludCBub2RlLCB1bnNpZ25lZCBsb25nICpzaXplLCB1bnNpZ25lZCBsb25nICpob2xlcykKK3ZvaWQgX19pbml0IHNhMTExMV9hZGp1c3Rfem9uZXModW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgbG9uZyAqaG9sZXMpCiB7CiAJdW5zaWduZWQgaW50IHN6ID0gU1pfMU0gPj4gUEFHRV9TSElGVDsKIAotCWlmIChub2RlICE9IDApCi0JCXN6ID0gMDsKLQogCXNpemVbMV0gPSBzaXplWzBdIC0gc3o7CiAJc2l6ZVswXSA9IHN6OwogfQpAQCAtMTAyOCwxMyArMTAyNSwxMiBAQAogCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaWYgKHNhY2hpcCkgewotCQlfX3NhMTExMV9yZW1vdmUoc2FjaGlwKTsKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KICNpZmRlZiBDT05GSUdfUE0KIAkJa2ZyZWUoc2FjaGlwLT5zYXZlZF9zdGF0ZSk7CiAJCXNhY2hpcC0+c2F2ZWRfc3RhdGUgPSBOVUxMOwogI2VuZGlmCisJCV9fc2ExMTExX3JlbW92ZShzYWNoaXApOworCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mva2lya3dvb2RfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9raXJrd29vZF9kZWZjb25maWcKaW5kZXggZjJlM2E5MC4uY2NjOWM5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9raXJrd29vZF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9raXJrd29vZF9kZWZjb25maWcKQEAgLTEzLDExICsxMywxOSBAQAogQ09ORklHX01BQ0hfUkQ4OEY2MjgxPXkKIENPTkZJR19NQUNIX01WODhGNjI4MUdUV19HRT15CiBDT05GSUdfTUFDSF9TSEVFVkFQTFVHPXkKK0NPTkZJR19NQUNIX0VTQVRBX1NIRUVWQVBMVUc9eQorQ09ORklHX01BQ0hfR1VSVVBMVUc9eQogQ09ORklHX01BQ0hfVFMyMTk9eQogQ09ORklHX01BQ0hfVFM0MVg9eQogQ09ORklHX01BQ0hfT1BFTlJEX0JBU0U9eQogQ09ORklHX01BQ0hfT1BFTlJEX0NMSUVOVD15CitDT05GSUdfTUFDSF9PUEVOUkRfVUxUSU1BVEU9eQogQ09ORklHX01BQ0hfTkVUU1BBQ0VfVjI9eQorQ09ORklHX01BQ0hfSU5FVFNQQUNFX1YyPXkKK0NPTkZJR19NQUNIX05FVFNQQUNFX01BWF9WMj15CitDT05GSUdfTUFDSF9ORVQyQklHX1YyPXkKK0NPTkZJR19NQUNIX05FVDVCSUdfVjI9eQorQ09ORklHX01BQ0hfVDUzMjU9eQogIyBDT05GSUdfQ1BVX0ZFUk9DRU9OX09MRF9JRCBpcyBub3Qgc2V0CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2x1c2w3MjAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHVzbDcyMDBfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZmYzQyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbHVzbDcyMDBfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLUNPTkZJR19FTUJFRERFRD15Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19BUkNIX0w3MjAwPXkKLSMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0Ci1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwMDAxMDAwMAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHhmMDNlMDAwMAotQ09ORklHX1pCT09UX1JPTT15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHkwIGNvbnNvbGU9dHR5TFUxLDExNTIwMCByb290PS9kZXYvcmFtIGluaXRyZD0weGYxMDAwMDAwLDB4MDA1ZGFjN2IgbWVtPTMyTSIKLUNPTkZJR19CSU5GTVRfQU9VVD15Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19WVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggNTE2NjJmZS4uNjc1MGI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmgKQEAgLTEyMSw0ICsxMjEsOCBAQAogZXh0ZXJuIHZvaWQgZWxmX3NldF9wZXJzb25hbGl0eShjb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICopOwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpCWVsZl9zZXRfcGVyc29uYWxpdHkoJihleCkpCiAKK3N0cnVjdCBtbV9zdHJ1Y3Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdjYXAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3Y2FwLmgKaW5kZXggZjdiZDUyYi4uYzEwNjJjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdjYXAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9od2NhcC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIEhXQ0FQX05FT04JNDA5NgogI2RlZmluZSBIV0NBUF9WRlB2Mwk4MTkyCiAjZGVmaW5lIEhXQ0FQX1ZGUHYzRDE2CTE2Mzg0CisjZGVmaW5lIEhXQ0FQX1RMUwkzMjc2OAogCiAjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggYzk4MDE1Ni4uMTI2MWIxZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIC8qCiAgKiBJU0EgSS9PIGJ1cyBtZW1vcnkgYWRkcmVzc2VzIGFyZSAxOjEgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4KQEAgLTE3OSwyNSArMTgwLDM4IEBACiAgKiBJTyBwb3J0IHByaW1pdGl2ZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgKi8KICNpZmRlZiBfX21lbV9wY2kKLSNkZWZpbmUgcmVhZGIoYykgKHsgX191OCAgX192ID0gX19yYXdfcmVhZGIoX19tZW1fcGNpKGMpKTsgX192OyB9KQotI2RlZmluZSByZWFkdyhjKSAoeyBfX3UxNiBfX3YgPSBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpIFwKKyNkZWZpbmUgcmVhZGJfcmVsYXhlZChjKSAoeyB1OCAgX192ID0gX19yYXdfcmVhZGIoX19tZW1fcGNpKGMpKTsgX192OyB9KQorI2RlZmluZSByZWFkd19yZWxheGVkKGMpICh7IHUxNiBfX3YgPSBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpIFwKIAkJCQkJX19yYXdfcmVhZHcoX19tZW1fcGNpKGMpKSk7IF9fdjsgfSkKLSNkZWZpbmUgcmVhZGwoYykgKHsgX191MzIgX192ID0gbGUzMl90b19jcHUoKF9fZm9yY2UgX19sZTMyKSBcCisjZGVmaW5lIHJlYWRsX3JlbGF4ZWQoYykgKHsgdTMyIF9fdiA9IGxlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMikgXAogCQkJCQlfX3Jhd19yZWFkbChfX21lbV9wY2koYykpKTsgX192OyB9KQotI2RlZmluZSByZWFkYl9yZWxheGVkKGFkZHIpIHJlYWRiKGFkZHIpCi0jZGVmaW5lIHJlYWR3X3JlbGF4ZWQoYWRkcikgcmVhZHcoYWRkcikKLSNkZWZpbmUgcmVhZGxfcmVsYXhlZChhZGRyKSByZWFkbChhZGRyKQorCisjZGVmaW5lIHdyaXRlYl9yZWxheGVkKHYsYykJKCh2b2lkKV9fcmF3X3dyaXRlYih2LF9fbWVtX3BjaShjKSkpCisjZGVmaW5lIHdyaXRld19yZWxheGVkKHYsYykJKCh2b2lkKV9fcmF3X3dyaXRldygoX19mb3JjZSB1MTYpIFwKKwkJCQkJY3B1X3RvX2xlMTYodiksX19tZW1fcGNpKGMpKSkKKyNkZWZpbmUgd3JpdGVsX3JlbGF4ZWQodixjKQkoKHZvaWQpX19yYXdfd3JpdGVsKChfX2ZvcmNlIHUzMikgXAorCQkJCQljcHVfdG9fbGUzMih2KSxfX21lbV9wY2koYykpKQorCisjaWZkZWYgQ09ORklHX0FSTV9ETUFfTUVNX0JVRkZFUkFCTEUKKyNkZWZpbmUgX19pb3JtYigpCQlybWIoKQorI2RlZmluZSBfX2lvd21iKCkJCXdtYigpCisjZWxzZQorI2RlZmluZSBfX2lvcm1iKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19pb3dtYigpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSByZWFkYihjKQkJKHsgdTggIF9fdiA9IHJlYWRiX3JlbGF4ZWQoYyk7IF9faW9ybWIoKTsgX192OyB9KQorI2RlZmluZSByZWFkdyhjKQkJKHsgdTE2IF9fdiA9IHJlYWR3X3JlbGF4ZWQoYyk7IF9faW9ybWIoKTsgX192OyB9KQorI2RlZmluZSByZWFkbChjKQkJKHsgdTMyIF9fdiA9IHJlYWRsX3JlbGF4ZWQoYyk7IF9faW9ybWIoKTsgX192OyB9KQorCisjZGVmaW5lIHdyaXRlYih2LGMpCQkoeyBfX2lvd21iKCk7IHdyaXRlYl9yZWxheGVkKHYsYyk7IH0pCisjZGVmaW5lIHdyaXRldyh2LGMpCQkoeyBfX2lvd21iKCk7IHdyaXRld19yZWxheGVkKHYsYyk7IH0pCisjZGVmaW5lIHdyaXRlbCh2LGMpCQkoeyBfX2lvd21iKCk7IHdyaXRlbF9yZWxheGVkKHYsYyk7IH0pCiAKICNkZWZpbmUgcmVhZHNiKHAsZCxsKQkJX19yYXdfcmVhZHNiKF9fbWVtX3BjaShwKSxkLGwpCiAjZGVmaW5lIHJlYWRzdyhwLGQsbCkJCV9fcmF3X3JlYWRzdyhfX21lbV9wY2kocCksZCxsKQogI2RlZmluZSByZWFkc2wocCxkLGwpCQlfX3Jhd19yZWFkc2woX19tZW1fcGNpKHApLGQsbCkKIAotI2RlZmluZSB3cml0ZWIodixjKQkJX19yYXdfd3JpdGViKHYsX19tZW1fcGNpKGMpKQotI2RlZmluZSB3cml0ZXcodixjKQkJX19yYXdfd3JpdGV3KChfX2ZvcmNlIF9fdTE2KSBcCi0JCQkJCWNwdV90b19sZTE2KHYpLF9fbWVtX3BjaShjKSkKLSNkZWZpbmUgd3JpdGVsKHYsYykJCV9fcmF3X3dyaXRlbCgoX19mb3JjZSBfX3UzMikgXAotCQkJCQljcHVfdG9fbGUzMih2KSxfX21lbV9wY2koYykpCi0KICNkZWZpbmUgd3JpdGVzYihwLGQsbCkJCV9fcmF3X3dyaXRlc2IoX19tZW1fcGNpKHApLGQsbCkKICNkZWZpbmUgd3JpdGVzdyhwLGQsbCkJCV9fcmF3X3dyaXRlc3coX19tZW1fcGNpKHApLGQsbCkKICNkZWZpbmUgd3JpdGVzbChwLGQsbCkJCV9fcmF3X3dyaXRlc2woX19tZW1fcGNpKHApLGQsbCkKQEAgLTI0NCwxMyArMjU4LDEzIEBACiAgKiBpb3tyZWFkLHdyaXRlfXs4LDE2LDMyfSBtYWNyb3MKICAqLwogI2lmbmRlZiBpb3JlYWQ4Ci0jZGVmaW5lIGlvcmVhZDgocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IF9fcmF3X3JlYWRiKHApOyBfX3Y7IH0pCi0jZGVmaW5lIGlvcmVhZDE2KHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpX19yYXdfcmVhZHcocCkpOyBfX3Y7IH0pCi0jZGVmaW5lIGlvcmVhZDMyKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpX19yYXdfcmVhZGwocCkpOyBfX3Y7IH0pCisjZGVmaW5lIGlvcmVhZDgocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IF9fcmF3X3JlYWRiKHApOyBfX2lvcm1iKCk7IF9fdjsgfSkKKyNkZWZpbmUgaW9yZWFkMTYocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNilfX3Jhd19yZWFkdyhwKSk7IF9faW9ybWIoKTsgX192OyB9KQorI2RlZmluZSBpb3JlYWQzMihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUzMl90b19jcHUoKF9fZm9yY2UgX19sZTMyKV9fcmF3X3JlYWRsKHApKTsgX19pb3JtYigpOyBfX3Y7IH0pCiAKLSNkZWZpbmUgaW93cml0ZTgodixwKQlfX3Jhd193cml0ZWIodiwgcCkKLSNkZWZpbmUgaW93cml0ZTE2KHYscCkJX19yYXdfd3JpdGV3KChfX2ZvcmNlIF9fdTE2KWNwdV90b19sZTE2KHYpLCBwKQotI2RlZmluZSBpb3dyaXRlMzIodixwKQlfX3Jhd193cml0ZWwoKF9fZm9yY2UgX191MzIpY3B1X3RvX2xlMzIodiksIHApCisjZGVmaW5lIGlvd3JpdGU4KHYscCkJKHsgX19pb3dtYigpOyAodm9pZClfX3Jhd193cml0ZWIodiwgcCk7IH0pCisjZGVmaW5lIGlvd3JpdGUxNih2LHApCSh7IF9faW93bWIoKTsgKHZvaWQpX19yYXdfd3JpdGV3KChfX2ZvcmNlIF9fdTE2KWNwdV90b19sZTE2KHYpLCBwKTsgfSkKKyNkZWZpbmUgaW93cml0ZTMyKHYscCkJKHsgX19pb3dtYigpOyAodm9pZClfX3Jhd193cml0ZWwoKF9fZm9yY2UgX191MzIpY3B1X3RvX2xlMzIodiksIHApOyB9KQogCiAjZGVmaW5lIGlvcmVhZDhfcmVwKHAsZCxjKQlfX3Jhd19yZWFkc2IocCxkLGMpCiAjZGVmaW5lIGlvcmVhZDE2X3JlcChwLGQsYykJX19yYXdfcmVhZHN3KHAsZCxjKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCAyMzcyODJmLi4yNzIxYTU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9pcnEuaApAQCAtNyw2ICs3LDggQEAKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpKQkoaSkKICNlbmRpZgogCisjZGVmaW5lIE5SX0lSUVNfTEVHQUNZCTE2CisKIC8qCiAgKiBVc2UgdGhpcyB2YWx1ZSB0byBpbmRpY2F0ZSBsYWNrIG9mIGludGVycnVwdAogICogY2FwYWJpbGl0eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va2V4ZWMuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2tleGVjLmgKaW5kZXggZGYxNWEwZC4uOGVjOWVmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va2V4ZWMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rZXhlYy5oCkBAIC0xOSwxMCArMTksMjYgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotc3RydWN0IGtpbWFnZTsKLS8qIFByb3ZpZGUgYSBkdW1teSBkZWZpbml0aW9uIHRvIGF2b2lkIGJ1aWxkIGZhaWx1cmVzLiAqLworLyoqCisgKiBjcmFzaF9zZXR1cF9yZWdzKCkgLSBzYXZlIHJlZ2lzdGVycyBmb3IgdGhlIHBhbmljIGtlcm5lbAorICogQG5ld3JlZ3M6IHJlZ2lzdGVycyBhcmUgc2F2ZWQgaGVyZQorICogQG9sZHJlZ3M6IHJlZ2lzdGVycyB0byBiZSBzYXZlZCAobWF5IGJlICVOVUxMKQorICoKKyAqIEZ1bmN0aW9uIGNvcGllcyBtYWNoaW5lIHJlZ2lzdGVycyBmcm9tIEBvbGRyZWdzIHRvIEBuZXdyZWdzLiBJZiBAb2xkcmVncyBpcworICogJU5VTEwgdGhlbiBjdXJyZW50IHJlZ2lzdGVycyBhcmUgc3RvcmVkIHRoZXJlLgorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfc2V0dXBfcmVncyhzdHJ1Y3QgcHRfcmVncyAqbmV3cmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqb2xkcmVncykgeyB9CisJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpvbGRyZWdzKQoreworCWlmIChvbGRyZWdzKSB7CisJCW1lbWNweShuZXdyZWdzLCBvbGRyZWdzLCBzaXplb2YoKm5ld3JlZ3MpKTsKKwl9IGVsc2UgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0bWlhICUwLCB7cjAgLSByMTV9IgorCQkJCSAgICAgIDogOiAiciIgKCZuZXdyZWdzLT5BUk1fcjApKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtcnMgJTAsIGNwc3IiCisJCQkJICAgICAgOiAiPXIiIChuZXdyZWdzLT5BUk1fY3BzcikpOworCX0KK30KIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rZ2RiLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rZ2RiLmgKaW5kZXggNjdhZjRiOC4uMDgyNjU5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va2dkYi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2tnZGIuaApAQCAtNzAsMTEgKzcwLDExIEBACiAjZGVmaW5lIF9HUF9SRUdTCQkxNgogI2RlZmluZSBfRlBfUkVHUwkJOAogI2RlZmluZSBfRVhUUkFfUkVHUwkJMgotI2RlZmluZSBHREJfTUFYX1JFR1MJCShfR1BfUkVHUyArIChfRlBfUkVHUyAqIDMpICsgX0VYVFJBX1JFR1MpCisjZGVmaW5lIERCR19NQVhfUkVHX05VTQkJKF9HUF9SRUdTICsgKF9GUF9SRUdTICogMykgKyBfRVhUUkFfUkVHUykKIAogI2RlZmluZSBLR0RCX01BWF9OT19DUFVTCTEKICNkZWZpbmUgQlVGTUFYCQkJNDAwCi0jZGVmaW5lIE5VTVJFR0JZVEVTCQkoR0RCX01BWF9SRUdTIDw8IDIpCisjZGVmaW5lIE5VTVJFR0JZVEVTCQkoREJHX01BWF9SRUdfTlVNIDw8IDIpCiAjZGVmaW5lIE5VTUNSSVRSRUdCWVRFUwkJKDMyIDw8IDIpCiAKICNkZWZpbmUgX1IwCQkJMApAQCAtOTMsNyArOTMsNyBAQAogI2RlZmluZSBfU1BUCQkJMTMKICNkZWZpbmUgX0xSCQkJMTQKICNkZWZpbmUgX1BDCQkJMTUKLSNkZWZpbmUgX0NQU1IJCQkoR0RCX01BWF9SRUdTIC0gMSkKKyNkZWZpbmUgX0NQU1IJCQkoREJHX01BWF9SRUdfTlVNIC0gMSkKIAogLyoKICAqIFNvIHRoYXQgd2UgY2FuIGRlbm90ZSB0aGUgZW5kIG9mIGEgZnJhbWUgZm9yIHRyYWNpbmcsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAppbmRleCBjNTk4NDJkLi44YTBkZDE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaApAQCAtMjAsNiArMjAsNyBAQAogCSAqIGJ5IGFzc2VtYmxlciBjb2RlIGluIGhlYWQuUywgaGVhZC1jb21tb24uUwogCSAqLwogCXVuc2lnbmVkIGludAkJbnI7CQkvKiBhcmNoaXRlY3R1cmUgbnVtYmVyCSovCisJdW5zaWduZWQgaW50CQlucl9pcnFzOwkvKiBudW1iZXIgb2YgSVJRcyAqLwogCXVuc2lnbmVkIGludAkJcGh5c19pbzsJLyogc3RhcnQgb2YgcGh5c2ljYWwgaW8JKi8KIAl1bnNpZ25lZCBpbnQJCWlvX3BnX29mZnN0OwkvKiBieXRlIG9mZnNldCBmb3IgaW8gCiAJCQkJCQkgKiBwYWdlIHRhYmUgZW50cnkJKi8KQEAgLTM3LDYgKzM4LDcgQEAKIAl2b2lkCQkJKCpmaXh1cCkoc3RydWN0IG1hY2hpbmVfZGVzYyAqLAogCQkJCQkgc3RydWN0IHRhZyAqLCBjaGFyICoqLAogCQkJCQkgc3RydWN0IG1lbWluZm8gKik7CisJdm9pZAkJCSgqcmVzZXJ2ZSkodm9pZCk7LyogcmVzZXJ2ZSBtZW0gYmxvY2tzCSovCiAJdm9pZAkJCSgqbWFwX2lvKSh2b2lkKTsvKiBJTyBtYXBwaW5nIGZ1bmN0aW9uCSovCiAJdm9pZAkJCSgqaW5pdF9pcnEpKHZvaWQpOwogCXN0cnVjdCBzeXNfdGltZXIJKnRpbWVyOwkJLyogc3lzdGVtIHRpY2sgdGltZXIJKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvaXJxLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2lycS5oCmluZGV4IDg5MjBiMmQ2Li5jZTNlZWU5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9pcnEuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2lycS5oCkBAIC0xNyw2ICsxNyw3IEBACiAvKgogICogVGhpcyBpcyBpbnRlcm5hbC4gIERvIG5vdCB1c2UgaXQuCiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgYXJjaF9ucl9pcnFzOwogZXh0ZXJuIHZvaWQgKCppbml0X2FyY2hfaXJxKSh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfRklRKHZvaWQpOwogZXh0ZXJuIGludCBzaG93X2ZpcV9saXN0KHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tYXAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmgKaW5kZXggNzQyYzJhYWViLi5kMmZlZGI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmgKQEAgLTI3LDYgKzI3LDggQEAKICNkZWZpbmUgTVRfTUVNT1JZCQk5CiAjZGVmaW5lIE1UX1JPTQkJCTEwCiAjZGVmaW5lIE1UX01FTU9SWV9OT05DQUNIRUQJMTEKKyNkZWZpbmUgTVRfTUVNT1JZX0RUQ00JCTEyCisjZGVmaW5lIE1UX01FTU9SWV9JVENNCQkxMwogCiAjaWZkZWYgQ09ORklHX01NVQogZXh0ZXJuIHZvaWQgaW90YWJsZV9pbml0KHN0cnVjdCBtYXBfZGVzYyAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKaW5kZXggNTJmMGRhMS4uMTYzMzBiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCkBAIC00Niw2ICs0Niw3IEBACiAJCQkJCS8qIElSUSBtYXBwaW5nCQkJCSovCiAJaW50CQkoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCk7CiAJc3RydWN0IGh3X3BjaQkqaHc7CisJdm9pZAkJKnByaXZhdGVfZGF0YTsJLyogcGxhdGZvcm0gY29udHJvbGxlciBwcml2YXRlIGRhdGEJKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1ibG9jay5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJjNDNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtYmxvY2suaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9BU01fQVJNX01FTUJMT0NLX0gKKyNkZWZpbmUgX0FTTV9BUk1fTUVNQkxPQ0tfSAorCisjaWZkZWYgQ09ORklHX01NVQorZXh0ZXJuIHBoeXNfYWRkcl90IGxvd21lbV9lbmRfYWRkcjsKKyNkZWZpbmUgTUVNQkxPQ0tfUkVBTF9MSU1JVAlsb3dtZW1fZW5kX2FkZHIKKyNlbHNlCisjZGVmaW5lIE1FTUJMT0NLX1JFQUxfTElNSVQJMAorI2VuZGlmCisKK3N0cnVjdCBtZW1pbmZvOworc3RydWN0IG1hY2hpbmVfZGVzYzsKKworZXh0ZXJuIHZvaWQgYXJtX21lbWJsb2NrX2luaXQoc3RydWN0IG1lbWluZm8gKiwgc3RydWN0IG1hY2hpbmVfZGVzYyAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oCmluZGV4IDQzMTJlZTUuLjIzYzJlOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oCkBAIC0xMjQsNiArMTI0LDE1IEBACiAjZW5kaWYgLyogIUNPTkZJR19NTVUgKi8KIAogLyoKKyAqIFdlIGZpeCB0aGUgVENNIG1lbW9yaWVzIG1heCAzMiBLaUIgSVRDTSByZXNwIERUQ00gYXQgdGhlc2UKKyAqIGxvY2F0aW9ucworICovCisjaWZkZWYgQ09ORklHX0hBVkVfVENNCisjZGVmaW5lIElUQ01fT0ZGU0VUCVVMKDB4ZmZmZTAwMDApCisjZGVmaW5lIERUQ01fT0ZGU0VUCVVMKDB4ZmZmZTgwMDApCisjZW5kaWYKKworLyoKICAqIFBoeXNpY2FsIHZzIHZpcnR1YWwgUkFNIGFkZHJlc3Mgc3BhY2UgY29udmVyc2lvbi4gIFRoZXNlIGFyZQogICogcHJpdmF0ZSBkZWZpbml0aW9ucyB3aGljaCBzaG91bGQgTk9UIGJlIHVzZWQgb3V0c2lkZSBtZW1vcnkuaAogICogZmlsZXMuICBVc2UgdmlydF90b19waHlzL3BoeXNfdG9fdmlydC9fX3BhL19fdmEgaW5zdGVhZC4KQEAgLTE1OCw3ICsxNjcsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgYXJjaF9hZGp1c3Rfem9uZXMKLSNkZWZpbmUgYXJjaF9hZGp1c3Rfem9uZXMobm9kZSxzaXplLGhvbGVzKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGFyY2hfYWRqdXN0X3pvbmVzKHNpemUsaG9sZXMpIGRvIHsgfSB3aGlsZSAoMCkKICNlbGlmICFkZWZpbmVkKENPTkZJR19aT05FX0RNQSkKICNlcnJvciAiY3VzdG9tIGFyY2hfYWRqdXN0X3pvbmVzKCkgcmVxdWlyZXMgQ09ORklHX1pPTkVfRE1BIgogI2VuZGlmCkBAIC0yMzQsNzYgKzI0MywxMSBAQAogICogIHZpcnRfdG9fcGFnZShrKQljb252ZXJ0IGEgX3ZhbGlkXyB2aXJ0dWFsIGFkZHJlc3MgdG8gc3RydWN0IHBhZ2UgKgogICogIHZpcnRfYWRkcl92YWxpZChrKQlpbmRpY2F0ZXMgd2hldGhlciBhIHZpcnR1YWwgYWRkcmVzcyBpcyB2YWxpZAogICovCi0jaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KLQogI2RlZmluZSBBUkNIX1BGTl9PRkZTRVQJCVBIWVNfUEZOX09GRlNFVAogCiAjZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJcGZuX3RvX3BhZ2UoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQkoKHVuc2lnbmVkIGxvbmcpKGthZGRyKSA+PSBQQUdFX09GRlNFVCAmJiAodW5zaWduZWQgbG9uZykoa2FkZHIpIDwgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpCiAKLSNkZWZpbmUgUEhZU19UT19OSUQoYWRkcikJKDApCi0KLSNlbHNlIC8qIENPTkZJR19ESVNDT05USUdNRU0gKi8KLQotLyoKLSAqIFRoaXMgaXMgbW9yZSBjb21wbGV4LiAgV2UgaGF2ZSBhIHNldCBvZiBtZW1fbWFwIGFycmF5cyBzcHJlYWQKLSAqIGFyb3VuZCBpbiBtZW1vcnkuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9udW1hLmg+Ci0KLSNkZWZpbmUgYXJjaF9wZm5fdG9fbmlkKHBmbikJUEZOX1RPX05JRChwZm4pCi0jZGVmaW5lIGFyY2hfbG9jYWxfcGFnZV9vZmZzZXQocGZuLCBuaWQpIExPQ0FMX01BUF9OUigocGZuKSA8PCBQQUdFX1NISUZUKQotCi0jZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJCQkJCVwKLQkoQUREUl9UT19NQVBCQVNFKGthZGRyKSArIExPQ0FMX01BUF9OUihrYWRkcikpCi0KLSNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQkoS1ZBRERSX1RPX05JRChrYWRkcikgPCBNQVhfTlVNTk9ERVMpCi0KLS8qCi0gKiBDb21tb24gZGlzY29udGlnbWVtIHN0dWZmLgotICogIFBIWVNfVE9fTklEIGlzIHVzZWQgYnkgdGhlIEFSTSBrZXJuZWwvc2V0dXAuYwotICovCi0jZGVmaW5lIFBIWVNfVE9fTklEKGFkZHIpCVBGTl9UT19OSUQoKGFkZHIpID4+IFBBR0VfU0hJRlQpCi0KLS8qCi0gKiBHaXZlbiBhIGthZGRyLCBBRERSX1RPX01BUEJBU0UgZmluZHMgdGhlIG93bmluZyBub2RlIG9mIHRoZSBtZW1vcnkKLSAqIGFuZCByZXR1cm5zIHRoZSBtZW1fbWFwIG9mIHRoYXQgbm9kZS4KLSAqLwotI2RlZmluZSBBRERSX1RPX01BUEJBU0Uoa2FkZHIpCU5PREVfTUVNX01BUChLVkFERFJfVE9fTklEKGthZGRyKSkKLQotLyoKLSAqIEdpdmVuIGEgcGFnZSBmcmFtZSBudW1iZXIsIGZpbmQgdGhlIG93bmluZyBub2RlIG9mIHRoZSBtZW1vcnkKLSAqIGFuZCByZXR1cm5zIHRoZSBtZW1fbWFwIG9mIHRoYXQgbm9kZS4KLSAqLwotI2RlZmluZSBQRk5fVE9fTUFQQkFTRShwZm4pCU5PREVfTUVNX01BUChQRk5fVE9fTklEKHBmbikpCi0KLSNpZmRlZiBOT0RFX01FTV9TSVpFX0JJVFMKLSNkZWZpbmUgTk9ERV9NRU1fU0laRV9NQVNLCSgoMSA8PCBOT0RFX01FTV9TSVpFX0JJVFMpIC0gMSkKLQotLyoKLSAqIEdpdmVuIGEga2VybmVsIGFkZHJlc3MsIGZpbmQgdGhlIGhvbWUgbm9kZSBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkuCi0gKi8KLSNkZWZpbmUgS1ZBRERSX1RPX05JRChhZGRyKSBcCi0JKCgodW5zaWduZWQgbG9uZykoYWRkcikgLSBQQUdFX09GRlNFVCkgPj4gTk9ERV9NRU1fU0laRV9CSVRTKQotCi0vKgotICogR2l2ZW4gYSBwYWdlIGZyYW1lIG51bWJlciwgY29udmVydCBpdCB0byBhIG5vZGUgaWQuCi0gKi8KLSNkZWZpbmUgUEZOX1RPX05JRChwZm4pIFwKLQkoKChwZm4pIC0gUEhZU19QRk5fT0ZGU0VUKSA+PiAoTk9ERV9NRU1fU0laRV9CSVRTIC0gUEFHRV9TSElGVCkpCi0KLS8qCi0gKiBHaXZlbiBhIGthZGRyLCBMT0NBTF9NRU1fTUFQIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgYXBwcm9wcmlhdGUgcGFnZSBpbiB0aGUKLSAqIG5vZGUncyBtZW1fbWFwLgotICovCi0jZGVmaW5lIExPQ0FMX01BUF9OUihhZGRyKSBcCi0JKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiBOT0RFX01FTV9TSVpFX01BU0spID4+IFBBR0VfU0hJRlQpCi0KLSNlbmRpZiAvKiBOT0RFX01FTV9TSVpFX0JJVFMgKi8KLQotI2VuZGlmIC8qICFDT05GSUdfRElTQ09OVElHTUVNICovCi0KIC8qCiAgKiBPcHRpb25hbCBjb2hlcmVuY3kgc3VwcG9ydC4gIEN1cnJlbnRseSB1c2VkIG9ubHkgYnkgc2VsZWN0ZWQKICAqIEludGVsIFhTQzMtYmFzZWQgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW16b25lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjNhNGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW16b25lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogIGFyY2gvYXJtL2luY2x1ZGUvYXNtL21tem9uZS5oCi0gKgotICogIDE5OTktMTItMjkJTmljb2xhcyBQaXRyZQkJQ3JlYXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpZm5kZWYgX19BU01fTU1aT05FX0gKLSNkZWZpbmUgX19BU01fTU1aT05FX0gKLQotLyoKLSAqIEN1cnJlbnRseSBkZWZpbmVkIGluIGFyY2gvYXJtL21tL2Rpc2NvbnRpZy5jCi0gKi8KLWV4dGVybiBwZ19kYXRhX3QgZGlzY29udGlnX25vZGVfZGF0YVtdOwotCi0vKgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbm9kZSBkYXRhIGZvciBub2RlIG4uCi0gKi8KLSNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCSgmZGlzY29udGlnX25vZGVfZGF0YVtuaWRdKQotCi0vKgotICogTk9ERV9NRU1fTUFQIGdpdmVzIHRoZSBrYWRkciBmb3IgdGhlIG1lbV9tYXAgb2YgdGhlIG5vZGUuCi0gKi8KLSNkZWZpbmUgTk9ERV9NRU1fTUFQKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX21lbV9tYXApCi0KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggOWRjYjExZS4uYzk3NGJlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTE4NCw2ICsxODQsNDIgQEAKICNkZWZpbmUgcHJlZGljYXRlKHgpCQkoKHgpICYgMHhmMDAwMDAwMCkKICNkZWZpbmUgUFJFRElDQVRFX0FMV0FZUwkweGUwMDAwMDAwCiAKKy8qCisgKiBrcHJvYmUtYmFzZWQgZXZlbnQgdHJhY2VyIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX09SSUdfcjApKQorCitleHRlcm4gaW50IHJlZ3NfcXVlcnlfcmVnaXN0ZXJfb2Zmc2V0KGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnJlZ3NfcXVlcnlfcmVnaXN0ZXJfbmFtZSh1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK2V4dGVybiBib29sIHJlZ3Nfd2l0aGluX2tlcm5lbF9zdGFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHJlZ3NfZ2V0X2tlcm5lbF9zdGFja19udGgoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbik7CisKKy8qKgorICogcmVnc19nZXRfcmVnaXN0ZXIoKSAtIGdldCByZWdpc3RlciB2YWx1ZSBmcm9tIGl0cyBvZmZzZXQKKyAqIEByZWdzOgkgICBwdF9yZWdzIGZyb20gd2hpY2ggcmVnaXN0ZXIgdmFsdWUgaXMgZ290dGVuCisgKiBAb2Zmc2V0OiAgICBvZmZzZXQgbnVtYmVyIG9mIHRoZSByZWdpc3Rlci4KKyAqCisgKiByZWdzX2dldF9yZWdpc3RlciByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlZ2lzdGVyIHdob3NlIG9mZnNldCBmcm9tIEByZWdzLgorICogVGhlIEBvZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaXN0ZXIgaW4gc3RydWN0IHB0X3JlZ3MuCisgKiBJZiBAb2Zmc2V0IGlzIGJpZ2dlciB0aGFuIE1BWF9SRUdfT0ZGU0VULCB0aGlzIHJldHVybnMgMC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlZ3NfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWlmICh1bmxpa2VseShvZmZzZXQgPiBNQVhfUkVHX09GRlNFVCkpCisJCXJldHVybiAwOworCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpcmVncyArIG9mZnNldCk7Cit9CisKKy8qIFZhbGlkIG9ubHkgZm9yIEtlcm5lbCBtb2RlIHRyYXBzLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGtlcm5lbF9zdGFja19wb2ludGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiByZWdzLT5BUk1fc3A7Cit9CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGYzOTJmYjQuLmYxZTVhOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMjAxLDggKzIwMSw3IEBACiBzdHJ1Y3QgbWVtYmFuayB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgbm9kZTsKLQl1bnNpZ25lZCBzaG9ydCBoaWdobWVtOworCXVuc2lnbmVkIGludCBoaWdobWVtOwogfTsKIAogc3RydWN0IG1lbWluZm8gewpAQCAtMjEyLDkgKzIxMSw4IEBACiAKIGV4dGVybiBzdHJ1Y3QgbWVtaW5mbyBtZW1pbmZvOwogCi0jZGVmaW5lIGZvcl9lYWNoX25vZGViYW5rKGl0ZXIsbWksbm8pCQkJXAotCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAobWkpLT5ucl9iYW5rczsgaXRlcisrKQlcCi0JCWlmICgobWkpLT5iYW5rW2l0ZXJdLm5vZGUgPT0gbm8pCisjZGVmaW5lIGZvcl9lYWNoX2JhbmsoaXRlcixtaSkJCQkJXAorCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAobWkpLT5ucl9iYW5rczsgaXRlcisrKQogCiAjZGVmaW5lIGJhbmtfcGZuX3N0YXJ0KGJhbmspCV9fcGh5c190b19wZm4oKGJhbmspLT5zdGFydCkKICNkZWZpbmUgYmFua19wZm5fZW5kKGJhbmspCV9fcGh5c190b19wZm4oKGJhbmspLT5zdGFydCArIChiYW5rKS0+c2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N0YWNrcHJvdGVjdG9yLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zdGFja3Byb3RlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMDAzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zdGFja3Byb3RlY3Rvci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBHQ0Mgc3RhY2sgcHJvdGVjdG9yIHN1cHBvcnQuCisgKgorICogU3RhY2sgcHJvdGVjdG9yIHdvcmtzIGJ5IHB1dHRpbmcgcHJlZGVmaW5lZCBwYXR0ZXJuIGF0IHRoZSBzdGFydCBvZgorICogdGhlIHN0YWNrIGZyYW1lIGFuZCB2ZXJpZnlpbmcgdGhhdCBpdCBoYXNuJ3QgYmVlbiBvdmVyd3JpdHRlbiB3aGVuCisgKiByZXR1cm5pbmcgZnJvbSB0aGUgZnVuY3Rpb24uICBUaGUgcGF0dGVybiBpcyBjYWxsZWQgc3RhY2sgY2FuYXJ5CisgKiBhbmQgZ2NjIGV4cGVjdHMgaXQgdG8gYmUgZGVmaW5lZCBieSBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQKKyAqICJfX3N0YWNrX2Noa19ndWFyZCIgb24gQVJNLiAgVGhpcyB1bmZvcnR1bmF0ZWx5IG1lYW5zIHRoYXQgb24gU01QCisgKiB3ZSBjYW5ub3QgaGF2ZSBhIGRpZmZlcmVudCBjYW5hcnkgdmFsdWUgcGVyIHRhc2suCisgKi8KKworI2lmbmRlZiBfQVNNX1NUQUNLUFJPVEVDVE9SX0gKKyNkZWZpbmUgX0FTTV9TVEFDS1BST1RFQ1RPUl9IIDEKKworI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdGFja19jaGtfZ3VhcmQ7CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBzdGFja3Byb3RlY3RvciBjYW5hcnkgdmFsdWUuCisgKgorICogTk9URTogdGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIGZyb20gZnVuY3Rpb25zIHRoYXQgbmV2ZXIgcmV0dXJuLAorICogYW5kIGl0IG11c3QgYWx3YXlzIGJlIGlubGluZWQuCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBib290X2luaXRfc3RhY2tfY2FuYXJ5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjYW5hcnk7CisKKwkvKiBUcnkgdG8gZ2V0IGEgc2VtaSByYW5kb20gaW5pdGlhbCB2YWx1ZS4gKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCZjYW5hcnksIHNpemVvZihjYW5hcnkpKTsKKwljYW5hcnkgXj0gTElOVVhfVkVSU0lPTl9DT0RFOworCisJY3VycmVudC0+c3RhY2tfY2FuYXJ5ID0gY2FuYXJ5OworCV9fc3RhY2tfY2hrX2d1YXJkID0gY3VycmVudC0+c3RhY2tfY2FuYXJ5OworfQorCisjZW5kaWYJLyogX0FTTV9TVEFDS1BST1RFQ1RPUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IDVmNGY0ODAuLjhiYTFjY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC04Myw3ICs4Myw3IEBACiAKIHZvaWQgaG9va19mYXVsdF9jb2RlKGludCBuciwgaW50ICgqZm4pKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwKIAkJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKiksCi0JCSAgICAgaW50IHNpZywgY29uc3QgY2hhciAqbmFtZSk7CisJCSAgICAgaW50IHNpZywgaW50IGNvZGUsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAjZGVmaW5lIHhjaGcocHRyLHgpIFwKIAkoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLChwdHIpLHNpemVvZigqKHB0cikpKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Rscy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZDZmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Rscy5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX19BU01BUk1fVExTX0gKKyNkZWZpbmUgX19BU01BUk1fVExTX0gKKworI2lmZGVmIF9fQVNTRU1CTFlfXworCS5tYWNybyBzZXRfdGxzX25vbmUsIHRwLCB0bXAxLCB0bXAyCisJLmVuZG0KKworCS5tYWNybyBzZXRfdGxzX3Y2aywgdHAsIHRtcDEsIHRtcDIKKwltY3IJcDE1LCAwLCBcdHAsIGMxMywgYzAsIDMJCUAgc2V0IFRMUyByZWdpc3RlcgorCS5lbmRtCisKKwkubWFjcm8gc2V0X3Rsc192NiwgdHAsIHRtcDEsIHRtcDIKKwlsZHIJXHRtcDEsID1lbGZfaHdjYXAKKwlsZHIJXHRtcDEsIFtcdG1wMSwgIzBdCisJbW92CVx0bXAyLCAjMHhmZmZmMGZmZgorCXRzdAlcdG1wMSwgI0hXQ0FQX1RMUwkJQCBoYXJkd2FyZSBUTFMgYXZhaWxhYmxlPworCW1jcm5lCXAxNSwgMCwgXHRwLCBjMTMsIGMwLCAzCQlAIHllcywgc2V0IFRMUyByZWdpc3RlcgorCXN0cmVxCVx0cCwgW1x0bXAyLCAjLTE1XQkJQCBzZXQgVExTIHZhbHVlIGF0IDB4ZmZmZjBmZjAKKwkuZW5kbQorCisJLm1hY3JvIHNldF90bHNfc29mdHdhcmUsIHRwLCB0bXAxLCB0bXAyCisJbW92CVx0bXAxLCAjMHhmZmZmMGZmZgorCXN0cglcdHAsIFtcdG1wMSwgIy0xNV0JCUAgc2V0IFRMUyB2YWx1ZSBhdCAweGZmZmYwZmYwCisJLmVuZG0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RMU19SRUdfRU1VTAorI2RlZmluZSB0bHNfZW11CQkxCisjZGVmaW5lIGhhc190bHNfcmVnCQkxCisjZGVmaW5lIHNldF90bHMJCXNldF90bHNfbm9uZQorI2VsaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcgfHwJCQkJCVwKKwkoX19MSU5VWF9BUk1fQVJDSF9fID09IDYgJiYgZGVmaW5lZChDT05GSUdfQ1BVXzMydjZLKSkKKyNkZWZpbmUgdGxzX2VtdQkJMAorI2RlZmluZSBoYXNfdGxzX3JlZwkJMQorI2RlZmluZSBzZXRfdGxzCQlzZXRfdGxzX3Y2aworI2VsaWYgX19MSU5VWF9BUk1fQVJDSF9fID09IDYKKyNkZWZpbmUgdGxzX2VtdQkJMAorI2RlZmluZSBoYXNfdGxzX3JlZwkJKGVsZl9od2NhcCAmIEhXQ0FQX1RMUykKKyNkZWZpbmUgc2V0X3RscwkJc2V0X3Rsc192NgorI2Vsc2UKKyNkZWZpbmUgdGxzX2VtdQkJMAorI2RlZmluZSBoYXNfdGxzX3JlZwkJMAorI2RlZmluZSBzZXRfdGxzCQlzZXRfdGxzX3NvZnR3YXJlCisjZW5kaWYKKworI2VuZGlmCS8qIF9fQVNNQVJNX1RMU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS92ZnBtYWNyb3MuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3ZmcG1hY3Jvcy5oCmluZGV4IDQyMmYzY2MuLjNkNWZjNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3ZmcG1hY3Jvcy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3ZmcG1hY3Jvcy5oCkBAIC0zLDYgKzMsOCBAQAogICoKICAqIEFzc2VtYmxlci1vbmx5IGZpbGUgY29udGFpbmluZyBWRlAgbWFjcm9zIGFuZCByZWdpc3RlciBkZWZpbml0aW9ucy4KICAqLworI2luY2x1ZGUgPGFzbS9od2NhcC5oPgorCiAjaW5jbHVkZSAidmZwLmgiCiAKIEAgTWFjcm9zIHRvIGFsbG93IGJ1aWxkaW5nIHdpdGggb2xkIHRvb2xraXRzICh3aXRoIG5vIFZGUCBzdXBwb3J0KQpAQCAtMjIsMTIgKzI0LDIwIEBACiAJTERDCXAxMSwgY3IwLCBbXGJhc2VdLCMzMio0CQkgICAgQCBGTERNSUFEIFxiYXNlISwge2QwLWQxNX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19WRlB2MworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA8PSA2CisJbGRyCVx0bXAsID1lbGZfaHdjYXAJCSAgICBAIG1heSBub3QgaGF2ZSBNVkZSIHJlZ3MKKwlsZHIJXHRtcCwgW1x0bXAsICMwXQorCXRzdAlcdG1wLCAjSFdDQVBfVkZQdjNEMTYKKwlsZGNlcQlwMTEsIGNyMCwgW1xiYXNlXSwjMzIqNAkJICAgIEAgRkxETUlBRCBcYmFzZSEsIHtkMTYtZDMxfQorCWFkZG5lCVxiYXNlLCBcYmFzZSwgIzMyKjQJCSAgICBAIHN0ZXAgb3ZlciB1bnVzZWQgcmVnaXN0ZXIgc3BhY2UKKyNlbHNlCiAJVkZQRk1SWAlcdG1wLCBNVkZSMAkJCSAgICBAIE1lZGlhIGFuZCBWRlAgRmVhdHVyZSBSZWdpc3RlciAwCiAJYW5kCVx0bXAsIFx0bXAsICNNVkZSMF9BX1NJTURfTUFTSwkgICAgQCBBX1NJTUQgZmllbGQKIAljbXAJXHRtcCwgIzIJCQkgICAgQCAzMiB4IDY0Yml0IHJlZ2lzdGVycz8KIAlsZGNlcWwJcDExLCBjcjAsIFtcYmFzZV0sIzMyKjQJCSAgICBAIEZMRE1JQUQgXGJhc2UhLCB7ZDE2LWQzMX0KIAlhZGRuZQlcYmFzZSwgXGJhc2UsICMzMio0CQkgICAgQCBzdGVwIG92ZXIgdW51c2VkIHJlZ2lzdGVyIHNwYWNlCiAjZW5kaWYKKyNlbmRpZgogCS5lbmRtCiAKIAlAIHdyaXRlIGFsbCB0aGUgd29ya2luZyByZWdpc3RlcnMgb3V0IG9mIHRoZSBWRlAKQEAgLTM4LDEwICs0OCwxOCBAQAogCVNUQwlwMTEsIGNyMCwgW1xiYXNlXSwjMzIqNAkJICAgIEAgRlNUTUlBRCBcYmFzZSEsIHtkMC1kMTV9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVkZQdjMKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPD0gNgorCWxkcglcdG1wLCA9ZWxmX2h3Y2FwCQkgICAgQCBtYXkgbm90IGhhdmUgTVZGUiByZWdzCisJbGRyCVx0bXAsIFtcdG1wLCAjMF0KKwl0c3QJXHRtcCwgI0hXQ0FQX1ZGUHYzRDE2CisJc3RjZXEJcDExLCBjcjAsIFtcYmFzZV0sIzMyKjQJCSAgICBAIEZTVE1JQUQgXGJhc2UhLCB7ZDE2LWQzMX0KKwlhZGRuZQlcYmFzZSwgXGJhc2UsICMzMio0CQkgICAgQCBzdGVwIG92ZXIgdW51c2VkIHJlZ2lzdGVyIHNwYWNlCisjZWxzZQogCVZGUEZNUlgJXHRtcCwgTVZGUjAJCQkgICAgQCBNZWRpYSBhbmQgVkZQIEZlYXR1cmUgUmVnaXN0ZXIgMAogCWFuZAlcdG1wLCBcdG1wLCAjTVZGUjBfQV9TSU1EX01BU0sJICAgIEAgQV9TSU1EIGZpZWxkCiAJY21wCVx0bXAsICMyCQkJICAgIEAgMzIgeCA2NGJpdCByZWdpc3RlcnM/CiAJc3RjZXFsCXAxMSwgY3IwLCBbXGJhc2VdLCMzMio0CQkgICAgQCBGU1RNSUFEIFxiYXNlISwge2QxNi1kMzF9CiAJYWRkbmUJXGJhc2UsIFxiYXNlLCAjMzIqNAkJICAgIEAgc3RlcCBvdmVyIHVudXNlZCByZWdpc3RlciBzcGFjZQogI2VuZGlmCisjZW5kaWYKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlIGIvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCmluZGV4IDI2ZDMwMmMuLjk4MGI3OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKQEAgLTEzLDEwICsxMywxMiBAQAogCiAjIE9iamVjdCBmaWxlIGxpc3RzLgogCi1vYmoteQkJOj0gY29tcGF0Lm8gZWxmLm8gZW50cnktYXJtdi5vIGVudHJ5LWNvbW1vbi5vIGlycS5vIFwKK29iai15CQk6PSBlbGYubyBlbnRyeS1hcm12Lm8gZW50cnktY29tbW9uLm8gaXJxLm8gXAogCQkgICBwcm9jZXNzLm8gcHRyYWNlLm8gcmV0dXJuX2FkZHJlc3MubyBzZXR1cC5vIHNpZ25hbC5vIFwKIAkJICAgc3lzX2FybS5vIHN0YWNrdHJhY2UubyB0aW1lLm8gdHJhcHMubwogCitvYmotJChDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QpICs9IGNvbXBhdC5vCisKIG9iai0kKENPTkZJR19MRURTKQkJKz0gbGVkcy5vCiBvYmotJChDT05GSUdfT0NfRVRNKQkJKz0gZXRtLm8KIApAQCAtMzksNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiLm8KIG9iai0kKENPTkZJR19BUk1fVU5XSU5EKQkrPSB1bndpbmQubwogb2JqLSQoQ09ORklHX0hBVkVfVENNKQkJKz0gdGNtLm8KK29iai0kKENPTkZJR19DUkFTSF9EVU1QKQkrPSBjcmFzaF9kdW1wLm8KIAogb2JqLSQoQ09ORklHX0NSVU5DSCkJCSs9IGNydW5jaC5vIGNydW5jaC1iaXRzLm8KIEFGTEFHU19jcnVuY2gtYml0cy5vCQk6PSAtV2EsLW1jcHU9ZXA5MzEyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDg4MzUxMTUuLjg1ZjJhMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC00MCw2ICs0MCw5IEBACiBpbnQgbWFpbih2b2lkKQogewogICBERUZJTkUoVFNLX0FDVElWRV9NTSwJCW9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgYWN0aXZlX21tKSk7CisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisgIERFRklORShUU0tfU1RBQ0tfQ0FOQVJZLAlvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHN0YWNrX2NhbmFyeSkpOworI2VuZGlmCiAgIEJMQU5LKCk7CiAgIERFRklORShUSV9GTEFHUywJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpKTsKICAgREVGSU5FKFRJX1BSRUVNUFQsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9jb21wYXQuYyBiL2FyY2gvYXJtL2tlcm5lbC9jb21wYXQuYwppbmRleCAwYTEzODU0Li45MjU2NTIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvY29tcGF0LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2NvbXBhdC5jCkBAIC0yMTcsMTAgKzIxNywzIEBACiAJc3RydWN0IHBhcmFtX3N0cnVjdCAqcGFyYW1zID0gKHN0cnVjdCBwYXJhbV9zdHJ1Y3QgKil0YWdzOwogCWJ1aWxkX3RhZ19saXN0KHBhcmFtcywgJnBhcmFtcy0+dTIpOwogfQotCi12b2lkIF9faW5pdCBzcXVhc2hfbWVtX3RhZ3Moc3RydWN0IHRhZyAqdGFnKQotewotCWZvciAoOyB0YWctPmhkci5zaXplOyB0YWcgPSB0YWdfbmV4dCh0YWcpKQotCQlpZiAodGFnLT5oZHIudGFnID09IEFUQUdfTUVNKQotCQkJdGFnLT5oZHIudGFnID0gQVRBR19OT05FOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2NvbXBhdC5oIGIvYXJjaC9hcm0va2VybmVsL2NvbXBhdC5oCmluZGV4IDI3ZTYxYTYuLjM5MjY0YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9jb21wYXQuaAorKysgYi9hcmNoL2FybS9rZXJuZWwvY29tcGF0LmgKQEAgLTksNSArOSwzIEBACiAqLwogCiBleHRlcm4gdm9pZCBjb252ZXJ0X3RvX3RhZ19saXN0KHN0cnVjdCB0YWcgKnRhZ3MpOwotCi1leHRlcm4gdm9pZCBzcXVhc2hfbWVtX3RhZ3Moc3RydWN0IHRhZyAqdGFnKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9hcmNoL2FybS9rZXJuZWwvY3Jhc2hfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2I4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwvY3Jhc2hfZHVtcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLgorICogQXV0aG9yOiBNaWthIFdlc3RlcmJlcmcKKyAqCisgKiBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSBhcmNoL3g4Ni9rZXJuZWwvY3Jhc2hfZHVtcF82NC5jCisgKiAgIENyZWF0ZWQgYnk6IEhhcmlwcmFzYWQgTmVsbGl0aGVlcnRoYSAoaGFyaUBpbi5pYm0uY29tKQorICogICBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNC4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisvKiBzdG9yZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZWxmIGhlYWRlciBvZiBjcmFzaCBpbWFnZSAqLwordW5zaWduZWQgbG9uZyBsb25nIGVsZmNvcmVoZHJfYWRkciA9IEVMRkNPUkVfQUREUl9NQVg7CisKKy8qKgorICogY29weV9vbGRtZW1fcGFnZSgpIC0gY29weSBvbmUgcGFnZSBmcm9tIG9sZCBrZXJuZWwgbWVtb3J5CisgKiBAcGZuOiBwYWdlIGZyYW1lIG51bWJlciB0byBiZSBjb3BpZWQKKyAqIEBidWY6IGJ1ZmZlciB3aGVyZSB0aGUgY29waWVkIHBhZ2UgaXMgcGxhY2VkCisgKiBAY3NpemU6IG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgcGFnZQorICogQHVzZXJidWY6IGlmIHNldCwgQGJ1ZiBpcyBpbnQgaGUgdXNlciBhZGRyZXNzIHNwYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgb25lIHBhZ2UgZnJvbSBvbGQga2VybmVsIG1lbW9yeSBpbnRvIGJ1ZmZlciBwb2ludGVkIGJ5CisgKiBAYnVmLiBJZiBAYnVmIGlzIGluIHVzZXJzcGFjZSwgc2V0IEB1c2VyYnVmIHRvICUxLiBSZXR1cm5zIG51bWJlciBvZiBieXRlcworICogY29waWVkIG9yIG5lZ2F0aXZlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3NpemVfdCBjb3B5X29sZG1lbV9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSBpbnQgdXNlcmJ1ZikKK3sKKwl2b2lkICp2YWRkcjsKKworCWlmICghY3NpemUpCisJCXJldHVybiAwOworCisJdmFkZHIgPSBpb3JlbWFwKHBmbiA8PCBQQUdFX1NISUZULCBQQUdFX1NJWkUpOworCWlmICghdmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHVzZXJidWYpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZhZGRyICsgb2Zmc2V0LCBjc2l6ZSkpIHsKKwkJCWlvdW5tYXAodmFkZHIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQltZW1jcHkoYnVmLCB2YWRkciArIG9mZnNldCwgY3NpemUpOworCX0KKworCWlvdW5tYXAodmFkZHIpOworCXJldHVybiBjc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCmluZGV4IDNmZDc4NjEuLmJiOGU5M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdGxzLmg+CiAKICNpbmNsdWRlICJlbnRyeS1oZWFkZXIuUyIKIApAQCAtNzM1LDExICs3MzYsMTEgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJbGRyCXI2LCBbcjIsICNUSV9DUFVfRE9NQUlOXQogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSEFTX1RMU19SRUcpCi0JbWNyCXAxNSwgMCwgcjMsIGMxMywgYzAsIDMJCUAgc2V0IFRMUyByZWdpc3RlcgotI2VsaWYgIWRlZmluZWQoQ09ORklHX1RMU19SRUdfRU1VTCkKLQltb3YJcjQsICMweGZmZmYwZmZmCi0Jc3RyCXIzLCBbcjQsICMtMTVdCQkJQCBUTFMgdmFsIGF0IDB4ZmZmZjBmZjAKKwlzZXRfdGxzCXIzLCByNCwgcjUKKyNpZiBkZWZpbmVkKENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUikgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKKwlsZHIJcjcsIFtyMiwgI1RJX1RBU0tdCisJbGRyCXI4LCA9X19zdGFja19jaGtfZ3VhcmQKKwlsZHIJcjcsIFtyNywgI1RTS19TVEFDS19DQU5BUlldCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTU1VCiAJbWNyCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAkJQCBTZXQgZG9tYWluIHJlZ2lzdGVyCkBAIC03NDksNiArNzUwLDkgQEAKIAlsZHIJcjAsID10aHJlYWRfbm90aWZ5X2hlYWQKIAltb3YJcjEsICNUSFJFQURfTk9USUZZX1NXSVRDSAogCWJsCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluCisjaWYgZGVmaW5lZChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IpICYmICFkZWZpbmVkKENPTkZJR19TTVApCisJc3RyCXI3LCBbcjhdCisjZW5kaWYKICBUSFVNQigJbW92CWlwLCByNAkJCSAgICkKIAltb3YJcjAsIHI1CiAgQVJNKAlsZG1pYQlyNCwge3I0IC0gc2wsIGZwLCBzcCwgcGN9ICApCUAgTG9hZCBhbGwgcmVncyBzYXZlZCBwcmV2aW91c2x5CkBAIC0xMDA1LDE3ICsxMDA5LDEyIEBACiAgKi8KIAogX19rdXNlcl9nZXRfdGxzOgkJCQlAIDB4ZmZmZjBmZTAKLQotI2lmICFkZWZpbmVkKENPTkZJR19IQVNfVExTX1JFRykgJiYgIWRlZmluZWQoQ09ORklHX1RMU19SRUdfRU1VTCkKLQlsZHIJcjAsIFtwYywgIygxNiAtIDgpXQkJQCBUTFMgc3RvcmVkIGF0IDB4ZmZmZjBmZjAKLSNlbHNlCi0JbXJjCXAxNSwgMCwgcjAsIGMxMywgYzAsIDMJCUAgcmVhZCBUTFMgcmVnaXN0ZXIKLSNlbmRpZgorCWxkcglyMCwgW3BjLCAjKDE2IC0gOCldCUAgcmVhZCBUTFMsIHNldCBpbiBrdXNlcl9nZXRfdGxzX2luaXQKIAl1c3JfcmV0CWxyCi0KLQkucmVwCTUKLQkud29yZAkwCQkJQCBwYWQgdXAgdG8gX19rdXNlcl9oZWxwZXJfdmVyc2lvbgotCS5lbmRyCisJbXJjCXAxNSwgMCwgcjAsIGMxMywgYzAsIDMJQCAweGZmZmYwZmU4IGhhcmR3YXJlIFRMUyBjb2RlCisJLnJlcAk0CisJLndvcmQJMAkJCUAgMHhmZmZmMGZmMCBzb2Z0d2FyZSBUTFMgdmFsdWUsIHRoZW4KKwkuZW5kcgkJCQlAIHBhZCB1cCB0byBfX2t1c2VyX2hlbHBlcl92ZXJzaW9uCiAKIC8qCiAgKiBSZWZlcmVuY2UgZGVjbGFyYXRpb246CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKaW5kZXggM2IzZDJjOC4uYzBkNWMzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwpAQCAtNDcsMTIgKzQ3LDE0IEBACiAjZGVmaW5lIGlycV9maW5pc2goaXJxKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAordW5zaWduZWQgaW50IGFyY2hfbnJfaXJxczsKIHZvaWQgKCppbml0X2FyY2hfaXJxKSh2b2lkKSBfX2luaXRkYXRhID0gTlVMTDsKIHVuc2lnbmVkIGxvbmcgaXJxX2Vycl9jb3VudDsKIAogaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCiB7CiAJaW50IGkgPSAqKGxvZmZfdCAqKSB2LCBjcHU7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBpcnFhY3Rpb24gKiBhY3Rpb247CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNjcsMjQgKzY5LDI1IEBACiAJCXNlcV9wdXRjKHAsICdcbicpOwogCX0KIAotCWlmIChpIDwgTlJfSVJRUykgewotCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKLQkJYWN0aW9uID0gaXJxX2Rlc2NbaV0uYWN0aW9uOworCWlmIChpIDwgbnJfaXJxcykgeworCQlkZXNjID0gaXJxX3RvX2Rlc2MoaSk7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCQlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CiAJCWlmICghYWN0aW9uKQogCQkJZ290byB1bmxvY2s7CiAKIAkJc2VxX3ByaW50ZihwLCAiJTNkOiAiLCBpKTsKIAkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KQogCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9pcnFzX2NwdShpLCBjcHUpKTsKLQkJc2VxX3ByaW50ZihwLCAiICUxMHMiLCBpcnFfZGVzY1tpXS5jaGlwLT5uYW1lID8gOiAiLSIpOworCQlzZXFfcHJpbnRmKHAsICIgJTEwcyIsIGRlc2MtPmNoaXAtPm5hbWUgPyA6ICItIik7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwogCQlmb3IgKGFjdGlvbiA9IGFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCiAJCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKIAogCQlzZXFfcHV0YyhwLCAnXG4nKTsKIHVubG9jazoKLQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKLQl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykgeworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSBpZiAoaSA9PSBucl9pcnFzKSB7CiAjaWZkZWYgQ09ORklHX0ZJUQogCQlzaG93X2ZpcV9saXN0KHAsIHYpOwogI2VuZGlmCkBAIC0xMTIsNyArMTE1LDcgQEAKIAkgKiBTb21lIGhhcmR3YXJlIGdpdmVzIHJhbmRvbWx5IHdyb25nIGludGVycnVwdHMuICBSYXRoZXIKIAkgKiB0aGFuIGNyYXNoaW5nLCBkbyBzb21ldGhpbmcgc2Vuc2libGUuCiAJICovCi0JaWYgKHVubGlrZWx5KGlycSA+PSBOUl9JUlFTKSkgeworCWlmICh1bmxpa2VseShpcnEgPj0gbnJfaXJxcykpIHsKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBJUlEldVxuIiwgaXJxKTsKIAkJYWNrX2JhZF9pcnEoaXJxKTsKQEAgLTEzMiwxMiArMTM1LDEyIEBACiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoaXJxID49IE5SX0lSUVMpIHsKKwlpZiAoaXJxID49IG5yX2lycXMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gc2V0IGlycSBmbGFncyBmb3IgSVJRJWRcbiIsIGlycSk7CiAJCXJldHVybjsKIAl9CiAKLQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAJZGVzYy0+c3RhdHVzIHw9IElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSB8IElSUV9OT0FVVE9FTjsKIAlpZiAoaWZsYWdzICYgSVJRRl9WQUxJRCkKQEAgLTE1MSwxNCArMTU0LDI1IEBACiAKIHZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCiB7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCWludCBpcnE7CiAKLQlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKQotCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyB8PSBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkU7CisJZm9yIChpcnEgPSAwOyBpcnEgPCBucl9pcnFzOyBpcnErKykgeworCQlkZXNjID0gaXJxX3RvX2Rlc2NfYWxsb2Nfbm9kZShpcnEsIDApOworCQlkZXNjLT5zdGF0dXMgfD0gSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFOworCX0KIAogCWluaXRfYXJjaF9pcnEoKTsKIH0KIAorI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCitpbnQgX19pbml0IGFyY2hfcHJvYmVfbnJfaXJxcyh2b2lkKQoreworCW5yX2lycXMgPSBhcmNoX25yX2lycXMgPyBhcmNoX25yX2lycXMgOiBOUl9JUlFTOworCXJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAogc3RhdGljIHZvaWQgcm91dGVfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKQEAgLTE3OCwxMCArMTkyLDkgQEAKIHZvaWQgbWlncmF0ZV9pcnFzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGksIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7Ci0JCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaTsKLQorCWZvcl9lYWNoX2lycV9kZXNjKGksIGRlc2MpIHsKIAkJaWYgKGRlc2MtPm5vZGUgPT0gY3B1KSB7CiAJCQl1bnNpZ25lZCBpbnQgbmV3Y3B1ID0gY3B1bWFza19hbnlfYW5kKGRlc2MtPmFmZmluaXR5LAogCQkJCQkJCSAgICAgIGNwdV9vbmxpbmVfbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva2dkYi5jIGIvYXJjaC9hcm0va2VybmVsL2tnZGIuYwppbmRleCBjODY4YTg4Li43NzhjMmY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rZ2RiLmMKQEAgLTEwLDU3ICsxMCw2MiBAQAogICogICAgICAgICAgIERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKLS8qIE1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSByZWdpc3RlcnMgcGFzc2VkIGludG8gdGhlIGhhbmRsZXIgKGJsZXRjaCkgKi8KLXZvaWQgcHRfcmVnc190b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKmtlcm5lbF9yZWdzKQorc3RydWN0IGRiZ19yZWdfZGVmX3QgZGJnX3JlZ19kZWZbREJHX01BWF9SRUdfTlVNXSA9CiB7Ci0JaW50IHJlZ25vOworCXsgInIwIiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yMCl9LAorCXsgInIxIiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yMSl9LAorCXsgInIyIiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yMil9LAorCXsgInIzIiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yMyl9LAorCXsgInI0IiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yNCl9LAorCXsgInI1IiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yNSl9LAorCXsgInI2IiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yNil9LAorCXsgInI3IiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yNyl9LAorCXsgInI4IiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yOCl9LAorCXsgInI5IiwgNCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIEFSTV9yOSl9LAorCXsgInIxMCIsIDQsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fcjEwKX0sCisJeyAiZnAiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX2ZwKX0sCisJeyAiaXAiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX2lwKX0sCisJeyAic3AiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX3NwKX0sCisJeyAibHIiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX2xyKX0sCisJeyAicGMiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX3BjKX0sCisJeyAiZjAiLCAxMiwgLTEgfSwKKwl7ICJmMSIsIDEyLCAtMSB9LAorCXsgImYyIiwgMTIsIC0xIH0sCisJeyAiZjMiLCAxMiwgLTEgfSwKKwl7ICJmNCIsIDEyLCAtMSB9LAorCXsgImY1IiwgMTIsIC0xIH0sCisJeyAiZjYiLCAxMiwgLTEgfSwKKwl7ICJmNyIsIDEyLCAtMSB9LAorCXsgImZwcyIsIDQsIC0xIH0sCisJeyAiY3BzciIsIDQsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fY3Bzcil9LAorfTsKIAotCS8qIEluaXRpYWxpemUgYWxsIHRvIHplcm8uICovCi0JZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgR0RCX01BWF9SRUdTOyByZWdubysrKQotCQlnZGJfcmVnc1tyZWdub10gPSAwOworY2hhciAqZGJnX2dldF9yZWcoaW50IHJlZ25vLCB2b2lkICptZW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdubyA+PSBEQkdfTUFYX1JFR19OVU0gfHwgcmVnbm8gPCAwKQorCQlyZXR1cm4gTlVMTDsKIAotCWdkYl9yZWdzW19SMF0JCT0ga2VybmVsX3JlZ3MtPkFSTV9yMDsKLQlnZGJfcmVnc1tfUjFdCQk9IGtlcm5lbF9yZWdzLT5BUk1fcjE7Ci0JZ2RiX3JlZ3NbX1IyXQkJPSBrZXJuZWxfcmVncy0+QVJNX3IyOwotCWdkYl9yZWdzW19SM10JCT0ga2VybmVsX3JlZ3MtPkFSTV9yMzsKLQlnZGJfcmVnc1tfUjRdCQk9IGtlcm5lbF9yZWdzLT5BUk1fcjQ7Ci0JZ2RiX3JlZ3NbX1I1XQkJPSBrZXJuZWxfcmVncy0+QVJNX3I1OwotCWdkYl9yZWdzW19SNl0JCT0ga2VybmVsX3JlZ3MtPkFSTV9yNjsKLQlnZGJfcmVnc1tfUjddCQk9IGtlcm5lbF9yZWdzLT5BUk1fcjc7Ci0JZ2RiX3JlZ3NbX1I4XQkJPSBrZXJuZWxfcmVncy0+QVJNX3I4OwotCWdkYl9yZWdzW19SOV0JCT0ga2VybmVsX3JlZ3MtPkFSTV9yOTsKLQlnZGJfcmVnc1tfUjEwXQkJPSBrZXJuZWxfcmVncy0+QVJNX3IxMDsKLQlnZGJfcmVnc1tfRlBdCQk9IGtlcm5lbF9yZWdzLT5BUk1fZnA7Ci0JZ2RiX3JlZ3NbX0lQXQkJPSBrZXJuZWxfcmVncy0+QVJNX2lwOwotCWdkYl9yZWdzW19TUFRdCQk9IGtlcm5lbF9yZWdzLT5BUk1fc3A7Ci0JZ2RiX3JlZ3NbX0xSXQkJPSBrZXJuZWxfcmVncy0+QVJNX2xyOwotCWdkYl9yZWdzW19QQ10JCT0ga2VybmVsX3JlZ3MtPkFSTV9wYzsKLQlnZGJfcmVnc1tfQ1BTUl0JCT0ga2VybmVsX3JlZ3MtPkFSTV9jcHNyOworCWlmIChkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0ICE9IC0xKQorCQltZW1jcHkobWVtLCAodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0LAorCQkgICAgICAgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCWVsc2UKKwkJbWVtc2V0KG1lbSwgMCwgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCXJldHVybiBkYmdfcmVnX2RlZltyZWdub10ubmFtZTsKIH0KIAotLyogQ29weSBsb2NhbCBnZGIgcmVnaXN0ZXJzIGJhY2sgdG8ga2dkYiByZWdzLCBmb3IgbGF0ZXIgY29weSB0byBrZXJuZWwgKi8KLXZvaWQgZ2RiX3JlZ3NfdG9fcHRfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKmtlcm5lbF9yZWdzKQoraW50IGRiZ19zZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlrZXJuZWxfcmVncy0+QVJNX3IwCT0gZ2RiX3JlZ3NbX1IwXTsKLQlrZXJuZWxfcmVncy0+QVJNX3IxCT0gZ2RiX3JlZ3NbX1IxXTsKLQlrZXJuZWxfcmVncy0+QVJNX3IyCT0gZ2RiX3JlZ3NbX1IyXTsKLQlrZXJuZWxfcmVncy0+QVJNX3IzCT0gZ2RiX3JlZ3NbX1IzXTsKLQlrZXJuZWxfcmVncy0+QVJNX3I0CT0gZ2RiX3JlZ3NbX1I0XTsKLQlrZXJuZWxfcmVncy0+QVJNX3I1CT0gZ2RiX3JlZ3NbX1I1XTsKLQlrZXJuZWxfcmVncy0+QVJNX3I2CT0gZ2RiX3JlZ3NbX1I2XTsKLQlrZXJuZWxfcmVncy0+QVJNX3I3CT0gZ2RiX3JlZ3NbX1I3XTsKLQlrZXJuZWxfcmVncy0+QVJNX3I4CT0gZ2RiX3JlZ3NbX1I4XTsKLQlrZXJuZWxfcmVncy0+QVJNX3I5CT0gZ2RiX3JlZ3NbX1I5XTsKLQlrZXJuZWxfcmVncy0+QVJNX3IxMAk9IGdkYl9yZWdzW19SMTBdOwotCWtlcm5lbF9yZWdzLT5BUk1fZnAJPSBnZGJfcmVnc1tfRlBdOwotCWtlcm5lbF9yZWdzLT5BUk1faXAJPSBnZGJfcmVnc1tfSVBdOwotCWtlcm5lbF9yZWdzLT5BUk1fc3AJPSBnZGJfcmVnc1tfU1BUXTsKLQlrZXJuZWxfcmVncy0+QVJNX2xyCT0gZ2RiX3JlZ3NbX0xSXTsKLQlrZXJuZWxfcmVncy0+QVJNX3BjCT0gZ2RiX3JlZ3NbX1BDXTsKLQlrZXJuZWxfcmVncy0+QVJNX2Nwc3IJPSBnZGJfcmVnc1tfQ1BTUl07CisJaWYgKHJlZ25vID49IERCR19NQVhfUkVHX05VTSB8fCByZWdubyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQgIT0gLTEpCisJCW1lbWNweSgodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0LCBtZW0sCisJCSAgICAgICBkYmdfcmVnX2RlZltyZWdub10uc2l6ZSk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQKQEAgLTE3Niw2ICsxODEsMzMgQEAKICAgICAgICBsb2NhbF9pcnFfZGlzYWJsZSgpOwogfQogCitzdGF0aWMgaW50IF9fa2dkYl9ub3RpZnkoc3RydWN0IGRpZV9hcmdzICphcmdzLCB1bnNpZ25lZCBsb25nIGNtZCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGFyZ3MtPnJlZ3M7CisKKwlpZiAoa2dkYl9oYW5kbGVfZXhjZXB0aW9uKDEsIGFyZ3MtPnNpZ25yLCBjbWQsIHJlZ3MpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9TVE9QOworfQorc3RhdGljIGludAora2dkYl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyZXQgPSBfX2tnZGJfbm90aWZ5KHB0ciwgY21kKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGtnZGJfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBrZ2RiX25vdGlmeSwKKwkucHJpb3JpdHkJPSAtSU5UX01BWCwKK307CisKKwogLyoqCiAgKglrZ2RiX2FyY2hfaW5pdCAtIFBlcmZvcm0gYW55IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbml0YWxpemF0aW9uLgogICoKQEAgLTE4NCw2ICsyMTYsMTEgQEAKICAqLwogaW50IGtnZGJfYXJjaF9pbml0KHZvaWQpCiB7CisJaW50IHJldCA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7CisKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKIAlyZWdpc3Rlcl91bmRlZl9ob29rKCZrZ2RiX2Jya3B0X2hvb2spOwogCXJlZ2lzdGVyX3VuZGVmX2hvb2soJmtnZGJfY29tcGlsZWRfYnJrcHRfaG9vayk7CiAKQEAgLTIwMCw2ICsyMzcsNyBAQAogewogCXVucmVnaXN0ZXJfdW5kZWZfaG9vaygma2dkYl9icmtwdF9ob29rKTsKIAl1bnJlZ2lzdGVyX3VuZGVmX2hvb2soJmtnZGJfY29tcGlsZWRfYnJrcHRfaG9vayk7CisJdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtnZGJfbm90aWZpZXIpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvYXJtL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggNTk4Y2E2MS4uMWZjNzRjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0zNywxMiArMzcsMTIgQEAKIHsKIH0KIAotdm9pZCBtYWNoaW5lX3NodXRkb3duKHZvaWQpCi17Ci19Ci0KIHZvaWQgbWFjaGluZV9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWNyYXNoX3NhdmVfY3B1KHJlZ3MsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJMb2FkaW5nIGNyYXNoZHVtcCBrZXJuZWwuLi5cbiIpOwogfQogCiB2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCkBAIC03NCw3ICs3NCwxMSBAQAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHJlYm9vdF9jb2RlX2J1ZmZlciArIEtFWEVDX0NPTlRST0xfUEFHRV9TSVpFKTsKIAlwcmludGsoS0VSTl9JTkZPICJCeWUhXG4iKTsKIAotCWNwdV9wcm9jX2ZpbigpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbG9jYWxfZmlxX2Rpc2FibGUoKTsKIAlzZXR1cF9tbV9mb3JfcmVib290KDApOyAvKiBtb2RlIGlzIG5vdCB1c2VkLCBzbyBqdXN0IHBhc3MgMCovCisJZmx1c2hfY2FjaGVfYWxsKCk7CisJY3B1X3Byb2NfZmluKCk7CisJZmx1c2hfY2FjaGVfYWxsKCk7CiAJY3B1X3Jlc2V0KHJlYm9vdF9jb2RlX2J1ZmZlcl9waHlzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IGRlMTI1MzYuLjQxN2MzOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMTY0LDIwICsxNjQsMjAgQEAKIAkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsCiAJCQlpbnQgaWR4KQogewotCXM2NCBsZWZ0ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CisJczY0IGxlZnQgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cGVyaW9kX2xlZnQpOwogCXM2NCBwZXJpb2QgPSBod2MtPnNhbXBsZV9wZXJpb2Q7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAodW5saWtlbHkobGVmdCA8PSAtcGVyaW9kKSkgewogCQlsZWZ0ID0gcGVyaW9kOwotCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7CiAJCWh3Yy0+bGFzdF9wZXJpb2QgPSBwZXJpb2Q7CiAJCXJldCA9IDE7CiAJfQogCiAJaWYgKHVubGlrZWx5KGxlZnQgPD0gMCkpIHsKIAkJbGVmdCArPSBwZXJpb2Q7Ci0JCWF0b21pYzY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7CisJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKIAkJaHdjLT5sYXN0X3BlcmlvZCA9IHBlcmlvZDsKIAkJcmV0ID0gMTsKIAl9CkBAIC0xODUsNyArMTg1LDcgQEAKIAlpZiAobGVmdCA+IChzNjQpYXJtcG11LT5tYXhfcGVyaW9kKQogCQlsZWZ0ID0gYXJtcG11LT5tYXhfcGVyaW9kOwogCi0JYXRvbWljNjRfc2V0KCZod2MtPnByZXZfY291bnQsICh1NjQpLWxlZnQpOworCWxvY2FsNjRfc2V0KCZod2MtPnByZXZfY291bnQsICh1NjQpLWxlZnQpOwogCiAJYXJtcG11LT53cml0ZV9jb3VudGVyKGlkeCwgKHU2NCkoLWxlZnQpICYgMHhmZmZmZmZmZik7CiAKQEAgLTIwNCwxOCArMjA0LDE4IEBACiAJdTY0IGRlbHRhOwogCiBhZ2FpbjoKLQlwcmV2X3Jhd19jb3VudCA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CisJcHJldl9yYXdfY291bnQgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CiAJbmV3X3Jhd19jb3VudCA9IGFybXBtdS0+cmVhZF9jb3VudGVyKGlkeCk7CiAKLQlpZiAoYXRvbWljNjRfY21weGNoZygmaHdjLT5wcmV2X2NvdW50LCBwcmV2X3Jhd19jb3VudCwKKwlpZiAobG9jYWw2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAogCQkJICAgICBuZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKIAkJZ290byBhZ2FpbjsKIAogCWRlbHRhID0gKG5ld19yYXdfY291bnQgPDwgc2hpZnQpIC0gKHByZXZfcmF3X2NvdW50IDw8IHNoaWZ0KTsKIAlkZWx0YSA+Pj0gc2hpZnQ7CiAKLQlhdG9taWM2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOwotCWF0b21pYzY0X3N1YihkZWx0YSwgJmh3Yy0+cGVyaW9kX2xlZnQpOworCWxvY2FsNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKKwlsb2NhbDY0X3N1YihkZWx0YSwgJmh3Yy0+cGVyaW9kX2xlZnQpOwogCiAJcmV0dXJuIG5ld19yYXdfY291bnQ7CiB9CkBAIC00NzgsNyArNDc4LDcgQEAKIAlpZiAoIWh3Yy0+c2FtcGxlX3BlcmlvZCkgewogCQlod2MtPnNhbXBsZV9wZXJpb2QgID0gYXJtcG11LT5tYXhfcGVyaW9kOwogCQlod2MtPmxhc3RfcGVyaW9kICAgID0gaHdjLT5zYW1wbGVfcGVyaW9kOwotCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CisJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOwogCX0KIAogCWVyciA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwppbmRleCBhNGE5Y2M4Li40MDFlMzhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI4LDcgKzI4LDkgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMzYsNiArMzgsMTIgQEAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAorI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrcHJvdGVjdG9yLmg+Cit1bnNpZ25lZCBsb25nIF9fc3RhY2tfY2hrX2d1YXJkIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MKF9fc3RhY2tfY2hrX2d1YXJkKTsKKyNlbmRpZgorCiBzdGF0aWMgY29uc3QgY2hhciAqcHJvY2Vzc29yX21vZGVzW10gPSB7CiAgICJVU0VSXzI2IiwgIkZJUV8yNiIgLCAiSVJRXzI2IiAsICJTVkNfMjYiICwgIlVLNF8yNiIgLCAiVUs1XzI2IiAsICJVSzZfMjYiICwgIlVLN18yNiIgLAogICAiVUs4XzI2IiAsICJVSzlfMjYiICwgIlVLMTBfMjYiLCAiVUsxMV8yNiIsICJVSzEyXzI2IiwgIlVLMTNfMjYiLCAiVUsxNF8yNiIsICJVSzE1XzI2IiwKQEAgLTg0LDEwICs5Miw5IEBACiAKIHZvaWQgYXJtX21hY2hpbmVfcmVzdGFydChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKIHsKLQkvKgotCSAqIENsZWFuIGFuZCBkaXNhYmxlIGNhY2hlLCBhbmQgdHVybiBvZmYgaW50ZXJydXB0cwotCSAqLwotCWNwdV9wcm9jX2ZpbigpOworCS8qIERpc2FibGUgaW50ZXJydXB0cyBmaXJzdCAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbG9jYWxfZmlxX2Rpc2FibGUoKTsKIAogCS8qCiAJICogVGVsbCB0aGUgbW0gc3lzdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHJlYm9vdCAtCkBAIC05Niw2ICsxMDMsMTUgQEAKIAkgKi8KIAlzZXR1cF9tbV9mb3JfcmVib290KG1vZGUpOwogCisJLyogQ2xlYW4gYW5kIGludmFsaWRhdGUgY2FjaGVzICovCisJZmx1c2hfY2FjaGVfYWxsKCk7CisKKwkvKiBUdXJuIG9mZiBjYWNoaW5nICovCisJY3B1X3Byb2NfZmluKCk7CisKKwkvKiBQdXNoIG91dCBhbnkgZnVydGhlciBkaXJ0eSBkYXRhLCBhbmQgZW5zdXJlIGNhY2hlIGlzIGVtcHR5ICovCisJZmx1c2hfY2FjaGVfYWxsKCk7CisKIAkvKgogCSAqIE5vdyBjYWxsIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgcmVib290IGNvZGUuCiAJICovCkBAIC0xODksMTkgKzIwNSwyOSBAQAogCiBfX3NldHVwKCJyZWJvb3Q9IiwgcmVib290X3NldHVwKTsKIAotdm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3ZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogeworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfc2VuZF9zdG9wKCk7CisjZW5kaWYKIH0KIAordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKKwltYWNoaW5lX3NodXRkb3duKCk7CisJd2hpbGUgKDEpOworfQogCiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7CisJbWFjaGluZV9zaHV0ZG93bigpOwogCWlmIChwbV9wb3dlcl9vZmYpCiAJCXBtX3Bvd2VyX29mZigpOwogfQogCiB2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCiB7CisJbWFjaGluZV9zaHV0ZG93bigpOwogCWFybV9wbV9yZXN0YXJ0KHJlYm9vdF9tb2RlLCBjbWQpOwogfQogCkBAIC00MjYsMyArNDUyLDkgQEAKIAl9IHdoaWxlIChjb3VudCArKyA8IDE2KTsKIAlyZXR1cm4gMDsKIH0KKwordW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyByYW5nZV9lbmQgPSBtbS0+YnJrICsgMHgwMjAwMDAwMDsKKwlyZXR1cm4gcmFuZG9taXplX3JhbmdlKG1tLT5icmssIHJhbmdlX2VuZCwgMCkgPyA6IG1tLT5icms7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2Y1NjJhNy4uZjk5ZDQ4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTIsNiArNTIsMTAyIEBACiAjZGVmaW5lIEJSRUFLSU5TVF9USFVNQgkweGRlMDEKICNlbmRpZgogCitzdHJ1Y3QgcHRfcmVnc19vZmZzZXQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG9mZnNldDsKK307CisKKyNkZWZpbmUgUkVHX09GRlNFVF9OQU1FKHIpIFwKKwl7Lm5hbWUgPSAjciwgLm9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fIyNyKX0KKyNkZWZpbmUgUkVHX09GRlNFVF9FTkQgey5uYW1lID0gTlVMTCwgLm9mZnNldCA9IDB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHRfcmVnc19vZmZzZXQgcmVnb2Zmc2V0X3RhYmxlW10gPSB7CisJUkVHX09GRlNFVF9OQU1FKHIwKSwKKwlSRUdfT0ZGU0VUX05BTUUocjEpLAorCVJFR19PRkZTRVRfTkFNRShyMiksCisJUkVHX09GRlNFVF9OQU1FKHIzKSwKKwlSRUdfT0ZGU0VUX05BTUUocjQpLAorCVJFR19PRkZTRVRfTkFNRShyNSksCisJUkVHX09GRlNFVF9OQU1FKHI2KSwKKwlSRUdfT0ZGU0VUX05BTUUocjcpLAorCVJFR19PRkZTRVRfTkFNRShyOCksCisJUkVHX09GRlNFVF9OQU1FKHI5KSwKKwlSRUdfT0ZGU0VUX05BTUUocjEwKSwKKwlSRUdfT0ZGU0VUX05BTUUoZnApLAorCVJFR19PRkZTRVRfTkFNRShpcCksCisJUkVHX09GRlNFVF9OQU1FKHNwKSwKKwlSRUdfT0ZGU0VUX05BTUUobHIpLAorCVJFR19PRkZTRVRfTkFNRShwYyksCisJUkVHX09GRlNFVF9OQU1FKGNwc3IpLAorCVJFR19PRkZTRVRfTkFNRShPUklHX3IwKSwKKwlSRUdfT0ZGU0VUX0VORCwKK307CisKKy8qKgorICogcmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZzZXQoKSAtIHF1ZXJ5IHJlZ2lzdGVyIG9mZnNldCBmcm9tIGl0cyBuYW1lCisgKiBAbmFtZToJdGhlIG5hbWUgb2YgYSByZWdpc3RlcgorICoKKyAqIHJlZ3NfcXVlcnlfcmVnaXN0ZXJfb2Zmc2V0KCkgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIGEgcmVnaXN0ZXIgaW4gc3RydWN0CisgKiBwdF9yZWdzIGZyb20gaXRzIG5hbWUuIElmIHRoZSBuYW1lIGlzIGludmFsaWQsIHRoaXMgcmV0dXJucyAtRUlOVkFMOworICovCitpbnQgcmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZzZXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgcHRfcmVnc19vZmZzZXQgKnJvZmY7CisJZm9yIChyb2ZmID0gcmVnb2Zmc2V0X3RhYmxlOyByb2ZmLT5uYW1lICE9IE5VTEw7IHJvZmYrKykKKwkJaWYgKCFzdHJjbXAocm9mZi0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gcm9mZi0+b2Zmc2V0OworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHJlZ3NfcXVlcnlfcmVnaXN0ZXJfbmFtZSgpIC0gcXVlcnkgcmVnaXN0ZXIgbmFtZSBmcm9tIGl0cyBvZmZzZXQKKyAqIEBvZmZzZXQ6CXRoZSBvZmZzZXQgb2YgYSByZWdpc3RlciBpbiBzdHJ1Y3QgcHRfcmVncy4KKyAqCisgKiByZWdzX3F1ZXJ5X3JlZ2lzdGVyX25hbWUoKSByZXR1cm5zIHRoZSBuYW1lIG9mIGEgcmVnaXN0ZXIgZnJvbSBpdHMKKyAqIG9mZnNldCBpbiBzdHJ1Y3QgcHRfcmVncy4gSWYgdGhlIEBvZmZzZXQgaXMgaW52YWxpZCwgdGhpcyByZXR1cm5zIE5VTEw7CisgKi8KK2NvbnN0IGNoYXIgKnJlZ3NfcXVlcnlfcmVnaXN0ZXJfbmFtZSh1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWNvbnN0IHN0cnVjdCBwdF9yZWdzX29mZnNldCAqcm9mZjsKKwlmb3IgKHJvZmYgPSByZWdvZmZzZXRfdGFibGU7IHJvZmYtPm5hbWUgIT0gTlVMTDsgcm9mZisrKQorCQlpZiAocm9mZi0+b2Zmc2V0ID09IG9mZnNldCkKKwkJCXJldHVybiByb2ZmLT5uYW1lOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHJlZ3Nfd2l0aGluX2tlcm5lbF9zdGFjaygpIC0gY2hlY2sgdGhlIGFkZHJlc3MgaW4gdGhlIHN0YWNrCisgKiBAcmVnczogICAgICBwdF9yZWdzIHdoaWNoIGNvbnRhaW5zIGtlcm5lbCBzdGFjayBwb2ludGVyLgorICogQGFkZHI6ICAgICAgYWRkcmVzcyB3aGljaCBpcyBjaGVja2VkLgorICoKKyAqIHJlZ3Nfd2l0aGluX2tlcm5lbF9zdGFjaygpIGNoZWNrcyBAYWRkciBpcyB3aXRoaW4gdGhlIGtlcm5lbCBzdGFjayBwYWdlKHMpLgorICogSWYgQGFkZHIgaXMgd2l0aGluIHRoZSBrZXJuZWwgc3RhY2ssIGl0IHJldHVybnMgdHJ1ZS4gSWYgbm90LCByZXR1cm5zIGZhbHNlLgorICovCitib29sIHJlZ3Nfd2l0aGluX2tlcm5lbF9zdGFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiAoKGFkZHIgJiB+KFRIUkVBRF9TSVpFIC0gMSkpICA9PQorCQkoa2VybmVsX3N0YWNrX3BvaW50ZXIocmVncykgJiB+KFRIUkVBRF9TSVpFIC0gMSkpKTsKK30KKworLyoqCisgKiByZWdzX2dldF9rZXJuZWxfc3RhY2tfbnRoKCkgLSBnZXQgTnRoIGVudHJ5IG9mIHRoZSBzdGFjaworICogQHJlZ3M6CXB0X3JlZ3Mgd2hpY2ggY29udGFpbnMga2VybmVsIHN0YWNrIHBvaW50ZXIuCisgKiBAbjoJCXN0YWNrIGVudHJ5IG51bWJlci4KKyAqCisgKiByZWdzX2dldF9rZXJuZWxfc3RhY2tfbnRoKCkgcmV0dXJucyBAbiB0aCBlbnRyeSBvZiB0aGUga2VybmVsIHN0YWNrIHdoaWNoCisgKiBpcyBzcGVjaWZpZWQgYnkgQHJlZ3MuIElmIHRoZSBAbiB0aCBlbnRyeSBpcyBOT1QgaW4gdGhlIGtlcm5lbCBzdGFjaywKKyAqIHRoaXMgcmV0dXJucyAwLgorICovCit1bnNpZ25lZCBsb25nIHJlZ3NfZ2V0X2tlcm5lbF9zdGFja19udGgoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGxvbmcgKmFkZHIgPSAodW5zaWduZWQgbG9uZyAqKWtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOworCWFkZHIgKz0gbjsKKwlpZiAocmVnc193aXRoaW5fa2VybmVsX3N0YWNrKHJlZ3MsICh1bnNpZ25lZCBsb25nKWFkZHIpKQorCQlyZXR1cm4gKmFkZHI7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKwogLyoKICAqIHRoaXMgcm91dGluZSB3aWxsIGdldCBhIHdvcmQgb2ZmIG9mIHRoZSBwcm9jZXNzZXMgcHJpdmlsZWdlZCBzdGFjay4KICAqIHRoZSBvZmZzZXQgaXMgaG93IGZhciBmcm9tIHRoZSBiYXNlIGFkZHIgYXMgc3RvcmVkIGluIHRoZSBUSFJFQUQuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgYi9hcmNoL2FybS9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKaW5kZXggNjE5MzBlYjAuLmZkMjZmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUworKysgYi9hcmNoL2FybS9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTEwLDYgKzEwLDEyIEBACiAJbGRyCXIwLGtleGVjX2luZGlyZWN0aW9uX3BhZ2UKIAlsZHIJcjEsa2V4ZWNfc3RhcnRfYWRkcmVzcwogCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBubyBpbmRpcmVjdGlvbiBwYWdlICh3ZSBhcmUgZG9pbmcgY3Jhc2hkdW1wcykKKwkgKiBza2lwIGFueSByZWxvY2F0aW9uLgorCSAqLworCWNtcAlyMCwgIzAKKwliZXEJMmYKIAogMDoJLyogdG9wLCByZWFkIGFub3RoZXIgd29yZCBmb3IgdGhlIGluZGlyZWN0aW9uIHBhZ2UgKi8KIAlsZHIJcjMsIFtyMF0sIzQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggMTIyZDk5OS4uZDUyMzFhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTE5LDEyICsxOSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL3VuaWZpZWQuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CkBAIC00NCw3ICs0Nyw5IEBACiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QpCiAjaW5jbHVkZSAiY29tcGF0LmgiCisjZW5kaWYKICNpbmNsdWRlICJhdGFncy5oIgogI2luY2x1ZGUgInRjbS5oIgogCkBAIC0yNjksNiArMjc0LDIxIEBACiBleHRlcm4gc3RydWN0IHByb2NfaW5mb19saXN0ICpsb29rdXBfcHJvY2Vzc29yX3R5cGUodW5zaWduZWQgaW50KTsKIGV4dGVybiBzdHJ1Y3QgbWFjaGluZV9kZXNjICpsb29rdXBfbWFjaGluZV90eXBlKHVuc2lnbmVkIGludCk7CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBmZWF0X3Y2X2ZpeHVwKHZvaWQpCit7CisJaW50IGlkID0gcmVhZF9jcHVpZF9pZCgpOworCisJaWYgKChpZCAmIDB4ZmYwZjAwMDApICE9IDB4NDEwNzAwMDApCisJCXJldHVybjsKKworCS8qCisJICogSFdDQVBfVExTIGlzIGF2YWlsYWJsZSBvbmx5IG9uIDExMzYgcjFwMCBhbmQgbGF0ZXIsCisJICogc2VlIGFsc28ga3VzZXJfZ2V0X3Rsc19pbml0LgorCSAqLworCWlmICgoKChpZCA+PiA0KSAmIDB4ZmZmKSA9PSAweGIzNikgJiYgKCgoaWQgPj4gMjApICYgMykgPT0gMCkpCisJCWVsZl9od2NhcCAmPSB+SFdDQVBfVExTOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfcHJvY2Vzc29yKHZvaWQpCiB7CiAJc3RydWN0IHByb2NfaW5mb19saXN0ICpsaXN0OwpAQCAtMzExLDYgKzMzMSw4IEBACiAJZWxmX2h3Y2FwICY9IH5IV0NBUF9USFVNQjsKICNlbmRpZgogCisJZmVhdF92Nl9maXh1cCgpOworCiAJY2FjaGVpZF9pbml0KCk7CiAJY3B1X3Byb2NfaW5pdCgpOwogfQpAQCAtNDAyLDEzICs0MjQsMTIgQEAKIAlzaXplIC09IHN0YXJ0ICYgflBBR0VfTUFTSzsKIAliYW5rLT5zdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOwogCWJhbmstPnNpemUgID0gc2l6ZSAmIFBBR0VfTUFTSzsKLQliYW5rLT5ub2RlICA9IFBIWVNfVE9fTklEKHN0YXJ0KTsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB0aGlzIG1lbW9yeSByZWdpb24gaGFzIG5vbi16ZXJvIHNpemUgb3IKIAkgKiBpbnZhbGlkIG5vZGUgbnVtYmVyLgogCSAqLwotCWlmIChiYW5rLT5zaXplID09IDAgfHwgYmFuay0+bm9kZSA+PSBNQVhfTlVNTk9ERVMpCisJaWYgKGJhbmstPnNpemUgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1pbmZvLm5yX2JhbmtzKys7CkBAIC02NjMsNiArNjg0LDg2IEBACiB9CiBhcmNoX2luaXRjYWxsKGN1c3RvbWl6ZV9tYWNoaW5lKTsKIAorI2lmZGVmIENPTkZJR19LRVhFQworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X3RvdGFsX21lbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG90YWw7CisKKwl0b3RhbCA9IG1heF9sb3dfcGZuIC0gbWluX2xvd19wZm47CisJcmV0dXJuIHRvdGFsIDw8IFBBR0VfU0hJRlQ7Cit9CisKKy8qKgorICogcmVzZXJ2ZV9jcmFzaGtlcm5lbCgpIC0gcmVzZXJ2ZXMgbWVtb3J5IGFyZSBmb3IgY3Jhc2gga2VybmVsCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBtZW1vcnkgYXJlYSBnaXZlbiBpbiAiY3Jhc2hrZXJuZWw9IiBrZXJuZWwgY29tbWFuZAorICogbGluZSBwYXJhbWV0ZXIuIFRoZSBtZW1vcnkgcmVzZXJ2ZWQgaXMgdXNlZCBieSBhIGR1bXAgY2FwdHVyZSBrZXJuZWwgd2hlbgorICogcHJpbWFyeSBrZXJuZWwgaXMgY3Jhc2hpbmcuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2NyYXNoa2VybmVsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNyYXNoX3NpemUsIGNyYXNoX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX21lbTsKKwlpbnQgcmV0OworCisJdG90YWxfbWVtID0gZ2V0X3RvdGFsX21lbSgpOworCXJldCA9IHBhcnNlX2NyYXNoa2VybmVsKGJvb3RfY29tbWFuZF9saW5lLCB0b3RhbF9tZW0sCisJCQkJJmNyYXNoX3NpemUsICZjcmFzaF9iYXNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwlyZXQgPSByZXNlcnZlX2Jvb3RtZW0oY3Jhc2hfYmFzZSwgY3Jhc2hfc2l6ZSwgQk9PVE1FTV9FWENMVVNJVkUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNyYXNoa2VybmVsIHJlc2VydmF0aW9uIGZhaWxlZCAtICIKKwkJICAgICAgICJtZW1vcnkgaXMgaW4gdXNlICgweCVseClcbiIsICh1bnNpZ25lZCBsb25nKWNyYXNoX2Jhc2UpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXJ2aW5nICVsZE1CIG9mIG1lbW9yeSBhdCAlbGRNQiAiCisJICAgICAgICJmb3IgY3Jhc2hrZXJuZWwgKFN5c3RlbSBSQU06ICVsZE1CKVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpKGNyYXNoX3NpemUgPj4gMjApLAorCSAgICAgICAodW5zaWduZWQgbG9uZykoY3Jhc2hfYmFzZSA+PiAyMCksCisJICAgICAgICh1bnNpZ25lZCBsb25nKSh0b3RhbF9tZW0gPj4gMjApKTsKKworCWNyYXNoa19yZXMuc3RhcnQgPSBjcmFzaF9iYXNlOworCWNyYXNoa19yZXMuZW5kID0gY3Jhc2hfYmFzZSArIGNyYXNoX3NpemUgLSAxOworCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZjcmFzaGtfcmVzKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXJ2ZV9jcmFzaGtlcm5lbCh2b2lkKSB7fQorI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLworCisvKgorICogTm90ZTogZWxmY29yZWhkcl9hZGRyIGlzIG5vdCBqdXN0IGxpbWl0ZWQgdG8gdm1jb3JlLiBJdCBpcyBhbHNvIHVzZWQgYnkKKyAqIGlzX2tkdW1wX2tlcm5lbCgpIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgYm9vdGluZyBhZnRlciBhIHBhbmljLiBIZW5jZQorICogaWZkZWYgaXQgdW5kZXIgQ09ORklHX0NSQVNIX0RVTVAgYW5kIG5vdCBDT05GSUdfUFJPQ19WTUNPUkUuCisgKi8KKworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisvKgorICogZWxmY29yZWhkcj0gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBlbGYgY29yZSBoZWFkZXIgc3RvcmVkIGJ5IHRoZSBjcmFzaGVkCisgKiBrZXJuZWwuIFRoaXMgb3B0aW9uIHdpbGwgYmUgcGFzc2VkIGJ5IGtleGVjIGxvYWRlciB0byB0aGUgY2FwdHVyZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2VsZmNvcmVoZHIoY2hhciAqYXJnKQoreworCWNoYXIgKmVuZDsKKworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGFyZywgJmVuZCk7CisJcmV0dXJuIGVuZCA+IGFyZyA/IDAgOiAtRUlOVkFMOworfQorZWFybHlfcGFyYW0oImVsZmNvcmVoZHIiLCBzZXR1cF9lbGZjb3JlaGRyKTsKKyNlbmRpZiAvKiBDT05GSUdfQ1JBU0hfRFVNUCAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgc3F1YXNoX21lbV90YWdzKHN0cnVjdCB0YWcgKnRhZykKK3sKKwlmb3IgKDsgdGFnLT5oZHIuc2l6ZTsgdGFnID0gdGFnX25leHQodGFnKSkKKwkJaWYgKHRhZy0+aGRyLnRhZyA9PSBBVEFHX01FTSkKKwkJCXRhZy0+aGRyLnRhZyA9IEFUQUdfTk9ORTsKK30KKwogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewogCXN0cnVjdCB0YWcgKnRhZ3MgPSAoc3RydWN0IHRhZyAqKSZpbml0X3RhZ3M7CkBAIC02ODMsMTIgKzc4NCwxNCBAQAogCWVsc2UgaWYgKG1kZXNjLT5ib290X3BhcmFtcykKIAkJdGFncyA9IHBoeXNfdG9fdmlydChtZGVzYy0+Ym9vdF9wYXJhbXMpOwogCisjaWYgZGVmaW5lZChDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QpCiAJLyoKIAkgKiBJZiB3ZSBoYXZlIHRoZSBvbGQgc3R5bGUgcGFyYW1ldGVycywgY29udmVydCB0aGVtIHRvCiAJICogYSB0YWcgbGlzdC4KIAkgKi8KIAlpZiAodGFncy0+aGRyLnRhZyAhPSBBVEFHX0NPUkUpCiAJCWNvbnZlcnRfdG9fdGFnX2xpc3QodGFncyk7CisjZW5kaWYKIAlpZiAodGFncy0+aGRyLnRhZyAhPSBBVEFHX0NPUkUpCiAJCXRhZ3MgPSAoc3RydWN0IHRhZyAqKSZpbml0X3RhZ3M7CiAKQEAgLTcxNiwxMiArODE5LDE1IEBACiAKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCisJYXJtX21lbWJsb2NrX2luaXQoJm1lbWluZm8sIG1kZXNjKTsKKwogCXBhZ2luZ19pbml0KG1kZXNjKTsKIAlyZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcygmbWVtaW5mbywgbWRlc2MpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9pbml0X2NwdXMoKTsKICNlbmRpZgorCXJlc2VydmVfY3Jhc2hrZXJuZWwoKTsKIAogCWNwdV9pbml0KCk7CiAJdGNtX2luaXQoKTsKQEAgLTcyOSw2ICs4MzUsNyBAQAogCS8qCiAJICogU2V0IHVwIHZhcmlvdXMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHBvaW50ZXJzCiAJICovCisJYXJjaF9ucl9pcnFzID0gbWRlc2MtPm5yX2lycXM7CiAJaW5pdF9hcmNoX2lycSA9IG1kZXNjLT5pbml0X2lycTsKIAlzeXN0ZW1fdGltZXIgPSBtZGVzYy0+dGltZXI7CiAJaW5pdF9tYWNoaW5lID0gbWRlc2MtPmluaXRfbWFjaGluZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCBiOGMzZDBmLi40MGRjNzRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC00MjksNyArNDI5LDExIEBACiB7CiAJc2VuZF9pcGlfbWVzc2FnZShtYXNrLCBJUElfVElNRVIpOwogfQorI2Vsc2UKKyNkZWZpbmUgc21wX3RpbWVyX2Jyb2FkY2FzdAlOVUxMCisjZW5kaWYKIAorI2lmbmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCiBzdGF0aWMgdm9pZCBicm9hZGNhc3RfdGltZXJfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewpAQCAtNDQ0LDcgKzQ0OCw2IEBACiAJZXZ0LT5yYXRpbmcJPSA0MDA7CiAJZXZ0LT5tdWx0CT0gMTsKIAlldnQtPnNldF9tb2RlCT0gYnJvYWRjYXN0X3RpbWVyX3NldF9tb2RlOwotCWV2dC0+YnJvYWRjYXN0CT0gc21wX3RpbWVyX2Jyb2FkY2FzdDsKIAogCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShldnQpOwogfQpAQCAtNDU2LDYgKzQ1OSw3IEBACiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gJnBlcl9jcHUocGVyY3B1X2Nsb2NrZXZlbnQsIGNwdSk7CiAKIAlldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CisJZXZ0LT5icm9hZGNhc3QgPSBzbXBfdGltZXJfYnJvYWRjYXN0OwogCiAJbG9jYWxfdGltZXJfc2V0dXAoZXZ0KTsKIH0KQEAgLTQ2NywxMCArNDcxLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGlwaV9jcHVfc3RvcCh1bnNpZ25lZCBpbnQgY3B1KQogewotCXNwaW5fbG9jaygmc3RvcF9sb2NrKTsKLQlwcmludGsoS0VSTl9DUklUICJDUFUldTogc3RvcHBpbmdcbiIsIGNwdSk7Ci0JZHVtcF9zdGFjaygpOwotCXNwaW5fdW5sb2NrKCZzdG9wX2xvY2spOworCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcgfHwKKwkgICAgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKSB7CisJCXNwaW5fbG9jaygmc3RvcF9sb2NrKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJXU6IHN0b3BwaW5nXG4iLCBjcHUpOworCQlkdW1wX3N0YWNrKCk7CisJCXNwaW5fdW5sb2NrKCZzdG9wX2xvY2spOworCX0KIAogCXNldF9jcHVfb25saW5lKGNwdSwgZmFsc2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwppbmRleCA3YzVmMGMwLi4zNTg4MmZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKQEAgLTEzMiw3ICsxMzIsOCBAQAogCXR3ZF9jYWxpYnJhdGVfcmF0ZSgpOwogCiAJY2xrLT5uYW1lID0gImxvY2FsX3RpbWVyIjsKLQljbGstPmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9UOworCWNsay0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1QgfAorCQkJQ0xPQ0tfRVZUX0ZFQVRfQzNTVE9QOwogCWNsay0+cmF0aW5nID0gMzUwOwogCWNsay0+c2V0X21vZGUgPSB0d2Rfc2V0X21vZGU7CiAJY2xrLT5zZXRfbmV4dF9ldmVudCA9IHR3ZF9zZXRfbmV4dF9ldmVudDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90Y20uYyBiL2FyY2gvYXJtL2tlcm5lbC90Y20uYwppbmRleCBlNTAzMDM4Li4yNjY4NWMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdGNtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RjbS5jCkBAIC0xMywzOCArMTMsMzUgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1jcHkgKi8KLSNpbmNsdWRlIDxhc20vcGFnZS5oPiAvKiBQQUdFX1NISUZUICovCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgogI2luY2x1ZGUgInRjbS5oIgogCi0vKiBTY3JlYW0gYW5kIHdhcm4gYWJvdXQgbWlzdXNlICovCi0jaWYgIWRlZmluZWQoSVRDTV9PRkZTRVQpIHx8ICFkZWZpbmVkKElUQ01fRU5EKSB8fCBcCi0gICAgIWRlZmluZWQoRFRDTV9PRkZTRVQpIHx8ICFkZWZpbmVkKERUQ01fRU5EKQotI2Vycm9yICJUQ00gc3VwcG9ydCBzZWxlY3RlZCBidXQgb2Zmc2V0cyBub3QgZGVmaW5lZCEiCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBnZW5fcG9vbCAqdGNtX3Bvb2w7CiAKIC8qIFRDTSBzZWN0aW9uIGRlZmluaXRpb25zIGZyb20gdGhlIGxpbmtlciAqLwogZXh0ZXJuIGNoYXIgX19pdGNtX3N0YXJ0LCBfX3NpdGNtX3RleHQsIF9fZWl0Y21fdGV4dDsKIGV4dGVybiBjaGFyIF9fZHRjbV9zdGFydCwgX19zZHRjbV9kYXRhLCBfX2VkdGNtX2RhdGE7CiAKKy8qIFRoZXNlIHdpbGwgYmUgaW5jcmVhc2VkIGFzIHdlIHJ1biAqLwordTMyIGR0Y21fZW5kID0gRFRDTV9PRkZTRVQ7Cit1MzIgaXRjbV9lbmQgPSBJVENNX09GRlNFVDsKKwogLyoKICAqIFRDTSBtZW1vcnkgcmVzb3VyY2VzCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZHRjbV9yZXMgPSB7CiAJLm5hbWUgPSAiRFRDTSBSQU0iLAogCS5zdGFydCA9IERUQ01fT0ZGU0VULAotCS5lbmQgPSBEVENNX0VORCwKKwkuZW5kID0gRFRDTV9PRkZTRVQsCiAJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXRjbV9yZXMgPSB7CiAJLm5hbWUgPSAiSVRDTSBSQU0iLAogCS5zdGFydCA9IElUQ01fT0ZGU0VULAotCS5lbmQgPSBJVENNX0VORCwKKwkuZW5kID0gSVRDTV9PRkZTRVQsCiAJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KIH07CiAKQEAgLTUyLDggKzQ5LDggQEAKIAl7CiAJCS52aXJ0dWFsCT0gRFRDTV9PRkZTRVQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihEVENNX09GRlNFVCksCi0JCS5sZW5ndGgJCT0gKERUQ01fRU5EIC0gRFRDTV9PRkZTRVQgKyAxKSwKLQkJLnR5cGUJCT0gTVRfVU5DQUNIRUQKKwkJLmxlbmd0aAkJPSAwLAorCQkudHlwZQkJPSBNVF9NRU1PUllfRFRDTQogCX0KIH07CiAKQEAgLTYxLDggKzU4LDggQEAKIAl7CiAJCS52aXJ0dWFsCT0gSVRDTV9PRkZTRVQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJVENNX09GRlNFVCksCi0JCS5sZW5ndGgJCT0gKElUQ01fRU5EIC0gSVRDTV9PRkZTRVQgKyAxKSwKLQkJLnR5cGUJCT0gTVRfVU5DQUNIRUQKKwkJLmxlbmd0aAkJPSAwLAorCQkudHlwZQkJPSBNVF9NRU1PUllfSVRDTQogCX0KIH07CiAKQEAgLTkzLDE0ICs5MCwyNCBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y21fZnJlZSk7CiAKLQotc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3RjbV9iYW5rKHU4IHR5cGUsIHUzMiBvZmZzZXQsIHUzMiBleHBlY3RlZF9zaXplKQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfdGNtX2JhbmsodTggdHlwZSwgdTggYmFuaywgdTggYmFua3MsCisJCQkJICB1MzIgKm9mZnNldCkKIHsKIAljb25zdCBpbnQgdGNtX3NpemVzWzE2XSA9IHsgMCwgLTEsIC0xLCA0LCA4LCAxNiwgMzIsIDY0LCAxMjgsCiAJCQkJICAgIDI1NiwgNTEyLCAxMDI0LCAtMSwgLTEsIC0xLCAtMSB9OwogCXUzMiB0Y21fcmVnaW9uOwogCWludCB0Y21fc2l6ZTsKIAorCS8qCisJICogSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgVENNIGJhbmsgb2YgdGhpcyB0eXBlLAorCSAqIHNlbGVjdCB0aGUgVENNIGJhbmsgdG8gb3BlcmF0ZSBvbiBpbiB0aGUgVENNIHNlbGVjdGlvbgorCSAqIHJlZ2lzdGVyLgorCSAqLworCWlmIChiYW5rcyA+IDEpCisJCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM5LCBjMiwgMCIKKwkJICAgIDogLyogTm8gb3V0cHV0IG9wZXJhbmRzICovCisJCSAgICA6ICJyIiAoYmFuaykpOworCiAJLyogUmVhZCB0aGUgc3BlY2lhbCBUQ00gcmVnaW9uIHJlZ2lzdGVyIGM5LCAwICovCiAJaWYgKCF0eXBlKQogCQlhc20oIm1yYwlwMTUsIDAsICUwLCBjOSwgYzEsIDAiCkBAIC0xMTEsMjYgKzExOCwyNCBAQAogCiAJdGNtX3NpemUgPSB0Y21fc2l6ZXNbKHRjbV9yZWdpb24gPj4gMikgJiAweDBmXTsKIAlpZiAodGNtX3NpemUgPCAwKSB7Ci0JCXByX2VycigiQ1BVOiAlc1RDTSBvZiB1bmtub3duIHNpemUhXG4iLAotCQkJdHlwZSA/ICJJIiA6ICJEIik7CisJCXByX2VycigiQ1BVOiAlc1RDTSVkIG9mIHVua25vd24gc2l6ZVxuIiwKKwkJICAgICAgIHR5cGUgPyAiSSIgOiAiRCIsIGJhbmspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHRjbV9zaXplID4gMzIpIHsKKwkJcHJfZXJyKCJDUFU6ICVzVENNJWQgbGFyZ2VyIHRoYW4gMzJrIGZvdW5kXG4iLAorCQkgICAgICAgdHlwZSA/ICJJIiA6ICJEIiwgYmFuayk7CisJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7Ci0JCXByX2luZm8oIkNQVTogZm91bmQgJXNUQ00gJWRrIEAgJTA4eCwgJXNlbmFibGVkXG4iLAorCQlwcl9pbmZvKCJDUFU6IGZvdW5kICVzVENNJWQgJWRrIEAgJTA4eCwgJXNlbmFibGVkXG4iLAogCQkJdHlwZSA/ICJJIiA6ICJEIiwKKwkJCWJhbmssCiAJCQl0Y21fc2l6ZSwKIAkJCSh0Y21fcmVnaW9uICYgMHhmZmZmZjAwMFUpLAogCQkJKHRjbV9yZWdpb24gJiAxKSA/ICIiIDogIm5vdCAiKTsKIAl9CiAKLQlpZiAodGNtX3NpemUgIT0gZXhwZWN0ZWRfc2l6ZSkgewotCQlwcl9jcml0KCJDUFU6ICVzVENNIHdhcyBkZXRlY3RlZCAlZGsgYnV0IGV4cGVjdGVkICVkayFcbiIsCi0JCSAgICAgICB0eXBlID8gIkkiIDogIkQiLAotCQkgICAgICAgdGNtX3NpemUsCi0JCSAgICAgICBleHBlY3RlZF9zaXplKTsKLQkJLyogQWRqdXN0IHRvIHRoZSBleHBlY3RlZCBzaXplPyB3aGF0IGNhbiB3ZSBkby4uLiAqLwotCX0KLQogCS8qIEZvcmNlIG1vdmUgdGhlIFRDTSBiYW5rIHRvIHdoZXJlIHdlIHdhbnQgaXQsIGVuYWJsZSAqLwotCXRjbV9yZWdpb24gPSBvZmZzZXQgfCAodGNtX3JlZ2lvbiAmIDB4MDAwMDBmZmVVKSB8IDE7CisJdGNtX3JlZ2lvbiA9ICpvZmZzZXQgfCAodGNtX3JlZ2lvbiAmIDB4MDAwMDBmZmVVKSB8IDE7CiAKIAlpZiAoIXR5cGUpCiAJCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM5LCBjMSwgMCIKQEAgLTE0MSwxMCArMTQ2LDE1IEBACiAJCSAgICA6IC8qIE5vIG91dHB1dCBvcGVyYW5kcyAqLwogCQkgICAgOiAiciIgKHRjbV9yZWdpb24pKTsKIAotCXByX2RlYnVnKCJDUFU6IG1vdmVkICVzVENNICVkayB0byAlMDh4LCBlbmFibGVkXG4iLAotCQkgdHlwZSA/ICJJIiA6ICJEIiwKLQkJIHRjbV9zaXplLAotCQkgKHRjbV9yZWdpb24gJiAweGZmZmZmMDAwVSkpOworCS8qIEluY3JlYXNlIG9mZnNldCAqLworCSpvZmZzZXQgKz0gKHRjbV9zaXplIDw8IDEwKTsKKworCXByX2luZm8oIkNQVTogbW92ZWQgJXNUQ00lZCAlZGsgdG8gJTA4eCwgZW5hYmxlZFxuIiwKKwkJdHlwZSA/ICJJIiA6ICJEIiwKKwkJYmFuaywKKwkJdGNtX3NpemUsCisJCSh0Y21fcmVnaW9uICYgMHhmZmZmZjAwMFUpKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE1MywzNCArMTYzLDUyIEBACiB2b2lkIF9faW5pdCB0Y21faW5pdCh2b2lkKQogewogCXUzMiB0Y21fc3RhdHVzID0gcmVhZF9jcHVpZF90Y21zdGF0dXMoKTsKKwl1OCBkdGNtX2JhbmtzID0gKHRjbV9zdGF0dXMgPj4gMTYpICYgMHgwMzsKKwl1OCBpdGNtX2JhbmtzID0gKHRjbV9zdGF0dXMgJiAweDAzKTsKIAljaGFyICpzdGFydDsKIAljaGFyICplbmQ7CiAJY2hhciAqcmFtOworCWludCByZXQ7CisJaW50IGk7CiAKIAkvKiBTZXR1cCBEVENNIGlmIHByZXNlbnQgKi8KLQlpZiAodGNtX3N0YXR1cyAmICgxIDw8IDE2KSkgewotCQlzZXR1cF90Y21fYmFuaygwLCBEVENNX09GRlNFVCwKLQkJCSAgICAgICAoRFRDTV9FTkQgLSBEVENNX09GRlNFVCArIDEpID4+IDEwKTsKKwlpZiAoZHRjbV9iYW5rcyA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGR0Y21fYmFua3M7IGkrKykgeworCQkJcmV0ID0gc2V0dXBfdGNtX2JhbmsoMCwgaSwgZHRjbV9iYW5rcywgJmR0Y21fZW5kKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuOworCQl9CisJCWR0Y21fcmVzLmVuZCA9IGR0Y21fZW5kIC0gMTsKIAkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZkdGNtX3Jlcyk7CisJCWR0Y21faW9tYXBbMF0ubGVuZ3RoID0gZHRjbV9lbmQgLSBEVENNX09GRlNFVDsKIAkJaW90YWJsZV9pbml0KGR0Y21faW9tYXAsIDEpOwogCQkvKiBDb3B5IGRhdGEgZnJvbSBSQU0gdG8gRFRDTSAqLwogCQlzdGFydCA9ICZfX3NkdGNtX2RhdGE7CiAJCWVuZCAgID0gJl9fZWR0Y21fZGF0YTsKIAkJcmFtICAgPSAmX19kdGNtX3N0YXJ0OworCQkvKiBUaGlzIG1lYW5zIHlvdSBjb21waWxlZCBtb3JlIGNvZGUgdGhhbiBmaXRzIGludG8gRFRDTSAqLworCQlCVUdfT04oKGVuZCAtIHN0YXJ0KSA+IChkdGNtX2VuZCAtIERUQ01fT0ZGU0VUKSk7CiAJCW1lbWNweShzdGFydCwgcmFtLCAoZW5kLXN0YXJ0KSk7CiAJCXByX2RlYnVnKCJDUFUgRFRDTTogY29waWVkIGRhdGEgZnJvbSAlcCAtICVwXG4iLCBzdGFydCwgZW5kKTsKIAl9CiAKIAkvKiBTZXR1cCBJVENNIGlmIHByZXNlbnQgKi8KLQlpZiAodGNtX3N0YXR1cyAmIDEpIHsKLQkJc2V0dXBfdGNtX2JhbmsoMSwgSVRDTV9PRkZTRVQsCi0JCQkgICAgICAgKElUQ01fRU5EIC0gSVRDTV9PRkZTRVQgKyAxKSA+PiAxMCk7CisJaWYgKGl0Y21fYmFua3MgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpdGNtX2JhbmtzOyBpKyspIHsKKwkJCXJldCA9IHNldHVwX3RjbV9iYW5rKDEsIGksIGl0Y21fYmFua3MsICZpdGNtX2VuZCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybjsKKwkJfQorCQlpdGNtX3Jlcy5lbmQgPSBpdGNtX2VuZCAtIDE7CiAJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmaXRjbV9yZXMpOworCQlpdGNtX2lvbWFwWzBdLmxlbmd0aCA9IGl0Y21fZW5kIC0gSVRDTV9PRkZTRVQ7CiAJCWlvdGFibGVfaW5pdChpdGNtX2lvbWFwLCAxKTsKIAkJLyogQ29weSBjb2RlIGZyb20gUkFNIHRvIElUQ00gKi8KIAkJc3RhcnQgPSAmX19zaXRjbV90ZXh0OwogCQllbmQgICA9ICZfX2VpdGNtX3RleHQ7CiAJCXJhbSAgID0gJl9faXRjbV9zdGFydDsKKwkJLyogVGhpcyBtZWFucyB5b3UgY29tcGlsZWQgbW9yZSBjb2RlIHRoYW4gZml0cyBpbnRvIElUQ00gKi8KKwkJQlVHX09OKChlbmQgLSBzdGFydCkgPiAoaXRjbV9lbmQgLSBJVENNX09GRlNFVCkpOwogCQltZW1jcHkoc3RhcnQsIHJhbSwgKGVuZC1zdGFydCkpOwogCQlwcl9kZWJ1ZygiQ1BVIElUQ006IGNvcGllZCBjb2RlIGZyb20gJXAgLSAlcFxuIiwgc3RhcnQsIGVuZCk7CiAJfQpAQCAtMjA4LDEwICsyMzYsMTAgQEAKIAlwcl9kZWJ1ZygiU2V0dGluZyB1cCBUQ00gbWVtb3J5IHBvb2xcbiIpOwogCiAJLyogQWRkIHRoZSByZXN0IG9mIERUQ00gdG8gdGhlIFRDTSBwb29sICovCi0JaWYgKHRjbV9zdGF0dXMgJiAoMSA8PCAxNikpIHsKLQkJaWYgKGR0Y21fcG9vbF9zdGFydCA8IERUQ01fRU5EKSB7CisJaWYgKHRjbV9zdGF0dXMgJiAoMHgwMyA8PCAxNikpIHsKKwkJaWYgKGR0Y21fcG9vbF9zdGFydCA8IGR0Y21fZW5kKSB7CiAJCQlyZXQgPSBnZW5fcG9vbF9hZGQodGNtX3Bvb2wsIGR0Y21fcG9vbF9zdGFydCwKLQkJCQkJICAgRFRDTV9FTkQgLSBkdGNtX3Bvb2xfc3RhcnQgKyAxLCAtMSk7CisJCQkJCSAgIGR0Y21fZW5kIC0gZHRjbV9wb29sX3N0YXJ0LCAtMSk7CiAJCQlpZiAocmV0KSB7CiAJCQkJcHJfZXJyKCJDUFUgRFRDTTogY291bGQgbm90IGFkZCBEVENNICIgXAogCQkJCSAgICAgICAicmVtYWluZGVyIHRvIHBvb2whXG4iKTsKQEAgLTIxOSwxNiArMjQ3LDE2IEBACiAJCQl9CiAJCQlwcl9kZWJ1ZygiQ1BVIERUQ006IEFkZGVkICUwOHggYnl0ZXMgQCAlMDh4IHRvICIgXAogCQkJCSAidGhlIFRDTSBtZW1vcnkgcG9vbFxuIiwKLQkJCQkgRFRDTV9FTkQgLSBkdGNtX3Bvb2xfc3RhcnQgKyAxLAorCQkJCSBkdGNtX2VuZCAtIGR0Y21fcG9vbF9zdGFydCwKIAkJCQkgZHRjbV9wb29sX3N0YXJ0KTsKIAkJfQogCX0KIAogCS8qIEFkZCB0aGUgcmVzdCBvZiBJVENNIHRvIHRoZSBUQ00gcG9vbCAqLwotCWlmICh0Y21fc3RhdHVzICYgMSkgewotCQlpZiAoaXRjbV9wb29sX3N0YXJ0IDwgSVRDTV9FTkQpIHsKKwlpZiAodGNtX3N0YXR1cyAmIDB4MDMpIHsKKwkJaWYgKGl0Y21fcG9vbF9zdGFydCA8IGl0Y21fZW5kKSB7CiAJCQlyZXQgPSBnZW5fcG9vbF9hZGQodGNtX3Bvb2wsIGl0Y21fcG9vbF9zdGFydCwKLQkJCQkJICAgSVRDTV9FTkQgLSBpdGNtX3Bvb2xfc3RhcnQgKyAxLCAtMSk7CisJCQkJCSAgIGl0Y21fZW5kIC0gaXRjbV9wb29sX3N0YXJ0LCAtMSk7CiAJCQlpZiAocmV0KSB7CiAJCQkJcHJfZXJyKCJDUFUgSVRDTTogY291bGQgbm90IGFkZCBJVENNICIgXAogCQkJCSAgICAgICAicmVtYWluZGVyIHRvIHBvb2whXG4iKTsKQEAgLTIzNiw3ICsyNjQsNyBAQAogCQkJfQogCQkJcHJfZGVidWcoIkNQVSBJVENNOiBBZGRlZCAlMDh4IGJ5dGVzIEAgJTA4eCB0byAiIFwKIAkJCQkgInRoZSBUQ00gbWVtb3J5IHBvb2xcbiIsCi0JCQkJIElUQ01fRU5EIC0gaXRjbV9wb29sX3N0YXJ0ICsgMSwKKwkJCQkgaXRjbV9lbmQgLSBpdGNtX3Bvb2xfc3RhcnQsCiAJCQkJIGl0Y21fcG9vbF9zdGFydCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCmluZGV4IDE2MjFlNTMuLmNkYTc4ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KKyNpbmNsdWRlIDxhc20vdGxzLmg+CiAKICNpbmNsdWRlICJwdHJhY2UuaCIKICNpbmNsdWRlICJzaWduYWwuaCIKQEAgLTUxOCwxNyArNTE5LDIwIEBACiAKIAljYXNlIE5SKHNldF90bHMpOgogCQl0aHJlYWQtPnRwX3ZhbHVlID0gcmVncy0+QVJNX3IwOwotI2lmIGRlZmluZWQoQ09ORklHX0hBU19UTFNfUkVHKQotCQlhc20gKCJtY3IgcDE1LCAwLCAlMCwgYzEzLCBjMCwgMyIgOiA6ICJyIiAocmVncy0+QVJNX3IwKSApOwotI2VsaWYgIWRlZmluZWQoQ09ORklHX1RMU19SRUdfRU1VTCkKLQkJLyoKLQkJICogVXNlciBzcGFjZSBtdXN0IG5ldmVyIHRyeSB0byBhY2Nlc3MgdGhpcyBkaXJlY3RseS4KLQkJICogRXhwZWN0IHlvdXIgYXBwIHRvIGJyZWFrIGV2ZW50dWFsbHkgaWYgeW91IGRvIHNvLgotCQkgKiBUaGUgdXNlciBoZWxwZXIgYXQgMHhmZmZmMGZlMCBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KLQkJICogKHNlZSBlbnRyeS1hcm12LlMgZm9yIGRldGFpbHMpCi0JCSAqLwotCQkqKCh1bnNpZ25lZCBpbnQgKikweGZmZmYwZmYwKSA9IHJlZ3MtPkFSTV9yMDsKLSNlbmRpZgorCQlpZiAodGxzX2VtdSkKKwkJCXJldHVybiAwOworCQlpZiAoaGFzX3Rsc19yZWcpIHsKKwkJCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjMTMsIGMwLCAzIgorCQkJCTogOiAiciIgKHJlZ3MtPkFSTV9yMCkpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFVzZXIgc3BhY2UgbXVzdCBuZXZlciB0cnkgdG8gYWNjZXNzIHRoaXMgZGlyZWN0bHkuCisJCQkgKiBFeHBlY3QgeW91ciBhcHAgdG8gYnJlYWsgZXZlbnR1YWxseSBpZiB5b3UgZG8gc28uCisJCQkgKiBUaGUgdXNlciBoZWxwZXIgYXQgMHhmZmZmMGZlMCBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KKwkJCSAqIChzZWUgZW50cnktYXJtdi5TIGZvciBkZXRhaWxzKQorCQkJICovCisJCQkqKCh1bnNpZ25lZCBpbnQgKikweGZmZmYwZmYwKSA9IHJlZ3MtPkFSTV9yMDsKKwkJfQogCQlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19ORUVEU19TWVNDQUxMX0ZPUl9DTVBYQ0hHCkBAIC03NDMsNiArNzQ3LDE2IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQga3VzZXJfZ2V0X3Rsc19pbml0KHVuc2lnbmVkIGxvbmcgdmVjdG9ycykKK3sKKwkvKgorCSAqIHZlY3RvcnMgKyAweGZlMCA9IF9fa3VzZXJfZ2V0X3RscworCSAqIHZlY3RvcnMgKyAweGZlOCA9IGhhcmR3YXJlIFRMUyBpbnN0cnVjdGlvbiBhdCAweGZmZmYwZmU4CisJICovCisJaWYgKHRsc19lbXUgfHwgaGFzX3Rsc19yZWcpCisJCW1lbWNweSgodm9pZCAqKXZlY3RvcnMgKyAweGZlMCwgKHZvaWQgKil2ZWN0b3JzICsgMHhmZTgsIDQpOworfQorCiB2b2lkIF9faW5pdCBlYXJseV90cmFwX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHZlY3RvcnMgPSBDT05GSUdfVkVDVE9SU19CQVNFOwpAQCAtNzYxLDYgKzc3NSwxMSBAQAogCW1lbWNweSgodm9pZCAqKXZlY3RvcnMgKyAweDEwMDAgLSBrdXNlcl9zeiwgX19rdXNlcl9oZWxwZXJfc3RhcnQsIGt1c2VyX3N6KTsKIAogCS8qCisJICogRG8gcHJvY2Vzc29yIHNwZWNpZmljIGZpeHVwcyBmb3IgdGhlIGt1c2VyIGhlbHBlcnMKKwkgKi8KKwlrdXNlcl9nZXRfdGxzX2luaXQodmVjdG9ycyk7CisKKwkvKgogCSAqIENvcHkgc2lnbmFsIHJldHVybiBoYW5kbGVycyBpbnRvIHRoZSB2ZWN0b3IgcGFnZSwgYW5kCiAJICogc2V0IHNpZ3JldHVybiB0byBiZSBhIHBvaW50ZXIgdG8gdGhlc2UuCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvTWFrZWZpbGUgYi9hcmNoL2FybS9saWIvTWFrZWZpbGUKaW5kZXggMDMwYmE3Mi4uNTlmZjQyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2xpYi9NYWtlZmlsZQpAQCAtNDEsNyArNDEsNiBAQAogZW5kaWYKIAogbGliLSQoQ09ORklHX0FSQ0hfUlBDKQkJKz0gZWNhcmQubyBpby1hY29ybi5vIGZsb3BweWRtYS5vCi1saWItJChDT05GSUdfQVJDSF9MNzIwMCkJKz0gaW8tYWNvcm4ubwogbGliLSQoQ09ORklHX0FSQ0hfU0hBUkspCSs9IGlvLXNoYXJrLm8KIAogJChvYmopL2NzdW1wYXJ0aWFsY29weS5vOgkkKG9iaikvY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwppbmRleCA1OWZmNmZkLi43ZDA4YjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJLnB1c2hzZWN0aW9uIC5maXh1cCwiYXgiCiAJCS5hbGlnbgk0CiA5MDAxOgkJbW92CXI0LCAjLUVGQVVMVAotCQlsZHIJcjUsIFtmcCwgIzRdCQlAICplcnJfcHRyCisJCWxkcglyNSwgW3NwLCAjOCo0XQkJQCAqZXJyX3B0cgogCQlzdHIJcjQsIFtyNV0KIAkJbGRtaWEJc3AsIHtyMSwgcjJ9CQlAIHJldHJpZXZlIGRzdCwgbGVuCiAJCWFkZAlyMiwgcjIsIHIxCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGMwMDgyMjUuLjRmOTNjNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xNCwxNCArMTQsNCBAQAogCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4ZjAwMDAwMDApCiAKLS8qCi0gKiBUaGUgbm9kZXMgYXJlIHRoZSBmb2xsb3dpbmdzOgotICoKLSAqICAgbm9kZSAwOiAweGYwMDAuMDAwMCAtIDB4ZjNmZi5mZmZmCi0gKiAgIG5vZGUgMTogMHhmNDAwLjAwMDAgLSAweGY3ZmYuZmZmZgotICogICBub2RlIDI6IDB4ZjgwMC4wMDAwIC0gMHhmYmZmLmZmZmYKLSAqICAgbm9kZSAzOiAweGZjMDAuMDAwMCAtIDB4ZmZmZi5mZmZmCi0gKi8KLSNkZWZpbmUgTk9ERV9NRU1fU0laRV9CSVRTCTI2Ci0KICNlbmRpZiAvKiBfX0FTTV9BUkNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCmluZGV4IDg0MWVhZjguLjkzOWJjY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCkBAIC0zNjYsNiArMzY2LDE3IEBACiAKIGVuZGlmCiAKK2lmIChBUkNIX0FUOTFTQU05MjYwIHx8IEFSQ0hfQVQ5MVNBTTlHMjApCitjb21tZW50ICJBVDkxU0FNOTI2MC9BVDkxU0FNOUcyMCBib2FyZHMiCisKK2NvbmZpZyBNQUNIX1NOQVBQRVJfOTI2MAorICAgICAgICBib29sICJCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIDkyNjAvOUcyMCBtb2R1bGUiCisgICAgICAgIGhlbHAKKyAgICAgICAgICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIDkyNjAgb3IKKyAgICAgICAgICBTbmFwcGVyIDlHMjAgbW9kdWxlcy4KKyAgICAgICAgICA8aHR0cDovL3d3dy5ibHVld2F0ZXJzeXMuY29tLz4KK2VuZGlmCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBpZiBBUkNIX0FUOTFTQU05RzQ1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKaW5kZXggYzFmODIxZS4uY2EyYWMwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQpAQCAtNjYsNiArNjYsOSBAQAogb2JqLSQoQ09ORklHX01BQ0hfU1RBTVA5RzIwKQkrPSBib2FyZC1zdGFtcDlnMjAubwogb2JqLSQoQ09ORklHX01BQ0hfUE9SVFVYRzIwKQkrPSBib2FyZC1zdGFtcDlnMjAubwogCisjIEFUOTFTQU05MjYwL0FUOTFTQU05RzIwIGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKK29iai0kKENPTkZJR19NQUNIX1NOQVBQRVJfOTI2MCkJKz0gYm9hcmQtc25hcHBlcjkyNjAubworCiAjIEFUOTFTQU05RzQ1IGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX0FUOTFTQU05RzQ1RUtFUykgKz0gYm9hcmQtc2FtOW0xMGc0NWVrLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYwppbmRleCA4NTE2NmI3Li43NTNjMGQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcnN0Yy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgorI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKQEAgLTE3Niw2ICsxNzcsMTMgQEAKIAkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAogfTsKIAorLyogVmlkZW8gZGVjb2RlciBjbG9jayAtIE9ubHkgZm9yIHNhbTltMTAvc2FtOW0xMSAqLworc3RhdGljIHN0cnVjdCBjbGsgdmRlY19jbGsgPSB7CisJLm5hbWUJCT0gInZkZWNfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05RzQ1X0lEX1ZERUMsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CisKIC8qIE9uZSBhZGRpdGlvbmFsIGZha2UgY2xvY2sgZm9yIG9oY2kgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xrIG9oY2lfY2xrID0gewogCS5uYW1lCQk9ICJvaGNpX2NsayIsCkBAIC0yMzksNiArMjQ3LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwZXJpcGhfY2xvY2tzKTsgaSsrKQogCQljbGtfcmVnaXN0ZXIocGVyaXBoX2Nsb2Nrc1tpXSk7CiAKKwlpZiAoY3B1X2lzX2F0OTFzYW05bTEwKCkgfHwgY3B1X2lzX2F0OTFzYW05bTExKCkpCisJCWNsa19yZWdpc3RlcigmdmRlY19jbGspOworCiAJY2xrX3JlZ2lzdGVyKCZwY2swKTsKIAljbGtfcmVnaXN0ZXIoJnBjazEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay0yc2xvdC1tbWMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWstMnNsb3QtbW1jLmMKaW5kZXggYTQxMDJkNy4uYzQ5ZjVjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay0yc2xvdC1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLTJzbG90LW1tYy5jCkBAIC0yNiw2ICsyNiw5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hdDczYzIxMy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0yMzUsNiArMjM4LDQ2IEBACiAJfQogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFKSB8fCBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZWtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJBVkREIiwgIjAtMDAxYiIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkhQVkREIiwgIjAtMDAxYiIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkRCVkREIiwgIjAtMDAxYiIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkRDVkREIiwgIjAtMDAxYiIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGVrX2F2ZGRfcmVnX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCT0gIjNWMyIsCisJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gZWtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXMsCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoZWtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBla192ZGRfcGRhdGEgPSB7CisJLnN1cHBseV9uYW1lCT0gImJvYXJkLTNWMyIsCisJLm1pY3Jvdm9sdHMJPSAzMzAwMDAwLAorCS5ncGlvCQk9IC1FSU5WQUwsCisJLmVuYWJsZWRfYXRfYm9vdCA9IDAsCisJLmluaXRfZGF0YQk9ICZla19hdmRkX3JlZ19pbml0X2RhdGEsCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWtfdm9sdGFnZV9yZWd1bGF0b3IgPSB7CisJLm5hbWUJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZla192ZGRfcGRhdGEsCisJfSwKK307CitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX3JlZ3VsYXRvcnModm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVrX3ZvbHRhZ2VfcmVndWxhdG9yKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX3JlZ3VsYXRvcnModm9pZCkge30KKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgZWtfaTJjX2RldmljZXNbXSA9IHsKIAl7CiAJCUkyQ19CT0FSRF9JTkZPKCIyNGM1MTIiLCAweDUwKSwKQEAgLTI1Niw2ICsyOTksOCBAQAogCWVrX2FkZF9kZXZpY2VfbmFuZCgpOwogCS8qIEV0aGVybmV0ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmZWtfbWFjYl9kYXRhKTsKKwkvKiBSZWd1bGF0b3JzICovCisJZWtfYWRkX3JlZ3VsYXRvcnMoKTsKIAkvKiBNTUMgKi8KICNpZiBkZWZpbmVkKENPTkZJR19NTUNfQVRNRUxNQ0kpIHx8IGRlZmluZWQoQ09ORklHX01NQ19BVE1FTE1DSV9NT0RVTEUpCiAJYXQ5MV9hZGRfZGV2aWNlX21jaSgwLCAmZWtfbW1jX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCmluZGV4IGMxMWZkNDcuLjZlYTk4MDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0yNjksNiArMjcyLDQ2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpIHt9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFKSB8fCBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZWtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJBVkREIiwgIjAtMDAxYiIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkhQVkREIiwgIjAtMDAxYiIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkRCVkREIiwgIjAtMDAxYiIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkRDVkREIiwgIjAtMDAxYiIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGVrX2F2ZGRfcmVnX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCT0gIjNWMyIsCisJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gZWtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXMsCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoZWtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBla192ZGRfcGRhdGEgPSB7CisJLnN1cHBseV9uYW1lCT0gImJvYXJkLTNWMyIsCisJLm1pY3Jvdm9sdHMJPSAzMzAwMDAwLAorCS5ncGlvCQk9IC1FSU5WQUwsCisJLmVuYWJsZWRfYXRfYm9vdCA9IDAsCisJLmluaXRfZGF0YQk9ICZla19hdmRkX3JlZ19pbml0X2RhdGEsCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWtfdm9sdGFnZV9yZWd1bGF0b3IgPSB7CisJLm5hbWUJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZla192ZGRfcGRhdGEsCisJfSwKK307CitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX3JlZ3VsYXRvcnModm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVrX3ZvbHRhZ2VfcmVndWxhdG9yKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX3JlZ3VsYXRvcnModm9pZCkge30KKyNlbmRpZgorCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBla19pMmNfZGV2aWNlc1tdID0gewogICAgICAgICB7CkBAIC0yOTQsNiArMzM3LDggQEAKIAlla19hZGRfZGV2aWNlX25hbmQoKTsKIAkvKiBFdGhlcm5ldCAqLwogCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7CisJLyogUmVndWxhdG9ycyAqLworCWVrX2FkZF9yZWd1bGF0b3JzKCk7CiAJLyogTU1DICovCiAJYXQ5MV9hZGRfZGV2aWNlX21tYygwLCAmZWtfbW1jX2RhdGEpOwogCS8qIEkyQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA4YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZXdhdGVyIFN5c3RlbSBMdGQKKyAqCisgKiBBdXRob3I6IEFuZHJlIFJlbmF1ZCA8YW5kcmVAYmx1ZXdhdGVyc3lzLmNvbT4KKyAqIEF1dGhvcjogUnlhbiBNYWxsb24gIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgorCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyNkZWZpbmUgU05BUFBFUjkyNjBfSU9fRVhQX0dQSU8oeCkJKE5SX0JVSUxUSU5fR1BJTyArICh4KSkKKworc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXI5MjYwX21hcF9pbyh2b2lkKQoreworCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCisJLyogRGVidWcgb24gdHR5UzAgKi8KKwlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CisJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CisKKwlhdDkxX3JlZ2lzdGVyX3VhcnQoQVQ5MVNBTTkyNjBfSURfVVMwLCAxLAorCQkJICAgQVRNRUxfVUFSVF9DVFMgfCBBVE1FTF9VQVJUX1JUUyk7CisJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYwX0lEX1VTMSwgMiwKKwkJCSAgIEFUTUVMX1VBUlRfQ1RTIHwgQVRNRUxfVUFSVF9SVFMpOworCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxU0FNOTI2MF9JRF9VUzIsIDMsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc25hcHBlcjkyNjBfaW5pdF9pcnEodm9pZCkKK3sKKwlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBzbmFwcGVyOTI2MF91c2JoX2RhdGEgPSB7CisJLnBvcnRzCQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgX19pbml0ZGF0YSBzbmFwcGVyOTI2MF91ZGNfZGF0YSA9IHsKKwkudmJ1c19waW4JCT0gU05BUFBFUjkyNjBfSU9fRVhQX0dQSU8oNSksCisJLnZidXNfYWN0aXZlX2xvdwk9IDEsCisJLnZidXNfcG9sbGVkCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgc25hcHBlcjkyNjBfbWFjYl9kYXRhID0geworCS5pc19ybWlpCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBfX2luaXRkYXRhIHNuYXBwZXI5MjYwX25hbmRfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJPSAiUHJlYm9vdCIsCisJCS5vZmZzZXQJPSAwLAorCQkuc2l6ZQk9IFNaXzEyOEssCisJfSwKKwl7CisJCS5uYW1lCT0gIkJvb3Rsb2FkZXIiLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQk9IFNaXzI1NkssCisJfSwKKwl7CisJCS5uYW1lCT0gIkVudmlyb25tZW50IiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJPSBTWl8xMjhLLAorCX0sCisJeworCQkubmFtZQk9ICJLZXJuZWwiLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQk9IFNaXzRNLAorCX0sCisJeworCQkubmFtZQk9ICJGaWxlc3lzdGVtIiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQKK3NuYXBwZXI5MjYwX25hbmRfcGFydGl0aW9uX2luZm8oaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCit7CisJKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShzbmFwcGVyOTI2MF9uYW5kX3BhcnRpdGlvbnMpOworCXJldHVybiBzbmFwcGVyOTI2MF9uYW5kX3BhcnRpdGlvbnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgc25hcHBlcjkyNjBfbmFuZF9kYXRhID0geworCS5hbGUJCT0gMjEsCisJLmNsZQkJPSAyMiwKKwkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCisJLnBhcnRpdGlvbl9pbmZvCT0gc25hcHBlcjkyNjBfbmFuZF9wYXJ0aXRpb25faW5mbywKKwkuYnVzX3dpZHRoXzE2CT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgc25hcHBlcjkyNjBfbmFuZF9zbWNfY29uZmlnID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAwLAorCS5ucmRfc2V0dXAJCT0gMCwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDAsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gNSwKKwkubnJkX3B1bHNlCQk9IDIsCisJLm5jc193cml0ZV9wdWxzZQk9IDUsCisJLm53ZV9wdWxzZQkJPSAyLAorCisJLnJlYWRfY3ljbGUJCT0gNywKKwkud3JpdGVfY3ljbGUJCT0gNywKKworCS5tb2RlCQkJPSAoQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfAorCQkJCSAgIEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUpLAorCS50ZGZfY3ljbGVzCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBzbmFwcGVyOTI2MF9pb19leHBhbmRlcl9kYXRhID0geworCS5ncGlvX2Jhc2UJCT0gU05BUFBFUjkyNjBfSU9fRVhQX0dQSU8oMCksCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgc25hcHBlcjkyNjBfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCS8qIElPIGV4cGFuZGVyICovCisJCUkyQ19CT0FSRF9JTkZPKCJtYXg3MzEyIiwgMHgyOCksCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNuYXBwZXI5MjYwX2lvX2V4cGFuZGVyX2RhdGEsCisJfSwKKwl7CisJCS8qIEF1ZGlvIGNvZGVjICovCisJCUkyQ19CT0FSRF9JTkZPKCJ0bHYzMjBhaWMyMyIsIDB4MWEpLAorCX0sCisJeworCQkvKiBSVEMgKi8KKwkJSTJDX0JPQVJEX0lORk8oImlzbDEyMDgiLCAweDZmKSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXI5MjYwX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTQsIDApOworCXNhbTlfc21jX2NvbmZpZ3VyZSgzLCAmc25hcHBlcjkyNjBfbmFuZF9zbWNfY29uZmlnKTsKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmc25hcHBlcjkyNjBfbmFuZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXI5MjYwX2JvYXJkX2luaXQodm9pZCkKK3sKKwlhdDkxX2FkZF9kZXZpY2VfaTJjKHNuYXBwZXI5MjYwX2kyY19kZXZpY2VzLAorCQkJICAgIEFSUkFZX1NJWkUoc25hcHBlcjkyNjBfaTJjX2RldmljZXMpKTsKKwlhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKCk7CisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJnNuYXBwZXI5MjYwX3VzYmhfZGF0YSk7CisJYXQ5MV9hZGRfZGV2aWNlX3VkYygmc25hcHBlcjkyNjBfdWRjX2RhdGEpOworCWF0OTFfYWRkX2RldmljZV9ldGgoJnNuYXBwZXI5MjYwX21hY2JfZGF0YSk7CisJYXQ5MV9hZGRfZGV2aWNlX3NzYyhBVDkxU0FNOTI2MF9JRF9TU0MsIChBVE1FTF9TU0NfVEYgfCBBVE1FTF9TU0NfVEsgfAorCQkJCQkJIEFUTUVMX1NTQ19URCB8IEFUTUVMX1NTQ19SRCkpOworCXNuYXBwZXI5MjYwX2FkZF9kZXZpY2VfbmFuZCgpOworfQorCitNQUNISU5FX1NUQVJUKFNOQVBQRVJfOTI2MCwgIkJsdWV3YXRlciBTeXN0ZW1zIFNuYXBwZXIgOTI2MC85RzIwIG1vZHVsZSIpCisJLnBoeXNfaW8JPSBBVDkxX0JBU0VfU1lTLAorCS5pb19wZ19vZmZzdAk9IChBVDkxX1ZBX0JBU0VfU1lTID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBBVDkxX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gc25hcHBlcjkyNjBfbWFwX2lvLAorCS5pbml0X2lycQk9IHNuYXBwZXI5MjYwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBzbmFwcGVyOTI2MF9ib2FyZF9pbml0LAorTUFDSElORV9FTkQKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmgKaW5kZXggZDhjMWVkZS4uOWM2YWY5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDkuaApAQCAtODQsNyArODQsNyBAQAogICovCiAjZGVmaW5lIEFUOTFfRUNDCSgweGZmZmZlMjAwIC0gQVQ5MV9CQVNFX1NZUykKICNkZWZpbmUgQVQ5MV9CQ1JBTUMJKDB4ZmZmZmU0MDAgLSBBVDkxX0JBU0VfU1lTKQotI2RlZmluZSBBVDkxX0REUlNEUkMJKDB4ZmZmZmU2MDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX0REUlNEUkMwCSgweGZmZmZlNjAwIC0gQVQ5MV9CQVNFX1NZUykKICNkZWZpbmUgQVQ5MV9TTUMJKDB4ZmZmZmU4MDAgLSBBVDkxX0JBU0VfU1lTKQogI2RlZmluZSBBVDkxX01BVFJJWAkoMHhmZmZmZWEwMCAtIEFUOTFfQkFTRV9TWVMpCiAjZGVmaW5lIEFUOTFfQ0NGRwkoMHhmZmZmZWIxMCAtIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5X2RkcnNkci5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOV9kZHJzZHIuaAppbmRleCAxNDk5YjFjLi45NzZmNGE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5X2RkcnNkci5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDlfZGRyc2RyLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNpZm5kZWYgQVQ5MUNBUDlfRERSU0RSX0gKICNkZWZpbmUgQVQ5MUNBUDlfRERSU0RSX0gKIAotI2RlZmluZSBBVDkxX0REUlNEUkNfTVIJCShBVDkxX0REUlNEUkMgKyAweDAwKQkvKiBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfRERSU0RSQ19NUgkJMHgwMAkvKiBNb2RlIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfTU9ERQkoMHhmIDw8IDApCQkvKiBDb21tYW5kIE1vZGUgKi8KICNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTU9ERV9OT1JNQUwJCTAKICNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTU9ERV9OT1AJCTEKQEAgLTI1LDEwICsyNSwxMCBAQAogI2RlZmluZQkJCUFUOTFfRERSU0RSQ19NT0RFX0VYVF9MTVIJNQogI2RlZmluZQkJCUFUOTFfRERSU0RSQ19NT0RFX0RFRVAJCTYKIAotI2RlZmluZSBBVDkxX0REUlNEUkNfUlRSCShBVDkxX0REUlNEUkMgKyAweDA0KQkvKiBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfRERSU0RSQ19SVFIJMHgwNAkvKiBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfQ09VTlQJKDB4ZmZmIDw8IDApCQkvKiBSZWZyZXNoIFRpbWVyIENvdW50ZXIgKi8KIAotI2RlZmluZSBBVDkxX0REUlNEUkNfQ1IJCShBVDkxX0REUlNEUkMgKyAweDA4KQkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfRERSU0RSQ19DUgkJMHgwOAkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfTkMJCSgzIDw8IDApCQkvKiBOdW1iZXIgb2YgQ29sdW1uIEJpdHMgKi8KICNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTkNfU0RSOAkoMCA8PCAwKQogI2RlZmluZQkJCUFUOTFfRERSU0RSQ19OQ19TRFI5CSgxIDw8IDApCkBAIC00OSw3ICs0OSw3IEBACiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfRExMCSgxIDw8IDcpCQkvKiBSZXNldCBETEwgKi8KICNkZWZpbmUJCUFUOTFfRERSU0RSQ19ESUNEUwkoMSA8PCA4KQkJLyogT3V0cHV0IGltcGVkYW5jZSBjb250cm9sICovCiAKLSNkZWZpbmUgQVQ5MV9ERFJTRFJDX1QwUFIJKEFUOTFfRERSU0RSQyArIDB4MEMpCS8qIFRpbWluZyAwIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfRERSU0RSQ19UMFBSCTB4MEMJLyogVGltaW5nIDAgUmVnaXN0ZXIgKi8KICNkZWZpbmUJCUFUOTFfRERSU0RSQ19UUkFTCSgweGYgPDwgIDApCQkvKiBBY3RpdmUgdG8gUHJlY2hhcmdlIGRlbGF5ICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfVFJDRAkoMHhmIDw8ICA0KQkJLyogUm93IHRvIENvbHVtbiBkZWxheSAqLwogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RXUgkoMHhmIDw8ICA4KQkJLyogV3JpdGUgcmVjb3ZlcnkgZGVsYXkgKi8KQEAgLTU5LDEzICs1OSwxMyBAQAogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RXVFIJKDEgICA8PCAyNCkJCS8qIEludGVybmFsIFdyaXRlIHRvIFJlYWQgZGVsYXkgKi8KICNkZWZpbmUJCUFUOTFfRERSU0RSQ19UTVJECSgweGYgPDwgMjgpCQkvKiBMb2FkIG1vZGUgdG8gYWN0aXZlL3JlZnJlc2ggZGVsYXkgKi8KIAotI2RlZmluZSBBVDkxX0REUlNEUkNfVDFQUgkoQVQ5MV9ERFJTRFJDICsgMHgxMCkJLyogVGltaW5nIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9ERFJTRFJDX1QxUFIJMHgxMAkvKiBUaW1pbmcgMSBSZWdpc3RlciAqLwogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RSRkMJKDB4MWYgPDwgMCkJCS8qIFJvdyBDeWNsZSBEZWxheSAqLwogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RYU05SCSgweGZmIDw8IDgpCQkvKiBFeGl0IHNlbGYtcmVmcmVzaCB0byBub24tcmVhZCAqLwogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RYU1JECSgweGZmIDw8IDE2KQkJLyogRXhpdCBzZWxmLXJlZnJlc2ggdG8gcmVhZCAqLwogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RYUAkoMHhmICA8PCAyNCkJCS8qIEV4aXQgcG93ZXItZG93biBkZWxheSAqLwogCi0jZGVmaW5lIEFUOTFfRERSU0RSQ19MUFIJKEFUOTFfRERSU0RSQyArIDB4MTgpCS8qIExvdyBQb3dlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0REUlNEUkNfTFBSCTB4MTgJLyogTG93IFBvd2VyIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfTFBDQgkJKDMgPDwgMCkJLyogTG93LXBvd2VyIENvbmZpZ3VyYXRpb25zICovCiAjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX0xQQ0JfRElTQUJMRQkJMAogI2RlZmluZQkJCUFUOTFfRERSU0RSQ19MUENCX1NFTEZfUkVGUkVTSAkJMQpAQCAtODAsMTQgKzgwLDE0IEBACiAjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX1RJTUVPVVRfNjRfQ0xLX0NZQ0xFUwkoMSA8PCAxMikKICNkZWZpbmUJCQlBVDkxX0REUlNEUkNfVElNRU9VVF8xMjhfQ0xLX0NZQ0xFUwkoMiA8PCAxMikKIAotI2RlZmluZSBBVDkxX0REUlNEUkNfTURSCShBVDkxX0REUlNEUkMgKyAweDFDKQkvKiBNZW1vcnkgRGV2aWNlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfRERSU0RSQ19NRFIJMHgxQwkvKiBNZW1vcnkgRGV2aWNlIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfTUQJCSgzIDw8IDApCQkvKiBNZW1vcnkgRGV2aWNlIFR5cGUgKi8KICNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTURfU0RSCQkwCiAjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX01EX0xPV19QT1dFUl9TRFIJMQogI2RlZmluZQkJCUFUOTFfRERSU0RSQ19NRF9ERFIJCTIKICNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTURfTE9XX1BPV0VSX0REUgkzCiAKLSNkZWZpbmUgQVQ5MV9ERFJTRFJDX0RMTFIJKEFUOTFfRERSU0RSQyArIDB4MjApCS8qIERMTCBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0REUlNEUkNfRExMUgkweDIwCS8qIERMTCBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLwogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX01ESU5DCSgxIDw8IDApCQkvKiBNYXN0ZXIgRGVsYXkgaW5jcmVtZW50ICovCiAjZGVmaW5lCQlBVDkxX0REUlNEUkNfTURERUMJKDEgPDwgMSkJCS8qIE1hc3RlciBEZWxheSBkZWNyZW1lbnQgKi8KICNkZWZpbmUJCUFUOTFfRERSU0RSQ19NRE9WRgkoMSA8PCAyKQkJLyogTWFzdGVyIERlbGF5IE92ZXJmbG93ICovCkBAIC05OCw1ICs5OCwxMSBAQAogI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1NEVkFMCSgweGZmIDw8IDE2KQkJLyogU2xhdmUgRGVsYXkgdmFsdWUgKi8KICNkZWZpbmUJCUFUOTFfRERSU0RSQ19TRENWQUwJKDB4ZmYgPDwgMjQpCQkvKiBTbGF2ZSBEZWxheSBDb3JyZWN0aW9uIHZhbHVlICovCiAKKy8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNkZWZpbmUgYXQ5MV9yYW1jX3JlYWQobnVtLCByZWcpIFwKKwlhdDkxX3N5c19yZWFkKEFUOTFfRERSU0RSQyMjbnVtICsgcmVnKQorI2RlZmluZSBhdDkxX3JhbWNfd3JpdGUobnVtLCByZWcsIHZhbHVlKSBcCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9ERFJTRFJDIyNudW0gKyByZWcsIHZhbHVlKQorCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MC5oCmluZGV4IDQzYzM5NmIuLjRlNzkwMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjAuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwLmgKQEAgLTg0LDcgKzg0LDcgQEAKICAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKICAqLwogI2RlZmluZSBBVDkxX0VDQwkoMHhmZmZmZTgwMCAtIEFUOTFfQkFTRV9TWVMpCi0jZGVmaW5lIEFUOTFfU0RSQU1DCSgweGZmZmZlYTAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9TRFJBTUMwCSgweGZmZmZlYTAwIC0gQVQ5MV9CQVNFX1NZUykKICNkZWZpbmUgQVQ5MV9TTUMJKDB4ZmZmZmVjMDAgLSBBVDkxX0JBU0VfU1lTKQogI2RlZmluZSBBVDkxX01BVFJJWAkoMHhmZmZmZWUwMCAtIEFUOTFfQkFTRV9TWVMpCiAjZGVmaW5lIEFUOTFfQ0NGRwkoMHhmZmZmZWYxMCAtIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxLmgKaW5kZXggODdkZThiZS4uMmI1NjE4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjEuaApAQCAtNjgsNyArNjgsNyBAQAogLyoKICAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKICAqLwotI2RlZmluZSBBVDkxX1NEUkFNQwkoMHhmZmZmZWEwMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfU0RSQU1DMAkoMHhmZmZmZWEwMCAtIEFUOTFfQkFTRV9TWVMpCiAjZGVmaW5lIEFUOTFfU01DCSgweGZmZmZlYzAwIC0gQVQ5MV9CQVNFX1NZUykKICNkZWZpbmUgQVQ5MV9NQVRSSVgJKDB4ZmZmZmVlMDAgLSBBVDkxX0JBU0VfU1lTKQogI2RlZmluZSBBVDkxX0FJQwkoMHhmZmZmZjAwMCAtIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05X2RkcnNkci5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9kZHJzZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdiMTViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9kZHJzZHIuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciB0aGUgQXRtZWwgRERSL1NEUiBTRFJBTSBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEF0bWVsIENvcnBvcmF0aW9uCisgKglOaWNvbGFzIEZlcnJlIDxuaWNvbGFzLmZlcnJlQGF0bWVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIEFUOTFTQU05X0REUlNEUl9ICisjZGVmaW5lIEFUOTFTQU05X0REUlNEUl9ICisKKyNkZWZpbmUgQVQ5MV9ERFJTRFJDX01SCQkweDAwCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19NT0RFCSgweDcgPDwgMCkJCS8qIENvbW1hbmQgTW9kZSAqLworI2RlZmluZQkJCUFUOTFfRERSU0RSQ19NT0RFX05PUk1BTAkwCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX01PREVfTk9QCQkxCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX01PREVfUFJFQ0hBUkdFCTIKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTU9ERV9MTVIJCTMKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTU9ERV9SRUZSRVNICTQKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTU9ERV9FWFRfTE1SCTUKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTU9ERV9ERUVQCQk2CisKKyNkZWZpbmUgQVQ5MV9ERFJTRFJDX1JUUgkweDA0CS8qIFJlZnJlc2ggVGltZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19DT1VOVAkoMHhmZmYgPDwgMCkJCS8qIFJlZnJlc2ggVGltZXIgQ291bnRlciAqLworCisjZGVmaW5lIEFUOTFfRERSU0RSQ19DUgkJMHgwOAkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfTkMJCSgzIDw8IDApCQkvKiBOdW1iZXIgb2YgQ29sdW1uIEJpdHMgKi8KKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTkNfU0RSOAkoMCA8PCAwKQorI2RlZmluZQkJCUFUOTFfRERSU0RSQ19OQ19TRFI5CSgxIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX05DX1NEUjEwCSgyIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX05DX1NEUjExCSgzIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX05DX0REUjkJKDAgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTkNfRERSMTAJKDEgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTkNfRERSMTEJKDIgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTkNfRERSMTIJKDMgPDwgMCkKKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19OUgkJKDMgPDwgMikJCS8qIE51bWJlciBvZiBSb3cgQml0cyAqLworI2RlZmluZQkJCUFUOTFfRERSU0RSQ19OUl8xMQkoMCA8PCAyKQorI2RlZmluZQkJCUFUOTFfRERSU0RSQ19OUl8xMgkoMSA8PCAyKQorI2RlZmluZQkJCUFUOTFfRERSU0RSQ19OUl8xMwkoMiA8PCAyKQorI2RlZmluZQkJCUFUOTFfRERSU0RSQ19OUl8xNAkoMyA8PCAyKQorI2RlZmluZQkJQVQ5MV9ERFJTRFJDX0NBUwkoNyA8PCA0KQkJLyogQ0FTIExhdGVuY3kgKi8KKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfQ0FTXzIJKDIgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfQ0FTXzMJKDMgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfQ0FTXzI1CSg2IDw8IDQpCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfUlNUX0RMTAkoMSA8PCA3KQkJLyogUmVzZXQgRExMICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfRElDRFMJKDEgPDwgOCkJCS8qIE91dHB1dCBpbXBlZGFuY2UgY29udHJvbCAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX0RJU19ETEwJKDEgPDwgOSkJCS8qIERpc2FibGUgRExMICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfT0NECSgxIDw8IDEyKQkJLyogT2ZmLUNoaXAgRHJpdmVyICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfRFFNUwkoMSA8PCAxNikJCS8qIE1hc2sgRGF0YSBpcyBTaGFyZWQgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19BQ1RCU1QJKDEgPDwgMTgpCQkvKiBBY3RpdmUgQmFuayBYIHRvIEJ1cnN0IFN0b3AgUmVhZCBBY2Nlc3MgQmFuayBZICovCisKKyNkZWZpbmUgQVQ5MV9ERFJTRFJDX1QwUFIJMHgwQwkvKiBUaW1pbmcgMCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RSQVMJKDB4ZiA8PCAgMCkJCS8qIEFjdGl2ZSB0byBQcmVjaGFyZ2UgZGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UUkNECSgweGYgPDwgIDQpCQkvKiBSb3cgdG8gQ29sdW1uIGRlbGF5ICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfVFdSCSgweGYgPDwgIDgpCQkvKiBXcml0ZSByZWNvdmVyeSBkZWxheSAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RSQwkoMHhmIDw8IDEyKQkJLyogUm93IGN5Y2xlIGRlbGF5ICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfVFJQCSgweGYgPDwgMTYpCQkvKiBSb3cgcHJlY2hhcmdlIGRlbGF5ICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfVFJSRAkoMHhmIDw8IDIwKQkJLyogQWN0aXZlIEJhbmtBIHRvIEJhbmtCICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfVFdUUgkoMHg3IDw8IDI0KQkJLyogSW50ZXJuYWwgV3JpdGUgdG8gUmVhZCBkZWxheSAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1JFRF9XUlJECSgweDEgPDwgMjcpCQkvKiBSZWR1Y2UgV3JpdGUgdG8gUmVhZCBEZWxheSAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RNUkQJKDB4ZiA8PCAyOCkJCS8qIExvYWQgbW9kZSB0byBhY3RpdmUvcmVmcmVzaCBkZWxheSAqLworCisjZGVmaW5lIEFUOTFfRERSU0RSQ19UMVBSCTB4MTAJLyogVGltaW5nIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UUkZDCSgweDFmIDw8IDApCQkvKiBSb3cgQ3ljbGUgRGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UWFNOUgkoMHhmZiA8PCA4KQkJLyogRXhpdCBzZWxmLXJlZnJlc2ggdG8gbm9uLXJlYWQgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UWFNSRAkoMHhmZiA8PCAxNikJCS8qIEV4aXQgc2VsZi1yZWZyZXNoIHRvIHJlYWQgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UWFAJKDB4ZiAgPDwgMjQpCQkvKiBFeGl0IHBvd2VyLWRvd24gZGVsYXkgKi8KKworI2RlZmluZSBBVDkxX0REUlNEUkNfVDJQUgkweDE0CS8qIFRpbWluZyAyIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfVFhBUkQJKDB4ZiAgPDwgMCkJCS8qIEV4aXQgYWN0aXZlIHBvd2VyIGRvd24gZGVsYXkgdG8gcmVhZCBjb21tYW5kIGluIG1vZGUgIkZhc3QgRXhpdCIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UWEFSRFMJKDB4ZiAgPDwgNCkJCS8qIEV4aXQgYWN0aXZlIHBvd2VyIGRvd24gZGVsYXkgdG8gcmVhZCBjb21tYW5kIGluIG1vZGUgIlNsb3cgRXhpdCIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19UUlBBCSgweGYgIDw8IDgpCQkvKiBSb3cgUHJlY2hhcmdlIEFsbCBkZWxheSAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RSVFAJKDB4NyAgPDwgMTIpCQkvKiBSZWFkIHRvIFByZWNoYXJnZSBkZWxheSAqLworCisjZGVmaW5lIEFUOTFfRERSU0RSQ19MUFIJMHgxQwkvKiBMb3cgUG93ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19MUENCCSgzIDw8IDApCQkvKiBMb3ctcG93ZXIgQ29uZmlndXJhdGlvbnMgKi8KKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTFBDQl9ESVNBQkxFCQkwCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX0xQQ0JfU0VMRl9SRUZSRVNICQkxCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX0xQQ0JfUE9XRVJfRE9XTgkJMgorI2RlZmluZQkJCUFUOTFfRERSU0RSQ19MUENCX0RFRVBfUE9XRVJfRE9XTgkzCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfQ0xLRlIJKDEgPDwgMikJLyogQ2xvY2sgRnJvemVuICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfUEFTUgkoNyA8PCA0KQkvKiBQYXJ0aWFsIEFycmF5IFNlbGYgUmVmcmVzaCAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RDU1IJKDMgPDwgOCkJLyogVGVtcGVyYXR1cmUgQ29tcGVuc2F0ZWQgU2VsZiBSZWZyZXNoICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfRFMJCSgzIDw8IDEwKQkvKiBEcml2ZSBTdHJlbmd0aCAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1RJTUVPVVQJKDMgPDwgMTIpCS8qIFRpbWUgdG8gZGVmaW5lIHdoZW4gTG93IFBvd2VyIE1vZGUgaXMgZW5hYmxlZCAqLworI2RlZmluZQkJCUFUOTFfRERSU0RSQ19USU1FT1VUXzBfQ0xLX0NZQ0xFUwkoMCA8PCAxMikKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfVElNRU9VVF82NF9DTEtfQ1lDTEVTCSgxIDw8IDEyKQorI2RlZmluZQkJCUFUOTFfRERSU0RSQ19USU1FT1VUXzEyOF9DTEtfQ1lDTEVTCSgyIDw8IDEyKQorI2RlZmluZQkJQVQ5MV9ERFJTRFJDX0FQREUJKDEgPDwgMTYpCSAvKiBBY3RpdmUgcG93ZXIgZG93biBleGl0IHRpbWUgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19VUERfTVIJKDMgPDwgMjApCSAvKiBVcGRhdGUgbG9hZCBtb2RlIHJlZ2lzdGVyIGFuZCBleHRlbmRlZCBtb2RlIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9ERFJTRFJDX01EUgkweDIwCS8qIE1lbW9yeSBEZXZpY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19NRAkJKDMgPDwgMCkJCS8qIE1lbW9yeSBEZXZpY2UgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfRERSU0RSQ19NRF9TRFIJCTAKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfTURfTE9XX1BPV0VSX1NEUgkxCisjZGVmaW5lCQkJQVQ5MV9ERFJTRFJDX01EX0xPV19QT1dFUl9ERFIJMworI2RlZmluZQkJCUFUOTFfRERSU0RSQ19NRF9ERFIyCQk2CisjZGVmaW5lCQlBVDkxX0REUlNEUkNfREJXCSgxIDw8IDQpCQkvKiBEYXRhIEJ1cyBXaWR0aCAqLworI2RlZmluZQkJCUFUOTFfRERSU0RSQ19EQldfMzJCSVRTCQkoMCA8PCAgNCkKKyNkZWZpbmUJCQlBVDkxX0REUlNEUkNfREJXXzE2QklUUwkJKDEgPDwgIDQpCisKKyNkZWZpbmUgQVQ5MV9ERFJTRFJDX0RMTAkweDI0CS8qIERMTCBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX01ESU5DCSgxIDw8IDApCQkvKiBNYXN0ZXIgRGVsYXkgaW5jcmVtZW50ICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfTURERUMJKDEgPDwgMSkJCS8qIE1hc3RlciBEZWxheSBkZWNyZW1lbnQgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19NRE9WRgkoMSA8PCAyKQkJLyogTWFzdGVyIERlbGF5IE92ZXJmbG93ICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfTURWQUwJKDB4ZmYgPDwgIDgpCQkvKiBNYXN0ZXIgRGVsYXkgdmFsdWUgKi8KKworI2RlZmluZSBBVDkxX0REUlNEUkNfSFMJCTB4MkMJLyogSGlnaCBTcGVlZCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX0RJU19BVENQX1JECSgxIDw8IDIpCS8qIEFudGljaXAgcmVhZCBhY2Nlc3MgaXMgZGlzYWJsZWQgKi8KKworI2RlZmluZSBBVDkxX0REUlNEUkNfREVMQVkobikJKDB4MzAgKyAoMHg0ICogKG4pKSkJLyogRGVsYXkgSS9PIFJlZ2lzdGVyIG4gKi8KKworI2RlZmluZSBBVDkxX0REUlNEUkNfV1BNUgkweEU0CS8qIFdyaXRlIFByb3RlY3QgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9ERFJTRFJDX1dQCQkoMSA8PCAwKQkJLyogV3JpdGUgcHJvdGVjdCBlbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19XUEtFWQkoMHhmZmZmZmYgPDwgOCkJCS8qIFdyaXRlIHByb3RlY3Qga2V5ICovCisjZGVmaW5lCQlBVDkxX0REUlNEUkNfS0VZCSgweDQ0NDQ1MiA8PCA4KQkJLyogV3JpdGUgcHJvdGVjdCBrZXkgPSAiRERSIiAqLworCisjZGVmaW5lIEFUOTFfRERSU0RSQ19XUFNSCTB4RTgJLyogV3JpdGUgUHJvdGVjdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19XUFZTCSgxIDw8IDApCQkvKiBXcml0ZSBwcm90ZWN0IHZpb2xhdGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfRERSU0RSQ19XUFZTUkMJKDB4ZmZmZiA8PCA4KQkJLyogV3JpdGUgcHJvdGVjdCB2aW9sYXRpb24gc291cmNlICovCisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNkZWZpbmUgYXQ5MV9yYW1jX3JlYWQobnVtLCByZWcpIFwKKwlhdDkxX3N5c19yZWFkKEFUOTFfRERSU0RSQyMjbnVtICsgcmVnKQorI2RlZmluZSBhdDkxX3JhbWNfd3JpdGUobnVtLCByZWcsIHZhbHVlKSBcCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9ERFJTRFJDIyNudW0gKyByZWcsIHZhbHVlKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlfc2RyYW1jLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05X3NkcmFtYy5oCmluZGV4IGI3MjYwMzguLjEwMGY1YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlfc2RyYW1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9zZHJhbWMuaApAQCAtMTcsNyArMTcsNyBAQAogI2RlZmluZSBBVDkxU0FNOV9TRFJBTUNfSAogCiAvKiBTRFJBTSBDb250cm9sbGVyIChTRFJBTUMpIHJlZ2lzdGVycyAqLwotI2RlZmluZSBBVDkxX1NEUkFNQ19NUgkJKEFUOTFfU0RSQU1DICsgMHgwMCkJLyogU0RSQU0gQ29udHJvbGxlciBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU0RSQU1DX01SCQkweDAwCS8qIFNEUkFNIENvbnRyb2xsZXIgTW9kZSBSZWdpc3RlciAqLwogI2RlZmluZQkJQVQ5MV9TRFJBTUNfTU9ERQkoMHhmIDw8IDApCQkvKiBDb21tYW5kIE1vZGUgKi8KICNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX05PUk1BTAkJMAogI2RlZmluZQkJCUFUOTFfU0RSQU1DX01PREVfTk9QCQkxCkBAIC0yNywxMCArMjcsMTAgQEAKICNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX0VYVF9MTVIJNQogI2RlZmluZQkJCUFUOTFfU0RSQU1DX01PREVfREVFUAkJNgogCi0jZGVmaW5lIEFUOTFfU0RSQU1DX1RSCQkoQVQ5MV9TRFJBTUMgKyAweDA0KQkvKiBTRFJBTSBDb250cm9sbGVyIFJlZnJlc2ggVGltZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUNfVFIJCTB4MDQJLyogU0RSQU0gQ29udHJvbGxlciBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX1NEUkFNQ19DT1VOVAkoMHhmZmYgPDwgMCkJCS8qIFJlZnJlc2ggVGltZXIgQ291bnRlciAqLwogCi0jZGVmaW5lIEFUOTFfU0RSQU1DX0NSCQkoQVQ5MV9TRFJBTUMgKyAweDA4KQkvKiBTRFJBTSBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUNfQ1IJCTB4MDgJLyogU0RSQU0gQ29udHJvbGxlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX1NEUkFNQ19OQwkJKDMgPDwgMCkJCS8qIE51bWJlciBvZiBDb2x1bW4gQml0cyAqLwogI2RlZmluZQkJCUFUOTFfU0RSQU1DX05DXzgJKDAgPDwgMCkKICNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQ185CSgxIDw8IDApCkBAIC01Nyw3ICs1Nyw3IEBACiAjZGVmaW5lCQlBVDkxX1NEUkFNQ19UUkFTCSgweGYgPDwgMjQpCQkvKiBBY3RpdmUgdG8gUHJlY2hhcmdlIERlbGF5ICovCiAjZGVmaW5lCQlBVDkxX1NEUkFNQ19UWFNSCSgweGYgPDwgMjgpCQkvKiBFeGl0IFNlbGYgUmVmcmVzaCB0byBBY3RpdmUgRGVsYXkgKi8KIAotI2RlZmluZSBBVDkxX1NEUkFNQ19MUFIJCShBVDkxX1NEUkFNQyArIDB4MTApCS8qIFNEUkFNIENvbnRyb2xsZXIgTG93IFBvd2VyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU0RSQU1DX0xQUgkJMHgxMAkvKiBTRFJBTSBDb250cm9sbGVyIExvdyBQb3dlciBSZWdpc3RlciAqLwogI2RlZmluZQkJQVQ5MV9TRFJBTUNfTFBDQgkJKDMgPDwgMCkJLyogTG93LXBvd2VyIENvbmZpZ3VyYXRpb25zICovCiAjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTFBDQl9ESVNBQkxFCQkwCiAjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTFBDQl9TRUxGX1JFRlJFU0gJCTEKQEAgLTcxLDE2ICs3MSwyMSBAQAogI2RlZmluZQkJCUFUOTFfU0RSQU1DX1RJTUVPVVRfNjRfQ0xLX0NZQ0xFUwkoMSA8PCAxMikKICNkZWZpbmUJCQlBVDkxX1NEUkFNQ19USU1FT1VUXzEyOF9DTEtfQ1lDTEVTCSgyIDw8IDEyKQogCi0jZGVmaW5lIEFUOTFfU0RSQU1DX0lFUgkJKEFUOTFfU0RSQU1DICsgMHgxNCkJLyogU0RSQU0gQ29udHJvbGxlciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU0RSQU1DX0lEUgkJKEFUOTFfU0RSQU1DICsgMHgxOCkJLyogU0RSQU0gQ29udHJvbGxlciBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1NEUkFNQ19JTVIJCShBVDkxX1NEUkFNQyArIDB4MUMpCS8qIFNEUkFNIENvbnRyb2xsZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9TRFJBTUNfSVNSCQkoQVQ5MV9TRFJBTUMgKyAweDIwKQkvKiBTRFJBTSBDb250cm9sbGVyIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUNfSUVSCQkweDE0CS8qIFNEUkFNIENvbnRyb2xsZXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19JRFIJCTB4MTgJLyogU0RSQU0gQ29udHJvbGxlciBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19JTVIJCTB4MUMJLyogU0RSQU0gQ29udHJvbGxlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19JU1IJCTB4MjAJLyogU0RSQU0gQ29udHJvbGxlciBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX1NEUkFNQ19SRVMJCSgxIDw8IDApCQkvKiBSZWZyZXNoIEVycm9yIFN0YXR1cyAqLwogCi0jZGVmaW5lIEFUOTFfU0RSQU1DX01EUgkJKEFUOTFfU0RSQU1DICsgMHgyNCkJLyogU0RSQU0gTWVtb3J5IERldmljZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19NRFIJCTB4MjQJLyogU0RSQU0gTWVtb3J5IERldmljZSBSZWdpc3RlciAqLwogI2RlZmluZQkJQVQ5MV9TRFJBTUNfTUQJCSgzIDw8IDApCQkvKiBNZW1vcnkgRGV2aWNlIFR5cGUgKi8KICNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NRF9TRFJBTQkJMAogI2RlZmluZQkJCUFUOTFfU0RSQU1DX01EX0xPV19QT1dFUl9TRFJBTQkxCiAKKy8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNkZWZpbmUgYXQ5MV9yYW1jX3JlYWQobnVtLCByZWcpIFwKKwlhdDkxX3N5c19yZWFkKEFUOTFfU0RSQU1DIyNudW0gKyByZWcpCisjZGVmaW5lIGF0OTFfcmFtY193cml0ZShudW0sIHJlZywgdmFsdWUpIFwKKwlhdDkxX3N5c193cml0ZShBVDkxX1NEUkFNQyMjbnVtICsgcmVnLCB2YWx1ZSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05cmwuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oCmluZGV4IGZjMmRlNmMuLjg3YmE4NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oCkBAIC03NCw3ICs3NCw3IEBACiAgKi8KICNkZWZpbmUgQVQ5MV9ETUEJKDB4ZmZmZmU2MDAgLSBBVDkxX0JBU0VfU1lTKQogI2RlZmluZSBBVDkxX0VDQwkoMHhmZmZmZTgwMCAtIEFUOTFfQkFTRV9TWVMpCi0jZGVmaW5lIEFUOTFfU0RSQU1DCSgweGZmZmZlYTAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9TRFJBTUMwCSgweGZmZmZlYTAwIC0gQVQ5MV9CQVNFX1NZUykKICNkZWZpbmUgQVQ5MV9TTUMJKDB4ZmZmZmVjMDAgLSBBVDkxX0JBU0VfU1lTKQogI2RlZmluZSBBVDkxX01BVFJJWAkoMHhmZmZmZWUwMCAtIEFUOTFfQkFTRV9TWVMpCiAjZGVmaW5lIEFUOTFfQ0NGRwkoMHhmZmZmZWYxMCAtIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggZGYyZWQ4NC4uNTg1MjhhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYm9hcmQuaApAQCAtNDQsNiArNDQsOCBAQAogIC8qIFVTQiBEZXZpY2UgKi8KIHN0cnVjdCBhdDkxX3VkY19kYXRhIHsKIAl1OAl2YnVzX3BpbjsJCS8qIGhpZ2ggPT0gaG9zdCBwb3dlcmluZyB1cyAqLworCXU4CXZidXNfYWN0aXZlX2xvdzsJLyogdmJ1cyBwb2xhcml0eSAqLworCXU4CXZidXNfcG9sbGVkOwkJLyogVXNlIHBvbGxpbmcsIG5vdCBpbnRlcnJ1cHQgKi8KIAl1OAlwdWxsdXBfcGluOwkJLyogYWN0aXZlID09IEQrIHB1bGxlZCB1cCAqLwogCXU4CXB1bGx1cF9hY3RpdmVfbG93OwkvKiB0cnVlID09IHB1bGx1cF9waW4gaXMgYWN0aXZlIGxvdyAqLwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCmluZGV4IDgzMzY1OWQuLjNiZWY5MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaApAQCAtNTIsNiArNTIsNyBAQAogCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOU0xMQkweDAwMDAwMDAxCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOU0xMAkweDAwMDAwMDAyCisjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOUc0NgkweDAwMDAwMDAzCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOUc0NQkweDAwMDAwMDA0CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX2V4aWRfaWRlbnRpZnkodm9pZCkKQEAgLTEyOCw5ICsxMjksMTggQEAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOUc0NQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDUoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05RzQ1KQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDVlcygpCShhdDkxX2NwdV9mdWxseV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTlHNDVFUykKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTEwKCkgICAgKGNwdV9pc19hdDkxc2FtOWc0NSgpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOU0xMCkpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOW00NigpICAgIChjcHVfaXNfYXQ5MXNhbTlnNDUoKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlHNDYpKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTEoKSAgICAoY3B1X2lzX2F0OTFzYW05ZzQ1KCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05TTExKSkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NSgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDVlcygpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTAoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ2KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMSgpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxQ0FQOQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAwNGM5MWUzLi5iZmRkOGFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBQSU5fQkFTRQkJTlJfQUlDX0lSUVMKIAogI2RlZmluZSBNQVhfR1BJT19CQU5LUwkJNQorI2RlZmluZSBOUl9CVUlMVElOX0dQSU8JCShQSU5fQkFTRSArIChNQVhfR1BJT19CQU5LUyAqIDMyKSkKIAogLyogdGhlc2UgcGluIG51bWJlcnMgZG91YmxlIGFzIElSUSBudW1iZXJzLCBsaWtlIEFUOTF4eHhfSURfKiB2YWx1ZXMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL3BtLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvcG0uaAppbmRleCAwODMyMmM0Li44Yzg3ZDBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvcG0uaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG0uaApAQCAtMzAsMTQgKzMwLDUwIEBACiB7CiAJdTMyIHNhdmVkX2xwciwgbHByOwogCi0Jc2F2ZWRfbHByID0gYXQ5MV9zeXNfcmVhZChBVDkxX0REUlNEUkNfTFBSKTsKKwlzYXZlZF9scHIgPSBhdDkxX3JhbWNfcmVhZCgwLCBBVDkxX0REUlNEUkNfTFBSKTsKIAogCWxwciA9IHNhdmVkX2xwciAmIH5BVDkxX0REUlNEUkNfTFBDQjsKLQlhdDkxX3N5c193cml0ZShBVDkxX0REUlNEUkNfTFBSLCBscHIgfCBBVDkxX0REUlNEUkNfTFBDQl9TRUxGX1JFRlJFU0gpOworCWF0OTFfcmFtY193cml0ZSgwLCBBVDkxX0REUlNEUkNfTFBSLCBscHIgfCBBVDkxX0REUlNEUkNfTFBDQl9TRUxGX1JFRlJFU0gpOwogCXJldHVybiBzYXZlZF9scHI7CiB9CiAKLSNkZWZpbmUgc2RyYW1fc2VsZnJlZnJlc2hfZGlzYWJsZShzYXZlZF9scHIpCWF0OTFfc3lzX3dyaXRlKEFUOTFfRERSU0RSQ19MUFIsIHNhdmVkX2xwcikKKyNkZWZpbmUgc2RyYW1fc2VsZnJlZnJlc2hfZGlzYWJsZShzYXZlZF9scHIpCWF0OTFfcmFtY193cml0ZSgwLCBBVDkxX0REUlNEUkNfTFBSLCBzYXZlZF9scHIpCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlHNDUpCisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9kZHJzZHIuaD4KKworLyogV2UgbWFuYWdlIGJvdGggRERSQU0vU0RSQU0gY29udHJvbGxlcnMsIHdlIG5lZWQgbW9yZSB0aGFuIG9uZSB2YWx1ZSB0bworICogcmVtZW1iZXIuCisgKi8KK3N0YXRpYyB1MzIgc2F2ZWRfbHByMTsKKworc3RhdGljIGlubGluZSB1MzIgc2RyYW1fc2VsZnJlZnJlc2hfZW5hYmxlKHZvaWQpCit7CisJLyogVGhvc2UgdG93IHZhbHVlcyBhbGxvdyB1cyB0byBkZWxheSBzZWxmLXJlZnJlc2ggYWN0aXZhdGlvbgorCSAqIHRvIHRoZSBtYXhpbXVtLiAqLworCXUzMiBscHIwLCBscHIxOworCXUzMiBzYXZlZF9scHIwOworCisJc2F2ZWRfbHByMSA9IGF0OTFfcmFtY19yZWFkKDEsIEFUOTFfRERSU0RSQ19MUFIpOworCWxwcjEgPSBzYXZlZF9scHIxICYgfkFUOTFfRERSU0RSQ19MUENCOworCWxwcjEgfD0gQVQ5MV9ERFJTRFJDX0xQQ0JfU0VMRl9SRUZSRVNIOworCisJc2F2ZWRfbHByMCA9IGF0OTFfcmFtY19yZWFkKDAsIEFUOTFfRERSU0RSQ19MUFIpOworCWxwcjAgPSBzYXZlZF9scHIwICYgfkFUOTFfRERSU0RSQ19MUENCOworCWxwcjAgfD0gQVQ5MV9ERFJTRFJDX0xQQ0JfU0VMRl9SRUZSRVNIOworCisJLyogc2VsZi1yZWZyZXNoIG1vZGUgbm93ICovCisJYXQ5MV9yYW1jX3dyaXRlKDAsIEFUOTFfRERSU0RSQ19MUFIsIGxwcjApOworCWF0OTFfcmFtY193cml0ZSgxLCBBVDkxX0REUlNEUkNfTFBSLCBscHIxKTsKKworCXJldHVybiBzYXZlZF9scHIwOworfQorCisjZGVmaW5lIHNkcmFtX3NlbGZyZWZyZXNoX2Rpc2FibGUoc2F2ZWRfbHByMCkJXAorCWRvIHsgXAorCQlhdDkxX3JhbWNfd3JpdGUoMCwgQVQ5MV9ERFJTRFJDX0xQUiwgc2F2ZWRfbHByMCk7IFwKKwkJYXQ5MV9yYW1jX3dyaXRlKDEsIEFUOTFfRERSU0RSQ19MUFIsIHNhdmVkX2xwcjEpOyBcCisJfSB3aGlsZSAoMCkKIAogI2Vsc2UKICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NkcmFtYy5oPgpAQCAtNDcsNyArODMsNiBAQAogICogRklYTUUgZWl0aGVyIG9yIGJvdGggdGhlIFNEUkFNIGNvbnRyb2xsZXJzIChFQjAsIEVCMSkgbWlnaHQgYmUgaW4gdXNlOwogICogaGFuZGxlIHRob3NlIGNhc2VzIGJvdGggaGVyZSBhbmQgaW4gdGhlIFN1c3BlbmQtVG8tUkFNIHN1cHBvcnQuCiAgKi8KLSNkZWZpbmUJQVQ5MV9TRFJBTUMJQVQ5MV9TRFJBTUMwCiAjd2FybmluZyBBc3N1bWluZyBFQjEgU0RSQU0gY29udHJvbGxlciBpcyAqTk9UKiB1c2VkCiAjZW5kaWYKIApAQCAtNTUsMTMgKzkwLDEzIEBACiB7CiAJdTMyIHNhdmVkX2xwciwgbHByOwogCi0Jc2F2ZWRfbHByID0gYXQ5MV9zeXNfcmVhZChBVDkxX1NEUkFNQ19MUFIpOworCXNhdmVkX2xwciA9IGF0OTFfcmFtY19yZWFkKDAsIEFUOTFfU0RSQU1DX0xQUik7CiAKIAlscHIgPSBzYXZlZF9scHIgJiB+QVQ5MV9TRFJBTUNfTFBDQjsKLQlhdDkxX3N5c193cml0ZShBVDkxX1NEUkFNQ19MUFIsIGxwciB8IEFUOTFfU0RSQU1DX0xQQ0JfU0VMRl9SRUZSRVNIKTsKKwlhdDkxX3JhbWNfd3JpdGUoMCwgQVQ5MV9TRFJBTUNfTFBSLCBscHIgfCBBVDkxX1NEUkFNQ19MUENCX1NFTEZfUkVGUkVTSCk7CiAJcmV0dXJuIHNhdmVkX2xwcjsKIH0KIAotI2RlZmluZSBzZHJhbV9zZWxmcmVmcmVzaF9kaXNhYmxlKHNhdmVkX2xwcikJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TRFJBTUNfTFBSLCBzYXZlZF9scHIpCisjZGVmaW5lIHNkcmFtX3NlbGZyZWZyZXNoX2Rpc2FibGUoc2F2ZWRfbHByKQlhdDkxX3JhbWNfd3JpdGUoMCwgQVQ5MV9TRFJBTUNfTFBSLCBzYXZlZF9scHIpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL3BtX3Nsb3djbG9jay5TIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3BtX3Nsb3djbG9jay5TCmluZGV4IDljNWI0OGUuLmI2YjAwYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9wbV9zbG93Y2xvY2suUworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG1fc2xvd2Nsb2NrLlMKQEAgLTE2LDEwICsxNiwxMiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcG1jLmg+CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9BVDkxUk05MjAwCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxUk05MjAwKQogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxQ0FQOSkKICNpbmNsdWRlIDxtYWNoL2F0OTFjYXA5X2RkcnNkci5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUc0NSkKKyNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X2RkcnNkci5oPgogI2Vsc2UKICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NkcmFtYy5oPgogI2VuZGlmCkBAIC0zMCw3ICszMiw2IEBACiAgKiBGSVhNRSBlaXRoZXIgb3IgYm90aCB0aGUgU0RSQU0gY29udHJvbGxlcnMgKEVCMCwgRUIxKSBtaWdodCBiZSBpbiB1c2U7CiAgKiBoYW5kbGUgdGhvc2UgY2FzZXMgYm90aCBoZXJlIGFuZCBpbiB0aGUgU3VzcGVuZC1Uby1SQU0gc3VwcG9ydC4KICAqLwotI2RlZmluZSBBVDkxX1NEUkFNQwlBVDkxX1NEUkFNQzAKICN3YXJuaW5nIEFzc3VtaW5nIEVCMSBTRFJBTSBjb250cm9sbGVyIGlzICpOT1QqIHVzZWQKICNlbmRpZgogCkBAIC0xMTMsMTIgKzExNCwxNCBAQAogCS8qCiAJICogUmVnaXN0ZXIgdXNhZ2U6CiAJICogIFIxID0gQmFzZSBhZGRyZXNzIG9mIEFUOTFfUE1DCi0JICogIFIyID0gQmFzZSBhZGRyZXNzIG9mIEFUOTFfU0RSQU1DIChvciBBVDkxX1NZUyBvbiBBVDkxUk05MjAwKQorCSAqICBSMiA9IEJhc2UgYWRkcmVzcyBvZiBSQU0gQ29udHJvbGxlciAoU0RSQU0sIEREUlNEUiwgb3IgQVQ5MV9TWVMpCiAJICogIFIzID0gdGVtcG9yYXJ5IHJlZ2lzdGVyCiAJICogIFI0ID0gdGVtcG9yYXJ5IHJlZ2lzdGVyCisJICogIFI1ID0gQmFzZSBhZGRyZXNzIG9mIHNlY29uZCBSQU0gQ29udHJvbGxlciBvciAwIGlmIG5vdCBwcmVzZW50CiAJICovCiAJbGRyCXIxLCAuYXQ5MV92YV9iYXNlX3BtYwogCWxkcglyMiwgLmF0OTFfdmFfYmFzZV9zZHJhbWMKKwlsZHIJcjUsIC5hdDkxX3ZhX2Jhc2VfcmFtYzEKIAogCS8qIERyYWluIHdyaXRlIGJ1ZmZlciAqLwogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CkBAIC0xMjcsMjAgKzEzMCwzMyBAQAogCS8qIFB1dCBTRFJBTSBpbiBzZWxmLXJlZnJlc2ggbW9kZSAqLwogCW1vdglyMywgIzEKIAlzdHIJcjMsIFtyMiwgI0FUOTFfU0RSQU1DX1NSUl0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MUNBUDkpCi0JLyogRW5hYmxlIFNEUkFNIHNlbGYtcmVmcmVzaCBtb2RlICovCi0JbGRyCXIzLCBbcjIsICNBVDkxX0REUlNEUkNfTFBSIC0gQVQ5MV9ERFJTRFJDXQotCXN0cglyMywgLnNhdmVkX3NhbTlfbHByCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFDQVA5KSBcCisJfHwgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUc0NSkKIAotCW1vdglyMywgI0FUOTFfRERSU0RSQ19MUENCX1NFTEZfUkVGUkVTSAotCXN0cglyMywgW3IyLCAjQVQ5MV9ERFJTRFJDX0xQUiAtIEFUOTFfRERSU0RSQ10KKwkvKiBwcmVwYXJlIGZvciBERFJBTSBzZWxmLXJlZnJlc2ggbW9kZSAqLworCWxkcglyMywgW3IyLCAjQVQ5MV9ERFJTRFJDX0xQUl0KKwlzdHIJcjMsIC5zYXZlZF9zYW05X2xwcgorCWJpYwlyMywgI0FUOTFfRERSU0RSQ19MUENCCisJb3JyCXIzLCAjQVQ5MV9ERFJTRFJDX0xQQ0JfU0VMRl9SRUZSRVNICisKKwkvKiBmaWd1cmUgb3V0IGlmIHdlIHVzZSB0aGUgc2Vjb25kIHJhbSBjb250cm9sbGVyICovCisJY21wCXI1LCAjMAorCWxkcm5lCXI0LCBbcjUsICNBVDkxX0REUlNEUkNfTFBSXQorCXN0cm5lCXI0LCAuc2F2ZWRfc2FtOV9scHIxCisJYmljbmUJcjQsICNBVDkxX0REUlNEUkNfTFBDQgorCW9ycm5lCXI0LCAjQVQ5MV9ERFJTRFJDX0xQQ0JfU0VMRl9SRUZSRVNICisKKwkvKiBFbmFibGUgRERSQU0gc2VsZi1yZWZyZXNoIG1vZGUgKi8KKwlzdHIJcjMsIFtyMiwgI0FUOTFfRERSU0RSQ19MUFJdCisJc3RybmUJcjQsIFtyNSwgI0FUOTFfRERSU0RSQ19MUFJdCiAjZWxzZQogCS8qIEVuYWJsZSBTRFJBTSBzZWxmLXJlZnJlc2ggbW9kZSAqLwotCWxkcglyMywgW3IyLCAjQVQ5MV9TRFJBTUNfTFBSIC0gQVQ5MV9TRFJBTUNdCisJbGRyCXIzLCBbcjIsICNBVDkxX1NEUkFNQ19MUFJdCiAJc3RyCXIzLCAuc2F2ZWRfc2FtOV9scHIKIAotCW1vdglyMywgI0FUOTFfU0RSQU1DX0xQQ0JfU0VMRl9SRUZSRVNICi0Jc3RyCXIzLCBbcjIsICNBVDkxX1NEUkFNQ19MUFIgLSBBVDkxX1NEUkFNQ10KKwliaWMJcjMsICNBVDkxX1NEUkFNQ19MUENCCisJb3JyCXIzLCAjQVQ5MV9TRFJBTUNfTFBDQl9TRUxGX1JFRlJFU0gKKwlzdHIJcjMsIFtyMiwgI0FUOTFfU0RSQU1DX0xQUl0KICNlbmRpZgogCiAJLyogU2F2ZSBNYXN0ZXIgY2xvY2sgc2V0dGluZyAqLwpAQCAtMjQ3LDE0ICsyNjMsMjEgQEAKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKIAkvKiBEbyBub3RoaW5nIC0gc2VsZi1yZWZyZXNoIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFDQVA5KQotCS8qIFJlc3RvcmUgTFBSIG9uIEFUOTFDQVA5ICovCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFDQVA5KSBcCisJfHwgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUc0NSkKKwkvKiBSZXN0b3JlIExQUiBvbiBBVDkxIHdpdGggRERSQU0gKi8KIAlsZHIJcjMsIC5zYXZlZF9zYW05X2xwcgotCXN0cglyMywgW3IyLCAjQVQ5MV9ERFJTRFJDX0xQUiAtIEFUOTFfRERSU0RSQ10KKwlzdHIJcjMsIFtyMiwgI0FUOTFfRERSU0RSQ19MUFJdCisKKwkvKiBpZiB3ZSB1c2UgdGhlIHNlY29uZCByYW0gY29udHJvbGxlciAqLworCWNtcAlyNSwgIzAKKwlsZHJuZQlyNCwgLnNhdmVkX3NhbTlfbHByMQorCXN0cm5lCXI0LCBbcjUsICNBVDkxX0REUlNEUkNfTFBSXQorCiAjZWxzZQotCS8qIFJlc3RvcmUgTFBSIG9uIEFUOTFTQU05ICovCisJLyogUmVzdG9yZSBMUFIgb24gQVQ5MSB3aXRoIFNEUkFNICovCiAJbGRyCXIzLCAuc2F2ZWRfc2FtOV9scHIKLQlzdHIJcjMsIFtyMiwgI0FUOTFfU0RSQU1DX0xQUiAtIEFUOTFfU0RSQU1DXQorCXN0cglyMywgW3IyLCAjQVQ5MV9TRFJBTUNfTFBSXQogI2VuZGlmCiAKIAkvKiBSZXN0b3JlIHJlZ2lzdGVycywgYW5kIHJldHVybiAqLwpAQCAtMjczLDE4ICsyOTYsMjkgQEAKIC5zYXZlZF9zYW05X2xwcjoKIAkud29yZCAwCiAKKy5zYXZlZF9zYW05X2xwcjE6CisJLndvcmQgMAorCiAuYXQ5MV92YV9iYXNlX3BtYzoKIAkud29yZCBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9QTUMKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKIC5hdDkxX3ZhX2Jhc2Vfc2RyYW1jOgogCS53b3JkIEFUOTFfVkFfQkFTRV9TWVMKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MUNBUDkpCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFDQVA5KSBcCisJfHwgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUc0NSkKIC5hdDkxX3ZhX2Jhc2Vfc2RyYW1jOgotCS53b3JkIEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0REUlNEUkMKKwkud29yZCBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9ERFJTRFJDMAogI2Vsc2UKIC5hdDkxX3ZhX2Jhc2Vfc2RyYW1jOgotCS53b3JkIEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX1NEUkFNQworCS53b3JkIEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX1NEUkFNQzAKKyNlbmRpZgorCisuYXQ5MV92YV9iYXNlX3JhbWMxOgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlHNDUpCisJLndvcmQgQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfRERSU0RSQzEKKyNlbHNlCisJLndvcmQgMAogI2VuZGlmCiAKIEVOVFJZKGF0OTFfc2xvd19jbG9ja19zeikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY29yZS5jCmluZGV4IDcyZTQwNWQuLmQzZjk1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NvcmUuYwpAQCAtOTEsMTQgKzkxLDIzIEBACiAJLnBhcmVudCA9ICZwbGwxX2NsaywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrID0geworCS5uYW1lID0gIkJVU0NMSyIsCisJLnR5cGUgPSBDTEtfVFlQRV9QUklNQVJZLAorCS5tb2RlID0gQ0xLX01PREVfWFRBTCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7Ci0JewkJCS8qIFVBUlQwICovCi0JIC5kZXZfaWQgPSAidWFydGEiLAotCSAuY2xrID0gJnVhcnRfY2xrLAotCSB9LCB7CQkJLyogVUFSVDEgKi8KLQkgICAgIC5kZXZfaWQgPSAidWFydGIiLAotCSAgICAgLmNsayA9ICZ1YXJ0X2NsaywKLQkgICAgIH0KKwl7CQkJLyogQnVzIGNsb2NrICovCisJCS5jb25faWQgPSAiYXBiX3BjbGsiLAorCQkuY2xrID0gJmR1bW15X2FwYl9wY2xrLAorCX0sIHsJCQkvKiBVQVJUMCAqLworCQkuZGV2X2lkID0gInVhcnRhIiwKKwkJLmNsayA9ICZ1YXJ0X2NsaywKKwl9LCB7CQkJLyogVUFSVDEgKi8KKwkJLmRldl9pZCA9ICJ1YXJ0YiIsCisJCS5jbGsgPSAmdWFydF9jbGssCisJfQogfTsKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvS2NvbmZpZwppbmRleCBkYmFhZTVmLi5lYjM0YmQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnCkBAIC0zMCw3ICszMCw2IEBACiBjb25maWcgQVJDSF9FREI3MjExCiAJYm9vbCAiRURCNzIxMSIKIAlzZWxlY3QgSVNBCi0Jc2VsZWN0IEFSQ0hfRElTQ09OVElHTUVNX0VOQUJMRQogCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlzZWxlY3QgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jCmluZGV4IDA5ZmI1N2UuLjNjM2JmNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKQEAgLTMyLDcgKzMyLDYgQEAKIAltaS0+bnJfYmFua3M9MTsKIAltaS0+YmFua1swXS5zdGFydCA9IDB4YzAwMDAwMDA7CiAJbWktPmJhbmtbMF0uc2l6ZSA9IDB4MDEwMDAwMDA7Ci0JbWktPmJhbmtbMF0ubm9kZSA9IDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMKaW5kZXggZGM4MWNjNi4uNGE3YTIzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCkBAIC0yOSw2ICszMCwxMiBAQAogCiBleHRlcm4gdm9pZCBlZGI3MjExX21hcF9pbyh2b2lkKTsKIAorLyogUmVzZXJ2ZSBzY3JlZW4gbWVtb3J5IHJlZ2lvbiBhdCB0aGUgc3RhcnQgb2YgbWFpbiBzeXN0ZW0gbWVtb3J5LiAqLworc3RhdGljIHZvaWQgX19pbml0IGVkYjcyMTFfcmVzZXJ2ZSh2b2lkKQoreworCW1lbWJsb2NrX3Jlc2VydmUoUEhZU19PRkZTRVQsIDB4MDAwMjAwMDApOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQKIGZpeHVwX2VkYjcyMTEoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYywgc3RydWN0IHRhZyAqdGFncywKIAkgICAgICBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQpAQCAtNDMsMTAgKzUwLDggQEAKIAkgKi8KIAltaS0+YmFua1swXS5zdGFydCA9IDB4YzAwMDAwMDA7CiAJbWktPmJhbmtbMF0uc2l6ZSA9IDgqMTAyNCoxMDI0OwotCW1pLT5iYW5rWzBdLm5vZGUgPSAwOwogCW1pLT5iYW5rWzFdLnN0YXJ0ID0gMHhjMTAwMDAwMDsKIAltaS0+YmFua1sxXS5zaXplID0gOCoxMDI0KjEwMjQ7Ci0JbWktPmJhbmtbMV0ubm9kZSA9IDE7CiAJbWktPm5yX2JhbmtzID0gMjsKIH0KIApAQCAtNTcsNiArNjIsNyBAQAogCS5ib290X3BhcmFtcwk9IDB4YzAwMjAxMDAsCS8qIDB4YzAwMDAwMDAgLSAweGMwMDFmZmZmIGNhbiBiZSB2aWRlbyBSQU0gKi8KIAkuZml4dXAJCT0gZml4dXBfZWRiNzIxMSwKIAkubWFwX2lvCQk9IGVkYjcyMTFfbWFwX2lvLAorCS5yZXNlcnZlCT0gZWRiNzIxMV9yZXNlcnZlLAogCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCmluZGV4IDc0MzBlNDAuLmE2OTYwOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTM5LDcgKzM5LDYgQEAKIAkJewogCQkJLnN0YXJ0CT0gMHhDMDAwMDAwMCwKIAkJCS5zaXplCT0gMHgwMTAwMDAwMCwKLQkJCS5ub2RlCT0gMAogCQl9LAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBmNzBkNTJiLi5mNDVjOGU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMjAsNyArMjAsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKIAotCiAvKgogICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCiAgKi8KQEAgLTcyLDcgKzcxLDYgQEAKICAqIAlub2RlIDI6ICAweGQwMDAwMDAwIC0gMHhkN2ZmZmZmZgogICogCW5vZGUgMzogIDB4ZDgwMDAwMDAgLSAweGRmZmZmZmZmCiAgKi8KLSNkZWZpbmUgTk9ERV9NRU1fU0laRV9CSVRTCTI0CiAjZGVmaW5lIFNFQ1RJT05fU0laRV9CSVRTCTI0CiAjZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMJMzIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L01ha2VmaWxlCmluZGV4IDQyNzUwN2EuLjExMDMzZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACi1vYmotJChDT05GSUdfQVJDSF9DTlMzWFhYKQkJKz0gY29yZS5vIHBtLm8KK29iai0kKENPTkZJR19BUkNIX0NOUzNYWFgpCQkrPSBjb3JlLm8gcG0ubyBkZXZpY2VzLm8KK29iai0kKENPTkZJR19QQ0kpCQkJKz0gcGNpZS5vCiBvYmotJChDT05GSUdfTUFDSF9DTlMzNDIwVkIpCQkrPSBjbnMzNDIwdmIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2NuczM0MjB2Yi5jIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2NuczM0MjB2Yi5jCmluZGV4IDJlMzBjODIuLjlkZjgzOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9jbnMzNDIwdmIuYworKysgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvY25zMzQyMHZiLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxtYWNoL2NuczN4eHguaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgogCiAvKgogICogTk9SIEZsYXNoCkBAIC0xMTcsNiArMTE4LDkgQEAKIHsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhjbnMzNDIwX3BkZXZzLCBBUlJBWV9TSVpFKGNuczM0MjBfcGRldnMpKTsKIAorCWNuczN4eHhfYWhjaV9pbml0KCk7CisJY25zM3h4eF9zZGhjaV9pbml0KCk7CisKIAlwbV9wb3dlcl9vZmYgPSBjbnMzeHh4X3Bvd2VyX29mZjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9kZXZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiNGQzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9kZXZpY2VzLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDTlMzeHh4IGNvbW1vbiBkZXZpY2VzCisgKgorICogQ29weXJpZ2h0IDIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgkJICBTY290dCBTaHUKKyAqIENvcHlyaWdodCAyMDEwIE1vbnRhVmlzdGEgU29mdHdhcmUsIExMQy4KKyAqCQkgIEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBtdmlzdGEuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPG1hY2gvY25zM3h4eC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKKy8qCisgKiBBSENJCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY25zM3h4eF9haGNpX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBDTlMzWFhYX1NBVEEyX0JBU0UsCisJCS5lbmQJPSBDTlMzWFhYX1NBVEEyX0JBU0UgKyBDTlMzWFhYX1NBVEEyX1NJWkUgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX0NOUzNYWFhfU0FUQSwKKwkJLmVuZAk9IElSUV9DTlMzWFhYX1NBVEEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGNuczN4eHhfYWhjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY25zM3h4eF9haGNpX3BkZXYgPSB7CisJLm5hbWUJCT0gImFoY2kiLAorCS5pZAkJPSAwLAorCS5yZXNvdXJjZQk9IGNuczN4eHhfYWhjaV9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY25zM3h4eF9haGNpX3Jlc291cmNlKSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZjbnMzeHh4X2FoY2lfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgY25zM3h4eF9haGNpX2luaXQodm9pZCkKK3sKKwl1MzIgdG1wOworCisJdG1wID0gX19yYXdfcmVhZGwoTUlTQ19TQVRBX1BPV0VSX01PREUpOworCXRtcCB8PSAweDEgPDwgMTY7IC8qIERpc2FibGUgU0FUQSBQSFkgMCBmcm9tIFNMVU1CRVIgTW9kZSAqLworCXRtcCB8PSAweDEgPDwgMTc7IC8qIERpc2FibGUgU0FUQSBQSFkgMSBmcm9tIFNMVU1CRVIgTW9kZSAqLworCV9fcmF3X3dyaXRlbCh0bXAsIE1JU0NfU0FUQV9QT1dFUl9NT0RFKTsKKworCS8qIEVuYWJsZSBTQVRBIFBIWSAqLworCWNuczN4eHhfcHdyX3Bvd2VyX3VwKDB4MSA8PCBQTV9QTExfSE1fUERfQ1RSTF9SRUdfT0ZGU0VUX1NBVEFfUEhZMCk7CisJY25zM3h4eF9wd3JfcG93ZXJfdXAoMHgxIDw8IFBNX1BMTF9ITV9QRF9DVFJMX1JFR19PRkZTRVRfU0FUQV9QSFkxKTsKKworCS8qIEVuYWJsZSBTQVRBIENsb2NrICovCisJY25zM3h4eF9wd3JfY2xrX2VuKDB4MSA8PCBQTV9DTEtfR0FURV9SRUdfT0ZGU0VUX1NBVEEpOworCisJLyogRGUtQXNzY2VyIFNBVEEgUmVzZXQgKi8KKwljbnMzeHh4X3B3cl9zb2Z0X3JzdChDTlMzWFhYX1BXUl9TT0ZUV0FSRV9SU1QoU0FUQSkpOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjbnMzeHh4X2FoY2lfcGRldik7Cit9CisKKy8qCisgKiBTREhDSQorICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNuczN4eHhfc2RoY2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBDTlMzWFhYX1NESU9fQkFTRSwKKwkJLmVuZCAgID0gQ05TM1hYWF9TRElPX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfQ05TM1hYWF9TRElPLAorCQkuZW5kICAgPSBJUlFfQ05TM1hYWF9TRElPLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY25zM3h4eF9zZGhjaV9wZGV2ID0geworCS5uYW1lCQk9ICJzZGhjaS1jbnMzeHh4IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY25zM3h4eF9zZGhjaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNuczN4eHhfc2RoY2lfcmVzb3VyY2VzLAorfTsKKwordm9pZCBfX2luaXQgY25zM3h4eF9zZGhjaV9pbml0KHZvaWQpCit7CisJdTMyIF9faW9tZW0gKmdwaW9hID0gX19pbyhDTlMzWFhYX01JU0NfQkFTRV9WSVJUICsgMHgwMDE0KTsKKwl1MzIgZ3Bpb2FfcGlucyA9IF9fcmF3X3JlYWRsKGdwaW9hKTsKKworCS8qIE1NQy9TRCBwaW5zIHNoYXJlIHdpdGggR1BJT0EgKi8KKwlncGlvYV9waW5zIHw9IDB4MWZmZjAwMDQ7CisJX19yYXdfd3JpdGVsKGdwaW9hX3BpbnMsIGdwaW9hKTsKKworCWNuczN4eHhfcHdyX2Nsa19lbihDTlMzWFhYX1BXUl9DTEtfRU4oU0RJTykpOworCWNuczN4eHhfcHdyX3NvZnRfcnN0KENOUzNYWFhfUFdSX1NPRlRXQVJFX1JTVChTRElPKSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmNuczN4eHhfc2RoY2lfcGRldik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UxNWExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2RldmljZXMuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ05TM3h4eCBjb21tb24gZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAyMDA4IENhdml1bSBOZXR3b3JrcworICoJCSAgU2NvdHQgU2h1CisgKiBDb3B5cmlnaHQgMjAxMCBNb250YVZpc3RhIFNvZnR3YXJlLCBMTEMuCisgKgkJICBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAbXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0NOUzNYWFhfREVWSUNFU19IXworI2RlZmluZSBfX0NOUzNYWFhfREVWSUNFU19IXworCit2b2lkIF9faW5pdCBjbnMzeHh4X2FoY2lfaW5pdCh2b2lkKTsKK3ZvaWQgX19pbml0IGNuczN4eHhfc2RoY2lfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9fQ05TM1hYWF9ERVZJQ0VTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL2NuczN4eHguaCBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvY25zM3h4eC5oCmluZGV4IDhhMmY1YTIuLjZkYmNlMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvY25zM3h4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvY25zM3h4eC5oCkBAIC0yNDcsMzcgKzI0NywzNiBAQAogICogTWlzYyBibG9jawogICovCiAjZGVmaW5lIE1JU0NfTUVNX01BUChvZmZzKSAodm9pZCBfX2lvbWVtICopKENOUzNYWFhfTUlTQ19CQVNFX1ZJUlQgKyAob2ZmcykpCi0jZGVmaW5lIE1JU0NfTUVNX01BUF9WQUxVRShvZmZzZXQpICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoQ05TM1hYWF9NSVNDX0JBU0VfVklSVCArIChvZmZzZXQpKSkpCiAKLSNkZWZpbmUgTUlTQ19NRU1PUllfUkVNQVBfUkVHCQkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4MDApCi0jZGVmaW5lIE1JU0NfQ0hJUF9DT05GSUdfUkVHCQkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4MDQpCi0jZGVmaW5lIE1JU0NfREVCVUdfUFJPQkVfREFUQV9SRUcJCU1JU0NfTUVNX01BUF9WQUxVRSgweDA4KQotI2RlZmluZSBNSVNDX0RFQlVHX1BST0JFX1NFTEVDVElPTl9SRUcJCU1JU0NfTUVNX01BUF9WQUxVRSgweDBDKQotI2RlZmluZSBNSVNDX0lPX1BJTl9GVU5DX1NFTEVDVElPTl9SRUcJCU1JU0NfTUVNX01BUF9WQUxVRSgweDEwKQotI2RlZmluZSBNSVNDX0dQSU9BX1BJTl9FTkFCTEVfUkVHCQlNSVNDX01FTV9NQVBfVkFMVUUoMHgxNCkKLSNkZWZpbmUgTUlTQ19HUElPQl9QSU5fRU5BQkxFX1JFRwkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4MTgpCi0jZGVmaW5lIE1JU0NfSU9fUEFEX0RSSVZFX1NUUkVOR1RIX0NUUkxfQQlNSVNDX01FTV9NQVBfVkFMVUUoMHgxQykKLSNkZWZpbmUgTUlTQ19JT19QQURfRFJJVkVfU1RSRU5HVEhfQ1RSTF9CCU1JU0NfTUVNX01BUF9WQUxVRSgweDIwKQotI2RlZmluZSBNSVNDX0dQSU9BXzE1XzBfUFVMTF9DVFJMX1JFRwkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4MjQpCi0jZGVmaW5lIE1JU0NfR1BJT0FfMTZfMzFfUFVMTF9DVFJMX1JFRwkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4MjgpCi0jZGVmaW5lIE1JU0NfR1BJT0JfMTVfMF9QVUxMX0NUUkxfUkVHCQlNSVNDX01FTV9NQVBfVkFMVUUoMHgyQykKLSNkZWZpbmUgTUlTQ19HUElPQl8xNl8zMV9QVUxMX0NUUkxfUkVHCQlNSVNDX01FTV9NQVBfVkFMVUUoMHgzMCkKLSNkZWZpbmUgTUlTQ19JT19QVUxMX0NUUkxfUkVHCQkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4MzQpCi0jZGVmaW5lIE1JU0NfRV9GVVNFXzMxXzBfUkVHCQkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4NDApCi0jZGVmaW5lIE1JU0NfRV9GVVNFXzYzXzMyX1JFRwkJCU1JU0NfTUVNX01BUF9WQUxVRSgweDQ0KQotI2RlZmluZSBNSVNDX0VfRlVTRV85NV82NF9SRUcJCQlNSVNDX01FTV9NQVBfVkFMVUUoMHg0OCkKLSNkZWZpbmUgTUlTQ19FX0ZVU0VfMTI3Xzk2X1JFRwkJCU1JU0NfTUVNX01BUF9WQUxVRSgweDRDKQotI2RlZmluZSBNSVNDX1NPRlRXQVJFX1RFU1RfMV9SRUcJCU1JU0NfTUVNX01BUF9WQUxVRSgweDUwKQotI2RlZmluZSBNSVNDX1NPRlRXQVJFX1RFU1RfMl9SRUcJCU1JU0NfTUVNX01BUF9WQUxVRSgweDU0KQorI2RlZmluZSBNSVNDX01FTU9SWV9SRU1BUF9SRUcJCQlNSVNDX01FTV9NQVAoMHgwMCkKKyNkZWZpbmUgTUlTQ19DSElQX0NPTkZJR19SRUcJCQlNSVNDX01FTV9NQVAoMHgwNCkKKyNkZWZpbmUgTUlTQ19ERUJVR19QUk9CRV9EQVRBX1JFRwkJTUlTQ19NRU1fTUFQKDB4MDgpCisjZGVmaW5lIE1JU0NfREVCVUdfUFJPQkVfU0VMRUNUSU9OX1JFRwkJTUlTQ19NRU1fTUFQKDB4MEMpCisjZGVmaW5lIE1JU0NfSU9fUElOX0ZVTkNfU0VMRUNUSU9OX1JFRwkJTUlTQ19NRU1fTUFQKDB4MTApCisjZGVmaW5lIE1JU0NfR1BJT0FfUElOX0VOQUJMRV9SRUcJCU1JU0NfTUVNX01BUCgweDE0KQorI2RlZmluZSBNSVNDX0dQSU9CX1BJTl9FTkFCTEVfUkVHCQlNSVNDX01FTV9NQVAoMHgxOCkKKyNkZWZpbmUgTUlTQ19JT19QQURfRFJJVkVfU1RSRU5HVEhfQ1RSTF9BCU1JU0NfTUVNX01BUCgweDFDKQorI2RlZmluZSBNSVNDX0lPX1BBRF9EUklWRV9TVFJFTkdUSF9DVFJMX0IJTUlTQ19NRU1fTUFQKDB4MjApCisjZGVmaW5lIE1JU0NfR1BJT0FfMTVfMF9QVUxMX0NUUkxfUkVHCQlNSVNDX01FTV9NQVAoMHgyNCkKKyNkZWZpbmUgTUlTQ19HUElPQV8xNl8zMV9QVUxMX0NUUkxfUkVHCQlNSVNDX01FTV9NQVAoMHgyOCkKKyNkZWZpbmUgTUlTQ19HUElPQl8xNV8wX1BVTExfQ1RSTF9SRUcJCU1JU0NfTUVNX01BUCgweDJDKQorI2RlZmluZSBNSVNDX0dQSU9CXzE2XzMxX1BVTExfQ1RSTF9SRUcJCU1JU0NfTUVNX01BUCgweDMwKQorI2RlZmluZSBNSVNDX0lPX1BVTExfQ1RSTF9SRUcJCQlNSVNDX01FTV9NQVAoMHgzNCkKKyNkZWZpbmUgTUlTQ19FX0ZVU0VfMzFfMF9SRUcJCQlNSVNDX01FTV9NQVAoMHg0MCkKKyNkZWZpbmUgTUlTQ19FX0ZVU0VfNjNfMzJfUkVHCQkJTUlTQ19NRU1fTUFQKDB4NDQpCisjZGVmaW5lIE1JU0NfRV9GVVNFXzk1XzY0X1JFRwkJCU1JU0NfTUVNX01BUCgweDQ4KQorI2RlZmluZSBNSVNDX0VfRlVTRV8xMjdfOTZfUkVHCQkJTUlTQ19NRU1fTUFQKDB4NEMpCisjZGVmaW5lIE1JU0NfU09GVFdBUkVfVEVTVF8xX1JFRwkJTUlTQ19NRU1fTUFQKDB4NTApCisjZGVmaW5lIE1JU0NfU09GVFdBUkVfVEVTVF8yX1JFRwkJTUlTQ19NRU1fTUFQKDB4NTQpCiAKLSNkZWZpbmUgTUlTQ19TQVRBX1BPV0VSX01PREUJCQlNSVNDX01FTV9NQVBfVkFMVUUoMHgzMTApCisjZGVmaW5lIE1JU0NfU0FUQV9QT1dFUl9NT0RFCQkJTUlTQ19NRU1fTUFQKDB4MzEwKQogCi0jZGVmaW5lIE1JU0NfVVNCX0NGR19SRUcJCQlNSVNDX01FTV9NQVBfVkFMVUUoMHg4MDApCi0jZGVmaW5lIE1JU0NfVVNCX1NUU19SRUcJCQlNSVNDX01FTV9NQVBfVkFMVUUoMHg4MDQpCi0jZGVmaW5lIE1JU0NfVVNCUEhZMDBfQ0ZHX1JFRwkJCU1JU0NfTUVNX01BUF9WQUxVRSgweDgwOCkKLSNkZWZpbmUgTUlTQ19VU0JQSFkwMV9DRkdfUkVHCQkJTUlTQ19NRU1fTUFQX1ZBTFVFKDB4ODBjKQotI2RlZmluZSBNSVNDX1VTQlBIWTEwX0NGR19SRUcJCQlNSVNDX01FTV9NQVBfVkFMVUUoMHg4MTApCi0jZGVmaW5lIE1JU0NfVVNCUEhZMTFfQ0ZHX1JFRwkJCU1JU0NfTUVNX01BUF9WQUxVRSgweDgxNCkKKyNkZWZpbmUgTUlTQ19VU0JfQ0ZHX1JFRwkJCU1JU0NfTUVNX01BUCgweDgwMCkKKyNkZWZpbmUgTUlTQ19VU0JfU1RTX1JFRwkJCU1JU0NfTUVNX01BUCgweDgwNCkKKyNkZWZpbmUgTUlTQ19VU0JQSFkwMF9DRkdfUkVHCQkJTUlTQ19NRU1fTUFQKDB4ODA4KQorI2RlZmluZSBNSVNDX1VTQlBIWTAxX0NGR19SRUcJCQlNSVNDX01FTV9NQVAoMHg4MGMpCisjZGVmaW5lIE1JU0NfVVNCUEhZMTBfQ0ZHX1JFRwkJCU1JU0NfTUVNX01BUCgweDgxMCkKKyNkZWZpbmUgTUlTQ19VU0JQSFkxMV9DRkdfUkVHCQkJTUlTQ19NRU1fTUFQKDB4ODE0KQogCiAjZGVmaW5lIE1JU0NfUENJRVBIWV9DTUNUTCh4KQkJCU1JU0NfTUVNX01BUCgweDkwMCArICh4KSAqIDB4MDA0KQogI2RlZmluZSBNSVNDX1BDSUVQSFlfQ1RMKHgpCQkJTUlTQ19NRU1fTUFQKDB4OTQwICsgKHgpICogMHgxMDApCkBAIC0zMDAsMjEgKzI5OSwyMSBAQAogLyoKICAqIFBvd2VyIG1hbmFnZW1lbnQgYW5kIGNsb2NrIGNvbnRyb2wKICAqLwotI2RlZmluZSBQTVVfUkVHX1ZBTFVFKG9mZnNldCkgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShDTlMzWFhYX1BNX0JBU0VfVklSVCArIChvZmZzZXQpKSkpCisjZGVmaW5lIFBNVV9NRU1fTUFQKG9mZnMpICh2b2lkIF9faW9tZW0gKikoQ05TM1hYWF9QTV9CQVNFX1ZJUlQgKyAob2ZmcykpCiAKLSNkZWZpbmUgUE1fQ0xLX0dBVEVfUkVHCQkJCQlQTVVfUkVHX1ZBTFVFKDB4MDAwKQotI2RlZmluZSBQTV9TT0ZUX1JTVF9SRUcJCQkJCVBNVV9SRUdfVkFMVUUoMHgwMDQpCi0jZGVmaW5lIFBNX0hTX0NGR19SRUcJCQkJCVBNVV9SRUdfVkFMVUUoMHgwMDgpCi0jZGVmaW5lIFBNX0NBQ1RJVkVfU1RBX1JFRwkJCQlQTVVfUkVHX1ZBTFVFKDB4MDBDKQotI2RlZmluZSBQTV9QV1JfU1RBX1JFRwkJCQkJUE1VX1JFR19WQUxVRSgweDAxMCkKLSNkZWZpbmUgUE1fQ0xLX0NUUkxfUkVHCQkJCQlQTVVfUkVHX1ZBTFVFKDB4MDE0KQotI2RlZmluZSBQTV9QTExfTENEX0kyU19DVFJMX1JFRwkJCQlQTVVfUkVHX1ZBTFVFKDB4MDE4KQotI2RlZmluZSBQTV9QTExfSE1fUERfQ1RSTF9SRUcJCQkJUE1VX1JFR19WQUxVRSgweDAxQykKLSNkZWZpbmUgUE1fUkVHVUxBVF9DVFJMX1JFRwkJCQlQTVVfUkVHX1ZBTFVFKDB4MDIwKQotI2RlZmluZSBQTV9XRFRfQ1RSTF9SRUcJCQkJCVBNVV9SRUdfVkFMVUUoMHgwMjQpCi0jZGVmaW5lIFBNX1dVX0NUUkwwX1JFRwkJCQkJUE1VX1JFR19WQUxVRSgweDAyOCkKLSNkZWZpbmUgUE1fV1VfQ1RSTDFfUkVHCQkJCQlQTVVfUkVHX1ZBTFVFKDB4MDJDKQotI2RlZmluZSBQTV9DU1JfUkVHCQkJCQlQTVVfUkVHX1ZBTFVFKDB4MDMwKQorI2RlZmluZSBQTV9DTEtfR0FURV9SRUcJCQkJCVBNVV9NRU1fTUFQKDB4MDAwKQorI2RlZmluZSBQTV9TT0ZUX1JTVF9SRUcJCQkJCVBNVV9NRU1fTUFQKDB4MDA0KQorI2RlZmluZSBQTV9IU19DRkdfUkVHCQkJCQlQTVVfTUVNX01BUCgweDAwOCkKKyNkZWZpbmUgUE1fQ0FDVElWRV9TVEFfUkVHCQkJCVBNVV9NRU1fTUFQKDB4MDBDKQorI2RlZmluZSBQTV9QV1JfU1RBX1JFRwkJCQkJUE1VX01FTV9NQVAoMHgwMTApCisjZGVmaW5lIFBNX0NMS19DVFJMX1JFRwkJCQkJUE1VX01FTV9NQVAoMHgwMTQpCisjZGVmaW5lIFBNX1BMTF9MQ0RfSTJTX0NUUkxfUkVHCQkJCVBNVV9NRU1fTUFQKDB4MDE4KQorI2RlZmluZSBQTV9QTExfSE1fUERfQ1RSTF9SRUcJCQkJUE1VX01FTV9NQVAoMHgwMUMpCisjZGVmaW5lIFBNX1JFR1VMQVRfQ1RSTF9SRUcJCQkJUE1VX01FTV9NQVAoMHgwMjApCisjZGVmaW5lIFBNX1dEVF9DVFJMX1JFRwkJCQkJUE1VX01FTV9NQVAoMHgwMjQpCisjZGVmaW5lIFBNX1dVX0NUUkwwX1JFRwkJCQkJUE1VX01FTV9NQVAoMHgwMjgpCisjZGVmaW5lIFBNX1dVX0NUUkwxX1JFRwkJCQkJUE1VX01FTV9NQVAoMHgwMkMpCisjZGVmaW5lIFBNX0NTUl9SRUcJCQkJCVBNVV9NRU1fTUFQKDB4MDMwKQogCiAvKiBQTV9DTEtfR0FURV9SRUcgKi8KICNkZWZpbmUgUE1fQ0xLX0dBVEVfUkVHX09GRlNFVF9TRElPCQkJKDI1KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wY2llLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwODhjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wY2llLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBQQ0ktRSBzdXBwb3J0IGZvciBDTlMzeHh4CisgKgorICogQ29weXJpZ2h0IDIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgkJICBSaWNoYXJkIExpdSA8cmljaGFyZC5saXVAY2F2aXVtbmV0d29ya3MuY29tPgorICogQ29weXJpZ2h0IDIwMTAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgTExDLgorICoJCSAgQW50b24gVm9yb250c292IDxhdm9yb250c292QG12aXN0YS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2NuczN4eHguaD4KKyNpbmNsdWRlICJjb3JlLmgiCisKK2VudW0gY25zM3h4eF9hY2Nlc3NfdHlwZSB7CisJQ05TM1hYWF9IT1NUX1RZUEUgPSAwLAorCUNOUzNYWFhfQ0ZHMF9UWVBFLAorCUNOUzNYWFhfQ0ZHMV9UWVBFLAorCUNOUzNYWFhfTlVNX0FDQ0VTU19UWVBFUywKK307CisKK3N0cnVjdCBjbnMzeHh4X3BjaWUgeworCXN0cnVjdCBtYXBfZGVzYyBjZmdfYmFzZXNbQ05TM1hYWF9OVU1fQUNDRVNTX1RZUEVTXTsKKwl1bnNpZ25lZCBpbnQgaXJxc1syXTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzX2lvOworCXN0cnVjdCByZXNvdXJjZSByZXNfbWVtOworCXN0cnVjdCBod19wY2kgaHdfcGNpOworCisJYm9vbCBsaW5rZWQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNuczN4eHhfcGNpZSBjbnMzeHh4X3BjaWVbXTsgLyogZm9yd2FyZCBkZWNsLiAqLworCitzdGF0aWMgc3RydWN0IGNuczN4eHhfcGNpZSAqc3lzZGF0YV90b19jbnNwY2kodm9pZCAqc3lzZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhICpyb290ID0gc3lzZGF0YTsKKworCXJldHVybiAmY25zM3h4eF9wY2llW3Jvb3QtPmRvbWFpbl07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY25zM3h4eF9wY2llICpwZGV2X3RvX2Nuc3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiBzeXNkYXRhX3RvX2Nuc3BjaShkZXYtPnN5c2RhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGNuczN4eHhfcGNpZSAqcGJ1c190b19jbnNwY2koc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gc3lzZGF0YV90b19jbnNwY2koYnVzLT5zeXNkYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqY25zM3h4eF9wY2lfY2ZnX2Jhc2Uoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCQkgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlKQoreworCXN0cnVjdCBjbnMzeHh4X3BjaWUgKmNuc3BjaSA9IHBidXNfdG9fY25zcGNpKGJ1cyk7CisJaW50IGJ1c25vID0gYnVzLT5udW1iZXI7CisJaW50IHNsb3QgPSBQQ0lfU0xPVChkZXZmbik7CisJaW50IG9mZnNldDsKKwllbnVtIGNuczN4eHhfYWNjZXNzX3R5cGUgdHlwZTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBsaW5rLCBqdXN0IHNob3cgdGhlIENOUyBQQ0kgYnJpZGdlLiAqLworCWlmICghY25zcGNpLT5saW5rZWQgJiYgKGJ1c25vID4gMCB8fCBzbG90ID4gMCkpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBUaGUgQ05TIFBDSSBicmlkZ2UgZG9lc24ndCBmaXQgaW50byB0aGUgUENJIGhpZXJhcmNoeSwgdGhvdWdoCisJICogd2Ugc3RpbGwgd2FudCB0byBhY2Nlc3MgaXQuIEZvciB0aGlzIHRvIHdvcmssIHdlIG11c3QgcGxhY2UKKwkgKiB0aGUgZmlyc3QgZGV2aWNlIG9uIHRoZSBzYW1lIGJ1cyBhcyB0aGUgQ05TIFBDSSBicmlkZ2UuCisJICovCisJaWYgKGJ1c25vID09IDApIHsKKwkJaWYgKHNsb3QgPiAxKQorCQkJcmV0dXJuIE5VTEw7CisJCXR5cGUgPSBzbG90OworCX0gZWxzZSB7CisJCXR5cGUgPSBDTlMzWFhYX0NGRzFfVFlQRTsKKwl9CisKKwliYXNlID0gKHZvaWQgX19pb21lbSAqKWNuc3BjaS0+Y2ZnX2Jhc2VzW3R5cGVdLnZpcnR1YWw7CisJb2Zmc2V0ID0gKChidXNubyAmIDB4ZikgPDwgMjApIHwgKGRldmZuIDw8IDEyKSB8ICh3aGVyZSAmIDB4ZmZjKTsKKworCXJldHVybiBiYXNlICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW50IGNuczN4eHhfcGNpX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwl1MzIgdjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIG1hc2sgPSAoMHgxdWxsIDw8IChzaXplICogOCkpIC0gMTsKKwlpbnQgc2hpZnQgPSAod2hlcmUgJSA0KSAqIDg7CisKKwliYXNlID0gY25zM3h4eF9wY2lfY2ZnX2Jhc2UoYnVzLCBkZXZmbiwgd2hlcmUpOworCWlmICghYmFzZSkgeworCQkqdmFsID0gMHhmZmZmZmZmZjsKKwkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKwl9CisKKwl2ID0gX19yYXdfcmVhZGwoYmFzZSk7CisKKwlpZiAoYnVzLT5udW1iZXIgPT0gMCAmJiBkZXZmbiA9PSAwICYmCisJCQkod2hlcmUgJiAweGZmYykgPT0gUENJX0NMQVNTX1JFVklTSU9OKSB7CisJCS8qCisJCSAqIFJDJ3MgY2xhc3MgaXMgMHhiLCBidXQgTGludXggUENJIGRyaXZlciBuZWVkcyAweDYwNAorCQkgKiBmb3IgYSBQQ0llIGJyaWRnZS4gU28gd2UgbXVzdCBmaXh1cCB0aGUgY2xhc3MgY29kZQorCQkgKiB0byAweDYwNCBoZXJlLgorCQkgKi8KKwkJdiAmPSAweGZmOworCQl2IHw9IDB4NjA0IDw8IDE2OworCX0KKworCSp2YWwgPSAodiA+PiBzaGlmdCkgJiBtYXNrOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCBjbnMzeHh4X3BjaV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQoreworCXUzMiB2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgbWFzayA9ICgweDF1bGwgPDwgKHNpemUgKiA4KSkgLSAxOworCWludCBzaGlmdCA9ICh3aGVyZSAlIDQpICogODsKKworCWJhc2UgPSBjbnMzeHh4X3BjaV9jZmdfYmFzZShidXMsIGRldmZuLCB3aGVyZSk7CisJaWYgKCFiYXNlKQorCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCisJdiA9IF9fcmF3X3JlYWRsKGJhc2UpOworCisJdiAmPSB+KG1hc2sgPDwgc2hpZnQpOworCXYgfD0gKHZhbCAmIG1hc2spIDw8IHNoaWZ0OworCisJX19yYXdfd3JpdGVsKHYsIGJhc2UpOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCBjbnMzeHh4X3BjaV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3sKKwlzdHJ1Y3QgY25zM3h4eF9wY2llICpjbnNwY2kgPSBzeXNkYXRhX3RvX2Nuc3BjaShzeXMpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzX2lvID0gJmNuc3BjaS0+cmVzX2lvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzX21lbSA9ICZjbnNwY2ktPnJlc19tZW07CisJc3RydWN0IHJlc291cmNlICoqc3lzcmVzID0gc3lzLT5yZXNvdXJjZTsKKworCUJVR19PTihyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzX2lvKSB8fAorCSAgICAgICByZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzX21lbSkpOworCisJc3lzcmVzWzBdID0gcmVzX2lvOworCXN5c3Jlc1sxXSA9IHJlc19tZW07CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGNuczN4eHhfcGNpZV9vcHMgPSB7CisJLnJlYWQgPSBjbnMzeHh4X3BjaV9yZWFkX2NvbmZpZywKKwkud3JpdGUgPSBjbnMzeHh4X3BjaV93cml0ZV9jb25maWcsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9idXMgKmNuczN4eHhfcGNpX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXJldHVybiBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwgJmNuczN4eHhfcGNpZV9vcHMsIHN5cyk7Cit9CisKK3N0YXRpYyBpbnQgY25zM3h4eF9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN0cnVjdCBjbnMzeHh4X3BjaWUgKmNuc3BjaSA9IHBkZXZfdG9fY25zcGNpKGRldik7CisJaW50IGlycSA9IGNuc3BjaS0+aXJxc1tzbG90XTsKKworCXByX2luZm8oIlBDSWUgbWFwIGlycTogJTA0ZDolMDJ4OiUwMnguJTAyeCBzbG90ICVkLCBwaW4gJWQsIGlycTogJWRcbiIsCisJCXBjaV9kb21haW5fbnIoZGV2LT5idXMpLCBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwKKwkJUENJX0ZVTkMoZGV2LT5kZXZmbiksIHNsb3QsIHBpbiwgaXJxKTsKKworCXJldHVybiBpcnE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY25zM3h4eF9wY2llIGNuczN4eHhfcGNpZVtdID0geworCVswXSA9IHsKKwkJLmNmZ19iYXNlcyA9IHsKKwkJCVtDTlMzWFhYX0hPU1RfVFlQRV0gPSB7CisJCQkJLnZpcnR1YWwgPSBDTlMzWFhYX1BDSUUwX0hPU1RfQkFTRV9WSVJULAorCQkJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKENOUzNYWFhfUENJRTBfSE9TVF9CQVNFKSwKKwkJCQkubGVuZ3RoID0gU1pfMTZNLAorCQkJCS50eXBlID0gTVRfREVWSUNFLAorCQkJfSwKKwkJCVtDTlMzWFhYX0NGRzBfVFlQRV0gPSB7CisJCQkJLnZpcnR1YWwgPSBDTlMzWFhYX1BDSUUwX0NGRzBfQkFTRV9WSVJULAorCQkJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKENOUzNYWFhfUENJRTBfQ0ZHMF9CQVNFKSwKKwkJCQkubGVuZ3RoID0gU1pfMTZNLAorCQkJCS50eXBlID0gTVRfREVWSUNFLAorCQkJfSwKKwkJCVtDTlMzWFhYX0NGRzFfVFlQRV0gPSB7CisJCQkJLnZpcnR1YWwgPSBDTlMzWFhYX1BDSUUwX0NGRzFfQkFTRV9WSVJULAorCQkJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKENOUzNYWFhfUENJRTBfQ0ZHMV9CQVNFKSwKKwkJCQkubGVuZ3RoID0gU1pfMTZNLAorCQkJCS50eXBlID0gTVRfREVWSUNFLAorCQkJfSwKKwkJfSwKKwkJLnJlc19pbyA9IHsKKwkJCS5uYW1lID0gIlBDSWUwIEkvTyBzcGFjZSIsCisJCQkuc3RhcnQgPSBDTlMzWFhYX1BDSUUwX0lPX0JBU0UsCisJCQkuZW5kID0gQ05TM1hYWF9QQ0lFMF9JT19CQVNFICsgU1pfMTZNIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8sCisJCX0sCisJCS5yZXNfbWVtID0geworCQkJLm5hbWUgPSAiUENJZTAgbm9uLXByZWZldGNoYWJsZSIsCisJCQkuc3RhcnQgPSBDTlMzWFhYX1BDSUUwX01FTV9CQVNFLAorCQkJLmVuZCA9IENOUzNYWFhfUENJRTBfTUVNX0JBU0UgKyBTWl8xNk0gLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJCS5pcnFzID0geyBJUlFfQ05TM1hYWF9QQ0lFMF9SQywgSVJRX0NOUzNYWFhfUENJRTBfREVWSUNFLCB9LAorCQkuaHdfcGNpID0geworCQkJLmRvbWFpbiA9IDAsCisJCQkuc3dpenpsZSA9IHBjaV9zdGRfc3dpenpsZSwKKwkJCS5ucl9jb250cm9sbGVycyA9IDEsCisJCQkuc2V0dXAgPSBjbnMzeHh4X3BjaV9zZXR1cCwKKwkJCS5zY2FuID0gY25zM3h4eF9wY2lfc2Nhbl9idXMsCisJCQkubWFwX2lycSA9IGNuczN4eHhfcGNpZV9tYXBfaXJxLAorCQl9LAorCX0sCisJWzFdID0geworCQkuY2ZnX2Jhc2VzID0geworCQkJW0NOUzNYWFhfSE9TVF9UWVBFXSA9IHsKKwkJCQkudmlydHVhbCA9IENOUzNYWFhfUENJRTFfSE9TVF9CQVNFX1ZJUlQsCisJCQkJLnBmbiA9IF9fcGh5c190b19wZm4oQ05TM1hYWF9QQ0lFMV9IT1NUX0JBU0UpLAorCQkJCS5sZW5ndGggPSBTWl8xNk0sCisJCQkJLnR5cGUgPSBNVF9ERVZJQ0UsCisJCQl9LAorCQkJW0NOUzNYWFhfQ0ZHMF9UWVBFXSA9IHsKKwkJCQkudmlydHVhbCA9IENOUzNYWFhfUENJRTFfQ0ZHMF9CQVNFX1ZJUlQsCisJCQkJLnBmbiA9IF9fcGh5c190b19wZm4oQ05TM1hYWF9QQ0lFMV9DRkcwX0JBU0UpLAorCQkJCS5sZW5ndGggPSBTWl8xNk0sCisJCQkJLnR5cGUgPSBNVF9ERVZJQ0UsCisJCQl9LAorCQkJW0NOUzNYWFhfQ0ZHMV9UWVBFXSA9IHsKKwkJCQkudmlydHVhbCA9IENOUzNYWFhfUENJRTFfQ0ZHMV9CQVNFX1ZJUlQsCisJCQkJLnBmbiA9IF9fcGh5c190b19wZm4oQ05TM1hYWF9QQ0lFMV9DRkcxX0JBU0UpLAorCQkJCS5sZW5ndGggPSBTWl8xNk0sCisJCQkJLnR5cGUgPSBNVF9ERVZJQ0UsCisJCQl9LAorCQl9LAorCQkucmVzX2lvID0geworCQkJLm5hbWUgPSAiUENJZTEgSS9PIHNwYWNlIiwKKwkJCS5zdGFydCA9IENOUzNYWFhfUENJRTFfSU9fQkFTRSwKKwkJCS5lbmQgPSBDTlMzWFhYX1BDSUUxX0lPX0JBU0UgKyBTWl8xNk0gLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JTywKKwkJfSwKKwkJLnJlc19tZW0gPSB7CisJCQkubmFtZSA9ICJQQ0llMSBub24tcHJlZmV0Y2hhYmxlIiwKKwkJCS5zdGFydCA9IENOUzNYWFhfUENJRTFfTUVNX0JBU0UsCisJCQkuZW5kID0gQ05TM1hYWF9QQ0lFMV9NRU1fQkFTRSArIFNaXzE2TSAtIDEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwKKwkJLmlycXMgPSB7IElSUV9DTlMzWFhYX1BDSUUxX1JDLCBJUlFfQ05TM1hYWF9QQ0lFMV9ERVZJQ0UsIH0sCisJCS5od19wY2kgPSB7CisJCQkuZG9tYWluID0gMSwKKwkJCS5zd2l6emxlID0gcGNpX3N0ZF9zd2l6emxlLAorCQkJLm5yX2NvbnRyb2xsZXJzID0gMSwKKwkJCS5zZXR1cCA9IGNuczN4eHhfcGNpX3NldHVwLAorCQkJLnNjYW4gPSBjbnMzeHh4X3BjaV9zY2FuX2J1cywKKwkJCS5tYXBfaXJxID0gY25zM3h4eF9wY2llX21hcF9pcnEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbnMzeHh4X3BjaWVfY2hlY2tfbGluayhzdHJ1Y3QgY25zM3h4eF9wY2llICpjbnNwY2kpCit7CisJaW50IHBvcnQgPSBjbnNwY2ktPmh3X3BjaS5kb21haW47CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChNSVNDX1BDSUVfQ1RSTChwb3J0KSk7CisJLyoKKwkgKiBFbmFibGUgQXBwbGljYXRpb24gUmVxdWVzdCB0byAxLCBpdCB3aWxsIGV4aXQgTDEgYXV0b21hdGljYWxseSwKKwkgKiBidXQgd2hlbiBjaGlwIGJhY2ssIGl0IHdpbGwgdXNlIGFub3RoZXIgY2xvY2ssIHN0aWxsIGNhbiB1c2UgMHgxLgorCSAqLworCXJlZyB8PSAweDM7CisJX19yYXdfd3JpdGVsKHJlZywgTUlTQ19QQ0lFX0NUUkwocG9ydCkpOworCisJcHJfaW5mbygiUENJZTogUG9ydFslZF0gRW5hYmxlIFBDSWUgTFRTU01cbiIsIHBvcnQpOworCXByX2luZm8oIlBDSWU6IFBvcnRbJWRdIENoZWNrIGRhdGEgbGluayBsYXllci4uLiIsIHBvcnQpOworCisJdGltZSA9IGppZmZpZXM7CisJd2hpbGUgKDEpIHsKKwkJcmVnID0gX19yYXdfcmVhZGwoTUlTQ19QQ0lFX1BNX0RFQlVHKHBvcnQpKTsKKwkJaWYgKHJlZyAmIDB4MSkgeworCQkJcHJfaW5mbygiTGluayB1cC5cbiIpOworCQkJY25zcGNpLT5saW5rZWQgPSAxOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lICsgNTApKSB7CisJCQlwcl9pbmZvKCJEZXZpY2Ugbm90IGZvdW5kLlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGNuczN4eHhfcGNpZV9od19pbml0KHN0cnVjdCBjbnMzeHh4X3BjaWUgKmNuc3BjaSkKK3sKKwlpbnQgcG9ydCA9IGNuc3BjaS0+aHdfcGNpLmRvbWFpbjsKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhIHNkID0geworCQkuZG9tYWluID0gcG9ydCwKKwl9OworCXN0cnVjdCBwY2lfYnVzIGJ1cyA9IHsKKwkJLm51bWJlciA9IDAsCisJCS5vcHMgPSAmY25zM3h4eF9wY2llX29wcywKKwkJLnN5c2RhdGEgPSAmc2QsCisJfTsKKwl1MzIgaW9fYmFzZSA9IGNuc3BjaS0+cmVzX2lvLnN0YXJ0ID4+IDE2OworCXUzMiBtZW1fYmFzZSA9IGNuc3BjaS0+cmVzX21lbS5zdGFydCA+PiAxNjsKKwl1MzIgaG9zdF9iYXNlID0gY25zcGNpLT5jZmdfYmFzZXNbQ05TM1hYWF9IT1NUX1RZUEVdLnBmbjsKKwl1MzIgY2ZnMF9iYXNlID0gY25zcGNpLT5jZmdfYmFzZXNbQ05TM1hYWF9DRkcwX1RZUEVdLnBmbjsKKwl1MzIgZGV2Zm4gPSAwOworCXU4IHRtcDg7CisJdTE2IHBvczsKKwl1MTYgZGM7CisKKwlob3N0X2Jhc2UgPSAoX19wZm5fdG9fcGh5cyhob3N0X2Jhc2UpIC0gMSkgPj4gMTY7CisJY2ZnMF9iYXNlID0gKF9fcGZuX3RvX3BoeXMoY2ZnMF9iYXNlKSAtIDEpID4+IDE2OworCisJcGNpX2J1c193cml0ZV9jb25maWdfYnl0ZSgmYnVzLCBkZXZmbiwgUENJX1BSSU1BUllfQlVTLCAwKTsKKwlwY2lfYnVzX3dyaXRlX2NvbmZpZ19ieXRlKCZidXMsIGRldmZuLCBQQ0lfU0VDT05EQVJZX0JVUywgMSk7CisJcGNpX2J1c193cml0ZV9jb25maWdfYnl0ZSgmYnVzLCBkZXZmbiwgUENJX1NVQk9SRElOQVRFX0JVUywgMSk7CisKKwlwY2lfYnVzX3JlYWRfY29uZmlnX2J5dGUoJmJ1cywgZGV2Zm4sIFBDSV9QUklNQVJZX0JVUywgJnRtcDgpOworCXBjaV9idXNfcmVhZF9jb25maWdfYnl0ZSgmYnVzLCBkZXZmbiwgUENJX1NFQ09OREFSWV9CVVMsICZ0bXA4KTsKKwlwY2lfYnVzX3JlYWRfY29uZmlnX2J5dGUoJmJ1cywgZGV2Zm4sIFBDSV9TVUJPUkRJTkFURV9CVVMsICZ0bXA4KTsKKworCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQoJmJ1cywgZGV2Zm4sIFBDSV9NRU1PUllfQkFTRSwgbWVtX2Jhc2UpOworCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQoJmJ1cywgZGV2Zm4sIFBDSV9NRU1PUllfTElNSVQsIGhvc3RfYmFzZSk7CisJcGNpX2J1c193cml0ZV9jb25maWdfd29yZCgmYnVzLCBkZXZmbiwgUENJX0lPX0JBU0VfVVBQRVIxNiwgaW9fYmFzZSk7CisJcGNpX2J1c193cml0ZV9jb25maWdfd29yZCgmYnVzLCBkZXZmbiwgUENJX0lPX0xJTUlUX1VQUEVSMTYsIGNmZzBfYmFzZSk7CisKKwlpZiAoIWNuc3BjaS0+bGlua2VkKQorCQlyZXR1cm47CisKKwkvKiBTZXQgRGV2aWNlIE1heF9SZWFkX1JlcXVlc3RfU2l6ZSB0byAxMjggYnl0ZSAqLworCWRldmZuID0gUENJX0RFVkZOKDEsIDApOworCXBvcyA9IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5KCZidXMsIGRldmZuLCBQQ0lfQ0FQX0lEX0VYUCk7CisJcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKCZidXMsIGRldmZuLCBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwgJmRjKTsKKwlkYyAmPSB+KDB4MyA8PCAxMik7CS8qIENsZWFyIERldmljZSBDb250cm9sIFJlZ2lzdGVyIFsxNDoxMl0gKi8KKwlwY2lfYnVzX3dyaXRlX2NvbmZpZ193b3JkKCZidXMsIGRldmZuLCBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwgZGMpOworCXBjaV9idXNfcmVhZF9jb25maWdfd29yZCgmYnVzLCBkZXZmbiwgcG9zICsgUENJX0VYUF9ERVZDVEwsICZkYyk7CisJaWYgKCEoZGMgJiAoMHgzIDw8IDEyKSkpCisJCXByX2luZm8oIlBDSWU6IFNldCBEZXZpY2UgTWF4X1JlYWRfUmVxdWVzdF9TaXplIHRvIDEyOCBieXRlXG4iKTsKKworCS8qIERpc2FibGUgUENJZTAgSW50ZXJydXB0IE1hc2sgSU5UQSB0byBJTlREICovCisJX19yYXdfd3JpdGVsKH4weDNGRkYsIE1JU0NfUENJRV9JTlRfTUFTSyhwb3J0KSk7Cit9CisKK3N0YXRpYyBpbnQgY25zM3h4eF9wY2llX2Fib3J0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChmc3IgJiAoMSA8PCAxMCkpCisJCXJlZ3MtPkFSTV9wYyArPSA0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjbnMzeHh4X3BjaWVfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaG9va19mYXVsdF9jb2RlKDE2ICsgNiwgY25zM3h4eF9wY2llX2Fib3J0X2hhbmRsZXIsIFNJR0JVUywKKwkJCSJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNuczN4eHhfcGNpZSk7IGkrKykgeworCQlpb3RhYmxlX2luaXQoY25zM3h4eF9wY2llW2ldLmNmZ19iYXNlcywKKwkJCSAgICAgQVJSQVlfU0laRShjbnMzeHh4X3BjaWVbaV0uY2ZnX2Jhc2VzKSk7CisJCWNuczN4eHhfcHdyX2Nsa19lbigweDEgPDwgUE1fQ0xLX0dBVEVfUkVHX09GRlNFVF9QQ0lFKGkpKTsKKwkJY25zM3h4eF9wd3Jfc29mdF9yc3QoMHgxIDw8IFBNX1NPRlRfUlNUX1JFR19PRkZTVF9QQ0lFKGkpKTsKKwkJY25zM3h4eF9wY2llX2NoZWNrX2xpbmsoJmNuczN4eHhfcGNpZVtpXSk7CisJCWNuczN4eHhfcGNpZV9od19pbml0KCZjbnMzeHh4X3BjaWVbaV0pOworCQlwY2lfY29tbW9uX2luaXQoJmNuczN4eHhfcGNpZVtpXS5od19wY2kpOworCX0KKworCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yZXNvdXJjZXMoKTsKKworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKGNuczN4eHhfcGNpZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BtLmMKaW5kZXggNzI1ZTFhNC4uMzhlNDQ3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BtLmMKQEAgLTYsMTggKzYsMjUgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KICNpbmNsdWRlIDxtYWNoL2NuczN4eHguaD4KIAogdm9pZCBjbnMzeHh4X3B3cl9jbGtfZW4odW5zaWduZWQgaW50IGJsb2NrKQogewotCVBNX0NMS19HQVRFX1JFRyB8PSAoYmxvY2sgJiBQTV9DTEtfR0FURV9SRUdfTUFTSyk7CisJdTMyIHJlZyA9IF9fcmF3X3JlYWRsKFBNX0NMS19HQVRFX1JFRyk7CisKKwlyZWcgfD0gKGJsb2NrICYgUE1fQ0xLX0dBVEVfUkVHX01BU0spOworCV9fcmF3X3dyaXRlbChyZWcsIFBNX0NMS19HQVRFX1JFRyk7CiB9CiAKIHZvaWQgY25zM3h4eF9wd3JfcG93ZXJfdXAodW5zaWduZWQgaW50IGJsb2NrKQogewotCVBNX1BMTF9ITV9QRF9DVFJMX1JFRyAmPSB+KGJsb2NrICYgQ05TM1hYWF9QV1JfUExMX0FMTCk7CisJdTMyIHJlZyA9IF9fcmF3X3JlYWRsKFBNX1BMTF9ITV9QRF9DVFJMX1JFRyk7CisKKwlyZWcgJj0gfihibG9jayAmIENOUzNYWFhfUFdSX1BMTF9BTEwpOworCV9fcmF3X3dyaXRlbChyZWcsIFBNX1BMTF9ITV9QRF9DVFJMX1JFRyk7CiAKIAkvKiBXYWl0IGZvciAzMDB1cyBmb3IgdGhlIFBMTCBvdXRwdXQgY2xvY2sgbG9ja2VkLiAqLwogCXVkZWxheSgzMDApOwpAQCAtMjUsMjIgKzMyLDI5IEBACiAKIHZvaWQgY25zM3h4eF9wd3JfcG93ZXJfZG93bih1bnNpZ25lZCBpbnQgYmxvY2spCiB7CisJdTMyIHJlZyA9IF9fcmF3X3JlYWRsKFBNX1BMTF9ITV9QRF9DVFJMX1JFRyk7CisKIAkvKiB3cml0ZSAnMScgdG8gcG93ZXIgZG93biAqLwotCVBNX1BMTF9ITV9QRF9DVFJMX1JFRyB8PSAoYmxvY2sgJiBDTlMzWFhYX1BXUl9QTExfQUxMKTsKKwlyZWcgfD0gKGJsb2NrICYgQ05TM1hYWF9QV1JfUExMX0FMTCk7CisJX19yYXdfd3JpdGVsKHJlZywgUE1fUExMX0hNX1BEX0NUUkxfUkVHKTsKIH07CiAKIHN0YXRpYyB2b2lkIGNuczN4eHhfcHdyX3NvZnRfcnN0X2ZvcmNlKHVuc2lnbmVkIGludCBibG9jaykKIHsKKwl1MzIgcmVnID0gX19yYXdfcmVhZGwoUE1fU09GVF9SU1RfUkVHKTsKKwogCS8qCiAJICogYml0IDAsIDI4LCAyOSA9PiBwcm9ncmFtIGxvdyB0byByZXNldCwKIAkgKiB0aGUgb3RoZXIgZWxzZSBwcm9ncmFtIGxvdyBhbmQgdGhlbiBoaWdoCiAJICovCiAJaWYgKGJsb2NrICYgMHgzMDAwMDAwMSkgewotCQlQTV9TT0ZUX1JTVF9SRUcgJj0gfihibG9jayAmIFBNX1NPRlRfUlNUX1JFR19NQVNLKTsKKwkJcmVnICY9IH4oYmxvY2sgJiBQTV9TT0ZUX1JTVF9SRUdfTUFTSyk7CiAJfSBlbHNlIHsKLQkJUE1fU09GVF9SU1RfUkVHICY9IH4oYmxvY2sgJiBQTV9TT0ZUX1JTVF9SRUdfTUFTSyk7Ci0JCVBNX1NPRlRfUlNUX1JFRyB8PSAoYmxvY2sgJiBQTV9TT0ZUX1JTVF9SRUdfTUFTSyk7CisJCXJlZyAmPSB+KGJsb2NrICYgUE1fU09GVF9SU1RfUkVHX01BU0spOworCQlyZWcgfD0gKGJsb2NrICYgUE1fU09GVF9SU1RfUkVHX01BU0spOwogCX0KKworCV9fcmF3X3dyaXRlbChyZWcsIFBNX1NPRlRfUlNUX1JFRyk7CiB9CiAKIHZvaWQgY25zM3h4eF9wd3Jfc29mdF9yc3QodW5zaWduZWQgaW50IGJsb2NrKQpAQCAtNzMsMTIgKzg3LDEzIEBACiAgKi8KIGludCBjbnMzeHh4X2NwdV9jbG9jayh2b2lkKQogeworCXUzMiByZWcgPSBfX3Jhd19yZWFkbChQTV9DTEtfQ1RSTF9SRUcpOwogCWludCBjcHU7CiAJaW50IGNwdV9zZWw7CiAJaW50IGRpdl9zZWw7CiAKLQljcHVfc2VsID0gKFBNX0NMS19DVFJMX1JFRyA+PiBQTV9DTEtfQ1RSTF9SRUdfT0ZGU0VUX1BMTF9DUFVfU0VMKSAmIDB4ZjsKLQlkaXZfc2VsID0gKFBNX0NMS19DVFJMX1JFRyA+PiBQTV9DTEtfQ1RSTF9SRUdfT0ZGU0VUX0NQVV9DTEtfRElWKSAmIDB4MzsKKwljcHVfc2VsID0gKHJlZyA+PiBQTV9DTEtfQ1RSTF9SRUdfT0ZGU0VUX1BMTF9DUFVfU0VMKSAmIDB4ZjsKKwlkaXZfc2VsID0gKHJlZyA+PiBQTV9DTEtfQ1RSTF9SRUdfT0ZGU0VUX0NQVV9DTEtfRElWKSAmIDB4MzsKIAogCWNwdSA9ICgzMDAgKyAoKGNwdV9zZWwgLyAzKSAqIDEwMCkgKyAoKGNwdV9zZWwgJSAzKSAqIDMzKSkgPj4gZGl2X3NlbDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jCmluZGV4IDJlYzMwOTUuLmIyODBlZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvdHBzNjUwN3guaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUwN3guaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC90cHM2NTA3eC10cy5oPgogCkBAIC00NjksNiArNDcwLDExIEBACiAJfSwKIH07CiAKKy8qIFdlIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgYm90aCBkZWZkY2RjezIsM30gYXJlIHRpZWQgaGlnaCAqLworc3RhdGljIHN0cnVjdCB0cHM2NTA3eF9yZWdfcGxhdGZvcm1fZGF0YSB0cHM2NTA3eF9wbGF0Zm9ybV9kYXRhID0geworCS5kZWZkY2RjX2RlZmF1bHQgPSB0cnVlLAorfTsKKwogc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdHBzNjUwNzBfcmVndWxhdG9yX2RhdGFbXSA9IHsKIAkvKiBkY2RjMSAqLwogCXsKQEAgLTQ5NCw2ICs1MDAsNyBAQAogCQl9LAogCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRSh0cHM2NTA3MF9kY2RjMl9jb25zdW1lcnMpLAogCQkuY29uc3VtZXJfc3VwcGxpZXMgPSB0cHM2NTA3MF9kY2RjMl9jb25zdW1lcnMsCisJCS5kcml2ZXJfZGF0YSA9ICZ0cHM2NTA3eF9wbGF0Zm9ybV9kYXRhLAogCX0sCiAKIAkvKiBkY2RjMyAqLwpAQCAtNTA3LDYgKzUxNCw3IEBACiAJCX0sCiAJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHRwczY1MDcwX2RjZGMzX2NvbnN1bWVycyksCiAJCS5jb25zdW1lcl9zdXBwbGllcyA9IHRwczY1MDcwX2RjZGMzX2NvbnN1bWVycywKKwkJLmRyaXZlcl9kYXRhID0gJnRwczY1MDd4X3BsYXRmb3JtX2RhdGEsCiAJfSwKIAogCS8qIGxkbzEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGE5MWVkZmIuLjIyZWI5N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtNDgsMTkgKzQ4LDE2IEBACiAgKiBiZWxvdyAxMjhNCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotX19hcmNoX2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgbG9uZyAqaG9sZXMpCitfX2FyY2hfYWRqdXN0X3pvbmVzKHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGxvbmcgKmhvbGVzKQogewogCXVuc2lnbmVkIGludCBzeiA9ICgxMjg8PDIwKSA+PiBQQUdFX1NISUZUOwogCi0JaWYgKG5vZGUgIT0gMCkKLQkJc3ogPSAwOwotCiAJc2l6ZVsxXSA9IHNpemVbMF0gLSBzejsKIAlzaXplWzBdID0gc3o7CiB9CiAKLSNkZWZpbmUgYXJjaF9hZGp1c3Rfem9uZXMobm9kZSwgem9uZV9zaXplLCBob2xlcykgXAotICAgICAgICBpZiAoKG1lbWluZm8uYmFua1swXS5zaXplID4+IDIwKSA+IDEyOCkgX19hcmNoX2FkanVzdF96b25lcyhub2RlLCB6b25lX3NpemUsIGhvbGVzKQorI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyh6b25lX3NpemUsIGhvbGVzKSBcCisgICAgICAgIGlmICgobWVtaW5mby5iYW5rWzBdLnNpemUgPj4gMjApID4gMTI4KSBfX2FyY2hfYWRqdXN0X3pvbmVzKHpvbmVfc2l6ZSwgaG9sZXMpCiAKICNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQJKFBIWVNfT0ZGU0VUICsgKDEyODw8MjApIC0gMSkKICNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyAoMTI4PDwyMCkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMKaW5kZXggNWRhMmNmNC4uZjdhMTI1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9jb21tb24uYwpAQCAtNzUyLDYgKzc1Miw2NyBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZG92ZV94b3IxMV9jaGFubmVsKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRElPCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1NjQgc2Rpb19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkb3ZlX3NkaW8wX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gRE9WRV9TRElPMF9QSFlTX0JBU0UsCisJCS5lbmQJPSBET1ZFX1NESU8wX1BIWVNfQkFTRSArIDB4ZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CT0gSVJRX0RPVkVfU0RJTzAsCisJCS5lbmQJPSBJUlFfRE9WRV9TRElPMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRvdmVfc2RpbzAgPSB7CisJLm5hbWUJCT0gInNkaGNpLW12IiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzZGlvX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkucmVzb3VyY2UJPSBkb3ZlX3NkaW8wX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZG92ZV9zZGlvMF9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgZG92ZV9zZGlvMF9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkb3ZlX3NkaW8wKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkb3ZlX3NkaW8xX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gRE9WRV9TRElPMV9QSFlTX0JBU0UsCisJCS5lbmQJPSBET1ZFX1NESU8xX1BIWVNfQkFTRSArIDB4ZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CT0gSVJRX0RPVkVfU0RJTzEsCisJCS5lbmQJPSBJUlFfRE9WRV9TRElPMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRvdmVfc2RpbzEgPSB7CisJLm5hbWUJCT0gInNkaGNpLW12IiwKKwkuaWQJCT0gMSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzZGlvX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkucmVzb3VyY2UJPSBkb3ZlX3NkaW8xX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZG92ZV9zZGlvMV9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgZG92ZV9zZGlvMV9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkb3ZlX3NkaW8xKTsKK30KKwogdm9pZCBfX2luaXQgZG92ZV9pbml0KHZvaWQpCiB7CiAJaW50IHRjbGs7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmgKaW5kZXggYjI5ZTg5My4uYTUxNTE3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9jb21tb24uaApAQCAtMzYsNSArMzYsNyBAQAogdm9pZCBkb3ZlX3NwaTBfaW5pdCh2b2lkKTsKIHZvaWQgZG92ZV9zcGkxX2luaXQodm9pZCk7CiB2b2lkIGRvdmVfaTJjX2luaXQodm9pZCk7Cit2b2lkIGRvdmVfc2RpbzBfaW5pdCh2b2lkKTsKK3ZvaWQgZG92ZV9zZGlvMV9pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZG92ZS9kb3ZlLWRiLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvZG92ZS1kYi1zZXR1cC5jCmluZGV4IGYyOTcxYjcuLmJlZjcwNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZG92ZS9kb3ZlLWRiLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2RvdmUtZGItc2V0dXAuYwpAQCAtODIsNiArODIsOCBAQAogCWRvdmVfZWhjaTBfaW5pdCgpOwogCWRvdmVfZWhjaTFfaW5pdCgpOwogCWRvdmVfc2F0YV9pbml0KCZkb3ZlX2RiX3NhdGFfZGF0YSk7CisJZG92ZV9zZGlvMF9pbml0KCk7CisJZG92ZV9zZGlvMV9pbml0KCk7CiAJZG92ZV9zcGkwX2luaXQoKTsKIAlkb3ZlX3NwaTFfaW5pdCgpOwogCWRvdmVfdWFydDBfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYwppbmRleCAzYTFhODU1Li5mNzQ0ZjY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCkBAIC0yMSwyNiArMjAsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBhZHNzcGhlcmVfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGgJCT0gNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWRzc3BoZXJlX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKLQkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfMzJNIC0gMSwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhZHNzcGhlcmVfZmxhc2ggPSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZhZHNzcGhlcmVfZmxhc2hfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmYWRzc3BoZXJlX2ZsYXNoX3Jlc291cmNlLAotfTsKLQogc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgX19pbml0ZGF0YSBhZHNzcGhlcmVfZXRoX2RhdGEgPSB7CiAJLnBoeV9pZAkJPSAxLAogfTsKQEAgLTQ4LDggKzI3LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhZHNzcGhlcmVfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CiAJZXA5M3h4X2luaXRfZGV2aWNlcygpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYWRzc3BoZXJlX2ZsYXNoKTsKLQorCWVwOTN4eF9yZWdpc3Rlcl9mbGFzaCg0LCBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwgU1pfMzJNKTsKIAllcDkzeHhfcmVnaXN0ZXJfZXRoKCZhZHNzcGhlcmVfZXRoX2RhdGEsIDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYwppbmRleCBlMjliZGVmLi43ZjMwMzk3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAlJTklUX0NLKE5VTEwsCQkJInBsbDEiLAkJJmNsa19wbGwxKSwKIAlJTklUX0NLKE5VTEwsCQkJImZjbGsiLAkJJmNsa19mKSwKIAlJTklUX0NLKE5VTEwsCQkJImhjbGsiLAkJJmNsa19oKSwKLQlJTklUX0NLKE5VTEwsCQkJInBjbGsiLAkJJmNsa19wKSwKKwlJTklUX0NLKE5VTEwsCQkJImFwYl9wY2xrIiwJJmNsa19wKSwKIAlJTklUX0NLKE5VTEwsCQkJInBsbDIiLAkJJmNsa19wbGwyKSwKIAlJTklUX0NLKCJlcDkzeHgtb2hjaSIsCQlOVUxMLAkJJmNsa191c2JfaG9zdCksCiAJSU5JVF9DSygiZXA5M3h4LWtleXBhZCIsCU5VTEwsCQkmY2xrX2tleXBhZCksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKaW5kZXggOTA5MjY3Ny4uOGUzN2EwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KQEAgLTIxNSw4ICsyMTYsOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZzeXNjb25fc3dsb2NrLCBmbGFncyk7CiAKIAl2YWwgPSBfX3Jhd19yZWFkbChFUDkzWFhfU1lTQ09OX0RFVkNGRyk7Ci0JdmFsIHw9IHNldF9iaXRzOwogCXZhbCAmPSB+Y2xlYXJfYml0czsKKwl2YWwgfD0gc2V0X2JpdHM7CiAJX19yYXdfd3JpdGVsKDB4YWEsIEVQOTNYWF9TWVNDT05fU1dMT0NLKTsKIAlfX3Jhd193cml0ZWwodmFsLCBFUDkzWFhfU1lTQ09OX0RFVkNGRyk7CiAKQEAgLTM0OCw2ICszNDksNDMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRVA5M3h4IHBoeXNtYXAnZWQgZmxhc2gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZXA5M3h4X2ZsYXNoX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXA5M3h4X2ZsYXNoX3Jlc291cmNlID0geworCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVwOTN4eF9mbGFzaCA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZlcDkzeHhfZmxhc2hfcmVzb3VyY2UsCit9OworCisvKioKKyAqIGVwOTN4eF9yZWdpc3Rlcl9mbGFzaCgpIC0gUmVnaXN0ZXIgdGhlIGV4dGVybmFsIGZsYXNoIGRldmljZS4KKyAqIEB3aWR0aDoJYmFuayB3aWR0aCBpbiBvY3RldHMKKyAqIEBzdGFydDoJcmVzb3VyY2Ugc3RhcnQgYWRkcmVzcworICogQHNpemU6CXJlc291cmNlIHNpemUKKyAqLwordm9pZCBfX2luaXQgZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKHVuc2lnbmVkIGludCB3aWR0aCwKKwkJCQkgIHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IHNpemUpCit7CisJZXA5M3h4X2ZsYXNoX2RhdGEud2lkdGgJCT0gd2lkdGg7CisKKwllcDkzeHhfZmxhc2hfcmVzb3VyY2Uuc3RhcnQJPSBzdGFydDsKKwllcDkzeHhfZmxhc2hfcmVzb3VyY2UuZW5kCT0gc3RhcnQgKyBzaXplIC0gMTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXA5M3h4X2ZsYXNoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRVA5M3h4IGV0aGVybmV0IHBlcmlwaGVyYWwgaGFuZGxpbmcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgZXA5M3h4X2V0aF9kYXRhOwpAQCAtNjIwLDYgKzY1OCwxMSBAQAogCS5yZXNvdXJjZQkJPSBlcDkzeHhfZmJfcmVzb3VyY2UsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlcDkzeHhfYmxfZGV2aWNlID0geworCS5uYW1lCQk9ICJlcDkzeHgtYmwiLAorCS5pZAkJPSAtMSwKK307CisKIC8qKgogICogZXA5M3h4X3JlZ2lzdGVyX2ZiIC0gUmVnaXN0ZXIgdGhlIGZyYW1lYnVmZmVyIHBsYXRmb3JtIGRldmljZS4KICAqIEBkYXRhOglwbGF0Zm9ybSBzcGVjaWZpYyBmcmFtZWJ1ZmZlciBjb25maWd1cmF0aW9uIChfX2luaXRkYXRhKQpAQCAtNjI4LDYgKzY3MSw3IEBACiB7CiAJZXA5M3h4ZmJfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXA5M3h4X2ZiX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfYmxfZGV2aWNlKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5M3h4LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5M3h4LmMKaW5kZXggMzg4NDE4Mi4uYzJjZTkwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzeHguYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgpAQCAtMzgsMzkgKzM3LDEzIEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCiAKLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGVkYjkzeHhfZmxhc2hfZGF0YTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI5M3h4X2ZsYXNoX3Jlc291cmNlID0gewotCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVkYjkzeHhfZmxhc2ggPSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZlZGI5M3h4X2ZsYXNoX2RhdGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJmVkYjkzeHhfZmxhc2hfcmVzb3VyY2UsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgX19lZGI5M3h4X3JlZ2lzdGVyX2ZsYXNoKHVuc2lnbmVkIGludCB3aWR0aCwKLQkJCXJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IHNpemUpCi17Ci0JZWRiOTN4eF9mbGFzaF9kYXRhLndpZHRoCT0gd2lkdGg7Ci0JZWRiOTN4eF9mbGFzaF9yZXNvdXJjZS5zdGFydAk9IHN0YXJ0OwotCWVkYjkzeHhfZmxhc2hfcmVzb3VyY2UuZW5kCT0gc3RhcnQgKyBzaXplIC0gMTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRiOTN4eF9mbGFzaCk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5M3h4X3JlZ2lzdGVyX2ZsYXNoKHZvaWQpCiB7CiAJaWYgKG1hY2hpbmVfaXNfZWRiOTMwNygpIHx8IG1hY2hpbmVfaXNfZWRiOTMxMigpIHx8CiAJICAgIG1hY2hpbmVfaXNfZWRiOTMxNSgpKSB7Ci0JCV9fZWRiOTN4eF9yZWdpc3Rlcl9mbGFzaCg0LCBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwgU1pfMzJNKTsKKwkJZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKDQsIEVQOTNYWF9DUzZfUEhZU19CQVNFLCBTWl8zMk0pOwogCX0gZWxzZSB7Ci0JCV9fZWRiOTN4eF9yZWdpc3Rlcl9mbGFzaCgyLCBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwgU1pfMTZNKTsKKwkJZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKDIsIEVQOTNYWF9DUzZfUEhZU19CQVNFLCBTWl8xNk0pOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwppbmRleCBhODA5NjE4Li5kOTcxNjhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCkBAIC0yMSwyNiArMjAsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBnZXNiYzkzMTJfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGgJCT0gNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ2VzYmM5MzEyX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKLQkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfOE0gLSAxLAotCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGdlc2JjOTMxMl9mbGFzaCA9IHsKLQkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCQk9IDAsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmdlc2JjOTMxMl9mbGFzaF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZnZXNiYzkzMTJfZmxhc2hfcmVzb3VyY2UsCi19OwotCiBzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSBfX2luaXRkYXRhIGdlc2JjOTMxMl9ldGhfZGF0YSA9IHsKIAkucGh5X2lkCQk9IDEsCiB9OwpAQCAtNDgsOCArMjcsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGdlc2JjOTMxMl9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZnZXNiYzkzMTJfZmxhc2gpOwotCisJZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKDQsIEVQOTNYWF9DUzZfUEhZU19CQVNFLCBTWl84TSk7CiAJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmZ2VzYmM5MzEyX2V0aF9kYXRhLCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaAppbmRleCA5YTQ0MTNkLi5hNmMwOTE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaApAQCAtNDMsNiArNDMsOSBAQAogCiB1bnNpZ25lZCBpbnQgZXA5M3h4X2NoaXBfcmV2aXNpb24odm9pZCk7CiAKK3ZvaWQgZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKHVuc2lnbmVkIGludCB3aWR0aCwKKwkJCSAgIHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IHNpemUpOworCiB2b2lkIGVwOTN4eF9yZWdpc3Rlcl9ldGgoc3RydWN0IGVwOTN4eF9ldGhfZGF0YSAqZGF0YSwgaW50IGNvcHlfYWRkcik7CiB2b2lkIGVwOTN4eF9yZWdpc3Rlcl9pMmMoc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgKmRhdGEsCiAJCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICpkZXZpY2VzLCBpbnQgbnVtKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMKaW5kZXggMWNjOTExYi4uMmJhNzc2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMzEsMzEgKzMwLDYgQEAKICAqIE1pY3JvOS1MaXRlIHVzZXMgYSBzZXBhcmF0ZSBNVEQgbWFwIGRyaXZlciBmb3IgZmxhc2ggc3VwcG9ydAogICogTWljcm85LVNsaW0gaGFzIHVwIHRvIDY0TUIgb2YgZWl0aGVyIDMyLWJpdCBvciAxNi1iaXQgZmxhc2ggb24gQ1MxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG1pY3JvOV9mbGFzaF9kYXRhOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG1pY3JvOV9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gRVA5M1hYX0NTMV9QSFlTX0JBU0UsCi0JLmVuZAkJPSBFUDkzWFhfQ1MxX1BIWVNfQkFTRSArIFNaXzY0TSAtIDEsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWljcm85X2ZsYXNoID0gewotCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJCT0gMCwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbWljcm85X2ZsYXNoX2RhdGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJm1pY3JvOV9mbGFzaF9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBfX21pY3JvOV9yZWdpc3Rlcl9mbGFzaCh1bnNpZ25lZCBpbnQgd2lkdGgpCi17Ci0JbWljcm85X2ZsYXNoX2RhdGEud2lkdGggPSB3aWR0aDsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbWljcm85X2ZsYXNoKTsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgbWljcm85X2RldGVjdF9ib290d2lkdGgodm9pZCkKIHsKIAl1MzIgdjsKQEAgLTcwLDEwICs0NCwxNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbWljcm85X3JlZ2lzdGVyX2ZsYXNoKHZvaWQpCiB7CisJdW5zaWduZWQgaW50IHdpZHRoOworCiAJaWYgKG1hY2hpbmVfaXNfbWljcm85KCkpCi0JCV9fbWljcm85X3JlZ2lzdGVyX2ZsYXNoKDQpOworCQl3aWR0aCA9IDQ7CiAJZWxzZSBpZiAobWFjaGluZV9pc19taWNybzltKCkgfHwgbWFjaGluZV9pc19taWNybzlzKCkpCi0JCV9fbWljcm85X3JlZ2lzdGVyX2ZsYXNoKG1pY3JvOV9kZXRlY3RfYm9vdHdpZHRoKCkpOworCQl3aWR0aCA9IG1pY3JvOV9kZXRlY3RfYm9vdHdpZHRoKCk7CisJZWxzZQorCQl3aWR0aCA9IDA7CisKKwlpZiAod2lkdGgpCisJCWVwOTN4eF9yZWdpc3Rlcl9mbGFzaCh3aWR0aCwgRVA5M1hYX0NTMV9QSFlTX0JBU0UsIFNaXzY0TSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc2ltb25lLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9zaW1vbmUuYwppbmRleCAzODhhZWM5Li41ZGRlZDU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9zaW1vbmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9zaW1vbmUuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgpAQCAtMjksMjYgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgc2ltb25lX2ZsYXNoX2RhdGEgPSB7Ci0JLndpZHRoCQk9IDIsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNpbW9uZV9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gRVA5M1hYX0NTNl9QSFlTX0JBU0UsCi0JLmVuZAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSArIFNaXzhNIC0gMSwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaW1vbmVfZmxhc2ggPSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmc2ltb25lX2ZsYXNoX3Jlc291cmNlLAotCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNpbW9uZV9mbGFzaF9kYXRhLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSBfX2luaXRkYXRhIHNpbW9uZV9ldGhfZGF0YSA9IHsKIAkucGh5X2lkCQk9IDEsCiB9OwpAQCAtNzcsOCArNTYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNpbW9uZV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7Ci0KLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNpbW9uZV9mbGFzaCk7CisJZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKDIsIEVQOTNYWF9DUzZfUEhZU19CQVNFLCBTWl84TSk7CiAJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmc2ltb25lX2V0aF9kYXRhLCAxKTsKIAllcDkzeHhfcmVnaXN0ZXJfZmIoJnNpbW9uZV9mYl9pbmZvKTsKIAllcDkzeHhfcmVnaXN0ZXJfaTJjKCZzaW1vbmVfaTJjX2dwaW9fZGF0YSwgc2ltb25lX2kyY19ib2FyZF9pbmZvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYwppbmRleCBhZTczMTllLi45M2FlYWI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbTQ4dDg2Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAKQEAgLTE3MywzMSArMTcyLDEzIEBACiB9OwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOT1IgZmxhc2ggKFRTLTcyMDAgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgdHM3Mnh4X25vcl9kYXRhID0gewotCS53aWR0aAkJPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0czcyeHhfbm9yX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKLQkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfMTZNIC0gMSwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0czcyeHhfbm9yX2ZsYXNoID0gewotCS5uYW1lCQkJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCQkJPSAwLAotCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZ0czcyeHhfbm9yX2RhdGEsCi0JLnJlc291cmNlCQk9ICZ0czcyeHhfbm9yX3Jlc291cmNlLAotCS5udW1fcmVzb3VyY2VzCQk9IDEsCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgdHM3Mnh4X3JlZ2lzdGVyX2ZsYXNoKHZvaWQpCiB7CisJLyoKKwkgKiBUUzcyMDAgaGFzIE5PUiBmbGFzaCBhbGwgb3RoZXIgVFM3Mnh4IGJvYXJkIGhhdmUgTkFORCBmbGFzaC4KKwkgKi8KIAlpZiAoYm9hcmRfaXNfdHM3MjAwKCkpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ0czcyeHhfbm9yX2ZsYXNoKTsKKwkJZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKDIsIEVQOTNYWF9DUzZfUEhZU19CQVNFLCBTWl8xNk0pOwogCX0gZWxzZSB7CiAJCXJlc291cmNlX3NpemVfdCBzdGFydDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjMDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKQEAgLTAsMCArMSwxOTMgQEAKK2NvbmZpZyBJTVhfSEFWRV9ETUFfVjEKKwlib29sCisKK2lmIEFSQ0hfTVgxCisKK2NvbmZpZyBTT0NfSU1YMQorCXNlbGVjdCBDUFVfQVJNOTIwVAorCXNlbGVjdCBJTVhfSEFWRV9ETUFfVjEKKwlzZWxlY3QgSU1YX0hBVkVfSU9NVVhfVjEKKwlib29sCisKK2NvbW1lbnQgIk1YMSBwbGF0Zm9ybXM6IgorY29uZmlnIE1BQ0hfTVhMQURTCisJYm9vbAorCitjb25maWcgQVJDSF9NWDFBRFMKKwlib29sICJNWDFBRFMgcGxhdGZvcm0iCisJc2VsZWN0IE1BQ0hfTVhMQURTCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgTW90b3JvbGEgTVgxQURTL01YTEFEUyBib2FyZHMKKworY29uZmlnIE1BQ0hfU0NCOTMyOAorCWJvb2wgIlN5bmVydHJvbml4eCBzY2I5MzI4IgorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBhIFN5bmVydHJvbml4eCBzY2I5MzI4IGJvYXJkCisKK2VuZGlmCisKK2lmIEFSQ0hfTVgyCisKK2NvbmZpZyBTT0NfSU1YMjEKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKKwlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YxCisJc2VsZWN0IElNWF9IQVZFX0RNQV9WMQorCXNlbGVjdCBJTVhfSEFWRV9JT01VWF9WMQorCWJvb2wKKworY29uZmlnIFNPQ19JTVgyNworCXNlbGVjdCBDUFVfQVJNOTI2VAorCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjEKKwlzZWxlY3QgSU1YX0hBVkVfRE1BX1YxCisJc2VsZWN0IElNWF9IQVZFX0lPTVVYX1YxCisJYm9vbAorCitjaG9pY2UKKwlwcm9tcHQgIkNQVXM6IgorCWRlZmF1bHQgTUFDSF9NWDIxCisKK2NvbmZpZyBNQUNIX01YMjEKKwlib29sICJpLk1YMjEgc3VwcG9ydCIKKwlzZWxlY3QgU09DX0lNWDIxCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEZyZWVzY2FsZSdzIE1YMiBiYXNlZCBpLk1YMjEgcHJvY2Vzc29yLgorCitjb25maWcgTUFDSF9NWDI3CisJYm9vbCAiaS5NWDI3IHN1cHBvcnQiCisJc2VsZWN0IFNPQ19JTVgyNworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUncyBNWDIgYmFzZWQgaS5NWDI3IHByb2Nlc3Nvci4KKworZW5kY2hvaWNlCisKK2VuZGlmCisKK2lmIE1BQ0hfTVgyMQorCitjb21tZW50ICJNWDIxIHBsYXRmb3JtczoiCisKK2NvbmZpZyBNQUNIX01YMjFBRFMKKwlib29sICJNWDIxQURTIHBsYXRmb3JtIgorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgyMUFEUyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYworCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgorCitlbmRpZgorCitpZiBNQUNIX01YMjcKKworY29tbWVudCAiTVgyNyBwbGF0Zm9ybXM6IgorCitjb25maWcgTUFDSF9NWDI3QURTCisJYm9vbCAiTVgyN0FEUyBwbGF0Zm9ybSIKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0kyQworCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgyN0FEUyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYworCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgorCitjb25maWcgTUFDSF9QQ00wMzgKKwlib29sICJQaHl0ZWMgcGh5Q09SRS1pLk1YMjcgQ1BVIG1vZHVsZSAocGNtMDM4KSIKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0kyQworCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCisJc2VsZWN0IE1YQ19VTFBJIGlmIFVTQl9VTFBJCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBwaHlDT1JFLWkuTVgyNyAoYWthIHBjbTAzOCkgcGxhdGZvcm0uIFRoaXMKKwkgIGluY2x1ZGVzIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBpdHMgcGVyaXBoZXJhbHMuCisKK2Nob2ljZQorCXByb21wdCAiQmFzZWJvYXJkIgorCWRlcGVuZHMgb24gTUFDSF9QQ00wMzgKKwlkZWZhdWx0IE1BQ0hfUENNOTcwX0JBU0VCT0FSRAorCitjb25maWcgTUFDSF9QQ005NzBfQkFTRUJPQVJECisJcHJvbXB0ICJQSFlURUMgUENNOTcwIGRldmVsb3BtZW50IGJvYXJkIgorCWJvb2wKKwloZWxwCisJICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBQaHl0ZWMncworCSAgUENNOTcwIGV2YWx1YXRpb24gYm9hcmQuCisKK2VuZGNob2ljZQorCitjb25maWcgTUFDSF9DUFVJTVgyNworCWJvb2wgIkV1a3JlYSBDUFVJTVgyNyBtb2R1bGUiCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIEV1a3JlYSBDUFVJTVgyNyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcworCSAgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIGl0cyBwZXJpcGhlcmFscy4KKworY29uZmlnIE1BQ0hfRVVLUkVBX0NQVUlNWDI3X1VTRVNESEMyCisJYm9vbCAiQ1BVSU1YMjcgaW50ZWdyYXRlcyBTREhDMiBtb2R1bGUiCisJZGVwZW5kcyBvbiBNQUNIX0NQVUlNWDI3CisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBpbnRlcm5hbCBTREhDMiB1c2VkIG9uIENQVUlNWDI3CisJICBmb3Igd2lmaSBvciBlTU1DLgorCitjb25maWcgTUFDSF9FVUtSRUFfQ1BVSU1YMjdfVVNFVUFSVDQKKwlib29sICJDUFVJTVgyNyBpbnRlZ3JhdGVzIFVBUlQ0IG1vZHVsZSIKKwlkZXBlbmRzIG9uIE1BQ0hfQ1BVSU1YMjcKKwloZWxwCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGludGVybmFsIFVBUlQ0IHVzZWQgb24gQ1BVSU1YMjcKKwkgIGZvciBibHVldG9vdGguCisKK2Nob2ljZQorCXByb21wdCAiQmFzZWJvYXJkIgorCWRlcGVuZHMgb24gTUFDSF9DUFVJTVgyNworCWRlZmF1bHQgTUFDSF9FVUtSRUFfTUJJTVgyN19CQVNFQk9BUkQKKworY29uZmlnIE1BQ0hfRVVLUkVBX01CSU1YMjdfQkFTRUJPQVJECisJcHJvbXB0ICJFdWtyZWEgTUJJTVgyNyBkZXZlbG9wbWVudCBib2FyZCIKKwlib29sCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKKwloZWxwCisJICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBFdWtyZWEncworCSAgTUJJTVgyNyBldmFsdWF0aW9uIGJvYXJkLgorCitlbmRjaG9pY2UKKworY29uZmlnIE1BQ0hfTVgyN18zRFMKKwlib29sICJNWDI3UERLIHBsYXRmb3JtIgorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgyN1BESyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYworCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgorCitjb25maWcgTUFDSF9JTVgyN0xJVEUKKwlib29sICJMb2dpY1BEIE1YMjcgTElURUtJVCBwbGF0Zm9ybSIKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMjcgTElURUtJVCBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYworCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgorCitjb25maWcgTUFDSF9QQ0ExMDAKKwlib29sICJQaHl0ZWMgcGh5Q0FSRC1zIChwY2ExMDApIgorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19OQU5ECisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKKwlzZWxlY3QgTVhDX1VMUEkgaWYgVVNCX1VMUEkKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHBoeUNBUkQtcyAoYWthIHBjYTEwMCkgcGxhdGZvcm0uIFRoaXMKKwkgIGluY2x1ZGVzIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBpdHMgcGVyaXBoZXJhbHMuCisKK2NvbmZpZyBNQUNIX01YVF9URDYwCisJYm9vbCAiTWF4dHJhY2sgaS1NWFQgVEQ2MCIKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0kyQworCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgaS1NWFQgKGFrYSB0ZDYwKSBwbGF0Zm9ybS4gVGhpcworCSAgaW5jbHVkZXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIGl0cyBwZXJpcGhlcmFscy4KKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhOWZkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgT2JqZWN0IGZpbGUgbGlzdHMuCisKK29iai15CTo9ICBkZXZpY2VzLm8KKworb2JqLSQoQ09ORklHX0lNWF9IQVZFX0RNQV9WMSkgKz0gZG1hLXYxLm8KKworb2JqLSQoQ09ORklHX0FSQ0hfTVgxKSArPSBjbG9jay1pbXgxLm8gbW0taW14MS5vCitvYmotJChDT05GSUdfTUFDSF9NWDIxKSArPSBjbG9jay1pbXgyMS5vIG1tLWlteDIxLm8KKworb2JqLSQoQ09ORklHX01BQ0hfTVgyNykgKz0gY3B1LWlteDI3Lm8gcG0taW14Mjcubworb2JqLSQoQ09ORklHX01BQ0hfTVgyNykgKz0gY2xvY2staW14MjcubyBtbS1pbXgyNy5vCisKKyMgU3VwcG9ydCBmb3IgQ01PUyBzZW5zb3IgaW50ZXJmYWNlCitvYmotJChDT05GSUdfTVgxX1ZJREVPKQkrPSBteDEtY2FtZXJhLWZpcS5vIG14MS1jYW1lcmEtZmlxLWtzeW0ubworCitvYmotJChDT05GSUdfQVJDSF9NWDFBRFMpICs9IG1hY2gtbXgxYWRzLm8KK29iai0kKENPTkZJR19NQUNIX1NDQjkzMjgpICs9IG1hY2gtc2NiOTMyOC5vCisKK29iai0kKENPTkZJR19NQUNIX01YMjFBRFMpICs9IG1hY2gtbXgyMWFkcy5vCisKK29iai0kKENPTkZJR19NQUNIX01YMjdBRFMpICs9IG1hY2gtbXgyN2Fkcy5vCitvYmotJChDT05GSUdfTUFDSF9QQ00wMzgpICs9IG1hY2gtcGNtMDM4Lm8KK29iai0kKENPTkZJR19NQUNIX1BDTTk3MF9CQVNFQk9BUkQpICs9IHBjbTk3MC1iYXNlYm9hcmQubworb2JqLSQoQ09ORklHX01BQ0hfTVgyN18zRFMpICs9IG1hY2gtbXgyN18zZHMubworb2JqLSQoQ09ORklHX01BQ0hfSU1YMjdMSVRFKSArPSBtYWNoLWlteDI3bGl0ZS5vCitvYmotJChDT05GSUdfTUFDSF9DUFVJTVgyNykgKz0gbWFjaC1jcHVpbXgyNy5vCitvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVgyN19CQVNFQk9BUkQpICs9IGV1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5vCitvYmotJChDT05GSUdfTUFDSF9QQ0ExMDApICs9IG1hY2gtcGNhMTAwLm8KK29iai0kKENPTkZJR19NQUNIX01YVF9URDYwKSArPSBtYWNoLW14dF90ZDYwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODhhODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsMTEgQEAKK3pyZWxhZGRyLSQoQ09ORklHX0FSQ0hfTVgxKQk6PSAweDA4MDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19BUkNIX01YMSkJOj0gMHgwODAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfQVJDSF9NWDEpCTo9IDB4MDg4MDAwMDAKKworenJlbGFkZHItJChDT05GSUdfTUFDSF9NWDIxKQk6PSAweEMwMDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19NQUNIX01YMjEpCTo9IDB4QzAwMDAxMDAKK2luaXRyZF9waHlzLSQoQ09ORklHX01BQ0hfTVgyMSkJOj0gMHhDMDgwMDAwMAorCit6cmVsYWRkci0kKENPTkZJR19NQUNIX01YMjcpCTo9IDB4QTAwMDgwMDAKK3BhcmFtc19waHlzLSQoQ09ORklHX01BQ0hfTVgyNykJOj0gMHhBMDAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfTUFDSF9NWDI3KQk6PSAweEEwODAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MDk2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDEuYwpAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisKKyNkZWZpbmUgSU9fQUREUl9DQ00ob2ZmKQkoTVgxX0lPX0FERFJFU1MoTVgxX0NDTV9CQVNFX0FERFIgKyAob2ZmKSkpCisKKy8qIENDTSByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQ0NNX0NTQ1IJSU9fQUREUl9DQ00oMHgwKQorI2RlZmluZSBDQ01fTVBDVEwwCUlPX0FERFJfQ0NNKDB4NCkKKyNkZWZpbmUgQ0NNX1NQQ1RMMAlJT19BRERSX0NDTSgweGMpCisjZGVmaW5lIENDTV9QQ0RSCUlPX0FERFJfQ0NNKDB4MjApCisKKyNkZWZpbmUgQ0NNX0NTQ1JfQ0xLT19PRkZTRVQJMjkKKyNkZWZpbmUgQ0NNX0NTQ1JfQ0xLT19NQVNLCSgweDcgPDwgMjkpCisjZGVmaW5lIENDTV9DU0NSX1VTQl9PRkZTRVQJMjYKKyNkZWZpbmUgQ0NNX0NTQ1JfVVNCX01BU0sJKDB4NyA8PCAyNikKKyNkZWZpbmUgQ0NNX0NTQ1JfT1NDX0VOX1NISUZUCTE3CisjZGVmaW5lIENDTV9DU0NSX1NZU1RFTV9TRUwJKDEgPDwgMTYpCisjZGVmaW5lIENDTV9DU0NSX0JDTEtfT0ZGU0VUCTEwCisjZGVmaW5lIENDTV9DU0NSX0JDTEtfTUFTSwkoMHhmIDw8IDEwKQorI2RlZmluZSBDQ01fQ1NDUl9QUkVTQwkJKDEgPDwgMTUpCisKKyNkZWZpbmUgQ0NNX1BDRFJfUENMSzNfT0ZGU0VUCTE2CisjZGVmaW5lIENDTV9QQ0RSX1BDTEszX01BU0sJKDB4N2YgPDwgMTYpCisjZGVmaW5lIENDTV9QQ0RSX1BDTEsyX09GRlNFVAk0CisjZGVmaW5lIENDTV9QQ0RSX1BDTEsyX01BU0sJKDB4ZiA8PCA0KQorI2RlZmluZSBDQ01fUENEUl9QQ0xLMV9PRkZTRVQJMAorI2RlZmluZSBDQ01fUENEUl9QQ0xLMV9NQVNLCTB4ZgorCisjZGVmaW5lIElPX0FERFJfU0NNKG9mZikJKE1YMV9JT19BRERSRVNTKE1YMV9TQ01fQkFTRV9BRERSICsgKG9mZikpKQorCisvKiBTQ00gcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIFNDTV9HQ0NSCUlPX0FERFJfU0NNKDB4YykKKworI2RlZmluZSBTQ01fR0NDUl9ETUFfQ0xLX0VOX09GRlNFVAkzCisjZGVmaW5lIFNDTV9HQ0NSX0NTSV9DTEtfRU5fT0ZGU0VUCTIKKyNkZWZpbmUgU0NNX0dDQ1JfTU1BX0NMS19FTl9PRkZTRVQJMQorI2RlZmluZSBTQ01fR0NDUl9VU0JEX0NMS19FTl9PRkZTRVQJMAorCitzdGF0aWMgaW50IF9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwlyZWcgfD0gMSA8PCBjbGstPmVuYWJsZV9zaGlmdDsKKwlfX3Jhd193cml0ZWwocmVnLCBjbGstPmVuYWJsZV9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJcmVnICY9IH4oMSA8PCBjbGstPmVuYWJsZV9zaGlmdCk7CisJX19yYXdfd3JpdGVsKHJlZywgY2xrLT5lbmFibGVfcmVnKTsKK30KKworc3RhdGljIGludCBfY2xrX2Nhbl91c2VfcGFyZW50KGNvbnN0IHN0cnVjdCBjbGsgKmNsa19hcnJbXSwgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgICAgc3RydWN0IGNsayAqcGFyZW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJaWYgKHBhcmVudCA9PSBjbGtfYXJyW2ldKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK19jbGtfc2ltcGxlX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUsIHVuc2lnbmVkIGludCBsaW1pdCkKK3sKKwlpbnQgZGl2OworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisJaWYgKHBhcmVudF9yYXRlICUgcmF0ZSkKKwkJZGl2Kys7CisKKwlpZiAoZGl2ID4gbGltaXQpCisJCWRpdiA9IGxpbWl0OworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gZGl2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfY2xrX3BhcmVudF9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBjbGstPnBhcmVudC0+cm91bmRfcmF0ZShjbGstPnBhcmVudCwgcmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX2Nsa19wYXJlbnRfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIGNsay0+cGFyZW50LT5zZXRfcmF0ZShjbGstPnBhcmVudCwgcmF0ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazE2bV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIDE2MDAwMDAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGsxNm0gPSB7CisJLmdldF9yYXRlID0gY2xrMTZtX2dldF9yYXRlLAorCS5lbmFibGUgPSBfY2xrX2VuYWJsZSwKKwkuZW5hYmxlX3JlZyA9IENDTV9DU0NSLAorCS5lbmFibGVfc2hpZnQgPSBDQ01fQ1NDUl9PU0NfRU5fU0hJRlQsCisJLmRpc2FibGUgPSBfY2xrX2Rpc2FibGUsCit9OworCisvKiBpbiBIeiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrMzJfcmF0ZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrMzJfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGszMl9yYXRlOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGszMiA9IHsKKwkuZ2V0X3JhdGUgPSBjbGszMl9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazMyX3ByZW11bHRfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogNTEyOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGszMl9wcmVtdWx0ID0geworCS5wYXJlbnQgPSAmY2xrMzIsCisJLmdldF9yYXRlID0gY2xrMzJfcHJlbXVsdF9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrICpwcmVtX2Nsa19jbG9ja3NbXSA9IHsKKwkmY2xrMzJfcHJlbXVsdCwKKwkmY2xrMTZtLAorfTsKKworc3RhdGljIGludCBwcmVtX2Nsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCWludCBpOworCXVuc2lnbmVkIGludCByZWcgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7CisKKwlpID0gX2Nsa19jYW5fdXNlX3BhcmVudChwcmVtX2Nsa19jbG9ja3MsIEFSUkFZX1NJWkUocHJlbV9jbGtfY2xvY2tzKSwKKwkJCQlwYXJlbnQpOworCisJc3dpdGNoIChpKSB7CisJY2FzZSAwOgorCQlyZWcgJj0gfkNDTV9DU0NSX1NZU1RFTV9TRUw7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVnIHw9IENDTV9DU0NSX1NZU1RFTV9TRUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBpOworCX0KKworCV9fcmF3X3dyaXRlbChyZWcsIENDTV9DU0NSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBwcmVtX2NsayA9IHsKKwkuc2V0X3BhcmVudCA9IHByZW1fY2xrX3NldF9wYXJlbnQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzeXN0ZW1fY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gbXhjX2RlY29kZV9wbGwoX19yYXdfcmVhZGwoQ0NNX1NQQ1RMMCksCisJCQkgICAgICBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgc3lzdGVtX2NsayA9IHsKKwkucGFyZW50ID0gJnByZW1fY2xrLAorCS5nZXRfcmF0ZSA9IHN5c3RlbV9jbGtfZ2V0X3JhdGUsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtY3VfY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gbXhjX2RlY29kZV9wbGwoX19yYXdfcmVhZGwoQ0NNX01QQ1RMMCksCisJCQkgICAgICBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgbWN1X2NsayA9IHsKKwkucGFyZW50ID0gJmNsazMyX3ByZW11bHQsCisJLmdldF9yYXRlID0gbWN1X2Nsa19nZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgZmNsayA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlpZiAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpICYgQ0NNX0NTQ1JfUFJFU0MpCisJCWZjbGsgLz0gMjsKKworCXJldHVybiBmY2xrOworfQorCitzdGF0aWMgc3RydWN0IGNsayBmY2xrID0geworCS5wYXJlbnQgPSAmbWN1X2NsaywKKwkuZ2V0X3JhdGUgPSBmY2xrX2dldF9yYXRlLAorfTsKKworLyoKKyAqICBnZXQgaGNsayAoIFNEUkFNLCBDU0ksIE1lbW9yeSBTdGljaywgSTJDLCBETUEgKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9DU0NSKSAmCisJCQlDQ01fQ1NDUl9CQ0xLX01BU0spID4+IENDTV9DU0NSX0JDTEtfT0ZGU0VUKSArIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIF9jbGtfc2ltcGxlX3JvdW5kX3JhdGUoY2xrLCByYXRlLCAxNik7Cit9CisKK3N0YXRpYyBpbnQgaGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKworCWlmIChkaXYgPiAxNiB8fCBkaXYgPCAxIHx8ICgocGFyZW50X3JhdGUgLyBkaXYpICE9IHJhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpdi0tOworCisJcmVnID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOworCXJlZyAmPSB+Q0NNX0NTQ1JfQkNMS19NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX0NTQ1JfQkNMS19PRkZTRVQ7CisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGhjbGsgPSB7CisJLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAorCS5nZXRfcmF0ZSA9IGhjbGtfZ2V0X3JhdGUsCisJLnJvdW5kX3JhdGUgPSBoY2xrX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gaGNsa19zZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazQ4bV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAoKChfX3Jhd19yZWFkbChDQ01fQ1NDUikgJgorCQkJQ0NNX0NTQ1JfVVNCX01BU0spID4+IENDTV9DU0NSX1VTQl9PRkZTRVQpICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazQ4bV9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBfY2xrX3NpbXBsZV9yb3VuZF9yYXRlKGNsaywgcmF0ZSwgOCk7Cit9CisKK3N0YXRpYyBpbnQgY2xrNDhtX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCisJaWYgKGRpdiA+IDggfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYtLTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKKwlyZWcgJj0gfkNDTV9DU0NSX1VTQl9NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX0NTQ1JfVVNCX09GRlNFVDsKKwlfX3Jhd193cml0ZWwocmVnLCBDQ01fQ1NDUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrNDhtID0geworCS5wYXJlbnQgPSAmc3lzdGVtX2NsaywKKwkuZ2V0X3JhdGUgPSBjbGs0OG1fZ2V0X3JhdGUsCisJLnJvdW5kX3JhdGUgPSBjbGs0OG1fcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBjbGs0OG1fc2V0X3JhdGUsCit9OworCisvKgorICogIGdldCBwZXJpcGhlcmFsIGNsb2NrIDEgKCBVQVJUWzEyXSwgVGltZXJbMTJdLCBQV00gKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGsxX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9QQ0RSKSAmCisJCQlDQ01fUENEUl9QQ0xLMV9NQVNLKSA+PiBDQ01fUENEUl9QQ0xLMV9PRkZTRVQpICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazFfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShjbGssIHJhdGUsIDE2KTsKK30KKworc3RhdGljIGludCBwZXJjbGsxX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCisJaWYgKGRpdiA+IDE2IHx8IGRpdiA8IDEgfHwgKChwYXJlbnRfcmF0ZSAvIGRpdikgIT0gcmF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2LS07CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fUENEUik7CisJcmVnICY9IH5DQ01fUENEUl9QQ0xLMV9NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX1BDRFJfUENMSzFfT0ZGU0VUOworCV9fcmF3X3dyaXRlbChyZWcsIENDTV9QQ0RSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIGdldCBwZXJpcGhlcmFsIGNsb2NrIDIgKCBMQ0QsIFNELCBTUElbMTJdICkKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyY2xrMl9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAoKChfX3Jhd19yZWFkbChDQ01fUENEUikgJgorCQkJQ0NNX1BDRFJfUENMSzJfTUFTSykgPj4gQ0NNX1BDRFJfUENMSzJfT0ZGU0VUKSArIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGsyX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIF9jbGtfc2ltcGxlX3JvdW5kX3JhdGUoY2xrLCByYXRlLCAxNik7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2xrMl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKworCWlmIChkaXYgPiAxNiB8fCBkaXYgPCAxIHx8ICgocGFyZW50X3JhdGUgLyBkaXYpICE9IHJhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpdi0tOworCisJcmVnID0gX19yYXdfcmVhZGwoQ0NNX1BDRFIpOworCXJlZyAmPSB+Q0NNX1BDRFJfUENMSzJfTUFTSzsKKwlyZWcgfD0gZGl2IDw8IENDTV9QQ0RSX1BDTEsyX09GRlNFVDsKKwlfX3Jhd193cml0ZWwocmVnLCBDQ01fUENEUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBnZXQgcGVyaXBoZXJhbCBjbG9jayAzICggU1NJICkKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyY2xrM19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAoKChfX3Jhd19yZWFkbChDQ01fUENEUikgJgorCQkJQ0NNX1BDRFJfUENMSzNfTUFTSykgPj4gQ0NNX1BDRFJfUENMSzNfT0ZGU0VUKSArIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGszX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIF9jbGtfc2ltcGxlX3JvdW5kX3JhdGUoY2xrLCByYXRlLCAxMjgpOworfQorCitzdGF0aWMgaW50IHBlcmNsazNfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisKKwlpZiAoZGl2ID4gMTI4IHx8IGRpdiA8IDEgfHwgKChwYXJlbnRfcmF0ZSAvIGRpdikgIT0gcmF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2LS07CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fUENEUik7CisJcmVnICY9IH5DQ01fUENEUl9QQ0xLM19NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX1BDRFJfUENMSzNfT0ZGU0VUOworCV9fcmF3X3dyaXRlbChyZWcsIENDTV9QQ0RSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBwZXJjbGtbXSA9IHsKKwl7CisJCS5pZCA9IDAsCisJCS5wYXJlbnQgPSAmc3lzdGVtX2NsaywKKwkJLmdldF9yYXRlID0gcGVyY2xrMV9nZXRfcmF0ZSwKKwkJLnJvdW5kX3JhdGUgPSBwZXJjbGsxX3JvdW5kX3JhdGUsCisJCS5zZXRfcmF0ZSA9IHBlcmNsazFfc2V0X3JhdGUsCisJfSwgeworCQkuaWQgPSAxLAorCQkucGFyZW50ID0gJnN5c3RlbV9jbGssCisJCS5nZXRfcmF0ZSA9IHBlcmNsazJfZ2V0X3JhdGUsCisJCS5yb3VuZF9yYXRlID0gcGVyY2xrMl9yb3VuZF9yYXRlLAorCQkuc2V0X3JhdGUgPSBwZXJjbGsyX3NldF9yYXRlLAorCX0sIHsKKwkJLmlkID0gMiwKKwkJLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAorCQkuZ2V0X3JhdGUgPSBwZXJjbGszX2dldF9yYXRlLAorCQkucm91bmRfcmF0ZSA9IHBlcmNsazNfcm91bmRfcmF0ZSwKKwkJLnNldF9yYXRlID0gcGVyY2xrM19zZXRfcmF0ZSwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsayAqY2xrb19jbG9ja3NbXSA9IHsKKwkmcGVyY2xrWzBdLAorCSZoY2xrLAorCSZjbGs0OG0sCisJJmNsazE2bSwKKwkmcHJlbV9jbGssCisJJmZjbGssCit9OworCitzdGF0aWMgaW50IGNsa29fc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJaSA9IF9jbGtfY2FuX3VzZV9wYXJlbnQoY2xrb19jbG9ja3MsIEFSUkFZX1NJWkUoY2xrb19jbG9ja3MpLCBwYXJlbnQpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIGk7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUikgJiB+Q0NNX0NTQ1JfQ0xLT19NQVNLOworCXJlZyB8PSBpIDw8IENDTV9DU0NSX0NMS09fT0ZGU0VUOworCV9fcmF3X3dyaXRlbChyZWcsIENDTV9DU0NSKTsKKworCWlmIChjbGtvX2Nsb2Nrc1tpXS0+c2V0X3JhdGUgJiYgY2xrb19jbG9ja3NbaV0tPnJvdW5kX3JhdGUpIHsKKwkJY2xrLT5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlOworCQljbGstPnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlOworCX0gZWxzZSB7CisJCWNsay0+c2V0X3JhdGUgPSBOVUxMOworCQljbGstPnJvdW5kX3JhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGtvX2NsayA9IHsKKwkuc2V0X3BhcmVudCA9IGNsa29fc2V0X3BhcmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRtYV9jbGsgPSB7CisJLnBhcmVudCA9ICZoY2xrLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKKwkuZW5hYmxlID0gX2Nsa19lbmFibGUsCisJLmVuYWJsZV9yZWcgPSBTQ01fR0NDUiwKKwkuZW5hYmxlX3NoaWZ0ID0gU0NNX0dDQ1JfRE1BX0NMS19FTl9PRkZTRVQsCisJLmRpc2FibGUgPSBfY2xrX2Rpc2FibGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjc2lfY2xrID0geworCS5wYXJlbnQgPSAmaGNsaywKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCisJLmVuYWJsZSA9IF9jbGtfZW5hYmxlLAorCS5lbmFibGVfcmVnID0gU0NNX0dDQ1IsCisJLmVuYWJsZV9zaGlmdCA9IFNDTV9HQ0NSX0NTSV9DTEtfRU5fT0ZGU0VULAorCS5kaXNhYmxlID0gX2Nsa19kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1hX2NsayA9IHsKKwkucGFyZW50ID0gJmhjbGssCisJLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAorCS5lbmFibGUgPSBfY2xrX2VuYWJsZSwKKwkuZW5hYmxlX3JlZyA9IFNDTV9HQ0NSLAorCS5lbmFibGVfc2hpZnQgPSBTQ01fR0NDUl9NTUFfQ0xLX0VOX09GRlNFVCwKKwkuZGlzYWJsZSA9IF9jbGtfZGlzYWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYmRfY2xrID0geworCS5wYXJlbnQgPSAmY2xrNDhtLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKKwkuZW5hYmxlID0gX2Nsa19lbmFibGUsCisJLmVuYWJsZV9yZWcgPSBTQ01fR0NDUiwKKwkuZW5hYmxlX3NoaWZ0ID0gU0NNX0dDQ1JfVVNCRF9DTEtfRU5fT0ZGU0VULAorCS5kaXNhYmxlID0gX2Nsa19kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0X2NsayA9IHsKKwkucGFyZW50ID0gJnBlcmNsa1swXSwKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0X2NsayA9IHsKKwkucGFyZW50ID0gJnBlcmNsa1swXSwKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpMmNfY2xrID0geworCS5wYXJlbnQgPSAmaGNsaywKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzcGlfY2xrID0geworCS5wYXJlbnQgPSAmcGVyY2xrWzFdLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNkaGNfY2xrID0geworCS5wYXJlbnQgPSAmcGVyY2xrWzFdLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGxjZGNfY2xrID0geworCS5wYXJlbnQgPSAmcGVyY2xrWzFdLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zaGNfY2xrID0geworCS5wYXJlbnQgPSAmaGNsaywKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzc2lfY2xrID0geworCS5wYXJlbnQgPSAmcGVyY2xrWzJdLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHJ0Y19jbGsgPSB7CisJLnBhcmVudCA9ICZjbGszMiwKK307CisKKyNkZWZpbmUgX1JFR0lTVEVSX0NMT0NLKGQsIG4sIGMpIFwKKwl7IFwKKwkJLmRldl9pZCA9IGQsIFwKKwkJLmNvbl9pZCA9IG4sIFwKKwkJLmNsayA9ICZjLCBcCisJfSwKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gX19pbml0ZGF0YSA9IHsKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImRtYSIsIGRtYV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJteDEtY2FtZXJhLjAiLCBOVUxMLCBjc2lfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibW1hIiwgbW1hX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteF91ZGMuMCIsIE5VTEwsIHVzYmRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0IiwgZ3B0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzcGlfaW14LjAiLCBOVUxMLCBzcGlfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LW1tYy4wIiwgTlVMTCwgc2RoY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtZmIuMCIsIE5VTEwsIGxjZGNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibXNoYyIsIG1zaGNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic3NpIiwgc3NpX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Y19ydGMuMCIsIE5VTEwsIHJ0Y19jbGspCit9OworCitpbnQgX19pbml0IG14MV9jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGZyZWYpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCS8qIGRpc2FibGUgY2xvY2tzIHdlIGFyZSBhYmxlIHRvICovCisJX19yYXdfd3JpdGVsKDAsIFNDTV9HQ0NSKTsKKworCWNsazMyX3JhdGUgPSBmcmVmOworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKKworCS8qIGRldGVjdCBjbG9jayByZWZlcmVuY2UgZm9yIHN5c3RlbSBQTEwgKi8KKwlpZiAocmVnICYgQ0NNX0NTQ1JfU1lTVEVNX1NFTCkgeworCQlwcmVtX2Nsay5wYXJlbnQgPSAmY2xrMTZtOworCX0gZWxzZSB7CisJCS8qIGVuc3VyZSB0aGF0IG9zY2lsbGF0b3IgaXMgZGlzYWJsZWQgKi8KKwkJcmVnICY9IH4oMSA8PCBDQ01fQ1NDUl9PU0NfRU5fU0hJRlQpOworCQlfX3Jhd193cml0ZWwocmVnLCBDQ01fQ1NDUik7CisJCXByZW1fY2xrLnBhcmVudCA9ICZjbGszMl9wcmVtdWx0OworCX0KKworCS8qIGRldGVjdCByZWZlcmVuY2UgZm9yIENMS08gKi8KKwlyZWcgPSAocmVnICYgQ0NNX0NTQ1JfQ0xLT19NQVNLKSA+PiBDQ01fQ1NDUl9DTEtPX09GRlNFVDsKKwljbGtvX2Nsay5wYXJlbnQgPSAoc3RydWN0IGNsayAqKWNsa29fY2xvY2tzW3JlZ107CisKKwljbGtkZXZfYWRkX3RhYmxlKGxvb2t1cHMsIEFSUkFZX1NJWkUobG9va3VwcykpOworCisJY2xrX2VuYWJsZSgmaGNsayk7CisJY2xrX2VuYWJsZSgmZmNsayk7CisKKwlteGNfdGltZXJfaW5pdCgmZ3B0X2NsaywgTVgxX0lPX0FERFJFU1MoTVgxX1RJTTFfQkFTRV9BRERSKSwKKwkJCU1YMV9USU0xX0lOVCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2Nsb2NrX2lteDIxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyMS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW14Mi9jbG9ja19pbXgyMS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyMS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFhYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYwpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwga2VybmVsQHBlbmd1dHJvbml4LmRlCisgKiBDb3B5cmlnaHQgMjAwOCBNYXJ0aW4gRnV6emV5LCBtZnV6emV5QGdtYWlsLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIElPX0FERFJfQ0NNKG9mZikJKE1YMjdfSU9fQUREUkVTUyhNWDI3X0NDTV9CQVNFX0FERFIgKyAob2ZmKSkpCisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQ0NNX0NTQ1IJCUlPX0FERFJfQ0NNKDB4MCkKKyNkZWZpbmUgQ0NNX01QQ1RMMAkJSU9fQUREUl9DQ00oMHg0KQorI2RlZmluZSBDQ01fTVBDVEwxCQlJT19BRERSX0NDTSgweDgpCisjZGVmaW5lIENDTV9TUENUTDAJCUlPX0FERFJfQ0NNKDB4YykKKyNkZWZpbmUgQ0NNX1NQQ1RMMQkJSU9fQUREUl9DQ00oMHgxMCkKKyNkZWZpbmUgQ0NNX09TQzI2TUNUTAkJSU9fQUREUl9DQ00oMHgxNCkKKyNkZWZpbmUgQ0NNX1BDRFIwCQlJT19BRERSX0NDTSgweDE4KQorI2RlZmluZSBDQ01fUENEUjEJCUlPX0FERFJfQ0NNKDB4MWMpCisjZGVmaW5lIENDTV9QQ0NSMAkJSU9fQUREUl9DQ00oMHgyMCkKKyNkZWZpbmUgQ0NNX1BDQ1IxCQlJT19BRERSX0NDTSgweDI0KQorI2RlZmluZSBDQ01fQ0NTUgkJSU9fQUREUl9DQ00oMHgyOCkKKyNkZWZpbmUgQ0NNX1BNQ1RMCQlJT19BRERSX0NDTSgweDJjKQorI2RlZmluZSBDQ01fUE1DT1VOVAkJSU9fQUREUl9DQ00oMHgzMCkKKyNkZWZpbmUgQ0NNX1dLR0RDVEwJCUlPX0FERFJfQ0NNKDB4MzQpCisKKyNkZWZpbmUgQ0NNX0NTQ1JfVVBEQVRFX0RJUwkoMSA8PCAzMSkKKyNkZWZpbmUgQ0NNX0NTQ1JfU1NJMgkJKDEgPDwgMjMpCisjZGVmaW5lIENDTV9DU0NSX1NTSTEJCSgxIDw8IDIyKQorI2RlZmluZSBDQ01fQ1NDUl9WUFUJCSgxIDw8IDIxKQorI2RlZmluZSBDQ01fQ1NDUl9NU0hDICAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQ0NNX0NTQ1JfU1BMTFJFUyAgICAgICAgKDEgPDwgMTkpCisjZGVmaW5lIENDTV9DU0NSX01QTExSRVMgICAgICAgICgxIDw8IDE4KQorI2RlZmluZSBDQ01fQ1NDUl9TUCAgICAgICAgICAgICAoMSA8PCAxNykKKyNkZWZpbmUgQ0NNX0NTQ1JfTUNVICAgICAgICAgICAgKDEgPDwgMTYpCisjZGVmaW5lIENDTV9DU0NSX09TQzI2TURJViAgICAgICgxIDw8IDQpCisjZGVmaW5lIENDTV9DU0NSX09TQzI2TSAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENDTV9DU0NSX0ZQTSAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENDTV9DU0NSX1NQRU4gICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIENDTV9DU0NSX01QRU4gICAgICAgICAgICgxIDw8IDApCisKKy8qIGkuTVgyNyBUTyAyKyAqLworI2RlZmluZSBDQ01fQ1NDUl9BUk1fU1JDICAgICAgICAoMSA8PCAxNSkKKworI2RlZmluZSBDQ01fU1BDVEwxX0xGICAgICAgICAgICAoMSA8PCAxNSkKKyNkZWZpbmUgQ0NNX1NQQ1RMMV9CUk1PICAgICAgICAgKDEgPDwgNikKKworc3RhdGljIHN0cnVjdCBjbGsgbXBsbF9tYWluMV9jbGssIG1wbGxfbWFpbjJfY2xrOworCitzdGF0aWMgaW50IGNsa19wY2NyX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisKKwlpZiAoIWNsay0+ZW5hYmxlX3JlZykKKwkJcmV0dXJuIDA7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCXJlZyB8PSAxIDw8IGNsay0+ZW5hYmxlX3NoaWZ0OworCV9fcmF3X3dyaXRlbChyZWcsIGNsay0+ZW5hYmxlX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xrX3BjY3JfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisKKwlpZiAoIWNsay0+ZW5hYmxlX3JlZykKKwkJcmV0dXJuOworCisJcmVnID0gX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwlyZWcgJj0gfigxIDw8IGNsay0+ZW5hYmxlX3NoaWZ0KTsKKwlfX3Jhd193cml0ZWwocmVnLCBjbGstPmVuYWJsZV9yZWcpOworfQorCitzdGF0aWMgaW50IGNsa19zcGxsX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7CisJcmVnIHw9IENDTV9DU0NSX1NQRU47CisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOworCisJd2hpbGUgKCEoX19yYXdfcmVhZGwoQ0NNX1NQQ1RMMSkgJiBDQ01fU1BDVEwxX0xGKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xrX3NwbGxfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7CisJcmVnICY9IH5DQ01fQ1NDUl9TUEVOOworCV9fcmF3X3dyaXRlbChyZWcsIENDTV9DU0NSKTsKK30KKworc3RhdGljIGludCBjbGtfY3B1X3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJaW50IGNzY3IgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7CisKKwlpZiAoY2xrLT5wYXJlbnQgPT0gcGFyZW50KQorCQlyZXR1cm4gMDsKKworCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKSB7CisJCWlmIChwYXJlbnQgPT0gJm1wbGxfbWFpbjFfY2xrKSB7CisJCQljc2NyIHw9IENDTV9DU0NSX0FSTV9TUkM7CisJCX0gZWxzZSB7CisJCQlpZiAocGFyZW50ID09ICZtcGxsX21haW4yX2NsaykKKwkJCQljc2NyICY9IH5DQ01fQ1NDUl9BUk1fU1JDOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCV9fcmF3X3dyaXRlbChjc2NyLCBDQ01fQ1NDUik7CisJCWNsay0+cGFyZW50ID0gcGFyZW50OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJvdW5kX3JhdGVfY3B1KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCBkaXY7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKwlpZiAocGFyZW50X3JhdGUgJSByYXRlKQorCQlkaXYrKzsKKworCWlmIChkaXYgPiA0KQorCQlkaXYgPSA0OworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gZGl2OworfQorCitzdGF0aWMgaW50IHNldF9yYXRlX2NwdShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVpbnQzMl90IHJlZzsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCisJaWYgKGRpdiA+IDQgfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYtLTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkgeworCQlyZWcgJj0gfigzIDw8IDEyKTsKKwkJcmVnIHw9IGRpdiA8PCAxMjsKKwkJcmVnICY9IH4oQ0NNX0NTQ1JfRlBNIHwgQ0NNX0NTQ1JfU1BFTik7CisJCV9fcmF3X3dyaXRlbChyZWcgfCBDQ01fQ1NDUl9VUERBVEVfRElTLCBDQ01fQ1NDUik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBzZXQgQ1BVIGZyZXF1ZW5jeSFcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByb3VuZF9yYXRlX3BlcihzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1MzIgZGl2OworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisJaWYgKHBhcmVudF9yYXRlICUgcmF0ZSkKKwkJZGl2Kys7CisKKwlpZiAoZGl2ID4gNjQpCisJCWRpdiA9IDY0OworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gZGl2OworfQorCitzdGF0aWMgaW50IHNldF9yYXRlX3BlcihzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1MzIgcmVnOworCXUzMiBkaXY7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWlmIChjbGstPmlkIDwgMCB8fCBjbGstPmlkID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisJaWYgKGRpdiA+IDY0IHx8IGRpdiA8IDEgfHwgKChwYXJlbnRfcmF0ZSAvIGRpdikgIT0gcmF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCWRpdi0tOworCisJcmVnID0gX19yYXdfcmVhZGwoQ0NNX1BDRFIxKSAmIH4oMHgzZiA8PCAoY2xrLT5pZCA8PCAzKSk7CisJcmVnIHw9IGRpdiA8PCAoY2xrLT5pZCA8PCAzKTsKKwlfX3Jhd193cml0ZWwocmVnLCBDQ01fUENEUjEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3VzYihzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyB1c2JfcGRmOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwl1c2JfcGRmID0gKF9fcmF3X3JlYWRsKENDTV9DU0NSKSA+PiAyOCkgJiAweDc7CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgLyAodXNiX3BkZiArIDFVKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfc3NpeChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcGRmKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkKKwkJcGRmICs9IDQ7ICAvKiBNWDI3IFRPMisgKi8KKwllbHNlCisJCXBkZiA9IChwZGYgPCAyKSA/IDEyNFVMIDogcGRmOyAgLyogTVgyMSAmIE1YMjcgVE8xICovCisKKwlyZXR1cm4gMlVMICogcGFyZW50X3JhdGUgLyBwZGY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3NzaTEoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBnZXRfcmF0ZV9zc2l4KGNsaywgKF9fcmF3X3JlYWRsKENDTV9QQ0RSMCkgPj4gMTYpICYgMHgzZik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3NzaTIoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBnZXRfcmF0ZV9zc2l4KGNsaywgKF9fcmF3X3JlYWRsKENDTV9QQ0RSMCkgPj4gMjYpICYgMHgzZik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX25mYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBuZmNfcGRmOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkKKwkJbmZjX3BkZiA9IChfX3Jhd19yZWFkbChDQ01fUENEUjApID4+IDYpICYgMHhmOworCWVsc2UKKwkJbmZjX3BkZiA9IChfX3Jhd19yZWFkbChDQ01fUENEUjApID4+IDEyKSAmIDB4ZjsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAvIChuZmNfcGRmICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3ZwdShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyB2cHVfcGRmOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkgeworCQl2cHVfcGRmID0gKF9fcmF3X3JlYWRsKENDTV9QQ0RSMCkgPj4gMTApICYgMHgzZjsKKwkJdnB1X3BkZiArPSA0OworCX0gZWxzZSB7CisJCXZwdV9wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX1BDRFIwKSA+PiA4KSAmIDB4ZjsKKwkJdnB1X3BkZiA9ICh2cHVfcGRmIDwgMikgPyAxMjQgOiB2cHVfcGRmOworCX0KKworCXJldHVybiAyVUwgKiBwYXJlbnRfcmF0ZSAvIHZwdV9wZGY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJvdW5kX3JhdGVfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBjbGstPnBhcmVudC0+cm91bmRfcmF0ZShjbGstPnBhcmVudCwgcmF0ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3JhdGVfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBjbGstPnBhcmVudC0+c2V0X3JhdGUoY2xrLT5wYXJlbnQsIHJhdGUpOworfQorCisvKiBpbiBIeiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0ZXJuYWxfaGlnaF9yZWZlcmVuY2UgPSAyNjAwMDAwMDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfaGlnaF9yZWZlcmVuY2Uoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBleHRlcm5hbF9oaWdoX3JlZmVyZW5jZTsKK30KKworLyogaW4gSHogKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4dGVybmFsX2xvd19yZWZlcmVuY2UgPSAzMjc2ODsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfbG93X3JlZmVyZW5jZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGV4dGVybmFsX2xvd19yZWZlcmVuY2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX2ZwbShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiAxMDI0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9tcGxsKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gbXhjX2RlY29kZV9wbGwoX19yYXdfcmVhZGwoQ0NNX01QQ1RMMCksCisJCQljbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfbXBsbF9tYWluKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJLyogaS5NWDI3IFRPMjoKKwkgKiBjbGstPmlkID09IDA6IGFybSBjbG9jayBzb3VyY2UgcGF0aCAxIHdoaWNoIGlzIGZyb20gMiAqIE1QTEwgLyAyCisJICogY2xrLT5pZCA9PSAxOiBhcm0gY2xvY2sgc291cmNlIHBhdGggMiB3aGljaCBpcyBmcm9tIDIgKiBNUExMIC8gMworCSAqLworCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wICYmIGNsay0+aWQgPT0gMSkKKwkJcmV0dXJuIDJVTCAqIHBhcmVudF9yYXRlIC8gM1VMOworCisJcmV0dXJuIHBhcmVudF9yYXRlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9zcGxsKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1aW50MzJfdCByZWc7CisJdW5zaWduZWQgbG9uZyByYXRlOworCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fU1BDVEwwKTsKKworCS8qIE9uIFRPMiB3ZSBoYXZlIHRvIHdyaXRlIHRoZSB2YWx1ZSBiYWNrLiBPdGhlcndpc2Ugd2UKKwkgKiByZWFkIDAgZnJvbSB0aGlzIHJlZ2lzdGVyIHRoZSBuZXh0IHRpbWUuCisJICovCisJaWYgKG14MjdfcmV2aXNpb24oKSA+PSBDSElQX1JFVl8yXzApCisJCV9fcmF3X3dyaXRlbChyZWcsIENDTV9TUENUTDApOworCisJcmV0dXJuIG14Y19kZWNvZGVfcGxsKHJlZywgcmF0ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX2NwdShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGRpdjsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkKKwkJZGl2ID0gKF9fcmF3X3JlYWRsKENDTV9DU0NSKSA+PiAxMikgJiAweDM7CisJZWxzZQorCQlkaXYgPSAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpID4+IDEzKSAmIDB4NzsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXJldHVybiByYXRlIC8gKGRpdiArIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9haGIoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZSwgYmNsa19wZGY7CisKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkKKwkJYmNsa19wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpID4+IDgpICYgMHgzOworCWVsc2UKKwkJYmNsa19wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpID4+IDkpICYgMHhmOworCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJcmV0dXJuIHJhdGUgLyAoYmNsa19wZGYgKyAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfaXBnKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHJhdGUsIGlwZ19wZGY7CisKKwlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJZWxzZQorCQlpcGdfcGRmID0gKF9fcmF3X3JlYWRsKENDTV9DU0NSKSA+PiA4KSAmIDE7CisKKwlyYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwlyZXR1cm4gcmF0ZSAvIChpcGdfcGRmICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3BlcihzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBwZXJjbGtfcGRmLCBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWlmIChjbGstPmlkIDwgMCB8fCBjbGstPmlkID4gMykKKwkJcmV0dXJuIDA7CisKKwlwZXJjbGtfcGRmID0gKF9fcmF3X3JlYWRsKENDTV9QQ0RSMSkgPj4gKGNsay0+aWQgPDwgMykpICYgMHgzZjsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAvIChwZXJjbGtfcGRmICsgMSk7Cit9CisKKy8qCisgKiB0aGUgaGlnaCBmcmVxdWVuY3kgZXh0ZXJuYWwgY2xvY2sgcmVmZXJlbmNlCisgKiBEZWZhdWx0IGNhc2UgaXMgMjZNSHouIENvdWxkIGJlIGNoYW5nZWQgYXQgcnVudGltZQorICogd2l0aCBhIGNhbGwgdG8gY2hhbmdlX2V4dGVybmFsX2hpZ2hfcmVmZXJlbmNlKCkKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgY2tpaF9jbGsgPSB7CisJLmdldF9yYXRlCT0gZ2V0X3JhdGVfaGlnaF9yZWZlcmVuY2UsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtcGxsX2NsayA9IHsKKwkucGFyZW50CQk9ICZja2loX2NsaywKKwkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV9tcGxsLAorfTsKKworLyogRm9yIGkuTVgyNyBUTzIsIGl0IGlzIHRoZSBNUExMIHBhdGggMSBvZiBBUk0gY29yZQorICogSXQgcHJvdmlkZXMgdGhlIGNsb2NrIHNvdXJjZSB3aG9zZSByYXRlIGlzIHNhbWUgYXMgTVBMTAorICovCitzdGF0aWMgc3RydWN0IGNsayBtcGxsX21haW4xX2NsayA9IHsKKwkuaWQJCT0gMCwKKwkucGFyZW50CQk9ICZtcGxsX2NsaywKKwkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV9tcGxsX21haW4sCit9OworCisvKiBGb3IgaS5NWDI3IFRPMiwgaXQgaXMgdGhlIE1QTEwgcGF0aCAyIG9mIEFSTSBjb3JlCisgKiBJdCBwcm92aWRlcyB0aGUgY2xvY2sgc291cmNlIHdob3NlIHJhdGUgaXMgc2FtZSBNUExMICogMiAvIDMKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgbXBsbF9tYWluMl9jbGsgPSB7CisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmbXBsbF9jbGssCisJLmdldF9yYXRlCT0gZ2V0X3JhdGVfbXBsbF9tYWluLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYWhiX2NsayA9IHsKKwkucGFyZW50CQk9ICZtcGxsX21haW4yX2NsaywKKwkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV9haGIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpcGdfY2xrID0geworCS5wYXJlbnQJCT0gJmFoYl9jbGssCisJLmdldF9yYXRlCT0gZ2V0X3JhdGVfaXBnLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY3B1X2NsayA9IHsKKwkucGFyZW50ID0gJm1wbGxfbWFpbjJfY2xrLAorCS5zZXRfcGFyZW50ID0gY2xrX2NwdV9zZXRfcGFyZW50LAorCS5yb3VuZF9yYXRlID0gcm91bmRfcmF0ZV9jcHUsCisJLmdldF9yYXRlID0gZ2V0X3JhdGVfY3B1LAorCS5zZXRfcmF0ZSA9IHNldF9yYXRlX2NwdSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNwbGxfY2xrID0geworCS5wYXJlbnQgPSAmY2tpaF9jbGssCisJLmdldF9yYXRlID0gZ2V0X3JhdGVfc3BsbCwKKwkuZW5hYmxlID0gY2xrX3NwbGxfZW5hYmxlLAorCS5kaXNhYmxlID0gY2xrX3NwbGxfZGlzYWJsZSwKK307CisKKy8qCisgKiB0aGUgbG93IGZyZXF1ZW5jeSBleHRlcm5hbCBjbG9jayByZWZlcmVuY2UKKyAqIERlZmF1bHQgY2FzZSBpcyAzMi43NjhrSHouCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGNraWxfY2xrID0geworCS5nZXRfcmF0ZSA9IGdldF9yYXRlX2xvd19yZWZlcmVuY2UsCit9OworCisvKiBPdXRwdXQgb2YgZnJlcXVlbmN5IHByZSBtdWx0aXBsaWVyICovCitzdGF0aWMgc3RydWN0IGNsayBmcG1fY2xrID0geworCS5wYXJlbnQgPSAmY2tpbF9jbGssCisJLmdldF9yYXRlID0gZ2V0X3JhdGVfZnBtLAorfTsKKworI2RlZmluZSBQQ0NSMCBDQ01fUENDUjAKKyNkZWZpbmUgUENDUjEgQ0NNX1BDQ1IxCisKKyNkZWZpbmUgREVGSU5FX0NMT0NLKG5hbWUsIGksIGVyLCBlcywgZ3IsIHMsIHApCQlcCisJc3RhdGljIHN0cnVjdCBjbGsgbmFtZSA9IHsJCQlcCisJCS5pZAkJPSBpLAkJCVwKKwkJLmVuYWJsZV9yZWcJPSBlciwJCQlcCisJCS5lbmFibGVfc2hpZnQJPSBlcywJCQlcCisJCS5nZXRfcmF0ZQk9IGdyLAkJCVwKKwkJLmVuYWJsZQkJPSBjbGtfcGNjcl9lbmFibGUsCVwKKwkJLmRpc2FibGUJPSBjbGtfcGNjcl9kaXNhYmxlLAlcCisJCS5zZWNvbmRhcnkJPSBzLAkJCVwKKwkJLnBhcmVudAkJPSBwLAkJCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX0NMT0NLMShuYW1lLCBpLCBlciwgZXMsIGdldHNldHJvdW5kLCBzLCBwKQlcCisJc3RhdGljIHN0cnVjdCBjbGsgbmFtZSA9IHsJCQkJXAorCQkuaWQJCT0gaSwJCQkJXAorCQkuZW5hYmxlX3JlZwk9IGVyLAkJCQlcCisJCS5lbmFibGVfc2hpZnQJPSBlcywJCQkJXAorCQkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV8jI2dldHNldHJvdW5kLAlcCisJCS5zZXRfcmF0ZQk9IHNldF9yYXRlXyMjZ2V0c2V0cm91bmQsCVwKKwkJLnJvdW5kX3JhdGUJPSByb3VuZF9yYXRlXyMjZ2V0c2V0cm91bmQsCVwKKwkJLmVuYWJsZQkJPSBjbGtfcGNjcl9lbmFibGUsCQlcCisJCS5kaXNhYmxlCT0gY2xrX3BjY3JfZGlzYWJsZSwJCVwKKwkJLnNlY29uZGFyeQk9IHMsCQkJCVwKKwkJLnBhcmVudAkJPSBwLAkJCQlcCisJfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGtlZXAgdGhlIGZvbGxvd2luZyBsaXN0IGluIG9yZGVyICovCitzdGF0aWMgc3RydWN0IGNsayBzbGNkY19jbGsxLCBzYWhhcmEyX2NsazEsIHJ0aWNfY2xrMSwgZmVjX2NsazEsIGVtbWFfY2xrMSwKKwkJICBkbWFfY2xrMSwgbGNkY19jbGsyLCB2cHVfY2xrMTsKKworLyogQWxsIGNsb2NrcyB3ZSBjYW4gZ2F0ZSB0aHJvdWdoIFBDQ1J4IGluIHRoZSBvcmRlciBvZiBQQ0NSeCBiaXRzICovCitERUZJTkVfQ0xPQ0soc3NpMl9jbGsxLCAgICAxLCBQQ0NSMCwgIDAsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhzc2kxX2NsazEsICAgIDAsIFBDQ1IwLCAgMSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKHNsY2RjX2NsaywgICAgMCwgUENDUjAsICAyLCBOVUxMLCAmc2xjZGNfY2xrMSwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKHNkaGMzX2NsazEsICAgMCwgUENDUjAsICAzLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soc2RoYzJfY2xrMSwgICAwLCBQQ0NSMCwgIDQsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhzZGhjMV9jbGsxLCAgIDAsIFBDQ1IwLCAgNSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKHNjY19jbGssICAgICAgMCwgUENDUjAsICA2LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soc2FoYXJhMl9jbGssICAwLCBQQ0NSMCwgIDcsIE5VTEwsICZzYWhhcmEyX2NsazEsICZhaGJfY2xrKTsKK0RFRklORV9DTE9DSyhydGljX2NsaywgICAgIDAsIFBDQ1IwLCAgOCwgTlVMTCwgJnJ0aWNfY2xrMSwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKHJ0Y19jbGssICAgICAgMCwgUENDUjAsICA5LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0socHdtX2NsazEsICAgICAwLCBQQ0NSMCwgMTEsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhvd2lyZV9jbGssICAgIDAsIFBDQ1IwLCAxMiwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKG1zdGlja19jbGsxLCAgMCwgUENDUjAsIDEzLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0sobGNkY19jbGsxLCAgICAwLCBQQ0NSMCwgMTQsIE5VTEwsICZsY2RjX2NsazIsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhrcHBfY2xrLCAgICAgIDAsIFBDQ1IwLCAxNSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKGlpbV9jbGssICAgICAgMCwgUENDUjAsIDE2LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soaTJjMl9jbGssICAgICAxLCBQQ0NSMCwgMTcsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhpMmMxX2NsaywgICAgIDAsIFBDQ1IwLCAxOCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKGdwdDZfY2xrMSwgICAgMCwgUENDUjAsIDI5LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soZ3B0NV9jbGsxLCAgICAwLCBQQ0NSMCwgMjAsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhncHQ0X2NsazEsICAgIDAsIFBDQ1IwLCAyMSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKGdwdDNfY2xrMSwgICAgMCwgUENDUjAsIDIyLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soZ3B0Ml9jbGsxLCAgICAwLCBQQ0NSMCwgMjMsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhncHQxX2NsazEsICAgIDAsIFBDQ1IwLCAyNCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKGdwaW9fY2xrLCAgICAgMCwgUENDUjAsIDI1LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soZmVjX2NsaywgICAgICAwLCBQQ0NSMCwgMjYsIE5VTEwsICZmZWNfY2xrMSwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKGVtbWFfY2xrLCAgICAgMCwgUENDUjAsIDI3LCBOVUxMLCAmZW1tYV9jbGsxLCAmYWhiX2Nsayk7CitERUZJTkVfQ0xPQ0soZG1hX2NsaywgICAgICAwLCBQQ0NSMCwgMjgsIE5VTEwsICZkbWFfY2xrMSwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKGNzcGkxM19jbGsxLCAgMCwgUENDUjAsIDI5LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0soY3NwaTJfY2xrMSwgICAwLCBQQ0NSMCwgMzAsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyhjc3BpMV9jbGsxLCAgIDAsIFBDQ1IwLCAzMSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworCitERUZJTkVfQ0xPQ0sobXN0aWNrX2NsaywgICAwLCBQQ0NSMSwgIDIsIE5VTEwsICZtc3RpY2tfY2xrMSwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKG5mY19jbGssICAgICAgMCwgUENDUjEsICAzLCBnZXRfcmF0ZV9uZmMsIE5VTEwsICZjcHVfY2xrKTsKK0RFRklORV9DTE9DSyhzc2kyX2NsaywgICAgIDEsIFBDQ1IxLCAgNCwgZ2V0X3JhdGVfc3NpMiwgJnNzaTJfY2xrMSwgJm1wbGxfbWFpbjJfY2xrKTsKK0RFRklORV9DTE9DSyhzc2kxX2NsaywgICAgIDAsIFBDQ1IxLCAgNSwgZ2V0X3JhdGVfc3NpMSwgJnNzaTFfY2xrMSwgJm1wbGxfbWFpbjJfY2xrKTsKK0RFRklORV9DTE9DSyh2cHVfY2xrLCAgICAgIDAsIFBDQ1IxLCAgNiwgZ2V0X3JhdGVfdnB1LCAmdnB1X2NsazEsICZtcGxsX21haW4yX2Nsayk7CitERUZJTkVfQ0xPQ0sxKHBlcjRfY2xrLCAgICAzLCBQQ0NSMSwgIDcsIHBlciwgTlVMTCwgJm1wbGxfbWFpbjJfY2xrKTsKK0RFRklORV9DTE9DSzEocGVyM19jbGssICAgIDIsIFBDQ1IxLCAgOCwgcGVyLCBOVUxMLCAmbXBsbF9tYWluMl9jbGspOworREVGSU5FX0NMT0NLMShwZXIyX2NsaywgICAgMSwgUENDUjEsICA5LCBwZXIsIE5VTEwsICZtcGxsX21haW4yX2Nsayk7CitERUZJTkVfQ0xPQ0sxKHBlcjFfY2xrLCAgICAwLCBQQ0NSMSwgMTAsIHBlciwgTlVMTCwgJm1wbGxfbWFpbjJfY2xrKTsKK0RFRklORV9DTE9DSyh1c2JfY2xrMSwgICAgIDAsIFBDQ1IxLCAxMSwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKHNsY2RjX2NsazEsICAgMCwgUENDUjEsIDEyLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7CitERUZJTkVfQ0xPQ0soc2FoYXJhMl9jbGsxLCAwLCBQQ0NSMSwgMTMsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKK0RFRklORV9DTE9DSyhydGljX2NsazEsICAgIDAsIFBDQ1IxLCAxNCwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKGxjZGNfY2xrMiwgICAgMCwgUENDUjEsIDE1LCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7CitERUZJTkVfQ0xPQ0sodnB1X2NsazEsICAgICAwLCBQQ0NSMSwgMTYsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKK0RFRklORV9DTE9DSyhmZWNfY2xrMSwgICAgIDAsIFBDQ1IxLCAxNywgTlVMTCwgTlVMTCwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKGVtbWFfY2xrMSwgICAgMCwgUENDUjEsIDE4LCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7CitERUZJTkVfQ0xPQ0soZW1pX2NsaywgICAgICAwLCBQQ0NSMSwgMTksIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKK0RFRklORV9DTE9DSyhkbWFfY2xrMSwgICAgIDAsIFBDQ1IxLCAyMCwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKGNzaV9jbGsxLCAgICAgMCwgUENDUjEsIDIxLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7CitERUZJTkVfQ0xPQ0soYnJvbV9jbGssICAgICAwLCBQQ0NSMSwgMjIsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKK0RFRklORV9DTE9DSyhhdGFfY2xrLCAgICAgIDAsIFBDQ1IxLCAyMywgTlVMTCwgTlVMTCwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKHdkb2dfY2xrLCAgICAgMCwgUENDUjEsIDI0LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0sodXNiX2NsaywgICAgICAwLCBQQ0NSMSwgMjUsIGdldF9yYXRlX3VzYiwgJnVzYl9jbGsxLCAmc3BsbF9jbGspOworREVGSU5FX0NMT0NLKHVhcnQ2X2NsazEsICAgMCwgUENDUjEsIDI2LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0sodWFydDVfY2xrMSwgICAwLCBQQ0NSMSwgMjcsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyh1YXJ0NF9jbGsxLCAgIDAsIFBDQ1IxLCAyOCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKHVhcnQzX2NsazEsICAgMCwgUENDUjEsIDI5LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0sodWFydDJfY2xrMSwgICAwLCBQQ0NSMSwgMzAsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKK0RFRklORV9DTE9DSyh1YXJ0MV9jbGsxLCAgIDAsIFBDQ1IxLCAzMSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworCisvKiBDbG9ja3Mgd2UgY2Fubm90IGRpcmVjdGx5IGdhdGUsIGJ1dCBkcml2ZXJzIG5lZWQgdGhlaXIgcmF0ZXMgKi8KK0RFRklORV9DTE9DSyhjc3BpMV9jbGssICAgIDAsIDAsICAgICAgMCwgTlVMTCwgJmNzcGkxX2NsazEsICZwZXIyX2Nsayk7CitERUZJTkVfQ0xPQ0soY3NwaTJfY2xrLCAgICAxLCAwLCAgICAgIDAsIE5VTEwsICZjc3BpMl9jbGsxLCAmcGVyMl9jbGspOworREVGSU5FX0NMT0NLKGNzcGkzX2NsaywgICAgMiwgMCwgICAgICAwLCBOVUxMLCAmY3NwaTEzX2NsazEsICZwZXIyX2Nsayk7CitERUZJTkVfQ0xPQ0soc2RoYzFfY2xrLCAgICAwLCAwLCAgICAgIDAsIE5VTEwsICZzZGhjMV9jbGsxLCAmcGVyMl9jbGspOworREVGSU5FX0NMT0NLKHNkaGMyX2NsaywgICAgMSwgMCwgICAgICAwLCBOVUxMLCAmc2RoYzJfY2xrMSwgJnBlcjJfY2xrKTsKK0RFRklORV9DTE9DSyhzZGhjM19jbGssICAgIDIsIDAsICAgICAgMCwgTlVMTCwgJnNkaGMzX2NsazEsICZwZXIyX2Nsayk7CitERUZJTkVfQ0xPQ0socHdtX2NsaywgICAgICAwLCAwLCAgICAgIDAsIE5VTEwsICZwd21fY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyhncHQxX2NsaywgICAgIDAsIDAsICAgICAgMCwgTlVMTCwgJmdwdDFfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyhncHQyX2NsaywgICAgIDEsIDAsICAgICAgMCwgTlVMTCwgJmdwdDJfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyhncHQzX2NsaywgICAgIDIsIDAsICAgICAgMCwgTlVMTCwgJmdwdDNfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyhncHQ0X2NsaywgICAgIDMsIDAsICAgICAgMCwgTlVMTCwgJmdwdDRfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyhncHQ1X2NsaywgICAgIDQsIDAsICAgICAgMCwgTlVMTCwgJmdwdDVfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyhncHQ2X2NsaywgICAgIDUsIDAsICAgICAgMCwgTlVMTCwgJmdwdDZfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyh1YXJ0MV9jbGssICAgIDAsIDAsICAgICAgMCwgTlVMTCwgJnVhcnQxX2NsazEsICZwZXIxX2Nsayk7CitERUZJTkVfQ0xPQ0sodWFydDJfY2xrLCAgICAxLCAwLCAgICAgIDAsIE5VTEwsICZ1YXJ0Ml9jbGsxLCAmcGVyMV9jbGspOworREVGSU5FX0NMT0NLKHVhcnQzX2NsaywgICAgMiwgMCwgICAgICAwLCBOVUxMLCAmdWFydDNfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSyh1YXJ0NF9jbGssICAgIDMsIDAsICAgICAgMCwgTlVMTCwgJnVhcnQ0X2NsazEsICZwZXIxX2Nsayk7CitERUZJTkVfQ0xPQ0sodWFydDVfY2xrLCAgICA0LCAwLCAgICAgIDAsIE5VTEwsICZ1YXJ0NV9jbGsxLCAmcGVyMV9jbGspOworREVGSU5FX0NMT0NLKHVhcnQ2X2NsaywgICAgNSwgMCwgICAgICAwLCBOVUxMLCAmdWFydDZfY2xrMSwgJnBlcjFfY2xrKTsKK0RFRklORV9DTE9DSzEobGNkY19jbGssICAgIDAsIDAsICAgICAgMCwgcGFyZW50LCAmbGNkY19jbGsxLCAmcGVyM19jbGspOworREVGSU5FX0NMT0NLMShjc2lfY2xrLCAgICAgMCwgMCwgICAgICAwLCBwYXJlbnQsICZjc2lfY2xrMSwgJnBlcjRfY2xrKTsKKworI2RlZmluZSBfUkVHSVNURVJfQ0xPQ0soZCwgbiwgYykgXAorCXsgXAorCQkuZGV2X2lkID0gZCwgXAorCQkuY29uX2lkID0gbiwgXAorCQkuY2xrID0gJmMsIFwKKwl9LAorCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0geworCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC41IiwgTlVMTCwgdWFydDZfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MSIsIGdwdDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MiIsIGdwdDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MyIsIGdwdDNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0NCIsIGdwdDRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0NSIsIGdwdDVfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0NiIsIGdwdDZfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygibXhjX3B3bS4wIiwgTlVMTCwgcHdtX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Yy1tbWMuMCIsIE5VTEwsIHNkaGMxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Yy1tbWMuMSIsIE5VTEwsIHNkaGMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Yy1tbWMuMiIsIE5VTEwsIHNkaGMzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMCIsIE5VTEwsIGNzcGkxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMSIsIE5VTEwsIGNzcGkyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMiIsIE5VTEwsIGNzcGkzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC1mYi4wIiwgTlVMTCwgbGNkY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJteDItY2FtZXJhLjAiLCBOVUxMLCBjc2lfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiZnNsLXVzYjItdWRjIiwgInVzYiIsIHVzYl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJmc2wtdXNiMi11ZGMiLCAidXNiX2FoYiIsIHVzYl9jbGsxKQorCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMCIsICJ1c2IiLCB1c2JfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMCIsICJ1c2JfYWhiIiwgdXNiX2NsazEpCisJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYiIsIHVzYl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYl9haGIiLCB1c2JfY2xrMSkKKwlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjIiLCAidXNiIiwgdXNiX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjIiLCAidXNiX2FoYiIsIHVzYl9jbGsxKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Y19uYW5kLjAiLCBOVUxMLCBuZmNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAidnB1IiwgdnB1X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImRtYSIsIGRtYV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGljIiwgcnRpY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJicm9tIiwgYnJvbV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJlbW1hIiwgZW1tYV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzbGNkYyIsIHNsY2RjX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVtaSIsIGVtaV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzYWhhcmEyIiwgc2FoYXJhMl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibXN0aWNrIiwgbXN0aWNrX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC13ZHQuMCIsIE5VTEwsIHdkb2dfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BpbyIsIGdwaW9fY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjEiLCBOVUxMLCBpMmMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImlpbSIsIGlpbV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJrcHAiLCBrcHBfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygibXhjX3cxLjAiLCBOVUxMLCBvd2lyZV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGMiLCBydGNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic2NjIiwgc2NjX2NsaykKK307CisKKy8qIEFkanVzdCB0aGUgY2xvY2sgcGF0aCBmb3IgVE8yIGFuZCBsYXRlciAqLworc3RhdGljIHZvaWQgX19pbml0IHRvMl9hZGp1c3RfY2xvY2tzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjc2NyID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOworCisJaWYgKG14MjdfcmV2aXNpb24oKSA+PSBDSElQX1JFVl8yXzApIHsKKwkJaWYgKGNzY3IgJiBDQ01fQ1NDUl9BUk1fU1JDKQorCQkJY3B1X2Nsay5wYXJlbnQgPSAmbXBsbF9tYWluMV9jbGs7CisKKwkJaWYgKCEoY3NjciAmIENDTV9DU0NSX1NTSTIpKQorCQkJc3NpMV9jbGsucGFyZW50ID0gJnNwbGxfY2xrOworCisJCWlmICghKGNzY3IgJiBDQ01fQ1NDUl9TU0kxKSkKKwkJCXNzaTFfY2xrLnBhcmVudCA9ICZzcGxsX2NsazsKKworCQlpZiAoIShjc2NyICYgQ0NNX0NTQ1JfVlBVKSkKKwkJCXZwdV9jbGsucGFyZW50ID0gJnNwbGxfY2xrOworCX0gZWxzZSB7CisJCWNwdV9jbGsucGFyZW50ID0gJm1wbGxfY2xrOworCQljcHVfY2xrLnNldF9wYXJlbnQgPSBOVUxMOworCQljcHVfY2xrLnJvdW5kX3JhdGUgPSBOVUxMOworCQljcHVfY2xrLnNldF9yYXRlID0gTlVMTDsKKwkJYWhiX2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7CisKKwkJcGVyMV9jbGsucGFyZW50ID0gJm1wbGxfY2xrOworCQlwZXIyX2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7CisJCXBlcjNfY2xrLnBhcmVudCA9ICZtcGxsX2NsazsKKwkJcGVyNF9jbGsucGFyZW50ID0gJm1wbGxfY2xrOworCisJCXNzaTFfY2xrLnBhcmVudCA9ICZtcGxsX2NsazsKKwkJc3NpMl9jbGsucGFyZW50ID0gJm1wbGxfY2xrOworCisJCXZwdV9jbGsucGFyZW50ID0gJm1wbGxfY2xrOworCX0KK30KKworLyoKKyAqIG11c3QgYmUgY2FsbGVkIHZlcnkgZWFybHkgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogYXZhaWxhYmxlIGNsb2NrIHJhdGUgd2hlbiB0aGUgdGltZXIgZnJhbWV3b3JrIHN0YXJ0cworICovCitpbnQgX19pbml0IG14MjdfY2xvY2tzX2luaXQodW5zaWduZWQgbG9uZyBmcmVmKQoreworCXUzMiBjc2NyID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOworCisJZXh0ZXJuYWxfaGlnaF9yZWZlcmVuY2UgPSBmcmVmOworCisJLyogZGV0ZWN0IGNsb2NrIHJlZmVyZW5jZSBmb3IgYm90aCBzeXN0ZW0gUExMcyAqLworCWlmIChjc2NyICYgQ0NNX0NTQ1JfTUNVKQorCQltcGxsX2Nsay5wYXJlbnQgPSAmY2tpaF9jbGs7CisJZWxzZQorCQltcGxsX2Nsay5wYXJlbnQgPSAmZnBtX2NsazsKKworCWlmIChjc2NyICYgQ0NNX0NTQ1JfU1ApCisJCXNwbGxfY2xrLnBhcmVudCA9ICZja2loX2NsazsKKwllbHNlCisJCXNwbGxfY2xrLnBhcmVudCA9ICZmcG1fY2xrOworCisJdG8yX2FkanVzdF9jbG9ja3MoKTsKKworCWNsa2Rldl9hZGRfdGFibGUobG9va3VwcywgQVJSQVlfU0laRShsb29rdXBzKSk7CisKKwkvKiBUdXJuIG9mZiBhbGwgY2xvY2tzIHdlIGRvIG5vdCBuZWVkICovCisJX19yYXdfd3JpdGVsKDAsIENDTV9QQ0NSMCk7CisJX19yYXdfd3JpdGVsKCgxIDw8IDEwKSB8ICgxIDw8IDE5KSwgQ0NNX1BDQ1IxKTsKKworCXNwbGxfY2xrLmRpc2FibGUoJnNwbGxfY2xrKTsKKworCS8qIGVuYWJsZSBiYXNpYyBjbG9ja3MgKi8KKwljbGtfZW5hYmxlKCZwZXIxX2Nsayk7CisJY2xrX2VuYWJsZSgmZ3Bpb19jbGspOworCWNsa19lbmFibGUoJmVtaV9jbGspOworCWNsa19lbmFibGUoJmlpbV9jbGspOworCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfTEwpICYmICFkZWZpbmVkKENPTkZJR19ERUJVR19JQ0VEQ0MpCisJY2xrX2VuYWJsZSgmdWFydDFfY2xrKTsKKyNlbmRpZgorCisJbXhjX3RpbWVyX2luaXQoJmdwdDFfY2xrLCBNWDI3X0lPX0FERFJFU1MoTVgyN19HUFQxX0JBU0VfQUREUiksCisJCQlNWDI3X0lOVF9HUFQxKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9jcHVfaW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW14Mi9jcHVfaW14MjcuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDI3LmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkOTRmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUGVuZ3V0cm9uaXgKKyAqIFV3ZSBLbGVpbmUtS29lbmlnIDx1LmtsZWluZS1rb2VuaWdAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPG1hY2gvbXgxLmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCisjZGVmaW5lIGlteDFfYWRkX2kyY19pbXgocGRhdGEpCQlcCisJaW14X2FkZF9pbXhfaTJjKDAsIE1YMV9JMkNfQkFTRV9BRERSLCBTWl80SywgTVgxX0lOVF9JMkMsIHBkYXRhKQorCisjZGVmaW5lIGlteDFfYWRkX2lteF91YXJ0MChwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfM2lycSgwLCBNWDFfVUFSVDFfQkFTRV9BRERSLCAweGQwLCBNWDFfSU5UX1VBUlQxUlgsIE1YMV9JTlRfVUFSVDFUWCwgTVgxX0lOVF9VQVJUMVJUUywgcGRhdGEpCisjZGVmaW5lIGlteDFfYWRkX2lteF91YXJ0MShwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfM2lycSgwLCBNWDFfVUFSVDJfQkFTRV9BRERSLCAweGQwLCBNWDFfSU5UX1VBUlQyUlgsIE1YMV9JTlRfVUFSVDJUWCwgTVgxX0lOVF9VQVJUMlJUUywgcGRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDIxLmggYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDIxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ODhlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MjEuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFBlbmd1dHJvbml4CisgKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxtYWNoL214MjEuaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKKyNkZWZpbmUgaW14MjFfYWRkX2kyY19pbXgocGRhdGEpCVwKKwlpbXhfYWRkX2lteF9pMmMoMCwgTVgyeF9JMkNfQkFTRV9BRERSLCBTWl80SywgTVgyeF9JTlRfSTJDLCBwZGF0YSkKKworI2RlZmluZSBpbXgyMV9hZGRfaW14X3VhcnQwKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDAsIE1YMjFfVUFSVDFfQkFTRV9BRERSLCBTWl80SywgTVgyMV9JTlRfVUFSVDEsIHBkYXRhKQorI2RlZmluZSBpbXgyMV9hZGRfaW14X3VhcnQxKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDEsIE1YMjFfVUFSVDJfQkFTRV9BRERSLCBTWl80SywgTVgyMV9JTlRfVUFSVDIsIHBkYXRhKQorI2RlZmluZSBpbXgyMV9hZGRfaW14X3VhcnQyKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDIsIE1YMjFfVUFSVDNfQkFTRV9BRERSLCBTWl80SywgTVgyMV9JTlRfVUFSVDMsIHBkYXRhKQorI2RlZmluZSBpbXgyMV9hZGRfaW14X3VhcnQzKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDMsIE1YMjFfVUFSVDRfQkFTRV9BRERSLCBTWl80SywgTVgyMV9JTlRfVUFSVDQsIHBkYXRhKQorCisjZGVmaW5lIGlteDIxX2FkZF9teGNfbmFuZChwZGF0YSkJXAorCWlteF9hZGRfbXhjX25hbmRfdjEoTVgyMV9ORkNfQkFTRV9BRERSLCBNWDIxX0lOVF9OQU5ERkMsIHBkYXRhKQorCisjZGVmaW5lIGlteDIxX2FkZF9zcGlfaW14MChwZGF0YSkJXAorCWlteF9hZGRfc3BpX2lteCgwLCBNWDIxX0NTUEkxX0JBU0VfQUREUiwgU1pfNEssIE1YMjFfSU5UX0NTUEkxLCBwZGF0YSkKKyNkZWZpbmUgaW14MjFfYWRkX3NwaV9pbXgxKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDEsIE1YMjFfQ1NQSTJfQkFTRV9BRERSLCBTWl80SywgTVgyMV9JTlRfQ1NQSTIsIHBkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgyNy5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgyNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTdiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDI3LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBQZW5ndXRyb25peAorICogVXdlIEtsZWluZS1Lb2VuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bWFjaC9teDI3Lmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCisjZGVmaW5lIGlteDI3X2FkZF9pMmNfaW14MChwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygwLCBNWDI3X0kyQzFfQkFTRV9BRERSLCBTWl80SywgTVgyN19JTlRfSTJDMSwgcGRhdGEpCisjZGVmaW5lIGlteDI3X2FkZF9pMmNfaW14MShwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygxLCBNWDI3X0kyQzJfQkFTRV9BRERSLCBTWl80SywgTVgyN19JTlRfSTJDMiwgcGRhdGEpCisKKyNkZWZpbmUgaW14MjdfYWRkX2lteF91YXJ0MChwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgwLCBNWDI3X1VBUlQxX0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX1VBUlQxLCBwZGF0YSkKKyNkZWZpbmUgaW14MjdfYWRkX2lteF91YXJ0MShwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgxLCBNWDI3X1VBUlQyX0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX1VBUlQyLCBwZGF0YSkKKyNkZWZpbmUgaW14MjdfYWRkX2lteF91YXJ0MihwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgyLCBNWDI3X1VBUlQzX0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX1VBUlQzLCBwZGF0YSkKKyNkZWZpbmUgaW14MjdfYWRkX2lteF91YXJ0MyhwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgzLCBNWDI3X1VBUlQ0X0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX1VBUlQ0LCBwZGF0YSkKKyNkZWZpbmUgaW14MjdfYWRkX2lteF91YXJ0NChwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSg0LCBNWDI3X1VBUlQ1X0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX1VBUlQ1LCBwZGF0YSkKKyNkZWZpbmUgaW14MjdfYWRkX2lteF91YXJ0NShwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSg1LCBNWDI3X1VBUlQ2X0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX1VBUlQ2LCBwZGF0YSkKKworI2RlZmluZSBpbXgyN19hZGRfbXhjX25hbmQocGRhdGEpCVwKKwlpbXhfYWRkX214Y19uYW5kX3YxKE1YMjdfTkZDX0JBU0VfQUREUiwgTVgyN19JTlRfTkFOREZDLCBwZGF0YSkKKworI2RlZmluZSBpbXgyN19hZGRfc3BpX2lteDAocGRhdGEpCVwKKwlpbXhfYWRkX3NwaV9pbXgoMCwgTVgyN19DU1BJMV9CQVNFX0FERFIsIFNaXzRLLCBNWDI3X0lOVF9DU1BJMSwgcGRhdGEpCisjZGVmaW5lIGlteDI3X2FkZF9zcGlfaW14MShwZGF0YSkJXAorCWlteF9hZGRfc3BpX2lteCgxLCBNWDI3X0NTUEkyX0JBU0VfQUREUiwgU1pfNEssIE1YMjdfSU5UX0NTUEkyLCBwZGF0YSkKKyNkZWZpbmUgaW14MjdfYWRkX3NwaV9pbXgyKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDIsIE1YMjdfQ1NQSTNfQkFTRV9BRERSLCBTWl80SywgTVgyN19JTlRfQ1NQSTMsIHBkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjcxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgT01BUCBkZXZpY2VzLmMKKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcworICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwga2VybmVsQHBlbmd1dHJvbml4LmRlCisgKiBDb3B5cmlnaHQgMjAwOCBTYXNjaGEgSGF1ZXIsIGtlcm5lbEBwZW5ndXRyb25peC5kZQorICogQ29weXJpZ2h0IChjKSAyMDA4IFBhdWxpdXMgWmFsZWNrYXMgPHBhdWxpdXMuemFsZWNrYXNAdGVsdG9uaWthLmx0PgorICogQ29weXJpZ2h0IChjKSAyMDA4IERhcml1cyBBdWd1bGlzIDxkYXJpdXMuYXVndWxpc0B0ZWx0b25pa2EubHQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDEpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteDFfY2FtZXJhX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ICA9IDB4MDAyMjQwMDAsCisJCS5lbmQgICAgPSAweDAwMjI0MDEwLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQgID0gTVgxX0NTSV9JTlQsCisJCS5lbmQgICAgPSBNWDFfQ1NJX0lOVCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGlteDFfY2FtZXJhX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteDFfY2FtZXJhX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAibXgxLWNhbWVyYSIsCisJLmlkICAgICAgICAgICAgID0gMCwgLyogVGhpcyBpcyB1c2VkIHRvIHB1dCBjYW1lcmFzIG9uIHRoaXMgaW50ZXJmYWNlICovCisJLmRldgkJPSB7CisJCS5kbWFfbWFzayA9ICZpbXgxX2NhbWVyYV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLnJlc291cmNlICAgICAgID0gaW14MV9jYW1lcmFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14MV9jYW1lcmFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3J0Y19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCAgPSAweDAwMjA0MDAwLAorCQkuZW5kICAgID0gMHgwMDIwNDAyNCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ICA9IE1YMV9SVENfSU5ULAorCQkuZW5kICAgID0gTVgxX1JUQ19JTlQsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LCB7CisJCS5zdGFydCAgPSBNWDFfUlRDX1NBTUlOVCwKKwkJLmVuZCAgICA9IE1YMV9SVENfU0FNSU5ULAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3J0Y19kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gInJ0Yy1pbXgiLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLnJlc291cmNlICAgICAgID0gaW14X3J0Y19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShpbXhfcnRjX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF93ZHRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgID0gMHgwMDIwMTAwMCwKKwkJLmVuZCAgICA9IDB4MDAyMDEwMDgsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydCAgPSBNWDFfV0RUX0lOVCwKKwkJLmVuZCAgICA9IE1YMV9XRFRfSU5ULAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3dkdF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlteC13ZHQiLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLnJlc291cmNlICAgICAgID0gaW14X3dkdF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShpbXhfd2R0X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF91c2JfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDAwMjEyMDAwLAorCQkuZW5kCT0gMHgwMDIxMjE0OCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQwLAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQxLAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQyLAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQzLAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQ0LAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UNCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQ1LAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UNSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgeworCQkuc3RhcnQJPSBNWDFfVVNCRF9JTlQ2LAorCQkuZW5kCT0gTVgxX1VTQkRfSU5UNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3VzYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImlteF91ZGMiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpbXhfdXNiX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaW14X3VzYl9yZXNvdXJjZXMsCit9OworCisvKiBHUElPIHBvcnQgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCBpbXhfZ3Bpb19wb3J0c1tdID0geworCXsKKwkJLmNoaXAubGFiZWwgPSAiZ3Bpby0wIiwKKwkJLmJhc2UgPSAodm9pZCBfX2lvbWVtICopTVgxX0lPX0FERFJFU1MoTVgxX0dQSU9fQkFTRV9BRERSKSwKKwkJLmlycSA9IE1YMV9HUElPX0lOVF9QT1JUQSwKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJULAorCX0sIHsKKwkJLmNoaXAubGFiZWwgPSAiZ3Bpby0xIiwKKwkJLmJhc2UgPSAodm9pZCBfX2lvbWVtICopTVgxX0lPX0FERFJFU1MoTVgxX0dQSU9fQkFTRV9BRERSICsgMHgxMDApLAorCQkuaXJxID0gTVgxX0dQSU9fSU5UX1BPUlRCLAorCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiwKKwl9LCB7CisJCS5jaGlwLmxhYmVsID0gImdwaW8tMiIsCisJCS5iYXNlID0gKHZvaWQgX19pb21lbSAqKU1YMV9JT19BRERSRVNTKE1YMV9HUElPX0JBU0VfQUREUiArIDB4MjAwKSwKKwkJLmlycSA9IE1YMV9HUElPX0lOVF9QT1JUQywKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgNjQsCisJfSwgeworCQkuY2hpcC5sYWJlbCA9ICJncGlvLTMiLAorCQkuYmFzZSA9ICh2b2lkIF9faW9tZW0gKilNWDFfSU9fQUREUkVTUyhNWDFfR1BJT19CQVNFX0FERFIgKyAweDMwMCksCisJCS5pcnEgPSBNWDFfR1BJT19JTlRfUE9SVEQsCisJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDk2LAorCX0KK307CisKK2ludCBfX2luaXQgaW14MV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQoreworCXJldHVybiBteGNfZ3Bpb19pbml0KGlteF9ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKGlteF9ncGlvX3BvcnRzKSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfTVgyMSkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9NWDI3KQorCisjaWZkZWYgQ09ORklHX01BQ0hfTVgyNworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDI3X2NhbWVyYV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJICAgICAgIC5zdGFydCA9IE1YMjdfQ1NJX0JBU0VfQUREUiwKKwkgICAgICAgLmVuZCA9IE1YMjdfQ1NJX0JBU0VfQUREUiArIDB4MWYsCisJICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkgICAgICAgLnN0YXJ0ID0gTVgyN19FTU1BX1BSUF9CQVNFX0FERFIsCisJICAgICAgIC5lbmQgPSBNWDI3X0VNTUFfUFJQX0JBU0VfQUREUiArIDB4MWYsCisJICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkgICAgICAgLnN0YXJ0ID0gTVgyN19JTlRfQ1NJLAorCSAgICAgICAuZW5kID0gTVgyN19JTlRfQ1NJLAorCSAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LHsKKwkgICAgICAgLnN0YXJ0ID0gTVgyN19JTlRfRU1NQVBSUCwKKwkgICAgICAgLmVuZCA9IE1YMjdfSU5UX0VNTUFQUlAsCisJICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9Oworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI3X2NhbWVyYV9kZXZpY2UgPSB7CisJLm5hbWUgPSAibXgyLWNhbWVyYSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXgyN19jYW1lcmFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteDI3X2NhbWVyYV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorfTsKKyNlbmRpZgorCisvKgorICogR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisgKiAtIGkuTVgyMTogMyB0aW1lcnMKKyAqIC0gaS5NWDI3OiA2IHRpbWVycworICovCisjZGVmaW5lIERFRklORV9JTVhfR1BUX0RFVklDRShuLCBiYXNlYWRkciwgaXJxKQkJCQlcCisJc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0aW1lciAjIyBuICMjX3Jlc291cmNlc1tdID0gewkJXAorCQl7CQkJCQkJCVwKKwkJCS5zdGFydCA9IGJhc2VhZGRyLAkJCQlcCisJCQkuZW5kID0gYmFzZWFkZHIgKyBTWl80SyAtIDEsCQkJXAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCQkJXAorCQl9LCB7CQkJCQkJCVwKKwkJCS5zdGFydCA9IGlycSwJCQkJCVwKKwkJCS5lbmQgPSBpcnEsCQkJCQlcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwJCQlcCisJCX0JCQkJCQkJXAorCX07CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0ICMjIG4gPSB7CQkJCVwKKwkJLm5hbWUgPSAiaW14X2dwdCIsCQkJCQlcCisJCS5pZCA9IG4sCQkJCQkJXAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodGltZXIgIyMgbiAjIyBfcmVzb3VyY2VzKSwJXAorCQkucmVzb3VyY2UgPSB0aW1lciAjIyBuICMjIF9yZXNvdXJjZXMsCQkJXAorCX0KKworLyogV2UgdXNlIGdwdDEgYXMgc3lzdGVtIHRpbWVyLCBzbyBkbyBub3QgYWRkIGEgZGV2aWNlIGZvciB0aGlzIG9uZSAqLworREVGSU5FX0lNWF9HUFRfREVWSUNFKDEsIE1YMnhfR1BUMl9CQVNFX0FERFIsIE1YMnhfSU5UX0dQVDIpOworREVGSU5FX0lNWF9HUFRfREVWSUNFKDIsIE1YMnhfR1BUM19CQVNFX0FERFIsIE1YMnhfSU5UX0dQVDMpOworCisjaWZkZWYgQ09ORklHX01BQ0hfTVgyNworREVGSU5FX0lNWF9HUFRfREVWSUNFKDMsIE1YMjdfR1BUNF9CQVNFX0FERFIsIE1YMjdfSU5UX0dQVDQpOworREVGSU5FX0lNWF9HUFRfREVWSUNFKDQsIE1YMjdfR1BUNV9CQVNFX0FERFIsIE1YMjdfSU5UX0dQVDUpOworREVGSU5FX0lNWF9HUFRfREVWSUNFKDUsIE1YMjdfR1BUNl9CQVNFX0FERFIsIE1YMjdfSU5UX0dQVDYpOworI2VuZGlmCisKKy8qIFdhdGNoZG9nOiBpLk1YMSBoYXMgc2VwZXJhdGUgZHJpdmVyLCBpLk1YMjEgYW5kIGkuTVgyNyBhcmUgZXF1YWwgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3dkdF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IE1YMnhfV0RPR19CQVNFX0FERFIsCisJCS5lbmQgPSBNWDJ4X1dET0dfQkFTRV9BRERSICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfd2R0ID0geworCS5uYW1lID0gImlteDItd2R0IiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfd2R0X3Jlc291cmNlcyksCisJLnJlc291cmNlID0gbXhjX3dkdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y193MV9tYXN0ZXJfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBNWDJ4X09XSVJFX0JBU0VfQUREUiwKKwkJLmVuZCA9IE1YMnhfT1dJUkVfQkFTRV9BRERSICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdzFfbWFzdGVyX2RldmljZSA9IHsKKwkubmFtZSA9ICJteGNfdzEiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y193MV9tYXN0ZXJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfdzFfbWFzdGVyX3Jlc291cmNlcywKK307CisKKy8qCisgKiBsY2RjOgorICogLSBpLk1YMTogdGhlIGJhc2ljIGNvbnRyb2xsZXIKKyAqIC0gaS5NWDIxOiB0byBiZSBjaGVja2VkCisgKiAtIGkuTVgyNzogbGlrZSBpLk1YMSwgd2l0aCBzbGlnaHRseSB2YXJpYXRpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX2ZiW10gPSB7CisJeworCQkuc3RhcnQgPSBNWDJ4X0xDRENfQkFTRV9BRERSLAorCQkuZW5kID0gTVgyeF9MQ0RDX0JBU0VfQUREUiArIFNaXzRLIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQgPSBNWDJ4X0lOVF9MQ0RDLAorCQkuZW5kID0gTVgyeF9JTlRfTENEQywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworLyogbXhjIGxjZCBkcml2ZXIgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2ZiX2RldmljZSA9IHsKKwkubmFtZSA9ICJpbXgtZmIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19mYiksCisJLnJlc291cmNlID0gbXhjX2ZiLAorCS5kZXYgPSB7CisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisKKyNpZmRlZiBDT05GSUdfTUFDSF9NWDI3CitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19mZWNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBNWDI3X0ZFQ19CQVNFX0FERFIsCisJCS5lbmQgPSBNWDI3X0ZFQ19CQVNFX0FERFIgKyBTWl80SyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gTVgyN19JTlRfRkVDLAorCQkuZW5kID0gTVgyN19JTlRfRkVDLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZmVjX2RldmljZSA9IHsKKwkubmFtZSA9ICJmZWMiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19mZWNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfZmVjX3Jlc291cmNlcywKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfcHdtX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gTVgyeF9QV01fQkFTRV9BRERSLAorCQkuZW5kID0gTVgyeF9QV01fQkFTRV9BRERSICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydCA9IE1YMnhfSU5UX1BXTSwKKwkJLmVuZCA9IE1YMnhfSU5UX1BXTSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfcHdtX2RldmljZSA9IHsKKwkubmFtZSA9ICJteGNfcHdtIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfcHdtX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gbXhjX3B3bV9yZXNvdXJjZXMsCit9OworCisjZGVmaW5lIERFRklORV9NWENfTU1DX0RFVklDRShuLCBiYXNlYWRkciwgaXJxLCBkbWFyZXEpCQkJXAorCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3NkaGNfcmVzb3VyY2VzICMjIG5bXSA9IHsJCVwKKwkJewkJCQkJCQlcCisJCQkuc3RhcnQgPSBiYXNlYWRkciwJCQkJXAorCQkJLmVuZCA9IGJhc2VhZGRyICsgU1pfNEsgLSAxLAkJCVwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAkJCVwKKwkJfSwgewkJCQkJCQlcCisJCQkuc3RhcnQgPSBpcnEsCQkJCQlcCisJCQkuZW5kID0gaXJxLAkJCQkJXAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCQkJXAorCQl9LCB7CQkJCQkJCVwKKwkJCS5zdGFydCA9IGRtYXJlcSwJCQkJXAorCQkJLmVuZCA9IGRtYXJlcSwJCQkJCVwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAkJCVwKKwkJfSwJCQkJCQkJXAorCX07CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJc3RhdGljIHU2NCBteGNfc2RoYyAjIyBuICMjIF9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsJXAorCQkJCQkJCQkJXAorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NkaGNfZGV2aWNlICMjIG4gPSB7CQkJXAorCQkubmFtZSA9ICJteGMtbW1jIiwJCQkJCVwKKwkJLmlkID0gbiwJCQkJCQlcCisJCS5kZXYgPSB7CQkJCQkJXAorCQkJLmRtYV9tYXNrID0gJm14Y19zZGhjICMjIG4gIyMgX2RtYW1hc2ssCQlcCisJCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAkJXAorCQl9LAkJCQkJCQlcCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfc2RoY19yZXNvdXJjZXMgIyMgbiksCVwKKwkJLnJlc291cmNlID0gbXhjX3NkaGNfcmVzb3VyY2VzICMjIG4sCQlcCisJfQorCitERUZJTkVfTVhDX01NQ19ERVZJQ0UoMCwgTVgyeF9TREhDMV9CQVNFX0FERFIsIE1YMnhfSU5UX1NESEMxLCBNWDJ4X0RNQV9SRVFfU0RIQzEpOworREVGSU5FX01YQ19NTUNfREVWSUNFKDEsIE1YMnhfU0RIQzJfQkFTRV9BRERSLCBNWDJ4X0lOVF9TREhDMiwgTVgyeF9ETUFfUkVRX1NESEMyKTsKKworI2lmZGVmIENPTkZJR19NQUNIX01YMjcKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3RnX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gTVgyN19VU0JPVEdfQkFTRV9BRERSLAorCQkuZW5kID0gTVgyN19VU0JPVEdfQkFTRV9BRERSICsgMHgxZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gTVgyN19JTlRfVVNCMywKKwkJLmVuZCA9IE1YMjdfSU5UX1VTQjMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IG90Z19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworLyogT1RHIGdhZGdldCBkZXZpY2UgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX290Z191ZGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJmc2wtdXNiMi11ZGMiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZvdGdfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5yZXNvdXJjZQk9IG90Z19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG90Z19yZXNvdXJjZXMpLAorfTsKKworLyogT1RHIGhvc3QgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX290Z19ob3N0ID0geworCS5uYW1lID0gIm14Yy1laGNpIiwKKwkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJCS5kbWFfbWFzayA9ICZvdGdfZG1hbWFzaywKKwl9LAorCS5yZXNvdXJjZSA9IG90Z19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG90Z19yZXNvdXJjZXMpLAorfTsKKworLyogVVNCIGhvc3QgMSAqLworCitzdGF0aWMgdTY0IHVzYmgxX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y191c2JoMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IE1YMjdfVVNCT1RHX0JBU0VfQUREUiArIDB4MjAwLAorCQkuZW5kID0gTVgyN19VU0JPVEdfQkFTRV9BRERSICsgMHgzZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gTVgyN19JTlRfVVNCMSwKKwkJLmVuZCA9IE1YMjdfSU5UX1VTQjEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMSA9IHsKKwkubmFtZSA9ICJteGMtZWhjaSIsCisJLmlkID0gMSwKKwkuZGV2ID0geworCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCQkuZG1hX21hc2sgPSAmdXNiaDFfZG1hbWFzaywKKwl9LAorCS5yZXNvdXJjZSA9IG14Y191c2JoMV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y191c2JoMV9yZXNvdXJjZXMpLAorfTsKKworLyogVVNCIGhvc3QgMiAqLworc3RhdGljIHU2NCB1c2JoMl9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfdXNiaDJfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBNWDI3X1VTQk9UR19CQVNFX0FERFIgKyAweDQwMCwKKwkJLmVuZCA9IE1YMjdfVVNCT1RHX0JBU0VfQUREUiArIDB4NWZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydCA9IE1YMjdfSU5UX1VTQjIsCisJCS5lbmQgPSBNWDI3X0lOVF9VU0IyLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDIgPSB7CisJLm5hbWUgPSAibXhjLWVoY2kiLAorCS5pZCA9IDIsCisJLmRldiA9IHsKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLmRtYV9tYXNrID0gJnVzYmgyX2RtYW1hc2ssCisJfSwKKwkucmVzb3VyY2UgPSBteGNfdXNiaDJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfdXNiaDJfcmVzb3VyY2VzKSwKK307CisjZW5kaWYKKworI2RlZmluZSBERUZJTkVfSU1YX1NTSV9ETUFSRVMoX25hbWUsIHNzaW4sIHN1ZmZpeCkJCQlcCisJewkJCQkJCQkJXAorCQkubmFtZSA9IF9uYW1lLAkJCQkJCVwKKwkJLnN0YXJ0ID0gTVgyeF9ETUFfUkVRX1NTSSAjIyBzc2luICMjIF8gIyMgc3VmZml4LAlcCisJCS5lbmQgPSBNWDJ4X0RNQV9SRVFfU1NJICMjIHNzaW4gIyMgXyAjIyBzdWZmaXgsCQlcCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAkJCQlcCisJfQorCisjZGVmaW5lIERFRklORV9JTVhfU1NJX0RFVklDRShuLCBzc2luLCBiYXNlYWRkciwgaXJxKQkJCVwKKwlzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF9zc2lfcmVzb3VyY2VzICMjIG5bXSA9IHsJCVwKKwkJewkJCQkJCQlcCisJCQkuc3RhcnQgPSBNWDJ4X1NTSSAjIyBzc2luICMjIF9CQVNFX0FERFIsCVwKKwkJCS5lbmQgPSBNWDJ4X1NTSSAjIyBzc2luICMjIF9CQVNFX0FERFIgKyAweDZmLAlcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwJCQlcCisJCX0sIHsJCQkJCQkJXAorCQkJLnN0YXJ0ID0gTVgyeF9JTlRfU1NJMSwJCQkJXAorCQkJLmVuZCA9IE1YMnhfSU5UX1NTSTEsCQkJCVwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAkJCVwKKwkJfSwJCQkJCQkJXAorCQlERUZJTkVfSU1YX1NTSV9ETUFSRVMoInR4MCIsIHNzaW4sIFRYMCksCQlcCisJCURFRklORV9JTVhfU1NJX0RNQVJFUygicngwIiwgc3NpbiwgUlgwKSwJCVwKKwkJREVGSU5FX0lNWF9TU0lfRE1BUkVTKCJ0eDEiLCBzc2luLCBUWDEpLAkJXAorCQlERUZJTkVfSU1YX1NTSV9ETUFSRVMoInJ4MSIsIHNzaW4sIFJYMSksCQlcCisJfTsJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9zc2lfZGV2aWNlICMjIG4gPSB7CQkJXAorCQkubmFtZSA9ICJpbXgtc3NpIiwJCQkJCVwKKwkJLmlkID0gbiwJCQkJCQlcCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShpbXhfc3NpX3Jlc291cmNlcyAjIyBuKSwJXAorCQkucmVzb3VyY2UgPSBpbXhfc3NpX3Jlc291cmNlcyAjIyBuLAkJCVwKKwl9CisKK0RFRklORV9JTVhfU1NJX0RFVklDRSgwLCAxLCBNWDJ4X1NTSTFfQkFTRV9BRERSLCBNWDJ4X0lOVF9TU0kxKTsKK0RFRklORV9JTVhfU1NJX0RFVklDRSgxLCAyLCBNWDJ4X1NTSTFfQkFTRV9BRERSLCBNWDJ4X0lOVF9TU0kxKTsKKworLyogR1BJTyBwb3J0IGRlc2NyaXB0aW9uICovCisjZGVmaW5lIERFRklORV9NWENfR1BJT19QT1JUX0lSUShTT0MsIG4sIF9pcnEpCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5jaGlwLmxhYmVsID0gImdwaW8tIiAjbiwJCQkJXAorCQkuaXJxID0gX2lycSwJCQkJCQlcCisJCS5iYXNlID0gU09DICMjIF9JT19BRERSRVNTKE1YMnhfR1BJT19CQVNFX0FERFIgKwlcCisJCQkJbiAqIDB4MTAwKSwJCQkJXAorCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBuICogMzIsCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX01YQ19HUElPX1BPUlQoU09DLCBuKQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLmNoaXAubGFiZWwgPSAiZ3Bpby0iICNuLAkJCQlcCisJCS5iYXNlID0gU09DICMjIF9JT19BRERSRVNTKE1YMnhfR1BJT19CQVNFX0FERFIgKwlcCisJCQkJbiAqIDB4MTAwKSwJCQkJXAorCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBuICogMzIsCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX01YQ19HUElPX1BPUlRTKFNPQywgcGZ4KQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCBwZnggIyMgX2dwaW9fcG9ydHNbXSA9IHsJCVwKKwkJREVGSU5FX01YQ19HUElPX1BPUlRfSVJRKFNPQywgMCwgU09DICMjIF9JTlRfR1BJTyksCVwKKwkJREVGSU5FX01YQ19HUElPX1BPUlQoU09DLCAxKSwJCQkJXAorCQlERUZJTkVfTVhDX0dQSU9fUE9SVChTT0MsIDIpLAkJCQlcCisJCURFRklORV9NWENfR1BJT19QT1JUKFNPQywgMyksCQkJCVwKKwkJREVGSU5FX01YQ19HUElPX1BPUlQoU09DLCA0KSwJCQkJXAorCQlERUZJTkVfTVhDX0dQSU9fUE9SVChTT0MsIDUpLAkJCQlcCisJfQorCisjaWZkZWYgQ09ORklHX01BQ0hfTVgyMQorREVGSU5FX01YQ19HUElPX1BPUlRTKE1YMjEsIGlteDIxKTsKKworaW50IF9faW5pdCBpbXgyMV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQoreworCXJldHVybiBteGNfZ3Bpb19pbml0KGlteDIxX2dwaW9fcG9ydHMsIEFSUkFZX1NJWkUoaW14MjFfZ3Bpb19wb3J0cykpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9NWDI3CitERUZJTkVfTVhDX0dQSU9fUE9SVFMoTVgyNywgaW14MjcpOworCitpbnQgX19pbml0IGlteDI3X3JlZ2lzdGVyX2dwaW9zKHZvaWQpCit7CisJcmV0dXJuIG14Y19ncGlvX2luaXQoaW14MjdfZ3Bpb19wb3J0cywgQVJSQVlfU0laRShpbXgyN19ncGlvX3BvcnRzKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX01YMjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXgyMV91c2JoY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IE1YMjFfVVNCT1RHX0JBU0VfQUREUiwKKwkJLmVuZAk9IE1YMjFfVVNCT1RHX0JBU0VfQUREUiArIFNaXzhLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBNWDIxX0lOVF9VU0JIT1NULAorCQkuZW5kCQk9IE1YMjFfSU5UX1VTQkhPU1QsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDIxX3VzYmhjX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaW14MjEtaGNkIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrID0gJm14MjFfdXNiaGNfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShteDIxX3VzYmhjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbXgyMV91c2JoY19yZXNvdXJjZXMsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X2twcF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCAgPSBNWDJ4X0tQUF9CQVNFX0FERFIsCisJCS5lbmQgICAgPSBNWDJ4X0tQUF9CQVNFX0FERFIgKyAweGYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTQorCX0sIHsKKwkJLnN0YXJ0ICA9IE1YMnhfSU5UX0tQUCwKKwkJLmVuZCAgICA9IE1YMnhfSU5UX0tQUCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9rcHBfZGV2aWNlID0geworCS5uYW1lID0gImlteC1rZXlwYWQiLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShpbXhfa3BwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gaW14X2twcF9yZXNvdXJjZXMsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0NTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZmRlZiBDT05GSUdfQVJDSF9NWDEKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteDFfY2FtZXJhX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9ydGNfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3dkdF9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdXNiX2RldmljZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9NWDIxKSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX01YMjcpCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0MTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19ncHQyOworI2lmZGVmIENPTkZJR19NQUNIX01YMjcKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19ncHQzOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2dwdDQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0NTsKKyNlbmRpZgorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3dkdDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y193MV9tYXN0ZXJfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2ZiX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19mZWNfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3B3bV9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc2RoY19kZXZpY2UwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NkaGNfZGV2aWNlMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19vdGdfdWRjX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14MjdfY2FtZXJhX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19vdGdfaG9zdDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14MjFfdXNiaGNfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3NzaV9kZXZpY2UwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3NzaV9kZXZpY2UxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X2twcF9kZXZpY2U7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RtYS12MS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZG1hLXYxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4YzQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RtYS12MS5jCkBAIC0wLDAgKzEsODYyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtbXhjL2RtYS12MS5jCisgKgorICogIGkuTVggRE1BIHJlZ2lzdHJhdGlvbiBhbmQgSVJRIGRpc3BhdGNoaW5nCisgKgorICogQ29weXJpZ2h0IDIwMDYgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgorICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgorICogQ29weXJpZ2h0IDIwMDggU2FzY2hhIEhhdWVyLCA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEtdjEuaD4KKworI2RlZmluZSBETUFfRENSICAgICAweDAwCQkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9ESVNSICAgIDB4MDQJCS8qIEludGVycnVwdCBzdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0RJTVIgICAgMHgwOAkJLyogSW50ZXJydXB0IG1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0RCVE9TUiAgMHgwYwkJLyogQnVyc3QgdGltZW91dCBzdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0RSVE9TUiAgMHgxMAkJLyogUmVxdWVzdCB0aW1lb3V0IFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9EU0VTUiAgIDB4MTQJCS8qIFRyYW5zZmVyIEVycm9yIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBETUFfREJPU1IgICAweDE4CQkvKiBCdWZmZXIgb3ZlcmZsb3cgc3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9EQlRPQ1IgIDB4MWMJCS8qIEJ1cnN0IHRpbWVvdXQgY29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfV1NSQSAgICAweDQwCQkvKiBXLVNpemUgUmVnaXN0ZXIgQSAqLworI2RlZmluZSBETUFfWFNSQSAgICAweDQ0CQkvKiBYLVNpemUgUmVnaXN0ZXIgQSAqLworI2RlZmluZSBETUFfWVNSQSAgICAweDQ4CQkvKiBZLVNpemUgUmVnaXN0ZXIgQSAqLworI2RlZmluZSBETUFfV1NSQiAgICAweDRjCQkvKiBXLVNpemUgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBETUFfWFNSQiAgICAweDUwCQkvKiBYLVNpemUgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBETUFfWVNSQiAgICAweDU0CQkvKiBZLVNpemUgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBETUFfU0FSKHgpICAoMHg4MCArICgoeCkgPDwgNikpCS8qIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfREFSKHgpICAoMHg4NCArICgoeCkgPDwgNikpCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXJzICovCisjZGVmaW5lIERNQV9DTlRSKHgpICgweDg4ICsgKCh4KSA8PCA2KSkJLyogQ291bnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIERNQV9DQ1IoeCkgICgweDhjICsgKCh4KSA8PCA2KSkJLyogQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BX1JTU1IoeCkgKDB4OTAgKyAoKHgpIDw8IDYpKQkvKiBSZXF1ZXN0IHNvdXJjZSBzZWxlY3QgUmVnaXN0ZXJzICovCisjZGVmaW5lIERNQV9CTFIoeCkgICgweDk0ICsgKCh4KSA8PCA2KSkJLyogQnVyc3QgbGVuZ3RoIFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfUlRPUih4KSAoMHg5OCArICgoeCkgPDwgNikpCS8qIFJlcXVlc3QgdGltZW91dCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BX0JVQ1IoeCkgKDB4OTggKyAoKHgpIDw8IDYpKQkvKiBCdXMgVXRpbGl6YXRpb24gUmVnaXN0ZXJzICovCisjZGVmaW5lIERNQV9DQ05SKHgpICgweDlDICsgKCh4KSA8PCA2KSkJLyogQ2hhbm5lbCBjb3VudGVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIERDUl9EUlNUICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgRENSX0RFTiAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBEQlRPQ1JfRU4gICAgICAgICAgKDE8PDE1KQorI2RlZmluZSBEQlRPQ1JfQ05UKHgpICAgICAgKCh4KSAmIDB4N2ZmZikKKyNkZWZpbmUgQ05UUl9DTlQoeCkgICAgICAgICgoeCkgJiAweGZmZmZmZikKKyNkZWZpbmUgQ0NSX0FDUlBUICAgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgQ0NSX0RNT0RfTElORUFSICAgICgweDAgPDwgMTIpCisjZGVmaW5lIENDUl9ETU9EXzJEICAgICAgICAoMHgxIDw8IDEyKQorI2RlZmluZSBDQ1JfRE1PRF9GSUZPICAgICAgKDB4MiA8PCAxMikKKyNkZWZpbmUgQ0NSX0RNT0RfRU9CRklGTyAgICgweDMgPDwgMTIpCisjZGVmaW5lIENDUl9TTU9EX0xJTkVBUiAgICAoMHgwIDw8IDEwKQorI2RlZmluZSBDQ1JfU01PRF8yRCAgICAgICAgKDB4MSA8PCAxMCkKKyNkZWZpbmUgQ0NSX1NNT0RfRklGTyAgICAgICgweDIgPDwgMTApCisjZGVmaW5lIENDUl9TTU9EX0VPQkZJRk8gICAoMHgzIDw8IDEwKQorI2RlZmluZSBDQ1JfTURJUl9ERUMgICAgICAgKDE8PDkpCisjZGVmaW5lIENDUl9NU0VMX0IgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgQ0NSX0RTSVpfMzIgICAgICAgICgweDAgPDwgNikKKyNkZWZpbmUgQ0NSX0RTSVpfOCAgICAgICAgICgweDEgPDwgNikKKyNkZWZpbmUgQ0NSX0RTSVpfMTYgICAgICAgICgweDIgPDwgNikKKyNkZWZpbmUgQ0NSX1NTSVpfMzIgICAgICAgICgweDAgPDwgNCkKKyNkZWZpbmUgQ0NSX1NTSVpfOCAgICAgICAgICgweDEgPDwgNCkKKyNkZWZpbmUgQ0NSX1NTSVpfMTYgICAgICAgICgweDIgPDwgNCkKKyNkZWZpbmUgQ0NSX1JFTiAgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBDQ1JfUlBUICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIENDUl9GUkMgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgQ0NSX0NFTiAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBSVE9SX0VOICAgICAgICAgICAgKDE8PDE1KQorI2RlZmluZSBSVE9SX0NMSyAgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBSVE9SX1BTQyAgICAgICAgICAgKDE8PDEzKQorCisvKgorICogc3RydWN0IGlteF9kbWFfY2hhbm5lbCAtIGkuTVggc3BlY2lmaWMgRE1BIGV4dGVuc2lvbgorICogQG5hbWU6IG5hbWUgc3BlY2lmaWVkIGJ5IERNQSBjbGllbnQKKyAqIEBpcnFfaGFuZGxlcjogY2xpZW50IGNhbGxiYWNrIGZvciBlbmQgb2YgdHJhbnNmZXIKKyAqIEBlcnJfaGFuZGxlcjogY2xpZW50IGNhbGxiYWNrIGZvciBlcnJvciBjb25kaXRpb24KKyAqIEBkYXRhOiBjbGllbnRzIGNvbnRleHQgZGF0YSBmb3IgY2FsbGJhY2tzCisgKiBAZG1hX21vZGU6IGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXIgJURNQV9NT0RFX1JFQUQgb3IgJURNQV9NT0RFX1dSSVRFCisgKiBAc2c6IHBvaW50ZXIgdG8gdGhlIGFjdHVhbCByZWFkL3dyaXR0ZW4gY2h1bmsgZm9yIHNjYXR0ZXItZ2F0aGVyIGVtdWxhdGlvbgorICogQHJlc2J5dGVzOiB0b3RhbCByZXNpZHVhbCBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqICAgICAgICAgICAgKGl0IGNhbiBiZSBsb3dlciBvciBzYW1lIGFzIHN1bSBvZiBTRyBtYXBwZWQgY2h1bmsgc2l6ZXMpCisgKiBAc2djb3VudDogbnVtYmVyIG9mIGNodW5rcyB0byBiZSByZWFkL3dyaXR0ZW4KKyAqCisgKiBTdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgSU1YIERNQSBwcm9jZXNzaW5nLiBJdCB3b3VsZCBiZSBwcm9iYWJseSBnb29kCisgKiBAc3RydWN0IGRtYV9zdHJ1Y3QgaW4gdGhlIGZ1dHVyZSBmb3IgZXh0ZXJuYWwgaW50ZXJmYWNpbmcgYW5kIHVzZQorICogQHN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgb25seSBhcyBleHRlbnNpb24gdG8gaXQuCisgKi8KKworc3RydWN0IGlteF9kbWFfY2hhbm5lbCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKik7CisJdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIGludCBlcnJjb2RlKTsKKwl2b2lkICgqcHJvZ19oYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBzY2F0dGVybGlzdCAqKTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBkbWFfbW9kZTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCByZXNieXRlczsKKwlpbnQgZG1hX251bTsKKworCWludCBpbl91c2U7CisKKwl1MzIgY2NyX2Zyb21fZGV2aWNlOworCXUzMiBjY3JfdG9fZGV2aWNlOworCisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2c7CisKKwlpbnQgaHdfY2hhaW5pbmc7Cit9OworCitzdGF0aWMgdm9pZCBfX2lvbWVtICppbXhfZG1hdjFfYmFzZWFkZHI7CisKK3N0YXRpYyB2b2lkIGlteF9kbWF2MV93cml0ZWwodW5zaWduZWQgdmFsLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgaW14X2RtYXYxX2Jhc2VhZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGlteF9kbWF2MV9yZWFkbCh1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGlteF9kbWF2MV9iYXNlYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2RtYV9jaGFubmVsIGlteF9kbWFfY2hhbm5lbHNbSU1YX0RNQV9DSEFOTkVMU107CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpkbWFfY2xrOworCitzdGF0aWMgaW50IGlteF9kbWFfaHdfY2hhaW4oc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hKQoreworCWlmIChjcHVfaXNfbXgyNygpKQorCQlyZXR1cm4gaW14ZG1hLT5od19jaGFpbmluZzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogaW14X2RtYV9zZ19uZXh0IC0gcHJlcGFyZSBuZXh0IGNodW5rIGZvciBzY2F0dGVyLWdhdGhlciBETUEgZW11bGF0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlteF9kbWFfc2dfbmV4dChpbnQgY2hhbm5lbCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub3QgYWxsb2NhdGVkIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXJldHVybiAwOworCX0KKworCW5vdyA9IG1pbihpbXhkbWEtPnJlc2J5dGVzLCBzZy0+bGVuZ3RoKTsKKwlpZiAoaW14ZG1hLT5yZXNieXRlcyAhPSBJTVhfRE1BX0xFTkdUSF9MT09QKQorCQlpbXhkbWEtPnJlc2J5dGVzIC09IG5vdzsKKworCWlmICgoaW14ZG1hLT5kbWFfbW9kZSAmIERNQV9NT0RFX01BU0spID09IERNQV9NT0RFX1JFQUQpCisJCWlteF9kbWF2MV93cml0ZWwoc2ctPmRtYV9hZGRyZXNzLCBETUFfREFSKGNoYW5uZWwpKTsKKwllbHNlCisJCWlteF9kbWF2MV93cml0ZWwoc2ctPmRtYV9hZGRyZXNzLCBETUFfU0FSKGNoYW5uZWwpKTsKKworCWlteF9kbWF2MV93cml0ZWwobm93LCBETUFfQ05UUihjaGFubmVsKSk7CisKKwlwcl9kZWJ1ZygiaW14ZG1hJWQ6IG5leHQgc2cgY2h1bmsgZHN0IDB4JTA4eCwgc3JjIDB4JTA4eCwgIgorCQkic2l6ZSAweCUwOHhcbiIsIGNoYW5uZWwsCisJCSBpbXhfZG1hdjFfcmVhZGwoRE1BX0RBUihjaGFubmVsKSksCisJCSBpbXhfZG1hdjFfcmVhZGwoRE1BX1NBUihjaGFubmVsKSksCisJCSBpbXhfZG1hdjFfcmVhZGwoRE1BX0NOVFIoY2hhbm5lbCkpKTsKKworCXJldHVybiBub3c7Cit9CisKKy8qKgorICogaW14X2RtYV9zZXR1cF9zaW5nbGUgLSBzZXR1cCBpLk1YIERNQSBjaGFubmVsIGZvciBsaW5lYXIgbWVtb3J5IHRvL2Zyb20KKyAqIGRldmljZSB0cmFuc2ZlcgorICoKKyAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgorICogQGRtYV9hZGRyZXNzOiB0aGUgRE1BL3BoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBsaW5lYXIgZGF0YSBibG9jaworICoJCXRvIHRyYW5zZmVyCisgKiBAZG1hX2xlbmd0aDogbGVuZ3RoIG9mIHRoZSBkYXRhIGJsb2NrIGluIGJ5dGVzCisgKiBAZGV2X2FkZHI6IHBoeXNpY2FsIGRldmljZSBwb3J0IGFkZHJlc3MKKyAqIEBkbWFtb2RlOiBETUEgdHJhbnNmZXIgbW9kZSwgJURNQV9NT0RFX1JFQUQgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBtZW1vcnkKKyAqICAgICAgICAgICBvciAlRE1BX01PREVfV1JJVEUgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZQorICoKKyAqIFJldHVybiB2YWx1ZTogaWYgaW5jb3JyZWN0IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIC0lRUlOVkFMLgorICoJCVplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludAoraW14X2RtYV9zZXR1cF9zaW5nbGUoaW50IGNoYW5uZWwsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsCisJCSAgICAgdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsIHVuc2lnbmVkIGludCBkZXZfYWRkciwKKwkJICAgICB1bnNpZ25lZCBpbnQgZG1hbW9kZSkKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKworCWlteGRtYS0+c2cgPSBOVUxMOworCWlteGRtYS0+ZG1hX21vZGUgPSBkbWFtb2RlOworCisJaWYgKCFkbWFfYWRkcmVzcykgeworCQlwcmludGsoS0VSTl9FUlIgImlteGRtYSVkOiBpbXhfZG1hX3NldHVwX3NpbmdsZSBudWxsIGFkZHJlc3NcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFkbWFfbGVuZ3RoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2luZ2xlIHplcm8gbGVuZ3RoXG4iLAorCQkgICAgICAgY2hhbm5lbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoZG1hbW9kZSAmIERNQV9NT0RFX01BU0spID09IERNQV9NT0RFX1JFQUQpIHsKKwkJcHJfZGVidWcoImlteGRtYSVkOiAlcyBkbWFfYWRkcmVzc2c9MHglMDh4IGRtYV9sZW5ndGg9JWQgIgorCQkJImRldl9hZGRyPTB4JTA4eCBmb3IgcmVhZFxuIiwKKwkJCWNoYW5uZWwsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KWRtYV9hZGRyZXNzLAorCQkJZG1hX2xlbmd0aCwgZGV2X2FkZHIpOworCisJCWlteF9kbWF2MV93cml0ZWwoZGV2X2FkZHIsIERNQV9TQVIoY2hhbm5lbCkpOworCQlpbXhfZG1hdjFfd3JpdGVsKGRtYV9hZGRyZXNzLCBETUFfREFSKGNoYW5uZWwpKTsKKwkJaW14X2RtYXYxX3dyaXRlbChpbXhkbWEtPmNjcl9mcm9tX2RldmljZSwgRE1BX0NDUihjaGFubmVsKSk7CisJfSBlbHNlIGlmICgoZG1hbW9kZSAmIERNQV9NT0RFX01BU0spID09IERNQV9NT0RFX1dSSVRFKSB7CisJCXByX2RlYnVnKCJpbXhkbWElZDogJXMgZG1hX2FkZHJlc3NnPTB4JTA4eCBkbWFfbGVuZ3RoPSVkICIKKwkJCSJkZXZfYWRkcj0weCUwOHggZm9yIHdyaXRlXG4iLAorCQkJY2hhbm5lbCwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZG1hX2FkZHJlc3MsCisJCQlkbWFfbGVuZ3RoLCBkZXZfYWRkcik7CisKKwkJaW14X2RtYXYxX3dyaXRlbChkbWFfYWRkcmVzcywgRE1BX1NBUihjaGFubmVsKSk7CisJCWlteF9kbWF2MV93cml0ZWwoZGV2X2FkZHIsIERNQV9EQVIoY2hhbm5lbCkpOworCQlpbXhfZG1hdjFfd3JpdGVsKGlteGRtYS0+Y2NyX3RvX2RldmljZSwKKwkJCQlETUFfQ0NSKGNoYW5uZWwpKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImlteGRtYSVkOiBpbXhfZG1hX3NldHVwX3NpbmdsZSBiYWQgZG1hbW9kZVxuIiwKKwkJICAgICAgIGNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbXhfZG1hdjFfd3JpdGVsKGRtYV9sZW5ndGgsIERNQV9DTlRSKGNoYW5uZWwpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX3NldHVwX3NpbmdsZSk7CisKKy8qKgorICogaW14X2RtYV9zZXR1cF9zZyAtIHNldHVwIGkuTVggRE1BIGNoYW5uZWwgU0cgbGlzdCB0by9mcm9tIGRldmljZSB0cmFuc2ZlcgorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKiBAc2c6IHBvaW50ZXIgdG8gdGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QvdmVjdG9yCisgKiBAc2djb3VudDogc2NhdHRlci1nYXRoZXIgbGlzdCBodW5ncyBjb3VudAorICogQGRtYV9sZW5ndGg6IHRvdGFsIGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgcmVxdWVzdCBpbiBieXRlcworICogQGRldl9hZGRyOiBwaHlzaWNhbCBkZXZpY2UgcG9ydCBhZGRyZXNzCisgKiBAZG1hbW9kZTogRE1BIHRyYW5zZmVyIG1vZGUsICVETUFfTU9ERV9SRUFEIGZyb20gdGhlIGRldmljZSB0byB0aGUgbWVtb3J5CisgKiAgICAgICAgICAgb3IgJURNQV9NT0RFX1dSSVRFIGZyb20gbWVtb3J5IHRvIHRoZSBkZXZpY2UKKyAqCisgKiBUaGUgZnVuY3Rpb24gc2V0cyB1cCBETUEgY2hhbm5lbCBzdGF0ZSBhbmQgcmVnaXN0ZXJzIHRvIGJlIHJlYWR5IGZvcgorICogdHJhbnNmZXIgc3BlY2lmaWVkIGJ5IHByb3ZpZGVkIHBhcmFtZXRlcnMuIFRoZSBzY2F0dGVyLWdhdGhlciBlbXVsYXRpb24KKyAqIGlzIHNldCB1cCBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMuCisgKgorICogVGhlIGZ1bGwgcHJlcGFyYXRpb24gb2YgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIHNldHVwIG9mIG1vcmUgcmVnaXN0ZXIKKyAqIGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGlteF9kbWFfZW5hYmxlKCkgY2FuIGJlIGNhbGxlZC4KKyAqCisgKiAlQkxSKGNoYW5uZWwpIGhvbGRzIHRyYW5zZmVyIGJ1cnN0IGxlbmd0aCBpbiBieXRlcywgMCBtZWFucyA2NCBieXRlcworICoKKyAqICVSU1NSKGNoYW5uZWwpIGhhcyB0byBiZSBzZXQgdG8gdGhlIERNQSByZXF1ZXN0IGxpbmUgc291cmNlICVETUFfUkVRX3h4eAorICoKKyAqICVDQ1IoY2hhbm5lbCkgaGFzIHRvIHNwZWNpZnkgdHJhbnNmZXIgcGFyYW1ldGVycywgdGhlIG5leHQgc2V0dGluZ3MgaXMKKyAqIHR5cGljYWwgZm9yIGxpbmVhciBvciBzaW1wbGUgc2NhdHRlci1nYXRoZXIgdHJhbnNmZXJzIGlmICVETUFfTU9ERV9SRUFEIGlzCisgKiBzcGVjaWZpZWQKKyAqCisgKiAlQ0NSX0RNT0RfTElORUFSIHwgJUNDUl9EU0laXzMyIHwgJUNDUl9TTU9EX0ZJRk8gfCAlQ0NSX1NTSVpfeAorICoKKyAqIFRoZSB0eXBpY2FsIHNldHVwIGZvciAlRE1BX01PREVfV1JJVEUgaXMgc3BlY2lmaWVkIGJ5IG5leHQgb3B0aW9ucworICogY29tYmluYXRpb24KKyAqCisgKiAlQ0NSX1NNT0RfTElORUFSIHwgJUNDUl9TU0laXzMyIHwgJUNDUl9ETU9EX0ZJRk8gfCAlQ0NSX0RTSVpfeAorICoKKyAqIEJlIGNhcmVmdWwgaGVyZSBhbmQgZG8gbm90IG1pc3Rha2VubHkgbWl4IHNvdXJjZSBhbmQgdGFyZ2V0IGRldmljZQorICogcG9ydCBzaXplcyBjb25zdGFudHMsIHRoZXkgYXJlIHJlYWxseSBkaWZmZXJlbnQ6CisgKiAlQ0NSX1NTSVpfOCwgJUNDUl9TU0laXzE2LCAlQ0NSX1NTSVpfMzIsCisgKiAlQ0NSX0RTSVpfOCwgJUNDUl9EU0laXzE2LCAlQ0NSX0RTSVpfMzIKKyAqCisgKiBSZXR1cm4gdmFsdWU6IGlmIGluY29ycmVjdCBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCAtJUVJTlZBTC4KKyAqIFplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludAoraW14X2RtYV9zZXR1cF9zZyhpbnQgY2hhbm5lbCwKKwkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBzZ2NvdW50LAorCQkgdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsIHVuc2lnbmVkIGludCBkZXZfYWRkciwKKwkJIHVuc2lnbmVkIGludCBkbWFtb2RlKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOworCisJaWYgKGlteGRtYS0+aW5fdXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJaW14ZG1hLT5zZyA9IHNnOworCWlteGRtYS0+ZG1hX21vZGUgPSBkbWFtb2RlOworCWlteGRtYS0+cmVzYnl0ZXMgPSBkbWFfbGVuZ3RoOworCisJaWYgKCFzZyB8fCAhc2djb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgImlteGRtYSVkOiBpbXhfZG1hX3NldHVwX3NnIGVtcHR5IHNnIGxpc3RcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFzZy0+bGVuZ3RoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2cgemVybyBsZW5ndGhcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChkbWFtb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfUkVBRCkgeworCQlwcl9kZWJ1ZygiaW14ZG1hJWQ6ICVzIHNnPSVwIHNnY291bnQ9JWQgdG90YWwgbGVuZ3RoPSVkICIKKwkJCSJkZXZfYWRkcj0weCUwOHggZm9yIHJlYWRcbiIsCisJCQljaGFubmVsLCBfX2Z1bmNfXywgc2csIHNnY291bnQsIGRtYV9sZW5ndGgsIGRldl9hZGRyKTsKKworCQlpbXhfZG1hdjFfd3JpdGVsKGRldl9hZGRyLCBETUFfU0FSKGNoYW5uZWwpKTsKKwkJaW14X2RtYXYxX3dyaXRlbChpbXhkbWEtPmNjcl9mcm9tX2RldmljZSwgRE1BX0NDUihjaGFubmVsKSk7CisJfSBlbHNlIGlmICgoZG1hbW9kZSAmIERNQV9NT0RFX01BU0spID09IERNQV9NT0RFX1dSSVRFKSB7CisJCXByX2RlYnVnKCJpbXhkbWElZDogJXMgc2c9JXAgc2djb3VudD0lZCB0b3RhbCBsZW5ndGg9JWQgIgorCQkJImRldl9hZGRyPTB4JTA4eCBmb3Igd3JpdGVcbiIsCisJCQljaGFubmVsLCBfX2Z1bmNfXywgc2csIHNnY291bnQsIGRtYV9sZW5ndGgsIGRldl9hZGRyKTsKKworCQlpbXhfZG1hdjFfd3JpdGVsKGRldl9hZGRyLCBETUFfREFSKGNoYW5uZWwpKTsKKwkJaW14X2RtYXYxX3dyaXRlbChpbXhkbWEtPmNjcl90b19kZXZpY2UsIERNQV9DQ1IoY2hhbm5lbCkpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2cgYmFkIGRtYW1vZGVcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW14X2RtYV9zZ19uZXh0KGNoYW5uZWwsIHNnKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX3NldHVwX3NnKTsKKworaW50CitpbXhfZG1hX2NvbmZpZ19jaGFubmVsKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgY29uZmlnX3BvcnQsCisJdW5zaWduZWQgaW50IGNvbmZpZ19tZW0sIHVuc2lnbmVkIGludCBkbWFyZXEsIGludCBod19jaGFpbmluZykKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1MzIgZHJlcSA9IDA7CisKKwlpbXhkbWEtPmh3X2NoYWluaW5nID0gMDsKKworCWlmIChod19jaGFpbmluZykgeworCQlpbXhkbWEtPmh3X2NoYWluaW5nID0gMTsKKwkJaWYgKCFpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZG1hcmVxKQorCQlkcmVxID0gQ0NSX1JFTjsKKworCWlteGRtYS0+Y2NyX2Zyb21fZGV2aWNlID0gY29uZmlnX3BvcnQgfCAoY29uZmlnX21lbSA8PCAyKSB8IGRyZXE7CisJaW14ZG1hLT5jY3JfdG9fZGV2aWNlID0gY29uZmlnX21lbSB8IChjb25maWdfcG9ydCA8PCAyKSB8IGRyZXE7CisKKwlpbXhfZG1hdjFfd3JpdGVsKGRtYXJlcSwgRE1BX1JTU1IoY2hhbm5lbCkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfY29uZmlnX2NoYW5uZWwpOworCit2b2lkIGlteF9kbWFfY29uZmlnX2J1cnN0bGVuKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgYnVyc3RsZW4pCit7CisJaW14X2RtYXYxX3dyaXRlbChidXJzdGxlbiwgRE1BX0JMUihjaGFubmVsKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfY29uZmlnX2J1cnN0bGVuKTsKKworLyoqCisgKiBpbXhfZG1hX3NldHVwX2hhbmRsZXJzIC0gc2V0dXAgaS5NWCBETUEgY2hhbm5lbCBlbmQgYW5kIGVycm9yIG5vdGlmaWNhdGlvbgorICogaGFuZGxlcnMKKyAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgorICogQGlycV9oYW5kbGVyOiB0aGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY2FsbGVkIGlmIHRoZSB0cmFuc2ZlcgorICoJCWVuZHMgc3VjY2Vzc2Z1bGx5CisgKiBAZXJyX2hhbmRsZXI6IHRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBjYWxsZWQgaWYgdGhlIHByZW1hdHVyZQorICoJCWVuZCBjYXVzZWQgYnkgZXJyb3Igb2NjdXJzCisgKiBAZGF0YTogdXNlciBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVycworICovCitpbnQKK2lteF9kbWFfc2V0dXBfaGFuZGxlcnMoaW50IGNoYW5uZWwsCisJCSAgICAgICB2b2lkICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKiksCisJCSAgICAgICB2b2lkICgqZXJyX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgaW50KSwKKwkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub3QgYWxsb2NhdGVkIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpbXhfZG1hdjFfd3JpdGVsKDEgPDwgY2hhbm5lbCwgRE1BX0RJU1IpOworCWlteGRtYS0+aXJxX2hhbmRsZXIgPSBpcnFfaGFuZGxlcjsKKwlpbXhkbWEtPmVycl9oYW5kbGVyID0gZXJyX2hhbmRsZXI7CisJaW14ZG1hLT5kYXRhID0gZGF0YTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfc2V0dXBfaGFuZGxlcnMpOworCisvKioKKyAqIGlteF9kbWFfc2V0dXBfcHJvZ3Jlc3Npb25faGFuZGxlciAtIHNldHVwIGkuTVggRE1BIGNoYW5uZWwgcHJvZ3Jlc3Npb24KKyAqIGhhbmRsZXJzCisgKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKKyAqIEBwcm9nX2hhbmRsZXI6IHRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBjYWxsZWQgaWYgdGhlIHRyYW5zZmVyIHByb2dyZXNzZXMKKyAqLworaW50CitpbXhfZG1hX3NldHVwX3Byb2dyZXNzaW9uX2hhbmRsZXIoaW50IGNoYW5uZWwsCisJCQl2b2lkICgqcHJvZ19oYW5kbGVyKSAoaW50LCB2b2lkKiwgc3RydWN0IHNjYXR0ZXJsaXN0KikpCit7CisJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub3QgYWxsb2NhdGVkIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpbXhkbWEtPnByb2dfaGFuZGxlciA9IHByb2dfaGFuZGxlcjsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfc2V0dXBfcHJvZ3Jlc3Npb25faGFuZGxlcik7CisKKy8qKgorICogaW14X2RtYV9lbmFibGUgLSBmdW5jdGlvbiB0byBzdGFydCBpLk1YIERNQSBjaGFubmVsIG9wZXJhdGlvbgorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKgorICogVGhlIGNoYW5uZWwgaGFzIHRvIGJlIGFsbG9jYXRlZCBieSBkcml2ZXIgdGhyb3VnaCBpbXhfZG1hX3JlcXVlc3QoKQorICogb3IgaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8oKSBmdW5jdGlvbi4KKyAqIFRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzIGhhcyB0byBiZSBzZXQgdG8gdGhlIGNoYW5uZWwgcmVnaXN0ZXJzIHRocm91Z2gKKyAqIGNhbGwgb2YgdGhlIGlteF9kbWFfc2V0dXBfc2luZ2xlKCkgb3IgaW14X2RtYV9zZXR1cF9zZygpIGZ1bmN0aW9uCisgKiBhbmQgcmVnaXN0ZXJzICVCTFIoY2hhbm5lbCksICVSU1NSKGNoYW5uZWwpIGFuZCAlQ0NSKGNoYW5uZWwpIGhhcyB0bworICogYmUgc2V0IHByaW9yIHRoaXMgZnVuY3Rpb24gY2FsbCBieSB0aGUgY2hhbm5lbCB1c2VyLgorICovCit2b2lkIGlteF9kbWFfZW5hYmxlKGludCBjaGFubmVsKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiaW14ZG1hJWQ6IGlteF9kbWFfZW5hYmxlXG4iLCBjaGFubmVsKTsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub3QgYWxsb2NhdGVkIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW14ZG1hLT5pbl91c2UpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlteF9kbWF2MV93cml0ZWwoMSA8PCBjaGFubmVsLCBETUFfRElTUik7CisJaW14X2RtYXYxX3dyaXRlbChpbXhfZG1hdjFfcmVhZGwoRE1BX0RJTVIpICYgfigxIDw8IGNoYW5uZWwpLCBETUFfRElNUik7CisJaW14X2RtYXYxX3dyaXRlbChpbXhfZG1hdjFfcmVhZGwoRE1BX0NDUihjaGFubmVsKSkgfCBDQ1JfQ0VOIHwKKwkJQ0NSX0FDUlBULCBETUFfQ0NSKGNoYW5uZWwpKTsKKworI2lmZGVmIENPTkZJR19BUkNIX01YMgorCWlmICgoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKSAmJgorCQkJaW14ZG1hLT5zZyAmJiBpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpIHsKKwkJaW14ZG1hLT5zZyA9IHNnX25leHQoaW14ZG1hLT5zZyk7CisJCWlmIChpbXhkbWEtPnNnKSB7CisJCQl1MzIgdG1wOworCQkJaW14X2RtYV9zZ19uZXh0KGNoYW5uZWwsIGlteGRtYS0+c2cpOworCQkJdG1wID0gaW14X2RtYXYxX3JlYWRsKERNQV9DQ1IoY2hhbm5lbCkpOworCQkJaW14X2RtYXYxX3dyaXRlbCh0bXAgfCBDQ1JfUlBUIHwgQ0NSX0FDUlBULAorCQkJCURNQV9DQ1IoY2hhbm5lbCkpOworCQl9CisJfQorI2VuZGlmCisJaW14ZG1hLT5pbl91c2UgPSAxOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX2VuYWJsZSk7CisKKy8qKgorICogaW14X2RtYV9kaXNhYmxlIC0gc3RvcCwgZmluaXNoIGkuTVggRE1BIGNoYW5uZWwgb3BlcmF0aW4KKyAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgorICovCit2b2lkIGlteF9kbWFfZGlzYWJsZShpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoImlteGRtYSVkOiBpbXhfZG1hX2Rpc2FibGVcbiIsIGNoYW5uZWwpOworCisJaWYgKGlteF9kbWFfaHdfY2hhaW4oaW14ZG1hKSkKKwkJZGVsX3RpbWVyKCZpbXhkbWEtPndhdGNoZG9nKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpbXhfZG1hdjFfd3JpdGVsKGlteF9kbWF2MV9yZWFkbChETUFfRElNUikgfCAoMSA8PCBjaGFubmVsKSwgRE1BX0RJTVIpOworCWlteF9kbWF2MV93cml0ZWwoaW14X2RtYXYxX3JlYWRsKERNQV9DQ1IoY2hhbm5lbCkpICYgfkNDUl9DRU4sCisJCQlETUFfQ0NSKGNoYW5uZWwpKTsKKwlpbXhfZG1hdjFfd3JpdGVsKDEgPDwgY2hhbm5lbCwgRE1BX0RJU1IpOworCWlteGRtYS0+aW5fdXNlID0gMDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfZGlzYWJsZSk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NWDIKK3N0YXRpYyB2b2lkIGlteF9kbWFfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBjaG5vKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2Nobm9dOworCisJaW14X2RtYXYxX3dyaXRlbCgwLCBETUFfQ0NSKGNobm8pKTsKKwlpbXhkbWEtPmluX3VzZSA9IDA7CisJaW14ZG1hLT5zZyA9IE5VTEw7CisKKwlpZiAoaW14ZG1hLT5lcnJfaGFuZGxlcikKKwkJaW14ZG1hLT5lcnJfaGFuZGxlcihjaG5vLCBpbXhkbWEtPmRhdGEsIElNWF9ETUFfRVJSX1RJTUVPVVQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWFfZXJyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBpLCBkaXNyOworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYTsKKwl1bnNpZ25lZCBpbnQgZXJyX21hc2s7CisJaW50IGVycmNvZGU7CisKKwlkaXNyID0gaW14X2RtYXYxX3JlYWRsKERNQV9ESVNSKTsKKworCWVycl9tYXNrID0gaW14X2RtYXYxX3JlYWRsKERNQV9EQlRPU1IpIHwKKwkJICAgaW14X2RtYXYxX3JlYWRsKERNQV9EUlRPU1IpIHwKKwkJICAgaW14X2RtYXYxX3JlYWRsKERNQV9EU0VTUikgIHwKKwkJICAgaW14X2RtYXYxX3JlYWRsKERNQV9EQk9TUik7CisKKwlpZiAoIWVycl9tYXNrKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpbXhfZG1hdjFfd3JpdGVsKGRpc3IgJiBlcnJfbWFzaywgRE1BX0RJU1IpOworCisJZm9yIChpID0gMDsgaSA8IElNWF9ETUFfQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoIShlcnJfbWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tpXTsKKwkJZXJyY29kZSA9IDA7CisKKwkJaWYgKGlteF9kbWF2MV9yZWFkbChETUFfREJUT1NSKSAmICgxIDw8IGkpKSB7CisJCQlpbXhfZG1hdjFfd3JpdGVsKDEgPDwgaSwgRE1BX0RCVE9TUik7CisJCQllcnJjb2RlIHw9IElNWF9ETUFfRVJSX0JVUlNUOworCQl9CisJCWlmIChpbXhfZG1hdjFfcmVhZGwoRE1BX0RSVE9TUikgJiAoMSA8PCBpKSkgeworCQkJaW14X2RtYXYxX3dyaXRlbCgxIDw8IGksIERNQV9EUlRPU1IpOworCQkJZXJyY29kZSB8PSBJTVhfRE1BX0VSUl9SRVFVRVNUOworCQl9CisJCWlmIChpbXhfZG1hdjFfcmVhZGwoRE1BX0RTRVNSKSAmICgxIDw8IGkpKSB7CisJCQlpbXhfZG1hdjFfd3JpdGVsKDEgPDwgaSwgRE1BX0RTRVNSKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfVFJBTlNGRVI7CisJCX0KKwkJaWYgKGlteF9kbWF2MV9yZWFkbChETUFfREJPU1IpICYgKDEgPDwgaSkpIHsKKwkJCWlteF9kbWF2MV93cml0ZWwoMSA8PCBpLCBETUFfREJPU1IpOworCQkJZXJyY29kZSB8PSBJTVhfRE1BX0VSUl9CVUZGRVI7CisJCX0KKwkJaWYgKGlteGRtYS0+bmFtZSAmJiBpbXhkbWEtPmVycl9oYW5kbGVyKSB7CisJCQlpbXhkbWEtPmVycl9oYW5kbGVyKGksIGlteGRtYS0+ZGF0YSwgZXJyY29kZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlteF9kbWFfY2hhbm5lbHNbaV0uc2cgPSBOVUxMOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJETUEgdGltZW91dCBvbiBjaGFubmVsICVkICglcykgLSVzJXMlcyVzXG4iLAorCQkgICAgICAgaSwgaW14ZG1hLT5uYW1lLAorCQkgICAgICAgZXJyY29kZSAmIElNWF9ETUFfRVJSX0JVUlNUID8gICAgIiBidXJzdCIgOiAiIiwKKwkJICAgICAgIGVycmNvZGUgJiBJTVhfRE1BX0VSUl9SRVFVRVNUID8gICIgcmVxdWVzdCIgOiAiIiwKKwkJICAgICAgIGVycmNvZGUgJiBJTVhfRE1BX0VSUl9UUkFOU0ZFUiA/ICIgdHJhbnNmZXIiIDogIiIsCisJCSAgICAgICBlcnJjb2RlICYgSU1YX0RNQV9FUlJfQlVGRkVSID8gICAiIGJ1ZmZlciIgOiAiIik7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZG1hX2lycV9oYW5kbGVfY2hhbm5lbChpbnQgY2hubykKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaG5vXTsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCS8qCisJCSAqIElSUSBmb3IgYW4gdW5yZWdpc3RlcmVkIERNQSBjaGFubmVsOgorCQkgKiBsZXQncyBjbGVhciB0aGUgaW50ZXJydXB0cyBhbmQgZGlzYWJsZSBpdC4KKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJzcHVyaW91cyBJUlEgZm9yIERNQSBjaGFubmVsICVkXG4iLCBjaG5vKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbXhkbWEtPnNnKSB7CisJCXUzMiB0bXA7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqY3VycmVudF9zZyA9IGlteGRtYS0+c2c7CisJCWlteGRtYS0+c2cgPSBzZ19uZXh0KGlteGRtYS0+c2cpOworCisJCWlmIChpbXhkbWEtPnNnKSB7CisJCQlpbXhfZG1hX3NnX25leHQoY2hubywgaW14ZG1hLT5zZyk7CisKKwkJCXRtcCA9IGlteF9kbWF2MV9yZWFkbChETUFfQ0NSKGNobm8pKTsKKworCQkJaWYgKGlteF9kbWFfaHdfY2hhaW4oaW14ZG1hKSkgeworCQkJCS8qIEZJWE1FOiBUaGUgdGltZW91dCBzaG91bGQgcHJvYmFibHkgYmUKKwkJCQkgKiBjb25maWd1cmFibGUKKwkJCQkgKi8KKwkJCQltb2RfdGltZXIoJmlteGRtYS0+d2F0Y2hkb2csCisJCQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCkpOworCisJCQkJdG1wIHw9IENDUl9DRU4gfCBDQ1JfUlBUIHwgQ0NSX0FDUlBUOworCQkJCWlteF9kbWF2MV93cml0ZWwodG1wLCBETUFfQ0NSKGNobm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJaW14X2RtYXYxX3dyaXRlbCh0bXAgJiB+Q0NSX0NFTiwgRE1BX0NDUihjaG5vKSk7CisJCQkJdG1wIHw9IENDUl9DRU47CisJCQl9CisKKwkJCWlteF9kbWF2MV93cml0ZWwodG1wLCBETUFfQ0NSKGNobm8pKTsKKworCQkJaWYgKGlteGRtYS0+cHJvZ19oYW5kbGVyKQorCQkJCWlteGRtYS0+cHJvZ19oYW5kbGVyKGNobm8sIGlteGRtYS0+ZGF0YSwKKwkJCQkJCWN1cnJlbnRfc2cpOworCisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoaW14X2RtYV9od19jaGFpbihpbXhkbWEpKSB7CisJCQlkZWxfdGltZXIoJmlteGRtYS0+d2F0Y2hkb2cpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaW14X2RtYXYxX3dyaXRlbCgwLCBETUFfQ0NSKGNobm8pKTsKKwlpbXhkbWEtPmluX3VzZSA9IDA7CisJaWYgKGlteGRtYS0+aXJxX2hhbmRsZXIpCisJCWlteGRtYS0+aXJxX2hhbmRsZXIoY2hubywgaW14ZG1hLT5kYXRhKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRtYV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaW50IGksIGRpc3I7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NWDIKKwlpZiAoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKQorCQlkbWFfZXJyX2hhbmRsZXIoaXJxLCBkZXZfaWQpOworI2VuZGlmCisKKwlkaXNyID0gaW14X2RtYXYxX3JlYWRsKERNQV9ESVNSKTsKKworCXByX2RlYnVnKCJpbXhkbWE6IGRtYV9pcnFfaGFuZGxlciBjYWxsZWQsIGRpc3I9MHglMDh4XG4iLAorCQkgICAgIGRpc3IpOworCisJaW14X2RtYXYxX3dyaXRlbChkaXNyLCBETUFfRElTUik7CisJZm9yIChpID0gMDsgaSA8IElNWF9ETUFfQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoZGlzciAmICgxIDw8IGkpKQorCQkJZG1hX2lycV9oYW5kbGVfY2hhbm5lbChpKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogaW14X2RtYV9yZXF1ZXN0IC0gcmVxdWVzdC9hbGxvY2F0ZSBzcGVjaWZpZWQgY2hhbm5lbCBudW1iZXIKKyAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgorICogQG5hbWU6IHRoZSBkcml2ZXIvY2FsbGVyIG93biBub24tJU5VTEwgaWRlbnRpZmljYXRpb24KKyAqLworaW50IGlteF9kbWFfcmVxdWVzdChpbnQgY2hhbm5lbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogYmFzaWMgc2FuaXR5IGNoZWNrcyAqLworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2hhbm5lbCA+PSBJTVhfRE1BX0NIQU5ORUxTKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub24tZXhpc3RlZCBjaGFubmVsICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGlteGRtYS0+bmFtZSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW1lbXNldChpbXhkbWEsIDAsIHNpemVvZihpbXhkbWEpKTsKKwlpbXhkbWEtPm5hbWUgPSBuYW1lOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgLyogcmVxdWVzdF9pcnEoKSBjYW4gYmxvY2sgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX01YMgorCWlmIChjcHVfaXNfbXgyMSgpIHx8IGNwdV9pc19teDI3KCkpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoTVgyeF9JTlRfRE1BQ0gwICsgY2hhbm5lbCwKKwkJCQlkbWFfaXJxX2hhbmRsZXIsIDAsICJETUEiLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJaW14ZG1hLT5uYW1lID0gTlVMTDsKKwkJCXByX2NyaXQoIkNhbid0IHJlZ2lzdGVyIElSUSAlZCBmb3IgRE1BIGNoYW5uZWwgJWRcbiIsCisJCQkJCU1YMnhfSU5UX0RNQUNIMCArIGNoYW5uZWwsIGNoYW5uZWwpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpbml0X3RpbWVyKCZpbXhkbWEtPndhdGNoZG9nKTsKKwkJaW14ZG1hLT53YXRjaGRvZy5mdW5jdGlvbiA9ICZpbXhfZG1hX3dhdGNoZG9nOworCQlpbXhkbWEtPndhdGNoZG9nLmRhdGEgPSBjaGFubmVsOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaW14X2RtYV9yZXF1ZXN0KTsKKworLyoqCisgKiBpbXhfZG1hX2ZyZWUgLSByZWxlYXNlIHByZXZpb3VzbHkgYWNxdWlyZWQgY2hhbm5lbAorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKi8KK3ZvaWQgaW14X2RtYV9mcmVlKGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07CisKKwlpZiAoIWlteGRtYS0+bmFtZSkgeworCQlwcmludGsoS0VSTl9DUklUCisJCSAgICAgICAiJXM6IHRyeWluZyB0byBmcmVlIGZyZWUgY2hhbm5lbCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsKTsKKwkJcmV0dXJuOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlpbXhfZG1hX2Rpc2FibGUoY2hhbm5lbCk7CisJaW14ZG1hLT5uYW1lID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19BUkNIX01YMgorCWlmIChjcHVfaXNfbXgyMSgpIHx8IGNwdV9pc19teDI3KCkpCisJCWZyZWVfaXJxKE1YMnhfSU5UX0RNQUNIMCArIGNoYW5uZWwsIE5VTEwpOworI2VuZGlmCisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfZnJlZSk7CisKKy8qKgorICogaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8gLSBmaW5kIGFuZCByZXF1ZXN0IHNvbWUgb2YgZnJlZSBjaGFubmVscyBiZXN0CisgKiBzdWl0aW5nIHJlcXVlc3RlZCBwcmlvcml0eQorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKiBAbmFtZTogdGhlIGRyaXZlci9jYWxsZXIgb3duIG5vbi0lTlVMTCBpZGVudGlmaWNhdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmluZCBhIGZyZWUgY2hhbm5lbCBpbiB0aGUgc3BlY2lmaWVkIHByaW9yaXR5IGdyb3VwCisgKiBpZiB0aGUgcHJpb3JpdHkgY2Fubm90IGJlIGFjaGlldmVkIGl0IHRyaWVzIHRvIGxvb2sgZm9yIGZyZWUgY2hhbm5lbAorICogaW4gdGhlIGhpZ2hlciBhbmQgdGhlbiBldmVuIGxvd2VyIHByaW9yaXR5IGdyb3Vwcy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IElmIHRoZXJlIGlzIG5vIGZyZWUgY2hhbm5lbCB0byBhbGxvY2F0ZSwgLSVFTk9ERVYgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgIE9uIHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbiBjaGFubmVsIGlzIHJldHVybmVkLgorICovCitpbnQgaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8oY29uc3QgY2hhciAqbmFtZSwgZW51bSBpbXhfZG1hX3ByaW8gcHJpbykKK3sKKwlpbnQgaTsKKwlpbnQgYmVzdDsKKworCXN3aXRjaCAocHJpbykgeworCWNhc2UgKERNQV9QUklPX0hJR0gpOgorCQliZXN0ID0gODsKKwkJYnJlYWs7CisJY2FzZSAoRE1BX1BSSU9fTUVESVVNKToKKwkJYmVzdCA9IDQ7CisJCWJyZWFrOworCWNhc2UgKERNQV9QUklPX0xPVyk6CisJZGVmYXVsdDoKKwkJYmVzdCA9IDA7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IGJlc3Q7IGkgPCBJTVhfRE1BX0NIQU5ORUxTOyBpKyspCisJCWlmICghaW14X2RtYV9yZXF1ZXN0KGksIG5hbWUpKQorCQkJcmV0dXJuIGk7CisKKwlmb3IgKGkgPSBiZXN0IC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICghaW14X2RtYV9yZXF1ZXN0KGksIG5hbWUpKQorCQkJcmV0dXJuIGk7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBmcmVlIERNQSBjaGFubmVsIGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0woaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8pOworCitzdGF0aWMgaW50IF9faW5pdCBpbXhfZG1hX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19BUkNIX01YMQorCWlmIChjcHVfaXNfbXgxKCkpCisJCWlteF9kbWF2MV9iYXNlYWRkciA9IE1YMV9JT19BRERSRVNTKE1YMV9ETUFfQkFTRV9BRERSKTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDSF9NWDIxCisJaWYgKGNwdV9pc19teDIxKCkpCisJCWlteF9kbWF2MV9iYXNlYWRkciA9IE1YMjFfSU9fQUREUkVTUyhNWDIxX0RNQV9CQVNFX0FERFIpOworCWVsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNIX01YMjcKKwlpZiAoY3B1X2lzX214MjcoKSkKKwkJaW14X2RtYXYxX2Jhc2VhZGRyID0gTVgyN19JT19BRERSRVNTKE1YMjdfRE1BX0JBU0VfQUREUik7CisJZWxzZQorI2VuZGlmCisJCUJVRygpOworCisJZG1hX2NsayA9IGNsa19nZXQoTlVMTCwgImRtYSIpOworCWNsa19lbmFibGUoZG1hX2Nsayk7CisKKwkvKiByZXNldCBETUEgbW9kdWxlICovCisJaW14X2RtYXYxX3dyaXRlbChEQ1JfRFJTVCwgRE1BX0RDUik7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NWDEKKwlpZiAoY3B1X2lzX214MSgpKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKE1YMV9ETUFfSU5ULCBkbWFfaXJxX2hhbmRsZXIsIDAsICJETUEiLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJcHJfY3JpdCgiV293ISAgQ2FuJ3QgcmVnaXN0ZXIgSVJRIGZvciBETUFcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHJlcXVlc3RfaXJxKE1YMV9ETUFfRVJSLCBkbWFfZXJyX2hhbmRsZXIsIDAsICJETUEiLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJcHJfY3JpdCgiV293ISAgQ2FuJ3QgcmVnaXN0ZXIgRVJSSVJRIGZvciBETUFcbiIpOworCQkJZnJlZV9pcnEoTVgxX0RNQV9JTlQsIE5VTEwpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKyNlbmRpZgorCS8qIGVuYWJsZSBETUEgbW9kdWxlICovCisJaW14X2RtYXYxX3dyaXRlbChEQ1JfREVOLCBETUFfRENSKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJaW14X2RtYXYxX3dyaXRlbCgoMSA8PCBJTVhfRE1BX0NIQU5ORUxTKSAtIDEsIERNQV9ESVNSKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWlteF9kbWF2MV93cml0ZWwoKDEgPDwgSU1YX0RNQV9DSEFOTkVMUykgLSAxLCBETUFfRElNUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX0RNQV9DSEFOTkVMUzsgaSsrKSB7CisJCWlteF9kbWFfY2hhbm5lbHNbaV0uc2cgPSBOVUxMOworCQlpbXhfZG1hX2NoYW5uZWxzW2ldLmRtYV9udW0gPSBpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FyY2hfaW5pdGNhbGwoaW14X2RtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14MjctYmFzZWJvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYzVmNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgRXJpYyBCZW5hcmQgLSBlcmljQGV1a3JlYS5jb20KKyAqCisgKiBCYXNlZCBvbiBwY205NzAtYmFzZWJvYXJkLmMgd2hpY2ggaXMgOgorICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydCAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KKyNpbmNsdWRlIDxtYWNoL2lteGZiLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9zcGkuaD4KKyNpbmNsdWRlIDxtYWNoL3NzaS5oPgorI2luY2x1ZGUgPG1hY2gvYXVkbXV4Lmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDI3LmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgaW50IGV1a3JlYV9tYmlteDI3X3BpbnNbXSA9IHsKKwkvKiBVQVJUMiAqLworCVBFM19QRl9VQVJUMl9DVFMsCisJUEU0X1BGX1VBUlQyX1JUUywKKwlQRTZfUEZfVUFSVDJfVFhELAorCVBFN19QRl9VQVJUMl9SWEQsCisJLyogVUFSVDMgKi8KKwlQRThfUEZfVUFSVDNfVFhELAorCVBFOV9QRl9VQVJUM19SWEQsCisJUEUxMF9QRl9VQVJUM19DVFMsCisJUEUxMV9QRl9VQVJUM19SVFMsCisJLyogVUFSVDQgKi8KKyNpZiAhZGVmaW5lZChNQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VVQVJUNCkKKwlQQjI2X0FGX1VBUlQ0X1JUUywKKwlQQjI4X0FGX1VBUlQ0X1RYRCwKKwlQQjI5X0FGX1VBUlQ0X0NUUywKKwlQQjMxX0FGX1VBUlQ0X1JYRCwKKyNlbmRpZgorCS8qIFNESEMxKi8KKwlQRTE4X1BGX1NEMV9EMCwKKwlQRTE5X1BGX1NEMV9EMSwKKwlQRTIwX1BGX1NEMV9EMiwKKwlQRTIxX1BGX1NEMV9EMywKKwlQRTIyX1BGX1NEMV9DTUQsCisJUEUyM19QRl9TRDFfQ0xLLAorCS8qIGRpc3BsYXkgKi8KKwlQQTVfUEZfTFNDTEssCisJUEE2X1BGX0xEMCwKKwlQQTdfUEZfTEQxLAorCVBBOF9QRl9MRDIsCisJUEE5X1BGX0xEMywKKwlQQTEwX1BGX0xENCwKKwlQQTExX1BGX0xENSwKKwlQQTEyX1BGX0xENiwKKwlQQTEzX1BGX0xENywKKwlQQTE0X1BGX0xEOCwKKwlQQTE1X1BGX0xEOSwKKwlQQTE2X1BGX0xEMTAsCisJUEExN19QRl9MRDExLAorCVBBMThfUEZfTEQxMiwKKwlQQTE5X1BGX0xEMTMsCisJUEEyMF9QRl9MRDE0LAorCVBBMjFfUEZfTEQxNSwKKwlQQTIyX1BGX0xEMTYsCisJUEEyM19QRl9MRDE3LAorCVBBMjhfUEZfSFNZTkMsCisJUEEyOV9QRl9WU1lOQywKKwlQQTMwX1BGX0NPTlRSQVNULAorCVBBMzFfUEZfT0VfQUNELAorCS8qIFNQSTEgKi8KKwlQRDI5X1BGX0NTUEkxX1NDTEssCisJUEQzMF9QRl9DU1BJMV9NSVNPLAorCVBEMzFfUEZfQ1NQSTFfTU9TSSwKKwkvKiBTU0k0ICovCisjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19FVUtSRUFfVExWMzIwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19FVUtSRUFfVExWMzIwX01PRFVMRSkKKwlQQzE2X1BGX1NTSTRfRlMsCisJUEMxN19QRl9TU0k0X1JYRCB8IEdQSU9fUFVFTiwKKwlQQzE4X1BGX1NTSTRfVFhEIHwgR1BJT19QVUVOLAorCVBDMTlfUEZfU1NJNF9DTEssCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBldWtyZWFfbWJpbXgyN19rZXltYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZX1VQKSwKKwlLRVkoMCwgMSwgS0VZX0RPV04pLAorCUtFWSgxLCAwLCBLRVlfUklHSFQpLAorCUtFWSgxLCAxLCBLRVlfTEVGVCksCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBldWtyZWFfbWJpbXgyN19rZXltYXBfZGF0YSA9IHsKKwkua2V5bWFwICAgICAgICAgPSBldWtyZWFfbWJpbXgyN19rZXltYXAsCisJLmtleW1hcF9zaXplICAgID0gQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19rZXltYXApLAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAibGVkMSIsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmdwaW8JCQk9IEdQSU9fUE9SVEYgfCAxNiwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJsZWQyIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJub25lIiwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmdwaW8JCQk9IEdQSU9fUE9SVEYgfCAxOSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGdwaW9fbGVkX2luZm8gPSB7CisJLmxlZHMJCT0gZ3Bpb19sZWRzLAorCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoZ3Bpb19sZWRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxlZHNfZ3BpbyA9IHsKKwkubmFtZQk9ICJsZWRzLWdwaW8iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmdwaW9fbGVkX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2ZiX3ZpZGVvbW9kZSBldWtyZWFfbWJpbXgyN19tb2Rlc1tdID0geworCXsKKwkJLm1vZGUgPSB7CisJCQkubmFtZQkJPSAiQ01PLVFWR0EiLAorCQkJLnJlZnJlc2gJPSA2MCwKKwkJCS54cmVzCQk9IDMyMCwKKwkJCS55cmVzCQk9IDI0MCwKKwkJCS5waXhjbG9jawk9IDE1NjAwMCwKKwkJCS5oc3luY19sZW4JPSAzMCwKKwkJCS5sZWZ0X21hcmdpbgk9IDM4LAorCQkJLnJpZ2h0X21hcmdpbgk9IDIwLAorCQkJLnZzeW5jX2xlbgk9IDMsCisJCQkudXBwZXJfbWFyZ2luCT0gMTUsCisJCQkubG93ZXJfbWFyZ2luCT0gNCwKKwkJfSwKKwkJLnBjcgkJPSAweEZBRDA4QjgwLAorCQkuYnBwCQk9IDE2LAorCX0sIHsKKwkJLm1vZGUgPSB7CisJCQkubmFtZQkJPSAiRFZJLVZHQSIsCisJCQkucmVmcmVzaAk9IDYwLAorCQkJLnhyZXMJCT0gNjQwLAorCQkJLnlyZXMJCT0gNDgwLAorCQkJLnBpeGNsb2NrCT0gMzIwMDAsCisJCQkuaHN5bmNfbGVuCT0gMSwKKwkJCS5sZWZ0X21hcmdpbgk9IDM1LAorCQkJLnJpZ2h0X21hcmdpbgk9IDAsCisJCQkudnN5bmNfbGVuCT0gMSwKKwkJCS51cHBlcl9tYXJnaW4JPSA3LAorCQkJLmxvd2VyX21hcmdpbgk9IDAsCisJCX0sCisJCS5wY3IJCT0gMHhGQTIwOEI4MCwKKwkJLmJwcAkJPSAxNiwKKwl9LCB7CisJCS5tb2RlID0geworCQkJLm5hbWUJCT0gIkRWSS1TVkdBIiwKKwkJCS5yZWZyZXNoCT0gNjAsCisJCQkueHJlcwkJPSA4MDAsCisJCQkueXJlcwkJPSA2MDAsCisJCQkucGl4Y2xvY2sJPSAyNTAwMCwKKwkJCS5oc3luY19sZW4JPSAxLAorCQkJLmxlZnRfbWFyZ2luCT0gMzUsCisJCQkucmlnaHRfbWFyZ2luCT0gMCwKKwkJCS52c3luY19sZW4JPSAxLAorCQkJLnVwcGVyX21hcmdpbgk9IDcsCisJCQkubG93ZXJfbWFyZ2luCT0gMCwKKwkJfSwKKwkJLnBjcgkJPSAweEZBMjA4QjgwLAorCQkuYnBwCQk9IDE2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGlteF9mYl9wbGF0Zm9ybV9kYXRhIGV1a3JlYV9tYmlteDI3X2ZiX2RhdGEgPSB7CisJLm1vZGUgPSBldWtyZWFfbWJpbXgyN19tb2RlcywKKwkubnVtX21vZGVzID0gQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19tb2RlcyksCisKKwkucHdtcgkJPSAweDAwQTkwM0ZGLAorCS5sc2NyMQkJPSAweDAwMTIwMzAwLAorCS5kbWFjcgkJPSAweDAwMDQwMDYwLAorfTsKKworc3RhdGljIHZvaWQgZXVrcmVhX21iaW14MjdfYmxfc2V0X2ludGVuc2l0eShpbnQgaW50ZW5zaXR5KQoreworCWlmIChpbnRlbnNpdHkpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BPUlRFIHwgNSwgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QT1JURSB8IDUsIDApOworfQorCitzdGF0aWMgc3RydWN0IGdlbmVyaWNfYmxfaW5mbyBldWtyZWFfbWJpbXgyN19ibF9pbmZvID0geworCS5uYW1lCQkJPSAiZXVrcmVhX21iaW14MjctYmwiLAorCS5tYXhfaW50ZW5zaXR5CQk9IDB4ZmYsCisJLmRlZmF1bHRfaW50ZW5zaXR5CT0gMHhmZiwKKwkuc2V0X2JsX2ludGVuc2l0eQk9IGV1a3JlYV9tYmlteDI3X2JsX3NldF9pbnRlbnNpdHksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldWtyZWFfbWJpbXgyN19ibF9kZXYgPSB7CisJLm5hbWUJCQk9ICJnZW5lcmljLWJsIiwKKwkuaWQJCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZXVrcmVhX21iaW14MjdfYmxfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHZvaWQgZXVrcmVhX21iaW14MjdfbGNkX3Bvd2VyX3NldChzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCisJCQkJICAgdW5zaWduZWQgaW50IHBvd2VyKQoreworCWlmIChwb3dlcikKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUE9SVEEgfCAyNSwgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QT1JUQSB8IDI1LCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0X2xjZF9kYXRhIGV1a3JlYV9tYmlteDI3X2xjZF9wb3dlcl9kYXRhID0geworCS5zZXRfcG93ZXIJCT0gZXVrcmVhX21iaW14MjdfbGNkX3Bvd2VyX3NldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV1a3JlYV9tYmlteDI3X2xjZF9wb3dlcmRldiA9IHsKKwkubmFtZQkJCT0gInBsYXRmb3JtLWxjZCIsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJmV1a3JlYV9tYmlteDI3X2xjZF9wb3dlcl9kYXRhLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYpIFwKKwl8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2X01PRFVMRSkKKworI2RlZmluZSBBRFM3ODQ2X1BFTkRPV04gKEdQSU9fUE9SVEQgfCAyNSkKKworc3RhdGljIHZvaWQgYWRzNzg0Nl9kZXZfaW5pdCh2b2lkKQoreworCWlmIChncGlvX3JlcXVlc3QoQURTNzg0Nl9QRU5ET1dOLCAiQURTNzg0NiBwZW5kb3duIikgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgZ2V0IGFkczc0NiBwZW4gZG93biBHUElPXG4iKTsKKwkJcmV0dXJuOworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChBRFM3ODQ2X1BFTkRPV04pOworfQorCitzdGF0aWMgaW50IGFkczc4NDZfZ2V0X3BlbmRvd25fc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKEFEUzc4NDZfUEVORE9XTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIGFkczc4NDZfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLmdldF9wZW5kb3duX3N0YXRlCT0gYWRzNzg0Nl9nZXRfcGVuZG93bl9zdGF0ZSwKKwkua2VlcF92cmVmX29uCQk9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19TUElfSU1YX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gZXVrcmVhX21iaW14Mjdfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLm1vZGFsaWFzCT0gImFkczc4NDYiLAorCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdAk9IDAsCisJCS5tYXhfc3BlZWRfaHoJPSAxNTAwMDAwLAorCQkuaXJxCQk9IElSUV9HUElPRCgyNSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmFkczc4NDZfY29uZmlnLAorCQkubW9kZSAgICAgICAgICAgPSBTUElfTU9ERV8yLAorCX0sCit9OworCitzdGF0aWMgaW50IGV1a3JlYV9tYmlteDI3X3NwaV9jc1tdID0ge0dQSU9fUE9SVEQgfCAyOH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgZXVrcmVhX21iaW14Mjdfc3BpMF9kYXRhIF9faW5pdGNvbnN0ID0geworCS5jaGlwc2VsZWN0CT0gZXVrcmVhX21iaW14Mjdfc3BpX2NzLAorCS5udW1fY2hpcHNlbGVjdCA9IEFSUkFZX1NJWkUoZXVrcmVhX21iaW14Mjdfc3BpX2NzKSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBldWtyZWFfbWJpbXgyN19pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzIzIiwgMHgxYSksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbGVkc19ncGlvLAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhtbWNfcGxhdGZvcm1fZGF0YSBzZGhjX3BkYXRhID0geworCS5kYXQzX2NhcmRfZGV0ZWN0ID0gMSwKK307CisKK3N0cnVjdCBpbXhfc3NpX3BsYXRmb3JtX2RhdGEgZXVrcmVhX21iaW14Mjdfc3NpX3BkYXRhID0geworCS5mbGFncyA9IElNWF9TU0lfRE1BIHwgSU1YX1NTSV9VU0VfSTJTX1NMQVZFLAorfTsKKworLyoKKyAqIHN5c3RlbSBpbml0IGZvciBiYXNlYm9hcmQgdXNhZ2UuIFdpbGwgYmUgY2FsbGVkIGJ5IGNwdWlteDI3IGluaXQuCisgKgorICogQWRkIHBsYXRmb3JtIGRldmljZXMgcHJlc2VudCBvbiB0aGlzIGJhc2Vib2FyZCBhbmQgaW5pdAorICogdGhlbSBmcm9tIENQVSBzaWRlIGFzIGZhciBhcyByZXF1aXJlZCB0byB1c2UgdGhlbSBsYXRlciBvbgorICovCit2b2lkIF9faW5pdCBldWtyZWFfbWJpbXgyN19iYXNlYm9hcmRfaW5pdCh2b2lkKQoreworCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMoZXVrcmVhX21iaW14MjdfcGlucywKKwkJQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19waW5zKSwgIk1CSU1YMjciKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfRVVLUkVBX1RMVjMyMCkgXAorCXx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfRVVLUkVBX1RMVjMyMF9NT0RVTEUpCisJLyogU1NJIHVuaXQgbWFzdGVyIEkyUyBjb2RlYyBjb25uZWN0ZWQgdG8gU1NJX1BJTlNfNCovCisJbXhjX2F1ZG11eF92MV9jb25maWd1cmVfcG9ydChNWDI3X0FVRE1VWF9IUENSMV9TU0kwLAorCQkJTVhDX0FVRE1VWF9WMV9QQ1JfU1lOIHwKKwkJCU1YQ19BVURNVVhfVjFfUENSX1RGU0RJUiB8CisJCQlNWENfQVVETVVYX1YxX1BDUl9UQ0xLRElSIHwKKwkJCU1YQ19BVURNVVhfVjFfUENSX1JGU0RJUiB8CisJCQlNWENfQVVETVVYX1YxX1BDUl9SQ0xLRElSIHwKKwkJCU1YQ19BVURNVVhfVjFfUENSX1RGQ1NFTChNWDI3X0FVRE1VWF9IUENSM19TU0lfUElOU180KSB8CisJCQlNWENfQVVETVVYX1YxX1BDUl9SRkNTRUwoTVgyN19BVURNVVhfSFBDUjNfU1NJX1BJTlNfNCkgfAorCQkJTVhDX0FVRE1VWF9WMV9QQ1JfUlhEU0VMKE1YMjdfQVVETVVYX0hQQ1IzX1NTSV9QSU5TXzQpCisJKTsKKwlteGNfYXVkbXV4X3YxX2NvbmZpZ3VyZV9wb3J0KE1YMjdfQVVETVVYX0hQQ1IzX1NTSV9QSU5TXzQsCisJCQlNWENfQVVETVVYX1YxX1BDUl9TWU4gfAorCQkJTVhDX0FVRE1VWF9WMV9QQ1JfUlhEU0VMKE1YMjdfQVVETVVYX0hQQ1IxX1NTSTApCisJKTsKKyNlbmRpZgorCisJaW14MjdfYWRkX2lteF91YXJ0MSgmdWFydF9wZGF0YSk7CisJaW14MjdfYWRkX2lteF91YXJ0MigmdWFydF9wZGF0YSk7CisjaWYgIWRlZmluZWQoTUFDSF9FVUtSRUFfQ1BVSU1YMjdfVVNFVUFSVDQpCisJaW14MjdfYWRkX2lteF91YXJ0MygmdWFydF9wZGF0YSk7CisjZW5kaWYKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19mYl9kZXZpY2UsICZldWtyZWFfbWJpbXgyN19mYl9kYXRhKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfc2RoY19kZXZpY2UwLCAmc2RoY19wZGF0YSk7CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBldWtyZWFfbWJpbXgyN19pMmNfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKGV1a3JlYV9tYmlteDI3X2kyY19kZXZpY2VzKSk7CisKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXhfc3NpX2RldmljZTAsICZldWtyZWFfbWJpbXgyN19zc2lfcGRhdGEpOworCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NikgXAorCXx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDZfTU9EVUxFKQorCS8qIEFEUzc4NDYgVG91Y2hzY3JlZW4gY29udHJvbGxlciBpbml0ICovCisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlREIHwgMjUgfCBHUElPX0dQSU8gfCBHUElPX0lOKTsKKwlhZHM3ODQ2X2Rldl9pbml0KCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9JTVgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9JTVhfTU9EVUxFKQorCS8qIFNQSV9DUzAgaW5pdCAqLworCW14Y19ncGlvX21vZGUoR1BJT19QT1JURCB8IDI4IHwgR1BJT19HUElPIHwgR1BJT19PVVQpOworCWlteDI3X2FkZF9zcGlfaW14MCgmZXVrcmVhX21iaW14Mjdfc3BpMF9kYXRhKTsKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhldWtyZWFfbWJpbXgyN19zcGlfYm9hcmRfaW5mbywKKwkJCUFSUkFZX1NJWkUoZXVrcmVhX21iaW14Mjdfc3BpX2JvYXJkX2luZm8pKTsKKyNlbmRpZgorCisJLyogTGVkcyBjb25maWd1cmF0aW9uICovCisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlRGIHwgMTYgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7CisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlRGIHwgMTkgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7CisJLyogQmFja2xpZ2h0ICovCisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlRFIHwgNSB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsKKwlncGlvX3JlcXVlc3QoR1BJT19QT1JURSB8IDUsICJiYWNrbGlnaHQiKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmV1a3JlYV9tYmlteDI3X2JsX2Rldik7CisJLyogTENEIFJlc2V0ICovCisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlRBIHwgMjUgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fUE9SVEEgfCAyNSwgImxjZF9lbmFibGUiKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmV1a3JlYV9tYmlteDI3X2xjZF9wb3dlcmRldik7CisKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXhfa3BwX2RldmljZSwgJmV1a3JlYV9tYmlteDI3X2tleW1hcF9kYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2RtYS1teDEtbXgyLmggYi9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVmNTIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2RtYS1teDEtbXgyLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX01BQ0hfRE1BX01YMV9NWDJfSF9fCisjZGVmaW5lIF9fTUFDSF9ETUFfTVgxX01YMl9IX18KKy8qCisgKiBEb24ndCB1c2UgdGhpcyBoZWFkZXIgaW4gbmV3IGNvZGUsIGl0IHdpbGwgZ28gYXdheSB3aGVuIGFsbCB1c2VycyBhcmUKKyAqIGNvbnZlcnRlZCB0byBtYWNoL2RtYS12MS5oCisgKi8KKworI2luY2x1ZGUgPG1hY2gvZG1hLXYxLmg+CisKKyNlbmRpZiAvKiBpZm5kZWYgX19NQUNIX0RNQV9NWDFfTVgyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2RtYS12MS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2RtYS12MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzQzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvZG1hLXYxLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2RtYS12MS5oCisgKgorICogIGkuTVggRE1BIHJlZ2lzdHJhdGlvbiBhbmQgSVJRIGRpc3BhdGNoaW5nCisgKgorICogQ29weXJpZ2h0IDIwMDYgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgorICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgorICogQ29weXJpZ2h0IDIwMDggU2FzY2hhIEhhdWVyLCA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTUFDSF9ETUFfVjFfSF9fCisjZGVmaW5lIF9fTUFDSF9ETUFfVjFfSF9fCisKKyNkZWZpbmUgaW14X2hhc19kbWFfdjEoKQkoY3B1X2lzX214MSgpIHx8IGNwdV9pc19teDIxKCkgfHwgY3B1X2lzX214MjcoKSkKKworI2RlZmluZSBJTVhfRE1BX0NIQU5ORUxTICAxNgorCisjZGVmaW5lIERNQV9NT0RFX1JFQUQJCTAKKyNkZWZpbmUgRE1BX01PREVfV1JJVEUJCTEKKyNkZWZpbmUgRE1BX01PREVfTUFTSwkJMQorCisjZGVmaW5lIE1YMV9ETUFfUkVHKG9mZnNldCkJTVgxX0lPX0FERFJFU1MoTVgxX0RNQV9CQVNFX0FERFIgKyAob2Zmc2V0KSkKKworLyogRE1BIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIE1YMV9ETUFfRElNUgkJTVgxX0RNQV9SRUcoMHgwOCkKKworLyogQ2hhbm5lbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1YMV9ETUFfQ0NSKHgpCQlNWDFfRE1BX1JFRygweDhjICsgKCh4KSA8PCA2KSkKKworI2RlZmluZSBJTVhfRE1BX01FTVNJWkVfMzIJKDAgPDwgNCkKKyNkZWZpbmUgSU1YX0RNQV9NRU1TSVpFXzgJKDEgPDwgNCkKKyNkZWZpbmUgSU1YX0RNQV9NRU1TSVpFXzE2CSgyIDw8IDQpCisjZGVmaW5lIElNWF9ETUFfVFlQRV9MSU5FQVIJKDAgPDwgMTApCisjZGVmaW5lIElNWF9ETUFfVFlQRV8yRAkJKDEgPDwgMTApCisjZGVmaW5lIElNWF9ETUFfVFlQRV9GSUZPCSgyIDw8IDEwKQorCisjZGVmaW5lIElNWF9ETUFfRVJSX0JVUlNUICAgICAoMSA8PCAwKQorI2RlZmluZSBJTVhfRE1BX0VSUl9SRVFVRVNUICAgKDEgPDwgMSkKKyNkZWZpbmUgSU1YX0RNQV9FUlJfVFJBTlNGRVIgICgxIDw8IDIpCisjZGVmaW5lIElNWF9ETUFfRVJSX0JVRkZFUiAgICAoMSA8PCAzKQorI2RlZmluZSBJTVhfRE1BX0VSUl9USU1FT1VUICAgKDEgPDwgNCkKKworaW50CitpbXhfZG1hX2NvbmZpZ19jaGFubmVsKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgY29uZmlnX3BvcnQsCisJdW5zaWduZWQgaW50IGNvbmZpZ19tZW0sIHVuc2lnbmVkIGludCBkbWFyZXEsIGludCBod19jaGFpbmluZyk7CisKK3ZvaWQKK2lteF9kbWFfY29uZmlnX2J1cnN0bGVuKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgYnVyc3RsZW4pOworCitpbnQKK2lteF9kbWFfc2V0dXBfc2luZ2xlKGludCBjaGFubmVsLCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLAorCQl1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAorCQl1bnNpZ25lZCBpbnQgZG1hbW9kZSk7CisKKworLyoKKyAqIFVzZSB0aGlzIGZsYWcgYXMgdGhlIGRtYV9sZW5ndGggYXJndW1lbnQgdG8gaW14X2RtYV9zZXR1cF9zZygpCisgKiB0byBjcmVhdGUgYW4gZW5kbGVzcyBydW5uaW5nIGRtYSBsb29wLiBUaGUgZW5kIG9mIHRoZSBzY2F0dGVybGlzdAorICogbXVzdCBiZSBsaW5rZWQgdG8gdGhlIGJlZ2lubmluZyBmb3IgdGhpcyB0byB3b3JrLgorICovCisjZGVmaW5lIElNWF9ETUFfTEVOR1RIX0xPT1AJKCh1bnNpZ25lZCBpbnQpLTEpCisKK2ludAoraW14X2RtYV9zZXR1cF9zZyhpbnQgY2hhbm5lbCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJdW5zaWduZWQgaW50IHNnY291bnQsIHVuc2lnbmVkIGludCBkbWFfbGVuZ3RoLAorCQl1bnNpZ25lZCBpbnQgZGV2X2FkZHIsIHVuc2lnbmVkIGludCBkbWFtb2RlKTsKKworaW50CitpbXhfZG1hX3NldHVwX2hhbmRsZXJzKGludCBjaGFubmVsLAorCQl2b2lkICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKiksCisJCXZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBpbnQpLCB2b2lkICpkYXRhKTsKKworaW50CitpbXhfZG1hX3NldHVwX3Byb2dyZXNzaW9uX2hhbmRsZXIoaW50IGNoYW5uZWwsCisJCXZvaWQgKCpwcm9nX2hhbmRsZXIpIChpbnQsIHZvaWQqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QqKSk7CisKK3ZvaWQgaW14X2RtYV9lbmFibGUoaW50IGNoYW5uZWwpOworCit2b2lkIGlteF9kbWFfZGlzYWJsZShpbnQgY2hhbm5lbCk7CisKK2ludCBpbXhfZG1hX3JlcXVlc3QoaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKm5hbWUpOworCit2b2lkIGlteF9kbWFfZnJlZShpbnQgY2hhbm5lbCk7CisKK2VudW0gaW14X2RtYV9wcmlvIHsKKwlETUFfUFJJT19ISUdIID0gMCwKKwlETUFfUFJJT19NRURJVU0gPSAxLAorCURNQV9QUklPX0xPVyA9IDIKK307CisKK2ludCBpbXhfZG1hX3JlcXVlc3RfYnlfcHJpbyhjb25zdCBjaGFyICpuYW1lLCBlbnVtIGlteF9kbWFfcHJpbyBwcmlvKTsKKworI2VuZGlmCS8qIF9fTUFDSF9ETUFfVjFfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDI3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDI3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ZmYxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MjcuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBFcmljIEJlbmFyZCAtIGVyaWNAZXVrcmVhLmNvbQorICoKKyAqIEJhc2VkIG9uIHBjbTAzOC5jIHdoaWNoIGlzIDoKKyAqIENvcHlyaWdodCAyMDA3IFJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0IChrZXJuZWxAcGVuZ3V0cm9uaXguZGUpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvdWxwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2V1a3JlYS1iYXNlYm9hcmRzLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDI3Lmg+CisjaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgorI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KKyNpbmNsdWRlIDxtYWNoL3VscGkuaD4KKworI2luY2x1ZGUgImRldmljZXMtaW14MjcuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3N0YXRpYyBpbnQgZXVrcmVhX2NwdWlteDI3X3BpbnNbXSA9IHsKKwkvKiBVQVJUMSAqLworCVBFMTJfUEZfVUFSVDFfVFhELAorCVBFMTNfUEZfVUFSVDFfUlhELAorCVBFMTRfUEZfVUFSVDFfQ1RTLAorCVBFMTVfUEZfVUFSVDFfUlRTLAorCS8qIFVBUlQ0ICovCisjaWYgZGVmaW5lZChNQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VVQVJUNCkKKwlQQjI2X0FGX1VBUlQ0X1JUUywKKwlQQjI4X0FGX1VBUlQ0X1RYRCwKKwlQQjI5X0FGX1VBUlQ0X0NUUywKKwlQQjMxX0FGX1VBUlQ0X1JYRCwKKyNlbmRpZgorCS8qIEZFQyAqLworCVBEMF9BSU5fRkVDX1RYRDAsCisJUEQxX0FJTl9GRUNfVFhEMSwKKwlQRDJfQUlOX0ZFQ19UWEQyLAorCVBEM19BSU5fRkVDX1RYRDMsCisJUEQ0X0FPVVRfRkVDX1JYX0VSLAorCVBENV9BT1VUX0ZFQ19SWEQxLAorCVBENl9BT1VUX0ZFQ19SWEQyLAorCVBEN19BT1VUX0ZFQ19SWEQzLAorCVBEOF9BRl9GRUNfTURJTywKKwlQRDlfQUlOX0ZFQ19NREMsCisJUEQxMF9BT1VUX0ZFQ19DUlMsCisJUEQxMV9BT1VUX0ZFQ19UWF9DTEssCisJUEQxMl9BT1VUX0ZFQ19SWEQwLAorCVBEMTNfQU9VVF9GRUNfUlhfRFYsCisJUEQxNF9BT1VUX0ZFQ19SWF9DTEssCisJUEQxNV9BT1VUX0ZFQ19DT0wsCisJUEQxNl9BSU5fRkVDX1RYX0VSLAorCVBGMjNfQUlOX0ZFQ19UWF9FTiwKKwkvKiBJMkMxICovCisJUEQxN19QRl9JMkNfREFUQSwKKwlQRDE4X1BGX0kyQ19DTEssCisJLyogU0RIQzIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VTREhDMikKKwlQQjRfUEZfU0QyX0QwLAorCVBCNV9QRl9TRDJfRDEsCisJUEI2X1BGX1NEMl9EMiwKKwlQQjdfUEZfU0QyX0QzLAorCVBCOF9QRl9TRDJfQ01ELAorCVBCOV9QRl9TRDJfQ0xLLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKKwkvKiBRdWFkIFVBUlQncyBJUlEgKi8KKwlHUElPX1BPUlRCIHwgMjIgfCBHUElPX0dQSU8gfCBHUElPX0lOLAorCUdQSU9fUE9SVEIgfCAyMyB8IEdQSU9fR1BJTyB8IEdQSU9fSU4sCisJR1BJT19QT1JUQiB8IDI3IHwgR1BJT19HUElPIHwgR1BJT19JTiwKKwlHUElPX1BPUlRCIHwgMzAgfCBHUElPX0dQSU8gfCBHUElPX0lOLAorI2VuZGlmCisJLyogT1RHICovCisJUEM3X1BGX1VTQk9UR19EQVRBNSwKKwlQQzhfUEZfVVNCT1RHX0RBVEE2LAorCVBDOV9QRl9VU0JPVEdfREFUQTAsCisJUEMxMF9QRl9VU0JPVEdfREFUQTIsCisJUEMxMV9QRl9VU0JPVEdfREFUQTEsCisJUEMxMl9QRl9VU0JPVEdfREFUQTQsCisJUEMxM19QRl9VU0JPVEdfREFUQTMsCisJUEUwX1BGX1VTQk9UR19OWFQsCisJUEUxX1BGX1VTQk9UR19TVFAsCisJUEUyX1BGX1VTQk9UR19ESVIsCisJUEUyNF9QRl9VU0JPVEdfQ0xLLAorCVBFMjVfUEZfVVNCT1RHX0RBVEE3LAorCS8qIFVTQkgyICovCisJUEEwX1BGX1VTQkgyX0NMSywKKwlQQTFfUEZfVVNCSDJfRElSLAorCVBBMl9QRl9VU0JIMl9EQVRBNywKKwlQQTNfUEZfVVNCSDJfTlhULAorCVBBNF9QRl9VU0JIMl9TVFAsCisJUEQxOV9BRl9VU0JIMl9EQVRBNCwKKwlQRDIwX0FGX1VTQkgyX0RBVEEzLAorCVBEMjFfQUZfVVNCSDJfREFUQTYsCisJUEQyMl9BRl9VU0JIMl9EQVRBMCwKKwlQRDIzX0FGX1VTQkgyX0RBVEEyLAorCVBEMjRfQUZfVVNCSDJfREFUQTEsCisJUEQyNl9BRl9VU0JIMl9EQVRBNSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGV1a3JlYV9jcHVpbXgyN19mbGFzaF9kYXRhID0geworCS53aWR0aCA9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV1a3JlYV9jcHVpbXgyN19mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQgPSAweGMwMDAwMDAwLAorCS5lbmQgICA9IDB4YzNmZmZmZmYsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldWtyZWFfY3B1aW14Mjdfbm9yX210ZF9kZXZpY2UgPSB7CisJLm5hbWUgPSAicGh5c21hcC1mbGFzaCIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZldWtyZWFfY3B1aW14MjdfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmZXVrcmVhX2NwdWlteDI3X2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCitjcHVpbXgyN19uYW5kX2JvYXJkX2luZm8gX19pbml0Y29uc3QgPSB7CisJLndpZHRoID0gMSwKKwkuaHdfZWNjID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZXVrcmVhX2NwdWlteDI3X25vcl9tdGRfZGV2aWNlLAorCSZteGNfZmVjX2RldmljZSwKKwkmbXhjX3dkdCwKKwkmbXhjX3cxX21hc3Rlcl9kZXZpY2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIGNwdWlteDI3X2kyYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZXVrcmVhX2NwdWlteDI3X2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicGNmODU2MyIsIDB4NTEpLAorCX0sCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YMjdfQ1MzX0JBU0VfQUREUiArIDB4MjAwMDAwKSwKKwkJLmlycSA9IElSUV9HUElPQigyMyksCisJCS51YXJ0Y2xrID0gMTQ3NDU2MDAsCisJCS5yZWdzaGlmdCA9IDEsCisJCS5pb3R5cGUgPSBVUElPX01FTSwKKwkJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX0lPUkVNQVAsCisJfSwgeworCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDI3X0NTM19CQVNFX0FERFIgKyAweDQwMDAwMCksCisJCS5pcnEgPSBJUlFfR1BJT0IoMjIpLAorCQkudWFydGNsayA9IDE0NzQ1NjAwLAorCQkucmVnc2hpZnQgPSAxLAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAorCX0sIHsKKwkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVgyN19DUzNfQkFTRV9BRERSICsgMHg4MDAwMDApLAorCQkuaXJxID0gSVJRX0dQSU9CKDI3KSwKKwkJLnVhcnRjbGsgPSAxNDc0NTYwMCwKKwkJLnJlZ3NoaWZ0ID0gMSwKKwkJLmlvdHlwZSA9IFVQSU9fTUVNLAorCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKKwl9LCB7CisJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YMjdfQ1MzX0JBU0VfQUREUiArIDB4MTAwMDAwMCksCisJCS5pcnEgPSBJUlFfR1BJT0IoMzApLAorCQkudWFydGNsayA9IDE0NzQ1NjAwLAorCQkucmVnc2hpZnQgPSAxLAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAorCX0sIHsKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0geworCS5uYW1lID0gInNlcmlhbDgyNTAiLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1VMUEkpCitzdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgb3RnX3BkYXRhID0geworCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VMUEksCisJLmZsYWdzCT0gTVhDX0VIQ0lfSU5URVJGQUNFX0RJRkZfVU5JLAorfTsKKworc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgyX3BkYXRhID0geworCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VMUEksCisJLmZsYWdzCT0gTVhDX0VIQ0lfSU5URVJGQUNFX0RJRkZfVU5JLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgb3RnX2RldmljZV9wZGF0YSA9IHsKKwkub3BlcmF0aW5nX21vZGUgPSBGU0xfVVNCMl9EUl9ERVZJQ0UsCisJLnBoeV9tb2RlICAgICAgID0gRlNMX1VTQjJfUEhZX1VMUEksCit9OworCitzdGF0aWMgaW50IG90Z19tb2RlX2hvc3Q7CisKK3N0YXRpYyBpbnQgX19pbml0IGV1a3JlYV9jcHVpbXgyN19vdGdfbW9kZShjaGFyICpvcHRpb25zKQoreworCWlmICghc3RyY21wKG9wdGlvbnMsICJob3N0IikpCisJCW90Z19tb2RlX2hvc3QgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAob3B0aW9ucywgImRldmljZSIpKQorCQlvdGdfbW9kZV9ob3N0ID0gMDsKKwllbHNlCisJCXByX2luZm8oIm90Z19tb2RlIG5laXRoZXIgXCJob3N0XCIgbm9yIFwiZGV2aWNlXCIuICIKKwkJCSJEZWZhdWx0aW5nIHRvIGRldmljZVxuIik7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJvdGdfbW9kZT0iLCBldWtyZWFfY3B1aW14Mjdfb3RnX21vZGUpOworCitzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDI3X2luaXQodm9pZCkKK3sKKwlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKGV1a3JlYV9jcHVpbXgyN19waW5zLAorCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXgyN19waW5zKSwgIkNQVUlNWDI3Iik7CisKKwlpbXgyN19hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKworCWlteDI3X2FkZF9teGNfbmFuZCgmY3B1aW14MjdfbmFuZF9ib2FyZF9pbmZvKTsKKworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGV1a3JlYV9jcHVpbXgyN19pMmNfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXgyN19pMmNfZGV2aWNlcykpOworCisJaW14MjdfYWRkX2kyY19pbXgxKCZjcHVpbXgyN19pMmMxX2RhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VTREhDMikKKwkvKiBTREhDMiBjYW4gYmUgdXNlZCBmb3IgV2lmaSAqLworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTEsIE5VTEwpOworI2VuZGlmCisjaWYgZGVmaW5lZChNQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VVQVJUNCkKKwkvKiBpbiB3aGljaCBjYXNlIFVBUlQ0IGlzIGFsc28gdXNlZCBmb3IgQmx1ZXRvb3RoICovCisJaW14MjdfYWRkX2lteF91YXJ0MygmdWFydF9wZGF0YSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9NT0RVTEUpCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1VMUEkpCisJaWYgKG90Z19tb2RlX2hvc3QpIHsKKwkJb3RnX3BkYXRhLm90ZyA9IG90Z191bHBpX2NyZWF0ZSgmbXhjX3VscGlfYWNjZXNzX29wcywKKwkJCQlVU0JfT1RHX0RSVl9WQlVTIHwgVVNCX09UR19EUlZfVkJVU19FWFQpOworCisJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGdfaG9zdCwgJm90Z19wZGF0YSk7CisJfQorCisJdXNiaDJfcGRhdGEub3RnID0gb3RnX3VscGlfY3JlYXRlKCZteGNfdWxwaV9hY2Nlc3Nfb3BzLAorCQkJCVVTQl9PVEdfRFJWX1ZCVVMgfCBVU0JfT1RHX0RSVl9WQlVTX0VYVCk7CisKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDIsICZ1c2JoMl9wZGF0YSk7CisjZW5kaWYKKwlpZiAoIW90Z19tb2RlX2hvc3QpCisJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGdfdWRjX2RldmljZSwgJm90Z19kZXZpY2VfcGRhdGEpOworCisjaWZkZWYgQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YMjdfQkFTRUJPQVJECisJZXVrcmVhX21iaW14MjdfYmFzZWJvYXJkX2luaXQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDI3X3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDI3X2Nsb2Nrc19pbml0KDI2MDAwMDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgZXVrcmVhX2NwdWlteDI3X3RpbWVyID0geworCS5pbml0ID0gZXVrcmVhX2NwdWlteDI3X3RpbWVyX2luaXQsCit9OworCitNQUNISU5FX1NUQVJUKENQVUlNWDI3LCAiRVVLUkVBIENQVUlNWDI3IikKKwkucGh5c19pbyAgICAgICAgPSBNWDI3X0FJUElfQkFTRV9BRERSLAorCS5pb19wZ19vZmZzdCAgICA9ICgoTVgyN19BSVBJX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zICAgID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5tYXBfaW8gICAgICAgICA9IG14MjdfbWFwX2lvLAorCS5pbml0X2lycSAgICAgICA9IG14MjdfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZSAgID0gZXVrcmVhX2NwdWlteDI3X2luaXQsCisJLnRpbWVyICAgICAgICAgID0gJmV1a3JlYV9jcHVpbXgyN190aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3bGl0ZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2xpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmEyYjVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2xpdGUuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKKyAqIENvcHlyaWdodCAoQykgMjAwOCBKdWVyZ2VuIEJlaXNlcnQgKGtlcm5lbEBwZW5ndXRyb25peC5kZSkKKyAqIENvcHlyaWdodCAyMDA5IERhbmllbCBTY2hhZWZmZXIgKGRhbmllbC5zY2hhZWZmZXJAdGltZXN5cy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNy5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNy5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBteDI3bGl0ZV9waW5zW10gPSB7CisJLyogVUFSVDEgKi8KKwlQRTEyX1BGX1VBUlQxX1RYRCwKKwlQRTEzX1BGX1VBUlQxX1JYRCwKKwlQRTE0X1BGX1VBUlQxX0NUUywKKwlQRTE1X1BGX1VBUlQxX1JUUywKKwkvKiBGRUMgKi8KKwlQRDBfQUlOX0ZFQ19UWEQwLAorCVBEMV9BSU5fRkVDX1RYRDEsCisJUEQyX0FJTl9GRUNfVFhEMiwKKwlQRDNfQUlOX0ZFQ19UWEQzLAorCVBENF9BT1VUX0ZFQ19SWF9FUiwKKwlQRDVfQU9VVF9GRUNfUlhEMSwKKwlQRDZfQU9VVF9GRUNfUlhEMiwKKwlQRDdfQU9VVF9GRUNfUlhEMywKKwlQRDhfQUZfRkVDX01ESU8sCisJUEQ5X0FJTl9GRUNfTURDLAorCVBEMTBfQU9VVF9GRUNfQ1JTLAorCVBEMTFfQU9VVF9GRUNfVFhfQ0xLLAorCVBEMTJfQU9VVF9GRUNfUlhEMCwKKwlQRDEzX0FPVVRfRkVDX1JYX0RWLAorCVBEMTRfQU9VVF9GRUNfUlhfQ0xLLAorCVBEMTVfQU9VVF9GRUNfQ09MLAorCVBEMTZfQUlOX0ZFQ19UWF9FUiwKKwlQRjIzX0FJTl9GRUNfVFhfRU4sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0geworCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm14Y19mZWNfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG14MjdsaXRlX2luaXQodm9pZCkKK3sKKwlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjdsaXRlX3BpbnMsIEFSUkFZX1NJWkUobXgyN2xpdGVfcGlucyksCisJCSJpbXgyN2xpdGUiKTsKKwlpbXgyN19hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG14MjdsaXRlX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDI3X2Nsb2Nrc19pbml0KDI2MDAwMDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgbXgyN2xpdGVfdGltZXIgPSB7CisJLmluaXQJPSBteDI3bGl0ZV90aW1lcl9pbml0LAorfTsKKworTUFDSElORV9TVEFSVChJTVgyN0xJVEUsICJMb2dpY1BEIGkuTVgyN0xJVEUiKQorCS5waHlzX2lvICAgICAgICA9IE1YMjdfQUlQSV9CQVNFX0FERFIsCisJLmlvX3BnX29mZnN0ICAgID0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgICAgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLm1hcF9pbyAgICAgICAgID0gbXgyN19tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gbXgyN19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lICAgPSBteDI3bGl0ZV9pbml0LAorCS50aW1lciAgICAgICAgICA9ICZteDI3bGl0ZV90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDFhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E3NjBjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDFhZHMuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaW14L21hY2gtbXgxYWRzLmMKKyAqCisgKiBJbml0aWFsbHkgYmFzZWQgb246CisgKglsaW51eC0yLjYuNy1pbXgvYXJjaC9hcm0vbWFjaC1pbXgvc2NiOTMyOC5jCisgKglDb3B5cmlnaHQgKGMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFAc2FzY2hhaGF1ZXIuZGU+CisgKgorICogMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2Y4NTd4Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2kyYy5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgxLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDEuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3N0YXRpYyBpbnQgbXgxYWRzX3BpbnNbXSA9IHsKKwkvKiBVQVJUMSAqLworCVBDOV9QRl9VQVJUMV9DVFMsCisJUEMxMF9QRl9VQVJUMV9SVFMsCisJUEMxMV9QRl9VQVJUMV9UWEQsCisJUEMxMl9QRl9VQVJUMV9SWEQsCisJLyogVUFSVDIgKi8KKwlQQjI4X1BGX1VBUlQyX0NUUywKKwlQQjI5X1BGX1VBUlQyX1JUUywKKwlQQjMwX1BGX1VBUlQyX1RYRCwKKwlQQjMxX1BGX1VBUlQyX1JYRCwKKwkvKiBJMkMgKi8KKwlQQTE1X1BGX0kyQ19TREEsCisJUEExNl9QRl9JMkNfU0NMLAorCS8qIFNQSSAqLworCVBDMTNfUEZfU1BJMV9TUElfUkRZLAorCVBDMTRfUEZfU1BJMV9TQ0xLLAorCVBDMTVfUEZfU1BJMV9TUywKKwlQQzE2X1BGX1NQSTFfTUlTTywKKwlQQzE3X1BGX1NQSTFfTU9TSSwKK307CisKKy8qCisgKiBVQVJUcyBwbGF0Zm9ybSBkYXRhCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydDBfcGRhdGEgX19pbml0Y29uc3QgPSB7CisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisgICAgICAgCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0MV9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworLyoKKyAqIFBoeXNtYXAgZmxhc2gKKyAqLworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBteDFhZHNfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gNCwJCS8qIGJhbmt3aWR0aCBpbiBieXRlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBNWDFfQ1MwX1BIWVMsCisJLmVuZAk9IE1YMV9DUzBfUEhZUyArIFNaXzMyTSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCT0gMCwKKwkucmVzb3VyY2UgPSAmZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorfTsKKworLyoKKyAqIEkyQworICovCitzdGF0aWMgc3RydWN0IHBjZjg1N3hfcGxhdGZvcm1fZGF0YSBwY2Y4NTd4X2RhdGFbXSA9IHsKKwl7CisJCS5ncGlvX2Jhc2UgPSA0ICogMzIsCisJfSwgeworCQkuZ3Bpb19iYXNlID0gNCAqIDMyICsgMTYsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBteDFhZHNfaTJjX2RhdGEgX19pbml0Y29uc3QgPSB7CisJLmJpdHJhdGUgPSAxMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIG14MWFkc19pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInBjZjg1NzUiLCAweDIyKSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcGNmODU3eF9kYXRhWzBdLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInBjZjg1NzUiLCAweDI0KSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcGNmODU3eF9kYXRhWzFdLAorCX0sCit9OworCisvKgorICogQm9hcmQgaW5pdAorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbXgxYWRzX2luaXQodm9pZCkKK3sKKwlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MWFkc19waW5zLAorCQlBUlJBWV9TSVpFKG14MWFkc19waW5zKSwgIm14MWFkcyIpOworCisJLyogVUFSVCAqLworCWlteDFfYWRkX2lteF91YXJ0MCgmdWFydDBfcGRhdGEpOworCWlteDFfYWRkX2lteF91YXJ0MSgmdWFydDFfcGRhdGEpOworCisJLyogUGh5c21hcCBmbGFzaCAqLworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmZsYXNoX2RldmljZSwgJm14MWFkc19mbGFzaF9kYXRhKTsKKworCS8qIEkyQyAqLworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG14MWFkc19pMmNfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKG14MWFkc19pMmNfZGV2aWNlcykpOworCisJaW14MV9hZGRfaTJjX2lteCgmbXgxYWRzX2kyY19kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG14MWFkc190aW1lcl9pbml0KHZvaWQpCit7CisJbXgxX2Nsb2Nrc19pbml0KDMyMDAwKTsKK30KKworc3RydWN0IHN5c190aW1lciBteDFhZHNfdGltZXIgPSB7CisJLmluaXQJPSBteDFhZHNfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoTVgxQURTLCAiRnJlZXNjYWxlIE1YMUFEUyIpCisJLyogTWFpbnRhaW5lcjogU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCAqLworCS5waHlzX2lvCT0gTVgxX0lPX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QJPSAoTVgxX0lPX0JBU0VfQUREUl9WSVJUID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBNWDFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvCQk9IG14MV9tYXBfaW8sCisJLmluaXRfaXJxCT0gbXgxX2luaXRfaXJxLAorCS50aW1lcgkJPSAmbXgxYWRzX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBteDFhZHNfaW5pdCwKK01BQ0hJTkVfRU5ECisKK01BQ0hJTkVfU1RBUlQoTVhMQURTLCAiRnJlZXNjYWxlIE1YTEFEUyIpCisJLnBoeXNfaW8JPSBNWDFfSU9fQkFTRV9BRERSLAorCS5pb19wZ19vZmZzdAk9IChNWDFfSU9fQkFTRV9BRERSX1ZJUlQgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IE1YMV9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5tYXBfaW8JCT0gbXgxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBteDFfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZteDFhZHNfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG14MWFkc19pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyMWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDIxYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkN2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyMWFkcy5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICogIENvcHlyaWdodCAoQykgMjAwMiBTaGFuZSBOYXkgKHNoYW5lQG1pbmlybC5jb20pCisgKiAgQ29weXJpZ2h0IDIwMDYtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2lteGZiLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDIxLmg+CisjaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDIxLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCisvKgorICogTWVtb3J5LW1hcHBlZCBJL08gb24gTVgyMUFEUyBiYXNlIGJvYXJkCisgKi8KKyNkZWZpbmUgTVgyMUFEU19NTUlPX0JBU0VfQUREUiAgIDB4ZjUwMDAwMDAKKyNkZWZpbmUgTVgyMUFEU19NTUlPX1NJWkUgICAgICAgIFNaXzE2TQorCisjZGVmaW5lIE1YMjFBRFNfUkVHX0FERFIob2Zmc2V0KSAgICAodm9pZCBfX2ZvcmNlIF9faW9tZW0gKikgXAorCQkoTVgyMUFEU19NTUlPX0JBU0VfQUREUiArIChvZmZzZXQpKQorCisjZGVmaW5lIE1YMjFBRFNfQ1M4OTAwQV9JUlEgICAgICAgICBJUlFfR1BJT0UoMTEpCisjZGVmaW5lIE1YMjFBRFNfQ1M4OTAwQV9JT0JBU0VfUkVHICBNWDIxQURTX1JFR19BRERSKDB4MDAwMDAwKQorI2RlZmluZSBNWDIxQURTX1NUMTZDMjU1X0lPQkFTRV9SRUcgTVgyMUFEU19SRUdfQUREUigweDIwMDAwMCkKKyNkZWZpbmUgTVgyMUFEU19WRVJTSU9OX1JFRyAgICAgICAgIE1YMjFBRFNfUkVHX0FERFIoMHg0MDAwMDApCisjZGVmaW5lIE1YMjFBRFNfSU9fUkVHICAgICAgICAgICAgICBNWDIxQURTX1JFR19BRERSKDB4ODAwMDAwKQorCisvKiBNWDIxQURTX0lPX1JFRyBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTVgyMUFEU19JT19TRF9XUCAgICAgICAgMHgwMDAxIC8qIHJlYWQgKi8KKyNkZWZpbmUgTVgyMUFEU19JT19UUDYgICAgICAgICAgMHgwMDAxIC8qIHdyaXRlICovCisjZGVmaW5lIE1YMjFBRFNfSU9fU1dfU0VMICAgICAgIDB4MDAwMiAvKiByZWFkICovCisjZGVmaW5lIE1YMjFBRFNfSU9fVFA3ICAgICAgICAgIDB4MDAwMiAvKiB3cml0ZSAqLworI2RlZmluZSBNWDIxQURTX0lPX1JFU0VUX0VfVUFSVCAweDAwMDQKKyNkZWZpbmUgTVgyMUFEU19JT19SRVNFVF9CQVNFICAgMHgwMDA4CisjZGVmaW5lIE1YMjFBRFNfSU9fQ1NJX0NUTDIgICAgIDB4MDAxMAorI2RlZmluZSBNWDIxQURTX0lPX0NTSV9DVEwxICAgICAweDAwMjAKKyNkZWZpbmUgTVgyMUFEU19JT19DU0lfQ1RMMCAgICAgMHgwMDQwCisjZGVmaW5lIE1YMjFBRFNfSU9fVUFSVDFfRU4gICAgIDB4MDA4MAorI2RlZmluZSBNWDIxQURTX0lPX1VBUlQ0X0VOICAgICAweDAxMDAKKyNkZWZpbmUgTVgyMUFEU19JT19MQ0RPTiAgICAgICAgMHgwMjAwCisjZGVmaW5lIE1YMjFBRFNfSU9fSVJEQV9FTiAgICAgIDB4MDQwMAorI2RlZmluZSBNWDIxQURTX0lPX0lSREFfRklSX1NFTCAweDA4MDAKKyNkZWZpbmUgTVgyMUFEU19JT19JUkRBX01EMF9CICAgMHgxMDAwCisjZGVmaW5lIE1YMjFBRFNfSU9fSVJEQV9NRDEgICAgIDB4MjAwMAorI2RlZmluZSBNWDIxQURTX0lPX0xFRDRfT04gICAgICAweDQwMDAKKyNkZWZpbmUgTVgyMUFEU19JT19MRUQzX09OICAgICAgMHg4MDAwCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXgyMWFkc19waW5zW10gPSB7CisKKwkvKiBDUzg5MDBBICovCisJKEdQSU9fUE9SVEUgfCBHUElPX0dQSU8gfCBHUElPX0lOIHwgMTEpLAorCisJLyogVUFSVDEgKi8KKwlQRTEyX1BGX1VBUlQxX1RYRCwKKwlQRTEzX1BGX1VBUlQxX1JYRCwKKwlQRTE0X1BGX1VBUlQxX0NUUywKKwlQRTE1X1BGX1VBUlQxX1JUUywKKworCS8qIFVBUlQzIChJckRBKSAtIG9ubHkgVFhEIGFuZCBSWEQgKi8KKwlQRThfUEZfVUFSVDNfVFhELAorCVBFOV9QRl9VQVJUM19SWEQsCisKKwkvKiBVQVJUNCAqLworCVBCMjZfQUZfVUFSVDRfUlRTLAorCVBCMjhfQUZfVUFSVDRfVFhELAorCVBCMjlfQUZfVUFSVDRfQ1RTLAorCVBCMzFfQUZfVUFSVDRfUlhELAorCisJLyogTENEQyAqLworCVBBNV9QRl9MU0NMSywKKwlQQTZfUEZfTEQwLAorCVBBN19QRl9MRDEsCisJUEE4X1BGX0xEMiwKKwlQQTlfUEZfTEQzLAorCVBBMTBfUEZfTEQ0LAorCVBBMTFfUEZfTEQ1LAorCVBBMTJfUEZfTEQ2LAorCVBBMTNfUEZfTEQ3LAorCVBBMTRfUEZfTEQ4LAorCVBBMTVfUEZfTEQ5LAorCVBBMTZfUEZfTEQxMCwKKwlQQTE3X1BGX0xEMTEsCisJUEExOF9QRl9MRDEyLAorCVBBMTlfUEZfTEQxMywKKwlQQTIwX1BGX0xEMTQsCisJUEEyMV9QRl9MRDE1LAorCVBBMjJfUEZfTEQxNiwKKwlQQTI0X1BGX1JFViwgICAgIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KKwlQQTI1X1BGX0NMUywgICAgIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KKwlQQTI2X1BGX1BTLCAgICAgIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KKwlQQTI3X1BGX1NQTF9TUFIsIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KKwlQQTI4X1BGX0hTWU5DLAorCVBBMjlfUEZfVlNZTkMsCisJUEEzMF9QRl9DT05UUkFTVCwKKwlQQTMxX1BGX09FX0FDRCwKKworCS8qIE1NQy9TREhDICovCisJUEUxOF9QRl9TRDFfRDAsCisJUEUxOV9QRl9TRDFfRDEsCisJUEUyMF9QRl9TRDFfRDIsCisJUEUyMV9QRl9TRDFfRDMsCisJUEUyMl9QRl9TRDFfQ01ELAorCVBFMjNfUEZfU0QxX0NMSywKKworCS8qIE5GQyAqLworCVBGMF9QRl9OUkZCLAorCVBGMV9QRl9ORkNFLAorCVBGMl9QRl9ORldQLAorCVBGM19QRl9ORkNMRSwKKwlQRjRfUEZfTkZBTEUsCisJUEY1X1BGX05GUkUsCisJUEY2X1BGX05GV0UsCisJUEY3X1BGX05GSU8wLAorCVBGOF9QRl9ORklPMSwKKwlQRjlfUEZfTkZJTzIsCisJUEYxMF9QRl9ORklPMywKKwlQRjExX1BGX05GSU80LAorCVBGMTJfUEZfTkZJTzUsCisJUEYxM19QRl9ORklPNiwKKwlQRjE0X1BGX05GSU83LAorfTsKKworLyogQURTJ3MgTk9SIGZsYXNoOiAyeCBBTTI5QkRTMTI4SEU5VktJIG9uIDMyLWJpdCBidXMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG14MjFhZHNfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggPSA0LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDIxYWRzX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IE1YMjFfQ1MwX0JBU0VfQUREUiwKKwkuZW5kID0gTVgyMV9DUzBfQkFTRV9BRERSICsgMHgwMjAwMDAwMCAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDIxYWRzX25vcl9tdGRfZGV2aWNlID0geworCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmbXgyMWFkc19mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZteDIxYWRzX2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YV9ydHMgX19pbml0Y29uc3QgPSB7CisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGFfbm9ydHMgX19pbml0Y29uc3QgPSB7Cit9OworCitzdGF0aWMgaW50IG14MjFhZHNfZmJfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXUxNiB0bXA7CisKKwl0bXAgPSBfX3Jhd19yZWFkdyhNWDIxQURTX0lPX1JFRyk7CisJdG1wIHw9IE1YMjFBRFNfSU9fTENET047CisJX19yYXdfd3JpdGV3KHRtcCwgTVgyMUFEU19JT19SRUcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBteDIxYWRzX2ZiX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MTYgdG1wOworCisJdG1wID0gX19yYXdfcmVhZHcoTVgyMUFEU19JT19SRUcpOworCXRtcCAmPSB+TVgyMUFEU19JT19MQ0RPTjsKKwlfX3Jhd193cml0ZXcodG1wLCBNWDIxQURTX0lPX1JFRyk7Cit9CisKKy8qCisgKiBDb25uZWN0ZWQgaXMgYSBwb3J0cmFpdCBTaGFycC1RVkdBIGRpc3BsYXkKKyAqIG9mIHR5cGU6IExRMDM1UTdEQjAyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW14X2ZiX3ZpZGVvbW9kZSBteDIxYWRzX21vZGVzW10gPSB7CisJeworCQkubW9kZSA9IHsKKwkJCS5uYW1lCQk9ICJTaGFycC1MUTAzNVE3IiwKKwkJCS5yZWZyZXNoCT0gNjAsCisJCQkueHJlcwkJPSAyNDAsCisJCQkueXJlcwkJPSAzMjAsCisJCQkucGl4Y2xvY2sJPSAxODg2NzksIC8qIGluIHBzICg1LjNNSHopICovCisJCQkuaHN5bmNfbGVuCT0gMiwKKwkJCS5sZWZ0X21hcmdpbgk9IDYsCisJCQkucmlnaHRfbWFyZ2luCT0gMTYsCisJCQkudnN5bmNfbGVuCT0gMSwKKwkJCS51cHBlcl9tYXJnaW4JPSA4LAorCQkJLmxvd2VyX21hcmdpbgk9IDEwLAorCQl9LAorCQkucGNyCQk9IDB4ZmIxMDhiYzcsCisJCS5icHAJCT0gMTYsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2ZiX3BsYXRmb3JtX2RhdGEgbXgyMWFkc19mYl9kYXRhID0geworCS5tb2RlID0gbXgyMWFkc19tb2RlcywKKwkubnVtX21vZGVzID0gQVJSQVlfU0laRShteDIxYWRzX21vZGVzKSwKKworCS5wd21yCQk9IDB4MDBhOTAzZmYsCisJLmxzY3IxCQk9IDB4MDAxMjAzMDAsCisJLmRtYWNyCQk9IDB4MDAwMjAwMDgsCisKKwkuaW5pdCA9IG14MjFhZHNfZmJfaW5pdCwKKwkuZXhpdCA9IG14MjFhZHNfZmJfZXhpdCwKK307CisKK3N0YXRpYyBpbnQgbXgyMWFkc19zZGhjX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChfX3Jhd19yZWFkdyhNWDIxQURTX0lPX1JFRykgJiBNWDIxQURTX0lPX1NEX1dQKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IG14MjFhZHNfc2RoY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBkZXRlY3RfaXJxLAorCXZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9HUElPRCgyNSksIGRldGVjdF9pcnEsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCAibW1jLWRldGVjdCIsIGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG14MjFhZHNfc2RoY19leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX2lycShJUlFfR1BJT0QoMjUpLCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBpbXhtbWNfcGxhdGZvcm1fZGF0YSBteDIxYWRzX3NkaGNfcGRhdGEgPSB7CisJLm9jcl9hdmFpbCA9IE1NQ19WRERfMjlfMzAgfCBNTUNfVkREXzMwXzMxLCAvKiAzLjBWICovCisJLmdldF9ybyA9IG14MjFhZHNfc2RoY19nZXRfcm8sCisJLmluaXQgPSBteDIxYWRzX3NkaGNfaW5pdCwKKwkuZXhpdCA9IG14MjFhZHNfc2RoY19leGl0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCitteDIxYWRzX25hbmRfYm9hcmRfaW5mbyBfX2luaXRjb25zdCA9IHsKKwkud2lkdGggPSAxLAorCS5od19lY2MgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDIxYWRzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCS8qCisJICogTWVtb3J5LW1hcHBlZCBJL08gb24gTVgyMUFEUyBCYXNlIGJvYXJkOgorCSAqICAgLSBDUzg5MDBBIEV0aGVybmV0IGNvbnRyb2xsZXIKKwkgKiAgIC0gU1QxNkMyNTUyQ0ogVUFSVAorCSAqICAgLSBDUFUgYW5kIEJhc2UgYm9hcmQgdmVyc2lvbgorCSAqICAgLSBCYXNlIGJvYXJkIEkvTyByZWdpc3RlcgorCSAqLworCXsKKwkJLnZpcnR1YWwgPSBNWDIxQURTX01NSU9fQkFTRV9BRERSLAorCQkucGZuID0gX19waHlzX3RvX3BmbihNWDIxX0NTMV9CQVNFX0FERFIpLAorCQkubGVuZ3RoID0gTVgyMUFEU19NTUlPX1NJWkUsCisJCS50eXBlID0gTVRfREVWSUNFLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbXgyMWFkc19tYXBfaW8odm9pZCkKK3sKKwlteDIxX21hcF9pbygpOworCWlvdGFibGVfaW5pdChteDIxYWRzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgyMWFkc19pb19kZXNjKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbXgyMWFkc19ub3JfbXRkX2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteDIxYWRzX2JvYXJkX2luaXQodm9pZCkKK3sKKwlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjFhZHNfcGlucywgQVJSQVlfU0laRShteDIxYWRzX3BpbnMpLAorCQkJIm14MjFhZHMiKTsKKworCWlteDIxX2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGFfcnRzKTsKKwlpbXgyMV9hZGRfaW14X3VhcnQyKCZ1YXJ0X3BkYXRhX25vcnRzKTsKKwlpbXgyMV9hZGRfaW14X3VhcnQzKCZ1YXJ0X3BkYXRhX3J0cyk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2ZiX2RldmljZSwgJm14MjFhZHNfZmJfZGF0YSk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NkaGNfZGV2aWNlMCwgJm14MjFhZHNfc2RoY19wZGF0YSk7CisJaW14MjFfYWRkX214Y19uYW5kKCZteDIxYWRzX25hbmRfYm9hcmRfaW5mbyk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG14MjFhZHNfdGltZXJfaW5pdCh2b2lkKQoreworCW14MjFfY2xvY2tzX2luaXQoMzI3NjgsIDI2MDAwMDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgbXgyMWFkc190aW1lciA9IHsKKwkuaW5pdAk9IG14MjFhZHNfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoTVgyMUFEUywgIkZyZWVzY2FsZSBpLk1YMjFBRFMiKQorCS8qIG1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCisJLnBoeXNfaW8gICAgICAgID0gTVgyMV9BSVBJX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QgICAgPSAoKE1YMjFfQUlQSV9CQVNFX0FERFJfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcyAgICA9IE1YMjFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvICAgICAgICAgPSBteDIxYWRzX21hcF9pbywKKwkuaW5pdF9pcnEgICAgICAgPSBteDIxX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgICA9IG14MjFhZHNfYm9hcmRfaW5pdCwKKwkudGltZXIgICAgICAgICAgPSAmbXgyMWFkc190aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdfM2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2ZmZhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN18zZHMuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBGYWJpbyBFc3RldmFtIDxmYWJpby5lc3RldmFtQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUaGlzIG1hY2hpbmUgaXMga25vd24gYXM6CisgKiAgLSBpLk1YMjcgMy1TdGFjayBEZXZlbG9wbWVudCBTeXN0ZW0KKyAqICAtIGkuTVgyNyBQbGF0Zm9ybSBEZXZlbG9wbWVudCBLaXQgKGkuTVgyNyBQREspCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNy5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNy5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBteDI3cGRrX3BpbnNbXSA9IHsKKwkvKiBVQVJUMSAqLworCVBFMTJfUEZfVUFSVDFfVFhELAorCVBFMTNfUEZfVUFSVDFfUlhELAorCVBFMTRfUEZfVUFSVDFfQ1RTLAorCVBFMTVfUEZfVUFSVDFfUlRTLAorCS8qIEZFQyAqLworCVBEMF9BSU5fRkVDX1RYRDAsCisJUEQxX0FJTl9GRUNfVFhEMSwKKwlQRDJfQUlOX0ZFQ19UWEQyLAorCVBEM19BSU5fRkVDX1RYRDMsCisJUEQ0X0FPVVRfRkVDX1JYX0VSLAorCVBENV9BT1VUX0ZFQ19SWEQxLAorCVBENl9BT1VUX0ZFQ19SWEQyLAorCVBEN19BT1VUX0ZFQ19SWEQzLAorCVBEOF9BRl9GRUNfTURJTywKKwlQRDlfQUlOX0ZFQ19NREMsCisJUEQxMF9BT1VUX0ZFQ19DUlMsCisJUEQxMV9BT1VUX0ZFQ19UWF9DTEssCisJUEQxMl9BT1VUX0ZFQ19SWEQwLAorCVBEMTNfQU9VVF9GRUNfUlhfRFYsCisJUEQxNF9BT1VUX0ZFQ19SWF9DTEssCisJUEQxNV9BT1VUX0ZFQ19DT0wsCisJUEQxNl9BSU5fRkVDX1RYX0VSLAorCVBGMjNfQUlOX0ZFQ19UWF9FTiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbXhjX2ZlY19kZXZpY2UsCit9OworCisvKgorICogTWF0cml4IGtleWJvYXJkCisgKi8KKworc3RhdGljIGNvbnN0IHVpbnQzMl90IG14MjdfM2RzX2tleW1hcFtdID0geworCUtFWSgwLCAwLCBLRVlfVVApLAorCUtFWSgwLCAxLCBLRVlfRE9XTiksCisJS0VZKDEsIDAsIEtFWV9SSUdIVCksCisJS0VZKDEsIDEsIEtFWV9MRUZUKSwKKwlLRVkoMSwgMiwgS0VZX0VOVEVSKSwKKwlLRVkoMiwgMCwgS0VZX0Y2KSwKKwlLRVkoMiwgMSwgS0VZX0Y4KSwKKwlLRVkoMiwgMiwgS0VZX0Y5KSwKKwlLRVkoMiwgMywgS0VZX0YxMCksCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBteDI3XzNkc19rZXltYXBfZGF0YSA9IHsKKwkua2V5bWFwCQk9IG14MjdfM2RzX2tleW1hcCwKKwkua2V5bWFwX3NpemUJPSBBUlJBWV9TSVpFKG14MjdfM2RzX2tleW1hcCksCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbXgyN3Bka19pbml0KHZvaWQpCit7CisJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteDI3cGRrX3BpbnMsIEFSUkFZX1NJWkUobXgyN3Bka19waW5zKSwKKwkJIm14MjdwZGsiKTsKKwlpbXgyN19hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXhfa3BwX2RldmljZSwgJm14MjdfM2RzX2tleW1hcF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG14MjdwZGtfdGltZXJfaW5pdCh2b2lkKQoreworCW14MjdfY2xvY2tzX2luaXQoMjYwMDAwMDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBteDI3cGRrX3RpbWVyID0geworCS5pbml0CT0gbXgyN3Bka190aW1lcl9pbml0LAorfTsKKworTUFDSElORV9TVEFSVChNWDI3XzNEUywgIkZyZWVzY2FsZSBNWDI3UERLIikKKwkvKiBtYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLworCS5waHlzX2lvICAgICAgICA9IE1YMjdfQUlQSV9CQVNFX0FERFIsCisJLmlvX3BnX29mZnN0ICAgID0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgICAgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLm1hcF9pbyAgICAgICAgID0gbXgyN19tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gbXgyN19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lICAgPSBteDI3cGRrX2luaXQsCisJLnRpbWVyICAgICAgICAgID0gJm14MjdwZGtfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI3YWRzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzc3ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI3YWRzLmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKKyAqICBDb3B5cmlnaHQgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDI3Lmg+CisjaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgorI2luY2x1ZGUgPG1hY2gvaW14ZmIuaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNy5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworLyoKKyAqIEJhc2UgYWRkcmVzcyBvZiBQQkMgY29udHJvbGxlciwgQ1M0CisgKi8KKyNkZWZpbmUgUEJDX0JBU0VfQUREUkVTUyAgICAgICAgMHhmNDMwMDAwMAorI2RlZmluZSBQQkNfUkVHX0FERFIob2Zmc2V0KSAgICAodm9pZCBfX2ZvcmNlIF9faW9tZW0gKikgXAorCQkoUEJDX0JBU0VfQUREUkVTUyArIChvZmZzZXQpKQorCisvKiBXaGVuIHRoZSBQQkMgYWRkcmVzcyBjb25uZWN0aW9uIGlzIGZpeGVkIGluIGgvdywgZGVmaW5lZCBhcyAxICovCisjZGVmaW5lIFBCQ19BRERSX1NIICAgICAgICAgICAgIDAKKworLyogT2Zmc2V0cyBmb3IgdGhlIFBCQyBDb250cm9sbGVyIHJlZ2lzdGVyICovCisvKgorICogUEJDIEJvYXJkIHZlcnNpb24gcmVnaXN0ZXIgb2Zmc2V0CisgKi8KKyNkZWZpbmUgUEJDX1ZFUlNJT05fUkVHICAgICAgICAgUEJDX1JFR19BRERSKDB4MDAwMDAgPj4gUEJDX0FERFJfU0gpCisvKgorICogUEJDIEJvYXJkIGNvbnRyb2wgcmVnaXN0ZXIgMSBzZXQgYWRkcmVzcy4KKyAqLworI2RlZmluZSBQQkNfQkNUUkwxX1NFVF9SRUcgICAgICBQQkNfUkVHX0FERFIoMHgwMDAwOCA+PiBQQkNfQUREUl9TSCkKKy8qCisgKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAxIGNsZWFyIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgUEJDX0JDVFJMMV9DTEVBUl9SRUcgICAgUEJDX1JFR19BRERSKDB4MDAwMEMgPj4gUEJDX0FERFJfU0gpCisKKy8qIFBCQyBCb2FyZCBDb250cm9sIFJlZ2lzdGVyIDEgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFBCQ19CQ1RSTDFfTENET04gICAgICAgIDB4MDgwMAkvKiBFbmFibGUgdGhlIExDRCAqLworCisvKiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZXh0ZXJuYWwgY3J5c3RhbCByZWZlcmVuY2UgKi8KKyNkZWZpbmUgQ0tJSF8yN01IWl9CSVRfU0VUICAgICAgKDEgPDwgMykKKworc3RhdGljIHVuc2lnbmVkIGludCBteDI3YWRzX3BpbnNbXSA9IHsKKwkvKiBVQVJUMCAqLworCVBFMTJfUEZfVUFSVDFfVFhELAorCVBFMTNfUEZfVUFSVDFfUlhELAorCVBFMTRfUEZfVUFSVDFfQ1RTLAorCVBFMTVfUEZfVUFSVDFfUlRTLAorCS8qIFVBUlQxICovCisJUEUzX1BGX1VBUlQyX0NUUywKKwlQRTRfUEZfVUFSVDJfUlRTLAorCVBFNl9QRl9VQVJUMl9UWEQsCisJUEU3X1BGX1VBUlQyX1JYRCwKKwkvKiBVQVJUMiAqLworCVBFOF9QRl9VQVJUM19UWEQsCisJUEU5X1BGX1VBUlQzX1JYRCwKKwlQRTEwX1BGX1VBUlQzX0NUUywKKwlQRTExX1BGX1VBUlQzX1JUUywKKwkvKiBVQVJUMyAqLworCVBCMjZfQUZfVUFSVDRfUlRTLAorCVBCMjhfQUZfVUFSVDRfVFhELAorCVBCMjlfQUZfVUFSVDRfQ1RTLAorCVBCMzFfQUZfVUFSVDRfUlhELAorCS8qIFVBUlQ0ICovCisJUEIxOF9BRl9VQVJUNV9UWEQsCisJUEIxOV9BRl9VQVJUNV9SWEQsCisJUEIyMF9BRl9VQVJUNV9DVFMsCisJUEIyMV9BRl9VQVJUNV9SVFMsCisJLyogVUFSVDUgKi8KKwlQQjEwX0FGX1VBUlQ2X1RYRCwKKwlQQjEyX0FGX1VBUlQ2X0NUUywKKwlQQjExX0FGX1VBUlQ2X1JYRCwKKwlQQjEzX0FGX1VBUlQ2X1JUUywKKwkvKiBGRUMgKi8KKwlQRDBfQUlOX0ZFQ19UWEQwLAorCVBEMV9BSU5fRkVDX1RYRDEsCisJUEQyX0FJTl9GRUNfVFhEMiwKKwlQRDNfQUlOX0ZFQ19UWEQzLAorCVBENF9BT1VUX0ZFQ19SWF9FUiwKKwlQRDVfQU9VVF9GRUNfUlhEMSwKKwlQRDZfQU9VVF9GRUNfUlhEMiwKKwlQRDdfQU9VVF9GRUNfUlhEMywKKwlQRDhfQUZfRkVDX01ESU8sCisJUEQ5X0FJTl9GRUNfTURDLAorCVBEMTBfQU9VVF9GRUNfQ1JTLAorCVBEMTFfQU9VVF9GRUNfVFhfQ0xLLAorCVBEMTJfQU9VVF9GRUNfUlhEMCwKKwlQRDEzX0FPVVRfRkVDX1JYX0RWLAorCVBEMTRfQU9VVF9GRUNfUlhfQ0xLLAorCVBEMTVfQU9VVF9GRUNfQ09MLAorCVBEMTZfQUlOX0ZFQ19UWF9FUiwKKwlQRjIzX0FJTl9GRUNfVFhfRU4sCisJLyogSTJDMiAqLworCVBDNV9QRl9JMkMyX1NEQSwKKwlQQzZfUEZfSTJDMl9TQ0wsCisJLyogRkIgKi8KKwlQQTVfUEZfTFNDTEssCisJUEE2X1BGX0xEMCwKKwlQQTdfUEZfTEQxLAorCVBBOF9QRl9MRDIsCisJUEE5X1BGX0xEMywKKwlQQTEwX1BGX0xENCwKKwlQQTExX1BGX0xENSwKKwlQQTEyX1BGX0xENiwKKwlQQTEzX1BGX0xENywKKwlQQTE0X1BGX0xEOCwKKwlQQTE1X1BGX0xEOSwKKwlQQTE2X1BGX0xEMTAsCisJUEExN19QRl9MRDExLAorCVBBMThfUEZfTEQxMiwKKwlQQTE5X1BGX0xEMTMsCisJUEEyMF9QRl9MRDE0LAorCVBBMjFfUEZfTEQxNSwKKwlQQTIyX1BGX0xEMTYsCisJUEEyM19QRl9MRDE3LAorCVBBMjRfUEZfUkVWLAorCVBBMjVfUEZfQ0xTLAorCVBBMjZfUEZfUFMsCisJUEEyN19QRl9TUExfU1BSLAorCVBBMjhfUEZfSFNZTkMsCisJUEEyOV9QRl9WU1lOQywKKwlQQTMwX1BGX0NPTlRSQVNULAorCVBBMzFfUEZfT0VfQUNELAorCS8qIE9XSVJFICovCisJUEUxNl9BRl9PV0lSRSwKKwkvKiBTREhDMSovCisJUEUxOF9QRl9TRDFfRDAsCisJUEUxOV9QRl9TRDFfRDEsCisJUEUyMF9QRl9TRDFfRDIsCisJUEUyMV9QRl9TRDFfRDMsCisJUEUyMl9QRl9TRDFfQ01ELAorCVBFMjNfUEZfU0QxX0NMSywKKwkvKiBTREhDMiovCisJUEI0X1BGX1NEMl9EMCwKKwlQQjVfUEZfU0QyX0QxLAorCVBCNl9QRl9TRDJfRDIsCisJUEI3X1BGX1NEMl9EMywKKwlQQjhfUEZfU0QyX0NNRCwKKwlQQjlfUEZfU0QyX0NMSywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YQorbXgyN2Fkc19uYW5kX2JvYXJkX2luZm8gX19pbml0Y29uc3QgPSB7CisJLndpZHRoID0gMSwKKwkuaHdfZWNjID0gMSwKK307CisKKy8qIEFEUydzIE5PUiBmbGFzaCAqLworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgbXgyN2Fkc19mbGFzaF9kYXRhID0geworCS53aWR0aCA9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14MjdhZHNfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0ID0gMHhjMDAwMDAwMCwKKwkuZW5kID0gMHhjMDAwMDAwMCArIDB4MDIwMDAwMDAgLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI3YWRzX25vcl9tdGRfZGV2aWNlID0geworCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmbXgyN2Fkc19mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZteDI3YWRzX2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBteDI3YWRzX2kyYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXgyN2Fkc19pMmNfZGV2aWNlc1tdID0geworfTsKKwordm9pZCBsY2RfcG93ZXIoaW50IG9uKQoreworCWlmIChvbikKKwkJX19yYXdfd3JpdGV3KFBCQ19CQ1RSTDFfTENET04sIFBCQ19CQ1RSTDFfU0VUX1JFRyk7CisJZWxzZQorCQlfX3Jhd193cml0ZXcoUEJDX0JDVFJMMV9MQ0RPTiwgUEJDX0JDVFJMMV9DTEVBUl9SRUcpOworfQorCitzdGF0aWMgc3RydWN0IGlteF9mYl92aWRlb21vZGUgbXgyN2Fkc19tb2Rlc1tdID0geworCXsKKwkJLm1vZGUgPSB7CisJCQkubmFtZQkJPSAiU2hhcnAtTFEwMzVRNyIsCisJCQkucmVmcmVzaAk9IDYwLAorCQkJLnhyZXMJCT0gMjQwLAorCQkJLnlyZXMJCT0gMzIwLAorCQkJLnBpeGNsb2NrCT0gMTg4Njc5LCAvKiBpbiBwcyAoNS4zTUh6KSAqLworCQkJLmhzeW5jX2xlbgk9IDEsCisJCQkubGVmdF9tYXJnaW4JPSA5LAorCQkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkJLnZzeW5jX2xlbgk9IDEsCisJCQkudXBwZXJfbWFyZ2luCT0gNywKKwkJCS5sb3dlcl9tYXJnaW4JPSA5LAorCQl9LAorCQkuYnBwCQk9IDE2LAorCQkucGNyCQk9IDB4RkIwMDhCQzAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2ZiX3BsYXRmb3JtX2RhdGEgbXgyN2Fkc19mYl9kYXRhID0geworCS5tb2RlID0gbXgyN2Fkc19tb2RlcywKKwkubnVtX21vZGVzID0gQVJSQVlfU0laRShteDI3YWRzX21vZGVzKSwKKworCS8qCisJICogLSBIU1lOQyBhY3RpdmUgaGlnaAorCSAqIC0gVlNZTkMgYWN0aXZlIGhpZ2gKKwkgKiAtIGNsayBub3RlbmFibGVkIHdoaWxlIGlkbGUKKwkgKiAtIGNsb2NrIGludmVydGVkCisJICogLSBkYXRhIG5vdCBpbnZlcnRlZAorCSAqIC0gZGF0YSBlbmFibGUgbG93IGFjdGl2ZQorCSAqIC0gZW5hYmxlIHNoYXJwIG1vZGUKKwkgKi8KKwkucHdtcgkJPSAweDAwQTkwM0ZGLAorCS5sc2NyMQkJPSAweDAwMTIwMzAwLAorCS5kbWFjcgkJPSAweDAwMDIwMDEwLAorCisJLmxjZF9wb3dlcgk9IGxjZF9wb3dlciwKK307CisKK3N0YXRpYyBpbnQgbXgyN2Fkc19zZGhjMV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBkZXRlY3RfaXJxLAorCQkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcmVxdWVzdF9pcnEoSVJRX0dQSU9FKDIxKSwgZGV0ZWN0X2lycSwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCSAgICJzZGhjMS1jYXJkLWRldGVjdCIsIGRhdGEpOworfQorCitzdGF0aWMgaW50IG14MjdhZHNfc2RoYzJfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgZGV0ZWN0X2lycSwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHJlcXVlc3RfaXJxKElSUV9HUElPQig3KSwgZGV0ZWN0X2lycSwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCSAgICJzZGhjMi1jYXJkLWRldGVjdCIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBteDI3YWRzX3NkaGMxX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKElSUV9HUElPRSgyMSksIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBteDI3YWRzX3NkaGMyX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKElSUV9HUElPQig3KSwgZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW14bW1jX3BsYXRmb3JtX2RhdGEgc2RoYzFfcGRhdGEgPSB7CisJLmluaXQgPSBteDI3YWRzX3NkaGMxX2luaXQsCisJLmV4aXQgPSBteDI3YWRzX3NkaGMxX2V4aXQsCit9OworCitzdGF0aWMgc3RydWN0IGlteG1tY19wbGF0Zm9ybV9kYXRhIHNkaGMyX3BkYXRhID0geworCS5pbml0ID0gbXgyN2Fkc19zZGhjMl9pbml0LAorCS5leGl0ID0gbXgyN2Fkc19zZGhjMl9leGl0LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZteDI3YWRzX25vcl9tdGRfZGV2aWNlLAorCSZteGNfZmVjX2RldmljZSwKKwkmbXhjX3cxX21hc3Rlcl9kZXZpY2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0geworCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbXgyN2Fkc19ib2FyZF9pbml0KHZvaWQpCit7CisJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteDI3YWRzX3BpbnMsIEFSUkFZX1NJWkUobXgyN2Fkc19waW5zKSwKKwkJCSJteDI3YWRzIik7CisKKwlpbXgyN19hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKwlpbXgyN19hZGRfaW14X3VhcnQxKCZ1YXJ0X3BkYXRhKTsKKwlpbXgyN19hZGRfaW14X3VhcnQyKCZ1YXJ0X3BkYXRhKTsKKwlpbXgyN19hZGRfaW14X3VhcnQzKCZ1YXJ0X3BkYXRhKTsKKwlpbXgyN19hZGRfaW14X3VhcnQ0KCZ1YXJ0X3BkYXRhKTsKKwlpbXgyN19hZGRfaW14X3VhcnQ1KCZ1YXJ0X3BkYXRhKTsKKwlpbXgyN19hZGRfbXhjX25hbmQoJm14MjdhZHNfbmFuZF9ib2FyZF9pbmZvKTsKKworCS8qIG9ubHkgdGhlIGkyYyBtYXN0ZXIgMSBpcyB1c2VkIG9uIHRoaXMgQ1BVIGNhcmQgKi8KKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBteDI3YWRzX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUobXgyN2Fkc19pMmNfZGV2aWNlcykpOworCWlteDI3X2FkZF9pMmNfaW14MSgmbXgyN2Fkc19pMmMxX2RhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19mYl9kZXZpY2UsICZteDI3YWRzX2ZiX2RhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTAsICZzZGhjMV9wZGF0YSk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NkaGNfZGV2aWNlMSwgJnNkaGMyX3BkYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXgyN2Fkc190aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmcmVmID0gMjYwMDAwMDA7CisKKwlpZiAoKF9fcmF3X3JlYWR3KFBCQ19WRVJTSU9OX1JFRykgJiBDS0lIXzI3TUhaX0JJVF9TRVQpID09IDApCisJCWZyZWYgPSAyNzAwMDAwMDsKKworCW14MjdfY2xvY2tzX2luaXQoZnJlZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIG14MjdhZHNfdGltZXIgPSB7CisJLmluaXQJPSBteDI3YWRzX3RpbWVyX2luaXQsCit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MjdhZHNfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbCA9IFBCQ19CQVNFX0FERFJFU1MsCisJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKE1YMjdfQ1M0X0JBU0VfQUREUiksCisJCS5sZW5ndGggPSBTWl8xTSwKKwkJLnR5cGUgPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteDI3YWRzX21hcF9pbyh2b2lkKQoreworCW14MjdfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KG14MjdhZHNfaW9fZGVzYywgQVJSQVlfU0laRShteDI3YWRzX2lvX2Rlc2MpKTsKK30KKworTUFDSElORV9TVEFSVChNWDI3QURTLCAiRnJlZXNjYWxlIGkuTVgyN0FEUyIpCisJLyogbWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KKwkucGh5c19pbyAgICAgICAgPSBNWDI3X0FJUElfQkFTRV9BRERSLAorCS5pb19wZ19vZmZzdCAgICA9ICgoTVgyN19BSVBJX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zICAgID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5tYXBfaW8gICAgICAgICA9IG14MjdhZHNfbWFwX2lvLAorCS5pbml0X2lycSAgICAgICA9IG14MjdfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZSAgID0gbXgyN2Fkc19ib2FyZF9pbml0LAorCS50aW1lciAgICAgICAgICA9ICZteDI3YWRzX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ExZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teHRfdGQ2MC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICogIENvcHlyaWdodCAoQykgMjAwMiBTaGFuZSBOYXkgKHNoYW5lQG1pbmlybC5jb20pCisgKiAgQ29weXJpZ2h0IDIwMDYtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KKyNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KKyNpbmNsdWRlIDxtYWNoL2lteGZiLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KKworI2luY2x1ZGUgImRldmljZXMtaW14MjcuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXh0X3RkNjBfcGluc1tdIF9faW5pdGRhdGEgPSB7CisJLyogVUFSVDAgKi8KKwlQRTEyX1BGX1VBUlQxX1RYRCwKKwlQRTEzX1BGX1VBUlQxX1JYRCwKKwlQRTE0X1BGX1VBUlQxX0NUUywKKwlQRTE1X1BGX1VBUlQxX1JUUywKKwkvKiBVQVJUMSAqLworCVBFM19QRl9VQVJUMl9DVFMsCisJUEU0X1BGX1VBUlQyX1JUUywKKwlQRTZfUEZfVUFSVDJfVFhELAorCVBFN19QRl9VQVJUMl9SWEQsCisJLyogVUFSVDIgKi8KKwlQRThfUEZfVUFSVDNfVFhELAorCVBFOV9QRl9VQVJUM19SWEQsCisJUEUxMF9QRl9VQVJUM19DVFMsCisJUEUxMV9QRl9VQVJUM19SVFMsCisJLyogRkVDICovCisJUEQwX0FJTl9GRUNfVFhEMCwKKwlQRDFfQUlOX0ZFQ19UWEQxLAorCVBEMl9BSU5fRkVDX1RYRDIsCisJUEQzX0FJTl9GRUNfVFhEMywKKwlQRDRfQU9VVF9GRUNfUlhfRVIsCisJUEQ1X0FPVVRfRkVDX1JYRDEsCisJUEQ2X0FPVVRfRkVDX1JYRDIsCisJUEQ3X0FPVVRfRkVDX1JYRDMsCisJUEQ4X0FGX0ZFQ19NRElPLAorCVBEOV9BSU5fRkVDX01EQywKKwlQRDEwX0FPVVRfRkVDX0NSUywKKwlQRDExX0FPVVRfRkVDX1RYX0NMSywKKwlQRDEyX0FPVVRfRkVDX1JYRDAsCisJUEQxM19BT1VUX0ZFQ19SWF9EViwKKwlQRDE0X0FPVVRfRkVDX1JYX0NMSywKKwlQRDE1X0FPVVRfRkVDX0NPTCwKKwlQRDE2X0FJTl9GRUNfVFhfRVIsCisJUEYyM19BSU5fRkVDX1RYX0VOLAorCS8qIEkyQzEgKi8KKwlQRDE3X1BGX0kyQ19EQVRBLAorCVBEMThfUEZfSTJDX0NMSywKKwkvKiBJMkMyICovCisJUEM1X1BGX0kyQzJfU0RBLAorCVBDNl9QRl9JMkMyX1NDTCwKKwkvKiBGQiAqLworCVBBNV9QRl9MU0NMSywKKwlQQTZfUEZfTEQwLAorCVBBN19QRl9MRDEsCisJUEE4X1BGX0xEMiwKKwlQQTlfUEZfTEQzLAorCVBBMTBfUEZfTEQ0LAorCVBBMTFfUEZfTEQ1LAorCVBBMTJfUEZfTEQ2LAorCVBBMTNfUEZfTEQ3LAorCVBBMTRfUEZfTEQ4LAorCVBBMTVfUEZfTEQ5LAorCVBBMTZfUEZfTEQxMCwKKwlQQTE3X1BGX0xEMTEsCisJUEExOF9QRl9MRDEyLAorCVBBMTlfUEZfTEQxMywKKwlQQTIwX1BGX0xEMTQsCisJUEEyMV9QRl9MRDE1LAorCVBBMjJfUEZfTEQxNiwKKwlQQTIzX1BGX0xEMTcsCisJUEEyNV9QRl9DTFMsCisJUEEyN19QRl9TUExfU1BSLAorCVBBMjhfUEZfSFNZTkMsCisJUEEyOV9QRl9WU1lOQywKKwlQQTMwX1BGX0NPTlRSQVNULAorCVBBMzFfUEZfT0VfQUNELAorCS8qIE9XSVJFICovCisJUEUxNl9BRl9PV0lSRSwKKwkvKiBTREhDMSovCisJUEUxOF9QRl9TRDFfRDAsCisJUEUxOV9QRl9TRDFfRDEsCisJUEUyMF9QRl9TRDFfRDIsCisJUEUyMV9QRl9TRDFfRDMsCisJUEUyMl9QRl9TRDFfQ01ELAorCVBFMjNfUEZfU0QxX0NMSywKKwlQRjhfQUZfQVRBX0lPUkRZLAorCS8qIFNESEMyKi8KKwlQQjRfUEZfU0QyX0QwLAorCVBCNV9QRl9TRDJfRDEsCisJUEI2X1BGX1NEMl9EMiwKKwlQQjdfUEZfU0QyX0QzLAorCVBCOF9QRl9TRDJfQ01ELAorCVBCOV9QRl9TRDJfQ0xLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCitteHRfdGQ2MF9uYW5kX2JvYXJkX2luZm8gX19pbml0Y29uc3QgPSB7CisJLndpZHRoID0gMSwKKwkuaHdfZWNjID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgbXh0X3RkNjBfaTJjMF9kYXRhIF9faW5pdGNvbnN0ID0geworCS5iaXRyYXRlID0gMTAwMDAwLAorfTsKKworLyogUENBOTU1NyAqLworc3RhdGljIGludCBteHRfdGQ2MF9wY2E5NTU3X3NldHVwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJdW5zaWduZWQgZ3Bpb19iYXNlLCB1bnNpZ25lZCBuZ3BpbywKKwkJCQl2b2lkICpjb250ZXh0KQoreworCXN0YXRpYyBpbnQgbXh0X3RkNjBfZ3Bpb192YWx1ZVtdID0geworCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMQorCX07CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRShteHRfdGQ2MF9ncGlvX3ZhbHVlKTsgKytuKSB7CisJCWdwaW9fcmVxdWVzdChncGlvX2Jhc2UgKyBuLCAiTVhUX1RENjAgR1BJTyBFeHAiKTsKKwkJaWYgKG14dF90ZDYwX2dwaW9fdmFsdWVbbl0gPCAwKQorCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpb19iYXNlICsgbik7CisJCWVsc2UKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2Jhc2UgKyBuLAorCQkJCQkJbXh0X3RkNjBfZ3Bpb192YWx1ZVtuXSk7CisJCWdwaW9fZXhwb3J0KGdwaW9fYmFzZSArIG4sIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBteHRfdGQ2MF9wY2E5NTU3X3BkYXRhID0geworCS5ncGlvX2Jhc2UJPSAyNDAsIC8qIHBsYWNlIFBDQTk1NTcgYWZ0ZXIgYWxsIE1YMjcgZ3BpbyBwaW5zICovCisJLmludmVydAkJPSAwLCAvKiBEbyBub3QgaW52ZXJ0ICovCisJLnNldHVwCQk9IG14dF90ZDYwX3BjYTk1NTdfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIG14dF90ZDYwX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicGNhOTU1NyIsIDB4MTgpLAorCQkucGxhdGZvcm1fZGF0YSA9ICZteHRfdGQ2MF9wY2E5NTU3X3BkYXRhLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIG14dF90ZDYwX2kyYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXh0X3RkNjBfaTJjMl9kZXZpY2VzW10gPSB7Cit9OworCitzdGF0aWMgc3RydWN0IGlteF9mYl92aWRlb21vZGUgbXh0X3RkNjBfbW9kZXNbXSA9IHsKKwl7CisJCS5tb2RlID0geworCQkJLm5hbWUJCT0gIkNoaW1laSBMVzcwMEFUOTAwMyIsCisJCQkucmVmcmVzaAk9IDYwLAorCQkJLnhyZXMJCT0gODAwLAorCQkJLnlyZXMJCT0gNDgwLAorCQkJLnBpeGNsb2NrCT0gMzAzMDMsCisJCQkuaHN5bmNfbGVuCT0gNjQsCisJCQkubGVmdF9tYXJnaW4JPSAweDY3LAorCQkJLnJpZ2h0X21hcmdpbgk9IDB4NjgsCisJCQkudnN5bmNfbGVuCT0gMTYsCisJCQkudXBwZXJfbWFyZ2luCT0gMHgwZiwKKwkJCS5sb3dlcl9tYXJnaW4JPSAweDBmLAorCQl9LAorCQkuYnBwCQk9IDE2LAorCQkucGNyCQk9IDB4RkEyMDhCODMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2ZiX3BsYXRmb3JtX2RhdGEgbXh0X3RkNjBfZmJfZGF0YSA9IHsKKwkubW9kZSA9IG14dF90ZDYwX21vZGVzLAorCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG14dF90ZDYwX21vZGVzKSwKKworCS8qCisJICogLSBIU1lOQyBhY3RpdmUgaGlnaAorCSAqIC0gVlNZTkMgYWN0aXZlIGhpZ2gKKwkgKiAtIGNsayBub3RlbmFibGVkIHdoaWxlIGlkbGUKKwkgKiAtIGNsb2NrIGludmVydGVkCisJICogLSBkYXRhIG5vdCBpbnZlcnRlZAorCSAqIC0gZGF0YSBlbmFibGUgbG93IGFjdGl2ZQorCSAqIC0gZW5hYmxlIHNoYXJwIG1vZGUKKwkgKi8KKwkucHdtcgkJPSAweDAwQTkwM0ZGLAorCS5sc2NyMQkJPSAweDAwMTIwMzAwLAorCS5kbWFjcgkJPSAweDAwMDIwMDEwLAorfTsKKworc3RhdGljIGludCBteHRfdGQ2MF9zZGhjMV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBkZXRlY3RfaXJxLAorCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHJlcXVlc3RfaXJxKElSUV9HUElPRig4KSwgZGV0ZWN0X2lycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJInNkaGMxLWNhcmQtZGV0ZWN0IiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIG14dF90ZDYwX3NkaGMxX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKElSUV9HUElPRig4KSwgZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW14bW1jX3BsYXRmb3JtX2RhdGEgc2RoYzFfcGRhdGEgPSB7CisJLmluaXQgPSBteHRfdGQ2MF9zZGhjMV9pbml0LAorCS5leGl0ID0gbXh0X3RkNjBfc2RoYzFfZXhpdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbXhjX2ZlY19kZXZpY2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0geworCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbXh0X3RkNjBfYm9hcmRfaW5pdCh2b2lkKQoreworCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXh0X3RkNjBfcGlucywgQVJSQVlfU0laRShteHRfdGQ2MF9waW5zKSwKKwkJCSJNWFRfVEQ2MCIpOworCisJaW14MjdfYWRkX2lteF91YXJ0MCgmdWFydF9wZGF0YSk7CisJaW14MjdfYWRkX2lteF91YXJ0MSgmdWFydF9wZGF0YSk7CisJaW14MjdfYWRkX2lteF91YXJ0MigmdWFydF9wZGF0YSk7CisJaW14MjdfYWRkX214Y19uYW5kKCZteHRfdGQ2MF9uYW5kX2JvYXJkX2luZm8pOworCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbXh0X3RkNjBfaTJjX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShteHRfdGQ2MF9pMmNfZGV2aWNlcykpOworCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgbXh0X3RkNjBfaTJjMl9kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUobXh0X3RkNjBfaTJjMl9kZXZpY2VzKSk7CisKKwlpbXgyN19hZGRfaTJjX2lteDAoJm14dF90ZDYwX2kyYzBfZGF0YSk7CisJaW14MjdfYWRkX2kyY19pbXgxKCZteHRfdGQ2MF9pMmMxX2RhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19mYl9kZXZpY2UsICZteHRfdGQ2MF9mYl9kYXRhKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfc2RoY19kZXZpY2UwLCAmc2RoYzFfcGRhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteHRfdGQ2MF90aW1lcl9pbml0KHZvaWQpCit7CisJbXgyN19jbG9ja3NfaW5pdCgyNjAwMDAwMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIG14dF90ZDYwX3RpbWVyID0geworCS5pbml0CT0gbXh0X3RkNjBfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoTVhUX1RENjAsICJNYXh0cmFjayBpLU1YVCBURDYwIikKKwkvKiBtYWludGFpbmVyOiBNYXh0cmFjayBJbmR1c3RyaWFsICovCisJLnBoeXNfaW8JPSBNWDI3X0FJUElfQkFTRV9BRERSLAorCS5pb19wZ19vZmZzdAk9ICgoTVgyN19BSVBJX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5tYXBfaW8JCT0gbXgyN19tYXBfaW8sCisJLmluaXRfaXJxCT0gbXgyN19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gbXh0X3RkNjBfYm9hcmRfaW5pdCwKKwkudGltZXIJCT0gJm14dF90ZDYwX3RpbWVyLAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY2ExMDAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MmRlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+LCBQZW5ndXRyb25peAorICogQ29weXJpZ2h0IChDKSAyMDA5IFNhc2NoYSBIYXVlciAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2VlcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvdWxwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8bWFjaC9hdWRtdXguaD4KKyNpbmNsdWRlIDxtYWNoL3NzaS5oPgorI2luY2x1ZGUgPG1hY2gvbXhjX25hbmQuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgorI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KKyNpbmNsdWRlIDxtYWNoL3VscGkuaD4KKyNpbmNsdWRlIDxtYWNoL2lteGZiLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDI3LmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCisjZGVmaW5lIE9UR19QSFlfQ1NfR1BJTyAoR1BJT19QT1JUQiArIDIzKQorI2RlZmluZSBVU0JIMl9QSFlfQ1NfR1BJTyAoR1BJT19QT1JUQiArIDI0KQorI2RlZmluZSBTUEkxX1NTMCAoR1BJT19QT1JURCArIDI4KQorI2RlZmluZSBTUEkxX1NTMSAoR1BJT19QT1JURCArIDI3KQorI2RlZmluZSBTRDJfQ0QgKEdQSU9fUE9SVEMgKyAyOSkKKworc3RhdGljIGludCBwY2ExMDBfcGluc1tdID0geworCS8qIFVBUlQxICovCisJUEUxMl9QRl9VQVJUMV9UWEQsCisJUEUxM19QRl9VQVJUMV9SWEQsCisJUEUxNF9QRl9VQVJUMV9DVFMsCisJUEUxNV9QRl9VQVJUMV9SVFMsCisJLyogU0RIQyAqLworCVBCNF9QRl9TRDJfRDAsCisJUEI1X1BGX1NEMl9EMSwKKwlQQjZfUEZfU0QyX0QyLAorCVBCN19QRl9TRDJfRDMsCisJUEI4X1BGX1NEMl9DTUQsCisJUEI5X1BGX1NEMl9DTEssCisJU0QyX0NEIHwgR1BJT19HUElPIHwgR1BJT19JTiwKKwkvKiBGRUMgKi8KKwlQRDBfQUlOX0ZFQ19UWEQwLAorCVBEMV9BSU5fRkVDX1RYRDEsCisJUEQyX0FJTl9GRUNfVFhEMiwKKwlQRDNfQUlOX0ZFQ19UWEQzLAorCVBENF9BT1VUX0ZFQ19SWF9FUiwKKwlQRDVfQU9VVF9GRUNfUlhEMSwKKwlQRDZfQU9VVF9GRUNfUlhEMiwKKwlQRDdfQU9VVF9GRUNfUlhEMywKKwlQRDhfQUZfRkVDX01ESU8sCisJUEQ5X0FJTl9GRUNfTURDLAorCVBEMTBfQU9VVF9GRUNfQ1JTLAorCVBEMTFfQU9VVF9GRUNfVFhfQ0xLLAorCVBEMTJfQU9VVF9GRUNfUlhEMCwKKwlQRDEzX0FPVVRfRkVDX1JYX0RWLAorCVBEMTRfQU9VVF9GRUNfUlhfQ0xLLAorCVBEMTVfQU9VVF9GRUNfQ09MLAorCVBEMTZfQUlOX0ZFQ19UWF9FUiwKKwlQRjIzX0FJTl9GRUNfVFhfRU4sCisJLyogU1NJMSAqLworCVBDMjBfUEZfU1NJMV9GUywKKwlQQzIxX1BGX1NTSTFfUlhELAorCVBDMjJfUEZfU1NJMV9UWEQsCisJUEMyM19QRl9TU0kxX0NMSywKKwkvKiBvbmJvYXJkIEkyQyAqLworCVBDNV9QRl9JMkMyX1NEQSwKKwlQQzZfUEZfSTJDMl9TQ0wsCisJLyogZXh0ZXJuYWwgSTJDICovCisJUEQxN19QRl9JMkNfREFUQSwKKwlQRDE4X1BGX0kyQ19DTEssCisJLyogU1BJMSAqLworCVBEMjVfUEZfQ1NQSTFfUkRZLAorCVBEMjlfUEZfQ1NQSTFfU0NMSywKKwlQRDMwX1BGX0NTUEkxX01JU08sCisJUEQzMV9QRl9DU1BJMV9NT1NJLAorCS8qIE9URyAqLworCU9UR19QSFlfQ1NfR1BJTyB8IEdQSU9fR1BJTyB8IEdQSU9fT1VULAorCVBDN19QRl9VU0JPVEdfREFUQTUsCisJUEM4X1BGX1VTQk9UR19EQVRBNiwKKwlQQzlfUEZfVVNCT1RHX0RBVEEwLAorCVBDMTBfUEZfVVNCT1RHX0RBVEEyLAorCVBDMTFfUEZfVVNCT1RHX0RBVEExLAorCVBDMTJfUEZfVVNCT1RHX0RBVEE0LAorCVBDMTNfUEZfVVNCT1RHX0RBVEEzLAorCVBFMF9QRl9VU0JPVEdfTlhULAorCVBFMV9QRl9VU0JPVEdfU1RQLAorCVBFMl9QRl9VU0JPVEdfRElSLAorCVBFMjRfUEZfVVNCT1RHX0NMSywKKwlQRTI1X1BGX1VTQk9UR19EQVRBNywKKwkvKiBVU0JIMiAqLworCVVTQkgyX1BIWV9DU19HUElPIHwgR1BJT19HUElPIHwgR1BJT19PVVQsCisJUEEwX1BGX1VTQkgyX0NMSywKKwlQQTFfUEZfVVNCSDJfRElSLAorCVBBMl9QRl9VU0JIMl9EQVRBNywKKwlQQTNfUEZfVVNCSDJfTlhULAorCVBBNF9QRl9VU0JIMl9TVFAsCisJUEQxOV9BRl9VU0JIMl9EQVRBNCwKKwlQRDIwX0FGX1VTQkgyX0RBVEEzLAorCVBEMjFfQUZfVVNCSDJfREFUQTYsCisJUEQyMl9BRl9VU0JIMl9EQVRBMCwKKwlQRDIzX0FGX1VTQkgyX0RBVEEyLAorCVBEMjRfQUZfVVNCSDJfREFUQTEsCisJUEQyNl9BRl9VU0JIMl9EQVRBNSwKKwkvKiBkaXNwbGF5ICovCisJUEE1X1BGX0xTQ0xLLAorCVBBNl9QRl9MRDAsCisJUEE3X1BGX0xEMSwKKwlQQThfUEZfTEQyLAorCVBBOV9QRl9MRDMsCisJUEExMF9QRl9MRDQsCisJUEExMV9QRl9MRDUsCisJUEExMl9QRl9MRDYsCisJUEExM19QRl9MRDcsCisJUEExNF9QRl9MRDgsCisJUEExNV9QRl9MRDksCisJUEExNl9QRl9MRDEwLAorCVBBMTdfUEZfTEQxMSwKKwlQQTE4X1BGX0xEMTIsCisJUEExOV9QRl9MRDEzLAorCVBBMjBfUEZfTEQxNCwKKwlQQTIxX1BGX0xEMTUsCisJUEEyMl9QRl9MRDE2LAorCVBBMjNfUEZfTEQxNywKKwlQQTI2X1BGX1BTLAorCVBBMjhfUEZfSFNZTkMsCisJUEEyOV9QRl9WU1lOQywKKwlQQTMxX1BGX09FX0FDRCwKKwkvKiBmcmVlIEdQSU8gKi8KKwlHUElPX1BPUlRDIHwgMzEgfCBHUElPX0dQSU8gfCBHUElPX0lOLCAvKiBHUElPMF9JUlEgKi8KKwlHUElPX1BPUlRDIHwgMjUgfCBHUElPX0dQSU8gfCBHUElPX0lOLCAvKiBHUElPMV9JUlEgKi8KKwlHUElPX1BPUlRFIHwgNSB8IEdQSU9fR1BJTyB8IEdQSU9fSU4sIC8qIEdQSU8yX0lSUSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCitwY2ExMDBfbmFuZF9ib2FyZF9pbmZvIF9faW5pdGNvbnN0ID0geworCS53aWR0aCA9IDEsCisJLmh3X2VjYyA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm14Y193MV9tYXN0ZXJfZGV2aWNlLAorCSZteGNfZmVjX2RldmljZSwKKwkmbXhjX3dkdCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgcGNhMTAwX2kyYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIGJvYXJkX2VlcHJvbSA9IHsKKwkuYnl0ZV9sZW4gPSA0MDk2LAorCS5wYWdlX3NpemUgPSAzMiwKKwkuZmxhZ3MgPSBBVDI0X0ZMQUdfQUREUjE2LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBwY2ExMDBfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhdDI0IiwgMHg1MiksIC8qIEUwPTAsIEUxPTEsIEUyPTAgKi8KKwkJLnBsYXRmb3JtX2RhdGEgPSAmYm9hcmRfZWVwcm9tLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInJ0Yy1wY2Y4NTYzIiwgMHg1MSksCisJCS50eXBlID0gInBjZjg1NjMiCisJfSwgeworCQlJMkNfQk9BUkRfSU5GTygibG03NSIsIDB4NGEpLAorCQkudHlwZSA9ICJsbTc1IgorCX0KK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19TUElfSU1YX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2VlcHJvbSBhdDI1MzIwID0geworCS5uYW1lCQk9ICJhdDI1MzIwYW4iLAorCS5ieXRlX2xlbgk9IDQwOTYsCisJLnBhZ2Vfc2l6ZQk9IDMyLAorCS5mbGFncwkJPSBFRV9BRERSMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gcGNhMTAwX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tb2RhbGlhcyA9ICJhdDI1IiwKKwkJLm1heF9zcGVlZF9oeiA9IDMwMDAwLAorCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmF0MjUzMjAsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGNhMTAwX3NwaV9jc1tdID0ge1NQSTFfU1MwLCBTUEkxX1NTMX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgcGNhMTAwX3NwaTBfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuY2hpcHNlbGVjdAk9IHBjYTEwMF9zcGlfY3MsCisJLm51bV9jaGlwc2VsZWN0ID0gQVJSQVlfU0laRShwY2ExMDBfc3BpX2NzKSwKK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgcGNhMTAwX2FjOTdfd2FybV9yZXNldChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlRDIHwgMjAgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIwLCAxKTsKKwl1ZGVsYXkoMik7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIwLCAwKTsKKwlteGNfZ3Bpb19tb2RlKFBDMjBfUEZfU1NJMV9GUyk7CisJbXNsZWVwKDIpOworfQorCitzdGF0aWMgdm9pZCBwY2ExMDBfYWM5N19jb2xkX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyMCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsgIC8qIEZTICovCisJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIwLCAwKTsKKwlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyMiB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsgIC8qIFRYICovCisJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIyLCAwKTsKKwlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyOCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsgIC8qIHJlc2V0ICovCisJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDI4LCAwKTsKKwl1ZGVsYXkoMTApOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUE9SVEMgKyAyOCwgMSk7CisJbXhjX2dwaW9fbW9kZShQQzIwX1BGX1NTSTFfRlMpOworCW14Y19ncGlvX21vZGUoUEMyMl9QRl9TU0kxX1RYRCk7CisJbXNsZWVwKDIpOworfQorCitzdGF0aWMgc3RydWN0IGlteF9zc2lfcGxhdGZvcm1fZGF0YSBwY2ExMDBfc3NpX3BkYXRhID0geworCS5hYzk3X3Jlc2V0CQk9IHBjYTEwMF9hYzk3X2NvbGRfcmVzZXQsCisJLmFjOTdfd2FybV9yZXNldAk9IHBjYTEwMF9hYzk3X3dhcm1fcmVzZXQsCisJLmZsYWdzCQkJPSBJTVhfU1NJX1VTRV9BQzk3LAorfTsKKworc3RhdGljIGludCBwY2ExMDBfc2RoYzJfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgZGV0ZWN0X2lycSwKKwkJdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoSVJRX0dQSU9DKDI5KSwgZGV0ZWN0X2lycSwKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJICAiaW14LW1tYy1kZXRlY3QiLCBkYXRhKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJwY2ExMDA6IEZhaWxlZCB0byByZXVlc3QgaXJxIGZvciBzZC9tbWMgZGV0ZWN0aW9uXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBjYTEwMF9zZGhjMl9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX2lycShJUlFfR1BJT0MoMjkpLCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBpbXhtbWNfcGxhdGZvcm1fZGF0YSBzZGhjX3BkYXRhID0geworCS5pbml0ID0gcGNhMTAwX3NkaGMyX2luaXQsCisJLmV4aXQgPSBwY2ExMDBfc2RoYzJfZXhpdCwKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfVUxQSSkKK3N0YXRpYyBpbnQgb3RnX3BoeV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZ3Bpb19zZXRfdmFsdWUoT1RHX1BIWV9DU19HUElPLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIG90Z19wZGF0YSA9IHsKKwkuaW5pdAk9IG90Z19waHlfaW5pdCwKKwkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAorCS5mbGFncwk9IE1YQ19FSENJX0lOVEVSRkFDRV9ESUZGX1VOSSwKK307CisKK3N0YXRpYyBpbnQgdXNiaDJfcGh5X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlncGlvX3NldF92YWx1ZShVU0JIMl9QSFlfQ1NfR1BJTywgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMl9wZGF0YSA9IHsKKwkuaW5pdAk9IHVzYmgyX3BoeV9pbml0LAorCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VMUEksCisJLmZsYWdzCT0gTVhDX0VIQ0lfSU5URVJGQUNFX0RJRkZfVU5JLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgb3RnX2RldmljZV9wZGF0YSA9IHsKKwkub3BlcmF0aW5nX21vZGUgPSBGU0xfVVNCMl9EUl9ERVZJQ0UsCisJLnBoeV9tb2RlICAgICAgID0gRlNMX1VTQjJfUEhZX1VMUEksCit9OworCitzdGF0aWMgaW50IG90Z19tb2RlX2hvc3Q7CisKK3N0YXRpYyBpbnQgX19pbml0IHBjYTEwMF9vdGdfbW9kZShjaGFyICpvcHRpb25zKQoreworCWlmICghc3RyY21wKG9wdGlvbnMsICJob3N0IikpCisJCW90Z19tb2RlX2hvc3QgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAob3B0aW9ucywgImRldmljZSIpKQorCQlvdGdfbW9kZV9ob3N0ID0gMDsKKwllbHNlCisJCXByX2luZm8oIm90Z19tb2RlIG5laXRoZXIgXCJob3N0XCIgbm9yIFwiZGV2aWNlXCIuICIKKwkJCSJEZWZhdWx0aW5nIHRvIGRldmljZVxuIik7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJvdGdfbW9kZT0iLCBwY2ExMDBfb3RnX21vZGUpOworCisvKiBmcmFtZWJ1ZmZlciBpbmZvICovCitzdGF0aWMgc3RydWN0IGlteF9mYl92aWRlb21vZGUgcGNhMTAwX2ZiX21vZGVzW10gPSB7CisJeworCQkubW9kZSA9IHsKKwkJCS5uYW1lCQk9ICJFTUVSR0lORy1FVFY1NzBHMERIVSIsCisJCQkucmVmcmVzaAk9IDYwLAorCQkJLnhyZXMJCT0gNjQwLAorCQkJLnlyZXMJCT0gNDgwLAorCQkJLnBpeGNsb2NrCT0gMzk3MjIsIC8qIGluIHBzICgyNS4xNzUgTUh6KSAqLworCQkJLmhzeW5jX2xlbgk9IDMwLAorCQkJLmxlZnRfbWFyZ2luCT0gMTE0LAorCQkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkJLnZzeW5jX2xlbgk9IDMsCisJCQkudXBwZXJfbWFyZ2luCT0gMzIsCisJCQkubG93ZXJfbWFyZ2luCT0gMCwKKwkJfSwKKwkJLyoKKwkJICogVEZUCisJCSAqIFBpeGVsIHBvbCBhY3RpdmUgaGlnaAorCQkgKiBIU1lOQyBhY3RpdmUgbG93CisJCSAqIFZTWU5DIGFjdGl2ZSBsb3cKKwkJICogdXNlIEhTWU5DIGZvciBBQ0QgY291bnQKKwkJICogbGluZSBjbG9jayBkaXNhYmxlIHdoaWxlIGlkbGUKKwkJICogYWx3YXlzIGVuYWJsZSBsaW5lIGNsb2NrIGV2ZW4gaWYgbm8gZGF0YQorCQkgKi8KKwkJLnBjciA9IDB4ZjBjMDgwODAsCisJCS5icHAgPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSBwY2ExMDBfZmJfZGF0YSA9IHsKKwkubW9kZSA9IHBjYTEwMF9mYl9tb2RlcywKKwkubnVtX21vZGVzID0gQVJSQVlfU0laRShwY2ExMDBfZmJfbW9kZXMpLAorCisJLnB3bXIJCT0gMHgwMEE5MDNGRiwKKwkubHNjcjEJCT0gMHgwMDEyMDMwMCwKKwkuZG1hY3IJCT0gMHgwMDAyMDAxMCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2ExMDBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBTU0kgdW5pdCAqLworCW14Y19hdWRtdXhfdjFfY29uZmlndXJlX3BvcnQoTVgyN19BVURNVVhfSFBDUjFfU1NJMCwKKwkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1NZTiB8IC8qIDR3aXJlIG1vZGUgKi8KKwkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1RGQ1NFTCgzKSB8CisJCQkJICBNWENfQVVETVVYX1YxX1BDUl9UQ0xLRElSIHwgLyogY2xvY2sgaXMgb3V0cHV0ICovCisJCQkJICBNWENfQVVETVVYX1YxX1BDUl9SWERTRUwoMykpOworCW14Y19hdWRtdXhfdjFfY29uZmlndXJlX3BvcnQoMywKKwkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1NZTiB8IC8qIDR3aXJlIG1vZGUgKi8KKwkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1RGQ1NFTCgwKSB8CisJCQkJICBNWENfQVVETVVYX1YxX1BDUl9URlNESVIgfAorCQkJCSAgTVhDX0FVRE1VWF9WMV9QQ1JfUlhEU0VMKDApKTsKKworCXJldCA9IG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMocGNhMTAwX3BpbnMsCisJCQlBUlJBWV9TSVpFKHBjYTEwMF9waW5zKSwgIlBDQTEwMCIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAicGNhMTAwOiBGYWlsZWQgdG8gc2V0dXAgcGlucyAoJWQpXG4iLCByZXQpOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmaW14X3NzaV9kZXZpY2UwLCAmcGNhMTAwX3NzaV9wZGF0YSk7CisKKwlpbXgyN19hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTEsICZzZGhjX3BkYXRhKTsKKworCWlteDI3X2FkZF9teGNfbmFuZCgmcGNhMTAwX25hbmRfYm9hcmRfaW5mbyk7CisKKwkvKiBvbmx5IHRoZSBpMmMgbWFzdGVyIDEgaXMgdXNlZCBvbiB0aGlzIENQVSBjYXJkICovCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgcGNhMTAwX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUocGNhMTAwX2kyY19kZXZpY2VzKSk7CisKKwlpbXgyN19hZGRfaTJjX2lteDEoJnBjYTEwMF9pMmMxX2RhdGEpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0lNWCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX0lNWF9NT0RVTEUpCisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlREIHwgMjggfCBHUElPX0dQSU8gfCBHUElPX0lOKTsKKwlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEQgfCAyNyB8IEdQSU9fR1BJTyB8IEdQSU9fSU4pOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHBjYTEwMF9zcGlfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKHBjYTEwMF9zcGlfYm9hcmRfaW5mbykpOworCWlteDI3X2FkZF9zcGlfaW14MCgmcGNhMTAwX3NwaV8wX2RhdGEpOworI2VuZGlmCisKKwlncGlvX3JlcXVlc3QoT1RHX1BIWV9DU19HUElPLCAidXNiLW90Zy1jcyIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChPVEdfUEhZX0NTX0dQSU8sIDEpOworCWdwaW9fcmVxdWVzdChVU0JIMl9QSFlfQ1NfR1BJTywgInVzYi1ob3N0Mi1jcyIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChVU0JIMl9QSFlfQ1NfR1BJTywgMSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfVUxQSSkKKwlpZiAob3RnX21vZGVfaG9zdCkgeworCQlvdGdfcGRhdGEub3RnID0gb3RnX3VscGlfY3JlYXRlKCZteGNfdWxwaV9hY2Nlc3Nfb3BzLAorCQkJCVVTQl9PVEdfRFJWX1ZCVVMgfCBVU0JfT1RHX0RSVl9WQlVTX0VYVCk7CisKKwkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX290Z19ob3N0LCAmb3RnX3BkYXRhKTsKKwl9CisKKwl1c2JoMl9wZGF0YS5vdGcgPSBvdGdfdWxwaV9jcmVhdGUoJm14Y191bHBpX2FjY2Vzc19vcHMsCisJCQkJVVNCX09UR19EUlZfVkJVUyB8IFVTQl9PVEdfRFJWX1ZCVVNfRVhUKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMiwgJnVzYmgyX3BkYXRhKTsKKyNlbmRpZgorCWlmICghb3RnX21vZGVfaG9zdCkgeworCQlncGlvX3NldF92YWx1ZShPVEdfUEhZX0NTX0dQSU8sIDApOworCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfb3RnX3VkY19kZXZpY2UsICZvdGdfZGV2aWNlX3BkYXRhKTsKKwl9CisKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfZmJfZGV2aWNlLCAmcGNhMTAwX2ZiX2RhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2ExMDBfdGltZXJfaW5pdCh2b2lkKQoreworCW14MjdfY2xvY2tzX2luaXQoMjYwMDAwMDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBwY2ExMDBfdGltZXIgPSB7CisJLmluaXQgPSBwY2ExMDBfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoUENBMTAwLCAicGh5Q0FSRC1pLk1YMjciKQorCS5waHlzX2lvICAgICAgICA9IE1YMjdfQUlQSV9CQVNFX0FERFIsCisJLmlvX3BnX29mZnN0ICAgID0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgICAgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLm1hcF9pbyAgICAgICAgID0gbXgyN19tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gbXgyN19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lICAgPSBwY2ExMDBfaW5pdCwKKwkudGltZXIgICAgICAgICAgPSAmcGNhMTAwX3RpbWVyLAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxMmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM4LmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+LCBQZW5ndXRyb25peAorICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydCAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYXQyNC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYzEzNzgzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSA8bWFjaC9ib2FyZC1wY20wMzguaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KKyNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+CisjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgorI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNy5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIGludCBwY20wMzhfcGluc1tdID0geworCS8qIFVBUlQxICovCisJUEUxMl9QRl9VQVJUMV9UWEQsCisJUEUxM19QRl9VQVJUMV9SWEQsCisJUEUxNF9QRl9VQVJUMV9DVFMsCisJUEUxNV9QRl9VQVJUMV9SVFMsCisJLyogVUFSVDIgKi8KKwlQRTNfUEZfVUFSVDJfQ1RTLAorCVBFNF9QRl9VQVJUMl9SVFMsCisJUEU2X1BGX1VBUlQyX1RYRCwKKwlQRTdfUEZfVUFSVDJfUlhELAorCS8qIFVBUlQzICovCisJUEU4X1BGX1VBUlQzX1RYRCwKKwlQRTlfUEZfVUFSVDNfUlhELAorCVBFMTBfUEZfVUFSVDNfQ1RTLAorCVBFMTFfUEZfVUFSVDNfUlRTLAorCS8qIEZFQyAqLworCVBEMF9BSU5fRkVDX1RYRDAsCisJUEQxX0FJTl9GRUNfVFhEMSwKKwlQRDJfQUlOX0ZFQ19UWEQyLAorCVBEM19BSU5fRkVDX1RYRDMsCisJUEQ0X0FPVVRfRkVDX1JYX0VSLAorCVBENV9BT1VUX0ZFQ19SWEQxLAorCVBENl9BT1VUX0ZFQ19SWEQyLAorCVBEN19BT1VUX0ZFQ19SWEQzLAorCVBEOF9BRl9GRUNfTURJTywKKwlQRDlfQUlOX0ZFQ19NREMsCisJUEQxMF9BT1VUX0ZFQ19DUlMsCisJUEQxMV9BT1VUX0ZFQ19UWF9DTEssCisJUEQxMl9BT1VUX0ZFQ19SWEQwLAorCVBEMTNfQU9VVF9GRUNfUlhfRFYsCisJUEQxNF9BT1VUX0ZFQ19SWF9DTEssCisJUEQxNV9BT1VUX0ZFQ19DT0wsCisJUEQxNl9BSU5fRkVDX1RYX0VSLAorCVBGMjNfQUlOX0ZFQ19UWF9FTiwKKwkvKiBJMkMyICovCisJUEM1X1BGX0kyQzJfU0RBLAorCVBDNl9QRl9JMkMyX1NDTCwKKwkvKiBTUEkxICovCisJUEQyNV9QRl9DU1BJMV9SRFksCisJUEQyOV9QRl9DU1BJMV9TQ0xLLAorCVBEMzBfUEZfQ1NQSTFfTUlTTywKKwlQRDMxX1BGX0NTUEkxX01PU0ksCisJLyogU1NJMSAqLworCVBDMjBfUEZfU1NJMV9GUywKKwlQQzIxX1BGX1NTSTFfUlhELAorCVBDMjJfUEZfU1NJMV9UWEQsCisJUEMyM19QRl9TU0kxX0NMSywKKwkvKiBTU0k0ICovCisJUEMxNl9QRl9TU0k0X0ZTLAorCVBDMTdfUEZfU1NJNF9SWEQsCisJUEMxOF9QRl9TU0k0X1RYRCwKKwlQQzE5X1BGX1NTSTRfQ0xLLAorCS8qIFVTQiBob3N0ICovCisJUEEwX1BGX1VTQkgyX0NMSywKKwlQQTFfUEZfVVNCSDJfRElSLAorCVBBMl9QRl9VU0JIMl9EQVRBNywKKwlQQTNfUEZfVVNCSDJfTlhULAorCVBBNF9QRl9VU0JIMl9TVFAsCisJUEQxOV9BRl9VU0JIMl9EQVRBNCwKKwlQRDIwX0FGX1VTQkgyX0RBVEEzLAorCVBEMjFfQUZfVVNCSDJfREFUQTYsCisJUEQyMl9BRl9VU0JIMl9EQVRBMCwKKwlQRDIzX0FGX1VTQkgyX0RBVEEyLAorCVBEMjRfQUZfVVNCSDJfREFUQTEsCisJUEQyNl9BRl9VU0JIMl9EQVRBNSwKK307CisKKy8qCisgKiBQaHl0ZWMncyBQQ00wMzggY29tZXMgd2l0aCAyTWlCIGJhdHRlcnkgYnVmZmVyZWQgU1JBTSwKKyAqIDE2IGJpdCB3aWR0aAorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSBwY20wMzhfc3JhbV9kYXRhID0geworCS5iYW5rd2lkdGggPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY20wMzhfc3JhbV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQgPSBNWDI3X0NTMV9CQVNFX0FERFIsCisJLmVuZCAgID0gTVgyN19DUzFfQkFTRV9BRERSICsgNTEyICogMTAyNCAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwY20wMzhfc3JhbV9tdGRfZGV2aWNlID0geworCS5uYW1lID0gIm10ZC1yYW0iLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcGNtMDM4X3NyYW1fZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmcGNtMDM4X3NyYW1fcmVzb3VyY2UsCit9OworCisvKgorICogUGh5dGVjJ3MgcGh5Q09SRS1pLk1YMjcgY29tZXMgd2l0aCAzMk1pQiBmbGFzaCwKKyAqIDE2IGJpdCB3aWR0aAorICovCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwY20wMzhfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY20wMzhfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0ID0gMHhjMDAwMDAwMCwKKwkuZW5kICAgPSAweGMxZmZmZmZmLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGNtMDM4X25vcl9tdGRfZGV2aWNlID0geworCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcGNtMDM4X2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJnBjbTAzOF9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YQorcGNtMDM4X25hbmRfYm9hcmRfaW5mbyBfX2luaXRjb25zdCA9IHsKKwkud2lkdGggPSAxLAorCS5od19lY2MgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZwY20wMzhfbm9yX210ZF9kZXZpY2UsCisJJm14Y193MV9tYXN0ZXJfZGV2aWNlLAorCSZteGNfZmVjX2RldmljZSwKKwkmcGNtMDM4X3NyYW1fbXRkX2RldmljZSwKKwkmbXhjX3dkdCwKK307CisKKy8qIE9uIHBjbTAzOCB0aGVyZSdzIGEgc3JhbSBhdHRhY2hlZCB0byBDUzEsIHdlIGVuYWJsZSB0aGUgY2hpcHNlbGVjdCBoZXJlIGFuZAorICogc2V0dXAgb3RoZXIgc3R1ZmZzIHRvIGFjY2VzcyB0aGUgc3JhbS4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdF9zcmFtKHZvaWQpCit7CisJbXgyN19zZXR1cF93ZWltY3MoMSwgMHgwMDAwZDg0MywgMHgyMjI1MjUyMSwgMHgyMjIyMGEwMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgcGNtMDM4X2kyYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIGJvYXJkX2VlcHJvbSA9IHsKKwkuYnl0ZV9sZW4gPSA0MDk2LAorCS5wYWdlX3NpemUgPSAzMiwKKwkuZmxhZ3MgPSBBVDI0X0ZMQUdfQUREUjE2LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBwY20wMzhfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhdDI0IiwgMHg1MiksIC8qIEUwPTAsIEUxPTEsIEUyPTAgKi8KKwkJLnBsYXRmb3JtX2RhdGEgPSAmYm9hcmRfZWVwcm9tLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInBjZjg1NjMiLCAweDUxKSwKKwl9LCB7CisJCUkyQ19CT0FSRF9JTkZPKCJsbTc1IiwgMHg0YSksCisJfQorfTsKKworc3RhdGljIGludCBwY20wMzhfc3BpX2NzW10gPSB7R1BJT19QT1JURCArIDI4fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBwY20wMzhfc3BpMF9kYXRhIF9faW5pdGNvbnN0ID0geworCS5jaGlwc2VsZWN0ID0gcGNtMDM4X3NwaV9jcywKKwkubnVtX2NoaXBzZWxlY3QgPSBBUlJBWV9TSVpFKHBjbTAzOF9zcGlfY3MpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkaGMxX2NvbnN1bWVyc1tdID0geworCXsKKwkJLmRldgk9ICZteGNfc2RoY19kZXZpY2UxLmRldiwKKwkJLnN1cHBseQk9ICJzZGhjX3ZjYyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBzZGhjMV9kYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91ViA9IDMwMDAwMDAsCisJCS5tYXhfdVYgPSAzNDAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJUkVHVUxBVE9SX0NIQU5HRV9NT0RFIHwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS52YWxpZF9tb2Rlc19tYXNrID0gUkVHVUxBVE9SX01PREVfTk9STUFMIHwKKwkJCVJFR1VMQVRPUl9NT0RFX0ZBU1QsCisJCS5hbHdheXNfb24gPSAwLAorCQkuYm9vdF9vbiA9IDAsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShzZGhjMV9jb25zdW1lcnMpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IHNkaGMxX2NvbnN1bWVycywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBjYW1fY29uc3VtZXJzW10gPSB7CisJeworCQkuZGV2CT0gTlVMTCwKKwkJLnN1cHBseQk9ICJpbXhfY2FtX3ZjYyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBjYW1fZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYgPSAzMDAwMDAwLAorCQkubWF4X3VWID0gMzQwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCVJFR1VMQVRPUl9DSEFOR0VfTU9ERSB8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCB8CisJCQlSRUdVTEFUT1JfTU9ERV9GQVNULAorCQkuYWx3YXlzX29uID0gMCwKKwkJLmJvb3Rfb24gPSAwLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoY2FtX2NvbnN1bWVycyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gY2FtX2NvbnN1bWVycywKK307CisKK3N0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9pbml0X2RhdGEgcGNtMDM4X3JlZ3VsYXRvcnNbXSA9IHsKKwl7CisJCS5pZCA9IE1DMTM3ODNfUkVHVV9WQ0FNLAorCQkuaW5pdF9kYXRhID0gJmNhbV9kYXRhLAorCX0sIHsKKwkJLmlkID0gTUMxMzc4M19SRUdVX1ZNTUMxLAorCQkuaW5pdF9kYXRhID0gJnNkaGMxX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWMxMzc4M19wbGF0Zm9ybV9kYXRhIHBjbTAzOF9wbWljID0geworCS5yZWd1bGF0b3JzID0gcGNtMDM4X3JlZ3VsYXRvcnMsCisJLm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShwY20wMzhfcmVndWxhdG9ycyksCisJLmZsYWdzID0gTUMxMzc4M19VU0VfQURDIHwgTUMxMzc4M19VU0VfUkVHVUxBVE9SIHwKKwkJIE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBwY20wMzhfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCXsKKwkJLm1vZGFsaWFzID0gIm1jMTM3ODMiLAorCQkuaXJxID0gSVJRX0dQSU9CKDIzKSwKKwkJLm1heF9zcGVlZF9oeiA9IDMwMDAwMCwKKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkucGxhdGZvcm1fZGF0YSA9ICZwY20wMzhfcG1pYywKKwkJLm1vZGUgPSBTUElfQ1NfSElHSCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDJfcGRhdGEgPSB7CisJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfVUxQSSwKKwkuZmxhZ3MJPSBNWENfRUhDSV9QT1dFUl9QSU5TX0VOQUJMRUQgfCBNWENfRUhDSV9JTlRFUkZBQ0VfRElGRl9VTkksCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgcGNtMDM4X2luaXQodm9pZCkKK3sKKwlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKHBjbTAzOF9waW5zLCBBUlJBWV9TSVpFKHBjbTAzOF9waW5zKSwKKwkJCSJQQ00wMzgiKTsKKworCXBjbTAzOF9pbml0X3NyYW0oKTsKKworCWlteDI3X2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOworCWlteDI3X2FkZF9pbXhfdWFydDEoJnVhcnRfcGRhdGEpOworCWlteDI3X2FkZF9pbXhfdWFydDIoJnVhcnRfcGRhdGEpOworCisJbXhjX2dwaW9fbW9kZShQRTE2X0FGX09XSVJFKTsKKwlpbXgyN19hZGRfbXhjX25hbmQoJnBjbTAzOF9uYW5kX2JvYXJkX2luZm8pOworCisJLyogb25seSB0aGUgaTJjIG1hc3RlciAxIGlzIHVzZWQgb24gdGhpcyBDUFUgY2FyZCAqLworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIHBjbTAzOF9pMmNfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKHBjbTAzOF9pMmNfZGV2aWNlcykpOworCisJaW14MjdfYWRkX2kyY19pbXgxKCZwY20wMzhfaTJjMV9kYXRhKTsKKworCS8qIFBFMTggZm9yIHVzZXItTEVEIEQ0MCAqLworCW14Y19ncGlvX21vZGUoR1BJT19QT1JURSB8IDE4IHwgR1BJT19HUElPIHwgR1BJT19PVVQpOworCisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlREIHwgMjggfCBHUElPX0dQSU8gfCBHUElPX09VVCk7CisKKwkvKiBNQzEzNzgzIElSUSAqLworCW14Y19ncGlvX21vZGUoR1BJT19QT1JUQiB8IDIzIHwgR1BJT19HUElPIHwgR1BJT19JTik7CisKKwlpbXgyN19hZGRfc3BpX2lteDAoJnBjbTAzOF9zcGkwX2RhdGEpOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHBjbTAzOF9zcGlfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKHBjbTAzOF9zcGlfYm9hcmRfaW5mbykpOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmgyLCAmdXNiaDJfcGRhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CisKKyNpZmRlZiBDT05GSUdfTUFDSF9QQ005NzBfQkFTRUJPQVJECisJcGNtOTcwX2Jhc2Vib2FyZF9pbml0KCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjbTAzOF90aW1lcl9pbml0KHZvaWQpCit7CisJbXgyN19jbG9ja3NfaW5pdCgyNjAwMDAwMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIHBjbTAzOF90aW1lciA9IHsKKwkuaW5pdCA9IHBjbTAzOF90aW1lcl9pbml0LAorfTsKKworTUFDSElORV9TVEFSVChQQ00wMzgsICJwaHlDT1JFLWkuTVgyNyIpCisJLnBoeXNfaW8gICAgICAgID0gTVgyN19BSVBJX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QgICAgPSAoKE1YMjdfQUlQSV9CQVNFX0FERFJfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcyAgICA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvICAgICAgICAgPSBteDI3X21hcF9pbywKKwkuaW5pdF9pcnEgICAgICAgPSBteDI3X2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgICA9IHBjbTAzOF9pbml0LAorCS50aW1lciAgICAgICAgICA9ICZwY20wMzhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1zY2I5MzI4LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXNjYjkzMjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJmMGQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1zY2I5MzI4LmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW14MS9tYWNoLXNjYjkzMjguYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTYXNjaGEgSGF1ZXIgPHNhc2NoYWhhdWVyQHdlYi5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEp1ZXJnZW4gQmVpc2VydCA8amJlaXNlcnRAbmV0c2NhcGUubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtOTAwMC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDEuaD4KKworI2luY2x1ZGUgImRldmljZXMtaW14MS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworLyoKKyAqIFRoaXMgc2NiOTMyOCBoYXMgYSAzMk1pQiBmbGFzaAorICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAk9IE1YMV9DUzBfUEhZUywKKwkuZW5kCT0gTVgxX0NTMF9QSFlTICsgKDMyICogMTAyNCAqIDEwMjQpIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHNjYl9mbGFzaF9kYXRhID0geworCS53aWR0aCAgPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NiX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc2NiX2ZsYXNoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UgPSAmZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorfTsKKworLyoKKyAqIHNjYjkzMjggaGFzIGEgRE05MDAwIG5ldHdvcmsgY29udHJvbGxlcgorICogY29ubmVjdGVkIHRvIENTNSwgd2l0aCAxNiBiaXQgZGF0YSBwYXRoCisgKiBhbmQgaW50ZXJydXB0IGNvbm5lY3RlZCB0byBHUElPIDMKKyAqLworCisvKgorICogaW50ZXJuYWwgZGF0YXBhdGggaXMgZml4ZWQgMTYgYml0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG05MDAwX3BsYXRfZGF0YSBkbTkwMDBfcGxhdGRhdGEgPSB7CisJLmZsYWdzCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWSwKK307CisKKy8qCisgKiB0aGUgRE05MDAwIGRyaXZlcnMgd2FudHMgdHdvIGRlZmluZWQgYWRkcmVzcyBzcGFjZXMKKyAqIHRvIGdhaW4gYWNjZXNzIHRvIGFkZHJlc3MgbGF0Y2ggcmVnaXN0ZXJzIGFuZCB0aGUgZGF0YSBwYXRoLgorICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRtOTAwMHhfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJhZGRyZXNzIGFyZWEiLAorCQkuc3RhcnQJPSBNWDFfQ1M1X1BIWVMsCisJCS5lbmQJPSBNWDFfQ1M1X1BIWVMgKyAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJLyogYWRkcmVzcyBhY2Nlc3MgKi8KKwl9LCB7CisJCS5uYW1lCT0gImRhdGEgYXJlYSIsCisJCS5zdGFydAk9IE1YMV9DUzVfUEhZUyArIDQsCisJCS5lbmQJPSBNWDFfQ1M1X1BIWVMgKyA1LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJLyogZGF0YSBhY2Nlc3MgKi8KKwl9LCB7CisJCS5zdGFydAk9IElSUV9HUElPQygzKSwKKwkJLmVuZAk9IElSUV9HUElPQygzKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZG05MDAweF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRtOTAwMCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRtOTAwMHhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBkbTkwMDB4X3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZG05MDAwX3BsYXRkYXRhLAorCX0KK307CisKK3N0YXRpYyBpbnQgbXhjX3VhcnQxX3BpbnNbXSA9IHsKKwlQQzlfUEZfVUFSVDFfQ1RTLAorCVBDMTBfUEZfVUFSVDFfUlRTLAorCVBDMTFfUEZfVUFSVDFfVFhELAorCVBDMTJfUEZfVUFSVDFfUlhELAorfTsKKworc3RhdGljIGludCB1YXJ0MV9teGNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0MV9waW5zLAorCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucyksICJVQVJUMSIpOworfQorCitzdGF0aWMgdm9pZCB1YXJ0MV9teGNfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuaW5pdCA9IHVhcnQxX214Y19pbml0LAorCS5leGl0ID0gdWFydDFfbXhjX2V4aXQsCisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2NiX2ZsYXNoX2RldmljZSwKKwkmZG05MDAweF9kZXZpY2UsCit9OworCisvKgorICogc2NiOTMyOF9pbml0IC0gSW5pdCB0aGUgQ1BVIGNhcmQgaXRzZWxmCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzY2I5MzI4X2luaXQodm9pZCkKK3sKKwlpbXgxX2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOworCisJcHJpbnRrKEtFUk5fSU5GTyJTY2I5MzI4OiBBZGRpbmcgZGV2aWNlc1xuIik7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzY2I5MzI4X3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDFfY2xvY2tzX2luaXQoMzIwMDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBzY2I5MzI4X3RpbWVyID0geworCS5pbml0CT0gc2NiOTMyOF90aW1lcl9pbml0LAorfTsKKworTUFDSElORV9TVEFSVChTQ0I5MzI4LCAiU3luZXJ0cm9uaXh4IHNjYjkzMjgiKQorICAgIC8qIFNhc2NoYSBIYXVlciAqLworCS5waHlzX2lvCT0gMHgwMDIwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAyMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDA4MDAwMTAwLAorCS5tYXBfaW8JCT0gbXgxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBteDFfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZzY2I5MzI4X3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBzY2I5MzI4X2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTkyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgxLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBhdXRob3I6IFNhc2NoYSBIYXVlcgorICogIENyZWF0ZWQ6IGFwcmlsIDIwdGgsIDIwMDQKKyAqICBDb3B5cmlnaHQ6IFN5bmVydHJvbml4eCBHbWJICisgKgorICogIENvbW1vbiBjb2RlIGZvciBpLk1YMSBtYWNoaW5lcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbXhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbCA9IE1YMV9JT19CQVNFX0FERFJfVklSVCwKKwkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgxX0lPX0JBU0VfQUREUiksCisJCS5sZW5ndGggPSBNWDFfSU9fU0laRSwKKwkJLnR5cGUgPSBNVF9ERVZJQ0UKKwl9Cit9OworCit2b2lkIF9faW5pdCBteDFfbWFwX2lvKHZvaWQpCit7CisJbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YMSk7CisJbXhjX2FyY2hfcmVzZXRfaW5pdChNWDFfSU9fQUREUkVTUyhNWDFfV0RUX0JBU0VfQUREUikpOworCisJaW90YWJsZV9pbml0KGlteF9pb19kZXNjLCBBUlJBWV9TSVpFKGlteF9pb19kZXNjKSk7Cit9CisKK2ludCBpbXgxX3JlZ2lzdGVyX2dwaW9zKHZvaWQpOworCit2b2lkIF9faW5pdCBteDFfaW5pdF9pcnEodm9pZCkKK3sKKwlteGNfaW5pdF9pcnEoTVgxX0lPX0FERFJFU1MoTVgxX0FWSUNfQkFTRV9BRERSKSk7CisJaW14MV9yZWdpc3Rlcl9ncGlvcygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjEuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmYWVlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyMS5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyMS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydCAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisvKiBNWDIxIG1lbW9yeSBtYXAgZGVmaW5pdGlvbiAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbXgyMV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKgorCSAqIHRoaXMgZml4ZWQgbWFwcGluZyBjb3ZlcnM6CisJICogLSBBSVBJMQorCSAqIC0gQUlQSTIKKwkgKiAtIEFJVEMKKwkgKiAtIFJPTSBQYXRjaAorCSAqIC0gYW5kIHNvbWUgcmVzZXJ2ZWQgc3BhY2UKKwkgKi8KKwl7CisJCS52aXJ0dWFsID0gTVgyMV9BSVBJX0JBU0VfQUREUl9WSVJULAorCQkucGZuID0gX19waHlzX3RvX3BmbihNWDIxX0FJUElfQkFTRV9BRERSKSwKKwkJLmxlbmd0aCA9IE1YMjFfQUlQSV9TSVpFLAorCQkudHlwZSA9IE1UX0RFVklDRQorCX0sCisJLyoKKwkgKiB0aGlzIGZpeGVkIG1hcHBpbmcgY292ZXJzOgorCSAqIC0gQ1NJCisJICogLSBBVEEKKwkgKi8KKwl7CisJCS52aXJ0dWFsID0gTVgyMV9TQUhCMV9CQVNFX0FERFJfVklSVCwKKwkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyMV9TQUhCMV9CQVNFX0FERFIpLAorCQkubGVuZ3RoID0gTVgyMV9TQUhCMV9TSVpFLAorCQkudHlwZSA9IE1UX0RFVklDRQorCX0sCisJLyoKKwkgKiB0aGlzIGZpeGVkIG1hcHBpbmcgY292ZXJzOgorCSAqIC0gRU1JCisJICovCisJeworCQkudmlydHVhbCA9IE1YMjFfWF9NRU1DX0JBU0VfQUREUl9WSVJULAorCQkucGZuID0gX19waHlzX3RvX3BmbihNWDIxX1hfTUVNQ19CQVNFX0FERFIpLAorCQkubGVuZ3RoID0gTVgyMV9YX01FTUNfU0laRSwKKwkJLnR5cGUgPSBNVF9ERVZJQ0UKKwl9LAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG1lbW9yeSBtYXAuIEl0IGlzIGNhbGxlZCBkdXJpbmcgdGhlCisgKiBzeXN0ZW0gc3RhcnR1cCB0byBjcmVhdGUgc3RhdGljIHBoeXNpY2FsIHRvIHZpcnR1YWwKKyAqIG1lbW9yeSBtYXAgZm9yIHRoZSBJTyBtb2R1bGVzLgorICovCit2b2lkIF9faW5pdCBteDIxX21hcF9pbyh2b2lkKQoreworCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDIxKTsKKwlteGNfYXJjaF9yZXNldF9pbml0KE1YMjFfSU9fQUREUkVTUyhNWDIxX1dET0dfQkFTRV9BRERSKSk7CisKKwlpb3RhYmxlX2luaXQoaW14MjFfaW9fZGVzYywgQVJSQVlfU0laRShpbXgyMV9pb19kZXNjKSk7Cit9CisKK2ludCBpbXgyMV9yZWdpc3Rlcl9ncGlvcyh2b2lkKTsKKwordm9pZCBfX2luaXQgbXgyMV9pbml0X2lycSh2b2lkKQoreworCW14Y19pbml0X2lycShNWDIxX0lPX0FERFJFU1MoTVgyMV9BVklDX0JBU0VfQUREUikpOworCWlteDIxX3JlZ2lzdGVyX2dwaW9zKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ2MjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjcuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjcuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBKdWVyZ2VuIEJlaXNlcnQgKGtlcm5lbEBwZW5ndXRyb25peC5kZSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworLyogTVgyNyBtZW1vcnkgbWFwIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW14MjdfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJLyoKKwkgKiB0aGlzIGZpeGVkIG1hcHBpbmcgY292ZXJzOgorCSAqIC0gQUlQSTEKKwkgKiAtIEFJUEkyCisJICogLSBBSVRDCisJICogLSBST00gUGF0Y2gKKwkgKiAtIGFuZCBzb21lIHJlc2VydmVkIHNwYWNlCisJICovCisJeworCQkudmlydHVhbCA9IE1YMjdfQUlQSV9CQVNFX0FERFJfVklSVCwKKwkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyN19BSVBJX0JBU0VfQUREUiksCisJCS5sZW5ndGggPSBNWDI3X0FJUElfU0laRSwKKwkJLnR5cGUgPSBNVF9ERVZJQ0UKKwl9LAorCS8qCisJICogdGhpcyBmaXhlZCBtYXBwaW5nIGNvdmVyczoKKwkgKiAtIENTSQorCSAqIC0gQVRBCisJICovCisJeworCQkudmlydHVhbCA9IE1YMjdfU0FIQjFfQkFTRV9BRERSX1ZJUlQsCisJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKE1YMjdfU0FIQjFfQkFTRV9BRERSKSwKKwkJLmxlbmd0aCA9IE1YMjdfU0FIQjFfU0laRSwKKwkJLnR5cGUgPSBNVF9ERVZJQ0UKKwl9LAorCS8qCisJICogdGhpcyBmaXhlZCBtYXBwaW5nIGNvdmVyczoKKwkgKiAtIEVNSQorCSAqLworCXsKKwkJLnZpcnR1YWwgPSBNWDI3X1hfTUVNQ19CQVNFX0FERFJfVklSVCwKKwkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyN19YX01FTUNfQkFTRV9BRERSKSwKKwkJLmxlbmd0aCA9IE1YMjdfWF9NRU1DX1NJWkUsCisJCS50eXBlID0gTVRfREVWSUNFCisJfSwKK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQorICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsCisgKiBtZW1vcnkgbWFwIGZvciB0aGUgSU8gbW9kdWxlcy4KKyAqLwordm9pZCBfX2luaXQgbXgyN19tYXBfaW8odm9pZCkKK3sKKwlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgyNyk7CisJbXhjX2FyY2hfcmVzZXRfaW5pdChNWDI3X0lPX0FERFJFU1MoTVgyN19XRE9HX0JBU0VfQUREUikpOworCisJaW90YWJsZV9pbml0KGlteDI3X2lvX2Rlc2MsIEFSUkFZX1NJWkUoaW14MjdfaW9fZGVzYykpOworfQorCitpbnQgaW14MjdfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CisKK3ZvaWQgX19pbml0IG14MjdfaW5pdF9pcnEodm9pZCkKK3sKKwlteGNfaW5pdF9pcnEoTVgyN19JT19BRERSRVNTKE1YMjdfQVZJQ19CQVNFX0FERFIpKTsKKwlpbXgyN19yZWdpc3Rlcl9ncGlvcygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEva3N5bV9teDEuYyBiL2FyY2gvYXJtL21hY2gtaW14L214MS1jYW1lcmEtZmlxLWtzeW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1teDEva3N5bV9teDEuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1pbXgvbXgxLWNhbWVyYS1maXEta3N5bS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MS9teDFfY2FtZXJhX2ZpcS5TIGIvYXJjaC9hcm0vbWFjaC1pbXgvbXgxLWNhbWVyYS1maXEuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1teDEvbXgxX2NhbWVyYV9maXEuUwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1pbXgvbXgxLWNhbWVyYS1maXEuUwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvcGNtOTcwLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvcGNtOTcwLWJhc2Vib2FyZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW14Mi9wY205NzAtYmFzZWJvYXJkLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtaW14L3BjbTk3MC1iYXNlYm9hcmQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDI3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMTdjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDI3LmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGkuTVgyNyBQb3dlciBNYW5hZ2VtZW50IFJvdXRpbmVzCisgKgorICogQmFzZWQgb24gRnJlZXNjYWxlJ3MgQlNQCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPG1hY2gvc3lzdGVtLmg+CisjaW5jbHVkZSA8bWFjaC9teDI3Lmg+CisKK3N0YXRpYyBpbnQgbXgyN19zdXNwZW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwl1MzIgY3NjcjsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJLyogQ2xlYXIgTVBFTiBhbmQgU1BFTiB0byBkaXNhYmxlIE1QTEwvU1BMTCAqLworCQljc2NyID0gX19yYXdfcmVhZGwoTVgyN19JT19BRERSRVNTKE1YMjdfQ0NNX0JBU0VfQUREUikpOworCQljc2NyICY9IDB4RkZGRkZGRkM7CisJCV9fcmF3X3dyaXRlbChjc2NyLCBNWDI3X0lPX0FERFJFU1MoTVgyN19DQ01fQkFTRV9BRERSKSk7CisJCS8qIEV4ZWN1dGVzIFdGSSAqLworCQlhcmNoX2lkbGUoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgbXgyN19zdXNwZW5kX29wcyA9IHsKKwkuZW50ZXIgPSBteDI3X3N1c3BlbmRfZW50ZXIsCisJLnZhbGlkID0gc3VzcGVuZF92YWxpZF9vbmx5X21lbSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG14MjdfcG1faW5pdCh2b2lkKQoreworCXN1c3BlbmRfc2V0X29wcygmbXgyN19zdXNwZW5kX29wcyk7CisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbChteDI3X3BtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOTZlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29tbW9uLmgKQEAgLTAsMCArMSBAQAordm9pZCBpbnRlZ3JhdG9yX3Jlc2VydmUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwppbmRleCBiMDJjZmMwLi44ZjRmYjZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9wbDAxMF9kYXRhIGludGVncmF0b3JfdWFydF9kYXRhOwogCkBAIC0xMTksOCArMTIxLDEzIEBACiAJLnJhdGUJPSAxNDc0NTYwMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrOworCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewotCXsJLyogVUFSVDAgKi8KKwl7CS8qIEJ1cyBjbG9jayAqLworCQkuY29uX2lkCQk9ICJhcGJfcGNsayIsCisJCS5jbGsJCT0gJmR1bW15X2FwYl9wY2xrLAorCX0sIHsJLyogVUFSVDAgKi8KIAkJLmRldl9pZAkJPSAibWI6MTYiLAogCQkuY2xrCQk9ICZ1YXJ0Y2xrLAogCX0sIHsJLyogVUFSVDEgKi8KQEAgLTIxNSwzICsyMjIsMTMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChjbV9jb250cm9sKTsKKworLyoKKyAqIFdlIG5lZWQgdG8gc3RvcCB0aGluZ3MgYWxsb2NhdGluZyB0aGUgbG93IG1lbW9yeTsgaWRlYWxseSB3ZSBuZWVkIGEKKyAqIGJldHRlciBpbXBsZW1lbnRhdGlvbiBvZiBHRlBfRE1BIHdoaWNoIGRvZXMgbm90IGFzc3VtZSB0aGF0IERNQS1hYmxlCisgKiBtZW1vcnkgc3RhcnRzIGF0IHplcm8uCisgKi8KK3ZvaWQgX19pbml0IGludGVncmF0b3JfcmVzZXJ2ZSh2b2lkKQoreworCW1lbWJsb2NrX3Jlc2VydmUoUEhZU19PRkZTRVQsIF9fcGEoc3dhcHBlcl9wZ19kaXIpIC0gUEhZU19PRkZTRVQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKaW5kZXggMjI3Y2Y0ZC4uNmFiNWEwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCkBAIC00OCw2ICs0OCw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCisjaW5jbHVkZSAiY29tbW9uLmgiCisKIC8qIAogICogQWxsIElPIGFkZHJlc3NlcyBhcmUgbWFwcGVkIG9udG8gVkEgMHhGRkZ4Lnh4eHgsIHdoZXJlIHgueHh4eAogICogaXMgdGhlIChQQSA+PiAxMikuCkBAIC01MDIsNiArNTA0LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjE2MDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAogCS5tYXBfaW8JCT0gYXBfbWFwX2lvLAorCS5yZXNlcnZlCT0gaW50ZWdyYXRvcl9yZXNlcnZlLAogCS5pbml0X2lycQk9IGFwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmYXBfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGFwX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwppbmRleCBjZGU1N2IyLi4wNWRiNDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKQEAgLTQzLDYgKzQzLDggQEAKIAogI2luY2x1ZGUgPHBsYXQvdGltZXItc3AuaD4KIAorI2luY2x1ZGUgImNvbW1vbi5oIgorCiAjZGVmaW5lIElOVENQX1BBX0ZMQVNIX0JBU0UJCTB4MjQwMDAwMDAKICNkZWZpbmUgSU5UQ1BfRkxBU0hfU0laRQkJU1pfMzJNCiAKQEAgLTYwMSw2ICs2MDMsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhmMTYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCiAJLm1hcF9pbwkJPSBpbnRjcF9tYXBfaW8sCisJLnJlc2VydmUJPSBpbnRlZ3JhdG9yX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gaW50Y3BfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjcF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaW50Y3BfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYwppbmRleCA5Y2VmMDU5Li42NDY3ZDk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpX3YzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaV92My5jCkBAIC01MDUsMTAgKzUwNSwxMCBAQAogCS8qCiAJICogSG9vayBpbiBvdXIgZmF1bHQgaGFuZGxlciBmb3IgUENJIGVycm9ycwogCSAqLwotCWhvb2tfZmF1bHRfY29kZSg0LCB2M19wY2lfZmF1bHQsIFNJR0JVUywgImV4dGVybmFsIGFib3J0IG9uIGxpbmVmZXRjaCIpOwotCWhvb2tfZmF1bHRfY29kZSg2LCB2M19wY2lfZmF1bHQsIFNJR0JVUywgImV4dGVybmFsIGFib3J0IG9uIGxpbmVmZXRjaCIpOwotCWhvb2tfZmF1bHRfY29kZSg4LCB2M19wY2lfZmF1bHQsIFNJR0JVUywgImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giKTsKLQlob29rX2ZhdWx0X2NvZGUoMTAsIHYzX3BjaV9mYXVsdCwgU0lHQlVTLCAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIpOworCWhvb2tfZmF1bHRfY29kZSg0LCB2M19wY2lfZmF1bHQsIFNJR0JVUywgMCwgImV4dGVybmFsIGFib3J0IG9uIGxpbmVmZXRjaCIpOworCWhvb2tfZmF1bHRfY29kZSg2LCB2M19wY2lfZmF1bHQsIFNJR0JVUywgMCwgImV4dGVybmFsIGFib3J0IG9uIGxpbmVmZXRjaCIpOworCWhvb2tfZmF1bHRfY29kZSg4LCB2M19wY2lfZmF1bHQsIFNJR0JVUywgMCwgImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giKTsKKwlob29rX2ZhdWx0X2NvZGUoMTAsIHYzX3BjaV9mYXVsdCwgU0lHQlVTLCAwLCAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnYzX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMjViMWRhOS4uNzQxNWU0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC02OSw2ICs2OSw0IEBACiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfSU9QMTNYWCAqLwogI2VuZGlmIC8qICFBU1NFTUJMWSAqLwogCi0jZGVmaW5lIFBGTl9UT19OSUQoYWRkcikJKDApCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jCmluZGV4IDZkNWE5MDguLjc3M2VhMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKQEAgLTk4Nyw3ICs5ODcsNyBAQAogCQlpb3AxM3h4X2F0dXhfc2V0dXAoKTsKIAl9CiAKLQlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaW9wMTN4eF9wY2lfYWJvcnQsIFNJR0JVUywKKwlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaW9wMTN4eF9wY2lfYWJvcnQsIFNJR0JVUywgMCwKIAkJCSJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jCmluZGV4IDkwNzcxY2EuLmY3OTdjNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvcGNpLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCQkJInRoZSBuZWVkZWQgd29ya2Fyb3VuZCBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBpbiIpOwogI2VuZGlmCiAKLQlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaXhwMjAwMF9wY2lfYWJvcnRfaGFuZGxlciwgU0lHQlVTLAorCWhvb2tfZmF1bHRfY29kZSgxNis2LCBpeHAyMDAwX3BjaV9hYm9ydF9oYW5kbGVyLCBTSUdCVVMsIDAsCiAJCQkJIlBDSSBjb25maWcgY3ljbGUgdG8gbm9uLWV4aXN0ZW50IGRldmljZSIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcGNpLmMKaW5kZXggNGIwZTU5OC4uNTYzODE5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9wY2kuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiB7CiAJaXhwMjN4eF9wY2lfY29tbW9uX2luaXQoKTsKIAotCWhvb2tfZmF1bHRfY29kZSgxNis2LCBpeHAyM3h4X3BjaV9hYm9ydF9oYW5kbGVyLCBTSUdCVVMsCisJaG9va19mYXVsdF9jb2RlKDE2KzYsIGl4cDIzeHhfcGNpX2Fib3J0X2hhbmRsZXIsIFNJR0JVUywgMCwKIAkJCSJQQ0kgY29uZmlnIGN5Y2xlIHRvIG5vbi1leGlzdGVudCBkZXZpY2UiKTsKIAogCSpJWFAyM1hYX1BDSV9BRERSX0VYVCA9IDB4MDAwMGUwMDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKaW5kZXggZTMxODE1My4uNjFjZDRkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAgKiBUaGlzIGlzIHJlYWxseSB1Z2x5IGFuZCB3ZSBuZWVkIGEgYmV0dGVyIHdheSBvZiBzcGVjaWZ5aW5nCiAgKiBETUEtY2FwYWJsZSByZWdpb25zIG9mIG1lbW9yeS4KICAqLwotdm9pZCBfX2luaXQgaXhwNHh4X2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqem9uZV9zaXplLAordm9pZCBfX2luaXQgaXhwNHh4X2FkanVzdF96b25lcyh1bnNpZ25lZCBsb25nICp6b25lX3NpemUsCiAJdW5zaWduZWQgbG9uZyAqemhvbGVfc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgc3ogPSBTWl82NE0gPj4gUEFHRV9TSElGVDsKQEAgLTM1Niw3ICszNTYsNyBAQAogCS8qCiAJICogT25seSBhZGp1c3QgaWYgPiA2NE0gb24gY3VycmVudCBzeXN0ZW0KIAkgKi8KLQlpZiAobm9kZSB8fCAoem9uZV9zaXplWzBdIDw9IHN6KSkKKwlpZiAoem9uZV9zaXplWzBdIDw9IHN6KQogCQlyZXR1cm47CiAKIAl6b25lX3NpemVbMV0gPSB6b25lX3NpemVbMF0gLSBzejsKQEAgLTM4Miw3ICszODIsOCBAQAogCiAKIAkvKiBob29rIGluIG91ciBmYXVsdCBoYW5kbGVyIGZvciBQQ0kgZXJyb3JzICovCi0JaG9va19mYXVsdF9jb2RlKDE2KzYsIGFib3J0X2hhbmRsZXIsIFNJR0JVUywgImltcHJlY2lzZSBleHRlcm5hbCBhYm9ydCIpOworCWhvb2tfZmF1bHRfY29kZSgxNis2LCBhYm9ydF9oYW5kbGVyLCBTSUdCVVMsIDAsCisJCQkiaW1wcmVjaXNlIGV4dGVybmFsIGFib3J0Iik7CiAKIAlwcl9kZWJ1Zygic2V0dXAgUENJLUFIQihpbmJvdW5kKSBhbmQgQUhCLVBDSShvdXRib3VuZCkgYWRkcmVzcyBtYXBwaW5nc1xuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA5OGY1ZTVlLi4wMTM2ZWFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykgJiYgZGVmaW5lZChDT05GSUdfUENJKQogCi12b2lkIGl4cDR4eF9hZGp1c3Rfem9uZXMoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGxvbmcgKmhvbGVzKTsKK3ZvaWQgaXhwNHh4X2FkanVzdF96b25lcyh1bnNpZ25lZCBsb25nICpzaXplLCB1bnNpZ25lZCBsb25nICpob2xlcyk7CiAKLSNkZWZpbmUgYXJjaF9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpIFwKLQlpeHA0eHhfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQorI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyhzaXplLCBob2xlcykgXAorCWl4cDR4eF9hZGp1c3Rfem9uZXMoc2l6ZSwgaG9sZXMpCiAKICNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQgKFNaXzY0TSAtIDEpCiAjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgU1pfNjRNKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9LY29uZmlnCmluZGV4IDI5YjIxNjMuLmNjMjU1MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL0tjb25maWcKQEAgLTc1LDYgKzc1LDEzIEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIE1hcnZlbGwgT3BlblJEIENsaWVudCBCb2FyZC4KIAorY29uZmlnIE1BQ0hfT1BFTlJEX1VMVElNQVRFCisJYm9vbCAiTWFydmVsbCBPcGVuUkQgVWx0aW1hdGUgQm9hcmQiCisJc2VsZWN0IE1BQ0hfT1BFTlJECisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCisJICBNYXJ2ZWxsIE9wZW5SRCBVbHRpbWF0ZSBCb2FyZC4KKwogY29uZmlnIE1BQ0hfTkVUU1BBQ0VfVjIKIAlib29sICJMYUNpZSBOZXR3b3JrIFNwYWNlIHYyIE5BUyBCb2FyZCIKIAloZWxwCkBAIC04Nyw2ICs5NCwxMiBAQAogCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCiAJICBMYUNpZSBJbnRlcm5ldCBTcGFjZSB2MiBOQVMuCiAKK2NvbmZpZyBNQUNIX05FVFNQQUNFX01BWF9WMgorCWJvb2wgIkxhQ2llIE5ldHdvcmsgU3BhY2UgTWF4IHYyIE5BUyBCb2FyZCIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKKwkgIExhQ2llIE5ldHdvcmsgU3BhY2UgTWF4IHYyIE5BUy4KKwogY29uZmlnIE1BQ0hfTkVUMkJJR19WMgogCWJvb2wgIkxhQ2llIDJCaWcgTmV0d29yayB2MiBOQVMgQm9hcmQiCiAJaGVscApAQCAtOTksNiArMTEyLDEyIEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIExhQ2llIDVCaWcgTmV0d29yayB2MiBOQVMuCiAKK2NvbmZpZyBNQUNIX1Q1MzI1CisJYm9vbCAiSFAgdDUzMjUgVGhpbiBDbGllbnQiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCisJICBIUCB0NTMyNSBUaGluIENsaWVudC4KKwogZW5kbWVudQogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvTWFrZWZpbGUKaW5kZXggYzBjZDVkMy4uMjk1ZDdiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw5IEBACiBvYmotJChDT05GSUdfTUFDSF9PUEVOUkQpCQkrPSBvcGVucmQtc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfTkVUU1BBQ0VfVjIpCQkrPSBuZXRzcGFjZV92Mi1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9JTkVUU1BBQ0VfVjIpCQkrPSBuZXRzcGFjZV92Mi1zZXR1cC5vCitvYmotJChDT05GSUdfTUFDSF9ORVRTUEFDRV9NQVhfVjIpCSs9IG5ldHNwYWNlX3YyLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX05FVDJCSUdfVjIpCQkrPSBuZXR4YmlnX3YyLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX05FVDVCSUdfVjIpCQkrPSBuZXR4YmlnX3YyLXNldHVwLm8KK29iai0kKENPTkZJR19NQUNIX1Q1MzI1KQkJKz0gdDUzMjUtc2V0dXAubwogCiBvYmotJChDT05GSUdfQ1BVX0lETEUpCQkJKz0gY3B1aWRsZS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2FkZHItbWFwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2FkZHItbWFwLmMKaW5kZXggMmU2OTE2OGYuLjhkMDNiY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvYWRkci1tYXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2FkZHItbWFwLmMKQEAgLTMxLDYgKzMxLDggQEAKICNkZWZpbmUgQVRUUl9ERVZfQ1MwCQkweDNlCiAjZGVmaW5lIEFUVFJfUENJRV9JTwkJMHhlMAogI2RlZmluZSBBVFRSX1BDSUVfTUVNCQkweGU4CisjZGVmaW5lIEFUVFJfUENJRTFfSU8JCTB4ZDAKKyNkZWZpbmUgQVRUUl9QQ0lFMV9NRU0JCTB4ZDgKICNkZWZpbmUgQVRUUl9TUkFNCQkweDAxCiAKIC8qCkBAIC0xMDYsMTcgKzEwOCwyMSBAQAogCQkgICAgICBUQVJHRVRfUENJRSwgQVRUUl9QQ0lFX0lPLCBLSVJLV09PRF9QQ0lFX0lPX0JVU19CQVNFKTsKIAlzZXR1cF9jcHVfd2luKDEsIEtJUktXT09EX1BDSUVfTUVNX1BIWVNfQkFTRSwgS0lSS1dPT0RfUENJRV9NRU1fU0laRSwKIAkJICAgICAgVEFSR0VUX1BDSUUsIEFUVFJfUENJRV9NRU0sIEtJUktXT09EX1BDSUVfTUVNX0JVU19CQVNFKTsKKwlzZXR1cF9jcHVfd2luKDIsIEtJUktXT09EX1BDSUUxX0lPX1BIWVNfQkFTRSwgS0lSS1dPT0RfUENJRTFfSU9fU0laRSwKKwkJICAgICAgVEFSR0VUX1BDSUUsIEFUVFJfUENJRTFfSU8sIEtJUktXT09EX1BDSUUxX0lPX0JVU19CQVNFKTsKKwlzZXR1cF9jcHVfd2luKDMsIEtJUktXT09EX1BDSUUxX01FTV9QSFlTX0JBU0UsIEtJUktXT09EX1BDSUUxX01FTV9TSVpFLAorCQkgICAgICBUQVJHRVRfUENJRSwgQVRUUl9QQ0lFMV9NRU0sIEtJUktXT09EX1BDSUUxX01FTV9CVVNfQkFTRSk7CiAKIAkvKgogCSAqIFNldHVwIHdpbmRvdyBmb3IgTkFORCBjb250cm9sbGVyLgogCSAqLwotCXNldHVwX2NwdV93aW4oMiwgS0lSS1dPT0RfTkFORF9NRU1fUEhZU19CQVNFLCBLSVJLV09PRF9OQU5EX01FTV9TSVpFLAorCXNldHVwX2NwdV93aW4oNCwgS0lSS1dPT0RfTkFORF9NRU1fUEhZU19CQVNFLCBLSVJLV09PRF9OQU5EX01FTV9TSVpFLAogCQkgICAgICBUQVJHRVRfREVWX0JVUywgQVRUUl9ERVZfTkFORCwgLTEpOwogCiAJLyoKIAkgKiBTZXR1cCB3aW5kb3cgZm9yIFNSQU0uCiAJICovCi0Jc2V0dXBfY3B1X3dpbigzLCBLSVJLV09PRF9TUkFNX1BIWVNfQkFTRSwgS0lSS1dPT0RfU1JBTV9TSVpFLAorCXNldHVwX2NwdV93aW4oNSwgS0lSS1dPT0RfU1JBTV9QSFlTX0JBU0UsIEtJUktXT09EX1NSQU1fU0laRSwKIAkJICAgICAgVEFSR0VUX1NSQU0sIEFUVFJfU1JBTSwgLTEpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jCmluZGV4IDYwNzJlYWEuLjlkZDY3YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYwpAQCAtNDQsNiArNDQsMTEgQEAKIAkJLmxlbmd0aAkJPSBLSVJLV09PRF9QQ0lFX0lPX1NJWkUsCiAJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CisJCS52aXJ0dWFsCT0gS0lSS1dPT0RfUENJRTFfSU9fVklSVF9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oS0lSS1dPT0RfUENJRTFfSU9fUEhZU19CQVNFKSwKKwkJLmxlbmd0aAkJPSBLSVJLV09PRF9QQ0lFMV9JT19TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgewogCQkudmlydHVhbAk9IEtJUktXT09EX1JFR1NfVklSVF9CQVNFLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oS0lSS1dPT0RfUkVHU19QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IEtJUktXT09EX1JFR1NfU0laRSwKQEAgLTQwMiw3ICs0MDcsNyBAQAogCXUzMiBkZXYsIHJldjsKIAogCWtpcmt3b29kX3BjaWVfaWQoJmRldiwgJnJldik7Ci0JaWYgKHJldiA9PSAwKSAgLyogY2F0Y2ggYWxsIEtpcmt3b29kIFowJ3MgKi8KKwlpZiAocmV2ID09IDAgJiYgZGV2ICE9IE1WODhGNjI4Ml9ERVZfSUQpIC8qIGNhdGNoIGFsbCBLaXJrd29vZCBaMCdzICovCiAJCW12c2Rpb19kYXRhLT5jbG9jayA9IDEwMDAwMDAwMDsKIAllbHNlCiAJCW12c2Rpb19kYXRhLT5jbG9jayA9IDIwMDAwMDAwMDsKQEAgLTg0Nyw4ICs4NTIsMTAgQEAKIAl1MzIgZGV2LCByZXY7CiAKIAlraXJrd29vZF9wY2llX2lkKCZkZXYsICZyZXYpOwotCWlmIChkZXYgPT0gTVY4OEY2MjgxX0RFVl9JRCAmJiAocmV2ID09IE1WODhGNjI4MV9SRVZfQTAgfHwKLQkJCQkJcmV2ID09IE1WODhGNjI4MV9SRVZfQTEpKQorCisJaWYgKChkZXYgPT0gTVY4OEY2MjgxX0RFVl9JRCAmJiAocmV2ID09IE1WODhGNjI4MV9SRVZfQTAgfHwKKwkJCQkJcmV2ID09IE1WODhGNjI4MV9SRVZfQTEpKSB8fAorCSAgICAoZGV2ID09IE1WODhGNjI4Ml9ERVZfSUQpKQogCQlyZXR1cm4gMjAwMDAwMDAwOwogCiAJcmV0dXJuIDE2NjY2NjY2NzsKQEAgLTg5MSwxMyArODk4LDIyIEBACiAJCQlyZXR1cm4gIk1WODhGNjE5Mi1aMCI7CiAJCWVsc2UgaWYgKHJldiA9PSBNVjg4RjYxOTJfUkVWX0EwKQogCQkJcmV0dXJuICJNVjg4RjYxOTItQTAiOworCQllbHNlIGlmIChyZXYgPT0gTVY4OEY2MTkyX1JFVl9BMSkKKwkJCXJldHVybiAiTVY4OEY2MTkyLUExIjsKIAkJZWxzZQogCQkJcmV0dXJuICJNVjg4RjYxOTItUmV2LVVuc3VwcG9ydGVkIjsKIAl9IGVsc2UgaWYgKGRldiA9PSBNVjg4RjYxODBfREVWX0lEKSB7CiAJCWlmIChyZXYgPT0gTVY4OEY2MTgwX1JFVl9BMCkKIAkJCXJldHVybiAiTVY4OEY2MTgwLVJldi1BMCI7CisJCWVsc2UgaWYgKHJldiA9PSBNVjg4RjYxODBfUkVWX0ExKQorCQkJcmV0dXJuICJNVjg4RjYxODAtUmV2LUExIjsKIAkJZWxzZQogCQkJcmV0dXJuICJNVjg4RjYxODAtUmV2LVVuc3VwcG9ydGVkIjsKKwl9IGVsc2UgaWYgKGRldiA9PSBNVjg4RjYyODJfREVWX0lEKSB7CisJCWlmIChyZXYgPT0gTVY4OEY2MjgyX1JFVl9BMCkKKwkJCXJldHVybiAiTVY4OEY2MjgyLVJldi1BMCI7CisJCWVsc2UKKwkJCXJldHVybiAiTVY4OEY2MjgyLVJldi1VbnN1cHBvcnRlZCI7CiAJfSBlbHNlIHsKIAkJcmV0dXJuICJEZXZpY2UtVW5rbm93biI7CiAJfQpAQCAtOTQ5LDEyICs5NjUsMTQgQEAKIHN0YXRpYyBpbnQgX19pbml0IGtpcmt3b29kX2Nsb2NrX2dhdGUodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3VyciA9IHJlYWRsKENMT0NLX0dBVElOR19DVFJMKTsKKwl1MzIgZGV2LCByZXY7CiAKKwlraXJrd29vZF9wY2llX2lkKCZkZXYsICZyZXYpOwogCXByaW50ayhLRVJOX0RFQlVHICJHYXRpbmcgY2xvY2sgb2YgdW51c2VkIHVuaXRzXG4iKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiYmVmb3JlOiAweCUwOHhcbiIsIGN1cnIpOwogCiAJLyogTWFrZSBzdXJlIHRob3NlIHVuaXRzIGFyZSBhY2Nlc3NpYmxlICovCi0Jd3JpdGVsKGN1cnIgfCBDR0NfU0FUQTAgfCBDR0NfU0FUQTEgfCBDR0NfUEVYMCwgQ0xPQ0tfR0FUSU5HX0NUUkwpOworCXdyaXRlbChjdXJyIHwgQ0dDX1NBVEEwIHwgQ0dDX1NBVEExIHwgQ0dDX1BFWDAgfCBDR0NfUEVYMSwgQ0xPQ0tfR0FUSU5HX0NUUkwpOwogCiAJLyogRm9yIFNBVEE6IGZpcnN0IHNodXRkb3duIHRoZSBwaHkgKi8KIAlpZiAoIShraXJrd29vZF9jbGtfY3RybCAmIENHQ19TQVRBMCkpIHsKQEAgLTk3OSw2ICs5OTcsMTggQEAKIAkJd3JpdGVsKHJlYWRsKFBDSUVfTElOS19DVFJMKSAmIH4weDEwLCBQQ0lFX0xJTktfQ1RSTCk7CiAJfQogCisJLyogRm9yIFBDSWUgMTogZmlyc3Qgc2h1dGRvd24gdGhlIHBoeSAqLworCWlmIChkZXYgPT0gTVY4OEY2MjgyX0RFVl9JRCkgeworCQlpZiAoIShraXJrd29vZF9jbGtfY3RybCAmIENHQ19QRVgxKSkgeworCQkJd3JpdGVsKHJlYWRsKFBDSUUxX0xJTktfQ1RSTCkgfCAweDEwLCBQQ0lFMV9MSU5LX0NUUkwpOworCQkJd2hpbGUgKDEpCisJCQkJaWYgKHJlYWRsKFBDSUUxX1NUQVRVUykgJiAweDEpCisJCQkJCWJyZWFrOworCQkJd3JpdGVsKHJlYWRsKFBDSUUxX0xJTktfQ1RSTCkgJiB+MHgxMCwgUENJRTFfTElOS19DVFJMKTsKKwkJfQorCX0gZWxzZSAgLyoga2VlcCB0aGlzIGJpdCBzZXQgZm9yIGRldmljZXMgdGhhdCBkb24ndCBoYXZlIFBDSWUxICovCisJCWtpcmt3b29kX2Nsa19jdHJsIHw9IENHQ19QRVgxOworCiAJLyogTm93IGdhdGUgY2xvY2sgdGhlIHJlcXVpcmVkIHVuaXRzICovCiAJd3JpdGVsKGtpcmt3b29kX2Nsa19jdHJsLCBDTE9DS19HQVRJTkdfQ1RSTCk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiBhZnRlcjogMHglMDh4XG4iLCByZWFkbChDTE9DS19HQVRJTkdfQ1RSTCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmgKaW5kZXggMDVlOGE4YS4uNWIyYzFjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5oCkBAIC0xOCw2ICsxOCw5IEBACiBzdHJ1Y3QgbXRkX3BhcnRpdGlvbjsKIHN0cnVjdCBtdGRfaW5mbzsKIAorI2RlZmluZSBLV19QQ0lFMAkoMSA8PCAwKQorI2RlZmluZSBLV19QQ0lFMQkoMSA8PCAxKQorCiAvKgogICogQmFzaWMgS2lya3dvb2QgaW5pdCBmdW5jdGlvbnMgdXNlZCBlYXJseSBieSBtYWNoaW5lLXNldHVwLgogICovCkBAIC0zNCw3ICszNyw3IEBACiB2b2lkIGtpcmt3b29kX2dlMDBfaW5pdChzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSAqZXRoX2RhdGEpOwogdm9pZCBraXJrd29vZF9nZTAxX2luaXQoc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKmV0aF9kYXRhKTsKIHZvaWQga2lya3dvb2RfZ2UwMF9zd2l0Y2hfaW5pdChzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEgKmQsIGludCBpcnEpOwotdm9pZCBraXJrd29vZF9wY2llX2luaXQodm9pZCk7Cit2b2lkIGtpcmt3b29kX3BjaWVfaW5pdCh1bnNpZ25lZCBpbnQgcG9ydG1hc2spOwogdm9pZCBraXJrd29vZF9zYXRhX2luaXQoc3RydWN0IG12X3NhdGFfcGxhdGZvcm1fZGF0YSAqc2F0YV9kYXRhKTsKIHZvaWQga2lya3dvb2Rfc2Rpb19pbml0KHN0cnVjdCBtdnNkaW9fcGxhdGZvcm1fZGF0YSAqbXZzZGlvX2RhdGEpOwogdm9pZCBraXJrd29vZF9zcGlfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZGI4OGY2MjgxLWJwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RiODhmNjI4MS1icC1zZXR1cC5jCmluZGV4IDM5YmRmNGIuLjE2ZjY2OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZGI4OGY2MjgxLWJwLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kYjg4ZjYyODEtYnAtc2V0dXAuYwpAQCAtNTEsNiArNTEsMTQgQEAKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGI4OGY2MjgxX21wcF9jb25maWdbXSBfX2luaXRkYXRhID0geworCU1QUDBfTkZfSU8yLAorCU1QUDFfTkZfSU8zLAorCU1QUDJfTkZfSU80LAorCU1QUDNfTkZfSU81LAorCU1QUDRfTkZfSU82LAorCU1QUDVfTkZfSU83LAorCU1QUDE4X05GX0lPMCwKKwlNUFAxOV9ORl9JTzEsCiAJTVBQMzdfR1BJTywKIAlNUFAzOF9HUElPLAogCTAKQEAgLTc0LDkgKzgyLDE1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGRiODhmNjI4MV9wY2lfaW5pdCh2b2lkKQogewotCWlmIChtYWNoaW5lX2lzX2RiODhmNjI4MV9icCgpKQotCQlraXJrd29vZF9wY2llX2luaXQoKTsKKwlpZiAobWFjaGluZV9pc19kYjg4ZjYyODFfYnAoKSkgeworCQl1MzIgZGV2LCByZXY7CiAKKwkJa2lya3dvb2RfcGNpZV9pZCgmZGV2LCAmcmV2KTsKKwkJaWYgKGRldiA9PSBNVjg4RjYyODJfREVWX0lEKQorCQkJa2lya3dvb2RfcGNpZV9pbml0KEtXX1BDSUUxIHwgS1dfUENJRTApOworCQllbHNlCisJCQlraXJrd29vZF9wY2llX2luaXQoS1dfUENJRTApOworCX0KIAlyZXR1cm4gMDsKIH0KIHN1YnN5c19pbml0Y2FsbChkYjg4ZjYyODFfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvYnJpZGdlLXJlZ3MuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2JyaWRnZS1yZWdzLmgKaW5kZXggNDE4ZjUwMS4uYWZmMGUxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvYnJpZGdlLXJlZ3MuaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9icmlkZ2UtcmVncy5oCkBAIC01OSw4ICs1OSw5IEBACiAjZGVmaW5lIENHQ19TQVRBMQkJKDEgPDwgMTUpCiAjZGVmaW5lIENHQ19YT1IxCQkoMSA8PCAxNikKICNkZWZpbmUgQ0dDX0NSWVBUTwkJKDEgPDwgMTcpCisjZGVmaW5lIENHQ19QRVgxCQkoMSA8PCAxOCkKICNkZWZpbmUgQ0dDX0dFMQkJCSgxIDw8IDE5KQogI2RlZmluZSBDR0NfVERNCQkJKDEgPDwgMjApCi0jZGVmaW5lIENHQ19SRVNFUlZFRAkJKCgxIDw8IDE4KSB8ICgweDYgPDwgMjEpKQorI2RlZmluZSBDR0NfUkVTRVJWRUQJCSgweDYgPDwgMjEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IGYwMGEwYTQuLjlkYTJlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNkZWZpbmUgSVJRX0tJUktXT09EX1hPUl8xMAk3CiAjZGVmaW5lIElSUV9LSVJLV09PRF9YT1JfMTEJOAogI2RlZmluZSBJUlFfS0lSS1dPT0RfUENJRQk5CisjZGVmaW5lIElSUV9LSVJLV09PRF9QQ0lFMQkxMAogI2RlZmluZSBJUlFfS0lSS1dPT0RfR0UwMF9TVU0JMTEKICNkZWZpbmUgSVJRX0tJUktXT09EX0dFMDFfU1VNCTE1CiAjZGVmaW5lIElSUV9LSVJLV09PRF9VU0IJMTkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2tpcmt3b29kLmggYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9raXJrd29vZC5oCmluZGV4IGExNWNmMGUuLmQxNDFhZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2tpcmt3b29kLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gva2lya3dvb2QuaApAQCAtMTYsMzYgKzE2LDQ4IEBACiAgKiBNYXJ2ZWxsIEtpcmt3b29kIGFkZHJlc3MgbWFwcy4KICAqCiAgKiBwaHlzCi0gKiBlMDAwMDAwMAlQQ0llIE1lbW9yeSBzcGFjZQorICogZTAwMDAwMDAJUENJZSAjMCBNZW1vcnkgc3BhY2UKKyAqIGU4MDAwMDAwCVBDSWUgIzEgTWVtb3J5IHNwYWNlCiAgKiBmMTAwMDAwMAlvbi1jaGlwIHBlcmlwaGVyYWwgcmVnaXN0ZXJzCi0gKiBmMjAwMDAwMAlQQ0llIEkvTyBzcGFjZQotICogZjMwMDAwMDAJTkFORCBjb250cm9sbGVyIGFkZHJlc3Mgd2luZG93Ci0gKiBmNDAwMDAwMAlTZWN1cml0eSBBY2NlbGVyYXRvciBTUkFNCisgKiBmMjAwMDAwMAlQQ0llICMwIEkvTyBzcGFjZQorICogZjMwMDAwMDAJUENJZSAjMSBJL08gc3BhY2UKKyAqIGY0MDAwMDAwCU5BTkQgY29udHJvbGxlciBhZGRyZXNzIHdpbmRvdworICogZjUwMDAwMDAJU2VjdXJpdHkgQWNjZWxlcmF0b3IgU1JBTQogICoKICAqIHZpcnQJCXBoeXMJCXNpemUKLSAqIGZlZTAwMDAwCWYxMDAwMDAwCTFNCW9uLWNoaXAgcGVyaXBoZXJhbCByZWdpc3RlcnMKLSAqIGZlZjAwMDAwCWYyMDAwMDAwCTFNCVBDSWUgSS9PIHNwYWNlCisgKiBmZWQwMDAwMAlmMTAwMDAwMAkxTQlvbi1jaGlwIHBlcmlwaGVyYWwgcmVnaXN0ZXJzCisgKiBmZWUwMDAwMAlmMjAwMDAwMAkxTQlQQ0llICMwIEkvTyBzcGFjZQorICogZmVmMDAwMDAJZjMwMDAwMDAJMU0JUENJZSAjMSBJL08gc3BhY2UKICAqLwogCi0jZGVmaW5lIEtJUktXT09EX1NSQU1fUEhZU19CQVNFCQkweGY0MDAwMDAwCisjZGVmaW5lIEtJUktXT09EX1NSQU1fUEhZU19CQVNFCQkweGY1MDAwMDAwCiAjZGVmaW5lIEtJUktXT09EX1NSQU1fU0laRQkJU1pfMksKIAotI2RlZmluZSBLSVJLV09PRF9OQU5EX01FTV9QSFlTX0JBU0UJMHhmMzAwMDAwMAorI2RlZmluZSBLSVJLV09PRF9OQU5EX01FTV9QSFlTX0JBU0UJMHhmNDAwMDAwMAogI2RlZmluZSBLSVJLV09PRF9OQU5EX01FTV9TSVpFCQlTWl8xSwogCisjZGVmaW5lIEtJUktXT09EX1BDSUUxX0lPX1BIWVNfQkFTRQkweGYzMDAwMDAwCisjZGVmaW5lIEtJUktXT09EX1BDSUUxX0lPX1ZJUlRfQkFTRQkweGZlZjAwMDAwCisjZGVmaW5lIEtJUktXT09EX1BDSUUxX0lPX0JVU19CQVNFCTB4MDAwMDAwMDAKKyNkZWZpbmUgS0lSS1dPT0RfUENJRTFfSU9fU0laRQkJU1pfMU0KKwogI2RlZmluZSBLSVJLV09PRF9QQ0lFX0lPX1BIWVNfQkFTRQkweGYyMDAwMDAwCi0jZGVmaW5lIEtJUktXT09EX1BDSUVfSU9fVklSVF9CQVNFCTB4ZmVmMDAwMDAKKyNkZWZpbmUgS0lSS1dPT0RfUENJRV9JT19WSVJUX0JBU0UJMHhmZWUwMDAwMAogI2RlZmluZSBLSVJLV09PRF9QQ0lFX0lPX0JVU19CQVNFCTB4MDAwMDAwMDAKICNkZWZpbmUgS0lSS1dPT0RfUENJRV9JT19TSVpFCQlTWl8xTQogCiAjZGVmaW5lIEtJUktXT09EX1JFR1NfUEhZU19CQVNFCQkweGYxMDAwMDAwCi0jZGVmaW5lIEtJUktXT09EX1JFR1NfVklSVF9CQVNFCQkweGZlZTAwMDAwCisjZGVmaW5lIEtJUktXT09EX1JFR1NfVklSVF9CQVNFCQkweGZlZDAwMDAwCiAjZGVmaW5lIEtJUktXT09EX1JFR1NfU0laRQkJU1pfMU0KIAogI2RlZmluZSBLSVJLV09PRF9QQ0lFX01FTV9QSFlTX0JBU0UJMHhlMDAwMDAwMAogI2RlZmluZSBLSVJLV09PRF9QQ0lFX01FTV9CVVNfQkFTRQkweGUwMDAwMDAwCiAjZGVmaW5lIEtJUktXT09EX1BDSUVfTUVNX1NJWkUJCVNaXzEyOE0KIAorI2RlZmluZSBLSVJLV09PRF9QQ0lFMV9NRU1fUEhZU19CQVNFCTB4ZTgwMDAwMDAKKyNkZWZpbmUgS0lSS1dPT0RfUENJRTFfTUVNX0JVU19CQVNFCTB4ZTgwMDAwMDAKKyNkZWZpbmUgS0lSS1dPT0RfUENJRTFfTUVNX1NJWkUJCVNaXzEyOE0KKwogLyoKICAqIFJlZ2lzdGVyIE1hcAogICovCkBAIC03Miw2ICs4NCw5IEBACiAjZGVmaW5lIFBDSUVfVklSVF9CQVNFCQkoS0lSS1dPT0RfUkVHU19WSVJUX0JBU0UgfCAweDQwMDAwKQogI2RlZmluZSBQQ0lFX0xJTktfQ1RSTAkJKFBDSUVfVklSVF9CQVNFIHwgMHg3MCkKICNkZWZpbmUgUENJRV9TVEFUVVMJCShQQ0lFX1ZJUlRfQkFTRSB8IDB4MWEwNCkKKyNkZWZpbmUgUENJRTFfVklSVF9CQVNFCQkoS0lSS1dPT0RfUkVHU19WSVJUX0JBU0UgfCAweDQ0MDAwKQorI2RlZmluZSBQQ0lFMV9MSU5LX0NUUkwJCShQQ0lFMV9WSVJUX0JBU0UgfCAweDcwKQorI2RlZmluZSBQQ0lFMV9TVEFUVVMJCShQQ0lFMV9WSVJUX0JBU0UgfCAweDFhMDQpCiAKICNkZWZpbmUgVVNCX1BIWVNfQkFTRQkJKEtJUktXT09EX1JFR1NfUEhZU19CQVNFIHwgMHg1MDAwMCkKIApAQCAtMTA3LDggKzEyMiwxMiBAQAogI2RlZmluZSBNVjg4RjYxOTJfREVWX0lECTB4NjE5MgogI2RlZmluZSBNVjg4RjYxOTJfUkVWX1owCTAKICNkZWZpbmUgTVY4OEY2MTkyX1JFVl9BMAkyCisjZGVmaW5lIE1WODhGNjE5Ml9SRVZfQTEJMwogCiAjZGVmaW5lIE1WODhGNjE4MF9ERVZfSUQJMHg2MTgwCiAjZGVmaW5lIE1WODhGNjE4MF9SRVZfQTAJMgorI2RlZmluZSBNVjg4RjYxODBfUkVWX0ExCTMKIAorI2RlZmluZSBNVjg4RjYyODJfREVWX0lECTB4NjI4MgorI2RlZmluZSBNVjg4RjYyODJfUkVWX0EwCTAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvbGVkcy1uczIuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2xlZHMtbnMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxMjcyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2xlZHMtbnMyLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2xlZHMtbnMyLmgKKyAqCisgKiBQbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZSBmb3IgTmV0d29yayBTcGFjZSB2MiBMRUQgZHJpdmVyCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfX01BQ0hfTEVEU19OUzJfSAorI2RlZmluZSBfX01BQ0hfTEVEU19OUzJfSAorCitzdHJ1Y3QgbnMyX2xlZCB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwljb25zdCBjaGFyCSpkZWZhdWx0X3RyaWdnZXI7CisJdW5zaWduZWQJY21kOworCXVuc2lnbmVkCXNsb3c7Cit9OworCitzdHJ1Y3QgbnMyX2xlZF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQJCW51bV9sZWRzOworCXN0cnVjdCBuczJfbGVkCSpsZWRzOworfTsKKworI2VuZGlmIC8qIF9fTUFDSF9MRURTX05TMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL21wcC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tcHAuYwppbmRleCBhNTkwMGY2Li4wNjUxODdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL21wcC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXBwLmMKQEAgLTIzLDcgKzIzLDggQEAKIAogCWtpcmt3b29kX3BjaWVfaWQoJmRldiwgJnJldik7CiAKLQlpZiAoZGV2ID09IE1WODhGNjI4MV9ERVZfSUQgJiYgcmV2ID49IE1WODhGNjI4MV9SRVZfQTApCisJaWYgKChkZXYgPT0gTVY4OEY2MjgxX0RFVl9JRCAmJiByZXYgPj0gTVY4OEY2MjgxX1JFVl9BMCkgfHwKKwkgICAgKGRldiA9PSBNVjg4RjYyODJfREVWX0lEKSkKIAkJcmV0dXJuIE1QUF9GNjI4MV9NQVNLOwogCWlmIChkZXYgPT0gTVY4OEY2MTkyX0RFVl9JRCAmJiByZXYgPj0gTVY4OEY2MTkyX1JFVl9BMCkKIAkJcmV0dXJuIE1QUF9GNjE5Ml9NQVNLOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tcHAuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXBwLmgKaW5kZXggYmM3NDI3OC4uOWIwYTk0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tcHAuaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL21wcC5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWZuZGVmIF9fS0lSS1dPT0RfTVBQX0gKICNkZWZpbmUgX19LSVJLV09PRF9NUFBfSAogCi0jZGVmaW5lIE1QUChfbnVtLCBfc2VsLCBfaW4sIF9vdXQsIF9GNjE4MCwgX0Y2MTkwLCBfRjYxOTIsIF9GNjI4MSkgKCBcCisjZGVmaW5lIE1QUChfbnVtLCBfc2VsLCBfaW4sIF9vdXQsIF9GNjE4MCwgX0Y2MTkwLCBfRjYxOTIsIF9GNjI4MSwgX0Y2MjgyKSAoIFwKIAkvKiBNUFAgbnVtYmVyICovCQkoKF9udW0pICYgMHhmZikgfCBcCiAJLyogTVBQIHNlbGVjdCB2YWx1ZSAqLwkJKCgoX3NlbCkgJiAweGYpIDw8IDgpIHwgXAogCS8qIG1heSBiZSBpbnB1dCBzaWduYWwgKi8JKCghIShfaW4pKSA8PCAxMikgfCBcCkBAIC0xOSwyODIgKzE5LDMzMiBAQAogCS8qIGF2YWlsYWJsZSBvbiBGNjE4MCAqLwkoKCEhKF9GNjE4MCkpIDw8IDE0KSB8IFwKIAkvKiBhdmFpbGFibGUgb24gRjYxOTAgKi8JKCghIShfRjYxOTApKSA8PCAxNSkgfCBcCiAJLyogYXZhaWxhYmxlIG9uIEY2MTkyICovCSgoISEoX0Y2MTkyKSkgPDwgMTYpIHwgXAotCS8qIGF2YWlsYWJsZSBvbiBGNjI4MSAqLwkoKCEhKF9GNjI4MSkpIDw8IDE3KSkKKwkvKiBhdmFpbGFibGUgb24gRjYyODEgKi8JKCghIShfRjYyODEpKSA8PCAxNykgfCBcCisJLyogYXZhaWxhYmxlIG9uIEY2MjgyICovCSgoISEoX0Y2MjgyKSkgPDwgMTgpKQogCiAjZGVmaW5lIE1QUF9OVU0oeCkJKCh4KSAmIDB4ZmYpCiAjZGVmaW5lIE1QUF9TRUwoeCkJKCgoeCkgPj4gOCkgJiAweGYpCiAKLQkJCQkvKiAgIG51bSBzZWwgIGkgIG8gIDYxODAgNjE5MCA2MTkyIDYyODEgKi8KKwkJCQkvKiAgIG51bSBzZWwgIGkgIG8gIDYxODAgNjE5MCA2MTkyIDYyODEgNjI4MiAqLwogCi0jZGVmaW5lIE1QUF9JTlBVVF9NQVNLCQlNUFAoICAwLCAweDAsIDEsIDAsIDAsICAgMCwgICAwLCAgIDAgICAgKQotI2RlZmluZSBNUFBfT1VUUFVUX01BU0sJCU1QUCggIDAsIDB4MCwgMCwgMSwgMCwgICAwLCAgIDAsICAgMCAgICApCisjZGVmaW5lIE1QUF9JTlBVVF9NQVNLCQlNUFAoICAwLCAweDAsIDEsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMCApCisjZGVmaW5lIE1QUF9PVVRQVVRfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAxLCAwLCAgIDAsICAgMCwgICAwLCAgIDAgKQogCi0jZGVmaW5lIE1QUF9GNjE4MF9NQVNLCQlNUFAoICAwLCAweDAsIDAsIDAsIDEsICAgMCwgICAwLCAgIDAgICAgKQotI2RlZmluZSBNUFBfRjYxOTBfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAwLCAwLCAgIDEsICAgMCwgICAwICAgICkKLSNkZWZpbmUgTVBQX0Y2MTkyX01BU0sJCU1QUCggIDAsIDB4MCwgMCwgMCwgMCwgICAwLCAgIDEsICAgMCAgICApCi0jZGVmaW5lIE1QUF9GNjI4MV9NQVNLCQlNUFAoICAwLCAweDAsIDAsIDAsIDAsICAgMCwgICAwLCAgIDEgICAgKQorI2RlZmluZSBNUFBfRjYxODBfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAwLCAxLCAgIDAsICAgMCwgICAwLCAgIDAgKQorI2RlZmluZSBNUFBfRjYxOTBfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAwLCAwLCAgIDEsICAgMCwgICAwLCAgIDAgKQorI2RlZmluZSBNUFBfRjYxOTJfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAwLCAwLCAgIDAsICAgMSwgICAwLCAgIDAgKQorI2RlZmluZSBNUFBfRjYyODFfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAwLCAwLCAgIDAsICAgMCwgICAxLCAgIDAgKQorI2RlZmluZSBNUFBfRjYyODJfTUFTSwkJTVBQKCAgMCwgMHgwLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDBfR1BJTwkJTVBQKCAgMCwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMF9ORl9JTzIJCU1QUCggIDAsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDBfU1BJX1NDbgkJTVBQKCAgMCwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMF9HUElPCQlNUFAoICAwLCAweDAsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDBfTkZfSU8yCQlNUFAoICAwLCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDBfU1BJX1NDbgkJTVBQKCAgMCwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQogCi0jZGVmaW5lIE1QUDFfR1BPCQlNUFAoICAxLCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxX05GX0lPMwkJTVBQKCAgMSwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMV9TUElfTU9TSQkJTVBQKCAgMSwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMV9HUE8JCU1QUCggIDEsIDB4MCwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMV9ORl9JTzMJCU1QUCggIDEsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMV9TUElfTU9TSQkJTVBQKCAgMSwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQogCi0jZGVmaW5lIE1QUDJfR1BPCQlNUFAoICAyLCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyX05GX0lPNAkJTVBQKCAgMiwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMl9TUElfU0NLCQlNUFAoICAyLCAweDIsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAyX0dQTwkJTVBQKCAgMiwgMHgwLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyX05GX0lPNAkJTVBQKCAgMiwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyX1NQSV9TQ0sJCU1QUCggIDIsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKIAotI2RlZmluZSBNUFAzX0dQTwkJTVBQKCAgMywgMHgwLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQM19ORl9JTzUJCU1QUCggIDMsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDNfU1BJX01JU08JCU1QUCggIDMsIDB4MiwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDNfR1BPCQlNUFAoICAzLCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDNfTkZfSU81CQlNUFAoICAzLCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDNfU1BJX01JU08JCU1QUCggIDMsIDB4MiwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKIAotI2RlZmluZSBNUFA0X0dQSU8JCU1QUCggIDQsIDB4MCwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDRfTkZfSU82CQlNUFAoICA0LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA0X1VBUlQwX1JYRAkJTVBQKCAgNCwgMHgyLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQNF9TQVRBMV9BQ1RuCQlNUFAoICA0LCAweDUsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA0X1BUUF9DTEsJCU1QUCggIDQsIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDRfR1BJTwkJTVBQKCAgNCwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0X05GX0lPNgkJTVBQKCAgNCwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0X1VBUlQwX1JYRAkJTVBQKCAgNCwgMHgyLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0X1NBVEExX0FDVG4JCU1QUCggIDQsIDB4NSwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNF9MQ0RfVkdBX0hTWU5DCU1QUCggIDQsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKKyNkZWZpbmUgTVBQNF9QVFBfQ0xLCQlNUFAoICA0LCAweGQsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEsICAgMCApCiAKLSNkZWZpbmUgTVBQNV9HUE8JCU1QUCggIDUsIDB4MCwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDVfTkZfSU83CQlNUFAoICA1LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA1X1VBUlQwX1RYRAkJTVBQKCAgNSwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQNV9QVFBfVFJJR19HRU4JTVBQKCAgNSwgMHg0LCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQNV9TQVRBMF9BQ1RuCQlNUFAoICA1LCAweDUsIDAsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFA1X0dQTwkJTVBQKCAgNSwgMHgwLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA1X05GX0lPNwkJTVBQKCAgNSwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA1X1VBUlQwX1RYRAkJTVBQKCAgNSwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA1X1BUUF9UUklHX0dFTglNUFAoICA1LCAweDQsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDVfU0FUQTBfQUNUbgkJTVBQKCAgNSwgMHg1LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA1X0xDRF9WR0FfVlNZTkMJTVBQKCAgNSwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDZfU1lTUlNUX09VVG4JTVBQKCAgNiwgMHgxLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQNl9TUElfTU9TSQkJTVBQKCAgNiwgMHgyLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQNl9QVFBfVFJJR19HRU4JTVBQKCAgNiwgMHgzLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQNl9TWVNSU1RfT1VUbglNUFAoICA2LCAweDEsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDZfU1BJX01PU0kJCU1QUCggIDYsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNl9QVFBfVFJJR19HRU4JTVBQKCAgNiwgMHgzLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDAgKQogCi0jZGVmaW5lIE1QUDdfR1BPCQlNUFAoICA3LCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA3X1BFWF9SU1RfT1VUbglNUFAoICA3LCAweDEsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA3X1NQSV9TQ24JCU1QUCggIDcsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDdfUFRQX1RSSUdfR0VOCU1QUCggIDcsIDB4MywgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDdfR1BPCQlNUFAoICA3LCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDdfUEVYX1JTVF9PVVRuCU1QUCggIDcsIDB4MSwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAwICkKKyNkZWZpbmUgTVBQN19TUElfU0NuCQlNUFAoICA3LCAweDIsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDdfUFRQX1RSSUdfR0VOCU1QUCggIDcsIDB4MywgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAwICkKKyNkZWZpbmUgTVBQN19MQ0RfUFdNCQlNUFAoICA3LCAweGIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQOF9HUElPCQlNUFAoICA4LCAweDAsIDEsIDEsIDEsICAgIDEsICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA4X1RXX1NEQQkJTVBQKCAgOCwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQOF9VQVJUMF9SVFMJCU1QUCggIDgsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDhfVUFSVDFfUlRTCQlNUFAoICA4LCAweDMsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA4X01JSTBfUlhFUlIJCU1QUCggIDgsIDB4NCwgMSwgMCwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDhfU0FUQTFfUFJFU0VOVG4JTVBQKCAgOCwgMHg1LCAwLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQOF9QVFBfQ0xLCQlNUFAoICA4LCAweGMsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA4X01JSTBfQ09MCQlNUFAoICA4LCAweGQsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFA4X0dQSU8JCU1QUCggIDgsIDB4MCwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQOF9UVzBfU0RBCQlNUFAoICA4LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDhfVUFSVDBfUlRTCQlNUFAoICA4LCAweDIsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDhfVUFSVDFfUlRTCQlNUFAoICA4LCAweDMsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDhfTUlJMF9SWEVSUgkJTVBQKCAgOCwgMHg0LCAxLCAwLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA4X1NBVEExX1BSRVNFTlRuCU1QUCggIDgsIDB4NSwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQOF9QVFBfQ0xLCQlNUFAoICA4LCAweGMsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDhfTUlJMF9DT0wJCU1QUCggIDgsIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKIAotI2RlZmluZSBNUFA5X0dQSU8JCU1QUCggIDksIDB4MCwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDlfVFdfU0NLCQlNUFAoICA5LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFA5X1VBUlQwX0NUUwkJTVBQKCAgOSwgMHgyLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQOV9VQVJUMV9DVFMJCU1QUCggIDksIDB4MywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDlfU0FUQTBfUFJFU0VOVG4JTVBQKCAgOSwgMHg1LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQOV9QVFBfRVZFTlRfUkVRCU1QUCggIDksIDB4YywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDlfTUlJMF9DUlMJCU1QUCggIDksIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDlfR1BJTwkJTVBQKCAgOSwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA5X1RXMF9TQ0sJCU1QUCggIDksIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQOV9VQVJUMF9DVFMJCU1QUCggIDksIDB4MiwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQOV9VQVJUMV9DVFMJCU1QUCggIDksIDB4MywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQOV9TQVRBMF9QUkVTRU5UbglNUFAoICA5LCAweDUsIDAsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDlfUFRQX0VWRU5UX1JFUQlNUFAoICA5LCAweGMsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDlfTUlJMF9DUlMJCU1QUCggIDksIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKIAotI2RlZmluZSBNUFAxMF9HUE8JCU1QUCggMTAsIDB4MCwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDEwX1NQSV9TQ0sJCU1QUCggMTAsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDEwX1VBUlQwX1RYRAkJTVBQKCAxMCwgMFgzLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTBfU0FUQTFfQUNUbglNUFAoIDEwLCAweDUsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxMF9QVFBfVFJJR19HRU4JTVBQKCAxMCwgMHhjLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMTBfR1BPCQlNUFAoIDEwLCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDEwX1NQSV9TQ0sJCU1QUCggMTAsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTBfVUFSVDBfVFhECQlNUFAoIDEwLCAwWDMsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDEwX1NBVEExX0FDVG4JTVBQKCAxMCwgMHg1LCAwLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxMF9QVFBfVFJJR19HRU4JTVBQKCAxMCwgMHhjLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDAgKQogCi0jZGVmaW5lIE1QUDExX0dQSU8JCU1QUCggMTEsIDB4MCwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDExX1NQSV9NSVNPCQlNUFAoIDExLCAweDIsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxMV9VQVJUMF9SWEQJCU1QUCggMTEsIDB4MywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDExX1BUUF9FVkVOVF9SRVEJTVBQKCAxMSwgMHg0LCAxLCAwLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTFfUFRQX1RSSUdfR0VOCU1QUCggMTEsIDB4YywgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDExX1BUUF9DTEsJCU1QUCggMTEsIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDExX1NBVEEwX0FDVG4JTVBQKCAxMSwgMHg1LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMTFfR1BJTwkJTVBQKCAxMSwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxMV9TUElfTUlTTwkJTVBQKCAxMSwgMHgyLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxMV9VQVJUMF9SWEQJCU1QUCggMTEsIDB4MywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTFfUFRQX0VWRU5UX1JFUQlNUFAoIDExLCAweDQsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDExX1BUUF9UUklHX0dFTglNUFAoIDExLCAweGMsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDExX1BUUF9DTEsJCU1QUCggMTEsIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAwICkKKyNkZWZpbmUgTVBQMTFfU0FUQTBfQUNUbglNUFAoIDExLCAweDUsIDAsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCiAKLSNkZWZpbmUgTVBQMTJfR1BPCQlNUFAoIDEyLCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxMl9TRF9DTEsJCU1QUCggMTIsIDB4MSwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDEyX0dQTwkJTVBQKCAxMiwgMHgwLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxMl9TRF9DTEsJCU1QUCggMTIsIDB4MSwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTJfQVVfU1BESUYwCQlNUFAoIDEyLCAweGEsIDAsIDEsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCisjZGVmaW5lIE1QUDEyX1NQSV9NT1NJCQlNUFAoIDEyLCAweGIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCisjZGVmaW5lIE1QUDEyX1RXMV9TREEJCU1QUCggMTIsIDB4ZCwgMSwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAxM19HUElPCQlNUFAoIDEzLCAweDAsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxM19TRF9DTUQJCU1QUCggMTMsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDEzX1VBUlQxX1RYRAkJTVBQKCAxMywgMHgzLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMTNfR1BJTwkJTVBQKCAxMywgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxM19TRF9DTUQJCU1QUCggMTMsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTNfVUFSVDFfVFhECQlNUFAoIDEzLCAweDMsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDEzX0FVX1NQRElGUk1DTEsJTVBQKCAxMywgMHhhLCAwLCAxLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQorI2RlZmluZSBNUFAxM19MQ0RQV00JCU1QUCggMTMsIDB4YiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAxNF9HUElPCQlNUFAoIDE0LCAweDAsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxNF9TRF9EMAkJTVBQKCAxNCwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTRfVUFSVDFfUlhECQlNUFAoIDE0LCAweDMsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxNF9TQVRBMV9QUkVTRU5UbglNUFAoIDE0LCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxNF9NSUkwX0NPTAkJTVBQKCAxNCwgMHhkLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMTRfR1BJTwkJTVBQKCAxNCwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNF9TRF9EMAkJTVBQKCAxNCwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNF9VQVJUMV9SWEQJCU1QUCggMTQsIDB4MywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTRfU0FUQTFfUFJFU0VOVG4JTVBQKCAxNCwgMHg0LCAwLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNF9BVV9TUERJRkkJCU1QUCggMTQsIDB4YSwgMSwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKKyNkZWZpbmUgTVBQMTRfQVVfSTJTREkJCU1QUCggMTQsIDB4YiwgMSwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKKyNkZWZpbmUgTVBQMTRfTUlJMF9DT0wJCU1QUCggMTQsIDB4ZCwgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKIAotI2RlZmluZSBNUFAxNV9HUElPCQlNUFAoIDE1LCAweDAsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxNV9TRF9EMQkJTVBQKCAxNSwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTVfVUFSVDBfUlRTCQlNUFAoIDE1LCAweDIsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxNV9VQVJUMV9UWEQJCU1QUCggMTUsIDB4MywgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDE1X1NBVEEwX0FDVG4JTVBQKCAxNSwgMHg0LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMTVfR1BJTwkJTVBQKCAxNSwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNV9TRF9EMQkJTVBQKCAxNSwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNV9VQVJUMF9SVFMJCU1QUCggMTUsIDB4MiwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTVfVUFSVDFfVFhECQlNUFAoIDE1LCAweDMsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDE1X1NBVEEwX0FDVG4JTVBQKCAxNSwgMHg0LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNV9TUElfQ1NuCQlNUFAoIDE1LCAweGIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQMTZfR1BJTwkJTVBQKCAxNiwgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTZfU0RfRDIJCU1QUCggMTYsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDE2X1VBUlQwX0NUUwkJTVBQKCAxNiwgMHgyLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTZfVUFSVDFfUlhECQlNUFAoIDE2LCAweDMsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAxNl9TQVRBMV9BQ1RuCU1QUCggMTYsIDB4NCwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDE2X01JSTBfQ1JTCQlNUFAoIDE2LCAweGQsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAxNl9HUElPCQlNUFAoIDE2LCAweDAsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDE2X1NEX0QyCQlNUFAoIDE2LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDE2X1VBUlQwX0NUUwkJTVBQKCAxNiwgMHgyLCAxLCAwLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxNl9VQVJUMV9SWEQJCU1QUCggMTYsIDB4MywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTZfU0FUQTFfQUNUbglNUFAoIDE2LCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDE2X0xDRF9FWFRfUkVGX0NMSwlNUFAoIDE2LCAweGIsIDEsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCisjZGVmaW5lIE1QUDE2X01JSTBfQ1JTCQlNUFAoIDE2LCAweGQsIDEsIDAsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCiAKLSNkZWZpbmUgTVBQMTdfR1BJTwkJTVBQKCAxNywgMHgwLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMTdfU0RfRDMJCU1QUCggMTcsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDE3X1NBVEEwX1BSRVNFTlRuCU1QUCggMTcsIDB4NCwgMCwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDE3X0dQSU8JCU1QUCggMTcsIDB4MCwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTdfU0RfRDMJCU1QUCggMTcsIDB4MSwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMTdfU0FUQTBfUFJFU0VOVG4JTVBQKCAxNywgMHg0LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAxN19TQVRBMV9BQ1RuCU1QUCggMTcsIDB4YSwgMCwgMSwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKKyNkZWZpbmUgTVBQMTdfVFcxX1NDSwkJTVBQKCAxNywgMHhkLCAxLCAxLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDE4X0dQTwkJTVBQKCAxOCwgMHgwLCAwLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMThfTkZfSU8wCQlNUFAoIDE4LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAxOF9HUE8JCU1QUCggMTgsIDB4MCwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMThfTkZfSU8wCQlNUFAoIDE4LCAweDEsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDE4X1BFWDBfQ0xLUkVRCU1QUCggMTgsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAxOV9HUE8JCU1QUCggMTksIDB4MCwgMCwgMSwgMSwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDE5X05GX0lPMQkJTVBQKCAxOSwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMTlfR1BPCQlNUFAoIDE5LCAweDAsIDAsIDEsIDEsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDE5X05GX0lPMQkJTVBQKCAxOSwgMHgxLCAxLCAxLCAxLCAgIDEsICAgMSwgICAxLCAgIDEgKQogCi0jZGVmaW5lIE1QUDIwX0dQSU8JCU1QUCggMjAsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIwX1RTTVAwCQlNUFAoIDIwLCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMF9URE1fQ0gwX1RYX1FMCU1QUCggMjAsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIwX0dFMV8wCQlNUFAoIDIwLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMF9BVURJT19TUERJRkkJTVBQKCAyMCwgMHg0LCAxLCAwLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjBfU0FUQTFfQUNUbglNUFAoIDIwLCAweDUsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAyMF9HUElPCQlNUFAoIDIwLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIwX1RTTVAwCQlNUFAoIDIwLCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIwX1RETV9DSDBfVFhfUUwJTVBQKCAyMCwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyMF9HRTFfVFhEMAkJTVBQKCAyMCwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyMF9BVV9TUERJRkkJCU1QUCggMjAsIDB4NCwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjBfU0FUQTFfQUNUbglNUFAoIDIwLCAweDUsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIwX0xDRF9EMAkJTVBQKCAyMCwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDIxX0dQSU8JCU1QUCggMjEsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIxX1RTTVAxCQlNUFAoIDIxLCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMV9URE1fQ0gwX1JYX1FMCU1QUCggMjEsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIxX0dFMV8xCQlNUFAoIDIxLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMV9BVURJT19TUERJRk8JTVBQKCAyMSwgMHg0LCAwLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjFfU0FUQTBfQUNUbglNUFAoIDIxLCAweDUsIDAsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAyMV9HUElPCQlNUFAoIDIxLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIxX1RTTVAxCQlNUFAoIDIxLCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIxX1RETV9DSDBfUlhfUUwJTVBQKCAyMSwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyMV9HRTFfVFhEMQkJTVBQKCAyMSwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyMV9BVV9TUERJRk8JCU1QUCggMjEsIDB4NCwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjFfU0FUQTBfQUNUbglNUFAoIDIxLCAweDUsIDAsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIxX0xDRF9EMQkJTVBQKCAyMSwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDIyX0dQSU8JCU1QUCggMjIsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIyX1RTTVAyCQlNUFAoIDIyLCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMl9URE1fQ0gyX1RYX1FMCU1QUCggMjIsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIyX0dFMV8yCQlNUFAoIDIyLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMl9BVURJT19TUERJRlJNS0NMSwlNUFAoIDIyLCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyMl9TQVRBMV9QUkVTRU5UbglNUFAoIDIyLCAweDUsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAyMl9HUElPCQlNUFAoIDIyLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIyX1RTTVAyCQlNUFAoIDIyLCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIyX1RETV9DSDJfVFhfUUwJTVBQKCAyMiwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyMl9HRTFfVFhEMgkJTVBQKCAyMiwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyMl9BVV9TUERJRlJNS0NMSwlNUFAoIDIyLCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIyX1NBVEExX1BSRVNFTlRuCU1QUCggMjIsIDB4NSwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjJfTENEX0QyCQlNUFAoIDIyLCAweGIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQMjNfR1BJTwkJTVBQKCAyMywgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjNfVFNNUDMJCU1QUCggMjMsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIzX1RETV9DSDJfUlhfUUwJTVBQKCAyMywgMHgyLCAxLCAwLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjNfR0UxXzMJCU1QUCggMjMsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDIzX0FVRElPX0kyU0JDTEsJTVBQKCAyMywgMHg0LCAwLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjNfU0FUQTBfUFJFU0VOVG4JTVBQKCAyMywgMHg1LCAwLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMjNfR1BJTwkJTVBQKCAyMywgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyM19UU01QMwkJTVBQKCAyMywgMHgxLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyM19URE1fQ0gyX1JYX1FMCU1QUCggMjMsIDB4MiwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjNfR0UxX1RYRDMJCU1QUCggMjMsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjNfQVVfSTJTQkNMSwlNUFAoIDIzLCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDIzX1NBVEEwX1BSRVNFTlRuCU1QUCggMjMsIDB4NSwgMCwgMSwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjNfTENEX0QzCQlNUFAoIDIzLCAweGIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQMjRfR1BJTwkJTVBQKCAyNCwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjRfVFNNUDQJCU1QUCggMjQsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI0X1RETV9TUElfQ1MwCURFViggMjQsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI0X0dFMV80CQlNUFAoIDI0LCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyNF9BVURJT19JMlNETwlNUFAoIDI0LCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAyNF9HUElPCQlNUFAoIDI0LCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI0X1RTTVA0CQlNUFAoIDI0LCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI0X1RETV9TUElfQ1MwCU1QUCggMjQsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjRfR0UxX1JYRDAJCU1QUCggMjQsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjRfQVVfSTJTRE8JCU1QUCggMjQsIDB4NCwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjRfTENEX0Q0CQlNUFAoIDI0LCAweGIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQMjVfR1BJTwkJTVBQKCAyNSwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjVfVFNNUDUJCU1QUCggMjUsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI1X1RETV9TUElfU0NLCU1QUCggMjUsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI1X0dFMV81CQlNUFAoIDI1LCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyNV9BVURJT19JMlNMUkNMSwlNUFAoIDI1LCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAyNV9HUElPCQlNUFAoIDI1LCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI1X1RTTVA1CQlNUFAoIDI1LCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI1X1RETV9TUElfU0NLCU1QUCggMjUsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjVfR0UxX1JYRDEJCU1QUCggMjUsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjVfQVVfSTJTTFJDTEsJTVBQKCAyNSwgMHg0LCAwLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyNV9MQ0RfRDUJCU1QUCggMjUsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAyNl9HUElPCQlNUFAoIDI2LCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyNl9UU01QNgkJTVBQKCAyNiwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjZfVERNX1NQSV9NSVNPCU1QUCggMjYsIDB4MiwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI2X0dFMV82CQlNUFAoIDI2LCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyNl9BVURJT19JMlNNQ0xLCU1QUCggMjYsIDB4NCwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDI2X0dQSU8JCU1QUCggMjYsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjZfVFNNUDYJCU1QUCggMjYsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjZfVERNX1NQSV9NSVNPCU1QUCggMjYsIDB4MiwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjZfR0UxX1JYRDIJCU1QUCggMjYsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjZfQVVfSTJTTUNMSwlNUFAoIDI2LCAweDQsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI2X0xDRF9ENgkJTVBQKCAyNiwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDI3X0dQSU8JCU1QUCggMjcsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI3X1RTTVA3CQlNUFAoIDI3LCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyN19URE1fU1BJX01PU0kJTVBQKCAyNywgMHgyLCAwLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjdfR0UxXzcJCU1QUCggMjcsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI3X0FVRElPX0kyU0RJCU1QUCggMjcsIDB4NCwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDI3X0dQSU8JCU1QUCggMjcsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjdfVFNNUDcJCU1QUCggMjcsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjdfVERNX1NQSV9NT1NJCU1QUCggMjcsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjdfR0UxX1JYRDMJCU1QUCggMjcsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjdfQVVfSTJTREkJCU1QUCggMjcsIDB4NCwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjdfTENEX0Q3CQlNUFAoIDI3LCAweGIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQMjhfR1BJTwkJTVBQKCAyOCwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMjhfVFNNUDgJCU1QUCggMjgsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI4X1RETV9DT0RFQ19JTlRuCU1QUCggMjgsIDB4MiwgMCwgMCwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI4X0dFMV84CQlNUFAoIDI4LCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyOF9BVURJT19FWFRDTEsJTVBQKCAyOCwgMHg0LCAxLCAwLCAwLCAgIDAsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMjhfR1BJTwkJTVBQKCAyOCwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyOF9UU01QOAkJTVBQKCAyOCwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyOF9URE1fQ09ERUNfSU5UbglNUFAoIDI4LCAweDIsIDAsIDAsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI4X0dFMV9DT0wJCU1QUCggMjgsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMjhfQVVfRVhUQ0xLCQlNUFAoIDI4LCAweDQsIDEsIDAsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI4X0xDRF9EOAkJTVBQKCAyOCwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDI5X0dQSU8JCU1QUCggMjksIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDI5X1RTTVA5CQlNUFAoIDI5LCAweDEsIDEsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyOV9URE1fQ09ERUNfUlNUbglNUFAoIDI5LCAweDIsIDAsIDAsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAyOV9HRTFfOQkJTVBQKCAyOSwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMjlfR1BJTwkJTVBQKCAyOSwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyOV9UU01QOQkJTVBQKCAyOSwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyOV9URE1fQ09ERUNfUlNUbglNUFAoIDI5LCAweDIsIDAsIDAsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI5X0dFMV9UQ0xLCQlNUFAoIDI5LCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDI5X0xDRF9EOQkJTVBQKCAyOSwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDMwX0dQSU8JCU1QUCggMzAsIDB4MCwgMSwgMSwgMCwgICAxLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDMwX1RTTVAxMAkJTVBQKCAzMCwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMzBfVERNX1BDTEsJCU1QUCggMzAsIDB4MiwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDMwX0dFMV8xMAkJTVBQKCAzMCwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMzBfR1BJTwkJTVBQKCAzMCwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzMF9UU01QMTAJCU1QUCggMzAsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzBfVERNX1BDTEsJCU1QUCggMzAsIDB4MiwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzBfR0UxX1JYQ1RMCQlNUFAoIDMwLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDMwX0xDRF9EMTAJCU1QUCggMzAsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAzMV9HUElPCQlNUFAoIDMxLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAzMV9UU01QMTEJCU1QUCggMzEsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDMxX1RETV9GUwkJTVBQKCAzMSwgMHgyLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMzFfR0UxXzExCQlNUFAoIDMxLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAzMV9HUElPCQlNUFAoIDMxLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDMxX1RTTVAxMQkJTVBQKCAzMSwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzMV9URE1fRlMJCU1QUCggMzEsIDB4MiwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzFfR0UxX1JYQ0xLCQlNUFAoIDMxLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDMxX0xDRF9EMTEJCU1QUCggMzEsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAzMl9HUElPCQlNUFAoIDMyLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAzMl9UU01QMTIJCU1QUCggMzIsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDMyX1RETV9EUlgJCU1QUCggMzIsIDB4MiwgMSwgMCwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDMyX0dFMV8xMgkJTVBQKCAzMiwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxICAgICkKKyNkZWZpbmUgTVBQMzJfR1BJTwkJTVBQKCAzMiwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzMl9UU01QMTIJCU1QUCggMzIsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzJfVERNX0RSWAkJTVBQKCAzMiwgMHgyLCAxLCAwLCAwLCAgIDAsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzMl9HRTFfVENMS09VVAlNUFAoIDMyLCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDMyX0xDRF9EMTIJCU1QUCggMzIsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAzM19HUElPCQlNUFAoIDMzLCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAzM19URE1fRFRYCQlNUFAoIDMzLCAweDIsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAzM19HRTFfMTMJCU1QUCggMzMsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDMzX0dQTwkJTVBQKCAzMywgMHgwLCAwLCAxLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzM19URE1fRFRYCQlNUFAoIDMzLCAweDIsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDMzX0dFMV9UWENUTAkJTVBQKCAzMywgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzM19MQ0RfRDEzCQlNUFAoIDMzLCAweGIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQMzRfR1BJTwkJTVBQKCAzNCwgMHgwLCAxLCAxLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMzRfVERNX1NQSV9DUzEJTVBQKCAzNCwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMzRfR0UxXzE0CQlNUFAoIDM0LCAweDMsIDAsIDAsIDAsICAgMSwgICAxLCAgIDEgICAgKQorI2RlZmluZSBNUFAzNF9HUElPCQlNUFAoIDM0LCAweDAsIDEsIDEsIDAsICAgMSwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDM0X1RETV9TUElfQ1MxCU1QUCggMzQsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzRfR0UxX1RYRU4JCU1QUCggMzQsIDB4MywgMCwgMCwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzRfU0FUQTFfQUNUbglNUFAoIDM0LCAweDUsIDAsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDM0X0xDRF9EMTQJCU1QUCggMzQsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFAzNV9HUElPCQlNUFAoIDM1LCAweDAsIDEsIDEsIDEsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAzNV9URE1fQ0gwX1RYX1FMCU1QUCggMzUsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDEsICAgMSAgICApCi0jZGVmaW5lIE1QUDM1X0dFMV8xNQkJTVBQKCAzNSwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxICAgICkKLSNkZWZpbmUgTVBQMzVfU0FUQTBfQUNUbglNUFAoIDM1LCAweDUsIDAsIDEsIDAsICAgMSwgICAxLCAgIDEgICAgKQotI2RlZmluZSBNUFAzNV9NSUkwX1JYRVJSCU1QUCggMzUsIDB4YywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSAgICApCisjZGVmaW5lIE1QUDM1X0dQSU8JCU1QUCggMzUsIDB4MCwgMSwgMSwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzVfVERNX0NIMF9UWF9RTAlNUFAoIDM1LCAweDIsIDAsIDEsIDAsICAgMCwgICAxLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDM1X0dFMV9SWEVSUgkJTVBQKCAzNSwgMHgzLCAwLCAwLCAwLCAgIDEsICAgMSwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzNV9TQVRBMF9BQ1RuCU1QUCggMzUsIDB4NSwgMCwgMSwgMCwgICAxLCAgIDEsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzVfTENEX0QxNQkJTVBQKCAyMiwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQorI2RlZmluZSBNUFAzNV9NSUkwX1JYRVJSCU1QUCggMzUsIDB4YywgMSwgMCwgMSwgICAxLCAgIDEsICAgMSwgICAxICkKIAotI2RlZmluZSBNUFAzNl9HUElPCQlNUFAoIDM2LCAweDAsIDEsIDEsIDEsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFAzNl9UU01QMAkJTVBQKCAzNiwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQMzZfVERNX1NQSV9DUzEJTVBQKCAzNiwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQMzZfQVVESU9fU1BESUZJCU1QUCggMzYsIDB4NCwgMSwgMCwgMSwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDM2X0dQSU8JCU1QUCggMzYsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzZfVFNNUDAJCU1QUCggMzYsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzZfVERNX1NQSV9DUzEJTVBQKCAzNiwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzNl9BVV9TUERJRkkJCU1QUCggMzYsIDB4NCwgMSwgMCwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzZfVFcxX1NEQQkJTVBQKCAzNiwgMHhiLCAxLCAxLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDM3X0dQSU8JCU1QUCggMzcsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDM3X1RTTVAxCQlNUFAoIDM3LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFAzN19URE1fQ0gyX1RYX1FMCU1QUCggMzcsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDM3X0FVRElPX1NQRElGTwlNUFAoIDM3LCAweDQsIDAsIDEsIDEsICAgMCwgICAwLCAgIDEgICAgKQorI2RlZmluZSBNUFAzN19HUElPCQlNUFAoIDM3LCAweDAsIDEsIDEsIDEsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDM3X1RTTVAxCQlNUFAoIDM3LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDM3X1RETV9DSDJfVFhfUUwJTVBQKCAzNywgMHgyLCAwLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzN19BVV9TUERJRk8JCU1QUCggMzcsIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzdfVFcxX1NDSwkJTVBQKCAzNywgMHhiLCAxLCAxLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDM4X0dQSU8JCU1QUCggMzgsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDM4X1RTTVAyCQlNUFAoIDM4LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFAzOF9URE1fQ0gyX1JYX1FMCU1QUCggMzgsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDM4X0FVRElPX1NQRElGUk1MQ0xLCU1QUCggMzgsIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDM4X0dQSU8JCU1QUCggMzgsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzhfVFNNUDIJCU1QUCggMzgsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzhfVERNX0NIMl9SWF9RTAlNUFAoIDM4LCAweDIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDM4X0FVX1NQRElGUk1MQ0xLCU1QUCggMzgsIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzhfTENEX0QxOAkJTVBQKCAzOCwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDM5X0dQSU8JCU1QUCggMzksIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDM5X1RTTVAzCQlNUFAoIDM5LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFAzOV9URE1fU1BJX0NTMAlNUFAoIDM5LCAweDIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFAzOV9BVURJT19JMlNCQ0xLCU1QUCggMzksIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDM5X0dQSU8JCU1QUCggMzksIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzlfVFNNUDMJCU1QUCggMzksIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzlfVERNX1NQSV9DUzAJTVBQKCAzOSwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAzOV9BVV9JMlNCQ0xLCU1QUCggMzksIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQMzlfTENEX0QxOQkJTVBQKCAzOSwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDQwX0dQSU8JCU1QUCggNDAsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQwX1RTTVA0CQlNUFAoIDQwLCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0MF9URE1fU1BJX1NDSwlNUFAoIDQwLCAweDIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0MF9BVURJT19JMlNETwlNUFAoIDQwLCAweDQsIDAsIDEsIDEsICAgMCwgICAwLCAgIDEgICAgKQorI2RlZmluZSBNUFA0MF9HUElPCQlNUFAoIDQwLCAweDAsIDEsIDEsIDEsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQwX1RTTVA0CQlNUFAoIDQwLCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQwX1RETV9TUElfU0NLCU1QUCggNDAsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDBfQVVfSTJTRE8JCU1QUCggNDAsIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDBfTENEX0QyMAkJTVBQKCA0MCwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDQxX0dQSU8JCU1QUCggNDEsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQxX1RTTVA1CQlNUFAoIDQxLCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0MV9URE1fU1BJX01JU08JTVBQKCA0MSwgMHgyLCAxLCAwLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDFfQVVESU9fSTJTTFJDCU1QUCggNDEsIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDQxX0dQSU8JCU1QUCggNDEsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDFfVFNNUDUJCU1QUCggNDEsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDFfVERNX1NQSV9NSVNPCU1QUCggNDEsIDB4MiwgMSwgMCwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDFfQVVfSTJTTFJDTEsJTVBQKCA0MSwgMHg0LCAwLCAxLCAxLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0MV9MQ0RfRDIxCQlNUFAoIDQxLCAweGIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCiAKLSNkZWZpbmUgTVBQNDJfR1BJTwkJTVBQKCA0MiwgMHgwLCAxLCAxLCAxLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDJfVFNNUDYJCU1QUCggNDIsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQyX1RETV9TUElfTU9TSQlNUFAoIDQyLCAweDIsIDAsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0Ml9BVURJT19JMlNNQ0xLCU1QUCggNDIsIDB4NCwgMCwgMSwgMSwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDQyX0dQSU8JCU1QUCggNDIsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDJfVFNNUDYJCU1QUCggNDIsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDJfVERNX1NQSV9NT1NJCU1QUCggNDIsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDJfQVVfSTJTTUNMSwlNUFAoIDQyLCAweDQsIDAsIDEsIDEsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQyX0xDRF9EMjIJCU1QUCggNDIsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFA0M19HUElPCQlNUFAoIDQzLCAweDAsIDEsIDEsIDEsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0M19UU01QNwkJTVBQKCA0MywgMHgxLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDNfVERNX0NPREVDX0lOVG4JTVBQKCA0MywgMHgyLCAwLCAwLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDNfQVVESU9fSTJTREkJTVBQKCA0MywgMHg0LCAxLCAwLCAxLCAgIDAsICAgMCwgICAxICAgICkKKyNkZWZpbmUgTVBQNDNfR1BJTwkJTVBQKCA0MywgMHgwLCAxLCAxLCAxLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0M19UU01QNwkJTVBQKCA0MywgMHgxLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0M19URE1fQ09ERUNfSU5UbglNUFAoIDQzLCAweDIsIDAsIDAsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQzX0FVX0kyU0RJCQlNUFAoIDQzLCAweDQsIDEsIDAsIDEsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQzX0xDRF9EMjMJCU1QUCggMjIsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFA0NF9HUElPCQlNUFAoIDQ0LCAweDAsIDEsIDEsIDEsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0NF9UU01QOAkJTVBQKCA0NCwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDRfVERNX0NPREVDX1JTVG4JTVBQKCA0NCwgMHgyLCAwLCAwLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDRfQVVESU9fRVhUQ0xLCU1QUCggNDQsIDB4NCwgMSwgMCwgMSwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDQ0X0dQSU8JCU1QUCggNDQsIDB4MCwgMSwgMSwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDRfVFNNUDgJCU1QUCggNDQsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDRfVERNX0NPREVDX1JTVG4JTVBQKCA0NCwgMHgyLCAwLCAwLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0NF9BVV9FWFRDTEsJCU1QUCggNDQsIDB4NCwgMSwgMCwgMSwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDRfTENEX0NMSwkJTVBQKCA0NCwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDQ1X0dQSU8JCU1QUCggNDUsIDB4MCwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQ1X1RTTVA5CQlNUFAoIDQ1LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0NV9URE1fUENMSwkJTVBQKCA0NSwgMHgyLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKKyNkZWZpbmUgTVBQNDVfR1BJTwkJTVBQKCA0NSwgMHgwLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0NV9UU01QOQkJTVBQKCA0NSwgMHgxLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0NV9URE1fUENMSwkJTVBQKCA0NSwgMHgyLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFAyNDVfTENEX0UJCU1QUCggNDUsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFA0Nl9HUElPCQlNUFAoIDQ2LCAweDAsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0Nl9UU01QMTAJCU1QUCggNDYsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQ2X1RETV9GUwkJTVBQKCA0NiwgMHgyLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKKyNkZWZpbmUgTVBQNDZfR1BJTwkJTVBQKCA0NiwgMHgwLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0Nl9UU01QMTAJCU1QUCggNDYsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDZfVERNX0ZTCQlNUFAoIDQ2LCAweDIsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQ2X0xDRF9IU1lOQwkJTVBQKCA0NiwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDQ3X0dQSU8JCU1QUCggNDcsIDB4MCwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQ3X1RTTVAxMQkJTVBQKCA0NywgMHgxLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxICAgICkKLSNkZWZpbmUgTVBQNDdfVERNX0RSWAkJTVBQKCA0NywgMHgyLCAxLCAwLCAwLCAgIDAsICAgMCwgICAxICAgICkKKyNkZWZpbmUgTVBQNDdfR1BJTwkJTVBQKCA0NywgMHgwLCAxLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0N19UU01QMTEJCU1QUCggNDcsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDdfVERNX0RSWAkJTVBQKCA0NywgMHgyLCAxLCAwLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0N19MQ0RfVlNZTkMJCU1QUCggNDcsIDB4YiwgMCwgMCwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKIAotI2RlZmluZSBNUFA0OF9HUElPCQlNUFAoIDQ4LCAweDAsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0OF9UU01QMTIJCU1QUCggNDgsIDB4MSwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQ4X1RETV9EVFgJCU1QUCggNDgsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDQ4X0dQSU8JCU1QUCggNDgsIDB4MCwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDhfVFNNUDEyCQlNUFAoIDQ4LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMSApCisjZGVmaW5lIE1QUDQ4X1RETV9EVFgJCU1QUCggNDgsIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAxICkKKyNkZWZpbmUgTVBQNDhfTENEX0QxNgkJTVBQKCAyMiwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCi0jZGVmaW5lIE1QUDQ5X0dQSU8JCU1QUCggNDksIDB4MCwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQ5X1RTTVA5CQlNUFAoIDQ5LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEgICAgKQotI2RlZmluZSBNUFA0OV9URE1fQ0gwX1JYX1FMCU1QUCggNDksIDB4MiwgMCwgMSwgMCwgICAwLCAgIDAsICAgMSAgICApCi0jZGVmaW5lIE1QUDQ5X1BUUF9DTEsJCU1QUCggNDksIDB4NSwgMSwgMCwgMCwgICAwLCAgIDAsICAgMSAgICApCisjZGVmaW5lIE1QUDQ5X0dQSU8JCU1QUCggNDksIDB4MCwgMSwgMSwgMCwgICAwLCAgIDAsICAgMSwgICAwICkKKyNkZWZpbmUgTVBQNDlfR1BPCQlNUFAoIDQ5LCAweDAsIDAsIDEsIDAsICAgMCwgICAwLCAgIDAsICAgMSApCisjZGVmaW5lIE1QUDQ5X1RTTVA5CQlNUFAoIDQ5LCAweDEsIDEsIDEsIDAsICAgMCwgICAwLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDQ5X1RETV9DSDBfUlhfUUwJTVBQKCA0OSwgMHgyLCAwLCAxLCAwLCAgIDAsICAgMCwgICAxLCAgIDEgKQorI2RlZmluZSBNUFA0OV9QVFBfQ0xLCQlNUFAoIDQ5LCAweDUsIDEsIDAsIDAsICAgMCwgICAwLCAgIDEsICAgMCApCisjZGVmaW5lIE1QUDQ5X1BFWDBfQ0xLUkVRCU1QUCggNDksIDB4YSwgMCwgMSwgMCwgICAwLCAgIDAsICAgMCwgICAxICkKKyNkZWZpbmUgTVBQNDlfTENEX0QxNwkJTVBQKCA0OSwgMHhiLCAwLCAwLCAwLCAgIDAsICAgMCwgICAwLCAgIDEgKQogCiAjZGVmaW5lIE1QUF9NQVgJCQk0OQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL212ODhmNjI4MWd0d19nZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tdjg4ZjYyODFndHdfZ2Utc2V0dXAuYwppbmRleCA1ZTZmNzExLi5jNmI5MmI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL212ODhmNjI4MWd0d19nZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXY4OGY2MjgxZ3R3X2dlLXNldHVwLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogc3RhdGljIGludCBfX2luaXQgbXY4OGY2MjgxZ3R3X2dlX3BjaV9pbml0KHZvaWQpCiB7CiAJaWYgKG1hY2hpbmVfaXNfbXY4OGY2MjgxZ3R3X2dlKCkpCi0JCWtpcmt3b29kX3BjaWVfaW5pdCgpOworCQlraXJrd29vZF9wY2llX2luaXQoS1dfUENJRTApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHNwYWNlX3YyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHNwYWNlX3YyLXNldHVwLmMKaW5kZXggM2FlMTU4ZC4uZDI2YmYzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXRzcGFjZV92Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbmV0c3BhY2VfdjItc2V0dXAuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8bWFjaC9raXJrd29vZC5oPgorI2luY2x1ZGUgPG1hY2gvbGVkcy1uczIuaD4KICNpbmNsdWRlIDxwbGF0L3RpbWUuaD4KICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJtcHAuaCIKQEAgLTEyNiw2ICsxMjcsMTggQEAKIAl9CiAJaWYgKGVycikKIAkJcHJfZXJyKCJuZXRzcGFjZV92MjogZmFpbGVkIHRvIHNldHVwIFNBVEEwIHBvd2VyXG4iKTsKKworCWlmIChtYWNoaW5lX2lzX25ldHNwYWNlX21heF92MigpKSB7CisJCWVyciA9IGdwaW9fcmVxdWVzdChORVRTUEFDRV9WMl9HUElPX1NBVEExX1BPV0VSLCAiU0FUQTEgcG93ZXIiKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoCisJCQkJCU5FVFNQQUNFX1YyX0dQSU9fU0FUQTFfUE9XRVIsIDEpOworCQkJaWYgKGVycikKKwkJCQlncGlvX2ZyZWUoTkVUU1BBQ0VfVjJfR1BJT19TQVRBMV9QT1dFUik7CisJCX0KKwkJaWYgKGVycikKKwkJCXByX2VycigibmV0c3BhY2VfdjI6IGZhaWxlZCB0byBzZXR1cCBTQVRBMSBwb3dlclxuIik7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2MCwzNiArMTczLDEyIEBACiAgKiBHUElPIExFRHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogVGhlIGJsdWUgZnJvbnQgTEVEIGlzIHdpcmVkIHRvIGEgQ1BMRCBhbmQgY2FuIGJsaW5rIGluIHJlbGF0aW9uIHdpdGggdGhlCi0gKiBTQVRBIGFjdGl2aXR5LgotICoKLSAqIFRoZSBmb2xsb3dpbmcgYXJyYXkgZGV0YWlsIHRoZSBkaWZmZXJlbnQgTEVEIHJlZ2lzdGVycyBhbmQgdGhlIGNvbWJpbmF0aW9uCi0gKiBvZiB0aGVpciBwb3NzaWJsZSB2YWx1ZXM6Ci0gKgotICogIGNtZF9sZWQgICB8ICBzbG93X2xlZCAgfCAvU0FUQSBhY3RpdmUgfCBMRUQgc3RhdGUKLSAqICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKLSAqICAgICAxICAgICAgfCAgICAgMCAgICAgIHwgICAgICB4ICAgICAgIHwgIG9mZgotICogICAgIC0gICAgICB8ICAgICAxICAgICAgfCAgICAgIHggICAgICAgfCAgb24KLSAqICAgICAwICAgICAgfCAgICAgMCAgICAgIHwgICAgICAxICAgICAgIHwgIG9uCi0gKiAgICAgMCAgICAgIHwgICAgIDAgICAgICB8ICAgICAgMCAgICAgICB8ICBibGluayAocmF0ZSAzMDBtcykKLSAqLwotCiAjZGVmaW5lIE5FVFNQQUNFX1YyX0dQSU9fUkVEX0xFRAkxMgotI2RlZmluZSBORVRTUEFDRV9WMl9HUElPX0JMVUVfTEVEX1NMT1cJMjkKLSNkZWZpbmUgTkVUU1BBQ0VfVjJfR1BJT19CTFVFX0xFRF9DTUQJMzAKLQogCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIG5ldHNwYWNlX3YyX2dwaW9fbGVkX3BpbnNbXSA9IHsKIAl7Ci0JCS5uYW1lCQkJPSAibnNfdjI6Ymx1ZTpzYXRhIiwKLQkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJkZWZhdWx0LW9uIiwKLQkJLmdwaW8JCQk9IE5FVFNQQUNFX1YyX0dQSU9fQkxVRV9MRURfQ01ELAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCX0sCi0JewotCQkubmFtZQkJCT0gIm5zX3YyOnJlZDpmYWlsIiwKLQkJLmdwaW8JCQk9IE5FVFNQQUNFX1YyX0dQSU9fUkVEX0xFRCwKKwkJLm5hbWUJPSAibnNfdjI6cmVkOmZhaWwiLAorCQkuZ3Bpbwk9IE5FVFNQQUNFX1YyX0dQSU9fUkVEX0xFRCwKIAl9LAogfTsKIApAQCAtMjA2LDIyICsxOTUsMzMgQEAKIAl9LAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG5ldHNwYWNlX3YyX2dwaW9fbGVkc19pbml0KHZvaWQpCi17Ci0JaW50IGVycjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRHVhbC1HUElPIENQTEQgTEVEcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkvKiBDb25maWd1cmUgcmVnaXN0ZXIgc2xvd19sZWQgdG8gYWxsb3cgU0FUQSBhY3Rpdml0eSBMRUQgYmxpbmtpbmcgKi8KLQllcnIgPSBncGlvX3JlcXVlc3QoTkVUU1BBQ0VfVjJfR1BJT19CTFVFX0xFRF9TTE9XLCAiYmx1ZSBMRUQgc2xvdyIpOwotCWlmIChlcnIgPT0gMCkgewotCQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoTkVUU1BBQ0VfVjJfR1BJT19CTFVFX0xFRF9TTE9XLCAwKTsKLQkJaWYgKGVycikKLQkJCWdwaW9fZnJlZShORVRTUEFDRV9WMl9HUElPX0JMVUVfTEVEX1NMT1cpOwotCX0KLQlpZiAoZXJyKQotCQlwcl9lcnIoIm5ldHNwYWNlX3YyOiBmYWlsZWQgdG8gY29uZmlndXJlIGJsdWUgTEVEIHNsb3cgR1BJT1xuIik7CisjZGVmaW5lIE5FVFNQQUNFX1YyX0dQSU9fQkxVRV9MRURfU0xPVwkyOQorI2RlZmluZSBORVRTUEFDRV9WMl9HUElPX0JMVUVfTEVEX0NNRAkzMAogCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZuZXRzcGFjZV92Ml9ncGlvX2xlZHMpOwotfQorc3RhdGljIHN0cnVjdCBuczJfbGVkIG5ldHNwYWNlX3YyX2xlZF9waW5zW10gPSB7CisJeworCQkubmFtZQk9ICJuc192MjpibHVlOnNhdGEiLAorCQkuY21kCT0gTkVUU1BBQ0VfVjJfR1BJT19CTFVFX0xFRF9DTUQsCisJCS5zbG93CT0gTkVUU1BBQ0VfVjJfR1BJT19CTFVFX0xFRF9TTE9XLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG5zMl9sZWRfcGxhdGZvcm1fZGF0YSBuZXRzcGFjZV92Ml9sZWRzX2RhdGEgPSB7CisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShuZXRzcGFjZV92Ml9sZWRfcGlucyksCisJLmxlZHMJCT0gbmV0c3BhY2VfdjJfbGVkX3BpbnMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuZXRzcGFjZV92Ml9sZWRzID0geworCS5uYW1lCQk9ICJsZWRzLW5zMiIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZuZXRzcGFjZV92Ml9sZWRzX2RhdGEsCisJfSwKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGltZXIKQEAgLTI0OSwxNyArMjQ5LDIxIEBACiAJTVBQNF9ORl9JTzYsCiAJTVBQNV9ORl9JTzcsCiAJTVBQNl9TWVNSU1RfT1VUbiwKLQlNUFA4X1RXX1NEQSwKLQlNUFA5X1RXX1NDSywKKwlNUFA3X0dQTywJCS8qIEZhbiBzcGVlZCAoYml0IDEpICovCisJTVBQOF9UVzBfU0RBLAorCU1QUDlfVFcwX1NDSywKIAlNUFAxMF9VQVJUMF9UWEQsCiAJTVBQMTFfVUFSVDBfUlhELAogCU1QUDEyX0dQTywJCS8qIFJlZCBsZWQgKi8KIAlNUFAxNF9HUElPLAkJLyogVVNCIGZ1c2UgKi8KIAlNUFAxNl9HUElPLAkJLyogU0FUQSAwIHBvd2VyICovCisJTVBQMTdfR1BJTywJCS8qIFNBVEEgMSBwb3dlciAqLwogCU1QUDE4X05GX0lPMCwKIAlNUFAxOV9ORl9JTzEsCiAJTVBQMjBfU0FUQTFfQUNUbiwKIAlNUFAyMV9TQVRBMF9BQ1RuLAorCU1QUDIyX0dQSU8sCQkvKiBGYW4gc3BlZWQgKGJpdCAwKSAqLworCU1QUDIzX0dQSU8sCQkvKiBGYW4gcG93ZXIgKi8KIAlNUFAyNF9HUElPLAkJLyogVVNCIG1vZGUgc2VsZWN0ICovCiAJTVBQMjVfR1BJTywJCS8qIEZhbiByb3RhdGlvbiBmYWlsICovCiAJTVBQMjZfR1BJTywJCS8qIFVTQiBkZXZpY2UgdmJ1cyAqLwpAQCAtMjY4LDYgKzI3Miw3IEBACiAJTVBQMzBfR1BJTywJCS8qIEJsdWUgbGVkIChjb21tYW5kIHJlZ2lzdGVyKSAqLwogCU1QUDMxX0dQSU8sCQkvKiBCb2FyZCBwb3dlciBvZmYgKi8KIAlNUFAzMl9HUElPLCAJCS8qIFBvd2VyIGJ1dHRvbiAoMCA9IFJlbGVhc2VkLCAxID0gUHVzaGVkKSAqLworCU1QUDMzX0dQTywJCS8qIEZhbiBzcGVlZCAoYml0IDIpICovCiAJMAogfTsKIApAQCAtMjk5LDcgKzMwNCw4IEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbmV0c3BhY2VfdjJfaTJjX2luZm8sCiAJCQkJQVJSQVlfU0laRShuZXRzcGFjZV92Ml9pMmNfaW5mbykpOwogCi0JbmV0c3BhY2VfdjJfZ3Bpb19sZWRzX2luaXQoKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm5ldHNwYWNlX3YyX2xlZHMpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbmV0c3BhY2VfdjJfZ3Bpb19sZWRzKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm5ldHNwYWNlX3YyX2dwaW9fYnV0dG9ucyk7CiAKIAlpZiAoZ3Bpb19yZXF1ZXN0KE5FVFNQQUNFX1YyX0dQSU9fUE9XRVJfT0ZGLCAicG93ZXItb2ZmIikgPT0gMCAmJgpAQCAtMzMyLDMgKzMzOCwxNSBAQAogCS50aW1lcgkJPSAmbmV0c3BhY2VfdjJfdGltZXIsCiBNQUNISU5FX0VORAogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9ORVRTUEFDRV9NQVhfVjIKK01BQ0hJTkVfU1RBUlQoTkVUU1BBQ0VfTUFYX1YyLCAiTGFDaWUgTmV0d29yayBTcGFjZSBNYXggdjIiKQorCS5waHlzX2lvCT0gS0lSS1dPT0RfUkVHU19QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChLSVJLV09PRF9SRUdTX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmluaXRfbWFjaGluZQk9IG5ldHNwYWNlX3YyX2luaXQsCisJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCisJLmluaXRfaXJxCT0ga2lya3dvb2RfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZuZXRzcGFjZV92Ml90aW1lciwKK01BQ0hJTkVfRU5ECisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbmV0eGJpZ192Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMKaW5kZXggOGEyYmIwMi4uMmJkMTRjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMKQEAgLTI3MCw4ICsyNzAsOCBAQAogCU1QUDNfU1BJX01JU08sCiAJTVBQNl9TWVNSU1RfT1VUbiwKIAlNUFA3X0dQTywJCS8qIFJlcXVlc3QgcG93ZXItb2ZmICovCi0JTVBQOF9UV19TREEsCi0JTVBQOV9UV19TQ0ssCisJTVBQOF9UVzBfU0RBLAorCU1QUDlfVFcwX1NDSywKIAlNUFAxMF9VQVJUMF9UWEQsCiAJTVBQMTFfVUFSVDBfUlhELAogCU1QUDEzX0dQSU8sCQkvKiBSZWFyIHBvd2VyIHN3aXRjaCAob258YXV0bykgKi8KQEAgLTMwNiw4ICszMDYsOCBAQAogCU1QUDNfU1BJX01JU08sCiAJTVBQNl9TWVNSU1RfT1VUbiwKIAlNUFA3X0dQTywJCS8qIFJlcXVlc3QgcG93ZXItb2ZmICovCi0JTVBQOF9UV19TREEsCi0JTVBQOV9UV19TQ0ssCisJTVBQOF9UVzBfU0RBLAorCU1QUDlfVFcwX1NDSywKIAlNUFAxMF9VQVJUMF9UWEQsCiAJTVBQMTFfVUFSVDBfUlhELAogCU1QUDEzX0dQSU8sCQkvKiBSZWFyIHBvd2VyIHN3aXRjaCAob258YXV0bykgKi8KQEAgLTMxNSwyMCArMzE1LDIwIEBACiAJTVBQMTVfR1BJTywJCS8qIFJlYXIgcG93ZXIgc3dpdGNoIChhdXRvfG9mZikgKi8KIAlNUFAxNl9HUElPLAkJLyogU0FUQSBIREQxIHBvd2VyICovCiAJTVBQMTdfR1BJTywJCS8qIFNBVEEgSEREMiBwb3dlciAqLwotCU1QUDIwX0dFMV8wLAotCU1QUDIxX0dFMV8xLAotCU1QUDIyX0dFMV8yLAotCU1QUDIzX0dFMV8zLAotCU1QUDI0X0dFMV80LAotCU1QUDI1X0dFMV81LAotCU1QUDI2X0dFMV82LAotCU1QUDI3X0dFMV83LAorCU1QUDIwX0dFMV9UWEQwLAorCU1QUDIxX0dFMV9UWEQxLAorCU1QUDIyX0dFMV9UWEQyLAorCU1QUDIzX0dFMV9UWEQzLAorCU1QUDI0X0dFMV9SWEQwLAorCU1QUDI1X0dFMV9SWEQxLAorCU1QUDI2X0dFMV9SWEQyLAorCU1QUDI3X0dFMV9SWEQzLAogCU1QUDI4X0dQSU8sCQkvKiBVU0IgZW5hYmxlIGhvc3QgdmJ1cyAqLwogCU1QUDI5X0dQSU8sCQkvKiBDUExEIGV4dGVuc2lvbiBBTEUgKi8KLQlNUFAzMF9HRTFfMTAsCi0JTVBQMzFfR0UxXzExLAotCU1QUDMyX0dFMV8xMiwKLQlNUFAzM19HRTFfMTMsCisJTVBQMzBfR0UxX1JYQ1RMLAorCU1QUDMxX0dFMV9SWENMSywKKwlNUFAzMl9HRTFfVENMS09VVCwKKwlNUFAzM19HRTFfVFhDVEwsCiAJTVBQMzRfR1BJTywJCS8qIFJlYXIgUHVzaCBidXR0b24gKi8KIAlNUFAzNV9HUElPLAkJLyogSW5oaWJpdCBzd2l0Y2ggcG93ZXItb2ZmICovCiAJTVBQMzZfR1BJTywJCS8qIFNBVEEgSEREMSBwcmVzZW5jZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9vcGVucmQtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMKaW5kZXggYWQzZjFlYy4uZmQ2NGNkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9vcGVucmQtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL29wZW5yZC1zZXR1cC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGFyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMKICAqCi0gKiBNYXJ2ZWxsIE9wZW5SRCAoQmFzZXxDbGllbnQpIEJvYXJkIFNldHVwCisgKiBNYXJ2ZWxsIE9wZW5SRCAoQmFzZXxDbGllbnR8VWx0aW1hdGUpIEJvYXJkIFNldHVwCiAgKgogICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CkBAIC03Myw5ICs3MywxNSBAQAogCiAJa2lya3dvb2RfZWhjaV9pbml0KCk7CiAKKwlpZiAobWFjaGluZV9pc19vcGVucmRfdWx0aW1hdGUoKSkgeworCQlvcGVucmRfZ2UwMF9kYXRhLnBoeV9hZGRyID0gTVY2NDNYWF9FVEhfUEhZX0FERFIoMCk7CisJCW9wZW5yZF9nZTAxX2RhdGEucGh5X2FkZHIgPSBNVjY0M1hYX0VUSF9QSFlfQUREUigxKTsKKwl9CisKIAlraXJrd29vZF9nZTAwX2luaXQoJm9wZW5yZF9nZTAwX2RhdGEpOwotCWlmIChtYWNoaW5lX2lzX29wZW5yZF9jbGllbnQoKSkKKwlpZiAoIW1hY2hpbmVfaXNfb3BlbnJkX2Jhc2UoKSkKIAkJa2lya3dvb2RfZ2UwMV9pbml0KCZvcGVucmRfZ2UwMV9kYXRhKTsKKwogCWtpcmt3b29kX3NhdGFfaW5pdCgmb3BlbnJkX3NhdGFfZGF0YSk7CiAJa2lya3dvb2Rfc2Rpb19pbml0KCZvcGVucmRfbXZzZGlvX2RhdGEpOwogCkBAIC04NCw4ICs5MCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBvcGVucmRfcGNpX2luaXQodm9pZCkKIHsKLQlpZiAobWFjaGluZV9pc19vcGVucmRfYmFzZSgpIHx8IG1hY2hpbmVfaXNfb3BlbnJkX2NsaWVudCgpKQotCQlraXJrd29vZF9wY2llX2luaXQoKTsKKwlpZiAobWFjaGluZV9pc19vcGVucmRfYmFzZSgpIHx8CisJICAgIG1hY2hpbmVfaXNfb3BlbnJkX2NsaWVudCgpIHx8CisJICAgIG1hY2hpbmVfaXNfb3BlbnJkX3VsdGltYXRlKCkpCisJCWtpcmt3b29kX3BjaWVfaW5pdChLV19QQ0lFMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNiwzICsxMjQsMTYgQEAKIAkudGltZXIJCT0gJmtpcmt3b29kX3RpbWVyLAogTUFDSElORV9FTkQKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfT1BFTlJEX1VMVElNQVRFCitNQUNISU5FX1NUQVJUKE9QRU5SRF9VTFRJTUFURSwgIk1hcnZlbGwgT3BlblJEIFVsdGltYXRlIEJvYXJkIikKKwkvKiBNYWludGFpbmVyOiBEaGF2YWwgVmFzYSA8ZGhhdmFsLnZhc2FAZWluZm9jaGlwcy5jb20+ICovCisJLnBoeXNfaW8JPSBLSVJLV09PRF9SRUdTX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKEtJUktXT09EX1JFR1NfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gb3BlbnJkX2luaXQsCisJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCisJLmluaXRfaXJxCT0ga2lya3dvb2RfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZraXJrd29vZF90aW1lciwKK01BQ0hJTkVfRU5ECisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKaW5kZXggZGVlMWVmZi4uNTVlN2YwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKQEAgLTE4LDI5ICsxOCw0MyBAQAogI2luY2x1ZGUgPG1hY2gvYnJpZGdlLXJlZ3MuaD4KICNpbmNsdWRlICJjb21tb24uaCIKIAotCi0jZGVmaW5lIFBDSUVfQkFTRQkoKHZvaWQgX19pb21lbSAqKVBDSUVfVklSVF9CQVNFKQotCiB2b2lkIF9faW5pdCBraXJrd29vZF9wY2llX2lkKHUzMiAqZGV2LCB1MzIgKnJldikKIHsKLQkqZGV2ID0gb3Jpb25fcGNpZV9kZXZfaWQoUENJRV9CQVNFKTsKLQkqcmV2ID0gb3Jpb25fcGNpZV9yZXYoUENJRV9CQVNFKTsKKwkqZGV2ID0gb3Jpb25fcGNpZV9kZXZfaWQoKHZvaWQgX19pb21lbSAqKVBDSUVfVklSVF9CQVNFKTsKKwkqcmV2ID0gb3Jpb25fcGNpZV9yZXYoKHZvaWQgX19pb21lbSAqKVBDSUVfVklSVF9CQVNFKTsKIH0KIAotc3RhdGljIGludCBwY2llX3ZhbGlkX2NvbmZpZyhpbnQgYnVzLCBpbnQgZGV2KQorc3RydWN0IHBjaWVfcG9ydCB7CisJdTgJCQlyb290X2J1c19ucjsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXNwaW5sb2NrX3QJCWNvbmZfbG9jazsKKwlpbnQJCQlpcnE7CisJc3RydWN0IHJlc291cmNlCQlyZXNbMl07Cit9OworCitzdGF0aWMgaW50IHBjaWVfcG9ydF9tYXBbMl07CitzdGF0aWMgaW50IG51bV9wY2llX3BvcnRzOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2llX3BvcnQgKmJ1c190b19wb3J0KHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzID0gYnVzLT5zeXNkYXRhOworCXJldHVybiBzeXMtPnByaXZhdGVfZGF0YTsKK30KKworc3RhdGljIGludCBwY2llX3ZhbGlkX2NvbmZpZyhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgaW50IGJ1cywgaW50IGRldikKIHsKIAkvKgogCSAqIERvbid0IGdvIG91dCB3aGVuIHRyeWluZyB0byBhY2Nlc3MgLS0KIAkgKiAxLiBub25leGlzdGluZyBkZXZpY2Ugb24gbG9jYWwgYnVzCiAJICogMi4gd2hlcmUgdGhlcmUncyBubyBkZXZpY2UgY29ubmVjdGVkIChubyBsaW5rKQogCSAqLwotCWlmIChidXMgPT0gMCAmJiBkZXYgPT0gMCkKKwlpZiAoYnVzID09IHBwLT5yb290X2J1c19uciAmJiBkZXYgPT0gMCkKIAkJcmV0dXJuIDE7CiAKLQlpZiAoIW9yaW9uX3BjaWVfbGlua191cChQQ0lFX0JBU0UpKQorCWlmICghb3Jpb25fcGNpZV9saW5rX3VwKHBwLT5iYXNlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYnVzID09IDAgJiYgZGV2ICE9IDEpCisJaWYgKGJ1cyA9PSBwcC0+cm9vdF9idXNfbnIgJiYgZGV2ICE9IDEpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CkBAIC01MiwyMiArNjYsMjIgQEAKICAqIGFuZCB0aGVuIHJlYWRpbmcgdGhlIFBDSUVfQ09ORl9EQVRBIHJlZ2lzdGVyLiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGVzZQogICogdHJhbnNhY3Rpb25zIGFyZSBhdG9taWMuCiAgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2lya3dvb2RfcGNpZV9sb2NrKTsKIAogc3RhdGljIGludCBwY2llX3JkX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRldmZuLCBpbnQgd2hlcmUsCiAJCQlpbnQgc2l6ZSwgdTMyICp2YWwpCiB7CisJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBidXNfdG9fcG9ydChidXMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCWlmIChwY2llX3ZhbGlkX2NvbmZpZyhidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pKSA9PSAwKSB7CisJaWYgKHBjaWVfdmFsaWRfY29uZmlnKHBwLCBidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pKSA9PSAwKSB7CiAJCSp2YWwgPSAweGZmZmZmZmZmOwogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZraXJrd29vZF9wY2llX2xvY2ssIGZsYWdzKTsKLQlyZXQgPSBvcmlvbl9wY2llX3JkX2NvbmYoUENJRV9CQVNFLCBidXMsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZraXJrd29vZF9wY2llX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHAtPmNvbmZfbG9jaywgZmxhZ3MpOworCXJldCA9IG9yaW9uX3BjaWVfcmRfY29uZihwcC0+YmFzZSwgYnVzLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHAtPmNvbmZfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc1LDE1ICs4OSwxNiBAQAogc3RhdGljIGludCBwY2llX3dyX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRldmZuLAogCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKIHsKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGJ1c190b19wb3J0KGJ1cyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JaWYgKHBjaWVfdmFsaWRfY29uZmlnKGJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXZmbikpID09IDApCisJaWYgKHBjaWVfdmFsaWRfY29uZmlnKHBwLCBidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtpcmt3b29kX3BjaWVfbG9jaywgZmxhZ3MpOwotCXJldCA9IG9yaW9uX3BjaWVfd3JfY29uZihQQ0lFX0JBU0UsIGJ1cywgZGV2Zm4sIHdoZXJlLCBzaXplLCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtpcmt3b29kX3BjaWVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcC0+Y29uZl9sb2NrLCBmbGFncyk7CisJcmV0ID0gb3Jpb25fcGNpZV93cl9jb25mKHBwLT5iYXNlLCBidXMsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcC0+Y29uZl9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTMsNTAgKzEwOCw5OCBAQAogCS53cml0ZSA9IHBjaWVfd3JfY29uZiwKIH07CiAKLQotc3RhdGljIGludCBfX2luaXQga2lya3dvb2RfcGNpZV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2llMF9pb3Jlc291cmNlc19pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQogewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWV4dGVybiB1bnNpZ25lZCBpbnQga2lya3dvb2RfY2xrX2N0cmw7Ci0KLQkvKgotCSAqIEdlbmVyaWMgUENJZSB1bml0IHNldHVwLgotCSAqLwotCW9yaW9uX3BjaWVfc2V0dXAoUENJRV9CQVNFLCAma2lya3dvb2RfbWJ1c19kcmFtX2luZm8pOwotCi0JLyoKLQkgKiBSZXF1ZXN0IHJlc291cmNlcy4KLQkgKi8KLQlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogMiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXMpCi0JCXBhbmljKCJwY2llX3NldHVwIHVuYWJsZSB0byBhbGxvYyByZXNvdXJjZXMiKTsKKwlwcC0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKilQQ0lFX1ZJUlRfQkFTRTsKKwlwcC0+aXJxCT0gSVJRX0tJUktXT09EX1BDSUU7CiAKIAkvKgogCSAqIElPUkVTT1VSQ0VfSU8KIAkgKi8KLQlyZXNbMF0ubmFtZSA9ICJQQ0llIEkvTyBTcGFjZSI7Ci0JcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKLQlyZXNbMF0uc3RhcnQgPSBLSVJLV09PRF9QQ0lFX0lPX0JVU19CQVNFOwotCXJlc1swXS5lbmQgPSByZXNbMF0uc3RhcnQgKyBLSVJLV09PRF9QQ0lFX0lPX1NJWkUgLSAxOwotCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXNbMF0pKQotCQlwYW5pYygiUmVxdWVzdCBQQ0llIElPIHJlc291cmNlIGZhaWxlZFxuIik7Ci0Jc3lzLT5yZXNvdXJjZVswXSA9ICZyZXNbMF07CisJcHAtPnJlc1swXS5uYW1lID0gIlBDSWUgMCBJL08gU3BhY2UiOworCXBwLT5yZXNbMF0uc3RhcnQgPSBLSVJLV09PRF9QQ0lFX0lPX1BIWVNfQkFTRTsKKwlwcC0+cmVzWzBdLmVuZCA9IHBwLT5yZXNbMF0uc3RhcnQgKyBLSVJLV09PRF9QQ0lFX0lPX1NJWkUgLSAxOworCXBwLT5yZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwogCiAJLyoKIAkgKiBJT1JFU09VUkNFX01FTQogCSAqLwotCXJlc1sxXS5uYW1lID0gIlBDSWUgTWVtb3J5IFNwYWNlIjsKLQlyZXNbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQlyZXNbMV0uc3RhcnQgPSBLSVJLV09PRF9QQ0lFX01FTV9CVVNfQkFTRTsKLQlyZXNbMV0uZW5kID0gcmVzWzFdLnN0YXJ0ICsgS0lSS1dPT0RfUENJRV9NRU1fU0laRSAtIDE7Ci0JaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcmVzWzFdKSkKLQkJcGFuaWMoIlJlcXVlc3QgUENJZSBNZW1vcnkgcmVzb3VyY2UgZmFpbGVkXG4iKTsKLQlzeXMtPnJlc291cmNlWzFdID0gJnJlc1sxXTsKKwlwcC0+cmVzWzFdLm5hbWUgPSAiUENJZSAwIE1FTSI7CisJcHAtPnJlc1sxXS5zdGFydCA9IEtJUktXT09EX1BDSUVfTUVNX1BIWVNfQkFTRTsKKwlwcC0+cmVzWzFdLmVuZCA9IHBwLT5yZXNbMV0uc3RhcnQgKyBLSVJLV09PRF9QQ0lFX01FTV9TSVpFIC0gMTsKKwlwcC0+cmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Cit9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2llMV9pb3Jlc291cmNlc19pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQoreworCXBwLT5iYXNlID0gKHZvaWQgX19pb21lbSAqKVBDSUUxX1ZJUlRfQkFTRTsKKwlwcC0+aXJxCT0gSVJRX0tJUktXT09EX1BDSUUxOworCisJLyoKKwkgKiBJT1JFU09VUkNFX0lPCisJICovCisJcHAtPnJlc1swXS5uYW1lID0gIlBDSWUgMSBJL08gU3BhY2UiOworCXBwLT5yZXNbMF0uc3RhcnQgPSBLSVJLV09PRF9QQ0lFMV9JT19QSFlTX0JBU0U7CisJcHAtPnJlc1swXS5lbmQgPSBwcC0+cmVzWzBdLnN0YXJ0ICsgS0lSS1dPT0RfUENJRTFfSU9fU0laRSAtIDE7CisJcHAtPnJlc1swXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisKKwkvKgorCSAqIElPUkVTT1VSQ0VfTUVNCisJICovCisJcHAtPnJlc1sxXS5uYW1lID0gIlBDSWUgMSBNRU0iOworCXBwLT5yZXNbMV0uc3RhcnQgPSBLSVJLV09PRF9QQ0lFMV9NRU1fUEhZU19CQVNFOworCXBwLT5yZXNbMV0uZW5kID0gcHAtPnJlc1sxXS5zdGFydCArIEtJUktXT09EX1BDSUUxX01FTV9TSVpFIC0gMTsKKwlwcC0+cmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGtpcmt3b29kX3BjaWVfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGludCBraXJrd29vZF9jbGtfY3RybDsKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcDsKKwlpbnQgaW5kZXg7CisKKwlpZiAobnIgPj0gbnVtX3BjaWVfcG9ydHMpCisJCXJldHVybiAwOworCisJaW5kZXggPSBwY2llX3BvcnRfbWFwW25yXTsKKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IGJ1cyVkIHVzZXMgUENJZSBwb3J0ICVkXG4iLCBzeXMtPmJ1c25yLCBpbmRleCk7CisKKwlwcCA9IGt6YWxsb2Moc2l6ZW9mKCpwcCksIEdGUF9LRVJORUwpOworCWlmICghcHApCisJCXBhbmljKCJQQ0llOiBmYWlsZWQgdG8gYWxsb2NhdGUgcGNpZV9wb3J0IGRhdGEiKTsKKwlzeXMtPnByaXZhdGVfZGF0YSA9IHBwOworCXBwLT5yb290X2J1c19uciA9IHN5cy0+YnVzbnI7CisJc3Bpbl9sb2NrX2luaXQoJnBwLT5jb25mX2xvY2spOworCisJc3dpdGNoIChpbmRleCkgeworCWNhc2UgMDoKKwkJa2lya3dvb2RfY2xrX2N0cmwgfD0gQ0dDX1BFWDA7CisJCXBjaWUwX2lvcmVzb3VyY2VzX2luaXQocHApOworCQlicmVhazsKKwljYXNlIDE6CisJCWtpcmt3b29kX2Nsa19jdHJsIHw9IENHQ19QRVgxOworCQlwY2llMV9pb3Jlc291cmNlc19pbml0KHBwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoIlBDSWUgc2V0dXA6IGludmFsaWQgY29udHJvbGxlciAlZCIsIGluZGV4KTsKKwl9CisKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcHAtPnJlc1swXSkpCisJCXBhbmljKCJSZXF1ZXN0IFBDSWUlZCBJTyByZXNvdXJjZSBmYWlsZWRcbiIsIGluZGV4KTsKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZwcC0+cmVzWzFdKSkKKwkJcGFuaWMoIlJlcXVlc3QgUENJZSVkIE1lbW9yeSByZXNvdXJjZSBmYWlsZWRcbiIsIGluZGV4KTsKKworCXN5cy0+cmVzb3VyY2VbMF0gPSAmcHAtPnJlc1swXTsKKwlzeXMtPnJlc291cmNlWzFdID0gJnBwLT5yZXNbMV07CiAJc3lzLT5yZXNvdXJjZVsyXSA9IE5VTEw7CiAJc3lzLT5pb19vZmZzZXQgPSAwOwogCi0Ja2lya3dvb2RfY2xrX2N0cmwgfD0gQ0dDX1BFWDA7CisJLyoKKwkgKiBHZW5lcmljIFBDSWUgdW5pdCBzZXR1cC4KKwkgKi8KKwlvcmlvbl9wY2llX3NldF9sb2NhbF9idXNfbnIocHAtPmJhc2UsIHN5cy0+YnVzbnIpOworCisJb3Jpb25fcGNpZV9zZXR1cChwcC0+YmFzZSwgJmtpcmt3b29kX21idXNfZHJhbV9pbmZvKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTYzLDcgKzIyNiw3IEBACiB7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKIAotCWlmIChuciA9PSAwKSB7CisJaWYgKG5yIDwgbnVtX3BjaWVfcG9ydHMpIHsKIAkJYnVzID0gcGNpX3NjYW5fYnVzKHN5cy0+YnVzbnIsICZwY2llX29wcywgc3lzKTsKIAl9IGVsc2UgewogCQlidXMgPSBOVUxMOwpAQCAtMTc1LDE4ICsyMzgsMzcgQEAKIAogc3RhdGljIGludCBfX2luaXQga2lya3dvb2RfcGNpZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLQlyZXR1cm4gSVJRX0tJUktXT09EX1BDSUU7CisJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBidXNfdG9fcG9ydChkZXYtPmJ1cyk7CisKKwlyZXR1cm4gcHAtPmlycTsKIH0KIAogc3RhdGljIHN0cnVjdCBod19wY2kga2lya3dvb2RfcGNpIF9faW5pdGRhdGEgPSB7Ci0JLm5yX2NvbnRyb2xsZXJzCT0gMSwKIAkuc3dpenpsZQk9IHBjaV9zdGRfc3dpenpsZSwKIAkuc2V0dXAJCT0ga2lya3dvb2RfcGNpZV9zZXR1cCwKIAkuc2NhbgkJPSBraXJrd29vZF9wY2llX3NjYW5fYnVzLAogCS5tYXBfaXJxCT0ga2lya3dvb2RfcGNpZV9tYXBfaXJxLAogfTsKIAotdm9pZCBfX2luaXQga2lya3dvb2RfcGNpZV9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYWRkX3BjaWVfcG9ydChpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgYmFzZSkKIHsKKwlwcmludGsoS0VSTl9JTkZPICJLaXJrd29vZCBQQ0llIHBvcnQgJWQ6ICIsIGluZGV4KTsKKworCWlmIChvcmlvbl9wY2llX2xpbmtfdXAoKHZvaWQgX19pb21lbSAqKWJhc2UpKSB7CisJCXByaW50ayhLRVJOX0lORk8gImxpbmsgdXBcbiIpOworCQlwY2llX3BvcnRfbWFwW251bV9wY2llX3BvcnRzKytdID0gaW5kZXg7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gImxpbmsgZG93biwgaWdub3JpbmdcbiIpOworfQorCit2b2lkIF9faW5pdCBraXJrd29vZF9wY2llX2luaXQodW5zaWduZWQgaW50IHBvcnRtYXNrKQoreworCWlmIChwb3J0bWFzayAmIEtXX1BDSUUwKQorCQlhZGRfcGNpZV9wb3J0KDAsIFBDSUVfVklSVF9CQVNFKTsKKworCWlmIChwb3J0bWFzayAmIEtXX1BDSUUxKQorCQlhZGRfcGNpZV9wb3J0KDEsIFBDSUUxX1ZJUlRfQkFTRSk7CisKKwlraXJrd29vZF9wY2kubnJfY29udHJvbGxlcnMgPSBudW1fcGNpZV9wb3J0czsKIAlwY2lfY29tbW9uX2luaXQoJmtpcmt3b29kX3BjaSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjE5Mi1uYXMtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MTkyLW5hcy1zZXR1cC5jCmluZGV4IDNiZjYzMDQuLmMzNDcxOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MTkyLW5hcy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MTkyLW5hcy1zZXR1cC5jCkBAIC03MSw3ICs3MSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCByZDg4ZjYxOTJfcGNpX2luaXQodm9pZCkKIHsKIAlpZiAobWFjaGluZV9pc19yZDg4ZjYxOTJfbmFzKCkpCi0JCWtpcmt3b29kX3BjaWVfaW5pdCgpOworCQlraXJrd29vZF9wY2llX2luaXQoS1dfUENJRTApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjI4MS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYwppbmRleCAzMTcwOGRkLi4zZDE0NzcxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjI4MS1zZXR1cC5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHJkODhmNjI4MV9wY2lfaW5pdCh2b2lkKQogewogCWlmIChtYWNoaW5lX2lzX3JkODhmNjI4MSgpKQotCQlraXJrd29vZF9wY2llX2luaXQoKTsKKwkJa2lya3dvb2RfcGNpZV9pbml0KEtXX1BDSUUwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90NTMyNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90NTMyNS1zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWJmODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3Q1MzI1LXNldHVwLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKgorICogSFAgdDUzMjUgVGhpbiBDbGllbnQgc2V0dXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgIE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvb3Jpb25fc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXY2NDN4eF9ldGguaD4KKyNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxtYWNoL2tpcmt3b29kLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAibXBwLmgiCisKK3N0cnVjdCBtdGRfcGFydGl0aW9uIGhwX3Q1MzI1X3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJ1LWJvb3QgZW52IiwKKwkJLnNpemUJCT0gU1pfNjRLLAorCQkub2Zmc2V0CQk9IFNaXzUxMksgKyBTWl8yNTZLLAorCX0sCisJeworCQkubmFtZQkJPSAicGVybWFuZW50IHUtYm9vdCBlbnYiLAorCQkuc2l6ZQkJPSBTWl82NEssCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJIUCBlbnYiLAorCQkuc2l6ZQkJPSBTWl82NEssCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sCisJeworCQkubmFtZQkJPSAidS1ib290IiwKKwkJLnNpemUJCT0gU1pfNTEySywKKwkJLm9mZnNldAkJPSAwLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJTU0QgZmlybXdhcmUiLAorCQkuc2l6ZQkJPSBTWl8yNTZLLAorCQkub2Zmc2V0CQk9IFNaXzUxMkssCisJfSwKK307CisKK2NvbnN0IHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGhwX3Q1MzI1X2ZsYXNoID0geworCS50eXBlCQk9ICJteDI1bDgwMDUiLAorCS5uYW1lCQk9ICJzcGlfZmxhc2giLAorCS5wYXJ0cwkJPSBocF90NTMyNV9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoaHBfdDUzMjVfcGFydGl0aW9ucyksCit9OworCitzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gX19pbml0ZGF0YSBocF90NTMyNV9zcGlfc2xhdmVfaW5mb1tdID0geworCXsKKwkJLm1vZGFsaWFzCT0gIm0yNXA4MCIsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmhwX3Q1MzI1X2ZsYXNoLAorCQkuaXJxCQk9IC0xLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgaHBfdDUzMjVfZ2UwMF9kYXRhID0geworCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAorfTsKKworc3RhdGljIHN0cnVjdCBtdl9zYXRhX3BsYXRmb3JtX2RhdGEgaHBfdDUzMjVfc2F0YV9kYXRhID0geworCS5uX3BvcnRzCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBocF90NTMyNV9idXR0b25zW10gPSB7CisJeworCQkuY29kZQkJPSBLRVlfUE9XRVIsCisJCS5ncGlvCQk9IDQ1LAorCQkuZGVzYwkJPSAiUG93ZXIiLAorCQkuYWN0aXZlX2xvdwk9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgaHBfdDUzMjVfYnV0dG9uX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBocF90NTMyNV9idXR0b25zLAorCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUoaHBfdDUzMjVfYnV0dG9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBocF90NTMyNV9idXR0b25fZGV2aWNlID0geworCS5uYW1lCQk9ICJncGlvLWtleXMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmhwX3Q1MzI1X2J1dHRvbl9kYXRhLAorCX0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHBfdDUzMjVfbXBwX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJTVBQMF9ORl9JTzIsCisJTVBQMV9TUElfTU9TSSwKKwlNUFAyX1NQSV9TQ0ssCisJTVBQM19TUElfTUlTTywKKwlNUFA0X05GX0lPNiwKKwlNUFA1X05GX0lPNywKKwlNUFA2X1NZU1JTVF9PVVRuLAorCU1QUDdfU1BJX1NDbiwKKwlNUFA4X1RXMF9TREEsCisJTVBQOV9UVzBfU0NLLAorCU1QUDEwX1VBUlQwX1RYRCwKKwlNUFAxMV9VQVJUMF9SWEQsCisJTVBQMTJfU0RfQ0xLLAorCU1QUDEzX0dQSU8sCisJTVBQMTRfR1BJTywKKwlNUFAxNV9HUElPLAorCU1QUDE2X0dQSU8sCisJTVBQMTdfR1BJTywKKwlNUFAxOF9ORl9JTzAsCisJTVBQMTlfTkZfSU8xLAorCU1QUDIwX0dQSU8sCisJTVBQMjFfR1BJTywKKwlNUFAyMl9HUElPLAorCU1QUDIzX0dQSU8sCisJTVBQMzJfR1BJTywKKwlNUFAzM19HRTFfVFhDVEwsCisJTVBQMzlfQVVfSTJTQkNMSywKKwlNUFA0MF9BVV9JMlNETywKKwlNUFA0MV9BVV9JMlNMUkNMSywKKwlNUFA0Ml9BVV9JMlNNQ0xLLAorCU1QUDQ1X0dQSU8sCQkvKiBQb3dlciBidXR0b24gKi8KKwlNUFA0OF9HUElPLAkJLyogQm9hcmQgcG93ZXIgb2ZmICovCisJMAorfTsKKworI2RlZmluZSBIUF9UNTMyNV9HUElPX1BPV0VSX09GRgkJNDgKKworc3RhdGljIHZvaWQgaHBfdDUzMjVfcG93ZXJfb2ZmKHZvaWQpCit7CisJZ3Bpb19zZXRfdmFsdWUoSFBfVDUzMjVfR1BJT19QT1dFUl9PRkYsIDEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaHBfdDUzMjVfaW5pdCh2b2lkKQoreworCS8qCisJICogQmFzaWMgc2V0dXAuIE5lZWRzIHRvIGJlIGNhbGxlZCBlYXJseS4KKwkgKi8KKwlraXJrd29vZF9pbml0KCk7CisJa2lya3dvb2RfbXBwX2NvbmYoaHBfdDUzMjVfbXBwX2NvbmZpZyk7CisKKwlraXJrd29vZF91YXJ0MF9pbml0KCk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oaHBfdDUzMjVfc3BpX3NsYXZlX2luZm8sCisJCQkJQVJSQVlfU0laRShocF90NTMyNV9zcGlfc2xhdmVfaW5mbykpOworCWtpcmt3b29kX3NwaV9pbml0KCk7CisJa2lya3dvb2RfaTJjX2luaXQoKTsKKwlraXJrd29vZF9nZTAwX2luaXQoJmhwX3Q1MzI1X2dlMDBfZGF0YSk7CisJa2lya3dvb2Rfc2F0YV9pbml0KCZocF90NTMyNV9zYXRhX2RhdGEpOworCWtpcmt3b29kX2VoY2lfaW5pdCgpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaHBfdDUzMjVfYnV0dG9uX2RldmljZSk7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KEhQX1Q1MzI1X0dQSU9fUE9XRVJfT0ZGLCAicG93ZXItb2ZmIikgPT0gMCAmJgorCSAgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoSFBfVDUzMjVfR1BJT19QT1dFUl9PRkYsIDApID09IDApCisJCXBtX3Bvd2VyX29mZiA9IGhwX3Q1MzI1X3Bvd2VyX29mZjsKKwllbHNlCisJCXByX2VycigidDUzMjU6IGZhaWxlZCB0byBjb25maWd1cmUgcG93ZXItb2ZmIEdQSU9cbiIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBocF90NTMyNV9wY2lfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3Q1MzI1KCkpCisJCWtpcmt3b29kX3BjaWVfaW5pdChLV19QQ0lFMCk7CisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChocF90NTMyNV9wY2lfaW5pdCk7CisKK01BQ0hJTkVfU1RBUlQoVDUzMjUsICJIUCB0NTMyNSBUaGluIENsaWVudCIpCisJLyogTWFpbnRhaW5lcjogTWFydGluIE1pY2hsbWF5ciA8dGJtQGN5cml1cy5jb20+ICovCisJLnBoeXNfaW8JPSBLSVJLV09PRF9SRUdTX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKEtJUktXT09EX1JFR1NfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaHBfdDUzMjVfaW5pdCwKKwkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKKwkuaW5pdF9pcnEJPSBraXJrd29vZF9pbml0X2lycSwKKwkudGltZXIJCT0gJmtpcmt3b29kX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHMyMTktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHMyMTktc2V0dXAuYwppbmRleCAyODMwZjBmLi5hNWJkN2ZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzMjE5LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czIxOS1zZXR1cC5jCkBAIC03NCw4ICs3NCw4IEBACiAJTVBQM19TUElfTUlTTywKIAlNUFA0X1NBVEExX0FDVG4sCiAJTVBQNV9TQVRBMF9BQ1RuLAotCU1QUDhfVFdfU0RBLAotCU1QUDlfVFdfU0NLLAorCU1QUDhfVFcwX1NEQSwKKwlNUFA5X1RXMF9TQ0ssCiAJTVBQMTBfVUFSVDBfVFhELAogCU1QUDExX1VBUlQwX1JYRCwKIAlNUFAxM19VQVJUMV9UWEQsCS8qIFBJQyBjb250cm9sbGVyICovCkBAIC04Myw2ICs4Myw3IEBACiAJTVBQMTVfR1BJTywJCS8qIFVTQiBDb3B5IGJ1dHRvbiAqLwogCU1QUDE2X0dQSU8sCQkvKiBSZXNldCBidXR0b24gKi8KIAlNUFAzNl9HUElPLAkJLyogUkFNOiAwOiAyNTYgTUIsIDE6IDUxMiBNQiAqLworCU1QUDQ0X0dQSU8sCQkvKiBCb2FyZCBJRDogMDogVFMtMTF4LCAxOiBUUy0yMXggKi8KIAkwCiB9OwogCkBAIC0xMTAsMTAgKzExMSwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0czIxOV9wY2lfaW5pdCh2b2lkKQogewotICAgaWYgKG1hY2hpbmVfaXNfdHMyMTkoKSkKLSAgICAgICAgICAga2lya3dvb2RfcGNpZV9pbml0KCk7CisJaWYgKG1hY2hpbmVfaXNfdHMyMTkoKSkKKwkJa2lya3dvb2RfcGNpZV9pbml0KEtXX1BDSUUwKTsKIAotICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiBzdWJzeXNfaW5pdGNhbGwodHMyMTlfcGNpX2luaXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzNDF4LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzNDF4LXNldHVwLmMKaW5kZXggZGU0OWMyZC4uMmUxNGFmZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czQxeC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHM0MXgtc2V0dXAuYwpAQCAtMiw3ICsyLDcgQEAKICAqCiAgKiBRTkFQIFRTLTQxMCwgVFMtNDEwVSwgVFMtNDE5UCBhbmQgVFMtNDE5VSBUdXJibyBOQVMgQm9hcmQgU2V0dXAKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgIE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgIE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDA4ICBCeXJvbiBCcmFkbGV5IDxieXJvbi5iYnJhZGxleUBnbWFpbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHhfZXRoLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTI2LDYgKzI3LDggQEAKICNpbmNsdWRlICJtcHAuaCIKICNpbmNsdWRlICJ0c3gxeC1jb21tb24uaCIKIAorI2RlZmluZSBRTkFQX1RTNDFYX0pVTVBFUl9KUDEJNDUKKwogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHFuYXBfdHM0MXhfaTJjX3J0YyA9IHsKIAlJMkNfQk9BUkRfSU5GTygiczM1MzkwYSIsIDB4MzApLAogfTsKQEAgLTc4LDMxICs4MSwzMSBAQAogCU1QUDNfU1BJX01JU08sCiAJTVBQNl9TWVNSU1RfT1VUbiwKIAlNUFA3X1BFWF9SU1RfT1VUbiwKLQlNUFA4X1RXX1NEQSwKLQlNUFA5X1RXX1NDSywKKwlNUFA4X1RXMF9TREEsCisJTVBQOV9UVzBfU0NLLAogCU1QUDEwX1VBUlQwX1RYRCwKIAlNUFAxMV9VQVJUMF9SWEQsCiAJTVBQMTNfVUFSVDFfVFhELAkvKiBQSUMgY29udHJvbGxlciAqLwogCU1QUDE0X1VBUlQxX1JYRCwJLyogUElDIGNvbnRyb2xsZXIgKi8KIAlNUFAxNV9TQVRBMF9BQ1RuLAogCU1QUDE2X1NBVEExX0FDVG4sCi0JTVBQMjBfR0UxXzAsCi0JTVBQMjFfR0UxXzEsCi0JTVBQMjJfR0UxXzIsCi0JTVBQMjNfR0UxXzMsCi0JTVBQMjRfR0UxXzQsCi0JTVBQMjVfR0UxXzUsCi0JTVBQMjZfR0UxXzYsCi0JTVBQMjdfR0UxXzcsCi0JTVBQMzBfR0UxXzEwLAotCU1QUDMxX0dFMV8xMSwKLQlNUFAzMl9HRTFfMTIsCi0JTVBQMzNfR0UxXzEzLAorCU1QUDIwX0dFMV9UWEQwLAorCU1QUDIxX0dFMV9UWEQxLAorCU1QUDIyX0dFMV9UWEQyLAorCU1QUDIzX0dFMV9UWEQzLAorCU1QUDI0X0dFMV9SWEQwLAorCU1QUDI1X0dFMV9SWEQxLAorCU1QUDI2X0dFMV9SWEQyLAorCU1QUDI3X0dFMV9SWEQzLAorCU1QUDMwX0dFMV9SWENUTCwKKwlNUFAzMV9HRTFfUlhDTEssCisJTVBQMzJfR0UxX1RDTEtPVVQsCisJTVBQMzNfR0UxX1RYQ1RMLAogCU1QUDM2X0dQSU8sCQkvKiBSQU06IDA6IDI1NiBNQiwgMTogNTEyIE1CICovCiAJTVBQMzdfR1BJTywJCS8qIFJlc2V0IGJ1dHRvbiAqLwogCU1QUDQzX0dQSU8sCQkvKiBVU0IgQ29weSBidXR0b24gKi8KIAlNUFA0NF9HUElPLAkJLyogQm9hcmQgSUQ6IDA6IFRTLTQxOVUsIDE6IFRTLTQxOSAqLwotCU1QUDQ1X0dQSU8sCQkvKiBKUDE6IDA6IGNvbnNvbGUsIDE6IExDRCAqLworCU1QUDQ1X0dQSU8sCQkvKiBKUDE6IDA6IExDRCwgMTogc2VyaWFsIGNvbnNvbGUgKi8KIAlNUFA0Nl9HUElPLAkJLyogRXh0ZXJuYWwgU0FUQSBIREQxIGVycm9yIGluZGljYXRvciAqLwogCU1QUDQ3X0dQSU8sCQkvKiBFeHRlcm5hbCBTQVRBIEhERDIgZXJyb3IgaW5kaWNhdG9yICovCiAJTVBQNDhfR1BJTywJCS8qIEV4dGVybmFsIFNBVEEgSEREMyBlcnJvciBpbmRpY2F0b3IgKi8KQEAgLTEzMSwxMiArMTM0LDE0IEBACiAKIAlwbV9wb3dlcl9vZmYgPSBxbmFwX3RzeDF4X3Bvd2VyX29mZjsKIAorCWlmIChncGlvX3JlcXVlc3QoUU5BUF9UUzQxWF9KVU1QRVJfSlAxLCAiSlAxIikgPT0gMCkKKwkJZ3Bpb19leHBvcnQoUU5BUF9UUzQxWF9KVU1QRVJfSlAxLCAwKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgdHM0MXhfcGNpX2luaXQodm9pZCkKIHsKIAlpZiAobWFjaGluZV9pc190czQxeCgpKQotCQlraXJrd29vZF9wY2llX2luaXQoKTsKKwkJa2lya3dvb2RfcGNpZV9pbml0KEtXX1BDSUUwKTsKIAogICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9wY2kuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L3BjaS5jCmluZGV4IDc4NDk5NjYuLjVmY2QwODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L3BjaS5jCkBAIC0yNjgsOCArMjY4LDggQEAKIAlfX3Jhd193cml0ZWwoMCwgS1M4Njk1X1BDSV9WQSArIEtTODY5NV9QSU9CQUMpOwogCiAJLyogaG9vayBpbiBmYXVsdCBoYW5kbGVycyAqLwotCWhvb2tfZmF1bHRfY29kZSg4LCBrczg2OTVfcGNpX2ZhdWx0LCBTSUdCVVMsICJleHRlcm5hbCBhYm9ydCBvbiBub24tbGluZWZldGNoIik7Ci0JaG9va19mYXVsdF9jb2RlKDEwLCBrczg2OTVfcGNpX2ZhdWx0LCBTSUdCVVMsICJleHRlcm5hbCBhYm9ydCBvbiBub24tbGluZWZldGNoIik7CisJaG9va19mYXVsdF9jb2RlKDgsIGtzODY5NV9wY2lfZmF1bHQsIFNJR0JVUywgMCwgImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giKTsKKwlob29rX2ZhdWx0X2NvZGUoMTAsIGtzODY5NV9wY2lfZmF1bHQsIFNJR0JVUywgMCwgImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giKTsKIH0KIAogc3RhdGljIHZvaWQga3M4Njk1X3Nob3dfcGNpcmVncyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbDcyMDAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDhlYmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLSMgT2JqZWN0IGZpbGUgbGlzdHMuCi0KLW9iai15CQkJOj0gY29yZS5vCi1vYmotbQkJCTo9Ci1vYmotbgkJCTo9Ci1vYmotCQkJOj0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9NYWtlZmlsZS5ib290CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzcyZWNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvTWFrZWZpbGUuYm9vdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotICAgenJlbGFkZHIteQk6PSAweGYwMDA4MDAwCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDIzMjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tbS9tbS1sdXNsNzIwMC5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZSBIaWxsIChzamhpbGxAY290dy5jb20pCi0gKgotICogIEV4dHJhIE1NIHJvdXRpbmVzIGZvciBMNzIwMCBhcmNoaXRlY3R1cmUKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotCi0vKgotICogSVJRIGJhc2UgcmVnaXN0ZXIKLSAqLwotI2RlZmluZQlJUlFfQkFTRQkoSU9fQkFTRV8yICsgMHgxMDAwKQotCi0vKiAKLSAqIE5vcm1hbCBJUlEgcmVnaXN0ZXJzCi0gKi8KLSNkZWZpbmUgSVJRX1NUQVRVUwkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChJUlFfQkFTRSArIDB4MDAwKSkKLSNkZWZpbmUgSVJRX1JBV1NUQVRVUwkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChJUlFfQkFTRSArIDB4MDA0KSkKLSNkZWZpbmUgSVJRX0VOQUJMRQkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChJUlFfQkFTRSArIDB4MDA4KSkKLSNkZWZpbmUgSVJRX0VOQUJMRUNMRUFSCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgwMGMpKQotI2RlZmluZSBJUlFfU09GVAkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChJUlFfQkFTRSArIDB4MDEwKSkKLSNkZWZpbmUgSVJRX1NPVVJDRVNFTAkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChJUlFfQkFTRSArIDB4MDE4KSkKLQotLyogCi0gKiBGYXN0IElSUSByZWdpc3RlcnMKLSAqLwotI2RlZmluZSBGSVFfU1RBVFVTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgxMDApKQotI2RlZmluZSBGSVFfUkFXU1RBVFVTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgxMDQpKQotI2RlZmluZSBGSVFfRU5BQkxFCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgxMDgpKQotI2RlZmluZSBGSVFfRU5BQkxFQ0xFQVIJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSVJRX0JBU0UgKyAweDEwYykpCi0jZGVmaW5lIEZJUV9TT0ZUCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgxMTApKQotI2RlZmluZSBGSVFfU09VUkNFU0VMCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKElSUV9CQVNFICsgMHgxMTgpKQotCi1zdGF0aWMgdm9pZCBsNzIwMF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCUlSUV9FTkFCTEVDTEVBUiA9IDEgPDwgaXJxOwotfQotCi1zdGF0aWMgdm9pZCBsNzIwMF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JSVJRX0VOQUJMRSA9IDEgPDwgaXJxOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGw3MjAwX2lycV9jaGlwID0gewotCS5hY2sJCT0gbDcyMDBfbWFza19pcnEsCi0JLm1hc2sJCT0gbDcyMDBfbWFza19pcnEsCi0JLnVubWFzawkJPSBsNzIwMF91bm1hc2tfaXJxCi19OwotIAotc3RhdGljIHZvaWQgX19pbml0IGw3MjAwX2luaXRfaXJxKHZvaWQpCi17Ci0JaW50IGlycTsKLQotCUlSUV9FTkFCTEVDTEVBUiA9IDB4ZmZmZmZmZmY7CS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgZW5hYmxlcyAqLwotCUZJUV9FTkFCTEVDTEVBUiA9IDB4ZmZmZmZmZmY7CS8qIGNsZWFyIGFsbCBmYXN0IGludGVycnVwdCBlbmFibGVzICovCi0KLQlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7Ci0JCXNldF9pcnFfY2hpcChpcnEsICZsNzIwMF9pcnFfY2hpcCk7Ci0JCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JfQotCi0JaW5pdF9GSVEoKTsKLX0KLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBsNzIwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7IElPX0JBU0UsCUlPX1NUQVJULAlJT19TSVpFLAlNVF9ERVZJQ0UgfSwKLQl7IElPX0JBU0VfMiwJSU9fU1RBUlRfMiwJSU9fU0laRV8yLAlNVF9ERVZJQ0UgfSwKLQl7IEFVWF9CQVNFLCAgICAgQVVYX1NUQVJULCAgICAgIEFVWF9TSVpFLCAgICAgICBNVF9ERVZJQ0UgfSwKLQl7IEZMQVNIMV9CQVNFLCAgRkxBU0gxX1NUQVJULCAgIEZMQVNIMV9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKLQl7IEZMQVNIMl9CQVNFLCAgRkxBU0gyX1NUQVJULCAgIEZMQVNIMl9TSVpFLCAgICBNVF9ERVZJQ0UgfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGw3MjAwX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChsNzIwMF9pb19kZXNjLCBBUlJBWV9TSVpFKGw3MjAwX2lvX2Rlc2MpKTsKLX0KLQotTUFDSElORV9TVEFSVChMNzIwMCwgIkxpbmtVcCBTeXN0ZW1zIEw3MjAwIikKLQkvKiBNYWludGFpbmVyOiBTdGV2ZSBIaWxsIC8gU2NvdHQgTWNDb25uZWxsICovCi0JLnBoeXNfaW8JPSAweDgwMDQwMDAwLAotCS5pb19wZ19vZmZzdAk9ICgoMHhkMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5tYXBfaW8JCT0gbDcyMDBfbWFwX2lvLAotCS5pbml0X2lycQk9IGw3MjAwX2luaXRfaXJxLAotTUFDSElORV9FTkQKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvYXV4X3JlZy5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvYXV4X3JlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjcxNTU4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2F1eF9yZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9hdXhfcmVnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmUgSGlsbCAoc2poaWxsQGNvdHcuY29tKQotICoKLSAqIENoYW5nZWxvZzoKLSAqICAgMDgtMDItMjAwMAlTSkgJQ3JlYXRlZCBmaWxlCi0gKi8KLSNpZm5kZWYgX0FTTV9BUkNIX0FVWFJFR19ICi0jZGVmaW5lIF9BU01fQVJDSF9BVVhSRUdfSAotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0jZGVmaW5lIGw3MjAwYXV4X3JlZwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKEFVWF9CQVNFKSkKLQotLyoKLSAqIEF1eGlsbGFyeSByZWdpc3RlciB2YWx1ZXMKLSAqLwotI2RlZmluZSBBVVhfQ0xFQVIJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQVVYX0RJQUdfTEVEX09OCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFVWF9SVFNfVUFSVDEJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQVVYX0RUUl9VQVJUMQkJMHgwMDAwMDAwOAotI2RlZmluZSBBVVhfS0JEX0NPTFVNTl8xMl9ISUdICTB4MDAwMDAwMTAKLSNkZWZpbmUgQVVYX0tCRF9DT0xVTU5fMTJfT0ZGCTB4MDAwMDAwMjAKLSNkZWZpbmUgQVVYX0tCRF9DT0xVTU5fMTNfSElHSAkweDAwMDAwMDQwCi0jZGVmaW5lIEFVWF9LQkRfQ09MVU1OXzEzX09GRgkweDAwMDAwMDgwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWVkMzQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKLSAqCi0gKiBEZWJ1Z2dpbmcgbWFjcm8gaW5jbHVkZSBoZWFkZXIKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTkgUnVzc2VsbCBLaW5nCi0gKiAgTW92ZWQgZnJvbSBsaW51eC9hcmNoL2FybS9rZXJuZWwvZGVidWcuUyBieSBCZW4gRG9va3MKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSovCi0KLQkJLmVxdQlpb192aXJ0LCBJT19CQVNFCi0JCS5lcXUJaW9fcGh5cywgSU9fU1RBUlQKLQotCQkubWFjcm8JYWRkcnVhcnQsIHJ4LCB0bXAKLQkJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKLQkJdHN0CVxyeCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQltb3ZlcQlccngsICNpb19waHlzCQlAIHBoeXNpY2FsIGJhc2UgYWRkcmVzcwotCQltb3ZuZQlccngsICNpb192aXJ0CQlAIHZpcnR1YWwgYWRkcmVzcwotCQlhZGQJXHJ4LCBccngsICMweDAwMDQ0MDAwCUAgVUFSVDEKLUAJCWFkZAlccngsIFxyeCwgIzB4MDAwNDUwMDAJQCBVQVJUMgotCQkuZW5kbQotCi0JCS5tYWNybwlzZW5kdWFydCxyZCxyeAotCQlzdHIJXHJkLCBbXHJ4LCAjMHgwXQlAIFVBUlREUgotCQkuZW5kbQotCi0JCS5tYWNybwl3YWl0dWFydCxyZCxyeAotMTAwMToJCWxkcglccmQsIFtccngsICMweDE4XQlAIFVBUlRGTEcKLQkJdHN0CVxyZCwgIzEgPDwgNQkJQCBVQVJURkxHVVRYRkYgLSAxIHdoZW4gZnVsbAotCQlibmUJMTAwMWIKLQkJLmVuZG0KLQotCQkubWFjcm8JYnVzeXVhcnQscmQscngKLTEwMDE6CQlsZHIJXHJkLCBbXHJ4LCAjMHgxOF0JQCBVQVJURkxHCi0JCXRzdAlccmQsICMxIDw8IDMJCUAgVUFSVEZMR1VCVVNZIC0gMSB3aGVuIGJ1c3kKLQkJYm5lCTEwMDFiCi0JCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNmQ5MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKLSAqCi0gKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIEw3MjAwLWJhc2VkIHBsYXRmb3JtcwotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0JCS5lcXUJaXJxX2Jhc2VfYWRkciwJSU9fQkFTRV8yCi0KLQkJLm1hY3JvICBkaXNhYmxlX2ZpcQotCQkuZW5kbQotCi0JCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKLQkJLmVuZG0KLQotCQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKLQkJLmVuZG0KLQotCQkubWFjcm8gIGdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCQltb3YgICAgIFxpcnFzdGF0LCAjaXJxX2Jhc2VfYWRkcgkJQCBWaXJ0IGFkZHIgSVJRIHJlZ3MKLQkJYWRkCVxpcnFzdGF0LCBcaXJxc3RhdCwgIzB4MDAwMDEwMDAJCUAgU3RhdHVzIHJlZwotCQlsZHIgICAgIFxpcnFzdGF0LCBbXGlycXN0YXQsICMwXQkJQCBnZXQgaW50ZXJydXB0cwotCQltb3YgICAgIFxpcnFuciwgIzAKLTEwMDE6CQl0c3QgICAgIFxpcnFzdGF0LCAjMQotCQlhZGRlcSAgIFxpcnFuciwgXGlycW5yLCAjMQotCQltb3ZlcSAgIFxpcnFzdGF0LCBcaXJxc3RhdCwgbHNyICMxCi0JCXRzdGVxICAgXGlycW5yLCAjMzIKLQkJYmVxICAgICAxMDAxYgotCQl0ZXEgICAgIFxpcnFuciwgIzMyCi0JCS5lbmRtCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2dwX3RpbWVycy5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZ3BfdGltZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzA4NmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZ3BfdGltZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZ3BfdGltZXJzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmUgSGlsbCAoc2poaWxsQGNvdHcuY29tKQotICoKLSAqIENoYW5nZWxvZzoKLSAqICAgMDctMjgtMjAwMAlTSkgJQ3JlYXRlZCBmaWxlCi0gKiAgIDA4LTAyLTIwMDAJU0pICVVzZWQgc3RydWN0dXJlIGZvciByZWdpc3RlcnMKLSAqLwotI2lmbmRlZiBfQVNNX0FSQ0hfR1BUSU1FUlNfSAotI2RlZmluZSBfQVNNX0FSQ0hfR1BUSU1FUlNfSAotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0vKgotICogTGF5b3V0IG9mIEw3MjAwIGdlbmVyYWwgcHVycG9zZSB0aW1lciByZWdpc3RlcnMKLSAqLwotc3RydWN0IEdQVF9SZWdzIHsKLQl1bnNpZ25lZCBpbnQgVElNRVJMT0FEOwotCXVuc2lnbmVkIGludCBUSU1FUlZBTFVFOwotCXVuc2lnbmVkIGludCBUSU1FUkNPTlRST0w7Ci0JdW5zaWduZWQgaW50IFRJTUVSQ0xFQVI7Ci19OwotCi0jZGVmaW5lIEdQVF9CQVNFCQkoSU9fQkFTRV8yICsgMHgzMDAwKQotI2RlZmluZSBsNzIwMF90aW1lcjFfcmVncwkoKHZvbGF0aWxlIHN0cnVjdCBHUFRfUmVncyAqKSAoR1BUX0JBU0UpKQotI2RlZmluZSBsNzIwMF90aW1lcjJfcmVncwkoKHZvbGF0aWxlIHN0cnVjdCBHUFRfUmVncyAqKSAoR1BUX0JBU0UgKyAweDIwKSkKLQotLyoKLSAqIEdlbmVyYWwgcmVnaXN0ZXIgdmFsdWVzCi0gKi8KLSNkZWZpbmUJR1BUX1BSRVNDQUxFXzEJCTB4MDAwMDAwMDAKLSNkZWZpbmUJR1BUX1BSRVNDQUxFXzE2CQkweDAwMDAwMDA0Ci0jZGVmaW5lCUdQVF9QUkVTQ0FMRV8yNTYJMHgwMDAwMDAwOAotI2RlZmluZSBHUFRfTU9ERV9GUkVFUlVOCTB4MDAwMDAwMDAKLSNkZWZpbmUgR1BUX01PREVfUEVSSU9ESUMJMHgwMDAwMDA0MAotI2RlZmluZSBHUFRfRU5BQkxFCQkweDAwMDAwMDgwCi0jZGVmaW5lIEdQVF9CWlRPRwkJMHgwMDAwMDEwMAotI2RlZmluZSBHUFRfQlpNT0QJCTB4MDAwMDAyMDAKLSNkZWZpbmUgR1BUX0xPQURfTUFTSyAJCTB4MDAwMGZmZmYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjBhNWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAgICAgYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCi0gKgotICogICAgICBSZWdpc3RlcnMgYW5kICBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgTDcyMDAgTGluay1VcCBTeXN0ZW1zCi0gKiAgICAgIEdQSU8uCi0gKgotICogICAgICAoQykgQ29weXJpZ2h0IDIwMDAsIFMgQSBNY0Nvbm5lbGwgIChzYW1jY29ubkBjb3R3LmNvbSkKLSAqCi0gKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogIG1vcmUgZGV0YWlscy4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBHUElPX09GRiAgIDB4MDAwMDUwMDAgIC8qIE9mZnNldCBmcm9tIElPX1NUQVJUIHRvIHRoZSBHUElPIHJlZydzLiAqLwotCi0vKiBJT19TVEFSVCBhbmQgSU9fQkFTRSBhcmUgZGVmaW5lZCBpbiBoYXJkd2FyZS5oICovCi0KLSNkZWZpbmUgR1BJT19TVEFSVCAoSU9fU1RBUlRfMiArIEdQSU9fT0ZGKSAvKiBQaHlzaWNhbCBhZGRyIG9mIHRoZSBHUElPIHJlZy4gKi8KLSNkZWZpbmUgR1BJT19CQVNFICAoSU9fQkFTRV8yICArIEdQSU9fT0ZGKSAvKiBWaXJ0dWFsIGFkZHIgb2YgdGhlIEdQSU8gcmVnLiAqLwotCi0vKiBPZmZzZXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBHUElPIGZvciBhbGwgdGhlIHJlZ2lzdGVycy4gKi8KLSNkZWZpbmUgUEFEUl9PRkYgICAgIDB4MDAwCi0jZGVmaW5lIFBBRERSX09GRiAgICAweDAwNAotI2RlZmluZSBQQVNCU1JfT0ZGICAgMHgwMDgKLSNkZWZpbmUgUEFFRU5SX09GRiAgIDB4MDBjCi0jZGVmaW5lIFBBRVNOUl9PRkYgICAweDAxMAotI2RlZmluZSBQQUVTVFJfT0ZGICAgMHgwMTQKLSNkZWZpbmUgUEFJTVJfT0ZGICAgIDB4MDE4Ci0jZGVmaW5lIFBBSU5UX09GRiAgICAweDAxYwotCi0jZGVmaW5lIFBCRFJfT0ZGICAgICAweDAyMAotI2RlZmluZSBQQkREUl9PRkYgICAgMHgwMjQKLSNkZWZpbmUgUEJTQlNSX09GRiAgIDB4MDI4Ci0jZGVmaW5lIFBCSU1SX09GRiAgICAweDAzOAotI2RlZmluZSBQQklOVF9PRkYgICAgMHgwM2MKLQotI2RlZmluZSBQQ0RSX09GRiAgICAgMHgwNDAKLSNkZWZpbmUgUENERFJfT0ZGICAgIDB4MDQ0Ci0jZGVmaW5lIFBDU0JTUl9PRkYgICAweDA0OAotI2RlZmluZSBQQ0lNUl9PRkYgICAgMHgwNTgKLSNkZWZpbmUgUENJTlRfT0ZGICAgIDB4MDVjCi0KLSNkZWZpbmUgUEREUl9PRkYgICAgIDB4MDYwCi0jZGVmaW5lIFBERERSX09GRiAgICAweDA2NAotI2RlZmluZSBQRFNCU1JfT0ZGICAgMHgwNjgKLSNkZWZpbmUgUERFRU5SX09GRiAgIDB4MDZjCi0jZGVmaW5lIFBERVNOUl9PRkYgICAweDA3MAotI2RlZmluZSBQREVTVFJfT0ZGICAgMHgwNzQKLSNkZWZpbmUgUERJTVJfT0ZGICAgIDB4MDc4Ci0jZGVmaW5lIFBESU5UX09GRiAgICAweDA3YwotCi0jZGVmaW5lIFBFRFJfT0ZGICAgICAweDA4MAotI2RlZmluZSBQRUREUl9PRkYgICAgMHgwODQKLSNkZWZpbmUgUEVTQlNSX09GRiAgIDB4MDg4Ci0jZGVmaW5lIFBFRUVOUl9PRkYgICAweDA4YwotI2RlZmluZSBQRUVTTlJfT0ZGICAgMHgwOTAKLSNkZWZpbmUgUEVFU1RSX09GRiAgIDB4MDk0Ci0jZGVmaW5lIFBFSU1SX09GRiAgICAweDA5OAotI2RlZmluZSBQRUlOVF9PRkYgICAgMHgwOWMKLQotLyogRGVmaW5lIHRoZSBHUElPIHJlZ2lzdGVycyBmb3IgdXNlIGJ5IGRldmljZSBkcml2ZXJzIGFuZCB0aGUga2VybmVsLiAqLwotI2RlZmluZSBQQURSICAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUEFEUl9PRkYpKQotI2RlZmluZSBQQUREUiAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUEFERFJfT0ZGKSkKLSNkZWZpbmUgUEFTQlNSICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BBU0JTUl9PRkYpKQotI2RlZmluZSBQQUVFTlIgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUEFFRU5SX09GRikpCi0jZGVmaW5lIFBBRVNOUiAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQQUVTTlJfT0ZGKSkKLSNkZWZpbmUgUEFFU1RSICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BBRVNUUl9PRkYpKQotI2RlZmluZSBQQUlNUiAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUEFJTVJfT0ZGKSkKLSNkZWZpbmUgUEFJTlQgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BBSU5UX09GRikpCi0KLSNkZWZpbmUgUEJEUiAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BCRFJfT0ZGKSkKLSNkZWZpbmUgUEJERFIgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BCRERSX09GRikpCi0jZGVmaW5lIFBCU0JTUiAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQQlNCU1JfT0ZGKSkKLSNkZWZpbmUgUEJJTVIgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BCSU1SX09GRikpCi0jZGVmaW5lIFBCSU5UICAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQQklOVF9PRkYpKQotCi0jZGVmaW5lIFBDRFIgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQQ0RSX09GRikpCi0jZGVmaW5lIFBDRERSICAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQQ0REUl9PRkYpKQotI2RlZmluZSBQQ1NCU1IgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUENTQlNSX09GRikpCi0jZGVmaW5lIFBDSU1SICAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQQ0lNUl9PRkYpKQotI2RlZmluZSBQQ0lOVCAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUENJTlRfT0ZGKSkKLQotI2RlZmluZSBQRERSICAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUEREUl9PRkYpKQotI2RlZmluZSBQREREUiAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUERERFJfT0ZGKSkKLSNkZWZpbmUgUERTQlNSICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BEU0JTUl9PRkYpKQotI2RlZmluZSBQREVFTlIgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUERFRU5SX09GRikpCi0jZGVmaW5lIFBERVNOUiAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQREVTTlJfT0ZGKSkKLSNkZWZpbmUgUERFU1RSICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BERVNUUl9PRkYpKQotI2RlZmluZSBQRElNUiAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUERJTVJfT0ZGKSkKLSNkZWZpbmUgUERJTlQgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BESU5UX09GRikpCi0KLSNkZWZpbmUgUEVEUiAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BFRFJfT0ZGKSkKLSNkZWZpbmUgUEVERFIgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BFRERSX09GRikpCi0jZGVmaW5lIFBFU0JTUiAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQRVNCU1JfT0ZGKSkKLSNkZWZpbmUgUEVFRU5SICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BFRUVOUl9PRkYpKQotI2RlZmluZSBQRUVTTlIgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShHUElPX0JBU0UrUEVFU05SX09GRikpCi0jZGVmaW5lIFBFRVNUUiAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQRUVTVFJfT0ZGKSkKLSNkZWZpbmUgUEVJTVIgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoR1BJT19CQVNFK1BFSU1SX09GRikpCi0jZGVmaW5lIFBFSU5UICAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEdQSU9fQkFTRStQRUlOVF9PRkYpKQotCi0jZGVmaW5lIFZFRV9FTiAgICAgICAgIDB4MDIKLSNkZWZpbmUgQkFDS0xJR0hUX0VOICAgMHgwNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMTkwOWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFJvYiBTY290dCAocnNjb3R0QG10cm9iLmZkbnMubmV0KQotICogICAgICAgICAgICAgICAgICAgIFN0ZXZlIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhhcmR3YXJlIGRlZmluaXRpb25zIGZvciB0aGUgCi0gKiBMaW5rVXAgU3lzdGVtcyBMNzIwMCBTT0MgZGV2ZWxvcG1lbnQgYm9hcmQuCi0gKgotICogQ2hhbmdlbG9nOgotICogICAwMi0wMS0yMDAwCSBSUwlDcmVhdGVkIEw3MjAwIHZlcnNpb24sIGRlcml2ZWQgZnJvbSBycGMgY29kZQotICogICAwMy0yMS0yMDAwCVNKSAlDbGVhbmVkIHVwIGZpbGUKLSAqICAgMDQtMjEtMjAwMAkgUlMgCUNoYW5nZWQgbWFwcGluZyBvZiBJL08gaW4gdmlydHVhbCBzcGFjZQotICogICAwNC0yNS0yMDAwCVNKSAlSZW1vdmVkIHVudXNlZCBzeW1ib2xzIGFuZCBzdWNoCi0gKiAgIDA1LTA1LTIwMDAJU0pICUNvbXBsZXRlIHJld3JpdGUKLSAqICAgMDctMzEtMjAwMAlTSkgJQWRkZWQgdW5kb2N1bWVudGVkIGRlYnVnIGF1eGlsbGFyeSBwb3J0IHRvCi0gKgkJCWdldCBhdCBsYXN0IHR3byBjb2x1bW5zIGZvciBrZXlib2FyZCBkcml2ZXIKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKLSNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICi0KLS8qIEhhcmR3YXJlIGFkZHJlc3NlcyBvZiBtYWpvciBhcmVhcy4KLSAqICAqX1NUQVJUIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzCi0gKiAgKl9TSVpFICBpcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uCi0gKiAgKl9CQVNFICBpcyB0aGUgdmlydHVhbCBhZGRyZXNzCi0gKi8KLSNkZWZpbmUgUkFNX1NUQVJUCQkweGYwMDAwMDAwCi0jZGVmaW5lIFJBTV9TSVpFCQkweDAyMDAwMDAwCi0jZGVmaW5lIFJBTV9CQVNFCQkweGMwMDAwMDAwCi0KLSNkZWZpbmUgSU9fU1RBUlQJCTB4ODAwMDAwMDAgICAgICAvKiBJL08gKi8KLSNkZWZpbmUgSU9fU0laRQkJCTB4MDEwMDAwMDAKLSNkZWZpbmUgSU9fQkFTRQkJCTB4ZDAwMDAwMDAKLQotI2RlZmluZSBJT19TVEFSVF8yCQkweDkwMDAwMDAwICAgICAgLyogSS9PICovCi0jZGVmaW5lIElPX1NJWkVfMgkJMHgwMTAwMDAwMAotI2RlZmluZSBJT19CQVNFXzIJCTB4ZDEwMDAwMDAKLQotI2RlZmluZSBBVVhfU1RBUlQJCTB4MWEwMDAwMDAgICAgICAvKiBBVVggUE9SVCAqLwotI2RlZmluZSBBVVhfU0laRSAJCTB4MDEwMDAwMDAKLSNkZWZpbmUgQVVYX0JBU0UJCTB4ZDIwMDAwMDAKLQotI2RlZmluZSBGTEFTSDFfU1RBUlQJCTB4MDAwMDAwMDAgICAgICAvKiBGTEFTSCBCQU5LIDEgKi8KLSNkZWZpbmUgRkxBU0gxX1NJWkUgCQkweDAxMDAwMDAwCi0jZGVmaW5lIEZMQVNIMV9CQVNFCQkweGQzMDAwMDAwCi0KLSNkZWZpbmUgRkxBU0gyX1NUQVJUCQkweDEwMDAwMDAwICAgICAgLyogRkxBU0ggQkFOSyAyICovCi0jZGVmaW5lIEZMQVNIMl9TSVpFIAkJMHgwMTAwMDAwMAotI2RlZmluZSBGTEFTSDJfQkFTRQkJMHhkNDAwMDAwMAotCi0jZGVmaW5lIElTQV9TVEFSVAkJMHgyMDAwMDAwMAkvKiBJU0EgKi8KLSNkZWZpbmUgSVNBX1NJWkUJCTB4MjAwMDAwMDAKLSNkZWZpbmUgSVNBX0JBU0UJCTB4ZTAwMDAwMDAKLQotI2RlZmluZSBQQ0lPX0JBU0UJCUlPX0JBU0UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3MGE4OS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2lvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmUgSGlsbCAoc2poaWxsQGNvdHcuY29tKQotICoKLSAqIENoYW5nZWxvZzoKLSAqICAwMy0yMS0yMDAwCVNKSAlDcmVhdGVkIGZyb20gYXJjaC9hcm0vbWFjaC1uZXh1c3BjaS9pbmNsdWRlL21hY2gvaW8uaAotICogIDA4LTMxLTIwMDAJU0pICUFkZGVkIGluIElPIGZ1bmN0aW9ucyBuZWNlc3NhcnkgZm9yIG5ldyBkcml2ZXJzCi0gKi8KLSNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAotI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICi0KLSNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgotCi0vKgotICogVGhlcmUgYXJlIG5vdCByZWFsIElTQSBub3IgUENJIGJ1c2VzLCBzbyB3ZSBmYWtlIGl0LgotICovCi0jZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKLSNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2lycXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkZmZkNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvaXJxcy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFJvYiBTY290dCAocnNjb3R0QG10cm9iLmZkbnMubmV0KQotICogICAgICAgICAgICAgICAgICAgIFN0ZXZlIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgIDAxLTAyLTIwMDAgUlMJQ3JlYXRlIGw3MjAwIHZlcnNpb24KLSAqICAgMDMtMjgtMjAwMCBTSkgJUmVtb3ZlZCB1bnVzZWQgaW50ZXJydXB0Ci0gKiAgIDA3LTI4LTIwMDAgU0pICUFkZGVkIHBzZXVkby1rZXlib2FyZCBpbnRlcnJ1cHQKLSAqLwotCi0vKgotICogTk9URTogVGhlIHNlY29uZCB0aW1lciAoVGltZXIgMikgaXMgdXNlZCBhcyB0aGUga2V5Ym9hcmQKLSAqICAgICAgIGludGVycnVwdCB3aGVuIHRoZSBrZXlib2FyZCBkcml2ZXIgaXMgZW5hYmxlZC4KLSAqLwotCi0jZGVmaW5lIE5SX0lSUVMgICAgICAgICAgMzIKLQotI2RlZmluZSBJUlFfU1RXRE9HICAgICAgICAwICAgLyogV2F0Y2hkb2cgdGltZXIgKi8KLSNkZWZpbmUgSVJRX1BST0cgICAgICAgICAgMSAgIC8qIFByb2dyYW1tYWJsZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX0RFQlVHX1JYICAgICAgMiAgIC8qIENvbW0gUnggZGVidWcgKi8KLSNkZWZpbmUgSVJRX0RFQlVHX1RYICAgICAgMyAgIC8qIENvbW0gVHggZGVidWcgKi8KLSNkZWZpbmUgSVJRX0dDVEMxICAgICAgICAgNCAgIC8qIFRpbWVyIDEgKi8KLSNkZWZpbmUgSVJRX0dDVEMyICAgICAgICAgNSAgIC8qIFRpbWVyIDIgLyBLZXlib2FyZCAqLwotI2RlZmluZSBJUlFfRE1BICAgICAgICAgICA2ICAgLyogRE1BIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX0NMQ0QgICAgICAgICAgNyAgIC8qIENvbG9yIExDRCBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9TTV9SWCAgICAgICAgIDggICAvKiBTbWFydCBjYXJkICovCi0jZGVmaW5lIElSUV9TTV9UWCAgICAgICAgIDkgICAvKiBTbWFydCBjYXJ0ICovCi0jZGVmaW5lIElSUV9TTV9SU1QgICAgICAgMTAgICAvKiBTbWFydCBjYXJkICovCi0jZGVmaW5lIElSUV9TSUIgICAgICAgICAgMTEgICAvKiBTZXJpYWwgSW50ZXJmYWNlIEJ1cyAqLwotI2RlZmluZSBJUlFfTU1DICAgICAgICAgIDEyICAgLyogTXVsdGlNZWRpYUNhcmQgKi8KLSNkZWZpbmUgSVJRX1NTUDEgICAgICAgICAxMyAgIC8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0IDEgKi8KLSNkZWZpbmUgSVJRX1NTUDIgICAgICAgICAxNCAgIC8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0IDEgKi8KLSNkZWZpbmUgSVJRX1NQSSAgICAgICAgICAxNSAgIC8qIFNQSSBzbGF2ZSAqLwotI2RlZmluZSBJUlFfVUFSVF8xICAgICAgIDE2ICAgLyogVUFSVCAxICovCi0jZGVmaW5lIElSUV9VQVJUXzIgICAgICAgMTcgICAvKiBVQVJUIDIgKi8KLSNkZWZpbmUgSVJRX0lSREEgICAgICAgICAxOCAgIC8qIElSREEgKi8KLSNkZWZpbmUgSVJRX1JUQ19USUNLICAgICAxOSAgIC8qIFJlYWwgVGltZSBDbG9jayB0aWNrICovCi0jZGVmaW5lIElSUV9SVENfQUxBUk0gICAgMjAgICAvKiBSZWFsIFRpbWUgQ2xvY2sgYWxhcm0gKi8KLSNkZWZpbmUgSVJRX0dQSU8gICAgICAgICAyMSAgIC8qIEdlbmVyYWwgUHVycG9zZSBJTyAqLwotI2RlZmluZSBJUlFfR1BJT19ETUEgICAgIDIyICAgLyogR2VuZXJhbCBQdXJwb3NlIElPLCBETUEgKi8KLSNkZWZpbmUgSVJRX00yTSAgICAgICAgICAyMyAgIC8qIE1lbW9yeSB0byBtZW1vcnkgRE1BICAqLwotI2RlZmluZSBJUlFfUkVTRVJWRUQgICAgIDI0ICAgLyogUkVTRVJWRUQsIGRvbid0IHVzZSAqLwotI2RlZmluZSBJUlFfSU5URiAgICAgICAgIDI1ICAgLyogRXh0ZXJuYWwgYWN0aXZlIGxvdyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX0lOVDAgICAgICAgICAyNiAgIC8qIEV4dGVybmFsIGFjdGl2ZSBsb3cgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9JTlQxICAgICAgICAgMjcgICAvKiBFeHRlcm5hbCBhY3RpdmUgbG93IGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfSU5UMiAgICAgICAgIDI4ICAgLyogRXh0ZXJuYWwgYWN0aXZlIGxvdyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX1VDQjEyMDAgICAgICAyOSAgIC8qIEludGVycnVwdCBnZW5lcmF0ZWQgYnkgVUNCMTIwMCovCi0jZGVmaW5lIElSUV9CQVRfTE8gICAgICAgMzAgICAvKiBMb3cgYmF0ZXJ5IG9yIGV4dGVybmFsIHBvd2VyICovCi0jZGVmaW5lIElSUV9NRURJQV9DSEcgICAgMzEgICAvKiBNZWRpYSBjaGFuZ2UgaW50ZXJydXB0ICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIEZJUSAiSVJRIiBudW1iZXJzCi0gKi8KLSNkZWZpbmUgRklRX1NUQVJUCTY0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmI0MGVkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFN0ZXZlIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKLSAqIENvcHlyaWdodCAoYykgMjAwMCBSb2IgU2NvdHQgKHJzY290dEBtdHJvYi5mZG5zLm5ldCkKLSAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKiAgMDMtMTMtMjAwMAlTSkgJQ3JlYXRlZAotICogIDA0LTEzLTIwMDAgIFJTICAgICAgQ2hhbmdlZCBidXMgbWFjcm9zIGZvciBuZXcgYWRkcgotICogIDA1LTAzLTIwMDAgIFNKSCAgICAgUmVtb3ZlZCBidXMgbWFjcm9zIGFuZCBmaXhlZCB2aXJ0X3RvX3BoeXMgbWFjcm8KLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0IG9uIHRoZSBMNzIwMCBTREIuCi0gKi8KLSNkZWZpbmUgUEhZU19PRkZTRVQgICAgIFVMKDB4ZjAwMDAwMDApCi0KLS8qCi0gKiBDYWNoZSBmbHVzaGluZyBhcmVhIC0gUk9NCi0gKi8KLSNkZWZpbmUgRkxVU0hfQkFTRV9QSFlTCQkweDQwMDAwMDAwCi0jZGVmaW5lIEZMVVNIX0JBU0UJCTB4ZGYwMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9wbXBjb24uaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3BtcGNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU5ODcxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3BtcGNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3BtcGNvbi5oCi0gKgotICogICBSZWdpc3RlcnMgYW5kICBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgTDcyMDAgTGluay1VcCBTeXN0ZW1zCi0gKiAgIERDL0RDIGNvbnZlcnRlciByZWdpc3Rlci4KLSAqCi0gKiAgIChDKSBDb3B5cmlnaHQgMjAwMCwgUyBBIE1jQ29ubmVsbCAgKHNhbWNjb25uQGNvdHcuY29tKQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFBNUENPTl9PRkYgMHgwMDAwNjAwMCAgLyogT2Zmc2V0IGZyb20gSU9fU1RBUlRfMi4gKi8KLQotLyogSU9fU1RBUlRfMiBhbmQgSU9fQkFTRV8yIGFyZSBkZWZpbmVkIGluIGhhcmR3YXJlLmggKi8KLQotI2RlZmluZSBQTVBDT05fU1RBUlQgKElPX1NUQVJUXzIgKyBQTVBDT05fT0ZGKSAgLyogUGh5c2ljYWwgYWRkcmVzcyBvZiByZWcuICovCi0jZGVmaW5lIFBNUENPTl9CQVNFICAoSU9fQkFTRV8yICArIFBNUENPTl9PRkYpICAvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgcmVnLiAqLwotCi0KLSNkZWZpbmUgUE1QQ09OICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShQTVBDT05fQkFTRSkpCi0KLSNkZWZpbmUgUFdNMl81MENZQ0xFIDB4ODAwCi0jZGVmaW5lIENPTlRSQVNUICAgICAweDkKLQotI2RlZmluZSBQV00xSCAoQ09OVFJBU1QpCi0jZGVmaW5lIFBXTTFMIChDT05UUkFTVCA8PCA0KQotCi0jZGVmaW5lIFBNUENPTl9WQUxVRSAgKFBXTTJfNTBDWUNMRSB8IFBXTTFMIHwgUFdNMUgpIAotCQotLyogUE1QQ09OID0gMHg4MTE7ICAgLy8gdG9vIGxpZ2h0IGFuZCBmdXp6eQotICogUE1QQ09OID0gMHg4NDQ7ICAgCi0gKiBQTVBDT04gPSAweDg2NjsgICAvLyBiZXR0ZXIgY29sb3IgcG9vciBkZXB0aAotICogUE1QQ09OID0gMHg4ODg7ICAgLy8gRGFya2VyIGJ1dCBiZXR0ZXIgZGVwdGggCi0gKiBQTVBDT04gPSAweDg5OTsgICAvLyBEYXJrZXIgZXZlbiBiZXR0ZXIgZGVwdGgKLSAqIFBNUENPTiA9IDB4OGFhOyAgIC8vIHRvbyBkYXJrIGV2ZW4gYmV0dGVyIGRlcHRoCi0gKiBQTVBDT04gPSAwWDhjYzsgICAvLyBXYXkgdG9vIGRhcmsKLSAqLwotCi0vKiBBcyBDT05UUkFTVCB2YWx1ZSBpbmNyZWFzZXMgdGhlIGdyZWF0ZXIgdGhlIGRlcHRoIHBlcmNlcHRpb24gYW5kCi0gKiB0aGUgZGFya2VyIHRoZSBjb2xvcnMuCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3BtdS5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvcG11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGE3YWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvcG11LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3BtdS5oCi0gKgotICogICBSZWdpc3RlcnMgYW5kICBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgTDcyMDAgTGluay1VcCBTeXN0ZW1zCi0gKiAgIFBvd2VyIE1hbmFnZW1lbnQgVW5pdCAoUE1VKS4KLSAqCi0gKiAgIChDKSBDb3B5cmlnaHQgMjAwMCwgUyBBIE1jQ29ubmVsbCAgKHNhbWNjb25uQGNvdHcuY29tKQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFBNVV9PRkYgICAweDAwMDUwMDAwICAvKiBPZmZzZXQgZnJvbSBJT19TVEFSVCB0byB0aGUgUE1VIHJlZ2lzdGVycy4gKi8KLQotLyogSU9fU1RBUlQgYW5kIElPX0JBU0UgYXJlIGRlZmluZWQgaW4gaGFyZHdhcmUuaCAqLwotCi0jZGVmaW5lIFBNVV9TVEFSVCAoSU9fU1RBUlQgKyBQTVVfT0ZGKSAgLyogUGh5c2ljYWwgYWRkci4gb2YgdGhlIFBNVSByZWcuICovCi0jZGVmaW5lIFBNVV9CQVNFICAoSU9fQkFTRSAgKyBQTVVfT0ZGKSAgLyogVmlydHVhbCBhZGRyLiBvZiB0aGUgUE1VIHJlZy4gKi8KLQotCi0vKiBEZWZpbmUgdGhlIFBNVSByZWdpc3RlcnMgZm9yIHVzZSBieSBkZXZpY2UgZHJpdmVycyBhbmQgdGhlIGtlcm5lbC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICB1bnNpZ25lZCBpbnQgQ1VSUkVOVDsgIC8qIEN1cnJlbnQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotICAgICB1bnNpZ25lZCBpbnQgTkVYVDsgICAgIC8qIE5leHQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotICAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ7Ci0gICAgIHVuc2lnbmVkIGludCBSVU47ICAgICAgLyogUnVuIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLSAgICAgdW5zaWduZWQgaW50IENPTU07ICAgICAvKiBDb25maWd1cmF0aW9uIGNvbW1hbmQgcmVnaXN0ZXIgKi8KLSAgICAgdW5zaWduZWQgaW50IFNEUkFNOyAgICAvKiBTRFJBTSBjb25maWd1cmF0aW9uIGJ5cGFzcyByZWdpc3RlciAqLwotfSBwbXVfaW50ZXJmYWNlOwotCi0jZGVmaW5lIFBNVSAoKHZvbGF0aWxlIHBtdV9pbnRlcmZhY2UgKikoUE1VX0JBU0UpKQotCi0KLS8qIE1hY3JvJ3MgZm9yIHJlYWRpbmcgdGhlIGNvbW1vbiByZWdpc3RlciBmaWVsZHMuICovCi0KLSNkZWZpbmUgR0VUX1RSQU5TT1AocmVnKSAgKChyZWcgPj4gMjUpICYgMHgwMykgLyogQml0cyAyNi0yNSAqLwotI2RlZmluZSBHRVRfT1NDRU4ocmVnKSAgICAoKHJlZyA+PiAxNikgJiAweDAxKQotI2RlZmluZSBHRVRfT1NDTVVYKHJlZykgICAoKHJlZyA+PiAxNSkgJiAweDAxKQotI2RlZmluZSBHRVRfUExMTVVMKHJlZykgICAoKHJlZyA+PiAgOSkgJiAweDNmKSAvKiBCaXRzIDE0LTkgKi8KLSNkZWZpbmUgR0VUX1BMTEVOKHJlZykgICAgKChyZWcgPj4gIDgpICYgMHgwMSkKLSNkZWZpbmUgR0VUX1BMTE1VWChyZWcpICAgKChyZWcgPj4gIDcpICYgMHgwMSkKLSNkZWZpbmUgR0VUX0JDTEtfRElWKHJlZykgKChyZWcgPj4gIDMpICYgMHgwMykgLyogQml0cyA0LTMgKi8KLSNkZWZpbmUgR0VUX1NEUkJfU0VMKHJlZykgKChyZWcgPj4gIDIpICYgMHgwMSkKLSNkZWZpbmUgR0VUX1NEUkZfU0VMKHJlZykgKChyZWcgPj4gIDEpICYgMHgwMSkKLSNkZWZpbmUgR0VUX0ZBU1RCVVMocmVnKSAgKHJlZyAmIDB4MSkKLQotLyogQ0ZHX05FWFQgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBDRkdfTkVYVF9DTE9DS1JFQ09WRVJZICgoUE1VLT5ORVhUID4+IDE4KSAmIDB4N2YpICAgLyogQml0cyAyNC0xOCAqLwotI2RlZmluZSBDRkdfTkVYVF9JTlRSRVQgICAgICAgICgoUE1VLT5ORVhUID4+IDE3KSAmIDB4MDEpCi0jZGVmaW5lIENGR19ORVhUX1NEUl9TVE9QICAgICAgKChQTVUtPk5FWFQgPj4gIDYpICYgMHgwMSkKLSNkZWZpbmUgQ0ZHX05FWFRfU1lTQ0xLRU4gICAgICAoKFBNVS0+TkVYVCA+PiAgNSkgJiAweDAxKQotCi0vKiBVc2VmdWwgZmllbGQgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IHRoZQotICogQ0ZHX05FWFQgYW5kIENGR19SVU4gcmVnaXN0ZXJzLgotICovCi0KLSNkZWZpbmUgVFJBTlNPUF9OT1AgICAgICAwPDwyNSAgLyogTk9DSEFOR0VfTk9TVEFMTCAqLwotI2RlZmluZSBOT0NIQU5HRV9TVEFMTCAgIDE8PDI1Ci0jZGVmaW5lIENIQU5HRV9OT1NUQUxMICAgMjw8MjUKLSNkZWZpbmUgQ0hBTkdFX1NUQUxMICAgICAzPDwyNQotCi0jZGVmaW5lIElOVFJFVCAgICAgICAgICAgMTw8MTcKLSNkZWZpbmUgT1NDRU4gICAgICAgICAgICAxPDwxNgotI2RlZmluZSBPU0NNVVggICAgICAgICAgIDE8PDE1Ci0KLS8qIFBMTCBmcmVxdWVuY2llcyAqLwotCi0jZGVmaW5lIFBMTE1VTF8wICAgICAgICAgMDw8OSAgICAgICAgIC8qICAzLjY4NjQgTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8xICAgICAgICAgMTw8OSAgICAgICAgIC8qICA/Pz8/Pz8gTUh6ICovCi0jZGVmaW5lIFBMTE1VTF81ICAgICAgICAgNTw8OSAgICAgICAgIC8qICAxOC40MzIgTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8xMCAgICAgICAxMDw8OSAgICAgICAgIC8qICAzNi44NjQgTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8xOCAgICAgICAxODw8OSAgICAgICAgIC8qICA/Pz8/Pz8gTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8yMCAgICAgICAyMDw8OSAgICAgICAgIC8qICA3My43MjggTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8zMiAgICAgICAzMjw8OSAgICAgICAgIC8qICA/Pz8/Pz8gTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8zNSAgICAgICAzNTw8OSAgICAgICAgIC8qIDEyOS4wMjQgTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8zNiAgICAgICAzNjw8OSAgICAgICAgIC8qICA/Pz8/Pz8gTUh6ICovCi0jZGVmaW5lIFBMTE1VTF8zOSAgICAgICAzOTw8OSAgICAgICAgIC8qICA/Pz8/Pz8gTUh6ICovCi0jZGVmaW5lIFBMTE1VTF80MCAgICAgICA0MDw8OSAgICAgICAgIC8qIDE0Ny40NTYgTUh6ICovCi0KLS8qIENsb2NrIHJlY292ZXJ5IHRpbWVzICovCi0KLSNkZWZpbmUgQ1JDTE9DS18xICAgICAgICAxPDwxOAotI2RlZmluZSBDUkNMT0NLXzIgICAgICAgIDI8PDE4Ci0jZGVmaW5lIENSQ0xPQ0tfNCAgICAgICAgNDw8MTgKLSNkZWZpbmUgQ1JDTE9DS184ICAgICAgICA4PDwxOAotI2RlZmluZSBDUkNMT0NLXzE2ICAgICAgMTY8PDE4Ci0jZGVmaW5lIENSQ0xPQ0tfMzIgICAgICAzMjw8MTgKLSNkZWZpbmUgQ1JDTE9DS182MyAgICAgIDYzPDwxOAotI2RlZmluZSBDUkNMT0NLXzEyNyAgICAxMjc8PDE4Ci0KLSNkZWZpbmUgUExMRU4gICAgICAgICAgICAxPDw4Ci0jZGVmaW5lIFBMTE1VWCAgICAgICAgICAgMTw8NwotI2RlZmluZSBTRFJfU1RPUCAgICAgICAgIDE8PDYKLSNkZWZpbmUgU1lTQ0xLRU4gICAgICAgICAxPDw1Ci0KLSNkZWZpbmUgQkNMS19ESVZfNCAgICAgICAyPDwzCi0jZGVmaW5lIEJDTEtfRElWXzIgICAgICAgMTw8MwotI2RlZmluZSBCQ0xLX0RJVl8xICAgICAgIDA8PDMKLQotI2RlZmluZSBTRFJCX1NFTCAgICAgICAgIDE8PDIKLSNkZWZpbmUgU0RSRl9TRUwgICAgICAgICAxPDwxCi0jZGVmaW5lIEZBU1RCVVMgICAgICAgICAgMTw8MAotCi0KLS8qIENGR19TRFJBTSAqLwotCi0jZGVmaW5lIFNEUlJFRkZRICAgICAgICAgMTw8MCAgLyogT25seSBpZiBTRFJTVE9QUlEgaXMgbm90IHNldC4gKi8KLSNkZWZpbmUgU0RSUkVGQUNLICAgICAgICAxPDwxICAvKiBSZWFkLW9ubHkgKi8KLSNkZWZpbmUgU0RSU1RPUFJRICAgICAgICAxPDwyICAvKiBPbmx5IGlmIFNEUlJFRkZRIGlzIG5vdCBzZXQuICovCi0jZGVmaW5lIFNEUlNUT1BBQ0sgICAgICAgMTw8MyAgLyogUmVhZC1vbmx5ICovCi0jZGVmaW5lIFBJQ0VOICAgICAgICAgICAgMTw8NCAgLyogRW5hYmxlIENvLXByb2Nlc29yICovCi0jZGVmaW5lIFBJQ1RFU1QgICAgICAgICAgMTw8NQotCi0jZGVmaW5lIEdFVF9TRFJSRUZGUSAgICAoKFBNVS0+U0RSQU0gPj4gMCkgJiAweDAxKQotI2RlZmluZSBHRVRfU0RSUkVGQUNLICAgKChQTVUtPlNEUkFNID4+IDEpICYgMHgwMSkgLyogUmVhZC1vbmx5ICovCi0jZGVmaW5lIEdFVF9TRFJTVE9QUlEgICAoKFBNVS0+U0RSQU0gPj4gMikgJiAweDAxKQotI2RlZmluZSBHRVRfU0RSU1RPUEFDSyAgKChQTVUtPlNEUkFNID4+IDMpICYgMHgwMSkgLyogUmVhZC1vbmx5ICovCi0jZGVmaW5lIEdFVF9QSUNFTiAgICAgICAoKFBNVS0+U0RSQU0gPj4gNCkgJiAweDAxKQotI2RlZmluZSBHRVRfUElDVEVTVCAgICAgKChQTVUtPlNEUkFNID4+IDUpICYgMHgwMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3NlcmlhbC5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvc2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzA1ZTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvc2VyaWFsLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgUm9iIFNjb3R0IChyc2NvdHRAbXRyb2IuZmRucy5uZXQpCi0gKiAgICAgICAgICAgICAgICAgICAgU3RldmUgSGlsbCAoc2poaWxsQGNvdHcuY29tKQotICoKLSAqIENoYW5nZWxvZzoKLSAqICAwMy0yMC0yMDAwICBTSkggICAgIENyZWF0ZWQKLSAqICAwMy0yNi0yMDAwICBTSkggICAgIEFkZGVkIGZsYWdzIGZvciBzZXJpYWwgcG9ydHMKLSAqICAwMy0yNy0yMDAwICBTSkggICAgIENvcnJlY3RlZCBCQVNFX0JBVUQgdmFsdWUKLSAqICAwNC0xNC0yMDAwICBSUyAgICAgIE1hZGUgcmVnaXN0ZXIgYWRkciBkZXBlbmRlbnQgb24gSU9fQkFTRQotICogIDA1LTAzLTIwMDAgIFNKSCAgICAgQ29tcGxldGUgcmV3cml0ZQotICogIDA1LTA5LTIwMDAJU0pICVN0cmlwcGVkIG91dCBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgc2VyaWFsIHN0dWZmCi0gKiAgICAgICAgICAgICAgICAgICAgICBhbmQgcGxhY2VkIGl0IGluIGEgc2VwYXJhdGUgZmlsZQotICogIDA3LTI4LTIwMDAJU0pICU1vdmVkIGJhc2UgYmF1ZCByYXRlIHZhcmlhYmxlCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9TRVJJQUxfSAotI2RlZmluZSBfX0FTTV9BUkNIX1NFUklBTF9ICi0KLS8qCi0gKiBUaGlzIGFzc3VtZXMgeW91IGhhdmUgYSAzLjY4NjQgTUh6IGNsb2NrIGZvciB5b3VyIFVBUlQuCi0gKi8KLSNkZWZpbmUgQkFTRV9CQVVECTM2ODY0MDAKLQotLyoKLSAqIFN0YW5kYXJkIENPTSBmbGFncwotICovCi0jZGVmaW5lIFNURF9DT01fRkxBR1MgKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1QpCi0KLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JLyogTUFHSUMgVUFSVCBDTEsgICBQT1JUICAgICAgIElSUSAgICAgRkxBR1MgKi8JCQlcCi0JeyAwLCBCQVNFX0JBVUQsIFVBUlQxX0JBU0UsIElSUV9VQVJUXzEsIFNURF9DT01fRkxBR1MgfSwgIC8qIHR0eUxVMCAqLyBcCi0JeyAwLCBCQVNFX0JBVUQsIFVBUlQyX0JBU0UsIElSUV9VQVJUXzIsIFNURF9DT01fRkxBR1MgfSwgIC8qIHR0eUxVMSAqLyBcCi0KLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9zZXJpYWxfbDcyMDAuaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3NlcmlhbF9sNzIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVmMWM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3NlcmlhbF9sNzIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9zZXJpYWxfbDcyMDAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBTdGV2ZW4gSGlsbCAoc2poaWxsQGNvdHcuY29tKQotICoKLSAqIENoYW5nZWxvZzoKLSAqICAwNS0wOS0yMDAwCVNKSAlDcmVhdGVkCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9TRVJJQUxfTDcyMDBfSAotI2RlZmluZSBfX0FTTV9BUkNIX1NFUklBTF9MNzIwMF9ICi0KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgotCi0vKgotICogVGhpcyBhc3N1bWVzIHlvdSBoYXZlIGEgMy42ODY0IE1IeiBjbG9jayBmb3IgeW91ciBVQVJULgotICovCi0jZGVmaW5lIEJBU0VfQkFVRCAzNjg2NDAwCi0KLS8qCi0gKiBVQVJUIGJhc2UgcmVnaXN0ZXIgYWRkcmVzc2VzCi0gKi8KLSNkZWZpbmUgVUFSVDFfQkFTRQkoSU9fQkFTRSArIDB4MDAwNDQwMDApCi0jZGVmaW5lIFVBUlQyX0JBU0UJKElPX0JBU0UgKyAweDAwMDQ1MDAwKQotCi0vKgotICogVUFSVCByZWdpc3RlciBvZmZzZXRzCi0gKi8KLSNkZWZpbmUgVUFSVERSCQkJMHgwMAkvKiBUeC9SeCBkYXRhICovCi0jZGVmaW5lIFJYU1RBVAkJCTB4MDQJLyogUnggc3RhdHVzICovCi0jZGVmaW5lIEhfVUJSTENSCQkweDA4CS8qIG1vZGUgcmVnaXN0ZXIgaGlnaCAqLwotI2RlZmluZSBNX1VCUkxDUgkJMHgwQwkvKiBtb2RlIHJlZyBtaWQgKE1TQiBvZiBiYXVkKSovCi0jZGVmaW5lIExfVUJSTENSCQkweDEwCS8qIG1vZGUgcmVnIGxvdyAoTFNCIG9mIGJhdWQpKi8KLSNkZWZpbmUgVUFSVENPTgkJCTB4MTQJLyogY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBVQVJURkxHCQkJMHgxOAkvKiBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRJTlRTVEFUCQkweDFDCS8qIEZJRk8gSVJRIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBVQVJUSU5UTUFTSwkJMHgyMAkvKiBGSUZPIElSUSBtYXNrIHJlZ2lzdGVyICovCi0KLS8qCi0gKiBVQVJUIGJhdWQgcmF0ZSByZWdpc3RlciB2YWx1ZXMKLSAqLwotI2RlZmluZSBCUl8xMTAJCQkweDgyNwotI2RlZmluZSBCUl8xMjAwCQkJMHgwNmUKLSNkZWZpbmUgQlJfMjQwMAkJCTB4MDVmCi0jZGVmaW5lIEJSXzQ4MDAJCQkweDAyZgotI2RlZmluZSBCUl85NjAwCQkJMHgwMTcKLSNkZWZpbmUgQlJfMTQ0MDAJCTB4MDBmCi0jZGVmaW5lIEJSXzE5MjAwCQkweDAwYgotI2RlZmluZSBCUl8zODQwMAkJMHgwMDUKLSNkZWZpbmUgQlJfNTc2MDAJCTB4MDAzCi0jZGVmaW5lIEJSXzc2ODAwIAkJMHgwMDIKLSNkZWZpbmUgQlJfMTE1MjAwCQkweDAwMQotCi0vKgotICogUmVjZWl2ZXIgc3RhdHVzIHJlZ2lzdGVyIChSWFNUQVQpIG1hc2sgdmFsdWVzCi0gKi8KLSNkZWZpbmUgUlhTVEFUX05PX0VSUgkJMHgwMAkvKiBObyBlcnJvciAqLwotI2RlZmluZSBSWFNUQVRfRlJNX0VSUgkJMHgwMQkvKiBGcmFtaW5nIGVycm9yICovCi0jZGVmaW5lIFJYU1RBVF9QQVJfRVJSCQkweDAyCS8qIFBhcml0eSBlcnJvciAqLwotI2RlZmluZSBSWFNUQVRfT1ZSX0VSUgkJMHgwNAkvKiBPdmVycnVuIGVycm9yICovCi0KLS8qCi0gKiBIaWdoIGJ5dGUgb2YgVUFSVCBiaXQgcmF0ZSBhbmQgbGluZSBjb250cm9sIHJlZ2lzdGVyIChIX1VCUkxDUikgdmFsdWVzCi0gKi8KLSNkZWZpbmUgVUJSTENSX0JSSwkJMHgwMQkvKiBnZW5lcmF0ZSBicmVhayBvbiB0eCAqLwotI2RlZmluZSBVQlJMQ1JfUEVOCQkweDAyCS8qIGVuYWJsZSBwYXJpdHkgKi8KLSNkZWZpbmUgVUJSTENSX1BESVMJCTB4MDAJLyogZGlzYWJsZSBwYXJpdHkgKi8KLSNkZWZpbmUgVUJSTENSX0VWRU4JCTB4MDQJLyogMT0gZXZlbiBwYXJpdHksMCA9IG9kZCBwYXJpdHkgKi8KLSNkZWZpbmUgVUJSTENSX1NUUDIJCTB4MDgJLyogdHJhbnNtaXQgMiBzdG9wIGJpdHMgKi8KLSNkZWZpbmUgVUJSTENSX0ZJRk8JCTB4MTAJLyogZW5hYmxlIEZJRk8gKi8KLSNkZWZpbmUgVUJSTENSX0xFTjUJCTB4NjAJLyogd29yZCBsZW5ndGg1ICovCi0jZGVmaW5lIFVCUkxDUl9MRU42CQkweDQwCS8qIHdvcmQgbGVuZ3RoNiAqLwotI2RlZmluZSBVQlJMQ1JfTEVONwkJMHgyMAkvKiB3b3JkIGxlbmd0aDcgKi8KLSNkZWZpbmUgVUJSTENSX0xFTjgJCTB4MDAJLyogd29yZCBsZW5ndGg4ICovCi0KLS8qCi0gKiBVQVJUIGNvbnRyb2wgcmVnaXN0ZXIgKFVBUlRDT04pIHZhbHVlcwotICovCi0jZGVmaW5lIFVBUlRDT05fVUFSVEVOCQkweDAxCS8qIEVuYWJsZSBVQVJUICovCi0jZGVmaW5lIFVBUlRDT05fRE1BT05FUlIJMHgwOAkvKiBNYXNrIFJ4RG1hUnEgd2hlbiBlcnJvcnMgb2NjdXIgKi8KLQotLyoKLSAqIFVBUlQgZmxhZyByZWdpc3RlciAoVUFSVEZMRykgbWFzayB2YWx1ZXMKLSAqLwotI2RlZmluZSBVQVJURkxHX1VUWEZGCQkweDIwCS8qIFRyYW5zbWl0IEZJRk8gZnVsbCAqLwotI2RlZmluZSBVQVJURkxHX1VSWEZFCQkweDEwCS8qIFJlY2VpdmVyIEZJRk8gZW1wdHkgKi8KLSNkZWZpbmUgVUFSVEZMR19VQlVTWQkJMHgwOAkvKiBUcmFuc21pdHRlciBidXN5ICovCi0jZGVmaW5lIFVBUlRGTEdfRENECQkweDA0CS8qIERhdGEgY2FycmllciBkZXRlY3QgKi8KLSNkZWZpbmUgVUFSVEZMR19EU1IJCTB4MDIJLyogRGF0YSBzZXQgcmVhZHkgKi8KLSNkZWZpbmUgVUFSVEZMR19DVFMJCTB4MDEJLyogQ2xlYXIgdG8gc2VuZCAqLwotCi0vKgotICogVUFSVCBpbnRlcnJ1cHQgc3RhdHVzL2NsZWFyIHJlZ2lzdGVycyAoVUFSVElOVFNUQVQvQ0xSKSB2YWx1ZXMKLSAqLwotI2RlZmluZSBVQVJUX1RYSU5UCQkweDAxCS8qIFRYIGludGVycnVwdCAqLwotI2RlZmluZSBVQVJUX1JYSU5UCQkweDAyCS8qIFJYIGludGVycnVwdCAqLwotI2RlZmluZSBVQVJUX1JYRVJSSU5UCQkweDA0CS8qIFJYIGVycm9yIGludGVycnVwdCAqLwotI2RlZmluZSBVQVJUX01TSU5UCQkweDA4CS8qIE1vZGVtIFN0YXR1cyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgVUFSVF9VRElOVAkJMHgxMAkvKiBVQVJUIERpc2FibGVkIGludGVycnVwdCAqLwotI2RlZmluZSBVQVJUX0FMTElSUVMJCTB4MWYJLyogQWxsIGludGVycnVwdHMgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9zaWIuaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3NpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjU3Mjg3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3NpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICBhcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9zaWIuaAotICoKLSAqICBSZWdpc3RlcnMgYW5kIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBTZXJpYWwgSW50ZXJmYWNlIEJ1cy4KLSAqCi0gKiAgKEMpIENvcHlyaWdodCAyMDAwLCBTIEEgTWNDb25uZWxsICAoc2FtY2Nvbm5AY290dy5jb20pCi0gKgotICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKLSAqICBtb3JlIGRldGFpbHMuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU0lCX09GRiAgIDB4MDAwNDAwMDAgIC8qIE9mZnNldCBmcm9tIElPX1NUQVJUIHRvIHRoZSBTSUIgcmVnJ3MuICovCi0KLS8qIElPX1NUQVJUIGFuZCBJT19CQVNFIGFyZSBkZWZpbmVkIGluIGhhcmR3YXJlLmggKi8KLQotI2RlZmluZSBTSUJfU1RBUlQgKElPX1NUQVJUICsgU0lCX09GRikgLyogUGh5c2ljYWwgYWRkciBvZiB0aGUgU0lCIHJlZy4gKi8KLSNkZWZpbmUgU0lCX0JBU0UgIChJT19CQVNFICArIFNJQl9PRkYpIC8qIFZpcnR1YWwgYWRkciBvZiB0aGUgU0lCIHJlZy4gICovCi0KLS8qIE9mZnNldHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFNJQiBmb3IgYWxsIHRoZSByZWdpc3RlcnMuICovCi0KLS8qIERlZmluZSB0aGUgU0lCIHJlZ2lzdGVycyBmb3IgdXNlIGJ5IGRldmljZSBkcml2ZXJzIGFuZCB0aGUga2VybmVsLiAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgICB1bnNpZ25lZCBpbnQgTUNDUjsgICAgLyogU0lCIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgIE9mZnNldDogMHgwMCAqLwotICAgICB1bnNpZ25lZCBpbnQgUkVTMTsgICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldDogMHgwNCAqLwotICAgICB1bnNpZ25lZCBpbnQgTUNEUjA7ICAgLyogU0lCIERhdGEgUmVnaXN0ZXIgMCAgICAgICAgICAgIE9mZnNldDogMHgwOCAqLwotICAgICB1bnNpZ25lZCBpbnQgTUNEUjE7ICAgLyogU0lCIERhdGEgUmVnaXN0ZXIgMSAgICAgICAgICAgIE9mZnNldDogMHgwYyAqLwotICAgICB1bnNpZ25lZCBpbnQgTUNEUjI7ICAgLyogU0lCIERhdGEgUmVnaXN0ZXIgMiAoVUNCMXgwMCkgIE9mZnNldDogMHgxMCAqLwotICAgICB1bnNpZ25lZCBpbnQgUkVTMjsgICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldDogMHgxNCAqLwotICAgICB1bnNpZ25lZCBpbnQgTUNTUjsgICAgLyogU0lCIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgIE9mZnNldDogMHgxOCAqLwotfSBTSUJfSW50ZXJmYWNlOwotCi0jZGVmaW5lIFNJQiAoKHZvbGF0aWxlIFNJQl9JbnRlcmZhY2UgKikgKFNJQl9CQVNFKSkKLQotLyogTUNDUiAqLwotCi0jZGVmaW5lIElOVEVSTkFMX0ZSRVEgICA5MjE2MDAwICAvKiBIZXJ0eiAqLwotI2RlZmluZSBBVURJT19GUkVRICAgICAgICAgNTAwMCAgLyogSGVydHogKi8KLSNkZWZpbmUgVEVMRUNPTV9GUkVRICAgICAgIDUwMDAgIC8qIEhlcnR6ICovCi0KLSNkZWZpbmUgQVVESU9fRElWSURFICAgIChJTlRFUk5BTF9GUkVRIC8gKDMyICogQVVESU9fRlJFUSkpCi0jZGVmaW5lIFRFTEVDT01fRElWSURFICAoSU5URVJOQUxfRlJFUSAvICgzMiAqIFRFTEVDT01fRlJFUSkpCi0KLSNkZWZpbmUgTUNDUl9BU0Q1NyAgICAgIEFVRElPX0RJVklERQotI2RlZmluZSBNQ0NSX1RTRDU3ICAgICAgKFRFTEVDT01fRElWSURFIDw8IDgpCi0jZGVmaW5lIE1DQ1JfTUNFICAgICAgICAoMSA8PCAxNikgICAgICAgICAgICAgLyogU0lCIGVuYWJsZSAqLwotI2RlZmluZSBNQ0NSX0VDUyAgICAgICAgKDEgPDwgMTcpICAgICAgICAgICAgIC8qIEV4dGVybmFsIENsb2NrIFNlbGVjdCAqLwotI2RlZmluZSBNQ0NSX0FETSAgICAgICAgKDEgPDwgMTgpICAgICAgICAgICAgIC8qIEEvRCBEYXRhIFNhbXBsaW5nICovCi0jZGVmaW5lIE1DQ1JfUE1DICAgICAgICAoMSA8PCAyNikgICAgICAgICAgICAgLyogUElOIE11bHRpcGxleGVyIENvbnRyb2wgKi8KLQotCi0jZGVmaW5lIEdFVF9BU0QgKChTSUItPk1DQ1IgPj4gIDApICYgMHgzZikgLyogQXVkaW8gU2FtcGxlIFJhdGUgRGl2LiAqLwotI2RlZmluZSBHRVRfVFNEICgoU0lCLT5NQ0NSID4+ICA4KSAmIDB4M2YpIC8qIFRlbGNvbSBTYW1wbGUgUmF0ZSBEaXYuICovCi0jZGVmaW5lIEdFVF9NQ0UgKChTSUItPk1DQ1IgPj4gMTYpICYgMHgwMSkgLyogU0lCIEVuYWJsZSAqLwotI2RlZmluZSBHRVRfRUNTICgoU0lCLT5NQ0NSID4+IDE3KSAmIDB4MDEpIC8qIEV4dGVybmFsIENsb2NrIFNlbGVjdCAqLwotI2RlZmluZSBHRVRfQURNICgoU0lCLT5NQ0NSID4+IDE4KSAmIDB4MDEpIC8qIEEvRCBEYXRhIFNhbXBsaW5nIE1vZGUgKi8KLSNkZWZpbmUgR0VUX1RUTSAoKFNJQi0+TUNDUiA+PiAxOSkgJiAweDAxKSAvKiBUZWxjbyBUcmFucy4gRklGTyBJIG1hc2sgKi8gCi0jZGVmaW5lIEdFVF9UUk0gKChTSUItPk1DQ1IgPj4gMjApICYgMHgwMSkgLyogVGVsY28gUmVjdi4gRklGTyBJIG1hc2sgKi8KLSNkZWZpbmUgR0VUX0FUTSAoKFNJQi0+TUNDUiA+PiAyMSkgJiAweDAxKSAvKiBBdWRpbyBUcmFucy4gRklGTyBJIG1hc2sgKi8gCi0jZGVmaW5lIEdFVF9BUk0gKChTSUItPk1DQ1IgPj4gMjIpICYgMHgwMSkgLyogQXVkaW8gUmVjdi4gRklGTyBJIG1hc2sgKi8KLSNkZWZpbmUgR0VUX0xCTSAoKFNJQi0+TUNDUiA+PiAyMykgJiAweDAxKSAvKiBMb29wIEJhY2sgTW9kZSAqLwotI2RlZmluZSBHRVRfRUNQICgoU0lCLT5NQ0NSID4+IDI0KSAmIDB4MDMpIC8qIEV4dGVybi4gQ2xjayBQcmVzY2FsZSBzZWwgKi8KLSNkZWZpbmUgR0VUX1BNQyAoKFNJQi0+TUNDUiA+PiAyNikgJiAweDAxKSAvKiBQSU4gTXVsdGlwbGV4ZXIgQ29udHJvbCAqLwotI2RlZmluZSBHRVRfRVJJICgoU0lCLT5NQ0NSID4+IDI3KSAmIDB4MDEpIC8qIEV4dGVybmFsIFJlYWQgSW50ZXJydXB0ICovCi0jZGVmaW5lIEdFVF9FV0kgKChTSUItPk1DQ1IgPj4gMjgpICYgMHgwMSkgLyogRXh0ZXJuYWwgV3JpdGUgSW50ZXJydXB0ICovCi0KLS8qIE1DRFIwICovCi0KLSNkZWZpbmUgQVVESU9fUkVDViAgICAgKChTSUItPk1DRFIwID4+IDQpICYgMHhmZmYpCi0jZGVmaW5lIEFVRElPX1dSSVRFKHYpICgoU0lCLT5NQ0RSMCA9ICh2ICYgMHhmZmYpIDw8IDQpKQotCi0vKiBNQ0RSMSAqLwotCi0jZGVmaW5lIFRFTEVDT01fUkVDViAgICAgKChTSUItPk1DRFIxID4+IDIpICYgMDMyZmZmKQotI2RlZmluZSBURUxFQ09NX1dSSVRFKHYpICgoU0lCLT5NQ0RSMSA9ICh2ICYgMHgzZmZmKSA8PCAyKSkKLQotCi0vKiBNQ1NSICovCi0KLSNkZWZpbmUgTUNTUl9BVFUgKDEgPDwgNCkgIC8qIEF1ZGlvIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KLSNkZWZpbmUgTUNTUl9BUk8gKDEgPDwgNSkgIC8qIEF1ZGlvIFJlY2VpdmUgIEZJRk8gVW5kZXJydW4gKi8KLSNkZWZpbmUgTUNTUl9UVFUgKDEgPDwgNikgIC8qIFRFTEVDT00gVHJhbnNtaXQgRklGTyBVbmRlcnJ1biAqLwotI2RlZmluZSBNQ1NSX1RSTyAoMSA8PCA3KSAgLyogVEVMRUNPTSBSZWNlaXZlICBGSUZPIFVuZGVycnVuICovCi0KLSNkZWZpbmUgTUNTUl9DTEVBUl9VTkRFUlVOX0JJVFMgKE1DU1JfQVRVIHwgTUNTUl9BUk8gfCBNQ1NSX1RUVSB8IE1DU1JfVFJPKQotCi0KLSNkZWZpbmUgR0VUX0FUUyAoKFNJQi0+TUNTUiA+PiAgMCkgJiAweDAxKSAvKiBBdWRpbyBUcmFuc21pdCBGSUZPIFNlcnZpY2UgUmVxKi8KLSNkZWZpbmUgR0VUX0FSUyAoKFNJQi0+TUNTUiA+PiAgMSkgJiAweDAxKSAvKiBBdWRpbyBSZWN2IEZJRk8gU2VydmljZSBSZXF1ZXN0Ki8KLSNkZWZpbmUgR0VUX1RUUyAoKFNJQi0+TUNTUiA+PiAgMikgJiAweDAxKSAvKiBURUxFQ09NIFRyYW5zbWl0IEZJRk8gIEZsYWcgKi8KLSNkZWZpbmUgR0VUX1RSUyAoKFNJQi0+TUNTUiA+PiAgMykgJiAweDAxKSAvKiBURUxFQ09NIFJlY3YgRklGTyBTZXJ2aWNlIFJlcS4gKi8KLSNkZWZpbmUgR0VUX0FUVSAoKFNJQi0+TUNTUiA+PiAgNCkgJiAweDAxKSAvKiBBdWRpbyBUcmFuc21pdCBGSUZPIFVuZGVycnVuICovCi0jZGVmaW5lIEdFVF9BUk8gKChTSUItPk1DU1IgPj4gIDUpICYgMHgwMSkgLyogQXVkaW8gUmVjZWl2ZSAgRklGTyBVbmRlcnJ1biAqLwotI2RlZmluZSBHRVRfVFRVICgoU0lCLT5NQ1NSID4+ICA2KSAmIDB4MDEpIC8qIFRFTEVDT00gVHJhbnNtaXQgRklGTyBVbmRlcnJ1biAqLwotI2RlZmluZSBHRVRfVFJPICgoU0lCLT5NQ1NSID4+ICA3KSAmIDB4MDEpIC8qIFRFTEVDT00gUmVjZWl2ZSAgRklGTyBVbmRlcnJ1biAqLwotI2RlZmluZSBHRVRfQU5GICgoU0lCLT5NQ1NSID4+ICA4KSAmIDB4MDEpIC8qIEF1ZGlvIFRyYW5zbWl0IEZJRk8gbm90IGZ1bGwgKi8KLSNkZWZpbmUgR0VUX0FORSAoKFNJQi0+TUNTUiA+PiAgOSkgJiAweDAxKSAvKiBBdWRpbyBSZWNlaXZlIEZJRk8gbm90IGVtcHR5ICovCi0jZGVmaW5lIEdFVF9UTkYgKChTSUItPk1DU1IgPj4gMTApICYgMHgwMSkgLyogVGVsZWNvbSBUcmFuc21pdCBGSUZPIG5vdCBmdWxsICovCi0jZGVmaW5lIEdFVF9UTkUgKChTSUItPk1DU1IgPj4gMTEpICYgMHgwMSkgLyogVGVsZWNvbSBSZWNlaXZlIEZJRk8gbm90IGVtcHR5ICovCi0jZGVmaW5lIEdFVF9DV0MgKChTSUItPk1DU1IgPj4gMTIpICYgMHgwMSkgLyogQ29kZWMgV3JpdGUgQ29tcGxldGUgKi8KLSNkZWZpbmUgR0VUX0NSQyAoKFNJQi0+TUNTUiA+PiAxMykgJiAweDAxKSAvKiBDb2RlYyBSZWFkIENvbXBsZXRlICovCi0jZGVmaW5lIEdFVF9BQ0UgKChTSUItPk1DU1IgPj4gMTQpICYgMHgwMSkgLyogQXVkaW8gQ29kZWMgRW5hYmxlZCAqLwotI2RlZmluZSBHRVRfVENFICgoU0lCLT5NQ1NSID4+IDE1KSAmIDB4MDEpIC8qIFRlbGVjb20gQ29kZWMgRW5hYmxlZCAqLwotCi0vKiBNQ0RSMiAqLwotCi0jZGVmaW5lIE1DRFIyX3JXICAgICAgICAgICAgICAgKDEgPDwgMTYpCi0KLSNkZWZpbmUgV1JJVEVfTUNEUjIocmVnLCBkYXRhKSAoU0lCLT5NQ0RSMiA9KChyZWc8PDE3KXxNQ0RSMl9yV3woZGF0YSYweGZmZmYpKSkKLSNkZWZpbmUgTUNEUjJfV1JJVEVfQ09NUExFVEUgICBHRVRfQ1dDCi0KLSNkZWZpbmUgSU5JVElBVEVfTUNEUjJfUkVBRChyZWcpIChTSUItPk1DRFIyID0gKHJlZyA8PCAxNykpCi0jZGVmaW5lIE1DRFIyX1JFQURfQ09NUExFVEUgICAgICBHRVRfQ1JDCi0jZGVmaW5lIE1DRFIyX1JFQUQgICAgICAgICAgICAgICAoU0lCLT5NQ0RSMiAmIDB4ZmZmZikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3N5cy1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvc3lzLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzI5YTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvc3lzLWNsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvc3lzLWNsb2NrLmgKLSAqCi0gKiAgIFJlZ2lzdGVycyBhbmQgIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBMNzIwMCBMaW5rLVVwIFN5c3RlbXMKLSAqICAgU3lzdGVtIGNsb2Nrcy4KLSAqCi0gKiAgIChDKSBDb3B5cmlnaHQgMjAwMCwgUyBBIE1jQ29ubmVsbCAgKHNhbWNjb25uQGNvdHcuY29tKQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNZU19DTE9DS19PRkYgICAweDAwMDUwMDMwICAvKiBPZmZzZXQgZnJvbSBJT19TVEFSVC4gKi8KLQotLyogSU9fU1RBUlQgYW5kIElPX0JBU0UgYXJlIGRlZmluZWQgaW4gaGFyZHdhcmUuaCAqLwotCi0jZGVmaW5lIFNZU19DTE9DS19TVEFSVCAoSU9fU1RBUlQgKyBTWVNfQ0xPQ0tfT0ZGKSAgLyogUGh5c2ljYWwgYWRkcmVzcyAqLwotI2RlZmluZSBTWVNfQ0xPQ0tfQkFTRSAgKElPX0JBU0UgICsgU1lTX0NMT0NLX09GRikgIC8qIFZpcnR1YWwgYWRkcmVzcyAgKi8KLQotLyogRGVmaW5lIHRoZSBpbnRlcmZhY2UgdG8gdGhlIFNZU19DTE9DSyAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgICB1bnNpZ25lZCBpbnQgRU5BQkxFOwotICAgICB1bnNpZ25lZCBpbnQgRVNZTkM7Ci0gICAgIHVuc2lnbmVkIGludCBTRUxFQ1Q7Ci19IHN5c19jbG9ja19pbnRlcmZhY2U7Ci0KLSNkZWZpbmUgU1lTX0NMT0NLICAgKCh2b2xhdGlsZSBzeXNfY2xvY2tfaW50ZXJmYWNlICopKFNZU19DTE9DS19CQVNFKSkKLQotLy8jZGVmaW5lIENMT0NLX0VOICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoUE1VX0JBU0UrQ0xPQ0tfRU5fT0ZGKSkKLS8vI2RlZmluZSBDTE9DS19FU1lOQyAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKFBNVV9CQVNFK0NMT0NLX0VTWU5DX09GRikpCi0vLyNkZWZpbmUgQ0xPQ0tfU0VMICAgKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShQTVVfQkFTRStDTE9DS19TRUxfT0ZGKSkKLQotLyogU1lTX0NMT0NLIC0+IEVOQUJMRSAqLwotCi0jZGVmaW5lIFNZTl9FTiAgICAgICAgICAxPDwwCi0jZGVmaW5lIEIxOE1fRU4gICAgICAgICAxPDwxCi0jZGVmaW5lIENMSzNNNl9FTiAgICAgICAxPDwyCi0jZGVmaW5lIEJVQVJUX0VOICAgICAgICAxPDwzCi0jZGVmaW5lIENMSzE4TVVfRU4gICAgICAxPDw0Ci0jZGVmaW5lIEZJUl9FTiAgICAgICAgICAxPDw1Ci0jZGVmaW5lIE1JUk5fRU4gICAgICAgICAxPDw2Ci0jZGVmaW5lIFVBUlRNX0VOICAgICAgICAxPDw3Ci0jZGVmaW5lIFNJQkFEQ19FTiAgICAgICAxPDw4Ci0jZGVmaW5lIEFMVERfRU4gICAgICAgICAxPDw5Ci0jZGVmaW5lIENMQ0xLX0VOICAgICAgICAxPDwxMAotCi0vKiBTWVNfQ0xPQ0sgLT4gU0VMRUNUICovCi0KLSNkZWZpbmUgQ0xLMThNX0RJViAgICAgIDE8PDAKLSNkZWZpbmUgTUlSX1NFTCAgICAgICAgIDE8PDEKLSNkZWZpbmUgU1NQX1NFTCAgICAgICAgIDE8PDQKLSNkZWZpbmUgTU1fRElWICAgICAgICAgIDE8PDUKLSNkZWZpbmUgTU1fU0VMICAgICAgICAgIDE8PDYKLSNkZWZpbmUgQURDX1NFTF8yICAgICAgIDA8PDcKLSNkZWZpbmUgQURDX1NFTF80ICAgICAgIDE8PDcKLSNkZWZpbmUgQURDX1NFTF84ICAgICAgIDM8PDcKLSNkZWZpbmUgQURDX1NFTF8xNiAgICAgIDc8PDcKLSNkZWZpbmUgQURDX1NFTF8zMiAgICAgIDB4MGY8PDcKLSNkZWZpbmUgQURDX1NFTF82NCAgICAgIDB4MWY8PDcKLSNkZWZpbmUgQURDX1NFTF8xMjggICAgIDB4M2Y8PDcKLSNkZWZpbmUgQUxURF9TRUwgICAgICAgIDE8PDEzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGRkM2I2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFN0ZXZlIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKLSAqCi0gKiBDaGFuZ2Vsb2cKLSAqICAwMy0yMS0yMDAwICBTSkgJQ3JlYXRlZAotICogIDA0LTI2LTIwMDAgIFNKSAlGaXhlZCBmdW5jdGlvbnMKLSAqICAwNS0wMy0yMDAwICBTSkgJUmVtb3ZlZCB1c2FnZSBvZiBvYnNvbGV0ZSAnaW9tZC5oJwotICogIDA1LTMxLTIwMDAgIFNKSAlQcm9wZXJseSBpbXBsZW1lbnRlZCAnYXJjaF9pZGxlJwotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKLSNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCi17Ci0JKih1bnNpZ25lZCBsb25nICopKElPX0JBU0UgKyAweDUwMDA0KSA9IDE7CS8qIGlkbGUgbW9kZSAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKLXsKLQlpZiAobW9kZSA9PSAncycpIHsKLQkJY3B1X3Jlc2V0KDApOwotCX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC90aW1lLmggYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC90aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTc3MWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3RpbWUuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBSb2IgU2NvdHQgKHJzY290dEBtdHJvYi5mZG5zLm5ldCkKLSAqICAgICAgICAgICAgICAgICAgICBTdGV2ZSBIaWxsIChzamhpbGxAY290dy5jb20pCi0gKgotICogQ2hhbmdlbG9nOgotICogICAwMS0wMi0yMDAwCVJTCUNyZWF0ZWQgbDcyMDAgdmVyc2lvbiwgZGVyaXZlZCBmcm9tIHJwYyBjb2RlCi0gKiAgIDA1LTAzLTIwMDAJU0pICUNvbXBsZXRlIHJld3JpdGUKLSAqLwotI2lmbmRlZiBfQVNNX0FSQ0hfVElNRV9ICi0jZGVmaW5lIF9BU01fQVJDSF9USU1FX0gKLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0vKgotICogUlRDIGJhc2UgcmVnaXN0ZXIgYWRkcmVzcwotICovCi0jZGVmaW5lIFJUQ19CQVNFCShJT19CQVNFXzIgKyAweDIwMDApCi0KLS8qCi0gKiBSVEMgcmVnaXN0ZXJzCi0gKi8KLSNkZWZpbmUgUlRDX1JUQ0RSCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKFJUQ19CQVNFICsgMHgwMDApKQotI2RlZmluZSBSVENfUlRDTVIJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoUlRDX0JBU0UgKyAweDAwNCkpCi0jZGVmaW5lIFJUQ19SVENTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKFJUQ19CQVNFICsgMHgwMDgpKQotI2RlZmluZSBSVENfUlRDQwkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChSVENfQkFTRSArIDB4MDA4KSkKLSNkZWZpbmUgUlRDX1JUQ0RWCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKFJUQ19CQVNFICsgMHgwMGMpKQotI2RlZmluZSBSVENfUlRDQ1IJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoUlRDX0JBU0UgKyAweDAxMCkpCi0KLS8qCi0gKiBSVENDUiByZWdpc3RlciB2YWx1ZXMKLSAqLwotI2RlZmluZSBSVENfUkFURV8zMgkweDAwICAgICAgLyogMzIgSHogdGljayAqLwotI2RlZmluZSBSVENfUkFURV82NAkweDEwICAgICAgLyogNjQgSHogdGljayAqLwotI2RlZmluZSBSVENfUkFURV8xMjgJMHgyMCAgICAgIC8qIDEyOCBIeiB0aWNrICovCi0jZGVmaW5lIFJUQ19SQVRFXzI1NgkweDMwICAgICAgLyogMjU2IEh6IHRpY2sgKi8KLSNkZWZpbmUgUlRDX0VOX0FMQVJNCTB4MDEgICAgICAvKiBFbmFibGUgYWxhcm0gKi8KLSNkZWZpbmUgUlRDX0VOX1RJQwkweDA0ICAgICAgLyogRW5hYmxlIGNvdW50ZXIgKi8KLSNkZWZpbmUgUlRDX0VOX1NUV0RPRwkweDA4ICAgICAgLyogRW5hYmxlIHdhdGNoZG9nICovCi0KLS8qCi0gKiBIYW5kbGVyIGZvciBSVEMgdGltZXIgaW50ZXJydXB0Ci0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdAotdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwotCWRvX3RpbWVyKDEpOwotI2lmbmRlZiBDT05GSUdfU01QCi0JdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKHJlZ3MpKTsKLSNlbmRpZgotCWRvX3Byb2ZpbGUocmVncyk7Ci0JUlRDX1JUQ0MgPSAwOwkJCQkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoKLSAqIFNldCB1cCBSVEMgdGltZXIgaW50ZXJydXB0LCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy4KLSAqLwotdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCi17Ci0JUlRDX1JUQ0MgPSAwOwkJCQkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KLQotCXRpbWVyX2lycS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0OwotCi0Jc2V0dXBfaXJxKElSUV9SVENfVElDSywgJnRpbWVyX2lycSk7Ci0KLQlSVENfUlRDQ1IgPSBSVENfUkFURV8xMjggfCBSVENfRU5fVElDOwkvKiBTZXQgcmF0ZSBhbmQgZW5hYmxlIHRpbWVyICovCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzk2YTYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvdGltZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC90aW1leC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFJvYiBTY290dCAocnNjb3R0QG10cm9iLmZkbnMubmV0KQotICogICAgICAgICAgICAgICAgICAgIFN0ZXZlIEhpbGwgKHNqaGlsbEBjb3R3LmNvbSkKLSAqCi0gKiAwNC0yMS0yMDAwICBSUyBDcmVhdGVkIGZpbGUKLSAqIDA1LTAzLTIwMDAgU0pIIFRpY2sgcmF0ZSB3YXMgd3JvbmcKLSAqCi0gKi8KLQotLyoKLSAqIE9uIHRoZSBBUk03MjBULCBjbG9jayB0aWNrcyBhcmUgc2V0IHRvIDEyOCBIei4KLSAqCi0gKiBOT1RFOiBUaGUgYWN0dWFsIFJUQyB2YWx1ZSBpcyBzZXQgaW4gJ3RpbWUuaCcgd2hpY2gKLSAqICAgICAgIG11c3QgYmUgY2hhbmdlZCB3aGVuIGNob29zaW5nIGEgZGlmZmVyZW50IHRpY2sKLSAqICAgICAgIHJhdGUuIFRoZSB2YWx1ZSBvZiBIWiBpbiAncGFyYW0uaCcgbXVzdCBhbHNvCi0gKiAgICAgICBiZSBjaGFuZ2VkIHRvIG1hdGNoIGJlbG93LgotICovCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMTI4CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWM5NjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZSBIaWxsIChzamhpbGxAY290dy5jb20pCi0gKgotICogQ2hhbmdlbG9nOgotICogIDA1LTAxLTIwMDAJU0pICUNyZWF0ZWQKLSAqICAwNS0xMy0yMDAwCVNKSAlGaWxsZWQgaW4gZnVuY3Rpb24gYm9kaWVzCi0gKiAgMDctMjYtMjAwMAlTSkgJUmVtb3ZlZCBoYXJkIGNvZGVkIGJhdWQgcmF0ZQotICovCi0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgSU9fVUFSVCAgSU9fU1RBUlQgKyAweDAwMDQ0MDAwCi0KLSNkZWZpbmUgX19yYXdfd3JpdGViKHYscCkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwKSA9ICh2KSkKLSNkZWZpbmUgX19yYXdfcmVhZGIocCkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocCkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRjKGludCBjKQotewotCXdoaWxlKF9fcmF3X3JlYWRiKElPX1VBUlQgKyAweDE4KSAmIDB4MjAgfHwKLQkgICAgICBfX3Jhd19yZWFkYihJT19VQVJUICsgMHgxOCkgJiAweDA4KQotCQliYXJyaWVyKCk7Ci0KLQlfX3Jhd193cml0ZWIoYywgSU9fVUFSVCArIDB4MDApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2godm9pZCkKLXsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhcmNoX2RlY29tcF9zZXR1cCh2b2lkKQotewotCV9fcmF3X3dyaXRlYigweDAwLCBJT19VQVJUICsgMHgwOCk7CS8qIFNldCBIU0IgKi8KLQlfX3Jhd193cml0ZWIoMHgwMCwgSU9fVUFSVCArIDB4MjApOwkvKiBEaXNhYmxlIElSUXMgKi8KLQlfX3Jhd193cml0ZWIoMHgwMSwgSU9fVUFSVCArIDB4MTQpOwkvKiBFbmFibGUgVUFSVCAqLwotfQotCi0jZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWYwYWJiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAotICovCi0jZGVmaW5lIFZNQUxMT0NfRU5EICAgICAgIChQQUdFX09GRlNFVCArIDB4MTAwMDAwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAxODlkMjBlLi5lZGI4ZjVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE5LDUwICsxOSw2IEBACiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHhjMDAwMDAwMCkKIAotI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KLQotLyoKLSAqIEdpdmVuIGEga2VybmVsIGFkZHJlc3MsIGZpbmQgdGhlIGhvbWUgbm9kZSBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkuCi0gKi8KLQotIyBpZmRlZiBDT05GSUdfTEg3QTQwWF9PTkVfQkFOS19QRVJfTk9ERQotIyAgZGVmaW5lIEtWQUREUl9UT19OSUQoYWRkcikgXAotICAoICAoKCgodW5zaWduZWQgbG9uZykgKGFkZHIpIC0gUEFHRV9PRkZTRVQpID4+IDI0KSAmICAxKVwKLSAgIHwgKCgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiAyNSkgJiB+MSkpCi0jIGVsc2UgIC8qIDIgYmFua3MgcGVyIG5vZGUgKi8KLSMgIGRlZmluZSBLVkFERFJfVE9fTklEKGFkZHIpIFwKLSAgICAgICgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiAyNikKLSMgZW5kaWYKLQotLyoKLSAqIEdpdmVuIGEgcGFnZSBmcmFtZSBudW1iZXIsIGNvbnZlcnQgaXQgdG8gYSBub2RlIGlkLgotICovCi0KLSMgaWZkZWYgQ09ORklHX0xIN0E0MFhfT05FX0JBTktfUEVSX05PREUKLSMgIGRlZmluZSBQRk5fVE9fTklEKHBmbikgXAotICAoKCgoKHBmbikgLSBQSFlTX1BGTl9PRkZTRVQpID4+ICgyNCAtIFBBR0VfU0hJRlQpKSAmICAxKVwKLSB8ICgoKChwZm4pIC0gUEhZU19QRk5fT0ZGU0VUKSA+PiAoMjUgLSBQQUdFX1NISUZUKSkgJiB+MSkpCi0jIGVsc2UgIC8qIDIgYmFua3MgcGVyIG5vZGUgKi8KLSMgIGRlZmluZSBQRk5fVE9fTklEKHBmbikgXAotICAgICgoKHBmbikgLSBQSFlTX1BGTl9PRkZTRVQpID4+ICgyNiAtIFBBR0VfU0hJRlQpKQotI2VuZGlmCi0KLS8qCi0gKiBHaXZlbiBhIGthZGRyLCBMT0NBTF9NRU1fTUFQIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgYXBwcm9wcmlhdGUgcGFnZSBpbiB0aGUKLSAqIG5vZGUncyBtZW1fbWFwLgotICovCi0KLSMgaWZkZWYgQ09ORklHX0xIN0E0MFhfT05FX0JBTktfUEVSX05PREUKLSMgIGRlZmluZSBMT0NBTF9NQVBfTlIoYWRkcikgXAotICAgICAgICgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgMHgwMDNmZmZmZikgPj4gUEFHRV9TSElGVCkKLSMgZWxzZSAgLyogMiBiYW5rcyBwZXIgbm9kZSAqLwotIyAgZGVmaW5lIExPQ0FMX01BUF9OUihhZGRyKSBcCi0gICAgICAgKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiAweDAxZmZmZmZmKSA+PiBQQUdFX1NISUZUKQotIyBlbmRpZgotCi0jZW5kaWYKLQogLyoKICAqIFNwYXJzZW1lbSB2ZXJzaW9uIG9mIHRoZSBhYm92ZQogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTY2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvS2NvbmZpZwpAQCAtMCwwICsxLDMzIEBACitpZiBBUkNIX0xQQzMyWFgKKworbWVudSAiSW5kaXZpZHVhbCBVQVJUIGVuYWJsZSBzZWxlY3Rpb25zIgorCitjb25maWcgQVJDSF9MUEMzMlhYX1VBUlQzX1NFTEVDVAorCWJvb2wgIkFkZCBzdXBwb3J0IGZvciBzdGFuZGFyZCBVQVJUMyIKKwloZWxwCisJIEFkZHMgc3VwcG9ydCBmb3Igc3RhbmRhcmQgVUFSVCAzIHdoZW4gdGhlIDgyNTAgc2VyaWFsIHN1cHBvcnQKKwkgaXMgZW5hYmxlZC4KKworY29uZmlnIEFSQ0hfTFBDMzJYWF9VQVJUNF9TRUxFQ1QKKwlib29sICJBZGQgc3VwcG9ydCBmb3Igc3RhbmRhcmQgVUFSVDQiCisJaGVscAorCSBBZGRzIHN1cHBvcnQgZm9yIHN0YW5kYXJkIFVBUlQgNCB3aGVuIHRoZSA4MjUwIHNlcmlhbCBzdXBwb3J0CisJIGlzIGVuYWJsZWQuCisKK2NvbmZpZyBBUkNIX0xQQzMyWFhfVUFSVDVfU0VMRUNUCisJYm9vbCAiQWRkIHN1cHBvcnQgZm9yIHN0YW5kYXJkIFVBUlQ1IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgQWRkcyBzdXBwb3J0IGZvciBzdGFuZGFyZCBVQVJUIDUgd2hlbiB0aGUgODI1MCBzZXJpYWwgc3VwcG9ydAorCSBpcyBlbmFibGVkLgorCitjb25maWcgQVJDSF9MUEMzMlhYX1VBUlQ2X1NFTEVDVAorCWJvb2wgIkFkZCBzdXBwb3J0IGZvciBzdGFuZGFyZCBVQVJUNiIKKwloZWxwCisJIEFkZHMgc3VwcG9ydCBmb3Igc3RhbmRhcmQgVUFSVCA2IHdoZW4gdGhlIDgyNTAgc2VyaWFsIHN1cHBvcnQKKwkgaXMgZW5hYmxlZC4KKworZW5kbWVudQorCitlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmYzVkMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15CTo9IHRpbWVyLm8gaXJxLm8gY29tbW9uLm8gc2VyaWFsLm8gY2xvY2subworb2JqLXkJKz0gZ3Bpb2xpYi5vIHBtLm8gc3VzcGVuZC5vCitvYmoteQkrPSBwaHkzMjUwLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk2YjQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSw0IEBACisgICB6cmVsYWRkci15CTo9IDB4ODAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHg4MDAwMDEwMAoraW5pdHJkX3BoeXMteQk6PSAweDgyMDAwMDAwCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9jbG9jay5jCkBAIC0wLDAgKzEsMTEzNyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9jbG9jay5jCisgKgorICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBMUEMzMnh4IGNsb2NrIG1hbmFnZW1lbnQgZHJpdmVyIG92ZXJ2aWV3CisgKgorICogVGhlIExQQzMyWFggY29udGFpbnMgYSBudW1iZXIgb2YgaGlnaCBsZXZlbCBzeXN0ZW0gY2xvY2tzIHRoYXQgY2FuIGJlCisgKiBnZW5lcmF0ZWQgZnJvbSBkaWZmZXJlbnQgc291cmNlcy4gVGhlc2Ugc3lzdGVtIGNsb2NrcyBhcmUgdXNlZCB0bworICogZ2VuZXJhdGUgdGhlIENQVSBhbmQgYnVzIHJhdGVzIGFuZCB0aGUgaW5kaXZpZHVhbCBwZXJpcGhlcmFsIGNsb2NrcyBpbgorICogdGhlIHN5c3RlbS4gV2hlbiBMaW51eCBpcyBzdGFydGVkIGJ5IHRoZSBib290IGxvYWRlciwgdGhlIHN5c3RlbQorICogY2xvY2tzIGFyZSBhbHJlYWR5IHJ1bm5pbmcuIFN0b3BwaW5nIGEgc3lzdGVtIGNsb2NrIGR1cmluZyBub3JtYWwKKyAqIExpbnV4IG9wZXJhdGlvbiBzaG91bGQgbmV2ZXIgYmUgYXR0ZW1wdGVkLCBhcyBwZXJpcGhlcmFscyB0aGF0IHJlcXVpcmUKKyAqIHRob3NlIGNsb2NrcyB3aWxsIHF1aXQgd29ya2luZyAoaWUsIERSQU0pLgorICoKKyAqIFRoZSBMUEMzMnh4IGhpZ2ggbGV2ZWwgY2xvY2sgdHJlZSBsb29rcyBhcyBmb2xsb3dzLiBDbG9ja3MgbWFya2VkIHdpdGgKKyAqIGFuIGFzdGVyaXNrIGFyZSBhbHdheXMgb24gYW5kIGNhbm5vdCBiZSBkaXNhYmxlZC4gQ2xvY2tzIG1hcmtlZCB3aXRoCisgKiBhbiBhbXBlcnNhbmQgY2FuIG9ubHkgYmUgZGlzYWJsZWQgaW4gQ1BVIHN1c3BlbmQgbW9kZS4gQ2xvY2tzIG1hcmtlZAorICogd2l0aCBhIGNhcmV0IGFyZSBhbHdheXMgb24gaWYgaXQgaXMgdGhlIHNlbGVjdGVkIGNsb2NrIGZvciB0aGUgU1lTQ0xLCisgKiBzb3VyY2UuIFRoZSBjbG9jayB0aGF0IGlzbid0IHVzZWQgZm9yIFNZU0NMSyBjYW4gYmUgZW5hYmxlZCBhbmQKKyAqIGRpc2FibGVkIG5vcm1hbGx5LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzJLSHogb3NjaWxsYXRvcioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICB8ICAgICAgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQyogICBQTEwzOTdeIFRPVUNICisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgKiAgICAgICAgICAgICAgIE1haW4gb3NjaWxsYXRvcl4gICAgIC8KKyAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgIFwgICAgICAvCisgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgU1lTQ0xLJgorICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgXAorICogICAgICAgICAgICAgICAgVVNCX1BMTCAgICAgICBIQ0xLX1BMTCYKKyAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgfAorICogICAgICAgICAgICBVU0IgaG9zdC9kZXZpY2UgIFBDTEsmICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJpcGhlcmFscworICoKKyAqIFRoZSBDUFUgYW5kIGNoaXAgYnVzIHJhdGVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIEhDTEsgUExMLCB3aGljaCBjYW4KKyAqIGdlbmVyYXRlIHZhcmlvdXMgY2xvY2sgcmF0ZXMgdXAgdG8gMjY2TUh6IGFuZCBiZXlvbmQuIFRoZSBpbnRlcm5hbCBidXMKKyAqIHJhdGVzIChQQ0xLIGFuZCBIQ0xLKSBhcmUgZ2VuZXJhdGVkIGZyb20gZGl2aWRlcnMgYmFzZWQgb24gdGhlIEhDTEsKKyAqIFBMTCByYXRlLiBIQ0xLIGNhbiBiZSBhIHJhdGlvIG9mIDE6MSwgMToyLCBvciAxOjQgb3IgSENMSyBQTEwgcmF0ZSwKKyAqIHdoaWxlIFBDTEsgY2FuIGJlIDE6MSB0byAxOjMyIG9mIEhDTEsgUExMIHJhdGUuIE1vc3QgcGVyaXBoZXJhbHMgaGlnaAorICogbGV2ZWwgY2xvY2tzIGFyZSBiYXNlZCBvbiBlaXRoZXIgSENMSyBvciBQQ0xLLCBidXQgaGF2ZSB0aGVpciBvd24KKyAqIGRpdmlkZXJzIGFzIHBhcnQgb2YgdGhlIElQIGl0c2VsZi4gQmVjYXVzZSBvZiB0aGlzLCB0aGUgc3lzdGVtIGNsb2NrCisgKiByYXRlcyBzaG91bGQgbm90IGJlIGNoYW5nZWQuCisgKgorICogVGhlIEhDTEsgUExMIGlzIGNsb2NrZWQgZnJvbSBTWVNDTEssIHdoaWNoIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhlCisgKiBtYWluIG9zY2lsbGF0b3Igb3IgUExMMzk3LiBQTEwzOTcgZ2VuZXJhdGVzIGEgcmF0ZSB0aGF0IGlzIDM5NyB0aW1lcworICogdGhlIDMyS0h6IG9zY2lsbGF0b3IgcmF0ZS4gVGhlIG1haW4gb3NjaWxsYXRvciBydW5zIGF0IHRoZSBzZWxlY3RlZAorICogb3NjaWxsYXRvci9jcnlzdGFsIHJhdGUgb24gdGhlIG1vc2NfaW4gcGluIG9mIHRoZSBMUEMzMnh4LiBUaGlzIHJhdGUKKyAqIGlzIG5vcm1hbGx5IDEzTUh6LCBidXQgZGVwZW5kcyBvbiB0aGUgc2VsZWN0aW9uIG9mIGV4dGVybmFsIGNyeXN0YWxzCisgKiBvciBvc2NpbGxhdG9ycy4gSWYgVVNCIG9wZXJhdGlvbiBpcyByZXF1aXJlZCwgdGhlIG1haW4gb3NjaWxsYXRvciBtdXN0CisgKiBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uCisgKgorICogU3dpdGNoaW5nIFNZU0NMSyBiZXR3ZWVuIHNvdXJjZXMgZHVyaW5nIG5vcm1hbCBMaW51eCBvcGVyYXRpb24gaXMgbm90CisgKiBzdXBwb3J0ZWQuIFNZU0NMSyBpcyBwcmVzZXQgaW4gdGhlIGJvb3Rsb2FkZXIuIEJlY2F1c2Ugb2YgdGhlCisgKiBjb21wbGV4aXRpZXMgb2YgY2xvY2sgbWFuYWdlbWVudCBkdXJpbmcgY2xvY2sgZnJlcXVlbmN5IGNoYW5nZXMsCisgKiB0aGVyZSBhcmUgc29tZSBsaW1pdGF0aW9ucyB0byB0aGUgY2xvY2sgZHJpdmVyIGV4cGxhaW5lZCBiZWxvdzoKKyAqIC0gVGhlIFBMTDM5NyBhbmQgbWFpbiBvc2NpbGxhdG9yIGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCBieSB0aGUKKyAqICAgY2xrX2VuYWJsZSgpIGFuZCBjbGtfZGlzYWJsZSgpIGZ1bmN0aW9ucyB1bmxlc3MgU1lTQ0xLIGlzIGJhc2VkCisgKiAgIG9uIHRoYXQgY2xvY2suIFRoaXMgYWxsb3dzIHRoZSBvdGhlciBvc2NpbGxhdG9yIHRoYXQgaXNuJ3QgZHJpdmluZworICogICB0aGUgSENMSyBQTEwgdG8gYmUgdXNlZCBhcyBhbm90aGVyIHN5c3RlbSBjbG9jayB0aGF0IGNhbiBiZSByb3V0ZWQKKyAqICAgdG8gYW4gZXh0ZXJuYWwgcGluLgorICogLSBUaGUgbXV4ZWQgU1lTQ0xLIGlucHV0IGFuZCBIQ0xLX1BMTCByYXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGgKKyAqICAgdGhpcyBkcml2ZXIuCisgKiAtIEhDTEsgYW5kIFBDTEsgcmF0ZXMgY2Fubm90IGJlIGNoYW5nZWQgYXMgcGFydCBvZiB0aGlzIGRyaXZlci4KKyAqIC0gTW9zdCBwZXJpcGhlcmFscyBoYXZlIHRoZWlyIG93biBkaXZpZGVycyBhcmUgcGFydCBvZiB0aGUgcGVyaXBoZXJhbAorICogICBibG9jay4gQ2hhbmdpbmcgU1lTQ0xLLCBIQ0xLIFBMTCwgSENMSywgb3IgUENMSyBzb3VyY2VzIG9yIHJhdGVzCisgKiAgIHdpbGwgYWxzbyBpbXBhY3QgdGhlIGluZGl2aWR1YWwgcGVyaXBoZXJhbCByYXRlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CisjaW5jbHVkZSA8bWFjaC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybXBsbDsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191c2JwbGw7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsa21fbG9jayk7CisKKy8qCisgKiBQb3N0IGRpdmlkZXIgdmFsdWVzIGZvciBQTExzIGJhc2VkIG9uIHNlbGVjdGVkIHJlZ2lzdGVyIHZhbHVlCisgKi8KK3N0YXRpYyBjb25zdCB1MzIgcGxsX3Bvc3RkaXZzWzRdID0gezEsIDIsIDQsIDh9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCS8qCisJICogSWYgYSBjbG9jayBoYXMgYSByYXRlIG9mIDAsIHRoZW4gaXQgaW5oZXJpdHMgaXQncyBwYXJlbnQKKwkgKiBjbG9jayByYXRlCisJICovCisJd2hpbGUgKGNsay0+cmF0ZSA9PSAwKQorCQljbGsgPSBjbGstPnBhcmVudDsKKworCXJldHVybiBjbGstPnJhdGU7Cit9CisKKy8qIDMyS0h6IGNsb2NrIGhhcyBhIGZpeGVkIHJhdGUgYW5kIGlzIG5vdCBzdG9wcGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG9zY18zMktIeiA9IHsKKwkucmF0ZQkJPSBMUEMzMlhYX0NMT0NLX09TQ19GUkVRLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBpbnQgbG9jYWxfcGxsMzk3X2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAxICsgbXNlY3NfdG9famlmZmllcygxMCk7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9QTEwzOTdfQ1RSTCk7CisKKwlpZiAoZW5hYmxlID09IDApIHsKKwkJcmVnIHw9IExQQzMyWFhfQ0xLUFdSX1NZU0NUUkxfUExMMzk3X0RJUzsKKwkJX19yYXdfd3JpdGVsKHJlZywgTFBDMzJYWF9DTEtQV1JfUExMMzk3X0NUUkwpOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBQTEwzOTcgKi8KKwkJcmVnICY9IH5MUEMzMlhYX0NMS1BXUl9TWVNDVFJMX1BMTDM5N19ESVM7CisJCV9fcmF3X3dyaXRlbChyZWcsIExQQzMyWFhfQ0xLUFdSX1BMTDM5N19DVFJMKTsKKworCQkvKiBXYWl0IGZvciBQTEwzOTcgbG9jayAqLworCQl3aGlsZSAoKChfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9QTEwzOTdfQ1RSTCkgJgorCQkJTFBDMzJYWF9DTEtQV1JfU1lTQ1RSTF9QTEwzOTdfU1RTKSA9PSAwKSAmJgorCQkJKHRpbWVvdXQgPiBqaWZmaWVzKSkKKwkJCWNwdV9yZWxheCgpOworCisJCWlmICgoX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfUExMMzk3X0NUUkwpICYKKwkJCUxQQzMyWFhfQ0xLUFdSX1NZU0NUUkxfUExMMzk3X1NUUykgPT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxvY2FsX29zY21haW5fZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwl1MzIgcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDEgKyBtc2Vjc190b19qaWZmaWVzKDEwKTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX01BSU5fT1NDX0NUUkwpOworCisJaWYgKGVuYWJsZSA9PSAwKSB7CisJCXJlZyB8PSBMUEMzMlhYX0NMS1BXUl9NT1NDX0RJU0FCTEU7CisJCV9fcmF3X3dyaXRlbChyZWcsIExQQzMyWFhfQ0xLUFdSX01BSU5fT1NDX0NUUkwpOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBtYWluIG9zY2lsbGF0b3IgKi8KKwkJcmVnICY9IH5MUEMzMlhYX0NMS1BXUl9NT1NDX0RJU0FCTEU7CisJCV9fcmF3X3dyaXRlbChyZWcsIExQQzMyWFhfQ0xLUFdSX01BSU5fT1NDX0NUUkwpOworCisJCS8qIFdhaXQgZm9yIG1haW4gb3NjaWxsYXRvciB0byBzdGFydCAqLworCQl3aGlsZSAoKChfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9NQUlOX09TQ19DVFJMKSAmCisJCQlMUEMzMlhYX0NMS1BXUl9NT1NDX0RJU0FCTEUpICE9IDApICYmCisJCQkodGltZW91dCA+IGppZmZpZXMpKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKChfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9NQUlOX09TQ19DVFJMKSAmCisJCQlMUEMzMlhYX0NMS1BXUl9NT1NDX0RJU0FCTEUpICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgb3NjX3BsbDM5NyA9IHsKKwkucGFyZW50CQk9ICZvc2NfMzJLSHosCisJLmVuYWJsZQkJPSBsb2NhbF9wbGwzOTdfZW5hYmxlLAorCS5yYXRlCQk9IExQQzMyWFhfQ0xPQ0tfT1NDX0ZSRVEgKiAzOTcsCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgb3NjX21haW4gPSB7CisJLmVuYWJsZQkJPSBsb2NhbF9vc2NtYWluX2VuYWJsZSwKKwkucmF0ZQkJPSBMUEMzMlhYX01BSU5fT1NDX0ZSRVEsCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3N5czsKKworLyoKKyAqIENvbnZlcnQgYSBQTEwgcmVnaXN0ZXIgdmFsdWUgdG8gYSBQTEwgb3V0cHV0IGZyZXF1ZW5jeQorICovCit1MzIgY2xrX2dldF9wbGxyYXRlX2Zyb21fcmVnKHUzMiBpbnB1dGNsaywgdTMyIHJlZ3ZhbCkKK3sKKwlzdHJ1Y3QgY2xrX3BsbF9zZXR1cCBwbGxjZmc7CisKKwlwbGxjZmcuY2NvX2J5cGFzc19iMTUgPSAwOworCXBsbGNmZy5kaXJlY3Rfb3V0cHV0X2IxNCA9IDA7CisJcGxsY2ZnLmZkYmtfZGl2X2N0cmxfYjEzID0gMDsKKwlpZiAoKHJlZ3ZhbCAmIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfQ0NPX0JZUEFTUykgIT0gMCkKKwkJcGxsY2ZnLmNjb19ieXBhc3NfYjE1ID0gMTsKKwlpZiAoKHJlZ3ZhbCAmIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfUE9TVERJVl9CWVBBU1MpICE9IDApCisJCXBsbGNmZy5kaXJlY3Rfb3V0cHV0X2IxNCA9IDE7CisJaWYgKChyZWd2YWwgJiBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0ZEQktfU0VMX0ZDTEspICE9IDApCisJCXBsbGNmZy5mZGJrX2Rpdl9jdHJsX2IxMyA9IDE7CisJcGxsY2ZnLnBsbF9tID0gMSArICgocmVndmFsID4+IDEpICYgMHhGRik7CisJcGxsY2ZnLnBsbF9uID0gMSArICgocmVndmFsID4+IDkpICYgMHgzKTsKKwlwbGxjZmcucGxsX3AgPSBwbGxfcG9zdGRpdnNbKChyZWd2YWwgPj4gMTEpICYgMHgzKV07CisKKwlyZXR1cm4gY2xrX2NoZWNrX3BsbF9zZXR1cChpbnB1dGNsaywgJnBsbGNmZyk7Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgSENMSyBQTEwgd2l0aCBhIFBMTCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHUzMiBsb2NhbF9jbGtfcGxsX3NldHVwKHN0cnVjdCBjbGtfcGxsX3NldHVwICpQbGxTZXR1cCkKK3sKKwl1MzIgdHYsIHRtcCA9IDA7CisKKwlpZiAoUGxsU2V0dXAtPmFuYWxvZ19vbiAhPSAwKQorCQl0bXAgfD0gTFBDMzJYWF9DTEtQV1JfSENMS1BMTF9QT1dFUl9VUDsKKwlpZiAoUGxsU2V0dXAtPmNjb19ieXBhc3NfYjE1ICE9IDApCisJCXRtcCB8PSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0NDT19CWVBBU1M7CisJaWYgKFBsbFNldHVwLT5kaXJlY3Rfb3V0cHV0X2IxNCAhPSAwKQorCQl0bXAgfD0gTFBDMzJYWF9DTEtQV1JfSENMS1BMTF9QT1NURElWX0JZUEFTUzsKKwlpZiAoUGxsU2V0dXAtPmZkYmtfZGl2X2N0cmxfYjEzICE9IDApCisJCXRtcCB8PSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0ZEQktfU0VMX0ZDTEs7CisKKwl0diA9IGZmcyhQbGxTZXR1cC0+cGxsX3ApIC0gMTsKKwlpZiAoKCFpc19wb3dlcl9vZl8yKFBsbFNldHVwLT5wbGxfcCkpIHx8ICh0diA+IDMpKQorCQlyZXR1cm4gMDsKKworCXRtcCB8PSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX1BPU1RESVZfMlBPVyh0dik7CisJdG1wIHw9IExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfUFJFRElWX1BMVVMxKFBsbFNldHVwLT5wbGxfbiAtIDEpOworCXRtcCB8PSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX1BMTE0oUGxsU2V0dXAtPnBsbF9tIC0gMSk7CisKKwlyZXR1cm4gdG1wOworfQorCisvKgorICogVXBkYXRlIHRoZSBBUk0gY29yZSBQTEwgZnJlcXVlbmN5IHJhdGUgdmFyaWFibGUgZnJvbSB0aGUgYWN0dWFsIFBMTCBzZXR0aW5nCisgKi8KK3N0YXRpYyB2b2lkIGxvY2FsX3VwZGF0ZV9hcm1wbGxfcmF0ZSh2b2lkKQoreworCXUzMiBjbGtpbiwgcGxscmVnOworCisJY2xraW4gPSBjbGtfYXJtcGxsLnBhcmVudC0+cmF0ZTsKKwlwbGxyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0NUUkwpICYgMHgxRkZGRjsKKworCWNsa19hcm1wbGwucmF0ZSA9IGNsa19nZXRfcGxscmF0ZV9mcm9tX3JlZyhjbGtpbiwgcGxscmVnKTsKK30KKworLyoKKyAqIEZpbmQgYSBQTEwgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIGlucHV0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgdTMyIGxvY2FsX2Nsa19maW5kX3BsbF9jZmcodTMyIHBsbGluX2ZyZXEsIHUzMiB0YXJnZXRfZnJlcSwKKwlzdHJ1Y3QgY2xrX3BsbF9zZXR1cCAqcGxsc2V0dXApCit7CisJdTMyIGlmcmVxLCBmcmVxdG9sLCBtLCBuLCBwLCBmY2xrb3V0OworCisJLyogRGV0ZXJtaW5lIGZyZXF1ZW5jeSB0b2xlcmFuY2UgbGltaXRzICovCisJZnJlcXRvbCA9IHRhcmdldF9mcmVxIC8gMjUwOworCWlmcmVxID0gcGxsaW5fZnJlcTsKKworCS8qIElzIGRpcmVjdCBieXBhc3MgbW9kZSBwb3NzaWJsZT8gKi8KKwlpZiAoYWJzKHBsbGluX2ZyZXEgLSB0YXJnZXRfZnJlcSkgPD0gZnJlcXRvbCkgeworCQlwbGxzZXR1cC0+YW5hbG9nX29uID0gMDsKKwkJcGxsc2V0dXAtPmNjb19ieXBhc3NfYjE1ID0gMTsKKwkJcGxsc2V0dXAtPmRpcmVjdF9vdXRwdXRfYjE0ID0gMTsKKwkJcGxsc2V0dXAtPmZkYmtfZGl2X2N0cmxfYjEzID0gMTsKKwkJcGxsc2V0dXAtPnBsbF9wID0gcGxsX3Bvc3RkaXZzWzBdOworCQlwbGxzZXR1cC0+cGxsX24gPSAxOworCQlwbGxzZXR1cC0+cGxsX20gPSAxOworCQlyZXR1cm4gY2xrX2NoZWNrX3BsbF9zZXR1cChpZnJlcSwgcGxsc2V0dXApOworCX0gZWxzZSBpZiAodGFyZ2V0X2ZyZXEgPD0gaWZyZXEpIHsKKwkJcGxsc2V0dXAtPmFuYWxvZ19vbiA9IDA7CisJCXBsbHNldHVwLT5jY29fYnlwYXNzX2IxNSA9IDE7CisJCXBsbHNldHVwLT5kaXJlY3Rfb3V0cHV0X2IxNCA9IDA7CisJCXBsbHNldHVwLT5mZGJrX2Rpdl9jdHJsX2IxMyA9IDE7CisJCXBsbHNldHVwLT5wbGxfbiA9IDE7CisJCXBsbHNldHVwLT5wbGxfbSA9IDE7CisJCWZvciAocCA9IDA7IHAgPD0gMzsgcCsrKSB7CisJCQlwbGxzZXR1cC0+cGxsX3AgPSBwbGxfcG9zdGRpdnNbcF07CisJCQlmY2xrb3V0ID0gY2xrX2NoZWNrX3BsbF9zZXR1cChpZnJlcSwgcGxsc2V0dXApOworCQkJaWYgKGFicyh0YXJnZXRfZnJlcSAtIGZjbGtvdXQpIDw9IGZyZXF0b2wpCisJCQkJcmV0dXJuIGZjbGtvdXQ7CisJCX0KKwl9CisKKwkvKiBJcyBkaXJlY3QgbW9kZSBwb3NzaWJsZT8gKi8KKwlwbGxzZXR1cC0+YW5hbG9nX29uID0gMTsKKwlwbGxzZXR1cC0+Y2NvX2J5cGFzc19iMTUgPSAwOworCXBsbHNldHVwLT5kaXJlY3Rfb3V0cHV0X2IxNCA9IDE7CisJcGxsc2V0dXAtPmZkYmtfZGl2X2N0cmxfYjEzID0gMDsKKwlwbGxzZXR1cC0+cGxsX3AgPSBwbGxfcG9zdGRpdnNbMF07CisJZm9yIChtID0gMTsgbSA8PSAyNTY7IG0rKykgeworCQlmb3IgKG4gPSAxOyBuIDw9IDQ7IG4rKykgeworCQkJLyogQ29tcHV0ZSBvdXRwdXQgZnJlcXVlbmN5IGZvciB0aGlzIHZhbHVlICovCisJCQlwbGxzZXR1cC0+cGxsX24gPSBuOworCQkJcGxsc2V0dXAtPnBsbF9tID0gbTsKKwkJCWZjbGtvdXQgPSBjbGtfY2hlY2tfcGxsX3NldHVwKGlmcmVxLAorCQkJCXBsbHNldHVwKTsKKwkJCWlmIChhYnModGFyZ2V0X2ZyZXEgLSBmY2xrb3V0KSA8PQorCQkJCWZyZXF0b2wpCisJCQkJcmV0dXJuIGZjbGtvdXQ7CisJCX0KKwl9CisKKwkvKiBJcyBpbnRlZ2VyIG1vZGUgcG9zc2libGU/ICovCisJcGxsc2V0dXAtPmFuYWxvZ19vbiA9IDE7CisJcGxsc2V0dXAtPmNjb19ieXBhc3NfYjE1ID0gMDsKKwlwbGxzZXR1cC0+ZGlyZWN0X291dHB1dF9iMTQgPSAwOworCXBsbHNldHVwLT5mZGJrX2Rpdl9jdHJsX2IxMyA9IDE7CisJZm9yIChtID0gMTsgbSA8PSAyNTY7IG0rKykgeworCQlmb3IgKG4gPSAxOyBuIDw9IDQ7IG4rKykgeworCQkJZm9yIChwID0gMDsgcCA8IDQ7IHArKykgeworCQkJCS8qIENvbXB1dGUgb3V0cHV0IGZyZXF1ZW5jeSAqLworCQkJCXBsbHNldHVwLT5wbGxfcCA9IHBsbF9wb3N0ZGl2c1twXTsKKwkJCQlwbGxzZXR1cC0+cGxsX24gPSBuOworCQkJCXBsbHNldHVwLT5wbGxfbSA9IG07CisJCQkJZmNsa291dCA9IGNsa19jaGVja19wbGxfc2V0dXAoCisJCQkJCWlmcmVxLCBwbGxzZXR1cCk7CisJCQkJaWYgKGFicyh0YXJnZXRfZnJlcSAtIGZjbGtvdXQpIDw9IGZyZXF0b2wpCisJCQkJCXJldHVybiBmY2xrb3V0OworCQkJfQorCQl9CisJfQorCisJLyogVHJ5IG5vbi1pbnRlZ2VyIG1vZGUgKi8KKwlwbGxzZXR1cC0+YW5hbG9nX29uID0gMTsKKwlwbGxzZXR1cC0+Y2NvX2J5cGFzc19iMTUgPSAwOworCXBsbHNldHVwLT5kaXJlY3Rfb3V0cHV0X2IxNCA9IDA7CisJcGxsc2V0dXAtPmZkYmtfZGl2X2N0cmxfYjEzID0gMDsKKwlmb3IgKG0gPSAxOyBtIDw9IDI1NjsgbSsrKSB7CisJCWZvciAobiA9IDE7IG4gPD0gNDsgbisrKSB7CisJCQlmb3IgKHAgPSAwOyBwIDwgNDsgcCsrKSB7CisJCQkJLyogQ29tcHV0ZSBvdXRwdXQgZnJlcXVlbmN5ICovCisJCQkJcGxsc2V0dXAtPnBsbF9wID0gcGxsX3Bvc3RkaXZzW3BdOworCQkJCXBsbHNldHVwLT5wbGxfbiA9IG47CisJCQkJcGxsc2V0dXAtPnBsbF9tID0gbTsKKwkJCQlmY2xrb3V0ID0gY2xrX2NoZWNrX3BsbF9zZXR1cCgKKwkJCQkJaWZyZXEsIHBsbHNldHVwKTsKKwkJCQlpZiAoYWJzKHRhcmdldF9mcmVxIC0gZmNsa291dCkgPD0gZnJlcXRvbCkKKwkJCQkJcmV0dXJuIGZjbGtvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybXBsbCA9IHsKKwkucGFyZW50CQk9ICZjbGtfc3lzLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKKy8qCisgKiBTZXR1cCB0aGUgVVNCIFBMTCB3aXRoIGEgUExMIHN0cnVjdHVyZQorICovCitzdGF0aWMgdTMyIGxvY2FsX2Nsa191c2JwbGxfc2V0dXAoc3RydWN0IGNsa19wbGxfc2V0dXAgKnBIQ0xLUGxsU2V0dXApCit7CisJdTMyIHJlZywgdG1wID0gbG9jYWxfY2xrX3BsbF9zZXR1cChwSENMS1BsbFNldHVwKTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX1VTQl9DVFJMKSAmIH4weDFGRkZGOworCXJlZyB8PSB0bXA7CisJX19yYXdfd3JpdGVsKHJlZywgTFBDMzJYWF9DTEtQV1JfVVNCX0NUUkwpOworCisJcmV0dXJuIGNsa19jaGVja19wbGxfc2V0dXAoY2xrX3VzYnBsbC5wYXJlbnQtPnJhdGUsCisJCXBIQ0xLUGxsU2V0dXApOworfQorCitzdGF0aWMgaW50IGxvY2FsX3VzYnBsbF9lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXUzMiByZWc7CisJaW50IHJldCA9IC1FTk9ERVY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMSArIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCisJcmVnID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfVVNCX0NUUkwpOworCisJaWYgKGVuYWJsZSA9PSAwKSB7CisJCXJlZyAmPSB+KExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfQ0xLX0VOMSB8CisJCQlMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX0NMS19FTjIpOworCQlfX3Jhd193cml0ZWwocmVnLCBMUEMzMlhYX0NMS1BXUl9VU0JfQ1RSTCk7CisJfSBlbHNlIGlmIChyZWcgJiBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX1BMTF9QV1JVUCkgeworCQlyZWcgfD0gTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9DTEtfRU4xOworCQlfX3Jhd193cml0ZWwocmVnLCBMUEMzMlhYX0NMS1BXUl9VU0JfQ1RSTCk7CisKKwkJLyogV2FpdCBmb3IgUExMIGxvY2sgKi8KKwkJd2hpbGUgKCh0aW1lb3V0ID4gamlmZmllcykgJiAocmV0ID09IC1FTk9ERVYpKSB7CisJCQlyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9VU0JfQ1RSTCk7CisJCQlpZiAocmVnICYgTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9QTExfU1RTKQorCQkJCXJldCA9IDA7CisJCX0KKworCQlpZiAocmV0ID09IDApIHsKKwkJCXJlZyB8PSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX0NMS19FTjI7CisJCQlfX3Jhd193cml0ZWwocmVnLCBMUEMzMlhYX0NMS1BXUl9VU0JfQ1RSTCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NhbF91c2JwbGxfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssCisJdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiBjbGtpbiwgdXNiZGl2OworCXN0cnVjdCBjbGtfcGxsX3NldHVwIHBsbHNldHVwOworCisJLyoKKwkgKiBVbmxpa2Ugb3RoZXIgY2xvY2tzLCB0aGlzIGNsb2NrIGhhcyBhIEtIeiBpbnB1dCByYXRlLCBzbyBidW1wCisJICogaXQgdXAgdG8gd29yayB3aXRoIHRoZSBQTEwgZnVuY3Rpb24KKwkgKi8KKwlyYXRlID0gcmF0ZSAqIDEwMDA7CisKKwljbGtpbiA9IGNsay0+cGFyZW50LT5yYXRlOworCXVzYmRpdiA9IChfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9VU0JDTEtfUERJVikgJgorCQlMUEMzMlhYX0NMS1BXUl9VU0JQRElWX1BMTF9NQVNLKSArIDE7CisJY2xraW4gPSBjbGtpbiAvIHVzYmRpdjsKKworCS8qIFRyeSB0byBmaW5kIGEgZ29vZCByYXRlIHNldHVwICovCisJaWYgKGxvY2FsX2Nsa19maW5kX3BsbF9jZmcoY2xraW4sIHJhdGUsICZwbGxzZXR1cCkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2xrX2NoZWNrX3BsbF9zZXR1cChjbGtpbiwgJnBsbHNldHVwKTsKK30KKworc3RhdGljIGludCBsb2NhbF91c2JwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdTMyIGNsa2luLCByZWcsIHVzYmRpdjsKKwlzdHJ1Y3QgY2xrX3BsbF9zZXR1cCBwbGxzZXR1cDsKKworCS8qCisJICogVW5saWtlIG90aGVyIGNsb2NrcywgdGhpcyBjbG9jayBoYXMgYSBLSHogaW5wdXQgcmF0ZSwgc28gYnVtcAorCSAqIGl0IHVwIHRvIHdvcmsgd2l0aCB0aGUgUExMIGZ1bmN0aW9uCisJICovCisJcmF0ZSA9IHJhdGUgKiAxMDAwOworCisJY2xraW4gPSBjbGstPmdldF9yYXRlKGNsayk7CisJdXNiZGl2ID0gKF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX1VTQkNMS19QRElWKSAmCisJCUxQQzMyWFhfQ0xLUFdSX1VTQlBESVZfUExMX01BU0spICsgMTsKKwljbGtpbiA9IGNsa2luIC8gdXNiZGl2OworCisJLyogVHJ5IHRvIGZpbmQgYSBnb29kIHJhdGUgc2V0dXAgKi8KKwlpZiAobG9jYWxfY2xrX2ZpbmRfcGxsX2NmZyhjbGtpbiwgcmF0ZSwgJnBsbHNldHVwKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2FsX3VzYnBsbF9lbmFibGUoY2xrLCAwKTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX1VTQl9DVFJMKTsKKwlyZWcgfD0gTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9DTEtfRU4xOworCV9fcmF3X3dyaXRlbChyZWcsIExQQzMyWFhfQ0xLUFdSX1VTQl9DVFJMKTsKKworCXBsbHNldHVwLmFuYWxvZ19vbiA9IDE7CisJbG9jYWxfY2xrX3VzYnBsbF9zZXR1cCgmcGxsc2V0dXApOworCisJY2xrLT5yYXRlID0gY2xrX2NoZWNrX3BsbF9zZXR1cChjbGtpbiwgJnBsbHNldHVwKTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX1VTQl9DVFJMKTsKKwlyZWcgfD0gTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9DTEtfRU4yOworCV9fcmF3X3dyaXRlbChyZWcsIExQQzMyWFhfQ0xLUFdSX1VTQl9DVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGtfdXNicGxsID0geworCS5wYXJlbnQJCT0gJm9zY19tYWluLAorCS5zZXRfcmF0ZQk9IGxvY2FsX3VzYnBsbF9zZXRfcmF0ZSwKKwkuZW5hYmxlCQk9IGxvY2FsX3VzYnBsbF9lbmFibGUsCisJLnJhdGUJCT0gNDgwMDAsIC8qIEluIEtIeiAqLworCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKKwkucm91bmRfcmF0ZQk9IGxvY2FsX3VzYnBsbF9yb3VuZF9yYXRlLAorfTsKKworc3RhdGljIHUzMiBjbGtfZ2V0X2hjbGtfZGl2KHZvaWQpCit7CisJc3RhdGljIGNvbnN0IHUzMiBoY2xrZGl2c1s0XSA9IHsxLCAyLCA0LCA0fTsKKwlyZXR1cm4gaGNsa2RpdnNbTFBDMzJYWF9DTEtQV1JfSENMS0RJVl9ESVZfMlBPVygKKwkJX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfSENMS19ESVYpKV07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19oY2xrID0geworCS5wYXJlbnQJCT0gJmNsa19hcm1wbGwsCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BjbGsgPSB7CisJLnBhcmVudAkJPSAmY2xrX2FybXBsbCwKKwkuZ2V0X3JhdGUJPSBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUsCit9OworCitzdGF0aWMgaW50IGxvY2FsX29ub2ZmX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJdTMyIHRtcDsKKworCXRtcCA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisKKwlpZiAoZW5hYmxlID09IDApCisJCXRtcCAmPSB+Y2xrLT5lbmFibGVfbWFzazsKKwllbHNlCisJCXRtcCB8PSBjbGstPmVuYWJsZV9tYXNrOworCisJX19yYXdfd3JpdGVsKHRtcCwgY2xrLT5lbmFibGVfcmVnKTsKKworCXJldHVybiAwOworfQorCisvKiBQZXJpcGhlcmFsIGNsb2NrIHNvdXJjZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa190aW1lcjAgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9USU1FUlNfUFdNU19DTEtfQ1RSTF8xLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19USU1FUjBfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa190aW1lcjEgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9USU1FUlNfUFdNU19DTEtfQ1RSTF8xLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19USU1FUjFfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa190aW1lcjIgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9USU1FUlNfUFdNU19DTEtfQ1RSTF8xLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19USU1FUjJfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa190aW1lcjMgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9USU1FUlNfUFdNU19DTEtfQ1RSTF8xLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19USU1FUjNfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa193ZHQgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9USU1FUl9DTEtfQ1RSTCwKKwkuZW5hYmxlX21hc2sJPSBMUEMzMlhYX0NMS1BXUl9QV01DTEtfV0RPR19FTiwKKwkuZ2V0X3JhdGUJPSBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3ZmcDkgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9ERUJVR19DVFJMLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1ZGUF9DTE9DS19FTkFCTEVfQklULAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CitzdGF0aWMgc3RydWN0IGNsayBjbGtfZG1hID0geworCS5wYXJlbnQJCT0gJmNsa19oY2xrLAorCS5lbmFibGUJCT0gbG9jYWxfb25vZmZfZW5hYmxlLAorCS5lbmFibGVfcmVnCT0gTFBDMzJYWF9DTEtQV1JfRE1BX0NMS19DVFJMLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX0RNQUNMS0NUUkxfQ0xLX0VOLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191YXJ0MyA9IHsKKwkucGFyZW50CQk9ICZjbGtfcGNsaywKKwkuZW5hYmxlCQk9IGxvY2FsX29ub2ZmX2VuYWJsZSwKKwkuZW5hYmxlX3JlZwk9IExQQzMyWFhfQ0xLUFdSX1VBUlRfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfVUFSVENMS0NUUkxfVUFSVDNfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VhcnQ0ID0geworCS5wYXJlbnQJCT0gJmNsa19wY2xrLAorCS5lbmFibGUJCT0gbG9jYWxfb25vZmZfZW5hYmxlLAorCS5lbmFibGVfcmVnCT0gTFBDMzJYWF9DTEtQV1JfVUFSVF9DTEtfQ1RSTCwKKwkuZW5hYmxlX21hc2sJPSBMUEMzMlhYX0NMS1BXUl9VQVJUQ0xLQ1RSTF9VQVJUNF9FTiwKKwkuZ2V0X3JhdGUJPSBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjbGtfdWFydDUgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9VQVJUX0NMS19DVFJMLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1VBUlRDTEtDVFJMX1VBUlQ1X0VOLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191YXJ0NiA9IHsKKwkucGFyZW50CQk9ICZjbGtfcGNsaywKKwkuZW5hYmxlCQk9IGxvY2FsX29ub2ZmX2VuYWJsZSwKKwkuZW5hYmxlX3JlZwk9IExQQzMyWFhfQ0xLUFdSX1VBUlRfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfVUFSVENMS0NUUkxfVUFSVDZfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyYzAgPSB7CisJLnBhcmVudAkJPSAmY2xrX2hjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9JMkNfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfSTJDQ0xLX0kyQzFDTEtfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyYzEgPSB7CisJLnBhcmVudAkJPSAmY2xrX2hjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9JMkNfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfSTJDQ0xLX0kyQzJDTEtfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyYzIgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBpb19wMnYoTFBDMzJYWF9VU0JfQkFTRSArIDB4RkY0KSwKKwkuZW5hYmxlX21hc2sJPSAweDQsCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NzcDAgPSB7CisJLnBhcmVudAkJPSAmY2xrX2hjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9TU1BfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfU1NQQ1RSTF9TU1BDTEswX0VOLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19zc3AxID0geworCS5wYXJlbnQJCT0gJmNsa19oY2xrLAorCS5lbmFibGUJCT0gbG9jYWxfb25vZmZfZW5hYmxlLAorCS5lbmFibGVfcmVnCT0gTFBDMzJYWF9DTEtQV1JfU1NQX0NMS19DVFJMLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX1NTUENUUkxfU1NQQ0xLMV9FTiwKKwkuZ2V0X3JhdGUJPSBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjbGtfa3NjYW4gPSB7CisJLnBhcmVudAkJPSAmb3NjXzMyS0h6LAorCS5lbmFibGUJCT0gbG9jYWxfb25vZmZfZW5hYmxlLAorCS5lbmFibGVfcmVnCT0gTFBDMzJYWF9DTEtQV1JfS0VZX0NMS19DVFJMLAorCS5lbmFibGVfbWFzawk9IExQQzMyWFhfQ0xLUFdSX0tFWUNMS0NUUkxfQ0xLX0VOLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19uYW5kID0geworCS5wYXJlbnQJCT0gJmNsa19oY2xrLAorCS5lbmFibGUJCT0gbG9jYWxfb25vZmZfZW5hYmxlLAorCS5lbmFibGVfcmVnCT0gTFBDMzJYWF9DTEtQV1JfTkFORF9DTEtfQ1RSTCwKKwkuZW5hYmxlX21hc2sJPSBMUEMzMlhYX0NMS1BXUl9OQU5EQ0xLX1NMQ0NMS19FTiwKKwkuZ2V0X3JhdGUJPSBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjbGtfaTJzMCA9IHsKKwkucGFyZW50CQk9ICZjbGtfaGNsaywKKwkuZW5hYmxlCQk9IGxvY2FsX29ub2ZmX2VuYWJsZSwKKwkuZW5hYmxlX3JlZwk9IExQQzMyWFhfQ0xLUFdSX0kyU19DTEtfQ1RSTCwKKwkuZW5hYmxlX21hc2sJPSBMUEMzMlhYX0NMS1BXUl9JMlNDVFJMX0kyU0NMSzBfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyczEgPSB7CisJLnBhcmVudAkJPSAmY2xrX2hjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9JMlNfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfSTJTQ1RSTF9JMlNDTEsxX0VOLAorCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19uZXQgPSB7CisJLnBhcmVudAkJPSAmY2xrX2hjbGssCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9NQUNDTEtfQ1RSTCwKKwkuZW5hYmxlX21hc2sJPSAoTFBDMzJYWF9DTEtQV1JfTUFDQ1RSTF9ETUFDTEtfRU4gfAorCQlMUEMzMlhYX0NMS1BXUl9NQUNDVFJMX01NSU9DTEtfRU4gfAorCQlMUEMzMlhYX0NMS1BXUl9NQUNDVFJMX0hSQ0NMS19FTiksCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3J0YyA9IHsKKwkucGFyZW50CQk9ICZvc2NfMzJLSHosCisJLnJhdGUJCT0gMSwgLyogMSBIeiAqLworCS5nZXRfcmF0ZQk9IGxvY2FsX3JldHVybl9wYXJlbnRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191c2JkID0geworCS5wYXJlbnQJCT0gJmNsa191c2JwbGwsCisJLmVuYWJsZQkJPSBsb2NhbF9vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9VU0JfQ1RSTCwKKwkuZW5hYmxlX21hc2sJPSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX0hDTEtfRU4sCisJLmdldF9yYXRlCT0gbG9jYWxfcmV0dXJuX3BhcmVudF9yYXRlLAorfTsKKworc3RhdGljIGludCB0c2Nfb25vZmZfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwl1MzIgdG1wOworCisJLyogTWFrZSBzdXJlIDMyS0h6IGNsb2NrIGlzIHRoZSBzZWxlY3RlZCBjbG9jayAqLworCXRtcCA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX0FEQ19DTEtfQ1RSTF8xKTsKKwl0bXAgJj0gfkxQQzMyWFhfQ0xLUFdSX0FEQ0NUUkwxX1BDTEtfU0VMOworCV9fcmF3X3dyaXRlbCh0bXAsIExQQzMyWFhfQ0xLUFdSX0FEQ19DTEtfQ1RSTF8xKTsKKworCWlmIChlbmFibGUgPT0gMCkKKwkJX19yYXdfd3JpdGVsKDAsIGNsay0+ZW5hYmxlX3JlZyk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoY2xrLT5lbmFibGVfbWFzaywgY2xrLT5lbmFibGVfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGtfdHNjID0geworCS5wYXJlbnQJCT0gJm9zY18zMktIeiwKKwkuZW5hYmxlCQk9IHRzY19vbm9mZl9lbmFibGUsCisJLmVuYWJsZV9yZWcJPSBMUEMzMlhYX0NMS1BXUl9BRENfQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfQURDMzJDTEtDVFJMX0NMS19FTiwKKwkuZ2V0X3JhdGUJPSBsb2NhbF9yZXR1cm5fcGFyZW50X3JhdGUsCit9OworCitzdGF0aWMgaW50IG1tY19vbm9mZl9lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXUzMiB0bXA7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9NU19DVFJMKSAmCisJCX5MUEMzMlhYX0NMS1BXUl9NU0NBUkRfU0RDQVJEX0VOOworCisJLyogSWYgcmF0ZSBpcyAwLCBkaXNhYmxlIGNsb2NrICovCisJaWYgKGVuYWJsZSAhPSAwKQorCQl0bXAgfD0gTFBDMzJYWF9DTEtQV1JfTVNDQVJEX1NEQ0FSRF9FTjsKKworCV9fcmF3X3dyaXRlbCh0bXAsIExQQzMyWFhfQ0xLUFdSX01TX0NUUkwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1tY19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGRpdiwgcmF0ZSwgb2xkY2xrOworCisJLyogVGhlIE1NQyBjbG9jayBtdXN0IGJlIG9uIHdoZW4gYWNjZXNzaW5nIGFuIE1NQyByZWdpc3RlciAqLworCW9sZGNsayA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX01TX0NUUkwpOworCV9fcmF3X3dyaXRlbChvbGRjbGsgfCBMUEMzMlhYX0NMS1BXUl9NU0NBUkRfU0RDQVJEX0VOLAorCQlMUEMzMlhYX0NMS1BXUl9NU19DVFJMKTsKKwlkaXYgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9NU19DVFJMKTsKKwlfX3Jhd193cml0ZWwob2xkY2xrLCBMUEMzMlhYX0NMS1BXUl9NU19DVFJMKTsKKworCS8qIEdldCB0aGUgcGFyZW50IGNsb2NrIHJhdGUgKi8KKwlyYXRlID0gY2xrLT5wYXJlbnQtPmdldF9yYXRlKGNsay0+cGFyZW50KTsKKworCS8qIEdldCB0aGUgTU1DIGNvbnRyb2xsZXIgY2xvY2sgZGl2aWRlciB2YWx1ZSAqLworCWRpdiA9IGRpdiAmIExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9TRENBUkRfRElWKDB4Zik7CisKKwlpZiAoIWRpdikKKwkJZGl2ID0gMTsKKworCXJldHVybiByYXRlIC8gZGl2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWNfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpdiwgcHJhdGU7CisKKwkvKiBHZXQgdGhlIHBhcmVudCBjbG9jayByYXRlICovCisJcHJhdGUgPSBjbGstPnBhcmVudC0+Z2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJaWYgKHJhdGUgPj0gcHJhdGUpCisJCXJldHVybiBwcmF0ZTsKKworCWRpdiA9IHByYXRlIC8gcmF0ZTsKKwlpZiAoZGl2ID4gMHhmKQorCQlkaXYgPSAweGY7CisKKwlyZXR1cm4gcHJhdGUgLyBkaXY7Cit9CisKK3N0YXRpYyBpbnQgbW1jX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiBvbGRjbGssIHRtcDsKKwl1bnNpZ25lZCBsb25nIHByYXRlLCBkaXYsIGNyYXRlID0gbW1jX3JvdW5kX3JhdGUoY2xrLCByYXRlKTsKKworCXByYXRlID0gY2xrLT5wYXJlbnQtPmdldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWRpdiA9IHByYXRlIC8gY3JhdGU7CisKKwkvKiBUaGUgTU1DIGNsb2NrIG11c3QgYmUgb24gd2hlbiBhY2Nlc3NpbmcgYW4gTU1DIHJlZ2lzdGVyICovCisJb2xkY2xrID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfTVNfQ1RSTCk7CisJX19yYXdfd3JpdGVsKG9sZGNsayB8IExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9TRENBUkRfRU4sCisJCUxQQzMyWFhfQ0xLUFdSX01TX0NUUkwpOworCXRtcCA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX01TX0NUUkwpICYKKwkJfkxQQzMyWFhfQ0xLUFdSX01TQ0FSRF9TRENBUkRfRElWKDB4Zik7CisJdG1wIHw9IExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9TRENBUkRfRElWKGRpdik7CisJX19yYXdfd3JpdGVsKHRtcCwgTFBDMzJYWF9DTEtQV1JfTVNfQ1RSTCk7CisKKwlfX3Jhd193cml0ZWwob2xkY2xrLCBMUEMzMlhYX0NMS1BXUl9NU19DVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGtfbW1jID0geworCS5wYXJlbnQJCT0gJmNsa19hcm1wbGwsCisJLnNldF9yYXRlCT0gbW1jX3NldF9yYXRlLAorCS5nZXRfcmF0ZQk9IG1tY19nZXRfcmF0ZSwKKwkucm91bmRfcmF0ZQk9IG1tY19yb3VuZF9yYXRlLAorCS5lbmFibGUJCT0gbW1jX29ub2ZmX2VuYWJsZSwKKwkuZW5hYmxlX3JlZwk9IExQQzMyWFhfQ0xLUFdSX01TX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfTVNDQVJEX1NEQ0FSRF9FTiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsY2RfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB0bXAsIGRpdiwgcmF0ZSwgb2xkY2xrOworCisJLyogVGhlIExDRCBjbG9jayBtdXN0IGJlIG9uIHdoZW4gYWNjZXNzaW5nIGFuIExDRCByZWdpc3RlciAqLworCW9sZGNsayA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX0xDRENMS19DVFJMKTsKKwlfX3Jhd193cml0ZWwob2xkY2xrIHwgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9DTEtfRU4sCisJCUxQQzMyWFhfQ0xLUFdSX0xDRENMS19DVFJMKTsKKwl0bXAgPSBfX3Jhd19yZWFkbChpb19wMnYoTFBDMzJYWF9MQ0RfQkFTRSArIENMQ0RfVElNMikpOworCV9fcmF3X3dyaXRlbChvbGRjbGssIExQQzMyWFhfQ0xLUFdSX0xDRENMS19DVFJMKTsKKworCXJhdGUgPSBjbGstPnBhcmVudC0+Z2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJLyogT25seSBzdXBwb3J0cyBpbnRlcm5hbCBjbG9ja2luZyAqLworCWlmICh0bXAgJiBUSU0yX0JDRCkKKwkJcmV0dXJuIHJhdGU7CisKKwlkaXYgPSAodG1wICYgMHgxRikgfCAoKHRtcCAmIDB4RjgpID4+IDIyKTsKKwl0bXAgPSByYXRlIC8gKDIgKyBkaXYpOworCisJcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGludCBjbGNkX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiB0bXAsIHByYXRlLCBkaXYsIG9sZGNsazsKKworCS8qIFRoZSBMQ0QgY2xvY2sgbXVzdCBiZSBvbiB3aGVuIGFjY2Vzc2luZyBhbiBMQ0QgcmVnaXN0ZXIgKi8KKwlvbGRjbGsgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9MQ0RDTEtfQ1RSTCk7CisJX19yYXdfd3JpdGVsKG9sZGNsayB8IExQQzMyWFhfQ0xLUFdSX0xDRENUUkxfQ0xLX0VOLAorCQlMUEMzMlhYX0NMS1BXUl9MQ0RDTEtfQ1RSTCk7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChpb19wMnYoTFBDMzJYWF9MQ0RfQkFTRSArIENMQ0RfVElNMikpIHwgVElNMl9CQ0Q7CisJcHJhdGUgPSBjbGstPnBhcmVudC0+Z2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJaWYgKHJhdGUgPCBwcmF0ZSkgeworCQkvKiBGaW5kIGNsb3Nlc3QgZGl2aWRlciAqLworCQlkaXYgPSBwcmF0ZSAvIHJhdGU7CisJCWlmIChkaXYgPj0gMikgeworCQkJZGl2IC09IDI7CisJCQl0bXAgJj0gflRJTTJfQkNEOworCQl9CisKKwkJdG1wICY9IH4oMHhGODAwMDAxRik7CisJCXRtcCB8PSAoZGl2ICYgMHgxRik7CisJCXRtcCB8PSAoKChkaXYgPj4gNSkgJiAweDFGKSA8PCAyNyk7CisJfQorCisJX19yYXdfd3JpdGVsKHRtcCwgaW9fcDJ2KExQQzMyWFhfTENEX0JBU0UgKyBDTENEX1RJTTIpKTsKKwlfX3Jhd193cml0ZWwob2xkY2xrLCBMUEMzMlhYX0NMS1BXUl9MQ0RDTEtfQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xjZF9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiBwcmF0ZSwgZGl2OworCisJcHJhdGUgPSBjbGstPnBhcmVudC0+Z2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJaWYgKHJhdGUgPj0gcHJhdGUpCisJCXJhdGUgPSBwcmF0ZTsKKwllbHNlIHsKKwkJZGl2ID0gcHJhdGUgLyByYXRlOworCQlpZiAoZGl2ID4gMHgzZmYpCisJCQlkaXYgPSAweDNmZjsKKworCQlyYXRlID0gcHJhdGUgLyBkaXY7CisJfQorCisJcmV0dXJuIHJhdGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19sY2QgPSB7CisJLnBhcmVudAkJPSAmY2xrX2hjbGssCisJLnNldF9yYXRlCT0gY2xjZF9zZXRfcmF0ZSwKKwkuZ2V0X3JhdGUJPSBjbGNkX2dldF9yYXRlLAorCS5yb3VuZF9yYXRlCT0gY2xjZF9yb3VuZF9yYXRlLAorCS5lbmFibGUJCT0gbG9jYWxfb25vZmZfZW5hYmxlLAorCS5lbmFibGVfcmVnCT0gTFBDMzJYWF9DTEtQV1JfTENEQ0xLX0NUUkwsCisJLmVuYWJsZV9tYXNrCT0gTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9DTEtfRU4sCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY2xrX2xvY2sodm9pZCkKK3sKKwltdXRleF9sb2NrKCZjbGttX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xrX3VubG9jayh2b2lkKQoreworCW11dGV4X3VubG9jaygmY2xrbV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbG9jYWxfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCVdBUk5fT04oY2xrLT51c2Vjb3VudCA9PSAwKTsKKworCS8qIERvbid0IGF0dGVtcHQgdG8gZGlzYWJsZSBjbG9jayBpZiBpdCBoYXMgbm8gdXNlcnMgKi8KKwlpZiAoY2xrLT51c2Vjb3VudCA+IDApIHsKKwkJY2xrLT51c2Vjb3VudC0tOworCisJCS8qIE9ubHkgZGlzYWJsZSBjbG9jayB3aGVuIGl0IGhhcyBubyBtb3JlIHVzZXJzICovCisJCWlmICgoY2xrLT51c2Vjb3VudCA9PSAwKSAmJiAoY2xrLT5lbmFibGUpKQorCQkJY2xrLT5lbmFibGUoY2xrLCAwKTsKKworCQkvKiBDaGVjayBwYXJlbnQgY2xvY2tzLCB0aGV5IG1heSBuZWVkIHRvIGJlIGRpc2FibGVkIHRvbyAqLworCQlpZiAoY2xrLT5wYXJlbnQpCisJCQlsb2NhbF9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CisJfQorfQorCitzdGF0aWMgaW50IGxvY2FsX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCWludCByZXQgPSAwOworCisJLyogRW5hYmxlIHBhcmVudCBjbG9ja3MgZmlyc3QgYW5kIHVwZGF0ZSB1c2UgY291bnRzICovCisJaWYgKGNsay0+cGFyZW50KQorCQlyZXQgPSBsb2NhbF9jbGtfZW5hYmxlKGNsay0+cGFyZW50KTsKKworCWlmICghcmV0KSB7CisJCS8qIE9ubHkgZW5hYmxlIGNsb2NrIGlmIGl0J3MgY3VycmVudGx5IGRpc2FibGVkICovCisJCWlmICgoY2xrLT51c2Vjb3VudCA9PSAwKSAmJiAoY2xrLT5lbmFibGUpKQorCQkJcmV0ID0gY2xrLT5lbmFibGUoY2xrLCAxKTsKKworCQlpZiAoIXJldCkKKwkJCWNsay0+dXNlY291bnQrKzsKKwkJZWxzZSBpZiAoY2xrLT5wYXJlbnQpCisJCQlsb2NhbF9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNsa19lbmFibGUgLSBpbmZvcm0gdGhlIHN5c3RlbSB3aGVuIHRoZSBjbG9jayBzb3VyY2Ugc2hvdWxkIGJlIHJ1bm5pbmcuCisgKi8KK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgcmV0OworCisJY2xrX2xvY2soKTsKKwlyZXQgPSBsb2NhbF9jbGtfZW5hYmxlKGNsayk7CisJY2xrX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7CisKKy8qCisgKiBjbGtfZGlzYWJsZSAtIGluZm9ybSB0aGUgc3lzdGVtIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQKKyAqLwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJY2xrX2xvY2soKTsKKwlsb2NhbF9jbGtfZGlzYWJsZShjbGspOworCWNsa191bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOworCisvKgorICogY2xrX2dldF9yYXRlIC0gb2J0YWluIHRoZSBjdXJyZW50IGNsb2NrIHJhdGUgKGluIEh6KSBmb3IgYSBjbG9jayBzb3VyY2UKKyAqLwordW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKworCWNsa19sb2NrKCk7CisJcmF0ZSA9IGNsay0+Z2V0X3JhdGUoY2xrKTsKKwljbGtfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKKworLyoKKyAqIGNsa19zZXRfcmF0ZSAtIHNldCB0aGUgY2xvY2sgcmF0ZSBmb3IgYSBjbG9jayBzb3VyY2UKKyAqLworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qCisJICogTW9zdCBzeXN0ZW0gY2xvY2tzIGNhbiBvbmx5IGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQsIHdpdGgKKwkgKiB0aGUgYWN0dWFsIHJhdGUgc2V0IGFzIHBhcnQgb2YgdGhlIHBlcmlwaGVyYWwgZGl2aWRlcnMKKwkgKiBpbnN0ZWFkIG9mIGhpZ2ggbGV2ZWwgY2xvY2sgY29udHJvbAorCSAqLworCWlmIChjbGstPnNldF9yYXRlKSB7CisJCWNsa19sb2NrKCk7CisJCXJldCA9IGNsay0+c2V0X3JhdGUoY2xrLCByYXRlKTsKKwkJY2xrX3VubG9jaygpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7CisKKy8qCisgKiBjbGtfcm91bmRfcmF0ZSAtIGFkanVzdCBhIHJhdGUgdG8gdGhlIGV4YWN0IHJhdGUgYSBjbG9jayBjYW4gcHJvdmlkZQorICovCitsb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWNsa19sb2NrKCk7CisKKwlpZiAoY2xrLT5yb3VuZF9yYXRlKQorCQlyYXRlID0gY2xrLT5yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisJZWxzZQorCQlyYXRlID0gY2xrLT5nZXRfcmF0ZShjbGspOworCisJY2xrX3VubG9jaygpOworCisJcmV0dXJuIHJhdGU7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKKworLyoKKyAqIGNsa19zZXRfcGFyZW50IC0gc2V0IHRoZSBwYXJlbnQgY2xvY2sgc291cmNlIGZvciB0aGlzIGNsb2NrCisgKi8KK2ludCBjbGtfc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwkvKiBDbG9jayByZS1wYXJlbnRpbmcgaXMgbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChjbGtfc2V0X3BhcmVudCk7CisKKy8qCisgKiBjbGtfZ2V0X3BhcmVudCAtIGdldCB0aGUgcGFyZW50IGNsb2NrIHNvdXJjZSBmb3IgdGhpcyBjbG9jaworICovCitzdHJ1Y3QgY2xrICpjbGtfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cGFyZW50OworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3BhcmVudCk7CisKKyNkZWZpbmUgX1JFR0lTVEVSX0NMT0NLKGQsIG4sIGMpIFwKKwl7IFwKKwkJLmRldl9pZCA9IChkKSwgXAorCQkuY29uX2lkID0gKG4pLCBcCisJCS5jbGsgPSAmKGMpLCBcCisJfSwKKworc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm9zY18zMktIeiIsIG9zY18zMktIeikKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm9zY19wbGwzOTciLCBvc2NfcGxsMzk3KQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAib3NjX21haW4iLCBvc2NfbWFpbikKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInN5c19jayIsIGNsa19zeXMpCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhcm1fcGxsX2NrIiwgY2xrX2FybXBsbCkKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImNrX3BsbDUiLCBjbGtfdXNicGxsKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiaGNsa19jayIsIGNsa19oY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicGNsa19jayIsIGNsa19wY2xrKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAidGltZXIwX2NrIiwgY2xrX3RpbWVyMCkKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInRpbWVyMV9jayIsIGNsa190aW1lcjEpCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJ0aW1lcjJfY2siLCBjbGtfdGltZXIyKQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAidGltZXIzX2NrIiwgY2xrX3RpbWVyMykKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInZmcDlfY2siLCBjbGtfdmZwOSkKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImNsa19kbWFjIiwgY2xrX2RtYSkKKwlfUkVHSVNURVJfQ0xPQ0soInBueDQwMDgtd2F0Y2hkb2ciLCBOVUxMLCBjbGtfd2R0KQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAidWFydDNfY2siLCBjbGtfdWFydDMpCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJ1YXJ0NF9jayIsIGNsa191YXJ0NCkKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInVhcnQ1X2NrIiwgY2xrX3VhcnQ1KQorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAidWFydDZfY2siLCBjbGtfdWFydDYpCisJX1JFR0lTVEVSX0NMT0NLKCJwbngtaTJjLjAiLCBOVUxMLCBjbGtfaTJjMCkKKwlfUkVHSVNURVJfQ0xPQ0soInBueC1pMmMuMSIsIE5VTEwsIGNsa19pMmMxKQorCV9SRUdJU1RFUl9DTE9DSygicG54LWkyYy4yIiwgTlVMTCwgY2xrX2kyYzIpCisJX1JFR0lTVEVSX0NMT0NLKCJkZXY6c3NwMCIsIE5VTEwsIGNsa19zc3AwKQorCV9SRUdJU1RFUl9DTE9DSygiZGV2OnNzcDEiLCBOVUxMLCBjbGtfc3NwMSkKKwlfUkVHSVNURVJfQ0xPQ0soImxwYzMyeHhfa2V5cy4wIiwgTlVMTCwgY2xrX2tzY2FuKQorCV9SRUdJU1RFUl9DTE9DSygibHBjMzJ4eC1uYW5kLjAiLCAibmFuZF9jayIsIGNsa19uYW5kKQorCV9SRUdJU1RFUl9DTE9DSygidGJkIiwgImkyczBfY2siLCBjbGtfaTJzMCkKKwlfUkVHSVNURVJfQ0xPQ0soInRiZCIsICJpMnMxX2NrIiwgY2xrX2kyczEpCisJX1JFR0lTVEVSX0NMT0NLKCJscGMzMnh4LXRzIiwgTlVMTCwgY2xrX3RzYykKKwlfUkVHSVNURVJfQ0xPQ0soImRldjptbWMwIiwgIk1DTEsiLCBjbGtfbW1jKQorCV9SRUdJU1RFUl9DTE9DSygibHBjLW5ldC4wIiwgTlVMTCwgY2xrX25ldCkKKwlfUkVHSVNURVJfQ0xPQ0soImRldjpjbGNkIiwgTlVMTCwgY2xrX2xjZCkKKwlfUkVHSVNURVJfQ0xPQ0soImxwYzMyeHhfdWRjIiwgImNrX3VzYmQiLCBjbGtfdXNiZCkKKwlfUkVHSVNURVJfQ0xPQ0soImxwYzMyeHhfcnRjIiwgTlVMTCwgY2xrX3J0YykKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsa19pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsb29rdXBzKTsgaSsrKQorCQljbGtkZXZfYWRkKCZsb29rdXBzW2ldKTsKKworCS8qCisJICogU2V0dXAgbXV4ZWQgU1lTQ0xLIGZvciBIQ0xLIFBMTCBiYXNlIC10aGlzIHNlbGVjdHMgdGhlCisJICogcGFyZW50IGNsb2NrIHVzZWQgZm9yIHRoZSBBUk0gUExMIGFuZCBpcyB1c2VkIHRvIGRlcml2ZQorCSAqIHRoZSBtYW55IHN5c3RlbSBjbG9jayByYXRlcyBpbiB0aGUgZGV2aWNlLgorCSAqLworCWlmIChjbGtfaXNfc3lzY2xrX21haW5vc2MoKSAhPSAwKQorCQljbGtfc3lzLnBhcmVudCA9ICZvc2NfbWFpbjsKKwllbHNlCisJCWNsa19zeXMucGFyZW50ID0gJm9zY19wbGwzOTc7CisKKwljbGtfc3lzLnJhdGUgPSBjbGtfc3lzLnBhcmVudC0+cmF0ZTsKKworCS8qIENvbXB1dGUgdGhlIGN1cnJlbnQgQVJNIFBMTCBhbmQgVVNCIFBMTCBmcmVxdWVuY2llcyAqLworCWxvY2FsX3VwZGF0ZV9hcm1wbGxfcmF0ZSgpOworCisJLyogQ29tcHV0ZSBIQ0xLIGFuZCBQQ0xLIGJ1cyByYXRlcyAqLworCWNsa19oY2xrLnJhdGUgPSBjbGtfaGNsay5wYXJlbnQtPnJhdGUgLyBjbGtfZ2V0X2hjbGtfZGl2KCk7CisJY2xrX3BjbGsucmF0ZSA9IGNsa19wY2xrLnBhcmVudC0+cmF0ZSAvIGNsa19nZXRfcGNsa19kaXYoKTsKKworCS8qCisJICogRW5hYmxlIHN5c3RlbSBjbG9ja3MgLSB0aGlzIHN0ZXAgaXMgc29tZXdoYXQgZm9ybWFsLCBhcyB0aGUKKwkgKiBjbG9ja3MgYXJlIGFscmVhZHkgcnVubmluZywgYnV0IGl0IGRvZXMgZ2V0IHRoZSBjbG9jayBkYXRhCisJICogaW5saW5lIHdpdGggdGhlIGFjdHVhbCBzeXN0ZW0gc3RhdGUuIE5ldmVyIGRpc2FibGUgdGhlc2UKKwkgKiBjbG9ja3MgYXMgdGhleSB3aWxsIG9ubHkgc3RvcCBpZiB0aGUgc3lzdGVtIGlzIGdvaW5nIHRvIHNsZWVwLgorCSAqIEluIHRoYXQgY2FzZSwgdGhlIGNoaXAvc3lzdGVtIHBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zIHdpbGwKKwkgKiBoYW5kbGUgY2xvY2sgZ2F0aW5nLgorCSAqLworCWlmIChjbGtfZW5hYmxlKCZjbGtfaGNsaykgfHwgY2xrX2VuYWJsZSgmY2xrX3BjbGspKQorCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGVuYWJsaW5nIHN5c3RlbSBIQ0xLIGFuZCBQQ0xLXG4iKTsKKworCS8qCisJICogVGltZXJzIDAgYW5kIDEgd2VyZSBlbmFibGVkIGFuZCBhcmUgYmVpbmcgdXNlZCBieSB0aGUgaGlnaAorCSAqIHJlc29sdXRpb24gdGljayBmdW5jdGlvbiBwcmlvciB0byB0aGlzIGRyaXZlciBiZWluZyBpbml0aWFsaXplZC4KKwkgKiBUYWcgdGhlbSBub3cgYXMgdXNlZC4KKwkgKi8KKwlpZiAoY2xrX2VuYWJsZSgmY2xrX3RpbWVyMCkgfHwgY2xrX2VuYWJsZSgmY2xrX3RpbWVyMSkpCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgZW5hYmxpbmcgdGltZXIgdGljayBjbG9ja3NcbiIpOworCisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKGNsa19pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGE4NDM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2Nsb2NrLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9jbG9jay5oCisgKgorICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19MUEMzMlhYX0NMT0NLX0gKKyNkZWZpbmUgX19MUEMzMlhYX0NMT0NLX0gKKworc3RydWN0IGNsayB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBjbGsgKnBhcmVudDsKKwl1MzIgcmF0ZTsKKwl1MzIgdXNlY291bnQ7CisKKwlpbnQgKCpzZXRfcmF0ZSkgKHN0cnVjdCBjbGsgKiwgdW5zaWduZWQgbG9uZyk7CisJdW5zaWduZWQgbG9uZyAoKnJvdW5kX3JhdGUpIChzdHJ1Y3QgY2xrICosIHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfcmF0ZSkgKHN0cnVjdCBjbGsgKmNsayk7CisJaW50ICgqZW5hYmxlKSAoc3RydWN0IGNsayAqLCBpbnQpOworCisJLyogUmVnaXN0ZXIgYWRkcmVzcyBhbmQgYml0IG1hc2sgZm9yIHNpbXBsZSBjbG9ja3MgKi8KKwl2b2lkIF9faW9tZW0gKmVuYWJsZV9yZWc7CisJdTMyIGVuYWJsZV9tYXNrOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyNGRjMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9jb21tb24uYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9jb21tb24uYworICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1wbnguaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2kyYy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qCisgKiBXYXRjaGRvZyB0aW1lcgorICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHdhdGNoZG9nX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gTFBDMzJYWF9XRFRJTV9CQVNFLAorCQkuZW5kID0gTFBDMzJYWF9XRFRJTV9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBscGMzMnh4X3dhdGNoZG9nX2RldmljZSA9IHsKKwkubmFtZSA9ICJwbng0MDA4LXdhdGNoZG9nIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod2F0Y2hkb2dfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSB3YXRjaGRvZ19yZXNvdXJjZXMsCit9OworCisvKgorICogSTJDIGJ1c3NlcworICovCitzdGF0aWMgc3RydWN0IGkyY19wbnhfZGF0YSBpMmMwX2RhdGEgPSB7CisJLm5hbWUgPSBJMkNfQ0hJUF9OQU1FICIxIiwKKwkuYmFzZSA9IExQQzMyWFhfSTJDMV9CQVNFLAorCS5pcnEgPSBJUlFfTFBDMzJYWF9JMkNfMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX3BueF9kYXRhIGkyYzFfZGF0YSA9IHsKKwkubmFtZSA9IEkyQ19DSElQX05BTUUgIjIiLAorCS5iYXNlID0gTFBDMzJYWF9JMkMyX0JBU0UsCisJLmlycSA9IElSUV9MUEMzMlhYX0kyQ18yLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfcG54X2RhdGEgaTJjMl9kYXRhID0geworCS5uYW1lID0gIlVTQi1JMkMiLAorCS5iYXNlID0gTFBDMzJYWF9PVEdfSTJDX0JBU0UsCisJLmlycSA9IElSUV9MUEMzMlhYX1VTQl9JMkMsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxwYzMyeHhfaTJjMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAicG54LWkyYyIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpMmMwX2RhdGEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbHBjMzJ4eF9pMmMxX2RldmljZSA9IHsKKwkubmFtZSA9ICJwbngtaTJjIiwKKwkuaWQgPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmkyYzFfZGF0YSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBscGMzMnh4X2kyYzJfZGV2aWNlID0geworCS5uYW1lID0gInBueC1pMmMiLAorCS5pZCA9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJjMl9kYXRhLAorCX0sCit9OworCisvKgorICogUmV0dXJucyB0aGUgdW5pcXVlIElEIGZvciB0aGUgZGV2aWNlCisgKi8KK3ZvaWQgbHBjMzJ4eF9nZXRfdWlkKHUzMiBkZXZpZFs0XSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWRldmlkW2ldID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfREVWSUQoaSA8PCAyKSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIFNZU0NMSyBzb3VyY2UKKyAqIDAgPSBQTEwzOTcsIDEgPSBtYWluIG9zY2lsbGF0b3IKKyAqLworaW50IGNsa19pc19zeXNjbGtfbWFpbm9zYyh2b2lkKQoreworCWlmICgoX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfU1lTQ0xLX0NUUkwpICYKKwkJTFBDMzJYWF9DTEtQV1JfU1lTQ1RSTF9TWVNDTEtNVVgpID09IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTeXN0ZW0gcmVzZXQgdmlhIHRoZSB3YXRjaGRvZyB0aW1lcgorICovCit2b2lkIGxwYzMyeHhfd2F0Y2hkb2dfcmVzZXQodm9pZCkKK3sKKwkvKiBNYWtlIHN1cmUgV0RUIGNsb2NrcyBhcmUgZW5hYmxlZCAqLworCV9fcmF3X3dyaXRlbChMUEMzMlhYX0NMS1BXUl9QV01DTEtfV0RPR19FTiwKKwkJTFBDMzJYWF9DTEtQV1JfVElNRVJfQ0xLX0NUUkwpOworCisJLyogSW5zdGFudCBhc3NlcnQgb2YgUkVTRVRPVVRfTiB3aXRoIHB1bHNlIGxlbmd0aCAxbVMgKi8KKwlfX3Jhd193cml0ZWwoMTMwMDAsIGlvX3AydihMUEMzMlhYX1dEVElNX0JBU0UgKyAweDE4KSk7CisJX19yYXdfd3JpdGVsKDB4NzAsIGlvX3AydihMUEMzMlhYX1dEVElNX0JBU0UgKyAweEMpKTsKK30KKworLyoKKyAqIERldGVjdHMgYW5kIHJldHVybnMgSVJBTSBzaXplIGZvciB0aGUgZGV2aWNlIHZhcmlhdGlvbgorICovCisjZGVmaW5lIExQQzMyWFhfSVJBTV9CQU5LX1NJWkUgU1pfMTI4Sworc3RhdGljIHUzMiBpcmFtX3NpemU7Cit1MzIgbHBjMzJ4eF9yZXR1cm5faXJhbV9zaXplKHZvaWQpCit7CisJaWYgKGlyYW1fc2l6ZSA9PSAwKSB7CisJCXUzMiBzYXZlZHZhbDEsIHNhdmVkdmFsMjsKKwkJdm9pZCBfX2lvbWVtICppcmFtcHRyMSwgKmlyYW1wdHIyOworCisJCWlyYW1wdHIxID0gaW9fcDJ2KExQQzMyWFhfSVJBTV9CQVNFKTsKKwkJaXJhbXB0cjIgPSBpb19wMnYoTFBDMzJYWF9JUkFNX0JBU0UgKyBMUEMzMlhYX0lSQU1fQkFOS19TSVpFKTsKKwkJc2F2ZWR2YWwxID0gX19yYXdfcmVhZGwoaXJhbXB0cjEpOworCQlzYXZlZHZhbDIgPSBfX3Jhd19yZWFkbChpcmFtcHRyMik7CisKKwkJaWYgKHNhdmVkdmFsMSA9PSBzYXZlZHZhbDIpIHsKKwkJCV9fcmF3X3dyaXRlbChzYXZlZHZhbDIgKyAxLCBpcmFtcHRyMik7CisJCQlpZiAoX19yYXdfcmVhZGwoaXJhbXB0cjEpID09IHNhdmVkdmFsMiArIDEpCisJCQkJaXJhbV9zaXplID0gTFBDMzJYWF9JUkFNX0JBTktfU0laRTsKKwkJCWVsc2UKKwkJCQlpcmFtX3NpemUgPSBMUEMzMlhYX0lSQU1fQkFOS19TSVpFICogMjsKKwkJCV9fcmF3X3dyaXRlbChzYXZlZHZhbDIsIGlyYW1wdHIyKTsKKwkJfSBlbHNlCisJCQlpcmFtX3NpemUgPSBMUEMzMlhYX0lSQU1fQkFOS19TSVpFICogMjsKKwl9CisKKwlyZXR1cm4gaXJhbV9zaXplOworfQorCisvKgorICogQ29tcHV0ZXMgUExMIHJhdGUgZnJvbSBQTEwgcmVnaXN0ZXIgYW5kIGlucHV0IGNsb2NrCisgKi8KK3UzMiBjbGtfY2hlY2tfcGxsX3NldHVwKHUzMiBpZnJlcSwgc3RydWN0IGNsa19wbGxfc2V0dXAgKnBsbHNldHVwKQoreworCXUzMiBpbGZyZXEsIHAsIG0sIG4sIGZjY28sIGZyZWYsIGNmcmVxOworCWludCBtb2RlOworCisJLyoKKwkgKiBQTEwgcmVxdWlyZW1lbnRzCisJICogaWZyZXEgbXVzdCBiZSA+PSAxTUh6IGFuZCA8PSAyME1IegorCSAqIEZDQ08gbXVzdCBiZSA+PSAxNTZNSHogYW5kIDw9IDMyME1IegorCSAqIEZSRUYgbXVzdCBiZSA+PSAxTUh6IGFuZCA8PSAyN01IegorCSAqIEFzc3VtZSB0aGUgcGFzc2VkIGlucHV0IGRhdGEgaXMgbm90IHZhbGlkCisJICovCisKKwlpbGZyZXEgPSBpZnJlcTsKKwltID0gcGxsc2V0dXAtPnBsbF9tOworCW4gPSBwbGxzZXR1cC0+cGxsX247CisJcCA9IHBsbHNldHVwLT5wbGxfcDsKKworCW1vZGUgPSAocGxsc2V0dXAtPmNjb19ieXBhc3NfYjE1IDw8IDIpIHwKKwkJKHBsbHNldHVwLT5kaXJlY3Rfb3V0cHV0X2IxNCA8PCAxKSB8CisJcGxsc2V0dXAtPmZkYmtfZGl2X2N0cmxfYjEzOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAweDA6IC8qIE5vbi1pbnRlZ2VyIG1vZGUgKi8KKwkJY2ZyZXEgPSAobSAqIGlsZnJlcSkgLyAoMiAqIHAgKiBuKTsKKwkJZmNjbyA9IChtICogaWxmcmVxKSAvIG47CisJCWZyZWYgPSBpbGZyZXEgLyBuOworCQlicmVhazsKKworCWNhc2UgMHgxOiAvKiBpbnRlZ2VyIG1vZGUgKi8KKwkJY2ZyZXEgPSAobSAqIGlsZnJlcSkgLyBuOworCQlmY2NvID0gKG0gKiBpbGZyZXEpIC8gKG4gKiAyICogcCk7CisJCWZyZWYgPSBpbGZyZXEgLyBuOworCQlicmVhazsKKworCWNhc2UgMHgyOgorCWNhc2UgMHgzOiAvKiBEaXJlY3QgbW9kZSAqLworCQljZnJlcSA9IChtICogaWxmcmVxKSAvIG47CisJCWZjY28gPSBjZnJlcTsKKwkJZnJlZiA9IGlsZnJlcSAvIG47CisJCWJyZWFrOworCisJY2FzZSAweDQ6CisJY2FzZSAweDU6IC8qIEJ5cGFzcyBtb2RlICovCisJCWNmcmVxID0gaWxmcmVxIC8gKDIgKiBwKTsKKwkJZmNjbyA9IDE1NjAwMDAwMDsKKwkJZnJlZiA9IDEwMDAwMDA7CisJCWJyZWFrOworCisJY2FzZSAweDY6CisJY2FzZSAweDc6IC8qIERpcmVjdCBieXBhc3MgbW9kZSAqLworCWRlZmF1bHQ6CisJCWNmcmVxID0gaWxmcmVxOworCQlmY2NvID0gMTU2MDAwMDAwOworCQlmcmVmID0gMTAwMDAwMDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZjY28gPCAxNTYwMDAwMDAgfHwgZmNjbyA+IDMyMDAwMDAwMCkKKwkJY2ZyZXEgPSAwOworCisJaWYgKGZyZWYgPCAxMDAwMDAwIHx8IGZyZWYgPiAyNzAwMDAwMCkKKwkJY2ZyZXEgPSAwOworCisJcmV0dXJuICh1MzIpIGNmcmVxOworfQorCit1MzIgY2xrX2dldF9wY2xrX2Rpdih2b2lkKQoreworCXJldHVybiAxICsgKChfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9IQ0xLX0RJVikgPj4gMikgJiAweDFGKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBscGMzMnh4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKExQQzMyWFhfQUhCMF9TVEFSVCksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihMUEMzMlhYX0FIQjBfU1RBUlQpLAorCQkubGVuZ3RoCQk9IExQQzMyWFhfQUhCMF9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKExQQzMyWFhfQUhCMV9TVEFSVCksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihMUEMzMlhYX0FIQjFfU1RBUlQpLAorCQkubGVuZ3RoCQk9IExQQzMyWFhfQUhCMV9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKExQQzMyWFhfRkFCQVBCX1NUQVJUKSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKExQQzMyWFhfRkFCQVBCX1NUQVJUKSwKKwkJLmxlbmd0aAkJPSBMUEMzMlhYX0ZBQkFQQl9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKExQQzMyWFhfSVJBTV9CQVNFKSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKExQQzMyWFhfSVJBTV9CQVNFKSwKKwkJLmxlbmd0aAkJPSAoTFBDMzJYWF9JUkFNX0JBTktfU0laRSAqIDIpLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorfTsKKwordm9pZCBfX2luaXQgbHBjMzJ4eF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobHBjMzJ4eF9pb19kZXNjLCBBUlJBWV9TSVpFKGxwYzMyeHhfaW9fZGVzYykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvY29tbW9uLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9jb21tb24uaAorICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19MUEMzMlhYX0NPTU1PTl9ICisjZGVmaW5lIF9fTFBDMzJYWF9DT01NT05fSAorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKy8qCisgKiBBcmNoIHNwZWNpZmljIHBsYXRmb3JtIGRldmljZSBzdHJ1Y3R1cmVzCisgKi8KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxwYzMyeHhfd2F0Y2hkb2dfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbHBjMzJ4eF9pMmMwX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxwYzMyeHhfaTJjMV9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBscGMzMnh4X2kyYzJfZGV2aWNlOworCisvKgorICogT3RoZXIgYXJjaCBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgbHBjMzJ4eF90aW1lcjsKK2V4dGVybiB2b2lkIF9faW5pdCBscGMzMnh4X2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGxwYzMyeHhfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGxwYzMyeHhfc2VyaWFsX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgbHBjMzJ4eF9ncGlvX2luaXQodm9pZCk7CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc2V0dGluZyB1cCBhbmQgcXVlcnlpbmcgdGhlIFBMTFMKKyAqLworc3RydWN0IGNsa19wbGxfc2V0dXAgeworCWludCBhbmFsb2dfb247CisJaW50IGNjb19ieXBhc3NfYjE1OworCWludCBkaXJlY3Rfb3V0cHV0X2IxNDsKKwlpbnQgZmRia19kaXZfY3RybF9iMTM7CisJaW50IHBsbF9wOworCWludCBwbGxfbjsKKwl1MzIgcGxsX207Cit9OworCitleHRlcm4gaW50IGNsa19pc19zeXNjbGtfbWFpbm9zYyh2b2lkKTsKK2V4dGVybiB1MzIgY2xrX2NoZWNrX3BsbF9zZXR1cCh1MzIgaWZyZXEsIHN0cnVjdCBjbGtfcGxsX3NldHVwICpwbGxzZXR1cCk7CitleHRlcm4gdTMyIGNsa19nZXRfcGxscmF0ZV9mcm9tX3JlZyh1MzIgaW5wdXRjbGssIHUzMiByZWd2YWwpOworZXh0ZXJuIHUzMiBjbGtfZ2V0X3BjbGtfZGl2KHZvaWQpOworCisvKgorICogUmV0dXJucyB0aGUgTFBDMzJ4eCB1bmlxdWUgMTI4LWJpdCBjaGlwIElECisgKi8KK2V4dGVybiB2b2lkIGxwYzMyeHhfZ2V0X3VpZCh1MzIgZGV2aWRbNF0pOworCitleHRlcm4gdm9pZCBscGMzMnh4X3dhdGNoZG9nX3Jlc2V0KHZvaWQpOworZXh0ZXJuIHUzMiBscGMzMnh4X3JldHVybl9pcmFtX3NpemUodm9pZCk7CisKKy8qCisgKiBQb2ludGVycyB1c2VkIGZvciBzaXppbmcgYW5kIGNvcHlpbmcgc3VzcGVuZCBmdW5jdGlvbiBkYXRhCisgKi8KK2V4dGVybiBpbnQgbHBjMzJ4eF9zeXNfc3VzcGVuZCh2b2lkKTsKK2V4dGVybiBpbnQgbHBjMzJ4eF9zeXNfc3VzcGVuZF9zejsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvZ3Bpb2xpYi5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2dwaW9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA2MWVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2dwaW9saWIuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9ncGlvbGliLmMKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfSU5QX1NUQVRFCQlfR1BSRUcoMHgwMDApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19PVVRQX1NFVAkJX0dQUkVHKDB4MDA0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9DTFIJCV9HUFJFRygweDAwOCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX09VVFBfU1RBVEUJCV9HUFJFRygweDAwQykKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0RJUl9TRVQJCQlfR1BSRUcoMHgwMTApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9ESVJfQ0xSCQkJX0dQUkVHKDB4MDE0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfRElSX1NUQVRFCQlfR1BSRUcoMHgwMTgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9JTlBfU1RBVEUJCV9HUFJFRygweDAxQykKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX09VVFBfU0VUCQlfR1BSRUcoMHgwMjApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9PVVRQX0NMUgkJX0dQUkVHKDB4MDI0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTVVYX1NFVAkJCV9HUFJFRygweDAyOCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01VWF9DTFIJCQlfR1BSRUcoMHgwMkMpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NVVhfU1RBVEUJCV9HUFJFRygweDAzMCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0lOUF9TVEFURQkJX0dQUkVHKDB4MDQwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9TRVQJCV9HUFJFRygweDA0NCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX09VVFBfQ0xSCQlfR1BSRUcoMHgwNDgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9PVVRQX1NUQVRFCQlfR1BSRUcoMHgwNEMpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9ESVJfU0VUCQkJX0dQUkVHKDB4MDUwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfRElSX0NMUgkJCV9HUFJFRygweDA1NCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0RJUl9TVEFURQkJX0dQUkVHKDB4MDU4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfSU5QX1NUQVRFCQlfR1BSRUcoMHgwNjApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9PVVRQX1NFVAkJX0dQUkVHKDB4MDY0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9DTFIJCV9HUFJFRygweDA2OCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX09VVFBfU1RBVEUJCV9HUFJFRygweDA2QykKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0RJUl9TRVQJCQlfR1BSRUcoMHgwNzApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9ESVJfQ0xSCQkJX0dQUkVHKDB4MDc0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfRElSX1NUQVRFCQlfR1BSRUcoMHgwNzgpCisKKyNkZWZpbmUgR1BJTzAxMl9QSU5fVE9fQklUKHgpCQkJKDEgPDwgKHgpKQorI2RlZmluZSBHUElPM19QSU5fVE9fQklUKHgpCQkJKDEgPDwgKCh4KSArIDI1KSkKKyNkZWZpbmUgR1BPM19QSU5fVE9fQklUKHgpCQkJKDEgPDwgKHgpKQorI2RlZmluZSBHUElPMDEyX1BJTl9JTl9TRUwoeCwgeSkJCSgoKHgpID4+ICh5KSkgJiAxKQorI2RlZmluZSBHUElPM19QSU5fSU5fU0hJRlQoeCkJCQkoKHgpID09IDUgPyAyNCA6IDEwICsgKHgpKQorI2RlZmluZSBHUElPM19QSU5fSU5fU0VMKHgsIHkpCQkJKCh4KSA+PiBHUElPM19QSU5fSU5fU0hJRlQoeSkpCisjZGVmaW5lIEdQSU8zX1BJTjVfSU5fU0VMKHgpCQkJKCgoeCkgPj4gMjQpICYgMSkKKyNkZWZpbmUgR1BJM19QSU5fSU5fU0VMKHgsIHkpCQkJKCgoeCkgPj4gKHkpKSAmIDEpCisKK3N0cnVjdCBncGlvX3JlZ3MgeworCXZvaWQgX19pb21lbSAqaW5wX3N0YXRlOworCXZvaWQgX19pb21lbSAqb3V0cF9zZXQ7CisJdm9pZCBfX2lvbWVtICpvdXRwX2NscjsKKwl2b2lkIF9faW9tZW0gKmRpcl9zZXQ7CisJdm9pZCBfX2lvbWVtICpkaXJfY2xyOworfTsKKworLyoKKyAqIEdQSU8gbmFtZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDBfbmFtZXNbTFBDMzJYWF9HUElPX1AwX01BWF0gPSB7CisJInAwLjAiLCAicDAuMSIsICJwMC4yIiwgInAwLjMiLAorCSJwMC40IiwgInAwLjUiLCAicDAuNiIsICJwMC43IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDFfbmFtZXNbTFBDMzJYWF9HUElPX1AxX01BWF0gPSB7CisJInAxLjAiLCAicDEuMSIsICJwMS4yIiwgInAxLjMiLAorCSJwMS40IiwgInAxLjUiLCAicDEuNiIsICJwMS43IiwKKwkicDEuOCIsICJwMS45IiwgInAxLjEwIiwgInAxLjExIiwKKwkicDEuMTIiLCAicDEuMTMiLCAicDEuMTQiLCAicDEuMTUiLAorCSJwMS4xNiIsICJwMS4xNyIsICJwMS4xOCIsICJwMS4xOSIsCisJInAxLjIwIiwgInAxLjIxIiwgInAxLjIyIiwgInAxLjIzIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpncGlvX3AyX25hbWVzW0xQQzMyWFhfR1BJT19QMl9NQVhdID0geworCSJwMi4wIiwgInAyLjEiLCAicDIuMiIsICJwMi4zIiwKKwkicDIuNCIsICJwMi41IiwgInAyLjYiLCAicDIuNyIsCisJInAyLjgiLCAicDIuOSIsICJwMi4xMCIsICJwMi4xMSIsCisJInAyLjEyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDNfbmFtZXNbTFBDMzJYWF9HUElPX1AzX01BWF0gPSB7CisJImdwaTAwMCIsICJncGlvMDEiLCAiZ3BpbzAyIiwgImdwaW8wMyIsCisJImdwaW8wNCIsICJncGlvMDUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ3BpX3AzX25hbWVzW0xQQzMyWFhfR1BJX1AzX01BWF0gPSB7CisJImdwaTAwIiwgImdwaTAxIiwgImdwaTAyIiwgImdwaTAzIiwKKwkiZ3BpMDQiLCAiZ3BpMDUiLCAiZ3BpMDYiLCAiZ3BpMDciLAorCSJncGkwOCIsICJncGkwOSIsICBOVUxMLCAgICBOVUxMLAorCSBOVUxMLCAgICBOVUxMLCAgICBOVUxMLCAgICJncGkxNSIsCisJImdwaTE2IiwgImdwaTE3IiwgImdwaTE4IiwgImdwaTE5IiwKKwkiZ3BpMjAiLCAiZ3BpMjEiLCAiZ3BpMjIiLCAiZ3BpMjMiLAorCSJncGkyNCIsICJncGkyNSIsICJncGkyNiIsICJncGkyNyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpncG9fcDNfbmFtZXNbTFBDMzJYWF9HUE9fUDNfTUFYXSA9IHsKKwkiZ3BvMDAiLCAiZ3BvMDEiLCAiZ3BvMDIiLCAiZ3BvMDMiLAorCSJncG8wNCIsICJncG8wNSIsICJncG8wNiIsICJncG8wNyIsCisJImdwbzA4IiwgImdwbzA5IiwgImdwbzEwIiwgImdwbzExIiwKKwkiZ3BvMTIiLCAiZ3BvMTMiLCAiZ3BvMTQiLCAiZ3BvMTUiLAorCSJncG8xNiIsICJncG8xNyIsICJncG8xOCIsICJncG8xOSIsCisJImdwbzIwIiwgImdwbzIxIiwgImdwbzIyIiwgImdwbzIzIgorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMCA9IHsKKwkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AwX0lOUF9TVEFURSwKKwkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9TRVQsCisJLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AwX09VVFBfQ0xSLAorCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AwX0RJUl9TRVQsCisJLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDBfRElSX0NMUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDEgPSB7CisJLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QMV9JTlBfU1RBVEUsCisJLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AxX09VVFBfU0VULAorCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QMV9PVVRQX0NMUiwKKwkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMV9ESVJfU0VULAorCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AxX0RJUl9DTFIsCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fcmVncyBncGlvX2dycF9yZWdzX3AyID0geworCS5pbnBfc3RhdGUJPSBMUEMzMlhYX0dQSU9fUDJfSU5QX1NUQVRFLAorCS5vdXRwX3NldAk9IExQQzMyWFhfR1BJT19QMl9PVVRQX1NFVCwKKwkub3V0cF9jbHIJPSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9DTFIsCisJLmRpcl9zZXQJPSBMUEMzMlhYX0dQSU9fUDJfRElSX1NFVCwKKwkuZGlyX2Nscgk9IExQQzMyWFhfR1BJT19QMl9ESVJfQ0xSLAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMyA9IHsKKwkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AzX0lOUF9TVEFURSwKKwkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9TRVQsCisJLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AzX09VVFBfQ0xSLAorCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AyX0RJUl9TRVQsCisJLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDJfRElSX0NMUiwKK307CisKK3N0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCB7CisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCXN0cnVjdCBncGlvX3JlZ3MJKmdwaW9fZ3JwOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKnRvX2xwYzMyeHhfZ3BpbygKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpncGMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihncGMsIHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCwgY2hpcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X2dwaW9fZGlyX3AwMTIoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4sIGludCBpbnB1dCkKK3sKKwlpZiAoaW5wdXQpCisJCV9fcmF3X3dyaXRlbChHUElPMDEyX1BJTl9UT19CSVQocGluKSwKKwkJCWdyb3VwLT5ncGlvX2dycC0+ZGlyX2Nscik7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCisJCQlncm91cC0+Z3Bpb19ncnAtPmRpcl9zZXQpOworfQorCitzdGF0aWMgdm9pZCBfX3NldF9ncGlvX2Rpcl9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbiwgaW50IGlucHV0KQoreworCXUzMiB1ID0gR1BJTzNfUElOX1RPX0JJVChwaW4pOworCisJaWYgKGlucHV0KQorCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfY2xyKTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbCh1LCBncm91cC0+Z3Bpb19ncnAtPmRpcl9zZXQpOworfQorCitzdGF0aWMgdm9pZCBfX3NldF9ncGlvX2xldmVsX3AwMTIoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4sIGludCBoaWdoKQoreworCWlmIChoaWdoKQorCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCisJCQlncm91cC0+Z3Bpb19ncnAtPm91dHBfc2V0KTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbChHUElPMDEyX1BJTl9UT19CSVQocGluKSwKKwkJCWdyb3VwLT5ncGlvX2dycC0+b3V0cF9jbHIpOworfQorCitzdGF0aWMgdm9pZCBfX3NldF9ncGlvX2xldmVsX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluLCBpbnQgaGlnaCkKK3sKKwl1MzIgdSA9IEdQSU8zX1BJTl9UT19CSVQocGluKTsKKworCWlmIChoaWdoKQorCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX3NldCk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX2Nscik7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X2dwb19sZXZlbF9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbiwgaW50IGhpZ2gpCit7CisJaWYgKGhpZ2gpCisJCV9fcmF3X3dyaXRlbChHUE8zX1BJTl9UT19CSVQocGluKSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX3NldCk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoR1BPM19QSU5fVE9fQklUKHBpbiksIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9jbHIpOworfQorCitzdGF0aWMgaW50IF9fZ2V0X2dwaW9fc3RhdGVfcDAxMihzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbikKK3sKKwlyZXR1cm4gR1BJTzAxMl9QSU5fSU5fU0VMKF9fcmF3X3JlYWRsKGdyb3VwLT5ncGlvX2dycC0+aW5wX3N0YXRlKSwKKwkJcGluKTsKK30KKworc3RhdGljIGludCBfX2dldF9ncGlvX3N0YXRlX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluKQoreworCWludCBzdGF0ZSA9IF9fcmF3X3JlYWRsKGdyb3VwLT5ncGlvX2dycC0+aW5wX3N0YXRlKTsKKworCS8qCisJICogUDMgR1BJTyBwaW4gaW5wdXQgbWFwcGluZyBpcyBub3QgY29udGlndW91cywgR1BJT1AzLTAuLjQgaXMgbWFwcGVkCisJICogdG8gYml0cyAxMC4uMTQsIHdoaWxlIEdQSU9QMy01IGlzIG1hcHBlZCB0byBiaXQgMjQuCisJICovCisJcmV0dXJuIEdQSU8zX1BJTl9JTl9TRUwoc3RhdGUsIHBpbik7Cit9CisKK3N0YXRpYyBpbnQgX19nZXRfZ3BpX3N0YXRlX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluKQoreworCXJldHVybiBHUEkzX1BJTl9JTl9TRUwoX19yYXdfcmVhZGwoZ3JvdXAtPmdwaW9fZ3JwLT5pbnBfc3RhdGUpLCBwaW4pOworfQorCisvKgorICogR0VORVJJQ19HUElPIHByaW1pdGl2ZXMuCisgKi8KK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncGlvX2Rpcl9wMDEyKGdyb3VwLCBwaW4sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCXVuc2lnbmVkIHBpbikKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3Bpb19kaXJfcDMoZ3JvdXAsIHBpbiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX2luX2Fsd2F5cyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCXVuc2lnbmVkIHBpbikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlyZXR1cm4gX19nZXRfZ3Bpb19zdGF0ZV9wMDEyKGdyb3VwLCBwaW4pOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlyZXR1cm4gX19nZXRfZ3Bpb19zdGF0ZV9wMyhncm91cCwgcGluKTsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaV9nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlyZXR1cm4gX19nZXRfZ3BpX3N0YXRlX3AzKGdyb3VwLCBwaW4pOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3Bpb19kaXJfcDAxMihncm91cCwgcGluLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwaW9fZGlyX3AzKGdyb3VwLCBwaW4sIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9vdXRfYWx3YXlzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKKwlpbnQgdmFsdWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJaW50IHZhbHVlKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncGlvX2xldmVsX3AwMTIoZ3JvdXAsIHBpbiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwaW9fbGV2ZWxfcDMoZ3JvdXAsIHBpbiwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBscGMzMnh4X2dwb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3BvX2xldmVsX3AzKGdyb3VwLCBwaW4sIHZhbHVlKTsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCit7CisJaWYgKHBpbiA8IGNoaXAtPm5ncGlvKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwIGxwYzMyeHhfZ3Bpb2NoaXBbXSA9IHsKKwl7CisJCS5jaGlwID0geworCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMCIsCisJCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyLAorCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyLAorCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyLAorCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyLAorCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCisJCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AwX0dSUCwKKwkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AwX01BWCwKKwkJCS5uYW1lcwkJCT0gZ3Bpb19wMF9uYW1lcywKKwkJCS5jYW5fc2xlZXAJCT0gMCwKKwkJfSwKKwkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDAsCisJfSwKKwl7CisJCS5jaGlwID0geworCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMSIsCisJCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyLAorCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyLAorCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyLAorCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyLAorCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCisJCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AxX0dSUCwKKwkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AxX01BWCwKKwkJCS5uYW1lcwkJCT0gZ3Bpb19wMV9uYW1lcywKKwkJCS5jYW5fc2xlZXAJCT0gMCwKKwkJfSwKKwkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDEsCisJfSwKKwl7CisJCS5jaGlwID0geworCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMiIsCisJCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyLAorCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyLAorCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyLAorCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyLAorCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCisJCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AyX0dSUCwKKwkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AyX01BWCwKKwkJCS5uYW1lcwkJCT0gZ3Bpb19wMl9uYW1lcywKKwkJCS5jYW5fc2xlZXAJCT0gMCwKKwkJfSwKKwkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDIsCisJfSwKKwl7CisJCS5jaGlwID0geworCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMyIsCisJCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMywKKwkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDMsCisJCQkuZGlyZWN0aW9uX291dHB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AzLAorCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMywKKwkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAorCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QM19HUlAsCisJCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QM19NQVgsCisJCQkubmFtZXMJCQk9IGdwaW9fcDNfbmFtZXMsCisJCQkuY2FuX3NsZWVwCQk9IDAsCisJCX0sCisJCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AzLAorCX0sCisJeworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwaV9wMyIsCisJCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbl9hbHdheXMsCisJCQkuZ2V0CQkJPSBscGMzMnh4X2dwaV9nZXRfdmFsdWUsCisJCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKKwkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSV9QM19HUlAsCisJCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJX1AzX01BWCwKKwkJCS5uYW1lcwkJCT0gZ3BpX3AzX25hbWVzLAorCQkJLmNhbl9zbGVlcAkJPSAwLAorCQl9LAorCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMywKKwl9LAorCXsKKwkJLmNoaXAgPSB7CisJCQkubGFiZWwJCQk9ICJncG9fcDMiLAorCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dF9hbHdheXMsCisJCQkuc2V0CQkJPSBscGMzMnh4X2dwb19zZXRfdmFsdWUsCisJCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKKwkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQT19QM19HUlAsCisJCQkubmdwaW8JCQk9IExQQzMyWFhfR1BPX1AzX01BWCwKKwkJCS5uYW1lcwkJCT0gZ3BvX3AzX25hbWVzLAorCQkJLmNhbl9zbGVlcAkJPSAwLAorCQl9LAorCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMywKKwl9LAorfTsKKwordm9pZCBfX2luaXQgbHBjMzJ4eF9ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxwYzMyeHhfZ3Bpb2NoaXApOyBpKyspCisJCWdwaW9jaGlwX2FkZCgmbHBjMzJ4eF9ncGlvY2hpcFtpXS5jaGlwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjA2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCisgKgorICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9DTEtERVZfSAorI2RlZmluZSBfX0FTTV9BUkNIX0NMS0RFVl9ICisKKyNkZWZpbmUgX19jbGtfZ2V0KGNsaykgKHsgMTsgfSkKKyNkZWZpbmUgX19jbGtfcHV0KGNsaykgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE3NDRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIERlYnVnIG91dHB1dCBpcyBoYXJkY29kZWQgdG8gc3RhbmRhcmQgVUFSVCA1CisqLworCisJLm1hY3JvCWFkZHJ1YXJ0LHJ4LCB0bXAKKwltcmMJcDE1LCAwLCBccngsIGMxLCBjMAorCXRzdAlccngsICMxCQkJCUAgTU1VIGVuYWJsZWQ/CisJbGRyZXEJXHJ4LCA9MHg0MDA5MDAwMAorCWxkcm5lCVxyeCwgPTB4RjQwOTAwMDAKKwkuZW5kbQorCisjZGVmaW5lIFVBUlRfU0hJRlQJMgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWJ1Zy04MjUwLlM+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwMjI3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisgKgorICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgorCisjZGVmaW5lIExQQzMyWFhfSU5UQ19NQVNLRURfU1RBVFVTX09GUwkweDgKKworCS5tYWNybwlkaXNhYmxlX2ZpcQorCS5lbmRtCisKKwkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCisJbGRyCVxiYXNlLCA9SU9fQUREUkVTUyhMUEMzMlhYX01JQ19CQVNFKQorCS5lbmRtCisKKwkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKKwkuZW5kbQorCisvKgorICogUmV0dXJuIElSUSBudW1iZXIgaW4gaXJxbnIuIEFsc28gcmV0dXJuIHByb2Nlc3NvciBaIGZsYWcgc3RhdHVzIGluIENQU1IKKyAqIGFzIHNldCBpZiBhbiBpbnRlcnJ1cHQgaXMgcGVuZGluZy4KKyAqLworCS5tYWNybwlnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKKwlsZHIJXGlycXN0YXQsIFtcYmFzZSwgI0xQQzMyWFhfSU5UQ19NQVNLRURfU1RBVFVTX09GU10KKwljbHoJXGlycW5yLCBcaXJxc3RhdAorCXJzYglcaXJxbnIsIFxpcnFuciwgIzMxCisJdGVxCVxpcnFzdGF0LCAjMAorCS5lbmRtCisKKwkubWFjcm8JaXJxX3ByaW9fdGFibGUKKwkuZW5kbQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDAzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDc0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAorI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCisvKgorICogTm90ZSEKKyAqIE11eGVkIEdQIHBpbnMgbmVlZCB0byBiZSBzZXR1cCB0byB0aGUgR1Agc3RhdGUgaW4gdGhlIGJvYXJkIGxldmVsCisgKiBjb2RlIHByaW9yIHRvIHVzaW5nIHRoaXMgZHJpdmVyLgorICogR1BJIHBpbnMgOiAyOHhQMyBncm91cAorICogR1BPIHBpbnMgOiAyNHhQMyBncm91cAorICogR1BJTyBwaW5zOiA4eFAwIGdyb3VwLCAyNHhQMSBncm91cCwgMTN4UDIgZ3JvdXAsIDZ4UDMgZ3JvdXAKKyAqLworCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9NQVggOAorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfTUFYIDI0CisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NQVggMTMKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX01BWCA2CisjZGVmaW5lIExQQzMyWFhfR1BJX1AzX01BWCAyOAorI2RlZmluZSBMUEMzMlhYX0dQT19QM19NQVggMjQKKworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfR1JQIDAKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0dSUCAoTFBDMzJYWF9HUElPX1AwX0dSUCArIExQQzMyWFhfR1BJT19QMF9NQVgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9HUlAgKExQQzMyWFhfR1BJT19QMV9HUlAgKyBMUEMzMlhYX0dQSU9fUDFfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfR1JQIChMUEMzMlhYX0dQSU9fUDJfR1JQICsgTFBDMzJYWF9HUElPX1AyX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUElfUDNfR1JQIChMUEMzMlhYX0dQSU9fUDNfR1JQICsgTFBDMzJYWF9HUElPX1AzX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfR1JQIChMUEMzMlhYX0dQSV9QM19HUlAgKyBMUEMzMlhYX0dQSV9QM19NQVgpCisKKy8qCisgKiBBIHNwZWNpZmljIEdQSU8gY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhpcyBtYWNybworICogaWUsIEdQSU9fMDUgY2FuIGJlIHNlbGVjdGVkIHdpdGggTFBDMzJYWF9HUElPKExQQzMyWFhfR1BJT19QM19HUlAsIDUpCisgKiBTZWUgdGhlIExQQzMyeDAgVXNlcidzIGd1aWRlIGZvciBHUElPIGdyb3VwIG51bWJlcnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0dQSU8oeCwgeSkgKCh4KSArICh5KSkKKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlfX2dwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19jYW5zbGVlcCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb190b19pcnEoZ3Bpbyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTFkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKyNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICisKKy8qCisgKiBTdGFydCBvZiB2aXJ0dWFsIGFkZHJlc3NlcyBmb3IgSU8gZGV2aWNlcworICovCisjZGVmaW5lIElPX0JBU0UJCTB4RjAwMDAwMDAKKworLyoKKyAqIFRoaXMgbWFjcm8gcmVsaWVzIG9uIGZhY3QgdGhhdCBmb3IgYWxsIEhXIGkvbyBhZGRyZXNzZXMgYml0cyAyMC0yMyBhcmUgMAorICovCisjZGVmaW5lIElPX0FERFJFU1MoeCkJKCgoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDQpIHwgKCh4KSAmIDB4ZmZmZmYpKSB8XAorCQkJIElPX0JBU0UpCisKKyNkZWZpbmUgaW9fcDJ2KHgpCSgodm9pZCBfX2lvbWVtICopICh1bnNpZ25lZCBsb25nKSBJT19BRERSRVNTKHgpKQorI2RlZmluZSBpb192MnAoeCkJKCgoKHgpICYgMHgwZmYwMDAwMCkgPDwgNCkgfCAoKHgpICYgMHgwMDBmZmZmZikpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9pMmMuaCBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0ZGM5MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvaTJjLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIFBOWDQwMDgtc3BlY2lmaWMgdHdlYWtzIGZvciBJMkMgSVAzMjA0IGJsb2NrCisgKgorICogQXV0aG9yOiBWaXRhbHkgV29vbCA8dndvb2xAcnUubXZpc3RhLmNvbT4KKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9JMkNfSAorI2RlZmluZSBfX0FTTV9BUkNIX0kyQ19ICisKK2VudW0geworCW1zdGF0dXNfdGRpID0gMHgwMDAwMDAwMSwKKwltc3RhdHVzX2FmaSA9IDB4MDAwMDAwMDIsCisJbXN0YXR1c19uYWkgPSAweDAwMDAwMDA0LAorCW1zdGF0dXNfZHJtaSA9IDB4MDAwMDAwMDgsCisJbXN0YXR1c19hY3RpdmUgPSAweDAwMDAwMDIwLAorCW1zdGF0dXNfc2NsID0gMHgwMDAwMDA0MCwKKwltc3RhdHVzX3NkYSA9IDB4MDAwMDAwODAsCisJbXN0YXR1c19yZmYgPSAweDAwMDAwMTAwLAorCW1zdGF0dXNfcmZlID0gMHgwMDAwMDIwMCwKKwltc3RhdHVzX3RmZiA9IDB4MDAwMDA0MDAsCisJbXN0YXR1c190ZmUgPSAweDAwMDAwODAwLAorfTsKKworZW51bSB7CisJbWNudHJsX3RkaWUgPSAweDAwMDAwMDAxLAorCW1jbnRybF9hZmllID0gMHgwMDAwMDAwMiwKKwltY250cmxfbmFpZSA9IDB4MDAwMDAwMDQsCisJbWNudHJsX2RybWllID0gMHgwMDAwMDAwOCwKKwltY250cmxfZGFpZSA9IDB4MDAwMDAwMjAsCisJbWNudHJsX3JmZmllID0gMHgwMDAwMDA0MCwKKwltY250cmxfdGZmaWUgPSAweDAwMDAwMDgwLAorCW1jbnRybF9yZXNldCA9IDB4MDAwMDAxMDAsCisJbWNudHJsX2NkYm1vZGUgPSAweDAwMDAwNDAwLAorfTsKKworZW51bSB7CisJcndfYml0ID0gMSA8PCAwLAorCXN0YXJ0X2JpdCA9IDEgPDwgOCwKKwlzdG9wX2JpdCA9IDEgPDwgOSwKK307CisKKyNkZWZpbmUgSTJDX1JFR19SWChhKQkoKGEpLT5pb2FkZHIpCQkvKiBSeCBGSUZPIHJlZyAoUk8pICovCisjZGVmaW5lIEkyQ19SRUdfVFgoYSkJKChhKS0+aW9hZGRyKQkJLyogVHggRklGTyByZWcgKFdPKSAqLworI2RlZmluZSBJMkNfUkVHX1NUUyhhKQkoKGEpLT5pb2FkZHIgKyAweDA0KQkvKiBTdGF0dXMgcmVnIChSTykgKi8KKyNkZWZpbmUgSTJDX1JFR19DVEwoYSkJKChhKS0+aW9hZGRyICsgMHgwOCkJLyogQ3RsIHJlZyAqLworI2RlZmluZSBJMkNfUkVHX0NLTChhKQkoKGEpLT5pb2FkZHIgKyAweDBjKQkvKiBDbG9jayBkaXZpZGVyIGxvdyAqLworI2RlZmluZSBJMkNfUkVHX0NLSChhKQkoKGEpLT5pb2FkZHIgKyAweDEwKQkvKiBDbG9jayBkaXZpZGVyIGhpZ2ggKi8KKyNkZWZpbmUgSTJDX1JFR19BRFIoYSkJKChhKS0+aW9hZGRyICsgMHgxNCkJLyogSTJDIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX1JFR19SRkwoYSkJKChhKS0+aW9hZGRyICsgMHgxOCkJLyogUnggRklGTyBsZXZlbCAoUk8pICovCisjZGVmaW5lIEkyQ19SRUdfVEZMKGEpCSgoYSktPmlvYWRkciArIDB4MWMpCS8qIFR4IEZJRk8gbGV2ZWwgKFJPKSAqLworI2RlZmluZSBJMkNfUkVHX1JYQihhKQkoKGEpLT5pb2FkZHIgKyAweDIwKQkvKiBOdW0gb2YgYnl0ZXMgUngtZWQgKFJPKSAqLworI2RlZmluZSBJMkNfUkVHX1RYQihhKQkoKGEpLT5pb2FkZHIgKyAweDI0KQkvKiBOdW0gb2YgYnl0ZXMgVHgtZWQgKFJPKSAqLworI2RlZmluZSBJMkNfUkVHX1RYUyhhKQkoKGEpLT5pb2FkZHIgKyAweDI4KQkvKiBUeCBzbGF2ZSBGSUZPIChSTykgKi8KKyNkZWZpbmUgSTJDX1JFR19TVEZMKGEpCSgoYSktPmlvYWRkciArIDB4MmMpCS8qIFR4IHNsYXZlIEZJRk8gbGV2ZWwgKFJPKSAqLworCisjZGVmaW5lIEkyQ19DSElQX05BTUUJCSJQTlg0MDA4LUkyQyIKKworI2VuZGlmCQkJCS8qIF9fQVNNX0FSQ0hfSTJDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjU5YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9pby5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2lvLmgKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICisjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKKworI2RlZmluZSBJT19TUEFDRV9MSU1JVAkweGZmZmZmZmZmCisKKyNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQorI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY3ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2lycXMuaAorICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX0lSUVNfSAorI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JUlFTX0gKKworI2RlZmluZSBMUEMzMlhYX1NJQzFfSVJRKG4pCQkoMzIgKyAobikpCisjZGVmaW5lIExQQzMyWFhfU0lDMl9JUlEobikJCSg2NCArIChuKSkKKworLyoKKyAqIE1JQyBpbnRlcnJ1cHRzCisgKi8KKyNkZWZpbmUgSVJRX0xQQzMyWFhfU1VCMUlSUQkJMAorI2RlZmluZSBJUlFfTFBDMzJYWF9TVUIySVJRCQkxCisjZGVmaW5lIElSUV9MUEMzMlhYX1BXTTMJCTMKKyNkZWZpbmUgSVJRX0xQQzMyWFhfUFdNNAkJNAorI2RlZmluZSBJUlFfTFBDMzJYWF9IU1RJTUVSCQk1CisjZGVmaW5lIElSUV9MUEMzMlhYX1dBVENICQk2CisjZGVmaW5lIElSUV9MUEMzMlhYX1VBUlRfSUlSMwkJNworI2RlZmluZSBJUlFfTFBDMzJYWF9VQVJUX0lJUjQJCTgKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVUFSVF9JSVI1CQk5CisjZGVmaW5lIElSUV9MUEMzMlhYX1VBUlRfSUlSNgkJMTAKKyNkZWZpbmUgSVJRX0xQQzMyWFhfRkxBU0gJCTExCisjZGVmaW5lIElSUV9MUEMzMlhYX1NEMQkJCTEzCisjZGVmaW5lIElSUV9MUEMzMlhYX0xDRAkJCTE0CisjZGVmaW5lIElSUV9MUEMzMlhYX1NEMAkJCTE1CisjZGVmaW5lIElSUV9MUEMzMlhYX1RJTUVSMAkJMTYKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVElNRVIxCQkxNworI2RlZmluZSBJUlFfTFBDMzJYWF9USU1FUjIJCTE4CisjZGVmaW5lIElSUV9MUEMzMlhYX1RJTUVSMwkJMTkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfU1NQMAkJMjAKKyNkZWZpbmUgSVJRX0xQQzMyWFhfU1NQMQkJMjEKKyNkZWZpbmUgSVJRX0xQQzMyWFhfSTJTMAkJMjIKKyNkZWZpbmUgSVJRX0xQQzMyWFhfSTJTMQkJMjMKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVUFSVF9JSVI3CQkyNAorI2RlZmluZSBJUlFfTFBDMzJYWF9VQVJUX0lJUjIJCTI1CisjZGVmaW5lIElSUV9MUEMzMlhYX1VBUlRfSUlSMQkJMjYKKyNkZWZpbmUgSVJRX0xQQzMyWFhfTVNUSU1FUgkJMjcKKyNkZWZpbmUgSVJRX0xQQzMyWFhfRE1BCQkJMjgKKyNkZWZpbmUgSVJRX0xQQzMyWFhfRVRIRVJORVQJCTI5CisjZGVmaW5lIElSUV9MUEMzMlhYX1NVQjFGSVEJCTMwCisjZGVmaW5lIElSUV9MUEMzMlhYX1NVQjJGSVEJCTMxCisKKy8qCisgKiBTSUMxIGludGVycnVwdHMgc3RhcnQgYXQgb2Zmc2V0IDMyCisgKi8KKyNkZWZpbmUgSVJRX0xQQzMyWFhfSlRBR19DT01NX1RYCUxQQzMyWFhfU0lDMV9JUlEoMSkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfSlRBR19DT01NX1JYCUxQQzMyWFhfU0lDMV9JUlEoMikKKyNkZWZpbmUgSVJRX0xQQzMyWFhfR1BJXzExCQlMUEMzMlhYX1NJQzFfSVJRKDQpCisjZGVmaW5lIElSUV9MUEMzMlhYX1RTX1AJCUxQQzMyWFhfU0lDMV9JUlEoNikKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVFNfSVJRCQlMUEMzMlhYX1NJQzFfSVJRKDcpCisjZGVmaW5lIElSUV9MUEMzMlhYX1RTX0FVWAkJTFBDMzJYWF9TSUMxX0lSUSg4KQorI2RlZmluZSBJUlFfTFBDMzJYWF9TUEkyCQlMUEMzMlhYX1NJQzFfSVJRKDEyKQorI2RlZmluZSBJUlFfTFBDMzJYWF9QTExVU0IJCUxQQzMyWFhfU0lDMV9JUlEoMTMpCisjZGVmaW5lIElSUV9MUEMzMlhYX1BMTEhDTEsJCUxQQzMyWFhfU0lDMV9JUlEoMTQpCisjZGVmaW5lIElSUV9MUEMzMlhYX1BMTDM5NwkJTFBDMzJYWF9TSUMxX0lSUSgxNykKKyNkZWZpbmUgSVJRX0xQQzMyWFhfSTJDXzIJCUxQQzMyWFhfU0lDMV9JUlEoMTgpCisjZGVmaW5lIElSUV9MUEMzMlhYX0kyQ18xCQlMUEMzMlhYX1NJQzFfSVJRKDE5KQorI2RlZmluZSBJUlFfTFBDMzJYWF9SVEMJCQlMUEMzMlhYX1NJQzFfSVJRKDIwKQorI2RlZmluZSBJUlFfTFBDMzJYWF9LRVkJCQlMUEMzMlhYX1NJQzFfSVJRKDIyKQorI2RlZmluZSBJUlFfTFBDMzJYWF9TUEkxCQlMUEMzMlhYX1NJQzFfSVJRKDIzKQorI2RlZmluZSBJUlFfTFBDMzJYWF9TVwkJCUxQQzMyWFhfU0lDMV9JUlEoMjQpCisjZGVmaW5lIElSUV9MUEMzMlhYX1VTQl9PVEdfVElNRVIJTFBDMzJYWF9TSUMxX0lSUSgyNSkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVVNCX09UR19BVFgJCUxQQzMyWFhfU0lDMV9JUlEoMjYpCisjZGVmaW5lIElSUV9MUEMzMlhYX1VTQl9IT1NUCQlMUEMzMlhYX1NJQzFfSVJRKDI3KQorI2RlZmluZSBJUlFfTFBDMzJYWF9VU0JfREVWX0RNQQkJTFBDMzJYWF9TSUMxX0lSUSgyOCkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVVNCX0RFVl9MUAkJTFBDMzJYWF9TSUMxX0lSUSgyOSkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVVNCX0RFVl9IUAkJTFBDMzJYWF9TSUMxX0lSUSgzMCkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVVNCX0kyQwkJTFBDMzJYWF9TSUMxX0lSUSgzMSkKKworLyoKKyAqIFNJQzIgaW50ZXJydXB0cyBzdGFydCBhdCBvZmZzZXQgNjQKKyAqLworI2RlZmluZSBJUlFfTFBDMzJYWF9HUElPXzAwCQlMUEMzMlhYX1NJQzJfSVJRKDApCisjZGVmaW5lIElSUV9MUEMzMlhYX0dQSU9fMDEJCUxQQzMyWFhfU0lDMl9JUlEoMSkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfR1BJT18wMgkJTFBDMzJYWF9TSUMyX0lSUSgyKQorI2RlZmluZSBJUlFfTFBDMzJYWF9HUElPXzAzCQlMUEMzMlhYX1NJQzJfSVJRKDMpCisjZGVmaW5lIElSUV9MUEMzMlhYX0dQSU9fMDQJCUxQQzMyWFhfU0lDMl9JUlEoNCkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfR1BJT18wNQkJTFBDMzJYWF9TSUMyX0lSUSg1KQorI2RlZmluZSBJUlFfTFBDMzJYWF9TUEkyX0RBVEFJTgkJTFBDMzJYWF9TSUMyX0lSUSg2KQorI2RlZmluZSBJUlFfTFBDMzJYWF9VMl9IQ1RTCQlMUEMzMlhYX1NJQzJfSVJRKDcpCisjZGVmaW5lIElSUV9MUEMzMlhYX1AwX1AxX0lSUQkJTFBDMzJYWF9TSUMyX0lSUSg4KQorI2RlZmluZSBJUlFfTFBDMzJYWF9HUElfMDgJCUxQQzMyWFhfU0lDMl9JUlEoOSkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfR1BJXzA5CQlMUEMzMlhYX1NJQzJfSVJRKDEwKQorI2RlZmluZSBJUlFfTFBDMzJYWF9HUElfMTkJCUxQQzMyWFhfU0lDMl9JUlEoMTEpCisjZGVmaW5lIElSUV9MUEMzMlhYX1U3X0hDVFMJCUxQQzMyWFhfU0lDMl9JUlEoMTIpCisjZGVmaW5lIElSUV9MUEMzMlhYX0dQSV8wNwkJTFBDMzJYWF9TSUMyX0lSUSgxNSkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfU0RJTwkJTFBDMzJYWF9TSUMyX0lSUSgxOCkKKyNkZWZpbmUgSVJRX0xQQzMyWFhfVTVfUlgJCUxQQzMyWFhfU0lDMl9JUlEoMTkpCisjZGVmaW5lIElSUV9MUEMzMlhYX1NQSTFfREFUQUlOCQlMUEMzMlhYX1NJQzJfSVJRKDIwKQorI2RlZmluZSBJUlFfTFBDMzJYWF9HUElfMDAJCUxQQzMyWFhfU0lDMl9JUlEoMjIpCisjZGVmaW5lIElSUV9MUEMzMlhYX0dQSV8wMQkJTFBDMzJYWF9TSUMyX0lSUSgyMykKKyNkZWZpbmUgSVJRX0xQQzMyWFhfR1BJXzAyCQlMUEMzMlhYX1NJQzJfSVJRKDI0KQorI2RlZmluZSBJUlFfTFBDMzJYWF9HUElfMDMJCUxQQzMyWFhfU0lDMl9JUlEoMjUpCisjZGVmaW5lIElSUV9MUEMzMlhYX0dQSV8wNAkJTFBDMzJYWF9TSUMyX0lSUSgyNikKKyNkZWZpbmUgSVJRX0xQQzMyWFhfR1BJXzA1CQlMUEMzMlhYX1NJQzJfSVJRKDI3KQorI2RlZmluZSBJUlFfTFBDMzJYWF9HUElfMDYJCUxQQzMyWFhfU0lDMl9JUlEoMjgpCisjZGVmaW5lIElSUV9MUEMzMlhYX1NZU0NMSwkJTFBDMzJYWF9TSUMyX0lSUSgzMSkKKworI2RlZmluZSBOUl9JUlFTCQkJCTk2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0ZTFhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKKworLyoKKyAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0IG9mIGJhbmsgMAorICovCisjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4ODAwMDAwMDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZWE4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw2OTQgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1BMQVRGT1JNX0gKKyNkZWZpbmUgX19BU01fQVJDSF9QTEFURk9STV9ICisKKyNkZWZpbmUgX1NCRihmLCB2KQkJCQkoKHYpIDw8IChmKSkKKyNkZWZpbmUgX0JJVChuKQkJCQkJX1NCRihuLCAxKQorCisvKgorICogQUhCIDAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBMUEMzMlhYX1NMQ19CQVNFCQkJMHgyMDAyMDAwMAorI2RlZmluZSBMUEMzMlhYX1NTUDBfQkFTRQkJCTB4MjAwODQwMDAKKyNkZWZpbmUgTFBDMzJYWF9TUEkxX0JBU0UJCQkweDIwMDg4MDAwCisjZGVmaW5lIExQQzMyWFhfU1NQMV9CQVNFCQkJMHgyMDA4QzAwMAorI2RlZmluZSBMUEMzMlhYX1NQSTJfQkFTRQkJCTB4MjAwOTAwMDAKKyNkZWZpbmUgTFBDMzJYWF9JMlMwX0JBU0UJCQkweDIwMDk0MDAwCisjZGVmaW5lIExQQzMyWFhfU0RfQkFTRQkJCQkweDIwMDk4MDAwCisjZGVmaW5lIExQQzMyWFhfSTJTMV9CQVNFCQkJMHgyMDA5QzAwMAorI2RlZmluZSBMUEMzMlhYX01MQ19CQVNFCQkJMHgyMDBBODAwMAorI2RlZmluZSBMUEMzMlhYX0FIQjBfU1RBUlQJCQlMUEMzMlhYX1NMQ19CQVNFCisjZGVmaW5lIExQQzMyWFhfQUhCMF9TSVpFCQkJMHgwMDA4OTAwMAorCisvKgorICogQUhCIDEgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBMUEMzMlhYX0RNQV9CQVNFCQkJMHgzMTAwMDAwMAorI2RlZmluZSBMUEMzMlhYX1VTQl9CQVNFCQkJMHgzMTAyMDAwMAorI2RlZmluZSBMUEMzMlhYX1VTQkhfQkFTRQkJCTB4MzEwMjAwMDAKKyNkZWZpbmUgTFBDMzJYWF9VU0JfT1RHX0JBU0UJCQkweDMxMDIwMDAwCisjZGVmaW5lIExQQzMyWFhfT1RHX0kyQ19CQVNFCQkJMHgzMTAyMDMwMAorI2RlZmluZSBMUEMzMlhYX0xDRF9CQVNFCQkJMHgzMTA0MDAwMAorI2RlZmluZSBMUEMzMlhYX0VUSEVSTkVUX0JBU0UJCQkweDMxMDYwMDAwCisjZGVmaW5lIExQQzMyWFhfRU1DX0JBU0UJCQkweDMxMDgwMDAwCisjZGVmaW5lIExQQzMyWFhfRVRCX0NGR19CQVNFCQkJMHgzMTBDMDAwMAorI2RlZmluZSBMUEMzMlhYX0VUQl9EQVRBX0JBU0UJCQkweDMxMEUwMDAwCisjZGVmaW5lIExQQzMyWFhfQUhCMV9TVEFSVAkJCUxQQzMyWFhfRE1BX0JBU0UKKyNkZWZpbmUgTFBDMzJYWF9BSEIxX1NJWkUJCQkweDAwMEUxMDAwCisKKy8qCisgKiBGQUIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS19QTV9CQVNFCQkJMHg0MDAwNDAwMAorI2RlZmluZSBMUEMzMlhYX01JQ19CQVNFCQkJMHg0MDAwODAwMAorI2RlZmluZSBMUEMzMlhYX1NJQzFfQkFTRQkJCTB4NDAwMEMwMDAKKyNkZWZpbmUgTFBDMzJYWF9TSUMyX0JBU0UJCQkweDQwMDEwMDAwCisjZGVmaW5lIExQQzMyWFhfSFNfVUFSVDFfQkFTRQkJCTB4NDAwMTQwMDAKKyNkZWZpbmUgTFBDMzJYWF9IU19VQVJUMl9CQVNFCQkJMHg0MDAxODAwMAorI2RlZmluZSBMUEMzMlhYX0hTX1VBUlQ3X0JBU0UJCQkweDQwMDFDMDAwCisjZGVmaW5lIExQQzMyWFhfUlRDX0JBU0UJCQkweDQwMDI0MDAwCisjZGVmaW5lIExQQzMyWFhfUlRDX1JBTV9CQVNFCQkJMHg0MDAyNDA4MAorI2RlZmluZSBMUEMzMlhYX0dQSU9fQkFTRQkJCTB4NDAwMjgwMDAKKyNkZWZpbmUgTFBDMzJYWF9QV00zX0JBU0UJCQkweDQwMDJDMDAwCisjZGVmaW5lIExQQzMyWFhfUFdNNF9CQVNFCQkJMHg0MDAzMDAwMAorI2RlZmluZSBMUEMzMlhYX01TVElNX0JBU0UJCQkweDQwMDM0MDAwCisjZGVmaW5lIExQQzMyWFhfSFNUSU1fQkFTRQkJCTB4NDAwMzgwMDAKKyNkZWZpbmUgTFBDMzJYWF9XRFRJTV9CQVNFCQkJMHg0MDAzQzAwMAorI2RlZmluZSBMUEMzMlhYX0RFQlVHX0NUUkxfQkFTRQkJCTB4NDAwNDAwMDAKKyNkZWZpbmUgTFBDMzJYWF9USU1FUjBfQkFTRQkJCTB4NDAwNDQwMDAKKyNkZWZpbmUgTFBDMzJYWF9BRENfQkFTRQkJCTB4NDAwNDgwMDAKKyNkZWZpbmUgTFBDMzJYWF9USU1FUjFfQkFTRQkJCTB4NDAwNEMwMDAKKyNkZWZpbmUgTFBDMzJYWF9LU0NBTl9CQVNFCQkJMHg0MDA1MDAwMAorI2RlZmluZSBMUEMzMlhYX1VBUlRfQ1RSTF9CQVNFCQkJMHg0MDA1NDAwMAorI2RlZmluZSBMUEMzMlhYX1RJTUVSMl9CQVNFCQkJMHg0MDA1ODAwMAorI2RlZmluZSBMUEMzMlhYX1BXTTFfQkFTRQkJCTB4NDAwNUMwMDAKKyNkZWZpbmUgTFBDMzJYWF9QV00yX0JBU0UJCQkweDQwMDVDMDA0CisjZGVmaW5lIExQQzMyWFhfVElNRVIzX0JBU0UJCQkweDQwMDYwMDAwCisKKy8qCisgKiBBUEIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBMUEMzMlhYX1VBUlQzX0JBU0UJCQkweDQwMDgwMDAwCisjZGVmaW5lIExQQzMyWFhfVUFSVDRfQkFTRQkJCTB4NDAwODgwMDAKKyNkZWZpbmUgTFBDMzJYWF9VQVJUNV9CQVNFCQkJMHg0MDA5MDAwMAorI2RlZmluZSBMUEMzMlhYX1VBUlQ2X0JBU0UJCQkweDQwMDk4MDAwCisjZGVmaW5lIExQQzMyWFhfSTJDMV9CQVNFCQkJMHg0MDBBMDAwMAorI2RlZmluZSBMUEMzMlhYX0kyQzJfQkFTRQkJCTB4NDAwQTgwMDAKKworLyoKKyAqIEZBQiBhbmQgQVBCIGJhc2UgYW5kIHNpemluZworICovCisjZGVmaW5lIExQQzMyWFhfRkFCQVBCX1NUQVJUCQkJTFBDMzJYWF9DTEtfUE1fQkFTRQorI2RlZmluZSBMUEMzMlhYX0ZBQkFQQl9TSVpFCQkJMHgwMDBBNTAwMAorCisvKgorICogSW50ZXJuYWwgbWVtb3J5IGJhc2VzIGFuZCBzaXplcworICovCisjZGVmaW5lIExQQzMyWFhfSVJBTV9CQVNFCQkJMHgwODAwMDAwMAorI2RlZmluZSBMUEMzMlhYX0lST01fQkFTRQkJCTB4MEMwMDAwMDAKKworLyoKKyAqIEV4dGVybmFsIFN0YXRpYyBNZW1vcnkgQmFuayBBZGRyZXNzIFNwYWNlIEJhc2VzCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9FTUNfQ1MwX0JBU0UJCQkweEUwMDAwMDAwCisjZGVmaW5lIExQQzMyWFhfRU1DX0NTMV9CQVNFCQkJMHhFMTAwMDAwMAorI2RlZmluZSBMUEMzMlhYX0VNQ19DUzJfQkFTRQkJCTB4RTIwMDAwMDAKKyNkZWZpbmUgTFBDMzJYWF9FTUNfQ1MzX0JBU0UJCQkweEUzMDAwMDAwCisKKy8qCisgKiBFeHRlcm5hbCBTRFJBTSBNZW1vcnkgQmFuayBBZGRyZXNzIFNwYWNlIEJhc2VzCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9FTUNfRFlDUzBfQkFTRQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgTFBDMzJYWF9FTUNfRFlDUzFfQkFTRQkJCTB4QTAwMDAwMDAKKworLyoKKyAqIENsb2NrIGFuZCBjcnlzdGFsIGluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9NQUlOX09TQ19GUkVRCQkJMTMwMDAwMDAKKyNkZWZpbmUgTFBDMzJYWF9DTE9DS19PU0NfRlJFUQkJCTMyNzY4CisKKy8qCisgKiBDbG9jayBhbmQgUG93ZXIgY29udHJvbCByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUgX1BNUkVHKHgpCQkJCWlvX3AydihMUEMzMlhYX0NMS19QTV9CQVNFICtcCisJCQkJCQkoeCkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0RFQlVHX0NUUkwJCV9QTVJFRygweDAwMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfQk9PVE1BUAkJCV9QTVJFRygweDAxNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUDAxX0VSCQkJX1BNUkVHKDB4MDE4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDTEtfUERJVgkJX1BNUkVHKDB4MDFDKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JTlRfRVIJCQlfUE1SRUcoMHgwMjApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lOVF9SUwkJCV9QTVJFRygweDAyNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UX1NSCQkJX1BNUkVHKDB4MDI4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JTlRfQVAJCQlfUE1SRUcoMHgwMkMpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BJTl9FUgkJCV9QTVJFRygweDAzMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUElOX1JTCQkJX1BNUkVHKDB4MDM0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QSU5fU1IJCQlfUE1SRUcoMHgwMzgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BJTl9BUAkJCV9QTVJFRygweDAzQykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSENMS19ESVYJCQlfUE1SRUcoMHgwNDApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BXUl9DVFJMCQkJX1BNUkVHKDB4MDQ0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QTEwzOTdfQ1RSTAkJX1BNUkVHKDB4MDQ4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NQUlOX09TQ19DVFJMCQlfUE1SRUcoMHgwNEMpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NZU0NMS19DVFJMCQlfUE1SRUcoMHgwNTApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0xDRENMS19DVFJMCQlfUE1SRUcoMHgwNTQpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfQ1RSTAkJX1BNUkVHKDB4MDU4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9BRENfQ0xLX0NUUkxfMQkJX1BNUkVHKDB4MDYwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JfQ1RSTAkJCV9QTVJFRygweDA2NCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQU1DTEtfQ1RSTAkJX1BNUkVHKDB4MDY4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9ERFJfTEFQX05PTQkJX1BNUkVHKDB4MDZDKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9ERFJfTEFQX0NPVU5UCQlfUE1SRUcoMHgwNzApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0REUl9MQVBfREVMQVkJCV9QTVJFRygweDA3NCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1NQX0NMS19DVFJMCQlfUE1SRUcoMHgwNzgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0kyU19DTEtfQ1RSTAkJX1BNUkVHKDB4MDdDKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NU19DVFJMCQkJX1BNUkVHKDB4MDgwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NQUNDTEtfQ1RSTAkJX1BNUkVHKDB4MDkwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9URVNUX0NMS19TRUwJCV9QTVJFRygweDBBNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0ZXX0lOVAkJCV9QTVJFRygweDBBOCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSTJDX0NMS19DVFJMCQlfUE1SRUcoMHgwQUMpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0tFWV9DTEtfQ1RSTAkJX1BNUkVHKDB4MEIwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9BRENfQ0xLX0NUUkwJCV9QTVJFRygweDBCNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUFdNX0NMS19DVFJMCQlfUE1SRUcoMHgwQjgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RJTUVSX0NMS19DVFJMCQlfUE1SRUcoMHgwQkMpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RJTUVSU19QV01TX0NMS19DVFJMXzEJX1BNUkVHKDB4MEMwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TUElfQ0xLX0NUUkwJCV9QTVJFRygweDBDNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTkFORF9DTEtfQ1RSTAkJX1BNUkVHKDB4MEM4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VQVJUM19DTEtfQ1RSTAkJX1BNUkVHKDB4MEQwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VQVJUNF9DTEtfQ1RSTAkJX1BNUkVHKDB4MEQ0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VQVJUNV9DTEtfQ1RSTAkJX1BNUkVHKDB4MEQ4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VQVJUNl9DTEtfQ1RSTAkJX1BNUkVHKDB4MERDKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JUkRBX0NMS19DVFJMCQlfUE1SRUcoMHgwRTApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VBUlRfQ0xLX0NUUkwJCV9QTVJFRygweDBFNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfRE1BX0NMS19DVFJMCQlfUE1SRUcoMHgwRTgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0FVVE9DTE9DSwkJX1BNUkVHKDB4MEVDKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9ERVZJRCh4KQkJCV9QTVJFRygweDEzMCArICh4KSkKKworLyoKKyAqIGNsa3B3cl9kZWJ1Z19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9WRlBfQ0xPQ0tfRU5BQkxFX0JJVAlfQklUKDQpCisKKy8qCisgKiBjbGtwd3JfYm9vdG1hcCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0JPT1RNQVBfU0VMX0JJVAkJX0JJVCgxKQorCisvKgorICogY2xrcHdyX3N0YXJ0X2dwaW8gcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMUlPMjNfQklUCV9CSVQoMzEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDFJTzIyX0JJVAlfQklUKDMwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8yMV9CSVQJX0JJVCgyOSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMUlPMjBfQklUCV9CSVQoMjgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDFJTzE5X0JJVAlfQklUKDI3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8xOF9CSVQJX0JJVCgyNikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMUlPMTdfQklUCV9CSVQoMjUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDFJTzE2X0JJVAlfQklUKDI0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8xNV9CSVQJX0JJVCgyMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMUlPMTRfQklUCV9CSVQoMjIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDFJTzEzX0JJVAlfQklUKDIxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8xMl9CSVQJX0JJVCgyMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMUlPMTFfQklUCV9CSVQoMTkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDFJTzEwX0JJVAlfQklUKDE4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU85X0JJVAlfQklUKDE3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU84X0JJVAlfQklUKDE2KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU83X0JJVAlfQklUKDE1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU82X0JJVAlfQklUKDE0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU81X0JJVAlfQklUKDEzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU80X0JJVAlfQklUKDEyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8zX0JJVAlfQklUKDExKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8yX0JJVAlfQklUKDEwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AxSU8xX0JJVAlfQklUKDkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDFJTzBfQklUCV9CSVQoOCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMElPN19CSVQJX0JJVCg3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AwSU82X0JJVAlfQklUKDYpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDBJTzVfQklUCV9CSVQoNSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMElPNF9CSVQJX0JJVCg0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AwSU8zX0JJVAlfQklUKDMpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0dQSU9TUkNfUDBJTzJfQklUCV9CSVQoMikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfR1BJT1NSQ19QMElPMV9CSVQJX0JJVCgxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9HUElPU1JDX1AwSU8wX0JJVAlfQklUKDApCisKKy8qCisgKiBjbGtwd3JfdXNiY2xrX3BkaXYgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JQRElWX1BMTF9NQVNLCQkweEYKKworLyoKKyAqIGNsa3B3cl9zdGFydF9pbnQsIGNsa3B3cl9zdGFydF9yYXdfc3RzX2ludCwgY2xrcHdyX3N0YXJ0X3N0c19pbnQsCisgKiBjbGtwd3Jfc3RhcnRfcG9sX2ludCwgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0FEQ19CSVQJCV9CSVQoMzEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19UU19QX0JJVAkJX0JJVCgzMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX1RTX0FVWF9CSVQJX0JJVCgyOSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX1VTQkFITkVFRENMS19CSVQJX0JJVCgyNikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX01TVElNRVJfQklUCV9CSVQoMjUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19SVENfQklUCQlfQklUKDI0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfVVNCTkVFRENMS19CSVQJX0JJVCgyMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX1VTQl9CSVQJCV9CSVQoMjIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19JMkNfQklUCQlfQklUKDIxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfVVNCT1RHVElNRVJfQklUCV9CSVQoMjApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19VU0JBVFhJTlRfQklUCV9CSVQoMTkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19LRVlfQklUCQlfQklUKDE2KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfTUFDX0JJVAkJX0JJVCg3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfUDBQMV9CSVQJCV9CSVQoNikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDVfQklUCV9CSVQoNSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDRfQklUCV9CSVQoNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDNfQklUCV9CSVQoMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDJfQklUCV9CSVQoMikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDFfQklUCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDBfQklUCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9zdGFydF9waW4sIGNsa3B3cl9zdGFydF9yYXdfc3RzX3BpbiwgY2xrcHdyX3N0YXJ0X3N0c19waW4sCisgKiBjbGtwd3Jfc3RhcnRfcG9sX3BpbiByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfVTdfUlhfQklUCQlfQklUKDMxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfVTdfSENUU19CSVQJX0JJVCgzMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfRVhUU1JDX1U2X0lSUlhfQklUCV9CSVQoMjgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0VYVFNSQ19VNV9SWF9CSVQJCV9CSVQoMjYpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0VYVFNSQ19HUElfMjhfQklUCV9CSVQoMjUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0VYVFNSQ19VM19SWF9CSVQJCV9CSVQoMjQpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0VYVFNSQ19VMl9IQ1RTX0JJVAlfQklUKDIzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfVTJfUlhfQklUCQlfQklUKDIyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfVTFfUlhfQklUCQlfQklUKDIxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfTVNESU9fSU5UX0JJVAlfQklUKDE4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfTVNESU9fU1JUX0JJVAlfQklUKDE3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA2X0JJVAlfQklUKDE2KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA1X0JJVAlfQklUKDE1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA0X0JJVAlfQklUKDE0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAzX0JJVAlfQklUKDEzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAyX0JJVAlfQklUKDEyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAxX0JJVAlfQklUKDExKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAwX0JJVAlfQklUKDEwKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfU1lTQ0xLRU5fQklUCV9CSVQoOSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfRVhUU1JDX1NQSTFfREFUSU5fQklUCV9CSVQoOCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfRVhUU1JDX0dQSV8wN19CSVQJX0JJVCg3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfU1BJMl9EQVRJTl9CSVQJX0JJVCg2KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzE5X0JJVAlfQklUKDUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0VYVFNSQ19HUElfMDlfQklUCV9CSVQoNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfRVhUU1JDX0dQSV8wOF9CSVQJX0JJVCgzKQorCisvKgorICogY2xrcHdyX2hjbGtfZGl2IHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSENMS0RJVl9ERFJDTEtfU1RPUAkoMHgwIDw8IDcpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtESVZfRERSQ0xLX05PUk0JKDB4MSA8PCA3KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9IQ0xLRElWX0REUkNMS19IQUxGCSgweDIgPDwgNykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSENMS0RJVl9QQ0xLX0RJVihuKQkoKChuKSAmIDB4MUYpIDw8IDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtESVZfRElWXzJQT1cobikJKChuKSAmIDB4MykKKworLyoKKyAqIGNsa3B3cl9wd3JfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0NUUkxfRk9SQ0VfUENMSwkJX0JJVCgxMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQU1fU0VMRl9SRlNICQlfQklUKDkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VQRF9TRFJBTV9TRUxGX1JGU0gJX0JJVCg4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9BVVRPX1NEUkFNX1NFTEZfUkZTSAlfQklUKDcpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hJR0hDT1JFX1NUQVRFX0JJVAlfQklUKDUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NZU0NMS0VOX1NUQVRFX0JJVAlfQklUKDQpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NZU0NMS0VOX0dQSU9fRU4JCV9CSVQoMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0VMRUNUX1JVTl9NT0RFCQlfQklUKDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hJR0hDT1JFX0dQSU9fRU4JCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1RPUF9NT0RFX0NUUkwJCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9wbGwzOTdfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BMTDM5N19NU0xPQ0tfU1RTCV9CSVQoMTApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BMTDM5N19CWVBBU1MJCV9CSVQoOSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUExMMzk3X0JJQVNfTk9STQkJMHgwMDAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUExMMzk3X0JJQVNfTjEyXzUJMHgwNDAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUExMMzk3X0JJQVNfTjI1CQkweDA4MAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QTEwzOTdfQklBU19OMzdfNQkweDBDMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QTEwzOTdfQklBU19QMTJfNQkweDEwMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QTEwzOTdfQklBU19QMjUJCTB4MTQwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BMTDM5N19CSUFTX1AzN181CTB4MTgwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BMTDM5N19CSUFTX1A1MAkJMHgxQzAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUExMMzk3X0JJQVNfTUFTSwkJMHgxQzAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1lTQ1RSTF9QTEwzOTdfRElTCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1lTQ1RSTF9QTEwzOTdfU1RTCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9tYWluX29zY19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTU9TQ19BRERfQ0FQKG4pCQkoKChuKSAmIDB4N0YpIDw8IDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01PU0NfQ0FQX01BU0sJCSgweDdGIDw8IDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RFU1RfTU9ERQkJX0JJVCgxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NT1NDX0RJU0FCTEUJCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9zeXNjbGtfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NZU0NUUkxfQlBfVFJJRyhuKQkoKChuKSAmIDB4M0ZGKSA8PCAyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TWVNDVFJMX0JQX01BU0sJCSgweDNGRiA8PCAyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TWVNDVFJMX1VTRVBMTDM5NwlfQklUKDEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NZU0NUUkxfU1lTQ0xLTVVYCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9sY2RjbGtfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0xDRENUUkxfTENEVFlQRV9URlQxMgkweDAwMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9MQ0RDVFJMX0xDRFRZUEVfVEZUMTYJMHgwNDAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9MQ0RUWVBFX1RGVDE1CTB4MDgwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0xDRENUUkxfTENEVFlQRV9URlQyNAkweDBDMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9MQ0RDVFJMX0xDRFRZUEVfU1RONE0JMHgxMDAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9MQ0RUWVBFX1NUTjhDCTB4MTQwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0xDRENUUkxfTENEVFlQRV9EU1RONE0JMHgxODAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9MQ0RUWVBFX0RTVE44QwkweDFDMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9MQ0RDVFJMX0xDRFRZUEVfTVNLCTB4MDFDMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9MQ0RDVFJMX0NMS19FTgkJMHgwMjAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9TRVRfUFNDQUxFKG4pCSgobiAtIDEpICYgMHgxRikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9QU0NBTEVfTVNLCTB4MDAxRgorCisvKgorICogY2xrcHdyX2hjbGtwbGxfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfUE9XRVJfVVAJCV9CSVQoMTYpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfQ0NPX0JZUEFTUwlfQklUKDE1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX1BPU1RESVZfQllQQVNTCV9CSVQoMTQpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfRkRCS19TRUxfRkNMSwlfQklUKDEzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX1BPU1RESVZfMlBPVyhuKQkoKChuKSAmIDB4MykgPDwgMTEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfUFJFRElWX1BMVVMxKG4pCSgoKG4pICYgMHgzKSA8PCA5KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX1BMTE0obikJCSgoKG4pICYgMHhGRikgPDwgMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSENMS1BMTF9QTExfU1RTCQlfQklUKDApCisKKy8qCisgKiBjbGtwd3JfYWRjX2Nsa19jdHJsXzEgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9BRENDVFJMMV9SVERJVihuKQkoKChuKSAmIDB4RkYpIDw8IDApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0FEQ0NUUkwxX1BDTEtfU0VMCV9CSVQoOCkKKworLyoKKyAqIGNsa3B3cl91c2JfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfSENMS19FTgkJX0JJVCgyNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9VU0JJMkNfRU4JX0JJVCgyMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9VU0JEVk5EX0VOCV9CSVQoMjIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfVVNCSFNUTkRfRU4JX0JJVCgyMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9QVV9BREQJCSgweDAgPDwgMTkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfQlVTX0tFRVBFUgkoMHgxIDw8IDE5KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX1BEX0FERAkJKDB4MyA8PCAxOSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVVNCQ1RSTF9DTEtfRU4yCQlfQklUKDE4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX0NMS19FTjEJCV9CSVQoMTcpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfUExMX1BXUlVQCV9CSVQoMTYpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfQ0NPX0JZUEFTUwlfQklUKDE1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX1BPU1RESVZfQllQQVNTCV9CSVQoMTQpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfRkRCS19TRUxfRkNMSwlfQklUKDEzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX1BPU1RESVZfMlBPVyhuKQkoKChuKSAmIDB4MykgPDwgMTEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VTQkNUUkxfUFJFRElWX1BMVVMxKG4pCSgoKG4pICYgMHgzKSA8PCA5KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX0ZEQktfUExVUzEobikJKCgobikgJiAweEZGKSA8PCAxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VU0JDVFJMX1BMTF9TVFMJCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9zZHJhbWNsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX0ZBU1RTTEVXX0NMSwlfQklUKDIyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TRFJDTEtfRkFTVFNMRVcJCV9CSVQoMjEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NEUkNMS19GQVNUU0xFV19EQVQJX0JJVCgyMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX1NXX0REUl9SRVNFVAlfQklUKDE5KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TRFJDTEtfSENMS19ETFkobikJKCgobikgJiAweDFGKSA8PCAxNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX0RMWV9BRERSX1NUUwlfQklUKDEzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TRFJDTEtfU0VOU19GQUNUKG4pCSgoKG4pICYgMHg3KSA8PCAxMCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX1VTRV9DQUwJCV9CSVQoOSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX0RPX0NBTAkJX0JJVCg4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TRFJDTEtfQ0FMX09OX1JUQwlfQklUKDcpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NEUkNMS19EUVNfRExZKG4pCSgoKG4pICYgMHgxRikgPDwgMikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX1VTRV9ERFIJCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU0RSQ0xLX0NMS19ESVMJCV9CSVQoMCkKKworLyoKKyAqIGNsa3B3cl9zc3BfYmxrX2N0cmwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TU1BDVFJMX0RNQV9TU1AxUlgJX0JJVCg1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TU1BDVFJMX0RNQV9TU1AxVFgJX0JJVCg0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TU1BDVFJMX0RNQV9TU1AwUlgJX0JJVCgzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TU1BDVFJMX0RNQV9TU1AwVFgJX0JJVCgyKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TU1BDVFJMX1NTUENMSzFfRU4JX0JJVCgxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TU1BDVFJMX1NTUENMSzBfRU4JX0JJVCgwKQorCisvKgorICogY2xrcHdyX2kyc19jbGtfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0kyU0NUUkxfSTJTMV9SWF9GT1JfVFgJX0JJVCg2KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JMlNDVFJMX0kyUzFfVFhfRk9SX1JYCV9CSVQoNSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSTJTQ1RSTF9JMlMxX1VTRV9ETUEJX0JJVCg0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JMlNDVFJMX0kyUzBfUlhfRk9SX1RYCV9CSVQoMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSTJTQ1RSTF9JMlMwX1RYX0ZPUl9SWAlfQklUKDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0kyU0NUUkxfSTJTQ0xLMV9FTglfQklUKDEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0kyU0NUUkxfSTJTQ0xLMF9FTglfQklUKDApCisKKy8qCisgKiBjbGtwd3JfbXNfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9NU0RJT19QSU5fRElTCV9CSVQoMTApCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9NU0RJT19QVV9FTglfQklUKDkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9NU0RJTzIzX0RJUwlfQklUKDgpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9NU0RJTzFfRElTCV9CSVQoNykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTVNDQVJEX01TRElPMF9ESVMJX0JJVCg2KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NU0NBUkRfU0RDQVJEX0VOCQlfQklUKDUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01TQ0FSRF9TRENBUkRfRElWKG4pCSgobikgJiAweEYpCisKKy8qCisgKiBjbGtwd3JfbWFjY2xrX2N0cmwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NQUNDVFJMX05PX0VORVRfUElTCTB4MDAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTUFDQ1RSTF9VU0VfTUlJX1BJTlMJMHgwOAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NQUNDVFJMX1VTRV9STUlJX1BJTlMJMHgxOAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9NQUNDVFJMX1BJTlNfTVNLCQkweDE4CisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX01BQ0NUUkxfRE1BQ0xLX0VOCV9CSVQoMikKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTUFDQ1RSTF9NTUlPQ0xLX0VOCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTUFDQ1RSTF9IUkNDTEtfRU4JX0JJVCgwKQorCisvKgorICogY2xrcHdyX3Rlc3RfY2xrX3NlbCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RFU1RDTEsxX1NFTF9QRVJDTEsJKDB4MCA8PCA1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9URVNUQ0xLMV9TRUxfUlRDCQkoMHgxIDw8IDUpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RFU1RDTEsxX1NFTF9NT1NDCSgweDIgPDwgNSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVEVTVENMSzFfU0VMX01BU0sJKDB4MyA8PCA1KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9URVNUQ0xLX1RFU1RDTEsxX0VOCV9CSVQoNCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVEVTVENMSzJfU0VMX0hDTEsJKDB4MCA8PCAxKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9URVNUQ0xLMl9TRUxfUEVSQ0xLCSgweDEgPDwgMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVEVTVENMSzJfU0VMX1VTQkNMSwkoMHgyIDw8IDEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RFU1RDTEsyX1NFTF9NT1NDCSgweDUgPDwgMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVEVTVENMSzJfU0VMX1BMTDM5NwkoMHg3IDw8IDEpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RFU1RDTEsyX1NFTF9NQVNLCSgweDcgPDwgMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVEVTVENMS19URVNUQ0xLMl9FTglfQklUKDApCisKKy8qCisgKiBjbGtwd3Jfc3dfaW50IHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1dfSU5UKG4pCQkoX0JJVCgwKSB8ICgoKG4pICYgMHg3RikgPDwgMSkpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NXX0dFVF9BUkcobikJCSgoKG4pICYgMHhGRSkgPj4gMSkKKworLyoKKyAqIGNsa3B3cl9pMmNfY2xrX2N0cmwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JMkNDTEtfVVNCSTJDSElfRFJJVkUJX0JJVCg0KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9JMkNDTEtfSTJDMkhJX0RSSVZFCV9CSVQoMykKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSTJDQ0xLX0kyQzFISV9EUklWRQlfQklUKDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0kyQ0NMS19JMkMyQ0xLX0VOCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSTJDQ0xLX0kyQzFDTEtfRU4JX0JJVCgwKQorCisvKgorICogY2xrcHdyX2tleV9jbGtfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0tFWUNMS0NUUkxfQ0xLX0VOCTB4MQorCisvKgorICogY2xrcHdyX2FkY19jbGtfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0FEQzMyQ0xLQ1RSTF9DTEtfRU4JMHgxCisKKy8qCisgKiBjbGtwd3JfcHdtX2Nsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfUFdNQ0xLX1BXTTJfRElWKG4pCSgoKG4pICYgMHhGKSA8PCA4KQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QV01DTEtfUFdNMV9ESVYobikJKCgobikgJiAweEYpIDw8IDQpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BXTUNMS19QV00yU0VMX1BDTEsJMHg4CisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BXTUNMS19QV00yQ0xLX0VOCTB4NAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QV01DTEtfUFdNMVNFTF9QQ0xLCTB4MgorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QV01DTEtfUFdNMUNMS19FTgkweDEKKworLyoKKyAqIGNsa3B3cl90aW1lcl9jbGtfY3RybCByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1BXTUNMS19IU1RJTUVSX0VOCTB4MgorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QV01DTEtfV0RPR19FTgkJMHgxCisKKy8qCisgKiBjbGtwd3JfdGltZXJzX3B3bXNfY2xrX2N0cmxfMSByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19USU1FUjNfRU4JMHgyMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9UTVJQV01DTEtfVElNRVIyX0VOCTB4MTAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVE1SUFdNQ0xLX1RJTUVSMV9FTgkweDA4CisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19USU1FUjBfRU4JMHgwNAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9UTVJQV01DTEtfUFdNNF9FTgkweDAyCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1RNUlBXTUNMS19QV00zX0VOCTB4MDEKKworLyoKKyAqIGNsa3B3cl9zcGlfY2xrX2N0cmwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TUElDTEtfU0VUX1NQSTJEQVRJTwkweDgwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NQSUNMS19TRVRfU1BJMkNMSwkweDQwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NQSUNMS19VU0VfU1BJMgkJMHgyMAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9TUElDTEtfU1BJMkNMS19FTgkweDEwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NQSUNMS19TRVRfU1BJMURBVElPCTB4MDgKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1BJQ0xLX1NFVF9TUEkxQ0xLCTB4MDQKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfU1BJQ0xLX1VTRV9TUEkxCQkweDAyCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1NQSUNMS19TUEkxQ0xLX0VOCTB4MDEKKworLyoKKyAqIGNsa3B3cl9uYW5kX2Nsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTkFORENMS19JTlRTRUxfTUxDCTB4MjAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTkFORENMS19ETUFfUk5CCQkweDEwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX05BTkRDTEtfRE1BX0lOVAkJMHgwOAorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9OQU5EQ0xLX1NFTF9TTEMJCTB4MDQKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfTkFORENMS19NTENDTEtfRU4JMHgwMgorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9OQU5EQ0xLX1NMQ0NMS19FTgkweDAxCisKKy8qCisgKiBjbGtwd3JfdWFydDNfY2xrX2N0cmwsIGNsa3B3cl91YXJ0NF9jbGtfY3RybCwgY2xrcHdyX3VhcnQ1X2Nsa19jdHJsCisgKiBhbmQgY2xrcHdyX3VhcnQ2X2Nsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVUFSVF9ZX0RJVih5KQkJKCh5KSAmIDB4RkYpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VBUlRfWF9ESVYoeCkJCSgoKHgpICYgMHhGRikgPDwgOCkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVUFSVF9VU0VfSENMSwkJX0JJVCgxNikKKworLyoKKyAqIGNsa3B3cl9pcmRhX2Nsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSVJEQV9ZX0RJVih5KQkJKCh5KSAmIDB4RkYpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0lSREFfWF9ESVYoeCkJCSgoKHgpICYgMHhGRikgPDwgOCkKKworLyoKKyAqIGNsa3B3cl91YXJ0X2Nsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVUFSVENMS0NUUkxfVUFSVDZfRU4JX0JJVCgzKQorI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9VQVJUQ0xLQ1RSTF9VQVJUNV9FTglfQklUKDIpCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX1VBUlRDTEtDVFJMX1VBUlQ0X0VOCV9CSVQoMSkKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfVUFSVENMS0NUUkxfVUFSVDNfRU4JX0JJVCgwKQorCisvKgorICogY2xrcHdyX2RtYWNsa19jdHJsIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfRE1BQ0xLQ1RSTF9DTEtfRU4JMHgxCisKKy8qCisgKiBjbGtwd3JfYXV0b2Nsb2NrIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfQVVUT0NMS19VU0JfRU4JCTB4NDAKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfQVVUT0NMS19JUkFNX0VOCQkweDAyCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0FVVE9DTEtfSVJPTV9FTgkJMHgwMQorCisvKgorICogSW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cworICovCisjZGVmaW5lIExQQzMyWFhfSU5UQ19NQVNLKHgpCQkJaW9fcDJ2KCh4KSArIDB4MDApCisjZGVmaW5lIExQQzMyWFhfSU5UQ19SQVdfU1RBVCh4KQkJaW9fcDJ2KCh4KSArIDB4MDQpCisjZGVmaW5lIExQQzMyWFhfSU5UQ19TVEFUKHgpCQkJaW9fcDJ2KCh4KSArIDB4MDgpCisjZGVmaW5lIExQQzMyWFhfSU5UQ19QT0xBUih4KQkJCWlvX3AydigoeCkgKyAweDBDKQorI2RlZmluZSBMUEMzMlhYX0lOVENfQUNUX1RZUEUoeCkJCWlvX3AydigoeCkgKyAweDEwKQorI2RlZmluZSBMUEMzMlhYX0lOVENfVFlQRSh4KQkJCWlvX3AydigoeCkgKyAweDE0KQorCisvKgorICogVGltZXIvY291bnRlciByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUgTENQMzJYWF9USU1FUl9JUih4KQkJCWlvX3AydigoeCkgKyAweDAwKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX1RDUih4KQkJCWlvX3AydigoeCkgKyAweDA0KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX1RDKHgpCQkJaW9fcDJ2KCh4KSArIDB4MDgpCisjZGVmaW5lIExDUDMyWFhfVElNRVJfUFIoeCkJCQlpb19wMnYoKHgpICsgMHgwQykKKyNkZWZpbmUgTENQMzJYWF9USU1FUl9QQyh4KQkJCWlvX3AydigoeCkgKyAweDEwKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX01DUih4KQkJCWlvX3AydigoeCkgKyAweDE0KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX01SMCh4KQkJCWlvX3AydigoeCkgKyAweDE4KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX01SMSh4KQkJCWlvX3AydigoeCkgKyAweDFDKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX01SMih4KQkJCWlvX3AydigoeCkgKyAweDIwKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX01SMyh4KQkJCWlvX3AydigoeCkgKyAweDI0KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NDUih4KQkJCWlvX3AydigoeCkgKyAweDI4KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NSMCh4KQkJCWlvX3AydigoeCkgKyAweDJDKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NSMSh4KQkJCWlvX3AydigoeCkgKyAweDMwKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NSMih4KQkJCWlvX3AydigoeCkgKyAweDM0KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NSMyh4KQkJCWlvX3AydigoeCkgKyAweDM4KQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0VNUih4KQkJCWlvX3AydigoeCkgKyAweDNDKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NUQ1IoeCkJCQlpb19wMnYoKHgpICsgMHg3MCkKKworLyoKKyAqIGlyIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTENQMzJYWF9USU1FUl9DTlRSX01UQ0hfQklUKG4pCQkoMSA8PCAoKG4pICYgMHgzKSkKKyNkZWZpbmUgTENQMzJYWF9USU1FUl9DTlRSX0NBUFRfQklUKG4pCQkoMSA8PCAoNCArICgobikgJiAweDMpKSkKKworLyoKKyAqIHRjciByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExDUDMyWFhfVElNRVJfQ05UUl9UQ1JfRU4JCTB4MQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NOVFJfVENSX1JFU0VUCQkweDIKKworLyoKKyAqIG1jciByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIExDUDMyWFhfVElNRVJfQ05UUl9NQ1JfTVRDSChuKQkJKDB4MSA8PCAoKG4pICogMykpCisjZGVmaW5lIExDUDMyWFhfVElNRVJfQ05UUl9NQ1JfUkVTRVQobikJCSgweDEgPDwgKCgobikgKiAzKSArIDEpKQorI2RlZmluZSBMQ1AzMlhYX1RJTUVSX0NOVFJfTUNSX1NUT1AobikJCSgweDEgPDwgKCgobikgKiAzKSArIDIpKQorCisvKgorICogU3RhbmRhcmQgVUFSVCByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0RMTF9GSUZPKHgpCQlpb19wMnYoKHgpICsgMHgwMCkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0RMTV9JRVIoeCkJCQlpb19wMnYoKHgpICsgMHgwNCkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0lJUl9GQ1IoeCkJCQlpb19wMnYoKHgpICsgMHgwOCkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0xDUih4KQkJCWlvX3AydigoeCkgKyAweDBDKQorI2RlZmluZSBMUEMzMlhYX1VBUlRfTU9ERU1fQ1RSTCh4KQkJaW9fcDJ2KCh4KSArIDB4MTApCisjZGVmaW5lIExQQzMyWFhfVUFSVF9MU1IoeCkJCQlpb19wMnYoKHgpICsgMHgxNCkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX01PREVNX1NUQVRVUyh4KQkJaW9fcDJ2KCh4KSArIDB4MTgpCisjZGVmaW5lIExQQzMyWFhfVUFSVF9SWExFVih4KQkJCWlvX3AydigoeCkgKyAweDFDKQorCisvKgorICogVUFSVCBjb250cm9sIHN0cnVjdHVyZSBvZmZzZXRzCisgKi8KKyNkZWZpbmUgX1VDUkVHKHgpCQkJCWlvX3AydihcCisJCQkJCQlMUEMzMlhYX1VBUlRfQ1RSTF9CQVNFICsgKHgpKQorI2RlZmluZSBMUEMzMlhYX1VBUlRDVExfQ1RSTAkJCV9VQ1JFRygweDAwKQorI2RlZmluZSBMUEMzMlhYX1VBUlRDVExfQ0xLTU9ERQkJCV9VQ1JFRygweDA0KQorI2RlZmluZSBMUEMzMlhYX1VBUlRDVExfQ0xPT1AJCQlfVUNSRUcoMHgwOCkKKworLyoKKyAqIGN0cmwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX1VBUlRfVTNfTURfQ1RSTF9FTgkJX0JJVCgxMSkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0lSUlg2X0lOVl9FTgkJX0JJVCgxMCkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0hEUFhfRU4JCQlfQklUKDkpCisjZGVmaW5lIExQQzMyWFhfVUFSVF9VQVJUNl9JUkRBTU9EX0JZUEFTUwlfQklUKDUpCisjZGVmaW5lIExQQzMyWFhfUlRfSVJUWDZfSU5WX0VOCQkJX0JJVCg0KQorI2RlZmluZSBMUEMzMlhYX1JUX0lSVFg2X0lOVl9NSVJfRU4JCV9CSVQoMykKKyNkZWZpbmUgTFBDMzJYWF9SVF9SWF9JUlBVTFNFXzNfMTZfMTE1SwkJX0JJVCgyKQorI2RlZmluZSBMUEMzMlhYX1JUX1RYX0lSUFVMU0VfM18xNl8xMTVLCQlfQklUKDEpCisjZGVmaW5lIExQQzMyWFhfVUFSVF9VNV9ST1VURV9UT19VU0IJCV9CSVQoMCkKKworLyoKKyAqIGNsa21vZGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBMUEMzMlhYX1VBUlRfRU5BQkxFRF9DTE9DS1MobikJCSgoKG4pID4+IDE2KSAmIDB4N0YpCisjZGVmaW5lIExQQzMyWFhfVUFSVF9FTkFCTEVEX0NMT0NLKG4sIHUpCSgoKG4pID4+ICgxNiArICh1KSkpICYgMHgxKQorI2RlZmluZSBMUEMzMlhYX1VBUlRfRU5BQkxFRF9DTEtTX0FOWQkJX0JJVCgxNCkKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0NMS01PREVfT0ZGCQkweDAKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0NMS01PREVfT04JCQkweDEKKyNkZWZpbmUgTFBDMzJYWF9VQVJUX0NMS01PREVfQVVUTwkJMHgyCisjZGVmaW5lIExQQzMyWFhfVUFSVF9DTEtNT0RFX01BU0sodSkJCSgweDMgPDwgKCgoKHUpIC0gMykgKiAyKSArIDQpKQorI2RlZmluZSBMUEMzMlhYX1VBUlRfQ0xLTU9ERV9MT0FEKG0sIHUpCQkoKG0pIDw8ICgoKCh1KSAtIDMpICogMikgKyA0KSkKKworLyoKKyAqIEdQSU8gTW9kdWxlIFJlZ2lzdGVyIG9mZnNldHMKKyAqLworI2RlZmluZSBfR1BSRUcoeCkJCQkJaW9fcDJ2KExQQzMyWFhfR1BJT19CQVNFICsgKHgpKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUF9NVVhfU0VUCQkJX0dQUkVHKDB4MTAwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUF9NVVhfQ0xSCQkJX0dQUkVHKDB4MTA0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUF9NVVhfU1RBVEUJCV9HUFJFRygweDEwOCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX01VWF9TRVQJCQlfR1BSRUcoMHgxMTApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19NVVhfQ0xSCQkJX0dQUkVHKDB4MTE0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfTVVYX1NUQVRFCQlfR1BSRUcoMHgxMTgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9NVVhfU0VUCQkJX0dQUkVHKDB4MTIwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfTVVYX0NMUgkJCV9HUFJFRygweDEyNCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX01VWF9TVEFURQkJX0dQUkVHKDB4MTI4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfTVVYX1NFVAkJCV9HUFJFRygweDEzMCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX01VWF9DTFIJCQlfR1BSRUcoMHgxMzQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9NVVhfU1RBVEUJCV9HUFJFRygweDEzOCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNiMGRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMCwwICsxLDUyIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKKyNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAorCitzdGF0aWMgdm9pZCBhcmNoX2lkbGUodm9pZCkKK3sKKwljcHVfZG9faWRsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlleHRlcm4gdm9pZCBscGMzMnh4X3dhdGNoZG9nX3Jlc2V0KHZvaWQpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAncyc6CisJY2FzZSAnaCc6CisJCXByaW50ayhLRVJOX0NSSVQgIlJFU0VUOiBSZWJvb3Rpbmcgc3lzdGVtXG4iKTsKKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCQlscGMzMnh4X3dhdGNoZG9nX3Jlc2V0KCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogRG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwkvKiBXYWl0IGZvciB3YXRjaGRvZyB0byByZXNldCBzeXN0ZW0gKi8KKwl3aGlsZSAoMSkKKwkJOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQwNjZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1RJTUVYX0gKKyNkZWZpbmUgX19BU01fQVJDSF9USU1FWF9ICisKKy8qCisgKiBSYXRlIGluIEh6IG9mIHRoZSBtYWluIHN5c3RlbSBvc2NpbGxhdG9yLiBUaGlzIHZhbHVlIHNob3VsZCBtYXRjaAorICogdGhlIHZhbHVlICdNQUlOX09TQ19GUkVRJyBpbiBwbGF0Zm9ybS5oCisgKi8KKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCTEzMDAwMDAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQyNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisgKgorICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fQVJNX0FSQ0hfVU5DT01QUkVTU19ICisjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX1VOQ09NUFJFU1NfSAorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisKKy8qCisgKiBVbmNvbXByZXNzIG91dHB1dCBpcyBoYXJkY29kZWQgdG8gc3RhbmRhcmQgVUFSVCA1CisgKi8KKworI2RlZmluZSBVQVJUX0ZJRk9fQ1RMX1RYX1JFU0VUCSgxIDw8IDIpCisjZGVmaW5lIFVBUlRfU1RBVFVTX1RYX01UCSgxIDw8IDYpCisKKyNkZWZpbmUgX1VBUlRSRUcoeCkJCSh2b2lkIF9faW9tZW0gKikoTFBDMzJYWF9VQVJUNV9CQVNFICsgKHgpKQorCisjZGVmaW5lIExQQzMyWFhfVUFSVF9ETExGSUZPX08JMHgwMAorI2RlZmluZSBMUEMzMlhYX1VBUlRfSUlSRkNSX08JMHgwOAorI2RlZmluZSBMUEMzMlhYX1VBUlRfTFNSX08JMHgxNAorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0YyhpbnQgY2gpCit7CisJLyogV2FpdCBmb3IgdHJhbnNtaXQgRklGTyB0byBlbXB0eSAqLworCXdoaWxlICgoX19yYXdfcmVhZGwoX1VBUlRSRUcoTFBDMzJYWF9VQVJUX0xTUl9PKSkgJgorCQlVQVJUX1NUQVRVU19UWF9NVCkgPT0gMCkKKwkJOworCisJX19yYXdfd3JpdGVsKCh1MzIpIGNoLCBfVUFSVFJFRyhMUEMzMlhYX1VBUlRfRExMRklGT19PKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaCh2b2lkKQoreworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChfVUFSVFJFRyhMUEMzMlhYX1VBUlRfSUlSRkNSX08pKSB8CisJCVVBUlRfRklGT19DVExfVFhfUkVTRVQsIF9VQVJUUkVHKExQQzMyWFhfVUFSVF9JSVJGQ1JfTykpOworfQorCisvKiBOVUxMIGZ1bmN0aW9uczsgd2UgZG9uJ3QgcHJlc2VudGx5IG5lZWQgdGhlbSAqLworI2RlZmluZSBhcmNoX2RlY29tcF9zZXR1cCgpCisjZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkOTM2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1ZNQUxMT0NfSAorI2RlZmluZSBfX0FTTV9BUkNIX1ZNQUxMT0NfSAorCisjZGVmaW5lIFZNQUxMT0NfRU5ECTB4RjAwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZGYyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaXJxLmMKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvaXJxLmMKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qCisgKiBEZWZhdWx0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgQWN0aXZhdGlvbiBwb2xhcml0eSBvZiBhbGwgaW50ZXJuYWwKKyAqIGludGVycnVwdCBzb3VyY2VzCisgKi8KKyNkZWZpbmUgTUlDX0FQUl9ERUZBVUxUCQkweDNGRjBFRkUwCisjZGVmaW5lIFNJQzFfQVBSX0RFRkFVTFQJMHhGQkQyNzE4NgorI2RlZmluZSBTSUMyX0FQUl9ERUZBVUxUCTB4ODAxODEwQzAKKworLyoKKyAqIERlZmF1bHQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBBY3RpdmF0aW9uIFR5cGUgb2YgYWxsIGludGVybmFsCisgKiBpbnRlcnJ1cHQgc291cmNlcy4gQWxsIGFyZSBsZXZlbCBzZW5zaXRpdmUuCisgKi8KKyNkZWZpbmUgTUlDX0FUUl9ERUZBVUxUCQkweDAwMDAwMDAwCisjZGVmaW5lIFNJQzFfQVRSX0RFRkFVTFQJMHgwMDAyNjAwMAorI2RlZmluZSBTSUMyX0FUUl9ERUZBVUxUCTB4MDAwMDAwMDAKKworc3RydWN0IGxwYzMyeHhfZXZlbnRfZ3JvdXBfcmVncyB7CisJdm9pZCBfX2lvbWVtICplbmFiX3JlZzsKKwl2b2lkIF9faW9tZW0gKmVkZ2VfcmVnOworCXZvaWQgX19pb21lbSAqbWFza3N0YXRfcmVnOworCXZvaWQgX19pb21lbSAqcmF3c3RhdF9yZWc7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxwYzMyeHhfZXZlbnRfZ3JvdXBfcmVncyBscGMzMnh4X2V2ZW50X2ludF9yZWdzID0geworCS5lbmFiX3JlZyA9IExQQzMyWFhfQ0xLUFdSX0lOVF9FUiwKKwkuZWRnZV9yZWcgPSBMUEMzMlhYX0NMS1BXUl9JTlRfQVAsCisJLm1hc2tzdGF0X3JlZyA9IExQQzMyWFhfQ0xLUFdSX0lOVF9TUiwKKwkucmF3c3RhdF9yZWcgPSBMUEMzMlhYX0NMS1BXUl9JTlRfUlMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxwYzMyeHhfZXZlbnRfZ3JvdXBfcmVncyBscGMzMnh4X2V2ZW50X3Bpbl9yZWdzID0geworCS5lbmFiX3JlZyA9IExQQzMyWFhfQ0xLUFdSX1BJTl9FUiwKKwkuZWRnZV9yZWcgPSBMUEMzMlhYX0NMS1BXUl9QSU5fQVAsCisJLm1hc2tzdGF0X3JlZyA9IExQQzMyWFhfQ0xLUFdSX1BJTl9TUiwKKwkucmF3c3RhdF9yZWcgPSBMUEMzMlhYX0NMS1BXUl9QSU5fUlMsCit9OworCitzdHJ1Y3QgbHBjMzJ4eF9ldmVudF9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgbHBjMzJ4eF9ldmVudF9ncm91cF9yZWdzICpldmVudF9ncm91cDsKKwl1MzIgbWFzazsKK307CisKKy8qCisgKiBNYXBzIGFuIElSUSBudW1iZXIgdG8gYW5kIGV2ZW50IG1hc2sgYW5kIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHBjMzJ4eF9ldmVudF9pbmZvIGxwYzMyeHhfZXZlbnRzW05SX0lSUVNdID0geworCVtJUlFfTFBDMzJYWF9HUElfMDhdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA4X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDldID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA5X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMTldID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzE5X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDddID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA3X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDBdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAwX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDFdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAxX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDJdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAyX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDNdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzAzX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDRdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA0X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDVdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA1X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElfMDZdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9waW5fcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9FWFRTUkNfR1BJXzA2X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElPXzAwXSA9IHsKKwkJLmV2ZW50X2dyb3VwID0gJmxwYzMyeHhfZXZlbnRfaW50X3JlZ3MsCisJCS5tYXNrID0gTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDBfQklULAorCX0sCisJW0lSUV9MUEMzMlhYX0dQSU9fMDFdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9pbnRfcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfR1BJT18wMV9CSVQsCisJfSwKKwlbSVJRX0xQQzMyWFhfR1BJT18wMl0gPSB7CisJCS5ldmVudF9ncm91cCA9ICZscGMzMnh4X2V2ZW50X2ludF9yZWdzLAorCQkubWFzayA9IExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19HUElPXzAyX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9HUElPXzAzXSA9IHsKKwkJLmV2ZW50X2dyb3VwID0gJmxwYzMyeHhfZXZlbnRfaW50X3JlZ3MsCisJCS5tYXNrID0gTFBDMzJYWF9DTEtQV1JfSU5UU1JDX0dQSU9fMDNfQklULAorCX0sCisJW0lSUV9MUEMzMlhYX0dQSU9fMDRdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9pbnRfcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfR1BJT18wNF9CSVQsCisJfSwKKwlbSVJRX0xQQzMyWFhfR1BJT18wNV0gPSB7CisJCS5ldmVudF9ncm91cCA9ICZscGMzMnh4X2V2ZW50X2ludF9yZWdzLAorCQkubWFzayA9IExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19HUElPXzA1X0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9LRVldID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9pbnRfcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfS0VZX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9VU0JfT1RHX0FUWF0gPSB7CisJCS5ldmVudF9ncm91cCA9ICZscGMzMnh4X2V2ZW50X2ludF9yZWdzLAorCQkubWFzayA9IExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19VU0JBVFhJTlRfQklULAorCX0sCisJW0lSUV9MUEMzMlhYX1VTQl9IT1NUXSA9IHsKKwkJLmV2ZW50X2dyb3VwID0gJmxwYzMyeHhfZXZlbnRfaW50X3JlZ3MsCisJCS5tYXNrID0gTFBDMzJYWF9DTEtQV1JfSU5UU1JDX1VTQl9CSVQsCisJfSwKKwlbSVJRX0xQQzMyWFhfUlRDXSA9IHsKKwkJLmV2ZW50X2dyb3VwID0gJmxwYzMyeHhfZXZlbnRfaW50X3JlZ3MsCisJCS5tYXNrID0gTFBDMzJYWF9DTEtQV1JfSU5UU1JDX1JUQ19CSVQsCisJfSwKKwlbSVJRX0xQQzMyWFhfTVNUSU1FUl0gPSB7CisJCS5ldmVudF9ncm91cCA9ICZscGMzMnh4X2V2ZW50X2ludF9yZWdzLAorCQkubWFzayA9IExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19NU1RJTUVSX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9UU19BVVhdID0geworCQkuZXZlbnRfZ3JvdXAgPSAmbHBjMzJ4eF9ldmVudF9pbnRfcmVncywKKwkJLm1hc2sgPSBMUEMzMlhYX0NMS1BXUl9JTlRTUkNfVFNfQVVYX0JJVCwKKwl9LAorCVtJUlFfTFBDMzJYWF9UU19QXSA9IHsKKwkJLmV2ZW50X2dyb3VwID0gJmxwYzMyeHhfZXZlbnRfaW50X3JlZ3MsCisJCS5tYXNrID0gTFBDMzJYWF9DTEtQV1JfSU5UU1JDX1RTX1BfQklULAorCX0sCisJW0lSUV9MUEMzMlhYX1RTX0lSUV0gPSB7CisJCS5ldmVudF9ncm91cCA9ICZscGMzMnh4X2V2ZW50X2ludF9yZWdzLAorCQkubWFzayA9IExQQzMyWFhfQ0xLUFdSX0lOVFNSQ19BRENfQklULAorCX0sCit9OworCitzdGF0aWMgdm9pZCBnZXRfY29udHJvbGxlcih1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgKmJhc2UsCisJdW5zaWduZWQgaW50ICppcnFiaXQpCit7CisJaWYgKGlycSA8IDMyKSB7CisJCSpiYXNlID0gTFBDMzJYWF9NSUNfQkFTRTsKKwkJKmlycWJpdCA9IDEgPDwgaXJxOworCX0gZWxzZSBpZiAoaXJxIDwgNjQpIHsKKwkJKmJhc2UgPSBMUEMzMlhYX1NJQzFfQkFTRTsKKwkJKmlycWJpdCA9IDEgPDwgKGlycSAtIDMyKTsKKwl9IGVsc2UgeworCQkqYmFzZSA9IExQQzMyWFhfU0lDMl9CQVNFOworCQkqaXJxYml0ID0gMSA8PCAoaXJxIC0gNjQpOworCX0KK30KKworc3RhdGljIHZvaWQgbHBjMzJ4eF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCByZWcsIGN0cmwsIG1hc2s7CisKKwlnZXRfY29udHJvbGxlcihpcnEsICZjdHJsLCAmbWFzayk7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0lOVENfTUFTSyhjdHJsKSkgJiB+bWFzazsKKwlfX3Jhd193cml0ZWwocmVnLCBMUEMzMlhYX0lOVENfTUFTSyhjdHJsKSk7Cit9CisKK3N0YXRpYyB2b2lkIGxwYzMyeHhfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCByZWcsIGN0cmwsIG1hc2s7CisKKwlnZXRfY29udHJvbGxlcihpcnEsICZjdHJsLCAmbWFzayk7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0lOVENfTUFTSyhjdHJsKSkgfCBtYXNrOworCV9fcmF3X3dyaXRlbChyZWcsIExQQzMyWFhfSU5UQ19NQVNLKGN0cmwpKTsKK30KKworc3RhdGljIHZvaWQgbHBjMzJ4eF9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IGN0cmwsIG1hc2s7CisKKwlnZXRfY29udHJvbGxlcihpcnEsICZjdHJsLCAmbWFzayk7CisKKwlfX3Jhd193cml0ZWwobWFzaywgTFBDMzJYWF9JTlRDX1JBV19TVEFUKGN0cmwpKTsKKworCS8qIEFsc28gbmVlZCB0byBjbGVhciBwZW5kaW5nIHdha2UgZXZlbnQgKi8KKwlpZiAobHBjMzJ4eF9ldmVudHNbaXJxXS5tYXNrICE9IDApCisJCV9fcmF3X3dyaXRlbChscGMzMnh4X2V2ZW50c1tpcnFdLm1hc2ssCisJCQlscGMzMnh4X2V2ZW50c1tpcnFdLmV2ZW50X2dyb3VwLT5yYXdzdGF0X3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbHBjMzJ4eF9zZXRfaXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgaW50IHVzZV9oaWdoX2xldmVsLAorCWludCB1c2VfZWRnZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnLCBjdHJsLCBtYXNrOworCisJZ2V0X2NvbnRyb2xsZXIoaXJxLCAmY3RybCwgJm1hc2spOworCisJLyogQWN0aXZhdGlvbiBsZXZlbCwgaGlnaCBvciBsb3cgKi8KKwlyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0lOVENfUE9MQVIoY3RybCkpOworCWlmICh1c2VfaGlnaF9sZXZlbCkKKwkJcmVnIHw9IG1hc2s7CisJZWxzZQorCQlyZWcgJj0gfm1hc2s7CisJX19yYXdfd3JpdGVsKHJlZywgTFBDMzJYWF9JTlRDX1BPTEFSKGN0cmwpKTsKKworCS8qIEFjdGl2YXRpb24gdHlwZSwgZWRnZSBvciBsZXZlbCAqLworCXJlZyA9IF9fcmF3X3JlYWRsKExQQzMyWFhfSU5UQ19BQ1RfVFlQRShjdHJsKSk7CisJaWYgKHVzZV9lZGdlKQorCQlyZWcgfD0gbWFzazsKKwllbHNlCisJCXJlZyAmPSB+bWFzazsKKwlfX3Jhd193cml0ZWwocmVnLCBMUEMzMlhYX0lOVENfQUNUX1RZUEUoY3RybCkpOworCisJLyogVXNlIHNhbWUgcG9sYXJpdHkgZm9yIHRoZSB3YWtlIGV2ZW50cyAqLworCWlmIChscGMzMnh4X2V2ZW50c1tpcnFdLm1hc2sgIT0gMCkgeworCQlyZWcgPSBfX3Jhd19yZWFkbChscGMzMnh4X2V2ZW50c1tpcnFdLmV2ZW50X2dyb3VwLT5lZGdlX3JlZyk7CisKKwkJaWYgKHVzZV9oaWdoX2xldmVsKQorCQkJcmVnIHw9IGxwYzMyeHhfZXZlbnRzW2lycV0ubWFzazsKKwkJZWxzZQorCQkJcmVnICY9IH5scGMzMnh4X2V2ZW50c1tpcnFdLm1hc2s7CisKKwkJX19yYXdfd3JpdGVsKHJlZywgbHBjMzJ4eF9ldmVudHNbaXJxXS5ldmVudF9ncm91cC0+ZWRnZV9yZWcpOworCX0KK30KKworc3RhdGljIGludCBscGMzMnh4X3NldF9pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQkvKiBSaXNpbmcgZWRnZSBzZW5zaXRpdmUgKi8KKwkJX19scGMzMnh4X3NldF9pcnFfdHlwZShpcnEsIDEsIDEpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQkvKiBGYWxsaW5nIGVkZ2Ugc2Vuc2l0aXZlICovCisJCV9fbHBjMzJ4eF9zZXRfaXJxX3R5cGUoaXJxLCAwLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJLyogTG93IGxldmVsIHNlbnNpdGl2ZSAqLworCQlfX2xwYzMyeHhfc2V0X2lycV90eXBlKGlycSwgMCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQkvKiBIaWdoIGxldmVsIHNlbnNpdGl2ZSAqLworCQlfX2xwYzMyeHhfc2V0X2lycV90eXBlKGlycSwgMSwgMCk7CisJCWJyZWFrOworCisJLyogT3RoZXIgbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBPayB0byB1c2UgdGhlIGxldmVsIGhhbmRsZXIgZm9yIGFsbCB0eXBlcyAqLworCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9pcnFfd2FrZSh1bnNpZ25lZCBpbnQgaXJxbm8sIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGV2ZW50cmVnOworCisJaWYgKGxwYzMyeHhfZXZlbnRzW2lycW5vXS5tYXNrICE9IDApIHsKKwkJZXZlbnRyZWcgPSBfX3Jhd19yZWFkbChscGMzMnh4X2V2ZW50c1tpcnFub10uCisJCQlldmVudF9ncm91cC0+ZW5hYl9yZWcpOworCisJCWlmIChzdGF0ZSkKKwkJCWV2ZW50cmVnIHw9IGxwYzMyeHhfZXZlbnRzW2lycW5vXS5tYXNrOworCQllbHNlCisJCQlldmVudHJlZyAmPSB+bHBjMzJ4eF9ldmVudHNbaXJxbm9dLm1hc2s7CisKKwkJX19yYXdfd3JpdGVsKGV2ZW50cmVnLAorCQkJbHBjMzJ4eF9ldmVudHNbaXJxbm9dLmV2ZW50X2dyb3VwLT5lbmFiX3JlZyk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2xlYXIgZXZlbnQgKi8KKwlfX3Jhd193cml0ZWwobHBjMzJ4eF9ldmVudHNbaXJxbm9dLm1hc2ssCisJCWxwYzMyeHhfZXZlbnRzW2lycW5vXS5ldmVudF9ncm91cC0+cmF3c3RhdF9yZWcpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBscGMzMnh4X3NldF9kZWZhdWx0X21hcHBpbmdzKHVuc2lnbmVkIGludCBhcHIsCisJdW5zaWduZWQgaW50IGF0ciwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFNldCBhY3RpdmF0aW9uIGxldmVscyBmb3IgZWFjaCBpbnRlcnJ1cHQgKi8KKwlpID0gMDsKKwl3aGlsZSAoaSA8IDMyKSB7CisJCV9fbHBjMzJ4eF9zZXRfaXJxX3R5cGUob2Zmc2V0ICsgaSwgKChhcHIgPj4gaSkgJiAweDEpLAorCQkJKChhdHIgPj4gaSkgJiAweDEpKTsKKwkJaSsrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBscGMzMnh4X2lycV9jaGlwID0geworCS5hY2sgPSBscGMzMnh4X2Fja19pcnEsCisJLm1hc2sgPSBscGMzMnh4X21hc2tfaXJxLAorCS51bm1hc2sgPSBscGMzMnh4X3VubWFza19pcnEsCisJLnNldF90eXBlID0gbHBjMzJ4eF9zZXRfaXJxX3R5cGUsCisJLnNldF93YWtlID0gbHBjMzJ4eF9pcnFfd2FrZQorfTsKKworc3RhdGljIHZvaWQgbHBjMzJ4eF9zaWMxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXVuc2lnbmVkIGxvbmcgaW50cyA9IF9fcmF3X3JlYWRsKExQQzMyWFhfSU5UQ19TVEFUKExQQzMyWFhfU0lDMV9CQVNFKSk7CisKKwl3aGlsZSAoaW50cyAhPSAwKSB7CisJCWludCBpcnFubyA9IGZscyhpbnRzKSAtIDE7CisKKwkJaW50cyAmPSB+KDEgPDwgaXJxbm8pOworCisJCWdlbmVyaWNfaGFuZGxlX2lycShMUEMzMlhYX1NJQzFfSVJRKGlycW5vKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBscGMzMnh4X3NpYzJfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJdW5zaWduZWQgbG9uZyBpbnRzID0gX19yYXdfcmVhZGwoTFBDMzJYWF9JTlRDX1NUQVQoTFBDMzJYWF9TSUMyX0JBU0UpKTsKKworCXdoaWxlIChpbnRzICE9IDApIHsKKwkJaW50IGlycW5vID0gZmxzKGludHMpIC0gMTsKKworCQlpbnRzICY9IH4oMSA8PCBpcnFubyk7CisKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKExQQzMyWFhfU0lDMl9JUlEoaXJxbm8pKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGxwYzMyeHhfaW5pdF9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFNldHVwIE1JQyAqLworCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX0lOVENfTUFTSyhMUEMzMlhYX01JQ19CQVNFKSk7CisJX19yYXdfd3JpdGVsKE1JQ19BUFJfREVGQVVMVCwgTFBDMzJYWF9JTlRDX1BPTEFSKExQQzMyWFhfTUlDX0JBU0UpKTsKKwlfX3Jhd193cml0ZWwoTUlDX0FUUl9ERUZBVUxULCBMUEMzMlhYX0lOVENfQUNUX1RZUEUoTFBDMzJYWF9NSUNfQkFTRSkpOworCisJLyogU2V0dXAgU0lDMSAqLworCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX0lOVENfTUFTSyhMUEMzMlhYX1NJQzFfQkFTRSkpOworCV9fcmF3X3dyaXRlbChNSUNfQVBSX0RFRkFVTFQsIExQQzMyWFhfSU5UQ19QT0xBUihMUEMzMlhYX1NJQzFfQkFTRSkpOworCV9fcmF3X3dyaXRlbChNSUNfQVRSX0RFRkFVTFQsIExQQzMyWFhfSU5UQ19BQ1RfVFlQRShMUEMzMlhYX1NJQzFfQkFTRSkpOworCisJLyogU2V0dXAgU0lDMiAqLworCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX0lOVENfTUFTSyhMUEMzMlhYX1NJQzJfQkFTRSkpOworCV9fcmF3X3dyaXRlbChNSUNfQVBSX0RFRkFVTFQsIExQQzMyWFhfSU5UQ19QT0xBUihMUEMzMlhYX1NJQzJfQkFTRSkpOworCV9fcmF3X3dyaXRlbChNSUNfQVRSX0RFRkFVTFQsIExQQzMyWFhfSU5UQ19BQ1RfVFlQRShMUEMzMlhYX1NJQzJfQkFTRSkpOworCisJLyogQ29uZmlndXJlIHN1cHBvcnRlZCBJUlEncyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc2V0X2lycV9jaGlwKGksICZscGMzMnh4X2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOworCX0KKworCS8qIFNldCBkZWZhdWx0IG1hcHBpbmdzICovCisJbHBjMzJ4eF9zZXRfZGVmYXVsdF9tYXBwaW5ncyhNSUNfQVBSX0RFRkFVTFQsIE1JQ19BVFJfREVGQVVMVCwgMCk7CisJbHBjMzJ4eF9zZXRfZGVmYXVsdF9tYXBwaW5ncyhTSUMxX0FQUl9ERUZBVUxULCBTSUMxX0FUUl9ERUZBVUxULCAzMik7CisJbHBjMzJ4eF9zZXRfZGVmYXVsdF9tYXBwaW5ncyhTSUMyX0FQUl9ERUZBVUxULCBTSUMyX0FUUl9ERUZBVUxULCA2NCk7CisKKwkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBTVUJJUlEgKi8KKwlfX3Jhd193cml0ZWwoMCwgTFBDMzJYWF9JTlRDX01BU0soTFBDMzJYWF9NSUNfQkFTRSkpOworCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX0lOVENfTUFTSyhMUEMzMlhYX1NJQzFfQkFTRSkpOworCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX0lOVENfTUFTSyhMUEMzMlhYX1NJQzJfQkFTRSkpOworCisJLyogTUlDIFNVQklSUXggaW50ZXJydXB0cyB3aWxsIHJvdXRlIGhhbmRsaW5nIHRvIHRoZSBjaGFpbiBoYW5kbGVycyAqLworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9MUEMzMlhYX1NVQjFJUlEsIGxwYzMyeHhfc2ljMV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTFBDMzJYWF9TVUIySVJRLCBscGMzMnh4X3NpYzJfaGFuZGxlcik7CisKKwkvKiBJbml0aWFsbHkgZGlzYWJsZSBhbGwgd2FrZSBldmVudHMgKi8KKwlfX3Jhd193cml0ZWwoMCwgTFBDMzJYWF9DTEtQV1JfUDAxX0VSKTsKKwlfX3Jhd193cml0ZWwoMCwgTFBDMzJYWF9DTEtQV1JfSU5UX0VSKTsKKwlfX3Jhd193cml0ZWwoMCwgTFBDMzJYWF9DTEtQV1JfUElOX0VSKTsKKworCS8qCisJICogRGVmYXVsdCB3YWtlIGFjdGl2YXRpb24gcG9sYXJpdGllcywgYWxsIHBpbiBzb3VyY2VzIGFyZSBsb3cgZWRnZQorCSAqIHRyaWdnZXJlZAorCSAqLworCV9fcmF3X3dyaXRlbChMUEMzMlhYX0NMS1BXUl9JTlRTUkNfVFNfUF9CSVQgfAorCQlMUEMzMlhYX0NMS1BXUl9JTlRTUkNfTVNUSU1FUl9CSVQgfAorCQlMUEMzMlhYX0NMS1BXUl9JTlRTUkNfUlRDX0JJVCwKKwkJTFBDMzJYWF9DTEtQV1JfSU5UX0FQKTsKKwlfX3Jhd193cml0ZWwoMCwgTFBDMzJYWF9DTEtQV1JfUElOX0FQKTsKKworCS8qIENsZWFyIGxhdGNoZWQgd2FrZSBldmVudCBzdGF0ZXMgKi8KKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfUElOX1JTKSwKKwkJTFBDMzJYWF9DTEtQV1JfUElOX1JTKTsKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfSU5UX1JTKSwKKwkJTFBDMzJYWF9DTEtQV1JfSU5UX1JTKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9waHkzMjUwLmMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvcGh5MzI1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWE0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvcGh5MzI1MC5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BoeTMyNTAuYworICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9lZXByb20uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKgorICogTWFwcGVkIEdQSU9MSUIgR1BJT3MKKyAqLworI2RlZmluZSBTUEkwX0NTX0dQSU8JTFBDMzJYWF9HUElPKExQQzMyWFhfR1BJT19QM19HUlAsIDUpCisjZGVmaW5lIExDRF9QT1dFUl9HUElPCUxQQzMyWFhfR1BJTyhMUEMzMlhYX0dQT19QM19HUlAsIDApCisjZGVmaW5lIEJLTF9QT1dFUl9HUElPCUxQQzMyWFhfR1BJTyhMUEMzMlhYX0dQT19QM19HUlAsIDQpCisjZGVmaW5lIExFRF9HUElPCUxQQzMyWFhfR1BJTyhMUEMzMlhYX0dQT19QM19HUlAsIDEpCisKKy8qCisgKiBBTUJBIExDRCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xjZF9wYW5lbCBjb25uX2xjZF9wYW5lbCA9IHsKKwkubW9kZQkJPSB7CisJCS5uYW1lCQk9ICJRVkdBIHBvcnRyYWl0IiwKKwkJLnJlZnJlc2gJPSA2MCwKKwkJLnhyZXMJCT0gMjQwLAorCQkueXJlcwkJPSAzMjAsCisJCS5waXhjbG9jawk9IDE5MTgyOCwKKwkJLmxlZnRfbWFyZ2luCT0gMjIsCisJCS5yaWdodF9tYXJnaW4JPSAxMSwKKwkJLnVwcGVyX21hcmdpbgk9IDIsCisJCS5sb3dlcl9tYXJnaW4JPSAxLAorCQkuaHN5bmNfbGVuCT0gNSwKKwkJLnZzeW5jX2xlbgk9IDIsCisJCS5zeW5jCQk9IDAsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCX0sCisJLndpZHRoCQk9IC0xLAorCS5oZWlnaHQJCT0gLTEsCisJLnRpbTIJCT0gKFRJTTJfSVZTIHwgVElNMl9JSFMpLAorCS5jbnRsCQk9IChDTlRMX0JHUiB8IENOVExfTENEVEZUIHwgQ05UTF9MQ0RWQ09NUCgxKSB8CisJCQkJQ05UTF9MQ0RCUFAxNl81NjUpLAorCS5icHAJCT0gMTYsCit9OworI2RlZmluZSBQQU5FTF9TSVpFICgzICogU1pfNjRLKQorCitzdGF0aWMgaW50IGxwYzMyeHhfY2xjZF9zZXR1cChzdHJ1Y3QgY2xjZF9mYiAqZmIpCit7CisJZG1hX2FkZHJfdCBkbWE7CisKKwlmYi0+ZmIuc2NyZWVuX2Jhc2UgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKCZmYi0+ZGV2LT5kZXYsCisJCVBBTkVMX1NJWkUsICZkbWEsIEdGUF9LRVJORUwpOworCWlmICghZmItPmZiLnNjcmVlbl9iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0xDRDogdW5hYmxlIHRvIG1hcCBmcmFtZWJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZiLT5mYi5maXguc21lbV9zdGFydCA9IGRtYTsKKwlmYi0+ZmIuZml4LnNtZW1fbGVuID0gUEFORUxfU0laRTsKKwlmYi0+cGFuZWwgPSAmY29ubl9sY2RfcGFuZWw7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KExDRF9QT1dFUl9HUElPLCAiTENEIHBvd2VyIikpCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVxdWVzdGluZyBncGlvICV1IiwKKwkJCUxDRF9QT1dFUl9HUElPKTsKKwllbHNlIGlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BPV0VSX0dQSU8sIDEpKQorCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIHNldHRpbmcgZ3BpbyAldSB0byBvdXRwdXQiLAorCQkJTENEX1BPV0VSX0dQSU8pOworCisJaWYgKGdwaW9fcmVxdWVzdChCS0xfUE9XRVJfR1BJTywgIkxDRCBiYWNrbGlnaHQgcG93ZXIiKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciByZXF1ZXN0aW5nIGdwaW8gJXUiLAorCQkJQktMX1BPV0VSX0dQSU8pOworCWVsc2UgaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChCS0xfUE9XRVJfR1BJTywgMSkpCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igc2V0dGluZyBncGlvICV1IHRvIG91dHB1dCIsCisJCQlCS0xfUE9XRVJfR1BJTyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X2NsY2RfbW1hcChzdHJ1Y3QgY2xjZF9mYiAqZmIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiBkbWFfbW1hcF93cml0ZWNvbWJpbmUoJmZiLT5kZXYtPmRldiwgdm1hLAorCQlmYi0+ZmIuc2NyZWVuX2Jhc2UsIGZiLT5mYi5maXguc21lbV9zdGFydCwKKwkJZmItPmZiLmZpeC5zbWVtX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIGxwYzMyeHhfY2xjZF9yZW1vdmUoc3RydWN0IGNsY2RfZmIgKmZiKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmZmItPmRldi0+ZGV2LCBmYi0+ZmIuZml4LnNtZW1fbGVuLAorCQlmYi0+ZmIuc2NyZWVuX2Jhc2UsIGZiLT5mYi5maXguc21lbV9zdGFydCk7Cit9CisKKy8qCisgKiBPbiBzb21lIGVhcmx5IExDRCBtb2R1bGVzICgxMzA3LjApLCB0aGUgYmFja2xpZ2h0IGxvZ2ljIGlzIGludmVydGVkLgorICogRm9yIHRob3NlIGJvYXJkIHZhcmlhbnRzLCBzd2FwIHRoZSBkaXNhYmxlIGFuZCBlbmFibGUgc3RhdGVzIGZvcgorICogQktMX1BPV0VSX0dQSU8uCisqLworc3RhdGljIHZvaWQgY2xjZF9kaXNhYmxlKHN0cnVjdCBjbGNkX2ZiICpmYikKK3sKKwlncGlvX3NldF92YWx1ZShCS0xfUE9XRVJfR1BJTywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoTENEX1BPV0VSX0dQSU8sIDApOworfQorCitzdGF0aWMgdm9pZCBjbGNkX2VuYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCit7CisJZ3Bpb19zZXRfdmFsdWUoQktMX1BPV0VSX0dQSU8sIDEpOworCWdwaW9fc2V0X3ZhbHVlKExDRF9QT1dFUl9HUElPLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGNkX2JvYXJkIGxwYzMyeHhfY2xjZF9kYXRhID0geworCS5uYW1lCQk9ICJQaHl0ZWMgTENEIiwKKwkuY2hlY2sJCT0gY2xjZGZiX2NoZWNrLAorCS5kZWNvZGUJCT0gY2xjZGZiX2RlY29kZSwKKwkuZGlzYWJsZQk9IGNsY2RfZGlzYWJsZSwKKwkuZW5hYmxlCQk9IGNsY2RfZW5hYmxlLAorCS5zZXR1cAkJPSBscGMzMnh4X2NsY2Rfc2V0dXAsCisJLm1tYXAJCT0gbHBjMzJ4eF9jbGNkX21tYXAsCisJLnJlbW92ZQkJPSBscGMzMnh4X2NsY2RfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBscGMzMnh4X2NsY2RfZGV2aWNlID0geworCS5kZXYJCQkJPSB7CisJCS5jb2hlcmVudF9kbWFfbWFzawk9IH4wLAorCQkuaW5pdF9uYW1lCQk9ICJkZXY6Y2xjZCIsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZscGMzMnh4X2NsY2RfZGF0YSwKKwl9LAorCS5yZXMJCQkJPSB7CisJCS5zdGFydAkJCT0gTFBDMzJYWF9MQ0RfQkFTRSwKKwkJLmVuZAkJCT0gKExQQzMyWFhfTENEX0JBU0UgKyBTWl80SyAtIDEpLAorCQkuZmxhZ3MJCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLmRtYV9tYXNrCQkJPSB+MCwKKwkuaXJxCQkJCT0ge0lSUV9MUEMzMlhYX0xDRCwgTk9fSVJRfSwKK307CisKKy8qCisgKiBBTUJBIFNTUCAoU1BJKQorICovCitzdGF0aWMgdm9pZCBwaHkzMjUwX3NwaV9jc19zZXQodTMyIGNvbnRyb2wpCit7CisJZ3Bpb19zZXRfdmFsdWUoU1BJMF9DU19HUElPLCAoaW50KSBjb250cm9sKTsKK30KKworc3RhdGljIHN0cnVjdCBwbDAyMl9jb25maWdfY2hpcCBzcGkwX2NoaXBfaW5mbyA9IHsKKwkubGJtCQkJPSBMT09QQkFDS19ESVNBQkxFRCwKKwkuY29tX21vZGUJCT0gSU5URVJSVVBUX1RSQU5TRkVSLAorCS5pZmFjZQkJCT0gU1NQX0lOVEVSRkFDRV9NT1RPUk9MQV9TUEksCisJLmhpZXJhcmNoeQkJPSBTU1BfTUFTVEVSLAorCS5zbGF2ZV90eF9kaXNhYmxlCT0gMCwKKwkuZW5kaWFuX3R4CQk9IFNTUF9UWF9MU0IsCisJLmVuZGlhbl9yeAkJPSBTU1BfUlhfTFNCLAorCS5kYXRhX3NpemUJCT0gU1NQX0RBVEFfQklUU184LAorCS5yeF9sZXZfdHJpZwkJPSBTU1BfUlhfNF9PUl9NT1JFX0VMRU0sCisJLnR4X2xldl90cmlnCQk9IFNTUF9UWF80X09SX01PUkVfRU1QVFlfTE9DLAorCS5jbGtfcGhhc2UJCT0gU1NQX0NMS19GSVJTVF9FREdFLAorCS5jbGtfcG9sCQk9IFNTUF9DTEtfUE9MX0lETEVfTE9XLAorCS5jdHJsX2xlbgkJPSBTU1BfQklUU184LAorCS53YWl0X3N0YXRlCQk9IFNTUF9NV0lSRV9XQUlUX1pFUk8sCisJLmR1cGxleAkJCT0gU1NQX01JQ1JPV0lSRV9DSEFOTkVMX0ZVTExfRFVQTEVYLAorCS5jc19jb250cm9sCQk9IHBoeTMyNTBfc3BpX2NzX3NldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGwwMjJfc3NwX2NvbnRyb2xsZXIgbHBjMzJ4eF9zc3AwX2RhdGEgPSB7CisJLmJ1c19pZAkJCT0gMCwKKwkubnVtX2NoaXBzZWxlY3QJCT0gMSwKKwkuZW5hYmxlX2RtYQkJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBscGMzMnh4X3NzcDBfZGV2aWNlID0geworCS5kZXYJCQkJPSB7CisJCS5jb2hlcmVudF9kbWFfbWFzawk9IH4wLAorCQkuaW5pdF9uYW1lCQk9ICJkZXY6c3NwMCIsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZscGMzMnh4X3NzcDBfZGF0YSwKKwl9LAorCS5yZXMJCQkJPSB7CisJCS5zdGFydAkJCT0gTFBDMzJYWF9TU1AwX0JBU0UsCisJCS5lbmQJCQk9IChMUEMzMlhYX1NTUDBfQkFTRSArIFNaXzRLIC0gMSksCisJCS5mbGFncwkJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuZG1hX21hc2sJCQk9IH4wLAorCS5pcnEJCQkJPSB7SVJRX0xQQzMyWFhfU1NQMCwgTk9fSVJRfSwKK307CisKKy8qIEFUMjUgZHJpdmVyIHJlZ2lzdHJhdGlvbiAqLworc3RhdGljIGludCBfX2luaXQgcGh5MzI1MF9zcGlfYm9hcmRfcmVnaXN0ZXIodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKKwlzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGluZm9bXSA9IHsKKwkJeworCQkJLm1vZGFsaWFzID0gInNwaWRldiIsCisJCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwKKwkJCS5idXNfbnVtID0gMCwKKwkJCS5jaGlwX3NlbGVjdCA9IDAsCisJCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaTBfY2hpcF9pbmZvLAorCQl9LAorCX07CisKKyNlbHNlCisJc3RhdGljIHN0cnVjdCBzcGlfZWVwcm9tIGVlcHJvbSA9IHsKKwkJLm5hbWUgPSAiYXQyNTI1NmEiLAorCQkuYnl0ZV9sZW4gPSAweDgwMDAsCisJCS5wYWdlX3NpemUgPSA2NCwKKwkJLmZsYWdzID0gRUVfQUREUjIsCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gaW5mb1tdID0geworCQl7CisJCQkubW9kYWxpYXMgPSAiYXQyNSIsCisJCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwKKwkJCS5idXNfbnVtID0gMCwKKwkJCS5jaGlwX3NlbGVjdCA9IDAsCisJCQkucGxhdGZvcm1fZGF0YSA9ICZlZXByb20sCisJCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaTBfY2hpcF9pbmZvLAorCQl9LAorCX07CisjZW5kaWYKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oaW5mbywgQVJSQVlfU0laRShpbmZvKSk7Cit9CithcmNoX2luaXRjYWxsKHBoeTMyNTBfc3BpX2JvYXJkX3JlZ2lzdGVyKTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHBoeTMyNTBfaTJjX2JvYXJkX2luZm9bXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTYzIiwgMHg1MSksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgcGh5X2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAibGVkMCIsCisJCS5ncGlvCQkJPSBMRURfR1BJTywKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJoZWFydGJlYXQiLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgbGVkX2RhdGEgPSB7CisJLmxlZHMgPSBwaHlfbGVkcywKKwkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKHBoeV9sZWRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxwYzMyeHhfZ3Bpb19sZWRfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGVkcy1ncGlvIiwKKwkuaWQJCQk9IC0xLAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZsZWRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwaHkzMjUwX2RldnNbXSBfX2luaXRkYXRhID0geworCSZscGMzMnh4X2kyYzBfZGV2aWNlLAorCSZscGMzMnh4X2kyYzFfZGV2aWNlLAorCSZscGMzMnh4X2kyYzJfZGV2aWNlLAorCSZscGMzMnh4X3dhdGNoZG9nX2RldmljZSwKKwkmbHBjMzJ4eF9ncGlvX2xlZF9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlICphbWJhX2RldnNbXSBfX2luaXRkYXRhID0geworCSZscGMzMnh4X2NsY2RfZGV2aWNlLAorCSZscGMzMnh4X3NzcDBfZGV2aWNlLAorfTsKKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGh5MzI1MF9ib2FyZF9pbml0KHZvaWQpCit7CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCWxwYzMyeHhfZ3Bpb19pbml0KCk7CisKKwkvKiBSZWdpc3RlciBHUElPcyB1c2VkIG9uIHRoaXMgYm9hcmQgKi8KKwlpZiAoZ3Bpb19yZXF1ZXN0KFNQSTBfQ1NfR1BJTywgInNwaTAgY3MiKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciByZXF1ZXN0aW5nIGdwaW8gJXUiLAorCQkJU1BJMF9DU19HUElPKTsKKwllbHNlIGlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoU1BJMF9DU19HUElPLCAxKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBzZXR0aW5nIGdwaW8gJXUgdG8gb3V0cHV0IiwKKwkJCVNQSTBfQ1NfR1BJTyk7CisKKwkvKiBTZXR1cCBuZXR3b3JrIGludGVyZmFjZSBmb3IgUk1JSSBtb2RlICovCisJdG1wID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfTUFDQ0xLX0NUUkwpOworCXRtcCAmPSB+TFBDMzJYWF9DTEtQV1JfTUFDQ1RSTF9QSU5TX01TSzsKKwl0bXAgfD0gTFBDMzJYWF9DTEtQV1JfTUFDQ1RSTF9VU0VfUk1JSV9QSU5TOworCV9fcmF3X3dyaXRlbCh0bXAsIExQQzMyWFhfQ0xLUFdSX01BQ0NMS19DVFJMKTsKKworCS8qIFNldHVwIFNMQyBOQU5EIGNvbnRyb2xsZXIgbXV4aW5nICovCisJX19yYXdfd3JpdGVsKExQQzMyWFhfQ0xLUFdSX05BTkRDTEtfU0VMX1NMQywKKwkJTFBDMzJYWF9DTEtQV1JfTkFORF9DTEtfQ1RSTCk7CisKKwkvKiBTZXR1cCBMQ0QgbXV4aW5nIHRvIFJHQjU2NSAqLworCXRtcCA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX0xDRENMS19DVFJMKSAmCisJCX4oTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9MQ0RUWVBFX01TSyB8CisJCUxQQzMyWFhfQ0xLUFdSX0xDRENUUkxfUFNDQUxFX01TSyk7CisJdG1wIHw9IExQQzMyWFhfQ0xLUFdSX0xDRENUUkxfTENEVFlQRV9URlQxNjsKKwlfX3Jhd193cml0ZWwodG1wLCBMUEMzMlhYX0NMS1BXUl9MQ0RDTEtfQ1RSTCk7CisKKwkvKiBTZXQgdXAgSTJDIHB1bGwgbGV2ZWxzICovCisJdG1wID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfSTJDX0NMS19DVFJMKTsKKwl0bXAgfD0gTFBDMzJYWF9DTEtQV1JfSTJDQ0xLX1VTQkkyQ0hJX0RSSVZFIHwKKwkJTFBDMzJYWF9DTEtQV1JfSTJDQ0xLX0kyQzJISV9EUklWRTsKKwlfX3Jhd193cml0ZWwodG1wLCBMUEMzMlhYX0NMS1BXUl9JMkNfQ0xLX0NUUkwpOworCisJLyogRGlzYWJsZSBJckRBIHB1bHNpbmcgc3VwcG9ydCBvbiBVQVJUNiAqLworCXRtcCA9IF9fcmF3X3JlYWRsKExQQzMyWFhfVUFSVENUTF9DVFJMKTsKKwl0bXAgfD0gTFBDMzJYWF9VQVJUX1VBUlQ2X0lSREFNT0RfQllQQVNTOworCV9fcmF3X3dyaXRlbCh0bXAsIExQQzMyWFhfVUFSVENUTF9DVFJMKTsKKworCS8qIEVuYWJsZSBETUEgZm9yIEkyUzEgY2hhbm5lbCAqLworCXRtcCA9IF9fcmF3X3JlYWRsKExQQzMyWFhfQ0xLUFdSX0kyU19DTEtfQ1RSTCk7CisJdG1wID0gTFBDMzJYWF9DTEtQV1JfSTJTQ1RSTF9JMlMxX1VTRV9ETUE7CisJX19yYXdfd3JpdGVsKHRtcCwgTFBDMzJYWF9DTEtQV1JfSTJTX0NMS19DVFJMKTsKKworCWxwYzMyeHhfc2VyaWFsX2luaXQoKTsKKworCS8qCisJICogQU1CQSBwZXJpcGhlcmFsIGNsb2NrcyBuZWVkIHRvIGJlIGVuYWJsZWQgcHJpb3IgdG8gQU1CQSBkZXZpY2UKKwkgKiBkZXRlY3Rpb24gb3IgYSBkYXRhIGZhdWx0IHdpbGwgb2NjdXIsIHNvIGVuYWJsZSB0aGUgY2xvY2tzCisJICogaGVyZS4gSG93ZXZlciwgd2UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlbSBpZiB0aGUgcGVyaXBoZXJhbAorCSAqIGlzbid0IGluY2x1ZGVkIGluIHRoZSBpbWFnZQorCSAqLworI2lmZGVmIENPTkZJR19GQl9BUk1DTENECisJdG1wID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfTENEQ0xLX0NUUkwpOworCV9fcmF3X3dyaXRlbCgodG1wIHwgTFBDMzJYWF9DTEtQV1JfTENEQ1RSTF9DTEtfRU4pLAorCQlMUEMzMlhYX0NMS1BXUl9MQ0RDTEtfQ1RSTCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1BJX1BMMDIyCisJdG1wID0gX19yYXdfcmVhZGwoTFBDMzJYWF9DTEtQV1JfU1NQX0NMS19DVFJMKTsKKwlfX3Jhd193cml0ZWwoKHRtcCB8IExQQzMyWFhfQ0xLUFdSX1NTUENUUkxfU1NQQ0xLMF9FTiksCisJCUxQQzMyWFhfQ0xLUFdSX1NTUF9DTEtfQ1RSTCk7CisjZW5kaWYKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBoeTMyNTBfZGV2cywgQVJSQVlfU0laRShwaHkzMjUwX2RldnMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKKwkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOworCQlhbWJhX2RldmljZV9yZWdpc3RlcihkLCAmaW9tZW1fcmVzb3VyY2UpOworCX0KKworCS8qIFRlc3QgY2xvY2sgbmVlZGVkIGZvciBVREExMzgwIGluaXRpYWwgaW5pdCAqLworCV9fcmF3X3dyaXRlbChMUEMzMlhYX0NMS1BXUl9URVNUQ0xLMl9TRUxfTU9TQyB8CisJCUxQQzMyWFhfQ0xLUFdSX1RFU1RDTEtfVEVTVENMSzJfRU4sCisJCUxQQzMyWFhfQ0xLUFdSX1RFU1RfQ0xLX1NFTCk7CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBwaHkzMjUwX2kyY19ib2FyZF9pbmZvLAorCQlBUlJBWV9TSVpFKHBoeTMyNTBfaTJjX2JvYXJkX2luZm8pKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbHBjMzJ4eF9kaXNwbGF5X3VpZCh2b2lkKQoreworCXUzMiB1aWRbNF07CisKKwlscGMzMnh4X2dldF91aWQodWlkKTsKKworCXByaW50ayhLRVJOX0lORk8gIkxQQzMyWFggdW5pcXVlIElEOiAlMDh4JTA4eCUwOHglMDh4XG4iLAorCQl1aWRbM10sIHVpZFsyXSwgdWlkWzFdLCB1aWRbMF0pOworCisJcmV0dXJuIDE7Cit9CithcmNoX2luaXRjYWxsKGxwYzMyeHhfZGlzcGxheV91aWQpOworCitNQUNISU5FX1NUQVJUKFBIWTMyNTAsICJQaHl0ZWMgMzI1MCBib2FyZCB3aXRoIHRoZSBMUEMzMjUwIE1pY3JvY29udHJvbGxlciIpCisJLyogTWFpbnRhaW5lcjogS2V2aW4gV2VsbHMsIE5YUCBTZW1pY29uZHVjdG9ycyAqLworCS5waHlzX2lvCT0gTFBDMzJYWF9VQVJUNV9CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoSU9fQUREUkVTUyhMUEMzMlhYX1VBUlQ1X0JBU0UpKT4+MTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLm1hcF9pbwkJPSBscGMzMnh4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBscGMzMnh4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmbHBjMzJ4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gcGh5MzI1MF9ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlMmFlZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9wbS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BtLmMKKyAqCisgKiBPcmlnaW5hbCBhdXRob3JzOiBWaXRhbHkgV29vbCwgRG1pdHJ5IENoaWdpcmV2IDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqIE1vZGlmaWVkIGJ5IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworLyoKKyAqIExQQzMyWFggQ1BVIGFuZCBzeXN0ZW0gcG93ZXIgbWFuYWdlbWVudAorICoKKyAqIFRoZSBMQ1AzMlhYIGhhcyB0aHJlZSBDUFUgbW9kZXMgZm9yIGNvbnRyb2xsaW5nIHN5c3RlbSBwb3dlcjogcnVuLAorICogZGlyZWN0LXJ1biwgYW5kIGhhbHQgbW9kZXMuIFdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaGFsdCBhbmQgcnVuIG1vZGVzLAorICogdGhlIENQVSB0cmFuc2lzdGlvbnMgdGhyb3VnaCBkaXJlY3QtcnVuIG1vZGUuIEZvciBMaW51eCwgZGlyZWN0LXJ1bgorICogbW9kZSBpcyBub3QgdXNlZCBpbiBub3JtYWwgb3BlcmF0aW9uLiBIYWx0IG1vZGUgaXMgdXNlZCB3aGVuIHRoZQorICogc3lzdGVtIGlzIGZ1bGx5IHN1c3BlbmRlZC4KKyAqCisgKiBSdW4gbW9kZToKKyAqIFRoZSBBUk0gQ1BVIGNsb2NrIChIQ0xLX1BMTCksIEhDTEsgYnVzIGNsb2NrLCBhbmQgUENMSyBidXMgY2xvY2tzIGFyZQorICogZGVyaXZlZCBmcm9tIHRoZSBIQ0xLIFBMTC4gVGhlIEhDTEsgYW5kIFBDTEsgYnVzIHJhdGVzIGFyZSBkaXZpZGVkIGZyb20KKyAqIHRoZSBIQ0xLX1BMTCByYXRlLiBMaW51eCBydW5zIGluIHRoaXMgbW9kZS4KKyAqCisgKiBEaXJlY3QtcnVuIG1vZGU6CisgKiBUaGUgQVJNIENQVSBjbG9jaywgSENMSyBidXMgY2xvY2ssIGFuZCBQQ0xLIGJ1cyBjbG9ja3MgYXJlIGRyaXZlbiBmcm9tCisgKiBTWVNDTEsuIFNZU0NMSyBpcyB1c3VhbGx5IGFyb3VuZCAxM01IeiwgYnV0IG1heSB2YXJ5IGJhc2VkIG9uIFNZU0NMSworICogc291cmNlIG9yIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1haW4gb3NjaWxsYXRvci4gSW4gdGhpcyBtb2RlLCB0aGUKKyAqIEhDTEtfUExMIGNhbiBiZSBzYWZlbHkgZW5hYmxlZCwgY2hhbmdlZCwgb3IgZGlzYWJsZWQuCisgKgorICogSGFsdCBtb2RlOgorICogU1lTQ0xLIGlzIGdhdGVkIG9mZiBhbmQgdGhlIENQVSBhbmQgc3lzdGVtIGNsb2NrcyBhcmUgaGFsdGVkLgorICogUGVyaXBoZXJhbHMgYmFzZWQgb24gdGhlIDMyS0h6IG9zY2lsbGF0b3IgY2xvY2sgKGllLCBSVEMsIHRvdWNoLAorICoga2V5IHNjYW5uZXIsIGV0Yy4pIHN0aWxsIG9wZXJhdGUgaWYgZW5hYmxlZC4gSW4gdGhpcyBzdGF0ZSwgYW4gZW5hYmxlZAorICogc3lzdGVtIGV2ZW50IChpZSwgR1BJTyBzdGF0ZSBjaGFuZ2UsIFJUQyBtYXRjaCwga2V5IHByZXNzLCBldGMuKSB3aWxsCisgKiB3YWtlIHRoZSBzeXN0ZW0gdXAgYmFjayBpbnRvIGRpcmVjdC1ydW4gbW9kZS4KKyAqCisgKiBEUkFNIHJlZnJlc2gKKyAqIERSQU0gY2xvY2tpbmcgYW5kIHJlZnJlc2ggYXJlIHNsaWdodGx5IGRpZmZlcmVudCBmb3Igc3lzdGVtcyB3aXRoIEREUgorICogRFJBTSBvciByZWd1bGFyIFNEUkFNIGRldmljZXMuIElmIFNEUkFNIGlzIHVzZWQgaW4gdGhlIHN5c3RlbSwgdGhlCisgKiBTRFJBTSB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgaW4gZGlyZWN0LXJ1biBtb2RlLiBJbiBERFIgYmFzZWQgc3lzdGVtcywKKyAqIGEgdHJhbnNpc3Rpb24gdG8gZGlyZWN0LXJ1biBtb2RlIHdpbGwgc3RvcCBhbGwgRERSIGFjY2Vzc2VzIChubyBjbG9ja3MpLgorICogQmVjYXVzZSBvZiB0aGlzLCB0aGUgY29kZSB0byBzd2l0Y2ggcG93ZXIgbW9kZXMgYW5kIHRoZSBjb2RlIHRvIGVudGVyCisgKiBhbmQgZXhpdCBEUkFNIHNlbGYtcmVmcmVzaCBtb2RlcyBtdXN0IG5vdCBiZSBleGVjdXRlZCBpbiBEUkFNLiBBIHNtYWxsCisgKiBzZWN0aW9uIG9mIElSQU0gaXMgdXNlZCBpbnN0ZWFkIGZvciB0aGlzLgorICoKKyAqIFN1c3BlbmQgaXMgaGFuZGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgbG9naWM6CisgKiAgQmFja3VwIGEgc21hbGwgYXJlYSBvZiBJUkFNIHVzZWQgZm9yIHRoZSBzdXNwZW5kIGNvZGUKKyAqICBDb3B5IHN1c3BlbmQgY29kZSB0byBJUkFNCisgKiAgVHJhbnNmZXIgY29udHJvbCB0byBjb2RlIGluIElSQU0KKyAqICBQbGFjZXMgRFJBTXMgaW4gc2VsZi1yZWZyZXNoIG1vZGUKKyAqICBFbnRlciBkaXJlY3QtcnVuIG1vZGUKKyAqICBTYXZlIHN0YXRlIG9mIEhDTEtfUExMIFBMTAorICogIERpc2FibGUgSENMS19QTEwgUExMCisgKiAgRW50ZXIgaGFsdCBtb2RlIC0gQ1BVIGFuZCBidXNlcyB3aWxsIHN0b3AKKyAqICBTeXN0ZW0gZW50ZXJzIGRpcmVjdC1ydW4gbW9kZSB3aGVuIGFuIGVuYWJsZWQgZXZlbnQgb2NjdXJzCisgKiAgSENMSyBQTEwgc3RhdGUgaXMgcmVzdG9yZWQKKyAqICBSdW4gbW9kZSBpcyBlbnRlcmVkCisgKiAgRFJBTVMgYXJlIHBsYWNlZCBiYWNrIGludG8gbm9ybWFsIG1vZGUKKyAqICBDb2RlIGV4ZWN1dGlvbiByZXR1cm5zIGZyb20gSVJBTQorICogIElSQU0gY29kZSBhcmUgdXNlZCBmb3Igc3VzcGVuZCBpcyByZXN0b3JlZAorICogIFN1c3BlbmQgbW9kZSBpcyBleGl0ZWQKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKworI2RlZmluZSBURU1QX0lSQU1fQVJFQSAgSU9fQUREUkVTUyhMUEMzMlhYX0lSQU1fQkFTRSkKKworLyoKKyAqIEJvdGggU1RBTkRCWSBhbmQgTUVNIHN1c3BlbmQgc3RhdGVzIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdpdGggbm8KKyAqIGxvc3Mgb2YgQ1BVIG9yIG1lbW9yeSBzdGF0ZQorICovCitzdGF0aWMgaW50IGxwYzMyeHhfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCWludCAoKmxwYzMyeHhfc3VzcGVuZF9wdHIpICh2b2lkKTsKKwl2b2lkICppcmFtX3N3YXBfYXJlYTsKKworCS8qIEFsbG9jYXRlIHNvbWUgc3BhY2UgZm9yIHRlbXBvcmFyeSBJUkFNIHN0b3JhZ2UgKi8KKwlpcmFtX3N3YXBfYXJlYSA9IGttYWxsb2MobHBjMzJ4eF9zeXNfc3VzcGVuZF9zeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcmFtX3N3YXBfYXJlYSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQTSBTdXNwZW5kOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IHRvIHNhdmUgcG9ydGlvbiAiCisJCQkib2YgU1JBTVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEJhY2t1cCBhIHNtYWxsIGFyZWEgb2YgSVJBTSB1c2VkIGZvciB0aGUgc3VzcGVuZCBjb2RlICovCisJbWVtY3B5KGlyYW1fc3dhcF9hcmVhLCAodm9pZCAqKSBURU1QX0lSQU1fQVJFQSwKKwkJbHBjMzJ4eF9zeXNfc3VzcGVuZF9zeik7CisKKwkvKgorCSAqIENvcHkgY29kZSB0byBzdXNwZW5kIHN5c3RlbSBpbnRvIElSQU0uIFRoZSBzdXNwZW5kIGNvZGUKKwkgKiBuZWVkcyB0byBydW4gZnJvbSBJUkFNIGFzIERSQU0gbWF5IG5vIGxvbmdlciBiZSBhdmFpbGFibGUKKwkgKiB3aGVuIHRoZSBQTEwgaXMgc3RvcHBlZC4KKwkgKi8KKwltZW1jcHkoKHZvaWQgKikgVEVNUF9JUkFNX0FSRUEsICZscGMzMnh4X3N5c19zdXNwZW5kLAorCQlscGMzMnh4X3N5c19zdXNwZW5kX3N6KTsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpVEVNUF9JUkFNX0FSRUEsCisJCSh1bnNpZ25lZCBsb25nKShURU1QX0lSQU1fQVJFQSkgKyBscGMzMnh4X3N5c19zdXNwZW5kX3N6KTsKKworCS8qIFRyYW5zZmVyIHRvIHN1c3BlbmQgY29kZSBpbiBJUkFNICovCisJbHBjMzJ4eF9zdXNwZW5kX3B0ciA9ICh2b2lkICopIFRFTVBfSVJBTV9BUkVBOworCWZsdXNoX2NhY2hlX2FsbCgpOworCSh2b2lkKSBscGMzMnh4X3N1c3BlbmRfcHRyKCk7CisKKwkvKiBSZXN0b3JlIG9yaWdpbmFsIElSQU0gY29udGVudHMgKi8KKwltZW1jcHkoKHZvaWQgKikgVEVNUF9JUkFNX0FSRUEsIGlyYW1fc3dhcF9hcmVhLAorCQlscGMzMnh4X3N5c19zdXNwZW5kX3N6KTsKKworCWtmcmVlKGlyYW1fc3dhcF9hcmVhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGxwYzMyeHhfcG1fb3BzID0geworCS52YWxpZAk9IHN1c3BlbmRfdmFsaWRfb25seV9tZW0sCisJLmVudGVyCT0gbHBjMzJ4eF9wbV9lbnRlciwKK307CisKKyNkZWZpbmUgRU1DX0RZTl9NRU1fQ1RSTF9PRlMgMHgyMAorI2RlZmluZSBFTUNfU1JNTUMgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEVNQ19DVFJMX1JFRyBpb19wMnYoTFBDMzJYWF9FTUNfQkFTRSArIEVNQ19EWU5fTUVNX0NUUkxfT0ZTKQorc3RhdGljIGludCBfX2luaXQgbHBjMzJ4eF9wbV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBTZXR1cCBTRFJBTSBzZWxmLXJlZnJlc2ggY2xvY2sgdG8gYXV0b21hdGljYWxseSBkaXNhYmxlIG8KKwkgKiBzdGFydCBvZiBzZWxmLXJlZnJlc2guIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UuCisJICovCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKEVNQ19DVFJMX1JFRykgfCBFTUNfU1JNTUMsIEVNQ19DVFJMX1JFRyk7CisKKwlzdXNwZW5kX3NldF9vcHMoJmxwYzMyeHhfcG1fb3BzKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChscGMzMnh4X3BtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWNmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvc2VyaWFsLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvc2VyaWFsLmMKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworI2RlZmluZSBMUEMzMlhYX1NVQVJUX0ZJRk9fU0laRQk2NAorCisvKiBTdGFuZGFyZCA4MjUwLzE2NTUwIGNvbXBhdGlibGUgc2VyaWFsIHBvcnRzICovCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9zdGRfcGxhdGZvcm1fZGF0YVtdID0geworI2lmZGVmIENPTkZJR19BUkNIX0xQQzMyWFhfVUFSVDVfU0VMRUNUCisJeworCQkubWVtYmFzZSAgICAgICAgPSBpb19wMnYoTFBDMzJYWF9VQVJUNV9CQVNFKSwKKwkJLm1hcGJhc2UgICAgICAgID0gTFBDMzJYWF9VQVJUNV9CQVNFLAorCQkuaXJxCQk9IElSUV9MUEMzMlhYX1VBUlRfSUlSNSwKKwkJLnVhcnRjbGsJPSBMUEMzMlhYX01BSU5fT1NDX0ZSRVEsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0zMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0JVR0dZX1VBUlQgfAorCQkJCQlVUEZfU0tJUF9URVNULAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9MUEMzMlhYX1VBUlQzX1NFTEVDVAorCXsKKwkJLm1lbWJhc2UJPSBpb19wMnYoTFBDMzJYWF9VQVJUM19CQVNFKSwKKwkJLm1hcGJhc2UgICAgICAgID0gTFBDMzJYWF9VQVJUM19CQVNFLAorCQkuaXJxCQk9IElSUV9MUEMzMlhYX1VBUlRfSUlSMywKKwkJLnVhcnRjbGsJPSBMUEMzMlhYX01BSU5fT1NDX0ZSRVEsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0zMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0JVR0dZX1VBUlQgfAorCQkJCQlVUEZfU0tJUF9URVNULAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9MUEMzMlhYX1VBUlQ0X1NFTEVDVAorCXsKKwkJLm1lbWJhc2UJPSBpb19wMnYoTFBDMzJYWF9VQVJUNF9CQVNFKSwKKwkJLm1hcGJhc2UgICAgICAgID0gTFBDMzJYWF9VQVJUNF9CQVNFLAorCQkuaXJxCQk9IElSUV9MUEMzMlhYX1VBUlRfSUlSNCwKKwkJLnVhcnRjbGsJPSBMUEMzMlhYX01BSU5fT1NDX0ZSRVEsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0zMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0JVR0dZX1VBUlQgfAorCQkJCQlVUEZfU0tJUF9URVNULAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9MUEMzMlhYX1VBUlQ2X1NFTEVDVAorCXsKKwkJLm1lbWJhc2UJPSBpb19wMnYoTFBDMzJYWF9VQVJUNl9CQVNFKSwKKwkJLm1hcGJhc2UgICAgICAgID0gTFBDMzJYWF9VQVJUNl9CQVNFLAorCQkuaXJxCQk9IElSUV9MUEMzMlhYX1VBUlRfSUlSNiwKKwkJLnVhcnRjbGsJPSBMUEMzMlhYX01BSU5fT1NDX0ZSRVEsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0zMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0JVR0dZX1VBUlQgfAorCQkJCQlVUEZfU0tJUF9URVNULAorCX0sCisjZW5kaWYKKwl7IH0sCit9OworCitzdHJ1Y3QgdWFydGluaXQgeworCWNoYXIgKnVhcnRfY2tfbmFtZTsKKwl1MzIgY2tfbW9kZV9tYXNrOworCXZvaWQgX19pb21lbSAqcGRpdl9jbGtfcmVnOworfTsKKworc3RhdGljIHN0cnVjdCB1YXJ0aW5pdCB1YXJ0aW5pdF9kYXRhW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfQVJDSF9MUEMzMlhYX1VBUlQ1X1NFTEVDVAorCXsKKwkJLnVhcnRfY2tfbmFtZSA9ICJ1YXJ0NV9jayIsCisJCS5ja19tb2RlX21hc2sgPQorCQkJTFBDMzJYWF9VQVJUX0NMS01PREVfTE9BRChMUEMzMlhYX1VBUlRfQ0xLTU9ERV9PTiwgNSksCisJCS5wZGl2X2Nsa19yZWcgPSBMUEMzMlhYX0NMS1BXUl9VQVJUNV9DTEtfQ1RSTCwKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfTFBDMzJYWF9VQVJUM19TRUxFQ1QKKwl7CisJCS51YXJ0X2NrX25hbWUgPSAidWFydDNfY2siLAorCQkuY2tfbW9kZV9tYXNrID0KKwkJCUxQQzMyWFhfVUFSVF9DTEtNT0RFX0xPQUQoTFBDMzJYWF9VQVJUX0NMS01PREVfT04sIDMpLAorCQkucGRpdl9jbGtfcmVnID0gTFBDMzJYWF9DTEtQV1JfVUFSVDNfQ0xLX0NUUkwsCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX0xQQzMyWFhfVUFSVDRfU0VMRUNUCisJeworCQkudWFydF9ja19uYW1lID0gInVhcnQ0X2NrIiwKKwkJLmNrX21vZGVfbWFzayA9CisJCQlMUEMzMlhYX1VBUlRfQ0xLTU9ERV9MT0FEKExQQzMyWFhfVUFSVF9DTEtNT0RFX09OLCA0KSwKKwkJLnBkaXZfY2xrX3JlZyA9IExQQzMyWFhfQ0xLUFdSX1VBUlQ0X0NMS19DVFJMLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9MUEMzMlhYX1VBUlQ2X1NFTEVDVAorCXsKKwkJLnVhcnRfY2tfbmFtZSA9ICJ1YXJ0Nl9jayIsCisJCS5ja19tb2RlX21hc2sgPQorCQkJTFBDMzJYWF9VQVJUX0NMS01PREVfTE9BRChMUEMzMlhYX1VBUlRfQ0xLTU9ERV9PTiwgNiksCisJCS5wZGl2X2Nsa19yZWcgPSBMUEMzMlhYX0NMS1BXUl9VQVJUNl9DTEtfQ1RSTCwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfc3RkX3BsYXRmb3JtX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3N0ZF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbHBjMzJ4eF9zZXJpYWxfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJJnNlcmlhbF9zdGRfcGxhdGZvcm1fZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgbHBjMzJ4eF9zZXJpYWxfaW5pdCh2b2lkKQoreworCXUzMiB0bXAsIGNsa21vZGVzID0gMDsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdW5zaWduZWQgaW50IHB1YXJ0OworCWludCBpLCBqOworCisJLyogVUFSVCBjbG9ja3MgYXJlIG9mZiwgbGV0IGNsb2NrIGRyaXZlciBtYW5hZ2UgdGhlbSAqLworCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX0NMS1BXUl9VQVJUX0NMS19DVFJMKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHVhcnRpbml0X2RhdGEpOyBpKyspIHsKKwkJY2xrID0gY2xrX2dldChOVUxMLCB1YXJ0aW5pdF9kYXRhW2ldLnVhcnRfY2tfbmFtZSk7CisJCWlmICghSVNfRVJSKGNsaykpIHsKKwkJCWNsa19lbmFibGUoY2xrKTsKKwkJCXNlcmlhbF9zdGRfcGxhdGZvcm1fZGF0YVtpXS51YXJ0Y2xrID0KKwkJCQljbGtfZ2V0X3JhdGUoY2xrKTsKKwkJfQorCisJCS8qIEZhbGwgYmFjayBvbiBtYWluIG9zYyByYXRlIGlmIGNsb2NrIHJhdGUgcmV0dXJuIGZhaWxzICovCisJCWlmIChzZXJpYWxfc3RkX3BsYXRmb3JtX2RhdGFbaV0udWFydGNsayA9PSAwKQorCQkJc2VyaWFsX3N0ZF9wbGF0Zm9ybV9kYXRhW2ldLnVhcnRjbGsgPQorCQkJCUxQQzMyWFhfTUFJTl9PU0NfRlJFUTsKKworCQkvKiBTZXR1cCBVQVJUIGNsb2NrIG1vZGVzIGZvciBhbGwgVUFSVHMsIGRpc2FibGUgYXV0b2Nsb2NrICovCisJCWNsa21vZGVzIHw9IHVhcnRpbml0X2RhdGFbaV0uY2tfbW9kZV9tYXNrOworCisJCS8qIHByZS1VQVJUIGNsb2NrIGRpdmlkZXIgc2V0IHRvIDEgKi8KKwkJX19yYXdfd3JpdGVsKDB4MDEwMSwgdWFydGluaXRfZGF0YVtpXS5wZGl2X2Nsa19yZWcpOworCX0KKworCS8qIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciBhbGwgVUFSVCBjbG9ja3MgYXJlIHNldHVwICovCisJX19yYXdfd3JpdGVsKGNsa21vZGVzLCBMUEMzMlhYX1VBUlRDVExfQ0xLTU9ERSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodWFydGluaXRfZGF0YSkgLSAxOyBpKyspIHsKKwkJLyogRm9yY2UgYSBmbHVzaCBvZiB0aGUgUlggRklGT3MgdG8gd29yayBhcm91bmQgYSBIVyBidWcgKi8KKwkJcHVhcnQgPSBzZXJpYWxfc3RkX3BsYXRmb3JtX2RhdGFbaV0ubWFwYmFzZTsKKwkJX19yYXdfd3JpdGVsKDB4QzEsIExQQzMyWFhfVUFSVF9JSVJfRkNSKHB1YXJ0KSk7CisJCV9fcmF3X3dyaXRlbCgweDAwLCBMUEMzMlhYX1VBUlRfRExMX0ZJRk8ocHVhcnQpKTsKKwkJaiA9IExQQzMyWFhfU1VBUlRfRklGT19TSVpFOworCQl3aGlsZSAoai0tKQorCQkJdG1wID0gX19yYXdfcmVhZGwoTFBDMzJYWF9VQVJUX0RMTF9GSUZPKHB1YXJ0KSk7CisJCV9fcmF3X3dyaXRlbCgwLCBMUEMzMlhYX1VBUlRfSUlSX0ZDUihwdWFydCkpOworCX0KKworCS8qIERpc2FibGUgVUFSVDUtPlVTQiB0cmFuc3BhcmVudCBtb2RlIG9yIFVTQiB3b24ndCB3b3JrICovCisJdG1wID0gX19yYXdfcmVhZGwoTFBDMzJYWF9VQVJUQ1RMX0NUUkwpOworCXRtcCAmPSB+TFBDMzJYWF9VQVJUX1U1X1JPVVRFX1RPX1VTQjsKKwlfX3Jhd193cml0ZWwodG1wLCBMUEMzMlhYX1VBUlRDVExfQ1RSTCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhscGMzMnh4X3NlcmlhbF9kZXZzLAorCQlBUlJBWV9TSVpFKGxwYzMyeHhfc2VyaWFsX2RldnMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9zdXNwZW5kLlMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvc3VzcGVuZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NGY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvc3VzcGVuZC5TCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L3N1c3BlbmQuUworICoKKyAqIE9yaWdpbmFsIGF1dGhvcnM6IERtaXRyeSBDaGlnaXJldiwgVml0YWx5IFdvb2wgPHNvdXJjZUBtdmlzdGEuY29tPgorICogTW9kaWZpZWQgYnkgS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworLyogVXNpbmcgbmFtZWQgcmVnaXN0ZXIgZGVmaW5lcyBtYWtlcyB0aGUgY29kZSBlYXNpZXIgdG8gZm9sbG93ICovCisjZGVmaW5lIFdPUksxX1JFRwkJCXIwCisjZGVmaW5lIFdPUksyX1JFRwkJCXIxCisjZGVmaW5lIFNBVkVEX0hDTEtfRElWX1JFRwkJcjIKKyNkZWZpbmUgU0FWRURfSENMS19QTExfUkVHCQlyMworI2RlZmluZSBTQVZFRF9EUkFNX0NMS0NUUkxfUkVHCQlyNAorI2RlZmluZSBTQVZFRF9QV1JfQ1RSTF9SRUcJCXI1CisjZGVmaW5lIENMS1BXUkJBU0VfUkVHCQkJcjYKKyNkZWZpbmUgRU1DQkFTRV9SRUcJCQlyNworCisjZGVmaW5lIExQQzMyWFhfRU1DX1NUQVRVU19PRkZTCQkweDA0CisjZGVmaW5lIExQQzMyWFhfRU1DX1NUQVRVU19CVVNZCQkweDEKKyNkZWZpbmUgTFBDMzJYWF9FTUNfU1RBVFVTX1NFTEZfUkZTSAkweDQKKworI2RlZmluZSBMUEMzMlhYX0NMS1BXUl9QV1JfQ1RSTF9PRkZTCTB4NDQKKyNkZWZpbmUgTFBDMzJYWF9DTEtQV1JfSENMS19ESVZfT0ZGUwkweDQwCisjZGVmaW5lIExQQzMyWFhfQ0xLUFdSX0hDTEtQTExfQ1RSTF9PRkZTIDB4NTgKKworI2RlZmluZSBDTEtQV1JfUENMS19ESVZfTUFTSwkJMHhGRkZGRkU3RgorCisJLnRleHQKKworRU5UUlkobHBjMzJ4eF9zeXNfc3VzcGVuZCkKKwlAIFNhdmUgYSBjb3B5IG9mIHRoZSB1c2VkIHJlZ2lzdGVycyBpbiBJUkFNLCByMCBpcyBjb3JydXB0ZWQKKwlhZHIJcjAsIHRtcF9zdGFja19lbmQKKwlzdG1mZAlyMCEsIHtyMyAtIHI3LCBzcCwgbHJ9CisKKwlAIExvYWQgYSBmZXcgY29tbW9uIHJlZ2lzdGVyIGFkZHJlc3NlcworCWFkcglXT1JLMV9SRUcsIHJlZ19iYXNlcworCWxkcglDTEtQV1JCQVNFX1JFRywgW1dPUksxX1JFRywgIzBdCisJbGRyCUVNQ0JBU0VfUkVHLCBbV09SSzFfUkVHLCAjNF0KKworCWxkcglTQVZFRF9QV1JfQ1RSTF9SRUcsIFtDTEtQV1JCQVNFX1JFRyxcCisJCSNMUEMzMlhYX0NMS1BXUl9QV1JfQ1RSTF9PRkZTXQorCW9ycglXT1JLMV9SRUcsIFNBVkVEX1BXUl9DVFJMX1JFRywgI0xQQzMyWFhfQ0xLUFdSX1NEUkFNX1NFTEZfUkZTSAorCisJQCBXYWl0IGZvciBTRFJBTSBidXN5IHN0YXR1cyB0byBnbyBidXN5IGFuZCB0aGVuIGlkbGUKKwlAIFRoaXMgZ3VhcmFudGVlcyBhIHNtYWxsIHdpbmRvd3Mgd2hlcmUgRFJBTSBpc24ndCBidXN5CisxOgorCWxkcglXT1JLMl9SRUcsIFtFTUNCQVNFX1JFRywgI0xQQzMyWFhfRU1DX1NUQVRVU19PRkZTXQorCWFuZAlXT1JLMl9SRUcsIFdPUksyX1JFRywgI0xQQzMyWFhfRU1DX1NUQVRVU19CVVNZCisJY21wCVdPUksyX1JFRywgI0xQQzMyWFhfRU1DX1NUQVRVU19CVVNZCisJYm5lCTFiIEAgQnJhbmNoIHdoaWxlIGlkbGUKKzI6CisJbGRyCVdPUksyX1JFRywgW0VNQ0JBU0VfUkVHLCAjTFBDMzJYWF9FTUNfU1RBVFVTX09GRlNdCisJYW5kCVdPUksyX1JFRywgV09SSzJfUkVHLCAjTFBDMzJYWF9FTUNfU1RBVFVTX0JVU1kKKwljbXAJV09SSzJfUkVHLCAjTFBDMzJYWF9FTUNfU1RBVFVTX0JVU1kKKwliZXEJMmIgQCBCcmFuY2ggdW50aWwgaWRsZQorCisJQCBTZXR1cCBzZWxmLXJlZnJlc2ggd2l0aCBzdXBwb3J0IGZvciBtYW51YWwgZXhpdCBvZgorCUAgc2VsZi1yZWZyZXNoIG1vZGUKKwlzdHIJV09SSzFfUkVHLCBbQ0xLUFdSQkFTRV9SRUcsICNMUEMzMlhYX0NMS1BXUl9QV1JfQ1RSTF9PRkZTXQorCW9ycglXT1JLMl9SRUcsIFdPUksxX1JFRywgI0xQQzMyWFhfQ0xLUFdSX1VQRF9TRFJBTV9TRUxGX1JGU0gKKwlzdHIJV09SSzJfUkVHLCBbQ0xLUFdSQkFTRV9SRUcsICNMUEMzMlhYX0NMS1BXUl9QV1JfQ1RSTF9PRkZTXQorCXN0cglXT1JLMV9SRUcsIFtDTEtQV1JCQVNFX1JFRywgI0xQQzMyWFhfQ0xLUFdSX1BXUl9DVFJMX09GRlNdCisKKwlAIFdhaXQgZm9yIHNlbGYtcmVmcmVzaCBhY2tub3dsZWRnZSwgY2xvY2tzIHRvIHRoZSBEUkFNIGRldmljZQorCUAgd2lsbCBhdXRvbWF0aWNhbGx5IHN0b3Agb24gc3RhcnQgb2Ygc2VsZi1yZWZyZXNoCiszOgorCWxkcglXT1JLMl9SRUcsIFtFTUNCQVNFX1JFRywgI0xQQzMyWFhfRU1DX1NUQVRVU19PRkZTXQorCWFuZAlXT1JLMl9SRUcsIFdPUksyX1JFRywgI0xQQzMyWFhfRU1DX1NUQVRVU19TRUxGX1JGU0gKKwljbXAJV09SSzJfUkVHLCAjTFBDMzJYWF9FTUNfU1RBVFVTX1NFTEZfUkZTSAorCWJuZQkzYiBAIEJyYW5jaCB1bnRpbCBzZWxmLXJlZnJlc2ggbW9kZSBzdGFydHMKKworCUAgRW50ZXIgZGlyZWN0LXJ1biBtb2RlIGZyb20gcnVuIG1vZGUKKwliaWMJV09SSzFfUkVHLCBXT1JLMV9SRUcsICNMUEMzMlhYX0NMS1BXUl9TRUxFQ1RfUlVOX01PREUKKwlzdHIJV09SSzFfUkVHLCBbQ0xLUFdSQkFTRV9SRUcsICNMUEMzMlhYX0NMS1BXUl9QV1JfQ1RSTF9PRkZTXQorCisJQCBTYWZlIGRpc2FibGUgb2YgRFJBTSBjbG9jayBpbiBFTUMgYmxvY2ssIHByZXZlbnRzIEREUiBzeW5jCisJQCBpc3N1ZXMgb24gcmVzdGFydAorCWxkcglTQVZFRF9IQ0xLX0RJVl9SRUcsIFtDTEtQV1JCQVNFX1JFRyxcCisJCSNMUEMzMlhYX0NMS1BXUl9IQ0xLX0RJVl9PRkZTXQorCWFuZAlXT1JLMl9SRUcsIFNBVkVEX0hDTEtfRElWX1JFRywgI0NMS1BXUl9QQ0xLX0RJVl9NQVNLCisJc3RyCVdPUksyX1JFRywgW0NMS1BXUkJBU0VfUkVHLCAjTFBDMzJYWF9DTEtQV1JfSENMS19ESVZfT0ZGU10KKworCUAgU2F2ZSBIQ0xLIFBMTCBzdGF0ZSBhbmQgZGlzYWJsZSBIQ0xLIFBMTAorCWxkcglTQVZFRF9IQ0xLX1BMTF9SRUcsIFtDTEtQV1JCQVNFX1JFRyxcCisJCSNMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0NUUkxfT0ZGU10KKwliaWMJV09SSzJfUkVHLCBTQVZFRF9IQ0xLX1BMTF9SRUcsICNMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX1BPV0VSX1VQCisJc3RyCVdPUksyX1JFRywgW0NMS1BXUkJBU0VfUkVHLCAjTFBDMzJYWF9DTEtQV1JfSENMS1BMTF9DVFJMX09GRlNdCisKKwlAIEVudGVyIHN0b3AgbW9kZSB1bnRpbCBhbiBlbmFibGVkIGV2ZW50IG9jY3VycworCW9ycglXT1JLMV9SRUcsIFdPUksxX1JFRywgI0xQQzMyWFhfQ0xLUFdSX1NUT1BfTU9ERV9DVFJMCisJc3RyCVdPUksxX1JFRywgW0NMS1BXUkJBU0VfUkVHLCAjTFBDMzJYWF9DTEtQV1JfUFdSX0NUUkxfT0ZGU10KKwkucmVwdCA5CisJbm9wCisJLmVuZHIKKworCUAgQ2xlYXIgc3RvcCBzdGF0dXMKKwliaWMJV09SSzFfUkVHLCBXT1JLMV9SRUcsICNMUEMzMlhYX0NMS1BXUl9TVE9QX01PREVfQ1RSTAorCisJQCBSZXN0b3JlIG9yaWdpbmFsIEhDTEsgUExMIHZhbHVlIGFuZCB3YWl0IGZvciBQTEwgbG9jaworCXN0cglTQVZFRF9IQ0xLX1BMTF9SRUcsIFtDTEtQV1JCQVNFX1JFRyxcCisJCSNMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0NUUkxfT0ZGU10KKzQ6CisJbGRyCVdPUksyX1JFRywgW0NMS1BXUkJBU0VfUkVHLCAjTFBDMzJYWF9DTEtQV1JfSENMS1BMTF9DVFJMX09GRlNdCisJYW5kCVdPUksyX1JFRywgV09SSzJfUkVHLCAjTFBDMzJYWF9DTEtQV1JfSENMS1BMTF9QTExfU1RTCisJYm5lCTRiCisKKwlAIFJlLWVudGVyIHJ1biBtb2RlIHdpdGggc2VsZi1yZWZyZXNoIGZsYWcgY2xlYXJlZCwgYnV0IG5vIERSQU0KKwlAIHVwZGF0ZSB5ZXQuIERSQU0gaXMgc3RpbGwgaW4gc2VsZi1yZWZyZXNoCisJc3RyCVNBVkVEX1BXUl9DVFJMX1JFRywgW0NMS1BXUkJBU0VfUkVHLFwKKwkJI0xQQzMyWFhfQ0xLUFdSX1BXUl9DVFJMX09GRlNdCisKKwlAIFJlc3RvcmUgb3JpZ2luYWwgRFJBTSBjbG9jayBtb2RlIHRvIHJlc3RvcmUgRFJBTSBjbG9ja3MKKwlzdHIJU0FWRURfSENMS19ESVZfUkVHLCBbQ0xLUFdSQkFTRV9SRUcsXAorCQkjTFBDMzJYWF9DTEtQV1JfSENMS19ESVZfT0ZGU10KKworCUAgQ2xlYXIgc2VsZi1yZWZyZXNoIG1vZGUKKwlvcnIJV09SSzFfUkVHLCBTQVZFRF9QV1JfQ1RSTF9SRUcsXAorCQkjTFBDMzJYWF9DTEtQV1JfVVBEX1NEUkFNX1NFTEZfUkZTSAorCXN0cglXT1JLMV9SRUcsIFtDTEtQV1JCQVNFX1JFRywgI0xQQzMyWFhfQ0xLUFdSX1BXUl9DVFJMX09GRlNdCisJc3RyCVNBVkVEX1BXUl9DVFJMX1JFRywgW0NMS1BXUkJBU0VfUkVHLFwKKwkJI0xQQzMyWFhfQ0xLUFdSX1BXUl9DVFJMX09GRlNdCisKKwlAIFdhaXQgZm9yIEVNQyB0byBjbGVhciBzZWxmLXJlZnJlc2ggbW9kZQorNToKKwlsZHIJV09SSzJfUkVHLCBbRU1DQkFTRV9SRUcsICNMUEMzMlhYX0VNQ19TVEFUVVNfT0ZGU10KKwlhbmQJV09SSzJfUkVHLCBXT1JLMl9SRUcsICNMUEMzMlhYX0VNQ19TVEFUVVNfU0VMRl9SRlNICisJYm5lCTViIEAgQnJhbmNoIHVudGlsIHNlbGYtcmVmcmVzaCBoYXMgZXhpdGVkCisKKwlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJYWRyCXIwLCB0bXBfc3RhY2sKKwlsZG1mZAlyMCEsIHtyMyAtIHI3LCBzcCwgcGN9CisKK3JlZ19iYXNlczoKKwkubG9uZwlJT19BRERSRVNTKExQQzMyWFhfQ0xLX1BNX0JBU0UpCisJLmxvbmcJSU9fQUREUkVTUyhMUEMzMlhYX0VNQ19CQVNFKQorCit0bXBfc3RhY2s6CisJLmxvbmcJMCwgMCwgMCwgMCwgMCwgMCwgMAordG1wX3N0YWNrX2VuZDoKKworRU5UUlkobHBjMzJ4eF9zeXNfc3VzcGVuZF9zeikKKwkud29yZAkuIC0gbHBjMzJ4eF9zeXNfc3VzcGVuZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBkZDRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3RpbWVyLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvdGltZXIuYworICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGb250eXMgVW5pdmVyc2l0eSBvZiBBcHBsaWVkIFNjaWVuY2VzLCBFaW5kaG92ZW4KKyAqICAgICAgICAgICAgICAgICAgICBFZCBTY2hvdXRlbiA8ZS5zY2hvdXRlbkBmb250eXMubmw+CisgKiAgICAgICAgICAgICAgICAgICAgTGF1cmVucyBUaW1tZXJtYW5zIDxsLnRpbW1lcm1hbnNAZm9udHlzLm5sPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0YXRpYyBjeWNsZV90IGxwYzMyeHhfY2xrc3JjX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlyZXR1cm4gKGN5Y2xlX3QpX19yYXdfcmVhZGwoTENQMzJYWF9USU1FUl9UQyhMUEMzMlhYX1RJTUVSMV9CQVNFKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgbHBjMzJ4eF9jbGtzcmMgPSB7CisJLm5hbWUJPSAibHBjMzJ4eF9jbGtzcmMiLAorCS5zaGlmdAk9IDI0LAorCS5yYXRpbmcJPSAzMDAsCisJLnJlYWQJPSBscGMzMnh4X2Nsa3NyY19yZWFkLAorCS5tYXNrCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCisJLmZsYWdzCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCit9OworCitzdGF0aWMgaW50IGxwYzMyeHhfY2xrZXZ0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKyAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJX19yYXdfd3JpdGVsKExDUDMyWFhfVElNRVJfQ05UUl9UQ1JfUkVTRVQsCisJCUxDUDMyWFhfVElNRVJfVENSKExQQzMyWFhfVElNRVIwX0JBU0UpKTsKKwlfX3Jhd193cml0ZWwoZGVsdGEsIExDUDMyWFhfVElNRVJfUFIoTFBDMzJYWF9USU1FUjBfQkFTRSkpOworCV9fcmF3X3dyaXRlbChMQ1AzMlhYX1RJTUVSX0NOVFJfVENSX0VOLAorCQlMQ1AzMlhYX1RJTUVSX1RDUihMUEMzMlhYX1RJTUVSMF9CQVNFKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHBjMzJ4eF9jbGtldnRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKyAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwkJLyoKKwkJICogRGlzYWJsZSB0aGUgdGltZXIuIFdoZW4gdXNpbmcgb25lc2hvdCwgd2UgbXVzdCBhbHNvCisJCSAqIGRpc2FibGUgdGhlIHRpbWVyIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCBjYWxsIHRvCisJCSAqIHNldF9uZXh0X2V2ZW50KCkuCisJCSAqLworCQlfX3Jhd193cml0ZWwoMCwgTENQMzJYWF9USU1FUl9UQ1IoTFBDMzJYWF9USU1FUjBfQkFTRSkpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGxwYzMyeHhfY2xrZXZ0ID0geworCS5uYW1lCQk9ICJscGMzMnh4X2Nsa2V2dCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkuc2hpZnQJCT0gMzIsCisJLnJhdGluZwkJPSAzMDAsCisJLnNldF9uZXh0X2V2ZW50CT0gbHBjMzJ4eF9jbGtldnRfbmV4dF9ldmVudCwKKwkuc2V0X21vZGUJPSBscGMzMnh4X2Nsa2V2dF9tb2RlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGxwYzMyeHhfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmbHBjMzJ4eF9jbGtldnQ7CisKKwkvKiBDbGVhciBtYXRjaCAqLworCV9fcmF3X3dyaXRlbChMQ1AzMlhYX1RJTUVSX0NOVFJfTVRDSF9CSVQoMCksCisJCUxDUDMyWFhfVElNRVJfSVIoTFBDMzJYWF9USU1FUjBfQkFTRSkpOworCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGxwYzMyeHhfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJMUEMzMlhYIFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKKwkuaGFuZGxlcgk9IGxwYzMyeHhfdGltZXJfaW50ZXJydXB0LAorfTsKKworLyoKKyAqIFRoZSBjbG9jayBtYW5hZ2VtZW50IGRyaXZlciBpc24ndCBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LCBzbyB0aGUKKyAqIGNsb2NrcyBuZWVkIHRvIGJlIGVuYWJsZWQgaGVyZSBtYW51YWxseSBhbmQgdGhlbiB0YWdnZWQgYXMgdXNlZCBpbgorICogdGhlIGNsb2NrIGRyaXZlciBpbml0aWFsaXphdGlvbgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbHBjMzJ4eF90aW1lcl9pbml0KHZvaWQpCit7CisJdTMyIGNsa3JhdGUsIHBsbHJlZzsKKworCS8qIEVuYWJsZSB0aW1lciBjbG9jayAqLworCV9fcmF3X3dyaXRlbChMUEMzMlhYX0NMS1BXUl9UTVJQV01DTEtfVElNRVIwX0VOIHwKKwkJTFBDMzJYWF9DTEtQV1JfVE1SUFdNQ0xLX1RJTUVSMV9FTiwKKwkJTFBDMzJYWF9DTEtQV1JfVElNRVJTX1BXTVNfQ0xLX0NUUkxfMSk7CisKKwkvKgorCSAqIFRoZSBjbG9jayBkcml2ZXIgaXNuJ3QgaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludC4gU28gZGV0ZXJtaW5lIGlmCisJICogdGhlIFNZU0NMSyBpcyBkcml2ZW4gZnJvbSB0aGUgUExMMzk3IG9yIG1haW4gb3NjaWxsYXRvciBhbmQgdGhlbiB1c2UKKwkgKiBpdCB0byBjb21wdXRlIHRoZSBQTEwgZnJlcXVlbmN5IGFuZCB0aGUgUENMSyBkaXZpZGVyIHRvIGdldCB0aGUgYmFzZQorCSAqIHRpbWVyIHJhdGVzLiBUaGlzIHJhdGUgaXMgbmVlZGVkIHRvIGNvbXB1dGUgdGhlIHRpY2sgcmF0ZS4KKwkgKi8KKwlpZiAoY2xrX2lzX3N5c2Nsa19tYWlub3NjKCkgIT0gMCkKKwkJY2xrcmF0ZSA9IExQQzMyWFhfTUFJTl9PU0NfRlJFUTsKKwllbHNlCisJCWNsa3JhdGUgPSAzOTcgKiBMUEMzMlhYX0NMT0NLX09TQ19GUkVROworCisJLyogR2V0IEFSTSBIQ0xLUExMIHJlZ2lzdGVyIGFuZCBjb252ZXJ0IGl0IGludG8gYSBmcmVxdWVuY3kgKi8KKwlwbGxyZWcgPSBfX3Jhd19yZWFkbChMUEMzMlhYX0NMS1BXUl9IQ0xLUExMX0NUUkwpICYgMHgxRkZGRjsKKwljbGtyYXRlID0gY2xrX2dldF9wbGxyYXRlX2Zyb21fcmVnKGNsa3JhdGUsIHBsbHJlZyk7CisKKwkvKiBHZXQgUENMSyBkaXZpZGVyIGFuZCBkaXZpZGUgQVJNIFBMTCBjbG9jayBieSBpdCB0byBnZXQgdGltZXIgcmF0ZSAqLworCWNsa3JhdGUgPSBjbGtyYXRlIC8gY2xrX2dldF9wY2xrX2RpdigpOworCisJLyogSW5pdGlhbCB0aW1lciBzZXR1cCAqLworCV9fcmF3X3dyaXRlbCgwLCBMQ1AzMlhYX1RJTUVSX1RDUihMUEMzMlhYX1RJTUVSMF9CQVNFKSk7CisJX19yYXdfd3JpdGVsKExDUDMyWFhfVElNRVJfQ05UUl9NVENIX0JJVCgwKSwKKwkJTENQMzJYWF9USU1FUl9JUihMUEMzMlhYX1RJTUVSMF9CQVNFKSk7CisJX19yYXdfd3JpdGVsKDEsIExDUDMyWFhfVElNRVJfTVIwKExQQzMyWFhfVElNRVIwX0JBU0UpKTsKKwlfX3Jhd193cml0ZWwoTENQMzJYWF9USU1FUl9DTlRSX01DUl9NVENIKDApIHwKKwkJTENQMzJYWF9USU1FUl9DTlRSX01DUl9TVE9QKDApIHwKKwkJTENQMzJYWF9USU1FUl9DTlRSX01DUl9SRVNFVCgwKSwKKwkJTENQMzJYWF9USU1FUl9NQ1IoTFBDMzJYWF9USU1FUjBfQkFTRSkpOworCisJLyogU2V0dXAgdGljayBpbnRlcnJ1cHQgKi8KKwlzZXR1cF9pcnEoSVJRX0xQQzMyWFhfVElNRVIwLCAmbHBjMzJ4eF90aW1lcl9pcnEpOworCisJLyogU2V0dXAgdGhlIGNsb2NrZXZlbnQgc3RydWN0dXJlLiAqLworCWxwYzMyeHhfY2xrZXZ0Lm11bHQgPSBkaXZfc2MoY2xrcmF0ZSwgTlNFQ19QRVJfU0VDLAorCQlscGMzMnh4X2Nsa2V2dC5zaGlmdCk7CisJbHBjMzJ4eF9jbGtldnQubWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygtMSwKKwkJJmxwYzMyeHhfY2xrZXZ0KTsKKwlscGMzMnh4X2Nsa2V2dC5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDEsCisJCSZscGMzMnh4X2Nsa2V2dCkgKyAxOworCWxwYzMyeHhfY2xrZXZ0LmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmbHBjMzJ4eF9jbGtldnQpOworCisJLyogVXNlIHRpbWVyMSBhcyBjbG9jayBzb3VyY2UuICovCisJX19yYXdfd3JpdGVsKExDUDMyWFhfVElNRVJfQ05UUl9UQ1JfUkVTRVQsCisJCUxDUDMyWFhfVElNRVJfVENSKExQQzMyWFhfVElNRVIxX0JBU0UpKTsKKwlfX3Jhd193cml0ZWwoMCwgTENQMzJYWF9USU1FUl9QUihMUEMzMlhYX1RJTUVSMV9CQVNFKSk7CisJX19yYXdfd3JpdGVsKDAsIExDUDMyWFhfVElNRVJfTUNSKExQQzMyWFhfVElNRVIxX0JBU0UpKTsKKwlfX3Jhd193cml0ZWwoTENQMzJYWF9USU1FUl9DTlRSX1RDUl9FTiwKKwkJTENQMzJYWF9USU1FUl9UQ1IoTFBDMzJYWF9USU1FUjFfQkFTRSkpOworCWxwYzMyeHhfY2xrc3JjLm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KGNsa3JhdGUsCisJCWxwYzMyeHhfY2xrc3JjLnNoaWZ0KTsKKwljbG9ja3NvdXJjZV9yZWdpc3RlcigmbHBjMzJ4eF9jbGtzcmMpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGxwYzMyeHhfdGltZXIgPSB7CisJLmluaXQJCT0gJmxwYzMyeHhfdGltZXJfaW5pdCwKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKaW5kZXggNjY2NzdmMC4uN2ZmODAyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKQEAgLTE1LDcgKzE1LDcgQEAKIG9iai0kKENPTkZJR19NU01fU01EKSArPSBzbWQubyBzbWRfZGVidWcubwogb2JqLSQoQ09ORklHX01TTV9TTUQpICs9IGxhc3RfcmFkaW9fbG9nLm8KIAotb2JqLSQoQ09ORklHX01BQ0hfVFJPVVQpICs9IGJvYXJkLXRyb3V0Lm8gZGV2aWNlcy1tc203eDAwLm8KK29iai0kKENPTkZJR19NQUNIX1RST1VUKSArPSBib2FyZC10cm91dC5vIGJvYXJkLXRyb3V0LWdwaW8ubyBkZXZpY2VzLW1zbTd4MDAubwogb2JqLSQoQ09ORklHX01BQ0hfSEFMSUJVVCkgKz0gYm9hcmQtaGFsaWJ1dC5vIGRldmljZXMtbXNtN3gwMC5vCiBvYmotJChDT05GSUdfQVJDSF9NU003WDMwKSArPSBib2FyZC1tc203eDMwLm8gZGV2aWNlcy1tc203eDMwLm8KIG9iai0kKENPTkZJR19BUkNIX1FTRDhYNTApICs9IGJvYXJkLXFzZDh4NTAubyBkZXZpY2VzLXFzZDh4NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYWNwdWNsb2NrLWFybTExLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9hY3B1Y2xvY2stYXJtMTEuYwppbmRleCBhZjVlODViLi5mMDYwYTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9hY3B1Y2xvY2stYXJtMTEuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9hY3B1Y2xvY2stYXJtMTEuYwpAQCAtOTgsNyArOTgsNyBAQAogCiAvKgogICogQUNQVSBzcGVlZCB0YWJsZS4gQ29tcGxldGUgdGFibGUgaXMgc2hvd24gYnV0IGNlcnRhaW4gc3BlZWRzIGFyZSBjb21tZW50ZWQKLSAqIG91dCB0byBvcHRpbWl6ZWQgc3BlZWQgc3dpdGNoaW5nLiBJbml0YWxpemUgbG9vcHNfcGVyX2ppZmZ5IHRvIDAuCisgKiBvdXQgdG8gb3B0aW1pemVkIHNwZWVkIHN3aXRjaGluZy4gSW5pdGlhbGl6ZSBsb29wc19wZXJfamlmZnkgdG8gMC4KICAqCiAgKiBUYWJsZSBzdGVwcGluZyB1cC9kb3duIGlzIG9wdGltaXplZCBmb3IgMjU2bWh6IGp1bXBzIHdoaWxlIHN0YXlpbmcgb24gdGhlCiAgKiBzYW1lIFBMTC4KQEAgLTQ5NCw3ICs0OTQsNyBAQAogICogQ2xvY2sgZHJpdmVyIGluaXRpYWxpemF0aW9uCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIEluaXRhbGl6ZSB0aGUgbHBqIGZpZWxkIGluIHRoZSBhY3B1X2ZyZXFfdGJsLiAqLworLyogSW5pdGlhbGl6ZSB0aGUgbHBqIGZpZWxkIGluIHRoZSBhY3B1X2ZyZXFfdGJsLiAqLwogc3RhdGljIHZvaWQgX19pbml0IGxwal9pbml0KHZvaWQpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1ncGlvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzZDIxMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LWdwaW8uYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL2dwaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBIUCBMYWJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICJib2FyZC10cm91dC5oIgorCitzdHJ1Y3QgbXNtX2dwaW9fY2hpcCB7CisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCXZvaWQgX19pb21lbQkJKnJlZzsJLyogQmFzZSBvZiByZWdpc3RlciBiYW5rICovCisJdTgJCQlzaGFkb3c7Cit9OworCisjZGVmaW5lIHRvX21zbV9ncGlvX2NoaXAoYykgY29udGFpbmVyX29mKGMsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKQorCitzdGF0aWMgaW50IG1zbV9ncGlvbGliX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9ncGlvID0gdG9fbXNtX2dwaW9fY2hpcChjaGlwKTsKKwl1bnNpZ25lZCBtYXNrID0gMSA8PCBvZmZzZXQ7CisKKwlyZXR1cm4gISEocmVhZGIobXNtX2dwaW8tPnJlZykgJiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9saWJfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2dwaW8gPSB0b19tc21fZ3Bpb19jaGlwKGNoaXApOworCXVuc2lnbmVkIG1hc2sgPSAxIDw8IG9mZnNldDsKKworCWlmICh2YWwpCisJCW1zbV9ncGlvLT5zaGFkb3cgfD0gbWFzazsKKwllbHNlCisJCW1zbV9ncGlvLT5zaGFkb3cgJj0gfm1hc2s7CisKKwl3cml0ZWIobXNtX2dwaW8tPnNoYWRvdywgbXNtX2dwaW8tPnJlZyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9saWJfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIG9mZnNldCkKK3sKKwltc21fZ3Bpb2xpYl9zZXQoY2hpcCwgb2Zmc2V0LCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb2xpYl9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCSB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWwpCit7CisJbXNtX2dwaW9saWJfc2V0KGNoaXAsIG9mZnNldCwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBUUk9VVF9HUElPX0JBTksobmFtZSwgcmVnX251bSwgYmFzZV9ncGlvLCBzaGFkb3dfdmFsKQkJXAorCXsJCQkJCQkJCVwKKwkJLmNoaXAgPSB7CQkJCQkJXAorCQkJLmxhYmVsCQkgID0gbmFtZSwJCQlcCisJCQkuZGlyZWN0aW9uX2lucHV0ICA9IG1zbV9ncGlvbGliX2RpcmVjdGlvbl9pbnB1dCxcCisJCQkuZGlyZWN0aW9uX291dHB1dCA9IG1zbV9ncGlvbGliX2RpcmVjdGlvbl9vdXRwdXQsIFwKKwkJCS5nZXQJCSAgPSBtc21fZ3Bpb2xpYl9nZXQsCQlcCisJCQkuc2V0CQkgID0gbXNtX2dwaW9saWJfc2V0LAkJXAorCQkJLmJhc2UJCSAgPSBiYXNlX2dwaW8sCQkJXAorCQkJLm5ncGlvCQkgID0gOCwJCQkJXAorCQl9LAkJCQkJCQlcCisJCS5yZWcgPSAodm9pZCAqKSByZWdfbnVtICsgVFJPVVRfQ1BMRF9CQVNFLAkJXAorCQkuc2hhZG93ID0gc2hhZG93X3ZhbCwJCQkJCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCBtc21fZ3Bpb19iYW5rc1tdID0geworI2lmIGRlZmluZWQoQ09ORklHX01TTV9ERUJVR19VQVJUMSkKKwkvKiBIMlcgcGlucyA8LT4gVUFSVDEgKi8KKwlUUk9VVF9HUElPX0JBTksoIk1JU0MyIiwgMHgwMCwgICBUUk9VVF9HUElPX01JU0MyX0JBU0UsIDB4NDApLAorI2Vsc2UKKwkvKiBIMlcgcGlucyA8LT4gVUFSVDMsIEJsdWV0b290aCA8LT4gVUFSVDEgKi8KKwlUUk9VVF9HUElPX0JBTksoIk1JU0MyIiwgMHgwMCwgICBUUk9VVF9HUElPX01JU0MyX0JBU0UsIDB4ODApLAorI2VuZGlmCisJLyogSTJDIHB1bGwgKi8KKwlUUk9VVF9HUElPX0JBTksoIk1JU0MzIiwgMHgwMiwgICBUUk9VVF9HUElPX01JU0MzX0JBU0UsIDB4MDQpLAorCVRST1VUX0dQSU9fQkFOSygiTUlTQzQiLCAweDA0LCAgIFRST1VUX0dQSU9fTUlTQzRfQkFTRSwgMCksCisJLyogbW1kaSAzMmsgZW4gKi8KKwlUUk9VVF9HUElPX0JBTksoIk1JU0M1IiwgMHgwNiwgICBUUk9VVF9HUElPX01JU0M1X0JBU0UsIDB4MDQpLAorCVRST1VUX0dQSU9fQkFOSygiSU5UMiIsIDB4MDgsICAgIFRST1VUX0dQSU9fSU5UMl9CQVNFLCAgMCksCisJVFJPVVRfR1BJT19CQU5LKCJNSVNDMSIsIDB4MGEsICAgVFJPVVRfR1BJT19NSVNDMV9CQVNFLCAwKSwKKwlUUk9VVF9HUElPX0JBTksoIlZJUlRVQUwiLCAweDEyLCBUUk9VVF9HUElPX1ZJUlRVQUxfQkFTRSwgMCksCit9OworCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBpbml0IHRvIGVuYWJsZSBHUElPIHBpbiBzdXBwb3J0LgorICovCitpbnQgX19pbml0IHRyb3V0X2luaXRfZ3Bpbyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2dwaW9fYmFua3MpOyBpKyspCisJCWdwaW9jaGlwX2FkZCgmbXNtX2dwaW9fYmFua3NbaV0uY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwodHJvdXRfaW5pdF9ncGlvKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LmMKaW5kZXggZGNhNWE1Zi4uZTY5YTE1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC5jCkBAIC01MCw3ICs1MCw2IEBACiB7CiAJbWktPm5yX2JhbmtzID0gMTsKIAltaS0+YmFua1swXS5zdGFydCA9IFBIWVNfT0ZGU0VUOwotCW1pLT5iYW5rWzBdLm5vZGUgPSBQSFlTX1RPX05JRChQSFlTX09GRlNFVCk7CiAJbWktPmJhbmtbMF0uc2l6ZSA9ICgxMDEqMTAyNCoxMDI0KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LmgKaW5kZXggNGYzNDVhNS4uNjUxODUxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC5oCkBAIC0xLDUgKzEsMTYyIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC5oCisqKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgorKi8KKyNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX01TTV9CT0FSRF9UUk9VVF9ICisjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9NU01fQk9BUkRfVFJPVVRfSAorCisjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgorCisjZGVmaW5lIE1TTV9TTUlfQkFTRQkJMHgwMDAwMDAwMAorI2RlZmluZSBNU01fU01JX1NJWkUJCTB4MDA4MDAwMDAKKworI2RlZmluZSBNU01fRUJJX0JBU0UJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTVNNX0VCSV9TSVpFCQkweDA2ZTAwMDAwCisKKyNkZWZpbmUgTVNNX1BNRU1fR1BVMF9CQVNFCTB4MDAwMDAwMDAKKyNkZWZpbmUgTVNNX1BNRU1fR1BVMF9TSVpFCTB4MDA3MDAwMDAKKworI2RlZmluZSBNU01fUE1FTV9NRFBfQkFTRQkweDAyMDAwMDAwCisjZGVmaW5lIE1TTV9QTUVNX01EUF9TSVpFCTB4MDA4MDAwMDAKKworI2RlZmluZSBNU01fUE1FTV9BRFNQX0JBU0UgICAgICAweDAyODAwMDAwCisjZGVmaW5lIE1TTV9QTUVNX0FEU1BfU0laRQkweDAwODAwMDAwCisKKyNkZWZpbmUgTVNNX1BNRU1fQ0FNRVJBX0JBU0UJMHgwMzAwMDAwMAorI2RlZmluZSBNU01fUE1FTV9DQU1FUkFfU0laRQkweDAwODAwMDAwCisKKyNkZWZpbmUgTVNNX0ZCX0JBU0UJCTB4MDM4MDAwMDAKKyNkZWZpbmUgTVNNX0ZCX1NJWkUJCTB4MDAxMDAwMDAKKworI2RlZmluZSBNU01fTElOVVhfQkFTRQkJTVNNX0VCSV9CQVNFCisjZGVmaW5lIE1TTV9MSU5VWF9TSVpFCQkweDA2NTAwMDAwCisKKyNkZWZpbmUgTVNNX1BNRU1fR1BVMV9TSVpFCTB4ODAwMDAwCisjZGVmaW5lIE1TTV9QTUVNX0dQVTFfQkFTRQkoTVNNX1JBTV9DT05TT0xFX0JBU0UgLSBNU01fUE1FTV9HUFUxX1NJWkUpCisKKyNkZWZpbmUgTVNNX1JBTV9DT05TT0xFX0JBU0UJKE1TTV9FQklfQkFTRSArIDB4NmQwMDAwMCkKKyNkZWZpbmUgTVNNX1JBTV9DT05TT0xFX1NJWkUJKDEyOCAqIFNaXzFLKQorCisjaWYgKE1TTV9GQl9CQVNFICsgTVNNX0ZCX1NJWkUpID49IChNU01fUE1FTV9HUFUxX0JBU0UpCisjZXJyb3IgaW52YWxpZCBtZW1vcnkgbWFwCisjZW5kaWYKKworI2RlZmluZSBERUNMQVJFX01TTV9JT01BUAorI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CisKKyNkZWZpbmUgVFJPVVRfNF9CQUxMX1VQXzAgICAgIDEKKyNkZWZpbmUgVFJPVVRfNF9CQUxMX0xFRlRfMCAgIDE4CisjZGVmaW5lIFRST1VUXzRfQkFMTF9ET1dOXzAgICA1NworI2RlZmluZSBUUk9VVF80X0JBTExfUklHSFRfMCAgOTEKKworI2RlZmluZSBUUk9VVF81X0JBTExfVVBfMCAgICAgOTQKKyNkZWZpbmUgVFJPVVRfNV9CQUxMX0xFRlRfMCAgIDE4CisjZGVmaW5lIFRST1VUXzVfQkFMTF9ET1dOXzAgICA5MAorI2RlZmluZSBUUk9VVF81X0JBTExfUklHSFRfMCAgMTkKKworI2RlZmluZSBUUk9VVF9QT1dFUl9LRVkgICAgIDIwCisKKyNkZWZpbmUgVFJPVVRfNF9UUF9MU19FTiAgICAxOQorI2RlZmluZSBUUk9VVF81X1RQX0xTX0VOICAgIDEKIAogI2RlZmluZSBUUk9VVF9DUExEX0JBU0UgICAweEU4MTAwMDAwCiAjZGVmaW5lIFRST1VUX0NQTERfU1RBUlQgIDB4OTgwMDAwMDAKICNkZWZpbmUgVFJPVVRfQ1BMRF9TSVpFICAgU1pfNEsKIAorI2RlZmluZSBUUk9VVF9HUElPX0NBQkxFX0lOMQkJKDgzKQorI2RlZmluZSBUUk9VVF9HUElPX0NBQkxFX0lOMgkJKDQ5KQorCisjZGVmaW5lIFRST1VUX0dQSU9fU1RBUlQgKDEyOCkKKworI2RlZmluZSBUUk9VVF9HUElPX0lOVF9NQVNLMF9SRUcgICAgICAgICAgICAoMHgwYykKKyNkZWZpbmUgVFJPVVRfR1BJT19JTlRfU1RBVDBfUkVHICAgICAgICAgICAgKDB4MGUpCisjZGVmaW5lIFRST1VUX0dQSU9fSU5UX01BU0sxX1JFRyAgICAgICAgICAgICgweDE0KQorI2RlZmluZSBUUk9VVF9HUElPX0lOVF9TVEFUMV9SRUcgICAgICAgICAgICAoMHgxMCkKKworI2RlZmluZSBUUk9VVF9HUElPX0hBUFRJQ19QV00gICAgICAgICAgICAgICAoMjgpCisjZGVmaW5lIFRST1VUX0dQSU9fUFNfSE9MRCAgICAgICAgICAgICAgICAgICgyNSkKKworI2RlZmluZSBUUk9VVF9HUElPX01JU0MyX0JBU0UgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19TVEFSVCArIDB4MDApCisjZGVmaW5lIFRST1VUX0dQSU9fTUlTQzNfQkFTRSAgICAgICAgICAgICAgIChUUk9VVF9HUElPX1NUQVJUICsgMHgwOCkKKyNkZWZpbmUgVFJPVVRfR1BJT19NSVNDNF9CQVNFICAgICAgICAgICAgICAgKFRST1VUX0dQSU9fU1RBUlQgKyAweDEwKQorI2RlZmluZSBUUk9VVF9HUElPX01JU0M1X0JBU0UgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19TVEFSVCArIDB4MTgpCisjZGVmaW5lIFRST1VUX0dQSU9fSU5UMl9CQVNFICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX1NUQVJUICsgMHgyMCkKKyNkZWZpbmUgVFJPVVRfR1BJT19NSVNDMV9CQVNFICAgICAgICAgICAgICAgKFRST1VUX0dQSU9fU1RBUlQgKyAweDI4KQorI2RlZmluZSBUUk9VVF9HUElPX1ZJUlRVQUxfQkFTRSAgICAgICAgICAgICAoVFJPVVRfR1BJT19TVEFSVCArIDB4MzApCisjZGVmaW5lIFRST1VUX0dQSU9fSU5UNV9CQVNFICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX1NUQVJUICsgMHg0OCkKKworI2RlZmluZSBUUk9VVF9HUElPX0NIQVJHRVJfRU4gICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDMl9CQVNFICsgMCkKKyNkZWZpbmUgVFJPVVRfR1BJT19JU0VUICAgICAgICAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzJfQkFTRSArIDEpCisjZGVmaW5lIFRST1VUX0dQSU9fSDJXX0RBVF9ESVIgICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MyX0JBU0UgKyAyKQorI2RlZmluZSBUUk9VVF9HUElPX0gyV19DTEtfRElSICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDMl9CQVNFICsgMykKKyNkZWZpbmUgVFJPVVRfR1BJT19IMldfREFUX0dQTyAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzJfQkFTRSArIDQpCisjZGVmaW5lIFRST1VUX0dQSU9fSDJXX0NMS19HUE8gICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MyX0JBU0UgKyA1KQorI2RlZmluZSBUUk9VVF9HUElPX0gyV19TRUwwICAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDMl9CQVNFICsgNikKKyNkZWZpbmUgVFJPVVRfR1BJT19IMldfU0VMMSAgICAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzJfQkFTRSArIDcpCisKKyNkZWZpbmUgVFJPVVRfR1BJT19TUE9UTElHSFRfRU4gICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzNfQkFTRSArIDApCisjZGVmaW5lIFRST1VUX0dQSU9fRkxBU0hfRU4gICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MzX0JBU0UgKyAxKQorI2RlZmluZSBUUk9VVF9HUElPX0kyQ19QVUxMICAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDM19CQVNFICsgMikKKyNkZWZpbmUgVFJPVVRfR1BJT19UUF9JMkNfUFVMTCAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzNfQkFTRSArIDMpCisjZGVmaW5lIFRST1VUX0dQSU9fVFBfRU4gICAgICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MzX0JBU0UgKyA0KQorI2RlZmluZSBUUk9VVF9HUElPX0pPR19FTiAgICAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDM19CQVNFICsgNSkKKyNkZWZpbmUgVFJPVVRfR1BJT19VSV9MRURfRU4gICAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzNfQkFTRSArIDYpCisjZGVmaW5lIFRST1VUX0dQSU9fUVRLRVlfTEVEX0VOICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MzX0JBU0UgKyA3KQorCisjZGVmaW5lIFRST1VUX0dQSU9fVkNNX1BXRE4gICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0M0X0JBU0UgKyAwKQorI2RlZmluZSBUUk9VVF9HUElPX1VTQl9IMldfU1cgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDNF9CQVNFICsgMSkKKyNkZWZpbmUgVFJPVVRfR1BJT19DT01QQVNTX1JTVF9OICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzRfQkFTRSArIDIpCisjZGVmaW5lIFRST1VUX0dQSU9fSEFQVElDX0VOX1VQICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0M0X0JBU0UgKyAzKQorI2RlZmluZSBUUk9VVF9HUElPX0hBUFRJQ19FTl9NQUlOICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDNF9CQVNFICsgNCkKKyNkZWZpbmUgVFJPVVRfR1BJT19VU0JfUEhZX1JTVF9OICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzRfQkFTRSArIDUpCisjZGVmaW5lIFRST1VUX0dQSU9fV0lGSV9QQV9SRVNFVFggICAgICAgICAgIChUUk9VVF9HUElPX01JU0M0X0JBU0UgKyA2KQorI2RlZmluZSBUUk9VVF9HUElPX1dJRklfRU4gICAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDNF9CQVNFICsgNykKKworI2RlZmluZSBUUk9VVF9HUElPX0JUXzMyS19FTiAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDNV9CQVNFICsgMCkKKyNkZWZpbmUgVFJPVVRfR1BJT19NQUNfMzJLX0VOICAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzVfQkFTRSArIDEpCisjZGVmaW5lIFRST1VUX0dQSU9fTURESV8zMktfRU4gICAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0M1X0JBU0UgKyAyKQorI2RlZmluZSBUUk9VVF9HUElPX0NPTVBBU1NfMzJLX0VOICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDNV9CQVNFICsgMykKKworI2RlZmluZSBUUk9VVF9HUElPX05BVklfQUNUX04gICAgICAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyAwKQorI2RlZmluZSBUUk9VVF9HUElPX0NPTVBBU1NfSVJRICAgICAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyAxKQorI2RlZmluZSBUUk9VVF9HUElPX1NMSURJTkdfREVUICAgICAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyAyKQorI2RlZmluZSBUUk9VVF9HUElPX0FVRF9IU01JQ19ERVRfTiAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyAzKQorI2RlZmluZSBUUk9VVF9HUElPX1NEX0RPT1JfTiAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyA0KQorI2RlZmluZSBUUk9VVF9HUElPX0NBTV9CVE5fU1RFUDFfTiAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyA1KQorI2RlZmluZSBUUk9VVF9HUElPX0NBTV9CVE5fU1RFUDJfTiAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyA2KQorI2RlZmluZSBUUk9VVF9HUElPX1RQX0FUVF9OICAgICAgICAgICAgICAgICAoVFJPVVRfR1BJT19JTlQyX0JBU0UgKyA3KQorI2RlZmluZSBUUk9VVF9HUElPX0JBTkswX0ZJUlNUX0lOVF9TT1VSQ0UgICAoVFJPVVRfR1BJT19OQVZJX0FDVF9OKQorI2RlZmluZSBUUk9VVF9HUElPX0JBTkswX0xBU1RfSU5UX1NPVVJDRSAgICAoVFJPVVRfR1BJT19UUF9BVFRfTikKKworI2RlZmluZSBUUk9VVF9HUElPX0gyV19EQVRfR1BJICAgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDMV9CQVNFICsgMCkKKyNkZWZpbmUgVFJPVVRfR1BJT19IMldfQ0xLX0dQSSAgICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzFfQkFTRSArIDEpCisjZGVmaW5lIFRST1VUX0dQSU9fQ1BMRDEyOF9WRVJfMCAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MxX0JBU0UgKyA0KQorI2RlZmluZSBUUk9VVF9HUElPX0NQTEQxMjhfVkVSXzEgICAgICAgICAgICAoVFJPVVRfR1BJT19NSVNDMV9CQVNFICsgNSkKKyNkZWZpbmUgVFJPVVRfR1BJT19DUExEMTI4X1ZFUl8yICAgICAgICAgICAgKFRST1VUX0dQSU9fTUlTQzFfQkFTRSArIDYpCisjZGVmaW5lIFRST1VUX0dQSU9fQ1BMRDEyOF9WRVJfMyAgICAgICAgICAgIChUUk9VVF9HUElPX01JU0MxX0JBU0UgKyA3KQorCisjZGVmaW5lIFRST1VUX0dQSU9fU0RNQ19DRF9OICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX1ZJUlRVQUxfQkFTRSArIDApCisjZGVmaW5lIFRST1VUX0dQSU9fRU5EICAgICAgICAgICAgICAgICAgICAgIChUUk9VVF9HUElPX1NETUNfQ0RfTikKKyNkZWZpbmUgVFJPVVRfR1BJT19CQU5LMV9GSVJTVF9JTlRfU09VUkNFICAgKFRST1VUX0dQSU9fU0RNQ19DRF9OKQorI2RlZmluZSBUUk9VVF9HUElPX0JBTksxX0xBU1RfSU5UX1NPVVJDRSAgICAoVFJPVVRfR1BJT19TRE1DX0NEX04pCisKKyNkZWZpbmUgVFJPVVRfR1BJT19WSVJUVUFMX1RPX1JFQUxfT0ZGU0VUIFwKKwkoVFJPVVRfR1BJT19JTlQ1X0JBU0UgLSBUUk9VVF9HUElPX1ZJUlRVQUxfQkFTRSkKKworI2RlZmluZSBUUk9VVF9JTlRfU1RBUlQgKE5SX01TTV9JUlFTICsgTlJfR1BJT19JUlFTKQorI2RlZmluZSBUUk9VVF9JTlRfQkFOSzBfQ09VTlQgKDgpCisjZGVmaW5lIFRST1VUX0lOVF9CQU5LMV9TVEFSVCAoVFJPVVRfSU5UX1NUQVJUICsgVFJPVVRfSU5UX0JBTkswX0NPVU5UKQorI2RlZmluZSBUUk9VVF9JTlRfQkFOSzFfQ09VTlQgKDEpCisjZGVmaW5lIFRST1VUX0lOVF9FTkQgKFRST1VUX0lOVF9TVEFSVCArIFRST1VUX0lOVF9CQU5LMF9DT1VOVCArIFwKKwkJCVRST1VUX0lOVF9CQU5LMV9DT1VOVCAtIDEpCisjZGVmaW5lIFRST1VUX0dQSU9fVE9fSU5UKG4pICgoKG4pIDw9IFRST1VUX0dQSU9fQkFOSzBfTEFTVF9JTlRfU09VUkNFKSA/IFwKKwkoVFJPVVRfSU5UX1NUQVJUIC0gVFJPVVRfR1BJT19CQU5LMF9GSVJTVF9JTlRfU09VUkNFICsgKG4pKSA6IFwKKwkoVFJPVVRfSU5UX0JBTksxX1NUQVJUIC0gVFJPVVRfR1BJT19CQU5LMV9GSVJTVF9JTlRfU09VUkNFICsgKG4pKSkKKworI2RlZmluZSBUUk9VVF9JTlRfVE9fQkFOSyhuKSAoKG4gLSBUUk9VVF9JTlRfU1RBUlQpIC8gVFJPVVRfSU5UX0JBTkswX0NPVU5UKQorI2RlZmluZSBUUk9VVF9JTlRfVE9fTUFTSyhuKSAoMVUgPDwgKChuIC0gVFJPVVRfSU5UX1NUQVJUKSAmIDcpKQorI2RlZmluZSBUUk9VVF9CQU5LX1RPX01BU0tfUkVHKGJhbmspIFwKKwkoYmFuayA/IFRST1VUX0dQSU9fSU5UX01BU0sxX1JFRyA6IFRST1VUX0dQSU9fSU5UX01BU0swX1JFRykKKyNkZWZpbmUgVFJPVVRfQkFOS19UT19TVEFUX1JFRyhiYW5rKSBcCisJKGJhbmsgPyBUUk9VVF9HUElPX0lOVF9TVEFUMV9SRUcgOiBUUk9VVF9HUElPX0lOVF9TVEFUMF9SRUcpCisKKyNlbmRpZiAvKiBHVUFSRCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMjYyYjQ0MS4uODNlNDdjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xNiw2ICsxNiwxMyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01TTV9HUElPX0gKICNkZWZpbmUgX19BU01fQVJDSF9NU01fR1BJT19ICiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisKKyNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUgIF9fZ3Bpb19nZXRfdmFsdWUKKyNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUgIF9fZ3Bpb19zZXRfdmFsdWUKKyNkZWZpbmUgZ3Bpb19jYW5zbGVlcCAgIF9fZ3Bpb19jYW5zbGVlcAorI2RlZmluZSBncGlvX3RvX2lycSAgICAgX19ncGlvX3RvX2lycQorCiAvKioKICAqIHN0cnVjdCBtc21fZ3BpbyAtIEdQSU8gcGluIGRlc2NyaXB0aW9uCiAgKiBAZ3Bpb19jZmcgLSBjb25maWd1cmF0aW9uIGJpdG1hcCwgYXMgcGVyIGdwaW9fdGxtbV9jb25maWcoKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbXgxL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzY2MGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDEvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWlmIEFSQ0hfTVgxCi0KLWNvbW1lbnQgIk1YMSBwbGF0Zm9ybXM6IgotCi1jb25maWcgTUFDSF9NWExBRFMKLQlib29sCi0KLWNvbmZpZyBBUkNIX01YMUFEUwotCWJvb2wgIk1YMUFEUyBwbGF0Zm9ybSIKLQlzZWxlY3QgTUFDSF9NWExBRFMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgTW90b3JvbGEgTVgxQURTL01YTEFEUyBib2FyZHMKLQotY29uZmlnIE1BQ0hfU0NCOTMyOAotCWJvb2wgIlN5bmVydHJvbml4eCBzY2I5MzI4IgotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBhIFN5bmVydHJvbml4eCBzY2I5MzI4IGJvYXJkCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXgxL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJkZGY4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgxL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KLSMKLQotIyBPYmplY3QgZmlsZSBsaXN0cy4KLQotRVhUUkFfQ0ZMQUdTICs9IC1ESU1YX05FRURTX0RFUFJFQ0FURURfU1lNQk9MUwotb2JqLXkJCQkrPSBnZW5lcmljLm8gY2xvY2subyBkZXZpY2VzLm8KLQotIyBTdXBwb3J0IGZvciBDTU9TIHNlbnNvciBpbnRlcmZhY2UKLW9iai0kKENPTkZJR19NWDFfVklERU8pCSs9IGtzeW1fbXgxLm8gbXgxX2NhbWVyYV9maXEubwotCi0jIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKLW9iai0kKENPTkZJR19BUkNIX01YMUFEUykgKz0gbWFjaC1teDFhZHMubwotb2JqLSQoQ09ORklHX01BQ0hfU0NCOTMyOCkgKz0gbWFjaC1zY2I5MzI4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLW14MS9NYWtlZmlsZS5ib290CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQxNDkyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgxL01ha2VmaWxlLmJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSAgIHpyZWxhZGRyLXkJOj0gMHgwODAwODAwMAotcGFyYW1zX3BoeXMteQk6PSAweDA4MDAwMTAwCi1pbml0cmRfcGh5cy15CTo9IDB4MDg4MDAwMDAKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtbXgxL2Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjJkNGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDEvY2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwOCBTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+LCBQZW5ndXRyb25peAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgotCi0jaW5jbHVkZSA8bWFjaC9jbG9jay5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgImNybV9yZWdzLmgiCi0KLXN0YXRpYyBpbnQgX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGludCByZWc7Ci0KLQlyZWcgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOwotCXJlZyB8PSAxIDw8IGNsay0+ZW5hYmxlX3NoaWZ0OwotCV9fcmF3X3dyaXRlbChyZWcsIGNsay0+ZW5hYmxlX3JlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCi0JcmVnID0gX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKLQlyZWcgJj0gfigxIDw8IGNsay0+ZW5hYmxlX3NoaWZ0KTsKLQlfX3Jhd193cml0ZWwocmVnLCBjbGstPmVuYWJsZV9yZWcpOwotfQotCi1zdGF0aWMgaW50IF9jbGtfY2FuX3VzZV9wYXJlbnQoY29uc3Qgc3RydWN0IGNsayAqY2xrX2FycltdLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCSAgICAgICBzdHJ1Y3QgY2xrICpwYXJlbnQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlpZiAocGFyZW50ID09IGNsa19hcnJbaV0pCi0JCQlyZXR1cm4gaTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSwgdW5zaWduZWQgaW50IGxpbWl0KQotewotCWludCBkaXY7Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKLQlpZiAocGFyZW50X3JhdGUgJSByYXRlKQotCQlkaXYrKzsKLQotCWlmIChkaXYgPiBsaW1pdCkKLQkJZGl2ID0gbGltaXQ7Ci0KLQlyZXR1cm4gcGFyZW50X3JhdGUgLyBkaXY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9jbGtfcGFyZW50X3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIGNsay0+cGFyZW50LT5yb3VuZF9yYXRlKGNsay0+cGFyZW50LCByYXRlKTsKLX0KLQotc3RhdGljIGludCBfY2xrX3BhcmVudF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlyZXR1cm4gY2xrLT5wYXJlbnQtPnNldF9yYXRlKGNsay0+cGFyZW50LCByYXRlKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrMTZtX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gMTYwMDAwMDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsazE2bSA9IHsKLQkuZ2V0X3JhdGUgPSBjbGsxNm1fZ2V0X3JhdGUsCi0JLmVuYWJsZSA9IF9jbGtfZW5hYmxlLAotCS5lbmFibGVfcmVnID0gQ0NNX0NTQ1IsCi0JLmVuYWJsZV9zaGlmdCA9IENDTV9DU0NSX09TQ19FTl9TSElGVCwKLQkuZGlzYWJsZSA9IF9jbGtfZGlzYWJsZSwKLX07Ci0KLS8qIGluIEh6ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGszMl9yYXRlOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGszMl9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIGNsazMyX3JhdGU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsazMyID0gewotCS5nZXRfcmF0ZSA9IGNsazMyX2dldF9yYXRlLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrMzJfcHJlbXVsdF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiA1MTI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsazMyX3ByZW11bHQgPSB7Ci0JLnBhcmVudCA9ICZjbGszMiwKLQkuZ2V0X3JhdGUgPSBjbGszMl9wcmVtdWx0X2dldF9yYXRlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGsgKnByZW1fY2xrX2Nsb2Nrc1tdID0gewotCSZjbGszMl9wcmVtdWx0LAotCSZjbGsxNm0sCi19OwotCi1zdGF0aWMgaW50IHByZW1fY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IHJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKLQotCWkgPSBfY2xrX2Nhbl91c2VfcGFyZW50KHByZW1fY2xrX2Nsb2NrcywgQVJSQVlfU0laRShwcmVtX2Nsa19jbG9ja3MpLAotCQkJCXBhcmVudCk7Ci0KLQlzd2l0Y2ggKGkpIHsKLQljYXNlIDA6Ci0JCXJlZyAmPSB+Q0NNX0NTQ1JfU1lTVEVNX1NFTDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyZWcgfD0gQ0NNX0NTQ1JfU1lTVEVNX1NFTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGk7Ci0JfQotCi0JX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHByZW1fY2xrID0gewotCS5zZXRfcGFyZW50ID0gcHJlbV9jbGtfc2V0X3BhcmVudCwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN5c3RlbV9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBteGNfZGVjb2RlX3BsbChfX3Jhd19yZWFkbChDQ01fU1BDVEwwKSwKLQkJCSAgICAgIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkpOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayBzeXN0ZW1fY2xrID0gewotCS5wYXJlbnQgPSAmcHJlbV9jbGssCi0JLmdldF9yYXRlID0gc3lzdGVtX2Nsa19nZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1jdV9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBteGNfZGVjb2RlX3BsbChfX3Jhd19yZWFkbChDQ01fTVBDVEwwKSwKLQkJCSAgICAgIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkpOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayBtY3VfY2xrID0gewotCS5wYXJlbnQgPSAmY2xrMzJfcHJlbXVsdCwKLQkuZ2V0X3JhdGUgPSBtY3VfY2xrX2dldF9yYXRlLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdW5zaWduZWQgbG9uZyBmY2xrID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWlmIChfX3Jhd19yZWFkbChDQ01fQ1NDUikgJiBDQ01fQ1NDUl9QUkVTQykKLQkJZmNsayAvPSAyOwotCi0JcmV0dXJuIGZjbGs7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZjbGsgPSB7Ci0JLnBhcmVudCA9ICZtY3VfY2xrLAotCS5nZXRfcmF0ZSA9IGZjbGtfZ2V0X3JhdGUsCi19OwotCi0vKgotICogIGdldCBoY2xrICggU0RSQU0sIENTSSwgTWVtb3J5IFN0aWNrLCBJMkMsIERNQSApCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gKCgoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpICYKLQkJCUNDTV9DU0NSX0JDTEtfTUFTSykgPj4gQ0NNX0NTQ1JfQkNMS19PRkZTRVQpICsgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlyZXR1cm4gX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShjbGssIHJhdGUsIDE2KTsKLX0KLQotc3RhdGljIGludCBoY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXVuc2lnbmVkIGludCBkaXY7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOwotCi0JcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCi0JZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOwotCi0JaWYgKGRpdiA+IDE2IHx8IGRpdiA8IDEgfHwgKChwYXJlbnRfcmF0ZSAvIGRpdikgIT0gcmF0ZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGl2LS07Ci0KLQlyZWcgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7Ci0JcmVnICY9IH5DQ01fQ1NDUl9CQ0xLX01BU0s7Ci0JcmVnIHw9IGRpdiA8PCBDQ01fQ1NDUl9CQ0xLX09GRlNFVDsKLQlfX3Jhd193cml0ZWwocmVnLCBDQ01fQ1NDUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGsgaGNsayA9IHsKLQkucGFyZW50ID0gJnN5c3RlbV9jbGssCi0JLmdldF9yYXRlID0gaGNsa19nZXRfcmF0ZSwKLQkucm91bmRfcmF0ZSA9IGhjbGtfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUgPSBoY2xrX3NldF9yYXRlLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrNDhtX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9DU0NSKSAmCi0JCQlDQ01fQ1NDUl9VU0JfTUFTSykgPj4gQ0NNX0NTQ1JfVVNCX09GRlNFVCkgKyAxKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrNDhtX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIF9jbGtfc2ltcGxlX3JvdW5kX3JhdGUoY2xrLCByYXRlLCA4KTsKLX0KLQotc3RhdGljIGludCBjbGs0OG1fc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JdW5zaWduZWQgaW50IGRpdjsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7Ci0KLQlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0KLQlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7Ci0KLQlpZiAoZGl2ID4gOCB8fCBkaXYgPCAxIHx8ICgocGFyZW50X3JhdGUgLyBkaXYpICE9IHJhdGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRpdi0tOwotCi0JcmVnID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOwotCXJlZyAmPSB+Q0NNX0NTQ1JfVVNCX01BU0s7Ci0JcmVnIHw9IGRpdiA8PCBDQ01fQ1NDUl9VU0JfT0ZGU0VUOwotCV9fcmF3X3dyaXRlbChyZWcsIENDTV9DU0NSKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayBjbGs0OG0gPSB7Ci0JLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAotCS5nZXRfcmF0ZSA9IGNsazQ4bV9nZXRfcmF0ZSwKLQkucm91bmRfcmF0ZSA9IGNsazQ4bV9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IGNsazQ4bV9zZXRfcmF0ZSwKLX07Ci0KLS8qCi0gKiAgZ2V0IHBlcmlwaGVyYWwgY2xvY2sgMSAoIFVBUlRbMTJdLCBUaW1lclsxMl0sIFBXTSApCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazFfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gKCgoX19yYXdfcmVhZGwoQ0NNX1BDRFIpICYKLQkJCUNDTV9QQ0RSX1BDTEsxX01BU0spID4+IENDTV9QQ0RSX1BDTEsxX09GRlNFVCkgKyAxKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyY2xrMV9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXJldHVybiBfY2xrX3NpbXBsZV9yb3VuZF9yYXRlKGNsaywgcmF0ZSwgMTYpOwotfQotCi1zdGF0aWMgaW50IHBlcmNsazFfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JdW5zaWduZWQgaW50IGRpdjsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7Ci0KLQlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0KLQlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7Ci0KLQlpZiAoZGl2ID4gMTYgfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkaXYtLTsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9QQ0RSKTsKLQlyZWcgJj0gfkNDTV9QQ0RSX1BDTEsxX01BU0s7Ci0JcmVnIHw9IGRpdiA8PCBDQ01fUENEUl9QQ0xLMV9PRkZTRVQ7Ci0JX19yYXdfd3JpdGVsKHJlZywgQ0NNX1BDRFIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgZ2V0IHBlcmlwaGVyYWwgY2xvY2sgMiAoIExDRCwgU0QsIFNQSVsxMl0gKQotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGsyX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9QQ0RSKSAmCi0JCQlDQ01fUENEUl9QQ0xLMl9NQVNLKSA+PiBDQ01fUENEUl9QQ0xLMl9PRkZTRVQpICsgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazJfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlyZXR1cm4gX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShjbGssIHJhdGUsIDE2KTsKLX0KLQotc3RhdGljIGludCBwZXJjbGsyX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXVuc2lnbmVkIGludCBkaXY7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOwotCi0JcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCi0JZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOwotCi0JaWYgKGRpdiA+IDE2IHx8IGRpdiA8IDEgfHwgKChwYXJlbnRfcmF0ZSAvIGRpdikgIT0gcmF0ZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGl2LS07Ci0KLQlyZWcgPSBfX3Jhd19yZWFkbChDQ01fUENEUik7Ci0JcmVnICY9IH5DQ01fUENEUl9QQ0xLMl9NQVNLOwotCXJlZyB8PSBkaXYgPDwgQ0NNX1BDRFJfUENMSzJfT0ZGU0VUOwotCV9fcmF3X3dyaXRlbChyZWcsIENDTV9QQ0RSKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogIGdldCBwZXJpcGhlcmFsIGNsb2NrIDMgKCBTU0kgKQotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGszX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9QQ0RSKSAmCi0JCQlDQ01fUENEUl9QQ0xLM19NQVNLKSA+PiBDQ01fUENEUl9QQ0xLM19PRkZTRVQpICsgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazNfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlyZXR1cm4gX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShjbGssIHJhdGUsIDEyOCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyY2xrM19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBpbnQgZGl2OwotCXVuc2lnbmVkIGludCByZWc7Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKLQotCWlmIChkaXYgPiAxMjggfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkaXYtLTsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9QQ0RSKTsKLQlyZWcgJj0gfkNDTV9QQ0RSX1BDTEszX01BU0s7Ci0JcmVnIHw9IGRpdiA8PCBDQ01fUENEUl9QQ0xLM19PRkZTRVQ7Ci0JX19yYXdfd3JpdGVsKHJlZywgQ0NNX1BDRFIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBlcmNsa1tdID0gewotCXsKLQkJLmlkID0gMCwKLQkJLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAotCQkuZ2V0X3JhdGUgPSBwZXJjbGsxX2dldF9yYXRlLAotCQkucm91bmRfcmF0ZSA9IHBlcmNsazFfcm91bmRfcmF0ZSwKLQkJLnNldF9yYXRlID0gcGVyY2xrMV9zZXRfcmF0ZSwKLQl9LCB7Ci0JCS5pZCA9IDEsCi0JCS5wYXJlbnQgPSAmc3lzdGVtX2NsaywKLQkJLmdldF9yYXRlID0gcGVyY2xrMl9nZXRfcmF0ZSwKLQkJLnJvdW5kX3JhdGUgPSBwZXJjbGsyX3JvdW5kX3JhdGUsCi0JCS5zZXRfcmF0ZSA9IHBlcmNsazJfc2V0X3JhdGUsCi0JfSwgewotCQkuaWQgPSAyLAotCQkucGFyZW50ID0gJnN5c3RlbV9jbGssCi0JCS5nZXRfcmF0ZSA9IHBlcmNsazNfZ2V0X3JhdGUsCi0JCS5yb3VuZF9yYXRlID0gcGVyY2xrM19yb3VuZF9yYXRlLAotCQkuc2V0X3JhdGUgPSBwZXJjbGszX3NldF9yYXRlLAotCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrICpjbGtvX2Nsb2Nrc1tdID0gewotCSZwZXJjbGtbMF0sCi0JJmhjbGssCi0JJmNsazQ4bSwKLQkmY2xrMTZtLAotCSZwcmVtX2NsaywKLQkmZmNsaywKLX07Ci0KLXN0YXRpYyBpbnQgY2xrb19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQotewotCWludCBpOwotCXVuc2lnbmVkIGludCByZWc7Ci0KLQlpID0gX2Nsa19jYW5fdXNlX3BhcmVudChjbGtvX2Nsb2NrcywgQVJSQVlfU0laRShjbGtvX2Nsb2NrcyksIHBhcmVudCk7Ci0JaWYgKGkgPCAwKQotCQlyZXR1cm4gaTsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKSAmIH5DQ01fQ1NDUl9DTEtPX01BU0s7Ci0JcmVnIHw9IGkgPDwgQ0NNX0NTQ1JfQ0xLT19PRkZTRVQ7Ci0JX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOwotCi0JaWYgKGNsa29fY2xvY2tzW2ldLT5zZXRfcmF0ZSAmJiBjbGtvX2Nsb2Nrc1tpXS0+cm91bmRfcmF0ZSkgewotCQljbGstPnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGU7Ci0JCWNsay0+cm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGU7Ci0JfSBlbHNlIHsKLQkJY2xrLT5zZXRfcmF0ZSA9IE5VTEw7Ci0JCWNsay0+cm91bmRfcmF0ZSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa29fY2xrID0gewotCS5zZXRfcGFyZW50ID0gY2xrb19zZXRfcGFyZW50LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZG1hX2NsayA9IHsKLQkucGFyZW50ID0gJmhjbGssCi0JLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAotCS5lbmFibGUgPSBfY2xrX2VuYWJsZSwKLQkuZW5hYmxlX3JlZyA9IFNDTV9HQ0NSLAotCS5lbmFibGVfc2hpZnQgPSBTQ01fR0NDUl9ETUFfQ0xLX0VOX09GRlNFVCwKLQkuZGlzYWJsZSA9IF9jbGtfZGlzYWJsZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNzaV9jbGsgPSB7Ci0JLnBhcmVudCA9ICZoY2xrLAotCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKLQkuZW5hYmxlID0gX2Nsa19lbmFibGUsCi0JLmVuYWJsZV9yZWcgPSBTQ01fR0NDUiwKLQkuZW5hYmxlX3NoaWZ0ID0gU0NNX0dDQ1JfQ1NJX0NMS19FTl9PRkZTRVQsCi0JLmRpc2FibGUgPSBfY2xrX2Rpc2FibGUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWFfY2xrID0gewotCS5wYXJlbnQgPSAmaGNsaywKLQkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCi0JLmVuYWJsZSA9IF9jbGtfZW5hYmxlLAotCS5lbmFibGVfcmVnID0gU0NNX0dDQ1IsCi0JLmVuYWJsZV9zaGlmdCA9IFNDTV9HQ0NSX01NQV9DTEtfRU5fT0ZGU0VULAotCS5kaXNhYmxlID0gX2Nsa19kaXNhYmxlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiZF9jbGsgPSB7Ci0JLnBhcmVudCA9ICZjbGs0OG0sCi0JLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAotCS5lbmFibGUgPSBfY2xrX2VuYWJsZSwKLQkuZW5hYmxlX3JlZyA9IFNDTV9HQ0NSLAotCS5lbmFibGVfc2hpZnQgPSBTQ01fR0NDUl9VU0JEX0NMS19FTl9PRkZTRVQsCi0JLmRpc2FibGUgPSBfY2xrX2Rpc2FibGUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHRfY2xrID0gewotCS5wYXJlbnQgPSAmcGVyY2xrWzBdLAotCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnRfY2xrID0gewotCS5wYXJlbnQgPSAmcGVyY2xrWzBdLAotCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGkyY19jbGsgPSB7Ci0JLnBhcmVudCA9ICZoY2xrLAotCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNwaV9jbGsgPSB7Ci0JLnBhcmVudCA9ICZwZXJjbGtbMV0sCi0JLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2RoY19jbGsgPSB7Ci0JLnBhcmVudCA9ICZwZXJjbGtbMV0sCi0JLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbGNkY19jbGsgPSB7Ci0JLnBhcmVudCA9ICZwZXJjbGtbMV0sCi0JLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbXNoY19jbGsgPSB7Ci0JLnBhcmVudCA9ICZoY2xrLAotCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9jbGsgPSB7Ci0JLnBhcmVudCA9ICZwZXJjbGtbMl0sCi0JLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgcnRjX2NsayA9IHsKLQkucGFyZW50ID0gJmNsazMyLAotfTsKLQotI2RlZmluZSBfUkVHSVNURVJfQ0xPQ0soZCwgbiwgYykgXAotCXsgXAotCQkuZGV2X2lkID0gZCwgXAotCQkuY29uX2lkID0gbiwgXAotCQkuY2xrID0gJmMsIFwKLQl9LAotc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSBfX2luaXRkYXRhID0gewotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZG1hIiwgZG1hX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soIm14MS1jYW1lcmEuMCIsIE5VTEwsIGNzaV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtbWEiLCBtbWFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14X3VkYy4wIiwgTlVMTCwgdXNiZF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMCIsIE5VTEwsIHNwaV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtbW1jLjAiLCBOVUxMLCBzZGhjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1mYi4wIiwgTlVMTCwgbGNkY19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtc2hjIiwgbXNoY19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzc2kiLCBzc2lfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygibXhjX3J0Yy4wIiwgTlVMTCwgcnRjX2NsaykKLX07Ci0KLWludCBfX2luaXQgbXgxX2Nsb2Nrc19pbml0KHVuc2lnbmVkIGxvbmcgZnJlZikKLXsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCi0JLyogZGlzYWJsZSBjbG9ja3Mgd2UgYXJlIGFibGUgdG8gKi8KLQlfX3Jhd193cml0ZWwoMCwgU0NNX0dDQ1IpOwotCi0JY2xrMzJfcmF0ZSA9IGZyZWY7Ci0JcmVnID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOwotCi0JLyogZGV0ZWN0IGNsb2NrIHJlZmVyZW5jZSBmb3Igc3lzdGVtIFBMTCAqLwotCWlmIChyZWcgJiBDQ01fQ1NDUl9TWVNURU1fU0VMKSB7Ci0JCXByZW1fY2xrLnBhcmVudCA9ICZjbGsxNm07Ci0JfSBlbHNlIHsKLQkJLyogZW5zdXJlIHRoYXQgb3NjaWxsYXRvciBpcyBkaXNhYmxlZCAqLwotCQlyZWcgJj0gfigxIDw8IENDTV9DU0NSX09TQ19FTl9TSElGVCk7Ci0JCV9fcmF3X3dyaXRlbChyZWcsIENDTV9DU0NSKTsKLQkJcHJlbV9jbGsucGFyZW50ID0gJmNsazMyX3ByZW11bHQ7Ci0JfQotCi0JLyogZGV0ZWN0IHJlZmVyZW5jZSBmb3IgQ0xLTyAqLwotCXJlZyA9IChyZWcgJiBDQ01fQ1NDUl9DTEtPX01BU0spID4+IENDTV9DU0NSX0NMS09fT0ZGU0VUOwotCWNsa29fY2xrLnBhcmVudCA9IChzdHJ1Y3QgY2xrICopY2xrb19jbG9ja3NbcmVnXTsKLQotCWNsa2Rldl9hZGRfdGFibGUobG9va3VwcywgQVJSQVlfU0laRShsb29rdXBzKSk7Ci0KLQljbGtfZW5hYmxlKCZoY2xrKTsKLQljbGtfZW5hYmxlKCZmY2xrKTsKLQotCW14Y190aW1lcl9pbml0KCZncHRfY2xrLCBJT19BRERSRVNTKFRJTTFfQkFTRV9BRERSKSwgVElNMV9JTlQpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MS9jcm1fcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1teDEvY3JtX3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlODY2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14MS9jcm1fcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwOCBQYXVsaXVzIFphbGVja2FzIDxwYXVsaXVzLnphbGVja2FzQHRlbHRvbmlrYS5sdD4KLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfTVgxX0NSTV9SRUdTX0hfXwotI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfTVgxX0NSTV9SRUdTX0hfXwotCi0jZGVmaW5lIENDTV9CQVNFCUlPX0FERFJFU1MoQ0NNX0JBU0VfQUREUikKLSNkZWZpbmUgU0NNX0JBU0UJSU9fQUREUkVTUyhTQ01fQkFTRV9BRERSKQotCi0vKiBDQ00gcmVnaXN0ZXIgYWRkcmVzc2VzICovCi0jZGVmaW5lIENDTV9DU0NSCShDQ01fQkFTRSArIDB4MCkKLSNkZWZpbmUgQ0NNX01QQ1RMMAkoQ0NNX0JBU0UgKyAweDQpCi0jZGVmaW5lIENDTV9NUENUTDEJKENDTV9CQVNFICsgMHg4KQotI2RlZmluZSBDQ01fU1BDVEwwCShDQ01fQkFTRSArIDB4QykKLSNkZWZpbmUgQ0NNX1NQQ1RMMQkoQ0NNX0JBU0UgKyAweDEwKQotI2RlZmluZSBDQ01fUENEUgkoQ0NNX0JBU0UgKyAweDIwKQotCi0jZGVmaW5lIENDTV9DU0NSX0NMS09fT0ZGU0VUCTI5Ci0jZGVmaW5lIENDTV9DU0NSX0NMS09fTUFTSwkoMHg3IDw8IDI5KQotI2RlZmluZSBDQ01fQ1NDUl9VU0JfT0ZGU0VUCTI2Ci0jZGVmaW5lIENDTV9DU0NSX1VTQl9NQVNLCSgweDcgPDwgMjYpCi0jZGVmaW5lIENDTV9DU0NSX1NQTExfUkVTVEFSVAkoMSA8PCAyMikKLSNkZWZpbmUgQ0NNX0NTQ1JfTVBMTF9SRVNUQVJUCSgxIDw8IDIxKQotI2RlZmluZSBDQ01fQ1NDUl9PU0NfRU5fU0hJRlQJMTcKLSNkZWZpbmUgQ0NNX0NTQ1JfU1lTVEVNX1NFTAkoMSA8PCAxNikKLSNkZWZpbmUgQ0NNX0NTQ1JfQkNMS19PRkZTRVQJMTAKLSNkZWZpbmUgQ0NNX0NTQ1JfQkNMS19NQVNLCSgweEYgPDwgMTApCi0jZGVmaW5lIENDTV9DU0NSX1BSRVNDCQkoMSA8PCAxNSkKLSNkZWZpbmUgQ0NNX0NTQ1JfU1BFTgkJKDEgPDwgMSkKLSNkZWZpbmUgQ0NNX0NTQ1JfTVBFTgkJKDEgPDwgMCkKLQotI2RlZmluZSBDQ01fUENEUl9QQ0xLM19PRkZTRVQJMTYKLSNkZWZpbmUgQ0NNX1BDRFJfUENMSzNfTUFTSwkoMHg3RiA8PCAxNikKLSNkZWZpbmUgQ0NNX1BDRFJfUENMSzJfT0ZGU0VUCTQKLSNkZWZpbmUgQ0NNX1BDRFJfUENMSzJfTUFTSwkoMHhGIDw8IDQpCi0jZGVmaW5lIENDTV9QQ0RSX1BDTEsxX09GRlNFVAkwCi0jZGVmaW5lIENDTV9QQ0RSX1BDTEsxX01BU0sJMHhGCi0KLS8qIFNDTSByZWdpc3RlciBhZGRyZXNzZXMgKi8KLSNkZWZpbmUgU0NNX1NJRFIJKFNDTV9CQVNFICsgMHgwKQotI2RlZmluZSBTQ01fRk1DUgkoU0NNX0JBU0UgKyAweDQpCi0jZGVmaW5lIFNDTV9HUENSCShTQ01fQkFTRSArIDB4OCkKLSNkZWZpbmUgU0NNX0dDQ1IJKFNDTV9CQVNFICsgMHhDKQotCi0jZGVmaW5lIFNDTV9HQ0NSX0RNQV9DTEtfRU5fT0ZGU0VUCTMKLSNkZWZpbmUgU0NNX0dDQ1JfQ1NJX0NMS19FTl9PRkZTRVQJMgotI2RlZmluZSBTQ01fR0NDUl9NTUFfQ0xLX0VOX09GRlNFVAkxCi0jZGVmaW5lIFNDTV9HQ0NSX1VTQkRfQ0xLX0VOX09GRlNFVAkwCi0KLSNlbmRpZiAvKiBfX0FSQ0hfQVJNX01BQ0hfTVgyX0NSTV9SRUdTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDEvZGV2aWNlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmJlMjlkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgxL2RldmljZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IDIwMDggU2FzY2hhIEhhdWVyLCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKLSAqIENvcHlyaWdodCAoYykgMjAwOCBQYXVsaXVzIFphbGVja2FzIDxwYXVsaXVzLnphbGVja2FzQHRlbHRvbmlrYS5sdD4KLSAqIENvcHlyaWdodCAoYykgMjAwOCBEYXJpdXMgQXVndWxpcyA8ZGFyaXVzLmF1Z3VsaXNAdGVsdG9uaWthLmx0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X2NzaV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCAgPSAweDAwMjI0MDAwLAotCQkuZW5kICAgID0gMHgwMDIyNDAxMCwKLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ICA9IENTSV9JTlQsCi0JCS5lbmQgICAgPSBDU0lfSU5ULAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyB1NjQgaW14X2NzaV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9jc2lfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJteDEtY2FtZXJhIiwKLQkuaWQgICAgICAgICAgICAgPSAwLCAvKiBUaGlzIGlzIHVzZWQgdG8gcHV0IGNhbWVyYXMgb24gdGhpcyBpbnRlcmZhY2UgKi8KLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrID0gJmlteF9jc2lfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKLQl9LAotCS5yZXNvdXJjZSAgICAgICA9IGlteF9jc2lfcmVzb3VyY2VzLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14X2NzaV9yZXNvdXJjZXMpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfaTJjX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ICA9IDB4MDAyMTcwMDAsCi0JCS5lbmQgICAgPSAweDAwMjE3MDEwLAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgID0gSTJDX0lOVCwKLQkJLmVuZCAgICA9IEkyQ19JTlQsCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfaTJjX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaW14LWkyYyIsCi0JLmlkICAgICAgICAgICAgID0gMCwKLQkucmVzb3VyY2UgICAgICAgPSBpbXhfaTJjX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGlteF9pMmNfcmVzb3VyY2VzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3VhcnQxX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gVUFSVDFfQkFTRV9BRERSLAotCQkuZW5kCT0gVUFSVDFfQkFTRV9BRERSICsgMHhEMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQJPSBVQVJUMV9NSU5UX1JYLAotCQkuZW5kCT0gVUFSVDFfTUlOVF9SWCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwgewotCQkuc3RhcnQJPSBVQVJUMV9NSU5UX1RYLAotCQkuZW5kCT0gVUFSVDFfTUlOVF9UWCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwgewotCQkuc3RhcnQJPSBVQVJUMV9NSU5UX1JUUywKLQkJLmVuZAk9IFVBUlQxX01JTlRfUlRTLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdWFydDFfZGV2aWNlID0gewotCS5uYW1lCQk9ICJpbXgtdWFydCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGlteF91YXJ0MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGlteF91YXJ0MV9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF91YXJ0Ml9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IFVBUlQyX0JBU0VfQUREUiwKLQkJLmVuZAk9IFVBUlQyX0JBU0VfQUREUiArIDB4RDAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0CT0gVUFSVDJfTUlOVF9SWCwKLQkJLmVuZAk9IFVBUlQyX01JTlRfUlgsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sIHsKLQkJLnN0YXJ0CT0gVUFSVDJfTUlOVF9UWCwKLQkJLmVuZAk9IFVBUlQyX01JTlRfVFgsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sIHsKLQkJLnN0YXJ0CT0gVUFSVDJfTUlOVF9SVFMsCi0JCS5lbmQJPSBVQVJUMl9NSU5UX1JUUywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3VhcnQyX2RldmljZSA9IHsKLQkubmFtZQkJPSAiaW14LXVhcnQiLAotCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpbXhfdWFydDJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBpbXhfdWFydDJfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfcnRjX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ICA9IDB4MDAyMDQwMDAsCi0JCS5lbmQgICAgPSAweDAwMjA0MDI0LAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgID0gUlRDX0lOVCwKLQkJLmVuZCAgICA9IFJUQ19JTlQsCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKLQl9LCB7Ci0JCS5zdGFydCAgPSBSVENfU0FNSU5ULAotCQkuZW5kICAgID0gUlRDX1NBTUlOVCwKLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9ydGNfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJydGMtaW14IiwKLQkuaWQgICAgICAgICAgICAgPSAwLAotCS5yZXNvdXJjZSAgICAgICA9IGlteF9ydGNfcmVzb3VyY2VzLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14X3J0Y19yZXNvdXJjZXMpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfd2R0X3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ICA9IDB4MDAyMDEwMDAsCi0JCS5lbmQgICAgPSAweDAwMjAxMDA4LAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgID0gV0RUX0lOVCwKLQkJLmVuZCAgICA9IFdEVF9JTlQsCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfd2R0X2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaW14LXdkdCIsCi0JLmlkICAgICAgICAgICAgID0gMCwKLQkucmVzb3VyY2UgICAgICAgPSBpbXhfd2R0X3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGlteF93ZHRfcmVzb3VyY2VzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3VzYl9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IDB4MDAyMTIwMDAsCi0JCS5lbmQJPSAweDAwMjEyMTQ4LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IFVTQkRfSU5UMCwKLQkJLmVuZAk9IFVTQkRfSU5UMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwgewotCQkuc3RhcnQJPSBVU0JEX0lOVDEsCi0JCS5lbmQJPSBVU0JEX0lOVDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sIHsKLQkJLnN0YXJ0CT0gVVNCRF9JTlQyLAotCQkuZW5kCT0gVVNCRF9JTlQyLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LCB7Ci0JCS5zdGFydAk9IFVTQkRfSU5UMywKLQkJLmVuZAk9IFVTQkRfSU5UMywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwgewotCQkuc3RhcnQJPSBVU0JEX0lOVDQsCi0JCS5lbmQJPSBVU0JEX0lOVDQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sIHsKLQkJLnN0YXJ0CT0gVVNCRF9JTlQ1LAotCQkuZW5kCT0gVVNCRF9JTlQ1LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LCB7Ci0JCS5zdGFydAk9IFVTQkRfSU5UNiwKLQkJLmVuZAk9IFVTQkRfSU5UNiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3VzYl9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImlteF91ZGMiLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpbXhfdXNiX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gaW14X3VzYl9yZXNvdXJjZXMsCi19OwotCi0vKiBHUElPIHBvcnQgZGVzY3JpcHRpb24gKi8KLXN0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCBpbXhfZ3Bpb19wb3J0c1tdID0gewotCXsKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby0wIiwKLQkJLmJhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhHUElPX0JBU0VfQUREUiksCi0JCS5pcnEgPSBHUElPX0lOVF9QT1JUQSwKLQkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJULAotCX0sIHsKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby0xIiwKLQkJLmJhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhHUElPX0JBU0VfQUREUiArIDB4MTAwKSwKLQkJLmlycSA9IEdQSU9fSU5UX1BPUlRCLAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiwKLQl9LCB7Ci0JCS5jaGlwLmxhYmVsID0gImdwaW8tMiIsCi0JCS5iYXNlID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoR1BJT19CQVNFX0FERFIgKyAweDIwMCksCi0JCS5pcnEgPSBHUElPX0lOVF9QT1JUQywKLQkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgNjQsCi0JfSwgewotCQkuY2hpcC5sYWJlbCA9ICJncGlvLTMiLAotCQkuYmFzZSA9ICh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKEdQSU9fQkFTRV9BRERSICsgMHgzMDApLAotCQkuaXJxID0gR1BJT19JTlRfUE9SVEQsCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDk2LAotCX0KLX07Ci0KLWludCBfX2luaXQgbXhjX3JlZ2lzdGVyX2dwaW9zKHZvaWQpCi17Ci0JcmV0dXJuIG14Y19ncGlvX2luaXQoaW14X2dwaW9fcG9ydHMsIEFSUkFZX1NJWkUoaW14X2dwaW9fcG9ydHMpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgxL2RldmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhNWQ3Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14MS9kZXZpY2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9jc2lfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X2kyY19kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdWFydDFfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3VhcnQyX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9ydGNfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3dkdF9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdXNiX2RldmljZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtbXgxL2dlbmVyaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5ZmMxMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14MS9nZW5lcmljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogIGF1dGhvcjogU2FzY2hhIEhhdWVyCi0gKiAgQ3JlYXRlZDogYXByaWwgMjB0aCwgMjAwNAotICogIENvcHlyaWdodDogU3luZXJ0cm9uaXh4IEdtYkgKLSAqCi0gKiAgQ29tbW9uIGNvZGUgZm9yIGkuTVggbWFjaGluZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGlteF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gSU1YX0lPX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihJTVhfSU9fUEhZUyksCi0JCS5sZW5ndGgJCT0gSU1YX0lPX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0KLX07Ci0KLXZvaWQgX19pbml0IG14MV9tYXBfaW8odm9pZCkKLXsKLQlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgxKTsKLQlteGNfYXJjaF9yZXNldF9pbml0KElPX0FERFJFU1MoV0RUX0JBU0VfQUREUikpOwotCi0JaW90YWJsZV9pbml0KGlteF9pb19kZXNjLCBBUlJBWV9TSVpFKGlteF9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IG14MV9pbml0X2lycSh2b2lkKQotewotCW14Y19pbml0X2lycShJT19BRERSRVNTKEFWSUNfQkFTRV9BRERSKSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL21hY2gtbXgxYWRzLmMgYi9hcmNoL2FybS9tYWNoLW14MS9tYWNoLW14MWFkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYzY2ZkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgxL21hY2gtbXgxYWRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaW14L21hY2gtbXgxYWRzLmMKLSAqCi0gKiBJbml0aWFsbHkgYmFzZWQgb246Ci0gKglsaW51eC0yLjYuNy1pbXgvYXJjaC9hcm0vbWFjaC1pbXgvc2NiOTMyOC5jCi0gKglDb3B5cmlnaHQgKGMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFAc2FzY2hhaGF1ZXIuZGU+Ci0gKgotICogMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2Y4NTd4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MS5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi1zdGF0aWMgaW50IG14MWFkc19waW5zW10gPSB7Ci0JLyogVUFSVDEgKi8KLQlQQzlfUEZfVUFSVDFfQ1RTLAotCVBDMTBfUEZfVUFSVDFfUlRTLAotCVBDMTFfUEZfVUFSVDFfVFhELAotCVBDMTJfUEZfVUFSVDFfUlhELAotCS8qIFVBUlQyICovCi0JUEIyOF9QRl9VQVJUMl9DVFMsCi0JUEIyOV9QRl9VQVJUMl9SVFMsCi0JUEIzMF9QRl9VQVJUMl9UWEQsCi0JUEIzMV9QRl9VQVJUMl9SWEQsCi0JLyogSTJDICovCi0JUEExNV9QRl9JMkNfU0RBLAotCVBBMTZfUEZfSTJDX1NDTCwKLQkvKiBTUEkgKi8KLQlQQzEzX1BGX1NQSTFfU1BJX1JEWSwKLQlQQzE0X1BGX1NQSTFfU0NMSywKLQlQQzE1X1BGX1NQSTFfU1MsCi0JUEMxNl9QRl9TUEkxX01JU08sCi0JUEMxN19QRl9TUEkxX01PU0ksCi19OwotCi0vKgotICogVUFSVHMgcGxhdGZvcm0gZGF0YQotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGFbXSA9IHsKLQl7Ci0JCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi0JfSwgewotCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotCX0sCi19OwotCi0vKgotICogUGh5c21hcCBmbGFzaAotICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG14MWFkc19mbGFzaF9kYXRhID0gewotCS53aWR0aAkJPSA0LAkJLyogYmFua3dpZHRoIGluIGJ5dGVzICovCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAk9IElNWF9DUzBfUEhZUywKLQkuZW5kCT0gSU1YX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZsYXNoX2RldmljZSA9IHsKLQkubmFtZQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJPSAwLAotCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi19OwotCi0vKgotICogSTJDCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNmODU3eF9wbGF0Zm9ybV9kYXRhIHBjZjg1N3hfZGF0YVtdID0gewotCXsKLQkJLmdwaW9fYmFzZSA9IDQgKiAzMiwKLQl9LCB7Ci0JCS5ncGlvX2Jhc2UgPSA0ICogMzIgKyAxNiwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIG14MWFkc19pMmNfZGF0YSA9IHsKLQkuYml0cmF0ZSA9IDEwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXgxYWRzX2kyY19kZXZpY2VzW10gPSB7Ci0JewotCQlJMkNfQk9BUkRfSU5GTygicGNmODU3NSIsIDB4MjIpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZwY2Y4NTd4X2RhdGFbMF0sCi0JfSwgewotCQlJMkNfQk9BUkRfSU5GTygicGNmODU3NSIsIDB4MjQpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZwY2Y4NTd4X2RhdGFbMV0sCi0JfSwKLX07Ci0KLS8qCi0gKiBCb2FyZCBpbml0Ci0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBteDFhZHNfaW5pdCh2b2lkKQotewotCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXgxYWRzX3BpbnMsCi0JCUFSUkFZX1NJWkUobXgxYWRzX3BpbnMpLCAibXgxYWRzIik7Ci0KLQkvKiBVQVJUICovCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmaW14X3VhcnQxX2RldmljZSwgJnVhcnRfcGRhdGFbMF0pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF91YXJ0Ml9kZXZpY2UsICZ1YXJ0X3BkYXRhWzFdKTsKLQotCS8qIFBoeXNtYXAgZmxhc2ggKi8KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZmbGFzaF9kZXZpY2UsICZteDFhZHNfZmxhc2hfZGF0YSk7Ci0KLQkvKiBJMkMgKi8KLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBteDFhZHNfaTJjX2RldmljZXMsCi0JCQkJQVJSQVlfU0laRShteDFhZHNfaTJjX2RldmljZXMpKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF9pMmNfZGV2aWNlLCAmbXgxYWRzX2kyY19kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG14MWFkc190aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgxX2Nsb2Nrc19pbml0KDMyMDAwKTsKLX0KLQotc3RydWN0IHN5c190aW1lciBteDFhZHNfdGltZXIgPSB7Ci0JLmluaXQJPSBteDFhZHNfdGltZXJfaW5pdCwKLX07Ci0KLU1BQ0hJTkVfU1RBUlQoTVgxQURTLCAiRnJlZXNjYWxlIE1YMUFEUyIpCi0JLyogTWFpbnRhaW5lcjogU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCAqLwotCS5waHlzX2lvCT0gSU1YX0lPX1BIWVMsCi0JLmlvX3BnX29mZnN0CT0gKElNWF9JT19CQVNFID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSBNWDFfUEhZU19PRkZTRVQgKyAweDEwMCwKLQkubWFwX2lvCQk9IG14MV9tYXBfaW8sCi0JLmluaXRfaXJxCT0gbXgxX2luaXRfaXJxLAotCS50aW1lcgkJPSAmbXgxYWRzX3RpbWVyLAotCS5pbml0X21hY2hpbmUJPSBteDFhZHNfaW5pdCwKLU1BQ0hJTkVfRU5ECi0KLU1BQ0hJTkVfU1RBUlQoTVhMQURTLCAiRnJlZXNjYWxlIE1YTEFEUyIpCi0JLnBoeXNfaW8JPSBJTVhfSU9fUEhZUywKLQkuaW9fcGdfb2Zmc3QJPSAoSU1YX0lPX0JBU0UgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcwk9IE1YMV9QSFlTX09GRlNFVCArIDB4MTAwLAotCS5tYXBfaW8JCT0gbXgxX21hcF9pbywKLQkuaW5pdF9pcnEJPSBteDFfaW5pdF9pcnEsCi0JLnRpbWVyCQk9ICZteDFhZHNfdGltZXIsCi0JLmluaXRfbWFjaGluZQk9IG14MWFkc19pbml0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL21hY2gtc2NiOTMyOC5jIGIvYXJjaC9hcm0vbWFjaC1teDEvbWFjaC1zY2I5MzI4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODdhN2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDEvbWFjaC1zY2I5MzI4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtbXgxL21hY2gtc2NiOTMyOC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNhc2NoYSBIYXVlciA8c2FzY2hhaGF1ZXJAd2ViLmRlPgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggSnVlcmdlbiBCZWlzZXJ0IDxqYmVpc2VydEBuZXRzY2FwZS5uZXQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG05MDAwLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC1teDEuaD4KLQotI2luY2x1ZGUgImRldmljZXMuaCIKLQotLyoKLSAqIFRoaXMgc2NiOTMyOCBoYXMgYSAzMk1pQiBmbGFzaAotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAk9IElNWF9DUzBfUEhZUywKLQkuZW5kCT0gSU1YX0NTMF9QSFlTICsgKDMyICogMTAyNCAqIDEwMjQpIC0gMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHNjYl9mbGFzaF9kYXRhID0gewotCS53aWR0aCAgPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NiX2ZsYXNoX2RldmljZSA9IHsKLQkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCQk9IDAsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmc2NiX2ZsYXNoX2RhdGEsCi0JfSwKLQkucmVzb3VyY2UgPSAmZmxhc2hfcmVzb3VyY2UsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotfTsKLQotLyoKLSAqIHNjYjkzMjggaGFzIGEgRE05MDAwIG5ldHdvcmsgY29udHJvbGxlcgotICogY29ubmVjdGVkIHRvIENTNSwgd2l0aCAxNiBiaXQgZGF0YSBwYXRoCi0gKiBhbmQgaW50ZXJydXB0IGNvbm5lY3RlZCB0byBHUElPIDMKLSAqLwotCi0vKgotICogaW50ZXJuYWwgZGF0YXBhdGggaXMgZml4ZWQgMTYgYml0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgZG05MDAwX3BsYXRfZGF0YSBkbTkwMDBfcGxhdGRhdGEgPSB7Ci0JLmZsYWdzCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWSwKLX07Ci0KLS8qCi0gKiB0aGUgRE05MDAwIGRyaXZlcnMgd2FudHMgdHdvIGRlZmluZWQgYWRkcmVzcyBzcGFjZXMKLSAqIHRvIGdhaW4gYWNjZXNzIHRvIGFkZHJlc3MgbGF0Y2ggcmVnaXN0ZXJzIGFuZCB0aGUgZGF0YSBwYXRoLgotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGRtOTAwMHhfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkubmFtZQk9ICJhZGRyZXNzIGFyZWEiLAotCQkuc3RhcnQJPSBJTVhfQ1M1X1BIWVMsCi0JCS5lbmQJPSBJTVhfQ1M1X1BIWVMgKyAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJLyogYWRkcmVzcyBhY2Nlc3MgKi8KLQl9LCB7Ci0JCS5uYW1lCT0gImRhdGEgYXJlYSIsCi0JCS5zdGFydAk9IElNWF9DUzVfUEhZUyArIDQsCi0JCS5lbmQJPSBJTVhfQ1M1X1BIWVMgKyA1LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJLyogZGF0YSBhY2Nlc3MgKi8KLQl9LCB7Ci0JCS5zdGFydAk9IElSUV9HUElPQygzKSwKLQkJLmVuZAk9IElSUV9HUElPQygzKSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZG05MDAweF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImRtOTAwMCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRtOTAwMHhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBkbTkwMDB4X3Jlc291cmNlcywKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmZG05MDAwX3BsYXRkYXRhLAotCX0KLX07Ci0KLXN0YXRpYyBpbnQgbXhjX3VhcnQxX3BpbnNbXSA9IHsKLQlQQzlfUEZfVUFSVDFfQ1RTLAotCVBDMTBfUEZfVUFSVDFfUlRTLAotCVBDMTFfUEZfVUFSVDFfVFhELAotCVBDMTJfUEZfVUFSVDFfUlhELAotfTsKLQotc3RhdGljIGludCB1YXJ0MV9teGNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0MV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucyksICJVQVJUMSIpOwotfQotCi1zdGF0aWMgaW50IHVhcnQxX214Y19leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y191YXJ0MV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0gewotCS5pbml0ID0gdWFydDFfbXhjX2luaXQsCi0JLmV4aXQgPSB1YXJ0MV9teGNfZXhpdCwKLQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZzY2JfZmxhc2hfZGV2aWNlLAotCSZkbTkwMDB4X2RldmljZSwKLX07Ci0KLS8qCi0gKiBzY2I5MzI4X2luaXQgLSBJbml0IHRoZSBDUFUgY2FyZCBpdHNlbGYKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNjYjkzMjhfaW5pdCh2b2lkKQotewotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF91YXJ0MV9kZXZpY2UsICZ1YXJ0X3BkYXRhKTsKLQotCXByaW50ayhLRVJOX0lORk8iU2NiOTMyODogQWRkaW5nIGRldmljZXNcbiIpOwotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NiOTMyOF90aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgxX2Nsb2Nrc19pbml0KDMyMDAwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgc2NiOTMyOF90aW1lciA9IHsKLQkuaW5pdAk9IHNjYjkzMjhfdGltZXJfaW5pdCwKLX07Ci0KLU1BQ0hJTkVfU1RBUlQoU0NCOTMyOCwgIlN5bmVydHJvbml4eCBzY2I5MzI4IikKLSAgICAvKiBTYXNjaGEgSGF1ZXIgKi8KLQkucGh5c19pbwk9IDB4MDAyMDAwMDAsCi0JLmlvX3BnX29mZnN0CT0gKCgweGUwMjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwODAwMDEwMCwKLQkubWFwX2lvCQk9IG14MV9tYXBfaW8sCi0JLmluaXRfaXJxCT0gbXgxX2luaXRfaXJxLAotCS50aW1lcgkJPSAmc2NiOTMyOF90aW1lciwKLQkuaW5pdF9tYWNoaW5lCT0gc2NiOTMyOF9pbml0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW14Mi9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDJmZDRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotaWYgQVJDSF9NWDIKLQotY2hvaWNlCi0JcHJvbXB0ICJDUFVzOiIKLQlkZWZhdWx0IE1BQ0hfTVgyMQotCi1jb25maWcgTUFDSF9NWDIxCi0JYm9vbCAiaS5NWDIxIHN1cHBvcnQiCi0Jc2VsZWN0IEFSQ0hfTVhDX0FVRE1VWF9WMQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUncyBNWDIgYmFzZWQgaS5NWDIxIHByb2Nlc3Nvci4KLQotY29uZmlnIE1BQ0hfTVgyNwotCWJvb2wgImkuTVgyNyBzdXBwb3J0IgotCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjEKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgRnJlZXNjYWxlJ3MgTVgyIGJhc2VkIGkuTVgyNyBwcm9jZXNzb3IuCi0KLWVuZGNob2ljZQotCi1jb21tZW50ICJNWDIgcGxhdGZvcm1zOiIKLQotY29uZmlnIE1BQ0hfTVgyMUFEUwotCWJvb2wgIk1YMjFBRFMgcGxhdGZvcm0iCi0JZGVwZW5kcyBvbiBNQUNIX01YMjEKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMjFBRFMgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKLQkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KLQotY29uZmlnIE1BQ0hfTVgyN0FEUwotCWJvb2wgIk1YMjdBRFMgcGxhdGZvcm0iCi0JZGVwZW5kcyBvbiBNQUNIX01YMjcKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMjdBRFMgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKLQkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KLQotY29uZmlnIE1BQ0hfUENNMDM4Ci0JYm9vbCAiUGh5dGVjIHBoeUNPUkUtaS5NWDI3IENQVSBtb2R1bGUgKHBjbTAzOCkiCi0JZGVwZW5kcyBvbiBNQUNIX01YMjcKLQlzZWxlY3QgTVhDX1VMUEkgaWYgVVNCX1VMUEkKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgZm9yIHBoeUNPUkUtaS5NWDI3IChha2EgcGNtMDM4KSBwbGF0Zm9ybS4gVGhpcwotCSAgaW5jbHVkZXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIGl0cyBwZXJpcGhlcmFscy4KLQotY2hvaWNlCi0JcHJvbXB0ICJCYXNlYm9hcmQiCi0JZGVwZW5kcyBvbiBNQUNIX1BDTTAzOAotCWRlZmF1bHQgTUFDSF9QQ005NzBfQkFTRUJPQVJECi0KLWNvbmZpZyBNQUNIX1BDTTk3MF9CQVNFQk9BUkQKLQlwcm9tcHQgIlBIWVRFQyBQQ005NzAgZGV2ZWxvcG1lbnQgYm9hcmQiCi0JYm9vbAotCWhlbHAKLQkgIFRoaXMgYWRkcyBib2FyZCBzcGVjaWZpYyBkZXZpY2VzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIFBoeXRlYydzCi0JICBQQ005NzAgZXZhbHVhdGlvbiBib2FyZC4KLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBNQUNIX0NQVUlNWDI3Ci0JYm9vbCAiRXVrcmVhIENQVUlNWDI3IG1vZHVsZSIKLQlkZXBlbmRzIG9uIE1BQ0hfTVgyNwotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgRXVrcmVhIENQVUlNWDI3IHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzCi0JICBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3IgdGhlIG1vZHVsZSBhbmQgaXRzIHBlcmlwaGVyYWxzLgotCi1jb25maWcgTUFDSF9FVUtSRUFfQ1BVSU1YMjdfVVNFU0RIQzIKLQlib29sICJDUFVJTVgyNyBpbnRlZ3JhdGVzIFNESEMyIG1vZHVsZSIKLQlkZXBlbmRzIG9uIE1BQ0hfQ1BVSU1YMjcKLQloZWxwCi0JICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGludGVybmFsIFNESEMyIHVzZWQgb24gQ1BVSU1YMjcgdXNlZAotCSAgZm9yIHdpZmkgb3IgZU1NQy4KLQotY2hvaWNlCi0JcHJvbXB0ICJCYXNlYm9hcmQiCi0JZGVwZW5kcyBvbiBNQUNIX0NQVUlNWDI3Ci0JZGVmYXVsdCBNQUNIX0VVS1JFQV9NQklNWDI3X0JBU0VCT0FSRAotCi1jb25maWcgTUFDSF9FVUtSRUFfTUJJTVgyN19CQVNFQk9BUkQKLQlwcm9tcHQgIkV1a3JlYSBNQklNWDI3IGRldmVsb3BtZW50IGJvYXJkIgotCWJvb2wKLQloZWxwCi0JICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBFdWtyZWEncwotCSAgTUJJTVgyNyBldmFsdWF0aW9uIGJvYXJkLgotCi1lbmRjaG9pY2UKLQotY29uZmlnIE1BQ0hfTVgyN18zRFMKLQlib29sICJNWDI3UERLIHBsYXRmb3JtIgotCWRlcGVuZHMgb24gTUFDSF9NWDI3Ci0JaGVscAotCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDI3UERLIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCi0JICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCi0KLWNvbmZpZyBNQUNIX0lNWDI3TElURQotCWJvb2wgIkxvZ2ljUEQgTVgyNyBMSVRFS0lUIHBsYXRmb3JtIgotCWRlcGVuZHMgb24gTUFDSF9NWDI3Ci0JaGVscAotCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDI3IExJVEVLSVQgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKLQkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KLQotY29uZmlnIE1BQ0hfUENBMTAwCi0JYm9vbCAiUGh5dGVjIHBoeUNBUkQtcyAocGNhMTAwKSIKLQlkZXBlbmRzIG9uIE1BQ0hfTVgyNwotCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgcGh5Q0FSRC1zIChha2EgcGNhMTAwKSBwbGF0Zm9ybS4gVGhpcwotCSAgaW5jbHVkZXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIGl0cyBwZXJpcGhlcmFscy4KLQotY29uZmlnIE1BQ0hfTVhUX1RENjAKLQlib29sICJNYXh0cmFjayBpLU1YVCBURDYwIgotCWRlcGVuZHMgb24gTUFDSF9NWDI3Ci0JaGVscAotCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBpLU1YVCAoYWthIHRkNjApIHBsYXRmb3JtLiBUaGlzCi0JICBpbmNsdWRlcyBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3IgdGhlIG1vZHVsZSBhbmQgaXRzIHBlcmlwaGVyYWxzLgotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW14Mi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyNTRmYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLSMgT2JqZWN0IGZpbGUgbGlzdHMuCi0KLW9iai15CTo9ICBkZXZpY2VzLm8gc2VyaWFsLm8KLQotb2JqLSQoQ09ORklHX01BQ0hfTVgyMSkgKz0gY2xvY2tfaW14MjEubyBtbS1pbXgyMS5vCi0KLW9iai0kKENPTkZJR19NQUNIX01YMjcpICs9IGNwdV9pbXgyNy5vCi1vYmotJChDT05GSUdfTUFDSF9NWDI3KSArPSBjbG9ja19pbXgyNy5vIG1tLWlteDI3Lm8KLQotb2JqLSQoQ09ORklHX01BQ0hfTVgyMUFEUykgKz0gbWFjaC1teDIxYWRzLm8KLW9iai0kKENPTkZJR19NQUNIX01YMjdBRFMpICs9IG1hY2gtbXgyN2Fkcy5vCi1vYmotJChDT05GSUdfTUFDSF9QQ00wMzgpICs9IG1hY2gtcGNtMDM4Lm8KLW9iai0kKENPTkZJR19NQUNIX1BDTTk3MF9CQVNFQk9BUkQpICs9IHBjbTk3MC1iYXNlYm9hcmQubwotb2JqLSQoQ09ORklHX01BQ0hfTVgyN18zRFMpICs9IG1hY2gtbXgyN18zZHMubwotb2JqLSQoQ09ORklHX01BQ0hfSU1YMjdMSVRFKSArPSBtYWNoLWlteDI3bGl0ZS5vCi1vYmotJChDT05GSUdfTUFDSF9DUFVJTVgyNykgKz0gbWFjaC1jcHVpbXgyNy5vCi1vYmotJChDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVgyN19CQVNFQk9BUkQpICs9IGV1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5vCi1vYmotJChDT05GSUdfTUFDSF9QQ0ExMDApICs9IG1hY2gtcGNhMTAwLm8KLW9iai0kKENPTkZJR19NQUNIX01YVF9URDYwKSArPSBtYWNoLW14dF90ZDYwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLW14Mi9NYWtlZmlsZS5ib290CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODY3Mzk4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL01ha2VmaWxlLmJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXpyZWxhZGRyLSQoQ09ORklHX01BQ0hfTVgyMSkJOj0gMHhDMDAwODAwMAotcGFyYW1zX3BoeXMtJChDT05GSUdfTUFDSF9NWDIxKQk6PSAweEMwMDAwMTAwCi1pbml0cmRfcGh5cy0kKENPTkZJR19NQUNIX01YMjEpCTo9IDB4QzA4MDAwMDAKLQotenJlbGFkZHItJChDT05GSUdfTUFDSF9NWDI3KQk6PSAweEEwMDA4MDAwCi1wYXJhbXNfcGh5cy0kKENPTkZJR19NQUNIX01YMjcpCTo9IDB4QTAwMDAxMDAKLWluaXRyZF9waHlzLSQoQ09ORklHX01BQ0hfTVgyNykJOj0gMHhBMDgwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvY2xvY2tfaW14MjcuYyBiL2FyY2gvYXJtL21hY2gtbXgyL2Nsb2NrX2lteDI3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDgyM2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvY2xvY2tfaW14MjcuYworKysgL2Rldi9udWxsCkBAIC0xLDc2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKLSAqIENvcHlyaWdodCAyMDA4IE1hcnRpbiBGdXp6ZXksIG1mdXp6ZXlAZ21haWwuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+Ci0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgSU9fQUREUl9DQ00ob2ZmKQkoTVgyN19JT19BRERSRVNTKE1YMjdfQ0NNX0JBU0VfQUREUiArIChvZmYpKSkKLQotLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBDQ01fQ1NDUgkJSU9fQUREUl9DQ00oMHgwKQotI2RlZmluZSBDQ01fTVBDVEwwCQlJT19BRERSX0NDTSgweDQpCi0jZGVmaW5lIENDTV9NUENUTDEJCUlPX0FERFJfQ0NNKDB4OCkKLSNkZWZpbmUgQ0NNX1NQQ1RMMAkJSU9fQUREUl9DQ00oMHhjKQotI2RlZmluZSBDQ01fU1BDVEwxCQlJT19BRERSX0NDTSgweDEwKQotI2RlZmluZSBDQ01fT1NDMjZNQ1RMCQlJT19BRERSX0NDTSgweDE0KQotI2RlZmluZSBDQ01fUENEUjAJCUlPX0FERFJfQ0NNKDB4MTgpCi0jZGVmaW5lIENDTV9QQ0RSMQkJSU9fQUREUl9DQ00oMHgxYykKLSNkZWZpbmUgQ0NNX1BDQ1IwCQlJT19BRERSX0NDTSgweDIwKQotI2RlZmluZSBDQ01fUENDUjEJCUlPX0FERFJfQ0NNKDB4MjQpCi0jZGVmaW5lIENDTV9DQ1NSCQlJT19BRERSX0NDTSgweDI4KQotI2RlZmluZSBDQ01fUE1DVEwJCUlPX0FERFJfQ0NNKDB4MmMpCi0jZGVmaW5lIENDTV9QTUNPVU5UCQlJT19BRERSX0NDTSgweDMwKQotI2RlZmluZSBDQ01fV0tHRENUTAkJSU9fQUREUl9DQ00oMHgzNCkKLQotI2RlZmluZSBDQ01fQ1NDUl9VUERBVEVfRElTCSgxIDw8IDMxKQotI2RlZmluZSBDQ01fQ1NDUl9TU0kyCQkoMSA8PCAyMykKLSNkZWZpbmUgQ0NNX0NTQ1JfU1NJMQkJKDEgPDwgMjIpCi0jZGVmaW5lIENDTV9DU0NSX1ZQVQkJKDEgPDwgMjEpCi0jZGVmaW5lIENDTV9DU0NSX01TSEMgICAgICAgICAgICgxIDw8IDIwKQotI2RlZmluZSBDQ01fQ1NDUl9TUExMUkVTICAgICAgICAoMSA8PCAxOSkKLSNkZWZpbmUgQ0NNX0NTQ1JfTVBMTFJFUyAgICAgICAgKDEgPDwgMTgpCi0jZGVmaW5lIENDTV9DU0NSX1NQICAgICAgICAgICAgICgxIDw8IDE3KQotI2RlZmluZSBDQ01fQ1NDUl9NQ1UgICAgICAgICAgICAoMSA8PCAxNikKLSNkZWZpbmUgQ0NNX0NTQ1JfT1NDMjZNRElWICAgICAgKDEgPDwgNCkKLSNkZWZpbmUgQ0NNX0NTQ1JfT1NDMjZNICAgICAgICAgKDEgPDwgMykKLSNkZWZpbmUgQ0NNX0NTQ1JfRlBNICAgICAgICAgICAgKDEgPDwgMikKLSNkZWZpbmUgQ0NNX0NTQ1JfU1BFTiAgICAgICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgQ0NNX0NTQ1JfTVBFTiAgICAgICAgICAgKDEgPDwgMCkKLQotLyogaS5NWDI3IFRPIDIrICovCi0jZGVmaW5lIENDTV9DU0NSX0FSTV9TUkMgICAgICAgICgxIDw8IDE1KQotCi0jZGVmaW5lIENDTV9TUENUTDFfTEYgICAgICAgICAgICgxIDw8IDE1KQotI2RlZmluZSBDQ01fU1BDVEwxX0JSTU8gICAgICAgICAoMSA8PCA2KQotCi1zdGF0aWMgc3RydWN0IGNsayBtcGxsX21haW4xX2NsaywgbXBsbF9tYWluMl9jbGs7Ci0KLXN0YXRpYyBpbnQgY2xrX3BjY3JfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZzsKLQotCWlmICghY2xrLT5lbmFibGVfcmVnKQotCQlyZXR1cm4gMDsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JcmVnIHw9IDEgPDwgY2xrLT5lbmFibGVfc2hpZnQ7Ci0JX19yYXdfd3JpdGVsKHJlZywgY2xrLT5lbmFibGVfcmVnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGtfcGNjcl9kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZzsKLQotCWlmICghY2xrLT5lbmFibGVfcmVnKQotCQlyZXR1cm47Ci0KLQlyZWcgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOwotCXJlZyAmPSB+KDEgPDwgY2xrLT5lbmFibGVfc2hpZnQpOwotCV9fcmF3X3dyaXRlbChyZWcsIGNsay0+ZW5hYmxlX3JlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3NwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZzsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKLQlyZWcgfD0gQ0NNX0NTQ1JfU1BFTjsKLQlfX3Jhd193cml0ZWwocmVnLCBDQ01fQ1NDUik7Ci0KLQl3aGlsZSAoIShfX3Jhd19yZWFkbChDQ01fU1BDVEwxKSAmIENDTV9TUENUTDFfTEYpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGtfc3BsbF9kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZzsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKLQlyZWcgJj0gfkNDTV9DU0NSX1NQRU47Ci0JX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOwotfQotCi1zdGF0aWMgaW50IGNsa19jcHVfc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKLXsKLQlpbnQgY3NjciA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKLQotCWlmIChjbGstPnBhcmVudCA9PSBwYXJlbnQpCi0JCXJldHVybiAwOwotCi0JaWYgKG14MjdfcmV2aXNpb24oKSA+PSBDSElQX1JFVl8yXzApIHsKLQkJaWYgKHBhcmVudCA9PSAmbXBsbF9tYWluMV9jbGspIHsKLQkJCWNzY3IgfD0gQ0NNX0NTQ1JfQVJNX1NSQzsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJlbnQgPT0gJm1wbGxfbWFpbjJfY2xrKQotCQkJCWNzY3IgJj0gfkNDTV9DU0NSX0FSTV9TUkM7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJX19yYXdfd3JpdGVsKGNzY3IsIENDTV9DU0NSKTsKLQkJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcm91bmRfcmF0ZV9jcHUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JaW50IGRpdjsKLQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOwotCi0JcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCi0JZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOwotCWlmIChwYXJlbnRfcmF0ZSAlIHJhdGUpCi0JCWRpdisrOwotCi0JaWYgKGRpdiA+IDQpCi0JCWRpdiA9IDQ7Ci0KLQlyZXR1cm4gcGFyZW50X3JhdGUgLyBkaXY7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3JhdGVfY3B1KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXVuc2lnbmVkIGludCBkaXY7Ci0JdWludDMyX3QgcmVnOwotCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7Ci0KLQlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0KLQlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7Ci0KLQlpZiAoZGl2ID4gNCB8fCBkaXYgPCAxIHx8ICgocGFyZW50X3JhdGUgLyBkaXYpICE9IHJhdGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRpdi0tOwotCi0JcmVnID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOwotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKSB7Ci0JCXJlZyAmPSB+KDMgPDwgMTIpOwotCQlyZWcgfD0gZGl2IDw8IDEyOwotCQlyZWcgJj0gfihDQ01fQ1NDUl9GUE0gfCBDQ01fQ1NDUl9TUEVOKTsKLQkJX19yYXdfd3JpdGVsKHJlZyB8IENDTV9DU0NSX1VQREFURV9ESVMsIENDTV9DU0NSKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHNldCBDUFUgZnJlcXVlbmN5IVxuIik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJvdW5kX3JhdGVfcGVyKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXUzMiBkaXY7Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKLQlpZiAocGFyZW50X3JhdGUgJSByYXRlKQotCQlkaXYrKzsKLQotCWlmIChkaXYgPiA2NCkKLQkJZGl2ID0gNjQ7Ci0KLQlyZXR1cm4gcGFyZW50X3JhdGUgLyBkaXY7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3JhdGVfcGVyKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXUzMiByZWc7Ci0JdTMyIGRpdjsKLQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOwotCi0JcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCi0JaWYgKGNsay0+aWQgPCAwIHx8IGNsay0+aWQgPiAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKLQlpZiAoZGl2ID4gNjQgfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGl2LS07Ci0KLQlyZWcgPSBfX3Jhd19yZWFkbChDQ01fUENEUjEpICYgfigweDNmIDw8IChjbGstPmlkIDw8IDMpKTsKLQlyZWcgfD0gZGl2IDw8IChjbGstPmlkIDw8IDMpOwotCV9fcmF3X3dyaXRlbChyZWcsIENDTV9QQ0RSMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfdXNiKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHVzYl9wZGY7Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCXVzYl9wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpID4+IDI4KSAmIDB4NzsKLQotCXJldHVybiBwYXJlbnRfcmF0ZSAvICh1c2JfcGRmICsgMVUpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9zc2l4KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyBwZGYpCi17Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKQotCQlwZGYgKz0gNDsgIC8qIE1YMjcgVE8yKyAqLwotCWVsc2UKLQkJcGRmID0gKHBkZiA8IDIpID8gMTI0VUwgOiBwZGY7ICAvKiBNWDIxICYgTVgyNyBUTzEgKi8KLQotCXJldHVybiAyVUwgKiBwYXJlbnRfcmF0ZSAvIHBkZjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfc3NpMShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIGdldF9yYXRlX3NzaXgoY2xrLCAoX19yYXdfcmVhZGwoQ0NNX1BDRFIwKSA+PiAxNikgJiAweDNmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfc3NpMihzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIGdldF9yYXRlX3NzaXgoY2xrLCAoX19yYXdfcmVhZGwoQ0NNX1BDRFIwKSA+PiAyNikgJiAweDNmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfbmZjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIG5mY19wZGY7Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKQotCQluZmNfcGRmID0gKF9fcmF3X3JlYWRsKENDTV9QQ0RSMCkgPj4gNikgJiAweGY7Ci0JZWxzZQotCQluZmNfcGRmID0gKF9fcmF3X3JlYWRsKENDTV9QQ0RSMCkgPj4gMTIpICYgMHhmOwotCi0JcmV0dXJuIHBhcmVudF9yYXRlIC8gKG5mY19wZGYgKyAxKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfdnB1KHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHZwdV9wZGY7Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKLQotCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKSB7Ci0JCXZwdV9wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX1BDRFIwKSA+PiAxMCkgJiAweDNmOwotCQl2cHVfcGRmICs9IDQ7Ci0JfSBlbHNlIHsKLQkJdnB1X3BkZiA9IChfX3Jhd19yZWFkbChDQ01fUENEUjApID4+IDgpICYgMHhmOwotCQl2cHVfcGRmID0gKHZwdV9wZGYgPCAyKSA/IDEyNCA6IHZwdV9wZGY7Ci0JfQotCi0JcmV0dXJuIDJVTCAqIHBhcmVudF9yYXRlIC8gdnB1X3BkZjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcm91bmRfcmF0ZV9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIGNsay0+cGFyZW50LT5yb3VuZF9yYXRlKGNsay0+cGFyZW50LCByYXRlKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfcGFyZW50KHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLX0KLQotc3RhdGljIGludCBzZXRfcmF0ZV9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIGNsay0+cGFyZW50LT5zZXRfcmF0ZShjbGstPnBhcmVudCwgcmF0ZSk7Ci19Ci0KLS8qIGluIEh6ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHRlcm5hbF9oaWdoX3JlZmVyZW5jZSA9IDI2MDAwMDAwOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9oaWdoX3JlZmVyZW5jZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIGV4dGVybmFsX2hpZ2hfcmVmZXJlbmNlOwotfQotCi0vKiBpbiBIeiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0ZXJuYWxfbG93X3JlZmVyZW5jZSA9IDMyNzY4OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9sb3dfcmVmZXJlbmNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gZXh0ZXJuYWxfbG93X3JlZmVyZW5jZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfZnBtKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIDEwMjQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX21wbGwoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBteGNfZGVjb2RlX3BsbChfX3Jhd19yZWFkbChDQ01fTVBDVEwwKSwKLQkJCWNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9tcGxsX21haW4oc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7Ci0KLQlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0KLQkvKiBpLk1YMjcgVE8yOgotCSAqIGNsay0+aWQgPT0gMDogYXJtIGNsb2NrIHNvdXJjZSBwYXRoIDEgd2hpY2ggaXMgZnJvbSAyICogTVBMTCAvIDIKLQkgKiBjbGstPmlkID09IDE6IGFybSBjbG9jayBzb3VyY2UgcGF0aCAyIHdoaWNoIGlzIGZyb20gMiAqIE1QTEwgLyAzCi0JICovCi0JaWYgKG14MjdfcmV2aXNpb24oKSA+PSBDSElQX1JFVl8yXzAgJiYgY2xrLT5pZCA9PSAxKQotCQlyZXR1cm4gMlVMICogcGFyZW50X3JhdGUgLyAzVUw7Ci0KLQlyZXR1cm4gcGFyZW50X3JhdGU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3NwbGwoc3RydWN0IGNsayAqY2xrKQotewotCXVpbnQzMl90IHJlZzsKLQl1bnNpZ25lZCBsb25nIHJhdGU7Ci0KLQlyYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQotCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9TUENUTDApOwotCi0JLyogT24gVE8yIHdlIGhhdmUgdG8gd3JpdGUgdGhlIHZhbHVlIGJhY2suIE90aGVyd2lzZSB3ZQotCSAqIHJlYWQgMCBmcm9tIHRoaXMgcmVnaXN0ZXIgdGhlIG5leHQgdGltZS4KLQkgKi8KLQlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkKLQkJX19yYXdfd3JpdGVsKHJlZywgQ0NNX1NQQ1RMMCk7Ci0KLQlyZXR1cm4gbXhjX2RlY29kZV9wbGwocmVnLCByYXRlKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfY3B1KHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1MzIgZGl2OwotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKQotCQlkaXYgPSAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpID4+IDEyKSAmIDB4MzsKLQllbHNlCi0JCWRpdiA9IChfX3Jhd19yZWFkbChDQ01fQ1NDUikgPj4gMTMpICYgMHg3OwotCi0JcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0JcmV0dXJuIHJhdGUgLyAoZGl2ICsgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX2FoYihzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdW5zaWduZWQgbG9uZyByYXRlLCBiY2xrX3BkZjsKLQotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKQotCQliY2xrX3BkZiA9IChfX3Jhd19yZWFkbChDQ01fQ1NDUikgPj4gOCkgJiAweDM7Ci0JZWxzZQotCQliY2xrX3BkZiA9IChfX3Jhd19yZWFkbChDQ01fQ1NDUikgPj4gOSkgJiAweGY7Ci0KLQlyYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQlyZXR1cm4gcmF0ZSAvIChiY2xrX3BkZiArIDEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9pcGcoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgcmF0ZSwgaXBnX3BkZjsKLQotCWlmIChteDI3X3JldmlzaW9uKCkgPj0gQ0hJUF9SRVZfMl8wKQotCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQllbHNlCi0JCWlwZ19wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpID4+IDgpICYgMTsKLQotCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCXJldHVybiByYXRlIC8gKGlwZ19wZGYgKyAxKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfcGVyKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHBlcmNsa19wZGYsIHBhcmVudF9yYXRlOwotCi0JcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCi0JaWYgKGNsay0+aWQgPCAwIHx8IGNsay0+aWQgPiAzKQotCQlyZXR1cm4gMDsKLQotCXBlcmNsa19wZGYgPSAoX19yYXdfcmVhZGwoQ0NNX1BDRFIxKSA+PiAoY2xrLT5pZCA8PCAzKSkgJiAweDNmOwotCi0JcmV0dXJuIHBhcmVudF9yYXRlIC8gKHBlcmNsa19wZGYgKyAxKTsKLX0KLQotLyoKLSAqIHRoZSBoaWdoIGZyZXF1ZW5jeSBleHRlcm5hbCBjbG9jayByZWZlcmVuY2UKLSAqIERlZmF1bHQgY2FzZSBpcyAyNk1Iei4gQ291bGQgYmUgY2hhbmdlZCBhdCBydW50aW1lCi0gKiB3aXRoIGEgY2FsbCB0byBjaGFuZ2VfZXh0ZXJuYWxfaGlnaF9yZWZlcmVuY2UoKQotICovCi1zdGF0aWMgc3RydWN0IGNsayBja2loX2NsayA9IHsKLQkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV9oaWdoX3JlZmVyZW5jZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1wbGxfY2xrID0gewotCS5wYXJlbnQJCT0gJmNraWhfY2xrLAotCS5nZXRfcmF0ZQk9IGdldF9yYXRlX21wbGwsCi19OwotCi0vKiBGb3IgaS5NWDI3IFRPMiwgaXQgaXMgdGhlIE1QTEwgcGF0aCAxIG9mIEFSTSBjb3JlCi0gKiBJdCBwcm92aWRlcyB0aGUgY2xvY2sgc291cmNlIHdob3NlIHJhdGUgaXMgc2FtZSBhcyBNUExMCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1wbGxfbWFpbjFfY2xrID0gewotCS5pZAkJPSAwLAotCS5wYXJlbnQJCT0gJm1wbGxfY2xrLAotCS5nZXRfcmF0ZQk9IGdldF9yYXRlX21wbGxfbWFpbiwKLX07Ci0KLS8qIEZvciBpLk1YMjcgVE8yLCBpdCBpcyB0aGUgTVBMTCBwYXRoIDIgb2YgQVJNIGNvcmUKLSAqIEl0IHByb3ZpZGVzIHRoZSBjbG9jayBzb3VyY2Ugd2hvc2UgcmF0ZSBpcyBzYW1lIE1QTEwgKiAyIC8gMwotICovCi1zdGF0aWMgc3RydWN0IGNsayBtcGxsX21haW4yX2NsayA9IHsKLQkuaWQJCT0gMSwKLQkucGFyZW50CQk9ICZtcGxsX2NsaywKLQkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV9tcGxsX21haW4sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhaGJfY2xrID0gewotCS5wYXJlbnQJCT0gJm1wbGxfbWFpbjJfY2xrLAotCS5nZXRfcmF0ZQk9IGdldF9yYXRlX2FoYiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGlwZ19jbGsgPSB7Ci0JLnBhcmVudAkJPSAmYWhiX2NsaywKLQkuZ2V0X3JhdGUJPSBnZXRfcmF0ZV9pcGcsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBjcHVfY2xrID0gewotCS5wYXJlbnQgPSAmbXBsbF9tYWluMl9jbGssCi0JLnNldF9wYXJlbnQgPSBjbGtfY3B1X3NldF9wYXJlbnQsCi0JLnJvdW5kX3JhdGUgPSByb3VuZF9yYXRlX2NwdSwKLQkuZ2V0X3JhdGUgPSBnZXRfcmF0ZV9jcHUsCi0JLnNldF9yYXRlID0gc2V0X3JhdGVfY3B1LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc3BsbF9jbGsgPSB7Ci0JLnBhcmVudCA9ICZja2loX2NsaywKLQkuZ2V0X3JhdGUgPSBnZXRfcmF0ZV9zcGxsLAotCS5lbmFibGUgPSBjbGtfc3BsbF9lbmFibGUsCi0JLmRpc2FibGUgPSBjbGtfc3BsbF9kaXNhYmxlLAotfTsKLQotLyoKLSAqIHRoZSBsb3cgZnJlcXVlbmN5IGV4dGVybmFsIGNsb2NrIHJlZmVyZW5jZQotICogRGVmYXVsdCBjYXNlIGlzIDMyLjc2OGtIei4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgY2tpbF9jbGsgPSB7Ci0JLmdldF9yYXRlID0gZ2V0X3JhdGVfbG93X3JlZmVyZW5jZSwKLX07Ci0KLS8qIE91dHB1dCBvZiBmcmVxdWVuY3kgcHJlIG11bHRpcGxpZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZwbV9jbGsgPSB7Ci0JLnBhcmVudCA9ICZja2lsX2NsaywKLQkuZ2V0X3JhdGUgPSBnZXRfcmF0ZV9mcG0sCi19OwotCi0jZGVmaW5lIFBDQ1IwIENDTV9QQ0NSMAotI2RlZmluZSBQQ0NSMSBDQ01fUENDUjEKLQotI2RlZmluZSBERUZJTkVfQ0xPQ0sobmFtZSwgaSwgZXIsIGVzLCBnciwgcywgcCkJCVwKLQlzdGF0aWMgc3RydWN0IGNsayBuYW1lID0gewkJCVwKLQkJLmlkCQk9IGksCQkJXAotCQkuZW5hYmxlX3JlZwk9IGVyLAkJCVwKLQkJLmVuYWJsZV9zaGlmdAk9IGVzLAkJCVwKLQkJLmdldF9yYXRlCT0gZ3IsCQkJXAotCQkuZW5hYmxlCQk9IGNsa19wY2NyX2VuYWJsZSwJXAotCQkuZGlzYWJsZQk9IGNsa19wY2NyX2Rpc2FibGUsCVwKLQkJLnNlY29uZGFyeQk9IHMsCQkJXAotCQkucGFyZW50CQk9IHAsCQkJXAotCX0KLQotI2RlZmluZSBERUZJTkVfQ0xPQ0sxKG5hbWUsIGksIGVyLCBlcywgZ2V0c2V0cm91bmQsIHMsIHApCVwKLQlzdGF0aWMgc3RydWN0IGNsayBuYW1lID0gewkJCQlcCi0JCS5pZAkJPSBpLAkJCQlcCi0JCS5lbmFibGVfcmVnCT0gZXIsCQkJCVwKLQkJLmVuYWJsZV9zaGlmdAk9IGVzLAkJCQlcCi0JCS5nZXRfcmF0ZQk9IGdldF9yYXRlXyMjZ2V0c2V0cm91bmQsCVwKLQkJLnNldF9yYXRlCT0gc2V0X3JhdGVfIyNnZXRzZXRyb3VuZCwJXAotCQkucm91bmRfcmF0ZQk9IHJvdW5kX3JhdGVfIyNnZXRzZXRyb3VuZCwJXAotCQkuZW5hYmxlCQk9IGNsa19wY2NyX2VuYWJsZSwJCVwKLQkJLmRpc2FibGUJPSBjbGtfcGNjcl9kaXNhYmxlLAkJXAotCQkuc2Vjb25kYXJ5CT0gcywJCQkJXAotCQkucGFyZW50CQk9IHAsCQkJCVwKLQl9Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8ga2VlcCB0aGUgZm9sbG93aW5nIGxpc3QgaW4gb3JkZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNsY2RjX2NsazEsIHNhaGFyYTJfY2xrMSwgcnRpY19jbGsxLCBmZWNfY2xrMSwgZW1tYV9jbGsxLAotCQkgIGRtYV9jbGsxLCBsY2RjX2NsazIsIHZwdV9jbGsxOwotCi0vKiBBbGwgY2xvY2tzIHdlIGNhbiBnYXRlIHRocm91Z2ggUENDUnggaW4gdGhlIG9yZGVyIG9mIFBDQ1J4IGJpdHMgKi8KLURFRklORV9DTE9DSyhzc2kyX2NsazEsICAgIDEsIFBDQ1IwLCAgMCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKHNzaTFfY2xrMSwgICAgMCwgUENDUjAsICAxLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soc2xjZGNfY2xrLCAgICAwLCBQQ0NSMCwgIDIsIE5VTEwsICZzbGNkY19jbGsxLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soc2RoYzNfY2xrMSwgICAwLCBQQ0NSMCwgIDMsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhzZGhjMl9jbGsxLCAgIDAsIFBDQ1IwLCAgNCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKHNkaGMxX2NsazEsICAgMCwgUENDUjAsICA1LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soc2NjX2NsaywgICAgICAwLCBQQ0NSMCwgIDYsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhzYWhhcmEyX2NsaywgIDAsIFBDQ1IwLCAgNywgTlVMTCwgJnNhaGFyYTJfY2xrMSwgJmFoYl9jbGspOwotREVGSU5FX0NMT0NLKHJ0aWNfY2xrLCAgICAgMCwgUENDUjAsICA4LCBOVUxMLCAmcnRpY19jbGsxLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0socnRjX2NsaywgICAgICAwLCBQQ0NSMCwgIDksIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhwd21fY2xrMSwgICAgIDAsIFBDQ1IwLCAxMSwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKG93aXJlX2NsaywgICAgMCwgUENDUjAsIDEyLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sobXN0aWNrX2NsazEsICAwLCBQQ0NSMCwgMTMsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhsY2RjX2NsazEsICAgIDAsIFBDQ1IwLCAxNCwgTlVMTCwgJmxjZGNfY2xrMiwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKGtwcF9jbGssICAgICAgMCwgUENDUjAsIDE1LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soaWltX2NsaywgICAgICAwLCBQQ0NSMCwgMTYsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhpMmMyX2NsaywgICAgIDEsIFBDQ1IwLCAxNywgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKGkyYzFfY2xrLCAgICAgMCwgUENDUjAsIDE4LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soZ3B0Nl9jbGsxLCAgICAwLCBQQ0NSMCwgMjksIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhncHQ1X2NsazEsICAgIDAsIFBDQ1IwLCAyMCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKGdwdDRfY2xrMSwgICAgMCwgUENDUjAsIDIxLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soZ3B0M19jbGsxLCAgICAwLCBQQ0NSMCwgMjIsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhncHQyX2NsazEsICAgIDAsIFBDQ1IwLCAyMywgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKGdwdDFfY2xrMSwgICAgMCwgUENDUjAsIDI0LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soZ3Bpb19jbGssICAgICAwLCBQQ0NSMCwgMjUsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhmZWNfY2xrLCAgICAgIDAsIFBDQ1IwLCAyNiwgTlVMTCwgJmZlY19jbGsxLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soZW1tYV9jbGssICAgICAwLCBQQ0NSMCwgMjcsIE5VTEwsICZlbW1hX2NsazEsICZhaGJfY2xrKTsKLURFRklORV9DTE9DSyhkbWFfY2xrLCAgICAgIDAsIFBDQ1IwLCAyOCwgTlVMTCwgJmRtYV9jbGsxLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soY3NwaTEzX2NsazEsICAwLCBQQ0NSMCwgMjksIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhjc3BpMl9jbGsxLCAgIDAsIFBDQ1IwLCAzMCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKGNzcGkxX2NsazEsICAgMCwgUENDUjAsIDMxLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci0KLURFRklORV9DTE9DSyhtc3RpY2tfY2xrLCAgIDAsIFBDQ1IxLCAgMiwgTlVMTCwgJm1zdGlja19jbGsxLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sobmZjX2NsaywgICAgICAwLCBQQ0NSMSwgIDMsIGdldF9yYXRlX25mYywgTlVMTCwgJmNwdV9jbGspOwotREVGSU5FX0NMT0NLKHNzaTJfY2xrLCAgICAgMSwgUENDUjEsICA0LCBnZXRfcmF0ZV9zc2kyLCAmc3NpMl9jbGsxLCAmbXBsbF9tYWluMl9jbGspOwotREVGSU5FX0NMT0NLKHNzaTFfY2xrLCAgICAgMCwgUENDUjEsICA1LCBnZXRfcmF0ZV9zc2kxLCAmc3NpMV9jbGsxLCAmbXBsbF9tYWluMl9jbGspOwotREVGSU5FX0NMT0NLKHZwdV9jbGssICAgICAgMCwgUENDUjEsICA2LCBnZXRfcmF0ZV92cHUsICZ2cHVfY2xrMSwgJm1wbGxfbWFpbjJfY2xrKTsKLURFRklORV9DTE9DSzEocGVyNF9jbGssICAgIDMsIFBDQ1IxLCAgNywgcGVyLCBOVUxMLCAmbXBsbF9tYWluMl9jbGspOwotREVGSU5FX0NMT0NLMShwZXIzX2NsaywgICAgMiwgUENDUjEsICA4LCBwZXIsIE5VTEwsICZtcGxsX21haW4yX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sxKHBlcjJfY2xrLCAgICAxLCBQQ0NSMSwgIDksIHBlciwgTlVMTCwgJm1wbGxfbWFpbjJfY2xrKTsKLURFRklORV9DTE9DSzEocGVyMV9jbGssICAgIDAsIFBDQ1IxLCAxMCwgcGVyLCBOVUxMLCAmbXBsbF9tYWluMl9jbGspOwotREVGSU5FX0NMT0NLKHVzYl9jbGsxLCAgICAgMCwgUENDUjEsIDExLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soc2xjZGNfY2xrMSwgICAwLCBQQ0NSMSwgMTIsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKLURFRklORV9DTE9DSyhzYWhhcmEyX2NsazEsIDAsIFBDQ1IxLCAxMywgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwotREVGSU5FX0NMT0NLKHJ0aWNfY2xrMSwgICAgMCwgUENDUjEsIDE0LCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sobGNkY19jbGsyLCAgICAwLCBQQ0NSMSwgMTUsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKLURFRklORV9DTE9DSyh2cHVfY2xrMSwgICAgIDAsIFBDQ1IxLCAxNiwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwotREVGSU5FX0NMT0NLKGZlY19jbGsxLCAgICAgMCwgUENDUjEsIDE3LCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soZW1tYV9jbGsxLCAgICAwLCBQQ0NSMSwgMTgsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKLURFRklORV9DTE9DSyhlbWlfY2xrLCAgICAgIDAsIFBDQ1IxLCAxOSwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwotREVGSU5FX0NMT0NLKGRtYV9jbGsxLCAgICAgMCwgUENDUjEsIDIwLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soY3NpX2NsazEsICAgICAwLCBQQ0NSMSwgMjEsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKLURFRklORV9DTE9DSyhicm9tX2NsaywgICAgIDAsIFBDQ1IxLCAyMiwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwotREVGSU5FX0NMT0NLKGF0YV9jbGssICAgICAgMCwgUENDUjEsIDIzLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sod2RvZ19jbGssICAgICAwLCBQQ0NSMSwgMjQsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyh1c2JfY2xrLCAgICAgIDAsIFBDQ1IxLCAyNSwgZ2V0X3JhdGVfdXNiLCAmdXNiX2NsazEsICZzcGxsX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sodWFydDZfY2xrMSwgICAwLCBQQ0NSMSwgMjYsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyh1YXJ0NV9jbGsxLCAgIDAsIFBDQ1IxLCAyNywgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKHVhcnQ0X2NsazEsICAgMCwgUENDUjEsIDI4LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sodWFydDNfY2xrMSwgICAwLCBQQ0NSMSwgMjksIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyh1YXJ0Ml9jbGsxLCAgIDAsIFBDQ1IxLCAzMCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKHVhcnQxX2NsazEsICAgMCwgUENDUjEsIDMxLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7Ci0KLS8qIENsb2NrcyB3ZSBjYW5ub3QgZGlyZWN0bHkgZ2F0ZSwgYnV0IGRyaXZlcnMgbmVlZCB0aGVpciByYXRlcyAqLwotREVGSU5FX0NMT0NLKGNzcGkxX2NsaywgICAgMCwgMCwgICAgICAwLCBOVUxMLCAmY3NwaTFfY2xrMSwgJnBlcjJfY2xrKTsKLURFRklORV9DTE9DSyhjc3BpMl9jbGssICAgIDEsIDAsICAgICAgMCwgTlVMTCwgJmNzcGkyX2NsazEsICZwZXIyX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soY3NwaTNfY2xrLCAgICAyLCAwLCAgICAgIDAsIE5VTEwsICZjc3BpMTNfY2xrMSwgJnBlcjJfY2xrKTsKLURFRklORV9DTE9DSyhzZGhjMV9jbGssICAgIDAsIDAsICAgICAgMCwgTlVMTCwgJnNkaGMxX2NsazEsICZwZXIyX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soc2RoYzJfY2xrLCAgICAxLCAwLCAgICAgIDAsIE5VTEwsICZzZGhjMl9jbGsxLCAmcGVyMl9jbGspOwotREVGSU5FX0NMT0NLKHNkaGMzX2NsaywgICAgMiwgMCwgICAgICAwLCBOVUxMLCAmc2RoYzNfY2xrMSwgJnBlcjJfY2xrKTsKLURFRklORV9DTE9DSyhwd21fY2xrLCAgICAgIDAsIDAsICAgICAgMCwgTlVMTCwgJnB3bV9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKGdwdDFfY2xrLCAgICAgMCwgMCwgICAgICAwLCBOVUxMLCAmZ3B0MV9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKGdwdDJfY2xrLCAgICAgMSwgMCwgICAgICAwLCBOVUxMLCAmZ3B0Ml9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKGdwdDNfY2xrLCAgICAgMiwgMCwgICAgICAwLCBOVUxMLCAmZ3B0M19jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKGdwdDRfY2xrLCAgICAgMywgMCwgICAgICAwLCBOVUxMLCAmZ3B0NF9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKGdwdDVfY2xrLCAgICAgNCwgMCwgICAgICAwLCBOVUxMLCAmZ3B0NV9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKGdwdDZfY2xrLCAgICAgNSwgMCwgICAgICAwLCBOVUxMLCAmZ3B0Nl9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKHVhcnQxX2NsaywgICAgMCwgMCwgICAgICAwLCBOVUxMLCAmdWFydDFfY2xrMSwgJnBlcjFfY2xrKTsKLURFRklORV9DTE9DSyh1YXJ0Ml9jbGssICAgIDEsIDAsICAgICAgMCwgTlVMTCwgJnVhcnQyX2NsazEsICZwZXIxX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sodWFydDNfY2xrLCAgICAyLCAwLCAgICAgIDAsIE5VTEwsICZ1YXJ0M19jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLKHVhcnQ0X2NsaywgICAgMywgMCwgICAgICAwLCBOVUxMLCAmdWFydDRfY2xrMSwgJnBlcjFfY2xrKTsKLURFRklORV9DTE9DSyh1YXJ0NV9jbGssICAgIDQsIDAsICAgICAgMCwgTlVMTCwgJnVhcnQ1X2NsazEsICZwZXIxX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sodWFydDZfY2xrLCAgICA1LCAwLCAgICAgIDAsIE5VTEwsICZ1YXJ0Nl9jbGsxLCAmcGVyMV9jbGspOwotREVGSU5FX0NMT0NLMShsY2RjX2NsaywgICAgMCwgMCwgICAgICAwLCBwYXJlbnQsICZsY2RjX2NsazEsICZwZXIzX2Nsayk7Ci1ERUZJTkVfQ0xPQ0sxKGNzaV9jbGssICAgICAwLCAwLCAgICAgIDAsIHBhcmVudCwgJmNzaV9jbGsxLCAmcGVyNF9jbGspOwotCi0jZGVmaW5lIF9SRUdJU1RFUl9DTE9DSyhkLCBuLCBjKSBcCi0JeyBcCi0JCS5kZXZfaWQgPSBkLCBcCi0JCS5jb25faWQgPSBuLCBcCi0JCS5jbGsgPSAmYywgXAotCX0sCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjUiLCBOVUxMLCB1YXJ0Nl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQxIiwgZ3B0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQyIiwgZ3B0Ml9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQzIiwgZ3B0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQ0IiwgZ3B0NF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQ1IiwgZ3B0NV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQ2IiwgZ3B0Nl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJteGNfcHdtLjAiLCBOVUxMLCBwd21fY2xrKQotCV9SRUdJU1RFUl9DTE9DSygibXhjLW1tYy4wIiwgTlVMTCwgc2RoYzFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygibXhjLW1tYy4xIiwgTlVMTCwgc2RoYzJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygibXhjLW1tYy4yIiwgTlVMTCwgc2RoYzNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic3BpX2lteC4wIiwgTlVMTCwgY3NwaTFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic3BpX2lteC4xIiwgTlVMTCwgY3NwaTJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic3BpX2lteC4yIiwgTlVMTCwgY3NwaTNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LWZiLjAiLCBOVUxMLCBsY2RjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImNzaSIsIGNzaV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJmc2wtdXNiMi11ZGMiLCAidXNiIiwgdXNiX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImZzbC11c2IyLXVkYyIsICJ1c2JfYWhiIiwgdXNiX2NsazEpCi0JX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4wIiwgInVzYiIsIHVzYl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4wIiwgInVzYl9haGIiLCB1c2JfY2xrMSkKLQlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjEiLCAidXNiIiwgdXNiX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjEiLCAidXNiX2FoYiIsIHVzYl9jbGsxKQotCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMiIsICJ1c2IiLCB1c2JfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMiIsICJ1c2JfYWhiIiwgdXNiX2NsazEpCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjAiLCBOVUxMLCBzc2kxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMSIsIE5VTEwsIHNzaTJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygibXhjX25hbmQuMCIsIE5VTEwsIG5mY19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJ2cHUiLCB2cHVfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZG1hIiwgZG1hX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJ0aWMiLCBydGljX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImJyb20iLCBicm9tX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVtbWEiLCBlbW1hX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNsY2RjIiwgc2xjZGNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZW1pIiwgZW1pX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNhaGFyYTIiLCBzYWhhcmEyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImF0YSIsIGF0YV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtc3RpY2siLCBtc3RpY2tfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXdkdC4wIiwgTlVMTCwgd2RvZ19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncGlvIiwgZ3Bpb19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMSIsIE5VTEwsIGkyYzJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiaWltIiwgaWltX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImtwcCIsIGtwcF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJteGNfdzEuMCIsIE5VTEwsIG93aXJlX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJ0YyIsIHJ0Y19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzY2MiLCBzY2NfY2xrKQotfTsKLQotLyogQWRqdXN0IHRoZSBjbG9jayBwYXRoIGZvciBUTzIgYW5kIGxhdGVyICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdG8yX2FkanVzdF9jbG9ja3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGNzY3IgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7Ci0KLQlpZiAobXgyN19yZXZpc2lvbigpID49IENISVBfUkVWXzJfMCkgewotCQlpZiAoY3NjciAmIENDTV9DU0NSX0FSTV9TUkMpCi0JCQljcHVfY2xrLnBhcmVudCA9ICZtcGxsX21haW4xX2NsazsKLQotCQlpZiAoIShjc2NyICYgQ0NNX0NTQ1JfU1NJMikpCi0JCQlzc2kxX2Nsay5wYXJlbnQgPSAmc3BsbF9jbGs7Ci0KLQkJaWYgKCEoY3NjciAmIENDTV9DU0NSX1NTSTEpKQotCQkJc3NpMV9jbGsucGFyZW50ID0gJnNwbGxfY2xrOwotCi0JCWlmICghKGNzY3IgJiBDQ01fQ1NDUl9WUFUpKQotCQkJdnB1X2Nsay5wYXJlbnQgPSAmc3BsbF9jbGs7Ci0JfSBlbHNlIHsKLQkJY3B1X2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7Ci0JCWNwdV9jbGsuc2V0X3BhcmVudCA9IE5VTEw7Ci0JCWNwdV9jbGsucm91bmRfcmF0ZSA9IE5VTEw7Ci0JCWNwdV9jbGsuc2V0X3JhdGUgPSBOVUxMOwotCQlhaGJfY2xrLnBhcmVudCA9ICZtcGxsX2NsazsKLQotCQlwZXIxX2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7Ci0JCXBlcjJfY2xrLnBhcmVudCA9ICZtcGxsX2NsazsKLQkJcGVyM19jbGsucGFyZW50ID0gJm1wbGxfY2xrOwotCQlwZXI0X2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7Ci0KLQkJc3NpMV9jbGsucGFyZW50ID0gJm1wbGxfY2xrOwotCQlzc2kyX2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7Ci0KLQkJdnB1X2Nsay5wYXJlbnQgPSAmbXBsbF9jbGs7Ci0JfQotfQotCi0vKgotICogbXVzdCBiZSBjYWxsZWQgdmVyeSBlYXJseSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBhdmFpbGFibGUgY2xvY2sgcmF0ZSB3aGVuIHRoZSB0aW1lciBmcmFtZXdvcmsgc3RhcnRzCi0gKi8KLWludCBfX2luaXQgbXgyN19jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGZyZWYpCi17Ci0JdTMyIGNzY3IgPSBfX3Jhd19yZWFkbChDQ01fQ1NDUik7Ci0KLQlleHRlcm5hbF9oaWdoX3JlZmVyZW5jZSA9IGZyZWY7Ci0KLQkvKiBkZXRlY3QgY2xvY2sgcmVmZXJlbmNlIGZvciBib3RoIHN5c3RlbSBQTExzICovCi0JaWYgKGNzY3IgJiBDQ01fQ1NDUl9NQ1UpCi0JCW1wbGxfY2xrLnBhcmVudCA9ICZja2loX2NsazsKLQllbHNlCi0JCW1wbGxfY2xrLnBhcmVudCA9ICZmcG1fY2xrOwotCi0JaWYgKGNzY3IgJiBDQ01fQ1NDUl9TUCkKLQkJc3BsbF9jbGsucGFyZW50ID0gJmNraWhfY2xrOwotCWVsc2UKLQkJc3BsbF9jbGsucGFyZW50ID0gJmZwbV9jbGs7Ci0KLQl0bzJfYWRqdXN0X2Nsb2NrcygpOwotCi0JY2xrZGV2X2FkZF90YWJsZShsb29rdXBzLCBBUlJBWV9TSVpFKGxvb2t1cHMpKTsKLQotCS8qIFR1cm4gb2ZmIGFsbCBjbG9ja3Mgd2UgZG8gbm90IG5lZWQgKi8KLQlfX3Jhd193cml0ZWwoMCwgQ0NNX1BDQ1IwKTsKLQlfX3Jhd193cml0ZWwoKDEgPDwgMTApIHwgKDEgPDwgMTkpLCBDQ01fUENDUjEpOwotCi0Jc3BsbF9jbGsuZGlzYWJsZSgmc3BsbF9jbGspOwotCi0JLyogZW5hYmxlIGJhc2ljIGNsb2NrcyAqLwotCWNsa19lbmFibGUoJnBlcjFfY2xrKTsKLQljbGtfZW5hYmxlKCZncGlvX2Nsayk7Ci0JY2xrX2VuYWJsZSgmZW1pX2Nsayk7Ci0JY2xrX2VuYWJsZSgmaWltX2Nsayk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19MTCkgJiYgIWRlZmluZWQoQ09ORklHX0RFQlVHX0lDRURDQykKLQljbGtfZW5hYmxlKCZ1YXJ0MV9jbGspOwotI2VuZGlmCi0KLQlteGNfdGltZXJfaW5pdCgmZ3B0MV9jbGssIE1YMjdfSU9fQUREUkVTUyhNWDI3X0dQVDFfQkFTRV9BRERSKSwKLQkJCU1YMjdfSU5UX0dQVDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhZWI4YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLyoKLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICAgICAgPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqIEJhc2VkIG9uIHRoZSBPTUFQIGRldmljZXMuYwotICoKLSAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCi0gKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKgotICogQ29weXJpZ2h0IDIwMDYtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvbW1jLmg+Ci0KLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLS8qCi0gKiBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKLSAqCi0gKiAtIGkuTVgxOiAyIGNoYW5uZWwgKHNsaWdobHkgZGlmZmVyZW50IHJlZ2lzdGVyIHNldHRpbmcpCi0gKiAtIGkuTVgyMTogMiBjaGFubmVsCi0gKiAtIGkuTVgyNzogMyBjaGFubmVsCi0gKi8KLSNkZWZpbmUgREVGSU5FX0lNWF9TUElfREVWSUNFKG4sIGJhc2VhZGRyLCBpcnEpCQkJCQlcCi0Jc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfc3BpX3Jlc291cmNlcyAjIyBuW10gPSB7CQkJXAotCQl7CQkJCQkJCQlcCi0JCQkuc3RhcnQgPSBiYXNlYWRkciwJCQkJCVwKLQkJCS5lbmQgPSBiYXNlYWRkciArIFNaXzRLIC0gMSwJCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCQkJCVwKLQkJfSwgewkJCQkJCQkJXAotCQkJLnN0YXJ0ID0gaXJxLAkJCQkJCVwKLQkJCS5lbmQgPSBpcnEsCQkJCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCQkJCVwKLQkJfSwJCQkJCQkJCVwKLQl9OwkJCQkJCQkJCVwKLQkJCQkJCQkJCQlcCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZSAjIyBuID0gewkJCQlcCi0JCS5uYW1lID0gInNwaV9pbXgiLAkJCQkJCVwKLQkJLmlkID0gbiwJCQkJCQkJXAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX3NwaV9yZXNvdXJjZXMgIyMgbiksCQlcCi0JCS5yZXNvdXJjZSA9IG14Y19zcGlfcmVzb3VyY2VzICMjIG4sCQkJCVwKLQl9Ci0KLURFRklORV9JTVhfU1BJX0RFVklDRSgwLCBNWDJ4X0NTUEkxX0JBU0VfQUREUiwgTVgyeF9JTlRfQ1NQSTEpOwotREVGSU5FX0lNWF9TUElfREVWSUNFKDEsIE1YMnhfQ1NQSTJfQkFTRV9BRERSLCBNWDJ4X0lOVF9DU1BJMik7Ci0KLSNpZmRlZiBDT05GSUdfTUFDSF9NWDI3Ci1ERUZJTkVfSU1YX1NQSV9ERVZJQ0UoMiwgTVgyN19DU1BJM19CQVNFX0FERFIsIE1YMjdfSU5UX0NTUEkzKTsKLSNlbmRpZgotCi0vKgotICogR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0gKiAtIGkuTVgyMTogMyB0aW1lcnMKLSAqIC0gaS5NWDI3OiA2IHRpbWVycwotICovCi0jZGVmaW5lIERFRklORV9JTVhfR1BUX0RFVklDRShuLCBiYXNlYWRkciwgaXJxKQkJCQlcCi0Jc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0aW1lciAjIyBuICMjX3Jlc291cmNlc1tdID0gewkJXAotCQl7CQkJCQkJCVwKLQkJCS5zdGFydCA9IGJhc2VhZGRyLAkJCQlcCi0JCQkuZW5kID0gYmFzZWFkZHIgKyBTWl80SyAtIDEsCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCQkJXAotCQl9LCB7CQkJCQkJCVwKLQkJCS5zdGFydCA9IGlycSwJCQkJCVwKLQkJCS5lbmQgPSBpcnEsCQkJCQlcCi0JCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwJCQlcCi0JCX0JCQkJCQkJXAotCX07CQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0ICMjIG4gPSB7CQkJCVwKLQkJLm5hbWUgPSAiaW14X2dwdCIsCQkJCQlcCi0JCS5pZCA9IG4sCQkJCQkJXAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodGltZXIgIyMgbiAjIyBfcmVzb3VyY2VzKSwJXAotCQkucmVzb3VyY2UgPSB0aW1lciAjIyBuICMjIF9yZXNvdXJjZXMsCQkJXAotCX0KLQotLyogV2UgdXNlIGdwdDEgYXMgc3lzdGVtIHRpbWVyLCBzbyBkbyBub3QgYWRkIGEgZGV2aWNlIGZvciB0aGlzIG9uZSAqLwotREVGSU5FX0lNWF9HUFRfREVWSUNFKDEsIE1YMnhfR1BUMl9CQVNFX0FERFIsIE1YMnhfSU5UX0dQVDIpOwotREVGSU5FX0lNWF9HUFRfREVWSUNFKDIsIE1YMnhfR1BUM19CQVNFX0FERFIsIE1YMnhfSU5UX0dQVDMpOwotCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotREVGSU5FX0lNWF9HUFRfREVWSUNFKDMsIE1YMjdfR1BUNF9CQVNFX0FERFIsIE1YMjdfSU5UX0dQVDQpOwotREVGSU5FX0lNWF9HUFRfREVWSUNFKDQsIE1YMjdfR1BUNV9CQVNFX0FERFIsIE1YMjdfSU5UX0dQVDUpOwotREVGSU5FX0lNWF9HUFRfREVWSUNFKDUsIE1YMjdfR1BUNl9CQVNFX0FERFIsIE1YMjdfSU5UX0dQVDYpOwotI2VuZGlmCi0KLS8qIFdhdGNoZG9nOiBpLk1YMSBoYXMgc2VwZXJhdGUgZHJpdmVyLCBpLk1YMjEgYW5kIGkuTVgyNyBhcmUgZXF1YWwgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3dkdF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IE1YMnhfV0RPR19CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDJ4X1dET0dfQkFTRV9BRERSICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfd2R0ID0gewotCS5uYW1lID0gImlteDItd2R0IiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfd2R0X3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX3dkdF9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y193MV9tYXN0ZXJfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDJ4X09XSVJFX0JBU0VfQUREUiwKLQkJLmVuZCA9IE1YMnhfT1dJUkVfQkFTRV9BRERSICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdzFfbWFzdGVyX2RldmljZSA9IHsKLQkubmFtZSA9ICJteGNfdzEiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y193MV9tYXN0ZXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBteGNfdzFfbWFzdGVyX3Jlc291cmNlcywKLX07Ci0KLSNkZWZpbmUgREVGSU5FX01YQ19OQU5EX0RFVklDRShwZngsIGJhc2VhZGRyLCBpcnEpCQkJXAotCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGZ4ICMjIF9uYW5kX3Jlc291cmNlc1tdID0gewkJXAotCQl7CQkJCQkJCVwKLQkJCS5zdGFydCA9IGJhc2VhZGRyLAkJCQlcCi0JCQkuZW5kID0gYmFzZWFkZHIgKyBTWl80SyAtIDEsCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCQkJXAotCQl9LCB7CQkJCQkJCVwKLQkJCS5zdGFydCA9IGlycSwJCQkJCVwKLQkJCS5lbmQgPSBpcnEsCQkJCQlcCi0JCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwJCQlcCi0JCX0sCQkJCQkJCVwKLQl9OwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGZ4ICMjIF9uYW5kX2RldmljZSA9IHsJCQlcCi0JCS5uYW1lID0gIm14Y19uYW5kIiwJCQkJCVwKLQkJLmlkID0gMCwJCQkJCQlcCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShwZnggIyMgX25hbmRfcmVzb3VyY2VzKSwJXAotCQkucmVzb3VyY2UgPSBwZnggIyMgX25hbmRfcmVzb3VyY2VzLAkJCVwKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTUFDSF9NWDIxCi1ERUZJTkVfTVhDX05BTkRfREVWSUNFKGlteDIxLCBNWDIxX05GQ19CQVNFX0FERFIsIE1YMjFfSU5UX05BTkRGQyk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NQUNIX01YMjcKLURFRklORV9NWENfTkFORF9ERVZJQ0UoaW14MjcsIE1YMjdfTkZDX0JBU0VfQUREUiwgTVgyN19JTlRfTkFOREZDKTsKLSNlbmRpZgotCi0vKgotICogbGNkYzoKLSAqIC0gaS5NWDE6IHRoZSBiYXNpYyBjb250cm9sbGVyCi0gKiAtIGkuTVgyMTogdG8gYmUgY2hlY2tlZAotICogLSBpLk1YMjc6IGxpa2UgaS5NWDEsIHdpdGggc2xpZ2h0bHkgdmFyaWF0aW9ucwotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19mYltdID0gewotCXsKLQkJLnN0YXJ0ID0gTVgyeF9MQ0RDX0JBU0VfQUREUiwKLQkJLmVuZCA9IE1YMnhfTENEQ19CQVNFX0FERFIgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVgyeF9JTlRfTENEQywKLQkJLmVuZCA9IE1YMnhfSU5UX0xDREMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLS8qIG14YyBsY2QgZHJpdmVyICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19mYl9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAiaW14LWZiIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfZmIpLAotCS5yZXNvdXJjZSA9IG14Y19mYiwKLQkuZGV2ID0gewotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfZmVjX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ID0gTVgyN19GRUNfQkFTRV9BRERSLAotCQkuZW5kID0gTVgyN19GRUNfQkFTRV9BRERSICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YMjdfSU5UX0ZFQywKLQkJLmVuZCA9IE1YMjdfSU5UX0ZFQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2ZlY19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAiZmVjIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfZmVjX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX2ZlY19yZXNvdXJjZXMsCi19OwotI2VuZGlmCi0KLSNkZWZpbmUgREVGSU5FX0lNWF9JMkNfREVWSUNFKG4sIGJhc2VhZGRyLCBpcnEpCQkJCVwKLQlzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19pMmNfcmVzb3VyY2VzICMjIG5bXSA9IHsJCVwKLQkJewkJCQkJCQlcCi0JCQkuc3RhcnQgPSBiYXNlYWRkciwJCQkJXAotCQkJLmVuZCA9IGJhc2VhZGRyICsgU1pfNEsgLSAxLAkJCVwKLQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAkJCVwKLQkJfSwgewkJCQkJCQlcCi0JCQkuc3RhcnQgPSBpcnEsCQkJCQlcCi0JCQkuZW5kID0gaXJxLAkJCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCQkJXAotCQl9CQkJCQkJCVwKLQl9OwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2kyY19kZXZpY2UgIyMgbiA9IHsJCQlcCi0JCS5uYW1lID0gImlteC1pMmMiLAkJCQkJXAotCQkuaWQgPSBuLAkJCQkJCVwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19pMmNfcmVzb3VyY2VzICMjIG4pLAlcCi0JCS5yZXNvdXJjZSA9IG14Y19pMmNfcmVzb3VyY2VzICMjIG4sCQkJXAotCX0KLQotREVGSU5FX0lNWF9JMkNfREVWSUNFKDAsIE1YMnhfSTJDX0JBU0VfQUREUiwgTVgyeF9JTlRfSTJDKTsKLQotI2lmZGVmIENPTkZJR19NQUNIX01YMjcKLURFRklORV9JTVhfSTJDX0RFVklDRSgxLCBNWDI3X0kyQzJfQkFTRV9BRERSLCBNWDI3X0lOVF9JMkMyKTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19wd21fcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDJ4X1BXTV9CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDJ4X1BXTV9CQVNFX0FERFIgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVgyeF9JTlRfUFdNLAotCQkuZW5kID0gTVgyeF9JTlRfUFdNLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19wd21fZGV2aWNlID0gewotCS5uYW1lID0gIm14Y19wd20iLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19wd21fcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBteGNfcHdtX3Jlc291cmNlcywKLX07Ci0KLSNkZWZpbmUgREVGSU5FX01YQ19NTUNfREVWSUNFKG4sIGJhc2VhZGRyLCBpcnEsIGRtYXJlcSkJCQlcCi0Jc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfc2RoY19yZXNvdXJjZXMgIyMgbltdID0gewkJXAotCQl7CQkJCQkJCVwKLQkJCS5zdGFydCA9IGJhc2VhZGRyLAkJCQlcCi0JCQkuZW5kID0gYmFzZWFkZHIgKyBTWl80SyAtIDEsCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCQkJXAotCQl9LCB7CQkJCQkJCVwKLQkJCS5zdGFydCA9IGlycSwJCQkJCVwKLQkJCS5lbmQgPSBpcnEsCQkJCQlcCi0JCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwJCQlcCi0JCX0sIHsJCQkJCQkJXAotCQkJLnN0YXJ0ID0gZG1hcmVxLAkJCQlcCi0JCQkuZW5kID0gZG1hcmVxLAkJCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCQkJXAotCQl9LAkJCQkJCQlcCi0JfTsJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlzdGF0aWMgdTY0IG14Y19zZGhjICMjIG4gIyMgX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwlcCi0JCQkJCQkJCQlcCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc2RoY19kZXZpY2UgIyMgbiA9IHsJCQlcCi0JCS5uYW1lID0gIm14Yy1tbWMiLAkJCQkJXAotCQkuaWQgPSBuLAkJCQkJCVwKLQkJLmRldiA9IHsJCQkJCQlcCi0JCQkuZG1hX21hc2sgPSAmbXhjX3NkaGMgIyMgbiAjIyBfZG1hbWFzaywJCVwKLQkJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCQlcCi0JCX0sCQkJCQkJCVwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19zZGhjX3Jlc291cmNlcyAjIyBuKSwJXAotCQkucmVzb3VyY2UgPSBteGNfc2RoY19yZXNvdXJjZXMgIyMgbiwJCVwKLQl9Ci0KLURFRklORV9NWENfTU1DX0RFVklDRSgwLCBNWDJ4X1NESEMxX0JBU0VfQUREUiwgTVgyeF9JTlRfU0RIQzEsIE1YMnhfRE1BX1JFUV9TREhDMSk7Ci1ERUZJTkVfTVhDX01NQ19ERVZJQ0UoMSwgTVgyeF9TREhDMl9CQVNFX0FERFIsIE1YMnhfSU5UX1NESEMyLCBNWDJ4X0RNQV9SRVFfU0RIQzIpOwotCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvdGdfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDI3X1VTQk9UR19CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDI3X1VTQk9UR19CQVNFX0FERFIgKyAweDFmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgPSBNWDI3X0lOVF9VU0IzLAotCQkuZW5kID0gTVgyN19JTlRfVVNCMywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyB1NjQgb3RnX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi0vKiBPVEcgZ2FkZ2V0IGRldmljZSAqLwotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfb3RnX3VkY19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImZzbC11c2IyLXVkYyIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJm90Z19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi0JLnJlc291cmNlCT0gb3RnX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob3RnX3Jlc291cmNlcyksCi19OwotCi0vKiBPVEcgaG9zdCAqLwotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfb3RnX2hvc3QgPSB7Ci0JLm5hbWUgPSAibXhjLWVoY2kiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKLQkJLmRtYV9tYXNrID0gJm90Z19kbWFtYXNrLAotCX0sCi0JLnJlc291cmNlID0gb3RnX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUob3RnX3Jlc291cmNlcyksCi19OwotCi0vKiBVU0IgaG9zdCAxICovCi0KLXN0YXRpYyB1NjQgdXNiaDFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3VzYmgxX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ID0gTVgyN19VU0JPVEdfQkFTRV9BRERSICsgMHgyMDAsCi0JCS5lbmQgPSBNWDI3X1VTQk9UR19CQVNFX0FERFIgKyAweDNmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgPSBNWDI3X0lOVF9VU0IxLAotCQkuZW5kID0gTVgyN19JTlRfVVNCMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgxID0gewotCS5uYW1lID0gIm14Yy1laGNpIiwKLQkuaWQgPSAxLAotCS5kZXYgPSB7Ci0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JCS5kbWFfbWFzayA9ICZ1c2JoMV9kbWFtYXNrLAotCX0sCi0JLnJlc291cmNlID0gbXhjX3VzYmgxX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX3VzYmgxX3Jlc291cmNlcyksCi19OwotCi0vKiBVU0IgaG9zdCAyICovCi1zdGF0aWMgdTY0IHVzYmgyX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y191c2JoMl9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IE1YMjdfVVNCT1RHX0JBU0VfQUREUiArIDB4NDAwLAotCQkuZW5kID0gTVgyN19VU0JPVEdfQkFTRV9BRERSICsgMHg1ZmYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVgyN19JTlRfVVNCMiwKLQkJLmVuZCA9IE1YMjdfSU5UX1VTQjIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMiA9IHsKLQkubmFtZSA9ICJteGMtZWhjaSIsCi0JLmlkID0gMiwKLQkuZGV2ID0gewotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCQkuZG1hX21hc2sgPSAmdXNiaDJfZG1hbWFzaywKLQl9LAotCS5yZXNvdXJjZSA9IG14Y191c2JoMl9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y191c2JoMl9yZXNvdXJjZXMpLAotfTsKLSNlbmRpZgotCi0jZGVmaW5lIERFRklORV9JTVhfU1NJX0RNQVJFUyhfbmFtZSwgc3Npbiwgc3VmZml4KQkJCVwKLQl7CQkJCQkJCQlcCi0JCS5uYW1lID0gX25hbWUsCQkJCQkJXAotCQkuc3RhcnQgPSBNWDJ4X0RNQV9SRVFfU1NJICMjIHNzaW4gIyMgXyAjIyBzdWZmaXgsCVwKLQkJLmVuZCA9IE1YMnhfRE1BX1JFUV9TU0kgIyMgc3NpbiAjIyBfICMjIHN1ZmZpeCwJCVwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCQkJCVwKLQl9Ci0KLSNkZWZpbmUgREVGSU5FX0lNWF9TU0lfREVWSUNFKG4sIHNzaW4sIGJhc2VhZGRyLCBpcnEpCQkJXAotCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3NzaV9yZXNvdXJjZXMgIyMgbltdID0gewkJXAotCQl7CQkJCQkJCVwKLQkJCS5zdGFydCA9IE1YMnhfU1NJICMjIHNzaW4gIyMgX0JBU0VfQUREUiwJXAotCQkJLmVuZCA9IE1YMnhfU1NJICMjIHNzaW4gIyMgX0JBU0VfQUREUiArIDB4NmYsCVwKLQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAkJCVwKLQkJfSwgewkJCQkJCQlcCi0JCQkuc3RhcnQgPSBNWDJ4X0lOVF9TU0kxLAkJCQlcCi0JCQkuZW5kID0gTVgyeF9JTlRfU1NJMSwJCQkJXAotCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCQkJXAotCQl9LAkJCQkJCQlcCi0JCURFRklORV9JTVhfU1NJX0RNQVJFUygidHgwIiwgc3NpbiwgVFgwKSwJCVwKLQkJREVGSU5FX0lNWF9TU0lfRE1BUkVTKCJyeDAiLCBzc2luLCBSWDApLAkJXAotCQlERUZJTkVfSU1YX1NTSV9ETUFSRVMoInR4MSIsIHNzaW4sIFRYMSksCQlcCi0JCURFRklORV9JTVhfU1NJX0RNQVJFUygicngxIiwgc3NpbiwgUlgxKSwJCVwKLQl9OwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3NzaV9kZXZpY2UgIyMgbiA9IHsJCQlcCi0JCS5uYW1lID0gImlteC1zc2kiLAkJCQkJXAotCQkuaWQgPSBuLAkJCQkJCVwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGlteF9zc2lfcmVzb3VyY2VzICMjIG4pLAlcCi0JCS5yZXNvdXJjZSA9IGlteF9zc2lfcmVzb3VyY2VzICMjIG4sCQkJXAotCX0KLQotREVGSU5FX0lNWF9TU0lfREVWSUNFKDAsIDEsIE1YMnhfU1NJMV9CQVNFX0FERFIsIE1YMnhfSU5UX1NTSTEpOwotREVGSU5FX0lNWF9TU0lfREVWSUNFKDEsIDIsIE1YMnhfU1NJMV9CQVNFX0FERFIsIE1YMnhfSU5UX1NTSTEpOwotCi0vKiBHUElPIHBvcnQgZGVzY3JpcHRpb24gKi8KLSNkZWZpbmUgREVGSU5FX01YQ19HUElPX1BPUlRfSVJRKFNPQywgbiwgX2lycSkJCQkJXAotCXsJCQkJCQkJCVwKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby0iICNuLAkJCQlcCi0JCS5pcnEgPSBfaXJxLAkJCQkJCVwKLQkJLmJhc2UgPSBTT0MgIyMgX0lPX0FERFJFU1MoTVgyeF9HUElPX0JBU0VfQUREUiArCVwKLQkJCQluICogMHgxMDApLAkJCQlcCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIG4gKiAzMiwJXAotCX0KLQotI2RlZmluZSBERUZJTkVfTVhDX0dQSU9fUE9SVChTT0MsIG4pCQkJCQlcCi0JewkJCQkJCQkJXAotCQkuY2hpcC5sYWJlbCA9ICJncGlvLSIgI24sCQkJCVwKLQkJLmJhc2UgPSBTT0MgIyMgX0lPX0FERFJFU1MoTVgyeF9HUElPX0JBU0VfQUREUiArCVwKLQkJCQluICogMHgxMDApLAkJCQlcCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIG4gKiAzMiwJXAotCX0KLQotI2RlZmluZSBERUZJTkVfTVhDX0dQSU9fUE9SVFMoU09DLCBwZngpCQkJCQlcCi0Jc3RhdGljIHN0cnVjdCBteGNfZ3Bpb19wb3J0IHBmeCAjIyBfZ3Bpb19wb3J0c1tdID0gewkJXAotCQlERUZJTkVfTVhDX0dQSU9fUE9SVF9JUlEoU09DLCAwLCBTT0MgIyMgX0lOVF9HUElPKSwJXAotCQlERUZJTkVfTVhDX0dQSU9fUE9SVChTT0MsIDEpLAkJCQlcCi0JCURFRklORV9NWENfR1BJT19QT1JUKFNPQywgMiksCQkJCVwKLQkJREVGSU5FX01YQ19HUElPX1BPUlQoU09DLCAzKSwJCQkJXAotCQlERUZJTkVfTVhDX0dQSU9fUE9SVChTT0MsIDQpLAkJCQlcCi0JCURFRklORV9NWENfR1BJT19QT1JUKFNPQywgNSksCQkJCVwKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTUFDSF9NWDIxCi1ERUZJTkVfTVhDX0dQSU9fUE9SVFMoTVgyMSwgaW14MjEpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUFDSF9NWDI3Ci1ERUZJTkVfTVhDX0dQSU9fUE9SVFMoTVgyNywgaW14MjcpOwotI2VuZGlmCi0KLWludCBfX2luaXQgbXhjX3JlZ2lzdGVyX2dwaW9zKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX01BQ0hfTVgyMQotCWlmIChjcHVfaXNfbXgyMSgpKQotCQlyZXR1cm4gbXhjX2dwaW9faW5pdChpbXgyMV9ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKGlteDIxX2dwaW9fcG9ydHMpKTsKLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTUFDSF9NWDI3Ci0JaWYgKGNwdV9pc19teDI3KCkpCi0JCXJldHVybiBteGNfZ3Bpb19pbml0KGlteDI3X2dwaW9fcG9ydHMsIEFSUkFZX1NJWkUoaW14MjdfZ3Bpb19wb3J0cykpOwotCWVsc2UKLSNlbmRpZgotCQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19NQUNIX01YMjEKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXgyMV91c2JoY19yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IE1YMjFfVVNCT1RHX0JBU0VfQUREUiwKLQkJLmVuZAk9IE1YMjFfVVNCT1RHX0JBU0VfQUREUiArIFNaXzhLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydAkJPSBNWDIxX0lOVF9VU0JIT1NULAotCQkuZW5kCQk9IE1YMjFfSU5UX1VTQkhPU1QsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDIxX3VzYmhjX2RldmljZSA9IHsKLQkubmFtZQkJPSAiaW14MjEtaGNkIiwKLQkuaWQJCT0gMCwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrID0gJm14MjFfdXNiaGNfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShteDIxX3VzYmhjX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gbXgyMV91c2JoY19yZXNvdXJjZXMsCi19OwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlZDUxMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0MTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19ncHQyOwotI2lmZGVmIENPTkZJR19NQUNIX01YMjcKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19ncHQzOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2dwdDQ7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0NTsKLSNlbmRpZgotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3dkdDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTM7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2U0OwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlNTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y193MV9tYXN0ZXJfZGV2aWNlOwotI2lmZGVmIENPTkZJR19NQUNIX01YMjEKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteDIxX25hbmRfZGV2aWNlOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14MjdfbmFuZF9kZXZpY2U7Ci0jZW5kaWYKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19mYl9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZmVjX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19wd21fZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2kyY19kZXZpY2UwOwotI2lmZGVmIENPTkZJR19NQUNIX01YMjcKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pMmNfZGV2aWNlMTsKLSNlbmRpZgotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NkaGNfZGV2aWNlMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19zZGhjX2RldmljZTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfb3RnX3VkY19kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfb3RnX2hvc3Q7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDI7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZTE7Ci0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UyOwotI2VuZGlmCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDIxX3VzYmhjX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9zc2lfZGV2aWNlMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9zc2lfZGV2aWNlMTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2V1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1teDIvZXVrcmVhX21iaW14MjctYmFzZWJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjE2OWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvZXVrcmVhX21iaW14MjctYmFzZWJvYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBFcmljIEJlbmFyZCAtIGVyaWNAZXVrcmVhLmNvbQotICoKLSAqIEJhc2VkIG9uIHBjbTk3MC1iYXNlYm9hcmQuYyB3aGljaCBpcyA6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0IChrZXJuZWxAcGVuZ3V0cm9uaXguZGUpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLQotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC1teDI3Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXhmYi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL21tYy5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KLQotI2luY2x1ZGUgImRldmljZXMuaCIKLQotc3RhdGljIGludCBldWtyZWFfbWJpbXgyN19waW5zW10gPSB7Ci0JLyogVUFSVDIgKi8KLQlQRTNfUEZfVUFSVDJfQ1RTLAotCVBFNF9QRl9VQVJUMl9SVFMsCi0JUEU2X1BGX1VBUlQyX1RYRCwKLQlQRTdfUEZfVUFSVDJfUlhELAotCS8qIFVBUlQzICovCi0JUEU4X1BGX1VBUlQzX1RYRCwKLQlQRTlfUEZfVUFSVDNfUlhELAotCVBFMTBfUEZfVUFSVDNfQ1RTLAotCVBFMTFfUEZfVUFSVDNfUlRTLAotCS8qIFVBUlQ0ICovCi0JUEIyNl9BRl9VQVJUNF9SVFMsCi0JUEIyOF9BRl9VQVJUNF9UWEQsCi0JUEIyOV9BRl9VQVJUNF9DVFMsCi0JUEIzMV9BRl9VQVJUNF9SWEQsCi0JLyogU0RIQzEqLwotCVBFMThfUEZfU0QxX0QwLAotCVBFMTlfUEZfU0QxX0QxLAotCVBFMjBfUEZfU0QxX0QyLAotCVBFMjFfUEZfU0QxX0QzLAotCVBFMjJfUEZfU0QxX0NNRCwKLQlQRTIzX1BGX1NEMV9DTEssCi0JLyogZGlzcGxheSAqLwotCVBBNV9QRl9MU0NMSywKLQlQQTZfUEZfTEQwLAotCVBBN19QRl9MRDEsCi0JUEE4X1BGX0xEMiwKLQlQQTlfUEZfTEQzLAotCVBBMTBfUEZfTEQ0LAotCVBBMTFfUEZfTEQ1LAotCVBBMTJfUEZfTEQ2LAotCVBBMTNfUEZfTEQ3LAotCVBBMTRfUEZfTEQ4LAotCVBBMTVfUEZfTEQ5LAotCVBBMTZfUEZfTEQxMCwKLQlQQTE3X1BGX0xEMTEsCi0JUEExOF9QRl9MRDEyLAotCVBBMTlfUEZfTEQxMywKLQlQQTIwX1BGX0xEMTQsCi0JUEEyMV9QRl9MRDE1LAotCVBBMjJfUEZfTEQxNiwKLQlQQTIzX1BGX0xEMTcsCi0JUEEyOF9QRl9IU1lOQywKLQlQQTI5X1BGX1ZTWU5DLAotCVBBMzBfUEZfQ09OVFJBU1QsCi0JUEEzMV9QRl9PRV9BQ0QsCi0JLyogU1BJMSAqLwotCVBEMjhfUEZfQ1NQSTFfU1MwLAotCVBEMjlfUEZfQ1NQSTFfU0NMSywKLQlQRDMwX1BGX0NTUEkxX01JU08sCi0JUEQzMV9QRl9DU1BJMV9NT1NJLAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXSA9IHsKLQl7Ci0JCS5uYW1lCQkJPSAibGVkMSIsCi0JCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmdwaW8JCQk9IEdQSU9fUE9SVEYgfCAxNiwKLQl9LAotCXsKLQkJLm5hbWUJCQk9ICJsZWQyIiwKLQkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJub25lIiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmdwaW8JCQk9IEdQSU9fUE9SVEYgfCAxOSwKLQl9LAotCXsKLQkJLm5hbWUJCQk9ICJiYWNrbGlnaHQiLAotCQkuZGVmYXVsdF90cmlnZ2VyCT0gImJhY2tsaWdodCIsCi0JCS5hY3RpdmVfbG93CQk9IDAsCi0JCS5ncGlvCQkJPSBHUElPX1BPUlRFIHwgNSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGdwaW9fbGVkX2luZm8gPSB7Ci0JLmxlZHMJCT0gZ3Bpb19sZWRzLAotCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoZ3Bpb19sZWRzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxlZHNfZ3BpbyA9IHsKLQkubmFtZQk9ICJsZWRzLWdwaW8iLAotCS5pZAk9IC0xLAotCS5kZXYJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmdwaW9fbGVkX2luZm8sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14X2ZiX3ZpZGVvbW9kZSBldWtyZWFfbWJpbXgyN19tb2Rlc1tdID0gewotCXsKLQkJLm1vZGUgPSB7Ci0JCQkubmFtZQkJPSAiQ01PLVFHVkEiLAotCQkJLnJlZnJlc2gJPSA2MCwKLQkJCS54cmVzCQk9IDMyMCwKLQkJCS55cmVzCQk9IDI0MCwKLQkJCS5waXhjbG9jawk9IDE1NjAwMCwKLQkJCS5oc3luY19sZW4JPSAzMCwKLQkJCS5sZWZ0X21hcmdpbgk9IDM4LAotCQkJLnJpZ2h0X21hcmdpbgk9IDIwLAotCQkJLnZzeW5jX2xlbgk9IDMsCi0JCQkudXBwZXJfbWFyZ2luCT0gMTUsCi0JCQkubG93ZXJfbWFyZ2luCT0gNCwKLQkJfSwKLQkJLnBjcgkJPSAweEZBRDA4QjgwLAotCQkuYnBwCQk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGlteF9mYl9wbGF0Zm9ybV9kYXRhIGV1a3JlYV9tYmlteDI3X2ZiX2RhdGEgPSB7Ci0JLm1vZGUgPSBldWtyZWFfbWJpbXgyN19tb2RlcywKLQkubnVtX21vZGVzID0gQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19tb2RlcyksCi0KLQkucHdtcgkJPSAweDAwQTkwM0ZGLAotCS5sc2NyMQkJPSAweDAwMTIwMzAwLAotCS5kbWFjcgkJPSAweDAwMDQwMDYwLAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YVtdID0gewotCXsKLQkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLQl9LAotCXsKLQkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLQl9LAotfTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYpCi0JfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nl9NT0RVTEUpCi0KLSNkZWZpbmUgQURTNzg0Nl9QRU5ET1dOIChHUElPX1BPUlREIHwgMjUpCi0KLXN0YXRpYyB2b2lkIGFkczc4NDZfZGV2X2luaXQodm9pZCkKLXsKLQlpZiAoZ3Bpb19yZXF1ZXN0KEFEUzc4NDZfUEVORE9XTiwgIkFEUzc4NDYgcGVuZG93biIpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGdldCBhZHM3NDYgcGVuIGRvd24gR1BJT1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlncGlvX2RpcmVjdGlvbl9pbnB1dChBRFM3ODQ2X1BFTkRPV04pOwotfQotCi1zdGF0aWMgaW50IGFkczc4NDZfZ2V0X3BlbmRvd25fc3RhdGUodm9pZCkKLXsKLQlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKEFEUzc4NDZfUEVORE9XTik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIGFkczc4NDZfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLmdldF9wZW5kb3duX3N0YXRlCT0gYWRzNzg0Nl9nZXRfcGVuZG93bl9zdGF0ZSwKLQkua2VlcF92cmVmX29uCQk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGV1a3JlYV9tYmlteDI3X3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKLQlbMF0gPSB7Ci0JCS5tb2RhbGlhcwk9ICJhZHM3ODQ2IiwKLQkJLmJ1c19udW0JPSAwLAotCQkuY2hpcF9zZWxlY3QJPSAwLAotCQkubWF4X3NwZWVkX2h6CT0gMTUwMDAwMCwKLQkJLmlycQkJPSBJUlFfR1BJT0QoMjUpLAotCQkucGxhdGZvcm1fZGF0YQk9ICZhZHM3ODQ2X2NvbmZpZywKLQkJLm1vZGUgICAgICAgICAgID0gU1BJX01PREVfMiwKLQl9LAotfTsKLQotc3RhdGljIGludCBldWtyZWFfbWJpbXgyN19zcGlfY3NbXSA9IHtHUElPX1BPUlREIHwgMjh9OwotCi1zdGF0aWMgc3RydWN0IHNwaV9pbXhfbWFzdGVyIGV1a3JlYV9tYmlteDI3X3NwaV8wX2RhdGEgPSB7Ci0JLmNoaXBzZWxlY3QJPSBldWtyZWFfbWJpbXgyN19zcGlfY3MsCi0JLm51bV9jaGlwc2VsZWN0ID0gQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19zcGlfY3MpLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmxlZHNfZ3BpbywKLX07Ci0KLS8qCi0gKiBzeXN0ZW0gaW5pdCBmb3IgYmFzZWJvYXJkIHVzYWdlLiBXaWxsIGJlIGNhbGxlZCBieSBjcHVpbXgyNyBpbml0LgotICoKLSAqIEFkZCBwbGF0Zm9ybSBkZXZpY2VzIHByZXNlbnQgb24gdGhpcyBiYXNlYm9hcmQgYW5kIGluaXQKLSAqIHRoZW0gZnJvbSBDUFUgc2lkZSBhcyBmYXIgYXMgcmVxdWlyZWQgdG8gdXNlIHRoZW0gbGF0ZXIgb24KLSAqLwotdm9pZCBfX2luaXQgZXVrcmVhX21iaW14MjdfYmFzZWJvYXJkX2luaXQodm9pZCkKLXsKLQlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKGV1a3JlYV9tYmlteDI3X3BpbnMsCi0JCUFSUkFZX1NJWkUoZXVrcmVhX21iaW14MjdfcGlucyksICJNQklNWDI3Iik7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UxLCAmdWFydF9wZGF0YVswXSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMiwgJnVhcnRfcGRhdGFbMV0pOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2ZiX2RldmljZSwgJmV1a3JlYV9tYmlteDI3X2ZiX2RhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTAsIE5VTEwpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NikKLQl8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2X01PRFVMRSkKLQkvKiBTUEkgYW5kIEFEUzc4NDYgVG91Y2hzY3JlZW4gY29udHJvbGVyIGluaXQgKi8KLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEQgfCAyOCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsKLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEQgfCAyNSB8IEdQSU9fR1BJTyB8IEdQSU9fSU4pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zcGlfZGV2aWNlMCwgJmV1a3JlYV9tYmlteDI3X3NwaV8wX2RhdGEpOwotCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGV1a3JlYV9tYmlteDI3X3NwaV9ib2FyZF9pbmZvLAotCQkJQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19zcGlfYm9hcmRfaW5mbykpOwotCWFkczc4NDZfZGV2X2luaXQoKTsKLSNlbmRpZgotCi0JLyogTGVkcyBjb25maWd1cmF0aW9uICovCi0JbXhjX2dwaW9fbW9kZShHUElPX1BPUlRGIHwgMTYgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7Ci0JbXhjX2dwaW9fbW9kZShHUElPX1BPUlRGIHwgMTkgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7Ci0JLyogQmFja2xpZ2h0ICovCi0JbXhjX2dwaW9fbW9kZShHUElPX1BPUlRFIHwgNSB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsKLQotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1jcHVpbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1jcHVpbXgyNy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjYxNmRjYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLWNwdWlteDI3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBFcmljIEJlbmFyZCAtIGVyaWNAZXVrcmVhLmNvbQotICoKLSAqIEJhc2VkIG9uIHBjbTAzOC5jIHdoaWNoIGlzIDoKLSAqIENvcHlyaWdodCAyMDA3IFJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0IChrZXJuZWxAcGVuZ3V0cm9uaXguZGUpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9ib2FyZC1ldWtyZWFfY3B1aW14MjcuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNy5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KLSNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+Ci0KLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLXN0YXRpYyBpbnQgZXVrcmVhX2NwdWlteDI3X3BpbnNbXSA9IHsKLQkvKiBVQVJUMSAqLwotCVBFMTJfUEZfVUFSVDFfVFhELAotCVBFMTNfUEZfVUFSVDFfUlhELAotCVBFMTRfUEZfVUFSVDFfQ1RTLAotCVBFMTVfUEZfVUFSVDFfUlRTLAotCS8qIFVBUlQ0ICovCi0JUEIyNl9BRl9VQVJUNF9SVFMsCi0JUEIyOF9BRl9VQVJUNF9UWEQsCi0JUEIyOV9BRl9VQVJUNF9DVFMsCi0JUEIzMV9BRl9VQVJUNF9SWEQsCi0JLyogRkVDICovCi0JUEQwX0FJTl9GRUNfVFhEMCwKLQlQRDFfQUlOX0ZFQ19UWEQxLAotCVBEMl9BSU5fRkVDX1RYRDIsCi0JUEQzX0FJTl9GRUNfVFhEMywKLQlQRDRfQU9VVF9GRUNfUlhfRVIsCi0JUEQ1X0FPVVRfRkVDX1JYRDEsCi0JUEQ2X0FPVVRfRkVDX1JYRDIsCi0JUEQ3X0FPVVRfRkVDX1JYRDMsCi0JUEQ4X0FGX0ZFQ19NRElPLAotCVBEOV9BSU5fRkVDX01EQywKLQlQRDEwX0FPVVRfRkVDX0NSUywKLQlQRDExX0FPVVRfRkVDX1RYX0NMSywKLQlQRDEyX0FPVVRfRkVDX1JYRDAsCi0JUEQxM19BT1VUX0ZFQ19SWF9EViwKLQlQRDE0X0FPVVRfRkVDX1JYX0NMSywKLQlQRDE1X0FPVVRfRkVDX0NPTCwKLQlQRDE2X0FJTl9GRUNfVFhfRVIsCi0JUEYyM19BSU5fRkVDX1RYX0VOLAotCS8qIEkyQzEgKi8KLQlQRDE3X1BGX0kyQ19EQVRBLAotCVBEMThfUEZfSTJDX0NMSywKLQkvKiBTREhDMiAqLwotCVBCNF9QRl9TRDJfRDAsCi0JUEI1X1BGX1NEMl9EMSwKLQlQQjZfUEZfU0QyX0QyLAotCVBCN19QRl9TRDJfRDMsCi0JUEI4X1BGX1NEMl9DTUQsCi0JUEI5X1BGX1NEMl9DTEssCi0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKLQkvKiBRdWFkIFVBUlQncyBJUlEgKi8KLQlHUElPX1BPUlREIHwgMjIgfCBHUElPX0dQSU8gfCBHUElPX0lOLAotCUdQSU9fUE9SVEQgfCAyMyB8IEdQSU9fR1BJTyB8IEdQSU9fSU4sCi0JR1BJT19QT1JURCB8IDI3IHwgR1BJT19HUElPIHwgR1BJT19JTiwKLQlHUElPX1BPUlREIHwgMzAgfCBHUElPX0dQSU8gfCBHUElPX0lOLAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBldWtyZWFfY3B1aW14MjdfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGggPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBldWtyZWFfY3B1aW14MjdfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0ID0gMHhjMDAwMDAwMCwKLQkuZW5kICAgPSAweGMzZmZmZmZmLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXVrcmVhX2NwdWlteDI3X25vcl9tdGRfZGV2aWNlID0gewotCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAotCS5pZCA9IDAsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmZXVrcmVhX2NwdWlteDI3X2ZsYXNoX2RhdGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlID0gJmV1a3JlYV9jcHVpbXgyN19mbGFzaF9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGFbXSA9IHsKLQl7Ci0JCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi0JfSwgewotCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEgZXVrcmVhX2NwdWlteDI3X25hbmRfYm9hcmRfaW5mbyA9IHsKLQkud2lkdGggPSAxLAotCS5od19lY2MgPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZldWtyZWFfY3B1aW14Mjdfbm9yX210ZF9kZXZpY2UsCi0JJm14Y19mZWNfZGV2aWNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBldWtyZWFfY3B1aW14MjdfaTJjXzFfZGF0YSA9IHsKLQkuYml0cmF0ZSA9IDEwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZXVrcmVhX2NwdWlteDI3X2kyY19kZXZpY2VzW10gPSB7Ci0JewotCQlJMkNfQk9BUkRfSU5GTygicGNmODU2MyIsIDB4NTEpLAotCX0sCi19OwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKLQl7Ci0JCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YMjdfQ1MzX0JBU0VfQUREUiArIDB4MjAwMDAwKSwKLQkJLmlycSA9IElSUV9HUElPQigyMyksCi0JCS51YXJ0Y2xrID0gMTQ3NDU2MDAsCi0JCS5yZWdzaGlmdCA9IDEsCi0JCS5pb3R5cGUgPSBVUElPX01FTSwKLQkJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX0lPUkVNQVAsCi0JfSwgewotCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDI3X0NTM19CQVNFX0FERFIgKyAweDQwMDAwMCksCi0JCS5pcnEgPSBJUlFfR1BJT0IoMjIpLAotCQkudWFydGNsayA9IDE0NzQ1NjAwLAotCQkucmVnc2hpZnQgPSAxLAotCQkuaW90eXBlID0gVVBJT19NRU0sCi0JCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAotCX0sIHsKLQkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVgyN19DUzNfQkFTRV9BRERSICsgMHg4MDAwMDApLAotCQkuaXJxID0gSVJRX0dQSU9CKDI3KSwKLQkJLnVhcnRjbGsgPSAxNDc0NTYwMCwKLQkJLnJlZ3NoaWZ0ID0gMSwKLQkJLmlvdHlwZSA9IFVQSU9fTUVNLAotCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKLQl9LCB7Ci0JCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YMjdfQ1MzX0JBU0VfQUREUiArIDB4MTAwMDAwMCksCi0JCS5pcnEgPSBJUlFfR1BJT0IoMzApLAotCQkudWFydGNsayA9IDE0NzQ1NjAwLAotCQkucmVnc2hpZnQgPSAxLAotCQkuaW90eXBlID0gVVBJT19NRU0sCi0JCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAotCX0sIHsKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewotCS5uYW1lID0gInNlcmlhbDgyNTAiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDI3X2luaXQodm9pZCkKLXsKLQlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKGV1a3JlYV9jcHVpbXgyN19waW5zLAotCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXgyN19waW5zKSwgIkNQVUlNWDI3Iik7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UwLCAmdWFydF9wZGF0YVswXSk7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXgyN19uYW5kX2RldmljZSwKLQkJCSZldWtyZWFfY3B1aW14MjdfbmFuZF9ib2FyZF9pbmZvKTsKLQotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGV1a3JlYV9jcHVpbXgyN19pMmNfZGV2aWNlcywKLQkJCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXgyN19pMmNfZGV2aWNlcykpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2kyY19kZXZpY2UwLCAmZXVrcmVhX2NwdWlteDI3X2kyY18xX2RhdGEpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VTREhDMikKLQkvKiBTREhDMiBjYW4gYmUgdXNlZCBmb3IgV2lmaSAqLwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTEsIE5VTEwpOwotCS8qIGluIHdoaWNoIGNhc2UgVUFSVDQgaXMgYWxzbyB1c2VkIGZvciBCbHVldG9vdGggKi8KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UzLCAmdWFydF9wZGF0YVsxXSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9NT0RVTEUpCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YMjdfQkFTRUJPQVJECi0JZXVrcmVhX21iaW14MjdfYmFzZWJvYXJkX2luaXQoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDI3X3RpbWVyX2luaXQodm9pZCkKLXsKLQlteDI3X2Nsb2Nrc19pbml0KDI2MDAwMDAwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgZXVrcmVhX2NwdWlteDI3X3RpbWVyID0gewotCS5pbml0ID0gZXVrcmVhX2NwdWlteDI3X3RpbWVyX2luaXQsCi19OwotCi1NQUNISU5FX1NUQVJUKENQVUlNWDI3LCAiRVVLUkVBIENQVUlNWDI3IikKLQkucGh5c19pbyAgICAgICAgPSBNWDI3X0FJUElfQkFTRV9BRERSLAotCS5pb19wZ19vZmZzdCAgICA9ICgoTVgyN19BSVBJX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zICAgID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAotCS5tYXBfaW8gICAgICAgICA9IG14MjdfbWFwX2lvLAotCS5pbml0X2lycSAgICAgICA9IG14MjdfaW5pdF9pcnEsCi0JLmluaXRfbWFjaGluZSAgID0gZXVrcmVhX2NwdWlteDI3X2luaXQsCi0JLnRpbWVyICAgICAgICAgID0gJmV1a3JlYV9jcHVpbXgyN190aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLWlteDI3bGl0ZS5jIGIvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1pbXgyN2xpdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3MTBiZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLWlteDI3bGl0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA3IFJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0IChrZXJuZWxAcGVuZ3V0cm9uaXguZGUpCi0gKiBDb3B5cmlnaHQgMjAwOSBEYW5pZWwgU2NoYWVmZmVyIChkYW5pZWwuc2NoYWVmZmVyQHRpbWVzeXMuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC1teDI3Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC1teDI3bGl0ZS5oPgotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IG14MjdsaXRlX3BpbnNbXSA9IHsKLQkvKiBVQVJUMSAqLwotCVBFMTJfUEZfVUFSVDFfVFhELAotCVBFMTNfUEZfVUFSVDFfUlhELAotCVBFMTRfUEZfVUFSVDFfQ1RTLAotCVBFMTVfUEZfVUFSVDFfUlRTLAotCS8qIEZFQyAqLwotCVBEMF9BSU5fRkVDX1RYRDAsCi0JUEQxX0FJTl9GRUNfVFhEMSwKLQlQRDJfQUlOX0ZFQ19UWEQyLAotCVBEM19BSU5fRkVDX1RYRDMsCi0JUEQ0X0FPVVRfRkVDX1JYX0VSLAotCVBENV9BT1VUX0ZFQ19SWEQxLAotCVBENl9BT1VUX0ZFQ19SWEQyLAotCVBEN19BT1VUX0ZFQ19SWEQzLAotCVBEOF9BRl9GRUNfTURJTywKLQlQRDlfQUlOX0ZFQ19NREMsCi0JUEQxMF9BT1VUX0ZFQ19DUlMsCi0JUEQxMV9BT1VUX0ZFQ19UWF9DTEssCi0JUEQxMl9BT1VUX0ZFQ19SWEQwLAotCVBEMTNfQU9VVF9GRUNfUlhfRFYsCi0JUEQxNF9BT1VUX0ZFQ19SWF9DTEssCi0JUEQxNV9BT1VUX0ZFQ19DT0wsCi0JUEQxNl9BSU5fRkVDX1RYX0VSLAotCVBGMjNfQUlOX0ZFQ19UWF9FTiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgPSB7Ci0JLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbXhjX2ZlY19kZXZpY2UsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXgyN2xpdGVfaW5pdCh2b2lkKQotewotCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXgyN2xpdGVfcGlucywgQVJSQVlfU0laRShteDI3bGl0ZV9waW5zKSwKLQkJImlteDI3bGl0ZSIpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG14MjdsaXRlX3RpbWVyX2luaXQodm9pZCkKLXsKLQlteDI3X2Nsb2Nrc19pbml0KDI2MDAwMDAwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgbXgyN2xpdGVfdGltZXIgPSB7Ci0JLmluaXQJPSBteDI3bGl0ZV90aW1lcl9pbml0LAotfTsKLQotTUFDSElORV9TVEFSVChJTVgyN0xJVEUsICJMb2dpY1BEIGkuTVgyN0xJVEUiKQotCS5waHlzX2lvICAgICAgICA9IE1YMjdfQUlQSV9CQVNFX0FERFIsCi0JLmlvX3BnX29mZnN0ICAgID0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMgICAgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCi0JLm1hcF9pbyAgICAgICAgID0gbXgyN19tYXBfaW8sCi0JLmluaXRfaXJxICAgICAgID0gbXgyN19pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lICAgPSBteDI3bGl0ZV9pbml0LAotCS50aW1lciAgICAgICAgICA9ICZteDI3bGl0ZV90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLW14MjFhZHMuYyBiL2FyY2gvYXJtL21hY2gtbXgyL21hY2gtbXgyMWFkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNlNThkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL21hY2gtbXgyMWFkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KLSNpbmNsdWRlIDxtYWNoL2lteGZiLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC1teDIxLmg+Ci0jaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgotI2luY2x1ZGUgPG1hY2gvbW1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC1teDIxYWRzLmg+Ci0KLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXgyMWFkc19waW5zW10gPSB7Ci0KLQkvKiBDUzg5MDBBICovCi0JKEdQSU9fUE9SVEUgfCBHUElPX0dQSU8gfCBHUElPX0lOIHwgMTEpLAotCi0JLyogVUFSVDEgKi8KLQlQRTEyX1BGX1VBUlQxX1RYRCwKLQlQRTEzX1BGX1VBUlQxX1JYRCwKLQlQRTE0X1BGX1VBUlQxX0NUUywKLQlQRTE1X1BGX1VBUlQxX1JUUywKLQotCS8qIFVBUlQzIChJckRBKSAtIG9ubHkgVFhEIGFuZCBSWEQgKi8KLQlQRThfUEZfVUFSVDNfVFhELAotCVBFOV9QRl9VQVJUM19SWEQsCi0KLQkvKiBVQVJUNCAqLwotCVBCMjZfQUZfVUFSVDRfUlRTLAotCVBCMjhfQUZfVUFSVDRfVFhELAotCVBCMjlfQUZfVUFSVDRfQ1RTLAotCVBCMzFfQUZfVUFSVDRfUlhELAotCi0JLyogTENEQyAqLwotCVBBNV9QRl9MU0NMSywKLQlQQTZfUEZfTEQwLAotCVBBN19QRl9MRDEsCi0JUEE4X1BGX0xEMiwKLQlQQTlfUEZfTEQzLAotCVBBMTBfUEZfTEQ0LAotCVBBMTFfUEZfTEQ1LAotCVBBMTJfUEZfTEQ2LAotCVBBMTNfUEZfTEQ3LAotCVBBMTRfUEZfTEQ4LAotCVBBMTVfUEZfTEQ5LAotCVBBMTZfUEZfTEQxMCwKLQlQQTE3X1BGX0xEMTEsCi0JUEExOF9QRl9MRDEyLAotCVBBMTlfUEZfTEQxMywKLQlQQTIwX1BGX0xEMTQsCi0JUEEyMV9QRl9MRDE1LAotCVBBMjJfUEZfTEQxNiwKLQlQQTI0X1BGX1JFViwgICAgIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KLQlQQTI1X1BGX0NMUywgICAgIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KLQlQQTI2X1BGX1BTLCAgICAgIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KLQlQQTI3X1BGX1NQTF9TUFIsIC8qIFNoYXJwIHBhbmVsIGRlZGljYXRlZCBzaWduYWwgKi8KLQlQQTI4X1BGX0hTWU5DLAotCVBBMjlfUEZfVlNZTkMsCi0JUEEzMF9QRl9DT05UUkFTVCwKLQlQQTMxX1BGX09FX0FDRCwKLQotCS8qIE1NQy9TREhDICovCi0JUEUxOF9QRl9TRDFfRDAsCi0JUEUxOV9QRl9TRDFfRDEsCi0JUEUyMF9QRl9TRDFfRDIsCi0JUEUyMV9QRl9TRDFfRDMsCi0JUEUyMl9QRl9TRDFfQ01ELAotCVBFMjNfUEZfU0QxX0NMSywKLQotCS8qIE5GQyAqLwotCVBGMF9QRl9OUkZCLAotCVBGMV9QRl9ORkNFLAotCVBGMl9QRl9ORldQLAotCVBGM19QRl9ORkNMRSwKLQlQRjRfUEZfTkZBTEUsCi0JUEY1X1BGX05GUkUsCi0JUEY2X1BGX05GV0UsCi0JUEY3X1BGX05GSU8wLAotCVBGOF9QRl9ORklPMSwKLQlQRjlfUEZfTkZJTzIsCi0JUEYxMF9QRl9ORklPMywKLQlQRjExX1BGX05GSU80LAotCVBGMTJfUEZfTkZJTzUsCi0JUEYxM19QRl9ORklPNiwKLQlQRjE0X1BGX05GSU83LAotfTsKLQotLyogQURTJ3MgTk9SIGZsYXNoOiAyeCBBTTI5QkRTMTI4SEU5VktJIG9uIDMyLWJpdCBidXMgKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG14MjFhZHNfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGggPSA0LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDIxYWRzX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydCA9IE1YMjFfQ1MwX0JBU0VfQUREUiwKLQkuZW5kID0gTVgyMV9DUzBfQkFTRV9BRERSICsgMHgwMjAwMDAwMCAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDIxYWRzX25vcl9tdGRfZGV2aWNlID0gewotCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAotCS5pZCA9IDAsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmbXgyMWFkc19mbGFzaF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZteDIxYWRzX2ZsYXNoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKLQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9ub3J0c19wZGF0YSA9IHsKLX07Ci0KLQotc3RhdGljIGludCBteDIxYWRzX2ZiX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQl1MTYgdG1wOwotCi0JdG1wID0gX19yYXdfcmVhZHcoTVgyMUFEU19JT19SRUcpOwotCXRtcCB8PSBNWDIxQURTX0lPX0xDRE9OOwotCV9fcmF3X3dyaXRldyh0bXAsIE1YMjFBRFNfSU9fUkVHKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXgyMWFkc19mYl9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JdTE2IHRtcDsKLQotCXRtcCA9IF9fcmF3X3JlYWR3KE1YMjFBRFNfSU9fUkVHKTsKLQl0bXAgJj0gfk1YMjFBRFNfSU9fTENET047Ci0JX19yYXdfd3JpdGV3KHRtcCwgTVgyMUFEU19JT19SRUcpOwotfQotCi0vKgotICogQ29ubmVjdGVkIGlzIGEgcG9ydHJhaXQgU2hhcnAtUVZHQSBkaXNwbGF5Ci0gKiBvZiB0eXBlOiBMUTAzNVE3REIwMgotICovCi1zdGF0aWMgc3RydWN0IGlteF9mYl92aWRlb21vZGUgbXgyMWFkc19tb2Rlc1tdID0gewotCXsKLQkJLm1vZGUgPSB7Ci0JCQkubmFtZQkJPSAiU2hhcnAtTFEwMzVRNyIsCi0JCQkucmVmcmVzaAk9IDYwLAotCQkJLnhyZXMJCT0gMjQwLAotCQkJLnlyZXMJCT0gMzIwLAotCQkJLnBpeGNsb2NrCT0gMTg4Njc5LCAvKiBpbiBwcyAoNS4zTUh6KSAqLwotCQkJLmhzeW5jX2xlbgk9IDIsCi0JCQkubGVmdF9tYXJnaW4JPSA2LAotCQkJLnJpZ2h0X21hcmdpbgk9IDE2LAotCQkJLnZzeW5jX2xlbgk9IDEsCi0JCQkudXBwZXJfbWFyZ2luCT0gOCwKLQkJCS5sb3dlcl9tYXJnaW4JPSAxMCwKLQkJfSwKLQkJLnBjcgkJPSAweGZiMTA4YmM3LAotCQkuYnBwCQk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGlteF9mYl9wbGF0Zm9ybV9kYXRhIG14MjFhZHNfZmJfZGF0YSA9IHsKLQkubW9kZSA9IG14MjFhZHNfbW9kZXMsCi0JLm51bV9tb2RlcyA9IEFSUkFZX1NJWkUobXgyMWFkc19tb2RlcyksCi0KLQkucHdtcgkJPSAweDAwYTkwM2ZmLAotCS5sc2NyMQkJPSAweDAwMTIwMzAwLAotCS5kbWFjcgkJPSAweDAwMDIwMDA4LAotCi0JLmluaXQgPSBteDIxYWRzX2ZiX2luaXQsCi0JLmV4aXQgPSBteDIxYWRzX2ZiX2V4aXQsCi19OwotCi1zdGF0aWMgaW50IG14MjFhZHNfc2RoY19nZXRfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiAoX19yYXdfcmVhZHcoTVgyMUFEU19JT19SRUcpICYgTVgyMUFEU19JT19TRF9XUCkgPyAxIDogMDsKLX0KLQotc3RhdGljIGludCBteDIxYWRzX3NkaGNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgZGV0ZWN0X2lycSwKLQl2b2lkICpkYXRhKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSByZXF1ZXN0X2lycShJUlFfR1BJT0QoMjUpLCBkZXRlY3RfaXJxLAotCQlJUlFGX1RSSUdHRVJfRkFMTElORywgIm1tYy1kZXRlY3QiLCBkYXRhKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQlyZXR1cm4gMDsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBteDIxYWRzX3NkaGNfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZnJlZV9pcnEoSVJRX0dQSU9EKDI1KSwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14bW1jX3BsYXRmb3JtX2RhdGEgbXgyMWFkc19zZGhjX3BkYXRhID0gewotCS5vY3JfYXZhaWwgPSBNTUNfVkREXzI5XzMwIHwgTU1DX1ZERF8zMF8zMSwgLyogMy4wViAqLwotCS5nZXRfcm8gPSBteDIxYWRzX3NkaGNfZ2V0X3JvLAotCS5pbml0ID0gbXgyMWFkc19zZGhjX2luaXQsCi0JLmV4aXQgPSBteDIxYWRzX3NkaGNfZXhpdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSBteDIxYWRzX25hbmRfYm9hcmRfaW5mbyA9IHsKLQkud2lkdGggPSAxLAotCS5od19lY2MgPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDIxYWRzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCS8qCi0JICogTWVtb3J5LW1hcHBlZCBJL08gb24gTVgyMUFEUyBCYXNlIGJvYXJkOgotCSAqICAgLSBDUzg5MDBBIEV0aGVybmV0IGNvbnRyb2xsZXIKLQkgKiAgIC0gU1QxNkMyNTUyQ0ogVUFSVAotCSAqICAgLSBDUFUgYW5kIEJhc2UgYm9hcmQgdmVyc2lvbgotCSAqICAgLSBCYXNlIGJvYXJkIEkvTyByZWdpc3RlcgotCSAqLwotCXsKLQkJLnZpcnR1YWwgPSBNWDIxQURTX01NSU9fQkFTRV9BRERSLAotCQkucGZuID0gX19waHlzX3RvX3BmbihNWDIxX0NTMV9CQVNFX0FERFIpLAotCQkubGVuZ3RoID0gTVgyMUFEU19NTUlPX1NJWkUsCi0JCS50eXBlID0gTVRfREVWSUNFLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXgyMWFkc19tYXBfaW8odm9pZCkKLXsKLQlteDIxX21hcF9pbygpOwotCWlvdGFibGVfaW5pdChteDIxYWRzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgyMWFkc19pb19kZXNjKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbXgyMWFkc19ub3JfbXRkX2RldmljZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteDIxYWRzX2JvYXJkX2luaXQodm9pZCkKLXsKLQlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjFhZHNfcGlucywgQVJSQVlfU0laRShteDIxYWRzX3BpbnMpLAotCQkJIm14MjFhZHMiKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9ub3J0c19wZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMywgJnVhcnRfcGRhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19mYl9kZXZpY2UsICZteDIxYWRzX2ZiX2RhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTAsICZteDIxYWRzX3NkaGNfcGRhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteDIxX25hbmRfZGV2aWNlLCAmbXgyMWFkc19uYW5kX2JvYXJkX2luZm8pOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteDIxYWRzX3RpbWVyX2luaXQodm9pZCkKLXsKLQlteDIxX2Nsb2Nrc19pbml0KDMyNzY4LCAyNjAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIG14MjFhZHNfdGltZXIgPSB7Ci0JLmluaXQJPSBteDIxYWRzX3RpbWVyX2luaXQsCi19OwotCi1NQUNISU5FX1NUQVJUKE1YMjFBRFMsICJGcmVlc2NhbGUgaS5NWDIxQURTIikKLQkvKiBtYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwotCS5waHlzX2lvICAgICAgICA9IE1YMjFfQUlQSV9CQVNFX0FERFIsCi0JLmlvX3BnX29mZnN0ICAgID0gKChNWDIxX0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMgICAgPSBNWDIxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCi0JLm1hcF9pbyAgICAgICAgID0gbXgyMWFkc19tYXBfaW8sCi0JLmluaXRfaXJxICAgICAgID0gbXgyMV9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lICAgPSBteDIxYWRzX2JvYXJkX2luaXQsCi0JLnRpbWVyICAgICAgICAgID0gJm14MjFhZHNfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1teDI3XzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1teDI3XzNkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY0ZTBkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL21hY2gtbXgyN18zZHMuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIEF1dGhvcjogRmFiaW8gRXN0ZXZhbSA8ZmFiaW8uZXN0ZXZhbUBmcmVlc2NhbGUuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC1teDI3Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC1teDI3cGRrLmg+Ci0KLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXgyN3Bka19waW5zW10gPSB7Ci0JLyogVUFSVDEgKi8KLQlQRTEyX1BGX1VBUlQxX1RYRCwKLQlQRTEzX1BGX1VBUlQxX1JYRCwKLQlQRTE0X1BGX1VBUlQxX0NUUywKLQlQRTE1X1BGX1VBUlQxX1JUUywKLQkvKiBGRUMgKi8KLQlQRDBfQUlOX0ZFQ19UWEQwLAotCVBEMV9BSU5fRkVDX1RYRDEsCi0JUEQyX0FJTl9GRUNfVFhEMiwKLQlQRDNfQUlOX0ZFQ19UWEQzLAotCVBENF9BT1VUX0ZFQ19SWF9FUiwKLQlQRDVfQU9VVF9GRUNfUlhEMSwKLQlQRDZfQU9VVF9GRUNfUlhEMiwKLQlQRDdfQU9VVF9GRUNfUlhEMywKLQlQRDhfQUZfRkVDX01ESU8sCi0JUEQ5X0FJTl9GRUNfTURDLAotCVBEMTBfQU9VVF9GRUNfQ1JTLAotCVBEMTFfQU9VVF9GRUNfVFhfQ0xLLAotCVBEMTJfQU9VVF9GRUNfUlhEMCwKLQlQRDEzX0FPVVRfRkVDX1JYX0RWLAotCVBEMTRfQU9VVF9GRUNfUlhfQ0xLLAotCVBEMTVfQU9VVF9GRUNfQ09MLAotCVBEMTZfQUlOX0ZFQ19UWF9FUiwKLQlQRjIzX0FJTl9GRUNfVFhfRU4sCi19OwotCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0gewotCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJm14Y19mZWNfZGV2aWNlLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG14MjdwZGtfaW5pdCh2b2lkKQotewotCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXgyN3Bka19waW5zLCBBUlJBWV9TSVpFKG14MjdwZGtfcGlucyksCi0JCSJteDI3cGRrIik7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOwotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXgyN3Bka190aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgyN19jbG9ja3NfaW5pdCgyNjAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIG14MjdwZGtfdGltZXIgPSB7Ci0JLmluaXQJPSBteDI3cGRrX3RpbWVyX2luaXQsCi19OwotCi1NQUNISU5FX1NUQVJUKE1YMjdfM0RTLCAiRnJlZXNjYWxlIE1YMjdQREsiKQotCS8qIG1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLnBoeXNfaW8gICAgICAgID0gTVgyN19BSVBJX0JBU0VfQUREUiwKLQkuaW9fcGdfb2Zmc3QgICAgPSAoKE1YMjdfQUlQSV9CQVNFX0FERFJfVklSVCkgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcyAgICA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKLQkubWFwX2lvICAgICAgICAgPSBteDI3X21hcF9pbywKLQkuaW5pdF9pcnEgICAgICAgPSBteDI3X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUgICA9IG14MjdwZGtfaW5pdCwKLQkudGltZXIgICAgICAgICAgPSAmbXgyN3Bka190aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLW14MjdhZHMuYyBiL2FyY2gvYXJtL21hY2gtbXgyL21hY2gtbXgyN2Fkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2UzMjM2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL21hY2gtbXgyN2Fkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQtbXgyN2Fkcy5oPgotI2luY2x1ZGUgPG1hY2gvbXhjX25hbmQuaD4KLSNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2luY2x1ZGUgPG1hY2gvaW14ZmIuaD4KLSNpbmNsdWRlIDxtYWNoL21tYy5oPgotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IG14MjdhZHNfcGluc1tdID0gewotCS8qIFVBUlQwICovCi0JUEUxMl9QRl9VQVJUMV9UWEQsCi0JUEUxM19QRl9VQVJUMV9SWEQsCi0JUEUxNF9QRl9VQVJUMV9DVFMsCi0JUEUxNV9QRl9VQVJUMV9SVFMsCi0JLyogVUFSVDEgKi8KLQlQRTNfUEZfVUFSVDJfQ1RTLAotCVBFNF9QRl9VQVJUMl9SVFMsCi0JUEU2X1BGX1VBUlQyX1RYRCwKLQlQRTdfUEZfVUFSVDJfUlhELAotCS8qIFVBUlQyICovCi0JUEU4X1BGX1VBUlQzX1RYRCwKLQlQRTlfUEZfVUFSVDNfUlhELAotCVBFMTBfUEZfVUFSVDNfQ1RTLAotCVBFMTFfUEZfVUFSVDNfUlRTLAotCS8qIFVBUlQzICovCi0JUEIyNl9BRl9VQVJUNF9SVFMsCi0JUEIyOF9BRl9VQVJUNF9UWEQsCi0JUEIyOV9BRl9VQVJUNF9DVFMsCi0JUEIzMV9BRl9VQVJUNF9SWEQsCi0JLyogVUFSVDQgKi8KLQlQQjE4X0FGX1VBUlQ1X1RYRCwKLQlQQjE5X0FGX1VBUlQ1X1JYRCwKLQlQQjIwX0FGX1VBUlQ1X0NUUywKLQlQQjIxX0FGX1VBUlQ1X1JUUywKLQkvKiBVQVJUNSAqLwotCVBCMTBfQUZfVUFSVDZfVFhELAotCVBCMTJfQUZfVUFSVDZfQ1RTLAotCVBCMTFfQUZfVUFSVDZfUlhELAotCVBCMTNfQUZfVUFSVDZfUlRTLAotCS8qIEZFQyAqLwotCVBEMF9BSU5fRkVDX1RYRDAsCi0JUEQxX0FJTl9GRUNfVFhEMSwKLQlQRDJfQUlOX0ZFQ19UWEQyLAotCVBEM19BSU5fRkVDX1RYRDMsCi0JUEQ0X0FPVVRfRkVDX1JYX0VSLAotCVBENV9BT1VUX0ZFQ19SWEQxLAotCVBENl9BT1VUX0ZFQ19SWEQyLAotCVBEN19BT1VUX0ZFQ19SWEQzLAotCVBEOF9BRl9GRUNfTURJTywKLQlQRDlfQUlOX0ZFQ19NREMsCi0JUEQxMF9BT1VUX0ZFQ19DUlMsCi0JUEQxMV9BT1VUX0ZFQ19UWF9DTEssCi0JUEQxMl9BT1VUX0ZFQ19SWEQwLAotCVBEMTNfQU9VVF9GRUNfUlhfRFYsCi0JUEQxNF9BT1VUX0ZFQ19SWF9DTEssCi0JUEQxNV9BT1VUX0ZFQ19DT0wsCi0JUEQxNl9BSU5fRkVDX1RYX0VSLAotCVBGMjNfQUlOX0ZFQ19UWF9FTiwKLQkvKiBJMkMyICovCi0JUEM1X1BGX0kyQzJfU0RBLAotCVBDNl9QRl9JMkMyX1NDTCwKLQkvKiBGQiAqLwotCVBBNV9QRl9MU0NMSywKLQlQQTZfUEZfTEQwLAotCVBBN19QRl9MRDEsCi0JUEE4X1BGX0xEMiwKLQlQQTlfUEZfTEQzLAotCVBBMTBfUEZfTEQ0LAotCVBBMTFfUEZfTEQ1LAotCVBBMTJfUEZfTEQ2LAotCVBBMTNfUEZfTEQ3LAotCVBBMTRfUEZfTEQ4LAotCVBBMTVfUEZfTEQ5LAotCVBBMTZfUEZfTEQxMCwKLQlQQTE3X1BGX0xEMTEsCi0JUEExOF9QRl9MRDEyLAotCVBBMTlfUEZfTEQxMywKLQlQQTIwX1BGX0xEMTQsCi0JUEEyMV9QRl9MRDE1LAotCVBBMjJfUEZfTEQxNiwKLQlQQTIzX1BGX0xEMTcsCi0JUEEyNF9QRl9SRVYsCi0JUEEyNV9QRl9DTFMsCi0JUEEyNl9QRl9QUywKLQlQQTI3X1BGX1NQTF9TUFIsCi0JUEEyOF9QRl9IU1lOQywKLQlQQTI5X1BGX1ZTWU5DLAotCVBBMzBfUEZfQ09OVFJBU1QsCi0JUEEzMV9QRl9PRV9BQ0QsCi0JLyogT1dJUkUgKi8KLQlQRTE2X0FGX09XSVJFLAotCS8qIFNESEMxKi8KLQlQRTE4X1BGX1NEMV9EMCwKLQlQRTE5X1BGX1NEMV9EMSwKLQlQRTIwX1BGX1NEMV9EMiwKLQlQRTIxX1BGX1NEMV9EMywKLQlQRTIyX1BGX1NEMV9DTUQsCi0JUEUyM19QRl9TRDFfQ0xLLAotCS8qIFNESEMyKi8KLQlQQjRfUEZfU0QyX0QwLAotCVBCNV9QRl9TRDJfRDEsCi0JUEI2X1BGX1NEMl9EMiwKLQlQQjdfUEZfU0QyX0QzLAotCVBCOF9QRl9TRDJfQ01ELAotCVBCOV9QRl9TRDJfQ0xLLAotfTsKLQotc3RhdGljIHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhIG14MjdhZHNfbmFuZF9ib2FyZF9pbmZvID0gewotCS53aWR0aCA9IDEsCi0JLmh3X2VjYyA9IDEsCi19OwotCi0vKiBBRFMncyBOT1IgZmxhc2ggKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG14MjdhZHNfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGggPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDI3YWRzX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydCA9IDB4YzAwMDAwMDAsCi0JLmVuZCA9IDB4YzAwMDAwMDAgKyAweDAyMDAwMDAwIC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXgyN2Fkc19ub3JfbXRkX2RldmljZSA9IHsKLQkubmFtZSA9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQgPSAwLAotCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJm14MjdhZHNfZmxhc2hfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmbXgyN2Fkc19mbGFzaF9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgbXgyN2Fkc19pMmNfZGF0YSA9IHsKLQkuYml0cmF0ZSA9IDEwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXgyN2Fkc19pMmNfZGV2aWNlc1tdID0gewotfTsKLQotdm9pZCBsY2RfcG93ZXIoaW50IG9uKQotewotCWlmIChvbikKLQkJX19yYXdfd3JpdGV3KFBCQ19CQ1RSTDFfTENET04sIFBCQ19CQ1RSTDFfU0VUX1JFRyk7Ci0JZWxzZQotCQlfX3Jhd193cml0ZXcoUEJDX0JDVFJMMV9MQ0RPTiwgUEJDX0JDVFJMMV9DTEVBUl9SRUcpOwotfQotCi1zdGF0aWMgc3RydWN0IGlteF9mYl92aWRlb21vZGUgbXgyN2Fkc19tb2Rlc1tdID0gewotCXsKLQkJLm1vZGUgPSB7Ci0JCQkubmFtZQkJPSAiU2hhcnAtTFEwMzVRNyIsCi0JCQkucmVmcmVzaAk9IDYwLAotCQkJLnhyZXMJCT0gMjQwLAotCQkJLnlyZXMJCT0gMzIwLAotCQkJLnBpeGNsb2NrCT0gMTg4Njc5LCAvKiBpbiBwcyAoNS4zTUh6KSAqLwotCQkJLmhzeW5jX2xlbgk9IDEsCi0JCQkubGVmdF9tYXJnaW4JPSA5LAotCQkJLnJpZ2h0X21hcmdpbgk9IDE2LAotCQkJLnZzeW5jX2xlbgk9IDEsCi0JCQkudXBwZXJfbWFyZ2luCT0gNywKLQkJCS5sb3dlcl9tYXJnaW4JPSA5LAotCQl9LAotCQkuYnBwCQk9IDE2LAotCQkucGNyCQk9IDB4RkIwMDhCQzAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14X2ZiX3BsYXRmb3JtX2RhdGEgbXgyN2Fkc19mYl9kYXRhID0gewotCS5tb2RlID0gbXgyN2Fkc19tb2RlcywKLQkubnVtX21vZGVzID0gQVJSQVlfU0laRShteDI3YWRzX21vZGVzKSwKLQotCS8qCi0JICogLSBIU1lOQyBhY3RpdmUgaGlnaAotCSAqIC0gVlNZTkMgYWN0aXZlIGhpZ2gKLQkgKiAtIGNsayBub3RlbmFibGVkIHdoaWxlIGlkbGUKLQkgKiAtIGNsb2NrIGludmVydGVkCi0JICogLSBkYXRhIG5vdCBpbnZlcnRlZAotCSAqIC0gZGF0YSBlbmFibGUgbG93IGFjdGl2ZQotCSAqIC0gZW5hYmxlIHNoYXJwIG1vZGUKLQkgKi8KLQkucHdtcgkJPSAweDAwQTkwM0ZGLAotCS5sc2NyMQkJPSAweDAwMTIwMzAwLAotCS5kbWFjcgkJPSAweDAwMDIwMDEwLAotCi0JLmxjZF9wb3dlcgk9IGxjZF9wb3dlciwKLX07Ci0KLXN0YXRpYyBpbnQgbXgyN2Fkc19zZGhjMV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBkZXRlY3RfaXJxLAotCQkJICAgICAgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gcmVxdWVzdF9pcnEoSVJRX0dQSU9FKDIxKSwgZGV0ZWN0X2lycSwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCSAgICJzZGhjMS1jYXJkLWRldGVjdCIsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG14MjdhZHNfc2RoYzJfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgZGV0ZWN0X2lycSwKLQkJCSAgICAgIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHJlcXVlc3RfaXJxKElSUV9HUElPQig3KSwgZGV0ZWN0X2lycSwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCSAgICJzZGhjMi1jYXJkLWRldGVjdCIsIGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBteDI3YWRzX3NkaGMxX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWZyZWVfaXJxKElSUV9HUElPRSgyMSksIGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBteDI3YWRzX3NkaGMyX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWZyZWVfaXJxKElSUV9HUElPQig3KSwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14bW1jX3BsYXRmb3JtX2RhdGEgc2RoYzFfcGRhdGEgPSB7Ci0JLmluaXQgPSBteDI3YWRzX3NkaGMxX2luaXQsCi0JLmV4aXQgPSBteDI3YWRzX3NkaGMxX2V4aXQsCi19OwotCi1zdGF0aWMgc3RydWN0IGlteG1tY19wbGF0Zm9ybV9kYXRhIHNkaGMyX3BkYXRhID0gewotCS5pbml0ID0gbXgyN2Fkc19zZGhjMl9pbml0LAotCS5leGl0ID0gbXgyN2Fkc19zZGhjMl9leGl0LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZteDI3YWRzX25vcl9tdGRfZGV2aWNlLAotCSZteGNfZmVjX2RldmljZSwKLQkmbXhjX3cxX21hc3Rlcl9kZXZpY2UsCi19OwotCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhW10gPSB7Ci0JewotCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotCX0sIHsKLQkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLQl9LCB7Ci0JCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi0JfSwgewotCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotCX0sIHsKLQkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLQl9LCB7Ci0JCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteDI3YWRzX2JvYXJkX2luaXQodm9pZCkKLXsKLQlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjdhZHNfcGlucywgQVJSQVlfU0laRShteDI3YWRzX3BpbnMpLAotCQkJIm14MjdhZHMiKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhWzBdKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UxLCAmdWFydF9wZGF0YVsxXSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMiwgJnVhcnRfcGRhdGFbMl0pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTMsICZ1YXJ0X3BkYXRhWzNdKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2U0LCAmdWFydF9wZGF0YVs0XSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlNSwgJnVhcnRfcGRhdGFbNV0pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteDI3X25hbmRfZGV2aWNlLCAmbXgyN2Fkc19uYW5kX2JvYXJkX2luZm8pOwotCi0JLyogb25seSB0aGUgaTJjIG1hc3RlciAxIGlzIHVzZWQgb24gdGhpcyBDUFUgY2FyZCAqLwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIG14MjdhZHNfaTJjX2RldmljZXMsCi0JCQkJQVJSQVlfU0laRShteDI3YWRzX2kyY19kZXZpY2VzKSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2kyY19kZXZpY2UxLCAmbXgyN2Fkc19pMmNfZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2ZiX2RldmljZSwgJm14MjdhZHNfZmJfZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NkaGNfZGV2aWNlMCwgJnNkaGMxX3BkYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfc2RoY19kZXZpY2UxLCAmc2RoYzJfcGRhdGEpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteDI3YWRzX3RpbWVyX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZyZWYgPSAyNjAwMDAwMDsKLQotCWlmICgoX19yYXdfcmVhZHcoUEJDX1ZFUlNJT05fUkVHKSAmIENLSUhfMjdNSFpfQklUX1NFVCkgPT0gMCkKLQkJZnJlZiA9IDI3MDAwMDAwOwotCi0JbXgyN19jbG9ja3NfaW5pdChmcmVmKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgbXgyN2Fkc190aW1lciA9IHsKLQkuaW5pdAk9IG14MjdhZHNfdGltZXJfaW5pdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgyN2Fkc19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsID0gUEJDX0JBU0VfQUREUkVTUywKLQkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyN19DUzRfQkFTRV9BRERSKSwKLQkJLmxlbmd0aCA9IFNaXzFNLAotCQkudHlwZSA9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG14MjdhZHNfbWFwX2lvKHZvaWQpCi17Ci0JbXgyN19tYXBfaW8oKTsKLQlpb3RhYmxlX2luaXQobXgyN2Fkc19pb19kZXNjLCBBUlJBWV9TSVpFKG14MjdhZHNfaW9fZGVzYykpOwotfQotCi1NQUNISU5FX1NUQVJUKE1YMjdBRFMsICJGcmVlc2NhbGUgaS5NWDI3QURTIikKLQkvKiBtYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwotCS5waHlzX2lvICAgICAgICA9IE1YMjdfQUlQSV9CQVNFX0FERFIsCi0JLmlvX3BnX29mZnN0ICAgID0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMgICAgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCi0JLm1hcF9pbyAgICAgICAgID0gbXgyN2Fkc19tYXBfaW8sCi0JLmluaXRfaXJxICAgICAgID0gbXgyN19pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lICAgPSBteDI3YWRzX2JvYXJkX2luaXQsCi0JLnRpbWVyICAgICAgICAgID0gJm14MjdhZHNfdGltZXIsCi1NQUNISU5FX0VORAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLW14dF90ZDYwLmMgYi9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLW14dF90ZDYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzg1NTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1teHRfdGQ2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KLSNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+Ci0jaW5jbHVkZSA8bWFjaC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvcGNhOTUzeC5oPgotI2luY2x1ZGUgPG1hY2gvaW14ZmIuaD4KLSNpbmNsdWRlIDxtYWNoL21tYy5oPgotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IG14dF90ZDYwX3BpbnNbXSBfX2luaXRkYXRhID0gewotCS8qIFVBUlQwICovCi0JUEUxMl9QRl9VQVJUMV9UWEQsCi0JUEUxM19QRl9VQVJUMV9SWEQsCi0JUEUxNF9QRl9VQVJUMV9DVFMsCi0JUEUxNV9QRl9VQVJUMV9SVFMsCi0JLyogVUFSVDEgKi8KLQlQRTNfUEZfVUFSVDJfQ1RTLAotCVBFNF9QRl9VQVJUMl9SVFMsCi0JUEU2X1BGX1VBUlQyX1RYRCwKLQlQRTdfUEZfVUFSVDJfUlhELAotCS8qIFVBUlQyICovCi0JUEU4X1BGX1VBUlQzX1RYRCwKLQlQRTlfUEZfVUFSVDNfUlhELAotCVBFMTBfUEZfVUFSVDNfQ1RTLAotCVBFMTFfUEZfVUFSVDNfUlRTLAotCS8qIEZFQyAqLwotCVBEMF9BSU5fRkVDX1RYRDAsCi0JUEQxX0FJTl9GRUNfVFhEMSwKLQlQRDJfQUlOX0ZFQ19UWEQyLAotCVBEM19BSU5fRkVDX1RYRDMsCi0JUEQ0X0FPVVRfRkVDX1JYX0VSLAotCVBENV9BT1VUX0ZFQ19SWEQxLAotCVBENl9BT1VUX0ZFQ19SWEQyLAotCVBEN19BT1VUX0ZFQ19SWEQzLAotCVBEOF9BRl9GRUNfTURJTywKLQlQRDlfQUlOX0ZFQ19NREMsCi0JUEQxMF9BT1VUX0ZFQ19DUlMsCi0JUEQxMV9BT1VUX0ZFQ19UWF9DTEssCi0JUEQxMl9BT1VUX0ZFQ19SWEQwLAotCVBEMTNfQU9VVF9GRUNfUlhfRFYsCi0JUEQxNF9BT1VUX0ZFQ19SWF9DTEssCi0JUEQxNV9BT1VUX0ZFQ19DT0wsCi0JUEQxNl9BSU5fRkVDX1RYX0VSLAotCVBGMjNfQUlOX0ZFQ19UWF9FTiwKLQkvKiBJMkMxICovCi0JUEQxN19QRl9JMkNfREFUQSwKLQlQRDE4X1BGX0kyQ19DTEssCi0JLyogSTJDMiAqLwotCVBDNV9QRl9JMkMyX1NEQSwKLQlQQzZfUEZfSTJDMl9TQ0wsCi0JLyogRkIgKi8KLQlQQTVfUEZfTFNDTEssCi0JUEE2X1BGX0xEMCwKLQlQQTdfUEZfTEQxLAotCVBBOF9QRl9MRDIsCi0JUEE5X1BGX0xEMywKLQlQQTEwX1BGX0xENCwKLQlQQTExX1BGX0xENSwKLQlQQTEyX1BGX0xENiwKLQlQQTEzX1BGX0xENywKLQlQQTE0X1BGX0xEOCwKLQlQQTE1X1BGX0xEOSwKLQlQQTE2X1BGX0xEMTAsCi0JUEExN19QRl9MRDExLAotCVBBMThfUEZfTEQxMiwKLQlQQTE5X1BGX0xEMTMsCi0JUEEyMF9QRl9MRDE0LAotCVBBMjFfUEZfTEQxNSwKLQlQQTIyX1BGX0xEMTYsCi0JUEEyM19QRl9MRDE3LAotCVBBMjVfUEZfQ0xTLAotCVBBMjdfUEZfU1BMX1NQUiwKLQlQQTI4X1BGX0hTWU5DLAotCVBBMjlfUEZfVlNZTkMsCi0JUEEzMF9QRl9DT05UUkFTVCwKLQlQQTMxX1BGX09FX0FDRCwKLQkvKiBPV0lSRSAqLwotCVBFMTZfQUZfT1dJUkUsCi0JLyogU0RIQzEqLwotCVBFMThfUEZfU0QxX0QwLAotCVBFMTlfUEZfU0QxX0QxLAotCVBFMjBfUEZfU0QxX0QyLAotCVBFMjFfUEZfU0QxX0QzLAotCVBFMjJfUEZfU0QxX0NNRCwKLQlQRTIzX1BGX1NEMV9DTEssCi0JUEY4X0FGX0FUQV9JT1JEWSwKLQkvKiBTREhDMiovCi0JUEI0X1BGX1NEMl9EMCwKLQlQQjVfUEZfU0QyX0QxLAotCVBCNl9QRl9TRDJfRDIsCi0JUEI3X1BGX1NEMl9EMywKLQlQQjhfUEZfU0QyX0NNRCwKLQlQQjlfUEZfU0QyX0NMSywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSBteHRfdGQ2MF9uYW5kX2JvYXJkX2luZm8gPSB7Ci0JLndpZHRoID0gMSwKLQkuaHdfZWNjID0gMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgbXh0X3RkNjBfaTJjX2RhdGEgPSB7Ci0JLmJpdHJhdGUgPSAxMDAwMDAsCi19OwotCi0vKiBQQ0E5NTU3ICovCi1zdGF0aWMgaW50IG14dF90ZDYwX3BjYTk1NTdfc2V0dXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQl1bnNpZ25lZCBncGlvX2Jhc2UsIHVuc2lnbmVkIG5ncGlvLAotCQkJCXZvaWQgKmNvbnRleHQpCi17Ci0Jc3RhdGljIGludCBteHRfdGQ2MF9ncGlvX3ZhbHVlW10gPSB7Ci0JCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxCi0JfTsKLQlpbnQgbjsKLQotCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKG14dF90ZDYwX2dwaW9fdmFsdWUpOyArK24pIHsKLQkJZ3Bpb19yZXF1ZXN0KGdwaW9fYmFzZSArIG4sICJNWFRfVEQ2MCBHUElPIEV4cCIpOwotCQlpZiAobXh0X3RkNjBfZ3Bpb192YWx1ZVtuXSA8IDApCi0JCQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvX2Jhc2UgKyBuKTsKLQkJZWxzZQotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fYmFzZSArIG4sCi0JCQkJCQlteHRfdGQ2MF9ncGlvX3ZhbHVlW25dKTsKLQkJZ3Bpb19leHBvcnQoZ3Bpb19iYXNlICsgbiwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhIG14dF90ZDYwX3BjYTk1NTdfcGRhdGEgPSB7Ci0JLmdwaW9fYmFzZQk9IDI0MCwgLyogcGxhY2UgUENBOTU1NyBhZnRlciBhbGwgTVgyNyBncGlvIHBpbnMgKi8KLQkuaW52ZXJ0CQk9IDAsIC8qIERvIG5vdCBpbnZlcnQgKi8KLQkuc2V0dXAJCT0gbXh0X3RkNjBfcGNhOTU1N19zZXR1cCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXh0X3RkNjBfaTJjX2RldmljZXNbXSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJwY2E5NTU3IiwgMHgxOCksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJm14dF90ZDYwX3BjYTk1NTdfcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgbXh0X3RkNjBfaTJjMl9kYXRhID0gewotCS5iaXRyYXRlID0gMTAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBteHRfdGQ2MF9pMmMyX2RldmljZXNbXSA9IHsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14X2ZiX3ZpZGVvbW9kZSBteHRfdGQ2MF9tb2Rlc1tdID0gewotCXsKLQkJLm1vZGUgPSB7Ci0JCQkubmFtZQkJPSAiQ2hpbWVpIExXNzAwQVQ5MDAzIiwKLQkJCS5yZWZyZXNoCT0gNjAsCi0JCQkueHJlcwkJPSA4MDAsCi0JCQkueXJlcwkJPSA0ODAsCi0JCQkucGl4Y2xvY2sJPSAzMDMwMywKLQkJCS5oc3luY19sZW4JPSA2NCwKLQkJCS5sZWZ0X21hcmdpbgk9IDB4NjcsCi0JCQkucmlnaHRfbWFyZ2luCT0gMHg2OCwKLQkJCS52c3luY19sZW4JPSAxNiwKLQkJCS51cHBlcl9tYXJnaW4JPSAweDBmLAotCQkJLmxvd2VyX21hcmdpbgk9IDB4MGYsCi0JCX0sCi0JCS5icHAJCT0gMTYsCi0JCS5wY3IJCT0gMHhGQTIwOEI4MywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSBteHRfdGQ2MF9mYl9kYXRhID0gewotCS5tb2RlID0gbXh0X3RkNjBfbW9kZXMsCi0JLm51bV9tb2RlcyA9IEFSUkFZX1NJWkUobXh0X3RkNjBfbW9kZXMpLAotCi0JLyoKLQkgKiAtIEhTWU5DIGFjdGl2ZSBoaWdoCi0JICogLSBWU1lOQyBhY3RpdmUgaGlnaAotCSAqIC0gY2xrIG5vdGVuYWJsZWQgd2hpbGUgaWRsZQotCSAqIC0gY2xvY2sgaW52ZXJ0ZWQKLQkgKiAtIGRhdGEgbm90IGludmVydGVkCi0JICogLSBkYXRhIGVuYWJsZSBsb3cgYWN0aXZlCi0JICogLSBlbmFibGUgc2hhcnAgbW9kZQotCSAqLwotCS5wd21yCQk9IDB4MDBBOTAzRkYsCi0JLmxzY3IxCQk9IDB4MDAxMjAzMDAsCi0JLmRtYWNyCQk9IDB4MDAwMjAwMTAsCi19OwotCi1zdGF0aWMgaW50IG14dF90ZDYwX3NkaGMxX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IGRldGVjdF9pcnEsCi0JCQkJdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gcmVxdWVzdF9pcnEoSVJRX0dQSU9GKDgpLCBkZXRlY3RfaXJxLCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCQkic2RoYzEtY2FyZC1kZXRlY3QiLCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgbXh0X3RkNjBfc2RoYzFfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZnJlZV9pcnEoSVJRX0dQSU9GKDgpLCBkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpbXhtbWNfcGxhdGZvcm1fZGF0YSBzZGhjMV9wZGF0YSA9IHsKLQkuaW5pdCA9IG14dF90ZDYwX3NkaGMxX2luaXQsCi0JLmV4aXQgPSBteHRfdGQ2MF9zZGhjMV9leGl0LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZteGNfZmVjX2RldmljZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGFbXSA9IHsKLQl7Ci0JCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi0JfSwgewotCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotCX0sIHsKLQkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG14dF90ZDYwX2JvYXJkX2luaXQodm9pZCkKLXsKLQlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14dF90ZDYwX3BpbnMsIEFSUkFZX1NJWkUobXh0X3RkNjBfcGlucyksCi0JCQkiTVhUX1RENjAiKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhWzBdKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UxLCAmdWFydF9wZGF0YVsxXSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMiwgJnVhcnRfcGRhdGFbMl0pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteDI3X25hbmRfZGV2aWNlLCAmbXh0X3RkNjBfbmFuZF9ib2FyZF9pbmZvKTsKLQotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG14dF90ZDYwX2kyY19kZXZpY2VzLAotCQkJCUFSUkFZX1NJWkUobXh0X3RkNjBfaTJjX2RldmljZXMpKTsKLQotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIG14dF90ZDYwX2kyYzJfZGV2aWNlcywKLQkJCQlBUlJBWV9TSVpFKG14dF90ZDYwX2kyYzJfZGV2aWNlcykpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2kyY19kZXZpY2UwLCAmbXh0X3RkNjBfaTJjX2RhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMSwgJm14dF90ZDYwX2kyYzJfZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2ZiX2RldmljZSwgJm14dF90ZDYwX2ZiX2RhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zZGhjX2RldmljZTAsICZzZGhjMV9wZGF0YSk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG14dF90ZDYwX3RpbWVyX2luaXQodm9pZCkKLXsKLQlteDI3X2Nsb2Nrc19pbml0KDI2MDAwMDAwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgbXh0X3RkNjBfdGltZXIgPSB7Ci0JLmluaXQJPSBteHRfdGQ2MF90aW1lcl9pbml0LAotfTsKLQotTUFDSElORV9TVEFSVChNWFRfVEQ2MCwgIk1heHRyYWNrIGktTVhUIFRENjAiKQotCS8qIG1haW50YWluZXI6IE1heHRyYWNrIEluZHVzdHJpYWwgKi8KLQkucGh5c19pbwk9IE1YMjdfQUlQSV9CQVNFX0FERFIsCi0JLmlvX3BnX29mZnN0CT0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCi0JLm1hcF9pbwkJPSBteDI3X21hcF9pbywKLQkuaW5pdF9pcnEJPSBteDI3X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUJPSBteHRfdGQ2MF9ib2FyZF9pbml0LAotCS50aW1lcgkJPSAmbXh0X3RkNjBfdGltZXIsCi1NQUNISU5FX0VORAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLXBjYTEwMC5jIGIvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1wY2ExMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3NDIyZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9tYWNoLXBjYTEwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+LCBQZW5ndXRyb25peAotICogQ29weXJpZ2h0IChDKSAyMDA5IFNhc2NoYSBIYXVlciAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL2VlcHJvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvdWxwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KLSNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19TUElfSU1YX01PRFVMRSkKLSNpbmNsdWRlIDxtYWNoL3NwaS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgotI2luY2x1ZGUgPG1hY2gvYXVkbXV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9zc2kuaD4KLSNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tbWMuaD4KLSNpbmNsdWRlIDxtYWNoL214Y19laGNpLmg+Ci0jaW5jbHVkZSA8bWFjaC91bHBpLmg+Ci0KLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLSNkZWZpbmUgT1RHX1BIWV9DU19HUElPIChHUElPX1BPUlRCICsgMjMpCi0jZGVmaW5lIFVTQkgyX1BIWV9DU19HUElPIChHUElPX1BPUlRCICsgMjQpCi0KLXN0YXRpYyBpbnQgcGNhMTAwX3BpbnNbXSA9IHsKLQkvKiBVQVJUMSAqLwotCVBFMTJfUEZfVUFSVDFfVFhELAotCVBFMTNfUEZfVUFSVDFfUlhELAotCVBFMTRfUEZfVUFSVDFfQ1RTLAotCVBFMTVfUEZfVUFSVDFfUlRTLAotCS8qIFNESEMgKi8KLQlQQjRfUEZfU0QyX0QwLAotCVBCNV9QRl9TRDJfRDEsCi0JUEI2X1BGX1NEMl9EMiwKLQlQQjdfUEZfU0QyX0QzLAotCVBCOF9QRl9TRDJfQ01ELAotCVBCOV9QRl9TRDJfQ0xLLAotCS8qIEZFQyAqLwotCVBEMF9BSU5fRkVDX1RYRDAsCi0JUEQxX0FJTl9GRUNfVFhEMSwKLQlQRDJfQUlOX0ZFQ19UWEQyLAotCVBEM19BSU5fRkVDX1RYRDMsCi0JUEQ0X0FPVVRfRkVDX1JYX0VSLAotCVBENV9BT1VUX0ZFQ19SWEQxLAotCVBENl9BT1VUX0ZFQ19SWEQyLAotCVBEN19BT1VUX0ZFQ19SWEQzLAotCVBEOF9BRl9GRUNfTURJTywKLQlQRDlfQUlOX0ZFQ19NREMsCi0JUEQxMF9BT1VUX0ZFQ19DUlMsCi0JUEQxMV9BT1VUX0ZFQ19UWF9DTEssCi0JUEQxMl9BT1VUX0ZFQ19SWEQwLAotCVBEMTNfQU9VVF9GRUNfUlhfRFYsCi0JUEQxNF9BT1VUX0ZFQ19SWF9DTEssCi0JUEQxNV9BT1VUX0ZFQ19DT0wsCi0JUEQxNl9BSU5fRkVDX1RYX0VSLAotCVBGMjNfQUlOX0ZFQ19UWF9FTiwKLQkvKiBTU0kxICovCi0JUEMyMF9QRl9TU0kxX0ZTLAotCVBDMjFfUEZfU1NJMV9SWEQsCi0JUEMyMl9QRl9TU0kxX1RYRCwKLQlQQzIzX1BGX1NTSTFfQ0xLLAotCS8qIG9uYm9hcmQgSTJDICovCi0JUEM1X1BGX0kyQzJfU0RBLAotCVBDNl9QRl9JMkMyX1NDTCwKLQkvKiBleHRlcm5hbCBJMkMgKi8KLQlQRDE3X1BGX0kyQ19EQVRBLAotCVBEMThfUEZfSTJDX0NMSywKLQkvKiBTUEkxICovCi0JUEQyNV9QRl9DU1BJMV9SRFksCi0JUEQyOV9QRl9DU1BJMV9TQ0xLLAotCVBEMzBfUEZfQ1NQSTFfTUlTTywKLQlQRDMxX1BGX0NTUEkxX01PU0ksCi0JLyogT1RHICovCi0JT1RHX1BIWV9DU19HUElPIHwgR1BJT19HUElPIHwgR1BJT19PVVQsCi0JUEM3X1BGX1VTQk9UR19EQVRBNSwKLQlQQzhfUEZfVVNCT1RHX0RBVEE2LAotCVBDOV9QRl9VU0JPVEdfREFUQTAsCi0JUEMxMF9QRl9VU0JPVEdfREFUQTIsCi0JUEMxMV9QRl9VU0JPVEdfREFUQTEsCi0JUEMxMl9QRl9VU0JPVEdfREFUQTQsCi0JUEMxM19QRl9VU0JPVEdfREFUQTMsCi0JUEUwX1BGX1VTQk9UR19OWFQsCi0JUEUxX1BGX1VTQk9UR19TVFAsCi0JUEUyX1BGX1VTQk9UR19ESVIsCi0JUEUyNF9QRl9VU0JPVEdfQ0xLLAotCVBFMjVfUEZfVVNCT1RHX0RBVEE3LAotCS8qIFVTQkgyICovCi0JVVNCSDJfUEhZX0NTX0dQSU8gfCBHUElPX0dQSU8gfCBHUElPX09VVCwKLQlQQTBfUEZfVVNCSDJfQ0xLLAotCVBBMV9QRl9VU0JIMl9ESVIsCi0JUEEyX1BGX1VTQkgyX0RBVEE3LAotCVBBM19QRl9VU0JIMl9OWFQsCi0JUEE0X1BGX1VTQkgyX1NUUCwKLQlQRDE5X0FGX1VTQkgyX0RBVEE0LAotCVBEMjBfQUZfVVNCSDJfREFUQTMsCi0JUEQyMV9BRl9VU0JIMl9EQVRBNiwKLQlQRDIyX0FGX1VTQkgyX0RBVEEwLAotCVBEMjNfQUZfVVNCSDJfREFUQTIsCi0JUEQyNF9BRl9VU0JIMl9EQVRBMSwKLQlQRDI2X0FGX1VTQkgyX0RBVEE1LAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKLQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotfTsKLQotc3RhdGljIHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhIHBjYTEwMF9uYW5kX2JvYXJkX2luZm8gPSB7Ci0JLndpZHRoID0gMSwKLQkuaHdfZWNjID0gMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbXhjX3cxX21hc3Rlcl9kZXZpY2UsCi0JJm14Y19mZWNfZGV2aWNlLAotCSZteGNfd2R0LAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBwY2ExMDBfaTJjXzFfZGF0YSA9IHsKLQkuYml0cmF0ZSA9IDEwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIGJvYXJkX2VlcHJvbSA9IHsKLQkuYnl0ZV9sZW4gPSA0MDk2LAotCS5wYWdlX3NpemUgPSAzMiwKLQkuZmxhZ3MgPSBBVDI0X0ZMQUdfQUREUjE2LAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBwY2ExMDBfaTJjX2RldmljZXNbXSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJhdDI0IiwgMHg1MiksIC8qIEUwPTAsIEUxPTEsIEUyPTAgKi8KLQkJLnBsYXRmb3JtX2RhdGEgPSAmYm9hcmRfZWVwcm9tLAotCX0sIHsKLQkJSTJDX0JPQVJEX0lORk8oInJ0Yy1wY2Y4NTYzIiwgMHg1MSksCi0JCS50eXBlID0gInBjZjg1NjMiCi0JfSwgewotCQlJMkNfQk9BUkRfSU5GTygibG03NSIsIDB4NGEpLAotCQkudHlwZSA9ICJsbTc1IgotCX0KLX07Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19TUElfSU1YX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3Qgc3BpX2VlcHJvbSBhdDI1MzIwID0gewotCS5uYW1lCQk9ICJhdDI1MzIwYW4iLAotCS5ieXRlX2xlbgk9IDQwOTYsCi0JLnBhZ2Vfc2l6ZQk9IDMyLAotCS5mbGFncwkJPSBFRV9BRERSMiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gcGNhMTAwX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS5tb2RhbGlhcyA9ICJhdDI1IiwKLQkJLm1heF9zcGVlZF9oeiA9IDMwMDAwLAotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IDEsCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmF0MjUzMjAsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgcGNhMTAwX3NwaV9jc1tdID0ge0dQSU9fUE9SVEQgKyAyOCwgR1BJT19QT1JURCArIDI3fTsKLQotc3RhdGljIHN0cnVjdCBzcGlfaW14X21hc3RlciBwY2ExMDBfc3BpXzBfZGF0YSA9IHsKLQkuY2hpcHNlbGVjdAk9IHBjYTEwMF9zcGlfY3MsCi0JLm51bV9jaGlwc2VsZWN0ID0gQVJSQVlfU0laRShwY2ExMDBfc3BpX2NzKSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcGNhMTAwX2FjOTdfd2FybV9yZXNldChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCi17Ci0JbXhjX2dwaW9fbW9kZShHUElPX1BPUlRDIHwgMjAgfCBHUElPX0dQSU8gfCBHUElPX09VVCk7Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIwLCAxKTsKLQl1ZGVsYXkoMik7Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIwLCAwKTsKLQlteGNfZ3Bpb19tb2RlKFBDMjBfUEZfU1NJMV9GUyk7Ci0JbXNsZWVwKDIpOwotfQotCi1zdGF0aWMgdm9pZCBwY2ExMDBfYWM5N19jb2xkX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKLXsKLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyMCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsgIC8qIEZTICovCi0JZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIwLCAwKTsKLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyMiB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsgIC8qIFRYICovCi0JZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDIyLCAwKTsKLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyOCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsgIC8qIHJlc2V0ICovCi0JZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUQyArIDI4LCAwKTsKLQl1ZGVsYXkoMTApOwotCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUE9SVEMgKyAyOCwgMSk7Ci0JbXhjX2dwaW9fbW9kZShQQzIwX1BGX1NTSTFfRlMpOwotCW14Y19ncGlvX21vZGUoUEMyMl9QRl9TU0kxX1RYRCk7Ci0JbXNsZWVwKDIpOwotfQotCi1zdGF0aWMgc3RydWN0IGlteF9zc2lfcGxhdGZvcm1fZGF0YSBwY2ExMDBfc3NpX3BkYXRhID0gewotCS5hYzk3X3Jlc2V0CQk9IHBjYTEwMF9hYzk3X2NvbGRfcmVzZXQsCi0JLmFjOTdfd2FybV9yZXNldAk9IHBjYTEwMF9hYzk3X3dhcm1fcmVzZXQsCi0JLmZsYWdzCQkJPSBJTVhfU1NJX1VTRV9BQzk3LAotfTsKLQotc3RhdGljIGludCBwY2ExMDBfc2RoYzJfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgZGV0ZWN0X2lycSwKLQkJdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVxdWVzdF9pcnEoSVJRX0dQSU9DKDI5KSwgZGV0ZWN0X2lycSwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAotCQkJICAiaW14LW1tYy1kZXRlY3QiLCBkYXRhKTsKLQlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIKLQkJCSJwY2ExMDA6IEZhaWxlZCB0byByZXVlc3QgaXJxIGZvciBzZC9tbWMgZGV0ZWN0aW9uXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjYTEwMF9zZGhjMl9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlmcmVlX2lycShJUlFfR1BJT0MoMjkpLCBkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpbXhtbWNfcGxhdGZvcm1fZGF0YSBzZGhjX3BkYXRhID0gewotCS5pbml0ID0gcGNhMTAwX3NkaGMyX2luaXQsCi0JLmV4aXQgPSBwY2ExMDBfc2RoYzJfZXhpdCwKLX07Ci0KLXN0YXRpYyBpbnQgb3RnX3BoeV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoT1RHX1BIWV9DU19HUElPLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIG90Z19wZGF0YSA9IHsKLQkuaW5pdAk9IG90Z19waHlfaW5pdCwKLQkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAotCS5mbGFncwk9IE1YQ19FSENJX0lOVEVSRkFDRV9ESUZGX1VOSSwKLX07Ci0KLXN0YXRpYyBpbnQgdXNiaDJfcGh5X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlncGlvX3NldF92YWx1ZShVU0JIMl9QSFlfQ1NfR1BJTywgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMl9wZGF0YSA9IHsKLQkuaW5pdAk9IHVzYmgyX3BoeV9pbml0LAotCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VMUEksCi0JLmZsYWdzCT0gTVhDX0VIQ0lfSU5URVJGQUNFX0RJRkZfVU5JLAotfTsKLQotc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIG90Z19kZXZpY2VfcGRhdGEgPSB7Ci0JLm9wZXJhdGluZ19tb2RlID0gRlNMX1VTQjJfRFJfREVWSUNFLAotCS5waHlfbW9kZSAgICAgICA9IEZTTF9VU0IyX1BIWV9VTFBJLAotfTsKLQotc3RhdGljIGludCBvdGdfbW9kZV9ob3N0OwotCi1zdGF0aWMgaW50IF9faW5pdCBwY2ExMDBfb3RnX21vZGUoY2hhciAqb3B0aW9ucykKLXsKLQlpZiAoIXN0cmNtcChvcHRpb25zLCAiaG9zdCIpKQotCQlvdGdfbW9kZV9ob3N0ID0gMTsKLQllbHNlIGlmICghc3RyY21wKG9wdGlvbnMsICJkZXZpY2UiKSkKLQkJb3RnX21vZGVfaG9zdCA9IDA7Ci0JZWxzZQotCQlwcl9pbmZvKCJvdGdfbW9kZSBuZWl0aGVyIFwiaG9zdFwiIG5vciBcImRldmljZVwiLiAiCi0JCQkiRGVmYXVsdGluZyB0byBkZXZpY2VcbiIpOwotCXJldHVybiAwOwotfQotX19zZXR1cCgib3RnX21vZGU9IiwgcGNhMTAwX290Z19tb2RlKTsKLQotc3RhdGljIHZvaWQgX19pbml0IHBjYTEwMF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCS8qIFNTSSB1bml0ICovCi0JbXhjX2F1ZG11eF92MV9jb25maWd1cmVfcG9ydChNWDI3X0FVRE1VWF9IUENSMV9TU0kwLAotCQkJCSAgTVhDX0FVRE1VWF9WMV9QQ1JfU1lOIHwgLyogNHdpcmUgbW9kZSAqLwotCQkJCSAgTVhDX0FVRE1VWF9WMV9QQ1JfVEZDU0VMKDMpIHwKLQkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1RDTEtESVIgfCAvKiBjbG9jayBpcyBvdXRwdXQgKi8KLQkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1JYRFNFTCgzKSk7Ci0JbXhjX2F1ZG11eF92MV9jb25maWd1cmVfcG9ydCgzLAotCQkJCSAgTVhDX0FVRE1VWF9WMV9QQ1JfU1lOIHwgLyogNHdpcmUgbW9kZSAqLwotCQkJCSAgTVhDX0FVRE1VWF9WMV9QQ1JfVEZDU0VMKDApIHwKLQkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1RGU0RJUiB8Ci0JCQkJICBNWENfQVVETVVYX1YxX1BDUl9SWERTRUwoMCkpOwotCi0JcmV0ID0gbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhwY2ExMDBfcGlucywKLQkJCUFSUkFZX1NJWkUocGNhMTAwX3BpbnMpLCAiUENBMTAwIik7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJwY2ExMDA6IEZhaWxlZCB0byBzZXR1cCBwaW5zICglZClcbiIsIHJldCk7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXhfc3NpX2RldmljZTAsICZwY2ExMDBfc3NpX3BkYXRhKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKLQotCW14Y19ncGlvX21vZGUoR1BJT19QT1JUQyB8IDI5IHwgR1BJT19HUElPIHwgR1BJT19JTik7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NkaGNfZGV2aWNlMSwgJnNkaGNfcGRhdGEpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmaW14MjdfbmFuZF9kZXZpY2UsICZwY2ExMDBfbmFuZF9ib2FyZF9pbmZvKTsKLQotCS8qIG9ubHkgdGhlIGkyYyBtYXN0ZXIgMSBpcyB1c2VkIG9uIHRoaXMgQ1BVIGNhcmQgKi8KLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBwY2ExMDBfaTJjX2RldmljZXMsCi0JCQkJQVJSQVlfU0laRShwY2ExMDBfaTJjX2RldmljZXMpKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMSwgJnBjYTEwMF9pMmNfMV9kYXRhKTsKLQotCW14Y19ncGlvX21vZGUoR1BJT19QT1JURCB8IDI4IHwgR1BJT19HUElPIHwgR1BJT19PVVQpOwotCW14Y19ncGlvX21vZGUoR1BJT19QT1JURCB8IDI3IHwgR1BJT19HUElPIHwgR1BJT19PVVQpOwotCi0JLyogR1BJTzBfSVJRICovCi0JbXhjX2dwaW9fbW9kZShHUElPX1BPUlRDIHwgMzEgfCBHUElPX0dQSU8gfCBHUElPX0lOKTsKLQkvKiBHUElPMV9JUlEgKi8KLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEMgfCAyNSB8IEdQSU9fR1BJTyB8IEdQSU9fSU4pOwotCS8qIEdQSU8yX0lSUSAqLwotCW14Y19ncGlvX21vZGUoR1BJT19QT1JURSB8IDUgfCBHUElPX0dQSU8gfCBHUElPX0lOKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9JTVgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9JTVhfTU9EVUxFKQotCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHBjYTEwMF9zcGlfYm9hcmRfaW5mbywKLQkJCQlBUlJBWV9TSVpFKHBjYTEwMF9zcGlfYm9hcmRfaW5mbykpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zcGlfZGV2aWNlMCwgJnBjYTEwMF9zcGlfMF9kYXRhKTsKLSNlbmRpZgotCi0JZ3Bpb19yZXF1ZXN0KE9UR19QSFlfQ1NfR1BJTywgInVzYi1vdGctY3MiKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoT1RHX1BIWV9DU19HUElPLCAxKTsKLQlncGlvX3JlcXVlc3QoVVNCSDJfUEhZX0NTX0dQSU8sICJ1c2ItaG9zdDItY3MiKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoVVNCSDJfUEhZX0NTX0dQSU8sIDEpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX1VMUEkpCi0JaWYgKG90Z19tb2RlX2hvc3QpIHsKLQkJb3RnX3BkYXRhLm90ZyA9IG90Z191bHBpX2NyZWF0ZSgmbXhjX3VscGlfYWNjZXNzX29wcywKLQkJCQlVU0JfT1RHX0RSVl9WQlVTIHwgVVNCX09UR19EUlZfVkJVU19FWFQpOwotCi0JCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGdfaG9zdCwgJm90Z19wZGF0YSk7Ci0JfQotCi0JdXNiaDJfcGRhdGEub3RnID0gb3RnX3VscGlfY3JlYXRlKCZteGNfdWxwaV9hY2Nlc3Nfb3BzLAotCQkJCVVTQl9PVEdfRFJWX1ZCVVMgfCBVU0JfT1RHX0RSVl9WQlVTX0VYVCk7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDIsICZ1c2JoMl9wZGF0YSk7Ci0jZW5kaWYKLQlpZiAoIW90Z19tb2RlX2hvc3QpIHsKLQkJZ3Bpb19zZXRfdmFsdWUoT1RHX1BIWV9DU19HUElPLCAwKTsKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX290Z191ZGNfZGV2aWNlLCAmb3RnX2RldmljZV9wZGF0YSk7Ci0JfQotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2ExMDBfdGltZXJfaW5pdCh2b2lkKQotewotCW14MjdfY2xvY2tzX2luaXQoMjYwMDAwMDApOwotfQotCi1zdGF0aWMgc3RydWN0IHN5c190aW1lciBwY2ExMDBfdGltZXIgPSB7Ci0JLmluaXQgPSBwY2ExMDBfdGltZXJfaW5pdCwKLX07Ci0KLU1BQ0hJTkVfU1RBUlQoUENBMTAwLCAicGh5Q0FSRC1pLk1YMjciKQotCS5waHlzX2lvICAgICAgICA9IE1YMjdfQUlQSV9CQVNFX0FERFIsCi0JLmlvX3BnX29mZnN0ICAgID0gKChNWDI3X0FJUElfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMgICAgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCi0JLm1hcF9pbyAgICAgICAgID0gbXgyN19tYXBfaW8sCi0JLmluaXRfaXJxICAgICAgID0gbXgyN19pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lICAgPSBwY2ExMDBfaW5pdCwKLQkudGltZXIgICAgICAgICAgPSAmcGNhMTAwX3RpbWVyLAotTUFDSElORV9FTkQKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1wY20wMzguYyBiL2FyY2gvYXJtL21hY2gtbXgyL21hY2gtcGNtMDM4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Yzg5NDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvbWFjaC1wY20wMzguYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDcgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKLSAqIENvcHlyaWdodCAoQykgMjAwOCBKdWVyZ2VuIEJlaXNlcnQgKGtlcm5lbEBwZW5ndXRyb25peC5kZSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL2F0MjQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wbGF0LXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWMxMzc4My5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLQotI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGNtMDM4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pMmMuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgotI2luY2x1ZGUgPG1hY2gvc3BpLmg+Ci0jaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgotI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi1zdGF0aWMgaW50IHBjbTAzOF9waW5zW10gPSB7Ci0JLyogVUFSVDEgKi8KLQlQRTEyX1BGX1VBUlQxX1RYRCwKLQlQRTEzX1BGX1VBUlQxX1JYRCwKLQlQRTE0X1BGX1VBUlQxX0NUUywKLQlQRTE1X1BGX1VBUlQxX1JUUywKLQkvKiBVQVJUMiAqLwotCVBFM19QRl9VQVJUMl9DVFMsCi0JUEU0X1BGX1VBUlQyX1JUUywKLQlQRTZfUEZfVUFSVDJfVFhELAotCVBFN19QRl9VQVJUMl9SWEQsCi0JLyogVUFSVDMgKi8KLQlQRThfUEZfVUFSVDNfVFhELAotCVBFOV9QRl9VQVJUM19SWEQsCi0JUEUxMF9QRl9VQVJUM19DVFMsCi0JUEUxMV9QRl9VQVJUM19SVFMsCi0JLyogRkVDICovCi0JUEQwX0FJTl9GRUNfVFhEMCwKLQlQRDFfQUlOX0ZFQ19UWEQxLAotCVBEMl9BSU5fRkVDX1RYRDIsCi0JUEQzX0FJTl9GRUNfVFhEMywKLQlQRDRfQU9VVF9GRUNfUlhfRVIsCi0JUEQ1X0FPVVRfRkVDX1JYRDEsCi0JUEQ2X0FPVVRfRkVDX1JYRDIsCi0JUEQ3X0FPVVRfRkVDX1JYRDMsCi0JUEQ4X0FGX0ZFQ19NRElPLAotCVBEOV9BSU5fRkVDX01EQywKLQlQRDEwX0FPVVRfRkVDX0NSUywKLQlQRDExX0FPVVRfRkVDX1RYX0NMSywKLQlQRDEyX0FPVVRfRkVDX1JYRDAsCi0JUEQxM19BT1VUX0ZFQ19SWF9EViwKLQlQRDE0X0FPVVRfRkVDX1JYX0NMSywKLQlQRDE1X0FPVVRfRkVDX0NPTCwKLQlQRDE2X0FJTl9GRUNfVFhfRVIsCi0JUEYyM19BSU5fRkVDX1RYX0VOLAotCS8qIEkyQzIgKi8KLQlQQzVfUEZfSTJDMl9TREEsCi0JUEM2X1BGX0kyQzJfU0NMLAotCS8qIFNQSTEgKi8KLQlQRDI1X1BGX0NTUEkxX1JEWSwKLQlQRDI5X1BGX0NTUEkxX1NDTEssCi0JUEQzMF9QRl9DU1BJMV9NSVNPLAotCVBEMzFfUEZfQ1NQSTFfTU9TSSwKLQkvKiBTU0kxICovCi0JUEMyMF9QRl9TU0kxX0ZTLAotCVBDMjFfUEZfU1NJMV9SWEQsCi0JUEMyMl9QRl9TU0kxX1RYRCwKLQlQQzIzX1BGX1NTSTFfQ0xLLAotCS8qIFNTSTQgKi8KLQlQQzE2X1BGX1NTSTRfRlMsCi0JUEMxN19QRl9TU0k0X1JYRCwKLQlQQzE4X1BGX1NTSTRfVFhELAotCVBDMTlfUEZfU1NJNF9DTEssCi0JLyogVVNCIGhvc3QgKi8KLQlQQTBfUEZfVVNCSDJfQ0xLLAotCVBBMV9QRl9VU0JIMl9ESVIsCi0JUEEyX1BGX1VTQkgyX0RBVEE3LAotCVBBM19QRl9VU0JIMl9OWFQsCi0JUEE0X1BGX1VTQkgyX1NUUCwKLQlQRDE5X0FGX1VTQkgyX0RBVEE0LAotCVBEMjBfQUZfVVNCSDJfREFUQTMsCi0JUEQyMV9BRl9VU0JIMl9EQVRBNiwKLQlQRDIyX0FGX1VTQkgyX0RBVEEwLAotCVBEMjNfQUZfVVNCSDJfREFUQTIsCi0JUEQyNF9BRl9VU0JIMl9EQVRBMSwKLQlQRDI2X0FGX1VTQkgyX0RBVEE1LAotfTsKLQotLyoKLSAqIFBoeXRlYydzIFBDTTAzOCBjb21lcyB3aXRoIDJNaUIgYmF0dGVyeSBidWZmZXJlZCBTUkFNLAotICogMTYgYml0IHdpZHRoCi0gKi8KLQotc3RhdGljIHN0cnVjdCBwbGF0ZGF0YV9tdGRfcmFtIHBjbTAzOF9zcmFtX2RhdGEgPSB7Ci0JLmJhbmt3aWR0aCA9IDIsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBjbTAzOF9zcmFtX3Jlc291cmNlID0gewotCS5zdGFydCA9IE1YMjdfQ1MxX0JBU0VfQUREUiwKLQkuZW5kICAgPSBNWDI3X0NTMV9CQVNFX0FERFIgKyA1MTIgKiAxMDI0IC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBjbTAzOF9zcmFtX210ZF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXRkLXJhbSIsCi0JLmlkID0gMCwKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZwY20wMzhfc3JhbV9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZwY20wMzhfc3JhbV9yZXNvdXJjZSwKLX07Ci0KLS8qCi0gKiBQaHl0ZWMncyBwaHlDT1JFLWkuTVgyNyBjb21lcyB3aXRoIDMyTWlCIGZsYXNoLAotICogMTYgYml0IHdpZHRoCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBjbTAzOF9mbGFzaF9kYXRhID0gewotCS53aWR0aCA9IDIsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBjbTAzOF9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQgPSAweGMwMDAwMDAwLAotCS5lbmQgICA9IDB4YzFmZmZmZmYsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwY20wMzhfbm9yX210ZF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkID0gMCwKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZwY20wMzhfZmxhc2hfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmcGNtMDM4X2ZsYXNoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YVtdID0gewotCXsKLQkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLQl9LCB7Ci0JCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi0JfSwgewotCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEgcGNtMDM4X25hbmRfYm9hcmRfaW5mbyA9IHsKLQkud2lkdGggPSAxLAotCS5od19lY2MgPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZwY20wMzhfbm9yX210ZF9kZXZpY2UsCi0JJm14Y193MV9tYXN0ZXJfZGV2aWNlLAotCSZteGNfZmVjX2RldmljZSwKLQkmcGNtMDM4X3NyYW1fbXRkX2RldmljZSwKLQkmbXhjX3dkdCwKLX07Ci0KLS8qIE9uIHBjbTAzOCB0aGVyZSdzIGEgc3JhbSBhdHRhY2hlZCB0byBDUzEsIHdlIGVuYWJsZSB0aGUgY2hpcHNlbGVjdCBoZXJlIGFuZAotICogc2V0dXAgb3RoZXIgc3R1ZmZzIHRvIGFjY2VzcyB0aGUgc3JhbS4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdF9zcmFtKHZvaWQpCi17Ci0JbXgyN19zZXR1cF93ZWltY3MoMSwgMHgwMDAwZDg0MywgMHgyMjI1MjUyMSwgMHgyMjIyMGEwMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgcGNtMDM4X2kyY18xX2RhdGEgPSB7Ci0JLmJpdHJhdGUgPSAxMDAwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBib2FyZF9lZXByb20gPSB7Ci0JLmJ5dGVfbGVuID0gNDA5NiwKLQkucGFnZV9zaXplID0gMzIsCi0JLmZsYWdzID0gQVQyNF9GTEFHX0FERFIxNiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gcGNtMDM4X2kyY19kZXZpY2VzW10gPSB7Ci0JewotCQlJMkNfQk9BUkRfSU5GTygiYXQyNCIsIDB4NTIpLCAvKiBFMD0wLCBFMT0xLCBFMj0wICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmJvYXJkX2VlcHJvbSwKLQl9LCB7Ci0JCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTYzIiwgMHg1MSksCi0JfSwgewotCQlJMkNfQk9BUkRfSU5GTygibG03NSIsIDB4NGEpLAotCX0KLX07Ci0KLXN0YXRpYyBpbnQgcGNtMDM4X3NwaV9jc1tdID0ge0dQSU9fUE9SVEQgKyAyOH07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgcGNtMDM4X3NwaV8wX2RhdGEgPSB7Ci0JLmNoaXBzZWxlY3QgPSBwY20wMzhfc3BpX2NzLAotCS5udW1fY2hpcHNlbGVjdCA9IEFSUkFZX1NJWkUocGNtMDM4X3NwaV9jcyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc2RoYzFfY29uc3VtZXJzW10gPSB7Ci0JewotCQkuZGV2CT0gJm14Y19zZGhjX2RldmljZTEuZGV2LAotCQkuc3VwcGx5CT0gInNkaGNfdmNjIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkaGMxX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWID0gMzAwMDAwMCwKLQkJLm1heF91ViA9IDM0MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8Ci0JCQlSRUdVTEFUT1JfQ0hBTkdFX01PREUgfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnZhbGlkX21vZGVzX21hc2sgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwgfAotCQkJUkVHVUxBVE9SX01PREVfRkFTVCwKLQkJLmFsd2F5c19vbiA9IDAsCi0JCS5ib290X29uID0gMCwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHNkaGMxX2NvbnN1bWVycyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzID0gc2RoYzFfY29uc3VtZXJzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGNhbV9jb25zdW1lcnNbXSA9IHsKLQl7Ci0JCS5kZXYJPSBOVUxMLAotCQkuc3VwcGx5CT0gImlteF9jYW1fdmNjIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGNhbV9kYXRhID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91ViA9IDMwMDAwMDAsCi0JCS5tYXhfdVYgPSAzNDAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAotCQkJUkVHVUxBVE9SX0NIQU5HRV9NT0RFIHwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS52YWxpZF9tb2Rlc19tYXNrID0gUkVHVUxBVE9SX01PREVfTk9STUFMIHwKLQkJCVJFR1VMQVRPUl9NT0RFX0ZBU1QsCi0JCS5hbHdheXNfb24gPSAwLAotCQkuYm9vdF9vbiA9IDAsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShjYW1fY29uc3VtZXJzKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSBjYW1fY29uc3VtZXJzLAotfTsKLQotc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSBwY20wMzhfcmVndWxhdG9yc1tdID0gewotCXsKLQkJLmlkID0gTUMxMzc4M19SRUdVX1ZDQU0sCi0JCS5pbml0X2RhdGEgPSAmY2FtX2RhdGEsCi0JfSwgewotCQkuaWQgPSBNQzEzNzgzX1JFR1VfVk1NQzEsCi0JCS5pbml0X2RhdGEgPSAmc2RoYzFfZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYzEzNzgzX3BsYXRmb3JtX2RhdGEgcGNtMDM4X3BtaWMgPSB7Ci0JLnJlZ3VsYXRvcnMgPSBwY20wMzhfcmVndWxhdG9ycywKLQkubnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKHBjbTAzOF9yZWd1bGF0b3JzKSwKLQkuZmxhZ3MgPSBNQzEzNzgzX1VTRV9BREMgfCBNQzEzNzgzX1VTRV9SRUdVTEFUT1IgfAotCQkgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4sCi19OwotCi1zdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHBjbTAzOF9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkubW9kYWxpYXMgPSAibWMxMzc4MyIsCi0JCS5pcnEgPSBJUlFfR1BJT0IoMjMpLAotCQkubWF4X3NwZWVkX2h6ID0gMzAwMDAwLAotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IDAsCi0JCS5wbGF0Zm9ybV9kYXRhID0gJnBjbTAzOF9wbWljLAotCQkubW9kZSA9IFNQSV9DU19ISUdILAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMl9wZGF0YSA9IHsKLQkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAotCS5mbGFncwk9IE1YQ19FSENJX1BPV0VSX1BJTlNfRU5BQkxFRCB8IE1YQ19FSENJX0lOVEVSRkFDRV9ESUZGX1VOSSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdCh2b2lkKQotewotCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMocGNtMDM4X3BpbnMsIEFSUkFZX1NJWkUocGNtMDM4X3BpbnMpLAotCQkJIlBDTTAzOCIpOwotCi0JcGNtMDM4X2luaXRfc3JhbSgpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGFbMF0pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhWzFdKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9wZGF0YVsyXSk7Ci0KLQlteGNfZ3Bpb19tb2RlKFBFMTZfQUZfT1dJUkUpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteDI3X25hbmRfZGV2aWNlLCAmcGNtMDM4X25hbmRfYm9hcmRfaW5mbyk7Ci0KLQkvKiBvbmx5IHRoZSBpMmMgbWFzdGVyIDEgaXMgdXNlZCBvbiB0aGlzIENQVSBjYXJkICovCi0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgcGNtMDM4X2kyY19kZXZpY2VzLAotCQkJCUFSUkFZX1NJWkUocGNtMDM4X2kyY19kZXZpY2VzKSk7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfaTJjX2RldmljZTEsICZwY20wMzhfaTJjXzFfZGF0YSk7Ci0KLQkvKiBQRTE4IGZvciB1c2VyLUxFRCBENDAgKi8KLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEUgfCAxOCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsKLQotCW14Y19ncGlvX21vZGUoR1BJT19QT1JURCB8IDI4IHwgR1BJT19HUElPIHwgR1BJT19PVVQpOwotCi0JLyogTUMxMzc4MyBJUlEgKi8KLQlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEIgfCAyMyB8IEdQSU9fR1BJTyB8IEdQSU9fSU4pOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NwaV9kZXZpY2UwLCAmcGNtMDM4X3NwaV8wX2RhdGEpOwotCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHBjbTAzOF9zcGlfYm9hcmRfaW5mbywKLQkJCQlBUlJBWV9TSVpFKHBjbTAzOF9zcGlfYm9hcmRfaW5mbykpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmgyLCAmdXNiaDJfcGRhdGEpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7Ci0KLSNpZmRlZiBDT05GSUdfTUFDSF9QQ005NzBfQkFTRUJPQVJECi0JcGNtOTcwX2Jhc2Vib2FyZF9pbml0KCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHBjbTAzOF90aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgyN19jbG9ja3NfaW5pdCgyNjAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIHBjbTAzOF90aW1lciA9IHsKLQkuaW5pdCA9IHBjbTAzOF90aW1lcl9pbml0LAotfTsKLQotTUFDSElORV9TVEFSVChQQ00wMzgsICJwaHlDT1JFLWkuTVgyNyIpCi0JLnBoeXNfaW8gICAgICAgID0gTVgyN19BSVBJX0JBU0VfQUREUiwKLQkuaW9fcGdfb2Zmc3QgICAgPSAoKE1YMjdfQUlQSV9CQVNFX0FERFJfVklSVCkgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcyAgICA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKLQkubWFwX2lvICAgICAgICAgPSBteDI3X21hcF9pbywKLQkuaW5pdF9pcnEgICAgICAgPSBteDI3X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUgICA9IHBjbTAzOF9pbml0LAotCS50aW1lciAgICAgICAgICA9ICZwY20wMzhfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvbW0taW14MjEuYyBiL2FyY2gvYXJtL21hY2gtbXgyL21tLWlteDIxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTM0MzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvbW0taW14MjEuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW14Mi9tbS1pbXgyMS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydCAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0vKiBNWDIxIG1lbW9yeSBtYXAgZGVmaW5pdGlvbiAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbXgyMV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQkvKgotCSAqIHRoaXMgZml4ZWQgbWFwcGluZyBjb3ZlcnM6Ci0JICogLSBBSVBJMQotCSAqIC0gQUlQSTIKLQkgKiAtIEFJVEMKLQkgKiAtIFJPTSBQYXRjaAotCSAqIC0gYW5kIHNvbWUgcmVzZXJ2ZWQgc3BhY2UKLQkgKi8KLQl7Ci0JCS52aXJ0dWFsID0gTVgyMV9BSVBJX0JBU0VfQUREUl9WSVJULAotCQkucGZuID0gX19waHlzX3RvX3BmbihNWDIxX0FJUElfQkFTRV9BRERSKSwKLQkJLmxlbmd0aCA9IE1YMjFfQUlQSV9TSVpFLAotCQkudHlwZSA9IE1UX0RFVklDRQotCX0sCi0JLyoKLQkgKiB0aGlzIGZpeGVkIG1hcHBpbmcgY292ZXJzOgotCSAqIC0gQ1NJCi0JICogLSBBVEEKLQkgKi8KLQl7Ci0JCS52aXJ0dWFsID0gTVgyMV9TQUhCMV9CQVNFX0FERFJfVklSVCwKLQkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyMV9TQUhCMV9CQVNFX0FERFIpLAotCQkubGVuZ3RoID0gTVgyMV9TQUhCMV9TSVpFLAotCQkudHlwZSA9IE1UX0RFVklDRQotCX0sCi0JLyoKLQkgKiB0aGlzIGZpeGVkIG1hcHBpbmcgY292ZXJzOgotCSAqIC0gRU1JCi0JICovCi0JewotCQkudmlydHVhbCA9IE1YMjFfWF9NRU1DX0JBU0VfQUREUl9WSVJULAotCQkucGZuID0gX19waHlzX3RvX3BmbihNWDIxX1hfTUVNQ19CQVNFX0FERFIpLAotCQkubGVuZ3RoID0gTVgyMV9YX01FTUNfU0laRSwKLQkJLnR5cGUgPSBNVF9ERVZJQ0UKLQl9LAotfTsKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIG1lbW9yeSBtYXAuIEl0IGlzIGNhbGxlZCBkdXJpbmcgdGhlCi0gKiBzeXN0ZW0gc3RhcnR1cCB0byBjcmVhdGUgc3RhdGljIHBoeXNpY2FsIHRvIHZpcnR1YWwKLSAqIG1lbW9yeSBtYXAgZm9yIHRoZSBJTyBtb2R1bGVzLgotICovCi12b2lkIF9faW5pdCBteDIxX21hcF9pbyh2b2lkKQotewotCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDIxKTsKLQlteGNfYXJjaF9yZXNldF9pbml0KE1YMjFfSU9fQUREUkVTUyhNWDIxX1dET0dfQkFTRV9BRERSKSk7Ci0KLQlpb3RhYmxlX2luaXQoaW14MjFfaW9fZGVzYywgQVJSQVlfU0laRShpbXgyMV9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IG14MjFfaW5pdF9pcnEodm9pZCkKLXsKLQlteGNfaW5pdF9pcnEoTVgyMV9JT19BRERSRVNTKE1YMjFfQVZJQ19CQVNFX0FERFIpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL21tLWlteDI3LmMgYi9hcmNoL2FybS9tYWNoLW14Mi9tbS1pbXgyNy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY2ZWQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL21tLWlteDI3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1teDIvbW0taW14MjcuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBKdWVyZ2VuIEJlaXNlcnQgKGtlcm5lbEBwZW5ndXRyb25peC5kZSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotLyogTVgyNyBtZW1vcnkgbWFwIGRlZmluaXRpb24gKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW14MjdfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JLyoKLQkgKiB0aGlzIGZpeGVkIG1hcHBpbmcgY292ZXJzOgotCSAqIC0gQUlQSTEKLQkgKiAtIEFJUEkyCi0JICogLSBBSVRDCi0JICogLSBST00gUGF0Y2gKLQkgKiAtIGFuZCBzb21lIHJlc2VydmVkIHNwYWNlCi0JICovCi0JewotCQkudmlydHVhbCA9IE1YMjdfQUlQSV9CQVNFX0FERFJfVklSVCwKLQkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyN19BSVBJX0JBU0VfQUREUiksCi0JCS5sZW5ndGggPSBNWDI3X0FJUElfU0laRSwKLQkJLnR5cGUgPSBNVF9ERVZJQ0UKLQl9LAotCS8qCi0JICogdGhpcyBmaXhlZCBtYXBwaW5nIGNvdmVyczoKLQkgKiAtIENTSQotCSAqIC0gQVRBCi0JICovCi0JewotCQkudmlydHVhbCA9IE1YMjdfU0FIQjFfQkFTRV9BRERSX1ZJUlQsCi0JCS5wZm4gPSBfX3BoeXNfdG9fcGZuKE1YMjdfU0FIQjFfQkFTRV9BRERSKSwKLQkJLmxlbmd0aCA9IE1YMjdfU0FIQjFfU0laRSwKLQkJLnR5cGUgPSBNVF9ERVZJQ0UKLQl9LAotCS8qCi0JICogdGhpcyBmaXhlZCBtYXBwaW5nIGNvdmVyczoKLQkgKiAtIEVNSQotCSAqLwotCXsKLQkJLnZpcnR1YWwgPSBNWDI3X1hfTUVNQ19CQVNFX0FERFJfVklSVCwKLQkJLnBmbiA9IF9fcGh5c190b19wZm4oTVgyN19YX01FTUNfQkFTRV9BRERSKSwKLQkJLmxlbmd0aCA9IE1YMjdfWF9NRU1DX1NJWkUsCi0JCS50eXBlID0gTVRfREVWSUNFCi0JfSwKLX07Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQotICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsCi0gKiBtZW1vcnkgbWFwIGZvciB0aGUgSU8gbW9kdWxlcy4KLSAqLwotdm9pZCBfX2luaXQgbXgyN19tYXBfaW8odm9pZCkKLXsKLQlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgyNyk7Ci0JbXhjX2FyY2hfcmVzZXRfaW5pdChNWDI3X0lPX0FERFJFU1MoTVgyN19XRE9HX0JBU0VfQUREUikpOwotCi0JaW90YWJsZV9pbml0KGlteDI3X2lvX2Rlc2MsIEFSUkFZX1NJWkUoaW14MjdfaW9fZGVzYykpOwotfQotCi12b2lkIF9faW5pdCBteDI3X2luaXRfaXJxKHZvaWQpCi17Ci0JbXhjX2luaXRfaXJxKE1YMjdfSU9fQUREUkVTUyhNWDI3X0FWSUNfQkFTRV9BRERSKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtbXgyL3NlcmlhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBjODM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL3NlcmlhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgotI2luY2x1ZGUgImRldmljZXMuaCIKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0MFtdID0gewotCXsKLQkJLnN0YXJ0ID0gTVgyeF9VQVJUMV9CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDJ4X1VBUlQxX0JBU0VfQUREUiArIDB4MEI1LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YMnhfSU5UX1VBUlQxLAotCQkuZW5kID0gTVgyeF9JTlRfVUFSVDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTAgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDAsCi0JLnJlc291cmNlID0gdWFydDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDFbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IE1YMnhfVUFSVDJfQkFTRV9BRERSLAotCQkuZW5kID0gTVgyeF9VQVJUMl9CQVNFX0FERFIgKyAweDBCNSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgPSBNWDJ4X0lOVF9VQVJUMiwKLQkJLmVuZCA9IE1YMnhfSU5UX1VBUlQyLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxID0gewotCS5uYW1lID0gImlteC11YXJ0IiwKLQkuaWQgPSAxLAotCS5yZXNvdXJjZSA9IHVhcnQxLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1YXJ0MSksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVhcnQyW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDJ4X1VBUlQzX0JBU0VfQUREUiwKLQkJLmVuZCA9IE1YMnhfVUFSVDNfQkFTRV9BRERSICsgMHgwQjUsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVgyeF9JTlRfVUFSVDMsCi0JCS5lbmQgPSBNWDJ4X0lOVF9VQVJUMywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMiA9IHsKLQkubmFtZSA9ICJpbXgtdWFydCIsCi0JLmlkID0gMiwKLQkucmVzb3VyY2UgPSB1YXJ0MiwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodWFydDIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0M1tdID0gewotCXsKLQkJLnN0YXJ0ID0gTVgyeF9VQVJUNF9CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDJ4X1VBUlQ0X0JBU0VfQUREUiArIDB4MEI1LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YMnhfSU5UX1VBUlQ0LAotCQkuZW5kID0gTVgyeF9JTlRfVUFSVDQsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTMgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDMsCi0JLnJlc291cmNlID0gdWFydDMsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQzKSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfTUFDSF9NWDI3Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVhcnQ0W10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDI3X1VBUlQ1X0JBU0VfQUREUiwKLQkJLmVuZCA9IE1YMjdfVUFSVDVfQkFTRV9BRERSICsgMHgwQjUsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVgyN19JTlRfVUFSVDUsCi0JCS5lbmQgPSBNWDI3X0lOVF9VQVJUNSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlNCA9IHsKLQkubmFtZSA9ICJpbXgtdWFydCIsCi0JLmlkID0gNCwKLQkucmVzb3VyY2UgPSB1YXJ0NCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodWFydDQpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0NVtdID0gewotCXsKLQkJLnN0YXJ0ID0gTVgyN19VQVJUNl9CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDI3X1VBUlQ2X0JBU0VfQUREUiArIDB4MEI1LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YMjdfSU5UX1VBUlQ2LAotCQkuZW5kID0gTVgyN19JTlRfVUFSVDYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTUgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDUsCi0JLnJlc291cmNlID0gdWFydDUsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQ1KSwKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyNS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1teDI1L0tjb25maWcKaW5kZXggNTRkMjE3My4uYzcxYTdiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDI1L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1teDI1L0tjb25maWcKQEAgLTQsNSArNCwyOCBAQAogCiBjb25maWcgTUFDSF9NWDI1XzNEUwogCWJvb2wgIlN1cHBvcnQgTVgyNVBESyAoM0RTKSBQbGF0Zm9ybSIKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKKworY29uZmlnIE1BQ0hfRVVLUkVBX0NQVUlNWDI1CisJYm9vbCAiU3VwcG9ydCBFdWtyZWEgQ1BVSU1YMjUgUGxhdGZvcm0iCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKKwlzZWxlY3QgTVhDX1VMUEkgaWYgVVNCX1VMUEkKKworY2hvaWNlCisJcHJvbXB0ICJCYXNlYm9hcmQiCisJZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9DUFVJTVgyNQorCWRlZmF1bHQgTUFDSF9FVUtSRUFfTUJJTVhTRDI1X0JBU0VCT0FSRAorCitjb25maWcgTUFDSF9FVUtSRUFfTUJJTVhTRDI1X0JBU0VCT0FSRAorCXByb21wdCAiRXVrcmVhIE1CSU1YU0QgZGV2ZWxvcG1lbnQgYm9hcmQiCisJYm9vbAorCWhlbHAKKwkgIFRoaXMgYWRkcyBib2FyZCBzcGVjaWZpYyBkZXZpY2VzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIEV1a3JlYSdzCisJICBNQklNWFNEIGV2YWx1YXRpb24gYm9hcmQuCisKK2VuZGNob2ljZQogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDI1L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1teDI1L01ha2VmaWxlCmluZGV4IDEwY2ViYzUuLmQ5ZTQ2Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgyNS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW14MjUvTWFrZWZpbGUKQEAgLTEsMyArMSw1IEBACiBvYmoteQkJCQk6PSBtbS5vIGRldmljZXMubwogb2JqLSQoQ09ORklHX0FSQ0hfTVgyNSkJCSs9IGNsb2NrLm8KLW9iai0kKENPTkZJR19NQUNIX01YMjVfM0RTKQkrPSBtYWNoLW14MjVwZGsubworb2JqLSQoQ09ORklHX01BQ0hfTVgyNV8zRFMpCSs9IG1hY2gtbXgyNV8zZHMubworb2JqLSQoQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI1KQkJKz0gbWFjaC1jcHVpbXgyNS5vCitvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVhTRDI1X0JBU0VCT0FSRCkJKz0gZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyNS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1teDI1L2Nsb2NrLmMKaW5kZXggMTU1MDE0OS4uNDBjN2NjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDI1L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDI1L2Nsb2NrLmMKQEAgLTEwOSw2ICsxMDksMTYgQEAKIAlyZXR1cm4gZ2V0X3JhdGVfcGVyKDE1KTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfc3NpMihzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGdldF9yYXRlX3BlcigxNCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9yYXRlX3NzaTEoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBnZXRfcmF0ZV9wZXIoMTMpOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9pMmMoc3RydWN0IGNsayAqY2xrKQogewogCXJldHVybiBnZXRfcmF0ZV9wZXIoNik7CkBAIC0xMjksOSArMTM5LDE3IEBACiAJcmV0dXJuIGdldF9yYXRlX3Blcig3KTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3JhdGVfY3NpKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gZ2V0X3JhdGVfcGVyKDApOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcmF0ZV9vdGcoc3RydWN0IGNsayAqY2xrKQogewotCXJldHVybiA0ODAwMDAwMDsgLyogRklYTUUgKi8KKwl1bnNpZ25lZCBsb25nIGNjdGwgPSByZWFkbChDUk1fQkFTRSArIENDTV9DQ1RMKTsKKwl1bnNpZ25lZCBsb25nIHJhdGUgPSBnZXRfcmF0ZV91cGxsKCk7CisKKwlyZXR1cm4gKGNjdGwgJiAoMSA8PCAyMykpID8gMCA6IHJhdGUgLyAoKDB4M0YgJiAoY2N0bCA+PiAxNikpICsgMSk7CiB9CiAKIHN0YXRpYyBpbnQgY2xrX2NnY3JfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKQEAgLTE2NiwxNCArMTg0LDQwIEBACiAJCS5zZWNvbmRhcnkJPSBzLAkJCVwKIAl9CiAKKy8qCisgKiBOb3RlOiB0aGUgZm9sbG93aW5nIElQRyBjbG9jayBnYXRpbmcgYml0cyBhcmUgd3JvbmdseSBtYXJrZWQgIlJlc2VydmVkIiBpbgorICogdGhlIGkuTVgyNSBSZWZlcmVuY2UgTWFudWFsIFJldiAxLCB0YWJsZSAxNS0xMy4gVGhlIGluZm9ybWF0aW9uIGJlbG93IGlzCisgKiB0YWtlbiBmcm9tIHRoZSBGcmVlc2NhbGUgcmVsZWFzZWQgQlNQLgorICoKKyAqIGJpdAlyZWcJb2Zmc2V0CWNsb2NrCisgKgorICogMAlDR0NSMQkwCUFVRE1VWAorICogMTIJQ0dDUjEJMTIJRVNBSQorICogMTYJQ0dDUjEJMTYJR1BJTzEKKyAqIDE3CUNHQ1IxCTE3CUdQSU8yCisgKiAxOAlDR0NSMQkxOAlHUElPMworICogMjMJQ0dDUjEJMjMJSTJDMQorICogMjQJQ0dDUjEJMjQJSTJDMgorICogMjUJQ0dDUjEJMjUJSTJDMworICogMjcJQ0dDUjEJMjcJSU9NVVhDCisgKiAyOAlDR0NSMQkyOAlLUFAKKyAqIDMwCUNHQ1IxCTMwCU9XSVJFCisgKiAzNglDR0NSMgk0CVJUSUMKKyAqIDUxCUNHQ1IyCTE5CVdET0cKKyAqLworCiBERUZJTkVfQ0xPQ0soZ3B0X2NsaywgICAgMCwgQ0NNX0NHQ1IwLCAgNSwgZ2V0X3JhdGVfZ3B0LCBOVUxMLCBOVUxMKTsKIERFRklORV9DTE9DSyh1YXJ0X3Blcl9jbGssIDAsIENDTV9DR0NSMCwgMTUsIGdldF9yYXRlX3VhcnQsIE5VTEwsIE5VTEwpOworREVGSU5FX0NMT0NLKHNzaTFfcGVyX2NsaywgMCwgQ0NNX0NHQ1IwLCAxMywgZ2V0X3JhdGVfaXBnLCBOVUxMLCBOVUxMKTsKK0RFRklORV9DTE9DSyhzc2kyX3Blcl9jbGssIDAsIENDTV9DR0NSMCwgMTQsIGdldF9yYXRlX2lwZywgTlVMTCwgTlVMTCk7CiBERUZJTkVfQ0xPQ0soY3NwaTFfY2xrLCAgMCwgQ0NNX0NHQ1IxLCAgNSwgZ2V0X3JhdGVfaXBnLCBOVUxMLCBOVUxMKTsKIERFRklORV9DTE9DSyhjc3BpMl9jbGssICAwLCBDQ01fQ0dDUjEsICA2LCBnZXRfcmF0ZV9pcGcsIE5VTEwsIE5VTEwpOwogREVGSU5FX0NMT0NLKGNzcGkzX2NsaywgIDAsIENDTV9DR0NSMSwgIDcsIGdldF9yYXRlX2lwZywgTlVMTCwgTlVMTCk7CiBERUZJTkVfQ0xPQ0soZmVjX2FoYl9jbGssIDAsIENDTV9DR0NSMCwgMjMsIE5VTEwsCSBOVUxMLCBOVUxMKTsKIERFRklORV9DTE9DSyhsY2RjX2FoYl9jbGssIDAsIENDTV9DR0NSMCwgMjQsIE5VTEwsCSBOVUxMLCBOVUxMKTsKIERFRklORV9DTE9DSyhsY2RjX3Blcl9jbGssIDAsIENDTV9DR0NSMCwgIDcsIE5VTEwsCSBOVUxMLCAmbGNkY19haGJfY2xrKTsKK0RFRklORV9DTE9DSyhjc2lfYWhiX2NsaywgMCwgQ0NNX0NHQ1IwLCAxOCwgZ2V0X3JhdGVfY3NpLCBOVUxMLCBOVUxMKTsKK0RFRklORV9DTE9DSyhjc2lfcGVyX2NsaywgMCwgQ0NNX0NHQ1IwLCAwLCBnZXRfcmF0ZV9jc2ksIE5VTEwsICZjc2lfYWhiX2Nsayk7CiBERUZJTkVfQ0xPQ0sodWFydDFfY2xrLCAgMCwgQ0NNX0NHQ1IyLCAxNCwgZ2V0X3JhdGVfdWFydCwgTlVMTCwgJnVhcnRfcGVyX2Nsayk7CiBERUZJTkVfQ0xPQ0sodWFydDJfY2xrLCAgMCwgQ0NNX0NHQ1IyLCAxNSwgZ2V0X3JhdGVfdWFydCwgTlVMTCwgJnVhcnRfcGVyX2Nsayk7CiBERUZJTkVfQ0xPQ0sodWFydDNfY2xrLCAgMCwgQ0NNX0NHQ1IyLCAxNiwgZ2V0X3JhdGVfdWFydCwgTlVMTCwgJnVhcnRfcGVyX2Nsayk7CkBAIC0xOTEsNiArMjM1LDEzIEBACiBERUZJTkVfQ0xPQ0soZmVjX2NsaywJIDAsIENDTV9DR0NSMSwgMTUsIGdldF9yYXRlX2lwZywgTlVMTCwgJmZlY19haGJfY2xrKTsKIERFRklORV9DTE9DSyhkcnlpY2VfY2xrLCAwLCBDQ01fQ0dDUjEsICA4LCBnZXRfcmF0ZV9pcGcsIE5VTEwsIE5VTEwpOwogREVGSU5FX0NMT0NLKGxjZGNfY2xrLAkgMCwgQ0NNX0NHQ1IxLCAyOSwgZ2V0X3JhdGVfbGNkYywgTlVMTCwgJmxjZGNfcGVyX2Nsayk7CitERUZJTkVfQ0xPQ0sod2R0X2NsaywgICAgMCwgQ0NNX0NHQ1IyLCAxOSwgZ2V0X3JhdGVfaXBnLCBOVUxMLCAgTlVMTCk7CitERUZJTkVfQ0xPQ0soc3NpMV9jbGssICAwLCBDQ01fQ0dDUjIsIDExLCBnZXRfcmF0ZV9zc2kxLCBOVUxMLCAmc3NpMV9wZXJfY2xrKTsKK0RFRklORV9DTE9DSyhzc2kyX2NsaywgIDEsIENDTV9DR0NSMiwgMTIsIGdldF9yYXRlX3NzaTIsIE5VTEwsICZzc2kyX3Blcl9jbGspOworREVGSU5FX0NMT0NLKGF1ZG11eF9jbGssIDAsIENDTV9DR0NSMSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CitERUZJTkVfQ0xPQ0soY3NpX2NsaywgICAgMCwgQ0NNX0NHQ1IxLCAgNCwgZ2V0X3JhdGVfY3NpLCBOVUxMLCAgJmNzaV9wZXJfY2xrKTsKK0RFRklORV9DTE9DSyhjYW4xX2NsaywJIDAsIENDTV9DR0NSMSwgIDIsIGdldF9yYXRlX2lwZywgTlVMTCwgTlVMTCk7CitERUZJTkVfQ0xPQ0soY2FuMl9jbGssCSAwLCBDQ01fQ0dDUjEsICAzLCBnZXRfcmF0ZV9pcGcsIE5VTEwsIE5VTEwpOwogCiAjZGVmaW5lIF9SRUdJU1RFUl9DTE9DSyhkLCBuLCBjKQlcCiAJewkJCQlcCkBAIC0yMTcsNyArMjY4LDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19wd20uMSIsIE5VTEwsIHB3bTJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjX3B3bS4yIiwgTlVMTCwgcHdtM19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGNfcHdtLjMiLCBOVUxMLCBwd200X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soIm14Yy1rZXlwYWQiLCBOVUxMLCBrcHBfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LWtleXBhZCIsIE5VTEwsIGtwcF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteDI1LWFkYyIsIE5VTEwsIHRzY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4xIiwgTlVMTCwgaTJjX2NsaykKQEAgLTIyNSw2ICsyNzYsMTMgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteGRpX3J0Yy4wIiwgTlVMTCwgZHJ5aWNlX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1mYi4wIiwgTlVMTCwgbGNkY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtd2R0LjAiLCBOVUxMLCB3ZHRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14Mi1jYW1lcmEuMCIsIE5VTEwsIGNzaV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdWRtdXgiLCBhdWRtdXhfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiZmxleGNhbi4wIiwgTlVMTCwgY2FuMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJmbGV4Y2FuLjEiLCBOVUxMLCBjYW4yX2NsaykKIH07CiAKIGludCBfX2luaXQgbXgyNV9jbG9ja3NfaW5pdCh2b2lkKQpAQCAtMjM4LDkgKzI5NiwxMyBAQAogCV9fcmF3X3dyaXRlbCgoMSA8PCAxOSksIENSTV9CQVNFICsgQ0NNX0NHQ1IwKTsKIAlfX3Jhd193cml0ZWwoKDB4ZiA8PCAxNikgfCAoMyA8PCAyNiksIENSTV9CQVNFICsgQ0NNX0NHQ1IxKTsKIAlfX3Jhd193cml0ZWwoKDEgPDwgNSksIENSTV9CQVNFICsgQ0NNX0NHQ1IyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19MTCkgJiYgIWRlZmluZWQoQ09ORklHX0RFQlVHX0lDRURDQykKKwljbGtfZW5hYmxlKCZ1YXJ0MV9jbGspOworI2VuZGlmCiAKLQkvKiBDbG9jayBzb3VyY2UgZm9yIGxjZGMgaXMgdXBsbCAqLwotCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDUk1fQkFTRSsweDY0KSB8ICgxIDw8IDcpLCBDUk1fQkFTRSArIDB4NjQpOworCS8qIENsb2NrIHNvdXJjZSBmb3IgbGNkYyBhbmQgY3NpIGlzIHVwbGwgKi8KKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoQ1JNX0JBU0UrMHg2NCkgfCAoMSA8PCA3KSB8ICgxIDw8IDApLAorCQkJQ1JNX0JBU0UgKyAweDY0KTsKIAogCW14Y190aW1lcl9pbml0KCZncHRfY2xrLCBNWDI1X0lPX0FERFJFU1MoTVgyNV9HUFQxX0JBU0VfQUREUiksIDU0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDI1L2RldmljZXMtaW14MjUuaCBiL2FyY2gvYXJtL21hY2gtbXgyNS9kZXZpY2VzLWlteDI1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YTdjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9kZXZpY2VzLWlteDI1LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBQZW5ndXRyb25peAorICogVXdlIEtsZWluZS1Lb2VuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bWFjaC9teDI1Lmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCisjZGVmaW5lIGlteDI1X2FkZF9mbGV4Y2FuMChwZGF0YSkJXAorCWlteF9hZGRfZmxleGNhbigwLCBNWDI1X0NBTjFfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0NBTjEsIHBkYXRhKQorI2RlZmluZSBpbXgyNV9hZGRfZmxleGNhbjEocGRhdGEpCVwKKwlpbXhfYWRkX2ZsZXhjYW4oMSwgTVgyNV9DQU4yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9DQU4yLCBwZGF0YSkKKworI2RlZmluZSBpbXgyNV9hZGRfaW14X2kyYzAocGRhdGEpCVwKKwlpbXhfYWRkX2lteF9pMmMoMCwgTVgyNV9JMkMxX0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9JMkMxLCBwZGF0YSkKKyNkZWZpbmUgaW14MjVfYWRkX2lteF9pMmMxKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfaTJjKDEsIE1YMjVfSTJDMl9CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfSTJDMiwgcGRhdGEpCisjZGVmaW5lIGlteDI1X2FkZF9pbXhfaTJjMihwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygyLCBNWDI1X0kyQzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0kyQzMsIHBkYXRhKQorCisjZGVmaW5lIGlteDI1X2FkZF9pbXhfdWFydDAocGRhdGEpCVwKKwlpbXhfYWRkX2lteF91YXJ0XzFpcnEoMCwgTVgyNV9VQVJUMV9CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfVUFSVDEsIHBkYXRhKQorI2RlZmluZSBpbXgyNV9hZGRfaW14X3VhcnQxKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDEsIE1YMjVfVUFSVDJfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX1VBUlQyLCBwZGF0YSkKKyNkZWZpbmUgaW14MjVfYWRkX2lteF91YXJ0MihwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgyLCBNWDI1X1VBUlQzX0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9VQVJUMywgcGRhdGEpCisjZGVmaW5lIGlteDI1X2FkZF9pbXhfdWFydDMocGRhdGEpCVwKKwlpbXhfYWRkX2lteF91YXJ0XzFpcnEoMywgTVgyNV9VQVJUNF9CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfVUFSVDQsIHBkYXRhKQorI2RlZmluZSBpbXgyNV9hZGRfaW14X3VhcnQ0KHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDQsIE1YMjVfVUFSVDVfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX1VBUlQ1LCBwZGF0YSkKKworI2RlZmluZSBpbXgyNV9hZGRfbXhjX25hbmQocGRhdGEpCVwKKwlpbXhfYWRkX214Y19uYW5kX3YyMShNWDI1X05GQ19CQVNFX0FERFIsIE1YMjVfSU5UX05BTkRGQywgcGRhdGEpCisKKyNkZWZpbmUgaW14MjVfYWRkX3NwaV9pbXgwKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDAsIE1YMjVfQ1NQSTFfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0NTUEkxLCBwZGF0YSkKKyNkZWZpbmUgaW14MjVfYWRkX3NwaV9pbXgxKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDEsIE1YMjVfQ1NQSTJfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0NTUEkyLCBwZGF0YSkKKyNkZWZpbmUgaW14MjVfYWRkX3NwaV9pbXgyKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDIsIE1YMjVfQ1NQSTNfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0NTUEkzLCBwZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyNS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW14MjUvZGV2aWNlcy5jCmluZGV4IDNhNDA1ZmEuLjM0NjhlYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgyNS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDI1L2RldmljZXMuYwpAQCAtMjIsMTAzICsyMiw2IEBACiAjaW5jbHVkZSA8bWFjaC9teDI1Lmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDBbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IDB4NDNmOTAwMDAsCi0JCS5lbmQgPSAweDQzZjkzZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IDQ1LAotCQkuZW5kID0gNDUsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTAgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDAsCi0JLnJlc291cmNlID0gdWFydDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDFbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IDB4NDNmOTQwMDAsCi0JCS5lbmQgPSAweDQzZjk3ZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IDMyLAotCQkuZW5kID0gMzIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTEgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDEsCi0JLnJlc291cmNlID0gdWFydDEsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQxKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDJbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IDB4NTAwMGMwMDAsCi0JCS5lbmQgPSAweDUwMDBmZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IDE4LAotCQkuZW5kID0gMTgsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTIgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDIsCi0JLnJlc291cmNlID0gdWFydDIsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQyKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IDB4NTAwMDgwMDAsCi0JCS5lbmQgPSAweDUwMDBiZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IDUsCi0JCS5lbmQgPSA1LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UzID0gewotCS5uYW1lID0gImlteC11YXJ0IiwKLQkuaWQgPSAzLAotCS5yZXNvdXJjZSA9IHVhcnQzLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1YXJ0MyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVhcnQ0W10gPSB7Ci0JewotCQkuc3RhcnQgPSAweDUwMDJjMDAwLAotCQkuZW5kID0gMHg1MDAyZmZmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgPSA0MCwKLQkJLmVuZCA9IDQwLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2U0ID0gewotCS5uYW1lID0gImlteC11YXJ0IiwKLQkuaWQgPSA0LAotCS5yZXNvdXJjZSA9IHVhcnQ0LAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1YXJ0NCksCi19OwotCi0jZGVmaW5lIE1YMjVfT1RHX0JBU0VfQUREUiAweDUzRkY0MDAwCi0KIHN0YXRpYyB1NjQgb3RnX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19vdGdfcmVzb3VyY2VzW10gPSB7CkBAIC0xODEsNjMgKzg0LDYgQEAKIAkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX3VzYmgyX3Jlc291cmNlcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19zcGlfcmVzb3VyY2VzMFtdID0gewotCXsKLQkgICAgICAgLnN0YXJ0ID0gMHg0M2ZhNDAwMCwKLQkgICAgICAgLmVuZCA9IDB4NDNmYTdmZmYsCi0JICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkgICAgICAgLnN0YXJ0ID0gMTQsCi0JICAgICAgIC5lbmQgPSAxNCwKLQkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UwID0gewotCS5uYW1lID0gInNwaV9pbXgiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19zcGlfcmVzb3VyY2VzMCksCi0JLnJlc291cmNlID0gbXhjX3NwaV9yZXNvdXJjZXMwLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfc3BpX3Jlc291cmNlczFbXSA9IHsKLQl7Ci0JICAgICAgIC5zdGFydCA9IDB4NTAwMTAwMDAsCi0JICAgICAgIC5lbmQgPSAweDUwMDEzZmZmLAotCSAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JICAgICAgIC5zdGFydCA9IDEzLAotCSAgICAgICAuZW5kID0gMTMsCi0JICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19zcGlfZGV2aWNlMSA9IHsKLQkubmFtZSA9ICJzcGlfaW14IiwKLQkuaWQgPSAxLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfc3BpX3Jlc291cmNlczEpLAotCS5yZXNvdXJjZSA9IG14Y19zcGlfcmVzb3VyY2VzMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3NwaV9yZXNvdXJjZXMyW10gPSB7Ci0JewotCSAgICAgICAuc3RhcnQgPSAweDUwMDA0MDAwLAotCSAgICAgICAuZW5kID0gMHg1MDAwN2ZmZiwKLQkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCSAgICAgICAuc3RhcnQgPSAwLAotCSAgICAgICAuZW5kID0gMCwKLQkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UyID0gewotCS5uYW1lID0gInNwaV9pbXgiLAotCS5pZCA9IDIsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19zcGlfcmVzb3VyY2VzMiksCi0JLnJlc291cmNlID0gbXhjX3NwaV9yZXNvdXJjZXMyLAotfTsKLQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfcHdtX3Jlc291cmNlczBbXSA9IHsKIAl7CiAJCS5zdGFydAk9IDB4NTNmZTAwMDAsCkBAIC0zMzMsNjMgKzE3OSw2IEBACiAJLnJlc291cmNlID0gbXhjX3B3bV9yZXNvdXJjZXMzLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfaTJjXzFfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJPSAweDQzZjgwMDAwLAotCQkuZW5kCT0gMHg0M2Y4M2ZmZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQJPSAzLAotCQkuZW5kCT0gMywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTAgPSB7Ci0JLm5hbWUgPSAiaW14LWkyYyIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX2kyY18xX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX2kyY18xX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX2kyY18yX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gMHg0M2Y5ODAwMCwKLQkJLmVuZAk9IDB4NDNmOWJmZmYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0CT0gNCwKLQkJLmVuZAk9IDQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2kyY19kZXZpY2UxID0gewotCS5uYW1lID0gImlteC1pMmMiLAotCS5pZCA9IDEsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19pMmNfMl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IG14Y19pMmNfMl9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19pMmNfM19yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IDB4NDNmODQwMDAsCi0JCS5lbmQJPSAweDQzZjg3ZmZmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IDEwLAotCQkuZW5kCT0gMTAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2kyY19kZXZpY2UyID0gewotCS5uYW1lID0gImlteC1pMmMiLAotCS5pZCA9IDIsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19pMmNfM19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IG14Y19pMmNfM19yZXNvdXJjZXMsCi19OwotCiBzdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgaW14X2dwaW9fcG9ydHNbXSA9IHsKIAl7CiAJCS5jaGlwLmxhYmVsID0gImdwaW8tMCIsCkBAIC00MTQsNyArMjAzLDcgQEAKIAl9CiB9OwogCi1pbnQgX19pbml0IG14Y19yZWdpc3Rlcl9ncGlvcyh2b2lkKQoraW50IF9faW5pdCBpbXgyNV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQogewogCXJldHVybiBteGNfZ3Bpb19pbml0KGlteF9ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKGlteF9ncGlvX3BvcnRzKSk7CiB9CkBAIC00MzksMjYgKzIyOCw2IEBACiAJLnJlc291cmNlCT0gbXgyNV9mZWNfcmVzb3VyY2VzLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfbmFuZF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IE1YMjVfTkZDX0JBU0VfQUREUiwKLQkJLmVuZAk9IE1YMjVfTkZDX0JBU0VfQUREUiArIDB4MWZmZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydAk9IE1YMjVfSU5UX05BTkRGQywKLQkJLmVuZAk9IE1YMjVfSU5UX05BTkRGQywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX25hbmRfZGV2aWNlID0gewotCS5uYW1lCQk9ICJteGNfbmFuZCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG14Y19uYW5kX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gbXhjX25hbmRfcmVzb3VyY2VzLAotfTsKLQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDI1X3J0Y19yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydAk9IE1YMjVfRFJZSUNFX0JBU0VfQUREUiwKQEAgLTUxNSwzICsyODQsODMgQEAKIAkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX3dkdF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZSA9IG14Y193ZHRfcmVzb3VyY2VzLAogfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDI1X2twcF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IE1YMjVfS1BQX0JBU0VfQUREUiwKKwkJLmVuZAk9IE1YMjVfS1BQX0JBU0VfQUREUiArIDB4ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IE1YMjVfSU5UX0tQUCwKKwkJLmVuZAk9IE1YMjVfSU5UX0tQUCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXgyNV9rcHBfZGV2aWNlID0geworCS5uYW1lCT0gImlteC1rZXlwYWQiLAorCS5pZAk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShteDI1X2twcF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG14MjVfa3BwX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3NzaV9yZXNvdXJjZXMwW10gPSB7CisJeworCQkuc3RhcnQJPSBNWDI1X1NTSTFfQkFTRV9BRERSLAorCQkuZW5kCT0gTVgyNV9TU0kxX0JBU0VfQUREUiArIDB4M2ZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJPSBNWDI1X0lOVF9TU0kxLAorCQkuZW5kCT0gTVgyNV9JTlRfU1NJMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3NzaV9yZXNvdXJjZXMxW10gPSB7CisJeworCQkuc3RhcnQJPSBNWDI1X1NTSTJfQkFTRV9BRERSLAorCQkuZW5kCT0gTVgyNV9TU0kyX0JBU0VfQUREUiArIDB4M2ZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KKwl9LCB7CisJCS5zdGFydAk9IE1YMjVfSU5UX1NTSTIsCisJCS5lbmQJPSBNWDI1X0lOVF9TU0kyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3NpX2RldmljZTAgPSB7CisJLm5hbWUgPSAiaW14LXNzaSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoaW14X3NzaV9yZXNvdXJjZXMwKSwKKwkucmVzb3VyY2UgPSBpbXhfc3NpX3Jlc291cmNlczAsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9zc2lfZGV2aWNlMSA9IHsKKwkubmFtZSA9ICJpbXgtc3NpIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShpbXhfc3NpX3Jlc291cmNlczEpLAorCS5yZXNvdXJjZSA9IGlteF9zc2lfcmVzb3VyY2VzMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXgyNV9jc2lfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBNWDI1X0NTSV9CQVNFX0FERFIsCisJCS5lbmQJPSBNWDI1X0NTSV9CQVNFX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IE1YMjVfSU5UX0NTSSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI1X2NzaV9kZXZpY2UgPSB7CisJLm5hbWUJPSAibXgyLWNhbWVyYSIsCisJLmlkCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXgyNV9jc2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBteDI1X2NzaV9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MjUvZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1teDI1L2RldmljZXMuaAppbmRleCBjZWUxMmMwLi40YWNlYjY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14MjUvZGV2aWNlcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9kZXZpY2VzLmgKQEAgLTEsMjQgKzEsMTYgQEAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTM7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2U0OwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX290ZzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG90Z191ZGNfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3B3bV9kZXZpY2UwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3B3bV9kZXZpY2UxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3B3bV9kZXZpY2UyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3B3bV9kZXZpY2UzOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2tleXBhZF9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI1X2ZlY19kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfbmFuZF9kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI1X3J0Y19kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI1X2ZiX2RldmljZTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y193ZHQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI1X2twcF9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3NpX2RldmljZTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3NpX2RldmljZTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDI1X2NzaV9kZXZpY2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MjUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLW14MjUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5MzFkYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9ldWtyZWFfbWJpbXhzZC1iYXNlYm9hcmQuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBFcmljIEJlbmFyZCAtIGVyaWNAZXVrcmVhLmNvbQorICoKKyAqIEJhc2VkIG9uIHBjbTk3MC1iYXNlYm9hcmQuYyB3aGljaCBpcyA6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0IChrZXJuZWxAcGVuZ3V0cm9uaXguZGUpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjUuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgorI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KKyNpbmNsdWRlIDxtYWNoL2lteGZiLmg+CisjaW5jbHVkZSA8bWFjaC9zc2kuaD4KKyNpbmNsdWRlIDxtYWNoL2F1ZG11eC5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBldWtyZWFfbWJpbXhzZF9wYWRzW10gPSB7CisJLyogTENEICovCisJTVgyNV9QQURfTEQwX19MRDAsCisJTVgyNV9QQURfTEQxX19MRDEsCisJTVgyNV9QQURfTEQyX19MRDIsCisJTVgyNV9QQURfTEQzX19MRDMsCisJTVgyNV9QQURfTEQ0X19MRDQsCisJTVgyNV9QQURfTEQ1X19MRDUsCisJTVgyNV9QQURfTEQ2X19MRDYsCisJTVgyNV9QQURfTEQ3X19MRDcsCisJTVgyNV9QQURfTEQ4X19MRDgsCisJTVgyNV9QQURfTEQ5X19MRDksCisJTVgyNV9QQURfTEQxMF9fTEQxMCwKKwlNWDI1X1BBRF9MRDExX19MRDExLAorCU1YMjVfUEFEX0xEMTJfX0xEMTIsCisJTVgyNV9QQURfTEQxM19fTEQxMywKKwlNWDI1X1BBRF9MRDE0X19MRDE0LAorCU1YMjVfUEFEX0xEMTVfX0xEMTUsCisJTVgyNV9QQURfR1BJT19FX19MRDE2LAorCU1YMjVfUEFEX0dQSU9fRl9fTEQxNywKKwlNWDI1X1BBRF9IU1lOQ19fSFNZTkMsCisJTVgyNV9QQURfVlNZTkNfX1ZTWU5DLAorCU1YMjVfUEFEX0xTQ0xLX19MU0NMSywKKwlNWDI1X1BBRF9PRV9BQ0RfX09FX0FDRCwKKwlNWDI1X1BBRF9DT05UUkFTVF9fQ09OVFJBU1QsCisJLyogTENEX1BXUiAqLworCU1YMjVfUEFEX1BXTV9fR1BJT18xXzI2LAorCS8qIExFRCAqLworCU1YMjVfUEFEX1BPV0VSX0ZBSUxfX0dQSU9fM18xOSwKKwkvKiBTV0lUQ0ggKi8KKwlNWDI1X1BBRF9WU1RCWV9BQ0tfX0dQSU9fM18xOCwKKwkvKiBVQVJUMiAqLworCU1YMjVfUEFEX1VBUlQyX1JUU19fVUFSVDJfUlRTLAorCU1YMjVfUEFEX1VBUlQyX0NUU19fVUFSVDJfQ1RTLAorCU1YMjVfUEFEX1VBUlQyX1RYRF9fVUFSVDJfVFhELAorCU1YMjVfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhELAorCS8qIFNEMSAqLworCU1YMjVfUEFEX1NEMV9DTURfX1NEMV9DTUQsCisJTVgyNV9QQURfU0QxX0NMS19fU0QxX0NMSywKKwlNWDI1X1BBRF9TRDFfREFUQTBfX1NEMV9EQVRBMCwKKwlNWDI1X1BBRF9TRDFfREFUQTFfX1NEMV9EQVRBMSwKKwlNWDI1X1BBRF9TRDFfREFUQTJfX1NEMV9EQVRBMiwKKwlNWDI1X1BBRF9TRDFfREFUQTNfX1NEMV9EQVRBMywKKwkvKiBTRDEgQ0QgKi8KKwlNWDI1X1BBRF9ERV9CX19HUElPXzJfMjAsCisJLyogSTJTICovCisJTVgyNV9QQURfS1BQX0NPTDNfX0FVRDVfVFhGUywKKwlNWDI1X1BBRF9LUFBfQ09MMl9fQVVENV9UWEMsCisJTVgyNV9QQURfS1BQX0NPTDFfX0FVRDVfUlhELAorCU1YMjVfUEFEX0tQUF9DT0wwX19BVUQ1X1RYRCwKK307CisKKyNkZWZpbmUgR1BJT19MRUQxCTgzCisjZGVmaW5lIEdQSU9fU1dJVENIMQk4MgorI2RlZmluZSBHUElPX1NEMUNECTUyCisjZGVmaW5lIEdQSU9fTENEUFdSCTI2CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2ZiX3ZpZGVvbW9kZSBldWtyZWFfbXhpbXhzZF9tb2Rlc1tdID0geworCXsKKwkJLm1vZGUJPSB7CisJCQkubmFtZQkJPSAiQ01PLVFWR0EiLAorCQkJLnJlZnJlc2gJPSA2MCwKKwkJCS54cmVzCQk9IDMyMCwKKwkJCS55cmVzCQk9IDI0MCwKKwkJCS5waXhjbG9jawk9IEtIWjJQSUNPUyg2NTAwKSwKKwkJCS5sZWZ0X21hcmdpbgk9IDMwLAorCQkJLnJpZ2h0X21hcmdpbgk9IDM4LAorCQkJLnVwcGVyX21hcmdpbgk9IDIwLAorCQkJLmxvd2VyX21hcmdpbgk9IDMsCisJCQkuaHN5bmNfbGVuCT0gMTUsCisJCQkudnN5bmNfbGVuCT0gNCwKKwkJfSwKKwkJLmJwcAk9IDE2LAorCQkucGNyCT0gMHhDQUQwOEI4MCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSBldWtyZWFfbXhpbXhzZF9mYl9wZGF0YSA9IHsKKwkubW9kZQkJPSBldWtyZWFfbXhpbXhzZF9tb2RlcywKKwkubnVtX21vZGVzCT0gQVJSQVlfU0laRShldWtyZWFfbXhpbXhzZF9tb2RlcyksCisJLnB3bXIJCT0gMHgwMEE5MDNGRiwKKwkubHNjcjEJCT0gMHgwMDEyMDMwMCwKKwkuZG1hY3IJCT0gMHgwMDA0MDA2MCwKK307CisKK3N0YXRpYyB2b2lkIGV1a3JlYV9tYmlteHNkX2xjZF9wb3dlcl9zZXQoc3RydWN0IHBsYXRfbGNkX2RhdGEgKnBkLAorCQkJCSAgIHVuc2lnbmVkIGludCBwb3dlcikKK3sKKwlpZiAocG93ZXIpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0xDRFBXUiwgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19MQ0RQV1IsIDApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyX2RhdGEgPSB7CisJLnNldF9wb3dlcgkJPSBldWtyZWFfbWJpbXhzZF9sY2RfcG93ZXJfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyZGV2ID0geworCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGV1a3JlYV9tYmlteHNkX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAibGVkMSIsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmdwaW8JCQk9IEdQSU9fTEVEMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGV1a3JlYV9tYmlteHNkX2xlZF9pbmZvID0geworCS5sZWRzCQk9IGV1a3JlYV9tYmlteHNkX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9sZWRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV1a3JlYV9tYmlteHNkX2xlZHNfZ3BpbyA9IHsKKwkubmFtZQk9ICJsZWRzLWdwaW8iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmV1a3JlYV9tYmlteHNkX2xlZF9pbmZvLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZXVrcmVhX21iaW14c2RfZ3Bpb19idXR0b25zW10gPSB7CisJeworCQkuZ3BpbwkJPSBHUElPX1NXSVRDSDEsCisJCS5jb2RlCQk9IEJUTl8wLAorCQkuZGVzYwkJPSAiQlAxIiwKKwkJLmFjdGl2ZV9sb3cJPSAxLAorCQkud2FrZXVwCQk9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgZXVrcmVhX21iaW14c2RfYnV0dG9uX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBldWtyZWFfbWJpbXhzZF9ncGlvX2J1dHRvbnMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9ncGlvX2J1dHRvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXVrcmVhX21iaW14c2RfYnV0dG9uX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZ3Bpby1rZXlzIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZldWtyZWFfbWJpbXhzZF9idXR0b25fZGF0YSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmV1a3JlYV9tYmlteHNkX2xlZHNfZ3BpbywKKwkmZXVrcmVhX21iaW14c2RfYnV0dG9uX2RldmljZSwKKwkmZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyZGV2LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBldWtyZWFfbWJpbXhzZF9pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzIzIiwgMHgxYSksCisJfSwKK307CisKK3N0cnVjdCBpbXhfc3NpX3BsYXRmb3JtX2RhdGEgZXVrcmVhX21iaW14c2Rfc3NpX3BkYXRhID0geworCS5mbGFncyA9IElNWF9TU0lfU1lOIHwgSU1YX1NTSV9ORVQgfCBJTVhfU1NJX1VTRV9JMlNfU0xBVkUsCit9OworCisvKgorICogc3lzdGVtIGluaXQgZm9yIGJhc2Vib2FyZCB1c2FnZS4gV2lsbCBiZSBjYWxsZWQgYnkgY3B1aW14MjUgaW5pdC4KKyAqCisgKiBBZGQgcGxhdGZvcm0gZGV2aWNlcyBwcmVzZW50IG9uIHRoaXMgYmFzZWJvYXJkIGFuZCBpbml0CisgKiB0aGVtIGZyb20gQ1BVIHNpZGUgYXMgZmFyIGFzIHJlcXVpcmVkIHRvIHVzZSB0aGVtIGxhdGVyIG9uCisgKi8KK3ZvaWQgX19pbml0IGV1a3JlYV9tYmlteHNkX2Jhc2Vib2FyZF9pbml0KHZvaWQpCit7CisJaWYgKG14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKGV1a3JlYV9tYmlteHNkX3BhZHMsCisJCQlBUlJBWV9TSVpFKGV1a3JlYV9tYmlteHNkX3BhZHMpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzZXR0aW5nIG1iaW14c2QgcGFkcyAhXG4iKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfRVVLUkVBX1RMVjMyMCkKKwkvKiBTU0kgdW5pdCBtYXN0ZXIgSTJTIGNvZGVjIGNvbm5lY3RlZCB0byBTU0lfQVVENSovCisJbXhjX2F1ZG11eF92Ml9jb25maWd1cmVfcG9ydCgwLAorCQkJTVhDX0FVRE1VWF9WMl9QVENSX1NZTiB8CisJCQlNWENfQVVETVVYX1YyX1BUQ1JfVEZTRElSIHwKKwkJCU1YQ19BVURNVVhfVjJfUFRDUl9URlNFTCg0KSB8CisJCQlNWENfQVVETVVYX1YyX1BUQ1JfVENMS0RJUiB8CisJCQlNWENfQVVETVVYX1YyX1BUQ1JfVENTRUwoNCksCisJCQlNWENfQVVETVVYX1YyX1BEQ1JfUlhEU0VMKDQpCisJKTsKKwlteGNfYXVkbXV4X3YyX2NvbmZpZ3VyZV9wb3J0KDQsCisJCQlNWENfQVVETVVYX1YyX1BUQ1JfU1lOLAorCQkJTVhDX0FVRE1VWF9WMl9QRENSX1JYRFNFTCgwKQorCSk7CisjZW5kaWYKKworCWlteDI1X2FkZF9pbXhfdWFydDEoJnVhcnRfcGRhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14MjVfZmJfZGV2aWNlLCAmZXVrcmVhX214aW14c2RfZmJfcGRhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF9zc2lfZGV2aWNlMCwgJmV1a3JlYV9tYmlteHNkX3NzaV9wZGF0YSk7CisKKwlncGlvX3JlcXVlc3QoR1BJT19MRUQxLCAiTEVEMSIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0xFRDEsIDEpOworCWdwaW9fZnJlZShHUElPX0xFRDEpOworCisJZ3Bpb19yZXF1ZXN0KEdQSU9fU1dJVENIMSwgIlNXSVRDSDEiKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1NXSVRDSDEpOworCWdwaW9fZnJlZShHUElPX1NXSVRDSDEpOworCisJZ3Bpb19yZXF1ZXN0KEdQSU9fTENEUFdSLCAiTENEUFdSIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTENEUFdSLCAxKTsKKwlncGlvX2ZyZWUoR1BJT19TV0lUQ0gxKTsKKworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGV1a3JlYV9tYmlteHNkX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoZXVrcmVhX21iaW14c2RfaTJjX2RldmljZXMpKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDI1L21hY2gtY3B1aW14MjUuYyBiL2FyY2gvYXJtL21hY2gtbXgyNS9tYWNoLWNwdWlteDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiMmUyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9tYWNoLWNwdWlteDI1LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTYXNjaGEgSGF1ZXIsIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQgMjAxMCBFcmljIELDqW5hcmQgLSBFdWtyw6lhIEVsZWN0cm9tYXRpcXVlLCA8ZXJpY0BldWtyZWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZmVjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi91bHBpLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKworI2luY2x1ZGUgPG1hY2gvZXVrcmVhLWJhc2Vib2FyZHMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgorI2luY2x1ZGUgPG1hY2gvbXhjX25hbmQuaD4KKyNpbmNsdWRlIDxtYWNoL2lteGZiLmg+CisjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgorI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNS5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBldWtyZWFfY3B1aW14MjVfcGFkc1tdID0geworCS8qIEZFQyAtIFJNSUkgKi8KKwlNWDI1X1BBRF9GRUNfTURDX19GRUNfTURDLAorCU1YMjVfUEFEX0ZFQ19NRElPX19GRUNfTURJTywKKwlNWDI1X1BBRF9GRUNfVERBVEEwX19GRUNfVERBVEEwLAorCU1YMjVfUEFEX0ZFQ19UREFUQTFfX0ZFQ19UREFUQTEsCisJTVgyNV9QQURfRkVDX1RYX0VOX19GRUNfVFhfRU4sCisJTVgyNV9QQURfRkVDX1JEQVRBMF9fRkVDX1JEQVRBMCwKKwlNWDI1X1BBRF9GRUNfUkRBVEExX19GRUNfUkRBVEExLAorCU1YMjVfUEFEX0ZFQ19SWF9EVl9fRkVDX1JYX0RWLAorCU1YMjVfUEFEX0ZFQ19UWF9DTEtfX0ZFQ19UWF9DTEssCisJLyogSTJDMSAqLworCU1YMjVfUEFEX0kyQzFfQ0xLX19JMkMxX0NMSywKKwlNWDI1X1BBRF9JMkMxX0RBVF9fSTJDMV9EQVQsCit9OworCitzdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9kYXRhIG14MjVfZmVjX3BkYXRhID0geworCS5waHkJPSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YQorZXVrcmVhX2NwdWlteDI1X25hbmRfYm9hcmRfaW5mbyBfX2luaXRjb25zdCA9IHsKKwkud2lkdGgJCT0gMSwKKwkuaHdfZWNjCQk9IDEsCisJLmZsYXNoX2JidAk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhCitldWtyZWFfY3B1aW14MjVfaTJjMF9kYXRhIF9faW5pdGNvbnN0ID0geworCS5iaXRyYXRlID0gMTAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBldWtyZWFfY3B1aW14MjVfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTYzIiwgMHg1MSksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBvdGdfcGRhdGEgPSB7CisJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfVVRNSSwKKwkuZmxhZ3MJPSBNWENfRUhDSV9JTlRFUkZBQ0VfRElGRl9VTkksCit9OworCitzdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDJfcGRhdGEgPSB7CisJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfU0VSSUFMLAorCS5mbGFncwk9IE1YQ19FSENJX0lOVEVSRkFDRV9TSU5HTEVfVU5JIHwgTVhDX0VIQ0lfSU5URVJOQUxfUEhZIHwKKwkJICBNWENfRUhDSV9JUFBVRV9ET1dOLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIG90Z19kZXZpY2VfcGRhdGEgPSB7CisJLm9wZXJhdGluZ19tb2RlID0gRlNMX1VTQjJfRFJfREVWSUNFLAorCS5waHlfbW9kZSAgICAgICA9IEZTTF9VU0IyX1BIWV9VVE1JLAorfTsKKworc3RhdGljIGludCBvdGdfbW9kZV9ob3N0OworCitzdGF0aWMgaW50IF9faW5pdCBldWtyZWFfY3B1aW14MjVfb3RnX21vZGUoY2hhciAqb3B0aW9ucykKK3sKKwlpZiAoIXN0cmNtcChvcHRpb25zLCAiaG9zdCIpKQorCQlvdGdfbW9kZV9ob3N0ID0gMTsKKwllbHNlIGlmICghc3RyY21wKG9wdGlvbnMsICJkZXZpY2UiKSkKKwkJb3RnX21vZGVfaG9zdCA9IDA7CisJZWxzZQorCQlwcl9pbmZvKCJvdGdfbW9kZSBuZWl0aGVyIFwiaG9zdFwiIG5vciBcImRldmljZVwiLiAiCisJCQkiRGVmYXVsdGluZyB0byBkZXZpY2VcbiIpOworCXJldHVybiAwOworfQorX19zZXR1cCgib3RnX21vZGU9IiwgZXVrcmVhX2NwdWlteDI1X290Z19tb2RlKTsKKworc3RhdGljIHZvaWQgX19pbml0IGV1a3JlYV9jcHVpbXgyNV9pbml0KHZvaWQpCit7CisJaWYgKG14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKGV1a3JlYV9jcHVpbXgyNV9wYWRzLAorCQkJQVJSQVlfU0laRShldWtyZWFfY3B1aW14MjVfcGFkcykpKQorCQlwcmludGsoS0VSTl9FUlIgImVycm9yIHNldHRpbmcgY3B1aW14MjUgcGFkcyAhXG4iKTsKKworCWlteDI1X2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOworCWlteDI1X2FkZF9teGNfbmFuZCgmZXVrcmVhX2NwdWlteDI1X25hbmRfYm9hcmRfaW5mbyk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXgyNV9ydGNfZGV2aWNlLCBOVUxMKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteDI1X2ZlY19kZXZpY2UsICZteDI1X2ZlY19wZGF0YSk7CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBldWtyZWFfY3B1aW14MjVfaTJjX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShldWtyZWFfY3B1aW14MjVfaTJjX2RldmljZXMpKTsKKwlpbXgyNV9hZGRfaW14X2kyYzAoJmV1a3JlYV9jcHVpbXgyNV9pMmMwX2RhdGEpOworCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1VMUEkpCisJaWYgKG90Z19tb2RlX2hvc3QpIHsKKwkJb3RnX3BkYXRhLm90ZyA9IG90Z191bHBpX2NyZWF0ZSgmbXhjX3VscGlfYWNjZXNzX29wcywKKwkJCQlVU0JfT1RHX0RSVl9WQlVTIHwgVVNCX09UR19EUlZfVkJVU19FWFQpOworCisJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGcsICZvdGdfcGRhdGEpOworCX0KKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDIsICZ1c2JoMl9wZGF0YSk7CisjZW5kaWYKKwlpZiAoIW90Z19tb2RlX2hvc3QpCisJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm90Z191ZGNfZGV2aWNlLCAmb3RnX2RldmljZV9wZGF0YSk7CisKKyNpZmRlZiBDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVhTRF9CQVNFQk9BUkQKKwlldWtyZWFfbWJpbXhzZF9iYXNlYm9hcmRfaW5pdCgpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBldWtyZWFfY3B1aW14MjVfdGltZXJfaW5pdCh2b2lkKQoreworCW14MjVfY2xvY2tzX2luaXQoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgZXVrcmVhX2NwdWlteDI1X3RpbWVyID0geworCS5pbml0ICAgPSBldWtyZWFfY3B1aW14MjVfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoRVVLUkVBX0NQVUlNWDI1LCAiRXVrcmVhIENQVUlNWDI1IikKKwkvKiBNYWludGFpbmVyOiBFdWtyZWEgRWxlY3Ryb21hdGlxdWUgKi8KKwkucGh5c19pbwk9IE1YMjVfQUlQUzFfQkFTRV9BRERSLAorCS5pb19wZ19vZmZzdAk9ICgoTVgyNV9BSVBTMV9CQVNFX0FERFJfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcyAgICA9IE1YMjVfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvICAgICAgICAgPSBteDI1X21hcF9pbywKKwkuaW5pdF9pcnEgICAgICAgPSBteDI1X2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgICA9IGV1a3JlYV9jcHVpbXgyNV9pbml0LAorCS50aW1lciAgICAgICAgICA9ICZldWtyZWFfY3B1aW14MjVfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDI1L21hY2gtbXgyNV8zZHMuYyBiL2FyY2gvYXJtL21hY2gtbXgyNS9tYWNoLW14MjVfM2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiYzIxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9tYWNoLW14MjVfM2RzLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTYXNjaGEgSGF1ZXIsIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIG1hY2hpbmUgaXMga25vd24gYXM6CisgKiAgLSBpLk1YMjUgMy1TdGFjayBEZXZlbG9wbWVudCBTeXN0ZW0KKyAqICAtIGkuTVgyNSBQbGF0Zm9ybSBEZXZlbG9wbWVudCBLaXQgKGkuTVgyNSBQREspCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9teDI1Lmg+CisjaW5jbHVkZSA8bWFjaC9pbXhmYi5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNS5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBteDI1cGRrX3BhZHNbXSA9IHsKKwlNWDI1X1BBRF9GRUNfTURDX19GRUNfTURDLAorCU1YMjVfUEFEX0ZFQ19NRElPX19GRUNfTURJTywKKwlNWDI1X1BBRF9GRUNfVERBVEEwX19GRUNfVERBVEEwLAorCU1YMjVfUEFEX0ZFQ19UREFUQTFfX0ZFQ19UREFUQTEsCisJTVgyNV9QQURfRkVDX1RYX0VOX19GRUNfVFhfRU4sCisJTVgyNV9QQURfRkVDX1JEQVRBMF9fRkVDX1JEQVRBMCwKKwlNWDI1X1BBRF9GRUNfUkRBVEExX19GRUNfUkRBVEExLAorCU1YMjVfUEFEX0ZFQ19SWF9EVl9fRkVDX1JYX0RWLAorCU1YMjVfUEFEX0ZFQ19UWF9DTEtfX0ZFQ19UWF9DTEssCisJTVgyNV9QQURfQTE3X19HUElPXzJfMywgLyogRkVDX0VOLCBHUElPIDM1ICovCisJTVgyNV9QQURfRDEyX19HUElPXzRfOCwgLyogRkVDX1JFU0VUX0IsIEdQSU8gMTA0ICovCisKKwkvKiBMQ0QgKi8KKwlNWDI1X1BBRF9MRDBfX0xEMCwKKwlNWDI1X1BBRF9MRDFfX0xEMSwKKwlNWDI1X1BBRF9MRDJfX0xEMiwKKwlNWDI1X1BBRF9MRDNfX0xEMywKKwlNWDI1X1BBRF9MRDRfX0xENCwKKwlNWDI1X1BBRF9MRDVfX0xENSwKKwlNWDI1X1BBRF9MRDZfX0xENiwKKwlNWDI1X1BBRF9MRDdfX0xENywKKwlNWDI1X1BBRF9MRDhfX0xEOCwKKwlNWDI1X1BBRF9MRDlfX0xEOSwKKwlNWDI1X1BBRF9MRDEwX19MRDEwLAorCU1YMjVfUEFEX0xEMTFfX0xEMTEsCisJTVgyNV9QQURfTEQxMl9fTEQxMiwKKwlNWDI1X1BBRF9MRDEzX19MRDEzLAorCU1YMjVfUEFEX0xEMTRfX0xEMTQsCisJTVgyNV9QQURfTEQxNV9fTEQxNSwKKwlNWDI1X1BBRF9HUElPX0VfX0xEMTYsCisJTVgyNV9QQURfR1BJT19GX19MRDE3LAorCU1YMjVfUEFEX0hTWU5DX19IU1lOQywKKwlNWDI1X1BBRF9WU1lOQ19fVlNZTkMsCisJTVgyNV9QQURfTFNDTEtfX0xTQ0xLLAorCU1YMjVfUEFEX09FX0FDRF9fT0VfQUNELAorCU1YMjVfUEFEX0NPTlRSQVNUX19DT05UUkFTVCwKKworCS8qIEtleXBhZCAqLworCU1YMjVfUEFEX0tQUF9ST1cwX19LUFBfUk9XMCwKKwlNWDI1X1BBRF9LUFBfUk9XMV9fS1BQX1JPVzEsCisJTVgyNV9QQURfS1BQX1JPVzJfX0tQUF9ST1cyLAorCU1YMjVfUEFEX0tQUF9ST1czX19LUFBfUk9XMywKKwlNWDI1X1BBRF9LUFBfQ09MMF9fS1BQX0NPTDAsCisJTVgyNV9QQURfS1BQX0NPTDFfX0tQUF9DT0wxLAorCU1YMjVfUEFEX0tQUF9DT0wyX19LUFBfQ09MMiwKKwlNWDI1X1BBRF9LUFBfQ09MM19fS1BQX0NPTDMsCit9OworCitzdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9kYXRhIG14MjVfZmVjX3BkYXRhID0geworICAgICAgICAucGh5ICAgID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCit9OworCisjZGVmaW5lIEZFQ19FTkFCTEVfR1BJTwkJMzUKKyNkZWZpbmUgRkVDX1JFU0VUX0JfR1BJTwkxMDQKKworc3RhdGljIHZvaWQgX19pbml0IG14MjVwZGtfZmVjX3Jlc2V0KHZvaWQpCit7CisJZ3Bpb19yZXF1ZXN0KEZFQ19FTkFCTEVfR1BJTywgIkZFQyBQSFkgZW5hYmxlIik7CisJZ3Bpb19yZXF1ZXN0KEZFQ19SRVNFVF9CX0dQSU8sICJGRUMgUEhZIHJlc2V0Iik7CisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoRkVDX0VOQUJMRV9HUElPLCAwKTsgIC8qIGRyb3AgUEhZIHBvd2VyICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEZFQ19SRVNFVF9CX0dQSU8sIDApOyAvKiBhc3NlcnQgcmVzZXQgKi8KKwl1ZGVsYXkoMik7CisKKwkvKiB0dXJuIG9uIFBIWSBwb3dlciBhbmQgbGlmdCByZXNldCAqLworCWdwaW9fc2V0X3ZhbHVlKEZFQ19FTkFCTEVfR1BJTywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoRkVDX1JFU0VUX0JfR1BJTywgMSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YQorbXgyNXBka19uYW5kX2JvYXJkX2luZm8gX19pbml0Y29uc3QgPSB7CisJLndpZHRoCQk9IDEsCisJLmh3X2VjYwkJPSAxLAorCS5mbGFzaF9iYnQJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfZmJfdmlkZW9tb2RlIG14MjVwZGtfbW9kZXNbXSA9IHsKKwl7CisJCS5tb2RlCT0geworCQkJLm5hbWUJCT0gIkNSVC1WR0EiLAorCQkJLnJlZnJlc2gJPSA2MCwKKwkJCS54cmVzCQk9IDY0MCwKKwkJCS55cmVzCQk9IDQ4MCwKKwkJCS5waXhjbG9jawk9IDM5NjgzLAorCQkJLmxlZnRfbWFyZ2luCT0gNDUsCisJCQkucmlnaHRfbWFyZ2luCT0gMTE0LAorCQkJLnVwcGVyX21hcmdpbgk9IDMzLAorCQkJLmxvd2VyX21hcmdpbgk9IDExLAorCQkJLmhzeW5jX2xlbgk9IDEsCisJCQkudnN5bmNfbGVuCT0gMSwKKwkJfSwKKwkJLmJwcAk9IDE2LAorCQkucGNyCT0gMHhGQTIwOEI4MCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSBteDI1cGRrX2ZiX3BkYXRhID0geworCS5tb2RlCQk9IG14MjVwZGtfbW9kZXMsCisJLm51bV9tb2Rlcwk9IEFSUkFZX1NJWkUobXgyNXBka19tb2RlcyksCisJLnB3bXIJCT0gMHgwMEE5MDNGRiwKKwkubHNjcjEJCT0gMHgwMDEyMDMwMCwKKwkuZG1hY3IJCT0gMHgwMDAyMDAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBteDI1cGRrX2tleW1hcFtdID0geworCUtFWSgwLCAwLCBLRVlfVVApLAorCUtFWSgwLCAxLCBLRVlfRE9XTiksCisJS0VZKDAsIDIsIEtFWV9WT0xVTUVET1dOKSwKKwlLRVkoMCwgMywgS0VZX0hPTUUpLAorCUtFWSgxLCAwLCBLRVlfUklHSFQpLAorCUtFWSgxLCAxLCBLRVlfTEVGVCksCisJS0VZKDEsIDIsIEtFWV9FTlRFUiksCisJS0VZKDEsIDMsIEtFWV9WT0xVTUVVUCksCisJS0VZKDIsIDAsIEtFWV9GNiksCisJS0VZKDIsIDEsIEtFWV9GOCksCisJS0VZKDIsIDIsIEtFWV9GOSksCisJS0VZKDIsIDMsIEtFWV9GMTApLAorCUtFWSgzLCAwLCBLRVlfRjEpLAorCUtFWSgzLCAxLCBLRVlfRjIpLAorCUtFWSgzLCAyLCBLRVlfRjMpLAorCUtFWSgzLCAzLCBLRVlfUE9XRVIpLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgbXgyNXBka19rZXltYXBfZGF0YSA9IHsKKwkua2V5bWFwCQk9IG14MjVwZGtfa2V5bWFwLAorCS5rZXltYXBfc2l6ZQk9IEFSUkFZX1NJWkUobXgyNXBka19rZXltYXApLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG14MjVwZGtfaW5pdCh2b2lkKQoreworCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14MjVwZGtfcGFkcywKKwkJCUFSUkFZX1NJWkUobXgyNXBka19wYWRzKSk7CisKKwlpbXgyNV9hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDIsIE5VTEwpOworCWlteDI1X2FkZF9teGNfbmFuZCgmbXgyNXBka19uYW5kX2JvYXJkX2luZm8pOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14MjVfcnRjX2RldmljZSwgTlVMTCk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXgyNV9mYl9kZXZpY2UsICZteDI1cGRrX2ZiX3BkYXRhKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfd2R0LCBOVUxMKTsKKworCW14MjVwZGtfZmVjX3Jlc2V0KCk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXgyNV9mZWNfZGV2aWNlLCAmbXgyNV9mZWNfcGRhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14MjVfa3BwX2RldmljZSwgJm14MjVwZGtfa2V5bWFwX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka190aW1lcl9pbml0KHZvaWQpCit7CisJbXgyNV9jbG9ja3NfaW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBteDI1cGRrX3RpbWVyID0geworCS5pbml0ICAgPSBteDI1cGRrX3RpbWVyX2luaXQsCit9OworCitNQUNISU5FX1NUQVJUKE1YMjVfM0RTLCAiRnJlZXNjYWxlIE1YMjVQREsgKDNEUykiKQorCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCisJLnBoeXNfaW8JPSBNWDI1X0FJUFMxX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QJPSAoKE1YMjVfQUlQUzFfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgICAgPSBNWDI1X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLm1hcF9pbyAgICAgICAgID0gbXgyNV9tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gbXgyNV9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lICAgPSBteDI1cGRrX2luaXQsCisJLnRpbWVyICAgICAgICAgID0gJm14MjVwZGtfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MjUvbWFjaC1teDI1cGRrLmMgYi9hcmNoL2FybS9tYWNoLW14MjUvbWFjaC1teDI1cGRrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDc0MTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDI1L21hY2gtbXgyNXBkay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSBTYXNjaGEgSGF1ZXIsIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgotI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgotI2luY2x1ZGUgPG1hY2gvbXhjX25hbmQuaD4KLSNpbmNsdWRlIDxtYWNoL2lteGZiLmg+Ci0jaW5jbHVkZSAiZGV2aWNlcy5oIgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNS5oPgotCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0gewotCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBhZF9kZXNjIG14MjVwZGtfcGFkc1tdID0gewotCU1YMjVfUEFEX0ZFQ19NRENfX0ZFQ19NREMsCi0JTVgyNV9QQURfRkVDX01ESU9fX0ZFQ19NRElPLAotCU1YMjVfUEFEX0ZFQ19UREFUQTBfX0ZFQ19UREFUQTAsCi0JTVgyNV9QQURfRkVDX1REQVRBMV9fRkVDX1REQVRBMSwKLQlNWDI1X1BBRF9GRUNfVFhfRU5fX0ZFQ19UWF9FTiwKLQlNWDI1X1BBRF9GRUNfUkRBVEEwX19GRUNfUkRBVEEwLAotCU1YMjVfUEFEX0ZFQ19SREFUQTFfX0ZFQ19SREFUQTEsCi0JTVgyNV9QQURfRkVDX1JYX0RWX19GRUNfUlhfRFYsCi0JTVgyNV9QQURfRkVDX1RYX0NMS19fRkVDX1RYX0NMSywKLQlNWDI1X1BBRF9BMTdfX0dQSU9fMl8zLCAvKiBGRUNfRU4sIEdQSU8gMzUgKi8KLQlNWDI1X1BBRF9EMTJfX0dQSU9fNF84LCAvKiBGRUNfUkVTRVRfQiwgR1BJTyAxMDQgKi8KLQotCS8qIExDRCAqLwotCU1YMjVfUEFEX0xEMF9fTEQwLAotCU1YMjVfUEFEX0xEMV9fTEQxLAotCU1YMjVfUEFEX0xEMl9fTEQyLAotCU1YMjVfUEFEX0xEM19fTEQzLAotCU1YMjVfUEFEX0xENF9fTEQ0LAotCU1YMjVfUEFEX0xENV9fTEQ1LAotCU1YMjVfUEFEX0xENl9fTEQ2LAotCU1YMjVfUEFEX0xEN19fTEQ3LAotCU1YMjVfUEFEX0xEOF9fTEQ4LAotCU1YMjVfUEFEX0xEOV9fTEQ5LAotCU1YMjVfUEFEX0xEMTBfX0xEMTAsCi0JTVgyNV9QQURfTEQxMV9fTEQxMSwKLQlNWDI1X1BBRF9MRDEyX19MRDEyLAotCU1YMjVfUEFEX0xEMTNfX0xEMTMsCi0JTVgyNV9QQURfTEQxNF9fTEQxNCwKLQlNWDI1X1BBRF9MRDE1X19MRDE1LAotCU1YMjVfUEFEX0dQSU9fRV9fTEQxNiwKLQlNWDI1X1BBRF9HUElPX0ZfX0xEMTcsCi0JTVgyNV9QQURfSFNZTkNfX0hTWU5DLAotCU1YMjVfUEFEX1ZTWU5DX19WU1lOQywKLQlNWDI1X1BBRF9MU0NMS19fTFNDTEssCi0JTVgyNV9QQURfT0VfQUNEX19PRV9BQ0QsCi0JTVgyNV9QQURfQ09OVFJBU1RfX0NPTlRSQVNULAotfTsKLQotc3RhdGljIHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSBteDI1X2ZlY19wZGF0YSA9IHsKLSAgICAgICAgLnBoeSAgICA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJLAotfTsKLQotI2RlZmluZSBGRUNfRU5BQkxFX0dQSU8JCTM1Ci0jZGVmaW5lIEZFQ19SRVNFVF9CX0dQSU8JMTA0Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteDI1cGRrX2ZlY19yZXNldCh2b2lkKQotewotCWdwaW9fcmVxdWVzdChGRUNfRU5BQkxFX0dQSU8sICJGRUMgUEhZIGVuYWJsZSIpOwotCWdwaW9fcmVxdWVzdChGRUNfUkVTRVRfQl9HUElPLCAiRkVDIFBIWSByZXNldCIpOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEZFQ19FTkFCTEVfR1BJTywgMCk7ICAvKiBkcm9wIFBIWSBwb3dlciAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChGRUNfUkVTRVRfQl9HUElPLCAwKTsgLyogYXNzZXJ0IHJlc2V0ICovCi0JdWRlbGF5KDIpOwotCi0JLyogdHVybiBvbiBQSFkgcG93ZXIgYW5kIGxpZnQgcmVzZXQgKi8KLQlncGlvX3NldF92YWx1ZShGRUNfRU5BQkxFX0dQSU8sIDEpOwotCWdwaW9fc2V0X3ZhbHVlKEZFQ19SRVNFVF9CX0dQSU8sIDEpOwotfQotCi1zdGF0aWMgc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEgbXgyNXBka19uYW5kX2JvYXJkX2luZm8gPSB7Ci0JLndpZHRoCQk9IDEsCi0JLmh3X2VjYwkJPSAxLAotCS5mbGFzaF9iYnQJPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXhfZmJfdmlkZW9tb2RlIG14MjVwZGtfbW9kZXNbXSA9IHsKLQl7Ci0JCS5tb2RlCT0gewotCQkJLm5hbWUJCT0gIkNSVC1WR0EiLAotCQkJLnJlZnJlc2gJPSA2MCwKLQkJCS54cmVzCQk9IDY0MCwKLQkJCS55cmVzCQk9IDQ4MCwKLQkJCS5waXhjbG9jawk9IDM5NjgzLAotCQkJLmxlZnRfbWFyZ2luCT0gNDUsCi0JCQkucmlnaHRfbWFyZ2luCT0gMTE0LAotCQkJLnVwcGVyX21hcmdpbgk9IDMzLAotCQkJLmxvd2VyX21hcmdpbgk9IDExLAotCQkJLmhzeW5jX2xlbgk9IDEsCi0JCQkudnN5bmNfbGVuCT0gMSwKLQkJfSwKLQkJLmJwcAk9IDE2LAotCQkucGNyCT0gMHhGQTIwOEI4MCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSBteDI1cGRrX2ZiX3BkYXRhID0gewotCS5tb2RlCQk9IG14MjVwZGtfbW9kZXMsCi0JLm51bV9tb2Rlcwk9IEFSUkFZX1NJWkUobXgyNXBka19tb2RlcyksCi0JLnB3bXIJCT0gMHgwMEE5MDNGRiwKLQkubHNjcjEJCT0gMHgwMDEyMDMwMCwKLQkuZG1hY3IJCT0gMHgwMDAyMDAxMCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteDI1cGRrX2luaXQodm9pZCkKLXsKLQlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDI1cGRrX3BhZHMsCi0JCQlBUlJBWV9TSVpFKG14MjVwZGtfcGFkcykpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMiwgTlVMTCk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX25hbmRfZGV2aWNlLCAmbXgyNXBka19uYW5kX2JvYXJkX2luZm8pOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14MjVfcnRjX2RldmljZSwgTlVMTCk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXgyNV9mYl9kZXZpY2UsICZteDI1cGRrX2ZiX3BkYXRhKTsKLQotCW14MjVwZGtfZmVjX3Jlc2V0KCk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXgyNV9mZWNfZGV2aWNlLCAmbXgyNV9mZWNfcGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka190aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgyNV9jbG9ja3NfaW5pdCgpOwotfQotCi1zdGF0aWMgc3RydWN0IHN5c190aW1lciBteDI1cGRrX3RpbWVyID0gewotCS5pbml0ICAgPSBteDI1cGRrX3RpbWVyX2luaXQsCi19OwotCi1NQUNISU5FX1NUQVJUKE1YMjVfM0RTLCAiRnJlZXNjYWxlIE1YMjVQREsgKDNEUykiKQotCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLnBoeXNfaW8JPSBNWDI1X0FJUFMxX0JBU0VfQUREUiwKLQkuaW9fcGdfb2Zmc3QJPSAoKE1YMjVfQUlQUzFfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMgICAgPSBNWDI1X1BIWVNfT0ZGU0VUICsgMHgxMDAsCi0JLm1hcF9pbyAgICAgICAgID0gbXgyNV9tYXBfaW8sCi0JLmluaXRfaXJxICAgICAgID0gbXgyNV9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lICAgPSBteDI1cGRrX2luaXQsCi0JLnRpbWVyICAgICAgICAgID0gJm14MjVwZGtfdGltZXIsCi1NQUNISU5FX0VORAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MjUvbW0uYyBiL2FyY2gvYXJtL21hY2gtbXgyNS9tbS5jCmluZGV4IGE3ZTU4N2YuLmJiNjc3MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgyNS9tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9tbS5jCkBAIC0xNCwxMCArMTQsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC02OSw4ICs2NSwxMSBAQAogCWlvdGFibGVfaW5pdChteGNfaW9fZGVzYywgQVJSQVlfU0laRShteGNfaW9fZGVzYykpOwogfQogCitpbnQgaW14MjVfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CisKIHZvaWQgX19pbml0IG14MjVfaW5pdF9pcnEodm9pZCkKIHsKIAlteGNfaW5pdF9pcnEoKHZvaWQgX19pb21lbSAqKU1YMjVfQVZJQ19CQVNFX0FERFJfVklSVCk7CisJaW14MjVfcmVnaXN0ZXJfZ3Bpb3MoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbXgzL0tjb25maWcKaW5kZXggMzQ0NzUzZi4uODViZWVjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW14My9LY29uZmlnCkBAIC0xNSw2ICsxNSw4IEBACiBjb25maWcgTUFDSF9NWDMxQURTCiAJYm9vbCAiU3VwcG9ydCBNWDMxQURTIHBsYXRmb3JtcyIKIAlzZWxlY3QgQVJDSF9NWDMxCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMzFBRFMgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKQEAgLTM0LDYgKzM2LDkgQEAKIGNvbmZpZyBNQUNIX1BDTTAzNwogCWJvb2wgIlN1cHBvcnQgUGh5dGVjIHBjbTAzNyAoaS5NWDMxKSBwbGF0Zm9ybXMiCiAJc2VsZWN0IEFSQ0hfTVgzMQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19OQU5ECiAJc2VsZWN0IE1YQ19VTFBJIGlmIFVTQl9VTFBJCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBQaHl0ZWMgcGNtMDM3IHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzCkBAIC00Miw2ICs0Nyw3IEBACiBjb25maWcgTUFDSF9QQ00wMzdfRUVUCiAJYm9vbCAiU3VwcG9ydCBwY20wMzcgRUVUIGJvYXJkIGV4dGVuc2lvbnMiCiAJZGVwZW5kcyBvbiBNQUNIX1BDTTAzNworCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJaGVscAogCSAgQWRkIHN1cHBvcnQgZm9yIFBDTTAzNyBFRVQgYmFzZWJvYXJkIGV4dGVuc2lvbnMuIElmIHlvdSBhcmUgdXNpbmcgdGhlCiAJICBPTEVEIGRpc3BsYXkgd2l0aCBFRVQsIHVzZSAidmlkZW89bXgzZmI6Q01FTC1PTEVEIiBrZXJuZWwKQEAgLTUxLDYgKzU3LDkgQEAKIAlib29sICJTdXBwb3J0IE1YMzEgTElURUtJVCAoTG9naWNQRCkiCiAJc2VsZWN0IEFSQ0hfTVgzMQogCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDMxIExJVEVLSVQgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKIAkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KQEAgLTU4LDYgKzY3LDEwIEBACiBjb25maWcgTUFDSF9NWDMxXzNEUwogCWJvb2wgIlN1cHBvcnQgTVgzMVBESyAoM0RTKSIKIAlzZWxlY3QgQVJDSF9NWDMxCisJc2VsZWN0IE1YQ19ERUJVR19CT0FSRAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDMxUERLICgzRFMpIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCiAJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCkBAIC03NCw2ICs4Nyw5IEBACiBjb25maWcgTUFDSF9NWDMxTU9CT0FSRAogCWJvb2wgIlN1cHBvcnQgbXgzMW1vYm9hcmQgcGxhdGZvcm1zIChFUEZMIE1vYm90cyBncm91cCkiCiAJc2VsZWN0IEFSQ0hfTVgzMQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKIAlzZWxlY3QgTVhDX1VMUEkgaWYgVVNCX1VMUEkKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIG14MzFtb2JvYXJkIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCkBAIC04Miw2ICs5OCw4IEBACiBjb25maWcgTUFDSF9NWDMxTElMTFkKIAlib29sICJTdXBwb3J0IE1YMzEgTElMTFktMTEzMSBwbGF0Zm9ybXMgKElOQ08gc3RhcnRlYykiCiAJc2VsZWN0IEFSQ0hfTVgzMQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJc2VsZWN0IE1YQ19VTFBJIGlmIFVTQl9VTFBJCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBteDMxIGJhc2VkIExJTExZMTEzMSBtb2R1bGVzLiBUaGlzIGluY2x1ZGVzCkBAIC05MCw2ICsxMDgsNyBAQAogY29uZmlnIE1BQ0hfUU9ORwogCWJvb2wgIlN1cHBvcnQgRGF2ZS9ERU5YIFFvbmdFVkItTElURSBwbGF0Zm9ybSIKIAlzZWxlY3QgQVJDSF9NWDMxCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBEYXZlL0RFTlggUW9uZ0VWQi1MSVRFIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzCiAJICBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCkBAIC05Nyw2ICsxMTYsMTAgQEAKIGNvbmZpZyBNQUNIX1BDTTA0MwogCWJvb2wgIlN1cHBvcnQgUGh5dGVjIHBjbTA0MyAoaS5NWDM1KSBwbGF0Zm9ybXMiCiAJc2VsZWN0IEFSQ0hfTVgzNQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19OQU5ECisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0ZMRVhDQU4KIAlzZWxlY3QgTVhDX1VMUEkgaWYgVVNCX1VMUEkKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIFBoeXRlYyBwY20wNDMgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMKQEAgLTEwNSw2ICsxMjgsOSBAQAogY29uZmlnIE1BQ0hfQVJNQURJTExPNVgwCiAJYm9vbCAiU3VwcG9ydCBBdG1hcmsgQXJtYWRpbGxvLTUwMCBEZXZlbG9wbWVudCBCYXNlIEJvYXJkIgogCXNlbGVjdCBBUkNIX01YMzEKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0kyQworCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAogCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgQXRtYXJrIEFybWFkaWxsby01MDAgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMKQEAgLTExMyw2ICsxMzksNyBAQAogY29uZmlnIE1BQ0hfTVgzNV8zRFMKIAlib29sICJTdXBwb3J0IE1YMzVQREsgcGxhdGZvcm0iCiAJc2VsZWN0IEFSQ0hfTVgzNQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAogCWRlZmF1bHQgbgogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgzNVBESyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwpAQCAtMTIxLDggKzE0OCwzNCBAQAogY29uZmlnIE1BQ0hfS1pNX0FSTTExXzAxCiAJYm9vbCAiU3VwcG9ydCBLWk0tQVJNMTEtMDEoS3lvdG8gTWljcm9jb21wdXRlcikiCiAJc2VsZWN0IEFSQ0hfTVgzMQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgS1pNLUFSTTExLTAxLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCiAJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCiAKK2NvbmZpZyBNQUNIX0VVS1JFQV9DUFVJTVgzNQorCWJvb2wgIlN1cHBvcnQgRXVrcmVhIENQVUlNWDM1IFBsYXRmb3JtIgorCXNlbGVjdCBBUkNIX01YMzUKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0kyQworCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgRXVrcmVhIENQVUlNWDM1IHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzCisJICBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCisKK2Nob2ljZQorCXByb21wdCAiQmFzZWJvYXJkIgorCWRlcGVuZHMgb24gTUFDSF9FVUtSRUFfQ1BVSU1YMzUKKwlkZWZhdWx0IE1BQ0hfRVVLUkVBX01CSU1YU0QzNV9CQVNFQk9BUkQKKworY29uZmlnIE1BQ0hfRVVLUkVBX01CSU1YU0QzNV9CQVNFQk9BUkQKKwlwcm9tcHQgIkV1a3JlYSBNQklNWFNEIGRldmVsb3BtZW50IGJvYXJkIgorCWJvb2wKKwloZWxwCisJICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBFdWtyZWEncworCSAgTUJJTVhTRCBldmFsdWF0aW9uIGJvYXJkLgorCitlbmRjaG9pY2UKKwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1teDMvTWFrZWZpbGUKaW5kZXggNWQ2NTBmZC4uMmJkN2JlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvTWFrZWZpbGUKQEAgLTIyLDUgKzIyLDcgQEAKIG9iai0kKENPTkZJR19NQUNIX1FPTkcpCQkrPSBtYWNoLXFvbmcubwogb2JqLSQoQ09ORklHX01BQ0hfUENNMDQzKQkrPSBtYWNoLXBjbTA0My5vCiBvYmotJChDT05GSUdfTUFDSF9BUk1BRElMTE81WDApICs9IG1hY2gtYXJtYWRpbGxvNXgwLm8KLW9iai0kKENPTkZJR19NQUNIX01YMzVfM0RTKQkrPSBtYWNoLW14MzVwZGsubworb2JqLSQoQ09ORklHX01BQ0hfTVgzNV8zRFMpCSs9IG1hY2gtbXgzNV8zZHMubwogb2JqLSQoQ09ORklHX01BQ0hfS1pNX0FSTTExXzAxKQkrPSBtYWNoLWt6bV9hcm0xMV8wMS5vCitvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMzUpCSs9IG1hY2gtY3B1aW14MzUubworb2JqLSQoQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YU0QzNV9CQVNFQk9BUkQpCSs9IGV1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9jbG9jay1pbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1teDMvY2xvY2staW14MzUuYwppbmRleCA5ZjNlOTQzZS4uZDNhZjBmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvY2xvY2staW14MzUuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9jbG9jay1pbXgzNS5jCkBAIC0zNTksNyArMzU5LDcgQEAKIERFRklORV9DTE9DSyhpMmMyX2NsaywgICAxLCBDQ01fQ0dSMSwgMTIsIGdldF9yYXRlX2lwZ19wZXIsIE5VTEwpOwogREVGSU5FX0NMT0NLKGkyYzNfY2xrLCAgIDIsIENDTV9DR1IxLCAxNCwgZ2V0X3JhdGVfaXBnX3BlciwgTlVMTCk7CiBERUZJTkVfQ0xPQ0soaW9tdXhjX2NsaywgMCwgQ0NNX0NHUjEsIDE2LCBOVUxMLCBOVUxMKTsKLURFRklORV9DTE9DSyhpcHVfY2xrLCAgICAwLCBDQ01fQ0dSMSwgMTgsIE5VTEwsIE5VTEwpOworREVGSU5FX0NMT0NLKGlwdV9jbGssICAgIDAsIENDTV9DR1IxLCAxOCwgZ2V0X3JhdGVfYWhiLCBOVUxMKTsKIERFRklORV9DTE9DSyhrcHBfY2xrLCAgICAwLCBDQ01fQ0dSMSwgMjAsIGdldF9yYXRlX2lwZywgTlVMTCk7CiBERUZJTkVfQ0xPQ0sobWxiX2NsaywgICAgMCwgQ0NNX0NHUjEsIDIyLCBnZXRfcmF0ZV9haGIsIE5VTEwpOwogREVGSU5FX0NMT0NLKG1zaGNfY2xrLCAgIDAsIENDTV9DR1IxLCAyNCwgZ2V0X3JhdGVfbXNoYywgTlVMTCk7CkBAIC00MjgsOCArNDI4LDggQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhc3JjIiwgYXNyY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2FuIiwgY2FuMV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJjYW4iLCBjYW4yX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImZsZXhjYW4uMCIsIE5VTEwsIGNhbjFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiZmxleGNhbi4xIiwgTlVMTCwgY2FuMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJzcGlfaW14LjAiLCBOVUxMLCBjc3BpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJzcGlfaW14LjEiLCBOVUxMLCBjc3BpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJlY3QiLCBlY3RfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy1pbXgzMS5oIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy1pbXgzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWE0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLWlteDMxLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBQZW5ndXRyb25peAorICogVXdlIEtsZWluZS1Lb2VuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bWFjaC9teDMxLmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCisjZGVmaW5lIGlteDMxX2FkZF9pbXhfaTJjMChwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygwLCBNWDMxX0kyQzFfQkFTRV9BRERSLCBTWl80SywgTVgzMV9JTlRfSTJDMSwgcGRhdGEpCisjZGVmaW5lIGlteDMxX2FkZF9pbXhfaTJjMShwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygxLCBNWDMxX0kyQzJfQkFTRV9BRERSLCBTWl80SywgTVgzMV9JTlRfSTJDMiwgcGRhdGEpCisjZGVmaW5lIGlteDMxX2FkZF9pbXhfaTJjMihwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygyLCBNWDMxX0kyQzNfQkFTRV9BRERSLCBTWl80SywgTVgzMV9JTlRfSTJDMywgcGRhdGEpCisKKyNkZWZpbmUgaW14MzFfYWRkX2lteF91YXJ0MChwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgwLCBNWDMxX1VBUlQxX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9VQVJUMSwgcGRhdGEpCisjZGVmaW5lIGlteDMxX2FkZF9pbXhfdWFydDEocGRhdGEpCVwKKwlpbXhfYWRkX2lteF91YXJ0XzFpcnEoMSwgTVgzMV9VQVJUMl9CQVNFX0FERFIsIFNaXzE2SywgTVgzMV9JTlRfVUFSVDIsIHBkYXRhKQorI2RlZmluZSBpbXgzMV9hZGRfaW14X3VhcnQyKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDIsIE1YMzFfVUFSVDNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX1VBUlQzLCBwZGF0YSkKKyNkZWZpbmUgaW14MzFfYWRkX2lteF91YXJ0MyhwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgzLCBNWDMxX1VBUlQ0X0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9VQVJUNCwgcGRhdGEpCisjZGVmaW5lIGlteDMxX2FkZF9pbXhfdWFydDQocGRhdGEpCVwKKwlpbXhfYWRkX2lteF91YXJ0XzFpcnEoNCwgTVgzMV9VQVJUNV9CQVNFX0FERFIsIFNaXzE2SywgTVgzMV9JTlRfVUFSVDUsIHBkYXRhKQorCisjZGVmaW5lIGlteDMxX2FkZF9teGNfbmFuZChwZGF0YSkJXAorCWlteF9hZGRfbXhjX25hbmRfdjEoTVgzMV9ORkNfQkFTRV9BRERSLCBNWDMxX0lOVF9OQU5ERkMsIHBkYXRhKQorCisjZGVmaW5lIGlteDMxX2FkZF9zcGlfaW14MChwZGF0YSkJXAorCWlteF9hZGRfc3BpX2lteCgwLCBNWDMxX0NTUEkxX0JBU0VfQUREUiwgU1pfNEssIE1YMzFfSU5UX0NTUEkxLCBwZGF0YSkKKyNkZWZpbmUgaW14MzFfYWRkX3NwaV9pbXgxKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDEsIE1YMzFfQ1NQSTJfQkFTRV9BRERSLCBTWl80SywgTVgzMV9JTlRfQ1NQSTIsIHBkYXRhKQorI2RlZmluZSBpbXgzMV9hZGRfc3BpX2lteDIocGRhdGEpCVwKKwlpbXhfYWRkX3NwaV9pbXgoMiwgTVgzMV9DU1BJM19CQVNFX0FERFIsIFNaXzRLLCBNWDMxX0lOVF9DU1BJMywgcGRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLWlteDM1LmggYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLWlteDM1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNDMxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMtaW14MzUuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFBlbmd1dHJvbml4CisgKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxtYWNoL214MzUuaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKKyNkZWZpbmUgaW14MzVfYWRkX2ZsZXhjYW4wKHBkYXRhKQlcCisJaW14X2FkZF9mbGV4Y2FuKDAsIE1YMzVfQ0FOMV9CQVNFX0FERFIsIFNaXzE2SywgTVgzNV9JTlRfQ0FOMSwgcGRhdGEpCisjZGVmaW5lIGlteDM1X2FkZF9mbGV4Y2FuMShwZGF0YSkJXAorCWlteF9hZGRfZmxleGNhbigxLCBNWDM1X0NBTjJfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0NBTjIsIHBkYXRhKQorCisjZGVmaW5lIGlteDM1X2FkZF9pbXhfaTJjMChwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygwLCBNWDM1X0kyQzFfQkFTRV9BRERSLCBTWl80SywgTVgzNV9JTlRfSTJDMSwgcGRhdGEpCisjZGVmaW5lIGlteDM1X2FkZF9pbXhfaTJjMShwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygxLCBNWDM1X0kyQzJfQkFTRV9BRERSLCBTWl80SywgTVgzNV9JTlRfSTJDMiwgcGRhdGEpCisjZGVmaW5lIGlteDM1X2FkZF9pbXhfaTJjMihwZGF0YSkJXAorCWlteF9hZGRfaW14X2kyYygyLCBNWDM1X0kyQzNfQkFTRV9BRERSLCBTWl80SywgTVgzNV9JTlRfSTJDMywgcGRhdGEpCisKKyNkZWZpbmUgaW14MzVfYWRkX2lteF91YXJ0MChwZGF0YSkJXAorCWlteF9hZGRfaW14X3VhcnRfMWlycSgwLCBNWDM1X1VBUlQxX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9VQVJUMSwgcGRhdGEpCisjZGVmaW5lIGlteDM1X2FkZF9pbXhfdWFydDEocGRhdGEpCVwKKwlpbXhfYWRkX2lteF91YXJ0XzFpcnEoMSwgTVgzNV9VQVJUMl9CQVNFX0FERFIsIFNaXzE2SywgTVgzNV9JTlRfVUFSVDIsIHBkYXRhKQorI2RlZmluZSBpbXgzNV9hZGRfaW14X3VhcnQyKHBkYXRhKQlcCisJaW14X2FkZF9pbXhfdWFydF8xaXJxKDIsIE1YMzVfVUFSVDNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX1VBUlQzLCBwZGF0YSkKKworI2RlZmluZSBpbXgzNV9hZGRfbXhjX25hbmQocGRhdGEpCVwKKwlpbXhfYWRkX214Y19uYW5kX3YyMShNWDM1X05GQ19CQVNFX0FERFIsIE1YMzVfSU5UX05BTkRGQywgcGRhdGEpCisKKyNkZWZpbmUgaW14MzVfYWRkX3NwaV9pbXgwKHBkYXRhKQlcCisJaW14X2FkZF9zcGlfaW14KDAsIE1YMzVfQ1NQSTFfQkFTRV9BRERSLCBTWl80SywgTVgzNV9JTlRfQ1NQSTEsIHBkYXRhKQorI2RlZmluZSBpbXgzNV9hZGRfc3BpX2lteDEocGRhdGEpCVwKKwlpbXhfYWRkX3NwaV9pbXgoMSwgTVgzNV9DU1BJMl9CQVNFX0FERFIsIFNaXzRLLCBNWDM1X0lOVF9DU1BJMiwgcGRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKaW5kZXggZGI3YWNkNi4uYTRmZDFhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYwpAQCAtMjUsMTA4ICsyNSwxMCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KICNpbmNsdWRlIDxtYWNoL214M19jYW1lcmEuaD4KIAogI2luY2x1ZGUgImRldmljZXMuaCIKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0MFtdID0gewotCXsKLQkJLnN0YXJ0ID0gVUFSVDFfQkFTRV9BRERSLAotCQkuZW5kID0gVUFSVDFfQkFTRV9BRERSICsgMHgwQjUsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVhDX0lOVF9VQVJUMSwKLQkJLmVuZCA9IE1YQ19JTlRfVUFSVDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTAgPSB7Ci0JLm5hbWUgPSAiaW14LXVhcnQiLAotCS5pZCA9IDAsCi0JLnJlc291cmNlID0gdWFydDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDFbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IFVBUlQyX0JBU0VfQUREUiwKLQkJLmVuZCA9IFVBUlQyX0JBU0VfQUREUiArIDB4MEI1LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YQ19JTlRfVUFSVDIsCi0JCS5lbmQgPSBNWENfSU5UX1VBUlQyLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxID0gewotCS5uYW1lID0gImlteC11YXJ0IiwKLQkuaWQgPSAxLAotCS5yZXNvdXJjZSA9IHVhcnQxLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1YXJ0MSksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVhcnQyW10gPSB7Ci0JewotCQkuc3RhcnQgPSBVQVJUM19CQVNFX0FERFIsCi0JCS5lbmQgPSBVQVJUM19CQVNFX0FERFIgKyAweDBCNSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgPSBNWENfSU5UX1VBUlQzLAotCQkuZW5kID0gTVhDX0lOVF9VQVJUMywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMiA9IHsKLQkubmFtZSA9ICJpbXgtdWFydCIsCi0JLmlkID0gMiwKLQkucmVzb3VyY2UgPSB1YXJ0MiwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodWFydDIpLAotfTsKLQotI2lmZGVmIENPTkZJR19BUkNIX01YMzEKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IFVBUlQ0X0JBU0VfQUREUiwKLQkJLmVuZCA9IFVBUlQ0X0JBU0VfQUREUiArIDB4MEI1LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YQ19JTlRfVUFSVDQsCi0JCS5lbmQgPSBNWENfSU5UX1VBUlQ0LAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UzID0gewotCS5uYW1lID0gImlteC11YXJ0IiwKLQkuaWQgPSAzLAotCS5yZXNvdXJjZSA9IHVhcnQzLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1YXJ0MyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVhcnQ0W10gPSB7Ci0JewotCQkuc3RhcnQgPSBVQVJUNV9CQVNFX0FERFIsCi0JCS5lbmQgPSBVQVJUNV9CQVNFX0FERFIgKyAweDBCNSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgPSBNWENfSU5UX1VBUlQ1LAotCQkuZW5kID0gTVhDX0lOVF9VQVJUNSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlNCA9IHsKLQkubmFtZSA9ICJpbXgtdWFydCIsCi0JLmlkID0gNCwKLQkucmVzb3VyY2UgPSB1YXJ0NCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodWFydDQpLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9NWDMxICovCi0KIC8qIEdQSU8gcG9ydCBkZXNjcmlwdGlvbiAqLwogc3RhdGljIHN0cnVjdCBteGNfZ3Bpb19wb3J0IGlteF9ncGlvX3BvcnRzW10gPSB7CiAJewpAQCAtMTQ3LDcgKzQ5LDcgQEAKIAl9CiB9OwogCi1pbnQgX19pbml0IG14Y19yZWdpc3Rlcl9ncGlvcyh2b2lkKQoraW50IF9faW5pdCBpbXgzeF9yZWdpc3Rlcl9ncGlvcyh2b2lkKQogewogCXJldHVybiBteGNfZ3Bpb19pbml0KGlteF9ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKGlteF9ncGlvX3BvcnRzKSk7CiB9CkBAIC0xNjcsODIgKzY5LDYgQEAKIAkucmVzb3VyY2UgPSBteGNfdzFfbWFzdGVyX3Jlc291cmNlcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX25hbmRfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJPSAwLCAvKiBydW50aW1lIGRlcGVuZGVudCAqLwotCQkuZW5kCT0gMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQJPSBNWENfSU5UX05BTkRGQywKLQkJLmVuZAk9IE1YQ19JTlRfTkFOREZDLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfbmFuZF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXhjX25hbmQiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19uYW5kX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX25hbmRfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfaTJjMF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IEkyQ19CQVNFX0FERFIsCi0JCS5lbmQgPSBJMkNfQkFTRV9BRERSICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YQ19JTlRfSTJDLAotCQkuZW5kID0gTVhDX0lOVF9JMkMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pMmNfZGV2aWNlMCA9IHsKLQkubmFtZSA9ICJpbXgtaTJjIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfaTJjMF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IG14Y19pMmMwX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX2kyYzFfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBJMkMyX0JBU0VfQUREUiwKLQkJLmVuZCA9IEkyQzJfQkFTRV9BRERSICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YQ19JTlRfSTJDMiwKLQkJLmVuZCA9IE1YQ19JTlRfSTJDMiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2kyY19kZXZpY2UxID0gewotCS5uYW1lID0gImlteC1pMmMiLAotCS5pZCA9IDEsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19pMmMxX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX2kyYzFfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfaTJjMl9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IEkyQzNfQkFTRV9BRERSLAotCQkuZW5kID0gSTJDM19CQVNFX0FERFIgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVhDX0lOVF9JMkMzLAotCQkuZW5kID0gTVhDX0lOVF9JMkMzLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTIgPSB7Ci0JLm5hbWUgPSAiaW14LWkyYyIsCi0JLmlkID0gMiwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX2kyYzJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBteGNfaTJjMl9yZXNvdXJjZXMsCi19OwotCiAjaWZkZWYgQ09ORklHX0FSQ0hfTVgzMQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNzZGhjMF9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC00NTUsNjggKzI4MSw3IEBACiAJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y191c2JoMl9yZXNvdXJjZXMpLAogfTsKIAotLyoKLSAqIFNQSSBtYXN0ZXIgY29udHJvbGxlcgotICogMyBjaGFubmVscwotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19zcGlfMF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JICAgICAgIC5zdGFydCA9IENTUEkxX0JBU0VfQUREUiwKLQkgICAgICAgLmVuZCA9IENTUEkxX0JBU0VfQUREUiArIFNaXzRLIC0gMSwKLQkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCSAgICAgICAuc3RhcnQgPSBNWENfSU5UX0NTUEkxLAotCSAgICAgICAuZW5kID0gTVhDX0lOVF9DU1BJMSwKLQkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3NwaV8xX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ID0gQ1NQSTJfQkFTRV9BRERSLAotCQkuZW5kID0gQ1NQSTJfQkFTRV9BRERSICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydCA9IE1YQ19JTlRfQ1NQSTIsCi0JCS5lbmQgPSBNWENfSU5UX0NTUEkyLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfc3BpXzJfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBDU1BJM19CQVNFX0FERFIsCi0JCS5lbmQgPSBDU1BJM19CQVNFX0FERFIgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0ID0gTVhDX0lOVF9DU1BJMywKLQkJLmVuZCA9IE1YQ19JTlRfQ1NQSTMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19zcGlfZGV2aWNlMCA9IHsKLQkubmFtZSA9ICJzcGlfaW14IiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfc3BpXzBfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBteGNfc3BpXzBfcmVzb3VyY2VzLAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZTEgPSB7Ci0JLm5hbWUgPSAic3BpX2lteCIsCi0JLmlkID0gMSwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX3NwaV8xX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX3NwaV8xX3Jlc291cmNlcywKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UyID0gewotCS5uYW1lID0gInNwaV9pbXgiLAotCS5pZCA9IDIsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19zcGlfMl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IG14Y19zcGlfMl9yZXNvdXJjZXMsCi19OwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgzNQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzNSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX2ZlY19yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydAk9IE1YQ19GRUNfQkFTRV9BRERSLApAQCAtNjI4LDE2ICszOTMsMTUgQEAKIAogc3RhdGljIGludCBfX2luaXQgbXgzX2RldmljZXNfaW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzMSkKIAlpZiAoY3B1X2lzX214MzEoKSkgewotCQlteGNfbmFuZF9yZXNvdXJjZXNbMF0uc3RhcnQgPSBNWDMxX05GQ19CQVNFX0FERFI7Ci0JCW14Y19uYW5kX3Jlc291cmNlc1swXS5lbmQgPSBNWDMxX05GQ19CQVNFX0FERFIgKyAweGZmZjsKIAkJaW14X3dkdF9yZXNvdXJjZXNbMF0uc3RhcnQgPSBNWDMxX1dET0dfQkFTRV9BRERSOwogCQlpbXhfd2R0X3Jlc291cmNlc1swXS5lbmQgPSBNWDMxX1dET0dfQkFTRV9BRERSICsgMHgzZmZmOwogCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfcm5nYV9kZXZpY2UsIE5VTEwpOwogCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzNSkKIAlpZiAoY3B1X2lzX214MzUoKSkgewotCQlteGNfbmFuZF9yZXNvdXJjZXNbMF0uc3RhcnQgPSBNWDM1X05GQ19CQVNFX0FERFI7Ci0JCW14Y19uYW5kX3Jlc291cmNlc1swXS5lbmQgPSBNWDM1X05GQ19CQVNFX0FERFIgKyAweDFmZmY7CiAJCW90Z19yZXNvdXJjZXNbMF0uc3RhcnQgPSBNWDM1X09UR19CQVNFX0FERFI7CiAJCW90Z19yZXNvdXJjZXNbMF0uZW5kID0gTVgzNV9PVEdfQkFTRV9BRERSICsgMHgxZmY7CiAJCW90Z19yZXNvdXJjZXNbMV0uc3RhcnQgPSBNWENfSU5UX1VTQk9URzsKQEAgLTY1Myw2ICs0MTcsNyBAQAogCQlpbXhfd2R0X3Jlc291cmNlc1swXS5zdGFydCA9IE1YMzVfV0RPR19CQVNFX0FERFI7CiAJCWlteF93ZHRfcmVzb3VyY2VzWzBdLmVuZCA9IE1YMzVfV0RPR19CQVNFX0FERFIgKyAweDNmZmY7CiAJfQorI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaAppbmRleCAyYzNjODY0Li5lNTUzNTIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5oCkBAIC0xLDE0ICsxLDQgQEAKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTQ7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdzFfbWFzdGVyX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19uYW5kX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pMmNfZGV2aWNlMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pMmNfZGV2aWNlMTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pMmNfZGV2aWNlMjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14M19pcHU7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDNfZmI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDNfY2FtZXJhOwpAQCAtMjAsOSArMTAsNiBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3JuZ2FfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3NwaV9kZXZpY2UyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3NzaV9kZXZpY2UwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3NzaV9kZXZpY2UxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3NzaV9kZXZpY2UxOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLW14My9ldWtyZWFfbWJpbXhzZC1iYXNlYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGM1MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRXJpYyBCZW5hcmQgLSBlcmljQGV1a3JlYS5jb20KKyAqCisgKiBCYXNlZCBvbiBwY205NzAtYmFzZWJvYXJkLmMgd2hpY2ggaXMgOgorICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydCAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MzUuaD4KKyNpbmNsdWRlIDxtYWNoL2lwdS5oPgorI2luY2x1ZGUgPG1hY2gvbXgzZmIuaD4KKyNpbmNsdWRlIDxtYWNoL2F1ZG11eC5oPgorI2luY2x1ZGUgPG1hY2gvc3NpLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDM1LmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBmYl9tb2RlZGJbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJDTU9fUVZHQSIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDMyMCwKKwkJLnlyZXMJCT0gMjQwLAorCQkucGl4Y2xvY2sJPSBLSFoyUElDT1MoNjUwMCksCisJCS5sZWZ0X21hcmdpbgk9IDY4LAorCQkucmlnaHRfbWFyZ2luCT0gMjAsCisJCS51cHBlcl9tYXJnaW4JPSAxNSwKKwkJLmxvd2VyX21hcmdpbgk9IDQsCisJCS5oc3luY19sZW4JPSAzMCwKKwkJLnZzeW5jX2xlbgk9IDMsCisJCS5zeW5jCQk9IDAsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCQkuZmxhZwkJPSAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGlwdV9wbGF0Zm9ybV9kYXRhIG14M19pcHVfZGF0YSA9IHsKKwkuaXJxX2Jhc2UgPSBNWENfSVBVX0lSUV9TVEFSVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXgzZmJfcGxhdGZvcm1fZGF0YSBteDNmYl9wZGF0YSA9IHsKKwkuZG1hX2Rldgk9ICZteDNfaXB1LmRldiwKKwkubmFtZQkJPSAiQ01PX1FWR0EiLAorCS5tb2RlCQk9IGZiX21vZGVkYiwKKwkubnVtX21vZGVzCT0gQVJSQVlfU0laRShmYl9tb2RlZGIpLAorfTsKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBldWtyZWFfbWJpbXhzZF9wYWRzW10gPSB7CisJLyogTENEICovCisJTVgzNV9QQURfTEQwX19JUFVfRElTUEJfREFUXzAsCisJTVgzNV9QQURfTEQxX19JUFVfRElTUEJfREFUXzEsCisJTVgzNV9QQURfTEQyX19JUFVfRElTUEJfREFUXzIsCisJTVgzNV9QQURfTEQzX19JUFVfRElTUEJfREFUXzMsCisJTVgzNV9QQURfTEQ0X19JUFVfRElTUEJfREFUXzQsCisJTVgzNV9QQURfTEQ1X19JUFVfRElTUEJfREFUXzUsCisJTVgzNV9QQURfTEQ2X19JUFVfRElTUEJfREFUXzYsCisJTVgzNV9QQURfTEQ3X19JUFVfRElTUEJfREFUXzcsCisJTVgzNV9QQURfTEQ4X19JUFVfRElTUEJfREFUXzgsCisJTVgzNV9QQURfTEQ5X19JUFVfRElTUEJfREFUXzksCisJTVgzNV9QQURfTEQxMF9fSVBVX0RJU1BCX0RBVF8xMCwKKwlNWDM1X1BBRF9MRDExX19JUFVfRElTUEJfREFUXzExLAorCU1YMzVfUEFEX0xEMTJfX0lQVV9ESVNQQl9EQVRfMTIsCisJTVgzNV9QQURfTEQxM19fSVBVX0RJU1BCX0RBVF8xMywKKwlNWDM1X1BBRF9MRDE0X19JUFVfRElTUEJfREFUXzE0LAorCU1YMzVfUEFEX0xEMTVfX0lQVV9ESVNQQl9EQVRfMTUsCisJTVgzNV9QQURfTEQxNl9fSVBVX0RJU1BCX0RBVF8xNiwKKwlNWDM1X1BBRF9MRDE3X19JUFVfRElTUEJfREFUXzE3LAorCU1YMzVfUEFEX0QzX0hTWU5DX19JUFVfRElTUEJfRDNfSFNZTkMsCisJTVgzNV9QQURfRDNfRlBTSElGVF9fSVBVX0RJU1BCX0QzX0NMSywKKwlNWDM1X1BBRF9EM19EUkRZX19JUFVfRElTUEJfRDNfRFJEWSwKKwlNWDM1X1BBRF9EM19WU1lOQ19fSVBVX0RJU1BCX0QzX1ZTWU5DLAorCS8qIEJhY2tsaWdodCAqLworCU1YMzVfUEFEX0NPTlRSQVNUX19JUFVfRElTUEJfQ09OVFIsCisJLyogTENEX1BXUiAqLworCU1YMzVfUEFEX0QzX0NMU19fR1BJTzFfNCwKKwkvKiBMRUQgKi8KKwlNWDM1X1BBRF9MRDIzX19HUElPM18yOSwKKwkvKiBTV0lUQ0ggKi8KKwlNWDM1X1BBRF9MRDE5X19HUElPM18yNSwKKwkvKiBVQVJUMiAqLworCU1YMzVfUEFEX0NUUzJfX1VBUlQyX0NUUywKKwlNWDM1X1BBRF9SVFMyX19VQVJUMl9SVFMsCisJTVgzNV9QQURfVFhEMl9fVUFSVDJfVFhEX01VWCwKKwlNWDM1X1BBRF9SWEQyX19VQVJUMl9SWERfTVVYLAorCS8qIEkyUyAqLworCU1YMzVfUEFEX1NUWEZTNF9fQVVETVVYX0FVRDRfVFhGUywKKwlNWDM1X1BBRF9TVFhENF9fQVVETVVYX0FVRDRfVFhELAorCU1YMzVfUEFEX1NSWEQ0X19BVURNVVhfQVVENF9SWEQsCisJTVgzNV9QQURfU0NLNF9fQVVETVVYX0FVRDRfVFhDLAorfTsKKworI2RlZmluZSBHUElPX0xFRDEJKDIgKiAzMiArIDI5KQorI2RlZmluZSBHUElPX1NXSVRDSDEJKDIgKiAzMiArIDI1KQorI2RlZmluZSBHUElPX0xDRFBXUgkoNCkKKworc3RhdGljIHZvaWQgZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyX3NldChzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCisJCQkJICAgdW5zaWduZWQgaW50IHBvd2VyKQoreworCWlmIChwb3dlcikKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTENEUFdSLCAxKTsKKwllbHNlCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0xDRFBXUiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBldWtyZWFfbWJpbXhzZF9sY2RfcG93ZXJfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCQk9IGV1a3JlYV9tYmlteHNkX2xjZF9wb3dlcl9zZXQsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldWtyZWFfbWJpbXhzZF9sY2RfcG93ZXJkZXYgPSB7CisJLm5hbWUJCQk9ICJwbGF0Zm9ybS1sY2QiLAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZldWtyZWFfbWJpbXhzZF9sY2RfcG93ZXJfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZXVrcmVhX21iaW14c2RfbGVkc1tdID0geworCXsKKwkJLm5hbWUJCQk9ICJsZWQxIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJoZWFydGJlYXQiLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZ3BpbwkJCT0gR1BJT19MRUQxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZXVrcmVhX21iaW14c2RfbGVkX2luZm8gPSB7CisJLmxlZHMJCT0gZXVrcmVhX21iaW14c2RfbGVkcywKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGV1a3JlYV9tYmlteHNkX2xlZHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXVrcmVhX21iaW14c2RfbGVkc19ncGlvID0geworCS5uYW1lCT0gImxlZHMtZ3BpbyIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZXVrcmVhX21iaW14c2RfbGVkX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBldWtyZWFfbWJpbXhzZF9ncGlvX2J1dHRvbnNbXSA9IHsKKwl7CisJCS5ncGlvCQk9IEdQSU9fU1dJVENIMSwKKwkJLmNvZGUJCT0gQlROXzAsCisJCS5kZXNjCQk9ICJCUDEiLAorCQkuYWN0aXZlX2xvdwk9IDEsCisJCS53YWtldXAJCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBldWtyZWFfbWJpbXhzZF9idXR0b25fZGF0YSA9IHsKKwkuYnV0dG9ucwk9IGV1a3JlYV9tYmlteHNkX2dwaW9fYnV0dG9ucywKKwkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKGV1a3JlYV9tYmlteHNkX2dwaW9fYnV0dG9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldWtyZWFfbWJpbXhzZF9idXR0b25fZGV2aWNlID0geworCS5uYW1lCQk9ICJncGlvLWtleXMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmV1a3JlYV9tYmlteHNkX2J1dHRvbl9kYXRhLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZXVrcmVhX21iaW14c2RfbGVkc19ncGlvLAorCSZldWtyZWFfbWJpbXhzZF9idXR0b25fZGV2aWNlLAorCSZldWtyZWFfbWJpbXhzZF9sY2RfcG93ZXJkZXYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0geworCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGV1a3JlYV9tYmlteHNkX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygidGx2MzIwYWljMjMiLCAweDFhKSwKKwl9LAorfTsKKworc3RydWN0IGlteF9zc2lfcGxhdGZvcm1fZGF0YSBldWtyZWFfbWJpbXhzZF9zc2lfcGRhdGEgPSB7CisJLmZsYWdzID0gSU1YX1NTSV9TWU4gfCBJTVhfU1NJX05FVCB8IElNWF9TU0lfVVNFX0kyU19TTEFWRSwKK307CisKKy8qCisgKiBzeXN0ZW0gaW5pdCBmb3IgYmFzZWJvYXJkIHVzYWdlLiBXaWxsIGJlIGNhbGxlZCBieSBjcHVpbXgzNSBpbml0LgorICoKKyAqIEFkZCBwbGF0Zm9ybSBkZXZpY2VzIHByZXNlbnQgb24gdGhpcyBiYXNlYm9hcmQgYW5kIGluaXQKKyAqIHRoZW0gZnJvbSBDUFUgc2lkZSBhcyBmYXIgYXMgcmVxdWlyZWQgdG8gdXNlIHRoZW0gbGF0ZXIgb24KKyAqLwordm9pZCBfX2luaXQgZXVrcmVhX21iaW14c2RfYmFzZWJvYXJkX2luaXQodm9pZCkKK3sKKwlpZiAobXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMoZXVrcmVhX21iaW14c2RfcGFkcywKKwkJCUFSUkFZX1NJWkUoZXVrcmVhX21iaW14c2RfcGFkcykpKQorCQlwcmludGsoS0VSTl9FUlIgImVycm9yIHNldHRpbmcgbWJpbXhzZCBwYWRzICFcbiIpOworCisjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19FVUtSRUFfVExWMzIwKQorCS8qIFNTSSB1bml0IG1hc3RlciBJMlMgY29kZWMgY29ubmVjdGVkIHRvIFNTSV9BVUQ0ICovCisJbXhjX2F1ZG11eF92Ml9jb25maWd1cmVfcG9ydCgwLAorCQkJTVhDX0FVRE1VWF9WMl9QVENSX1NZTiB8CisJCQlNWENfQVVETVVYX1YyX1BUQ1JfVEZTRElSIHwKKwkJCU1YQ19BVURNVVhfVjJfUFRDUl9URlNFTCgzKSB8CisJCQlNWENfQVVETVVYX1YyX1BUQ1JfVENMS0RJUiB8CisJCQlNWENfQVVETVVYX1YyX1BUQ1JfVENTRUwoMyksCisJCQlNWENfQVVETVVYX1YyX1BEQ1JfUlhEU0VMKDMpCisJKTsKKwlteGNfYXVkbXV4X3YyX2NvbmZpZ3VyZV9wb3J0KDMsCisJCQlNWENfQVVETVVYX1YyX1BUQ1JfU1lOLAorCQkJTVhDX0FVRE1VWF9WMl9QRENSX1JYRFNFTCgwKQorCSk7CisjZW5kaWYKKworCWlteDM1X2FkZF9pbXhfdWFydDEoJnVhcnRfcGRhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14M19pcHUsICZteDNfaXB1X2RhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14M19mYiwgJm14M2ZiX3BkYXRhKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF9zc2lfZGV2aWNlMCwgJmV1a3JlYV9tYmlteHNkX3NzaV9wZGF0YSk7CisKKwlncGlvX3JlcXVlc3QoR1BJT19MRUQxLCAiTEVEMSIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0xFRDEsIDEpOworCWdwaW9fZnJlZShHUElPX0xFRDEpOworCisJZ3Bpb19yZXF1ZXN0KEdQSU9fU1dJVENIMSwgIlNXSVRDSDEiKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1NXSVRDSDEpOworCWdwaW9fZnJlZShHUElPX1NXSVRDSDEpOworCisJZ3Bpb19yZXF1ZXN0KEdQSU9fTENEUFdSLCAiTENEUFdSIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTENEUFdSLCAxKTsKKwlncGlvX2ZyZWUoR1BJT19TV0lUQ0gxKTsKKworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGV1a3JlYV9tYmlteHNkX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoZXVrcmVhX21iaW14c2RfaTJjX2RldmljZXMpKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1hcm1hZGlsbG81eDAuYyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtYXJtYWRpbGxvNXgwLmMKaW5kZXggNWY3MmVjOS4uOTZhYWRjYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1hcm1hZGlsbG81eDAuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLWFybWFkaWxsbzV4MC5jCkBAIC00OCwxNiArNDgsMTQgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC1hcm1hZGlsbG81eDAuaD4KICNpbmNsdWRlIDxtYWNoL21tYy5oPgogI2luY2x1ZGUgPG1hY2gvaXB1Lmg+CiAjaW5jbHVkZSA8bWFjaC9teDNmYi5oPgotI2luY2x1ZGUgPG1hY2gvbXhjX25hbmQuaD4KICNpbmNsdWRlIDxtYWNoL214Y19laGNpLmg+CiAjaW5jbHVkZSA8bWFjaC91bHBpLmg+CiAKKyNpbmNsdWRlICJkZXZpY2VzLWlteDMxLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImNybV9yZWdzLmgiCiAKQEAgLTMwMSw3ICsyOTksOCBAQAogLyoKICAqIE5BTkQgRmxhc2gKICAqLwotc3RhdGljIHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhIGFybWFkaWxsbzV4MF9uYW5kX2ZsYXNoX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCithcm1hZGlsbG81eDBfbmFuZF9ib2FyZF9pbmZvIF9faW5pdGNvbnN0ID0gewogCS53aWR0aAkJPSAxLAogCS5od19lY2MJCT0gMSwKIH07CkBAIC00OTMsMTMgKzQ5MiwxMiBAQAogfTsKIAogLyogVUFSVCBkZXZpY2UgZGF0YSAqLwotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmYXJtYWRpbGxvNXgwX3NtYzkxMXhfZGV2aWNlLAotCSZteGNfaTJjX2RldmljZTEsCiAJJmFybWFkaWxsbzV4MF9idXR0b25fZGV2aWNlLAogfTsKIApAQCAtNTEyLDEwICs1MTAsMTEgQEAKIAkJCUFSUkFZX1NJWkUoYXJtYWRpbGxvNXgwX3BpbnMpLCAiYXJtYWRpbGxvNXgwIik7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKwlpbXgzMV9hZGRfaW14X2kyYzEoTlVMTCk7CiAKIAkvKiBSZWdpc3RlciBVQVJUICovCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhKTsKKwlpbXgzMV9hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKwlpbXgzMV9hZGRfaW14X3VhcnQxKCZ1YXJ0X3BkYXRhKTsKIAogCS8qIFNNU0M5MTE4IElSUSBwaW4gKi8KIAlncGlvX2RpcmVjdGlvbl9pbnB1dChNWDMxX1BJTl9HUElPMV8wKTsKQEAgLTUzMiw3ICs1MzEsNyBAQAogCQkJICAgICZhcm1hZGlsbG81eDBfbm9yX2ZsYXNoX3BkYXRhKTsKIAogCS8qIFJlZ2lzdGVyIE5BTkQgRmxhc2ggKi8KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfbmFuZF9kZXZpY2UsICZhcm1hZGlsbG81eDBfbmFuZF9mbGFzaF9wZGF0YSk7CisJaW14MzFfYWRkX214Y19uYW5kKCZhcm1hZGlsbG81eDBfbmFuZF9ib2FyZF9pbmZvKTsKIAogCS8qIHNldCBOQU5EIHBhZ2Ugc2l6ZSB0byAyayBpZiBub3QgY29uZmlndXJlZCB2aWEgYm9vdCBtb2RlIHBpbnMgKi8KIAlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoTVhDX0NDTV9SQ1NSKSB8ICgxIDw8IDMwKSwgTVhDX0NDTV9SQ1NSKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtY3B1aW14MzUuYyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtY3B1aW14MzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2Y5NzBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1jcHVpbXgzNS5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVyaWMgQmVuYXJkIC0gZXJpY0BldWtyZWEuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90c2MyMDA3Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi91bHBpLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvZXVrcmVhLWJhc2Vib2FyZHMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MzUuaD4KKyNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+CisjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgorI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgzNS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YQorZXVrcmVhX2NwdWlteDM1X2kyYzBfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkuYml0cmF0ZSA9IDUwMDAwLAorfTsKKworI2RlZmluZSBUU0MyMDA3X0lSUUdQSU8JCSgyICogMzIgKyAyKQorc3RhdGljIGludCB0c19nZXRfcGVuZG93bl9zdGF0ZSh2b2lkKQoreworCWludCB2YWwgPSAwOworCWdwaW9fZnJlZShUU0MyMDA3X0lSUUdQSU8pOworCWdwaW9fcmVxdWVzdChUU0MyMDA3X0lSUUdQSU8sIE5VTEwpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KFRTQzIwMDdfSVJRR1BJTyk7CisKKwl2YWwgPSBncGlvX2dldF92YWx1ZShUU0MyMDA3X0lSUUdQSU8pOworCisJZ3Bpb19mcmVlKFRTQzIwMDdfSVJRR1BJTyk7CisJZ3Bpb19yZXF1ZXN0KFRTQzIwMDdfSVJRR1BJTywgTlVMTCk7CisKKwlyZXR1cm4gdmFsID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgdHNfaW5pdCh2b2lkKQoreworCWdwaW9fcmVxdWVzdChUU0MyMDA3X0lSUUdQSU8sIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSB0c2MyMDA3X2luZm8gPSB7CisJLm1vZGVsCQkJPSAyMDA3LAorCS54X3BsYXRlX29obXMJCT0gMTgwLAorCS5nZXRfcGVuZG93bl9zdGF0ZQk9IHRzX2dldF9wZW5kb3duX3N0YXRlLAorCS5pbml0X3BsYXRmb3JtX2h3CT0gdHNfaW5pdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZXVrcmVhX2NwdWlteDM1X2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicGNmODU2MyIsIDB4NTEpLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInRzYzIwMDciLCAweDQ4KSwKKwkJLnR5cGUJCT0gInRzYzIwMDciLAorCQkucGxhdGZvcm1fZGF0YQk9ICZ0c2MyMDA3X2luZm8sCisJCS5pcnEJCT0gZ3Bpb190b19pcnEoVFNDMjAwN19JUlFHUElPKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZteGNfZmVjX2RldmljZSwKKwkmaW14X3dkdF9kZXZpY2UwLAorfTsKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBldWtyZWFfY3B1aW14MzVfcGFkc1tdID0geworCS8qIFVBUlQxICovCisJTVgzNV9QQURfQ1RTMV9fVUFSVDFfQ1RTLAorCU1YMzVfUEFEX1JUUzFfX1VBUlQxX1JUUywKKwlNWDM1X1BBRF9UWEQxX19VQVJUMV9UWERfTVVYLAorCU1YMzVfUEFEX1JYRDFfX1VBUlQxX1JYRF9NVVgsCisJLyogRkVDICovCisJTVgzNV9QQURfRkVDX1RYX0NMS19fRkVDX1RYX0NMSywKKwlNWDM1X1BBRF9GRUNfUlhfQ0xLX19GRUNfUlhfQ0xLLAorCU1YMzVfUEFEX0ZFQ19SWF9EVl9fRkVDX1JYX0RWLAorCU1YMzVfUEFEX0ZFQ19DT0xfX0ZFQ19DT0wsCisJTVgzNV9QQURfRkVDX1JEQVRBMF9fRkVDX1JEQVRBXzAsCisJTVgzNV9QQURfRkVDX1REQVRBMF9fRkVDX1REQVRBXzAsCisJTVgzNV9QQURfRkVDX1RYX0VOX19GRUNfVFhfRU4sCisJTVgzNV9QQURfRkVDX01EQ19fRkVDX01EQywKKwlNWDM1X1BBRF9GRUNfTURJT19fRkVDX01ESU8sCisJTVgzNV9QQURfRkVDX1RYX0VSUl9fRkVDX1RYX0VSUiwKKwlNWDM1X1BBRF9GRUNfUlhfRVJSX19GRUNfUlhfRVJSLAorCU1YMzVfUEFEX0ZFQ19DUlNfX0ZFQ19DUlMsCisJTVgzNV9QQURfRkVDX1JEQVRBMV9fRkVDX1JEQVRBXzEsCisJTVgzNV9QQURfRkVDX1REQVRBMV9fRkVDX1REQVRBXzEsCisJTVgzNV9QQURfRkVDX1JEQVRBMl9fRkVDX1JEQVRBXzIsCisJTVgzNV9QQURfRkVDX1REQVRBMl9fRkVDX1REQVRBXzIsCisJTVgzNV9QQURfRkVDX1JEQVRBM19fRkVDX1JEQVRBXzMsCisJTVgzNV9QQURfRkVDX1REQVRBM19fRkVDX1REQVRBXzMsCisJLyogSTJDMSAqLworCU1YMzVfUEFEX0kyQzFfQ0xLX19JMkMxX1NDTCwKKwlNWDM1X1BBRF9JMkMxX0RBVF9fSTJDMV9TREEsCisJLyogVFNDMjAwNyBJUlEgKi8KKwlNWDM1X1BBRF9BVEFfREEyX19HUElPM18yLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCitldWtyZWFfY3B1aW14MzVfbmFuZF9ib2FyZF9pbmZvIF9faW5pdGNvbnN0ID0geworCS53aWR0aAkJPSAxLAorCS5od19lY2MJCT0gMSwKKwkuZmxhc2hfYmJ0CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBvdGdfcGRhdGEgPSB7CisJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfVVRNSSwKKwkuZmxhZ3MJPSBNWENfRUhDSV9JTlRFUkZBQ0VfRElGRl9VTkksCit9OworCitzdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfcGRhdGEgPSB7CisJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfU0VSSUFMLAorCS5mbGFncwk9IE1YQ19FSENJX0lOVEVSRkFDRV9TSU5HTEVfVU5JIHwgTVhDX0VIQ0lfSU5URVJOQUxfUEhZIHwKKwkJICBNWENfRUhDSV9JUFBVRV9ET1dOLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIG90Z19kZXZpY2VfcGRhdGEgPSB7CisJLm9wZXJhdGluZ19tb2RlCT0gRlNMX1VTQjJfRFJfREVWSUNFLAorCS5waHlfbW9kZQk9IEZTTF9VU0IyX1BIWV9VVE1JLAorfTsKKworc3RhdGljIGludCBvdGdfbW9kZV9ob3N0OworCitzdGF0aWMgaW50IF9faW5pdCBldWtyZWFfY3B1aW14MzVfb3RnX21vZGUoY2hhciAqb3B0aW9ucykKK3sKKwlpZiAoIXN0cmNtcChvcHRpb25zLCAiaG9zdCIpKQorCQlvdGdfbW9kZV9ob3N0ID0gMTsKKwllbHNlIGlmICghc3RyY21wKG9wdGlvbnMsICJkZXZpY2UiKSkKKwkJb3RnX21vZGVfaG9zdCA9IDA7CisJZWxzZQorCQlwcl9pbmZvKCJvdGdfbW9kZSBuZWl0aGVyIFwiaG9zdFwiIG5vciBcImRldmljZVwiLiAiCisJCQkiRGVmYXVsdGluZyB0byBkZXZpY2VcbiIpOworCXJldHVybiAwOworfQorX19zZXR1cCgib3RnX21vZGU9IiwgZXVrcmVhX2NwdWlteDM1X290Z19tb2RlKTsKKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbXhjX2JvYXJkX2luaXQodm9pZCkKK3sKKwlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhldWtyZWFfY3B1aW14MzVfcGFkcywKKwkJCUFSUkFZX1NJWkUoZXVrcmVhX2NwdWlteDM1X3BhZHMpKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCisJaW14MzVfYWRkX2lteF91YXJ0MCgmdWFydF9wZGF0YSk7CisJaW14MzVfYWRkX214Y19uYW5kKCZldWtyZWFfY3B1aW14MzVfbmFuZF9ib2FyZF9pbmZvKTsKKworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGV1a3JlYV9jcHVpbXgzNV9pMmNfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUoZXVrcmVhX2NwdWlteDM1X2kyY19kZXZpY2VzKSk7CisJaW14MzVfYWRkX2lteF9pMmMwKCZldWtyZWFfY3B1aW14MzVfaTJjMF9kYXRhKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VTFBJKQorCWlmIChvdGdfbW9kZV9ob3N0KSB7CisJCW90Z19wZGF0YS5vdGcgPSBvdGdfdWxwaV9jcmVhdGUoJm14Y191bHBpX2FjY2Vzc19vcHMsCisJCQkJVVNCX09UR19EUlZfVkJVUyB8IFVTQl9PVEdfRFJWX1ZCVVNfRVhUKTsKKworCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfb3RnX2hvc3QsICZvdGdfcGRhdGEpOworCX0KKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDEsICZ1c2JoMV9wZGF0YSk7CisjZW5kaWYKKwlpZiAoIW90Z19tb2RlX2hvc3QpCisJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGdfdWRjX2RldmljZSwgJm90Z19kZXZpY2VfcGRhdGEpOworCisjaWZkZWYgQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YU0RfQkFTRUJPQVJECisJZXVrcmVhX21iaW14c2RfYmFzZWJvYXJkX2luaXQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDM1X3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDM1X2Nsb2Nrc19pbml0KCk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgZXVrcmVhX2NwdWlteDM1X3RpbWVyID0geworCS5pbml0CT0gZXVrcmVhX2NwdWlteDM1X3RpbWVyX2luaXQsCit9OworCitNQUNISU5FX1NUQVJUKEVVS1JFQV9DUFVJTVgzNSwgIkV1a3JlYSBDUFVJTVgzNSIpCisJLyogTWFpbnRhaW5lcjogRXVrcmVhIEVsZWN0cm9tYXRpcXVlICovCisJLnBoeXNfaW8JPSBNWDM1X0FJUFMxX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QJPSAoKE1YMzVfQUlQUzFfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgICAgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLm1hcF9pbyAgICAgICAgID0gbXgzNV9tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gbXgzNV9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lICAgPSBteGNfYm9hcmRfaW5pdCwKKwkudGltZXIgICAgICAgICAgPSAmZXVrcmVhX2NwdWlteDM1X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gta3ptX2FybTExXzAxLmMgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLWt6bV9hcm0xMV8wMS5jCmluZGV4IGYwODVkNWQuLjViMjNlNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gta3ptX2FybTExXzAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1rem1fYXJtMTFfMDEuYwpAQCAtMTYsMTAgKzE2LDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CkBAIC0zNywxMyArMzMsMTIgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2JvYXJkLWt6bWFybTExLmg+CiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KIAorI2luY2x1ZGUgImRldmljZXMtaW14MzEuaCIKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKICNkZWZpbmUgS1pNX0FSTTExX0lPX0FERFJFU1MoeCkgKAkJCQkJXApAQCAtNTEsNiArNDYsMjMgQEAKIAlJTVhfSU9fQUREUkVTUyh4LCBNWDMxX0NTNSkgPzoJCQkJCVwKIAlNWDMxX0lPX0FERFJFU1MoeCkpCiAKKy8qCisgKiAgS1pNLUFSTTExLTAxIEJvYXJkIENvbnRyb2wgUmVnaXN0ZXJzIG9uIEZQR0EKKyAqLworI2RlZmluZSBLWk1fQVJNMTFfQ1RMMQkJKE1YMzFfQ1M0X0JBU0VfQUREUiArIDB4MTAwMCkKKyNkZWZpbmUgS1pNX0FSTTExX0NUTDIJCShNWDMxX0NTNF9CQVNFX0FERFIgKyAweDEwMDEpCisjZGVmaW5lIEtaTV9BUk0xMV9SU1cxCQkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDAyKQorI2RlZmluZSBLWk1fQVJNMTFfQkFDS19MSUdIVAkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDA0KQorI2RlZmluZSBLWk1fQVJNMTFfRlBHQV9SRVYJKE1YMzFfQ1M0X0JBU0VfQUREUiArIDB4MTAwOCkKKyNkZWZpbmUgS1pNX0FSTTExXzdTRUdfTEVECShNWDMxX0NTNF9CQVNFX0FERFIgKyAweDEwMTApCisjZGVmaW5lIEtaTV9BUk0xMV9MRURTCQkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDIwKQorI2RlZmluZSBLWk1fQVJNMTFfRElQU1cyCShNWDMxX0NTNF9CQVNFX0FERFIgKyAweDEwMDMpCisKKy8qCisgKiBFeHRlcm5hbCBVQVJUIGZvciB0b3VjaCBwYW5lbCBvbiBGUEdBCisgKi8KKyNkZWZpbmUgS1pNX0FSTTExXzE2NTUwCQkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDUwKQorCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKIC8qCiAgKiBLWk0tQVJNMTEtMDEgaGFzIGFuIGV4dGVybmFsIFVBUlQgb24gRlBHQQpAQCAtMTczLDE1ICsxODUsMTQgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0lNWCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0lNWF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGt6bV9pbml0X2lteF91YXJ0KHZvaWQpCiB7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOwotCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMSwgJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDEoJnVhcnRfcGRhdGEpOwogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBrem1faW5pdF9pbXhfdWFydCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxXzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxXzNkcy5jCmluZGV4IDU4ZTU3MjkuLjZmZTY5ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFfM2RzLmMKQEAgLTEwLDEwICsxMCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTIyLDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvbWMxMzc4My5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KQEAgLTM3LDE5ICszMiw0NyBAQAogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQtbXgzMV8zZHMuaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDMuaD4KLSNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+Ci0jaW5jbHVkZSA8bWFjaC9zcGkuaD4KKyNpbmNsdWRlIDxtYWNoLzNkc19kZWJ1Z2JvYXJkLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDMxLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCi0vKiEKLSAqIEBmaWxlIG14MzFfM2RzLmMKLSAqCi0gKiBAYnJpZWYgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lcy4KLSAqCi0gKiBAaW5ncm91cCBTeXN0ZW0KKy8qIERlZmluaXRpb25zIGZvciBjb21wb25lbnRzIG9uIHRoZSBEZWJ1ZyBib2FyZCAqLworCisvKiBCYXNlIGFkZHJlc3Mgb2YgQ1BMRCBjb250cm9sbGVyIG9uIHRoZSBEZWJ1ZyBib2FyZCAqLworI2RlZmluZSBERUJVR19CQVNFX0FERFJFU1MJCUNTNV9JT19BRERSRVNTKE1YM3hfQ1M1X0JBU0VfQUREUikKKworLyogTEFOOTIxNyBldGhlcm5ldCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTEFOOTIxN19CQVNFX0FERFIJCU1YM3hfQ1M1X0JBU0VfQUREUgorCisvKiBDUExEIGNvbmZpZyBhbmQgaW50ZXJydXB0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDUExEX0FERFIJCQkoREVCVUdfQkFTRV9BRERSRVNTICsgMHgyMDAwMCkKKworLyogc3RhdHVzLCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQ1BMRF9JTlRfU1RBVFVTX1JFRwkJKENQTERfQUREUiArIDB4MTApCisjZGVmaW5lIENQTERfSU5UX01BU0tfUkVHCQkoQ1BMRF9BRERSICsgMHgzOCkKKyNkZWZpbmUgQ1BMRF9JTlRfUkVTRVRfUkVHCQkoQ1BMRF9BRERSICsgMHgyMCkKKy8qIG1hZ2ljIHdvcmQgZm9yIGRlYnVnIENQTEQgKi8KKyNkZWZpbmUgQ1BMRF9NQUdJQ19OVU1CRVIxX1JFRwkJKENQTERfQUREUiArIDB4NDApCisjZGVmaW5lIENQTERfTUFHSUNfTlVNQkVSMl9SRUcJCShDUExEX0FERFIgKyAweDQ4KQorLyogQ1BMRCBjb2RlIHZlcnNpb24gKi8KKyNkZWZpbmUgQ1BMRF9DT0RFX1ZFUl9SRUcJCShDUExEX0FERFIgKyAweDUwKQorLyogbWFnaWMgd29yZCBmb3IgZGVidWcgQ1BMRCAqLworI2RlZmluZSBDUExEX01BR0lDX05VTUJFUjNfUkVHCQkoQ1BMRF9BRERSICsgMHg1OCkKKworLyogQ1BMRCBJUlEgbGluZSBmb3IgZXh0ZXJuYWwgdWFydCwgZXh0ZXJuYWwgZXRoZXJuZXQgZXRjICovCisjZGVmaW5lIEVYUElPX1BBUkVOVF9JTlQJSU9NVVhfVE9fSVJRKE1YMzFfUElOX0dQSU8xXzEpCisKKyNkZWZpbmUgTVhDX0VYUF9JT19CQVNFCQkoTVhDX0JPQVJEX0lSUV9TVEFSVCkKKyNkZWZpbmUgTVhDX0lSUV9UT19FWFBJTyhpcnEpCSgoaXJxKSAtIE1YQ19FWFBfSU9fQkFTRSkKKworI2RlZmluZSBFWFBJT19JTlRfRU5FVAkJKE1YQ19FWFBfSU9fQkFTRSArIDApCisKKyNkZWZpbmUgTVhDX01BWF9FWFBfSU9fTElORVMJMTYKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gcm91dGluZXMuCiAgKi8KIAogc3RhdGljIGludCBteDMxXzNkc19waW5zW10gPSB7CkBAIC0xNDUsNyArMTY4LDcgQEAKIAlNWENfU1BJX0NTKDIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkxX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkxX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5jaGlwc2VsZWN0CT0gc3BpMV9pbnRlcm5hbF9jaGlwc2VsZWN0LAogCS5udW1fY2hpcHNlbGVjdAk9IEFSUkFZX1NJWkUoc3BpMV9pbnRlcm5hbF9jaGlwc2VsZWN0KSwKIH07CkBAIC0xNjUsNyArMTg4LDggQEAKIC8qCiAgKiBOQU5EIEZsYXNoCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSBpbXgzMV8zZHNfbmFuZF9mbGFzaF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YQorbXgzMV8zZHNfbmFuZF9ib2FyZF9pbmZvIF9faW5pdGNvbnN0ID0gewogCS53aWR0aAkJPSAxLAogCS5od19lY2MJCT0gMSwKICNpZmRlZiBNQUNIX01YMzFfM0RTX01YQ19OQU5EX1VTRV9CQlQKQEAgLTE4Miw4ICsyMDYsMTAgQEAKIAogI2RlZmluZSBVU0JPVEdfUlNUX0IgSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9VU0JfUFdSKQogCi1zdGF0aWMgdm9pZCBteDMxXzNkc191c2JvdGdfaW5pdCh2b2lkKQorc3RhdGljIGludCBteDMxXzNkc191c2JvdGdfaW5pdCh2b2lkKQogeworCWludCBlcnI7CisKIAlteGNfaW9tdXhfc2V0X3BhZChNWDMxX1BJTl9VU0JPVEdfREFUQTAsIFVTQl9QQURfQ0ZHKTsKIAlteGNfaW9tdXhfc2V0X3BhZChNWDMxX1BJTl9VU0JPVEdfREFUQTEsIFVTQl9QQURfQ0ZHKTsKIAlteGNfaW9tdXhfc2V0X3BhZChNWDMxX1BJTl9VU0JPVEdfREFUQTIsIFVTQl9QQURfQ0ZHKTsKQEAgLTE5NywxMCArMjIzLDI1IEBACiAJbXhjX2lvbXV4X3NldF9wYWQoTVgzMV9QSU5fVVNCT1RHX05YVCwgVVNCX1BBRF9DRkcpOwogCW14Y19pb211eF9zZXRfcGFkKE1YMzFfUElOX1VTQk9UR19TVFAsIFVTQl9QQURfQ0ZHKTsKIAotCWdwaW9fcmVxdWVzdChVU0JPVEdfUlNUX0IsICJvdGd1c2ItcmVzZXQiKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoVVNCT1RHX1JTVF9CLCAwKTsKKwllcnIgPSBncGlvX3JlcXVlc3QoVVNCT1RHX1JTVF9CLCAib3RndXNiLXJlc2V0Iik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZXF1ZXN0IHRoZSBVU0IgT1RHIHJlc2V0IGdwaW9cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChVU0JPVEdfUlNUX0IsIDApOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZHJpdmUgdGhlIFVTQiBPVEcgcmVzZXQgZ3Bpb1xuIik7CisJCWdvdG8gdXNib3RnX2ZyZWVfcmVzZXQ7CisJfQorCiAJbWRlbGF5KDEpOwogCWdwaW9fc2V0X3ZhbHVlKFVTQk9UR19SU1RfQiwgMSk7CisJcmV0dXJuIDA7CisKK3VzYm90Z19mcmVlX3Jlc2V0OgorCWdwaW9fZnJlZShVU0JPVEdfUlNUX0IpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSB1c2JvdGdfcGRhdGEgPSB7CkBAIC0yMDgsMTc4ICsyNDksMTYgQEAKIAkucGh5X21vZGUJPSBGU0xfVVNCMl9QSFlfVUxQSSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCiAvKgotICogU3VwcG9ydCBmb3IgdGhlIFNNU0M5MjE3IG9uIHRoZSBEZWJ1ZyBib2FyZC4KLSAqLwotCi1zdGF0aWMgc3RydWN0IHNtc2M5MTF4X3BsYXRmb3JtX2NvbmZpZyBzbXNjOTExeF9jb25maWcgPSB7Ci0JLmlycV9wb2xhcml0eQk9IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfTE9XLAotCS5pcnFfdHlwZQk9IFNNU0M5MTFYX0lSUV9UWVBFX1BVU0hfUFVMTCwKLQkuZmxhZ3MJCT0gU01TQzkxMVhfVVNFXzE2QklUIHwgU01TQzkxMVhfRk9SQ0VfSU5URVJOQUxfUEhZLAotCS5waHlfaW50ZXJmYWNlCT0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJCT0gTEFOOTIxN19CQVNFX0FERFIsCi0JCS5lbmQJCT0gTEFOOTIxN19CQVNFX0FERFIgKyAweGZmLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQJCT0gRVhQSU9fSU5UX0VORVQsCi0JCS5lbmQJCT0gRVhQSU9fSU5UX0VORVQsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21zYzkxMXhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzbXNjOTExeCIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbXNjOTExeF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHNtc2M5MTF4X3Jlc291cmNlcywKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmc21zYzkxMXhfY29uZmlnLAotCX0sCi19OwotCi0vKgotICogUm91dGluZXMgZm9yIHRoZSBDUExEIG9uIHRoZSBkZWJ1ZyBib2FyZC4gSXQgY29udGFpbnMgYSBDUExEIGhhbmRsaW5nCi0gKiBMRURzLCBzd2l0Y2hlcywgaW50ZXJydXB0cyBmb3IgRXRoZXJuZXQuCi0gKi8KLQotc3RhdGljIHZvaWQgbXgzMV8zZHNfZXhwaW9faXJxX2hhbmRsZXIodWludDMyX3QgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0JdWludDMyX3QgaW1yX3ZhbDsKLQl1aW50MzJfdCBpbnRfdmFsaWQ7Ci0JdWludDMyX3QgZXhwaW9faXJxOwotCi0JaW1yX3ZhbCA9IF9fcmF3X3JlYWR3KENQTERfSU5UX01BU0tfUkVHKTsKLQlpbnRfdmFsaWQgPSBfX3Jhd19yZWFkdyhDUExEX0lOVF9TVEFUVVNfUkVHKSAmIH5pbXJfdmFsOwotCi0JZXhwaW9faXJxID0gTVhDX0VYUF9JT19CQVNFOwotCWZvciAoOyBpbnRfdmFsaWQgIT0gMDsgaW50X3ZhbGlkID4+PSAxLCBleHBpb19pcnErKykgewotCQlpZiAoKGludF92YWxpZCAmIDEpID09IDApCi0JCQljb250aW51ZTsKLQkJZ2VuZXJpY19oYW5kbGVfaXJxKGV4cGlvX2lycSk7Ci0JfQotfQotCi0vKgotICogRGlzYWJsZSBhbiBleHBpbyBwaW4ncyBpbnRlcnJ1cHQgYnkgc2V0dGluZyB0aGUgYml0IGluIHRoZSBpbXIuCi0gKiBAcGFyYW0gaXJxICAgICAgICAgICBhbiBleHBpbyB2aXJ0dWFsIGlycSBudW1iZXIKLSAqLwotc3RhdGljIHZvaWQgZXhwaW9fbWFza19pcnEodWludDMyX3QgaXJxKQotewotCXVpbnQxNl90IHJlZzsKLQl1aW50MzJfdCBleHBpbyA9IE1YQ19JUlFfVE9fRVhQSU8oaXJxKTsKLQotCS8qIG1hc2sgdGhlIGludGVycnVwdCAqLwotCXJlZyA9IF9fcmF3X3JlYWR3KENQTERfSU5UX01BU0tfUkVHKTsKLQlyZWcgfD0gMSA8PCBleHBpbzsKLQlfX3Jhd193cml0ZXcocmVnLCBDUExEX0lOVF9NQVNLX1JFRyk7Ci19Ci0KLS8qCi0gKiBBY2tub3dsZWRnZSBhbiBleHBhbmRlZCBpbyBwaW4ncyBpbnRlcnJ1cHQgYnkgY2xlYXJpbmcgdGhlIGJpdCBpbiB0aGUgaXNyLgotICogQHBhcmFtIGlycSAgICAgICAgICAgYW4gZXhwYW5kZWQgaW8gdmlydHVhbCBpcnEgbnVtYmVyCi0gKi8KLXN0YXRpYyB2b2lkIGV4cGlvX2Fja19pcnEodWludDMyX3QgaXJxKQotewotCXVpbnQzMl90IGV4cGlvID0gTVhDX0lSUV9UT19FWFBJTyhpcnEpOwotCi0JLyogY2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgKi8KLQlfX3Jhd193cml0ZXcoMSA8PCBleHBpbywgQ1BMRF9JTlRfUkVTRVRfUkVHKTsKLQlfX3Jhd193cml0ZXcoMCwgQ1BMRF9JTlRfUkVTRVRfUkVHKTsKLQkvKiBtYXNrIHRoZSBpbnRlcnJ1cHQgKi8KLQlleHBpb19tYXNrX2lycShpcnEpOwotfQotCi0vKgotICogRW5hYmxlIGEgZXhwaW8gcGluJ3MgaW50ZXJydXB0IGJ5IGNsZWFyaW5nIHRoZSBiaXQgaW4gdGhlIGltci4KLSAqIEBwYXJhbSBpcnEgICAgICAgICAgIGEgZXhwaW8gdmlydHVhbCBpcnEgbnVtYmVyCi0gKi8KLXN0YXRpYyB2b2lkIGV4cGlvX3VubWFza19pcnEodWludDMyX3QgaXJxKQotewotCXVpbnQxNl90IHJlZzsKLQl1aW50MzJfdCBleHBpbyA9IE1YQ19JUlFfVE9fRVhQSU8oaXJxKTsKLQotCS8qIHVubWFzayB0aGUgaW50ZXJydXB0ICovCi0JcmVnID0gX19yYXdfcmVhZHcoQ1BMRF9JTlRfTUFTS19SRUcpOwotCXJlZyAmPSB+KDEgPDwgZXhwaW8pOwotCV9fcmF3X3dyaXRldyhyZWcsIENQTERfSU5UX01BU0tfUkVHKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBleHBpb19pcnFfY2hpcCA9IHsKLQkuYWNrID0gZXhwaW9fYWNrX2lycSwKLQkubWFzayA9IGV4cGlvX21hc2tfaXJxLAotCS51bm1hc2sgPSBleHBpb191bm1hc2tfaXJxLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXgzMV8zZHNfaW5pdF9leHBpbyh2b2lkKQotewotCWludCBpOwotCWludCByZXQ7Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSdzIGEgZGVidWcgYm9hcmQgY29ubmVjdGVkICovCi0JaWYgKChfX3Jhd19yZWFkdyhDUExEX01BR0lDX05VTUJFUjFfUkVHKSAhPSAweEFBQUEpIHx8Ci0JICAgIChfX3Jhd19yZWFkdyhDUExEX01BR0lDX05VTUJFUjJfUkVHKSAhPSAweDU1NTUpIHx8Ci0JICAgIChfX3Jhd19yZWFkdyhDUExEX01BR0lDX05VTUJFUjNfUkVHKSAhPSAweENBRkUpKSB7Ci0JCS8qIE5vIERlYnVnIGJvYXJkIGZvdW5kICovCi0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXByX2luZm8oImkuTVgzMSAzRFMgRGVidWcgYm9hcmQgZGV0ZWN0ZWQsIHJldiA9IDB4JTA0WFxuIiwKLQkJX19yYXdfcmVhZHcoQ1BMRF9DT0RFX1ZFUl9SRUcpKTsKLQotCS8qCi0JICogQ29uZmlndXJlIElOVCBsaW5lIGFzIEdQSU8gaW5wdXQKLQkgKi8KLQlyZXQgPSBncGlvX3JlcXVlc3QoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9HUElPMV8xKSwgInNtczkyMTctaXJxIik7Ci0JaWYgKHJldCkKLQkJcHJfd2FybmluZygiY291bGQgbm90IGdldCBMQU4gaXJxIGdwaW9cbiIpOwotCWVsc2UKLQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9HUElPMV8xKSk7Ci0KLQkvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHRzIGFuZCBjbGVhciB0aGUgc3RhdHVzICovCi0JX19yYXdfd3JpdGV3KDAsIENQTERfSU5UX01BU0tfUkVHKTsKLQlfX3Jhd193cml0ZXcoMHhGRkZGLCBDUExEX0lOVF9SRVNFVF9SRUcpOwotCV9fcmF3X3dyaXRldygwLCBDUExEX0lOVF9SRVNFVF9SRUcpOwotCV9fcmF3X3dyaXRldygweDFGLCBDUExEX0lOVF9NQVNLX1JFRyk7Ci0JZm9yIChpID0gTVhDX0VYUF9JT19CQVNFOwotCSAgICAgaSA8IChNWENfRVhQX0lPX0JBU0UgKyBNWENfTUFYX0VYUF9JT19MSU5FUyk7Ci0JICAgICBpKyspIHsKLQkJc2V0X2lycV9jaGlwKGksICZleHBpb19pcnFfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKLQl9Ci0Jc2V0X2lycV90eXBlKEVYUElPX1BBUkVOVF9JTlQsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoRVhQSU9fUEFSRU5UX0lOVCwgbXgzMV8zZHNfZXhwaW9faXJxX2hhbmRsZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNWDMxIG1lbW9yeSBtYXAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgzMV8zZHNfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbCA9IE1YMzFfQ1M1X0JBU0VfQUREUl9WSVJULAotCQkucGZuID0gX19waHlzX3RvX3BmbihNWDMxX0NTNV9CQVNFX0FERFIpLAotCQkubGVuZ3RoID0gTVgzMV9DUzVfU0laRSwKLQkJLnR5cGUgPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KLS8qCiAgKiBTZXQgdXAgc3RhdGljIHZpcnR1YWwgbWFwcGluZ3MuCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBteDMxXzNkc19tYXBfaW8odm9pZCkKIHsKIAlteDMxX21hcF9pbygpOwotCWlvdGFibGVfaW5pdChteDMxXzNkc19pb19kZXNjLCBBUlJBWV9TSVpFKG14MzFfM2RzX2lvX2Rlc2MpKTsKIH0KIAogLyohCkBAIC0zOTAsMTAgKzI2OSwxMCBAQAogCW14Y19pb211eF9zZXR1cF9tdWx0aXBsZV9waW5zKG14MzFfM2RzX3BpbnMsIEFSUkFZX1NJWkUobXgzMV8zZHNfcGlucyksCiAJCQkJICAgICAgIm14MzFfM2RzIik7CiAKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UwLCAmdWFydF9wZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX25hbmRfZGV2aWNlLCAmaW14MzFfM2RzX25hbmRfZmxhc2hfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9teGNfbmFuZCgmbXgzMV8zZHNfbmFuZF9ib2FyZF9pbmZvKTsKIAotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zcGlfZGV2aWNlMSwgJnNwaTFfcGRhdGEpOworCWlteDMxX2FkZF9zcGlfaW14MCgmc3BpMV9wZGF0YSk7CiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8obXgzMV8zZHNfc3BpX2RldnMsCiAJCQkJCQlBUlJBWV9TSVpFKG14MzFfM2RzX3NwaV9kZXZzKSk7CiAKQEAgLTQwMiw4ICsyODEsOSBAQAogCW14MzFfM2RzX3VzYm90Z19pbml0KCk7CiAJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX290Z191ZGNfZGV2aWNlLCAmdXNib3RnX3BkYXRhKTsKIAotCWlmICghbXgzMV8zZHNfaW5pdF9leHBpbygpKQotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtc2M5MTF4X2RldmljZSk7CisJaWYgKCFteGNfZXhwaW9faW5pdChDUzVfQkFTRV9BRERSLCBFWFBJT19QQVJFTlRfSU5UKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5pdCBvZiB0aGUgZGVidWdib2FyZCBmYWlsZWQsIGFsbCAiCisJCQkJICAgICJkZXZpY2VzIG9uIHRoZSBib2FyZCBhcmUgdW51c2FibGUuXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG14MzFfM2RzX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxYWRzLmMKaW5kZXggYjNkMWExOC4uOTRiM2U3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxYWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxYWRzLmMKQEAgLTEyLDEwICsxMiw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTMzLDggKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLW14MzFhZHMuaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDMuaD4KIAogI2lmZGVmIENPTkZJR19NQUNIX01YMzFBRFNfV00xMTMzX0VWMQpAQCAtNDMsMTQgKzM3LDQ1IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9wbWljLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgImRldmljZXMtaW14MzEuaCIKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKLS8qIQotICogQGZpbGUgbXgzMWFkcy5jCi0gKgotICogQGJyaWVmIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gcm91dGluZXMuCi0gKgotICogQGluZ3JvdXAgU3lzdGVtCisvKiBCYXNlIGFkZHJlc3Mgb2YgUEJDIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgUEJDX0JBU0VfQUREUkVTUyAgICAgICAgTVgzMV9DUzRfQkFTRV9BRERSX1ZJUlQKKy8qIE9mZnNldHMgZm9yIHRoZSBQQkMgQ29udHJvbGxlciByZWdpc3RlciAqLworCisvKiBQQkMgQm9hcmQgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBQQkNfSU5UU1RBVFVTICAgICAgICAgICAweDAwMDAxNgorCisvKiBQQkMgQm9hcmQgaW50ZXJydXB0IGN1cnJlbnQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBCQ19JTlRDVVJSX1NUQVRVUyAgICAgIDB4MDAwMDE4CisKKy8qIFBCQyBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciBzZXQgYWRkcmVzcyAqLworI2RlZmluZSBQQkNfSU5UTUFTS19TRVQgICAgICAgICAweDAwMDAxQQorCisvKiBQQkMgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgY2xlYXIgYWRkcmVzcyAqLworI2RlZmluZSBQQkNfSU5UTUFTS19DTEVBUiAgICAgICAweDAwMDAxQworCisvKiBFeHRlcm5hbCBVQVJUIEEgKi8KKyNkZWZpbmUgUEJDX1NDMTZDNjUyX1VBUlRBICAgICAgMHgwMTAwMDAKKworLyogRXh0ZXJuYWwgVUFSVCBCICovCisjZGVmaW5lIFBCQ19TQzE2QzY1Ml9VQVJUQiAgICAgIDB4MDEwMDEwCisKKyNkZWZpbmUgUEJDX0lOVFNUQVRVU19SRUcJKFBCQ19JTlRTVEFUVVMgKyBQQkNfQkFTRV9BRERSRVNTKQorI2RlZmluZSBQQkNfSU5UTUFTS19TRVRfUkVHCShQQkNfSU5UTUFTS19TRVQgKyBQQkNfQkFTRV9BRERSRVNTKQorI2RlZmluZSBQQkNfSU5UTUFTS19DTEVBUl9SRUcJKFBCQ19JTlRNQVNLX0NMRUFSICsgUEJDX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgRVhQSU9fUEFSRU5UX0lOVAlJT01VWF9UT19JUlEoTVgzMV9QSU5fR1BJTzFfNCkKKworI2RlZmluZSBNWENfRVhQX0lPX0JBU0UJCShNWENfQk9BUkRfSVJRX1NUQVJUKQorI2RlZmluZSBNWENfSVJRX1RPX0VYUElPKGlycSkJKChpcnEpIC0gTVhDX0VYUF9JT19CQVNFKQorCisjZGVmaW5lIEVYUElPX0lOVF9YVUFSVF9JTlRBCShNWENfRVhQX0lPX0JBU0UgKyAxMCkKKyNkZWZpbmUgRVhQSU9fSU5UX1hVQVJUX0lOVEIJKE1YQ19FWFBfSU9fQkFTRSArIDExKQorCisjZGVmaW5lIE1YQ19NQVhfRVhQX0lPX0xJTkVTCTE2CisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lcy4KICAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKQEAgLTk4LDcgKzEyMyw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9JTVgpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9JTVhfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKIH07CiAKQEAgLTExMiw3ICsxMzcsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2lteF91YXJ0KHZvaWQpCiB7CiAJbXhjX2lvbXV4X3NldHVwX211bHRpcGxlX3BpbnModWFydF9waW5zLCBBUlJBWV9TSVpFKHVhcnRfcGlucyksICJ1YXJ0LTAiKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UwLCAmdWFydF9wZGF0YSk7CisJaW14MzFfYWRkX2lteF91YXJ0MCgmdWFydF9wZGF0YSk7CiB9CiAjZWxzZSAvKiAhU0VSSUFMX0lNWCAqLwogc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2lteF91YXJ0KHZvaWQpCkBAIC00NzUsNyArNTAwLDcgQEAKIAlteGNfaW9tdXhfbW9kZShJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkyX01PU0ksIElPTVVYX0NPTkZJR19BTFQxKSk7CiAJbXhjX2lvbXV4X21vZGUoSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMl9NSVNPLCBJT01VWF9DT05GSUdfQUxUMSkpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2kyY19kZXZpY2UxLCBOVUxMKTsKKwlpbXgzMV9hZGRfaW14X2kyYzEoTlVMTCk7CiB9CiAjZWxzZQogc3RhdGljIHZvaWQgbXhjX2luaXRfaTJjKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFsaWxseS5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxbGlsbHkuYwppbmRleCBiMmM3ZjUxLi44ZjY2ZjY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFsaWxseS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMWxpbGx5LmMKQEAgLTE4LDEwICsxOCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQ2LDEwICs0MiwxMCBAQAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDMuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLW14MzFsaWxseS5oPgotI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgogI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgogCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgzMS5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAogLyoKQEAgLTI2OSwxMiArMjY1LDEyIEBACiAJTVhDX1NQSV9DUygyKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgc3BpMF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgc3BpMF9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuY2hpcHNlbGVjdCA9IHNwaV9pbnRlcm5hbF9jaGlwc2VsZWN0LAogCS5udW1fY2hpcHNlbGVjdCA9IEFSUkFZX1NJWkUoc3BpX2ludGVybmFsX2NoaXBzZWxlY3QpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkxX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkxX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5jaGlwc2VsZWN0ID0gc3BpX2ludGVybmFsX2NoaXBzZWxlY3QsCiAJLm51bV9jaGlwc2VsZWN0ID0gQVJSQVlfU0laRShzcGlfaW50ZXJuYWxfY2hpcHNlbGVjdCksCiB9OwpAQCAtMjg5LDYgKzI4NSw3IEBACiAJLmJ1c19udW0JPSAxLAogCS5jaGlwX3NlbGVjdAk9IDAsCiAJLnBsYXRmb3JtX2RhdGEJPSAmbWMxMzc4M19wZGF0YSwKKwkuaXJxCQk9IElPTVVYX1RPX0lSUShNWDMxX1BJTl9HUElPMV8zKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKQEAgLTMzMSw4ICszMjgsOCBAQAogCW14Y19pb211eF9hbGxvY19waW4oTVgzMV9QSU5fQ1NQSTJfU1MxX19TUzEsICJTUEkyX1NTMSIpOwogCW14Y19pb211eF9hbGxvY19waW4oTVgzMV9QSU5fQ1NQSTJfU1MyX19TUzIsICJTUEkyX1NTMiIpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NwaV9kZXZpY2UwLCAmc3BpMF9wZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NwaV9kZXZpY2UxLCAmc3BpMV9wZGF0YSk7CisJaW14MzFfYWRkX3NwaV9pbXgwKCZzcGkwX3BkYXRhKTsKKwlpbXgzMV9hZGRfc3BpX2lteDEoJnNwaTFfcGRhdGEpOwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKCZtYzEzNzgzX2RldiwgMSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMWxpdGUuYyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMWxpdGUuYwppbmRleCAyYjZkMTE0Li5kYTIzNmM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFsaXRlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxbGl0ZS5jCkBAIC0xMywxMCArMTMsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC00MiwxNCArMzgsMTIgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLW14MzFsaXRlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgotI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgogI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgogCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgzMS5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAogLyoKQEAgLTY5LDcgKzYzLDggQEAKIAlNWDMxX1BJTl9DU1BJMl9TUzJfX1NTMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSBteDMxbGl0ZV9uYW5kX2JvYXJkX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEKK214MzFsaXRlX25hbmRfYm9hcmRfaW5mbyBfX2luaXRjb25zdCAgPSB7CiAJLndpZHRoID0gMSwKIAkuaHdfZWNjID0gMSwKIH07CkBAIC0xMTIsNyArMTA3LDcgQEAKIAlNWENfU1BJX0NTKDApLAogfTsKIAotc3RhdGljIHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkxX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkxX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5jaGlwc2VsZWN0CT0gc3BpX2ludGVybmFsX2NoaXBzZWxlY3QsCiAJLm51bV9jaGlwc2VsZWN0CT0gQVJSQVlfU0laRShzcGlfaW50ZXJuYWxfY2hpcHNlbGVjdCksCiB9OwpAQCAtMjUzLDkgKzI0OCw5IEBACiAKIAkvKiBOT1IgYW5kIE5BTkQgZmxhc2ggKi8KIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBoeXNtYXBfZmxhc2hfZGV2aWNlKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfbmFuZF9kZXZpY2UsICZteDMxbGl0ZV9uYW5kX2JvYXJkX2luZm8pOworCWlteDMxX2FkZF9teGNfbmFuZCgmbXgzMWxpdGVfbmFuZF9ib2FyZF9pbmZvKTsKIAotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zcGlfZGV2aWNlMSwgJnNwaTFfcGRhdGEpOworCWlteDMxX2FkZF9zcGlfaW14MSgmc3BpMV9wZGF0YSk7CiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oJm1jMTM3ODNfc3BpX2RldiwgMSk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfVUxQSSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMW1vYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMW1vYm9hcmQuYwppbmRleCA2MmI1ZTQwLi42Nzc3NmJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFtb2JvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxbW9ib2FyZC5jCkBAIC0xMCwxMCArMTAsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00MiwxNiArMzgsMTUgQEAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLW14MzFtb2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9pcHUuaD4KLSNpbmNsdWRlIDxtYWNoL2kyYy5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgogI2luY2x1ZGUgPG1hY2gvbXgzX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC91bHBpLmg+CiAKKyNpbmNsdWRlICJkZXZpY2VzLWlteDMxLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1vYm9hcmRfcGluc1tdID0gewpAQCAtMTMwLDI0ICsxMjUsMzYgQEAKIAogc3RhdGljIGludCBtb2JvYXJkX3VhcnQwX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlncGlvX3JlcXVlc3QoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSwgInVhcnQwLWN0cy1oYWNrIik7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSksIDApOwotCXJldHVybiAwOworCWludCByZXQgPSBncGlvX3JlcXVlc3QoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSwgInVhcnQwLWN0cy1oYWNrIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpLCAwKTsKKwlpZiAocmV0KQorCQlncGlvX2ZyZWUoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSk7CisKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0MF9wZGF0YSA9IHsKK3N0YXRpYyB2b2lkIG1vYm9hcmRfdWFydDBfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWdwaW9fZnJlZShJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydDBfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmluaXQgPSBtb2JvYXJkX3VhcnQwX2luaXQsCisJLmV4aXQgPSBtb2JvYXJkX3VhcnQwX2V4aXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0NF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnQ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIG1vYm9hcmRfaTJjMF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9pMmMwX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmJpdHJhdGUgPSA0MDAwMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIG1vYm9hcmRfaTJjMV9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9pMmMxX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmJpdHJhdGUgPSAxMDAwMDAsCiB9OwogCkBAIC0xNTYsNyArMTYzLDcgQEAKIAlNWENfU1BJX0NTKDIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzcGlfaW14X21hc3RlciBtb2JvYXJkX3NwaTFfbWFzdGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBtb2JvYXJkX3NwaTFfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmNoaXBzZWxlY3QJPSBtb2JvYXJkX3NwaTFfY3MsCiAJLm51bV9jaGlwc2VsZWN0CT0gQVJSQVlfU0laRShtb2JvYXJkX3NwaTFfY3MpLAogfTsKQEAgLTI4Niw3ICsyOTMsNyBAQAogCU1YQ19TUElfQ1MoMSksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNwaV9pbXhfbWFzdGVyIG1vYm9hcmRfc3BpMl9tYXN0ZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9pbXhfbWFzdGVyIG1vYm9hcmRfc3BpMl9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuY2hpcHNlbGVjdAk9IG1vYm9hcmRfc3BpMl9jcywKIAkubnVtX2NoaXBzZWxlY3QJPSBBUlJBWV9TSVpFKG1vYm9hcmRfc3BpMl9jcyksCiB9OwpAQCAtNDk5LDE1ICs1MDYsMTQgQEAKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnQwX3BkYXRhKTsKKwlpbXgzMV9hZGRfaW14X3VhcnQwKCZ1YXJ0MF9wZGF0YSk7CisJaW14MzFfYWRkX2lteF91YXJ0NCgmdWFydDRfcGRhdGEpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlNCwgJnVhcnQ0X3BkYXRhKTsKKwlpbXgzMV9hZGRfaW14X2kyYzAoJm1vYm9hcmRfaTJjMF9kYXRhKTsKKwlpbXgzMV9hZGRfaW14X2kyYzEoJm1vYm9hcmRfaTJjMV9kYXRhKTsKIAotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMCwgJm1vYm9hcmRfaTJjMF9wZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2kyY19kZXZpY2UxLCAmbW9ib2FyZF9pMmMxX3BkYXRhKTsKLQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zcGlfZGV2aWNlMSwgJm1vYm9hcmRfc3BpMV9tYXN0ZXIpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19zcGlfZGV2aWNlMiwgJm1vYm9hcmRfc3BpMl9tYXN0ZXIpOworCWlteDMxX2FkZF9zcGlfaW14MSgmbW9ib2FyZF9zcGkxX3BkYXRhKTsKKwlpbXgzMV9hZGRfc3BpX2lteDIoJm1vYm9hcmRfc3BpMl9wZGF0YSk7CiAKIAlncGlvX3JlcXVlc3QoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9HUElPMV8zKSwgInBtaWMtaXJxIik7CiAJZ3Bpb19kaXJlY3Rpb25faW5wdXQoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9HUElPMV8zKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzVfM2RzLmMgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzVfM2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzMGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzNV8zZHMuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBGYWJpbyBFc3RldmFtIDxmYWJpby5lc3RldmFtQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUaGlzIG1hY2hpbmUgaXMga25vd24gYXM6CisgKiAgLSBpLk1YMzUgMy1TdGFjayBEZXZlbG9wbWVudCBTeXN0ZW0KKyAqICAtIGkuTVgzNSBQbGF0Zm9ybSBEZXZlbG9wbWVudCBLaXQgKGkuTVgzNSBQREspCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDM1Lmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDM1LmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0geworCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm14Y19mZWNfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBteDM1cGRrX3BhZHNbXSA9IHsKKwkvKiBVQVJUMSAqLworCU1YMzVfUEFEX0NUUzFfX1VBUlQxX0NUUywKKwlNWDM1X1BBRF9SVFMxX19VQVJUMV9SVFMsCisJTVgzNV9QQURfVFhEMV9fVUFSVDFfVFhEX01VWCwKKwlNWDM1X1BBRF9SWEQxX19VQVJUMV9SWERfTVVYLAorCS8qIEZFQyAqLworCU1YMzVfUEFEX0ZFQ19UWF9DTEtfX0ZFQ19UWF9DTEssCisJTVgzNV9QQURfRkVDX1JYX0NMS19fRkVDX1JYX0NMSywKKwlNWDM1X1BBRF9GRUNfUlhfRFZfX0ZFQ19SWF9EViwKKwlNWDM1X1BBRF9GRUNfQ09MX19GRUNfQ09MLAorCU1YMzVfUEFEX0ZFQ19SREFUQTBfX0ZFQ19SREFUQV8wLAorCU1YMzVfUEFEX0ZFQ19UREFUQTBfX0ZFQ19UREFUQV8wLAorCU1YMzVfUEFEX0ZFQ19UWF9FTl9fRkVDX1RYX0VOLAorCU1YMzVfUEFEX0ZFQ19NRENfX0ZFQ19NREMsCisJTVgzNV9QQURfRkVDX01ESU9fX0ZFQ19NRElPLAorCU1YMzVfUEFEX0ZFQ19UWF9FUlJfX0ZFQ19UWF9FUlIsCisJTVgzNV9QQURfRkVDX1JYX0VSUl9fRkVDX1JYX0VSUiwKKwlNWDM1X1BBRF9GRUNfQ1JTX19GRUNfQ1JTLAorCU1YMzVfUEFEX0ZFQ19SREFUQTFfX0ZFQ19SREFUQV8xLAorCU1YMzVfUEFEX0ZFQ19UREFUQTFfX0ZFQ19UREFUQV8xLAorCU1YMzVfUEFEX0ZFQ19SREFUQTJfX0ZFQ19SREFUQV8yLAorCU1YMzVfUEFEX0ZFQ19UREFUQTJfX0ZFQ19UREFUQV8yLAorCU1YMzVfUEFEX0ZFQ19SREFUQTNfX0ZFQ19SREFUQV8zLAorCU1YMzVfUEFEX0ZFQ19UREFUQTNfX0ZFQ19UREFUQV8zLAorCS8qIFVTQk9URyAqLworCU1YMzVfUEFEX1VTQk9UR19QV1JfX1VTQl9UT1BfVVNCT1RHX1BXUiwKKwlNWDM1X1BBRF9VU0JPVEdfT0NfX1VTQl9UT1BfVVNCT1RHX09DLAorfTsKKworLyogT1RHIGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIHVzYl9wZGF0YSA9IHsKKwkub3BlcmF0aW5nX21vZGUJPSBGU0xfVVNCMl9EUl9ERVZJQ0UsCisJLnBoeV9tb2RlCT0gRlNMX1VTQjJfUEhZX1VUTUlfV0lERSwKK307CisKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG14Y19ib2FyZF9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXgzNXBka19wYWRzLCBBUlJBWV9TSVpFKG14MzVwZGtfcGFkcykpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CisKKwlpbXgzNV9hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGdfdWRjX2RldmljZSwgJnVzYl9wZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteDM1cGRrX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDM1X2Nsb2Nrc19pbml0KCk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgbXgzNXBka190aW1lciA9IHsKKwkuaW5pdAk9IG14MzVwZGtfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoTVgzNV8zRFMsICJGcmVlc2NhbGUgTVgzNVBESyIpCisJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYyAqLworCS5waHlzX2lvCT0gTVgzNV9BSVBTMV9CQVNFX0FERFIsCisJLmlvX3BnX29mZnN0CT0gKChNWDM1X0FJUFMxX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zICAgID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5tYXBfaW8gICAgICAgICA9IG14MzVfbWFwX2lvLAorCS5pbml0X2lycSAgICAgICA9IG14MzVfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZSAgID0gbXhjX2JvYXJkX2luaXQsCisJLnRpbWVyICAgICAgICAgID0gJm14MzVwZGtfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDM1cGRrLmMgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzVwZGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhYzg0ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzVwZGsuYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBBdXRob3I6IEZhYmlvIEVzdGV2YW0gPGZhYmlvLmVzdGV2YW1AZnJlZXNjYWxlLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzNS5oPgotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0gewotCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJm14Y19mZWNfZGV2aWNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBteDM1cGRrX3BhZHNbXSA9IHsKLQkvKiBVQVJUMSAqLwotCU1YMzVfUEFEX0NUUzFfX1VBUlQxX0NUUywKLQlNWDM1X1BBRF9SVFMxX19VQVJUMV9SVFMsCi0JTVgzNV9QQURfVFhEMV9fVUFSVDFfVFhEX01VWCwKLQlNWDM1X1BBRF9SWEQxX19VQVJUMV9SWERfTVVYLAotCS8qIEZFQyAqLwotCU1YMzVfUEFEX0ZFQ19UWF9DTEtfX0ZFQ19UWF9DTEssCi0JTVgzNV9QQURfRkVDX1JYX0NMS19fRkVDX1JYX0NMSywKLQlNWDM1X1BBRF9GRUNfUlhfRFZfX0ZFQ19SWF9EViwKLQlNWDM1X1BBRF9GRUNfQ09MX19GRUNfQ09MLAotCU1YMzVfUEFEX0ZFQ19SREFUQTBfX0ZFQ19SREFUQV8wLAotCU1YMzVfUEFEX0ZFQ19UREFUQTBfX0ZFQ19UREFUQV8wLAotCU1YMzVfUEFEX0ZFQ19UWF9FTl9fRkVDX1RYX0VOLAotCU1YMzVfUEFEX0ZFQ19NRENfX0ZFQ19NREMsCi0JTVgzNV9QQURfRkVDX01ESU9fX0ZFQ19NRElPLAotCU1YMzVfUEFEX0ZFQ19UWF9FUlJfX0ZFQ19UWF9FUlIsCi0JTVgzNV9QQURfRkVDX1JYX0VSUl9fRkVDX1JYX0VSUiwKLQlNWDM1X1BBRF9GRUNfQ1JTX19GRUNfQ1JTLAotCU1YMzVfUEFEX0ZFQ19SREFUQTFfX0ZFQ19SREFUQV8xLAotCU1YMzVfUEFEX0ZFQ19UREFUQTFfX0ZFQ19UREFUQV8xLAotCU1YMzVfUEFEX0ZFQ19SREFUQTJfX0ZFQ19SREFUQV8yLAotCU1YMzVfUEFEX0ZFQ19UREFUQTJfX0ZFQ19UREFUQV8yLAotCU1YMzVfUEFEX0ZFQ19SREFUQTNfX0ZFQ19SREFUQV8zLAotCU1YMzVfUEFEX0ZFQ19UREFUQTNfX0ZFQ19UREFUQV8zLAotCS8qIFVTQk9URyAqLwotCU1YMzVfUEFEX1VTQk9UR19QV1JfX1VTQl9UT1BfVVNCT1RHX1BXUiwKLQlNWDM1X1BBRF9VU0JPVEdfT0NfX1VTQl9UT1BfVVNCT1RHX09DLAotfTsKLQotLyogT1RHIGNvbmZpZyAqLwotc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIHVzYl9wZGF0YSA9IHsKLQkub3BlcmF0aW5nX21vZGUJPSBGU0xfVVNCMl9EUl9ERVZJQ0UsCi0JLnBoeV9tb2RlCT0gRlNMX1VTQjJfUEhZX1VUTUlfV0lERSwKLX07Ci0KLS8qCi0gKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IG14Y19ib2FyZF9pbml0KHZvaWQpCi17Ci0JbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXgzNXBka19wYWRzLCBBUlJBWV9TSVpFKG14MzVwZGtfcGFkcykpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UwLCAmdWFydF9wZGF0YSk7Ci0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfb3RnX3VkY19kZXZpY2UsICZ1c2JfcGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXgzNXBka190aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgzNV9jbG9ja3NfaW5pdCgpOwotfQotCi1zdHJ1Y3Qgc3lzX3RpbWVyIG14MzVwZGtfdGltZXIgPSB7Ci0JLmluaXQJPSBteDM1cGRrX3RpbWVyX2luaXQsCi19OwotCi1NQUNISU5FX1NUQVJUKE1YMzVfM0RTLCAiRnJlZXNjYWxlIE1YMzVQREsiKQotCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMgKi8KLQkucGh5c19pbwk9IE1YMzVfQUlQUzFfQkFTRV9BRERSLAotCS5pb19wZ19vZmZzdAk9ICgoTVgzNV9BSVBTMV9CQVNFX0FERFJfVklSVCkgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcyAgICA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKLQkubWFwX2lvICAgICAgICAgPSBteDM1X21hcF9pbywKLQkuaW5pdF9pcnEgICAgICAgPSBteDM1X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUgICA9IG14Y19ib2FyZF9pbml0LAotCS50aW1lciAgICAgICAgICA9ICZteDM1cGRrX3RpbWVyLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcGNtMDM3LmMgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLXBjbTAzNy5jCmluZGV4IGNjZTQxMDYuLjhhMjkyZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcGNtMDM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1wY20wMzcuYwpAQCAtMTAsMTAgKzEwLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNDMsMjAgKzM5LDE3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLXBjbTAzNy5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvaTJjLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9pcHUuaD4KICNpbmNsdWRlIDxtYWNoL21tYy5oPgogI2luY2x1ZGUgPG1hY2gvbXgzX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1hY2gvbXgzZmIuaD4KLSNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgogI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgogCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgzMS5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJwY20wMzcuaCIKIApAQCAtMjI1LDcgKzIxOCw3IEBACiAJLm51bV9yZXNvdXJjZXMgPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKIH07CiAKQEAgLTI3OSwxNiArMjcyLDE3IEBACiAJLnJlc291cmNlID0gJnBjbTAzOF9zcmFtX3Jlc291cmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhIHBjbTAzN19uYW5kX2JvYXJkX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEKK3BjbTAzN19uYW5kX2JvYXJkX2luZm8gX19pbml0Y29uc3QgPSB7CiAJLndpZHRoID0gMSwKIAkuaHdfZWNjID0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgcGNtMDM3X2kyY18xX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIHBjbTAzN19pMmMxX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmJpdHJhdGUgPSAxMDAwMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIHBjbTAzN19pMmNfMl9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBwY20wMzdfaTJjMl9kYXRhIF9faW5pdGNvbnN0ID0gewogCS5iaXRyYXRlID0gMjAwMDAsCiB9OwogCkBAIC01NDUsNiArNTM5LDcgQEAKIAkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUocGNtOTcwX3NqYTEwMDBfcmVzb3VyY2VzKSwKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfVUxQSSkKIHN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBvdGdfcGRhdGEgPSB7CiAJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfVUxQSSwKIAkuZmxhZ3MJPSBNWENfRUhDSV9JTlRFUkZBQ0VfRElGRl9VTkksCkBAIC01NTQsNiArNTQ5LDcgQEAKIAkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAogCS5mbGFncwk9IE1YQ19FSENJX0lOVEVSRkFDRV9ESUZGX1VOSSwKIH07CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIG90Z19kZXZpY2VfcGRhdGEgPSB7CiAJLm9wZXJhdGluZ19tb2RlID0gRlNMX1VTQjJfRFJfREVWSUNFLApAQCAtNTgxLDcgKzU3Nyw2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbXhjX2JvYXJkX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwotCXUzMiB0bXA7CiAKIAlteGNfaW9tdXhfc2V0X2dwcihNVVhfUEdQX1VIMiwgMSk7CiAKQEAgLTYxNCw5ICs2MDksMTAgQEAKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9wZGF0YSk7CisJaW14MzFfYWRkX2lteF91YXJ0MCgmdWFydF9wZGF0YSk7CisJLyogWFhYOiBzaG91bGQndCB0aGlzIGhhdmUgLmZsYWdzID0gMCAoaS5lLiBubyBSVFNDVFMpIG9uIFBDTTAzN19FRVQ/ICovCisJaW14MzFfYWRkX2lteF91YXJ0MSgmdWFydF9wZGF0YSk7CisJaW14MzFfYWRkX2lteF91YXJ0MigmdWFydF9wZGF0YSk7CiAKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdzFfbWFzdGVyX2RldmljZSwgTlVMTCk7CiAKQEAgLTYzNCwxMCArNjMwLDEwIEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgcGNtMDM3X2kyY19kZXZpY2VzLAogCQkJQVJSQVlfU0laRShwY20wMzdfaTJjX2RldmljZXMpKTsKIAotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMSwgJnBjbTAzN19pMmNfMV9kYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfaTJjX2RldmljZTIsICZwY20wMzdfaTJjXzJfZGF0YSk7CisJaW14MzFfYWRkX2lteF9pMmMxKCZwY20wMzdfaTJjMV9kYXRhKTsKKwlpbXgzMV9hZGRfaW14X2kyYzIoJnBjbTAzN19pMmMyX2RhdGEpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX25hbmRfZGV2aWNlLCAmcGNtMDM3X25hbmRfYm9hcmRfaW5mbyk7CisJaW14MzFfYWRkX214Y19uYW5kKCZwY20wMzdfbmFuZF9ib2FyZF9pbmZvKTsKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNzZGhjX2RldmljZTAsICZzZGhjX3BkYXRhKTsKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteDNfaXB1LCAmbXgzX2lwdV9kYXRhKTsKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteDNfZmIsICZteDNmYl9wZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLXBjbTAzN19lZXQuYyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcGNtMDM3X2VldC5jCmluZGV4IDhkMzg2MDAuLmM4Yjk4MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcGNtMDM3X2VldC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcGNtMDM3X2VldC5jCkBAIC0xMyw5ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19TUElfSU1YX01PRFVMRSkKLSNpbmNsdWRlIDxtYWNoL3NwaS5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC02NCw3ICs2MSw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0lNWCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX0lNWF9NT0RVTEUpCiBzdGF0aWMgaW50IHBjbTAzN19zcGkxX2NzW10gPSB7TVhDX1NQSV9DUygxKSwgSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9LRVlfQ09MNyl9OwogCi1zdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgcGNtMDM3X3NwaTFfbWFzdGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBwY20wMzdfc3BpMV9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuY2hpcHNlbGVjdCA9IHBjbTAzN19zcGkxX2NzLAogCS5udW1fY2hpcHNlbGVjdCA9IEFSUkFZX1NJWkUocGNtMDM3X3NwaTFfY3MpLAogfTsKQEAgLTE4NCw3ICsxODEsNyBAQAogCS8qIFNQSSAqLwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHBjbTAzN19zcGlfZGV2LCBBUlJBWV9TSVpFKHBjbTAzN19zcGlfZGV2KSk7CiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0lNWCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX0lNWF9NT0RVTEUpCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NwaV9kZXZpY2UwLCAmcGNtMDM3X3NwaTFfbWFzdGVyKTsKKwlpbXgzNV9hZGRfc3BpX2lteDAoJnBjbTAzN19zcGkxX3BkYXRhKTsKICNlbmRpZgogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwY20wMzdfZ3Bpb19rZXlzX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLXBjbTA0My5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1wY20wNDMuYwppbmRleCA3OGQ5MTg1Li40N2Y1MzExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLXBjbTA0My5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcGNtMDQzLmMKQEAgLTEwLDEwICsxMCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQwLDE5ICszNiwxNSBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgotI2lmIGRlZmluZWQgQ09ORklHX0kyQ19JTVggfHwgZGVmaW5lZCBDT05GSUdfSTJDX0lNWF9NT0RVTEUKLSNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDM1Lmg+CiAjaW5jbHVkZSA8bWFjaC9pcHUuaD4KICNpbmNsdWRlIDxtYWNoL214M2ZiLmg+Ci0jaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgogI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KICNpbmNsdWRlIDxtYWNoL3VscGkuaD4KICNpbmNsdWRlIDxtYWNoL2F1ZG11eC5oPgogI2luY2x1ZGUgPG1hY2gvc3NpLmg+CiAKKyNpbmNsdWRlICJkZXZpY2VzLWlteDM1LmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBmYl9tb2RlZGJbXSA9IHsKQEAgLTEyMiwxMiArMTE0LDEyIEBACiAJLm51bV9yZXNvdXJjZXMgPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKIH07CiAKICNpZiBkZWZpbmVkIENPTkZJR19JMkNfSU1YIHx8IGRlZmluZWQgQ09ORklHX0kyQ19JTVhfTU9EVUxFCi1zdGF0aWMgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIHBjbTA0M19pMmNfMV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBwY20wNDNfaTJjMF9kYXRhIF9faW5pdGNvbnN0ID0gewogCS5iaXRyYXRlID0gNTAwMDAsCiB9OwogCkBAIC0yMjIsNiArMjE0LDkgQEAKIAlNWDM1X1BBRF9TVFhENF9fQVVETVVYX0FVRDRfVFhELAogCU1YMzVfUEFEX1NSWEQ0X19BVURNVVhfQVVENF9SWEQsCiAJTVgzNV9QQURfU0NLNF9fQVVETVVYX0FVRDRfVFhDLAorCS8qIENBTjIgKi8KKwlNWDM1X1BBRF9UWDVfUlgwX19DQU4yX1RYQ0FOLAorCU1YMzVfUEFEX1RYNF9SWDFfX0NBTjJfUlhDQU4sCiB9OwogCiAjZGVmaW5lIEFDOTdfR1BJT19UWEZTCSgxICogMzIgKyAzMSkKQEAgLTMwNCwxMSArMjk5LDEzIEBACiAJLmZsYWdzID0gSU1YX1NTSV9VU0VfQUM5NywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSBwY20wMzdfbmFuZF9ib2FyZF9pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhCitwY20wMzdfbmFuZF9ib2FyZF9pbmZvIF9faW5pdGNvbnN0ID0gewogCS53aWR0aCA9IDEsCiAJLmh3X2VjYyA9IDEsCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1VMUEkpCiBzdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgb3RnX3BkYXRhID0gewogCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VUTUksCiAJLmZsYWdzCT0gTVhDX0VIQ0lfSU5URVJGQUNFX0RJRkZfVU5JLApAQCAtMzE5LDYgKzMxNiw3IEBACiAJLmZsYWdzCT0gTVhDX0VIQ0lfSU5URVJGQUNFX1NJTkdMRV9VTkkgfCBNWENfRUhDSV9JTlRFUk5BTF9QSFkgfAogCQkgIE1YQ19FSENJX0lQUFVFX0RPV04sCiB9OworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSBvdGdfZGV2aWNlX3BkYXRhID0gewogCS5vcGVyYXRpbmdfbW9kZSA9IEZTTF9VU0IyX0RSX0RFVklDRSwKQEAgLTM2MSwxNyArMzU5LDE3IEBACiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfbmFuZF9kZXZpY2UsICZwY20wMzdfbmFuZF9ib2FyZF9pbmZvKTsKKwlpbXgzNV9hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKKwlpbXgzNV9hZGRfbXhjX25hbmQoJnBjbTAzN19uYW5kX2JvYXJkX2luZm8pOwogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF9zc2lfZGV2aWNlMCwgJnBjbTA0M19zc2lfcGRhdGEpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMSwgJnVhcnRfcGRhdGEpOworCWlteDM1X2FkZF9pbXhfdWFydDEoJnVhcnRfcGRhdGEpOwogCiAjaWYgZGVmaW5lZCBDT05GSUdfSTJDX0lNWCB8fCBkZWZpbmVkIENPTkZJR19JMkNfSU1YX01PRFVMRQogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIHBjbTA0M19pMmNfZGV2aWNlcywKIAkJCUFSUkFZX1NJWkUocGNtMDQzX2kyY19kZXZpY2VzKSk7CiAKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfaTJjX2RldmljZTAsICZwY20wNDNfaTJjXzFfZGF0YSk7CisJaW14MzVfYWRkX2lteF9pMmMwKCZwY20wNDNfaTJjMF9kYXRhKTsKICNlbmRpZgogCiAJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXgzX2lwdSwgJm14M19pcHVfZGF0YSk7CkBAIC0zOTAsNiArMzg4LDcgQEAKIAlpZiAoIW90Z19tb2RlX2hvc3QpCiAJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19vdGdfdWRjX2RldmljZSwgJm90Z19kZXZpY2VfcGRhdGEpOwogCisJaW14MzVfYWRkX2ZsZXhjYW4xKE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNtMDQzX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtcW9uZy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1xb25nLmMKaW5kZXggZTViNWI4My4uZDQ0YWM3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1xb25nLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1xb25nLmMKQEAgLTEwLDEwICsxMCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTM0LDkgKzMwLDkgQEAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC1xb25nLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLWlteDMxLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCiAvKiBGUEdBIGRlZmluZXMgKi8KQEAgLTYyLDcgKzU4LDcgQEAKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gcm91dGluZXMuCiAgKi8KIAotc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKIH07CiAKQEAgLTczLDExICs2OSwxMSBAQAogCU1YMzFfUElOX1JYRDFfX1JYRDEKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBteGNfaW5pdF9pbXhfdWFydCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBteGNfaW5pdF9pbXhfdWFydCh2b2lkKQogewogCW14Y19pb211eF9zZXR1cF9tdWx0aXBsZV9waW5zKHVhcnRfcGlucywgQVJSQVlfU0laRSh1YXJ0X3BpbnMpLAogCQkJInVhcnQtMCIpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKKwlpbXgzMV9hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKIH0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkbmV0X3Jlc291cmNlc1tdID0gewpAQCAtMTE2LDcgKzExMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcW9uZ19mbGFzaF9yZXNvdXJjZSA9IHsKIAkuc3RhcnQgPSBNWDMxX0NTMF9CQVNFX0FERFIsCi0JLmVuZCA9IE1YMzFfQ1MwX0JBU0VfQUREUiArIFFPTkdfTk9SX1NJWkUgLSAxLAorCS5lbmQgPSBNWDMxX0NTMF9CQVNFX0FERFIgKyBTWl8xMjhNIC0gMSwKIAkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21tLmMgYi9hcmNoL2FybS9tYWNoLW14My9tbS5jCmluZGV4IDY4NThhNGYuLjIwZTQ4YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbW0uYwpAQCAtMTQsMTAgKzE0LDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtOTcsOSArOTMsMTIgQEAKIH0KICNlbmRpZgogCitpbnQgaW14M3hfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CisKIHZvaWQgX19pbml0IG14MzFfaW5pdF9pcnEodm9pZCkKIHsKIAlteGNfaW5pdF9pcnEoSU9fQUREUkVTUyhBVklDX0JBU0VfQUREUikpOworCWlteDN4X3JlZ2lzdGVyX2dwaW9zKCk7CiB9CiAKIHZvaWQgX19pbml0IG14MzVfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFsaWxseS1kYi5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMWxpbGx5LWRiLmMKaW5kZXggN2FlYmQ3NC4uODI3ZmQzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvbXgzMWxpbGx5LWRiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMWxpbGx5LWRiLmMKQEAgLTE4LDEwICsxOCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNiwxMyArMzIsMTMgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQtbXgzMWxpbGx5Lmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL214M2ZiLmg+CiAjaW5jbHVkZSA8bWFjaC9pcHUuaD4KIAorI2luY2x1ZGUgImRldmljZXMtaW14MzEuaCIKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKIC8qCkBAIC05Niw3ICs5Miw3IEBACiB9OwogCiAvKiBVQVJUICovCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCkBAIC0yMTcsOSArMjEzLDkgQEAKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhsaWxseV9kYl9ib2FyZF9waW5zLAogCQkJCQlBUlJBWV9TSVpFKGxpbGx5X2RiX2JvYXJkX3BpbnMpLAogCQkJCQkiZGV2ZWxvcG1lbnQgYm9hcmQgcGlucyIpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UxLCAmdWFydF9wZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMiwgJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDEoJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDIoJnVhcnRfcGRhdGEpOwogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y3NkaGNfZGV2aWNlMCwgJm1tY19wZGF0YSk7CiAJbXgzMWxpbGx5X2luaXRfZmIoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFsaXRlLWRiLmMgYi9hcmNoL2FybS9tYWNoLW14My9teDMxbGl0ZS1kYi5jCmluZGV4IDVmMDViZmIuLjdiMGU3NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFsaXRlLWRiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMWxpdGUtZGIuYwpAQCAtMTgsMTAgKzE4LDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM3LDEyICszMywxMSBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1teDMxbGl0ZS5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9zcGkuaD4KIAorI2luY2x1ZGUgImRldmljZXMtaW14MzEuaCIKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKIC8qCkBAIC03Niw3ICs3MSw3IEBACiB9OwogCiAvKiBVQVJUICovCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCkBAIC0xNjEsNyArMTU2LDcgQEAKIAlNWENfU1BJX0NTKDIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkwX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciBzcGkwX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5jaGlwc2VsZWN0CT0gc3BpX2ludGVybmFsX2NoaXBzZWxlY3QsCiAJLm51bV9jaGlwc2VsZWN0CT0gQVJSQVlfU0laRShzcGlfaW50ZXJuYWxfY2hpcHNlbGVjdCksCiB9OwpAQCAtMjAxLDkgKzE5Niw5IEBACiAJbXhjX2lvbXV4X3NldHVwX211bHRpcGxlX3BpbnMobGl0ZWtpdF9kYl9ib2FyZF9waW5zLAogCQkJCQlBUlJBWV9TSVpFKGxpdGVraXRfZGJfYm9hcmRfcGlucyksCiAJCQkJCSJkZXZlbG9wbWVudCBib2FyZCBwaW5zIik7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOworCWlteDMxX2FkZF9pbXhfdWFydDAoJnVhcnRfcGRhdGEpOwogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y3NkaGNfZGV2aWNlMCwgJm1tY19wZGF0YSk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NwaV9kZXZpY2UwLCAmc3BpMF9wZGF0YSk7CisJaW14MzFfYWRkX3NwaV9pbXgwKCZzcGkwX3BkYXRhKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmxpdGVraXRfbGVkX2RldmljZSk7CiAJbXhjX3JlZ2lzdGVyX2RldmljZSgmaW14X3dkdF9kZXZpY2UwLCBOVUxMKTsKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXhfcnRjX2RldmljZTAsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvbXgzMW1vYm9hcmQtZGV2Ym9hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXgzL214MzFtb2JvYXJkLWRldmJvYXJkLmMKaW5kZXggNTgyMjk5Yy4uZmMzOTVhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvbXgzMW1vYm9hcmQtZGV2Ym9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9teDMxbW9ib2FyZC1kZXZib2FyZC5jCkBAIC0xMCwxMCArMTAsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KQEAgLTI3LDEzICsyMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KIAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgogI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgogCisjaW5jbHVkZSAiZGV2aWNlcy1pbXgzMS5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZXZib2FyZF9waW5zW10gPSB7CkBAIC01Niw3ICs1Miw3IEBACiAJTVgzMV9QSU5fUklfRENFMV9fR1BJTzJfMTAsIE1YMzFfUElOX0RDRF9EQ0UxX19HUElPMl8xMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCkBAIC0yMzAsNyArMjI2LDcgQEAKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhkZXZib2FyZF9waW5zLCBBUlJBWV9TSVpFKGRldmJvYXJkX3BpbnMpLAogCQkiZGV2Ym9hcmQiKTsKIAotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhKTsKKwlpbXgzMV9hZGRfaW14X3VhcnQxKCZ1YXJ0X3BkYXRhKTsKIAogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y3NkaGNfZGV2aWNlMSwgJnNkaGMyX3BkYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvbXgzMW1vYm9hcmQtbWFyeGJvdC5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMW1vYm9hcmQtbWFyeGJvdC5jCmluZGV4IDQ5MzBmOGMuLjA1NTFlYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFtb2JvYXJkLW1hcnhib3QuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9teDMxbW9ib2FyZC1tYXJ4Ym90LmMKQEAgLTEwLDEwICsxMCw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFtb2JvYXJkLXNtYXJ0Ym90LmMgYi9hcmNoL2FybS9tYWNoLW14My9teDMxbW9ib2FyZC1zbWFydGJvdC5jCmluZGV4IDI5M2VlYTYuLjQwYzNlNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFtb2JvYXJkLXNtYXJ0Ym90LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMW1vYm9hcmQtc21hcnRib3QuYwpAQCAtMTAsMTAgKzEwLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMzAsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1teDMxbW9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KQEAgLTM4LDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KIAorI2luY2x1ZGUgImRldmljZXMtaW14MzEuaCIKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc21hcnRib3RfcGluc1tdID0gewpAQCAtNTksNyArNTUsNyBAQAogCU1YMzFfUElOX1JJX0RDRTFfX0dQSU8yXzEwLCBNWDMxX1BJTl9EQ0RfRENFMV9fR1BJTzJfMTEsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAogfTsKIApAQCAtMTgzLDggKzE3OSw3IEBACiAJbXhjX2lvbXV4X3NldHVwX211bHRpcGxlX3BpbnMoc21hcnRib3RfcGlucywgQVJSQVlfU0laRShzbWFydGJvdF9waW5zKSwKIAkJInNtYXJ0Ym90Iik7CiAKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UxLCAmdWFydF9wZGF0YSk7Ci0KKwlpbXgzMV9hZGRfaW14X3VhcnQxKCZ1YXJ0X3BkYXRhKTsKIAogCXN3aXRjaCAoYm9hcmQpIHsKIAljYXNlIE1YMzFTTUFSVEJPVDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW14NS9LY29uZmlnCmluZGV4IDE1NzZkNTEuLjA4NDhkYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvS2NvbmZpZwpAQCAtMTUsNCArMTUsMzEgQEAKIAkgIHUtYm9vdC4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMKIAkgIHBlcmlwaGVyYWxzLgogCitjb25maWcgTUFDSF9NWDUxXzNEUworCWJvb2wgIlN1cHBvcnQgTVg1MVBESyAoM0RTKSIKKwlzZWxlY3QgTVhDX0RFQlVHX0JPQVJECisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDUxUERLICgzRFMpIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCisJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCisKK2NvbmZpZyBNQUNIX0VVS1JFQV9DUFVJTVg1MQorCWJvb2wgIlN1cHBvcnQgRXVrcmVhIENQVUlNWDUxIG1vZHVsZSIKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIEV1a3JlYSBDUFVJTVg1MSBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcworCSAgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIGl0cyBwZXJpcGhlcmFscy4KKworY2hvaWNlCisJcHJvbXB0ICJCYXNlYm9hcmQiCisJZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9DUFVJTVg1MQorCWRlZmF1bHQgTUFDSF9FVUtSRUFfTUJJTVg1MV9CQVNFQk9BUkQKKworY29uZmlnIE1BQ0hfRVVLUkVBX01CSU1YNTFfQkFTRUJPQVJECisJcHJvbXB0ICJFdWtyZWEgTUJJTVg1MSBkZXZlbG9wbWVudCBib2FyZCIKKwlib29sCisJaGVscAorCSAgVGhpcyBhZGRzIGJvYXJkIHNwZWNpZmljIGRldmljZXMgdGhhdCBjYW4gYmUgZm91bmQgb24gRXVrcmVhJ3MKKwkgIE1CSU1YNTEgZXZhbHVhdGlvbiBib2FyZC4KKworZW5kY2hvaWNlCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlCmluZGV4IGJmMjNmODYuLjg2YzY2ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlCkBAIC02LDQgKzYsNiBAQAogb2JqLXkgICA6PSBjcHUubyBtbS5vIGNsb2NrLW14NTEubyBkZXZpY2VzLm8KIAogb2JqLSQoQ09ORklHX01BQ0hfTVg1MV9CQUJCQUdFKSArPSBib2FyZC1teDUxX2JhYmJhZ2UubwotCitvYmotJChDT05GSUdfTUFDSF9NWDUxXzNEUykgKz0gYm9hcmQtbXg1MV8zZHMubworb2JqLSQoQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDUxKSArPSBib2FyZC1jcHVpbXg1MS5vCitvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVg1MV9CQVNFQk9BUkQpICs9IGV1a3JlYV9tYmlteDUxLWJhc2Vib2FyZC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjM2MDdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTEuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRXJpYyBCw6luYXJkIDxlcmljQGV1a3JlYS5jb20+CisgKgorICogYmFzZWQgb24gYm9hcmQtbXg1MV9iYWJiYWdlLmMgd2hpY2ggaXMKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQGNhbm9uaWNhbC5jb20+CisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8bWFjaC9ldWtyZWEtYmFzZWJvYXJkcy5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14NTEuaD4KKyNpbmNsdWRlIDxtYWNoL2kyYy5oPgorI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKKyNkZWZpbmUgQ1BVSU1YNTFfVVNCSDFfU1RQCSgwKjMyICsgMjcpCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUQV9HUElPCSgyKjMyICsgMjgpCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUQl9HUElPCSgyKjMyICsgMjUpCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUQ19HUElPCSgyKjMyICsgMjYpCisjZGVmaW5lIENQVUlNWDUxX1FVQVJURF9HUElPCSgyKjMyICsgMjcpCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUQV9JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlRBX0dQSU8pCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUQl9JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlRCX0dQSU8pCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUQ19JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlRDX0dQSU8pCisjZGVmaW5lIENQVUlNWDUxX1FVQVJURF9JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlREX0dQSU8pCisjZGVmaW5lIENQVUlNWDUxX1FVQVJUX1hUQUwJMTQ3NDU2MDAKKyNkZWZpbmUgQ1BVSU1YNTFfUVVBUlRfUkVHU0hJRlQJMTcKKworLyogVVNCX0NUUkxfMSAqLworI2RlZmluZSBNWDUxX1VTQl9DVFJMXzFfT0ZGU0VUCQkweDEwCisjZGVmaW5lIE1YNTFfVVNCX0NUUkxfVUgxX0VYVF9DTEtfRU4JKDEgPDwgMjUpCisKKyNkZWZpbmUJTVg1MV9VU0JfUExMRElWXzEyX01IWgkJMHgwMAorI2RlZmluZQlNWDUxX1VTQl9QTExfRElWXzE5XzJfTUhaCTB4MDEKKyNkZWZpbmUJTVg1MV9VU0JfUExMX0RJVl8yNF9NSFoJCTB4MDIKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDUxX0NTMV9CQVNFX0FERFIgKyAweDQwMDAwMCksCisJCS5pcnEgPSBDUFVJTVg1MV9RVUFSVEFfSVJRLAorCQkuaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCwKKwkJLnVhcnRjbGsgPSBDUFVJTVg1MV9RVUFSVF9YVEFMLAorCQkucmVnc2hpZnQgPSBDUFVJTVg1MV9RVUFSVF9SRUdTSElGVCwKKwkJLmlvdHlwZSA9IFVQSU9fTUVNLAorCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKKwl9LCB7CisJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YNTFfQ1MxX0JBU0VfQUREUiArIDB4ODAwMDAwKSwKKwkJLmlycSA9IENQVUlNWDUxX1FVQVJUQl9JUlEsCisJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAorCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCisJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAorCX0sIHsKKwkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVg1MV9DUzFfQkFTRV9BRERSICsgMHgxMDAwMDAwKSwKKwkJLmlycSA9IENQVUlNWDUxX1FVQVJUQ19JUlEsCisJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAorCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCisJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAorCX0sIHsKKwkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVg1MV9DUzFfQkFTRV9BRERSICsgMHgyMDAwMDAwKSwKKwkJLmlycSA9IENQVUlNWDUxX1FVQVJURF9JUlEsCisJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAorCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCisJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAorCX0sIHsKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0geworCS5uYW1lID0gInNlcmlhbDgyNTAiLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm14Y19mZWNfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9NT0RVTEUpCisJJnNlcmlhbF9kZXZpY2UsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFkX2Rlc2MgZXVrcmVhX2NwdWlteDUxX3BhZHNbXSA9IHsKKwkvKiBVQVJUMSAqLworCU1YNTFfUEFEX1VBUlQxX1JYRF9fVUFSVDFfUlhELAorCU1YNTFfUEFEX1VBUlQxX1RYRF9fVUFSVDFfVFhELAorCU1YNTFfUEFEX1VBUlQxX1JUU19fVUFSVDFfUlRTLAorCU1YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTLAorCisJLyogSTJDMiAqLworCU1YNTFfUEFEX0dQSU9fMV8yX19JMkMyX1NDTCwKKwlNWDUxX1BBRF9HUElPXzFfM19fSTJDMl9TREEsCisJTVg1MV9QQURfTkFOREZfRDEwX19HUElPXzNfMzAsCisKKwkvKiBRVUFSVCBJUlEgKi8KKwlNWDUxX1BBRF9OQU5ERl9EMTVfX0dQSU9fM18yNSwKKwlNWDUxX1BBRF9OQU5ERl9EMTRfX0dQSU9fM18yNiwKKwlNWDUxX1BBRF9OQU5ERl9EMTNfX0dQSU9fM18yNywKKwlNWDUxX1BBRF9OQU5ERl9EMTJfX0dQSU9fM18yOCwKKworCS8qIFVTQiBIT1NUMSAqLworCU1YNTFfUEFEX1VTQkgxX0NMS19fVVNCSDFfQ0xLLAorCU1YNTFfUEFEX1VTQkgxX0RJUl9fVVNCSDFfRElSLAorCU1YNTFfUEFEX1VTQkgxX05YVF9fVVNCSDFfTlhULAorCU1YNTFfUEFEX1VTQkgxX0RBVEEwX19VU0JIMV9EQVRBMCwKKwlNWDUxX1BBRF9VU0JIMV9EQVRBMV9fVVNCSDFfREFUQTEsCisJTVg1MV9QQURfVVNCSDFfREFUQTJfX1VTQkgxX0RBVEEyLAorCU1YNTFfUEFEX1VTQkgxX0RBVEEzX19VU0JIMV9EQVRBMywKKwlNWDUxX1BBRF9VU0JIMV9EQVRBNF9fVVNCSDFfREFUQTQsCisJTVg1MV9QQURfVVNCSDFfREFUQTVfX1VTQkgxX0RBVEE1LAorCU1YNTFfUEFEX1VTQkgxX0RBVEE2X19VU0JIMV9EQVRBNiwKKwlNWDUxX1BBRF9VU0JIMV9EQVRBN19fVVNCSDFfREFUQTcsCisJTVg1MV9QQURfVVNCSDFfU1RQX19VU0JIMV9TVFAsCit9OworCitzdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhID0geworCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCit9OworCitzdGF0aWMgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIGV1a3JlYV9jcHVpbXg1MV9pMmNfZGF0YSA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZXVrcmVhX2NwdWlteDUxX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicGNmODU2MyIsIDB4NTEpLAorCX0sCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGJvYXJkIHNwZWNpZmljIGFzIHRoZSBiaXQgbWFzayBmb3IgdGhlIHBsbGRpdiB3aWxsIGFsc28KK2JlIGRpZmZlcmVudCBmb3Igb3RoZXIgRnJlZXNjYWxlIFNvQ3MsIHRodXMgYSBjb21tb24gYml0bWFzayBpcyBub3QKK3Bvc3NpYmxlIGFuZCBjYW5ub3QgZ2V0IHBsYWNlIGluIC9wbGF0LW14Yy9laGNpLmMuKi8KK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9vdGdfcG9ydChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXUzMiB2OworCXZvaWQgX19pb21lbSAqdXNiX2Jhc2U7CisJdm9pZCBfX2lvbWVtICp1c2JvdGhlcl9iYXNlOworCisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYm90aGVyX2Jhc2UgPSB1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVDsKKworCS8qIFNldCB0aGUgUEhZIGNsb2NrIHRvIDE5LjJNSHogKi8KKwl2ID0gX19yYXdfcmVhZGwodXNib3RoZXJfYmFzZSArIE1YQ19VU0JfUEhZX0NUUl9GVU5DMl9PRkZTRVQpOworCXYgJj0gfk1YNV9VU0JfVVRNSV9QSFlDVFJMMV9QTExESVZfTUFTSzsKKwl2IHw9IE1YNTFfVVNCX1BMTF9ESVZfMTlfMl9NSFo7CisJX19yYXdfd3JpdGVsKHYsIHVzYm90aGVyX2Jhc2UgKyBNWENfVVNCX1BIWV9DVFJfRlVOQzJfT0ZGU0VUKTsKKwlpb3VubWFwKHVzYl9iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0aWFsaXplX3VzYmgxX3BvcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgdjsKKwl2b2lkIF9faW9tZW0gKnVzYl9iYXNlOworCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKKworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX09UR19CQVNFX0FERFIsIFNaXzRLKTsKKwl1c2JvdGhlcl9iYXNlID0gdXNiX2Jhc2UgKyBNWDVfVVNCT1RIRVJfUkVHU19PRkZTRVQ7CisKKwkvKiBUaGUgY2xvY2sgZm9yIHRoZSBVU0JIMSBVTFBJIHBvcnQgd2lsbCBjb21lIGV4dGVybmFsbHkgZnJvbSB0aGUgUEhZLiAqLworCXYgPSBfX3Jhd19yZWFkbCh1c2JvdGhlcl9iYXNlICsgTVg1MV9VU0JfQ1RSTF8xX09GRlNFVCk7CisJX19yYXdfd3JpdGVsKHYgfCBNWDUxX1VTQl9DVFJMX1VIMV9FWFRfQ0xLX0VOLCB1c2JvdGhlcl9iYXNlICsgTVg1MV9VU0JfQ1RSTF8xX09GRlNFVCk7CisJaW91bm1hcCh1c2JfYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyA9IHsKKwkuaW5pdAkJPSBpbml0aWFsaXplX290Z19wb3J0LAorCS5wb3J0c2MJPSBNWENfRUhDSV9VVE1JXzE2QklULAorCS5mbGFncwk9IE1YQ19FSENJX0lOVEVSTkFMX1BIWSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSB1c2JfcGRhdGEgPSB7CisJLm9wZXJhdGluZ19tb2RlCT0gRlNMX1VTQjJfRFJfREVWSUNFLAorCS5waHlfbW9kZQk9IEZTTF9VU0IyX1BIWV9VVE1JX1dJREUsCit9OworCitzdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfY29uZmlnID0geworCS5pbml0CQk9IGluaXRpYWxpemVfdXNiaDFfcG9ydCwKKwkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAorCS5mbGFncwk9IChNWENfRUhDSV9QT1dFUl9QSU5TX0VOQUJMRUQgfCBNWENfRUhDSV9JVENfTk9fVEhSRVNIT0xEKSwKK307CisKK3N0YXRpYyBpbnQgb3RnX21vZGVfaG9zdDsKKworc3RhdGljIGludCBfX2luaXQgZXVrcmVhX2NwdWlteDUxX290Z19tb2RlKGNoYXIgKm9wdGlvbnMpCit7CisJaWYgKCFzdHJjbXAob3B0aW9ucywgImhvc3QiKSkKKwkJb3RnX21vZGVfaG9zdCA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChvcHRpb25zLCAiZGV2aWNlIikpCisJCW90Z19tb2RlX2hvc3QgPSAwOworCWVsc2UKKwkJcHJfaW5mbygib3RnX21vZGUgbmVpdGhlciBcImhvc3RcIiBub3IgXCJkZXZpY2VcIi4gIgorCQkJIkRlZmF1bHRpbmcgdG8gZGV2aWNlXG4iKTsKKwlyZXR1cm4gMDsKK30KK19fc2V0dXAoIm90Z19tb2RlPSIsIGV1a3JlYV9jcHVpbXg1MV9vdGdfbW9kZSk7CisKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGV1a3JlYV9jcHVpbXg1MV9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMoZXVrcmVhX2NwdWlteDUxX3BhZHMsCisJCQkJCUFSUkFZX1NJWkUoZXVrcmVhX2NwdWlteDUxX3BhZHMpKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKKwlncGlvX3JlcXVlc3QoQ1BVSU1YNTFfUVVBUlRBX0dQSU8sICJxdWFydGFfaXJxIik7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoQ1BVSU1YNTFfUVVBUlRBX0dQSU8pOworCWdwaW9fZnJlZShDUFVJTVg1MV9RVUFSVEFfR1BJTyk7CisJZ3Bpb19yZXF1ZXN0KENQVUlNWDUxX1FVQVJUQl9HUElPLCAicXVhcnRiX2lycSIpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KENQVUlNWDUxX1FVQVJUQl9HUElPKTsKKwlncGlvX2ZyZWUoQ1BVSU1YNTFfUVVBUlRCX0dQSU8pOworCWdwaW9fcmVxdWVzdChDUFVJTVg1MV9RVUFSVENfR1BJTywgInF1YXJ0Y19pcnEiKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChDUFVJTVg1MV9RVUFSVENfR1BJTyk7CisJZ3Bpb19mcmVlKENQVUlNWDUxX1FVQVJUQ19HUElPKTsKKwlncGlvX3JlcXVlc3QoQ1BVSU1YNTFfUVVBUlREX0dQSU8sICJxdWFydGRfaXJxIik7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoQ1BVSU1YNTFfUVVBUlREX0dQSU8pOworCWdwaW9fZnJlZShDUFVJTVg1MV9RVUFSVERfR1BJTyk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMSwgJmV1a3JlYV9jcHVpbXg1MV9pMmNfZGF0YSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgZXVrcmVhX2NwdWlteDUxX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoZXVrcmVhX2NwdWlteDUxX2kyY19kZXZpY2VzKSk7CisKKwlpZiAob3RnX21vZGVfaG9zdCkKKwkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX2hvc3RfZGV2aWNlLCAmZHJfdXRtaV9jb25maWcpOworCWVsc2UgeworCQlpbml0aWFsaXplX290Z19wb3J0KE5VTEwpOworCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiZHJfdWRjX2RldmljZSwgJnVzYl9wZGF0YSk7CisJfQorCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMV9kZXZpY2UsICZ1c2JoMV9jb25maWcpOworCisjaWZkZWYgQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YNTFfQkFTRUJPQVJECisJZXVrcmVhX21iaW14NTFfYmFzZWJvYXJkX2luaXQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDUxX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDUxX2Nsb2Nrc19pbml0KDMyNzY4LCAyNDAwMDAwMCwgMjI1NzkyMDAsIDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBteGNfdGltZXIgPSB7CisJLmluaXQJPSBldWtyZWFfY3B1aW14NTFfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoRVVLUkVBX0NQVUlNWDUxLCAiRXVrcmVhIENQVUlNWDUxIE1vZHVsZSIpCisJLyogTWFpbnRhaW5lcjogRXJpYyBCw6luYXJkIDxlcmljQGV1a3JlYS5jb20+ICovCisJLnBoeXNfaW8gPSBNWDUxX0FJUFMxX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QgPSAoKE1YNTFfQUlQUzFfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgPSBQSFlTX09GRlNFVCArIDB4MTAwLAorCS5tYXBfaW8gPSBteDUxX21hcF9pbywKKwkuaW5pdF9pcnEgPSBteDUxX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgPSBldWtyZWFfY3B1aW14NTFfaW5pdCwKKwkudGltZXIgPSAmbXhjX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfM2RzLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxXzNkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWMyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxXzNkcy5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEphc29uIFdhbmcgPGphc29uNzcud2FuZ0BnbWFpbC5jb20+CisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDUxLmg+CisjaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgorI2luY2x1ZGUgPG1hY2gvM2RzX2RlYnVnYm9hcmQuaD4KKworI2luY2x1ZGUgImRldmljZXMuaCIKKworI2RlZmluZSBFWFBJT19QQVJFTlRfSU5UCShNWENfSU5URVJOQUxfSVJRUyArIEdQSU9fUE9SVEEgKyA2KQorCitzdGF0aWMgc3RydWN0IHBhZF9kZXNjIG14NTFfM2RzX3BhZHNbXSA9IHsKKwkvKiBVQVJUMSAqLworCU1YNTFfUEFEX1VBUlQxX1JYRF9fVUFSVDFfUlhELAorCU1YNTFfUEFEX1VBUlQxX1RYRF9fVUFSVDFfVFhELAorCU1YNTFfUEFEX1VBUlQxX1JUU19fVUFSVDFfUlRTLAorCU1YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTLAorCisJLyogVUFSVDIgKi8KKwlNWDUxX1BBRF9VQVJUMl9SWERfX1VBUlQyX1JYRCwKKwlNWDUxX1BBRF9VQVJUMl9UWERfX1VBUlQyX1RYRCwKKwlNWDUxX1BBRF9FSU1fRDI1X19VQVJUMl9DVFMsCisJTVg1MV9QQURfRUlNX0QyNl9fVUFSVDJfUlRTLAorCisJLyogVUFSVDMgKi8KKwlNWDUxX1BBRF9VQVJUM19SWERfX1VBUlQzX1JYRCwKKwlNWDUxX1BBRF9VQVJUM19UWERfX1VBUlQzX1RYRCwKKwlNWDUxX1BBRF9FSU1fRDI0X19VQVJUM19DVFMsCisJTVg1MV9QQURfRUlNX0QyN19fVUFSVDNfUlRTLAorCisJLyogQ1BMRCBQQVJFTlQgSVJRIFBJTiAqLworCU1YNTFfUEFEX0dQSU9fMV82X19HUElPXzFfNiwKKworCS8qIEtQUCAqLworCU1YNTFfUEFEX0tFWV9ST1cwX19LRVlfUk9XMCwKKwlNWDUxX1BBRF9LRVlfUk9XMV9fS0VZX1JPVzEsCisJTVg1MV9QQURfS0VZX1JPVzJfX0tFWV9ST1cyLAorCU1YNTFfUEFEX0tFWV9ST1czX19LRVlfUk9XMywKKwlNWDUxX1BBRF9LRVlfQ09MMF9fS0VZX0NPTDAsCisJTVg1MV9QQURfS0VZX0NPTDFfX0tFWV9DT0wxLAorCU1YNTFfUEFEX0tFWV9DT0wyX19LRVlfQ09MMiwKKwlNWDUxX1BBRF9LRVlfQ09MM19fS0VZX0NPTDMsCisJTVg1MV9QQURfS0VZX0NPTDRfX0tFWV9DT0w0LAorCU1YNTFfUEFEX0tFWV9DT0w1X19LRVlfQ09MNSwKK307CisKKy8qIFNlcmlhbCBwb3J0cyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9JTVgpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9JTVhfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2lteF91YXJ0KHZvaWQpCit7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9wZGF0YSk7Cit9CisjZWxzZSAvKiAhU0VSSUFMX0lNWCAqLworc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2lteF91YXJ0KHZvaWQpCit7Cit9CisjZW5kaWYgLyogU0VSSUFMX0lNWCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9JTVhfTU9EVUxFKQorc3RhdGljIGludCBteDUxXzNkc19ib2FyZF9rZXltYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZXzEpLAorCUtFWSgwLCAxLCBLRVlfMiksCisJS0VZKDAsIDIsIEtFWV8zKSwKKwlLRVkoMCwgMywgS0VZX0YxKSwKKwlLRVkoMCwgNCwgS0VZX1VQKSwKKwlLRVkoMCwgNSwgS0VZX0YyKSwKKworCUtFWSgxLCAwLCBLRVlfNCksCisJS0VZKDEsIDEsIEtFWV81KSwKKwlLRVkoMSwgMiwgS0VZXzYpLAorCUtFWSgxLCAzLCBLRVlfTEVGVCksCisJS0VZKDEsIDQsIEtFWV9TRUxFQ1QpLAorCUtFWSgxLCA1LCBLRVlfUklHSFQpLAorCisJS0VZKDIsIDAsIEtFWV83KSwKKwlLRVkoMiwgMSwgS0VZXzgpLAorCUtFWSgyLCAyLCBLRVlfOSksCisJS0VZKDIsIDMsIEtFWV9GMyksCisJS0VZKDIsIDQsIEtFWV9ET1dOKSwKKwlLRVkoMiwgNSwgS0VZX0Y0KSwKKworCUtFWSgzLCAwLCBLRVlfMCksCisJS0VZKDMsIDEsIEtFWV9PSyksCisJS0VZKDMsIDIsIEtFWV9FU0MpLAorCUtFWSgzLCAzLCBLRVlfRU5URVIpLAorCUtFWSgzLCA0LCBLRVlfTUVOVSksCisJS0VZKDMsIDUsIEtFWV9CQUNLKQorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgbXg1MV8zZHNfbWFwX2RhdGEgPSB7CisJLmtleW1hcAkJPSBteDUxXzNkc19ib2FyZF9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShteDUxXzNkc19ib2FyZF9rZXltYXApLAorfTsKKworc3RhdGljIHZvaWQgbXhjX2luaXRfa2V5cGFkKHZvaWQpCit7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX2tleXBhZF9kZXZpY2UsICZteDUxXzNkc19tYXBfZGF0YSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2tleXBhZCh2b2lkKQoreworfQorI2VuZGlmCisKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG14Y19ib2FyZF9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1MV8zZHNfcGFkcywKKwkJCQkJQVJSQVlfU0laRShteDUxXzNkc19wYWRzKSk7CisJbXhjX2luaXRfaW14X3VhcnQoKTsKKworCWlmIChteGNfZXhwaW9faW5pdChNWDUxX0NTNV9CQVNFX0FERFIsIEVYUElPX1BBUkVOVF9JTlQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbml0IG9mIHRoZSBkZWJ1Z2JvYXJkIGZhaWxlZCwgYWxsICIKKwkJCQkgICAgImRldmljZXMgb24gdGhlIGJvYXJkIGFyZSB1bnVzYWJsZS5cbiIpOworCisJbXhjX2luaXRfa2V5cGFkKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteDUxXzNkc190aW1lcl9pbml0KHZvaWQpCit7CisJbXg1MV9jbG9ja3NfaW5pdCgzMjc2OCwgMjQwMDAwMDAsIDIyNTc5MjAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgbXhjX3RpbWVyID0geworCS5pbml0CT0gbXg1MV8zZHNfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoTVg1MV8zRFMsICJGcmVlc2NhbGUgTVg1MSAzLVN0YWNrIEJvYXJkIikKKwkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLworCS5waHlzX2lvID0gTVg1MV9BSVBTMV9CQVNFX0FERFIsCisJLmlvX3BnX29mZnN0ID0gKChNWDUxX0FJUFMxX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zID0gUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvID0gbXg1MV9tYXBfaW8sCisJLmluaXRfaXJxID0gbXg1MV9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lID0gbXhjX2JvYXJkX2luaXQsCisJLnRpbWVyID0gJm14Y190aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCmluZGV4IGVkODg1ZjkuLjZlMzg0ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTIxLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXg1MS5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNjQsNiArNjYsMTggQEAKIAlNWDUxX1BBRF9FSU1fRDI3X19VQVJUM19SVFMsCiAJTVg1MV9QQURfRUlNX0QyNF9fVUFSVDNfQ1RTLAogCisJLyogSTJDMSAqLworCU1YNTFfUEFEX0VJTV9EMTZfX0kyQzFfU0RBLAorCU1YNTFfUEFEX0VJTV9EMTlfX0kyQzFfU0NMLAorCisJLyogSTJDMiAqLworCU1YNTFfUEFEX0tFWV9DT0w0X19JMkMyX1NDTCwKKwlNWDUxX1BBRF9LRVlfQ09MNV9fSTJDMl9TREEsCisKKwkvKiBIU0kyQyAqLworCU1YNTFfUEFEX0kyQzFfQ0xLX19IU0kyQ19DTEssCisJTVg1MV9QQURfSTJDMV9EQVRfX0hTSTJDX0RBVCwKKwogCS8qIFVTQiBIT1NUMSAqLwogCU1YNTFfUEFEX1VTQkgxX0NMS19fVVNCSDFfQ0xLLAogCU1YNTFfUEFEX1VTQkgxX0RJUl9fVVNCSDFfRElSLApAQCAtNzgsNyArOTIsNyBAQAogCU1YNTFfUEFEX1VTQkgxX0RBVEE3X19VU0JIMV9EQVRBNywKIAogCS8qIFVTQiBIVUIgcmVzZXQgbGluZSovCi0JTVg1MV9QQURfR1BJT18xXzdfX0dQSU8xXzcsCisJTVg1MV9QQURfR1BJT18xXzdfX0dQSU9fMV83LAogfTsKIAogLyogU2VyaWFsIHBvcnRzICovCkBAIC05OSw2ICsxMTMsMTQgQEAKIH0KICNlbmRpZiAvKiBTRVJJQUxfSU1YICovCiAKK3N0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgYmFiYmFnZV9pMmNfZGF0YSA9IHsKKwkuYml0cmF0ZSA9IDEwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgYmFiYmFnZV9oc2kyY19kYXRhID0geworCS5iaXRyYXRlID0gNDAwMDAwLAorfTsKKwogc3RhdGljIGludCBncGlvX3VzYmgxX2FjdGl2ZSh2b2lkKQogewogCXN0cnVjdCBwYWRfZGVzYyB1c2JoMXN0cF9ncGlvID0gTVg1MV9QQURfVVNCSDFfU1RQX19HUElPXzFfMjc7CkBAIC0yMzAsNiArMjUyLDEwIEBACiAJbXhjX2luaXRfaW14X3VhcnQoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAorCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMCwgJmJhYmJhZ2VfaTJjX2RhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19pMmNfZGV2aWNlMSwgJmJhYmJhZ2VfaTJjX2RhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19oc2kyY19kZXZpY2UsICZiYWJiYWdlX2hzaTJjX2RhdGEpOworCiAJaWYgKG90Z19tb2RlX2hvc3QpCiAJCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2Jkcl9ob3N0X2RldmljZSwgJmRyX3V0bWlfY29uZmlnKTsKIAllbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEuYwppbmRleCBkOWY2MTJkLi42YWY2OWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS5jCkBAIC03NTgsNiArNzU4LDEwIEBACiAJLnBhcmVudCA9ICZja2lsX2NsaywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGtwcF9jbGsgPSB7CisJLmlkID0gMCwKK307CisKICNkZWZpbmUgREVGSU5FX0NMT0NLKG5hbWUsIGksIGVyLCBlcywgZ3IsIHNyLCBwLCBzKQlcCiAJc3RhdGljIHN0cnVjdCBjbGsgbmFtZSA9IHsJCQlcCiAJCS5pZAkJPSBpLAkJCVwKQEAgLTc5OCw2ICs4MDIsMTQgQEAKIERFRklORV9DTE9DSyhncHRfaXBnX2NsaywgMCwgTVhDX0NDTV9DQ0dSMiwgTVhDX0NDTV9DQ0dSeF9DRzEwX09GRlNFVCwKIAlOVUxMLCAgTlVMTCwgJmlwZ19jbGssIE5VTEwpOwogCisvKiBJMkMgKi8KK0RFRklORV9DTE9DSyhpMmMxX2NsaywgMCwgTVhDX0NDTV9DQ0dSMSwgTVhDX0NDTV9DQ0dSeF9DRzlfT0ZGU0VULAorCU5VTEwsIE5VTEwsICZpcGdfY2xrLCBOVUxMKTsKK0RFRklORV9DTE9DSyhpMmMyX2NsaywgMSwgTVhDX0NDTV9DQ0dSMSwgTVhDX0NDTV9DQ0dSeF9DRzEwX09GRlNFVCwKKwlOVUxMLCBOVUxMLCAmaXBnX2NsaywgTlVMTCk7CitERUZJTkVfQ0xPQ0soaHNpMmNfY2xrLCAwLCBNWENfQ0NNX0NDR1IxLCBNWENfQ0NNX0NDR1J4X0NHMTFfT0ZGU0VULAorCU5VTEwsIE5VTEwsICZpcGdfY2xrLCBOVUxMKTsKKwogLyogRkVDICovCiBERUZJTkVfQ0xPQ0soZmVjX2NsaywgMCwgTVhDX0NDTV9DQ0dSMiwgTVhDX0NDTV9DQ0dSeF9DRzEyX09GRlNFVCwKIAlOVUxMLCAgTlVMTCwgJmlwZ19jbGssIE5VTEwpOwpAQCAtODE1LDEyICs4MjcsMTYgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjEiLCBOVUxMLCBpMmMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMiIsIE5VTEwsIGhzaTJjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjAiLCAidXNiIiwgdXNib2gzX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjAiLCAidXNiX2FoYiIsIGFoYl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYiIsIHVzYm9oM19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYl9haGIiLCBhaGJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZnNsLXVzYjItdWRjIiwgInVzYiIsIHVzYm9oM19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJmc2wtdXNiMi11ZGMiLCAidXNiX2FoYiIsIGFoYl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgta2V5cGFkLjAiLCBOVUxMLCBrcHBfY2xrKQogfTsKIAogc3RhdGljIHZvaWQgY2xrX3RyZWVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5jCmluZGV4IDcxMzA0NDkuLjE5MjBmZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmMKQEAgLTkzLDYgKzkzLDY0IEBACiAJLnJlc291cmNlID0gbXhjX2ZlY19yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19pMmMwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gTVg1MV9JMkMxX0JBU0VfQUREUiwKKwkJLmVuZCA9IE1YNTFfSTJDMV9CQVNFX0FERFIgKyBTWl80SyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gTVg1MV9NWENfSU5UX0kyQzEsCisJCS5lbmQgPSBNWDUxX01YQ19JTlRfSTJDMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2kyY19kZXZpY2UwID0geworCS5uYW1lID0gImlteC1pMmMiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19pMmMwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gbXhjX2kyYzBfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfaTJjMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IE1YNTFfSTJDMl9CQVNFX0FERFIsCisJCS5lbmQgPSBNWDUxX0kyQzJfQkFTRV9BRERSICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydCA9IE1YNTFfTVhDX0lOVF9JMkMyLAorCQkuZW5kID0gTVg1MV9NWENfSU5UX0kyQzIsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pMmNfZGV2aWNlMSA9IHsKKwkubmFtZSA9ICJpbXgtaTJjIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfaTJjMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IG14Y19pMmMxX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX2hzaTJjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gTVg1MV9IU0kyQ19ETUFfQkFTRV9BRERSLAorCQkuZW5kID0gTVg1MV9IU0kyQ19ETUFfQkFTRV9BRERSICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IE1YNTFfTVhDX0lOVF9IU19JMkMsCisJCS5lbmQgPSBNWDUxX01YQ19JTlRfSFNfSTJDLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaHNpMmNfZGV2aWNlID0geworCS5uYW1lID0gImlteC1pMmMiLAorCS5pZCA9IDIsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19oc2kyY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IG14Y19oc2kyY19yZXNvdXJjZXMKK307CisKIHN0YXRpYyB1NjQgdXNiX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JvdGdfcmVzb3VyY2VzW10gPSB7CkBAIC0xNjgsMzQgKzIyNiw1NyBAQAogCS5yZXNvdXJjZSA9IG14Y193ZHRfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfa3BwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gTVg1MV9NWENfSU5UX0tQUCwKKwkJLmVuZCA9IE1YNTFfTVhDX0lOVF9LUFAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0gLCB7CisJCS5zdGFydCA9IE1YNTFfS1BQX0JBU0VfQUREUiwKKwkJLmVuZCA9IE1YNTFfS1BQX0JBU0VfQUREUiArIDB4OCAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19rZXlwYWRfZGV2aWNlID0geworCS5uYW1lID0gImlteC1rZXlwYWQiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19rcHBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfa3BwX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCBteGNfZ3Bpb19wb3J0c1tdID0gewogCXsKIAkJLmNoaXAubGFiZWwgPSAiZ3Bpby0wIiwKIAkJLmJhc2UgPSBNWDUxX0lPX0FERFJFU1MoTVg1MV9HUElPMV9CQVNFX0FERFIpLAogCQkuaXJxID0gTVg1MV9NWENfSU5UX0dQSU8xX0xPVywKKwkJLmlycV9oaWdoID0gTVg1MV9NWENfSU5UX0dQSU8xX0hJR0gsCiAJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVAogCX0sCiAJewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTEiLAogCQkuYmFzZSA9IE1YNTFfSU9fQUREUkVTUyhNWDUxX0dQSU8yX0JBU0VfQUREUiksCiAJCS5pcnEgPSBNWDUxX01YQ19JTlRfR1BJTzJfTE9XLAorCQkuaXJxX2hpZ2ggPSBNWDUxX01YQ19JTlRfR1BJTzJfSElHSCwKIAkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgMzIgKiAxCiAJfSwKIAl7CiAJCS5jaGlwLmxhYmVsID0gImdwaW8tMiIsCiAJCS5iYXNlID0gTVg1MV9JT19BRERSRVNTKE1YNTFfR1BJTzNfQkFTRV9BRERSKSwKIAkJLmlycSA9IE1YNTFfTVhDX0lOVF9HUElPM19MT1csCisJCS5pcnFfaGlnaCA9IE1YNTFfTVhDX0lOVF9HUElPM19ISUdILAogCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiAqIDIKIAl9LAogCXsKIAkJLmNoaXAubGFiZWwgPSAiZ3Bpby0zIiwKIAkJLmJhc2UgPSBNWDUxX0lPX0FERFJFU1MoTVg1MV9HUElPNF9CQVNFX0FERFIpLAogCQkuaXJxID0gTVg1MV9NWENfSU5UX0dQSU80X0xPVywKKwkJLmlycV9oaWdoID0gTVg1MV9NWENfSU5UX0dQSU80X0hJR0gsCiAJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDMyICogMwogCX0sCiB9OwogCi1pbnQgX19pbml0IG14Y19yZWdpc3Rlcl9ncGlvcyh2b2lkKQoraW50IF9faW5pdCBpbXg1MV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQogewogCXJldHVybiBteGNfZ3Bpb19pbml0KG14Y19ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKG14Y19ncGlvX3BvcnRzKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmgKaW5kZXggYzg3OWFlNy4uZTUwOWNmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuaApAQCAtNiwzICs2LDcgQEAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMV9kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiZHJfdWRjX2RldmljZTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y193ZHQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaTJjX2RldmljZTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaHNpMmNfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2tleXBhZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ldWtyZWFfbWJpbXg1MS1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteDUxLWJhc2Vib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTkzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14NS9ldWtyZWFfbWJpbXg1MS1iYXNlYm9hcmQuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRXJpYyBCw6luYXJkIDxlcmljQGV1a3JlYS5jb20+CisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHNjMjAwNy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDUxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKKyNkZWZpbmUgTUJJTVg1MV9UU0MyMDA3X0dQSU8JKDIqMzIgKyAzMCkKKyNkZWZpbmUgTUJJTVg1MV9UU0MyMDA3X0lSUQkoTVhDX0lOVEVSTkFMX0lSUVMgKyBNQklNWDUxX1RTQzIwMDdfR1BJTykKKyNkZWZpbmUgTUJJTVg1MV9MRUQwCQkoMiozMiArIDUpCisjZGVmaW5lIE1CSU1YNTFfTEVEMQkJKDIqMzIgKyA2KQorI2RlZmluZSBNQklNWDUxX0xFRDIJCSgyKjMyICsgNykKKyNkZWZpbmUgTUJJTVg1MV9MRUQzCQkoMiozMiArIDgpCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbWJpbXg1MV9sZWRzW10gPSB7CisJeworCQkubmFtZQkJCT0gImxlZDAiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5ncGlvCQkJPSBNQklNWDUxX0xFRDAsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAibGVkMSIsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAibmFuZC1kaXNrIiwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmdwaW8JCQk9IE1CSU1YNTFfTEVEMSwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJsZWQyIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJtbWMwIiwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmdwaW8JCQk9IE1CSU1YNTFfTEVEMiwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJsZWQzIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJkZWZhdWx0LW9uIiwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmdwaW8JCQk9IE1CSU1YNTFfTEVEMywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIG1iaW14NTFfbGVkc19pbmZvID0geworCS5sZWRzCQk9IG1iaW14NTFfbGVkcywKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKG1iaW14NTFfbGVkcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtYmlteDUxX2xlZHNfZ3BpbyA9IHsKKwkubmFtZQk9ICJsZWRzLWdwaW8iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm1iaW14NTFfbGVkc19pbmZvLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm1iaW14NTFfbGVkc19ncGlvLAorfTsKKworc3RhdGljIHN0cnVjdCBwYWRfZGVzYyBtYmlteDUxX3BhZHNbXSA9IHsKKwkvKiBVQVJUMiAqLworCU1YNTFfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhELAorCU1YNTFfUEFEX1VBUlQyX1RYRF9fVUFSVDJfVFhELAorCisJLyogVUFSVDMgKi8KKwlNWDUxX1BBRF9VQVJUM19SWERfX1VBUlQzX1JYRCwKKwlNWDUxX1BBRF9VQVJUM19UWERfX1VBUlQzX1RYRCwKKwlNWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDNfUlRTLAorCU1YNTFfUEFEX0tFWV9DT0w1X19VQVJUM19DVFMsCisKKwkvKiBUU0MyMDA3IElSUSAqLworCU1YNTFfUEFEX05BTkRGX0QxMF9fR1BJT18zXzMwLAorCisJLyogTEVEUyAqLworCU1YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19HUElPXzNfNSwKKwlNWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fR1BJT18zXzYsCisJTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0dQSU9fM183LAorCU1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0dQSU9fM184LAorCisJLyogS1BQICovCisJTVg1MV9QQURfS0VZX1JPVzBfX0tFWV9ST1cwLAorCU1YNTFfUEFEX0tFWV9ST1cxX19LRVlfUk9XMSwKKwlNWDUxX1BBRF9LRVlfUk9XMl9fS0VZX1JPVzIsCisJTVg1MV9QQURfS0VZX1JPVzNfX0tFWV9ST1czLAorCU1YNTFfUEFEX0tFWV9DT0wwX19LRVlfQ09MMCwKKwlNWDUxX1BBRF9LRVlfQ09MMV9fS0VZX0NPTDEsCisJTVg1MV9QQURfS0VZX0NPTDJfX0tFWV9DT0wyLAorCU1YNTFfUEFEX0tFWV9DT0wzX19LRVlfQ09MMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgPSB7CisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisKK3N0YXRpYyBpbnQgbWJpbXg1MV9rZXltYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZXzEpLAorCUtFWSgwLCAxLCBLRVlfMiksCisJS0VZKDAsIDIsIEtFWV8zKSwKKwlLRVkoMCwgMywgS0VZX1VQKSwKKworCUtFWSgxLCAwLCBLRVlfNCksCisJS0VZKDEsIDEsIEtFWV81KSwKKwlLRVkoMSwgMiwgS0VZXzYpLAorCUtFWSgxLCAzLCBLRVlfTEVGVCksCisKKwlLRVkoMiwgMCwgS0VZXzcpLAorCUtFWSgyLCAxLCBLRVlfOCksCisJS0VZKDIsIDIsIEtFWV85KSwKKwlLRVkoMiwgMywgS0VZX1JJR0hUKSwKKworCUtFWSgzLCAwLCBLRVlfMCksCisJS0VZKDMsIDEsIEtFWV9ET1dOKSwKKwlLRVkoMywgMiwgS0VZX0VTQyksCisJS0VZKDMsIDMsIEtFWV9FTlRFUiksCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBtYmlteDUxX21hcF9kYXRhID0geworCS5rZXltYXAJCT0gbWJpbXg1MV9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShtYmlteDUxX2tleW1hcCksCit9OworCitzdGF0aWMgaW50IHRzYzIwMDdfZ2V0X3BlbmRvd25fc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKE1CSU1YNTFfVFNDMjAwN19HUElPKTsKK30KKworc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSB0c2MyMDA3X2RhdGEgPSB7CisJLm1vZGVsID0gMjAwNywKKwkueF9wbGF0ZV9vaG1zID0gMTgwLAorCS5nZXRfcGVuZG93bl9zdGF0ZSA9IHRzYzIwMDdfZ2V0X3BlbmRvd25fc3RhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIG1iaW14NTFfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJ0c2MyMDA3IiwgMHg0OCksCisJCS5pcnEgID0gTUJJTVg1MV9UU0MyMDA3X0lSUSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmdHNjMjAwN19kYXRhLAorCX0sCit9OworCisvKgorICogYmFzZWJvYXJkIGluaXRpYWxpemF0aW9uLgorICovCit2b2lkIF9faW5pdCBldWtyZWFfbWJpbXg1MV9iYXNlYm9hcmRfaW5pdCh2b2lkKQoreworCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG1iaW14NTFfcGFkcywKKwkJCQkJQVJSQVlfU0laRShtYmlteDUxX3BhZHMpKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsIE5VTEwpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTIsICZ1YXJ0X3BkYXRhKTsKKworCWdwaW9fcmVxdWVzdChNQklNWDUxX0xFRDAsICJMRUQwIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE1CSU1YNTFfTEVEMCwgMSk7CisJZ3Bpb19mcmVlKE1CSU1YNTFfTEVEMCk7CisJZ3Bpb19yZXF1ZXN0KE1CSU1YNTFfTEVEMSwgIkxFRDEiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTUJJTVg1MV9MRUQxLCAxKTsKKwlncGlvX2ZyZWUoTUJJTVg1MV9MRUQxKTsKKwlncGlvX3JlcXVlc3QoTUJJTVg1MV9MRUQyLCAiTEVEMiIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChNQklNWDUxX0xFRDIsIDEpOworCWdwaW9fZnJlZShNQklNWDUxX0xFRDIpOworCWdwaW9fcmVxdWVzdChNQklNWDUxX0xFRDMsICJMRUQzIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE1CSU1YNTFfTEVEMywgMSk7CisJZ3Bpb19mcmVlKE1CSU1YNTFfTEVEMyk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19rZXlwYWRfZGV2aWNlLCAmbWJpbXg1MV9tYXBfZGF0YSk7CisKKwlncGlvX3JlcXVlc3QoTUJJTVg1MV9UU0MyMDA3X0dQSU8sICJ0c2MyMDA3X2lycSIpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KE1CSU1YNTFfVFNDMjAwN19HUElPKTsKKwlzZXRfaXJxX3R5cGUoTUJJTVg1MV9UU0MyMDA3X0lSUSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIG1iaW14NTFfaTJjX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShtYmlteDUxX2kyY19kZXZpY2VzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9tbS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvbW0uYwppbmRleCBiNzY3N2VmLi5iYzNmMzBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKQEAgLTY1LDYgKzY1LDggQEAKIAlpb3RhYmxlX2luaXQobXhjX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXhjX2lvX2Rlc2MpKTsKIH0KIAoraW50IGlteDUxX3JlZ2lzdGVyX2dwaW9zKHZvaWQpOworCiB2b2lkIF9faW5pdCBteDUxX2luaXRfaXJxKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0emljX2FkZHI7CkBAIC04MCw0ICs4Miw1IEBACiAJCXBhbmljKCJ1bmFibGUgdG8gbWFwIFRaSUMgaW50ZXJydXB0IGNvbnRyb2xsZXJcbiIpOwogCiAJdHppY19pbml0X2lycSh0emljX3ZpcnQpOworCWlteDUxX3JlZ2lzdGVyX2dwaW9zKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14YzkxMjMxL2NybV9yZWdzLmggYi9hcmNoL2FybS9tYWNoLW14YzkxMjMxL2NybV9yZWdzLmgKaW5kZXggY2U0ZjU5MC4uYjk4OWJhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teGM5MTIzMS9jcm1fcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXhjOTEyMzEvY3JtX3JlZ3MuaApAQCAtMTEsMTEgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICoKICAqLwogCiAjaWZuZGVmIF9BUkNIX0FSTV9NQUNIX01YQzkxMjMxX0NSTV9SRUdTX0hfCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14YzkxMjMxL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXhjOTEyMzEvZGV2aWNlcy5jCmluZGV4IDM1M2JkOTcuLjAyN2FmNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhjOTEyMzEvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhjOTEyMzEvZGV2aWNlcy5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAl9LAogfTsKIAotaW50IF9faW5pdCBteGNfcmVnaXN0ZXJfZ3Bpb3Modm9pZCkKK2ludCBfX2luaXQgbXhjOTEyMzFfcmVnaXN0ZXJfZ3Bpb3Modm9pZCkKIHsKIAlyZXR1cm4gbXhjX2dwaW9faW5pdChteGNfZ3Bpb19wb3J0cywgQVJSQVlfU0laRShteGNfZ3Bpb19wb3J0cykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teGM5MTIzMS9tbS5jIGIvYXJjaC9hcm0vbWFjaC1teGM5MTIzMS9tbS5jCmluZGV4IDZiZWNkYTMuLmFlY2NmZDc1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14YzkxMjMxL21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teGM5MTIzMS9tbS5jCkBAIC0xNSwxMSArMTUsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtODgsNyArODMsMTAgQEAKIAlpb3RhYmxlX2luaXQobXhjX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXhjX2lvX2Rlc2MpKTsKIH0KIAoraW50IG14YzkxMjMxX3JlZ2lzdGVyX2dwaW9zKHZvaWQpOworCiB2b2lkIF9faW5pdCBteGM5MTIzMV9pbml0X2lycSh2b2lkKQogeworCW14YzkxMjMxX3JlZ2lzdGVyX2dwaW9zKCk7CiAJbXhjX2luaXRfaXJxKE1YQzkxMjMxX0lPX0FERFJFU1MoTVhDOTEyMzFfQVZJQ19CQVNFX0FERFIpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2Nsb2NrLmMKaW5kZXggZjAzNWY0MS4uODlmNzkzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2Nsb2NrLmMKQEAgLTUzLDYgKzUzLDEwIEBACiAJfQogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0geworCXsKKwkJLmNvbl9pZAkJPSAiYXBiX3BjbGsiLAorCQkuY2xrCQk9ICZjbGtfZGVmYXVsdCwKKwl9LAogCUNMSygmY2xrXzI0LCAibXR1MCIpLAogCUNMSygmY2xrXzI0LCAibXR1MSIpLAogCUNMSygmY2xrXzQ4LCAidWFydDAiKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCmluZGV4IGZkZDFkZDUuLjBhOWQ2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwpAQCAtMzAxLDYgKzMwMSw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKIAkubWFwX2lvCQk9IGFtc19kZWx0YV9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gYW1zX2RlbHRhX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBhbXNfZGVsdGFfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWZzYW1wbGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCmluZGV4IDA5NmYyZWQuLjA1OWJhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCkBAIC0zNzgsNiArMzc4LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9mc2FtcGxlX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX2ZzYW1wbGVfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfZnNhbXBsZV9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKaW5kZXggZTExOTVhMy4uN2E2NTY4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKQEAgLTk4LDYgKzk4LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9nZW5lcmljX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX2dlbmVyaWNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfZ2VuZXJpY19pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwppbmRleCBkMTEwMGU0Li42OGIyYmVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCkBAIC00NjcsNiArNDY3LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAogCS5tYXBfaW8JCT0gaDJfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGgyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBoMl9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwppbmRleCBhNTNhYjgyLi4wYjA4MjVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCkBAIC00MzcsNiArNDM3LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAogCS5tYXBfaW8JCT0gaDNfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGgzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBoM19pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWh0Y2hlcmFsZC5jCmluZGV4IDhlMzEzYjQuLmQ3MGE0ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYwpAQCAtMzA0LDYgKzMwNCw3IEBACiAJLmlvX3BnX29mZnN0ICAgID0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zICAgID0gMHgxMDAwMDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBodGNoZXJhbGRfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycSAgICAgICA9IGh0Y2hlcmFsZF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lICAgPSBodGNoZXJhbGRfaW5pdCwKIAkudGltZXIgICAgICAgICAgPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCmluZGV4IDVkMTJmZDMuLjkxMDY0YjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpAQCAtNDYzLDYgKzQ2Myw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKIAkubWFwX2lvCQk9IGlubm92YXRvcl9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gaW5ub3ZhdG9yX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBpbm5vdmF0b3JfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKaW5kZXggNzFlMWEzZi4uOGMyOGIxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYwpAQCAtNDAwLDYgKzQwMCw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfbm9raWE3NzBfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXBfbm9raWE3NzBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfbm9raWE3NzBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwppbmRleCA4MGQ4NjIwLi5lMmE3MmFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKQEAgLTU4NCw2ICs1ODQsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCiAJLm1hcF9pbwkJPSBvc2tfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9za19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb3NrX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKaW5kZXggNTY5YjRjOS4uNjFhMjMyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCkBAIC0zNzMsNiArMzczLDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9wYWxtdGVfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXBfcGFsbXRlX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BhbG10ZV9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jCmluZGV4IDZhZDQ5YTIuLjIxYzAxYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYwpAQCAtMzIxLDYgKzMyMSw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfcGFsbXR0X21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX3BhbG10dF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9wYWxtdHRfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jCmluZGV4IDY2NDFkZTkuLmYzMjQ5MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jCkBAIC0zMzgsMTAgKzMzOCwxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfUEFMTVo3MSwgIk9NQVAzMTAgYmFzZWQgUGFsbSBaaXJlNzEiKQotCS5waHlzX2lvID0gMHhmZmYwMDAwMCwKLQkuaW9fcGdfb2Zmc3QgPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMgPSAweDEwMDAwMTAwLC5tYXBfaW8gPSBvbWFwX3BhbG16NzFfbWFwX2lvLAotCS5pbml0X2lycSA9IG9tYXBfcGFsbXo3MV9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lID0gb21hcF9wYWxtejcxX2luaXQsCi0JLnRpbWVyID0gJm9tYXBfdGltZXIsCisJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLm1hcF9pbwkJPSBvbWFwX3BhbG16NzFfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAorCS5pbml0X2lycQk9IG9tYXBfcGFsbXo3MV9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gb21hcF9wYWxtejcxX2luaXQsCisJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwppbmRleCBlODU0ZDU3Li44YjVhYjFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCkBAIC0zMzksNiArMzM5LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9wZXJzZXVzMl9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcF9wZXJzZXVzMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9wZXJzZXVzMl9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jCmluZGV4IDJmYjFlNWYuLjk5NTU2NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYwpAQCAtNDIzLDcgKzQyMyw4IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfc3gxX21hcF9pbywKLQkuaW5pdF9pcnEJCT0gb21hcF9zeDFfaW5pdF9pcnEsCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCisJLmluaXRfaXJxCT0gb21hcF9zeDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfc3gxX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCmluZGV4IDg3Yjk0MzYuLjRjNDgzZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwpAQCAtMjg3LDYgKzI4Nyw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKIAkubWFwX2lvCQk9IHZvaWNlYmx1ZV9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gdm9pY2VibHVlX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSB2b2ljZWJsdWVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKaW5kZXggZDliOGQ4Mi4uMGNlM2ZlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwpAQCAtMjIsNyArMjIsNiBAQAogCiBleHRlcm4gdm9pZCBvbWFwX2NoZWNrX3JldmlzaW9uKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcF9zcmFtX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBvbWFwZmJfcmVzZXJ2ZV9zZHJhbSh2b2lkKTsKIAogLyoKICAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgbWF5IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlcyB0aGUKQEAgLTEyMiw3ICsxMjEsNiBAQAogI2VuZGlmCiAKIAlvbWFwX3NyYW1faW5pdCgpOwotCW9tYXBmYl9yZXNlcnZlX3NkcmFtKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCmluZGV4IGExMWE1NzUuLjQyZjQ5ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCkBAIC0yNDgsNiArMjQ4LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF8yNDMwc2RwX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwXzI0MzBzZHBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfMjQzMHNkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKaW5kZXggZjQ3NGE4MC4uZGQ5YzAzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKQEAgLTgxNSw2ICs4MTUsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhmYTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCiAJLm1hcF9pbwkJPSBvbWFwXzM0MzBzZHBfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXBfMzQzMHNkcF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF8zNDMwc2RwX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYwppbmRleCA1MDRkMmJkLi41NzI5MGZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZhMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfc2RwX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX3NkcF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9zZHBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCmluZGV4IGU0YTVkNjYuLjRiYjJjNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCkBAIC00MDIsNiArNDAyLDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF80NDMwc2RwX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwXzQ0MzBzZHBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfNDQzMHNkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jCmluZGV4IGFmMzgzYTguLjdkYTkyZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYwpAQCAtNDcyLDYgKzQ3Miw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGQ4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IGFtMzUxN19ldm1fbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGFtMzUxN19ldm1faW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFtMzUxN19ldm1faW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFwb2xsb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCmluZGV4IGFhNjlmYjkuLmJkNzU2NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCkBAIC0zNDYsNiArMzQ2LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9hcG9sbG9uX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX2Fwb2xsb25faW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfYXBvbGxvbl9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCmluZGV4IGU2NzlhMmMuLmJjNGMzZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwpAQCAtODM3LDYgKzgzNyw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGQ4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IGNtX3QzNV9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gY21fdDM1X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBjbV90MzVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCmluZGV4IDc3MDIyYjUuLjkyMmI3NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCkBAIC04MjUsNiArODI1LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZDgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gZGV2a2l0ODAwMF9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gZGV2a2l0ODAwMF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gZGV2a2l0ODAwMF9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKaW5kZXggMTZjYzA2OC4uOTI0MjkwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9nZW5lcmljX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX2dlbmVyaWNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfZ2VuZXJpY19pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwppbmRleCAwNjY1ZjJjLi4xNjcwM2ZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCkBAIC0zNzgsNiArMzc4LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcF9oNF9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcF9oNF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9oNF9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYwppbmRleCBkNTVjNTdiLi43NTllMzlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jCkBAIC01NDMsNiArNTQzLDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gaWdlcDJfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGlnZXAyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBpZ2VwMl9pbml0LAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCmluZGV4IGZlZmQ3ZTYuLjljZDI2NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYwpAQCAtNDE3LDYgKzQxNyw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZhMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfbGRwX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX2xkcF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9sZHBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW44eDAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCmluZGV4IDNjY2MzNGUuLjI1NjVmZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCkBAIC02NjcsNiArNjY3LDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmEwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gbjh4MF9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gbjh4MF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbjh4MF9pbml0X21hY2hpbmUsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLApAQCAtNjc3LDYgKzY3OCw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZhMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG44eDBfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG44eDBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG44eDBfaW5pdF9tYWNoaW5lLAogCS50aW1lcgkJPSAmb21hcF90aW1lciwKQEAgLTY4Nyw2ICs2ODksNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhmYTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCiAJLm1hcF9pbwkJPSBuOHgwX21hcF9pbywKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBuOHgwX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBuOHgwX2luaXRfbWFjaGluZSwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKaW5kZXggNjliMTU0Yy4uMGFiMGMyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwpAQCAtNTE5LDYgKzUxOSw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZhMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXAzX2JlYWdsZV9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcDNfYmVhZ2xlX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM19iZWFnbGVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKaW5kZXggYjk1MjYxMC4uYTNkMmUyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYwpAQCAtNzI3LDYgKzcyNyw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZhMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXAzX2V2bV9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcDNfZXZtX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM19ldm1faW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYwppbmRleCBkYjA2ZGM5Li5jMGY0ZjEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKQEAgLTYwMSw2ICs2MDEsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhmYTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCiAJLm1hcF9pbwkJPSBvbWFwM3BhbmRvcmFfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXAzcGFuZG9yYV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDNwYW5kb3JhX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCmluZGV4IDJmNWY4MjMuLmYwNWI4NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMKQEAgLTU3MSw2ICs1NzEsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhkODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCiAJLm1hcF9pbwkJPSBvbWFwM190b3VjaGJvb2tfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXAzX3RvdWNoYm9va19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDNfdG91Y2hib29rX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCmluZGV4IDc5YWM0MTQuLjg3YWNiMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKQEAgLTQ5NSw2ICs0OTUsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoMHhmYTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCiAJLm1hcF9pbwkJPSBvdmVyb19tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb3Zlcm9faW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG92ZXJvX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYwppbmRleCAxYjg2YjViLi4zYmQ5NTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYwpAQCAtMTU0LDYgKzE1NCw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgweGZhMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IHJ4NTFfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IHJ4NTFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHJ4NTFfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20yLmMKaW5kZXggODAzZWYxNC4uZmZlMTg4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbTIuYwpAQCAtOTUsNiArOTUsNyBAQAogCS5pb19wZ19vZmZzdAk9IChaT09NX1VBUlRfVklSVCA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfem9vbTJfbWFwX2lvLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXBfem9vbTJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfem9vbTJfaW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20zLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20zLmMKaW5kZXggMzMxNDcwNC4uNWI2MDVlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbTMuYwpAQCAtNzcsNiArNzcsNyBAQAogCS5pb19wZ19vZmZzdAk9IChaT09NX1VBUlRfVklSVCA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfem9vbV9tYXBfaW8sCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcF96b29tX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3pvb21faW5pdCwKIAkudGltZXIJCT0gJm9tYXBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrM3h4eF9kYXRhLmMKaW5kZXggNDFiMTU1YS4uZDMzNzQ0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYwpAQCAtMzE2Niw2ICszMTY2LDEwIEBACiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrID0geworCS5uYW1lCQk9ICJhcGJfcGNsayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCit9OwogCiAvKgogICogY2xrZGV2CkBAIC0zMTczLDYgKzMxNzcsNyBAQAogCiAvKiBYWFggQXQgc29tZSBwb2ludCB3ZSBzaG91bGQgcmVuYW1lIHRoaXMgZmlsZSB0byBjbG9jazN4eHhfZGF0YS5jICovCiBzdGF0aWMgc3RydWN0IG9tYXBfY2xrIG9tYXAzeHh4X2Nsa3NbXSA9IHsKKwlDTEsoTlVMTCwJImFwYl9wY2xrIiwJJmR1bW15X2FwYl9wY2xrLAlDS18zWFhYKSwKIAlDTEsoTlVMTCwJIm9tYXBfMzJrX2ZjayIsCSZvbWFwXzMya19mY2ssCUNLXzNYWFgpLAogCUNMSyhOVUxMLAkidmlydF8xMm1fY2siLAkmdmlydF8xMm1fY2ssCUNLXzNYWFgpLAogCUNMSyhOVUxMLAkidmlydF8xM21fY2siLAkmdmlydF8xM21fY2ssCUNLXzNYWFgpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsM3h4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsM3h4eC5jCmluZGV4IGIzMmNjZDk1Li5lZDhkMzMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGwzeHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsM3h4eC5jCkBAIC00NjMsNyArNDYzLDcgQEAKIAl9CiAJaWYgKCFyZXQpIHsKIAkJLyoKLQkJICogU3dpdGNoIHRoZSBwYXJlbnQgY2xvY2sgaW4gdGhlIGhlaXJhcmNoeSwgYW5kIG1ha2Ugc3VyZQorCQkgKiBTd2l0Y2ggdGhlIHBhcmVudCBjbG9jayBpbiB0aGUgaGllcmFyY2h5LCBhbmQgbWFrZSBzdXJlCiAJCSAqIHRoYXQgdGhlIG5ldyBwYXJlbnQncyB1c2Vjb3VudCBpcyBjb3JyZWN0LiAgTm90ZTogd2UKIAkJICogZW5hYmxlIHRoZSBuZXcgcGFyZW50IGJlZm9yZSBkaXNhYmxpbmcgdGhlIG9sZCB0byBhdm9pZAogCQkgKiBhbnkgdW5uZWNlc3NhcnkgaGFyZHdhcmUgZGlzYWJsZS0+ZW5hYmxlIHRyYW5zaXRpb25zLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCmluZGV4IDNjZmI0MjUuLjRlMWY1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxwbGF0L3NkcmMuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxwbGF0L3NlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvdnJhbS5oPgogCiAjaW5jbHVkZSAiY2xvY2syeHh4LmgiCiAjaW5jbHVkZSAiY2xvY2szeHh4LmgiCkBAIC0yNDEsOCArMjQwLDYgQEAKIAogCW9tYXAyX2NoZWNrX3JldmlzaW9uKCk7CiAJb21hcF9zcmFtX2luaXQoKTsKLQlvbWFwZmJfcmVzZXJ2ZV9zZHJhbSgpOwotCW9tYXBfdnJhbV9yZXNlcnZlX3NkcmFtKCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQyMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbGVlcDM0eHguUyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2xlZXAzNHh4LlMKaW5kZXggZDUyMmNkNy4uYmE1MzE5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbGVlcDM0eHguUworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NsZWVwMzR4eC5TCkBAIC02MCw3ICs2MCw3IEBACiAjZGVmaW5lIFNEUkNfRExMQV9DVFJMX1YJT01BUDM0WFhfU0RSQ19SRUdBRERSKFNEUkNfRExMQV9DVFJMKQogCiAgICAgICAgIC50ZXh0Ci0vKiBGdW5jdGlvbiB0byBhcXVpcmUgdGhlIHNlbWFwaG9yZSBpbiBzY3JhdGNocGFkICovCisvKiBGdW5jdGlvbiB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgaW4gc2NyYXRjaHBhZCAqLwogRU5UUlkobG9ja19zY3JhdGNocGFkX3NlbSkKIAlzdG1mZAlzcCEsIHtscn0JQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawogd2FpdF9zZW06CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9LY29uZmlnCmluZGV4IDkwNTcxOWEuLmM4OTdlMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9LY29uZmlnCkBAIC0yNiw2ICsyNiw3IEBACiBjb25maWcgTUFDSF9ETlMzMjMKIAlib29sICJELUxpbmsgRE5TLTMyMyIKIAlzZWxlY3QgSTJDX0JPQVJESU5GTworCXNlbGVjdCBQSFlMSUIKIAloZWxwCiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIEQtTGluayBETlMtMzIzIHBsYXRmb3JtLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCmluZGV4IGZlMGRlMTYuLmE0NzEwMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKQEAgLTMsNiArMywxMCBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KICAqCisgKiBTdXBwb3J0IGZvciBIVyBSZXYgQzE6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQpAQCAtMjMsNiArMjcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvbWFydmVsbF9waHkuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMzEsNiArMzcsNyBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgIm1wcC5oIgogCisvKiBSZXYgQTEgYW5kIEIxICovCiAjZGVmaW5lIEROUzMyM19HUElPX0xFRF9SSUdIVF9BTUJFUgkxCiAjZGVmaW5lIEROUzMyM19HUElPX0xFRF9MRUZUX0FNQkVSCTIKICNkZWZpbmUgRE5TMzIzX0dQSU9fU1lTVEVNX1VQCQkzCkBAIC00Miw2ICs0OSwyMyBAQAogI2RlZmluZSBETlMzMjNfR1BJT19LRVlfUE9XRVIJCTkKICNkZWZpbmUgRE5TMzIzX0dQSU9fS0VZX1JFU0VUCQkxMAogCisvKiBSZXYgQzEgKi8KKyNkZWZpbmUgRE5TMzIzQ19HUElPX0tFWV9QT1dFUgkJMQorI2RlZmluZSBETlMzMjNDX0dQSU9fUE9XRVJfT0ZGCQkyCisjZGVmaW5lIEROUzMyM0NfR1BJT19MRURfUklHSFRfQU1CRVIJOAorI2RlZmluZSBETlMzMjNDX0dQSU9fTEVEX0xFRlRfQU1CRVIJOQorI2RlZmluZSBETlMzMjNDX0dQSU9fTEVEX1BPV0VSCQkxNworI2RlZmluZSBETlMzMjNDX0dQSU9fRkFOX0JJVDEJCTE4CisjZGVmaW5lIEROUzMyM0NfR1BJT19GQU5fQklUMAkJMTkKKworLyogRXhwb3NlZCB0byB1c2Vyc3BhY2UsIGRvIG5vdCBjaGFuZ2UgKi8KK2VudW0geworCUROUzMyM19SRVZfQTEsCS8qIDAgKi8KKwlETlMzMjNfUkVWX0IxLAkvKiAxICovCisJRE5TMzIzX1JFVl9DMSwJLyogMiAqLworfTsKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUENJIHNldHVwCiAgKi8KQEAgLTY4LDIxICs5MiwxMiBAQAogCS5tYXBfaXJxCT0gZG5zMzIzX3BjaV9tYXBfaXJxLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgZG5zMzIzX2Rldl9pZCh2b2lkKQotewotCXUzMiBkZXYsIHJldjsKLQotCW9yaW9uNXhfcGNpZV9pZCgmZGV2LCAmcmV2KTsKLQotCXJldHVybiBkZXY7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGRuczMyM19wY2lfaW5pdCh2b2lkKQogewotCS8qIFRoZSA1MTgyIGRvZXNuJ3QgcmVhbGx5IHVzZSBpdHMgUENJIGJ1cywgYW5kIGluaXRpYWxpc2luZyBQQ0kKKwkvKiBSZXYgQjEgYW5kIEMxIGRvZXNuJ3QgcmVhbGx5IHVzZSBpdHMgUENJIGJ1cywgYW5kIGluaXRpYWxpc2luZyBQQ0kKIAkgKiBnZXRzIGluIHRoZSB3YXkgb2YgaW5pdGlhbGlzaW5nIHRoZSBTQVRBIGNvbnRyb2xsZXIuCiAJICovCi0JaWYgKG1hY2hpbmVfaXNfZG5zMzIzKCkgJiYgZG5zMzIzX2Rldl9pZCgpICE9IE1WODhGNTE4Ml9ERVZfSUQpCisJaWYgKG1hY2hpbmVfaXNfZG5zMzIzKCkgJiYgc3lzdGVtX3JldiA9PSBETlMzMjNfUkVWX0ExKQogCQlwY2lfY29tbW9uX2luaXQoJmRuczMyM19wY2kpOwogCiAJcmV0dXJuIDA7CkBAIC0yMjEsNyArMjM2LDcgQEAKIAl9CiAKIAlpb3VubWFwKG1hY19wYWdlKTsKLQlwcmludGsoIkROUzMyMzogRm91bmQgZXRoZXJuZXQgTUFDIGFkZHJlc3M6ICIpOworCXByaW50aygiRE5TLTMyMzogRm91bmQgZXRoZXJuZXQgTUFDIGFkZHJlc3M6ICIpOwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCXByaW50aygiJS4yeCVzIiwgYWRkcltpXSwgKGkgPCA1KSA/ICI6IiA6ICIuXG4iKTsKIApAQCAtMjU5LDEyICsyNzQsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZCBkbnMzMjNfbGVkc1tdID0geworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBkbnMzMjNhYl9sZWRzW10gPSB7CiAJewogCQkubmFtZSA9ICJwb3dlcjpibHVlIiwKIAkJLmdwaW8gPSBETlMzMjNfR1BJT19MRURfUE9XRVIyLAotCQkuZGVmYXVsdF90cmlnZ2VyID0gInRpbWVyIiwKLQkJLmFjdGl2ZV9sb3cgPSAxLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImRlZmF1bHQtb24iLAogCX0sIHsKIAkJLm5hbWUgPSAicmlnaHQ6YW1iZXIiLAogCQkuZ3BpbyA9IEROUzMyM19HUElPX0xFRF9SSUdIVF9BTUJFUiwKQEAgLTI3Niw5ICsyOTAsMzQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGRuczMyM19sZWRfZGF0YSA9IHsKLQkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGRuczMyM19sZWRzKSwKLQkubGVkcwkJPSBkbnMzMjNfbGVkcywKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBkbnMzMjNjX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lID0gInBvd2VyOmJsdWUiLAorCQkuZ3BpbyA9IEROUzMyM0NfR1BJT19MRURfUE9XRVIsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAidGltZXIiLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwgeworCQkubmFtZSA9ICJyaWdodDphbWJlciIsCisJCS5ncGlvID0gRE5TMzIzQ19HUElPX0xFRF9SSUdIVF9BTUJFUiwKKwkJLmFjdGl2ZV9sb3cgPSAxLAorCX0sIHsKKwkJLm5hbWUgPSAibGVmdDphbWJlciIsCisJCS5ncGlvID0gRE5TMzIzQ19HUElPX0xFRF9MRUZUX0FNQkVSLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKK307CisKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGRuczMyM2FiX2xlZF9kYXRhID0geworCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoZG5zMzIzYWJfbGVkcyksCisJLmxlZHMJCT0gZG5zMzIzYWJfbGVkcywKKwkuZ3Bpb19ibGlua19zZXQgPSBkbnMzMjNfZ3Bpb19ibGlua19zZXQsCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZG5zMzIzY19sZWRfZGF0YSA9IHsKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGRuczMyM2NfbGVkcyksCisJLmxlZHMJCT0gZG5zMzIzY19sZWRzLAogCS5ncGlvX2JsaW5rX3NldCA9IGRuczMyM19ncGlvX2JsaW5rX3NldCwKIH07CiAKQEAgLTI4Niw3ICszMjUsNyBAQAogCS5uYW1lCQk9ICJsZWRzLWdwaW8iLAogCS5pZAkJPSAtMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZG5zMzIzX2xlZF9kYXRhLAorCQkucGxhdGZvcm1fZGF0YQk9ICZkbnMzMjNhYl9sZWRfZGF0YSwKIAl9LAogfTsKIApAQCAtMjk0LDcgKzMzMyw3IEBACiAgKiBHUElPIEF0dGFjaGVkIEtleXMKICAqLwogCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZG5zMzIzX2J1dHRvbnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBkbnMzMjNhYl9idXR0b25zW10gPSB7CiAJewogCQkuY29kZQkJPSBLRVlfUkVTVEFSVCwKIAkJLmdwaW8JCT0gRE5TMzIzX0dQSU9fS0VZX1JFU0VULApAQCAtMzA4LDkgKzM0NywyMyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGRuczMyM19idXR0b25fZGF0YSA9IHsKLQkuYnV0dG9ucwk9IGRuczMyM19idXR0b25zLAotCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUoZG5zMzIzX2J1dHRvbnMpLAorc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBkbnMzMjNhYl9idXR0b25fZGF0YSA9IHsKKwkuYnV0dG9ucwk9IGRuczMyM2FiX2J1dHRvbnMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRShkbnMzMjNhYl9idXR0b25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBkbnMzMjNjX2J1dHRvbnNbXSA9IHsKKwl7CisJCS5jb2RlCQk9IEtFWV9QT1dFUiwKKwkJLmdwaW8JCT0gRE5TMzIzQ19HUElPX0tFWV9QT1dFUiwKKwkJLmRlc2MJCT0gIlBvd2VyIEJ1dHRvbiIsCisJCS5hY3RpdmVfbG93CT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBkbnMzMjNjX2J1dHRvbl9kYXRhID0geworCS5idXR0b25zCT0gZG5zMzIzY19idXR0b25zLAorCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUoZG5zMzIzY19idXR0b25zKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRuczMyM19idXR0b25fZGV2aWNlID0gewpAQCAtMzE4LDcgKzM3MSw3IEBACiAJLmlkCQk9IC0xLAogCS5udW1fcmVzb3VyY2VzCT0gMCwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZG5zMzIzX2J1dHRvbl9kYXRhLAorCQkucGxhdGZvcm1fZGF0YQk9ICZkbnMzMjNhYl9idXR0b25fZGF0YSwKIAl9LAogfTsKIApAQCAtMzMyLDcgKzM4NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogR2VuZXJhbCBTZXR1cAogICovCi1zdGF0aWMgc3RydWN0IG9yaW9uNXhfbXBwX21vZGUgZG5zMzIzX212ODhmNTE4MV9tcHBfbW9kZXNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBvcmlvbjV4X21wcF9tb2RlIGRuczMyM2FfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKIAl7ICAwLCBNUFBfUENJRV9SU1RfT1VUbiB9LAogCXsgIDEsIE1QUF9HUElPIH0sCQkvKiByaWdodCBhbWJlciBMRUQgKHNhdGEgY2gwKSAqLwogCXsgIDIsIE1QUF9HUElPIH0sCQkvKiBsZWZ0IGFtYmVyIExFRCAoc2F0YSBjaDEpICovCkBAIC0zNTYsNyArNDA5LDcgQEAKIAl7IC0xIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG9yaW9uNXhfbXBwX21vZGUgZG5zMzIzX212ODhmNTE4Ml9tcHBfbW9kZXNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBvcmlvbjV4X21wcF9tb2RlIGRuczMyM2JfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKIAl7ICAwLCBNUFBfVU5VU0VEIH0sCiAJeyAgMSwgTVBQX0dQSU8gfSwJCS8qIHJpZ2h0IGFtYmVyIExFRCAoc2F0YSBjaDApICovCiAJeyAgMiwgTVBQX0dQSU8gfSwJCS8qIGxlZnQgYW1iZXIgTEVEIChzYXRhIGNoMSkgKi8KQEAgLTM4MCwxNSArNDMzLDU3IEBACiAJeyAtMSB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvcmlvbjV4X21wcF9tb2RlIGRuczMyM2NfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKKwl7ICAwLCBNUFBfR1BJTyB9LAkJLyogPyBpbnB1dCAqLworCXsgIDEsIE1QUF9HUElPIH0sCQkvKiBpbnB1dCBwb3dlciBzd2l0Y2ggKDAgPSBwcmVzc2VkKSAqLworCXsgIDIsIE1QUF9HUElPIH0sCQkvKiBvdXRwdXQgcG93ZXIgb2ZmICovCisJeyAgMywgTVBQX1VOVVNFRCB9LAkJLyogPyBvdXRwdXQgKi8KKwl7ICA0LCBNUFBfVU5VU0VEIH0sCQkvKiA/IG91dHB1dCAqLworCXsgIDUsIE1QUF9VTlVTRUQgfSwJCS8qID8gb3V0cHV0ICovCisJeyAgNiwgTVBQX1VOVVNFRCB9LAkJLyogPyBvdXRwdXQgKi8KKwl7ICA3LCBNUFBfVU5VU0VEIH0sCQkvKiA/IG91dHB1dCAqLworCXsgIDgsIE1QUF9HUElPIH0sCQkvKiBpL28gcmlnaHQgYW1iZXIgTEVEICovCisJeyAgOSwgTVBQX0dQSU8gfSwJCS8qIGkvbyBsZWZ0IGFtYmVyIExFRCAqLworCXsgMTAsIE1QUF9HUElPIH0sCQkvKiBpbnB1dCAqLworCXsgMTEsIE1QUF9VTlVTRUQgfSwKKwl7IDEyLCBNUFBfU0FUQV9MRUQgfSwKKwl7IDEzLCBNUFBfU0FUQV9MRUQgfSwKKwl7IDE0LCBNUFBfU0FUQV9MRUQgfSwKKwl7IDE1LCBNUFBfU0FUQV9MRUQgfSwKKwl7IDE2LCBNUFBfVU5VU0VEIH0sCisJeyAxNywgTVBQX0dQSU8gfSwJCS8qIHBvd2VyIGJ1dHRvbiBMRUQgKi8KKwl7IDE4LCBNUFBfR1BJTyB9LAkJLyogZmFuIHNwZWVkIGJpdCAwICovCisJeyAxOSwgTVBQX0dQSU8gfSwJCS8qIGZhbiBzcGVlZCBiaXQgMSAqLworCXsgLTEgfSwKK307CisKKy8qIFJldiBDMSBGYW4gc3BlZWQgbm90ZXM6CisgKgorICogVGhlIGZhbiBpcyBjb250cm9sbGVkIGJ5IDIgR1BJT3Mgb24gdGhpcyBib2FyZC4gVGhlIHNldHRpbmdzCisgKiBvZiB0aGUgYml0cyBpcyBhcyBmb2xsb3c6CisgKgorICogIEdQSU8gMTggICAgR1BJTyAxOSAgICBGYW4KKyAqCisgKiAgICAwICAgICAgICAgIDAgICAgICAgIHN0b3BwZWQKKyAqICAgIDAgICAgICAgICAgMSAgICAgICAgbG93IHNwZWVkCisgKiAgICAxICAgICAgICAgIDAgICAgICAgIGhpZ2ggc3BlZWQKKyAqICAgIDEgICAgICAgICAgMSAgICAgICAgZG9uJ3QgZG8gdGhhdCAoKikKKyAqCisgKiAoKikgSSB0aGluayB0aGUgdHdvIGJpdHMgY29udHJvbCB0d28gZmVlZC1pbiByZXNpc3RvcnMgaW50byBhIGZpeGVkCisgKiAgICAgUFdOIGNpcmN1aXQsIHNldHRpbmcgYm90aCBiaXRzIHdpbGwgYmFzaWNhbGx5IGdvIGEgJ2JpdCcgZmFzdGVyCisgKiAgICAgdGhhbiBoaWdoIHNwZWVkLCBidXQgZC1saW5rIGRvZXNuJ3QgZG8gaXQgYW5kIHlvdSBtYXkgZ2V0IG91dCBvZgorICogICAgIEhXIHNwZWMgc28gZG9uJ3QgZG8gaXQuCisgKi8KKwogLyoKLSAqIE9uIHRoZSBETlMtMzIzIHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhcmUgYXR0YWNoZWQgdmlhIEkyQzoKKyAqIE9uIHRoZSBETlMtMzIzIEExIGFuZCBCMSB0aGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGF0dGFjaGVkIHZpYSBJMkM6CiAgKgogICogIGkyYyBhZGRyIHwgY2hpcCAgICAgICAgfCBkZXNjcmlwdGlvbgogICogIDB4M2UgICAgIHwgR01UIEc3NjBBZiAgfCBmYW4gc3BlZWQgUFdNIGNvbnRyb2xsZXIKICAqICAweDQ4ICAgICB8IEdNVCBHNzUxLTJmIHwgdGVtcC4gc2Vuc29yIGFuZCB0aGVybS4gd2F0Y2hkb2cgKExNNzUgY29tcGF0aWJsZSkKICAqICAweDY4ICAgICB8IFNUIE00MVQ4MCAgIHwgUlRDIHcvIGFsYXJtCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBkbnMzMjNfaTJjX2RldmljZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBkbnMzMjNhYl9pMmNfZGV2aWNlc1tdID0gewogCXsKIAkJSTJDX0JPQVJEX0lORk8oImc3NjBhIiwgMHgzZSksCiAJfSwgewpAQCAtMzk4LDM2ICs0OTMsMTQwIEBACiAJfSwKIH07CiAKKy8qCisgKiBPbiB0aGUgRE5TLTMyMyBDMSB0aGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGF0dGFjaGVkIHZpYSBJMkM6CisgKgorICogIGkyYyBhZGRyIHwgY2hpcCAgICAgICAgfCBkZXNjcmlwdGlvbgorICogIDB4NDggICAgIHwgR01UIEc3NTEtMmYgfCB0ZW1wLiBzZW5zb3IgYW5kIHRoZXJtLiB3YXRjaGRvZyAoTE03NSBjb21wYXRpYmxlKQorICogIDB4NjggICAgIHwgU1QgTTQxVDgwICAgfCBSVEMgdy8gYWxhcm0KKyAqLworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGRuczMyM2NfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJsbTc1IiwgMHg0OCksCisJfSwgeworCQlJMkNfQk9BUkRfSU5GTygibTQxdDgwIiwgMHg2OCksCisJfSwKK307CisKIC8qIEROUy0zMjMgcmV2LiBBIHNwZWNpZmljIHBvd2VyIG9mZiBtZXRob2QgKi8KIHN0YXRpYyB2b2lkIGRuczMyM2FfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JcHJfaW5mbygiJXM6IHRyaWdnZXJpbmcgcG93ZXItb2ZmLi4uXG4iLCBfX2Z1bmNfXyk7CisJcHJfaW5mbygiRE5TLTMyMzogVHJpZ2dlcmluZyBwb3dlci1vZmYuLi5cbiIpOwogCWdwaW9fc2V0X3ZhbHVlKEROUzMyM19HUElPX1BPV0VSX09GRiwgMSk7CiB9CiAKIC8qIEROUy0zMjMgcmV2IEIgc3BlY2lmaWMgcG93ZXIgb2ZmIG1ldGhvZCAqLwogc3RhdGljIHZvaWQgZG5zMzIzYl9wb3dlcl9vZmYodm9pZCkKIHsKLQlwcl9pbmZvKCIlczogdHJpZ2dlcmluZyBwb3dlci1vZmYuLi5cbiIsIF9fZnVuY19fKTsKKwlwcl9pbmZvKCJETlMtMzIzOiBUcmlnZ2VyaW5nIHBvd2VyLW9mZi4uLlxuIik7CiAJLyogUGluIGhhcyB0byBiZSBjaGFuZ2VkIHRvIDEgYW5kIGJhY2sgdG8gMCB0byBkbyBhY3R1YWwgcG93ZXIgb2ZmLiAqLwogCWdwaW9fc2V0X3ZhbHVlKEROUzMyM19HUElPX1BPV0VSX09GRiwgMSk7CiAJbWRlbGF5KDEwMCk7CiAJZ3Bpb19zZXRfdmFsdWUoRE5TMzIzX0dQSU9fUE9XRVJfT0ZGLCAwKTsKIH0KIAorLyogRE5TLTMyMyByZXYuIEMgc3BlY2lmaWMgcG93ZXIgb2ZmIG1ldGhvZCAqLworc3RhdGljIHZvaWQgZG5zMzIzY19wb3dlcl9vZmYodm9pZCkKK3sKKwlwcl9pbmZvKCJETlMtMzIzOiBUcmlnZ2VyaW5nIHBvd2VyLW9mZi4uLlxuIik7CisJZ3Bpb19zZXRfdmFsdWUoRE5TMzIzQ19HUElPX1BPV0VSX09GRiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZG5zMzIzY19waHlfZml4dXAoc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKK3sKKwlwaHktPmRldl9mbGFncyB8PSBNQVJWRUxMX1BIWV9NMTExOF9ETlMzMjNfTEVEUzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkbnMzMjNfaWRlbnRpZnlfcmV2KHZvaWQpCit7CisJdTMyIGRldiwgcmV2LCBpLCByZWc7CisKKwlwcl9kZWJ1ZygiRE5TLTMyMzogSWRlbnRpZnlpbmcgYm9hcmQgLi4uIFxuIik7CisKKwkvKiBSZXYgQTEgaGFzIGEgNTE4MSAqLworCW9yaW9uNXhfcGNpZV9pZCgmZGV2LCAmcmV2KTsKKwlpZiAoZGV2ID09IE1WODhGNTE4MV9ERVZfSUQpIHsKKwkJcHJfZGVidWcoIkROUy0zMjM6IDUxODEgZm91bmQsIGJvYXJkIGlzIEExXG4iKTsKKwkJcmV0dXJuIEROUzMyM19SRVZfQTE7CisJfQorCXByX2RlYnVnKCJETlMtMzIzOiA1MTgyIGZvdW5kLCBib2FyZCBpcyBCMSBvciBDMSwgY2hlY2tpbmcgUEhZLi4uXG4iKTsKKworCS8qIFJldiBCMSBhbmQgQzEgYm90aCBoYXZlIDUxODIsIGxldCdzIHBva2UgYXQgdGhlIGV0aCBQSFkuIFRoaXMgaXMKKwkgKiBhIGJpdCBncm9zcyBidXQgd2Ugd2FudCB0byBkbyB0aGF0IHdpdGhvdXQgbGlua3MgaW50byB0aGUgZXRoCisJICogZHJpdmVyIHNvIGxldCdzIHBva2UgYXQgaXQgZGlyZWN0bHkuIFdlIGRlZmF1bHQgdG8gcmV2IEIxIGluCisJICogY2FzZSB0aGUgYWNjZXNzZXMgZmFpbAorCSAqLworCisjZGVmaW5lIEVUSF9TTUlfUkVHCQkoT1JJT041WF9FVEhfVklSVF9CQVNFICsgMHgyMDAwICsgMHgwMDQpCisjZGVmaW5lICBTTUlfQlVTWQkJMHgxMDAwMDAwMAorI2RlZmluZSAgU01JX1JFQURfVkFMSUQJCTB4MDgwMDAwMDAKKyNkZWZpbmUgIFNNSV9PUENPREVfUkVBRAkweDA0MDAwMDAwCisjZGVmaW5lICBTTUlfT1BDT0RFX1dSSVRFCTB4MDAwMDAwMDAKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJcmVnID0gcmVhZGwoRVRIX1NNSV9SRUcpOworCQlpZiAoIShyZWcgJiBTTUlfQlVTWSkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gMTAwMCkgeworCQlwcl93YXJuaW5nKCJETlMtMzIzOiBUaW1lb3V0IGFjY2Vzc2luZyBQSFksIGFzc3VtaW5nIHJldiBCMVxuIik7CisJCXJldHVybiBETlMzMjNfUkVWX0IxOworCX0KKwl3cml0ZWwoKDMgPDwgMjEpCS8qIHBoeSBJRCByZWcgKi8gfAorCSAgICAgICAoOCA8PCAxNikJLyogcGh5IGFkZHIgKi8gfAorCSAgICAgICBTTUlfT1BDT0RFX1JFQUQsIEVUSF9TTUlfUkVHKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCXJlZyA9IHJlYWRsKEVUSF9TTUlfUkVHKTsKKwkJaWYgKHJlZyAmIFNNSV9SRUFEX1ZBTElEKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IDEwMDApIHsKKwkJcHJfd2FybmluZygiRE5TLTMyMzogVGltZW91dCByZWFkaW5nIFBIWSwgYXNzdW1pbmcgcmV2IEIxXG4iKTsKKwkJcmV0dXJuIEROUzMyM19SRVZfQjE7CisJfQorCXByX2RlYnVnKCJETlMtMzIzOiBFdGhlcm5ldCBQSFkgSUQgMHgleFxuIiwgcmVnICYgMHhmZmZmKTsKKworCS8qIE5vdGU6IHRoZSBNYXJ2ZWxsIHRvb2xzIG1hc2sgdGhlIElEIHdpdGggMHgzZjAgYmVmb3JlIGNvbXBhcmlzb24KKwkgKiBidXQgSSBkb24ndCBzZWUgdGhhdCBtYWtpbmcgYSBkaWZmZXJlbmNlIGhlcmUsIGF0IGxlYXN0IHdpdGgKKwkgKiBhbnkga25vd24gTWFydmVsbCBQSFkgSUQKKwkgKi8KKwlzd2l0Y2gocmVnICYgMHhmZmYwKSB7CisJY2FzZSAweDBjYzA6IC8qIE1WODhFMTExMSAqLworCQlyZXR1cm4gRE5TMzIzX1JFVl9CMTsKKwljYXNlIDB4MGUxMDogLyogTVY4OEUxMTE4ICovCisJCXJldHVybiBETlMzMjNfUkVWX0MxOworCWRlZmF1bHQ6CisJCXByX3dhcm5pbmcoIkROUy0zMjM6IFVua25vd24gUEhZIElEIDB4JTA0eCwgYXNzdW1pbmcgcmV2IEIxXG4iLAorCQkJICAgcmVnICYgMHhmZmZmKTsKKwl9CisJcmV0dXJuIEROUzMyM19SRVZfQjE7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBkbnMzMjNfaW5pdCh2b2lkKQogewogCS8qIFNldHVwIGJhc2ljIE9yaW9uIGZ1bmN0aW9ucy4gTmVlZCB0byBiZSBjYWxsZWQgZWFybHkuICovCiAJb3Jpb241eF9pbml0KCk7CiAKKwkvKiBJZGVudGlmeSByZXZpc2lvbiAqLworCXN5c3RlbV9yZXYgPSBkbnMzMjNfaWRlbnRpZnlfcmV2KCk7CisJcHJfaW5mbygiRE5TLTMyMzogSWRlbnRpZmllZCBIVyByZXZpc2lvbiAlYzFcbiIsICdBJyArIHN5c3RlbV9yZXYpOworCiAJLyogSnVzdCB0byBiZSB0cmlja3ksIHRoZSA1MTgyIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50CiAJICogc2V0IG9mIE1QUCBtb2RlcyB0byB0aGUgNTE4MS4KIAkgKi8KLQlpZiAoZG5zMzIzX2Rldl9pZCgpID09IE1WODhGNTE4Ml9ERVZfSUQpCi0JCW9yaW9uNXhfbXBwX2NvbmYoZG5zMzIzX212ODhmNTE4Ml9tcHBfbW9kZXMpOwotCWVsc2UgewotCQlvcmlvbjV4X21wcF9jb25mKGRuczMyM19tdjg4ZjUxODFfbXBwX21vZGVzKTsKKwlzd2l0Y2goc3lzdGVtX3JldikgeworCWNhc2UgRE5TMzIzX1JFVl9BMToKKwkJb3Jpb241eF9tcHBfY29uZihkbnMzMjNhX21wcF9tb2Rlcyk7CiAJCXdyaXRlbCgwLCBNUFBfREVWX0NUUkwpOwkJLyogREVWX0RbMzE6MTZdICovCisJCWJyZWFrOworCWNhc2UgRE5TMzIzX1JFVl9CMToKKwkJb3Jpb241eF9tcHBfY29uZihkbnMzMjNiX21wcF9tb2Rlcyk7CisJCWJyZWFrOworCWNhc2UgRE5TMzIzX1JFVl9DMToKKwkJb3Jpb241eF9tcHBfY29uZihkbnMzMjNjX21wcF9tb2Rlcyk7CisJCWJyZWFrOwogCX0KIAogCS8qIHNldHVwIGZsYXNoIG1hcHBpbmcKQEAgLTQzNiw1MyArNjM1LDk2IEBACiAJb3Jpb241eF9zZXR1cF9kZXZfYm9vdF93aW4oRE5TMzIzX05PUl9CT09UX0JBU0UsIEROUzMyM19OT1JfQk9PVF9TSVpFKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRuczMyM19ub3JfZmxhc2gpOwogCi0JLyogVGhlIDUxODEgcG93ZXIgTEVEIGlzIGFjdGl2ZSBsb3cgYW5kIHJlcXVpcmVzCi0JICogRE5TMzIzX0dQSU9fTEVEX1BPV0VSMSB0byBhbHNvIGJlIGxvdy4KLQkgKi8KLQlpZiAoZG5zMzIzX2Rldl9pZCgpID09IE1WODhGNTE4MV9ERVZfSUQpIHsKLQkJZG5zMzIzX2xlZHNbMF0uYWN0aXZlX2xvdyA9IDE7Ci0JCWdwaW9fcmVxdWVzdChETlMzMjNfR1BJT19MRURfUE9XRVIxLCAiUG93ZXIgTGVkIEVuYWJsZSIpOwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoRE5TMzIzX0dQSU9fTEVEX1BPV0VSMSwgMCk7CisJLyogU29ydCBvdXQgTEVEcywgQnV0dG9ucyBhbmQgaTJjIGRldmljZXMgKi8KKwlzd2l0Y2goc3lzdGVtX3JldikgeworCWNhc2UgRE5TMzIzX1JFVl9BMToKKwkJLyogVGhlIDUxODEgcG93ZXIgTEVEIGlzIGFjdGl2ZSBsb3cgYW5kIHJlcXVpcmVzCisJCSAqIEROUzMyM19HUElPX0xFRF9QT1dFUjEgdG8gYWxzbyBiZSBsb3cuCisJCSAqLworCQkgZG5zMzIzYWJfbGVkc1swXS5hY3RpdmVfbG93ID0gMTsKKwkJIGdwaW9fcmVxdWVzdChETlMzMjNfR1BJT19MRURfUE9XRVIxLCAiUG93ZXIgTGVkIEVuYWJsZSIpOworCQkgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEROUzMyM19HUElPX0xFRF9QT1dFUjEsIDApOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIEROUzMyM19SRVZfQjE6CisJCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGRuczMyM2FiX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoZG5zMzIzYWJfaTJjX2RldmljZXMpKTsKKwkJYnJlYWs7CisJY2FzZSBETlMzMjNfUkVWX0MxOgorCQkvKiBIb29rdXAgTEVEcyAmIEJ1dHRvbnMgKi8KKwkJZG5zMzIzX2dwaW9fbGVkcy5kZXYucGxhdGZvcm1fZGF0YSA9ICZkbnMzMjNjX2xlZF9kYXRhOworCQlkbnMzMjNfYnV0dG9uX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9ICZkbnMzMjNjX2J1dHRvbl9kYXRhOworCisJCS8qIEhvb2t1cCBpMmMgZGV2aWNlcyBhbmQgZmFuIGRyaXZlciAqLworCQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBkbnMzMjNjX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUoZG5zMzIzY19pMmNfZGV2aWNlcykpOworCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkbnMzMjNjLWZhbiIsIDAsIE5VTEwsIDApOworCisJCS8qIFJlZ2lzdGVyIGZpeHVwIGZvciB0aGUgUEhZIExFRHMgKi8KKwkJcGh5X3JlZ2lzdGVyX2ZpeHVwX2Zvcl91aWQoTUFSVkVMTF9QSFlfSURfODhFMTExOCwKKwkJCQkJICAgTUFSVkVMTF9QSFlfSURfTUFTSywKKwkJCQkJICAgZG5zMzIzY19waHlfZml4dXApOwogCX0KIAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZG5zMzIzX2dwaW9fbGVkcyk7Ci0KIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRuczMyM19idXR0b25fZGV2aWNlKTsKIAotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGRuczMyM19pMmNfZGV2aWNlcywKLQkJCQlBUlJBWV9TSVpFKGRuczMyM19pMmNfZGV2aWNlcykpOwotCiAJLyoKIAkgKiBDb25maWd1cmUgcGVyaXBoZXJhbHMuCiAJICovCiAJaWYgKGRuczMyM19yZWFkX21hY19hZGRyKCkgPCAwKQotCQlwcmludGsoIkROUzMyMzogRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3NcbiIpOwotCisJCXByaW50aygiRE5TLTMyMzogRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3NcbiIpOwogCW9yaW9uNXhfZWhjaTBfaW5pdCgpOwogCW9yaW9uNXhfZXRoX2luaXQoJmRuczMyM19ldGhfZGF0YSk7CiAJb3Jpb241eF9pMmNfaW5pdCgpOwogCW9yaW9uNXhfdWFydDBfaW5pdCgpOwogCi0JLyogVGhlIDUxODIgaGFzIGl0cyBTQVRBIGNvbnRyb2xsZXIgb24tY2hpcCwgYW5kIG5lZWRzIGl0cyBvd24gbGl0dGxlCi0JICogaW5pdCByb3V0aW5lLgotCSAqLwotCWlmIChkbnMzMjNfZGV2X2lkKCkgPT0gTVY4OEY1MTgyX0RFVl9JRCkKKwkvKiBSZW1haW5pbmcgR1BJT3MgKi8KKwlzd2l0Y2goc3lzdGVtX3JldikgeworCWNhc2UgRE5TMzIzX1JFVl9BMToKKwkJLyogUG93ZXJvZmYgR1BJTyAqLworCQlpZiAoZ3Bpb19yZXF1ZXN0KEROUzMyM19HUElPX1BPV0VSX09GRiwgIlBPV0VST0ZGIikgIT0gMCB8fAorCQkgICAgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEROUzMyM19HUElPX1BPV0VSX09GRiwgMCkgIT0gMCkKKwkJCXByX2VycigiRE5TLTMyMzogZmFpbGVkIHRvIHNldHVwIHBvd2VyLW9mZiBHUElPXG4iKTsKKwkJcG1fcG93ZXJfb2ZmID0gZG5zMzIzYV9wb3dlcl9vZmY7CisJCWJyZWFrOworCWNhc2UgRE5TMzIzX1JFVl9CMToKKwkJLyogNTE4MiBidWlsdC1pbiBTQVRBIGluaXQgKi8KIAkJb3Jpb241eF9zYXRhX2luaXQoJmRuczMyM19zYXRhX2RhdGEpOwogCi0JLyogVGhlIDUxODIgaGFzIGZsYWcgdG8gaW5kaWNhdGUgdGhlIHN5c3RlbSBpcyB1cC4gV2l0aG91dCB0aGlzIGZsYWcKLQkgKiBzZXQsIHBvd2VyIExFRCB3aWxsIGZsYXNoIGFuZCBjYW5ub3QgYmUgY29udHJvbGxlZCB2aWEgbGVkcy1ncGlvLgotCSAqLwotCWlmIChkbnMzMjNfZGV2X2lkKCkgPT0gTVY4OEY1MTgyX0RFVl9JRCkKLQkJZ3Bpb19zZXRfdmFsdWUoRE5TMzIzX0dQSU9fU1lTVEVNX1VQLCAxKTsKKwkJLyogVGhlIEROUzMyMyByZXYgQjEgaGFzIGZsYWcgdG8gaW5kaWNhdGUgdGhlIHN5c3RlbSBpcyB1cC4KKwkJICogV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBwb3dlciBMRUQgd2lsbCBmbGFzaCBhbmQgY2Fubm90IGJlCisJCSAqIGNvbnRyb2xsZWQgdmlhIGxlZHMtZ3Bpby4KKwkJICovCisJCWlmIChncGlvX3JlcXVlc3QoRE5TMzIzX0dQSU9fU1lTVEVNX1VQLCAiU1lTX1JFQURZIikgPT0gMCkKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChETlMzMjNfR1BJT19TWVNURU1fVVAsIDEpOwogCi0JLyogUmVnaXN0ZXIgZG5zMzIzIHNwZWNpZmljIHBvd2VyLW9mZiBtZXRob2QgKi8KLQlpZiAoZ3Bpb19yZXF1ZXN0KEROUzMyM19HUElPX1BPV0VSX09GRiwgIlBPV0VST0ZGIikgIT0gMCB8fAotCSAgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoRE5TMzIzX0dQSU9fUE9XRVJfT0ZGLCAwKSAhPSAwKQotCQlwcl9lcnIoIkROUzMyMzogZmFpbGVkIHRvIHNldHVwIHBvd2VyLW9mZiBHUElPXG4iKTsKLQlpZiAoZG5zMzIzX2Rldl9pZCgpID09IE1WODhGNTE4Ml9ERVZfSUQpCisJCS8qIFBvd2Vyb2ZmIEdQSU8gKi8KKwkJaWYgKGdwaW9fcmVxdWVzdChETlMzMjNfR1BJT19QT1dFUl9PRkYsICJQT1dFUk9GRiIpICE9IDAgfHwKKwkJICAgIGdwaW9fZGlyZWN0aW9uX291dHB1dChETlMzMjNfR1BJT19QT1dFUl9PRkYsIDApICE9IDApCisJCQlwcl9lcnIoIkROUy0zMjM6IGZhaWxlZCB0byBzZXR1cCBwb3dlci1vZmYgR1BJT1xuIik7CiAJCXBtX3Bvd2VyX29mZiA9IGRuczMyM2JfcG93ZXJfb2ZmOwotCWVsc2UKLQkJcG1fcG93ZXJfb2ZmID0gZG5zMzIzYV9wb3dlcl9vZmY7CisJCWJyZWFrOworCWNhc2UgRE5TMzIzX1JFVl9DMToKKwkJLyogNTE4MiBidWlsdC1pbiBTQVRBIGluaXQgKi8KKwkJb3Jpb241eF9zYXRhX2luaXQoJmRuczMyM19zYXRhX2RhdGEpOworCisJCS8qIFBvd2Vyb2ZmIEdQSU8gKi8KKwkJaWYgKGdwaW9fcmVxdWVzdChETlMzMjNDX0dQSU9fUE9XRVJfT0ZGLCAiUE9XRVJPRkYiKSAhPSAwIHx8CisJCSAgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoRE5TMzIzQ19HUElPX1BPV0VSX09GRiwgMCkgIT0gMCkKKwkJCXByX2VycigiRE5TLTMyMzogZmFpbGVkIHRvIHNldHVwIHBvd2VyLW9mZiBHUElPXG4iKTsKKwkJcG1fcG93ZXJfb2ZmID0gZG5zMzIzY19wb3dlcl9vZmY7CisKKwkJLyogTm93LCAtdGhpcy0gc2hvdWxkIHRoZW9yaWNhbGx5IGJlIGRvbmUgYnkgdGhlIHNhdGFfbXYgZHJpdmVyCisJCSAqIG9uY2UgSSBmaWd1cmUgb3V0IHdoYXQncyBnb2luZyBvbiB0aGVyZS4gTWF5YmUgdGhlIGJlaGF2aW91cgorCQkgKiBvZiB0aGUgTEVEcyBzaG91bGQgYmUgc29tZXdoYXQgcGFzc2VkIHZpYSB0aGUgcGxhdGZvcm1fZGF0YS4KKwkJICogZm9yIG5vdywganVzdCB3aGFjayB0aGUgcmVnaXN0ZXIgYW5kIG1ha2UgdGhlIExFRHMgaGFwcHkKKwkJICoKKwkJICogTm90ZTogQUZBSUssIHJldiBCMSBuZWVkcyB0aGUgc2FtZSB0cmVhdGVtZW50IGJ1dCBJJ2xsIGxldAorCQkgKiBzb21lYm9keSBlbHNlIHRlc3QgaXQuCisJCSAqLworCQl3cml0ZWwoMHg1LCBPUklPTjVYX1NBVEFfVklSVF9CQVNFIHwgMHgyYyk7CisJCWJyZWFrOworCX0KIH0KIAogLyogV2FybmluZzogRC1MaW5rIHVzZXMgYSB3cm9uZyBtYWNoLXR5cGUgKD01MjYpIGluIHRoZWlyIGJvb3Rsb2FkZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDYwZTczNGMuLmExZDZlNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjUsNiArMjUsOCBAQAogCSAqLwogCW9yaW9uNXhfc2V0Yml0cyhSU1RPVVRuX01BU0ssICgxIDw8IDIpKTsKIAlvcmlvbjV4X3NldGJpdHMoQ1BVX1NPRlRfUkVTRVQsIDEpOworCW1kZWxheSgyMDApOworCW9yaW9uNXhfY2xyYml0cyhDUFVfU09GVF9SRVNFVCwgMSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMKaW5kZXggMTYxZmMyZC4uMGYzMTMwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCkBAIC0zNSw3ICszNSw3IEBACiAgKiBUaGlzIGlzIHJlYWxseSB1Z2x5IGFuZCB3ZSBuZWVkIGEgYmV0dGVyIHdheSBvZiBzcGVjaWZ5aW5nCiAgKiBETUEtY2FwYWJsZSByZWdpb25zIG9mIG1lbW9yeS4KICAqLwotdm9pZCBfX2luaXQgY214Mnh4X3BjaV9hZGp1c3Rfem9uZXMoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgKnpvbmVfc2l6ZSwKK3ZvaWQgX19pbml0IGNteDJ4eF9wY2lfYWRqdXN0X3pvbmVzKHVuc2lnbmVkIGxvbmcgKnpvbmVfc2l6ZSwKIAl1bnNpZ25lZCBsb25nICp6aG9sZV9zaXplKQogewogCXVuc2lnbmVkIGludCBzeiA9IFNaXzY0TSA+PiBQQUdFX1NISUZUOwpAQCAtNDYsNyArNDYsNyBAQAogCQkvKgogCQkgKiBPbmx5IGFkanVzdCBpZiA+IDY0TSBvbiBjdXJyZW50IHN5c3RlbQogCQkgKi8KLQkJaWYgKG5vZGUgfHwgKHpvbmVfc2l6ZVswXSA8PSBzeikpCisJCWlmICh6b25lX3NpemVbMF0gPD0gc3opCiAJCQlyZXR1cm47CiAKIAkJem9uZV9zaXplWzFdID0gem9uZV9zaXplWzBdIC0gc3o7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwppbmRleCA1MWZmYTZhLi40NjFiYTQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTcxNSw3ICs3MTUsNiBAQAogCXNoYXJwc2xfc2F2ZV9wYXJhbSgpOwogCW1pLT5ucl9iYW5rcz0xOwogCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHhhMDAwMDAwMDsKLQltaS0+YmFua1swXS5ub2RlID0gMDsKIAlpZiAobWFjaGluZV9pc19jb3JnaSgpKQogCQltaS0+YmFua1swXS5zaXplID0gKDMyKjEwMjQqMTAyNCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jCmluZGV4IDk2ZWQxMzAuLmEwYWIzMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMKQEAgLTM0LDcgKzM0LDYgQEAKIHsKIAltaS0+bnJfYmFua3M9MTsKIAltaS0+YmFua1swXS5zdGFydCA9IDB4YTAwMDAwMDA7Ci0JbWktPmJhbmtbMF0ubm9kZSA9IDA7CiAJaWYgKG1hY2hpbmVfaXNfZTgwMCgpKQogCQltaS0+YmFua1swXS5zaXplID0gKDEyOCoxMDI0KjEwMjQpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaAppbmRleCA4OTBmYjkwLi5jNjMwNWM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5oCkBAIC0yNiw4ICsyNiw3IEBACiAKICNkZWZpbmUgU0VUX0JBTksoX19ucixfX3N0YXJ0LF9fc2l6ZSkgXAogCW1pLT5iYW5rW19fbnJdLnN0YXJ0ID0gKF9fc3RhcnQpLCBcCi0JbWktPmJhbmtbX19ucl0uc2l6ZSA9IChfX3NpemUpLCBcCi0JbWktPmJhbmtbX19ucl0ubm9kZSA9ICgoKHVuc2lnbmVkKShfX3N0YXJ0KSAtIFBIWVNfT0ZGU0VUKSA+PiAyNykKKwltaS0+YmFua1tfX25yXS5zaXplID0gKF9fc2l6ZSkKIAogI2RlZmluZSBBUlJBWV9BTkRfU0laRSh4KQkoeCksIEFSUkFZX1NJWkUoeCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGY2MjY3MzAuLjkyMzYxYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE3LDI0ICsxNywxMSBAQAogICovCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4YTAwMDAwMDApCiAKLS8qCi0gKiBUaGUgbm9kZXMgYXJlIG1hdGNoZWQgd2l0aCB0aGUgcGh5c2ljYWwgU0RSQU0gYmFua3MgYXMgZm9sbG93czoKLSAqCi0gKiAJbm9kZSAwOiAgMHhhMDAwMDAwMC0weGEzZmZmZmZmCS0tPiAgMHhjMDAwMDAwMC0weGMzZmZmZmZmCi0gKiAJbm9kZSAxOiAgMHhhNDAwMDAwMC0weGE3ZmZmZmZmCS0tPiAgMHhjNDAwMDAwMC0weGM3ZmZmZmZmCi0gKiAJbm9kZSAyOiAgMHhhODAwMDAwMC0weGFiZmZmZmZmCS0tPiAgMHhjODAwMDAwMC0weGNiZmZmZmZmCi0gKiAJbm9kZSAzOiAgMHhhYzAwMDAwMC0weGFmZmZmZmZmCS0tPiAgMHhjYzAwMDAwMC0weGNmZmZmZmZmCi0gKgotICogVGhpcyBuZWVkcyBhIG5vZGUgbWVtIHNpemUgb2YgMjYgYml0cy4KLSAqLwotI2RlZmluZSBOT0RFX01FTV9TSVpFX0JJVFMJMjYKLQogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykgJiYgZGVmaW5lZChDT05GSUdfTUFDSF9BUk1DT1JFKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCi12b2lkIGNteDJ4eF9wY2lfYWRqdXN0X3pvbmVzKGludCBub2RlLCB1bnNpZ25lZCBsb25nICpzaXplLAotCQkJICAgICB1bnNpZ25lZCBsb25nICpob2xlcyk7Cit2b2lkIGNteDJ4eF9wY2lfYWRqdXN0X3pvbmVzKHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGxvbmcgKmhvbGVzKTsKIAotI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyhub2RlLCBzaXplLCBob2xlcykgXAotCWNteDJ4eF9wY2lfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQorI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyhzaXplLCBob2xlcykgXAorCWNteDJ4eF9wY2lfYWRqdXN0X3pvbmVzKHNpemUsIGhvbGVzKQogCiAjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xECShQSFlTX09GRlNFVCArIFNaXzY0TSAtIDEpCiAjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgU1pfNjRNKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXQ1LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYwppbmRleCA1MzA1YTM5Li41ZTkyZDg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtMzk2LDYgKzM5NywxMSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHBhbG10NV9yZXNlcnZlKHZvaWQpCit7CisJbWVtYmxvY2tfcmVzZXJ2ZSgweGEwMjAwMDAwLCAweDEwMDApOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFsbXQ1X2luaXQodm9pZCkKIHsKIAlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShwYWxtdDVfcGluX2NvbmZpZykpOwpAQCAtNDIxLDYgKzQyNyw3IEBACiAJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKIAkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCisJLnJlc2VydmUJPSBwYWxtdDVfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHBhbG10NV9pbml0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHJlby5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRyZW8uYwppbmRleCBkOGI0NDY5Li4zZDBjOWNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHJlby5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10cmVvLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KQEAgLTYzMyw2ICs2MzQsMTIgQEAKIAl0cmVvX2xjZF9zY3JlZW4ucHhhZmJfbGNkX3Bvd2VyID0gdHJlb19sY2RfcG93ZXI7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCB0cmVvX3Jlc2VydmUodm9pZCkKK3sKKwltZW1ibG9ja19yZXNlcnZlKDB4YTAwMDAwMDAsIDB4MTAwMCk7CisJbWVtYmxvY2tfcmVzZXJ2ZSgweGEyMDAwMDAwLCAweDEwMDApOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgdHJlb19pbml0KHZvaWQpCiB7CiAJcHhhX3NldF9mZnVhcnRfaW5mbyhOVUxMKTsKQEAgLTY2OCw2ICs2NzUsNyBAQAogCS5pb19wZ19vZmZzdCAgICA9IGlvX3AydigweDQwMDAwMDAwKSwKIAkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YV9tYXBfaW8sCisJLnJlc2VydmUJPSB0cmVvX3Jlc2VydmUsCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZweGFfdGltZXIsCiAJLmluaXRfbWFjaGluZSAgID0gdHJlbzY4MF9pbml0LApAQCAtNjkxLDYgKzY5OSw3IEBACiAJLmlvX3BnX29mZnN0ICAgID0gaW9fcDJ2KDB4NDAwMDAwMDApLAogCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhX21hcF9pbywKKwkucmVzZXJ2ZQk9IHRyZW9fcmVzZXJ2ZSwKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJnB4YV90aW1lciwKICAgICAgICAuaW5pdF9tYWNoaW5lICAgPSBjZW50cm9faW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKaW5kZXggZjRhYmRhYS4uYmMyNzU4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKQEAgLTQ2Myw3ICs0NjMsNiBAQAogCXNoYXJwc2xfc2F2ZV9wYXJhbSgpOwogCW1pLT5ucl9iYW5rcz0xOwogCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHhhMDAwMDAwMDsKLQltaS0+YmFua1swXS5ub2RlID0gMDsKIAltaS0+YmFua1swXS5zaXplID0gKDMyKjEwMjQqMTAyNCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCmluZGV4IGMxMDQ4YTMuLjUxNzU2YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwpAQCAtODQ3LDcgKzg0Nyw2IEBACiAJc2hhcnBzbF9zYXZlX3BhcmFtKCk7CiAJbWktPm5yX2JhbmtzID0gMTsKIAltaS0+YmFua1swXS5zdGFydCA9IDB4YTAwMDAwMDA7Ci0JbWktPmJhbmtbMF0ubm9kZSA9IDA7CiAJbWktPmJhbmtbMF0uc2l6ZSA9ICg2NCoxMDI0KjEwMjQpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMKaW5kZXggNzUxMmI4Mi4uODNjYzNhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYwpAQCAtOTQ4LDcgKzk0OCw2IEBACiAJc2hhcnBzbF9zYXZlX3BhcmFtKCk7CiAJbWktPm5yX2JhbmtzPTE7CiAJbWktPmJhbmtbMF0uc3RhcnQgPSAweGEwMDAwMDAwOwotCW1pLT5iYW5rWzBdLm5vZGUgPSAwOwogCW1pLT5iYW5rWzBdLnNpemUgPSAoNjQqMTAyNCoxMDI0KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwppbmRleCA1OTViZTE5Li4yZmEzOGRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwpAQCAtNjEsMTIgKzYxLDExIEBACiAvKgogICogQWRqdXN0IHRoZSB6b25lcyBpZiB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIGZvciBETUEgYWNjZXNzLgogICovCi12b2lkIF9faW5pdCByZWFsdmlld19hZGp1c3Rfem9uZXMoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgKnNpemUsCi0JCQkJICB1bnNpZ25lZCBsb25nICpob2xlKQordm9pZCBfX2luaXQgcmVhbHZpZXdfYWRqdXN0X3pvbmVzKHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGxvbmcgKmhvbGUpCiB7CiAJdW5zaWduZWQgbG9uZyBkbWFfc2l6ZSA9IFNaXzI1Nk0gPj4gUEFHRV9TSElGVDsKIAotCWlmICghbWFjaGluZV9pc19yZWFsdmlld19wYngoKSB8fCBub2RlIHx8IChzaXplWzBdIDw9IGRtYV9zaXplKSkKKwlpZiAoIW1hY2hpbmVfaXNfcmVhbHZpZXdfcGJ4KCkgfHwgc2l6ZVswXSA8PSBkbWFfc2l6ZSkKIAkJcmV0dXJuOwogCiAJc2l6ZVtaT05FX05PUk1BTF0gPSBzaXplWzBdIC0gZG1hX3NpemU7CkBAIC0yMzIsMTIgKzIzMSwyNyBAQAogCXN0cnVjdCBhbWJhX2RldmljZSAqYWRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBhbWJhX2RldmljZSwgZGV2KTsKIAl1MzIgbWFzazsKIAorCWlmIChtYWNoaW5lX2lzX3JlYWx2aWV3X3BiMTE3NigpKSB7CisJCXN0YXRpYyBib29sIGluc2VydGVkID0gZmFsc2U7CisKKwkJLyoKKwkJICogVGhlIFBCMTE3NiBkb2VzIG5vdCBoYXZlIHRoZSBzdGF0dXMgcmVnaXN0ZXIsCisJCSAqIGFzc3VtZSBpdCBpcyBpbnNlcnRlZCBhdCBzdGFydHVwLCB0aGVuIGludmVydAorCQkgKiBmb3IgZWFjaCBjYWxsIHNvIGNhcmQgaW5zZXJ0aW9uL3JlbW92YWwgd2lsbAorCQkgKiBiZSBkZXRlY3RlZCBhbnl3YXkuIFRoaXMgd2lsbCBub3QgYmUgY2FsbGVkIGlmCisJCSAqIEdQSU8gb24gUEwwNjEgaXMgYWN0aXZlLCB3aGljaCBpcyB0aGUgcHJvcGVyCisJCSAqIHdheSB0byBkbyB0aGlzIG9uIHRoZSBQQjExNzYuCisJCSAqLworCQlpbnNlcnRlZCA9ICFpbnNlcnRlZDsKKwkJcmV0dXJuIGluc2VydGVkID8gMCA6IDE7CisJfQorCiAJaWYgKGFkZXYtPnJlcy5zdGFydCA9PSBSRUFMVklFV19NTUNJMF9CQVNFKQogCQltYXNrID0gMTsKIAllbHNlCiAJCW1hc2sgPSAyOwogCi0JcmV0dXJuICEocmVhZGwoUkVBTFZJRVdfU1lTTUNJKSAmIG1hc2spOworCXJldHVybiByZWFkbChSRUFMVklFV19TWVNNQ0kpICYgbWFzazsKIH0KIAogc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMwX3BsYXRfZGF0YSA9IHsKQEAgLTMwMCw4ICszMTQsMTMgQEAKIAkucmF0ZQk9IDI0MDAwMDAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGs7CisKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7Ci0JewkvKiBVQVJUMCAqLworCXsJLyogQnVzIGNsb2NrICovCisJCS5jb25faWQJCT0gImFwYl9wY2xrIiwKKwkJLmNsawkJPSAmZHVtbXlfYXBiX3BjbGssCisJfSwgewkvKiBVQVJUMCAqLwogCQkuZGV2X2lkCQk9ICJkZXY6dWFydDAiLAogCQkuY2xrCQk9ICZyZWYyNF9jbGssCiAJfSwgewkvKiBVQVJUMSAqLwpAQCAtMzEzLDYgKzMzMiwxMiBAQAogCX0sIHsJLyogVUFSVDMgKi8KIAkJLmRldl9pZAkJPSAiZnBnYTp1YXJ0MyIsCiAJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIFVBUlQzIGlzIG9uIHRoZSBkZXYgY2hpcCBpbiBQQjExNzYgKi8KKwkJLmRldl9pZAkJPSAiZGV2OnVhcnQzIiwKKwkJLmNsawkJPSAmcmVmMjRfY2xrLAorCX0sIHsJLyogVUFSVDQgb25seSBleGlzdHMgaW4gUEIxMTc2ICovCisJCS5kZXZfaWQJCT0gImZwZ2E6dWFydDQiLAorCQkuY2xrCQk9ICZyZWYyNF9jbGssCiAJfSwgewkvKiBLTUkwICovCiAJCS5kZXZfaWQJCT0gImZwZ2E6a21pMCIsCiAJCS5jbGsJCT0gJnJlZjI0X2NsaywKQEAgLTMyMiwxMiArMzQ3LDE1IEBACiAJfSwgewkvKiBNTUMwICovCiAJCS5kZXZfaWQJCT0gImZwZ2E6bW1jMCIsCiAJCS5jbGsJCT0gJnJlZjI0X2NsaywKLQl9LCB7CS8qIEVCOkNMQ0QgKi8KKwl9LCB7CS8qIENMQ0QgaXMgaW4gdGhlIFBCMTE3NiBhbmQgRUIgRGV2Q2hpcCAqLwogCQkuZGV2X2lkCQk9ICJkZXY6Y2xjZCIsCiAJCS5jbGsJCT0gJm9zY3Zjb19jbGssCiAJfSwgewkvKiBQQjpDTENEICovCiAJCS5kZXZfaWQJCT0gImlzc3A6Y2xjZCIsCiAJCS5jbGsJCT0gJm9zY3Zjb19jbGssCisJfSwgewkvKiBTU1AgKi8KKwkJLmRldl9pZAkJPSAiZGV2OnNzcDAiLAorCQkuY2xrCQk9ICZyZWYyNF9jbGssCiAJfQogfTsKIApAQCAtMzQyLDcgKzM3MCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLWFyY2hfaW5pdGNhbGwoY2xrX2luaXQpOworY29yZV9pbml0Y2FsbChjbGtfaW5pdCk7CiAKIC8qCiAgKiBDTENEIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1wYjExNzYuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTE3Ni5oCmluZGV4IDJmNWNjYjIuLjAwMmFiNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTE3Ni5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTE3Ni5oCkBAIC0yNiw2ICsyNiw3IEBACiAvKgogICogUGVyaXBoZXJhbCBhZGRyZXNzZXMKICAqLworI2RlZmluZSBSRUFMVklFV19QQjExNzZfVUFSVDRfQkFTRQkJMHgxMDAwOTAwMCAvKiBVQVJUIDQgKi8KICNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1NDVExfQkFTRQkJMHgxMDEwMDAwMCAvKiBTeXN0ZW0gY29udHJvbGxlciAqLwogI2RlZmluZSBSRUFMVklFV19QQjExNzZfU01DX0JBU0UJCTB4MTAxMTEwMDAgLyogU01DICovCiAjZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9ETUNfQkFTRQkJMHgxMDEwOTAwMCAvKiBETUMgY29uZmlndXJhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvaXJxcy1wYjExNzYuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2lycXMtcGIxMTc2LmgKaW5kZXggODMwMDU1Yi4uNWMzYzYyNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvaXJxcy1wYjExNzYuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9pcnFzLXBiMTE3Ni5oCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIElSUV9EQzExNzZfTDJDQwkJKElSUV9EQzExNzZfR0lDX1NUQVJUICsgMTMpCiAjZGVmaW5lIElSUV9EQzExNzZfUlRDCQkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxNCkKICNkZWZpbmUgSVJRX0RDMTE3Nl9DTENECQkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxNSkJLyogQ0xDRCBjb250cm9sbGVyICovCisjZGVmaW5lIElSUV9EQzExNzZfU1NQCQkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxNykJLyogU1NQIHBvcnQgKi8KICNkZWZpbmUgSVJRX0RDMTE3Nl9VQVJUMAkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxOCkJLyogVUFSVCAwIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KICNkZWZpbmUgSVJRX0RDMTE3Nl9VQVJUMQkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxOSkJLyogVUFSVCAxIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KICNkZWZpbmUgSVJRX0RDMTE3Nl9VQVJUMgkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAyMCkJLyogVUFSVCAyIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KQEAgLTczLDcgKzc0LDYgQEAKICNkZWZpbmUgSVJRX1BCMTE3Nl9SVEMJCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDI1KQkvKiBSZWFsIFRpbWUgQ2xvY2sgKi8KIAogI2RlZmluZSBJUlFfUEIxMTc2X0dQSU8wCS0xCi0jZGVmaW5lIElSUV9QQjExNzZfU1NQCQktMQogI2RlZmluZSBJUlFfUEIxMTc2X1NDVEwJCS0xCiAKICNkZWZpbmUgTlJfR0lDX1BCMTE3NgkJMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAyNDE3YmJjLi41ZGFmYzE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMzAsMTAgKzMwLDkgQEAKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAmJiBkZWZpbmVkKENPTkZJR19aT05FX0RNQSkKLWV4dGVybiB2b2lkIHJlYWx2aWV3X2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgKmhvbGUpOwotI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyhub2RlLCBzaXplLCBob2xlKSBcCi0JcmVhbHZpZXdfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGUpCitleHRlcm4gdm9pZCByZWFsdmlld19hZGp1c3Rfem9uZXModW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgbG9uZyAqaG9sZSk7CisjZGVmaW5lIGFyY2hfYWRqdXN0X3pvbmVzKHNpemUsIGhvbGUpIFwKKwlyZWFsdmlld19hZGp1c3Rfem9uZXMoc2l6ZSwgaG9sZSkKIAogI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAkoUEhZU19PRkZTRVQgKyBTWl8yNTZNIC0gMSkKICNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyBTWl8yNTZNKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCmluZGV4IDQ0MjUwMTguLjk5MWMxZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDIyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTEyOSw2ICsxMzAsMTIgQEAKIAkuaXJxX2Jhc2UJPSAtMSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGwwMjJfc3NwX2NvbnRyb2xsZXIgc3NwMF9wbGF0X2RhdGEgPSB7CisJLmJ1c19pZCA9IDAsCisJLmVuYWJsZV9kbWEgPSAwLAorCS5udW1fY2hpcHNlbGVjdCA9IDEsCit9OworCiAvKgogICogUmVhbFZpZXcgRUIgQU1CQSBkZXZpY2VzCiAgKi8KQEAgLTIxMyw3ICsyMjAsNyBAQAogQU1CQV9ERVZJQ0UodWFydDAsICJkZXY6dWFydDAiLCBFQl9VQVJUMCwgTlVMTCk7CiBBTUJBX0RFVklDRSh1YXJ0MSwgImRldjp1YXJ0MSIsIEVCX1VBUlQxLCBOVUxMKTsKIEFNQkFfREVWSUNFKHVhcnQyLCAiZGV2OnVhcnQyIiwgRUJfVUFSVDIsIE5VTEwpOwotQU1CQV9ERVZJQ0Uoc3NwMCwgICJkZXY6c3NwMCIsICBFQl9TU1AsICAgTlVMTCk7CitBTUJBX0RFVklDRShzc3AwLCAgImRldjpzc3AwIiwgIEVCX1NTUCwgICAmc3NwMF9wbGF0X2RhdGEpOwogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlICphbWJhX2RldnNbXSBfX2luaXRkYXRhID0gewogCSZkbWFjX2RldmljZSwKQEAgLTMyNCw2ICszMzEsMjYgQEAKIAkucmVzb3VyY2UJCT0gcG11X3Jlc291cmNlcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2hhcl9sY2RfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBSRUFMVklFV19DSEFSX0xDRF9CQVNFLAorCQkuZW5kICAgPSAoUkVBTFZJRVdfQ0hBUl9MQ0RfQkFTRSArIFNaXzRLIC0gMSksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBJUlFfRUJfQ0hBUkxDRCwKKwkJLmVuZAk9IElSUV9FQl9DSEFSTENELAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2hhcl9sY2RfZGV2aWNlID0geworCS5uYW1lCQk9CSJhcm0tY2hhcmxjZCIsCisJLmlkCQk9CS0xLAorCS5udW1fcmVzb3VyY2VzCT0JQVJSQVlfU0laRShjaGFyX2xjZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9CWNoYXJfbGNkX3Jlc291cmNlcywKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBnaWNfaW5pdF9pcnEodm9pZCkKIHsKIAlpZiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpIHsKQEAgLTQ0Miw2ICs0NjksNyBAQAogCiAJcmVhbHZpZXdfZmxhc2hfcmVnaXN0ZXIoJnJlYWx2aWV3X2ViX2ZsYXNoX3Jlc291cmNlLCAxKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJlYWx2aWV3X2kyY19kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY2hhcl9sY2RfZGV2aWNlKTsKIAlldGhfZGV2aWNlX3JlZ2lzdGVyKCk7CiAJcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHJlYWx2aWV3X2ViX2lzcDE3NjFfcmVzb3VyY2VzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKaW5kZXggMDk5YTFmMS4uZDJiZTEyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xMjMsNiArMTI0LDEyIEBACiAJLmlycV9iYXNlCT0gLTEsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyIHNzcDBfcGxhdF9kYXRhID0geworCS5idXNfaWQgPSAwLAorCS5lbmFibGVfZG1hID0gMCwKKwkubnVtX2NoaXBzZWxlY3QgPSAxLAorfTsKKwogLyoKICAqIFJlYWxWaWV3IFBCMTE3NiBBTUJBIGRldmljZXMKICAqLwpAQCAtMTQ0LDggKzE1MSw2IEBACiAjZGVmaW5lIE1QTUNfRE1BCXsgMCwgMCB9CiAjZGVmaW5lIFBCMTE3Nl9DTENEX0lSUQl7IElSUV9EQzExNzZfQ0xDRCwgTk9fSVJRIH0KICNkZWZpbmUgUEIxMTc2X0NMQ0RfRE1BCXsgMCwgMCB9Ci0jZGVmaW5lIERNQUNfSVJRCXsgSVJRX1BCMTE3Nl9ETUFDLCBOT19JUlEgfQotI2RlZmluZSBETUFDX0RNQQl7IDAsIDAgfQogI2RlZmluZSBTQ1RMX0lSUQl7IE5PX0lSUSwgTk9fSVJRIH0KICNkZWZpbmUgU0NUTF9ETUEJeyAwLCAwIH0KICNkZWZpbmUgUEIxMTc2X1dBVENIRE9HX0lSUQl7IElSUV9EQzExNzZfV0FUQ0hET0csIE5PX0lSUSB9CkBAIC0xNjYsNyArMTcxLDkgQEAKICNkZWZpbmUgUEIxMTc2X1VBUlQyX0RNQQl7IDExLCAxMCB9CiAjZGVmaW5lIFBCMTE3Nl9VQVJUM19JUlEJeyBJUlFfREMxMTc2X1VBUlQzLCBOT19JUlEgfQogI2RlZmluZSBQQjExNzZfVUFSVDNfRE1BCXsgMHg4NiwgMHg4NyB9Ci0jZGVmaW5lIFBCMTE3Nl9TU1BfSVJRCQl7IElSUV9QQjExNzZfU1NQLCBOT19JUlEgfQorI2RlZmluZSBQQjExNzZfVUFSVDRfSVJRCXsgSVJRX1BCMTE3Nl9VQVJUNCwgTk9fSVJRIH0KKyNkZWZpbmUgUEIxMTc2X1VBUlQ0X0RNQQl7IDAsIDAgfQorI2RlZmluZSBQQjExNzZfU1NQX0lSUQkJeyBJUlFfREMxMTc2X1NTUCwgTk9fSVJRIH0KICNkZWZpbmUgUEIxMTc2X1NTUF9ETUEJCXsgOSwgOCB9CiAKIC8qIEZQR0EgUHJpbWVjZWxscyAqLwpAQCAtMTc0LDcgKzE4MSw3IEBACiBBTUJBX0RFVklDRShtbWMwLAkiZnBnYTptbWMwIiwJTU1DSTAsCQkmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOwogQU1CQV9ERVZJQ0Uoa21pMCwJImZwZ2E6a21pMCIsCUtNSTAsCQlOVUxMKTsKIEFNQkFfREVWSUNFKGttaTEsCSJmcGdhOmttaTEiLAlLTUkxLAkJTlVMTCk7Ci1BTUJBX0RFVklDRSh1YXJ0MywJImZwZ2E6dWFydDMiLAlQQjExNzZfVUFSVDMsCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDQsCSJmcGdhOnVhcnQ0IiwJUEIxMTc2X1VBUlQ0LAlOVUxMKTsKIAogLyogRGV2Q2hpcCBQcmltZWNlbGxzICovCiBBTUJBX0RFVklDRShzbWMsCSJkZXY6c21jIiwJUEIxMTc2X1NNQywJTlVMTCk7CkBAIC0xODgsMTggKzE5NSwxNiBAQAogQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6dWFydDAiLAlQQjExNzZfVUFSVDAsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDEsCSJkZXY6dWFydDEiLAlQQjExNzZfVUFSVDEsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQjExNzZfVUFSVDIsCU5VTEwpOwotQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpzc3AwIiwJUEIxMTc2X1NTUCwJTlVMTCk7Ci0KLS8qIFByaW1lY2VsbHMgb24gdGhlIE5FQyBJU1NQIGNoaXAgKi8KLUFNQkFfREVWSUNFKGNsY2QsCSJpc3NwOmNsY2QiLAlQQjExNzZfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLS8vQU1CQV9ERVZJQ0UoZG1hYywJImlzc3A6ZG1hYyIsCVBCMTE3Nl9ETUFDLAlOVUxMKTsKK0FNQkFfREVWSUNFKHVhcnQzLAkiZGV2OnVhcnQzIiwJUEIxMTc2X1VBUlQzLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNzcDAsCSJkZXY6c3NwMCIsCVBCMTE3Nl9TU1AsCSZzc3AwX3BsYXRfZGF0YSk7CitBTUJBX0RFVklDRShjbGNkLAkiZGV2OmNsY2QiLAlQQjExNzZfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLS8vCSZkbWFjX2RldmljZSwKIAkmdWFydDBfZGV2aWNlLAogCSZ1YXJ0MV9kZXZpY2UsCiAJJnVhcnQyX2RldmljZSwKIAkmdWFydDNfZGV2aWNlLAorCSZ1YXJ0NF9kZXZpY2UsCiAJJnNtY19kZXZpY2UsCiAJJmNsY2RfZGV2aWNlLAogCSZzY3RsX2RldmljZSwKQEAgLTI3Niw2ICsyODEsMjYgQEAKIAkucmVzb3VyY2UJCT0gJnBtdV9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2hhcl9sY2RfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBSRUFMVklFV19DSEFSX0xDRF9CQVNFLAorCQkuZW5kICAgPSAoUkVBTFZJRVdfQ0hBUl9MQ0RfQkFTRSArIFNaXzRLIC0gMSksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBJUlFfUEIxMTc2X0NIQVJMQ0QsCisJCS5lbmQJPSBJUlFfUEIxMTc2X0NIQVJMQ0QsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjaGFyX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0JImFybS1jaGFybGNkIiwKKwkuaWQJCT0JLTEsCisJLm51bV9yZXNvdXJjZXMJPQlBUlJBWV9TSVpFKGNoYXJfbGNkX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0JY2hhcl9sY2RfcmVzb3VyY2VzLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGdpY19pbml0X2lycSh2b2lkKQogewogCS8qIEFSTTExNzYgRGV2Q2hpcCBHSUMsIHByaW1hcnkgKi8KQEAgLTMzOCw2ICszNjMsNyBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfaTJjX2RldmljZSk7CiAJcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHJlYWx2aWV3X3BiMTE3Nl9pc3AxNzYxX3Jlc291cmNlcyk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmNoYXJfbGNkX2RldmljZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKIAkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKaW5kZXggMGUwN2E1Yy4uZDU5MWJjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xMjQsNiArMTI1LDEyIEBACiAJLmlycV9iYXNlCT0gLTEsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyIHNzcDBfcGxhdF9kYXRhID0geworCS5idXNfaWQgPSAwLAorCS5lbmFibGVfZG1hID0gMCwKKwkubnVtX2NoaXBzZWxlY3QgPSAxLAorfTsKKwogLyoKICAqIFJlYWxWaWV3IFBCMTFNUENvcmUgQU1CQSBkZXZpY2VzCiAgKi8KQEAgLTE5MCw3ICsxOTcsNyBAQAogQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6dWFydDAiLAlQQjExTVBfVUFSVDAsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDEsCSJkZXY6dWFydDEiLAlQQjExTVBfVUFSVDEsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQjExTVBfVUFSVDIsCU5VTEwpOwotQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpzc3AwIiwJUEIxMU1QX1NTUCwJTlVMTCk7CitBTUJBX0RFVklDRShzc3AwLAkiZGV2OnNzcDAiLAlQQjExTVBfU1NQLAkmc3NwMF9wbGF0X2RhdGEpOwogCiAvKiBQcmltZWNlbGxzIG9uIHRoZSBORUMgSVNTUCBjaGlwICovCiBBTUJBX0RFVklDRShjbGNkLAkiaXNzcDpjbGNkIiwJUEIxMU1QX0NMQ0QsCSZjbGNkX3BsYXRfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCmluZGV4IGFjMmYwNmYuLjZjMzc2MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0xMTQsNiArMTE1LDEyIEBACiAJLmlycV9iYXNlCT0gLTEsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyIHNzcDBfcGxhdF9kYXRhID0geworCS5idXNfaWQgPSAwLAorCS5lbmFibGVfZG1hID0gMCwKKwkubnVtX2NoaXBzZWxlY3QgPSAxLAorfTsKKwogLyoKICAqIFJlYWxWaWV3IFBCQThDb3JlIEFNQkEgZGV2aWNlcwogICovCkBAIC0xODAsNyArMTg3LDcgQEAKIEFNQkFfREVWSUNFKHVhcnQwLAkiZGV2OnVhcnQwIiwJUEJBOF9VQVJUMCwJTlVMTCk7CiBBTUJBX0RFVklDRSh1YXJ0MSwJImRldjp1YXJ0MSIsCVBCQThfVUFSVDEsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQkE4X1VBUlQyLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNzcDAsCSJkZXY6c3NwMCIsCVBCQThfU1NQLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNzcDAsCSJkZXY6c3NwMCIsCVBCQThfU1NQLAkmc3NwMF9wbGF0X2RhdGEpOwogCiAvKiBQcmltZWNlbGxzIG9uIHRoZSBORUMgSVNTUCBjaGlwICovCiBBTUJBX0RFVklDRShjbGNkLAkiaXNzcDpjbGNkIiwJUEJBOF9DTENELAkmY2xjZF9wbGF0X2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKaW5kZXggMDhmZDY4My4uOTQyOGVmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BieC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0xMzYsNiArMTM3LDEyIEBACiAJLmlycV9iYXNlCT0gLTEsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyIHNzcDBfcGxhdF9kYXRhID0geworCS5idXNfaWQgPSAwLAorCS5lbmFibGVfZG1hID0gMCwKKwkubnVtX2NoaXBzZWxlY3QgPSAxLAorfTsKKwogLyoKICAqIFJlYWxWaWV3IFBCWENvcmUgQU1CQSBkZXZpY2VzCiAgKi8KQEAgLTIwMiw3ICsyMDksNyBAQAogQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6dWFydDAiLAlQQlhfVUFSVDAsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDEsCSJkZXY6dWFydDEiLAlQQlhfVUFSVDEsCU5VTEwpOwogQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQlhfVUFSVDIsCU5VTEwpOwotQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpzc3AwIiwJUEJYX1NTUCwJTlVMTCk7CitBTUJBX0RFVklDRShzc3AwLAkiZGV2OnNzcDAiLAlQQlhfU1NQLAkmc3NwMF9wbGF0X2RhdGEpOwogCiAvKiBQcmltZWNlbGxzIG9uIHRoZSBORUMgSVNTUCBjaGlwICovCiBBTUJBX0RFVklDRShjbGNkLAkiaXNzcDpjbGNkIiwJUEJYX0NMQ0QsCSZjbGNkX3BsYXRfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCA3NzliNDViLi4zYmEzYmFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgpAQCAtMzA0LDYgKzMwNSwxMyBAQAogCXMzY19wbV9pbml0KCk7CiB9CiAKKy8qIEgxOTQwIGFuZCBSWDM3MTUgbmVlZCB0byByZXNlcnZlIHRoaXMgZm9yIHN1c3BlbmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBoMTk0MF9yZXNlcnZlKHZvaWQpCit7CisJbWVtYmxvY2tfcmVzZXJ2ZSgweDMwMDAzMDAwLCAweDEwMDApOworCW1lbWJsb2NrX3Jlc2VydmUoMHgzMDA4MTAwMCwgMHgxMDAwKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IGgxOTQwX2luaXRfaXJxKHZvaWQpCiB7CiAJczNjMjR4eF9pbml0X2lycSgpOwpAQCAtMzQ2LDYgKzM1NCw3IEBACiAJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKIAkubWFwX2lvCQk9IGgxOTQwX21hcF9pbywKKwkucmVzZXJ2ZQk9IGgxOTQwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gaDE5NDBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGgxOTQwX2luaXQsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXNtZGsyNDEzLmMKaW5kZXggYmE5M2EzNS4uMDU0YzlmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jCkBAIC0xMTksNyArMTE5LDYgQEAKIAkJbWktPm5yX2JhbmtzPTE7CiAJCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHgzMDAwMDAwMDsKIAkJbWktPmJhbmtbMF0uc2l6ZSA9IFNaXzY0TTsKLQkJbWktPmJhbmtbMF0ubm9kZSA9IDA7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYwppbmRleCAzY2E5MjY1Li5mMjkxYWMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXZzdG1zLmMKQEAgLTEzNyw3ICsxMzcsNiBAQAogCQltaS0+bnJfYmFua3M9MTsKIAkJbWktPmJhbmtbMF0uc3RhcnQgPSAweDMwMDAwMDAwOwogCQltaS0+YmFua1swXS5zaXplID0gU1pfNjRNOwotCQltaS0+YmFua1swXS5ub2RlID0gMDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MTk1MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMKaW5kZXggODYwM2I1Ny4uMTQyZDFmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01NzAsMTIgKzU3MSwyMCBAQAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHJ4MTk1MF9kZXZpY2VzLCBBUlJBWV9TSVpFKHJ4MTk1MF9kZXZpY2VzKSk7CiB9CiAKKy8qIEgxOTQwIGFuZCBSWDM3MTUgbmVlZCB0byByZXNlcnZlIHRoaXMgZm9yIHN1c3BlbmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByeDE5NTBfcmVzZXJ2ZSh2b2lkKQoreworCW1lbWJsb2NrX3Jlc2VydmUoMHgzMDAwMzAwMCwgMHgxMDAwKTsKKwltZW1ibG9ja19yZXNlcnZlKDB4MzAwODEwMDAsIDB4MTAwMCk7Cit9CisKIE1BQ0hJTkVfU1RBUlQoUlgxOTUwLCAiSFAgaVBBUSBSWDE5NTAiKQogICAgIC8qIE1haW50YWluZXJzOiBWYXNpbHkgS2hvcnV6aGljayAqLwogICAgIC5waHlzX2lvID0gUzNDMjQxMF9QQV9VQVJULAogCS5pb19wZ19vZmZzdCA9ICgoKHUzMikgUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zID0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAogCS5tYXBfaW8gPSByeDE5NTBfbWFwX2lvLAorCS5yZXNlcnZlCT0gcngxOTUwX3Jlc2VydmUsCiAJLmluaXRfaXJxID0gczNjMjR4eF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lID0gcngxOTUwX2luaXRfbWFjaGluZSwKIAkudGltZXIgPSAmczNjMjR4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MzcxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKaW5kZXggZDI5NDZkZS4uNmJiNDRmNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtMTkxLDYgKzE5MiwxMyBAQAogCXMzYzI0eHhfaW5pdF91YXJ0cyhyeDM3MTVfdWFydGNmZ3MsIEFSUkFZX1NJWkUocngzNzE1X3VhcnRjZmdzKSk7CiB9CiAKKy8qIEgxOTQwIGFuZCBSWDM3MTUgbmVlZCB0byByZXNlcnZlIHRoaXMgZm9yIHN1c3BlbmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByeDM3MTVfcmVzZXJ2ZSh2b2lkKQoreworCW1lbWJsb2NrX3Jlc2VydmUoMHgzMDAwMzAwMCwgMHgxMDAwKTsKKwltZW1ibG9ja19yZXNlcnZlKDB4MzAwODEwMDAsIDB4MTAwMCk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCByeDM3MTVfaW5pdF9pcnEodm9pZCkKIHsKIAlzM2MyNHh4X2luaXRfaXJxKCk7CkBAIC0yMTQsNiArMjIyLDcgQEAKIAkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAogCS5tYXBfaW8JCT0gcngzNzE1X21hcF9pbywKKwkucmVzZXJ2ZQk9IHJ4MzcxNV9yZXNlcnZlLAogCS5pbml0X2lycQk9IHJ4MzcxNV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gcngzNzE1X2luaXRfbWFjaGluZSwKIAkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCmluZGV4IDVkNWYzMzAuLjE2ZTY4MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCiAgKiBDaGFuZ2VMb2c6Ci0gKiAgMjAwNiBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKiAgMjAwNiBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqICAwMy0wNi0yMDA0IEpvaG4gTGVueiA8bGVuekBjcy53aXNjLmVkdT4KICAqICAwNi0wNC0yMDAyIENocmlzIExhcnNvbiA8a2VyZ290aEBkaWdpdGFsbmVtZXNpcy5uZXQ+CiAgKiAgMDQtMTYtMjAwMSBMaW5lbyBKYXBhbixJbmMuIC4uLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oCmluZGV4IGVjMDNmMTguLmI3YTlhNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmgKQEAgLTEzLDggKzEzLDcgQEAKIAogI2RlZmluZSBTRVRfQkFOSyhfX25yLF9fc3RhcnQsX19zaXplKSBcCiAJbWktPmJhbmtbX19ucl0uc3RhcnQgPSAoX19zdGFydCksIFwKLQltaS0+YmFua1tfX25yXS5zaXplID0gKF9fc2l6ZSksIFwKLQltaS0+YmFua1tfX25yXS5ub2RlID0gKCgodW5zaWduZWQpKF9fc3RhcnQpIC0gUEhZU19PRkZTRVQpID4+IDI3KQorCW1pLT5iYW5rW19fbnJdLnNpemUgPSAoX19zaXplKQogCiBleHRlcm4gdm9pZCAoKnNhMTEwMGZiX2JhY2tsaWdodF9wb3dlcikoaW50IG9uKTsKIGV4dGVybiB2b2lkICgqc2ExMTAwZmJfbGNkX3Bvd2VyKShpbnQgb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGQ1Mjc3ZjkuLjEyOGExZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE3LDEwICsxNywxMCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2lmZGVmIENPTkZJR19TQTExMTEKLXZvaWQgc2ExMTExX2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdW5zaWduZWQgbG9uZyAqaG9sZXMpOwordm9pZCBzYTExMTFfYWRqdXN0X3pvbmVzKHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGxvbmcgKmhvbGVzKTsKIAotI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyhub2RlLCBzaXplLCBob2xlcykgXAotCXNhMTExMV9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpCisjZGVmaW5lIGFyY2hfYWRqdXN0X3pvbmVzKHNpemUsIGhvbGVzKSBcCisJc2ExMTExX2FkanVzdF96b25lcyhzaXplLCBob2xlcykKIAogI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAkoUEhZU19PRkZTRVQgKyBTWl8xTSAtIDEpCiAjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgU1pfMU0pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDMwNTNlNWIuLmQ5YzQ4MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xOSw5ICsxOSw4IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfYWRqdXN0X3pvbmVzKGludCBub2RlLCB1bnNpZ25lZCBsb25nICp6b25lX3NpemUsIHVuc2lnbmVkIGxvbmcgKnpob2xlX3NpemUpIAorc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9hZGp1c3Rfem9uZXModW5zaWduZWQgbG9uZyAqem9uZV9zaXplLCB1bnNpZ25lZCBsb25nICp6aG9sZV9zaXplKQogewotICBpZiAobm9kZSAhPSAwKSByZXR1cm47CiAgIC8qIE9ubHkgdGhlIGZpcnN0IDQgTUIgKD0xMDI0IFBhZ2VzKSBhcmUgdXNhYmxlIGZvciBETUEgKi8KICAgLyogU2VlIGRldiAvIC0+IC5wcm9wZXJ0aWVzIGluIE9wZW5GaXJtd2FyZS4gKi8KICAgem9uZV9zaXplWzFdID0gem9uZV9zaXplWzBdIC0gMTAyNDsKQEAgLTMwLDggKzI5LDggQEAKICAgemhvbGVfc2l6ZVswXSA9IDA7CiB9CiAKLSNkZWZpbmUgYXJjaF9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpIFwKLQlfX2FyY2hfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQorI2RlZmluZSBhcmNoX2FkanVzdF96b25lcyhzaXplLCBob2xlcykgXAorCV9fYXJjaF9hZGp1c3Rfem9uZXMoc2l6ZSwgaG9sZXMpCiAKICNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQJKFBIWVNfT0ZGU0VUICsgU1pfNE0gLSAxKQogI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCShQQUdFX09GRlNFVCArIFNaXzRNKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCmluZGV4IGYyYjg4YzUuLjRjNzA0YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKQEAgLTcwLDYgKzcwLDE4IEBACiAKIG1lbnUgIlRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uIgogCitjb25maWcgU0hNT0JJTEVfVElNRVJfSFoKKwlpbnQgIktlcm5lbCBIWiAoamlmZmllcyBwZXIgc2Vjb25kKSIKKwlyYW5nZSAzMiAxMDI0CisJZGVmYXVsdCAiMTI4IgorCWhlbHAKKwkgIEFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGltZXIgZnJlcXVlbmN5LiBJdCBpcyBjdXN0b21hcnkKKwkgIHRvIGhhdmUgdGhlIHRpbWVyIGludGVycnVwdCBydW4gYXQgMTAwMCBIeiBvciAxMDAgSHosIGJ1dCBpbiB0aGUKKwkgIGNhc2Ugb2YgbG93IHRpbWVyIGZyZXF1ZW5jaWVzIG90aGVyIHZhbHVlcyBtYXkgYmUgbW9yZSBzdWl0YWJsZS4KKwkgIFNILU1vYmlsZSBzeXN0ZW1zIHVzaW5nIGEgMzI3NjggSHogUkNMSyBmb3IgY2xvY2sgZXZlbnRzIG1heSB3YW50CisJICB0byBzZWxlY3QgYSBIWiB2YWx1ZSBzdWNoIGFzIDEyOCB0aGF0IGNhbiBldmVubHkgZGl2aWRlIFJDTEsuCisJICBBIEhaIHZhbHVlIHRoYXQgZG9lcyBub3QgZGl2aWRlIGV2ZW5seSBtYXkgY2F1c2UgdGltZXIgZHJpZnQuCisKIGNvbmZpZyBTSF9USU1FUl9DTVQKIAlib29sICJDTVQgdGltZXIgZHJpdmVyIgogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDUxNzliNzIuLjEzMjI1NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9fQVNNX01BQ0hfSVJRU19ICiAKICNkZWZpbmUgTlJfSVJRUyAgICAgICAgIDUxMgotI2RlZmluZSBOUl9JUlFTX0xFR0FDWSAgOAogCiAjZGVmaW5lIGV2dDJpcnEoZXZ0KQkJKCgoZXZ0KSA+PiA1KSAtIDE2KQogI2RlZmluZSBpcnEyZXZ0KGlycSkJCSgoKGlycSkgKyAxNikgPDwgNSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvY2xvY2suYwppbmRleCAzOWY2Y2NmLi4xOGZlYmY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9jbG9jay5jCkBAIC0zNDEsOCArMzQxLDExIEBACiAJLnJlY2FsYyA9ICZmb2xsb3dfcGFyZW50LAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGs7CisKIC8qIGFycmF5IG9mIGFsbCBzcGVhciAzeHggY2xvY2sgbG9va3VwcyAqLwogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHNwZWFyX2Nsa19sb29rdXBzW10gPSB7CisJeyAuY29uX2lkID0gImFwYl9wY2xrIiwJLmNsayA9ICZkdW1teV9hcGJfcGNsa30sCiAJLyogcm9vdCBjbGtzICovCiAJeyAuY29uX2lkID0gIm9zY18zMmtfY2xrIiwJLmNsayA9ICZvc2NfMzJrX2Nsa30sCiAJeyAuY29uX2lkID0gIm9zY18yNG1fY2xrIiwJLmNsayA9ICZvc2NfMjRtX2Nsa30sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L2Nsb2NrLmMKaW5kZXggMTNlMjdjNy4uMzZmZjA1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtc3BlYXI2eHgvY2xvY2suYwpAQCAtNDI4LDggKzQyOCwxMSBAQAogCS5yZWNhbGMgPSAmZm9sbG93X3BhcmVudCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrOworCiAvKiBhcnJheSBvZiBhbGwgc3BlYXIgNnh4IGNsb2NrIGxvb2t1cHMgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBzcGVhcl9jbGtfbG9va3Vwc1tdID0geworCXsgLmNvbl9pZCA9ICJhcGJfcGNsayIsCS5jbGsgPSAmZHVtbXlfYXBiX3BjbGt9LAogCS8qIHJvb3QgY2xrcyAqLwogCXsgLmNvbl9pZCA9ICJvc2NfMzJrX2NsayIsCS5jbGsgPSAmb3NjXzMya19jbGt9LAogCXsgLmNvbl9pZCA9ICJvc2NfMzBtX2NsayIsCS5jbGsgPSAmb3NjXzMwbV9jbGt9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvY2xvY2suYwppbmRleCA1YWY3MWQ1Li41ZDEyZDU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvY2xvY2suYwpAQCAtMTIxMiw2ICsxMjEyLDggQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGs7CisKICNkZWZpbmUgREVGX0xPT0tVUChkZXZpZCwgY2xrcmVmKQkJXAogCXsJCQkJCVwKIAkuZGV2X2lkID0gZGV2aWQsCQkJXApAQCAtMTIyMyw2ICsxMjI1LDEwIEBACiAgKiBsb29rIHVwIHRocm91Z2ggY2xvY2tkZXZpY2UuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CisJeworCQkuY29uX2lkID0gImFwYl9wY2xrIiwKKwkJLmNsayA9ICZkdW1teV9hcGJfcGNsaywKKwl9LAogCS8qIENvbm5lY3RlZCBkaXJlY3RseSB0byB0aGUgQU1CQSBidXMgKi8KIAlERUZfTE9PS1VQKCJhbWJhIiwgICAgICAmYW1iYV9jbGspLAogCURFRl9MT09LVVAoImNwdSIsICAgICAgICZjcHVfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvY29yZS5jCmluZGV4IDVmMzRlYjYuLjY1M2IzZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2NvcmUuYwpAQCAtMTU2MSwxMyArMTU2MSw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIFUzMDAgc3lzdGVtIG9uICVzIGJhc2ViYW5kIGNoaXAgIiBcCiAJICAgICAgICIoY2hpcCBJRCAweCUwNHgpXG4iLCBjaGlwbmFtZSwgdmFsKTsKIAotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMyNgotCWlmICgodmFsICYgMHhGRjAwVSkgIT0gMHhjODAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUGxhdGZvcm0gY29uZmlndXJlZCBmb3IgQlMyNS9CUzI2ICIgXAotCQkgICAgICAgIndpdGggREIzMTUwIGJ1dCAlcyBkZXRlY3RlZCwgZXhwZWN0IHByb2JsZW1zISIsCi0JCSAgICAgICBjaGlwbmFtZSk7Ci0JfQotI2VuZGlmCiAjaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzMzMAogCWlmICgodmFsICYgMHhGRjAwVSkgIT0gMHhkODAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUGxhdGZvcm0gY29uZmlndXJlZCBmb3IgQlMzMzAgIiBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC11MzAwL2dwaW8uYwppbmRleCA1ZjYxZmQ0Li5kOTI3OTAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9ncGlvLmMKQEAgLTUyMyw3ICs1MjMsNyBAQAogCiAJLyoKIAkgKiBQdXQgYWxsIHBpbnMgdGhhdCBhcmUgc2V0IHRvIGVpdGhlciAnR1BJT19PVVQnIG9yICdHUElPX05PVF9VU0VEJwotCSAqIHRvIG91dHB1dCBhbmQgJ0dQSU9fSU4nIHRvIGlucHV0IGZvciBlYWNoIHBvcnQuIEFuZCBpbml0YWxpemUKKwkgKiB0byBvdXRwdXQgYW5kICdHUElPX0lOJyB0byBpbnB1dCBmb3IgZWFjaCBwb3J0LiBBbmQgaW5pdGlhbGl6ZQogCSAqIGRlZmF1bHQgdmFsdWUgb24gb3V0cHV0cy4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgVTMwMF9HUElPX05VTV9QT1JUUzsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBhYjAwMGRmLi5iZjEzNGJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTM1LDE0ICszNSw2IEBACiAjZW5kaWYKIAogLyoKLSAqIFRDTSBtZW1vcnkgd2hlcmVhYm91dHMKLSAqLwotI2RlZmluZSBJVENNX09GRlNFVAkweGZmZmYyMDAwCi0jZGVmaW5lIElUQ01fRU5ECTB4ZmZmZjNmZmYKLSNkZWZpbmUgRFRDTV9PRkZTRVQJMHhmZmZmNDAwMAotI2RlZmluZSBEVENNX0VORAkweGZmZmY1ZmZmCi0KLS8qCiAgKiBXZSBlbmFibGUgYSByZWFsIGJpZyBETUEgYnVmZmVyIGlmIG5lZWQgYmUuCiAgKi8KICNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRSBTWl80TQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL3UzMDAuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC91MzAwLmMKaW5kZXggZDJhMGI4OC4uYmZjZGE5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL3UzMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvdTMwMC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMjIsNiArMjMsMjEgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAorc3RhdGljIHZvaWQgX19pbml0IHUzMDBfcmVzZXJ2ZSh2b2lkKQoreworCS8qCisJICogVTMwMCAtIFRoaXMgcGxhdGZvcm0gZmFtaWx5IGNhbiBzaGFyZSBwaHlzaWNhbCBtZW1vcnkKKwkgKiBiZXR3ZWVuIHR3byBBUk0gY3B1cywgb25lIHJ1bm5pbmcgTGludXggYW5kIHRoZSBvdGhlcgorCSAqIHJ1bm5pbmcgYW5vdGhlciBPUy4KKwkgKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX1NJTkdMRV9SQU0KKyNpZiAoKENPTkZJR19NQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFICYgMSkgPT0gMSkgJiYgXAorCUNPTkZJR19NQUNIX1UzMDBfMk1CX0FMSUdOTUVOVF9GSVgKKyAgICAgICAgbWVtYmxvY2tfcmVzZXJ2ZShQSFlTX09GRlNFVCwgMHgwMDEwMDAwMCk7CisjZW5kaWYKKyNlbmRpZgorfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgdTMwMF9pbml0X21hY2hpbmUodm9pZCkKIHsKIAl1MzAwX2luaXRfZGV2aWNlcygpOwpAQCAtNDksNiArNjUsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoVTMwMF9BSEJfUEVSX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IEJPT1RfUEFSQU1TX09GRlNFVCwKIAkubWFwX2lvCQk9IHUzMDBfbWFwX2lvLAorCS5yZXNlcnZlCT0gdTMwMF9yZXNlcnZlLAogCS5pbml0X2lycQk9IHUzMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZ1MzAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSB1MzAwX2luaXRfbWFjaGluZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCmluZGV4IGJiOGQ3YjcuLjBlOGZkMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYwpAQCAtMTMsMTkgKzEzLDQyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDIyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYjg1MDAuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCisjaW5jbHVkZSA8cGxhdC9waW5jZmcuaD4KICNpbmNsdWRlIDxwbGF0L2kyYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KIAorI2luY2x1ZGUgInBpbnMtZGI4NTAwLmgiCisKK3N0YXRpYyBwaW5fY2ZnX3QgbW9wNTAwX3BpbnNbXSA9IHsKKwkvKiBTU1AwICovCisJR1BJTzE0M19TU1AwX0NMSywKKwlHUElPMTQ0X1NTUDBfRlJNLAorCUdQSU8xNDVfU1NQMF9SWEQsCisJR1BJTzE0Nl9TU1AwX1RYRCwKKworCS8qIEkyQyAqLworCUdQSU8xNDdfSTJDMF9TQ0wsCisJR1BJTzE0OF9JMkMwX1NEQSwKKwlHUElPMTZfSTJDMV9TQ0wsCisJR1BJTzE3X0kyQzFfU0RBLAorCUdQSU8xMF9JMkMyX1NEQSwKKwlHUElPMTFfSTJDMl9TQ0wsCisJR1BJTzIyOV9JMkMzX1NEQSwKKwlHUElPMjMwX0kyQzNfU0NMLAorfTsKKwogc3RhdGljIHZvaWQgYWI0NTAwX3NwaV9jc19jb250cm9sKHUzMiBjb21tYW5kKQogewogCS8qIHNldCB0aGUgRlJNIHNpZ25hbCwgd2hpY2ggaXMgQ1MgIC0gVE9ETyAqLwpAQCAtNDgsMTUgKzcxLDIwIEBACiAJLmNzX2NvbnRyb2wgPSBhYjQ1MDBfc3BpX2NzX2NvbnRyb2wsCiB9OwogCitzdGF0aWMgc3RydWN0IGFiODUwMF9wbGF0Zm9ybV9kYXRhIGFiODUwMF9wbGF0ZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBNT1A1MDBfQUI4NTAwX0lSUV9CQVNFLAorfTsKKwogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyB1ODUwMF9zcGlfZGV2aWNlc1tdID0gewogCXsKIAkJLm1vZGFsaWFzID0gImFiODUwMCIsCiAJCS5jb250cm9sbGVyX2RhdGEgPSAmYWI0NTAwX2NoaXBfaW5mbywKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYWI4NTAwX3BsYXRkYXRhLAogCQkubWF4X3NwZWVkX2h6ID0gMTIwMDAwMDAsCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMCwKIAkJLm1vZGUgPSBTUElfTU9ERV8wLAotCQkuaXJxID0gSVJRX0FCNDUwMCwKKwkJLmlycSA9IElSUV9EQjg1MDBfQUI4NTAwLAogCX0sCiB9OwogCkBAIC0xMTgsNiArMTQ2LDEwIEBACiB7CiAJaW50IGk7CiAKKwl1ODUwMF9pbml0X2RldmljZXMoKTsKKworCW5ta19jb25maWdfcGlucyhtb3A1MDBfcGlucywgQVJSQVlfU0laRShtb3A1MDBfcGlucykpOworCiAJdTg1MDBfaTJjMF9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSAmdTg1MDBfaTJjMF9kYXRhOwogCXV4NTAwX2kyYzFfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gJnU4NTAwX2kyYzFfZGF0YTsKIAl1eDUwMF9pMmMyX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9ICZ1ODUwMF9pMmMyX2RhdGE7CkBAIC0xMzMsOCArMTY1LDYgQEAKIAogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHU4NTAwX3NwaV9kZXZpY2VzLAogCQkJQVJSQVlfU0laRSh1ODUwMF9zcGlfZGV2aWNlcykpOwotCi0JdTg1MDBfaW5pdF9kZXZpY2VzKCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoVTg1MDAsICJTVC1Fcmljc3NvbiBNT1A1MDAgcGxhdGZvcm0iKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jbG9jay5jCmluZGV4IDBhMTMxOGYuLmQ4YWI3ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKQEAgLTQ1Myw3ICs0NTMsMTEgQEAKIHN0YXRpYyBERUZJTkVfUFJDQ19DTEsoNywgd2RnX2VkLCAJMSwgLTEsIE5VTEwpOwogc3RhdGljIERFRklORV9QUkNDX0NMSyg3LCBjZmdyZWdfZWQsIAkwLCAtMSwgTlVMTCk7CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19kdW1teV9hcGJfcGNsazsKKwogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHU4NTAwX2NvbW1vbl9jbGtzW10gPSB7CisJQ0xLKGR1bW15X2FwYl9wY2xrLCBOVUxMLAkiYXBiX3BjbGsiKSwKKwogCS8qIFBlcmlwaGVyYWwgQ2x1c3RlciAjMSAqLwogCUNMSyhncGlvMCwJImdwaW8uMCIsCU5VTEwpLAogCUNMSyhncGlvMCwJImdwaW8uMSIsCU5VTEwpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9kZXZpY2VzLWRiODUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9kZXZpY2VzLWRiODUwMC5jCmluZGV4IDgyMjkwMzQuLjY1NGZjYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvZGV2aWNlcy1kYjg1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2RldmljZXMtZGI4NTAwLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJLmVuZCAgID0gVTg1MDBfU1NQMF9CQVNFICsgU1pfNEsgLSAxLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotCS5pcnEgPSB7SVJRX1NTUDAsIE5PX0lSUSB9LAorCS5pcnEgPSB7SVJRX0RCODUwMF9TU1AwLCBOT19JUlEgfSwKIAkvKiBTVC1Fcmljc3NvbiBtb2RpZmllZCBpZCAqLwogCS5wZXJpcGhpZCA9IFNTUF9QRVJfSUQsCiB9OwpAQCAtNzcsOCArNzcsOCBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0kyQzAsCi0JCS5lbmQJPSBJUlFfSTJDMCwKKwkJLnN0YXJ0CT0gSVJRX0RCODUwMF9JMkMwLAorCQkuZW5kCT0gSVJRX0RCODUwMF9JMkMwLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9CiB9OwpAQCAtOTcsOCArOTcsOCBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0kyQzQsCi0JCS5lbmQJPSBJUlFfSTJDNCwKKwkJLnN0YXJ0CT0gSVJRX0RCODUwMF9JMkM0LAorCQkuZW5kCT0gSVJRX0RCODUwMF9JMkM0LAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9CiB9OwpAQCAtMTMwLDggKzEzMCw4IEBACiAJCS5uYW1lID0gImxjbGEiLAogCX0sCiAJWzNdID0gewotCQkuc3RhcnQgPSBJUlFfRE1BLAotCQkuZW5kID0gSVJRX0RNQSwKKwkJLnN0YXJ0ID0gSVJRX0RCODUwMF9ETUEsCisJCS5lbmQgICA9IElSUV9EQjg1MDBfRE1BLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUX0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMtYm9hcmQtbW9wNTAwLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLWJvYXJkLW1vcDUwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTRmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLWJvYXJkLW1vcDUwMC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKKyAqCisgKiBBdXRob3I6IFJhYmluIFZpbmNlbnQgPHJhYmluLnZpbmNlbnRAc3Rlcmljc3Nvbi5jb20+CisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqLworCisjaWZuZGVmIF9fTUFDSF9JUlFTX0JPQVJEX01PUDUwMF9ICisjZGVmaW5lIF9fTUFDSF9JUlFTX0JPQVJEX01PUDUwMF9ICisKKyNkZWZpbmUgQUI4NTAwX05SX0lSUVMJCQkxMDQKKworI2RlZmluZSBNT1A1MDBfQUI4NTAwX0lSUV9CQVNFCQlJUlFfQk9BUkRfU1RBUlQKKyNkZWZpbmUgTU9QNTAwX0FCODUwMF9JUlFfRU5ECQkoTU9QNTAwX0FCODUwMF9JUlFfQkFTRSBcCisJCQkJCSArIEFCODUwMF9OUl9JUlFTKQorI2RlZmluZSBNT1A1MDBfSVJRX0VORAkJCU1PUDUwMF9BQjg1MDBfSVJRX0VORAorCisjaWYgTU9QNTAwX0lSUV9FTkQgPiBJUlFfQk9BUkRfRU5ECisjdW5kZWYgSVJRX0JPQVJEX0VORAorI2RlZmluZSBJUlFfQk9BUkRfRU5ECU1PUDUwMF9JUlFfRU5ECisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLWRiNTUwMC5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy1kYjU1MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJmZTVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy1kYjU1MDAuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogQXV0aG9yOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nzb24uY29tPgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2lmbmRlZiBfX01BQ0hfSVJRU19EQjU1MDBfSAorI2RlZmluZSBfX01BQ0hfSVJRU19EQjU1MDBfSAorCisjZGVmaW5lIElSUV9EQjU1MDBfTVRVMAkJCShJUlFfU0hQSV9TVEFSVCArIDQpCisjZGVmaW5lIElSUV9EQjU1MDBfU1BJMgkJCShJUlFfU0hQSV9TVEFSVCArIDYpCisjZGVmaW5lIElSUV9EQjU1MDBfUE1VMAkJCShJUlFfU0hQSV9TVEFSVCArIDcpCisjZGVmaW5lIElSUV9EQjU1MDBfU1BJMAkJCShJUlFfU0hQSV9TVEFSVCArIDgpCisjZGVmaW5lIElSUV9EQjU1MDBfUlRUCQkJKElSUV9TSFBJX1NUQVJUICsgOSkKKyNkZWZpbmUgSVJRX0RCNTUwMF9QS0EJCQkoSVJRX1NIUElfU1RBUlQgKyAxMCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9VQVJUMAkJKElSUV9TSFBJX1NUQVJUICsgMTEpCisjZGVmaW5lIElSUV9EQjU1MDBfSTJDMwkJCShJUlFfU0hQSV9TVEFSVCArIDEyKQorI2RlZmluZSBJUlFfREI1NTAwX0wyQ0MJCQkoSVJRX1NIUElfU1RBUlQgKyAxMykKKyNkZWZpbmUgSVJRX0RCNTUwMF9NU1AwCQkJKElSUV9TSFBJX1NUQVJUICsgMTQpCisjZGVmaW5lIElSUV9EQjU1MDBfQ1JZUDEJCShJUlFfU0hQSV9TVEFSVCArIDE1KQorI2RlZmluZSBJUlFfREI1NTAwX1BNVTEJCQkoSVJRX1NIUElfU1RBUlQgKyAxNikKKyNkZWZpbmUgSVJRX0RCNTUwMF9NVFUxCQkJKElSUV9TSFBJX1NUQVJUICsgMTcpCisjZGVmaW5lIElSUV9EQjU1MDBfUlRDCQkJKElSUV9TSFBJX1NUQVJUICsgMTgpCisjZGVmaW5lIElSUV9EQjU1MDBfVUFSVDEJCShJUlFfU0hQSV9TVEFSVCArIDE5KQorI2RlZmluZSBJUlFfREI1NTAwX1VTQl9XQUtFVVAJCShJUlFfU0hQSV9TVEFSVCArIDIwKQorI2RlZmluZSBJUlFfREI1NTAwX0kyQzAJCQkoSVJRX1NIUElfU1RBUlQgKyAyMSkKKyNkZWZpbmUgSVJRX0RCNTUwMF9JMkMxCQkJKElSUV9TSFBJX1NUQVJUICsgMjIpCisjZGVmaW5lIElSUV9EQjU1MDBfVVNCT1RHCQkoSVJRX1NIUElfU1RBUlQgKyAyMykKKyNkZWZpbmUgSVJRX0RCNTUwMF9ETUFfU0VDVVJFCQkoSVJRX1NIUElfU1RBUlQgKyAyNCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9ETUEJCQkoSVJRX1NIUElfU1RBUlQgKyAyNSkKKyNkZWZpbmUgSVJRX0RCNTUwMF9VQVJUMgkJKElSUV9TSFBJX1NUQVJUICsgMjYpCisjZGVmaW5lIElSUV9EQjU1MDBfSUNOX1BNVTEJCShJUlFfU0hQSV9TVEFSVCArIDI3KQorI2RlZmluZSBJUlFfREI1NTAwX0lDTl9QTVUyCQkoSVJRX1NIUElfU1RBUlQgKyAyOCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9VQVJUMwkJKElSUV9TSFBJX1NUQVJUICsgMjkpCisjZGVmaW5lIElSUV9EQjU1MDBfU1BJMwkJCShJUlFfU0hQSV9TVEFSVCArIDMwKQorI2RlZmluZSBJUlFfREI1NTAwX1NETU1DNAkJKElSUV9TSFBJX1NUQVJUICsgMzEpCisjZGVmaW5lIElSUV9EQjU1MDBfSVJSQwkJCShJUlFfU0hQSV9TVEFSVCArIDMzKQorI2RlZmluZSBJUlFfREI1NTAwX0lSREFfRlQJCShJUlFfU0hQSV9TVEFSVCArIDM0KQorI2RlZmluZSBJUlFfREI1NTAwX0lSREFfU0QJCShJUlFfU0hQSV9TVEFSVCArIDM1KQorI2RlZmluZSBJUlFfREI1NTAwX0lSREFfRkkJCShJUlFfU0hQSV9TVEFSVCArIDM2KQorI2RlZmluZSBJUlFfREI1NTAwX0lSREFfRkQJCShJUlFfU0hQSV9TVEFSVCArIDM3KQorI2RlZmluZSBJUlFfREI1NTAwX0ZTTUNfQ09ERVJFQURZCShJUlFfU0hQSV9TVEFSVCArIDM4KQorI2RlZmluZSBJUlFfREI1NTAwX0ZTTUNfTkFORFdBSVQJKElSUV9TSFBJX1NUQVJUICsgMzkpCisjZGVmaW5lIElSUV9EQjU1MDBfQUI1NTAwCQkoSVJRX1NIUElfU1RBUlQgKyA0MCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9TRE1NQzIJCShJUlFfU0hQSV9TVEFSVCArIDQxKQorI2RlZmluZSBJUlFfREI1NTAwX1NJQQkJCShJUlFfU0hQSV9TVEFSVCArIDQyKQorI2RlZmluZSBJUlFfREI1NTAwX1NJQTIJCQkoSVJRX1NIUElfU1RBUlQgKyA0MykKKyNkZWZpbmUgSVJRX0RCNTUwMF9IVkEJCQkoSVJRX1NIUElfU1RBUlQgKyA0NCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9IVkEyCQkJKElSUV9TSFBJX1NUQVJUICsgNDUpCisjZGVmaW5lIElSUV9EQjU1MDBfUFJDTVUwCQkoSVJRX1NIUElfU1RBUlQgKyA0NikKKyNkZWZpbmUgSVJRX0RCNTUwMF9QUkNNVTEJCShJUlFfU0hQSV9TVEFSVCArIDQ3KQorI2RlZmluZSBJUlFfREI1NTAwX0RJU1AJCQkoSVJRX1NIUElfU1RBUlQgKyA0OCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9TRE1NQzEJCShJUlFfU0hQSV9TVEFSVCArIDUwKQorI2RlZmluZSBJUlFfREI1NTAwX01TUDEJCQkoSVJRX1NIUElfU1RBUlQgKyA1MikKKyNkZWZpbmUgSVJRX0RCNTUwMF9LQkQJCQkoSVJRX1NIUElfU1RBUlQgKyA1MykKKyNkZWZpbmUgSVJRX0RCNTUwMF9JMkMyCQkJKElSUV9TSFBJX1NUQVJUICsgNTUpCisjZGVmaW5lIElSUV9EQjU1MDBfQjJSMgkJCShJUlFfU0hQSV9TVEFSVCArIDU2KQorI2RlZmluZSBJUlFfREI1NTAwX0NSWVAwCQkoSVJRX1NIUElfU1RBUlQgKyA1NykKKyNkZWZpbmUgSVJRX0RCNTUwMF9TRE1NQzMJCShJUlFfU0hQSV9TVEFSVCArIDU5KQorI2RlZmluZSBJUlFfREI1NTAwX1NETU1DMAkJKElSUV9TSFBJX1NUQVJUICsgNjApCisjZGVmaW5lIElSUV9EQjU1MDBfSFNFTQkJCShJUlFfU0hQSV9TVEFSVCArIDYxKQorI2RlZmluZSBJUlFfREI1NTAwX1NCQUcJCQkoSVJRX1NIUElfU1RBUlQgKyA2MykKKyNkZWZpbmUgSVJRX0RCNTUwMF9TUEkxCQkJKElSUV9TSFBJX1NUQVJUICsgOTYpCisjZGVmaW5lIElSUV9EQjU1MDBfTVNQMgkJCShJUlFfU0hQSV9TVEFSVCArIDk4KQorI2RlZmluZSBJUlFfREI1NTAwX1NSUFRJTUVSCQkoSVJRX1NIUElfU1RBUlQgKyAxMDEpCisjZGVmaW5lIElSUV9EQjU1MDBfQ1RJMAkJCShJUlFfU0hQSV9TVEFSVCArIDEwOCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9DVEkxCQkJKElSUV9TSFBJX1NUQVJUICsgMTA5KQorI2RlZmluZSBJUlFfREI1NTAwX0lDTl9FUlIJCShJUlFfU0hQSV9TVEFSVCArIDExMCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9NQUxJX1BQTU1VCQkoSVJRX1NIUElfU1RBUlQgKyAxMTIpCisjZGVmaW5lIElSUV9EQjU1MDBfTUFMSV9QUAkJKElSUV9TSFBJX1NUQVJUICsgMTEzKQorI2RlZmluZSBJUlFfREI1NTAwX01BTElfR1BNTVUJCShJUlFfU0hQSV9TVEFSVCArIDExNCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9NQUxJX0dQCQkoSVJRX1NIUElfU1RBUlQgKyAxMTUpCisjZGVmaW5lIElSUV9EQjU1MDBfTUFMSQkJCShJUlFfU0hQSV9TVEFSVCArIDExNikKKyNkZWZpbmUgSVJRX0RCNTUwMF9QUkNNVV9TRU0JCShJUlFfU0hQSV9TVEFSVCArIDExOCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9HUElPMAkJKElSUV9TSFBJX1NUQVJUICsgMTE5KQorI2RlZmluZSBJUlFfREI1NTAwX0dQSU8xCQkoSVJRX1NIUElfU1RBUlQgKyAxMjApCisjZGVmaW5lIElSUV9EQjU1MDBfR1BJTzIJCShJUlFfU0hQSV9TVEFSVCArIDEyMSkKKyNkZWZpbmUgSVJRX0RCNTUwMF9HUElPMwkJKElSUV9TSFBJX1NUQVJUICsgMTIyKQorI2RlZmluZSBJUlFfREI1NTAwX0dQSU80CQkoSVJRX1NIUElfU1RBUlQgKyAxMjMpCisjZGVmaW5lIElSUV9EQjU1MDBfR1BJTzUJCShJUlFfU0hQSV9TVEFSVCArIDEyNCkKKyNkZWZpbmUgSVJRX0RCNTUwMF9HUElPNgkJKElSUV9TSFBJX1NUQVJUICsgMTI1KQorI2RlZmluZSBJUlFfREI1NTAwX0dQSU83CQkoSVJRX1NIUElfU1RBUlQgKyAxMjYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy1kYjg1MDAuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMtZGI4NTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1ZDlmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMtZGI4NTAwLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMAorICoKKyAqIEF1dGhvcjogUmFiaW4gVmluY2VudCA8cmFiaW4udmluY2VudEBzdGVyaWNzc29uLmNvbT4KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpZm5kZWYgX19NQUNIX0lSUVNfREI4NTAwX0gKKyNkZWZpbmUgX19NQUNIX0lSUVNfREI4NTAwX0gKKworI2RlZmluZSBJUlFfREI4NTAwX01UVTAJCQkoSVJRX1NIUElfU1RBUlQgKyA0KQorI2RlZmluZSBJUlFfREI4NTAwX1NQSTIJCQkoSVJRX1NIUElfU1RBUlQgKyA2KQorI2RlZmluZSBJUlFfREI4NTAwX1BNVQkJCShJUlFfU0hQSV9TVEFSVCArIDcpCisjZGVmaW5lIElSUV9EQjg1MDBfU1BJMAkJCShJUlFfU0hQSV9TVEFSVCArIDgpCisjZGVmaW5lIElSUV9EQjg1MDBfUlRUCQkJKElSUV9TSFBJX1NUQVJUICsgOSkKKyNkZWZpbmUgSVJRX0RCODUwMF9QS0EJCQkoSVJRX1NIUElfU1RBUlQgKyAxMCkKKyNkZWZpbmUgSVJRX0RCODUwMF9VQVJUMAkJKElSUV9TSFBJX1NUQVJUICsgMTEpCisjZGVmaW5lIElSUV9EQjg1MDBfSTJDMwkJCShJUlFfU0hQSV9TVEFSVCArIDEyKQorI2RlZmluZSBJUlFfREI4NTAwX0wyQ0MJCQkoSVJRX1NIUElfU1RBUlQgKyAxMykKKyNkZWZpbmUgSVJRX0RCODUwMF9TU1AwCQkJKElSUV9TSFBJX1NUQVJUICsgMTQpCisjZGVmaW5lIElSUV9EQjg1MDBfQ1JZUDEJCShJUlFfU0hQSV9TVEFSVCArIDE1KQorI2RlZmluZSBJUlFfREI4NTAwX01TUDFfUlgJCShJUlFfU0hQSV9TVEFSVCArIDE2KQorI2RlZmluZSBJUlFfREI4NTAwX01UVTEJCQkoSVJRX1NIUElfU1RBUlQgKyAxNykKKyNkZWZpbmUgSVJRX0RCODUwMF9SVEMJCQkoSVJRX1NIUElfU1RBUlQgKyAxOCkKKyNkZWZpbmUgSVJRX0RCODUwMF9VQVJUMQkJKElSUV9TSFBJX1NUQVJUICsgMTkpCisjZGVmaW5lIElSUV9EQjg1MDBfVVNCX1dBS0VVUAkJKElSUV9TSFBJX1NUQVJUICsgMjApCisjZGVmaW5lIElSUV9EQjg1MDBfSTJDMAkJCShJUlFfU0hQSV9TVEFSVCArIDIxKQorI2RlZmluZSBJUlFfREI4NTAwX0kyQzEJCQkoSVJRX1NIUElfU1RBUlQgKyAyMikKKyNkZWZpbmUgSVJRX0RCODUwMF9VU0JPVEcJCShJUlFfU0hQSV9TVEFSVCArIDIzKQorI2RlZmluZSBJUlFfREI4NTAwX0RNQV9TRUNVUkUJCShJUlFfU0hQSV9TVEFSVCArIDI0KQorI2RlZmluZSBJUlFfREI4NTAwX0RNQQkJCShJUlFfU0hQSV9TVEFSVCArIDI1KQorI2RlZmluZSBJUlFfREI4NTAwX1VBUlQyCQkoSVJRX1NIUElfU1RBUlQgKyAyNikKKyNkZWZpbmUgSVJRX0RCODUwMF9JQ05fUE1VMQkJKElSUV9TSFBJX1NUQVJUICsgMjcpCisjZGVmaW5lIElSUV9EQjg1MDBfSUNOX1BNVTIJCShJUlFfU0hQSV9TVEFSVCArIDI4KQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVJfRVhDRVAJCShJUlFfU0hQSV9TVEFSVCArIDI5KQorI2RlZmluZSBJUlFfREI4NTAwX01TUDAJCQkoSVJRX1NIUElfU1RBUlQgKyAzMSkKKyNkZWZpbmUgSVJRX0RCODUwMF9IU0lSX0NIMF9PVlJSVU4JKElSUV9TSFBJX1NUQVJUICsgMzIpCisjZGVmaW5lIElSUV9EQjg1MDBfSFNJUl9DSDFfT1ZSUlVOCShJUlFfU0hQSV9TVEFSVCArIDMzKQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVJfQ0gyX09WUlJVTgkoSVJRX1NIUElfU1RBUlQgKyAzNCkKKyNkZWZpbmUgSVJRX0RCODUwMF9IU0lSX0NIM19PVlJSVU4JKElSUV9TSFBJX1NUQVJUICsgMzUpCisjZGVmaW5lIElSUV9EQjg1MDBfSFNJUl9DSDRfT1ZSUlVOCShJUlFfU0hQSV9TVEFSVCArIDM2KQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVJfQ0g1X09WUlJVTgkoSVJRX1NIUElfU1RBUlQgKyAzNykKKyNkZWZpbmUgSVJRX0RCODUwMF9IU0lSX0NINl9PVlJSVU4JKElSUV9TSFBJX1NUQVJUICsgMzgpCisjZGVmaW5lIElSUV9EQjg1MDBfSFNJUl9DSDdfT1ZSUlVOCShJUlFfU0hQSV9TVEFSVCArIDM5KQorI2RlZmluZSBJUlFfREI4NTAwX0FCODUwMAkJKElSUV9TSFBJX1NUQVJUICsgNDApCisjZGVmaW5lIElSUV9EQjg1MDBfU0RNTUMyCQkoSVJRX1NIUElfU1RBUlQgKyA0MSkKKyNkZWZpbmUgSVJRX0RCODUwMF9TSUEJCQkoSVJRX1NIUElfU1RBUlQgKyA0MikKKyNkZWZpbmUgSVJRX0RCODUwMF9TSUEyCQkJKElSUV9TSFBJX1NUQVJUICsgNDMpCisjZGVmaW5lIElSUV9EQjg1MDBfU1ZBCQkJKElSUV9TSFBJX1NUQVJUICsgNDQpCisjZGVmaW5lIElSUV9EQjg1MDBfU1ZBMgkJCShJUlFfU0hQSV9TVEFSVCArIDQ1KQorI2RlZmluZSBJUlFfREI4NTAwX1BSQ01VMAkJKElSUV9TSFBJX1NUQVJUICsgNDYpCisjZGVmaW5lIElSUV9EQjg1MDBfUFJDTVUxCQkoSVJRX1NIUElfU1RBUlQgKyA0NykKKyNkZWZpbmUgSVJRX0RCODUwMF9ESVNQCQkJKElSUV9TSFBJX1NUQVJUICsgNDgpCisjZGVmaW5lIElSUV9EQjg1MDBfU1BJMwkJCShJUlFfU0hQSV9TVEFSVCArIDQ5KQorI2RlZmluZSBJUlFfREI4NTAwX1NETU1DMQkJKElSUV9TSFBJX1NUQVJUICsgNTApCisjZGVmaW5lIElSUV9EQjg1MDBfSTJDNAkJCShJUlFfU0hQSV9TVEFSVCArIDUxKQorI2RlZmluZSBJUlFfREI4NTAwX1NTUDEJCQkoSVJRX1NIUElfU1RBUlQgKyA1MikKKyNkZWZpbmUgSVJRX0RCODUwMF9TS0UJCQkoSVJRX1NIUElfU1RBUlQgKyA1MykKKyNkZWZpbmUgSVJRX0RCODUwMF9LQgkJCShJUlFfU0hQSV9TVEFSVCArIDU0KQorI2RlZmluZSBJUlFfREI4NTAwX0kyQzIJCQkoSVJRX1NIUElfU1RBUlQgKyA1NSkKKyNkZWZpbmUgSVJRX0RCODUwMF9CMlIyCQkJKElSUV9TSFBJX1NUQVJUICsgNTYpCisjZGVmaW5lIElSUV9EQjg1MDBfQ1JZUDAJCShJUlFfU0hQSV9TVEFSVCArIDU3KQorI2RlZmluZSBJUlFfREI4NTAwX1NETU1DMwkJKElSUV9TSFBJX1NUQVJUICsgNTkpCisjZGVmaW5lIElSUV9EQjg1MDBfU0RNTUMwCQkoSVJRX1NIUElfU1RBUlQgKyA2MCkKKyNkZWZpbmUgSVJRX0RCODUwMF9IU0VNCQkJKElSUV9TSFBJX1NUQVJUICsgNjEpCisjZGVmaW5lIElSUV9EQjg1MDBfTVNQMQkJCShJUlFfU0hQSV9TVEFSVCArIDYyKQorI2RlZmluZSBJUlFfREI4NTAwX1NCQUcJCQkoSVJRX1NIUElfU1RBUlQgKyA2MykKKyNkZWZpbmUgSVJRX0RCODUwMF9TUEkxCQkJKElSUV9TSFBJX1NUQVJUICsgOTYpCisjZGVmaW5lIElSUV9EQjg1MDBfU1JQVElNRVIJCShJUlFfU0hQSV9TVEFSVCArIDk3KQorI2RlZmluZSBJUlFfREI4NTAwX01TUDIJCQkoSVJRX1NIUElfU1RBUlQgKyA5OCkKKyNkZWZpbmUgSVJRX0RCODUwMF9TRE1NQzQJCShJUlFfU0hQSV9TVEFSVCArIDk5KQorI2RlZmluZSBJUlFfREI4NTAwX1NETU1DNQkJKElSUV9TSFBJX1NUQVJUICsgMTAwKQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVJEMAkJKElSUV9TSFBJX1NUQVJUICsgMTA0KQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVJEMQkJKElSUV9TSFBJX1NUQVJUICsgMTA1KQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVREMAkJKElSUV9TSFBJX1NUQVJUICsgMTA2KQorI2RlZmluZSBJUlFfREI4NTAwX0hTSVREMQkJKElSUV9TSFBJX1NUQVJUICsgMTA3KQorI2RlZmluZSBJUlFfREI4NTAwX0NUSTAJCQkoSVJRX1NIUElfU1RBUlQgKyAxMDgpCisjZGVmaW5lIElSUV9EQjg1MDBfQ1RJMQkJCShJUlFfU0hQSV9TVEFSVCArIDEwOSkKKyNkZWZpbmUgSVJRX0RCODUwMF9JQ05fRVJSCQkoSVJRX1NIUElfU1RBUlQgKyAxMTApCisjZGVmaW5lIElSUV9EQjg1MDBfTUFMSV9QUE1NVQkJKElSUV9TSFBJX1NUQVJUICsgMTEyKQorI2RlZmluZSBJUlFfREI4NTAwX01BTElfUFAJCShJUlFfU0hQSV9TVEFSVCArIDExMykKKyNkZWZpbmUgSVJRX0RCODUwMF9NQUxJX0dQTU1VCQkoSVJRX1NIUElfU1RBUlQgKyAxMTQpCisjZGVmaW5lIElSUV9EQjg1MDBfTUFMSV9HUAkJKElSUV9TSFBJX1NUQVJUICsgMTE1KQorI2RlZmluZSBJUlFfREI4NTAwX01BTEkJCQkoSVJRX1NIUElfU1RBUlQgKyAxMTYpCisjZGVmaW5lIElSUV9EQjg1MDBfUFJDTVVfU0VNCQkoSVJRX1NIUElfU1RBUlQgKyAxMTgpCisjZGVmaW5lIElSUV9EQjg1MDBfR1BJTzAJCShJUlFfU0hQSV9TVEFSVCArIDExOSkKKyNkZWZpbmUgSVJRX0RCODUwMF9HUElPMQkJKElSUV9TSFBJX1NUQVJUICsgMTIwKQorI2RlZmluZSBJUlFfREI4NTAwX0dQSU8yCQkoSVJRX1NIUElfU1RBUlQgKyAxMjEpCisjZGVmaW5lIElSUV9EQjg1MDBfR1BJTzMJCShJUlFfU0hQSV9TVEFSVCArIDEyMikKKyNkZWZpbmUgSVJRX0RCODUwMF9HUElPNAkJKElSUV9TSFBJX1NUQVJUICsgMTIzKQorI2RlZmluZSBJUlFfREI4NTAwX0dQSU81CQkoSVJRX1NIUElfU1RBUlQgKyAxMjQpCisjZGVmaW5lIElSUV9EQjg1MDBfR1BJTzYJCShJUlFfU0hQSV9TVEFSVCArIDEyNSkKKyNkZWZpbmUgSVJRX0RCODUwMF9HUElPNwkJKElSUV9TSFBJX1NUQVJUICsgMTI2KQorI2RlZmluZSBJUlFfREI4NTAwX0dQSU84CQkoSVJRX1NIUElfU1RBUlQgKyAxMjcpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDc5NzA2ODQuLjEwMzg1YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTEwLDcgKzEwLDggQEAKICNpZm5kZWYgQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIEFTTV9BUkNIX0lSUVNfSAogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy1kYjU1MDAuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMtZGI4NTAwLmg+CiAKICNkZWZpbmUgSVJRX0xPQ0FMVElNRVIgICAgICAgICAgICAgICAgICAyOQogI2RlZmluZSBJUlFfTE9DQUxXRE9HICAgICAgICAgICAgICAgICAgIDMwCkBAIC02NywxMiArNjgsMjEgQEAKIC8qIFRoZXJlIGFyZSAxMjggc2hhcmVkIHBlcmlwaGVyYWwgaW50ZXJydXB0cyBhc3NpZ25lZCB0bwogICogSU5USURbMTYwOjMyXS4gVGhlIGZpcnN0IDMyIGludGVycnVwdHMgYXJlIHJlc2VydmVkLgogICovCi0jZGVmaW5lIFU4NTAwX1NPQ19OUl9JUlFTCQkxNjEKKyNkZWZpbmUgREJYNTAwX05SX0lOVEVSTkFMX0lSUVMJCTE2MQogCiAvKiBBZnRlciBjaGlwLXNwZWNpZmljIElSUSBudW1iZXJzIHdlIGhhdmUgdGhlIEdQSU8gb25lcyAqLwogI2RlZmluZSBOT01BRElLX05SX0dQSU8JCQkyODgKLSNkZWZpbmUgTk9NQURJS19HUElPX1RPX0lSUShncGlvKQkoKGdwaW8pICsgVTg1MDBfU09DX05SX0lSUVMpCi0jZGVmaW5lIE5PTUFESUtfSVJRX1RPX0dQSU8oaXJxKQkoKGlycSkgLSBVODUwMF9TT0NfTlJfSVJRUykKLSNkZWZpbmUgTlJfSVJRUwkJCQlOT01BRElLX0dQSU9fVE9fSVJRKE5PTUFESUtfTlJfR1BJTykKKyNkZWZpbmUgTk9NQURJS19HUElPX1RPX0lSUShncGlvKQkoKGdwaW8pICsgREJYNTAwX05SX0lOVEVSTkFMX0lSUVMpCisjZGVmaW5lIE5PTUFESUtfSVJRX1RPX0dQSU8oaXJxKQkoKGlycSkgLSBEQlg1MDBfTlJfSU5URVJOQUxfSVJRUykKKyNkZWZpbmUgSVJRX0JPQVJEX1NUQVJUCQkJTk9NQURJS19HUElPX1RPX0lSUShOT01BRElLX05SX0dQSU8pCiAKLSNlbmRpZiAvKkFTTV9BUkNIX0lSUVNfSCovCisvKiBUaGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBib2FyZC1zcGVjaWZpYyBpcnEgaGVhZGVycyAqLworI2RlZmluZSBJUlFfQk9BUkRfRU5ECQkJSVJRX0JPQVJEX1NUQVJUCisKKyNpZmRlZiBDT05GSUdfTUFDSF9VODUwMF9NT1AKKyNpbmNsdWRlIDxtYWNoL2lycXMtYm9hcmQtbW9wNTAwLmg+CisjZW5kaWYKKworI2RlZmluZSBOUl9JUlFTCQkJCUlSUV9CT0FSRF9FTkQKKworI2VuZGlmIC8qIEFTTV9BUkNIX0lSUVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDg1NTJlYjEuLjAyNzFjYTBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC0zMCwyMiArMzAsMjIgQEAKIHN0YXRpYyB2b2lkIHB1dGMoY29uc3QgY2hhciBjKQogewogCS8qIERvIG5vdGhpbmcgaWYgdGhlIFVBUlQgaXMgbm90IGVuYWJsZWQuICovCi0JaWYgKCEocmVhZGIoVTg1MDBfVUFSVF9DUikgJiAweDEpKQorCWlmICghKF9fcmF3X3JlYWRiKFU4NTAwX1VBUlRfQ1IpICYgMHgxKSkKIAkJcmV0dXJuOwogCiAJaWYgKGMgPT0gJ1xuJykKIAkJcHV0YygnXHInKTsKIAotCXdoaWxlIChyZWFkYihVODUwMF9VQVJUX0ZSKSAmICgxIDw8IDUpKQorCXdoaWxlIChfX3Jhd19yZWFkYihVODUwMF9VQVJUX0ZSKSAmICgxIDw8IDUpKQogCQliYXJyaWVyKCk7Ci0Jd3JpdGViKGMsIFU4NTAwX1VBUlRfRFIpOworCV9fcmF3X3dyaXRlYihjLCBVODUwMF9VQVJUX0RSKTsKIH0KIAogc3RhdGljIHZvaWQgZmx1c2godm9pZCkKIHsKLQlpZiAoIShyZWFkYihVODUwMF9VQVJUX0NSKSAmIDB4MSkpCisJaWYgKCEoX19yYXdfcmVhZGIoVTg1MDBfVUFSVF9DUikgJiAweDEpKQogCQlyZXR1cm47Ci0Jd2hpbGUgKHJlYWRiKFU4NTAwX1VBUlRfRlIpICYgKDEgPDwgMykpCisJd2hpbGUgKF9fcmF3X3JlYWRiKFU4NTAwX1VBUlRfRlIpICYgKDEgPDwgMykpCiAJCWJhcnJpZXIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9waW5zLWRiODUwMC5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9waW5zLWRiODUwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTVkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BpbnMtZGI4NTAwLmgKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKKyAqCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyCisgKiBBdXRob3I6IFJhYmluIFZpbmNlbnQgPHJhYmluLnZpbmNlbnRAc3Rlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfX01BQ0hfUElOU19EQjg1MDBfSAorI2RlZmluZSBfX01BQ0hfUElOU19EQjg1MDBfSAorCisvKgorICogVE9ETzogRXZlbnR1YWxseSBlbmNvZGUgYWxsIG5vbi1ib2FyZCBzcGVjaWZpYyBwdWxsIHVwL2Rvd24gY29uZmlndXJhdGlvbgorICogaGVyZS4KKyAqLworCisjZGVmaW5lIEdQSU8wX0dQSU8JCVBJTl9DRkcoMCwgR1BJTykKKyNkZWZpbmUgR1BJTzBfVTBfQ1RTbgkJUElOX0NGRygwLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzBfVFJJR19PVVQJCVBJTl9DRkcoMCwgQUxUX0IpCisjZGVmaW5lIEdQSU8wX0lQX1RETwkJUElOX0NGRygwLCBBTFRfQykKKworI2RlZmluZSBHUElPMV9HUElPCQlQSU5fQ0ZHKDEsIEdQSU8pCisjZGVmaW5lIEdQSU8xX1UwX1JUU24JCVBJTl9DRkcoMSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xX1RSSUdfSU4JCVBJTl9DRkcoMSwgQUxUX0IpCisjZGVmaW5lIEdQSU8xX0lQX1RESQkJUElOX0NGRygxLCBBTFRfQykKKworI2RlZmluZSBHUElPMl9HUElPCQlQSU5fQ0ZHKDIsIEdQSU8pCisjZGVmaW5lIEdQSU8yX1UwX1JYRAkJUElOX0NGRygyLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzJfTk9ORQkJUElOX0NGRygyLCBBTFRfQikKKyNkZWZpbmUgR1BJTzJfSVBfVE1TCQlQSU5fQ0ZHKDIsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8zX0dQSU8JCVBJTl9DRkcoMywgR1BJTykKKyNkZWZpbmUgR1BJTzNfVTBfVFhECQlQSU5fQ0ZHKDMsIEFMVF9BKQorI2RlZmluZSBHUElPM19OT05FCQlQSU5fQ0ZHKDMsIEFMVF9CKQorI2RlZmluZSBHUElPM19JUF9UQ0sJCVBJTl9DRkcoMywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzRfR1BJTwkJUElOX0NGRyg0LCBHUElPKQorI2RlZmluZSBHUElPNF9VMV9SWEQJCVBJTl9DRkcoNCwgQUxUX0EpCisjZGVmaW5lIEdQSU80X0kyQzRfU0NMCQlQSU5fQ0ZHX1BVTEwoNCwgQUxUX0IsIFVQKQorI2RlZmluZSBHUElPNF9JUF9UUlNUbgkJUElOX0NGRyg0LCBBTFRfQykKKworI2RlZmluZSBHUElPNV9HUElPCQlQSU5fQ0ZHKDUsIEdQSU8pCisjZGVmaW5lIEdQSU81X1UxX1RYRAkJUElOX0NGRyg1LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzVfSTJDNF9TREEJCVBJTl9DRkdfUFVMTCg1LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU81X0lQX0dQSU82CQlQSU5fQ0ZHKDUsIEFMVF9DKQorCisjZGVmaW5lIEdQSU82X0dQSU8JCVBJTl9DRkcoNiwgR1BJTykKKyNkZWZpbmUgR1BJTzZfVTFfQ1RTbgkJUElOX0NGRyg2LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzZfSTJDMV9TQ0wJCVBJTl9DRkdfUFVMTCg2LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU82X0lQX0dQSU8wCQlQSU5fQ0ZHKDYsIEFMVF9DKQorCisjZGVmaW5lIEdQSU83X0dQSU8JCVBJTl9DRkcoNywgR1BJTykKKyNkZWZpbmUgR1BJTzdfVTFfUlRTbgkJUElOX0NGRyg3LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzdfSTJDMV9TREEJCVBJTl9DRkdfUFVMTCg3LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU83X0lQX0dQSU8xCQlQSU5fQ0ZHKDcsIEFMVF9DKQorCisjZGVmaW5lIEdQSU84X0dQSU8JCVBJTl9DRkcoOCwgR1BJTykKKyNkZWZpbmUgR1BJTzhfSVBJMkNfU0RBCQlQSU5fQ0ZHX1BVTEwoOCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPOF9JMkMyX1NEQQkJUElOX0NGR19QVUxMKDgsIEFMVF9CLCBVUCkKKworI2RlZmluZSBHUElPOV9HUElPCQlQSU5fQ0ZHKDksIEdQSU8pCisjZGVmaW5lIEdQSU85X0lQSTJDX1NDTAkJUElOX0NGR19QVUxMKDksIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzlfSTJDMl9TQ0wJCVBJTl9DRkdfUFVMTCg5LCBBTFRfQiwgVVApCisKKyNkZWZpbmUgR1BJTzEwX0dQSU8JCVBJTl9DRkcoMTAsIEdQSU8pCisjZGVmaW5lIEdQSU8xMF9JUEkyQ19TREEJUElOX0NGR19QVUxMKDEwLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMF9JMkMyX1NEQQkJUElOX0NGR19QVUxMKDEwLCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU8xMF9JUF9HUElPMwkJUElOX0NGRygxMCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzExX0dQSU8JCVBJTl9DRkcoMTEsIEdQSU8pCisjZGVmaW5lIEdQSU8xMV9JUEkyQ19TQ0wJUElOX0NGR19QVUxMKDExLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMV9JMkMyX1NDTAkJUElOX0NGR19QVUxMKDExLCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU8xMV9JUF9HUElPMgkJUElOX0NGRygxMSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzEyX0dQSU8JCVBJTl9DRkcoMTIsIEdQSU8pCisjZGVmaW5lIEdQSU8xMl9NU1AwX1RYRAkJUElOX0NGRygxMiwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMl9NU1AwX1JYRAkJUElOX0NGRygxMiwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzEzX0dQSU8JCVBJTl9DRkcoMTMsIEdQSU8pCisjZGVmaW5lIEdQSU8xM19NU1AwX1RGUwkJUElOX0NGRygxMywgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzE0X0dQSU8JCVBJTl9DRkcoMTQsIEdQSU8pCisjZGVmaW5lIEdQSU8xNF9NU1AwX1RDSwkJUElOX0NGRygxNCwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzE1X0dQSU8JCVBJTl9DRkcoMTUsIEdQSU8pCisjZGVmaW5lIEdQSU8xNV9NU1AwX1JYRAkJUElOX0NGRygxNSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNV9NU1AwX1RYRAkJUElOX0NGRygxNSwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzE2X0dQSU8JCVBJTl9DRkcoMTYsIEdQSU8pCisjZGVmaW5lIEdQSU8xNl9NU1AwX1JGUwkJUElOX0NGRygxNiwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNl9JMkMxX1NDTAkJUElOX0NGR19QVUxMKDE2LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU8xNl9TTElNMF9EQVQJUElOX0NGRygxNiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE3X0dQSU8JCVBJTl9DRkcoMTcsIEdQSU8pCisjZGVmaW5lIEdQSU8xN19NU1AwX1JDSwkJUElOX0NGRygxNywgQUxUX0EpCisjZGVmaW5lIEdQSU8xN19JMkMxX1NEQQkJUElOX0NGR19QVUxMKDE3LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU8xN19TTElNMF9DTEsJUElOX0NGRygxNywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE4X0dQSU8JCVBJTl9DRkcoMTgsIEdQSU8pCisjZGVmaW5lIEdQSU8xOF9NQzBfQ01ERElSCVBJTl9DRkcoMTgsIEFMVF9BKQorI2RlZmluZSBHUElPMThfVTJfUlhECQlQSU5fQ0ZHKDE4LCBBTFRfQikKKyNkZWZpbmUgR1BJTzE4X01TX0lFUAkJUElOX0NGRygxOCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE5X0dQSU8JCVBJTl9DRkcoMTksIEdQSU8pCisjZGVmaW5lIEdQSU8xOV9NQzBfREFUMERJUglQSU5fQ0ZHKDE5LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzE5X1UyX1RYRAkJUElOX0NGRygxOSwgQUxUX0IpCisjZGVmaW5lIEdQSU8xOV9NU19EQVQwRElSCVBJTl9DRkcoMTksIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yMF9HUElPCQlQSU5fQ0ZHKDIwLCBHUElPKQorI2RlZmluZSBHUElPMjBfTUMwX0RBVDJESVIJUElOX0NGRygyMCwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMF9VQVJUTU9EX1RYRAlQSU5fQ0ZHKDIwLCBBTFRfQikKKyNkZWZpbmUgR1BJTzIwX0lQX1RSSUdPVVQJUElOX0NGRygyMCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzIxX0dQSU8JCVBJTl9DRkcoMjEsIEdQSU8pCisjZGVmaW5lIEdQSU8yMV9NQzBfREFUMzFESVIJUElOX0NGRygyMSwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMV9NU1AwX1NDSwkJUElOX0NGRygyMSwgQUxUX0IpCisjZGVmaW5lIEdQSU8yMV9NU19EQVQzMURJUglQSU5fQ0ZHKDIxLCBBTFRfQykKKworI2RlZmluZSBHUElPMjJfR1BJTwkJUElOX0NGRygyMiwgR1BJTykKKyNkZWZpbmUgR1BJTzIyX01DMF9GQkNMSwlQSU5fQ0ZHKDIyLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzIyX1VBUlRNT0RfUlhECVBJTl9DRkcoMjIsIEFMVF9CKQorI2RlZmluZSBHUElPMjJfTVNfRkJDTEsJCVBJTl9DRkcoMjIsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yM19HUElPCQlQSU5fQ0ZHKDIzLCBHUElPKQorI2RlZmluZSBHUElPMjNfTUMwX0NMSwkJUElOX0NGRygyMywgQUxUX0EpCisjZGVmaW5lIEdQSU8yM19TVE1NT0RfQ0xLCVBJTl9DRkcoMjMsIEFMVF9CKQorI2RlZmluZSBHUElPMjNfTVNfQ0xLCQlQSU5fQ0ZHKDIzLCBBTFRfQykKKworI2RlZmluZSBHUElPMjRfR1BJTwkJUElOX0NGRygyNCwgR1BJTykKKyNkZWZpbmUgR1BJTzI0X01DMF9DTUQJCVBJTl9DRkcoMjQsIEFMVF9BKQorI2RlZmluZSBHUElPMjRfVUFSVE1PRF9SWEQJUElOX0NGRygyNCwgQUxUX0IpCisjZGVmaW5lIEdQSU8yNF9NU19CUwkJUElOX0NGRygyNCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzI1X0dQSU8JCVBJTl9DRkcoMjUsIEdQSU8pCisjZGVmaW5lIEdQSU8yNV9NQzBfREFUMAkJUElOX0NGRygyNSwgQUxUX0EpCisjZGVmaW5lIEdQSU8yNV9TVE1NT0RfREFUMAlQSU5fQ0ZHKDI1LCBBTFRfQikKKyNkZWZpbmUgR1BJTzI1X01TX0RBVDAJCVBJTl9DRkcoMjUsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yNl9HUElPCQlQSU5fQ0ZHKDI2LCBHUElPKQorI2RlZmluZSBHUElPMjZfTUMwX0RBVDEJCVBJTl9DRkcoMjYsIEFMVF9BKQorI2RlZmluZSBHUElPMjZfU1RNTU9EX0RBVDEJUElOX0NGRygyNiwgQUxUX0IpCisjZGVmaW5lIEdQSU8yNl9NU19EQVQxCQlQSU5fQ0ZHKDI2LCBBTFRfQykKKworI2RlZmluZSBHUElPMjdfR1BJTwkJUElOX0NGRygyNywgR1BJTykKKyNkZWZpbmUgR1BJTzI3X01DMF9EQVQyCQlQSU5fQ0ZHKDI3LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzI3X1NUTU1PRF9EQVQyCVBJTl9DRkcoMjcsIEFMVF9CKQorI2RlZmluZSBHUElPMjdfTVNfREFUMgkJUElOX0NGRygyNywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzI4X0dQSU8JCVBJTl9DRkcoMjgsIEdQSU8pCisjZGVmaW5lIEdQSU8yOF9NQzBfREFUMwkJUElOX0NGRygyOCwgQUxUX0EpCisjZGVmaW5lIEdQSU8yOF9TVE1NT0RfREFUMwlQSU5fQ0ZHKDI4LCBBTFRfQikKKyNkZWZpbmUgR1BJTzI4X01TX0RBVDMJCVBJTl9DRkcoMjgsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yOV9HUElPCQlQSU5fQ0ZHKDI5LCBHUElPKQorI2RlZmluZSBHUElPMjlfTUMwX0RBVDQJCVBJTl9DRkcoMjksIEFMVF9BKQorI2RlZmluZSBHUElPMjlfU1BJM19DTEsJCVBJTl9DRkcoMjksIEFMVF9CKQorI2RlZmluZSBHUElPMjlfVTJfUlhECQlQSU5fQ0ZHKDI5LCBBTFRfQykKKworI2RlZmluZSBHUElPMzBfR1BJTwkJUElOX0NGRygzMCwgR1BJTykKKyNkZWZpbmUgR1BJTzMwX01DMF9EQVQ1CQlQSU5fQ0ZHKDMwLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzMwX1NQSTNfUlhECQlQSU5fQ0ZHKDMwLCBBTFRfQikKKyNkZWZpbmUgR1BJTzMwX1UyX1RYRAkJUElOX0NGRygzMCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzMxX0dQSU8JCVBJTl9DRkcoMzEsIEdQSU8pCisjZGVmaW5lIEdQSU8zMV9NQzBfREFUNgkJUElOX0NGRygzMSwgQUxUX0EpCisjZGVmaW5lIEdQSU8zMV9TUEkzX0ZSTQkJUElOX0NGRygzMSwgQUxUX0IpCisjZGVmaW5lIEdQSU8zMV9VMl9DVFNuCQlQSU5fQ0ZHKDMxLCBBTFRfQykKKworI2RlZmluZSBHUElPMzJfR1BJTwkJUElOX0NGRygzMiwgR1BJTykKKyNkZWZpbmUgR1BJTzMyX01DMF9EQVQ3CQlQSU5fQ0ZHKDMyLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzMyX1NQSTNfVFhECQlQSU5fQ0ZHKDMyLCBBTFRfQikKKyNkZWZpbmUgR1BJTzMyX1UyX1JUU24JCVBJTl9DRkcoMzIsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8zM19HUElPCQlQSU5fQ0ZHKDMzLCBHUElPKQorI2RlZmluZSBHUElPMzNfTVNQMV9UWEQJCVBJTl9DRkcoMzMsIEFMVF9BKQorI2RlZmluZSBHUElPMzNfTVNQMV9SWEQJCVBJTl9DRkcoMzMsIEFMVF9CKQorI2RlZmluZSBHUElPMzNfVTBfRFRSbgkJUElOX0NGRygzMywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzM0X0dQSU8JCVBJTl9DRkcoMzQsIEdQSU8pCisjZGVmaW5lIEdQSU8zNF9NU1AxX1RGUwkJUElOX0NGRygzNCwgQUxUX0EpCisjZGVmaW5lIEdQSU8zNF9OT05FCQlQSU5fQ0ZHKDM0LCBBTFRfQikKKyNkZWZpbmUgR1BJTzM0X1UwX0RDRG4JCVBJTl9DRkcoMzQsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8zNV9HUElPCQlQSU5fQ0ZHKDM1LCBHUElPKQorI2RlZmluZSBHUElPMzVfTVNQMV9UQ0sJCVBJTl9DRkcoMzUsIEFMVF9BKQorI2RlZmluZSBHUElPMzVfTk9ORQkJUElOX0NGRygzNSwgQUxUX0IpCisjZGVmaW5lIEdQSU8zNV9VMF9EU1JuCQlQSU5fQ0ZHKDM1LCBBTFRfQykKKworI2RlZmluZSBHUElPMzZfR1BJTwkJUElOX0NGRygzNiwgR1BJTykKKyNkZWZpbmUgR1BJTzM2X01TUDFfUlhECQlQSU5fQ0ZHKDM2LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzM2X01TUDFfVFhECQlQSU5fQ0ZHKDM2LCBBTFRfQikKKyNkZWZpbmUgR1BJTzM2X1UwX1JJbgkJUElOX0NGRygzNiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzY0X0dQSU8JCVBJTl9DRkcoNjQsIEdQSU8pCisjZGVmaW5lIEdQSU82NF9MQ0RCX0RFCQlQSU5fQ0ZHKDY0LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzY0X0tQX08xCQlQSU5fQ0ZHKDY0LCBBTFRfQikKKyNkZWZpbmUgR1BJTzY0X0lQX0dQSU80CQlQSU5fQ0ZHKDY0LCBBTFRfQykKKworI2RlZmluZSBHUElPNjVfR1BJTwkJUElOX0NGRyg2NSwgR1BJTykKKyNkZWZpbmUgR1BJTzY1X0xDREJfSFNPCQlQSU5fQ0ZHKDY1LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzY1X0tQX08wCQlQSU5fQ0ZHKDY1LCBBTFRfQikKKyNkZWZpbmUgR1BJTzY1X0lQX0dQSU81CQlQSU5fQ0ZHKDY1LCBBTFRfQykKKworI2RlZmluZSBHUElPNjZfR1BJTwkJUElOX0NGRyg2NiwgR1BJTykKKyNkZWZpbmUgR1BJTzY2X0xDREJfVlNPCQlQSU5fQ0ZHKDY2LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzY2X0tQX0kxCQlQSU5fQ0ZHKDY2LCBBTFRfQikKKyNkZWZpbmUgR1BJTzY2X0lQX0dQSU82CQlQSU5fQ0ZHKDY2LCBBTFRfQykKKworI2RlZmluZSBHUElPNjdfR1BJTwkJUElOX0NGRyg2NywgR1BJTykKKyNkZWZpbmUgR1BJTzY3X0xDREJfQ0xLCQlQSU5fQ0ZHKDY3LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzY3X0tQX0kwCQlQSU5fQ0ZHKDY3LCBBTFRfQikKKyNkZWZpbmUgR1BJTzY3X0lQX0dQSU83CQlQSU5fQ0ZHKDY3LCBBTFRfQykKKworI2RlZmluZSBHUElPNjhfR1BJTwkJUElOX0NGRyg2OCwgR1BJTykKKyNkZWZpbmUgR1BJTzY4X0xDRF9WU0kwCQlQSU5fQ0ZHKDY4LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzY4X0tQX083CQlQSU5fQ0ZHKDY4LCBBTFRfQikKKyNkZWZpbmUgR1BJTzY4X1NNX0NMRQkJUElOX0NGRyg2OCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzY5X0dQSU8JCVBJTl9DRkcoNjksIEdQSU8pCisjZGVmaW5lIEdQSU82OV9MQ0RfVlNJMQkJUElOX0NGRyg2OSwgQUxUX0EpCisjZGVmaW5lIEdQSU82OV9LUF9JNwkJUElOX0NGRyg2OSwgQUxUX0IpCisjZGVmaW5lIEdQSU82OV9TTV9BTEUJCVBJTl9DRkcoNjksIEFMVF9DKQorCisjZGVmaW5lIEdQSU83MF9HUElPCQlQSU5fQ0ZHKDcwLCBHUElPKQorI2RlZmluZSBHUElPNzBfTENEX0QwCQlQSU5fQ0ZHKDcwLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzcwX0tQX081CQlQSU5fQ0ZHKDcwLCBBTFRfQikKKyNkZWZpbmUgR1BJTzcwX1NUTUFQRV9DTEsJUElOX0NGRyg3MCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzcxX0dQSU8JCVBJTl9DRkcoNzEsIEdQSU8pCisjZGVmaW5lIEdQSU83MV9MQ0RfRDEJCVBJTl9DRkcoNzEsIEFMVF9BKQorI2RlZmluZSBHUElPNzFfS1BfTzQJCVBJTl9DRkcoNzEsIEFMVF9CKQorI2RlZmluZSBHUElPNzFfU1RNQVBFX0RBVDMJUElOX0NGRyg3MSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzcyX0dQSU8JCVBJTl9DRkcoNzIsIEdQSU8pCisjZGVmaW5lIEdQSU83Ml9MQ0RfRDIJCVBJTl9DRkcoNzIsIEFMVF9BKQorI2RlZmluZSBHUElPNzJfS1BfTzMJCVBJTl9DRkcoNzIsIEFMVF9CKQorI2RlZmluZSBHUElPNzJfU1RNQVBFX0RBVDIJUElOX0NGRyg3MiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzczX0dQSU8JCVBJTl9DRkcoNzMsIEdQSU8pCisjZGVmaW5lIEdQSU83M19MQ0RfRDMJCVBJTl9DRkcoNzMsIEFMVF9BKQorI2RlZmluZSBHUElPNzNfS1BfTzIJCVBJTl9DRkcoNzMsIEFMVF9CKQorI2RlZmluZSBHUElPNzNfU1RNQVBFX0RBVDEJUElOX0NGRyg3MywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzc0X0dQSU8JCVBJTl9DRkcoNzQsIEdQSU8pCisjZGVmaW5lIEdQSU83NF9MQ0RfRDQJCVBJTl9DRkcoNzQsIEFMVF9BKQorI2RlZmluZSBHUElPNzRfS1BfSTUJCVBJTl9DRkcoNzQsIEFMVF9CKQorI2RlZmluZSBHUElPNzRfU1RNQVBFX0RBVDAJUElOX0NGRyg3NCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzc1X0dQSU8JCVBJTl9DRkcoNzUsIEdQSU8pCisjZGVmaW5lIEdQSU83NV9MQ0RfRDUJCVBJTl9DRkcoNzUsIEFMVF9BKQorI2RlZmluZSBHUElPNzVfS1BfSTQJCVBJTl9DRkcoNzUsIEFMVF9CKQorI2RlZmluZSBHUElPNzVfVTJfUlhECQlQSU5fQ0ZHKDc1LCBBTFRfQykKKworI2RlZmluZSBHUElPNzZfR1BJTwkJUElOX0NGRyg3NiwgR1BJTykKKyNkZWZpbmUgR1BJTzc2X0xDRF9ENgkJUElOX0NGRyg3NiwgQUxUX0EpCisjZGVmaW5lIEdQSU83Nl9LUF9JMwkJUElOX0NGRyg3NiwgQUxUX0IpCisjZGVmaW5lIEdQSU83Nl9VMl9UWEQJCVBJTl9DRkcoNzYsIEFMVF9DKQorCisjZGVmaW5lIEdQSU83N19HUElPCQlQSU5fQ0ZHKDc3LCBHUElPKQorI2RlZmluZSBHUElPNzdfTENEX0Q3CQlQSU5fQ0ZHKDc3LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzc3X0tQX0kyCQlQSU5fQ0ZHKDc3LCBBTFRfQikKKyNkZWZpbmUgR1BJTzc3X05PTkUJCVBJTl9DRkcoNzcsIEFMVF9DKQorCisjZGVmaW5lIEdQSU83OF9HUElPCQlQSU5fQ0ZHKDc4LCBHUElPKQorI2RlZmluZSBHUElPNzhfTENEX0Q4CQlQSU5fQ0ZHKDc4LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzc4X0tQX082CQlQSU5fQ0ZHKDc4LCBBTFRfQikKKyNkZWZpbmUgR1BJTzc4X0lQX0dQSU8yCQlQSU5fQ0ZHKDc4LCBBTFRfQykKKworI2RlZmluZSBHUElPNzlfR1BJTwkJUElOX0NGRyg3OSwgR1BJTykKKyNkZWZpbmUgR1BJTzc5X0xDRF9EOQkJUElOX0NGRyg3OSwgQUxUX0EpCisjZGVmaW5lIEdQSU83OV9LUF9JNgkJUElOX0NGRyg3OSwgQUxUX0IpCisjZGVmaW5lIEdQSU83OV9JUF9HUElPMwkJUElOX0NGRyg3OSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzgwX0dQSU8JCVBJTl9DRkcoODAsIEdQSU8pCisjZGVmaW5lIEdQSU84MF9MQ0RfRDEwCQlQSU5fQ0ZHKDgwLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzgwX0tQX1NLQTAJCVBJTl9DRkcoODAsIEFMVF9CKQorI2RlZmluZSBHUElPODBfSVBfR1BJTzQJCVBJTl9DRkcoODAsIEFMVF9DKQorCisjZGVmaW5lIEdQSU84MV9HUElPCQlQSU5fQ0ZHKDgxLCBHUElPKQorI2RlZmluZSBHUElPODFfTENEX0QxMQkJUElOX0NGRyg4MSwgQUxUX0EpCisjZGVmaW5lIEdQSU84MV9LUF9TS0IwCQlQSU5fQ0ZHKDgxLCBBTFRfQikKKyNkZWZpbmUgR1BJTzgxX0lQX0dQSU81CQlQSU5fQ0ZHKDgxLCBBTFRfQykKKworI2RlZmluZSBHUElPODJfR1BJTwkJUElOX0NGRyg4MiwgR1BJTykKKyNkZWZpbmUgR1BJTzgyX0xDRF9EMTIJCVBJTl9DRkcoODIsIEFMVF9BKQorI2RlZmluZSBHUElPODJfS1BfTzUJCVBJTl9DRkcoODIsIEFMVF9CKQorCisjZGVmaW5lIEdQSU84M19HUElPCQlQSU5fQ0ZHKDgzLCBHUElPKQorI2RlZmluZSBHUElPODNfTENEX0QxMwkJUElOX0NGRyg4MywgQUxUX0EpCisjZGVmaW5lIEdQSU84M19LUF9PNAkJUElOX0NGRyg4MywgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzg0X0dQSU8JCVBJTl9DRkcoODQsIEdQSU8pCisjZGVmaW5lIEdQSU84NF9MQ0RfRDE0CQlQSU5fQ0ZHKDg0LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzg0X0tQX0k1CQlQSU5fQ0ZHKDg0LCBBTFRfQikKKworI2RlZmluZSBHUElPODVfR1BJTwkJUElOX0NGRyg4NSwgR1BJTykKKyNkZWZpbmUgR1BJTzg1X0xDRF9EMTUJCVBJTl9DRkcoODUsIEFMVF9BKQorI2RlZmluZSBHUElPODVfS1BfSTQJCVBJTl9DRkcoODUsIEFMVF9CKQorCisjZGVmaW5lIEdQSU84Nl9HUElPCQlQSU5fQ0ZHKDg2LCBHUElPKQorI2RlZmluZSBHUElPODZfTENEX0QxNgkJUElOX0NGRyg4NiwgQUxUX0EpCisjZGVmaW5lIEdQSU84Nl9TTV9BRFEwCQlQSU5fQ0ZHKDg2LCBBTFRfQikKKyNkZWZpbmUgR1BJTzg2X01DNV9EQVQwCQlQSU5fQ0ZHKDg2LCBBTFRfQykKKworI2RlZmluZSBHUElPODdfR1BJTwkJUElOX0NGRyg4NywgR1BJTykKKyNkZWZpbmUgR1BJTzg3X0xDRF9EMTcJCVBJTl9DRkcoODcsIEFMVF9BKQorI2RlZmluZSBHUElPODdfU01fQURRMQkJUElOX0NGRyg4NywgQUxUX0IpCisjZGVmaW5lIEdQSU84N19NQzVfREFUMQkJUElOX0NGRyg4NywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzg4X0dQSU8JCVBJTl9DRkcoODgsIEdQSU8pCisjZGVmaW5lIEdQSU84OF9MQ0RfRDE4CQlQSU5fQ0ZHKDg4LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzg4X1NNX0FEUTIJCVBJTl9DRkcoODgsIEFMVF9CKQorI2RlZmluZSBHUElPODhfTUM1X0RBVDIJCVBJTl9DRkcoODgsIEFMVF9DKQorCisjZGVmaW5lIEdQSU84OV9HUElPCQlQSU5fQ0ZHKDg5LCBHUElPKQorI2RlZmluZSBHUElPODlfTENEX0QxOQkJUElOX0NGRyg4OSwgQUxUX0EpCisjZGVmaW5lIEdQSU84OV9TTV9BRFEzCQlQSU5fQ0ZHKDg5LCBBTFRfQikKKyNkZWZpbmUgR1BJTzg5X01DNV9EQVQzCQlQSU5fQ0ZHKDg5LCBBTFRfQykKKworI2RlZmluZSBHUElPOTBfR1BJTwkJUElOX0NGRyg5MCwgR1BJTykKKyNkZWZpbmUgR1BJTzkwX0xDRF9EMjAJCVBJTl9DRkcoOTAsIEFMVF9BKQorI2RlZmluZSBHUElPOTBfU01fQURRNAkJUElOX0NGRyg5MCwgQUxUX0IpCisjZGVmaW5lIEdQSU85MF9NQzVfQ01ECQlQSU5fQ0ZHKDkwLCBBTFRfQykKKworI2RlZmluZSBHUElPOTFfR1BJTwkJUElOX0NGRyg5MSwgR1BJTykKKyNkZWZpbmUgR1BJTzkxX0xDRF9EMjEJCVBJTl9DRkcoOTEsIEFMVF9BKQorI2RlZmluZSBHUElPOTFfU01fQURRNQkJUElOX0NGRyg5MSwgQUxUX0IpCisjZGVmaW5lIEdQSU85MV9NQzVfRkJDTEsJUElOX0NGRyg5MSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzkyX0dQSU8JCVBJTl9DRkcoOTIsIEdQSU8pCisjZGVmaW5lIEdQSU85Ml9MQ0RfRDIyCQlQSU5fQ0ZHKDkyLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzkyX1NNX0FEUTYJCVBJTl9DRkcoOTIsIEFMVF9CKQorI2RlZmluZSBHUElPOTJfTUM1X0NMSwkJUElOX0NGRyg5MiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzkzX0dQSU8JCVBJTl9DRkcoOTMsIEdQSU8pCisjZGVmaW5lIEdQSU85M19MQ0RfRDIzCQlQSU5fQ0ZHKDkzLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzkzX1NNX0FEUTcJCVBJTl9DRkcoOTMsIEFMVF9CKQorI2RlZmluZSBHUElPOTNfTUM1X0RBVDQJCVBJTl9DRkcoOTMsIEFMVF9DKQorCisjZGVmaW5lIEdQSU85NF9HUElPCQlQSU5fQ0ZHKDk0LCBHUElPKQorI2RlZmluZSBHUElPOTRfS1BfTzcJCVBJTl9DRkcoOTQsIEFMVF9BKQorI2RlZmluZSBHUElPOTRfU01fQURWbgkJUElOX0NGRyg5NCwgQUxUX0IpCisjZGVmaW5lIEdQSU85NF9NQzVfREFUNQkJUElOX0NGRyg5NCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzk1X0dQSU8JCVBJTl9DRkcoOTUsIEdQSU8pCisjZGVmaW5lIEdQSU85NV9LUF9JNwkJUElOX0NGRyg5NSwgQUxUX0EpCisjZGVmaW5lIEdQSU85NV9TTV9DUzBuCQlQSU5fQ0ZHKDk1LCBBTFRfQikKKyNkZWZpbmUgR1BJTzk1X1NNX1BTMG4JCVBJTl9DRkcoOTUsIEFMVF9DKQorCisjZGVmaW5lIEdQSU85Nl9HUElPCQlQSU5fQ0ZHKDk2LCBHUElPKQorI2RlZmluZSBHUElPOTZfS1BfTzYJCVBJTl9DRkcoOTYsIEFMVF9BKQorI2RlZmluZSBHUElPOTZfU01fT0VuCQlQSU5fQ0ZHKDk2LCBBTFRfQikKKyNkZWZpbmUgR1BJTzk2X01DNV9EQVQ2CQlQSU5fQ0ZHKDk2LCBBTFRfQykKKworI2RlZmluZSBHUElPOTdfR1BJTwkJUElOX0NGRyg5NywgR1BJTykKKyNkZWZpbmUgR1BJTzk3X0tQX0k2CQlQSU5fQ0ZHKDk3LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzk3X1NNX1dFbgkJUElOX0NGRyg5NywgQUxUX0IpCisjZGVmaW5lIEdQSU85N19NQzVfREFUNwkJUElOX0NGRyg5NywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzEyOF9HUElPCQlQSU5fQ0ZHKDEyOCwgR1BJTykKKyNkZWZpbmUgR1BJTzEyOF9NQzJfQ0xLCQlQSU5fQ0ZHKDEyOCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMjhfU01fQ0tPCQlQSU5fQ0ZHKDEyOCwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzEyOV9HUElPCQlQSU5fQ0ZHKDEyOSwgR1BJTykKKyNkZWZpbmUgR1BJTzEyOV9NQzJfQ01ECQlQSU5fQ0ZHKDEyOSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMjlfU01fV0FJVDBuCVBJTl9DRkcoMTI5LCBBTFRfQikKKworI2RlZmluZSBHUElPMTMwX0dQSU8JCVBJTl9DRkcoMTMwLCBHUElPKQorI2RlZmluZSBHUElPMTMwX01DMl9GQkNMSwlQSU5fQ0ZHKDEzMCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMzBfU01fRkJDTEsJUElOX0NGRygxMzAsIEFMVF9CKQorI2RlZmluZSBHUElPMTMwX01DMl9SU1ROCVBJTl9DRkcoMTMwLCBBTFRfQykKKworI2RlZmluZSBHUElPMTMxX0dQSU8JCVBJTl9DRkcoMTMxLCBHUElPKQorI2RlZmluZSBHUElPMTMxX01DMl9EQVQwCVBJTl9DRkcoMTMxLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzEzMV9TTV9BRFE4CQlQSU5fQ0ZHKDEzMSwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzEzMl9HUElPCQlQSU5fQ0ZHKDEzMiwgR1BJTykKKyNkZWZpbmUgR1BJTzEzMl9NQzJfREFUMQlQSU5fQ0ZHKDEzMiwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMzJfU01fQURROQkJUElOX0NGRygxMzIsIEFMVF9CKQorCisjZGVmaW5lIEdQSU8xMzNfR1BJTwkJUElOX0NGRygxMzMsIEdQSU8pCisjZGVmaW5lIEdQSU8xMzNfTUMyX0RBVDIJUElOX0NGRygxMzMsIEFMVF9BKQorI2RlZmluZSBHUElPMTMzX1NNX0FEUTEwCVBJTl9DRkcoMTMzLCBBTFRfQikKKworI2RlZmluZSBHUElPMTM0X0dQSU8JCVBJTl9DRkcoMTM0LCBHUElPKQorI2RlZmluZSBHUElPMTM0X01DMl9EQVQzCVBJTl9DRkcoMTM0LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzEzNF9TTV9BRFExMQlQSU5fQ0ZHKDEzNCwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzEzNV9HUElPCQlQSU5fQ0ZHKDEzNSwgR1BJTykKKyNkZWZpbmUgR1BJTzEzNV9NQzJfREFUNAlQSU5fQ0ZHKDEzNSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMzVfU01fQURRMTIJUElOX0NGRygxMzUsIEFMVF9CKQorCisjZGVmaW5lIEdQSU8xMzZfR1BJTwkJUElOX0NGRygxMzYsIEdQSU8pCisjZGVmaW5lIEdQSU8xMzZfTUMyX0RBVDUJUElOX0NGRygxMzYsIEFMVF9BKQorI2RlZmluZSBHUElPMTM2X1NNX0FEUTEzCVBJTl9DRkcoMTM2LCBBTFRfQikKKworI2RlZmluZSBHUElPMTM3X0dQSU8JCVBJTl9DRkcoMTM3LCBHUElPKQorI2RlZmluZSBHUElPMTM3X01DMl9EQVQ2CVBJTl9DRkcoMTM3LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzEzN19TTV9BRFExNAlQSU5fQ0ZHKDEzNywgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzEzOF9HUElPCQlQSU5fQ0ZHKDEzOCwgR1BJTykKKyNkZWZpbmUgR1BJTzEzOF9NQzJfREFUNwlQSU5fQ0ZHKDEzOCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xMzhfU01fQURRMTUJUElOX0NGRygxMzgsIEFMVF9CKQorCisjZGVmaW5lIEdQSU8xMzlfR1BJTwkJUElOX0NGRygxMzksIEdQSU8pCisjZGVmaW5lIEdQSU8xMzlfU1NQMV9SWEQJUElOX0NGRygxMzksIEFMVF9BKQorI2RlZmluZSBHUElPMTM5X1NNX1dBSVQxbglQSU5fQ0ZHKDEzOSwgQUxUX0IpCisjZGVmaW5lIEdQSU8xMzlfS1BfTzgJCVBJTl9DRkcoMTM5LCBBTFRfQykKKworI2RlZmluZSBHUElPMTQwX0dQSU8JCVBJTl9DRkcoMTQwLCBHUElPKQorI2RlZmluZSBHUElPMTQwX1NTUDFfVFhECVBJTl9DRkcoMTQwLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzE0MF9JUF9HUElPNwlQSU5fQ0ZHKDE0MCwgQUxUX0IpCisjZGVmaW5lIEdQSU8xNDBfS1BfU0tBMQkJUElOX0NGRygxNDAsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8xNDFfR1BJTwkJUElOX0NGRygxNDEsIEdQSU8pCisjZGVmaW5lIEdQSU8xNDFfU1NQMV9DTEsJUElOX0NGRygxNDEsIEFMVF9BKQorI2RlZmluZSBHUElPMTQxX0lQX0dQSU8yCVBJTl9DRkcoMTQxLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE0MV9LUF9POQkJUElOX0NGRygxNDEsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8xNDJfR1BJTwkJUElOX0NGRygxNDIsIEdQSU8pCisjZGVmaW5lIEdQSU8xNDJfU1NQMV9GUk0JUElOX0NGRygxNDIsIEFMVF9BKQorI2RlZmluZSBHUElPMTQyX0lQX0dQSU8zCVBJTl9DRkcoMTQyLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE0Ml9LUF9TS0IxCQlQSU5fQ0ZHKDE0MiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE0M19HUElPCQlQSU5fQ0ZHKDE0MywgR1BJTykKKyNkZWZpbmUgR1BJTzE0M19TU1AwX0NMSwlQSU5fQ0ZHKDE0MywgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzE0NF9HUElPCQlQSU5fQ0ZHKDE0NCwgR1BJTykKKyNkZWZpbmUgR1BJTzE0NF9TU1AwX0ZSTQlQSU5fQ0ZHKDE0NCwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzE0NV9HUElPCQlQSU5fQ0ZHKDE0NSwgR1BJTykKKyNkZWZpbmUgR1BJTzE0NV9TU1AwX1JYRAlQSU5fQ0ZHKDE0NSwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzE0Nl9HUElPCQlQSU5fQ0ZHKDE0NiwgR1BJTykKKyNkZWZpbmUgR1BJTzE0Nl9TU1AwX1RYRAlQSU5fQ0ZHKDE0NiwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzE0N19HUElPCQlQSU5fQ0ZHKDE0NywgR1BJTykKKyNkZWZpbmUgR1BJTzE0N19JMkMwX1NDTAlQSU5fQ0ZHX1BVTEwoMTQ3LCBBTFRfQSwgVVApCisKKyNkZWZpbmUgR1BJTzE0OF9HUElPCQlQSU5fQ0ZHKDE0OCwgR1BJTykKKyNkZWZpbmUgR1BJTzE0OF9JMkMwX1NEQQlQSU5fQ0ZHX1BVTEwoMTQ4LCBBTFRfQSwgVVApCisKKyNkZWZpbmUgR1BJTzE0OV9HUElPCQlQSU5fQ0ZHKDE0OSwgR1BJTykKKyNkZWZpbmUgR1BJTzE0OV9JUF9HUElPMAlQSU5fQ0ZHKDE0OSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNDlfU01fQ1MxbgkJUElOX0NGRygxNDksIEFMVF9CKQorI2RlZmluZSBHUElPMTQ5X1NNX1BTMW4JCVBJTl9DRkcoMTQ5LCBBTFRfQykKKworI2RlZmluZSBHUElPMTUwX0dQSU8JCVBJTl9DRkcoMTUwLCBHUElPKQorI2RlZmluZSBHUElPMTUwX0lQX0dQSU8xCVBJTl9DRkcoMTUwLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzE1MF9MQ0RBX0NMSwlQSU5fQ0ZHKDE1MCwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzE1MV9HUElPCQlQSU5fQ0ZHKDE1MSwgR1BJTykKKyNkZWZpbmUgR1BJTzE1MV9LUF9TS0EwCQlQSU5fQ0ZHKDE1MSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNTFfTENEX1ZTSTAJUElOX0NGRygxNTEsIEFMVF9CKQorI2RlZmluZSBHUElPMTUxX0tQX084CQlQSU5fQ0ZHKDE1MSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE1Ml9HUElPCQlQSU5fQ0ZHKDE1MiwgR1BJTykKKyNkZWZpbmUgR1BJTzE1Ml9LUF9TS0IwCQlQSU5fQ0ZHKDE1MiwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNTJfTENEX1ZTSTEJUElOX0NGRygxNTIsIEFMVF9CKQorI2RlZmluZSBHUElPMTUyX0tQX085CQlQSU5fQ0ZHKDE1MiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE1M19HUElPCQlQSU5fQ0ZHKDE1MywgR1BJTykKKyNkZWZpbmUgR1BJTzE1M19LUF9JNwkJUElOX0NGRygxNTMsIEFMVF9BKQorI2RlZmluZSBHUElPMTUzX0xDRF9EMjQJCVBJTl9DRkcoMTUzLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE1M19VMl9SWEQJCVBJTl9DRkcoMTUzLCBBTFRfQykKKworI2RlZmluZSBHUElPMTU0X0dQSU8JCVBJTl9DRkcoMTU0LCBHUElPKQorI2RlZmluZSBHUElPMTU0X0tQX0k2CQlQSU5fQ0ZHKDE1NCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNTRfTENEX0QyNQkJUElOX0NGRygxNTQsIEFMVF9CKQorI2RlZmluZSBHUElPMTU0X1UyX1RYRAkJUElOX0NGRygxNTQsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8xNTVfR1BJTwkJUElOX0NGRygxNTUsIEdQSU8pCisjZGVmaW5lIEdQSU8xNTVfS1BfSTUJCVBJTl9DRkcoMTU1LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzE1NV9MQ0RfRDI2CQlQSU5fQ0ZHKDE1NSwgQUxUX0IpCisjZGVmaW5lIEdQSU8xNTVfU1RNQVBFX0NMSwlQSU5fQ0ZHKDE1NSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE1Nl9HUElPCQlQSU5fQ0ZHKDE1NiwgR1BJTykKKyNkZWZpbmUgR1BJTzE1Nl9LUF9JNAkJUElOX0NGRygxNTYsIEFMVF9BKQorI2RlZmluZSBHUElPMTU2X0xDRF9EMjcJCVBJTl9DRkcoMTU2LCBBTFRfQikKKyNkZWZpbmUgR1BJTzE1Nl9TVE1BUEVfREFUMwlQSU5fQ0ZHKDE1NiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE1N19HUElPCQlQSU5fQ0ZHKDE1NywgR1BJTykKKyNkZWZpbmUgR1BJTzE1N19LUF9PNwkJUElOX0NGRygxNTcsIEFMVF9BKQorI2RlZmluZSBHUElPMTU3X0xDRF9EMjgJCVBJTl9DRkcoMTU3LCBBTFRfQikKKyNkZWZpbmUgR1BJTzE1N19TVE1BUEVfREFUMglQSU5fQ0ZHKDE1NywgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE1OF9HUElPCQlQSU5fQ0ZHKDE1OCwgR1BJTykKKyNkZWZpbmUgR1BJTzE1OF9LUF9PNgkJUElOX0NGRygxNTgsIEFMVF9BKQorI2RlZmluZSBHUElPMTU4X0xDRF9EMjkJCVBJTl9DRkcoMTU4LCBBTFRfQikKKyNkZWZpbmUgR1BJTzE1OF9TVE1BUEVfREFUMQlQSU5fQ0ZHKDE1OCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE1OV9HUElPCQlQSU5fQ0ZHKDE1OSwgR1BJTykKKyNkZWZpbmUgR1BJTzE1OV9LUF9PNQkJUElOX0NGRygxNTksIEFMVF9BKQorI2RlZmluZSBHUElPMTU5X0xDRF9EMzAJCVBJTl9DRkcoMTU5LCBBTFRfQikKKyNkZWZpbmUgR1BJTzE1OV9TVE1BUEVfREFUMAlQSU5fQ0ZHKDE1OSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE2MF9HUElPCQlQSU5fQ0ZHKDE2MCwgR1BJTykKKyNkZWZpbmUgR1BJTzE2MF9LUF9PNAkJUElOX0NGRygxNjAsIEFMVF9BKQorI2RlZmluZSBHUElPMTYwX0xDRF9EMzEJCVBJTl9DRkcoMTYwLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE2MF9OT05FCQlQSU5fQ0ZHKDE2MCwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE2MV9HUElPCQlQSU5fQ0ZHKDE2MSwgR1BJTykKKyNkZWZpbmUgR1BJTzE2MV9LUF9JMwkJUElOX0NGRygxNjEsIEFMVF9BKQorI2RlZmluZSBHUElPMTYxX0xDRF9EMzIJCVBJTl9DRkcoMTYxLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE2MV9VQVJUTU9EX1JYRAlQSU5fQ0ZHKDE2MSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE2Ml9HUElPCQlQSU5fQ0ZHKDE2MiwgR1BJTykKKyNkZWZpbmUgR1BJTzE2Ml9LUF9JMgkJUElOX0NGRygxNjIsIEFMVF9BKQorI2RlZmluZSBHUElPMTYyX0xDRF9EMzMJCVBJTl9DRkcoMTYyLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE2Ml9VQVJUTU9EX1RYRAlQSU5fQ0ZHKDE2MiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE2M19HUElPCQlQSU5fQ0ZHKDE2MywgR1BJTykKKyNkZWZpbmUgR1BJTzE2M19LUF9JMQkJUElOX0NGRygxNjMsIEFMVF9BKQorI2RlZmluZSBHUElPMTYzX0xDRF9EMzQJCVBJTl9DRkcoMTYzLCBBTFRfQikKKyNkZWZpbmUgR1BJTzE2M19TVE1NT0RfQ0xLCVBJTl9DRkcoMTYzLCBBTFRfQykKKworI2RlZmluZSBHUElPMTY0X0dQSU8JCVBJTl9DRkcoMTY0LCBHUElPKQorI2RlZmluZSBHUElPMTY0X0tQX0kwCQlQSU5fQ0ZHKDE2NCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNjRfTENEX0QzNQkJUElOX0NGRygxNjQsIEFMVF9CKQorI2RlZmluZSBHUElPMTY0X1NUTU1PRF9EQVQzCVBJTl9DRkcoMTY0LCBBTFRfQykKKworI2RlZmluZSBHUElPMTY1X0dQSU8JCVBJTl9DRkcoMTY1LCBHUElPKQorI2RlZmluZSBHUElPMTY1X0tQX08zCQlQSU5fQ0ZHKDE2NSwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNjVfTENEX0QzNgkJUElOX0NGRygxNjUsIEFMVF9CKQorI2RlZmluZSBHUElPMTY1X1NUTU1PRF9EQVQyCVBJTl9DRkcoMTY1LCBBTFRfQykKKworI2RlZmluZSBHUElPMTY2X0dQSU8JCVBJTl9DRkcoMTY2LCBHUElPKQorI2RlZmluZSBHUElPMTY2X0tQX08yCQlQSU5fQ0ZHKDE2NiwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNjZfTENEX0QzNwkJUElOX0NGRygxNjYsIEFMVF9CKQorI2RlZmluZSBHUElPMTY2X1NUTU1PRF9EQVQxCVBJTl9DRkcoMTY2LCBBTFRfQykKKworI2RlZmluZSBHUElPMTY3X0dQSU8JCVBJTl9DRkcoMTY3LCBHUElPKQorI2RlZmluZSBHUElPMTY3X0tQX08xCQlQSU5fQ0ZHKDE2NywgQUxUX0EpCisjZGVmaW5lIEdQSU8xNjdfTENEX0QzOAkJUElOX0NGRygxNjcsIEFMVF9CKQorI2RlZmluZSBHUElPMTY3X1NUTU1PRF9EQVQwCVBJTl9DRkcoMTY3LCBBTFRfQykKKworI2RlZmluZSBHUElPMTY4X0dQSU8JCVBJTl9DRkcoMTY4LCBHUElPKQorI2RlZmluZSBHUElPMTY4X0tQX08wCQlQSU5fQ0ZHKDE2OCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNjhfTENEX0QzOQkJUElOX0NGRygxNjgsIEFMVF9CKQorI2RlZmluZSBHUElPMTY4X05PTkUJCVBJTl9DRkcoMTY4LCBBTFRfQykKKworI2RlZmluZSBHUElPMTY5X0dQSU8JCVBJTl9DRkcoMTY5LCBHUElPKQorI2RlZmluZSBHUElPMTY5X1JGX1BVUm4JCVBJTl9DRkcoMTY5LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzE2OV9MQ0RBX0RFCQlQSU5fQ0ZHKDE2OSwgQUxUX0IpCisjZGVmaW5lIEdQSU8xNjlfVVNCU0lNX1BEQwlQSU5fQ0ZHKDE2OSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzE3MF9HUElPCQlQSU5fQ0ZHKDE3MCwgR1BJTykKKyNkZWZpbmUgR1BJTzE3MF9NT0RFTV9TVEFURQlQSU5fQ0ZHKDE3MCwgQUxUX0EpCisjZGVmaW5lIEdQSU8xNzBfTENEQV9WU08JUElOX0NGRygxNzAsIEFMVF9CKQorI2RlZmluZSBHUElPMTcwX0tQX1NLQTEJCVBJTl9DRkcoMTcwLCBBTFRfQykKKworI2RlZmluZSBHUElPMTcxX0dQSU8JCVBJTl9DRkcoMTcxLCBHUElPKQorI2RlZmluZSBHUElPMTcxX01PREVNX1BXUkVOCVBJTl9DRkcoMTcxLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzE3MV9MQ0RBX0hTTwlQSU5fQ0ZHKDE3MSwgQUxUX0IpCisjZGVmaW5lIEdQSU8xNzFfS1BfU0tCMQkJUElOX0NGRygxNzEsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8xOTJfR1BJTwkJUElOX0NGRygxOTIsIEdQSU8pCisjZGVmaW5lIEdQSU8xOTJfTVNQMl9TQ0sJUElOX0NGRygxOTIsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOTNfR1BJTwkJUElOX0NGRygxOTMsIEdQSU8pCisjZGVmaW5lIEdQSU8xOTNfTVNQMl9UWEQJUElOX0NGRygxOTMsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOTRfR1BJTwkJUElOX0NGRygxOTQsIEdQSU8pCisjZGVmaW5lIEdQSU8xOTRfTVNQMl9UQ0sJUElOX0NGRygxOTQsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOTVfR1BJTwkJUElOX0NGRygxOTUsIEdQSU8pCisjZGVmaW5lIEdQSU8xOTVfTVNQMl9URlMJUElOX0NGRygxOTUsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOTZfR1BJTwkJUElOX0NGRygxOTYsIEdQSU8pCisjZGVmaW5lIEdQSU8xOTZfTVNQMl9SWEQJUElOX0NGRygxOTYsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOTdfR1BJTwkJUElOX0NGRygxOTcsIEdQSU8pCisjZGVmaW5lIEdQSU8xOTdfTUM0X0RBVDMJUElOX0NGRygxOTcsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOThfR1BJTwkJUElOX0NGRygxOTgsIEdQSU8pCisjZGVmaW5lIEdQSU8xOThfTUM0X0RBVDIJUElOX0NGRygxOTgsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8xOTlfR1BJTwkJUElOX0NGRygxOTksIEdQSU8pCisjZGVmaW5lIEdQSU8xOTlfTUM0X0RBVDEJUElOX0NGRygxOTksIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yMDBfR1BJTwkJUElOX0NGRygyMDAsIEdQSU8pCisjZGVmaW5lIEdQSU8yMDBfTUM0X0RBVDAJUElOX0NGRygyMDAsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yMDFfR1BJTwkJUElOX0NGRygyMDEsIEdQSU8pCisjZGVmaW5lIEdQSU8yMDFfTUM0X0NNRAkJUElOX0NGRygyMDEsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yMDJfR1BJTwkJUElOX0NGRygyMDIsIEdQSU8pCisjZGVmaW5lIEdQSU8yMDJfTUM0X0ZCQ0xLCVBJTl9DRkcoMjAyLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzIwMl9QV0wJCVBJTl9DRkcoMjAyLCBBTFRfQikKKyNkZWZpbmUgR1BJTzIwMl9NQzRfUlNUTglQSU5fQ0ZHKDIwMiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzIwM19HUElPCQlQSU5fQ0ZHKDIwMywgR1BJTykKKyNkZWZpbmUgR1BJTzIwM19NQzRfQ0xLCQlQSU5fQ0ZHKDIwMywgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIwNF9HUElPCQlQSU5fQ0ZHKDIwNCwgR1BJTykKKyNkZWZpbmUgR1BJTzIwNF9NQzRfREFUNwlQSU5fQ0ZHKDIwNCwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIwNV9HUElPCQlQSU5fQ0ZHKDIwNSwgR1BJTykKKyNkZWZpbmUgR1BJTzIwNV9NQzRfREFUNglQSU5fQ0ZHKDIwNSwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIwNl9HUElPCQlQSU5fQ0ZHKDIwNiwgR1BJTykKKyNkZWZpbmUgR1BJTzIwNl9NQzRfREFUNQlQSU5fQ0ZHKDIwNiwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIwN19HUElPCQlQSU5fQ0ZHKDIwNywgR1BJTykKKyNkZWZpbmUgR1BJTzIwN19NQzRfREFUNAlQSU5fQ0ZHKDIwNywgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIwOF9HUElPCQlQSU5fQ0ZHKDIwOCwgR1BJTykKKyNkZWZpbmUgR1BJTzIwOF9NQzFfQ0xLCQlQSU5fQ0ZHKDIwOCwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIwOV9HUElPCQlQSU5fQ0ZHKDIwOSwgR1BJTykKKyNkZWZpbmUgR1BJTzIwOV9NQzFfRkJDTEsJUElOX0NGRygyMDksIEFMVF9BKQorI2RlZmluZSBHUElPMjA5X1NQSTFfQ0xLCVBJTl9DRkcoMjA5LCBBTFRfQikKKworI2RlZmluZSBHUElPMjEwX0dQSU8JCVBJTl9DRkcoMjEwLCBHUElPKQorI2RlZmluZSBHUElPMjEwX01DMV9DTUQJCVBJTl9DRkcoMjEwLCBBTFRfQSkKKworI2RlZmluZSBHUElPMjExX0dQSU8JCVBJTl9DRkcoMjExLCBHUElPKQorI2RlZmluZSBHUElPMjExX01DMV9EQVQwCVBJTl9DRkcoMjExLCBBTFRfQSkKKworI2RlZmluZSBHUElPMjEyX0dQSU8JCVBJTl9DRkcoMjEyLCBHUElPKQorI2RlZmluZSBHUElPMjEyX01DMV9EQVQxCVBJTl9DRkcoMjEyLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzIxMl9TUEkxX0ZSTQlQSU5fQ0ZHKDIxMiwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzIxM19HUElPCQlQSU5fQ0ZHKDIxMywgR1BJTykKKyNkZWZpbmUgR1BJTzIxM19NQzFfREFUMglQSU5fQ0ZHKDIxMywgQUxUX0EpCisjZGVmaW5lIEdQSU8yMTNfU1BJMV9UWEQJUElOX0NGRygyMTMsIEFMVF9CKQorCisjZGVmaW5lIEdQSU8yMTRfR1BJTwkJUElOX0NGRygyMTQsIEdQSU8pCisjZGVmaW5lIEdQSU8yMTRfTUMxX0RBVDMJUElOX0NGRygyMTQsIEFMVF9BKQorI2RlZmluZSBHUElPMjE0X1NQSTFfUlhECVBJTl9DRkcoMjE0LCBBTFRfQikKKworI2RlZmluZSBHUElPMjE1X0dQSU8JCVBJTl9DRkcoMjE1LCBHUElPKQorI2RlZmluZSBHUElPMjE1X01DMV9DTURESVIJUElOX0NGRygyMTUsIEFMVF9BKQorI2RlZmluZSBHUElPMjE1X01DM19EQVQyRElSCVBJTl9DRkcoMjE1LCBBTFRfQikKKyNkZWZpbmUgR1BJTzIxNV9DTEtPVVQxCQlQSU5fQ0ZHKDIxNSwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzIxNl9HUElPCQlQSU5fQ0ZHKDIxNiwgR1BJTykKKyNkZWZpbmUgR1BJTzIxNl9NQzFfREFUMkRJUglQSU5fQ0ZHKDIxNiwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMTZfTUMzX0NNRERJUglQSU5fQ0ZHKDIxNiwgQUxUX0IpCisjZGVmaW5lIEdQSU8yMTZfSTJDM19TREEJUElOX0NGR19QVUxMKDIxNiwgQUxUX0MsIFVQKQorCisjZGVmaW5lIEdQSU8yMTdfR1BJTwkJUElOX0NGRygyMTcsIEdQSU8pCisjZGVmaW5lIEdQSU8yMTdfTUMxX0RBVDBESVIJUElOX0NGRygyMTcsIEFMVF9BKQorI2RlZmluZSBHUElPMjE3X01DM19EQVQzMURJUglQSU5fQ0ZHKDIxNywgQUxUX0IpCisjZGVmaW5lIEdQSU8yMTdfQ0xLT1VUMgkJUElOX0NGRygyMTcsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yMThfR1BJTwkJUElOX0NGRygyMTgsIEdQSU8pCisjZGVmaW5lIEdQSU8yMThfTUMxX0RBVDMxRElSCVBJTl9DRkcoMjE4LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzIxOF9NQzNfREFUMERJUglQSU5fQ0ZHKDIxOCwgQUxUX0IpCisjZGVmaW5lIEdQSU8yMThfSTJDM19TQ0wJUElOX0NGR19QVUxMKDIxOCwgQUxUX0MsIFVQKQorCisjZGVmaW5lIEdQSU8yMTlfR1BJTwkJUElOX0NGRygyMTksIEdQSU8pCisjZGVmaW5lIEdQSU8yMTlfSFNJUl9GTEEwCVBJTl9DRkcoMjE5LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzIxOV9NQzNfQ0xLCQlQSU5fQ0ZHKDIxOSwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzIyMF9HUElPCQlQSU5fQ0ZHKDIyMCwgR1BJTykKKyNkZWZpbmUgR1BJTzIyMF9IU0lSX0RBVDAJUElOX0NGRygyMjAsIEFMVF9BKQorI2RlZmluZSBHUElPMjIwX01DM19GQkNMSwlQSU5fQ0ZHKDIyMCwgQUxUX0IpCisjZGVmaW5lIEdQSU8yMjBfU1BJMF9DTEsJUElOX0NGRygyMjAsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yMjFfR1BJTwkJUElOX0NGRygyMjEsIEdQSU8pCisjZGVmaW5lIEdQSU8yMjFfSFNJUl9SRFkwCVBJTl9DRkcoMjIxLCBBTFRfQSkKKyNkZWZpbmUgR1BJTzIyMV9NQzNfQ01ECQlQSU5fQ0ZHKDIyMSwgQUxUX0IpCisKKyNkZWZpbmUgR1BJTzIyMl9HUElPCQlQSU5fQ0ZHKDIyMiwgR1BJTykKKyNkZWZpbmUgR1BJTzIyMl9IU0lUX0ZMQTAJUElOX0NGRygyMjIsIEFMVF9BKQorI2RlZmluZSBHUElPMjIyX01DM19EQVQwCVBJTl9DRkcoMjIyLCBBTFRfQikKKworI2RlZmluZSBHUElPMjIzX0dQSU8JCVBJTl9DRkcoMjIzLCBHUElPKQorI2RlZmluZSBHUElPMjIzX0hTSVRfREFUMAlQSU5fQ0ZHKDIyMywgQUxUX0EpCisjZGVmaW5lIEdQSU8yMjNfTUMzX0RBVDEJUElOX0NGRygyMjMsIEFMVF9CKQorI2RlZmluZSBHUElPMjIzX1NQSTBfRlJNCVBJTl9DRkcoMjIzLCBBTFRfQykKKworI2RlZmluZSBHUElPMjI0X0dQSU8JCVBJTl9DRkcoMjI0LCBHUElPKQorI2RlZmluZSBHUElPMjI0X0hTSVRfUkRZMAlQSU5fQ0ZHKDIyNCwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMjRfTUMzX0RBVDIJUElOX0NGRygyMjQsIEFMVF9CKQorI2RlZmluZSBHUElPMjI0X1NQSTBfVFhECVBJTl9DRkcoMjI0LCBBTFRfQykKKworI2RlZmluZSBHUElPMjI1X0dQSU8JCVBJTl9DRkcoMjI1LCBHUElPKQorI2RlZmluZSBHUElPMjI1X0hTSVRfQ0FXQUtFMAlQSU5fQ0ZHKDIyNSwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMjVfTUMzX0RBVDMJUElOX0NGRygyMjUsIEFMVF9CKQorI2RlZmluZSBHUElPMjI1X1NQSTBfUlhECVBJTl9DRkcoMjI1LCBBTFRfQykKKworI2RlZmluZSBHUElPMjI2X0dQSU8JCVBJTl9DRkcoMjI2LCBHUElPKQorI2RlZmluZSBHUElPMjI2X0hTSVRfQUNXQUtFMAlQSU5fQ0ZHKDIyNiwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMjZfUFdMCQlQSU5fQ0ZHKDIyNiwgQUxUX0IpCisjZGVmaW5lIEdQSU8yMjZfVVNCU0lNX1BEQwlQSU5fQ0ZHKDIyNiwgQUxUX0MpCisKKyNkZWZpbmUgR1BJTzIyN19HUElPCQlQSU5fQ0ZHKDIyNywgR1BJTykKKyNkZWZpbmUgR1BJTzIyN19DTEtPVVQxCQlQSU5fQ0ZHKDIyNywgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIyOF9HUElPCQlQSU5fQ0ZHKDIyOCwgR1BJTykKKyNkZWZpbmUgR1BJTzIyOF9DTEtPVVQyCQlQSU5fQ0ZHKDIyOCwgQUxUX0EpCisKKyNkZWZpbmUgR1BJTzIyOV9HUElPCQlQSU5fQ0ZHKDIyOSwgR1BJTykKKyNkZWZpbmUgR1BJTzIyOV9DTEtPVVQxCQlQSU5fQ0ZHKDIyOSwgQUxUX0EpCisjZGVmaW5lIEdQSU8yMjlfUFdMCQlQSU5fQ0ZHKDIyOSwgQUxUX0IpCisjZGVmaW5lIEdQSU8yMjlfSTJDM19TREEJUElOX0NGR19QVUxMKDIyOSwgQUxUX0MsIFVQKQorCisjZGVmaW5lIEdQSU8yMzBfR1BJTwkJUElOX0NGRygyMzAsIEdQSU8pCisjZGVmaW5lIEdQSU8yMzBfQ0xLT1VUMgkJUElOX0NGRygyMzAsIEFMVF9BKQorI2RlZmluZSBHUElPMjMwX1BXTAkJUElOX0NGRygyMzAsIEFMVF9CKQorI2RlZmluZSBHUElPMjMwX0kyQzNfU0NMCVBJTl9DRkdfUFVMTCgyMzAsIEFMVF9DLCBVUCkKKworI2RlZmluZSBHUElPMjU2X0dQSU8JCVBJTl9DRkcoMjU2LCBHUElPKQorI2RlZmluZSBHUElPMjU2X1VTQl9OWFQJCVBJTl9DRkcoMjU2LCBBTFRfQSkKKworI2RlZmluZSBHUElPMjU3X0dQSU8JCVBJTl9DRkcoMjU3LCBHUElPKQorI2RlZmluZSBHUElPMjU3X1VTQl9TVFAJCVBJTl9DRkcoMjU3LCBBTFRfQSkKKworI2RlZmluZSBHUElPMjU4X0dQSU8JCVBJTl9DRkcoMjU4LCBHUElPKQorI2RlZmluZSBHUElPMjU4X1VTQl9YQ0xLCVBJTl9DRkcoMjU4LCBBTFRfQSkKKyNkZWZpbmUgR1BJTzI1OF9OT05FCQlQSU5fQ0ZHKDI1OCwgQUxUX0IpCisjZGVmaW5lIEdQSU8yNThfRERSX1RSSUcJUElOX0NGRygyNTgsIEFMVF9DKQorCisjZGVmaW5lIEdQSU8yNTlfR1BJTwkJUElOX0NGRygyNTksIEdQSU8pCisjZGVmaW5lIEdQSU8yNTlfVVNCX0RJUgkJUElOX0NGRygyNTksIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjBfR1BJTwkJUElOX0NGRygyNjAsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjBfVVNCX0RBVDcJUElOX0NGRygyNjAsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjFfR1BJTwkJUElOX0NGRygyNjEsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjFfVVNCX0RBVDYJUElOX0NGRygyNjEsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjJfR1BJTwkJUElOX0NGRygyNjIsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjJfVVNCX0RBVDUJUElOX0NGRygyNjIsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjNfR1BJTwkJUElOX0NGRygyNjMsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjNfVVNCX0RBVDQJUElOX0NGRygyNjMsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjRfR1BJTwkJUElOX0NGRygyNjQsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjRfVVNCX0RBVDMJUElOX0NGRygyNjQsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjVfR1BJTwkJUElOX0NGRygyNjUsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjVfVVNCX0RBVDIJUElOX0NGRygyNjUsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjZfR1BJTwkJUElOX0NGRygyNjYsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjZfVVNCX0RBVDEJUElOX0NGRygyNjYsIEFMVF9BKQorCisjZGVmaW5lIEdQSU8yNjdfR1BJTwkJUElOX0NGRygyNjcsIEdQSU8pCisjZGVmaW5lIEdQSU8yNjdfVVNCX0RBVDAJUElOX0NGRygyNjcsIEFMVF9BKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCAzZGZmODY0Li5lMzhhY2IwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9wbDA2MS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwMjIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogCkBAIC0zNTQsNiArMzU1LDIxIEBACiAJLmdwaW9fY2QJPSAtMSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2hhcl9sY2RfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBWRVJTQVRJTEVfQ0hBUl9MQ0RfQkFTRSwKKwkJLmVuZCAgID0gKFZFUlNBVElMRV9DSEFSX0xDRF9CQVNFICsgU1pfNEsgLSAxKSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNoYXJfbGNkX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAgICAgICAiYXJtLWNoYXJsY2QiLAorCS5pZCAgICAgICAgICAgICA9ICAgICAgIC0xLAorCS5udW1fcmVzb3VyY2VzICA9ICAgICAgIEFSUkFZX1NJWkUoY2hhcl9sY2RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSAgICAgICBjaGFyX2xjZF9yZXNvdXJjZXMsCit9OworCiAvKgogICogQ2xvY2sgaGFuZGxpbmcKICAqLwpAQCAtNDAwLDggKzQxNiwxMyBAQAogCS5yYXRlCT0gMjQwMDAwMDAsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBkdW1teV9hcGJfcGNsazsKKwogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKLQl7CS8qIFVBUlQwICovCisJewkvKiBBTUJBIGJ1cyBjbG9jayAqLworCQkuY29uX2lkCQk9ICJhcGJfcGNsayIsCisJCS5jbGsJCT0gJmR1bW15X2FwYl9wY2xrLAorCX0sIHsJLyogVUFSVDAgKi8KIAkJLmRldl9pZAkJPSAiZGV2OmYxIiwKIAkJLmNsawkJPSAmcmVmMjRfY2xrLAogCX0sIHsJLyogVUFSVDEgKi8KQEAgLTQyNSw2ICs0NDYsOSBAQAogCX0sIHsJLyogTU1DMSAqLwogCQkuZGV2X2lkCQk9ICJmcGdhOjBiIiwKIAkJLmNsawkJPSAmcmVmMjRfY2xrLAorCX0sIHsJLyogU1NQICovCisJCS5kZXZfaWQJCT0gImRldjpmNCIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKIAl9LCB7CS8qIENMQ0QgKi8KIAkJLmRldl9pZAkJPSAiZGV2OjIwIiwKIAkJLmNsawkJPSAmb3NjNF9jbGssCkBAIC03MDMsNiArNzI3LDEyIEBACiAJLmlycV9iYXNlCT0gSVJRX0dQSU8xX1NUQVJULAogfTsKIAorc3RhdGljIHN0cnVjdCBwbDAyMl9zc3BfY29udHJvbGxlciBzc3AwX3BsYXRfZGF0YSA9IHsKKwkuYnVzX2lkID0gMCwKKwkuZW5hYmxlX2RtYSA9IDAsCisJLm51bV9jaGlwc2VsZWN0ID0gMSwKK307CisKICNkZWZpbmUgQUFDSV9JUlEJeyBJUlFfQUFDSSwgTk9fSVJRIH0KICNkZWZpbmUgQUFDSV9ETUEJeyAweDgwLCAweDgxIH0KICNkZWZpbmUgTU1DSTBfSVJRCXsgSVJRX01NQ0kwQSxJUlFfU0lDX01NQ0kwQiB9CkBAIC03NzIsNyArODAyLDcgQEAKIEFNQkFfREVWSUNFKHVhcnQwLCAiZGV2OmYxIiwgIFVBUlQwLCAgICBOVUxMKTsKIEFNQkFfREVWSUNFKHVhcnQxLCAiZGV2OmYyIiwgIFVBUlQxLCAgICBOVUxMKTsKIEFNQkFfREVWSUNFKHVhcnQyLCAiZGV2OmYzIiwgIFVBUlQyLCAgICBOVUxMKTsKLUFNQkFfREVWSUNFKHNzcDAsICAiZGV2OmY0IiwgIFNTUCwgICAgICBOVUxMKTsKK0FNQkFfREVWSUNFKHNzcDAsICAiZGV2OmY0IiwgIFNTUCwgICAgICAmc3NwMF9wbGF0X2RhdGEpOwogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlICphbWJhX2RldnNbXSBfX2luaXRkYXRhID0gewogCSZkbWFjX2RldmljZSwKQEAgLTg0Myw2ICs4NzMsNyBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdmVyc2F0aWxlX2ZsYXNoX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ2ZXJzYXRpbGVfaTJjX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmNoYXJfbGNkX2RldmljZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKIAkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYwppbmRleCAzMzRmMGRmLi4xM2M3ZTVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiB9CiAKIAotc3RydWN0IHBjaV9idXMgKnBjaV92ZXJzYXRpbGVfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCitzdHJ1Y3QgcGNpX2J1cyAqIF9faW5pdCBwY2lfdmVyc2F0aWxlX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQogewogCXJldHVybiBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwgJnBjaV92ZXJzYXRpbGVfb3BzLCBzeXMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9jdC1jYTl4NC5jIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9jdC1jYTl4NC5jCmluZGV4IDYzNTM0NTkuLjU3N2RmNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvY3QtY2E5eDQuYworKysgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL2N0LWNhOXg0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcG11Lmg+CisjaW5jbHVkZSA8YXNtL3NtcF90d2QuaD4KIAogI2luY2x1ZGUgPG1hY2gvY2xrZGV2Lmg+CiAjaW5jbHVkZSA8bWFjaC9jdC1jYTl4NC5oPgpAQCAtNTMsNiArNTQsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgY3RfY2E5eDRfbWFwX2lvKHZvaWQpCiB7CisJdHdkX2Jhc2UgPSBNTUlPX1AyVihBOV9NUENPUkVfVFdEKTsKIAl2Mm1fbWFwX2lvKGN0X2NhOXg0X2lvX2Rlc2MsIEFSUkFZX1NJWkUoY3RfY2E5eDRfaW9fZGVzYykpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9jdC1jYTl4NC5oIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9pbmNsdWRlL21hY2gvY3QtY2E5eDQuaAppbmRleCA4NjUwZjA0Li5mOWUyZjhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9jdC1jYTl4NC5oCisrKyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL2N0LWNhOXg0LmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgQTlfTVBDT1JFX1NDVQkJKENUX0NBOVg0X01QSUMgKyAweDAwMDApCiAjZGVmaW5lIEE5X01QQ09SRV9HSUNfQ1BVCShDVF9DQTlYNF9NUElDICsgMHgwMTAwKQogI2RlZmluZSBBOV9NUENPUkVfR0lUCQkoQ1RfQ0E5WDRfTVBJQyArIDB4MDIwMCkKKyNkZWZpbmUgQTlfTVBDT1JFX1RXRAkJKENUX0NBOVg0X01QSUMgKyAweDA2MDApCiAjZGVmaW5lIEE5X01QQ09SRV9HSUNfRElTVAkoQ1RfQ0E5WDRfTVBJQyArIDB4MTAwMCkKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jCmluZGV4IGQyNTA3MTEuLjgxN2YwYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYwpAQCAtMjQxLDcgKzI0MSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdjJtX21tY2lfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gIShyZWFkbChNTUlPX1AyVihWMk1fU1lTX01DSSkpICYgKDEgPDwgMCkpOworCXJldHVybiByZWFkbChNTUlPX1AyVihWMk1fU1lTX01DSSkpICYgKDEgPDwgMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhIHYybV9tbWNpX2RhdGEgPSB7CkBAIC0yOTgsOCArMjk4LDEzIEBACiAJLnJhdGUJPSAyNDAwMDAwMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrOworCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgdjJtX2xvb2t1cHNbXSA9IHsKLQl7CS8qIFVBUlQwICovCisJewkvKiBBTUJBIGJ1cyBjbG9jayAqLworCQkuY29uX2lkCQk9ICJhcGJfcGNsayIsCisJCS5jbGsJCT0gJmR1bW15X2FwYl9wY2xrLAorCX0sIHsJLyogVUFSVDAgKi8KIAkJLmRldl9pZAkJPSAibWI6dWFydDAiLAogCQkuY2xrCQk9ICZvc2MyX2NsaywKIAl9LCB7CS8qIFVBUlQxICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvZGV2LmMgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvZGV2LmMKaW5kZXggYjJlZGE0ZC4uN2ExZmE2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2Rldi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9kZXYuYwpAQCAtMzYsNiArMzYsOCBAQAogI2luY2x1ZGUgPG1hY2gvbnVjOTAwX3NwaS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1sZG0uaD4KKyNpbmNsdWRlIDxtYWNoL3c5MHA5MTBfa2V5cGFkLmg+CiAKICNpbmNsdWRlICJjcHUuaCIKIApAQCAtMjA3LDcgKzIwOSw3IEBACiAJLmRpdmlkZXIJPSAyNCwKIAkuc2xlZXAJCT0gMCwKIAkudHhudW0JCT0gMCwKLQkudHhiaXRsZW4JPSAxLAorCS50eGJpdGxlbgk9IDgsCiAJLmJ1c19udW0JPSAwLAogfTsKIApAQCAtMjU2LDcgKzI1OCw3IEBACiAJCS5tb2RhbGlhcyA9ICJtMjVwODAiLAogCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsCiAJCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNoaXBfc2VsZWN0ID0gMCwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmbnVjOTAwX3NwaV9mbGFzaF9kYXRhLAogCQkubW9kZSA9IFNQSV9NT0RFXzAsCiAJfSwKQEAgLTM2MSw2ICszNjMsMzkgQEAKIAogLyogS1BJIGNvbnRyb2xsZXIqLwogCitzdGF0aWMgaW50IG51YzkwMF9rZXltYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZX0EpLAorCUtFWSgwLCAxLCBLRVlfQiksCisJS0VZKDAsIDIsIEtFWV9DKSwKKwlLRVkoMCwgMywgS0VZX0QpLAorCisJS0VZKDEsIDAsIEtFWV9FKSwKKwlLRVkoMSwgMSwgS0VZX0YpLAorCUtFWSgxLCAyLCBLRVlfRyksCisJS0VZKDEsIDMsIEtFWV9IKSwKKworCUtFWSgyLCAwLCBLRVlfSSksCisJS0VZKDIsIDEsIEtFWV9KKSwKKwlLRVkoMiwgMiwgS0VZX0spLAorCUtFWSgyLCAzLCBLRVlfTCksCisKKwlLRVkoMywgMCwgS0VZX00pLAorCUtFWSgzLCAxLCBLRVlfTiksCisJS0VZKDMsIDIsIEtFWV9PKSwKKwlLRVkoMywgMywgS0VZX1ApLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgbnVjOTAwX21hcF9kYXRhID0geworCS5rZXltYXAJCQk9IG51YzkwMF9rZXltYXAsCisJLmtleW1hcF9zaXplCQk9IEFSUkFZX1NJWkUobnVjOTAwX2tleW1hcCksCit9OworCitzdHJ1Y3QgdzkwcDkxMF9rZXlwYWRfcGxhdGZvcm1fZGF0YSBudWM5MDBfa2V5cGFkX2luZm8gPSB7CisJLmtleW1hcF9kYXRhCT0gJm51YzkwMF9tYXBfZGF0YSwKKwkucHJlc2NhbGUJPSAweGZhLAorCS5kZWJvdW5jZQk9IDB4NTAsCit9OworCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG51YzkwMF9rcGlfcmVzb3VyY2VbXSA9IHsKIAlbMF0gPSB7CiAJCS5zdGFydCA9IFc5MFg5MDBfUEFfS1BJLApAQCAtMzgwLDkgKzQxNSw0OSBAQAogCS5pZAkJPSAtMSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobnVjOTAwX2twaV9yZXNvdXJjZSksCiAJLnJlc291cmNlCT0gbnVjOTAwX2twaV9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YSA9ICZudWM5MDBfa2V5cGFkX2luZm8sCisJCQl9CiB9OwogCi0jaWZkZWYgQ09ORklHX0ZCX05VQzkwMAorLyogTENEIGNvbnRyb2xsZXIqLworCitzdGF0aWMgc3RydWN0IG51YzkwMGZiX2Rpc3BsYXkgX19pbml0ZGF0YSBudWM5MDBfbGNkX2luZm9bXSA9IHsKKwkvKiBHaWFudHBsdXMgVGVjaG5vbG9neSBHUE0xMDQwQTAgMzIweDI0MCBDb2xvciBURlQgTENEICovCisJWzBdID0geworCQkudHlwZQkJPSBMQ01fRENDU19WQV9TUkNfUkdCNTY1LAorCQkud2lkdGgJCT0gMzIwLAorCQkuaGVpZ2h0CQk9IDI0MCwKKwkJLnhyZXMJCT0gMzIwLAorCQkueXJlcwkJPSAyNDAsCisJCS5icHAJCT0gMTYsCisJCS5waXhjbG9jawk9IDIwMDAwMCwKKwkJLmxlZnRfbWFyZ2luCT0gMzQsCisJCS5yaWdodF9tYXJnaW4gICA9IDU0LAorCQkuaHN5bmNfbGVuCT0gMTAsCisJCS51cHBlcl9tYXJnaW4JPSAxOCwKKwkJLmxvd2VyX21hcmdpbgk9IDQsCisJCS52c3luY19sZW4JPSAxLAorCQkuZGNjcwkJPSAweDhlMDAwNDFhLAorCQkuZGV2Y3RsCQk9IDB4MDYwODAwYzAsCisJCS5mYmN0cmwJCT0gMHgwMGEwMDBhMCwKKwkJLnNjYWxlCQk9IDB4MDQwMDA0MDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbnVjOTAwZmJfbWFjaF9pbmZvIG51YzkwMF9mYl9pbmZvIF9faW5pdGRhdGEgPSB7CisjaWYgZGVmaW5lZChDT05GSUdfR1BNMTA0MEEwXzMyMFgyNDApCisJLmRpc3BsYXlzCQk9ICZudWM5MDBfbGNkX2luZm9bMF0sCisjZWxzZQorCS5kaXNwbGF5cwkJPSBudWM5MDBfbGNkX2luZm8sCisjZW5kaWYKKwkubnVtX2Rpc3BsYXlzCQk9IEFSUkFZX1NJWkUobnVjOTAwX2xjZF9pbmZvKSwKKwkuZGVmYXVsdF9kaXNwbGF5CT0gMCwKKwkuZ3Bpb19kaXIJCT0gMHgwMDAwMDAwNCwKKwkuZ3Bpb19kaXJfbWFzawkJPSAweEZGRkZGRkZELAorCS5ncGlvX2RhdGEJCT0gMHgwMDAwMDAwNCwKKwkuZ3Bpb19kYXRhX21hc2sJCT0gMHhGRkZGRkZGRCwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbnVjOTAwX2xjZF9yZXNvdXJjZVtdID0gewogCVswXSA9IHsKQEAgLTQwNiwyMyArNDgxLDEwIEBACiAJLmRldiAgICAgICAgICAgICAgPSB7CiAJCS5kbWFfbWFzayAgICAgICAgICAgICAgID0gJm51YzkwMF9kZXZpY2VfbGNkX2RtYW1hc2ssCiAJCS5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gLTEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJm51YzkwMF9mYl9pbmZvLAogCX0KIH07CiAKLXZvaWQgIG51YzkwMF9mYl9zZXRfcGxhdGRhdGEoc3RydWN0IG51YzkwMGZiX21hY2hfaW5mbyAqcGQpCi17Ci0Jc3RydWN0IG51YzkwMGZiX21hY2hfaW5mbyAqbnBkOwotCi0JbnBkID0ga21hbGxvYyhzaXplb2YoKm5wZCksIEdGUF9LRVJORUwpOwotCWlmIChucGQpIHsKLQkJbWVtY3B5KG5wZCwgcGQsIHNpemVvZigqbnBkKSk7Ci0JCW51YzkwMF9kZXZpY2VfbGNkLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm8gbWVtb3J5IGZvciBMQ0QgcGxhdGZvcm0gZGF0YVxuIik7Ci0JfQotfQotI2VuZGlmCi0KIC8qIEFVRElPIGNvbnRyb2xsZXIqLwogc3RhdGljIHU2NCBudWM5MDBfZGV2aWNlX2F1ZGlvX2RtYW1hc2sgPSAtMTsKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbnVjOTAwX2FjOTdfcmVzb3VyY2VbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy1nY3IuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy1nY3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDg3YWJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9yZWdzLWdjci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3JlZ3MtZ2NyLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19HQ1JfSAorI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfR0NSX0gKKworLyogR2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgR0NSX0JBCQlXOTBYOTAwX1ZBX0dDUgorI2RlZmluZSBSRUdfUERJRAkoR0NSX0JBKzB4MDAwKQorI2RlZmluZSBSRUdfUFdST04JKEdDUl9CQSsweDAwNCkKKyNkZWZpbmUgUkVHX0FSQkNPTgkoR0NSX0JBKzB4MDA4KQorI2RlZmluZSBSRUdfTUZTRUwJKEdDUl9CQSsweDAwQykKKyNkZWZpbmUgUkVHX0VCSURQRQkoR0NSX0JBKzB4MDEwKQorI2RlZmluZSBSRUdfTENERFBFCShHQ1JfQkErMHgwMTQpCisjZGVmaW5lIFJFR19HUElPQ1BFCShHQ1JfQkErMHgwMTgpCisjZGVmaW5lIFJFR19HUElPRFBFCShHQ1JfQkErMHgwMUMpCisjZGVmaW5lIFJFR19HUElPRVBFCShHQ1JfQkErMHgwMjApCisjZGVmaW5lIFJFR19HUElPRlBFCShHQ1JfQkErMHgwMjQpCisjZGVmaW5lIFJFR19HUElPR1BFCShHQ1JfQkErMHgwMjgpCisjZGVmaW5lIFJFR19HUElPSFBFCShHQ1JfQkErMHgwMkMpCisjZGVmaW5lIFJFR19HUElPSVBFCShHQ1JfQkErMHgwMzApCisjZGVmaW5lIFJFR19HVE1QMQkoR0NSX0JBKzB4MDM0KQorI2RlZmluZSBSRUdfR1RNUDIJKEdDUl9CQSsweDAzOCkKKyNkZWZpbmUgUkVHX0dUTVAzCShHQ1JfQkErMHgwM0MpCisKKyNlbmRpZiAvKiAgX19BU01fQVJDSF9SRUdTX0dDUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC1udWM5NTBldmIuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jCmluZGV4IGIzZWRjM2MuLjA0ZDI5NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jCkBAIC0yMCw1MSArMjAsMTAgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWxkbS5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KIAogI2luY2x1ZGUgIm51Yzk1MC5oIgogCi0jaWZkZWYgQ09ORklHX0ZCX05VQzkwMAotLyogTENEIENvbnRyb2xsZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgbnVjOTAwZmJfZGlzcGxheSBfX2luaXRkYXRhIG51Yzk1MF9sY2RfaW5mb1tdID0gewotCS8qIEdpYW50cGx1cyBUZWNobm9sb2d5IEdQTTEwNDBBMCAzMjB4MjQwIENvbG9yIFRGVCBMQ0QgKi8KLQlbMF0gPSB7Ci0JCS50eXBlCQk9IExDTV9EQ0NTX1ZBX1NSQ19SR0I1NjUsCi0JCS53aWR0aCAJCT0gMzIwLAotCQkuaGVpZ2h0CQk9IDI0MCwKLQkJLnhyZXMJCT0gMzIwLAotCQkueXJlcwkJPSAyNDAsCi0JCS5icHAJCT0gMTYsCi0JCS5waXhjbG9jawk9IDIwMDAwMCwKLQkJLmxlZnRfbWFyZ2luCT0gMzQsCi0JCS5yaWdodF9tYXJnaW4gICA9IDU0LAotCQkuaHN5bmNfbGVuCT0gMTAsCi0JCS51cHBlcl9tYXJnaW4JPSAxOCwKLQkJLmxvd2VyX21hcmdpbgk9IDQsCi0JCS52c3luY19sZW4JPSAxLAotCQkuZGNjcwkJPSAweDhlMDAwNDFhLAotCQkuZGV2Y3RsCQk9IDB4MDYwODAwYzAsCi0JCS5mYmN0cmwJCT0gMHgwMGEwMDBhMCwKLQkJLnNjYWxlCQk9IDB4MDQwMDA0MDAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbnVjOTAwZmJfbWFjaF9pbmZvIG51Yzk1MF9mYl9pbmZvIF9faW5pdGRhdGEgPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfR1BNMTA0MEEwXzMyMFgyNDApCi0JLmRpc3BsYXlzCQk9ICZudWM5NTBfbGNkX2luZm9bMF0sCi0jZWxzZQotCS5kaXNwbGF5cwkJPSBudWM5NTBfbGNkX2luZm8sCi0jZW5kaWYKLQkubnVtX2Rpc3BsYXlzIAkJPSBBUlJBWV9TSVpFKG51Yzk1MF9sY2RfaW5mbyksCi0JLmRlZmF1bHRfZGlzcGxheQk9IDAsCi0JLmdwaW9fZGlyCQk9IDB4MDAwMDAwMDQsCi0JLmdwaW9fZGlyX21hc2sJCT0gMHhGRkZGRkZGRCwKLQkuZ3Bpb19kYXRhCQk9IDB4MDAwMDAwMDQsCi0JLmdwaW9fZGF0YV9tYXNrCQk9IDB4RkZGRkZGRkQsCi19OwotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIF9faW5pdCBudWM5NTBldmJfbWFwX2lvKHZvaWQpCiB7CiAJbnVjOTUwX21hcF9pbygpOwpAQCAtNzQsOSArMzMsNiBAQAogc3RhdGljIHZvaWQgX19pbml0IG51Yzk1MGV2Yl9pbml0KHZvaWQpCiB7CiAJbnVjOTUwX2JvYXJkX2luaXQoKTsKLSNpZmRlZiBDT05GSUdfRkJfTlVDOTAwCi0JbnVjOTAwX2ZiX3NldF9wbGF0ZGF0YSgmbnVjOTUwX2ZiX2luZm8pOwotI2VuZGlmCiB9CiAKIE1BQ0hJTkVfU1RBUlQoVzkwUDk1MEVWQiwgIlc5MFA5NTBFVkIiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL251YzkxMC5jIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL251YzkxMC5jCmluZGV4IDY1NmYwM2IuLjE1MjNmNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9udWM5MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbnVjOTEwLmMKQEAgLTI2LDYgKzI2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpudWM5MTBfZGV2W10gX19pbml0ZGF0YSA9IHsKIAkmbnVjOTAwX2RldmljZV90cywKIAkmbnVjOTAwX2RldmljZV9ydGMsCisJJm51YzkwMF9kZXZpY2VfbGNkLAorCSZudWM5MDBfZGV2aWNlX2twaSwKIH07CiAKIC8qIGRlZmluZSBzcGVjaWZpYyBDUFUgcGxhdGZvcm0gaW8gbWFwICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbnVjOTUwLmMgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbnVjOTUwLmMKaW5kZXggNGQxZjFhYi4uNTcwNGY3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL251Yzk1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9udWM5NTAuYwpAQCAtMjYsOSArMjYsNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm51Yzk1MF9kZXZbXSBfX2luaXRkYXRhID0gewogCSZudWM5MDBfZGV2aWNlX2twaSwKIAkmbnVjOTAwX2RldmljZV9mbWksCi0jaWZkZWYgQ09ORklHX0ZCX05VQzkwMAogCSZudWM5MDBfZGV2aWNlX2xjZCwKLSNlbmRpZgogfTsKIAogLyogZGVmaW5lIHNwZWNpZmljIENQVSBwbGF0Zm9ybSBpbyBtYXAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDEwMTEwNWUuLjg3ZWMxNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtNzE3LDE3ICs3MTcsNiBAQAogCSAgYSBmZXcgcHJvdG90eXBlcyBsaWtlIHRoYXQgaW4gZXhpc3RlbmNlKSBhbmQgdGhlcmVmb3JlIGFjY2VzcyB0bwogCSAgdGhhdCByZXF1aXJlZCByZWdpc3RlciBtdXN0IGJlIGVtdWxhdGVkLgogCi1jb25maWcgSEFTX1RMU19SRUcKLQlib29sCi0JZGVwZW5kcyBvbiAhVExTX1JFR19FTVVMCi0JZGVmYXVsdCB5IGlmIFNNUCB8fCBDUFVfMzJ2NwotCWhlbHAKLQkgIFRoaXMgc2VsZWN0cyBzdXBwb3J0IGZvciB0aGUgQ1AxNSB0aHJlYWQgcmVnaXN0ZXIuCi0JICBJdCBpcyBkZWZpbmVkIHRvIGJlIGF2YWlsYWJsZSBvbiBzb21lIEFSTXY2IHByb2Nlc3NvcnMgKGluY2x1ZGluZwotCSAgYWxsIFNNUCBjYXBhYmxlIEFSTXY2J3MpIG9yIGxhdGVyIHByb2Nlc3NvcnMuICBVc2VyIHNwYWNlIG1heQotCSAgYXNzdW1lIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGF0IHJlZ2lzdGVyIGFuZCBhbHdheXMgb2J0YWluIHRoZQotCSAgZXhwZWN0ZWQgdmFsdWUgb25seSBvbiBBUk12NyBhbmQgYWJvdmUuCi0KIGNvbmZpZyBORUVEU19TWVNDQUxMX0ZPUl9DTVBYQ0hHCiAJYm9vbAogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL01ha2VmaWxlIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKaW5kZXggZThkMzRhODAuLmQ2M2I2YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21tL01ha2VmaWxlCkBAIC0xNSw3ICsxNSw2IEBACiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IHByb2Mtc3ltcy5vCiAKIG9iai0kKENPTkZJR19BTElHTk1FTlRfVFJBUCkJKz0gYWxpZ25tZW50Lm8KLW9iai0kKENPTkZJR19ESVNDT05USUdNRU0pCSs9IGRpc2NvbnRpZy5vCiBvYmotJChDT05GSUdfSElHSE1FTSkJCSs9IGhpZ2htZW0ubwogCiBvYmotJChDT05GSUdfQ1BVX0FCUlRfTk9NTVUpCSs9IGFib3J0LW5vbW11Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2FsaWdubWVudC5jIGIvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKaW5kZXggNmY5OGMzNS4uZDA3M2I2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKKysrIGIvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKQEAgLTkyNCw4ICs5MjQsMjAgQEAKIAkJYWlfdXNlcm1vZGUgPSBVTV9GSVhVUDsKIAl9CiAKLQlob29rX2ZhdWx0X2NvZGUoMSwgZG9fYWxpZ25tZW50LCBTSUdJTEwsICJhbGlnbm1lbnQgZXhjZXB0aW9uIik7Ci0JaG9va19mYXVsdF9jb2RlKDMsIGRvX2FsaWdubWVudCwgU0lHSUxMLCAiYWxpZ25tZW50IGV4Y2VwdGlvbiIpOworCWhvb2tfZmF1bHRfY29kZSgxLCBkb19hbGlnbm1lbnQsIFNJR0JVUywgQlVTX0FEUkFMTiwKKwkJCSJhbGlnbm1lbnQgZXhjZXB0aW9uIik7CisKKwkvKgorCSAqIEFSTXY2SyBhbmQgQVJNdjcgdXNlIGZhdWx0IHN0YXR1cyAzICgwYjAwMDExKSBhcyBBY2Nlc3MgRmxhZyBzZWN0aW9uCisJICogZmF1bHQsIG5vdCBhcyBhbGlnbm1lbnQgZXJyb3IuCisJICoKKwkgKiBUT0RPOiBoYW5kbGUgQVJNdjZLIHByb3Blcmx5LiBSdW50aW1lIGNoZWNrIGZvciAnSycgZXh0ZW5zaW9uIGlzCisJICogbmVlZGVkLgorCSAqLworCWlmIChjcHVfYXJjaGl0ZWN0dXJlKCkgPD0gQ1BVX0FSQ0hfQVJNdjYpIHsKKwkJaG9va19mYXVsdF9jb2RlKDMsIGRvX2FsaWdubWVudCwgU0lHQlVTLCBCVVNfQURSQUxOLAorCQkJCSJhbGlnbm1lbnQgZXhjZXB0aW9uIik7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKaW5kZXggZGY0OTU1OC4uOTk4MmViMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYwpAQCAtMzIsMTQgKzMyLDE0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY2FjaGVfd2FpdCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBtYXNrKQogewogCS8qIHdhaXQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgKi8KLQl3aGlsZSAocmVhZGwocmVnKSAmIG1hc2spCisJd2hpbGUgKHJlYWRsX3JlbGF4ZWQocmVnKSAmIG1hc2spCiAJCTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNhY2hlX3N5bmModm9pZCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBsMngwX2Jhc2U7Ci0Jd3JpdGVsKDAsIGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMpOwogCWNhY2hlX3dhaXQoYmFzZSArIEwyWDBfQ0FDSEVfU1lOQywgMSk7CiB9CiAKQEAgLTQ3LDE0ICs0NywxNCBAQAogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGwyeDBfYmFzZTsKIAljYWNoZV93YWl0KGJhc2UgKyBMMlgwX0NMRUFOX0xJTkVfUEEsIDEpOwotCXdyaXRlbChhZGRyLCBiYXNlICsgTDJYMF9DTEVBTl9MSU5FX1BBKTsKKwl3cml0ZWxfcmVsYXhlZChhZGRyLCBiYXNlICsgTDJYMF9DTEVBTl9MSU5FX1BBKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGwyeDBfaW52X2xpbmUodW5zaWduZWQgbG9uZyBhZGRyKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGwyeDBfYmFzZTsKIAljYWNoZV93YWl0KGJhc2UgKyBMMlgwX0lOVl9MSU5FX1BBLCAxKTsKLQl3cml0ZWwoYWRkciwgYmFzZSArIEwyWDBfSU5WX0xJTkVfUEEpOworCXdyaXRlbF9yZWxheGVkKGFkZHIsIGJhc2UgKyBMMlgwX0lOVl9MSU5FX1BBKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTDMxMF9FUlJBVEFfNTg4MzY5CkBAIC03NSw5ICs3NSw5IEBACiAKIAkvKiBDbGVhbiBieSBQQSBmb2xsb3dlZCBieSBJbnZhbGlkYXRlIGJ5IFBBICovCiAJY2FjaGVfd2FpdChiYXNlICsgTDJYMF9DTEVBTl9MSU5FX1BBLCAxKTsKLQl3cml0ZWwoYWRkciwgYmFzZSArIEwyWDBfQ0xFQU5fTElORV9QQSk7CisJd3JpdGVsX3JlbGF4ZWQoYWRkciwgYmFzZSArIEwyWDBfQ0xFQU5fTElORV9QQSk7CiAJY2FjaGVfd2FpdChiYXNlICsgTDJYMF9JTlZfTElORV9QQSwgMSk7Ci0Jd3JpdGVsKGFkZHIsIGJhc2UgKyBMMlgwX0lOVl9MSU5FX1BBKTsKKwl3cml0ZWxfcmVsYXhlZChhZGRyLCBiYXNlICsgTDJYMF9JTlZfTElORV9QQSk7CiB9CiAjZWxzZQogCkBAIC05MCw3ICs5MCw3IEBACiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gbDJ4MF9iYXNlOwogCWNhY2hlX3dhaXQoYmFzZSArIEwyWDBfQ0xFQU5fSU5WX0xJTkVfUEEsIDEpOwotCXdyaXRlbChhZGRyLCBiYXNlICsgTDJYMF9DTEVBTl9JTlZfTElORV9QQSk7CisJd3JpdGVsX3JlbGF4ZWQoYWRkciwgYmFzZSArIEwyWDBfQ0xFQU5fSU5WX0xJTkVfUEEpOwogfQogI2VuZGlmCiAKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAJLyogaW52YWxpZGF0ZSBhbGwgd2F5cyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZsMngwX2xvY2ssIGZsYWdzKTsKLQl3cml0ZWwobDJ4MF93YXlfbWFzaywgbDJ4MF9iYXNlICsgTDJYMF9JTlZfV0FZKTsKKwl3cml0ZWxfcmVsYXhlZChsMngwX3dheV9tYXNrLCBsMngwX2Jhc2UgKyBMMlgwX0lOVl9XQVkpOwogCWNhY2hlX3dhaXQobDJ4MF9iYXNlICsgTDJYMF9JTlZfV0FZLCBsMngwX3dheV9tYXNrKTsKIAljYWNoZV9zeW5jKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDJ4MF9sb2NrLCBmbGFncyk7CkBAIC0yMTUsOCArMjE1LDggQEAKIAogCWwyeDBfYmFzZSA9IGJhc2U7CiAKLQljYWNoZV9pZCA9IHJlYWRsKGwyeDBfYmFzZSArIEwyWDBfQ0FDSEVfSUQpOwotCWF1eCA9IHJlYWRsKGwyeDBfYmFzZSArIEwyWDBfQVVYX0NUUkwpOworCWNhY2hlX2lkID0gcmVhZGxfcmVsYXhlZChsMngwX2Jhc2UgKyBMMlgwX0NBQ0hFX0lEKTsKKwlhdXggPSByZWFkbF9yZWxheGVkKGwyeDBfYmFzZSArIEwyWDBfQVVYX0NUUkwpOwogCiAJYXV4ICY9IGF1eF9tYXNrOwogCWF1eCB8PSBhdXhfdmFsOwpAQCAtMjQ4LDE1ICsyNDgsMTUgQEAKIAkgKiBJZiB5b3UgYXJlIGJvb3RpbmcgZnJvbSBub24tc2VjdXJlIG1vZGUKIAkgKiBhY2Nlc3NpbmcgdGhlIGJlbG93IHJlZ2lzdGVycyB3aWxsIGZhdWx0LgogCSAqLwotCWlmICghKHJlYWRsKGwyeDBfYmFzZSArIEwyWDBfQ1RSTCkgJiAxKSkgeworCWlmICghKHJlYWRsX3JlbGF4ZWQobDJ4MF9iYXNlICsgTDJYMF9DVFJMKSAmIDEpKSB7CiAKIAkJLyogbDJ4MCBjb250cm9sbGVyIGlzIGRpc2FibGVkICovCi0JCXdyaXRlbChhdXgsIGwyeDBfYmFzZSArIEwyWDBfQVVYX0NUUkwpOworCQl3cml0ZWxfcmVsYXhlZChhdXgsIGwyeDBfYmFzZSArIEwyWDBfQVVYX0NUUkwpOwogCiAJCWwyeDBfaW52X2FsbCgpOwogCiAJCS8qIGVuYWJsZSBMMlgwICovCi0JCXdyaXRlbCgxLCBsMngwX2Jhc2UgKyBMMlgwX0NUUkwpOworCQl3cml0ZWxfcmVsYXhlZCgxLCBsMngwX2Jhc2UgKyBMMlgwX0NUUkwpOwogCX0KIAogCW91dGVyX2NhY2hlLmludl9yYW5nZSA9IGwyeDBfaW52X3JhbmdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZGlzY29udGlnLmMgYi9hcmNoL2FybS9tbS9kaXNjb250aWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMGM0Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tbS9kaXNjb250aWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tbS9kaXNjb250aWcuYwotICoKLSAqIERpc2NvbnRpZ3VvdXMgbWVtb3J5IHN1cHBvcnQuCi0gKgotICogSW5pdGlhbCBjb2RlOiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBOaWNvbGFzIFBpdHJlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLQotI2lmIE1BWF9OVU1OT0RFUyAhPSA0ICYmIE1BWF9OVU1OT0RFUyAhPSAxNgotIyBlcnJvciBGaXggTWUgUGxlYXNlCi0jZW5kaWYKLQotLyoKLSAqIE91ciBub2RlX2RhdGEgc3RydWN0dXJlIGZvciBkaXNjb250aWd1b3VzIG1lbW9yeS4KLSAqLwotCi1wZ19kYXRhX3QgZGlzY29udGlnX25vZGVfZGF0YVtNQVhfTlVNTk9ERVNdID0gewotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVswXSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVsxXSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVsyXSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVszXSB9LAotI2lmIE1BWF9OVU1OT0RFUyA9PSAxNgotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVs0XSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVs1XSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVs2XSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVs3XSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVs4XSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVs5XSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVsxMF0gfSwKLSAgeyAuYmRhdGEgPSAmYm9vdG1lbV9ub2RlX2RhdGFbMTFdIH0sCi0gIHsgLmJkYXRhID0gJmJvb3RtZW1fbm9kZV9kYXRhWzEyXSB9LAotICB7IC5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVsxM10gfSwKLSAgeyAuYmRhdGEgPSAmYm9vdG1lbV9ub2RlX2RhdGFbMTRdIH0sCi0gIHsgLmJkYXRhID0gJmJvb3RtZW1fbm9kZV9kYXRhWzE1XSB9LAotI2VuZGlmCi19OwotCi1FWFBPUlRfU1lNQk9MKGRpc2NvbnRpZ19ub2RlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKaW5kZXggOWU3NzQyZi4uYzcwNGVlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCkBAIC0xODMsNiArMTgzLDggQEAKIF9fZG1hX2FsbG9jX3JlbWFwKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwLCBwZ3Byb3RfdCBwcm90KQogewogCXN0cnVjdCBhcm1fdm1yZWdpb24gKmM7CisJc2l6ZV90IGFsaWduOworCWludCBiaXQ7CiAKIAlpZiAoIWNvbnNpc3RlbnRfcHRlWzBdKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vdCBpbml0aWFsaXNlZFxuIiwgX19mdW5jX18pOwpAQCAtMTkxLDkgKzE5MywyMCBAQAogCX0KIAogCS8qCisJICogQWxpZ24gdGhlIHZpcnR1YWwgcmVnaW9uIGFsbG9jYXRpb24gLSBtYXhpbXVtIGFsaWdubWVudCBpcworCSAqIGEgc2VjdGlvbiBzaXplLCBtaW5pbXVtIGlzIGEgcGFnZSBzaXplLiAgVGhpcyBoZWxwcyByZWR1Y2UKKwkgKiBmcmFnbWVudGF0aW9uIG9mIHRoZSBETUEgc3BhY2UsIGFuZCBhbHNvIHByZXZlbnRzIGFsbG9jYXRpb25zCisJICogc21hbGxlciB0aGFuIGEgc2VjdGlvbiBmcm9tIGNyb3NzaW5nIGEgc2VjdGlvbiBib3VuZGFyeS4KKwkgKi8KKwliaXQgPSBmbHMoc2l6ZSAtIDEpICsgMTsKKwlpZiAoYml0ID4gU0VDVElPTl9TSElGVCkKKwkJYml0ID0gU0VDVElPTl9TSElGVDsKKwlhbGlnbiA9IDEgPDwgYml0OworCisJLyoKIAkgKiBBbGxvY2F0ZSBhIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgY29uc2lzdGVudCBtYXBwaW5nIHJlZ2lvbi4KIAkgKi8KLQljID0gYXJtX3ZtcmVnaW9uX2FsbG9jKCZjb25zaXN0ZW50X2hlYWQsIHNpemUsCisJYyA9IGFybV92bXJlZ2lvbl9hbGxvYygmY29uc2lzdGVudF9oZWFkLCBhbGlnbiwgc2l6ZSwKIAkJCSAgICBnZnAgJiB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pKTsKIAlpZiAoYykgewogCQlwdGVfdCAqcHRlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggY2JmYjJlZC4uMjNiMGIwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC00MTMsNyArNDEzLDE2IEBACiAJcG1kX2sgPSBwbWRfb2Zmc2V0KHBnZF9rLCBhZGRyKTsKIAlwbWQgICA9IHBtZF9vZmZzZXQocGdkLCBhZGRyKTsKIAotCWlmIChwbWRfbm9uZSgqcG1kX2spKQorCS8qCisJICogT24gQVJNIG9uZSBMaW51eCBQR0QgZW50cnkgY29udGFpbnMgdHdvIGhhcmR3YXJlIGVudHJpZXMgKHNlZSBwYWdlCisJICogdGFibGVzIGxheW91dCBpbiBwZ3RhYmxlLmgpLiBXZSBub3JtYWxseSBndWFyYW50ZWUgdGhhdCB3ZSBhbHdheXMKKwkgKiBmaWxsIGJvdGggTDEgZW50cmllcy4gQnV0IGNyZWF0ZV9tYXBwaW5nKCkgZG9lc24ndCBmb2xsb3cgdGhlIHJ1bGUuCisJICogSXQgY2FuIGNyZWF0ZSBpbmlkaXZpZHVhbCBMMSBlbnRyaWVzLCBzbyBoZXJlIHdlIGhhdmUgdG8gY2FsbAorCSAqIHBtZF9ub25lKCkgY2hlY2sgZm9yIHRoZSBlbnRyeSByZWFsbHkgY29ycmVzcG9uZGVkIHRvIGFkZHJlc3MsIG5vdAorCSAqIGZvciB0aGUgZmlyc3Qgb2YgcGFpci4KKwkgKi8KKwlpbmRleCA9IChhZGRyID4+IFNFQ1RJT05fU0hJRlQpICYgMTsKKwlpZiAocG1kX25vbmUocG1kX2tbaW5kZXhdKSkKIAkJZ290byBiYWRfYXJlYTsKIAogCWNvcHlfcG1kKHBtZCwgcG1kX2spOwpAQCAtNDYzLDE1ICs0NzIsMTAgQEAKIAkgKiBkZWZpbmVzIHRoZXNlIHRvIGJlICJwcmVjaXNlIiBhYm9ydHMuCiAJICovCiAJeyBkb19iYWQsCQlTSUdTRUdWLCAwLAkJInZlY3RvciBleGNlcHRpb24iCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHSUxMLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAogCXsgZG9fYmFkLAkJU0lHS0lMTCwgMCwJCSJ0ZXJtaW5hbCBleGNlcHRpb24iCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHSUxMLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAotLyogRG8gd2UgbmVlZCBydW50aW1lIGNoZWNrID8gKi8KLSNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2CisJeyBkb19iYWQsCQlTSUdCVVMsCSBCVVNfQURSQUxOLAkiYWxpZ25tZW50IGV4Y2VwdGlvbiIJCSAgIH0sCiAJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIGxpbmVmZXRjaCIJICAgfSwKLSNlbHNlCi0JeyBkb190cmFuc2xhdGlvbl9mYXVsdCwJU0lHU0VHViwgU0VHVl9NQVBFUlIsCSJJLWNhY2hlIG1haW50ZW5hbmNlIGZhdWx0IgkgICB9LAotI2VuZGlmCiAJeyBkb190cmFuc2xhdGlvbl9mYXVsdCwJU0lHU0VHViwgU0VHVl9NQVBFUlIsCSJzZWN0aW9uIHRyYW5zbGF0aW9uIGZhdWx0IgkgICB9LAogCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCiAJeyBkb19wYWdlX2ZhdWx0LAlTSUdTRUdWLCBTRUdWX01BUEVSUiwJInBhZ2UgdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCkBAIC01MDgsMTMgKzUxMiwxNSBAQAogCiB2b2lkIF9faW5pdAogaG9va19mYXVsdF9jb2RlKGludCBuciwgaW50ICgqZm4pKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiksCi0JCWludCBzaWcsIGNvbnN0IGNoYXIgKm5hbWUpCisJCWludCBzaWcsIGludCBjb2RlLCBjb25zdCBjaGFyICpuYW1lKQogewotCWlmIChuciA+PSAwICYmIG5yIDwgQVJSQVlfU0laRShmc3JfaW5mbykpIHsKLQkJZnNyX2luZm9bbnJdLmZuICAgPSBmbjsKLQkJZnNyX2luZm9bbnJdLnNpZyAgPSBzaWc7Ci0JCWZzcl9pbmZvW25yXS5uYW1lID0gbmFtZTsKLQl9CisJaWYgKG5yIDwgMCB8fCBuciA+PSBBUlJBWV9TSVpFKGZzcl9pbmZvKSkKKwkJQlVHKCk7CisKKwlmc3JfaW5mb1tucl0uZm4gICA9IGZuOworCWZzcl9pbmZvW25yXS5zaWcgID0gc2lnOworCWZzcl9pbmZvW25yXS5jb2RlID0gY29kZTsKKwlmc3JfaW5mb1tucl0ubmFtZSA9IG5hbWU7CiB9CiAKIC8qCkBAIC01OTQsMyArNjAwLDI1IEBACiAJYXJtX25vdGlmeV9kaWUoIiIsIHJlZ3MsICZpbmZvLCBpZnNyLCAwKTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgZXhjZXB0aW9uc19pbml0KHZvaWQpCit7CisJaWYgKGNwdV9hcmNoaXRlY3R1cmUoKSA+PSBDUFVfQVJDSF9BUk12NikgeworCQlob29rX2ZhdWx0X2NvZGUoNCwgZG9fdHJhbnNsYXRpb25fZmF1bHQsIFNJR1NFR1YsIFNFR1ZfTUFQRVJSLAorCQkJCSJJLWNhY2hlIG1haW50ZW5hbmNlIGZhdWx0Iik7CisJfQorCisJaWYgKGNwdV9hcmNoaXRlY3R1cmUoKSA+PSBDUFVfQVJDSF9BUk12NykgeworCQkvKgorCQkgKiBUT0RPOiBBY2Nlc3MgZmxhZyBmYXVsdHMgaW50cm9kdWNlZCBpbiBBUk12NksuCisJCSAqIFJ1bnRpbWUgY2hlY2sgZm9yICdLJyBleHRlbnNpb24gaXMgbmVlZGVkCisJCSAqLworCQlob29rX2ZhdWx0X2NvZGUoMywgZG9fYmFkLCBTSUdTRUdWLCBTRUdWX01BUEVSUiwKKwkJCQkic2VjdGlvbiBhY2Nlc3MgZmxhZyBmYXVsdCIpOworCQlob29rX2ZhdWx0X2NvZGUoNiwgZG9fYmFkLCBTSUdTRUdWLCBTRUdWX01BUEVSUiwKKwkJCQkic2VjdGlvbiBhY2Nlc3MgZmxhZyBmYXVsdCIpOworCX0KKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGV4Y2VwdGlvbnNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9oaWdobWVtLmMgYi9hcmNoL2FybS9tbS9oaWdobWVtLmMKaW5kZXggMDg2ODE2Yi4uNmFiMjQ0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaGlnaG1lbS5jCisrKyBiL2FyY2gvYXJtL21tL2hpZ2htZW0uYwpAQCAtMTYzLDE5ICsxNjMsMjIgQEAKIAogdm9pZCAqa21hcF9oaWdoX2wxX3ZpcHQoc3RydWN0IHBhZ2UgKnBhZ2UsIHB0ZV90ICpzYXZlZF9wdGUpCiB7Ci0JdW5zaWduZWQgaW50IGlkeCwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCAqZGVwdGggPSAmcGVyX2NwdShrbWFwX2hpZ2hfbDFfdmlwdF9kZXB0aCwgY3B1KTsKKwl1bnNpZ25lZCBpbnQgaWR4LCBjcHU7CisJaW50ICpkZXB0aDsKIAl1bnNpZ25lZCBsb25nIHZhZGRyLCBmbGFnczsKIAlwdGVfdCBwdGUsICpwdGVwOwogCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJZGVwdGggPSAmcGVyX2NwdShrbWFwX2hpZ2hfbDFfdmlwdF9kZXB0aCwgY3B1KTsKKwogCWlkeCA9IEtNX0wxX0NBQ0hFICsgS01fVFlQRV9OUiAqIGNwdTsKIAl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOwogCXB0ZXAgPSBUT1BfUFRFKHZhZGRyKTsKIAlwdGUgPSBta19wdGUocGFnZSwga21hcF9wcm90KTsKIAotCWlmICghaW5faW50ZXJydXB0KCkpCi0JCXByZWVtcHRfZGlzYWJsZSgpOwotCiAJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkoKmRlcHRoKSsrOwogCWlmIChwdGVfdmFsKCpwdGVwKSA9PSBwdGVfdmFsKHB0ZSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCBmNmE5OTk0Li43MTg1YjAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgpAQCAtNzksMzggKzgwLDM3IEBACiB2b2lkIHNob3dfbWVtKHZvaWQpCiB7CiAJaW50IGZyZWUgPSAwLCB0b3RhbCA9IDAsIHJlc2VydmVkID0gMDsKLQlpbnQgc2hhcmVkID0gMCwgY2FjaGVkID0gMCwgc2xhYiA9IDAsIG5vZGUsIGk7CisJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDAsIHNsYWIgPSAwLCBpOwogCXN0cnVjdCBtZW1pbmZvICogbWkgPSAmbWVtaW5mbzsKIAogCXByaW50aygiTWVtLWluZm86XG4iKTsKIAlzaG93X2ZyZWVfYXJlYXMoKTsKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7Ci0JCWZvcl9lYWNoX25vZGViYW5rIChpLG1pLG5vZGUpIHsKLQkJCXN0cnVjdCBtZW1iYW5rICpiYW5rID0gJm1pLT5iYW5rW2ldOwotCQkJdW5zaWduZWQgaW50IHBmbjEsIHBmbjI7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgKmVuZDsKIAotCQkJcGZuMSA9IGJhbmtfcGZuX3N0YXJ0KGJhbmspOwotCQkJcGZuMiA9IGJhbmtfcGZuX2VuZChiYW5rKTsKKwlmb3JfZWFjaF9iYW5rIChpLCBtaSkgeworCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKKwkJdW5zaWduZWQgaW50IHBmbjEsIHBmbjI7CisJCXN0cnVjdCBwYWdlICpwYWdlLCAqZW5kOwogCi0JCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuMSk7Ci0JCQllbmQgID0gcGZuX3RvX3BhZ2UocGZuMiAtIDEpICsgMTsKKwkJcGZuMSA9IGJhbmtfcGZuX3N0YXJ0KGJhbmspOworCQlwZm4yID0gYmFua19wZm5fZW5kKGJhbmspOwogCi0JCQlkbyB7Ci0JCQkJdG90YWwrKzsKLQkJCQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQotCQkJCQlyZXNlcnZlZCsrOwotCQkJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCQkJCWNhY2hlZCsrOwotCQkJCWVsc2UgaWYgKFBhZ2VTbGFiKHBhZ2UpKQotCQkJCQlzbGFiKys7Ci0JCQkJZWxzZSBpZiAoIXBhZ2VfY291bnQocGFnZSkpCi0JCQkJCWZyZWUrKzsKLQkJCQllbHNlCi0JCQkJCXNoYXJlZCArPSBwYWdlX2NvdW50KHBhZ2UpIC0gMTsKLQkJCQlwYWdlKys7Ci0JCQl9IHdoaWxlIChwYWdlIDwgZW5kKTsKLQkJfQorCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuMSk7CisJCWVuZCAgPSBwZm5fdG9fcGFnZShwZm4yIC0gMSkgKyAxOworCisJCWRvIHsKKwkJCXRvdGFsKys7CisJCQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQorCQkJCXJlc2VydmVkKys7CisJCQllbHNlIGlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQkJCWNhY2hlZCsrOworCQkJZWxzZSBpZiAoUGFnZVNsYWIocGFnZSkpCisJCQkJc2xhYisrOworCQkJZWxzZSBpZiAoIXBhZ2VfY291bnQocGFnZSkpCisJCQkJZnJlZSsrOworCQkJZWxzZQorCQkJCXNoYXJlZCArPSBwYWdlX2NvdW50KHBhZ2UpIC0gMTsKKwkJCXBhZ2UrKzsKKwkJfSB3aGlsZSAocGFnZSA8IGVuZCk7CiAJfQogCiAJcHJpbnRrKCIlZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsIGNhY2hlZCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmaW5kX25vZGVfbGltaXRzKGludCBub2RlLCBzdHJ1Y3QgbWVtaW5mbyAqbWksCitzdGF0aWMgdm9pZCBfX2luaXQgZmluZF9saW1pdHMoc3RydWN0IG1lbWluZm8gKm1pLAogCXVuc2lnbmVkIGxvbmcgKm1pbiwgdW5zaWduZWQgbG9uZyAqbWF4X2xvdywgdW5zaWduZWQgbG9uZyAqbWF4X2hpZ2gpCiB7CiAJaW50IGk7CkBAIC0xMjksNyArMTI5LDcgQEAKIAkqbWluID0gLTFVTDsKIAkqbWF4X2xvdyA9ICptYXhfaGlnaCA9IDA7CiAKLQlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCWZvcl9lYWNoX2JhbmsgKGksIG1pKSB7CiAJCXN0cnVjdCBtZW1iYW5rICpiYW5rID0gJm1pLT5iYW5rW2ldOwogCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CiAKQEAgLTE0NywxNTUgKzE0Nyw2NCBAQAogCX0KIH0KIAotLyoKLSAqIEZJWE1FOiBXZSByZWFsbHkgd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nIHRoZSBib290bWFwIGJpdG1hcAotICogb3ZlciB0aGUgdG9wIG9mIHRoZSBpbml0cmQuICBIb3BlZnVsbHksIHRoaXMgaXMgbG9jYXRlZCB0b3dhcmRzCi0gKiB0aGUgc3RhcnQgb2YgYSBiYW5rLCBzbyBpZiB3ZSBhbGxvY2F0ZSB0aGUgYm9vdG1hcCBiaXRtYXAgYXQKLSAqIHRoZSBlbmQsIHdlIHdvbid0IGNsYXNoLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdAotZmluZF9ib290bWFwX3BmbihpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pLCB1bnNpZ25lZCBpbnQgYm9vdG1hcF9wYWdlcykKLXsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfcGZuLCBpLCBib290bWFwX3BmbjsKLQotCXN0YXJ0X3BmbiAgID0gUEFHRV9BTElHTihfX3BhKF9lbmQpKSA+PiBQQUdFX1NISUZUOwotCWJvb3RtYXBfcGZuID0gMDsKLQotCWZvcl9lYWNoX25vZGViYW5rKGksIG1pLCBub2RlKSB7Ci0JCXN0cnVjdCBtZW1iYW5rICpiYW5rID0gJm1pLT5iYW5rW2ldOwotCQl1bnNpZ25lZCBpbnQgc3RhcnQsIGVuZDsKLQotCQlzdGFydCA9IGJhbmtfcGZuX3N0YXJ0KGJhbmspOwotCQllbmQgICA9IGJhbmtfcGZuX2VuZChiYW5rKTsKLQotCQlpZiAoZW5kIDwgc3RhcnRfcGZuKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHN0YXJ0IDwgc3RhcnRfcGZuKQotCQkJc3RhcnQgPSBzdGFydF9wZm47Ci0KLQkJaWYgKGVuZCA8PSBzdGFydCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChlbmQgLSBzdGFydCA+PSBib290bWFwX3BhZ2VzKSB7Ci0JCQlib290bWFwX3BmbiA9IHN0YXJ0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoYm9vdG1hcF9wZm4gPT0gMCkKLQkJQlVHKCk7Ci0KLQlyZXR1cm4gYm9vdG1hcF9wZm47Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNoZWNrX2luaXRyZChzdHJ1Y3QgbWVtaW5mbyAqbWkpCi17Ci0JaW50IGluaXRyZF9ub2RlID0gLTI7Ci0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0JdW5zaWduZWQgbG9uZyBlbmQgPSBwaHlzX2luaXRyZF9zdGFydCArIHBoeXNfaW5pdHJkX3NpemU7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbml0cmQgaXMgd2l0aGluIGEgdmFsaWQgYXJlYSBvZgotCSAqIG1lbW9yeS4KLQkgKi8KLQlpZiAocGh5c19pbml0cmRfc2l6ZSkgewotCQl1bnNpZ25lZCBpbnQgaTsKLQotCQlpbml0cmRfbm9kZSA9IC0xOwotCi0JCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykgewotCQkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWktPmJhbmtbaV07Ci0JCQlpZiAoYmFua19waHlzX3N0YXJ0KGJhbmspIDw9IHBoeXNfaW5pdHJkX3N0YXJ0ICYmCi0JCQkgICAgZW5kIDw9IGJhbmtfcGh5c19lbmQoYmFuaykpCi0JCQkJaW5pdHJkX25vZGUgPSBiYW5rLT5ub2RlOwotCQl9Ci0JfQotCi0JaWYgKGluaXRyZF9ub2RlID09IC0xKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSU5JVFJEOiAweCUwOGx4KzB4JTA4bHggZXh0ZW5kcyBiZXlvbmQgIgotCQkgICAgICAgInBoeXNpY2FsIG1lbW9yeSAtIGRpc2FibGluZyBpbml0cmRcbiIsCi0JCSAgICAgICBwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSk7Ci0JCXBoeXNfaW5pdHJkX3N0YXJ0ID0gcGh5c19pbml0cmRfc2l6ZSA9IDA7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gaW5pdHJkX25vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBib290bWVtX2luaXRfbm9kZShpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pLAorc3RhdGljIHZvaWQgX19pbml0IGFybV9ib290bWVtX2luaXQoc3RydWN0IG1lbWluZm8gKm1pLAogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiB7Ci0JdW5zaWduZWQgbG9uZyBib290X3BmbjsKIAl1bnNpZ25lZCBpbnQgYm9vdF9wYWdlczsKKwlwaHlzX2FkZHJfdCBiaXRtYXA7CiAJcGdfZGF0YV90ICpwZ2RhdDsKIAlpbnQgaTsKIAogCS8qCi0JICogQWxsb2NhdGUgdGhlIGJvb3RtZW0gYml0bWFwIHBhZ2UuCisJICogQWxsb2NhdGUgdGhlIGJvb3RtZW0gYml0bWFwIHBhZ2UuICBUaGlzIG11c3QgYmUgaW4gYSByZWdpb24KKwkgKiBvZiBtZW1vcnkgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBtYXBwZWQuCiAJICovCiAJYm9vdF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKLQlib290X3BmbiA9IGZpbmRfYm9vdG1hcF9wZm4obm9kZSwgbWksIGJvb3RfcGFnZXMpOworCWJpdG1hcCA9IG1lbWJsb2NrX2FsbG9jX2Jhc2UoYm9vdF9wYWdlcyA8PCBQQUdFX1NISUZULCBMMV9DQUNIRV9CWVRFUywKKwkJCQlfX3Bmbl90b19waHlzKGVuZF9wZm4pKTsKIAogCS8qCi0JICogSW5pdGlhbGlzZSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgZm9yIHRoaXMgbm9kZSwgaGFuZGluZyB0aGUKKwkgKiBJbml0aWFsaXNlIHRoZSBib290bWVtIGFsbG9jYXRvciwgaGFuZGluZyB0aGUKIAkgKiBtZW1vcnkgYmFua3Mgb3ZlciB0byBib290bWVtLgogCSAqLwotCW5vZGVfc2V0X29ubGluZShub2RlKTsKLQlwZ2RhdCA9IE5PREVfREFUQShub2RlKTsKLQlpbml0X2Jvb3RtZW1fbm9kZShwZ2RhdCwgYm9vdF9wZm4sIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisJbm9kZV9zZXRfb25saW5lKDApOworCXBnZGF0ID0gTk9ERV9EQVRBKDApOworCWluaXRfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BoeXNfdG9fcGZuKGJpdG1hcCksIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CiAKLQlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCWZvcl9lYWNoX2JhbmsoaSwgbWkpIHsKIAkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWktPmJhbmtbaV07CiAJCWlmICghYmFuay0+aGlnaG1lbSkKLQkJCWZyZWVfYm9vdG1lbV9ub2RlKHBnZGF0LCBiYW5rX3BoeXNfc3RhcnQoYmFuayksIGJhbmtfcGh5c19zaXplKGJhbmspKTsKKwkJCWZyZWVfYm9vdG1lbShiYW5rX3BoeXNfc3RhcnQoYmFuayksIGJhbmtfcGh5c19zaXplKGJhbmspKTsKIAl9CiAKIAkvKgotCSAqIFJlc2VydmUgdGhlIGJvb3RtZW0gYml0bWFwIGZvciB0aGlzIG5vZGUuCisJICogUmVzZXJ2ZSB0aGUgbWVtYmxvY2sgcmVzZXJ2ZWQgcmVnaW9ucyBpbiBib290bWVtLgogCSAqLwotCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBib290X3BmbiA8PCBQQUdFX1NISUZULAotCQkJICAgICBib290X3BhZ2VzIDw8IFBBR0VfU0hJRlQsIEJPT1RNRU1fREVGQVVMVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBib290bWVtX3Jlc2VydmVfaW5pdHJkKGludCBub2RlKQotewotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7Ci0JaW50IHJlczsKLQotCXJlcyA9IHJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBwaHlzX2luaXRyZF9zdGFydCwKLQkJCSAgICAgcGh5c19pbml0cmRfc2l6ZSwgQk9PVE1FTV9FWENMVVNJVkUpOwotCi0JaWYgKHJlcyA9PSAwKSB7Ci0JCWluaXRyZF9zdGFydCA9IF9fcGh5c190b192aXJ0KHBoeXNfaW5pdHJkX3N0YXJ0KTsKLQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIHBoeXNfaW5pdHJkX3NpemU7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiSU5JVFJEOiAweCUwOGx4KzB4JTA4bHggb3ZlcmxhcHMgaW4tdXNlICIKLQkJCSJtZW1vcnkgcmVnaW9uIC0gZGlzYWJsaW5nIGluaXRyZFxuIiwKLQkJCXBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtYmxvY2sucmVzZXJ2ZWQuY250OyBpKyspIHsKKwkJcGh5c19hZGRyX3Qgc3RhcnQgPSBtZW1ibG9ja19zdGFydF9wZm4oJm1lbWJsb2NrLnJlc2VydmVkLCBpKTsKKwkJaWYgKHN0YXJ0ID49IHN0YXJ0X3BmbiAmJgorCQkgICAgbWVtYmxvY2tfZW5kX3BmbigmbWVtYmxvY2sucmVzZXJ2ZWQsIGkpIDw9IGVuZF9wZm4pCisJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wZm5fdG9fcGh5cyhzdGFydCksCisJCQkJbWVtYmxvY2tfc2l6ZV9ieXRlcygmbWVtYmxvY2sucmVzZXJ2ZWQsIGkpLAorCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAJfQotI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBib290bWVtX2ZyZWVfbm9kZShpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pKQorc3RhdGljIHZvaWQgX19pbml0IGFybV9ib290bWVtX2ZyZWUoc3RydWN0IG1lbWluZm8gKm1pLCB1bnNpZ25lZCBsb25nIG1pbiwKKwl1bnNpZ25lZCBsb25nIG1heF9sb3csIHVuc2lnbmVkIGxvbmcgbWF4X2hpZ2gpCiB7CiAJdW5zaWduZWQgbG9uZyB6b25lX3NpemVbTUFYX05SX1pPTkVTXSwgemhvbGVfc2l6ZVtNQVhfTlJfWk9ORVNdOwotCXVuc2lnbmVkIGxvbmcgbWluLCBtYXhfbG93LCBtYXhfaGlnaDsKIAlpbnQgaTsKIAotCWZpbmRfbm9kZV9saW1pdHMobm9kZSwgbWksICZtaW4sICZtYXhfbG93LCAmbWF4X2hpZ2gpOwotCiAJLyoKLQkgKiBpbml0aWFsaXNlIHRoZSB6b25lcyB3aXRoaW4gdGhpcyBub2RlLgorCSAqIGluaXRpYWxpc2UgdGhlIHpvbmVzLgogCSAqLwogCW1lbXNldCh6b25lX3NpemUsIDAsIHNpemVvZih6b25lX3NpemUpKTsKIAogCS8qCi0JICogVGhlIHNpemUgb2YgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZXJtaW5lZC4gIElmIHdlIG5lZWQKLQkgKiB0byBkbyBhbnl0aGluZyBmYW5jeSB3aXRoIHRoZSBhbGxvY2F0aW9uIG9mIHRoaXMgbWVtb3J5IHRvIHRoZQotCSAqIHpvbmVzLCBub3cgaXMgdGhlIHRpbWUgdG8gZG8gaXQuCisJICogVGhlIG1lbW9yeSBzaXplIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZXJtaW5lZC4gIElmIHdlIG5lZWQKKwkgKiB0byBkbyBhbnl0aGluZyBmYW5jeSB3aXRoIHRoZSBhbGxvY2F0aW9uIG9mIHRoaXMgbWVtb3J5CisJICogdG8gdGhlIHpvbmVzLCBub3cgaXMgdGhlIHRpbWUgdG8gZG8gaXQuCiAJICovCiAJem9uZV9zaXplWzBdID0gbWF4X2xvdyAtIG1pbjsKICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtMzAzLDExICsyMTIsMTEgQEAKICNlbmRpZgogCiAJLyoKLQkgKiBGb3IgZWFjaCBiYW5rIGluIHRoaXMgbm9kZSwgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBob2xlcy4KLQkgKiAgaG9sZXMgPSBub2RlX3NpemUgLSBzdW0oYmFua19zaXplc19pbl9ub2RlKQorCSAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgaG9sZXMuCisJICogIGhvbGVzID0gbm9kZV9zaXplIC0gc3VtKGJhbmtfc2l6ZXMpCiAJICovCiAJbWVtY3B5KHpob2xlX3NpemUsIHpvbmVfc2l6ZSwgc2l6ZW9mKHpob2xlX3NpemUpKTsKLQlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCWZvcl9lYWNoX2JhbmsoaSwgbWkpIHsKIAkJaW50IGlkeCA9IDA7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAkJaWYgKG1pLT5iYW5rW2ldLmhpZ2htZW0pCkBAIC0zMjAsMjQgKzIyOSwyMyBAQAogCSAqIEFkanVzdCB0aGUgc2l6ZXMgYWNjb3JkaW5nIHRvIGFueSBzcGVjaWFsIHJlcXVpcmVtZW50cyBmb3IKIAkgKiB0aGlzIG1hY2hpbmUgdHlwZS4KIAkgKi8KLQlhcmNoX2FkanVzdF96b25lcyhub2RlLCB6b25lX3NpemUsIHpob2xlX3NpemUpOworCWFyY2hfYWRqdXN0X3pvbmVzKHpvbmVfc2l6ZSwgemhvbGVfc2l6ZSk7CiAKLQlmcmVlX2FyZWFfaW5pdF9ub2RlKG5vZGUsIHpvbmVfc2l6ZSwgbWluLCB6aG9sZV9zaXplKTsKKwlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsIHpvbmVfc2l6ZSwgbWluLCB6aG9sZV9zaXplKTsKIH0KIAogI2lmbmRlZiBDT05GSUdfU1BBUlNFTUVNCiBpbnQgcGZuX3ZhbGlkKHVuc2lnbmVkIGxvbmcgcGZuKQogewotCXN0cnVjdCBtZW1pbmZvICptaSA9ICZtZW1pbmZvOwotCXVuc2lnbmVkIGludCBsZWZ0ID0gMCwgcmlnaHQgPSBtaS0+bnJfYmFua3M7CisJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqbWVtID0gJm1lbWJsb2NrLm1lbW9yeTsKKwl1bnNpZ25lZCBpbnQgbGVmdCA9IDAsIHJpZ2h0ID0gbWVtLT5jbnQ7CiAKIAlkbyB7CiAJCXVuc2lnbmVkIGludCBtaWQgPSAocmlnaHQgKyBsZWZ0KSAvIDI7Ci0JCXN0cnVjdCBtZW1iYW5rICpiYW5rID0gJm1pLT5iYW5rW21pZF07CiAKLQkJaWYgKHBmbiA8IGJhbmtfcGZuX3N0YXJ0KGJhbmspKQorCQlpZiAocGZuIDwgbWVtYmxvY2tfc3RhcnRfcGZuKG1lbSwgbWlkKSkKIAkJCXJpZ2h0ID0gbWlkOwotCQllbHNlIGlmIChwZm4gPj0gYmFua19wZm5fZW5kKGJhbmspKQorCQllbHNlIGlmIChwZm4gPj0gbWVtYmxvY2tfZW5kX3BmbihtZW0sIG1pZCkpCiAJCQlsZWZ0ID0gbWlkICsgMTsKIAkJZWxzZQogCQkJcmV0dXJuIDE7CkBAIC0zNDYsNzMgKzI1NCw2OSBAQAogfQogRVhQT1JUX1NZTUJPTChwZm5fdmFsaWQpOwogCi1zdGF0aWMgdm9pZCBhcm1fbWVtb3J5X3ByZXNlbnQoc3RydWN0IG1lbWluZm8gKm1pLCBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIGFybV9tZW1vcnlfcHJlc2VudCh2b2lkKQogewogfQogI2Vsc2UKLXN0YXRpYyB2b2lkIGFybV9tZW1vcnlfcHJlc2VudChzdHJ1Y3QgbWVtaW5mbyAqbWksIGludCBub2RlKQorc3RhdGljIHZvaWQgYXJtX21lbW9yeV9wcmVzZW50KHZvaWQpCiB7CiAJaW50IGk7Ci0JZm9yX2VhY2hfbm9kZWJhbmsoaSwgbWksIG5vZGUpIHsKLQkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWktPmJhbmtbaV07Ci0JCW1lbW9yeV9wcmVzZW50KG5vZGUsIGJhbmtfcGZuX3N0YXJ0KGJhbmspLCBiYW5rX3Bmbl9lbmQoYmFuaykpOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgbWVtYmxvY2subWVtb3J5LmNudDsgaSsrKQorCQltZW1vcnlfcHJlc2VudCgwLCBtZW1ibG9ja19zdGFydF9wZm4oJm1lbWJsb2NrLm1lbW9yeSwgaSksCisJCQkJICBtZW1ibG9ja19lbmRfcGZuKCZtZW1ibG9jay5tZW1vcnksIGkpKTsKIH0KICNlbmRpZgogCit2b2lkIF9faW5pdCBhcm1fbWVtYmxvY2tfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqbWksIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjKQoreworCWludCBpOworCisJbWVtYmxvY2tfaW5pdCgpOworCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykKKwkJbWVtYmxvY2tfYWRkKG1pLT5iYW5rW2ldLnN0YXJ0LCBtaS0+YmFua1tpXS5zaXplKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBrZXJuZWwgdGV4dCwga2VybmVsIGRhdGEgYW5kIGluaXRyZCB3aXRoIG1lbWJsb2NrLiAqLworI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCisJbWVtYmxvY2tfcmVzZXJ2ZShfX3BhKF9kYXRhKSwgX2VuZCAtIF9kYXRhKTsKKyNlbHNlCisJbWVtYmxvY2tfcmVzZXJ2ZShfX3BhKF9zdGV4dCksIF9lbmQgLSBfc3RleHQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKHBoeXNfaW5pdHJkX3NpemUpIHsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSk7CisKKwkJLyogTm93IGNvbnZlcnQgaW5pdHJkIHRvIHZpcnR1YWwgYWRkcmVzc2VzICovCisJCWluaXRyZF9zdGFydCA9IF9fcGh5c190b192aXJ0KHBoeXNfaW5pdHJkX3N0YXJ0KTsKKwkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIHBoeXNfaW5pdHJkX3NpemU7CisJfQorI2VuZGlmCisKKwlhcm1fbW1fbWVtYmxvY2tfcmVzZXJ2ZSgpOworCisJLyogcmVzZXJ2ZSBhbnkgcGxhdGZvcm0gc3BlY2lmaWMgbWVtYmxvY2sgYXJlYXMgKi8KKwlpZiAobWRlc2MtPnJlc2VydmUpCisJCW1kZXNjLT5yZXNlcnZlKCk7CisKKwltZW1ibG9ja19hbmFseXplKCk7CisJbWVtYmxvY2tfZHVtcF9hbGwoKTsKK30KKwogdm9pZCBfX2luaXQgYm9vdG1lbV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IG1lbWluZm8gKm1pID0gJm1lbWluZm87CiAJdW5zaWduZWQgbG9uZyBtaW4sIG1heF9sb3csIG1heF9oaWdoOwotCWludCBub2RlLCBpbml0cmRfbm9kZTsKLQotCS8qCi0JICogTG9jYXRlIHdoaWNoIG5vZGUgY29udGFpbnMgdGhlIHJhbWRpc2sgaW1hZ2UsIGlmIGFueS4KLQkgKi8KLQlpbml0cmRfbm9kZSA9IGNoZWNrX2luaXRyZChtaSk7CiAKIAltYXhfbG93ID0gbWF4X2hpZ2ggPSAwOwogCisJZmluZF9saW1pdHMobWksICZtaW4sICZtYXhfbG93LCAmbWF4X2hpZ2gpOworCisJYXJtX2Jvb3RtZW1faW5pdChtaSwgbWluLCBtYXhfbG93KTsKKwogCS8qCi0JICogUnVuIHRocm91Z2ggZWFjaCBub2RlIGluaXRpYWxpc2luZyB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCisJICogU3BhcnNlbWVtIHRyaWVzIHRvIGFsbG9jYXRlIGJvb3RtZW0gaW4gbWVtb3J5X3ByZXNlbnQoKSwKKwkgKiBzbyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpeGVkIHJlc2VydmF0aW9ucwogCSAqLwotCWZvcl9lYWNoX25vZGUobm9kZSkgewotCQl1bnNpZ25lZCBsb25nIG5vZGVfbG93LCBub2RlX2hpZ2g7Ci0KLQkJZmluZF9ub2RlX2xpbWl0cyhub2RlLCBtaSwgJm1pbiwgJm5vZGVfbG93LCAmbm9kZV9oaWdoKTsKLQotCQlpZiAobm9kZV9sb3cgPiBtYXhfbG93KQotCQkJbWF4X2xvdyA9IG5vZGVfbG93OwotCQlpZiAobm9kZV9oaWdoID4gbWF4X2hpZ2gpCi0JCQltYXhfaGlnaCA9IG5vZGVfaGlnaDsKLQotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBubyBtZW1vcnkgaW4gdGhpcyBub2RlLCBpZ25vcmUgaXQuCi0JCSAqIChXZSBjYW4ndCBoYXZlIG5vZGVzIHdoaWNoIGhhdmUgbm8gbG93bWVtKQotCQkgKi8KLQkJaWYgKG5vZGVfbG93ID09IDApCi0JCQljb250aW51ZTsKLQotCQlib290bWVtX2luaXRfbm9kZShub2RlLCBtaSwgbWluLCBub2RlX2xvdyk7Ci0KLQkJLyoKLQkJICogUmVzZXJ2ZSBhbnkgc3BlY2lhbCBub2RlIHplcm8gcmVnaW9ucy4KLQkJICovCi0JCWlmIChub2RlID09IDApCi0JCQlyZXNlcnZlX25vZGVfemVybyhOT0RFX0RBVEEobm9kZSkpOwotCi0JCS8qCi0JCSAqIElmIHRoZSBpbml0cmQgaXMgaW4gdGhpcyBub2RlLCByZXNlcnZlIGl0cyBtZW1vcnkuCi0JCSAqLwotCQlpZiAobm9kZSA9PSBpbml0cmRfbm9kZSkKLQkJCWJvb3RtZW1fcmVzZXJ2ZV9pbml0cmQobm9kZSk7Ci0KLQkJLyoKLQkJICogU3BhcnNlbWVtIHRyaWVzIHRvIGFsbG9jYXRlIGJvb3RtZW0gaW4gbWVtb3J5X3ByZXNlbnQoKSwKLQkJICogc28gbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaXhlZCByZXNlcnZhdGlvbnMKLQkJICovCi0JCWFybV9tZW1vcnlfcHJlc2VudChtaSwgbm9kZSk7Ci0JfQorCWFybV9tZW1vcnlfcHJlc2VudCgpOwogCiAJLyoKIAkgKiBzcGFyc2VfaW5pdCgpIG5lZWRzIHRoZSBib290bWVtIGFsbG9jYXRvciB1cCBhbmQgcnVubmluZy4KQEAgLTQyMCwxMiArMzI0LDExIEBACiAJc3BhcnNlX2luaXQoKTsKIAogCS8qCi0JICogTm93IGZyZWUgbWVtb3J5IGluIGVhY2ggbm9kZSAtIGZyZWVfYXJlYV9pbml0X25vZGUgbmVlZHMKKwkgKiBOb3cgZnJlZSB0aGUgbWVtb3J5IC0gZnJlZV9hcmVhX2luaXRfbm9kZSBuZWVkcwogCSAqIHRoZSBzcGFyc2UgbWVtX21hcCBhcnJheXMgaW5pdGlhbGl6ZWQgYnkgc3BhcnNlX2luaXQoKQogCSAqIGZvciBtZW1tYXBfaW5pdF96b25lKCksIG90aGVyd2lzZSBhbGwgUEZOcyBhcmUgaW52YWxpZC4KIAkgKi8KLQlmb3JfZWFjaF9ub2RlKG5vZGUpCi0JCWJvb3RtZW1fZnJlZV9ub2RlKG5vZGUsIG1pKTsKKwlhcm1fYm9vdG1lbV9mcmVlKG1pLCBtaW4sIG1heF9sb3csIG1heF9oaWdoKTsKIAogCWhpZ2hfbWVtb3J5ID0gX192YSgobWF4X2xvdyA8PCBQQUdFX1NISUZUKSAtIDEpICsgMTsKIApAQCAtNDYwLDcgKzM2Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotZnJlZV9tZW1tYXAoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCitmcmVlX21lbW1hcCh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQogewogCXN0cnVjdCBwYWdlICpzdGFydF9wZywgKmVuZF9wZzsKIAl1bnNpZ25lZCBsb25nIHBnLCBwZ2VuZDsKQEAgLTQ4Myw0MCArMzg2LDM5IEBACiAJICogZnJlZSB0aGUgc2VjdGlvbiBvZiB0aGUgbWVtbWFwIGFycmF5LgogCSAqLwogCWlmIChwZyA8IHBnZW5kKQotCQlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksIHBnLCBwZ2VuZCAtIHBnKTsKKwkJZnJlZV9ib290bWVtKHBnLCBwZ2VuZCAtIHBnKTsKIH0KIAogLyoKICAqIFRoZSBtZW1fbWFwIGFycmF5IGNhbiBnZXQgdmVyeSBiaWcuICBGcmVlIHRoZSB1bnVzZWQgYXJlYSBvZiB0aGUgbWVtb3J5IG1hcC4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGZyZWVfdW51c2VkX21lbW1hcF9ub2RlKGludCBub2RlLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCitzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV91bnVzZWRfbWVtbWFwKHN0cnVjdCBtZW1pbmZvICptaSkKIHsKIAl1bnNpZ25lZCBsb25nIGJhbmtfc3RhcnQsIHByZXZfYmFua19lbmQgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCiAJLyoKLQkgKiBbRklYTUVdIFRoaXMgcmVsaWVzIG9uIGVhY2ggYmFuayBiZWluZyBpbiBhZGRyZXNzIG9yZGVyLiAgVGhpcwotCSAqIG1heSBub3QgYmUgdGhlIGNhc2UsIGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgaGFzIHByb3ZpZGVkIHRoZQotCSAqIGluZm9ybWF0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuCisJICogVGhpcyByZWxpZXMgb24gZWFjaCBiYW5rIGJlaW5nIGluIGFkZHJlc3Mgb3JkZXIuCisJICogVGhlIGJhbmtzIGFyZSBzb3J0ZWQgcHJldmlvdXNseSBpbiBib290bWVtX2luaXQoKS4KIAkgKi8KLQlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCWZvcl9lYWNoX2JhbmsoaSwgbWkpIHsKIAkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWktPmJhbmtbaV07CiAKIAkJYmFua19zdGFydCA9IGJhbmtfcGZuX3N0YXJ0KGJhbmspOwotCQlpZiAoYmFua19zdGFydCA8IHByZXZfYmFua19lbmQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiTUVNOiB1bm9yZGVyZWQgbWVtb3J5IGJhbmtzLiAgIgotCQkJCSJOb3QgZnJlZWluZyBtZW1tYXAuXG4iKTsKLQkJCWJyZWFrOwotCQl9CiAKIAkJLyoKIAkJICogSWYgd2UgaGFkIGEgcHJldmlvdXMgYmFuaywgYW5kIHRoZXJlIGlzIGEgc3BhY2UKIAkJICogYmV0d2VlbiB0aGUgY3VycmVudCBiYW5rIGFuZCB0aGUgcHJldmlvdXMsIGZyZWUgaXQuCiAJCSAqLwotCQlpZiAocHJldl9iYW5rX2VuZCAmJiBwcmV2X2JhbmtfZW5kICE9IGJhbmtfc3RhcnQpCi0JCQlmcmVlX21lbW1hcChub2RlLCBwcmV2X2JhbmtfZW5kLCBiYW5rX3N0YXJ0KTsKKwkJaWYgKHByZXZfYmFua19lbmQgJiYgcHJldl9iYW5rX2VuZCA8IGJhbmtfc3RhcnQpCisJCQlmcmVlX21lbW1hcChwcmV2X2JhbmtfZW5kLCBiYW5rX3N0YXJ0KTsKIAotCQlwcmV2X2JhbmtfZW5kID0gYmFua19wZm5fZW5kKGJhbmspOworCQkvKgorCQkgKiBBbGlnbiB1cCBoZXJlIHNpbmNlIHRoZSBWTSBzdWJzeXN0ZW0gaW5zaXN0cyB0aGF0IHRoZQorCQkgKiBtZW1tYXAgZW50cmllcyBhcmUgdmFsaWQgZnJvbSB0aGUgYmFuayBlbmQgYWxpZ25lZCB0bworCQkgKiBNQVhfT1JERVJfTlJfUEFHRVMuCisJCSAqLworCQlwcmV2X2JhbmtfZW5kID0gQUxJR04oYmFua19wZm5fZW5kKGJhbmspLCBNQVhfT1JERVJfTlJfUEFHRVMpOwogCX0KIH0KIApAQCAtNTI4LDIxICs0MzAsMTkgQEAKIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByZXNlcnZlZF9wYWdlcywgZnJlZV9wYWdlczsKLQlpbnQgaSwgbm9kZTsKLQotI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCi0JbWF4X21hcG5yICAgPSBwZm5fdG9fcGFnZShtYXhfcGZuICsgUEhZU19QRk5fT0ZGU0VUKSAtIG1lbV9tYXA7CisJaW50IGk7CisjaWZkZWYgQ09ORklHX0hBVkVfVENNCisJLyogVGhlc2UgcG9pbnRlcnMgYXJlIGZpbGxlZCBpbiBvbiBUQ00gZGV0ZWN0aW9uICovCisJZXh0ZXJuIHUzMiBkdGNtX2VuZDsKKwlleHRlcm4gdTMyIGl0Y21fZW5kOwogI2VuZGlmCiAKKwltYXhfbWFwbnIgICA9IHBmbl90b19wYWdlKG1heF9wZm4gKyBQSFlTX1BGTl9PRkZTRVQpIC0gbWVtX21hcDsKKwogCS8qIHRoaXMgd2lsbCBwdXQgYWxsIHVudXNlZCBsb3cgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLwotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKLQkJcGdfZGF0YV90ICpwZ2RhdCA9IE5PREVfREFUQShub2RlKTsKKwlmcmVlX3VudXNlZF9tZW1tYXAoJm1lbWluZm8pOwogCi0JCWZyZWVfdW51c2VkX21lbW1hcF9ub2RlKG5vZGUsICZtZW1pbmZvKTsKLQotCQlpZiAocGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcyAhPSAwKQotCQkJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbV9ub2RlKHBnZGF0KTsKLQl9CisJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbSgpOwogCiAjaWZkZWYgQ09ORklHX1NBMTExMQogCS8qIG5vdyB0aGF0IG91ciBETUEgbWVtb3J5IGlzIGFjdHVhbGx5IHNvIGRlc2lnbmF0ZWQsIHdlIGNhbiBmcmVlIGl0ICovCkBAIC01NTIsMzkgKzQ1MiwzNSBAQAogCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAkvKiBzZXQgaGlnaG1lbSBwYWdlIGZyZWUgKi8KLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7Ci0JCWZvcl9lYWNoX25vZGViYW5rIChpLCAmbWVtaW5mbywgbm9kZSkgewotCQkJdW5zaWduZWQgbG9uZyBzdGFydCA9IGJhbmtfcGZuX3N0YXJ0KCZtZW1pbmZvLmJhbmtbaV0pOwotCQkJdW5zaWduZWQgbG9uZyBlbmQgPSBiYW5rX3Bmbl9lbmQoJm1lbWluZm8uYmFua1tpXSk7Ci0JCQlpZiAoc3RhcnQgPj0gbWF4X2xvd19wZm4gKyBQSFlTX1BGTl9PRkZTRVQpCi0JCQkJdG90YWxoaWdoX3BhZ2VzICs9IGZyZWVfYXJlYShzdGFydCwgZW5kLCBOVUxMKTsKLQkJfQorCWZvcl9lYWNoX2JhbmsgKGksICZtZW1pbmZvKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBiYW5rX3Bmbl9zdGFydCgmbWVtaW5mby5iYW5rW2ldKTsKKwkJdW5zaWduZWQgbG9uZyBlbmQgPSBiYW5rX3Bmbl9lbmQoJm1lbWluZm8uYmFua1tpXSk7CisJCWlmIChzdGFydCA+PSBtYXhfbG93X3BmbiArIFBIWVNfUEZOX09GRlNFVCkKKwkJCXRvdGFsaGlnaF9wYWdlcyArPSBmcmVlX2FyZWEoc3RhcnQsIGVuZCwgTlVMTCk7CiAJfQogCXRvdGFscmFtX3BhZ2VzICs9IHRvdGFsaGlnaF9wYWdlczsKICNlbmRpZgogCiAJcmVzZXJ2ZWRfcGFnZXMgPSBmcmVlX3BhZ2VzID0gMDsKIAotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKLQkJZm9yX2VhY2hfbm9kZWJhbmsoaSwgJm1lbWluZm8sIG5vZGUpIHsKLQkJCXN0cnVjdCBtZW1iYW5rICpiYW5rID0gJm1lbWluZm8uYmFua1tpXTsKLQkJCXVuc2lnbmVkIGludCBwZm4xLCBwZm4yOwotCQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7CisJZm9yX2VhY2hfYmFuayhpLCAmbWVtaW5mbykgeworCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtZW1pbmZvLmJhbmtbaV07CisJCXVuc2lnbmVkIGludCBwZm4xLCBwZm4yOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgKmVuZDsKIAotCQkJcGZuMSA9IGJhbmtfcGZuX3N0YXJ0KGJhbmspOwotCQkJcGZuMiA9IGJhbmtfcGZuX2VuZChiYW5rKTsKKwkJcGZuMSA9IGJhbmtfcGZuX3N0YXJ0KGJhbmspOworCQlwZm4yID0gYmFua19wZm5fZW5kKGJhbmspOwogCi0JCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuMSk7Ci0JCQllbmQgID0gcGZuX3RvX3BhZ2UocGZuMiAtIDEpICsgMTsKKwkJcGFnZSA9IHBmbl90b19wYWdlKHBmbjEpOworCQllbmQgID0gcGZuX3RvX3BhZ2UocGZuMiAtIDEpICsgMTsKIAotCQkJZG8gewotCQkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCi0JCQkJCXJlc2VydmVkX3BhZ2VzKys7Ci0JCQkJZWxzZSBpZiAoIXBhZ2VfY291bnQocGFnZSkpCi0JCQkJCWZyZWVfcGFnZXMrKzsKLQkJCQlwYWdlKys7Ci0JCQl9IHdoaWxlIChwYWdlIDwgZW5kKTsKLQkJfQorCQlkbyB7CisJCQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQorCQkJCXJlc2VydmVkX3BhZ2VzKys7CisJCQllbHNlIGlmICghcGFnZV9jb3VudChwYWdlKSkKKwkJCQlmcmVlX3BhZ2VzKys7CisJCQlwYWdlKys7CisJCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOwogCX0KIAogCS8qCkBAIC02MTEsNiArNTA3LDEwIEBACiAKIAlwcmludGsoS0VSTl9OT1RJQ0UgIlZpcnR1YWwga2VybmVsIG1lbW9yeSBsYXlvdXQ6XG4iCiAJCQkiICAgIHZlY3RvciAgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIGtCKVxuIgorI2lmZGVmIENPTkZJR19IQVZFX1RDTQorCQkJIiAgICBEVENNICAgIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBrQilcbiIKKwkJCSIgICAgSVRDTSAgICA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQga0IpXG4iCisjZW5kaWYKIAkJCSIgICAgZml4bWFwICA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQga0IpXG4iCiAjaWZkZWYgQ09ORklHX01NVQogCQkJIiAgICBETUEgICAgIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBNQilcbiIKQEAgLTYyNyw2ICs1MjcsMTAgQEAKIAogCQkJTUxLKFVMKENPTkZJR19WRUNUT1JTX0JBU0UpLCBVTChDT05GSUdfVkVDVE9SU19CQVNFKSArCiAJCQkJKFBBR0VfU0laRSkpLAorI2lmZGVmIENPTkZJR19IQVZFX1RDTQorCQkJTUxLKERUQ01fT0ZGU0VULCAodW5zaWduZWQgbG9uZykgZHRjbV9lbmQpLAorCQkJTUxLKElUQ01fT0ZGU0VULCAodW5zaWduZWQgbG9uZykgaXRjbV9lbmQpLAorI2VuZGlmCiAJCQlNTEsoRklYQUREUl9TVEFSVCwgRklYQUREUl9UT1ApLAogI2lmZGVmIENPTkZJR19NTVUKIAkJCU1MTShDT05TSVNURU5UX0JBU0UsIENPTlNJU1RFTlRfRU5EKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2lvcmVtYXAuYyBiL2FyY2gvYXJtL21tL2lvcmVtYXAuYwppbmRleCAyOGM4Yjk1Li5hYjUwNjI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9hcm0vbW0vaW9yZW1hcC5jCkBAIC00Miw3OCArNDIsMTEgQEAKICAqLwogI2RlZmluZSBWTV9BUk1fU0VDVElPTl9NQVBQSU5HCTB4ODAwMDAwMDAKIAotc3RhdGljIGludCByZW1hcF9hcmVhX3B0ZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAotCQkJICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgY29uc3Qgc3RydWN0IG1lbV90eXBlICp0eXBlKQotewotCXBncHJvdF90IHByb3QgPSBfX3BncHJvdCh0eXBlLT5wcm90X3B0ZSk7Ci0JcHRlX3QgKnB0ZTsKLQotCXB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyKTsKLQlpZiAoIXB0ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkbyB7Ci0JCWlmICghcHRlX25vbmUoKnB0ZSkpCi0JCQlnb3RvIGJhZDsKLQotCQlzZXRfcHRlX2V4dChwdGUsIHBmbl9wdGUocGh5c19hZGRyID4+IFBBR0VfU0hJRlQsIHByb3QpLCAwKTsKLQkJcGh5c19hZGRyICs9IFBBR0VfU0laRTsKLQl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKLQlyZXR1cm4gMDsKLQotIGJhZDoKLQlwcmludGsoS0VSTl9DUklUICJyZW1hcF9hcmVhX3B0ZTogcGFnZSBhbHJlYWR5IGV4aXN0c1xuIik7Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlbWFwX2FyZWFfcG1kKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCQkJCSBjb25zdCBzdHJ1Y3QgbWVtX3R5cGUgKnR5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyBuZXh0OwotCXBtZF90ICpwbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHBnZCwgYWRkcik7Ci0JaWYgKCFwbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZG8gewotCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0JCXJldCA9IHJlbWFwX2FyZWFfcHRlKHBtZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyLCB0eXBlKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXBoeXNfYWRkciArPSBuZXh0IC0gYWRkcjsKLQl9IHdoaWxlIChwbWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkgICAgc2l6ZV90IHNpemUsIGNvbnN0IHN0cnVjdCBtZW1fdHlwZSAqdHlwZSkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydDsKLQl1bnNpZ25lZCBsb25nIG5leHQsIGVuZCA9IHN0YXJ0ICsgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IF9fcGZuX3RvX3BoeXMocGZuKTsKLQlwZ2RfdCAqcGdkOwotCWludCBlcnIgPSAwOwotCi0JQlVHX09OKGFkZHIgPj0gZW5kKTsKLQlwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7Ci0JZG8gewotCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0JCWVyciA9IHJlbWFwX2FyZWFfcG1kKHBnZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyLCB0eXBlKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCQlwaHlzX2FkZHIgKz0gbmV4dCAtIGFkZHI7Ci0JfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBpbnQgaW9yZW1hcF9wYWdlKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLAogCQkgY29uc3Qgc3RydWN0IG1lbV90eXBlICptdHlwZSkKIHsKLQlyZXR1cm4gcmVtYXBfYXJlYV9wYWdlcyh2aXJ0LCBfX3BoeXNfdG9fcGZuKHBoeXMpLCBQQUdFX1NJWkUsIG10eXBlKTsKKwlyZXR1cm4gaW9yZW1hcF9wYWdlX3JhbmdlKHZpcnQsIHZpcnQgKyBQQUdFX1NJWkUsIHBoeXMsCisJCQkJICBfX3BncHJvdChtdHlwZS0+cHJvdF9wdGUpKTsKIH0KIEVYUE9SVF9TWU1CT0woaW9yZW1hcF9wYWdlKTsKIApAQCAtMjY4LDYgKzIwMSwxMiBAQAogCWlmIChwZm4gPj0gMHgxMDAwMDAgJiYgKF9fcGZuX3RvX3BoeXMocGZuKSAmIH5TVVBFUlNFQ1RJT05fTUFTSykpCiAJCXJldHVybiBOVUxMOwogCisJLyoKKwkgKiBEb24ndCBhbGxvdyBSQU0gdG8gYmUgbWFwcGVkIC0gdGhpcyBjYXVzZXMgcHJvYmxlbXMgd2l0aCBBUk12NisKKwkgKi8KKwlpZiAoV0FSTl9PTihwZm5fdmFsaWQocGZuKSkpCisJCXJldHVybiBOVUxMOworCiAJdHlwZSA9IGdldF9tZW1fdHlwZShtdHlwZSk7CiAJaWYgKCF0eXBlKQogCQlyZXR1cm4gTlVMTDsKQEAgLTI5NCw3ICsyMzMsOCBAQAogCQllcnIgPSByZW1hcF9hcmVhX3NlY3Rpb25zKGFkZHIsIHBmbiwgc2l6ZSwgdHlwZSk7CiAJfSBlbHNlCiAjZW5kaWYKLQkJZXJyID0gcmVtYXBfYXJlYV9wYWdlcyhhZGRyLCBwZm4sIHNpemUsIHR5cGUpOworCQllcnIgPSBpb3JlbWFwX3BhZ2VfcmFuZ2UoYWRkciwgYWRkciArIHNpemUsIF9fcGZuX3RvX3BoeXMocGZuKSwKKwkJCQkJIF9fcGdwcm90KHR5cGUtPnByb3RfcHRlKSk7CiAKIAlpZiAoZXJyKSB7CiAgCQl2dW5tYXAoKHZvaWQgKilhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tLmggYi9hcmNoL2FybS9tbS9tbS5oCmluZGV4IDgxNWQwOGUuLjY2MzA2MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tLmgKKysrIGIvYXJjaC9hcm0vbW0vbW0uaApAQCAtMjgsNyArMjgsNSBAQAogCiAjZW5kaWYKIAotc3RydWN0IHBnbGlzdF9kYXRhOwotCiB2b2lkIF9faW5pdCBib290bWVtX2luaXQodm9pZCk7Ci12b2lkIHJlc2VydmVfbm9kZV96ZXJvKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpOwordm9pZCBhcm1fbW1fbWVtYmxvY2tfcmVzZXJ2ZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tYXAuYyBiL2FyY2gvYXJtL21tL21tYXAuYwppbmRleCBmNWFiYzUxLi40ZjViMzk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbWFwLmMKKysrIGIvYXJjaC9hcm0vbW0vbW1hcC5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NobS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtODAsNiArODEsOSBAQAogCSAgICAgICAgc3RhcnRfYWRkciA9IGFkZHIgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CiAJICAgICAgICBtbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IDA7CiAJfQorCS8qIDggYml0cyBvZiByYW5kb21uZXNzIGluIDIwIGFkZHJlc3Mgc3BhY2UgYml0cyAqLworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJYWRkciArPSAoZ2V0X3JhbmRvbV9pbnQoKSAlICgxIDw8IDgpKSA8PCBQQUdFX1NISUZUOwogCiBmdWxsX3NlYXJjaDoKIAlpZiAoZG9fYWxpZ24pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDI4NTg5NDEuLjZlMWM0ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0xMSwxMyArMTEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hldHlwZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtMjU4LDYgKzI1NywxOSBAQAogCQkucHJvdF9zZWN0ID0gUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFLAogCQkuZG9tYWluICAgID0gRE9NQUlOX0tFUk5FTCwKIAl9LAorCVtNVF9NRU1PUllfRFRDTV0gPSB7CisJCS5wcm90X3B0ZQk9IExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8CisJCSAgICAgICAgICAgICAgICAgIExfUFRFX0RJUlRZIHwgTF9QVEVfV1JJVEUsCisJCS5wcm90X2wxCT0gUE1EX1RZUEVfVEFCTEUsCisJCS5wcm90X3NlY3QJPSBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfWE4sCisJCS5kb21haW4JCT0gRE9NQUlOX0tFUk5FTCwKKwl9LAorCVtNVF9NRU1PUllfSVRDTV0gPSB7CisJCS5wcm90X3B0ZSAgPSBMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9ESVJUWSB8CisJCQkJTF9QVEVfVVNFUiB8IExfUFRFX0VYRUMsCisJCS5wcm90X2wxICAgPSBQTURfVFlQRV9UQUJMRSwKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9JTywKKwl9LAogfTsKIAogY29uc3Qgc3RydWN0IG1lbV90eXBlICpnZXRfbWVtX3R5cGUodW5zaWduZWQgaW50IHR5cGUpCkBAIC00ODgsMTggKzUwMCwyOCBAQAogCiAjZGVmaW5lIHZlY3RvcnNfYmFzZSgpCSh2ZWN0b3JzX2hpZ2goKSA/IDB4ZmZmZjAwMDAgOiAwKQogCitzdGF0aWMgdm9pZCBfX2luaXQgKmVhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc3opCit7CisJdm9pZCAqcHRyID0gX192YShtZW1ibG9ja19hbGxvYyhzeiwgc3opKTsKKwltZW1zZXQocHRyLCAwLCBzeik7CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIHB0ZV90ICogX19pbml0IGVhcmx5X3B0ZV9hbGxvYyhwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcHJvdCkKK3sKKwlpZiAocG1kX25vbmUoKnBtZCkpIHsKKwkJcHRlX3QgKnB0ZSA9IGVhcmx5X2FsbG9jKDIgKiBQVFJTX1BFUl9QVEUgKiBzaXplb2YocHRlX3QpKTsKKwkJX19wbWRfcG9wdWxhdGUocG1kLCBfX3BhKHB0ZSkgfCBwcm90KTsKKwl9CisJQlVHX09OKHBtZF9iYWQoKnBtZCkpOworCXJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgYWxsb2NfaW5pdF9wdGUocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJCSAgY29uc3Qgc3RydWN0IG1lbV90eXBlICp0eXBlKQogewotCXB0ZV90ICpwdGU7Ci0KLQlpZiAocG1kX25vbmUoKnBtZCkpIHsKLQkJcHRlID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoMiAqIFBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpOwotCQlfX3BtZF9wb3B1bGF0ZShwbWQsIF9fcGEocHRlKSB8IHR5cGUtPnByb3RfbDEpOwotCX0KLQotCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcik7CisJcHRlX3QgKnB0ZSA9IGVhcmx5X3B0ZV9hbGxvYyhwbWQsIGFkZHIsIHR5cGUtPnByb3RfbDEpOwogCWRvIHsKIAkJc2V0X3B0ZV9leHQocHRlLCBwZm5fcHRlKHBmbiwgX19wZ3Byb3QodHlwZS0+cHJvdF9wdGUpKSwgMCk7CiAJCXBmbisrOwpAQCAtNjY4LDcgKzY5MCw3IEBACiAJCWNyZWF0ZV9tYXBwaW5nKGlvX2Rlc2MgKyBpKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSB2bWFsbG9jX3Jlc2VydmUgPSBTWl8xMjhNOworc3RhdGljIHZvaWQgKiBfX2luaXRkYXRhIHZtYWxsb2NfbWluID0gKHZvaWQgKikoVk1BTExPQ19FTkQgLSBTWl8xMjhNKTsKIAogLyoKICAqIHZtYWxsb2M9c2l6ZSBmb3JjZXMgdGhlIHZtYWxsb2MgYXJlYSB0byBiZSBleGFjdGx5ICdzaXplJwpAQCAtNjc3LDcgKzY5OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3ZtYWxsb2MoY2hhciAqYXJnKQogewotCXZtYWxsb2NfcmVzZXJ2ZSA9IG1lbXBhcnNlKGFyZywgTlVMTCk7CisJdW5zaWduZWQgbG9uZyB2bWFsbG9jX3Jlc2VydmUgPSBtZW1wYXJzZShhcmcsIE5VTEwpOwogCiAJaWYgKHZtYWxsb2NfcmVzZXJ2ZSA8IFNaXzE2TSkgewogCQl2bWFsbG9jX3Jlc2VydmUgPSBTWl8xNk07CkBAIC02OTIsMjIgKzcxNCwyNiBAQAogCQkJInZtYWxsb2MgYXJlYSBpcyB0b28gYmlnLCBsaW1pdGluZyB0byAlbHVNQlxuIiwKIAkJCXZtYWxsb2NfcmVzZXJ2ZSA+PiAyMCk7CiAJfQorCisJdm1hbGxvY19taW4gPSAodm9pZCAqKShWTUFMTE9DX0VORCAtIHZtYWxsb2NfcmVzZXJ2ZSk7CiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgidm1hbGxvYyIsIGVhcmx5X3ZtYWxsb2MpOwogCi0jZGVmaW5lIFZNQUxMT0NfTUlOCSh2b2lkICopKFZNQUxMT0NfRU5EIC0gdm1hbGxvY19yZXNlcnZlKQorcGh5c19hZGRyX3QgbG93bWVtX2VuZF9hZGRyOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2FuaXR5X2NoZWNrX21lbWluZm8odm9pZCkKIHsKIAlpbnQgaSwgaiwgaGlnaG1lbSA9IDA7CiAKKwlsb3dtZW1fZW5kX2FkZHIgPSBfX3BhKHZtYWxsb2NfbWluIC0gMSkgKyAxOworCiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBtZW1pbmZvLm5yX2JhbmtzOyBpKyspIHsKIAkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWVtaW5mby5iYW5rW2pdOwogCQkqYmFuayA9IG1lbWluZm8uYmFua1tpXTsKIAogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JCWlmIChfX3ZhKGJhbmstPnN0YXJ0KSA+IFZNQUxMT0NfTUlOIHx8CisJCWlmIChfX3ZhKGJhbmstPnN0YXJ0KSA+IHZtYWxsb2NfbWluIHx8CiAJCSAgICBfX3ZhKGJhbmstPnN0YXJ0KSA8ICh2b2lkICopUEFHRV9PRkZTRVQpCiAJCQloaWdobWVtID0gMTsKIApAQCAtNzE3LDggKzc0Myw4IEBACiAJCSAqIFNwbGl0IHRob3NlIG1lbW9yeSBiYW5rcyB3aGljaCBhcmUgcGFydGlhbGx5IG92ZXJsYXBwaW5nCiAJCSAqIHRoZSB2bWFsbG9jIGFyZWEgZ3JlYXRseSBzaW1wbGlmeWluZyB0aGluZ3MgbGF0ZXIuCiAJCSAqLwotCQlpZiAoX192YShiYW5rLT5zdGFydCkgPCBWTUFMTE9DX01JTiAmJgotCQkgICAgYmFuay0+c2l6ZSA+IFZNQUxMT0NfTUlOIC0gX192YShiYW5rLT5zdGFydCkpIHsKKwkJaWYgKF9fdmEoYmFuay0+c3RhcnQpIDwgdm1hbGxvY19taW4gJiYKKwkJICAgIGJhbmstPnNpemUgPiB2bWFsbG9jX21pbiAtIF9fdmEoYmFuay0+c3RhcnQpKSB7CiAJCQlpZiAobWVtaW5mby5ucl9iYW5rcyA+PSBOUl9CQU5LUykgewogCQkJCXByaW50ayhLRVJOX0NSSVQgIk5SX0JBTktTIHRvbyBsb3csICIKIAkJCQkJCSAiaWdub3JpbmcgaGlnaCBtZW1vcnlcbiIpOwpAQCAtNzI3LDEyICs3NTMsMTIgQEAKIAkJCQkJKG1lbWluZm8ubnJfYmFua3MgLSBpKSAqIHNpemVvZigqYmFuaykpOwogCQkJCW1lbWluZm8ubnJfYmFua3MrKzsKIAkJCQlpKys7Ci0JCQkJYmFua1sxXS5zaXplIC09IFZNQUxMT0NfTUlOIC0gX192YShiYW5rLT5zdGFydCk7Ci0JCQkJYmFua1sxXS5zdGFydCA9IF9fcGEoVk1BTExPQ19NSU4gLSAxKSArIDE7CisJCQkJYmFua1sxXS5zaXplIC09IHZtYWxsb2NfbWluIC0gX192YShiYW5rLT5zdGFydCk7CisJCQkJYmFua1sxXS5zdGFydCA9IF9fcGEodm1hbGxvY19taW4gLSAxKSArIDE7CiAJCQkJYmFua1sxXS5oaWdobWVtID0gaGlnaG1lbSA9IDE7CiAJCQkJaisrOwogCQkJfQotCQkJYmFuay0+c2l6ZSA9IFZNQUxMT0NfTUlOIC0gX192YShiYW5rLT5zdGFydCk7CisJCQliYW5rLT5zaXplID0gdm1hbGxvY19taW4gLSBfX3ZhKGJhbmstPnN0YXJ0KTsKIAkJfQogI2Vsc2UKIAkJYmFuay0+aGlnaG1lbSA9IGhpZ2htZW07CkBAIC03NDEsNyArNzY3LDcgQEAKIAkJICogQ2hlY2sgd2hldGhlciB0aGlzIG1lbW9yeSBiYW5rIHdvdWxkIGVudGlyZWx5IG92ZXJsYXAKIAkJICogdGhlIHZtYWxsb2MgYXJlYS4KIAkJICovCi0JCWlmIChfX3ZhKGJhbmstPnN0YXJ0KSA+PSBWTUFMTE9DX01JTiB8fAorCQlpZiAoX192YShiYW5rLT5zdGFydCkgPj0gdm1hbGxvY19taW4gfHwKIAkJICAgIF9fdmEoYmFuay0+c3RhcnQpIDwgKHZvaWQgKilQQUdFX09GRlNFVCkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJJZ25vcmluZyBSQU0gYXQgJS44bHgtJS44bHggIgogCQkJICAgICAgICIodm1hbGxvYyByZWdpb24gb3ZlcmxhcCkuXG4iLApAQCAtNzUzLDkgKzc3OSw5IEBACiAJCSAqIENoZWNrIHdoZXRoZXIgdGhpcyBtZW1vcnkgYmFuayB3b3VsZCBwYXJ0aWFsbHkgb3ZlcmxhcAogCQkgKiB0aGUgdm1hbGxvYyBhcmVhLgogCQkgKi8KLQkJaWYgKF9fdmEoYmFuay0+c3RhcnQgKyBiYW5rLT5zaXplKSA+IFZNQUxMT0NfTUlOIHx8CisJCWlmIChfX3ZhKGJhbmstPnN0YXJ0ICsgYmFuay0+c2l6ZSkgPiB2bWFsbG9jX21pbiB8fAogCQkgICAgX192YShiYW5rLT5zdGFydCArIGJhbmstPnNpemUpIDwgX192YShiYW5rLT5zdGFydCkpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbmV3c2l6ZSA9IFZNQUxMT0NfTUlOIC0gX192YShiYW5rLT5zdGFydCk7CisJCQl1bnNpZ25lZCBsb25nIG5ld3NpemUgPSB2bWFsbG9jX21pbiAtIF9fdmEoYmFuay0+c3RhcnQpOwogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJUcnVuY2F0aW5nIFJBTSBhdCAlLjhseC0lLjhseCAiCiAJCQkgICAgICAgInRvIC0lLjhseCAodm1hbGxvYyByZWdpb24gb3ZlcmxhcCkuXG4iLAogCQkJICAgICAgIGJhbmstPnN0YXJ0LCBiYW5rLT5zdGFydCArIGJhbmstPnNpemUgLSAxLApAQCAtODI3LDEwMSArODUzLDIzIEBACiB9CiAKIC8qCi0gKiBSZXNlcnZlIHRoZSB2YXJpb3VzIHJlZ2lvbnMgb2Ygbm9kZSAwCisgKiBSZXNlcnZlIHRoZSBzcGVjaWFsIHJlZ2lvbnMgb2YgbWVtb3J5CiAgKi8KLXZvaWQgX19pbml0IHJlc2VydmVfbm9kZV96ZXJvKHBnX2RhdGFfdCAqcGdkYXQpCit2b2lkIF9faW5pdCBhcm1fbW1fbWVtYmxvY2tfcmVzZXJ2ZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcmVzX3NpemUgPSAwOwotCi0JLyoKLQkgKiBSZWdpc3RlciB0aGUga2VybmVsIHRleHQgYW5kIGRhdGEgd2l0aCBib290bWVtLgotCSAqIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IGJlIGluIG5vZGUgMC4KLQkgKi8KLSNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAotCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BhKF9kYXRhKSwgX2VuZCAtIF9kYXRhLAotCQkJQk9PVE1FTV9ERUZBVUxUKTsKLSNlbHNlCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoX3N0ZXh0KSwgX2VuZCAtIF9zdGV4dCwKLQkJCUJPT1RNRU1fREVGQVVMVCk7Ci0jZW5kaWYKLQogCS8qCiAJICogUmVzZXJ2ZSB0aGUgcGFnZSB0YWJsZXMuICBUaGVzZSBhcmUgYWxyZWFkeSBpbiB1c2UsCiAJICogYW5kIGNhbiBvbmx5IGJlIGluIG5vZGUgMC4KIAkgKi8KLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYShzd2FwcGVyX3BnX2RpciksCi0JCQkgICAgIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCksIEJPT1RNRU1fREVGQVVMVCk7Ci0KLQkvKgotCSAqIEhtbS4uLiBUaGlzIHNob3VsZCBnbyBlbHNld2hlcmUsIGJ1dCB3ZSByZWFsbHkgcmVhbGx5IG5lZWQgdG8KLQkgKiBzdG9wIHRoaW5ncyBhbGxvY2F0aW5nIHRoZSBsb3cgbWVtb3J5OyBpZGVhbGx5IHdlIG5lZWQgYSBiZXR0ZXIKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiBHRlBfRE1BIHdoaWNoIGRvZXMgbm90IGFzc3VtZSB0aGF0IERNQS1hYmxlCi0JICogbWVtb3J5IHN0YXJ0cyBhdCB6ZXJvLgotCSAqLwotCWlmIChtYWNoaW5lX2lzX2ludGVncmF0b3IoKSB8fCBtYWNoaW5lX2lzX2NpbnRlZ3JhdG9yKCkpCi0JCXJlc19zaXplID0gX19wYShzd2FwcGVyX3BnX2RpcikgLSBQSFlTX09GRlNFVDsKLQotCS8qCi0JICogVGhlc2Ugc2hvdWxkIGxpa2V3aXNlIGdvIGVsc2V3aGVyZS4gIFRoZXkgcHJlLXJlc2VydmUgdGhlCi0JICogc2NyZWVuIG1lbW9yeSByZWdpb24gYXQgdGhlIHN0YXJ0IG9mIG1haW4gc3lzdGVtIG1lbW9yeS4KLQkgKi8KLQlpZiAobWFjaGluZV9pc19lZGI3MjExKCkpCi0JCXJlc19zaXplID0gMHgwMDAyMDAwMDsKLQlpZiAobWFjaGluZV9pc19wNzIwdCgpKQotCQlyZXNfc2l6ZSA9IDB4MDAwMTQwMDA7Ci0KLQkvKiBIMTk0MCwgUlgzNzE1IGFuZCBSWDE5NTAgbmVlZCB0byByZXNlcnZlIHRoaXMgZm9yIHN1c3BlbmQgKi8KLQotCWlmIChtYWNoaW5lX2lzX2gxOTQwKCkgfHwgbWFjaGluZV9pc19yeDM3MTUoKQotCQl8fCBtYWNoaW5lX2lzX3J4MTk1MCgpKSB7Ci0JCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCAweDMwMDAzMDAwLCAweDEwMDAsCi0JCQkJQk9PVE1FTV9ERUZBVUxUKTsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIDB4MzAwODEwMDAsIDB4MTAwMCwKLQkJCQlCT09UTUVNX0RFRkFVTFQpOwotCX0KLQotCWlmIChtYWNoaW5lX2lzX3BhbG1sZCgpIHx8IG1hY2hpbmVfaXNfcGFsbXR4KCkpIHsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIDB4YTAwMDAwMDAsIDB4MTAwMCwKLQkJCQlCT09UTUVNX0VYQ0xVU0lWRSk7Ci0JCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCAweGEwMjAwMDAwLCAweDEwMDAsCi0JCQkJQk9PVE1FTV9FWENMVVNJVkUpOwotCX0KLQotCWlmIChtYWNoaW5lX2lzX3RyZW82ODAoKSB8fCBtYWNoaW5lX2lzX2NlbnRybygpKSB7Ci0JCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCAweGEwMDAwMDAwLCAweDEwMDAsCi0JCQkJQk9PVE1FTV9FWENMVVNJVkUpOwotCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgMHhhMjAwMDAwMCwgMHgxMDAwLAotCQkJCUJPT1RNRU1fRVhDTFVTSVZFKTsKLQl9Ci0KLQlpZiAobWFjaGluZV9pc19wYWxtdDUoKSkKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIDB4YTAyMDAwMDAsIDB4MTAwMCwKLQkJCQlCT09UTUVNX0VYQ0xVU0lWRSk7Ci0KLQkvKgotCSAqIFUzMDAgLSBUaGlzIHBsYXRmb3JtIGZhbWlseSBjYW4gc2hhcmUgcGh5c2ljYWwgbWVtb3J5Ci0JICogYmV0d2VlbiB0d28gQVJNIGNwdXMsIG9uZSBydW5uaW5nIExpbnV4IGFuZCB0aGUgb3RoZXIKLQkgKiBydW5uaW5nIGFub3RoZXIgT1MuCi0JICovCi0JaWYgKG1hY2hpbmVfaXNfdTMwMCgpKSB7Ci0jaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9TSU5HTEVfUkFNCi0jaWYgKChDT05GSUdfTUFDSF9VMzAwX0FDQ0VTU19NRU1fU0laRSAmIDEpID09IDEpICYmCVwKLQlDT05GSUdfTUFDSF9VMzAwXzJNQl9BTElHTk1FTlRfRklYCi0JCXJlc19zaXplID0gMHgwMDEwMDAwMDsKLSNlbmRpZgotI2VuZGlmCi0JfQorCW1lbWJsb2NrX3Jlc2VydmUoX19wYShzd2FwcGVyX3BnX2RpciksIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOwogCiAjaWZkZWYgQ09ORklHX1NBMTExMQogCS8qCiAJICogQmVjYXVzZSBvZiB0aGUgU0ExMTExIERNQSBidWcsIHdlIHdhbnQgdG8gcHJlc2VydmUgb3VyCiAJICogcHJlY2lvdXMgRE1BLWFibGUgbWVtb3J5Li4uCiAJICovCi0JcmVzX3NpemUgPSBfX3BhKHN3YXBwZXJfcGdfZGlyKSAtIFBIWVNfT0ZGU0VUOworCW1lbWJsb2NrX3Jlc2VydmUoUEhZU19PRkZTRVQsIF9fcGEoc3dhcHBlcl9wZ19kaXIpIC0gUEhZU19PRkZTRVQpOwogI2VuZGlmCi0JaWYgKHJlc19zaXplKQotCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgUEhZU19PRkZTRVQsIHJlc19zaXplLAotCQkJCUJPT1RNRU1fREVGQVVMVCk7CiB9CiAKIC8qCkBAIC05NDAsNyArODg4LDcgQEAKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSB2ZWN0b3IgcGFnZSBlYXJseS4KIAkgKi8KLQl2ZWN0b3JzID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoUEFHRV9TSVpFKTsKKwl2ZWN0b3JzID0gZWFybHlfYWxsb2MoUEFHRV9TSVpFKTsKIAogCWZvciAoYWRkciA9IFZNQUxMT0NfRU5EOyBhZGRyOyBhZGRyICs9IFBHRElSX1NJWkUpCiAJCXBtZF9jbGVhcihwbWRfb2ZmX2soYWRkcikpOwpAQCAtMTAxMSwxMSArOTU5LDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBrbWFwX2luaXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCXBtZF90ICpwbWQgPSBwbWRfb2ZmX2soUEtNQVBfQkFTRSk7Ci0JcHRlX3QgKnB0ZSA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKDIgKiBQVFJTX1BFUl9QVEUgKiBzaXplb2YocHRlX3QpKTsKLQlCVUdfT04oIXBtZF9ub25lKCpwbWQpIHx8ICFwdGUpOwotCV9fcG1kX3BvcHVsYXRlKHBtZCwgX19wYShwdGUpIHwgX1BBR0VfS0VSTkVMX1RBQkxFKTsKLQlwa21hcF9wYWdlX3RhYmxlID0gcHRlICsgUFRSU19QRVJfUFRFOworCXBrbWFwX3BhZ2VfdGFibGUgPSBlYXJseV9wdGVfYWxsb2MocG1kX29mZl9rKFBLTUFQX0JBU0UpLAorCQlQS01BUF9CQVNFLCBfUEFHRV9LRVJORUxfVEFCTEUpOwogI2VuZGlmCiB9CiAKQEAgLTEwNjYsMTcgKzEwMTEsMTYgQEAKIAlzYW5pdHlfY2hlY2tfbWVtaW5mbygpOwogCXByZXBhcmVfcGFnZV90YWJsZSgpOwogCW1hcF9sb3dtZW0oKTsKLQlib290bWVtX2luaXQoKTsKIAlkZXZpY2VtYXBzX2luaXQobWRlc2MpOwogCWttYXBfaW5pdCgpOwogCiAJdG9wX3BtZCA9IHBtZF9vZmZfaygweGZmZmYwMDAwKTsKIAotCS8qCi0JICogYWxsb2NhdGUgdGhlIHplcm8gcGFnZS4gIE5vdGUgdGhhdCB0aGlzIGFsd2F5cyBzdWNjZWVkcyBhbmQKLQkgKiByZXR1cm5zIGEgemVyb2VkIHJlc3VsdC4KLQkgKi8KLQl6ZXJvX3BhZ2UgPSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOworCS8qIGFsbG9jYXRlIHRoZSB6ZXJvIHBhZ2UuICovCisJemVyb19wYWdlID0gZWFybHlfYWxsb2MoUEFHRV9TSVpFKTsKKworCWJvb3RtZW1faW5pdCgpOworCiAJZW1wdHlfemVyb19wYWdlID0gdmlydF90b19wYWdlKHplcm9fcGFnZSk7CiAJX19mbHVzaF9kY2FjaGVfcGFnZShOVUxMLCBlbXB0eV96ZXJvX3BhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbm9tbXUuYyBiL2FyY2gvYXJtL21tL25vbW11LmMKaW5kZXggMzNiMzI3My4uNjg3ZDAyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbm9tbXUuYworKysgYi9hcmNoL2FybS9tbS9ub21tdS5jCkBAIC02LDggKzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgpAQCAtMTcsMzAgKzE3LDE0IEBACiAKICNpbmNsdWRlICJtbS5oIgogCi0vKgotICogUmVzZXJ2ZSB0aGUgdmFyaW91cyByZWdpb25zIG9mIG5vZGUgMAotICovCi12b2lkIF9faW5pdCByZXNlcnZlX25vZGVfemVybyhwZ19kYXRhX3QgKnBnZGF0KQordm9pZCBfX2luaXQgYXJtX21tX21lbWJsb2NrX3Jlc2VydmUodm9pZCkKIHsKIAkvKgotCSAqIFJlZ2lzdGVyIHRoZSBrZXJuZWwgdGV4dCBhbmQgZGF0YSB3aXRoIGJvb3RtZW0uCi0JICogTm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgYmUgaW4gbm9kZSAwLgotCSAqLwotI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoX2RhdGEpLCBfZW5kIC0gX2RhdGEsCi0JCQlCT09UTUVNX0RFRkFVTFQpOwotI2Vsc2UKLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYShfc3RleHQpLCBfZW5kIC0gX3N0ZXh0LAotCQkJQk9PVE1FTV9ERUZBVUxUKTsKLSNlbmRpZgotCi0JLyoKIAkgKiBSZWdpc3RlciB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLgogCSAqIHNvbWUgYXJjaGl0ZWN0dXJlcyB3aGljaCB0aGUgRFJBTSBpcyB0aGUgZXhjZXB0aW9uIHZlY3RvciB0byB0cmFwLAogCSAqIGFsbG9jX3BhZ2UgYnJlYWtzIHdpdGggZXJyb3IsIGFsdGhvdWdoIGl0IGlzIG5vdCBOVUxMLCBidXQgIjAuIgogCSAqLwotCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBDT05GSUdfVkVDVE9SU19CQVNFLCBQQUdFX1NJWkUsCi0JCQlCT09UTUVNX0RFRkFVTFQpOworCW1lbWJsb2NrX3Jlc2VydmUoQ09ORklHX1ZFQ1RPUlNfQkFTRSwgUEFHRV9TSVpFKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKaW5kZXggNzI1MDdjNi4uMjAzYTRlOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKQEAgLTc5LDE1ICs3OSwxMSBAQAogICogY3B1X2FybTEwMjBfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtMTAyMF9wcm9jX2ZpbikKLQlzdG1mZAlzcCEsIHtscn0KLQltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQotCW1zcgljcHNyX2MsIGlwCi0JYmwJYXJtMTAyMF9mbHVzaF9rZXJuX2NhY2hlX2FsbAogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgogCWJpYwlyMCwgcjAsICMweDEwMDAgCQlAIC4uLmkuLi4uLi4uLi4uLi4KIAliaWMJcjAsIHIwLCAjMHgwMDBlIAkJQCAuLi4uLi4uLi4uLi53Y2EuCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9hcm0xMDIwX3Jlc2V0KGxvYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwppbmRleCBkMjc4Mjk4Li4xYTUxMWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCkBAIC03OSwxNSArNzksMTEgQEAKICAqIGNwdV9hcm0xMDIwZV9wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9hcm0xMDIwZV9wcm9jX2ZpbikKLQlzdG1mZAlzcCEsIHtscn0KLQltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQotCW1zcgljcHNyX2MsIGlwCi0JYmwJYXJtMTAyMGVfZmx1c2hfa2Vybl9jYWNoZV9hbGwKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCAjMHgxMDAwIAkJQCAuLi5pLi4uLi4uLi4uLi4uCiAJYmljCXIwLCByMCwgIzB4MDAwZSAJCUAgLi4uLi4uLi4uLi4ud2NhLgogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKLQlsZG1mZAlzcCEsIHtwY30KKwltb3YJcGMsIGxyCiAKIC8qCiAgKiBjcHVfYXJtMTAyMGVfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUwppbmRleCBjZTEzZTRhLi4xZmZhNGViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUwpAQCAtNjgsMTUgKzY4LDExIEBACiAgKiBjcHVfYXJtMTAyMl9wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9hcm0xMDIyX3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLQlibAlhcm0xMDIyX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMCAJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMGUgCQlAIC4uLi4uLi4uLi4uLndjYS4KIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCi0JbGRtZmQJc3AhLCB7cGN9CisJbW92CXBjLCBscgogCiAvKgogICogY3B1X2FybTEwMjJfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwppbmRleCA2MzY2NzJhLi41Njk3YzM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwpAQCAtNjgsMTUgKzY4LDExIEBACiAgKiBjcHVfYXJtMTAyNl9wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9hcm0xMDI2X3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLQlibAlhcm0xMDI2X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMCAJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMGUgCQlAIC4uLi4uLi4uLi4uLndjYS4KIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCi0JbGRtZmQJc3AhLCB7cGN9CisJbW92CXBjLCBscgogCiAvKgogICogY3B1X2FybTEwMjZfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKaW5kZXggNzk1ZGM2MS4uNjRlMGIzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCkBAIC0xODQsOCArMTg0LDYgQEAKIAogRU5UUlkoY3B1X2FybTZfcHJvY19maW4pCiBFTlRSWShjcHVfYXJtN19wcm9jX2ZpbikKLQkJbW92CXIwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKLQkJbXNyCWNwc3JfYywgcjAKIAkJbW92CXIwLCAjMHgzMQkJCUAgLi4uLlMuLkRQLi4uTQogCQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCiAJCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCmluZGV4IDBiNjJkZTIuLjlkOTY4MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUwpAQCAtNTQsMTUgKzU0LDExIEBACiAJCW1vdglwYywgbHIKIAogRU5UUlkoY3B1X2FybTcyMF9wcm9jX2ZpbikKLQkJc3RtZmQJc3AhLCB7bHJ9Ci0JCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JCW1zcgljcHNyX2MsIGlwCiAJCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAKIAkJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgogCQliaWMJcjAsIHIwLCAjMHgwMDBlCQkJQCAuLi4uLi4uLi4uLi53Y2EuCiAJCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKLQkJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNywgMAkJQCBpbnZhbGlkYXRlIGNhY2hlCi0JCWxkbWZkCXNwISwge3BjfQorCQltb3YJcGMsIGxyCiAKIC8qCiAgKiBGdW5jdGlvbjogYXJtNzIwX3Byb2NfZG9faWRsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMKaW5kZXggMDE4NjBjZC4uNmMxYTlhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TCkBAIC0zNiwxNSArMzYsMTEgQEAKICAqIGNwdV9hcm03NDBfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtNzQwX3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCiAJYmljCXIwLCByMCwgIzB4M2YwMDAwMDAJCUAgYmFuay9mL2xvY2svcwogCWJpYwlyMCwgcjAsICMweDAwMDAwMDBjCQlAIHctYnVmZmVyL2NhY2hlCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDAJCUAgaW52YWxpZGF0ZSBjYWNoZQotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9hcm03NDBfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCmluZGV4IDEyMDFiOTguLjZhODUwZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKQEAgLTM2LDggKzM2LDYgQEAKICAqIGNwdV9hcm03dGRtaV9wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9hcm03dGRtaV9wcm9jX2ZpbikKLQkJbW92CXIwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKLQkJbXNyCWNwc3JfYywgcjAKIAkJbW92CXBjLCBscgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKaW5kZXggOGJlODE5OS4uODZmODBhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCkBAIC02OSwxOSArNjksMTEgQEAKICAqIGNwdV9hcm05MjBfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtOTIwX3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLSNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICi0JYmwJYXJtOTIwX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0jZWxzZQotCWJsCXY0d3RfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLSNlbmRpZgogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgogCWJpYwlyMCwgcjAsICMweDEwMDAJCQlAIC4uLmkuLi4uLi4uLi4uLi4KIAliaWMJcjAsIHIwLCAjMHgwMDBlCQkJQCAuLi4uLi4uLi4uLi53Y2EuCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9hcm05MjBfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMKaW5kZXggYzBmZjhlNC4uZjc2Y2U5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCkBAIC03MSwxOSArNzEsMTEgQEAKICAqIGNwdV9hcm05MjJfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtOTIyX3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLSNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICi0JYmwJYXJtOTIyX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0jZWxzZQotCWJsCXY0d3RfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLSNlbmRpZgogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgogCWJpYwlyMCwgcjAsICMweDEwMDAJCQlAIC4uLmkuLi4uLi4uLi4uLi4KIAliaWMJcjAsIHIwLCAjMHgwMDBlCQkJQCAuLi4uLi4uLi4uLi53Y2EuCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9hcm05MjJfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMKaW5kZXggM2M2Y2ZmZS4uNjU3YmQzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCkBAIC05MiwxNSArOTIsMTEgQEAKICAqIGNwdV9hcm05MjVfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtOTI1X3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLQlibAlhcm05MjVfZmx1c2hfa2Vybl9jYWNoZV9hbGwKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCiAJYmljCXIwLCByMCwgIzB4MDAwZQkJCUAgLi4uLi4uLi4uLi4ud2NhLgogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKLQlsZG1mZAlzcCEsIHtwY30KKwltb3YJcGMsIGxyCiAKIC8qCiAgKiBjcHVfYXJtOTI1X3Jlc2V0KGxvYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCmluZGV4IDc1YjcwN2MuLjczZjFmM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUwpAQCAtNjEsMTUgKzYxLDExIEBACiAgKiBjcHVfYXJtOTI2X3Byb2NfZmluKCkKICAqLwogRU5UUlkoY3B1X2FybTkyNl9wcm9jX2ZpbikKLQlzdG1mZAlzcCEsIHtscn0KLQltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQotCW1zcgljcHNyX2MsIGlwCi0JYmwJYXJtOTI2X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMGUJCQlAIC4uLi4uLi4uLi4uLndjYS4KIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCi0JbGRtZmQJc3AhLCB7cGN9CisJbW92CXBjLCBscgogCiAvKgogICogY3B1X2FybTkyNl9yZXNldChsb2MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUwppbmRleCAxYWYxNjU3Li5mZmZiMDYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKQEAgLTM3LDE1ICszNywxMSBAQAogICogY3B1X2FybTk0MF9wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9hcm05NDBfcHJvY19maW4pCi0Jc3RtZmQJc3AhLCB7bHJ9Ci0JbW92CWlwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKLQltc3IJY3Bzcl9jLCBpcAotCWJsCWFybTk0MF9mbHVzaF9rZXJuX2NhY2hlX2FsbAogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgogCWJpYwlyMCwgcjAsICMweDAwMDAxMDAwCQlAIGktY2FjaGUKIAliaWMJcjAsIHIwLCAjMHgwMDAwMDAwNAkJQCBkLWNhY2hlCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9hcm05NDBfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMKaW5kZXggMTY2NGI2YS4uMjQ5YTYwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TCkBAIC00NCwxNSArNDQsMTEgQEAKICAqIGNwdV9hcm05NDZfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtOTQ2X3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLQlibAlhcm05NDZfZmx1c2hfa2Vybl9jYWNoZV9hbGwKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCAjMHgwMDAwMTAwMAkJQCBpLWNhY2hlCiAJYmljCXIwLCByMCwgIzB4MDAwMDAwMDQJCUAgZC1jYWNoZQogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKLQlsZG1mZAlzcCEsIHtwY30KKwltb3YJcGMsIGxyCiAKIC8qCiAgKiBjcHVfYXJtOTQ2X3Jlc2V0KGxvYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUwppbmRleCAyODU0NWMyLi5kYjQ3NTY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCkBAIC0zNiw4ICszNiw2IEBACiAgKiBjcHVfYXJtOXRkbWlfcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfYXJtOXRkbWlfcHJvY19maW4pCi0JCW1vdglyMCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JCW1zcgljcHNyX2MsIHIwCiAJCW1vdglwYywgbHIKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtZmE1MjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtZmE1MjYuUwppbmRleCAwOGY1YWMyLi43ODAzZmRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWZhNTI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1mYTUyNi5TCkBAIC0zOSwxNyArMzksMTMgQEAKICAqIGNwdV9mYTUyNl9wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9mYTUyNl9wcm9jX2ZpbikKLQlzdG1mZAlzcCEsIHtscn0KLQltb3YJaXAsICNQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERQotCW1zcgljcHNyX2MsIGlwCi0JYmwJZmFfZmx1c2hfa2Vybl9jYWNoZV9hbGwKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCiAJYmljCXIwLCByMCwgIzB4MDAwZQkJCUAgLi4uLi4uLi4uLi4ud2NhLgogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKIAlub3AKIAlub3AKLQlsZG1mZAlzcCEsIHtwY30KKwltb3YJcGMsIGxyCiAKIC8qCiAgKiBjcHVfZmE1MjZfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TCmluZGV4IDUzZTYzMjMuLmIzMDRkMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtZmVyb2Nlb24uUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWZlcm9jZW9uLlMKQEAgLTc1LDExICs3NSw2IEBACiAgKiBjcHVfZmVyb2Nlb25fcHJvY19maW4oKQogICovCiBFTlRSWShjcHVfZmVyb2Nlb25fcHJvY19maW4pCi0Jc3RtZmQJc3AhLCB7bHJ9Ci0JbW92CWlwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKLQltc3IJY3Bzcl9jLCBpcAotCWJsCWZlcm9jZW9uX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0KICNpZiBkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMikgJiYgXAogCSFkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMl9XUklURVRIUk9VR0gpCiAJbW92CXIwLCAjMApAQCAtOTEsNyArODYsNyBAQAogCWJpYwlyMCwgcjAsICMweDEwMDAJCQlAIC4uLmkuLi4uLi4uLi4uLi4KIAliaWMJcjAsIHIwLCAjMHgwMDBlCQkJQCAuLi4uLi4uLi4uLi53Y2EuCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9mZXJvY2Vvbl9yZXNldChsb2MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TIGIvYXJjaC9hcm0vbW0vcHJvYy1tb2hhd2suUwppbmRleCBjYWEzMTE1Li41ZjY4OTJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbW9oYXdrLlMKQEAgLTUxLDE1ICs1MSwxMSBAQAogICogY3B1X21vaGF3a19wcm9jX2ZpbigpCiAgKi8KIEVOVFJZKGNwdV9tb2hhd2tfcHJvY19maW4pCi0Jc3RtZmQJc3AhLCB7bHJ9Ci0JbW92CWlwLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUKLQltc3IJY3Bzcl9jLCBpcAotCWJsCW1vaGF3a19mbHVzaF9rZXJuX2NhY2hlX2FsbAogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgogCWJpYwlyMCwgcjAsICMweDE4MDAJCQlAIC4uLml6Li4uLi4uLi4uLi4KIAliaWMJcjAsIHIwLCAjMHgwMDA2CQkJQCAuLi4uLi4uLi4uLi4uY2EuCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkbWZkCXNwISwge3BjfQorCW1vdglwYywgbHIKIAogLyoKICAqIGNwdV9tb2hhd2tfcmVzZXQobG9jKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCmluZGV4IDdiNzA2YjMuLmEyMDFlYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKQEAgLTQ0LDE3ICs0NCwxMyBAQAogICogY3B1X3NhMTEwX3Byb2NfZmluKCkKICAqLwogRU5UUlkoY3B1X3NhMTEwX3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLQlibAl2NHdiX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCUAgY2xlYW4gY2FjaGVzCi0xOgltb3YJcjAsICMwCisJbW92CXIwLCAjMAogCW1jcglwMTUsIDAsIHIwLCBjMTUsIGMyLCAyCQlAIERpc2FibGUgY2xvY2sgc3dpdGNoaW5nCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMGUJCQlAIC4uLi4uLi4uLi4uLndjYS4KIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCi0JbGRtZmQJc3AhLCB7cGN9CisJbW92CXBjLCBscgogCiAvKgogICogY3B1X3NhMTEwX3Jlc2V0KGxvYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCmluZGV4IDVjNDc3NjAuLjdkZGM0ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpAQCAtNTUsMTYgKzU1LDEyIEBACiAgKiAgLSBDbGVhbiBhbmQgdHVybiBvZmYgY2FjaGVzLgogICovCiBFTlRSWShjcHVfc2ExMTAwX3Byb2NfZmluKQotCXN0bWZkCXNwISwge2xyfQotCW1vdglpcCwgI1BTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgaXAKLQlibAl2NHdiX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAJbWNyCXAxNSwgMCwgaXAsIGMxNSwgYzIsIDIJCUAgRGlzYWJsZSBjbG9jayBzd2l0Y2hpbmcKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCAjMHgxMDAwCQkJQCAuLi5pLi4uLi4uLi4uLi4uCiAJYmljCXIwLCByMCwgIzB4MDAwZQkJCUAgLi4uLi4uLi4uLi4ud2NhLgogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKLQlsZG1mZAlzcCEsIHtwY30KKwltb3YJcGMsIGxyCiAKIC8qCiAgKiBjcHVfc2ExMTAwX3Jlc2V0KGxvYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwppbmRleCA3YTUzMzdlLi4yMmFhYzg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCkBAIC00MiwxNCArNDIsMTEgQEAKIAltb3YJcGMsIGxyCiAKIEVOVFJZKGNwdV92Nl9wcm9jX2ZpbikKLQlzdG1mZAlzcCEsIHtscn0KLQljcHNpZAlpZgkJCQlAIGRpc2FibGUgaW50ZXJydXB0cwotCWJsCXY2X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMDYJCQlAIC4uLi4uLi4uLi4uLi5jYS4KIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCi0JbGRtZmQJc3AhLCB7cGN9CisJbW92CXBjLCBscgogCiAvKgogICoJY3B1X3Y2X3Jlc2V0KGxvYykKQEAgLTIzOSw3ICsyMzYsOCBAQAogCWIJX192Nl9zZXR1cAogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKLQkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUHxIV0NBUF9KQVZBCisJLyogU2VlIGFsc28gZmVhdF92Nl9maXh1cCgpIGZvciBIV0NBUF9UTFMgKi8KKwkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUHxIV0NBUF9KQVZBfEhXQ0FQX1RMUwogCS5sb25nCWNwdV92Nl9uYW1lCiAJLmxvbmcJdjZfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCS5sb25nCXY2d2JpX3RsYl9mbnMKQEAgLTI2Miw3ICsyNjAsNyBAQAogCWIJX192Nl9zZXR1cAogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKLQkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAorCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQfEhXQ0FQX1RMUwogCS5sb25nCWNwdV9wajRfbmFtZQogCS5sb25nCXY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkubG9uZwl2NndiaV90bGJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMgYi9hcmNoL2FybS9tbS9wcm9jLXY3LlMKaW5kZXggN2FhZjg4YS4uNmE4NTA2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwpAQCAtNDUsMTQgKzQ1LDExIEBACiBFTkRQUk9DKGNwdV92N19wcm9jX2luaXQpCiAKIEVOVFJZKGNwdV92N19wcm9jX2ZpbikKLQlzdG1mZAlzcCEsIHtscn0KLQljcHNpZAlpZgkJCQlAIGRpc2FibGUgaW50ZXJydXB0cwotCWJsCXY3X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMDYJCQlAIC4uLi4uLi4uLi4uLi5jYS4KIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCi0JbGRtZmQJc3AhLCB7cGN9CisJbW92CXBjLCBscgogRU5EUFJPQyhjcHVfdjdfcHJvY19maW4pCiAKIC8qCkBAIC0zNDQsNyArMzQxLDcgQEAKIAliCV9fdjdfc2V0dXAKIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKKwkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUHxIV0NBUF9UTFMKIAkubG9uZwljcHVfdjdfbmFtZQogCS5sb25nCXY3X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkubG9uZwl2N3diaV90bGJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCmluZGV4IGU1Nzk3ZjEuLjM2MWE1MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCkBAIC05MCwxNSArOTAsMTEgQEAKICAqIGNwdV94c2MzX3Byb2NfZmluKCkKICAqLwogRU5UUlkoY3B1X3hzYzNfcHJvY19maW4pCi0Jc3RyCWxyLCBbc3AsICMtNF0hCi0JbW92CXIwLCAjUFNSX0ZfQklUfFBTUl9JX0JJVHxTVkNfTU9ERQotCW1zcgljcHNyX2MsIHIwCi0JYmwJeHNjM19mbHVzaF9rZXJuX2NhY2hlX2FsbAlAIGNsZWFuIGNhY2hlcwogCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgogCWJpYwlyMCwgcjAsICMweDE4MDAJCQlAIC4uLklaLi4uLi4uLi4uLi4KIAliaWMJcjAsIHIwLCAjMHgwMDA2CQkJQCAuLi4uLi4uLi4uLi4uQ0EuCiAJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIGNhY2hlcwotCWxkcglwYywgW3NwXSwgIzQKKwltb3YJcGMsIGxyCiAKIC8qCiAgKiBjcHVfeHNjM19yZXNldChsb2MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUwppbmRleCA2MzAzN2UyLi4xNDA3NTk3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKQEAgLTEyNCwxNSArMTI0LDExIEBACiAgKiBjcHVfeHNjYWxlX3Byb2NfZmluKCkKICAqLwogRU5UUlkoY3B1X3hzY2FsZV9wcm9jX2ZpbikKLQlzdHIJbHIsIFtzcCwgIy00XSEKLQltb3YJcjAsICNQU1JfRl9CSVR8UFNSX0lfQklUfFNWQ19NT0RFCi0JbXNyCWNwc3JfYywgcjAKLQlibAl4c2NhbGVfZmx1c2hfa2Vybl9jYWNoZV9hbGwJQCBjbGVhbiBjYWNoZXMKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCAjMHgxODAwCQkJQCAuLi5JWi4uLi4uLi4uLi4uCiAJYmljCXIwLCByMCwgIzB4MDAwNgkJCUAgLi4uLi4uLi4uLi4uLkNBLgogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKLQlsZHIJcGMsIFtzcF0sICM0CisJbW92CXBjLCBscgogCiAvKgogICogY3B1X3hzY2FsZV9yZXNldChsb2MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS92bXJlZ2lvbi5jIGIvYXJjaC9hcm0vbW0vdm1yZWdpb24uYwppbmRleCAxOWUwOWJkYi4uOTM1OTkzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vdm1yZWdpb24uYworKysgYi9hcmNoL2FybS9tbS92bXJlZ2lvbi5jCkBAIC0zNSw3ICszNSw4IEBACiAgKi8KIAogc3RydWN0IGFybV92bXJlZ2lvbiAqCi1hcm1fdm1yZWdpb25fYWxsb2Moc3RydWN0IGFybV92bXJlZ2lvbl9oZWFkICpoZWFkLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwKQorYXJtX3ZtcmVnaW9uX2FsbG9jKHN0cnVjdCBhcm1fdm1yZWdpb25faGVhZCAqaGVhZCwgc2l6ZV90IGFsaWduLAorCQkgICBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IGhlYWQtPnZtX3N0YXJ0LCBlbmQgPSBoZWFkLT52bV9lbmQgLSBzaXplOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01OCw3ICs1OSw3IEBACiAJCQlnb3RvIG5vc3BjOwogCQlpZiAoKGFkZHIgKyBzaXplKSA8PSBjLT52bV9zdGFydCkKIAkJCWdvdG8gZm91bmQ7Ci0JCWFkZHIgPSBjLT52bV9lbmQ7CisJCWFkZHIgPSBBTElHTihjLT52bV9lbmQsIGFsaWduKTsKIAkJaWYgKGFkZHIgPiBlbmQpCiAJCQlnb3RvIG5vc3BjOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3ZtcmVnaW9uLmggYi9hcmNoL2FybS9tbS92bXJlZ2lvbi5oCmluZGV4IDZiMmNkYmQuLjE1ZTlmMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3ZtcmVnaW9uLmgKKysrIGIvYXJjaC9hcm0vbW0vdm1yZWdpb24uaApAQCAtMjEsNyArMjEsNyBAQAogCWludAkJCXZtX2FjdGl2ZTsKIH07CiAKLXN0cnVjdCBhcm1fdm1yZWdpb24gKmFybV92bXJlZ2lvbl9hbGxvYyhzdHJ1Y3QgYXJtX3ZtcmVnaW9uX2hlYWQgKiwgc2l6ZV90LCBnZnBfdCk7CitzdHJ1Y3QgYXJtX3ZtcmVnaW9uICphcm1fdm1yZWdpb25fYWxsb2Moc3RydWN0IGFybV92bXJlZ2lvbl9oZWFkICosIHNpemVfdCwgc2l6ZV90LCBnZnBfdCk7CiBzdHJ1Y3QgYXJtX3ZtcmVnaW9uICphcm1fdm1yZWdpb25fZmluZChzdHJ1Y3QgYXJtX3ZtcmVnaW9uX2hlYWQgKiwgdW5zaWduZWQgbG9uZyk7CiBzdHJ1Y3QgYXJtX3ZtcmVnaW9uICphcm1fdm1yZWdpb25fZmluZF9yZW1vdmUoc3RydWN0IGFybV92bXJlZ2lvbl9oZWFkICosIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBhcm1fdm1yZWdpb25fZnJlZShzdHJ1Y3QgYXJtX3ZtcmVnaW9uX2hlYWQgKiwgc3RydWN0IGFybV92bXJlZ2lvbiAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL3BjaS5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKaW5kZXggY2UzMWYzMS4uNDNmMmIxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKQEAgLTM1OSw3ICszNTksNyBAQAogCURCRygiQVRVOiBJT1AzWFhfQVRVQ01EPTB4JTA0eFxuIiwgKklPUDNYWF9BVFVDTUQpOwogCURCRygiQVRVOiBJT1AzWFhfQVRVQ1I9MHglMDh4XG4iLCAqSU9QM1hYX0FUVUNSKTsKIAotCWhvb2tfZmF1bHRfY29kZSgxNis2LCBpb3AzeHhfcGNpX2Fib3J0LCBTSUdCVVMsICJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiKTsKKwlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaW9wM3h4X3BjaV9hYm9ydCwgU0lHQlVTLCAwLCAiaW1wcmVjaXNlIGV4dGVybmFsIGFib3J0Iik7CiB9CiAKIC8qIGZvciBwbGF0Zm9ybXMgdGhhdCBtaWdodCBiZSBob3N0LWJ1cy1hZGFwdGVycyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jCmluZGV4IDZjOGEwMmEuLjg1ZDNlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtaW9wL3RpbWUuYworKysgYi9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMKQEAgLTI5LDYgKzI5LDExIEBACiAjaW5jbHVkZSA8bWFjaC90aW1lLmg+CiAKIC8qCisgKiBNaW5pbXVtIGNsb2Nrc291cmNlL2Nsb2NrZXZlbnQgdGltZXIgcmFuZ2UgaW4gc2Vjb25kcworICovCisjZGVmaW5lIElPUF9NSU5fUkFOR0UgNAorCisvKgogICogSU9QIGNsb2Nrc291cmNlIChmcmVlLXJ1bm5pbmcgdGltZXIgMSkuCiAgKi8KIHN0YXRpYyBjeWNsZV90IGlvcF9jbG9ja3NvdXJjZV9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqdW51c2VkKQpAQCAtNDQsMjcgKzQ5LDYgQEAKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9wX2Nsb2Nrc291cmNlX3NldF9oeihzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCB1bnNpZ25lZCBpbnQgaHopCi17Ci0JdTY0IHRlbXA7Ci0JdTMyIHNoaWZ0OwotCi0JLyogRmluZCBzaGlmdCBhbmQgbXVsdCB2YWx1ZXMgZm9yIGh6LiAqLwotCXNoaWZ0ID0gMzI7Ci0JZG8gewotCQl0ZW1wID0gKHU2NCkgTlNFQ19QRVJfU0VDIDw8IHNoaWZ0OwotCQlkb19kaXYodGVtcCwgaHopOwotCQlpZiAoKHRlbXAgPj4gMzIpID09IDApCi0JCQlicmVhazsKLQl9IHdoaWxlICgtLXNoaWZ0ICE9IDApOwotCi0JY3MtPnNoaWZ0ID0gc2hpZnQ7Ci0JY3MtPm11bHQgPSAodTMyKSB0ZW1wOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2xvY2tzb3VyY2U6ICVzIHVzZXMgc2hpZnQgJXUgbXVsdCAlI3hcbiIsCi0JICAgICAgIGNzLT5uYW1lLCBjcy0+c2hpZnQsIGNzLT5tdWx0KTsKLX0KLQogLyoKICAqIElPUCBzY2hlZF9jbG9jaygpIGltcGxlbWVudGF0aW9uIHZpYSBpdHMgY2xvY2tzb3VyY2UuCiAgKi8KQEAgLTEzMCwyNyArMTE0LDYgQEAKIAkuc2V0X21vZGUJPSBpb3Bfc2V0X21vZGUsCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9wX2Nsb2NrZXZlbnRfc2V0X2h6KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlLCB1bnNpZ25lZCBpbnQgaHopCi17Ci0JdTY0IHRlbXA7Ci0JdTMyIHNoaWZ0OwotCi0JLyogRmluZCBzaGlmdCBhbmQgbXVsdCB2YWx1ZXMgZm9yIGh6LiAqLwotCXNoaWZ0ID0gMzI7Ci0JZG8gewotCQl0ZW1wID0gKHU2NCkgaHogPDwgc2hpZnQ7Ci0JCWRvX2Rpdih0ZW1wLCBOU0VDX1BFUl9TRUMpOwotCQlpZiAoKHRlbXAgPj4gMzIpID09IDApCi0JCQlicmVhazsKLQl9IHdoaWxlICgtLXNoaWZ0ICE9IDApOwotCi0JY2UtPnNoaWZ0ID0gc2hpZnQ7Ci0JY2UtPm11bHQgPSAodTMyKSB0ZW1wOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2xvY2tldmVudDogJXMgdXNlcyBzaGlmdCAldSBtdWx0ICUjbHhcbiIsCi0JICAgICAgIGNlLT5uYW1lLCBjZS0+c2hpZnQsIGNlLT5tdWx0KTsKLX0KLQogc3RhdGljIGlycXJldHVybl90CiBpb3BfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKQEAgLTE5MCw3ICsxNTMsOCBAQAogCSAqLwogCXdyaXRlX3RtcjAodGltZXJfY3RsICYgfklPUF9UTVJfRU4pOwogCXNldHVwX2lycShJUlFfSU9QX1RJTUVSMCwgJmlvcF90aW1lcl9pcnEpOwotCWlvcF9jbG9ja2V2ZW50X3NldF9oeigmaW9wX2Nsb2NrZXZlbnQsIHRpY2tfcmF0ZSk7CisJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KCZpb3BfY2xvY2tldmVudCwKKwkJCQkgICAgdGlja19yYXRlLCBJT1BfTUlOX1JBTkdFKTsKIAlpb3BfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQogCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmUsICZpb3BfY2xvY2tldmVudCk7CiAJaW9wX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KQEAgLTIwNyw2ICsxNzEsNyBAQAogCXdyaXRlX3RycjEoMHhmZmZmZmZmZik7CiAJd3JpdGVfdGNyMSgweGZmZmZmZmZmKTsKIAl3cml0ZV90bXIxKHRpbWVyX2N0bCk7Ci0JaW9wX2Nsb2Nrc291cmNlX3NldF9oeigmaW9wX2Nsb2Nrc291cmNlLCB0aWNrX3JhdGUpOworCWNsb2Nrc291cmNlX2NhbGNfbXVsdF9zaGlmdCgmaW9wX2Nsb2Nrc291cmNlLCB0aWNrX3JhdGUsCisJCQkJICAgIElPUF9NSU5fUkFOR0UpOwogCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZpb3BfY2xvY2tzb3VyY2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvM2RzX2RlYnVnYm9hcmQuYyBiL2FyY2gvYXJtL3BsYXQtbXhjLzNkc19kZWJ1Z2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5YzU0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjLzNkc19kZWJ1Z2JvYXJkLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSmFzb24gV2FuZyA8amFzb243Ny53YW5nQGdtYWlsLmNvbT4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisvKiBMQU45MjE3IGV0aGVybmV0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMQU45MjE3X0JBU0VfQUREUihuKQkobiArIDB4MCkKKy8qIEV4dGVybmFsIFVBUlQgKi8KKyNkZWZpbmUgVUFSVEFfQkFTRV9BRERSKG4pCShuICsgMHg4MDAwKQorI2RlZmluZSBVQVJUQl9CQVNFX0FERFIobikJKG4gKyAweDEwMDAwKQorCisjZGVmaW5lIEJPQVJEX0lPX0FERFIobikJKG4gKyAweDIwMDAwKQorLyogTEVEIHN3aXRjaHMgKi8KKyNkZWZpbmUgTEVEX1NXSVRDSF9SRUcJCTB4MDAKKy8qIGJ1dHRvbnMgKi8KKyNkZWZpbmUgU1dJVENIX0JVVFRPTlNfUkVHCTB4MDgKKy8qIHN0YXR1cywgaW50ZXJydXB0ICovCisjZGVmaW5lIElOVFJfU1RBVFVTX1JFRwkweDEwCisjZGVmaW5lIElOVFJfTUFTS19SRUcJCTB4MzgKKyNkZWZpbmUgSU5UUl9SRVNFVF9SRUcJCTB4MjAKKy8qIG1hZ2ljIHdvcmQgZm9yIGRlYnVnIENQTEQgKi8KKyNkZWZpbmUgTUFHSUNfTlVNQkVSMV9SRUcJMHg0MAorI2RlZmluZSBNQUdJQ19OVU1CRVIyX1JFRwkweDQ4CisvKiBDUExEIGNvZGUgdmVyc2lvbiAqLworI2RlZmluZSBDUExEX0NPREVfVkVSX1JFRwkweDUwCisvKiBtYWdpYyB3b3JkIGZvciBkZWJ1ZyBDUExEICovCisjZGVmaW5lIE1BR0lDX05VTUJFUjNfUkVHCTB4NTgKKy8qIG1vZHVsZSByZXNldCByZWdpc3RlciovCisjZGVmaW5lIE1PRFVMRV9SRVNFVF9SRUcJMHg2MAorLyogQ1BVIElEIGFuZCBQZXJzb25hbGl0eSBJRCAqLworI2RlZmluZSBNQ1VfQk9BUkRfSURfUkVHCTB4NjgKKworI2RlZmluZSBNWENfSVJRX1RPX0VYUElPKGlycSkgICAoKGlycSkgLSBNWENfQk9BUkRfSVJRX1NUQVJUKQorI2RlZmluZSBNWENfSVJRX1RPX0dQSU8oaXJxKQkoKGlycSkgLSBNWENfSU5URVJOQUxfSVJRUykKKworI2RlZmluZSBNWENfRVhQX0lPX0JBU0UJCShNWENfQk9BUkRfSVJRX1NUQVJUKQorI2RlZmluZSBNWENfTUFYX0VYUF9JT19MSU5FUwkxNgorCisvKiBpbnRlcnJ1cHRzIGxpa2UgZXh0ZXJuYWwgdWFydCAsIGV4dGVybmFsIGV0aGVybmV0IGV0YyovCisjZGVmaW5lIEVYUElPX0lOVF9FTkVUCQkoTVhDX0JPQVJEX0lSUV9TVEFSVCArIDApCisjZGVmaW5lIEVYUElPX0lOVF9YVUFSVF9BCShNWENfQk9BUkRfSVJRX1NUQVJUICsgMSkKKyNkZWZpbmUgRVhQSU9fSU5UX1hVQVJUX0IJKE1YQ19CT0FSRF9JUlFfU1RBUlQgKyAyKQorI2RlZmluZSBFWFBJT19JTlRfQlVUVE9OX0EJKE1YQ19CT0FSRF9JUlFfU1RBUlQgKyAzKQorI2RlZmluZSBFWFBJT19JTlRfQlVUVE9OX0IJKE1YQ19CT0FSRF9JUlFfU1RBUlQgKyA0KQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpicmRfaW87CitzdGF0aWMgdm9pZCBleHBpb19hY2tfaXJxKHUzMiBpcnEpOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtc2M5MTF4X3Jlc291cmNlc1tdID0geworCXsKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSAsIHsKKwkJLnN0YXJ0ID0gRVhQSU9fSU5UX0VORVQsCisJCS5lbmQgPSBFWFBJT19JTlRfRU5FVCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIHNtc2M5MTF4X2NvbmZpZyA9IHsKKwkuaXJxX3BvbGFyaXR5ID0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9MT1csCisJLmZsYWdzID0gU01TQzkxMVhfVVNFXzMyQklUIHwgU01TQzkxMVhfRk9SQ0VfSU5URVJOQUxfUEhZLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21zY19sYW45MjE3X2RldmljZSA9IHsKKwkubmFtZSA9ICJzbXNjOTExeCIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzbXNjOTExeF9jb25maWcsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoc21zYzkxMXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBzbXNjOTExeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgdm9pZCBteGNfZXhwaW9faXJxX2hhbmRsZXIodTMyIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXUzMiBpbXJfdmFsOworCXUzMiBpbnRfdmFsaWQ7CisJdTMyIGV4cGlvX2lycTsKKworCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsJLyogaXJxID0gZ3BpbyBpcnEgbnVtYmVyICovCisKKwlpbXJfdmFsID0gX19yYXdfcmVhZHcoYnJkX2lvICsgSU5UUl9NQVNLX1JFRyk7CisJaW50X3ZhbGlkID0gX19yYXdfcmVhZHcoYnJkX2lvICsgSU5UUl9TVEFUVVNfUkVHKSAmIH5pbXJfdmFsOworCisJZXhwaW9faXJxID0gTVhDX0JPQVJEX0lSUV9TVEFSVDsKKwlmb3IgKDsgaW50X3ZhbGlkICE9IDA7IGludF92YWxpZCA+Pj0gMSwgZXhwaW9faXJxKyspIHsKKwkJc3RydWN0IGlycV9kZXNjICpkOworCQlpZiAoKGludF92YWxpZCAmIDEpID09IDApCisJCQljb250aW51ZTsKKwkJZCA9IGlycV9kZXNjICsgZXhwaW9faXJxOworCQlpZiAodW5saWtlbHkoIShkLT5oYW5kbGVfaXJxKSkpCisJCQlwcl9lcnIoIlxuRVhQSU8gaXJxOiAlZCB1bmhhbmRsZWRcbiIsIGV4cGlvX2lycSk7CisJCWVsc2UKKwkJCWQtPmhhbmRsZV9pcnEoZXhwaW9faXJxLCBkKTsKKwl9CisKKwlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKwlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKK30KKworLyoKKyAqIERpc2FibGUgYW4gZXhwaW8gcGluJ3MgaW50ZXJydXB0IGJ5IHNldHRpbmcgdGhlIGJpdCBpbiB0aGUgaW1yLgorICogSXJxIGlzIGFuIGV4cGlvIHZpcnR1YWwgaXJxIG51bWJlcgorICovCitzdGF0aWMgdm9pZCBleHBpb19tYXNrX2lycSh1MzIgaXJxKQoreworCXUxNiByZWc7CisJdTMyIGV4cGlvID0gTVhDX0lSUV9UT19FWFBJTyhpcnEpOworCisJcmVnID0gX19yYXdfcmVhZHcoYnJkX2lvICsgSU5UUl9NQVNLX1JFRyk7CisJcmVnIHw9ICgxIDw8IGV4cGlvKTsKKwlfX3Jhd193cml0ZXcocmVnLCBicmRfaW8gKyBJTlRSX01BU0tfUkVHKTsKK30KKworc3RhdGljIHZvaWQgZXhwaW9fYWNrX2lycSh1MzIgaXJxKQoreworCXUzMiBleHBpbyA9IE1YQ19JUlFfVE9fRVhQSU8oaXJxKTsKKworCV9fcmF3X3dyaXRldygxIDw8IGV4cGlvLCBicmRfaW8gKyBJTlRSX1JFU0VUX1JFRyk7CisJX19yYXdfd3JpdGV3KDAsIGJyZF9pbyArIElOVFJfUkVTRVRfUkVHKTsKKwlleHBpb19tYXNrX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBleHBpb191bm1hc2tfaXJxKHUzMiBpcnEpCit7CisJdTE2IHJlZzsKKwl1MzIgZXhwaW8gPSBNWENfSVJRX1RPX0VYUElPKGlycSk7CisKKwlyZWcgPSBfX3Jhd19yZWFkdyhicmRfaW8gKyBJTlRSX01BU0tfUkVHKTsKKwlyZWcgJj0gfigxIDw8IGV4cGlvKTsKKwlfX3Jhd193cml0ZXcocmVnLCBicmRfaW8gKyBJTlRSX01BU0tfUkVHKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBleHBpb19pcnFfY2hpcCA9IHsKKwkuYWNrID0gZXhwaW9fYWNrX2lycSwKKwkubWFzayA9IGV4cGlvX21hc2tfaXJxLAorCS51bm1hc2sgPSBleHBpb191bm1hc2tfaXJxLAorfTsKKworaW50IF9faW5pdCBteGNfZXhwaW9faW5pdCh1MzIgYmFzZSwgdTMyIHBfaXJxKQoreworCWludCBpOworCisJYnJkX2lvID0gaW9yZW1hcChCT0FSRF9JT19BRERSKGJhc2UpLCBTWl80Syk7CisJaWYgKGJyZF9pbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoX19yYXdfcmVhZHcoYnJkX2lvICsgTUFHSUNfTlVNQkVSMV9SRUcpICE9IDB4QUFBQSkgfHwKKwkgICAgKF9fcmF3X3JlYWR3KGJyZF9pbyArIE1BR0lDX05VTUJFUjJfUkVHKSAhPSAweDU1NTUpIHx8CisJICAgIChfX3Jhd19yZWFkdyhicmRfaW8gKyBNQUdJQ19OVU1CRVIzX1JFRykgIT0gMHhDQUZFKSkgeworCQlwcl9pbmZvKCIzLVN0YWNrIERlYnVnIGJvYXJkIG5vdCBkZXRlY3RlZFxuIik7CisJCWlvdW5tYXAoYnJkX2lvKTsKKwkJYnJkX2lvID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJfaW5mbygiMy1TdGFjayBEZWJ1ZyBib2FyZCBkZXRlY3RlZCwgcmV2ID0gMHglMDRYXG4iLAorCQlyZWFkdyhicmRfaW8gKyBDUExEX0NPREVfVkVSX1JFRykpOworCisJLyoKKwkgKiBDb25maWd1cmUgSU5UIGxpbmUgYXMgR1BJTyBpbnB1dAorCSAqLworCWdwaW9fcmVxdWVzdChNWENfSVJRX1RPX0dQSU8ocF9pcnEpLCAiZXhwaW9fcGlycSIpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KE1YQ19JUlFfVE9fR1BJTyhwX2lycSkpOworCisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0IGFuZCBjbGVhciB0aGUgc3RhdHVzICovCisJX19yYXdfd3JpdGV3KDAsIGJyZF9pbyArIElOVFJfTUFTS19SRUcpOworCV9fcmF3X3dyaXRldygweEZGRkYsIGJyZF9pbyArIElOVFJfUkVTRVRfUkVHKTsKKwlfX3Jhd193cml0ZXcoMCwgYnJkX2lvICsgSU5UUl9SRVNFVF9SRUcpOworCV9fcmF3X3dyaXRldygweDFGLCBicmRfaW8gKyBJTlRSX01BU0tfUkVHKTsKKwlmb3IgKGkgPSBNWENfRVhQX0lPX0JBU0U7CisJICAgICBpIDwgKE1YQ19FWFBfSU9fQkFTRSArIE1YQ19NQVhfRVhQX0lPX0xJTkVTKTsgaSsrKSB7CisJCXNldF9pcnFfY2hpcChpLCAmZXhwaW9faXJxX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2xldmVsX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CisJfQorCXNldF9pcnFfdHlwZShwX2lycSwgSVJRRl9UUklHR0VSX0xPVyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIocF9pcnEsIG14Y19leHBpb19pcnFfaGFuZGxlcik7CisKKwkvKiBSZWdpc3RlciBMYW4gZGV2aWNlIG9uIHRoZSBkZWJ1Z2JvYXJkICovCisJc21zYzkxMXhfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gTEFOOTIxN19CQVNFX0FERFIoYmFzZSk7CisJc21zYzkxMXhfcmVzb3VyY2VzWzBdLmVuZCA9IExBTjkyMTdfQkFTRV9BRERSKGJhc2UpICsgMHgxMDAgLSAxOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21zY19sYW45MjE3X2RldmljZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW14Yy9LY29uZmlnCmluZGV4IDdmN2FkNmYuLjA1MjdlNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZwpAQCAtMSw1ICsxLDcgQEAKIGlmIEFSQ0hfTVhDCiAKK3NvdXJjZSAiYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9LY29uZmlnIgorCiBtZW51ICJGcmVlc2NhbGUgTVhDIEltcGxlbWVudGF0aW9ucyIKIAogY2hvaWNlCkBAIC04LDE1ICsxMCwxMiBAQAogCiBjb25maWcgQVJDSF9NWDEKIAlib29sICJNWDEtYmFzZWQiCi0Jc2VsZWN0IENQVV9BUk05MjBUCi0Jc2VsZWN0IElNWF9IQVZFX0lPTVVYX1YxCisJc2VsZWN0IFNPQ19JTVgxCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YMSBmYW1pbHkKIAogY29uZmlnIEFSQ0hfTVgyCiAJYm9vbCAiTVgyLWJhc2VkIgotCXNlbGVjdCBDUFVfQVJNOTI2VAotCXNlbGVjdCBJTVhfSEFWRV9JT01VWF9WMQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDIgZmFtaWx5CiAKQEAgLTI1LDYgKzI0LDcgQEAKIAlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgQVJDSF9NWENfSU9NVVhfVjMKIAlzZWxlY3QgSEFWRV9GQl9JTVgKKwlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YyCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YMjUgZmFtaWx5CiAKQEAgLTQ4LDggKzQ4LDcgQEAKIAogZW5kY2hvaWNlCiAKLXNvdXJjZSAiYXJjaC9hcm0vbWFjaC1teDEvS2NvbmZpZyIKLXNvdXJjZSAiYXJjaC9hcm0vbWFjaC1teDIvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1teDMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1teDI1L0tjb25maWciCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbXhjOTEyMzEvS2NvbmZpZyIKQEAgLTgxLDYgKzgwLDE3IEBACiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBpLk1YIFBXTSBjb250cm9sbGVyKHMpLgogCitjb25maWcgTVhDX0RFQlVHX0JPQVJECisJYm9vbCAiRW5hYmxlIE1YQyBkZWJ1ZyBib2FyZChmb3IgMy1zdGFjaykiCisJaGVscAorCSAgVGhlIGRlYnVnIGJvYXJkIGlzIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIE1YQyAzLXN0YWNrKFBESykKKwkgIHBsYXRmb3JtcywgaXQgY2FuIGJlIGF0dGFjaGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgcGVyaXBoZXJhbAorCSAgYm9hcmQuIE9uIGRlYnVnIGJvYXJkLCBzZXZlcmFsIGRlYnVnIGRldmljZXMoZXRoZXJuZXQsIFVBUlQsCisJICBidXR0b25zLCBMRURzIGFuZCBKVEFHKSBhcmUgaW1wbGVtZW50ZWQuIEJldHdlZW4gdGhlIE1DVSBhbmQKKwkgIHRoZXNlIGRldmljZXMsIGEgQ1BMRCBpcyBhZGRlZCBhcyBhIGJyaWRnZSB3aGljaCBwZXJmb3JtcworCSAgZGF0YS9hZGRyZXNzIGRlLW11bHRpcGxleGluZyBhbmQgZGVjb2RlLCBzaWduYWwgbGV2ZWwgc2hpZnQsCisJICBpbnRlcnJ1cHQgY29udHJvbCBhbmQgdmFyaW91cyBib2FyZCBmdW5jdGlvbnMuCisKIGNvbmZpZyBNWENfVUxQSQogCWJvb2wKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQppbmRleCA4OTViYzNjLi43OGQ0MDVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQpAQCAtOCw4ICs4LDYgQEAKICMgTVg1MSB1c2VzIHRoZSBUWklDIGludGVycnVwdCBjb250cm9sbGVyLCBvbGRlciBwbGF0Zm9ybXMgdXNlIEFWSUMgKGlycS5vKQogb2JqLSQoQ09ORklHX01YQ19UWklDKSArPSB0emljLm8KIAotb2JqLSQoQ09ORklHX0FSQ0hfTVgxKSArPSBkbWEtbXgxLW14Mi5vCi1vYmotJChDT05GSUdfQVJDSF9NWDIpICs9IGRtYS1teDEtbXgyLm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9JT01VWF9WMSkgKz0gaW9tdXgtdjEubwogb2JqLSQoQ09ORklHX0FSQ0hfTVhDX0lPTVVYX1YzKSArPSBpb211eC12My5vCiBvYmotJChDT05GSUdfTVhDX1BXTSkgICs9IHB3bS5vCkBAIC0xNyw3ICsxNSwxMCBAQAogb2JqLSQoQ09ORklHX01YQ19VTFBJKSArPSB1bHBpLm8KIG9iai0kKENPTkZJR19BUkNIX01YQ19BVURNVVhfVjEpICs9IGF1ZG11eC12MS5vCiBvYmotJChDT05GSUdfQVJDSF9NWENfQVVETVVYX1YyKSArPSBhdWRtdXgtdjIubworb2JqLSQoQ09ORklHX01YQ19ERUJVR19CT0FSRCkgKz0gM2RzX2RlYnVnYm9hcmQubwogaWZkZWYgQ09ORklHX1NORF9JTVhfU09DCiBvYmoteSArPSBzc2ktZmlxLm8KIG9iai15ICs9IHNzaS1maXEta3N5bS5vCiBlbmRpZgorCitvYmoteSArPSBkZXZpY2VzLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvYXVkbXV4LXYxLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjEuYwppbmRleCBiNjI5MTdjLi4xMTgwYmVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjEuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjEuYwpAQCAtMTMsMTAgKzEzLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvYXVkbXV4LXYyLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjIuYwppbmRleCAwYzJjYzVjLi5mOWU3Y2RiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjIuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjIuYwpAQCAtMTMsMTAgKzEzLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTkxLDYgKzE4Nyw3IEBACiB7CiAJaW50IHJldDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzKQogCWlmIChjcHVfaXNfbXgzMSgpKQogCQlhdWRtdXhfYmFzZSA9IE1YMzFfSU9fQUREUkVTUyhNWDMxX0FVRE1VWF9CQVNFX0FERFIpOwogCkBAIC0yMDQsNyArMjAxLDE5IEBACiAJCX0KIAkJYXVkbXV4X2Jhc2UgPSBNWDM1X0lPX0FERFJFU1MoTVgzNV9BVURNVVhfQkFTRV9BRERSKTsKIAl9Ci0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgyNSkKKwlpZiAoY3B1X2lzX214MjUoKSkgeworCQlhdWRtdXhfY2xrID0gY2xrX2dldChOVUxMLCAiYXVkbXV4Iik7CisJCWlmIChJU19FUlIoYXVkbXV4X2NsaykpIHsKKwkJCXJldCA9IFBUUl9FUlIoYXVkbXV4X2Nsayk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0IGNsb2NrOiAlZFxuIiwgX19mdW5jX18sCisJCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWF1ZG11eF9iYXNlID0gTVgyNV9JT19BRERSRVNTKE1YMjVfQVVETVVYX0JBU0VfQUREUik7CisJfQorI2VuZGlmCiAJYXVkbXV4X2RlYnVnZnNfaW5pdCgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1teGMvY2xvY2suYwppbmRleCAzMjNmZjhjLi4yZWQzYWIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2Nsb2NrLmMKQEAgLTUyLDEzICs1MiwxNCBAQAogewogCWlmIChjbGsgPT0gTlVMTCB8fCBJU19FUlIoY2xrKSkKIAkJcmV0dXJuOwotCi0JX19jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7Ci0JX19jbGtfZGlzYWJsZShjbGstPnNlY29uZGFyeSk7Ci0KIAlXQVJOX09OKCFjbGstPnVzZWNvdW50KTsKLQlpZiAoISgtLWNsay0+dXNlY291bnQpICYmIGNsay0+ZGlzYWJsZSkKLQkJY2xrLT5kaXNhYmxlKGNsayk7CisKKwlpZiAoISgtLWNsay0+dXNlY291bnQpKSB7CisJCWlmIChjbGstPmRpc2FibGUpCisJCQljbGstPmRpc2FibGUoY2xrKTsKKwkJX19jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CisJCV9fY2xrX2Rpc2FibGUoY2xrLT5zZWNvbmRhcnkpOworCX0KIH0KIAogc3RhdGljIGludCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQpAQCAtNjYsMTIgKzY3LDEzIEBACiAJaWYgKGNsayA9PSBOVUxMIHx8IElTX0VSUihjbGspKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCV9fY2xrX2VuYWJsZShjbGstPnBhcmVudCk7Ci0JX19jbGtfZW5hYmxlKGNsay0+c2Vjb25kYXJ5KTsKKwlpZiAoY2xrLT51c2Vjb3VudCsrID09IDApIHsKKwkJX19jbGtfZW5hYmxlKGNsay0+cGFyZW50KTsKKwkJX19jbGtfZW5hYmxlKGNsay0+c2Vjb25kYXJ5KTsKIAotCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCAmJiBjbGstPmVuYWJsZSkKLQkJY2xrLT5lbmFibGUoY2xrKTsKLQorCQlpZiAoY2xrLT5lbmFibGUpCisJCQljbGstPmVuYWJsZShjbGspOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYwLDE3ICsxNjIsMjggQEAKIGludCBjbGtfc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgY2xrICpvbGQ7CiAKIAlpZiAoY2xrID09IE5VTEwgfHwgSVNfRVJSKGNsaykgfHwgcGFyZW50ID09IE5VTEwgfHwKIAkgICAgSVNfRVJSKHBhcmVudCkgfHwgY2xrLT5zZXRfcGFyZW50ID09IE5VTEwpCiAJCXJldHVybiByZXQ7CiAKKwlpZiAoY2xrLT51c2Vjb3VudCkKKwkJY2xrX2VuYWJsZShwYXJlbnQpOworCiAJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlyZXQgPSBjbGstPnNldF9wYXJlbnQoY2xrLCBwYXJlbnQpOwotCWlmIChyZXQgPT0gMCkKKwlpZiAocmV0ID09IDApIHsKKwkJb2xkID0gY2xrLT5wYXJlbnQ7CiAJCWNsay0+cGFyZW50ID0gcGFyZW50OworCX0gZWxzZSB7CisJCW9sZCA9IHBhcmVudDsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCisJaWYgKGNsay0+dXNlY291bnQpCisJCWNsa19kaXNhYmxlKG9sZCk7CisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChjbGtfc2V0X3BhcmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMKaW5kZXggNTZmMmZiNS4uNzM1Nzc2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAKQEAgLTM1LDMgKzM2LDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKKwkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW1fcmVzb3VyY2VzLAorCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZV9kYXRhKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIGlkKTsKKwlpZiAoIXBkZXYpCisJCWdvdG8gZXJyOworCisJaWYgKHJlcykgeworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByZXMsIG51bV9yZXNvdXJjZXMpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJaWYgKGRhdGEpIHsKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIGRhdGEsIHNpemVfZGF0YSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChyZXQpIHsKK2VycjoKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gcGRldjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI3ODRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9LY29uZmlnCkBAIC0wLDAgKzEsMTUgQEAKK2NvbmZpZyBJTVhfSEFWRV9QTEFURk9STV9GTEVYQ0FOCisJc2VsZWN0IEhBVkVfQ0FOX0ZMRVhDQU4KKwlib29sCisKK2NvbmZpZyBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCisJYm9vbAorCitjb25maWcgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlib29sCisKK2NvbmZpZyBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCWJvb2wKKworY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKKwlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDdkYTUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK2lmZGVmIENPTkZJR19DQU5fRkxFWENBTgorIyB0aGUgaWZkZWYgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgZmxleGNhbiBkcml2ZXIgaGFzIGJlZW4gbWVyZ2VkCitvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fRkxFWENBTikgKz0gIHBsYXRmb3JtLWZsZXhjYW4ubworZW5kaWYKK29iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDKSArPSBwbGF0Zm9ybS1pbXgtaTJjLm8KK29iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVCkgKz0gcGxhdGZvcm0taW14LXVhcnQubworb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX01YQ19OQU5EKSArPSBwbGF0Zm9ybS1teGNfbmFuZC5vCitvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWCkgKz0gIHBsYXRmb3JtLXNwaV9pbXgubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mbGV4Y2FuLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZsZXhjYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk3YTAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mbGV4Y2FuLmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBQZW5ndXRyb25peCwgTWFyYyBLbGVpbmUtQnVkZGUgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX2ZsZXhjYW4oaW50IGlkLAorCQlyZXNvdXJjZV9zaXplX3QgaW9iYXNlLCByZXNvdXJjZV9zaXplX3QgaW9zaXplLAorCQlyZXNvdXJjZV9zaXplX3QgaXJxLAorCQljb25zdCBzdHJ1Y3QgZmxleGNhbl9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IGlvYmFzZSwKKwkJCS5lbmQgPSBpb2Jhc2UgKyBpb3NpemUgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sIHsKKwkJCS5zdGFydCA9IGlycSwKKwkJCS5lbmQgPSBpcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJmbGV4Y2FuIiwgaWQsIHJlcywgQVJSQVlfU0laRShyZXMpLAorCQkJcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWkyYy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhZjlmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWkyYy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBQZW5ndXRyb25peAorICogVXdlIEtsZWluZS1Lb2VuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfaTJjKGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwgaW50IGlycSwKKwkJY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IGlvYmFzZSwKKwkJCS5lbmQgPSBpb2Jhc2UgKyBpb3NpemUgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sIHsKKwkJCS5zdGFydCA9IGlycSwKKwkJCS5lbmQgPSBpcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJpbXgtaTJjIiwgaWQsIHJlcywgQVJSQVlfU0laRShyZXMpLAorCQkJcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNkZmYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtdWFydC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBQZW5ndXRyb25peAorICogVXdlIEtsZWluZS1Lb2VuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfdWFydF8zaXJxKGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlycXJ4LCByZXNvdXJjZV9zaXplX3QgaXJxdHgsCisJCXJlc291cmNlX3NpemVfdCBpcnFydHMsCisJCWNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gaW9iYXNlLAorCQkJLmVuZCA9IGlvYmFzZSArIGlvc2l6ZSAtIDEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gaXJxcngsCisJCQkuZW5kID0gaXJxcngsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gaXJxdHgsCisJCQkuZW5kID0gaXJxdHgsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gaXJxcnRzLAorCQkJLmVuZCA9IGlycXJ4LAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgiaW14LXVhcnQiLCBpZCwgcmVzLCBBUlJBWV9TSVpFKHJlcyksCisJCQlwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfdWFydF8xaXJxKGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlycSwKKwkJY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHJlc291cmNlIHJlc1tdID0geworCQl7CisJCQkuc3RhcnQgPSBpb2Jhc2UsCisJCQkuZW5kID0gaW9iYXNlICsgaW9zaXplIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBpcnEsCisJCQkuZW5kID0gaXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgiaW14LXVhcnQiLCBpZCwgcmVzLCBBUlJBWV9TSVpFKHJlcyksCisJCQlwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGNfbmFuZC5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGNfbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMjg2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLW14Y19uYW5kLmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFBlbmd1dHJvbml4CisgKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9teGNfbmFuZChyZXNvdXJjZV9zaXplX3QgaW9iYXNlLAorCQlpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCisJCXJlc291cmNlX3NpemVfdCBpb3NpemUpCit7CisJc3RhdGljIGludCBpZCA9IDA7CisJCisJc3RydWN0IHJlc291cmNlIHJlc1tdID0geworCQl7CisJCQkuc3RhcnQgPSBpb2Jhc2UsCisJCQkuZW5kID0gaW9iYXNlICsgaW9zaXplIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBpcnEsCisJCQkuZW5kID0gaXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgibXhjX25hbmQiLCBpZCsrLCByZXMsIEFSUkFZX1NJWkUocmVzKSwKKwkJCXBkYXRhLCBzaXplb2YoKnBkYXRhKSk7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX214Y19uYW5kX3YxKHJlc291cmNlX3NpemVfdCBpb2Jhc2UsCisJCWludCBpcnEsIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlyZXR1cm4gaW14X2FkZF9teGNfbmFuZChpb2Jhc2UsIGlycSwgcGRhdGEsIFNaXzRLKTsKK30KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfbXhjX25hbmRfdjIxKHJlc291cmNlX3NpemVfdCBpb2Jhc2UsCisJCWludCBpcnEsIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlyZXR1cm4gaW14X2FkZF9teGNfbmFuZChpb2Jhc2UsIGlycSwgcGRhdGEsIFNaXzhLKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc3BpX2lteC5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zcGlfaW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzMWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc3BpX2lteC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBQZW5ndXRyb25peAorICogVXdlIEtsZWluZS1Lb2VuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9zcGlfaW14KGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwgaW50IGlycSwKKwkJY29uc3Qgc3RydWN0IHNwaV9pbXhfbWFzdGVyICpwZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IGlvYmFzZSwKKwkJCS5lbmQgPSBpb2Jhc2UgKyBpb3NpemUgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sIHsKKwkJCS5zdGFydCA9IGlycSwKKwkJCS5lbmQgPSBpcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJzcGlfaW14IiwgaWQsIHJlcywgQVJSQVlfU0laRShyZXMpLAorCQkJcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RtYS1teDEtbXgyLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kbWEtbXgxLW14Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTYwMTRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RtYS1teDEtbXgyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjMgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9wbGF0LW14Yy9kbWEtbXgxLW14Mi5jCi0gKgotICogIGkuTVggRE1BIHJlZ2lzdHJhdGlvbiBhbmQgSVJRIGRpc3BhdGNoaW5nCi0gKgotICogQ29weXJpZ2h0IDIwMDYgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgotICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgotICogQ29weXJpZ2h0IDIwMDggU2FzY2hhIEhhdWVyLCA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9kbWEtbXgxLW14Mi5oPgotCi0jZGVmaW5lIERNQV9EQ1IgICAgIDB4MDAJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX0RJU1IgICAgMHgwNAkJLyogSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBETUFfRElNUiAgICAweDA4CQkvKiBJbnRlcnJ1cHQgbWFzayBSZWdpc3RlciAqLwotI2RlZmluZSBETUFfREJUT1NSICAweDBjCQkvKiBCdXJzdCB0aW1lb3V0IHN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBETUFfRFJUT1NSICAweDEwCQkvKiBSZXF1ZXN0IHRpbWVvdXQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX0RTRVNSICAgMHgxNAkJLyogVHJhbnNmZXIgRXJyb3IgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIERNQV9EQk9TUiAgIDB4MTgJCS8qIEJ1ZmZlciBvdmVyZmxvdyBzdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX0RCVE9DUiAgMHgxYwkJLyogQnVyc3QgdGltZW91dCBjb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIERNQV9XU1JBICAgIDB4NDAJCS8qIFctU2l6ZSBSZWdpc3RlciBBICovCi0jZGVmaW5lIERNQV9YU1JBICAgIDB4NDQJCS8qIFgtU2l6ZSBSZWdpc3RlciBBICovCi0jZGVmaW5lIERNQV9ZU1JBICAgIDB4NDgJCS8qIFktU2l6ZSBSZWdpc3RlciBBICovCi0jZGVmaW5lIERNQV9XU1JCICAgIDB4NGMJCS8qIFctU2l6ZSBSZWdpc3RlciBCICovCi0jZGVmaW5lIERNQV9YU1JCICAgIDB4NTAJCS8qIFgtU2l6ZSBSZWdpc3RlciBCICovCi0jZGVmaW5lIERNQV9ZU1JCICAgIDB4NTQJCS8qIFktU2l6ZSBSZWdpc3RlciBCICovCi0jZGVmaW5lIERNQV9TQVIoeCkgICgweDgwICsgKCh4KSA8PCA2KSkJLyogU291cmNlIEFkZHJlc3MgUmVnaXN0ZXJzICovCi0jZGVmaW5lIERNQV9EQVIoeCkgICgweDg0ICsgKCh4KSA8PCA2KSkJLyogRGVzdGluYXRpb24gQWRkcmVzcyBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgRE1BX0NOVFIoeCkgKDB4ODggKyAoKHgpIDw8IDYpKQkvKiBDb3VudCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgRE1BX0NDUih4KSAgKDB4OGMgKyAoKHgpIDw8IDYpKQkvKiBDb250cm9sIFJlZ2lzdGVycyAqLwotI2RlZmluZSBETUFfUlNTUih4KSAoMHg5MCArICgoeCkgPDwgNikpCS8qIFJlcXVlc3Qgc291cmNlIHNlbGVjdCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgRE1BX0JMUih4KSAgKDB4OTQgKyAoKHgpIDw8IDYpKQkvKiBCdXJzdCBsZW5ndGggUmVnaXN0ZXJzICovCi0jZGVmaW5lIERNQV9SVE9SKHgpICgweDk4ICsgKCh4KSA8PCA2KSkJLyogUmVxdWVzdCB0aW1lb3V0IFJlZ2lzdGVycyAqLwotI2RlZmluZSBETUFfQlVDUih4KSAoMHg5OCArICgoeCkgPDwgNikpCS8qIEJ1cyBVdGlsaXphdGlvbiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgRE1BX0NDTlIoeCkgKDB4OUMgKyAoKHgpIDw8IDYpKQkvKiBDaGFubmVsIGNvdW50ZXIgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgRENSX0RSU1QgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBEQ1JfREVOICAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIERCVE9DUl9FTiAgICAgICAgICAoMTw8MTUpCi0jZGVmaW5lIERCVE9DUl9DTlQoeCkgICAgICAoKHgpICYgMHg3ZmZmKQotI2RlZmluZSBDTlRSX0NOVCh4KSAgICAgICAgKCh4KSAmIDB4ZmZmZmZmKQotI2RlZmluZSBDQ1JfQUNSUFQgICAgICAgICAgKDE8PDE0KQotI2RlZmluZSBDQ1JfRE1PRF9MSU5FQVIgICAgKDB4MCA8PCAxMikKLSNkZWZpbmUgQ0NSX0RNT0RfMkQgICAgICAgICgweDEgPDwgMTIpCi0jZGVmaW5lIENDUl9ETU9EX0ZJRk8gICAgICAoMHgyIDw8IDEyKQotI2RlZmluZSBDQ1JfRE1PRF9FT0JGSUZPICAgKDB4MyA8PCAxMikKLSNkZWZpbmUgQ0NSX1NNT0RfTElORUFSICAgICgweDAgPDwgMTApCi0jZGVmaW5lIENDUl9TTU9EXzJEICAgICAgICAoMHgxIDw8IDEwKQotI2RlZmluZSBDQ1JfU01PRF9GSUZPICAgICAgKDB4MiA8PCAxMCkKLSNkZWZpbmUgQ0NSX1NNT0RfRU9CRklGTyAgICgweDMgPDwgMTApCi0jZGVmaW5lIENDUl9NRElSX0RFQyAgICAgICAoMTw8OSkKLSNkZWZpbmUgQ0NSX01TRUxfQiAgICAgICAgICgxPDw4KQotI2RlZmluZSBDQ1JfRFNJWl8zMiAgICAgICAgKDB4MCA8PCA2KQotI2RlZmluZSBDQ1JfRFNJWl84ICAgICAgICAgKDB4MSA8PCA2KQotI2RlZmluZSBDQ1JfRFNJWl8xNiAgICAgICAgKDB4MiA8PCA2KQotI2RlZmluZSBDQ1JfU1NJWl8zMiAgICAgICAgKDB4MCA8PCA0KQotI2RlZmluZSBDQ1JfU1NJWl84ICAgICAgICAgKDB4MSA8PCA0KQotI2RlZmluZSBDQ1JfU1NJWl8xNiAgICAgICAgKDB4MiA8PCA0KQotI2RlZmluZSBDQ1JfUkVOICAgICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIENDUl9SUFQgICAgICAgICAgICAoMTw8MikKLSNkZWZpbmUgQ0NSX0ZSQyAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBDQ1JfQ0VOICAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIFJUT1JfRU4gICAgICAgICAgICAoMTw8MTUpCi0jZGVmaW5lIFJUT1JfQ0xLICAgICAgICAgICAoMTw8MTQpCi0jZGVmaW5lIFJUT1JfUFNDICAgICAgICAgICAoMTw8MTMpCi0KLS8qCi0gKiBzdHJ1Y3QgaW14X2RtYV9jaGFubmVsIC0gaS5NWCBzcGVjaWZpYyBETUEgZXh0ZW5zaW9uCi0gKiBAbmFtZTogbmFtZSBzcGVjaWZpZWQgYnkgRE1BIGNsaWVudAotICogQGlycV9oYW5kbGVyOiBjbGllbnQgY2FsbGJhY2sgZm9yIGVuZCBvZiB0cmFuc2ZlcgotICogQGVycl9oYW5kbGVyOiBjbGllbnQgY2FsbGJhY2sgZm9yIGVycm9yIGNvbmRpdGlvbgotICogQGRhdGE6IGNsaWVudHMgY29udGV4dCBkYXRhIGZvciBjYWxsYmFja3MKLSAqIEBkbWFfbW9kZTogZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlciAlRE1BX01PREVfUkVBRCBvciAlRE1BX01PREVfV1JJVEUKLSAqIEBzZzogcG9pbnRlciB0byB0aGUgYWN0dWFsIHJlYWQvd3JpdHRlbiBjaHVuayBmb3Igc2NhdHRlci1nYXRoZXIgZW11bGF0aW9uCi0gKiBAcmVzYnl0ZXM6IHRvdGFsIHJlc2lkdWFsIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgotICogICAgICAgICAgICAoaXQgY2FuIGJlIGxvd2VyIG9yIHNhbWUgYXMgc3VtIG9mIFNHIG1hcHBlZCBjaHVuayBzaXplcykKLSAqIEBzZ2NvdW50OiBudW1iZXIgb2YgY2h1bmtzIHRvIGJlIHJlYWQvd3JpdHRlbgotICoKLSAqIFN0cnVjdHVyZSBpcyB1c2VkIGZvciBJTVggRE1BIHByb2Nlc3NpbmcuIEl0IHdvdWxkIGJlIHByb2JhYmx5IGdvb2QKLSAqIEBzdHJ1Y3QgZG1hX3N0cnVjdCBpbiB0aGUgZnV0dXJlIGZvciBleHRlcm5hbCBpbnRlcmZhY2luZyBhbmQgdXNlCi0gKiBAc3RydWN0IGlteF9kbWFfY2hhbm5lbCBvbmx5IGFzIGV4dGVuc2lvbiB0byBpdC4KLSAqLwotCi1zdHJ1Y3QgaW14X2RtYV9jaGFubmVsIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXZvaWQgKCppcnFfaGFuZGxlcikgKGludCwgdm9pZCAqKTsKLQl2b2lkICgqZXJyX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgaW50IGVycmNvZGUpOwotCXZvaWQgKCpwcm9nX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICopOwotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgaW50IGRtYV9tb2RlOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JdW5zaWduZWQgaW50IHJlc2J5dGVzOwotCWludCBkbWFfbnVtOwotCi0JaW50IGluX3VzZTsKLQotCXUzMiBjY3JfZnJvbV9kZXZpY2U7Ci0JdTMyIGNjcl90b19kZXZpY2U7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKLQotCWludCBod19jaGFpbmluZzsKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKmlteF9kbWF2MV9iYXNlYWRkcjsKLQotc3RhdGljIHZvaWQgaW14X2RtYXYxX3dyaXRlbCh1bnNpZ25lZCB2YWwsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlfX3Jhd193cml0ZWwodmFsLCBpbXhfZG1hdjFfYmFzZWFkZHIgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW14X2RtYXYxX3JlYWRsKHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGwoaW14X2RtYXYxX2Jhc2VhZGRyICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgaW14X2RtYV9jaGFubmVsc1tJTVhfRE1BX0NIQU5ORUxTXTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmRtYV9jbGs7Ci0KLXN0YXRpYyBpbnQgaW14X2RtYV9od19jaGFpbihzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEpCi17Ci0JaWYgKGNwdV9pc19teDI3KCkpCi0JCXJldHVybiBpbXhkbWEtPmh3X2NoYWluaW5nOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBpbXhfZG1hX3NnX25leHQgLSBwcmVwYXJlIG5leHQgY2h1bmsgZm9yIHNjYXR0ZXItZ2F0aGVyIERNQSBlbXVsYXRpb24KLSAqLwotc3RhdGljIGlubGluZSBpbnQgaW14X2RtYV9zZ19uZXh0KGludCBjaGFubmVsLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQotewotCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwotCXVuc2lnbmVkIGxvbmcgbm93OwotCi0JaWYgKCFpbXhkbWEtPm5hbWUpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGNhbGxlZCBmb3IgIG5vdCBhbGxvY2F0ZWQgY2hhbm5lbCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jbm93ID0gbWluKGlteGRtYS0+cmVzYnl0ZXMsIHNnLT5sZW5ndGgpOwotCWlmIChpbXhkbWEtPnJlc2J5dGVzICE9IElNWF9ETUFfTEVOR1RIX0xPT1ApCi0JCWlteGRtYS0+cmVzYnl0ZXMgLT0gbm93OwotCi0JaWYgKChpbXhkbWEtPmRtYV9tb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfUkVBRCkKLQkJaW14X2RtYXYxX3dyaXRlbChzZy0+ZG1hX2FkZHJlc3MsIERNQV9EQVIoY2hhbm5lbCkpOwotCWVsc2UKLQkJaW14X2RtYXYxX3dyaXRlbChzZy0+ZG1hX2FkZHJlc3MsIERNQV9TQVIoY2hhbm5lbCkpOwotCi0JaW14X2RtYXYxX3dyaXRlbChub3csIERNQV9DTlRSKGNoYW5uZWwpKTsKLQotCXByX2RlYnVnKCJpbXhkbWElZDogbmV4dCBzZyBjaHVuayBkc3QgMHglMDh4LCBzcmMgMHglMDh4LCAiCi0JCSJzaXplIDB4JTA4eFxuIiwgY2hhbm5lbCwKLQkJIGlteF9kbWF2MV9yZWFkbChETUFfREFSKGNoYW5uZWwpKSwKLQkJIGlteF9kbWF2MV9yZWFkbChETUFfU0FSKGNoYW5uZWwpKSwKLQkJIGlteF9kbWF2MV9yZWFkbChETUFfQ05UUihjaGFubmVsKSkpOwotCi0JcmV0dXJuIG5vdzsKLX0KLQotLyoqCi0gKiBpbXhfZG1hX3NldHVwX3NpbmdsZSAtIHNldHVwIGkuTVggRE1BIGNoYW5uZWwgZm9yIGxpbmVhciBtZW1vcnkgdG8vZnJvbQotICogZGV2aWNlIHRyYW5zZmVyCi0gKgotICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCi0gKiBAZG1hX2FkZHJlc3M6IHRoZSBETUEvcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIGxpbmVhciBkYXRhIGJsb2NrCi0gKgkJdG8gdHJhbnNmZXIKLSAqIEBkbWFfbGVuZ3RoOiBsZW5ndGggb2YgdGhlIGRhdGEgYmxvY2sgaW4gYnl0ZXMKLSAqIEBkZXZfYWRkcjogcGh5c2ljYWwgZGV2aWNlIHBvcnQgYWRkcmVzcwotICogQGRtYW1vZGU6IERNQSB0cmFuc2ZlciBtb2RlLCAlRE1BX01PREVfUkVBRCBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIG1lbW9yeQotICogICAgICAgICAgIG9yICVETUFfTU9ERV9XUklURSBmcm9tIG1lbW9yeSB0byB0aGUgZGV2aWNlCi0gKgotICogUmV0dXJuIHZhbHVlOiBpZiBpbmNvcnJlY3QgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQgLSVFSU5WQUwuCi0gKgkJWmVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KLSAqLwotaW50Ci1pbXhfZG1hX3NldHVwX3NpbmdsZShpbnQgY2hhbm5lbCwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKLQkJICAgICB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAotCQkgICAgIHVuc2lnbmVkIGludCBkbWFtb2RlKQotewotCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwotCi0JaW14ZG1hLT5zZyA9IE5VTEw7Ci0JaW14ZG1hLT5kbWFfbW9kZSA9IGRtYW1vZGU7Ci0KLQlpZiAoIWRtYV9hZGRyZXNzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2luZ2xlIG51bGwgYWRkcmVzc1xuIiwKLQkJICAgICAgIGNoYW5uZWwpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWRtYV9sZW5ndGgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpbXhkbWElZDogaW14X2RtYV9zZXR1cF9zaW5nbGUgemVybyBsZW5ndGhcbiIsCi0JCSAgICAgICBjaGFubmVsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKChkbWFtb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfUkVBRCkgewotCQlwcl9kZWJ1ZygiaW14ZG1hJWQ6ICVzIGRtYV9hZGRyZXNzZz0weCUwOHggZG1hX2xlbmd0aD0lZCAiCi0JCQkiZGV2X2FkZHI9MHglMDh4IGZvciByZWFkXG4iLAotCQkJY2hhbm5lbCwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZG1hX2FkZHJlc3MsCi0JCQlkbWFfbGVuZ3RoLCBkZXZfYWRkcik7Ci0KLQkJaW14X2RtYXYxX3dyaXRlbChkZXZfYWRkciwgRE1BX1NBUihjaGFubmVsKSk7Ci0JCWlteF9kbWF2MV93cml0ZWwoZG1hX2FkZHJlc3MsIERNQV9EQVIoY2hhbm5lbCkpOwotCQlpbXhfZG1hdjFfd3JpdGVsKGlteGRtYS0+Y2NyX2Zyb21fZGV2aWNlLCBETUFfQ0NSKGNoYW5uZWwpKTsKLQl9IGVsc2UgaWYgKChkbWFtb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfV1JJVEUpIHsKLQkJcHJfZGVidWcoImlteGRtYSVkOiAlcyBkbWFfYWRkcmVzc2c9MHglMDh4IGRtYV9sZW5ndGg9JWQgIgotCQkJImRldl9hZGRyPTB4JTA4eCBmb3Igd3JpdGVcbiIsCi0JCQljaGFubmVsLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludClkbWFfYWRkcmVzcywKLQkJCWRtYV9sZW5ndGgsIGRldl9hZGRyKTsKLQotCQlpbXhfZG1hdjFfd3JpdGVsKGRtYV9hZGRyZXNzLCBETUFfU0FSKGNoYW5uZWwpKTsKLQkJaW14X2RtYXYxX3dyaXRlbChkZXZfYWRkciwgRE1BX0RBUihjaGFubmVsKSk7Ci0JCWlteF9kbWF2MV93cml0ZWwoaW14ZG1hLT5jY3JfdG9fZGV2aWNlLAotCQkJCURNQV9DQ1IoY2hhbm5lbCkpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2luZ2xlIGJhZCBkbWFtb2RlXG4iLAotCQkgICAgICAgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlteF9kbWF2MV93cml0ZWwoZG1hX2xlbmd0aCwgRE1BX0NOVFIoY2hhbm5lbCkpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGlteF9kbWFfc2V0dXBfc2luZ2xlKTsKLQotLyoqCi0gKiBpbXhfZG1hX3NldHVwX3NnIC0gc2V0dXAgaS5NWCBETUEgY2hhbm5lbCBTRyBsaXN0IHRvL2Zyb20gZGV2aWNlIHRyYW5zZmVyCi0gKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKLSAqIEBzZzogcG9pbnRlciB0byB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC92ZWN0b3IKLSAqIEBzZ2NvdW50OiBzY2F0dGVyLWdhdGhlciBsaXN0IGh1bmdzIGNvdW50Ci0gKiBAZG1hX2xlbmd0aDogdG90YWwgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciByZXF1ZXN0IGluIGJ5dGVzCi0gKiBAZGV2X2FkZHI6IHBoeXNpY2FsIGRldmljZSBwb3J0IGFkZHJlc3MKLSAqIEBkbWFtb2RlOiBETUEgdHJhbnNmZXIgbW9kZSwgJURNQV9NT0RFX1JFQUQgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBtZW1vcnkKLSAqICAgICAgICAgICBvciAlRE1BX01PREVfV1JJVEUgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZQotICoKLSAqIFRoZSBmdW5jdGlvbiBzZXRzIHVwIERNQSBjaGFubmVsIHN0YXRlIGFuZCByZWdpc3RlcnMgdG8gYmUgcmVhZHkgZm9yCi0gKiB0cmFuc2ZlciBzcGVjaWZpZWQgYnkgcHJvdmlkZWQgcGFyYW1ldGVycy4gVGhlIHNjYXR0ZXItZ2F0aGVyIGVtdWxhdGlvbgotICogaXMgc2V0IHVwIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycy4KLSAqCi0gKiBUaGUgZnVsbCBwcmVwYXJhdGlvbiBvZiB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgc2V0dXAgb2YgbW9yZSByZWdpc3RlcgotICogYnkgdGhlIGNhbGxlciBiZWZvcmUgaW14X2RtYV9lbmFibGUoKSBjYW4gYmUgY2FsbGVkLgotICoKLSAqICVCTFIoY2hhbm5lbCkgaG9sZHMgdHJhbnNmZXIgYnVyc3QgbGVuZ3RoIGluIGJ5dGVzLCAwIG1lYW5zIDY0IGJ5dGVzCi0gKgotICogJVJTU1IoY2hhbm5lbCkgaGFzIHRvIGJlIHNldCB0byB0aGUgRE1BIHJlcXVlc3QgbGluZSBzb3VyY2UgJURNQV9SRVFfeHh4Ci0gKgotICogJUNDUihjaGFubmVsKSBoYXMgdG8gc3BlY2lmeSB0cmFuc2ZlciBwYXJhbWV0ZXJzLCB0aGUgbmV4dCBzZXR0aW5ncyBpcwotICogdHlwaWNhbCBmb3IgbGluZWFyIG9yIHNpbXBsZSBzY2F0dGVyLWdhdGhlciB0cmFuc2ZlcnMgaWYgJURNQV9NT0RFX1JFQUQgaXMKLSAqIHNwZWNpZmllZAotICoKLSAqICVDQ1JfRE1PRF9MSU5FQVIgfCAlQ0NSX0RTSVpfMzIgfCAlQ0NSX1NNT0RfRklGTyB8ICVDQ1JfU1NJWl94Ci0gKgotICogVGhlIHR5cGljYWwgc2V0dXAgZm9yICVETUFfTU9ERV9XUklURSBpcyBzcGVjaWZpZWQgYnkgbmV4dCBvcHRpb25zCi0gKiBjb21iaW5hdGlvbgotICoKLSAqICVDQ1JfU01PRF9MSU5FQVIgfCAlQ0NSX1NTSVpfMzIgfCAlQ0NSX0RNT0RfRklGTyB8ICVDQ1JfRFNJWl94Ci0gKgotICogQmUgY2FyZWZ1bCBoZXJlIGFuZCBkbyBub3QgbWlzdGFrZW5seSBtaXggc291cmNlIGFuZCB0YXJnZXQgZGV2aWNlCi0gKiBwb3J0IHNpemVzIGNvbnN0YW50cywgdGhleSBhcmUgcmVhbGx5IGRpZmZlcmVudDoKLSAqICVDQ1JfU1NJWl84LCAlQ0NSX1NTSVpfMTYsICVDQ1JfU1NJWl8zMiwKLSAqICVDQ1JfRFNJWl84LCAlQ0NSX0RTSVpfMTYsICVDQ1JfRFNJWl8zMgotICoKLSAqIFJldHVybiB2YWx1ZTogaWYgaW5jb3JyZWN0IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIC0lRUlOVkFMLgotICogWmVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KLSAqLwotaW50Ci1pbXhfZG1hX3NldHVwX3NnKGludCBjaGFubmVsLAotCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IHNnY291bnQsCi0JCSB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAotCQkgdW5zaWduZWQgaW50IGRtYW1vZGUpCi17Ci0Jc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07Ci0KLQlpZiAoaW14ZG1hLT5pbl91c2UpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpbXhkbWEtPnNnID0gc2c7Ci0JaW14ZG1hLT5kbWFfbW9kZSA9IGRtYW1vZGU7Ci0JaW14ZG1hLT5yZXNieXRlcyA9IGRtYV9sZW5ndGg7Ci0KLQlpZiAoIXNnIHx8ICFzZ2NvdW50KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2cgZXB0eSBzZyBsaXN0XG4iLAotCQkgICAgICAgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghc2ctPmxlbmd0aCkgewotCQlwcmludGsoS0VSTl9FUlIgImlteGRtYSVkOiBpbXhfZG1hX3NldHVwX3NnIHplcm8gbGVuZ3RoXG4iLAotCQkgICAgICAgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICgoZG1hbW9kZSAmIERNQV9NT0RFX01BU0spID09IERNQV9NT0RFX1JFQUQpIHsKLQkJcHJfZGVidWcoImlteGRtYSVkOiAlcyBzZz0lcCBzZ2NvdW50PSVkIHRvdGFsIGxlbmd0aD0lZCAiCi0JCQkiZGV2X2FkZHI9MHglMDh4IGZvciByZWFkXG4iLAotCQkJY2hhbm5lbCwgX19mdW5jX18sIHNnLCBzZ2NvdW50LCBkbWFfbGVuZ3RoLCBkZXZfYWRkcik7Ci0KLQkJaW14X2RtYXYxX3dyaXRlbChkZXZfYWRkciwgRE1BX1NBUihjaGFubmVsKSk7Ci0JCWlteF9kbWF2MV93cml0ZWwoaW14ZG1hLT5jY3JfZnJvbV9kZXZpY2UsIERNQV9DQ1IoY2hhbm5lbCkpOwotCX0gZWxzZSBpZiAoKGRtYW1vZGUgJiBETUFfTU9ERV9NQVNLKSA9PSBETUFfTU9ERV9XUklURSkgewotCQlwcl9kZWJ1ZygiaW14ZG1hJWQ6ICVzIHNnPSVwIHNnY291bnQ9JWQgdG90YWwgbGVuZ3RoPSVkICIKLQkJCSJkZXZfYWRkcj0weCUwOHggZm9yIHdyaXRlXG4iLAotCQkJY2hhbm5lbCwgX19mdW5jX18sIHNnLCBzZ2NvdW50LCBkbWFfbGVuZ3RoLCBkZXZfYWRkcik7Ci0KLQkJaW14X2RtYXYxX3dyaXRlbChkZXZfYWRkciwgRE1BX0RBUihjaGFubmVsKSk7Ci0JCWlteF9kbWF2MV93cml0ZWwoaW14ZG1hLT5jY3JfdG9fZGV2aWNlLCBETUFfQ0NSKGNoYW5uZWwpKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgImlteGRtYSVkOiBpbXhfZG1hX3NldHVwX3NnIGJhZCBkbWFtb2RlXG4iLAotCQkgICAgICAgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlteF9kbWFfc2dfbmV4dChjaGFubmVsLCBzZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaW14X2RtYV9zZXR1cF9zZyk7Ci0KLWludAotaW14X2RtYV9jb25maWdfY2hhbm5lbChpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IGNvbmZpZ19wb3J0LAotCXVuc2lnbmVkIGludCBjb25maWdfbWVtLCB1bnNpZ25lZCBpbnQgZG1hcmVxLCBpbnQgaHdfY2hhaW5pbmcpCi17Ci0Jc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07Ci0JdTMyIGRyZXEgPSAwOwotCi0JaW14ZG1hLT5od19jaGFpbmluZyA9IDA7Ci0KLQlpZiAoaHdfY2hhaW5pbmcpIHsKLQkJaW14ZG1hLT5od19jaGFpbmluZyA9IDE7Ci0JCWlmICghaW14X2RtYV9od19jaGFpbihpbXhkbWEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRtYXJlcSkKLQkJZHJlcSA9IENDUl9SRU47Ci0KLQlpbXhkbWEtPmNjcl9mcm9tX2RldmljZSA9IGNvbmZpZ19wb3J0IHwgKGNvbmZpZ19tZW0gPDwgMikgfCBkcmVxOwotCWlteGRtYS0+Y2NyX3RvX2RldmljZSA9IGNvbmZpZ19tZW0gfCAoY29uZmlnX3BvcnQgPDwgMikgfCBkcmVxOwotCi0JaW14X2RtYXYxX3dyaXRlbChkbWFyZXEsIERNQV9SU1NSKGNoYW5uZWwpKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX2NvbmZpZ19jaGFubmVsKTsKLQotdm9pZCBpbXhfZG1hX2NvbmZpZ19idXJzdGxlbihpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IGJ1cnN0bGVuKQotewotCWlteF9kbWF2MV93cml0ZWwoYnVyc3RsZW4sIERNQV9CTFIoY2hhbm5lbCkpOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX2NvbmZpZ19idXJzdGxlbik7Ci0KLS8qKgotICogaW14X2RtYV9zZXR1cF9oYW5kbGVycyAtIHNldHVwIGkuTVggRE1BIGNoYW5uZWwgZW5kIGFuZCBlcnJvciBub3RpZmljYXRpb24KLSAqIGhhbmRsZXJzCi0gKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKLSAqIEBpcnFfaGFuZGxlcjogdGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGNhbGxlZCBpZiB0aGUgdHJhbnNmZXIKLSAqCQllbmRzIHN1Y2Nlc3NmdWxseQotICogQGVycl9oYW5kbGVyOiB0aGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY2FsbGVkIGlmIHRoZSBwcmVtYXR1cmUKLSAqCQllbmQgY2F1c2VkIGJ5IGVycm9yIG9jY3VycwotICogQGRhdGE6IHVzZXIgc3BlY2lmaWVkIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlcnMKLSAqLwotaW50Ci1pbXhfZG1hX3NldHVwX2hhbmRsZXJzKGludCBjaGFubmVsLAotCQkgICAgICAgdm9pZCAoKmlycV9oYW5kbGVyKSAoaW50LCB2b2lkICopLAotCQkgICAgICAgdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIGludCksCi0JCSAgICAgICB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWlteGRtYS0+bmFtZSkgewotCQlwcmludGsoS0VSTl9DUklUICIlczogY2FsbGVkIGZvciAgbm90IGFsbG9jYXRlZCBjaGFubmVsICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaW14X2RtYXYxX3dyaXRlbCgxIDw8IGNoYW5uZWwsIERNQV9ESVNSKTsKLQlpbXhkbWEtPmlycV9oYW5kbGVyID0gaXJxX2hhbmRsZXI7Ci0JaW14ZG1hLT5lcnJfaGFuZGxlciA9IGVycl9oYW5kbGVyOwotCWlteGRtYS0+ZGF0YSA9IGRhdGE7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX3NldHVwX2hhbmRsZXJzKTsKLQotLyoqCi0gKiBpbXhfZG1hX3NldHVwX3Byb2dyZXNzaW9uX2hhbmRsZXIgLSBzZXR1cCBpLk1YIERNQSBjaGFubmVsIHByb2dyZXNzaW9uCi0gKiBoYW5kbGVycwotICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCi0gKiBAcHJvZ19oYW5kbGVyOiB0aGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gY2FsbGVkIGlmIHRoZSB0cmFuc2ZlciBwcm9ncmVzc2VzCi0gKi8KLWludAotaW14X2RtYV9zZXR1cF9wcm9ncmVzc2lvbl9oYW5kbGVyKGludCBjaGFubmVsLAotCQkJdm9pZCAoKnByb2dfaGFuZGxlcikgKGludCwgdm9pZCosIHN0cnVjdCBzY2F0dGVybGlzdCopKQotewotCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWlteGRtYS0+bmFtZSkgewotCQlwcmludGsoS0VSTl9DUklUICIlczogY2FsbGVkIGZvciAgbm90IGFsbG9jYXRlZCBjaGFubmVsICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaW14ZG1hLT5wcm9nX2hhbmRsZXIgPSBwcm9nX2hhbmRsZXI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX3NldHVwX3Byb2dyZXNzaW9uX2hhbmRsZXIpOwotCi0vKioKLSAqIGlteF9kbWFfZW5hYmxlIC0gZnVuY3Rpb24gdG8gc3RhcnQgaS5NWCBETUEgY2hhbm5lbCBvcGVyYXRpb24KLSAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgotICoKLSAqIFRoZSBjaGFubmVsIGhhcyB0byBiZSBhbGxvY2F0ZWQgYnkgZHJpdmVyIHRocm91Z2ggaW14X2RtYV9yZXF1ZXN0KCkKLSAqIG9yIGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvKCkgZnVuY3Rpb24uCi0gKiBUaGUgdHJhbnNmZXIgcGFyYW1ldGVycyBoYXMgdG8gYmUgc2V0IHRvIHRoZSBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoCi0gKiBjYWxsIG9mIHRoZSBpbXhfZG1hX3NldHVwX3NpbmdsZSgpIG9yIGlteF9kbWFfc2V0dXBfc2coKSBmdW5jdGlvbgotICogYW5kIHJlZ2lzdGVycyAlQkxSKGNoYW5uZWwpLCAlUlNTUihjaGFubmVsKSBhbmQgJUNDUihjaGFubmVsKSBoYXMgdG8KLSAqIGJlIHNldCBwcmlvciB0aGlzIGZ1bmN0aW9uIGNhbGwgYnkgdGhlIGNoYW5uZWwgdXNlci4KLSAqLwotdm9pZCBpbXhfZG1hX2VuYWJsZShpbnQgY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcHJfZGVidWcoImlteGRtYSVkOiBpbXhfZG1hX2VuYWJsZVxuIiwgY2hhbm5lbCk7Ci0KLQlpZiAoIWlteGRtYS0+bmFtZSkgewotCQlwcmludGsoS0VSTl9DUklUICIlczogY2FsbGVkIGZvciAgbm90IGFsbG9jYXRlZCBjaGFubmVsICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlteGRtYS0+aW5fdXNlKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpbXhfZG1hdjFfd3JpdGVsKDEgPDwgY2hhbm5lbCwgRE1BX0RJU1IpOwotCWlteF9kbWF2MV93cml0ZWwoaW14X2RtYXYxX3JlYWRsKERNQV9ESU1SKSAmIH4oMSA8PCBjaGFubmVsKSwgRE1BX0RJTVIpOwotCWlteF9kbWF2MV93cml0ZWwoaW14X2RtYXYxX3JlYWRsKERNQV9DQ1IoY2hhbm5lbCkpIHwgQ0NSX0NFTiB8Ci0JCUNDUl9BQ1JQVCwgRE1BX0NDUihjaGFubmVsKSk7Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKLQlpZiAoKGNwdV9pc19teDIxKCkgfHwgY3B1X2lzX214MjcoKSkgJiYKLQkJCWlteGRtYS0+c2cgJiYgaW14X2RtYV9od19jaGFpbihpbXhkbWEpKSB7Ci0JCWlteGRtYS0+c2cgPSBzZ19uZXh0KGlteGRtYS0+c2cpOwotCQlpZiAoaW14ZG1hLT5zZykgewotCQkJdTMyIHRtcDsKLQkJCWlteF9kbWFfc2dfbmV4dChjaGFubmVsLCBpbXhkbWEtPnNnKTsKLQkJCXRtcCA9IGlteF9kbWF2MV9yZWFkbChETUFfQ0NSKGNoYW5uZWwpKTsKLQkJCWlteF9kbWF2MV93cml0ZWwodG1wIHwgQ0NSX1JQVCB8IENDUl9BQ1JQVCwKLQkJCQlETUFfQ0NSKGNoYW5uZWwpKTsKLQkJfQotCX0KLSNlbmRpZgotCWlteGRtYS0+aW5fdXNlID0gMTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0woaW14X2RtYV9lbmFibGUpOwotCi0vKioKLSAqIGlteF9kbWFfZGlzYWJsZSAtIHN0b3AsIGZpbmlzaCBpLk1YIERNQSBjaGFubmVsIG9wZXJhdGluCi0gKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKLSAqLwotdm9pZCBpbXhfZG1hX2Rpc2FibGUoaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCJpbXhkbWElZDogaW14X2RtYV9kaXNhYmxlXG4iLCBjaGFubmVsKTsKLQotCWlmIChpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpCi0JCWRlbF90aW1lcigmaW14ZG1hLT53YXRjaGRvZyk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaW14X2RtYXYxX3dyaXRlbChpbXhfZG1hdjFfcmVhZGwoRE1BX0RJTVIpIHwgKDEgPDwgY2hhbm5lbCksIERNQV9ESU1SKTsKLQlpbXhfZG1hdjFfd3JpdGVsKGlteF9kbWF2MV9yZWFkbChETUFfQ0NSKGNoYW5uZWwpKSAmIH5DQ1JfQ0VOLAotCQkJRE1BX0NDUihjaGFubmVsKSk7Ci0JaW14X2RtYXYxX3dyaXRlbCgxIDw8IGNoYW5uZWwsIERNQV9ESVNSKTsKLQlpbXhkbWEtPmluX3VzZSA9IDA7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX2Rpc2FibGUpOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgyCi1zdGF0aWMgdm9pZCBpbXhfZG1hX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgY2hubykKLXsKLQlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaG5vXTsKLQotCWlteF9kbWF2MV93cml0ZWwoMCwgRE1BX0NDUihjaG5vKSk7Ci0JaW14ZG1hLT5pbl91c2UgPSAwOwotCWlteGRtYS0+c2cgPSBOVUxMOwotCi0JaWYgKGlteGRtYS0+ZXJyX2hhbmRsZXIpCi0JCWlteGRtYS0+ZXJyX2hhbmRsZXIoY2hubywgaW14ZG1hLT5kYXRhLCBJTVhfRE1BX0VSUl9USU1FT1VUKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZG1hX2Vycl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpbnQgaSwgZGlzcjsKLQlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWE7Ci0JdW5zaWduZWQgaW50IGVycl9tYXNrOwotCWludCBlcnJjb2RlOwotCi0JZGlzciA9IGlteF9kbWF2MV9yZWFkbChETUFfRElTUik7Ci0KLQllcnJfbWFzayA9IGlteF9kbWF2MV9yZWFkbChETUFfREJUT1NSKSB8Ci0JCSAgIGlteF9kbWF2MV9yZWFkbChETUFfRFJUT1NSKSB8Ci0JCSAgIGlteF9kbWF2MV9yZWFkbChETUFfRFNFU1IpICB8Ci0JCSAgIGlteF9kbWF2MV9yZWFkbChETUFfREJPU1IpOwotCi0JaWYgKCFlcnJfbWFzaykKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JaW14X2RtYXYxX3dyaXRlbChkaXNyICYgZXJyX21hc2ssIERNQV9ESVNSKTsKLQotCWZvciAoaSA9IDA7IGkgPCBJTVhfRE1BX0NIQU5ORUxTOyBpKyspIHsKLQkJaWYgKCEoZXJyX21hc2sgJiAoMSA8PCBpKSkpCi0JCQljb250aW51ZTsKLQkJaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbaV07Ci0JCWVycmNvZGUgPSAwOwotCi0JCWlmIChpbXhfZG1hdjFfcmVhZGwoRE1BX0RCVE9TUikgJiAoMSA8PCBpKSkgewotCQkJaW14X2RtYXYxX3dyaXRlbCgxIDw8IGksIERNQV9EQlRPU1IpOwotCQkJZXJyY29kZSB8PSBJTVhfRE1BX0VSUl9CVVJTVDsKLQkJfQotCQlpZiAoaW14X2RtYXYxX3JlYWRsKERNQV9EUlRPU1IpICYgKDEgPDwgaSkpIHsKLQkJCWlteF9kbWF2MV93cml0ZWwoMSA8PCBpLCBETUFfRFJUT1NSKTsKLQkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfUkVRVUVTVDsKLQkJfQotCQlpZiAoaW14X2RtYXYxX3JlYWRsKERNQV9EU0VTUikgJiAoMSA8PCBpKSkgewotCQkJaW14X2RtYXYxX3dyaXRlbCgxIDw8IGksIERNQV9EU0VTUik7Ci0JCQllcnJjb2RlIHw9IElNWF9ETUFfRVJSX1RSQU5TRkVSOwotCQl9Ci0JCWlmIChpbXhfZG1hdjFfcmVhZGwoRE1BX0RCT1NSKSAmICgxIDw8IGkpKSB7Ci0JCQlpbXhfZG1hdjFfd3JpdGVsKDEgPDwgaSwgRE1BX0RCT1NSKTsKLQkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfQlVGRkVSOwotCQl9Ci0JCWlmIChpbXhkbWEtPm5hbWUgJiYgaW14ZG1hLT5lcnJfaGFuZGxlcikgewotCQkJaW14ZG1hLT5lcnJfaGFuZGxlcihpLCBpbXhkbWEtPmRhdGEsIGVycmNvZGUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpbXhfZG1hX2NoYW5uZWxzW2ldLnNnID0gTlVMTDsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiRE1BIHRpbWVvdXQgb24gY2hhbm5lbCAlZCAoJXMpIC0lcyVzJXMlc1xuIiwKLQkJICAgICAgIGksIGlteGRtYS0+bmFtZSwKLQkJICAgICAgIGVycmNvZGUgJiBJTVhfRE1BX0VSUl9CVVJTVCA/ICAgICIgYnVyc3QiIDogIiIsCi0JCSAgICAgICBlcnJjb2RlICYgSU1YX0RNQV9FUlJfUkVRVUVTVCA/ICAiIHJlcXVlc3QiIDogIiIsCi0JCSAgICAgICBlcnJjb2RlICYgSU1YX0RNQV9FUlJfVFJBTlNGRVIgPyAiIHRyYW5zZmVyIiA6ICIiLAotCQkgICAgICAgZXJyY29kZSAmIElNWF9ETUFfRVJSX0JVRkZFUiA/ICAgIiBidWZmZXIiIDogIiIpOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pcnFfaGFuZGxlX2NoYW5uZWwoaW50IGNobm8pCi17Ci0Jc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hub107Ci0KLQlpZiAoIWlteGRtYS0+bmFtZSkgewotCQkvKgotCQkgKiBJUlEgZm9yIGFuIHVucmVnaXN0ZXJlZCBETUEgY2hhbm5lbDoKLQkJICogbGV0J3MgY2xlYXIgdGhlIGludGVycnVwdHMgYW5kIGRpc2FibGUgaXQuCi0JCSAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAic3B1cmlvdXMgSVJRIGZvciBETUEgY2hhbm5lbCAlZFxuIiwgY2hubyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaW14ZG1hLT5zZykgewotCQl1MzIgdG1wOwotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmN1cnJlbnRfc2cgPSBpbXhkbWEtPnNnOwotCQlpbXhkbWEtPnNnID0gc2dfbmV4dChpbXhkbWEtPnNnKTsKLQotCQlpZiAoaW14ZG1hLT5zZykgewotCQkJaW14X2RtYV9zZ19uZXh0KGNobm8sIGlteGRtYS0+c2cpOwotCi0JCQl0bXAgPSBpbXhfZG1hdjFfcmVhZGwoRE1BX0NDUihjaG5vKSk7Ci0KLQkJCWlmIChpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpIHsKLQkJCQkvKiBGSVhNRTogVGhlIHRpbWVvdXQgc2hvdWxkIHByb2JhYmx5IGJlCi0JCQkJICogY29uZmlndXJhYmxlCi0JCQkJICovCi0JCQkJbW9kX3RpbWVyKCZpbXhkbWEtPndhdGNoZG9nLAotCQkJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApKTsKLQotCQkJCXRtcCB8PSBDQ1JfQ0VOIHwgQ0NSX1JQVCB8IENDUl9BQ1JQVDsKLQkJCQlpbXhfZG1hdjFfd3JpdGVsKHRtcCwgRE1BX0NDUihjaG5vKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlteF9kbWF2MV93cml0ZWwodG1wICYgfkNDUl9DRU4sIERNQV9DQ1IoY2hubykpOwotCQkJCXRtcCB8PSBDQ1JfQ0VOOwotCQkJfQotCi0JCQlpbXhfZG1hdjFfd3JpdGVsKHRtcCwgRE1BX0NDUihjaG5vKSk7Ci0KLQkJCWlmIChpbXhkbWEtPnByb2dfaGFuZGxlcikKLQkJCQlpbXhkbWEtPnByb2dfaGFuZGxlcihjaG5vLCBpbXhkbWEtPmRhdGEsCi0JCQkJCQljdXJyZW50X3NnKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGlteF9kbWFfaHdfY2hhaW4oaW14ZG1hKSkgewotCQkJZGVsX3RpbWVyKCZpbXhkbWEtPndhdGNoZG9nKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWlteF9kbWF2MV93cml0ZWwoMCwgRE1BX0NDUihjaG5vKSk7Ci0JaW14ZG1hLT5pbl91c2UgPSAwOwotCWlmIChpbXhkbWEtPmlycV9oYW5kbGVyKQotCQlpbXhkbWEtPmlycV9oYW5kbGVyKGNobm8sIGlteGRtYS0+ZGF0YSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWludCBpLCBkaXNyOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgyCi0JaWYgKGNwdV9pc19teDIxKCkgfHwgY3B1X2lzX214MjcoKSkKLQkJZG1hX2Vycl9oYW5kbGVyKGlycSwgZGV2X2lkKTsKLSNlbmRpZgotCi0JZGlzciA9IGlteF9kbWF2MV9yZWFkbChETUFfRElTUik7Ci0KLQlwcl9kZWJ1ZygiaW14ZG1hOiBkbWFfaXJxX2hhbmRsZXIgY2FsbGVkLCBkaXNyPTB4JTA4eFxuIiwKLQkJICAgICBkaXNyKTsKLQotCWlteF9kbWF2MV93cml0ZWwoZGlzciwgRE1BX0RJU1IpOwotCWZvciAoaSA9IDA7IGkgPCBJTVhfRE1BX0NIQU5ORUxTOyBpKyspIHsKLQkJaWYgKGRpc3IgJiAoMSA8PCBpKSkKLQkJCWRtYV9pcnFfaGFuZGxlX2NoYW5uZWwoaSk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGlteF9kbWFfcmVxdWVzdCAtIHJlcXVlc3QvYWxsb2NhdGUgc3BlY2lmaWVkIGNoYW5uZWwgbnVtYmVyCi0gKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKLSAqIEBuYW1lOiB0aGUgZHJpdmVyL2NhbGxlciBvd24gbm9uLSVOVUxMIGlkZW50aWZpY2F0aW9uCi0gKi8KLWludCBpbXhfZG1hX3JlcXVlc3QoaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIGJhc2ljIHNhbml0eSBjaGVja3MgKi8KLQlpZiAoIW5hbWUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNoYW5uZWwgPj0gSU1YX0RNQV9DSEFOTkVMUykgewotCQlwcmludGsoS0VSTl9DUklUICIlczogY2FsbGVkIGZvciAgbm9uLWV4aXN0ZWQgY2hhbm5lbCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChpbXhkbWEtPm5hbWUpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQltZW1zZXQoaW14ZG1hLCAwLCBzaXplb2YoaW14ZG1hKSk7Ci0JaW14ZG1hLT5uYW1lID0gbmFtZTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IC8qIHJlcXVlc3RfaXJxKCkgY2FuIGJsb2NrICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKLQlpZiAoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKE1YMnhfSU5UX0RNQUNIMCArIGNoYW5uZWwsCi0JCQkJZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwgTlVMTCk7Ci0JCWlmIChyZXQpIHsKLQkJCWlteGRtYS0+bmFtZSA9IE5VTEw7Ci0JCQlwcl9jcml0KCJDYW4ndCByZWdpc3RlciBJUlEgJWQgZm9yIERNQSBjaGFubmVsICVkXG4iLAotCQkJCQlNWDJ4X0lOVF9ETUFDSDAgKyBjaGFubmVsLCBjaGFubmVsKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJaW5pdF90aW1lcigmaW14ZG1hLT53YXRjaGRvZyk7Ci0JCWlteGRtYS0+d2F0Y2hkb2cuZnVuY3Rpb24gPSAmaW14X2RtYV93YXRjaGRvZzsKLQkJaW14ZG1hLT53YXRjaGRvZy5kYXRhID0gY2hhbm5lbDsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGlteF9kbWFfcmVxdWVzdCk7Ci0KLS8qKgotICogaW14X2RtYV9mcmVlIC0gcmVsZWFzZSBwcmV2aW91c2x5IGFjcXVpcmVkIGNoYW5uZWwKLSAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgotICovCi12b2lkIGlteF9kbWFfZnJlZShpbnQgY2hhbm5lbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwotCi0JaWYgKCFpbXhkbWEtPm5hbWUpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVAotCQkgICAgICAgIiVzOiB0cnlpbmcgdG8gZnJlZSBmcmVlIGNoYW5uZWwgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JaW14X2RtYV9kaXNhYmxlKGNoYW5uZWwpOwotCWlteGRtYS0+bmFtZSA9IE5VTEw7Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKLQlpZiAoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKQotCQlmcmVlX2lycShNWDJ4X0lOVF9ETUFDSDAgKyBjaGFubmVsLCBOVUxMKTsKLSNlbmRpZgotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX2ZyZWUpOwotCi0vKioKLSAqIGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvIC0gZmluZCBhbmQgcmVxdWVzdCBzb21lIG9mIGZyZWUgY2hhbm5lbHMgYmVzdAotICogc3VpdGluZyByZXF1ZXN0ZWQgcHJpb3JpdHkKLSAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgotICogQG5hbWU6IHRoZSBkcml2ZXIvY2FsbGVyIG93biBub24tJU5VTEwgaWRlbnRpZmljYXRpb24KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBmcmVlIGNoYW5uZWwgaW4gdGhlIHNwZWNpZmllZCBwcmlvcml0eSBncm91cAotICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBmaW5kIGEgZnJlZSBjaGFubmVsIGluIHRoZSBzcGVjaWZpZWQgcHJpb3JpdHkgZ3JvdXAKLSAqIGlmIHRoZSBwcmlvcml0eSBjYW5ub3QgYmUgYWNoaWV2ZWQgaXQgdHJpZXMgdG8gbG9vayBmb3IgZnJlZSBjaGFubmVsCi0gKiBpbiB0aGUgaGlnaGVyIGFuZCB0aGVuIGV2ZW4gbG93ZXIgcHJpb3JpdHkgZ3JvdXBzLgotICoKLSAqIFJldHVybiB2YWx1ZTogSWYgdGhlcmUgaXMgbm8gZnJlZSBjaGFubmVsIHRvIGFsbG9jYXRlLCAtJUVOT0RFViBpcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgICAgT24gc3VjY2Vzc2Z1bCBhbGxvY2F0aW9uIGNoYW5uZWwgaXMgcmV0dXJuZWQuCi0gKi8KLWludCBpbXhfZG1hX3JlcXVlc3RfYnlfcHJpbyhjb25zdCBjaGFyICpuYW1lLCBlbnVtIGlteF9kbWFfcHJpbyBwcmlvKQotewotCWludCBpOwotCWludCBiZXN0OwotCi0Jc3dpdGNoIChwcmlvKSB7Ci0JY2FzZSAoRE1BX1BSSU9fSElHSCk6Ci0JCWJlc3QgPSA4OwotCQlicmVhazsKLQljYXNlIChETUFfUFJJT19NRURJVU0pOgotCQliZXN0ID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSAoRE1BX1BSSU9fTE9XKToKLQlkZWZhdWx0OgotCQliZXN0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JZm9yIChpID0gYmVzdDsgaSA8IElNWF9ETUFfQ0hBTk5FTFM7IGkrKykKLQkJaWYgKCFpbXhfZG1hX3JlcXVlc3QoaSwgbmFtZSkpCi0JCQlyZXR1cm4gaTsKLQotCWZvciAoaSA9IGJlc3QgLSAxOyBpID49IDA7IGktLSkKLQkJaWYgKCFpbXhfZG1hX3JlcXVlc3QoaSwgbmFtZSkpCi0JCQlyZXR1cm4gaTsKLQotCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGZyZWUgRE1BIGNoYW5uZWwgZm91bmRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAtRU5PREVWOwotfQotRVhQT1JUX1NZTUJPTChpbXhfZG1hX3JlcXVlc3RfYnlfcHJpbyk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlteF9kbWFfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgxCi0JaWYgKGNwdV9pc19teDEoKSkKLQkJaW14X2RtYXYxX2Jhc2VhZGRyID0gTVgxX0lPX0FERFJFU1MoTVgxX0RNQV9CQVNFX0FERFIpOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIENPTkZJR19NQUNIX01YMjEKLQlpZiAoY3B1X2lzX214MjEoKSkKLQkJaW14X2RtYXYxX2Jhc2VhZGRyID0gTVgyMV9JT19BRERSRVNTKE1YMjFfRE1BX0JBU0VfQUREUik7Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotCWlmIChjcHVfaXNfbXgyNygpKQotCQlpbXhfZG1hdjFfYmFzZWFkZHIgPSBNWDI3X0lPX0FERFJFU1MoTVgyN19ETUFfQkFTRV9BRERSKTsKLQllbHNlCi0jZW5kaWYKLQkJQlVHKCk7Ci0KLQlkbWFfY2xrID0gY2xrX2dldChOVUxMLCAiZG1hIik7Ci0JY2xrX2VuYWJsZShkbWFfY2xrKTsKLQotCS8qIHJlc2V0IERNQSBtb2R1bGUgKi8KLQlpbXhfZG1hdjFfd3JpdGVsKERDUl9EUlNULCBETUFfRENSKTsKLQotI2lmZGVmIENPTkZJR19BUkNIX01YMQotCWlmIChjcHVfaXNfbXgxKCkpIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoTVgxX0RNQV9JTlQsIGRtYV9pcnFfaGFuZGxlciwgMCwgIkRNQSIsIE5VTEwpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9jcml0KCJXb3chICBDYW4ndCByZWdpc3RlciBJUlEgZm9yIERNQVxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gcmVxdWVzdF9pcnEoTVgxX0RNQV9FUlIsIGRtYV9lcnJfaGFuZGxlciwgMCwgIkRNQSIsIE5VTEwpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9jcml0KCJXb3chICBDYW4ndCByZWdpc3RlciBFUlJJUlEgZm9yIERNQVxuIik7Ci0JCQlmcmVlX2lycShNWDFfRE1BX0lOVCwgTlVMTCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotI2VuZGlmCi0JLyogZW5hYmxlIERNQSBtb2R1bGUgKi8KLQlpbXhfZG1hdjFfd3JpdGVsKERDUl9ERU4sIERNQV9EQ1IpOwotCi0JLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KLQlpbXhfZG1hdjFfd3JpdGVsKCgxIDw8IElNWF9ETUFfQ0hBTk5FTFMpIC0gMSwgRE1BX0RJU1IpOwotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JaW14X2RtYXYxX3dyaXRlbCgoMSA8PCBJTVhfRE1BX0NIQU5ORUxTKSAtIDEsIERNQV9ESU1SKTsKLQotCWZvciAoaSA9IDA7IGkgPCBJTVhfRE1BX0NIQU5ORUxTOyBpKyspIHsKLQkJaW14X2RtYV9jaGFubmVsc1tpXS5zZyA9IE5VTEw7Ci0JCWlteF9kbWFfY2hhbm5lbHNbaV0uZG1hX251bSA9IGk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotYXJjaF9pbml0Y2FsbChpbXhfZG1hX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZWhjaS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZWhjaS5jCmluZGV4IDJhODY0NjE3Li4zNWEwNjRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9laGNpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZWhjaS5jCkBAIC0xMSwxMCArMTEsNiBAQAogICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKICAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTczLDcgKzY5LDUxIEBACiBpbnQgbXhjX2luaXRpYWxpemVfdXNiX2h3KGludCBwb3J0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJdW5zaWduZWQgaW50IHY7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfTVgzCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDI1KQorCWlmIChjcHVfaXNfbXgyNSgpKSB7CisJCXYgPSByZWFkbChNWDI1X0lPX0FERFJFU1MoTVgyNV9PVEdfQkFTRV9BRERSICsKKwkJCQkgICAgIFVTQkNUUkxfT1RHQkFTRV9PRkZTRVQpKTsKKworCQlzd2l0Y2ggKHBvcnQpIHsKKwkJY2FzZSAwOgkvKiBPVEcgcG9ydCAqLworCQkJdiAmPSB+KE1YMzVfT1RHX1NJQ19NQVNLIHwgTVgzNV9PVEdfUE1fQklUKTsKKwkJCXYgfD0gKGZsYWdzICYgTVhDX0VIQ0lfSU5URVJGQUNFX01BU0spCisJCQkJCTw8IE1YMzVfT1RHX1NJQ19TSElGVDsKKwkJCWlmICghKGZsYWdzICYgTVhDX0VIQ0lfUE9XRVJfUElOU19FTkFCTEVEKSkKKwkJCQl2IHw9IE1YMzVfT1RHX1BNX0JJVDsKKworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogSDEgcG9ydCAqLworCQkJdiAmPSB+KE1YMzVfSDFfU0lDX01BU0sgfCBNWDM1X0gxX1BNX0JJVCB8IE1YMzVfSDFfVExMX0JJVCB8CisJCQkJTVgzNV9IMV9VU0JURV9CSVQgfCBNWDM1X0gxX0lQUFVFX0RPV05fQklUIHwgTVgzNV9IMV9JUFBVRV9VUF9CSVQpOworCQkJdiB8PSAoZmxhZ3MgJiBNWENfRUhDSV9JTlRFUkZBQ0VfTUFTSykKKwkJCQkJCTw8IE1YMzVfSDFfU0lDX1NISUZUOworCQkJaWYgKCEoZmxhZ3MgJiBNWENfRUhDSV9QT1dFUl9QSU5TX0VOQUJMRUQpKQorCQkJCXYgfD0gTVgzNV9IMV9QTV9CSVQ7CisKKwkJCWlmICghKGZsYWdzICYgTVhDX0VIQ0lfVFRMX0VOQUJMRUQpKQorCQkJCXYgfD0gTVgzNV9IMV9UTExfQklUOworCisJCQlpZiAoZmxhZ3MgJiBNWENfRUhDSV9JTlRFUk5BTF9QSFkpCisJCQkJdiB8PSBNWDM1X0gxX1VTQlRFX0JJVDsKKworCQkJaWYgKGZsYWdzICYgTVhDX0VIQ0lfSVBQVUVfRE9XTikKKwkJCQl2IHw9IE1YMzVfSDFfSVBQVUVfRE9XTl9CSVQ7CisKKwkJCWlmIChmbGFncyAmIE1YQ19FSENJX0lQUFVFX1VQKQorCQkJCXYgfD0gTVgzNV9IMV9JUFBVRV9VUF9CSVQ7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl3cml0ZWwodiwgTVgyNV9JT19BRERSRVNTKE1YMjVfT1RHX0JBU0VfQUREUiArCisJCQkJICAgICBVU0JDVFJMX09UR0JBU0VfT0ZGU0VUKSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9NWDI1ICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDMpCiAJaWYgKGNwdV9pc19teDMxKCkpIHsKIAkJdiA9IHJlYWRsKE1YMzFfSU9fQUREUkVTUyhNWDMxX09UR19CQVNFX0FERFIgKwogCQkJCSAgICAgVVNCQ1RSTF9PVEdCQVNFX09GRlNFVCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZ3Bpby5jCmluZGV4IDcxNDM3YzYuLjU3ZWM0YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9ncGlvLmMKQEAgLTIxNCwxMyArMjE0LDE2IEBACiAJc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPQogCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG14Y19ncGlvX3BvcnQsIGNoaXApOwogCXUzMiBsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCWwgPSBfX3Jhd19yZWFkbChwb3J0LT5iYXNlICsgR1BJT19HRElSKTsKIAlpZiAoZGlyKQogCQlsIHw9IDEgPDwgb2Zmc2V0OwogCWVsc2UKIAkJbCAmPSB+KDEgPDwgb2Zmc2V0KTsKIAlfX3Jhd193cml0ZWwobCwgcG9ydC0+YmFzZSArIEdQSU9fR0RJUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBteGNfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCkBAIC0yMjksOSArMjMyLDEyIEBACiAJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCwgY2hpcCk7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBwb3J0LT5iYXNlICsgR1BJT19EUjsKIAl1MzIgbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlsID0gKF9fcmF3X3JlYWRsKHJlZykgJiAofigxIDw8IG9mZnNldCkpKSB8ICh2YWx1ZSA8PCBvZmZzZXQpOwogCV9fcmF3X3dyaXRlbChsLCByZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBteGNfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQpAQCAtMjg1LDYgKzI5MSw4IEBACiAJCXBvcnRbaV0uY2hpcC5iYXNlID0gaSAqIDMyOwogCQlwb3J0W2ldLmNoaXAubmdwaW8gPSAzMjsKIAorCQlzcGluX2xvY2tfaW5pdCgmcG9ydFtpXS5sb2NrKTsKKwogCQkvKiBpdHMgYSBzZXJpb3VzIGNvbmZpZ3VyYXRpb24gYnVnIHdoZW4gaXQgZmFpbHMgKi8KIAkJQlVHX09OKCBncGlvY2hpcF9hZGQoJnBvcnRbaV0uY2hpcCkgPCAwICk7CiAKQEAgLTI5Miw2ICszMDAsMTIgQEAKIAkJCS8qIHNldHVwIG9uZSBoYW5kbGVyIGZvciBlYWNoIGVudHJ5ICovCiAJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihwb3J0W2ldLmlycSwgbXgzX2dwaW9faXJxX2hhbmRsZXIpOwogCQkJc2V0X2lycV9kYXRhKHBvcnRbaV0uaXJxLCAmcG9ydFtpXSk7CisJCQlpZiAocG9ydFtpXS5pcnFfaGlnaCkgeworCQkJCS8qIHNldHVwIGhhbmRsZXIgZm9yIEdQSU8gMTYgdG8gMzEgKi8KKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihwb3J0W2ldLmlycV9oaWdoLAorCQkJCQkJbXgzX2dwaW9faXJxX2hhbmRsZXIpOworCQkJCXNldF9pcnFfZGF0YShwb3J0W2ldLmlycV9oaWdoLCAmcG9ydFtpXSk7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC8zZHNfZGVidWdib2FyZC5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoLzNkc19kZWJ1Z2JvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4NGZkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC8zZHNfZGVidWdib2FyZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01YQ18zRFNfREJfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDXzNEU19EQl9IX18KKworZXh0ZXJuIGludCBfX2luaXQgbXhjX2V4cGlvX2luaXQodTMyIGJhc2UsIHUzMiBwX2lycSk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ18zRFNfREJfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtYXJtYWRpbGxvNXgwLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtYXJtYWRpbGxvNXgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzZjMTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLWFybWFkaWxsbzV4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA5IEFsYmVydG8gUGFuaXp6byA8bWFyYW1hb3BlcmNoZXNlaW1vcnRvQGdtYWlsLmNvbT4uCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NWENfQk9BUkRfQVJNQURJTExPNVgwX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9BUk1BRElMTE81WDBfSF9fCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLWV1a3JlYV9jcHVpbXgyNy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLWV1a3JlYV9jcHVpbXgyNy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZkNTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1ldWtyZWFfY3B1aW14MjcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgRXJpYyBCZW5hcmQgLSBlcmljQGV1a3JlYS5jb20KLSAqCi0gKiBCYXNlZCBvbiBib2FyZC1wY20wMzguaCB3aGljaCBpcyA6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0IChrZXJuZWxAcGVuZ3V0cm9uaXguZGUpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19CT0FSRF9FVUtSRUFfQ1BVSU1YMjdfSF9fCi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX0VVS1JFQV9DUFVJTVgyN19IX18KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLS8qCi0gKiBUaGlzIENQVSBtb2R1bGUgbmVlZHMgYSBiYXNlYm9hcmQgdG8gd29yay4gQWZ0ZXIgYmFzaWMgaW5pdGlhbGl6aW5nCi0gKiBpdHMgb3duIGRldmljZXMsIGl0IGNhbGxzIGJhc2Vib2FyZCdzIGluaXQgZnVuY3Rpb24uCi0gKiBUT0RPOiBBZGQgeW91ciBvd24gYmFzZWJvYXJkIGluaXQgZnVuY3Rpb24gYW5kIGNhbGwgaXQgZnJvbQotICogaW5zaWRlIGV1a3JlYV9jcHVpbXgyN19pbml0KCkuCi0gKgotICogVGhpcyBleGFtcGxlIGhlcmUgaXMgZm9yIHRoZSBkZXZlbG9wbWVudCBib2FyZC4gUmVmZXIKLSAqIGV1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jCi0gKi8KLQotZXh0ZXJuIHZvaWQgZXVrcmVhX21iaW14MjdfYmFzZWJvYXJkX2luaXQodm9pZCk7Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfRVVLUkVBX0NQVUlNWDI3X0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLWt6bWFybTExLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQta3ptYXJtMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjYzY2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQta3ptYXJtMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGxpbnV4LW1pcHMub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0jaWZuZGVmIF9fQVJNX0FSQ0hfQk9BUkRfS1pNX0FSTTExX0gKLSNkZWZpbmUgX19BUk1fQVJDSF9CT0FSRF9LWk1fQVJNMTFfSAotCi0vKgotICogIEtaTS1BUk0xMS0wMSBCb2FyZCBDb250cm9sIFJlZ2lzdGVycyBvbiBGUEdBCi0gKi8KLSNkZWZpbmUgS1pNX0FSTTExX0NUTDEJCShNWDMxX0NTNF9CQVNFX0FERFIgKyAweDEwMDApCi0jZGVmaW5lIEtaTV9BUk0xMV9DVEwyCQkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDAxKQotI2RlZmluZSBLWk1fQVJNMTFfUlNXMQkJKE1YMzFfQ1M0X0JBU0VfQUREUiArIDB4MTAwMikKLSNkZWZpbmUgS1pNX0FSTTExX0JBQ0tfTElHSFQJKE1YMzFfQ1M0X0JBU0VfQUREUiArIDB4MTAwNCkKLSNkZWZpbmUgS1pNX0FSTTExX0ZQR0FfUkVWCShNWDMxX0NTNF9CQVNFX0FERFIgKyAweDEwMDgpCi0jZGVmaW5lIEtaTV9BUk0xMV83U0VHX0xFRAkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDEwKQotI2RlZmluZSBLWk1fQVJNMTFfTEVEUwkJKE1YMzFfQ1M0X0JBU0VfQUREUiArIDB4MTAyMCkKLSNkZWZpbmUgS1pNX0FSTTExX0RJUFNXMgkoTVgzMV9DUzRfQkFTRV9BRERSICsgMHgxMDAzKQotCi0vKgotICogRXh0ZXJuYWwgVUFSVCBmb3IgdG91Y2ggcGFuZWwgb24gRlBHQQotICovCi0jZGVmaW5lIEtaTV9BUk0xMV8xNjU1MAkJKE1YMzFfQ1M0X0JBU0VfQUREUiArIDB4MTA1MCkKLQotI2VuZGlmIC8qIF9fQVJNX0FSQ0hfQk9BUkRfS1pNX0FSTTExX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjFhZHMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDIxYWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjRmYTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjFhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotICoKLSAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAotICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDIxQURTX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDIxQURTX0hfXwotCi0vKgotICogTWVtb3J5LW1hcHBlZCBJL08gb24gTVgyMUFEUyBiYXNlIGJvYXJkCi0gKi8KLSNkZWZpbmUgTVgyMUFEU19NTUlPX0JBU0VfQUREUiAgIDB4RjUwMDAwMDAKLSNkZWZpbmUgTVgyMUFEU19NTUlPX1NJWkUgICAgICAgIFNaXzE2TQotCi0jZGVmaW5lIE1YMjFBRFNfUkVHX0FERFIob2Zmc2V0KSAgICAodm9pZCBfX2ZvcmNlIF9faW9tZW0gKikgXAotCQkoTVgyMUFEU19NTUlPX0JBU0VfQUREUiArIChvZmZzZXQpKQotCi0jZGVmaW5lIE1YMjFBRFNfQ1M4OTAwQV9JUlEgICAgICAgICBJUlFfR1BJT0UoMTEpCi0jZGVmaW5lIE1YMjFBRFNfQ1M4OTAwQV9JT0JBU0VfUkVHICBNWDIxQURTX1JFR19BRERSKDB4MDAwMDAwKQotI2RlZmluZSBNWDIxQURTX1NUMTZDMjU1X0lPQkFTRV9SRUcgTVgyMUFEU19SRUdfQUREUigweDIwMDAwMCkKLSNkZWZpbmUgTVgyMUFEU19WRVJTSU9OX1JFRyAgICAgICAgIE1YMjFBRFNfUkVHX0FERFIoMHg0MDAwMDApCi0jZGVmaW5lIE1YMjFBRFNfSU9fUkVHICAgICAgICAgICAgICBNWDIxQURTX1JFR19BRERSKDB4ODAwMDAwKQotCi0vKiBNWDIxQURTX0lPX1JFRyBiaXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgTVgyMUFEU19JT19TRF9XUCAgICAgICAgMHgwMDAxIC8qIHJlYWQgKi8KLSNkZWZpbmUgTVgyMUFEU19JT19UUDYgICAgICAgICAgMHgwMDAxIC8qIHdyaXRlICovCi0jZGVmaW5lIE1YMjFBRFNfSU9fU1dfU0VMICAgICAgIDB4MDAwMiAvKiByZWFkICovCi0jZGVmaW5lIE1YMjFBRFNfSU9fVFA3ICAgICAgICAgIDB4MDAwMiAvKiB3cml0ZSAqLwotI2RlZmluZSBNWDIxQURTX0lPX1JFU0VUX0VfVUFSVCAweDAwMDQKLSNkZWZpbmUgTVgyMUFEU19JT19SRVNFVF9CQVNFICAgMHgwMDA4Ci0jZGVmaW5lIE1YMjFBRFNfSU9fQ1NJX0NUTDIgICAgIDB4MDAxMAotI2RlZmluZSBNWDIxQURTX0lPX0NTSV9DVEwxICAgICAweDAwMjAKLSNkZWZpbmUgTVgyMUFEU19JT19DU0lfQ1RMMCAgICAgMHgwMDQwCi0jZGVmaW5lIE1YMjFBRFNfSU9fVUFSVDFfRU4gICAgIDB4MDA4MAotI2RlZmluZSBNWDIxQURTX0lPX1VBUlQ0X0VOICAgICAweDAxMDAKLSNkZWZpbmUgTVgyMUFEU19JT19MQ0RPTiAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE1YMjFBRFNfSU9fSVJEQV9FTiAgICAgIDB4MDQwMAotI2RlZmluZSBNWDIxQURTX0lPX0lSREFfRklSX1NFTCAweDA4MDAKLSNkZWZpbmUgTVgyMUFEU19JT19JUkRBX01EMF9CICAgMHgxMDAwCi0jZGVmaW5lIE1YMjFBRFNfSU9fSVJEQV9NRDEgICAgIDB4MjAwMAotI2RlZmluZSBNWDIxQURTX0lPX0xFRDRfT04gICAgICAweDQwMDAKLSNkZWZpbmUgTVgyMUFEU19JT19MRUQzX09OICAgICAgMHg4MDAwCi0KLSNlbmRpZgkJCQkvKiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDIxQURTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjdhZHMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDI3YWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzZkMjMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjdhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDUtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0KLS8qCi0gKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLSAqCi0gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NWENfQk9BUkRfTVgyN0FEU19IX18KLSNkZWZpbmUgX19BU01fQVJDSF9NWENfQk9BUkRfTVgyN0FEU19IX18KLQotLyogZXh0ZXJuYWwgaW50ZXJydXB0IG11bHRpcGxleGVyICovCi0jZGVmaW5lIE1YQ19FWFBfSU9fQkFTRQkJKE1YQ19CT0FSRF9JUlFfU1RBUlQpCi0KLSNkZWZpbmUgTVhDX1ZJUlRVQUxfSU5UU19CQVNFCShNWENfRVhQX0lPX0JBU0UgKyBNWENfTUFYX0VYUF9JT19MSU5FUykKLSNkZWZpbmUgTVhDX1NESU8xX0NBUkRfSVJRCU1YQ19WSVJUVUFMX0lOVFNfQkFTRQotI2RlZmluZSBNWENfU0RJTzJfQ0FSRF9JUlEJKE1YQ19WSVJUVUFMX0lOVFNfQkFTRSArIDEpCi0jZGVmaW5lIE1YQ19TRElPM19DQVJEX0lSUQkoTVhDX1ZJUlRVQUxfSU5UU19CQVNFICsgMikKLQotI2RlZmluZSBNWENfTUFYX0JPQVJEX0lOVFMgICAgICAoTVhDX01BWF9FWFBfSU9fTElORVMgKyBcCi0JCQkJTVhDX01BWF9WSVJUVUFMX0lOVFMpCi0KLS8qCi0gKiBAbmFtZSBNZW1vcnkgU2l6ZSBwYXJhbWV0ZXJzCi0gKi8KLQotLyoKLSAqIFNpemUgb2YgU0RSQU0gbWVtb3J5Ci0gKi8KLSNkZWZpbmUgU0RSQU1fTUVNX1NJWkUgICAgICAgICAgU1pfMTI4TQotCi0vKgotICogUEJDIENvbnRyb2xsZXIgcGFyYW1ldGVycwotICovCi0KLS8qCi0gKiBCYXNlIGFkZHJlc3Mgb2YgUEJDIGNvbnRyb2xsZXIsIENTNAotICovCi0jZGVmaW5lIFBCQ19CQVNFX0FERFJFU1MgICAgICAgIDB4ZjQzMDAwMDAKLSNkZWZpbmUgUEJDX1JFR19BRERSKG9mZnNldCkgICAgKHZvaWQgX19mb3JjZSBfX2lvbWVtICopIFwKLQkJKFBCQ19CQVNFX0FERFJFU1MgKyAob2Zmc2V0KSkKLQotLyoKLSAqIFBCQyBJbnRlcnVwdCBuYW1lIGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgUEJDX0dQSU8xXzAgIDAKLSNkZWZpbmUgUEJDX0dQSU8xXzEgIDEKLSNkZWZpbmUgUEJDX0dQSU8xXzIgIDIKLSNkZWZpbmUgUEJDX0dQSU8xXzMgIDMKLSNkZWZpbmUgUEJDX0dQSU8xXzQgIDQKLSNkZWZpbmUgUEJDX0dQSU8xXzUgIDUKLQotI2RlZmluZSBQQkNfSU5UUl9NQVhfTlVNIDYKLSNkZWZpbmUgUEJDX0lOVFJfU0hBUkVEX01BWF9OVU0gOAotCi0vKiBXaGVuIHRoZSBQQkMgYWRkcmVzcyBjb25uZWN0aW9uIGlzIGZpeGVkIGluIGgvdywgZGVmaW5lZCBhcyAxICovCi0jZGVmaW5lIFBCQ19BRERSX1NIICAgICAgICAgICAgIDAKLQotLyogT2Zmc2V0cyBmb3IgdGhlIFBCQyBDb250cm9sbGVyIHJlZ2lzdGVyICovCi0vKgotICogUEJDIEJvYXJkIHZlcnNpb24gcmVnaXN0ZXIgb2Zmc2V0Ci0gKi8KLSNkZWZpbmUgUEJDX1ZFUlNJT05fUkVHICAgICAgICAgUEJDX1JFR19BRERSKDB4MDAwMDAgPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEJvYXJkIGNvbnRyb2wgcmVnaXN0ZXIgMSBzZXQgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBQQkNfQkNUUkwxX1NFVF9SRUcgICAgICBQQkNfUkVHX0FERFIoMHgwMDAwOCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAxIGNsZWFyIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0JDVFJMMV9DTEVBUl9SRUcgICAgUEJDX1JFR19BRERSKDB4MDAwMEMgPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEJvYXJkIGNvbnRyb2wgcmVnaXN0ZXIgMiBzZXQgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBQQkNfQkNUUkwyX1NFVF9SRUcgICAgICBQQkNfUkVHX0FERFIoMHgwMDAxMCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAyIGNsZWFyIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0JDVFJMMl9DTEVBUl9SRUcgICAgUEJDX1JFR19BRERSKDB4MDAwMTQgPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEJvYXJkIGNvbnRyb2wgcmVnaXN0ZXIgMyBzZXQgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBQQkNfQkNUUkwzX1NFVF9SRUcgICAgICBQQkNfUkVHX0FERFIoMHgwMDAxOCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAzIGNsZWFyIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0JDVFJMM19DTEVBUl9SRUcgICAgUEJDX1JFR19BRERSKDB4MDAwMUMgPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEJvYXJkIGNvbnRyb2wgcmVnaXN0ZXIgMyBzZXQgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBQQkNfQkNUUkw0X1NFVF9SRUcgICAgICBQQkNfUkVHX0FERFIoMHgwMDAyMCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciA0IGNsZWFyIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0JDVFJMNF9DTEVBUl9SRUcgICAgUEJDX1JFR19BRERSKDB4MDAwMjQgPj4gUEJDX0FERFJfU0gpCi0vKlBCQ19BRERSX1NICi0gKiBQQkMgQm9hcmQgc3RhdHVzIHJlZ2lzdGVyIDEuCi0gKi8KLSNkZWZpbmUgUEJDX0JTVEFUMV9SRUcgICAgICAgICAgUEJDX1JFR19BRERSKDB4MDAwMjggPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEJvYXJkIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUEJDX0lOVFNUQVRVU19SRUcgICAgICAgUEJDX1JFR19BRERSKDB4MDAwMkMgPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEJvYXJkIGludGVycnVwdCBjdXJyZW50IHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQQkNfSU5UQ1VSUl9TVEFUVVNfUkVHICBQQkNfUkVHX0FERFIoMHgwMDAzNCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBQQkMgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgc2V0IGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0lOVE1BU0tfU0VUX1JFRyAgICAgUEJDX1JFR19BRERSKDB4MDAwMzggPj4gUEJDX0FERFJfU0gpCi0vKgotICogUEJDIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGNsZWFyIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0lOVE1BU0tfQ0xFQVJfUkVHICAgUEJDX1JFR19BRERSKDB4MDAwM0MgPj4gUEJDX0FERFJfU0gpCi0vKgotICogRXh0ZXJuYWwgVUFSVCBBLgotICovCi0jZGVmaW5lIFBCQ19TQzE2QzY1Ml9VQVJUQV9SRUcgIFBCQ19SRUdfQUREUigweDIwMDAwID4+IFBCQ19BRERSX1NIKQotLyoKLSAqIFVBUlQgNCBFeHBhbmRpbmcgU2lnbmFsIFN0YXR1cy4KLSAqLwotI2RlZmluZSBQQkNfVUFSVF9TVEFUVVNfUkVHICAgICBQQkNfUkVHX0FERFIoMHgyMjAwMCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBVQVJUIDQgRXhwYW5kaW5nIFNpZ25hbCBDb250cm9sIFNldC4KLSAqLwotI2RlZmluZSBQQkNfVUNUUkxfU0VUX1JFRyAgICAgICBQQkNfUkVHX0FERFIoMHgyNDAwMCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBVQVJUIDQgRXhwYW5kaW5nIFNpZ25hbCBDb250cm9sIENsZWFyLgotICovCi0jZGVmaW5lIFBCQ19VQ1RSTF9DTFJfUkVHICAgICAgIFBCQ19SRUdfQUREUigweDI2MDAwID4+IFBCQ19BRERSX1NIKQotLyoKLSAqIEV0aGVybmV0IENvbnRyb2xsZXIgSU8gYmFzZSBhZGRyZXNzLgotICovCi0jZGVmaW5lIFBCQ19DUzg5MDBBX0lPQkFTRV9SRUcgIFBCQ19SRUdfQUREUigweDQwMDAwID4+IFBCQ19BRERSX1NIKQotLyoKLSAqIEV0aGVybmV0IENvbnRyb2xsZXIgTWVtb3J5IGJhc2UgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBQQkNfQ1M4OTAwQV9NRU1CQVNFX1JFRyBQQkNfUkVHX0FERFIoMHg0MjAwMCA+PiBQQkNfQUREUl9TSCkKLS8qCi0gKiBFdGhlcm5ldCBDb250cm9sbGVyIERNQSBiYXNlIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgUEJDX0NTODkwMEFfRE1BQkFTRV9SRUcgUEJDX1JFR19BRERSKDB4NDQwMDAgPj4gUEJDX0FERFJfU0gpCi0KLS8qIFBCQyBCb2FyZCBWZXJzaW9uIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9uICovCi0jZGVmaW5lIFBCQ19WRVJTSU9OX0FEUyAgICAgICAgIDB4ODAwMAkvKiBCaXQxNT0xIG1lYW5zIHZlcnNpb24gZm9yIGFkcyAqLwotI2RlZmluZSBQQkNfVkVSU0lPTl9FVkJfUkVWQiAgICAweDQwMDAJLyogQklUMTQ9MSBtZWFucyB2ZXJzaW9uIGZvciBldmIgcmV2YiAqLwotCi0vKiBQQkMgQm9hcmQgQ29udHJvbCBSZWdpc3RlciAxIGJpdCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBQQkNfQkNUUkwxX0VSU1QgICAgICAgICAweDAwMDEJLyogRXRoZXJuZXQgUmVzZXQgKi8KLSNkZWZpbmUgUEJDX0JDVFJMMV9VUlNUICAgICAgICAgMHgwMDAyCS8qIFJlc2V0IEV4dGVybmFsIFVBUlQgY29udHJvbGxlciAqLwotI2RlZmluZSBQQkNfQkNUUkwxX0ZSU1QgICAgICAgICAweDAwMDQJLyogRkVDIFJlc2V0ICovCi0jZGVmaW5lIFBCQ19CQ1RSTDFfRVNMRUVQICAgICAgIDB4MDAxMAkvKiBFbmFibGUgZXRoZXJuZXQgU2xlZXAgKi8KLSNkZWZpbmUgUEJDX0JDVFJMMV9MQ0RPTiAgICAgICAgMHgwODAwCS8qIEVuYWJsZSB0aGUgTENEICovCi0KLS8qIFBCQyBCb2FyZCBDb250cm9sIFJlZ2lzdGVyIDIgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIFBCQ19CQ1RSTDJfVkNDX0VOICAgICAgIDB4MDAwNAkvKiAgIEVuYWJsZSBWQ0MgKi8KLSNkZWZpbmUgUEJDX0JDVFJMMl9WUFBfRU4gICAgICAgMHgwMDA4CS8qICAgRW5hYmxlIFZwcCAqLwotI2RlZmluZSBQQkNfQkNUUkwyX0FUQUZFQ19FTiAgICAwWDAwMTAKLSNkZWZpbmUgUEJDX0JDVFJMMl9BVEFGRUNfU0VMICAgMFgwMDIwCi0jZGVmaW5lIFBCQ19CQ1RSTDJfQVRBX0VOICAgICAgIDBYMDA0MAotI2RlZmluZSBQQkNfQkNUUkwyX0lSREFfU0QgICAgICAwWDAwODAKLSNkZWZpbmUgUEJDX0JDVFJMMl9JUkRBX0VOICAgICAgMFgwMTAwCi0jZGVmaW5lIFBCQ19CQ1RSTDJfQ0NUTDEwICAgICAgIDBYMDIwMAotI2RlZmluZSBQQkNfQkNUUkwyX0NDVEwxMSAgICAgICAwWDA0MDAKLQotLyogUEJDIEJvYXJkIENvbnRyb2wgUmVnaXN0ZXIgMyBiaXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgUEJDX0JDVFJMM19IU0hfRU4gICAgICAgMFgwMDIwCi0jZGVmaW5lIFBCQ19CQ1RSTDNfRlNIX01PRCAgICAgIDBYMDA0MAotI2RlZmluZSBQQkNfQkNUUkwzX09UR19IU19FTiAgICAwWDAwODAKLSNkZWZpbmUgUEJDX0JDVFJMM19PVEdfVkJVU19FTiAgMFgwMTAwCi0jZGVmaW5lIFBCQ19CQ1RSTDNfRlNIX1ZCVVNfRU4gIDBYMDIwMAotI2RlZmluZSBQQkNfQkNUUkwzX1VTQl9PVEdfT04gICAwWDA4MDAKLSNkZWZpbmUgUEJDX0JDVFJMM19VU0JfRlNIX09OICAgMFgxMDAwCi0KLS8qIFBCQyBCb2FyZCBDb250cm9sIFJlZ2lzdGVyIDQgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIFBCQ19CQ1RSTDRfUkVHRU5fU0VMICAgIDBYMDAwMQotI2RlZmluZSBQQkNfQkNUUkw0X1VTRVJfT0ZGICAgICAwWDAwMDIKLSNkZWZpbmUgUEJDX0JDVFJMNF9WSUJfRU4gICAgICAgMFgwMDA0Ci0jZGVmaW5lIFBCQ19CQ1RSTDRfUFdSR1QxX0VOICAgIDBYMDAwOAotI2RlZmluZSBQQkNfQkNUUkw0X1BXUkdUMl9FTiAgICAwWDAwMTAKLSNkZWZpbmUgUEJDX0JDVFJMNF9TVERCWV9QUkkgICAgMFgwMDIwCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKgotICogRW51bWVyYXRpb25zIGZvciBTRCBjYXJkcyBhbmQgbWVtb3J5IHN0aWNrIGNhcmQuIFRoaXMgY29ycmVzcG9uZHMgdG8KLSAqIHRoZSBjYXJkIEVOIGJpdHMgaW4gdGhlIElNUjogU0QxX0VOIHwgTVNfRU4gfCBTRDNfRU4gfCBTRDJfRU4uCi0gKi8KLWVudW0gbXhjX2NhcmRfbm8gewotCU1YQ19DQVJEX1NEMiA9IDAsCi0JTVhDX0NBUkRfU0QzLAotCU1YQ19DQVJEX01TLAotCU1YQ19DQVJEX1NEMSwKLQlNWENfQ0FSRF9NSU4gPSBNWENfQ0FSRF9TRDIsCi0JTVhDX0NBUkRfTUFYID0gTVhDX0NBUkRfU0QxLAotfTsKLSNlbmRpZgotCi0jZGVmaW5lIE1YQ19DUExEX1ZFUl8xXzUwICAgICAgIDB4MDEKLQotLyoKLSAqIFBCQyBCU1RBVCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBQQkNfQlNUQVRfUFJJX0lOVCAgICAgICAwWDAwMDEKLSNkZWZpbmUgUEJDX0JTVEFUX1VTQl9CWVAgICAgICAgMFgwMDAyCi0jZGVmaW5lIFBCQ19CU1RBVF9BVEFfSU9DUzE2ICAgIDBYMDAwNAotI2RlZmluZSBQQkNfQlNUQVRfQVRBX0NCTElEICAgICAwWDAwMDgKLSNkZWZpbmUgUEJDX0JTVEFUX0FUQV9EQVNQICAgICAgMFgwMDEwCi0jZGVmaW5lIFBCQ19CU1RBVF9QV1JfUkRZICAgICAgIDBYMDAyMAotI2RlZmluZSBQQkNfQlNUQVRfU0QzX1dQICAgICAgICAwWDAxMDAKLSNkZWZpbmUgUEJDX0JTVEFUX1NEMl9XUCAgICAgICAgMFgwMjAwCi0jZGVmaW5lIFBCQ19CU1RBVF9TRDFfV1AgICAgICAgIDBYMDQwMAotI2RlZmluZSBQQkNfQlNUQVRfU0QzX0RFVCAgICAgICAwWDA4MDAKLSNkZWZpbmUgUEJDX0JTVEFUX1NEMl9ERVQgICAgICAgMFgxMDAwCi0jZGVmaW5lIFBCQ19CU1RBVF9TRDFfREVUICAgICAgIDBYMjAwMAotI2RlZmluZSBQQkNfQlNUQVRfTVNfREVUICAgICAgICAwWDQwMDAKLSNkZWZpbmUgUEJDX0JTVEFUX1NEM19ERVRfQklUICAgMTEKLSNkZWZpbmUgUEJDX0JTVEFUX1NEMl9ERVRfQklUICAgMTIKLSNkZWZpbmUgUEJDX0JTVEFUX1NEMV9ERVRfQklUICAgMTMKLSNkZWZpbmUgUEJDX0JTVEFUX01TX0RFVF9CSVQgICAgMTQKLSNkZWZpbmUgTVhDX0JTVEFUX0JJVChuKSAgICAgICAgKChuID09IE1YQ19DQVJEX1NEMikgPyBQQkNfQlNUQVRfU0QyX0RFVCA6IFwKLQkJCQkgKChuID09IE1YQ19DQVJEX1NEMykgPyBQQkNfQlNUQVRfU0QzX0RFVCA6IFwKLQkJCQkgKChuID09IE1YQ19DQVJEX1NEMSkgPyBQQkNfQlNUQVRfU0QxX0RFVCA6IFwKLQkJCQkgKChuID09IE1YQ19DQVJEX01TKSA/IFBCQ19CU1RBVF9NU19ERVQgOiBcCi0JCQkJCTB4MCkpKSkKLQotLyoKLSAqIFBCQyBVQVJUIENvbnRyb2wgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgUEJDX1VDVFJMX0RDRV9EQ0QgICAgICAgMFgwMDAxCi0jZGVmaW5lIFBCQ19VQ1RSTF9EQ0VfRFNSICAgICAgIDBYMDAwMgotI2RlZmluZSBQQkNfVUNUUkxfRENFX1JJICAgICAgICAwWDAwMDQKLSNkZWZpbmUgUEJDX1VDVFJMX0RURV9EVFIgICAgICAgMFgwMTAwCi0KLS8qCi0gKiBQQkMgVUFSVCBTdGF0dXMgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgUEJDX1VTVEFUX0RURV9EQ0QgICAgICAgMFgwMDAxCi0jZGVmaW5lIFBCQ19VU1RBVF9EVEVfRFNSICAgICAgIDBYMDAwMgotI2RlZmluZSBQQkNfVVNUQVRfRFRFX1JJICAgICAgICAwWDAwMDQKLSNkZWZpbmUgUEJDX1VTVEFUX0RDRV9EVFIgICAgICAgMFgwMTAwCi0KLS8qCi0gKiBQQkMgSW50ZXJ1cHQgbWFzayByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBQQkNfSU5UUl9TRDNfUl9FTl9CSVQgICA0Ci0jZGVmaW5lIFBCQ19JTlRSX1NEMl9SX0VOX0JJVCAgIDAKLSNkZWZpbmUgUEJDX0lOVFJfU0QxX1JfRU5fQklUICAgNgotI2RlZmluZSBQQkNfSU5UUl9NU19SX0VOX0JJVCAgICA1Ci0jZGVmaW5lIFBCQ19JTlRSX1NEM19FTl9CSVQgICAgIDEzCi0jZGVmaW5lIFBCQ19JTlRSX1NEMl9FTl9CSVQgICAgIDEyCi0jZGVmaW5lIFBCQ19JTlRSX01TX0VOX0JJVCAgICAgIDE0Ci0jZGVmaW5lIFBCQ19JTlRSX1NEMV9FTl9CSVQgICAgIDE1Ci0KLSNkZWZpbmUgUEJDX0lOVFJfU0QyX1JfRU4gICAgICAgMHgwMDAxCi0jZGVmaW5lIFBCQ19JTlRSX0xPV19CQVQgICAgICAgIDBYMDAwMgotI2RlZmluZSBQQkNfSU5UUl9PVEdfRlNPVkVSICAgICAwWDAwMDQKLSNkZWZpbmUgUEJDX0lOVFJfRlNIX09WRVIgICAgICAgMFgwMDA4Ci0jZGVmaW5lIFBCQ19JTlRSX1NEM19SX0VOICAgICAgIDB4MDAxMAotI2RlZmluZSBQQkNfSU5UUl9NU19SX0VOICAgICAgICAweDAwMjAKLSNkZWZpbmUgUEJDX0lOVFJfU0QxX1JfRU4gICAgICAgMHgwMDQwCi0jZGVmaW5lIFBCQ19JTlRSX0ZFQ19JTlQgICAgICAgIDBYMDA4MAotI2RlZmluZSBQQkNfSU5UUl9FTkVUX0lOVCAgICAgICAwWDAxMDAKLSNkZWZpbmUgUEJDX0lOVFJfT1RHRlNfSU5UICAgICAgMFgwMjAwCi0jZGVmaW5lIFBCQ19JTlRSX1hVQVJUX0lOVCAgICAgIDBYMDQwMAotI2RlZmluZSBQQkNfSU5UUl9DQ1RMMTIgICAgICAgICAwWDA4MDAKLSNkZWZpbmUgUEJDX0lOVFJfU0QyX0VOICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFBCQ19JTlRSX1NEM19FTiAgICAgICAgIDB4MjAwMAotI2RlZmluZSBQQkNfSU5UUl9NU19FTiAgICAgICAgICAweDQwMDAKLSNkZWZpbmUgUEJDX0lOVFJfU0QxX0VOICAgICAgICAgMHg4MDAwCi0KLQotCi0vKiBGb3IgaW50ZXJydXB0cyBsaWtlIHh1YXJ0LCBlbmV0IGV0YyAqLwotI2RlZmluZSBFWFBJT19QQVJFTlRfSU5UICAgICAgICBJT01VWF9UT19JUlEoTVgyN19QSU5fVElOKQotI2RlZmluZSBNWENfTUFYX0VYUF9JT19MSU5FUyAgICAxNgotCi0vKgotICogVGhpcyBjb3JyZXNwb25kcyB0byBQQkNfSU5UTUFTS19TRVRfUkVHIGF0IG9mZnNldCAweDM4LgotICoKLSAqLwotI2RlZmluZSBFWFBJT19JTlRfTE9XX0JBVCAgICAgICAoTVhDX0VYUF9JT19CQVNFICsgMSkKLSNkZWZpbmUgRVhQSU9fSU5UX09UR19GU19PVlIgICAgKE1YQ19FWFBfSU9fQkFTRSArIDIpCi0jZGVmaW5lIEVYUElPX0lOVF9GU0hfT1ZSICAgICAgIChNWENfRVhQX0lPX0JBU0UgKyAzKQotI2RlZmluZSBFWFBJT19JTlRfUkVTNCAgICAgICAgICAoTVhDX0VYUF9JT19CQVNFICsgNCkKLSNkZWZpbmUgRVhQSU9fSU5UX1JFUzUgICAgICAgICAgKE1YQ19FWFBfSU9fQkFTRSArIDUpCi0jZGVmaW5lIEVYUElPX0lOVF9SRVM2ICAgICAgICAgIChNWENfRVhQX0lPX0JBU0UgKyA2KQotI2RlZmluZSBFWFBJT19JTlRfRkVDICAgICAgICAgICAoTVhDX0VYUF9JT19CQVNFICsgNykKLSNkZWZpbmUgRVhQSU9fSU5UX0VORVRfSU5UICAgICAgKE1YQ19FWFBfSU9fQkFTRSArIDgpCi0jZGVmaW5lIEVYUElPX0lOVF9PVEdfRlNfSU5UICAgIChNWENfRVhQX0lPX0JBU0UgKyA5KQotI2RlZmluZSBFWFBJT19JTlRfWFVBUlRfSU5UQSAgICAoTVhDX0VYUF9JT19CQVNFICsgMTApCi0jZGVmaW5lIEVYUElPX0lOVF9DQ1RMMTJfSU5UICAgIChNWENfRVhQX0lPX0JBU0UgKyAxMSkKLSNkZWZpbmUgRVhQSU9fSU5UX1NEMl9FTiAgICAgICAgKE1YQ19FWFBfSU9fQkFTRSArIDEyKQotI2RlZmluZSBFWFBJT19JTlRfU0QzX0VOICAgICAgICAoTVhDX0VYUF9JT19CQVNFICsgMTMpCi0jZGVmaW5lIEVYUElPX0lOVF9NU19FTiAgICAgICAgIChNWENfRVhQX0lPX0JBU0UgKyAxNCkKLSNkZWZpbmUgRVhQSU9fSU5UX1NEMV9FTiAgICAgICAgKE1YQ19FWFBfSU9fQkFTRSArIDE1KQotCi0vKgotICogVGhpcyBpcyBTeXN0ZW0gSVJRIHVzZWQgYnkgQ1M4OTAwQSBmb3IgaW50ZXJydXB0IGdlbmVyYXRpb24KLSAqIHRha2VuIGZyb20gcGxhdGZvcm0uaAotICovCi0jZGVmaW5lIENTODkwMEFJUlEgICAgICAgICAgICAgIEVYUElPX0lOVF9FTkVUX0lOVAotLyogVGhpcyBpcyBJL08gQmFzZSBhZGRyZXNzIHVzZWQgdG8gYWNjZXNzIHJlZ2lzdGVycyBvZiBDUzg5MDBBIG9uIE1YQyBBRFMgKi8KLSNkZWZpbmUgQ1M4OTAwQV9CQVNFX0FERFJFU1MgICAgKFBCQ19DUzg5MDBBX0lPQkFTRV9SRUcgKyAweDMwMCkKLQotI2RlZmluZSBNWENfUE1JQ19JTlRfTElORSAgICAgICBJT01VWF9UT19JUlEoTVgyN19QSU5fVE9VVCkKLQotLyoKLSogVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZiB0aGUgQ1BMRCB2ZXJzaW9uIGlzIGZvciBteDI3IGV2YiBib2FyZCByZXYtYQotKi8KLSNkZWZpbmUgUEJDX0NQTERfVkVSU0lPTl9JU19SRVZBKCkgXAotCSgoX19yYXdfcmVhZHcoUEJDX1ZFUlNJT05fUkVHKSAmIFwKLQkoUEJDX1ZFUlNJT05fQURTIHwgUEJDX1ZFUlNJT05fRVZCX1JFVkIpKVwKLQk9PSAwKQotCi0vKiBUaGlzIGlzIHVzZWQgdG8gYWN0aXZlIG9yIGluYWN0aXZlIGF0YSBzaWduYWwgaW4gQ1BMRCAuCi0gKiAgSXQgaXMgZGVwZW5kZW50IHdpdGggaGFyZHdhcmUKLSAqLwotI2RlZmluZSBQQkNfQVRBX1NJR05BTF9BQ1RJVkUoKSBcCi0JX19yYXdfd3JpdGV3KCAgICAgICAgICAgXAotCQlQQkNfQkNUUkwyX0FUQUZFQ19FTnxQQkNfQkNUUkwyX0FUQUZFQ19TRUx8UEJDX0JDVFJMMl9BVEFfRU4sIFwKLQkJUEJDX0JDVFJMMl9DTEVBUl9SRUcpCi0KLSNkZWZpbmUgUEJDX0FUQV9TSUdOQUxfSU5BQ1RJVkUoKSBcCi0JX19yYXdfd3JpdGV3KCAgXAotCQlQQkNfQkNUUkwyX0FUQUZFQ19FTnxQQkNfQkNUUkwyX0FUQUZFQ19TRUx8UEJDX0JDVFJMMl9BVEFfRU4sIFwKLQkJUEJDX0JDVFJMMl9TRVRfUkVHKQotCi0jZGVmaW5lIE1YQ19CRF9MRUQxICAgICAgICAgICAgICgxIDw8IDUpCi0jZGVmaW5lIE1YQ19CRF9MRUQyICAgICAgICAgICAgICgxIDw8IDYpCi0jZGVmaW5lIE1YQ19CRF9MRURfT04obGVkKSBcCi0JX19yYXdfd3JpdGV3KGxlZCwgUEJDX0JDVFJMMV9TRVRfUkVHKQotI2RlZmluZSBNWENfQkRfTEVEX09GRihsZWQpIFwKLQlfX3Jhd193cml0ZXcobGVkLCBQQkNfQkNUUkwxX0NMRUFSX1JFRykKLQotLyogdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGV4dGVybmFsIGNyeXN0YWwgcmVmZXJlbmNlICovCi0jZGVmaW5lIENLSUhfMjdNSFpfQklUX1NFVCAgICAgICgxIDw8IDMpCi0KLSNlbmRpZgkJCQkvKiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDI3QURTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjdsaXRlLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgyN2xpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4NzU1MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgyN2xpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NWENfQk9BUkRfTVgyN0xJVEVfSF9fCi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX01YMjdMSVRFX0hfXwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfTVgyN0xJVEVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgyN3Bkay5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjdwZGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjMWJjZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgyN3Bkay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDI3UERLX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDI3UERLX0hfXwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfTVgyN1BES19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxXzNkcy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFfM2RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTI5MzNhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxXzNkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDMxXzNEU19IX18KLSNkZWZpbmUgX19BU01fQVJDSF9NWENfQk9BUkRfTVgzMV8zRFNfSF9fCi0KLS8qIERlZmluaXRpb25zIGZvciBjb21wb25lbnRzIG9uIHRoZSBEZWJ1ZyBib2FyZCAqLwotCi0vKiBCYXNlIGFkZHJlc3Mgb2YgQ1BMRCBjb250cm9sbGVyIG9uIHRoZSBEZWJ1ZyBib2FyZCAqLwotI2RlZmluZSBERUJVR19CQVNFX0FERFJFU1MJCUNTNV9JT19BRERSRVNTKENTNV9CQVNFX0FERFIpCi0KLS8qIExBTjkyMTcgZXRoZXJuZXQgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lIExBTjkyMTdfQkFTRV9BRERSCQlDUzVfQkFTRV9BRERSCi0KLS8qIENQTEQgY29uZmlnIGFuZCBpbnRlcnJ1cHQgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lIENQTERfQUREUgkJCShERUJVR19CQVNFX0FERFJFU1MgKyAweDIwMDAwKQotCi0vKiBMRUQgc3dpdGNocyAqLwotI2RlZmluZSBDUExEX0xFRF9SRUcJCQkoQ1BMRF9BRERSICsgMHgwMCkKLS8qIGJ1dHRvbnMgKi8KLSNkZWZpbmUgQ1BMRF9TV0lUQ0hfQlVUVE9OU19SRUcJKEVYUElPX0FERFIgKyAweDA4KQotLyogc3RhdHVzLCBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgQ1BMRF9JTlRfU1RBVFVTX1JFRwkJKENQTERfQUREUiArIDB4MTApCi0jZGVmaW5lIENQTERfSU5UX01BU0tfUkVHCQkoQ1BMRF9BRERSICsgMHgzOCkKLSNkZWZpbmUgQ1BMRF9JTlRfUkVTRVRfUkVHCQkoQ1BMRF9BRERSICsgMHgyMCkKLS8qIG1hZ2ljIHdvcmQgZm9yIGRlYnVnIENQTEQgKi8KLSNkZWZpbmUgQ1BMRF9NQUdJQ19OVU1CRVIxX1JFRwkJKENQTERfQUREUiArIDB4NDApCi0jZGVmaW5lIENQTERfTUFHSUNfTlVNQkVSMl9SRUcJCShDUExEX0FERFIgKyAweDQ4KQotLyogQ1BMRCBjb2RlIHZlcnNpb24gKi8KLSNkZWZpbmUgQ1BMRF9DT0RFX1ZFUl9SRUcJCShDUExEX0FERFIgKyAweDUwKQotLyogbWFnaWMgd29yZCBmb3IgZGVidWcgQ1BMRCAqLwotI2RlZmluZSBDUExEX01BR0lDX05VTUJFUjNfUkVHCQkoQ1BMRF9BRERSICsgMHg1OCkKLS8qIG1vZHVsZSByZXNldCByZWdpc3RlciAqLwotI2RlZmluZSBDUExEX01PRFVMRV9SRVNFVF9SRUcJCShDUExEX0FERFIgKyAweDYwKQotLyogQ1BVIElEIGFuZCBQZXJzb25hbGl0eSBJRCAqLwotI2RlZmluZSBDUExEX01DVV9CT0FSRF9JRF9SRUcJCShDUExEX0FERFIgKyAweDY4KQotCi0vKiBDUExEIElSUSBsaW5lIGZvciBleHRlcm5hbCB1YXJ0LCBleHRlcm5hbCBldGhlcm5ldCBldGMgKi8KLSNkZWZpbmUgRVhQSU9fUEFSRU5UX0lOVAlJT01VWF9UT19JUlEoTVgzMV9QSU5fR1BJTzFfMSkKLQotI2RlZmluZSBNWENfRVhQX0lPX0JBU0UJCShNWENfQk9BUkRfSVJRX1NUQVJUKQotI2RlZmluZSBNWENfSVJRX1RPX0VYUElPKGlycSkJKChpcnEpIC0gTVhDX0VYUF9JT19CQVNFKQotCi0jZGVmaW5lIEVYUElPX0lOVF9FTkVUCQkoTVhDX0VYUF9JT19CQVNFICsgMCkKLSNkZWZpbmUgRVhQSU9fSU5UX1hVQVJUX0EJKE1YQ19FWFBfSU9fQkFTRSArIDEpCi0jZGVmaW5lIEVYUElPX0lOVF9YVUFSVF9CCShNWENfRVhQX0lPX0JBU0UgKyAyKQotI2RlZmluZSBFWFBJT19JTlRfQlVUVE9OX0EJKE1YQ19FWFBfSU9fQkFTRSArIDMpCi0jZGVmaW5lIEVYUElPX0lOVF9CVVRUT05fQgkoTVhDX0VYUF9JT19CQVNFICsgNCkKLQotI2RlZmluZSBNWENfTUFYX0VYUF9JT19MSU5FUwkxNgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfTVgzMV8zRFNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWFkcy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFhZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1YTE5OS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWFkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDMxQURTX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDMxQURTX0hfXwotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0vKiBCYXNlIGFkZHJlc3Mgb2YgUEJDIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgUEJDX0JBU0VfQUREUkVTUyAgICAgICAgTVgzMV9DUzRfQkFTRV9BRERSX1ZJUlQKLS8qIE9mZnNldHMgZm9yIHRoZSBQQkMgQ29udHJvbGxlciByZWdpc3RlciAqLwotCi0vKiBQQkMgQm9hcmQgc3RhdHVzIHJlZ2lzdGVyIG9mZnNldCAqLwotI2RlZmluZSBQQkNfQlNUQVQgICAgICAgICAgICAgICAweDAwMDAwMgotCi0vKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAxIHNldCBhZGRyZXNzICovCi0jZGVmaW5lIFBCQ19CQ1RSTDFfU0VUICAgICAgICAgIDB4MDAwMDA0Ci0KLS8qIFBCQyBCb2FyZCBjb250cm9sIHJlZ2lzdGVyIDEgY2xlYXIgYWRkcmVzcyAqLwotI2RlZmluZSBQQkNfQkNUUkwxX0NMRUFSICAgICAgICAweDAwMDAwNgotCi0vKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAyIHNldCBhZGRyZXNzICovCi0jZGVmaW5lIFBCQ19CQ1RSTDJfU0VUICAgICAgICAgIDB4MDAwMDA4Ci0KLS8qIFBCQyBCb2FyZCBjb250cm9sIHJlZ2lzdGVyIDIgY2xlYXIgYWRkcmVzcyAqLwotI2RlZmluZSBQQkNfQkNUUkwyX0NMRUFSICAgICAgICAweDAwMDAwQQotCi0vKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciAzIHNldCBhZGRyZXNzICovCi0jZGVmaW5lIFBCQ19CQ1RSTDNfU0VUICAgICAgICAgIDB4MDAwMDBDCi0KLS8qIFBCQyBCb2FyZCBjb250cm9sIHJlZ2lzdGVyIDMgY2xlYXIgYWRkcmVzcyAqLwotI2RlZmluZSBQQkNfQkNUUkwzX0NMRUFSICAgICAgICAweDAwMDAwRQotCi0vKiBQQkMgQm9hcmQgY29udHJvbCByZWdpc3RlciA0IHNldCBhZGRyZXNzICovCi0jZGVmaW5lIFBCQ19CQ1RSTDRfU0VUICAgICAgICAgIDB4MDAwMDEwCi0KLS8qIFBCQyBCb2FyZCBjb250cm9sIHJlZ2lzdGVyIDQgY2xlYXIgYWRkcmVzcyAqLwotI2RlZmluZSBQQkNfQkNUUkw0X0NMRUFSICAgICAgICAweDAwMDAxMgotCi0vKiBQQkMgQm9hcmQgc3RhdHVzIHJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUgUEJDX0JTVEFUMSAgICAgICAgICAgICAgMHgwMDAwMTQKLQotLyogUEJDIEJvYXJkIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUEJDX0lOVFNUQVRVUyAgICAgICAgICAgMHgwMDAwMTYKLQotLyogUEJDIEJvYXJkIGludGVycnVwdCBjdXJyZW50IHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBQQkNfSU5UQ1VSUl9TVEFUVVMgICAgICAweDAwMDAxOAotCi0vKiBQQkMgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgc2V0IGFkZHJlc3MgKi8KLSNkZWZpbmUgUEJDX0lOVE1BU0tfU0VUICAgICAgICAgMHgwMDAwMUEKLQotLyogUEJDIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGNsZWFyIGFkZHJlc3MgKi8KLSNkZWZpbmUgUEJDX0lOVE1BU0tfQ0xFQVIgICAgICAgMHgwMDAwMUMKLQotLyogRXh0ZXJuYWwgVUFSVCBBICovCi0jZGVmaW5lIFBCQ19TQzE2QzY1Ml9VQVJUQSAgICAgIDB4MDEwMDAwCi0KLS8qIEV4dGVybmFsIFVBUlQgQiAqLwotI2RlZmluZSBQQkNfU0MxNkM2NTJfVUFSVEIgICAgICAweDAxMDAxMAotCi0vKiBFdGhlcm5ldCBDb250cm9sbGVyIElPIGJhc2UgYWRkcmVzcyAqLwotI2RlZmluZSBQQkNfQ1M4OTAwQV9JT0JBU0UgICAgICAweDAyMDAwMAotCi0vKiBFdGhlcm5ldCBDb250cm9sbGVyIE1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSNkZWZpbmUgUEJDX0NTODkwMEFfTUVNQkFTRSAgICAgMHgwMjEwMDAKLQotLyogRXRoZXJuZXQgQ29udHJvbGxlciBETUEgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lIFBCQ19DUzg5MDBBX0RNQUJBU0UgICAgIDB4MDIyMDAwCi0KLS8qIEV4dGVybmFsIGNoaXAgc2VsZWN0IDAgKi8KLSNkZWZpbmUgUEJDX1hDUzAgICAgICAgICAgICAgICAgMHgwNDAwMDAKLQotLyogTENEIERpc3BsYXkgZW5hYmxlICovCi0jZGVmaW5lIFBCQ19MQ0RfRU5fQiAgICAgICAgICAgIDB4MDYwMDAwCi0KLS8qIENvZGUgdGVzdCBkZWJ1ZyBlbmFibGUgKi8KLSNkZWZpbmUgUEJDX0NPREVfQiAgICAgICAgICAgICAgMHgwNzAwMDAKLQotLyogUFNSQU0gbWVtb3J5IHNlbGVjdCAqLwotI2RlZmluZSBQQkNfUFNSQU1fQiAgICAgICAgICAgICAweDUwMDAwMDAKLQotI2RlZmluZSBQQkNfSU5UU1RBVFVTX1JFRwkoUEJDX0lOVFNUQVRVUyArIFBCQ19CQVNFX0FERFJFU1MpCi0jZGVmaW5lIFBCQ19JTlRDVVJSX1NUQVRVU19SRUcJKFBCQ19JTlRDVVJSX1NUQVRVUyArIFBCQ19CQVNFX0FERFJFU1MpCi0jZGVmaW5lIFBCQ19JTlRNQVNLX1NFVF9SRUcJKFBCQ19JTlRNQVNLX1NFVCArIFBCQ19CQVNFX0FERFJFU1MpCi0jZGVmaW5lIFBCQ19JTlRNQVNLX0NMRUFSX1JFRwkoUEJDX0lOVE1BU0tfQ0xFQVIgKyBQQkNfQkFTRV9BRERSRVNTKQotI2RlZmluZSBFWFBJT19QQVJFTlRfSU5UCUlPTVVYX1RPX0lSUShNWDMxX1BJTl9HUElPMV80KQotCi0jZGVmaW5lIE1YQ19FWFBfSU9fQkFTRQkJKE1YQ19CT0FSRF9JUlFfU1RBUlQpCi0jZGVmaW5lIE1YQ19JUlFfVE9fRVhQSU8oaXJxKQkoKGlycSkgLSBNWENfRVhQX0lPX0JBU0UpCi0KLSNkZWZpbmUgRVhQSU9fSU5UX0xPV19CQVQJKE1YQ19FWFBfSU9fQkFTRSArIDApCi0jZGVmaW5lIEVYUElPX0lOVF9QQl9JUlEJKE1YQ19FWFBfSU9fQkFTRSArIDEpCi0jZGVmaW5lIEVYUElPX0lOVF9PVEdfRlNfT1ZSCShNWENfRVhQX0lPX0JBU0UgKyAyKQotI2RlZmluZSBFWFBJT19JTlRfRlNIX09WUgkoTVhDX0VYUF9JT19CQVNFICsgMykKLSNkZWZpbmUgRVhQSU9fSU5UX1JFUzQJCShNWENfRVhQX0lPX0JBU0UgKyA0KQotI2RlZmluZSBFWFBJT19JTlRfUkVTNQkJKE1YQ19FWFBfSU9fQkFTRSArIDUpCi0jZGVmaW5lIEVYUElPX0lOVF9SRVM2CQkoTVhDX0VYUF9JT19CQVNFICsgNikKLSNkZWZpbmUgRVhQSU9fSU5UX1JFUzcJCShNWENfRVhQX0lPX0JBU0UgKyA3KQotI2RlZmluZSBFWFBJT19JTlRfRU5FVF9JTlQJKE1YQ19FWFBfSU9fQkFTRSArIDgpCi0jZGVmaW5lIEVYUElPX0lOVF9PVEdfRlNfSU5UCShNWENfRVhQX0lPX0JBU0UgKyA5KQotI2RlZmluZSBFWFBJT19JTlRfWFVBUlRfSU5UQQkoTVhDX0VYUF9JT19CQVNFICsgMTApCi0jZGVmaW5lIEVYUElPX0lOVF9YVUFSVF9JTlRCCShNWENfRVhQX0lPX0JBU0UgKyAxMSkKLSNkZWZpbmUgRVhQSU9fSU5UX1NZTlRIX0lSUQkoTVhDX0VYUF9JT19CQVNFICsgMTIpCi0jZGVmaW5lIEVYUElPX0lOVF9DRV9JTlQxCShNWENfRVhQX0lPX0JBU0UgKyAxMykKLSNkZWZpbmUgRVhQSU9fSU5UX0NFX0lOVDIJKE1YQ19FWFBfSU9fQkFTRSArIDE0KQotI2RlZmluZSBFWFBJT19JTlRfUkVTMTUJCShNWENfRVhQX0lPX0JBU0UgKyAxNSkKLQotI2RlZmluZSBNWENfTUFYX0VYUF9JT19MSU5FUwkxNgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfTVgzMUFEU19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxbGlsbHkuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxbGlsbHkuaAppbmRleCBlYjVhNTAyLi4wZGY3MWJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWxpbGx5LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFsaWxseS5oCkBAIC0zMSw3ICszMSw3IEBACiAKIC8qCiAgKiBUaGlzIENQVSBtb2R1bGUgbmVlZHMgYSBiYXNlYm9hcmQgdG8gd29yay4gQWZ0ZXIgYmFzaWMgaW5pdGlhbGl6aW5nCi0gKiBpdHMgb3duIGRldmljZXMsIGl0IGNhbGxzIGJhc2Vib2FyZCdzIGluaXQgZnVuY3Rpb24uCisgKiBpdHMgb3duIGRldmljZXMsIGl0IGNhbGxzIHRoZSBiYXNlYm9hcmQncyBpbml0IGZ1bmN0aW9uLgogICovCiAKIGV4dGVybiB2b2lkIG14MzFsaWxseV9kYl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFsaXRlLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWxpdGUuaAppbmRleCAyYjJkYTAzLi5jMWFkMGFlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFsaXRlLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFsaXRlLmgKQEAgLTMyLDcgKzMyLDcgQEAKIAogLyoKICAqIFRoaXMgQ1BVIG1vZHVsZSBuZWVkcyBhIGJhc2Vib2FyZCB0byB3b3JrLiBBZnRlciBiYXNpYyBpbml0aWFsaXppbmcKLSAqIGl0cyBvd24gZGV2aWNlcywgaXQgY2FsbHMgYmFzZWJvYXJkJ3MgaW5pdCBmdW5jdGlvbi4KKyAqIGl0cyBvd24gZGV2aWNlcywgaXQgY2FsbHMgdGhlIGJhc2Vib2FyZCdzIGluaXQgZnVuY3Rpb24uCiAgKi8KIAogZXh0ZXJuIHZvaWQgbXgzMWxpdGVfZGJfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxbW9ib2FyZC5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFtb2JvYXJkLmgKaW5kZXggMzZmZjNjZS4uZGUxNDU0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFtb2JvYXJkLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFtb2JvYXJkLmgKQEAgLTMxLDcgKzMxLDcgQEAKIAogLyoKICAqIFRoaXMgQ1BVIG1vZHVsZSBuZWVkcyBhIGJhc2Vib2FyZCB0byB3b3JrLiBBZnRlciBiYXNpYyBpbml0aWFsaXppbmcKLSAqIGl0cyBvd24gZGV2aWNlcywgaXQgY2FsbHMgYmFzZWJvYXJkJ3MgaW5pdCBmdW5jdGlvbi4KKyAqIGl0cyBvd24gZGV2aWNlcywgaXQgY2FsbHMgdGhlIGJhc2Vib2FyZCdzIGluaXQgZnVuY3Rpb24uCiAgKi8KIAogZXh0ZXJuIHZvaWQgbXgzMW1vYm9hcmRfZGV2Ym9hcmRfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDM1cGRrLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzNXBkay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODNmMWMwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDM1cGRrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDM1UERLX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9NWDM1UERLX0hfXwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfTVgzNVBES19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1wY20wMzcuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1wY20wMzcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0MTE3MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtcGNtMDM3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwOCBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NWENfQk9BUkRfUENNMDM3X0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9QQ00wMzdfSF9fCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19CT0FSRF9QQ00wMzdfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtcGNtMDM4LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtcGNtMDM4LmgKaW5kZXggNDEwZjk3OC4uNmYzNzFlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLXBjbTAzOC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1wY20wMzguaApAQCAtMjIsNyArMjIsNyBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIC8qCiAgKiBUaGlzIENQVSBtb2R1bGUgbmVlZHMgYSBiYXNlYm9hcmQgdG8gd29yay4gQWZ0ZXIgYmFzaWMgaW5pdGlhbGl6aW5nCi0gKiBpdHMgb3duIGRldmljZXMsIGl0IGNhbGxzIGJhc2Vib2FyZCdzIGluaXQgZnVuY3Rpb24uCisgKiBpdHMgb3duIGRldmljZXMsIGl0IGNhbGxzIHRoZSBiYXNlYm9hcmQncyBpbml0IGZ1bmN0aW9uLgogICogVE9ETzogQWRkIHlvdXIgb3duIGJhc2Vib2FyZCBpbml0IGZ1bmN0aW9uIGFuZCBjYWxsIGl0IGZyb20KICAqIGluc2lkZSBwY20wMzhfaW5pdCgpLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1wY20wNDMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1wY20wNDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjNGUxNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtcGNtMDQzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwOCBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NWENfQk9BUkRfUENNMDQzX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19CT0FSRF9QQ00wNDNfSF9fCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19CT0FSRF9QQ00wNDNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtcW9uZy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLXFvbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4OGM3YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtcW9uZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA5IElseWEgWWFub2ssIEVtY3JhZnQgU3lzdGVtcyBMdGQsIDx5YW5va0BlbWNyYWZ0LmNvbT4KLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX1FPTkdfSF9fCi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX1FPTkdfSF9fCi0KLS8qIE5PUiBGTEFTSCAqLwotI2RlZmluZSBRT05HX05PUl9TSVpFCQkoMTI4KjEwMjQqMTAyNCkKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX1FPTkdfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDBiNmUxMWUuLjI1NjA2NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0yMyw4ICsyMyw4IEBACiAjZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKICNlbmRpZgogI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgotI2RlZmluZSBVQVJUX1BBRERSCVVBUlQxX0JBU0VfQUREUgotI2RlZmluZSBVQVJUX1ZBRERSCU1YMjVfQUlQUzFfSU9fQUREUkVTUyhVQVJUMV9CQVNFX0FERFIpCisjZGVmaW5lIFVBUlRfUEFERFIJTVgyNV9VQVJUMV9CQVNFX0FERFIKKyNkZWZpbmUgVUFSVF9WQUREUglNWDI1X0FJUFMxX0lPX0FERFJFU1MoTVgyNV9VQVJUMV9CQVNFX0FERFIpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX01YMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY2OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFBlbmd1dHJvbml4CisgKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKKwkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW1fcmVzb3VyY2VzLAorCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZV9kYXRhKTsKKworI2lmIGRlZmluZWQgKENPTkZJR19DQU5fRkxFWENBTikgfHwgZGVmaW5lZCAoQ09ORklHX0NBTl9GTEVYQ0FOX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9jYW4vcGxhdGZvcm0vZmxleGNhbi5oPgorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfZmxleGNhbihpbnQgaWQsCisJCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIHJlc291cmNlX3NpemVfdCBpb3NpemUsCisJCXJlc291cmNlX3NpemVfdCBpcnEsCisJCWNvbnN0IHN0cnVjdCBmbGV4Y2FuX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKKyNlbHNlCisvKiB0aGUgaWZkZWYgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgZmxleGNhbiBkcml2ZXIgaGFzIGJlZW4gbWVyZ2VkICovCitzdHJ1Y3QgZmxleGNhbl9wbGF0Zm9ybV9kYXRhOworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9mbGV4Y2FuKGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlycSwKKwkJY29uc3Qgc3RydWN0IGZsZXhjYW5fcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2luY2x1ZGUgPG1hY2gvaTJjLmg+CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfaTJjKGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwgaW50IGlycSwKKwkJY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CisKKyNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfdWFydF8zaXJxKGludCBpZCwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwKKwkJcmVzb3VyY2Vfc2l6ZV90IGlycXJ4LCByZXNvdXJjZV9zaXplX3QgaXJxdHgsCisJCXJlc291cmNlX3NpemVfdCBpcnFydHMsCisJCWNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX2lteF91YXJ0XzFpcnEoaW50IGlkLAorCQlyZXNvdXJjZV9zaXplX3QgaW9iYXNlLCByZXNvdXJjZV9zaXplX3QgaW9zaXplLAorCQlyZXNvdXJjZV9zaXplX3QgaXJxLAorCQljb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CisKKyNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9teGNfbmFuZF92MShyZXNvdXJjZV9zaXplX3QgaW9iYXNlLAorCQlpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfbXhjX25hbmRfdjIxKHJlc291cmNlX3NpemVfdCBpb2Jhc2UsCisJCWludCBpcnEsIGNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CisKKyNpbmNsdWRlIDxtYWNoL3NwaS5oPgorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfc3BpX2lteChpbnQgaWQsCisJCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIHJlc291cmNlX3NpemVfdCBpb3NpemUsIGludCBpcnEsCisJCWNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciAqcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS1teDEtbXgyLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0ODcwYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kbWEtbXgxLW14Mi5oCi0gKgotICogIGkuTVggRE1BIHJlZ2lzdHJhdGlvbiBhbmQgSVJRIGRpc3BhdGNoaW5nCi0gKgotICogQ29weXJpZ2h0IDIwMDYgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgotICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgotICogQ29weXJpZ2h0IDIwMDggU2FzY2hhIEhhdWVyLCA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0RNQV9ICi0KLSNkZWZpbmUgSU1YX0RNQV9DSEFOTkVMUyAgMTYKLQotI2RlZmluZSBETUFfTU9ERV9SRUFECQkwCi0jZGVmaW5lIERNQV9NT0RFX1dSSVRFCQkxCi0jZGVmaW5lIERNQV9NT0RFX01BU0sJCTEKLQotI2RlZmluZSBNWDFfRE1BX1JFRyhvZmZzZXQpCU1YMV9JT19BRERSRVNTKE1YMV9ETUFfQkFTRV9BRERSICsgKG9mZnNldCkpCi0KLS8qIERNQSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZSBNWDFfRE1BX0RJTVIJCU1YMV9ETUFfUkVHKDB4MDgpCi0KLS8qIENoYW5uZWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBNWDFfRE1BX0NDUih4KQkJTVgxX0RNQV9SRUcoMHg4YyArICgoeCkgPDwgNikpCi0KLSNkZWZpbmUgSU1YX0RNQV9NRU1TSVpFXzMyCSgwIDw8IDQpCi0jZGVmaW5lIElNWF9ETUFfTUVNU0laRV84CSgxIDw8IDQpCi0jZGVmaW5lIElNWF9ETUFfTUVNU0laRV8xNgkoMiA8PCA0KQotI2RlZmluZSBJTVhfRE1BX1RZUEVfTElORUFSCSgwIDw8IDEwKQotI2RlZmluZSBJTVhfRE1BX1RZUEVfMkQJCSgxIDw8IDEwKQotI2RlZmluZSBJTVhfRE1BX1RZUEVfRklGTwkoMiA8PCAxMCkKLQotI2RlZmluZSBJTVhfRE1BX0VSUl9CVVJTVCAgICAgKDEgPDwgMCkKLSNkZWZpbmUgSU1YX0RNQV9FUlJfUkVRVUVTVCAgICgxIDw8IDEpCi0jZGVmaW5lIElNWF9ETUFfRVJSX1RSQU5TRkVSICAoMSA8PCAyKQotI2RlZmluZSBJTVhfRE1BX0VSUl9CVUZGRVIgICAgKDEgPDwgMykKLSNkZWZpbmUgSU1YX0RNQV9FUlJfVElNRU9VVCAgICgxIDw8IDQpCi0KLWludAotaW14X2RtYV9jb25maWdfY2hhbm5lbChpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IGNvbmZpZ19wb3J0LAotCXVuc2lnbmVkIGludCBjb25maWdfbWVtLCB1bnNpZ25lZCBpbnQgZG1hcmVxLCBpbnQgaHdfY2hhaW5pbmcpOwotCi12b2lkCi1pbXhfZG1hX2NvbmZpZ19idXJzdGxlbihpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IGJ1cnN0bGVuKTsKLQotaW50Ci1pbXhfZG1hX3NldHVwX3NpbmdsZShpbnQgY2hhbm5lbCwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKLQkJdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsIHVuc2lnbmVkIGludCBkZXZfYWRkciwKLQkJdW5zaWduZWQgaW50IGRtYW1vZGUpOwotCi0KLS8qCi0gKiBVc2UgdGhpcyBmbGFnIGFzIHRoZSBkbWFfbGVuZ3RoIGFyZ3VtZW50IHRvIGlteF9kbWFfc2V0dXBfc2coKQotICogdG8gY3JlYXRlIGFuIGVuZGxlc3MgcnVubmluZyBkbWEgbG9vcC4gVGhlIGVuZCBvZiB0aGUgc2NhdHRlcmxpc3QKLSAqIG11c3QgYmUgbGlua2VkIHRvIHRoZSBiZWdpbm5pbmcgZm9yIHRoaXMgdG8gd29yay4KLSAqLwotI2RlZmluZSBJTVhfRE1BX0xFTkdUSF9MT09QCSgodW5zaWduZWQgaW50KS0xKQotCi1pbnQKLWlteF9kbWFfc2V0dXBfc2coaW50IGNoYW5uZWwsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCXVuc2lnbmVkIGludCBzZ2NvdW50LCB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwKLQkJdW5zaWduZWQgaW50IGRldl9hZGRyLCB1bnNpZ25lZCBpbnQgZG1hbW9kZSk7Ci0KLWludAotaW14X2RtYV9zZXR1cF9oYW5kbGVycyhpbnQgY2hhbm5lbCwKLQkJdm9pZCAoKmlycV9oYW5kbGVyKSAoaW50LCB2b2lkICopLAotCQl2b2lkICgqZXJyX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgaW50KSwgdm9pZCAqZGF0YSk7Ci0KLWludAotaW14X2RtYV9zZXR1cF9wcm9ncmVzc2lvbl9oYW5kbGVyKGludCBjaGFubmVsLAotCQl2b2lkICgqcHJvZ19oYW5kbGVyKSAoaW50LCB2b2lkKiwgc3RydWN0IHNjYXR0ZXJsaXN0KikpOwotCi12b2lkIGlteF9kbWFfZW5hYmxlKGludCBjaGFubmVsKTsKLQotdm9pZCBpbXhfZG1hX2Rpc2FibGUoaW50IGNoYW5uZWwpOwotCi1pbnQgaW14X2RtYV9yZXF1ZXN0KGludCBjaGFubmVsLCBjb25zdCBjaGFyICpuYW1lKTsKLQotdm9pZCBpbXhfZG1hX2ZyZWUoaW50IGNoYW5uZWwpOwotCi1lbnVtIGlteF9kbWFfcHJpbyB7Ci0JRE1BX1BSSU9fSElHSCA9IDAsCi0JRE1BX1BSSU9fTUVESVVNID0gMSwKLQlETUFfUFJJT19MT1cgPSAyCi19OwotCi1pbnQgaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8oY29uc3QgY2hhciAqbmFtZSwgZW51bSBpbXhfZG1hX3ByaW8gcHJpbyk7Ci0KLSNlbmRpZgkvKiBfQVNNX0FSQ0hfTVhDX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZXVrcmVhLWJhc2Vib2FyZHMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ldWtyZWEtYmFzZWJvYXJkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGUzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZXVrcmVhLWJhc2Vib2FyZHMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVyaWMgQmVuYXJkIC0gZXJpY0BldWtyZWEuY29tCisgKgorICogQmFzZWQgb24gYm9hcmQtcGNtMDM4Lmggd2hpY2ggaXMgOgorICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydCAoa2VybmVsQHBlbmd1dHJvbml4LmRlKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19NQUNIX0VVS1JFQV9CQVNFQk9BUkRTX0hfXworI2RlZmluZSBfX01BQ0hfRVVLUkVBX0JBU0VCT0FSRFNfSF9fCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogVGhpcyBDUFUgbW9kdWxlIG5lZWRzIGEgYmFzZWJvYXJkIHRvIHdvcmsuIEFmdGVyIGJhc2ljIGluaXRpYWxpemluZworICogaXRzIG93biBkZXZpY2VzLCBpdCBjYWxscyBiYXNlYm9hcmQncyBpbml0IGZ1bmN0aW9uLgorICogVE9ETzogQWRkIHlvdXIgb3duIGJhc2Vib2FyZCBpbml0IGZ1bmN0aW9uIGFuZCBjYWxsIGl0IGZyb20KKyAqIGluc2lkZSBldWtyZWFfY3B1aW14MjVfaW5pdCgpIGV1a3JlYV9jcHVpbXgyN19pbml0KCkKKyAqIGV1a3JlYV9jcHVpbXgzNV9pbml0KCkgb3IgZXVrcmVhX2NwdWlteDUxX2luaXQoKS4KKyAqCisgKiBUaGlzIGV4YW1wbGUgaGVyZSBpcyBmb3IgdGhlIGRldmVsb3BtZW50IGJvYXJkLiBSZWZlcgorICogbWFjaC1teDI1L2V1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5jIGZvciBjcHVpbXgyNQorICogbWFjaC1pbXgvZXVrcmVhX21iaW14MjctYmFzZWJvYXJkLmMgZm9yIGNwdWlteDI3CisgKiBtYWNoLW14My9ldWtyZWFfbWJpbXhzZC1iYXNlYm9hcmQuYyBmb3IgY3B1aW14MzUKKyAqIG1hY2gtbXg1L2V1a3JlYV9tYmlteDUxLWJhc2Vib2FyZC5jIGZvciBjcHVpbXg1MQorICovCisKK2V4dGVybiB2b2lkIGV1a3JlYV9tYmlteDI1X2Jhc2Vib2FyZF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZXVrcmVhX21iaW14MjdfYmFzZWJvYXJkX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBldWtyZWFfbWJpbXgzNV9iYXNlYm9hcmRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGV1a3JlYV9tYmlteDUxX2Jhc2Vib2FyZF9pbml0KHZvaWQpOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fTUFDSF9FVUtSRUFfQkFTRUJPQVJEU19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDg5NGQyZjguLjY2MWZiYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMzMsOSArMzMsMTEgQEAKIHN0cnVjdCBteGNfZ3Bpb19wb3J0IHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IGlycTsKKwlpbnQgaXJxX2hpZ2g7CiAJaW50IHZpcnR1YWxfaXJxX3N0YXJ0OwogCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKIAl1MzIgYm90aF9lZGdlczsKKwlzcGlubG9ja190IGxvY2s7CiB9OwogCiBpbnQgbXhjX2dwaW9faW5pdChzdHJ1Y3QgbXhjX2dwaW9fcG9ydCosIGludCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgyNS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14MjUuaAppbmRleCBmMzkyMjBkLi5kN2Y1MmM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgyNS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDI1LmgKQEAgLTI1Miw2ICsyNTIsNyBAQAogI2RlZmluZSBNWDI1X1BBRF9PRV9BQ0RfX0dQSU9fMV8yNQlJT01VWF9QQUQoMHgzMGMsIDB4MTE0LCAweDE1LCAwLCAwLCBOT19QQURfQ1RSTCkKIAogI2RlZmluZSBNWDI1X1BBRF9DT05UUkFTVF9fQ09OVFJBU1QJSU9NVVhfUEFEKDB4MzEwLCAweDExOCwgMHgxMCwgMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YMjVfUEFEX0NPTlRSQVNUX19QV000X1BXTU8JSU9NVVhfUEFEKDB4MzEwLCAweDExOCwgMHgxNCwgMCwgMCwgTk9fUEFEX0NUUkwpCiAjZGVmaW5lIE1YMjVfUEFEX0NPTlRSQVNUX19GRUNfQ1JTCUlPTVVYX1BBRCgweDMxMCwgMHgxMTgsIDB4MTUsIDB4NTA4LCAxLCBOT19QQURfQ1RSTCkKIAogI2RlZmluZSBNWDI1X1BBRF9QV01fX1BXTQkJSU9NVVhfUEFEKDB4MzE0LCAweDExYywgMHgxMCwgMCwgMCwgTk9fUEFEX0NUUkwpCkBAIC0zNzEsMzAgKzM3Miw0MSBAQAogI2RlZmluZSBNWDI1X1BBRF9TRDFfREFUQTNfX0ZFQ19DUlMJSU9NVVhfUEFEKDB4MzljLCAweDFhNCwgMHgxMCwgMHg1MDgsIDIsIE5PX1BBRF9DVFJMKQogI2RlZmluZSBNWDI1X1BBRF9TRDFfREFUQTNfX0dQSU9fMl8yOAlJT01VWF9QQUQoMHgzOWMsIDB4MWE0LCAweDE1LCAwLCAwLCBOT19QQURfQ1RSTCkKIAotI2RlZmluZSBNWDI1X1BBRF9LUFBfUk9XMF9fS1BQX1JPVzAJSU9NVVhfUEFEKDB4M2EwLCAweDFhOCwgMHgxMCwgMCwgMCwgUEFEX0NUTF9QS0UpCisjZGVmaW5lIEtQUF9DVExfUk9XCShQQURfQ1RMX1BLRSB8IFBBRF9DVExfUFVFIHwgUEFEX0NUTF9QVVNfMTAwS19VUCkKKyNkZWZpbmUgS1BQX0NUTF9DT0wJKFBBRF9DVExfUEtFIHwgUEFEX0NUTF9QVUUgfCBQQURfQ1RMX1BVU18xMDBLX1VQIHwgUEFEX0NUTF9PREUpCisKKyNkZWZpbmUgTVgyNV9QQURfS1BQX1JPVzBfX0tQUF9ST1cwCUlPTVVYX1BBRCgweDNhMCwgMHgxYTgsIDB4MTAsIDAsIDAsIEtQUF9DVExfUk9XKQogI2RlZmluZSBNWDI1X1BBRF9LUFBfUk9XMF9fR1BJT18yXzI5CUlPTVVYX1BBRCgweDNhMCwgMHgxYTgsIDB4MTUsIDAsIDAsIE5PX1BBRF9DVFJMKQogCi0jZGVmaW5lIE1YMjVfUEFEX0tQUF9ST1cxX19LUFBfUk9XMQlJT01VWF9QQUQoMHgzYTQsIDB4MWFjLCAweDEwLCAwLCAwLCBQQURfQ1RMX1BLRSkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX1JPVzFfX0tQUF9ST1cxCUlPTVVYX1BBRCgweDNhNCwgMHgxYWMsIDB4MTAsIDAsIDAsIEtQUF9DVExfUk9XKQogI2RlZmluZSBNWDI1X1BBRF9LUFBfUk9XMV9fR1BJT18yXzMwCUlPTVVYX1BBRCgweDNhNCwgMHgxYWMsIDB4MTUsIDAsIDAsIE5PX1BBRF9DVFJMKQogCi0jZGVmaW5lIE1YMjVfUEFEX0tQUF9ST1cyX19LUFBfUk9XMglJT01VWF9QQUQoMHgzYTgsIDB4MWIwLCAweDEwLCAwLCAwLCBQQURfQ1RMX1BLRSkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX1JPVzJfX0tQUF9ST1cyCUlPTVVYX1BBRCgweDNhOCwgMHgxYjAsIDB4MTAsIDAsIDAsIEtQUF9DVExfUk9XKQogI2RlZmluZSBNWDI1X1BBRF9LUFBfUk9XMl9fQ1NJX0QwCUlPTVVYX1BBRCgweDNhOCwgMHgxYjAsIDB4MTMsIDB4NDg4LCAyLCBOT19QQURfQ1RSTCkKICNkZWZpbmUgTVgyNV9QQURfS1BQX1JPVzJfX0dQSU9fMl8zMQlJT01VWF9QQUQoMHgzYTgsIDB4MWIwLCAweDE1LCAwLCAwLCBOT19QQURfQ1RSTCkKIAotI2RlZmluZSBNWDI1X1BBRF9LUFBfUk9XM19fS1BQX1JPVzMJSU9NVVhfUEFEKDB4M2FjLCAweDFiNCwgMHgxMCwgMCwgMCwgUEFEX0NUTF9QS0UpCisjZGVmaW5lIE1YMjVfUEFEX0tQUF9ST1czX19LUFBfUk9XMwlJT01VWF9QQUQoMHgzYWMsIDB4MWI0LCAweDEwLCAwLCAwLCBLUFBfQ1RMX1JPVykKICNkZWZpbmUgTVgyNV9QQURfS1BQX1JPVzNfX0NTSV9MRDEJSU9NVVhfUEFEKDB4M2FjLCAweDFiNCwgMHgxMywgMHg0OGMsIDIsIE5PX1BBRF9DVFJMKQogI2RlZmluZSBNWDI1X1BBRF9LUFBfUk9XM19fR1BJT18zXzAJSU9NVVhfUEFEKDB4M2FjLCAweDFiNCwgMHgxNSwgMCwgMCwgTk9fUEFEX0NUUkwpCiAKLSNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDBfX0tQUF9DT0wwCUlPTVVYX1BBRCgweDNiMCwgMHgxYjgsIDB4MTAsIDAsIDAsIFBBRF9DVExfUEtFIHwgUEFEX0NUTF9PREUpCisjZGVmaW5lIE1YMjVfUEFEX0tQUF9DT0wwX19LUFBfQ09MMAlJT01VWF9QQUQoMHgzYjAsIDB4MWI4LCAweDEwLCAwLCAwLCBLUFBfQ1RMX0NPTCkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDBfX1VBUlQ0X1JYRF9NVVggSU9NVVhfUEFEKDB4M2IwLCAweDFiOCwgMHgxMSwgMHg1NzAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDI1X1BBRF9LUFBfQ09MMF9fQVVENV9UWEQJSU9NVVhfUEFEKDB4M2IwLCAweDFiOCwgMHgxMiwgMCwgMCwgUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1BVU18xMDBLX1VQKQogI2RlZmluZSBNWDI1X1BBRF9LUFBfQ09MMF9fR1BJT18zXzEJSU9NVVhfUEFEKDB4M2IwLCAweDFiOCwgMHgxNSwgMCwgMCwgTk9fUEFEX0NUUkwpCiAKLSNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDFfX0tQUF9DT0wxCUlPTVVYX1BBRCgweDNiNCwgMHgxYmMsIDB4MTAsIDAsIDAsIFBBRF9DVExfUEtFIHwgUEFEX0NUTF9PREUpCisjZGVmaW5lIE1YMjVfUEFEX0tQUF9DT0wxX19LUFBfQ09MMQlJT01VWF9QQUQoMHgzYjQsIDB4MWJjLCAweDEwLCAwLCAwLCBLUFBfQ1RMX0NPTCkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDFfX1VBUlQ0X1RYRF9NVVggSU9NVVhfUEFEKDB4M2I0LCAweDFiYywgMHgxMSwgMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YMjVfUEFEX0tQUF9DT0wxX19BVUQ1X1JYRAlJT01VWF9QQUQoMHgzYjQsIDB4MWJjLCAweDEyLCAwLCAwLCBQQURfQ1RMX1BLRSB8IFBBRF9DVExfUFVTXzEwMEtfVVApCiAjZGVmaW5lIE1YMjVfUEFEX0tQUF9DT0wxX19HUElPXzNfMglJT01VWF9QQUQoMHgzYjQsIDB4MWJjLCAweDE1LCAwLCAwLCBOT19QQURfQ1RSTCkKIAotI2RlZmluZSBNWDI1X1BBRF9LUFBfQ09MMl9fS1BQX0NPTDIJSU9NVVhfUEFEKDB4M2I4LCAweDFjMCwgMHgxMCwgMCwgMCwgUEFEX0NUTF9QS0UgfCBQQURfQ1RMX09ERSkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDJfX0tQUF9DT0wyCUlPTVVYX1BBRCgweDNiOCwgMHgxYzAsIDB4MTAsIDAsIDAsIEtQUF9DVExfQ09MKQorI2RlZmluZSBNWDI1X1BBRF9LUFBfQ09MMl9fVUFSVDRfUlRTCUlPTVVYX1BBRCgweDNiOCwgMHgxYzAsIDB4MTEsIDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDI1X1BBRF9LUFBfQ09MMl9fQVVENV9UWEMJSU9NVVhfUEFEKDB4M2I4LCAweDFjMCwgMHgxMiwgMCwgMCwgUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1BVU18xMDBLX1VQKQogI2RlZmluZSBNWDI1X1BBRF9LUFBfQ09MMl9fR1BJT18zXzMJSU9NVVhfUEFEKDB4M2I4LCAweDFjMCwgMHgxNSwgMCwgMCwgTk9fUEFEX0NUUkwpCiAKLSNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDNfX0tQUF9DT0wzCUlPTVVYX1BBRCgweDNiYywgMHgxYzQsIDB4MTAsIDAsIDAsIFBBRF9DVExfUEtFIHwgUEFEX0NUTF9PREUpCisjZGVmaW5lIE1YMjVfUEFEX0tQUF9DT0wzX19LUFBfQ09MMwlJT01VWF9QQUQoMHgzYmMsIDB4MWM0LCAweDEwLCAwLCAwLCBLUFBfQ1RMX0NPTCkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDNfX1VBUlQ0X0NUUwlJT01VWF9QQUQoMHgzYmMsIDB4MWM0LCAweDExLCAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVgyNV9QQURfS1BQX0NPTDNfX0FVRDVfVFhGUwlJT01VWF9QQUQoMHgzYmMsIDB4MWM0LCAweDEyLCAwLCAwLCBQQURfQ1RMX1BLRSB8IFBBRF9DVExfUFVTXzEwMEtfVVApCiAjZGVmaW5lIE1YMjVfUEFEX0tQUF9DT0wzX19HUElPXzNfNAlJT01VWF9QQUQoMHgzYmMsIDB4MWM0LCAweDE1LCAwLCAwLCBOT19QQURfQ1RSTCkKIAogI2RlZmluZSBNWDI1X1BBRF9GRUNfTURDX19GRUNfTURDCUlPTVVYX1BBRCgweDNjMCwgMHgxYzgsIDB4MTAsIDAsIDAsIE5PX1BBRF9DVFJMKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUxLmgKaW5kZXggYWIwZjk1ZC4uMjFiZmE0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1MS5oCkBAIC0yNyw4ICsyNyw4IEBACiAJSU9NVVhfQ09ORklHX0FMVDUsCiAJSU9NVVhfQ09ORklHX0FMVDYsCiAJSU9NVVhfQ09ORklHX0FMVDcsCi0JSU9NVVhfQ09ORklHX0dQSU8sCS8qIGFkZGVkIHRvIGhlbHAgdXNlciB1c2UgR1BJTyBtb2RlICovCi0JSU9NVVhfQ09ORklHX1NJT04gPSAweDEgPDwgNCwJLyogTE9PUEJBQ0s6TVVYIFNJT04gYml0ICovCisJSU9NVVhfQ09ORklHX0dQSU8sICAgICAgLyogYWRkZWQgdG8gaGVscCB1c2VyIHVzZSBHUElPIG1vZGUgKi8KKwlJT01VWF9DT05GSUdfU0lPTiA9IDB4MSA8PCA0LCAgIC8qIExPT1BCQUNLOk1VWCBTSU9OIGJpdCAqLwogfSBpb211eF9waW5fY2ZnX3Q7CiAKIC8qIFBhZCBjb250cm9sIGdyb3VwaW5ncyAqLwpAQCAtMzgsNiArMzgsOCBAQAogCQkJCVBBRF9DVExfU1JFX0ZBU1QpCiAjZGVmaW5lIE1YNTFfVUFSVDNfUEFEX0NUUkwJKFBBRF9DVExfUEtFIHwgUEFEX0NUTF9EU0VfSElHSCB8IFwKIAkJCQlQQURfQ1RMX1NSRV9GQVNUKQorI2RlZmluZSBNWDUxX0kyQ19QQURfQ1RSTAkoUEFEX0NUTF9TUkVfRkFTVCB8IFBBRF9DVExfT0RFIHwgXAorCQkJCVBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVU18xMDBLX1VQIHwgUEFEX0NUTF9IWVMpCiAjZGVmaW5lIE1YNTFfVVNCSDFfUEFEX0NUUkwJKFBBRF9DVExfU1JFX0ZBU1QgfCBQQURfQ1RMX0RTRV9ISUdIIHwgXAogCQkJCVBBRF9DVExfUFVTXzEwMEtfVVAgfCBQQURfQ1RMX1BVRSB8IFwKIAkJCQlQQURfQ1RMX1BLRSB8IFBBRF9DVExfSFlTKQpAQCAtNDYsMjg5ICs0OCwyNzggQEAKIAogLyoKICAqIFRoZSBuYW1pbmcgY29udmVudGlvbiBmb3IgdGhlIHBhZCBtb2RlcyBpcyBNWDUxX1BBRF88cGFkbmFtZT5fXzxwYWRtb2RlPgotICogSWYgPHBhZG5hbWU+IG9yIDxwYWRtb2RlPiByZWZlcnMgdG8gYSBHUElPLCBpdCBpcyBuYW1lZAotICogR1BJT188dW5pdD5fPG51bT4gc2VlIGFsc28gaW9tdXgtdjMuaAorICogSWYgPHBhZG5hbWU+IG9yIDxwYWRtb2RlPiByZWZlcnMgdG8gYSBHUElPLCBpdCBpcyBuYW1lZCBHUElPXzx1bml0Pl88bnVtPgorICogU2VlIGFsc28gaW9tdXgtdjMuaAogICovCiAKLS8qCi0gKiBGSVhNRTogVGhpcyB3YXMgY29udmVydGVkIHVzaW5nIHNjcmlwdHMgZnJvbSBleGlzdGluZyBGcmVlc2NhbGUgY29kZSB0bwotICogdGhpcyBmb3JtIHVzZWQgdXBzdHJlYW0uIE5lZWQgdG8gdmVyaWZ5IHRoZSBuYW1lIGZvcm1hdC4KLSAqLwotCi0vKgkJCQkJCVBBRCAgICAgIE1VWCAgIEFMVCBJTlBTRSBQQVRIIFBBRENUUkwgKi8KLQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzJfMF9fRUlNX0QxNglJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xX19FSU1fRDE3CUlPTVVYX1BBRCgweDNmNCwgMHgwNjAsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzJfX0VJTV9EMTgJSU9NVVhfUEFEKDB4M2Y4LCAweDA2NCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzJfM19fRUlNX0QxOQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl80X19FSU1fRDIwCUlPTVVYX1BBRCgweDQwMCwgMHgwNmMsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzVfX0VJTV9EMjEJSU9NVVhfUEFEKDB4NDA0LCAweDA3MCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19HUElPXzJfNQlJT01VWF9QQUQoMHg0MDQsIDB4MDcwLCBJT01VWF9DT05GSUdfQUxUMSwgMHgwLCAgIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzZfX0VJTV9EMjIJSU9NVVhfUEFEKDB4NDA4LCAweDA3NCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzJfN19fRUlNX0QyMwlJT01VWF9QQUQoMHg0MGMsIDB4MDc4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0KLS8qIEJhYmJhZ2UgVUFSVDMgKi8KLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fVUFSVDNfQ1RTCUlPTVVYX1BBRCgweDQxMCwgMHgwN2MsIElPTVVYX0NPTkZJR19BTFQzLCAweDAsIDAsIE1YNTFfVUFSVDNfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRAlJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCBJT01VWF9DT05GSUdfQUxUMywgMHg5ZjQsIDAsIE1YNTFfVUFSVDNfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX1VBUlQzX1RYRAlJT01VWF9QQUQoMHg0MTgsIDB4MDg0LCBJT01VWF9DT05GSUdfQUxUMywgMHgwLCAwLCBNWDUxX1VBUlQzX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19VQVJUM19SVFMJSU9NVVhfUEFEKDB4NDFjLCAweDA4OCwgSU9NVVhfQ09ORklHX0FMVDMsIDB4OWYwLCAwLCBNWDUxX1VBUlQzX1BBRF9DVFJMKQotCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0VJTV9EMjgJSU9NVVhfUEFEKDB4NDIwLCAweDA4YywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI5X19FSU1fRDI5CUlPTVVYX1BBRCgweDQyNCwgMHgwOTAsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fRUlNX0QzMAlJT01VWF9QQUQoMHg0MjgsIDB4MDk0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX0VJTV9EMzEJSU9NVVhfUEFEKDB4NDJjLCAweDA5YywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xMF9fRUlNX0ExNglJT01VWF9QQUQoMHg0MzAsIDB4MDljLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xMV9fRUlNX0ExNwlJT01VWF9QQUQoMHg0MzQsIDB4MGEwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xMl9fRUlNX0ExOAlJT01VWF9QQUQoMHg0MzgsIDB4MGE0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xM19fRUlNX0ExOQlJT01VWF9QQUQoMHg0M2MsIDB4MGE4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xNF9fRUlNX0EyMAlJT01VWF9QQUQoMHg0NDAsIDB4MGFjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xNV9fRUlNX0EyMQlJT01VWF9QQUQoMHg0NDQsIDB4MGIwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xNl9fRUlNX0EyMglJT01VWF9QQUQoMHg0NDgsIDB4MGI0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8xN19fRUlNX0EyMwlJT01VWF9QQUQoMHg0NGMsIDB4MGI4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0KLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzE4X19FSU1fQTI0CUlPTVVYX1BBRCgweDQ1MCwgMHgwYmMsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzE5X19FSU1fQTI1CUlPTVVYX1BBRCgweDQ1NCwgMHgwYzAsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzIwX19FSU1fQTI2CUlPTVVYX1BBRCgweDQ1OCwgMHgwYzQsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzIxX19FSU1fQTI3CUlPTVVYX1BBRCgweDQ1YywgMHgwYzgsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMF9fRUlNX0VCMAlJT01VWF9QQUQoMHg0NjAsIDB4MGNjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjFfX0VJTV9FQjEJSU9NVVhfUEFEKDB4NDY0LCAweDBkMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzJfMjJfX0VJTV9FQjIJSU9NVVhfUEFEKDB4NDY4LCAweDBkNCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzJfMjNfX0VJTV9FQjMJSU9NVVhfUEFEKDB4NDZjLCAweDBkOCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMl8yNF9fRUlNX09FCUlPTVVYX1BBRCgweDQ3MCwgMHgwZGMsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzI1X19FSU1fQ1MwCUlPTVVYX1BBRCgweDQ3NCwgMHgwZTAsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzI2X19FSU1fQ1MxCUlPTVVYX1BBRCgweDQ3OCwgMHgwZTQsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzI3X19FSU1fQ1MyCUlPTVVYX1BBRCgweDQ3YywgMHgwZTgsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzI4X19FSU1fQ1MzCUlPTVVYX1BBRCgweDQ4MCwgMHgwZWMsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzI5X19FSU1fQ1M0CUlPTVVYX1BBRCgweDQ4NCwgMHgwZjAsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzMwX19FSU1fQ1M1CUlPTVVYX1BBRCgweDQ4OCwgMHgwZjQsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18yXzMxX19FSU1fRFRBQ0sJSU9NVVhfUEFEKDB4NDhjLCAweDBmOCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xX19FSU1fTEJBCUlPTVVYX1BBRCgweDQ5NCwgMHhGQywgMSwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzJfX0VJTV9DUkUJSU9NVVhfUEFEKDB4NEEwLCAweDEwMCwgMSwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRFJBTV9DUzFfX0RSQU1fQ1MxCUlPTVVYX1BBRCgweDREMCwgMHgxMDQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18zX19OQU5ERl9XRV9CCUlPTVVYX1BBRCgweDRFNCwgMHgxMDgsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM180X19OQU5ERl9SRV9CCUlPTVVYX1BBRCgweDRFOCwgMHgxMEMsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM181X19OQU5ERl9BTEUJSU9NVVhfUEFEKDB4NEVDLCAweDExMCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzZfX05BTkRGX0NMRQlJT01VWF9QQUQoMHg0RjAsIDB4MTE0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfN19fTkFOREZfV1BfQglJT01VWF9QQUQoMHg0RjQsIDB4MTE4LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfOF9fTkFOREZfUkIwCUlPTVVYX1BBRCgweDRGOCwgMHgxMUMsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM185X19OQU5ERl9SQjEJSU9NVVhfUEFEKDB4NEZDLCAweDEyMCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzEwX19OQU5ERl9SQjIJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzExX19OQU5ERl9SQjMJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzEyX19HUElPX05BTkQJSU9NVVhfUEFEKDB4NTE0LCAweDEyQywgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLS8qIFJFVklTSVQ6IE5vdCBzdXJlIG9mIHRoZXNlIHZhbHVlcwotCi0gICNkZWZpbmUgTVg1MV9QQURfR1BJT18xX19fTkFOREZfUkI0CUlPTVVYX1BBRCgsICwgLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotICAjZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xM19fTkFOREZfUkI1CUlPTVVYX1BBRCgweDVEOCwgMHgxMzAsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0gICNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzE1X19OQU5ERl9SQjcJSU9NVVhfUEFEKDB4NUUwLCAweDEzOCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSovCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xNF9fTkFOREZfUkI2CUlPTVVYX1BBRCgweDVEQywgMHgxMzQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xNl9fTkFOREZfQ1MwCUlPTVVYX1BBRCgweDUxOCwgMHgxMzAsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xN19fTkFOREZfQ1MxCUlPTVVYX1BBRCgweDUxQywgMHgxMzQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xOF9fTkFOREZfQ1MyCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xOV9fTkFOREZfQ1MzCUlPTVVYX1BBRCgweDUyNCwgMHgxM0MsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18yMF9fTkFOREZfQ1M0CUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18yMV9fTkFOREZfQ1M1CUlPTVVYX1BBRCgweDUyQywgMHgxNDQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18yMl9fTkFOREZfQ1M2CUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18yM19fTkFOREZfQ1M3CUlPTVVYX1BBRCgweDUzNCwgMHgxNEMsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18yNF9fTkFOREZfUkRZX0lOVAlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMjVfX05BTkRGX0QxNQlJT01VWF9QQUQoMHg1M0MsIDB4MTU0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMjZfX05BTkRGX0QxNAlJT01VWF9QQUQoMHg1NDAsIDB4MTU4LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMjdfX05BTkRGX0QxMwlJT01VWF9QQUQoMHg1NDQsIDB4MTVDLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMjhfX05BTkRGX0QxMglJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMjlfX05BTkRGX0QxMQlJT01VWF9QQUQoMHg1NEMsIDB4MTY0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMzBfX05BTkRGX0QxMAlJT01VWF9QQUQoMHg1NTAsIDB4MTY4LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMzFfX05BTkRGX0Q5CUlPTVVYX1BBRCgweDU1NCwgMHgxNkMsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8wX19OQU5ERl9EOAlJT01VWF9QQUQoMHg1NTgsIDB4MTcwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMV9fTkFOREZfRDcJSU9NVVhfUEFEKDB4NTVDLCAweDE3NCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzJfX05BTkRGX0Q2CUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8zX19OQU5ERl9ENQlJT01VWF9QQUQoMHg1NjQsIDB4MTdDLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfNF9fTkFOREZfRDQJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzVfX05BTkRGX0QzCUlPTVVYX1BBRCgweDU2QywgMHgxODQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF82X19OQU5ERl9EMglJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfN19fTkFOREZfRDEJSU9NVVhfUEFEKDB4NTc0LCAweDE4QywgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzhfX05BTkRGX0QwCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18xMl9fQ1NJMV9EOAlJT01VWF9QQUQoMHg1N0MsIDB4MTk0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMTNfX0NTSTFfRDkJSU9NVVhfUEFEKDB4NTgwLCAweDE5OCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTBfX0NTSTFfRDEwCUlPTVVYX1BBRCgweDU4NCwgMHgxOUMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDExX19DU0kxX0QxMQlJT01VWF9QQUQoMHg1ODgsIDB4MUEwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxMl9fQ1NJMV9EMTIJSU9NVVhfUEFEKDB4NThDLCAweDFBNCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTNfX0NTSTFfRDEzCUlPTVVYX1BBRCgweDU5MCwgMHgxQTgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE0X19DU0kxX0QxNAlJT01VWF9QQUQoMHg1OTQsIDB4MUFDLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxNV9fQ1NJMV9EMTUJSU9NVVhfUEFEKDB4NTk4LCAweDFCMCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTZfX0NTSTFfRDE2CUlPTVVYX1BBRCgweDU5QywgMHgxQjQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE3X19DU0kxX0QxNwlJT01VWF9QQUQoMHg1QTAsIDB4MUI4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxOF9fQ1NJMV9EMTgJSU9NVVhfUEFEKDB4NUE0LCAweDFCQywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTlfX0NTSTFfRDE5CUlPTVVYX1BBRCgweDVBOCwgMHgxQzAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfVlNZTkNfX0NTSTFfVlNZTkMJSU9NVVhfUEFEKDB4NUFDLCAweDFDNCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9IU1lOQ19fQ1NJMV9IU1lOQwlJT01VWF9QQUQoMHg1QjAsIDB4MUM4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX1BJWENMS19fQ1NJMV9QSVhDTEsJSU9NVVhfUEFEKDB4NUI0LCAweDAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfTUNMS19fQ1NJMV9NQ0xLCUlPTVVYX1BBRCgweDVCOCwgMHgwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX1BLRTBfX0NTSTFfUEtFMAlJT01VWF9QQUQoMHg4NjAsIDB4MCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzlfX0NTSTJfRDEyCUlPTVVYX1BBRCgweDVCQywgMHgxQ0MsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8xMF9fQ1NJMl9EMTMJSU9NVVhfUEFEKDB4NUMwLCAweDFEMCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzExX19DU0kyX0QxNAlJT01VWF9QQUQoMHg1QzQsIDB4MUQ0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMTJfX0NTSTJfRDE1CUlPTVVYX1BBRCgweDVDOCwgMHgxRDgsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8xMV9fQ1NJMl9EMTYJSU9NVVhfUEFEKDB4NUNDLCAweDFEQywgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzEyX19DU0kyX0QxNwlJT01VWF9QQUQoMHg1RDAsIDB4MUUwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMTFfX0NTSTJfRDE4CUlPTVVYX1BBRCgweDVENCwgMHgxRTQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8xMl9fQ1NJMl9EMTkJSU9NVVhfUEFEKDB4NUQ4LCAweDFFOCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzEzX19DU0kyX1ZTWU5DCUlPTVVYX1BBRCgweDVEQywgMHgxRUMsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8xNF9fQ1NJMl9IU1lOQwlJT01VWF9QQUQoMHg1RTAsIDB4MUYwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMTVfX0NTSTJfUElYQ0xLCUlPTVVYX1BBRCgweDVFNCwgMHgxRjQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfUEtFMF9fQ1NJMl9QS0UwCUlPTVVYX1BBRCgweDgxQywgMHgwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMTZfX0kyQzFfQ0xLCUlPTVVYX1BBRCgweDVFOCwgMHgxRjgsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8xN19fSTJDMV9EQVQJSU9NVVhfUEFEKDB4NUVDLCAweDFGQywgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzE4X19BVUQzX0JCX1RYRAlJT01VWF9QQUQoMHg1RjAsIDB4MjAwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMTlfX0FVRDNfQkJfUlhECUlPTVVYX1BBRCgweDVGNCwgMHgyMDQsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8yMF9fQVVEM19CQl9DSwlJT01VWF9QQUQoMHg1RjgsIDB4MjA4LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMjFfX0FVRDNfQkJfRlMJSU9NVVhfUEFEKDB4NUZDLCAweDIwQywgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT180XzIyX19DU1BJMV9NT1NJCUlPTVVYX1BBRCgweDYwMCwgMHgyMTAsIDMsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fNF8yM19fQ1NQSTFfTUlTTwlJT01VWF9QQUQoMHg2MDQsIDB4MjE0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMjRfX0NTUEkxX1NTMAlJT01VWF9QQUQoMHg2MDgsIDB4MjE4LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMjVfX0NTUEkxX1NTMQlJT01VWF9QQUQoMHg2MEMsIDB4MjFDLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMjZfX0NTUEkxX1JEWQlJT01VWF9QQUQoMHg2MTAsIDB4MjIwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzRfMjdfX0NTUEkxX1NDTEsJSU9NVVhfUEFEKDB4NjE0LCAweDIyNCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLQotLyogQmFiYmFnZSBVQVJUMSAqLwotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SWERfX1VBUlQxX1JYRAlJT01VWF9QQUQoMHg2MTgsIDB4MjI4LAlJT01VWF9DT05GSUdfQUxUMCwgMHg5ZTQsIDAsIE1YNTFfVUFSVDFfUEFEX0NUUkwgfCBQQURfQ1RMX1NSRV9GQVNUKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX1VBUlQxX1RYRAlJT01VWF9QQUQoMHg2MUMsIDB4MjJDLCBJT01VWF9DT05GSUdfQUxUMCwgMHgwLCAwLCBNWDUxX1VBUlQxX1BBRF9DVFJMIHwgUEFEX0NUTF9TUkVfRkFTVCkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDFfUlRTX19VQVJUMV9SVFMJSU9NVVhfUEFEKDB4NjIwLCAweDIzMCwgSU9NVVhfQ09ORklHX0FMVDAsIDB4OWUwLCAwLCBNWDUxX1VBUlQxX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9DVFNfX1VBUlQxX0NUUwlJT01VWF9QQUQoMHg2MjQsIDB4MjM0LCBJT01VWF9DT05GSUdfQUxUMCwgMHgwLCAwLCBNWDUxX1VBUlQxX1BBRF9DVFJMKQotCi0vKiBCYWJiYWdlIFVBUlQyICovCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhECUlPTVVYX1BBRCgweDYyOCwgMHgyMzgsIElPTVVYX0NPTkZJR19BTFQwLCAweDllYywgMiwgTVg1MV9VQVJUMl9QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDJfVFhEX19VQVJUMl9UWEQJSU9NVVhfUEFEKDB4NjJDLCAweDIzQywgSU9NVVhfQ09ORklHX0FMVDAsIDB4MCwgMCwgTVg1MV9VQVJUMl9QQURfQ1RSTCkKLQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfMjJfX1VBUlQzX1JYRAlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfMjNfX1VBUlQzX1RYRAlJT01VWF9QQUQoMHg2MzQsIDB4MjQ0LCAzLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfMjRfX09XSVJFX0xJTkUJSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgMywgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzBfX0tFWV9ST1cwCUlPTVVYX1BBRCgweDYzQywgMHgyNEMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9ST1cxX19LRVlfUk9XMQlJT01VWF9QQUQoMHg2NDAsIDB4MjUwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMl9fS0VZX1JPVzIJSU9NVVhfUEFEKDB4NjQ0LCAweDI1NCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzNfX0tFWV9ST1czCUlPTVVYX1BBRCgweDY0OCwgMHgyNTgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wwX19LRVlfQ09MMAlJT01VWF9QQUQoMHg2NEMsIDB4MjVDLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMV9fS0VZX0NPTDEJSU9NVVhfUEFEKDB4NjUwLCAweDI2MCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDJfX0tFWV9DT0wyCUlPTVVYX1BBRCgweDY1NCwgMHgyNjQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wzX19LRVlfQ09MMwlJT01VWF9QQUQoMHg2NTgsIDB4MjY4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fS0VZX0NPTDQJSU9NVVhfUEFEKDB4NjVDLCAweDI2QywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDVfX0tFWV9DT0w1CUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fVVNCSDFfQ0xLCUlPTVVYX1BBRCgweDY3OCwgMHgyNzgsIElPTVVYX0NPTkZJR19BTFQwLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fVVNCSDFfRElSCUlPTVVYX1BBRCgweDY3QywgMHgyN0MsIElPTVVYX0NPTkZJR19BTFQwLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQCUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIElPTVVYX0NPTkZJR19BTFQwLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fR1BJT18xXzI3CUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIElPTVVYX0NPTkZJR19HUElPLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX05YVF9fVVNCSDFfTlhUCUlPTVVYX1BBRCgweDY4NCwgMHgyODQsIElPTVVYX0NPTkZJR19BTFQwLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEwX19VU0JIMV9EQVRBMAlJT01VWF9QQUQoMHg2ODgsIDB4Mjg4LCBJT01VWF9DT05GSUdfQUxUMCwgMHgwLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMV9fVVNCSDFfREFUQTEJSU9NVVhfUEFEKDB4NjhDLCAweDI4QywgSU9NVVhfQ09ORklHX0FMVDAsIDB4MCwgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX1VTQkgxX0RBVEEyCUlPTVVYX1BBRCgweDY5MCwgMHgyOTAsIElPTVVYX0NPTkZJR19BTFQwLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEzX19VU0JIMV9EQVRBMwlJT01VWF9QQUQoMHg2OTQsIDB4Mjk0LCBJT01VWF9DT05GSUdfQUxUMCwgMHgwLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNF9fVVNCSDFfREFUQTQJSU9NVVhfUEFEKDB4Njk4LCAweDI5OCwgSU9NVVhfQ09ORklHX0FMVDAsIDB4MCwgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTVfX1VTQkgxX0RBVEE1CUlPTVVYX1BBRCgweDY5QywgMHgyOUMsIElPTVVYX0NPTkZJR19BTFQwLCAweDAsIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19VU0JIMV9EQVRBNglJT01VWF9QQUQoMHg2QTAsIDB4MkEwLCBJT01VWF9DT05GSUdfQUxUMCwgMHgwLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBN19fVVNCSDFfREFUQTcJSU9NVVhfUEFEKDB4NkE0LCAweDJBNCwgSU9NVVhfQ09ORklHX0FMVDAsIDB4MCwgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzBfX0RJMV9QSU4xMQlJT01VWF9QQUQoMHg2QTgsIDB4MkE4LCA0LCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfMV9fREkxX1BJTjEyCUlPTVVYX1BBRCgweDZBQywgMHgyQUMsIDQsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM18yX19ESTFfUElOMTMJSU9NVVhfUEFEKDB4NkIwLCAweDJCMCwgNCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzNfX0RJMV9EMF9DUwlJT01VWF9QQUQoMHg2QjQsIDB4MkI0LCA0LCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfNF9fREkxX0QxX0NTCUlPTVVYX1BBRCgweDZCOCwgMHgyQjgsIDQsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM181X19ESVNQQjJfU0VSX0RJTglJT01VWF9QQUQoMHg2QkMsIDB4MkJDLCA0LCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzNfNl9fRElTUEIyX1NFUl9ESU8JSU9NVVhfUEFEKDB4NkMwLCAweDJDMCwgNCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18zXzdfX0RJU1BCMl9TRVJfQ0xLCUlPTVVYX1BBRCgweDZDNCwgMHgyQzQsIDQsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fM184X19ESVNQQjJfU0VSX1JTCUlPTVVYX1BBRCgweDZDOCwgMHgyQzgsIDQsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDBfX0RJU1AxX0RBVDAJSU9NVVhfUEFEKDB4NkNDLCAweDJDQywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMV9fRElTUDFfREFUMQlJT01VWF9QQUQoMHg2RDAsIDB4MkQwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyX19ESVNQMV9EQVQyCUlPTVVYX1BBRCgweDZENCwgMHgyRDQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDNfX0RJU1AxX0RBVDMJSU9NVVhfUEFEKDB4NkQ4LCAweDJEOCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNF9fRElTUDFfREFUNAlJT01VWF9QQUQoMHg2REMsIDB4MkRDLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ1X19ESVNQMV9EQVQ1CUlPTVVYX1BBRCgweDZFMCwgMHgyRTAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDZfX0RJU1AxX0RBVDYJSU9NVVhfUEFEKDB4NkU0LCAweDJFNCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUN19fRElTUDFfREFUNwlJT01VWF9QQUQoMHg2RTgsIDB4MkU4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ4X19ESVNQMV9EQVQ4CUlPTVVYX1BBRCgweDZFQywgMHgyRUMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDlfX0RJU1AxX0RBVDkJSU9NVVhfUEFEKDB4NkYwLCAweDJGMCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTBfX0RJU1AxX0RBVDEwCUlPTVVYX1BBRCgweDZGNCwgMHgyRjQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDExX19ESVNQMV9EQVQxMQlJT01VWF9QQUQoMHg2RjgsIDB4MkY4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMl9fRElTUDFfREFUMTIJSU9NVVhfUEFEKDB4NkZDLCAweDJGQywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTNfX0RJU1AxX0RBVDEzCUlPTVVYX1BBRCgweDcwMCwgMHgzMDAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE0X19ESVNQMV9EQVQxNAlJT01VWF9QQUQoMHg3MDQsIDB4MzA0LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNV9fRElTUDFfREFUMTUJSU9NVVhfUEFEKDB4NzA4LCAweDMwOCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTZfX0RJU1AxX0RBVDE2CUlPTVVYX1BBRCgweDcwQywgMHgzMEMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE3X19ESVNQMV9EQVQxNwlJT01VWF9QQUQoMHg3MTAsIDB4MzEwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDFfREFUMTgJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AxX0RBVDE5CUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMV9EQVQyMAlJT01VWF9QQUQoMHg3MUMsIDB4MzFDLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDFfREFUMjEJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AxX0RBVDIyCUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMV9EQVQyMwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOM19fREkxX1BJTjMJSU9NVVhfUEFEKDB4NzJDLCAweDMyQywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjJfX0RJMV9QSU4yCUlPTVVYX1BBRCgweDczNCwgMHgzMzAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQMV9fRElfR1AxCUlPTVVYX1BBRCgweDczQywgMHgzMzQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQMl9fRElfR1AyCUlPTVVYX1BBRCgweDc0MCwgMHgzMzgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQM19fRElfR1AzCUlPTVVYX1BBRCgweDc0NCwgMHgzM0MsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19ESTJfUElONAlJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOMl9fREkyX1BJTjIJSU9NVVhfUEFEKDB4NzRDLCAweDM0NCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjNfX0RJMl9QSU4zCUlPTVVYX1BBRCgweDc1MCwgMHgzNDgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9ESVNQX0NMS19fREkyX0RJU1BfQ0xLCUlPTVVYX1BBRCgweDc1NCwgMHgzNEMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fRElfR1A0CUlPTVVYX1BBRCgweDc1OCwgMHgzNTAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX0RJU1AyX0RBVDAJSU9NVVhfUEFEKDB4NzVDLCAweDM1NCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fRElTUDJfREFUMQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQyX19ESVNQMl9EQVQyCUlPTVVYX1BBRCgweDc2NCwgMHgzNUMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDNfX0RJU1AyX0RBVDMJSU9NVVhfUEFEKDB4NzY4LCAweDM2MCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNF9fRElTUDJfREFUNAlJT01VWF9QQUQoMHg3NkMsIDB4MzY0LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ1X19ESVNQMl9EQVQ1CUlPTVVYX1BBRCgweDc3MCwgMHgzNjgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV8xOV9fRElTUDJfREFUNglJT01VWF9QQUQoMHg3NzQsIDB4MzZDLCA1LCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfMjlfX0RJU1AyX0RBVDcJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgNSwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18xXzMwX19ESVNQMl9EQVQ4CUlPTVVYX1BBRCgweDc3QywgMHgzNzQsIDUsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV8zMV9fRElTUDJfREFUOQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCA1LCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfREFUMTAJSU9NVVhfUEFEKDB4Nzg0LCAweDM3QywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0RJU1AyX0RBVDExCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19ESVNQMl9EQVQxMglJT01VWF9QQUQoMHg3OEMsIDB4Mzg0LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fRElTUDJfREFUMTMJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTRfX0RJU1AyX0RBVDE0CUlPTVVYX1BBRCgweDc5NCwgMHgzOEMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19ESVNQMl9EQVQxNQlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfQ01EX19TRDFfQ01ECUlPTVVYX1BBRCgweDc5QywgMHgzOTQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9DTEtfX1NEMV9DTEsJSU9NVVhfUEFEKDB4N0EwLCAweDM5OCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEwX19TRDFfREFUQTAJSU9NVVhfUEFEKDB4N0E0LCAweDM5QywgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEExX19TRDFfREFUQTEJSU9NVVhfUEFEKDB4N0E4LCAweDNBMCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIJSU9NVVhfUEFEKDB4N0FDLCAweDNBNCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEzX19TRDFfREFUQTMJSU9NVVhfUEFEKDB4N0IwLCAweDNBOCwgMCwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18xXzBfX0dQSU8xXzAJSU9NVVhfUEFEKDB4N0I0LCAweDNBQywgMSwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfR1BJT18xXzFfX0dQSU8xXzEJSU9NVVhfUEFEKDB4N0I4LCAweDNCMCwgMSwgMHgwLCAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0NNRF9fU0QyX0NNRAlJT01VWF9QQUQoMHg3QkMsIDB4M0I0LCAwLCAweDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfQ0xLX19TRDJfQ0xLCUlPTVVYX1BBRCgweDdDMCwgMHgzQjgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMF9fU0QyX0RBVEEwCUlPTVVYX1BBRCgweDdDNCwgMHgzQkMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMV9fU0QyX0RBVEExCUlPTVVYX1BBRCgweDdDOCwgMHgzQzAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMl9fU0QyX0RBVEEyCUlPTVVYX1BBRCgweDdDQywgMHgzQzQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBM19fU0QyX0RBVEEzCUlPTVVYX1BBRCgweDdEMCwgMHgzQzgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV8yX19HUElPMV8yCUlPTVVYX1BBRCgweDdENCwgMHgzQ0MsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV8zX19HUElPMV8zCUlPTVVYX1BBRCgweDdEOCwgMHgzRDAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX1BNSUNfSU5UX1JFUV9fUE1JQ19JTlRfUkVRCUlPTVVYX1BBRCgweDdGQywgMHgzRDQsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV80X19HUElPMV80CUlPTVVYX1BBRCgweDgwNCwgMHgzRDgsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV81X19HUElPMV81CUlPTVVYX1BBRCgweDgwOCwgMHgzREMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV82X19HUElPMV82CUlPTVVYX1BBRCgweDgwQywgMHgzRTAsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV83X19HUElPMV83CUlPTVVYX1BBRCgweDgxMCwgMHgzRTQsIDAsIDB4MCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfOF9fR1BJTzFfOAlJT01VWF9QQUQoMHg4MTQsIDB4M0U4LCAwLCAweDAsIDEsIFwKLQkJCQkJCShQQURfQ1RMX1NSRV9TTE9XIHwgUEFEX0NUTF9EU0VfTUVEIHwgUEFEX0NUTF9QVVNfMTAwS19VUCB8ICBQQURfQ1RMX0hZUykpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV85X19HUElPMV85CUlPTVVYX1BBRCgweDgxOCwgMHgzRUMsIDAsIDB4MCwgMCwgTk9fUEFEX0NUUkwpCi0KLS8qIEVJTSAqLwotI2RlZmluZSBNWDUxX1BBRF9FSU1fREEwX19FSU1fREEwCUlPTVVYX1BBRCgweDdhOCwgMHgwMWMsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMV9fRUlNX0RBMQlJT01VWF9QQUQoMHg3YTgsIDB4MDIwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTJfX0VJTV9EQTIJSU9NVVhfUEFEKDB4N2E4LCAweDAyNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREEzX19FSU1fREEzCUlPTVVYX1BBRCgweDdhOCwgMHgwMjgsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNF9fRUlNX0RBNAlJT01VWF9QQUQoMHg3YWMsIDB4MDJjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTVfX0VJTV9EQTUJSU9NVVhfUEFEKDB4N2FjLCAweDAzMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREE2X19FSU1fREE2CUlPTVVYX1BBRCgweDdhYywgMHgwMzQsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBN19fRUlNX0RBNwlJT01VWF9QQUQoMHg3YWMsIDB4MDM4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0KLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBOF9fRUlNX0RBOAlJT01VWF9QQUQoMHg3YjAsIDB4MDNjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTlfX0VJTV9EQTkJSU9NVVhfUEFEKDB4N2IwLCAweDA0MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMF9fRUlNX0RBMTAJSU9NVVhfUEFEKDB4N2IwLCAweDA0NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMV9fRUlNX0RBMTEJSU9NVVhfUEFEKDB4N2IwLCAweDA0OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMl9fRUlNX0RBMTIJSU9NVVhfUEFEKDB4N2JjLCAweDA0YywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExM19fRUlNX0RBMTMJSU9NVVhfUEFEKDB4N2JjLCAweDA1MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExNF9fRUlNX0RBMTQJSU9NVVhfUEFEKDB4N2JjLCAweDA1NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExNV9fRUlNX0RBMTUJSU9NVVhfUEFEKDB4N2JjLCAweDA1OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorLyoJCQkJCQkJICBQQUQgICAgTVVYICAgQUxUIElOUFNFIFBBVEggUEFEQ1RSTCAqLworI2RlZmluZSBNWDUxX1BBRF9FSU1fREEwX19FSU1fREEwCQlJT01VWF9QQUQoMHg3YTgsIDB4MDFjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTFfX0VJTV9EQTEJCUlPTVVYX1BBRCgweDdhOCwgMHgwMjAsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMl9fRUlNX0RBMgkJSU9NVVhfUEFEKDB4N2E4LCAweDAyNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREEzX19FSU1fREEzCQlJT01VWF9QQUQoMHg3YTgsIDB4MDI4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTRfX0VJTV9EQTQJCUlPTVVYX1BBRCgweDdhYywgMHgwMmMsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNV9fRUlNX0RBNQkJSU9NVVhfUEFEKDB4N2FjLCAweDAzMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREE2X19FSU1fREE2CQlJT01VWF9QQUQoMHg3YWMsIDB4MDM0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTdfX0VJTV9EQTcJCUlPTVVYX1BBRCgweDdhYywgMHgwMzgsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBOF9fRUlNX0RBOAkJSU9NVVhfUEFEKDB4N2IwLCAweDAzYywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREE5X19FSU1fREE5CQlJT01VWF9QQUQoMHg3YjAsIDB4MDQwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEwX19FSU1fREExMAkJSU9NVVhfUEFEKDB4N2IwLCAweDA0NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMV9fRUlNX0RBMTEJCUlPTVVYX1BBRCgweDdiMCwgMHgwNDgsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTJfX0VJTV9EQTEyCQlJT01VWF9QQUQoMHg3YmMsIDB4MDRjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEzX19FSU1fREExMwkJSU9NVVhfUEFEKDB4N2JjLCAweDA1MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExNF9fRUlNX0RBMTQJCUlPTVVYX1BBRCgweDdiYywgMHgwNTQsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTVfX0VJTV9EQTE1CQlJT01VWF9QQUQoMHg3YmMsIDB4MDU4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0dQSU9fMl8wICAgICAgICAgICAgICBJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0kyQzFfU0RBCQlJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAoNCB8IElPTVVYX0NPTkZJR19TSU9OKSwgXAorCQkJCQkJCTB4MDliNCwgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX0dQSU9fMl8xICAgICAgICAgICAgICBJT01VWF9QQUQoMHgzZjQsIDB4MDYwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX0dQSU9fMl8yICAgICAgICAgICAgICBJT01VWF9QQUQoMHgzZjgsIDB4MDY0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0dQSU9fMl8zICAgICAgICAgICAgICBJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0kyQzFfU0NMCQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCAoNCB8IElPTVVYX0NPTkZJR19TSU9OKSwgXAorCQkJCQkJCTB4MDliMCwgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX0dQSU9fMl80ICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MDAsIDB4MDZjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX0dQSU9fMl81CQlJT01VWF9QQUQoMHg0MDQsIDB4MDcwLCAxLCAweDAsICAgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19HUElPXzJfNiAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NDA4LCAweDA3NCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIzX19HUElPXzJfNyAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NDBjLCAweDA3OCwgMSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19VQVJUM19DVFMgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NDEwLCAweDA3YywgMywgMHgwLCAgIDAsIE1YNTFfVUFSVDNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCAzLCAweDlmNCwgMCwgTVg1MV9VQVJUM19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fVUFSVDJfQ1RTCQlJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCA0LCAweDAsICAgMCwgTVg1MV9VQVJUMl9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fVUFSVDNfVFhEICAgICAgICAgICAgIElPTVVYX1BBRCgweDQxOCwgMHgwODQsIDMsIDB4MCwgICAwLCBNWDUxX1VBUlQzX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19VQVJUMl9SVFMJCUlPTVVYX1BBRCgweDQxOCwgMHgwODQsIDQsIDB4OWU4LCAzLCBNWDUxX1VBUlQyX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19VQVJUM19SVFMgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NDFjLCAweDA4OCwgMywgMHg5ZjAsIDMsIE1YNTFfVUFSVDNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0VJTV9EMjggICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MjAsIDB4MDhjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjlfX0VJTV9EMjkgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MjQsIDB4MDkwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzBfX0VJTV9EMzAgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MjgsIDB4MDk0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX0VJTV9EMzEgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MmMsIDB4MDljLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTZfX0dQSU9fMl8xMCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MzAsIDB4MDljLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTdfX0dQSU9fMl8xMSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MzQsIDB4MGEwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMThfX0dQSU9fMl8xMiAgICAgICAgICAgICBJT01VWF9QQUQoMHg0MzgsIDB4MGE0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0dQSU9fMl8xMyAgICAgICAgICAgICBJT01VWF9QQUQoMHg0M2MsIDB4MGE4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjBfX0dQSU9fMl8xNCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NDAsIDB4MGFjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjFfX0dQSU9fMl8xNSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NDQsIDB4MGIwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjJfX0dQSU9fMl8xNiAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NDgsIDB4MGI0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjNfX0dQSU9fMl8xNyAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NGMsIDB4MGI4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjRfX0dQSU9fMl8xOCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NTAsIDB4MGJjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX0dQSU9fMl8xOSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NTQsIDB4MGMwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjZfX0dQSU9fMl8yMCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NTgsIDB4MGM0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0dQSU9fMl8yMSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NWMsIDB4MGM4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjBfX0VJTV9FQjAgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NjAsIDB4MGNjLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjFfX0VJTV9FQjEgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NjQsIDB4MGQwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0dQSU9fMl8yMiAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NjgsIDB4MGQ0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0dQSU9fMl8yMyAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NmMsIDB4MGQ4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9PRV9fR1BJT18yXzI0ICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NzAsIDB4MGRjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzBfX0dQSU9fMl8yNSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NzQsIDB4MGUwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzFfX0dQSU9fMl8yNiAgICAgICAgICAgICBJT01VWF9QQUQoMHg0NzgsIDB4MGU0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzJfX0dQSU9fMl8yNyAgICAgICAgICAgICBJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0dQSU9fMl8yOCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0ODAsIDB4MGVjLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0dQSU9fMl8yOSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0ODQsIDB4MGYwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0dQSU9fMl8zMCAgICAgICAgICAgICBJT01VWF9QQUQoMHg0ODgsIDB4MGY0LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EVEFDS19fR1BJT18yXzMxICAgICAgICAgICBJT01VWF9QQUQoMHg0OGMsIDB4MGY4LCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9MQkFfX0dQSU9fM18xICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0OTQsIDB4MEZDLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUkVfX0dQSU9fM18yICAgICAgICAgICAgICBJT01VWF9QQUQoMHg0QTAsIDB4MTAwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RSQU1fQ1MxX19EUkFNX0NTMSAgICAgICAgICAgICBJT01VWF9QQUQoMHg0RDAsIDB4MTA0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX0dQSU9fM18zICAgICAgICAgICBJT01VWF9QQUQoMHg0RTQsIDB4MTA4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX0dQSU9fM180ICAgICAgICAgICBJT01VWF9QQUQoMHg0RTgsIDB4MTBDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0FMRV9fR1BJT18zXzUgICAgICAgICAgICBJT01VWF9QQUQoMHg0RUMsIDB4MTEwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NMRV9fR1BJT18zXzYgICAgICAgICAgICBJT01VWF9QQUQoMHg0RjAsIDB4MTE0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dQX0JfX0dQSU9fM183ICAgICAgICAgICBJT01VWF9QQUQoMHg0RjQsIDB4MTE4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fR1BJT18zXzggICAgICAgICAgICBJT01VWF9QQUQoMHg0RjgsIDB4MTFDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fR1BJT18zXzkgICAgICAgICAgICBJT01VWF9QQUQoMHg0RkMsIDB4MTIwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fR1BJT18zXzEwICAgICAgICAgICBJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fR1BJT18zXzExICAgICAgICAgICBJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU9fTkFORF9fR1BJT18zXzEyICAgICAgICAgICBJT01VWF9QQUQoMHg1MTQsIDB4MTJDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMF9fR1BJT18zXzE2ICAgICAgICAgICBJT01VWF9QQUQoMHg1MTgsIDB4MTMwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMV9fR1BJT18zXzE3ICAgICAgICAgICBJT01VWF9QQUQoMHg1MUMsIDB4MTM0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fR1BJT18zXzE4ICAgICAgICAgICBJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fR1BJT18zXzE5ICAgICAgICAgICBJT01VWF9QQUQoMHg1MjQsIDB4MTNDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fR1BJT18zXzIwICAgICAgICAgICBJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fR1BJT18zXzIxICAgICAgICAgICBJT01VWF9QQUQoMHg1MkMsIDB4MTQ0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fR1BJT18zXzIyICAgICAgICAgICBJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTN19fR1BJT18zXzIzICAgICAgICAgICBJT01VWF9QQUQoMHg1MzQsIDB4MTRDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0dQSU9fM18yNCAgICAgICBJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fR1BJT18zXzI1ICAgICAgICAgICBJT01VWF9QQUQoMHg1M0MsIDB4MTU0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fR1BJT18zXzI2ICAgICAgICAgICBJT01VWF9QQUQoMHg1NDAsIDB4MTU4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fR1BJT18zXzI3ICAgICAgICAgICBJT01VWF9QQUQoMHg1NDQsIDB4MTVDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fR1BJT18zXzI4ICAgICAgICAgICBJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fR1BJT18zXzI5ICAgICAgICAgICBJT01VWF9QQUQoMHg1NEMsIDB4MTY0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fR1BJT18zXzMwICAgICAgICAgICBJT01VWF9QQUQoMHg1NTAsIDB4MTY4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19HUElPXzNfMzEgICAgICAgICAgICBJT01VWF9QQUQoMHg1NTQsIDB4MTZDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q4X19HUElPXzRfMCAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NTgsIDB4MTcwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q3X19HUElPXzRfMSAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NUMsIDB4MTc0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19HUElPXzRfMiAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q1X19HUElPXzRfMyAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NjQsIDB4MTdDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19HUElPXzRfNCAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19HUElPXzRfNSAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NkMsIDB4MTg0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19HUElPXzRfNiAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxX19HUElPXzRfNyAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NzQsIDB4MThDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19HUElPXzRfOCAgICAgICAgICAgICBJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDhfX0dQSU9fM18xMiAgICAgICAgICAgICBJT01VWF9QQUQoMHg1N0MsIDB4MTk0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDlfX0dQSU9fM18xMyAgICAgICAgICAgICBJT01VWF9QQUQoMHg1ODAsIDB4MTk4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEwX19DU0kxX0QxMCAgICAgICAgICAgICBJT01VWF9QQUQoMHg1ODQsIDB4MTlDLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDExX19DU0kxX0QxMSAgICAgICAgICAgICBJT01VWF9QQUQoMHg1ODgsIDB4MUEwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEyX19DU0kxX0QxMiAgICAgICAgICAgICBJT01VWF9QQUQoMHg1OEMsIDB4MUE0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEzX19DU0kxX0QxMyAgICAgICAgICAgICBJT01VWF9QQUQoMHg1OTAsIDB4MUE4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE0X19DU0kxX0QxNCAgICAgICAgICAgICBJT01VWF9QQUQoMHg1OTQsIDB4MUFDLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE1X19DU0kxX0QxNSAgICAgICAgICAgICBJT01VWF9QQUQoMHg1OTgsIDB4MUIwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE2X19DU0kxX0QxNiAgICAgICAgICAgICBJT01VWF9QQUQoMHg1OUMsIDB4MUI0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE3X19DU0kxX0QxNyAgICAgICAgICAgICBJT01VWF9QQUQoMHg1QTAsIDB4MUI4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE4X19DU0kxX0QxOCAgICAgICAgICAgICBJT01VWF9QQUQoMHg1QTQsIDB4MUJDLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE5X19DU0kxX0QxOSAgICAgICAgICAgICBJT01VWF9QQUQoMHg1QTgsIDB4MUMwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfVlNZTkNfX0NTSTFfVlNZTkMgICAgICAgICBJT01VWF9QQUQoMHg1QUMsIDB4MUM0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfSFNZTkNfX0NTSTFfSFNZTkMgICAgICAgICBJT01VWF9QQUQoMHg1QjAsIDB4MUM4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfUElYQ0xLX19DU0kxX1BJWENMSyAgICAgICBJT01VWF9QQUQoMHg1QjQsIDB4MDAwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfTUNMS19fQ1NJMV9NQ0xLICAgICAgICAgICBJT01VWF9QQUQoMHg1QjgsIDB4MDAwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfUEtFMF9fQ1NJMV9QS0UwICAgICAgICAgICBJT01VWF9QQUQoMHg4NjAsIDB4MDAwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEyX19HUElPXzRfOSAgICAgICAgICAgICBJT01VWF9QQUQoMHg1QkMsIDB4MUNDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEzX19HUElPXzRfMTAgICAgICAgICAgICBJT01VWF9QQUQoMHg1QzAsIDB4MUQwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE0X19HUElPXzRfMTEgICAgICAgICAgICBJT01VWF9QQUQoMHg1QzQsIDB4MUQ0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE1X19HUElPXzRfMTIgICAgICAgICAgICBJT01VWF9QQUQoMHg1QzgsIDB4MUQ4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE2X19HUElPXzRfMTEgICAgICAgICAgICBJT01VWF9QQUQoMHg1Q0MsIDB4MURDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE3X19HUElPXzRfMTIgICAgICAgICAgICBJT01VWF9QQUQoMHg1RDAsIDB4MUUwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE4X19HUElPXzRfMTEgICAgICAgICAgICBJT01VWF9QQUQoMHg1RDQsIDB4MUU0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE5X19HUElPXzRfMTIgICAgICAgICAgICBJT01VWF9QQUQoMHg1RDgsIDB4MUU4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfVlNZTkNfX0dQSU9fNF8xMyAgICAgICAgICBJT01VWF9QQUQoMHg1REMsIDB4MUVDLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfSFNZTkNfX0dQSU9fNF8xNCAgICAgICAgICBJT01VWF9QQUQoMHg1RTAsIDB4MUYwLCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfUElYQ0xLX19HUElPXzRfMTUgICAgICAgICBJT01VWF9QQUQoMHg1RTQsIDB4MUY0LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0kyQzFfQ0xLX19HUElPXzRfMTYgICAgICAgICAgICBJT01VWF9QQUQoMHg1RTgsIDB4MUY4LCAzLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0kyQzFfQ0xLX19IU0kyQ19DTEsJCUlPTVVYX1BBRCgweDVFOCwgMHgxRjgsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfSTJDMV9EQVRfX0dQSU9fNF8xNyAgICAgICAgICAgIElPTVVYX1BBRCgweDVFQywgMHgxRkMsIDMsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfSTJDMV9EQVRfX0hTSTJDX0RBVAkJSU9NVVhfUEFEKDB4NUVDLCAweDFGQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1RYRF9fR1BJT180XzE4ICAgICAgICAgSU9NVVhfUEFEKDB4NUYwLCAweDIwMCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fR1BJT180XzE5ICAgICAgICAgSU9NVVhfUEFEKDB4NUY0LCAweDIwNCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0NLX19HUElPXzRfMjAgICAgICAgICAgSU9NVVhfUEFEKDB4NUY4LCAweDIwOCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0ZTX19HUElPXzRfMjEgICAgICAgICAgSU9NVVhfUEFEKDB4NUZDLCAweDIwQywgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NT1NJX19HUElPXzRfMjIgICAgICAgICAgSU9NVVhfUEFEKDB4NjAwLCAweDIxMCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NSVNPX19HUElPXzRfMjMgICAgICAgICAgSU9NVVhfUEFEKDB4NjA0LCAweDIxNCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzBfX0dQSU9fNF8yNCAgICAgICAgICAgSU9NVVhfUEFEKDB4NjA4LCAweDIxOCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzFfX0dQSU9fNF8yNSAgICAgICAgICAgSU9NVVhfUEFEKDB4NjBDLCAweDIxQywgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9SRFlfX0dQSU9fNF8yNiAgICAgICAgICAgSU9NVVhfUEFEKDB4NjEwLCAweDIyMCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TQ0xLX19HUElPXzRfMjcgICAgICAgICAgSU9NVVhfUEFEKDB4NjE0LCAweDIyNCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SWERfX1VBUlQxX1JYRCAgICAgICAgICAgSU9NVVhfUEFEKDB4NjE4LCAweDIyOCwgMCwgMHg5ZTQsIDAsIE1YNTFfVUFSVDFfUEFEX0NUUkwgfCBQQURfQ1RMX1NSRV9GQVNUKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX1VBUlQxX1RYRCAgICAgICAgICAgSU9NVVhfUEFEKDB4NjFDLCAweDIyQywgMCwgMHgwLCAgIDAsIE1YNTFfVUFSVDFfUEFEX0NUUkwgfCBQQURfQ1RMX1NSRV9GQVNUKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SVFNfX1VBUlQxX1JUUyAgICAgICAgICAgSU9NVVhfUEFEKDB4NjIwLCAweDIzMCwgMCwgMHg5ZTAsIDAsIE1YNTFfVUFSVDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTICAgICAgICAgICBJT01VWF9QQUQoMHg2MjQsIDB4MjM0LCAwLCAweDAsICAgMCwgTVg1MV9VQVJUMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDJfUlhEX19VQVJUMl9SWEQgICAgICAgICAgIElPTVVYX1BBRCgweDYyOCwgMHgyMzgsIDAsIDB4OWVjLCAyLCBNWDUxX1VBUlQyX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX1VBUlQyX1RYRCAgICAgICAgICAgSU9NVVhfUEFEKDB4NjJDLCAweDIzQywgMCwgMHgwLCAgIDAsIE1YNTFfVUFSVDJfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAxLCAweDlmNCwgNCwgTVg1MV9VQVJUM19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19HUElPXzFfMjIgICAgICAgICAgIElPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDMsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDEsIDB4MCwgICAwLCBNWDUxX1VBUlQzX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX0dQSU9fMV8yMyAgICAgICAgICAgSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19HUElPXzFfMjQgICAgICAgICAgSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgMywgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMF9fS0VZX1JPVzAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjNDLCAweDI0QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMV9fS0VZX1JPVzEgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjQwLCAweDI1MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMl9fS0VZX1JPVzIgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjQ0LCAweDI1NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XM19fS0VZX1JPVzMgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjQ4LCAweDI1OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMF9fS0VZX0NPTDAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjRDLCAweDI1QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMV9fS0VZX0NPTDEgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjUwLCAweDI2MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMl9fS0VZX0NPTDIgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjU0LCAweDI2NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MM19fS0VZX0NPTDMgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjU4LCAweDI2OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fS0VZX0NPTDQgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NjVDLCAweDI2QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDNfUlRTCQlJT01VWF9QQUQoMHg2NUMsIDB4MjZDLCAyLCAweDlmMCwgNCwgTVg1MV9VQVJUM19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHg2NUMsIDB4MjZDLCAoMyB8IElPTVVYX0NPTkZJR19TSU9OKSwgXAorCQkJCQkJCTB4MDliOCwgMSwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19LRVlfQ09MNSAgICAgICAgICAgICBJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDIsIDAsICAgICAwLCBNWDUxX1VBUlQzX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNV9fSTJDMl9TREEJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsICgzIHwgSU9NVVhfQ09ORklHX1NJT04pLCBcCisJCQkJCQkJMHgwOWJjLCAxLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19VU0JIMV9DTEsgICAgICAgICAgIElPTVVYX1BBRCgweDY3OCwgMHgyNzgsIDAsIDB4MCwgICAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9ESVJfX1VTQkgxX0RJUiAgICAgICAgICAgSU9NVVhfUEFEKDB4NjdDLCAweDI3QywgMCwgMHgwLCAgIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQICAgICAgICAgICBJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAwLCAweDAsICAgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfU1RQX19HUElPXzFfMjcgICAgICAgICAgIElPTVVYX1BBRCgweDY4MCwgMHgyODAsIDIsIDB4MCwgICAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX1VTQkgxX05YVCAgICAgICAgICAgSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgMCwgMHgwLCAgIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEwX19VU0JIMV9EQVRBMCAgICAgICBJT01VWF9QQUQoMHg2ODgsIDB4Mjg4LCAwLCAweDAsICAgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTFfX1VTQkgxX0RBVEExICAgICAgIElPTVVYX1BBRCgweDY4QywgMHgyOEMsIDAsIDB4MCwgICAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMl9fVVNCSDFfREFUQTIgICAgICAgSU9NVVhfUEFEKDB4NjkwLCAweDI5MCwgMCwgMHgwLCAgIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEzX19VU0JIMV9EQVRBMyAgICAgICBJT01VWF9QQUQoMHg2OTQsIDB4Mjk0LCAwLCAweDAsICAgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTRfX1VTQkgxX0RBVEE0ICAgICAgIElPTVVYX1BBRCgweDY5OCwgMHgyOTgsIDAsIDB4MCwgICAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNV9fVVNCSDFfREFUQTUgICAgICAgSU9NVVhfUEFEKDB4NjlDLCAweDI5QywgMCwgMHgwLCAgIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19VU0JIMV9EQVRBNiAgICAgICBJT01VWF9QQUQoMHg2QTAsIDB4MkEwLCAwLCAweDAsICAgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTdfX1VTQkgxX0RBVEE3ICAgICAgIElPTVVYX1BBRCgweDZBNCwgMHgyQTQsIDAsIDB4MCwgICAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0dQSU9fM18wICAgICAgICAgICAgSU9NVVhfUEFEKDB4NkE4LCAweDJBOCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTJfX0dQSU9fM18xICAgICAgICAgICAgSU9NVVhfUEFEKDB4NkFDLCAweDJBQywgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTNfX0dQSU9fM18yICAgICAgICAgICAgSU9NVVhfUEFEKDB4NkIwLCAweDJCMCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDBfQ1NfX0dQSU9fM18zICAgICAgICAgICAgSU9NVVhfUEFEKDB4NkI0LCAweDJCNCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDFfQ1NfX0dQSU9fM180ICAgICAgICAgICAgSU9NVVhfUEFEKDB4NkI4LCAweDJCOCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fR1BJT18zXzUgICAgICAgSU9NVVhfUEFEKDB4NkJDLCAweDJCQywgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fR1BJT18zXzYgICAgICAgSU9NVVhfUEFEKDB4NkMwLCAweDJDMCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fR1BJT18zXzcgICAgICAgSU9NVVhfUEFEKDB4NkM0LCAweDJDNCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19HUElPXzNfOCAgICAgICAgSU9NVVhfUEFEKDB4NkM4LCAweDJDOCwgNCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQwX19ESVNQMV9EQVQwICAgICAgICAgSU9NVVhfUEFEKDB4NkNDLCAweDJDQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxX19ESVNQMV9EQVQxICAgICAgICAgSU9NVVhfUEFEKDB4NkQwLCAweDJEMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyX19ESVNQMV9EQVQyICAgICAgICAgSU9NVVhfUEFEKDB4NkQ0LCAweDJENCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQzX19ESVNQMV9EQVQzICAgICAgICAgSU9NVVhfUEFEKDB4NkQ4LCAweDJEOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ0X19ESVNQMV9EQVQ0ICAgICAgICAgSU9NVVhfUEFEKDB4NkRDLCAweDJEQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ1X19ESVNQMV9EQVQ1ICAgICAgICAgSU9NVVhfUEFEKDB4NkUwLCAweDJFMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ2X19ESVNQMV9EQVQ2ICAgICAgICAgSU9NVVhfUEFEKDB4NkU0LCAweDJFNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ3X19ESVNQMV9EQVQ3ICAgICAgICAgSU9NVVhfUEFEKDB4NkU4LCAweDJFOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ4X19ESVNQMV9EQVQ4ICAgICAgICAgSU9NVVhfUEFEKDB4NkVDLCAweDJFQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ5X19ESVNQMV9EQVQ5ICAgICAgICAgSU9NVVhfUEFEKDB4NkYwLCAweDJGMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMF9fRElTUDFfREFUMTAgICAgICAgSU9NVVhfUEFEKDB4NkY0LCAweDJGNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMV9fRElTUDFfREFUMTEgICAgICAgSU9NVVhfUEFEKDB4NkY4LCAweDJGOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMl9fRElTUDFfREFUMTIgICAgICAgSU9NVVhfUEFEKDB4NkZDLCAweDJGQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxM19fRElTUDFfREFUMTMgICAgICAgSU9NVVhfUEFEKDB4NzAwLCAweDMwMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNF9fRElTUDFfREFUMTQgICAgICAgSU9NVVhfUEFEKDB4NzA0LCAweDMwNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNV9fRElTUDFfREFUMTUgICAgICAgSU9NVVhfUEFEKDB4NzA4LCAweDMwOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNl9fRElTUDFfREFUMTYgICAgICAgSU9NVVhfUEFEKDB4NzBDLCAweDMwQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxN19fRElTUDFfREFUMTcgICAgICAgSU9NVVhfUEFEKDB4NzEwLCAweDMxMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDFfREFUMTggICAgICAgSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOV9fRElTUDFfREFUMTkgICAgICAgSU9NVVhfUEFEKDB4NzE4LCAweDMxOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDFfREFUMjAgICAgICAgSU9NVVhfUEFEKDB4NzFDLCAweDMxQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDFfREFUMjEgICAgICAgSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMl9fRElTUDFfREFUMjIgICAgICAgSU9NVVhfUEFEKDB4NzI0LCAweDMyNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyM19fRElTUDFfREFUMjMgICAgICAgSU9NVVhfUEFEKDB4NzI4LCAweDMyOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOM19fREkxX1BJTjMgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzJDLCAweDMyQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMl9fREkxX1BJTjIgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzM0LCAweDMzMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDFfX0RJX0dQMSAgICAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzNDLCAweDMzNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDJfX0RJX0dQMiAgICAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzQwLCAweDMzOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDNfX0RJX0dQMyAgICAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzQ0LCAweDMzQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElONF9fREkyX1BJTjQgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzQ4LCAweDM0MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOMl9fREkyX1BJTjIgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzRDLCAweDM0NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOM19fREkyX1BJTjMgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzUwLCAweDM0OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfRElTUF9DTEtfX0RJMl9ESVNQX0NMSyAgICAgSU9NVVhfUEFEKDB4NzU0LCAweDM0QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0RJX0dQNCAgICAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19ESVNQMl9EQVQwICAgICAgICAgSU9NVVhfUEFEKDB4NzVDLCAweDM1NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxX19ESVNQMl9EQVQxICAgICAgICAgSU9NVVhfUEFEKDB4NzYwLCAweDM1OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQyX19ESVNQMl9EQVQyICAgICAgICAgSU9NVVhfUEFEKDB4NzY0LCAweDM1QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQzX19ESVNQMl9EQVQzICAgICAgICAgSU9NVVhfUEFEKDB4NzY4LCAweDM2MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ0X19ESVNQMl9EQVQ0ICAgICAgICAgSU9NVVhfUEFEKDB4NzZDLCAweDM2NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ1X19ESVNQMl9EQVQ1ICAgICAgICAgSU9NVVhfUEFEKDB4NzcwLCAweDM2OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19HUElPXzFfMTkgICAgICAgICAgSU9NVVhfUEFEKDB4Nzc0LCAweDM2QywgNSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19HUElPXzFfMjkgICAgICAgICAgSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgNSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19HUElPXzFfMzAgICAgICAgICAgSU9NVVhfUEFEKDB4NzdDLCAweDM3NCwgNSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19HUElPXzFfMzEgICAgICAgICAgSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgNSwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfREFUMTAgICAgICAgSU9NVVhfUEFEKDB4Nzg0LCAweDM3QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMV9fRElTUDJfREFUMTEgICAgICAgSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMl9fRElTUDJfREFUMTIgICAgICAgSU9NVVhfUEFEKDB4NzhDLCAweDM4NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fRElTUDJfREFUMTMgICAgICAgSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNF9fRElTUDJfREFUMTQgICAgICAgSU9NVVhfUEFEKDB4Nzk0LCAweDM4QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNV9fRElTUDJfREFUMTUgICAgICAgSU9NVVhfUEFEKDB4Nzk4LCAweDM5MCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfQ01EX19TRDFfQ01EICAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4NzlDLCAweDM5NCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfQ0xLX19TRDFfQ0xLICAgICAgICAgICAgICAgSU9NVVhfUEFEKDB4N0EwLCAweDM5OCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTBfX1NEMV9EQVRBMCAgICAgICAgICAgSU9NVVhfUEFEKDB4N0E0LCAweDM5QywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTFfX1NEMV9EQVRBMSAgICAgICAgICAgSU9NVVhfUEFEKDB4N0E4LCAweDNBMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTJfX1NEMV9EQVRBMiAgICAgICAgICAgSU9NVVhfUEFEKDB4N0FDLCAweDNBNCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTNfX1NEMV9EQVRBMyAgICAgICAgICAgSU9NVVhfUEFEKDB4N0IwLCAweDNBOCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfMF9fR1BJT18xXzAJCUlPTVVYX1BBRCgweDdCNCwgMHgzQUMsIDEsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJT18xXzFfX0dQSU9fMV8xCQlJT01VWF9QQUQoMHg3QjgsIDB4M0IwLCAxLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9DTURfX1NEMl9DTUQgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg3QkMsIDB4M0I0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9DTEtfX1NEMl9DTEsgICAgICAgICAgICAgICBJT01VWF9QQUQoMHg3QzAsIDB4M0I4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMF9fU0QyX0RBVEEwICAgICAgICAgICBJT01VWF9QQUQoMHg3QzQsIDB4M0JDLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMV9fU0QyX0RBVEExICAgICAgICAgICBJT01VWF9QQUQoMHg3QzgsIDB4M0MwLCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMl9fU0QyX0RBVEEyICAgICAgICAgICBJT01VWF9QQUQoMHg3Q0MsIDB4M0M0LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBM19fU0QyX0RBVEEzICAgICAgICAgICBJT01VWF9QQUQoMHg3RDAsIDB4M0M4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV8yX19HUElPXzFfMgkJSU9NVVhfUEFEKDB4N0Q0LCAweDNDQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfMl9fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDdENCwgMHgzQ0MsICgyIHwgSU9NVVhfQ09ORklHX1NJT04pLCBcCisJCQkJCQkJMHg5YjgsICAgMywgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV8zX19HUElPXzFfMwkJSU9NVVhfUEFEKDB4N0Q4LCAweDNEMCwgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfM19fSTJDMl9TREEJCUlPTVVYX1BBRCgweDdEOCwgMHgzRDAsICgyIHwgSU9NVVhfQ09ORklHX1NJT04pLCBcCisJCQkJCQkJMHg5YmMsICAgMywgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1BNSUNfSU5UX1JFUV9fUE1JQ19JTlRfUkVRCUlPTVVYX1BBRCgweDdGQywgMHgzRDQsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJT18xXzRfX0dQSU9fMV80CQlJT01VWF9QQUQoMHg4MDQsIDB4M0Q4LCAwLCAweDAsICAgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV81X19HUElPXzFfNQkJSU9NVVhfUEFEKDB4ODA4LCAweDNEQywgMCwgMHgwLCAgIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfNl9fR1BJT18xXzYJCUlPTVVYX1BBRCgweDgwQywgMHgzRTAsIDAsIDB4MCwgICAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU9fMV83X19HUElPXzFfNwkJSU9NVVhfUEFEKDB4ODEwLCAweDNFNCwgMCwgMHgwLCAgIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJT18xXzhfX0dQSU9fMV84CQlJT01VWF9QQUQoMHg4MTQsIDB4M0U4LCAwLCAweDAsICAgMSwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPXzFfOV9fR1BJT18xXzkJCUlPTVVYX1BBRCgweDgxOCwgMHgzRUMsIDAsIDB4MCwgICAwLCBOT19QQURfQ1RSTCkKIAogI2VuZGlmIC8qIF9fTUFDSF9JT01VWF9NWDUxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14YzkxMjMxLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXhjOTEyMzEuaAppbmRleCAzODg3ZjNmLi4xNWQ1OTUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXhjOTEyMzEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXhjOTEyMzEuaApAQCAtMTIsMTAgKzEyLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpZm5kZWYgX19NQUNIX0lPTVVYX01YQzkxMjMxX0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaAppbmRleCBmMmY3M2QzLi4wODgwYTRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaApAQCAtODksNiArODksMjEgQEAKICNkZWZpbmUgUEFEX0NUTF9TUkVfRkFTVAkJKDEgPDwgMCkKICNkZWZpbmUgUEFEX0NUTF9TUkVfU0xPVwkJKDAgPDwgMCkKIAorCisjZGVmaW5lIE1YNTFfTlVNX0dQSU9fUE9SVAk0CisKKyNkZWZpbmUgR1BJT19QSU5fTUFTSyAweDFmCisKKyNkZWZpbmUgR1BJT19QT1JUX1NISUZUIDUKKyNkZWZpbmUgR1BJT19QT1JUX01BU0sgKDB4NyA8PCBHUElPX1BPUlRfU0hJRlQpCisKKyNkZWZpbmUgR1BJT19QT1JUQQkoMCA8PCBHUElPX1BPUlRfU0hJRlQpCisjZGVmaW5lIEdQSU9fUE9SVEIJKDEgPDwgR1BJT19QT1JUX1NISUZUKQorI2RlZmluZSBHUElPX1BPUlRDCSgyIDw8IEdQSU9fUE9SVF9TSElGVCkKKyNkZWZpbmUgR1BJT19QT1JURAkoMyA8PCBHUElPX1BPUlRfU0hJRlQpCisjZGVmaW5lIEdQSU9fUE9SVEUJKDQgPDwgR1BJT19QT1JUX1NISUZUKQorI2RlZmluZSBHUElPX1BPUlRGCSg1IDw8IEdQSU9fUE9SVF9TSElGVCkKKwogLyoKICAqIHNldHVwcyBhIHNpbmdsZSBwYWQgaW4gdGhlIGlvbXV4ZXIKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGM0YjQwYzMuLjU2NGVjOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTQ0LDEyICs0NCwxMiBAQAogICovCiAjZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgU1pfOE0KIAotI2VsaWYgZGVmaW5lZChDT05GSUdfTVgxX1ZJREVPKQorI2VsaWYgZGVmaW5lZChDT05GSUdfTVgxX1ZJREVPKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19NWDJfSE9TVFNVUFBPUlQpCiAvKgogICogSW5jcmVhc2Ugc2l6ZSBvZiBETUEtY29uc2lzdGVudCBtZW1vcnkgcmVnaW9uLgogICogVGhpcyBpcyByZXF1aXJlZCBmb3IgaS5NWCBjYW1lcmEgZHJpdmVyIHRvIGNhcHR1cmUgYXQgbGVhc3QgZm91ciBWR0EgZnJhbWVzLgogICovCiAjZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgU1pfNE0KLSNlbmRpZiAvKiBDT05GSUdfTVgxX1ZJREVPICovCisjZW5kaWYgLyogQ09ORklHX01YMV9WSURFTyB8fCBDT05GSUdfVklERU9fTVgyX0hPU1RTVVBQT1JUICovCiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19NRU1PUllfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbW1jLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbW1jLmgKaW5kZXggZGUyMTI4ZC4uMjkxMTVmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21tYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9tbWMuaApAQCAtMzEsNiArMzEsOSBAQAogCiAJLyogYWRqdXN0IHNsb3Qgdm9sdGFnZSAqLwogCXZvaWQgKCpzZXRwb3dlcikoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBpbnQgdmRkKTsKKworCS8qIGVuYWJsZSBjYXJkIGRldGVjdCB1c2luZyBEQVQzICovCisJaW50IGRhdDNfY2FyZF9kZXRlY3Q7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDEuaAppbmRleCA1ZWJhN2U2Li42NDFiMjQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgxLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MS5oCkBAIC05MSwyNCArOTEsMjQgQEAKICNkZWZpbmUgTVgxX1NJTV9EQVRBX0lOVAkxNgogI2RlZmluZSBNWDFfUlRDX0lOVAkJMTcKICNkZWZpbmUgTVgxX1JUQ19TQU1JTlQJCTE4Ci0jZGVmaW5lIE1YMV9VQVJUMl9NSU5UX1BGRVJSCTE5Ci0jZGVmaW5lIE1YMV9VQVJUMl9NSU5UX1JUUwkyMAotI2RlZmluZSBNWDFfVUFSVDJfTUlOVF9EVFIJMjEKLSNkZWZpbmUgTVgxX1VBUlQyX01JTlRfVUFSVEMJMjIKLSNkZWZpbmUgTVgxX1VBUlQyX01JTlRfVFgJMjMKLSNkZWZpbmUgTVgxX1VBUlQyX01JTlRfUlgJMjQKLSNkZWZpbmUgTVgxX1VBUlQxX01JTlRfUEZFUlIJMjUKLSNkZWZpbmUgTVgxX1VBUlQxX01JTlRfUlRTCTI2Ci0jZGVmaW5lIE1YMV9VQVJUMV9NSU5UX0RUUgkyNwotI2RlZmluZSBNWDFfVUFSVDFfTUlOVF9VQVJUQwkyOAotI2RlZmluZSBNWDFfVUFSVDFfTUlOVF9UWAkyOQotI2RlZmluZSBNWDFfVUFSVDFfTUlOVF9SWAkzMAorI2RlZmluZSBNWDFfSU5UX1VBUlQyUEZFUlIJMTkKKyNkZWZpbmUgTVgxX0lOVF9VQVJUMlJUUwkyMAorI2RlZmluZSBNWDFfSU5UX1VBUlQyRFRSCTIxCisjZGVmaW5lIE1YMV9JTlRfVUFSVDJVQVJUQwkyMgorI2RlZmluZSBNWDFfSU5UX1VBUlQyVFgJCTIzCisjZGVmaW5lIE1YMV9JTlRfVUFSVDJSWAkJMjQKKyNkZWZpbmUgTVgxX0lOVF9VQVJUMVBGRVJSCTI1CisjZGVmaW5lIE1YMV9JTlRfVUFSVDFSVFMJMjYKKyNkZWZpbmUgTVgxX0lOVF9VQVJUMURUUgkyNworI2RlZmluZSBNWDFfSU5UX1VBUlQxVUFSVEMJMjgKKyNkZWZpbmUgTVgxX0lOVF9VQVJUMVRYCQkyOQorI2RlZmluZSBNWDFfSU5UX1VBUlQxUlgJCTMwCiAjZGVmaW5lIE1YMV9WT0lDRV9EQUNfSU5UCTMxCiAjZGVmaW5lIE1YMV9WT0lDRV9BRENfSU5UCTMyCiAjZGVmaW5lIE1YMV9QRU5fREFUQV9JTlQJMzMKICNkZWZpbmUgTVgxX1BXTV9JTlQJCTM0CiAjZGVmaW5lIE1YMV9TREhDX0lOVAkJMzUKLSNkZWZpbmUgTVgxX0kyQ19JTlQJCTM5CisjZGVmaW5lIE1YMV9JTlRfSTJDCQkzOQogI2RlZmluZSBNWDFfQ1NQSV9JTlQJCTQxCiAjZGVmaW5lIE1YMV9TU0lfVFhfSU5UCQk0MgogI2RlZmluZSBNWDFfU1NJX1RYX0VSUl9JTlQJNDMKQEAgLTI0NSw3ICsyNDUsNyBAQAogI2RlZmluZSBQRU5fREFUQV9JTlQgTVgxX1BFTl9EQVRBX0lOVAogI2RlZmluZSBQV01fSU5UIE1YMV9QV01fSU5UCiAjZGVmaW5lIFNESENfSU5UIE1YMV9TREhDX0lOVAotI2RlZmluZSBJMkNfSU5UIE1YMV9JMkNfSU5UCisjZGVmaW5lIEkyQ19JTlQgTVgxX0lOVF9JMkMKICNkZWZpbmUgQ1NQSV9JTlQgTVgxX0NTUElfSU5UCiAjZGVmaW5lIFNTSV9UWF9JTlQgTVgxX1NTSV9UWF9JTlQKICNkZWZpbmUgU1NJX1RYX0VSUl9JTlQgTVgxX1NTSV9UWF9FUlJfSU5UCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjUuaAppbmRleCA0ZWI2ZTMzLi40YTZmODAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI1LmgKQEAgLTExLDYgKzExLDEyIEBACiAjZGVmaW5lIE1YMjVfQVZJQ19CQVNFX0FERFJfVklSVAkweGZjNDAwMDAwCiAjZGVmaW5lIE1YMjVfQVZJQ19TSVpFCQkJU1pfMU0KIAorI2RlZmluZSBNWDI1X0kyQzFfQkFTRV9BRERSCQkoTVgyNV9BSVBTMV9CQVNFX0FERFIgKyAweDgwMDAwKQorI2RlZmluZSBNWDI1X0kyQzNfQkFTRV9BRERSCQkoTVgyNV9BSVBTMV9CQVNFX0FERFIgKyAweDg0MDAwKQorI2RlZmluZSBNWDI1X0NBTjFfQkFTRV9BRERSCQkoTVgyNV9BSVBTMV9CQVNFX0FERFIgKyAweDg4MDAwKQorI2RlZmluZSBNWDI1X0NBTjJfQkFTRV9BRERSCQkoTVgyNV9BSVBTMV9CQVNFX0FERFIgKyAweDhjMDAwKQorI2RlZmluZSBNWDI1X0kyQzJfQkFTRV9BRERSCQkoTVgyNV9BSVBTMV9CQVNFX0FERFIgKyAweDk4MDAwKQorI2RlZmluZSBNWDI1X0NTUEkxX0JBU0VfQUREUgkJKE1YMjVfQUlQUzFfQkFTRV9BRERSICsgMHhhNDAwMCkKICNkZWZpbmUgTVgyNV9JT01VWENfQkFTRV9BRERSCQkoTVgyNV9BSVBTMV9CQVNFX0FERFIgKyAweGFjMDAwKQogCiAjZGVmaW5lIE1YMjVfQ1JNX0JBU0VfQUREUgkJKE1YMjVfQUlQUzJfQkFTRV9BRERSICsgMHg4MDAwMCkKQEAgLTI3LDIyICszMyw0OCBAQAogCUlNWF9JT19BRERSRVNTKHgsIE1YMjVfQUlQUzIpID86CQkJXAogCUlNWF9JT19BRERSRVNTKHgsIE1YMjVfQVZJQykpCiAKKyNkZWZpbmUgTVgyNV9BSVBTMV9JT19BRERSRVNTKHgpIFwKKwkoKCh4KSAtIE1YMjVfQUlQUzFfQkFTRV9BRERSKSArIE1YMjVfQUlQUzFfQkFTRV9BRERSX1ZJUlQpCisKICNkZWZpbmUgTVgyNV9VQVJUMV9CQVNFX0FERFIJCTB4NDNmOTAwMDAKICNkZWZpbmUgTVgyNV9VQVJUMl9CQVNFX0FERFIJCTB4NDNmOTQwMDAKKyNkZWZpbmUgTVgyNV9BVURNVVhfQkFTRV9BRERSCQkweDQzZmIwMDAwCisjZGVmaW5lIE1YMjVfVUFSVDNfQkFTRV9BRERSCQkweDUwMDBjMDAwCisjZGVmaW5lIE1YMjVfVUFSVDRfQkFTRV9BRERSCQkweDUwMDA4MDAwCisjZGVmaW5lIE1YMjVfVUFSVDVfQkFTRV9BRERSCQkweDUwMDJjMDAwCiAKKyNkZWZpbmUgTVgyNV9DU1BJM19CQVNFX0FERFIJCTB4NTAwMDQwMDAKKyNkZWZpbmUgTVgyNV9DU1BJMl9CQVNFX0FERFIJCTB4NTAwMTAwMDAKICNkZWZpbmUgTVgyNV9GRUNfQkFTRV9BRERSCQkweDUwMDM4MDAwCisjZGVmaW5lIE1YMjVfU1NJMl9CQVNFX0FERFIJCTB4NTAwMTQwMDAKKyNkZWZpbmUgTVgyNV9TU0kxX0JBU0VfQUREUgkJMHg1MDAzNDAwMAogI2RlZmluZSBNWDI1X05GQ19CQVNFX0FERFIJCTB4YmIwMDAwMDAKICNkZWZpbmUgTVgyNV9EUllJQ0VfQkFTRV9BRERSCQkweDUzZmZjMDAwCiAjZGVmaW5lIE1YMjVfTENEQ19CQVNFX0FERFIJCTB4NTNmYmMwMDAKKyNkZWZpbmUgTVgyNV9LUFBfQkFTRV9BRERSCQkweDQzZmE4MDAwCisjZGVmaW5lIE1YMjVfT1RHX0JBU0VfQUREUgkJMHg1M2ZmNDAwMAorI2RlZmluZSBNWDI1X0NTSV9CQVNFX0FERFIJCTB4NTNmZjgwMDAKIAotI2RlZmluZSBNWDI1X0lOVF9EUllJQ0UJMjUKLSNkZWZpbmUgTVgyNV9JTlRfRkVDCTU3Ci0jZGVmaW5lIE1YMjVfSU5UX05BTkRGQwkzMwotI2RlZmluZSBNWDI1X0lOVF9MQ0RDCTM5Ci0KLSNpZiBkZWZpbmVkKElNWF9ORUVEU19ERVBSRUNBVEVEX1NZTUJPTFMpCi0jZGVmaW5lIFVBUlQxX0JBU0VfQUREUgkJCU1YMjVfVUFSVDFfQkFTRV9BRERSCi0jZGVmaW5lIFVBUlQyX0JBU0VfQUREUgkJCU1YMjVfVUFSVDJfQkFTRV9BRERSCi0jZW5kaWYKKyNkZWZpbmUgTVgyNV9JTlRfQ1NQSTMJCTAKKyNkZWZpbmUgTVgyNV9JTlRfSTJDMQkJMworI2RlZmluZSBNWDI1X0lOVF9JMkMyCQk0CisjZGVmaW5lIE1YMjVfSU5UX1VBUlQ0CQk1CisjZGVmaW5lIE1YMjVfSU5UX0kyQzMJCTEwCisjZGVmaW5lIE1YMjVfSU5UX1NTSTIJCTExCisjZGVmaW5lIE1YMjVfSU5UX1NTSTEJCTEyCisjZGVmaW5lIE1YMjVfSU5UX0NTUEkyCQkxMworI2RlZmluZSBNWDI1X0lOVF9DU1BJMQkJMTQKKyNkZWZpbmUgTVgyNV9JTlRfQ1NJCQkxNworI2RlZmluZSBNWDI1X0lOVF9VQVJUMwkJMTgKKyNkZWZpbmUgTVgyNV9JTlRfS1BQCQkyNAorI2RlZmluZSBNWDI1X0lOVF9EUllJQ0UJCTI1CisjZGVmaW5lIE1YMjVfSU5UX1VBUlQyCQkzMgorI2RlZmluZSBNWDI1X0lOVF9OQU5ERkMJCTMzCisjZGVmaW5lIE1YMjVfSU5UX0xDREMJCTM5CisjZGVmaW5lIE1YMjVfSU5UX1VBUlQ1CQk0MAorI2RlZmluZSBNWDI1X0lOVF9DQU4xCQk0MworI2RlZmluZSBNWDI1X0lOVF9DQU4yCQk0NAorI2RlZmluZSBNWDI1X0lOVF9VQVJUMQkJNDUKKyNkZWZpbmUgTVgyNV9JTlRfRkVDCQk1NwogCiAjZW5kaWYgLyogaWZuZGVmIF9fTUFDSF9NWDI1X0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjcuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmgKaW5kZXggYmFlOWNkNy4uYThhYjJlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjcuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oCkBAIC00OCw3ICs0OCw3IEBACiAjZGVmaW5lIE1YMjdfQ1NQSTJfQkFTRV9BRERSCQkJKE1YMjdfQUlQSV9CQVNFX0FERFIgKyAweDBmMDAwKQogI2RlZmluZSBNWDI3X1NTSTFfQkFTRV9BRERSCQkJKE1YMjdfQUlQSV9CQVNFX0FERFIgKyAweDEwMDAwKQogI2RlZmluZSBNWDI3X1NTSTJfQkFTRV9BRERSCQkJKE1YMjdfQUlQSV9CQVNFX0FERFIgKyAweDExMDAwKQotI2RlZmluZSBNWDI3X0kyQ19CQVNFX0FERFIJCQkoTVgyN19BSVBJX0JBU0VfQUREUiArIDB4MTIwMDApCisjZGVmaW5lIE1YMjdfSTJDMV9CQVNFX0FERFIJCQkoTVgyN19BSVBJX0JBU0VfQUREUiArIDB4MTIwMDApCiAjZGVmaW5lIE1YMjdfU0RIQzFfQkFTRV9BRERSCQkJKE1YMjdfQUlQSV9CQVNFX0FERFIgKyAweDEzMDAwKQogI2RlZmluZSBNWDI3X1NESEMyX0JBU0VfQUREUgkJCShNWDI3X0FJUElfQkFTRV9BRERSICsgMHgxNDAwMCkKICNkZWZpbmUgTVgyN19HUElPX0JBU0VfQUREUgkJCShNWDI3X0FJUElfQkFTRV9BRERSICsgMHgxNTAwMCkKQEAgLTE1MCw3ICsxNTAsNyBAQAogI2RlZmluZSBNWDI3X0lOVF9TREhDMwkJOQogI2RlZmluZSBNWDI3X0lOVF9TREhDMgkJMTAKICNkZWZpbmUgTVgyN19JTlRfU0RIQzEJCTExCi0jZGVmaW5lIE1YMjdfSU5UX0kyQwkJMTIKKyNkZWZpbmUgTVgyN19JTlRfSTJDMQkJMTIKICNkZWZpbmUgTVgyN19JTlRfU1NJMgkJMTMKICNkZWZpbmUgTVgyN19JTlRfU1NJMQkJMTQKICNkZWZpbmUgTVgyN19JTlRfQ1NQSTIJCTE1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyX2NhbS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Ml9jYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA4MGEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Ml9jYW0uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogbXgyLWNhbS5oIC0gaS5NWDI3L2kuTVgyNSBjYW1lcmEgZHJpdmVyIGhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEJhcnVjaCBTaWFjaCA8YmFydWNoQHRrb3MuY28uaWw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTUFDSF9NWDJfQ0FNX0hfCisjZGVmaW5lIF9fTUFDSF9NWDJfQ0FNX0hfCisKKyNkZWZpbmUgTVgyX0NBTUVSQV9TV0FQMTYJCSgxIDw8IDApCisjZGVmaW5lIE1YMl9DQU1FUkFfRVhUX1ZTWU5DCQkoMSA8PCAxKQorI2RlZmluZSBNWDJfQ0FNRVJBX0NDSVIJCQkoMSA8PCAyKQorI2RlZmluZSBNWDJfQ0FNRVJBX0NDSVJfSU5URVJMQUNFCSgxIDw8IDMpCisjZGVmaW5lIE1YMl9DQU1FUkFfSFNZTkNfSElHSAkJKDEgPDwgNCkKKyNkZWZpbmUgTVgyX0NBTUVSQV9HQVRFRF9DTE9DSwkJKDEgPDwgNSkKKyNkZWZpbmUgTVgyX0NBTUVSQV9JTlZfREFUQQkJKDEgPDwgNikKKyNkZWZpbmUgTVgyX0NBTUVSQV9QQ0xLX1NBTVBMRV9SSVNJTkcJKDEgPDwgNykKKyNkZWZpbmUgTVgyX0NBTUVSQV9QQUNLX0RJUl9NU0IJCSgxIDw8IDgpCisKKy8qKgorICogc3RydWN0IG14Ml9jYW1lcmFfcGxhdGZvcm1fZGF0YSAtIG9wdGlvbmFsIHBsYXRmb3JtIGRhdGEgZm9yIG14Ml9jYW1lcmEKKyAqIEBmbGFnczogYW55IGNvbWJpbmF0aW9uIG9mIE1YMl9DQU1FUkFfKgorICogQGNsazogY2xvY2sgcmF0ZSBvZiB0aGUgY3NpIGJsb2NrIC8gMgorICovCitzdHJ1Y3QgbXgyX2NhbWVyYV9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgY2xrOworfTsKKworI2VuZGlmIC8qIF9fTUFDSF9NWDJfQ0FNX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzEuaAppbmRleCBmYjkwZTExLi5hZmVlM2FiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDMxLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNkZWZpbmUgTVgzMV9FVEJfU0xPVDRfQkFTRV9BRERSCQkoTVgzMV9BSVBTMV9CQVNFX0FERFIgKyAweDEwMDAwKQogI2RlZmluZSBNWDMxX0VUQl9TTE9UNV9CQVNFX0FERFIJCShNWDMxX0FJUFMxX0JBU0VfQUREUiArIDB4MTQwMDApCiAjZGVmaW5lIE1YMzFfRUNUX0NUSU9fQkFTRV9BRERSCQkJKE1YMzFfQUlQUzFfQkFTRV9BRERSICsgMHgxODAwMCkKLSNkZWZpbmUgTVgzMV9JMkNfQkFTRV9BRERSCQkJKE1YMzFfQUlQUzFfQkFTRV9BRERSICsgMHg4MDAwMCkKKyNkZWZpbmUgTVgzMV9JMkMxX0JBU0VfQUREUgkJCShNWDMxX0FJUFMxX0JBU0VfQUREUiArIDB4ODAwMDApCiAjZGVmaW5lIE1YMzFfSTJDM19CQVNFX0FERFIJCQkoTVgzMV9BSVBTMV9CQVNFX0FERFIgKyAweDg0MDAwKQogI2RlZmluZSBNWDMxX09UR19CQVNFX0FERFIJCQkoTVgzMV9BSVBTMV9CQVNFX0FERFIgKyAweDg4MDAwKQogI2RlZmluZSBNWDMxX0FUQV9CQVNFX0FERFIJCQkoTVgzMV9BSVBTMV9CQVNFX0FERFIgKyAweDhjMDAwKQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAjZGVmaW5lIE1YMzFfSU5UX0ZJUkkJCTcKICNkZWZpbmUgTVgzMV9JTlRfTU1DX1NESEMyCTgKICNkZWZpbmUgTVgzMV9JTlRfTU1DX1NESEMxCTkKLSNkZWZpbmUgTVgzMV9JTlRfSTJDCQkxMAorI2RlZmluZSBNWDMxX0lOVF9JMkMxCQkxMAogI2RlZmluZSBNWDMxX0lOVF9TU0kyCQkxMQogI2RlZmluZSBNWDMxX0lOVF9TU0kxCQkxMgogI2RlZmluZSBNWDMxX0lOVF9DU1BJMgkJMTMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDM1LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzNS5oCmluZGV4IDUyNmE1NTguLmFmMzAzOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDM1LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzUuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBNWDM1X0VUQl9TTE9UNF9CQVNFX0FERFIJCShNWDM1X0FJUFMxX0JBU0VfQUREUiArIDB4MTAwMDApCiAjZGVmaW5lIE1YMzVfRVRCX1NMT1Q1X0JBU0VfQUREUgkJKE1YMzVfQUlQUzFfQkFTRV9BRERSICsgMHgxNDAwMCkKICNkZWZpbmUgTVgzNV9FQ1RfQ1RJT19CQVNFX0FERFIJCQkoTVgzNV9BSVBTMV9CQVNFX0FERFIgKyAweDE4MDAwKQotI2RlZmluZSBNWDM1X0kyQ19CQVNFX0FERFIJCQkoTVgzNV9BSVBTMV9CQVNFX0FERFIgKyAweDgwMDAwKQorI2RlZmluZSBNWDM1X0kyQzFfQkFTRV9BRERSCQkJKE1YMzVfQUlQUzFfQkFTRV9BRERSICsgMHg4MDAwMCkKICNkZWZpbmUgTVgzNV9JMkMzX0JBU0VfQUREUgkJCShNWDM1X0FJUFMxX0JBU0VfQUREUiArIDB4ODQwMDApCiAjZGVmaW5lIE1YMzVfVUFSVDFfQkFTRV9BRERSCQkJKE1YMzVfQUlQUzFfQkFTRV9BRERSICsgMHg5MDAwMCkKICNkZWZpbmUgTVgzNV9VQVJUMl9CQVNFX0FERFIJCQkoTVgzNV9BSVBTMV9CQVNFX0FERFIgKyAweDk0MDAwKQpAQCAtNjAsNiArNjAsOCBAQAogI2RlZmluZSBNWDM1X1JUQ19CQVNFX0FERFIJCQkoTVgzNV9BSVBTMl9CQVNFX0FERFIgKyAweGQ4MDAwKQogI2RlZmluZSBNWDM1X1dET0dfQkFTRV9BRERSCQkJKE1YMzVfQUlQUzJfQkFTRV9BRERSICsgMHhkYzAwMCkKICNkZWZpbmUgTVgzNV9QV01fQkFTRV9BRERSCQkJKE1YMzVfQUlQUzJfQkFTRV9BRERSICsgMHhlMDAwMCkKKyNkZWZpbmUgTVgzNV9DQU4xX0JBU0VfQUREUgkJCShNWDM1X0FJUFMyX0JBU0VfQUREUiArIDB4ZTQwMDApCisjZGVmaW5lIE1YMzVfQ0FOMl9CQVNFX0FERFIJCQkoTVgzNV9BSVBTMl9CQVNFX0FERFIgKyAweGU4MDAwKQogI2RlZmluZSBNWDM1X1JUSUNfQkFTRV9BRERSCQkJKE1YMzVfQUlQUzJfQkFTRV9BRERSICsgMHhlYzAwMCkKICNkZWZpbmUgTVgzNV9PVEdfQkFTRV9BRERSCQkweDUzZmY0MDAwCiAKQEAgLTEyMyw3ICsxMjUsNyBAQAogI2RlZmluZSBNWDM1X0lOVF9NTUNfU0RIQzEJNwogI2RlZmluZSBNWDM1X0lOVF9NTUNfU0RIQzIJOAogI2RlZmluZSBNWDM1X0lOVF9NTUNfU0RIQzMJOQotI2RlZmluZSBNWDM1X0lOVF9JMkMJCTEwCisjZGVmaW5lIE1YMzVfSU5UX0kyQzEJCTEwCiAjZGVmaW5lIE1YMzVfSU5UX1NTSTEJCTExCiAjZGVmaW5lIE1YMzVfSU5UX1NTSTIJCTEyCiAjZGVmaW5lIE1YMzVfSU5UX0NTUEkyCQkxMwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214M19jYW1lcmEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDNfY2FtZXJhLmgKaW5kZXggMzZkN2ZmMi4uZjIyNmVlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214M19jYW1lcmEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzX2NhbWVyYS5oCkBAIC0xMiwxMCArMTIsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAjaWZuZGVmIF9NWDNfQ0FNRVJBX0hfCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjOTEyMzEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGM5MTIzMS5oCmluZGV4IDUxODJiOTguLjBjYTMxMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGM5MTIzMS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGM5MTIzMS5oCkBAIC0xMywxMCArMTMsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KICNpZm5kZWYgX19NQUNIX01YQzkxMjMxX0hfXwogI2RlZmluZSBfX01BQ0hfTVhDOTEyMzFfSF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjX25hbmQuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfbmFuZC5oCmluZGV4IDVkMmQyMWQuLjA0YzBkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfbmFuZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfbmFuZC5oCkBAIC0yMCw5ICsyMCwxMyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX05BTkRfSAogI2RlZmluZSBfX0FTTV9BUkNIX05BTkRfSAogCisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKwogc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEgewotCWludCB3aWR0aDsJLyogZGF0YSBidXMgd2lkdGggaW4gYnl0ZXMgKi8KLQlpbnQgaHdfZWNjOjE7CS8qIDAgaWYgc3VwcmVzcyBoYXJkd2FyZSBFQ0MgKi8KLQlpbnQgZmxhc2hfYmJ0OjE7IC8qIHNldCB0byAxIHRvIHVzZSBhIGZsYXNoIGJhc2VkIGJidCAqLworCXVuc2lnbmVkIGludCB3aWR0aDsJLyogZGF0YSBidXMgd2lkdGggaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgaHdfZWNjOjE7CS8qIDAgaWYgc3VwcmVzcyBoYXJkd2FyZSBFQ0MgKi8KKwl1bnNpZ25lZCBpbnQgZmxhc2hfYmJ0OjE7IC8qIHNldCB0byAxIHRvIHVzZSBhIGZsYXNoIGJhc2VkIGJidCAqLworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsJLyogcGFydGl0aW9uIHRhYmxlICovCisJaW50IG5yX3BhcnRzOwkJCS8qIHNpemUgb2YgcGFydHMgKi8KIH07CiAjZW5kaWYgLyogX19BU01fQVJDSF9OQU5EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCBlZjAwMTk5Li40YWNkMTE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0xMiwxMCArMTIsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19TWVNURU1fSF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC90aW1leC5oCmluZGV4IDAyNDQxNmUuLjJkOTYyNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC90aW1leC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC0xMSwxMCArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19USU1FWF9IX18KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IGI2ZDNkMGYuLmQ5YmQzN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMTMsMTAgKzEzLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX1VOQ09NUFJFU1NfSF9fCiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX1VOQ09NUFJFU1NfSF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAppbmRleCA0NDI0M2EyLi5lZjYzNzljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTExLDEwICsxMSw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX1ZNQUxMT0NfSF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pcnEuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2lycS5jCmluZGV4IDc3OGRkZmUuLjczMzFmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2lycS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2lycS5jCkBAIC0xNDIsOSArMTQyLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlfX3Jhd193cml0ZWwoMCwgYXZpY19iYXNlICsgQVZJQ19OSVBSSU9SSVRZKGkpKTsKIAotCS8qIGluaXQgYXJjaGl0ZWN0dXJlcyBjaGFpbmVkIGludGVycnVwdCBoYW5kbGVyICovCi0JbXhjX3JlZ2lzdGVyX2dwaW9zKCk7Ci0KICNpZmRlZiBDT05GSUdfRklRCiAJLyogSW5pdGlhbGl6ZSBGSVEgKi8KIAlpbml0X0ZJUSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvc3lzdGVtLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9zeXN0ZW0uYwppbmRleCA5N2Y0Mjc5Li45MjViY2U0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9zeXN0ZW0uYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9zeXN0ZW0uYwpAQCAtMTQsMTAgKzE0LDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYwppbmRleCA5Yjg2ZDJhLi5iM2RhOWFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy90emljLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvdHppYy5jCkBAIC0xNDUsOCArMTQ1LDYgQEAKIAkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOwogCX0KLQlteGNfcmVnaXN0ZXJfZ3Bpb3MoKTsKLQogCXByX2luZm8oIlRydXN0Wm9uZSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoVFpJQykgaW5pdGlhbGl6ZWRcbiIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2dwaW8uYwppbmRleCA1YTZlZjI1Li45NzdjOGY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9ncGlvLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNpbmNsdWRlIDxwbGF0L3BpbmNmZy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIApAQCAtNDYsMjAgKzQ3LDEyIEBACiAJdTMyIGVkZ2VfZmFsbGluZzsKIH07CiAKLS8qIE1vZGUgZnVuY3Rpb25zICovCi1pbnQgbm1rX2dwaW9fc2V0X21vZGUoaW50IGdwaW8sIGludCBncGlvX21vZGUpCitzdGF0aWMgdm9pZCBfX25ta19ncGlvX3NldF9tb2RlKHN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCBncGlvX21vZGUpCiB7Ci0Jc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGFmdW5jLCBiZnVuYywgYml0OworCXUzMiBiaXQgPSAxIDw8IG9mZnNldDsKKwl1MzIgYWZ1bmMsIGJmdW5jOwogCi0Jbm1rX2NoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShOT01BRElLX0dQSU9fVE9fSVJRKGdwaW8pKTsKLQlpZiAoIW5ta19jaGlwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJpdCA9IDEgPDwgKGdwaW8gLSBubWtfY2hpcC0+Y2hpcC5iYXNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOwogCWFmdW5jID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19BRlNMQSkgJiB+Yml0OwogCWJmdW5jID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19BRlNMQikgJiB+Yml0OwogCWlmIChncGlvX21vZGUgJiBOTUtfR1BJT19BTFRfQSkKQEAgLTY4LDYgKzYxLDIwMyBAQAogCQliZnVuYyB8PSBiaXQ7CiAJd3JpdGVsKGFmdW5jLCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0FGU0xBKTsKIAl3cml0ZWwoYmZ1bmMsIG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fQUZTTEIpOworfQorCitzdGF0aWMgdm9pZCBfX25ta19ncGlvX3NldF9zbHBtKHN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGVudW0gbm1rX2dwaW9fc2xwbSBtb2RlKQoreworCXUzMiBiaXQgPSAxIDw8IG9mZnNldDsKKwl1MzIgc2xwbTsKKworCXNscG0gPSByZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOworCWlmIChtb2RlID09IE5NS19HUElPX1NMUE1fTk9DSEFOR0UpCisJCXNscG0gfD0gYml0OworCWVsc2UKKwkJc2xwbSAmPSB+Yml0OworCXdyaXRlbChzbHBtLCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOworfQorCitzdGF0aWMgdm9pZCBfX25ta19ncGlvX3NldF9wdWxsKHN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGVudW0gbm1rX2dwaW9fcHVsbCBwdWxsKQoreworCXUzMiBiaXQgPSAxIDw8IG9mZnNldDsKKwl1MzIgcGRpczsKKworCXBkaXMgPSByZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX1BESVMpOworCWlmIChwdWxsID09IE5NS19HUElPX1BVTExfTk9ORSkKKwkJcGRpcyB8PSBiaXQ7CisJZWxzZQorCQlwZGlzICY9IH5iaXQ7CisJd3JpdGVsKHBkaXMsIG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fUERJUyk7CisKKwlpZiAocHVsbCA9PSBOTUtfR1BJT19QVUxMX1VQKQorCQl3cml0ZWwoYml0LCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0RBVFMpOworCWVsc2UgaWYgKHB1bGwgPT0gTk1LX0dQSU9fUFVMTF9ET1dOKQorCQl3cml0ZWwoYml0LCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0RBVEMpOworfQorCitzdGF0aWMgdm9pZCBfX25ta19ncGlvX21ha2VfaW5wdXQoc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwLAorCQkJCSAgdW5zaWduZWQgb2Zmc2V0KQoreworCXdyaXRlbCgxIDw8IG9mZnNldCwgbm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19ESVJDKTsKK30KKworc3RhdGljIHZvaWQgX19ubWtfY29uZmlnX3BpbihzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCSAgICAgcGluX2NmZ190IGNmZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqYWZuYW1lc1tdID0geworCQlbTk1LX0dQSU9fQUxUX0dQSU9dCT0gIkdQSU8iLAorCQlbTk1LX0dQSU9fQUxUX0FdCT0gIkEiLAorCQlbTk1LX0dQSU9fQUxUX0JdCT0gIkIiLAorCQlbTk1LX0dQSU9fQUxUX0NdCT0gIkMiCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqcHVsbG5hbWVzW10gPSB7CisJCVtOTUtfR1BJT19QVUxMX05PTkVdCT0gIm5vbmUiLAorCQlbTk1LX0dQSU9fUFVMTF9VUF0JPSAidXAiLAorCQlbTk1LX0dQSU9fUFVMTF9ET1dOXQk9ICJkb3duIiwKKwkJWzNdIC8qIGlsbGVnYWwgKi8JPSAiPz8iCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqc2xwbW5hbWVzW10gPSB7CisJCVtOTUtfR1BJT19TTFBNX0lOUFVUXQkJPSAiaW5wdXQiLAorCQlbTk1LX0dQSU9fU0xQTV9OT0NIQU5HRV0JPSAibm8tY2hhbmdlIiwKKwl9OworCisJaW50IHBpbiA9IFBJTl9OVU0oY2ZnKTsKKwlpbnQgcHVsbCA9IFBJTl9QVUxMKGNmZyk7CisJaW50IGFmID0gUElOX0FMVChjZmcpOworCWludCBzbHBtID0gUElOX1NMUE0oY2ZnKTsKKworCWRldl9kYmcobm1rX2NoaXAtPmNoaXAuZGV2LCAicGluICVkOiBhZiAlcywgcHVsbCAlcywgc2xwbSAlc1xuIiwKKwkJcGluLCBhZm5hbWVzW2FmXSwgcHVsbG5hbWVzW3B1bGxdLCBzbHBtbmFtZXNbc2xwbV0pOworCisJX19ubWtfZ3Bpb19tYWtlX2lucHV0KG5ta19jaGlwLCBvZmZzZXQpOworCV9fbm1rX2dwaW9fc2V0X3B1bGwobm1rX2NoaXAsIG9mZnNldCwgcHVsbCk7CisJX19ubWtfZ3Bpb19zZXRfc2xwbShubWtfY2hpcCwgb2Zmc2V0LCBzbHBtKTsKKwlfX25ta19ncGlvX3NldF9tb2RlKG5ta19jaGlwLCBvZmZzZXQsIGFmKTsKK30KKworLyoqCisgKiBubWtfY29uZmlnX3BpbiAtIGNvbmZpZ3VyZSBhIHBpbidzIG11eCBhdHRyaWJ1dGVzCisgKiBAY2ZnOiBwaW4gY29uZmd1cmF0aW9uCisgKgorICogQ29uZmlndXJlcyBhIHBpbidzIG1vZGUgKGFsdGVybmF0ZSBmdW5jdGlvbiBvciBHUElPKSwgaXRzIHB1bGwgdXAgc3RhdHVzLAorICogYW5kIGl0cyBzbGVlcCBtb2RlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4gIFRoZSBAY2ZnIGlzCisgKiB1c3VhbGx5IG9uZSBvZiB0aGUgU29DIHNwZWNpZmljIG1hY3JvcyBkZWZpbmVkIGluIG1hY2gvPHNvYz4tcGlucy5oLiAgVGhlc2UKKyAqIGFyZSBjb25zdHJ1Y3RlZCB1c2luZywgYW5kIGNhbiBiZSBmdXJ0aGVyIGVuaGFuY2VkIHdpdGgsIHRoZSBtYWNyb3MgaW4KKyAqIHBsYXQvcGluY2ZnLmguCisgKgorICogSWYgYSBwaW4ncyBtb2RlIGlzIHNldCB0byBHUElPLCBpdCBpcyBjb25maWd1cmVkIGFzIGFuIGlucHV0IHRvIGF2b2lkCisgKiBzaWRlLWVmZmVjdHMuICBUaGUgZ3BpbyBjYW4gYmUgbWFuaXB1bGF0ZWQgbGF0ZXIgdXNpbmcgc3RhbmRhcmQgR1BJTyBBUEkKKyAqIGNhbGxzLgorICovCitpbnQgbm1rX2NvbmZpZ19waW4ocGluX2NmZ190IGNmZykKK3sKKwlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXA7CisJaW50IGdwaW8gPSBQSU5fTlVNKGNmZyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5ta19jaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoTk9NQURJS19HUElPX1RPX0lSUShncGlvKSk7CisJaWYgKCFubWtfY2hpcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKKwlfX25ta19jb25maWdfcGluKG5ta19jaGlwLCBncGlvIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSwgY2ZnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG5ta19jb25maWdfcGluKTsKKworLyoqCisgKiBubWtfY29uZmlnX3BpbnMgLSBjb25maWd1cmUgc2V2ZXJhbCBwaW5zIGF0IG9uY2UKKyAqIEBjZmdzOiBhcnJheSBvZiBwaW4gY29uZmlndXJhdGlvbnMKKyAqIEBudW06IG51bWJlciBvZiBlbG1lbnRzIGluIHRoZSBhcnJheQorICoKKyAqIENvbmZpZ3VyZXMgc2V2ZXJhbCBwaW5zIHVzaW5nIG5ta19jb25maWdfcGluKCkuICBSZWZlciB0byB0aGF0IGZ1bmN0aW9uIGZvcgorICogZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqLworaW50IG5ta19jb25maWdfcGlucyhwaW5fY2ZnX3QgKmNmZ3MsIGludCBudW0pCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaW50IHJldCA9IG5ta19jb25maWdfcGluKGNmZ3NbaV0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobm1rX2NvbmZpZ19waW5zKTsKKworLyoqCisgKiBubWtfZ3Bpb19zZXRfc2xwbSgpIC0gY29uZmlndXJlIHRoZSBzbGVlcCBtb2RlIG9mIGEgcGluCisgKiBAZ3BpbzogcGluIG51bWJlcgorICogQG1vZGU6IE5NS19HUElPX1NMUE1fSU5QVVQgb3IgTk1LX0dQSU9fU0xQTV9OT0NIQU5HRSwKKyAqCisgKiBTZXRzIHRoZSBzbGVlcCBtb2RlIG9mIGEgcGluLiAgSWYgQG1vZGUgaXMgTk1LX0dQSU9fU0xQTV9JTlBVVCwgdGhlIHBpbiBpcworICogY2hhbmdlZCB0byBhbiBpbnB1dCAod2l0aCBwdWxsdXAvZG93biBlbmFibGVkKSBpbiBzbGVlcCBhbmQgZGVlcCBzbGVlcC4gIElmCisgKiBAbW9kZSBpcyBOTUtfR1BJT19TTFBNX05PQ0hBTkdFLCB0aGUgcGluIHJlbWFpbnMgaW4gdGhlIHN0YXRlIGl0IHdhcworICogY29uZmlndXJlZCBldmVuIHdoZW4gaW4gc2xlZXAgYW5kIGRlZXAgc2xlZXAuCisgKi8KK2ludCBubWtfZ3Bpb19zZXRfc2xwbShpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19zbHBtIG1vZGUpCit7CisJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlubWtfY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKE5PTUFESUtfR1BJT19UT19JUlEoZ3BpbykpOworCWlmICghbm1rX2NoaXApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CisJX19ubWtfZ3Bpb19zZXRfc2xwbShubWtfY2hpcCwgZ3BpbyAtIG5ta19jaGlwLT5jaGlwLmJhc2UsIG1vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBubWtfZ3Bpb19zZXRfcHVsbCgpIC0gZW5hYmxlL2Rpc2FibGUgcHVsbCB1cC9kb3duIG9uIGEgZ3BpbworICogQGdwaW86IHBpbiBudW1iZXIKKyAqIEBwdWxsOiBvbmUgb2YgTk1LX0dQSU9fUFVMTF9ET1dOLCBOTUtfR1BJT19QVUxMX1VQLCBhbmQgTk1LX0dQSU9fUFVMTF9OT05FCisgKgorICogRW5hYmxlcy9kaXNhYmxlcyBwdWxsIHVwL2Rvd24gb24gYSBzcGVjaWZpZWQgcGluLiAgVGhpcyBvbmx5IHRha2VzIGVmZmVjdCBpZgorICogdGhlIHBpbiBpcyBjb25maWd1cmVkIGFzIGFuIGlucHV0IChlaXRoZXIgZXhwbGljaXRseSBvciBieSB0aGUgYWx0ZXJuYXRlCisgKiBmdW5jdGlvbikuCisgKgorICogTk9URTogSWYgZW5hYmxpbmcgdGhlIHB1bGwgdXAvZG93biwgdGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBHUElPIGlzCisgKiBjb25maWd1cmVkIGFzIGFuIGlucHV0LiAgT3RoZXJ3aXNlLCBkdWUgdG8gdGhlIHdheSB0aGUgY29udHJvbGxlciByZWdpc3RlcnMKKyAqIHdvcmssIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIHZhbHVlIG91dHB1dCBvbiB0aGUgcGluLgorICovCitpbnQgbm1rX2dwaW9fc2V0X3B1bGwoaW50IGdwaW8sIGVudW0gbm1rX2dwaW9fcHVsbCBwdWxsKQoreworCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbm1rX2NoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShOT01BRElLX0dQSU9fVE9fSVJRKGdwaW8pKTsKKwlpZiAoIW5ta19jaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOworCV9fbm1rX2dwaW9fc2V0X3B1bGwobm1rX2NoaXAsIGdwaW8gLSBubWtfY2hpcC0+Y2hpcC5iYXNlLCBwdWxsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZGUgZnVuY3Rpb25zICovCitpbnQgbm1rX2dwaW9fc2V0X21vZGUoaW50IGdwaW8sIGludCBncGlvX21vZGUpCit7CisJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlubWtfY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKE5PTUFESUtfR1BJT19UT19JUlEoZ3BpbykpOworCWlmICghbm1rX2NoaXApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CisJX19ubWtfZ3Bpb19zZXRfbW9kZShubWtfY2hpcCwgZ3BpbyAtIG5ta19jaGlwLT5jaGlwLmJhc2UsIGdwaW9fbW9kZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMTExLDMyICszMDEsNDEgQEAKIAl3cml0ZWwobm1rX2dwaW9fZ2V0X2JpdG1hc2soZ3BpbyksIG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fSUMpOwogfQogCitlbnVtIG5ta19ncGlvX2lycV90eXBlIHsKKwlOT1JNQUwsCisJV0FLRSwKK307CisKIHN0YXRpYyB2b2lkIF9fbm1rX2dwaW9faXJxX21vZGlmeShzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAsCi0JCQkJICBpbnQgZ3BpbywgYm9vbCBlbmFibGUpCisJCQkJICBpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19pcnFfdHlwZSB3aGljaCwKKwkJCQkgIGJvb2wgZW5hYmxlKQogeworCXUzMiByaW1zYyA9IHdoaWNoID09IFdBS0UgPyBOTUtfR1BJT19SV0lNU0MgOiBOTUtfR1BJT19SSU1TQzsKKwl1MzIgZmltc2MgPSB3aGljaCA9PSBXQUtFID8gTk1LX0dQSU9fRldJTVNDIDogTk1LX0dQSU9fRklNU0M7CiAJdTMyIGJpdG1hc2sgPSBubWtfZ3Bpb19nZXRfYml0bWFzayhncGlvKTsKIAl1MzIgcmVnOwogCiAJLyogd2UgbXVzdCBpbmRpdmlkdWFsbHkgc2V0L2NsZWFyIHRoZSB0d28gZWRnZXMgKi8KIAlpZiAobm1rX2NoaXAtPmVkZ2VfcmlzaW5nICYgYml0bWFzaykgewotCQlyZWcgPSByZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX1JJTVNDKTsKKwkJcmVnID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyByaW1zYyk7CiAJCWlmIChlbmFibGUpCiAJCQlyZWcgfD0gYml0bWFzazsKIAkJZWxzZQogCQkJcmVnICY9IH5iaXRtYXNrOwotCQl3cml0ZWwocmVnLCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX1JJTVNDKTsKKwkJd3JpdGVsKHJlZywgbm1rX2NoaXAtPmFkZHIgKyByaW1zYyk7CiAJfQogCWlmIChubWtfY2hpcC0+ZWRnZV9mYWxsaW5nICYgYml0bWFzaykgewotCQlyZWcgPSByZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0ZJTVNDKTsKKwkJcmVnID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyBmaW1zYyk7CiAJCWlmIChlbmFibGUpCiAJCQlyZWcgfD0gYml0bWFzazsKIAkJZWxzZQogCQkJcmVnICY9IH5iaXRtYXNrOwotCQl3cml0ZWwocmVnLCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0ZJTVNDKTsKKwkJd3JpdGVsKHJlZywgbm1rX2NoaXAtPmFkZHIgKyBmaW1zYyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBubWtfZ3Bpb19pcnFfbW9kaWZ5KHVuc2lnbmVkIGludCBpcnEsIGJvb2wgZW5hYmxlKQorc3RhdGljIGludCBubWtfZ3Bpb19pcnFfbW9kaWZ5KHVuc2lnbmVkIGludCBpcnEsIGVudW0gbm1rX2dwaW9faXJxX3R5cGUgd2hpY2gsCisJCQkgICAgICAgYm9vbCBlbmFibGUpCiB7CiAJaW50IGdwaW87CiAJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwOwpAQCAtMTQ3LDI2ICszNDYsMzUgQEAKIAlubWtfY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJYml0bWFzayA9IG5ta19ncGlvX2dldF9iaXRtYXNrKGdwaW8pOwogCWlmICghbm1rX2NoaXApCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKLQlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIGVuYWJsZSk7CisJX19ubWtfZ3Bpb19pcnFfbW9kaWZ5KG5ta19jaGlwLCBncGlvLCB3aGljaCwgZW5hYmxlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG5ta19ncGlvX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jbm1rX2dwaW9faXJxX21vZGlmeShpcnEsIGZhbHNlKTsKLX07CisJbm1rX2dwaW9faXJxX21vZGlmeShpcnEsIE5PUk1BTCwgZmFsc2UpOworfQogCiBzdGF0aWMgdm9pZCBubWtfZ3Bpb19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jbm1rX2dwaW9faXJxX21vZGlmeShpcnEsIHRydWUpOworCW5ta19ncGlvX2lycV9tb2RpZnkoaXJxLCBOT1JNQUwsIHRydWUpOworfQorCitzdGF0aWMgaW50IG5ta19ncGlvX2lycV9zZXRfd2FrZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgb24pCit7CisJcmV0dXJuIG5ta19ncGlvX2lycV9tb2RpZnkoaXJxLCBXQUtFLCBvbik7CiB9CiAKIHN0YXRpYyBpbnQgbm1rX2dwaW9faXJxX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQogewotCWJvb2wgZW5hYmxlZCA9ICEoaXJxX3RvX2Rlc2MoaXJxKS0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCWJvb2wgZW5hYmxlZCA9ICEoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKTsKKwlib29sIHdha2UgPSBkZXNjLT53YWtlX2RlcHRoOwogCWludCBncGlvOwogCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTg2LDcgKzM5NCwxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGVuYWJsZWQpCi0JCV9fbm1rX2dwaW9faXJxX21vZGlmeShubWtfY2hpcCwgZ3BpbywgZmFsc2UpOworCQlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIE5PUk1BTCwgZmFsc2UpOworCisJaWYgKHdha2UpCisJCV9fbm1rX2dwaW9faXJxX21vZGlmeShubWtfY2hpcCwgZ3BpbywgV0FLRSwgZmFsc2UpOwogCiAJbm1rX2NoaXAtPmVkZ2VfcmlzaW5nICY9IH5iaXRtYXNrOwogCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCkBAIC0xOTcsNyArNDA4LDEwIEBACiAJCW5ta19jaGlwLT5lZGdlX2ZhbGxpbmcgfD0gYml0bWFzazsKIAogCWlmIChlbmFibGVkKQotCQlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIHRydWUpOworCQlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIE5PUk1BTCwgdHJ1ZSk7CisKKwlpZiAod2FrZSkKKwkJX19ubWtfZ3Bpb19pcnFfbW9kaWZ5KG5ta19jaGlwLCBncGlvLCBXQUtFLCB0cnVlKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CiAKQEAgLTIxMCw2ICs0MjQsNyBAQAogCS5tYXNrCQk9IG5ta19ncGlvX2lycV9tYXNrLAogCS51bm1hc2sJCT0gbm1rX2dwaW9faXJxX3VubWFzaywKIAkuc2V0X3R5cGUJPSBubWtfZ3Bpb19pcnFfc2V0X3R5cGUsCisJLnNldF93YWtlCT0gbm1rX2dwaW9faXJxX3NldF93YWtlLAogfTsKIAogc3RhdGljIHZvaWQgbm1rX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQpAQCAtMjY2LDE2ICs0ODEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG5ta19ncGlvX21ha2Vfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQlpbnQgdmFsKQotewotCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCA9Ci0JCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCwgY2hpcCk7Ci0KLQl3cml0ZWwoMSA8PCBvZmZzZXQsIG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fRElSUyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbm1rX2dwaW9fZ2V0X2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPQpAQCAtMjk4LDEyICs1MDMsMzMgQEAKIAkJd3JpdGVsKGJpdCwgbm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19EQVRDKTsKIH0KIAorc3RhdGljIGludCBubWtfZ3Bpb19tYWtlX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPQorCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG5ta19ncGlvX2NoaXAsIGNoaXApOworCisJd3JpdGVsKDEgPDwgb2Zmc2V0LCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0RJUlMpOworCW5ta19ncGlvX3NldF9vdXRwdXQoY2hpcCwgb2Zmc2V0LCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm1rX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPQorCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG5ta19ncGlvX2NoaXAsIGNoaXApOworCisJcmV0dXJuIE5PTUFESUtfR1BJT19UT19JUlEobm1rX2NoaXAtPmNoaXAuYmFzZSkgKyBvZmZzZXQ7Cit9CisKIC8qIFRoaXMgc3RydWN0dXJlIGlzIHJlcGxpY2F0ZWQgZm9yIGVhY2ggR1BJTyBibG9jayBhbGxvY2F0ZWQgYXQgcHJvYmUgdGltZSAqLwogc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgbm1rX2dwaW9fdGVtcGxhdGUgPSB7CiAJLmRpcmVjdGlvbl9pbnB1dAk9IG5ta19ncGlvX21ha2VfaW5wdXQsCiAJLmdldAkJCT0gbm1rX2dwaW9fZ2V0X2lucHV0LAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gbm1rX2dwaW9fbWFrZV9vdXRwdXQsCiAJLnNldAkJCT0gbm1rX2dwaW9fc2V0X291dHB1dCwKKwkudG9faXJxCQkJPSBubWtfZ3Bpb190b19pcnEsCiAJLm5ncGlvCQkJPSBOTUtfR1BJT19QRVJfQ0hJUCwKIAkuY2FuX3NsZWVwCQk9IDAsCiB9OwpAQCAtMzkzLDMwICs2MTksMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBubWtfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQotCW5ta19jaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQlncGlvY2hpcF9yZW1vdmUoJm5ta19jaGlwLT5jaGlwKTsKLQljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKLQljbGtfcHV0KG5ta19jaGlwLT5jbGspOwotCWtmcmVlKG5ta19jaGlwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBubWtfZ3Bpb19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5uYW1lID0gImdwaW8iLAogCQl9LAogCS5wcm9iZSA9IG5ta19ncGlvX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChubWtfZ3Bpb19yZW1vdmUpLAogCS5zdXNwZW5kID0gTlVMTCwgLyogdG8gYmUgZG9uZSAqLwogCS5yZXN1bWUgPSBOVUxMLAogfTsKQEAgLTQyNiw3ICs2MzQsNyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm5ta19ncGlvX2RyaXZlcik7CiB9CiAKLWFyY2hfaW5pdGNhbGwobm1rX2dwaW9faW5pdCk7Citjb3JlX2luaXRjYWxsKG5ta19ncGlvX2luaXQpOwogCiBNT0RVTEVfQVVUSE9SKCJQcmFmdWxsYSBXQURBU0tBUiBhbmQgQWxlc3NhbmRybyBSdWJpbmkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTm9tYWRpayBHUElPIERyaXZlciIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8uaAppbmRleCA0MjAwODExLi5hYmEzNTUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8uaApAQCAtNTUsNiArNTUsMjEgQEAKICNkZWZpbmUgTk1LX0dQSU9fQUxUX0IJMgogI2RlZmluZSBOTUtfR1BJT19BTFRfQwkoTk1LX0dQSU9fQUxUX0EgfCBOTUtfR1BJT19BTFRfQikKIAorLyogUHVsbCB1cC9kb3duIHZhbHVlcyAqLworZW51bSBubWtfZ3Bpb19wdWxsIHsKKwlOTUtfR1BJT19QVUxMX05PTkUsCisJTk1LX0dQSU9fUFVMTF9VUCwKKwlOTUtfR1BJT19QVUxMX0RPV04sCit9OworCisvKiBTbGVlcCBtb2RlICovCitlbnVtIG5ta19ncGlvX3NscG0geworCU5NS19HUElPX1NMUE1fSU5QVVQsCisJTk1LX0dQSU9fU0xQTV9OT0NIQU5HRSwKK307CisKK2V4dGVybiBpbnQgbm1rX2dwaW9fc2V0X3NscG0oaW50IGdwaW8sIGVudW0gbm1rX2dwaW9fc2xwbSBtb2RlKTsKK2V4dGVybiBpbnQgbm1rX2dwaW9fc2V0X3B1bGwoaW50IGdwaW8sIGVudW0gbm1rX2dwaW9fcHVsbCBwdWxsKTsKIGV4dGVybiBpbnQgbm1rX2dwaW9fc2V0X21vZGUoaW50IGdwaW8sIGludCBncGlvX21vZGUpOwogZXh0ZXJuIGludCBubWtfZ3Bpb19nZXRfbW9kZShpbnQgZ3Bpbyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvbXR1LmggYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L210dS5oCmluZGV4IDQyYzkwNzIuLjY1NzA0YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvbXR1LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9tdHUuaApAQCAtMSw2ICsxLDEyIEBACiAjaWZuZGVmIF9fUExBVF9NVFVfSAogI2RlZmluZSBfX1BMQVRfTVRVX0gKIAorLyoKKyAqIEd1YXJhbnRlZWQgcnVudGltZSBjb252ZXJzaW9uIHJhbmdlIGluIHNlY29uZHMgZm9yCisgKiB0aGUgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQuCisgKi8KKyNkZWZpbmUgTVRVX01JTl9SQU5HRSA0CisKIC8qIHNob3VsZCBiZSBzZXQgYnkgdGhlIHBsYXRmb3JtIGNvZGUgKi8KIGV4dGVybiB2b2lkIF9faW9tZW0gKm10dV9iYXNlOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L3BpbmNmZy5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9waW5jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVkMTFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9waW5jZmcuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMgorICogQXV0aG9yOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLmg6CisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogICBlcmljIG1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4KKyAqLworCisjaWZuZGVmIF9fUExBVF9QSU5DRkdfSAorI2RlZmluZSBfX1BMQVRfUElOQ0ZHX0gKKworLyoKKyAqIHBpbiBjb25maWd1cmF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYnkgMzItYml0IGludGVnZXJzOgorICoKKyAqCWJpdCAgMC4uIDggLSBQaW4gTnVtYmVyICg1MTIgUGlucyBNYXhpbXVtKQorICoJYml0ICA5Li4xMCAtIEFsdGVybmF0ZSBGdW5jdGlvbiBTZWxlY3Rpb24KKyAqCWJpdCAxMS4uMTIgLSBQdWxsIHVwL2Rvd24gc3RhdGUKKyAqCWJpdCAgICAgMTMgLSBTbGVlcCBtb2RlIGJlaGF2aW91cgorICoKKyAqIHRvIGZhY2lsaXRhdGUgdGhlIGRlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBwcm92aWRlZAorICoKKyAqIFBJTl9DRkdfREVGQVVMVCAtIGRlZmF1bHQgY29uZmlnICgwKToKKyAqCQkgICAgIHB1bGwgdXAvZG93biA9IGRpc2FibGVkCisgKgkJICAgICBzbGVlcCBtb2RlID0gaW5wdXQKKyAqCisgKiBQSU5fQ0ZHCSAgIC0gZGVmYXVsdCBjb25maWcgd2l0aCBhbHRlcm5hdGUgZnVuY3Rpb24KKyAqIFBJTl9DRkdfUFVMTAkgICAtIGRlZmF1bHQgY29uZmlnIHdpdGggYWx0ZXJuYXRlIGZ1bmN0aW9uIGFuZCBwdWxsIHVwL2Rvd24KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGluX2NmZ190OworCisjZGVmaW5lIFBJTl9OVU1fTUFTSwkJMHgxZmYKKyNkZWZpbmUgUElOX05VTSh4KQkJKCh4KSAmIFBJTl9OVU1fTUFTSykKKworI2RlZmluZSBQSU5fQUxUX1NISUZUCQk5CisjZGVmaW5lIFBJTl9BTFRfTUFTSwkJKDB4MyA8PCBQSU5fQUxUX1NISUZUKQorI2RlZmluZSBQSU5fQUxUKHgpCQkoKCh4KSAmIFBJTl9BTFRfTUFTSykgPj4gUElOX0FMVF9TSElGVCkKKyNkZWZpbmUgUElOX0dQSU8JCShOTUtfR1BJT19BTFRfR1BJTyA8PCBQSU5fQUxUX1NISUZUKQorI2RlZmluZSBQSU5fQUxUX0EJCShOTUtfR1BJT19BTFRfQSA8PCBQSU5fQUxUX1NISUZUKQorI2RlZmluZSBQSU5fQUxUX0IJCShOTUtfR1BJT19BTFRfQiA8PCBQSU5fQUxUX1NISUZUKQorI2RlZmluZSBQSU5fQUxUX0MJCShOTUtfR1BJT19BTFRfQyA8PCBQSU5fQUxUX1NISUZUKQorCisjZGVmaW5lIFBJTl9QVUxMX1NISUZUCQkxMQorI2RlZmluZSBQSU5fUFVMTF9NQVNLCQkoMHgzIDw8IFBJTl9QVUxMX1NISUZUKQorI2RlZmluZSBQSU5fUFVMTCh4KQkJKCgoeCkgJiBQSU5fUFVMTF9NQVNLKSA+PiBQSU5fUFVMTF9TSElGVCkKKyNkZWZpbmUgUElOX1BVTExfTk9ORQkJKE5NS19HUElPX1BVTExfTk9ORSA8PCBQSU5fUFVMTF9TSElGVCkKKyNkZWZpbmUgUElOX1BVTExfVVAJCShOTUtfR1BJT19QVUxMX1VQIDw8IFBJTl9QVUxMX1NISUZUKQorI2RlZmluZSBQSU5fUFVMTF9ET1dOCQkoTk1LX0dQSU9fUFVMTF9ET1dOIDw8IFBJTl9QVUxMX1NISUZUKQorCisjZGVmaW5lIFBJTl9TTFBNX1NISUZUCQkxMworI2RlZmluZSBQSU5fU0xQTV9NQVNLCQkoMHgxIDw8IFBJTl9TTFBNX1NISUZUKQorI2RlZmluZSBQSU5fU0xQTSh4KQkJKCgoeCkgJiBQSU5fU0xQTV9NQVNLKSA+PiBQSU5fU0xQTV9TSElGVCkKKyNkZWZpbmUgUElOX1NMUE1fSU5QVVQJCShOTUtfR1BJT19TTFBNX0lOUFVUIDw8IFBJTl9TTFBNX1NISUZUKQorI2RlZmluZSBQSU5fU0xQTV9OT0NIQU5HRQkoTk1LX0dQSU9fU0xQTV9OT0NIQU5HRSA8PCBQSU5fU0xQTV9TSElGVCkKKworI2RlZmluZSBQSU5fQ0ZHX0RFRkFVTFQJCShQSU5fUFVMTF9OT05FIHwgUElOX1NMUE1fSU5QVVQpCisKKyNkZWZpbmUgUElOX0NGRyhudW0sIGFsdCkJCVwKKwkoUElOX0NGR19ERUZBVUxUIHxcCisJIChQSU5fTlVNKG51bSkgfCBQSU5fIyNhbHQpKQorCisjZGVmaW5lIFBJTl9DRkdfUFVMTChudW0sIGFsdCwgcHVsbCkJXAorCSgoUElOX0NGR19ERUZBVUxUICYgflBJTl9QVUxMX01BU0spIHxcCisJIChQSU5fTlVNKG51bSkgfCBQSU5fIyNhbHQgfCBQSU5fUFVMTF8jI3B1bGwpKQorCitleHRlcm4gaW50IG5ta19jb25maWdfcGluKHBpbl9jZmdfdCBjZmcpOworZXh0ZXJuIGludCBubWtfY29uZmlnX3BpbnMocGluX2NmZ190ICpjZmdzLCBpbnQgbnVtKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvdGltZXIuYyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay90aW1lci5jCmluZGV4IDA4YWFhNGEuLmVhM2NhODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay90aW1lci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay90aW1lci5jCkBAIC00Miw3ICs0Miw2IEBACiAJLnJhdGluZwkJPSAyMDAsCiAJLnJlYWQJCT0gbm1ka19yZWFkX3RpbWVyX2R1bW15LAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5zaGlmdAkJPSAyMCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC04Miw2ICs4MSwxMiBAQAogCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgogCQkvKiBkaXNhYmxlIGlycSAqLwogCQl3cml0ZWwoMCwgbXR1X2Jhc2UgKyBNVFVfSU1TQyk7CisJCS8qIGRpc2FibGUgdGltZXIgKi8KKwkJY3IgPSByZWFkbChtdHVfYmFzZSArIE1UVV9DUigxKSk7CisJCWNyICY9IH5NVFVfQ1JuX0VOQTsKKwkJd3JpdGVsKGNyLCBtdHVfYmFzZSArIE1UVV9DUigxKSk7CisJCS8qIGxvYWQgc29tZSBoaWdoIGRlZmF1bHQgdmFsdWUgKi8KKwkJd3JpdGVsKDB4ZmZmZmZmZmYsIG10dV9iYXNlICsgTVRVX0xSKDEpKTsKIAkJYnJlYWs7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6CiAJCWJyZWFrOwpAQCAtOTgsNyArMTAzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIG5tZGtfY2xrZXZ0ID0gewogCS5uYW1lCQk9ICJtdHVfMSIsCiAJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKLQkuc2hpZnQJCT0gMzIsCiAJLnJhdGluZwkJPSAyMDAsCiAJLnNldF9tb2RlCT0gbm1ka19jbGtldnRfbW9kZSwKIAkuc2V0X25leHRfZXZlbnQJPSBubWRrX2Nsa2V2dF9uZXh0LApAQCAtMTUxLDYgKzE1NSw3IEBACiAJfSBlbHNlIHsKIAkJY3IgfD0gTVRVX0NSbl9QUkVTQ0FMRV8xOwogCX0KKwljbG9ja3NvdXJjZV9jYWxjX211bHRfc2hpZnQoJm5tZGtfY2xrc3JjLCByYXRlLCBNVFVfTUlOX1JBTkdFKTsKIAogCS8qIFRpbWVyIDAgaXMgdGhlIGZyZWUgcnVubmluZyBjbG9ja3NvdXJjZSAqLwogCXdyaXRlbChjciwgbXR1X2Jhc2UgKyBNVFVfQ1IoMCkpOwpAQCAtMTU4LDcgKzE2Myw2IEBACiAJd3JpdGVsKDAsIG10dV9iYXNlICsgTVRVX0JHTFIoMCkpOwogCXdyaXRlbChjciB8IE1UVV9DUm5fRU5BLCBtdHVfYmFzZSArIE1UVV9DUigwKSk7CiAKLQlubWRrX2Nsa3NyYy5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChyYXRlLCBubWRrX2Nsa3NyYy5zaGlmdCk7CiAJLyogTm93IHRoZSBzY2hlZHVsaW5nIGNsb2NrIGlzIHJlYWR5ICovCiAJbm1ka19jbGtzcmMucmVhZCA9IG5tZGtfcmVhZF90aW1lcjsKIApAQCAtMTc1LDggKzE3OSwxMCBAQAogCX0gZWxzZSB7CiAJCWNyIHw9IE1UVV9DUm5fUFJFU0NBTEVfMTsKIAl9CisJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KCZubWRrX2Nsa2V2dCwgcmF0ZSwgTVRVX01JTl9SQU5HRSk7CisKIAl3cml0ZWwoY3IgfCBNVFVfQ1JuX09ORVNIT1QsIG10dV9iYXNlICsgTVRVX0NSKDEpKTsgLyogb2ZmLCBjdXJyZW50bHkgKi8KLQlubWRrX2Nsa2V2dC5tdWx0ID0gZGl2X3NjKHJhdGUsIE5TRUNfUEVSX1NFQywgbm1ka19jbGtldnQuc2hpZnQpOworCiAJbm1ka19jbGtldnQubWF4X2RlbHRhX25zID0KIAkJY2xvY2tldmVudF9kZWx0YTJucygweGZmZmZmZmZmLCAmbm1ka19jbGtldnQpOwogCW5tZGtfY2xrZXZ0Lm1pbl9kZWx0YV9ucyA9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKaW5kZXggMjE5YzAxZS4uZWJlZDgyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29tYXBmYi5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTM1LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgogI2luY2x1ZGUgPHBsYXQvc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC92cmFtLmg+CiAKICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAKQEAgLTgxLDYgKzgzLDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X3Zhcl9jb25maWcpOwogCit2b2lkIF9faW5pdCBvbWFwX3Jlc2VydmUodm9pZCkKK3sKKwlvbWFwZmJfcmVzZXJ2ZV9zZHJhbV9tZW1ibG9jaygpOworCW9tYXBfdnJhbV9yZXNlcnZlX3NkcmFtX21lbWJsb2NrKCk7Cit9CisKIC8qCiAgKiAzMktIeiBjbG9ja3NvdXJjZSAuLi4gYWx3YXlzIGF2YWlsYWJsZSwgb24gcHJldHR5IG1vc3QgY2hpcHMgZXhjZXB0CiAgKiBPTUFQIDczMCBhbmQgMTUxMC4gIE90aGVyIHRpbWVycyBjb3VsZCBiZSB1c2VkIGFzIGNsb2Nrc291cmNlcywgd2l0aApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYwppbmRleCBkM2VlYTRmLi4wMDU0Yjk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb21hcGZiLmg+CiAKQEAgLTE3MSw0OSArMTcxLDc4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmFsaWRfc2RyYW0odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IG1lbWJsb2NrX3Byb3BlcnR5IHJlczsKKworCXJlcy5iYXNlID0gYWRkcjsKKwlyZXMuc2l6ZSA9IHNpemU7CisJcmV0dXJuICFtZW1ibG9ja19maW5kKCZyZXMpICYmIHJlcy5iYXNlID09IGFkZHIgJiYgcmVzLnNpemUgPT0gc2l6ZTsKK30KKworc3RhdGljIGludCByZXNlcnZlX3NkcmFtKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChtZW1ibG9ja19pc19yZWdpb25fcmVzZXJ2ZWQoYWRkciwgc2l6ZSkpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKG1lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSkpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCiAvKgogICogQ2FsbGVkIGZyb20gbWFwX2lvLiBXZSBuZWVkIHRvIGNhbGwgdG8gdGhpcyBlYXJseSBlbm91Z2ggc28gdGhhdCB3ZQogICogY2FuIHJlc2VydmUgdGhlIGZpeGVkIFNEUkFNIHJlZ2lvbnMgYmVmb3JlIFZNIGNvdWxkIGdldCBob2xkIG9mIHRoZW0uCiAgKi8KLXZvaWQgX19pbml0IG9tYXBmYl9yZXNlcnZlX3NkcmFtKHZvaWQpCit2b2lkIF9faW5pdCBvbWFwZmJfcmVzZXJ2ZV9zZHJhbV9tZW1ibG9jayh2b2lkKQogewotCXN0cnVjdCBib290bWVtX2RhdGEJKmJkYXRhOwotCXVuc2lnbmVkIGxvbmcJCXNkcmFtX3N0YXJ0LCBzZHJhbV9zaXplOwotCXVuc2lnbmVkIGxvbmcJCXJlc2VydmVkOwotCWludAkJCWk7CisJdW5zaWduZWQgbG9uZyByZXNlcnZlZCA9IDA7CisJaW50IGk7CiAKIAlpZiAoY29uZmlnX2ludmFsaWQpCiAJCXJldHVybjsKIAotCWJkYXRhID0gTk9ERV9EQVRBKDApLT5iZGF0YTsKLQlzZHJhbV9zdGFydCA9IGJkYXRhLT5ub2RlX21pbl9wZm4gPDwgUEFHRV9TSElGVDsKLQlzZHJhbV9zaXplID0gKGJkYXRhLT5ub2RlX2xvd19wZm4gPDwgUEFHRV9TSElGVCkgLSBzZHJhbV9zdGFydDsKLQlyZXNlcnZlZCA9IDA7CiAJZm9yIChpID0gMDsgOyBpKyspIHsKLQkJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uCXJnOworCQlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gcmc7CiAKIAkJaWYgKGdldF9mYm1lbV9yZWdpb24oaSwgJnJnKSA8IDApCiAJCQlicmVhazsKKwogCQlpZiAoaSA9PSBPTUFQRkJfUExBTkVfTlVNKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiRXh0cmFuZW91cyBGQiBtZW0gY29uZmlndXJhdGlvbiBlbnRyaWVzXG4iKTsKKwkJCXByX2VycigiRXh0cmFuZW91cyBGQiBtZW0gY29uZmlndXJhdGlvbiBlbnRyaWVzXG4iKTsKIAkJCWNvbmZpZ19pbnZhbGlkID0gMTsKIAkJCXJldHVybjsKIAkJfQorCiAJCS8qIENoZWNrIGlmIGl0J3Mgb3VyIG1lbW9yeSB0eXBlLiAqLwotCQlpZiAoc2V0X2ZibWVtX3JlZ2lvbl90eXBlKCZyZywgT01BUEZCX01FTVRZUEVfU0RSQU0sCi0JCQkJICAgICAgICAgIHNkcmFtX3N0YXJ0LCBzZHJhbV9zaXplKSA8IDAgfHwKLQkJICAgIChyZy50eXBlICE9IE9NQVBGQl9NRU1UWVBFX1NEUkFNKSkKKwkJaWYgKHJnLnR5cGUgIT0gT01BUEZCX01FTVRZUEVfU0RSQU0pCiAJCQljb250aW51ZTsKLQkJQlVHX09OKG9tYXBmYl9jb25maWcubWVtX2Rlc2MucmVnaW9uW2ldLnNpemUpOwotCQlpZiAoY2hlY2tfZmJtZW1fcmVnaW9uKGksICZyZywgc2RyYW1fc3RhcnQsIHNkcmFtX3NpemUpIDwgMCkgeworCisJCS8qIENoZWNrIGlmIHRoZSByZWdpb24gZmFsbHMgd2l0aGluIFNEUkFNICovCisJCWlmIChyZy5wYWRkciAmJiAhdmFsaWRfc2RyYW0ocmcucGFkZHIsIHJnLnNpemUpKQorCQkJY29udGludWU7CisKKwkJaWYgKHJnLnNpemUgPT0gMCkgeworCQkJcHJfZXJyKCJaZXJvIHNpemUgZm9yIEZCIHJlZ2lvbiAlZFxuIiwgaSk7CiAJCQljb25maWdfaW52YWxpZCA9IDE7CiAJCQlyZXR1cm47CiAJCX0KKwogCQlpZiAocmcucGFkZHIpIHsKLQkJCXJlc2VydmVfYm9vdG1lbShyZy5wYWRkciwgcmcuc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKKwkJCWlmIChyZXNlcnZlX3NkcmFtKHJnLnBhZGRyLCByZy5zaXplKSkgeworCQkJCXByX2VycigiVHJ5aW5nIHRvIHVzZSByZXNlcnZlZCBtZW1vcnkgZm9yIEZCIHJlZ2lvbiAlZFxuIiwKKwkJCQkJaSk7CisJCQkJY29uZmlnX2ludmFsaWQgPSAxOworCQkJCXJldHVybjsKKwkJCX0KIAkJCXJlc2VydmVkICs9IHJnLnNpemU7CiAJCX0KKworCQlpZiAob21hcGZiX2NvbmZpZy5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZSkgeworCQkJcHJfZXJyKCJGQiByZWdpb24gJWQgYWxyZWFkeSBzZXRcbiIsIGkpOworCQkJY29uZmlnX2ludmFsaWQgPSAxOworCQkJcmV0dXJuOworCQl9CisKIAkJb21hcGZiX2NvbmZpZy5tZW1fZGVzYy5yZWdpb25baV0gPSByZzsKIAkJY29uZmlndXJlZF9yZWdpb25zKys7CiAJfQpAQCAtMzU5LDcgKzM4OCwxMCBAQAogCiBhcmNoX2luaXRjYWxsKG9tYXBfaW5pdF9mYik7CiAKLXZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW0odm9pZCkge30KK3ZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW1fbWVtYmxvY2sodm9pZCkKK3sKK30KKwogdW5zaWduZWQgbG9uZyBvbWFwZmJfcmVzZXJ2ZV9zcmFtKHVuc2lnbmVkIGxvbmcgc3JhbV9wc3RhcnQsCiAJCQkJICB1bnNpZ25lZCBsb25nIHNyYW1fdnN0YXJ0LAogCQkJCSAgdW5zaWduZWQgbG9uZyBzcmFtX3NpemUsCkBAIC0zNzUsNyArNDA3LDEwIEBACiB7CiB9CiAKLXZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW0odm9pZCkge30KK3ZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW1fbWVtYmxvY2sodm9pZCkKK3sKK30KKwogdW5zaWduZWQgbG9uZyBvbWFwZmJfcmVzZXJ2ZV9zcmFtKHVuc2lnbmVkIGxvbmcgc3JhbV9wc3RhcnQsCiAJCQkJICB1bnNpZ25lZCBsb25nIHNyYW1fdnN0YXJ0LAogCQkJCSAgdW5zaWduZWQgbG9uZyBzcmFtX3NpemUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jb21tb24uaAppbmRleCBkMjY1MDE4Li41ZTRhZmJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY29tbW9uLmgKQEAgLTM0LDYgKzM0LDggQEAKIGV4dGVybiB2b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKTsKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXI7CiAKK2V4dGVybiB2b2lkIG9tYXBfcmVzZXJ2ZSh2b2lkKTsKKwogLyoKICAqIElPIGJhc2VzIGZvciB2YXJpb3VzIE9NQVAgcHJvY2Vzc29ycwogICogRXhjZXB0IHRoZSB0YXAgYmFzZSwgcmVzdCBhbGwgdGhlIGlvIGJhc2VzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZyYW0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdnJhbS5oCmluZGV4IGVkZDQ5ODcuLjBhYTRlY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdnJhbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdnJhbS5oCkBAIC0zOCw3ICszOCw3IEBACiBleHRlcm4gdm9pZCBvbWFwX3ZyYW1fc2V0X3NkcmFtX3ZyYW0odTMyIHNpemUsIHUzMiBzdGFydCk7CiBleHRlcm4gdm9pZCBvbWFwX3ZyYW1fc2V0X3NyYW1fdnJhbSh1MzIgc2l6ZSwgdTMyIHN0YXJ0KTsKIAotZXh0ZXJuIHZvaWQgb21hcF92cmFtX3Jlc2VydmVfc2RyYW0odm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX3ZyYW1fcmVzZXJ2ZV9zZHJhbV9tZW1ibG9jayh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG9tYXBfdnJhbV9yZXNlcnZlX3NyYW0odW5zaWduZWQgbG9uZyBzcmFtX3BzdGFydCwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3JhbV92c3RhcnQsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNyYW1fc2l6ZSwKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3ZyYW1fc2V0X3NkcmFtX3ZyYW0odTMyIHNpemUsIHUzMiBzdGFydCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF92cmFtX3NldF9zcmFtX3ZyYW0odTMyIHNpemUsIHUzMiBzdGFydCkgeyB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3ZyYW1fcmVzZXJ2ZV9zZHJhbSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3ZyYW1fcmVzZXJ2ZV9zZHJhbV9tZW1ibG9jayh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwX3ZyYW1fcmVzZXJ2ZV9zcmFtKHVuc2lnbmVkIGxvbmcgc3JhbV9wc3RhcnQsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNyYW1fdnN0YXJ0LAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzcmFtX3NpemUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9yaW9uL3BjaWUuYyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vcGNpZS5jCmluZGV4IDU0Yzg0YTQuLjc3OTU1M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vcGNpZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vcGNpZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPHBsYXQvcGNpZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKIC8qCiAgKiBQQ0llIHVuaXQgcmVnaXN0ZXIgb2Zmc2V0cy4KQEAgLTQ2LDYgKzQ3LDggQEAKICNkZWZpbmUgIFBDSUVfU1RBVF9CVVNfT0ZGUwkJOAogI2RlZmluZSAgUENJRV9TVEFUX0JVU19NQVNLCQkweGZmCiAjZGVmaW5lICBQQ0lFX1NUQVRfTElOS19ET1dOCQkxCisjZGVmaW5lIFBDSUVfREVCVUdfQ1RSTCAgICAgICAgIDB4MWE2MAorI2RlZmluZSAgUENJRV9ERUJVR19TT0ZUX1JFU0VUCQkoMTw8MjApCiAKIAogdTMyIF9faW5pdCBvcmlvbl9wY2llX2Rldl9pZCh2b2lkIF9faW9tZW0gKmJhc2UpCkBAIC04NSw2ICs4OCwzMiBAQAogCXdyaXRlbChzdGF0LCBiYXNlICsgUENJRV9TVEFUX09GRik7CiB9CiAKK3ZvaWQgX19pbml0IG9yaW9uX3BjaWVfcmVzZXQodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXUzMiByZWc7CisJaW50IGk7CisKKwkvKgorCSAqIE1WLVMxMDQ4NjAtVTAsIFJldi4gQzoKKwkgKiBQQ0kgRXhwcmVzcyBVbml0IFNvZnQgUmVzZXQKKwkgKiBXaGVuIHNldCwgZ2VuZXJhdGVzIGFuIGludGVybmFsIHJlc2V0IGluIHRoZSBQQ0kgRXhwcmVzcyB1bml0LgorCSAqIFRoaXMgYml0IHNob3VsZCBiZSBjbGVhcmVkIGFmdGVyIHRoZSBsaW5rIGlzIHJlLWVzdGFibGlzaGVkLgorCSAqLworCXJlZyA9IHJlYWRsKGJhc2UgKyBQQ0lFX0RFQlVHX0NUUkwpOworCXJlZyB8PSBQQ0lFX0RFQlVHX1NPRlRfUkVTRVQ7CisJd3JpdGVsKHJlZywgYmFzZSArIFBDSUVfREVCVUdfQ1RSTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQltZGVsYXkoMTApOworCisJCWlmIChvcmlvbl9wY2llX2xpbmtfdXAoYmFzZSkpCisJCQlicmVhazsKKwl9CisKKwlyZWcgJj0gfihQQ0lFX0RFQlVHX1NPRlRfUkVTRVQpOworCXdyaXRlbChyZWcsIGJhc2UgKyBQQ0lFX0RFQlVHX0NUUkwpOworfQorCiAvKgogICogU2V0dXAgUENJRSBCQVJzIGFuZCBBZGRyZXNzIERlY29kZSBXaW5zOgogICogQkFSWzAsMl0gLT4gZGlzYWJsZWQsIEJBUlsxXSAtPiBjb3ZlcnMgYWxsIERSQU0gYmFua3MKQEAgLTE1Myw2ICsxODIsMTEgQEAKIAl1MzIgbWFzazsKIAogCS8qCisJICogc29mdCByZXNldCBQQ0llIHVuaXQKKwkgKi8KKwlvcmlvbl9wY2llX3Jlc2V0KGJhc2UpOworCisJLyoKIAkgKiBQb2ludCBQQ0llIHVuaXQgTUJVUyBkZWNvZGUgd2luZG93cyB0byBEUkFNIHNwYWNlLgogCSAqLwogCW9yaW9uX3BjaWVfc2V0dXBfd2lucyhiYXNlLCBkcmFtKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLmMKaW5kZXggODQ3NGQwNS4uOTMxZDI2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvcGxsLmg+CiAKLS8qIGluaXRhbGlzZSBhbGwgdGhlIGNsb2NrcyAqLworLyogaW5pdGlhbGlzZSBhbGwgdGhlIGNsb2NrcyAqLwogCiB2b2lkIF9faW5pdF9vcl9jcHVmcmVxIHMzYzI0eHhfc2V0dXBfY2xvY2tzKHVuc2lnbmVkIGxvbmcgZmNsaywKIAkJCQkJICAgdW5zaWduZWQgbG9uZyBoY2xrLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY2xvY2suYwppbmRleCA4YmY3OWYzLi45MGEyMDUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY2xvY2suYwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJCShjbGtwLT5lbmFibGUpKGNsa3AsIDApOwogfQogCi0vKiBpbml0YWxpc2UgYWxsIHRoZSBjbG9ja3MgKi8KKy8qIGluaXRpYWxpc2UgYWxsIHRoZSBjbG9ja3MgKi8KIAogaW50IF9faW5pdCBzM2MyNHh4X3JlZ2lzdGVyX2Jhc2VjbG9ja3ModW5zaWduZWQgbG9uZyB4dGFsKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9rZXlwYWQuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQva2V5cGFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MGMxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQva2V5cGFkLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFNhbXN1bmcgUGxhdGZvcm0gLSBLZXlwYWQgcGxhdGZvcm0gZGF0YSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX0tFWVBBRF9ICisjZGVmaW5lIF9fUExBVF9TQU1TVU5HX0tFWVBBRF9ICisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisKKyNkZWZpbmUgU0FNU1VOR19NQVhfUk9XUwk4CisjZGVmaW5lIFNBTVNVTkdfTUFYX0NPTFMJOAorCisvKioKKyAqIHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSAtIFBsYXRmb3JtIGRldmljZSBkYXRhIGZvciBTYW1zdW5nIEtleXBhZC4KKyAqIEBrZXltYXBfZGF0YTogcG9pbnRlciB0byAmbWF0cml4X2tleW1hcF9kYXRhLgorICogQHJvd3M6IG51bWJlciBvZiBrZXlwYWQgcm93IHN1cHBvcnRlZC4KKyAqIEBjb2xzOiBudW1iZXIgb2Yga2V5cGFkIGNvbCBzdXBwb3J0ZWQuCisgKiBAbm9fYXV0b3JlcGVhdDogZGlzYWJsZSBrZXkgYXV0b3JlcGVhdC4KKyAqIEB3YWtldXA6IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRldmljZSBzaG91bGQgYmUgc2V0IHVwIGFzIHdha2V1cCBzb3VyY2UuCisgKiBAY2ZnX2dwaW86IGNvbmZpZ3VyZSB0aGUgR1BJTy4KKyAqCisgKiBJbml0aWFsaXNhdGlvbiBkYXRhIHNwZWNpZmljIHRvIGVpdGhlciB0aGUgbWFjaGluZSBvciB0aGUgcGxhdGZvcm0KKyAqIGZvciB0aGUgZGV2aWNlIGRyaXZlciB0byB1c2Ugb3IgY2FsbC1iYWNrIHdoZW4gY29uZmlndXJpbmcgZ3Bpby4KKyAqLworc3RydWN0IHNhbXN1bmdfa2V5cGFkX3BsYXRkYXRhIHsKKwljb25zdCBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhCSprZXltYXBfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcm93czsKKwl1bnNpZ25lZCBpbnQgY29sczsKKwlib29sIG5vX2F1dG9yZXBlYXQ7CisJYm9vbCB3YWtldXA7CisKKwl2b2lkICgqY2ZnX2dwaW8pKHVuc2lnbmVkIGludCByb3dzLCB1bnNpZ25lZCBpbnQgY29scyk7Cit9OworCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfS0VZUEFEX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc3BlYXIvcGFkbXV4LmMgYi9hcmNoL2FybS9wbGF0LXNwZWFyL3BhZG11eC5jCmluZGV4IGQyYWFiM2EuLjU1NWVlYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc3BlYXIvcGFkbXV4LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zcGVhci9wYWRtdXguYwpAQCAtNjYsNyArNjYsNyBAQAogICogSWYgcGVyaXBoZXJhbCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbW9kZSB0aGVuIHJlcXVlc3QgaXMgcmVqZWN0ZWQuCiAgKiBDb25mbGljdHMgYmV0d2VlbiBwZXJpcGhlcmFscyBhcmUgbm90IGhhbmRsZWQgYW5kIHBlcmlwaGVyYWxzIHdpbGwgYmUKICAqIGVuYWJsZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHByZXNlbnQgaW4gcG14X2RldiBhcnJheS4KLSAqIEluIGNhc2Ugb2YgY29uZmxpY3RzIGxhc3QgcGVyaXBoZXJhbCBlbmFsYmVkIHdpbGwgYmUgcHJlc2VudC4KKyAqIEluIGNhc2Ugb2YgY29uZmxpY3RzIGxhc3QgcGVyaXBoZXJhbCBlbmFibGVkIHdpbGwgYmUgcHJlc2VudC4KICAqIFJldHVybnMgLXZlIG9uIEVyciBvdGhlcndpc2UgMAogICovCiBzdGF0aWMgaW50IHBteF9kZXZzX2VuYWJsZShzdHJ1Y3QgcG14X2RldiAqKmRldnMsIHU4IGNvdW50KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zcGVhci90aW1lLmMgYi9hcmNoL2FybS9wbGF0LXNwZWFyL3RpbWUuYwppbmRleCBhMTAyNWQzLi5hYjIxMTY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNwZWFyL3RpbWUuYworKysgYi9hcmNoL2FybS9wbGF0LXNwZWFyL3RpbWUuYwpAQCAtNTgsNiArNTgsMTEgQEAKIAogI2RlZmluZSBJTlRfU1RBVFVTCQkweDEKIAorLyoKKyAqIE1pbmltdW0gY2xvY2tzb3VyY2UvY2xvY2tldmVudCB0aW1lciByYW5nZSBpbiBzZWNvbmRzCisgKi8KKyNkZWZpbmUgU1BFQVJfTUlOX1JBTkdFIDQKKwogc3RhdGljIF9faW9tZW0gdm9pZCAqZ3B0X2Jhc2U7CiBzdGF0aWMgc3RydWN0IGNsayAqZ3B0X2NsazsKIApAQCAtNjYsNDQgKzcxLDYgQEAKIHN0YXRpYyBpbnQgY2xvY2tldmVudF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZXZ0LAogCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGtfZXZlbnRfZGV2KTsKIAotLyoKLSAqIEZvbGxvd2luZyBjbG9ja3NvdXJjZV9zZXRfY2xvY2sgYW5kIGNsb2NrZXZlbnRfc2V0X2Nsb2NrIHBpY2tlZAotICogZnJvbSBhcmNoL21pcHMva2VybmVsL3RpbWUuYwotICovCi0KLXZvaWQgX19pbml0IGNsb2Nrc291cmNlX3NldF9jbG9jayhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCB1bnNpZ25lZCBpbnQgY2xvY2spCi17Ci0JdTY0IHRlbXA7Ci0JdTMyIHNoaWZ0OwotCi0JLyogRmluZCBhIHNoaWZ0IHZhbHVlICovCi0JZm9yIChzaGlmdCA9IDMyOyBzaGlmdCA+IDA7IHNoaWZ0LS0pIHsKLQkJdGVtcCA9ICh1NjQpIE5TRUNfUEVSX1NFQyA8PCBzaGlmdDsKLQkJZG9fZGl2KHRlbXAsIGNsb2NrKTsKLQkJaWYgKCh0ZW1wID4+IDMyKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWNzLT5zaGlmdCA9IHNoaWZ0OwotCWNzLT5tdWx0ID0gKHUzMikgdGVtcDsKLX0KLQotdm9pZCBfX2luaXQgY2xvY2tldmVudF9zZXRfY2xvY2soc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2QsCi0JdW5zaWduZWQgaW50IGNsb2NrKQotewotCXU2NCB0ZW1wOwotCXUzMiBzaGlmdDsKLQotCS8qIEZpbmQgYSBzaGlmdCB2YWx1ZSAqLwotCWZvciAoc2hpZnQgPSAzMjsgc2hpZnQgPiAwOyBzaGlmdC0tKSB7Ci0JCXRlbXAgPSAodTY0KSBjbG9jayA8PCBzaGlmdDsKLQkJZG9fZGl2KHRlbXAsIE5TRUNfUEVSX1NFQyk7Ci0JCWlmICgodGVtcCA+PiAzMikgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQljZC0+c2hpZnQgPSBzaGlmdDsKLQljZC0+bXVsdCA9ICh1MzIpIHRlbXA7Ci19Ci0KIHN0YXRpYyBjeWNsZV90IGNsb2Nrc291cmNlX3JlYWRfY3ljbGVzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CiAJcmV0dXJuIChjeWNsZV90KSByZWFkdyhncHRfYmFzZSArIENPVU5UKENMS1NSQykpOwpAQCAtMTM4LDcgKzEwNSw3IEBACiAJdmFsIHw9IENUUkxfRU5BQkxFIDsKIAl3cml0ZXcodmFsLCBncHRfYmFzZSArIENSKENMS1NSQykpOwogCi0JY2xvY2tzb3VyY2Vfc2V0X2Nsb2NrKCZjbGtzcmMsIHRpY2tfcmF0ZSk7CisJY2xvY2tzb3VyY2VfY2FsY19tdWx0X3NoaWZ0KCZjbGtzcmMsIHRpY2tfcmF0ZSwgU1BFQVJfTUlOX1JBTkdFKTsKIAogCS8qIHJlZ2lzdGVyIHRoZSBjbG9ja3NvdXJjZSAqLwogCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbGtzcmMpOwpAQCAtMjMzLDcgKzIwMCw3IEBACiAJdGlja19yYXRlID0gY2xrX2dldF9yYXRlKGdwdF9jbGspOwogCXRpY2tfcmF0ZSA+Pj0gQ1RSTF9QUkVTQ0FMRVIxNjsKIAotCWNsb2NrZXZlbnRfc2V0X2Nsb2NrKCZjbGtldnQsIHRpY2tfcmF0ZSk7CisJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KCZjbGtldnQsIHRpY2tfcmF0ZSwgU1BFQVJfTUlOX1JBTkdFKTsKIAogCWNsa2V2dC5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmMCwKIAkJCSZjbGtldnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC12ZXJzYXRpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LXZlcnNhdGlsZS9NYWtlZmlsZQppbmRleCA5YjFhNjY4Li41Y2Y4OGU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXZlcnNhdGlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LXZlcnNhdGlsZS9NYWtlZmlsZQpAQCAtMiwzICsyLDcgQEAKIG9iai0kKENPTkZJR19BUk1fVElNRVJfU1A4MDQpICs9IHRpbWVyLXNwLm8KIG9iai0kKENPTkZJR19BUkNIX1JFQUxWSUVXKSArPSBzY2hlZC1jbG9jay5vCiBvYmotJChDT05GSUdfQVJDSF9WRVJTQVRJTEUpICs9IHNjaGVkLWNsb2NrLm8KK2lmZXEgKCQoQ09ORklHX0xFRFNfQ0xBU1MpLHkpCitvYmotJChDT05GSUdfQVJDSF9SRUFMVklFVykgKz0gbGVkcy5vCitvYmotJChDT05GSUdfQVJDSF9WRVJTQVRJTEUpICs9IGxlZHMubworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtdmVyc2F0aWxlL2xlZHMuYyBiL2FyY2gvYXJtL3BsYXQtdmVyc2F0aWxlL2xlZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY5ZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC12ZXJzYXRpbGUvbGVkcy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgOCB1c2VyIExFRHMgZm91bmQgb24gdGhlIFJlYWxWaWV3cyBhbmQgVmVyc2F0aWxlcworICogQmFzZWQgb24gRGFWaW5jaSdzIERNMzY1IGJvYXJkIGNvZGUKKyAqCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8dHJpYWRAZGYubHRoLnNlPgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisKKyNpZmRlZiBWRVJTQVRJTEVfU1lTX0JBU0UKKyNkZWZpbmUgTEVEUkVHCShfX2lvX2FkZHJlc3MoVkVSU0FUSUxFX1NZU19CQVNFKSArIFZFUlNBVElMRV9TWVNfTEVEX09GRlNFVCkKKyNlbmRpZgorCisjaWZkZWYgUkVBTFZJRVdfU1lTX0JBU0UKKyNkZWZpbmUgTEVEUkVHCShfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsgUkVBTFZJRVdfU1lTX0xFRF9PRkZTRVQpCisjZW5kaWYKKworc3RydWN0IHZlcnNhdGlsZV9sZWQgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYJY2RldjsKKwl1OAkJCW1hc2s7Cit9OworCisvKgorICogVGhlIHRyaWdnZXJzIGxpbmVzIHVwIGJlbG93IHdpbGwgb25seSBiZSB1c2VkIGlmIHRoZQorICogTEVEIHRyaWdnZXJzIGFyZSBjb21waWxlZCBpbi4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp0cmlnZ2VyOworfSB2ZXJzYXRpbGVfbGVkc1tdID0geworCXsgInZlcnNhdGlsZTowIiwgImhlYXJ0YmVhdCIsIH0sCisJeyAidmVyc2F0aWxlOjEiLCAibW1jMCIsIH0sCisJeyAidmVyc2F0aWxlOjIiLCB9LAorCXsgInZlcnNhdGlsZTozIiwgfSwKKwl7ICJ2ZXJzYXRpbGU6NCIsIH0sCisJeyAidmVyc2F0aWxlOjUiLCB9LAorCXsgInZlcnNhdGlsZTo2IiwgfSwKKwl7ICJ2ZXJzYXRpbGU6NyIsIH0sCit9OworCitzdGF0aWMgdm9pZCB2ZXJzYXRpbGVfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAorCQkJICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBiKQoreworCXN0cnVjdCB2ZXJzYXRpbGVfbGVkICpsZWQgPSBjb250YWluZXJfb2YoY2RldiwKKwkJCQkJCSBzdHJ1Y3QgdmVyc2F0aWxlX2xlZCwgY2Rldik7CisJdTMyIHJlZyA9IHJlYWRsKExFRFJFRyk7CisKKwlpZiAoYiAhPSBMRURfT0ZGKQorCQlyZWcgfD0gbGVkLT5tYXNrOworCWVsc2UKKwkJcmVnICY9IH5sZWQtPm1hc2s7CisJd3JpdGVsKHJlZywgTEVEUkVHKTsKK30KKworc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgdmVyc2F0aWxlX2xlZF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgdmVyc2F0aWxlX2xlZCAqbGVkID0gY29udGFpbmVyX29mKGNkZXYsCisJCQkJCQkgc3RydWN0IHZlcnNhdGlsZV9sZWQsIGNkZXYpOworCXUzMiByZWcgPSByZWFkbChMRURSRUcpOworCisJcmV0dXJuIChyZWcgJiBsZWQtPm1hc2spID8gTEVEX0ZVTEwgOiBMRURfT0ZGOworfQorCitzdGF0aWMgaW50IF9faW5pdCB2ZXJzYXRpbGVfbGVkc19pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBBbGwgT04gKi8KKwl3cml0ZWwoMHhmZiwgTEVEUkVHKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2ZXJzYXRpbGVfbGVkcyk7IGkrKykgeworCQlzdHJ1Y3QgdmVyc2F0aWxlX2xlZCAqbGVkOworCisJCWxlZCA9IGt6YWxsb2Moc2l6ZW9mKCpsZWQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFsZWQpCisJCQlicmVhazsKKworCQlsZWQtPmNkZXYubmFtZSA9IHZlcnNhdGlsZV9sZWRzW2ldLm5hbWU7CisJCWxlZC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IHZlcnNhdGlsZV9sZWRfc2V0OworCQlsZWQtPmNkZXYuYnJpZ2h0bmVzc19nZXQgPSB2ZXJzYXRpbGVfbGVkX2dldDsKKwkJbGVkLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IHZlcnNhdGlsZV9sZWRzW2ldLnRyaWdnZXI7CisJCWxlZC0+bWFzayA9IEJJVChpKTsKKworCQlpZiAobGVkX2NsYXNzZGV2X3JlZ2lzdGVyKE5VTEwsICZsZWQtPmNkZXYpIDwgMCkgeworCQkJa2ZyZWUobGVkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaW5jZSB3ZSBtYXkgaGF2ZSB0cmlnZ2VycyBvbiBhbnkgc3Vic3lzdGVtLCBkZWZlciByZWdpc3RyYXRpb24KKyAqIHVudGlsIGFmdGVyIHN1YnN5c3RlbV9pbml0LgorICovCitmc19pbml0Y2FsbCh2ZXJzYXRpbGVfbGVkc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCAzMTVhNTQwLi44MDYzYTMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL3ZmcC5oPgogCkBAIC01NDksMTAgKzU1MCwxMyBAQAogCQkvKgogCQkgKiBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBBZHZhbmNlZCBTSU1ECiAJCSAqIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLCBpbnRlZ2VyIGFuZCBzaW5nbGUKLQkJICogcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMuCisJCSAqIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLiBPbmx5IGNoZWNrCisJCSAqIGZvciBORU9OIGlmIHRoZSBoYXJkd2FyZSBoYXMgdGhlIE1WRlIgcmVnaXN0ZXJzLgogCQkgKi8KLQkJaWYgKChmbXJ4KE1WRlIxKSAmIDB4MDAwZmZmMDApID09IDB4MDAwMTExMDApCi0JCQllbGZfaHdjYXAgfD0gSFdDQVBfTkVPTjsKKwkJaWYgKChyZWFkX2NwdWlkX2lkKCkgJiAweDAwMGYwMDAwKSA9PSAweDAwMGYwMDAwKSB7CisJCQlpZiAoKGZtcngoTVZGUjEpICYgMHgwMDBmZmYwMCkgPT0gMHgwMDAxMTEwMCkKKwkJCQllbGZfaHdjYXAgfD0gSFdDQVBfTkVPTjsKKwkJfQogI2VuZGlmCiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9NYWtlZmlsZSBiL2FyY2gvYXZyMzIvTWFrZWZpbGUKaW5kZXggZWFkOGE3NS4uMjJmYjY2NSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9NYWtlZmlsZQorKysgYi9hcmNoL2F2cjMyL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw3IEBACiAKIEtCVUlMRF9DRkxBR1MJKz0gLXBpcGUgLWZuby1idWlsdGluIC1tbm8tcGljCiBLQlVJTERfQUZMQUdTCSs9IC1tcmVsYXggLW1uby1waWMKLUNGTEFHU19NT0RVTEUJKz0gLW1uby1yZWxheAorS0JVSUxEX0NGTEFHU19NT0RVTEUgKz0gLW1uby1yZWxheAogTERGTEFHU192bWxpbnV4CSs9IC0tcmVsYXgKIAogY3B1ZmxhZ3MtJChDT05GSUdfUExBVEZPUk1fQVQzMkFQKQkrPSAtbWFyY2g9YXAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCA1YTk3YTMxLi45ZDVmZmFmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTE4LDggKzE4LDggQEAKIEtCVUlMRF9DRkxBR1MgICAgICAgICAgICs9IC1tbG9uZy1jYWxscwogZW5kaWYKIEtCVUlMRF9BRkxBR1MgICAgICAgICAgICs9ICQoY2FsbCBjYy1vcHRpb24sLW1uby1mZHBpYykKLUNGTEFHU19NT0RVTEUgICAgKz0gLW1sb25nLWNhbGxzCi1MREZMQUdTX01PRFVMRSAgICs9IC1tIGVsZjMyYmZpbgorS0JVSUxEX0NGTEFHU19NT0RVTEUgICAgKz0gLW1sb25nLWNhbGxzCitLQlVJTERfTERGTEFHU19NT0RVTEUgICArPSAtbSBlbGYzMmJmaW4KIEtBTExTWU1TICAgICAgICAgKz0gLS1zeW1ib2wtcHJlZml4PV8KIAogS0JVSUxEX0RFRkNPTkZJRyA6PSBCRjUzNy1TVEFNUF9kZWZjb25maWcKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vaW50bWVtLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbW0vaW50bWVtLmMKaW5kZXggOWU4YjY5Yy4uMWIxN2Q5MiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL21tL2ludG1lbS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS9pbnRtZW0uYwpAQCAtMzMsOCArMzMsOCBAQAogewogCXN0YXRpYyBpbnQgaW5pdGlhdGVkID0gMDsKIAlpZiAoIWluaXRpYXRlZCkgewotCQlzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qIGFsbG9jID0KLQkJICAoc3RydWN0IGludG1lbV9hbGxvY2F0aW9uKilrbWFsbG9jKHNpemVvZiAqYWxsb2MsIEdGUF9LRVJORUwpOworCQlzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qIGFsbG9jOworCQlhbGxvYyA9IGttYWxsb2Moc2l6ZW9mICphbGxvYywgR0ZQX0tFUk5FTCk7CiAJCUlOSVRfTElTVF9IRUFEKCZpbnRtZW1fYWxsb2NhdGlvbnMpOwogCQlpbnRtZW1fdmlydHVhbCA9IGlvcmVtYXAoTUVNX0lOVE1FTV9TVEFSVCArIFJFU0VSVkVEX1NJWkUsCiAJCQkJCSBNRU1fSU5UTUVNX1NJWkUgLSBSRVNFUlZFRF9TSVpFKTsKQEAgLTYyLDkgKzYyLDggQEAKIAkJaWYgKGFsbG9jYXRpb24tPnN0YXR1cyA9PSBTVEFUVVNfRlJFRSAmJgogCQkgICAgYWxsb2NhdGlvbi0+c2l6ZSA+PSBzaXplICsgYWxpZ25tZW50KSB7CiAJCQlpZiAoYWxsb2NhdGlvbi0+c2l6ZSA+IHNpemUgKyBhbGlnbm1lbnQpIHsKLQkJCQlzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qIGFsbG9jID0KLQkJCQkJKHN0cnVjdCBpbnRtZW1fYWxsb2NhdGlvbiopCi0JCQkJCWttYWxsb2Moc2l6ZW9mICphbGxvYywgR0ZQX0FUT01JQyk7CisJCQkJc3RydWN0IGludG1lbV9hbGxvY2F0aW9uKiBhbGxvYzsKKwkJCQlhbGxvYyA9IGttYWxsb2Moc2l6ZW9mICphbGxvYywgR0ZQX0FUT01JQyk7CiAJCQkJYWxsb2MtPnN0YXR1cyA9IFNUQVRVU19GUkVFOwogCQkJCWFsbG9jLT5zaXplID0gYWxsb2NhdGlvbi0+c2l6ZSAtIHNpemUgLQogCQkJCQlhbGlnbm1lbnQ7CkBAIC03NCw5ICs3Myw3IEBACiAKIAkJCQlpZiAoYWxpZ25tZW50KSB7CiAJCQkJCXN0cnVjdCBpbnRtZW1fYWxsb2NhdGlvbiAqdG1wOwotCQkJCQl0bXAgPSAoc3RydWN0IGludG1lbV9hbGxvY2F0aW9uICopCi0JCQkJCQlrbWFsbG9jKHNpemVvZiAqdG1wLAotCQkJCQkJCUdGUF9BVE9NSUMpOworCQkJCQl0bXAgPSBrbWFsbG9jKHNpemVvZiAqdG1wLCBHRlBfQVRPTUlDKTsKIAkJCQkJdG1wLT5vZmZzZXQgPSBhbGxvY2F0aW9uLT5vZmZzZXQ7CiAJCQkJCXRtcC0+c2l6ZSA9IGFsaWdubWVudDsKIAkJCQkJdG1wLT5zdGF0dXMgPSBTVEFUVVNfRlJFRTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vbG9jYWw2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzkzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9NYWtlZmlsZSBiL2FyY2gvZnJ2L01ha2VmaWxlCmluZGV4IDMxMGM0N2EuLjdmZjg0NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L01ha2VmaWxlCisrKyBiL2FyY2gvZnJ2L01ha2VmaWxlCkBAIC0yMywyMCArMjMsMTQgQEAKICMgQ29weXJpZ2h0IChDKSAxOTk0IGJ5IEhhbWlzaCBNYWNkb25hbGQKICMKIAotQ0NTUEVDUwk6PSAkKHNoZWxsICQoQ0MpIC12IDI+JjEgfCBncmVwICJeUmVhZGluZyBzcGVjcyBmcm9tICIgfCBoZWFkIC0xIHwgY3V0IC1jMjAtKQotQ0NESVIJOj0gJChzdHJpcCAkKHBhdHN1YnN0ICUvc3BlY3MsJSwkKENDU1BFQ1MpKSkKLUNQVUNMQVNTIDo9IGZyNDAwCi0KLSMgdGVzdCBmb3IgY3Jvc3MgY29tcGlsaW5nCi1DT01QSUxFX0FSQ0ggPSAkKHNoZWxsIHVuYW1lIC1tKQotCiBpZmRlZiBDT05GSUdfTU1VCiBVVFNfU1lTTkFNRSA9IC1EVVRTX1NZU05BTUU9XCJMaW51eFwiCiBlbHNlCiBVVFNfU1lTTkFNRSA9IC1EVVRTX1NZU05BTUU9XCJ1Q2xpbnV4XCIKIGVuZGlmCiAKLUFSQ0hNT0RGTEFHUwkrPSAtRzAgLW1sb25nLWNhbGxzCitLQlVJTERfQUZMQUdTX01PRFVMRSArPSAtRzAgLW1sb25nLWNhbGxzCitLQlVJTERfQ0ZMQUdTX01PRFVMRSArPSAtRzAgLW1sb25nLWNhbGxzCiAKIGlmZGVmIENPTkZJR19HUFJFTF9EQVRBXzgKIEtCVUlMRF9DRkxBR1MJKz0gLUc4CkBAIC01NCw3ICs0OCw2IEBACiAKIGlmZGVmIENPTkZJR19HQ19TRUNUSU9OUwogS0JVSUxEX0NGTEFHUwkrPSAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucwotTElOS0ZMQUdTCSs9IC0tZ2Mtc2VjdGlvbnMKIGVuZGlmCiAKIGlmbmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgpAQCAtNjQsMTYgKzU3LDEzIEBACiBpZmRlZiBDT05GSUdfQ1BVX0ZSNDUxX0NPTVBJTEUKIEtCVUlMRF9DRkxBR1MJKz0gLW1jcHU9ZnI0NTAKIEtCVUlMRF9BRkxBR1MJKz0gLW1jcHU9ZnI0NTAKLUFTRkxBR1MJCSs9IC1tY3B1PWZyNDUwCiBlbHNlCiBpZmRlZiBDT05GSUdfQ1BVX0ZSNTUxX0NPTVBJTEUKIEtCVUlMRF9DRkxBR1MJKz0gLW1jcHU9ZnI1NTAKIEtCVUlMRF9BRkxBR1MJKz0gLW1jcHU9ZnI1NTAKLUFTRkxBR1MJCSs9IC1tY3B1PWZyNTUwCiBlbHNlCiBLQlVJTERfQ0ZMQUdTCSs9IC1tY3B1PWZyNDAwCiBLQlVJTERfQUZMQUdTCSs9IC1tY3B1PWZyNDAwCi1BU0ZMQUdTCQkrPSAtbWNwdT1mcjQwMAogZW5kaWYKIGVuZGlmCiAKQEAgLTgzLDE0ICs3MywxMiBAQAogS0JVSUxEX0NGTEFHUwkrPSAtbW5vLWZkcGljIC1tZ3ByLTMyIC1tc29mdC1mbG9hdCAtbW5vLW1lZGlhCiBLQlVJTERfQ0ZMQUdTCSs9IC1mZml4ZWQtZmNjMyAtZmZpeGVkLWNjMyAtZmZpeGVkLWdyMTUgLWZmaXhlZC1pY2MyCiBLQlVJTERfQUZMQUdTCSs9IC1tbm8tZmRwaWMKLUFTRkxBR1MJCSs9IC1tbm8tZmRwaWMKIAogIyBtYWtlIHN1cmUgdGhlIC5TIGZpbGVzIGdldCBjb21waWxlZCB3aXRoIGRlYnVnIGluZm8KICMgYW5kIGRpc2FibGUgb3B0aW1pc2F0aW9ucyB0aGF0IGFyZSB1bmhlbHBmdWwgd2hpbHN0IGRlYnVnZ2luZwogaWZkZWYgQ09ORklHX0RFQlVHX0lORk8KICNLQlVJTERfQ0ZMQUdTCSs9IC1PMQogS0JVSUxEX0FGTEFHUwkrPSAtV2EsLS1nZHdhcmYyCi1BU0ZMQUdTCQkrPSAtV2EsLS1nZHdhcmYyCiBlbmRpZgogCiBoZWFkLXkJCTo9IGFyY2gvZnJ2L2tlcm5lbC9oZWFkLm8gYXJjaC9mcnYva2VybmVsL2luaXRfdGFzay5vCkBAIC0xMDUsMTEgKzkzLDUgQEAKIEltYWdlOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9mcnYvYm9vdCAkQAogCi1ib290c3RyYXA6Ci0JJChRKSQoTUFLRUJPT1QpIGJvb3RzdHJhcAotCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9YXJjaC9mcnYvYm9vdAotCi1hcmNoZGVwOiBzY3JpcHRzL21rZGVwIHN5bWxpbmtzCi0JJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9mcnYvYm9vdCBkZXAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2xvY2FsNjQuaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvbG9jYWw2NC5oIGIvYXJjaC9mcnYva2VybmVsL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9mcnYva2VybmVsL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL2l0dS5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvaXR1LmMKaW5kZXggNDg4M2JhNy4uYTJhZTVlOSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvaXR1LmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvaXR1LmMKQEAgLTczLDcgKzczLDcgQEAKIAogCXNldHVwX2lycShJVFVJUlEsICZpdHVfaXJxKTsKIAotCS8qIGluaXRhbGl6ZSB0aW1lciAqLworCS8qIGluaXRpYWxpemUgdGltZXIgKi8KIAljdHJsX291dGIoMCwgVFNUUik7CiAJY3RybF9vdXRiKENDTFIwIHwgZGl2LCBJVFVCQVNFICsgVENSKTsKIAljdHJsX291dGIoMHgwMSwgSVRVQkFTRSArIFRJRVIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdGltZXIxNi5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdGltZXIxNi5jCmluZGV4IDA0MmRiYjUuLmFlMGQzODEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL3RpbWVyMTYuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC90aW1lci90aW1lcjE2LmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogCXNldHVwX2lycShfMTZJUlEsICZ0aW1lcjE2X2lycSk7CiAKLQkvKiBpbml0YWxpemUgdGltZXIgKi8KKwkvKiBpbml0aWFsaXplIHRpbWVyICovCiAJY3RybF9vdXRiKDAsIFRTVFIpOwogCWN0cmxfb3V0YihDQ0xSMCB8IGRpdiwgXzE2QkFTRSArIFRDUik7CiAJY3RybF9vdXR3KGNudCwgXzE2QkFTRSArIEdSQSk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC90aW1lci90aW1lcjguYyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL3RpbWVyOC5jCmluZGV4IDM4YmUwY2EuLjM5NDZjMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL3RpbWVyOC5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL3RpbWVyOC5jCkBAIC05NCw3ICs5NCw3IEBACiAJY3RybF9iY2xyKDAsIE1TVFBDUkwpCiAjZW5kaWYKIAotCS8qIGluaXRhbGl6ZSB0aW1lciAqLworCS8qIGluaXRpYWxpemUgdGltZXIgKi8KIAljdHJsX291dHcoY250LCBfOEJBU0UgKyBUQ09SQSk7CiAJY3RybF9vdXR3KDB4MDAwMCwgXzhCQVNFICsgXzhUQ1NSKTsKIAljdHJsX291dHcoKENNSUVBfENDTFJfQ01BfENLUzIpIDw8IDggfCBkaXYsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvTWFrZWZpbGUgYi9hcmNoL2lhNjQvTWFrZWZpbGUKaW5kZXggOGFlMGQyNi4uYmU3YmZhMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L01ha2VmaWxlCisrKyBiL2FyY2gvaWE2NC9NYWtlZmlsZQpAQCAtMjIsMTMgKzIyLDEzIEBACiAKIE9CSkNPUFlGTEFHUwk6PSAtLXN0cmlwLWFsbAogTERGTEFHU192bWxpbnV4CTo9IC1zdGF0aWMKLUxERkxBR1NfTU9EVUxFCSs9IC1UICQoc3JjdHJlZSkvYXJjaC9pYTY0L21vZHVsZS5sZHMKLUFGTEFHU19LRVJORUwJOj0gLW1jb25zdGFudC1ncAorS0JVSUxEX0xERkxBR1NfTU9EVUxFICs9IC1UICQoc3JjdHJlZSkvYXJjaC9pYTY0L21vZHVsZS5sZHMKK0tCVUlMRF9BRkxBR1NfS0VSTkVMIDo9IC1tY29uc3RhbnQtZ3AKIEVYVFJBCQk6PQogCiBjZmxhZ3MteQk6PSAtcGlwZSAkKEVYVFJBKSAtZmZpeGVkLXIxMyAtbWZpeGVkLXJhbmdlPWYxMi1mMTUsZjMyLWYxMjcgXAogCQkgICAtZmFsaWduLWZ1bmN0aW9ucz0zMiAtZnJlbmFtZS1yZWdpc3RlcnMgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzCi1DRkxBR1NfS0VSTkVMCTo9IC1tY29uc3RhbnQtZ3AKK0tCVUlMRF9DRkxBR1NfS0VSTkVMIDo9IC1tY29uc3RhbnQtZ3AKIAogR0FTX1NUQVRVUwk9ICQoc2hlbGwgJChzcmN0cmVlKS9hcmNoL2lhNjQvc2NyaXB0cy9jaGVjay1nYXMgIiQoQ0MpIiAiJChPQkpEVU1QKSIpCiBLQlVJTERfQ1BQRkxBR1MgKz0gJChzaGVsbCAkKHNyY3RyZWUpL2FyY2gvaWE2NC9zY3JpcHRzL3Rvb2xjaGFpbi1mbGFncyAiJChDQykiICIkKE9CSkRVTVApIiAiJChSRUFERUxGKSIpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZwppbmRleCAzMTJiMTIwLi5jNWZlMjA1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKQEAgLTEsMTM1OCArMSwxMTggQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNi1yYzUKLSMgTW9uIEZlYiAyNyAxNjoxMDo0MiAyMDA2Ci0jCi0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19MT0NLX0tFUk5FTD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVVNFVFMgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLUNPTkZJR19TTFVCPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLUNPTkZJR19TVE9QX01BQ0hJTkU9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCi0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgotCi0jCi0jIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwotIwotQ09ORklHX0lBNjQ9eQotQ09ORklHXzY0QklUPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1NXSU9UTEI9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19USU1FPXkKLUNPTkZJR19FRkk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfRE1BX0lTX0RNQTMyPXkKLSMgQ09ORklHX0lBNjRfR0VORVJJQyBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9ESUc9eQotIyBDT05GSUdfSUE2NF9IUF9aWDEgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDFfU1dJT1RMQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1NHSV9TTjIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9TSU0gaXMgbm90IHNldAotQ09ORklHX0lUQU5JVU09eQotIyBDT05GSUdfTUNLSU5MRVkgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9QQUdFX1NJWkVfMTZLQj15Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKLUNPTkZJR19QR1RBQkxFXzM9eQotIyBDT05GSUdfUEdUQUJMRV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFpfMjUwPXkKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotQ09ORklHX0haPTI1MAotQ09ORklHX0lBNjRfQlJMX0VNVT15Ci1DT05GSUdfSUE2NF9MMV9DQUNIRV9TSElGVD02Ci0jIENPTkZJR19JQTY0X0NZQ0xPTkUgaXMgbm90IHNldAotQ09ORklHX0lPU0FQSUM9eQotQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTcKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9MgotIyBDT05GSUdfSE9UUExVR19DUFUgaXMgbm90IHNldAotIyBDT05GSUdfU0NIRURfU01UIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVFTVBUPXkKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLUNPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKLSMgQ09ORklHX1ZJUlRVQUxfTUVNX01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X01DQV9SRUNPVkVSWSBpcyBub3Qgc2V0Ci1DT05GSUdfUEVSRk1PTj15Ci1DT05GSUdfSUE2NF9QQUxJTkZPPXkKLQotIwotIyBGaXJtd2FyZSBEcml2ZXJzCi0jCi1DT05GSUdfRUZJX1ZBUlM9eQotQ09ORklHX0VGSV9QQ0RQPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfTUlTQz1tCi0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBhbmQgQUNQSQotIwotQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQotIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydAotIwotQ09ORklHX0FDUEk9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KIENPTkZJR19BQ1BJX0ZBTj1tCiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQotQ09ORklHX0FDUElfVEhFUk1BTD1tCi1DT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCi0jIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0VDPXkKLUNPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1NZU1RFTT15Ci0jIENPTkZJR19BQ1BJX0NPTlRBSU5FUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCi0jCi0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBKQotIwotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotIyBDT05GSUdfUENJX01TSSBpcyBub3Qgc2V0Ci1DT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKLSMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19QQUNLRVRfTU1BUD15Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwotIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi1DT05GSUdfUE5QPXkKLSMgQ09ORklHX1BOUF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvdG9jb2xzCi0jCi1DT05GSUdfUE5QQUNQST15Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPW0KLUNPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQotQ09ORklHX0JMS19ERVZfTkJEPW0KLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPW0KLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLUNPTkZJR19JREU9bQotQ09ORklHX0lERV9NQVhfSFdJRlM9NAotQ09ORklHX0JMS19ERVZfSURFPW0KLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRElTSz1tCi0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFQ0Q9bQotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERUZMT1BQWT1tCi0jIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLSMgQ09ORklHX0lERV9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFUE5QIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERVBDST15Ci1DT05GSUdfSURFUENJX1NIQVJFX0lSUT15Ci0jIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0dFTkVSSUM9bQotIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQotIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19JREVETUFfUENJX0FVVE89eQotIyBDT05GSUdfSURFRE1BX09OTFlESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1BJSVg9bQotIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX0FVVE89eQotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTST15Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIwotQ09ORklHX0JMS19ERVZfU0Q9eQotIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLSMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0NPTlNUQU5UUz15Ci1DT05GSUdfU0NTSV9MT0dHSU5HPXkKLQotIwotIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCi0jCi1DT05GSUdfU0NTSV9TUElfQVRUUlM9bQotIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCi0jCi0jIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAotQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQotIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi1DT05GSUdfTUQ9eQotQ09ORklHX0JMS19ERVZfTUQ9bQotQ09ORklHX01EX0xJTkVBUj1tCi1DT05GSUdfTURfUkFJRDA9bQotQ09ORklHX01EX1JBSUQxPW0KLUNPTkZJR19NRF9SQUlEMTA9bQotQ09ORklHX01EX1JBSUQ1PW0KLUNPTkZJR19NRF9SQUlENj1tCi1DT05GSUdfTURfTVVMVElQQVRIPW0KLSMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9ETT1tCi1DT05GSUdfRE1fQ1JZUFQ9bQotQ09ORklHX0RNX1NOQVBTSE9UPW0KLUNPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1pFUk89bQotIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfRFVNTVk9eQotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TQjEwMDAgaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKLQotIwotIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUENJPXkKLSMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAotIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAotIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RHUlMgaXMgbm90IHNldAotQ09ORklHX0VFUFJPMTAwPXkKLSMgQ09ORklHX0UxMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAotIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwotIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQotQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFPXkKLUNPTkZJR19NT1VTRV9QUzI9eQotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX0FDUEk9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKLUNPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKLUNPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfRUZJX1JUQz15Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLUNPTkZJR19BR1A9bQogQ09ORklHX0FHUF9JNDYwPW0KLUNPTkZJR19EUk09bQotIyBDT05GSUdfRFJNX1RERlggaXMgbm90IHNldAotQ09ORklHX0RSTV9SMTI4PW0KLSMgQ09ORklHX0RSTV9SQURFT04gaXMgbm90IHNldAotIyBDT05GSUdfRFJNX01HQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk1fU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTV9WSUEgaXMgbm90IHNldAotIyBDT05GSUdfRFJNX1NBVkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRVQgaXMgbm90IHNldAotIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLUNPTkZJR19JMkM9eQotQ09ORklHX0kyQ19DSEFSREVWPXkKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPXkKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAotIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0VFUFJPTV9MRUdBQ1kgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIwotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLUNPTkZJR19WR0FfQ09OU09MRT15Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0KLSMKLSMgU291bmQKLSMKLUNPTkZJR19TT1VORD1tCi0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCi1DT05GSUdfU05EPW0KLUNPTkZJR19TTkRfVElNRVI9bQotQ09ORklHX1NORF9QQ009bQotQ09ORklHX1NORF9IV0RFUD1tCi1DT05GSUdfU05EX1JBV01JREk9bQotQ09ORklHX1NORF9TRVFVRU5DRVI9bQotIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX09TU0VNVUw9eQotQ09ORklHX1NORF9NSVhFUl9PU1M9bQotQ09ORklHX1NORF9QQ01fT1NTPW0KLSMgQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15Ci0jIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKLUNPTkZJR19TTkRfT1BMM19MSUI9bQotQ09ORklHX1NORF9BQzk3X0NPREVDPW0KLUNPTkZJR19TTkRfQUM5N19CVVM9bQotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgZGV2aWNlcwotIwotIyBDT05GSUdfU05EX0FEMTg4OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DQTAxMDYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0NTNDI4MT1tCi0jIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTVUxMEsxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTVUxMEsxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU5TMTM3MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU5TMTM3MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRVMxOTM4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FUzE5NjggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0ZNODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JQ0UxNzEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTlRFTDhYMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTUFFU1RSTzMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1RSSURFTlQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAotCi0jCi0jIFVTQiBkZXZpY2VzCi0jCi0jIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIwotIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQotQ09ORklHX1VTQj1tCi0jIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfRUhDSV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1VIQ0lfSENEPW0KLSMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfT0JTT0xFVEVfT1NTX1VTQl9EUklWRVIgaXMgbm90IHNldAotQ09ORklHX1VTQl9BQ009bQotQ09ORklHX1VTQl9QUklOVEVSPW0KLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotQ09ORklHX1VTQl9TVE9SQUdFPW0KLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbnB1dCBEZXZpY2VzCi0jCi1DT05GSUdfVVNCX0hJRD1tCi1DT05GSUdfVVNCX0hJRElOUFVUPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfSElEREVWPXkKLQotIwotIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbWFnaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKLQotIwotIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgTmV0d29yayBBZGFwdGVycwotIwotIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKLQotIwotIyBVU0IgcG9ydCBkcml2ZXJzCi0jCi0KLSMKLSMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAotIwotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotCi0jCi0jIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKQotIwotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19KQkQ9eQotIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19GU19NQkNBQ0hFPXkKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19YRlNfRlM9eQotQ09ORklHX1hGU19FWFBPUlQ9eQotQ09ORklHX1hGU19RVU9UQT15Ci1DT05GSUdfWEZTX1NFQ1VSSVRZPXkKLUNPTkZJR19YRlNfUE9TSVhfQUNMPXkKLSMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfUVVPVEFDVEw9eQotQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0FVVE9GU19GUz1tCitDT05GSUdfQUdQPW0KIENPTkZJR19BVVRPRlM0X0ZTPW0KLSMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKK0NPTkZJR19BVVRPRlNfRlM9bQorQ09ORklHX0JJTkZNVF9NSVNDPW0KK0NPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQorQ09ORklHX0JMS19ERVZfRE09bQorQ09ORklHX0JMS19ERVZfR0VORVJJQz1tCitDT05GSUdfQkxLX0RFVl9JREVDRD1tCitDT05GSUdfQkxLX0RFVl9MT09QPW0KK0NPTkZJR19CTEtfREVWX01EPW0KK0NPTkZJR19CTEtfREVWX05CRD1tCitDT05GSUdfQkxLX0RFVl9QSUlYPW0KK0NPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQ0lGUz1tCitDT05GSUdfQ0lGU19QT1NJWD15CitDT05GSUdfQ0lGU19TVEFUUz15CitDT05GSUdfQ0lGU19YQVRUUj15CitDT05GSUdfQ1JZUFRPX0RFUz15CitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKK0NPTkZJR19ETV9DUllQVD1tCitDT05GSUdfRE1fTUlSUk9SPW0KK0NPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fWkVSTz1tCitDT05GSUdfRFJNPW0KK0NPTkZJR19EUk1fUjEyOD1tCitDT05GSUdfRFVNTVk9eQorQ09ORklHX0VGSV9QQVJUSVRJT049eQorQ09ORklHX0VGSV9SVEM9eQorQ09ORklHX0VGSV9WQVJTPXkKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0hVR0VUTEJGUz15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkM9eQorQ09ORklHX0lBNjRfRElHPXkKK0NPTkZJR19JQTY0X1BBTElORk89eQorQ09ORklHX0lERT1tCitDT05GSUdfSU5FVD15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiBDT05GSUdfSVNPOTY2MF9GUz1tCiBDT05GSUdfSk9MSUVUPXkKLSMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0Ci1DT05GSUdfVURGX0ZTPW0KLUNPTkZJR19VREZfTkxTPXkKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfRkFUX0ZTPXkKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKLUNPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfSFVHRVRMQkZTPXkKLUNPTkZJR19IVUdFVExCX1BBR0U9eQotQ09ORklHX1JBTUZTPXkKLSMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCitDT05GSUdfTE9HX0JVRl9TSElGVD0xNgorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19NRF9MSU5FQVI9bQorQ09ORklHX01EX01VTFRJUEFUSD1tCitDT05GSUdfTURfUkFJRDA9bQorQ09ORklHX01EX1JBSUQxMD1tCitDT05GSUdfTURfUkFJRDE9bQorQ09ORklHX01EPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUPXkKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1Y0PXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEPW0KLUNPTkZJR19ORlNEX1YzPXkKLSMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEX1Y0PXkKLUNPTkZJR19ORlNEX1RDUD15Ci1DT05GSUdfTE9DS0Q9bQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19FWFBPUlRGUz15Ci1DT05GSUdfTkZTX0NPTU1PTj15Ci1DT05GSUdfU1VOUlBDPW0KLUNPTkZJR19TVU5SUENfR1NTPW0KLUNPTkZJR19SUENTRUNfR1NTX0tSQjU9bQotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotQ09ORklHX0NJRlM9bQotQ09ORklHX0NJRlNfU1RBVFM9eQotIyBDT05GSUdfQ0lGU19TVEFUUzIgaXMgbm90IHNldAotQ09ORklHX0NJRlNfWEFUVFI9eQotQ09ORklHX0NJRlNfUE9TSVg9eQotIyBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfUEFSVElUSU9OPXkKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX0VGSV9QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CiBDT05GSUdfTkxTX0lTTzg4NTlfMT15Ci0jIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiBDT05GSUdfTkxTX1VURjg9bQotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci0KLSMKLSMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKLSMKLUNPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX05SX0NQVVM9MgogQ09ORklHX09QUk9GSUxFPXkKLSMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNgotQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKLSMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfUFJFRU1QVD15Ci1DT05GSUdfREVCVUdfTVVURVhFUz15Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAotQ09ORklHX0ZPUkNFRF9JTkxJTklORz15Ci0jIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X0dSQU5VTEVfNjRNQj15Ci0jIENPTkZJR19JQTY0X1BSSU5UX0hBWkFSRFMgaXMgbm90IHNldAotIyBDT05GSUdfRElTQUJMRV9WSFBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfREVCVUdfQ01QWENIRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RFQlVHX0lSUSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQ19DT01QQVQ9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotQ09ORklHX0NSWVBUTz15Ci0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKK0NPTkZJR19QRVJGTU9OPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15CitDT05GSUdfU0NTSV9TUElfQVRUUlM9bQorQ09ORklHX1NDU0k9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TR0lfUEFSVElUSU9OPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX1NORF9DUzQyODE9bQorQ09ORklHX1NORD1tCitDT05GSUdfU05EX01JWEVSX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorQ09ORklHX1NPVU5EPW0KK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VTklYPXkKK0NPTkZJR19VU0JfQUNNPW0KK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9ISURERVY9eQorQ09ORklHX1VTQj1tCitDT05GSUdfVVNCX01PTj1tCitDT05GSUdfVVNCX1BSSU5URVI9bQorQ09ORklHX1VTQl9TVE9SQUdFPW0KK0NPTkZJR19VU0JfVUhDSV9IQ0Q9bQorQ09ORklHX1ZGQVRfRlM9eQorIyBDT05GSUdfVklSVFVBTF9NRU1fTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19YRlNfRlM9eQorQ09ORklHX1hGU19QT1NJWF9BQ0w9eQorQ09ORklHX1hGU19RVU9UQT15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCmluZGV4IDZhNGNjNTAuLjAxYmE1MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCkBAIC0xLDE0NTUgKzEsMTMzIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmM3Ci0jIE1vbiBEZWMgIDggMDg6MTI6MDcgMjAwOAotIwotQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19MT0NLX0tFUk5FTD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0lLQ09ORklHPXkKLUNPTkZJR19JS0NPTkZJR19QUk9DPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTIwCi1DT05GSUdfQ0dST1VQUz15Ci0jIENPTkZJR19DR1JPVVBfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfQ0dST1VQX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NHUk9VUF9GUkVFWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NHUk9VUF9ERVZJQ0UgaXMgbm90IHNldAotQ09ORklHX0NQVVNFVFM9eQotIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ0dST1VQX0NQVUFDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlMgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotQ09ORklHX1BST0NfUElEX0NQVVNFVD15Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci1DT05GSUdfTkFNRVNQQUNFUz15Ci0jIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAotIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19TWVNDVEw9eQotIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19LQUxMU1lNUz15Ci1DT05GSUdfS0FMTFNZTVNfQUxMPXkKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQ09NUEFUX0JSSz15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfQU5PTl9JTk9ERVM9eQotQ09ORklHX0VQT0xMPXkKLUNPTkZJR19TSUdOQUxGRD15Ci1DT05GSUdfVElNRVJGRD15Ci1DT05GSUdfRVZFTlRGRD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0FJTz15Ci1DT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotQ09ORklHX1BDSV9RVUlSS1M9eQotQ09ORklHX1NMVUJfREVCVUc9eQotIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0Ci1DT05GSUdfU0xVQj15Ci0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX09QUk9GSUxFPXkKLSMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfS1BST0JFUz15Ci1DT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKLUNPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKLUNPTkZJR19IQVZFX0RNQV9BVFRSUz15Ci1DT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQotIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0xBQklORk89eQotQ09ORklHX1JUX01VVEVYRVM9eQotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19NT0RWRVJTSU9OUz15Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotQ09ORklHX1NUT1BfTUFDSElORT15Ci1DT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxPQ0tfQ09NUEFUPXkKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci1DT05GSUdfREVGQVVMVF9BUz15Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCi0jCi1DT05GSUdfSUE2ND15Ci1DT05GSUdfNjRCSVQ9eQotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19RVUlDS0xJU1Q9eQotQ09ORklHX01NVT15Ci1DT05GSUdfU1dJT1RMQj15Ci1DT05GSUdfSU9NTVVfSEVMUEVSPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfVkFSSUFCTEU9eQotQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfVElNRT15Ci1DT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKLUNPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQT15Ci1DT05GSUdfRE1JPXkKLUNPTkZJR19FRkk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfSUE2NF9VTkNBQ0hFRF9BTExPQ0FUT1I9eQotQ09ORklHX0FVRElUX0FSQ0g9eQotIyBDT05GSUdfUEFSQVZJUlRfR1VFU1QgaXMgbm90IHNldAotQ09ORklHX0lBNjRfR0VORVJJQz15Ci0jIENPTkZJR19JQTY0X0RJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RJR19WVEQgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDEgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDFfU1dJT1RMQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1NHSV9TTjIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9TR0lfVVYgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9TSU0gaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9YRU5fR1VFU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVRBTklVTSBpcyBub3Qgc2V0Ci1DT05GSUdfTUNLSU5MRVk9eQotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X1BBR0VfU0laRV82NEtCPXkKLUNPTkZJR19QR1RBQkxFXzM9eQotIyBDT05GSUdfUEdUQUJMRV80IGlzIG5vdCBzZXQKLUNPTkZJR19IWj0yNTAKLSMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFpfMjUwPXkKLSMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9MMV9DQUNIRV9TSElGVD03Ci1DT05GSUdfSUE2NF9DWUNMT05FPXkKLUNPTkZJR19JT1NBUElDPXkKLUNPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE3Ci0jIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HIGlzIG5vdCBzZXQKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9NDA5NgotQ09ORklHX0hPVFBMVUdfQ1BVPXkKLUNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15Ci1DT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15Ci0jIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAotIyBDT05GSUdfUEVSTUlUX0JTUF9SRU1PVkUgaXMgbm90IHNldAotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci0jIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLSMgQ09ORklHX0ZMQVRNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0RJU0NPTlRJR01FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVM9eQotQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRT15Ci1DT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKLUNPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00Ci1DT05GSUdfTUlHUkFUSU9OPXkKLUNPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQotQ09ORklHX1BIWVNfQUREUl9UXzY0QklUPXkKLUNPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19CT1VOQ0U9eQotQ09ORklHX05SX1FVSUNLPTEKLUNPTkZJR19WSVJUX1RPX0JVUz15Ci1DT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKLUNPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9ERUZBVUxUPXkKLUNPTkZJR19OVU1BPXkKLUNPTkZJR19OT0RFU19TSElGVD0xMAotQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKLUNPTkZJR19WSVJUVUFMX01FTV9NQVA9eQotQ09ORklHX0hPTEVTX0lOX1pPTkU9eQotQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklEPXkKLUNPTkZJR19IQVZFX0FSQ0hfTk9ERURBVEFfRVhURU5TSU9OPXkKLUNPTkZJR19DT01QQVRfRk9SX1U2NF9BTElHTk1FTlQ9eQotQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZPXkKLUNPTkZJR19QRVJGTU9OPXkKLUNPTkZJR19JQTY0X1BBTElORk89eQotIyBDT05GSUdfSUE2NF9NQ19FUlJfSU5KRUNUIGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfU049eQotIyBDT05GSUdfSUE2NF9FU0kgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9BTUxfTkZXIGlzIG5vdCBzZXQKLQotIwotIyBTTiBEZXZpY2VzCi0jCi1DT05GSUdfU0dJX0lPQzM9bQotQ09ORklHX0tFWEVDPXkKLUNPTkZJR19DUkFTSF9EVU1QPXkKLQotIwotIyBGaXJtd2FyZSBEcml2ZXJzCi0jCi0jIENPTkZJR19GSVJNV0FSRV9NRU1NQVAgaXMgbm90IHNldAotQ09ORklHX0VGSV9WQVJTPXkKLUNPTkZJR19FRklfUENEUD15Ci1DT05GSUdfRE1JSUQ9eQotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAotIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKLUNPTkZJR19CSU5GTVRfTUlTQz1tCi0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBhbmQgQUNQSSBvcHRpb25zCi0jCi1DT05GSUdfUE09eQotIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FDUEk9eQotQ09ORklHX0FDUElfUFJPQ0ZTPXkKLUNPTkZJR19BQ1BJX1BST0NGU19QT1dFUj15Ci1DT05GSUdfQUNQSV9TWVNGU19QT1dFUj15Ci1DT05GSUdfQUNQSV9QUk9DX0VWRU5UPXkKIENPTkZJR19BQ1BJX0JVVFRPTj1tCi1DT05GSUdfQUNQSV9GQU49bQotQ09ORklHX0FDUElfRE9DSz15Ci1DT05GSUdfQUNQSV9QUk9DRVNTT1I9bQotQ09ORklHX0FDUElfSE9UUExVR19DUFU9eQotQ09ORklHX0FDUElfVEhFUk1BTD1tCi1DT05GSUdfQUNQSV9OVU1BPXkKLSMgQ09ORklHX0FDUElfQ1VTVE9NX0RTRFQgaXMgbm90IHNldAotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAotIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BQ1BJX1BDSV9TTE9UIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX1NZU1RFTT15CiBDT05GSUdfQUNQSV9DT05UQUlORVI9bQotCi0jCi0jIENQVSBGcmVxdWVuY3kgc2NhbGluZwotIwotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSkKLSMKLUNPTkZJR19QQ0k9eQotQ09ORklHX1BDSV9ET01BSU5TPXkKLUNPTkZJR19QQ0lfU1lTQ0FMTD15Ci0jIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9TVVBQT1JUU19NU0k9eQotQ09ORklHX1BDSV9NU0k9eQotQ09ORklHX1BDSV9MRUdBQ1k9eQotIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHX1BDST1tCi0jIENPTkZJR19IT1RQTFVHX1BDSV9GQUtFIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHX1BDSV9BQ1BJPW0KLSMgQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0kgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0lfU0hQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHX1BDSV9TR0kgaXMgbm90IHNldAotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLUNPTkZJR19ETUFSPXkKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfWEZSTT15Ci0jIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotQ09ORklHX0FSUEQ9eQotQ09ORklHX1NZTl9DT09LSUVTPXkKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQotQ09ORklHX0lORVRfTFJPPW0KLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0NVQklDPXkKLUNPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKLSMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQU4gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAotQ09ORklHX1dJUkVMRVNTPXkKLSMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKLUNPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15Ci0jIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLUNPTkZJR19GV19MT0FERVI9eQotQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15Ci1DT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotQ09ORklHX0NPTk5FQ1RPUj15Ci1DT05GSUdfUFJPQ19FVkVOVFM9eQotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotQ09ORklHX1BOUD15Ci0jIENPTkZJR19QTlBfREVCVUdfTUVTU0FHRVMgaXMgbm90IHNldAotCi0jCi0jIFByb3RvY29scwotIwotQ09ORklHX1BOUEFDUEk9eQotQ09ORklHX0JMS19ERVY9eQotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPW0KLUNPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQotQ09ORklHX0JMS19ERVZfTkJEPW0KLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlTQ19ERVZJQ0VTPXkKLSMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfSU9DND15Ci0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfWFA9bQotIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9JREU9eQotQ09ORklHX0lERT15Ci0KLSMKLSMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotQ09ORklHX0lERV9USU1JTkdTPXkKLUNPTkZJR19JREVfQVRBUEk9eQotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfSURFX0dEPXkKLUNPTkZJR19JREVfR0RfQVRBPXkKLSMgQ09ORklHX0lERV9HRF9BVEFQSSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVDRD15Ci1DT05GSUdfQkxLX0RFVl9JREVDRF9WRVJCT1NFX0VSUk9SUz15Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFU0NTST1tCi0jIENPTkZJR19CTEtfREVWX0lERUFDUEkgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotQ09ORklHX0lERV9QUk9DX0ZTPXkKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi0jIENPTkZJR19JREVfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFUE5QIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURNQV9TRkY9eQotCi0jCi0jIFBDSSBJREUgY2hpcHNldHMgc3VwcG9ydAotIwotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLUNPTkZJR19JREVQQ0lfUENJQlVTX09SREVSPXkKLSMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfR0VORVJJQz15Ci0jIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9DTUQ2NFg9eQotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSk1JQ1JPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9QSUlYPXkKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1NHSUlPQzQ9eQotIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UQzg2QzAwMSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9eQotQ09ORklHX1NDU0lfRE1BPXkKLSMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX05FVExJTks9eQotQ09ORklHX1NDU0lfUFJPQ19GUz15Ci0KLSMKLSMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKLSMKLUNPTkZJR19CTEtfREVWX1NEPXkKLUNPTkZJR19DSFJfREVWX1NUPW0KLSMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TUj1tCi0jIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUiBpcyBub3Qgc2V0Ci1DT05GSUdfQ0hSX0RFVl9TRz1tCi0jIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCi0jIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCi0KLSMKLSMgU0NTSSBUcmFuc3BvcnRzCi0jCi1DT05GSUdfU0NTSV9TUElfQVRUUlM9eQotQ09ORklHX1NDU0lfRkNfQVRUUlM9eQotIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TQVNfQVRUUlM9eQotIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0xPV0xFVkVMPXkKLSMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9NVlNBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAotQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQotQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RNQV9BRERSRVNTSU5HX01PREU9MQotQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUz0xNgotQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfTU1JTz15Ci0jIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15Ci0jIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKLUNPTkZJR19BVEE9eQotQ09ORklHX0FUQV9OT05TVEFOREFSRD15Ci1DT05GSUdfQVRBX0FDUEk9eQotQ09ORklHX1NBVEFfUE1QPXkKLSMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKLUNPTkZJR19BVEFfU0ZGPXkKLSMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKLUNPTkZJR19BVEFfUElJWD15Ci0jIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAotIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAotQ09ORklHX1NBVEFfVklURVNTRT15Ci0jIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQUNQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9TQ0ggaXMgbm90IHNldAotQ09ORklHX01EPXkKLUNPTkZJR19CTEtfREVWX01EPW0KLUNPTkZJR19NRF9MSU5FQVI9bQotQ09ORklHX01EX1JBSUQwPW0KLUNPTkZJR19NRF9SQUlEMT1tCi0jIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDQ1NiBpcyBub3Qgc2V0Ci1DT05GSUdfTURfTVVMVElQQVRIPW0KLSMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9ETT1tCi0jIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRE1fQ1JZUFQ9bQotQ09ORklHX0RNX1NOQVBTSE9UPW0KLUNPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1pFUk89bQotQ09ORklHX0RNX01VTFRJUEFUSD1tCi0jIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETV9VRVZFTlQgaXMgbm90IHNldAotQ09ORklHX0ZVU0lPTj15Ci1DT05GSUdfRlVTSU9OX1NQST15Ci1DT05GSUdfRlVTSU9OX0ZDPW0KLUNPTkZJR19GVVNJT05fU0FTPXkKLUNPTkZJR19GVVNJT05fTUFYX1NHRT0xMjgKLSMgQ09ORklHX0ZVU0lPTl9DVEwgaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX0xPR0dJTkcgaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKLSMKLSMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfRFVNTVk9bQotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0IxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci1DT05GSUdfUEhZTElCPXkKLQotIwotIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPW0KLSMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotQ09ORklHX05FVF9UVUxJUD15Ci0jIENPTkZJR19ERTIxMDRYIGlzIG5vdCBzZXQKLUNPTkZJR19UVUxJUD1tCi0jIENPTkZJR19UVUxJUF9NV0kgaXMgbm90IHNldAotIyBDT05GSUdfVFVMSVBfTU1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVUxJUF9OQVBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFNFg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJTkJPTkRfODQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNOTEwMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTEk1MjZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotQ09ORklHX0VFUFJPMTAwPW0KLUNPTkZJR19FMTAwPW0KLSMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I2MDQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAotIyBDT05GSUdfQVRMMiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWXzEwMDA9eQotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotQ09ORklHX0UxMDAwPXkKLSMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAotQ09ORklHX0lHQj15Ci0jIENPTkZJR19JR0JfTFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLR0UgaXMgbm90IHNldAotIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAotQ09ORklHX1RJR09OMz15Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19KTUUgaXMgbm90IHNldAotQ09ORklHX05FVERFVl8xMDAwMD15Ci0jIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAotIyBDT05GSUdfRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSVUgaXMgbm90IHNldAotIyBDT05GSUdfTUxYNF9FTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NTFg0X0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfVEVIVVRJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JOWDJYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMR0UgaXMgbm90IHNldAotIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKLSMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAotCi0jCi0jIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRDT05TT0xFPXkKLSMgQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUUE9MTD15Ci0jIENPTkZJR19ORVRQT0xMX1RSQVAgaXMgbm90IHNldAotQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVI9eQotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLUNPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfTU9VU0U9eQotQ09ORklHX01PVVNFX1BTMj15Ci1DT05GSUdfTU9VU0VfUFMyX0FMUFM9eQotQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQotQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQotQ09ORklHX01PVVNFX1BTMl9MSUZFQk9PSz15Ci1DT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQ9eQotIyBDT05GSUdfTU9VU0VfUFMyX0VMQU5URUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19JODA0Mj15Ci0jIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci1DT05GSUdfR0FNRVBPUlQ9bQotIyBDT05GSUdfR0FNRVBPUlRfTlM1NTggaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlRfTDQgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlRfRU1VMTBLMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9GTTgwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZLTUVNPXkKLUNPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQotIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPQ0tFVFBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1lDTEFERVMgaXMgbm90IHNldAotIyBDT05GSUdfRElHSUVQQ0EgaXMgbm90IHNldAotIyBDT05GSUdfTU9YQV9JTlRFTExJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1hBX1NNQVJUSU8gaXMgbm90IHNldAotIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldAotIyBDT05GSUdfTl9IRExDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JJU0NPTTggaXMgbm90IHNldAotIyBDT05GSUdfU1BFQ0lBTElYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVEFMRFJWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0Ci1DT05GSUdfU0dJX1NOU0M9eQotQ09ORklHX1NHSV9USU9DWD15Ci1DT05GSUdfU0dJX01CQ1M9bQotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX1BDST15Ci1DT05GSUdfU0VSSUFMXzgyNTBfUE5QPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz02Ci1DT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00Ci1DT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQotQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15Ci0jIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfU0dJX0wxX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX1NHSV9JT0M0PXkKLSMgQ09ORklHX1NFUklBTF9TR0lfSU9DMyBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfRUZJX1JUQz15Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFXX0RSSVZFUj1tCi1DT05GSUdfTUFYX1JBV19ERVZTPTI1NgotQ09ORklHX0hQRVQ9eQotQ09ORklHX0hQRVRfTU1BUD15Ci0jIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAotQ09ORklHX01NVElNRVI9eQotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUE9SVD15Ci0jIENPTkZJR19JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLUNPTkZJR19QT1dFUl9TVVBQTFk9eQotIyBDT05GSUdfUE9XRVJfU1VQUExZX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BEQV9QT1dFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0Ci1DT05GSUdfSFdNT049eQotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MSVMzTFYwMkQgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfVEhFUk1BTD1tCi0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotCi0jCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotQ09ORklHX0RBQj15Ci0jIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi1DT05GSUdfQUdQPW0KLUNPTkZJR19BR1BfSTQ2MD1tCitDT05GSUdfQUNQSV9ET0NLPXkKK0NPTkZJR19BQ1BJX0ZBTj1tCitDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQorQ09ORklHX0FDUElfUFJPQ0ZTPXkKIENPTkZJR19BR1BfSFBfWlgxPW0KK0NPTkZJR19BR1BfSTQ2MD1tCitDT05GSUdfQUdQPW0KIENPTkZJR19BR1BfU0dJX1RJT0NBPW0KK0NPTkZJR19BUlBEPXkKK0NPTkZJR19BVEFfUElJWD15CitDT05GSUdfQVRBPXkKK0NPTkZJR19BVVRPRlM0X0ZTPW0KK0NPTkZJR19BVVRPRlNfRlM9bQorQ09ORklHX0JJTkZNVF9NSVNDPW0KKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0NNRDY0WD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KK0NPTkZJR19CTEtfREVWX0RNPW0KK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorQ09ORklHX0JMS19ERVZfTUQ9bQorQ09ORklHX0JMS19ERVZfTkJEPW0KK0NPTkZJR19CTEtfREVWX1BJSVg9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19CTEtfREVWX1NHSUlPQzQ9eQorQ09ORklHX0JMS19ERVZfU1I9bQorQ09ORklHX0NHUk9VUFM9eQorQ09ORklHX0NIUl9ERVZfU0c9bQorQ09ORklHX0NIUl9ERVZfU1Q9bQorQ09ORklHX0NJRlM9bQorQ09ORklHX0NPTk5FQ1RPUj15CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfQ1JBU0hfRFVNUD15CitDT05GSUdfQ1JDX1QxMERJRj15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfRE1fQ1JZUFQ9bQorQ09ORklHX0RNX01JUlJPUj1tCitDT05GSUdfRE1fTVVMVElQQVRIPW0KK0NPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRFJNPW0KLUNPTkZJR19EUk1fVERGWD1tCitDT05GSUdfRFJNX01HQT1tCiBDT05GSUdfRFJNX1IxMjg9bQogQ09ORklHX0RSTV9SQURFT049bQotQ09ORklHX0RSTV9NR0E9bQogQ09ORklHX0RSTV9TSVM9bQotIyBDT05GSUdfRFJNX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk1fU0FWQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLUNPTkZJR19WR0FfQ09OU09MRT15Ci0jIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19TT1VORD1tCi1DT05GSUdfU09VTkRfT1NTX0NPUkU9eQotQ09ORklHX1NORD1tCi1DT05GSUdfU05EX1RJTUVSPW0KLUNPTkZJR19TTkRfUENNPW0KLUNPTkZJR19TTkRfSFdERVA9bQotQ09ORklHX1NORF9SQVdNSURJPW0KLUNPTkZJR19TTkRfU0VRVUVOQ0VSPW0KLUNPTkZJR19TTkRfU0VRX0RVTU1ZPW0KLUNPTkZJR19TTkRfT1NTRU1VTD15Ci1DT05GSUdfU05EX01JWEVSX09TUz1tCi1DT05GSUdfU05EX1BDTV9PU1M9bQotQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQotQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKLSMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15Ci1DT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKLUNPTkZJR19TTkRfVkVSQk9TRV9QUklOVEs9eQotIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfVk1BU1RFUj15Ci1DT05GSUdfU05EX01QVTQwMV9VQVJUPW0KLUNPTkZJR19TTkRfT1BMM19MSUI9bQotQ09ORklHX1NORF9BQzk3X0NPREVDPW0KLUNPTkZJR19TTkRfRFJJVkVSUz15Ci1DT05GSUdfU05EX0RVTU1ZPW0KLUNPTkZJR19TTkRfVklSTUlEST1tCi1DT05GSUdfU05EX01UUEFWPW0KLUNPTkZJR19TTkRfU0VSSUFMX1UxNjU1MD1tCi1DT05GSUdfU05EX01QVTQwMT1tCi0jIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfUENJPXkKLSMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9PWFlHRU4gaXMgbm90IHNldAotQ09ORklHX1NORF9DUzQyODE9bQotQ09ORklHX1NORF9DUzQ2WFg9bQotQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUD15Ci0jIENPTkZJR19TTkRfREFSTEEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfR0lOQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9MQVlMQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9EQVJMQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9HSU5BMjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0xBWUxBMjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01PTkEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01JQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRUNITzNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR08gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lORElHT0lPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR09ESiBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0VNVTEwSzE9bQotIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTlMxMzcxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FUzE5MzggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTk2OCBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0ZNODAxPW0KLSMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ISUZJRVIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lDRTE3MTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lDRTE3MjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lOVEVMOFgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0tPUkcxMjEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTUlYQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9OTTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUENYSFIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JJUFRJREUgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklBODJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklBODJYWF9NT0RFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklSVFVPU08gaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAotQ09ORklHX1NORF9VU0I9eQotIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAotQ09ORklHX0FDOTdfQlVTPW0KLUNPTkZJR19ISURfU1VQUE9SVD15Ci1DT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURSQVcgaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbnB1dCBEZXZpY2VzCi0jCi1DT05GSUdfVVNCX0hJRD1tCi0jIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAotCi0jCi0jIFVTQiBISUQgQm9vdCBQcm90b2NvbCBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NT1VTRSBpcyBub3Qgc2V0Ci0KLSMKLSMgU3BlY2lhbCBISUQgZHJpdmVycwotIwotQ09ORklHX0hJRF9DT01QQVQ9eQotQ09ORklHX0hJRF9BNFRFQ0g9bQotQ09ORklHX0hJRF9BUFBMRT1tCi1DT05GSUdfSElEX0JFTEtJTj1tCi1DT05GSUdfSElEX0JSSUdIVD1tCi1DT05GSUdfSElEX0NIRVJSWT1tCi1DT05GSUdfSElEX0NISUNPTlk9bQotQ09ORklHX0hJRF9DWVBSRVNTPW0KLUNPTkZJR19ISURfREVMTD1tCi1DT05GSUdfSElEX0VaS0VZPW0KK0NPTkZJR19EUk1fVERGWD1tCitDT05GSUdfRFVNTVk9bQorQ09ORklHX0UxMDAwPXkKK0NPTkZJR19FMTAwPW0KK0NPTkZJR19FRklfUEFSVElUSU9OPXkKK0NPTkZJR19FRklfUlRDPXkKK0NPTkZJR19FRklfVkFSUz15CitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0ZVU0lPTl9GQz1tCitDT05GSUdfRlVTSU9OX1NBUz15CitDT05GSUdfRlVTSU9OX1NQST15CitDT05GSUdfRlVTSU9OPXkKK0NPTkZJR19HQU1FUE9SVD1tCiBDT05GSUdfSElEX0dZUkFUSU9OPW0KLUNPTkZJR19ISURfTE9HSVRFQ0g9bQotIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAotIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldAotQ09ORklHX0hJRF9NSUNST1NPRlQ9bQotQ09ORklHX0hJRF9NT05URVJFWT1tCiBDT05GSUdfSElEX1BBTlRIRVJMT1JEPW0KLSMgQ09ORklHX1BBTlRIRVJMT1JEX0ZGIGlzIG5vdCBzZXQKIENPTkZJR19ISURfUEVUQUxZTlg9bQogQ09ORklHX0hJRF9TQU1TVU5HPW0KIENPTkZJR19ISURfU09OWT1tCiBDT05GSUdfSElEX1NVTlBMVVM9bQotIyBDT05GSUdfVEhSVVNUTUFTVEVSX0ZGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1pFUk9QTFVTX0ZGIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU1VQUE9SVD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQotQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKLUNPTkZJR19VU0I9bQotIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucwotIwotQ09ORklHX1VTQl9ERVZJQ0VGUz15Ci1DT05GSUdfVVNCX0RFVklDRV9DTEFTUz15Ci0jIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX01PTj15Ci0jIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9bQotIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX09IQ0lfSENEPW0KLSMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAotQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQotQ09ORklHX1VTQl9VSENJX0hDRD1tCi0jIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1dIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKLQotIwotIyBFbmFibGUgSG9zdCBvciBHYWRnZXQgc3VwcG9ydCB0byBzZWUgSW52ZW50cmEgb3B0aW9ucwotIwotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGRlcGVuZHMgb24gU0NTSSBidXQgQkxLX0RFVl9TRCBtYXkgYWxzbyBiZSBuZWVkZWQ7Ci0jCi0KLSMKLSMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKLUNPTkZJR19VU0JfU1RPUkFHRT1tCi0jIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbWFnaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgcG9ydCBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VXQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NTUMgaXMgbm90IHNldAotIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5GSU5JQkFORD1tCi0jIENPTkZJR19JTkZJTklCQU5EX1VTRVJfTUFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORklOSUJBTkRfVVNFUl9BQ0NFU1MgaXMgbm90IHNldAotQ09ORklHX0lORklOSUJBTkRfQUREUl9UUkFOUz15Ci1DT05GSUdfSU5GSU5JQkFORF9NVEhDQT1tCi1DT05GSUdfSU5GSU5JQkFORF9NVEhDQV9ERUJVRz15Ci0jIENPTkZJR19JTkZJTklCQU5EX0lQQVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORklOSUJBTkRfQU1TTzExMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUxYNF9JTkZJTklCQU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORklOSUJBTkRfTkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfSE9UUExVR19QQ0lfQUNQST1tCitDT05GSUdfSE9UUExVR19QQ0k9bQorQ09ORklHX0hQRVQ9eQorQ09ORklHX0hVR0VUTEJGUz15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0lBNjRfQ1lDTE9ORT15CitDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlk9eQorQ09ORklHX0lBNjRfUEFHRV9TSVpFXzY0S0I9eQorQ09ORklHX0lBNjRfUEFMSU5GTz15CitDT05GSUdfSURFPXkKK0NPTkZJR19JR0I9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JTkVUPXkKIENPTkZJR19JTkZJTklCQU5EX0lQT0lCPW0KLSMgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfQ00gaXMgbm90IHNldAotQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUc9eQotIyBDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9ERUJVR19EQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORklOSUJBTkRfU1JQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORklOSUJBTkRfSVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VSU8gaXMgbm90IHNldAotIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0Ci1DT05GSUdfU1RBR0lOR19FWENMVURFX0JVSUxEPXkKLQotIwotIyBIUCBTaW11bGF0b3IgZHJpdmVycwotIwotIyBDT05GSUdfSFBfU0lNRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQX1NJTVNFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUF9TSU1TQ1NJIGlzIG5vdCBzZXQKLUNPTkZJR19NU1BFQz1tCi0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci1DT05GSUdfRVhUMl9GU19YQVRUUj15Ci1DT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQotIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKLSMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci1DT05GSUdfUkVJU0VSRlNfRlM9eQotIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKLUNPTkZJR19SRUlTRVJGU19GU19YQVRUUj15Ci1DT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWT15Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKLUNPTkZJR19YRlNfRlM9eQotIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTkZJTklCQU5EPW0KK0NPTkZJR19JTkZJTklCQU5EX01USENBPW0KIENPTkZJR19JTk9USUZZPXkKLUNPTkZJR19JTk9USUZZX1VTRVI9eQotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0FVVE9GU19GUz1tCi1DT05GSUdfQVVUT0ZTNF9GUz1tCi0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX0lTTzk2NjBfRlM9bQogQ09ORklHX0pPTElFVD15Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotQ09ORklHX1VERl9GUz1tCi1DT05GSUdfVURGX05MUz15Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0ZBVF9GUz15Ci0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3Ci1DT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCi1DT05GSUdfTlRGU19GUz1tCi0jIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1BST0NfVk1DT1JFPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotQ09ORklHX0hVR0VUTEJGUz15Ci1DT05GSUdfSFVHRVRMQl9QQUdFPXkKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfS0VYRUM9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MjAKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTUNLSU5MRVk9eQorQ09ORklHX01EX0xJTkVBUj1tCitDT05GSUdfTURfTVVMVElQQVRIPW0KK0NPTkZJR19NRF9SQUlEMD1tCitDT05GSUdfTURfUkFJRDE9bQorQ09ORklHX01EPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CitDT05GSUdfTVNQRUM9bQorQ09ORklHX05FVENPTlNPTEU9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1RVTElQPXkKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1Y0PXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU0Q9bQotQ09ORklHX05GU0RfVjM9eQotIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAotQ09ORklHX05GU0RfVjQ9eQotQ09ORklHX0xPQ0tEPW0KLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9bQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz1tCi1DT05GSUdfU1VOUlBDX0dTUz1tCi1DT05GSUdfU1VOUlBDX1hQUlRfUkRNQT1tCi0jIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAotQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT1tCi0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9bQotQ09ORklHX1NNQl9OTFNfREVGQVVMVD15Ci1DT05GSUdfU01CX05MU19SRU1PVEU9ImNwNDM3IgotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfU0dJX1BBUlRJVElPTj15Ci0jIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19FRklfUEFSVElUSU9OPXkKLSMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQpAQCAtMTQ2NSwxNSArMTQzLDE0IEBACiBDT05GSUdfTkxTX0NPREVQQUdFXzg2NT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2Nj1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2OT1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg3ND1tCi1DT05GSUdfTkxTX0lTTzg4NTlfOD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzEyNTA9bQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUxPW0KLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiBDT05GSUdfTkxTX0lTTzg4NTlfMj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMz1tCkBAIC0xNDgxLDE5NCArMTU4LDc5IEBACiBDT05GSUdfTkxTX0lTTzg4NTlfNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOD1tCiBDT05GSUdfTkxTX0lTTzg4NTlfOT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTM9bQotQ09ORklHX05MU19JU084ODU5XzE0PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0tPSThfUj1tCiBDT05GSUdfTkxTX0tPSThfVT1tCiBDT05GSUdfTkxTX1VURjg9bQotIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLUNPTkZJR19GUkFNRV9XQVJOPTIwNDgKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQotIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAotQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKLSMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCi1DT05GSUdfU0NIRURfREVCVUc9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfTVVURVhFUz15Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfTlRGU19GUz1tCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX1BFUkZNT049eQorIyBDT05GSUdfUE5QX0RFQlVHX01FU1NBR0VTIGlzIG5vdCBzZXQKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1JBV19EUklWRVI9bQogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWT15CitDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQorQ09ORklHX1JFSVNFUkZTX0ZTPXkKK0NPTkZJR19TQVRBX1ZJVEVTU0U9eQorQ09ORklHX1NDU0lfRkNfQVRUUlM9eQorQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQorQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz02CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKK0NPTkZJR19TRVJJQUxfU0dJX0lPQzQ9eQorQ09ORklHX1NFUklBTF9TR0lfTDFfQ09OU09MRT15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TR0lfSU9DND15CitDT05GSUdfU0dJX01CQ1M9bQorQ09ORklHX1NHSV9QQVJUSVRJT049eQorQ09ORklHX1NHSV9TTlNDPXkKK0NPTkZJR19TR0lfVElPQ1g9eQorQ09ORklHX1NHSV9YUD1tCitDT05GSUdfU01CX0ZTPW0KK0NPTkZJR19TTUJfTkxTX0RFRkFVTFQ9eQorQ09ORklHX1NNUD15CitDT05GSUdfU05EX0NTNDI4MT1tCitDT05GSUdfU05EX0NTNDZYWD1tCitDT05GSUdfU05EX0RVTU1ZPW0KK0NPTkZJR19TTkRfRU1VMTBLMT1tCitDT05GSUdfU05EX0ZNODAxPW0KK0NPTkZJR19TTkQ9bQorQ09ORklHX1NORF9NSVhFUl9PU1M9bQorQ09ORklHX1NORF9NUFU0MDE9bQorQ09ORklHX1NORF9NVFBBVj1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorQ09ORklHX1NORF9TRVFfRFVNTVk9bQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKK0NPTkZJR19TTkRfU0VSSUFMX1UxNjU1MD1tCitDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLPXkKK0NPTkZJR19TTkRfVklSTUlEST1tCitDT05GSUdfU09VTkQ9bQorQ09ORklHX1NZTl9DT09LSUVTPXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15Ci0KLSMKLSMgVHJhY2VycwotIwotIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X0dSQU5VTEVfMTZNQj15Ci0jIENPTkZJR19JQTY0X0dSQU5VTEVfNjRNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1BSSU5UX0hBWkFSRFMgaXMgbm90IHNldAotIyBDT05GSUdfRElTQUJMRV9WSFBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfREVCVUdfQ01QWENIRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RFQlVHX0lSUSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQ19DT01QQVQ9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPPXkKLQotIwotIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKLSMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fQUxHQVBJPXkKLUNPTkZJR19DUllQVE9fQUVBRD1tCi1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCi1DT05GSUdfQ1JZUFRPX0hBU0g9bQotQ09ORklHX0NSWVBUT19STkc9bQotQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KLSMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKLSMKLSMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIG1vZGVzCi0jCi1DT05GSUdfQ1JZUFRPX0NCQz1tCi0jIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19FQ0I9bQotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1BDQkM9bQotIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFzaCBtb2RlcwotIwotIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAotCi0jCi0jIERpZ2VzdAotIwotIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2lwaGVycwotIwotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz1tCi0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29tcHJlc3Npb24KLSMKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAotCi0jCi0jIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgotIwotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19IVz15Ci0jIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9LVk09eQotQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKLSMgQ09ORklHX0tWTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSVJUSU9fUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJUlRJT19CQUxMT09OIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQklUUkVWRVJTRT15Ci0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQotQ09ORklHX0NSQ19JVFVfVD1tCi1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SPXkKLUNPTkZJR19QTElTVD15Ci1DT05GSUdfSEFTX0lPTUVNPXkKLUNPTkZJR19IQVNfSU9QT1JUPXkKLUNPTkZJR19IQVNfRE1BPXkKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci1DT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1RJR09OMz15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX1RVTElQPW0KK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19VTklYPXkKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9FSENJX0hDRD1tCitDT05GSUdfVVNCPW0KK0NPTkZJR19VU0JfTU9OPW0KK0NPTkZJR19VU0JfT0hDSV9IQ0Q9bQorQ09ORklHX1VTQl9TVE9SQUdFPW0KK0NPTkZJR19VU0JfVUhDSV9IQ0Q9bQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX1hGU19GUz15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZwppbmRleCAyZGMxODViLi4xODk4OWEwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbnNwYXJzZV9kZWZjb25maWcKQEAgLTEsMTI2NyArMSwxMTAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNi1yYzUKLSMgVGh1IE1hciAgMiAxNjozOToxMCAyMDA2Ci0jCi0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19MT0NLX0tFUk5FTD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci0jIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAotQ09ORklHX0tBTExTWU1TPXkKLUNPTkZJR19LQUxMU1lNU19BTEw9eQotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCi1DT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKLUNPTkZJR19DQ19BTElHTl9MT09QUz0wCi1DT05GSUdfQ0NfQUxJR05fSlVNUFM9MAotQ09ORklHX1NMVUI9eQotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15Ci1DT05GSUdfTU9EVkVSU0lPTlM9eQotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLUNPTkZJR19TVE9QX01BQ0hJTkU9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCi0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgotCi0jCi0jIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwotIwotQ09ORklHX0lBNjQ9eQotQ09ORklHXzY0QklUPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1NXSU9UTEI9eQotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19USU1FPXkKLUNPTkZJR19FRkk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfRE1BX0lTX0RNQTMyPXkKLUNPTkZJR19JQTY0X0dFTkVSSUM9eQotIyBDT05GSUdfSUE2NF9ESUcgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDEgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDFfU1dJT1RMQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1NHSV9TTjIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9TSU0gaXMgbm90IHNldAotIyBDT05GSUdfSVRBTklVTSBpcyBub3Qgc2V0Ci1DT05GSUdfTUNLSU5MRVk9eQotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9QQUdFX1NJWkVfMTZLQj15Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKLUNPTkZJR19QR1RBQkxFXzM9eQotIyBDT05GSUdfUEdUQUJMRV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFpfMjUwPXkKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotQ09ORklHX0haPTI1MAotQ09ORklHX0lBNjRfTDFfQ0FDSEVfU0hJRlQ9NwotQ09ORklHX0lBNjRfQ1lDTE9ORT15Ci1DT05GSUdfSU9TQVBJQz15Ci0jIENPTkZJR19JQTY0X1NHSV9TTl9YUCBpcyBub3Qgc2V0Ci1DT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xNwotQ09ORklHX1NNUD15Ci1DT05GSUdfTlJfQ1BVUz01MTIKLUNPTkZJR19JQTY0X05SX05PREVTPTI1NgotQ09ORklHX0hPVFBMVUdfQ1BVPXkKLSMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLSMgQ09ORklHX0ZMQVRNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQotQ09ORklHX1NQQVJTRU1FTT15Ci1DT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15Ci1DT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLUNPTkZJR19TUEFSU0VNRU1fRVhUUkVNRT15Ci0jIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotQ09ORklHX01JR1JBVElPTj15Ci1DT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9ESVNDT05USUdNRU1fREVGQVVMVD15Ci1DT05GSUdfTlVNQT15Ci1DT05GSUdfSEFWRV9BUkNIX0VBUkxZX1BGTl9UT19OSUQ9eQotQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZPXkKLUNPTkZJR19QRVJGTU9OPXkKLUNPTkZJR19JQTY0X1BBTElORk89eQotQ09ORklHX1NHSV9TTj15Ci0KLSMKLSMgRmlybXdhcmUgRHJpdmVycwotIwotQ09ORklHX0VGSV9WQVJTPXkKLUNPTkZJR19FRklfUENEUD15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX01JU0M9bQotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgYW5kIEFDUEkKLSMKLUNPTkZJR19QTT15Ci1DT05GSUdfUE1fTEVHQUNZPXkKLSMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKLSMKLUNPTkZJR19BQ1BJPXkKIENPTkZJR19BQ1BJX0JVVFRPTj1tCitDT05GSUdfQUNQSV9DT05UQUlORVI9bQogQ09ORklHX0FDUElfRkFOPW0KIENPTkZJR19BQ1BJX1BST0NFU1NPUj1tCi1DT05GSUdfQUNQSV9IT1RQTFVHX0NQVT15Ci1DT05GSUdfQUNQSV9USEVSTUFMPW0KLUNPTkZJR19BQ1BJX05VTUE9eQotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAotIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9FQz15Ci1DT05GSUdfQUNQSV9QT1dFUj15Ci1DT05GSUdfQUNQSV9TWVNURU09eQotQ09ORklHX0FDUElfQ09OVEFJTkVSPW0KLQotIwotIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLSMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEpCi0jCi1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfRE9NQUlOUz15Ci0jIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKLUNPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQotIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi1DT05GSUdfSE9UUExVR19QQ0k9bQotIyBDT05GSUdfSE9UUExVR19QQ0lfRkFLRSBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVR19QQ0lfQUNQST1tCi0jIENPTkZJR19IT1RQTFVHX1BDSV9BQ1BJX0lCTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHX1BDSV9DUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX1NIUEMgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0lfU0dJIGlzIG5vdCBzZXQKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAotQ09ORklHX1BBQ0tFVD15Ci0jIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJQRD15Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLUNPTkZJR19GV19MT0FERVI9bQotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCi0jCi0jIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLUNPTkZJR19QTlA9eQotIyBDT05GSUdfUE5QX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBQcm90b2NvbHMKLSMKLUNPTkZJR19QTlBBQ1BJPXkKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9bQotQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCi1DT05GSUdfQkxLX0RFVl9OQkQ9bQotIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLUNPTkZJR19JREU9eQotQ09ORklHX0lERV9NQVhfSFdJRlM9NAotQ09ORklHX0JMS19ERVZfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRElTSz15Ci0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFQ0Q9eQotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERUZMT1BQWT15Ci1DT05GSUdfQkxLX0RFVl9JREVTQ1NJPW0KLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9eQotIyBDT05GSUdfQkxLX0RFVl9JREVQTlAgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLSMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKLSMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKLSMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9DTUQ2NFg9eQotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUElJWD15Ci0jIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVcgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TR0lJT0M0PXkKLSMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BPXkKLSMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAotQ09ORklHX0lERURNQV9BVVRPPXkKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9eQotQ09ORklHX1NDU0lfUFJPQ19GUz15Ci0KLSMKLSMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKLSMKLUNPTkZJR19CTEtfREVWX1NEPXkKLUNPTkZJR19DSFJfREVWX1NUPW0KLSMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TUj1tCi0jIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUiBpcyBub3Qgc2V0Ci1DT05GSUdfQ0hSX0RFVl9TRz1tCi0jIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCi0jIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKLSMKLUNPTkZJR19TQ1NJX1NQSV9BVFRSUz15Ci1DT05GSUdfU0NTSV9GQ19BVFRSUz15Ci0jIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCi0jCi0jIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TQVRBPXkKLSMgQ09ORklHX1NDU0lfU0FUQV9BSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9TVlcgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BVEFfUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfTVYgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX05WIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUERDX0FETUEgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1FTVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9TWDQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NJTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfU0lMMjQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfVUxJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9WSUEgaXMgbm90IHNldAotQ09ORklHX1NDU0lfU0FUQV9WSVRFU1NFPXkKLSMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfMj15Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERT0xCi1DT05GSUdfU0NTSV9TWU01M0M4WFhfREVGQVVMVF9UQUdTPTE2Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKLSMgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMT0dJQ18xMjgwPXkKLSMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotQ09ORklHX01EPXkKLUNPTkZJR19CTEtfREVWX01EPW0KLUNPTkZJR19NRF9MSU5FQVI9bQotQ09ORklHX01EX1JBSUQwPW0KLUNPTkZJR19NRF9SQUlEMT1tCi0jIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAotQ09ORklHX01EX1JBSUQ1PW0KLUNPTkZJR19NRF9SQUlENj1tCi1DT05GSUdfTURfTVVMVElQQVRIPW0KLSMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9ETT1tCi1DT05GSUdfRE1fQ1JZUFQ9bQotQ09ORklHX0RNX1NOQVBTSE9UPW0KLUNPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1pFUk89bQotQ09ORklHX0RNX01VTFRJUEFUSD1tCi0jIENPTkZJR19ETV9NVUxUSVBBVEhfRU1DIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfRlVTSU9OPXkKLUNPTkZJR19GVVNJT05fU1BJPXkKLUNPTkZJR19GVVNJT05fRkM9bQotIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlVTSU9OX01BWF9TR0U9MTI4Ci0jIENPTkZJR19GVVNJT05fQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMk8gaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19EVU1NWT1tCi0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1NCMTAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUEhZIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPW0KLSMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotCi0jCi0jIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUX1RVTElQPXkKLSMgQ09ORklHX0RFMjEwNFggaXMgbm90IHNldAotQ09ORklHX1RVTElQPW0KLSMgQ09ORklHX1RVTElQX01XSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVUxJUF9NTUlPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTElQX05BUEkgaXMgbm90IHNldAotIyBDT05GSUdfREU0WDUgaXMgbm90IHNldAotIyBDT05GSUdfV0lOQk9ORF84NDAgaXMgbm90IHNldAotIyBDT05GSUdfRE05MTAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMSTUyNlggaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0Ci1DT05GSUdfRUVQUk8xMDA9bQotQ09ORklHX0UxMDA9bQotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAotIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotQ09ORklHX0UxMDAwPXkKLSMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19USUdPTjM9eQotIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lYR0IgaXMgbm90IHNldAotIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRDT05TT0xFPXkKLUNPTkZJR19ORVRQT0xMPXkKLSMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQotQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFPXkKLUNPTkZJR19NT1VTRV9QUzI9eQotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLUNPTkZJR19HQU1FUE9SVD1tCi0jIENPTkZJR19HQU1FUE9SVF9OUzU1OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9MNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9FTVUxMEsxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUX0ZNODAxIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQotIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPQ0tFVFBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1lDTEFERVMgaXMgbm90IHNldAotIyBDT05GSUdfRElHSUVQQ0EgaXMgbm90IHNldAotIyBDT05GSUdfTU9YQV9JTlRFTExJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1hBX1NNQVJUSU8gaXMgbm90IHNldAotIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldAotIyBDT05GSUdfTl9IRExDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVEFMRFJWIGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfU05TQz15Ci1DT05GSUdfU0dJX1RJT0NYPXkKLUNPTkZJR19TR0lfTUJDUz1tCi0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQUNQST15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NgotQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAotQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKLUNPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQotIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9SU0EgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX1NHSV9MMV9DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9TR0lfSU9DND15Ci1DT05GSUdfU0VSSUFMX1NHSV9JT0MzPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLUNPTkZJR19FRklfUlRDPXkKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotQ09ORklHX0FHUD1tCi1DT05GSUdfQUdQX0k0NjA9bQogQ09ORklHX0FHUF9IUF9aWDE9bQorQ09ORklHX0FHUF9JNDYwPW0KK0NPTkZJR19BR1A9bQogQ09ORklHX0FHUF9TR0lfVElPQ0E9bQorQ09ORklHX0FSUEQ9eQorQ09ORklHX0FVVE9GUzRfRlM9eQorQ09ORklHX0FVVE9GU19GUz15CitDT05GSUdfQklORk1UX01JU0M9bQorQ09ORklHX0JMS19ERVZfQ01ENjRYPXkKK0NPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQorQ09ORklHX0JMS19ERVZfRE09bQorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVDRD15CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0JMS19ERVZfTE9PUD1tCitDT05GSUdfQkxLX0RFVl9NRD1tCitDT05GSUdfQkxLX0RFVl9OQkQ9bQorQ09ORklHX0JMS19ERVZfUElJWD15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0JMS19ERVZfU0dJSU9DND15CitDT05GSUdfQkxLX0RFVl9TUj1tCitDT05GSUdfQ0hSX0RFVl9TRz1tCitDT05GSUdfQ0hSX0RFVl9TVD1tCitDT05GSUdfQ0lGUz1tCitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKK0NPTkZJR19ETV9DUllQVD1tCitDT05GSUdfRE1fTUlSUk9SPW0KK0NPTkZJR19ETV9NVUxUSVBBVEg9bQorQ09ORklHX0RNX1NOQVBTSE9UPW0KK0NPTkZJR19ETV9aRVJPPW0KIENPTkZJR19EUk09bQotQ09ORklHX0RSTV9UREZYPW0KK0NPTkZJR19EUk1fTUdBPW0KIENPTkZJR19EUk1fUjEyOD1tCiBDT05GSUdfRFJNX1JBREVPTj1tCi1DT05GSUdfRFJNX01HQT1tCiBDT05GSUdfRFJNX1NJUz1tCi0jIENPTkZJR19EUk1fVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTV9TQVZBR0UgaXMgbm90IHNldAotQ09ORklHX1JBV19EUklWRVI9bQotQ09ORklHX01BWF9SQVdfREVWUz0yNTYKLUNPTkZJR19IUEVUPXkKLSMgQ09ORklHX0hQRVRfUlRDX0lSUSBpcyBub3Qgc2V0Ci1DT05GSUdfSFBFVF9NTUFQPXkKLSMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0Ci1DT05GSUdfTU1USU1FUj15Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIwotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfRkIgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotQ09ORklHX1ZHQV9DT05TT0xFPXkKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLQotIwotIyBTb3VuZAotIwotQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKLUNPTkZJR19TTkQ9bQotQ09ORklHX1NORF9USU1FUj1tCi1DT05GSUdfU05EX1BDTT1tCi1DT05GSUdfU05EX0hXREVQPW0KLUNPTkZJR19TTkRfUkFXTUlEST1tCi1DT05GSUdfU05EX1NFUVVFTkNFUj1tCi1DT05GSUdfU05EX1NFUV9EVU1NWT1tCi1DT05GSUdfU05EX09TU0VNVUw9eQotQ09ORklHX1NORF9NSVhFUl9PU1M9bQotQ09ORklHX1NORF9QQ01fT1NTPW0KLUNPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15Ci0jIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQotQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USz15Ci0jIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIwotQ09ORklHX1NORF9NUFU0MDFfVUFSVD1tCi1DT05GSUdfU05EX09QTDNfTElCPW0KLUNPTkZJR19TTkRfQUM5N19DT0RFQz1tCi1DT05GSUdfU05EX0FDOTdfQlVTPW0KLUNPTkZJR19TTkRfRFVNTVk9bQotQ09ORklHX1NORF9WSVJNSURJPW0KLUNPTkZJR19TTkRfTVRQQVY9bQotQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwPW0KLUNPTkZJR19TTkRfTVBVNDAxPW0KLQotIwotIyBQQ0kgZGV2aWNlcwotIwotIyBDT05GSUdfU05EX0FEMTg4OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DQTAxMDYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0NTNDI4MT1tCi1DT05GSUdfU05EX0NTNDZYWD1tCi1DT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQPXkKLUNPTkZJR19TTkRfRU1VMTBLMT1tCi0jIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfRk04MDE9bQotIyBDT05GSUdfU05EX0ZNODAxX1RFQTU3NVggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEQV9JTlRFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERTUE0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lDRTE3MTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lDRTE3MjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lOVEVMOFgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0tPUkcxMjEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTUlYQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9OTTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUENYSFIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklBODJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklBODJYWF9NT0RFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIGRldmljZXMKLSMKLSMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCi0jIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci1DT05GSUdfVVNCPW0KLSMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucwotIwotQ09ORklHX1VTQl9ERVZJQ0VGUz15Ci0jIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKLSMKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9bQotIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX09IQ0lfSENEPW0KLSMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAotQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQotQ09ORklHX1VTQl9VSENJX0hDRD1tCi0jIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKLSMKLSMgQ09ORklHX09CU09MRVRFX09TU19VU0JfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKLSMKLQotIwotIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCi0jCi1DT05GSUdfVVNCX1NUT1JBR0U9bQotIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIElucHV0IERldmljZXMKLSMKLUNPTkZJR19VU0JfSElEPW0KLUNPTkZJR19VU0JfSElESU5QVVQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW1hZ2luZyBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgVmlkZW80TGludXggc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBNdWx0aW1lZGlhIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKLSMKLSMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX01PTj15Ci0KLSMKLSMgVVNCIHBvcnQgZHJpdmVycwotIwotCi0jCi0jIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAotIwotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLUNPTkZJR19JTkZJTklCQU5EPW0KLSMgQ09ORklHX0lORklOSUJBTkRfVVNFUl9NQUQgaXMgbm90IHNldAotIyBDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5GSU5JQkFORF9NVEhDQT1tCi0jIENPTkZJR19JTkZJTklCQU5EX01USENBX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19JTkZJTklCQU5EX0lQT0lCPW0KLSMgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfSU5GSU5JQkFORF9TUlAgaXMgbm90IHNldAotCi0jCi0jIFNOIERldmljZXMKLSMKLUNPTkZJR19TR0lfSU9DND15Ci1DT05GSUdfU0dJX0lPQzM9eQotCi0jCi0jIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKQotIwotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0RSTV9UREZYPW0KK0NPTkZJR19EVU1NWT1tCitDT05GSUdfRTEwMDA9eQorQ09ORklHX0UxMDA9bQorQ09ORklHX0VGSV9QQVJUSVRJT049eQorQ09ORklHX0VGSV9SVEM9eQorQ09ORklHX0VGSV9WQVJTPXkKK0NPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTPXkKIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CiBDT05GSUdfRVhUM19GU19TRUNVUklUWT15Ci1DT05GSUdfSkJEPXkKLSMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci1DT05GSUdfUkVJU0VSRlNfRlM9eQotIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKLUNPTkZJR19SRUlTRVJGU19GU19YQVRUUj15Ci1DT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWT15Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfWEZTX0ZTPXkKLUNPTkZJR19YRlNfRVhQT1JUPXkKLSMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAotIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0ZVU0lPTl9GQz1tCitDT05GSUdfRlVTSU9OX1NQST15CitDT05GSUdfRlVTSU9OPXkKK0NPTkZJR19HQU1FUE9SVD1tCitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX0hPVFBMVUdfUENJX0FDUEk9bQorQ09ORklHX0hPVFBMVUdfUENJPW0KK0NPTkZJR19IUEVUPXkKK0NPTkZJR19IVUdFVExCRlM9eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKK0NPTkZJR19JQTY0X0NZQ0xPTkU9eQorQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZPXkKK0NPTkZJR19JQTY0X1BBTElORk89eQorQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19JREU9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JTkZJTklCQU5EX0lQT0lCPW0KK0NPTkZJR19JTkZJTklCQU5EPW0KK0NPTkZJR19JTkZJTklCQU5EX01USENBPW0KIENPTkZJR19JTk9USUZZPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLUNPTkZJR19BVVRPRlNfRlM9eQotQ09ORklHX0FVVE9GUzRfRlM9eQotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIworQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19JU085NjYwX0ZTPW0KIENPTkZJR19KT0xJRVQ9eQotIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VERl9OTFM9eQotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNwotQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgotQ09ORklHX05URlNfRlM9bQotIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX1JXIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19TWVNGUz15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX0hVR0VUTEJGUz15Ci1DT05GSUdfSFVHRVRMQl9QQUdFPXkKLUNPTkZJR19SQU1GUz15Ci0jIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIworQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfTE9HX0JVRl9TSElGVD0yMAorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19NQ0tJTkxFWT15CitDT05GSUdfTURfTElORUFSPW0KK0NPTkZJR19NRF9NVUxUSVBBVEg9bQorQ09ORklHX01EX1JBSUQwPW0KK0NPTkZJR19NRF9SQUlEMT1tCitDT05GSUdfTUQ9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19ORVRDT05TT0xFPXkKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX05FVF9QQ0k9eQorQ09ORklHX05FVF9UVUxJUD15CitDT05GSUdfTkZTRD1tCitDT05GSUdfTkZTRF9WND15CiBDT05GSUdfTkZTX0ZTPW0KIENPTkZJR19ORlNfVjM9eQotIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ORlNfRElSRUNUSU89eQotQ09ORklHX05GU0Q9bQotQ09ORklHX05GU0RfVjM9eQotIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAotQ09ORklHX05GU0RfVjQ9eQotQ09ORklHX05GU0RfVENQPXkKLUNPTkZJR19MT0NLRD1tCi1DT05GSUdfTE9DS0RfVjQ9eQotQ09ORklHX0VYUE9SVEZTPXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9bQotQ09ORklHX1NVTlJQQ19HU1M9bQotQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT1tCi0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9bQotQ09ORklHX1NNQl9OTFNfREVGQVVMVD15Ci1DT05GSUdfU01CX05MU19SRU1PVEU9ImNwNDM3IgotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR185UF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfU0dJX1BBUlRJVElPTj15Ci0jIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19FRklfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQpAQCAtMTI3NywxNSArMTIwLDE0IEBACiBDT05GSUdfTkxTX0NPREVQQUdFXzg2NT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2Nj1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2OT1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg3ND1tCi1DT05GSUdfTkxTX0lTTzg4NTlfOD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzEyNTA9bQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUxPW0KLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiBDT05GSUdfTkxTX0lTTzg4NTlfMj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMz1tCkBAIC0xMjkzLDEwMCArMTM1LDc3IEBACiBDT05GSUdfTkxTX0lTTzg4NTlfNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOD1tCiBDT05GSUdfTkxTX0lTTzg4NTlfOT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTM9bQotQ09ORklHX05MU19JU084ODU5XzE0PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0tPSThfUj1tCiBDT05GSUdfTkxTX0tPSThfVT1tCiBDT05GSUdfTkxTX1VURjg9bQotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci0KLSMKLSMgSFAgU2ltdWxhdG9yIGRyaXZlcnMKLSMKLSMgQ09ORklHX0hQX1NJTUVUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUF9TSU1TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfSFBfU0lNU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKLSMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX01BR0lDX1NZU1JRPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MjAKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX01VVEVYRVM9eQotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLUNPTkZJR19GT1JDRURfSU5MSU5JTkc9eQotIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9HUkFOVUxFXzE2TUI9eQotIyBDT05GSUdfSUE2NF9HUkFOVUxFXzY0TUIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9QUklOVF9IQVpBUkRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJU0FCTEVfVkhQVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RFQlVHX0NNUFhDSEcgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9ERUJVR19JUlEgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUENfQ09NUEFUPXkKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLUNPTkZJR19DUllQVE89eQotIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX01ENT15Ci0jIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19ERVM9bQotIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKK0NPTkZJR19OUl9DUFVTPTUxMgorQ09ORklHX05URlNfRlM9bQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKK0NPTkZJR19QRVJGTU9OPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1JBV19EUklWRVI9bQorQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFk9eQorQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSPXkKK0NPTkZJR19SRUlTRVJGU19GUz15CitDT05GSUdfU0NTSV9GQ19BVFRSUz15CitDT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15CitDT05GSUdfU0NTSV9TWU01M0M4WFhfMj15CitDT05GSUdfU0NTST15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTYKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQorQ09ORklHX1NFUklBTF9TR0lfSU9DMz15CitDT05GSUdfU0VSSUFMX1NHSV9JT0M0PXkKK0NPTkZJR19TRVJJQUxfU0dJX0wxX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0dJX0lPQzM9eQorQ09ORklHX1NHSV9JT0M0PXkKK0NPTkZJR19TR0lfTUJDUz1tCitDT05GSUdfU0dJX1BBUlRJVElPTj15CitDT05GSUdfU0dJX1NOU0M9eQorQ09ORklHX1NHSV9USU9DWD15CitDT05GSUdfU01CX0ZTPW0KK0NPTkZJR19TTUJfTkxTX0RFRkFVTFQ9eQorQ09ORklHX1NNUD15CitDT05GSUdfU05EX0NTNDI4MT1tCitDT05GSUdfU05EX0NTNDZYWD1tCitDT05GSUdfU05EX0RVTU1ZPW0KK0NPTkZJR19TTkRfRU1VMTBLMT1tCitDT05GSUdfU05EX0ZNODAxPW0KK0NPTkZJR19TTkQ9bQorQ09ORklHX1NORF9NSVhFUl9PU1M9bQorQ09ORklHX1NORF9NUFU0MDE9bQorQ09ORklHX1NORF9NVFBBVj1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorQ09ORklHX1NORF9TRVFfRFVNTVk9bQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKK0NPTkZJR19TTkRfU0VSSUFMX1UxNjU1MD1tCitDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLPXkKK0NPTkZJR19TTkRfVklSTUlEST1tCitDT05GSUdfU09VTkQ9bQorQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19USUdPTjM9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19UVUxJUD1tCitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VTklYPXkKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9FSENJX0hDRD1tCitDT05GSUdfVVNCPW0KK0NPTkZJR19VU0JfTU9OPW0KK0NPTkZJR19VU0JfT0hDSV9IQ0Q9bQorQ09ORklHX1VTQl9TVE9SQUdFPW0KK0NPTkZJR19VU0JfVUhDSV9IQ0Q9bQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX1hGU19GUz15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9zaW1fZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3Mvc2ltX2RlZmNvbmZpZwppbmRleCAyMWEyM2NkLi41ODUyMjJiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9zaW1fZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3NpbV9kZWZjb25maWcKQEAgLTEsNzIzICsxLDU3IEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTYtcmM1Ci0jIE1vbiBGZWIgMjcgMTY6MTM6NDEgMjAwNgotIwotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DS19LRVJORUw9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci0jIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLUNPTkZJR19TTFVCPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLUNPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLUNPTkZJR19NT0RWRVJTSU9OUz15Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotQ09ORklHX1NUT1BfTUFDSElORT15Ci0KLSMKLSMgQmxvY2sgbGF5ZXIKLSMKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci1DT05GSUdfREVGQVVMVF9BUz15Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCi0KLSMKLSMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCi0jCi1DT05GSUdfSUE2ND15Ci1DT05GSUdfNjRCSVQ9eQotQ09ORklHX01NVT15Ci1DT05GSUdfU1dJT1RMQj15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX0VGST15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15Ci1DT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19ETUFfSVNfRE1BMzI9eQotIyBDT05GSUdfSUE2NF9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfRElHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfSFBfWlgxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfSFBfWlgxX1NXSU9UTEIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9TR0lfU04yIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X0hQX1NJTT15Ci0jIENPTkZJR19JVEFOSVVNIGlzIG5vdCBzZXQKLUNPTkZJR19NQ0tJTkxFWT15Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV80S0IgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAotQ09ORklHX0lBNjRfUEFHRV9TSVpFXzY0S0I9eQotQ09ORklHX1BHVEFCTEVfMz15Ci0jIENPTkZJR19QR1RBQkxFXzQgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19IWl8yNTA9eQotIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFo9MjUwCi1DT05GSUdfSUE2NF9MMV9DQUNIRV9TSElGVD03Ci0jIENPTkZJR19JQTY0X0NZQ0xPTkUgaXMgbm90IHNldAotQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTcKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9NjQKLSMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfRkxBVE1FTV9NQU5VQUw9eQotIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19GTEFUTUVNPXkKLUNPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLUNPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00Ci1DT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15Ci0jIENPTkZJR19WSVJUVUFMX01FTV9NQVAgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlkgaXMgbm90IHNldAotIyBDT05GSUdfUEVSRk1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9QQUxJTkZPPW0KLQotIwotIyBGaXJtd2FyZSBEcml2ZXJzCi0jCi1DT05GSUdfRUZJX1ZBUlM9eQotQ09ORklHX0JJTkZNVF9FTEY9eQogQ09ORklHX0JJTkZNVF9NSVNDPXkKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IGFuZCBBQ1BJCi0jCi0KLSMKLSMgTmV0d29ya2luZwotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSVggaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCi0jCi0jIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTST15Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIwogQ09ORklHX0JMS19ERVZfU0Q9eQotIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLUNPTkZJR19TQ1NJX01VTFRJX0xVTj15Ci1DT05GSUdfU0NTSV9DT05TVEFOVFM9eQotQ09ORklHX1NDU0lfTE9HR0lORz15Ci0KLSMKLSMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcwotIwotQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKLSMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwotIwotIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX05FVERFVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLSMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCi0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIworIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfRUZJX1BBUlRJVElPTj15CitDT05GSUdfRUZJX1JUQz15CitDT05GSUdfRUZJX1ZBUlM9eQorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19IUF9TSU1FVEg9eQorQ09ORklHX0hQX1NJTVNDU0k9eQorQ09ORklHX0hQX1NJTVNFUklBTF9DT05TT0xFPXkKK0NPTkZJR19IUF9TSU1TRVJJQUw9eQorQ09ORklHX0hVR0VUTEJGUz15CitDT05GSUdfSUE2NF9IUF9TSU09eQorQ09ORklHX0lBNjRfUEFHRV9TSVpFXzY0S0I9eQorQ09ORklHX0lBNjRfUEFMSU5GTz1tCitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1NFUlBPUlQ9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci1DT05GSUdfRUZJX1JUQz15Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0FHUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIwotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfRkIgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5maW5pQmFuZCBzdXBwb3J0Ci0jCi0KLSMKLSMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpCi0jCi0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLSMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0lOT1RJRlk9eQotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotQ09ORklHX0hVR0VUTEJGUz15Ci1DT05GSUdfSFVHRVRMQl9QQUdFPXkKLUNPTkZJR19SQU1GUz15Ci0jIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ORlNfRElSRUNUSU89eQotQ09ORklHX05GU0Q9eQotQ09ORklHX05GU0RfVjM9eQotIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19FWFBPUlRGUz15Ci1DT05GSUdfTkZTX0NPTU1PTj15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR185UF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX0VGSV9QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci0KLSMKLSMgSFAgU2ltdWxhdG9yIGRyaXZlcnMKLSMKLUNPTkZJR19IUF9TSU1FVEg9eQotQ09ORklHX0hQX1NJTVNFUklBTD15Ci1DT05GSUdfSFBfU0lNU0VSSUFMX0NPTlNPTEU9eQotQ09ORklHX0hQX1NJTVNDU0k9eQotCi0jCi0jIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTYKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQotQ09ORklHX0RFQlVHX01VVEVYRVM9eQotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0Ci1DT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKLSMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9HUkFOVUxFXzE2TUIgaXMgbm90IHNldAotQ09ORklHX0lBNjRfR1JBTlVMRV82NE1CPXkKLSMgQ09ORklHX0lBNjRfUFJJTlRfSEFaQVJEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ESVNBQkxFX1ZIUFQgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9ERUJVR19DTVBYQ0hHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfREVCVUdfSVJRIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNWSVBDX0NPTVBBVD15Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCitDT05GSUdfTUNLSU5MRVk9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19ORVQ9eQorQ09ORklHX05GU0RfVjM9eQorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTlJfQ1BVUz02NAorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TQ1NJX0NPTlNUQU5UUz15CitDT05GSUdfU0NTSV9MT0dHSU5HPXkKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CitDT05GSUdfU0NTSV9TUElfQVRUUlM9eQorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorQ09ORklHX1NNUD15CisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCBjNWE1ZWE5Li40OTg2MThlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC0xLDExMzQgKzEsMTEzIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjIKLSMgVGh1IEp1bCAxOSAxMzo1NDo0NyAyMDA3Ci0jCi1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DS19LRVJORUw9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotQ09ORklHX1BPU0lYX01RVUVVRT15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0yMAotIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfS0FMTFNZTVM9eQotQ09ORklHX0tBTExTWU1TX0FMTD15Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHPXkKLUNPTkZJR19QUklOVEs9eQotQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0FOT05fSU5PREVTPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfU0xVQj15Ci0jIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAotQ09ORklHX1JUX01VVEVYRVM9eQotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19NT0RWRVJTSU9OUz15Ci1DT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKLUNPTkZJR19LTU9EPXkKLUNPTkZJR19TVE9QX01BQ0hJTkU9eQotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLUNPTkZJR19ERUZBVUxUX0FTPXkKLSMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKLQotIwotIyBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMKLSMKLUNPTkZJR19JQTY0PXkKLUNPTkZJR182NEJJVD15Ci1DT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1FVSUNLTElTVD15Ci1DT05GSUdfTU1VPXkKLUNPTkZJR19TV0lPVExCPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX0RNST15Ci1DT05GSUdfRUZJPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLUNPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0FVRElUX0FSQ0g9eQotIyBDT05GSUdfSUE2NF9HRU5FUklDIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X0RJRz15Ci0jIENPTkZJR19JQTY0X0hQX1pYMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0hQX1pYMV9TV0lPVExCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfU0dJX1NOMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0hQX1NJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JVEFOSVVNIGlzIG5vdCBzZXQKLUNPTkZJR19NQ0tJTkxFWT15Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV80S0IgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAotQ09ORklHX0lBNjRfUEFHRV9TSVpFXzY0S0I9eQotQ09ORklHX1BHVEFCTEVfMz15Ci0jIENPTkZJR19QR1RBQkxFXzQgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19IWl8yNTA9eQotIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotQ09ORklHX0haPTI1MAotQ09ORklHX0lBNjRfTDFfQ0FDSEVfU0hJRlQ9NwotQ09ORklHX0lBNjRfQ1lDTE9ORT15Ci1DT05GSUdfSU9TQVBJQz15Ci1DT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xNwotQ09ORklHX1NNUD15Ci1DT05GSUdfTlJfQ1BVUz0xNgotQ09ORklHX0hPVFBMVUdfQ1BVPXkKLUNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15Ci0jIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAotQ09ORklHX1BFUk1JVF9CU1BfUkVNT1ZFPXkKLUNPTkZJR19GT1JDRV9DUEVJX1JFVEFSR0VUPXkKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKLSMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkxBVE1FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotQ09ORklHX1JFU09VUkNFU182NEJJVD15Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi1DT05GSUdfQk9VTkNFPXkKLUNPTkZJR19OUl9RVUlDSz0xCi1DT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKLUNPTkZJR19WSVJUVUFMX01FTV9NQVA9eQotQ09ORklHX0hPTEVTX0lOX1pPTkU9eQotQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZPXkKLUNPTkZJR19QRVJGTU9OPXkKLUNPTkZJR19JQTY0X1BBTElORk89eQotIyBDT05GSUdfSUE2NF9NQ19FUlJfSU5KRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfRVNJIGlzIG5vdCBzZXQKLUNPTkZJR19LRVhFQz15Ci0jIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKLQotIwotIyBGaXJtd2FyZSBEcml2ZXJzCi0jCi1DT05GSUdfRUZJX1ZBUlM9eQotQ09ORklHX0VGSV9QQ0RQPXkKLUNPTkZJR19ETUlJRD15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX01JU0M9bQotCi0jIENPTkZJR19ETUFSIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IGFuZCBBQ1BJCi0jCi1DT05GSUdfUE09eQotQ09ORklHX1BNX0xFR0FDWT15Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0Ci0jCi1DT05GSUdfQUNQST15Ci1DT05GSUdfQUNQSV9QUk9DRlM9eQogQ09ORklHX0FDUElfQlVUVE9OPW0KLUNPTkZJR19BQ1BJX0ZBTj1tCi0jIENPTkZJR19BQ1BJX0RPQ0sgaXMgbm90IHNldAotQ09ORklHX0FDUElfUFJPQ0VTU09SPW0KLUNPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVPXkKLUNPTkZJR19BQ1BJX1RIRVJNQUw9bQotQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAotIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9FQz15Ci1DT05GSUdfQUNQSV9QT1dFUj15Ci1DT05GSUdfQUNQSV9TWVNURU09eQogQ09ORklHX0FDUElfQ09OVEFJTkVSPW0KLQotIwotIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLSMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEpCi0jCi1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfRE9NQUlOUz15Ci1DT05GSUdfUENJX1NZU0NBTEw9eQotIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJPXkKLSMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAotIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHX1BDST1tCi0jIENPTkZJR19IT1RQTFVHX1BDSV9GQUtFIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHX1BDSV9BQ1BJPW0KLSMgQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0kgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0lfU0hQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAotIwotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotQ09ORklHX0FSUEQ9eQotQ09ORklHX1NZTl9DT09LSUVTPXkKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQotQ09ORklHX0lORVRfRElBRz15Ci1DT05GSUdfSU5FVF9UQ1BfRElBRz15Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKLSMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPW0KLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19QTlA9eQotIyBDT05GSUdfUE5QX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBQcm90b2NvbHMKLSMKLUNPTkZJR19QTlBBQ1BJPXkKLUNPTkZJR19CTEtfREVWPXkKLSMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD1tCi1DT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KLUNPTkZJR19CTEtfREVWX05CRD1tCi0jIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotQ09ORklHX01JU0NfREVWSUNFUz15Ci0jIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotQ09ORklHX0lERT15Ci1DT05GSUdfSURFX01BWF9IV0lGUz00Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVDRD15Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRkxPUFBZPXkKLUNPTkZJR19CTEtfREVWX0lERVNDU0k9bQotIyBDT05GSUdfQkxLX0RFVl9JREVBQ1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLUNPTkZJR19JREVfUFJPQ19GUz15Ci0KLSMKLSMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwotIwotIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVQTlAgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLSMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAotQ09ORklHX0lERVBDSV9QQ0lCVVNfT1JERVI9eQotIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKLSMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfQ01ENjRYPXkKLSMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSk1JQ1JPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9QSUlYPXkKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVEM4NkMwMDEgaXMgbm90IHNldAotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJPXkKLUNPTkZJR19TQ1NJX0RNQT15Ci0jIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9ORVRMSU5LPXkKLUNPTkZJR19TQ1NJX1BST0NfRlM9eQotCi0jCi0jIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCi0jCi1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TVD1tCi0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfU1I9bQotIyBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1IgaXMgbm90IHNldAotQ09ORklHX0NIUl9ERVZfU0c9bQotIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAotCi0jCi0jIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwotIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9XQUlUX1NDQU49bQotCi0jCi0jIFNDU0kgVHJhbnNwb3J0cwotIwotQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKLUNPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKLSMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCi0jCi0jIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfMj15Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERT0xCi1DT05GSUdfU0NTSV9TWU01M0M4WFhfREVGQVVMVF9UQUdTPTE2Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKLUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9NTUlPPXkKLUNPTkZJR19TQ1NJX1FMT0dJQ18xMjgwPXkKLSMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfTUQ9eQotQ09ORklHX0JMS19ERVZfTUQ9bQotQ09ORklHX01EX0xJTkVBUj1tCi1DT05GSUdfTURfUkFJRDA9bQotQ09ORklHX01EX1JBSUQxPW0KLSMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlENDU2IGlzIG5vdCBzZXQKLUNPTkZJR19NRF9NVUxUSVBBVEg9bQotIyBDT05GSUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0RNPW0KLSMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ETV9DUllQVD1tCi1DT05GSUdfRE1fU05BUFNIT1Q9bQotQ09ORklHX0RNX01JUlJPUj1tCi1DT05GSUdfRE1fWkVSTz1tCi0jIENPTkZJR19ETV9NVUxUSVBBVEggaXMgbm90IHNldAotIyBDT05GSUdfRE1fREVMQVkgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19GVVNJT049eQotQ09ORklHX0ZVU0lPTl9TUEk9eQotQ09ORklHX0ZVU0lPTl9GQz15Ci0jIENPTkZJR19GVVNJT05fU0FTIGlzIG5vdCBzZXQKLUNPTkZJR19GVVNJT05fTUFYX1NHRT0xMjgKLUNPTkZJR19GVVNJT05fQ1RMPXkKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMk8gaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWT1tCi0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0IxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPW0KLSMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotQ09ORklHX05FVF9UVUxJUD15Ci0jIENPTkZJR19ERTIxMDRYIGlzIG5vdCBzZXQKLUNPTkZJR19UVUxJUD1tCi0jIENPTkZJR19UVUxJUF9NV0kgaXMgbm90IHNldAotIyBDT05GSUdfVFVMSVBfTU1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVUxJUF9OQVBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFNFg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJTkJPTkRfODQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNOTEwMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTEk1MjZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUENJPXkKLSMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAotIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAotIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RHUlMgaXMgbm90IHNldAotQ09ORklHX0VFUFJPMTAwPW0KLUNPTkZJR19FMTAwPW0KLSMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQzkyMDMxIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZfMTAwMD15Ci0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci1DT05GSUdfRTEwMDA9eQotIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLWTIgaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19USUdPTjM9eQotIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTDEgaXMgbm90IHNldAotQ09ORklHX05FVERFVl8xMDAwMD15Ci0jIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKLSMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKLSMKLSMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVF9NSUkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRDT05TT0xFPXkKLUNPTkZJR19ORVRQT0xMPXkKLSMgQ09ORklHX05FVFBPTExfVFJBUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUj15Ci0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLUNPTkZJR19NT1VTRV9QUzJfQUxQUz15Ci1DT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15Ci1DT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUz15Ci1DT05GSUdfTU9VU0VfUFMyX0xJRkVCT09LPXkKLUNPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15Ci0jIENPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX0FQUExFVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLUNPTkZJR19HQU1FUE9SVD1tCi0jIENPTkZJR19HQU1FUE9SVF9OUzU1OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9MNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9FTVUxMEsxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUX0ZNODAxIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKLSMgQ09ORklHX0NPTVBVVE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST0NLRVRQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NZQ0xBREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAotIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfU01BUlRJT19ORVcgaXMgbm90IHNldAotIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldAotIyBDT05GSUdfTl9IRExDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SSU8gaXMgbm90IHNldAotIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKLUNPTkZJR19TRVJJQUxfODI1MF9QTlA9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTYKLUNPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKLUNPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfRUZJX1JUQz15Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci1DT05GSUdfQUdQPW0KK0NPTkZJR19BQ1BJX0ZBTj1tCitDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQorQ09ORklHX0FDUElfUFJPQ0ZTPXkKIENPTkZJR19BR1BfSTQ2MD1tCitDT05GSUdfQUdQPW0KK0NPTkZJR19BUlBEPXkKK0NPTkZJR19BVVRPRlM0X0ZTPXkKK0NPTkZJR19BVVRPRlNfRlM9eQorQ09ORklHX0JJTkZNVF9NSVNDPW0KKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0NNRDY0WD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KK0NPTkZJR19CTEtfREVWX0RNPW0KK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorQ09ORklHX0JMS19ERVZfTUQ9bQorQ09ORklHX0JMS19ERVZfTkJEPW0KK0NPTkZJR19CTEtfREVWX1BJSVg9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19CTEtfREVWX1NSPW0KK0NPTkZJR19DSFJfREVWX1NHPW0KK0NPTkZJR19DSFJfREVWX1NUPW0KK0NPTkZJR19DSUZTPW0KK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fUENCQz1tCitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKK0NPTkZJR19ETV9DUllQVD1tCitDT05GSUdfRE1fTUlSUk9SPW0KK0NPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRFJNPW0KLUNPTkZJR19EUk1fVERGWD1tCitDT05GSUdfRFJNX01HQT1tCiBDT05GSUdfRFJNX1IxMjg9bQogQ09ORklHX0RSTV9SQURFT049bQotQ09ORklHX0RSTV9NR0E9bQogQ09ORklHX0RSTV9TSVM9bQotIyBDT05GSUdfRFJNX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk1fU0FWQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQVdfRFJJVkVSPW0KLUNPTkZJR19NQVhfUkFXX0RFVlM9MjU2Ci1DT05GSUdfSFBFVD15Ci0jIENPTkZJR19IUEVUX1JUQ19JUlEgaXMgbm90IHNldAotQ09ORklHX0hQRVRfTU1BUD15Ci0jIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUE9SVD15Ci0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfREFCPXkKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLUNPTkZJR19WR0FfQ09OU09MRT15Ci0jIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotQ09ORklHX0hJRF9TVVBQT1JUPXkKLUNPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NVUFBPUlQ9eQotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15Ci1DT05GSUdfVVNCPXkKLSMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucwotIwotQ09ORklHX1VTQl9ERVZJQ0VGUz15Ci1DT05GSUdfVVNCX0RFVklDRV9DTEFTUz15Ci0jIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFUlNJU1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCi0jCi1DT05GSUdfVVNCX0VIQ0lfSENEPW0KLSMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAotQ09ORklHX1VTQl9PSENJX0hDRD1tCi0jIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKLUNPTkZJR19VU0JfVUhDSV9IQ0Q9eQotIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKLSMKLQotIwotIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCi0jCi1DT05GSUdfVVNCX1NUT1JBR0U9bQotIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEltYWdpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHBvcnQgZHJpdmVycwotIwotCi0jCi0jIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZGV2aWNlcwotIwotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotCi0jCi0jIExFRCBkcml2ZXJzCi0jCi0KLSMKLSMgTEVEIFRyaWdnZXJzCi0jCi0jIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKLQotIwotIyBSZWFsIFRpbWUgQ2xvY2sKLSMKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIEVuZ2luZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKLQotIwotIyBETUEgQ2xpZW50cwotIwotCi0jCi0jIERNQSBEZXZpY2VzCi0jCi0KLSMKLSMgVXNlcnNwYWNlIEkvTwotIwotIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01TUEVDIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19EUk1fVERGWD1tCitDT05GSUdfRFVNTVk9bQorQ09ORklHX0UxMDAwPXkKK0NPTkZJR19FMTAwPW0KK0NPTkZJR19FRklfUEFSVElUSU9OPXkKK0NPTkZJR19FRklfUlRDPXkKK0NPTkZJR19FRklfVkFSUz15CitDT05GSUdfRVhQRVJJTUVOVEFMPXkKIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CiBDT05GSUdfRVhUMl9GU19TRUNVUklUWT15Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSkJEPXkKLSMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci1DT05GSUdfUkVJU0VSRlNfRlM9eQotIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKLUNPTkZJR19SRUlTRVJGU19GU19YQVRUUj15Ci1DT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWT15Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfWEZTX0ZTPXkKLSMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRk9SQ0VfQ1BFSV9SRVRBUkdFVD15CitDT05GSUdfRlVTSU9OX0NUTD15CitDT05GSUdfRlVTSU9OX0ZDPXkKK0NPTkZJR19GVVNJT05fU1BJPXkKK0NPTkZJR19GVVNJT049eQorQ09ORklHX0dBTUVQT1JUPW0KK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfSE9UUExVR19QQ0lfQUNQST1tCitDT05GSUdfSE9UUExVR19QQ0k9bQorQ09ORklHX0hQRVQ9eQorQ09ORklHX0hVR0VUTEJGUz15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0lBNjRfQ1lDTE9ORT15CitDT05GSUdfSUE2NF9ESUc9eQorQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CPXkKK0NPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CitDT05GSUdfSUE2NF9QQUdFX1NJWkVfNjRLQj15CitDT05GSUdfSUE2NF9QQUxJTkZPPXkKK0NPTkZJR19JREU9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JTkVUPXkKIENPTkZJR19JTk9USUZZPXkKLUNPTkZJR19JTk9USUZZX1VTRVI9eQotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0FVVE9GU19GUz15Ci1DT05GSUdfQVVUT0ZTNF9GUz15Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX0lTTzk2NjBfRlM9bQogQ09ORklHX0pPTElFVD15Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotQ09ORklHX1VERl9GUz1tCi1DT05GSUdfVURGX05MUz15Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0ZBVF9GUz15Ci0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3Ci1DT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCi1DT05GSUdfTlRGU19GUz1tCi0jIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1BST0NfU1lTQ1RMPXkKLUNPTkZJR19TWVNGUz15Ci1DT05GSUdfVE1QRlM9eQotIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLUNPTkZJR19IVUdFVExCRlM9eQotQ09ORklHX0hVR0VUTEJfUEFHRT15Ci1DT05GSUdfUkFNRlM9eQotIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCitDT05GSUdfS0FMTFNZTVNfQUxMPXkKK0NPTkZJR19LRVhFQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0yMAorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19NQ0tJTkxFWT15CitDT05GSUdfTURfTElORUFSPW0KK0NPTkZJR19NRF9NVUxUSVBBVEg9bQorQ09ORklHX01EX1JBSUQwPW0KK0NPTkZJR19NRF9SQUlEMT1tCitDT05GSUdfTUQ9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX05FVENPTlNPTEU9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1RVTElQPXkKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1Y0PXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU19ESVJFQ1RJTz15Ci1DT05GSUdfTkZTRD1tCi1DT05GSUdfTkZTRF9WMz15Ci0jIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRF9WND15Ci1DT05GSUdfTkZTRF9UQ1A9eQotQ09ORklHX0xPQ0tEPW0KLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9bQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz1tCi1DT05GSUdfU1VOUlBDX0dTUz1tCi0jIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKLUNPTkZJR19SUENTRUNfR1NTX0tSQjU9eQotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci1DT05GSUdfU01CX0ZTPW0KLUNPTkZJR19TTUJfTkxTX0RFRkFVTFQ9eQotQ09ORklHX1NNQl9OTFNfUkVNT1RFPSJjcDQzNyIKLUNPTkZJR19DSUZTPW0KLSMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0jIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX1NHSV9QQVJUSVRJT049eQotIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfRUZJX1BBUlRJVElPTj15Ci0jIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQpAQCAtMTE0NCwxNSArMTIzLDE0IEBACiBDT05GSUdfTkxTX0NPREVQQUdFXzg2NT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2Nj1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2OT1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg3ND1tCi1DT05GSUdfTkxTX0lTTzg4NTlfOD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzEyNTA9bQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUxPW0KLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiBDT05GSUdfTkxTX0lTTzg4NTlfMj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMz1tCkBAIC0xMTYwLDEyMCArMTM4LDUwIEBACiBDT05GSUdfTkxTX0lTTzg4NTlfNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOD1tCiBDT05GSUdfTkxTX0lTTzg4NTlfOT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTM9bQotQ09ORklHX05MU19JU084ODU5XzE0PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0tPSThfUj1tCiBDT05GSUdfTkxTX0tPSThfVT1tCiBDT05GSUdfTkxTX1VURjg9bQotCi0jCi0jIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgotIwotIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQklUUkVWRVJTRT15Ci0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj15Ci0jIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci1DT05GSUdfUExJU1Q9eQotQ09ORklHX0hBU19JT01FTT15Ci1DT05GSUdfSEFTX0lPUE9SVD15Ci1DT05GSUdfSEFTX0RNQT15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci1DT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQotQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlE9eQotQ09ORklHX0lSUV9QRVJfQ1BVPXkKLQotIwotIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQotQ09ORklHX01BR0lDX1NZU1JRPXkKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0Ci1DT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQotQ09ORklHX1NDSEVEX0RFQlVHPXkKLSMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfTVVURVhFUz15Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotQ09ORklHX0ZPUkNFRF9JTkxJTklORz15Ci0jIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9HUkFOVUxFXzE2TUI9eQotIyBDT05GSUdfSUE2NF9HUkFOVUxFXzY0TUIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9QUklOVF9IQVpBUkRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RJU0FCTEVfVkhQVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RFQlVHX0NNUFhDSEcgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9ERUJVR19JUlEgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCi1DT05GSUdfQ1JZUFRPX01BTkFHRVI9bQotIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX01ENT15Ci0jIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fRUNCPW0KLUNPTkZJR19DUllQVE9fQ0JDPW0KLUNPTkZJR19DUllQVE9fUENCQz1tCi0jIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19ERVM9bQotIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0hXPXkKK0NPTkZJR19OUl9DUFVTPTE2CitDT05GSUdfTlRGU19GUz1tCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX1BFUkZNT049eQorQ09ORklHX1BFUk1JVF9CU1BfUkVNT1ZFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1JBV19EUklWRVI9bQorQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFk9eQorQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSPXkKK0NPTkZJR19SRUlTRVJGU19GUz15CitDT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15CitDT05GSUdfU0NTSV9TWU01M0M4WFhfMj15CitDT05GSUdfU0NTST15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTYKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQ9eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0dJX1BBUlRJVElPTj15CitDT05GSUdfU01CX0ZTPW0KK0NPTkZJR19TTUJfTkxTX0RFRkFVTFQ9eQorQ09ORklHX1NNUD15CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1RJR09OMz15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX1RVTElQPW0KK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VOSVg9eQorQ09ORklHX1VTQl9ERVZJQ0VGUz15CitDT05GSUdfVVNCX0VIQ0lfSENEPW0KK0NPTkZJR19VU0JfT0hDSV9IQ0Q9bQorQ09ORklHX1VTQl9TVE9SQUdFPW0KK0NPTkZJR19VU0JfVUhDSV9IQ0Q9eQorQ09ORklHX1VTQj15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfWEZTX0ZTPXkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3hlbl9kb211X2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3hlbl9kb211X2RlZmNvbmZpZwppbmRleCBjNjdlYWZjLi41ZjZkMjg0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy94ZW5fZG9tdV9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MveGVuX2RvbXVfZGVmY29uZmlnCkBAIC0xLDEzNzQgKzEsMTIxIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjktcmMxCi0jIEZyaSBKYW4gMTYgMTE6NDk6NTkgMjAwOQotIwotQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19MT0NLX0tFUk5FTD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0lLQ09ORklHPXkKLUNPTkZJR19JS0NPTkZJR19QUk9DPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTIwCi1DT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSz15Ci0jIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29udHJvbCBHcm91cCBzdXBwb3J0Ci0jCi0jIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKLSMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19OQU1FU1BBQ0VTPXkKLSMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUENfTlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotQ09ORklHX1NZU0NUTD15Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX0tBTExTWU1TPXkKLUNPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0tBTExTWU1TX1NUUklQX0dFTkVSQVRFRD15Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHPXkKLUNPTkZJR19QUklOVEs9eQotQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQotQ09ORklHX0NPTVBBVF9CUks9eQotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0FOT05fSU5PREVTPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19BSU89eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19QQ0lfUVVJUktTPXkKLUNPTkZJR19TTFVCX0RFQlVHPXkKLSMgQ09ORklHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX1NMVUI9eQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotQ09ORklHX0hBVkVfT1BST0ZJTEU9eQotIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9LUFJPQkVTPXkKLUNPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQotQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQotQ09ORklHX0hBVkVfRE1BX0FUVFJTPXkKLUNPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15Ci0jIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCSU5GTz15Ci1DT05GSUdfUlRfTVVURVhFUz15Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19NT0RWRVJTSU9OUz15Ci1DT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKLUNPTkZJR19TVE9QX01BQ0hJTkU9eQotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLUNPTkZJR19ERUZBVUxUX0FTPXkKLSMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci1DT05GSUdfRlJFRVpFUj15Ci0KLSMKLSMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCi0jCi1DT05GSUdfSUE2ND15Ci1DT05GSUdfNjRCSVQ9eQotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19RVUlDS0xJU1Q9eQotQ09ORklHX01NVT15Ci1DT05GSUdfU1dJT1RMQj15Ci1DT05GSUdfSU9NTVVfSEVMUEVSPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfVkFSSUFCTEU9eQotQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfVElNRT15Ci1DT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKLUNPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQT15Ci1DT05GSUdfRE1JPXkKLUNPTkZJR19FRkk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQotQ09ORklHX1NDSEVEX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfQVVESVRfQVJDSD15Ci1DT05GSUdfUEFSQVZJUlRfR1VFU1Q9eQotQ09ORklHX1BBUkFWSVJUPXkKLUNPTkZJR19YRU49eQotQ09ORklHX1hFTl9YRU5DT01NPXkKLUNPTkZJR19OT19JRExFX0haPXkKLSMgQ09ORklHX0lBNjRfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RJR19WVEQgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDEgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9aWDFfU1dJT1RMQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1NHSV9TTjIgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9TR0lfVVYgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9IUF9TSU0gaXMgbm90IHNldAotQ09ORklHX0lBNjRfWEVOX0dVRVNUPXkKLSMgQ09ORklHX0lUQU5JVU0gaXMgbm90IHNldAotQ09ORklHX01DS0lOTEVZPXkKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzRLQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV84S0IgaXMgbm90IHNldAotQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0I9eQotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0Ci1DT05GSUdfUEdUQUJMRV8zPXkKLSMgQ09ORklHX1BHVEFCTEVfNCBpcyBub3Qgc2V0Ci1DT05GSUdfSFo9MjUwCi0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotQ09ORklHX0haXzI1MD15Ci0jIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ0hFRF9IUlRJQ0sgaXMgbm90IHNldAotQ09ORklHX0lBNjRfTDFfQ0FDSEVfU0hJRlQ9NwotQ09ORklHX0lBNjRfQ1lDTE9ORT15Ci1DT05GSUdfSU9TQVBJQz15Ci1DT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xNwotIyBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORyBpcyBub3Qgc2V0Ci1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTE2Ci1DT05GSUdfSE9UUExVR19DUFU9eQotQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKLUNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFPXkKLSMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0Ci1DT05GSUdfUEVSTUlUX0JTUF9SRU1PVkU9eQotQ09ORklHX0ZPUkNFX0NQRUlfUkVUQVJHRVQ9eQotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci0jIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLUNPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEU9eQotQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotQ09ORklHX01JR1JBVElPTj15Ci1DT05GSUdfUEhZU19BRERSX1RfNjRCSVQ9eQotQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0JPVU5DRT15Ci1DT05GSUdfTlJfUVVJQ0s9MQotQ09ORklHX1ZJUlRfVE9fQlVTPXkKLUNPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQotQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKLUNPTkZJR19WSVJUVUFMX01FTV9NQVA9eQotQ09ORklHX0hPTEVTX0lOX1pPTkU9eQotQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZPXkKLUNPTkZJR19QRVJGTU9OPXkKLUNPTkZJR19JQTY0X1BBTElORk89eQotIyBDT05GSUdfSUE2NF9NQ19FUlJfSU5KRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfRVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfSFBfQU1MX05GVyBpcyBub3Qgc2V0Ci1DT05GSUdfS0VYRUM9eQotIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlybXdhcmUgRHJpdmVycwotIwotIyBDT05GSUdfRklSTVdBUkVfTUVNTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19FRklfVkFSUz15Ci1DT05GSUdfRUZJX1BDRFA9eQotQ09ORklHX0RNSUlEPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0Ci1DT05GSUdfQklORk1UX01JU0M9bQotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgYW5kIEFDUEkgb3B0aW9ucwotIwotQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19QTV9TTEVFUD15Ci1DT05GSUdfU1VTUEVORD15Ci1DT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKLUNPTkZJR19BQ1BJPXkKLUNPTkZJR19BQ1BJX1NMRUVQPXkKLUNPTkZJR19BQ1BJX1BST0NGUz15Ci1DT05GSUdfQUNQSV9QUk9DRlNfUE9XRVI9eQotQ09ORklHX0FDUElfU1lTRlNfUE9XRVI9eQotQ09ORklHX0FDUElfUFJPQ19FVkVOVD15CiBDT05GSUdfQUNQSV9CVVRUT049bQotQ09ORklHX0FDUElfRkFOPW0KLSMgQ09ORklHX0FDUElfRE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9QUk9DRVNTT1I9bQotQ09ORklHX0FDUElfSE9UUExVR19DUFU9eQotQ09ORklHX0FDUElfVEhFUk1BTD1tCi0jIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKLSMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfQUNQSV9QQ0lfU0xPVCBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9TWVNURU09eQogQ09ORklHX0FDUElfQ09OVEFJTkVSPW0KLQotIwotIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLSMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEpCi0jCi1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfRE9NQUlOUz15Ci1DT05GSUdfUENJX1NZU0NBTEw9eQotIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJPXkKLSMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAotQ09ORklHX1BDSV9MRUdBQ1k9eQotIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9TVFVCIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHX1BDST1tCi0jIENPTkZJR19IT1RQTFVHX1BDSV9GQUtFIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHX1BDSV9BQ1BJPW0KLSMgQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0kgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0lfU0hQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19ORVRfTlMgaXMgbm90IHNldAotQ09ORklHX0NPTVBBVF9ORVRfREVWX09QUz15Ci1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci0jIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJQRD15Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15Ci0jIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19DVUJJQz15Ci1DT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCi0jIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RDQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRktJTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPXkKLUNPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQotQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCi0jIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVEQgaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfUE5QPXkKLUNPTkZJR19QTlBfREVCVUdfTUVTU0FHRVM9eQotCi0jCi0jIFByb3RvY29scwotIwotQ09ORklHX1BOUEFDUEk9eQotQ09ORklHX0JMS19ERVY9eQotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPW0KLUNPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQotQ09ORklHX0JMS19ERVZfTkJEPW0KLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotQ09ORklHX1hFTl9CTEtERVZfRlJPTlRFTkQ9eQotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlTQ19ERVZJQ0VTPXkKLSMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQ1M5MzJTNDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAotIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0lERT15Ci1DT05GSUdfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCi0jCi1DT05GSUdfSURFX1RJTUlOR1M9eQotQ09ORklHX0lERV9BVEFQST15Ci0jIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKLUNPTkZJR19JREVfR0Q9eQotQ09ORklHX0lERV9HRF9BVEE9eQotIyBDT05GSUdfSURFX0dEX0FUQVBJIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERUNEPXkKLUNPTkZJR19CTEtfREVWX0lERUNEX1ZFUkJPU0VfRVJST1JTPXkKLSMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUFDUEkgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotQ09ORklHX0lERV9QUk9DX0ZTPXkKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi0jIENPTkZJR19JREVfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFUE5QIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURNQV9TRkY9eQotCi0jCi0jIFBDSSBJREUgY2hpcHNldHMgc3VwcG9ydAotIwotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLUNPTkZJR19JREVQQ0lfUENJQlVTX09SREVSPXkKLSMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfR0VORVJJQz15Ci0jIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9DTUQ2NFg9eQotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSk1JQ1JPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9QSUlYPXkKLSMgQ09ORklHX0JMS19ERVZfSVQ4MTcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVEM4NkMwMDEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BPXkKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJPXkKLUNPTkZJR19TQ1NJX0RNQT15Ci0jIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9ORVRMSU5LPXkKLUNPTkZJR19TQ1NJX1BST0NfRlM9eQotCi0jCi0jIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCi0jCi1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TVD1tCi0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfU1I9bQotIyBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1IgaXMgbm90IHNldAotQ09ORklHX0NIUl9ERVZfU0c9bQotIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAotCi0jCi0jIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwotIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9XQUlUX1NDQU49bQotCi0jCi0jIFNDU0kgVHJhbnNwb3J0cwotIwotQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKLUNPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKLSMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0xPV0xFVkVMPXkKLSMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0NYR0IzX0lTQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTVZTQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NZTTUzQzhYWF8yPXkKLUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9ETUFfQUREUkVTU0lOR19NT0RFPTEKLUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9ERUZBVUxUX1RBR1M9MTYKLUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9NQVhfVEFHUz02NAotQ09ORklHX1NDU0lfU1lNNTNDOFhYX01NSU89eQotQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQotIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEEgaXMgbm90IHNldAotQ09ORklHX01EPXkKLUNPTkZJR19CTEtfREVWX01EPW0KLUNPTkZJR19NRF9MSU5FQVI9bQotQ09ORklHX01EX1JBSUQwPW0KLUNPTkZJR19NRF9SQUlEMT1tCi0jIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDQ1NiBpcyBub3Qgc2V0Ci1DT05GSUdfTURfTVVMVElQQVRIPW0KLSMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9ETT1tCi0jIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRE1fQ1JZUFQ9bQotQ09ORklHX0RNX1NOQVBTSE9UPW0KLUNPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1pFUk89bQotIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX1VFVkVOVCBpcyBub3Qgc2V0Ci1DT05GSUdfRlVTSU9OPXkKLUNPTkZJR19GVVNJT05fU1BJPXkKLUNPTkZJR19GVVNJT05fRkM9eQotIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlVTSU9OX01BWF9TR0U9MTI4Ci1DT05GSUdfRlVTSU9OX0NUTD15Ci0jIENPTkZJR19GVVNJT05fTE9HR0lORyBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZwotIwotIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19EVU1NWT1tCi0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TQjEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLUNPTkZJR19QSFlMSUI9eQotCi0jCi0jIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NURTEwWFAgaXMgbm90IHNldAotIyBDT05GSUdfTFNJX0VUMTAxMUNfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPW0KLSMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotQ09ORklHX05FVF9UVUxJUD15Ci0jIENPTkZJR19ERTIxMDRYIGlzIG5vdCBzZXQKLUNPTkZJR19UVUxJUD1tCi0jIENPTkZJR19UVUxJUF9NV0kgaXMgbm90IHNldAotIyBDT05GSUdfVFVMSVBfTU1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVUxJUF9OQVBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFNFg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJTkJPTkRfODQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNOTEwMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTEk1MjZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotQ09ORklHX0UxMDA9bQotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAotIyBDT05GSUdfUjYwNDAgaXMgbm90IHNldAotIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU01TQzk0MjAgaXMgbm90IHNldAotIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwyIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZfMTAwMD15Ci0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci1DT05GSUdfRTEwMDA9eQotIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JR0IgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0Ci1DT05GSUdfVElHT04zPXkKLSMgQ09ORklHX0JOWDIgaXMgbm90IHNldAotIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pNRSBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWXzEwMDAwPXkKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotQ09ORklHX0NIRUxTSU9fVDNfREVQRU5EUz15Ci0jIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKLSMgQ09ORklHX01MWDRfRU4gaXMgbm90IHNldAotIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFSFVUSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTEdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NGQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCi0jIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKLQotIwotIyBFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCi0jCi0KLSMKLSMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKLSMKLSMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU4gaXMgbm90IHNldAotQ09ORklHX1hFTl9ORVRERVZfRlJPTlRFTkQ9eQotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAotQ09ORklHX05FVENPTlNPTEU9eQotIyBDT05GSUdfTkVUQ09OU09MRV9EWU5BTUlDIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRQT0xMPXkKLSMgQ09ORklHX05FVFBPTExfVFJBUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUj15Ci0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLUNPTkZJR19NT1VTRV9QUzJfQUxQUz15Ci1DT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15Ci1DT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUz15Ci1DT05GSUdfTU9VU0VfUFMyX0xJRkVCT09LPXkKLUNPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15Ci0jIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19MSUJQUzI9eQotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLUNPTkZJR19HQU1FUE9SVD1tCi0jIENPTkZJR19HQU1FUE9SVF9OUzU1OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9MNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9FTVUxMEsxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUX0ZNODAxIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotQ09ORklHX0RFVktNRU09eQotQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15Ci0jIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAotIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DWUNMQURFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ESUdJRVBDQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1hBX0lOVEVMTElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfU01BUlRJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0kgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5DTElOS19HVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OX0hETEMgaXMgbm90IHNldAotIyBDT05GSUdfUklTQ09NOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldAotIyBDT05GSUdfU1ggaXMgbm90IHNldAotIyBDT05GSUdfUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQUxEUlYgaXMgbm90IHNldAotIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQotQ09ORklHX1NFUklBTF84MjUwX1BOUD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NgotQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAotQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKLUNPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQotIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9SU0EgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYOThfUFRZUz15Ci0jIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKLUNPTkZJR19IVkNfRFJJVkVSPXkKLUNPTkZJR19IVkNfSVJRPXkKLUNPTkZJR19IVkNfWEVOPXkKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX0VGSV9SVEM9eQotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotQ09ORklHX1JBV19EUklWRVI9bQotQ09ORklHX01BWF9SQVdfREVWUz0yNTYKLUNPTkZJR19IUEVUPXkKLUNPTkZJR19IUEVUX01NQVA9eQotIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotQ09ORklHX0RFVlBPUlQ9eQotQ09ORklHX0kyQz1tCi1DT05GSUdfSTJDX0JPQVJESU5GTz15Ci0jIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKLUNPTkZJR19JMkNfQUxHT0JJVD1tCi0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0KLSMKLSMgUEMgU01CdXMgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKLSMKLSMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0lTQ0ggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQotIwotIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKLQotIwotIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBhZGFwdGVyIEkyQy9EREMgY2hhbm5lbCBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0Ci0KLSMKLSMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci1DT05GSUdfUE9XRVJfU1VQUExZPXkKLSMgQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QREFfUE9XRVIgaXMgbm90IHNldAotIyBDT05GSUdfQkFUVEVSWV9EUzI3NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkFUVEVSWV9CUTI3eDAwIGlzIG5vdCBzZXQKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRFQ3NDYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MVEM0MjQ1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MSVMzTFYwMkQgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfVEhFUk1BTD1tCi0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotCi0jCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotQ09ORklHX0RBQj15Ci0jIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCitDT05GSUdfQUNQSV9GQU49bQorQ09ORklHX0FDUElfUFJPQ0VTU09SPW0KK0NPTkZJR19BQ1BJX1BST0NGUz15CiBDT05GSUdfQUdQPW0KK0NPTkZJR19BUlBEPXkKK0NPTkZJR19BVVRPRlM0X0ZTPXkKK0NPTkZJR19BVVRPRlNfRlM9eQorQ09ORklHX0JJTkZNVF9NSVNDPW0KKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0NNRDY0WD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KK0NPTkZJR19CTEtfREVWX0RNPW0KK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorQ09ORklHX0JMS19ERVZfTUQ9bQorQ09ORklHX0JMS19ERVZfTkJEPW0KK0NPTkZJR19CTEtfREVWX1BJSVg9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19CTEtfREVWX1NSPW0KK0NPTkZJR19DSFJfREVWX1NHPW0KK0NPTkZJR19DSFJfREVWX1NUPW0KK0NPTkZJR19DSUZTPW0KKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fUENCQz1tCitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKK0NPTkZJR19ETV9DUllQVD1tCitDT05GSUdfRE1fTUlSUk9SPW0KK0NPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRFJNPW0KLUNPTkZJR19EUk1fVERGWD1tCitDT05GSUdfRFJNX01HQT1tCiBDT05GSUdfRFJNX1IxMjg9bQogQ09ORklHX0RSTV9SQURFT049bQotQ09ORklHX0RSTV9NR0E9bQogQ09ORklHX0RSTV9TSVM9bQotIyBDT05GSUdfRFJNX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk1fU0FWQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLUNPTkZJR19WR0FfQ09OU09MRT15Ci0jIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLUNPTkZJR19ISURfU1VQUE9SVD15Ci1DT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURSQVcgaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbnB1dCBEZXZpY2VzCi0jCi1DT05GSUdfVVNCX0hJRD15Ci0jIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAotCi0jCi0jIFNwZWNpYWwgSElEIGRyaXZlcnMKLSMKLUNPTkZJR19ISURfQ09NUEFUPXkKLUNPTkZJR19ISURfQTRURUNIPXkKLUNPTkZJR19ISURfQVBQTEU9eQotQ09ORklHX0hJRF9CRUxLSU49eQotQ09ORklHX0hJRF9DSEVSUlk9eQotQ09ORklHX0hJRF9DSElDT05ZPXkKLUNPTkZJR19ISURfQ1lQUkVTUz15Ci1DT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19EUk1fVERGWD1tCitDT05GSUdfRFVNTVk9bQorQ09ORklHX0UxMDAwPXkKK0NPTkZJR19FMTAwPW0KK0NPTkZJR19FRklfUEFSVElUSU9OPXkKK0NPTkZJR19FRklfUlRDPXkKK0NPTkZJR19FRklfVkFSUz15CitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0ZPUkNFX0NQRUlfUkVUQVJHRVQ9eQorQ09ORklHX0ZVU0lPTl9DVEw9eQorQ09ORklHX0ZVU0lPTl9GQz15CitDT05GSUdfRlVTSU9OX1NQST15CitDT05GSUdfRlVTSU9OPXkKK0NPTkZJR19HQU1FUE9SVD1tCiBDT05GSUdfSElEX0dZUkFUSU9OPXkKLUNPTkZJR19ISURfTE9HSVRFQ0g9eQotIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAotIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldAotQ09ORklHX0hJRF9NSUNST1NPRlQ9eQotQ09ORklHX0hJRF9NT05URVJFWT15CiBDT05GSUdfSElEX05UUklHPXkKIENPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQotIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9QRVRBTFlOWD15CiBDT05GSUdfSElEX1NBTVNVTkc9eQogQ09ORklHX0hJRF9TT05ZPXkKIENPTkZJR19ISURfU1VOUExVUz15Ci0jIENPTkZJR19HUkVFTkFTSUFfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9UT1BTRUVEPXkKLSMgQ09ORklHX1RIUlVTVE1BU1RFUl9GRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19aRVJPUExVU19GRiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NVUFBPUlQ9eQotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15Ci1DT05GSUdfVVNCPXkKLSMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1M9eQotIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9bQotIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfT0hDSV9IQ0Q9bQotIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15Ci1DT05GSUdfVVNCX1VIQ0lfSENEPXkKLSMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0hDSV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGRlcGVuZHMgb24gU0NTSSBidXQgQkxLX0RFVl9TRCBtYXkgYWxzbyBiZSBuZWVkZWQ7Ci0jCi0KLSMKLSMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKLUNPTkZJR19VU0JfU1RPUkFHRT1tCi0jIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW1hZ2luZyBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHBvcnQgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVZTRUcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlCi0jCi0jIENPTkZJR19VV0IgaXMgbm90IHNldAotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAotIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VSU8gaXMgbm90IHNldAotQ09ORklHX1hFTl9CQUxMT09OPXkKLUNPTkZJR19YRU5fU0NSVUJfUEFHRVM9eQotQ09ORklHX1hFTkZTPXkKLUNPTkZJR19YRU5fQ09NUEFUX1hFTkZTPXkKLSMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTVNQRUMgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0VYVDJfRlNfWEFUVFI9eQotQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19FWFQzX0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUM19GU19TRUNVUklUWT15Ci0jIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KQkQ9eQotQ09ORklHX0ZTX01CQ0FDSEU9eQotQ09ORklHX1JFSVNFUkZTX0ZTPXkKLSMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0Ci1DT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQotQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFk9eQotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GU19QT1NJWF9BQ0w9eQotQ09ORklHX0ZJTEVfTE9DS0lORz15Ci1DT05GSUdfWEZTX0ZTPXkKLSMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15CitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX0hPVFBMVUdfUENJX0FDUEk9bQorQ09ORklHX0hPVFBMVUdfUENJPW0KK0NPTkZJR19IUEVUPXkKK0NPTkZJR19IVUdFVExCRlM9eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKK0NPTkZJR19JQTY0X0NZQ0xPTkU9eQorQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CPXkKK0NPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CitDT05GSUdfSUE2NF9QQUxJTkZPPXkKK0NPTkZJR19JQTY0X1hFTl9HVUVTVD15CitDT05GSUdfSURFPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19JS0NPTkZJRz15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CiBDT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19BVVRPRlNfRlM9eQotQ09ORklHX0FVVE9GUzRfRlM9eQotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIworQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19JU085NjYwX0ZTPW0KIENPTkZJR19KT0xJRVQ9eQotIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VERl9OTFM9eQotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNwotQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgotQ09ORklHX05URlNfRlM9bQotIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX1JXIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotQ09ORklHX0hVR0VUTEJGUz15Ci1DT05GSUdfSFVHRVRMQl9QQUdFPXkKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKK0NPTkZJR19LRVhFQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0yMAorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19NQ0tJTkxFWT15CitDT05GSUdfTURfTElORUFSPW0KK0NPTkZJR19NRF9NVUxUSVBBVEg9bQorQ09ORklHX01EX1JBSUQwPW0KK0NPTkZJR19NRF9SQUlEMT1tCitDT05GSUdfTUQ9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX05FVENPTlNPTEU9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1RVTElQPXkKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1Y0PXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU0Q9bQotQ09ORklHX05GU0RfVjM9eQotIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAotQ09ORklHX05GU0RfVjQ9eQotQ09ORklHX0xPQ0tEPW0KLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9bQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz1tCi1DT05GSUdfU1VOUlBDX0dTUz1tCi0jIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAotQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT1tCi0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9bQotQ09ORklHX1NNQl9OTFNfREVGQVVMVD15Ci1DT05GSUdfU01CX05MU19SRU1PVEU9ImNwNDM3IgotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfU0dJX1BBUlRJVElPTj15Ci0jIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19FRklfUEFSVElUSU9OPXkKLSMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQpAQCAtMTM4NCwxNSArMTMxLDE0IEBACiBDT05GSUdfTkxTX0NPREVQQUdFXzg2NT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2Nj1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg2OT1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg3ND1tCi1DT05GSUdfTkxTX0lTTzg4NTlfOD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzEyNTA9bQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUxPW0KLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzkzMj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzkzNj1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk0OT1tCitDT05GSUdfTkxTX0NPREVQQUdFXzk1MD1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiBDT05GSUdfTkxTX0lTTzg4NTlfMj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMz1tCkBAIC0xNDAwLDIwMCArMTQ2LDU0IEBACiBDT05GSUdfTkxTX0lTTzg4NTlfNT1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNj1tCiBDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOD1tCiBDT05GSUdfTkxTX0lTTzg4NTlfOT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTM9bQotQ09ORklHX05MU19JU084ODU5XzE0PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX0tPSThfUj1tCiBDT05GSUdfTkxTX0tPSThfVT1tCiBDT05GSUdfTkxTX1VURjg9bQotIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLUNPTkZJR19GUkFNRV9XQVJOPTIwNDgKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQotIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAotQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKLSMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCi1DT05GSUdfU0NIRURfREVCVUc9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfTVVURVhFUz15Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX05SX0NQVVM9MTYKK0NPTkZJR19OVEZTX0ZTPW0KK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBUkFWSVJUX0dVRVNUPXkKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX1BFUkZNT049eQorQ09ORklHX1BFUk1JVF9CU1BfUkVNT1ZFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1JBV19EUklWRVI9bQogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0Ci0KLSMKLSMgVHJhY2VycwotIwotIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAotQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CPXkKLSMgQ09ORklHX0lBNjRfR1JBTlVMRV82NE1CIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfUFJJTlRfSEFaQVJEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ESVNBQkxFX1ZIUFQgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9ERUJVR19DTVBYQ0hHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfREVCVUdfSVJRIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUTz15Ci0KLSMKLSMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCi0jCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQotQ09ORklHX0NSWVBUT19BRUFEMj15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCi1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQotQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fSEFTSDI9eQotQ09ORklHX0NSWVBUT19STkcyPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj1tCi1DT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKLSMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKLSMKLSMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIG1vZGVzCi0jCi1DT05GSUdfQ1JZUFRPX0NCQz1tCi0jIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19FQ0I9bQotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1BDQkM9bQotIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFzaCBtb2RlcwotIwotIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAotCi0jCi0jIERpZ2VzdAotIwotIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2lwaGVycwotIwotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz1tCi0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29tcHJlc3Npb24KLSMKLSMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAotCi0jCi0jIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgotIwotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19IVz15Ci0jIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9LVk09eQotQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKLSMgQ09ORklHX0tWTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSVJUSU9fUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJUlRJT19CQUxMT09OIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQklUUkVWRVJTRT15Ci1DT05GSUdfR0VORVJJQ19GSU5EX0xBU1RfQklUPXkKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfSVRVX1Q9bQotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0NSQzcgaXMgbm90IHNldAotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19QTElTVD15Ci1DT05GSUdfSEFTX0lPTUVNPXkKLUNPTkZJR19IQVNfSU9QT1JUPXkKLUNPTkZJR19IQVNfRE1BPXkKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci1DT05GSUdfSVJRX1BFUl9DUFU9eQotIyBDT05GSUdfSU9NTVVfQVBJIGlzIG5vdCBzZXQKK0NPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0w9eQorQ09ORklHX1JFSVNFUkZTX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19SRUlTRVJGU19GU19YQVRUUj15CitDT05GSUdfUkVJU0VSRlNfRlM9eQorQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQorQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQorQ09ORklHX1NDU0k9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz02CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NHSV9QQVJUSVRJT049eQorQ09ORklHX1NNQl9GUz1tCitDT05GSUdfU01CX05MU19ERUZBVUxUPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19USUdPTjM9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19UVUxJUD1tCitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfVU5JWD15CitDT05GSUdfVVNCX0RFVklDRUZTPXkKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9bQorQ09ORklHX1VTQl9PSENJX0hDRD1tCitDT05GSUdfVVNCX1NUT1JBR0U9bQorQ09ORklHX1VTQl9VSENJX0hDRD15CitDT05GSUdfVVNCPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19YRlNfRlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKaW5kZXggM2NlYzY1Yi4uZGUwYjY4ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCkBAIC0xLDE0NjAgKzEsODUgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMS1yYzMKLSMgVGh1IE1hciAgOCAxMTowNDoyMCAyMDA3Ci0jCi1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DS19LRVJORUw9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19JUENfTlMgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTFVCPXkKLUNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfUlRfTVVURVhFUz15Ci0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKLUNPTkZJR19TVE9QX01BQ0hJTkU9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCi1DT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgotCi0jCi0jIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwotIwotQ09ORklHX0lBNjQ9eQotQ09ORklHXzY0QklUPXkKLUNPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfTU1VPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX0RNST15Ci1DT05GSUdfRUZJPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLUNPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0FVRElUX0FSQ0g9eQotIyBDT05GSUdfSUE2NF9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfRElHIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X0hQX1pYMT15Ci0jIENPTkZJR19JQTY0X0hQX1pYMV9TV0lPVExCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lBNjRfU0dJX1NOMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0hQX1NJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JVEFOSVVNIGlzIG5vdCBzZXQKLUNPTkZJR19NQ0tJTkxFWT15Ci0jIENPTkZJR19JQTY0X1BBR0VfU0laRV80S0IgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X1BBR0VfU0laRV8xNktCPXkKLSMgQ09ORklHX0lBNjRfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAotQ09ORklHX1BHVEFCTEVfMz15Ci0jIENPTkZJR19QR1RBQkxFXzQgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19IWl8yNTA9eQotIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotQ09ORklHX0haPTI1MAotQ09ORklHX0lBNjRfTDFfQ0FDSEVfU0hJRlQ9NwotIyBDT05GSUdfSUE2NF9DWUNMT05FIGlzIG5vdCBzZXQKLUNPTkZJR19JT1NBUElDPXkKLUNPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE3Ci1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTE2Ci1DT05GSUdfSE9UUExVR19DUFU9eQotQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKLSMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QRVJNSVRfQlNQX1JFTU9WRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLUNPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQotQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0RFRkFVTFQ9eQotQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKLUNPTkZJR19WSVJUVUFMX01FTV9NQVA9eQotQ09ORklHX0hPTEVTX0lOX1pPTkU9eQotQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZPXkKLUNPTkZJR19QRVJGTU9OPXkKLUNPTkZJR19JQTY0X1BBTElORk89eQotIyBDT05GSUdfSUE2NF9FU0kgaXMgbm90IHNldAotIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotQ09ORklHX0NSQVNIX0RVTVA9eQotCi0jCi0jIEZpcm13YXJlIERyaXZlcnMKLSMKLUNPTkZJR19FRklfVkFSUz15Ci1DT05GSUdfRUZJX1BDRFA9eQotQ09ORklHX0JJTkZNVF9FTEY9eQotQ09ORklHX0JJTkZNVF9NSVNDPXkKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IGFuZCBBQ1BJCi0jCi1DT05GSUdfUE09eQotQ09ORklHX1BNX0xFR0FDWT15Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKLQotIwotIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKLSMKLUNPTkZJR19BQ1BJPXkKIENPTkZJR19BQ1BJX1BST0NGUz15Ci1DT05GSUdfQUNQSV9CVVRUT049eQotQ09ORklHX0FDUElfRkFOPXkKLSMgQ09ORklHX0FDUElfRE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9QUk9DRVNTT1I9eQotQ09ORklHX0FDUElfSE9UUExVR19DUFU9eQotQ09ORklHX0FDUElfVEhFUk1BTD15Ci1DT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCi0jIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0VDPXkKLUNPTkZJR19BQ1BJX1BPV0VSPXkKLUNPTkZJR19BQ1BJX1NZU1RFTT15Ci1DT05GSUdfQUNQSV9DT05UQUlORVI9eQotCi0jCi0jIENQVSBGcmVxdWVuY3kgc2NhbGluZwotIwotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSkKLSMKLUNPTkZJR19QQ0k9eQotQ09ORklHX1BDSV9ET01BSU5TPXkKLSMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAotIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi1DT05GSUdfSE9UUExVR19QQ0k9eQotIyBDT05GSUdfSE9UUExVR19QQ0lfRkFLRSBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVR19QQ0lfQUNQST15Ci0jIENPTkZJR19IT1RQTFVHX1BDSV9BQ1BJX0lCTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHX1BDSV9DUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX1NIUEMgaXMgbm90IHNldAotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15Ci1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19DVUJJQz15Ci1DT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCi0jIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKLQotIwotIyBJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbgotIwotIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfRU5BQkxFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9JUFRBQkxFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9BUlBUQUJMRVMgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVENQUFJPQkUgaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotCi0jCi0jIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKLSMKLSMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotQ09ORklHX1BOUD15Ci0jIENPTkZJR19QTlBfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIFByb3RvY29scwotIwotQ09ORklHX1BOUEFDUEk9eQotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLSMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotQ09ORklHX0lERT15Ci1DT05GSUdfSURFX01BWF9IV0lGUz00Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVDRD15Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQUNQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0Ci0KLSMKLSMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwotIwotIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVQTlAgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLUNPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKLSMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfR0VORVJJQz15Ci0jIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKK0NPTkZJR19BR1BfSFBfWlgxPXkKK0NPTkZJR19BR1A9eQorQ09ORklHX0FVVE9GU19GUz15CitDT05GSUdfQklORk1UX01JU0M9eQogQ09ORklHX0JMS19ERVZfQ01ENjRYPXkKLSMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSk1JQ1JPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JVDgyMTMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UQzg2QzAwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURNQT15Ci0jIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9eQotIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAotQ09ORklHX1NDU0lfTkVUTElOSz15Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIworQ09ORklHX0JMS19ERVZfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVDRD15CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0NIUl9ERVZfU1Q9eQotQ09ORklHX0NIUl9ERVZfT1NTVD15Ci1DT05GSUdfQkxLX0RFVl9TUj15CiBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1I9eQorQ09ORklHX0JMS19ERVZfU1I9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0NIUl9ERVZfT1NTVD15CiBDT05GSUdfQ0hSX0RFVl9TRz15Ci0jIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCi1DT05GSUdfU0NTSV9NVUxUSV9MVU49eQotQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKLUNPTkZJR19TQ1NJX0xPR0dJTkc9eQotIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIFRyYW5zcG9ydHMKLSMKLUNPTkZJR19TQ1NJX1NQSV9BVFRSUz15Ci1DT05GSUdfU0NTSV9GQ19BVFRSUz15Ci0jIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwotIwotIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAotQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQotQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RNQV9BRERSRVNTSU5HX01PREU9MQotQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUz0xNgotQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfTU1JTz15Ci1DT05GSUdfU0NTSV9RTE9HSUNfMTI4MD15Ci0jIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCi0jIENPTkZJR19BVEEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0ZVU0lPTj15Ci1DT05GSUdfRlVTSU9OX1NQST15Ci1DT05GSUdfRlVTSU9OX0ZDPXkKLSMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAotQ09ORklHX0ZVU0lPTl9NQVhfU0dFPTEyOAotQ09ORklHX0ZVU0lPTl9DVEw9bQotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0NIUl9ERVZfU1Q9eQorQ09ORklHX0NSQVNIX0RVTVA9eQorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19QQ0JDPW0KK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorQ09ORklHX0RSTV9SQURFT049eQorQ09ORklHX0RSTT15CiBDT05GSUdfRFVNTVk9eQotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TQjEwMDAgaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKLQotIwotIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX05FVF9UVUxJUD15Ci0jIENPTkZJR19ERTIxMDRYIGlzIG5vdCBzZXQKLUNPTkZJR19UVUxJUD15Ci1DT05GSUdfVFVMSVBfTVdJPXkKLUNPTkZJR19UVUxJUF9NTUlPPXkKLUNPTkZJR19UVUxJUF9OQVBJPXkKLUNPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT049eQotIyBDT05GSUdfREU0WDUgaXMgbm90IHNldAotIyBDT05GSUdfV0lOQk9ORF84NDAgaXMgbm90IHNldAotIyBDT05GSUdfRE05MTAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMSTUyNlggaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0Ci1DT05GSUdfRTEwMD15Ci0jIENPTkZJR19GRUFMTlggaXMgbm90IHNldAotIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAotIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15Ci0jIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLR0UgaXMgbm90IHNldAotIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0Ci1DT05GSUdfVElHT04zPXkKLSMgQ09ORklHX0JOWDIgaXMgbm90IHNldAotIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotIyBDT05GSUdfQ0hFTFNJT19UMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLUNPTkZJR19JTlBVVF9KT1lERVY9eQotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorQ09ORklHX0UxMDA9eQorQ09ORklHX0VGSV9QQVJUSVRJT049eQorQ09ORklHX0VGSV9SVEM9eQorQ09ORklHX0VGSV9WQVJTPXkKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0ZCX1JBREVPTl9ERUJVRz15CitDT05GSUdfRkJfUkFERU9OPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CitDT05GSUdfRlVTSU9OX0NUTD1tCitDT05GSUdfRlVTSU9OX0ZDPXkKK0NPTkZJR19GVVNJT05fU1BJPXkKK0NPTkZJR19GVVNJT049eQorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19IT1RQTFVHX1BDSV9BQ1BJPXkKK0NPTkZJR19IT1RQTFVHX1BDST15CitDT05GSUdfSFVHRVRMQkZTPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0lBNjRfSFBfWlgxPXkKK0NPTkZJR19JQTY0X01DQV9SRUNPVkVSWT15CitDT05GSUdfSUE2NF9QQUxJTkZPPXkKK0NPTkZJR19JQTY0X1BSSU5UX0hBWkFSRFM9eQorQ09ORklHX0lERT15CitDT05GSUdfSU5FVD15CiBDT05GSUdfSU5QVVRfRVZERVY9eQotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCitDT05GSUdfSU5QVVRfSk9ZREVWPXkKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQotQ09ORklHX1NFUklBTF84MjUwX1BOUD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9OAotQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAotQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKLUNPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQotIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9SU0EgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLUNPTkZJR19FRklfUlRDPXkKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotQ09ORklHX0FHUD15Ci1DT05GSUdfQUdQX0hQX1pYMT15Ci1DT05GSUdfRFJNPXkKLSMgQ09ORklHX0RSTV9UREZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTV9SMTI4IGlzIG5vdCBzZXQKLUNPTkZJR19EUk1fUkFERU9OPXkKLSMgQ09ORklHX0RSTV9NR0EgaXMgbm90IHNldAotIyBDT05GSUdfRFJNX1NJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk1fVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTV9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLUNPTkZJR19JMkNfQUxHT0JJVD15Ci1DT05GSUdfSTJDX0FMR09QQ0Y9eQotIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFTRU1JIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBST01fTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwotIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLUNPTkZJR19WSURFT19ERVY9eQotQ09ORklHX1ZJREVPX1Y0TDE9eQotQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUPXkKLUNPTkZJR19WSURFT19WNEwyPXkKLQotIwotIyBWaWRlbyBDYXB0dXJlIEFkYXB0ZXJzCi0jCi0KLSMKLSMgVmlkZW8gQ2FwdHVyZSBBZGFwdGVycwotIwotIyBDT05GSUdfVklERU9fQURWX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19IRUxQRVJfQ0hJUFNfQVVUTz15Ci0jIENPTkZJR19WSURFT19WSVZJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0JUODQ4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0NQSUEgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fQ1BJQTIgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fU0FBNTI0NkEgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fU0FBNTI0OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU5FUl8zMDM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX1NUUkFESVMgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fWk9SQU4gaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fU0FBNzEzNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NWEIgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fRFBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0hFWElVTV9PUklPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19IRVhJVU1fR0VNSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0NYODggaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fQ0FGRV9DQ0lDIGlzIG5vdCBzZXQKLQotIwotIyBWNEwgVVNCIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX1BWUlVTQjIgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fRU0yOFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX1VTQlZJU0lPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVklDQU0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lCTUNBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS09OSUNBV0MgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1FVSUNLQ0FNX01FU1NFTkdFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRVQ2MVgyNTEgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fT1ZDQU1DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9XOTk2OENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVjUxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0U0MDEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NOOUMxMDIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUVjY4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWkMwMzAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QV0MgaXMgbm90IHNldAotCi0jCi0jIFJhZGlvIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19SQURJT19HRU1URUtfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBRElPX01BWElSQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQURJT19NQUVTVFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EU0JSIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15Ci1DT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15Ci1DT05GSUdfTENEX0NMQVNTX0RFVklDRT1tCi1DT05GSUdfRkI9eQotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfRERDPXkKLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15Ci1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15Ci0jIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9CQUNLTElHSFQ9eQotQ09ORklHX0ZCX01PREVfSEVMUEVSUz15Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotCi0jCi0jIEZyYW1idWZmZXIgaGFyZHdhcmUgZHJpdmVycwotIwotIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9SQURFT049eQotQ09ORklHX0ZCX1JBREVPTl9JMkM9eQotQ09ORklHX0ZCX1JBREVPTl9CQUNLTElHSFQ9eQotQ09ORklHX0ZCX1JBREVPTl9ERUJVRz15Ci0jIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLUNPTkZJR19WR0FfQ09OU09MRT15Ci0jIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLSMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAotQ09ORklHX0ZPTlRfOHg4PXkKLUNPTkZJR19GT05UXzh4MTY9eQotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwotQ09ORklHX0xPR089eQotIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAotQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15Ci0KLSMKLSMgU291bmQKLSMKLUNPTkZJR19TT1VORD15Ci0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCi1DT05GSUdfU05EPXkKLUNPTkZJR19TTkRfVElNRVI9eQotQ09ORklHX1NORF9QQ009eQotQ09ORklHX1NORF9IV0RFUD15Ci1DT05GSUdfU05EX1JBV01JREk9eQotQ09ORklHX1NORF9TRVFVRU5DRVI9eQotIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX09TU0VNVUw9eQotQ09ORklHX1NORF9NSVhFUl9PU1M9eQotQ09ORklHX1NORF9QQ01fT1NTPXkKLUNPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKLUNPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15Ci0jIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQotQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15Ci0jIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKLUNPTkZJR19TTkRfTVBVNDAxX1VBUlQ9eQotQ09ORklHX1NORF9PUEwzX0xJQj15Ci1DT05GSUdfU05EX0FDOTdfQ09ERUM9eQotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgZGV2aWNlcwotIwotIyBDT05GSUdfU05EX0FEMTg4OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxTMzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FUSUlYUF9NT0RFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MjAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DUzQyODEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NTNDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfREFSTEEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfR0lOQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9MQVlMQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9EQVJMQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9HSU5BMjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0xBWUxBMjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01PTkEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01JQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRUNITzNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR08gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lORElHT0lPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR09ESiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfRk04MDE9eQotIyBDT05GSUdfU05EX0ZNODAxX1RFQTU3NVhfQk9PTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERBX0lOVEVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IRFNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IRFNQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5URUw4WDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAotCi0jCi0jIFVTQiBkZXZpY2VzCi0jCi0jIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKLQotIwotIyBTb0MgYXVkaW8gc3VwcG9ydAotIwotIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0Ci0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKLSMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKLUNPTkZJR19BQzk3X0JVUz15Ci0KLSMKLSMgSElEIERldmljZXMKLSMKLUNPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15Ci1DT05GSUdfVVNCPXkKLSMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucwotIwotIyBDT05GSUdfVVNCX0RFVklDRUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKLSMKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9eQotIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAotQ09ORklHX1VTQl9PSENJX0hDRD15Ci0jIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKLUNPTkZJR19VU0JfVUhDSV9IQ0Q9eQotIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotQ09ORklHX1VTQl9TVE9SQUdFPXkKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbnB1dCBEZXZpY2VzCi0jCi1DT05GSUdfVVNCX0hJRD15Ci0jIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0hJRERFVj15Ci0jIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQUNFQ0FEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HVENPIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW1hZ2luZyBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKLSMKLSMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVF9NSUkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX01PTj15Ci0KLSMKLSMgVVNCIHBvcnQgZHJpdmVycwotIwotCi0jCi0jIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRldmljZXMKLSMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIwotCi0jCi0jIEluZmluaUJhbmQgc3VwcG9ydAotIwotIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCi0jCi0KLSMKLSMgUmVhbCBUaW1lIENsb2NrCi0jCi0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotCi0jCi0jIERNQSBFbmdpbmUgc3VwcG9ydAotIwotIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLQotIwotIyBETUEgRGV2aWNlcwotIwotCi0jCi0jIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKLSMKLQotIwotIyBWaXJ0dWFsaXphdGlvbgotIwotIyBDT05GSUdfTVNQRUMgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0VYVDJfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLUNPTkZJR19BVVRPRlNfRlM9eQotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX0lTTzk2NjBfRlM9eQogQ09ORklHX0pPTElFVD15Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotQ09ORklHX1VERl9GUz15Ci1DT05GSUdfVURGX05MUz15Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0ZBVF9GUz15CitDT05GSUdfS1BST0JFUz15CisjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CitDT05GSUdfTE9HTz15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX01DS0lOTEVZPXkKK0NPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3Ci1DT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCi0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19QUk9DX1ZNQ09SRT15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotQ09ORklHX0hVR0VUTEJGUz15Ci1DT05GSUdfSFVHRVRMQl9QQUdFPXkKLUNPTkZJR19SQU1GUz15Ci0jIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX05FVEZJTFRFUj15CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1RVTElQPXkKK0NPTkZJR19ORlNEX1YzPXkKK0NPTkZJR19ORlNEPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEPXkKLUNPTkZJR19ORlNEX1YzPXkKLSMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRF9UQ1AgaXMgbm90IHNldAotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9eQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz15Ci1DT05GSUdfU1VOUlBDX0dTUz15Ci1DT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfRUZJX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKLUNPTkZJR19OTFM9eQotQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9eQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19DT0RFUEFHRV83Mzc9eQogQ09ORklHX05MU19DT0RFUEFHRV83NzU9eQpAQCAtMTQ3MCwxNSArOTUsMTQgQEAKIENPTkZJR19OTFNfQ09ERVBBR0VfODY1PXkKIENPTkZJR19OTFNfQ09ERVBBR0VfODY2PXkKIENPTkZJR19OTFNfQ09ERVBBR0VfODY5PXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfOTM2PXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfOTUwPXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PXkKIENPTkZJR19OTFNfQ09ERVBBR0VfODc0PXkKLUNPTkZJR19OTFNfSVNPODg1OV84PXkKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLUNPTkZJR19OTFNfQ09ERVBBR0VfMTI1MT15Ci0jIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV85MzI9eQorQ09ORklHX05MU19DT0RFUEFHRV85MzY9eQorQ09ORklHX05MU19DT0RFUEFHRV85NDk9eQorQ09ORklHX05MU19DT0RFUEFHRV85NTA9eQorQ09ORklHX05MU19JU084ODU5XzEzPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xND15CitDT05GSUdfTkxTX0lTTzg4NTlfMTU9eQogQ09ORklHX05MU19JU084ODU5XzE9eQogQ09ORklHX05MU19JU084ODU5XzI9eQogQ09ORklHX05MU19JU084ODU5XzM9eQpAQCAtMTQ4NiwxMjUgKzExMCw1MiBAQAogQ09ORklHX05MU19JU084ODU5XzU9eQogQ09ORklHX05MU19JU084ODU5XzY9eQogQ09ORklHX05MU19JU084ODU5Xzc9eQorQ09ORklHX05MU19JU084ODU5Xzg9eQogQ09ORklHX05MU19JU084ODU5Xzk9eQotQ09ORklHX05MU19JU084ODU5XzEzPXkKLUNPTkZJR19OTFNfSVNPODg1OV8xND15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMTU9eQogQ09ORklHX05MU19LT0k4X1I9eQogQ09ORklHX05MU19LT0k4X1U9eQogQ09ORklHX05MU19VVEY4PXkKLQotIwotIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKLSMKLSMgQ09ORklHX0RMTSBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0JJVFJFVkVSU0U9eQotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj15Ci0jIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAotQ09ORklHX1BMSVNUPXkKLUNPTkZJR19IQVNfSU9NRU09eQotQ09ORklHX0hBU19JT1BPUlQ9eQotQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQotQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKLUNPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRPXkKLUNPTkZJR19JUlFfUEVSX0NQVT15Ci0KLSMKLSMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKLSMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci1DT05GSUdfS1BST0JFUz15Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLUNPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE3Ci1DT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19NVVRFWEVTPXkKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0Ci1DT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKLSMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAotIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19JQTY0X0dSQU5VTEVfMTZNQj15Ci0jIENPTkZJR19JQTY0X0dSQU5VTEVfNjRNQiBpcyBub3Qgc2V0Ci1DT05GSUdfSUE2NF9QUklOVF9IQVpBUkRTPXkKLSMgQ09ORklHX0RJU0FCTEVfVkhQVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQTY0X0RFQlVHX0NNUFhDSEcgaXMgbm90IHNldAotIyBDT05GSUdfSUE2NF9ERUJVR19JUlEgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUENfQ09NUEFUPXkKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLUNPTkZJR19DUllQVE89eQotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKLSMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19NRDU9eQotIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0VDQj1tCi1DT05GSUdfQ1JZUFRPX0NCQz15Ci1DT05GSUdfQ1JZUFRPX1BDQkM9bQotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIworQ09ORklHX05SX0NQVVM9MTYKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CitDT05GSUdfUEVSRk1PTj15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQorQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQorQ09ORklHX1NDU0k9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz04CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TTVA9eQorQ09ORklHX1NORF9GTTgwMT15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19USUdPTjM9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19UVUxJUF9NTUlPPXkKK0NPTkZJR19UVUxJUF9NV0k9eQorQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTj15CitDT05GSUdfVFVMSVBfTkFQST15CitDT05GSUdfVFVMSVA9eQorQ09ORklHX1VERl9GUz15CitDT05GSUdfVU5JWD15CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKK0NPTkZJR19VU0JfSElEREVWPXkKK0NPTkZJR19VU0JfTU9OPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19VU0JfVUhDSV9IQ0Q9eQorQ09ORklHX1VTQj15CitDT05GSUdfVkZBVF9GUz15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGEzNjJlNjcuLjJmMjI5ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0yMzUsNiArMjM1LDcgQEAKICNkZWZpbmUgS1ZNX1JFUV9QVENfRwkJMzIKICNkZWZpbmUgS1ZNX1JFUV9SRVNVTUUJCTMzCiAKKyNkZWZpbmUgS1ZNX0hQQUdFX0dGTl9TSElGVCh4KQkwCiAjZGVmaW5lIEtWTV9OUl9QQUdFX1NJWkVTCTEKICNkZWZpbmUgS1ZNX1BBR0VTX1BFUl9IUEFHRSh4KQkxCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbG9jYWw2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzkzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCA1ZjI3MWJjLi40MWI2ZDMxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTQxLDcgKzQxLDcgQEAKICNkZWZpbmUgUEFHRV9TSVpFCQkoX19JQTY0X1VMX0NPTlNUKDEpIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBBR0VfTUFTSwkJKH4oUEFHRV9TSVpFIC0gMSkpCiAKLSNkZWZpbmUgUEVSQ1BVX1BBR0VfU0hJRlQJMTYJLyogbG9nMigpIG9mIG1heC4gc2l6ZSBvZiBwZXItQ1BVIGFyZWEgKi8KKyNkZWZpbmUgUEVSQ1BVX1BBR0VfU0hJRlQJMTgJLyogbG9nMigpIG9mIG1heC4gc2l6ZSBvZiBwZXItQ1BVIGFyZWEgKi8KICNkZWZpbmUgUEVSQ1BVX1BBR0VfU0laRQkoX19JQTY0X1VMX0NPTlNUKDEpIDw8IFBFUkNQVV9QQUdFX1NISUZUKQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYwppbmRleCA2Yzg5MjI4Li40YTc0NmVhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tc2lfaWE2NC5jCkBAIC0yNSw3ICsyNSw3IEBACiAJaWYgKGlycV9wcmVwYXJlX21vdmUoaXJxLCBjcHUpKQogCQlyZXR1cm4gLTE7CiAKLQlyZWFkX21zaV9tc2coaXJxLCAmbXNnKTsKKwlnZXRfY2FjaGVkX21zaV9tc2coaXJxLCAmbXNnKTsKIAogCWFkZHIgPSBtc2cuYWRkcmVzc19sbzsKIAlhZGRyICY9IE1TSV9BRERSX0RFU1RfSURfTUFTSzsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKaW5kZXggYWI5ODVmNy4uNzQ0MzI5MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKQEAgLTE2OTYsOCArMTY5Niw4IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLXN0YXRpYyBpbnQKLXBmbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZworcGZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlEUFJJTlQoKCJwZm1faW9jdGwgY2FsbGVkXG4iKSk7CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTc0LDE1ICsyMTc0LDE1IEBACiAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGZtX2ZpbGVfb3BzID0gewotCS5sbHNlZWsgICA9IG5vX2xsc2VlaywKLQkucmVhZCAgICAgPSBwZm1fcmVhZCwKLQkud3JpdGUgICAgPSBwZm1fd3JpdGUsCi0JLnBvbGwgICAgID0gcGZtX3BvbGwsCi0JLmlvY3RsICAgID0gcGZtX2lvY3RsLAotCS5vcGVuICAgICA9IHBmbV9ub19vcGVuLAkvKiBzcGVjaWFsIG9wZW4gY29kZSB0byBkaXNhbGxvdyBvcGVuIHZpYSAvcHJvYyAqLwotCS5mYXN5bmMgICA9IHBmbV9mYXN5bmMsCi0JLnJlbGVhc2UgID0gcGZtX2Nsb3NlLAotCS5mbHVzaAkgID0gcGZtX2ZsdXNoCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcGZtX3JlYWQsCisJLndyaXRlCQk9IHBmbV93cml0ZSwKKwkucG9sbAkJPSBwZm1fcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSBwZm1faW9jdGwsCisJLm9wZW4JCT0gcGZtX25vX29wZW4sCS8qIHNwZWNpYWwgb3BlbiBjb2RlIHRvIGRpc2FsbG93IG9wZW4gdmlhIC9wcm9jICovCisJLmZhc3luYwkJPSBwZm1fZmFzeW5jLAorCS5yZWxlYXNlCT0gcGZtX2Nsb3NlLAorCS5mbHVzaAkJPSBwZm1fZmx1c2gKIH07CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBlMDcyMThhLi41YTRkMDQ0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC02LDIwNCArNiwyMDkgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CiAKLSNkZWZpbmUgSVZUX1RFWFQJCQkJCQkJXAotCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X2l2dF90ZXh0KSA9IC47CQkJXAotCQkqKC50ZXh0Li5pdnQpCQkJCQkJXAotCQlWTUxJTlVYX1NZTUJPTChfX2VuZF9pdnRfdGV4dCkgPSAuOwotCiBPVVRQVVRfRk9STUFUKCJlbGY2NC1pYTY0LWxpdHRsZSIpCiBPVVRQVVRfQVJDSChpYTY0KQogRU5UUlkocGh5c19zdGFydCkKIGppZmZpZXMgPSBqaWZmaWVzXzY0OworCiBQSERSUyB7Ci0gIGNvZGUgICBQVF9MT0FEOwotICBwZXJjcHUgUFRfTE9BRDsKLSAgZGF0YSAgIFBUX0xPQUQ7Ci0gIG5vdGUgICBQVF9OT1RFOwotICB1bndpbmQgMHg3MDAwMDAwMTsgLyogUFRfSUFfNjRfVU5XSU5ELCBidXQgbGQgZG9lc24ndCBtYXRjaCB0aGUgbmFtZSAqLworCWNvZGUgICBQVF9MT0FEOworCXBlcmNwdSBQVF9MT0FEOworCWRhdGEgICBQVF9MT0FEOworCW5vdGUgICBQVF9OT1RFOworCXVud2luZCAweDcwMDAwMDAxOyAvKiBQVF9JQV82NF9VTldJTkQsIGJ1dCBsZCBkb2Vzbid0IG1hdGNoIHRoZSBuYW1lICovCiB9Ci1TRUNUSU9OUwotewotICAvKiB1bndpbmQgZXhpdCBzZWN0aW9ucyBtdXN0IGJlIGRpc2NhcmRlZCBiZWZvcmUgdGhlIHJlc3Qgb2YgdGhlCi0gICAgIHNlY3Rpb25zIGdldCBpbmNsdWRlZC4gKi8KLSAgL0RJU0NBUkQvIDogewotCSooLklBXzY0LnVud2luZC5leGl0LnRleHQpCi0JKiguSUFfNjQudW53aW5kX2luZm8uZXhpdC50ZXh0KQotCSooLmNvbW1lbnQpCi0JKigubm90ZSkKLSAgfQogCi0gIHYgPSBQQUdFX09GRlNFVDsJLyogdGhpcyBzeW1ib2wgaXMgaGVyZSB0byBtYWtlIGRlYnVnZ2luZyBlYXNpZXIuLi4gKi8KLSAgcGh5c19zdGFydCA9IF9zdGFydCAtIExPQURfT0ZGU0VUOworU0VDVElPTlMgeworCS8qCisJICogdW53aW5kIGV4aXQgc2VjdGlvbnMgbXVzdCBiZSBkaXNjYXJkZWQgYmVmb3JlCisJICogdGhlIHJlc3Qgb2YgdGhlIHNlY3Rpb25zIGdldCBpbmNsdWRlZC4KKwkgKi8KKwkvRElTQ0FSRC8gOiB7CisJCSooLklBXzY0LnVud2luZC5leGl0LnRleHQpCisJCSooLklBXzY0LnVud2luZF9pbmZvLmV4aXQudGV4dCkKKwkJKiguY29tbWVudCkKKwkJKigubm90ZSkKKwl9CiAKLSAgY29kZSA6IHsgfSA6Y29kZQotICAuID0gS0VSTkVMX1NUQVJUOworCXYgPSBQQUdFX09GRlNFVDsgLyogdGhpcyBzeW1ib2wgaXMgaGVyZSB0byBtYWtlIGRlYnVnZ2luZyBlYXNpZXIuLi4gKi8KKwlwaHlzX3N0YXJ0ID0gX3N0YXJ0IC0gTE9BRF9PRkZTRVQ7CiAKLSAgX3RleHQgPSAuOwotICBfc3RleHQgPSAuOworCWNvZGUgOiB7CisJfSA6Y29kZQorCS4gPSBLRVJORUxfU1RBUlQ7CiAKLSAgLnRleHQgOiBBVChBRERSKC50ZXh0KSAtIExPQURfT0ZGU0VUKQotICAgIHsKLQlJVlRfVEVYVAotCVRFWFRfVEVYVAotCVNDSEVEX1RFWFQKLQlMT0NLX1RFWFQKLQlLUFJPQkVTX1RFWFQKLQkqKC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAudGV4dDIgOiBBVChBRERSKC50ZXh0MikgLSBMT0FEX09GRlNFVCkKLQl7ICooLnRleHQyKSB9CisJX3RleHQgPSAuOworCV9zdGV4dCA9IC47CisKKwkudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9pdnRfdGV4dCA9IC47CisJCSooLnRleHQuLml2dCkKKwkJX19lbmRfaXZ0X3RleHQgPSAuOworCQlURVhUX1RFWFQKKwkJU0NIRURfVEVYVAorCQlMT0NLX1RFWFQKKwkJS1BST0JFU19URVhUCisJCSooLmdudS5saW5rb25jZS50KikKKwl9CisKKwkudGV4dDIgOiBBVChBRERSKC50ZXh0MikgLSBMT0FEX09GRlNFVCkJeworCQkqKC50ZXh0MikKKwl9CisKICNpZmRlZiBDT05GSUdfU01QCi0gIC50ZXh0Li5sb2NrIDogQVQoQUREUigudGV4dC4ubG9jaykgLSBMT0FEX09GRlNFVCkKLQl7ICooLnRleHQuLmxvY2spIH0KKwkudGV4dC4ubG9jayA6IEFUKEFERFIoLnRleHQuLmxvY2spIC0gTE9BRF9PRkZTRVQpIHsKKwkJKigudGV4dC4ubG9jaykKKwl9CiAjZW5kaWYKLSAgX2V0ZXh0ID0gLjsKKwlfZXRleHQgPSAuOwogCi0gIC8qIFJlYWQtb25seSBkYXRhICovCisJLyoKKwkgKiBSZWFkLW9ubHkgZGF0YQorCSAqLworCU5PVEVTIDpjb2RlIDpub3RlICAgICAgIC8qIHB1dCAubm90ZXMgaW4gdGV4dCBhbmQgbWFyayBpbiBQVF9OT1RFICAqLworCWNvZGVfY29udGludWVzIDogeworCX0gOiBjb2RlICAgICAgICAgICAgICAgLyogc3dpdGNoIGJhY2sgdG8gcmVndWxhciBwcm9ncmFtLi4uICAqLwogCi0gIE5PVEVTIDpjb2RlIDpub3RlCQkvKiBwdXQgLm5vdGVzIGluIHRleHQgYW5kIG1hcmsgaW4gUFRfTk9URSAgKi8KLSAgY29kZV9jb250aW51ZXMgOiB7fSA6Y29kZQkvKiBzd2l0Y2ggYmFjayB0byByZWd1bGFyIHByb2dyYW0uLi4gICovCisJRVhDRVBUSU9OX1RBQkxFKDE2KQogCi0gIEVYQ0VQVElPTl9UQUJMRSgxNikKLQotICAvKiBNQ0EgdGFibGUgKi8KLSAgLiA9IEFMSUdOKDE2KTsKLSAgX19tY2FfdGFibGUgOiBBVChBRERSKF9fbWNhX3RhYmxlKSAtIExPQURfT0ZGU0VUKQotCXsKLQkgIF9fc3RhcnRfX19tY2FfdGFibGUgPSAuOwotCSAgKihfX21jYV90YWJsZSkKLQkgIF9fc3RvcF9fX21jYV90YWJsZSA9IC47CisJLyogTUNBIHRhYmxlICovCisJLiA9IEFMSUdOKDE2KTsKKwlfX21jYV90YWJsZSA6IEFUKEFERFIoX19tY2FfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9fX21jYV90YWJsZSA9IC47CisJCSooX19tY2FfdGFibGUpCisJCV9fc3RvcF9fX21jYV90YWJsZSA9IC47CiAJfQogCi0gIC5kYXRhLi5wYXRjaC5waHlzX3N0YWNrX3JlZyA6IEFUKEFERFIoLmRhdGEuLnBhdGNoLnBoeXNfc3RhY2tfcmVnKSAtIExPQURfT0ZGU0VUKQotCXsKLQkgIF9fc3RhcnRfX19waHlzX3N0YWNrX3JlZ19wYXRjaGxpc3QgPSAuOwotCSAgKiguZGF0YS4ucGF0Y2gucGh5c19zdGFja19yZWcpCi0JICBfX2VuZF9fX3BoeXNfc3RhY2tfcmVnX3BhdGNobGlzdCA9IC47CisJLmRhdGEuLnBhdGNoLnBoeXNfc3RhY2tfcmVnIDogQVQoQUREUiguZGF0YS4ucGF0Y2gucGh5c19zdGFja19yZWcpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9fX3BoeXNfc3RhY2tfcmVnX3BhdGNobGlzdCA9IC47CisJCSooLmRhdGEuLnBhdGNoLnBoeXNfc3RhY2tfcmVnKQorCQlfX2VuZF9fX3BoeXNfc3RhY2tfcmVnX3BhdGNobGlzdCA9IC47CiAJfQogCi0gIC8qIEdsb2JhbCBkYXRhICovCi0gIF9kYXRhID0gLjsKKwkvKgorCSAqIEdsb2JhbCBkYXRhCisJICovCisJX2RhdGEgPSAuOwogCi0gIC8qIFVud2luZCBpbmZvICYgdGFibGU6ICovCi0gIC4gPSBBTElHTig4KTsKLSAgLklBXzY0LnVud2luZF9pbmZvIDogQVQoQUREUiguSUFfNjQudW53aW5kX2luZm8pIC0gTE9BRF9PRkZTRVQpCi0JeyAqKC5JQV82NC51bndpbmRfaW5mbyopIH0KLSAgLklBXzY0LnVud2luZCA6IEFUKEFERFIoLklBXzY0LnVud2luZCkgLSBMT0FEX09GRlNFVCkKLQl7Ci0JICBfX3N0YXJ0X3Vud2luZCA9IC47Ci0JICAqKC5JQV82NC51bndpbmQqKQotCSAgX19lbmRfdW53aW5kID0gLjsKKwkvKiBVbndpbmQgaW5mbyAmIHRhYmxlOiAqLworCS4gPSBBTElHTig4KTsKKwkuSUFfNjQudW53aW5kX2luZm8gOiBBVChBRERSKC5JQV82NC51bndpbmRfaW5mbykgLSBMT0FEX09GRlNFVCkgeworCQkqKC5JQV82NC51bndpbmRfaW5mbyopCisJfQorCS5JQV82NC51bndpbmQgOiBBVChBRERSKC5JQV82NC51bndpbmQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF91bndpbmQgPSAuOworCQkqKC5JQV82NC51bndpbmQqKQorCQlfX2VuZF91bndpbmQgPSAuOwogCX0gOmNvZGUgOnVud2luZAotICBjb2RlX2NvbnRpbnVlczIgOiB7fSA6IGNvZGUKKwljb2RlX2NvbnRpbnVlczIgOiB7CisJfSA6IGNvZGUKIAotICBST0RBVEEKKwlST0RBVEEKIAotICAub3BkIDogQVQoQUREUigub3BkKSAtIExPQURfT0ZGU0VUKQotCXsgKigub3BkKSB9Ci0KLSAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBhbmQgZGF0YTogKi8KLQotICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgX19pbml0X2JlZ2luID0gLjsKLQotICBJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCi0gIElOSVRfREFUQV9TRUNUSU9OKDE2KQotCi0gIC5kYXRhLi5wYXRjaC52dG9wIDogQVQoQUREUiguZGF0YS4ucGF0Y2gudnRvcCkgLSBMT0FEX09GRlNFVCkKLQl7Ci0JICBfX3N0YXJ0X19fdnRvcF9wYXRjaGxpc3QgPSAuOwotCSAgKiguZGF0YS4ucGF0Y2gudnRvcCkKLQkgIF9fZW5kX19fdnRvcF9wYXRjaGxpc3QgPSAuOworCS5vcGQgOiBBVChBRERSKC5vcGQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJKigub3BkKQogCX0KIAotICAuZGF0YS4ucGF0Y2gucnNlIDogQVQoQUREUiguZGF0YS4ucGF0Y2gucnNlKSAtIExPQURfT0ZGU0VUKQotCXsKLQkgIF9fc3RhcnRfX19yc2VfcGF0Y2hsaXN0ID0gLjsKLQkgICooLmRhdGEuLnBhdGNoLnJzZSkKLQkgIF9fZW5kX19fcnNlX3BhdGNobGlzdCA9IC47CisJLyoKKwkgKiBJbml0aWFsaXphdGlvbiBjb2RlIGFuZCBkYXRhOgorCSAqLworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCV9faW5pdF9iZWdpbiA9IC47CisKKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCisJSU5JVF9EQVRBX1NFQ1RJT04oMTYpCisKKwkuZGF0YS4ucGF0Y2gudnRvcCA6IEFUKEFERFIoLmRhdGEuLnBhdGNoLnZ0b3ApIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9fX3Z0b3BfcGF0Y2hsaXN0ID0gLjsKKwkJKiguZGF0YS4ucGF0Y2gudnRvcCkKKwkJX19lbmRfX192dG9wX3BhdGNobGlzdCA9IC47CiAJfQogCi0gIC5kYXRhLi5wYXRjaC5tY2tpbmxleV9lOSA6IEFUKEFERFIoLmRhdGEuLnBhdGNoLm1ja2lubGV5X2U5KSAtIExPQURfT0ZGU0VUKQotCXsKLQkgIF9fc3RhcnRfX19tY2tpbmxleV9lOV9idW5kbGVzID0gLjsKLQkgICooLmRhdGEuLnBhdGNoLm1ja2lubGV5X2U5KQotCSAgX19lbmRfX19tY2tpbmxleV9lOV9idW5kbGVzID0gLjsKKwkuZGF0YS4ucGF0Y2gucnNlIDogQVQoQUREUiguZGF0YS4ucGF0Y2gucnNlKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc3RhcnRfX19yc2VfcGF0Y2hsaXN0ID0gLjsKKwkJKiguZGF0YS4ucGF0Y2gucnNlKQorCQlfX2VuZF9fX3JzZV9wYXRjaGxpc3QgPSAuOworCX0KKworCS5kYXRhLi5wYXRjaC5tY2tpbmxleV9lOSA6IEFUKEFERFIoLmRhdGEuLnBhdGNoLm1ja2lubGV5X2U5KSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc3RhcnRfX19tY2tpbmxleV9lOV9idW5kbGVzID0gLjsKKwkJKiguZGF0YS4ucGF0Y2gubWNraW5sZXlfZTkpCisJCV9fZW5kX19fbWNraW5sZXlfZTlfYnVuZGxlcyA9IC47CiAJfQogCiAjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlQpCi0gIC4gPSBBTElHTigxNik7Ci0gIC5wYXJhdmlydF9idW5kbGVzIDogQVQoQUREUigucGFyYXZpcnRfYnVuZGxlcykgLSBMT0FEX09GRlNFVCkKLQl7Ci0JICBfX3N0YXJ0X3BhcmF2aXJ0X2J1bmRsZXMgPSAuOwotICAgICAgICAgICooLnBhcmF2aXJ0X2J1bmRsZXMpCi0JICBfX3N0b3BfcGFyYXZpcnRfYnVuZGxlcyA9IC47CisJLiA9IEFMSUdOKDE2KTsKKwkucGFyYXZpcnRfYnVuZGxlcyA6IEFUKEFERFIoLnBhcmF2aXJ0X2J1bmRsZXMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9wYXJhdmlydF9idW5kbGVzID0gLjsKKwkJKigucGFyYXZpcnRfYnVuZGxlcykKKwkJX19zdG9wX3BhcmF2aXJ0X2J1bmRsZXMgPSAuOwogCX0KLSAgLiA9IEFMSUdOKDE2KTsKLSAgLnBhcmF2aXJ0X2luc3RzIDogQVQoQUREUigucGFyYXZpcnRfaW5zdHMpIC0gTE9BRF9PRkZTRVQpCi0JewotCSAgX19zdGFydF9wYXJhdmlydF9pbnN0cyA9IC47Ci0gICAgICAgICAgKigucGFyYXZpcnRfaW5zdHMpCi0JICBfX3N0b3BfcGFyYXZpcnRfaW5zdHMgPSAuOworCS4gPSBBTElHTigxNik7CisJLnBhcmF2aXJ0X2luc3RzIDogQVQoQUREUigucGFyYXZpcnRfaW5zdHMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9wYXJhdmlydF9pbnN0cyA9IC47CisJCSooLnBhcmF2aXJ0X2luc3RzKQorCQlfX3N0b3BfcGFyYXZpcnRfaW5zdHMgPSAuOwogCX0KLSAgLiA9IEFMSUdOKDE2KTsKLSAgLnBhcmF2aXJ0X2JyYW5jaGVzIDogQVQoQUREUigucGFyYXZpcnRfYnJhbmNoZXMpIC0gTE9BRF9PRkZTRVQpCi0JewotCSAgX19zdGFydF9wYXJhdmlydF9icmFuY2hlcyA9IC47Ci0JICAqKC5wYXJhdmlydF9icmFuY2hlcykKLQkgIF9fc3RvcF9wYXJhdmlydF9icmFuY2hlcyA9IC47CisJLiA9IEFMSUdOKDE2KTsKKwkucGFyYXZpcnRfYnJhbmNoZXMgOiBBVChBRERSKC5wYXJhdmlydF9icmFuY2hlcykgLSBMT0FEX09GRlNFVCkgeworCQlfX3N0YXJ0X3BhcmF2aXJ0X2JyYW5jaGVzID0gLjsKKwkJKigucGFyYXZpcnRfYnJhbmNoZXMpCisJCV9fc3RvcF9wYXJhdmlydF9icmFuY2hlcyA9IC47CiAJfQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpCi0gIC8qIE1hY2hpbmUgVmVjdG9yICovCi0gIC4gPSBBTElHTigxNik7Ci0gIC5tYWNodmVjIDogQVQoQUREUigubWFjaHZlYykgLSBMT0FEX09GRlNFVCkKLQl7Ci0JICBtYWNodmVjX3N0YXJ0ID0gLjsKLQkgICooLm1hY2h2ZWMpCi0JICBtYWNodmVjX2VuZCA9IC47CisJLyogTWFjaGluZSBWZWN0b3IgKi8KKwkuID0gQUxJR04oMTYpOworCS5tYWNodmVjIDogQVQoQUREUigubWFjaHZlYykgLSBMT0FEX09GRlNFVCkgeworCQltYWNodmVjX3N0YXJ0ID0gLjsKKwkJKigubWFjaHZlYykKKwkJbWFjaHZlY19lbmQgPSAuOwogCX0KICNlbmRpZgogCiAjaWZkZWYJQ09ORklHX1NNUAotICAuID0gQUxJR04oUEVSQ1BVX1BBR0VfU0laRSk7Ci0gIF9fY3B1MF9wZXJfY3B1ID0gLjsKLSAgLiA9IC4gKyBQRVJDUFVfUEFHRV9TSVpFOwkvKiBjcHUwIHBlci1jcHUgc3BhY2UgKi8KKwkuID0gQUxJR04oUEVSQ1BVX1BBR0VfU0laRSk7CisJX19jcHUwX3Blcl9jcHUgPSAuOworCS4gPSAuICsgUEVSQ1BVX1BBR0VfU0laRTsgICAvKiBjcHUwIHBlci1jcHUgc3BhY2UgKi8KICNlbmRpZgogCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICBfX2luaXRfZW5kID0gLjsKKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwlfX2luaXRfZW5kID0gLjsKIAotICAuZGF0YS4ucGFnZV9hbGlnbmVkIDogQVQoQUREUiguZGF0YS4ucGFnZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKQotICAgICAgICB7Ci0JUEFHRV9BTElHTkVEX0RBVEEoUEFHRV9TSVpFKQotCSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JICBfX3N0YXJ0X2dhdGVfc2VjdGlvbiA9IC47Ci0JICAqKC5kYXRhLi5nYXRlKQotCSAgX19zdG9wX2dhdGVfc2VjdGlvbiA9IC47CisJLmRhdGEuLnBhZ2VfYWxpZ25lZCA6IEFUKEFERFIoLmRhdGEuLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgeworCQlQQUdFX0FMSUdORURfREFUQShQQUdFX1NJWkUpCisJCS4gPSBBTElHTihQQUdFX1NJWkUpOworCQlfX3N0YXJ0X2dhdGVfc2VjdGlvbiA9IC47CisJCSooLmRhdGEuLmdhdGUpCisJCV9fc3RvcF9nYXRlX3NlY3Rpb24gPSAuOwogI2lmZGVmIENPTkZJR19YRU4KLQkgIC4gPSBBTElHTihQQUdFX1NJWkUpOwotCSAgX194ZW5fc3RhcnRfZ2F0ZV9zZWN0aW9uID0gLjsKLQkgICooLmRhdGEuLmdhdGUueGVuKQotCSAgX194ZW5fc3RvcF9nYXRlX3NlY3Rpb24gPSAuOworCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkJX194ZW5fc3RhcnRfZ2F0ZV9zZWN0aW9uID0gLjsKKwkJKiguZGF0YS4uZ2F0ZS54ZW4pCisJCV9feGVuX3N0b3BfZ2F0ZV9zZWN0aW9uID0gLjsKICNlbmRpZgogCX0KLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7CQkvKiBtYWtlIHN1cmUgdGhlIGdhdGUgcGFnZSBkb2Vzbid0IGV4cG9zZQotICAJCQkJICoga2VybmVsIGRhdGEKLQkJCQkgKi8KKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGUgZ2F0ZSBwYWdlIGRvZXNuJ3QgZXhwb3NlCisJICoga2VybmVsIGRhdGEKKwkgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAotICAvKiBQZXItY3B1IGRhdGE6ICovCi0gIC4gPSBBTElHTihQRVJDUFVfUEFHRV9TSVpFKTsKLSAgUEVSQ1BVX1ZBRERSKFBFUkNQVV9BRERSLCA6cGVyY3B1KQotICBfX3BoeXNfcGVyX2NwdV9zdGFydCA9IF9fcGVyX2NwdV9sb2FkOwotICAuID0gX19waHlzX3Blcl9jcHVfc3RhcnQgKyBQRVJDUFVfUEFHRV9TSVpFOwkvKiBlbnN1cmUgcGVyY3B1IGRhdGEgZml0cwotICAJCQkJCQkgKiBpbnRvIHBlcmNwdSBwYWdlIHNpemUKLQkJCQkJCSAqLworCS8qIFBlci1jcHUgZGF0YTogKi8KKwkuID0gQUxJR04oUEVSQ1BVX1BBR0VfU0laRSk7CisJUEVSQ1BVX1ZBRERSKFBFUkNQVV9BRERSLCA6cGVyY3B1KQorCV9fcGh5c19wZXJfY3B1X3N0YXJ0ID0gX19wZXJfY3B1X2xvYWQ7CisJLyoKKwkgKiBlbnN1cmUgcGVyY3B1IGRhdGEgZml0cworCSAqIGludG8gcGVyY3B1IHBhZ2Ugc2l6ZQorCSAqLworCS4gPSBfX3BoeXNfcGVyX2NwdV9zdGFydCArIFBFUkNQVV9QQUdFX1NJWkU7CiAKLSAgZGF0YSA6IHsgfSA6ZGF0YQotICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpCi0JeworCWRhdGEgOiB7CisJfSA6ZGF0YQorCS5kYXRhIDogQVQoQUREUiguZGF0YSkgLSBMT0FEX09GRlNFVCkgewogCQlJTklUX1RBU0tfREFUQShQQUdFX1NJWkUpCiAJCUNBQ0hFTElORV9BTElHTkVEX0RBVEEoU01QX0NBQ0hFX0JZVEVTKQogCQlSRUFEX01PU1RMWV9EQVRBKFNNUF9DQUNIRV9CWVRFUykKQEAgLTIxMywyNiArMjE4LDM3IEBACiAJCUNPTlNUUlVDVE9SUwogCX0KIAotICAuID0gQUxJR04oMTYpOwkvKiBncCBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZCBmb3IgZXhjLiB0YWJsZSAqLwotICAuZ290IDogQVQoQUREUiguZ290KSAtIExPQURfT0ZGU0VUKQotCXsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIF9fZ3AgPSBBRERSKC5nb3QpICsgMHgyMDAwMDA7Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhIDogQVQoQUREUiguc2RhdGEpIC0gTE9BRF9PRkZTRVQpCi0JeyAqKC5zZGF0YSkgKiguc2RhdGExKSAqKC5zcmRhdGEpIH0KLSAgX2VkYXRhICA9ICAuOworCS4gPSBBTElHTigxNik7CS8qIGdwIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkIGZvciBleGMuIHRhYmxlICovCisJLmdvdCA6IEFUKEFERFIoLmdvdCkgLSBMT0FEX09GRlNFVCkgeworCQkqKC5nb3QucGx0KQorCQkqKC5nb3QpCisJfQorCV9fZ3AgPSBBRERSKC5nb3QpICsgMHgyMDAwMDA7CiAKLSAgQlNTX1NFQ1RJT04oMCwgMCwgMCkKKwkvKgorCSAqIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsCisJICogc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMgY2FuIGFjY2VzcworCSAqIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlCisJICogdW5pbml0aWFsaXplZCwgc28gd2UgY2FuIHNob3J0ZW4gdGhlCisJICogb24tZGlzayBzZWdtZW50IHNpemUuCisJICovCisJLnNkYXRhIDogQVQoQUREUiguc2RhdGEpIC0gTE9BRF9PRkZTRVQpIHsKKwkJKiguc2RhdGEpCisJCSooLnNkYXRhMSkKKwkJKiguc3JkYXRhKQorCX0KKwlfZWRhdGEgID0gIC47CiAKLSAgX2VuZCA9IC47CisJQlNTX1NFQ1RJT04oMCwgMCwgMCkKIAotICBjb2RlIDogeyB9IDpjb2RlCisJX2VuZCA9IC47CiAKLSAgU1RBQlNfREVCVUcKLSAgRFdBUkZfREVCVUcKKwljb2RlIDogeworCX0gOmNvZGUKIAotICAvKiBEZWZhdWx0IGRpc2NhcmRzICovCi0gIERJU0NBUkRTCisJU1RBQlNfREVCVUcKKwlEV0FSRl9ERUJVRworCisJLyogRGVmYXVsdCBkaXNjYXJkcyAqLworCURJU0NBUkRTCiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKaW5kZXggMjFiNzAxMzcuLmY1NmE2MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0va3ZtLWlhNjQuYworKysgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKQEAgLTcyNSw4ICs3MjUsNiBAQAogCWludCByOwogCXNpZ3NldF90IHNpZ3NhdmVkOwogCi0JdmNwdV9sb2FkKHZjcHUpOwotCiAJaWYgKHZjcHUtPnNpZ3NldF9hY3RpdmUpCiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmdmNwdS0+c2lnc2V0LCAmc2lnc2F2ZWQpOwogCkBAIC03NDgsNyArNzQ2LDYgQEAKIAlpZiAodmNwdS0+c2lnc2V0X2FjdGl2ZSkKIAkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzaWdzYXZlZCwgTlVMTCk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtODgzLDggKzg4MCw2IEBACiAJc3RydWN0IHZwZCAqdnBkID0gdG9faG9zdCh2Y3B1LT5rdm0sIHZjcHUtPmFyY2gudnBkKTsKIAlpbnQgaTsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXZwZC0+dmdyW2ldID0gcmVncy0+dnBkLnZncltpXTsKIAkJdnBkLT52YmdyW2ldID0gcmVncy0+dnBkLnZiZ3JbaV07CkBAIC05MzEsOCArOTI2LDYgQEAKIAl2Y3B1LT5hcmNoLml0Y19vZmZzZXQgPSByZWdzLT5zYXZlZF9pdGMgLSBrdm1fZ2V0X2l0Yyh2Y3B1KTsKIAlzZXRfYml0KEtWTV9SRVFfUkVTVU1FLCAmdmNwdS0+cmVxdWVzdHMpOwogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzNyw3ICsxMjMwLDcgQEAKIAlwX2N0eC0+Y3JbMl0gPSAodW5zaWduZWQgbG9uZylrdm1fdm1tX2luZm8tPnZtbV9pdnQ7CiAJcF9jdHgtPmNyWzhdID0gMHgzYzsKIAotCS8qSW5pdGlsaXplIHJlZ2lvbiByZWdpc3RlciovCisJLypJbml0aWFsaXplIHJlZ2lvbiByZWdpc3RlciovCiAJcF9jdHgtPnJyWzBdID0gMHgzMDsKIAlwX2N0eC0+cnJbMV0gPSAweDMwOwogCXBfY3R4LT5yclsyXSA9IDB4MzA7CkBAIC0xMjQ2LDcgKzEyMzksNyBAQAogCXBfY3R4LT5ycls1XSA9IDB4MzA7CiAJcF9jdHgtPnJyWzddID0gMHgzMDsKIAotCS8qSW5pdGlsaXplIGJyYW5jaCByZWdpc3RlciAwKi8KKwkvKkluaXRpYWxpemUgYnJhbmNoIHJlZ2lzdGVyIDAqLwogCXBfY3R4LT5iclswXSA9ICoodW5zaWduZWQgbG9uZyAqKWt2bV92bW1faW5mby0+dm1tX2VudHJ5OwogCiAJdmNwdS0+YXJjaC52bW1fcnIgPSBrdm0tPmFyY2gudm1tX2luaXRfcnI7CkBAIC0xNzA3LDcgKzE3MDAsNyBAQAogCUJVR19PTighbW9kdWxlKTsKIAogCWlmICgha3ZtX3ZtbV9iYXNlKSB7Ci0JCXByaW50aygia3ZtOiBrdm0gYXJlYSBoYXNuJ3QgYmVlbiBpbml0aWxpemVkIHlldCEhXG4iKTsKKwkJcHJpbnRrKCJrdm06IGt2bSBhcmVhIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldCEhXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xODAyLDM1ICsxNzk1LDI0IEBACiAJa3ZtX3ZtbV9pbmZvID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBrdm1faWE2NF9zeW5jX2RpcnR5X2xvZyhzdHJ1Y3Qga3ZtICprdm0sCi0JCXN0cnVjdCBrdm1fZGlydHlfbG9nICpsb2cpCitzdGF0aWMgdm9pZCBrdm1faWE2NF9zeW5jX2RpcnR5X2xvZyhzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpCiB7Ci0Jc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDsKLQlpbnQgciwgaTsKKwlpbnQgaTsKIAlsb25nIGJhc2U7CiAJdW5zaWduZWQgbG9uZyBuOwogCXVuc2lnbmVkIGxvbmcgKmRpcnR5X2JpdG1hcCA9ICh1bnNpZ25lZCBsb25nICopKGt2bS0+YXJjaC52bV9iYXNlICsKIAkJCW9mZnNldG9mKHN0cnVjdCBrdm1fdm1fZGF0YSwga3ZtX21lbV9kaXJ0eV9sb2cpKTsKIAotCXIgPSAtRUlOVkFMOwotCWlmIChsb2ctPnNsb3QgPj0gS1ZNX01FTU9SWV9TTE9UUykKLQkJZ290byBvdXQ7Ci0KLQltZW1zbG90ID0gJmt2bS0+bWVtc2xvdHMtPm1lbXNsb3RzW2xvZy0+c2xvdF07Ci0JciA9IC1FTk9FTlQ7Ci0JaWYgKCFtZW1zbG90LT5kaXJ0eV9iaXRtYXApCi0JCWdvdG8gb3V0OwotCiAJbiA9IGt2bV9kaXJ0eV9iaXRtYXBfYnl0ZXMobWVtc2xvdCk7CiAJYmFzZSA9IG1lbXNsb3QtPmJhc2VfZ2ZuIC8gQklUU19QRVJfTE9ORzsKIAorCXNwaW5fbG9jaygma3ZtLT5hcmNoLmRpcnR5X2xvZ19sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgbi9zaXplb2YobG9uZyk7ICsraSkgewogCQltZW1zbG90LT5kaXJ0eV9iaXRtYXBbaV0gPSBkaXJ0eV9iaXRtYXBbYmFzZSArIGldOwogCQlkaXJ0eV9iaXRtYXBbYmFzZSArIGldID0gMDsKIAl9Ci0JciA9IDA7Ci1vdXQ6Ci0JcmV0dXJuIHI7CisJc3Bpbl91bmxvY2soJmt2bS0+YXJjaC5kaXJ0eV9sb2dfbG9jayk7CiB9CiAKIGludCBrdm1fdm1faW9jdGxfZ2V0X2RpcnR5X2xvZyhzdHJ1Y3Qga3ZtICprdm0sCkBAIC0xODQyLDEyICsxODI0LDE3IEBACiAJaW50IGlzX2RpcnR5ID0gMDsKIAogCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7Ci0Jc3Bpbl9sb2NrKCZrdm0tPmFyY2guZGlydHlfbG9nX2xvY2spOwogCi0JciA9IGt2bV9pYTY0X3N5bmNfZGlydHlfbG9nKGt2bSwgbG9nKTsKLQlpZiAocikKKwlyID0gLUVJTlZBTDsKKwlpZiAobG9nLT5zbG90ID49IEtWTV9NRU1PUllfU0xPVFMpCiAJCWdvdG8gb3V0OwogCisJbWVtc2xvdCA9ICZrdm0tPm1lbXNsb3RzLT5tZW1zbG90c1tsb2ctPnNsb3RdOworCXIgPSAtRU5PRU5UOworCWlmICghbWVtc2xvdC0+ZGlydHlfYml0bWFwKQorCQlnb3RvIG91dDsKKworCWt2bV9pYTY0X3N5bmNfZGlydHlfbG9nKGt2bSwgbWVtc2xvdCk7CiAJciA9IGt2bV9nZXRfZGlydHlfbG9nKGt2bSwgbG9nLCAmaXNfZGlydHkpOwogCWlmIChyKQogCQlnb3RvIG91dDsKQEAgLTE4NTUsMTQgKzE4NDIsMTIgQEAKIAkvKiBJZiBub3RoaW5nIGlzIGRpcnR5LCBkb24ndCBib3RoZXIgbWVzc2luZyB3aXRoIHBhZ2UgdGFibGVzLiAqLwogCWlmIChpc19kaXJ0eSkgewogCQlrdm1fZmx1c2hfcmVtb3RlX3RsYnMoa3ZtKTsKLQkJbWVtc2xvdCA9ICZrdm0tPm1lbXNsb3RzLT5tZW1zbG90c1tsb2ctPnNsb3RdOwogCQluID0ga3ZtX2RpcnR5X2JpdG1hcF9ieXRlcyhtZW1zbG90KTsKIAkJbWVtc2V0KG1lbXNsb3QtPmRpcnR5X2JpdG1hcCwgMCwgbik7CiAJfQogCXIgPSAwOwogb3V0OgogCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlzcGluX3VubG9jaygma3ZtLT5hcmNoLmRpcnR5X2xvZ19sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTk1MywxMSArMTkzOCw2IEBACiAJcmV0dXJuIHZjcHUtPmFyY2gudGltZXJfZmlyZWQ7CiB9CiAKLWdmbl90IHVuYWxpYXNfZ2ZuKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQotewotCXJldHVybiBnZm47Ci19Ci0KIGludCBrdm1fYXJjaF92Y3B1X3J1bm5hYmxlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlyZXR1cm4gKHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFKSB8fApAQCAtMTk2Nyw5ICsxOTQ3LDcgQEAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9tcHN0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgICAgc3RydWN0IGt2bV9tcF9zdGF0ZSAqbXBfc3RhdGUpCiB7Ci0JdmNwdV9sb2FkKHZjcHUpOwogCW1wX3N0YXRlLT5tcF9zdGF0ZSA9IHZjcHUtPmFyY2gubXBfc3RhdGU7Ci0JdmNwdV9wdXQodmNwdSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwMDAsMTAgKzE5NzgsOCBAQAogewogCWludCByID0gMDsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKIAl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gbXBfc3RhdGUtPm1wX3N0YXRlOwogCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9VTklOSVRJQUxJWkVEKQogCQlyID0gdmNwdV9yZXNldCh2Y3B1KTsKLQl2Y3B1X3B1dCh2Y3B1KTsKIAlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCmluZGV4IGViZmRkNmEuLjBjNzJkZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJICogUmVsZWFzZSBYSU8gcmVzb3VyY2VzIGZvciB0aGUgb2xkIE1TSSBQQ0kgYWRkcmVzcwogCSAqLwogCi0JcmVhZF9tc2lfbXNnKGlycSwgJm1zZyk7CisJZ2V0X2NhY2hlZF9tc2lfbXNnKGlycSwgJm1zZyk7CiAgICAgICAgIHNuX3BkZXYgPSAoc3RydWN0IHBjaWRldl9pbmZvICopc25faXJxX2luZm8tPmlycV9wY2lpb2luZm87CiAJcGRldiA9IHNuX3BkZXYtPnBkaV9saW51eF9wY2lkZXY7CiAJcHJvdmlkZXIgPSBTTl9QQ0lERVZfQlVTUFJPVklERVIocGRldik7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKaW5kZXggZDAwZGZjMS4uZGJjNGNiZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwpAQCAtNTA3LDcgKzUwNyw3IEBACiAJY25vZGVpZF90IGNub2RlOwogCiAJLyoKLQkgKiBBbGxvY2F0ZSAmIGluaXRhbGl6ZSB0aGUgbm9kZXBkYSBmb3IgZWFjaCBub2RlLgorCSAqIEFsbG9jYXRlICYgaW5pdGlhbGl6ZSB0aGUgbm9kZXBkYSBmb3IgZWFjaCBub2RlLgogCSAqLwogCWZvcl9lYWNoX29ubGluZV9ub2RlKGNub2RlKSB7CiAJCW5vZGVwZGFpbmRyW2Nub2RlXSA9CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvTWFrZWZpbGUgYi9hcmNoL20zMnIvTWFrZWZpbGUKaW5kZXggNDY5NzY2Yi4uOGZmNWJhMCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL01ha2VmaWxlCisrKyBiL2FyY2gvbTMyci9NYWtlZmlsZQpAQCAtMTIsOCArMTIsOCBAQAogTERGTEFHU192bWxpbnV4CTo9CiAKIEtCVUlMRF9DRkxBR1MgKz0gLXBpcGUgLWZuby1zY2hlZHVsZS1pbnNucwotQ0ZMQUdTX0tFUk5FTCArPSAtbW1vZGVsPW1lZGl1bQotQ0ZMQUdTX01PRFVMRSArPSAtbW1vZGVsPWxhcmdlCitLQlVJTERfQ0ZMQUdTX0tFUk5FTCArPSAtbW1vZGVsPW1lZGl1bQorS0JVSUxEX0NGTEFHU19NT0RVTEUgKz0gLW1tb2RlbD1sYXJnZQogCiBpZmRlZiBDT05GSUdfQ0hJUF9WREVDMgogY2ZsYWdzLSQoQ09ORklHX0lTQV9NMzJSMikJKz0gLUROT19GUFUgLVdhLC1iaXRpbnN0CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL01ha2VmaWxlIGIvYXJjaC9tNjhrL01ha2VmaWxlCmluZGV4IDU3MGQ4NWMuLmIwNmE3ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDcgQEAKICMgb3ZlcnJpZGUgdG9wIGxldmVsIG1ha2VmaWxlCiBBUyArPSAtbTY4MDIwCiBMREZMQUdTIDo9IC1tIG02OGtlbGYKLUxERkxBR1NfTU9EVUxFICs9IC1UICQoc3JjdHJlZSkvYXJjaC9tNjhrL2tlcm5lbC9tb2R1bGUubGRzCitLQlVJTERfTERGTEFHU19NT0RVTEUgKz0gLVQgJChzcmN0cmVlKS9hcmNoL202OGsva2VybmVsL21vZHVsZS5sZHMKIGlmbmVxICgkKFNVQkFSQ0gpLCQoQVJDSCkpCiAJaWZlcSAoJChDUk9TU19DT01QSUxFKSwpCiAJCUNST1NTX0NPTVBJTEUgOj0gJChjYWxsIGNjLWNyb3NzLXByZWZpeCwgXApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2xvY2FsNjQuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnIGIvYXJjaC9taWNyb2JsYXplL0tjb25maWcKaW5kZXggMTRmMDNjZS4uNjkyZmRmYyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcKKysrIGIvYXJjaC9taWNyb2JsYXplL0tjb25maWcKQEAgLTE0LDkgKzE0LDEyIEBACiAJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKKwlzZWxlY3QgSEFWRV9BUkNIX0tHREIKIAlzZWxlY3QgSEFWRV9ETUFfQVRUUlMKIAlzZWxlY3QgSEFWRV9ETUFfQVBJX0RFQlVHCiAJc2VsZWN0IFRSQUNJTkdfU1VQUE9SVAorCXNlbGVjdCBPRgorCXNlbGVjdCBPRl9GTEFUVFJFRQogCiBjb25maWcgU1dBUAogCWRlZl9ib29sIG4KQEAgLTcyLDkgKzc1LDYgQEAKIGNvbmZpZyBIQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVAogCWRlZl9ib29sIHkKIAotY29uZmlnIERUQwotCWRlZl9ib29sIHkKLQogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKQEAgLTEyMSwxOCArMTIxLDYgQEAKIAkgIFNldCB0aGlzIHRvIGhhdmUgYXJndW1lbnRzIGZyb20gdGhlIGRlZmF1bHQga2VybmVsIGNvbW1hbmQgc3RyaW5nCiAJICBvdmVycmlkZSB0aG9zZSBwYXNzZWQgYnkgdGhlIGJvb3QgbG9hZGVyLgogCi1jb25maWcgT0YKLQlkZWZfYm9vbCB5Ci0Jc2VsZWN0IE9GX0ZMQVRUUkVFCi0KLWNvbmZpZyBQUk9DX0RFVklDRVRSRUUKLQlib29sICJTdXBwb3J0IGZvciBkZXZpY2UgdHJlZSBpbiAvcHJvYyIKLQlkZXBlbmRzIG9uIFBST0NfRlMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgZGV2aWNlLXRyZWUgZGlyZWN0b3J5IHVuZGVyIC9wcm9jIHdoaWNoIGNvbnRhaW5zCi0JICBhbiBpbWFnZSBvZiB0aGUgZGV2aWNlIHRyZWUgdGhhdCB0aGUga2VybmVsIGNvcGllcyBmcm9tIE9wZW4KLQkgIEZpcm13YXJlIG9yIG90aGVyIGJvb3QgZmlybXdhcmUuIElmIHVuc3VyZSwgc2F5IFkgaGVyZS4KLQogZW5kbWVudQogCiBtZW51ICJBZHZhbmNlZCBzZXR1cCIKQEAgLTIyMCw2ICsyMDgsMzYgQEAKIAloZXggIlNpemUgb2YgdXNlciB0YXNrIHNwYWNlIiBpZiBUQVNLX1NJWkVfQk9PTAogCWRlZmF1bHQgIjB4ODAwMDAwMDAiCiAKK2Nob2ljZQorCXByb21wdCAiUGFnZSBzaXplIgorCWRlZmF1bHQgTUlDUk9CTEFaRV80S19QQUdFUworCWRlcGVuZHMgb24gQURWQU5DRURfT1BUSU9OUyAmJiAhTU1VCisJaGVscAorCSAgU2VsZWN0IHRoZSBrZXJuZWwgbG9naWNhbCBwYWdlIHNpemUuIEluY3JlYXNpbmcgdGhlIHBhZ2Ugc2l6ZQorCSAgd2lsbCByZWR1Y2Ugc29mdHdhcmUgb3ZlcmhlYWQgYXQgZWFjaCBwYWdlIGJvdW5kYXJ5LCBhbGxvdworCSAgaGFyZHdhcmUgcHJlZmV0Y2ggbWVjaGFuaXNtcyB0byBiZSBtb3JlIGVmZmVjdGl2ZSwgYW5kIGFsbG93CisJICBsYXJnZXIgZG1hIHRyYW5zZmVycyBpbmNyZWFzaW5nIElPIGVmZmljaWVuY3kgYW5kIHJlZHVjaW5nCisJICBvdmVyaGVhZC4gSG93ZXZlciB0aGUgdXRpbGl6YXRpb24gb2YgbWVtb3J5IHdpbGwgaW5jcmVhc2UuCisJICBGb3IgZXhhbXBsZSwgZWFjaCBjYWNoZWQgZmlsZSB3aWxsIHVzaW5nIGEgbXVsdGlwbGUgb2YgdGhlCisJICBwYWdlIHNpemUgdG8gaG9sZCBpdHMgY29udGVudHMgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCisJICBlbmQgb2YgZmlsZSBhbmQgdGhlIGVuZCBvZiBwYWdlIGlzIHdhc3RlZC4KKworCSAgSWYgdW5zdXJlLCBjaG9vc2UgNEtfUEFHRVMuCisKK2NvbmZpZyBNSUNST0JMQVpFXzRLX1BBR0VTCisJYm9vbCAiNGsgcGFnZSBzaXplIgorCitjb25maWcgTUlDUk9CTEFaRV84S19QQUdFUworCWJvb2wgIjhrIHBhZ2Ugc2l6ZSIKKworY29uZmlnIE1JQ1JPQkxBWkVfMTZLX1BBR0VTCisJYm9vbCAiMTZrIHBhZ2Ugc2l6ZSIKKworY29uZmlnIE1JQ1JPQkxBWkVfMzJLX1BBR0VTCisJYm9vbCAiMzJrIHBhZ2Ugc2l6ZSIKKworZW5kY2hvaWNlCisKIGVuZG1lbnUKIAogc291cmNlICJtbS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcuZGVidWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwppbmRleCA5ZGM3MDhhLi5lNmU1ZTBkIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwpAQCAtMTAsNiArMTAsNyBAQAogCiBjb25maWcgRUFSTFlfUFJJTlRLCiAJYm9vbCAiRWFybHkgcHJpbnRrIGZ1bmN0aW9uIGZvciBrZXJuZWwiCisJZGVwZW5kcyBvbiBTRVJJQUxfVUFSVExJVEVfQ09OU09MRQogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHR1cm5zIG9uL29mZiBlYXJseSBwcmludGsgbWVzc2FnZXMgdG8gY29uc29sZS4KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9NYWtlZmlsZSBiL2FyY2gvbWljcm9ibGF6ZS9NYWtlZmlsZQppbmRleCA3MmY2ZTg1Li41OTJjNzA3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUKKysrIGIvYXJjaC9taWNyb2JsYXplL01ha2VmaWxlCkBAIC0yNSw3ICsyNSw3IEBACiAgIGlmZXEgKCQoQ1BVX01BSk9SKSwzKQogICAgIENQVUZMQUdTLTEgKz0gLW1uby14bC1zb2Z0LW11bAogICBlbHNlCi0gICAgIyBVU0VfSFdfTVVMIGNhbiBiZSAwLCAxLCBvciAyLCBkZWZpbmluZyBhIGhlaXJhcmNoeSBvZiBIVyBNdWwgc3VwcG9ydC4KKyAgICAjIFVTRV9IV19NVUwgY2FuIGJlIDAsIDEsIG9yIDIsIGRlZmluaW5nIGEgaGllcmFyY2h5IG9mIEhXIE11bCBzdXBwb3J0LgogICAgIENQVUZMQUdTLSQoc3Vic3QgMSwsJChDT05GSUdfWElMSU5YX01JQ1JPQkxBWkUwX1VTRV9IV19NVUwpKSArPSAtbXhsLW11bHRpcGx5LWhpZ2gKICAgICBDUFVGTEFHUy0kKENPTkZJR19YSUxJTlhfTUlDUk9CTEFaRTBfVVNFX0hXX01VTCkgKz0gLW1uby14bC1zb2Z0LW11bAogICBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQppbmRleCA1N2Y1MGMyLi5iZTAxZDc4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQpAQCAtMzUsMTMgKzM1LDE0IEBACiAJY21kX2NwID0gY2F0ICQ8ID4kQCQyIHx8IChybSAtZiAkQCAmJiBlY2hvIGZhbHNlKQogCiBxdWlldF9jbWRfc3RyaXAgPSBTVFJJUCAgICRACi0gICAgICBjbWRfc3RyaXAgPSAkKFNUUklQKSAtSyBfc3RhcnQgLUsgX2VuZCAtSyBfX2xvZ19idWYgLUsgX2ZkdF9zdGFydCB2bWxpbnV4IC1vICRACisJY21kX3N0cmlwID0gJChTVFJJUCkgLUsgbWljcm9ibGF6ZV9zdGFydCAtSyBfZW5kIC1LIF9fbG9nX2J1ZiBcCisJCQkJLUsgX2ZkdF9zdGFydCB2bWxpbnV4IC1vICRACiAKIHF1aWV0X2NtZF91aW1hZ2UgPSBVSU1BR0UgICRALnViCi0gICAgICBjbWRfdWltYWdlID0gJChDT05GSUdfU0hFTEwpICQoTUtJTUFHRSkgLUEgbWljcm9ibGF6ZSAtTyBsaW51eCAtVCBrZXJuZWwgXAotICAgICAgICAgICAgICAgICAgIC1DIG5vbmUgLW4gJ0xpbnV4LSQoS0VSTkVMUkVMRUFTRSknIFwKLSAgICAgICAgICAgICAgICAgICAtYSAkKENPTkZJR19LRVJORUxfQkFTRV9BRERSKSAtZSAkKENPTkZJR19LRVJORUxfQkFTRV9BRERSKSBcCi0gICAgICAgICAgICAgICAgICAgLWQgJEAgJEAudWIKKwljbWRfdWltYWdlID0gJChDT05GSUdfU0hFTEwpICQoTUtJTUFHRSkgLUEgbWljcm9ibGF6ZSAtTyBsaW51eCAtVCBrZXJuZWwgXAorCQktQyBub25lIC1uICdMaW51eC0kKEtFUk5FTFJFTEVBU0UpJyBcCisJCS1hICQoQ09ORklHX0tFUk5FTF9CQVNFX0FERFIpIC1lICQoQ09ORklHX0tFUk5FTF9CQVNFX0FERFIpIFwKKwkJLWQgJEAgJEAudWIKIAogJChvYmopL3NpbXBsZUltYWdlLiU6IHZtbGludXggRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxjcCwudW5zdHJpcCkKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IGE2ZWRkMzU2Li43ZWJkOTU1IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTE3LDYgKzE3LDcgQEAKIAogLyogU29tZWJvZHkgZGVwZW5kcyBvbiB0aGlzOyBzaWdoLi4uICovCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAvKiBMb29rIGF0IERvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0ICovCiAKQEAgLTYwLDcgKzYxLDYgQEAKICNkZWZpbmUgaW52YWxpZGF0ZV9pY2FjaGUoKQkJCQltYmMtPmlpbigpOwogI2RlZmluZSBpbnZhbGlkYXRlX2ljYWNoZV9yYW5nZShzdGFydCwgZW5kKQkJbWJjLT5paW5yKHN0YXJ0LCBlbmQpOwogCi0KICNkZWZpbmUgZmx1c2hfaWNhY2hlX3VzZXJfcmFuZ2Uodm1hLCBwZywgYWRyLCBsZW4pCWZsdXNoX2ljYWNoZSgpOwogI2RlZmluZSBmbHVzaF9pY2FjaGVfcGFnZSh2bWEsIHBnKQkJCWRvIHsgfSB3aGlsZSAoMCkKIApAQCAtNzIsOSArNzIsMTUgQEAKICNkZWZpbmUgZmx1c2hfZGNhY2hlKCkJCQkJCW1iYy0+ZGZsKCk7CiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydCwgZW5kKQkJCW1iYy0+ZGZscihzdGFydCwgZW5kKTsKIAotI2RlZmluZSBBUkNIX0lNUExFTUVOVFNfRkxVU0hfRENBQ0hFX1BBR0UgMAotLyogRC1jYWNoZSBhbGlhc2luZyBwcm9ibGVtIGNhbid0IGhhcHBlbiAtIGNhY2hlIGlzIGJldHdlZW4gTU1VIGFuZCByYW0gKi8KLSNkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIEFSQ0hfSU1QTEVNRU5UU19GTFVTSF9EQ0FDSEVfUEFHRSAxCisvKiBNUzogV2UgaGF2ZSB0byBpbXBsZW1lbnQgaXQgYmVjYXVzZSBvZiByb290ZnMtamZmczIgaXNzdWUgb24gV0IgKi8KKyNkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkgXAorZG8geyBcCisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VfYWRkcmVzcyhwYWdlKTsgLyogdmlydHVhbCAqLyBcCisJYWRkciA9ICh1MzIpdmlydF90b19waHlzKCh2b2lkICopYWRkcik7IFwKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkKSAoYWRkciksICh1bnNpZ25lZCkgKGFkZHIpICsgUEFHRV9TSVpFKTsgXAorfSB3aGlsZSAoMCk7CisKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJZG8geyB9IHdoaWxlICgwKQogCkBAIC05Nyw4ICsxMDMsMTAgQEAKIAogI2RlZmluZSBjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQkJXAogZG8gewkJCQkJCQkJCVwKKwl1MzIgYWRkciA9IHZpcnRfdG9fcGh5cyhkc3QpOwkJCQkJXAorCWludmFsaWRhdGVfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCkgKGFkZHIpLCAodW5zaWduZWQpIChhZGRyKSArIChsZW4pKTtcCiAJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpOwkJCQkJXAotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQpIChkc3QpLCAodW5zaWduZWQpIChkc3QpICsgKGxlbikpOwlcCisJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCkgKGFkZHIpLCAodW5zaWduZWQpIChhZGRyKSArIChsZW4pKTtcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCB2YWRkciwgZHN0LCBzcmMsIGxlbikJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggMThiMzczMS4uNTA3Mzg5NSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTc5LDEyICs3OSw2IEBACiAJcmV0dXJuIG9wcy0+ZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOwogfQogCi0jaWZkZWYgQ09ORklHX1BDSQotLyogV2UgaGF2ZSBvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIHBjaV9zZXRfZG1hX21hc2soKSAqLwotI2RlZmluZSBIQVZFX0FSQ0hfUENJX1NFVF9ETUFfTUFTSwotCi0jZW5kaWYKLQogc3RhdGljIGlubGluZSBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKQogewogCXN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA3ZDRhY2YyLi43MzJjYWYxIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC03Nyw3ICs3Nyw3IEBACiAjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCiAjZW5kaWYKIAotI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQk0MDk2CisjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCVBBR0VfU0laRQogCiAKICNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKF9kZXN0LCBfcmVncykJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZXhjZXB0aW9ucy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbnMuaAppbmRleCA0YzdiNWQwLi42NDc5MDk3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZXhjZXB0aW9ucy5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9leGNlcHRpb25zLmgKQEAgLTE0LDYgKzE0LDExIEBACiAjZGVmaW5lIF9BU01fTUlDUk9CTEFaRV9FWENFUFRJT05TX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KKworI2lmbmRlZiBDT05GSUdfTU1VCisjZGVmaW5lIEVYX0hBTkRMRVJfU1RBQ0tfU0laCSg0KjE5KQorI2VuZGlmCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qIE1hY3JvcyB0byBlbmFibGUgYW5kIGRpc2FibGUgSFcgZXhjZXB0aW9ucyBpbiB0aGUgTVNSICovCkBAIC02NCwyMiArNjksNiBAQAogdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqZnAsIGxvbmcgZXJyKTsKIHZvaWQgX2V4Y2VwdGlvbihpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY29kZSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0tHREIpCi12b2lkICgqZGVidWdnZXIpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWludCAoKmRlYnVnZ2VyX2JwdCkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotaW50ICgqZGVidWdnZXJfc3N0ZXApKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWludCAoKmRlYnVnZ2VyX2lhYnJfbWF0Y2gpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWludCAoKmRlYnVnZ2VyX2RhYnJfbWF0Y2gpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXZvaWQgKCpkZWJ1Z2dlcl9mYXVsdF9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZWxzZQotI2RlZmluZSBkZWJ1Z2dlcihyZWdzKQkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgZGVidWdnZXJfYnB0KHJlZ3MpCQkwCi0jZGVmaW5lIGRlYnVnZ2VyX3NzdGVwKHJlZ3MpCQkwCi0jZGVmaW5lIGRlYnVnZ2VyX2lhYnJfbWF0Y2gocmVncykJMAotI2RlZmluZSBkZWJ1Z2dlcl9kYWJyX21hdGNoKHJlZ3MpCTAKLSNkZWZpbmUgZGVidWdnZXJfZmF1bHRfaGFuZGxlcgkJKCh2b2lkICgqKShzdHJ1Y3QgcHRfcmVncyAqKSkwKQotI2VuZGlmCi0KICNlbmRpZiAvKl9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX01JQ1JPQkxBWkVfRVhDRVBUSU9OU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggMzFhMzVjMy4uZWM1NTgzZCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMjcsMTcgKzI3LDYgQEAKIHN0cnVjdCBwdF9yZWdzOwogZXh0ZXJuIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAotLyoqCi0gKiBpcnFfb2ZfcGFyc2VfYW5kX21hcCAtIFBhcnNlIGFuZCBNYXAgYW4gaW50ZXJydXB0IGludG8gbGludXggdmlycSBzcGFjZQotICogQGRldmljZTogRGV2aWNlIG5vZGUgb2YgdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgbWFwcGVkCi0gKiBAaW5kZXg6IEluZGV4IG9mIHRoZSBpbnRlcnJ1cHQgdG8gbWFwCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgdGhhdCBjaGFpbnMgb2ZfaXJxX21hcF9vbmUoKSBhbmQKLSAqIGlycV9jcmVhdGVfb2ZfbWFwcGluZygpIHRvIG1ha2UgdGhpbmdzIGVhc2llciB0byBjYWxsZXJzCi0gKi8KLXN0cnVjdCBkZXZpY2Vfbm9kZTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXJxX29mX3BhcnNlX2FuZF9tYXAoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCk7Ci0KIC8qKiBGSVhNRSAtIG5vdCBpbXBsZW1lbnQKICAqIGlycV9kaXNwb3NlX21hcHBpbmcgLSBVbm1hcCBhbiBpbnRlcnJ1cHQKICAqIEB2aXJxOiBsaW51eCB2aXJxIG51bWJlciBvZiB0aGUgaW50ZXJydXB0IHRvIHVubWFwCkBAIC02MiwxNyArNTEsNCBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0LAogCQkJCQlpcnFfaHdfbnVtYmVyX3QgaHdpcnEpOwogCi0vKioKLSAqIGlycV9jcmVhdGVfb2ZfbWFwcGluZyAtIE1hcCBhIGhhcmR3YXJlIGludGVycnVwdCBpbnRvIGxpbnV4IHZpcnEgc3BhY2UKLSAqIEBjb250cm9sbGVyOiBEZXZpY2Ugbm9kZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAqIEBpbnNwZWM6IEludGVycnVwdCBzcGVjaWZpZXIgZnJvbSB0aGUgZGV2aWNlLXRyZWUKLSAqIEBpbnRzaXplOiBTaXplIG9mIHRoZSBpbnRlcnJ1cHQgc3BlY2lmaWVyIGZyb20gdGhlIGRldmljZS10cmVlCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXJxX2NyZWF0ZV9tYXBwaW5nIGV4Y2VwdCB0aGF0IGl0IHRha2VzCi0gKiBhcyBpbnB1dCBpbmZvcm1hdGlvbnMgc3RyYWlnaHQgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKHR5cGljYWxseSB0aGUgcmVzdWx0cwotICogb2YgdGhlIG9mX2lycV9tYXBfKigpIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX29mX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAotCQkJCQl1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplKTsKLQogI2VuZGlmIC8qIF9BU01fTUlDUk9CTEFaRV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2tnZGIuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9rZ2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiMTdkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9rZ2RiLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19NSUNST0JMQVpFX0tHREJfSF9fCisjZGVmaW5lIF9fTUlDUk9CTEFaRV9LR0RCX0hfXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIENBQ0hFX0ZMVVNIX0lTX1NBRkUJMQorI2RlZmluZSBCVUZNQVgJCQkyMDQ4CisKKy8qCisgKiAzMiAzMi1iaXQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAocjAtcjMxKQorICogIDYgMzItYml0IHNwZWNpYWwgcmVnaXN0ZXJzIChwYywgbXNyLCBlYXIsIGVzciwgZnNyLCBidHIpCisgKiAxMiAzMi1iaXQgUFZSCisgKiAgIDcgMzItYml0IE1NVSBSZWdzIChyZWRyLCBycGlkLCByenByLCBydGxieCwgcnRsYnN4LCBydGxibG8sIHJ0bGJoaSkKKyAqIC0tLS0tLQorICogIDU3IHJlZ2lzdGVycworICovCisjZGVmaW5lIE5VTVJFR0JZVEVTCSg1NyAqIDQpCisKKyNkZWZpbmUgQlJFQUtfSU5TVFJfU0laRQk0CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9rZ2RiX2JyZWFrcG9pbnQodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYnJraSByMTYsIDB4MTg7Iik7Cit9CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfX01JQ1JPQkxBWkVfS0dEQl9IX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL29mX2RldmljZS5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL29mX2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2NiOTgwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9vZl9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+Ci0gKgotICogYmFzZWQgb24gUG93ZXJQQyBvZl9kZXZpY2UuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfQVNNX01JQ1JPQkxBWkVfT0ZfREVWSUNFX0gKLSNkZWZpbmUgX0FTTV9NSUNST0JMQVpFX09GX0RFVklDRV9ICi0jaWZkZWYgX19LRVJORUxfXwotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLQotLyoKLSAqIFRoZSBvZl9kZXZpY2UgaXMgYSBraW5kIG9mICJiYXNlIGNsYXNzIiB0aGF0IGlzIGEgc3VwZXJzZXQgb2YKLSAqIHN0cnVjdCBkZXZpY2UgZm9yIHVzZSBieSBkZXZpY2VzIGF0dGFjaGVkIHRvIGFuIE9GIG5vZGUgYW5kCi0gKiBwcm9iZWQgdXNpbmcgT0YgcHJvcGVydGllcy4KLSAqLwotc3RydWN0IG9mX2RldmljZSB7Ci0Jc3RydWN0IGRldmljZQkJZGV2OyAvKiBHZW5lcmljIGRldmljZSBpbnRlcmZhY2UgKi8KLQlzdHJ1Y3QgcGRldl9hcmNoZGF0YQlhcmNoZGF0YTsKLX07Ci0KLWV4dGVybiBzc2l6ZV90IG9mX2RldmljZV9nZXRfbW9kYWxpYXMoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCi0JCQkJCWNoYXIgKnN0ciwgc3NpemVfdCBsZW4pOwotCi1leHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2aWNlX2FsbG9jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCSBjb25zdCBjaGFyICpidXNfaWQsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOwotCi1leHRlcm4gaW50IG9mX2RldmljZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudik7Ci0KLWV4dGVybiB2b2lkIG9mX2RldmljZV9tYWtlX2J1c19pZChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOwotCi0vKiBUaGlzIGlzIGp1c3QgaGVyZSBkdXJpbmcgdGhlIHRyYW5zaXRpb24gKi8KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfQVNNX01JQ1JPQkxBWkVfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9vZl9wbGF0Zm9ybS5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDkxMjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgotICoJCQk8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfQVNNX01JQ1JPQkxBWkVfT0ZfUExBVEZPUk1fSAotI2RlZmluZSBfQVNNX01JQ1JPQkxBWkVfT0ZfUExBVEZPUk1fSAotCi0vKiBUaGlzIGlzIGp1c3QgaGVyZSBkdXJpbmcgdGhlIHRyYW5zaXRpb24gKi8KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0vKgotICogVGhlIGxpc3Qgb2YgT0YgSURzIGJlbG93IGlzIHVzZWQgZm9yIG1hdGNoaW5nIGJ1cyB0eXBlcyBpbiB0aGUKLSAqIHN5c3RlbSB3aG9zZSBkZXZpY2VzIGFyZSB0byBiZSBleHBvc2VkIGFzIG9mX3BsYXRmb3JtX2RldmljZXMuCi0gKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsaXN0IHZhbGlkIGZvciBtb3N0IHBsYXRmb3Jtcy4gVGhpcyBmaWxlIHByb3ZpZGVzCi0gKiBmdW5jdGlvbnMgd2hvIGNhbiB0YWtlIGFuIGV4cGxpY2l0IGxpc3QgaWYgbmVjZXNzYXJ5IHRob3VnaAotICoKLSAqIFRoZSBzZWFyY2ggaXMgYWx3YXlzIHBlcmZvcm1lZCByZWN1cnNpdmVseSBsb29raW5nIGZvciBjaGlsZHJlbiBvZgotICogdGhlIHByb3ZpZGVkIGRldmljZV9ub2RlIGFuZCByZWN1cnNpdmVseSBpZiBzdWNoIGEgY2hpbGRyZW4gbWF0Y2hlcwotICogYSBidXMgdHlwZSBpbiB0aGUgbGlzdAotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2RlZmF1bHRfYnVzX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAudHlwZSA9ICJwbGI1IiwgfSwKLQl7IC50eXBlID0gInBsYjQiLCB9LAotCXsgLnR5cGUgPSAib3BiIiwgfSwKLQl7IC50eXBlID0gInNpbXBsZSIsIH0sCi0Je30sCi19OwotCi0vKiBQbGF0Zm9ybSBkZXZpY2VzIGFuZCBidXNzZXMgY3JlYXRpb24gKi8KLWV4dGVybiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCQljb25zdCBjaGFyICpidXNfaWQsCi0JCQkJCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOwotLyogcHNldWRvICJtYXRjaGVzIiB2YWx1ZSB0byBub3QgZG8gZGVlcCBwcm9iZSAqLwotI2RlZmluZSBPRl9OT19ERUVQX1BST0JFICgoc3RydWN0IG9mX2RldmljZV9pZCAqKS0xKQotCi1leHRlcm4gaW50IG9mX3BsYXRmb3JtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QsCi0JCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKLQkJCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOwotCi1leHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZShwaGFuZGxlIHBoKTsKLQotZXh0ZXJuIHZvaWQgb2ZfaW5zdGFudGlhdGVfcnRjKHZvaWQpOwotCi0jZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX09GX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IDQ2NGZmMzIuLjRmMjY4ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMjMsOCArMjMsMTYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCi0jZGVmaW5lIFBBR0VfU0hJRlQJKDEyKQotI2RlZmluZSBQQUdFX1NJWkUJKF9BQygxLCBVTCkgPDwgUEFHRV9TSElGVCkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUNST0JMQVpFXzMyS19QQUdFUykKKyNkZWZpbmUgUEFHRV9TSElGVAkJMTUKKyNlbGlmIGRlZmluZWQoQ09ORklHX01JQ1JPQkxBWkVfMTZLX1BBR0VTKQorI2RlZmluZSBQQUdFX1NISUZUCQkxNAorI2VsaWYgZGVmaW5lZChDT05GSUdfTUlDUk9CTEFaRV84S19QQUdFUykKKyNkZWZpbmUgUEFHRV9TSElGVAkJMTMKKyNlbHNlCisjZGVmaW5lIFBBR0VfU0hJRlQJCTEyCisjZW5kaWYKKyNkZWZpbmUgUEFHRV9TSVpFCShBU01fQ09OU1QoMSkgPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgUEFHRV9NQVNLCSh+KFBBR0VfU0laRS0xKSkKIAogI2RlZmluZSBMT0FEX09GRlNFVAlBU01fQ09OU1QoKENPTkZJR19LRVJORUxfU1RBUlQtQ09ORklHX0tFUk5FTF9CQVNFX0FERFIpKQpAQCAtMzksMTMgKzQ3LDYgQEAKICNkZWZpbmUgUEFHRV9VUChhZGRyKQkoKChhZGRyKSsoKFBBR0VfU0laRSktMSkpJih+KChQQUdFX1NJWkUpLTEpKSkKICNkZWZpbmUgUEFHRV9ET1dOKGFkZHIpCSgoYWRkcikmKH4oKFBBR0VfU0laRSktMSkpKQogCi0vKiBhbGlnbiBhZGRyIG9uIGEgc2l6ZSBib3VuZGFyeSAtIGFkanVzdCBhZGRyZXNzIHVwL2Rvd24gaWYgbmVlZGVkICovCi0jZGVmaW5lIF9BTElHTl9VUChhZGRyLCBzaXplKQkoKChhZGRyKSsoKHNpemUpLTEpKSYofigoc2l6ZSktMSkpKQotI2RlZmluZSBfQUxJR05fRE9XTihhZGRyLCBzaXplKQkoKGFkZHIpJih+KChzaXplKS0xKSkpCi0KLS8qIGFsaWduIGFkZHIgb24gYSBzaXplIGJvdW5kYXJ5IC0gYWRqdXN0IGFkZHJlc3MgdXAgaWYgbmVlZGVkICovCi0jZGVmaW5lIF9BTElHTihhZGRyLCBzaXplKQlfQUxJR05fVVAoYWRkciwgc2l6ZSkKLQogI2lmbmRlZiBDT05GSUdfTU1VCiAvKgogICogUEFHRV9PRkZTRVQgLS0gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHBhZ2Ugb2YgbWVtb3J5LiBXaGVuIG5vdApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKaW5kZXggMGM3N2NkYS4uMGM2ODc2NCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCkBAIC0xNzIsMTMgKzE3Miw4IEBACiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGhvc2VfbGlzdDsKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOwogZXh0ZXJuIGludCBwY2liaW9zX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Ci19CiBzdGF0aWMgaW5saW5lIGludCBwY2liaW9zX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHJvbS5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Byb20uaAppbmRleCBlN2Q2N2EzLi4xMDFmYTA5IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHJvbS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmgKQEAgLTIwLDkgKzIwLDYgQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC01MCwyOSArNDcsMTAgQEAKICAqIE9GIGFkZHJlc3MgcmV0cmVpdmFsICYgdHJhbnNsYXRpb24KICAqLwogCi0vKiBUcmFuc2xhdGUgYW4gT0YgYWRkcmVzcyBibG9jayBpbnRvIGEgQ1BVIHBoeXNpY2FsIGFkZHJlc3MKLSAqLwotZXh0ZXJuIHU2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCB1MzIgKmFkZHIpOwotCi0vKiBFeHRyYWN0IGFuIGFkZHJlc3MgZnJvbSBhIGRldmljZSwgcmV0dXJucyB0aGUgcmVnaW9uIHNpemUgYW5kCi0gKiB0aGUgYWRkcmVzcyBzcGFjZSBmbGFncyB0b28uIFRoZSBQQ0kgdmVyc2lvbiB1c2VzIGEgQkFSIG51bWJlcgotICogaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBpbmRleAotICovCi1leHRlcm4gY29uc3QgdTMyICpvZl9nZXRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAotCQkJdTY0ICpzaXplLCB1bnNpZ25lZCBpbnQgKmZsYWdzKTsKLWV4dGVybiBjb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywKLQkJCXU2NCAqc2l6ZSwgdW5zaWduZWQgaW50ICpmbGFncyk7Ci0KLS8qIEdldCBhbiBhZGRyZXNzIGFzIGEgcmVzb3VyY2UuIE5vdGUgdGhhdCBpZiB5b3VyIGFkZHJlc3MgaXMKLSAqIGEgUElPIGFkZHJlc3MsIHRoZSBjb252ZXJzaW9uIHdpbGwgZmFpbCBpZiB0aGUgcGh5c2ljYWwgYWRkcmVzcwotICogY2FuJ3QgYmUgaW50ZXJuYWxseSBjb252ZXJ0ZWQgdG8gYW4gSU8gdG9rZW4gd2l0aAotICogcGNpX2FkZHJlc3NfdG9fcGlvKCksIHRoYXQgaXMgYmVjYXVzZSBpdCdzIGVpdGhlciBjYWxsZWQgdG8gZWFybHkKLSAqIG9yIGl0IGNhbid0IGJlIG1hdGNoZWQgdG8gYW55IGhvc3QgYnJpZGdlIElPIHNwYWNlCi0gKi8KLWV4dGVybiBpbnQgb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAotCQkJCXN0cnVjdCByZXNvdXJjZSAqcik7Ci1leHRlcm4gaW50IG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyLAotCQkJCXN0cnVjdCByZXNvdXJjZSAqcik7CisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOworI2RlZmluZSBwY2lfYWRkcmVzc190b19waW8gcGNpX2FkZHJlc3NfdG9fcGlvCisjZW5kaWYJLyogQ09ORklHX1BDSSAqLwogCiAvKiBQYXJzZSB0aGUgaWJtLGRtYS13aW5kb3cgcHJvcGVydHkgb2YgYW4gT0Ygbm9kZSBpbnRvIHRoZSBidXNubywgcGh5cyBhbmQKICAqIHNpemUgcGFyYW1ldGVycy4KQEAgLTg4LDY5ICs2Niw2IEBACiAvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCiBleHRlcm4gY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogCi0vKgotICogT0YgaW50ZXJydXB0IG1hcHBpbmcKLSAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyByZXR1cm5lZCB3aGVuIGFuIGludGVycnVwdCBpcyBtYXBwZWQuIFRoZSBjb250cm9sbGVyCi0gKiBmaWVsZCBuZWVkcyB0byBiZSBwdXQoKSBhZnRlciB1c2UKLSAqLwotCi0jZGVmaW5lIE9GX01BWF9JUlFfU1BFQwkJNCAvKiBXZSBoYW5kbGUgc3BlY2lmaWVycyBvZiBhdCBtb3N0IDQgY2VsbHMgKi8KLQotc3RydWN0IG9mX2lycSB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyOyAvKiBJbnRlcnJ1cHQgY29udHJvbGxlciBub2RlICovCi0JdTMyIHNpemU7IC8qIFNwZWNpZmllciBzaXplICovCi0JdTMyIHNwZWNpZmllcltPRl9NQVhfSVJRX1NQRUNdOyAvKiBTcGVjaWZpZXIgY29weSAqLwotfTsKLQotLyoqCi0gKiBvZl9pcnFfbWFwX2luaXQgLSBJbml0aWFsaXplIHRoZSBpcnEgcmVtYXBwZXIKLSAqIEBmbGFnczoJZmxhZ3MgZGVmaW5pbmcgd29ya2Fyb3VuZHMgdG8gZW5hYmxlCi0gKgotICogU29tZSBtYWNoaW5lcyBoYXZlIGJ1Z3MgaW4gdGhlIGRldmljZS10cmVlIHdoaWNoIHJlcXVpcmUgY2VydGFpbiB3b3JrYXJvdW5kcwotICogdG8gYmUgYXBwbGllZC4gQ2FsbCB0aGlzIGJlZm9yZSBhbnkgaW50ZXJydXB0IG1hcHBpbmcgYXR0ZW1wdHMgdG8gZW5hYmxlCi0gKiB0aG9zZSB3b3JrYXJvdW5kcy4KLSAqLwotI2RlZmluZSBPRl9JTUFQX09MRFdPUkxEX01BQwkweDAwMDAwMDAxCi0jZGVmaW5lIE9GX0lNQVBfTk9fUEhBTkRMRQkweDAwMDAwMDAyCi0KLWV4dGVybiB2b2lkIG9mX2lycV9tYXBfaW5pdCh1bnNpZ25lZCBpbnQgZmxhZ3MpOwotCi0vKioKLSAqIG9mX2lycV9tYXBfcmF3IC0gTG93IGxldmVsIGludGVycnVwdCB0cmVlIHBhcnNpbmcKLSAqIEBwYXJlbnQ6CXRoZSBkZXZpY2UgaW50ZXJydXB0IHBhcmVudAotICogQGludHNwZWM6CWludGVycnVwdCBzcGVjaWZpZXIgKCJpbnRlcnJ1cHRzIiBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlKQotICogQG9pbnRzaXplOglzaXplIG9mIHRoZSBwYXNzZWQgaW4gaW50ZXJydXB0IHNwZWNpZmllcgotICogQGFkZHI6CWFkZHJlc3Mgc3BlY2lmaWVyIChzdGFydCBvZiAicmVnIiBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlKQotICogQG91dF9pcnE6CXN0cnVjdHVyZSBvZl9pcnEgZmlsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbG93LWxldmVsIGludGVycnVwdCB0cmVlIHdhbGtpbmcgZnVuY3Rpb24uIEl0Ci0gKiBjYW4gYmUgdXNlZCB0byBkbyBhIHBhcnRpYWwgd2FsayB3aXRoIHN5bnRoZXRpemVkIHJlZyBhbmQgaW50ZXJydXB0cwotICogcHJvcGVydGllcywgZm9yIGV4YW1wbGUgd2hlbiByZXNvbHZpbmcgUENJIGludGVycnVwdHMgd2hlbiBubyBkZXZpY2UKLSAqIG5vZGUgZXhpc3QgZm9yIHRoZSBwYXJlbnQuCi0gKgotICovCi0KLWV4dGVybiBpbnQgb2ZfaXJxX21hcF9yYXcoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIGNvbnN0IHUzMiAqaW50c3BlYywKLQkJCXUzMiBvaW50c2l6ZSwgY29uc3QgdTMyICphZGRyLAotCQkJc3RydWN0IG9mX2lycSAqb3V0X2lycSk7Ci0KLS8qKgotICogb2ZfaXJxX21hcF9vbmUgLSBSZXNvbHZlIGFuIGludGVycnVwdCBmb3IgYSBkZXZpY2UKLSAqIEBkZXZpY2U6CXRoZSBkZXZpY2Ugd2hvc2UgaW50ZXJydXB0IGlzIHRvIGJlIHJlc29sdmVkCi0gKiBAaW5kZXg6CWluZGV4IG9mIHRoZSBpbnRlcnJ1cHQgdG8gcmVzb2x2ZQotICogQG91dF9pcnE6CXN0cnVjdHVyZSBvZl9pcnEgZmlsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIGFuIGludGVycnVwdCwgd2Fsa2luZyB0aGUgdHJlZSwgZm9yIGEgZ2l2ZW4KLSAqIGRldmljZS10cmVlIG5vZGUuIEl0J3MgdGhlIGhpZ2ggbGV2ZWwgcGVuZGFudCB0byBvZl9pcnFfbWFwX3JhdygpLgotICogSXQgYWxzbyBpbXBsZW1lbnRzIHRoZSB3b3JrYXJvdW5kcyBmb3IgT2xkV29scmQgTWFjcy4KLSAqLwotZXh0ZXJuIGludCBvZl9pcnFfbWFwX29uZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4LAotCQkJc3RydWN0IG9mX2lycSAqb3V0X2lycSk7Ci0KIC8qKgogICogb2ZfaXJxX21hcF9wY2kgLSBSZXNvbHZlIHRoZSBpbnRlcnJ1cHQgZm9yIGEgUENJIGRldmljZQogICogQHBkZXY6CXRoZSBkZXZpY2Ugd2hvc2UgaW50ZXJydXB0IGlzIHRvIGJlIHJlc29sdmVkCkBAIC0xNjMsMjAgKzc4LDE4IEBACiAgKiByZXNvbHZpbmcgdXNpbmcgdGhlIE9GIHRyZWUgd2Fsa2luZy4KICAqLwogc3RydWN0IHBjaV9kZXY7CitzdHJ1Y3Qgb2ZfaXJxOwogZXh0ZXJuIGludCBvZl9pcnFfbWFwX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG9mX2lycSAqb3V0X2lycSk7CiAKLWV4dGVybiBpbnQgb2ZfaXJxX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCi0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIpOwotCi0vKioKLSAqIG9mX2lvbWFwIC0gTWFwcyB0aGUgbWVtb3J5IG1hcHBlZCBJTyBmb3IgYSBnaXZlbiBkZXZpY2Vfbm9kZQotICogQGRldmljZToJdGhlIGRldmljZSB3aG9zZSBpbyByYW5nZSB3aWxsIGJlIG1hcHBlZAotICogQGluZGV4OglpbmRleCBvZiB0aGUgaW8gcmFuZ2UKLSAqCi0gKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWFwcGVkIG1lbW9yeQotICovCi1leHRlcm4gdm9pZCBfX2lvbWVtICpvZl9pb21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4KTsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworLyogVGhlc2UgaW5jbHVkZXMgYXJlIHB1dCBhdCB0aGUgYm90dG9tIGJlY2F1c2UgdGhleSBtYXkgY29udGFpbiB0aGluZ3MKKyAqIHRoYXQgYXJlIG92ZXJyaWRkZW4gYnkgdGhpcyBmaWxlLiAgSWRlYWxseSB0aGV5IHNob3VsZG4ndCBiZSBpbmNsdWRlZAorICogYnkgdGhpcyBmaWxlLCBidXQgdGhlcmUgYXJlIGEgYnVuY2ggb2YgLmMgZmlsZXMgdGhhdCBjdXJyZW50bHkgZGVwZW5kCisgKiBvbiBpdC4gIEV2ZW50dWFsbHkgdGhleSB3aWxsIGJlIGNsZWFuZWQgdXAuICovCisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKICNlbmRpZiAvKiBfQVNNX01JQ1JPQkxBWkVfUFJPTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHZyLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHZyLmgKaW5kZXggZTM4YWJjNy4uOTU3ODY2NiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3B2ci5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wdnIuaApAQCAtMTYsNyArMTYsNyBAQAogI2RlZmluZSBQVlJfTVNSX0JJVCAweDQwMAogCiBzdHJ1Y3QgcHZyX3MgewotCXVuc2lnbmVkIHB2clsxNl07CisJdW5zaWduZWQgcHZyWzEyXTsKIH07CiAKIC8qIFRoZSBmb2xsb3dpbmcgdGFrZW4gZnJvbSBYaWxpbngncyBzdGFuZGFsb25lIEJTUCBwdnIuaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCA3ZjMxMzk0Li43ODJiNWM4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMjgsOCArMjgsNiBAQAogdm9pZCBoZWFydGJlYXQodm9pZCk7CiB2b2lkIHNldHVwX2hlYXJ0YmVhdCh2b2lkKTsKIAotdW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpOwotCiAjICAgaWZkZWYgQ09ORklHX01NVQogZXh0ZXJuIHZvaWQgbW11X3Jlc2V0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfY29uc29sZV9yZWdfdGxiX2FsbG9jKHVuc2lnbmVkIGludCBhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCA0OGM0ZjAzLi5lNmEyMjg0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC00NSw3ICs0NSw2IEBACiAjZGVmaW5lIHNtcF9ybWIoKQkJcm1iKCkKICNkZWZpbmUgc21wX3dtYigpCQl3bWIoKQogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjayk7CiB2b2lkIF9fYmFkX3hjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCBpbnQgc2l6ZSk7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3hjaGcodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICpwdHIsCkBAIC0xMDEsMTAgKzEwMCw3IEBACiAgKiBNaWNyb0JsYXplIGRvZXNuJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3NlcyBpbiBoYXJkd2FyZS4KICAqCiAgKiBCYXNlZCBvbiB0aGlzIHdlIGZvcmNlIHRoZSBJUCBoZWFkZXIgYWxpZ25tZW50IGluIG5ldHdvcmsgZHJpdmVycy4KLSAqIFdlIGFsc28gbW9kaWZ5IE5FVF9TS0JfUEFEIHRvIGJlIGEgY2FjaGVsaW5lIGluIHNpemUsIHRodXMgbWFpbnRhaW5pbmcKLSAqIGNhY2hlbGluZSBhbGlnbm1lbnQgb2YgYnVmZmVycy4KICAqLwogI2RlZmluZSBORVRfSVBfQUxJR04JMgotI2RlZmluZSBORVRfU0tCX1BBRAlMMV9DQUNIRV9CWVRFUwogCiAjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IDk2YmNlYTUuLjU0MjhmMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0xLDExICsxIEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdG9wb2xvZ3kuaD4KLQotI2lmbmRlZiBfQVNNX01JQ1JPQkxBWkVfVE9QT0xPR1lfSAotI2RlZmluZSBfQVNNX01JQ1JPQkxBWkVfVE9QT0xPR1lfSAotCi1zdHJ1Y3QgZGV2aWNlX25vZGU7Ci1zdGF0aWMgaW5saW5lIGludCBvZl9ub2RlX3RvX25pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBfQVNNX01JQ1JPQkxBWkVfVE9QT0xPR1lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMjY0NjBkMS4uZDg0MGY0YSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0zNTksNyArMzU5LDcgQEAKIAlfX2NvcHlfdG9mcm9tX3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikodG8pLCBcCiAJCQkJKHZvaWQgX191c2VyICopKGZyb20pLCAobikpCiAjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pIFwKLQkJY29weV9mcm9tX3VzZXIoKHRvKSwgKGZyb20pLCAobikpCisJCV9fY29weV9mcm9tX3VzZXIoKHRvKSwgKGZyb20pLCAobikpCiAKIHN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKIAkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKQEAgLTM3Myw3ICszNzMsNyBAQAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJXAogCQlfX2NvcHlfdG9mcm9tX3VzZXIoKHZvaWQgX191c2VyICopKHRvKSwgXAogCQkJKF9fZm9yY2UgY29uc3Qgdm9pZCBfX3VzZXIgKikoZnJvbSksIChuKSkKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCWNvcHlfdG9fdXNlcigodG8pLCAoZnJvbSksIChuKSkKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pIF9fY29weV90b191c2VyKCh0byksIChmcm9tKSwgKG4pKQogCiBzdGF0aWMgaW5saW5lIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywKIAkJY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Vud2luZC5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Vud2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDhiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdW53aW5kLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIEJhY2t0cmFjZSBzdXBwb3J0IGZvciBNaWNyb2JsYXplCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwICBEaWdpdGFsIERlc2lnbiBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NSUNST0JMQVpFX1VOV0lORF9ICisjZGVmaW5lIF9fTUlDUk9CTEFaRV9VTldJTkRfSAorCitzdHJ1Y3Qgc3RhY2tfdHJhY2U7CisKK3N0cnVjdCB0cmFwX2hhbmRsZXJfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgZW5kX2FkZHI7CisJY29uc3QgY2hhciAgICAqdHJhcF9uYW1lOworfTsKK2V4dGVybiBzdHJ1Y3QgdHJhcF9oYW5kbGVyX2luZm8gbWljcm9ibGF6ZV90cmFwX2hhbmRsZXJzOworCitleHRlcm4gY29uc3QgY2hhciBfaHdfZXhjZXB0aW9uX2hhbmRsZXI7CitleHRlcm4gY29uc3QgY2hhciBleF9oYW5kbGVyX3VuaGFuZGxlZDsKKwordm9pZCBtaWNyb2JsYXplX3Vud2luZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpOworCisjZW5kaWYJLyogX19NSUNST0JMQVpFX1VOV0lORF9IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL01ha2VmaWxlCmluZGV4IGU1MWJjMTUuLmYwY2I1YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTUsOSArMTUsOSBAQAogZXh0cmEteSA6PSBoZWFkLm8gdm1saW51eC5sZHMKIAogb2JqLXkgKz0gZG1hLm8gZXhjZXB0aW9ucy5vIFwKLQlod19leGNlcHRpb25faGFuZGxlci5vIGluaXRfdGFzay5vIGludGMubyBpcnEubyBvZl9kZXZpY2UubyBcCi0Jb2ZfcGxhdGZvcm0ubyBwcm9jZXNzLm8gcHJvbS5vIHByb21fcGFyc2UubyBwdHJhY2UubyBcCi0Jc2V0dXAubyBzaWduYWwubyBzeXNfbWljcm9ibGF6ZS5vIHRpbWVyLm8gdHJhcHMubyByZXNldC5vCisJaHdfZXhjZXB0aW9uX2hhbmRsZXIubyBpbml0X3Rhc2subyBpbnRjLm8gaXJxLm8gXAorCXByb2Nlc3MubyBwcm9tLm8gcHJvbV9wYXJzZS5vIHB0cmFjZS5vIFwKKwlyZXNldC5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX21pY3JvYmxhemUubyB0aW1lci5vIHRyYXBzLm8gdW53aW5kLm8KIAogb2JqLXkgKz0gY3B1LwogCkBAIC0yOCw1ICsyOCw2IEBACiBvYmotJChDT05GSUdfTU1VKQkJKz0gbWlzYy5vCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkJKz0gc3RhY2t0cmFjZS5vCiBvYmotJChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKQkrPSBmdHJhY2UubyBtY291bnQubworb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiLm8KIAogb2JqLXkJKz0gZW50cnkkKE1NVSkubwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvbWIuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L21iLmMKaW5kZXggNDIxNmViMS4uNzA4NmUzNSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvbWIuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9tYi5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIAkJCWNwdWluZm8ucHZyX3VzZXIxLAogCQkJY3B1aW5mby5wdnJfdXNlcjIpOwogCisJY291bnQgKz0gc2VxX3ByaW50ZihtLCAiUGFnZSBzaXplOlx0JWx1XG4iLCBQQUdFX1NJWkUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LW5vbW11LlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LW5vbW11LlMKaW5kZXggOGNjMThjZC4uY2E4NDM2OCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS1ub21tdS5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnktbm9tbXUuUwpAQCAtNTg4LDMgKzU4OCwzMSBAQAogI2luY2x1ZGUgInN5c2NhbGxfdGFibGUuUyIKIAogc3lzY2FsbF90YWJsZV9zaXplPSguLXN5c19jYWxsX3RhYmxlKQorCit0eXBlX1NZU0NBTEw6CisJLmFzY2lpICJTWVNDQUxMXDAiCit0eXBlX0lSUToKKwkuYXNjaWkgIklSUVwwIgordHlwZV9JUlFfUFJFRU1QVDoKKwkuYXNjaWkgIklSUSAoUFJFRU1QVEVEKVwwIgordHlwZV9TWVNDQUxMX1BSRUVNUFQ6CisJLmFzY2lpICIgU1lTQ0FMTCAoUFJFRU1QVEVEKVwwIgorCisJLyoKKwkgKiBUcmFwIGRlY29kaW5nIGZvciBzdGFjayB1bndpbmRlcgorCSAqIFR1cGxlcyBhcmUgKHN0YXJ0IGFkZHIsIGVuZCBhZGRyLCBzdHJpbmcpCisJICogSWYgcmV0dXJuIGFkZHJlc3MgbGllcyBvbiBbc3RhcnQgYWRkciwgZW5kIGFkZHJdLAorCSAqIHVud2luZGVyIGRpc3BsYXlzICdzdHJpbmcnCisJICovCisKKwkuYWxpZ24gNAorLmdsb2JhbCBtaWNyb2JsYXplX3RyYXBfaGFuZGxlcnMKK21pY3JvYmxhemVfdHJhcF9oYW5kbGVyczoKKwkvKiBFeGFjdCBtYXRjaGVzIGNvbWUgZmlyc3QgKi8KKwkud29yZCByZXRfdG9fdXNlciAgOyAud29yZCByZXRfdG9fdXNlciAgICA7IC53b3JkIHR5cGVfU1lTQ0FMTAorCS53b3JkIHJldF9mcm9tX2ludHI7IC53b3JkIHJldF9mcm9tX2ludHIgIDsgLndvcmQgdHlwZV9JUlEKKwkvKiBGdXp6eSBtYXRjaGVzIGdvIGhlcmUgKi8KKwkud29yZCByZXRfZnJvbV9pbnRyOyAud29yZCBub19pbnRyX3Jlc2NoZWQ7IC53b3JkIHR5cGVfSVJRX1BSRUVNUFQKKwkud29yZCB3b3JrX3BlbmRpbmcgOyAud29yZCBub193b3JrX3BlbmRpbmc7IC53b3JkIHR5cGVfU1lTQ0FMTF9QUkVFTVBUCisJLyogRW5kIG9mIHRhYmxlICovCisJLndvcmQgMCAgICAgICAgICAgICA7IC53b3JkIDAgICAgICAgICAgICAgICA7IC53b3JkIDAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUwppbmRleCBjMGVkZTI1Li4zMDQ4ODJlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS5TCkBAIC00OCwxMjggKzQ4LDEwNyBAQAogICovCiAjaWYgQ09ORklHX1hJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSCiAJLm1hY3JvCWNsZWFyX2JpcAotCW1zcmNscglyMTEsIE1TUl9CSVAKLQlub3AKKwltc3JjbHIJcjAsIE1TUl9CSVAKIAkuZW5kbQogCiAJLm1hY3JvCXNldF9iaXAKLQltc3JzZXQJcjExLCBNU1JfQklQCi0Jbm9wCisJbXNyc2V0CXIwLCBNU1JfQklQCiAJLmVuZG0KIAogCS5tYWNybwljbGVhcl9laXAKLQltc3JjbHIJcjExLCBNU1JfRUlQCi0Jbm9wCisJbXNyY2xyCXIwLCBNU1JfRUlQCiAJLmVuZG0KIAogCS5tYWNybwlzZXRfZWUKLQltc3JzZXQJcjExLCBNU1JfRUUKLQlub3AKKwltc3JzZXQJcjAsIE1TUl9FRQogCS5lbmRtCiAKIAkubWFjcm8JZGlzYWJsZV9pcnEKLQltc3JjbHIJcjExLCBNU1JfSUUKLQlub3AKKwltc3JjbHIJcjAsIE1TUl9JRQogCS5lbmRtCiAKIAkubWFjcm8JZW5hYmxlX2lycQotCW1zcnNldAlyMTEsIE1TUl9JRQotCW5vcAorCW1zcnNldAlyMCwgTVNSX0lFCiAJLmVuZG0KIAogCS5tYWNybwlzZXRfdW1zCi0JbXNyc2V0CXIxMSwgTVNSX1VNUwotCW5vcAotCW1zcmNscglyMTEsIE1TUl9WTVMKLQlub3AKKwltc3JzZXQJcjAsIE1TUl9VTVMKKwltc3JjbHIJcjAsIE1TUl9WTVMKIAkuZW5kbQogCiAJLm1hY3JvCXNldF92bXMKLQltc3JjbHIJcjExLCBNU1JfVU1TCi0Jbm9wCi0JbXNyc2V0CXIxMSwgTVNSX1ZNUwotCW5vcAorCW1zcmNscglyMCwgTVNSX1VNUworCW1zcnNldAlyMCwgTVNSX1ZNUworCS5lbmRtCisKKwkubWFjcm8JY2xlYXJfdW1zCisJbXNyY2xyCXIwLCBNU1JfVU1TCiAJLmVuZG0KIAogCS5tYWNybwljbGVhcl92bXNfdW1zCi0JbXNyY2xyCXIxMSwgTVNSX1ZNUwotCW5vcAotCW1zcmNscglyMTEsIE1TUl9VTVMKLQlub3AKKwltc3JjbHIJcjAsIE1TUl9WTVMgfCBNU1JfVU1TCiAJLmVuZG0KICNlbHNlCiAJLm1hY3JvCWNsZWFyX2JpcAogCW1mcwlyMTEsIHJtc3IKLQlub3AKIAlhbmRpCXIxMSwgcjExLCB+TVNSX0JJUAogCW10cwlybXNyLCByMTEKLQlub3AKIAkuZW5kbQogCiAJLm1hY3JvCXNldF9iaXAKIAltZnMJcjExLCBybXNyCi0Jbm9wCiAJb3JpCXIxMSwgcjExLCBNU1JfQklQCiAJbXRzCXJtc3IsIHIxMQotCW5vcAogCS5lbmRtCiAKIAkubWFjcm8JY2xlYXJfZWlwCiAJbWZzCXIxMSwgcm1zcgotCW5vcAogCWFuZGkJcjExLCByMTEsIH5NU1JfRUlQCiAJbXRzCXJtc3IsIHIxMQotCW5vcAogCS5lbmRtCiAKIAkubWFjcm8Jc2V0X2VlCiAJbWZzCXIxMSwgcm1zcgotCW5vcAogCW9yaQlyMTEsIHIxMSwgTVNSX0VFCiAJbXRzCXJtc3IsIHIxMQotCW5vcAogCS5lbmRtCiAKIAkubWFjcm8JZGlzYWJsZV9pcnEKIAltZnMJcjExLCBybXNyCi0Jbm9wCiAJYW5kaQlyMTEsIHIxMSwgfk1TUl9JRQogCW10cwlybXNyLCByMTEKLQlub3AKIAkuZW5kbQogCiAJLm1hY3JvCWVuYWJsZV9pcnEKIAltZnMJcjExLCBybXNyCi0Jbm9wCiAJb3JpCXIxMSwgcjExLCBNU1JfSUUKIAltdHMJcm1zciwgcjExCi0Jbm9wCiAJLmVuZG0KIAogCS5tYWNybyBzZXRfdW1zCiAJbWZzCXIxMSwgcm1zcgotCW5vcAogCW9yaQlyMTEsIHIxMSwgTVNSX1ZNUwogCWFuZG5pCXIxMSwgcjExLCBNU1JfVU1TCiAJbXRzCXJtc3IsIHIxMQotCW5vcAogCS5lbmRtCiAKIAkubWFjcm8Jc2V0X3ZtcwogCW1mcwlyMTEsIHJtc3IKLQlub3AKIAlvcmkJcjExLCByMTEsIE1TUl9WTVMKIAlhbmRuaQlyMTEsIHIxMSwgTVNSX1VNUwogCW10cwlybXNyLCByMTEKLQlub3AKKwkuZW5kbQorCisJLm1hY3JvCWNsZWFyX3VtcworCW1mcwlyMTEsIHJtc3IKKwlhbmRuaQlyMTEsIHIxMSwgTVNSX1VNUworCW10cwlybXNyLHIxMQogCS5lbmRtCiAKIAkubWFjcm8JY2xlYXJfdm1zX3VtcwogCW1mcwlyMTEsIHJtc3IKLQlub3AKIAlhbmRuaQlyMTEsIHIxMSwgKE1TUl9WTVN8TVNSX1VNUykKIAltdHMJcm1zcixyMTEKLQlub3AKIAkuZW5kbQogI2VuZGlmCiAKQEAgLTE4MCwxOCArMTU5LDIyIEBACiAKIC8qIHR1cm4gb24gdmlydHVhbCBwcm90ZWN0ZWQgbW9kZSBzYXZlICovCiAjZGVmaW5lIFZNX09OCQlcCi0Jc2V0X3VtczsJCVwKKwlzZXRfdW1zOwlcCiAJcnRlZAlyMCwgMmY7CVwKLTI6IG5vcDsKKwlub3A7IFwKKzI6CiAKIC8qIHR1cm4gb2ZmIHZpcnR1YWwgcHJvdGVjdGVkIG1vZGUgc2F2ZSBhbmQgdXNlciBtb2RlIHNhdmUqLwogI2RlZmluZSBWTV9PRkYJCQlcCi0JY2xlYXJfdm1zX3VtczsJCQlcCisJY2xlYXJfdm1zX3VtczsJCVwKIAlydGVkCXIwLCBUT1BIWVMoMWYpOwlcCi0xOiBub3A7CisJbm9wOyBcCisxOgogCiAjZGVmaW5lIFNBVkVfUkVHUyBcCiAJc3dpCXIyLCByMSwgUFRPK1BUX1IyOwkvKiBTYXZlIFNEQSAqLwkJCVwKKwlzd2kJcjMsIHIxLCBQVE8rUFRfUjM7CQkJCQlcCisJc3dpCXI0LCByMSwgUFRPK1BUX1I0OwkJCQkJXAogCXN3aQlyNSwgcjEsIFBUTytQVF9SNTsJCQkJCVwKIAlzd2kJcjYsIHIxLCBQVE8rUFRfUjY7CQkJCQlcCiAJc3dpCXI3LCByMSwgUFRPK1BUX1I3OwkJCQkJXApAQCAtMjE4LDE0ICsyMDEsMTQgQEAKIAlzd2kJcjMwLCByMSwgUFRPK1BUX1IzMDsJCQkJCVwKIAlzd2kJcjMxLCByMSwgUFRPK1BUX1IzMTsJLyogU2F2ZSBjdXJyZW50IHRhc2sgcmVnICovCVwKIAltZnMJcjExLCBybXNyOwkJLyogc2F2ZSBNU1IgKi8JCQlcCi0Jbm9wOwkJCQkJCQkJXAogCXN3aQlyMTEsIHIxLCBQVE8rUFRfTVNSOwogCiAjZGVmaW5lIFJFU1RPUkVfUkVHUyBcCiAJbHdpCXIxMSwgcjEsIFBUTytQVF9NU1I7CQkJCQlcCiAJbXRzCXJtc3IgLCByMTE7CQkJCQkJXAotCW5vcDsJCQkJCQkJCVwKIAlsd2kJcjIsIHIxLCBQVE8rUFRfUjI7CS8qIHJlc3RvcmUgU0RBICovCQlcCisJbHdpCXIzLCByMSwgUFRPK1BUX1IzOwkJCQkJXAorCWx3aQlyNCwgcjEsIFBUTytQVF9SNDsJCQkJCVwKIAlsd2kJcjUsIHIxLCBQVE8rUFRfUjU7CQkJCQlcCiAJbHdpCXI2LCByMSwgUFRPK1BUX1I2OwkJCQkJXAogCWx3aQlyNywgcjEsIFBUTytQVF9SNzsJCQkJCVwKQEAgLTI1Miw2ICsyMzUsMzkgQEAKIAlsd2kJcjMwLCByMSwgUFRPK1BUX1IzMDsJCQkJCVwKIAlsd2kJcjMxLCByMSwgUFRPK1BUX1IzMTsJLyogUmVzdG9yZSBjdXIgdGFzayByZWcgKi8KIAorI2RlZmluZSBTQVZFX1NUQVRFCVwKKwlzd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpOyAvKiBzYXZlIHN0YWNrICovCVwKKwkvKiBTZWUgaWYgYWxyZWFkeSBpbiBrZXJuZWwgbW9kZS4qLwkJCQlcCisJbWZzCXIxLCBybXNyOwkJCQkJCVwKKwlhbmRpCXIxLCByMSwgTVNSX1VNUzsJCQkJCVwKKwlibmVpCXIxLCAxZjsJCQkJCQlcCisJLyogS2VybmVsLW1vZGUgc3RhdGUgc2F2ZS4gICovCQkJCQlcCisJLyogUmVsb2FkIGtlcm5lbCBzdGFjay1wdHIuICovCQkJCQlcCisJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKTsJCQlcCisJLyogRklYTUU6IEkgY2FuIGFkZCB0aGVzZSB0d28gbGluZXMgdG8gb25lICovCQkJXAorCS8qIHRvcGh5cyhyMSxyMSk7ICovCQkJCQkJXAorCS8qIGFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgKi8JCQlcCisJYWRkaWsJcjEsIHIxLCBDT05GSUdfS0VSTkVMX0JBU0VfQUREUiAtIENPTkZJR19LRVJORUxfU1RBUlQgLSBTVEFURV9TQVZFX1NJWkU7IFwKKwlTQVZFX1JFR1MJCQkJCQkJXAorCWJyaWQJMmY7CQkJCQkJCVwKKwlzd2kJcjEsIHIxLCBQVE8rUFRfTU9ERTsgCSAJCQkJXAorMToJLyogVXNlci1tb2RlIHN0YXRlIHNhdmUuICAqLwkJCQkJXAorCWx3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKENVUlJFTlRfU0FWRSkpOyAvKiBnZXQgc2F2ZWQgY3VycmVudCAqL1wKKwl0b3BoeXMocjEscjEpOwkJCQkJCQlcCisJbHdpCXIxLCByMSwgVFNfVEhSRUFEX0lORk87CS8qIGdldCB0aGUgdGhyZWFkIGluZm8gKi8JXAorCS8qIE1TIHRoZXNlIHRocmVlIGluc3RydWN0aW9ucyBjYW4gYmUgYWRkZWQgdG8gb25lICovCQlcCisJLyogYWRkaWsJcjEsIHIxLCBUSFJFQURfU0laRTsgKi8JCQkJXAorCS8qIHRvcGh5cyhyMSxyMSk7ICovCQkJCQkJXAorCS8qIGFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgKi8JCQlcCisJYWRkaWsgcjEsIHIxLCBUSFJFQURfU0laRSArIENPTkZJR19LRVJORUxfQkFTRV9BRERSIC0gQ09ORklHX0tFUk5FTF9TVEFSVCAtIFNUQVRFX1NBVkVfU0laRTsgXAorCVNBVkVfUkVHUwkJCQkJCQlcCisJbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7CQkJXAorCXN3aQlyMTEsIHIxLCBQVE8rUFRfUjE7IC8qIFN0b3JlIHVzZXIgU1AuICAqLwkJXAorCXN3aQlyMCwgcjEsIFBUTyArIFBUX01PREU7IC8qIFdhcyBpbiB1c2VyLW1vZGUuICAqLwkJXAorCS8qIE1TOiBJIGFtIGNsZWFyaW5nIFVNUyBldmVuIGluIGNhc2Ugd2hlbiBJIGNvbWUgZnJvbSBrZXJuZWwgc3BhY2UgKi8gXAorCWNsZWFyX3VtczsgCQkJCQkJCVwKKzI6CWx3aQlDVVJSRU5UX1RBU0ssIHIwLCBUT1BIWVMoUEVSX0NQVShDVVJSRU5UX1NBVkUpKTsKKwogLnRleHQKIAogLyoKQEAgLTI2Nyw0NSArMjgzLDIzIEBACiAgKiBhcmUgbWFza2VkLiBUaGlzIGlzIG5pY2UsIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gQ0xJIGJlZm9yZSBzdGF0ZSBzYXZlCiAgKi8KIENfRU5UUlkoX3VzZXJfZXhjZXB0aW9uKToKLQlzd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpIC8qIHNhdmUgc3RhY2sgKi8KIAlhZGRpCXIxNCwgcjE0LCA0CS8qIHJldHVybiBhZGRyZXNzIGlzIDQgYnl0ZSBhZnRlciBjYWxsICovCi0Jc3dpCXIxMSwgcjAsIFRPUEhZUyhyMF9yYW0gKyBQVE8gKyBQVF9SMTEpOwkvKiBTYXZlIHIxMSAqLworCXN3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSkgLyogc2F2ZSBzdGFjayAqLwogCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEtNKSk7LyogU2VlIGlmIGFscmVhZHkgaW4ga2VybmVsIG1vZGUuKi8KLQliZXFpCXIxMSwgMWY7CQkvKiBKdW1wIGFoZWFkIGlmIGNvbWluZyBmcm9tIHVzZXIgKi8KLS8qIEtlcm5lbC1tb2RlIHN0YXRlIHNhdmUuICovCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7IC8qIFJlbG9hZCBrZXJuZWwgc3RhY2stcHRyKi8KLQl0b3BoeXMocjEscjExKTsKLQlzd2kJcjExLCByMSwgKFBUX1IxLVBUX1NJWkUpOyAvKiBTYXZlIG9yaWdpbmFsIFNQLiAqLwotCWx3aQlyMTEsIHIwLCBUT1BIWVMocjBfcmFtICsgUFRPICsgUFRfUjExKTsgLyogcmVzdG9yZSByMTEgKi8KLQotCWFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgLyogTWFrZSByb29tIG9uIHRoZSBzdGFjay4gKi8KLQlTQVZFX1JFR1MKLQotCWFkZGkJcjExLCByMCwgMTsgCQkvKiBXYXMgaW4ga2VybmVsLW1vZGUuICovCi0Jc3dpCXIxMSwgcjEsIFBUTytQVF9NT0RFOyAvKiBwdF9yZWdzIC0+IGtlcm5lbCBtb2RlICovCi0JYnJpZAkyZjsKLQlub3A7CQkJCS8qIEZpbGwgZGVsYXkgc2xvdCAqLwotCi0vKiBVc2VyLW1vZGUgc3RhdGUgc2F2ZS4gICovCi0xOgotCWx3aQlyMTEsIHIwLCBUT1BIWVMocjBfcmFtICsgUFRPICsgUFRfUjExKTsJLyogcmVzdG9yZSByMTEgKi8KIAlsd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShDVVJSRU5UX1NBVkUpKTsgLyogZ2V0IHNhdmVkIGN1cnJlbnQgKi8KIAl0b3BoeXMocjEscjEpOwogCWx3aQlyMSwgcjEsIFRTX1RIUkVBRF9JTkZPOwkvKiBnZXQgc3RhY2sgZnJvbSB0YXNrX3N0cnVjdCAqLwotLyogY2FsY3VsYXRlIGtlcm5lbCBzdGFjayBwb2ludGVyIGZyb20gdGFzayBzdHJ1Y3QgOGsgKi8KLQlhZGRpawlyMSwgcjEsIFRIUkVBRF9TSVpFOwotCXRvcGh5cyhyMSxyMSk7Ci0KLQlhZGRpawlyMSwgcjEsIC1TVEFURV9TQVZFX1NJWkU7IC8qIE1ha2Ugcm9vbSBvbiB0aGUgc3RhY2suICAqLworCS8qIE1TIHRoZXNlIHRocmVlIGluc3RydWN0aW9ucyBjYW4gYmUgYWRkZWQgdG8gb25lICovCisJLyogYWRkaWsJcjEsIHIxLCBUSFJFQURfU0laRTsgKi8KKwkvKiB0b3BoeXMocjEscjEpOyAqLworCS8qIGFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgKi8KKwlhZGRpayByMSwgcjEsIFRIUkVBRF9TSVpFICsgQ09ORklHX0tFUk5FTF9CQVNFX0FERFIgLSBDT05GSUdfS0VSTkVMX1NUQVJUIC0gU1RBVEVfU0FWRV9TSVpFOwogCVNBVkVfUkVHUwogCi0Jc3dpCXIwLCByMSwgUFRPK1BUX01PREU7CQkJLyogV2FzIGluIHVzZXItbW9kZS4gKi8KIAlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKTsKIAlzd2kJcjExLCByMSwgUFRPK1BUX1IxOwkJLyogU3RvcmUgdXNlciBTUC4gICovCi0JYWRkaQlyMTEsIHIwLCAxOwotCXN3aQlyMTEsIHIwLCBUT1BIWVMoUEVSX0NQVShLTSkpOwkvKiBOb3cgd2UncmUgaW4ga2VybmVsLW1vZGUuICAqLwotMjoJbHdpCUNVUlJFTlRfVEFTSywgcjAsIFRPUEhZUyhQRVJfQ1BVKENVUlJFTlRfU0FWRSkpOworCWNsZWFyX3VtczsKKwlsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CiAJLyogU2F2ZSBhd2F5IHRoZSBzeXNjYWxsIG51bWJlci4gICovCiAJc3dpCXIxMiwgcjEsIFBUTytQVF9SMDsKIAl0b3ZpcnQocjEscjEpCkBAIC0zMTYsMTAgKzMxMCw4IEBACiAgKiByZWdpc3RlciBzaG91bGQgcG9pbnQgdG8gdGhlIGxvY2F0aW9uIHdoZXJlCiAgKiB0aGUgY2FsbGVkIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4uICBbbm90ZSB0aGF0IE1BS0VfU1lTX0NBTEwgdXNlcyBsYWJlbCAxXSAqLwogCi0JIyBTdGVwIGludG8gdmlydHVhbCBtb2RlLgotCXNldF92bXM7Ci0JYWRkaWsJcjExLCByMCwgM2YKLQlydGlkCXIxMSwgMAorCS8qIFN0ZXAgaW50byB2aXJ0dWFsIG1vZGUgKi8KKwlydGJkCXIwLCAzZgogCW5vcAogMzoKIAlsd2kJcjExLCBDVVJSRU5UX1RBU0ssIFRTX1RIUkVBRF9JTkZPIC8qIGdldCB0aHJlYWQgaW5mbyAqLwpAQCAtMzYzLDI0ICszNTUsMTcgQEAKIAkjIEZpbmQgYW5kIGp1bXAgaW50byB0aGUgc3lzY2FsbCBoYW5kbGVyLgogCWx3aQlyMTIsIHIxMiwgc3lzX2NhbGxfdGFibGUKIAkvKiB3aGVyZSB0aGUgdHJhcCBzaG91bGQgcmV0dXJuIG5lZWQgLTggdG8gYWRqdXN0IGZvciBydHNkIHIxNSwgOCAqLwotCWxhCXIxNSwgcjAsIHJldF9mcm9tX3RyYXAtOAorCWFkZGkJcjE1LCByMCwgcmV0X2Zyb21fdHJhcC04CiAJYnJhCXIxMgogCiAJLyogVGhlIHN5c2NhbGwgbnVtYmVyIGlzIGludmFsaWQsIHJldHVybiBhbiBlcnJvci4gICovCiA1OgorCXJ0c2QJcjE1LCA4OwkJLyogbG9va3MgbGlrZSBhIG5vcm1hbCBzdWJyb3V0aW5lIHJldHVybiAqLwogCWFkZGkJcjMsIHIwLCAtRU5PU1lTOwotCXJ0c2QJcjE1LDg7CQkvKiBsb29rcyBsaWtlIGEgbm9ybWFsIHN1YnJvdXRpbmUgcmV0dXJuICovCi0Jb3IgCXIwLCByMCwgcjAKLQogCiAvKiBFbnRyeSBwb2ludCB1c2VkIHRvIHJldHVybiBmcm9tIGEgc3lzY2FsbC90cmFwICovCiAvKiBXZSByZS1lbmFibGUgQklQIGJpdCBiZWZvcmUgc3RhdGUgcmVzdG9yZSAqLwogQ19FTlRSWShyZXRfZnJvbV90cmFwKToKLQlzZXRfYmlwOwkJCS8qICBJbnRzIG1hc2tlZCBmb3Igc3RhdGUgcmVzdG9yZSovCi0JbHdpCXIxMSwgcjEsIFBUTytQVF9NT0RFOwotLyogU2VlIGlmIHJldHVybmluZyB0byBrZXJuZWwgbW9kZSwgaWYgc28sIHNraXAgcmVzY2hlZCAmYy4gICovCi0JYm5laQlyMTEsIDJmOwotCiAJc3dpCXIzLCByMSwgUFRPICsgUFRfUjMKIAlzd2kJcjQsIHIxLCBQVE8gKyBQVF9SNAogCkBAIC00MTMsMzIgKzM5OCwxOSBAQAogCWFuZGkJcjExLCByMTEsIF9USUZfU0lHUEVORElORzsKIAliZXFpCXIxMSwgMWY7CQkvKiBTaWduYWxzIHRvIGhhbmRsZSwgaGFuZGxlIHRoZW0gKi8KIAotCWxhCXI1LCByMSwgUFRPOwkJLyogQXJnIDE6IHN0cnVjdCBwdF9yZWdzICpyZWdzICovCisJYWRkaWsJcjUsIHIxLCBQVE87CQkvKiBBcmcgMTogc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKi8KIAlhZGRpCXI3LCByMCwgMTsJCS8qIEFyZyAzOiBpbnQgaW5fc3lzY2FsbCAqLwogCWJyYWxpZAlyMTUsIGRvX3NpZ25hbDsJLyogSGFuZGxlIGFueSBzaWduYWxzICovCiAJYWRkCXI2LCByMCwgcjA7CQkvKiBBcmcgMjogc2lnc2V0X3QgKm9sZHNldCAqLwogCiAvKiBGaW5hbGx5LCByZXR1cm4gdG8gdXNlciBzdGF0ZS4gICovCi0xOgotCWx3aQlyMywgcjEsIFBUTyArIFBUX1IzOyAvKiByZXN0b3JlIHN5c2NhbGwgcmVzdWx0ICovCi0JbHdpCXI0LCByMSwgUFRPICsgUFRfUjQ7Ci0KLQlzd2kJcjAsIHIwLCBQRVJfQ1BVKEtNKTsJLyogTm93IG9mZmljaWFsbHkgaW4gdXNlciBzdGF0ZS4gKi8KKzE6CXNldF9iaXA7CQkJLyogIEludHMgbWFza2VkIGZvciBzdGF0ZSByZXN0b3JlICovCiAJc3dpCUNVUlJFTlRfVEFTSywgcjAsIFBFUl9DUFUoQ1VSUkVOVF9TQVZFKTsgLyogc2F2ZSBjdXJyZW50ICovCiAJVk1fT0ZGOwogCXRvcGh5cyhyMSxyMSk7CiAJUkVTVE9SRV9SRUdTOwogCWFkZGlrCXIxLCByMSwgU1RBVEVfU0FWRV9TSVpFCQkvKiBDbGVhbiB1cCBzdGFjayBzcGFjZS4gICovCiAJbHdpCXIxLCByMSwgUFRfUjEgLSBQVF9TSVpFOy8qIFJlc3RvcmUgdXNlciBzdGFjayBwb2ludGVyLiAqLwotCWJyaQk2ZjsKLQotLyogUmV0dXJuIHRvIGtlcm5lbCBzdGF0ZS4gICovCi0yOglWTV9PRkY7Ci0JdG9waHlzKHIxLHIxKTsKLQlSRVNUT1JFX1JFR1M7Ci0JYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJCS8qIENsZWFuIHVwIHN0YWNrIHNwYWNlLiAgKi8KLQl0b3ZpcnQocjEscjEpOwotNjoKIFRSQVBfcmV0dXJuOgkJLyogTWFrZSBnbG9iYWwgc3ltYm9sIGZvciBkZWJ1Z2dpbmcgKi8KIAlydGJkCXIxNCwgMDsJLyogSW5zdHJ1Y3Rpb25zIHRvIHJldHVybiBmcm9tIGFuIElSUSAqLwogCW5vcDsKQEAgLTQ1MCwxMiArNDIyLDExIEBACiBDX0VOVFJZKHN5c19mb3JrX3dyYXBwZXIpOgogCWFkZGkJcjUsIHIwLCBTSUdDSExECQkJLyogQXJnIDA6IGZsYWdzICovCiAJbHdpCXI2LCByMSwgUFRPK1BUX1IxCS8qIEFyZyAxOiBjaGlsZCBTUCAodXNlIHBhcmVudCdzKSAqLwotCWxhCXI3LCByMSwgUFRPCQkJLyogQXJnIDI6IHBhcmVudCBjb250ZXh0ICovCisJYWRkaWsJcjcsIHIxLCBQVE8JCQkvKiBBcmcgMjogcGFyZW50IGNvbnRleHQgKi8KIAlhZGQJcjguIHIwLCByMAkJCS8qIEFyZyAzOiAodW51c2VkKSAqLwogCWFkZAlyOSwgcjAsIHIwOwkJCS8qIEFyZyA0OiAodW51c2VkKSAqLwotCWFkZAlyMTAsIHIwLCByMDsJCQkvKiBBcmcgNTogKHVudXNlZCkgKi8KIAlicmlkCWRvX2ZvcmsJCS8qIERvIHJlYWwgd29yayAodGFpbC1jYWxsKSAqLwotCW5vcDsKKwlhZGQJcjEwLCByMCwgcjA7CQkJLyogQXJnIDU6ICh1bnVzZWQpICovCiAKIC8qIFRoaXMgdGhlIGluaXRpYWwgZW50cnkgcG9pbnQgZm9yIGEgbmV3IGNoaWxkIHRocmVhZCwgd2l0aCBhbiBhcHByb3ByaWF0ZQogICAgc3RhY2sgaW4gcGxhY2UgdGhhdCBtYWtlcyBpdCBsb29rIHRoZSB0aGUgY2hpbGQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhbgpAQCAtNDY2LDM1ICs0MzcsMzEgQEAKIAlicmFsaWQJcjE1LCBzY2hlZHVsZV90YWlsOyAvKiAuLi53aGljaCBpcyBzY2hlZHVsZV90YWlsJ3MgYXJnICovCiAJYWRkCXIzLCByNSwgcjA7CS8qIHN3aXRjaF90aHJlYWQgcmV0dXJucyB0aGUgcHJldiB0YXNrICovCiAJCQkJLyogKCBpbiB0aGUgZGVsYXkgc2xvdCApICovCi0JYWRkCXIzLCByMCwgcjA7CS8qIENoaWxkJ3MgZm9yayBjYWxsIHNob3VsZCByZXR1cm4gMC4gKi8KIAlicmlkCXJldF9mcm9tX3RyYXA7CS8qIERvIG5vcm1hbCB0cmFwIHJldHVybiAqLwotCW5vcDsKKwlhZGQJcjMsIHIwLCByMDsJLyogQ2hpbGQncyBmb3JrIGNhbGwgc2hvdWxkIHJldHVybiAwLiAqLwogCiBDX0VOVFJZKHN5c192Zm9yayk6CiAJYnJpZAltaWNyb2JsYXplX3Zmb3JrCS8qIERvIHJlYWwgd29yayAodGFpbC1jYWxsKSAqLwotCWxhCXI1LCByMSwgUFRPCisJYWRkaWsJcjUsIHIxLCBQVE8KIAogQ19FTlRSWShzeXNfY2xvbmUpOgogCWJuZWkJcjYsIDFmOwkJCS8qIFNlZSBpZiBjaGlsZCBTUCBhcmcgKGFyZyAxKSBpcyAwLiAqLwotCWx3aQlyNiwgcjEsIFBUTytQVF9SMTsJLyogSWYgc28sIHVzZSBwYXJldCdzIHN0YWNrIHB0ciAqLwotMToJbGEJcjcsIHIxLCBQVE87CQkJLyogQXJnIDI6IHBhcmVudCBjb250ZXh0ICovCisJbHdpCXI2LCByMSwgUFRPICsgUFRfUjE7CS8qIElmIHNvLCB1c2UgcGFyZXQncyBzdGFjayBwdHIgKi8KKzE6CWFkZGlrCXI3LCByMSwgUFRPOwkJCS8qIEFyZyAyOiBwYXJlbnQgY29udGV4dCAqLwogCWFkZAlyOCwgcjAsIHIwOwkJCS8qIEFyZyAzOiAodW51c2VkKSAqLwogCWFkZAlyOSwgcjAsIHIwOwkJCS8qIEFyZyA0OiAodW51c2VkKSAqLwotCWFkZAlyMTAsIHIwLCByMDsJCQkvKiBBcmcgNTogKHVudXNlZCkgKi8KIAlicmlkCWRvX2ZvcmsJCS8qIERvIHJlYWwgd29yayAodGFpbC1jYWxsKSAqLwotCW5vcDsKKwlhZGQJcjEwLCByMCwgcjA7CQkJLyogQXJnIDU6ICh1bnVzZWQpICovCiAKIENfRU5UUlkoc3lzX2V4ZWN2ZSk6Ci0JbGEJcjgsIHIxLCBQVE87CQkvKiBhZGQgdXNlciBjb250ZXh0IGFzIDR0aCBhcmcgKi8KIAlicmlkCW1pY3JvYmxhemVfZXhlY3ZlOwkvKiBEbyByZWFsIHdvcmsgKHRhaWwtY2FsbCkuKi8KLQlub3A7CisJYWRkaWsJcjgsIHIxLCBQVE87CQkvKiBhZGQgdXNlciBjb250ZXh0IGFzIDR0aCBhcmcgKi8KIAogQ19FTlRSWShzeXNfcnRfc2lncmV0dXJuX3dyYXBwZXIpOgogCXN3aQlyMywgcjEsIFBUTytQVF9SMzsgLyogcmVzdG9yZSBzYXZlZCByMywgcjQgcmVnaXN0ZXJzICovCiAJc3dpCXI0LCByMSwgUFRPK1BUX1I0OwotCWxhCXI1LCByMSwgUFRPOwkJLyogYWRkIHVzZXIgY29udGV4dCBhcyAxc3QgYXJnICovCiAJYnJsaWQJcjE1LCBzeXNfcnRfc2lncmV0dXJuCS8qIERvIHJlYWwgd29yayAqLwotCW5vcDsKKwlhZGRpawlyNSwgcjEsIFBUTzsJCS8qIGFkZCB1c2VyIGNvbnRleHQgYXMgMXN0IGFyZyAqLwogCWx3aQlyMywgcjEsIFBUTytQVF9SMzsgLyogcmVzdG9yZSBzYXZlZCByMywgcjQgcmVnaXN0ZXJzICovCiAJbHdpCXI0LCByMSwgUFRPK1BUX1I0OwogCWJyaSByZXRfZnJvbV90cmFwIC8qIGZhbGwgdGhyb3VnaCB3aWxsIG5vdCB3b3JrIGhlcmUgZHVlIHRvIGFsaWduICovCkBAIC01MDMsODMgKzQ3MCwyMyBAQAogLyoKICAqIEhXIEVYQ0VQVElPTiBydXRpbmUgc3RhcnQKICAqLwotCi0jZGVmaW5lIFNBVkVfU1RBVEUJXAotCXN3aQlyMTEsIHIwLCBUT1BIWVMocjBfcmFtICsgUFRPICsgUFRfUjExKTsgLyogU2F2ZSByMTEgKi8JXAotCXNldF9iaXA7CS8qZXF1YWxpemUgaW5pdGlhbCBzdGF0ZSBmb3IgYWxsIHBvc3NpYmxlIGVudHJpZXMqL1wKLQljbGVhcl9laXA7CQkJCQkJCVwKLQllbmFibGVfaXJxOwkJCQkJCQlcCi0Jc2V0X2VlOwkJCQkJCQkJXAotCS8qIFNlZSBpZiBhbHJlYWR5IGluIGtlcm5lbCBtb2RlLiovCQkJCVwKLQlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoS00pKTsJCQkJXAotCWJlcWkJcjExLCAxZjsJCS8qIEp1bXAgYWhlYWQgaWYgY29taW5nIGZyb20gdXNlciAqL1wKLQkvKiBLZXJuZWwtbW9kZSBzdGF0ZSBzYXZlLiAgKi8JCQkJCVwKLQkvKiBSZWxvYWQga2VybmVsIHN0YWNrLXB0ci4gKi8JCQkJCVwKLQlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKTsJCQlcCi0JdG9waHlzKHIxLHIxMSk7CQkJCQkJCVwKLQlzd2kJcjExLCByMSwgKFBUX1IxLVBUX1NJWkUpOyAvKiBTYXZlIG9yaWdpbmFsIFNQLiAqLwlcCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhyMF9yYW0gKyBQVE8gKyBQVF9SMTEpOyAvKiByZXN0b3JlIHIxMSAqL1wKLQlhZGRpawlyMSwgcjEsIC1TVEFURV9TQVZFX1NJWkU7IC8qIE1ha2Ugcm9vbSBvbiB0aGUgc3RhY2suICAqL1wKLQkvKiBzdG9yZSByZXR1cm4gcmVnaXN0ZXJzIHNlcGFyYXRlbHkgYmVjYXVzZQkJCVwKLQkgKiB0aGlzIG1hY3JvcyBpcyB1c2UgZm9yIG90aGVycyBleGNlcHRpb25zICovCQkJXAotCXN3aQlyMywgcjEsIFBUTyArIFBUX1IzOwkJCQkJXAotCXN3aQlyNCwgcjEsIFBUTyArIFBUX1I0OwkJCQkJXAotCVNBVkVfUkVHUwkJCQkJCQlcCi0JLyogUEMsIGJlZm9yZSBJUlEvdHJhcCAtIHRoaXMgaXMgb25lIGluc3RydWN0aW9uIGFib3ZlICovCVwKLQlzd2kJcjE3LCByMSwgUFRPK1BUX1BDOwkJCQkJXAotCQkJCQkJCQkJXAotCWFkZGkJcjExLCByMCwgMTsgCQkvKiBXYXMgaW4ga2VybmVsLW1vZGUuICAqLwlcCi0Jc3dpCXIxMSwgcjEsIFBUTytQVF9NT0RFOyAJIAkJCQlcCi0JYnJpZAkyZjsJCQkJCQkJXAotCW5vcDsJCQkJLyogRmlsbCBkZWxheSBzbG90ICovCQlcCi0xOgkvKiBVc2VyLW1vZGUgc3RhdGUgc2F2ZS4gICovCQkJCQlcCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhyMF9yYW0gKyBQVE8gKyBQVF9SMTEpOyAvKiByZXN0b3JlIHIxMSAqL1wKLQlsd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShDVVJSRU5UX1NBVkUpKTsgLyogZ2V0IHNhdmVkIGN1cnJlbnQgKi9cCi0JdG9waHlzKHIxLHIxKTsJCQkJCQkJXAotCWx3aQlyMSwgcjEsIFRTX1RIUkVBRF9JTkZPOwkvKiBnZXQgdGhlIHRocmVhZCBpbmZvICovCVwKLQlhZGRpawlyMSwgcjEsIFRIUkVBRF9TSVpFOwkvKiBjYWxjdWxhdGUga2VybmVsIHN0YWNrIHBvaW50ZXIgKi9cCi0JdG9waHlzKHIxLHIxKTsJCQkJCQkJXAotCQkJCQkJCQkJXAotCWFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgLyogTWFrZSByb29tIG9uIHRoZSBzdGFjay4gICovXAotCS8qIHN0b3JlIHJldHVybiByZWdpc3RlcnMgc2VwYXJhdGVseSBiZWNhdXNlIHRoaXMgbWFjcm9zCVwKLQkgKiBpcyB1c2UgZm9yIG90aGVycyBleGNlcHRpb25zICovCQkJCVwKLQlzd2kJcjMsIHIxLCBQVE8gKyBQVF9SMzsgCQkJCQlcCi0Jc3dpCXI0LCByMSwgUFRPICsgUFRfUjQ7CQkJCQlcCi0JU0FWRV9SRUdTCQkJCQkJCVwKLQkvKiBQQywgYmVmb3JlIElSUS90cmFwIC0gdGhpcyBpcyBvbmUgaW5zdHJ1Y3Rpb24gYWJvdmUgRklYTUUqLwlcCi0Jc3dpCXIxNywgcjEsIFBUTytQVF9QQzsJCQkJCVwKLQkJCQkJCQkJCVwKLQlzd2kJcjAsIHIxLCBQVE8rUFRfTU9ERTsgLyogV2FzIGluIHVzZXItbW9kZS4gICovCQlcCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7CQkJXAotCXN3aQlyMTEsIHIxLCBQVE8rUFRfUjE7IC8qIFN0b3JlIHVzZXIgU1AuICAqLwkJXAotCWFkZGkJcjExLCByMCwgMTsJCQkJCQlcCi0Jc3dpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEtNKSk7IC8qIE5vdyB3ZSdyZSBpbiBrZXJuZWwtbW9kZS4qL1wKLTI6CWx3aQlDVVJSRU5UX1RBU0ssIHIwLCBUT1BIWVMoUEVSX0NQVShDVVJSRU5UX1NBVkUpKTsJXAotCS8qIFNhdmUgYXdheSB0aGUgc3lzY2FsbCBudW1iZXIuICAqLwkJCQlcCi0Jc3dpCXIwLCByMSwgUFRPK1BUX1IwOwkJCQkJXAotCXRvdmlydChyMSxyMSkKLQogQ19FTlRSWShmdWxsX2V4Y2VwdGlvbl90cmFwKToKLQlzd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpIC8qIHNhdmUgc3RhY2sgKi8KIAkvKiBhZGp1c3QgZXhjZXB0aW9uIGFkZHJlc3MgZm9yIHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24KIAkgKiBmb3IgZmluZGluZyB3aGVyZSBpcyBpdCAqLwogCWFkZGlrCXIxNywgcjE3LCAtNAogCVNBVkVfU1RBVEUgLyogU2F2ZSByZWdpc3RlcnMgKi8KKwkvKiBQQywgYmVmb3JlIElSUS90cmFwIC0gdGhpcyBpcyBvbmUgaW5zdHJ1Y3Rpb24gYWJvdmUgKi8KKwlzd2kJcjE3LCByMSwgUFRPK1BUX1BDOworCXRvdmlydChyMSxyMSkKIAkvKiBGSVhNRSB0aGlzIGNhbiBiZSBzdG9yZSBkaXJlY3RseSBpbiBQVF9FU1IgcmVnLgogCSAqIEkgdGVzdGVkIGl0IGJ1dCB0aGVyZSBpcyBhIGZhdWx0ICovCiAJLyogd2hlcmUgdGhlIHRyYXAgc2hvdWxkIHJldHVybiBuZWVkIC04IHRvIGFkanVzdCBmb3IgcnRzZCByMTUsIDggKi8KLQlsYQlyMTUsIHIwLCByZXRfZnJvbV9leGMgLSA4Ci0JbGEJcjUsIHIxLCBQVE8JCSAvKiBwYXJhbWV0ZXIgc3RydWN0IHB0X3JlZ3MgKiByZWdzICovCisJYWRkaWsJcjE1LCByMCwgcmV0X2Zyb21fZXhjIC0gOAogCW1mcwlyNiwgcmVzcgotCW5vcAogCW1mcwlyNywgcmZzcjsJCS8qIHNhdmUgRlNSICovCi0Jbm9wCiAJbXRzCXJmc3IsIHIwOwkvKiBDbGVhciBzdGlja3kgZnNyICovCi0Jbm9wCi0JbGEJcjEyLCByMCwgZnVsbF9leGNlcHRpb24KLQlzZXRfdm1zOwotCXJ0YmQJcjEyLCAwOwotCW5vcDsKKwlydGVkCXIwLCBmdWxsX2V4Y2VwdGlvbgorCWFkZGlrCXI1LCByMSwgUFRPCQkgLyogcGFyYW1ldGVyIHN0cnVjdCBwdF9yZWdzICogcmVncyAqLwogCiAvKgogICogVW5hbGlnbmVkIGRhdGEgdHJhcC4KQEAgLTU5MiwxOSArNDk5LDI3IEBACiAgKiBUaGUgYXNzZW1ibGVyIHJvdXRpbmUgaXMgaW4gImFyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUyIKICAqLwogQ19FTlRSWSh1bmFsaWduZWRfZGF0YV90cmFwKToKLQlzd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpIC8qIHNhdmUgc3RhY2sgKi8KKwkvKiBNUzogSSBoYXZlIHRvIHNhdmUgcjExIHZhbHVlIGFuZCB0aGVuIHJlc3RvcmUgaXQgYmVjYXVzZQorCSAqIHNldF9iaXQsIGNsZWFyX2VpcCwgc2V0X2VlIHVzZSByMTEgYXMgdGVtcCByZWdpc3RlciBpZiBNU1IKKwkgKiBpbnN0cnVjdGlvbnMgYXJlIG5vdCB1c2VkLiBXZSBkb24ndCBuZWVkIHRvIGRvIGlmIE1TUiBpbnN0cnVjdGlvbnMKKwkgKiBhcmUgdXNlZCBhbmQgdGhleSB1c2UgcjAgaW5zdGVhZCBvZiByMTEuCisJICogSSBhbSB1c2luZyBFTlRSWV9TUCB3aGljaCBzaG91bGQgYmUgcHJpbWFyeSB1c2VkIG9ubHkgZm9yIHN0YWNrCisJICogcG9pbnRlciBzYXZpbmcuICovCisJc3dpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7CisJc2V0X2JpcDsgICAgICAgIC8qIGVxdWFsaXplIGluaXRpYWwgc3RhdGUgZm9yIGFsbCBwb3NzaWJsZSBlbnRyaWVzICovCisJY2xlYXJfZWlwOworCXNldF9lZTsKKwlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKTsKIAlTQVZFX1NUQVRFCQkvKiBTYXZlIHJlZ2lzdGVycy4qLworCS8qIFBDLCBiZWZvcmUgSVJRL3RyYXAgLSB0aGlzIGlzIG9uZSBpbnN0cnVjdGlvbiBhYm92ZSAqLworCXN3aQlyMTcsIHIxLCBQVE8rUFRfUEM7CisJdG92aXJ0KHIxLHIxKQogCS8qIHdoZXJlIHRoZSB0cmFwIHNob3VsZCByZXR1cm4gbmVlZCAtOCB0byBhZGp1c3QgZm9yIHJ0c2QgcjE1LCA4ICovCi0JbGEJcjE1LCByMCwgcmV0X2Zyb21fZXhjLTgKKwlhZGRpawlyMTUsIHIwLCByZXRfZnJvbV9leGMtOAogCW1mcwlyMywgcmVzcgkJLyogRVNSICovCi0Jbm9wCiAJbWZzCXI0LCByZWFyCQkvKiBFQVIgKi8KLQlub3AKLQlsYQlyNywgcjEsIFBUTwkJLyogcGFyYW1ldGVyIHN0cnVjdCBwdF9yZWdzICogcmVncyAqLwotCWxhCXIxMiwgcjAsIF91bmFsaWduZWRfZGF0YV9leGNlcHRpb24KLQlzZXRfdm1zOwotCXJ0YmQJcjEyLCAwOwkvKiBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KLQlub3A7CisJcnRiZAlyMCwgX3VuYWxpZ25lZF9kYXRhX2V4Y2VwdGlvbgorCWFkZGlrCXI3LCByMSwgUFRPCQkvKiBwYXJhbWV0ZXIgc3RydWN0IHB0X3JlZ3MgKiByZWdzICovCiAKIC8qCiAgKiBQYWdlIGZhdWx0IHRyYXBzLgpAQCAtNjI1LDM4ICs1NDAsMzIgQEAKICAqLwogLyogZGF0YSBhbmQgaW50cnVjdGlvbiB0cmFwIC0gd2hpY2ggaXMgY2hvb3NlIGlzIHJlc29sdmVkIGludCBmYXVsdC5jICovCiBDX0VOVFJZKHBhZ2VfZmF1bHRfZGF0YV90cmFwKToKLQlzd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpIC8qIHNhdmUgc3RhY2sgKi8KIAlTQVZFX1NUQVRFCQkvKiBTYXZlIHJlZ2lzdGVycy4qLworCS8qIFBDLCBiZWZvcmUgSVJRL3RyYXAgLSB0aGlzIGlzIG9uZSBpbnN0cnVjdGlvbiBhYm92ZSAqLworCXN3aQlyMTcsIHIxLCBQVE8rUFRfUEM7CisJdG92aXJ0KHIxLHIxKQogCS8qIHdoZXJlIHRoZSB0cmFwIHNob3VsZCByZXR1cm4gbmVlZCAtOCB0byBhZGp1c3QgZm9yIHJ0c2QgcjE1LCA4ICovCi0JbGEJcjE1LCByMCwgcmV0X2Zyb21fZXhjLTgKLQlsYQlyNSwgcjEsIFBUTwkJLyogcGFyYW1ldGVyIHN0cnVjdCBwdF9yZWdzICogcmVncyAqLworCWFkZGlrCXIxNSwgcjAsIHJldF9mcm9tX2V4Yy04CiAJbWZzCXI2LCByZWFyCQkvKiBwYXJhbWV0ZXIgdW5zaWduZWQgbG9uZyBhZGRyZXNzICovCi0Jbm9wCiAJbWZzCXI3LCByZXNyCQkvKiBwYXJhbWV0ZXIgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlICovCi0Jbm9wCi0JbGEJcjEyLCByMCwgZG9fcGFnZV9mYXVsdAotCXNldF92bXM7Ci0JcnRiZAlyMTIsIDA7CS8qIGludGVycnVwdHMgZW5hYmxlZCAqLwotCW5vcDsKKwlydGVkCXIwLCBkb19wYWdlX2ZhdWx0CisJYWRkaWsJcjUsIHIxLCBQVE8JCS8qIHBhcmFtZXRlciBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgKi8KIAogQ19FTlRSWShwYWdlX2ZhdWx0X2luc3RyX3RyYXApOgotCXN3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSkgLyogc2F2ZSBzdGFjayAqLwogCVNBVkVfU1RBVEUJCS8qIFNhdmUgcmVnaXN0ZXJzLiovCisJLyogUEMsIGJlZm9yZSBJUlEvdHJhcCAtIHRoaXMgaXMgb25lIGluc3RydWN0aW9uIGFib3ZlICovCisJc3dpCXIxNywgcjEsIFBUTytQVF9QQzsKKwl0b3ZpcnQocjEscjEpCiAJLyogd2hlcmUgdGhlIHRyYXAgc2hvdWxkIHJldHVybiBuZWVkIC04IHRvIGFkanVzdCBmb3IgcnRzZCByMTUsIDggKi8KLQlsYQlyMTUsIHIwLCByZXRfZnJvbV9leGMtOAotCWxhCXI1LCByMSwgUFRPCQkvKiBwYXJhbWV0ZXIgc3RydWN0IHB0X3JlZ3MgKiByZWdzICovCisJYWRkaWsJcjE1LCByMCwgcmV0X2Zyb21fZXhjLTgKIAltZnMJcjYsIHJlYXIJCS8qIHBhcmFtZXRlciB1bnNpZ25lZCBsb25nIGFkZHJlc3MgKi8KLQlub3AKIAlvcmkJcjcsIHIwLCAwCQkvKiBwYXJhbWV0ZXIgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlICovCi0JbGEJcjEyLCByMCwgZG9fcGFnZV9mYXVsdAotCXNldF92bXM7Ci0JcnRiZAlyMTIsIDA7CS8qIGludGVycnVwdHMgZW5hYmxlZCAqLwotCW5vcDsKKwlydGVkCXIwLCBkb19wYWdlX2ZhdWx0CisJYWRkaWsJcjUsIHIxLCBQVE8JCS8qIHBhcmFtZXRlciBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgKi8KIAogLyogRW50cnkgcG9pbnQgdXNlZCB0byByZXR1cm4gZnJvbSBhbiBleGNlcHRpb24uICAqLwogQ19FTlRSWShyZXRfZnJvbV9leGMpOgotCXNldF9iaXA7CQkJLyogIEludHMgbWFza2VkIGZvciBzdGF0ZSByZXN0b3JlKi8KLQlsd2kJcjExLCByMSwgUFRPK1BUX01PREU7CisJbHdpCXIxMSwgcjEsIFBUTyArIFBUX01PREU7CiAJYm5laQlyMTEsIDJmOwkJLyogU2VlIGlmIHJldHVybmluZyB0byBrZXJuZWwgbW9kZSwgKi8KIAkJCQkJLyogLi4uIGlmIHNvLCBza2lwIHJlc2NoZWQgJmMuICAqLwogCkBAIC02ODcsMzIgKzU5NiwyNyBAQAogCSAqIHRyYXBzKSwgYnV0IHNpZ25hbCBoYW5kbGVycyBtYXkgd2FudCB0byBleGFtaW5lIG9yIGNoYW5nZSB0aGUKIAkgKiBjb21wbGV0ZSByZWdpc3RlciBzdGF0ZS4gIEhlcmUgd2Ugc2F2ZSBhbnl0aGluZyBub3Qgc2F2ZWQgYnkKIAkgKiB0aGUgbm9ybWFsIGVudHJ5IHNlcXVlbmNlLCBzbyB0aGF0IGl0IG1heSBiZSBzYWZlbHkgcmVzdG9yZWQKLQkgKiAoaW4gYSBwb3NzaWJseSBtb2RpZmllZCBmb3JtKSBhZnRlciBkb19zaWduYWwgcmV0dXJucy4KLQkgKiBzdG9yZSByZXR1cm4gcmVnaXN0ZXJzIHNlcGFyYXRlbHkgYmVjYXVzZSB0aGlzIG1hY3JvcyBpcyB1c2UKLQkgKiBmb3Igb3RoZXJzIGV4Y2VwdGlvbnMgKi8KLQlsYQlyNSwgcjEsIFBUTzsJCS8qIEFyZyAxOiBzdHJ1Y3QgcHRfcmVncyAqcmVncyAqLworCSAqIChpbiBhIHBvc3NpYmx5IG1vZGlmaWVkIGZvcm0pIGFmdGVyIGRvX3NpZ25hbCByZXR1cm5zLiAqLworCWFkZGlrCXI1LCByMSwgUFRPOwkJLyogQXJnIDE6IHN0cnVjdCBwdF9yZWdzICpyZWdzICovCiAJYWRkaQlyNywgcjAsIDA7CQkvKiBBcmcgMzogaW50IGluX3N5c2NhbGwgKi8KIAlicmFsaWQJcjE1LCBkb19zaWduYWw7CS8qIEhhbmRsZSBhbnkgc2lnbmFscyAqLwogCWFkZAlyNiwgcjAsIHIwOwkJLyogQXJnIDI6IHNpZ3NldF90ICpvbGRzZXQgKi8KIAogLyogRmluYWxseSwgcmV0dXJuIHRvIHVzZXIgc3RhdGUuICAqLwotMToJc3dpCXIwLCByMCwgUEVSX0NQVShLTSk7CS8qIE5vdyBvZmZpY2lhbGx5IGluIHVzZXIgc3RhdGUuICovCisxOglzZXRfYmlwOwkJCS8qIEludHMgbWFza2VkIGZvciBzdGF0ZSByZXN0b3JlICovCiAJc3dpCUNVUlJFTlRfVEFTSywgcjAsIFBFUl9DUFUoQ1VSUkVOVF9TQVZFKTsgLyogc2F2ZSBjdXJyZW50ICovCiAJVk1fT0ZGOwogCXRvcGh5cyhyMSxyMSk7CiAKLQlsd2kJcjMsIHIxLCBQVE8rUFRfUjM7IC8qIHJlc3RvcmUgc2F2ZWQgcjMsIHI0IHJlZ2lzdGVycyAqLwotCWx3aQlyNCwgcjEsIFBUTytQVF9SNDsKIAlSRVNUT1JFX1JFR1M7CiAJYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJCS8qIENsZWFuIHVwIHN0YWNrIHNwYWNlLiAgKi8KIAogCWx3aQlyMSwgcjEsIFBUX1IxIC0gUFRfU0laRTsgLyogUmVzdG9yZSB1c2VyIHN0YWNrIHBvaW50ZXIuICovCiAJYnJpCTZmOwogLyogUmV0dXJuIHRvIGtlcm5lbCBzdGF0ZS4gICovCi0yOglWTV9PRkY7CisyOglzZXRfYmlwOwkJCS8qIEludHMgbWFza2VkIGZvciBzdGF0ZSByZXN0b3JlICovCisJVk1fT0ZGOwogCXRvcGh5cyhyMSxyMSk7Ci0JbHdpCXIzLCByMSwgUFRPK1BUX1IzOyAvKiByZXN0b3JlIHNhdmVkIHIzLCByNCByZWdpc3RlcnMgKi8KLQlsd2kJcjQsIHIxLCBQVE8rUFRfUjQ7CiAJUkVTVE9SRV9SRUdTOwogCWFkZGlrCXIxLCByMSwgU1RBVEVfU0FWRV9TSVpFCQkvKiBDbGVhbiB1cCBzdGFjayBzcGFjZS4gICovCiAKQEAgLTczNiwzNiArNjQwLDIzIEBACiAvKiBNUzogd2UgYXJlIGluIHBoeXNpY2FsIGFkZHJlc3MgKi8KIC8qIFNhdmUgcmVnaXN0ZXJzLCBzd2l0Y2ggdG8gcHJvcGVyIHN0YWNrLCBjb252ZXJ0IFNQIHRvIHZpcnR1YWwuKi8KIAlzd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpCi0Jc3dpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKFIxMV9TQVZFKSk7CiAJLyogTVM6IFNlZSBpZiBhbHJlYWR5IGluIGtlcm5lbCBtb2RlLiAqLwotCWx3aQlyMTEsIHIwLCBUT1BIWVMoUEVSX0NQVShLTSkpOwotCWJlcWkJcjExLCAxZjsgLyogTVM6IEp1bXAgYWhlYWQgaWYgY29taW5nIGZyb20gdXNlciAqLworCW1mcwlyMSwgcm1zcgorCW5vcAorCWFuZGkJcjEsIHIxLCBNU1JfVU1TCisJYm5laQlyMSwgMWYKIAogLyogS2VybmVsLW1vZGUgc3RhdGUgc2F2ZS4gKi8KLQlvcglyMTEsIHIxLCByMAotCXRvcGh5cyhyMSxyMTEpOyAvKiBNUzogSSBoYXZlIGluIHIxIHBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgc3RhY2sgaXMgKi8KLS8qIE1TOiBTYXZlIG9yaWdpbmFsIFNQIC0gcG9zaXRpb24gUFRfUjEgdG8gbmV4dCBzdGFjayBmcmFtZSA0ICoxIC0gMTUyKi8KLQlzd2kJcjExLCByMSwgKFBUX1IxIC0gUFRfU0laRSk7Ci0vKiBNUzogcmVzdG9yZSByMTEgYmVjYXVzZSBvZiBzYXZpbmcgaW4gU0FWRV9SRUdTICovCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKFIxMV9TQVZFKSk7CisJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKQorCXRvcGh5cyhyMSxyMSk7IC8qIE1TOiBJIGhhdmUgaW4gcjEgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSBzdGFjayBpcyAqLwogCS8qIHNhdmUgcmVnaXN0ZXJzICovCiAvKiBNUzogTWFrZSByb29tIG9uIHRoZSBzdGFjayAtPiBhY3RpdmF0aW9uIHJlY29yZCAqLwogCWFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsKLS8qIE1TOiBzdG9yZSByZXR1cm4gcmVnaXN0ZXJzIHNlcGFyYXRlbHkgYmVjYXVzZQotICogdGhpcyBtYWNyb3MgaXMgdXNlIGZvciBvdGhlcnMgZXhjZXB0aW9ucyAqLwotCXN3aQlyMywgcjEsIFBUTyArIFBUX1IzOwotCXN3aQlyNCwgcjEsIFBUTyArIFBUX1I0OwogCVNBVkVfUkVHUwotCS8qIE1TOiBzdG9yZSBtb2RlICovCi0JYWRkaQlyMTEsIHIwLCAxOyAvKiBNUzogV2FzIGluIGtlcm5lbC1tb2RlLiAqLwotCXN3aQlyMTEsIHIxLCBQVE8gKyBQVF9NT0RFOyAvKiBNUzogYW5kIHNhdmUgaXQgKi8KIAlicmlkCTJmOwotCW5vcDsgLyogTVM6IEZpbGwgZGVsYXkgc2xvdCAqLwotCisJc3dpCXIxLCByMSwgUFRPICsgUFRfTU9ERTsgLyogMCAtIHVzZXIgbW9kZSwgMSAtIGtlcm5lbCBtb2RlICovCiAxOgogLyogVXNlci1tb2RlIHN0YXRlIHNhdmUuICovCi0vKiBNUzogcmVzdG9yZSByMTEgLT4gRklYTUUgbW92ZSBiZWZvcmUgU0FWRV9SRUcgKi8KLQlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoUjExX1NBVkUpKTsKICAvKiBNUzogZ2V0IHRoZSBzYXZlZCBjdXJyZW50ICovCiAJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CiAJdG9waHlzKHIxLHIxKTsKQEAgLTc3NCwyNyArNjY1LDE4IEBACiAJdG9waHlzKHIxLHIxKTsKIAkvKiBzYXZlIHJlZ2lzdGVycyAqLwogCWFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsKLQlzd2kJcjMsIHIxLCBQVE8rUFRfUjM7Ci0Jc3dpCXI0LCByMSwgUFRPK1BUX1I0OwogCVNBVkVfUkVHUwogCS8qIGNhbGN1bGF0ZSBtb2RlICovCiAJc3dpCXIwLCByMSwgUFRPICsgUFRfTU9ERTsKIAlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKTsKIAlzd2kJcjExLCByMSwgUFRPK1BUX1IxOwotCS8qIHNldHVwIGtlcm5lbCBtb2RlIHRvIEtNICovCi0JYWRkaQlyMTEsIHIwLCAxOwotCXN3aQlyMTEsIHIwLCBUT1BIWVMoUEVSX0NQVShLTSkpOwotCisJY2xlYXJfdW1zOwogMjoKIAlsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7Ci0Jc3dpCXIwLCByMSwgUFRPICsgUFRfUjA7CiAJdG92aXJ0KHIxLHIxKQotCWxhCXI1LCByMSwgUFRPOwotCXNldF92bXM7Ci0JbGEJcjExLCByMCwgZG9fSVJROwotCWxhCXIxNSwgcjAsIGlycV9jYWxsOwotaXJxX2NhbGw6cnRiZAlyMTEsIDA7Ci0Jbm9wOworCWFkZGlrCXIxNSwgcjAsIGlycV9jYWxsOworaXJxX2NhbGw6cnRiZAlyMCwgZG9fSVJROworCWFkZGlrCXI1LCByMSwgUFRPOwogCiAvKiBNUzogd2UgYXJlIGluIHZpcnR1YWwgbW9kZSAqLwogcmV0X2Zyb21faXJxOgpAQCAtODE1LDcgKzY5Nyw3IEBACiAJYmVxaWQJcjExLCBub19pbnRyX3Jlc2NoZWQKIC8qIEhhbmRsZSBhIHNpZ25hbCByZXR1cm47IFBlbmRpbmcgc2lnbmFscyBzaG91bGQgYmUgaW4gcjE4LiAqLwogCWFkZGkJcjcsIHIwLCAwOyAvKiBBcmcgMzogaW50IGluX3N5c2NhbGwgKi8KLQlsYQlyNSwgcjEsIFBUTzsgLyogQXJnIDE6IHN0cnVjdCBwdF9yZWdzICpyZWdzICovCisJYWRkaWsJcjUsIHIxLCBQVE87IC8qIEFyZyAxOiBzdHJ1Y3QgcHRfcmVncyAqcmVncyAqLwogCWJyYWxpZAlyMTUsIGRvX3NpZ25hbDsJLyogSGFuZGxlIGFueSBzaWduYWxzICovCiAJYWRkCXI2LCByMCwgcjA7IC8qIEFyZyAyOiBzaWdzZXRfdCAqb2xkc2V0ICovCiAKQEAgLTgyMywxMiArNzA1LDkgQEAKIG5vX2ludHJfcmVzY2hlZDoKICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMsIHdlIGFyZSBub3cgY29tbWl0dGVkIHRvIHRoZSBzdGF0ZSByZXN0b3JlICovCiAJZGlzYWJsZV9pcnEKLQlzd2kJcjAsIHIwLCBQRVJfQ1BVKEtNKTsgLyogTVM6IE5vdyBvZmZpY2lhbGx5IGluIHVzZXIgc3RhdGUuICovCiAJc3dpCUNVUlJFTlRfVEFTSywgcjAsIFBFUl9DUFUoQ1VSUkVOVF9TQVZFKTsKIAlWTV9PRkY7CiAJdG9waHlzKHIxLHIxKTsKLQlsd2kJcjMsIHIxLCBQVE8gKyBQVF9SMzsgLyogTVM6IHJlc3RvcmUgc2F2ZWQgcjMsIHI0IHJlZ2lzdGVycyAqLwotCWx3aQlyNCwgcjEsIFBUTyArIFBUX1I0OwogCVJFU1RPUkVfUkVHUwogCWFkZGlrCXIxLCByMSwgU1RBVEVfU0FWRV9TSVpFIC8qIE1TOiBDbGVhbiB1cCBzdGFjayBzcGFjZS4gKi8KIAlsd2kJcjEsIHIxLCBQVF9SMSAtIFBUX1NJWkU7CkBAIC04NTcsOCArNzM2LDYgQEAKICNlbmRpZgogCVZNX09GRiAvKiBNUzogdHVybiBvZmYgTU1VICovCiAJdG9waHlzKHIxLHIxKQotCWx3aQlyMywgcjEsIFBUTyArIFBUX1IzOyAvKiBNUzogcmVzdG9yZSBzYXZlZCByMywgcjQgcmVnaXN0ZXJzICovCi0JbHdpCXI0LCByMSwgUFRPICsgUFRfUjQ7CiAJUkVTVE9SRV9SRUdTCiAJYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJLyogTVM6IENsZWFuIHVwIHN0YWNrIHNwYWNlLiAqLwogCXRvdmlydChyMSxyMSk7CkBAIC04NjgsODYgKzc0NSw5MSBAQAogCW5vcAogCiAvKgotICogYERlYnVnJyB0cmFwCi0gKiAgV2UgZW50ZXIgZGJ0cmFwIGluICJCSVAiIChicmVha3BvaW50KSBtb2RlLgotICogIFNvIHdlIGV4aXQgdGhlIGJyZWFrcG9pbnQgbW9kZSB3aXRoIGFuICdydGJkJyBhbmQgcHJvY2VlZCB3aXRoIHRoZQotICogIG9yaWdpbmFsIGRidHJhcC4KLSAqICBob3dldmVyLCB3YWl0IHRvIHNhdmUgc3RhdGUgZmlyc3QKKyAqIERlYnVnIHRyYXAgZm9yIEtHREIuIEVudGVyIHRvIF9kZWJ1Z19leGNlcHRpb24gYnkgYnJraSByMTYsIDB4MTgKKyAqIGFuZCBjYWxsIGhhbmRsaW5nIGZ1bmN0aW9uIHdpdGggc2F2ZWQgcHRfcmVncwogICovCiBDX0VOVFJZKF9kZWJ1Z19leGNlcHRpb24pOgogCS8qIEJJUCBiaXQgaXMgc2V0IG9uIGVudHJ5LCBubyBpbnRlcnJ1cHRzIGNhbiBvY2N1ciAqLwogCXN3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSkKIAotCXN3aQlyMTEsIHIwLCBUT1BIWVMocjBfcmFtICsgUFRPICsgUFRfUjExKTsgLyogU2F2ZSByMTEgKi8KLQlzZXRfYmlwOwkvKmVxdWFsaXplIGluaXRpYWwgc3RhdGUgZm9yIGFsbCBwb3NzaWJsZSBlbnRyaWVzKi8KLQljbGVhcl9laXA7Ci0JZW5hYmxlX2lycTsKLQlsd2kJcjExLCByMCwgVE9QSFlTKFBFUl9DUFUoS00pKTsvKiBTZWUgaWYgYWxyZWFkeSBpbiBrZXJuZWwgbW9kZS4qLwotCWJlcWkJcjExLCAxZjsJCS8qIEp1bXAgYWhlYWQgaWYgY29taW5nIGZyb20gdXNlciAqLwotCS8qIEtlcm5lbC1tb2RlIHN0YXRlIHNhdmUuICAqLwotCWx3aQlyMTEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpOyAvKiBSZWxvYWQga2VybmVsIHN0YWNrLXB0ciovCi0JdG9waHlzKHIxLHIxMSk7Ci0Jc3dpCXIxMSwgcjEsIChQVF9SMS1QVF9TSVpFKTsgLyogU2F2ZSBvcmlnaW5hbCBTUC4gKi8KLQlsd2kJcjExLCByMCwgVE9QSFlTKHIwX3JhbSArIFBUTyArIFBUX1IxMSk7IC8qIHJlc3RvcmUgcjExICovCisJbWZzCXIxLCBybXNyCisJbm9wCisJYW5kaQlyMSwgcjEsIE1TUl9VTVMKKwlibmVpCXIxLCAxZgorLyogTVM6IEtlcm5lbC1tb2RlIHN0YXRlIHNhdmUgLSBrZ2RiICovCisJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoRU5UUllfU1ApKTsgLyogUmVsb2FkIGtlcm5lbCBzdGFjay1wdHIqLwogCi0JYWRkaWsJcjEsIHIxLCAtU1RBVEVfU0FWRV9TSVpFOyAvKiBNYWtlIHJvb20gb24gdGhlIHN0YWNrLiAgKi8KLQlzd2kJcjMsIHIxLCBQVE8gKyBQVF9SMzsKLQlzd2kJcjQsIHIxLCBQVE8gKyBQVF9SNDsKKwkvKiBCSVAgYml0IGlzIHNldCBvbiBlbnRyeSwgbm8gaW50ZXJydXB0cyBjYW4gb2NjdXIgKi8KKwlhZGRpayAgIHIxLCByMSwgQ09ORklHX0tFUk5FTF9CQVNFX0FERFIgLSBDT05GSUdfS0VSTkVMX1NUQVJUIC0gU1RBVEVfU0FWRV9TSVpFOwogCVNBVkVfUkVHUzsKKwkvKiBzYXZlIGFsbCByZWdzIHRvIHB0X3JlZyBzdHJ1Y3R1cmUgKi8KKwlzd2kJcjAsIHIxLCBQVE8rUFRfUjA7CS8qIFIwIG11c3QgYmUgc2F2ZWQgdG9vICovCisJc3dpCXIxNCwgcjEsIFBUTytQVF9SMTQJLyogcmV3cml0ZSBzYXZlZCBSMTQgdmFsdWUgKi8KKwlzd2kJcjE2LCByMSwgUFRPK1BUX1IxNgorCXN3aQlyMTYsIHIxLCBQVE8rUFRfUEM7IC8qIFBDIGFuZCByMTYgYXJlIHRoZSBzYW1lICovCisJc3dpCXIxNywgcjEsIFBUTytQVF9SMTcKKwkvKiBzYXZlIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMgdG8gcHRfcmVncyAqLworCW1mcwlyMTEsIHJlYXI7CisJc3dpCXIxMSwgcjEsIFBUTytQVF9FQVI7CisJbWZzCXIxMSwgcmVzcjsKKwlzd2kJcjExLCByMSwgUFRPK1BUX0VTUjsKKwltZnMJcjExLCByZnNyOworCXN3aQlyMTEsIHIxLCBQVE8rUFRfRlNSOwogCi0JYWRkaQlyMTEsIHIwLCAxOyAJCS8qIFdhcyBpbiBrZXJuZWwtbW9kZS4gICovCi0Jc3dpCXIxMSwgcjEsIFBUTyArIFBUX01PREU7Ci0JYnJpZAkyZjsKLQlub3A7CQkJCS8qIEZpbGwgZGVsYXkgc2xvdCAqLwotMTogICAgICAvKiBVc2VyLW1vZGUgc3RhdGUgc2F2ZS4gICovCi0JbHdpCXIxMSwgcjAsIFRPUEhZUyhyMF9yYW0gKyBQVE8gKyBQVF9SMTEpOyAvKiByZXN0b3JlIHIxMSAqLwotCWx3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKENVUlJFTlRfU0FWRSkpOyAvKiBnZXQgc2F2ZWQgY3VycmVudCAqLworCS8qIHN0YWNrIHBvaW50ZXIgaXMgaW4gcGh5c2ljYWwgYWRkcmVzcyBhdCBpdCBpcyBkZWNyZWFzZQorCSAqIGJ5IFNUQVRFX1NBVkVfU0laRSBidXQgd2UgbmVlZCB0byBnZXQgY29ycmVjdCBSMSB2YWx1ZSAqLworCWFkZGlrICAgcjExLCByMSwgQ09ORklHX0tFUk5FTF9TVEFSVCAtIENPTkZJR19LRVJORUxfQkFTRV9BRERSICsgU1RBVEVfU0FWRV9TSVpFOworCXN3aQlyMTEsIHIxLCBQVE8rUFRfUjEKKwkvKiBNUzogcjMxIC0gY3VycmVudCBwb2ludGVyIGlzbid0IGNoYW5nZWQgKi8KKwl0b3ZpcnQocjEscjEpCisjaWZkZWYgQ09ORklHX0tHREIKKwlhZGRpCXI1LCByMSwgUFRPIC8qIHBhc3MgcHRfcmVnIGFkZHJlc3MgYXMgdGhlIGZpcnN0IGFyZyAqLworCWxhCXIxNSwgcjAsIGRidHJhcF9jYWxsOyAvKiByZXR1cm4gYWRkcmVzcyAqLworCXJ0YmQJcjAsIG1pY3JvYmxhemVfa2dkYl9icmVhaworCW5vcDsKKyNlbmRpZgorCS8qIE1TOiBQbGFjZSBoYW5kbGVyIGZvciBicmtpIGZyb20ga2VybmVsIHNwYWNlIGlmIEtHREIgaXMgT0ZGLgorCSAqIEl0IGlzIHZlcnkgdW5saWtlbHkgdGhhdCBhbm90aGVyIGJya2kgaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkLiAqLworCWJyaSAwCisKKy8qIE1TOiBVc2VyLW1vZGUgc3RhdGUgc2F2ZSAtIGdkYiAqLworMToJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7IC8qIGdldCBzYXZlZCBjdXJyZW50ICovCiAJdG9waHlzKHIxLHIxKTsKIAlsd2kJcjEsIHIxLCBUU19USFJFQURfSU5GTzsJLyogZ2V0IHRoZSB0aHJlYWQgaW5mbyAqLwogCWFkZGlrCXIxLCByMSwgVEhSRUFEX1NJWkU7CS8qIGNhbGN1bGF0ZSBrZXJuZWwgc3RhY2sgcG9pbnRlciAqLwogCXRvcGh5cyhyMSxyMSk7CiAKIAlhZGRpawlyMSwgcjEsIC1TVEFURV9TQVZFX1NJWkU7IC8qIE1ha2Ugcm9vbSBvbiB0aGUgc3RhY2suICAqLwotCXN3aQlyMywgcjEsIFBUTyArIFBUX1IzOwotCXN3aQlyNCwgcjEsIFBUTyArIFBUX1I0OwogCVNBVkVfUkVHUzsKLQotCXN3aQlyMCwgcjEsIFBUTytQVF9NT0RFOyAvKiBXYXMgaW4gdXNlci1tb2RlLiAgKi8KKwlzd2kJcjE3LCByMSwgUFRPK1BUX1IxNzsKKwlzd2kJcjE2LCByMSwgUFRPK1BUX1IxNjsKKwlzd2kJcjE2LCByMSwgUFRPK1BUX1BDOwkvKiBTYXZlIExQICovCisJc3dpCXIwLCByMSwgUFRPICsgUFRfTU9ERTsgLyogV2FzIGluIHVzZXItbW9kZS4gICovCiAJbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7CiAJc3dpCXIxMSwgcjEsIFBUTytQVF9SMTsgLyogU3RvcmUgdXNlciBTUC4gICovCi0JYWRkaQlyMTEsIHIwLCAxOwotCXN3aQlyMTEsIHIwLCBUT1BIWVMoUEVSX0NQVShLTSkpOwkvKiBOb3cgd2UncmUgaW4ga2VybmVsLW1vZGUuICAqLwotMjoJbHdpCUNVUlJFTlRfVEFTSywgcjAsIFRPUEhZUyhQRVJfQ1BVKENVUlJFTlRfU0FWRSkpOwotCS8qIFNhdmUgYXdheSB0aGUgc3lzY2FsbCBudW1iZXIuICAqLwotCXN3aQlyMCwgcjEsIFBUTytQVF9SMDsKKwlsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CiAJdG92aXJ0KHIxLHIxKQotCi0JYWRkaQlyNSwgcjAsIFNJR1RSQVAJCSAgICAgLyogc2VuZCB0aGUgdHJhcCBzaWduYWwgKi8KLQlhZGQJcjYsIHIwLCBDVVJSRU5UX1RBU0s7IC8qIEdldCBjdXJyZW50IHRhc2sgcHRyIGludG8gcjExICovCi0JYWRkawlyNywgcjAsIHIwCQkgICAgIC8qIDNyZCBwYXJhbSB6ZXJvICovCi0KIAlzZXRfdm1zOwotCWxhCXIxMSwgcjAsIHNlbmRfc2lnOwotCWxhCXIxNSwgcjAsIGRidHJhcF9jYWxsOwotZGJ0cmFwX2NhbGw6CXJ0YmQJcjExLCAwOwotCW5vcDsKKwlhZGRpawlyNSwgcjEsIFBUTzsKKwlhZGRpawlyMTUsIHIwLCBkYnRyYXBfY2FsbDsKK2RidHJhcF9jYWxsOiAvKiBSZXR1cm4gcG9pbnQgZm9yIGtlcm5lbC91c2VyIGVudHJ5ICsgOCBiZWNhdXNlIG9mIHJ0c2QgcjE1LCA4ICovCisJcnRiZAlyMCwgc3dfZXhjZXB0aW9uCisJbm9wCiAKLQlzZXRfYmlwOwkJCS8qICBJbnRzIG1hc2tlZCBmb3Igc3RhdGUgcmVzdG9yZSovCi0JbHdpCXIxMSwgcjEsIFBUTytQVF9NT0RFOworCS8qIE1TOiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgZ2RiL2tnZGIgKi8KKwlzZXRfYmlwOyAvKiBJbnRzIG1hc2tlZCBmb3Igc3RhdGUgcmVzdG9yZSAqLworCWx3aQlyMTEsIHIxLCBQVE8gKyBQVF9NT0RFOwogCWJuZWkJcjExLCAyZjsKLQorLyogTVM6IFJldHVybiB0byB1c2VyIHNwYWNlIC0gZ2RiICovCiAJLyogR2V0IGN1cnJlbnQgdGFzayBwdHIgaW50byByMTEgKi8KIAlsd2kJcjExLCBDVVJSRU5UX1RBU0ssIFRTX1RIUkVBRF9JTkZPOwkvKiBnZXQgdGhyZWFkIGluZm8gKi8KIAlsd2kJcjExLCByMTEsIFRJX0ZMQUdTOwkvKiBnZXQgZmxhZ3MgaW4gdGhyZWFkIGluZm8gKi8KIAlhbmRpCXIxMSwgcjExLCBfVElGX05FRURfUkVTQ0hFRDsKIAliZXFpCXIxMSwgNWY7CiAKLS8qIENhbGwgdGhlIHNjaGVkdWxlciBiZWZvcmUgcmV0dXJuaW5nIGZyb20gYSBzeXNjYWxsL3RyYXAuICovCi0KKwkvKiBDYWxsIHRoZSBzY2hlZHVsZXIgYmVmb3JlIHJldHVybmluZyBmcm9tIGEgc3lzY2FsbC90cmFwLiAqLwogCWJyYWxpZAlyMTUsIHNjaGVkdWxlOwkvKiBDYWxsIHNjaGVkdWxlciAqLwogCW5vcDsJCQkJLyogZGVsYXkgc2xvdCAqLwotCS8qIFhYWCBJcyBQVF9EVFJBQ0UgaGFuZGxpbmcgbmVlZGVkIGhlcmU/ICovCi0JLyogWFhYIG02OGtub21tdSBhbHNvIGNoZWNrcyBUQVNLX1NUQVRFICYgVEFTS19DT1VOVEVSIGhlcmUuICAqLwogCiAJLyogTWF5YmUgaGFuZGxlIGEgc2lnbmFsICovCiA1Oglsd2kJcjExLCBDVVJSRU5UX1RBU0ssIFRTX1RIUkVBRF9JTkZPOwkvKiBnZXQgdGhyZWFkIGluZm8gKi8KQEAgLTk1NSw1MiArODM3LDM4IEBACiAJYW5kaQlyMTEsIHIxMSwgX1RJRl9TSUdQRU5ESU5HOwogCWJlcWkJcjExLCAxZjsJCS8qIFNpZ25hbHMgdG8gaGFuZGxlLCBoYW5kbGUgdGhlbSAqLwogCi0vKiBIYW5kbGUgYSBzaWduYWwgcmV0dXJuOyBQZW5kaW5nIHNpZ25hbHMgc2hvdWxkIGJlIGluIHIxOC4gICovCi0JLyogTm90IGFsbCByZWdpc3RlcnMgYXJlIHNhdmVkIGJ5IHRoZSBub3JtYWwgdHJhcC9pbnRlcnJ1cHQgZW50cnkKLQkgICBwb2ludHMgKGZvciBpbnN0YW5jZSwgY2FsbC1zYXZlZCByZWdpc3RlcnMgKGJlY2F1c2UgdGhlIG5vcm1hbAotCSAgIEMtY29tcGlsZXIgY2FsbGluZyBzZXF1ZW5jZSBpbiB0aGUga2VybmVsIG1ha2VzIHN1cmUgdGhleSdyZQotCSAgIHByZXNlcnZlZCksIGFuZCBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMgaW4gdGhlIGNhc2Ugb2YKLQkgICB0cmFwcyksIGJ1dCBzaWduYWwgaGFuZGxlcnMgbWF5IHdhbnQgdG8gZXhhbWluZSBvciBjaGFuZ2UgdGhlCi0JICAgY29tcGxldGUgcmVnaXN0ZXIgc3RhdGUuICBIZXJlIHdlIHNhdmUgYW55dGhpbmcgbm90IHNhdmVkIGJ5Ci0JICAgdGhlIG5vcm1hbCBlbnRyeSBzZXF1ZW5jZSwgc28gdGhhdCBpdCBtYXkgYmUgc2FmZWx5IHJlc3RvcmVkCi0JICAgKGluIGEgcG9zc2libHkgbW9kaWZpZWQgZm9ybSkgYWZ0ZXIgZG9fc2lnbmFsIHJldHVybnMuICAqLwotCi0JbGEJcjUsIHIxLCBQVE87CQkvKiBBcmcgMTogc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKi8KKwlhZGRpawlyNSwgcjEsIFBUTzsJCS8qIEFyZyAxOiBzdHJ1Y3QgcHRfcmVncyAqcmVncyAqLwogCWFkZGkgIHI3LCByMCwgMDsJLyogQXJnIDM6IGludCBpbl9zeXNjYWxsICovCiAJYnJhbGlkCXIxNSwgZG9fc2lnbmFsOwkvKiBIYW5kbGUgYW55IHNpZ25hbHMgKi8KIAlhZGQJcjYsIHIwLCByMDsJCS8qIEFyZyAyOiBzaWdzZXRfdCAqb2xkc2V0ICovCiAKLQogLyogRmluYWxseSwgcmV0dXJuIHRvIHVzZXIgc3RhdGUuICAqLwotMToJc3dpCXIwLCByMCwgUEVSX0NQVShLTSk7CS8qIE5vdyBvZmZpY2lhbGx5IGluIHVzZXIgc3RhdGUuICovCi0Jc3dpCUNVUlJFTlRfVEFTSywgcjAsIFBFUl9DUFUoQ1VSUkVOVF9TQVZFKTsgLyogc2F2ZSBjdXJyZW50ICovCisxOglzd2kJQ1VSUkVOVF9UQVNLLCByMCwgUEVSX0NQVShDVVJSRU5UX1NBVkUpOyAvKiBzYXZlIGN1cnJlbnQgKi8KIAlWTV9PRkY7CiAJdG9waHlzKHIxLHIxKTsKLQotCWx3aQlyMywgcjEsIFBUTytQVF9SMzsgLyogcmVzdG9yZSBzYXZlZCByMywgcjQgcmVnaXN0ZXJzICovCi0JbHdpCXI0LCByMSwgUFRPK1BUX1I0OworCS8qIE1TOiBSZXN0b3JlIGFsbCByZWdzICovCiAJUkVTVE9SRV9SRUdTCi0JYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJCS8qIENsZWFuIHVwIHN0YWNrIHNwYWNlLiAgKi8KLQotCi0JbHdpCXIxLCByMSwgUFRfUjEgLSBQVF9TSVpFOwotCQkJCQkvKiBSZXN0b3JlIHVzZXIgc3RhY2sgcG9pbnRlci4gKi8KLQlicmkJNmY7Ci0KLS8qIFJldHVybiB0byBrZXJuZWwgc3RhdGUuICAqLwotMjoJVk1fT0ZGOwotCXRvcGh5cyhyMSxyMSk7Ci0JbHdpCXIzLCByMSwgUFRPK1BUX1IzOyAvKiByZXN0b3JlIHNhdmVkIHIzLCByNCByZWdpc3RlcnMgKi8KLQlsd2kJcjQsIHIxLCBQVE8rUFRfUjQ7Ci0JUkVTVE9SRV9SRUdTCi0JYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJCS8qIENsZWFuIHVwIHN0YWNrIHNwYWNlLiAgKi8KLQotCXRvdmlydChyMSxyMSk7Ci02OgotREJUUkFQX3JldHVybjoJCS8qIE1ha2UgZ2xvYmFsIHN5bWJvbCBmb3IgZGVidWdnaW5nICovCi0JcnRiZAlyMTQsIDA7CS8qIEluc3RydWN0aW9ucyB0byByZXR1cm4gZnJvbSBhbiBJUlEgKi8KKwlsd2kJcjE3LCByMSwgUFRPK1BUX1IxNzsKKwlsd2kJcjE2LCByMSwgUFRPK1BUX1IxNjsKKwlhZGRpawlyMSwgcjEsIFNUQVRFX1NBVkVfU0laRQkgLyogQ2xlYW4gdXAgc3RhY2sgc3BhY2UgKi8KKwlsd2kJcjEsIHIxLCBQVF9SMSAtIFBUX1NJWkU7IC8qIFJlc3RvcmUgdXNlciBzdGFjayBwb2ludGVyICovCitEQlRSQVBfcmV0dXJuX3VzZXI6IC8qIE1TOiBNYWtlIGdsb2JhbCBzeW1ib2wgZm9yIGRlYnVnZ2luZyAqLworCXJ0YmQJcjE2LCAwOyAvKiBNUzogSW5zdHJ1Y3Rpb25zIHRvIHJldHVybiBmcm9tIGEgZGVidWcgdHJhcCAqLwogCW5vcDsKIAorLyogTVM6IFJldHVybiB0byBrZXJuZWwgc3RhdGUgLSBrZ2RiICovCisyOglWTV9PRkY7CisJdG9waHlzKHIxLHIxKTsKKwkvKiBNUzogUmVzdG9yZSBhbGwgcmVncyAqLworCVJFU1RPUkVfUkVHUworCWx3aQlyMTQsIHIxLCBQVE8rUFRfUjE0OworCWx3aQlyMTYsIHIxLCBQVE8rUFRfUEM7CisJbHdpCXIxNywgcjEsIFBUTytQVF9SMTc7CisJYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkU7IC8qIE1TOiBDbGVhbiB1cCBzdGFjayBzcGFjZSAqLworCXRvdmlydChyMSxyMSk7CitEQlRSQVBfcmV0dXJuX2tlcm5lbDogLyogTVM6IE1ha2UgZ2xvYmFsIHN5bWJvbCBmb3IgZGVidWdnaW5nICovCisJcnRiZAlyMTYsIDA7IC8qIE1TOiBJbnN0cnVjdGlvbnMgdG8gcmV0dXJuIGZyb20gYSBkZWJ1ZyB0cmFwICovCisJbm9wOwogCiAKIEVOVFJZKF9zd2l0Y2hfdG8pCkBAIC0xMDM3LDE2ICs5MDUsMTIgQEAKIAlzd2kJcjMwLCByMTEsIENDX1IzMAogCS8qIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KIAltZnMJcjEyLCBybXNyCi0Jbm9wCiAJc3dpCXIxMiwgcjExLCBDQ19NU1IKIAltZnMJcjEyLCByZWFyCi0Jbm9wCiAJc3dpCXIxMiwgcjExLCBDQ19FQVIKIAltZnMJcjEyLCByZXNyCi0Jbm9wCiAJc3dpCXIxMiwgcjExLCBDQ19FU1IKIAltZnMJcjEyLCByZnNyCi0Jbm9wCiAJc3dpCXIxMiwgcjExLCBDQ19GU1IKIAogCS8qIHVwZGF0ZSByMzEsIHRoZSBjdXJyZW50LWdpdmUgbWUgcG9pbnRlciB0byB0YXNrIHdoaWNoIHdpbGwgYmUgbmV4dCAqLwpAQCAtMTA4NSwxMCArOTQ5LDggQEAKIAkvKiBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCiAJbHdpCXIxMiwgcjExLCBDQ19GU1IKIAltdHMJcmZzciwgcjEyCi0Jbm9wCiAJbHdpCXIxMiwgcjExLCBDQ19NU1IKIAltdHMJcm1zciwgcjEyCi0Jbm9wCiAKIAlydHNkCXIxNSwgOAogCW5vcApAQCAtMTA5NiwxNSArOTU4LDYgQEAKIEVOVFJZKF9yZXNldCkKIAlicmFpCTB4NzA7IC8qIEp1bXAgYmFjayB0byBGUy1ib290ICovCiAKLUVOVFJZKF9icmVhaykKLQltZnMJcjUsIHJtc3IKLQlub3AKLQlzd2kJcjUsIHIwLCAweDI1MCArIFRPUEhZUyhyMF9yYW0pCi0JbWZzCXI1LCByZXNyCi0Jbm9wCi0Jc3dpCXI1LCByMCwgMHgyNTQgKyBUT1BIWVMocjBfcmFtKQotCWJyaQkwCi0KIAkvKiBUaGVzZSBhcmUgY29tcGlsZWQgYW5kIGxvYWRlZCBpbnRvIGhpZ2ggbWVtb3J5LCB0aGVuCiAJICogY29waWVkIGludG8gcGxhY2UgaW4gbWFjaF9lYXJseV9zZXR1cCAqLwogCS5zZWN0aW9uCS5pbml0Lml2dCwgImF4IgpAQCAtMTExNiwxNCArOTY5LDM4IEBACiAJbm9wCiAJYnJhaQlUT1BIWVMoX3VzZXJfZXhjZXB0aW9uKTsgLyogc3lzY2FsbCBoYW5kbGVyICovCiAJYnJhaQlUT1BIWVMoX2ludGVycnVwdCk7CS8qIEludGVycnVwdCBoYW5kbGVyICovCi0JYnJhaQlUT1BIWVMoX2JyZWFrKTsJCS8qIG5taSB0cmFwIGhhbmRsZXIgKi8KKwlicmFpCVRPUEhZUyhfZGVidWdfZXhjZXB0aW9uKTsJLyogZGVidWcgdHJhcCBoYW5kbGVyICovCiAJYnJhaQlUT1BIWVMoX2h3X2V4Y2VwdGlvbl9oYW5kbGVyKTsJLyogSFcgZXhjZXB0aW9uIGhhbmRsZXIgKi8KIAotCS5vcmcJMHg2MAotCWJyYWkJVE9QSFlTKF9kZWJ1Z19leGNlcHRpb24pOwkvKiBkZWJ1ZyB0cmFwIGhhbmRsZXIqLwotCiAuc2VjdGlvbiAucm9kYXRhLCJhIgogI2luY2x1ZGUgInN5c2NhbGxfdGFibGUuUyIKIAogc3lzY2FsbF90YWJsZV9zaXplPSguLXN5c19jYWxsX3RhYmxlKQogCit0eXBlX1NZU0NBTEw6CisJLmFzY2lpICJTWVNDQUxMXDAiCit0eXBlX0lSUToKKwkuYXNjaWkgIklSUVwwIgordHlwZV9JUlFfUFJFRU1QVDoKKwkuYXNjaWkgIklSUSAoUFJFRU1QVEVEKVwwIgordHlwZV9TWVNDQUxMX1BSRUVNUFQ6CisJLmFzY2lpICIgU1lTQ0FMTCAoUFJFRU1QVEVEKVwwIgorCisJLyoKKwkgKiBUcmFwIGRlY29kaW5nIGZvciBzdGFjayB1bndpbmRlcgorCSAqIFR1cGxlcyBhcmUgKHN0YXJ0IGFkZHIsIGVuZCBhZGRyLCBzdHJpbmcpCisJICogSWYgcmV0dXJuIGFkZHJlc3MgbGllcyBvbiBbc3RhcnQgYWRkciwgZW5kIGFkZHJdLAorCSAqIHVud2luZGVyIGRpc3BsYXlzICdzdHJpbmcnCisJICovCisKKwkuYWxpZ24gNAorLmdsb2JhbCBtaWNyb2JsYXplX3RyYXBfaGFuZGxlcnMKK21pY3JvYmxhemVfdHJhcF9oYW5kbGVyczoKKwkvKiBFeGFjdCBtYXRjaGVzIGNvbWUgZmlyc3QgKi8KKwkud29yZCByZXRfZnJvbV90cmFwOyAud29yZCByZXRfZnJvbV90cmFwICAgOyAud29yZCB0eXBlX1NZU0NBTEwKKwkud29yZCByZXRfZnJvbV9pcnEgOyAud29yZCByZXRfZnJvbV9pcnEgICAgOyAud29yZCB0eXBlX0lSUQorCS8qIEZ1enp5IG1hdGNoZXMgZ28gaGVyZSAqLworCS53b3JkIHJldF9mcm9tX2lycSA7IC53b3JkIG5vX2ludHJfcmVzY2hlZCA7IC53b3JkIHR5cGVfSVJRX1BSRUVNUFQKKwkud29yZCByZXRfZnJvbV90cmFwOyAud29yZCBUUkFQX3JldHVybiAgICAgOyAud29yZCB0eXBlX1NZU0NBTExfUFJFRU1QVAorCS8qIEVuZCBvZiB0YWJsZSAqLworCS53b3JkIDAgICAgICAgICAgICAgICA7IC53b3JkIDAgICAgICAgICAgICAgICA7IC53b3JkIDAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKaW5kZXggMDJjYmRmZS4uYjk4ZWU4ZCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKQEAgLTQ4LDEyICs0OCwxNyBAQAogCWRvX2V4aXQoZXJyKTsKIH0KIAorLyogZm9yIHVzZXIgYXBwbGljYXRpb24gZGVidWdnaW5nICovCit2b2lkIHN3X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlfZXhjZXB0aW9uKFNJR1RSQVAsIHJlZ3MsIFRSQVBfQlJLUFQsIHJlZ3MtPnIxNik7Cit9CisKIHZvaWQgX2V4Y2VwdGlvbihpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY29kZSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXNpZ2luZm9fdCBpbmZvOwogCiAJaWYgKGtlcm5lbF9tb2RlKHJlZ3MpKSB7Ci0JCWRlYnVnZ2VyKHJlZ3MpOwogCQlkaWUoIkV4Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZSIsIHJlZ3MsIHNpZ25yKTsKIAl9CiAJaW5mby5zaV9zaWdubyA9IHNpZ25yOwpAQCAtMTQzLDcgKzE0OCw3IEBACiAjaWZkZWYgQ09ORklHX01NVQogCWNhc2UgTUlDUk9CTEFaRV9QUklWSUxFR0VEX0VYQ0VQVElPTjoKIAkJcHJfZGVidWcoS0VSTl9XQVJOSU5HICJQcml2aWxlZ2VkIGV4Y2VwdGlvblxuIik7Ci0JCS8qICJicmsgcjAscjAiIC0gdXNlZCBhcyBkZWJ1ZyBicmVha3BvaW50ICovCisJCS8qICJicmsgcjAscjAiIC0gdXNlZCBhcyBkZWJ1ZyBicmVha3BvaW50IC0gb2xkIHRvb2xjaGFpbiAqLwogCQlpZiAoZ2V0X3VzZXIoY29kZSwgKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5wYykgPT0gMAogCQkJJiYgY29kZSA9PSAweDk4MGMwMDAwKSB7CiAJCQlfZXhjZXB0aW9uKFNJR1RSQVAsIHJlZ3MsIFRSQVBfQlJLUFQsIGFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9oZWFkLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2hlYWQuUwppbmRleCAxYmY3Mzk4Li40MjQzNDAwIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2hlYWQuUworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2hlYWQuUwpAQCAtNDMsMTAgKzQzLDEwIEBACiAuZ2xvYmFsIGVtcHR5X3plcm9fcGFnZQogLmFsaWduIDEyCiBlbXB0eV96ZXJvX3BhZ2U6Ci0JLnNwYWNlCTQwOTYKKwkuc3BhY2UJUEFHRV9TSVpFCiAuZ2xvYmFsIHN3YXBwZXJfcGdfZGlyCiBzd2FwcGVyX3BnX2RpcjoKLQkuc3BhY2UJNDA5NgorCS5zcGFjZQlQQUdFX1NJWkUKIAogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9od19leGNlcHRpb25faGFuZGxlci5TIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9od19leGNlcHRpb25faGFuZGxlci5TCmluZGV4IDk5NWEyMTIuLjc4MTE5NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2h3X2V4Y2VwdGlvbl9oYW5kbGVyLlMKQEAgLTc4LDkgKzc4LDYgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogLyogSGVscGZ1bCBNYWNyb3MgKi8KLSNpZm5kZWYgQ09ORklHX01NVQotI2RlZmluZSBFWF9IQU5ETEVSX1NUQUNLX1NJWgkoNCoxOSkKLSNlbmRpZgogI2RlZmluZSBOVU1fVE9fUkVHKG51bSkJCXIgIyMgbnVtCiAKICNpZmRlZiBDT05GSUdfTU1VCkBAIC05ODgsNiArOTg1LDcgQEAKIC5lbmQgX3VuYWxpZ25lZF9kYXRhX2V4Y2VwdGlvbgogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAorLmdsb2JhbCBleF9oYW5kbGVyX3VuaGFuZGxlZAogZXhfaGFuZGxlcl91bmhhbmRsZWQ6CiAvKiBGSVhNRSBhZGQgaGFuZGxlIGZ1bmN0aW9uIGZvciB1bmhhbmRsZWQgZXhjZXB0aW9uIC0gZHVtcCByZWdpc3RlciAqLwogCWJyaSAwCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2lycS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9pcnEuYwppbmRleCA4ZjEyMGFjLi5hOTM0NWZiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaXJxLmMKQEAgLTE3LDI2ICsxNywxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKLXVuc2lnbmVkIGludCBpcnFfb2ZfcGFyc2VfYW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4KQotewotCXN0cnVjdCBvZl9pcnEgb2lycTsKLQotCWlmIChvZl9pcnFfbWFwX29uZShkZXYsIGluZGV4LCAmb2lycSkpCi0JCXJldHVybiBOT19JUlE7Ci0KLQlyZXR1cm4gb2lycS5zcGVjaWZpZXJbMF07Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcnFfb2ZfcGFyc2VfYW5kX21hcCk7Ci0KIHN0YXRpYyB1MzIgY29uY3VycmVudF9pcnE7CiAKIHZvaWQgX19pcnFfZW50cnkgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGludCBpcnE7CiAJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCXRyYWNlX2hhcmRpcnFzX29mZigpOwogCiAJaXJxX2VudGVyKCk7CiAJaXJxID0gZ2V0X2lycShyZWdzKTsKQEAgLTUzLDYgKzQ0LDcgQEAKIAogCWlycV9leGl0KCk7CiAJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKKwl0cmFjZV9oYXJkaXJxc19vbigpOwogfQogCiBpbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKQEAgLTEwNCw3ICs5Niw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX21hcHBpbmcpOwogCiB1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKLQkJCQkJdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSkKKwkJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplKQogewogCXJldHVybiBpbnRzcGVjWzBdOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2tnZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMwMDZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9rZ2RiLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBNaWNyb2JsYXplIEtHREIgc3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9wdnIuaD4KKworI2RlZmluZSBHREJfUkVHCQkwCisjZGVmaW5lIEdEQl9QQwkJMzIKKyNkZWZpbmUgR0RCX01TUgkJMzMKKyNkZWZpbmUgR0RCX0VBUgkJMzQKKyNkZWZpbmUgR0RCX0VTUgkJMzUKKyNkZWZpbmUgR0RCX0ZTUgkJMzYKKyNkZWZpbmUgR0RCX0JUUgkJMzcKKyNkZWZpbmUgR0RCX1BWUgkJMzgKKyNkZWZpbmUgR0RCX1JFRFIJNTAKKyNkZWZpbmUgR0RCX1JQSUQJNTEKKyNkZWZpbmUgR0RCX1JaUFIJNTIKKyNkZWZpbmUgR0RCX1JUTEJYCTUzCisjZGVmaW5lIEdEQl9SVExCU1gJNTQgLyogbWZzIGNhbid0IHJlYWQgaXQgKi8KKyNkZWZpbmUgR0RCX1JUTEJMTwk1NQorI2RlZmluZSBHREJfUlRMQkhJCTU2CisKKy8qIGtlZXAgcHZyIHNlcGFyYXRlbHkgYmVjYXVzZSBpdCBpcyB1bmNoYW5nZWJsZSAqLworc3RydWN0IHB2cl9zIHB2cjsKKwordm9pZCBwdF9yZWdzX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nICpwdF9yZWdiID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzOworCWludCB0ZW1wOworCS8qIHJlZ2lzdGVycyByMCAtIHIzMSwgcGMsIG1zciwgZWFyLCBlc3IsIGZzciArIGRvIG5vdCBzYXZlIHB0X21vZGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihzdHJ1Y3QgcHRfcmVncykgLyA0KSAtIDE7IGkrKykKKwkJZ2RiX3JlZ3NbaV0gPSBwdF9yZWdiW2ldOworCisJLyogQnJhbmNoIHRhcmdldCByZWdpc3RlciBjYW4ndCBiZSBjaGFuZ2VkICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZnMgJTAsIHJidHI7IiA6ICI9ciIodGVtcCkgOiApOworCWdkYl9yZWdzW0dEQl9CVFJdID0gdGVtcDsKKworCS8qIHB2ciBwYXJ0ICAtIHdlIGhhdmUgMTEgcHZyIHJlZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBwdnJfcykvNDsgaSsrKQorCQlnZGJfcmVnc1tHREJfUFZSICsgaV0gPSBwdnIucHZyW2ldOworCisJLyogcmVhZCBzcGVjaWFsIHJlZ2lzdGVycyAtIGNhbid0IGJlIGNoYW5nZWQgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mcyAlMCwgcmVkcjsiIDogIj1yIih0ZW1wKSA6ICk7CisJZ2RiX3JlZ3NbR0RCX1JFRFJdID0gdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mcyAlMCwgcnBpZDsiIDogIj1yIih0ZW1wKSA6ICk7CisJZ2RiX3JlZ3NbR0RCX1JQSURdID0gdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mcyAlMCwgcnpwcjsiIDogIj1yIih0ZW1wKSA6ICk7CisJZ2RiX3JlZ3NbR0RCX1JaUFJdID0gdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mcyAlMCwgcnRsYng7IiA6ICI9ciIodGVtcCkgOiApOworCWdkYl9yZWdzW0dEQl9SVExCWF0gPSB0ZW1wOworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZzICUwLCBydGxibG87IiA6ICI9ciIodGVtcCkgOiApOworCWdkYl9yZWdzW0dEQl9SVExCTE9dID0gdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mcyAlMCwgcnRsYmhpOyIgOiAiPXIiKHRlbXApIDogKTsKKwlnZGJfcmVnc1tHREJfUlRMQkhJXSA9IHRlbXA7Cit9CisKK3ZvaWQgZ2RiX3JlZ3NfdG9fcHRfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyAqcHRfcmVnYiA9ICh1bnNpZ25lZCBsb25nICopcmVnczsKKworCS8qIHB0X3JlZ3MgYW5kIGdkYl9yZWdzIGhhdmUgdGhlIHNhbWUgMzcgdmFsdWVzLgorCSAqIFRoZSByZXN0IG9mIGdkYl9yZWdzIGFyZSB1bnVzZWQgYW5kIGNhbid0IGJlIGNoYW5nZWQuCisJICogcjAgcmVnaXN0ZXIgdmFsdWUgY2FuJ3QgYmUgY2hhbmdlZCB0b28uICovCisJZm9yIChpID0gMTsgaSA8IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gNCkgLSAxOyBpKyspCisJCXB0X3JlZ2JbaV0gPSBnZGJfcmVnc1tpXTsKK30KKwordm9pZCBtaWNyb2JsYXplX2tnZGJfYnJlYWsoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKGtnZGJfaGFuZGxlX2V4Y2VwdGlvbigxLCBTSUdUUkFQLCAwLCByZWdzKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIEp1bXAgb3ZlciB0aGUgZmlyc3QgYXJjaF9rZ2RiX2JyZWFrcG9pbnQgd2hpY2ggaXMgYmFycmllciB0bworCSAqIGdldCBrZ2RiIHdvcmsuIFRoZSBzYW1lIHNvbHV0aW9uIGlzIHVzZWQgZm9yIHBvd2VycGMgKi8KKwlpZiAoKih1MzIgKikgKHJlZ3MtPnBjKSA9PSAqKHUzMiAqKSAoJmFyY2hfa2dkYl9vcHMuZ2RiX2JwdF9pbnN0cikpCisJCXJlZ3MtPnBjICs9IEJSRUFLX0lOU1RSX1NJWkU7Cit9CisKKy8qIHVudGVzdGVkICovCit2b2lkIHNsZWVwaW5nX3RocmVhZF90b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgKnB0X3JlZ2IgPSAodW5zaWduZWQgbG9uZyAqKShwLT50aHJlYWQucmVncyk7CisKKwkvKiByZWdpc3RlcnMgcjAgLSByMzEsIHBjLCBtc3IsIGVhciwgZXNyLCBmc3IgKyBkbyBub3Qgc2F2ZSBwdF9tb2RlICovCisJZm9yIChpID0gMDsgaSA8IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gNCkgLSAxOyBpKyspCisJCWdkYl9yZWdzW2ldID0gcHRfcmVnYltpXTsKKworCS8qIHB2ciBwYXJ0ICAtIHdlIGhhdmUgMTEgcHZyIHJlZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBwdnJfcykvNDsgaSsrKQorCQlnZGJfcmVnc1tHREJfUFZSICsgaV0gPSBwdnIucHZyW2ldOworfQorCit2b2lkIGtnZGJfYXJjaF9zZXRfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgaXApCit7CisJcmVncy0+cGMgPSBpcDsKK30KKworaW50IGtnZGJfYXJjaF9oYW5kbGVfZXhjZXB0aW9uKGludCB2ZWN0b3IsIGludCBzaWdubywgaW50IGVycl9jb2RlLAorCQkJICAgICAgIGNoYXIgKnJlbWNvbV9pbl9idWZmZXIsIGNoYXIgKnJlbWNvbV9vdXRfYnVmZmVyLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNoYXIgKnB0cjsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXN3aXRjaCAocmVtY29tX2luX2J1ZmZlclswXSkgeworCWNhc2UgJ2MnOgorCQkvKiBoYW5kbGUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciAqLworCQlwdHIgPSAmcmVtY29tX2luX2J1ZmZlclsxXTsKKwkJaWYgKGtnZGJfaGV4MmxvbmcoJnB0ciwgJmFkZHJlc3MpKQorCQkJcmVncy0+cGMgPSBhZGRyZXNzOworCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7IC8qIHRoaXMgbWVhbnMgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBleGl0IGZyb20gdGhlIGhhbmRsZXIgKi8KK30KKworaW50IGtnZGJfYXJjaF9pbml0KHZvaWQpCit7CisJZ2V0X3B2cigmcHZyKTsgLyogRmlsbCBQVlIgc3RydWN0dXJlICovCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQga2dkYl9hcmNoX2V4aXQodm9pZCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKKy8qCisgKiBHbG9iYWwgZGF0YQorICovCitzdHJ1Y3Qga2dkYl9hcmNoIGFyY2hfa2dkYl9vcHMgPSB7CisJLmdkYl9icHRfaW5zdHIgPSB7MHhiYSwgMHgwYywgMHgwMCwgMHgxOH0sIC8qIGJya2kgcjE2LCAweDE4ICovCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9taXNjLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21pc2MuUwppbmRleCAwZmI1ZmM2Li4yMDZkYTNkIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL21pc2MuUworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21pc2MuUwpAQCAtNzYsNyArNzYsNyBAQAogCSAqIHRoZSBVQVJUcyBuaWNlIGFuZCBlYXJseS4gIFdlIHVzZSBhIDRrIHJlYWw9PXZpcnR1YWwgbWFwcGluZy4KIAkgKi8KIAlvcmkJcjQsIHIwLCBNSUNST0JMQVpFX1RMQl9TSVpFIC0gMQotCW10cwlydGxieCwgcjQgLyogVExCIHNsb3QgMiAqLworCW10cwlydGxieCwgcjQgLyogVExCIHNsb3QgNjMgKi8KIAogCW9yCXI0LHI1LHIwCiAJYW5kaQlyNCxyNCwweGZmZmZmMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9vZl9kZXZpY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM3Mjc4Ny4uMDAwMDAwMAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL29mX2RldmljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotCi12b2lkIG9mX2RldmljZV9tYWtlX2J1c19pZChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCi17Ci0Jc3RhdGljIGF0b21pY190IGJ1c19ub19yZWdfbWFnaWM7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gZGV2LT5kZXYub2Zfbm9kZTsKLQljb25zdCB1MzIgKnJlZzsKLQl1NjQgYWRkcjsKLQlpbnQgbWFnaWM7Ci0KLQkvKgotCSAqIEZvciBNTUlPLCBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKLQkgKi8KLQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOwotCWlmIChyZWcpIHsKLQkJYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5vZGUsIHJlZyk7Ci0JCWlmIChhZGRyICE9IE9GX0JBRF9BRERSKSB7Ci0JCQlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAiJWxseC4lcyIsCi0JCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIsIG5vZGUtPm5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBObyBCdXNJRCwgdXNlIHRoZSBub2RlIG5hbWUgYW5kIGFkZCBhIGdsb2JhbGx5IGluY3JlbWVudGVkCi0JICogY291bnRlciAoYW5kIHByYXkuLi4pCi0JICovCi0JbWFnaWMgPSBhdG9taWNfYWRkX3JldHVybigxLCAmYnVzX25vX3JlZ19tYWdpYyk7Ci0JZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiVzLiVkIiwgbm9kZS0+bmFtZSwgbWFnaWMgLSAxKTsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX21ha2VfYnVzX2lkKTsKLQotc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2aWNlX2FsbG9jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJICBjb25zdCBjaGFyICpidXNfaWQsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqZGV2OwotCi0JZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KQotCQlyZXR1cm4gTlVMTDsKLQotCWRldi0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChucCk7Ci0JZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5hcmNoZGF0YS5kbWFfbWFzazsKLQlkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQ7Ci0JZGV2LT5kZXYucmVsZWFzZSA9IG9mX3JlbGVhc2VfZGV2OwotCi0JaWYgKGJ1c19pZCkKLQkJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgYnVzX2lkKTsKLQllbHNlCi0JCW9mX2RldmljZV9tYWtlX2J1c19pZChkZXYpOwotCi0JcmV0dXJuIGRldjsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2FsbG9jKTsKLQotaW50IG9mX2RldmljZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZkZXY7Ci0JY29uc3QgY2hhciAqY29tcGF0OwotCWludCBzZWVuID0gMCwgY3BsZW4sIHNsOwotCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jb2ZkZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQotCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJPRl9OQU1FPSVzIiwgb2ZkZXYtPmRldi5vZl9ub2RlLT5uYW1lKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiT0ZfVFlQRT0lcyIsIG9mZGV2LT5kZXYub2Zfbm9kZS0+dHlwZSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogU2luY2UgdGhlIGNvbXBhdGlibGUgZmllbGQgY2FuIGNvbnRhaW4gcHJldHR5IG11Y2ggYW55dGhpbmcKLQkgKiBpdCdzIG5vdCByZWFsbHkgbGVnYWwgdG8gc3BsaXQgaXQgb3V0IHdpdGggY29tbWFzLiBXZSBzcGxpdCBpdAotCSAqIHVwIHVzaW5nIGEgbnVtYmVyIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbnN0ZWFkLiAqLwotCi0JY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5kZXYub2Zfbm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOwotCXdoaWxlIChjb21wYXQgJiYgKmNvbXBhdCAmJiBjcGxlbiA+IDApIHsKLQkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJc2wgPSBzdHJsZW4oY29tcGF0KSArIDE7Ci0JCWNvbXBhdCArPSBzbDsKLQkJY3BsZW4gLT0gc2w7Ci0JCXNlZW4rKzsKLQl9Ci0KLQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiT0ZfQ09NUEFUSUJMRV9OPSVkIiwgc2VlbikpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogbW9kYWxpYXMgaXMgdHJpY2tpZXIsIHdlIGFkZCBpdCBpbiAyIHN0ZXBzICovCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSIpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzbCA9IG9mX2RldmljZV9nZXRfbW9kYWxpYXMob2ZkZXYsICZlbnYtPmJ1ZltlbnYtPmJ1Zmxlbi0xXSwKLQkJCQkgICAgc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuKTsKLQlpZiAoc2wgPj0gKHNpemVvZihlbnYtPmJ1ZikgLSBlbnYtPmJ1ZmxlbikpCi0JCXJldHVybiAtRU5PTUVNOwotCWVudi0+YnVmbGVuICs9IHNsOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2RldmljZV91ZXZlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y2ZjQyLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvb2ZfcGxhdGZvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogICAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgotICoJCQkgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KLSAqICAgIGFuZAkJIEFybmQgQmVyZ21hbm4sIElCTSBDb3JwLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jdW5kZWYgREVCVUcKLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotCi1zdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgPSB7Ci0gICAgICAgLnVldmVudAk9IG9mX2RldmljZV91ZXZlbnQsCi19OwotRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9idXNfdHlwZSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9mX2J1c19kcml2ZXJfaW5pdCh2b2lkKQotewotCXJldHVybiBvZl9idXNfdHlwZV9pbml0KCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwgIm9mX3BsYXRmb3JtIik7Ci19Ci1wb3N0Y29yZV9pbml0Y2FsbChvZl9idXNfZHJpdmVyX2luaXQpOwotCi1zdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCi0JCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqZGV2OwotCi0JZGV2ID0gb2ZfZGV2aWNlX2FsbG9jKG5wLCBidXNfaWQsIHBhcmVudCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBOVUxMOwotCi0JZGV2LT5hcmNoZGF0YS5kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQlkZXYtPmRldi5idXMgPSAmb2ZfcGxhdGZvcm1fYnVzX3R5cGU7Ci0KLQkvKiBXZSBkbyBub3QgZmlsbCB0aGUgRE1BIG9wcyBmb3IgcGxhdGZvcm0gZGV2aWNlcyBieSBkZWZhdWx0LgotCSAqIFRoaXMgaXMgY3VycmVudGx5IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcGxhdGZvcm0gY29kZQotCSAqIHRvIGRvIHN1Y2gsIHBvc3NpYmx5IHVzaW5nIGEgZGV2aWNlIG5vdGlmaWVyCi0JICovCi0KLQlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKGRldikgIT0gMCkgewotCQlvZl9kZXZpY2VfZnJlZShkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZGV2OwotfQotRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKTsKLQotLyoqCi0gKiBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlIC0gQ3JlYXRlIGFuIE9GIGRldmljZSBmb3IgYSBidXMgbm9kZSBhbmQgYWxsIGl0cwotICogY2hpbGRyZW4uIE9wdGlvbmFsbHkgcmVjdXJzaXZlbHkgaW5zdGFuY2lhdGUgbWF0Y2hpbmcgYnVzc2VzLgotICogQGJ1czogZGV2aWNlIG5vZGUgb2YgdGhlIGJ1cyB0byBpbnN0YW5jaWF0ZQotICogQG1hdGNoZXM6IG1hdGNoIHRhYmxlLCBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCwgT0ZfTk9fREVFUF9QUk9CRSB0bwotICogZGlzYWxsb3cgcmVjdXJzaXZlIGNyZWF0aW9uIG9mIGNoaWxkIGJ1c3NlcwotICovCi1zdGF0aWMgaW50IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpidXMsCi0JCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAotCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7Ci0Jc3RydWN0IG9mX2RldmljZSAqZGV2OwotCWludCByYyA9IDA7Ci0KLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGJ1cywgY2hpbGQpIHsKLQkJcHJfZGVidWcoIiAgIGNyZWF0ZSBjaGlsZDogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOwotCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNoaWxkLCBOVUxMLCBwYXJlbnQpOwotCQlpZiAoZGV2ID09IE5VTEwpCi0JCQlyYyA9IC1FTk9NRU07Ci0JCWVsc2UgaWYgKCFvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGNoaWxkKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocmMgPT0gMCkgewotCQkJcHJfZGVidWcoIiAgIGFuZCBzdWIgYnVzc2VzXG4iKTsKLQkJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShjaGlsZCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKLQkJfQotCQlpZiAocmMpIHsKLQkJCW9mX25vZGVfcHV0KGNoaWxkKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotCi0vKioKLSAqIG9mX3BsYXRmb3JtX2J1c19wcm9iZSAtIFByb2JlIHRoZSBkZXZpY2UtdHJlZSBmb3IgcGxhdGZvcm0gYnVzc2VzCi0gKiBAcm9vdDogcGFyZW50IG9mIHRoZSBmaXJzdCBsZXZlbCB0byBwcm9iZSBvciBOVUxMIGZvciB0aGUgcm9vdCBvZiB0aGUgdHJlZQotICogQG1hdGNoZXM6IG1hdGNoIHRhYmxlLCBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdAotICogQHBhcmVudDogcGFyZW50IHRvIGhvb2sgZGV2aWNlcyBmcm9tLCBOVUxMIGZvciB0b3BsZXZlbAotICoKLSAqIE5vdGUgdGhhdCBjaGlsZHJlbiBvZiB0aGUgcHJvdmlkZWQgcm9vdCBhcmUgbm90IGluc3RhbmNpYXRlZCBhcyBkZXZpY2VzCi0gKiB1bmxlc3MgdGhlIHNwZWNpZmllZCByb290IGl0c2VsZiBtYXRjaGVzIHRoZSBidXMgbGlzdCBhbmQgaXMgbm90IE5VTEwuCi0gKi8KLQotaW50IG9mX3BsYXRmb3JtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QsCi0JCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCi0JCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwotCXN0cnVjdCBvZl9kZXZpY2UgKmRldjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKG1hdGNoZXMgPT0gTlVMTCkKLQkJbWF0Y2hlcyA9IG9mX2RlZmF1bHRfYnVzX2lkczsKLQlpZiAobWF0Y2hlcyA9PSBPRl9OT19ERUVQX1BST0JFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocm9vdCA9PSBOVUxMKQotCQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQllbHNlCi0JCW9mX25vZGVfZ2V0KHJvb3QpOwotCi0JcHJfZGVidWcoIm9mX3BsYXRmb3JtX2J1c19wcm9iZSgpXG4iKTsKLQlwcl9kZWJ1ZygiIHN0YXJ0aW5nIGF0OiAlc1xuIiwgcm9vdC0+ZnVsbF9uYW1lKTsKLQotCS8qIERvIGEgc2VsZiBjaGVjayBvZiBidXMgdHlwZSwgaWYgdGhlcmUncyBhIG1hdGNoLCBjcmVhdGUKLQkgKiBjaGlsZHJlbgotCSAqLwotCWlmIChvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIHJvb3QpKSB7Ci0JCXByX2RlYnVnKCIgcm9vdCBtYXRjaCwgY3JlYXRlIGFsbCBzdWIgZGV2aWNlc1xuIik7Ci0JCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUocm9vdCwgTlVMTCwgcGFyZW50KTsKLQkJaWYgKGRldiA9PSBOVUxMKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQkJcHJfZGVidWcoIiBjcmVhdGUgYWxsIHN1YiBidXNzZXNcbiIpOwotCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUocm9vdCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKLQkJZ290byBiYWlsOwotCX0KLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHJvb3QsIGNoaWxkKSB7Ci0JCWlmICghb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBjaGlsZCkpCi0JCQljb250aW51ZTsKLQotCQlwcl9kZWJ1ZygiICBtYXRjaDogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOwotCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNoaWxkLCBOVUxMLCBwYXJlbnQpOwotCQlpZiAoZGV2ID09IE5VTEwpCi0JCQlyYyA9IC1FTk9NRU07Ci0JCWVsc2UKLQkJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShjaGlsZCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKLQkJaWYgKHJjKSB7Ci0JCQlvZl9ub2RlX3B1dChjaGlsZCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLSBiYWlsOgotCW9mX25vZGVfcHV0KHJvb3QpOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fYnVzX3Byb2JlKTsKLQotc3RhdGljIGludCBvZl9kZXZfbm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHRvX29mX2RldmljZShkZXYpLT5kZXYub2Zfbm9kZSA9PSBkYXRhOwotfQotCi1zdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9maW5kX2RldmljZV9ieV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCi0JZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwKLQkJCSAgICAgIE5VTEwsIG5wLCBvZl9kZXZfbm9kZV9tYXRjaCk7Ci0JaWYgKGRldikKLQkJcmV0dXJuIHRvX29mX2RldmljZShkZXYpOwotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChvZl9maW5kX2RldmljZV9ieV9ub2RlKTsKLQotc3RhdGljIGludCBvZl9kZXZfcGhhbmRsZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JcGhhbmRsZSAqcGggPSBkYXRhOwotCXJldHVybiB0b19vZl9kZXZpY2UoZGV2KS0+ZGV2Lm9mX25vZGUtPnBoYW5kbGUgPT0gKnBoOwotfQotCi1zdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9maW5kX2RldmljZV9ieV9waGFuZGxlKHBoYW5kbGUgcGgpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCi0JZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwKLQkJCSAgICAgIE5VTEwsICZwaCwgb2ZfZGV2X3BoYW5kbGVfbWF0Y2gpOwotCWlmIChkZXYpCi0JCXJldHVybiB0b19vZl9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZSk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDA5YmVkNDQuLmJhN2M0YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC03Niw4ICs3NiwxMSBAQAogdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKIHsKIAlpZiAobGlrZWx5KGhsdF9jb3VudGVyKSkgewotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJY3B1X3JlbGF4KCk7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOworCQljcHVfcmVsYXgoKTsKKwkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfSBlbHNlIHsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggYmY3ZTZjMi4uZDMzYmExNyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTYsMjE5ICs2LDExIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogCi0jZGVmaW5lIFBSdTY0CSIlbGx4IgotCi0vKiBNYXggYWRkcmVzcyBzaXplIHdlIGRlYWwgd2l0aCAqLwotI2RlZmluZSBPRl9NQVhfQUREUl9DRUxMUwk0Ci0jZGVmaW5lIE9GX0NIRUNLX0NPVU5UUyhuYSwgbnMpCSgobmEpID4gMCAmJiAobmEpIDw9IE9GX01BWF9BRERSX0NFTExTICYmIFwKLQkJCShucykgPiAwKQotCi1zdGF0aWMgc3RydWN0IG9mX2J1cyAqb2ZfbWF0Y2hfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCi0JCWNvbnN0IHUzMiAqYWRkcnAsIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCXN0cnVjdCByZXNvdXJjZSAqcik7Ci0KLS8qIERlYnVnIHV0aWxpdHkgKi8KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHUzMiAqYWRkciwgaW50IG5hKQotewotCXByaW50ayhLRVJOX0lORk8gIiVzIiwgcyk7Ci0Jd2hpbGUgKG5hLS0pCi0JCXByaW50ayhLRVJOX0lORk8gIiAlMDh4IiwgKihhZGRyKyspKTsKLQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIG9mX2R1bXBfYWRkcihjb25zdCBjaGFyICpzLCBjb25zdCB1MzIgKmFkZHIsIGludCBuYSkgeyB9Ci0jZW5kaWYKLQotLyogQ2FsbGJhY2tzIGZvciBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcnMgKi8KLXN0cnVjdCBvZl9idXMgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JY29uc3QgY2hhcgkqYWRkcmVzc2VzOwotCWludAkJKCptYXRjaCkoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpOwotCXZvaWQJCSgqY291bnRfY2VsbHMpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsCi0JCQkJCWludCAqYWRkcmMsIGludCAqc2l6ZWMpOwotCXU2NAkJKCptYXApKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwKLQkJCQlpbnQgbmEsIGludCBucywgaW50IHBuYSk7Ci0JaW50CQkoKnRyYW5zbGF0ZSkodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpOwotCXVuc2lnbmVkIGludAkoKmdldF9mbGFncykoY29uc3QgdTMyICphZGRyKTsKLX07Ci0KLS8qCi0gKiBEZWZhdWx0IHRyYW5zbGF0b3IgKGdlbmVyaWMgYnVzKQotICovCi0KLXN0YXRpYyB2b2lkIG9mX2J1c19kZWZhdWx0X2NvdW50X2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAotCQkJCQlpbnQgKmFkZHJjLCBpbnQgKnNpemVjKQotewotCWlmIChhZGRyYykKLQkJKmFkZHJjID0gb2Zfbl9hZGRyX2NlbGxzKGRldik7Ci0JaWYgKHNpemVjKQotCQkqc2l6ZWMgPSBvZl9uX3NpemVfY2VsbHMoZGV2KTsKLX0KLQotc3RhdGljIHU2NCBvZl9idXNfZGVmYXVsdF9tYXAodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLAotCQlpbnQgbmEsIGludCBucywgaW50IHBuYSkKLXsKLQl1NjQgY3AsIHMsIGRhOwotCi0JY3AgPSBvZl9yZWFkX251bWJlcihyYW5nZSwgbmEpOwotCXMgID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOwotCWRhID0gb2ZfcmVhZF9udW1iZXIoYWRkciwgbmEpOwotCi0JcHJfZGVidWcoIk9GOiBkZWZhdWx0IG1hcCwgY3A9IlBSdTY0Iiwgcz0iUFJ1NjQiLCBkYT0iUFJ1NjQiXG4iLAotCQljcCwgcywgZGEpOwotCi0JaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCi0JCXJldHVybiBPRl9CQURfQUREUjsKLQlyZXR1cm4gZGEgLSBjcDsKLX0KLQotc3RhdGljIGludCBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpCi17Ci0JdTY0IGEgPSBvZl9yZWFkX251bWJlcihhZGRyLCBuYSk7Ci0JbWVtc2V0KGFkZHIsIDAsIG5hICogNCk7Ci0JYSArPSBvZmZzZXQ7Ci0JaWYgKG5hID4gMSkKLQkJYWRkcltuYSAtIDJdID0gYSA+PiAzMjsKLQlhZGRyW25hIC0gMV0gPSBhICYgMHhmZmZmZmZmZnU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfZGVmYXVsdF9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQotewotCXJldHVybiBJT1JFU09VUkNFX01FTTsKLX0KLQogI2lmZGVmIENPTkZJR19QQ0kKLS8qCi0gKiBQQ0kgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3IKLSAqLwotCi1zdGF0aWMgaW50IG9mX2J1c19wY2lfbWF0Y2goc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQkvKiAidmNpIiBpcyBmb3IgdGhlIC9jaGFvcyBicmlkZ2Ugb24gMXN0LWdlbiBQQ0kgcG93ZXJtYWNzICovCi0JcmV0dXJuICFzdHJjbXAobnAtPnR5cGUsICJwY2kiKSB8fCAhc3RyY21wKG5wLT50eXBlLCAidmNpIik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9mX2J1c19wY2lfY291bnRfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQlpbnQgKmFkZHJjLCBpbnQgKnNpemVjKQotewotCWlmIChhZGRyYykKLQkJKmFkZHJjID0gMzsKLQlpZiAoc2l6ZWMpCi0JCSpzaXplYyA9IDI7Ci19Ci0KLXN0YXRpYyB1NjQgb2ZfYnVzX3BjaV9tYXAodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLCBpbnQgbmEsIGludCBucywgaW50IHBuYSkKLXsKLQl1NjQgY3AsIHMsIGRhOwotCi0JLyogQ2hlY2sgYWRkcmVzcyB0eXBlIG1hdGNoICovCi0JaWYgKChhZGRyWzBdIF4gcmFuZ2VbMF0pICYgMHgwMzAwMDAwMCkKLQkJcmV0dXJuIE9GX0JBRF9BRERSOwotCi0JLyogUmVhZCBhZGRyZXNzIHZhbHVlcywgc2tpcHBpbmcgaGlnaCBjZWxsICovCi0JY3AgPSBvZl9yZWFkX251bWJlcihyYW5nZSArIDEsIG5hIC0gMSk7Ci0JcyAgPSBvZl9yZWFkX251bWJlcihyYW5nZSArIG5hICsgcG5hLCBucyk7Ci0JZGEgPSBvZl9yZWFkX251bWJlcihhZGRyICsgMSwgbmEgLSAxKTsKLQotCXByX2RlYnVnKCJPRjogUENJIG1hcCwgY3A9IlBSdTY0Iiwgcz0iUFJ1NjQiLCBkYT0iUFJ1NjQiXG4iLCBjcCwgcywgZGEpOwotCi0JaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCi0JCXJldHVybiBPRl9CQURfQUREUjsKLQlyZXR1cm4gZGEgLSBjcDsKLX0KLQotc3RhdGljIGludCBvZl9idXNfcGNpX3RyYW5zbGF0ZSh1MzIgKmFkZHIsIHU2NCBvZmZzZXQsIGludCBuYSkKLXsKLQlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlKGFkZHIgKyAxLCBvZmZzZXQsIG5hIC0gMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX3BjaV9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQotewotCXVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0JdTMyIHcgPSBhZGRyWzBdOwotCi0Jc3dpdGNoICgodyA+PiAyNCkgJiAweDAzKSB7Ci0JY2FzZSAweDAxOgotCQlmbGFncyB8PSBJT1JFU09VUkNFX0lPOwotCQlicmVhazsKLQljYXNlIDB4MDI6IC8qIDMyIGJpdHMgKi8KLQljYXNlIDB4MDM6IC8qIDY0IGJpdHMgKi8KLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07Ci0JCWJyZWFrOwotCX0KLQlpZiAodyAmIDB4NDAwMDAwMDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfUFJFRkVUQ0g7Ci0JcmV0dXJuIGZsYWdzOwotfQotCi1jb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywgdTY0ICpzaXplLAotCQkJdW5zaWduZWQgaW50ICpmbGFncykKLXsKLQljb25zdCB1MzIgKnByb3A7Ci0JdW5zaWduZWQgaW50IHBzaXplOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwotCXN0cnVjdCBvZl9idXMgKmJ1czsKLQlpbnQgb25lc2l6ZSwgaSwgbmEsIG5zOwotCi0JLyogR2V0IHBhcmVudCAmIG1hdGNoIGJ1cyB0eXBlICovCi0JcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7Ci0JaWYgKHN0cmNtcChidXMtPm5hbWUsICJwY2kiKSkgewotCQlvZl9ub2RlX3B1dChwYXJlbnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVzLT5jb3VudF9jZWxscyhkZXYsICZuYSwgJm5zKTsKLQlvZl9ub2RlX3B1dChwYXJlbnQpOwotCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpCi0JCXJldHVybiBOVUxMOwotCi0JLyogR2V0ICJyZWciIG9yICJhc3NpZ25lZC1hZGRyZXNzZXMiIHByb3BlcnR5ICovCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkZXYsIGJ1cy0+YWRkcmVzc2VzLCAmcHNpemUpOwotCWlmIChwcm9wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXBzaXplIC89IDQ7Ci0KLQlvbmVzaXplID0gbmEgKyBuczsKLQlmb3IgKGkgPSAwOyBwc2l6ZSA+PSBvbmVzaXplOyBwc2l6ZSAtPSBvbmVzaXplLCBwcm9wICs9IG9uZXNpemUsIGkrKykKLQkJaWYgKChwcm9wWzBdICYgMHhmZikgPT0gKChiYXJfbm8gKiA0KSArIFBDSV9CQVNFX0FERFJFU1NfMCkpIHsKLQkJCWlmIChzaXplKQotCQkJCSpzaXplID0gb2ZfcmVhZF9udW1iZXIocHJvcCArIG5hLCBucyk7Ci0JCQlpZiAoZmxhZ3MpCi0JCQkJKmZsYWdzID0gYnVzLT5nZXRfZmxhZ3MocHJvcCk7Ci0JCQlyZXR1cm4gcHJvcDsKLQkJfQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChvZl9nZXRfcGNpX2FkZHJlc3MpOwotCi1pbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCi0JCQkJc3RydWN0IHJlc291cmNlICpyKQotewotCWNvbnN0IHUzMgkqYWRkcnA7Ci0JdTY0CQlzaXplOwotCXVuc2lnbmVkIGludAlmbGFnczsKLQotCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKGRldiwgYmFyLCAmc2l6ZSwgJmZsYWdzKTsKLQlpZiAoYWRkcnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIGFkZHJwLCBzaXplLCBmbGFncywgcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7Ci0KLXN0YXRpYyB1OCBvZl9pcnFfcGNpX3N3aXp6bGUodTggc2xvdCwgdTggcGluKQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKQEAgLTI5MywzMzEgKzg1LDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfcGNpKTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKLS8qCi0gKiBJU0EgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3IKLSAqLwotCi1zdGF0aWMgaW50IG9mX2J1c19pc2FfbWF0Y2goc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlyZXR1cm4gIXN0cmNtcChucC0+bmFtZSwgImlzYSIpOwotfQotCi1zdGF0aWMgdm9pZCBvZl9idXNfaXNhX2NvdW50X2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsCi0JCQkJaW50ICphZGRyYywgaW50ICpzaXplYykKLXsKLQlpZiAoYWRkcmMpCi0JCSphZGRyYyA9IDI7Ci0JaWYgKHNpemVjKQotCQkqc2l6ZWMgPSAxOwotfQotCi1zdGF0aWMgdTY0IG9mX2J1c19pc2FfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCi17Ci0JdTY0IGNwLCBzLCBkYTsKLQotCS8qIENoZWNrIGFkZHJlc3MgdHlwZSBtYXRjaCAqLwotCWlmICgoYWRkclswXSBeIHJhbmdlWzBdKSAmIDB4MDAwMDAwMDEpCi0JCXJldHVybiBPRl9CQURfQUREUjsKLQotCS8qIFJlYWQgYWRkcmVzcyB2YWx1ZXMsIHNraXBwaW5nIGhpZ2ggY2VsbCAqLwotCWNwID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyAxLCBuYSAtIDEpOwotCXMgID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOwotCWRhID0gb2ZfcmVhZF9udW1iZXIoYWRkciArIDEsIG5hIC0gMSk7Ci0KLQlwcl9kZWJ1ZygiT0Y6IElTQSBtYXAsIGNwPSJQUnU2NCIsIHM9IlBSdTY0IiwgZGE9IlBSdTY0IlxuIiwgY3AsIHMsIGRhKTsKLQotCWlmIChkYSA8IGNwIHx8IGRhID49IChjcCArIHMpKQotCQlyZXR1cm4gT0ZfQkFEX0FERFI7Ci0JcmV0dXJuIGRhIC0gY3A7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfYnVzX2lzYV90cmFuc2xhdGUodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpCi17Ci0JcmV0dXJuIG9mX2J1c19kZWZhdWx0X3RyYW5zbGF0ZShhZGRyICsgMSwgb2Zmc2V0LCBuYSAtIDEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19pc2FfZ2V0X2ZsYWdzKGNvbnN0IHUzMiAqYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotCXUzMiB3ID0gYWRkclswXTsKLQotCWlmICh3ICYgMSkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JTzsKLQllbHNlCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOwotCXJldHVybiBmbGFnczsKLX0KLQotLyoKLSAqIEFycmF5IG9mIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycwotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfYnVzIG9mX2J1c3Nlc1tdID0gewotI2lmZGVmIENPTkZJR19QQ0kKLQkvKiBQQ0kgKi8KLQl7Ci0JCS5uYW1lID0gInBjaSIsCi0JCS5hZGRyZXNzZXMgPSAiYXNzaWduZWQtYWRkcmVzc2VzIiwKLQkJLm1hdGNoID0gb2ZfYnVzX3BjaV9tYXRjaCwKLQkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX3BjaV9jb3VudF9jZWxscywKLQkJLm1hcCA9IG9mX2J1c19wY2lfbWFwLAotCQkudHJhbnNsYXRlID0gb2ZfYnVzX3BjaV90cmFuc2xhdGUsCi0JCS5nZXRfZmxhZ3MgPSBvZl9idXNfcGNpX2dldF9mbGFncywKLQl9LAotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQkvKiBJU0EgKi8KLQl7Ci0JCS5uYW1lID0gImlzYSIsCi0JCS5hZGRyZXNzZXMgPSAicmVnIiwKLQkJLm1hdGNoID0gb2ZfYnVzX2lzYV9tYXRjaCwKLQkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX2lzYV9jb3VudF9jZWxscywKLQkJLm1hcCA9IG9mX2J1c19pc2FfbWFwLAotCQkudHJhbnNsYXRlID0gb2ZfYnVzX2lzYV90cmFuc2xhdGUsCi0JCS5nZXRfZmxhZ3MgPSBvZl9idXNfaXNhX2dldF9mbGFncywKLQl9LAotCS8qIERlZmF1bHQgKi8KLQl7Ci0JCS5uYW1lID0gImRlZmF1bHQiLAotCQkuYWRkcmVzc2VzID0gInJlZyIsCi0JCS5tYXRjaCA9IE5VTEwsCi0JCS5jb3VudF9jZWxscyA9IG9mX2J1c19kZWZhdWx0X2NvdW50X2NlbGxzLAotCQkubWFwID0gb2ZfYnVzX2RlZmF1bHRfbWFwLAotCQkudHJhbnNsYXRlID0gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlLAotCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9mX2J1cyAqb2ZfbWF0Y2hfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvZl9idXNzZXMpOyBpKyspCi0JCWlmICghb2ZfYnVzc2VzW2ldLm1hdGNoIHx8IG9mX2J1c3Nlc1tpXS5tYXRjaChucCkpCi0JCQlyZXR1cm4gJm9mX2J1c3Nlc1tpXTsKLQlCVUcoKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBvZl90cmFuc2xhdGVfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBzdHJ1Y3Qgb2ZfYnVzICpidXMsCi0JCQlzdHJ1Y3Qgb2ZfYnVzICpwYnVzLCB1MzIgKmFkZHIsCi0JCQlpbnQgbmEsIGludCBucywgaW50IHBuYSkKLXsKLQljb25zdCB1MzIgKnJhbmdlczsKLQl1bnNpZ25lZCBpbnQgcmxlbjsKLQlpbnQgcm9uZTsKLQl1NjQgb2Zmc2V0ID0gT0ZfQkFEX0FERFI7Ci0KLQkvKiBOb3JtYWxseSwgYW4gYWJzZW5jZSBvZiBhICJyYW5nZXMiIHByb3BlcnR5IG1lYW5zIHdlIGFyZQotCSAqIGNyb3NzaW5nIGEgbm9uLXRyYW5zbGF0YWJsZSBib3VuZGFyeSwgYW5kIHRodXMgdGhlIGFkZHJlc3NlcwotCSAqIGJlbG93IHRoZSBjdXJyZW50IG5vdCBjYW5ub3QgYmUgY29udmVydGVkIHRvIENQVSBwaHlzaWNhbCBvbmVzLgotCSAqIFVuZm9ydHVuYXRlbHksIHdoaWxlIHRoaXMgaXMgdmVyeSBjbGVhciBpbiB0aGUgc3BlYywgaXQncyBub3QKLQkgKiB3aGF0IEFwcGxlIHVuZGVyc3Rvb2QsIGFuZCB0aGV5IGRvIGhhdmUgdGhpbmdzIGxpa2UgL3VuaS1uIG9yCi0JICogL2h0IG5vZGVzIHdpdGggbm8gInJhbmdlcyIgcHJvcGVydHkgYW5kIGEgbG90IG9mIHBlcmZlY3RseQotCSAqIHVzZWFibGUgbWFwcGVkIGRldmljZXMgYmVsb3cgdGhlbS4gVGh1cyB3ZSB0cmVhdCB0aGUgYWJzZW5jZSBvZgotCSAqICJyYW5nZXMiIGFzIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgInJhbmdlcyIgcHJvcGVydHkgd2hpY2ggbWVhbnMKLQkgKiBhIDE6MSB0cmFuc2xhdGlvbiBhdCB0aGF0IGxldmVsLiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgbm90IHRvIHRyeQotCSAqIHRvIHRyYW5zbGF0ZSBhZGRyZXNzZXMgdGhhdCBhcmVuJ3Qgc3VwcG9zZWQgdG8gYmUgdHJhbnNsYXRlZCBpbgotCSAqIHRoZSBmaXJzdCBwbGFjZS4gLS1CZW5ILgotCSAqLwotCXJhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShwYXJlbnQsICJyYW5nZXMiLCAoaW50ICopICZybGVuKTsKLQlpZiAocmFuZ2VzID09IE5VTEwgfHwgcmxlbiA9PSAwKSB7Ci0JCW9mZnNldCA9IG9mX3JlYWRfbnVtYmVyKGFkZHIsIG5hKTsKLQkJbWVtc2V0KGFkZHIsIDAsIHBuYSAqIDQpOwotCQlwcl9kZWJ1ZygiT0Y6IG5vIHJhbmdlcywgMToxIHRyYW5zbGF0aW9uXG4iKTsKLQkJZ290byBmaW5pc2g7Ci0JfQotCi0JcHJfZGVidWcoIk9GOiB3YWxraW5nIHJhbmdlcy4uLlxuIik7Ci0KLQkvKiBOb3cgd2FsayB0aHJvdWdoIHRoZSByYW5nZXMgKi8KLQlybGVuIC89IDQ7Ci0Jcm9uZSA9IG5hICsgcG5hICsgbnM7Ci0JZm9yICg7IHJsZW4gPj0gcm9uZTsgcmxlbiAtPSByb25lLCByYW5nZXMgKz0gcm9uZSkgewotCQlvZmZzZXQgPSBidXMtPm1hcChhZGRyLCByYW5nZXMsIG5hLCBucywgcG5hKTsKLQkJaWYgKG9mZnNldCAhPSBPRl9CQURfQUREUikKLQkJCWJyZWFrOwotCX0KLQlpZiAob2Zmc2V0ID09IE9GX0JBRF9BRERSKSB7Ci0JCXByX2RlYnVnKCJPRjogbm90IGZvdW5kICFcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JbWVtY3B5KGFkZHIsIHJhbmdlcyArIG5hLCA0ICogcG5hKTsKLQotIGZpbmlzaDoKLQlvZl9kdW1wX2FkZHIoIk9GOiBwYXJlbnQgdHJhbnNsYXRpb24gZm9yOiIsIGFkZHIsIHBuYSk7Ci0JcHJfZGVidWcoIk9GOiB3aXRoIG9mZnNldDogIlBSdTY0IlxuIiwgb2Zmc2V0KTsKLQotCS8qIFRyYW5zbGF0ZSBpdCBpbnRvIHBhcmVudCBidXMgc3BhY2UgKi8KLQlyZXR1cm4gcGJ1cy0+dHJhbnNsYXRlKGFkZHIsIG9mZnNldCwgcG5hKTsKLX0KLQotLyoKLSAqIFRyYW5zbGF0ZSBhbiBhZGRyZXNzIGZyb20gdGhlIGRldmljZS10cmVlIGludG8gYSBDUFUgcGh5c2ljYWwgYWRkcmVzcywKLSAqIHRoaXMgd2Fsa3MgdXAgdGhlIHRyZWUgYW5kIGFwcGxpZXMgdGhlIHZhcmlvdXMgYnVzIG1hcHBpbmdzIG9uIHRoZQotICogd2F5LgotICoKLSAqIE5vdGU6IFdlIGNvbnNpZGVyIHRoYXQgY3Jvc3NpbmcgYW55IGxldmVsIHdpdGggI3NpemUtY2VsbHMgPT0gMCB0byBtZWFuCi0gKiB0aGF0IHRyYW5zbGF0aW9uIGlzIGltcG9zc2libGUgKHRoYXQgaXMgd2UgYXJlIG5vdCBkZWFsaW5nIHdpdGggYSB2YWx1ZQotICogdGhhdCBjYW4gYmUgbWFwcGVkIHRvIGEgY3B1IHBoeXNpY2FsIGFkZHJlc3MpLiBUaGlzIGlzIG5vdCByZWFsbHkgc3BlY2lmaWVkCi0gKiB0aGF0IHdheSwgYnV0IHRoaXMgaXMgdHJhZGl0aW9uYWxseSB0aGUgd2F5IElCTSBhdCBsZWFzdCBkbyB0aGluZ3MKLSAqLwotdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmluX2FkZHIpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBvZl9idXMgKmJ1cywgKnBidXM7Ci0JdTMyIGFkZHJbT0ZfTUFYX0FERFJfQ0VMTFNdOwotCWludCBuYSwgbnMsIHBuYSwgcG5zOwotCXU2NCByZXN1bHQgPSBPRl9CQURfQUREUjsKLQotCXByX2RlYnVnKCJPRjogKiogdHJhbnNsYXRpb24gZm9yIGRldmljZSAlcyAqKlxuIiwgZGV2LT5mdWxsX25hbWUpOwotCi0JLyogSW5jcmVhc2UgcmVmY291bnQgYXQgY3VycmVudCBsZXZlbCAqLwotCW9mX25vZGVfZ2V0KGRldik7Ci0KLQkvKiBHZXQgcGFyZW50ICYgbWF0Y2ggYnVzIHR5cGUgKi8KLQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7Ci0JaWYgKHBhcmVudCA9PSBOVUxMKQotCQlnb3RvIGJhaWw7Ci0JYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7Ci0KLQkvKiBDb3VuZCBhZGRyZXNzIGNlbGxzICYgY29weSBhZGRyZXNzIGxvY2FsbHkgKi8KLQlidXMtPmNvdW50X2NlbGxzKGRldiwgJm5hLCAmbnMpOwotCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcm9tX3BhcnNlOiBCYWQgY2VsbCBjb3VudCBmb3IgJXNcbiIsCi0JCQlkZXYtPmZ1bGxfbmFtZSk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0JbWVtY3B5KGFkZHIsIGluX2FkZHIsIG5hICogNCk7Ci0KLQlwcl9kZWJ1ZygiT0Y6IGJ1cyBpcyAlcyAobmE9JWQsIG5zPSVkKSBvbiAlc1xuIiwKLQkJYnVzLT5uYW1lLCBuYSwgbnMsIHBhcmVudC0+ZnVsbF9uYW1lKTsKLQlvZl9kdW1wX2FkZHIoIk9GOiB0cmFuc2xhdGluZyBhZGRyZXNzOiIsIGFkZHIsIG5hKTsKLQotCS8qIFRyYW5zbGF0ZSAqLwotCWZvciAoOzspIHsKLQkJLyogU3dpdGNoIHRvIHBhcmVudCBidXMgKi8KLQkJb2Zfbm9kZV9wdXQoZGV2KTsKLQkJZGV2ID0gcGFyZW50OwotCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7Ci0KLQkJLyogSWYgcm9vdCwgd2UgaGF2ZSBmaW5pc2hlZCAqLwotCQlpZiAocGFyZW50ID09IE5VTEwpIHsKLQkJCXByX2RlYnVnKCJPRjogcmVhY2hlZCByb290IG5vZGVcbiIpOwotCQkJcmVzdWx0ID0gb2ZfcmVhZF9udW1iZXIoYWRkciwgbmEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBHZXQgbmV3IHBhcmVudCBidXMgYW5kIGNvdW50cyAqLwotCQlwYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7Ci0JCXBidXMtPmNvdW50X2NlbGxzKGRldiwgJnBuYSwgJnBucyk7Ci0JCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKHBuYSwgcG5zKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwcm9tX3BhcnNlOiBCYWQgY2VsbCBjb3VudCBmb3IgJXNcbiIsCi0JCQkJZGV2LT5mdWxsX25hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiT0Y6IHBhcmVudCBidXMgaXMgJXMgKG5hPSVkLCBucz0lZCkgb24gJXNcbiIsCi0JCQlwYnVzLT5uYW1lLCBwbmEsIHBucywgcGFyZW50LT5mdWxsX25hbWUpOwotCi0JCS8qIEFwcGx5IGJ1cyB0cmFuc2xhdGlvbiAqLwotCQlpZiAob2ZfdHJhbnNsYXRlX29uZShkZXYsIGJ1cywgcGJ1cywgYWRkciwgbmEsIG5zLCBwbmEpKQotCQkJYnJlYWs7Ci0KLQkJLyogQ29tcGxldGUgdGhlIG1vdmUgdXAgb25lIGxldmVsICovCi0JCW5hID0gcG5hOwotCQlucyA9IHBuczsKLQkJYnVzID0gcGJ1czsKLQotCQlvZl9kdW1wX2FkZHIoIk9GOiBvbmUgbGV2ZWwgdHJhbnNsYXRpb246IiwgYWRkciwgbmEpOwotCX0KLSBiYWlsOgotCW9mX25vZGVfcHV0KHBhcmVudCk7Ci0Jb2Zfbm9kZV9wdXQoZGV2KTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX3RyYW5zbGF0ZV9hZGRyZXNzKTsKLQotY29uc3QgdTMyICpvZl9nZXRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCB1NjQgKnNpemUsCi0JCQl1bnNpZ25lZCBpbnQgKmZsYWdzKQotewotCWNvbnN0IHUzMiAqcHJvcDsKLQl1bnNpZ25lZCBpbnQgcHNpemU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7Ci0Jc3RydWN0IG9mX2J1cyAqYnVzOwotCWludCBvbmVzaXplLCBpLCBuYSwgbnM7Ci0KLQkvKiBHZXQgcGFyZW50ICYgbWF0Y2ggYnVzIHR5cGUgKi8KLQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7Ci0JaWYgKHBhcmVudCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlidXMgPSBvZl9tYXRjaF9idXMocGFyZW50KTsKLQlidXMtPmNvdW50X2NlbGxzKGRldiwgJm5hLCAmbnMpOwotCW9mX25vZGVfcHV0KHBhcmVudCk7Ci0JaWYgKCFPRl9DSEVDS19DT1VOVFMobmEsIG5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBHZXQgInJlZyIgb3IgImFzc2lnbmVkLWFkZHJlc3NlcyIgcHJvcGVydHkgKi8KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgYnVzLT5hZGRyZXNzZXMsIChpbnQgKikgJnBzaXplKTsKLQlpZiAocHJvcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwc2l6ZSAvPSA0OwotCi0Jb25lc2l6ZSA9IG5hICsgbnM7Ci0JZm9yIChpID0gMDsgcHNpemUgPj0gb25lc2l6ZTsgcHNpemUgLT0gb25lc2l6ZSwgcHJvcCArPSBvbmVzaXplLCBpKyspCi0JCWlmIChpID09IGluZGV4KSB7Ci0JCQlpZiAoc2l6ZSkKLQkJCQkqc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKHByb3AgKyBuYSwgbnMpOwotCQkJaWYgKGZsYWdzKQotCQkJCSpmbGFncyA9IGJ1cy0+Z2V0X2ZsYWdzKHByb3ApOwotCQkJcmV0dXJuIHByb3A7Ci0JCX0KLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0X2FkZHJlc3MpOwotCi1zdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICphZGRycCwKLQkJCQl1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCXN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQl1NjQgdGFkZHI7Ci0KLQlpZiAoKGZsYWdzICYgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSkpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXRhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZGV2LCBhZGRycCk7Ci0JaWYgKHRhZGRyID09IE9GX0JBRF9BRERSKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltZW1zZXQociwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJdW5zaWduZWQgbG9uZyBwb3J0OwotCQlwb3J0ID0gLTE7IC8qIHBjaV9hZGRyZXNzX3RvX3Bpbyh0YWRkcik7ICovCi0JCWlmIChwb3J0ID09ICh1bnNpZ25lZCBsb25nKS0xKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXItPnN0YXJ0ID0gcG9ydDsKLQkJci0+ZW5kID0gcG9ydCArIHNpemUgLSAxOwotCX0gZWxzZSB7Ci0JCXItPnN0YXJ0ID0gdGFkZHI7Ci0JCXItPmVuZCA9IHRhZGRyICsgc2l6ZSAtIDE7Ci0JfQotCXItPmZsYWdzID0gZmxhZ3M7Ci0Jci0+bmFtZSA9IGRldi0+bmFtZTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKLQkJCXN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQljb25zdCB1MzIJKmFkZHJwOwotCXU2NAkJc2l6ZTsKLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0KLQlhZGRycCA9IG9mX2dldF9hZGRyZXNzKGRldiwgaW5kZXgsICZzaXplLCAmZmxhZ3MpOwotCWlmIChhZGRycCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgYWRkcnAsIHNpemUsIGZsYWdzLCByKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UpOwotCiB2b2lkIG9mX3BhcnNlX2RtYV93aW5kb3coc3RydWN0IGRldmljZV9ub2RlICpkbiwgY29uc3Qgdm9pZCAqZG1hX3dpbmRvd19wcm9wLAogCQl1bnNpZ25lZCBsb25nICpidXNubywgdW5zaWduZWQgbG9uZyAqcGh5cywgdW5zaWduZWQgbG9uZyAqc2l6ZSkKIHsKQEAgLTY0NCwzMDggKzExMSw2IEBACiAJKnNpemUgPSBvZl9yZWFkX251bWJlcihkbWFfd2luZG93LCBjZWxscyk7CiB9CiAKLS8qCi0gKiBJbnRlcnJ1cHQgcmVtYXBwZXIKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2lycV93b3JrYXJvdW5kczsKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2lycV9kZmx0X3BpYzsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfaXJxX2ZpbmRfcGFyZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwOwotCWNvbnN0IHBoYW5kbGUgKnBhcnA7Ci0KLQlpZiAoIW9mX25vZGVfZ2V0KGNoaWxkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkbyB7Ci0JCXBhcnAgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJpbnRlcnJ1cHQtcGFyZW50IiwgTlVMTCk7Ci0JCWlmIChwYXJwID09IE5VTEwpCi0JCQlwID0gb2ZfZ2V0X3BhcmVudChjaGlsZCk7Ci0JCWVsc2UgewotCQkJaWYgKG9mX2lycV93b3JrYXJvdW5kcyAmIE9GX0lNQVBfTk9fUEhBTkRMRSkKLQkJCQlwID0gb2Zfbm9kZV9nZXQob2ZfaXJxX2RmbHRfcGljKTsKLQkJCWVsc2UKLQkJCQlwID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBhcnApOwotCQl9Ci0JCW9mX25vZGVfcHV0KGNoaWxkKTsKLQkJY2hpbGQgPSBwOwotCX0gd2hpbGUgKHAgJiYgb2ZfZ2V0X3Byb3BlcnR5KHAsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCkgPT0gTlVMTCk7Ci0KLQlyZXR1cm4gcDsKLX0KLQotLyogVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgY2FsbGVkIGlmIHlvdSBkb24ndCBoYXZlIGFueSBzcGVjaWFsIHdvcmthcm91bmQKLSAqIGZsYWdzIHRvIHBhc3MKLSAqLwotdm9pZCBvZl9pcnFfbWFwX2luaXQodW5zaWduZWQgaW50IGZsYWdzKQotewotCW9mX2lycV93b3JrYXJvdW5kcyA9IGZsYWdzOwotCi0JLyogT2xkV29ybGQsIGRvbid0IGJvdGhlciBsb29raW5nIGF0IG90aGVyIHRoaW5ncyAqLwotCWlmIChmbGFncyAmIE9GX0lNQVBfT0xEV09STERfTUFDKQotCQlyZXR1cm47Ci0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIHBoYW5kbGVzLCBsZXQncyB0cnkgdG8gbG9jYXRlIGEgZGVmYXVsdCBpbnRlcnJ1cHQKLQkgKiBjb250cm9sbGVyIChoYXBwZW5zIHdoZW4gYm9vdGluZyB3aXRoIEJvb3RYKS4gV2UgZG8gYSBmaXJzdCBtYXRjaAotCSAqIGhlcmUsIGhvcGVmdWxseSwgdGhhdCBvbmx5IGV2ZXIgaGFwcGVucyBvbiBtYWNoaW5lcyB3aXRoIG9uZQotCSAqIGNvbnRyb2xsZXIuCi0JICovCi0JaWYgKGZsYWdzICYgT0ZfSU1BUF9OT19QSEFORExFKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQkJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfYWxsX25vZGVzKG5wKSkgIT0gTlVMTDspIHsKLQkJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtY29udHJvbGxlciIsIE5VTEwpCi0JCQkJPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQkJCS8qIFNraXAgL2Nob3Nlbi9pbnRlcnJ1cHQtY29udHJvbGxlciAqLwotCQkJaWYgKHN0cmNtcChucC0+bmFtZSwgImNob3NlbiIpID09IDApCi0JCQkJY29udGludWU7Ci0JCQkvKiBJdCBzZWVtcyBsaWtlIGF0IGxlYXN0IG9uZSBwZXJzb24gb24gdGhpcyBwbGFuZXQKLQkJCSAqIHdhbnRzIHRvIHVzZSBCb290WCBvbiBhIG1hY2hpbmUgd2l0aCBhbiBBcHBsZUtpd2kKLQkJCSAqIGNvbnRyb2xsZXIgd2hpY2ggaGFwcGVucyB0byBwcmV0ZW5kIHRvIGJlIGFuCi0JCQkgKiBpbnRlcnJ1cHQgY29udHJvbGxlciB0b28uCi0JCQkgKi8KLQkJCWlmIChzdHJjbXAobnAtPm5hbWUsICJBcHBsZUtpd2kiKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSSB0aGluayB3ZSBmb3VuZCBvbmUgISAqLwotCQkJb2ZfaXJxX2RmbHRfcGljID0gbnA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotfQotCi1pbnQgb2ZfaXJxX21hcF9yYXcoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIGNvbnN0IHUzMiAqaW50c3BlYywgdTMyIG9pbnRzaXplLAotCQljb25zdCB1MzIgKmFkZHIsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICppcGFyLCAqdG5vZGUsICpvbGQgPSBOVUxMLCAqbmV3cGFyID0gTlVMTDsKLQljb25zdCB1MzIgKnRtcCwgKmltYXAsICppbWFzazsKLQl1MzIgaW50c2l6ZSA9IDEsIGFkZHJzaXplLCBuZXdpbnRzaXplID0gMCwgbmV3YWRkcnNpemUgPSAwOwotCWludCBpbWFwbGVuLCBtYXRjaCwgaTsKLQotCXByX2RlYnVnKCJvZl9pcnFfbWFwX3JhdzogcGFyPSVzLGludHNwZWM9WzB4JTA4eCAweCUwOHguLi5dLCIKLQkJIm9pbnRzaXplPSVkXG4iLAotCQlwYXJlbnQtPmZ1bGxfbmFtZSwgaW50c3BlY1swXSwgaW50c3BlY1sxXSwgb2ludHNpemUpOwotCi0JaXBhciA9IG9mX25vZGVfZ2V0KHBhcmVudCk7Ci0KLQkvKiBGaXJzdCBnZXQgdGhlICNpbnRlcnJ1cHQtY2VsbHMgcHJvcGVydHkgb2YgdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogdGhhdCB0ZWxscyB1cyBob3cgdG8gaW50ZXJwcmV0IHRoZSBwYXNzZWQtaW4gaW50c3BlYy4gSWYgdGhlcmUKLQkgKiBpcyBub25lLCB3ZSBhcmUgbmljZSBhbmQganVzdCB3YWxrIHVwIHRoZSB0cmVlCi0JICovCi0JZG8gewotCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkoaXBhciwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKLQkJaWYgKHRtcCAhPSBOVUxMKSB7Ci0JCQlpbnRzaXplID0gKnRtcDsKLQkJCWJyZWFrOwotCQl9Ci0JCXRub2RlID0gaXBhcjsKLQkJaXBhciA9IG9mX2lycV9maW5kX3BhcmVudChpcGFyKTsKLQkJb2Zfbm9kZV9wdXQodG5vZGUpOwotCX0gd2hpbGUgKGlwYXIpOwotCWlmIChpcGFyID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiAtPiBubyBwYXJlbnQgZm91bmQgIVxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwcl9kZWJ1Zygib2ZfaXJxX21hcF9yYXc6IGlwYXI9JXMsIHNpemU9JWRcbiIsCi0JCQlpcGFyLT5mdWxsX25hbWUsIGludHNpemUpOwotCi0JaWYgKG9pbnRzaXplICE9IGludHNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogTG9vayBmb3IgdGhpcyAjYWRkcmVzcy1jZWxscy4gV2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIG9sZCBsaW51eAotCSAqIHRyaWNrIG9mIGxvb2tpbmcgZm9yIHRoZSBwYXJlbnQgaGVyZSBhcyBzb21lIGRldmljZS10cmVlcyByZWx5IG9uIGl0Ci0JICovCi0Jb2xkID0gb2Zfbm9kZV9nZXQoaXBhcik7Ci0JZG8gewotCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkob2xkLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKLQkJdG5vZGUgPSBvZl9nZXRfcGFyZW50KG9sZCk7Ci0JCW9mX25vZGVfcHV0KG9sZCk7Ci0JCW9sZCA9IHRub2RlOwotCX0gd2hpbGUgKG9sZCAmJiB0bXAgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQob2xkKTsKLQlvbGQgPSBOVUxMOwotCWFkZHJzaXplID0gKHRtcCA9PSBOVUxMKSA/IDIgOiAqdG1wOwotCi0JcHJfZGVidWcoIiAtPiBhZGRyc2l6ZT0lZFxuIiwgYWRkcnNpemUpOwotCi0JLyogTm93IHN0YXJ0IHRoZSBhY3R1YWwgInByb3BlciIgd2FsayBvZiB0aGUgaW50ZXJydXB0IHRyZWUgKi8KLQl3aGlsZSAoaXBhciAhPSBOVUxMKSB7Ci0JCS8qIE5vdyBjaGVjayBpZiBjdXJzb3IgaXMgYW4gaW50ZXJydXB0LWNvbnRyb2xsZXIgYW5kIGlmIGl0IGlzCi0JCSAqIHRoZW4gd2UgYXJlIGRvbmUKLQkJICovCi0JCWlmIChvZl9nZXRfcHJvcGVydHkoaXBhciwgImludGVycnVwdC1jb250cm9sbGVyIiwgTlVMTCkgIT0KLQkJCQlOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygiIC0+IGdvdCBpdCAhXG4iKTsKLQkJCW1lbWNweShvdXRfaXJxLT5zcGVjaWZpZXIsIGludHNwZWMsCi0JCQkJaW50c2l6ZSAqIHNpemVvZih1MzIpKTsKLQkJCW91dF9pcnEtPnNpemUgPSBpbnRzaXplOwotCQkJb3V0X2lycS0+Y29udHJvbGxlciA9IGlwYXI7Ci0JCQlvZl9ub2RlX3B1dChvbGQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBOb3cgbG9vayBmb3IgYW4gaW50ZXJydXB0LW1hcCAqLwotCQlpbWFwID0gb2ZfZ2V0X3Byb3BlcnR5KGlwYXIsICJpbnRlcnJ1cHQtbWFwIiwgJmltYXBsZW4pOwotCQkvKiBObyBpbnRlcnJ1cHQgbWFwLCBjaGVjayBmb3IgYW4gaW50ZXJydXB0IHBhcmVudCAqLwotCQlpZiAoaW1hcCA9PSBOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygiIC0+IG5vIG1hcCwgZ2V0dGluZyBwYXJlbnRcbiIpOwotCQkJbmV3cGFyID0gb2ZfaXJxX2ZpbmRfcGFyZW50KGlwYXIpOwotCQkJZ290byBza2lwbGV2ZWw7Ci0JCX0KLQkJaW1hcGxlbiAvPSBzaXplb2YodTMyKTsKLQotCQkvKiBMb29rIGZvciBhIG1hc2sgKi8KLQkJaW1hc2sgPSBvZl9nZXRfcHJvcGVydHkoaXBhciwgImludGVycnVwdC1tYXAtbWFzayIsIE5VTEwpOwotCi0JCS8qIElmIHdlIHdlcmUgcGFzc2VkIG5vICJyZWciIHByb3BlcnR5IGFuZCB3ZSBhdHRlbXB0IHRvIHBhcnNlCi0JCSAqIGFuIGludGVycnVwdC1tYXAsIHRoZW4gI2FkZHJlc3MtY2VsbHMgbXVzdCBiZSAwLgotCQkgKiBGYWlsIGlmIGl0J3Mgbm90LgotCQkgKi8KLQkJaWYgKGFkZHIgPT0gTlVMTCAmJiBhZGRyc2l6ZSAhPSAwKSB7Ci0JCQlwcl9kZWJ1ZygiIC0+IG5vIHJlZyBwYXNzZWQgaW4gd2hlbiBuZWVkZWQgIVxuIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQkvKiBQYXJzZSBpbnRlcnJ1cHQtbWFwICovCi0JCW1hdGNoID0gMDsKLQkJd2hpbGUgKGltYXBsZW4gPiAoYWRkcnNpemUgKyBpbnRzaXplICsgMSkgJiYgIW1hdGNoKSB7Ci0JCQkvKiBDb21wYXJlIHNwZWNpZmllcnMgKi8KLQkJCW1hdGNoID0gMTsKLQkJCWZvciAoaSA9IDA7IGkgPCBhZGRyc2l6ZSAmJiBtYXRjaDsgKytpKSB7Ci0JCQkJdTMyIG1hc2sgPSBpbWFzayA/IGltYXNrW2ldIDogMHhmZmZmZmZmZnU7Ci0JCQkJbWF0Y2ggPSAoKGFkZHJbaV0gXiBpbWFwW2ldKSAmIG1hc2spID09IDA7Ci0JCQl9Ci0JCQlmb3IgKDsgaSA8IChhZGRyc2l6ZSArIGludHNpemUpICYmIG1hdGNoOyArK2kpIHsKLQkJCQl1MzIgbWFzayA9IGltYXNrID8gaW1hc2tbaV0gOiAweGZmZmZmZmZmdTsKLQkJCQltYXRjaCA9Ci0JCQkJCSgoaW50c3BlY1tpLWFkZHJzaXplXSBeIGltYXBbaV0pCi0JCQkJCQkmIG1hc2spID09IDA7Ci0JCQl9Ci0JCQlpbWFwICs9IGFkZHJzaXplICsgaW50c2l6ZTsKLQkJCWltYXBsZW4gLT0gYWRkcnNpemUgKyBpbnRzaXplOwotCi0JCQlwcl9kZWJ1ZygiIC0+IG1hdGNoPSVkIChpbWFwbGVuPSVkKVxuIiwgbWF0Y2gsIGltYXBsZW4pOwotCi0JCQkvKiBHZXQgdGhlIGludGVycnVwdCBwYXJlbnQgKi8KLQkJCWlmIChvZl9pcnFfd29ya2Fyb3VuZHMgJiBPRl9JTUFQX05PX1BIQU5ETEUpCi0JCQkJbmV3cGFyID0gb2Zfbm9kZV9nZXQob2ZfaXJxX2RmbHRfcGljKTsKLQkJCWVsc2UKLQkJCQluZXdwYXIgPQotCQkJCQlvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgocGhhbmRsZSkqaW1hcCk7Ci0JCQlpbWFwKys7Ci0JCQktLWltYXBsZW47Ci0KLQkJCS8qIENoZWNrIGlmIG5vdCBmb3VuZCAqLwotCQkJaWYgKG5ld3BhciA9PSBOVUxMKSB7Ci0JCQkJcHJfZGVidWcoIiAtPiBpbWFwIHBhcmVudCBub3QgZm91bmQgIVxuIik7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCi0JCQkvKiBHZXQgI2ludGVycnVwdC1jZWxscyBhbmQgI2FkZHJlc3MtY2VsbHMgb2YgbmV3Ci0JCQkgKiBwYXJlbnQKLQkJCSAqLwotCQkJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG5ld3BhciwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKLQkJCWlmICh0bXAgPT0gTlVMTCkgewotCQkJCXByX2RlYnVnKCIgLT4gcGFyZW50IGxhY2tzICIKLQkJCQkJCSIjaW50ZXJydXB0LWNlbGxzIVxuIik7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJbmV3aW50c2l6ZSA9ICp0bXA7Ci0JCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkobmV3cGFyLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKLQkJCW5ld2FkZHJzaXplID0gKHRtcCA9PSBOVUxMKSA/IDAgOiAqdG1wOwotCi0JCQlwcl9kZWJ1ZygiIC0+IG5ld2ludHNpemU9JWQsIG5ld2FkZHJzaXplPSVkXG4iLAotCQkJCW5ld2ludHNpemUsIG5ld2FkZHJzaXplKTsKLQotCQkJLyogQ2hlY2sgZm9yIG1hbGZvcm1lZCBwcm9wZXJ0aWVzICovCi0JCQlpZiAoaW1hcGxlbiA8IChuZXdhZGRyc2l6ZSArIG5ld2ludHNpemUpKQotCQkJCWdvdG8gZmFpbDsKLQotCQkJaW1hcCArPSBuZXdhZGRyc2l6ZSArIG5ld2ludHNpemU7Ci0JCQlpbWFwbGVuIC09IG5ld2FkZHJzaXplICsgbmV3aW50c2l6ZTsKLQotCQkJcHJfZGVidWcoIiAtPiBpbWFwbGVuPSVkXG4iLCBpbWFwbGVuKTsKLQkJfQotCQlpZiAoIW1hdGNoKQotCQkJZ290byBmYWlsOwotCi0JCW9mX25vZGVfcHV0KG9sZCk7Ci0JCW9sZCA9IG9mX25vZGVfZ2V0KG5ld3Bhcik7Ci0JCWFkZHJzaXplID0gbmV3YWRkcnNpemU7Ci0JCWludHNpemUgPSBuZXdpbnRzaXplOwotCQlpbnRzcGVjID0gaW1hcCAtIGludHNpemU7Ci0JCWFkZHIgPSBpbnRzcGVjIC0gYWRkcnNpemU7Ci0KLXNraXBsZXZlbDoKLQkJLyogSXRlcmF0ZSBhZ2FpbiB3aXRoIG5ldyBwYXJlbnQgKi8KLQkJcHJfZGVidWcoIiAtPiBuZXcgcGFyZW50OiAlc1xuIiwKLQkJCQluZXdwYXIgPyBuZXdwYXItPmZ1bGxfbmFtZSA6ICI8PiIpOwotCQlvZl9ub2RlX3B1dChpcGFyKTsKLQkJaXBhciA9IG5ld3BhcjsKLQkJbmV3cGFyID0gTlVMTDsKLQl9Ci1mYWlsOgotCW9mX25vZGVfcHV0KGlwYXIpOwotCW9mX25vZGVfcHV0KG9sZCk7Ci0Jb2Zfbm9kZV9wdXQobmV3cGFyKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfaXJxX21hcF9yYXcpOwotCi1pbnQgb2ZfaXJxX21hcF9vbmUoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsCi0JCQlpbnQgaW5kZXgsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwOwotCWNvbnN0IHUzMiAqaW50c3BlYywgKnRtcCwgKmFkZHI7Ci0JdTMyIGludHNpemUsIGludGxlbjsKLQlpbnQgcmVzOwotCi0JcHJfZGVidWcoIm9mX2lycV9tYXBfb25lOiBkZXY9JXMsIGluZGV4PSVkXG4iLAotCQkJZGV2aWNlLT5mdWxsX25hbWUsIGluZGV4KTsKLQotCS8qIEdldCB0aGUgaW50ZXJydXB0cyBwcm9wZXJ0eSAqLwotCWludHNwZWMgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAiaW50ZXJydXB0cyIsIChpbnQgKikgJmludGxlbik7Ci0JaWYgKGludHNwZWMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaW50bGVuIC89IHNpemVvZih1MzIpOwotCi0JcHJfZGVidWcoIiBpbnRzcGVjPSVkIGludGxlbj0lZFxuIiwgKmludHNwZWMsIGludGxlbik7Ci0KLQkvKiBHZXQgdGhlIHJlZyBwcm9wZXJ0eSAoaWYgYW55KSAqLwotCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAicmVnIiwgTlVMTCk7Ci0KLQkvKiBMb29rIGZvciB0aGUgaW50ZXJydXB0IHBhcmVudC4gKi8KLQlwID0gb2ZfaXJxX2ZpbmRfcGFyZW50KGRldmljZSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBHZXQgc2l6ZSBvZiBpbnRlcnJ1cHQgc3BlY2lmaWVyICovCi0JdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KHAsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCk7Ci0JaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCW9mX25vZGVfcHV0KHApOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW50c2l6ZSA9ICp0bXA7Ci0KLQlwcl9kZWJ1ZygiIGludHNpemU9JWQgaW50bGVuPSVkXG4iLCBpbnRzaXplLCBpbnRsZW4pOwotCi0JLyogQ2hlY2sgaW5kZXggKi8KLQlpZiAoKGluZGV4ICsgMSkgKiBpbnRzaXplID4gaW50bGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIEdldCBuZXcgc3BlY2lmaWVyIGFuZCBtYXAgaXQgKi8KLQlyZXMgPSBvZl9pcnFfbWFwX3JhdyhwLCBpbnRzcGVjICsgaW5kZXggKiBpbnRzaXplLCBpbnRzaXplLAotCQkJCWFkZHIsIG91dF9pcnEpOwotCW9mX25vZGVfcHV0KHApOwotCXJldHVybiByZXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9pcnFfbWFwX29uZSk7Ci0KIC8qKgogICogU2VhcmNoIHRoZSBkZXZpY2UgdHJlZSBmb3IgdGhlIGJlc3QgTUFDIGFkZHJlc3MgdG8gdXNlLiAgJ21hYy1hZGRyZXNzJyBpcwogICogY2hlY2tlZCBmaXJzdCwgYmVjYXVzZSB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdG8gIm1vc3QgcmVjZW50IiBNQUMKQEAgLTk4Myw0MyArMTQ4LDMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZ2V0X21hY19hZGRyZXNzKTsKLQotaW50IG9mX2lycV90b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCBzdHJ1Y3QgcmVzb3VyY2UgKnIpCi17Ci0Jc3RydWN0IG9mX2lycSBvdXRfaXJxOwotCWludCBpcnE7Ci0JaW50IHJlczsKLQotCXJlcyA9IG9mX2lycV9tYXBfb25lKGRldiwgaW5kZXgsICZvdXRfaXJxKTsKLQotCS8qIEdldCBpcnEgZm9yIHRoZSBkZXZpY2UgKi8KLQlpZiAocmVzKSB7Ci0JCXByX2RlYnVnKCJJUlEgbm90IGZvdW5kLi4uIGNvZGUgPSAlZCIsIHJlcyk7Ci0JCXJldHVybiBOT19JUlE7Ci0JfQotCS8qIEFzc3VtaW5nIHNpbmdsZSBpbnRlcnJ1cHQgY29udHJvbGxlci4uLiAqLwotCWlycSA9IG91dF9pcnEuc3BlY2lmaWVyWzBdOwotCi0JcHJfZGVidWcoIklSUSBmb3VuZCA9ICVkIiwgaXJxKTsKLQotCS8qIE9ubHkgZGVyZWZlcmVuY2UgdGhlIHJlc291cmNlIGlmIGJvdGggdGhlCi0JICogcmVzb3VyY2UgYW5kIHRoZSBpcnEgYXJlIHZhbGlkLiAqLwotCWlmIChyICYmIGlycSAhPSBOT19JUlEpIHsKLQkJci0+c3RhcnQgPSByLT5lbmQgPSBpcnE7Ci0JCXItPmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7Ci0JfQotCi0JcmV0dXJuIGlycTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV90b19yZXNvdXJjZSk7Ci0KLXZvaWQgX19pb21lbSAqb2ZfaW9tYXAoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4KQotewotCXN0cnVjdCByZXNvdXJjZSByZXM7Ci0KLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgaW5kZXgsICZyZXMpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBpb3JlbWFwKHJlcy5zdGFydCwgMSArIHJlcy5lbmQgLSByZXMuc3RhcnQpOwotfQotRVhQT1JUX1NZTUJPTChvZl9pb21hcCk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhNGE3NzcwLi5kYzAzZmZjIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHRyYWNlLmMKQEAgLTM4LDYgKzM4LDggQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qIFJldHVybnMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHJlZ2lzdGVyIGF0IFJFR19PRkZTIGluIFAgaXMgc3Rhc2hlZCBhd2F5LiAqLwogc3RhdGljIG1pY3JvYmxhemVfcmVnX3QgKnJlZ19zYXZlX2FkZHIodW5zaWduZWQgcmVnX29mZnMsCkBAIC0xMDEsOCArMTAzLDIxIEBACiAJCQltaWNyb2JsYXplX3JlZ190ICpyZWdfYWRkciA9IHJlZ19zYXZlX2FkZHIoYWRkciwgY2hpbGQpOwogCQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1BFRUtVU1IpCiAJCQkJdmFsID0gKnJlZ19hZGRyOwotCQkJZWxzZQorCQkJZWxzZSB7CisjaWYgMQogCQkJCSpyZWdfYWRkciA9IGRhdGE7CisjZWxzZQorCQkJCS8qIE1TIHBvdGVudGlhbCBwcm9ibGVtIG9uIFdCIHN5c3RlbQorCQkJCSAqIEJlIGF3YXJlIHRoYXQgcmVnX2FkZHIgaXMgdmlydHVhbCBhZGRyZXNzCisJCQkJICogdmlydF90b19waHlzIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LgorCQkJCSAqIFRoaXMgY291bGQgYmUgc2Vuc2libGUgc29sdXRpb24uCisJCQkJICovCisJCQkJdTMyIHBhZGRyID0gdmlydF90b19waHlzKCh1MzIpcmVnX2FkZHIpOworCQkJCWludmFsaWRhdGVfaWNhY2hlX3JhbmdlKHBhZGRyLCBwYWRkciArIDQpOworCQkJCSpyZWdfYWRkciA9IGRhdGE7CisJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHBhZGRyLCBwYWRkciArIDQpOworI2VuZGlmCisJCQl9CiAJCX0gZWxzZQogCQkJcnZhbCA9IC1FSU87CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcmVzZXQuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcmVzZXQuYwppbmRleCBhMTcyMWEzLi5iZDhjY2FiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Jlc2V0LmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9yZXNldC5jCkBAIC0yNCw4ICsyNCw4IEBACiAJaW50IHJldDsgLyogdmFyaWFibGUgd2hpY2ggc3RvcmVkIGhhbmRsZSByZXNldCBncGlvIHBpbiAqLwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdDsgLyogcm9vdCBub2RlICovCiAJc3RydWN0IGRldmljZV9ub2RlICpncGlvOyAvKiBncGlvIG5vZGUgKi8KLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9IE5VTEw7Ci0JZW51bSBvZl9ncGlvX2ZsYWdzIGZsYWdzIDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKKwl1MzIgZmxhZ3M7CiAJY29uc3Qgdm9pZCAqZ3Bpb19zcGVjOwogCiAJLyogZmluZCBvdXQgcm9vdCBub2RlICovCkBAIC0zOSwxOSArMzksMTkgQEAKIAkJZ290byBlcnIwOwogCX0KIAotCW9mX2djID0gZ3Bpby0+ZGF0YTsKLQlpZiAoIW9mX2djKSB7CisJZ2MgPSBvZl9ub2RlX3RvX2dwaW9jaGlwKGdwaW8pOworCWlmICghZ2MpIHsKIAkJcHJfZGVidWcoIiVzOiBncGlvIGNvbnRyb2xsZXIgJXMgaXNuJ3QgcmVnaXN0ZXJlZFxuIiwKIAkJCSByb290LT5mdWxsX25hbWUsIGdwaW8tPmZ1bGxfbmFtZSk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyMTsKIAl9CiAKLQlyZXQgPSBvZl9nYy0+eGxhdGUob2ZfZ2MsIHJvb3QsIGdwaW9fc3BlYywgJmZsYWdzKTsKKwlyZXQgPSBnYy0+b2ZfeGxhdGUoZ2MsIHJvb3QsIGdwaW9fc3BlYywgJmZsYWdzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnIxOwogCi0JcmV0ICs9IG9mX2djLT5nYy5iYXNlOworCXJldCArPSBnYy0+YmFzZTsKIGVycjE6CiAJb2Zfbm9kZV9wdXQoZ3Bpbyk7CiBlcnIwOgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jCmluZGV4IDE3Yzk4ZGIuLmY1Zjc2ODggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3NldHVwLmMKQEAgLTIxMywxNSArMjEzLDkgQEAKIAkucHJpb3JpdHkgPSBJTlRfTUFYLAogfTsKIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkZmx0X29mX2J1c19ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGRmbHRfYnVzX25vdGlmeSwKLQkucHJpb3JpdHkgPSBJTlRfTUFYLAotfTsKLQogc3RhdGljIGludCBfX2luaXQgc2V0dXBfYnVzX25vdGlmaWVyKHZvaWQpCiB7CiAJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJmRmbHRfcGxhdF9idXNfbm90aWZpZXIpOwotCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICZkZmx0X29mX2J1c19ub3RpZmllcik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggMTIzNjkyZi4uODRiYzY2OCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTE0LDUyICsxNCwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCi0vKiBGSVhNRSBpbml0aWFsIHN1cHBvcnQgKi8KIHZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogewotCXVuc2lnbmVkIGxvbmcgKnNwOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlhc20oImFkZGlrICUwLCByMSwgMCIgOiAiPXIiIChzcCkpOwotCi0Jd2hpbGUgKCFrc3RhY2tfZW5kKHNwKSkgewotCQlhZGRyID0gKnNwKys7Ci0JCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKLQkJCWlmICh0cmFjZS0+c2tpcCA+IDApCi0JCQkJdHJhY2UtPnNraXAtLTsKLQkJCWVsc2UKLQkJCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7Ci0KLQkJCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CisJLyogRXhjbHVkZSBvdXIgaGVscGVyIGZ1bmN0aW9ucyBmcm9tIHRoZSB0cmFjZSovCisJdHJhY2UtPnNraXAgKz0gMjsKKwltaWNyb2JsYXplX3Vud2luZChOVUxMLCB0cmFjZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlKTsKIAogdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKLQl1bnNpZ25lZCBpbnQgKnNwOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7Ci0KLQlpZiAodHNrID09IGN1cnJlbnQpCi0JCWFzbSgiYWRkaWsgJTAsIHIxLCAwIiA6ICI9ciIgKHNwKSk7Ci0JZWxzZQotCQlzcCA9ICh1bnNpZ25lZCBpbnQgKil0aS0+Y3B1X2NvbnRleHQucjE7Ci0KLQl3aGlsZSAoIWtzdGFja19lbmQoc3ApKSB7Ci0JCWFkZHIgPSAqc3ArKzsKLQkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgewotCQkJaWYgKHRyYWNlLT5za2lwID4gMCkKLQkJCQl0cmFjZS0+c2tpcC0tOwotCQkJZWxzZQotCQkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gYWRkcjsKLQotCQkJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKLQkJCQlicmVhazsKLQkJfQotCX0KKwltaWNyb2JsYXplX3Vud2luZCh0c2ssIHRyYWNlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNhdmVfc3RhY2tfdHJhY2VfdHNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYwppbmRleCBlZDYxYjJmLi5iMTM4MGFlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3RpbWVyLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90aW1lci5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NudDMyX3RvXzYzLmg+CiAKICNpZmRlZiBDT05GSUdfU0VMRk1PRF9USU1FUgogI2luY2x1ZGUgPGFzbS9zZWxmbW9kLmg+CkBAIC0xMzUsNyArMTM2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNsb2NrZXZlbnRfbWljcm9ibGF6ZV90aW1lciA9IHsKIAkubmFtZQkJPSAibWljcm9ibGF6ZV9jbG9ja2V2ZW50IiwKIAkuZmVhdHVyZXMgICAgICAgPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UIHwgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMsCi0JLnNoaWZ0CQk9IDI0LAorCS5zaGlmdAkJPSA4LAogCS5yYXRpbmcJCT0gMzAwLAogCS5zZXRfbmV4dF9ldmVudAk9IG1pY3JvYmxhemVfdGltZXJfc2V0X25leHRfZXZlbnQsCiAJLnNldF9tb2RlCT0gbWljcm9ibGF6ZV90aW1lcl9zZXRfbW9kZSwKQEAgLTE5NSw3ICsxOTYsNyBAQAogc3RhdGljIHN0cnVjdCBjeWNsZWNvdW50ZXIgbWljcm9ibGF6ZV9jYyA9IHsKIAkucmVhZCA9IG1pY3JvYmxhemVfY2NfcmVhZCwKIAkubWFzayA9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5zaGlmdCA9IDI0LAorCS5zaGlmdCA9IDgsCiB9OwogCiBpbnQgX19pbml0IGluaXRfbWljcm9ibGF6ZV90aW1lY291bnRlcih2b2lkKQpAQCAtMjEzLDcgKzIxNCw3IEBACiAJLnJhdGluZwkJPSAzMDAsCiAJLnJlYWQJCT0gbWljcm9ibGF6ZV9yZWFkLAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5zaGlmdAkJPSAyNCwgLyogSSBjYW4gc2hpZnQgaXQgKi8KKwkuc2hpZnQJCT0gOCwgLyogSSBjYW4gc2hpZnQgaXQgKi8KIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC0yMzUsNiArMjM2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBXZSBoYXZlIHRvIHByb3RlY3QgYWNjZXNzZXMgYmVmb3JlIHRpbWVyIGluaXRpYWxpemF0aW9uCisgKiBhbmQgcmV0dXJuIDAgZm9yIHNjaGVkX2Nsb2NrIGZ1bmN0aW9uIGJlbG93LgorICovCitzdGF0aWMgaW50IHRpbWVyX2luaXRpYWxpemVkOworCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAl1MzIgaXJxLCBpID0gMDsKQEAgLTI4OSw0ICsyOTYsMTUgQEAKICNlbmRpZgogCW1pY3JvYmxhemVfY2xvY2tzb3VyY2VfaW5pdCgpOwogCW1pY3JvYmxhemVfY2xvY2tldmVudF9pbml0KCk7CisJdGltZXJfaW5pdGlhbGl6ZWQgPSAxOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQoreworCWlmICh0aW1lcl9pbml0aWFsaXplZCkgeworCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzID0gJmNsb2Nrc291cmNlX21pY3JvYmxhemU7CisJCWN5Y2xlX3QgY3ljID0gY250MzJfdG9fNjMoY3MtPnJlYWQoTlVMTCkpOworCQlyZXR1cm4gY2xvY2tzb3VyY2VfY3ljMm5zKGN5YywgY3MtPm11bHQsIGNzLT5zaGlmdCk7CisJfQorCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90cmFwcy5jCmluZGV4IDc1ZTQ5MjAuLmJhMDM0ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3RyYXBzLmMKQEAgLTE2LDEzICsxNiwxNCBAQAogCiAjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCiB2b2lkIHRyYXBfaW5pdCh2b2lkKQogewogCV9fZW5hYmxlX2h3X2V4Y2VwdGlvbnMoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMjQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7CS8qIDAgPT0gZW50aXJlIHN0YWNrICovCiAKIHN0YXRpYyBpbnQgX19pbml0IGtzdGFja19zZXR1cChjaGFyICpzKQogewpAQCAtMzAsMzEgKzMxLDQ3IEBACiB9CiBfX3NldHVwKCJrc3RhY2s9Iiwga3N0YWNrX3NldHVwKTsKIAotdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2spCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyB3b3Jkc190b19zaG93OworCXUzMiBmcCA9ICh1MzIpIHNwOwogCi0JaWYgKCFzdGFjaykKLQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSZzdGFjazsKLQotCXByaW50ayhLRVJOX05PVElDRSAiQ2FsbCBUcmFjZTogIik7Ci0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JcHJpbnRrKEtFUk5fTk9USUNFICJcbiIpOwotI2VuZGlmCi0Jd2hpbGUgKCFrc3RhY2tfZW5kKHN0YWNrKSkgewotCQlhZGRyID0gKnN0YWNrKys7Ci0JCS8qCi0JCSAqIElmIHRoZSBhZGRyZXNzIGlzIGVpdGhlciBpbiB0aGUgdGV4dCBzZWdtZW50IG9mIHRoZQotCQkgKiBrZXJuZWwsIG9yIGluIHRoZSByZWdpb24gd2hpY2ggY29udGFpbnMgdm1hbGxvYydlZAotCQkgKiBtZW1vcnksIGl0ICptYXkqIGJlIHRoZSBhZGRyZXNzIG9mIGEgY2FsbGluZwotCQkgKiByb3V0aW5lOyBpZiBzbywgcHJpbnQgaXQgc28gdGhhdCBzb21lb25lIHRyYWNpbmcKLQkJICogZG93biB0aGUgY2F1c2Ugb2YgdGhlIGNyYXNoIHdpbGwgYmUgYWJsZSB0byBmaWd1cmUKLQkJICogb3V0IHRoZSBjYWxsIHBhdGggdGhhdCB3YXMgdGFrZW4uCi0JCSAqLwotCQlpZiAoa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkKLQkJCXByaW50X2lwX3N5bShhZGRyKTsKKwlpZiAoZnAgPT0gMCkgeworCQlpZiAodGFzaykgeworCQkJZnAgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQorCQkJCSh0YXNrLT5zdGFjaykpLT5jcHVfY29udGV4dC5yMTsKKwkJfSBlbHNlIHsKKwkJCS8qIFBpY2sgdXAgY2FsbGVyIG9mIGR1bXBfc3RhY2soKSAqLworCQkJZnAgPSAodTMyKSZzcCAtIDg7CisJCX0KIAl9Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJcbiIpOworCisJd29yZHNfdG9fc2hvdyA9IChUSFJFQURfU0laRSAtIChmcCAmIChUSFJFQURfU0laRSAtIDEpKSkgPj4gMjsKKwlpZiAoa3N0YWNrX2RlcHRoX3RvX3ByaW50ICYmICh3b3Jkc190b19zaG93ID4ga3N0YWNrX2RlcHRoX3RvX3ByaW50KSkKKwkJd29yZHNfdG9fc2hvdyA9IGtzdGFja19kZXB0aF90b19wcmludDsKKworCXByX2luZm8oIktlcm5lbCBTdGFjazpcbiIpOworCisJLyoKKwkgKiBNYWtlIHRoZSBmaXJzdCBsaW5lIGFuICdvZGQnIHNpemUgaWYgbmVjZXNzYXJ5IHRvIGdldAorCSAqIHJlbWFpbmluZyBsaW5lcyB0byBzdGFydCBhdCBhbiBhZGRyZXNzIG11bHRpcGxlIG9mIDB4MTAKKwkgKi8KKwlpZiAoZnAgJiAweEYpIHsKKwkJdW5zaWduZWQgbG9uZyBsaW5lMV93b3JkcyA9ICgweDEwIC0gKGZwICYgMHhGKSkgPj4gMjsKKwkJaWYgKGxpbmUxX3dvcmRzIDwgd29yZHNfdG9fc2hvdykgeworCQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAiIiwgRFVNUF9QUkVGSVhfQUREUkVTUywgMzIsCisJCQkJICAgICAgIDQsICh2b2lkICopZnAsIGxpbmUxX3dvcmRzIDw8IDIsIDApOworCQkJZnAgKz0gbGluZTFfd29yZHMgPDwgMjsKKwkJCXdvcmRzX3RvX3Nob3cgLT0gbGluZTFfd29yZHM7CisJCX0KKwl9CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAiIiwgRFVNUF9QUkVGSVhfQUREUkVTUywgMzIsIDQsICh2b2lkICopZnAsCisJCSAgICAgICB3b3Jkc190b19zaG93IDw8IDIsIDApOworCXByaW50ayhLRVJOX0lORk8gIlxuXG4iKTsKKworCXByX2luZm8oIkNhbGwgVHJhY2U6XG4iKTsKKwltaWNyb2JsYXplX3Vud2luZCh0YXNrLCBOVUxMKTsKKwlwcl9pbmZvKCJcbiIpOwogCiAJaWYgKCF0YXNrKQogCQl0YXNrID0gY3VycmVudDsKQEAgLTYyLDM0ICs3OSw2IEBACiAJZGVidWdfc2hvd19oZWxkX2xvY2tzKHRhc2spOwogfQogCi12b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKLXsKLQl1bnNpZ25lZCBsb25nICpzdGFjazsKLQlpbnQgaTsKLQotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCWlmICh0YXNrKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQotCQkJCQkJKHRhc2stPnN0YWNrKSktPmNwdV9jb250ZXh0LnIxOwotCQllbHNlCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopJnNwOwotCX0KLQotCXN0YWNrID0gc3A7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJcblN0YWNrOlxuICAiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgewotCQlpZiAoa3N0YWNrX2VuZChzcCkpCi0JCQlicmVhazsKLQkJaWYgKGkgJiYgKChpICUgOCkgPT0gMCkpCi0JCQlwcmludGsoIlxuICAiKTsKLQkJcHJpbnRrKCIlMDhseCAiLCAqc3ArKyk7Ci0JfQotCXByaW50aygiXG4iKTsKLQlzaG93X3RyYWNlKHRhc2ssIHN0YWNrKTsKLX0KLQogdm9pZCBkdW1wX3N0YWNrKHZvaWQpCiB7CiAJc2hvd19zdGFjayhOVUxMLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdW53aW5kLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Vud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmFjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Vud2luZC5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQmFja3RyYWNlIHN1cHBvcnQgZm9yIE1pY3JvYmxhemUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgIERpZ2l0YWwgRGVzaWduIENvcnBvcmF0aW9uCisgKgorICogQmFzZWQgb24gYXJjaC9zaC9rZXJuZWwvY3B1L3NoNS91bndpbmQuYyBjb2RlIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFJpY2hhcmQgQ3Vybm93CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogI2RlZmluZSBERUJVRyAxICovCisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vZXhjZXB0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KKworc3RydWN0IHN0YWNrX3RyYWNlOworCisvKgorICogT24gTWljcm9ibGF6ZSwgZmluZGluZyB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUgaXMgYSBsaXR0bGUgdHJpY2t5LgorICogQXQgdGhpcyB3cml0aW5nICgzLzIwMTApLCBNaWNyb2JsYXplIGRvZXMgbm90IHN1cHBvcnQgQ09ORklHX0ZSQU1FX1BPSU5URVJTLAorICogYW5kIGV2ZW4gaWYgaXQgZGlkLCBnY2MgKDQuMS4yKSBkb2VzIG5vdCBzdG9yZSB0aGUgZnJhbWUgcG9pbnRlciBhdAorICogYSBjb25zaXN0ZW50IG9mZnNldCB3aXRoaW4gZWFjaCBmcmFtZS4gVG8gZGV0ZXJtaW5lIGZyYW1lIHNpemUsIGl0IGlzCisgKiBuZWNlc3NhcnkgdG8gc2VhcmNoIGZvciB0aGUgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gdGhhdCBjcmVhdGVzIG9yIHJlY2xhaW1zCisgKiB0aGUgZnJhbWUgYW5kIGV4dHJhY3QgdGhlIHNpemUgZnJvbSBpdC4KKyAqCisgKiBNaWNyb2JsYXplIHN0b3JlcyB0aGUgc3RhY2sgcG9pbnRlciBpbiByMSwgYW5kIGNyZWF0ZXMgYSBmcmFtZSB2aWEKKyAqCisgKiAgICAgYWRkaWsgcjEsIHIxLCAtRlJBTUVfU0laRQorICoKKyAqIFRoZSBmcmFtZSBpcyByZWNsYWltZWQgdmlhCisgKgorICogICAgIGFkZGlrIHIxLCByMSwgRlJBTUVfU0laRQorICoKKyAqIEZyYW1lIGNyZWF0aW9uIG9jY3VycyBhdCBvciBuZWFyIHRoZSB0b3Agb2YgYSBmdW5jdGlvbi4KKyAqIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIsIHJlY2xhaW0gbWF5IG9jY3VyIGF0IHRoZSBlbmQsIG9yIGJlZm9yZQorICogYSBtaWQtZnVuY3Rpb24gcmV0dXJuLgorICoKKyAqIEEgc3RhY2sgZnJhbWUgaXMgdXN1YWxseSBub3QgY3JlYXRlZCBpbiBhIGxlYWYgZnVuY3Rpb24uCisgKgorICovCisKKy8qKgorICogZ2V0X2ZyYW1lX3NpemUgLSBFeHRyYWN0IHRoZSBzdGFjayBhZGp1c3RtZW50IGZyb20gYW4KKyAqICAgICAgICAgICAgICAgICAgImFkZGlrIHIxLCByMSwgYWRqdXN0IiBpbnN0cnVjdGlvbgorICogQGluc3RyIDogTWljcm9ibGF6ZSBpbnN0cnVjdGlvbgorICoKKyAqIFJldHVybiAtIE51bWJlciBvZiBzdGFjayBieXRlcyB0aGUgaW5zdHJ1Y3Rpb24gcmVzZXJ2ZXMgb3IgcmVjbGFpbXMKKyAqLworaW5saW5lIGxvbmcgZ2V0X2ZyYW1lX3NpemUodW5zaWduZWQgbG9uZyBpbnN0cikKK3sKKwlyZXR1cm4gYWJzKChzMTYpKGluc3RyICYgMHhGRkZGKSk7Cit9CisKKy8qKgorICogZmluZF9mcmFtZV9jcmVhdGlvbiAtIFNlYXJjaCBiYWNrd2FyZCB0byBmaW5kIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNyZWF0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhY2sgZnJhbWUgKGhvcGVmdWxseSwgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgUEMgaXMgaW4pLgorICogQHBjIDogUHJvZ3JhbSBjb3VudGVyIGF0IHdoaWNoIHRvIGJlZ2luIHRoZSBzZWFyY2gKKyAqCisgKiBSZXR1cm4gLSBQQyBhdCB3aGljaCBzdGFjayBmcmFtZSBjcmVhdGlvbiBvY2N1cnMKKyAqICAgICAgICAgIE5VTEwgaWYgdGhpcyBjYW5ub3QgYmUgZm91bmQsIGkuZS4gYSBsZWFmIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nICpmaW5kX2ZyYW1lX2NyZWF0aW9uKHVuc2lnbmVkIGxvbmcgKnBjKQoreworCWludCBpOworCisJLyogTk9URTogRGlzdGFuY2UgdG8gc2VhcmNoIGlzIGFyYml0cmFyeQorCSAqCSAyNTAgd29ya3Mgd2VsbCBmb3IgbW9zdCB0aGluZ3MsCisJICoJIDc1MCBwaWNrcyB1cCB0aGluZ3MgbGlrZSB0Y3BfcmVjdm1zZygpLAorCSAqCTEwMDAgbmVlZGVkIGZvciBmYXRfZmlsbF9zdXBlcigpCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKywgcGMtLSkgeworCQl1bnNpZ25lZCBsb25nIGluc3RyOworCQlzMTYgZnJhbWVfc2l6ZTsKKworCQlpZiAoIWtlcm5lbF90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpIHBjKSkKKwkJCXJldHVybiBOVUxMOworCisJCWluc3RyID0gKnBjOworCisJCS8qIGFkZGlrIHIxLCByMSwgZm9vID8gKi8KKwkJaWYgKChpbnN0ciAmIDB4RkZGRjAwMDApICE9IDB4MzAyMTAwMDApCisJCQljb250aW51ZTsJLyogTm8gKi8KKworCQlmcmFtZV9zaXplID0gZ2V0X2ZyYW1lX3NpemUoaW5zdHIpOworCQlpZiAoKGZyYW1lX3NpemUgPCA4KSB8fCAoZnJhbWVfc2l6ZSAmIDMpKSB7CisJCQlwcl9kZWJ1ZygiICAgIEludmFsaWQgZnJhbWUgc2l6ZSAlZCBhdCAweCVwXG4iLAorCQkJCSBmcmFtZV9zaXplLCBwYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXByX2RlYnVnKCIgICAgRm91bmQgZnJhbWUgY3JlYXRpb24gYXQgMHglcCwgc2l6ZSAlZFxuIiwgcGMsCisJCQkgZnJhbWVfc2l6ZSk7CisJCXJldHVybiBwYzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBsb29rdXBfcHJldl9zdGFja19mcmFtZSAtIEZpbmQgdGhlIHN0YWNrIGZyYW1lIG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4KKyAqIEBmcCAgICAgICAgICA6IEZyYW1lIChzdGFjaykgcG9pbnRlciBmb3IgY3VycmVudCBmdW5jdGlvbgorICogQHBjICAgICAgICAgIDogUHJvZ3JhbSBjb3VudGVyIHdpdGhpbiBjdXJyZW50IGZ1bmN0aW9uCisgKiBAbGVhZl9yZXR1cm4gOiByMTUgdmFsdWUgd2l0aGluIGN1cnJlbnQgZnVuY3Rpb24uIElmIHRoZSBjdXJyZW50IGZ1bmN0aW9uCisgKgkJICBpcyBhIGxlYWYsIHRoaXMgaXMgdGhlIGNhbGxlcidzIHJldHVybiBhZGRyZXNzLgorICogQHBwcmV2X2ZwICAgIDogT24gZXhpdCwgc2V0IHRvIGZyYW1lIChzdGFjaykgcG9pbnRlciBmb3IgcHJldmlvdXMgZnVuY3Rpb24KKyAqIEBwcHJldl9wYyAgICA6IE9uIGV4aXQsIHNldCB0byBjdXJyZW50IGZ1bmN0aW9uIGNhbGxlcidzIHJldHVybiBhZGRyZXNzCisgKgorICogUmV0dXJuIC0gMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcmV2aW91cyBmcmFtZSBjYW5ub3QgYmUgZm91bmQKKyAqLworc3RhdGljIGludCBsb29rdXBfcHJldl9zdGFja19mcmFtZSh1bnNpZ25lZCBsb25nIGZwLCB1bnNpZ25lZCBsb25nIHBjLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbGVhZl9yZXR1cm4sCisJCQkJICAgdW5zaWduZWQgbG9uZyAqcHByZXZfZnAsCisJCQkJICAgdW5zaWduZWQgbG9uZyAqcHByZXZfcGMpCit7CisJdW5zaWduZWQgbG9uZyAqcHJvbG9ndWUgPSBOVUxMOworCisJLyogX3N3aXRjaF90byBpcyBhIHNwZWNpYWwgbGVhZiBmdW5jdGlvbiAqLworCWlmIChwYyAhPSAodW5zaWduZWQgbG9uZykgJl9zd2l0Y2hfdG8pCisJCXByb2xvZ3VlID0gZmluZF9mcmFtZV9jcmVhdGlvbigodW5zaWduZWQgbG9uZyAqKXBjKTsKKworCWlmIChwcm9sb2d1ZSkgeworCQlsb25nIGZyYW1lX3NpemUgPSBnZXRfZnJhbWVfc2l6ZSgqcHJvbG9ndWUpOworCisJCSpwcHJldl9mcCA9IGZwICsgZnJhbWVfc2l6ZTsKKwkJKnBwcmV2X3BjID0gKih1bnNpZ25lZCBsb25nICopZnA7CisJfSBlbHNlIHsKKwkJaWYgKCFsZWFmX3JldHVybikKKwkJCXJldHVybiAtRUlOVkFMOworCQkqcHByZXZfcGMgPSBsZWFmX3JldHVybjsKKwkJKnBwcmV2X2ZwID0gZnA7CisJfQorCisJLyogTk9URTogZG9uJ3QgY2hlY2sga2VybmVsX3RleHRfYWRkcmVzcyBoZXJlLCB0byBhbGxvdyBkaXNwbGF5CisJICoJIG9mIHVzZXJsYW5kIHJldHVybiBhZGRyZXNzCisJICovCisJcmV0dXJuICghKnBwcmV2X3BjIHx8ICgqcHByZXZfcGMgJiAzKSkgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIHZvaWQgbWljcm9ibGF6ZV91bndpbmRfaW5uZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIGZwLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGxlYWZfcmV0dXJuLAorCQkJCSAgICBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKTsKKworLyoqCisgKiB1bndpbmRfdHJhcCAtIFVud2luZCB0aHJvdWdoIGEgc3lzdGVtIHRyYXAsIHRoYXQgc3RvcmVkIHByZXZpb3VzIHN0YXRlCisgKgkJIG9uIHRoZSBzdGFjay4KKyAqLworI2lmZGVmIENPTkZJR19NTVUKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfdHJhcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgcGMsCisJCQkJdW5zaWduZWQgbG9uZyBmcCwgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwkvKiBUbyBiZSBpbXBsZW1lbnRlZCAqLworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfdHJhcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgcGMsCisJCQkJdW5zaWduZWQgbG9uZyBmcCwgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwljb25zdCBzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChjb25zdCBzdHJ1Y3QgcHRfcmVncyAqKSBmcDsKKwltaWNyb2JsYXplX3Vud2luZF9pbm5lcih0YXNrLCByZWdzLT5wYywgcmVncy0+cjEsIHJlZ3MtPnIxNSwgdHJhY2UpOworfQorI2VuZGlmCisKKy8qKgorICogbWljcm9ibGF6ZV91bndpbmRfaW5uZXIgLSBVbndpbmQgdGhlIHN0YWNrIGZyb20gdGhlIHNwZWNpZmllZCBwb2ludAorICogQHRhc2sgIDogVGFzayB3aG9zZSBzdGFjayB3ZSBhcmUgdG8gdW53aW5kIChtYXkgYmUgTlVMTCkKKyAqIEBwYyAgICA6IFByb2dyYW0gY291bnRlciBmcm9tIHdoaWNoIHdlIHN0YXJ0IHVud2luZGluZworICogQGZwICAgIDogRnJhbWUgKHN0YWNrKSBwb2ludGVyIGZyb20gd2hpY2ggd2Ugc3RhcnQgdW53aW5kaW5nCisgKiBAbGVhZl9yZXR1cm4gOiBWYWx1ZSBvZiByMTUgYXQgcGMuIElmIHRoZSBmdW5jdGlvbiBpcyBhIGxlYWYsIHRoaXMgaXMKKyAqCQkJCSAgdGhlIGNhbGxlcidzIHJldHVybiBhZGRyZXNzLgorICogQHRyYWNlIDogV2hlcmUgdG8gc3RvcmUgc3RhY2sgYmFja3RyYWNlIChQQyB2YWx1ZXMpLgorICoJICAgIE5VTEwgPT0gcHJpbnQgYmFja3RyYWNlIHRvIGtlcm5lbCBsb2cKKyAqLwordm9pZCBtaWNyb2JsYXplX3Vud2luZF9pbm5lcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGMsIHVuc2lnbmVkIGxvbmcgZnAsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGVhZl9yZXR1cm4sCisJCQkgICAgIHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCit7CisJaW50IG9mcyA9IDA7CisKKwlwcl9kZWJ1ZygiICAgIFVud2luZGluZyB3aXRoIFBDPSVwLCBGUD0lcFxuIiwgKHZvaWQgKilwYywgKHZvaWQgKilmcCk7CisJaWYgKCFwYyB8fCAhZnAgfHwgKHBjICYgMykgfHwgKGZwICYgMykpIHsKKwkJcHJfZGVidWcoIiAgICBJbnZhbGlkIHN0YXRlIGZvciB1bndpbmQsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKDsgcGMgIT0gMDspIHsKKwkJdW5zaWduZWQgbG9uZyBuZXh0X2ZwLCBuZXh0X3BjID0gMDsKKwkJdW5zaWduZWQgbG9uZyByZXR1cm5fdG8gPSBwYyArICAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQljb25zdCBzdHJ1Y3QgdHJhcF9oYW5kbGVyX2luZm8gKmhhbmRsZXIgPQorCQkJJm1pY3JvYmxhemVfdHJhcF9oYW5kbGVyczsKKworCQkvKiBJcyBwcmV2aW91cyBmdW5jdGlvbiB0aGUgSFcgZXhjZXB0aW9uIGhhbmRsZXI/ICovCisJCWlmICgocmV0dXJuX3RvID49ICh1bnNpZ25lZCBsb25nKSZfaHdfZXhjZXB0aW9uX2hhbmRsZXIpCisJCSAgICAmJihyZXR1cm5fdG8gPCAodW5zaWduZWQgbG9uZykmZXhfaGFuZGxlcl91bmhhbmRsZWQpKSB7CisJCQkvKgorCQkJICogSFcgZXhjZXB0aW9uIGhhbmRsZXIgZG9lc24ndCBzYXZlIGFsbCByZWdpc3RlcnMsCisJCQkgKiBzbyB3ZSBvcGVuLWNvZGUgYSBzcGVjaWFsIGNhc2Ugb2YgdW53aW5kX3RyYXAoKQorCQkJICovCisjaWZuZGVmIENPTkZJR19NTVUKKwkJCWNvbnN0IHN0cnVjdCBwdF9yZWdzICpyZWdzID0KKwkJCQkoY29uc3Qgc3RydWN0IHB0X3JlZ3MgKikgZnA7CisjZW5kaWYKKwkJCXByX2luZm8oIkhXIEVYQ0VQVElPTlxuIik7CisjaWZuZGVmIENPTkZJR19NTVUKKwkJCW1pY3JvYmxhemVfdW53aW5kX2lubmVyKHRhc2ssIHJlZ3MtPnIxNyAtIDQsCisJCQkJCQlmcCArIEVYX0hBTkRMRVJfU1RBQ0tfU0laLAorCQkJCQkJcmVncy0+cjE1LCB0cmFjZSk7CisjZW5kaWYKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIElzIHByZXZpb3VzIGZ1bmN0aW9uIGEgdHJhcCBoYW5kbGVyPyAqLworCQlmb3IgKDsgaGFuZGxlci0+c3RhcnRfYWRkcjsgKytoYW5kbGVyKSB7CisJCQlpZiAoKHJldHVybl90byA+PSBoYW5kbGVyLT5zdGFydF9hZGRyKQorCQkJICAgICYmIChyZXR1cm5fdG8gPD0gaGFuZGxlci0+ZW5kX2FkZHIpKSB7CisJCQkJaWYgKCF0cmFjZSkKKwkJCQkJcHJfaW5mbygiJXNcbiIsIGhhbmRsZXItPnRyYXBfbmFtZSk7CisJCQkJdW53aW5kX3RyYXAodGFzaywgcGMsIGZwLCB0cmFjZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXBjIC09IG9mczsKKworCQlpZiAodHJhY2UpIHsKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCQkJaWYgKHRyYWNlLT5za2lwID4gMCkKKwkJCQl0cmFjZS0+c2tpcC0tOworCQkJZWxzZQorCQkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gcGM7CisKKwkJCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIEhhdmUgd2UgcmVhY2hlZCB1c2VybGFuZD8gKi8KKwkJCWlmICh1bmxpa2VseShwYyA9PSB0YXNrX3B0X3JlZ3ModGFzayktPnBjKSkgeworCQkJCXByX2luZm8oIls8JXA+XSBQSUQgJWx1IFslc11cbiIsCisJCQkJCSh2b2lkICopIHBjLAorCQkJCQkodW5zaWduZWQgbG9uZykgdGFzay0+cGlkLAorCQkJCQl0YXNrLT5jb21tKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCXByaW50X2lwX3N5bShwYyk7CisJCX0KKworCQkvKiBTdG9wIHdoZW4gd2UgcmVhY2ggYW55dGhpbmcgbm90IHBhcnQgb2YgdGhlIGtlcm5lbCAqLworCQlpZiAoIWtlcm5lbF90ZXh0X2FkZHJlc3MocGMpKQorCQkJYnJlYWs7CisKKwkJaWYgKGxvb2t1cF9wcmV2X3N0YWNrX2ZyYW1lKGZwLCBwYywgbGVhZl9yZXR1cm4sICZuZXh0X2ZwLAorCQkJCQkgICAgJm5leHRfcGMpID09IDApIHsKKwkJCW9mcyA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCXBjID0gbmV4dF9wYyAmIH4zOworCQkJZnAgPSBuZXh0X2ZwOworCQkJbGVhZl9yZXR1cm4gPSAwOworCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiAgICBGYWlsZWQgdG8gZmluZCBwcmV2aW91cyBzdGFjayBmcmFtZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCIgICAgTmV4dCBQQz0lcCwgbmV4dCBGUD0lcFxuIiwKKwkJCSAodm9pZCAqKW5leHRfcGMsICh2b2lkICopbmV4dF9mcCk7CisJfQorfQorCisvKioKKyAqIG1pY3JvYmxhemVfdW53aW5kIC0gU3RhY2sgdW53aW5kZXIgZm9yIE1pY3JvYmxhemUgKGV4dGVybmFsIGVudHJ5IHBvaW50KQorICogQHRhc2sgIDogVGFzayB3aG9zZSBzdGFjayB3ZSBhcmUgdG8gdW53aW5kIChOVUxMID09IGN1cnJlbnQpCisgKiBAdHJhY2UgOiBXaGVyZSB0byBzdG9yZSBzdGFjayBiYWNrdHJhY2UgKFBDIHZhbHVlcykuCisgKgkgICAgTlVMTCA9PSBwcmludCBiYWNrdHJhY2UgdG8ga2VybmVsIGxvZworICovCit2b2lkIG1pY3JvYmxhemVfdW53aW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwlpZiAodGFzaykgeworCQlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCQljb25zdCBzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKKwkJCW1pY3JvYmxhemVfdW53aW5kX2lubmVyKHRhc2ssIHJlZ3MtPnBjLCByZWdzLT5yMSwKKwkJCQkJCXJlZ3MtPnIxNSwgdHJhY2UpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWRfaW5mbyA9CisJCQkJKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSh0YXNrLT5zdGFjayk7CisJCQljb25zdCBzdHJ1Y3QgY3B1X2NvbnRleHQgKmNwdV9jb250ZXh0ID0KKwkJCQkmdGhyZWFkX2luZm8tPmNwdV9jb250ZXh0OworCisJCQltaWNyb2JsYXplX3Vud2luZF9pbm5lcih0YXNrLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpICZfc3dpdGNoX3RvLAorCQkJCQkJY3B1X2NvbnRleHQtPnIxLAorCQkJCQkJY3B1X2NvbnRleHQtPnIxNSwgdHJhY2UpOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBwYywgZnA7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvciAlMCwgcjEsIHIwIiA6ICI9ciIgKGZwKSk7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJImJybGlkICUwLCAwZjsiCisJCQkibm9wOyIKKwkJCSIwOiIKKwkJCTogIj1yIiAocGMpCisJCSk7CisKKwkJLyogU2luY2Ugd2UgYXJlIG5vdCBhIGxlYWYgZnVuY3Rpb24sIHVzZSBsZWFmX3JldHVybiA9IDAgKi8KKwkJbWljcm9ibGF6ZV91bndpbmRfaW5uZXIoY3VycmVudCwgcGMsIGZwLCAwLCB0cmFjZSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZGI3MmQ3MS4uYTA5ZjI5NiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTAsNyArMTAsNyBAQAogCiBPVVRQVVRfRk9STUFUKCJlbGYzMi1taWNyb2JsYXplIiwgImVsZjMyLW1pY3JvYmxhemUiLCAiZWxmMzItbWljcm9ibGF6ZSIpCiBPVVRQVVRfQVJDSChtaWNyb2JsYXplKQotRU5UUlkoX3N0YXJ0KQorRU5UUlkobWljcm9ibGF6ZV9zdGFydCkKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KQEAgLTIwLDcgKzIwLDcgQEAKIAogU0VDVElPTlMgewogCS4gPSBDT05GSUdfS0VSTkVMX1NUQVJUOwotCV9zdGFydCA9IENPTkZJR19LRVJORUxfQkFTRV9BRERSOworCW1pY3JvYmxhemVfc3RhcnQgPSBDT05GSUdfS0VSTkVMX0JBU0VfQUREUjsKIAkudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKIAkJX3RleHQgPSAuIDsKIAkJX3N0ZXh0ID0gLiA7CkBAIC01NSw3ICs1NSw3IEBACiAJICovCiAJLnNkYXRhMiA6IEFUKEFERFIoLnNkYXRhMikgLSBMT0FEX09GRlNFVCkgewogCQlfc3NydyA9IC47Ci0JCS4gPSBBTElHTig0MDk2KTsgLyogcGFnZSBhbGlnbmVkIHdoZW4gTU1VIHVzZWQgLSBvcmlnaW4gMHg4ICovCisJCS4gPSBBTElHTihQQUdFX1NJWkUpOyAvKiBwYWdlIGFsaWduZWQgd2hlbiBNTVUgdXNlZCAqLwogCQkqKC5zZGF0YTIpCiAJLiA9IEFMSUdOKDgpOwogCV9lc3NydyA9IC47CkBAIC03MCw3ICs3MCw3IEBACiAJLyogUmVzZXJ2ZSBzb21lIGxvdyBSQU0gZm9yIHIwIGJhc2VkIG1lbW9yeSByZWZlcmVuY2VzICovCiAJLiA9IEFMSUdOKDB4NCkgOwogCXIwX3JhbSA9IC4gOwotCS4gPSAuICsgIDQwOTY7CS8qIGEgcGFnZSBzaG91bGQgYmUgZW5vdWdoICovCisJLiA9IC4gKyAgUEFHRV9TSVpFOwkvKiBhIHBhZ2Ugc2hvdWxkIGJlIGVub3VnaCAqLwogCiAJLyogVW5kZXIgdGhlIG1pY3JvYmxhemUgQUJJLCAuc2RhdGEgYW5kIC5zYnNzIG11c3QgYmUgY29udGlndW91cyAqLwogCS4gPSBBTElHTig4KTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiAJX19pbml0X2VuZF9iZWZvcmVfaW5pdHJhbWZzID0gLjsKIAotCS5pbml0LnJhbWZzIEFMSUdOKDQwOTYpIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgeworCS5pbml0LnJhbWZzIEFMSUdOKFBBR0VfU0laRSkgOiBBVChBRERSKC5pbml0LnJhbWZzKSAtIExPQURfT0ZGU0VUKSB7CiAJCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKIAkJKiguaW5pdC5yYW1mcykKIAkJX19pbml0cmFtZnNfZW5kID0gLjsKQEAgLTEzMiwxMSArMTMyLDExIEBACiAgKiBzbyB0aGF0IF9faW5pdF9lbmQgPT0gX19ic3Nfc3RhcnQuIFRoaXMgd2lsbCBtYWtlIGltYWdlLmVsZgogICogY29uc2lzdGVudCB3aXRoIHRoZSBpbWFnZS5iaW4KICAqLwotCQkvKiAuID0gQUxJR04oNDA5Nik7ICovCisJCS8qIC4gPSBBTElHTihQQUdFX1NJWkUpOyAqLwogCX0KIAlfX2luaXRfZW5kID0gLjsKIAotCS5ic3MgQUxJR04gKDQwOTYpIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CisJLmJzcyBBTElHTiAoUEFHRV9TSVpFKSA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewogCQkvKiBwYWdlIGFsaWduZWQgd2hlbiBNTVUgdXNlZCAqLwogCQlfX2Jzc19zdGFydCA9IC4gOwogCQkJKiguYnNzKikKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQlfX2Jzc19zdG9wID0gLiA7CiAJCV9lYnNzID0gLiA7CiAJfQotCS4gPSBBTElHTig0MDk2KTsKKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfZW5kID0gLjsKIAogCURJU0NBUkRTCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvbW0vZmF1bHQuYyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9mYXVsdC5jCmluZGV4IGJhYjkyMjkuLjU3YmQyYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9tbS9mYXVsdC5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9mYXVsdC5jCkBAIC0zNywxMCArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZXhjZXB0aW9ucy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfS0dEQikKLWludCBkZWJ1Z2dlcl9rZXJuZWxfZmF1bHRzID0gMTsKLSNlbmRpZgotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwdGVfbWlzc2VzOwkvKiB1cGRhdGVkIGJ5IGRvX3BhZ2VfZmF1bHQoKSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHRlX2Vycm9yczsJLyogdXBkYXRlZCBieSBkb19wYWdlX2ZhdWx0KCkgKi8KIApAQCAtODEsMTAgKzc3LDYgQEAKIAl9CiAKIAkvKiBrZXJuZWwgaGFzIGFjY2Vzc2VkIGEgYmFkIGFyZWEgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19LR0RCKQotCWlmIChkZWJ1Z2dlcl9rZXJuZWxfZmF1bHRzKQotCQlkZWJ1Z2dlcihyZWdzKTsKLSNlbmRpZgogCWRpZSgia2VybmVsIGFjY2VzcyBvZiBiYWQgYXJlYSIsIHJlZ3MsIHNpZyk7CiB9CiAKQEAgLTExNSwxMyArMTA3LDYgQEAKIAlpZiAoKGVycm9yX2NvZGUgJiAweDEzKSA9PSAweDEzIHx8IChlcnJvcl9jb2RlICYgMHgxMSkgPT0gMHgxMSkKIAkJaXNfd3JpdGUgPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfS0dEQikKLQlpZiAoZGVidWdnZXJfZmF1bHRfaGFuZGxlciAmJiByZWdzLT50cmFwID09IDB4MzAwKSB7Ci0JCWRlYnVnZ2VyX2ZhdWx0X2hhbmRsZXIocmVncyk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0tHREIgKi8KLQogCWlmICh1bmxpa2VseShpbl9hdG9taWMoKSB8fCAhbW0pKSB7CiAJCWlmIChrZXJuZWxfbW9kZShyZWdzKSkKIAkJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CkBAIC0yMjYsNyArMjExLDYgQEAKIAkgKiBtYWtlIHN1cmUgd2UgZXhpdCBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVuZGxlc3NseSByZWRvCiAJICogdGhlIGZhdWx0LgogCSAqLwotc3Vydml2ZToKIAlmYXVsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCBpc193cml0ZSA/IEZBVUxUX0ZMQUdfV1JJVEUgOiAwKTsKIAlpZiAodW5saWtlbHkoZmF1bHQgJiBWTV9GQVVMVF9FUlJPUikpIHsKIAkJaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9pbml0LmMKaW5kZXggZGI1OTM0OS4uNjVlYjAwNCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYworKysgYi9hcmNoL21pY3JvYmxhemUvbW0vaW5pdC5jCkBAIC0xMzQsMTMgKzEzNCw4IEBACiAJICogZm9yIDRHQiBvZiBtZW1vcnksIHVzaW5nIDRrQiBwYWdlcyksIHBsdXMgMSBwYWdlCiAJICogKGluIGNhc2UgdGhlIGFkZHJlc3MgaXNuJ3QgcGFnZS1hbGlnbmVkKS4KIAkgKi8KLSNpZm5kZWYgQ09ORklHX01NVQotCW1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBQRk5fVVAoVE9QSFlTKCh1MzIpa2xpbWl0KSksCi0JCQkJCW1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7Ci0jZWxzZQotCW1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoJmNvbnRpZ19wYWdlX2RhdGEsCisJbWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksCiAJCVBGTl9VUChUT1BIWVMoKHUzMilrbGltaXQpKSwgbWluX2xvd19wZm4sIG1heF9sb3dfcGZuKTsKLSNlbmRpZgogCW1lbWJsb2NrX3Jlc2VydmUoUEZOX1VQKFRPUEhZUygodTMyKWtsaW1pdCkpIDw8IFBBR0VfU0hJRlQsIG1hcF9zaXplKTsKIAogCS8qIGZyZWUgYm9vdG1lbSBpcyB3aG9sZSBtYWluIG1lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tidWlsZCBiL2FyY2gvbWlwcy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9LYnVpbGQKQEAgLTAsMCArMSwxNSBAQAorIyBGYWlsIG9uIHdhcm5pbmdzIC0gYWxzbyBmb3IgZmlsZXMgcmVmZXJlbmNlZCBpbiBzdWJkaXJzCisjIC1XZXJyb3IgY2FuIGJlIGRpc2FibGVkIGZvciBzcGVjaWZpYyBmaWxlcyB1c2luZzoKKyMgQ0ZMQUdTXzxmaWxlLm8+IDo9IC1Xbm8tZXJyb3IKK3N1YmRpci1jY2ZsYWdzLXkgOj0gLVdlcnJvcgorCisjIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zCitpbmNsdWRlIGFyY2gvbWlwcy9LYnVpbGQucGxhdGZvcm1zCitvYmoteSA6PSAkKHBsYXRmb3JtLXkpCisKKyMgbWlwcyBvYmplY3QgZmlsZXMKKyMgVGhlIG9iamVjdCBmaWxlcyBhcmUgbGlua2VkIGFzIGNvcmUteSBmaWxlcyB3b3VsZCBiZSBsaW5rZWQKKworb2JqLXkgKz0ga2VybmVsLworb2JqLXkgKz0gbW0vCitvYmoteSArPSBtYXRoLWVtdS8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LYnVpbGQucGxhdGZvcm1zIGIvYXJjaC9taXBzL0tidWlsZC5wbGF0Zm9ybXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0MzliOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9LYnVpbGQucGxhdGZvcm1zCkBAIC0wLDAgKzEsMzIgQEAKKyMgQWxsIHBsYXRmb3JtcyBsaXN0ZWQgaW4gYWxwaGFiZXRpYyBvcmRlcgorCitwbGF0Zm9ybXMgKz0gYWxjaGVteQorcGxhdGZvcm1zICs9IGFyNworcGxhdGZvcm1zICs9IGJjbTQ3eHgKK3BsYXRmb3JtcyArPSBiY202M3h4CitwbGF0Zm9ybXMgKz0gY2F2aXVtLW9jdGVvbgorcGxhdGZvcm1zICs9IGNvYmFsdAorcGxhdGZvcm1zICs9IGRlYworcGxhdGZvcm1zICs9IGVtbWEKK3BsYXRmb3JtcyArPSBqYXp6CitwbGF0Zm9ybXMgKz0gano0NzQwCitwbGF0Zm9ybXMgKz0gbGFzYXQKK3BsYXRmb3JtcyArPSBsb29uZ3NvbgorcGxhdGZvcm1zICs9IG1pcHNzaW0KK3BsYXRmb3JtcyArPSBtdGktbWFsdGEKK3BsYXRmb3JtcyArPSBwbWMtc2llcnJhCitwbGF0Zm9ybXMgKz0gcG54ODMzeAorcGxhdGZvcm1zICs9IHBueDg1NTAKK3BsYXRmb3JtcyArPSBwb3dlcnR2CitwbGF0Zm9ybXMgKz0gcmI1MzIKK3BsYXRmb3JtcyArPSBzZ2ktaXAyMgorcGxhdGZvcm1zICs9IHNnaS1pcDI3CitwbGF0Zm9ybXMgKz0gc2dpLWlwMzIKK3BsYXRmb3JtcyArPSBzaWJ5dGUKK3BsYXRmb3JtcyArPSBzbmkKK3BsYXRmb3JtcyArPSB0eHg5CitwbGF0Zm9ybXMgKz0gdnI0MXh4CitwbGF0Zm9ybXMgKz0gd3JwcG1jCisKKyMgaW5jbHVkZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZmlsZXMKK2luY2x1ZGUgJChwYXRzdWJzdCAlLCAkKHNyY3RyZWUpL2FyY2gvbWlwcy8lL1BsYXRmb3JtLCAkKHBsYXRmb3JtcykpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDAxYzQ0Y2IuLjNhZDU5ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xMCw2ICsxMCw4IEBACiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorCXNlbGVjdCBIQVZFX0tQUk9CRVMKKwlzZWxlY3QgSEFWRV9LUkVUUFJPQkVTCiAJc2VsZWN0IFJUQ19MSUIgaWYgIU1BQ0hfTE9PTkdTT04KIAogbWFpbm1lbnUgIkxpbnV4L01JUFMgS2VybmVsIENvbmZpZ3VyYXRpb24iCkBAIC0yMyw4ICsyNSwxNyBAQAogCXByb21wdCAiU3lzdGVtIHR5cGUiCiAJZGVmYXVsdCBTR0lfSVAyMgogCi1jb25maWcgTUFDSF9BTENIRU1ZCitjb25maWcgTUlQU19BTENIRU1ZCiAJYm9vbCAiQWxjaGVteSBwcm9jZXNzb3IgYmFzZWQgbWFjaGluZXMiCisJc2VsZWN0IDY0QklUX1BIWVNfQUREUgorCXNlbGVjdCBDRVZUX1I0S19MSUIKKwlzZWxlY3QgQ1NSQ19SNEtfTElCCisJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCisJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT04KKwlzZWxlY3QgR0VORVJJQ19HUElPCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IFNZU19TVVBQT1JUU19aQk9PVAogCiBjb25maWcgQVI3CkBAIC02Miw2ICs3Myw3IEBACiAJc2VsZWN0IFNTQl9EUklWRVJfTUlQUwogCXNlbGVjdCBTU0JfRFJJVkVSX0VYVElGCiAJc2VsZWN0IFNTQl9FTUJFRERFRAorCXNlbGVjdCBTU0JfQjQzX1BDSV9CUklER0UgaWYgUENJCiAJc2VsZWN0IFNTQl9QQ0lDT1JFX0hPU1RNT0RFIGlmIFBDSQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKQEAgLTE2Miw2ICsxNzQsMTggQEAKIAkgTWVtYmVycyBpbmNsdWRlIHRoZSBBY2VyIFBJQ0EsIE1JUFMgTWFnbnVtIDQwMDAsIE1JUFMgTWlsbGVubml1bSBhbmQKIAkgT2xpdmV0dGkgTTcwMC0xMCB3b3Jrc3RhdGlvbnMuCiAKK2NvbmZpZyBNQUNIX0paNDc0MAorCWJvb2wgIkluZ2VuaWMgSlo0NzQwIGJhc2VkIG1hY2hpbmVzIgorCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBHRU5FUklDX0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKKwlzZWxlY3QgSEFWRV9QV00KKwogY29uZmlnIExBU0FUCiAJYm9vbCAiTEFTQVQgTmV0d29ya3MgcGxhdGZvcm1zIgogCXNlbGVjdCBDRVZUX1I0SwpAQCAtNjg2LDYgKzcxMCw3IEBACiBzb3VyY2UgImFyY2gvbWlwcy9hbGNoZW15L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9iY202M3h4L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9qYXp6L0tjb25maWciCitzb3VyY2UgImFyY2gvbWlwcy9qejQ3NDAvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2xhc2F0L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9wbWMtc2llcnJhL0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9wb3dlcnR2L0tjb25maWciCkBAIC04ODgsNiArOTEzLDkgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBFWFBPUlRfVUFTTQorCWJvb2wKKwogY29uZmlnIFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvTWFrZWZpbGUgYi9hcmNoL21pcHMvTWFrZWZpbGUKaW5kZXggMGI5YzAxYS4uZjRhNGI2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9NYWtlZmlsZQpAQCAtOTMsNyArOTMsOCBAQAogY2ZsYWdzLXkJCQkrPSAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUKIGNmbGFncy15CQkJKz0gLW1zb2Z0LWZsb2F0CiBMREZMQUdTX3ZtbGludXgJCQkrPSAtRyAwIC1zdGF0aWMgLW4gLW5vc3RkbGliCi1NT0RGTEFHUwkJCSs9IC1tbG9uZy1jYWxscworS0JVSUxEX0FGTEFHU19NT0RVTEUJCSs9IC1tbG9uZy1jYWxscworS0JVSUxEX0NGTEFHU19NT0RVTEUJCSs9IC1tbG9uZy1jYWxscwogCiBjZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZwogCkBAIC0xMzAsMjYgKzEzMSw2IEBACiBjZmxhZ3MtJChDT05GSUdfQ1BVX1ZSNDFYWCkJKz0gLW1hcmNoPXI0MTAwIC1XYSwtLXRyYXAKIGNmbGFncy0kKENPTkZJR19DUFVfUjRYMDApCSs9IC1tYXJjaD1yNDYwMCAtV2EsLS10cmFwCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1RYNDlYWCkJKz0gLW1hcmNoPXI0NjAwIC1XYSwtLXRyYXAKLSMgb25seSBnY2MgPj0gNC40IGhhdmUgdGhlIGxvb25nc29uLXNwZWNpZmljIHN1cHBvcnQKLWNmbGFncy0kKENPTkZJR19DUFVfTE9PTkdTT04yKQkrPSAtV2EsLS10cmFwCi1jZmxhZ3MtJChDT05GSUdfQ1BVX0xPT05HU09OMkUpICs9IFwKLQkkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1sb29uZ3NvbjJlLC1tYXJjaD1yNDYwMCkKLWNmbGFncy0kKENPTkZJR19DUFVfTE9PTkdTT04yRikgKz0gXAotCSQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWxvb25nc29uMmYsLW1hcmNoPXI0NjAwKQotIyBlbmFibGUgdGhlIHdvcmthcm91bmRzIGZvciBsb29uZ3NvbjJmCi1pZmRlZiBDT05GSUdfQ1BVX0xPT05HU09OMkZfV09SS0FST1VORFMKLSAgaWZlcSAoJChjYWxsIGFzLW9wdGlvbiwtV2EkKGNvbW1hKS1tZml4LWxvb25nc29uMmYtbm9wLCksKQotICAgICQoZXJyb3Igb25seSBiaW51dGlscyA+PSAyLjIwLjIgaGF2ZSBuZWVkZWQgb3B0aW9uIC1tZml4LWxvb25nc29uMmYtbm9wKQotICBlbHNlCi0gICAgY2ZsYWdzLSQoQ09ORklHX0NQVV9OT1BfV09SS0FST1VORFMpICs9IC1XYSQoY29tbWEpLW1maXgtbG9vbmdzb24yZi1ub3AKLSAgZW5kaWYKLSAgaWZlcSAoJChjYWxsIGFzLW9wdGlvbiwtV2EkKGNvbW1hKS1tZml4LWxvb25nc29uMmYtanVtcCwpLCkKLSAgICAkKGVycm9yIG9ubHkgYmludXRpbHMgPj0gMi4yMC4yIGhhdmUgbmVlZGVkIG9wdGlvbiAtbWZpeC1sb29uZ3NvbjJmLWp1bXApCi0gIGVsc2UKLSAgICBjZmxhZ3MtJChDT05GSUdfQ1BVX0pVTVBfV09SS0FST1VORFMpICs9IC1XYSQoY29tbWEpLW1maXgtbG9vbmdzb24yZi1qdW1wCi0gIGVuZGlmCi1lbmRpZgotCiBjZmxhZ3MtJChDT05GSUdfQ1BVX01JUFMzMl9SMSkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9bWlwczMyLC1taXBzMzIgLVVfTUlQU19JU0EgLURfTUlQU19JU0E9X01JUFNfSVNBX01JUFMzMikgXAogCQkJLVdhLC1taXBzMzIgLVdhLC0tdHJhcAogY2ZsYWdzLSQoQ09ORklHX0NQVV9NSVBTMzJfUjIpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPW1pcHMzMnIyLC1taXBzMzJyMiAtVV9NSVBTX0lTQSAtRF9NSVBTX0lTQT1fTUlQU19JU0FfTUlQUzMyKSBcCkBAIC0xODUsNyArMTY2LDggQEAKIAogaWZkZWYgQ09ORklHX0NQVV9TQjEKIGlmZGVmIENPTkZJR19TQjFfUEFTU18xX1dPUktBUk9VTkRTCi1NT0RGTEFHUwkrPSAtbXNiMS1wYXNzMS13b3JrYXJvdW5kcworS0JVSUxEX0FGTEFHU19NT0RVTEUgKz0gLW1zYjEtcGFzczEtd29ya2Fyb3VuZHMKK0tCVUlMRF9DRkxBR1NfTU9EVUxFICs9IC1tc2IxLXBhc3MxLXdvcmthcm91bmRzCiBlbmRpZgogZW5kaWYKIApAQCAtMjA5LDQ1NSArMTkxLDcgQEAKICMKICMgQm9hcmQtZGVwZW5kZW50IG9wdGlvbnMgYW5kIGV4dHJhIGZpbGVzCiAjCi0KLSMKLSMgVGV4YXMgSW5zdHJ1bWVudHMgQVI3Ci0jCi1jb3JlLSQoQ09ORklHX0FSNykJCSs9IGFyY2gvbWlwcy9hcjcvCi1jZmxhZ3MtJChDT05GSUdfQVI3KQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWFyNwotbG9hZC0kKENPTkZJR19BUjcpCQkrPSAweGZmZmZmZmZmOTQxMDAwMDAKLQotIwotIyBBY2VyIFBJQ0EgNjEsIE1pcHMgTWFnbnVtIDQwMDAgYW5kIE9saXZldHRpIE03MDAuCi0jCi1jb3JlLSQoQ09ORklHX01BQ0hfSkFaWikJKz0gYXJjaC9taXBzL2phenovCi1jZmxhZ3MtJChDT05GSUdfTUFDSF9KQVpaKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtamF6egotbG9hZC0kKENPTkZJR19NQUNIX0pBWlopCSs9IDB4ZmZmZmZmZmY4MDA4MDAwMAotCi0jCi0jIENvbW1vbiBBbGNoZW15IEF1MXgwMCBzdHVmZgotIwotY29yZS0kKENPTkZJR19TT0NfQVUxWDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vCi0KLSMKLSMgQU1EIEFsY2hlbXkgUGIxMDAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTAwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX1BCMTAwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgUGIxMTAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19QQjExMDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTEwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX1BCMTEwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgUGIxNTAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTUwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX1BCMTUwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgUGIxNTUwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTU1MCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX1BCMTU1MCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgUGIxMjAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTIwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX1BCMTIwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgRGIxMDAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTAwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0RCMTAwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgRGIxMTAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19EQjExMDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTEwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0RCMTEwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgRGIxNTAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTUwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0RCMTUwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgRGIxNTUwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTU1MCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0RCMTU1MCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgRGIxMjAwIGV2YWwgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTIwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0RCMTIwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCi0KLSMKLSMgQU1EIEFsY2hlbXkgQm9zcG9ydXMgZXZhbCBib2FyZAotIwotY29yZS0kKENPTkZJR19NSVBTX0JPU1BPUlVTKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCi1jZmxhZ3MtJChDT05GSUdfTUlQU19CT1NQT1JVUykJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0JPU1BPUlVTKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBBTUQgQWxjaGVteSBNaXJhZ2UgZXZhbCBib2FyZAotIwotY29yZS0kKENPTkZJR19NSVBTX01JUkFHRSkJKz0gYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzLwotY2ZsYWdzLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCi1sb2FkLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyA0Ry1TeXN0ZW1zIGV2YWwgYm9hcmQKLSMKLWxpYnMtJChDT05GSUdfTUlQU19NVFgxKQkrPSBhcmNoL21pcHMvYWxjaGVteS9tdHgtMS8KLWxvYWQtJChDT05GSUdfTUlQU19NVFgxKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBNeUNhYmxlIGV2YWwgYm9hcmQKLSMKLWxpYnMtJChDT05GSUdfTUlQU19YWFMxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS94eHMxNTAwLwotbG9hZC0kKENPTkZJR19NSVBTX1hYUzE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAotCi0jIG11c3QgYmUgbGFzdCBmb3IgQWxjaGVteSBzeXN0ZW1zIGZvciBHUElPIHRvIHdvcmsgcHJvcGVybHkKLWNmbGFncy0kKENPTkZJR19TT0NfQVUxWDAwKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwCi0KLQotIwotIyBDb2JhbHQgU2VydmVyCi0jCi1jb3JlLSQoQ09ORklHX01JUFNfQ09CQUxUKQkrPSBhcmNoL21pcHMvY29iYWx0LwotY2ZsYWdzLSQoQ09ORklHX01JUFNfQ09CQUxUKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY29iYWx0Ci1sb2FkLSQoQ09ORklHX01JUFNfQ09CQUxUKQkrPSAweGZmZmZmZmZmODAwODAwMDAKLQotIwotIyBERUNzdGF0aW9uIGZhbWlseQotIwotY29yZS0kKENPTkZJR19NQUNIX0RFQ1NUQVRJT04pCSs9IGFyY2gvbWlwcy9kZWMvCi1jZmxhZ3MtJChDT05GSUdfTUFDSF9ERUNTVEFUSU9OKSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kZWMKLWxpYnMtJChDT05GSUdfTUFDSF9ERUNTVEFUSU9OKQkrPSBhcmNoL21pcHMvZGVjL3Byb20vCi1sb2FkLSQoQ09ORklHX01BQ0hfREVDU1RBVElPTikJKz0gMHhmZmZmZmZmZjgwMDQwMDAwCi0KLSMKLSMgV2luZCBSaXZlciBQUE1DIEJvYXJkICg0S0MgKyBHVDY0MTIwKQotIwotY29yZS0kKENPTkZJR19XUl9QUE1DKQkJKz0gYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jLwotY2ZsYWdzLSQoQ09ORklHX1dSX1BQTUMpCQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtd3JwcG1jCi1sb2FkLSQoQ09ORklHX1dSX1BQTUMpCQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBMb29uZ3NvbiBmYW1pbHkKLSMKLWNvcmUtJChDT05GSUdfTUFDSF9MT09OR1NPTikgKz0gYXJjaC9taXBzL2xvb25nc29uLwotY2ZsYWdzLSQoQ09ORklHX01BQ0hfTE9PTkdTT04pICs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3NvbiBcCi0gICAgICAgICAgICAgICAgICAgIC1tbm8tYnJhbmNoLWxpa2VseQotbG9hZC0kKENPTkZJR19MRU1PVEVfRlVMT09ORzJFKSArPSAweGZmZmZmZmZmODAxMDAwMDAKLWxvYWQtJChDT05GSUdfTEVNT1RFX01BQ0gyRikgKz0gMHhmZmZmZmZmZjgwMjAwMDAwCi0KLSMKLSMgTUlQUyBNYWx0YSBib2FyZAotIwotY29yZS0kKENPTkZJR19NSVBTX01BTFRBKQkrPSBhcmNoL21pcHMvbXRpLW1hbHRhLwotY2ZsYWdzLSQoQ09ORklHX01JUFNfTUFMVEEpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YQotbG9hZC0kKENPTkZJR19NSVBTX01BTFRBKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLWFsbC0kKENPTkZJR19NSVBTX01BTFRBKQk6PSAkKENPTVBSRVNTSU9OX0ZOQU1FKS5iaW4KLQotIwotIyBNSVBTIFNJTQotIwotY29yZS0kKENPTkZJR19NSVBTX1NJTSkJCSs9IGFyY2gvbWlwcy9taXBzc2ltLwotY2ZsYWdzLSQoQ09ORklHX01JUFNfU0lNKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWlwc3NpbQotbG9hZC0kKENPTkZJR19NSVBTX1NJTSkJCSs9IDB4ODAxMDAwMDAKLQotIwotIyBQTUMtU2llcnJhIE1TUCBTT0NzCi0jCi1jb3JlLSQoQ09ORklHX1BNQ19NU1ApCQkrPSBhcmNoL21pcHMvcG1jLXNpZXJyYS9tc3A3MXh4LwotY2ZsYWdzLSQoQ09ORklHX1BNQ19NU1ApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4IFwKLQkJCQkJLW1uby1icmFuY2gtbGlrZWx5Ci1sb2FkLSQoQ09ORklHX1BNQ19NU1ApCQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBQTUMtU2llcnJhIFlvc2VtaXRlCi0jCi1jb3JlLSQoQ09ORklHX1BNQ19ZT1NFTUlURSkJKz0gYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvCi1jZmxhZ3MtJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gteW9zZW1pdGUKLWxvYWQtJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBMQVNBVCBwbGF0Zm9ybXMKLSMKLWNvcmUtJChDT05GSUdfTEFTQVQpCQkrPSBhcmNoL21pcHMvbGFzYXQvCi1jZmxhZ3MtJChDT05GSUdfTEFTQVQpCQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFzYXQKLWxvYWQtJChDT05GSUdfTEFTQVQpCQkrPSAweGZmZmZmZmZmODAwMDAwMDAKLQotIwotIyBDb21tb24gVlI0MXh4Ci0jCi1jb3JlLSQoQ09ORklHX01BQ0hfVlI0MVhYKQkrPSBhcmNoL21pcHMvdnI0MXh4L2NvbW1vbi8KLWNmbGFncy0kKENPTkZJR19NQUNIX1ZSNDFYWCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXZyNDF4eAotCi0jCi0jIFpBTyBOZXR3b3JrcyBDYXBjZWxsYSAoVlI0MTMxKQotIwotbG9hZC0kKENPTkZJR19aQU9fQ0FQQ0VMTEEpCSs9IDB4ZmZmZmZmZmY4MDAwMDAwMAotCi0jCi0jIFZpY3RvciBNUC1DMzAzLzMwNCAoVlI0MTIyKQotIwotbG9hZC0kKENPTkZJR19WSUNUT1JfTVBDMzBYKQkrPSAweGZmZmZmZmZmODAwMDEwMDAKLQotIwotIyBJQk0gV29ya1BhZCB6NTAgKFZSNDEyMSkKLSMKLWNvcmUtJChDT05GSUdfSUJNX1dPUktQQUQpCSs9IGFyY2gvbWlwcy92cjQxeHgvaWJtLXdvcmtwYWQvCi1sb2FkLSQoQ09ORklHX0lCTV9XT1JLUEFEKQkrPSAweGZmZmZmZmZmODAwMDQwMDAKLQotIwotIyBDQVNJTyBDQVNTSVBFSUEgRS01NS82NSAoVlI0MTExKQotIwotY29yZS0kKENPTkZJR19DQVNJT19FNTUpCSs9IGFyY2gvbWlwcy92cjQxeHgvY2FzaW8tZTU1LwotbG9hZC0kKENPTkZJR19DQVNJT19FNTUpCSs9IDB4ZmZmZmZmZmY4MDAwNDAwMAotCi0jCi0jIFRBTkJBQyBWUjQxMzEgbXVsdGljaGlwIG1vZHVsZShUQjAyMjUpIGFuZCBUQU5CQUMgVlI0MTMxRElNTShUQjAyMjkpIChWUjQxMzEpCi0jCi1sb2FkLSQoQ09ORklHX1RBTkJBQ19UQjAyMlgpCSs9IDB4ZmZmZmZmZmY4MDAwMDAwMAotCi0jIE5YUCBTVEIyMjUKLWNvcmUtJChDT05GSUdfU09DX1BOWDgzM1gpCQkrPSBhcmNoL21pcHMvbnhwL3BueDgzM3gvY29tbW9uLwotY2ZsYWdzLSQoQ09ORklHX1NPQ19QTlg4MzNYKQkrPSAtSWFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDgzM3gKLWxpYnMtJChDT05GSUdfTlhQX1NUQjIyMCkJCSs9IGFyY2gvbWlwcy9ueHAvcG54ODMzeC9zdGIyMngvCi1sb2FkLSQoQ09ORklHX05YUF9TVEIyMjApCQkrPSAweGZmZmZmZmZmODAwMDEwMDAKLWxpYnMtJChDT05GSUdfTlhQX1NUQjIyNSkJCSs9IGFyY2gvbWlwcy9ueHAvcG54ODMzeC9zdGIyMngvCi1sb2FkLSQoQ09ORklHX05YUF9TVEIyMjUpCQkrPSAweGZmZmZmZmZmODAwMDEwMDAKLQotIwotIyBDb21tb24gTlhQIFBOWDg1NTAKLSMKLWNvcmUtJChDT05GSUdfU09DX1BOWDg1NTApCSs9IGFyY2gvbWlwcy9ueHAvcG54ODU1MC9jb21tb24vCi1jZmxhZ3MtJChDT05GSUdfU09DX1BOWDg1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwCi0KLSMKLSMgTlhQIFBOWDg1NTAgSkJTIGJvYXJkCi0jCi1saWJzLSQoQ09ORklHX1BOWDg1NTBfSkJTKQkrPSBhcmNoL21pcHMvbnhwL3BueDg1NTAvamJzLwotI2NmbGFncy0kKENPTkZJR19QTlg4NTUwX0pCUykJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDg1NTAKLWxvYWQtJChDT05GSUdfUE5YODU1MF9KQlMpCSs9IDB4ZmZmZmZmZmY4MDA2MDAwMAotCi0jIE5YUCBQTlg4NTUwIFNUQjgxMCBib2FyZAotIwotbGlicy0kKENPTkZJR19QTlg4NTUwX1NUQjgxMCkJKz0gYXJjaC9taXBzL254cC9wbng4NTUwL3N0YjgxMC8KLWxvYWQtJChDT05GSUdfUE5YODU1MF9TVEI4MTApCSs9IDB4ZmZmZmZmZmY4MDA2MDAwMAotCi0jCi0jIENvbW1vbiBORUMgRU1NQVhYWAotIwotY29yZS0kKENPTkZJR19TT0NfRU1NQTJSSCkJKz0gYXJjaC9taXBzL2VtbWEvY29tbW9uLwotY2ZsYWdzLSQoQ09ORklHX1NPQ19FTU1BMlJIKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZW1tYTJyaAotCi0jCi0jIE5FQyBFTU1BMlJIIE1hcmstZWlucwotIwotY29yZS0kKENPTkZJR19ORUNfTUFSS0VJTlMpCSs9IGFyY2gvbWlwcy9lbW1hL21hcmtlaW5zLwotbG9hZC0kKENPTkZJR19ORUNfTUFSS0VJTlMpCSs9IDB4ZmZmZmZmZmY4ODEwMDAwMAotCi0jCi0jIENpc2NvIFBvd2VyVFYgUGxhdGZvcm0KLSMKLWNvcmUtJChDT05GSUdfUE9XRVJUVikJCSs9IGFyY2gvbWlwcy9wb3dlcnR2LwotY2ZsYWdzLSQoQ09ORklHX1BPV0VSVFYpICAgICAgICArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0dgotbG9hZC0kKENPTkZJR19QT1dFUlRWKQkJKz0gMHhmZmZmZmZmZjkwODAwMDAwCi0KLSMKLSMgU0dJIElQMjIgKEluZHkvSW5kaWdvMikKLSMKLSMgU2V0IHRoZSBsb2FkIGFkZHJlc3MgdG8gPj0gMHhmZmZmZmZmZjg4MDY5MDAwIGlmIHlvdSB3YW50IHRvIGxlYXZlIHNwYWNlIGZvcgotIyBzeW1tb24sIDB4ZmZmZmZmZmY4MDAwMjAwMCBmb3IgcHJvZHVjdGlvbiBrZXJuZWxzLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZSBtdXN0Ci0jIGJlIGFsaWduZWQgdG8gYSBtdWx0aXBsZSBvZiB0aGUga2VybmVsIHN0YWNrIHNpemUgb3IgdGhlIGhhbmRsaW5nIG9mIHRoZQotIyBjdXJyZW50IHZhcmlhYmxlIHdpbGwgYnJlYWsgc28gZm9yIDY0LWJpdCBrZXJuZWxzIHdlIGhhdmUgdG8gcmFpc2UgdGhlIHN0YXJ0Ci0jIGFkZHJlc3MgYnkgOGtiLgotIwotY29yZS0kKENPTkZJR19TR0lfSVAyMikJCSs9IGFyY2gvbWlwcy9zZ2ktaXAyMi8KLWNmbGFncy0kKENPTkZJR19TR0lfSVAyMikJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjIKLWlmZGVmIENPTkZJR18zMkJJVAotbG9hZC0kKENPTkZJR19TR0lfSVAyMikJCSs9IDB4ZmZmZmZmZmY4ODAwMjAwMAotZW5kaWYKLWlmZGVmIENPTkZJR182NEJJVAotbG9hZC0kKENPTkZJR19TR0lfSVAyMikJCSs9IDB4ZmZmZmZmZmY4ODAwNDAwMAotZW5kaWYKLQotIwotIyBTR0ktSVAyNyAoT3JpZ2luMjAwLzIwMDApCi0jCi0jIFNldCB0aGUgbG9hZCBhZGRyZXNzIHRvID49IDB4YzAwMDAwMDAwMDMwMDAwMCBpZiB5b3Ugd2FudCB0byBsZWF2ZSBzcGFjZSBmb3IKLSMgc3ltbW9uLCAweGMwMDAwMDAwMDAwMWMwMDAgZm9yIHByb2R1Y3Rpb24ga2VybmVscy4gIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdAotIyBiZSAxNmtiIGFsaWduZWQgb3IgdGhlIGhhbmRsaW5nIG9mIHRoZSBjdXJyZW50IHZhcmlhYmxlIHdpbGwgYnJlYWsuCi0jCi1pZmRlZiBDT05GSUdfU0dJX0lQMjcKLWNvcmUtJChDT05GSUdfU0dJX0lQMjcpCQkrPSBhcmNoL21pcHMvc2dpLWlwMjcvCi1jZmxhZ3MtJChDT05GSUdfU0dJX0lQMjcpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3Ci1pZmRlZiBDT05GSUdfTUFQUEVEX0tFUk5FTAotbG9hZC0kKENPTkZJR19TR0lfSVAyNykJCSs9IDB4YzAwMDAwMDA0MDAxYzAwMAotT0JKQ09QWUZMQUdTCQkJOj0gLS1jaGFuZ2UtYWRkcmVzc2VzPTB4M2ZmZmZmZmY4MDAwMDAwMAotZGF0YW9mZnNldC0kKENPTkZJR19TR0lfSVAyNykJKz0gMHgwMTAwMDAwMAotZWxzZQotbG9hZC0kKENPTkZJR19TR0lfSVAyNykJCSs9IDB4YTgwMDAwMDAwMDAxYzAwMAotT0JKQ09QWUZMQUdTCQkJOj0gLS1jaGFuZ2UtYWRkcmVzc2VzPTB4NTdmZmZmZmY4MDAwMDAwMAotZW5kaWYKLWVuZGlmCi0KLSMKLSMgU0dJIElQMjggKEluZGlnbzIgUjEwaykKLSMKLSMgU2V0IHRoZSBsb2FkIGFkZHJlc3MgdG8gPj0gMHhhODAwMDAwMDIwMDgwMDAwIGlmIHlvdSB3YW50IHRvIGxlYXZlIHNwYWNlIGZvcgotIyBzeW1tb24sIDB4YTgwMDAwMDAyMDAwNDAwMCBmb3IgcHJvZHVjdGlvbiBrZXJuZWxzID8gIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdAotIyBiZSAxNmtiIGFsaWduZWQgb3IgdGhlIGhhbmRsaW5nIG9mIHRoZSBjdXJyZW50IHZhcmlhYmxlIHdpbGwgYnJlYWsuCi0jIFNpbXBsaWZpZWQ6IHdoYXQgSVAyMiBkb2VzIGF0IDEyOE1CKyBpbiBrc2VnTiwgSVAyOCBkb2VzIGF0IDUxMk1CKyBpbiB4a3BoeXMKLSMKLWlmZGVmIENPTkZJR19TR0lfSVAyOAotICBpZmVxICgkKGNhbGwgY2Mtb3B0aW9uLXluLC1tcjEway1jYWNoZS1iYXJyaWVyPXN0b3JlKSwgbikKLSAgICAgICQoZXJyb3IgZ2NjIGRvZXNuJ3Qgc3VwcG9ydCBuZWVkZWQgb3B0aW9uIC1tcjEway1jYWNoZS1iYXJyaWVyPXN0b3JlKQotICBlbmRpZgotZW5kaWYKLWNvcmUtJChDT05GSUdfU0dJX0lQMjgpCQkrPSBhcmNoL21pcHMvc2dpLWlwMjIvCi1jZmxhZ3MtJChDT05GSUdfU0dJX0lQMjgpCSs9IC1tcjEway1jYWNoZS1iYXJyaWVyPXN0b3JlIC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI4Ci1sb2FkLSQoQ09ORklHX1NHSV9JUDI4KQkJKz0gMHhhODAwMDAwMDIwMDA0MDAwCi0KLSMKLSMgU0dJLUlQMzIgKE8yKQotIwotIyBTZXQgdGhlIGxvYWQgYWRkcmVzcyB0byA+PSA4MDA2OTAwMCBpZiB5b3Ugd2FudCB0byBsZWF2ZSBzcGFjZSBmb3Igc3ltbW9uLAotIyAweGZmZmZmZmZmODAwMDQwMDAgZm9yIHByb2R1Y3Rpb24ga2VybmVscy4gIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBhbGlnbmVkIHRvCi0jIGEgbXVsdGlwbGUgb2YgdGhlIGtlcm5lbCBzdGFjayBzaXplIG9yIHRoZSBoYW5kbGluZyBvZiB0aGUgY3VycmVudCB2YXJpYWJsZQotIyB3aWxsIGJyZWFrLgotIwotY29yZS0kKENPTkZJR19TR0lfSVAzMikJCSs9IGFyY2gvbWlwcy9zZ2ktaXAzMi8KLWNmbGFncy0kKENPTkZJR19TR0lfSVAzMikJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIKLWxvYWQtJChDT05GSUdfU0dJX0lQMzIpCQkrPSAweGZmZmZmZmZmODAwMDQwMDAKLQotIwotIyBTaWJ5dGUgU0IxMjUwL0JDTTE0ODAgU09DCi0jCi0jIFRoaXMgaXMgYSBMSUIgc28gdGhhdCBpdCBsaW5rcyBhdCB0aGUgZW5kLCBhbmQgaW5pdGNhbGxzIGFyZSBsYXRlcgotIyB0aGUgc2VxdWVuY2U7IGJ1dCBpdCBpcyBidWlsdCBhcyBhbiBvYmplY3Qgc28gdGhhdCBtb2R1bGVzIGRvbid0IGdldAotIyByZW1vdmVkIChhcyBoYXBwZW5zLCBldmVuIGlmIHRoZXkgaGF2ZSBfX2luaXRjYWxsL21vZHVsZV9pbml0KQotIwotY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMTEyWCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvCi1jb3JlLSQoQ09ORklHX1NJQllURV9CQ00xMTJYKQkrPSBhcmNoL21pcHMvc2lieXRlL2NvbW1vbi8KLWNmbGFncy0kKENPTkZJR19TSUJZVEVfQkNNMTEyWCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXNpYnl0ZSBcCi0JCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xMjUwXzExMnhfQUxMCi0KLWNvcmUtJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvCi1jb3JlLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IGFyY2gvbWlwcy9zaWJ5dGUvY29tbW9uLwotY2ZsYWdzLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1zaWJ5dGUgXAotCQkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTI1MF8xMTJ4X0FMTAotCi1jb3JlLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSBhcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvCi1jb3JlLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSBhcmNoL21pcHMvc2lieXRlL2NvbW1vbi8KLWNmbGFncy0kKENPTkZJR19TSUJZVEVfQkNNMXg1NSkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXNpYnl0ZSBcCi0JCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xNDgwX0FMTAotCi1jb3JlLSQoQ09ORklHX1NJQllURV9CQ00xeDgwKQkrPSBhcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvCi1jb3JlLSQoQ09ORklHX1NJQllURV9CQ00xeDgwKQkrPSBhcmNoL21pcHMvc2lieXRlL2NvbW1vbi8KLWNmbGFncy0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXNpYnl0ZSBcCi0JCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xNDgwX0FMTAotCi0jCi0jIFNpYnl0ZSBCQ005MTEyMHggKENhcm1lbCkgYm9hcmQKLSMgU2lieXRlIEJDTTkxMTIwQyAoQ1JoaW5lKSBib2FyZAotIyBTaWJ5dGUgQkNNOTExMjVDIChDUmhvbmUpIGJvYXJkCi0jIFNpYnl0ZSBCQ005MTEyNUUgKFJob25lKSBib2FyZAotIyBTaWJ5dGUgU1dBUk0gYm9hcmQKLSMgU2lieXRlIEJDTTkxeDgwIChCaWdTdXIpIGJvYXJkCi0jCi1jb3JlLSQoQ09ORklHX1NJQllURV9DQVJNRUwpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vCi1sb2FkLSQoQ09ORklHX1NJQllURV9DQVJNRUwpCTo9IDB4ZmZmZmZmZmY4MDEwMDAwMAotY29yZS0kKENPTkZJR19TSUJZVEVfQ1JISU5FKQkrPSBhcmNoL21pcHMvc2lieXRlL3N3YXJtLwotbG9hZC0kKENPTkZJR19TSUJZVEVfQ1JISU5FKQk6PSAweGZmZmZmZmZmODAxMDAwMDAKLWNvcmUtJChDT05GSUdfU0lCWVRFX0NSSE9ORSkJKz0gYXJjaC9taXBzL3NpYnl0ZS9zd2FybS8KLWxvYWQtJChDT05GSUdfU0lCWVRFX0NSSE9ORSkJOj0gMHhmZmZmZmZmZjgwMTAwMDAwCi1jb3JlLSQoQ09ORklHX1NJQllURV9SSE9ORSkJKz0gYXJjaC9taXBzL3NpYnl0ZS9zd2FybS8KLWxvYWQtJChDT05GSUdfU0lCWVRFX1JIT05FKQk6PSAweGZmZmZmZmZmODAxMDAwMDAKLWNvcmUtJChDT05GSUdfU0lCWVRFX1NFTlRPU0EpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vCi1sb2FkLSQoQ09ORklHX1NJQllURV9TRU5UT1NBKQk6PSAweGZmZmZmZmZmODAxMDAwMDAKLWNvcmUtJChDT05GSUdfU0lCWVRFX1NXQVJNKQkrPSBhcmNoL21pcHMvc2lieXRlL3N3YXJtLwotbG9hZC0kKENPTkZJR19TSUJZVEVfU1dBUk0pCTo9IDB4ZmZmZmZmZmY4MDEwMDAwMAotY29yZS0kKENPTkZJR19TSUJZVEVfQklHU1VSKQkrPSBhcmNoL21pcHMvc2lieXRlL3N3YXJtLwotbG9hZC0kKENPTkZJR19TSUJZVEVfQklHU1VSKQk6PSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBCcm9hZGNvbSBCQ000N1hYIGJvYXJkcwotIwotY29yZS0kKENPTkZJR19CQ000N1hYKQkJKz0gYXJjaC9taXBzL2JjbTQ3eHgvCi1jZmxhZ3MtJChDT05GSUdfQkNNNDdYWCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgKLWxvYWQtJChDT05GSUdfQkNNNDdYWCkJCTo9IDB4ZmZmZmZmZmY4MDAwMTAwMAotCi0jCi0jIEJyb2FkY29tIEJDTTYzWFggYm9hcmRzCi0jCi1jb3JlLSQoQ09ORklHX0JDTTYzWFgpCQkrPSBhcmNoL21pcHMvYmNtNjN4eC8KLWNmbGFncy0kKENPTkZJR19CQ002M1hYKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC8KLWxvYWQtJChDT05GSUdfQkNNNjNYWCkJCTo9IDB4ZmZmZmZmZmY4MDAxMDAwMAotCi0jCi0jIFNOSSBSTQotIwotY29yZS0kKENPTkZJR19TTklfUk0pCQkrPSBhcmNoL21pcHMvc25pLwotY2ZsYWdzLSQoQ09ORklHX1NOSV9STSkJCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1ybQotaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCi1sb2FkLSQoQ09ORklHX1NOSV9STSkJCSs9IDB4ZmZmZmZmZmY4MDYwMDAwMAotZWxzZQotbG9hZC0kKENPTkZJR19TTklfUk0pCQkrPSAweGZmZmZmZmZmODAwMzAwMDAKLWVuZGlmCi1hbGwtJChDT05GSUdfU05JX1JNKQkJOj0gJChDT01QUkVTU0lPTl9GTkFNRSkuZWNvZmYKLQotIwotIyBDb21tb24gVFh4OQotIwotY29yZS0kKENPTkZJR19NQUNIX1RYMzlYWCkJKz0gYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy8KLWNmbGFncy0kKENPTkZJR19NQUNIX1RYMzlYWCkgKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4Mzl4eAotbG9hZC0kKENPTkZJR19NQUNIX1RYMzlYWCkJKz0gMHhmZmZmZmZmZjgwMDUwMDAwCi1jb3JlLSQoQ09ORklHX01BQ0hfVFg0OVhYKQkrPSBhcmNoL21pcHMvdHh4OS9nZW5lcmljLwotY2ZsYWdzLSQoQ09ORklHX01BQ0hfVFg0OVhYKSArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHg0OXh4Ci1sb2FkLSQoQ09ORklHX01BQ0hfVFg0OVhYKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwotIyBUb3NoaWJhIEpNUi1UWDM5MjcgYm9hcmQKLSMKLWNvcmUtJChDT05GSUdfVE9TSElCQV9KTVIzOTI3KQkrPSBhcmNoL21pcHMvdHh4OS9qbXIzOTI3LwotCi0jCi0jIFJvdXRlcmJvYXJkIDUzMiBib2FyZAotIwotY29yZS0kKENPTkZJR19NSUtST1RJS19SQjUzMikJKz0gYXJjaC9taXBzL3JiNTMyLwotY2ZsYWdzLSQoQ09ORklHX01JS1JPVElLX1JCNTMyKSArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNAotbG9hZC0kKENPTkZJR19NSUtST1RJS19SQjUzMikJKz0gMHhmZmZmZmZmZjgwMTAxMDAwCi0KLSMKLSMgVG9zaGliYSBSQlRYNDlYWCBib2FyZHMKLSMKLWNvcmUtJChDT05GSUdfVE9TSElCQV9SQlRYNDkyNykJKz0gYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MjcvCi1jb3JlLSQoQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzgpICs9IGFyY2gvbWlwcy90eHg5L3JidHg0OTM4LwotY29yZS0kKENPTkZJR19UT1NISUJBX1JCVFg0OTM5KSArPSBhcmNoL21pcHMvdHh4OS9yYnR4NDkzOS8KLQotIwotIyBDYXZpdW0gT2N0ZW9uCi0jCi1jb3JlLSQoQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OKQkrPSBhcmNoL21pcHMvY2F2aXVtLW9jdGVvbi8KLWNmbGFncy0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24KLWNvcmUtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IGFyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS8KLWlmZGVmIENPTkZJR19DQVZJVU1fT0NURU9OXzJORF9LRVJORUwKLWxvYWQtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IDB4ZmZmZmZmZmY4NDEwMDAwMAotZWxzZQotbG9hZC0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikgCSs9IDB4ZmZmZmZmZmY4MTEwMDAwMAotZW5kaWYKK2luY2x1ZGUgJChzcmN0cmVlKS9hcmNoL21pcHMvS2J1aWxkLnBsYXRmb3JtcwogCiBjZmxhZ3MteQkJCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljCiBkcml2ZXJzLSQoQ09ORklHX1BDSSkJCSs9IGFyY2gvbWlwcy9wY2kvCkBAIC03MDYsNyArMjQwLDggQEAKIAogbGlicy15CQkJKz0gYXJjaC9taXBzL2xpYi8KIAotY29yZS15CQkJKz0gYXJjaC9taXBzL2tlcm5lbC8gYXJjaC9taXBzL21tLyBhcmNoL21pcHMvbWF0aC1lbXUvCisjIFNlZSBhcmNoL21pcHMvS2J1aWxkIGZvciBjb250ZW50IG9mIGNvcmUgcGFydCBvZiB0aGUga2VybmVsCitjb3JlLXkgKz0gYXJjaC9taXBzLwogCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkrPSBhcmNoL21pcHMvb3Byb2ZpbGUvCiAKQEAgLTcyNiw2ICsyNjEsOSBAQAogdm1saW51eC4zMjogdm1saW51eAogCSQoT0JKQ09QWSkgLU8gJCgzMmJpdC1iZmQpICQoT0JKQ09QWUZMQUdTKSAkPCAkQAogCisKKyNvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMubworCiAjCiAjIFRoZSA2NC1iaXQgRUxGIHRvb2xzIGFyZSBwcmV0dHkgYnJva2VuIHNvIGF0IHRoaXMgdGltZSB3ZSBnZW5lcmF0ZSA2NC1iaXQKICMgRUxGIGZpbGVzIGZyb20gMzItYml0IGZpbGVzIGJ5IGNvbnZlcnNpb24uCkBAIC03MzMsMzUgKzI3MSwxOSBAQAogdm1saW51eC42NDogdm1saW51eAogCSQoT0JKQ09QWSkgLU8gJCg2NGJpdC1iZmQpICQoT0JKQ09QWUZMQUdTKSAkPCAkQAogCi1tYWtlYm9vdCA9JChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9taXBzL2Jvb3QgVk1MSU5VWD0kKHZtbGludXgtMzIpICQoMSkKLW1ha2V6Ym9vdCA9JChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZCBcCi0JICAgVk1MSU5VWF9MT0FEX0FERFJFU1M9JChsb2FkLXkpIDMyYml0LWJmZD0kKDMyYml0LWJmZCkgJCgxKQotCiBhbGw6CSQoYWxsLXkpCiAKLXZtbGludXo6IHZtbGludXggRk9SQ0UKLQkrQCQoY2FsbCBtYWtlemJvb3QsJEApCisjIGJvb3QKK3ZtbGludXguYmluIHZtbGludXguZWNvZmYgdm1saW51eC5zcmVjOiAkKHZtbGludXgtMzIpIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC9taXBzL2Jvb3QgVk1MSU5VWD0kKHZtbGludXgtMzIpIGFyY2gvbWlwcy9ib290LyRACiAKLXZtbGludXouYmluOiB2bWxpbnV4Ci0JK0AkKGNhbGwgbWFrZXpib290LCRAKQorIyBib290L2NvbXByZXNzZWQKK3ZtbGludXogdm1saW51ei5iaW4gdm1saW51ei5lY29mZiB2bWxpbnV6LnNyZWM6ICQodm1saW51eC0zMikgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkIFwKKwkgICBWTUxJTlVYX0xPQURfQUREUkVTUz0kKGxvYWQteSkgMzJiaXQtYmZkPSQoMzJiaXQtYmZkKSAkQAogCi12bWxpbnV6LmVjb2ZmOiB2bWxpbnV4Ci0JK0AkKGNhbGwgbWFrZXpib290LCRAKQogCi12bWxpbnV6LnNyZWM6IHZtbGludXgKLQkrQCQoY2FsbCBtYWtlemJvb3QsJEApCi0KLXZtbGludXguYmluOiAkKHZtbGludXgtMzIpCi0JK0AkKGNhbGwgbWFrZWJvb3QsJEApCi0KLXZtbGludXguZWNvZmY6ICQodm1saW51eC0zMikKLQkrQCQoY2FsbCBtYWtlYm9vdCwkQCkKLQotdm1saW51eC5zcmVjOiAkKHZtbGludXgtMzIpCi0JK0AkKGNhbGwgbWFrZWJvb3QsJEApCi0KLUNMRUFOX0ZJTEVTICs9IHZtbGludXguZWNvZmYgXAotCSAgICAgICB2bWxpbnV4LnNyZWMKK0NMRUFOX0ZJTEVTICs9IHZtbGludXguMzIgdm1saW51eC42NAogCiBhcmNocHJlcGFyZToKIGlmZGVmIENPTkZJR19NSVBTMzJfTjMyCkBAIC03ODAsOSArMzAyLDkgQEAKIAkkKFEpaW5zdGFsbCAtRCAtbSA2NDQgU3lzdGVtLm1hcCAkKElOU1RBTExfUEFUSCkvU3lzdGVtLm1hcC0kKEtFUk5FTFJFTEVBU0UpCiAKIGFyY2hjbGVhbjoKLQlAJChNQUtFKSAkKGNsZWFuKT1hcmNoL21pcHMvYm9vdAotCUAkKE1BS0UpICQoY2xlYW4pPWFyY2gvbWlwcy9ib290L2NvbXByZXNzZWQKLQlAJChNQUtFKSAkKGNsZWFuKT1hcmNoL21pcHMvbGFzYXQKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL21pcHMvYm9vdAorCSQoUSkkKE1BS0UpICQoY2xlYW4pPWFyY2gvbWlwcy9ib290L2NvbXByZXNzZWQKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL21pcHMvbGFzYXQKIAogZGVmaW5lIGFyY2hoZWxwCiAJZWNobyAnICBpbnN0YWxsICAgICAgICAgICAgICAtIGluc3RhbGwga2VybmVsIGludG8gJChJTlNUQUxMX1BBVEgpJwpAQCAtNzk2LDExICszMTgsMyBAQAogCWVjaG8KIAllY2hvICcgIFRoZXNlIHdpbGwgYmUgZGVmYXVsdCBhcyBhcHJvcHJpYXRlIGZvciBhIGNvbmZpZ3VyZWQgcGxhdGZvcm0uJwogZW5kZWYKLQotQ0xFQU5fRklMRVMgKz0gdm1saW51eC4zMiBcCi0JICAgICAgIHZtbGludXguNjQgXAotCSAgICAgICB2bWxpbnV4LmVjb2ZmIFwKLQkgICAgICAgdm1saW51eiBcCi0JICAgICAgIHZtbGludXouZWNvZmYgXAotCSAgICAgICB2bWxpbnV6LmJpbiBcCi0JICAgICAgIHZtbGludXouc3JlYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKaW5kZXggZGYzYjFhNy4uMmNjZmQ0YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnCkBAIC0xMSw3ICsxMSw3IEBACiAKIGNob2ljZQogCXByb21wdCAiTWFjaGluZSB0eXBlIgotCWRlcGVuZHMgb24gTUFDSF9BTENIRU1ZCisJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkKIAlkZWZhdWx0IE1JUFNfREIxMDAwCiAKIGNvbmZpZyBNSVBTX01UWDEKQEAgLTEyOCw0MSArMTI4LDMzIEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCiAKK2NvbmZpZyBNSVBTX0dQUgorCWJvb2wgIlRyYXBlemUgSVRTIEdQUiBib2FyZCIKKwlzZWxlY3QgU09DX0FVMTU1MAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCisKIGVuZGNob2ljZQogCiBjb25maWcgU09DX0FVMTAwMAogCWJvb2wKLQlzZWxlY3QgU09DX0FVMVgwMAogCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAKIGNvbmZpZyBTT0NfQVUxMTAwCiAJYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCiAJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAogY29uZmlnIFNPQ19BVTE1MDAKIAlib29sCi0Jc2VsZWN0IFNPQ19BVTFYMDAKIAlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCiBjb25maWcgU09DX0FVMTU1MAogCWJvb2wKLQlzZWxlY3QgU09DX0FVMVgwMAogCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAKIGNvbmZpZyBTT0NfQVUxMjAwCiAJYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCiAJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKLQotY29uZmlnIFNPQ19BVTFYMDAKLQlib29sCi0Jc2VsZWN0IDY0QklUX1BIWVNfQUREUgotCXNlbGVjdCBDRVZUX1I0S19MSUIKLQlzZWxlY3QgQ1NSQ19SNEtfTElCCi0Jc2VsZWN0IElSUV9DUFUKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT04KLQlzZWxlY3QgR0VORVJJQ19HUElPCi0Jc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9hbGNoZW15L1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTllNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYWxjaGVteS9QbGF0Zm9ybQpAQCAtMCwwICsxLDExNCBAQAorIworIyBDb3JlIEFsY2hlbXkgY29kZQorIworcGxhdGZvcm0tJChDT05GSUdfTUlQU19BTENIRU1ZKQkrPSBhbGNoZW15L2NvbW1vbi8KKworCisjCisjIEFNRCBBbGNoZW15IFBiMTAwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX1BCMTAwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IFBiMTEwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX1BCMTEwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjExMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19QQjExMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IFBiMTUwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX1BCMTUwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IFBiMTU1MCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX1BCMTU1MCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IFBiMTIwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX1BCMTIwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IERiMTAwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTAwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IERiMTEwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTEwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjExMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19EQjExMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IERiMTUwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTUwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IERiMTU1MCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTU1MCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IERiMTIwMCBldmFsIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTIwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIEFNRCBBbGNoZW15IEJvc3BvcnVzIGV2YWwgYm9hcmQKKyMKK3BsYXRmb3JtLSQoQ09ORklHX01JUFNfQk9TUE9SVVMpICs9IGFsY2hlbXkvZGV2Ym9hcmRzLworY2ZsYWdzLSQoQ09ORklHX01JUFNfQk9TUE9SVVMpCSArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCitsb2FkLSQoQ09ORklHX01JUFNfQk9TUE9SVVMpCSArPSAweGZmZmZmZmZmODAxMDAwMDAKKworIworIyBBTUQgQWxjaGVteSBNaXJhZ2UgZXZhbCBib2FyZAorIworcGxhdGZvcm0tJChDT05GSUdfTUlQU19NSVJBR0UpCSs9IGFsY2hlbXkvZGV2Ym9hcmRzLworY2ZsYWdzLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCitsb2FkLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKKworIworIyA0Ry1TeXN0ZW1zIGV2YWwgYm9hcmQKKyMKK3BsYXRmb3JtLSQoQ09ORklHX01JUFNfTVRYMSkJKz0gYWxjaGVteS9tdHgtMS8KK2xvYWQtJChDT05GSUdfTUlQU19NVFgxKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKKworIworIyBNeUNhYmxlIGV2YWwgYm9hcmQKKyMKK3BsYXRmb3JtLSQoQ09ORklHX01JUFNfWFhTMTUwMCkJKz0gYWxjaGVteS94eHMxNTAwLworbG9hZC0kKENPTkZJR19NSVBTX1hYUzE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjCisjIFRyYXBlemUgSVRTIEdSUCBib2FyZAorIworcGxhdGZvcm0tJChDT05GSUdfTUlQU19HUFIpCSs9IGFsY2hlbXkvZ3ByLworbG9hZC0kKENPTkZJR19NSVBTX0dQUikJCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorCisjIGJvYXJkcyBjYW4gc3BlY2lmeSB0aGVpciBvd24gPGdwaW8uaD4gaW4gb25lIG9mIHRoZWlyIGluY2x1ZGUgZGlycy4KKyMgSWYgdGhleSBkbywgcGxhY2luZyB0aGlzIGxpbmUgaGVyZSBhdCB0aGUgZW5kIHdpbGwgbWFrZSBzdXJlIHRoZQorIyBjb21waWxlciBwaWNrcyB0aGUgYm9hcmQgb25lLiAgSWYgdGhleSBkb24ndCwgaXQgd2lsbCBtYWtlIHN1cmUKKyMgdGhlIGFsY2hlbXkgZ2VuZXJpYyBncGlvIGhlYWRlciBpcyBwaWNrZWQgdXAuCisKK2NmbGFncy0kKENPTkZJR19NSVBTX0FMQ0hFTVkpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZQppbmRleCAwNmMwZTY1Li4yNzgxMWZlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL01ha2VmaWxlCkBAIC0xOCw1ICsxOCwzIEBACiBlbmRpZgogCiBvYmotJChDT05GSUdfUENJKQkJKz0gcGNpLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9jbG9ja3MuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9jbG9ja3MuYwppbmRleCA0NjBjNjI4Li5hZjBmZTQxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vY2xvY2tzLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2Nsb2Nrcy5jCkBAIC04OSwxMSArODksNyBAQAogCSAqIG92ZXIgYmFja3dhcmRzIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jeS4KIAkgKi8KIAlpZiAoYXUxeHh4X2NwdV9oYXNfcGxsX3dvKCkpCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEwMDBfRlJFUVVFTkNZCi0JCWNwdV9zcGVlZCA9IENPTkZJR19TT0NfQVUxMDAwX0ZSRVFVRU5DWTsKLSNlbHNlCiAJCWNwdV9zcGVlZCA9IDM5NjAwMDAwMDsKLSNlbmRpZgogCWVsc2UKIAkJY3B1X3NwZWVkID0gKGF1X3JlYWRsKFNZU19DUFVQTEwpICYgMHgwMDAwMDAzZikgKiBBVTEwMDBfU1JDX0NMSzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcGxhdGZvcm0uYwppbmRleCBmOWU1NjIyLi4xZGM1NWVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcGxhdGZvcm0uYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMSw2ICsyMiw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTEwMF9tbWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2V0aC5oPgogCisjaW5jbHVkZSA8cHJvbS5oPgorCiAjZGVmaW5lIFBPUlQoX2Jhc2UsIF9pcnEpCQkJCQlcCiAJewkJCQkJCQlcCiAJCS5tYXBiYXNlCT0gX2Jhc2UsCQkJXApAQCAtMzMsNyArMzYsNiBAQAogCX0KIAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBhdTF4MDBfdWFydF9kYXRhW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTBfQVUxWDAwKQogI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCiAJUE9SVChVQVJUMF9QSFlTX0FERFIsIEFVMTAwMF9VQVJUMF9JTlQpLAogCVBPUlQoVUFSVDFfUEhZU19BRERSLCBBVTEwMDBfVUFSVDFfSU5UKSwKQEAgLTU0LDcgKzU2LDYgQEAKIAlQT1JUKFVBUlQwX1BIWVNfQUREUiwgQVUxMjAwX1VBUlQwX0lOVCksCiAJUE9SVChVQVJUMV9QSFlTX0FERFIsIEFVMTIwMF9VQVJUMV9JTlQpLAogI2VuZGlmCi0jZW5kaWYJLyogQ09ORklHX1NFUklBTF84MjUwX0FVMVgwMCAqLwogCXsgfSwKIH07CiAKQEAgLTQzNiwxNyArNDM3LDI3IEBACiB7CiAJdW5zaWduZWQgaW50IHVhcnRjbGsgPSBnZXRfYXUxeDAwX3VhcnRfYmF1ZF9iYXNlKCkgKiAxNjsKIAlpbnQgZXJyLCBpOworCXVuc2lnbmVkIGNoYXIgZXRoYWRkcls2XTsKIAogCS8qIEZpbGwgdXAgdWFydGNsay4gKi8KIAlmb3IgKGkgPSAwOyBhdTF4MDBfdWFydF9kYXRhW2ldLmZsYWdzOyBpKyspCiAJCWF1MXgwMF91YXJ0X2RhdGFbaV0udWFydGNsayA9IHVhcnRjbGs7CiAKKwkvKiB1c2UgZmlybXdhcmUtcHJvdmlkZWQgbWFjIGFkZHIgaWYgYXZhaWxhYmxlIGFuZCBuZWNlc3NhcnkgKi8KKwlpID0gcHJvbV9nZXRfZXRoZXJuZXRfYWRkcihldGhhZGRyKTsKKwlpZiAoIWkgJiYgIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYXUxeHh4X2V0aDBfcGxhdGZvcm1fZGF0YS5tYWMpKQorCQltZW1jcHkoYXUxeHh4X2V0aDBfcGxhdGZvcm1fZGF0YS5tYWMsIGV0aGFkZHIsIDYpOworCiAJZXJyID0gcGxhdGZvcm1fYWRkX2RldmljZXMoYXUxeHh4X3BsYXRmb3JtX2RldmljZXMsCiAJCQkJICAgQVJSQVlfU0laRShhdTF4eHhfcGxhdGZvcm1fZGV2aWNlcykpOwogI2lmbmRlZiBDT05GSUdfU09DX0FVMTEwMAorCWV0aGFkZHJbNV0gKz0gMTsJLyogbmV4dCBhZGRyIGZvciAybmQgTUFDICovCisJaWYgKCFpICYmICFpc192YWxpZF9ldGhlcl9hZGRyKGF1MXh4eF9ldGgxX3BsYXRmb3JtX2RhdGEubWFjKSkKKwkJbWVtY3B5KGF1MXh4eF9ldGgxX3BsYXRmb3JtX2RhdGEubWFjLCBldGhhZGRyLCA2KTsKKwogCS8qIFJlZ2lzdGVyIHNlY29uZCBNQUMgaWYgZW5hYmxlZCBpbiBwaW5mdW5jICovCiAJaWYgKCFlcnIgJiYgIShhdV9yZWFkbChTWVNfUElORlVOQykgJiAodTMyKVNZU19QRl9OSTIpKQotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF1MXh4eF9ldGgxX2RldmljZSk7CisJCWVyciA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXUxeHh4X2V0aDFfZGV2aWNlKTsKICNlbmRpZgogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZQppbmRleCBlY2JkMzdmLi44MjY0NDljIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL01ha2VmaWxlCkBAIC0xNiw1ICsxNiwzIEBACiBvYmotJChDT05GSUdfTUlQU19EQjE1NTApCSs9IGRiMXgwMC8KIG9iai0kKENPTkZJR19NSVBTX0JPU1BPUlVTKQkrPSBkYjF4MDAvCiBvYmotJChDT05GSUdfTUlQU19NSVJBR0UpCSs9IGRiMXgwMC8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvcGxhdGZvcm0uYwppbmRleCAzY2I5NWE5Li4zZmEzNGMzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIwMC9wbGF0Zm9ybS5jCkBAIC0yMTYsMTQgKzIxNiwxNCBAQAogCX0KIH07CiAKLXN0YXRpYyB1NjQgaWRlX2RtYW1hc2sgPSBETUFfMzJCSVRfTUFTSzsKK3N0YXRpYyB1NjQgaWRlX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfaWRlX2RldiA9IHsKIAkubmFtZQkJPSAiYXUxMjAwLWlkZSIsCiAJLmlkCQk9IDAsCiAJLmRldiA9IHsKIAkJLmRtYV9tYXNrIAkJPSAmaWRlX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV8zMkJJVF9NQVNLLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAogCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRiMTIwMF9pZGVfcmVzKSwKIAkucmVzb3VyY2UJPSBkYjEyMDBfaWRlX3JlcywKQEAgLTM4NSwxMiArMzg1LDEyIEBACiAJLmFjdGl2YXRlX2NzCT0gZGIxMjAwX3NwaV9jc19lbiwKIH07CiAKLXN0YXRpYyB1NjQgc3BpX2RtYW1hc2sgPSBETUFfMzJCSVRfTUFTSzsKK3N0YXRpYyB1NjQgc3BpX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfc3BpX2RldiA9IHsKIAkuZGV2CT0gewogCQkuZG1hX21hc2sJCT0gJnNwaV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfMzJCSVRfTUFTSywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKIAkJLnBsYXRmb3JtX2RhdGEJCT0gJmRiMTIwMF9zcGlfcGxhdGRhdGEsCiAJfSwKIAkubmFtZQkJPSAiYXUxNTUwLXNwaSIsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL2JvYXJkX3NldHVwLmMKaW5kZXggNTBjOWJlZi4uOWU0NTk3MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvYm9hcmRfc2V0dXAuYwpAQCAtNzksNyArNzksNiBAQAogCiBzdGF0aWMgdm9pZCBib3Nwb3J1c19wb3dlcl9vZmYodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJJdCdzIG5vdyBzYWZlIHRvIHR1cm4gb2ZmIHBvd2VyXG4iKTsKIAl3aGlsZSAoMSkKIAkJYXNtIHZvbGF0aWxlICgiLnNldCBtaXBzMyA7IHdhaXQgOyAuc2V0IG1pcHMwIik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMDAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMDAwL2JvYXJkX3NldHVwLmMKaW5kZXggNGVmNTBkOC4uZjY1NDBlYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTAwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEwMDAvYm9hcmRfc2V0dXAuYwpAQCAtNDcsOSArNDcsMTEgQEAKIAogc3RhdGljIHZvaWQgYm9hcmRfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgIkl0J3Mgbm93IHNhZmUgdG8gcmVtb3ZlIHBvd2VyXG4iKTsKIAl3aGlsZSAoMSkKLQkJYXNtIHZvbGF0aWxlICgiLnNldCBtaXBzMyA7IHdhaXQgOyAuc2V0IG1pcHMxIik7CisJCWFzbSB2b2xhdGlsZSAoCisJCSIJLnNldAltaXBzMzIJCQkJCVxuIgorCQkiCXdhaXQJCQkJCQlcbiIKKwkJIgkuc2V0CW1pcHMwCQkJCQlcbiIpOwogfQogCiB2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEyMDAvTWFrZWZpbGUKaW5kZXggMmVhOWIwMi4uMThjMWJkNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL01ha2VmaWxlCkBAIC0zLDUgKzMsMyBAQAogIwogCiBvYmoteSA6PSBib2FyZF9zZXR1cC5vIHBsYXRmb3JtLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2dwci9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjczZmUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyAgQ29weXJpZ2h0IDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisjICBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgorIworIyBNYWtlZmlsZSBmb3IgVHJhcGV6ZSBJVFMgR1BSIGJvYXJkLgorIworCitvYmoteSArPSBib2FyZF9zZXR1cC5vIGluaXQubyBwbGF0Zm9ybS5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9ncHIvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9ib2FyZF9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYWxjaGVteS9ncHIvYm9hcmRfc2V0dXAuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZGVueC5kZT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMC0yMDAzLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKworI2luY2x1ZGUgPHByb20uaD4KKworI2RlZmluZSBVQVJUMV9BRERSCUtTRUcxQUREUihVQVJUMV9QSFlTX0FERFIpCisjZGVmaW5lIFVBUlQzX0FERFIJS1NFRzFBRERSKFVBUlQzX1BIWVNfQUREUikKKworY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0geworCVswXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgQVUxNTAwX1BDSV9JTlRCLCAweGZmLCAweGZmIH0sCit9OworCitzdGF0aWMgdm9pZCBncHJfcmVzZXQoY2hhciAqYykKK3sKKwkvKiBzd2l0Y2ggU3lzdGVtLUxFRCB0byBvcmFuZ2UgKHJlZCMgYW5kIGdyZWVuIyBvbikgKi8KKwlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCg0LCAwKTsKKwlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCg1LCAwKTsKKworCS8qIHRyaWdnZXIgd2F0Y2hkb2cgdG8gcmVzZXQgYm9hcmQgaW4gMjAwbXMgKi8KKwlwcmludGsoS0VSTl9FTUVSRyAiVHJpZ2dlcmluZyB3YXRjaGRvZyBzb2Z0IHJlc2V0Li4uXG4iKTsKKwlyYXdfbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgxLCAwKTsKKwl1ZGVsYXkoMSk7CisJYWxjaGVteV9ncGlvX3NldF92YWx1ZSgxLCAxKTsKKwl3aGlsZSAoMSkKKwkJY3B1X3dhaXQoKTsKK30KKworc3RhdGljIHZvaWQgZ3ByX3Bvd2VyX29mZih2b2lkKQoreworCXdoaWxlICgxKQorCQljcHVfd2FpdCgpOworfQorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlRhcnBlemUgSVRTIEdQUiBib2FyZFxuIik7CisKKwlwbV9wb3dlcl9vZmYgPSBncHJfcG93ZXJfb2ZmOworCV9tYWNoaW5lX2hhbHQgPSBncHJfcG93ZXJfb2ZmOworCV9tYWNoaW5lX3Jlc3RhcnQgPSBncHJfcmVzZXQ7CisKKwkvKiBFbmFibGUgVUFSVDMgKi8KKwlhdV93cml0ZWwoMHgxLCBVQVJUM19BRERSICsgVUFSVF9NT0RfQ05UUkwpOy8qIGNsb2NrIGVuYWJsZSAoQ0UpICovCisJYXVfd3JpdGVsKDB4MywgVUFSVDNfQUREUiArIFVBUlRfTU9EX0NOVFJMKTsgLyogQ0UgYW5kICJlbmFibGUiICovCisJLyogRW5hYmxlIFVBUlQxICovCisJYXVfd3JpdGVsKDB4MSwgVUFSVDFfQUREUiArIFVBUlRfTU9EX0NOVFJMKTsgLyogY2xvY2sgZW5hYmxlIChDRSkgKi8KKwlhdV93cml0ZWwoMHgzLCBVQVJUMV9BRERSICsgVUFSVF9NT0RfQ05UUkwpOyAvKiBDRSBhbmQgImVuYWJsZSIgKi8KKworCS8qIFRha2UgYXdheSBSZXNldCBvZiBVTVRTLWNhcmQgKi8KKwlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgyMTUsIDEpOworCisjaWZkZWYgQ09ORklHX1BDSQorI2lmIGRlZmluZWQoX19NSVBTRUJfXykKKwlhdV93cml0ZWwoMHhmIHwgKDIgPDwgNikgfCAoMSA8PCA0KSwgQXUxNTAwX1BDSV9DRkcpOworI2Vsc2UKKwlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7CisjZW5kaWYKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0NGY0YzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2luaXQuYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZGVueC5kZT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMywgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisKKyNpbmNsdWRlIDxwcm9tLmg+CisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiAiR1BSIjsKK30KKwordm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciAqbWVtc2l6ZV9zdHI7CisJdW5zaWduZWQgbG9uZyBtZW1zaXplOworCisJcHJvbV9hcmdjID0gZndfYXJnMDsKKwlwcm9tX2FyZ3YgPSAoY2hhciAqKilmd19hcmcxOworCXByb21fZW52cCA9IChjaGFyICoqKWZ3X2FyZzI7CisKKwlwcm9tX2luaXRfY21kbGluZSgpOworCisJbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOworCWlmICghbWVtc2l6ZV9zdHIpCisJCW1lbXNpemUgPSAweDA0MDAwMDAwOworCWVsc2UKKwkJc3RyaWN0X3N0cnRvdWwobWVtc2l6ZV9zdHIsIDAsICZtZW1zaXplKTsKKwlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW1zaXplLCBCT09UX01FTV9SQU0pOworfQorCit2b2lkIHByb21fcHV0Y2hhcih1bnNpZ25lZCBjaGFyIGMpCit7CisJYWxjaGVteV91YXJ0X3B1dGNoYXIoVUFSVDBfUEhZU19BRERSLCBjKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2dwci9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiNDY2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogR1BSIGJvYXJkIHBsYXRmb3JtIGRldmljZSByZWdpc3RyYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKworLyoKKyAqIFdhdGNoZG9nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ3ByX3dkdF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMSwKKwkJLmVuZAk9IDEsCisJCS5uYW1lCT0gImdwci1hZG02MzIwLXdkdCIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGdwcl93ZHRfZGV2aWNlID0geworCS5uYW1lID0gImFkbTYzMjAtd2R0IiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShncHJfd2R0X3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBncHJfd2R0X3Jlc291cmNlLAorfTsKKworLyoKKyAqIEZMQVNICisgKgorICogMHgwMDAwMDAwMC0weDAwMjAwMDAwIDogImtlcm5lbCIKKyAqIDB4MDAyMDAwMDAtMHgwMGEwMDAwMCA6ICJyb290ZnMiCisgKiAweDAxZDAwMDAwLTB4MDFmMDAwMDAgOiAiY29uZmlnIgorICogMHgwMWMwMDAwMC0weDAxZDAwMDAwIDogInlhbW9uIgorICogMHgwMWQwMDAwMC0weDAxZDQwMDAwIDogInlhbW9uIGVudiB2YXJzIgorICogMHgwMDAwMDAwMC0weDAwYTAwMDAwIDogImtlcm5lbCtyb290ZnMiCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBncHJfbXRkX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCT0gImtlcm5lbCIsCisJCS5zaXplCT0gMHgwMDIwMDAwMCwKKwkJLm9mZnNldAk9IDAsCisJfSwKKwl7CisJCS5uYW1lCT0gInJvb3RmcyIsCisJCS5zaXplCT0gMHgwMDgwMDAwMCwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFLAorCX0sCisJeworCQkubmFtZQk9ICJjb25maWciLAorCQkuc2l6ZQk9IDB4MDAyMDAwMDAsCisJCS5vZmZzZXQJPSAweDAxZDAwMDAwLAorCX0sCisJeworCQkubmFtZQk9ICJ5YW1vbiIsCisJCS5zaXplCT0gMHgwMDEwMDAwMCwKKwkJLm9mZnNldAk9IDB4MDFjMDAwMDAsCisJfSwKKwl7CisJCS5uYW1lCT0gInlhbW9uIGVudiB2YXJzIiwKKwkJLnNpemUJPSAweDAwMDQwMDAwLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sCisJeworCQkubmFtZQk9ICJrZXJuZWwrcm9vdGZzIiwKKwkJLnNpemUJPSAweDAwYTAwMDAwLAorCQkub2Zmc2V0CT0gMCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZ3ByX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoCQk9IDQsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShncHJfbXRkX3BhcnRpdGlvbnMpLAorCS5wYXJ0cwkJPSBncHJfbXRkX3BhcnRpdGlvbnMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGdwcl9tdGRfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CT0gMHgxZTAwMDAwMCwKKwkuZW5kCT0gMHgxZmZmZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGdwcl9tdGRfZGV2aWNlID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZ3ByX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJmdwcl9tdGRfcmVzb3VyY2UsCit9OworCisvKgorICogTEVEcworICovCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGdwcl9ncGlvX2xlZHNbXSA9IHsKKwl7CS8qIGdyZWVuICovCisJCS5uYW1lCQkJPSAiZ3ByOmdyZWVuIiwKKwkJLmdwaW8JCQk9IDQsCisJCS5hY3RpdmVfbG93CQk9IDEsCisJfSwKKwl7CS8qIHJlZCAqLworCQkubmFtZQkJCT0gImdwcjpyZWQiLAorCQkuZ3BpbwkJCT0gNSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZ3ByX2xlZF9kYXRhID0geworCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUoZ3ByX2dwaW9fbGVkcyksCisJLmxlZHMgPSBncHJfZ3Bpb19sZWRzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ3ByX2xlZF9kZXZpY2VzID0geworCS5uYW1lID0gImxlZHMtZ3BpbyIsCisJLmlkID0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZ3ByX2xlZF9kYXRhLAorCX0KK307CisKKy8qCisgKiBJMkMKKyAqLworc3RhdGljIHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGdwcl9pMmNfZGF0YSA9IHsKKwkuc2RhX3BpbgkJPSAyMDksCisJLnNkYV9pc19vcGVuX2RyYWluCT0gMSwKKwkuc2NsX3BpbgkJPSAyMTAsCisJLnNjbF9pc19vcGVuX2RyYWluCT0gMSwKKwkudWRlbGF5CQkJPSAyLAkJLyogfjEwMCBrSHogKi8KKwkudGltZW91dAkJPSBIWiwKKyB9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBncHJfaTJjX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImkyYy1ncGlvIiwKKwkuaWQJCQk9IC0xLAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZncHJfaTJjX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGdwcl9pMmNfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygibG04MyIsIDB4MTgpLAorCQkudHlwZSA9ICJsbTgzIgorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpncHJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmdwcl93ZHRfZGV2aWNlLAorCSZncHJfbXRkX2RldmljZSwKKwkmZ3ByX2kyY19kZXZpY2UsCisJJmdwcl9sZWRfZGV2aWNlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdwcl9kZXZfaW5pdCh2b2lkKQoreworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGdwcl9pMmNfaW5mbywgQVJSQVlfU0laRShncHJfaTJjX2luZm8pKTsKKworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhncHJfZGV2aWNlcywgQVJSQVlfU0laRShncHJfZGV2aWNlcykpOworfQorZGV2aWNlX2luaXRjYWxsKGdwcl9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL01ha2VmaWxlCmluZGV4IDRhNTM4MTUuLjgxYjU0MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL01ha2VmaWxlCkBAIC02LDcgKzYsNCBAQAogIyBNYWtlZmlsZSBmb3IgNEcgU3lzdGVtcyBNVFgtMSBib2FyZC4KICMKIAotbGliLXkgOj0gaW5pdC5vIGJvYXJkX3NldHVwLm8KLW9iai15IDo9IHBsYXRmb3JtLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKK29iai15ICs9IGluaXQubyBib2FyZF9zZXR1cC5vIHBsYXRmb3JtLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCmluZGV4IDUyZDg4M2QuLjYzOThmYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvYm9hcmRfc2V0dXAuYwpAQCAtNjAsOSArNjAsMTEgQEAKIAogc3RhdGljIHZvaWQgbXR4MV9wb3dlcl9vZmYodm9pZCkKIHsKLQlwcmludGsoS0VSTl9BTEVSVCAiSXQncyBub3cgc2FmZSB0byByZW1vdmUgcG93ZXJcbiIpOwogCXdoaWxlICgxKQotCQlhc20gdm9sYXRpbGUgKCIuc2V0IG1pcHMzIDsgd2FpdCA7IC5zZXQgbWlwczEiKTsKKwkJYXNtIHZvbGF0aWxlICgKKwkJIgkuc2V0CW1pcHMzMgkJCQkJXG4iCisJCSIJd2FpdAkJCQkJCVxuIgorCQkiCS5zZXQJbWlwczAJCQkJCVxuIik7CiB9CiAKIHZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCkBAIC0xMDUsMTQgKzEwNywxMCBAQAogaW50CiBtdHgxX3BjaV9pZHNlbCh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KQogewotI2RlZmluZSBNVFhfSURTRUxfT05MWV8wX0FORF8zIDAKLSNpZiBNVFhfSURTRUxfT05MWV8wX0FORF8zCi0JaWYgKGRldnNlbCAhPSAwICYmIGRldnNlbCAhPSAzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiKioqIG5vdCAwIG9yIDNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKLQorCS8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSBuZWNlc3NhcnkgdG8gc3VwcG9ydCBhIHByb3ByaWV0YXJ5IENhcmRidXMKKwkgKiBhZGFwdGVyIG9uIHRoZSBtdHgtMSAic2luZ2xlYm9hcmQiIHZhcmlhbnQuIEl0IHRyaWdnZXJzIGEgY3VzdG9tCisJICogbG9naWMgY2hpcCBjb25uZWN0ZWQgdG8gRVhUX0lPMyAoR1BJTzEpIHRvIHN1cHByZXNzIElEU0VMIHNpZ25hbHMuCisJICovCiAJaWYgKGFzc2VydCAmJiBkZXZzZWwgIT0gMCkKIAkJLyogU3VwcHJlc3Mgc2lnbmFsIHRvIENhcmRidXMgKi8KIAkJYWxjaGVteV9ncGlvX3NldF92YWx1ZSgxLCAwKTsJLyogc2V0IEVYVF9JTzMgT0ZGICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9NYWtlZmlsZQppbmRleCA0ZGM4MWQ3Li45MWRlZmNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvTWFrZWZpbGUKQEAgLTUsNiArNSw0IEBACiAjIE1ha2VmaWxlIGZvciBNeUNhYmxlIFhYUzE1MDAgYm9hcmQuCiAjCiAKLWxpYi15IDo9IGluaXQubyBib2FyZF9zZXR1cC5vIHBsYXRmb3JtLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKK29iai15ICs9IGluaXQubyBib2FyZF9zZXR1cC5vIHBsYXRmb3JtLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYwppbmRleCA0N2I0MjkyLi5iNDNjOTE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9ib2FyZF9zZXR1cC5jCkBAIC00Miw5ICs0MiwxMSBAQAogCiBzdGF0aWMgdm9pZCB4eHMxNTAwX3Bvd2VyX29mZih2b2lkKQogewotCXByaW50ayhLRVJOX0FMRVJUICJJdCdzIG5vdyBzYWZlIHRvIHJlbW92ZSBwb3dlclxuIik7CiAJd2hpbGUgKDEpCi0JCWFzbSB2b2xhdGlsZSAoIi5zZXQgbWlwczMgOyB3YWl0IDsgLnNldCBtaXBzMSIpOworCQlhc20gdm9sYXRpbGUgKAorCQkiCS5zZXQJbWlwczMyCQkJCQlcbiIKKwkJIgl3YWl0CQkJCQkJXG4iCisJCSIJLnNldAltaXBzMAkJCQkJXG4iKTsKIH0KIAogdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hcjcvTWFrZWZpbGUgYi9hcmNoL21pcHMvYXI3L01ha2VmaWxlCmluZGV4IDI2YmM1ZGEuLjc0MzVlNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hcjcvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2FyNy9NYWtlZmlsZQpAQCAtOCw0ICs4LDMgQEAKIAlwbGF0Zm9ybS5vIFwKIAlncGlvLm8gXAogCWNsb2NrLm8KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXI3L1BsYXRmb3JtIGIvYXJjaC9taXBzL2FyNy9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY4NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FyNy9QbGF0Zm9ybQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgVGV4YXMgSW5zdHJ1bWVudHMgQVI3CisjCitwbGF0Zm9ybS0kKENPTkZJR19BUjcpICAgICAgICAgICs9IGFyNy8KK2NmbGFncy0kKENPTkZJR19BUjcpICAgICAgICAgICAgKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWFyNworbG9hZC0kKENPTkZJR19BUjcpICAgICAgICAgICAgICArPSAweGZmZmZmZmZmOTQxMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hcjcvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hcjcvcGxhdGZvcm0uYwppbmRleCA4ZjMxZDFkLi4wZGE1YjJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXI3L3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FyNy9wbGF0Zm9ybS5jCkBAIC0yOTIsNDAgKzI5MiwyOCBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjcG1hY19oaWdoX3JlcyksCiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgY2hhcjJoZXgoY2hhciBoKQorc3RhdGljIHZvaWQgX19pbml0IGNwbWFjX2dldF9tYWMoaW50IGluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKIHsKLQlzd2l0Y2ggKGgpIHsKLQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQlyZXR1cm4gaCAtICcwJzsKLQljYXNlICdBJzogY2FzZSAnQic6IGNhc2UgJ0MnOiBjYXNlICdEJzogY2FzZSAnRSc6IGNhc2UgJ0YnOgotCQlyZXR1cm4gaCAtICdBJyArIDEwOwotCWNhc2UgJ2EnOiBjYXNlICdiJzogY2FzZSAnYyc6IGNhc2UgJ2QnOiBjYXNlICdlJzogY2FzZSAnZic6Ci0JCXJldHVybiBoIC0gJ2EnICsgMTA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQorCWNoYXIgbmFtZVs1XSwgKm1hYzsKIAotc3RhdGljIHZvaWQgY3BtYWNfZ2V0X21hYyhpbnQgaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQotewotCWludCBpOwotCWNoYXIgbmFtZVs1XSwgZGVmYXVsdF9tYWNbRVRIX0FMRU5dLCAqbWFjOwotCi0JbWFjID0gTlVMTDsKIAlzcHJpbnRmKG5hbWUsICJtYWMlYyIsICdhJyArIGluc3RhbmNlKTsKIAltYWMgPSBwcm9tX2dldGVudihuYW1lKTsKLQlpZiAoIW1hYykgeworCWlmICghbWFjICYmIGluc3RhbmNlKSB7CiAJCXNwcmludGYobmFtZSwgIm1hYyVjIiwgJ2EnKTsKIAkJbWFjID0gcHJvbV9nZXRlbnYobmFtZSk7CiAJfQotCWlmICghbWFjKSB7Ci0JCXJhbmRvbV9ldGhlcl9hZGRyKGRlZmF1bHRfbWFjKTsKLQkJbWFjID0gZGVmYXVsdF9tYWM7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCWRldl9hZGRyW2ldID0gKGNoYXIyaGV4KG1hY1tpICogM10pIDw8IDQpICsKLQkJCWNoYXIyaGV4KG1hY1tpICogMyArIDFdKTsKKworCWlmIChtYWMpIHsKKwkJaWYgKHNzY2FuZihtYWMsICIlaGh4OiVoaHg6JWhoeDolaGh4OiVoaHg6JWhoeCIsCisJCQkJCSZkZXZfYWRkclswXSwgJmRldl9hZGRyWzFdLAorCQkJCQkmZGV2X2FkZHJbMl0sICZkZXZfYWRkclszXSwKKwkJCQkJJmRldl9hZGRyWzRdLCAmZGV2X2FkZHJbNV0pICE9IDYpIHsKKwkJCXByX3dhcm5pbmcoImNhbm5vdCBwYXJzZSBtYWMgYWRkcmVzcywgIgorCQkJCQkidXNpbmcgcmFuZG9tIGFkZHJlc3NcbiIpOworCQkJcmFuZG9tX2V0aGVyX2FkZHIoZGV2X2FkZHIpOworCQl9CisJfSBlbHNlCisJCXJhbmRvbV9ldGhlcl9hZGRyKGRldl9hZGRyKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9iY200N3h4L1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGI3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYmNtNDd4eC9QbGF0Zm9ybQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgQnJvYWRjb20gQkNNNDdYWCBib2FyZHMKKyMKK3BsYXRmb3JtLSQoQ09ORklHX0JDTTQ3WFgpCSs9IGJjbTQ3eHgvCitjZmxhZ3MtJChDT05GSUdfQkNNNDdYWCkJKz0JCQkJCVwKKwkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgKK2xvYWQtJChDT05GSUdfQkNNNDdYWCkJCTo9IDB4ZmZmZmZmZmY4MDAwMTAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYyBiL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMKaW5kZXggMDZlMDNiMi4uZTViNjYxNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9udnJhbS5jCkBAIC02OSw3ICs2OSw3IEBACiAJY2hhciAqdmFyLCAqdmFsdWUsICplbmQsICplcTsKIAogCWlmICghbmFtZSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiBOVlJBTV9FUlJfSU5WX1BBUkFNOwogCiAJaWYgKCFudnJhbV9idWZbMF0pCiAJCWVhcmx5X252cmFtX2luaXQoKTsKQEAgLTg5LDYgKzg5LDYgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCXJldHVybiAxOworCXJldHVybiBOVlJBTV9FUlJfRU5WTk9URk9VTkQ7CiB9CiBFWFBPUlRfU1lNQk9MKG52cmFtX2dldGVudik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9wcm9tLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9wcm9tLmMKaW5kZXggMGZhNjQ2Yy4uZjZlOTA2MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3Byb20uYwpAQCAtMTI2LDYgKzEyNiw3IEBACiBzdGF0aWMgX19pbml0IHZvaWQgcHJvbV9pbml0X21lbSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbWVtOworCXVuc2lnbmVkIGxvbmcgbWF4OwogCiAJLyogRmlndXJlIG91dCBtZW1vcnkgc2l6ZSBieSBmaW5kaW5nIGFsaWFzZXMuCiAJICoKQEAgLTEzNCwyMSArMTM1LDI2IEBACiAJICogd2FudCB0byByZXVzZSB0aGUgbWVtb3J5IHVzZWQgYnkgQ0ZFIChhcm91bmQgNE1CKS4gVGhhdCBtZWFucyBjZmVfKgogCSAqIGZ1bmN0aW9ucyBzdG9wIHRvIHdvcmsgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGJvb3QsIHdlIHNob3VsZCBvbmx5CiAJICogY2FsbCB0aGVtIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJvb3QuCisJICoKKwkgKiBCQ000N1hYIHVzZXMgMTI4TUIgZm9yIGFkZHJlc3NpbmcgdGhlIHJhbSwgaWYgdGhlIHN5c3RlbSBjb250YWlucworCSAqIGxlc3MgdGhhdCB0aGF0IGFtb3VudCBvZiByYW0gaXQgcmVtYXBzIHRoZSByYW0gbW9yZSBvZnRlbiBpbnRvIHRoZQorCSAqIGF2YWlsYWJsZSBzcGFjZS4KKwkgKiBBY2Nlc3NpbmcgbWVtb3J5IGFmdGVyIDEyOE1CIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uLgorCSAqIG1heCBjb250YWlucyB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBhZGRyZXNzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uCisJICogSWYgdGhlIG1ldGhvZCB3YW50cyB0byB0cnkgc29tZXRoaW5nIGFib3ZlIHdlIGFzc3VtZSAxMjhNQiByYW0uCiAJICovCisJbWF4ID0gKCh1bnNpZ25lZCBsb25nKShwcm9tX2luaXQpIHwgKCgxMjggPDwgMjApIC0gMSkpOwogCWZvciAobWVtID0gKDEgPDwgMjApOyBtZW0gPCAoMTI4IDw8IDIwKTsgbWVtICs9ICgxIDw8IDIwKSkgeworCQlpZiAoKCh1bnNpZ25lZCBsb25nKShwcm9tX2luaXQpICsgbWVtKSA+IG1heCkgeworCQkJbWVtID0gKDEyOCA8PCAyMCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYXNzdW1lIDEyOE1CIFJBTVxuIik7CisJCQlicmVhazsKKwkJfQogCQlpZiAoKih1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKShwcm9tX2luaXQpICsgbWVtKSA9PQogCQkgICAgKih1bnNpZ25lZCBsb25nICopKHByb21faW5pdCkpCiAJCQlicmVhazsKIAl9CiAKLQkvKiBJZ25vcmluZyB0aGUgbGFzdCBwYWdlIHdoZW4gZGRyIHNpemUgaXMgMTI4TS4gQ2FjaGVkCi0JICogYWNjZXNzZXMgdG8gbGFzdCBwYWdlIGlzIGNhdXNpbmcgdGhlIHByb2Nlc3NvciB0byBwcmVmZXRjaAotCSAqIHVzaW5nIGFkZHJlc3MgYWJvdmUgMTI4TSBzdGVwcGluZyBvdXQgb2YgdGhlIGRkciBhZGRyZXNzCi0JICogc3BhY2UuCi0JICovCi0JaWYgKG1lbSA9PSAweDgwMDAwMDApCi0JCW1lbSAtPSAweDEwMDA7Ci0KIAlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW0sIEJPT1RfTUVNX1JBTSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L01ha2VmaWxlIGIvYXJjaC9taXBzL2JjbTYzeHgvTWFrZWZpbGUKaW5kZXggMDAwNjRiNi4uNmRmZGM2OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTYzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2JjbTYzeHgvTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogCiBvYmoteQkJKz0gYm9hcmRzLwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvUGxhdGZvcm0gYi9hcmNoL21pcHMvYmNtNjN4eC9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjg2YjJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2JjbTYzeHgvUGxhdGZvcm0KQEAgLTAsMCArMSw3IEBACisjCisjIEJyb2FkY29tIEJDTTYzWFggYm9hcmRzCisjCitwbGF0Zm9ybS0kKENPTkZJR19CQ002M1hYKQkrPSBiY202M3h4LworY2ZsYWdzLSQoQ09ORklHX0JDTTYzWFgpCSs9CQkJCQlcCisJCS1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4LworbG9hZC0kKENPTkZJR19CQ002M1hYKQkJOj0gMHhmZmZmZmZmZjgwMDEwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYm9vdC8uZ2l0aWdub3JlIGIvYXJjaC9taXBzL2Jvb3QvLmdpdGlnbm9yZQppbmRleCA0NjY3YTVmLi5mMjEwYjA5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYm9vdC8uZ2l0aWdub3JlCisrKyBiL2FyY2gvbWlwcy9ib290Ly5naXRpZ25vcmUKQEAgLTMsMyArMyw0IEBACiB2bWxpbnV4LioKIHpJbWFnZQogekltYWdlLnRtcAorY2FsY192bWxpbnV6X2xvYWRfYWRkcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL21pcHMvYm9vdC9NYWtlZmlsZQppbmRleCBlMzlhMDhlLi44NWJjYjVhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYm9vdC9NYWtlZmlsZQpAQCAtMTEsMzUgKzExLDMyIEBACiAjIFNvbWUgREVDc3RhdGlvbnMgbmVlZCBhbGwgcG9zc2libGUgc2VjdGlvbnMgb2YgYW4gRUNPRkYgZXhlY3V0YWJsZQogIwogaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgotICBFMkVGTEFHUyA9IC1hCi1lbHNlCi0gIEUyRUZMQUdTID0KKyAgZTJlZmxhZyA6PSAtYQogZW5kaWYKIAogIwogIyBEcm9wIHNvbWUgdW5pbnRlcmVzdGluZyBzZWN0aW9ucyBpbiB0aGUga2VybmVsLgogIyBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIEVMRiBrZXJuZWxzIGJ1dCBkb2Vzbid0IGh1cnQgYS5vdXQKICMKLWRyb3Atc2VjdGlvbnMJPSAucmVnaW5mbyAubWRlYnVnIC5jb21tZW50IC5ub3RlIC5wZHIgLm9wdGlvbnMgLk1JUFMub3B0aW9ucwotc3RyaXAtZmxhZ3MJPSAkKGFkZHByZWZpeCAtLXJlbW92ZS1zZWN0aW9uPSwkKGRyb3Atc2VjdGlvbnMpKQorZHJvcC1zZWN0aW9ucyA6PSAucmVnaW5mbyAubWRlYnVnIC5jb21tZW50IC5ub3RlIC5wZHIgLm9wdGlvbnMgLk1JUFMub3B0aW9ucworc3RyaXAtZmxhZ3MgICA6PSAkKGFkZHByZWZpeCAtLXJlbW92ZS1zZWN0aW9uPSwkKGRyb3Atc2VjdGlvbnMpKQogCi1WTUxJTlVYID0gdm1saW51eAoraG9zdHByb2dzLXkgOj0gZWxmMmVjb2ZmCiAKLWFsbDogdm1saW51eC5lY29mZiB2bWxpbnV4LnNyZWMKK3RhcmdldHMgOj0gdm1saW51eC5lY29mZgorcXVpZXRfY21kX2Vjb2ZmID0gRUNPRkYgICAkQAorICAgICAgY21kX2Vjb2ZmID0gJChvYmopL2VsZjJlY29mZiAkKFZNTElOVVgpICRAICQoZTJlZmxhZykKKyQob2JqKS92bWxpbnV4LmVjb2ZmOiAkKG9iaikvZWxmMmVjb2ZmICQoVk1MSU5VWCkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxlY29mZikKIAotdm1saW51eC5lY29mZjogJChvYmopL2VsZjJlY29mZiAkKFZNTElOVVgpCi0JJChvYmopL2VsZjJlY29mZiAkKFZNTElOVVgpICQob2JqKS92bWxpbnV4LmVjb2ZmICQoRTJFRkxBR1MpCit0YXJnZXRzICs9IHZtbGludXguYmluCitxdWlldF9jbWRfYmluID0gT0JKQ09QWSAkQAorICAgICAgY21kX2JpbiA9ICQoT0JKQ09QWSkgLU8gYmluYXJ5ICQoc3RyaXAtZmxhZ3MpICQoVk1MSU5VWCkgJEAKKyQob2JqKS92bWxpbnV4LmJpbjogJChWTUxJTlVYKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGJpbikKIAotJChvYmopL2VsZjJlY29mZjogJChvYmopL2VsZjJlY29mZi5jCi0JJChIT1NUQ0MpIC1vICRAICReCi0KLXZtbGludXguYmluOiAkKFZNTElOVVgpCi0JJChPQkpDT1BZKSAtTyBiaW5hcnkgJChzdHJpcC1mbGFncykgJChWTUxJTlVYKSAkKG9iaikvdm1saW51eC5iaW4KLQotdm1saW51eC5zcmVjOiAkKFZNTElOVVgpCi0JJChPQkpDT1BZKSAtUyAtTyBzcmVjICQoc3RyaXAtZmxhZ3MpICQoVk1MSU5VWCkgJChvYmopL3ZtbGludXguc3JlYwotCi1jbGVhbi1maWxlcyArPSBlbGYyZWNvZmYgXAotCSAgICAgICB2bWxpbnV4LmJpbiBcCi0JICAgICAgIHZtbGludXguZWNvZmYgXAotCSAgICAgICB2bWxpbnV4LnNyZWMKK3RhcmdldHMgKz0gdm1saW51eC5zcmVjCitxdWlldF9jbWRfc3JlYyA9IE9CSkNPUFkgJEAKKyAgICAgIGNtZF9zcmVjID0gJChPQkpDT1BZKSAtUyAtTyBzcmVjICQoc3RyaXAtZmxhZ3MpICQoVk1MSU5VWCkgJEAKKyQob2JqKS92bWxpbnV4LnNyZWM6ICQoVk1MSU5VWCkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxzcmVjKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNzkwZGRkMy4uZWQ5YmI3MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xMiwxNCArMTIsNiBAQAogIyBBdXRob3I6IFd1IFpoYW5namluIDx3dXpoYW5namluQGdtYWlsLmNvbT4KICMKIAotIyBjb21wcmVzc2VkIGtlcm5lbCBsb2FkIGFkZHI6IFZNTElOVVpfTE9BRF9BRERSRVNTID4gVk1MSU5VWF9MT0FEX0FERFJFU1MgKyBWTUxJTlVYX1NJWkUKLVZNTElOVVhfU0laRSA6PSAkKHNoZWxsIHdjIC1jICQob2JqdHJlZSkvJChLQlVJTERfSU1BR0UpIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMSkKLVZNTElOVVhfU0laRSA6PSAkKHNoZWxsIFsgLW4gIiQoVk1MSU5VWF9TSVpFKSIgXSAmJiBlY2hvIC1uICQkKCgkKFZNTElOVVhfU0laRSkgKyAoNjU1MzYgLSAkKFZNTElOVVhfU0laRSkgJSA2NTUzNikpKSkKLSMgVk1MSU5VWl9MT0FEX0FERFJFU1MgPSBjb25jYXQgImhpZ2gzMiBvZiBWTUxJTlVYX0xPQURfQUREUkVTUyIgYW5kICIobG93MzIgb2YgVk1MSU5VWF9MT0FEX0FERFJFU1MpICsgVk1MSU5VWF9TSVpFIgotSElHSDMyIDo9ICQoc2hlbGwgQT0kKFZNTElOVVhfTE9BRF9BRERSRVNTKTsgWyAkJHtcI0F9IC1ndCAxMCBdICYmIGV4cHIgc3Vic3RyICIkKFZNTElOVVhfTE9BRF9BRERSRVNTKSIgMyAkJCgoJCR7XCNBfSAtIDEwKSkpCi1MT1czMiA6PSAkKHNoZWxsIFsgLW4gIiQoSElHSDMyKSIgXSAmJiBBPTExIHx8IEE9MzsgZXhwciBzdWJzdHIgIiQoVk1MSU5VWF9MT0FEX0FERFJFU1MpIiAkJHtBfSA4KQotVk1MSU5VWl9MT0FEX0FERFJFU1MgOj0gMHgkKHNoZWxsIFsgLW4gIiQoVk1MSU5VWF9TSVpFKSIgLWEgLW4gIiQoTE9XMzIpIiBdICYmIHByaW50ZiAiJChISUdIMzIpJTA4eCIgJCQoKCQoVk1MSU5VWF9TSVpFKSArIDB4JChMT1czMikpKSkKLQogIyBzZXQgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgbWFsbG9jaW5nIGFyZWEgZm9yIGRlY29tcHJlc3NpbmcKIEJPT1RfSEVBUF9TSVpFIDo9IDB4NDAwMDAwCiAKQEAgLTMzLDQ5ICsyNSw2MSBAQAogCS1EQk9PVF9IRUFQX1NJWkU9JChCT09UX0hFQVBfU0laRSkgXAogCS1ES0VSTkVMX0VOVFJZPTB4JChzaGVsbCAkKE5NKSAkKG9ianRyZWUpLyQoS0JVSUxEX0lNQUdFKSAyPi9kZXYvbnVsbCB8IGdyZXAgIiBrZXJuZWxfZW50cnkiIHwgY3V0IC1mMSAtZCBcICkKIAotb2JqLXkgOj0gJChvYmopL2hlYWQubyAkKG9iaikvZGVjb21wcmVzcy5vICQob2JqKS9kYmcubwordGFyZ2V0cyA6PSBoZWFkLm8gZGVjb21wcmVzcy5vIGRiZy5vIHVhcnQtMTY1NTAubyB1YXJ0LWFsY2hlbXkubworCisjIGRlY29tcHJlc3NvciBvYmplY3RzIChsaW5rZWQgd2l0aCB2bWxpbnV6KQordm1saW51em9ianMteSA6PSAkKG9iaikvaGVhZC5vICQob2JqKS9kZWNvbXByZXNzLm8gJChvYmopL2RiZy5vCiAKIGlmZGVmIENPTkZJR19ERUJVR19aQk9PVAotb2JqLSQoQ09ORklHX1NZU19TVVBQT1JUU19aQk9PVF9VQVJUMTY1NTApICs9ICQob2JqKS91YXJ0LTE2NTUwLm8KLW9iai0kKENPTkZJR19NQUNIX0FMQ0hFTVkpCQkgICArPSAkKG9iaikvdWFydC1hbGNoZW15Lm8KK3ZtbGludXpvYmpzLSQoQ09ORklHX1NZU19TVVBQT1JUU19aQk9PVF9VQVJUMTY1NTApICs9ICQob2JqKS91YXJ0LTE2NTUwLm8KK3ZtbGludXpvYmpzLSQoQ09ORklHX01JUFNfQUxDSEVNWSkJCSAgICs9ICQob2JqKS91YXJ0LWFsY2hlbXkubwogZW5kaWYKIAordGFyZ2V0cyArPSB2bWxpbnV4LmJpbgogT0JKQ09QWUZMQUdTX3ZtbGludXguYmluIDo9ICQoT0JKQ09QWUZMQUdTKSAtTyBiaW5hcnkgLVIgLmNvbW1lbnQgLVMKLSQob2JqKS92bWxpbnV4LmJpbjogJChLQlVJTERfSU1BR0UpCiskKG9iaikvdm1saW51eC5iaW46ICQoS0JVSUxEX0lNQUdFKSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCiAKLXN1ZmZpeF8kKENPTkZJR19LRVJORUxfR1pJUCkgID0gZ3oKLXN1ZmZpeF8kKENPTkZJR19LRVJORUxfQlpJUDIpID0gYnoyCi1zdWZmaXhfJChDT05GSUdfS0VSTkVMX0xaTUEpICA9IGx6bWEKLXN1ZmZpeF8kKENPTkZJR19LRVJORUxfTFpPKSAgID0gbHpvCiB0b29sXyQoQ09ORklHX0tFUk5FTF9HWklQKSAgICA9IGd6aXAKIHRvb2xfJChDT05GSUdfS0VSTkVMX0JaSVAyKSAgID0gYnppcDIKIHRvb2xfJChDT05GSUdfS0VSTkVMX0xaTUEpICAgID0gbHptYQogdG9vbF8kKENPTkZJR19LRVJORUxfTFpPKSAgICAgPSBsem8KLSQob2JqKS92bWxpbnV4LiQoc3VmZml4X3kpOiAkKG9iaikvdm1saW51eC5iaW4KKwordGFyZ2V0cyArPSB2bWxpbnV4LmJpbi56CiskKG9iaikvdm1saW51eC5iaW4uejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsJCh0b29sX3kpKQogCi0kKG9iaikvcGlnZ3kubzogJChvYmopL3ZtbGludXguJChzdWZmaXhfeSkgJChvYmopL2R1bW15Lm8KLQkkKFEpJChPQkpDT1BZKSAkKE9CSkNPUFlGTEFHUykgXAotCQktLWFkZC1zZWN0aW9uPS5pbWFnZT0kPCBcCi0JCS0tc2V0LXNlY3Rpb24tZmxhZ3M9LmltYWdlPWNvbnRlbnRzLGFsbG9jLGxvYWQscmVhZG9ubHksZGF0YSBcCi0JCSQob2JqKS9kdW1teS5vICRACit0YXJnZXRzICs9IHBpZ2d5Lm8KK09CSkNPUFlGTEFHU19waWdneS5vIDo9IC0tYWRkLXNlY3Rpb249LmltYWdlPSQob2JqKS92bWxpbnV4LmJpbi56IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tc2V0LXNlY3Rpb24tZmxhZ3M9LmltYWdlPWNvbnRlbnRzLGFsbG9jLGxvYWQscmVhZG9ubHksZGF0YQorJChvYmopL3BpZ2d5Lm86ICQob2JqKS9kdW1teS5vICQob2JqKS92bWxpbnV4LmJpbi56IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKIAotTERGTEFHU192bWxpbnV6IDo9ICQoTERGTEFHUykgLVR0ZXh0ICQoVk1MSU5VWl9MT0FEX0FERFJFU1MpIC1UCi12bWxpbnV6OiAkKHNyYykvbGQuc2NyaXB0ICQob2JqLXkpICQob2JqKS9waWdneS5vCi0JJChjYWxsIGlmX2NoYW5nZWQsbGQpCi0JJChRKSQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICRACisjIENhbGN1bGF0ZSB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBjb21wcmVzc2VkIGtlcm5lbCBpbWFnZQoraG9zdHByb2dzLXkgOj0gY2FsY192bWxpbnV6X2xvYWRfYWRkcgorCitWTUxJTlVaX0xPQURfQUREUkVTUyA9ICQoc2hlbGwgJChvYmopL2NhbGNfdm1saW51el9sb2FkX2FkZHIgXAorCQkkKG9ianRyZWUpLyQoS0JVSUxEX0lNQUdFKSAkKFZNTElOVVhfTE9BRF9BRERSRVNTKSkKKwordm1saW51em9ianMteSArPSAkKG9iaikvcGlnZ3kubworCitxdWlldF9jbWRfemxkID0gTEQgICAgICAkQAorICAgICAgY21kX3psZCA9ICQoTEQpICQoTERGTEFHUykgLVR0ZXh0ICQoVk1MSU5VWl9MT0FEX0FERFJFU1MpIC1UICQ8ICQodm1saW51em9ianMteSkgLW8gJEAKK3F1aWV0X2NtZF9zdHJpcCA9IFNUUklQICAgJEAKKyAgICAgIGNtZF9zdHJpcCA9ICQoU1RSSVApIC1zICRACit2bWxpbnV6OiAkKHNyYykvbGQuc2NyaXB0ICQodm1saW51em9ianMteSkgJChvYmopL2NhbGNfdm1saW51el9sb2FkX2FkZHIKKwkkKGNhbGwgY21kLHpsZCkKKwkkKGNhbGwgY21kLHN0cmlwKQogCiAjCiAjIFNvbWUgREVDc3RhdGlvbnMgbmVlZCBhbGwgcG9zc2libGUgc2VjdGlvbnMgb2YgYW4gRUNPRkYgZXhlY3V0YWJsZQogIwogaWZkZWYgQ09ORklHX01BQ0hfREVDU1RBVElPTgotICBFMkVGTEFHUyA9IC1hCi1lbHNlCi0gIEUyRUZMQUdTID0KKyAgZTJlZmxhZyA6PSAtYQogZW5kaWYKIAogIyBlbGYyZWNvZmYgY2FuIG9ubHkgaGFuZGxlIDMyYml0IGltYWdlCitob3N0cHJvZ3MteSArPSAuLi9lbGYyZWNvZmYKIAogaWZkZWYgQ09ORklHXzMyQklUCiAJVk1MSU5VWiA9IHZtbGludXoKQEAgLTgzLDIzICs4NywyMiBAQAogCVZNTElOVVogPSB2bWxpbnV6LjMyCiBlbmRpZgogCitxdWlldF9jbWRfMzIgPSBPQkpDT1BZICRACisgICAgICBjbWRfMzIgPSAkKE9CSkNPUFkpIC1PICQoMzJiaXQtYmZkKSAkKE9CSkNPUFlGTEFHUykgJDwgJEAKIHZtbGludXouMzI6IHZtbGludXoKLQkkKFEpJChPQkpDT1BZKSAtTyAkKDMyYml0LWJmZCkgJChPQkpDT1BZRkxBR1MpICQ8ICRACisJJChjYWxsIGNtZCwzMikKIAorcXVpZXRfY21kX2Vjb2ZmID0gRUNPRkYgICAkQAorICAgICAgY21kX2Vjb2ZmID0gJDwgJChWTUxJTlVaKSAkQCAkKGUyZWZsYWcpCiB2bWxpbnV6LmVjb2ZmOiAkKG9iaikvLi4vZWxmMmVjb2ZmICQoVk1MSU5VWikKLQkkKFEpJChvYmopLy4uL2VsZjJlY29mZiAkKFZNTElOVVopIHZtbGludXouZWNvZmYgJChFMkVGTEFHUykKLQotJChvYmopLy4uL2VsZjJlY29mZjogJChzcmMpLy4uL2VsZjJlY29mZi5jCi0JJChRKSQoSE9TVENDKSAtbyAkQCAkXgorCSQoY2FsbCBjbWQsZWNvZmYpCiAKIE9CSkNPUFlGTEFHU192bWxpbnV6LmJpbiA6PSAkKE9CSkNPUFlGTEFHUykgLU8gYmluYXJ5CiB2bWxpbnV6LmJpbjogdm1saW51egotCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisJJChjYWxsIGNtZCxvYmpjb3B5KQogCiBPQkpDT1BZRkxBR1Nfdm1saW51ei5zcmVjIDo9ICQoT0JKQ09QWUZMQUdTKSAtUyAtTyBzcmVjCiB2bWxpbnV6LnNyZWM6IHZtbGludXoKLQkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCSQoY2FsbCBjbWQsb2JqY29weSkKIAotY2xlYW46Ci1jbGVhbi1maWxlcyArPSAqLm8gXAotCSAgICAgICB2bWxpbnUqCitjbGVhbi1maWxlcyA6PSAkKG9ianRyZWUpL3ZtbGludXouKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9jYWxjX3ZtbGludXpfbG9hZF9hZGRyLmMgYi9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2NhbGNfdm1saW51el9sb2FkX2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGM5ZDk2MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvY2FsY192bWxpbnV6X2xvYWRfYWRkci5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgIld1IFpoYW5namluIiA8d3V6aGFuZ2ppbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHN0YXQgc2I7CisJdWludDY0X3Qgdm1saW51eF9zaXplLCB2bWxpbnV4X2xvYWRfYWRkciwgdm1saW51el9sb2FkX2FkZHI7CisKKwlpZiAoYXJnYyAhPSAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxwYXRobmFtZT4gPHZtbGludXhfbG9hZF9hZGRyPlxuIiwKKwkJCQlhcmd2WzBdKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwlpZiAoc3RhdChhcmd2WzFdLCAmc2IpID09IC0xKSB7CisJCXBlcnJvcigic3RhdCIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIENvbnZlcnQgaGV4IGNoYXJhY3RlcnMgdG8gZGVjIG51bWJlciAqLworCWVycm5vID0gMDsKKwlpZiAoc3NjYW5mKGFyZ3ZbMl0sICIlbGx4IiwgJnZtbGludXhfbG9hZF9hZGRyKSAhPSAxKSB7CisJCWlmIChlcnJubyAhPSAwKQorCQkJcGVycm9yKCJzc2NhbmYiKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJObyBtYXRjaGluZyBjaGFyYWN0ZXJzXG4iKTsKKworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCXZtbGludXhfc2l6ZSA9ICh1aW50NjRfdClzYi5zdF9zaXplOworCXZtbGludXpfbG9hZF9hZGRyID0gdm1saW51eF9sb2FkX2FkZHIgKyB2bWxpbnV4X3NpemU7CisKKwkvKgorCSAqIEFsaWduIHdpdGggMTYgYnl0ZXM6ICJncmVhdGVyIHRoYW4gdGhhdCB1c2VkIGZvciBhbnkgc3RhbmRhcmQgZGF0YQorCSAqIHR5cGVzIGJ5IGEgTUlQUyBjb21waWxlci4iIC0tIFNlZSBNSVBTIFJ1biBMaW51eCAoU2Vjb25kIEVkaXRpb24pLgorCSAqLworCisJdm1saW51el9sb2FkX2FkZHIgKz0gKDE2IC0gdm1saW51eF9zaXplICUgMTYpOworCisJcHJpbnRmKCIweCVsbHhcbiIsIHZtbGludXpfbG9hZF9hZGRyKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2RlY29tcHJlc3MuYyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvZGVjb21wcmVzcy5jCmluZGV4IDVkYjQzYzUuLjVjYWQwZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvZGVjb21wcmVzcy5jCisrKyBiL2FyY2gvbWlwcy9ib290L2NvbXByZXNzZWQvZGVjb21wcmVzcy5jCkBAIC0xLDkgKzEsNiBAQAogLyoKLSAqIE1pc2MuIGJvb3Rsb2FkZXIgY29kZSBmb3IgbWFueSBtYWNoaW5lcy4KLSAqCiAgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAbXZpc3RhLmNvbT4gRGVyaXZlZCBmcm9tCi0gKiBhcmNoL3BwYy9ib290L3ByZXAvbWlzYy5jCisgKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgogICogQXV0aG9yOiBXdSBaaGFuZ2ppbiA8d3V6aGFuZ2ppbkBnbWFpbC5jb20+CkBAIC0xOSwxMiArMTYsMTIgQEAKIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAotLyogVGhlc2UgdHdvIHZhcmlhYmxlcyBzcGVjaWZ5IHRoZSBmcmVlIG1lbSByZWdpb24KKy8qCisgKiBUaGVzZSB0d28gdmFyaWFibGVzIHNwZWNpZnkgdGhlIGZyZWUgbWVtIHJlZ2lvbgogICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGVtcG9yYXJ5IG1hbGxvYyBhcmVhCiAgKi8KIHVuc2lnbmVkIGxvbmcgZnJlZV9tZW1fcHRyOwogdW5zaWduZWQgbG9uZyBmcmVlX21lbV9lbmRfcHRyOwotY2hhciAqemltYWdlX3N0YXJ0OwogCiAvKiBUaGUgbGlua2VyIHRlbGxzIHVzIHdoZXJlIHRoZSBpbWFnZSBpcy4gKi8KIGV4dGVybiB1bnNpZ25lZCBjaGFyIF9faW1hZ2VfYmVnaW4sIF9faW1hZ2VfZW5kOwpAQCAtODMsMzggKzgwLDMxIEBACiAKIHZvaWQgZGVjb21wcmVzc19rZXJuZWwodW5zaWduZWQgbG9uZyBib290X2hlYXBfc3RhcnQpCiB7Ci0JaW50IHppbWFnZV9zaXplOworCXVuc2lnbmVkIGxvbmcgemltYWdlX3N0YXJ0LCB6aW1hZ2Vfc2l6ZTsKIAotCS8qCi0JICogV2UgbGluayBvdXJzZWxmIHRvIGFuIGFyYml0cmFyeSBsb3cgYWRkcmVzcy4gIFdoZW4gd2UgcnVuLCB3ZQotCSAqIHJlbG9jYXRlIG91dHNlbGYgdG8gdGhhdCBhZGRyZXNzLiAgX19pbWFnZV9iZWlnbiBwb2ludHMgdG8KLQkgKiB0aGUgcGFydCBvZiB0aGUgaW1hZ2Ugd2hlcmUgdGhlIHpJbWFnZSBpcy4gLS0gVG9tCi0JICovCi0JemltYWdlX3N0YXJ0ID0gKGNoYXIgKikodW5zaWduZWQgbG9uZykoJl9faW1hZ2VfYmVnaW4pOworCXppbWFnZV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSgmX19pbWFnZV9iZWdpbik7CiAJemltYWdlX3NpemUgPSAodW5zaWduZWQgbG9uZykoJl9faW1hZ2VfZW5kKSAtCiAJICAgICh1bnNpZ25lZCBsb25nKSgmX19pbWFnZV9iZWdpbik7CiAKLQkvKgotCSAqIFRoZSB6SW1hZ2UgYW5kIGluaXRyZCB3aWxsIGJlIGJldHdlZW4gc3RhcnQgYW5kIF9lbmQsIHNvIHRoZXkndmUKLQkgKiBhbHJlYWR5IGJlZW4gbW92ZWQgb25jZS4gIFdlJ3JlIGdvb2QgdG8gZ28gbm93LiAtLSBUb20KLQkgKi8KIAlwdXRzKCJ6aW1hZ2UgYXQ6ICAgICAiKTsKLQlwdXRoZXgoKHVuc2lnbmVkIGxvbmcpemltYWdlX3N0YXJ0KTsKKwlwdXRoZXgoemltYWdlX3N0YXJ0KTsKIAlwdXRzKCIgIik7Ci0JcHV0aGV4KCh1bnNpZ25lZCBsb25nKSh6aW1hZ2Vfc2l6ZSArIHppbWFnZV9zdGFydCkpOworCXB1dGhleCh6aW1hZ2Vfc2l6ZSArIHppbWFnZV9zdGFydCk7CiAJcHV0cygiXG4iKTsKIAotCS8qIHRoaXMgYXJlYSBhcmUgcHJlcGFyZWQgZm9yIG1hbGxvY2luZyB3aGVuIGRlY29tcHJlc3NpbmcgKi8KKwkvKiBUaGlzIGFyZWEgYXJlIHByZXBhcmVkIGZvciBtYWxsb2Npbmcgd2hlbiBkZWNvbXByZXNzaW5nICovCiAJZnJlZV9tZW1fcHRyID0gYm9vdF9oZWFwX3N0YXJ0OwogCWZyZWVfbWVtX2VuZF9wdHIgPSBib290X2hlYXBfc3RhcnQgKyBCT09UX0hFQVBfU0laRTsKIAotCS8qIERpc3BsYXkgc3RhbmRhcmQgTGludXgvTUlQUyBib290IHByb21wdCBmb3Iga2VybmVsIGFyZ3MgKi8KKwkvKiBEaXNwbGF5IHN0YW5kYXJkIExpbnV4L01JUFMgYm9vdCBwcm9tcHQgKi8KIAlwdXRzKCJVbmNvbXByZXNzaW5nIExpbnV4IGF0IGxvYWQgYWRkcmVzcyAiKTsKIAlwdXRoZXgoVk1MSU5VWF9MT0FEX0FERFJFU1NfVUxMKTsKIAlwdXRzKCJcbiIpOworCiAJLyogRGVjb21wcmVzcyB0aGUga2VybmVsIHdpdGggYWNjb3JkaW5nIGFsZ29yaXRobSAqLwotCWRlY29tcHJlc3MoemltYWdlX3N0YXJ0LCB6aW1hZ2Vfc2l6ZSwgMCwgMCwKKwlkZWNvbXByZXNzKChjaGFyICopemltYWdlX3N0YXJ0LCB6aW1hZ2Vfc2l6ZSwgMCwgMCwKIAkJICAgKHZvaWQgKilWTUxJTlVYX0xPQURfQUREUkVTU19VTEwsIDAsIGVycm9yKTsKLQkvKiBGSVhNRTogaXMgdGhlcmUgYSBuZWVkIHRvIGZsdXNoIGNhY2hlIGhlcmU/ICovCisKKwkvKiBGSVhNRTogc2hvdWxkIHdlIGZsdXNoIGNhY2hlIGhlcmU/ICovCiAJcHV0cygiTm93LCBib290aW5nIHRoZSBrZXJuZWwuLi5cbiIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Jvb3QvY29tcHJlc3NlZC9sZC5zY3JpcHQgYi9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2xkLnNjcmlwdAppbmRleCA2MTNhMzViLi44ZTZiMDdjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2xkLnNjcmlwdAorKysgYi9hcmNoL21pcHMvYm9vdC9jb21wcmVzc2VkL2xkLnNjcmlwdApAQCAtMiw2MSArMiw0NCBAQAogICogbGQuc2NyaXB0IGZvciBjb21wcmVzc2VkIGtlcm5lbCBzdXBwb3J0IG9mIE1JUFMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTGVtb3RlIEluYy4KLSAqIEF1dGhvcjogV3UgWmhhbmdqaW4gPHd1empAbGVtb3RlLmNvbT4KKyAqIEF1dGhvcjogV3UgWmhhbmdqaW4gPHd1emhhbmppbmdAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwICJXdSBaaGFuZ2ppbiIgPHd1emhhbmppbmdAZ21haWwuY29tPgogICovCiAKIE9VVFBVVF9BUkNIKG1pcHMpCiBFTlRSWShzdGFydCkKIFNFQ1RJT05TCiB7Ci0JLyogLiA9IFZNTElOVVpfTE9BRF9BRERSRVNTICovCi0JLyogcmVhZC1vbmx5ICovCi0JX3RleHQgPSAuOwkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwotCS50ZXh0CTogewotCQlfZnRleHQgPSAuIDsKKwkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLworCS8qIC4gPSBWTUxJTlVaX0xPQURfQUREUkVTUzsgKi8KKwkudGV4dCA6IHsKIAkJKigudGV4dCkKIAkJKigucm9kYXRhKQotCX0gPSAwCi0JX2V0ZXh0ID0gLjsJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCX0KKwkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCiAKLQkvKiB3cml0YWJsZSAqLwotCS5kYXRhCTogewkvKiBEYXRhICovCi0JCV9mZGF0YSA9IC4gOworCS8qIFdyaXRhYmxlIGRhdGEgKi8KKwkuZGF0YSA6IHsKIAkJKiguZGF0YSkKLQkJLyogUHV0IHRoZSBjb21wcmVzc2VkIGltYWdlIGhlcmUsIHNvIGJzcyBpcyBvbiB0aGUgZW5kLiAqLworCQkvKiBQdXQgdGhlIGNvbXByZXNzZWQgaW1hZ2UgaGVyZSAqLwogCQlfX2ltYWdlX2JlZ2luID0gLjsKIAkJKiguaW1hZ2UpCiAJCV9faW1hZ2VfZW5kID0gLjsKIAkJQ09OU1RSVUNUT1JTCiAJfQotCS5zZGF0YQk6IHsgKiguc2RhdGEpIH0KLQkuID0gQUxJR04oNCk7Ci0JX2VkYXRhICA9ICAuOwkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCisJLiA9IEFMSUdOKDE2KTsKKwlfZWRhdGEgPSAuOworCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIAogCS8qIEJTUyAqLwotCV9fYnNzX3N0YXJ0ID0gLjsKLQlfZmJzcyA9IC47Ci0JLnNic3MJOiB7ICooLnNic3MpICooLnNjb21tb24pIH0KLQkuYnNzCTogewotCQkqKC5keW5ic3MpCisJLmJzcyA6IHsKIAkJKiguYnNzKQotCQkqKENPTU1PTikKIAl9Ci0JLiAgPSBBTElHTig0KTsKLQlfZW5kID0gLiA7Ci0KLQkvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gY29udmVydGVkCi0JICogdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLwotCi0JLnN0YWIgMCA6IHsgKiguc3RhYikgfQotCS5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLQotCS8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCi0JLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotCS5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KKwkuID0gQUxJR04oMTYpOworCV9lbmQgPSAuOwogCiAJLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCi0JL0RJU0NBUkQvCTogeworCS9ESVNDQVJELyA6IHsKIAkJKiguTUlQUy5vcHRpb25zKQogCQkqKC5vcHRpb25zKQogCQkqKC5wZHIpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL01ha2VmaWxlCmluZGV4IDNlOTg3NjMuLjE5ZWIwNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw2IEBACiBvYmoteSA6PSBjcHUubyBzZXR1cC5vIHNlcmlhbC5vIG9jdGVvbi1wbGF0Zm9ybS5vIG9jdGVvbi1pcnEubyBjc3JjLW9jdGVvbi5vCiBvYmoteSArPSBkbWEtb2N0ZW9uLm8gZmxhc2hfc2V0dXAubwogb2JqLXkgKz0gb2N0ZW9uLW1lbWNweS5vCitvYmoteSArPSBleGVjdXRpdmUvCiAKIG9iai0kKENPTkZJR19TTVApICAgICAgICAgICAgICAgICAgICAgKz0gc21wLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL1BsYXRmb3JtIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0M2NjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL1BsYXRmb3JtCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgQ2F2aXVtIE9jdGVvbgorIworcGxhdGZvcm0tJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IGNhdml1bS1vY3Rlb24vCitjZmxhZ3MtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9CQkJCVwKKwkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24KK2lmZGVmIENPTkZJR19DQVZJVU1fT0NURU9OXzJORF9LRVJORUwKK2xvYWQtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IDB4ZmZmZmZmZmY4NDEwMDAwMAorZWxzZQorbG9hZC0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikJKz0gMHhmZmZmZmZmZjgxMTAwMDAwCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3B1LmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcHUuYwppbmRleCBiNmRmNTM4Li5jNjY0YzhjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcHUuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcHUuYwpAQCAtNDEsMTIgKzQxLDggQEAKIAlyZXR1cm4gTk9USUZZX09LOwkJLyogTGV0IGRlZmF1bHQgbm90aWZpZXIgc2VuZCBzaWduYWxzICovCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY25taXBzX2N1Ml9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGNubWlwc19jdTJfY2FsbCwKLX07Ci0KIHN0YXRpYyBpbnQgY25taXBzX2N1Ml9zZXR1cCh2b2lkKQogewotCXJldHVybiByZWdpc3Rlcl9jdTJfbm90aWZpZXIoJmNubWlwc19jdTJfbm90aWZpZXIpOworCXJldHVybiBjdTJfbm90aWZpZXIoY25taXBzX2N1Ml9jYWxsLCAwKTsKIH0KIGVhcmx5X2luaXRjYWxsKGNubWlwc19jdTJfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NzcmMtb2N0ZW9uLmMKaW5kZXggMGJmNGJiZS4uYjY4NDdjOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jCkBAIC01Myw3ICs1Myw2IEBACiB1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQogewogCS8qIDY0LWJpdCBhcml0aG1hdGljIGNhbiBvdmVyZmxvdywgc28gdXNlIDEyOC1iaXQuICAqLwotI2lmIChfX0dOVUNfXyA8IDQpIHx8ICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fIDw9IDMpKQogCXU2NCB0MSwgdDIsIHQzOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBydjsKIAl1NjQgbXVsdCA9IGNsb2Nrc291cmNlX21pcHMubXVsdDsKQEAgLTczLDEzICs3Miw2IEBACiAJCTogW2NudF0gInIiIChjbnQpLCBbbXVsdF0gInIiIChtdWx0KSwgW3NoaWZ0XSAiciIgKHNoaWZ0KQogCQk6ICJoaSIsICJsbyIpOwogCXJldHVybiBydjsKLSNlbHNlCi0JLyogR0NDID4gNC4zIGRvIGl0IHRoZSBlYXN5IHdheS4gICovCi0JdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKG1vZGUoVEkpKSkgdDsKLQl0ID0gcmVhZF9jMF9jdm1jb3VudCgpOwotCXQgPSB0ICogY2xvY2tzb3VyY2VfbWlwcy5tdWx0OwotCXJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKSh0ID4+IGNsb2Nrc291cmNlX21pcHMuc2hpZnQpOwotI2VuZGlmCiB9CiAKIHZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHZvaWQpCkBAIC04OCwzICs4MCw1OCBAQAogCWNsb2Nrc291cmNlX3NldF9jbG9jaygmY2xvY2tzb3VyY2VfbWlwcywgbWlwc19ocHRfZnJlcXVlbmN5KTsKIAljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbWlwcyk7CiB9CisKK3N0YXRpYyB1NjQgb2N0ZW9uX3VkZWxheV9mYWN0b3I7CitzdGF0aWMgdTY0IG9jdGVvbl9uZGVsYXlfZmFjdG9yOworCit2b2lkIF9faW5pdCBvY3Rlb25fc2V0dXBfZGVsYXlzKHZvaWQpCit7CisJb2N0ZW9uX3VkZWxheV9mYWN0b3IgPSBvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKSAvIDEwMDAwMDA7CisJLyoKKwkgKiBGb3IgX19uZGVsYXkgd2UgZGl2aWRlIGJ5IDJeMTYsIHNvIHRoZSBmYWN0b3IgaXMgbXVsdGlwbGllZAorCSAqIGJ5IHRoZSBzYW1lIGFtb3VudC4KKwkgKi8KKwlvY3Rlb25fbmRlbGF5X2ZhY3RvciA9IChvY3Rlb25fdWRlbGF5X2ZhY3RvciAqIDB4MTAwMDB1bGwpIC8gMTAwMHVsbDsKKworCXByZXNldF9scGogPSBvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKSAvIEhaOworfQorCit2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXMpCit7CisJdTY0IGN1ciwgZW5kLCBpbmM7CisKKwljdXIgPSByZWFkX2MwX2N2bWNvdW50KCk7CisKKwlpbmMgPSB1cyAqIG9jdGVvbl91ZGVsYXlfZmFjdG9yOworCWVuZCA9IGN1ciArIGluYzsKKworCXdoaWxlIChlbmQgPiBjdXIpCisJCWN1ciA9IHJlYWRfYzBfY3ZtY291bnQoKTsKK30KK0VYUE9SVF9TWU1CT0woX191ZGVsYXkpOworCit2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnMpCit7CisJdTY0IGN1ciwgZW5kLCBpbmM7CisKKwljdXIgPSByZWFkX2MwX2N2bWNvdW50KCk7CisKKwlpbmMgPSAoKG5zICogb2N0ZW9uX25kZWxheV9mYWN0b3IpID4+IDE2KTsKKwllbmQgPSBjdXIgKyBpbmM7CisKKwl3aGlsZSAoZW5kID4gY3VyKQorCQljdXIgPSByZWFkX2MwX2N2bWNvdW50KCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdTY0IGN1ciwgZW5kOworCisJY3VyID0gcmVhZF9jMF9jdm1jb3VudCgpOworCWVuZCA9IGN1ciArIGxvb3BzOworCisJd2hpbGUgKGVuZCA+IGN1cikKKwkJY3VyID0gcmVhZF9jMF9jdm1jb3VudCgpOworfQorRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2RtYS1vY3Rlb24uYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2RtYS1vY3Rlb24uYwppbmRleCBiZTUzMWVjLi5kMjJiNWEyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9kbWEtb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZG1hLW9jdGVvbi5jCkBAIC05OSwxMyArOTksMTYgQEAKIAkJCXBhbmljKCJkbWFfbWFwX3NpbmdsZTogIgogCQkJICAgICAgIkF0dGVtcHQgdG8gbWFwIGlsbGVnYWwgbWVtb3J5IGFkZHJlc3MgMHglbGx4XG4iLAogCQkJICAgICAgcGh5c2ljYWwpOwotCQllbHNlIGlmICgocGh5c2ljYWwgKyBzaXplID49Ci0JCQkgICg0dWxsPDwzMCkgLSAoT0NURU9OX1BDSV9CQVIxX0hPTEVfU0laRTw8MjApKQotCQkJICYmIHBoeXNpY2FsIDwgKDR1bGw8PDMwKSkKLQkJCXByX3dhcm5pbmcoImRtYV9tYXBfc2luZ2xlOiBXYXJuaW5nOiAiCi0JCQkJICAgIk1hcHBpbmcgbWVtb3J5IGFkZHJlc3MgdGhhdCBtaWdodCAiCi0JCQkJICAgImNvbmZsaWN0IHdpdGggZGV2aWNlcyAweCVsbHgtMHglbGx4XG4iLAotCQkJCSAgIHBoeXNpY2FsLCBwaHlzaWNhbCtzaXplLTEpOworCQllbHNlIGlmIChwaHlzaWNhbCA+PSBDVk1YX1BDSUVfQkFSMV9QSFlTX0JBU0UgJiYKKwkJCSBwaHlzaWNhbCArIHNpemUgPCAoQ1ZNWF9QQ0lFX0JBUjFfUEhZU19CQVNFICsgQ1ZNWF9QQ0lFX0JBUjFfUEhZU19TSVpFKSkgeworCQkJcmVzdWx0ID0gcGh5c2ljYWwgLSBDVk1YX1BDSUVfQkFSMV9QSFlTX0JBU0UgKyBDVk1YX1BDSUVfQkFSMV9SQ19CQVNFOworCisJCQlpZiAoKChyZXN1bHQrc2l6ZS0xKSAmIGRtYV9tYXNrKSAhPSByZXN1bHQrc2l6ZS0xKQorCQkJCXBhbmljKCJkbWFfbWFwX3NpbmdsZTogQXR0ZW1wdCB0byBtYXAgYWRkcmVzcyAweCVsbHgtMHglbGx4LCB3aGljaCBjYW4ndCBiZSBhY2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlIGRtYSBtYXNrIDB4JWxseFxuIiwKKwkJCQkgICAgICBwaHlzaWNhbCwgcGh5c2ljYWwrc2l6ZS0xLCBkbWFfbWFzayk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwogCQkvKiBUaGUgMm5kIDI1Nk1CIGlzIG1hcHBlZCBhdCAyNTY8PDIwIGluc3RlYWQgb2YgMHg0MTAwMDAwMDAgKi8KIAkJaWYgKChwaHlzaWNhbCA+PSAweDQxMDAwMDAwMHVsbCkgJiYgcGh5c2ljYWwgPCAweDQyMDAwMDAwMHVsbCkKIAkJCXJlc3VsdCA9IHBoeXNpY2FsIC0gMHg0MDAwMDAwMDB1bGw7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKaW5kZXggYzQyNGNkMS4uY2U3NTAwYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYwpAQCAtMywxNSArMywxMyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4LCAyMDA5LCAyMDEwIENhdml1bSBOZXR3b3JrcwogICovCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgotI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1wZXhwLWRlZnMuaD4KLSNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtbnBpLWRlZnMuaD4KIAogc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sob2N0ZW9uX2lycV9jaXUwX2xvY2spOwogc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sob2N0ZW9uX2lycV9jaXUxX2xvY2spOwpAQCAtNDEsMTQgKzM5LDE0IEBACiAKIHN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY29yZV9lb2kodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXVuc2lnbmVkIGludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1NXMDsKIAkvKgogCSAqIElmIGFuIElSUSBpcyBiZWluZyBwcm9jZXNzZWQgd2hpbGUgd2UgYXJlIGRpc2FibGluZyBpdCB0aGUKIAkgKiBoYW5kbGVyIHdpbGwgYXR0ZW1wdCB0byB1bm1hc2sgdGhlIGludGVycnVwdCBhZnRlciBpdCBoYXMKIAkgKiBiZWVuIGRpc2FibGVkLgogCSAqLwotCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpCisJaWYgKCh1bmxpa2VseShkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpKSkKIAkJcmV0dXJuOwogCS8qCiAJICogV2UgZG9uJ3QgbmVlZCB0byBkaXNhYmxlIElSUXMgdG8gbWFrZSB0aGVzZSBhdG9taWMgc2luY2UKQEAgLTEwNiw2ICsxMDQsMjkgQEAKIAogc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUwX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQogeworCXN3aXRjaCAoaXJxKSB7CisJY2FzZSBPQ1RFT05fSVJRX0dNWF9EUlAwOgorCWNhc2UgT0NURU9OX0lSUV9HTVhfRFJQMToKKwljYXNlIE9DVEVPTl9JUlFfSVBEX0RSUDoKKwljYXNlIE9DVEVPTl9JUlFfS0VZX1pFUk86CisJY2FzZSBPQ1RFT05fSVJRX1RJTUVSMDoKKwljYXNlIE9DVEVPTl9JUlFfVElNRVIxOgorCWNhc2UgT0NURU9OX0lSUV9USU1FUjI6CisJY2FzZSBPQ1RFT05fSVJRX1RJTUVSMzoKKwl7CisJCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyOworCQl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV09SS1EwKTsKKwkJLyoKKwkJICogQ0lVIHRpbWVyIHR5cGUgaW50ZXJydXB0cyBtdXN0IGJlIGFja25vbGVnZWQgYnkKKwkJICogd3JpdGluZyBhICcxJyBiaXQgdG8gdGhlaXIgc3VtMCBiaXQuCisJCSAqLworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX1NVTTAoaW5kZXgpLCBtYXNrKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCS8qCiAJICogSW4gb3JkZXIgdG8gYXZvaWQgYW55IGxvY2tpbmcgYWNjZXNzaW5nIHRoZSBDSVUsIHdlCiAJICogYWNrbm93bGVkZ2UgQ0lVIGludGVycnVwdHMgYnkgZGlzYWJsaW5nIGFsbCBvZiB0aGVtLiAgVGhpcwpAQCAtMTMwLDggKzE1MSw1NCBAQAogCXNldF9jMF9zdGF0dXMoMHgxMDAgPDwgMik7CiB9CiAKK3N0YXRpYyBpbnQgbmV4dF9jb3JlaWRfZm9yX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGNvcmVpZDsKKwlpbnQgd2VpZ2h0ID0gY3B1bWFza193ZWlnaHQoZGVzYy0+YWZmaW5pdHkpOworCisJaWYgKHdlaWdodCA+IDEpIHsKKwkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZm9yICg7OykgeworCQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgZGVzYy0+YWZmaW5pdHkpOworCQkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKSB7CisJCQkJY3B1ID0gLTE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVfb25saW5lX21hc2spKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY29yZWlkID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSk7CisJfSBlbHNlIGlmICh3ZWlnaHQgPT0gMSkgeworCQljb3JlaWQgPSBvY3Rlb25fY29yZWlkX2Zvcl9jcHUoY3B1bWFza19maXJzdChkZXNjLT5hZmZpbml0eSkpOworCX0gZWxzZSB7CisJCWNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJfQorCXJldHVybiBjb3JlaWQ7CisjZWxzZQorCXJldHVybiBjdm14X2dldF9jb3JlX251bSgpOworI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MF9lbmFibGUodW5zaWduZWQgaW50IGlycSkKIHsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCWludCBjb3JlaWQgPSBuZXh0X2NvcmVpZF9mb3JfaXJxKGRlc2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDY0X3QgZW4wOworCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dPUktRMDsJLyogQml0IDAtNjMgb2YgRU4wICovCisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJm9jdGVvbl9pcnFfY2l1MF9sb2NrLCBmbGFncyk7CisJZW4wID0gY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSk7CisJZW4wIHw9IDF1bGwgPDwgYml0OworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpLCBlbjApOworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMikpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY3Rlb25faXJxX2NpdTBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfZW5hYmxlX21ib3godW5zaWduZWQgaW50IGlycSkKK3sKIAlpbnQgY29yZWlkID0gY3ZteF9nZXRfY29yZV9udW0oKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQ2NF90IGVuMDsKQEAgLTE2NywxNCArMjM0LDMxIEBACiB9CiAKIC8qCi0gKiBFbmFibGUgdGhlIGlycSBvbiB0aGUgY3VycmVudCBjb3JlIGZvciBjaGlwcyB0aGF0IGhhdmUgdGhlIEVOKl9XMXtTLEN9Ci0gKiByZWdpc3RlcnMuCisgKiBFbmFibGUgdGhlIGlycSBvbiB0aGUgbmV4dCBjb3JlIGluIHRoZSBhZmZpbml0eSBzZXQgZm9yIGNoaXBzIHRoYXQKKyAqIGhhdmUgdGhlIEVOKl9XMXtTLEN9IHJlZ2lzdGVycy4KICAqLwogc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUwX2VuYWJsZV92Mih1bnNpZ25lZCBpbnQgaXJxKQogewotCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyOworCWludCBpbmRleDsKKwl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV09SS1EwKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpID09IDApIHsKKwkJaW5kZXggPSBuZXh0X2NvcmVpZF9mb3JfaXJxKGRlc2MpICogMjsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKGluZGV4KSwgbWFzayk7CisJfQorfQorCisvKgorICogRW5hYmxlIHRoZSBpcnEgb24gdGhlIGN1cnJlbnQgQ1BVIGZvciBjaGlwcyB0aGF0CisgKiBoYXZlIHRoZSBFTipfVzF7UyxDfSByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MF9lbmFibGVfbWJveF92Mih1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpbmRleDsKIAl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV09SS1EwKTsKIAorCWluZGV4ID0gY3ZteF9nZXRfY29yZV9udW0oKSAqIDI7CiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKGluZGV4KSwgbWFzayk7CiB9CiAKQEAgLTE4Nyw0MyArMjcxLDM5IEBACiAJaW50IGluZGV4ID0gY3ZteF9nZXRfY29yZV9udW0oKSAqIDI7CiAJdTY0IG1hc2sgPSAxdWxsIDw8IChpcnEgLSBPQ1RFT05fSVJRX1dPUktRMCk7CiAKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgT0NURU9OX0lSUV9HTVhfRFJQMDoKKwljYXNlIE9DVEVPTl9JUlFfR01YX0RSUDE6CisJY2FzZSBPQ1RFT05fSVJRX0lQRF9EUlA6CisJY2FzZSBPQ1RFT05fSVJRX0tFWV9aRVJPOgorCWNhc2UgT0NURU9OX0lSUV9USU1FUjA6CisJY2FzZSBPQ1RFT05fSVJRX1RJTUVSMToKKwljYXNlIE9DVEVPTl9JUlFfVElNRVIyOgorCWNhc2UgT0NURU9OX0lSUV9USU1FUjM6CisJCS8qCisJCSAqIENJVSB0aW1lciB0eXBlIGludGVycnVwdHMgbXVzdCBiZSBhY2tub2xlZ2VkIGJ5CisJCSAqIHdyaXRpbmcgYSAnMScgYml0IHRvIHRoZWlyIHN1bTAgYml0LgorCQkgKi8KKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9TVU0wKGluZGV4KSwgbWFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wX1cxQyhpbmRleCksIG1hc2spOwogfQogCiAvKgotICogQ0lVIHRpbWVyIHR5cGUgaW50ZXJydXB0cyBtdXN0IGJlIGFja25vbGVnZWQgYnkgd3JpdGluZyBhICcxJyBiaXQKLSAqIHRvIHRoZWlyIHN1bTAgYml0LgotICovCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfdGltZXJfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaW50IGluZGV4ID0gY3ZteF9nZXRfY29yZV9udW0oKSAqIDI7Ci0JdWludDY0X3QgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV09SS1EwKTsKLQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX1NVTTAoaW5kZXgpLCBtYXNrKTsKLX0KLQotc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUwX3RpbWVyX2Fja192MSh1bnNpZ25lZCBpbnQgaXJxKQotewotCW9jdGVvbl9pcnFfY2l1MF90aW1lcl9hY2soaXJxKTsKLQlvY3Rlb25faXJxX2NpdTBfYWNrKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MF90aW1lcl9hY2tfdjIodW5zaWduZWQgaW50IGlycSkKLXsKLQlvY3Rlb25faXJxX2NpdTBfdGltZXJfYWNrKGlycSk7Ci0Jb2N0ZW9uX2lycV9jaXUwX2Fja192MihpcnEpOwotfQotCi0vKgogICogRW5hYmxlIHRoZSBpcnEgb24gdGhlIGN1cnJlbnQgY29yZSBmb3IgY2hpcHMgdGhhdCBoYXZlIHRoZSBFTipfVzF7UyxDfQogICogcmVnaXN0ZXJzLgogICovCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfZW9pX3YyKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfZW9pX21ib3hfdjIodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyOwogCXU2NCBtYXNrID0gMXVsbCA8PCAoaXJxIC0gT0NURU9OX0lSUV9XT1JLUTApOwogCi0JaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpID09IDApCisJaWYgKGxpa2VseSgoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSA9PSAwKSkKIAkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKGluZGV4KSwgbWFzayk7CiB9CiAKQEAgLTI0NiwxOCArMzI2LDMwIEBACiBzdGF0aWMgaW50IG9jdGVvbl9pcnFfY2l1MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCiB7CiAJaW50IGNwdTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCWludCBlbmFibGVfb25lID0gKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkgPT0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dPUktRMDsJLyogQml0IDAtNjMgb2YgRU4wICovCiAKKwkvKgorCSAqIEZvciBub24tdjIgQ0lVLCB3ZSB3aWxsIGFsbG93IG9ubHkgc2luZ2xlIENQVSBhZmZpbml0eS4KKwkgKiBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgdG8gZG8gbG9ja2luZyBpbiB0aGUgLmFjay8uZW9pCisJICogZnVuY3Rpb25zLgorCSAqLworCWlmIChjcHVtYXNrX3dlaWdodChkZXN0KSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmb2N0ZW9uX2lycV9jaXUwX2xvY2ssIGZsYWdzKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpbnQgY29yZWlkID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSk7CiAJCXVpbnQ2NF90IGVuMCA9CiAJCQljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpKTsKLQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXN0KSkKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXN0KSAmJiBlbmFibGVfb25lKSB7CisJCQllbmFibGVfb25lID0gMDsKIAkJCWVuMCB8PSAxdWxsIDw8IGJpdDsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJZW4wICY9IH4oMXVsbCA8PCBiaXQpOworCQl9CiAJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpLCBlbjApOwogCX0KIAkvKgpAQCAtMjc5LDEzICszNzEsMTggQEAKIHsKIAlpbnQgY3B1OwogCWludCBpbmRleDsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCWludCBlbmFibGVfb25lID0gKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkgPT0gMDsKIAl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV09SS1EwKTsKKwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWluZGV4ID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSkgKiAyOwotCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGRlc3QpKQorCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGRlc3QpICYmIGVuYWJsZV9vbmUpIHsKKwkJCWVuYWJsZV9vbmUgPSAwOwogCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKGluZGV4KSwgbWFzayk7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKIAkJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wX1cxQyhpbmRleCksIG1hc2spOworCQl9CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjk4LDggKzM5NSw3IEBACiAJLm5hbWUgPSAiQ0lVMCIsCiAJLmVuYWJsZSA9IG9jdGVvbl9pcnFfY2l1MF9lbmFibGVfdjIsCiAJLmRpc2FibGUgPSBvY3Rlb25faXJxX2NpdTBfZGlzYWJsZV9hbGxfdjIsCi0JLmFjayA9IG9jdGVvbl9pcnFfY2l1MF9hY2tfdjIsCi0JLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lb2lfdjIsCisJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lbmFibGVfdjIsCiAjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5X3YyLAogI2VuZGlmCkBAIC0zMDksMzUgKzQwNSwyNiBAQAogCS5uYW1lID0gIkNJVTAiLAogCS5lbmFibGUgPSBvY3Rlb25faXJxX2NpdTBfZW5hYmxlLAogCS5kaXNhYmxlID0gb2N0ZW9uX2lycV9jaXUwX2Rpc2FibGUsCi0JLmFjayA9IG9jdGVvbl9pcnFfY2l1MF9hY2ssCiAJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lb2ksCiAjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5LAogI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9jaXUwX3RpbWVyX3YyID0gewotCS5uYW1lID0gIkNJVTAtVCIsCi0JLmVuYWJsZSA9IG9jdGVvbl9pcnFfY2l1MF9lbmFibGVfdjIsCi0JLmRpc2FibGUgPSBvY3Rlb25faXJxX2NpdTBfZGlzYWJsZV9hbGxfdjIsCi0JLmFjayA9IG9jdGVvbl9pcnFfY2l1MF90aW1lcl9hY2tfdjIsCi0JLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lb2lfdjIsCi0jaWZkZWYgQ09ORklHX1NNUAotCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5X3YyLAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9jaXUwX3RpbWVyID0gewotCS5uYW1lID0gIkNJVTAtVCIsCi0JLmVuYWJsZSA9IG9jdGVvbl9pcnFfY2l1MF9lbmFibGUsCisvKiBUaGUgbWJveCB2ZXJzaW9ucyBkb24ndCBkbyBhbnkgYWZmaW5pdHkgb3Igcm91bmQtcm9iaW4uICovCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9jaXUwX21ib3hfdjIgPSB7CisJLm5hbWUgPSAiQ0lVMC1NIiwKKwkuZW5hYmxlID0gb2N0ZW9uX2lycV9jaXUwX2VuYWJsZV9tYm94X3YyLAogCS5kaXNhYmxlID0gb2N0ZW9uX2lycV9jaXUwX2Rpc2FibGUsCi0JLmFjayA9IG9jdGVvbl9pcnFfY2l1MF90aW1lcl9hY2tfdjEsCi0JLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lb2ksCi0jaWZkZWYgQ09ORklHX1NNUAotCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5LAotI2VuZGlmCisJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lb2lfbWJveF92MiwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgb2N0ZW9uX2lycV9jaGlwX2NpdTBfbWJveCA9IHsKKwkubmFtZSA9ICJDSVUwLU0iLAorCS5lbmFibGUgPSBvY3Rlb25faXJxX2NpdTBfZW5hYmxlX21ib3gsCisJLmRpc2FibGUgPSBvY3Rlb25faXJxX2NpdTBfZGlzYWJsZSwKKwkuZW9pID0gb2N0ZW9uX2lycV9jaXUwX2VvaSwKK307CiAKIHN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTM2NSw3ICs0NTIsOCBAQAogCiBzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwlpbnQgY29yZWlkID0gbmV4dF9jb3JlaWRfZm9yX2lycShkZXNjKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQ2NF90IGVuMTsKIAlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsJLyogQml0IDAtNjMgb2YgRU4xICovCkBAIC0zNzgsNiArNDY2LDI1IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9jdGVvbl9pcnFfY2l1MV9sb2NrLCBmbGFncyk7CiB9CiAKKy8qCisgKiBXYXRjaGRvZyBpbnRlcnJ1cHRzIGFyZSBzcGVjaWFsLiAgVGhleSBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlCisgKiBjb3JlLCBzbyB3ZSBoYXJkd2lyZSB0aGUgYWZmaW5pdHkgdG8gdGhhdCBjb3JlLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfd2RfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50NjRfdCBlbjE7CisJaW50IGJpdCA9IGlycSAtIE9DVEVPTl9JUlFfV0RPRzA7CS8qIEJpdCAwLTYzIG9mIEVOMSAqLworCWludCBjb3JlaWQgPSBiaXQ7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJm9jdGVvbl9pcnFfY2l1MV9sb2NrLCBmbGFncyk7CisJZW4xID0gY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMShjb3JlaWQgKiAyICsgMSkpOworCWVuMSB8PSAxdWxsIDw8IGJpdDsKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMShjb3JlaWQgKiAyICsgMSksIGVuMSk7CisJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMShjb3JlaWQgKiAyICsgMSkpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY3Rlb25faXJxX2NpdTFfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dET0cwOwkvKiBCaXQgMC02MyBvZiBFTjEgKi8KQEAgLTQwNSwxMCArNTEyLDMxIEBACiAgKi8KIHN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MV9lbmFibGVfdjIodW5zaWduZWQgaW50IGlycSkKIHsKLQlpbnQgaW5kZXggPSBjdm14X2dldF9jb3JlX251bSgpICogMiArIDE7CisJaW50IGluZGV4OwogCXU2NCBtYXNrID0gMXVsbCA8PCAoaXJxIC0gT0NURU9OX0lSUV9XRE9HMCk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAotCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4xX1cxUyhpbmRleCksIG1hc2spOworCWlmICgoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSA9PSAwKSB7CisJCWluZGV4ID0gbmV4dF9jb3JlaWRfZm9yX2lycShkZXNjKSAqIDIgKyAxOworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMV9XMVMoaW5kZXgpLCBtYXNrKTsKKwl9Cit9CisKKy8qCisgKiBXYXRjaGRvZyBpbnRlcnJ1cHRzIGFyZSBzcGVjaWFsLiAgVGhleSBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlCisgKiBjb3JlLCBzbyB3ZSBoYXJkd2lyZSB0aGUgYWZmaW5pdHkgdG8gdGhhdCBjb3JlLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfd2RfZW5hYmxlX3YyKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGluZGV4OworCWludCBjb3JlaWQgPSBpcnEgLSBPQ1RFT05fSVJRX1dET0cwOworCXU2NCBtYXNrID0gMXVsbCA8PCAoaXJxIC0gT0NURU9OX0lSUV9XRE9HMCk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWlmICgoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSA9PSAwKSB7CisJCWluZGV4ID0gY29yZWlkICogMiArIDE7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4xX1cxUyhpbmRleCksIG1hc2spOworCX0KIH0KIAogLyoKQEAgLTQyNCwyMCArNTUyLDYgQEAKIH0KIAogLyoKLSAqIEVuYWJsZSB0aGUgaXJxIG9uIHRoZSBjdXJyZW50IGNvcmUgZm9yIGNoaXBzIHRoYXQgaGF2ZSB0aGUgRU4qX1cxe1MsQ30KLSAqIHJlZ2lzdGVycy4KLSAqLwotc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUxX2VvaV92Mih1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyICsgMTsKLQl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV0RPRzApOwotCi0JaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpID09IDApCi0JCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4xX1cxUyhpbmRleCksIG1hc2spOwotfQotCi0vKgogICogRGlzYWJsZSB0aGUgaXJxIG9uIHRoZSBhbGwgY29yZXMgZm9yIGNoaXBzIHRoYXQgaGF2ZSB0aGUgRU4qX1cxe1MsQ30KICAqIHJlZ2lzdGVycy4KICAqLwpAQCAtNDU3LDE5ICs1NzEsMzAgQEAKIAkJCQkJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCiB7CiAJaW50IGNwdTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCWludCBlbmFibGVfb25lID0gKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkgPT0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dET0cwOwkvKiBCaXQgMC02MyBvZiBFTjEgKi8KIAorCS8qCisJICogRm9yIG5vbi12MiBDSVUsIHdlIHdpbGwgYWxsb3cgb25seSBzaW5nbGUgQ1BVIGFmZmluaXR5LgorCSAqIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCB0byBkbyBsb2NraW5nIGluIHRoZSAuYWNrLy5lb2kKKwkgKiBmdW5jdGlvbnMuCisJICovCisJaWYgKGNwdW1hc2tfd2VpZ2h0KGRlc3QpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX2NpdTFfbG9jaywgZmxhZ3MpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWludCBjb3JlaWQgPSBvY3Rlb25fY29yZWlkX2Zvcl9jcHUoY3B1KTsKIAkJdWludDY0X3QgZW4xID0KLQkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEKLQkJCQkoY29yZWlkICogMiArIDEpKTsKLQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXN0KSkKKwkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXN0KSAmJiBlbmFibGVfb25lKSB7CisJCQllbmFibGVfb25lID0gMDsKIAkJCWVuMSB8PSAxdWxsIDw8IGJpdDsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJZW4xICY9IH4oMXVsbCA8PCBiaXQpOworCQl9CiAJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGNvcmVpZCAqIDIgKyAxKSwgZW4xKTsKIAl9CiAJLyoKQEAgLTQ5MSwxMyArNjE2LDE3IEBACiB7CiAJaW50IGNwdTsKIAlpbnQgaW5kZXg7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwlpbnQgZW5hYmxlX29uZSA9IChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpID09IDA7CiAJdTY0IG1hc2sgPSAxdWxsIDw8IChpcnEgLSBPQ1RFT05fSVJRX1dET0cwKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpbmRleCA9IG9jdGVvbl9jb3JlaWRfZm9yX2NwdShjcHUpICogMiArIDE7Ci0JCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgZGVzdCkpCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgZGVzdCkgJiYgZW5hYmxlX29uZSkgeworCQkJZW5hYmxlX29uZSA9IDA7CiAJCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMV9XMVMoaW5kZXgpLCBtYXNrKTsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjFfVzFDKGluZGV4KSwgbWFzayk7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC01MDcsMTEgKzYzNiwxMCBAQAogICogTmV3ZXIgb2N0ZW9uIGNoaXBzIGhhdmUgc3VwcG9ydCBmb3IgbG9ja2xlc3MgQ0lVIG9wZXJhdGlvbi4KICAqLwogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBvY3Rlb25faXJxX2NoaXBfY2l1MV92MiA9IHsKLQkubmFtZSA9ICJDSVUwIiwKKwkubmFtZSA9ICJDSVUxIiwKIAkuZW5hYmxlID0gb2N0ZW9uX2lycV9jaXUxX2VuYWJsZV92MiwKIAkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfY2l1MV9kaXNhYmxlX2FsbF92MiwKLQkuYWNrID0gb2N0ZW9uX2lycV9jaXUxX2Fja192MiwKLQkuZW9pID0gb2N0ZW9uX2lycV9jaXUxX2VvaV92MiwKKwkuZW9pID0gb2N0ZW9uX2lycV9jaXUxX2VuYWJsZV92MiwKICNpZmRlZiBDT05GSUdfU01QCiAJLnNldF9hZmZpbml0eSA9IG9jdGVvbl9pcnFfY2l1MV9zZXRfYWZmaW5pdHlfdjIsCiAjZW5kaWYKQEAgLTUyMSwxMDMgKzY0OSwzNiBAQAogCS5uYW1lID0gIkNJVTEiLAogCS5lbmFibGUgPSBvY3Rlb25faXJxX2NpdTFfZW5hYmxlLAogCS5kaXNhYmxlID0gb2N0ZW9uX2lycV9jaXUxX2Rpc2FibGUsCi0JLmFjayA9IG9jdGVvbl9pcnFfY2l1MV9hY2ssCiAJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MV9lb2ksCiAjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTFfc2V0X2FmZmluaXR5LAogI2VuZGlmCiB9OwogCi0jaWZkZWYgQ09ORklHX1BDSV9NU0kKLQotc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sob2N0ZW9uX2lycV9tc2lfbG9jayk7Ci0KLXN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfbXNpX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghb2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX1BDSUUpKSB7Ci0JCS8qIFRoZXNlIGNoaXBzIGhhdmUgUENJICovCi0JCWN2bXhfd3JpdGVfY3NyKENWTVhfTlBJX05QSV9NU0lfUkNWLAotCQkJICAgICAgIDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDApKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBUaGVzZSBjaGlwcyBoYXZlIFBDSWUuIFRoYW5rZnVsbHkgdGhlIEFDSyBkb2Vzbid0Ci0JCSAqIG5lZWQgYW55IGxvY2tpbmcuCi0JCSAqLwotCQljdm14X3dyaXRlX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfUkNWMCwKLQkJCSAgICAgICAxdWxsIDw8IChpcnEgLSBPQ1RFT05fSVJRX01TSV9CSVQwKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX21zaV9lb2kodW5zaWduZWQgaW50IGlycSkKLXsKLQkvKiBOb3RoaW5nIG5lZWRlZCAqLwotfQotCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX21zaV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIW9jdGVvbl9oYXNfZmVhdHVyZShPQ1RFT05fRkVBVFVSRV9QQ0lFKSkgewotCQkvKgotCQkgKiBPY3Rlb24gUENJIGRvZXNuJ3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBtYXNrL3VubWFzawotCQkgKiBNU0kgaW50ZXJydXB0cyBpbmRpdmlkdWFsbHkuICBJbnN0ZWFkIG9mCi0JCSAqIG1hc2tpbmcvdW5tYXNraW5nIHRoZW0gaW4gZ3JvdXBzIG9mIDE2LCB3ZSBzaW1wbGUKLQkJICogYXNzdW1lIE1TSSBkZXZpY2VzIGFyZSB3ZWxsIGJlaGF2ZWQuICBNU0kKLQkJICogaW50ZXJydXB0cyBhcmUgYWx3YXlzIGVuYWJsZSBhbmQgdGhlIEFDSyBpcyBhc3N1bWVkCi0JCSAqIHRvIGJlIGVub3VnaC4KLQkJICovCi0JfSBlbHNlIHsKLQkJLyogVGhlc2UgY2hpcHMgaGF2ZSBQQ0llLiAgTm90ZSB0aGF0IHdlIG9ubHkgc3VwcG9ydAotCQkgKiB0aGUgZmlyc3QgNjQgTVNJIGludGVycnVwdHMuICBVbmZvcnR1bmF0ZWx5IGFsbCB0aGUKLQkJICogTVNJIGVuYWJsZXMgYXJlIGluIHRoZSBzYW1lIHJlZ2lzdGVyLiAgV2UgdXNlCi0JCSAqIE1TSTAncyBsb2NrIHRvIGNvbnRyb2wgYWNjZXNzIHRvIHRoZW0gYWxsLgotCQkgKi8KLQkJdWludDY0X3QgZW47Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmb2N0ZW9uX2lycV9tc2lfbG9jaywgZmxhZ3MpOwotCQllbiA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9QRVhQX05QRUlfTVNJX0VOQjApOwotCQllbiB8PSAxdWxsIDw8IChpcnEgLSBPQ1RFT05fSVJRX01TSV9CSVQwKTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QRVhQX05QRUlfTVNJX0VOQjAsIGVuKTsKLQkJY3ZteF9yZWFkX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfRU5CMCk7Ci0JCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY3Rlb25faXJxX21zaV9sb2NrLCBmbGFncyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX21zaV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCFvY3Rlb25faGFzX2ZlYXR1cmUoT0NURU9OX0ZFQVRVUkVfUENJRSkpIHsKLQkJLyogU2VlIGNvbW1lbnQgaW4gZW5hYmxlICovCi0JfSBlbHNlIHsKLQkJLyoKLQkJICogVGhlc2UgY2hpcHMgaGF2ZSBQQ0llLiAgTm90ZSB0aGF0IHdlIG9ubHkgc3VwcG9ydAotCQkgKiB0aGUgZmlyc3QgNjQgTVNJIGludGVycnVwdHMuICBVbmZvcnR1bmF0ZWx5IGFsbCB0aGUKLQkJICogTVNJIGVuYWJsZXMgYXJlIGluIHRoZSBzYW1lIHJlZ2lzdGVyLiAgV2UgdXNlCi0JCSAqIE1TSTAncyBsb2NrIHRvIGNvbnRyb2wgYWNjZXNzIHRvIHRoZW0gYWxsLgotCQkgKi8KLQkJdWludDY0X3QgZW47Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmb2N0ZW9uX2lycV9tc2lfbG9jaywgZmxhZ3MpOwotCQllbiA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9QRVhQX05QRUlfTVNJX0VOQjApOwotCQllbiAmPSB+KDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDApKTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QRVhQX05QRUlfTVNJX0VOQjAsIGVuKTsKLQkJY3ZteF9yZWFkX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfRU5CMCk7Ci0JCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY3Rlb25faXJxX21zaV9sb2NrLCBmbGFncyk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9tc2kgPSB7Ci0JLm5hbWUgPSAiTVNJIiwKLQkuZW5hYmxlID0gb2N0ZW9uX2lycV9tc2lfZW5hYmxlLAotCS5kaXNhYmxlID0gb2N0ZW9uX2lycV9tc2lfZGlzYWJsZSwKLQkuYWNrID0gb2N0ZW9uX2lycV9tc2lfYWNrLAotCS5lb2kgPSBvY3Rlb25faXJxX21zaV9lb2ksCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9jaXUxX3dkX3YyID0geworCS5uYW1lID0gIkNJVTEtVyIsCisJLmVuYWJsZSA9IG9jdGVvbl9pcnFfY2l1MV93ZF9lbmFibGVfdjIsCisJLmRpc2FibGUgPSBvY3Rlb25faXJxX2NpdTFfZGlzYWJsZV9hbGxfdjIsCisJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MV93ZF9lbmFibGVfdjIsCiB9OwotI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgb2N0ZW9uX2lycV9jaGlwX2NpdTFfd2QgPSB7CisJLm5hbWUgPSAiQ0lVMS1XIiwKKwkuZW5hYmxlID0gb2N0ZW9uX2lycV9jaXUxX3dkX2VuYWJsZSwKKwkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfY2l1MV9kaXNhYmxlLAorCS5lb2kgPSBvY3Rlb25faXJxX2NpdTFfZW9pLAorfTsKKworc3RhdGljIHZvaWQgKCpvY3Rlb25fY2l1MF9hY2spKHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCAoKm9jdGVvbl9jaXUxX2FjaykodW5zaWduZWQgaW50KTsKIAogdm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQogewotCWludCBpcnE7CisJdW5zaWduZWQgaW50IGlycTsKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAwOwotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcDBfdGltZXI7CisJc3RydWN0IGlycV9jaGlwICpjaGlwMF9tYm94OwogCXN0cnVjdCBpcnFfY2hpcCAqY2hpcDE7CisJc3RydWN0IGlycV9jaGlwICpjaGlwMV93ZDsKIAogI2lmZGVmIENPTkZJR19TTVAKIAkvKiBTZXQgdGhlIGRlZmF1bHQgYWZmaW5pdHkgdG8gdGhlIGJvb3QgY3B1LiAqLwpAQCAtNjMxLDEzICs2OTIsMTkgQEAKIAlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU4WFhfUEFTUzJfWCkgfHwKIAkgICAgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU2WFhfUEFTUzJfWCkgfHwKIAkgICAgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUyWFhfUEFTUzJfWCkpIHsKKwkJb2N0ZW9uX2NpdTBfYWNrID0gb2N0ZW9uX2lycV9jaXUwX2Fja192MjsKKwkJb2N0ZW9uX2NpdTFfYWNrID0gb2N0ZW9uX2lycV9jaXUxX2Fja192MjsKIAkJY2hpcDAgPSAmb2N0ZW9uX2lycV9jaGlwX2NpdTBfdjI7Ci0JCWNoaXAwX3RpbWVyID0gJm9jdGVvbl9pcnFfY2hpcF9jaXUwX3RpbWVyX3YyOworCQljaGlwMF9tYm94ID0gJm9jdGVvbl9pcnFfY2hpcF9jaXUwX21ib3hfdjI7CiAJCWNoaXAxID0gJm9jdGVvbl9pcnFfY2hpcF9jaXUxX3YyOworCQljaGlwMV93ZCA9ICZvY3Rlb25faXJxX2NoaXBfY2l1MV93ZF92MjsKIAl9IGVsc2UgeworCQlvY3Rlb25fY2l1MF9hY2sgPSBvY3Rlb25faXJxX2NpdTBfYWNrOworCQlvY3Rlb25fY2l1MV9hY2sgPSBvY3Rlb25faXJxX2NpdTFfYWNrOwogCQljaGlwMCA9ICZvY3Rlb25faXJxX2NoaXBfY2l1MDsKLQkJY2hpcDBfdGltZXIgPSAmb2N0ZW9uX2lycV9jaGlwX2NpdTBfdGltZXI7CisJCWNoaXAwX21ib3ggPSAmb2N0ZW9uX2lycV9jaGlwX2NpdTBfbWJveDsKIAkJY2hpcDEgPSAmb2N0ZW9uX2lycV9jaGlwX2NpdTE7CisJCWNoaXAxX3dkID0gJm9jdGVvbl9pcnFfY2hpcF9jaXUxX3dkOwogCX0KIAogCS8qIDAgLSAxNSByZXNlcnZlZCBmb3IgaTgyNTkgbWFzdGVyIGFuZCBzbGF2ZSBjb250cm9sbGVyLiAqLwpAQCAtNjUxLDM0ICs3MTgsMjMgQEAKIAkvKiAyNCAtIDg3IENJVV9JTlRfU1VNMCAqLwogCWZvciAoaXJxID0gT0NURU9OX0lSUV9XT1JLUTA7IGlycSA8PSBPQ1RFT05fSVJRX0JPT1RETUE7IGlycSsrKSB7CiAJCXN3aXRjaCAoaXJxKSB7Ci0JCWNhc2UgT0NURU9OX0lSUV9HTVhfRFJQMDoKLQkJY2FzZSBPQ1RFT05fSVJRX0dNWF9EUlAxOgotCQljYXNlIE9DVEVPTl9JUlFfSVBEX0RSUDoKLQkJY2FzZSBPQ1RFT05fSVJRX0tFWV9aRVJPOgotCQljYXNlIE9DVEVPTl9JUlFfVElNRVIwOgotCQljYXNlIE9DVEVPTl9JUlFfVElNRVIxOgotCQljYXNlIE9DVEVPTl9JUlFfVElNRVIyOgotCQljYXNlIE9DVEVPTl9JUlFfVElNRVIzOgotCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgY2hpcDBfdGltZXIsIGhhbmRsZV9wZXJjcHVfaXJxKTsKKwkJY2FzZSBPQ1RFT05fSVJRX01CT1gwOgorCQljYXNlIE9DVEVPTl9JUlFfTUJPWDE6CisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBjaGlwMF9tYm94LCBoYW5kbGVfcGVyY3B1X2lycSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsIGNoaXAwLCBoYW5kbGVfcGVyY3B1X2lycSk7CisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBjaGlwMCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCiAJLyogODggLSAxNTEgQ0lVX0lOVF9TVU0xICovCi0JZm9yIChpcnEgPSBPQ1RFT05fSVJRX1dET0cwOyBpcnEgPD0gT0NURU9OX0lSUV9SRVNFUlZFRDE1MTsgaXJxKyspIHsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgY2hpcDEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKLQl9CisJZm9yIChpcnEgPSBPQ1RFT05fSVJRX1dET0cwOyBpcnEgPD0gT0NURU9OX0lSUV9XRE9HMTU7IGlycSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBjaGlwMV93ZCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAotI2lmZGVmIENPTkZJR19QQ0lfTVNJCi0JLyogMTUyIC0gMjE1IFBDSS9QQ0llIE1TSSBpbnRlcnJ1cHRzICovCi0JZm9yIChpcnEgPSBPQ1RFT05fSVJRX01TSV9CSVQwOyBpcnEgPD0gT0NURU9OX0lSUV9NU0lfQklUNjM7IGlycSsrKSB7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZvY3Rlb25faXJxX2NoaXBfbXNpLAotCQkJCQkgaGFuZGxlX3BlcmNwdV9pcnEpOwotCX0KLSNlbmRpZgorCWZvciAoaXJxID0gT0NURU9OX0lSUV9VQVJUMjsgaXJxIDw9IE9DVEVPTl9JUlFfUkVTRVJWRUQxNTE7IGlycSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBjaGlwMSwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKKwogCXNldF9jMF9zdGF0dXMoMHgzMDAgPDwgMik7CiB9CiAKQEAgLTY5Myw2ICs3NDksNyBAQAogCXVuc2lnbmVkIGxvbmcgY29wMF9zdGF0dXM7CiAJdWludDY0X3QgY2l1X2VuOwogCXVpbnQ2NF90IGNpdV9zdW07CisJdW5zaWduZWQgaW50IGlycTsKIAogCXdoaWxlICgxKSB7CiAJCWNvcDBfY2F1c2UgPSByZWFkX2MwX2NhdXNlKCk7CkBAIC03MDQsMTggKzc2MSwyNCBAQAogCQkJY2l1X3N1bSA9IGN2bXhfcmVhZF9jc3IoY2l1X3N1bTBfYWRkcmVzcyk7CiAJCQljaXVfZW4gPSBjdm14X3JlYWRfY3NyKGNpdV9lbjBfYWRkcmVzcyk7CiAJCQljaXVfc3VtICY9IGNpdV9lbjsKLQkJCWlmIChsaWtlbHkoY2l1X3N1bSkpCi0JCQkJZG9fSVJRKGZsczY0KGNpdV9zdW0pICsgT0NURU9OX0lSUV9XT1JLUTAgLSAxKTsKLQkJCWVsc2UKKwkJCWlmIChsaWtlbHkoY2l1X3N1bSkpIHsKKwkJCQlpcnEgPSBmbHM2NChjaXVfc3VtKSArIE9DVEVPTl9JUlFfV09SS1EwIC0gMTsKKwkJCQlvY3Rlb25fY2l1MF9hY2soaXJxKTsKKwkJCQlkb19JUlEoaXJxKTsKKwkJCX0gZWxzZSB7CiAJCQkJc3B1cmlvdXNfaW50ZXJydXB0KCk7CisJCQl9CiAJCX0gZWxzZSBpZiAodW5saWtlbHkoY29wMF9jYXVzZSAmIFNUQVRVU0ZfSVAzKSkgewogCQkJY2l1X3N1bSA9IGN2bXhfcmVhZF9jc3IoY2l1X3N1bTFfYWRkcmVzcyk7CiAJCQljaXVfZW4gPSBjdm14X3JlYWRfY3NyKGNpdV9lbjFfYWRkcmVzcyk7CiAJCQljaXVfc3VtICY9IGNpdV9lbjsKLQkJCWlmIChsaWtlbHkoY2l1X3N1bSkpCi0JCQkJZG9fSVJRKGZsczY0KGNpdV9zdW0pICsgT0NURU9OX0lSUV9XRE9HMCAtIDEpOwotCQkJZWxzZQorCQkJaWYgKGxpa2VseShjaXVfc3VtKSkgeworCQkJCWlycSA9IGZsczY0KGNpdV9zdW0pICsgT0NURU9OX0lSUV9XRE9HMCAtIDE7CisJCQkJb2N0ZW9uX2NpdTFfYWNrKGlycSk7CisJCQkJZG9fSVJRKGlycSk7CisJCQl9IGVsc2UgewogCQkJCXNwdXJpb3VzX2ludGVycnVwdCgpOworCQkJfQogCQl9IGVsc2UgaWYgKGxpa2VseShjb3AwX2NhdXNlKSkgewogCQkJZG9fSVJRKGZscyhjb3AwX2NhdXNlKSAtIDkgKyBNSVBTX0NQVV9JUlFfQkFTRSk7CiAJCX0gZWxzZSB7CkBAIC03MjUsNTQgKzc4OCw4NCBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgaW50IGlzX2lycV9lbmFibGVkX29uX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgY3B1KQotewotCXVuc2lnbmVkIGludCBpc3NldDsKLQlpbnQgY29yZWlkID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSk7Ci0JaW50IGJpdCA9IChpcnEgPCBPQ1RFT05fSVJRX1dET0cwKSA/Ci0JCSAgIGlycSAtIE9DVEVPTl9JUlFfV09SS1EwIDogaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsKLSAgICAgICBpZiAoaXJxIDwgNjQpIHsKLQkJaXNzZXQgPSAoY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSkgJgotCQkJKDF1bGwgPDwgYml0KSkgPj4gYml0OwotICAgICAgIH0gZWxzZSB7Ci0JICAgICAgIGlzc2V0ID0gKGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKSAmCi0JCQkoMXVsbCA8PCBiaXQpKSA+PiBiaXQ7Ci0gICAgICAgfQotICAgICAgIHJldHVybiBpc3NldDsKLX0KIAogdm9pZCBmaXh1cF9pcnFzKHZvaWQpCiB7Ci0gICAgICAgaW50IGlycTsKKwlpbnQgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwljcHVtYXNrX3QgbmV3X2FmZmluaXR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGRvX3NldF9hZmZpbml0eTsKKwlpbnQgY3B1OworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJZm9yIChpcnEgPSBPQ1RFT05fSVJRX1NXMDsgaXJxIDw9IE9DVEVPTl9JUlFfVElNRVI7IGlycSsrKQogCQlvY3Rlb25faXJxX2NvcmVfZGlzYWJsZV9sb2NhbChpcnEpOwogCi0JZm9yIChpcnEgPSBPQ1RFT05fSVJRX1dPUktRMDsgaXJxIDw9IE9DVEVPTl9JUlFfR1BJTzE1OyBpcnErKykgewotCQlpZiAoaXNfaXJxX2VuYWJsZWRfb25fY3B1KGlycSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSkgewotCQkJLyogY2l1IGlycSBtaWdyYXRlcyB0byBuZXh0IGNwdSAqLwotCQkJb2N0ZW9uX2lycV9jaGlwX2NpdTAuZGlzYWJsZShpcnEpOwotCQkJb2N0ZW9uX2lycV9jaXUwX3NldF9hZmZpbml0eShpcnEsICZjcHVfb25saW5lX21hcCk7Ci0JCX0KLQl9CisJZm9yIChpcnEgPSBPQ1RFT05fSVJRX1dPUktRMDsgaXJxIDwgT0NURU9OX0lSUV9MQVNUOyBpcnErKykgeworCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwkJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSBPQ1RFT05fSVJRX01CT1gwOgorCQljYXNlIE9DVEVPTl9JUlFfTUJPWDE6CisJCQkvKiBUaGUgZW9pIGZ1bmN0aW9uIHdpbGwgZGlzYWJsZSB0aGVtIG9uIHRoaXMgQ1BVLiAqLworCQkJZGVzYy0+Y2hpcC0+ZW9pKGlycSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ1RFT05fSVJRX1dET0cwOgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzE6CisJCWNhc2UgT0NURU9OX0lSUV9XRE9HMjoKKwkJY2FzZSBPQ1RFT05fSVJRX1dET0czOgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzQ6CisJCWNhc2UgT0NURU9OX0lSUV9XRE9HNToKKwkJY2FzZSBPQ1RFT05fSVJRX1dET0c2OgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzc6CisJCWNhc2UgT0NURU9OX0lSUV9XRE9HODoKKwkJY2FzZSBPQ1RFT05fSVJRX1dET0c5OgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzEwOgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzExOgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzEyOgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzEzOgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzE0OgorCQljYXNlIE9DVEVPTl9JUlFfV0RPRzE1OgorCQkJLyoKKwkJCSAqIFRoZXNlIGhhdmUgc3BlY2lhbCBwZXIgQ1BVIHNlbWFudGljcyBhbmQKKwkJCSAqIGFyZSBoYW5kbGVkIGluIHRoZSB3YXRjaGRvZyBkcml2ZXIuCisJCQkgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJCQkvKgorCQkJICogSWYgdGhpcyBpcnEgaGFzIGFuIGFjdGlvbiwgaXQgaXMgaW4gdXNlIGFuZAorCQkJICogbXVzdCBiZSBtaWdyYXRlZCBpZiBpdCBoYXMgYWZmaW5pdHkgdG8gdGhpcworCQkJICogY3B1LgorCQkJICovCisJCQlpZiAoZGVzYy0+YWN0aW9uICYmIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXNjLT5hZmZpbml0eSkpIHsKKwkJCQlpZiAoY3B1bWFza193ZWlnaHQoZGVzYy0+YWZmaW5pdHkpID4gMSkgeworCQkJCQkvKgorCQkJCQkgKiBJdCBoYXMgbXVsdGkgQ1BVIGFmZmluaXR5LAorCQkJCQkgKiBqdXN0IHJlbW92ZSB0aGlzIENQVSBmcm9tCisJCQkJCSAqIHRoZSBhZmZpbml0eSBzZXQuCisJCQkJCSAqLworCQkJCQljcHVtYXNrX2NvcHkoJm5ld19hZmZpbml0eSwgZGVzYy0+YWZmaW5pdHkpOworCQkJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZuZXdfYWZmaW5pdHkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIE90aGVyd2lzZSwgcHV0IGl0IG9uIGxvd2VzdAorCQkJCQkgKiBudW1iZXJlZCBvbmxpbmUgQ1BVLgorCQkJCQkgKi8KKwkJCQkJY3B1bWFza19jbGVhcigmbmV3X2FmZmluaXR5KTsKKwkJCQkJY3B1bWFza19zZXRfY3B1KGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKSwgJm5ld19hZmZpbml0eSk7CisJCQkJfQorCQkJCWRvX3NldF9hZmZpbml0eSA9IDE7CisJCQl9IGVsc2UgeworCQkJCWRvX3NldF9hZmZpbml0eSA9IDA7CisJCQl9CisJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCi0jaWYgMAotCWZvciAoaXJxID0gT0NURU9OX0lSUV9NQk9YMDsgaXJxIDw9IE9DVEVPTl9JUlFfTUJPWDE7IGlycSsrKQotCQlvY3Rlb25faXJxX21haWxib3hfbWFzayhpcnEpOwotI2VuZGlmCi0JZm9yIChpcnEgPSBPQ1RFT05fSVJRX1VBUlQwOyBpcnEgPD0gT0NURU9OX0lSUV9CT09URE1BOyBpcnErKykgewotCQlpZiAoaXNfaXJxX2VuYWJsZWRfb25fY3B1KGlycSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSkgewotCQkJLyogY2l1IGlycSBtaWdyYXRlcyB0byBuZXh0IGNwdSAqLwotCQkJb2N0ZW9uX2lycV9jaGlwX2NpdTAuZGlzYWJsZShpcnEpOwotCQkJb2N0ZW9uX2lycV9jaXUwX3NldF9hZmZpbml0eShpcnEsICZjcHVfb25saW5lX21hcCk7Ci0JCX0KLQl9CisJCQlpZiAoZG9fc2V0X2FmZmluaXR5KQorCQkJCWlycV9zZXRfYWZmaW5pdHkoaXJxLCAmbmV3X2FmZmluaXR5KTsKIAotCWZvciAoaXJxID0gT0NURU9OX0lSUV9VQVJUMjsgaXJxIDw9IE9DVEVPTl9JUlFfUkVTRVJWRUQxMzU7IGlycSsrKSB7Ci0JCWlmIChpc19pcnFfZW5hYmxlZF9vbl9jcHUoaXJxLCBzbXBfcHJvY2Vzc29yX2lkKCkpKSB7Ci0JCQkvKiBjaXUgaXJxIG1pZ3JhdGVzIHRvIG5leHQgY3B1ICovCi0JCQlvY3Rlb25faXJxX2NoaXBfY2l1MS5kaXNhYmxlKGlycSk7Ci0JCQlvY3Rlb25faXJxX2NpdTFfc2V0X2FmZmluaXR5KGlycSwgJmNwdV9vbmxpbmVfbWFwKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uX2Jvb3QuaCBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbl9ib290LmgKaW5kZXggMGY3Zjg0YS4uNDI4ODY0YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uX2Jvb3QuaAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb25fYm9vdC5oCkBAIC0yMywxNCArMjMsMTYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiBzdHJ1Y3QgYm9vdF9pbml0X3ZlY3RvciB7Ci0JdWludDMyX3Qgc3RhY2tfYWRkcjsKLQl1aW50MzJfdCBjb2RlX2FkZHI7CisJLyogRmlyc3Qgc3RhZ2UgYWRkcmVzcyAtIGluIHJhbSBpbnN0ZWFkIG9mIGZsYXNoICovCisJdWludDY0X3QgY29kZV9hZGRyOworCS8qIFNldHVwIGNvZGUgZm9yIGFwcGxpY2F0aW9uLCBOT1QgYXBwbGljYXRpb24gZW50cnkgcG9pbnQgKi8KIAl1aW50MzJfdCBhcHBfc3RhcnRfZnVuY19hZGRyOworCS8qIGswIGlzIHVzZWQgZm9yIGdsb2JhbCBkYXRhIC0gbmVlZHMgdG8gYmUgcGFzc2VkIHRvIG90aGVyIGNvcmVzICovCiAJdWludDMyX3QgazBfdmFsOwotCXVpbnQzMl90IGZsYWdzOwotCXVpbnQzMl90IGJvb3RfaW5mb19hZGRyOworCS8qIEFkZHJlc3Mgb2YgYm9vdCBpbmZvIGJsb2NrIHN0cnVjdHVyZSAqLworCXVpbnQ2NF90IGJvb3RfaW5mb19hZGRyOworCXVpbnQzMl90IGZsYWdzOyAgICAgICAgIC8qIGZsYWdzICovCiAJdWludDMyX3QgcGFkOwotCXVpbnQzMl90IHBhZDI7CiB9OwogCiAvKiBzaW1pbGFyIHRvIGJvb3Rsb2FkZXIncyBsaW51eF9hcHBfYm9vdF9pbmZvIGJ1dCB3aXRob3V0IGdsb2JhbCBkYXRhICovCkBAIC00MCw3ICs0Miw3IEBACiAJdWludDMyX3QgYXZhaWxfY29yZW1hc2s7CiAJdWludDMyX3QgcGNpX2NvbnNvbGVfYWN0aXZlOwogCXVpbnQzMl90IGljYWNoZV9wcmVmZXRjaF9kaXNhYmxlOwotCXVpbnQzMl90IEluaXRUTEJTdGFydF9hZGRyOworCXVpbnQ2NF90IEluaXRUTEJTdGFydF9hZGRyOwogCXVpbnQzMl90IHN0YXJ0X2FwcF9hZGRyOwogCXVpbnQzMl90IGN1cl9leGNlcHRpb25fYmFzZTsKIAl1aW50MzJfdCBub19tYXJrX3ByaXZhdGVfZGF0YTsKQEAgLTU4LDcgKzYwLDcgQEAKIAogI2RlZmluZSBMSU5VWF9BUFBfQk9PVF9CTE9DS19OQU1FICJsaW51eC1hcHAtYm9vdCIKIAotI2RlZmluZSBMQUJJX1NJR05BVFVSRSAweEFBQkJDQ0RECisjZGVmaW5lIExBQklfU0lHTkFUVVJFIDB4QUFCQkNDMDEKIAogLyogIGZyb20gdWJvb3QtaGVhZGVycy9vY3Rlb25fbWVtX21hcC5oICovCiAjZGVmaW5lIEVYQ0VQVElPTl9CQVNFX0lOQ1IgICAgICg0ICogMTAyNCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NlcmlhbC5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc2VyaWFsLmMKaW5kZXggODNlYWMzNy4uNjM4YWRhYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc2VyaWFsLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc2VyaWFsLmMKQEAgLTE4LDExICsxOCw3IEBACiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgogCi0jaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCi0jZGVmaW5lIERFQlVHX1VBUlQgMAotI2Vsc2UKICNkZWZpbmUgREVCVUdfVUFSVCAxCi0jZW5kaWYKIAogdW5zaWduZWQgaW50IG9jdGVvbl9zZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqdXAsIGludCBvZmZzZXQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zZXR1cC5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc2V0dXAuYwppbmRleCBkMWI1ZmZhLi42OTE5N2NiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NldHVwLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogCiAjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL3BjaS1vY3Rlb24uaD4KIAogI2lmZGVmIENPTkZJR19DQVZJVU1fREVDT0RFX1JTTAogZXh0ZXJuIHZvaWQgY3ZteF9pbnRlcnJ1cHRfcnNsX2RlY29kZSh2b2lkKTsKQEAgLTU3OCw5ICs1NzksNiBAQAogCX0KIAogCWlmIChzdHJzdHIoYXJjc19jbWRsaW5lLCAiY29uc29sZT0iKSA9PSBOVUxMKSB7Ci0jaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCi0JCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgY29uc29sZT1nZGIiKTsKLSNlbHNlCiAjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fMk5EX0tFUk5FTAogCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiIGNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CiAjZWxzZQpAQCAtNTg5LDcgKzU4Nyw2IEBACiAJCWVsc2UKIAkJCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKICNlbmRpZgotI2VuZGlmCiAJfQogCiAJaWYgKG9jdGVvbl9pc19zaW11bGF0aW9uKCkpIHsKQEAgLTU5OCwxMyArNTk1LDEzIEBACiAJCSAqIHRoZSBmaWxlc3lzdGVtLiBBbHNvIHNwZWNpZnkgdGhlIGNhbGlicmF0aW9uIGRlbGF5CiAJCSAqIHRvIGF2b2lkIGNhbGN1bGF0aW5nIGl0IGV2ZXJ5IHRpbWUuCiAJCSAqLwotCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiIHJ3IHJvb3Q9MWYwMCIKLQkJICAgICAgICIgbHBqPTYwMTc2IHNscmFtPXJvb3QsMHg0MDAwMDAwMCwrMTA3Mzc0MTgyNCIpOworCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiIHJ3IHJvb3Q9MWYwMCBzbHJhbT1yb290LDB4NDAwMDAwMDAsKzEwNzM3NDE4MjQiKTsKIAl9CiAKIAltaXBzX2hwdF9mcmVxdWVuY3kgPSBvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKTsKIAogCW9jdGVvbl9pbml0X2N2bWNvdW50KCk7CisJb2N0ZW9uX3NldHVwX2RlbGF5cygpOwogCiAJX21hY2hpbmVfcmVzdGFydCA9IG9jdGVvbl9yZXN0YXJ0OwogCV9tYWNoaW5lX2hhbHQgPSBvY3Rlb25faGFsdDsKQEAgLTYxMyw2ICs2MTAsMjIgQEAKIAlyZWdpc3Rlcl9zbXBfb3BzKCZvY3Rlb25fc21wX29wcyk7CiB9CiAKKy8qIEV4Y2x1ZGUgYSBzaW5nbGUgcGFnZSBmcm9tIHRoZSByZWdpb25zIG9idGFpbmVkIGluIHBsYXRfbWVtX3NldHVwLiAqLworc3RhdGljIF9faW5pdCB2b2lkIG1lbW9yeV9leGNsdWRlX3BhZ2UodTY0IGFkZHIsIHU2NCAqbWVtLCB1NjQgKnNpemUpCit7CisJaWYgKGFkZHIgPiAqbWVtICYmIGFkZHIgPCAqbWVtICsgKnNpemUpIHsKKwkJdTY0IGluYyA9IGFkZHIgLSAqbWVtOworCQlhZGRfbWVtb3J5X3JlZ2lvbigqbWVtLCBpbmMsIEJPT1RfTUVNX1JBTSk7CisJCSptZW0gKz0gaW5jOworCQkqc2l6ZSAtPSBpbmM7CisJfQorCisJaWYgKGFkZHIgPT0gKm1lbSAmJiAqc2l6ZSA+IFBBR0VfU0laRSkgeworCQkqbWVtICs9IFBBR0VfU0laRTsKKwkJKnNpemUgLT0gUEFHRV9TSVpFOworCX0KK30KKwogdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKIHsKIAl1aW50NjRfdCBtZW1fYWxsb2Nfc2l6ZTsKQEAgLTY2MywxMiArNjc2LDI3IEBACiAJCQkJCQlDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKTsKICNlbmRpZgogCQlpZiAobWVtb3J5ID49IDApIHsKKwkJCXU2NCBzaXplID0gbWVtX2FsbG9jX3NpemU7CisKKwkJCS8qCisJCQkgKiBleGNsdWRlIGEgcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YKKwkJCSAqIHRoZSAyNTZNQiBQQ0llICdob2xlJyBzbyB0aGUga2VybmVsIHdpbGwgbm90CisJCQkgKiB0cnkgdG8gYWxsb2NhdGUgbXVsdGktcGFnZSBidWZmZXJzIHRoYXQKKwkJCSAqIHNwYW4gdGhlIGRpc2NvbnRpbnVpdHkuCisJCQkgKi8KKwkJCW1lbW9yeV9leGNsdWRlX3BhZ2UoQ1ZNWF9QQ0lFX0JBUjFfUEhZU19CQVNFLAorCQkJCQkgICAgJm1lbW9yeSwgJnNpemUpOworCQkJbWVtb3J5X2V4Y2x1ZGVfcGFnZShDVk1YX1BDSUVfQkFSMV9QSFlTX0JBU0UgKworCQkJCQkgICAgQ1ZNWF9QQ0lFX0JBUjFfUEhZU19TSVpFLAorCQkJCQkgICAgJm1lbW9yeSwgJnNpemUpOworCiAJCQkvKgogCQkJICogVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IG1lcmdlcyBhZGRyZXNzCiAJCQkgKiByZWdpb25zIG5leHQgdG8gZWFjaCBvdGhlciBpZiB0aGV5IGFyZQogCQkJICogcmVjZWl2ZWQgaW4gaW5jcmVtZW50aW5nIG9yZGVyLgogCQkJICovCi0JCQlhZGRfbWVtb3J5X3JlZ2lvbihtZW1vcnksIG1lbV9hbGxvY19zaXplLCBCT09UX01FTV9SQU0pOworCQkJaWYgKHNpemUpCisJCQkJYWRkX21lbW9yeV9yZWdpb24obWVtb3J5LCBzaXplLCBCT09UX01FTV9SQU0pOwogCQkJdG90YWwgKz0gbWVtX2FsbG9jX3NpemU7CiAJCX0gZWxzZSB7CiAJCQlicmVhazsKQEAgLTY5MSw3ICs3MTksMTAgQEAKIAkJICAgICAgImN2bXhfYm9vdG1lbV9waHlfYWxsb2NcbiIpOwogfQogCi0KKy8qCisgKiBFbWl0IG9uZSBjaGFyYWN0ZXIgdG8gdGhlIGJvb3QgVUFSVC4gIEV4cG9ydGVkIGZvciB1c2UgYnkgdGhlCisgKiB3YXRjaGRvZyB0aW1lci4KKyAqLwogaW50IHByb21fcHV0Y2hhcihjaGFyIGMpCiB7CiAJdWludDY0X3QgbHNydmFsOwpAQCAtNzA1LDYgKzczNiw3IEBACiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9NSU9fVUFSVFhfVEhSKG9jdGVvbl91YXJ0KSwgYyAmIDB4ZmZ1bGwpOwogCXJldHVybiAxOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX3B1dGNoYXIpOwogCiB2b2lkIHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwppbmRleCA2ZDk5YjlkLi4zOTFjZWZlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwpAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCwgMjAwOSwgMjAxMCBDYXZpdW0gTmV0d29ya3MKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI3LDcgKzI3LDggQEAKIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgb2N0ZW9uX3Byb2Nlc3Nvcl9ncDsKIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIHVuc2lnbmVkIGludCBJbml0VExCU3RhcnRfYWRkcjsKK3VpbnQ2NF90IG9jdGVvbl9ib290bG9hZGVyX2VudHJ5X2FkZHI7CitFWFBPUlRfU1lNQk9MKG9jdGVvbl9ib290bG9hZGVyX2VudHJ5X2FkZHIpOwogI2VuZGlmCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtYWlsYm94X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC04MCwyMCArODEsMTMgQEAKIHN0YXRpYyB2b2lkIG9jdGVvbl9zbXBfaG90cGx1Z19zZXR1cCh2b2lkKQogewogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXVpbnQzMl90IGxhYmlfc2lnbmF0dXJlOworCXN0cnVjdCBsaW51eF9hcHBfYm9vdF9pbmZvICpsYWJpOwogCi0JbGFiaV9zaWduYXR1cmUgPQotCQljdm14X3JlYWQ2NF91aW50MzIoQ1ZNWF9BRERfU0VHKENWTVhfTUlQU19TUEFDRV9YS1BIWVMsCi0JCQkJCUxBQklfQUREUl9JTl9CT09UTE9BREVSICsKLQkJCQkJb2Zmc2V0b2Yoc3RydWN0IGxpbnV4X2FwcF9ib290X2luZm8sCi0JCQkJCQkgICAgbGFiaV9zaWduYXR1cmUpKSk7Ci0JaWYgKGxhYmlfc2lnbmF0dXJlICE9IExBQklfU0lHTkFUVVJFKQotCQlwcl9lcnIoIlRoZSBib290bG9hZGVyIHZlcnNpb24gb24gdGhpcyBib2FyZCBpcyBpbmNvcnJlY3RcbiIpOwotCUluaXRUTEJTdGFydF9hZGRyID0KLQkJY3ZteF9yZWFkNjRfdWludDMyKENWTVhfQUREX1NFRyhDVk1YX01JUFNfU1BBQ0VfWEtQSFlTLAotCQkJCSAgIExBQklfQUREUl9JTl9CT09UTE9BREVSICsKLQkJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGxpbnV4X2FwcF9ib290X2luZm8sCi0JCQkJCQkgICAgSW5pdFRMQlN0YXJ0X2FkZHIpKSk7CisJbGFiaSA9IChzdHJ1Y3QgbGludXhfYXBwX2Jvb3RfaW5mbyAqKVBIWVNfVE9fWEtTRUdfQ0FDSEVEKExBQklfQUREUl9JTl9CT09UTE9BREVSKTsKKwlpZiAobGFiaS0+bGFiaV9zaWduYXR1cmUgIT0gTEFCSV9TSUdOQVRVUkUpCisJCXBhbmljKCJUaGUgYm9vdGxvYWRlciB2ZXJzaW9uIG9uIHRoaXMgYm9hcmQgaXMgaW5jb3JyZWN0LiIpOworCisJb2N0ZW9uX2Jvb3Rsb2FkZXJfZW50cnlfYWRkciA9IGxhYmktPkluaXRUTEJTdGFydF9hZGRyOwogI2VuZGlmCiB9CiAKQEAgLTEwMiwyNCArOTYsNDcgQEAKIAljb25zdCBpbnQgY29yZWlkID0gY3ZteF9nZXRfY29yZV9udW0oKTsKIAlpbnQgY3B1czsKIAlpbnQgaWQ7Ci0KIAlpbnQgY29yZV9tYXNrID0gb2N0ZW9uX2dldF9ib290X2NvcmVtYXNrKCk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJdW5zaWduZWQgaW50IG51bV9jb3JlcyA9IGN2bXhfb2N0ZW9uX251bV9jb3JlcygpOworI2VuZGlmCiAKLQljcHVzX2NsZWFyKGNwdV9wb3NzaWJsZV9tYXApOworCS8qIFRoZSBwcmVzZW50IENQVXMgYXJlIGluaXRpYWxseSBqdXN0IHRoZSBib290IGNwdSAoQ1BVIDApLiAqLworCWZvciAoaWQgPSAwOyBpZCA8IE5SX0NQVVM7IGlkKyspIHsKKwkJc2V0X2NwdV9wb3NzaWJsZShpZCwgaWQgPT0gMCk7CisJCXNldF9jcHVfcHJlc2VudChpZCwgaWQgPT0gMCk7CisJfQorCiAJX19jcHVfbnVtYmVyX21hcFtjb3JlaWRdID0gMDsKIAlfX2NwdV9sb2dpY2FsX21hcFswXSA9IGNvcmVpZDsKLQljcHVfc2V0KDAsIGNwdV9wb3NzaWJsZV9tYXApOwogCisJLyogVGhlIHByZXNlbnQgQ1BVcyBnZXQgdGhlIGxvd2VzdCBDUFUgbnVtYmVycy4gKi8KIAljcHVzID0gMTsKLQlmb3IgKGlkID0gMDsgaWQgPCAxNjsgaWQrKykgeworCWZvciAoaWQgPSAwOyBpZCA8IE5SX0NQVVM7IGlkKyspIHsKIAkJaWYgKChpZCAhPSBjb3JlaWQpICYmIChjb3JlX21hc2sgJiAoMSA8PCBpZCkpKSB7Ci0JCQljcHVfc2V0KGNwdXMsIGNwdV9wb3NzaWJsZV9tYXApOworCQkJc2V0X2NwdV9wb3NzaWJsZShjcHVzLCB0cnVlKTsKKwkJCXNldF9jcHVfcHJlc2VudChjcHVzLCB0cnVlKTsKIAkJCV9fY3B1X251bWJlcl9tYXBbaWRdID0gY3B1czsKIAkJCV9fY3B1X2xvZ2ljYWxfbWFwW2NwdXNdID0gaWQ7CiAJCQljcHVzKys7CiAJCX0KIAl9Ci0JY3B1X3ByZXNlbnRfbWFwID0gY3B1X3Bvc3NpYmxlX21hcDsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCS8qCisJICogVGhlIHBvc3NpYmxlIENQVXMgYXJlIGFsbCB0aG9zZSBwcmVzZW50IG9uIHRoZSBjaGlwLiAgV2UKKwkgKiB3aWxsIGFzc2lnbiBDUFUgbnVtYmVycyBmb3IgcG9zc2libGUgY29yZXMgYXMgd2VsbC4gIENvcmVzCisJICogYXJlIGFsd2F5cyBjb25zZWN1dGl2ZWx5IG51bWJlcmQgZnJvbSAwLgorCSAqLworCWZvciAoaWQgPSAwOyBpZCA8IG51bV9jb3JlcyAmJiBpZCA8IE5SX0NQVVM7IGlkKyspIHsKKwkJaWYgKCEoY29yZV9tYXNrICYgKDEgPDwgaWQpKSkgeworCQkJc2V0X2NwdV9wb3NzaWJsZShjcHVzLCB0cnVlKTsKKwkJCV9fY3B1X251bWJlcl9tYXBbaWRdID0gY3B1czsKKwkJCV9fY3B1X2xvZ2ljYWxfbWFwW2NwdXNdID0gaWQ7CisJCQljcHVzKys7CisJCX0KKwl9CisjZW5kaWYKIAogCW9jdGVvbl9zbXBfaG90cGx1Z19zZXR1cCgpOwogfQpAQCAtMTU4LDE4ICsxNzUsMjEgQEAKIHsKIAljb25zdCBpbnQgY29yZWlkID0gY3ZteF9nZXRfY29yZV9udW0oKTsKIAl1bmlvbiBjdm14X2NpdV9pbnR4X3N1bTAgaW50ZXJydXB0X2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgc3I7CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQl1bnNpZ25lZCBpbnQgY3VyX2V4Y2VwdGlvbl9iYXNlOworCXN0cnVjdCBsaW51eF9hcHBfYm9vdF9pbmZvICpsYWJpOwogCi0JY3VyX2V4Y2VwdGlvbl9iYXNlID0gY3ZteF9yZWFkNjRfdWludDMyKAotCQlDVk1YX0FERF9TRUcoQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUywKLQkJCSAgICAgTEFCSV9BRERSX0lOX0JPT1RMT0FERVIgKwotCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgbGludXhfYXBwX2Jvb3RfaW5mbywKLQkJCQkgICAgICBjdXJfZXhjZXB0aW9uX2Jhc2UpKSk7Ci0JLyogY3VyX2V4Y2VwdGlvbl9iYXNlIGlzIGluY3JlbWVudGVkIGluIGJvb3Rsb2FkZXIgYWZ0ZXIgc2V0dGluZyAqLwotCXdyaXRlX2MwX2ViYXNlKCh1bnNpZ25lZCBpbnQpKGN1cl9leGNlcHRpb25fYmFzZSAtIEVYQ0VQVElPTl9CQVNFX0lOQ1IpKTsKKwlsYWJpID0gKHN0cnVjdCBsaW51eF9hcHBfYm9vdF9pbmZvICopUEhZU19UT19YS1NFR19DQUNIRUQoTEFCSV9BRERSX0lOX0JPT1RMT0FERVIpOworCisJaWYgKGxhYmktPmxhYmlfc2lnbmF0dXJlICE9IExBQklfU0lHTkFUVVJFKQorCQlwYW5pYygiVGhlIGJvb3Rsb2FkZXIgdmVyc2lvbiBvbiB0aGlzIGJvYXJkIGlzIGluY29ycmVjdC4iKTsKICNlbmRpZgorCisJc3IgPSBzZXRfYzBfc3RhdHVzKFNUMF9CRVYpOworCXdyaXRlX2MwX2ViYXNlKCh1MzIpZWJhc2UpOworCXdyaXRlX2MwX3N0YXR1cyhzcik7CisKIAlvY3Rlb25fY2hlY2tfY3B1X2Jpc3QoKTsKIAlvY3Rlb25faW5pdF9jdm1jb3VudCgpOwogCS8qCkBAIC0yNzYsOCArMjk2LDggQEAKIHN0YXRpYyB2b2lkIG9jdGVvbl9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGNvcmVpZCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOwotCXVpbnQzMl90IGF2YWlsX2NvcmVtYXNrOwotCXN0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqYmxvY2tfZGVzYzsKKwl1aW50MzJfdCBtYXNrLCBuZXdfbWFzazsKKwljb25zdCBzdHJ1Y3QgY3ZteF9ib290bWVtX25hbWVkX2Jsb2NrX2Rlc2MgKmJsb2NrX2Rlc2M7CiAKIAl3aGlsZSAocGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgIT0gQ1BVX0RFQUQpCiAJCWNwdV9yZWxheCgpOwpAQCAtMjg2LDUyICszMDYsNDAgQEAKIAkgKiBUaGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkIHN0cmF0ZWdpY3Mgb2YgZ2V0dGluZy9zZXR0aWcgYXZhaWxhYmxlCiAJICogY29yZXMgbWFzaywgY29waWVkIGZyb20gYm9vdGxvYWRlcgogCSAqLworCisJbWFzayA9IDEgPDwgY29yZWlkOwogCS8qIExJTlVYX0FQUF9CT09UX0JMT0NLIGlzIGluaXRpYWxpemVkIGluIGJvb3RvY3QgYmluYXJ5ICovCiAJYmxvY2tfZGVzYyA9IGN2bXhfYm9vdG1lbV9maW5kX25hbWVkX2Jsb2NrKExJTlVYX0FQUF9CT09UX0JMT0NLX05BTUUpOwogCiAJaWYgKCFibG9ja19kZXNjKSB7Ci0JCWF2YWlsX2NvcmVtYXNrID0KLQkJCWN2bXhfcmVhZDY0X3VpbnQzMihDVk1YX0FERF9TRUcoQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUywKLQkJCQkJCSAgIExBQklfQUREUl9JTl9CT09UTE9BREVSICsKLQkJCQkJCSAgIG9mZnNldG9mCi0JCQkJCQkgICAoc3RydWN0IGxpbnV4X2FwcF9ib290X2luZm8sCi0JCQkJCQkgICAgYXZhaWxfY29yZW1hc2spKSk7CisJCXN0cnVjdCBsaW51eF9hcHBfYm9vdF9pbmZvICpsYWJpOworCisJCWxhYmkgPSAoc3RydWN0IGxpbnV4X2FwcF9ib290X2luZm8gKilQSFlTX1RPX1hLU0VHX0NBQ0hFRChMQUJJX0FERFJfSU5fQk9PVExPQURFUik7CisKKwkJbGFiaS0+YXZhaWxfY29yZW1hc2sgfD0gbWFzazsKKwkJbmV3X21hc2sgPSBsYWJpLT5hdmFpbF9jb3JlbWFzazsKIAl9IGVsc2UgewkJICAgICAgIC8qIGFsdGVybmF0aXZlLCBhbHJlYWR5IGluaXRpYWxpemVkICovCi0JICAgICAgIGF2YWlsX2NvcmVtYXNrID0KLQkJICAgY3ZteF9yZWFkNjRfdWludDMyKENWTVhfQUREX1NFRyhDVk1YX01JUFNfU1BBQ0VfWEtQSFlTLAotCQkJCQkJICAgYmxvY2tfZGVzYy0+YmFzZV9hZGRyICsKLQkJCQkJCSAgQVZBSUxfQ09SRU1BU0tfT0ZGU0VUX0lOX0xJTlVYX0FQUF9CT09UX0JMT0NLKSk7CisJCXVpbnQzMl90ICpwID0gKHVpbnQzMl90ICopUEhZU19UT19YS1NFR19DQUNIRUQoYmxvY2tfZGVzYy0+YmFzZV9hZGRyICsKKwkJCQkJCQkgICAgICAgQVZBSUxfQ09SRU1BU0tfT0ZGU0VUX0lOX0xJTlVYX0FQUF9CT09UX0JMT0NLKTsKKwkJKnAgfD0gbWFzazsKKwkJbmV3X21hc2sgPSAqcDsKIAl9CiAKLQlhdmFpbF9jb3JlbWFzayB8PSAxIDw8IGNvcmVpZDsKLQotCS8qIFNldHRpbmcgYXZhaWxfY29yZW1hc2sgZm9yIGJvb3RvY3QgYmluYXJ5ICovCi0JaWYgKCFibG9ja19kZXNjKSB7Ci0JCWN2bXhfd3JpdGU2NF91aW50MzIoQ1ZNWF9BRERfU0VHKENWTVhfTUlQU19TUEFDRV9YS1BIWVMsCi0JCQkJCQlMQUJJX0FERFJfSU5fQk9PVExPQURFUiArCi0JCQkJCQlvZmZzZXRvZihzdHJ1Y3QgbGludXhfYXBwX2Jvb3RfaW5mbywKLQkJCQkJCQkgYXZhaWxfY29yZW1hc2spKSwKLQkJCQkgICBhdmFpbF9jb3JlbWFzayk7Ci0JfSBlbHNlIHsKLQkJY3ZteF93cml0ZTY0X3VpbnQzMihDVk1YX0FERF9TRUcoQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUywKLQkJCQkJCWJsb2NrX2Rlc2MtPmJhc2VfYWRkciArCi0JCQkJCQlBVkFJTF9DT1JFTUFTS19PRkZTRVRfSU5fTElOVVhfQVBQX0JPT1RfQkxPQ0spLAotCQkJCSAgIGF2YWlsX2NvcmVtYXNrKTsKLQl9Ci0KLQlwcl9pbmZvKCJSZXNldCBjb3JlICVkLiBBdmFpbGFibGUgQ29yZW1hc2sgPSAleFxuIiwgY29yZWlkLAotCQlhdmFpbF9jb3JlbWFzayk7CisJcHJfaW5mbygiUmVzZXQgY29yZSAlZC4gQXZhaWxhYmxlIENvcmVtYXNrID0gMHgleCBcbiIsIGNvcmVpZCwgbmV3X21hc2spOworCW1iKCk7CiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfUFBfUlNULCAxIDw8IGNvcmVpZCk7CiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfUFBfUlNULCAwKTsKIH0KIAogdm9pZCBwbGF5X2RlYWQodm9pZCkKIHsKLQlpbnQgY29yZWlkID0gY3ZteF9nZXRfY29yZV9udW0oKTsKKwlpbnQgY3B1ID0gY3B1X251bWJlcl9tYXAoY3ZteF9nZXRfY29yZV9udW0oKSk7CiAKIAlpZGxlX3Rhc2tfZXhpdCgpOwogCW9jdGVvbl9wcm9jZXNzb3JfYm9vdCA9IDB4ZmY7Ci0JcGVyX2NwdShjcHVfc3RhdGUsIGNvcmVpZCkgPSBDUFVfREVBRDsKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSA9IENQVV9ERUFEOworCisJbWIoKTsKIAogCXdoaWxlICgxKQkvKiBjb3JlIHdpbGwgYmUgcmVzZXQgaGVyZSAqLwogCQk7CkBAIC0zNDQsMjkgKzM1MiwyNyBAQAogCWtlcm5lbF9lbnRyeSgwLCAwLCAwKTsgIC8qIHNldCBhMiA9IDAgZm9yIHNlY29uZGFyeSBjb3JlICovCiB9CiAKLWludCBvY3Rlb25fdXBkYXRlX2Jvb3RfdmVjdG9yKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW50IG9jdGVvbl91cGRhdGVfYm9vdF92ZWN0b3IodW5zaWduZWQgaW50IGNwdSkKIHsKIAogCWludCBjb3JlaWQgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKLQl1bnNpZ25lZCBpbnQgYXZhaWxfY29yZW1hc2s7Ci0Jc3RydWN0IGN2bXhfYm9vdG1lbV9uYW1lZF9ibG9ja19kZXNjICpibG9ja19kZXNjOworCXVpbnQzMl90IGF2YWlsX2NvcmVtYXNrOworCWNvbnN0IHN0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqYmxvY2tfZGVzYzsKIAlzdHJ1Y3QgYm9vdF9pbml0X3ZlY3RvciAqYm9vdF92ZWN0ID0KLQkJKHN0cnVjdCBib290X2luaXRfdmVjdG9yICopIGN2bXhfcGh5c190b19wdHIoMHgwICsKLQkJCQkJCSAgQk9PVExPQURFUl9CT09UX1ZFQ1RPUik7CisJCShzdHJ1Y3QgYm9vdF9pbml0X3ZlY3RvciAqKVBIWVNfVE9fWEtTRUdfQ0FDSEVEKEJPT1RMT0FERVJfQk9PVF9WRUNUT1IpOwogCiAJYmxvY2tfZGVzYyA9IGN2bXhfYm9vdG1lbV9maW5kX25hbWVkX2Jsb2NrKExJTlVYX0FQUF9CT09UX0JMT0NLX05BTUUpOwogCiAJaWYgKCFibG9ja19kZXNjKSB7Ci0JCWF2YWlsX2NvcmVtYXNrID0KLQkJCWN2bXhfcmVhZDY0X3VpbnQzMihDVk1YX0FERF9TRUcoQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUywKLQkJCQkJICAgTEFCSV9BRERSX0lOX0JPT1RMT0FERVIgKwotCQkJCQkJb2Zmc2V0b2Yoc3RydWN0IGxpbnV4X2FwcF9ib290X2luZm8sCi0JCQkJCQlhdmFpbF9jb3JlbWFzaykpKTsKKwkJc3RydWN0IGxpbnV4X2FwcF9ib290X2luZm8gKmxhYmk7CisKKwkJbGFiaSA9IChzdHJ1Y3QgbGludXhfYXBwX2Jvb3RfaW5mbyAqKVBIWVNfVE9fWEtTRUdfQ0FDSEVEKExBQklfQUREUl9JTl9CT09UTE9BREVSKTsKKworCQlhdmFpbF9jb3JlbWFzayA9IGxhYmktPmF2YWlsX2NvcmVtYXNrOworCQlsYWJpLT5hdmFpbF9jb3JlbWFzayAmPSB+KDEgPDwgY29yZWlkKTsKIAl9IGVsc2UgewkJICAgICAgIC8qIGFsdGVybmF0aXZlLCBhbHJlYWR5IGluaXRpYWxpemVkICovCi0JICAgICAgIGF2YWlsX2NvcmVtYXNrID0KLQkJICAgY3ZteF9yZWFkNjRfdWludDMyKENWTVhfQUREX1NFRyhDVk1YX01JUFNfU1BBQ0VfWEtQSFlTLAotCQkJCQkJICAgYmxvY2tfZGVzYy0+YmFzZV9hZGRyICsKLQkJCQkJCSAgIEFWQUlMX0NPUkVNQVNLX09GRlNFVF9JTl9MSU5VWF9BUFBfQk9PVF9CTE9DSykpOworCQlhdmFpbF9jb3JlbWFzayA9ICoodWludDMyX3QgKilQSFlTX1RPX1hLU0VHX0NBQ0hFRCgKKwkJCWJsb2NrX2Rlc2MtPmJhc2VfYWRkciArIEFWQUlMX0NPUkVNQVNLX09GRlNFVF9JTl9MSU5VWF9BUFBfQk9PVF9CTE9DSyk7CiAJfQogCiAJaWYgKCEoYXZhaWxfY29yZW1hc2sgJiAoMSA8PCBjb3JlaWQpKSkgewpAQCAtMzc3LDkgKzM4Myw5IEBACiAKIAlib290X3ZlY3RbY29yZWlkXS5hcHBfc3RhcnRfZnVuY19hZGRyID0KIAkJKHVpbnQzMl90KSAodW5zaWduZWQgbG9uZykgc3RhcnRfYWZ0ZXJfcmVzZXQ7Ci0JYm9vdF92ZWN0W2NvcmVpZF0uY29kZV9hZGRyID0gSW5pdFRMQlN0YXJ0X2FkZHI7CisJYm9vdF92ZWN0W2NvcmVpZF0uY29kZV9hZGRyID0gb2N0ZW9uX2Jvb3Rsb2FkZXJfZW50cnlfYWRkcjsKIAotCUNWTVhfU1lOQzsKKwltYigpOwogCiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfTk1JLCAoMSA8PCBjb3JlaWQpICYgYXZhaWxfY29yZW1hc2spOwogCkBAIC00MDUsMTcgKzQxMSwxMSBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSBvY3Rlb25fY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gb2N0ZW9uX2NwdV9jYWxsYmFjaywKLX07Ci0KIHN0YXRpYyBpbnQgX19jcHVpbml0IHJlZ2lzdGVyX2Nhdml1bV9ub3RpZmllcih2b2lkKQogewotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmb2N0ZW9uX2NwdV9ub3RpZmllcik7Ci0KKwlob3RjcHVfbm90aWZpZXIob2N0ZW9uX2NwdV9jYWxsYmFjaywgMCk7CiAJcmV0dXJuIDA7CiB9Ci0KIGxhdGVfaW5pdGNhbGwocmVnaXN0ZXJfY2F2aXVtX25vdGlmaWVyKTsKIAogI2VuZGlmICAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvTWFrZWZpbGUgYi9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlCmluZGV4IDIzNzkyNjIuLjYxYTMzNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb2JhbHQvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9NYWtlZmlsZQpAQCAtNyw1ICs3LDMgQEAKIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gY29uc29sZS5vCiBvYmotJChDT05GSUdfTVREX1BIWVNNQVApCSs9IG10ZC5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L1BsYXRmb3JtIGIvYXJjaC9taXBzL2NvYmFsdC9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDEyM2VmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9QbGF0Zm9ybQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgQ29iYWx0IFNlcnZlcgorIworcGxhdGZvcm0tJChDT05GSUdfTUlQU19DT0JBTFQpCSs9IGNvYmFsdC8KK2NmbGFncy0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNvYmFsdAorbG9hZC0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gMHhmZmZmZmZmZjgwMDgwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZwppbmRleCBmNjZkNDA2Li4zYTllYzZjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcKQEAgLTgsNyArOCw3IEBACiAjCiAjIE1hY2hpbmUgc2VsZWN0aW9uCiAjCi1DT05GSUdfTUFDSF9BTENIRU1ZPXkKK0NPTkZJR19NSVBTX0FMQ0hFTVk9eQogIyBDT05GSUdfQVI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTQ3WFggaXMgbm90IHNldAogIyBDT05GSUdfQkNNNjNYWCBpcyBub3Qgc2V0CkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19NSVBTX1BCMTU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAogQ09ORklHX1NPQ19BVTEwMDA9eQotQ09ORklHX1NPQ19BVTFYMDA9eQogQ09ORklHX0xPT05HU09OX1VBUlRfQkFTRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTEwMF9kZWZjb25maWcKaW5kZXggYWJiOWE1OC4uNDU4OWI4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnCkBAIC04LDcgKzgsNyBAQAogIwogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwotQ09ORklHX01BQ0hfQUxDSEVNWT15CitDT05GSUdfTUlQU19BTENIRU1ZPXkKICMgQ09ORklHX0FSNyBpcyBub3Qgc2V0CiAjIENPTkZJR19CQ000N1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTYzWFggaXMgbm90IHNldApAQCAtNjQsNyArNjQsNiBAQAogIyBDT05GSUdfTUlQU19QQjE1NTAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKIENPTkZJR19TT0NfQVUxMTAwPXkKLUNPTkZJR19TT0NfQVUxWDAwPXkKIENPTkZJR19MT09OR1NPTl9VQVJUX0JBU0U9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTIwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjEyMDBfZGVmY29uZmlnCmluZGV4IDk5MWMyMGEuLjk5NTBmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjAwX2RlZmNvbmZpZwpAQCAtOCw3ICs4LDcgQEAKICMKICMgTWFjaGluZSBzZWxlY3Rpb24KICMKLUNPTkZJR19NQUNIX0FMQ0hFTVk9eQorQ09ORklHX01JUFNfQUxDSEVNWT15CiAjIENPTkZJR19BUjcgaXMgbm90IHNldAogIyBDT05GSUdfQkNNNDdYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQ002M1hYIGlzIG5vdCBzZXQKQEAgLTY0LDcgKzY0LDYgQEAKICMgQ09ORklHX01JUFNfUEIxNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0CiBDT05GSUdfU09DX0FVMTIwMD15Ci1DT05GSUdfU09DX0FVMVgwMD15CiBDT05GSUdfTE9PTkdTT05fVUFSVF9CQVNFPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjE1MDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZwppbmRleCA1NDI0YzkxLi4zNDZhZTYzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjE1MDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTUwMF9kZWZjb25maWcKQEAgLTgsNyArOCw3IEBACiAjCiAjIE1hY2hpbmUgc2VsZWN0aW9uCiAjCi1DT05GSUdfTUFDSF9BTENIRU1ZPXkKK0NPTkZJR19NSVBTX0FMQ0hFTVk9eQogIyBDT05GSUdfQVI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTQ3WFggaXMgbm90IHNldAogIyBDT05GSUdfQkNNNjNYWCBpcyBub3Qgc2V0CkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19NSVBTX1BCMTU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAogQ09ORklHX1NPQ19BVTE1MDA9eQotQ09ORklHX1NPQ19BVTFYMDA9eQogQ09ORklHX0xPT05HU09OX1VBUlRfQkFTRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTU1MF9kZWZjb25maWcKaW5kZXggOTQ5YjZkYy4uMTBlYWZiOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnCkBAIC04LDcgKzgsNyBAQAogIwogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwotQ09ORklHX01BQ0hfQUxDSEVNWT15CitDT05GSUdfTUlQU19BTENIRU1ZPXkKICMgQ09ORklHX0FSNyBpcyBub3Qgc2V0CiAjIENPTkZJR19CQ000N1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTYzWFggaXMgbm90IHNldApAQCAtNjQsNyArNjQsNiBAQAogIyBDT05GSUdfTUlQU19QQjE1NTAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKIENPTkZJR19TT0NfQVUxNTUwPXkKLUNPTkZJR19TT0NfQVUxWDAwPXkKIENPTkZJR19MT09OR1NPTl9VQVJUX0JBU0U9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2dwcl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9ncHJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTJlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy9ncHJfZGVmY29uZmlnCkBAIC0wLDAgKzEsMjA2MCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjM1LXJjNgorIyBGcmkgSnVsIDIzIDE5OjI4OjUyIDIwMTAKKyMKK0NPTkZJR19NSVBTPXkKKworIworIyBNYWNoaW5lIHNlbGVjdGlvbgorIworQ09ORklHX01JUFNfQUxDSEVNWT15CisjIENPTkZJR19BUjcgaXMgbm90IHNldAorIyBDT05GSUdfQkNNNDdYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CQ002M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAorIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9MT09OR1NPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX01BTFRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FQ19NQVJLRUlOUyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1ZSNDFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19OWFBfU1RCMjIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05YUF9TVEIyMjUgaXMgbm90IHNldAorIyBDT05GSUdfUE5YODU1MF9KQlMgaXMgbm90IHNldAorIyBDT05GSUdfUE5YODU1MF9TVEI4MTAgaXMgbm90IHNldAorIyBDT05GSUdfUE1DX01TUCBpcyBub3Qgc2V0CisjIENPTkZJR19QTUNfWU9TRU1JVEUgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUViBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9DQVJNRUwgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfUkhPTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX1NXQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX1NFTlRPU0EgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0JJR1NVUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9UWDM5WFggaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9UWDQ5WFggaXMgbm90IHNldAorIyBDT05GSUdfTUlLUk9USUtfUkI1MzIgaXMgbm90IHNldAorIyBDT05GSUdfV1JfUFBNQyBpcyBub3Qgc2V0CisjIENPTkZJR19DQVZJVU1fT0NURU9OX1NJTVVMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DQVZJVU1fT0NURU9OX1JFRkVSRU5DRV9CT0FSRCBpcyBub3Qgc2V0CitDT05GSUdfQUxDSEVNWV9HUElPSU5UX0FVMTAwMD15CisjIENPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19EQjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19EQjExMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19EQjEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19EQjE1MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19EQjE1NTAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NSVJBR0UgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19QQjExMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19QQjEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19QQjE1MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19QQjE1NTAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKK0NPTkZJR19NSVBTX0dQUj15CitDT05GSUdfU09DX0FVMTU1MD15CitDT05GSUdfTE9PTkdTT05fVUFSVF9CQVNFPXkKKyMgQ09ORklHX0xPT05HU09OX01DMTQ2ODE4IGlzIG5vdCBzZXQKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfT1BST0ZJTEU9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKK0NPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfQ0VWVF9SNEtfTElCPXkKK0NPTkZJR19DU1JDX1I0S19MSUI9eQorQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfTkVFRF9ETUFfTUFQX1NUQVRFPXkKK0NPTkZJR19TWVNfSEFTX0VBUkxZX1BSSU5USz15CitDT05GSUdfTUlQU19ESVNBQkxFX09CU09MRVRFX0lERT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfR1BJTz15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfTElUVExFX0VORElBTj15CitDT05GSUdfSVJRX0NQVT15CitDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01CisKKyMKKyMgQ1BVIHNlbGVjdGlvbgorIworIyBDT05GSUdfQ1BVX0xPT05HU09OMkUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0xPT05HU09OMkYgaXMgbm90IHNldAorQ09ORklHX0NQVV9NSVBTMzJfUjE9eQorIyBDT05GSUdfQ1BVX01JUFMzMl9SMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTUlQUzY0X1IxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9NSVBTNjRfUjIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1IzMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9UWDM5WFggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1ZSNDFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjQzMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I0WDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9UWDQ5WFggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I1MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SNTQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjU1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I2MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9ORVZBREEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I4MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUk05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04gaXMgbm90IHNldAorQ09ORklHX1NZU19TVVBQT1JUU19aQk9PVD15CitDT05GSUdfU1lTX0hBU19DUFVfTUlQUzMyX1IxPXkKK0NPTkZJR19DUFVfTUlQUzMyPXkKK0NPTkZJR19DUFVfTUlQU1IxPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKK0NPTkZJR19DUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKK0NPTkZJR19IQVJEV0FSRV9XQVRDSFBPSU5UUz15CisKKyMKKyMgS2VybmVsIHR5cGUKKyMKK0NPTkZJR18zMkJJVD15CisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV8zMktCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKK0NPTkZJR19NSVBTX01UX0RJU0FCTEVEPXkKKyMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CitDT05GSUdfNjRCSVRfUEhZU19BRERSPXkKK0NPTkZJR19BUkNIX1BIWVNfQUREUl9UXzY0QklUPXkKK0NPTkZJR19DUFVfSEFTX1NZTkM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19DUFVfU1VQUE9SVFNfSElHSE1FTT15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX1BIWVNfQUREUl9UXzY0QklUPXkKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CitDT05GSUdfVElDS19PTkVTSE9UPXkKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorIyBDT05GSUdfSFpfNDggaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEyOCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMjQgaXMgbm90IHNldAorQ09ORklHX1NZU19TVVBQT1JUU19BUkJJVF9IWj15CitDT05GSUdfSFo9MjUwCisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19DUk9TU19DT01QSUxFPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTz15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk8gaXMgbm90IHNldAorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19USU5ZX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CitDT05GSUdfUkVMQVk9eQorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19SRF9HWklQPXkKKyMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAorIyBDT05GSUdfUkRfTFpPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQorCisjCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCisjCitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1BDSV9RVUlSS1M9eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9GSUxJTkc9eQorIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfQkxPQ0s9eQorQ09ORklHX0xCREFGPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorQ09ORklHX0lOTElORV9TUElOX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlE9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9UUllMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NVVRFWF9TUElOX09OX09XTkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorCisjCisjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKKyMKK0NPTkZJR19IV19IQVNfUENJPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9JT1YgaXMgbm90IHNldAorQ09ORklHX01NVT15CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9NSVNDPW0KK0NPTkZJR19UUkFEX1NJR05BTFM9eQorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorQ09ORklHX0lORVRfTFJPPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19TRUNNQVJLPXkKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfQURWQU5DRUQ9eQorQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19ORVRGSUxURVJfTkVUTElOSz1tCitDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUU9bQorQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRz1tCisjIENPTkZJR19ORl9DT05OVFJBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1RQUk9YWSBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUQUJMRVM9bQorCisjCisjIFh0YWJsZXMgY29tYmluZWQgbW9kdWxlcworIworQ09ORklHX05FVEZJTFRFUl9YVF9NQVJLPW0KKworIworIyBYdGFibGVzIHRhcmdldHMKKyMKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSEw9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9MRUQgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9SQVRFRVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVEVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfU0VDTUFSSz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQIGlzIG5vdCBzZXQKKworIworIyBYdGFibGVzIG1hdGNoZXMKKyMKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ITD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRSBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1NGIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUiBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BIWVNERVY9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1QgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9WUz1tCisjIENPTkZJR19JUF9WU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfSVBfVlNfVEFCX0JJVFM9MTIKKworIworIyBJUFZTIHRyYW5zcG9ydCBwcm90b2NvbCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0CisjCitDT05GSUdfSVBfVlNfUFJPVE9fVENQPXkKK0NPTkZJR19JUF9WU19QUk9UT19VRFA9eQorQ09ORklHX0lQX1ZTX1BST1RPX0FIX0VTUD15CitDT05GSUdfSVBfVlNfUFJPVE9fRVNQPXkKK0NPTkZJR19JUF9WU19QUk9UT19BSD15CisjIENPTkZJR19JUF9WU19QUk9UT19TQ1RQIGlzIG5vdCBzZXQKKworIworIyBJUFZTIHNjaGVkdWxlcgorIworQ09ORklHX0lQX1ZTX1JSPW0KK0NPTkZJR19JUF9WU19XUlI9bQorQ09ORklHX0lQX1ZTX0xDPW0KK0NPTkZJR19JUF9WU19XTEM9bQorQ09ORklHX0lQX1ZTX0xCTEM9bQorQ09ORklHX0lQX1ZTX0xCTENSPW0KK0NPTkZJR19JUF9WU19ESD1tCitDT05GSUdfSVBfVlNfU0g9bQorQ09ORklHX0lQX1ZTX1NFRD1tCitDT05GSUdfSVBfVlNfTlE9bQorCisjCisjIElQVlMgYXBwbGljYXRpb24gaGVscGVyCisjCitDT05GSUdfSVBfVlNfRlRQPW0KKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05GX0RFRlJBR19JUFY0IGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0xPRz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQorQ09ORklHX0lQX05GX01BTkdMRT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCitDT05GSUdfSVBfTkZfUkFXPW0KK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCisKKyMKKyMgREVDbmV0OiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0RFQ05FVF9ORl9HUkFCVUxBVE9SPW0KK0NPTkZJR19CUklER0VfTkZfRUJUQUJMRVM9bQorQ09ORklHX0JSSURHRV9FQlRfQlJPVVRFPW0KK0NPTkZJR19CUklER0VfRUJUX1RfRklMVEVSPW0KK0NPTkZJR19CUklER0VfRUJUX1RfTkFUPW0KK0NPTkZJR19CUklER0VfRUJUXzgwMl8zPW0KK0NPTkZJR19CUklER0VfRUJUX0FNT05HPW0KK0NPTkZJR19CUklER0VfRUJUX0FSUD1tCitDT05GSUdfQlJJREdFX0VCVF9JUD1tCitDT05GSUdfQlJJREdFX0VCVF9MSU1JVD1tCitDT05GSUdfQlJJREdFX0VCVF9NQVJLPW0KK0NPTkZJR19CUklER0VfRUJUX1BLVFRZUEU9bQorQ09ORklHX0JSSURHRV9FQlRfU1RQPW0KK0NPTkZJR19CUklER0VfRUJUX1ZMQU49bQorQ09ORklHX0JSSURHRV9FQlRfQVJQUkVQTFk9bQorQ09ORklHX0JSSURHRV9FQlRfRE5BVD1tCitDT05GSUdfQlJJREdFX0VCVF9NQVJLX1Q9bQorQ09ORklHX0JSSURHRV9FQlRfUkVESVJFQ1Q9bQorQ09ORklHX0JSSURHRV9FQlRfU05BVD1tCitDT05GSUdfQlJJREdFX0VCVF9MT0c9bQorQ09ORklHX0JSSURHRV9FQlRfVUxPRz1tCisjIENPTkZJR19CUklER0VfRUJUX05GTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9EQ0NQPW0KK0NPTkZJR19JTkVUX0RDQ1BfRElBRz1tCisKKyMKKyMgRENDUCBDQ0lEcyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9EQ0NQX0NDSUQzPXkKKyMgQ09ORklHX0lQX0RDQ1BfQ0NJRDNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0lQX0RDQ1BfQ0NJRDNfUlRPPTEwMAorQ09ORklHX0lQX0RDQ1BfVEZSQ19MSUI9eQorQ09ORklHX0lQX1NDVFA9bQorIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0CitDT05GSUdfU0NUUF9ITUFDX01ENT15CisjIENPTkZJR19SRFMgaXMgbm90IHNldAorQ09ORklHX1RJUEM9bQorIyBDT05GSUdfVElQQ19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BVE09eQorQ09ORklHX0FUTV9DTElQPXkKKyMgQ09ORklHX0FUTV9DTElQX05PX0lDTVAgaXMgbm90IHNldAorQ09ORklHX0FUTV9MQU5FPW0KK0NPTkZJR19BVE1fTVBPQT1tCitDT05GSUdfQVRNX0JSMjY4ND1tCisjIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0wyVFAgaXMgbm90IHNldAorQ09ORklHX1NUUD1tCitDT05GSUdfQlJJREdFPW0KK0NPTkZJR19CUklER0VfSUdNUF9TTk9PUElORz15CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKK0NPTkZJR19WTEFOXzgwMjFRPW0KKyMgQ09ORklHX1ZMQU5fODAyMVFfR1ZSUCBpcyBub3Qgc2V0CitDT05GSUdfREVDTkVUPW0KKyMgQ09ORklHX0RFQ05FVF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0xMQz1tCitDT05GSUdfTExDMj1tCitDT05GSUdfSVBYPW0KKyMgQ09ORklHX0lQWF9JTlRFUk4gaXMgbm90IHNldAorQ09ORklHX0FUQUxLPW0KK0NPTkZJR19ERVZfQVBQTEVUQUxLPW0KK0NPTkZJR19JUEREUD1tCitDT05GSUdfSVBERFBfRU5DQVA9eQorQ09ORklHX0lQRERQX0RFQ0FQPXkKK0NPTkZJR19YMjU9bQorQ09ORklHX0xBUEI9bQorQ09ORklHX0VDT05FVD1tCitDT05GSUdfRUNPTkVUX0FVTlVEUD15CitDT05GSUdfRUNPTkVUX05BVElWRT15CitDT05GSUdfV0FOX1JPVVRFUj1tCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSEVEPXkKKworIworIyBRdWV1ZWluZy9TY2hlZHVsaW5nCisjCitDT05GSUdfTkVUX1NDSF9DQlE9bQorQ09ORklHX05FVF9TQ0hfSFRCPW0KK0NPTkZJR19ORVRfU0NIX0hGU0M9bQorQ09ORklHX05FVF9TQ0hfQVRNPW0KK0NPTkZJR19ORVRfU0NIX1BSSU89bQorIyBDT05GSUdfTkVUX1NDSF9NVUxUSVEgaXMgbm90IHNldAorQ09ORklHX05FVF9TQ0hfUkVEPW0KK0NPTkZJR19ORVRfU0NIX1NGUT1tCitDT05GSUdfTkVUX1NDSF9URVFMPW0KK0NPTkZJR19ORVRfU0NIX1RCRj1tCitDT05GSUdfTkVUX1NDSF9HUkVEPW0KK0NPTkZJR19ORVRfU0NIX0RTTUFSSz1tCitDT05GSUdfTkVUX1NDSF9ORVRFTT1tCisjIENPTkZJR19ORVRfU0NIX0RSUiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9JTkdSRVNTPW0KKworIworIyBDbGFzc2lmaWNhdGlvbgorIworQ09ORklHX05FVF9DTFM9eQorQ09ORklHX05FVF9DTFNfQkFTSUM9bQorQ09ORklHX05FVF9DTFNfVENJTkRFWD1tCitDT05GSUdfTkVUX0NMU19ST1VURTQ9bQorQ09ORklHX05FVF9DTFNfUk9VVEU9eQorQ09ORklHX05FVF9DTFNfRlc9bQorQ09ORklHX05FVF9DTFNfVTMyPW0KKyMgQ09ORklHX0NMU19VMzJfUEVSRiBpcyBub3Qgc2V0CitDT05GSUdfQ0xTX1UzMl9NQVJLPXkKK0NPTkZJR19ORVRfQ0xTX1JTVlA9bQorQ09ORklHX05FVF9DTFNfUlNWUDY9bQorIyBDT05GSUdfTkVUX0NMU19GTE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRU1BVENIPXkKK0NPTkZJR19ORVRfRU1BVENIX1NUQUNLPTMyCitDT05GSUdfTkVUX0VNQVRDSF9DTVA9bQorQ09ORklHX05FVF9FTUFUQ0hfTkJZVEU9bQorQ09ORklHX05FVF9FTUFUQ0hfVTMyPW0KK0NPTkZJR19ORVRfRU1BVENIX01FVEE9bQorQ09ORklHX05FVF9FTUFUQ0hfVEVYVD1tCitDT05GSUdfTkVUX0NMU19BQ1Q9eQorQ09ORklHX05FVF9BQ1RfUE9MSUNFPXkKKyMgQ09ORklHX05FVF9BQ1RfR0FDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQUNUX01JUlJFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQUNUX0lQVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQUNUX05BVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQUNUX1BFRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9BQ1RfU0lNUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQUNUX1NLQkVESVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAorQ09ORklHX05FVF9TQ0hfRklGTz15CisjIENPTkZJR19EQ0IgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworQ09ORklHX05FVF9QS1RHRU49bQorQ09ORklHX0hBTVJBRElPPXkKKworIworIyBQYWNrZXQgUmFkaW8gcHJvdG9jb2xzCisjCitDT05GSUdfQVgyNT1tCisjIENPTkZJR19BWDI1X0RBTUFfU0xBVkUgaXMgbm90IHNldAorQ09ORklHX05FVFJPTT1tCitDT05GSUdfUk9TRT1tCisKKyMKKyMgQVguMjUgbmV0d29yayBkZXZpY2UgZHJpdmVycworIworQ09ORklHX01LSVNTPW0KK0NPTkZJR182UEFDSz1tCitDT05GSUdfQlBRRVRIRVI9bQorQ09ORklHX0JBWUNPTV9TRVJfRkRYPW0KK0NPTkZJR19CQVlDT01fU0VSX0hEWD1tCitDT05GSUdfWUFNPW0KKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19GSUJfUlVMRVM9eQorQ09ORklHX1dJUkVMRVNTPXkKK0NPTkZJR19XRVhUX0NPUkU9eQorQ09ORklHX1dFWFRfUFJPQz15CitDT05GSUdfQ0ZHODAyMTE9eQorIyBDT05GSUdfTkw4MDIxMV9URVNUTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19DRkc4MDIxMV9ERVZFTE9QRVJfV0FSTklOR1MgaXMgbm90IHNldAorIyBDT05GSUdfQ0ZHODAyMTFfUkVHX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTPXkKKyMgQ09ORklHX0NGRzgwMjExX0RFQlVHRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0ZHODAyMTFfSU5URVJOQUxfUkVHREIgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX1dFWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CisjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfTUFDODAyMTE9eQorQ09ORklHX01BQzgwMjExX0hBU19SQz15CisjIENPTkZJR19NQUM4MDIxMV9SQ19QSUQgaXMgbm90IHNldAorQ09ORklHX01BQzgwMjExX1JDX01JTlNUUkVMPXkKKyMgQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfUElEIGlzIG5vdCBzZXQKK0NPTkZJR19NQUM4MDIxMV9SQ19ERUZBVUxUX01JTlNUUkVMPXkKK0NPTkZJR19NQUM4MDIxMV9SQ19ERUZBVUxUPSJtaW5zdHJlbCIKKyMgQ09ORklHX01BQzgwMjExX01FU0ggaXMgbm90IHNldAorQ09ORklHX01BQzgwMjExX0xFRFM9eQorIyBDT05GSUdfTUFDODAyMTFfREVCVUdGUyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMV9ERUJVR19NRU5VIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0FJRiBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIiCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTV9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CitDT05GSUdfTVREX1JBTT1tCisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CitDT05GSUdfTVREX1BIWVNNQVA9eQorIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSU5URUxfVlJfTk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBMUEREUiBmbGFzaCBtZW1vcnkgZHJpdmVycworIworIyBDT05GSUdfTVREX0xQRERSIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKworIworIyBEUkJEIGRpc2FibGVkIGJlY2F1c2UgUFJPQ19GUywgSU5FVCBvciBDT05ORUNUT1Igbm90IHNlbGVjdGVkCisjCisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTY1NTM2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfQUQ1MjVYX0RQT1QgaXMgbm90IHNldAorIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CitDT05GSUdfVElGTV9DT1JFPW0KK0NPTkZJR19USUZNXzdYWDE9bQorIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTTDI5MDAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKKworIworIyBFRVBST00gc3VwcG9ydAorIworIyBDT05GSUdfRUVQUk9NX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfQ0I3MTBfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTSV9NT0Q9bQorIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST1tCitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorQ09ORklHX1NDU0lfTkVUTElOSz15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9bQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CitDT05GSUdfQ0hSX0RFVl9TRz1tCisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfTE9HR0lORz15CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKK0NPTkZJR19TQ1NJX1NQSV9BVFRSUz1tCitDT05GSUdfU0NTSV9GQ19BVFRSUz1tCitDT05GSUdfU0NTSV9JU0NTSV9BVFRSUz1tCitDT05GSUdfU0NTSV9TQVNfQVRUUlM9bQorQ09ORklHX1NDU0lfU0FTX0xJQlNBUz1tCitDT05GSUdfU0NTSV9TQVNfSE9TVF9TTVA9eQorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIFlvdSBjYW4gZW5hYmxlIG9uZSBvciBib3RoIEZpcmVXaXJlIGRyaXZlciBzdGFja3MuCisjCisKKyMKKyMgVGhlIG5ld2VyIHN0YWNrIGlzIHJlY29tbWVuZGVkLgorIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0lGQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTUFSVkVMTF9QSFk9bQorQ09ORklHX0RBVklDT01fUEhZPW0KK0NPTkZJR19RU0VNSV9QSFk9bQorQ09ORklHX0xYVF9QSFk9bQorQ09ORklHX0NJQ0FEQV9QSFk9bQorQ09ORklHX1ZJVEVTU0VfUEhZPW0KK0NPTkZJR19TTVNDX1BIWT1tCisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRJT05BTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfU1RFMTBYUCBpcyBub3Qgc2V0CisjIENPTkZJR19MU0lfRVQxMDExQ19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTUlDUkVMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKK0NPTkZJR19NSVBTX0FVMVgwMF9FTkVUPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTFfTUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKK0NPTkZJR19XTEFOPXkKKyMgQ09ORklHX0xJQkVSVEFTX1RISU5GSVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUNzZDNTBYX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRDEyMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9STkRJU19XTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUTDgxODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRMODE4NyBpcyBub3Qgc2V0CisjIENPTkZJR19BRE04MjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExX0hXU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01XTDhLIGlzIG5vdCBzZXQKK0NPTkZJR19BVEhfQ09NTU9OPXkKK0NPTkZJR19BVEhfREVCVUc9eQorQ09ORklHX0FUSDVLPXkKK0NPTkZJR19BVEg1S19ERUJVRz15CisjIENPTkZJR19BVEg5SyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEg5S19IVEMgaXMgbm90IHNldAorIyBDT05GSUdfQVI5MTcwX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19CNDMgaXMgbm90IHNldAorIyBDT05GSUdfQjQzTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFcyMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVzIyMDAgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSSBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJFUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfUDU0X0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVDJYMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0wxMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pEMTIxMVJXIGlzIG5vdCBzZXQKKworIworIyBFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVBIRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19XQU49eQorQ09ORklHX0xBTk1FRElBPW0KK0NPTkZJR19IRExDPW0KK0NPTkZJR19IRExDX1JBVz1tCitDT05GSUdfSERMQ19SQVdfRVRIPW0KK0NPTkZJR19IRExDX0NJU0NPPW0KK0NPTkZJR19IRExDX0ZSPW0KK0NPTkZJR19IRExDX1BQUD1tCitDT05GSUdfSERMQ19YMjU9bQorQ09ORklHX1BDSTIwMFNZTj1tCitDT05GSUdfV0FOWEw9bQorIyBDT05GSUdfUEMzMDBUT08gaXMgbm90IHNldAorQ09ORklHX0ZBUlNZTkM9bQorQ09ORklHX0RTQ0M0PW0KK0NPTkZJR19EU0NDNF9QQ0lTWU5DPXkKK0NPTkZJR19EU0NDNF9QQ0lfUlNUPXkKK0NPTkZJR19ETENJPW0KK0NPTkZJR19ETENJX01BWD04CitDT05GSUdfV0FOX1JPVVRFUl9EUklWRVJTPW0KK0NPTkZJR19DWUNMQURFU19TWU5DPW0KK0NPTkZJR19DWUNMT01YX1gyNT15CitDT05GSUdfTEFQQkVUSEVSPW0KK0NPTkZJR19YMjVfQVNZPW0KK0NPTkZJR19BVE1fRFJJVkVSUz15CisjIENPTkZJR19BVE1fRFVNTVkgaXMgbm90IHNldAorQ09ORklHX0FUTV9UQ1A9bQorQ09ORklHX0FUTV9MQU5BST1tCitDT05GSUdfQVRNX0VOST1tCisjIENPTkZJR19BVE1fRU5JX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9FTklfVFVORV9CVVJTVCBpcyBub3Qgc2V0CitDT05GSUdfQVRNX0ZJUkVTVFJFQU09bQorQ09ORklHX0FUTV9aQVRNPW0KKyMgQ09ORklHX0FUTV9aQVRNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BVE1fTklDU1RBUj1tCisjIENPTkZJR19BVE1fTklDU1RBUl9VU0VfU1VOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fTklDU1RBUl9VU0VfSURUNzcxMDUgaXMgbm90IHNldAorQ09ORklHX0FUTV9JRFQ3NzI1Mj1tCisjIENPTkZJR19BVE1fSURUNzcyNTJfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0lEVDc3MjUyX1JDVl9BTEwgaXMgbm90IHNldAorQ09ORklHX0FUTV9JRFQ3NzI1Ml9VU0VfU1VOST15CitDT05GSUdfQVRNX0FNQkFTU0FET1I9bQorIyBDT05GSUdfQVRNX0FNQkFTU0FET1JfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0FUTV9IT1JJWk9OPW0KKyMgQ09ORklHX0FUTV9IT1JJWk9OX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BVE1fSUE9bQorIyBDT05GSUdfQVRNX0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BVE1fRk9SRTIwMEU9bQorIyBDT05GSUdfQVRNX0ZPUkUyMDBFX1VTRV9UQVNLTEVUIGlzIG5vdCBzZXQKK0NPTkZJR19BVE1fRk9SRTIwMEVfVFhfUkVUUlk9MTYKK0NPTkZJR19BVE1fRk9SRTIwMEVfREVCVUc9MAorQ09ORklHX0FUTV9IRT1tCitDT05GSUdfQVRNX0hFX1VTRV9TVU5JPXkKKyMgQ09ORklHX0FUTV9TT0xPUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorQ09ORklHX1BQUF9GSUxURVI9eQorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX1NZTkNfVFRZPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorQ09ORklHX1BQUF9NUFBFPW0KK0NPTkZJR19QUFBPRT1tCitDT05GSUdfUFBQT0FUTT1tCitDT05GSUdfU0xJUD1tCitDT05GSUdfU0xJUF9DT01QUkVTU0VEPXkKK0NPTkZJR19TTEhDPW0KK0NPTkZJR19TTElQX1NNQVJUPXkKK0NPTkZJR19TTElQX01PREVfU0xJUDY9eQorQ09ORklHX05FVF9GQz15CitDT05GSUdfTkVUQ09OU09MRT1tCisjIENPTkZJR19ORVRDT05TT0xFX0RZTkFNSUMgaXMgbm90IHNldAorQ09ORklHX05FVFBPTEw9eQorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKKyMgQ09ORklHX1ZNWE5FVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfU1BBUlNFS01BUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKK0NPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05fR1NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfODI1MF9QQ0kgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfVElNQkVSREFMRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQUxURVJBX0pUQUdVQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9BTFRFUkFfVUFSVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0RFVlBPUlQ9eQorIyBDT05GSUdfUkFNT09QUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKK0NPTkZJR19JMkNfQUxHT0JJVD15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUEMgU01CdXMgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0lTQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworIyBDT05GSUdfSTJDX0FVMTU1MCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0dQSU89eQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1hJTElOWCBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorQ09ORklHX0dQSU9MSUI9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorCisjCisjIE1lbW9yeSBtYXBwZWQgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX0lUODc2MUUgaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TQ0ggaXMgbm90IHNldAorCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENGODU3WCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX0FEUDU1ODggaXMgbm90IHNldAorCisjCisjIFBDSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fQ1M1NTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fQlQ4WFggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19MQU5HV0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1JEQzMyMVggaXMgbm90IHNldAorCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIE1PRFVMYnVzIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NjIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQzc2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRzc2MEEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTE04Mz15CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTFRDNDIxNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xUQzQyNDUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTk1MjQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSFQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRU1DMTQwMyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQU1DNjgyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDEwMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDQyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xJUzNfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfQUxJTTcxMDFfV0RUIGlzIG5vdCBzZXQKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCPW0KK0NPTkZJR19TU0JfU1BST009eQorQ09ORklHX1NTQl9QQ0lIT1NUX1BPU1NJQkxFPXkKK0NPTkZJR19TU0JfUENJSE9TVD15CisjIENPTkZJR19TU0JfQjQzX1BDSV9CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfU1NCX1NJTEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0JfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NTQl9EUklWRVJfUENJQ09SRV9QT1NTSUJMRT15CitDT05GSUdfU1NCX0RSSVZFUl9QQ0lDT1JFPXkKKyMgQ09ORklHX1NTQl9EUklWRVJfTUlQUyBpcyBub3Qgc2V0CitDT05GSUdfTUZEX1NVUFBPUlQ9eQorIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEXzg4UE04NjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19JMkNQTEQgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwN1ggaXMgbm90IHNldAorIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzM1ODkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNSUNfQURQNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUFYODkyNSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODk5NCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfQUJYNTAwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RJTUJFUkRBTEUgaXMgbm90IHNldAorIyBDT05GSUdfTFBDX1NDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfUkRDMzIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfSkFOWl9DTU9ESU8gaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9BUkIgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQorIyBDT05GSUdfTENEX0NMQVNTX0RFVklDRSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19CQUNLTElHSFRfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfQURQODg2MCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPW0KKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9ISURERVY9eQorCisjCisjIFVTQiBISUQgQm9vdCBQcm90b2NvbCBkcml2ZXJzCisjCitDT05GSUdfVVNCX0tCRD1tCitDT05GSUdfVVNCX01PVVNFPW0KKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCisjIENPTkZJR19ISURfM01fUENUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9BNFRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSElEX0FQUExFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfSElEX0NBTkRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9DSEVSUlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0NISUNPTlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0RSQUdPTlJJU0UgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfRVpLRVkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0tZRSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfR1lSQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldAorIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAorIyBDT05GSUdfSElEX0xPR0lURUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9NSUNST1NPRlQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX01PU0FSVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTU9OVEVSRVkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX05UUklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9PUlRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUEFOVEhFUkxPUkQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BFVEFMWU5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUNPTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9RVUFOVEEgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1JPQ0NBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUk9DQ0FUX0tPTkUgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NBTVNVTkcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NPTlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NUQU5UVU0gaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVTlBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0dSRUVOQVNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU01BUlRKT1lQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9UT1BTRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9USFJVU1RNQVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1pFUk9QTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9aWURBQ1JPTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorIyBDT05GSUdfVVNCX1dVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWEhDSV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQ9eQorQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEPXkKKyMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5CisjCisKKyMKKyMgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm8KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAorQ09ORklHX1VTQl9MSUJVU1VBTD15CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKK0NPTkZJR19VU0JfU0VSSUFMPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VaVVNCPXkKK0NPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUM9eQorIyBDT05GSUdfVVNCX1NFUklBTF9BSVJDQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0FSSzMxMTYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DSDM0MSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1dISVRFSEVBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0RJR0lfQUNDRUxFUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NQMjEwWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZUFJFU1NfTTggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FTVBFRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0ZURElfU0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRlVOU09GVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1ZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBBUSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0dBUk1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lVVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX01PUzc3MjAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1M3ODQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9UT1JPTEEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9OQVZNQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PVEk2ODU4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfUUNBVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9RVUFMQ09NTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NQQ1A4WDUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9IUDRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0FGRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NJRU1FTlNfTVBJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX1NJRVJSQVdJUkVMRVNTPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfU1lNQk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWUJFUkpBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9YSVJDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT1BUSUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1ZJVk9QQVlfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfWklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKKyMKKyMgQ09ORklHX1VTQl9HUElPX1ZCVVMgaXMgbm90IHNldAorIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CisjIENPTkZJR19VV0IgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVdfTEVEUz15CitDT05GSUdfTEVEU19DTEFTUz15CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKyMgQ09ORklHX0xFRFNfUENBOTUzMiBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19HUElPPXkKK0NPTkZJR19MRURTX0dQSU9fUExBVEZPUk09eQorIyBDT05GSUdfTEVEU19MUDM5NDQgaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19QQ0E5NTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfQkQyODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfTFQzNTkzIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKK0NPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQorIyBDT05GSUdfTEVEU19UUklHR0VSX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX1RSSUdHRVJfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049eQorCisjCisjIGlwdGFibGVzIHRyaWdnZXIgaXMgdW5kZXIgTmV0ZmlsdGVyIGNvbmZpZyAoTEVEIHRhcmdldCkKKyMKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfRlNOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VREZfTkxTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPW0KK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FQ1JZUFRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlM9eQorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CitDT05GSUdfSkZGUzJfUlVCSU49eQorIyBDT05GSUdfSkZGUzJfQ01PREVfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfQ01PREVfUFJJT1JJVFk9eQorIyBDT05GSUdfSkZGUzJfQ01PREVfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DTU9ERV9GQVZPVVJMWk8gaXMgbm90IHNldAorIyBDT05GSUdfTE9HRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19WNF8xIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NFUEhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUj15CisjIENPTkZJR19MS0RUTSBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQVRPTUlDNjRfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDExNTIwMCByb290PS9kZXYvbmZzIHJ3IGlwPWF1dG8iCisjIENPTkZJR19DTURMSU5FX09WRVJSSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSU5MT0NLX1RFU1QgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKK0NPTkZJR19LRVlTPXkKKyMgQ09ORklHX0tFWVNfREVCVUdfUFJPQ19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfU01BQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9UT01PWU8gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJMj15CitDT05GSUdfQ1JZUFRPX0FFQUQ9bQorQ09ORklHX0NSWVBUT19BRUFEMj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fSEFTSDI9eQorQ09ORklHX0NSWVBUT19STkc9bQorQ09ORklHX0NSWVBUT19STkcyPXkKK0NPTkZJR19DUllQVE9fUENPTVA9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUjI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTlVMTD1tCitDT05GSUdfQ1JZUFRPX1dPUktRVUVVRT15CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQVVUSEVOQz1tCitDT05GSUdfQ1JZUFRPX1RFU1Q9bQorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj15CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0hNQUM9eQorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworQ09ORklHX0NSWVBUT19DUkMzMkM9bQorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ0PW0KK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9bQorQ09ORklHX0NSWVBUT19TSEEyNTY9bQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCisKKyMKKyMgQ2lwaGVycworIworQ09ORklHX0NSWVBUT19BRVM9eQorQ09ORklHX0NSWVBUT19BTlVCSVM9bQorQ09ORklHX0NSWVBUT19BUkM0PXkKK0NPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQ0FTVDU9bQorQ09ORklHX0NSWVBUT19DQVNUNj1tCitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fS0hBWkFEPW0KKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fU0VSUEVOVD1tCitDT05GSUdfQ1JZUFRPX1RFQT1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9bQorQ09ORklHX0NSWVBUT19UV09GSVNIX0NPTU1PTj1tCisKKyMKKyMgQ29tcHJlc3Npb24KKyMKK0NPTkZJR19DUllQVE9fREVGTEFURT1tCisjIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKK0NPTkZJR19DUllQVE9fQU5TSV9DUFJORz1tCitDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQorQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDMTY9bQorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0lUVV9UPW0KK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKK0NPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19ERUNPTVBSRVNTX0daSVA9eQorQ09ORklHX1RFWFRTRUFSQ0g9eQorQ09ORklHX1RFWFRTRUFSQ0hfS01QPW0KK0NPTkZJR19URVhUU0VBUkNIX0JNPW0KK0NPTkZJR19URVhUU0VBUkNIX0ZTTT1tCitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19OTEFUVFI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbXR4MV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZwppbmRleCBjZmY4ZjRjLi4xMGQyMGFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZwpAQCAtOCw3ICs4LDcgQEAKICMKICMgTWFjaGluZSBzZWxlY3Rpb24KICMKLUNPTkZJR19NQUNIX0FMQ0hFTVk9eQorQ09ORklHX01JUFNfQUxDSEVNWT15CiAjIENPTkZJR19BUjcgaXMgbm90IHNldAogIyBDT05GSUdfQkNNNDdYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQ002M1hYIGlzIG5vdCBzZXQKQEAgLTY0LDcgKzY0LDYgQEAKICMgQ09ORklHX01JUFNfUEIxNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0CiBDT05GSUdfU09DX0FVMTUwMD15Ci1DT05GSUdfU09DX0FVMVgwMD15CiBDT05GSUdfTE9PTkdTT05fVUFSVF9CQVNFPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZwppbmRleCA5NzM4MmI2Li43NzhmNzI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTEwMF9kZWZjb25maWcKQEAgLTgsNyArOCw3IEBACiAjCiAjIE1hY2hpbmUgc2VsZWN0aW9uCiAjCi1DT05GSUdfTUFDSF9BTENIRU1ZPXkKK0NPTkZJR19NSVBTX0FMQ0hFTVk9eQogIyBDT05GSUdfQVI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTQ3WFggaXMgbm90IHNldAogIyBDT05GSUdfQkNNNjNYWCBpcyBub3Qgc2V0CkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19NSVBTX1BCMTU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAogQ09ORklHX1NPQ19BVTExMDA9eQotQ09ORklHX1NPQ19BVTFYMDA9eQogQ09ORklHX0xPT05HU09OX1VBUlRfQkFTRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMjAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTIwMF9kZWZjb25maWcKaW5kZXggZTlhZDc3My4uMGY5MDhjNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjEyMDBfZGVmY29uZmlnCkBAIC04LDcgKzgsNyBAQAogIwogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwotQ09ORklHX01BQ0hfQUxDSEVNWT15CitDT05GSUdfTUlQU19BTENIRU1ZPXkKICMgQ09ORklHX0FSNyBpcyBub3Qgc2V0CiAjIENPTkZJR19CQ000N1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTYzWFggaXMgbm90IHNldApAQCAtNjQsNyArNjQsNiBAQAogIyBDT05GSUdfTUlQU19QQjE1NTAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKIENPTkZJR19TT0NfQVUxMjAwPXkKLUNPTkZJR19TT0NfQVUxWDAwPXkKIENPTkZJR19MT09OR1NPTl9VQVJUX0JBU0U9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1MDBfZGVmY29uZmlnCmluZGV4IDc0OTdkMzMuLjFjNWZlNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZwpAQCAtOCw3ICs4LDcgQEAKICMKICMgTWFjaGluZSBzZWxlY3Rpb24KICMKLUNPTkZJR19NQUNIX0FMQ0hFTVk9eQorQ09ORklHX01JUFNfQUxDSEVNWT15CiAjIENPTkZJR19BUjcgaXMgbm90IHNldAogIyBDT05GSUdfQkNNNDdYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQ002M1hYIGlzIG5vdCBzZXQKQEAgLTY0LDcgKzY0LDYgQEAKICMgQ09ORklHX01JUFNfUEIxNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0CiBDT05GSUdfU09DX0FVMTUwMD15Ci1DT05GSUdfU09DX0FVMVgwMD15CiBDT05GSUdfTE9PTkdTT05fVUFSVF9CQVNFPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZwppbmRleCBhYTUyNmY1Li40OTQ5NGIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTU1MF9kZWZjb25maWcKQEAgLTgsNyArOCw3IEBACiAjCiAjIE1hY2hpbmUgc2VsZWN0aW9uCiAjCi1DT05GSUdfTUFDSF9BTENIRU1ZPXkKK0NPTkZJR19NSVBTX0FMQ0hFTVk9eQogIyBDT05GSUdfQVI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTQ3WFggaXMgbm90IHNldAogIyBDT05GSUdfQkNNNjNYWCBpcyBub3Qgc2V0CkBAIC02NCw3ICs2NCw2IEBACiBDT05GSUdfTUlQU19QQjE1NTA9eQogIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKIENPTkZJR19TT0NfQVUxNTUwPXkKLUNPTkZJR19TT0NfQVUxWDAwPXkKIENPTkZJR19MT09OR1NPTl9VQVJUX0JBU0U9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3Bvd2VydHZfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcG93ZXJ0dl9kZWZjb25maWcKaW5kZXggNzI5MTYzMy4uYWYwYWI3MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcG93ZXJ0dl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcG93ZXJ0dl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEtcmM1Ci0jIEZyaSBBdWcgMjggMTQ6NDk6MzMgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjM1LXJjMworIyBUaHUgSnVsICAxIDExOjAzOjI4IDIwMTAKICMKIENPTkZJR19NSVBTPXkKIApAQCAtMTEsMTEgKzExLDEyIEBACiAjIENPTkZJR19NQUNIX0FMQ0hFTVkgaXMgbm90IHNldAogIyBDT05GSUdfQVI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JDTTQ3WFggaXMgbm90IHNldAorIyBDT05GSUdfQkNNNjNYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBU0FUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xFTU9URV9GVUxPTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9MT09OR1NPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX01BTFRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfU0lNIGlzIG5vdCBzZXQKICMgQ09ORklHX05FQ19NQVJLRUlOUyBpcyBub3Qgc2V0CkBAIC01MCw3ICs1MSw2IEBACiAjIENPTkZJR19NSU5fUlVOVElNRV9SRVNPVVJDRVMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVExPQURFUl9EUklWRVIgaXMgbm90IHNldAogQ09ORklHX0JPT1RMT0FERVJfRkFNSUxZPSJSMiIKLUNPTkZJR19DU1JDX1BPV0VSVFY9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CkBAIC02NSw5ICs2NSw5IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19DRVZUX1I0S19MSUI9eQogQ09ORklHX0NFVlRfUjRLPXkKK0NPTkZJR19DU1JDX1BPV0VSVFY9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15Ci1DT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15Ci0jIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAorQ09ORklHX05FRURfRE1BX01BUF9TVEFURT15CiBDT05GSUdfU1lTX0hBU19FQVJMWV9QUklOVEs9eQogIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQklHX0VORElBTj15CkBAIC03OSw3ICs3OSw4IEBACiAjCiAjIENQVSBzZWxlY3Rpb24KICMKLSMgQ09ORklHX0NQVV9MT09OR1NPTjIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0xPT05HU09OMkUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0xPT05HU09OMkYgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX01JUFMzMl9SMSBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX01JUFMzMl9SMj15CiAjIENPTkZJR19DUFVfTUlQUzY0X1IxIGlzIG5vdCBzZXQKQEAgLTEyMiw3ICsxMjMsNyBAQAogQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQogIyBDT05GSUdfTUlQU19NVF9TTVAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfSEFTX0xMU0M9eQorIyBDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX01JUFNSMl9JUlFfVkk9eQogQ09ORklHX0NQVV9NSVBTUjJfSVJRX0VJPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQpAQCAtMTQ0LDggKzE0NSw3IEBACiAjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0wCiBDT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX0hBVkVfTUxPQ0s9eQotQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiBDT05GSUdfVElDS19PTkVTSE9UPXkKIENPTkZJR19OT19IWj15CkBAIC0xNzcsNiArMTc3LDcgQEAKIENPTkZJR19CUk9LRU5fT05fU01QPXkKIENPTkZJR19MT0NLX0tFUk5FTD15CiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfQ1JPU1NfQ09NUElMRT0ibWlwcy1saW51eC0iCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQogIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CkBAIC0xOTAsMTkgKzE5MSwxNSBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfVElOWV9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE2Ci1DT05GSUdfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiBDT05GSUdfUkVMQVk9eQogIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CkBAIC0yMTEsNiArMjA4LDcgQEAKICMgQ09ORklHX1JEX0daSVAgaXMgbm90IHNldAogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0CisjIENPTkZJR19SRF9MWk8gaXMgbm90IHNldAogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMjM0LDE4ICsyMzIsMTYgQEAKIENPTkZJR19BSU89eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfUENJX1FVSVJLUz15CiAjIENPTkZJR19TTFVCX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKICMgQ09ORklHX1NMQUIgaXMgbm90IHNldAogQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAKICMKQEAgLTI1Myw3ICsyNDksNyBAQAogIwogIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQpAQCAtMjcxLDE1ICsyNjcsNDEgQEAKICMgSU8gU2NoZWR1bGVycwogIwogQ09ORklHX0lPU0NIRURfTk9PUD15Ci0jIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAogIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX05PT1A9eQogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKLSMgQ09ORklHX1BST0JFX0lOSVRSRF9IRUFERVIgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NVVRFWF9TUElOX09OX09XTkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCkBAIC0yODksNyArMzExLDYgQEAKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9TVFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9JT1YgaXMgbm90IHNldApAQCAtMzE4LDcgKzMzOSw2IEBACiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwogQ09ORklHX1BBQ0tFVD15Ci1DT05GSUdfUEFDS0VUX01NQVA9eQogQ09ORklHX1VOSVg9eQogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKQEAgLTM5MCwxMiArNDEwLDI2IEBACiAjIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0cgaXMgbm90IHNldAogIyBDT05GSUdfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVJfWFRBQkxFUz15CisKKyMKKyMgWHRhYmxlcyBjb21iaW5lZCBtb2R1bGVzCisjCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFSSyBpcyBub3Qgc2V0CisKKyMKKyMgWHRhYmxlcyB0YXJnZXRzCisjCiAjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1JBVEVFU1QgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9URUUgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1MgaXMgbm90IHNldAorCisjCisjIFh0YWJsZXMgbWF0Y2hlcworIwogIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1AgaXMgbm90IHNldApAQCAtNDY1LDEwICs0OTksMTMgQEAKICMgQ09ORklHX0lQNl9ORl9SQVcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19MMlRQIGlzIG5vdCBzZXQKIENPTkZJR19TVFA9eQogQ09ORklHX0JSSURHRT15CitDT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkc9eQogIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CkBAIC01MjYsMTAgKzU2MywyMSBAQAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldAorCisjCisjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCisjCisKKyMKKyMgU29tZSB3aXJlbGVzcyBkcml2ZXJzIHJlcXVpcmUgYSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtCisjCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBSUYgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC01MzksNiArNTg3LDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKIENPTkZJR19GV19MT0FERVI9eQpAQCAtNTUwLDkgKzU5OSw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01NjgsNiArNjE3LDcgQEAKICMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAogIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfU01fRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKIAogIwpAQCAtNjExLDExICs2NjEsMTYgQEAKICMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfRUNDPXkKKyMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAogQ09ORklHX01URF9OQU5EPXkKICMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9FQ0NfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTV9DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9ERU5BTEkgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0RFTkFMSV9TQ1JBVENIX1JFR19BRERSPTB4RkYxMDgwMTgKIENPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfUklDT0ggaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTkFORF9DQUZFIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldApAQCAtNjQxLDYgKzY5NiwxMCBAQAogIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0xPT1A9eQogIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKworIworIyBEUkJEIGRpc2FibGVkIGJlY2F1c2UgUFJPQ19GUywgSU5FVCBvciBDT05ORUNUT1Igbm90IHNlbGVjdGVkCisjCiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKQEAgLTY1OCw2ICs3MTcsNyBAQAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCitDT05GSUdfU0NTSV9NT0Q9eQogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CiBDT05GSUdfU0NTSV9ETUE9eQpAQCAtNjkzLDY0ICs3NTMsOTUgQEAKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKKworIworIyBDb250cm9sbGVycyB3aXRoIG5vbi1TRkYgbmF0aXZlIGludGVyZmFjZQorIwogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAogQ09ORklHX0FUQV9TRkY9eQotIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorCisjCisjIFNGRiBjb250cm9sbGVycyB3aXRoIGN1c3RvbSBETUEgaW50ZXJmYWNlCisjCisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfQk1ETUE9eQorCisjCisjIFNBVEEgU0ZGIGNvbnRyb2xsZXJzIHdpdGggQk1ETUEKKyMKICMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAogIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0Ci0jIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1NJTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9JTklDMTYyWCBpcyBub3Qgc2V0CisKKyMKKyMgUEFUQSBTRkYgY29udHJvbGxlcnMgd2l0aCBCTURNQQorIwogIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVFA4NjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAotIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX05JTkpBMzIgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfTlM4NzQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SREMgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQ0ggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVE9TSElCQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKKworIworIyBQSU8tb25seSBTRkYgY29udHJvbGxlcnMKKyMKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBmYWxsYmFjayAvIGxlZ2FjeSBkcml2ZXJzCisjCisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAogCkBAIC03NjMsNyArODU0LDcgQEAKICMKIAogIwotIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIFRoZSBuZXdlciBzdGFjayBpcyByZWNvbW1lbmRlZC4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKQEAgLTc4Nyw2ICs4NzgsNyBAQAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CkBAIC04MDAsNiArODkyLDcgQEAKICMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTFfTUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CkBAIC04MjksNiArOTIyLDggQEAKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAogQ09ORklHX0NIRUxTSU9fVDNfREVQRU5EUz15CiAjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKK0NPTkZJR19DSEVMU0lPX1Q0X0RFUEVORFM9eQorIyBDT05GSUdfQ0hFTFNJT19UNCBpcyBub3Qgc2V0CiAjIENPTkZJR19FTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldApAQCAtODQxLDE2ICs5MzYsMTIgQEAKICMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19URUhVVEkgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMlggaXMgbm90IHNldAorIyBDT05GSUdfUUxDTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFMk5FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCi0jIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CiAKICMKICMgRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycwpAQCAtODY0LDYgKzk1NSw3IEBACiAjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1JUTDgxNTA9eQogIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVBIRVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKQEAgLTg3Myw2ICs5NjUsNyBAQAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfVk1YTkVUMyBpcyBub3Qgc2V0CiAjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKICMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKIApAQCAtODgyLDYgKzk3NSw3IEBACiBDT05GSUdfSU5QVVQ9eQogIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1NQQVJTRUtNQVAgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTkxMyw2ICsxMDA3LDcgQEAKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05fR1NNIGlzIG5vdCBzZXQKICMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CiAKICMKQEAgLTkyNCw2ICsxMDE5LDkgQEAKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAogIwogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfVElNQkVSREFMRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQUxURVJBX0pUQUdVQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9BTFRFUkFfVUFSVCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CkBAIC05MzQsNiArMTAzMiw3IEBACiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0RFVlBPUlQ9eQorIyBDT05GSUdfUkFNT09QUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKIApAQCAtOTQ1LDcgKzEwNDQsNiBAQAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtOTUzLDIwICsxMDUxLDE0IEBACiAjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQogIwogIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworIyBDT05GSUdfVkdBX0FSQiBpcyBub3Qgc2V0CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtOTgwLDcgKzEwNzIsNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTk5MywzMSArMTA4NCw0MyBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCisjIENPTkZJR19ISURfM01fUENUIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9BNFRFQ0ggaXMgbm90IHNldAogIyBDT05GSUdfSElEX0FQUExFIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfSElEX0NBTkRPIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9DSEVSUlkgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0NISUNPTlkgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0NZUFJFU1MgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0RSQUdPTlJJU0UgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0VHQUxBWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfRVpLRVkgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0tZRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfR1lSQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldAogIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogIyBDT05GSUdfSElEX0xPR0lURUNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9NSUNST1NPRlQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX01PU0FSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfTU9OVEVSRVkgaXMgbm90IHNldAogIyBDT05GSUdfSElEX05UUklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9PUlRFSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfUEFOVEhFUkxPUkQgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BFVEFMWU5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUNPTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9RVUFOVEEgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1JPQ0NBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUk9DQ0FUX0tPTkUgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1NBTVNVTkcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1NPTlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NUQU5UVU0gaXMgbm90IHNldAogIyBDT05GSUdfSElEX1NVTlBMVVMgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0dSRUVOQVNJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfU01BUlRKT1lQTFVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9UT1BTRUVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9USFJVU1RNQVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1pFUk9QTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9aWURBQ1JPTiBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKQEAgLTEwMzIsNyArMTEzNSw2IEBACiBDT05GSUdfVVNCX0RFVklDRUZTPXkKICMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9NT04gaXMgbm90IHNldApAQCAtMTA1MCw2ICsxMTUyLDcgQEAKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD15CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKQEAgLTExMzMsNiArMTIzNiw3IEBACiAjIENPTkZJR19VU0JfU0VSSUFMX05BVk1BTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX09USTY4NTggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9RQ0FVWCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX1FVQUxDT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfU1BDUDhYNSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0hQNFggaXMgbm90IHNldApAQCAtMTE0Niw2ICsxMjUwLDggQEAKICMgQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX09QVElDT04gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9WSVZPUEFZX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1pJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0RFQlVHIGlzIG5vdCBzZXQKIAogIwpAQCAtMTE1OCw3ICsxMjY0LDYgQEAKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldApAQCAtMTE3MSw3ICsxMjc2LDYgQEAKICMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CiAKICMKQEAgLTExODksMTAgKzEyOTMsNiBAQAogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVEkgVkxZTlEKLSMKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCkBAIC0xMjE0LDYgKzEzMTQsNyBAQAogIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC0xMjc0LDYgKzEzNzUsNyBAQAogIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9SVElNRT15CiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dGUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JBTUZTPXkKICMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldApAQCAtMTI4NCw3ICsxMzg2LDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTI5OSw2ICsxNDAwLDcgQEAKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DRVBIX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldApAQCAtMTM2MCw2ICsxNDYyLDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMzkzLDE1ICsxNDk2LDI1IEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiBDT05GSUdfRlRSQUNFPXkKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldApAQCAtMTQxMCwxOSArMTUyMywyMiBAQAogQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQogIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNRU1DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0icncgZGhhc2hfZW50cmllcz0xMDI0IGloYXNoX2VudHJpZXM9MTAyNCBpcD0xMC4wLjEuMzoxMC4wLjEuMToxMC4wLjEuMToyNTUuMjU1LjI1NS4wOnpldXM6ZXRoMDogcm9vdD0vZGV2L25mcyBuZnNyb290PS9uZnNyb290L2NyYW1mcyx3c2l6ZT01MTIscnNpemU9NTEyLHRjcCBub2tnZGIgY29uc29sZT10dHlVU0IwLDExNTIwMCBtZW1zaXplPTI1Mk0iCitDT05GSUdfQ01ETElORT0iIgogIyBDT05GSUdfQ01ETElORV9PVkVSUklERSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVU5USU1FX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSU5MT0NLX1RFU1QgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTE0MzAsMTMgKzE1NDYsMTYgQEAKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TTUFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1RPTU9ZTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKIENPTkZJR19DUllQVE89eQogCiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQogQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRD15CkBAIC0xNDc5LDExICsxNTk4LDEzIEBACiAjCiBDT05GSUdfQ1JZUFRPX0hNQUM9eQogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9kZWMvTWFrZWZpbGUKaW5kZXggYzUzMDIwOGUuLjllYjJmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2RlYy9NYWtlZmlsZQpAQCAtOCw1ICs4LDMgQEAKIG9iai0kKENPTkZJR19QUk9NX0NPTlNPTEUpCSs9IHByb21jb24ubwogb2JqLSQoQ09ORklHX1RDKQkJKz0gdGMubwogb2JqLSQoQ09ORklHX0NQVV9IQVNfV0IpCSs9IHdiZmx1c2gubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9kZWMvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYmNiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9kZWMvUGxhdGZvcm0KQEAgLTAsMCArMSw4IEBACisjCisjIERFQ3N0YXRpb24gZmFtaWx5CisjCitwbGF0Zm9ybS0kKENPTkZJR19NQUNIX0RFQ1NUQVRJT04pCT0gZGVjLworY2ZsYWdzLSQoQ09ORklHX01BQ0hfREVDU1RBVElPTikJKz0gXAorCQkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRlYworbGlicy0kKENPTkZJR19NQUNIX0RFQ1NUQVRJT04pCQkrPSBhcmNoL21pcHMvZGVjL3Byb20vCitsb2FkLSQoQ09ORklHX01BQ0hfREVDU1RBVElPTikJCSs9IDB4ZmZmZmZmZmY4MDA0MDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9wcm9tY29uLmMgYi9hcmNoL21pcHMvZGVjL3Byb21jb24uYwppbmRleCA5ZjA5NzJmLi5jMjM5YzI1YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy9wcm9tY29uLmMKKysrIGIvYXJjaC9taXBzL2RlYy9wcm9tY29uLmMKQEAgLTMzLDggKzMzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPQoteworc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPSB7CiAJLm5hbWUJPSAidHR5UyIsCiAJLndyaXRlCT0gcHJvbV9jb25zb2xlX3dyaXRlLAogCS5zZXR1cAk9IHByb21fY29uc29sZV9zZXR1cCwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hL01ha2VmaWxlIGIvYXJjaC9taXBzL2VtbWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1NGEzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9lbW1hL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorb2JqLSQoQ09ORklHX1NPQ19FTU1BMlJIKQkrPSBjb21tb24vCisKKyMKKyMgTkVDIEVNTUEyUkggTWFyay1laW5zCisjCitvYmotJChDT05GSUdfTkVDX01BUktFSU5TKQkrPSBtYXJrZWlucy8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hL1BsYXRmb3JtIGIvYXJjaC9taXBzL2VtbWEvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4MmY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9lbW1hL1BsYXRmb3JtCkBAIC0wLDAgKzEsNCBAQAorcGxhdGZvcm0tJChDT05GSUdfU09DX0VNTUEyUkgpCSs9IGVtbWEvCitjZmxhZ3MtJChDT05GSUdfU09DX0VNTUEyUkgpCSs9CQkJCQlcCisJCS1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1lbW1hMnJoCitsb2FkLSQoQ09ORklHX05FQ19NQVJLRUlOUykJKz0gMHhmZmZmZmZmZjg4MTAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZW1tYS9tYXJrZWlucy9pcnEuYyBiL2FyY2gvbWlwcy9lbW1hL21hcmtlaW5zL2lycS5jCmluZGV4IDk1MDRiN2UuLjNhOTY3OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9lbW1hL21hcmtlaW5zL2lycS5jCisrKyBiL2FyY2gvbWlwcy9lbW1hL21hcmtlaW5zL2lycS5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAkvKiBzZXR1cCBjYXNjYWRlIGludGVycnVwdHMgKi8KIAlzZXR1cF9pcnEoRU1NQTJSSF9JUlFfQkFTRSArIEVNTUEyUkhfU1dfQ0FTQ0FERSwgJmlycV9jYXNjYWRlKTsKIAlzZXR1cF9pcnEoRU1NQTJSSF9JUlFfQkFTRSArIEVNTUEyUkhfR1BJT19DQVNDQURFLCAmaXJxX2Nhc2NhZGUpOwotCXNldHVwX2lycShDUFVfSVJRX0JBU0UgKyBDUFVfRU1NQTJSSF9DQVNDQURFLCAmaXJxX2Nhc2NhZGUpOworCXNldHVwX2lycShNSVBTX0NQVV9JUlFfQkFTRSArIDIsICZpcnFfY2FzY2FkZSk7CiB9CiAKIGFzbWxpbmthZ2Ugdm9pZCBwbGF0X2lycV9kaXNwYXRjaCh2b2lkKQpAQCAtMzA5LDEzICszMDksMTMgQEAKICAgICAgICAgdW5zaWduZWQgaW50IHBlbmRpbmcgPSByZWFkX2MwX3N0YXR1cygpICYgcmVhZF9jMF9jYXVzZSgpICYgU1QwX0lNOwogCiAJaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQNykKLQkJZG9fSVJRKENQVV9JUlFfQkFTRSArIDcpOworCQlkb19JUlEoTUlQU19DUFVfSVJRX0JBU0UgKyA3KTsKIAllbHNlIGlmIChwZW5kaW5nICYgU1RBVFVTRl9JUDIpCiAJCWVtbWEycmhfaXJxX2Rpc3BhdGNoKCk7CiAJZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVAxKQotCQlkb19JUlEoQ1BVX0lSUV9CQVNFICsgMSk7CisJCWRvX0lSUShNSVBTX0NQVV9JUlFfQkFTRSArIDEpOwogCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQMCkKLQkJZG9fSVJRKENQVV9JUlFfQkFTRSArIDApOworCQlkb19JUlEoTUlQU19DUFVfSVJRX0JBU0UgKyAwKTsKIAllbHNlCiAJCXNwdXJpb3VzX2ludGVycnVwdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2VtbWEvbWFya2VpbnMvc2V0dXAuYyBiL2FyY2gvbWlwcy9lbW1hL21hcmtlaW5zL3NldHVwLmMKaW5kZXggOWIzZjUxZS4uZmVjZWViYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEvbWFya2VpbnMvc2V0dXAuYworKysgYi9hcmNoL21pcHMvZW1tYS9tYXJrZWlucy9zZXR1cC5jCkBAIC01Miw3ICs1Miw2IEBACiAKIHN0YXRpYyB2b2lkIG1hcmtlaW5zX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JcHJpbnRrKCJFTU1BMlJIIE1hcmstZWlucyBoYWx0ZWQuIFBsZWFzZSB0dXJuIG9mZiB0aGUgcG93ZXIuXG4iKTsKIAltYXJrZWluc19sZWQoInBvd2Vyb2ZmLiIpOwogCXdoaWxlICgxKSA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvTWFrZWZpbGUgYi9hcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWQyODIuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIwotIyBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0jIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIENvcHlyaWdodCAyMDA2IFdpbmQgUml2ZXIgU3lzdGVtLCBJbmMuCi0jIEF1dGhvcjogUm9uZ2thaS5aaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4KLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBXaW5kIFJpdmVyIE1JUFMgNEtDIFBQTUMgRXZhbCBCb2FyZAotIwotCi1vYmoteSArPSBpcnEubyBwY2kubyByZXNldC5vIHNlcmlhbC5vIHNldHVwLm8gdGltZS5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXJjaF9od2VpZ2h0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXJjaF9od2VpZ2h0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyYTc0NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hcmNoX2h3ZWlnaHQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9BU01fQVJDSF9IV0VJR0hUX0gKKyNkZWZpbmUgX0FTTV9BUkNIX0hXRUlHSFRfSAorCisjaWZkZWYgQVJDSF9IQVNfVVNBQkxFX0JVSUxUSU5fUE9QQ09VTlQKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2FyY2hfaHdlaWdodDMyKHVuc2lnbmVkIGludCB3KQoreworCXJldHVybiBfX2J1aWx0aW5fcG9wY291bnQodyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXJjaF9od2VpZ2h0MTYodW5zaWduZWQgaW50IHcpCit7CisJcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudCh3ICYgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hcmNoX2h3ZWlnaHQ4KHVuc2lnbmVkIGludCB3KQoreworCXJldHVybiBfX2J1aWx0aW5fcG9wY291bnQodyAmIDB4ZmYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19hcmNoX2h3ZWlnaHQ2NChfX3U2NCB3KQoreworCXJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbCh3KTsKK30KKworI2Vsc2UKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvYXJjaF9od2VpZ2h0Lmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fQVJDSF9IV0VJR0hUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCA5MjU1Y2ZiLi5iMGNlN2NhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC03MDAsNyArNzAwLDEwIEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoX2h3ZWlnaHQuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvY29uc3RfaHdlaWdodC5oPgorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2V4dDItbm9uLWF0b21pYy5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9leHQyLWF0b21pYy5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9taW5peC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaAppbmRleCAwOWVlZTA5Li4xNWE4ZWYwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaApAQCAtNzEsNiArNzEsMTIgQEAKICNkZWZpbmUgTUFDSF9MRU1PVEVfTEwyRiAgICAgICA3CiAjZGVmaW5lIE1BQ0hfTE9PTkdTT05fRU5EICAgICAgOAogCisvKgorICogVmFsaWQgbWFjaHR5cGUgZm9yIGdyb3VwIElOR0VOSUMKKyAqLworI2RlZmluZSAgTUFDSF9JTkdFTklDX0paNDczMAkwCS8qIEpaNDczMCBTT0MJCSovCisjZGVmaW5lICBNQUNIX0lOR0VOSUNfSlo0NzQwCTEJLyogSlo0NzQwIFNPQwkJKi8KKwogZXh0ZXJuIGNoYXIgKnN5c3RlbV90eXBlOwogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnJlYWsuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9icmVhay5oCmluZGV4IDQ0NDM3ZWQuLjkxNjFlNjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9icmVhay5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9icmVhay5oCkBAIC0zMCw2ICszMCw4IEBACiAjZGVmaW5lIEJSS19CVUcJCTUxMgkvKiBVc2VkIGJ5IEJVRygpICovCiAjZGVmaW5lIEJSS19LREIJCTUxMwkvKiBVc2VkIGluIEtEQl9FTlRFUigpICovCiAjZGVmaW5lIEJSS19NRU1VCTUxNAkvKiBVc2VkIGJ5IEZQVSBlbXVsYXRvciAqLworI2RlZmluZSBCUktfS1BST0JFX0JQCTUxNQkvKiBLcHJvYmUgYnJlYWsgKi8KKyNkZWZpbmUgQlJLX0tQUk9CRV9TU1RFUEJQIDUxNgkvKiBLcHJvYmUgc2luZ2xlIHN0ZXAgc29mdHdhcmUgaW1wbGVtZW50YXRpb24gKi8KICNkZWZpbmUgQlJLX01VTE9WRgkxMDIzCS8qIE11bHRpcGx5IG92ZXJmbG93ICovCiAKICNlbmRpZiAvKiBfX0FTTV9CUkVBS19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2FjaGVvcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZW9wcy5oCmluZGV4IDI1NmFkMmMuLjhmOTljMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZW9wcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZW9wcy5oCkBAIC02Miw2ICs2Miw4IEBACiAgKiBSTTcwMDAtc3BlY2lmaWMgY2FjaGVvcHMKICAqLwogI2RlZmluZSBQYWdlX0ludmFsaWRhdGVfVAkweDE2CisjZGVmaW5lIEluZGV4X1N0b3JlX1RhZ19UCTB4MGEKKyNkZWZpbmUgSW5kZXhfTG9hZF9UYWdfVAkweDA2CiAKIC8qCiAgKiBSMTAwMDAtc3BlY2lmaWMgY2FjaGVvcHMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jb3AyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY29wMi5oCmluZGV4IDZiMDRjOTguLjJjYjJmMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jb3AyLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvcDIuaApAQCAtOSw2ICs5LDggQEAKICNpZm5kZWYgX19BU01fQ09QMl9ICiAjZGVmaW5lIF9fQVNNX0NPUDJfSAogCisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKwogZW51bSBjdTJfb3BzIHsKIAlDVTJfRVhDRVBUSU9OLAogCUNVMl9MV0MyX09QLApAQCAtMjAsNCArMjIsMTQgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY3UyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIGludCBjdTJfbm90aWZpZXJfY2FsbF9jaGFpbih1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdik7CiAKKyNkZWZpbmUgY3UyX25vdGlmaWVyKGZuLCBwcmkpCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmbiMjX25iIF9fY3B1aW5pdGRhdGEgPSB7CQlcCisJCS5ub3RpZmllcl9jYWxsID0gZm4sCQkJCQlcCisJCS5wcmlvcml0eSA9IHByaQkJCQkJCVwKKwl9OwkJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJlZ2lzdGVyX2N1Ml9ub3RpZmllcigmZm4jI19uYik7CQkJCVwKK30pCisKICNlbmRpZiAvKiBfX0FTTV9DT1AyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaAppbmRleCBhYzczY2VkLi5jYTQwMGY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1mZWF0dXJlcy5oCkBAIC0xNTksNyArMTU5LDggQEAKIAogLyoKICAqIE1JUFMzMiwgTUlQUzY0LCBWUjU1MDAsIElEVDMyMzMyLCBJRFQzMjMzNCBhbmQgbWF5YmUgYSBmZXcgb3RoZXIKLSAqIHByZS1NSVBTMzIvTUlQUzUzIHByb2Nlc3NvcnMgaGF2ZSBDTE8sIENMWi4gIEZvciA2NC1iaXQga2VybmVscworICogcHJlLU1JUFMzMi9NSVBTNTMgcHJvY2Vzc29ycyBoYXZlIENMTywgQ0xaLiAgVGhlIElEVCBSQzY0NTc0IGlzIDY0LWJpdCBhbmQKKyAqIGhhcyBDTE8gYW5kIENMWiBidXQgbm90IERDTE8gbm9yIERDTFouICBGb3IgNjQtYml0IGtlcm5lbHMKICAqIGNwdV9oYXNfY2xvX2NseiBhbHNvIGluZGljYXRlcyB0aGUgYXZhaWxhYmlsaXR5IG9mIERDTE8gYW5kIERDTFouCiAgKi8KICMgaWZuZGVmIGNwdV9oYXNfY2xvX2NsegpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCmluZGV4IGE1YWNkYTQuLmIyMDFhOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgUFJJRF9DT01QX0xTSQkJMHgwODAwMDAKICNkZWZpbmUgUFJJRF9DT01QX0xFWFJBCQkweDBiMDAwMAogI2RlZmluZSBQUklEX0NPTVBfQ0FWSVVNCTB4MGQwMDAwCi0KKyNkZWZpbmUgUFJJRF9DT01QX0lOR0VOSUMJMHhkMDAwMDAKIAogLyoKICAqIEFzc2lnbmVkIHZhbHVlcyBmb3IgdGhlIHByb2R1Y3QgSUQgcmVnaXN0ZXIuICBJbiBvcmRlciB0byBkZXRlY3QgYQpAQCAtMTMzLDYgKzEzMywxMiBAQAogI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ041MlhYIDB4MDcwMAogCiAvKgorICogVGhlc2UgYXJlIHRoZSBQUklEJ3MgZm9yIHdoZW4gMjM6MTYgPT0gUFJJRF9DT01QX0lOR0VOSUMKKyAqLworCisjZGVmaW5lIFBSSURfSU1QX0paUklTQyAgICAgICAgMHgwMjAwCisKKy8qCiAgKiBEZWZpbml0aW9ucyBmb3IgNzowIG9uIGxlZ2FjeSBwcm9jZXNzb3JzCiAgKi8KIApAQCAtMjE5LDYgKzIyNSw3IEBACiAJQ1BVXzRLQywgQ1BVXzRLRUMsIENQVV80S1NDLCBDUFVfMjRLLCBDUFVfMzRLLCBDUFVfMTAwNEssIENQVV83NEssCiAJQ1BVX0FMQ0hFTVksIENQVV9QUjQ0NTAsIENQVV9CQ00zMzAyLCBDUFVfQkNNNDcxMCwKIAlDUFVfQkNNNjMzOCwgQ1BVX0JDTTYzNDUsIENQVV9CQ002MzQ4LCBDUFVfQkNNNjM1OCwKKwlDUFVfSlpSSVNDLAogCiAJLyoKIAkgKiBNSVBTNjQgY2xhc3MgcHJvY2Vzc29ycwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IGVhNzdhNDIuLmZkMWQzOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTM3Miw0ICszNzIsOSBAQAogc3RydWN0IGxpbnV4X2JpbnBybTsKIGV4dGVybiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sCiAJCQkJICAgICAgIGludCB1c2VzX2ludGVycCk7CisKK3N0cnVjdCBtbV9zdHJ1Y3Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCisKICNlbmRpZiAvKiBfQVNNX0VMRl9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZW1tYS9lbW1hMnJoLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZW1tYS9lbW1hMnJoLmgKaW5kZXggMmFmYjJmZS4uYzE0NDlkMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VtbWEvZW1tYTJyaC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbW1hL2VtbWEycmguaApAQCAtOTksODggKzk5LDIyIEBACiAjZGVmaW5lIEVNTUEyUkhfUENJX0NPTkZJR19CQVNFCUVNTUEyUkhfUENJX0lPX0JBU0UKICNkZWZpbmUgRU1NQTJSSF9QQ0lfQ09ORklHX1NJWkUJRU1NQTJSSF9QQ0lfSU9fU0laRQogCi0jZGVmaW5lIE5VTV9DUFVfSVJRCQk4CiAjZGVmaW5lIE5VTV9FTU1BMlJIX0lSUQkJOTYKIAotI2RlZmluZSBDUFVfRU1NQTJSSF9DQVNDQURFCTIKLSNkZWZpbmUgQ1BVX0lSUV9CQVNFCQlNSVBTX0NQVV9JUlFfQkFTRQotI2RlZmluZSBFTU1BMlJIX0lSUV9CQVNFCShDUFVfSVJRX0JBU0UgKyBOVU1fQ1BVX0lSUSkKKyNkZWZpbmUgRU1NQTJSSF9JUlFfQkFTRQkoTUlQU19DUFVfSVJRX0JBU0UgKyA4KQogCiAvKgogICogZW1tYTJyaCBpcnEgZGVmcwogICovCiAKLSNkZWZpbmUgRU1NQTJSSF9JUlFfSU5UMAkoMCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDEJKDEgKyBFTU1BMlJIX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX0lSUV9JTlQyCSgyICsgRU1NQTJSSF9JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9JUlFfSU5UMwkoMyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQJKDQgKyBFTU1BMlJIX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX0lSUV9JTlQ1CSg1ICsgRU1NQTJSSF9JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9JUlFfSU5UNgkoNiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDcJKDcgKyBFTU1BMlJIX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX0lSUV9JTlQ4CSg4ICsgRU1NQTJSSF9JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9JUlFfSU5UOQkoOSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDEwCSgxMCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDExCSgxMSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDEyCSgxMiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDEzCSgxMyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDE0CSgxNCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDE1CSgxNSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDE2CSgxNiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDE3CSgxNyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDE4CSgxOCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDE5CSgxOSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDIwCSgyMCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDIxCSgyMSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDIyCSgyMiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDIzCSgyMyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDI0CSgyNCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDI1CSgyNSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDI2CSgyNiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDI3CSgyNyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDI4CSgyOCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDI5CSgyOSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDMwCSgzMCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDMxCSgzMSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDMyCSgzMiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDMzCSgzMyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDM0CSgzNCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDM1CSgzNSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDM2CSgzNiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDM3CSgzNyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDM4CSgzOCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDM5CSgzOSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQwCSg0MCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQxCSg0MSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQyCSg0MiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQzCSg0MyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQ0CSg0NCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQ1CSg0NSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQ2CSg0NiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQ3CSg0NyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQ4CSg0OCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDQ5CSg0OSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDUwCSg1MCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDUxCSg1MSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDUyCSg1MiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDUzCSg1MyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDU0CSg1NCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDU1CSg1NSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDU2CSg1NiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDU3CSg1NyArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDU4CSg1OCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDU5CSg1OSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDYwCSg2MCArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDYxCSg2MSArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDYyCSg2MiArIEVNTUEyUkhfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfSVJRX0lOVDYzCSg2MyArIEVNTUEyUkhfSVJRX0JBU0UpCisjZGVmaW5lIEVNTUEyUkhfSVJRX0lOVChuKQkoRU1NQTJSSF9JUlFfQkFTRSArIChuKSkKIAotI2RlZmluZSBFTU1BMlJIX0lSUV9QRlVSMAlFTU1BMlJIX0lSUV9JTlQ0OQotI2RlZmluZSBFTU1BMlJIX0lSUV9QRlVSMQlFTU1BMlJIX0lSUV9JTlQ1MAotI2RlZmluZSBFTU1BMlJIX0lSUV9QRlVSMglFTU1BMlJIX0lSUV9JTlQ1MQotI2RlZmluZSBFTU1BMlJIX0lSUV9QSUlDMAlFTU1BMlJIX0lSUV9JTlQ1NgotI2RlZmluZSBFTU1BMlJIX0lSUV9QSUlDMQlFTU1BMlJIX0lSUV9JTlQ1NwotI2RlZmluZSBFTU1BMlJIX0lSUV9QSUlDMglFTU1BMlJIX0lSUV9JTlQ1OAorI2RlZmluZSBFTU1BMlJIX0lSUV9QRlVSMAlFTU1BMlJIX0lSUV9JTlQoNDkpCisjZGVmaW5lIEVNTUEyUkhfSVJRX1BGVVIxCUVNTUEyUkhfSVJRX0lOVCg1MCkKKyNkZWZpbmUgRU1NQTJSSF9JUlFfUEZVUjIJRU1NQTJSSF9JUlFfSU5UKDUxKQorI2RlZmluZSBFTU1BMlJIX0lSUV9QSUlDMAlFTU1BMlJIX0lSUV9JTlQoNTYpCisjZGVmaW5lIEVNTUEyUkhfSVJRX1BJSUMxCUVNTUEyUkhfSVJRX0lOVCg1NykKKyNkZWZpbmUgRU1NQTJSSF9JUlFfUElJQzIJRU1NQTJSSF9JUlFfSU5UKDU4KQogCiAvKgogICogIEVNTUEyUkggUmVnaXN0ZXIgQWNjZXNzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZW1tYS9tYXJrZWlucy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VtbWEvbWFya2VpbnMuaAppbmRleCAyNjE4YmYyLi5iZjJkMjI5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZW1tYS9tYXJrZWlucy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbW1hL21hcmtlaW5zLmgKQEAgLTI1LDQ0ICsyNSwxMyBAQAogI2RlZmluZSBOVU1fRU1NQTJSSF9JUlFfU1cJMzIKICNkZWZpbmUgTlVNX0VNTUEyUkhfSVJRX0dQSU8JMzIKIAotI2RlZmluZSBFTU1BMlJIX1NXX0NBU0NBREUJKEVNTUEyUkhfSVJRX0lOVDcgLSBFTU1BMlJIX0lSUV9JTlQwKQotI2RlZmluZSBFTU1BMlJIX0dQSU9fQ0FTQ0FERQkoRU1NQTJSSF9JUlFfSU5UNDYgLSBFTU1BMlJIX0lSUV9JTlQwKQorI2RlZmluZSBFTU1BMlJIX1NXX0NBU0NBREUJKEVNTUEyUkhfSVJRX0lOVCg3KSAtIEVNTUEyUkhfSVJRX0lOVCgwKSkKKyNkZWZpbmUgRU1NQTJSSF9HUElPX0NBU0NBREUJKEVNTUEyUkhfSVJRX0lOVCg0NikgLSBFTU1BMlJIX0lSUV9JTlQoMCkpCiAKICNkZWZpbmUgRU1NQTJSSF9TV19JUlFfQkFTRQkoRU1NQTJSSF9JUlFfQkFTRSArIE5VTV9FTU1BMlJIX0lSUSkKICNkZWZpbmUgRU1NQTJSSF9HUElPX0lSUV9CQVNFCShFTU1BMlJIX1NXX0lSUV9CQVNFICsgTlVNX0VNTUEyUkhfSVJRX1NXKQogCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDAJKDArRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMQkoMStFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQyCSgyK0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDMJKDMrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UNAkoNCtFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQ1CSg1K0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDYJKDYrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UNwkoNytFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQ4CSg4K0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDkJKDkrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMTAJKDEwK0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDExCSgxMStFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQxMgkoMTIrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMTMJKDEzK0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDE0CSgxNCtFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQxNQkoMTUrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMTYJKDE2K0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDE3CSgxNytFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQxOAkoMTgrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMTkJKDE5K0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDIwCSgyMCtFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQyMQkoMjErRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMjIJKDIyK0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDIzCSgyMytFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQyNAkoMjQrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMjUJKDI1K0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDI2CSgyNitFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQyNwkoMjcrRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMjgJKDI4K0VNTUEyUkhfU1dfSVJRX0JBU0UpCi0jZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVDI5CSgyOStFTU1BMlJIX1NXX0lSUV9CQVNFKQotI2RlZmluZSBFTU1BMlJIX1NXX0lSUV9JTlQzMAkoMzArRU1NQTJSSF9TV19JUlFfQkFTRSkKLSNkZWZpbmUgRU1NQTJSSF9TV19JUlFfSU5UMzEJKDMxK0VNTUEyUkhfU1dfSVJRX0JBU0UpCisjZGVmaW5lIEVNTUEyUkhfU1dfSVJRX0lOVChuKQkoRU1NQTJSSF9TV19JUlFfQkFTRSArIChuKSkKIAogI2RlZmluZSBNQVJLRUlOU19QQ0lfSVJRX0lOVEEJRU1NQTJSSF9HUElPX0lSUV9CQVNFKzE1CiAjZGVmaW5lIE1BUktFSU5TX1BDSV9JUlFfSU5UQglFTU1BMlJIX0dQSU9fSVJRX0JBU0UrMTYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oYXphcmRzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaGF6YXJkcy5oCmluZGV4IDBlYWY3N2YuLjRlMzMyMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oYXphcmRzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2hhemFyZHMuaApAQCAtODcsNyArODcsNyBAQAogCTogIj1yIiAodG1wKSk7CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjEpICYmICFkZWZpbmVkKENPTkZJR19NQUNIX0FMQ0hFTVkpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfTUlQU1IxKSAmJiAhZGVmaW5lZChDT05GSUdfTUlQU19BTENIRU1ZKQogCiAvKgogICogVGhlc2UgYXJlIHNsaWdodGx5IGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgd2UgZ3VhcmFudGVlIFIxIGtlcm5lbHMgdG8KQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlfX2luc3RydWN0aW9uX2hhemFyZCgpOwkJCQkJXAogfSB3aGlsZSAoMCkKIAotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9BTENIRU1ZKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikgfHwgXAorI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19BTENIRU1ZKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX0xPT05HU09OMikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1IxMDAwMCkgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1I1NTAwKQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW5zdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2luc3QuaAppbmRleCA2NDg5ZjAwLi40NDRmZjcxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW5zdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pbnN0LmgKQEAgLTI0Nyw2ICsyNDcsMTIgQEAKIAl1bnNpZ25lZCBpbnQgZm10IDogMjsKIH07CiAKK3N0cnVjdCBiX2Zvcm1hdCB7IC8qIEJSRUFLIGFuZCBTWVNDQUxMICovCisJdW5zaWduZWQgaW50IG9wY29kZTo2OworCXVuc2lnbmVkIGludCBjb2RlOjIwOworCXVuc2lnbmVkIGludCBmdW5jOjY7Cit9OworCiAjZWxpZiBkZWZpbmVkKF9fTUlQU0VMX18pCiAKIHN0cnVjdCBqX2Zvcm1hdCB7CS8qIEp1bXAgZm9ybWF0ICovCkBAIC0zMTQsNiArMzIwLDEyIEBACiAJdW5zaWduZWQgaW50IG9wY29kZSA6IDY7CiB9OwogCitzdHJ1Y3QgYl9mb3JtYXQgeyAvKiBCUkVBSyBhbmQgU1lTQ0FMTCAqLworCXVuc2lnbmVkIGludCBmdW5jOjY7CisJdW5zaWduZWQgaW50IGNvZGU6MjA7CisJdW5zaWduZWQgaW50IG9wY29kZTo2OworfTsKKwogI2Vsc2UgLyogIWRlZmluZWQgKF9fTUlQU0VCX18pICYmICFkZWZpbmVkIChfX01JUFNFTF9fKSAqLwogI2Vycm9yICJNSVBTIGJ1dCBuZWl0aGVyIF9fTUlQU0VMX18gbm9yIF9fTUlQU0VCX18/IgogI2VuZGlmCkBAIC0zMjgsNyArMzQwLDggQEAKIAlzdHJ1Y3QgY19mb3JtYXQgY19mb3JtYXQ7CiAJc3RydWN0IHJfZm9ybWF0IHJfZm9ybWF0OwogCXN0cnVjdCBmX2Zvcm1hdCBmX2Zvcm1hdDsKLSAgICAgICAgc3RydWN0IG1hX2Zvcm1hdCBtYV9mb3JtYXQ7CisJc3RydWN0IG1hX2Zvcm1hdCBtYV9mb3JtYXQ7CisJc3RydWN0IGJfZm9ybWF0IGJfZm9ybWF0OwogfTsKIAogLyogSEFDSEFDSEFIQ0FIQyAuLi4gICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20va2RlYnVnLmgKaW5kZXggNWJmNjJhYS4uNmE5YWY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZGVidWcuaApAQCAtOCw2ICs4LDkgQEAKIAlESUVfRlAsCiAJRElFX1RSQVAsCiAJRElFX1JJLAorCURJRV9QQUdFX0ZBVUxULAorCURJRV9CUkVBSywKKwlESUVfU1NURVBCUAogfTsKIAogI2VuZGlmIC8qIF9BU01fTUlQU19LREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2tnZGIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZ2RiLmgKaW5kZXggMTkwMDJkNi4uZTZjMGIwZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2tnZGIuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20va2dkYi5oCkBAIC04LDI4ICs4LDI3IEBACiAjaWYgKF9NSVBTX0lTQSA9PSBfTUlQU19JU0FfTUlQUzEpIHx8IChfTUlQU19JU0EgPT0gX01JUFNfSVNBX01JUFMyKSB8fCBcCiAJKF9NSVBTX0lTQSA9PSBfTUlQU19JU0FfTUlQUzMyKQogCi0jZGVmaW5lIEtHREJfR0RCX1JFR19TSVpFIDMyCisjZGVmaW5lIEtHREJfR0RCX1JFR19TSVpFCTMyCisjZGVmaW5lIEdEQl9TSVpFT0ZfUkVHCQlzaXplb2YodTMyKQogCiAjZWxpZiAoX01JUFNfSVNBID09IF9NSVBTX0lTQV9NSVBTMykgfHwgKF9NSVBTX0lTQSA9PSBfTUlQU19JU0FfTUlQUzQpIHx8IFwKIAkoX01JUFNfSVNBID09IF9NSVBTX0lTQV9NSVBTNjQpCiAKICNpZmRlZiBDT05GSUdfMzJCSVQKLSNkZWZpbmUgS0dEQl9HREJfUkVHX1NJWkUgMzIKKyNkZWZpbmUgS0dEQl9HREJfUkVHX1NJWkUJMzIKKyNkZWZpbmUgR0RCX1NJWkVPRl9SRUcJCXNpemVvZih1MzIpCiAjZWxzZSAvKiBDT05GSUdfQ1BVXzMyQklUICovCi0jZGVmaW5lIEtHREJfR0RCX1JFR19TSVpFIDY0CisjZGVmaW5lIEtHREJfR0RCX1JFR19TSVpFCTY0CisjZGVmaW5lIEdEQl9TSVpFT0ZfUkVHCQlzaXplb2YodTY0KQogI2VuZGlmCiAjZWxzZQogI2Vycm9yICJOZWVkIHRvIHNldCBLR0RCX0dEQl9SRUdfU0laRSBmb3IgTUlQUyBJU0EiCiAjZW5kaWYgLyogX01JUFNfSVNBICovCiAKICNkZWZpbmUgQlVGTUFYCQkJMjA0OAotI2lmIChLR0RCX0dEQl9SRUdfU0laRSA9PSAzMikKLSNkZWZpbmUgTlVNUkVHQllURVMJCSg5MCpzaXplb2YodTMyKSkKLSNkZWZpbmUgTlVNQ1JJVFJFR0JZVEVTCQkoMTIqc2l6ZW9mKHUzMikpCi0jZWxzZQotI2RlZmluZSBOVU1SRUdCWVRFUwkJKDkwKnNpemVvZih1NjQpKQotI2RlZmluZSBOVU1DUklUUkVHQllURVMJCSgxMipzaXplb2YodTY0KSkKLSNlbmRpZgorI2RlZmluZSBEQkdfTUFYX1JFR19OVU0JCTcyCisjZGVmaW5lIE5VTVJFR0JZVEVTCQkoREJHX01BWF9SRUdfTlVNICogc2l6ZW9mKEdEQl9TSVpFT0ZfUkVHKSkKKyNkZWZpbmUgTlVNQ1JJVFJFR0JZVEVTCQkoMTIgKiBzaXplb2YoR0RCX1NJWkVPRl9SRUcpKQogI2RlZmluZSBCUkVBS19JTlNUUl9TSVpFCTQKICNkZWZpbmUgQ0FDSEVfRkxVU0hfSVNfU0FGRQkwCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rcHJvYmVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20va3Byb2Jlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWE0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20va3Byb2Jlcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiAgS2VybmVsIFByb2JlcyAoS1Byb2JlcykKKyAqICBpbmNsdWRlL2FzbS1taXBzL2twcm9iZXMuaAorICoKKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKiAgQ29weXJpZ2h0IDIwMTAgQ2F2aXVtIE5ldHdvcmtzCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfQVNNX0tQUk9CRVNfSAorI2RlZmluZSBfQVNNX0tQUk9CRVNfSAorCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9pbnN0Lmg+CisKKyNkZWZpbmUgIF9fQVJDSF9XQU5UX0tQUk9CRVNfSU5TTl9TTE9UCisKK3N0cnVjdCBrcHJvYmU7CitzdHJ1Y3QgcHRfcmVnczsKKwordHlwZWRlZiB1bmlvbiBtaXBzX2luc3RydWN0aW9uIGtwcm9iZV9vcGNvZGVfdDsKKworI2RlZmluZSBNQVhfSU5TTl9TSVpFIDIKKworI2RlZmluZSBmbHVzaF9pbnNuX3Nsb3QocCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylwLT5hZGRyLAkJCVwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXAtPmFkZHIgKwkJCVwKKwkJCSAgIChNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpKTsJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIGtyZXRwcm9iZV9ibGFja2xpc3Rfc2l6ZSAwCisKK3ZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiovCitzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuIHsKKwkvKiBjb3B5IG9mIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLworCWtwcm9iZV9vcGNvZGVfdCAqaW5zbjsKK307CisKK3N0cnVjdCBwcmV2X2twcm9iZSB7CisJc3RydWN0IGtwcm9iZSAqa3A7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBvbGRfU1I7CisJdW5zaWduZWQgbG9uZyBzYXZlZF9TUjsKKwl1bnNpZ25lZCBsb25nIHNhdmVkX2VwYzsKK307CisKKyNkZWZpbmUgTUFYX0pQUk9CRVNfU1RBQ0tfU0laRSAxMjgKKyNkZWZpbmUgTUFYX0pQUk9CRVNfU1RBQ0tfQUREUiBcCisJKCgodW5zaWduZWQgbG9uZyljdXJyZW50X3RocmVhZF9pbmZvKCkpICsgVEhSRUFEX1NJWkUgLSAzMiAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpCisKKyNkZWZpbmUgTUlOX0pQUk9CRVNfU1RBQ0tfU0laRShBRERSKQkJCQkJXAorCSgoKChBRERSKSArIE1BWF9KUFJPQkVTX1NUQUNLX1NJWkUpID4gTUFYX0pQUk9CRVNfU1RBQ0tfQUREUikJXAorCQk/IE1BWF9KUFJPQkVTX1NUQUNLX0FERFIgLSAoQUREUikJCQlcCisJCTogTUFYX0pQUk9CRVNfU1RBQ0tfU0laRSkKKworCisvKiBwZXItY3B1IGtwcm9iZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3Qga3Byb2JlX2N0bGJsayB7CisJdW5zaWduZWQgbG9uZyBrcHJvYmVfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcga3Byb2JlX29sZF9TUjsKKwl1bnNpZ25lZCBsb25nIGtwcm9iZV9zYXZlZF9TUjsKKwl1bnNpZ25lZCBsb25nIGtwcm9iZV9zYXZlZF9lcGM7CisJdW5zaWduZWQgbG9uZyBqcHJvYmVfc2F2ZWRfc3A7CisJc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CisJdTgganByb2Jlc19zdGFja1tNQVhfSlBST0JFU19TVEFDS19TSVpFXTsKKwlzdHJ1Y3QgcHJldl9rcHJvYmUgcHJldl9rcHJvYmU7Cit9OworCitleHRlcm4gaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKKworI2VuZGlmCQkJCS8qIF9BU01fS1BST0JFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9ldGguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZXRoLmgKaW5kZXggYmFlOWI3NS4uNDlkYzhkOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9ldGguaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2V0aC5oCkBAIC05LDYgKzksNyBAQAogCWludCBwaHlfYWRkcjsKIAlpbnQgcGh5X2J1c2lkOwogCWludCBwaHlfaXJxOworCWNoYXIgbWFjWzZdOwogfTsKIAogdm9pZCBfX2luaXQgYXUxeHh4X292ZXJyaWRlX2V0aF9jZmcodW5zaWduZWQgcG9ydCwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvbnZyYW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvbnZyYW0uaAppbmRleCAwZDhjYzE0Li5jNThlYmQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L252cmFtLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9udnJhbS5oCkBAIC0zMSw2ICszMSw5IEBACiAjZGVmaW5lIE5WUkFNX01BWF9WQUxVRV9MRU4gMjU1CiAjZGVmaW5lIE5WUkFNX01BWF9QQVJBTV9MRU4gNjQKIAorI2RlZmluZSBOVlJBTV9FUlJfSU5WX1BBUkFNCS04CisjZGVmaW5lIE5WUkFNX0VSUl9FTlZOT1RGT1VORAktOQorCiBleHRlcm4gaW50IG52cmFtX2dldGVudihjaGFyICpuYW1lLCBjaGFyICp2YWwsIHNpemVfdCB2YWxfbGVuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAppbmRleCBiYmYwNTQwLi5iOTUyZmM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTYxLDIxICs2MSwxOCBAQAogCiAjZGVmaW5lIGtlcm5lbF91c2VzX3NtYXJ0bWlwc19yaXhpIChjcHVfZGF0YVswXS5jcHV0eXBlID09IENQVV9DQVZJVU1fT0NURU9OX1BMVVMpCiAKLSNkZWZpbmUgQVJDSF9IQVNfUkVBRF9DVVJSRU5UX1RJTUVSIDEKICNkZWZpbmUgQVJDSF9IQVNfSVJRX1BFUl9DUFUJMQogI2RlZmluZSBBUkNIX0hBU19TUElOTE9DS19QUkVGRVRDSCAxCiAjZGVmaW5lIHNwaW5fbG9ja19wcmVmZXRjaCh4KSBwcmVmZXRjaCh4KQogI2RlZmluZSBQUkVGRVRDSF9TVFJJREUgMTI4CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICpyZXN1bHQpCi17Ci0JYXNtIHZvbGF0aWxlICgicmRod3IgJTAsJDMxXG4iCi0jaWZuZGVmIENPTkZJR182NEJJVAotCQkgICAgICAiXHRzbGwgJTAsIDAiCisjaWZkZWYgX19PQ1RFT05fXworLyoKKyAqIEFsbCBnY2MgdmVyc2lvbnMgdGhhdCBoYXZlIE9DVEVPTiBzdXBwb3J0IGRlZmluZSBfX09DVEVPTl9fIGFuZCBoYXZlIHRoZQorICogIF9fYnVpbHRpbl9wb3Bjb3VudCBzdXBwb3J0LgorICovCisjZGVmaW5lIEFSQ0hfSEFTX1VTQUJMRV9CVUlMVElOX1BPUENPVU5UIDEKICNlbmRpZgotCQkgICAgICA6ICI9ciIgKCpyZXN1bHQpKTsKLQlyZXR1cm4gMDsKLX0KIAogc3RhdGljIGlubGluZSBpbnQgb2N0ZW9uX2hhc19zYWEodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2lycS5oCmluZGV4IGQzMjIyMGYuLjZkZGFiOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vaXJxLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9pcnEuaApAQCAtMTcyLDcxICsxNzIsOSBAQAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAvKiAxNTIgLSAyMTUgcmVwcmVzZW50IHRoZSBNU0kgaW50ZXJydXB0cyAwLTYzICovCiAjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDAJMTUyCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDEJMTUzCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDIJMTU0Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDMJMTU1Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQJMTU2Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDUJMTU3Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDYJMTU4Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDcJMTU5Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDgJMTYwCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDkJMTYxCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDEwCTE2MgotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQxMQkxNjMKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMTIJMTY0Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDEzCTE2NQotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQxNAkxNjYKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMTUJMTY3Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDE2CTE2OAotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQxNwkxNjkKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMTgJMTcwCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDE5CTE3MQotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyMAkxNzIKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMjEJMTczCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDIyCTE3NAotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyMwkxNzUKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMjQJMTc2Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDI1CTE3NwotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyNgkxNzgKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMjcJMTc5Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDI4CTE4MAotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyOQkxODEKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzAJMTgyCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDMxCTE4MwotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQzMgkxODQKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzMJMTg1Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDM0CTE4NgotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQzNQkxODcKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzYJMTg4Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDM3CTE4OQotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQzOAkxOTAKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzkJMTkxCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQwCTE5MgotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ0MQkxOTMKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNDIJMTk0Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQzCTE5NQotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ0NAkxOTYKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNDUJMTk3Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQ2CTE5OAotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ0NwkxOTkKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNDgJMjAwCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQ5CTIwMQotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1MAkyMDIKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNTEJMjAzCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDUyCTIwNAotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1MwkyMDUKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNTQJMjA2Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDU1CTIwNwotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1NgkyMDgKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNTcJMjA5Ci0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDU4CTIxMAotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1OQkyMTEKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNjAJMjEyCi0jZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDYxCTIxMwotI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ2MgkyMTQKLSNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNjMJMjE1CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0xBU1QJKE9DVEVPTl9JUlFfTVNJX0JJVDAgKyAyNTUpCiAKLSNkZWZpbmUgT0NURU9OX0lSUV9MQVNUICAgICAgICAgMjE2CisjZGVmaW5lIE9DVEVPTl9JUlFfTEFTVAkJKE9DVEVPTl9JUlFfTVNJX0xBU1QgKyAxKQogI2Vsc2UKICNkZWZpbmUgT0NURU9OX0lSUV9MQVNUICAgICAgICAgMTUyCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9iYXNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzMxODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvYmFzZS5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX19BU01fTUFDSF9KWjQ3NDBfQkFTRV9IX18KKyNkZWZpbmUgX19BU01fTUFDSF9KWjQ3NDBfQkFTRV9IX18KKworI2RlZmluZSBKWjQ3NDBfQ1BNX0JBU0VfQUREUgkweDEwMDAwMDAwCisjZGVmaW5lIEpaNDc0MF9JTlRDX0JBU0VfQUREUgkweDEwMDAxMDAwCisjZGVmaW5lIEpaNDc0MF9XRFRfQkFTRV9BRERSCTB4MTAwMDIwMDAKKyNkZWZpbmUgSlo0NzQwX1RDVV9CQVNFX0FERFIJMHgxMDAwMjAxMAorI2RlZmluZSBKWjQ3NDBfUlRDX0JBU0VfQUREUgkweDEwMDAzMDAwCisjZGVmaW5lIEpaNDc0MF9HUElPX0JBU0VfQUREUgkweDEwMDEwMDAwCisjZGVmaW5lIEpaNDc0MF9BSUNfQkFTRV9BRERSCTB4MTAwMjAwMDAKKyNkZWZpbmUgSlo0NzQwX01TQ19CQVNFX0FERFIJMHgxMDAyMTAwMAorI2RlZmluZSBKWjQ3NDBfVUFSVDBfQkFTRV9BRERSCTB4MTAwMzAwMDAKKyNkZWZpbmUgSlo0NzQwX1VBUlQxX0JBU0VfQUREUgkweDEwMDMxMDAwCisjZGVmaW5lIEpaNDc0MF9JMkNfQkFTRV9BRERSCTB4MTAwNDIwMDAKKyNkZWZpbmUgSlo0NzQwX1NTSV9CQVNFX0FERFIJMHgxMDA0MzAwMAorI2RlZmluZSBKWjQ3NDBfU0FEQ19CQVNFX0FERFIJMHgxMDA3MDAwMAorI2RlZmluZSBKWjQ3NDBfRU1DX0JBU0VfQUREUgkweDEzMDEwMDAwCisjZGVmaW5lIEpaNDc0MF9ETUFDX0JBU0VfQUREUgkweDEzMDIwMDAwCisjZGVmaW5lIEpaNDc0MF9VSENfQkFTRV9BRERSCTB4MTMwMzAwMDAKKyNkZWZpbmUgSlo0NzQwX1VEQ19CQVNFX0FERFIJMHgxMzA0MDAwMAorI2RlZmluZSBKWjQ3NDBfTENEX0JBU0VfQUREUgkweDEzMDUwMDAwCisjZGVmaW5lIEpaNDc0MF9TTENEX0JBU0VfQUREUgkweDEzMDUwMDAwCisjZGVmaW5lIEpaNDc0MF9DSU1fQkFTRV9BRERSCTB4MTMwNjAwMDAKKyNkZWZpbmUgSlo0NzQwX0lQVV9CQVNFX0FERFIJMHgxMzA4MDAwMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9jbG9jay5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3NDA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9jbG9jay5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0paNDc0MF9DTE9DS19IX18KKyNkZWZpbmUgX19BU01fSlo0NzQwX0NMT0NLX0hfXworCitlbnVtIGp6NDc0MF93YWl0X21vZGUgeworCUpaNDc0MF9XQUlUX01PREVfSURMRSwKKwlKWjQ3NDBfV0FJVF9NT0RFX1NMRUVQLAorfTsKKwordm9pZCBqejQ3NDBfY2xvY2tfc2V0X3dhaXRfbW9kZShlbnVtIGp6NDc0MF93YWl0X21vZGUgbW9kZSk7CisKK3ZvaWQgano0NzQwX2Nsb2NrX3VkY19lbmFibGVfYXV0b19zdXNwZW5kKHZvaWQpOwordm9pZCBqejQ3NDBfY2xvY2tfdWRjX2Rpc2FibGVfYXV0b19zdXNwZW5kKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJlNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpZm5kZWYgX19BU01fTUFDSF9KWjQ3NDBfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKKyNkZWZpbmUgX19BU01fTUFDSF9KWjQ3NDBfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKKworI2RlZmluZSBjcHVfaGFzX3RsYiAxCisjZGVmaW5lIGNwdV9oYXNfNGtleAkJMQorI2RlZmluZSBjcHVfaGFzXzNrX2NhY2hlCTAKKyNkZWZpbmUgY3B1X2hhc180a19jYWNoZQkxCisjZGVmaW5lIGNwdV9oYXNfdHgzOV9jYWNoZQkwCisjZGVmaW5lIGNwdV9oYXNfZnB1CQkwCisjZGVmaW5lIGNwdV9oYXNfMzJmcHIJMAorI2RlZmluZSBjcHVfaGFzX2NvdW50ZXIJCTAKKyNkZWZpbmUgY3B1X2hhc193YXRjaAkJMQorI2RlZmluZSBjcHVfaGFzX2RpdmVjCQkxCisjZGVmaW5lIGNwdV9oYXNfdmNlCQkwCisjZGVmaW5lIGNwdV9oYXNfY2FjaGVfY2RleF9wCTAKKyNkZWZpbmUgY3B1X2hhc19jYWNoZV9jZGV4X3MJMAorI2RlZmluZSBjcHVfaGFzX3ByZWZldGNoCTEKKyNkZWZpbmUgY3B1X2hhc19tY2hlY2sgMQorI2RlZmluZSBjcHVfaGFzX2VqdGFnIDEKKyNkZWZpbmUgY3B1X2hhc19sbHNjCQkxCisjZGVmaW5lIGNwdV9oYXNfbWlwczE2IDAKKyNkZWZpbmUgY3B1X2hhc19tZG14IDAKKyNkZWZpbmUgY3B1X2hhc19taXBzM2QgMAorI2RlZmluZSBjcHVfaGFzX3NtYXJ0bWlwcyAwCisjZGVmaW5lIGtlcm5lbF91c2VzX2xsc2MJMQorI2RlZmluZSBjcHVfaGFzX3Z0YWdfaWNhY2hlCTEKKyNkZWZpbmUgY3B1X2hhc19kY19hbGlhc2VzCTAKKyNkZWZpbmUgY3B1X2hhc19pY19maWxsc19mX2RjCTAKKyNkZWZpbmUgY3B1X2hhc19waW5kZXhlZF9kY2FjaGUgMAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIxCTEKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMgkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0cjEJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIyCTAKKyNkZWZpbmUgY3B1X2hhc19kc3AJCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzbXQJCTAKKyNkZWZpbmUgY3B1X2hhc191c2VybG9jYWwJMAorI2RlZmluZSBjcHVfaGFzX25vZnB1ZXggMAorI2RlZmluZSBjcHVfaGFzXzY0Yml0cwkJMAorI2RlZmluZSBjcHVfaGFzXzY0Yml0X3plcm9fcmVnIDAKKyNkZWZpbmUgY3B1X2hhc19pbmNsdXNpdmVfcGNhY2hlcyAwCisKKyNkZWZpbmUgY3B1X2RjYWNoZV9saW5lX3NpemUoKQkzMgorI2RlZmluZSBjcHVfaWNhY2hlX2xpbmVfc2l6ZSgpCTMyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2RtYS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYmUxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvZG1hLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICogIEpaNzQyMC9KWjQ3NDAgRE1BIGRlZmluaXRpb25zCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9NQUNIX0paNDc0MF9ETUFfSF9fCisjZGVmaW5lIF9fQVNNX01BQ0hfSlo0NzQwX0RNQV9IX18KKworc3RydWN0IGp6NDc0MF9kbWFfY2hhbjsKKworZW51bSBqejQ3NDBfZG1hX3JlcXVlc3RfdHlwZSB7CisJSlo0NzQwX0RNQV9UWVBFX0FVVE9fUkVRVUVTVAk9IDgsCisJSlo0NzQwX0RNQV9UWVBFX1VBUlRfVFJBTlNNSVQJPSAyMCwKKwlKWjQ3NDBfRE1BX1RZUEVfVUFSVF9SRUNFSVZFCT0gMjEsCisJSlo0NzQwX0RNQV9UWVBFX1NQSV9UUkFOU01JVAk9IDIyLAorCUpaNDc0MF9ETUFfVFlQRV9TUElfUkVDRUlWRQk9IDIzLAorCUpaNDc0MF9ETUFfVFlQRV9BSUNfVFJBTlNNSVQJPSAyNCwKKwlKWjQ3NDBfRE1BX1RZUEVfQUlDX1JFQ0VJVkUJPSAyNSwKKwlKWjQ3NDBfRE1BX1RZUEVfTU1DX1RSQU5TTUlUCT0gMjYsCisJSlo0NzQwX0RNQV9UWVBFX01NQ19SRUNFSVZFCT0gMjcsCisJSlo0NzQwX0RNQV9UWVBFX1RDVQkJPSAyOCwKKwlKWjQ3NDBfRE1BX1RZUEVfU0FEQwkJPSAyOSwKKwlKWjQ3NDBfRE1BX1RZUEVfU0xDRAkJPSAzMCwKK307CisKK2VudW0gano0NzQwX2RtYV93aWR0aCB7CisJSlo0NzQwX0RNQV9XSURUSF8zMkJJVAk9IDAsCisJSlo0NzQwX0RNQV9XSURUSF84QklUCT0gMSwKKwlKWjQ3NDBfRE1BX1dJRFRIXzE2QklUCT0gMiwKK307CisKK2VudW0gano0NzQwX2RtYV90cmFuc2Zlcl9zaXplIHsKKwlKWjQ3NDBfRE1BX1RSQU5TRkVSX1NJWkVfNEJZVEUgID0gMCwKKwlKWjQ3NDBfRE1BX1RSQU5TRkVSX1NJWkVfMUJZVEUgID0gMSwKKwlKWjQ3NDBfRE1BX1RSQU5TRkVSX1NJWkVfMkJZVEUgID0gMiwKKwlKWjQ3NDBfRE1BX1RSQU5TRkVSX1NJWkVfMTZCWVRFID0gMywKKwlKWjQ3NDBfRE1BX1RSQU5TRkVSX1NJWkVfMzJCWVRFID0gNCwKK307CisKK2VudW0gano0NzQwX2RtYV9mbGFncyB7CisJSlo0NzQwX0RNQV9TUkNfQVVUT0lOQyA9IDB4MiwKKwlKWjQ3NDBfRE1BX0RTVF9BVVRPSU5DID0gMHgxLAorfTsKKworZW51bSBqejQ3NDBfZG1hX21vZGUgeworCUpaNDc0MF9ETUFfTU9ERV9TSU5HTEUJPSAwLAorCUpaNDc0MF9ETUFfTU9ERV9CTE9DSwk9IDEsCit9OworCitzdHJ1Y3Qgano0NzQwX2RtYV9jb25maWcgeworCWVudW0gano0NzQwX2RtYV93aWR0aCBzcmNfd2lkdGg7CisJZW51bSBqejQ3NDBfZG1hX3dpZHRoIGRzdF93aWR0aDsKKwllbnVtIGp6NDc0MF9kbWFfdHJhbnNmZXJfc2l6ZSB0cmFuc2Zlcl9zaXplOworCWVudW0gano0NzQwX2RtYV9yZXF1ZXN0X3R5cGUgcmVxdWVzdF90eXBlOworCWVudW0gano0NzQwX2RtYV9mbGFncyBmbGFnczsKKwllbnVtIGp6NDc0MF9kbWFfbW9kZSBtb2RlOworfTsKKwordHlwZWRlZiB2b2lkICgqano0NzQwX2RtYV9jb21wbGV0ZV9jYWxsYmFja190KShzdHJ1Y3Qgano0NzQwX2RtYV9jaGFuICosIGludCwgdm9pZCAqKTsKKworc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqano0NzQwX2RtYV9yZXF1ZXN0KHZvaWQgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGp6NDc0MF9kbWFfZnJlZShzdHJ1Y3Qgano0NzQwX2RtYV9jaGFuICpkbWEpOworCit2b2lkIGp6NDc0MF9kbWFfY29uZmlndXJlKHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSwKKwljb25zdCBzdHJ1Y3Qgano0NzQwX2RtYV9jb25maWcgKmNvbmZpZyk7CisKKwordm9pZCBqejQ3NDBfZG1hX2VuYWJsZShzdHJ1Y3Qgano0NzQwX2RtYV9jaGFuICpkbWEpOwordm9pZCBqejQ3NDBfZG1hX2Rpc2FibGUoc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqZG1hKTsKKwordm9pZCBqejQ3NDBfZG1hX3NldF9zcmNfYWRkcihzdHJ1Y3Qgano0NzQwX2RtYV9jaGFuICpkbWEsIGRtYV9hZGRyX3Qgc3JjKTsKK3ZvaWQgano0NzQwX2RtYV9zZXRfZHN0X2FkZHIoc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqZG1hLCBkbWFfYWRkcl90IGRzdCk7Cit2b2lkIGp6NDc0MF9kbWFfc2V0X3RyYW5zZmVyX2NvdW50KHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSwgdWludDMyX3QgY291bnQpOworCit1aW50MzJfdCBqejQ3NDBfZG1hX2dldF9yZXNpZHVlKGNvbnN0IHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSk7CisKK3ZvaWQgano0NzQwX2RtYV9zZXRfY29tcGxldGVfY2Ioc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqZG1hLAorCWp6NDc0MF9kbWFfY29tcGxldGVfY2FsbGJhY2tfdCBjYik7CisKKyNlbmRpZiAgLyogX19BU01fSlo0NzQwX0RNQV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNzQ3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvZ3Bpby5oCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOSwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIEdQSU8gcGluIGRlZmluaXRpb25zCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9KWl9HUElPX0gKKyNkZWZpbmUgX0paX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSBqel9ncGlvX2Z1bmN0aW9uIHsKKyAgICBKWl9HUElPX0ZVTkNfTk9ORSwKKyAgICBKWl9HUElPX0ZVTkMxLAorICAgIEpaX0dQSU9fRlVOQzIsCisgICAgSlpfR1BJT19GVU5DMywKK307CisKKworLyoKKyBVc3VhbGx5IGEgZHJpdmVyIGZvciBhIFNvQyBjb21wb25lbnQgaGFzIHRvIHJlcXVlc3Qgc2V2ZXJhbCBncGlvIHBpbnMgYW5kCisgY29uZmlndXJlIHRoZW0gYXMgZnVuY2lvbiBwaW5zLgorIGp6X2dwaW9fYnVsa19yZXF1ZXN0IGNhbiBiZSB1c2VkIHRvIGVhc2UgdGhpcyBwcm9jZXNzLgorIFVzdWFsbHkgb25lIHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlOgorCisgY29uc3Qgc3RhdGljIHN0cnVjdCBqel9ncGlvX2J1bGtfcmVxdWVzdCBpMmNfcGluc1tdID0geworCUpaX0dQSU9fQlVMS19QSU4oSTJDX1NEQSksCisJSlpfR1BJT19CVUxLX1BJTihJMkNfU0NLKSwKKyB9OworCisgaW5zaWRlIHRoZSBwcm9iZSBmdW5jdGlvbjoKKworICAgIHJldCA9IGp6X2dwaW9fYnVsa19yZXF1ZXN0KGkyY19waW5zLCBBUlJBWV9TSVpFKGkyY19waW5zKSk7CisgICAgaWYgKHJldCkgeworCS4uLgorCisgaW5zaWRlIHRoZSByZW1vdmUgZnVuY3Rpb246CisKKyAgICBqel9ncGlvX2J1bGtfZnJlZShpMmNfcGlucywgQVJSQVlfU0laRShpMmNfcGlucykpOworCisKKyovCitzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QgeworCWludCBncGlvOworCWNvbnN0IGNoYXIgKm5hbWU7CisJZW51bSBqel9ncGlvX2Z1bmN0aW9uIGZ1bmN0aW9uOworfTsKKworI2RlZmluZSBKWl9HUElPX0JVTEtfUElOKHBpbikgeyBcCisgICAgLmdwaW8gPSBKWl9HUElPXyAjIyBwaW4sIFwKKyAgICAubmFtZSA9ICNwaW4sIFwKKyAgICAuZnVuY3Rpb24gPSBKWl9HUElPX0ZVTkNfICMjIHBpbiBcCit9CisKK2ludCBqel9ncGlvX2J1bGtfcmVxdWVzdChjb25zdCBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QgKnJlcXVlc3QsIHNpemVfdCBudW0pOwordm9pZCBqel9ncGlvX2J1bGtfZnJlZShjb25zdCBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QgKnJlcXVlc3QsIHNpemVfdCBudW0pOwordm9pZCBqel9ncGlvX2J1bGtfc3VzcGVuZChjb25zdCBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QgKnJlcXVlc3QsIHNpemVfdCBudW0pOwordm9pZCBqel9ncGlvX2J1bGtfcmVzdW1lKGNvbnN0IHN0cnVjdCBqel9ncGlvX2J1bGtfcmVxdWVzdCAqcmVxdWVzdCwgc2l6ZV90IG51bSk7Cit2b2lkIGp6X2dwaW9fZW5hYmxlX3B1bGx1cCh1bnNpZ25lZCBncGlvKTsKK3ZvaWQganpfZ3Bpb19kaXNhYmxlX3B1bGx1cCh1bnNpZ25lZCBncGlvKTsKK2ludCBqel9ncGlvX3NldF9mdW5jdGlvbihpbnQgZ3BpbywgZW51bSBqel9ncGlvX2Z1bmN0aW9uIGZ1bmN0aW9uKTsKKworaW50IGp6X2dwaW9fcG9ydF9kaXJlY3Rpb25faW5wdXQoaW50IHBvcnQsIHVpbnQzMl90IG1hc2spOworaW50IGp6X2dwaW9fcG9ydF9kaXJlY3Rpb25fb3V0cHV0KGludCBwb3J0LCB1aW50MzJfdCBtYXNrKTsKK3ZvaWQganpfZ3Bpb19wb3J0X3NldF92YWx1ZShpbnQgcG9ydCwgdWludDMyX3QgdmFsdWUsIHVpbnQzMl90IG1hc2spOwordWludDMyX3QganpfZ3Bpb19wb3J0X2dldF92YWx1ZShpbnQgcG9ydCwgdWludDMyX3QgbWFzayk7CisKKyNpbmNsdWRlIDxhc20vbWFjaC1nZW5lcmljL2dwaW8uaD4KKworI2RlZmluZSBKWl9HUElPX1BPUlRBKHgpICgoeCkgKyAzMiAqIDApCisjZGVmaW5lIEpaX0dQSU9fUE9SVEIoeCkgKCh4KSArIDMyICogMSkKKyNkZWZpbmUgSlpfR1BJT19QT1JUQyh4KSAoKHgpICsgMzIgKiAyKQorI2RlZmluZSBKWl9HUElPX1BPUlREKHgpICgoeCkgKyAzMiAqIDMpCisKKy8qIFBvcnQgQSBmdW5jdGlvbiBwaW5zICovCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEwCQlKWl9HUElPX1BPUlRBKDApCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEExCQlKWl9HUElPX1BPUlRBKDEpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEyCQlKWl9HUElPX1BPUlRBKDIpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEzCQlKWl9HUElPX1BPUlRBKDMpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEE0CQlKWl9HUElPX1BPUlRBKDQpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEE1CQlKWl9HUElPX1BPUlRBKDUpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEE2CQlKWl9HUElPX1BPUlRBKDYpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEE3CQlKWl9HUElPX1BPUlRBKDcpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEE4CQlKWl9HUElPX1BPUlRBKDgpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEE5CQlKWl9HUElPX1BPUlRBKDkpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEExMAkJSlpfR1BJT19QT1JUQSgxMCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTExCQlKWl9HUElPX1BPUlRBKDExKQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMTIJCUpaX0dQSU9fUE9SVEEoMTIpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEExMwkJSlpfR1BJT19QT1JUQSgxMykKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTE0CQlKWl9HUElPX1BPUlRBKDE0KQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMTUJCUpaX0dQSU9fUE9SVEEoMTUpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEExNgkJSlpfR1BJT19QT1JUQSgxNikKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTE3CQlKWl9HUElPX1BPUlRBKDE3KQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMTgJCUpaX0dQSU9fUE9SVEEoMTgpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEExOQkJSlpfR1BJT19QT1JUQSgxOSkKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTIwCQlKWl9HUElPX1BPUlRBKDIwKQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMjEJCUpaX0dQSU9fUE9SVEEoMjEpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEyMgkJSlpfR1BJT19QT1JUQSgyMikKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTIzCQlKWl9HUElPX1BPUlRBKDIzKQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMjQJCUpaX0dQSU9fUE9SVEEoMjQpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEyNQkJSlpfR1BJT19QT1JUQSgyNSkKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTI2CQlKWl9HUElPX1BPUlRBKDI2KQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMjcJCUpaX0dQSU9fUE9SVEEoMjcpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEyOAkJSlpfR1BJT19QT1JUQSgyOCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fREFUQTI5CQlKWl9HUElPX1BPUlRBKDI5KQorI2RlZmluZSBKWl9HUElPX01FTV9EQVRBMzAJCUpaX0dQSU9fUE9SVEEoMzApCisjZGVmaW5lIEpaX0dQSU9fTUVNX0RBVEEzMQkJSlpfR1BJT19QT1JUQSgzMSkKKworI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0RBVEEwCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTEJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9EQVRBMgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0RBVEEzCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTQJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9EQVRBNQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0RBVEE2CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTcJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9EQVRBOAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0RBVEE5CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTEwCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTExCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTEyCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTEzCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTE0CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTE1CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTE2CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTE3CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTE4CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTE5CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTIwCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTIxCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTIyCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTIzCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTI0CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTI1CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTI2CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTI3CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTI4CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTI5CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTMwCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fREFUQTMxCQlKWl9HUElPX0ZVTkMxCisKKy8qIFBvcnQgQiBmdW5jdGlvbiBwaW5zICovCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIwCQlKWl9HUElPX1BPUlRCKDApCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIxCQlKWl9HUElPX1BPUlRCKDEpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIyCQlKWl9HUElPX1BPUlRCKDIpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIzCQlKWl9HUElPX1BPUlRCKDMpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFI0CQlKWl9HUElPX1BPUlRCKDQpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFI1CQlKWl9HUElPX1BPUlRCKDUpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFI2CQlKWl9HUElPX1BPUlRCKDYpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFI3CQlKWl9HUElPX1BPUlRCKDcpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFI4CQlKWl9HUElPX1BPUlRCKDgpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFI5CQlKWl9HUElPX1BPUlRCKDkpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIxMAkJSlpfR1BJT19QT1JUQigxMCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fQUREUjExCQlKWl9HUElPX1BPUlRCKDExKQorI2RlZmluZSBKWl9HUElPX01FTV9BRERSMTIJCUpaX0dQSU9fUE9SVEIoMTIpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIxMwkJSlpfR1BJT19QT1JUQigxMykKKyNkZWZpbmUgSlpfR1BJT19NRU1fQUREUjE0CQlKWl9HUElPX1BPUlRCKDE0KQorI2RlZmluZSBKWl9HUElPX01FTV9BRERSMTUJCUpaX0dQSU9fUE9SVEIoMTUpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIxNgkJSlpfR1BJT19QT1JUQigxNikKKyNkZWZpbmUgSlpfR1BJT19MQ0RfQ0xTCQkJSlpfR1BJT19QT1JUQigxNykKKyNkZWZpbmUgSlpfR1BJT19MQ0RfU1BMCQkJSlpfR1BJT19QT1JUQigxOCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fRENTCQkJSlpfR1BJT19QT1JUQigxOSkKKyNkZWZpbmUgSlpfR1BJT19NRU1fUkFTCQkJSlpfR1BJT19QT1JUQigyMCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ0FTCQkJSlpfR1BJT19QT1JUQigyMSkKKyNkZWZpbmUgSlpfR1BJT19NRU1fU0RXRQkJSlpfR1BJT19QT1JUQigyMikKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ0tFCQkJSlpfR1BJT19QT1JUQigyMykKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ0tPCQkJSlpfR1BJT19QT1JUQigyNCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ1MwCQkJSlpfR1BJT19QT1JUQigyNSkKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ1MxCQkJSlpfR1BJT19QT1JUQigyNikKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ1MyCQkJSlpfR1BJT19QT1JUQigyNykKKyNkZWZpbmUgSlpfR1BJT19NRU1fQ1MzCQkJSlpfR1BJT19QT1JUQigyOCkKKyNkZWZpbmUgSlpfR1BJT19NRU1fUkQJCQlKWl9HUElPX1BPUlRCKDI5KQorI2RlZmluZSBKWl9HUElPX01FTV9XUgkJCUpaX0dQSU9fUE9SVEIoMzApCisjZGVmaW5lIEpaX0dQSU9fTUVNX1dFMAkJCUpaX0dQSU9fUE9SVEIoMzEpCisKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9BRERSMAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjIJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9BRERSMwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFI0CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjUJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9BRERSNgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFI3CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjgJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9BRERSOQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxMAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxMQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxMgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxMwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxNAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxNQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX0FERFIxNgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0NMUwkgICAgICAgIEpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9TUEwJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9EQ1MJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9SQVMJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9DQVMJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9TRFdFCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQ0tFCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQ0tPCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQ1MwCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQ1MxCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQ1MyCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQ1MzCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fUkQJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9XUgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX1dFMAkJSlpfR1BJT19GVU5DMQorCisKKyNkZWZpbmUgSlpfR1BJT19NRU1fQUREUjIxCQlKWl9HUElPX1BPUlRCKDE3KQorI2RlZmluZSBKWl9HUElPX01FTV9BRERSMjIJCUpaX0dQSU9fUE9SVEIoMTgpCisKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9BRERSMjEJCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9BRERSMjIJCUpaX0dQSU9fRlVOQzIKKworLyogUG9ydCBDIGZ1bmN0aW9uIHBpbnMgKi8KKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTAJCUpaX0dQSU9fUE9SVEMoMCkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTEJCUpaX0dQSU9fUE9SVEMoMSkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTIJCUpaX0dQSU9fUE9SVEMoMikKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTMJCUpaX0dQSU9fUE9SVEMoMykKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTQJCUpaX0dQSU9fUE9SVEMoNCkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTUJCUpaX0dQSU9fUE9SVEMoNSkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTYJCUpaX0dQSU9fUE9SVEMoNikKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTcJCUpaX0dQSU9fUE9SVEMoNykKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTgJCUpaX0dQSU9fUE9SVEMoOCkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTkJCUpaX0dQSU9fUE9SVEMoOSkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTEwCQlKWl9HUElPX1BPUlRDKDEwKQorI2RlZmluZSBKWl9HUElPX0xDRF9EQVRBMTEJCUpaX0dQSU9fUE9SVEMoMTEpCisjZGVmaW5lIEpaX0dQSU9fTENEX0RBVEExMgkJSlpfR1BJT19QT1JUQygxMikKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTEzCQlKWl9HUElPX1BPUlRDKDEzKQorI2RlZmluZSBKWl9HUElPX0xDRF9EQVRBMTQJCUpaX0dQSU9fUE9SVEMoMTQpCisjZGVmaW5lIEpaX0dQSU9fTENEX0RBVEExNQkJSlpfR1BJT19QT1JUQygxNSkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREFUQTE2CQlKWl9HUElPX1BPUlRDKDE2KQorI2RlZmluZSBKWl9HUElPX0xDRF9EQVRBMTcJCUpaX0dQSU9fUE9SVEMoMTcpCisjZGVmaW5lIEpaX0dQSU9fTENEX1BDTEsJCUpaX0dQSU9fUE9SVEMoMTgpCisjZGVmaW5lIEpaX0dQSU9fTENEX0hTWU5DCQlKWl9HUElPX1BPUlRDKDE5KQorI2RlZmluZSBKWl9HUElPX0xDRF9WU1lOQwkJSlpfR1BJT19QT1JUQygyMCkKKyNkZWZpbmUgSlpfR1BJT19MQ0RfREUJCQlKWl9HUElPX1BPUlRDKDIxKQorI2RlZmluZSBKWl9HUElPX0xDRF9QUwkJCUpaX0dQSU9fUE9SVEMoMjIpCisjZGVmaW5lIEpaX0dQSU9fTENEX1JFVgkJCUpaX0dQSU9fUE9SVEMoMjMpCisjZGVmaW5lIEpaX0dQSU9fTUVNX1dFMQkJCUpaX0dQSU9fUE9SVEMoMjQpCisjZGVmaW5lIEpaX0dQSU9fTUVNX1dFMgkJCUpaX0dQSU9fUE9SVEMoMjUpCisjZGVmaW5lIEpaX0dQSU9fTUVNX1dFMwkJCUpaX0dQSU9fUE9SVEMoMjYpCisjZGVmaW5lIEpaX0dQSU9fTUVNX1dBSVQJCUpaX0dQSU9fUE9SVEMoMjcpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0ZSRQkJCUpaX0dQSU9fUE9SVEMoMjgpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0ZXRQkJCUpaX0dQSU9fUE9SVEMoMjkpCisKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9EQVRBMAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19MQ0RfREFUQTIJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9EQVRBMwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEE0CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19MQ0RfREFUQTUJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9EQVRBNgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEE3CQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19MQ0RfREFUQTgJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9EQVRBOQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExMAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExMQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExMgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExMwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExNAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExNQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExNgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0RBVEExNwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX1BDTEsJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9WU1lOQwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX0hTWU5DCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19MQ0RfREUJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0xDRF9QUwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTENEX1JFVgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX1dFMQkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX1dFMgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX1dFMwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX1dBSVQJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9GUkUJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9GV0UJCUpaX0dQSU9fRlVOQzEKKworCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIxOQkJSlpfR1BJT19QT1JUQigyMikKKyNkZWZpbmUgSlpfR1BJT19NRU1fQUREUjIwCQlKWl9HUElPX1BPUlRCKDIzKQorCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjE5CQlKWl9HUElPX0ZVTkMyCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjIwCQlKWl9HUElPX0ZVTkMyCisKKy8qIFBvcnQgRCBmdW5jdGlvbiBwaW5zICovCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEEwCQlKWl9HUElPX1BPUlREKDApCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEExCQlKWl9HUElPX1BPUlREKDEpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEEyCQlKWl9HUElPX1BPUlREKDIpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEEzCQlKWl9HUElPX1BPUlREKDMpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEE0CQlKWl9HUElPX1BPUlREKDQpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEE1CQlKWl9HUElPX1BPUlREKDUpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEE2CQlKWl9HUElPX1BPUlREKDYpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0RBVEE3CQlKWl9HUElPX1BPUlREKDcpCisjZGVmaW5lIEpaX0dQSU9fTVNDX0NNRAkJCUpaX0dQSU9fUE9SVEQoOCkKKyNkZWZpbmUgSlpfR1BJT19NU0NfQ0xLCQkJSlpfR1BJT19QT1JURCg5KQorI2RlZmluZSBKWl9HUElPX01TQ19EQVRBMAkJSlpfR1BJT19QT1JURCgxMCkKKyNkZWZpbmUgSlpfR1BJT19NU0NfREFUQTEJCUpaX0dQSU9fUE9SVEQoMTEpCisjZGVmaW5lIEpaX0dQSU9fTVNDX0RBVEEyCQlKWl9HUElPX1BPUlREKDEyKQorI2RlZmluZSBKWl9HUElPX01TQ19EQVRBMwkJSlpfR1BJT19QT1JURCgxMykKKyNkZWZpbmUgSlpfR1BJT19DSU1fTUNMSwkJSlpfR1BJT19QT1JURCgxNCkKKyNkZWZpbmUgSlpfR1BJT19DSU1fUENMSwkJSlpfR1BJT19QT1JURCgxNSkKKyNkZWZpbmUgSlpfR1BJT19DSU1fVlNZTkMJCUpaX0dQSU9fUE9SVEQoMTYpCisjZGVmaW5lIEpaX0dQSU9fQ0lNX0hTWU5DCQlKWl9HUElPX1BPUlREKDE3KQorI2RlZmluZSBKWl9HUElPX1NQSV9DTEsJCQlKWl9HUElPX1BPUlREKDE4KQorI2RlZmluZSBKWl9HUElPX1NQSV9DRTAJCQlKWl9HUElPX1BPUlREKDE5KQorI2RlZmluZSBKWl9HUElPX1NQSV9EVAkJCUpaX0dQSU9fUE9SVEQoMjApCisjZGVmaW5lIEpaX0dQSU9fU1BJX0RSCQkJSlpfR1BJT19QT1JURCgyMSkKKyNkZWZpbmUgSlpfR1BJT19TUElfQ0UxCQkJSlpfR1BJT19QT1JURCgyMikKKyNkZWZpbmUgSlpfR1BJT19QV00wCQkJSlpfR1BJT19QT1JURCgyMykKKyNkZWZpbmUgSlpfR1BJT19QV00xCQkJSlpfR1BJT19QT1JURCgyNCkKKyNkZWZpbmUgSlpfR1BJT19QV00yCQkJSlpfR1BJT19QT1JURCgyNSkKKyNkZWZpbmUgSlpfR1BJT19QV00zCQkJSlpfR1BJT19QT1JURCgyNikKKyNkZWZpbmUgSlpfR1BJT19QV000CQkJSlpfR1BJT19QT1JURCgyNykKKyNkZWZpbmUgSlpfR1BJT19QV001CQkJSlpfR1BJT19QT1JURCgyOCkKKyNkZWZpbmUgSlpfR1BJT19QV002CQkJSlpfR1BJT19QT1JURCgzMCkKKyNkZWZpbmUgSlpfR1BJT19QV003CQkJSlpfR1BJT19QT1JURCgzMSkKKworI2RlZmluZSBKWl9HUElPX0ZVTkNfQ0lNX0RBVEEJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0NJTV9EQVRBMAkJSlpfR1BJT19GVU5DX0NJTV9EQVRBCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19DSU1fREFUQTEJCUpaX0dQSU9fRlVOQ19DSU1fREFUQQorI2RlZmluZSBKWl9HUElPX0ZVTkNfQ0lNX0RBVEEyCQlKWl9HUElPX0ZVTkNfQ0lNX0RBVEEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0NJTV9EQVRBMwkJSlpfR1BJT19GVU5DX0NJTV9EQVRBCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19DSU1fREFUQTQJCUpaX0dQSU9fRlVOQ19DSU1fREFUQQorI2RlZmluZSBKWl9HUElPX0ZVTkNfQ0lNX0RBVEE1CQlKWl9HUElPX0ZVTkNfQ0lNX0RBVEEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0NJTV9EQVRBNgkJSlpfR1BJT19GVU5DX0NJTV9EQVRBCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19DSU1fREFUQTcJCUpaX0dQSU9fRlVOQ19DSU1fREFUQQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTVNDX0NNRAkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTVNDX0NMSwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTVNDX0RBVEEJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01TQ19EQVRBMAkJSlpfR1BJT19GVU5DX01TQ19EQVRBCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NU0NfREFUQTEJCUpaX0dQSU9fRlVOQ19NU0NfREFUQQorI2RlZmluZSBKWl9HUElPX0ZVTkNfTVNDX0RBVEEyCQlKWl9HUElPX0ZVTkNfTVNDX0RBVEEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01TQ19EQVRBMwkJSlpfR1BJT19GVU5DX01TQ19EQVRBCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19DSU1fTUNMSwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfQ0lNX1BDTEsJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0NJTV9WU1lOQwkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfQ0lNX0hTWU5DCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19TUElfQ0xLCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19TUElfQ0UwCQlKWl9HUElPX0ZVTkMxCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19TUElfRFQJCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX1NQSV9EUgkJSlpfR1BJT19GVU5DMQorI2RlZmluZSBKWl9HUElPX0ZVTkNfU1BJX0NFMQkJSlpfR1BJT19GVU5DMQorCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19QV00JCUpaX0dQSU9fRlVOQzEKKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTAJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTEJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTIJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTMJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTQJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTUJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTYJCUpaX0dQSU9fRlVOQ19QV00KKyNkZWZpbmUgSlpfR1BJT19GVU5DX1BXTTcJCUpaX0dQSU9fRlVOQ19QV00KKworI2RlZmluZSBKWl9HUElPX01FTV9TQ0xLX1JTVE4JCUpaX0dQSU9fUE9SVEQoMTgpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0JDTEsJCUpaX0dQSU9fUE9SVEQoMTkpCisjZGVmaW5lIEpaX0dQSU9fTUVNX1NEQVRPCQlKWl9HUElPX1BPUlREKDIwKQorI2RlZmluZSBKWl9HUElPX01FTV9TREFUSQkJSlpfR1BJT19QT1JURCgyMSkKKyNkZWZpbmUgSlpfR1BJT19NRU1fU1lOQwkJSlpfR1BJT19QT1JURCgyMikKKyNkZWZpbmUgSlpfR1BJT19JMkNfU0RBCQkJSlpfR1BJT19QT1JURCgyMykKKyNkZWZpbmUgSlpfR1BJT19JMkNfU0NLCQkJSlpfR1BJT19QT1JURCgyNCkKKyNkZWZpbmUgSlpfR1BJT19VQVJUMF9UWEQJCUpaX0dQSU9fUE9SVEQoMjUpCisjZGVmaW5lIEpaX0dQSU9fVUFSVDBfUlhECQlKWl9HUElPX1BPUlREKDI2KQorI2RlZmluZSBKWl9HUElPX01FTV9BRERSMTcJCUpaX0dQSU9fUE9SVEQoMjcpCisjZGVmaW5lIEpaX0dQSU9fTUVNX0FERFIxOAkJSlpfR1BJT19QT1JURCgyOCkKKyNkZWZpbmUgSlpfR1BJT19VQVJUMF9DVFMJCUpaX0dQSU9fUE9SVEQoMzApCisjZGVmaW5lIEpaX0dQSU9fVUFSVDBfUlRTCQlKWl9HUElPX1BPUlREKDMxKQorCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fU0NMS19SU1ROCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9CQ0xLCQlKWl9HUElPX0ZVTkMyCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fU0RBVE8JCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX01FTV9TREFUSQkJSlpfR1BJT19GVU5DMgorI2RlZmluZSBKWl9HUElPX0ZVTkNfTUVNX1NZTkMJCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0kyQ19TREEJCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX0kyQ19TQ0sJCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX1VBUlQwX1RYRAkJSlpfR1BJT19GVU5DMgorI2RlZmluZSBKWl9HUElPX0ZVTkNfVUFSVDBfUlhECQlKWl9HUElPX0ZVTkMyCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjE3CQlKWl9HUElPX0ZVTkMyCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19NRU1fQUREUjE4CQlKWl9HUElPX0ZVTkMyCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19VQVJUMF9DVFMJCUpaX0dQSU9fRlVOQzIKKyNkZWZpbmUgSlpfR1BJT19GVU5DX1VBUlQwX1JUUwkJSlpfR1BJT19GVU5DMgorCisjZGVmaW5lIEpaX0dQSU9fVUFSVDFfUlhECQlKWl9HUElPX1BPUlREKDMwKQorI2RlZmluZSBKWl9HUElPX1VBUlQxX1RYRAkJSlpfR1BJT19QT1JURCgzMSkKKworI2RlZmluZSBKWl9HUElPX0ZVTkNfVUFSVDFfUlhECQlKWl9HUElPX0ZVTkMzCisjZGVmaW5lIEpaX0dQSU9fRlVOQ19VQVJUMV9UWEQJCUpaX0dQSU9fRlVOQzMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2NWM5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9pcnEuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqICBKWjQ3NDAgSVJRIGRlZmluaXRpb25zCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9NQUNIX0paNDc0MF9JUlFfSF9fCisjZGVmaW5lIF9fQVNNX01BQ0hfSlo0NzQwX0lSUV9IX18KKworI2RlZmluZSBNSVBTX0NQVV9JUlFfQkFTRSAwCisjZGVmaW5lIEpaNDc0MF9JUlFfQkFTRSA4CisKKy8qIDFzdC1sZXZlbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIEpaNDc0MF9JUlEoeCkJCShKWjQ3NDBfSVJRX0JBU0UgKyAoeCkpCisjZGVmaW5lIEpaNDc0MF9JUlFfSTJDCQlKWjQ3NDBfSVJRKDEpCisjZGVmaW5lIEpaNDc0MF9JUlFfVUhDCQlKWjQ3NDBfSVJRKDMpCisjZGVmaW5lIEpaNDc0MF9JUlFfVUFSVDEJSlo0NzQwX0lSUSg4KQorI2RlZmluZSBKWjQ3NDBfSVJRX1VBUlQwCUpaNDc0MF9JUlEoOSkKKyNkZWZpbmUgSlo0NzQwX0lSUV9TQURDCQlKWjQ3NDBfSVJRKDEyKQorI2RlZmluZSBKWjQ3NDBfSVJRX01TQwkJSlo0NzQwX0lSUSgxNCkKKyNkZWZpbmUgSlo0NzQwX0lSUV9SVEMJCUpaNDc0MF9JUlEoMTUpCisjZGVmaW5lIEpaNDc0MF9JUlFfU1NJCQlKWjQ3NDBfSVJRKDE2KQorI2RlZmluZSBKWjQ3NDBfSVJRX0NJTQkJSlo0NzQwX0lSUSgxNykKKyNkZWZpbmUgSlo0NzQwX0lSUV9BSUMJCUpaNDc0MF9JUlEoMTgpCisjZGVmaW5lIEpaNDc0MF9JUlFfRVRICQlKWjQ3NDBfSVJRKDE5KQorI2RlZmluZSBKWjQ3NDBfSVJRX0RNQUMJCUpaNDc0MF9JUlEoMjApCisjZGVmaW5lIEpaNDc0MF9JUlFfVENVMgkJSlo0NzQwX0lSUSgyMSkKKyNkZWZpbmUgSlo0NzQwX0lSUV9UQ1UxCQlKWjQ3NDBfSVJRKDIyKQorI2RlZmluZSBKWjQ3NDBfSVJRX1RDVTAJCUpaNDc0MF9JUlEoMjMpCisjZGVmaW5lIEpaNDc0MF9JUlFfVURDCQlKWjQ3NDBfSVJRKDI0KQorI2RlZmluZSBKWjQ3NDBfSVJRX0dQSU8zCUpaNDc0MF9JUlEoMjUpCisjZGVmaW5lIEpaNDc0MF9JUlFfR1BJTzIJSlo0NzQwX0lSUSgyNikKKyNkZWZpbmUgSlo0NzQwX0lSUV9HUElPMQlKWjQ3NDBfSVJRKDI3KQorI2RlZmluZSBKWjQ3NDBfSVJRX0dQSU8wCUpaNDc0MF9JUlEoMjgpCisjZGVmaW5lIEpaNDc0MF9JUlFfSVBVCQlKWjQ3NDBfSVJRKDI5KQorI2RlZmluZSBKWjQ3NDBfSVJRX0xDRAkJSlo0NzQwX0lSUSgzMCkKKworLyogMm5kLWxldmVsIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSlo0NzQwX0lSUV9ETUEoeCkJKEpaNDc0MF9JUlEoMzIpICsgKFgpKQorCisjZGVmaW5lIEpaNDc0MF9JUlFfSU5UQ19HUElPKHgpIChKWjQ3NDBfSVJRX0dQSU8wIC0gKHgpKQorI2RlZmluZSBKWjQ3NDBfSVJRX0dQSU8oeCkJKEpaNDc0MF9JUlEoNDgpICsgKHgpKQorCisjZGVmaW5lIEpaNDc0MF9JUlFfQURDX0JBU0UJSlo0NzQwX0lSUSgxNzYpCisKKyNkZWZpbmUgTlJfSVJRUyAoSlo0NzQwX0lSUV9BRENfQkFTRSArIDYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2p6NDc0MF9mYi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2p6NDc0MF9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTBlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvano0NzQwX2ZiLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDksIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX01BQ0hfSlo0NzQwX0paNDc0MF9GQl9IX18KKyNkZWZpbmUgX19BU01fTUFDSF9KWjQ3NDBfSlo0NzQwX0ZCX0hfXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworZW51bSBqejQ3NDBfZmJfbGNkX3R5cGUgeworCUpaX0xDRF9UWVBFX0dFTkVSSUNfMTZfQklUID0gMCwKKwlKWl9MQ0RfVFlQRV9HRU5FUklDXzE4X0JJVCA9IDAgfCAoMSA8PCA0KSwKKwlKWl9MQ0RfVFlQRV9TUEVDSUFMX1RGVF8xID0gMSwKKwlKWl9MQ0RfVFlQRV9TUEVDSUFMX1RGVF8yID0gMiwKKwlKWl9MQ0RfVFlQRV9TUEVDSUFMX1RGVF8zID0gMywKKwlKWl9MQ0RfVFlQRV9OT05fSU5URVJMQUNFRF9DQ0lSNjU2ID0gNSwKKwlKWl9MQ0RfVFlQRV9JTlRFUkxBQ0VEX0NDSVI2NTYgPSA3LAorCUpaX0xDRF9UWVBFX1NJTkdMRV9DT0xPUl9TVE4gPSA4LAorCUpaX0xDRF9UWVBFX1NJTkdMRV9NT05PQ0hST01FX1NUTiA9IDksCisJSlpfTENEX1RZUEVfRFVBTF9DT0xPUl9TVE4gPSAxMCwKKwlKWl9MQ0RfVFlQRV9EVUFMX01PTk9DSFJPTUVfU1ROID0gMTEsCisJSlpfTENEX1RZUEVfOEJJVF9TRVJJQUwgPSAxMiwKK307CisKKyNkZWZpbmUgSlo0NzQwX0ZCX1NQRUNJQUxfVEZUX0NPTkZJRyhzdGFydCwgc3RvcCkgKCgoc3RhcnQpIDw8IDE2KSB8IChzdG9wKSkKKworLyoKKyogd2lkdGg6IHdpZHRoIG9mIHRoZSBsY2QgZGlzcGxheSBpbiBtbQorKiBoZWlnaHQ6IGhlaWdodCBvZiB0aGUgbGNkIGRpc3BsYXkgaW4gbW0KKyogbnVtX21vZGVzOiBzaXplIG9mIG1vZGVzCisqIG1vZGVzOiBsaXN0IG9mIHZhbGlkIHZpZGVvIG1vZGVzCisqIGJwcDogYml0cyBwZXIgcGl4ZWwgZm9yIHRoZSBsY2QKKyogbGNkX3R5cGU6IGxjZCB0eXBlCisqLworCitzdHJ1Y3Qgano0NzQwX2ZiX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCisJc2l6ZV90IG51bV9tb2RlczsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlczsKKworCXVuc2lnbmVkIGludCBicHA7CisJZW51bSBqejQ3NDBfZmJfbGNkX3R5cGUgbGNkX3R5cGU7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBzcGw7CisJCXVpbnQzMl90IGNsczsKKwkJdWludDMyX3QgcHM7CisJCXVpbnQzMl90IHJldjsKKwl9IHNwZWNpYWxfdGZ0X2NvbmZpZzsKKworCXVuc2lnbmVkIHBpeGNsa19mYWxsaW5nX2VkZ2U6MTsKKwl1bnNpZ25lZCBkYXRlX2VuYWJsZV9hY3RpdmVfbG93OjE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9qejQ3NDBfbW1jLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvano0NzQwX21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NDNmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvano0NzQwX21tYy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19MSU5VWF9NTUNfSlo0NzQwX01NQworI2RlZmluZSBfX0xJTlVYX01NQ19KWjQ3NDBfTU1DCisKK3N0cnVjdCBqejQ3NDBfbW1jX3BsYXRmb3JtX2RhdGEgeworCWludCBncGlvX3Bvd2VyOworCWludCBncGlvX2NhcmRfZGV0ZWN0OworCWludCBncGlvX3JlYWRfb25seTsKKwl1bnNpZ25lZCBjYXJkX2RldGVjdF9hY3RpdmVfbG93OjE7CisJdW5zaWduZWQgcmVhZF9vbmx5X2FjdGl2ZV9sb3c6MTsKKwl1bnNpZ25lZCBwb3dlcl9hY3RpdmVfbG93OjE7CisKKwl1bnNpZ25lZCBkYXRhXzFiaXQ6MTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2p6NDc0MF9uYW5kLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvano0NzQwX25hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjViOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2p6NDc0MF9uYW5kLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBOQU5EIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19BU01fTUFDSF9KWjQ3NDBfSlo0NzQwX05BTkRfSF9fCisjZGVmaW5lIF9fQVNNX01BQ0hfSlo0NzQwX0paNDc0MF9OQU5EX0hfXworCisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCitzdHJ1Y3QganpfbmFuZF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQJCQludW1fcGFydGl0aW9uczsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKKworCXN0cnVjdCBuYW5kX2VjY2xheW91dAkqZWNjX2xheW91dDsKKworCXVuc2lnbmVkIGludCBidXN5X2dwaW87CisKKwl2b2lkICgqaWRlbnRfY2FsbGJhY2spKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgc3RydWN0IG5hbmRfY2hpcCAqLAorCQkJCXN0cnVjdCBtdGRfcGFydGl0aW9uICoqLCBpbnQgKm51bV9wYXJ0aXRpb25zKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL3BsYXRmb3JtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg3YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL3BsYXRmb3JtLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKworI2lmbmRlZiBfX0paNDc0MF9QTEFURk9STV9ICisjZGVmaW5lIF9fSlo0NzQwX1BMQVRGT1JNX0gKKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfdXNiX29oY2lfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX3VkY19kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfbW1jX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGp6NDc0MF9ydGNfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX2kyY19kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfbmFuZF9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfZnJhbWVidWZmZXJfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX2kyc19kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfcGNtX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGp6NDc0MF9jb2RlY19kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfYWRjX2RldmljZTsKKwordm9pZCBqejQ3NDBfc2VyaWFsX2RldmljZV9yZWdpc3Rlcih2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvdGltZXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvdGltZXIuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHBsYXRmb3JtIHRpbWVyIHN1cHBvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX01BQ0hfSlo0NzQwX1RJTUVSCisjZGVmaW5lIF9fQVNNX01BQ0hfSlo0NzQwX1RJTUVSCisKK3ZvaWQgano0NzQwX3RpbWVyX2VuYWJsZV93YXRjaGRvZyh2b2lkKTsKK3ZvaWQgano0NzQwX3RpbWVyX2Rpc2FibGVfd2F0Y2hkb2codm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL3dhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWJjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvd2FyLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwgMjAwNyBieSBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+CisgKi8KKyNpZm5kZWYgX19BU01fTUlQU19NQUNIX0paNDc0MF9XQVJfSAorI2RlZmluZSBfX0FTTV9NSVBTX01BQ0hfSlo0NzQwX1dBUl9ICisKKyNkZWZpbmUgUjQ2MDBfVjFfSU5ERVhfSUNBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjQ2MDBfVjFfSElUX0NBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjQ2MDBfVjJfSElUX0NBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjU0MzJfQ1AwX0lOVEVSUlVQVF9XQVIJCTAKKyNkZWZpbmUgQkNNMTI1MF9NM19XQVIJCQkwCisjZGVmaW5lIFNJQllURV8xOTU2X1dBUgkJCTAKKyNkZWZpbmUgTUlQUzRLX0lDQUNIRV9SRUZJTExfV0FSCTAKKyNkZWZpbmUgTUlQU19DQUNIRV9TWU5DX1dBUgkJMAorI2RlZmluZSBUWDQ5WFhfSUNBQ0hFX0lOREVYX0lOVl9XQVIJMAorI2RlZmluZSBSTTkwMDBfQ0RFWF9TTVBfV0FSCQkwCisjZGVmaW5lIElDQUNIRV9SRUZJTExTX1dPUktBUk9VTkRfV0FSCTAKKyNkZWZpbmUgUjEwMDAwX0xMU0NfV0FSCQkJMAorI2RlZmluZSBNSVBTMzRLX01JU1NFRF9JVExCX1dBUgkJMAorCisjZW5kaWYgLyogX19BU01fTUlQU19NQUNIX0paNDc0MF9XQVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbG9vbmdzb24uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2xvb25nc29uLmgKaW5kZXggZmNkYmUzYS4uY2I2OTg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbG9vbmdzb24uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9sb29uZ3Nvbi5oCkBAIC00NSw3ICs0NSw2IEBACiAvKiBpcnEgb3BlcmF0aW9uIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgYm9uaXRvX2lycWRpc3BhdGNoKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGJvbml0b19pcnFfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBzZXRfaXJxX3RyaWdnZXJfbW9kZSh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBtYWNoX2luaXRfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFjaF9pcnFfZGlzcGF0Y2godW5zaWduZWQgaW50IHBlbmRpbmcpOwogZXh0ZXJuIGludCBtYWNoX2k4MjU5X2lycSh2b2lkKTsKQEAgLTYzLDYgKzYyLDE0IEBACiAjZGVmaW5lIExPT05HU09OX0lSUV9CQVNFCTMyCiAjZGVmaW5lIExPT05HU09OMl9QRVJGQ05UX0lSUQkoTUlQU19DUFVfSVJRX0JBU0UgKyA2KSAvKiBjcHUgcGVyZiBjb3VudGVyICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19wZXJmY250X0lSUSh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX09QUk9GSUxFKSB8fCBkZWZpbmVkKENPTkZJR19PUFJPRklMRV9NT0RVTEUpCisJZG9fSVJRKExPT05HU09OMl9QRVJGQ05UX0lSUSk7CisjZW5kaWYKK30KKwogI2RlZmluZSBMT09OR1NPTl9GTEFTSF9CQVNFCTB4MWMwMDAwMDAKICNkZWZpbmUgTE9PTkdTT05fRkxBU0hfU0laRQkweDAyMDAwMDAwCS8qIDMyTSAqLwogI2RlZmluZSBMT09OR1NPTl9GTEFTSF9UT1AJKExPT05HU09OX0ZMQVNIX0JBU0UrTE9PTkdTT05fRkxBU0hfU0laRS0xKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oCmluZGV4IDU4Nzk2NDEuLmZjNGQ3NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxNTUwLmgKQEAgLTQwLDE0ICs0MCw2IEBACiAjZGVmaW5lIFNNQlVTX1BTQ19CQVNFCQlQU0MyX0JBU0VfQUREUgogI2RlZmluZSBJMlNfUFNDX0JBU0UJCVBTQzNfQkFTRV9BRERSCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVERfUEIxNTUwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9QQjE1NTBfVVNFUikKLSNkZWZpbmUgUEIxNTUwX0JPVEhfQkFOS1MKLSNlbGlmIGRlZmluZWQoQ09ORklHX01URF9QQjE1NTBfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX01URF9QQjE1NTBfVVNFUikKLSNkZWZpbmUgUEIxNTUwX0JPT1RfT05MWQotI2VsaWYgIWRlZmluZWQoQ09ORklHX01URF9QQjE1NTBfQk9PVCkgJiYgZGVmaW5lZChDT05GSUdfTVREX1BCMTU1MF9VU0VSKQotI2RlZmluZSBQQjE1NTBfVVNFUl9PTkxZCi0jZW5kaWYKLQogLyoKICAqIFRpbWluZyB2YWx1ZXMgYXMgZGVzY3JpYmVkIGluIGRhdGFib29rLCAqIG5zIHZhbHVlIHN0cmlwcGVkIG9mCiAgKiBsb3dlciAyIGJpdHMuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wb3dlcnR2L2FzaWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvYXNpYy5oCmluZGV4IGJjYWQ0M2EuLmM3MDc3YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvYXNpYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvYXNpYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIF9BU01fTUFDSF9QT1dFUlRWX0FTSUNfSAogCiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtcG93ZXJ0di9hc2ljX3JlZ3MuaD4KIAogI2RlZmluZSBEVlJfQ0FQQUJMRSAgICAgKDE8PDApCkBAIC00MCwxOSArNDEsMjMgQEAKIAlGQU1JTFlfODYwMFZaQiwKIAlGQU1JTFlfMTUwMFZaRSwKIAlGQU1JTFlfMTUwMFZaRiwKKwlGQU1JTFlfODcwMCwKIAlGQU1JTElFUwogfTsKIAogLyogUmVnaXN0ZXIgbWFwcyBmb3IgZWFjaCBBU0lDICovCiBleHRlcm4gY29uc3Qgc3RydWN0IHJlZ2lzdGVyX21hcCBjYWxsaW9wZV9yZWdpc3Rlcl9tYXA7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJlZ2lzdGVyX21hcCBjcm9udXNfcmVnaXN0ZXJfbWFwOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdpc3Rlcl9tYXAgZ2FpYV9yZWdpc3Rlcl9tYXA7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJlZ2lzdGVyX21hcCB6ZXVzX3JlZ2lzdGVyX21hcDsKIAogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBkdnJfY3JvbnVzX3Jlc291cmNlc1tdOworZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBkdnJfZ2FpYV9yZXNvdXJjZXNbXTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgZHZyX3pldXNfcmVzb3VyY2VzW107CiBleHRlcm4gc3RydWN0IHJlc291cmNlIG5vbl9kdnJfY2FsbGlvcGVfcmVzb3VyY2VzW107CiBleHRlcm4gc3RydWN0IHJlc291cmNlIG5vbl9kdnJfY3JvbnVzX3Jlc291cmNlc1tdOwogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBub25fZHZyX2Nyb251c2xpdGVfcmVzb3VyY2VzW107CitleHRlcm4gc3RydWN0IHJlc291cmNlIG5vbl9kdnJfZ2FpYV9yZXNvdXJjZXNbXTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2Ugbm9uX2R2cl92el9jYWxsaW9wZV9yZXNvdXJjZXNbXTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2Ugbm9uX2R2cl92emVfY2FsbGlvcGVfcmVzb3VyY2VzW107CiBleHRlcm4gc3RydWN0IHJlc291cmNlIG5vbl9kdnJfdnpmX2NhbGxpb3BlX3Jlc291cmNlc1tdOwpAQCAtNjcsMTYgKzcyLDI0IEBACiBleHRlcm4gaW50IHBsYXRmb3JtX3N1cHBvcnRzX3BjaWUodm9pZCk7CiBleHRlcm4gaW50IHBsYXRmb3JtX3N1cHBvcnRzX2Rpc3BsYXkodm9pZCk7CiBleHRlcm4gdm9pZCBjb25maWd1cmVfcGxhdGZvcm0odm9pZCk7Ci1leHRlcm4gdm9pZCBwbGF0Zm9ybV9jb25maWd1cmVfdXNiX2VoY2kodm9pZCk7Ci1leHRlcm4gdm9pZCBwbGF0Zm9ybV91bmNvbmZpZ3VyZV91c2JfZWhjaSh2b2lkKTsKLWV4dGVybiB2b2lkIHBsYXRmb3JtX2NvbmZpZ3VyZV91c2Jfb2hjaSh2b2lkKTsKLWV4dGVybiB2b2lkIHBsYXRmb3JtX3VuY29uZmlndXJlX3VzYl9vaGNpKHZvaWQpOwogCiAvKiBQbGF0Zm9ybSBSZXNvdXJjZXMgKi8KICNkZWZpbmUgQVNJQ19SRVNPVVJDRV9HRVRfRVhJU1RTIDEKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgKmFzaWNfcmVzb3VyY2VfZ2V0KGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcmVsZWFzZV9tZW1vcnkodm9pZCAqYmFkZHIsIGludCBzaXplKTsKIAorLyogVVNCIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCB1c2JfaGNkOwkJCS8qIEZvcndhcmQgcmVmZXJlbmNlICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9jb25maWd1cmVfdXNiX2VoY2kodm9pZCk7CitleHRlcm4gdm9pZCBwbGF0Zm9ybV91bmNvbmZpZ3VyZV91c2JfZWhjaSh2b2lkKTsKK2V4dGVybiB2b2lkIHBsYXRmb3JtX2NvbmZpZ3VyZV91c2Jfb2hjaSh2b2lkKTsKK2V4dGVybiB2b2lkIHBsYXRmb3JtX3VuY29uZmlndXJlX3VzYl9vaGNpKHZvaWQpOworCisvKiBSZXNvdXJjZSBmb3IgQVNJQyByZWdpc3RlcnMgKi8KK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgYXNpY19yZXNvdXJjZTsKK2V4dGVybiBpbnQgcGxhdGZvcm1fdXNiX2RldmljZXNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqZWNoaV9kZXYsCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKm9oY2lfZGV2KTsKKwogLyogUmVib290IENhdXNlICovCiBleHRlcm4gdm9pZCBzZXRfcmVib290X2NhdXNlKGNoYXIgY29kZSwgdW5zaWduZWQgaW50IGRhdGEsIHVuc2lnbmVkIGludCBkYXRhMik7CiBleHRlcm4gdm9pZCBzZXRfbG9ja2VkX3JlYm9vdF9jYXVzZShjaGFyIGNvZGUsIHVuc2lnbmVkIGludCBkYXRhLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9hc2ljX3JlZ19tYXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvYXNpY19yZWdfbWFwLmgKaW5kZXggNmYyNmNiMC4uMjAzNDhlOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9hc2ljX3JlZ19tYXAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wb3dlcnR2L2FzaWNfcmVnX21hcC5oCkBAIC02NCw3ICs2NCw3IEBACiBSRUdJU1RFUl9NQVBfRUxFTUVOVChpbnRfbGV2ZWxfMF8wKQogUkVHSVNURVJfTUFQX0VMRU1FTlQoaW50X2RvY3Npc19lbikKIFJFR0lTVEVSX01BUF9FTEVNRU5UKG1pcHNfcGxsX3NldHVwKQotUkVHSVNURVJfTUFQX0VMRU1FTlQodXNiX2ZzKQorUkVHSVNURVJfTUFQX0VMRU1FTlQoZnM0MzJ4NGI0X3VzYl9jdGwpCiBSRUdJU1RFUl9NQVBfRUxFTUVOVCh0ZXN0X2J1cykKIFJFR0lTVEVSX01BUF9FTEVNRU5UKGNydF9zcGFyZSkKIFJFR0lTVEVSX01BUF9FTEVNRU5UKHVzYjJfb2hjaV9pbnRfbWFzaykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvYXNpY19yZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wb3dlcnR2L2FzaWNfcmVncy5oCmluZGV4IDFlMTEyMzYuLmRlZWNiMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvYXNpY19yZWdzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9hc2ljX3JlZ3MuaApAQCAtMjcsNyArMjcsOCBAQAogCUFTSUNfQ0FMTElPUEUsCiAJQVNJQ19DUk9OVVMsCiAJQVNJQ19DUk9OVVNMSVRFLAotCUFTSUNTCisJQVNJQ19HQUlBLAorCUFTSUNTCQkJLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBBU0lDcyAqLwogfTsKIAogLyogaGFyZGNvZGVkIHZhbHVlcyByZWFkIGZyb20gQ2hpcCBWZXJzaW9uIHJlZ2lzdGVycyAqLwpAQCAtMzcsNiArMzgsNyBAQAogCiAjZGVmaW5lIE5BTkRfRkxBU0hfQkFTRQkJMHgwMzAwMDAwMAogI2RlZmluZSBDQUxMSU9QRV9JT19CQVNFCTB4MDgwMDAwMDAKKyNkZWZpbmUgR0FJQV9JT19CQVNFCQkweDA5MDAwMDAwCiAjZGVmaW5lIENST05VU19JT19CQVNFCQkweDA5MDAwMDAwCiAjZGVmaW5lIFpFVVNfSU9fQkFTRQkJMHgwOTAwMDAwMAogCkBAIC05OSw2ICsxMDEsNyBAQAogfQogCiBleHRlcm4gc3RydWN0IHJlZ2lzdGVyX21hcCBfYXNpY19yZWdpc3Rlcl9tYXA7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhc2ljX3BoeV9iYXNlOwogCiAvKgogICogTWFjcm9zIHRvIGludGVyZmFjZSB0byByZWdpc3RlcnMgdGhyb3VnaCB0aGVpciBpb3JlbWFwcGVkIGFkZHJlc3MKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvZG1hLWNvaGVyZW5jZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9kbWEtY29oZXJlbmNlLmgKaW5kZXggNWI4ZDVlYi4uZjc2MDI5YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9kbWEtY29oZXJlbmNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9kbWEtY29oZXJlbmNlLmgKQEAgLTY1LDIxICs2NSwyMSBAQAogCXNpemVfdCBzaXplKQogewogCWlmIChpc19rc2VnMihhZGRyKSkKLQkJcmV0dXJuIHBoeXNfdG9fYnVzKHZpcnRfdG9fcGh5c19mcm9tX3B0ZShhZGRyKSk7CisJCXJldHVybiBwaHlzX3RvX2RtYSh2aXJ0X3RvX3BoeXNfZnJvbV9wdGUoYWRkcikpOwogCWVsc2UKLQkJcmV0dXJuIHBoeXNfdG9fYnVzKHZpcnRfdG9fcGh5cyhhZGRyKSk7CisJCXJldHVybiBwaHlzX3RvX2RtYSh2aXJ0X3RvX3BoeXMoYWRkcikpOwogfQogCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGxhdF9tYXBfZG1hX21lbV9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyZXR1cm4gcGh5c190b19idXMocGFnZV90b19waHlzKHBhZ2UpKTsKKwlyZXR1cm4gcGh5c190b19kbWEocGFnZV90b19waHlzKHBhZ2UpKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBsYXRfZG1hX2FkZHJfdG9fcGh5cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKLQlyZXR1cm4gYnVzX3RvX3BoeXMoZG1hX2FkZHIpOworCXJldHVybiBkbWFfdG9fcGh5cyhkbWFfYWRkcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X3VubWFwX2RtYV9tZW0oc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9pb3JlbWFwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wb3dlcnR2L2lvcmVtYXAuaAppbmRleCBlNjI3NmQ1Li4wNzZmMmVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wb3dlcnR2L2lvcmVtYXAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wb3dlcnR2L2lvcmVtYXAuaApAQCAtMTAsNjQgKzEwLDEwMSBAQAogI2RlZmluZSBfX0FTTV9NQUNIX1BPV0VSVFZfSU9SRU1BUF9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi0jZGVmaW5lIExPV19NRU1fQk9VTkRBUllfUEhZUwkweDIwMDAwMDAwCi0jZGVmaW5lIExPV19NRU1fQk9VTkRBUllfTUFTSwkofihMT1dfTUVNX0JPVU5EQVJZX1BIWVMgLSAxKSkKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS1iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorCisvKiBXZSdyZSBnb2luZyB0byBtZXNzIHdpdGggYml0cywgc28gZ2V0IHNpemVzICovCisjZGVmaW5lIElPUl9CUEMJCQk4CQkJLyogQml0cyBwZXIgY2hhciAqLworI2RlZmluZSBJT1JfUEhZU19CSVRTCQkoSU9SX0JQQyAqIHNpemVvZihwaHlzX2FkZHJfdCkpCisjZGVmaW5lIElPUl9ETUFfQklUUwkJKElPUl9CUEMgKiBzaXplb2YoZG1hX2FkZHJfdCkpCiAKIC8qCi0gKiBUaGUgYnVzIGFkZHJlc3NlcyBhcmUgZGlmZmVyZW50IHRoYW4gdGhlIHBoeXNpY2FsIGFkZHJlc3NlcyB0aGF0Ci0gKiB0aGUgcHJvY2Vzc29yIHNlZXMgYnkgYW4gb2Zmc2V0LiBUaGlzIG9mZnNldCB2YXJpZXMgYnkgQVNJQwotICogdmVyc2lvbi4gRGVmaW5lIGEgdmFyaWFibGUgdG8gaG9sZCB0aGUgb2Zmc2V0IGFuZCBzb21lIG1hY3JvcyB0bwotICogbWFrZSB0aGUgY29udmVyc2lvbiBzaW1wbGVyLiAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGh5c190b19idXNfb2Zmc2V0OwotCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLSNkZWZpbmUgTUVNX0dBUF9QSFlTCQkweDYwMDAwMDAwCi0vKgotICogVE9ETzogV2Ugd2lsbCB1c2UgdGhlIGhhcmQgY29kZSBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIHBoeXNpY2FsIGFuZAotICogYnVzIHVudGlsIHRoZSBib290bG9hZGVyIHJlbGVhc2VzIHRoZWlyIGRldmljZSB0cmVlIHRvIHVzLgorICogRGVmaW5lIHRoZSBncmFudWxhcml0eSBvZiBwaHlzaWNhbC9ETUEgbWFwcGluZyBpbiB0ZXJtcyBvZiB0aGUgbnVtYmVyCisgKiBvZiBiaXRzIHRoYXQgZGVmaW5lcyB0aGUgb2Zmc2V0IHdpdGhpbiBhIGdyYWluLiBUaGVzZSB3aWxsIGJlIHRoZQorICogbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgYWRkcmVzcy4gVGhlIHJlc3Qgb2YgYSBwaHlzaWNhbCBvciBETUEKKyAqIGFkZHJlc3Mgd2lsbCBiZSB1c2VkIHRvIGluZGV4IGludG8gYW4gYXBwcm9wcmlhdGUgdGFibGUgdG8gZmluZCB0aGUKKyAqIG9mZnNldCB0byBhZGQgdG8gdGhlIGFkZHJlc3MgdG8geWllbGQgdGhlIGNvcnJlc3BvbmRpbmcgRE1BIG9yIHBoeXNpY2FsCisgKiBhZGRyZXNzLCByZXNwZWN0aXZlbHkuCiAgKi8KLSNkZWZpbmUgcGh5c190b19idXMoeCkgKCgoeCkgPCBMT1dfTUVNX0JPVU5EQVJZX1BIWVMpID8gXAotCSgoeCkgKyBwaHlzX3RvX2J1c19vZmZzZXQpIDogKHgpKQotI2RlZmluZSBidXNfdG9fcGh5cyh4KSAoKCh4KSA8IE1FTV9HQVBfUEhZU19BRERSKSA/IFwKLQkoKHgpIC0gcGh5c190b19idXNfb2Zmc2V0KSA6ICh4KSkKLSNlbHNlCi0jZGVmaW5lIHBoeXNfdG9fYnVzKHgpICgoeCkgKyBwaHlzX3RvX2J1c19vZmZzZXQpCi0jZGVmaW5lIGJ1c190b19waHlzKHgpICgoeCkgLSBwaHlzX3RvX2J1c19vZmZzZXQpCi0jZW5kaWYKKyNkZWZpbmUgSU9SX0xTQklUUwkJMjIJCQkvKiBCaXRzIGluIGEgZ3JhaW4gKi8KIAogLyoKLSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGRyZXNzIHdlIGFyZSBnaXZlbiBpcyBmb3IgYW4gQVNJQyBkZXZpY2UKLSAqIFBhcmFtczogIGFkZHIgICAgQWRkcmVzcyB0byBjaGVjawotICogUmV0dXJuczogWmVybyBpZiB0aGUgYWRkcmVzcyBpcyBub3QgZm9yIEFTSUMgZGV2aWNlcywgbm9uLXplcm8KLSAqICAgICAgaWYgaXQgaXMuCisgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgbW9zdCBzaWduaWZpY2FudCBhZGRyZXNzIGJpdHMgYWZ0ZXIgcmVtb3ZpbmcgdGhvc2UKKyAqIHVzZWQgZm9yIHRoZSBvZmZzZXQgd2l0aGluIGEgZ3JhaW4gYW5kIHRoZW4gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRhYmxlCisgKiBlbnRyaWVzIGZvciB0aGUgY29udmVyc2lvbi4KICAqLwotc3RhdGljIGlubGluZSBpbnQgYXNpY19pc19kZXZpY2VfYWRkcihwaHlzX3QgYWRkcikKKyNkZWZpbmUgSU9SX1BIWVNfTVNCSVRTCQkoSU9SX1BIWVNfQklUUyAtIElPUl9MU0JJVFMpCisjZGVmaW5lIElPUl9OVU1fUEhZU19UT19ETUEJKChwaHlzX2FkZHJfdCkgMSA8PCBJT1JfUEhZU19NU0JJVFMpCisKKyNkZWZpbmUgSU9SX0RNQV9NU0JJVFMJCShJT1JfRE1BX0JJVFMgLSBJT1JfTFNCSVRTKQorI2RlZmluZSBJT1JfTlVNX0RNQV9UT19QSFlTCSgoZG1hX2FkZHJfdCkgMSA8PCBJT1JfRE1BX01TQklUUykKKworLyoKKyAqIERlZmluZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBhcyBlbGVtZW50cyBpbiB0aGUgYXJyYXlzIGZvciB0aGUgY29udmVyc2lvbgorICogYmV0d2VlbiBwaHlzaWNhbCBhbmQgRE1BIGFkZHJlc3Nlcy4gV2UgZG8gc29tZSBzbGlnaHRseSBmYW5jeSBtYXRoIHRvCisgKiBjb21wdXRlIHRoZSB3aWR0aCBvZiB0aGUgb2Zmc2V0IGVsZW1lbnQgb2YgdGhlIGNvbnZlcnNpb24gdGFibGVzIHNvCisgKiB0aGF0IHdlIGNhbiBoYXZlIHRoZSBzbWFsbGVzdCBjb252ZXJzaW9uIHRhYmxlcy4gTmV4dCwgcm91bmQgdXAgdGhlCisgKiBzaXplcyB0byB0aGUgbmV4dCBoaWdoZXIgcG93ZXIgb2YgdHdvLCBpLmUuIHRoZSBvZmZzZXQgZWxlbWVudCB3aWxsIGhhdmUKKyAqIDgsIDE2LCAzMiwgNjQsIGV0Yy4gYml0cy4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIG1hc2sgb2ZmIGFueQorICogYml0cy4gIEZpbmFsbHksIHdlIGNvbXB1dGUgYSBzaGlmdCB2YWx1ZSB0aGF0IHB1dHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKyAqIGJpdHMgb2YgdGhlIG9mZnNldCBpbnRvIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIG9mZnNldCBlbGVtZW50LgorICogVGhpcyBtYWtlcyBpdCBtb3JlIGVmZmljaWVudCBvbiBwcm9jZXNzb3JzIHdpdGhvdXQgYmFycmVsIHNoaWZ0ZXJzIGFuZAorICogZWFzaWVyIHRvIHNlZSB0aGUgdmFsdWVzIGlmIHRoZSBjb252ZXJzaW9uIHRhYmxlIGlzIGR1bXBlZCBpbiBiaW5hcnkuCisgKi8KKyNkZWZpbmUgX0lPUl9PRkZTRVRfV0lEVEgobikJKDEgPDwgb3JkZXJfYmFzZV8yKG4pKQorI2RlZmluZSBJT1JfT0ZGU0VUX1dJRFRIKG4pIFwKKwkoX0lPUl9PRkZTRVRfV0lEVEgobikgPCA4ID8gOCA6IF9JT1JfT0ZGU0VUX1dJRFRIKG4pKQorCisjZGVmaW5lIElPUl9QSFlTX09GRlNFVF9CSVRTCUlPUl9PRkZTRVRfV0lEVEgoSU9SX1BIWVNfTVNCSVRTKQorI2RlZmluZSBJT1JfUEhZU19TSElGVAkJKElPUl9QSFlTX0JJVFMgLSBJT1JfUEhZU19PRkZTRVRfQklUUykKKworI2RlZmluZSBJT1JfRE1BX09GRlNFVF9CSVRTCUlPUl9PRkZTRVRfV0lEVEgoSU9SX0RNQV9NU0JJVFMpCisjZGVmaW5lIElPUl9ETUFfU0hJRlQJCShJT1JfRE1BX0JJVFMgLSBJT1JfRE1BX09GRlNFVF9CSVRTKQorCitzdHJ1Y3QgaW9yX3BoeXNfdG9fZG1hIHsKKwlkbWFfYWRkcl90IG9mZnNldDpJT1JfRE1BX09GRlNFVF9CSVRTIF9fcGFja2VkCisJCV9fYWxpZ25lZCgoSU9SX0RNQV9PRkZTRVRfQklUUyAvIElPUl9CUEMpKTsKK307CisKK3N0cnVjdCBpb3JfZG1hX3RvX3BoeXMgeworCWRtYV9hZGRyX3Qgb2Zmc2V0OklPUl9QSFlTX09GRlNFVF9CSVRTIF9fcGFja2VkCisJCV9fYWxpZ25lZCgoSU9SX1BIWVNfT0ZGU0VUX0JJVFMgLyBJT1JfQlBDKSk7Cit9OworCitleHRlcm4gc3RydWN0IGlvcl9waHlzX3RvX2RtYSBfaW9yX3BoeXNfdG9fZG1hW0lPUl9OVU1fUEhZU19UT19ETUFdOworZXh0ZXJuIHN0cnVjdCBpb3JfZG1hX3RvX3BoeXMgX2lvcl9kbWFfdG9fcGh5c1tJT1JfTlVNX0RNQV9UT19QSFlTXTsKKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IF9waHlzX3RvX2RtYV9vZmZzZXRfcmF3KHBoeXNfYWRkcl90IHBoeXMpCiB7Ci0JcmV0dXJuICEoKHBoeXNfdClhZGRyICYgKHBoeXNfdCkgTE9XX01FTV9CT1VOREFSWV9NQVNLKTsKKwlyZXR1cm4gKGRtYV9hZGRyX3QpX2lvcl9waHlzX3RvX2RtYVtwaHlzID4+IElPUl9MU0JJVFNdLm9mZnNldDsKIH0KIAotLyoKLSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGRyZXNzIHdlIGFyZSBnaXZlbiBpcyBleHRlcm5hbCBSQU0gbWFwcGFibGUKLSAqIGludG8gS1NFRzEuCi0gKiBQYXJhbXM6ICBhZGRyICAgIEFkZHJlc3MgdG8gY2hlY2sKLSAqIFJldHVybnM6IFplcm8gaWYgdGhlIGFkZHJlc3MgaXMgbm90IGZvciBleHRlcm5hbCBSQU0gYW5kCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFzaWNfaXNfbG93bWVtX3JhbV9hZGRyKHBoeXNfdCBhZGRyKQorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IF9kbWFfdG9fcGh5c19vZmZzZXRfcmF3KGRtYV9hZGRyX3QgZG1hKQogewotCS8qCi0JICogVGhlIFJBTSBhbHdheXMgc3RhcnRzIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzcyBpbiB0aGUgcHJvY2Vzc29yJ3MKLQkgKiBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlCi0JICovCi0Jc3RhdGljIGNvbnN0IHBoeXNfdCBwaHlzX3JhbV9iYXNlID0gMHgxMDAwMDAwMDsKLQlwaHlzX3QgYnVzX3JhbV9iYXNlOwotCi0JYnVzX3JhbV9iYXNlID0gcGh5c190b19idXNfb2Zmc2V0ICsgcGh5c19yYW1fYmFzZTsKLQotCXJldHVybiBhZGRyID49IGJ1c19yYW1fYmFzZSAmJgotCQlhZGRyIDwgKGJ1c19yYW1fYmFzZSArIChMT1dfTUVNX0JPVU5EQVJZX1BIWVMgLSBwaHlzX3JhbV9iYXNlKSk7CisJcmV0dXJuIChkbWFfYWRkcl90KV9pb3JfZG1hX3RvX3BoeXNbZG1hID4+IElPUl9MU0JJVFNdLm9mZnNldDsKIH0KIAorLyogVGhlc2UgYXJlIG5vdCBwb3J0YWJsZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGRyaXZlcnMuIERyaXZlcnMgc2hvdWxkCisgKiBiZSB1c2luZyBpb3JlbWFwKCkgYW5kIGZyaWVuZHMgdG8gbWFwIHBoeXNpY2FsIGFkZHJlc2VzIHRvIHZpcnR1YWwKKyAqIGFkZHJlc3NlcyBhbmQgZG1hX21hcCooKSBhbmQgZnJpZW5kcyB0byBtYXAgdmlydHVhbCBhZGRyZXNzZXMgaW50byBETUEKKyAqIGFkZHJlc3NlcyBhbmQgYmFjay4KKyAqLworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBoeXNfdG9fZG1hKHBoeXNfYWRkcl90IHBoeXMpCit7CisJcmV0dXJuIHBoeXMgKyAoX3BoeXNfdG9fZG1hX29mZnNldF9yYXcocGh5cykgPDwgSU9SX1BIWVNfU0hJRlQpOworfQorCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IGRtYV90b19waHlzKGRtYV9hZGRyX3QgZG1hKQoreworCXJldHVybiBkbWEgKyAoX2RtYV90b19waHlzX29mZnNldF9yYXcoZG1hKSA8PCBJT1JfRE1BX1NISUZUKTsKK30KKworZXh0ZXJuIHZvaWQgaW9yZW1hcF9hZGRfbWFwKGRtYV9hZGRyX3QgcGh5cywgcGh5c19hZGRyX3QgYWxpYXMsCisJZG1hX2FkZHJfdCBzaXplKTsKKwogLyoKICAqIEFsbG93IHBoeXNpY2FsIGFkZHJlc3NlcyB0byBiZSBmaXhlZCB1cCB0byBoZWxwIHBlcmlwaGVyYWxzIGxvY2F0ZWQKICAqIG91dHNpZGUgdGhlIGxvdyAzMi1iaXQgcmFuZ2UgLS0gZ2VuZXJpYyBwYXNzLXRocm91Z2ggdmVyc2lvbi4KQEAgLTc3LDEwICsxMTQsNTAgQEAKIAlyZXR1cm4gcGh5c19hZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGxhdF9pb3JlbWFwKHBoeXNfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKy8qCisgKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhZGRyZXNzZXMgdGhlIGFyZWEgYWxpYXNlZCBpbnRvIHRoZSBmaXJzdAorICogNTEyIE1pQiBvZiB0aGUgcHJvY2Vzc29yJ3MgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZS4gVGhlc2UgdHVybiBpbnRvIGVpdGhlcgorICoga3NlZzAgb3Iga3NlZzEgYWRkcmVzc2VzLCBkZXBlbmRpbmcgb24gZmxhZ3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpwbGF0X2lvcmVtYXAocGh5c190IHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsCiAJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlyZXR1cm4gTlVMTDsKKwlwaHlzX2FkZHJfdCBzdGFydF9vZmZzZXQ7CisJdm9pZCBfX2lvbWVtICpyZXN1bHQgPSBOVUxMOworCisJLyogU3RhcnQgYnkgY2hlY2tpbmcgdG8gc2VlIHdoZXRoZXIgdGhpcyBpcyBhbiBhbGlhc2VkIGFkZHJlc3MgKi8KKwlzdGFydF9vZmZzZXQgPSBfZG1hX3RvX3BoeXNfb2Zmc2V0X3JhdyhzdGFydCk7CisKKwkvKgorCSAqIElmOgorCSAqIG8JdGhlIG1lbW9yeSBpcyBhbGlhc2VkIGludG8gdGhlIGZpcnN0IDUxMiBNaUIsIGFuZAorCSAqIG8JdGhlIHN0YXJ0IGFuZCBlbmQgYXJlIGluIHRoZSBzYW1lIFJBTSBiYW5rLCBhbmQKKwkgKiBvCXdlIGRvbid0IGhhdmUgYSB6ZXJvIHNpemUgb3Igd3JhcCBhcm91bmQsIGFuZAorCSAqIG8Jd2UgYXJlIHN1cHBvc2VkIHRvIGNyZWF0ZSBhbiB1bmNhY2hlZCBtYXBwaW5nLAorCSAqCWhhbmRsZSB0aGlzIGlzIGEga3NlZzAgb3Iga3NlZzEgYWRkcmVzcworCSAqLworCWlmIChzdGFydF9vZmZzZXQgIT0gMCkgeworCQlwaHlzX2FkZHJfdCBsYXN0OworCQlkbWFfYWRkcl90IGRtYV90b19waHlzX29mZnNldDsKKworCQlsYXN0ID0gc3RhcnQgKyBzaXplIC0gMTsKKwkJZG1hX3RvX3BoeXNfb2Zmc2V0ID0KKwkJCV9kbWFfdG9fcGh5c19vZmZzZXRfcmF3KGxhc3QpIDw8IElPUl9ETUFfU0hJRlQ7CisKKwkJaWYgKGRtYV90b19waHlzX29mZnNldCA9PSBzdGFydF9vZmZzZXQgJiYKKwkJCXNpemUgIT0gMCAmJiBzdGFydCA8PSBsYXN0KSB7CisJCQlwaHlzX3QgYWRqdXN0ZWRfc3RhcnQ7CisJCQlhZGp1c3RlZF9zdGFydCA9IHN0YXJ0ICsgc3RhcnRfb2Zmc2V0OworCQkJaWYgKGZsYWdzID09IF9DQUNIRV9VTkNBQ0hFRCkKKwkJCQlyZXN1bHQgPSAodm9pZCBfX2lvbWVtICopICh1bnNpZ25lZCBsb25nKQorCQkJCQlDS1NFRzFBRERSKGFkanVzdGVkX3N0YXJ0KTsKKwkJCWVsc2UKKwkJCQlyZXN1bHQgPSAodm9pZCBfX2lvbWVtICopICh1bnNpZ25lZCBsb25nKQorCQkJCQlDS1NFRzBBRERSKGFkanVzdGVkX3N0YXJ0KTsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBsYXRfaW91bm1hcChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDQ5eHgva21hbGxvYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHg0OXh4L2ttYWxsb2MuaAppbmRleCA5MTNmZjE5Li5iNzRjYWY2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDQ5eHgva21hbGxvYy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4NDl4eC9rbWFsbG9jLmgKQEAgLTEsOCArMSw2IEBACiAjaWZuZGVmIF9fQVNNX01BQ0hfVFg0OVhYX0tNQUxMT0NfSAogI2RlZmluZSBfX0FTTV9NQUNIX1RYNDlYWF9LTUFMTE9DX0gKIAotLyoKLSAqIEFsbCBoYXBweSwgbm8gbmVlZCB0byBkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOCi0gKi8KKyNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOCUwxX0NBQ0hFX0JZVEVTCiAKICNlbmRpZiAvKiBfX0FTTV9NQUNIX1RYNDlYWF9LTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKaW5kZXggYzZlM2M5My4uMzM1NDc0YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCkBAIC00MDgsNiArNDA4LDcgQEAKICNkZWZpbmUgIFNUQVRVU0JfSVAxNQkJNwogI2RlZmluZSAgU1RBVFVTRl9JUDE1CQkoX1VMQ0FTVF8oMSkgPDwgIDcpCiAjZGVmaW5lIFNUMF9DSAkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgU1QwX05NSQkJCTB4MDAwODAwMDAKICNkZWZpbmUgU1QwX1NSCQkJMHgwMDEwMDAwMAogI2RlZmluZSBTVDBfVFMJCQkweDAwMjAwMDAwCiAjZGVmaW5lIFNUMF9CRVYJCQkweDAwNDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL29jdGVvbi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9vY3Rlb24uaAppbmRleCBjYTYyMTRiLi45MTdhNmM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL29jdGVvbi5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vb2N0ZW9uLmgKQEAgLTUwLDYgKzUwLDcgQEAKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgb2N0ZW9uX2NvcDJfcmVzdG9yZShzdHJ1Y3Qgb2N0ZW9uX2NvcDJfc3RhdGUgKnRhc2spOwogCiBleHRlcm4gdm9pZCBvY3Rlb25faW5pdF9jdm1jb3VudCh2b2lkKTsKK2V4dGVybiB2b2lkIG9jdGVvbl9zZXR1cF9kZWxheXModm9pZCk7CiAKICNkZWZpbmUgT0NURU9OX0FSR1ZfTUFYX0FSR1MJNjQKICNkZWZpbmUgT0NUT0VOX1NFUklBTF9MRU4JMjAKQEAgLTI1Myw0ICsyNTQsNiBAQAogCiBleHRlcm4gc3RydWN0IGN2bXhfYm9vdGluZm8gKm9jdGVvbl9ib290aW5mbzsKIAorZXh0ZXJuIHVpbnQ2NF90IG9jdGVvbl9ib290bG9hZGVyX2VudHJ5X2FkZHI7CisKICNlbmRpZiAvKiBfX0FTTV9PQ1RFT05fT0NURU9OX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vcGNpLW9jdGVvbi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9wY2ktb2N0ZW9uLmgKaW5kZXggNmFjNWQzZS4uZWNlNzgwNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9wY2ktb2N0ZW9uLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9wY2ktb2N0ZW9uLmgKQEAgLTE1LDYgKzE1LDE5IEBACiAjZGVmaW5lIFBDSV9DT05GSUdfU1BBQ0VfREVMQVkgMTAwMDAKIAogLyoKKyAqIFRoZSBwaHlzaWNhbCBtZW1vcnkgYmFzZSBtYXBwZWQgYnkgQkFSMS4gIDI1Nk1CIGF0IHRoZSBlbmQgb2YgdGhlCisgKiBmaXJzdCA0R0IuCisgKi8KKyNkZWZpbmUgQ1ZNWF9QQ0lFX0JBUjFfUEhZU19CQVNFICgoMXVsbCA8PCAzMikgLSAoMXVsbCA8PCAyOCkpCisjZGVmaW5lIENWTVhfUENJRV9CQVIxX1BIWVNfU0laRSAoMXVsbCA8PCAyOCkKKworLyoKKyAqIFRoZSBSQyBiYXNlIG9mIEJBUjEuICBnZW4xIGhhcyBhIDM5LWJpdCBCQVIyLCBnZW4yIGhhcyA0MS1iaXQgQkFSMiwKKyAqIHBsYWNlIEJBUjEgc28gaXQgaXMgdGhlIHNhbWUgZm9yIGJvdGguCisgKi8KKyNkZWZpbmUgQ1ZNWF9QQ0lFX0JBUjFfUkNfQkFTRSAoMXVsbCA8PCA0MSkKKworLyoKICAqIHBjaWJpb3NfbWFwX2lycSgpIGlzIGRlZmluZWQgaW5zaWRlIHBjaS1vY3Rlb24uYy4gQWxsIGl0IGRvZXMgaXMKICAqIGNhbGwgdGhlIE9jdGVvbiBzcGVjaWZpYyB2ZXJzaW9uIHBvaW50ZWQgdG8gYnkgdGhpcyB2YXJpYWJsZS4gVGhpcwogICogZnVuY3Rpb24gbmVlZHMgdG8gY2hhbmdlIGZvciBQQ0kgb3IgUENJZSBiYXNlZCBob3N0cy4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCAzYmVlYTE0Li41NzYzOTdjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0xNDAsNiArMTQwLDExIEBACiAJcmV0dXJuIGNoYW5uZWwgPyAxNSA6IDE0OwogfQogCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisvKiBNU0kgYXJjaCBob29rIGZvciBPQ1RFT04gKi8KKyNkZWZpbmUgYXJjaF9zZXR1cF9tc2lfaXJxcyBhcmNoX3NldHVwX21zaV9pcnFzCisjZW5kaWYKKwogZXh0ZXJuIGludCBwY2lfcHJvYmVfb25seTsKIAogZXh0ZXJuIGNoYXIgKiAoKnBjaWJpb3NfcGxhdF9zZXR1cCkoY2hhciAqc3RyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3Byb20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3Byb20uaAppbmRleCA1NGVmMWE5Li43ODZkODJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9wcm9tLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfcHJvbS5oCkBAIC0xMjQsMTAgKzEyNCw2IEBACiBleHRlcm4gdm9pZCBwcm9tX2ZpeHVwX21lbV9tYXAodW5zaWduZWQgbG9uZyBzdGFydF9tZW0sCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmRfbWVtKTsKIAotI2lmZGVmIENPTkZJR19NVERfUE1DX01TUF9SQU1ST09UCi1leHRlcm4gYm9vbCBnZXRfcmFtcm9vdCh2b2lkICoqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKnNpemUpOwotI2VuZGlmCi0KIGV4dGVybiBpbnQgZ2V0X2V0aGVybmV0X2FkZHIoY2hhciAqZXRoYWRkcl9uYW1lLCBjaGFyICpldGhlcm5ldF9hZGRyKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9kZXZpY2VpZCh2b2lkKTsKIGV4dGVybiBjaGFyIGlkZW50aWZ5X2VuZXQodW5zaWduZWQgbG9uZyBpbnRlcmZhY2VfbnVtKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA1ZDMzYjcyLi4wZDYyOWJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zNCw2ICszNCwxMSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCB2Y2VkX2NvdW50LCB2Y2VpX2NvdW50OwogCiAvKgorICogTUlQUyBkb2VzIGhhdmUgYW4gYXJjaF9waWNrX21tYXBfbGF5b3V0KCkKKyAqLworI2RlZmluZSBIQVZFX0FSQ0hfUElDS19NTUFQX0xBWU9VVCAxCisKKy8qCiAgKiBBIHNwZWNpYWwgcGFnZSAodGhlIHZkc28pIGlzIG1hcHBlZCBpbnRvIGFsbCBwcm9jZXNzZXMgYXQgdGhlIHZlcnkKICAqIHRvcCBvZiB0aGUgdmlydHVhbCBtZW1vcnkgc3BhY2UuCiAgKi8KQEAgLTUyLDYgKzU3LDkgQEAKICAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCiAgKi8KICNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCSgoVEFTS19TSVpFIC8gMykgJiB+KFBBR0VfU0laRSkpCisKKyNkZWZpbmUgVEFTS19JU18zMkJJVF9BRERSIDEKKwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKQEAgLTc3LDYgKzg1LDkgQEAKIAkJUEFHRV9BTElHTihUQVNLX1NJWkUzMiAvIDMpIDogUEFHRV9BTElHTihUQVNLX1NJWkUgLyAzKSkKICNkZWZpbmUgVEFTS19TSVpFX09GKHRzaykJCQkJCQlcCiAJKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGXzMyQklUX0FERFIpID8gVEFTS19TSVpFMzIgOiBUQVNLX1NJWkUpCisKKyNkZWZpbmUgVEFTS19JU18zMkJJVF9BRERSIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpCisKICNlbmRpZgogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMjE4LDcgKzIyOSw2IEBACiAJdW5zaWduZWQgbG9uZyBjcDBfYmFkdmFkZHI7CS8qIExhc3QgdXNlciBmYXVsdCAqLwogCXVuc2lnbmVkIGxvbmcgY3AwX2JhZHVhZGRyOwkvKiBMYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgVVNFRyAqLwogCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKLQl1bnNpZ25lZCBsb25nIHRyYXBfbm87CiAJdW5zaWduZWQgbG9uZyBpcml4X3RyYW1wb2xpbmU7ICAvKiBXaGVlZS4uLiAqLwogCXVuc2lnbmVkIGxvbmcgaXJpeF9vbGRjdHg7CiAjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCkBAIC0yOTAsNyArMzAwLDYgQEAKIAkuY3AwX2JhZHZhZGRyCQk9IDAsCQkJCVwKIAkuY3AwX2JhZHVhZGRyCQk9IDAsCQkJCVwKIAkuZXJyb3JfY29kZQkJPSAwLAkJCQlcCi0JLnRyYXBfbm8JCT0gMCwJCQkJXAogCS5pcml4X3RyYW1wb2xpbmUJPSAwLAkJCQlcCiAJLmlyaXhfb2xkY3R4CQk9IDAsCQkJCVwKIAkvKgkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggY2RjNmE0Ni4uOWYxYjhkYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMTM3LDYgKzEzNyw3IEBACiAgKi8KICNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoKHJlZ3MpLT5jcDBfc3RhdHVzICYgS1VfTUFTSykgPT0gS1VfVVNFUikKIAorI2RlZmluZSByZWdzX3JldHVybl92YWx1ZShfcmVncykgKChfcmVncyktPnJlZ3NbMl0pCiAjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+Y3AwX2VwYykKICNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9hZ2VudC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2FnZW50LmgKaW5kZXggYWM0ZWE4NS4uZGM4MTExNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2FnZW50LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2FnZW50LmgKQEAgLTExLDcgKzExLDYgQEAKICNpZm5kZWYgX0FTTV9TR0lfU05fQUdFTlRfSAogI2RlZmluZSBfQVNNX1NHSV9TTl9BR0VOVF9ICiAKLSNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgogI2luY2x1ZGUgPGFzbS9zbi9hcmNoLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YXNtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFzbS5oCmluZGV4IDY5N2U0MGMuLjg5MjA2MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YXNtLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Vhc20uaApAQCAtMTAsNDQgKzEwLDU1IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCisjaWZkZWYgQ09ORklHX0VYUE9SVF9VQVNNCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjZGVmaW5lIF9fdWFzbWluaXQKKyNkZWZpbmUgX191YXNtaW5pdGRhdGEKKyNkZWZpbmUgVUFTTV9FWFBPUlRfU1lNQk9MKHN5bSkgRVhQT1JUX1NZTUJPTChzeW0pCisjZWxzZQorI2RlZmluZSBfX3Vhc21pbml0IF9fY3B1aW5pdAorI2RlZmluZSBfX3Vhc21pbml0ZGF0YSBfX2NwdWluaXRkYXRhCisjZGVmaW5lIFVBU01fRVhQT1JUX1NZTUJPTChzeW0pCisjZW5kaWYKKwogI2RlZmluZSBJcF91MXUydTMob3ApCQkJCQkJCVwKLXZvaWQgX19jcHVpbml0CQkJCQkJCQlcCit2b2lkIF9fdWFzbWluaXQJCQkJCQkJCVwKIHVhc21faSMjb3AodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGludCBjKQogCiAjZGVmaW5lIElwX3UydTF1MyhvcCkJCQkJCQkJXAotdm9pZCBfX2NwdWluaXQJCQkJCQkJCVwKK3ZvaWQgX191YXNtaW5pdAkJCQkJCQkJXAogdWFzbV9pIyNvcCh1MzIgKipidWYsIHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgaW50IGMpCiAKICNkZWZpbmUgSXBfdTN1MXUyKG9wKQkJCQkJCQlcCi12b2lkIF9fY3B1aW5pdAkJCQkJCQkJXAordm9pZCBfX3Vhc21pbml0CQkJCQkJCQlcCiB1YXNtX2kjI29wKHUzMiAqKmJ1ZiwgdW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBpbnQgYykKIAogI2RlZmluZSBJcF91MXUyczMob3ApCQkJCQkJCVwKLXZvaWQgX19jcHVpbml0CQkJCQkJCQlcCit2b2lkIF9fdWFzbWluaXQJCQkJCQkJCVwKIHVhc21faSMjb3AodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIsIHNpZ25lZCBpbnQgYykKIAogI2RlZmluZSBJcF91MnMzdTEob3ApCQkJCQkJCVwKLXZvaWQgX19jcHVpbml0CQkJCQkJCQlcCit2b2lkIF9fdWFzbWluaXQJCQkJCQkJCVwKIHVhc21faSMjb3AodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgYSwgc2lnbmVkIGludCBiLCB1bnNpZ25lZCBpbnQgYykKIAogI2RlZmluZSBJcF91MnUxczMob3ApCQkJCQkJCVwKLXZvaWQgX19jcHVpbml0CQkJCQkJCQlcCit2b2lkIF9fdWFzbWluaXQJCQkJCQkJCVwKIHVhc21faSMjb3AodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIsIHNpZ25lZCBpbnQgYykKIAogI2RlZmluZSBJcF91MnUxbXNidTMob3ApCQkJCQkJXAotdm9pZCBfX2NwdWluaXQJCQkJCQkJCVwKK3ZvaWQgX191YXNtaW5pdAkJCQkJCQkJXAogdWFzbV9pIyNvcCh1MzIgKipidWYsIHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgaW50IGMsCVwKIAkgICB1bnNpZ25lZCBpbnQgZCkKIAogI2RlZmluZSBJcF91MXUyKG9wKQkJCQkJCQlcCi12b2lkIF9fY3B1aW5pdCB1YXNtX2kjI29wKHUzMiAqKmJ1ZiwgdW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBiKQordm9pZCBfX3Vhc21pbml0IHVhc21faSMjb3AodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIpCiAKICNkZWZpbmUgSXBfdTFzMihvcCkJCQkJCQkJXAotdm9pZCBfX2NwdWluaXQgdWFzbV9pIyNvcCh1MzIgKipidWYsIHVuc2lnbmVkIGludCBhLCBzaWduZWQgaW50IGIpCit2b2lkIF9fdWFzbWluaXQgdWFzbV9pIyNvcCh1MzIgKipidWYsIHVuc2lnbmVkIGludCBhLCBzaWduZWQgaW50IGIpCiAKLSNkZWZpbmUgSXBfdTEob3ApIHZvaWQgX19jcHVpbml0IHVhc21faSMjb3AodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgYSkKKyNkZWZpbmUgSXBfdTEob3ApIHZvaWQgX191YXNtaW5pdCB1YXNtX2kjI29wKHUzMiAqKmJ1ZiwgdW5zaWduZWQgaW50IGEpCiAKLSNkZWZpbmUgSXBfMChvcCkgdm9pZCBfX2NwdWluaXQgdWFzbV9pIyNvcCh1MzIgKipidWYpCisjZGVmaW5lIElwXzAob3ApIHZvaWQgX191YXNtaW5pdCB1YXNtX2kjI29wKHUzMiAqKmJ1ZikKIAogSXBfdTJ1MXMzKF9hZGRpdSk7CiBJcF91M3UxdTIoX2FkZHUpOwpAQCAtNzEsNiArODIsNyBAQAogSXBfdTJ1MXUzKF9kc3JsKTsKIElwX3UydTF1MyhfZHNybDMyKTsKIElwX3UydTF1MyhfZHJvdHIpOworSXBfdTJ1MXUzKF9kcm90cjMyKTsKIElwX3UzdTF1MihfZHN1YnUpOwogSXBfMChfZXJldCk7CiBJcF91MShfaik7CkBAIC0xMTEsNyArMTIzLDcgQEAKIAlpbnQgbGFiOwogfTsKIAotdm9pZCBfX2NwdWluaXQgdWFzbV9idWlsZF9sYWJlbChzdHJ1Y3QgdWFzbV9sYWJlbCAqKmxhYiwgdTMyICphZGRyLCBpbnQgbGlkKTsKK3ZvaWQgX191YXNtaW5pdCB1YXNtX2J1aWxkX2xhYmVsKHN0cnVjdCB1YXNtX2xhYmVsICoqbGFiLCB1MzIgKmFkZHIsIGludCBsaWQpOwogI2lmZGVmIENPTkZJR182NEJJVAogaW50IHVhc21faW5fY29tcGF0X3NwYWNlX3AobG9uZyBhZGRyKTsKICNlbmRpZgpAQCAtMTIxLDcgKzEzMyw3IEBACiB2b2lkIFVBU01faV9MQSh1MzIgKipidWYsIHVuc2lnbmVkIGludCBycywgbG9uZyBhZGRyKTsKIAogI2RlZmluZSBVQVNNX0xfTEEobGIpCQkJCQkJCVwKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdWluaXQgdWFzbV9sIyNsYihzdHJ1Y3QgdWFzbV9sYWJlbCAqKmxhYiwgdTMyICphZGRyKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgX191YXNtaW5pdCB1YXNtX2wjI2xiKHN0cnVjdCB1YXNtX2xhYmVsICoqbGFiLCB1MzIgKmFkZHIpIFwKIHsJCQkJCQkJCQlcCiAJdWFzbV9idWlsZF9sYWJlbChsYWIsIGFkZHIsIGxhYmVsIyNsYik7CQkJCVwKIH0KQEAgLTE3Niw2ICsxODgsMTUgQEAKIAkJdWFzbV9pX2RzcmwzMihwLCBhMSwgYTIsIGEzIC0gMzIpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdWFzbV9pX2Ryb3RyX3NhZmUodTMyICoqcCwgdW5zaWduZWQgaW50IGExLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGEyLCB1bnNpZ25lZCBpbnQgYTMpCit7CisJaWYgKGEzIDwgMzIpCisJCXVhc21faV9kcm90cihwLCBhMSwgYTIsIGEzKTsKKwllbHNlCisJCXVhc21faV9kcm90cjMyKHAsIGExLCBhMiwgYTMgLSAzMik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB1YXNtX2lfZHNsbF9zYWZlKHUzMiAqKnAsIHVuc2lnbmVkIGludCBhMSwKIAkJCQkgICAgdW5zaWduZWQgaW50IGEyLCB1bnNpZ25lZCBpbnQgYTMpCiB7CkBAIC0yMTMsMyArMjM0LDcgQEAKIHZvaWQgdWFzbV9pbF9ibmV6KHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgaW50IGxpZCk7CiB2b2lkIHVhc21faWxfYmdlemwodTMyICoqcCwgc3RydWN0IHVhc21fcmVsb2MgKipyLCB1bnNpZ25lZCBpbnQgcmVnLCBpbnQgbGlkKTsKIHZvaWQgdWFzbV9pbF9iZ2V6KHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgaW50IGxpZCk7Cit2b2lkIHVhc21faWxfYmJpdDAodTMyICoqcCwgc3RydWN0IHVhc21fcmVsb2MgKipyLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkgICB1bnNpZ25lZCBpbnQgYml0LCBpbnQgbGlkKTsKK3ZvaWQgdWFzbV9pbF9iYml0MSh1MzIgKipwLCBzdHJ1Y3QgdWFzbV9yZWxvYyAqKnIsIHVuc2lnbmVkIGludCByZWcsCisJCSAgIHVuc2lnbmVkIGludCBiaXQsIGludCBsaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2phenovTWFrZWZpbGUgYi9hcmNoL21pcHMvamF6ei9NYWtlZmlsZQppbmRleCA1YWVlMGMyLi5kZDlkOTliIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvamF6ei9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvamF6ei9NYWtlZmlsZQpAQCAtMyw1ICszLDMgQEAKICMKIAogb2JqLXkJIAk6PSBpcnEubyBqYXp6ZG1hLm8gcmVzZXQubyBzZXR1cC5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvamF6ei9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9qYXp6L1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzM3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvamF6ei9QbGF0Zm9ybQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgQWNlciBQSUNBIDYxLCBNaXBzIE1hZ251bSA0MDAwIGFuZCBPbGl2ZXR0aSBNNzAwLgorIworcGxhdGZvcm0tJChDT05GSUdfTUFDSF9KQVpaKQkrPSBqYXp6LworY2ZsYWdzLSQoQ09ORklHX01BQ0hfSkFaWikJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenoKK2xvYWQtJChDT05GSUdfTUFDSF9KQVpaKQkrPSAweGZmZmZmZmZmODAwODAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvS2NvbmZpZyBiL2FyY2gvbWlwcy9qejQ3NDAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTcxNDFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2p6NDc0MC9LY29uZmlnCkBAIC0wLDAgKzEsMTIgQEAKK2Nob2ljZQorCXByb21wdCAiTWFjaGluZSB0eXBlIgorCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKKwlkZWZhdWx0IEpaNDc0MF9RSV9MQjYwCisKK2NvbmZpZyBKWjQ3NDBfUUlfTEI2MAorCWJvb2wgIlFpIEhhcmR3YXJlIEJlbiBOYW5vTm90ZSIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBIQVZFX1BXTQorCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvTWFrZWZpbGUgYi9hcmNoL21pcHMvano0NzQwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDRlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBJbmdlbmljIEpaNDc0MC4KKyMKKworIyBPYmplY3QgZmlsZSBsaXN0cy4KKworb2JqLXkgKz0gcHJvbS5vIGlycS5vIHRpbWUubyByZXNldC5vIHNldHVwLm8gZG1hLm8gXAorCWdwaW8ubyBjbG9jay5vIHBsYXRmb3JtLm8gdGltZXIubyBwd20ubyBzZXJpYWwubworCitvYmotJChDT05GSUdfREVCVUdfRlMpICs9IGNsb2NrLWRlYnVnZnMubworCisjIGJvYXJkIHNwZWNpZmljIHN1cHBvcnQKKworb2JqLSQoQ09ORklHX0paNDc0MF9RSV9MQjYwKQkrPSBib2FyZC1xaV9sYjYwLm8KKworIyBQTSBzdXBwb3J0CisKK29iai0kKENPTkZJR19QTSkgKz0gcG0ubworCitFWFRSQV9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9qejQ3NDAvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvUGxhdGZvcm0KQEAgLTAsMCArMSwzIEBACitjb3JlLSQoQ09ORklHX01BQ0hfSlo0NzQwKQkrPSBhcmNoL21pcHMvano0NzQwLworY2ZsYWdzLSQoQ09ORklHX01BQ0hfSlo0NzQwKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwCitsb2FkLSQoQ09ORklHX01BQ0hfSlo0NzQwKQkrPSAweGZmZmZmZmZmODAwMTAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvYm9hcmQtcWlfbGI2MC5jIGIvYXJjaC9taXBzL2p6NDc0MC9ib2FyZC1xaV9sYjYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0MmJiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvYm9hcmQtcWlfbGI2MC5jCkBAIC0wLDAgKzEsNDcxIEBACisvKgorICogbGludXgvYXJjaC9taXBzL2p6NDc0MC9ib2FyZC1xaV9sYjYwLmMKKyAqCisgKiBRSV9MQjYwIGJvYXJkIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUWkgSGFyZHdhcmUgaW5jLiwKKyAqIEF1dGhvcjogWGlhbmdmdSBMaXUgPHhpYW5nZnVAcWktaGFyZHdhcmUuY29tPgorICogQ29weXJpZ2h0IDIwMTAsIExhcnMtUGV0cmVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgbGF0ZXIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvano0NzQwX2ZiLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2p6NDc0MF9tbWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvano0NzQwX25hbmQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9sZWRzX3B3bS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorCitzdGF0aWMgYm9vbCBpc19hdnQyOworCisvKiBHUElPcyAqLworI2RlZmluZSBRSV9MQjYwX0dQSU9fU0RfQ0QJCUpaX0dQSU9fUE9SVEQoMCkKKyNkZWZpbmUgUUlfTEI2MF9HUElPX1NEX1ZDQ19FTl9OCUpaX0dQSU9fUE9SVEQoMikKKworI2RlZmluZSBRSV9MQjYwX0dQSU9fS0VZT1VUKHgpCQkoSlpfR1BJT19QT1JUQygxMCkgKyAoeCkpCisjZGVmaW5lIFFJX0xCNjBfR1BJT19LRVlJTih4KQkJKEpaX0dQSU9fUE9SVEQoMTgpICsgKHgpKQorI2RlZmluZSBRSV9MQjYwX0dQSU9fS0VZSU44CQlKWl9HUElPX1BPUlREKDI2KQorCisvKiBOQU5EICovCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IHFpX2xiNjBfZWNjbGF5b3V0XzFnYiA9IHsKKy8qCS5lY2NieXRlcyA9IDM2LAorCS5lY2Nwb3MgPSB7CisJCTYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywKKwkJMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLAorCQkyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksCisJCTMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywKKwkJMzgsIDM5LCA0MCwgNDEKKwl9LCovCisJLm9vYmZyZWUgPSB7CisJCXsgLm9mZnNldCA9IDIsIC5sZW5ndGggPSA0IH0sCisJCXsgLm9mZnNldCA9IDQyLCAubGVuZ3RoID0gMjIgfQorCX0sCit9OworCisvKiBFYXJseSBwcm90b3R5cGVzIG9mIHRoZSBRSSBMQjYwIGhhZCBvbmx5IDFHQiBvZiBOQU5ELgorICogSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGVzZSBkZXZpY2VzIGFzd2VsbCB0aGUgcGFydGl0aW9uIGFuZCBlY2MgbGF5b3V0IGlzCisgKiBpbml0YWxpemVkIGRlcGVuZGluZyBvbiB0aGUgTkFORCBzaXplICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcWlfbGI2MF9wYXJ0aXRpb25zXzFnYltdID0geworCXsKKwkJLm5hbWUgPSAiTkFORCBCT09UIHBhcnRpdGlvbiIsCisJCS5vZmZzZXQgPSAwICogMHgxMDAwMDAsCisJCS5zaXplID0gNCAqIDB4MTAwMDAwLAorCX0sCisJeworCQkubmFtZSA9ICJOQU5EIEtFUk5FTCBwYXJ0aXRpb24iLAorCQkub2Zmc2V0ID0gNCAqIDB4MTAwMDAwLAorCQkuc2l6ZSA9IDQgKiAweDEwMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTkFORCBST09URlMgcGFydGl0aW9uIiwKKwkJLm9mZnNldCA9IDggKiAweDEwMDAwMCwKKwkJLnNpemUgPSAoNTA0ICsgNTEyKSAqIDB4MTAwMDAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IHFpX2xiNjBfZWNjbGF5b3V0XzJnYiA9IHsKKy8qCS5lY2NieXRlcyA9IDcyLAorCS5lY2Nwb3MgPSB7CisJCTEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwKKwkJMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LAorCQkyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsCisJCTM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywKKwkJNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLAorCQk1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksCisJCTYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywKKwkJNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LAorCQk3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMKKwl9LCovCisJLm9vYmZyZWUgPSB7CisJCXsgLm9mZnNldCA9IDIsIC5sZW5ndGggPSAxMCB9LAorCQl7IC5vZmZzZXQgPSA4NCwgLmxlbmd0aCA9IDQ0IH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBxaV9sYjYwX3BhcnRpdGlvbnNfMmdiW10gPSB7CisJeworCQkubmFtZSA9ICJOQU5EIEJPT1QgcGFydGl0aW9uIiwKKwkJLm9mZnNldCA9IDAgKiAweDEwMDAwMCwKKwkJLnNpemUgPSA0ICogMHgxMDAwMDAsCisJfSwKKwl7CisJCS5uYW1lID0gIk5BTkQgS0VSTkVMIHBhcnRpdGlvbiIsCisJCS5vZmZzZXQgPSA0ICogMHgxMDAwMDAsCisJCS5zaXplID0gNCAqIDB4MTAwMDAwLAorCX0sCisJeworCQkubmFtZSA9ICJOQU5EIFJPT1RGUyBwYXJ0aXRpb24iLAorCQkub2Zmc2V0ID0gOCAqIDB4MTAwMDAwLAorCQkuc2l6ZSA9ICg1MDQgKyA1MTIgKyAxMDI0KSAqIDB4MTAwMDAwLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBxaV9sYjYwX25hbmRfaWRlbnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwYXJ0aXRpb25zLAorCQlpbnQgKm51bV9wYXJ0aXRpb25zKQoreworCWlmIChjaGlwLT5wYWdlX3NoaWZ0ID09IDEyKSB7CisJCWNoaXAtPmVjYy5sYXlvdXQgPSAmcWlfbGI2MF9lY2NsYXlvdXRfMmdiOworCQkqcGFydGl0aW9ucyA9IHFpX2xiNjBfcGFydGl0aW9uc18yZ2I7CisJCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUocWlfbGI2MF9wYXJ0aXRpb25zXzJnYik7CisJfSBlbHNlIHsKKwkJY2hpcC0+ZWNjLmxheW91dCA9ICZxaV9sYjYwX2VjY2xheW91dF8xZ2I7CisJCSpwYXJ0aXRpb25zID0gcWlfbGI2MF9wYXJ0aXRpb25zXzFnYjsKKwkJKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShxaV9sYjYwX3BhcnRpdGlvbnNfMWdiKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QganpfbmFuZF9wbGF0Zm9ybV9kYXRhIHFpX2xiNjBfbmFuZF9wZGF0YSA9IHsKKwkuaWRlbnRfY2FsbGJhY2sgPSBxaV9sYjYwX25hbmRfaWRlbnQsCisJLmJ1c3lfZ3BpbyA9IDk0LAorfTsKKworLyogS2V5Ym9hcmQqLworCisjZGVmaW5lIEtFWV9RSV9RSQlLRVlfRjEzCisjZGVmaW5lIEtFWV9RSV9VUFJFRAlLRVlfUklHSFRBTFQKKyNkZWZpbmUgS0VZX1FJX1ZPTFVQCUtFWV9WT0xVTUVVUAorI2RlZmluZSBLRVlfUUlfVk9MRE9XTglLRVlfVk9MVU1FRE9XTgorI2RlZmluZSBLRVlfUUlfRk4JS0VZX0xFRlRDVFJMCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBxaV9sYjYwX2tleW1hcFtdID0geworCUtFWSgwLCAwLCBLRVlfRjEpLAkvKiBTMiAqLworCUtFWSgwLCAxLCBLRVlfRjIpLAkvKiBTMyAqLworCUtFWSgwLCAyLCBLRVlfRjMpLAkvKiBTNCAqLworCUtFWSgwLCAzLCBLRVlfRjQpLAkvKiBTNSAqLworCUtFWSgwLCA0LCBLRVlfRjUpLAkvKiBTNiAqLworCUtFWSgwLCA1LCBLRVlfRjYpLAkvKiBTNyAqLworCUtFWSgwLCA2LCBLRVlfRjcpLAkvKiBTOCAqLworCisJS0VZKDEsIDAsIEtFWV9RKSwJLyogUzEwICovCisJS0VZKDEsIDEsIEtFWV9XKSwJLyogUzExICovCisJS0VZKDEsIDIsIEtFWV9FKSwJLyogUzEyICovCisJS0VZKDEsIDMsIEtFWV9SKSwJLyogUzEzICovCisJS0VZKDEsIDQsIEtFWV9UKSwJLyogUzE0ICovCisJS0VZKDEsIDUsIEtFWV9ZKSwJLyogUzE1ICovCisJS0VZKDEsIDYsIEtFWV9VKSwJLyogUzE2ICovCisJS0VZKDEsIDcsIEtFWV9JKSwJLyogUzE3ICovCisJS0VZKDIsIDAsIEtFWV9BKSwJLyogUzE4ICovCisJS0VZKDIsIDEsIEtFWV9TKSwJLyogUzE5ICovCisJS0VZKDIsIDIsIEtFWV9EKSwJLyogUzIwICovCisJS0VZKDIsIDMsIEtFWV9GKSwJLyogUzIxICovCisJS0VZKDIsIDQsIEtFWV9HKSwJLyogUzIyICovCisJS0VZKDIsIDUsIEtFWV9IKSwJLyogUzIzICovCisJS0VZKDIsIDYsIEtFWV9KKSwJLyogUzI0ICovCisJS0VZKDIsIDcsIEtFWV9LKSwJLyogUzI1ICovCisJS0VZKDMsIDAsIEtFWV9FU0MpLAkvKiBTMjYgKi8KKwlLRVkoMywgMSwgS0VZX1opLAkvKiBTMjcgKi8KKwlLRVkoMywgMiwgS0VZX1gpLAkvKiBTMjggKi8KKwlLRVkoMywgMywgS0VZX0MpLAkvKiBTMjkgKi8KKwlLRVkoMywgNCwgS0VZX1YpLAkvKiBTMzAgKi8KKwlLRVkoMywgNSwgS0VZX0IpLAkvKiBTMzEgKi8KKwlLRVkoMywgNiwgS0VZX04pLAkvKiBTMzIgKi8KKwlLRVkoMywgNywgS0VZX00pLAkvKiBTMzMgKi8KKwlLRVkoNCwgMCwgS0VZX1RBQiksCS8qIFMzNCAqLworCUtFWSg0LCAxLCBLRVlfQ0FQU0xPQ0spLAkvKiBTMzUgKi8KKwlLRVkoNCwgMiwgS0VZX0JBQ0tTTEFTSCksCS8qIFMzNiAqLworCUtFWSg0LCAzLCBLRVlfQVBPU1RST1BIRSksCS8qIFMzNyAqLworCUtFWSg0LCA0LCBLRVlfQ09NTUEpLAkvKiBTMzggKi8KKwlLRVkoNCwgNSwgS0VZX0RPVCksCS8qIFMzOSAqLworCUtFWSg0LCA2LCBLRVlfU0xBU0gpLAkvKiBTNDAgKi8KKwlLRVkoNCwgNywgS0VZX1VQKSwJLyogUzQxICovCisJS0VZKDUsIDAsIEtFWV9PKSwJLyogUzQyICovCisJS0VZKDUsIDEsIEtFWV9MKSwJLyogUzQzICovCisJS0VZKDUsIDIsIEtFWV9FUVVBTCksCS8qIFM0NCAqLworCUtFWSg1LCAzLCBLRVlfUUlfVVBSRUQpLAkvKiBTNDUgKi8KKwlLRVkoNSwgNCwgS0VZX1NQQUNFKSwJLyogUzQ2ICovCisJS0VZKDUsIDUsIEtFWV9RSV9RSSksCS8qIFM0NyAqLworCUtFWSg1LCA2LCBLRVlfUklHSFRDVFJMKSwJLyogUzQ4ICovCisJS0VZKDUsIDcsIEtFWV9MRUZUKSwJLyogUzQ5ICovCisJS0VZKDYsIDAsIEtFWV9GOCksCS8qIFM1MCAqLworCUtFWSg2LCAxLCBLRVlfUCksCS8qIFM1MSAqLworCUtFWSg2LCAyLCBLRVlfQkFDS1NQQUNFKSwvKiBTNTIgKi8KKwlLRVkoNiwgMywgS0VZX0VOVEVSKSwJLyogUzUzICovCisJS0VZKDYsIDQsIEtFWV9RSV9WT0xVUCksCS8qIFM1NCAqLworCUtFWSg2LCA1LCBLRVlfUUlfVk9MRE9XTiksCS8qIFM1NSAqLworCUtFWSg2LCA2LCBLRVlfRE9XTiksCS8qIFM1NiAqLworCUtFWSg2LCA3LCBLRVlfUklHSFQpLAkvKiBTNTcgKi8KKworCUtFWSg3LCAwLCBLRVlfTEVGVFNISUZUKSwJLyogUzU4ICovCisJS0VZKDcsIDEsIEtFWV9MRUZUQUxUKSwJLyogUzU5ICovCisJS0VZKDcsIDIsIEtFWV9RSV9GTiksCS8qIFM2MCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgcWlfbGI2MF9rZXltYXBfZGF0YSA9IHsKKwkua2V5bWFwCQk9IHFpX2xiNjBfa2V5bWFwLAorCS5rZXltYXBfc2l6ZQk9IEFSUkFZX1NJWkUocWlfbGI2MF9rZXltYXApLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxaV9sYjYwX2tleXBhZF9jb2xzW10gPSB7CisJUUlfTEI2MF9HUElPX0tFWU9VVCgwKSwKKwlRSV9MQjYwX0dQSU9fS0VZT1VUKDEpLAorCVFJX0xCNjBfR1BJT19LRVlPVVQoMiksCisJUUlfTEI2MF9HUElPX0tFWU9VVCgzKSwKKwlRSV9MQjYwX0dQSU9fS0VZT1VUKDQpLAorCVFJX0xCNjBfR1BJT19LRVlPVVQoNSksCisJUUlfTEI2MF9HUElPX0tFWU9VVCg2KSwKKwlRSV9MQjYwX0dQSU9fS0VZT1VUKDcpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxaV9sYjYwX2tleXBhZF9yb3dzW10gPSB7CisJUUlfTEI2MF9HUElPX0tFWUlOKDApLAorCVFJX0xCNjBfR1BJT19LRVlJTigxKSwKKwlRSV9MQjYwX0dQSU9fS0VZSU4oMiksCisJUUlfTEI2MF9HUElPX0tFWUlOKDMpLAorCVFJX0xCNjBfR1BJT19LRVlJTig0KSwKKwlRSV9MQjYwX0dQSU9fS0VZSU4oNSksCisJUUlfTEI2MF9HUElPX0tFWUlOKDcpLAorCVFJX0xCNjBfR1BJT19LRVlJTjgsCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSBxaV9sYjYwX3BkYXRhID0geworCS5rZXltYXBfZGF0YSA9ICZxaV9sYjYwX2tleW1hcF9kYXRhLAorCS5jb2xfZ3Bpb3MJPSBxaV9sYjYwX2tleXBhZF9jb2xzLAorCS5yb3dfZ3Bpb3MJPSBxaV9sYjYwX2tleXBhZF9yb3dzLAorCS5udW1fY29sX2dwaW9zCT0gQVJSQVlfU0laRShxaV9sYjYwX2tleXBhZF9jb2xzKSwKKwkubnVtX3Jvd19ncGlvcwk9IEFSUkFZX1NJWkUocWlfbGI2MF9rZXlwYWRfcm93cyksCisJLmNvbF9zY2FuX2RlbGF5X3VzCT0gMTAsCisJLmRlYm91bmNlX21zCQk9IDEwLAorCS53YWtldXAJCQk9IDEsCisJLmFjdGl2ZV9sb3cJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHFpX2xiNjBfa2V5cGFkID0geworCS5uYW1lCQk9ICJtYXRyaXgta2V5cGFkIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnFpX2xiNjBfcGRhdGEsCisJfSwKK307CisKKy8qIERpc3BsYXkgKi8KK3N0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIHFpX2xiNjBfdmlkZW9fbW9kZXNbXSA9IHsKKwl7CisJCS5uYW1lID0gIjMyMHgyNDAiLAorCQkueHJlcyA9IDMyMCwKKwkJLnlyZXMgPSAyNDAsCisJCS5yZWZyZXNoID0gMzAsCisJCS5sZWZ0X21hcmdpbiA9IDE0MCwKKwkJLnJpZ2h0X21hcmdpbiA9IDI3MywKKwkJLnVwcGVyX21hcmdpbiA9IDIwLAorCQkubG93ZXJfbWFyZ2luID0gMiwKKwkJLmhzeW5jX2xlbiA9IDEsCisJCS52c3luY19sZW4gPSAxLAorCQkuc3luYyA9IDAsCisJCS52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgano0NzQwX2ZiX3BsYXRmb3JtX2RhdGEgcWlfbGI2MF9mYl9wZGF0YSA9IHsKKwkud2lkdGgJCT0gNjAsCisJLmhlaWdodAkJPSA0NSwKKwkubnVtX21vZGVzCT0gQVJSQVlfU0laRShxaV9sYjYwX3ZpZGVvX21vZGVzKSwKKwkubW9kZXMJCT0gcWlfbGI2MF92aWRlb19tb2RlcywKKwkuYnBwCQk9IDI0LAorCS5sY2RfdHlwZQk9IEpaX0xDRF9UWVBFXzhCSVRfU0VSSUFMLAorCS5waXhjbGtfZmFsbGluZ19lZGdlID0gMSwKK307CisKK3N0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIHNwaWdwaW9fcGxhdGZvcm1fZGF0YSA9IHsKKwkuc2NrID0gSlpfR1BJT19QT1JUQygyMyksCisJLm1vc2kgPSBKWl9HUElPX1BPUlRDKDIyKSwKKwkubWlzbyA9IC0xLAorCS5udW1fY2hpcHNlbGVjdCA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzcGlncGlvX2RldmljZSA9IHsKKwkubmFtZSA9ICJzcGlfZ3BpbyIsCisJLmlkICAgPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaWdwaW9fcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBxaV9sYjYwX3NwaV9ib2FyZF9pbmZvW10gPSB7CisJeworCQkubW9kYWxpYXMgPSAiaWxpODk2MCIsCisJCS5jb250cm9sbGVyX2RhdGEgPSAodm9pZCAqKUpaX0dQSU9fUE9SVEMoMjEpLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkuYnVzX251bSA9IDEsCisJCS5tYXhfc3BlZWRfaHogPSAzMCAqIDEwMDAsCisJCS5tb2RlID0gU1BJXzNXSVJFLAorCX0sCit9OworCisvKiBCYXR0ZXJ5ICovCitzdGF0aWMgc3RydWN0IGp6X2JhdHRlcnlfcGxhdGZvcm1fZGF0YSBxaV9sYjYwX2JhdHRlcnlfcGRhdGEgPSB7CisJLmdwaW9fY2hhcmdlID0gIEpaX0dQSU9fUE9SVEMoMjcpLAorCS5ncGlvX2NoYXJnZV9hY3RpdmVfbG93ID0gMSwKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiYmF0dGVyeSIsCisJCS50ZWNobm9sb2d5ID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTElQTywKKwkJLnZvbHRhZ2VfbWF4X2Rlc2lnbiA9IDQyMDAwMDAsCisJCS52b2x0YWdlX21pbl9kZXNpZ24gPSAzNjAwMDAwLAorCX0sCit9OworCisvKiBHUElPIEtleTogcG93ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBxaV9sYjYwX2dwaW9fa2V5c19idXR0b25zW10gPSB7CisJWzBdID0geworCQkuY29kZQkJPSBLRVlfUE9XRVIsCisJCS5ncGlvCQk9IEpaX0dQSU9fUE9SVEQoMjkpLAorCQkuYWN0aXZlX2xvdwk9IDEsCisJCS5kZXNjCQk9ICJQb3dlciIsCisJCS53YWtldXAJCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBxaV9sYjYwX2dwaW9fa2V5c19kYXRhID0geworCS5uYnV0dG9ucyA9IEFSUkFZX1NJWkUocWlfbGI2MF9ncGlvX2tleXNfYnV0dG9ucyksCisJLmJ1dHRvbnMgPSBxaV9sYjYwX2dwaW9fa2V5c19idXR0b25zLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcWlfbGI2MF9ncGlvX2tleXMgPSB7CisJLm5hbWUgPQkiZ3Bpby1rZXlzIiwKKwkuaWQgPQktMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZxaV9sYjYwX2dwaW9fa2V5c19kYXRhLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgano0NzQwX21tY19wbGF0Zm9ybV9kYXRhIHFpX2xiNjBfbW1jX3BkYXRhID0geworCS5ncGlvX2NhcmRfZGV0ZWN0CT0gUUlfTEI2MF9HUElPX1NEX0NELAorCS5ncGlvX3JlYWRfb25seQkJPSAtMSwKKwkuZ3Bpb19wb3dlcgkJPSBRSV9MQjYwX0dQSU9fU0RfVkNDX0VOX04sCisJLnBvd2VyX2FjdGl2ZV9sb3cJPSAxLAorfTsKKworLyogT0hDSSAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGF2dDJfdXNiX3JlZ3VsYXRvcl9jb25zdW1lciA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmJ1cyIsICJqejQ3NDAtb2hjaSIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgYXZ0Ml91c2JfcmVndWxhdG9yX2luaXRfZGF0YSA9IHsKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSAmYXZ0Ml91c2JfcmVndWxhdG9yX2NvbnN1bWVyLAorCS5jb25zdHJhaW50cyA9IHsKKwkJLm5hbWUgPSAiVVNCIHBvd2VyIiwKKwkJLm1pbl91ViA9IDUwMDAwMDAsCisJCS5tYXhfdVYgPSA1MDAwMDAwLAorCQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCwKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgYXZ0Ml91c2JfcmVndWxhdG9yX2RhdGEgPSB7CisJLnN1cHBseV9uYW1lID0gIlVTQiBwb3dlciIsCisJLm1pY3Jvdm9sdHMgPSA1MDAwMDAwLAorCS5ncGlvID0gSlpfR1BJT19QT1JUQigxNyksCisJLmluaXRfZGF0YSA9ICZhdnQyX3VzYl9yZWd1bGF0b3JfaW5pdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXZ0Ml91c2JfcmVndWxhdG9yX2RldmljZSA9IHsKKwkubmFtZSA9ICJyZWctZml4ZWQtdm9sdGFnZSIsCisJLmlkID0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYXZ0Ml91c2JfcmVndWxhdG9yX2RhdGEsCisJfQorfTsKKworLyogYmVlcGVyICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBxaV9sYjYwX3B3bV9iZWVwZXIgPSB7CisJLm5hbWUgPSAicHdtLWJlZXBlciIsCisJLmlkID0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKTQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpqel9wbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmano0NzQwX3VkY19kZXZpY2UsCisJJmp6NDc0MF9tbWNfZGV2aWNlLAorCSZqejQ3NDBfbmFuZF9kZXZpY2UsCisJJnFpX2xiNjBfa2V5cGFkLAorCSZzcGlncGlvX2RldmljZSwKKwkmano0NzQwX2ZyYW1lYnVmZmVyX2RldmljZSwKKwkmano0NzQwX3BjbV9kZXZpY2UsCisJJmp6NDc0MF9pMnNfZGV2aWNlLAorCSZqejQ3NDBfY29kZWNfZGV2aWNlLAorCSZqejQ3NDBfcnRjX2RldmljZSwKKwkmano0NzQwX2FkY19kZXZpY2UsCisJJnFpX2xiNjBfZ3Bpb19rZXlzLAorCSZxaV9sYjYwX3B3bV9iZWVwZXIsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYm9hcmRfZ3Bpb19zZXR1cCh2b2lkKQoreworCS8qIFdlIG9ubHkgbmVlZCB0byBlbmFibGUvZGlzYWJsZSBwdWxsdXAgaGVyZSBmb3IgcGlucyB1c2VkIGluIGdlbmVyaWMKKwkgKiBkcml2ZXJzLiBFdmVyeXRoaW5nIGVsc2UgaXMgZG9uZSBieSB0aGUgZHJpdmVycyB0aGVtc2VsZnMuICovCisJanpfZ3Bpb19kaXNhYmxlX3B1bGx1cChRSV9MQjYwX0dQSU9fU0RfVkNDX0VOX04pOworCWp6X2dwaW9fZGlzYWJsZV9wdWxsdXAoUUlfTEI2MF9HUElPX1NEX0NEKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcWlfbGI2MF9pbml0X3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlqejQ3NDBfZnJhbWVidWZmZXJfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gJnFpX2xiNjBfZmJfcGRhdGE7CisJano0NzQwX25hbmRfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gJnFpX2xiNjBfbmFuZF9wZGF0YTsKKwlqejQ3NDBfYWRjX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9ICZxaV9sYjYwX2JhdHRlcnlfcGRhdGE7CisJano0NzQwX21tY19kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSAmcWlfbGI2MF9tbWNfcGRhdGE7CisKKwlqejQ3NDBfc2VyaWFsX2RldmljZV9yZWdpc3RlcigpOworCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8ocWlfbGI2MF9zcGlfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKHFpX2xiNjBfc3BpX2JvYXJkX2luZm8pKTsKKworCWlmIChpc19hdnQyKSB7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXZ0Ml91c2JfcmVndWxhdG9yX2RldmljZSk7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmano0NzQwX3VzYl9vaGNpX2RldmljZSk7CisJfQorCisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGp6X3BsYXRmb3JtX2RldmljZXMsCisJCQkJCUFSUkFZX1NJWkUoanpfcGxhdGZvcm1fZGV2aWNlcykpOworCit9CisKK3N0cnVjdCBqejQ3NDBfY2xvY2tfYm9hcmRfZGF0YSBqejQ3NDBfY2xvY2tfYmRhdGEgPSB7CisJLmV4dF9yYXRlID0gMTIwMDAwMDAsCisJLnJ0Y19yYXRlID0gMzI3NjgsCit9OworCitzdGF0aWMgX19pbml0IGludCBib2FyZF9hdnQyKGNoYXIgKnN0cikKK3sKKwlxaV9sYjYwX21tY19wZGF0YS5jYXJkX2RldGVjdF9hY3RpdmVfbG93ID0gMTsKKwlpc19hdnQyID0gdHJ1ZTsKKworCXJldHVybiAxOworfQorX19zZXR1cCgiYXZ0MiIsIGJvYXJkX2F2dDIpOworCitzdGF0aWMgaW50IF9faW5pdCBxaV9sYjYwX2JvYXJkX3NldHVwKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiUWkgSGFyZHdhcmUgSlo0NzQwIFFJICVzIHNldHVwXG4iLAorCQlpc19hdnQyID8gIkFWVDIiIDogIkxCNjAiKTsKKworCWJvYXJkX2dwaW9fc2V0dXAoKTsKKworCWlmIChxaV9sYjYwX2luaXRfcGxhdGZvcm1fZGV2aWNlcygpKQorCQlwYW5pYygiRmFpbGVkIHRvIGluaXRhbGl6ZSBwbGF0Zm9ybSBkZXZpY2VzXG4iKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChxaV9sYjYwX2JvYXJkX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvY2xvY2stZGVidWdmcy5jIGIvYXJjaC9taXBzL2p6NDc0MC9jbG9jay1kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwYTBmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvY2xvY2stZGVidWdmcy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBjbG9jayBzdXBwb3J0IGRlYnVnZnMgZW50cmllcworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvY2xvY2suaD4KKyNpbmNsdWRlICJjbG9jay5oIgorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqano0NzQwX2Nsb2NrX2RlYnVnZnM7CisKK3N0YXRpYyBpbnQgano0NzQwX2Nsb2NrX2RlYnVnZnNfc2hvd19lbmFibGVkKHZvaWQgKmRhdGEsIHVpbnQ2NF90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBkYXRhOworCSp2YWx1ZSA9IGNsa19pc19lbmFibGVkKGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqejQ3NDBfY2xvY2tfZGVidWdmc19zZXRfZW5hYmxlZCh2b2lkICpkYXRhLCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBkYXRhOworCisJaWYgKHZhbHVlKQorCQlyZXR1cm4gY2xrX2VuYWJsZShjbGspOworCWVsc2UKKwkJY2xrX2Rpc2FibGUoY2xrKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShqejQ3NDBfY2xvY2tfZGVidWdmc19vcHNfZW5hYmxlZCwKKwlqejQ3NDBfY2xvY2tfZGVidWdmc19zaG93X2VuYWJsZWQsCisJano0NzQwX2Nsb2NrX2RlYnVnZnNfc2V0X2VuYWJsZWQsCisJIiVsbHVcbiIpOworCitzdGF0aWMgaW50IGp6NDc0MF9jbG9ja19kZWJ1Z2ZzX3Nob3dfcmF0ZSh2b2lkICpkYXRhLCB1aW50NjRfdCAqdmFsdWUpCit7CisJc3RydWN0IGNsayAqY2xrID0gZGF0YTsKKwkqdmFsdWUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShqejQ3NDBfY2xvY2tfZGVidWdmc19vcHNfcmF0ZSwKKwlqejQ3NDBfY2xvY2tfZGVidWdmc19zaG93X3JhdGUsCisJTlVMTCwKKwkiJWxsdVxuIik7CisKK3ZvaWQgano0NzQwX2Nsb2NrX2RlYnVnZnNfYWRkX2NsayhzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKCFqejQ3NDBfY2xvY2tfZGVidWdmcykKKwkJcmV0dXJuOworCisJY2xrLT5kZWJ1Z2ZzX2VudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKGNsay0+bmFtZSwgano0NzQwX2Nsb2NrX2RlYnVnZnMpOworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJhdGUiLCBTX0lXVUdPIHwgU19JUlVHTywgY2xrLT5kZWJ1Z2ZzX2VudHJ5LCBjbGssCisJCQkJJmp6NDc0MF9jbG9ja19kZWJ1Z2ZzX29wc19yYXRlKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJlbmFibGVkIiwgU19JUlVHTywgY2xrLT5kZWJ1Z2ZzX2VudHJ5LCBjbGssCisJCQkJJmp6NDc0MF9jbG9ja19kZWJ1Z2ZzX29wc19lbmFibGVkKTsKKworCWlmIChjbGstPnBhcmVudCkgeworCQljaGFyIHBhcmVudF9wYXRoWzEwMF07CisJCXNucHJpbnRmKHBhcmVudF9wYXRoLCAxMDAsICIuLi8lcyIsIGNsay0+cGFyZW50LT5uYW1lKTsKKwkJY2xrLT5kZWJ1Z2ZzX3BhcmVudF9lbnRyeSA9IGRlYnVnZnNfY3JlYXRlX3N5bWxpbmsoInBhcmVudCIsCisJCQkJCQljbGstPmRlYnVnZnNfZW50cnksCisJCQkJCQlwYXJlbnRfcGF0aCk7CisJfQorfQorCisvKiBUT0RPOiBMb2NraW5nICovCit2b2lkIGp6NDc0MF9jbG9ja19kZWJ1Z2ZzX3VwZGF0ZV9wYXJlbnQoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGstPmRlYnVnZnNfcGFyZW50X2VudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShjbGstPmRlYnVnZnNfcGFyZW50X2VudHJ5KTsKKworCWlmIChjbGstPnBhcmVudCkgeworCQljaGFyIHBhcmVudF9wYXRoWzEwMF07CisJCXNucHJpbnRmKHBhcmVudF9wYXRoLCAxMDAsICIuLi8lcyIsIGNsay0+cGFyZW50LT5uYW1lKTsKKwkJY2xrLT5kZWJ1Z2ZzX3BhcmVudF9lbnRyeSA9IGRlYnVnZnNfY3JlYXRlX3N5bWxpbmsoInBhcmVudCIsCisJCQkJCQljbGstPmRlYnVnZnNfZW50cnksCisJCQkJCQlwYXJlbnRfcGF0aCk7CisJfSBlbHNlIHsKKwkJY2xrLT5kZWJ1Z2ZzX3BhcmVudF9lbnRyeSA9IE5VTEw7CisJfQorfQorCit2b2lkIGp6NDc0MF9jbG9ja19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlqejQ3NDBfY2xvY2tfZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2Rpcigiano0NzQwLWNsb2NrIiwgTlVMTCk7CisJaWYgKElTX0VSUihqejQ3NDBfY2xvY2tfZGVidWdmcykpCisJCWp6NDc0MF9jbG9ja19kZWJ1Z2ZzID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvY2xvY2suYyBiL2FyY2gvbWlwcy9qejQ3NDAvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThhOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2p6NDc0MC9jbG9jay5jCkBAIC0wLDAgKzEsOTI0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBjbG9jayBzdXBwb3J0CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9iYXNlLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorCisjZGVmaW5lIEpaX1JFR19DTE9DS19DVFJMCTB4MDAKKyNkZWZpbmUgSlpfUkVHX0NMT0NLX0xPV19QT1dFUgkweDA0CisjZGVmaW5lIEpaX1JFR19DTE9DS19QTEwJMHgxMAorI2RlZmluZSBKWl9SRUdfQ0xPQ0tfR0FURQkweDIwCisjZGVmaW5lIEpaX1JFR19DTE9DS19TTEVFUF9DVFJMCTB4MjQKKyNkZWZpbmUgSlpfUkVHX0NMT0NLX0kyUwkweDYwCisjZGVmaW5lIEpaX1JFR19DTE9DS19MQ0QJMHg2NAorI2RlZmluZSBKWl9SRUdfQ0xPQ0tfTU1DCTB4NjgKKyNkZWZpbmUgSlpfUkVHX0NMT0NLX1VIQwkweDZDCisjZGVmaW5lIEpaX1JFR19DTE9DS19TUEkJMHg3NAorCisjZGVmaW5lIEpaX0NMT0NLX0NUUkxfSTJTX1NSQ19QTEwJQklUKDMxKQorI2RlZmluZSBKWl9DTE9DS19DVFJMX0tPX0VOQUJMRQkJQklUKDMwKQorI2RlZmluZSBKWl9DTE9DS19DVFJMX1VEQ19TUkNfUExMCUJJVCgyOSkKKyNkZWZpbmUgSlpfQ0xPQ0tfQ1RSTF9VRElWX01BU0sJCTB4MWY4MDAwMDAKKyNkZWZpbmUgSlpfQ0xPQ0tfQ1RSTF9DSEFOR0VfRU5BQkxFCUJJVCgyMikKKyNkZWZpbmUgSlpfQ0xPQ0tfQ1RSTF9QTExfSEFMRgkJQklUKDIxKQorI2RlZmluZSBKWl9DTE9DS19DVFJMX0xESVZfTUFTSwkJMHgwMDFmMDAwMAorI2RlZmluZSBKWl9DTE9DS19DVFJMX1VESVZfT0ZGU0VUCTIzCisjZGVmaW5lIEpaX0NMT0NLX0NUUkxfTERJVl9PRkZTRVQJMTYKKyNkZWZpbmUgSlpfQ0xPQ0tfQ1RSTF9NRElWX09GRlNFVAkxMgorI2RlZmluZSBKWl9DTE9DS19DVFJMX1BESVZfT0ZGU0VUCSA4CisjZGVmaW5lIEpaX0NMT0NLX0NUUkxfSERJVl9PRkZTRVQJIDQKKyNkZWZpbmUgSlpfQ0xPQ0tfQ1RSTF9DRElWX09GRlNFVAkgMAorCisjZGVmaW5lIEpaX0NMT0NLX0dBVEVfVUFSVDAJQklUKDApCisjZGVmaW5lIEpaX0NMT0NLX0dBVEVfVENVCUJJVCgxKQorI2RlZmluZSBKWl9DTE9DS19HQVRFX1JUQwlCSVQoMikKKyNkZWZpbmUgSlpfQ0xPQ0tfR0FURV9JMkMJQklUKDMpCisjZGVmaW5lIEpaX0NMT0NLX0dBVEVfU1BJCUJJVCg0KQorI2RlZmluZSBKWl9DTE9DS19HQVRFX0FJQwlCSVQoNSkKKyNkZWZpbmUgSlpfQ0xPQ0tfR0FURV9JMlMJQklUKDYpCisjZGVmaW5lIEpaX0NMT0NLX0dBVEVfTU1DCUJJVCg3KQorI2RlZmluZSBKWl9DTE9DS19HQVRFX0FEQwlCSVQoOCkKKyNkZWZpbmUgSlpfQ0xPQ0tfR0FURV9DSU0JQklUKDkpCisjZGVmaW5lIEpaX0NMT0NLX0dBVEVfTENECUJJVCgxMCkKKyNkZWZpbmUgSlpfQ0xPQ0tfR0FURV9VREMJQklUKDExKQorI2RlZmluZSBKWl9DTE9DS19HQVRFX0RNQUMJQklUKDEyKQorI2RlZmluZSBKWl9DTE9DS19HQVRFX0lQVQlCSVQoMTMpCisjZGVmaW5lIEpaX0NMT0NLX0dBVEVfVUhDCUJJVCgxNCkKKyNkZWZpbmUgSlpfQ0xPQ0tfR0FURV9VQVJUMQlCSVQoMTUpCisKKyNkZWZpbmUgSlpfQ0xPQ0tfSTJTX0RJVl9NQVNLCQkweDAxZmYKKworI2RlZmluZSBKWl9DTE9DS19MQ0RfRElWX01BU0sJCTB4MDFmZgorCisjZGVmaW5lIEpaX0NMT0NLX01NQ19ESVZfTUFTSwkJMHgwMDFmCisKKyNkZWZpbmUgSlpfQ0xPQ0tfVUhDX0RJVl9NQVNLCQkweDAwMGYKKworI2RlZmluZSBKWl9DTE9DS19TUElfU1JDX1BMTAkJQklUKDMxKQorI2RlZmluZSBKWl9DTE9DS19TUElfRElWX01BU0sJCTB4MDAwZgorCisjZGVmaW5lIEpaX0NMT0NLX1BMTF9NX01BU0sJCTB4MDFmZgorI2RlZmluZSBKWl9DTE9DS19QTExfTl9NQVNLCQkweDAwMWYKKyNkZWZpbmUgSlpfQ0xPQ0tfUExMX09EX01BU0sJCTB4MDAwMworI2RlZmluZSBKWl9DTE9DS19QTExfU1RBQkxFCQlCSVQoMTApCisjZGVmaW5lIEpaX0NMT0NLX1BMTF9CWVBBU1MJCUJJVCg5KQorI2RlZmluZSBKWl9DTE9DS19QTExfRU5BQkxFRAkJQklUKDgpCisjZGVmaW5lIEpaX0NMT0NLX1BMTF9TVEFCTElaRV9NQVNLCTB4MDAwZgorI2RlZmluZSBKWl9DTE9DS19QTExfTV9PRkZTRVQJCTIzCisjZGVmaW5lIEpaX0NMT0NLX1BMTF9OX09GRlNFVAkJMTgKKyNkZWZpbmUgSlpfQ0xPQ0tfUExMX09EX09GRlNFVAkJMTYKKworI2RlZmluZSBKWl9DTE9DS19MT1dfUE9XRVJfTU9ERV9ET1pFIEJJVCgyKQorI2RlZmluZSBKWl9DTE9DS19MT1dfUE9XRVJfTU9ERV9TTEVFUCBCSVQoMCkKKworI2RlZmluZSBKWl9DTE9DS19TTEVFUF9DVFJMX1NVU1BFTkRfVUhDIEJJVCg3KQorI2RlZmluZSBKWl9DTE9DS19TTEVFUF9DVFJMX0VOQUJMRV9VREMgQklUKDYpCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmp6X2Nsb2NrX2Jhc2U7CitzdGF0aWMgc3BpbmxvY2tfdCBqel9jbG9ja19sb2NrOworc3RhdGljIExJU1RfSEVBRChqel9jbG9ja3MpOworCitzdHJ1Y3QgbWFpbl9jbGsgeworCXN0cnVjdCBjbGsgY2xrOworCXVpbnQzMl90IGRpdl9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgZGl2aWRlZF9jbGsgeworCXN0cnVjdCBjbGsgY2xrOworCXVpbnQzMl90IHJlZzsKKwl1aW50MzJfdCBtYXNrOworfTsKKworc3RydWN0IHN0YXRpY19jbGsgeworCXN0cnVjdCBjbGsgY2xrOworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKK307CisKK3N0YXRpYyB1aW50MzJfdCBqel9jbGtfcmVnX3JlYWQoaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoanpfY2xvY2tfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGp6X2Nsa19yZWdfd3JpdGVfbWFzayhpbnQgcmVnLCB1aW50MzJfdCB2YWwsIHVpbnQzMl90IG1hc2spCit7CisJdWludDMyX3QgdmFsMjsKKworCXNwaW5fbG9jaygmanpfY2xvY2tfbG9jayk7CisJdmFsMiA9IHJlYWRsKGp6X2Nsb2NrX2Jhc2UgKyByZWcpOworCXZhbDIgJj0gfm1hc2s7CisJdmFsMiB8PSB2YWw7CisJd3JpdGVsKHZhbDIsIGp6X2Nsb2NrX2Jhc2UgKyByZWcpOworCXNwaW5fdW5sb2NrKCZqel9jbG9ja19sb2NrKTsKK30KKworc3RhdGljIHZvaWQganpfY2xrX3JlZ19zZXRfYml0cyhpbnQgcmVnLCB1aW50MzJfdCBtYXNrKQoreworCXVpbnQzMl90IHZhbDsKKworCXNwaW5fbG9jaygmanpfY2xvY2tfbG9jayk7CisJdmFsID0gcmVhZGwoanpfY2xvY2tfYmFzZSArIHJlZyk7CisJdmFsIHw9IG1hc2s7CisJd3JpdGVsKHZhbCwganpfY2xvY2tfYmFzZSArIHJlZyk7CisJc3Bpbl91bmxvY2soJmp6X2Nsb2NrX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBqel9jbGtfcmVnX2NsZWFyX2JpdHMoaW50IHJlZywgdWludDMyX3QgbWFzaykKK3sKKwl1aW50MzJfdCB2YWw7CisKKwlzcGluX2xvY2soJmp6X2Nsb2NrX2xvY2spOworCXZhbCA9IHJlYWRsKGp6X2Nsb2NrX2Jhc2UgKyByZWcpOworCXZhbCAmPSB+bWFzazsKKwl3cml0ZWwodmFsLCBqel9jbG9ja19iYXNlICsgcmVnKTsKKwlzcGluX3VubG9jaygmanpfY2xvY2tfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQganpfY2xrX2VuYWJsZV9nYXRpbmcoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGstPmdhdGVfYml0ID09IEpaNDc0MF9DTEtfTk9UX0dBVEVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWp6X2Nsa19yZWdfY2xlYXJfYml0cyhKWl9SRUdfQ0xPQ0tfR0FURSwgY2xrLT5nYXRlX2JpdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQganpfY2xrX2Rpc2FibGVfZ2F0aW5nKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoY2xrLT5nYXRlX2JpdCA9PSBKWjQ3NDBfQ0xLX05PVF9HQVRFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqel9jbGtfcmVnX3NldF9iaXRzKEpaX1JFR19DTE9DS19HQVRFLCBjbGstPmdhdGVfYml0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9jbGtfaXNfZW5hYmxlZF9nYXRpbmcoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGstPmdhdGVfYml0ID09IEpaNDc0MF9DTEtfTk9UX0dBVEVEKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAhKGp6X2Nsa19yZWdfcmVhZChKWl9SRUdfQ0xPQ0tfR0FURSkgJiBjbGstPmdhdGVfYml0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcganpfY2xrX3N0YXRpY19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuICgoc3RydWN0IHN0YXRpY19jbGsgKiljbGspLT5yYXRlOworfQorCitzdGF0aWMgaW50IGp6X2Nsa19rb19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCWp6X2Nsa19yZWdfc2V0X2JpdHMoSlpfUkVHX0NMT0NLX0NUUkwsIEpaX0NMT0NLX0NUUkxfS09fRU5BQkxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9jbGtfa29fZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJanpfY2xrX3JlZ19jbGVhcl9iaXRzKEpaX1JFR19DTE9DS19DVFJMLCBKWl9DTE9DS19DVFJMX0tPX0VOQUJMRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQganpfY2xrX2tvX2lzX2VuYWJsZWQoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAhIShqel9jbGtfcmVnX3JlYWQoSlpfUkVHX0NMT0NLX0NUUkwpICYgSlpfQ0xPQ0tfQ1RSTF9LT19FTkFCTEUpOworfQorCitzdGF0aWMgY29uc3QgaW50IHBsbG5vW10gPSB7MSwgMiwgMiwgNH07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGp6X2Nsa19wbGxfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXVpbnQzMl90IHZhbDsKKwlpbnQgbTsKKwlpbnQgbjsKKwlpbnQgb2Q7CisKKwl2YWwgPSBqel9jbGtfcmVnX3JlYWQoSlpfUkVHX0NMT0NLX1BMTCk7CisKKwlpZiAodmFsICYgSlpfQ0xPQ0tfUExMX0JZUEFTUykKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwltID0gKCh2YWwgPj4gMjMpICYgMHgxZmYpICsgMjsKKwluID0gKCh2YWwgPj4gMTgpICYgMHgxZikgKyAyOworCW9kID0gKHZhbCA+PiAxNikgJiAweDM7CisKKwlyZXR1cm4gKChjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gbikgKiBtKSAvIHBsbG5vW29kXTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcganpfY2xrX3BsbF9oYWxmX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1aW50MzJfdCByZWc7CisKKwlyZWcgPSBqel9jbGtfcmVnX3JlYWQoSlpfUkVHX0NMT0NLX0NUUkwpOworCWlmIChyZWcgJiBKWl9DTE9DS19DVFJMX1BMTF9IQUxGKQorCQlyZXR1cm4ganpfY2xrX3BsbF9nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJcmV0dXJuIGp6X2Nsa19wbGxfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpID4+IDE7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQganpfY2xrX21haW5fZGl2c1tdID0gezEsIDIsIDMsIDQsIDYsIDgsIDEyLCAxNiwgMjQsIDMyfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcganpfY2xrX21haW5fcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0ganpfY2xrX3BsbF9nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJaW50IGRpdjsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKwlpZiAoZGl2ID4gMzIpCisJCXJldHVybiBwYXJlbnRfcmF0ZSAvIDMyOworCWVsc2UgaWYgKGRpdiA8IDEpCisJCXJldHVybiBwYXJlbnRfcmF0ZTsKKworCWRpdiAmPSAoMHgzIDw8IChmZnMoZGl2KSAtIDEpKTsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAvIGRpdjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcganpfY2xrX21haW5fZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBtYWluX2NsayAqbWNsayA9IChzdHJ1Y3QgbWFpbl9jbGsgKiljbGs7CisJdWludDMyX3QgZGl2OworCisJZGl2ID0ganpfY2xrX3JlZ19yZWFkKEpaX1JFR19DTE9DS19DVFJMKTsKKworCWRpdiA+Pj0gbWNsay0+ZGl2X29mZnNldDsKKwlkaXYgJj0gMHhmOworCisJaWYgKGRpdiA+PSBBUlJBWV9TSVpFKGp6X2Nsa19tYWluX2RpdnMpKQorCQlkaXYgPSBBUlJBWV9TSVpFKGp6X2Nsa19tYWluX2RpdnMpIC0gMTsKKworCXJldHVybiBqel9jbGtfcGxsX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIGp6X2Nsa19tYWluX2RpdnNbZGl2XTsKK30KKworc3RhdGljIGludCBqel9jbGtfbWFpbl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlzdHJ1Y3QgbWFpbl9jbGsgKm1jbGsgPSAoc3RydWN0IG1haW5fY2xrICopY2xrOworCWludCBpOworCWludCBkaXY7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IGp6X2Nsa19wbGxfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJcmF0ZSA9IGp6X2Nsa19tYWluX3JvdW5kX3JhdGUoY2xrLCByYXRlKTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKworCWkgPSAoZmZzKGRpdikgLSAxKSA8PCAxOworCWlmIChpID4gMCAmJiAhKGRpdiAmIEJJVChpLTEpKSkKKwkJaSAtPSAxOworCisJanpfY2xrX3JlZ193cml0ZV9tYXNrKEpaX1JFR19DTE9DS19DVFJMLCBpIDw8IG1jbGstPmRpdl9vZmZzZXQsCisJCQkJMHhmIDw8IG1jbGstPmRpdl9vZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBqel9jbGtfc3RhdGljX29wcyA9IHsKKwkuZ2V0X3JhdGUgPSBqel9jbGtfc3RhdGljX2dldF9yYXRlLAorCS5lbmFibGUgPSBqel9jbGtfZW5hYmxlX2dhdGluZywKKwkuZGlzYWJsZSA9IGp6X2Nsa19kaXNhYmxlX2dhdGluZywKKwkuaXNfZW5hYmxlZCA9IGp6X2Nsa19pc19lbmFibGVkX2dhdGluZywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhdGljX2NsayBqel9jbGtfZXh0ID0geworCS5jbGsgPSB7CisJCS5uYW1lID0gImV4dCIsCisJCS5nYXRlX2JpdCA9IEpaNDc0MF9DTEtfTk9UX0dBVEVELAorCQkub3BzID0gJmp6X2Nsa19zdGF0aWNfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMganpfY2xrX3BsbF9vcHMgPSB7CisJLmdldF9yYXRlID0ganpfY2xrX3BsbF9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGp6X2Nsa19wbGwgPSB7CisJLm5hbWUgPSAicGxsIiwKKwkucGFyZW50ID0gJmp6X2Nsa19leHQuY2xrLAorCS5vcHMgPSAmanpfY2xrX3BsbF9vcHMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMganpfY2xrX3BsbF9oYWxmX29wcyA9IHsKKwkuZ2V0X3JhdGUgPSBqel9jbGtfcGxsX2hhbGZfZ2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBqel9jbGtfcGxsX2hhbGYgPSB7CisJLm5hbWUgPSAicGxsIGhhbGYiLAorCS5wYXJlbnQgPSAmanpfY2xrX3BsbCwKKwkub3BzID0gJmp6X2Nsa19wbGxfaGFsZl9vcHMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMganpfY2xrX21haW5fb3BzID0geworCS5nZXRfcmF0ZSA9IGp6X2Nsa19tYWluX2dldF9yYXRlLAorCS5zZXRfcmF0ZSA9IGp6X2Nsa19tYWluX3NldF9yYXRlLAorCS5yb3VuZF9yYXRlID0ganpfY2xrX21haW5fcm91bmRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFpbl9jbGsganpfY2xrX2NwdSA9IHsKKwkuY2xrID0geworCQkubmFtZSA9ICJjY2xrIiwKKwkJLnBhcmVudCA9ICZqel9jbGtfcGxsLAorCQkub3BzID0gJmp6X2Nsa19tYWluX29wcywKKwl9LAorCS5kaXZfb2Zmc2V0ID0gSlpfQ0xPQ0tfQ1RSTF9DRElWX09GRlNFVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFpbl9jbGsganpfY2xrX21lbW9yeSA9IHsKKwkuY2xrID0geworCQkubmFtZSA9ICJtY2xrIiwKKwkJLnBhcmVudCA9ICZqel9jbGtfcGxsLAorCQkub3BzID0gJmp6X2Nsa19tYWluX29wcywKKwl9LAorCS5kaXZfb2Zmc2V0ID0gSlpfQ0xPQ0tfQ1RSTF9NRElWX09GRlNFVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFpbl9jbGsganpfY2xrX2hpZ2hfc3BlZWRfcGVyaXBoZXJhbCA9IHsKKwkuY2xrID0geworCQkubmFtZSA9ICJoY2xrIiwKKwkJLnBhcmVudCA9ICZqel9jbGtfcGxsLAorCQkub3BzID0gJmp6X2Nsa19tYWluX29wcywKKwl9LAorCS5kaXZfb2Zmc2V0ID0gSlpfQ0xPQ0tfQ1RSTF9IRElWX09GRlNFVCwKK307CisKKworc3RhdGljIHN0cnVjdCBtYWluX2NsayBqel9jbGtfbG93X3NwZWVkX3BlcmlwaGVyYWwgPSB7CisJLmNsayA9IHsKKwkJLm5hbWUgPSAicGNsayIsCisJCS5wYXJlbnQgPSAmanpfY2xrX3BsbCwKKwkJLm9wcyA9ICZqel9jbGtfbWFpbl9vcHMsCisJfSwKKwkuZGl2X29mZnNldCA9IEpaX0NMT0NLX0NUUkxfUERJVl9PRkZTRVQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMganpfY2xrX2tvX29wcyA9IHsKKwkuZW5hYmxlID0ganpfY2xrX2tvX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGp6X2Nsa19rb19kaXNhYmxlLAorCS5pc19lbmFibGVkID0ganpfY2xrX2tvX2lzX2VuYWJsZWQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBqel9jbGtfa28gPSB7CisJLm5hbWUgPSAiY2tvIiwKKwkucGFyZW50ID0gJmp6X2Nsa19tZW1vcnkuY2xrLAorCS5vcHMgPSAmanpfY2xrX2tvX29wcywKK307CisKK3N0YXRpYyBpbnQganpfY2xrX3NwaV9zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCWlmIChwYXJlbnQgPT0gJmp6X2Nsa19wbGwpCisJCWp6X2Nsa19yZWdfc2V0X2JpdHMoSlpfQ0xPQ0tfU1BJX1NSQ19QTEwsIEpaX1JFR19DTE9DS19TUEkpOworCWVsc2UgaWYgKHBhcmVudCA9PSAmanpfY2xrX2V4dC5jbGspCisJCWp6X2Nsa19yZWdfY2xlYXJfYml0cyhKWl9DTE9DS19TUElfU1JDX1BMTCwgSlpfUkVHX0NMT0NLX1NQSSk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsay0+cGFyZW50ID0gcGFyZW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQganpfY2xrX2kyc19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCWlmIChwYXJlbnQgPT0gJmp6X2Nsa19wbGxfaGFsZikKKwkJanpfY2xrX3JlZ19zZXRfYml0cyhKWl9SRUdfQ0xPQ0tfQ1RSTCwgSlpfQ0xPQ0tfQ1RSTF9JMlNfU1JDX1BMTCk7CisJZWxzZSBpZiAocGFyZW50ID09ICZqel9jbGtfZXh0LmNsaykKKwkJanpfY2xrX3JlZ19jbGVhcl9iaXRzKEpaX1JFR19DTE9DS19DVFJMLCBKWl9DTE9DS19DVFJMX0kyU19TUkNfUExMKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9jbGtfdWRjX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJanpfY2xrX3JlZ19zZXRfYml0cyhKWl9SRUdfQ0xPQ0tfU0xFRVBfQ1RSTCwKKwkJCUpaX0NMT0NLX1NMRUVQX0NUUkxfRU5BQkxFX1VEQyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9jbGtfdWRjX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCWp6X2Nsa19yZWdfY2xlYXJfYml0cyhKWl9SRUdfQ0xPQ0tfU0xFRVBfQ1RSTCwKKwkJCUpaX0NMT0NLX1NMRUVQX0NUUkxfRU5BQkxFX1VEQyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9jbGtfdWRjX2lzX2VuYWJsZWQoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAhIShqel9jbGtfcmVnX3JlYWQoSlpfUkVHX0NMT0NLX1NMRUVQX0NUUkwpICYKKwkJCUpaX0NMT0NLX1NMRUVQX0NUUkxfRU5BQkxFX1VEQyk7Cit9CisKK3N0YXRpYyBpbnQganpfY2xrX3VkY19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCWlmIChwYXJlbnQgPT0gJmp6X2Nsa19wbGxfaGFsZikKKwkJanpfY2xrX3JlZ19zZXRfYml0cyhKWl9SRUdfQ0xPQ0tfQ1RSTCwgSlpfQ0xPQ0tfQ1RSTF9VRENfU1JDX1BMTCk7CisJZWxzZSBpZiAocGFyZW50ID09ICZqel9jbGtfZXh0LmNsaykKKwkJanpfY2xrX3JlZ19jbGVhcl9iaXRzKEpaX1JFR19DTE9DS19DVFJMLCBKWl9DTE9DS19DVFJMX1VEQ19TUkNfUExMKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9jbGtfdWRjX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCBkaXY7CisKKwlpZiAoY2xrLT5wYXJlbnQgPT0gJmp6X2Nsa19leHQuY2xrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpdiA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyByYXRlIC0gMTsKKworCWlmIChkaXYgPCAwKQorCQlkaXYgPSAwOworCWVsc2UgaWYgKGRpdiA+IDYzKQorCQlkaXYgPSA2MzsKKworCWp6X2Nsa19yZWdfd3JpdGVfbWFzayhKWl9SRUdfQ0xPQ0tfQ1RSTCwgZGl2IDw8IEpaX0NMT0NLX0NUUkxfVURJVl9PRkZTRVQsCisJCQkJSlpfQ0xPQ0tfQ1RSTF9VRElWX01BU0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBqel9jbGtfdWRjX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZGl2OworCisJaWYgKGNsay0+cGFyZW50ID09ICZqel9jbGtfZXh0LmNsaykKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlkaXYgPSAoanpfY2xrX3JlZ19yZWFkKEpaX1JFR19DTE9DS19DVFJMKSAmIEpaX0NMT0NLX0NUUkxfVURJVl9NQVNLKTsKKwlkaXYgPj49IEpaX0NMT0NLX0NUUkxfVURJVl9PRkZTRVQ7CisJZGl2ICs9IDE7CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIGRpdjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcganpfY2xrX2RpdmlkZWRfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBkaXZpZGVkX2NsayAqZGNsayA9IChzdHJ1Y3QgZGl2aWRlZF9jbGsgKiljbGs7CisJaW50IGRpdjsKKworCWlmIChjbGstPnBhcmVudCA9PSAmanpfY2xrX2V4dC5jbGspCisJCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gKGp6X2Nsa19yZWdfcmVhZChkY2xrLT5yZWcpICYgZGNsay0+bWFzaykgKyAxOworCisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyBkaXY7Cit9CisKK3N0YXRpYyBpbnQganpfY2xrX2RpdmlkZWRfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJc3RydWN0IGRpdmlkZWRfY2xrICpkY2xrID0gKHN0cnVjdCBkaXZpZGVkX2NsayAqKWNsazsKKwlpbnQgZGl2OworCisJaWYgKGNsay0+cGFyZW50ID09ICZqel9jbGtfZXh0LmNsaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gcmF0ZSAtIDE7CisKKwlpZiAoZGl2IDwgMCkKKwkJZGl2ID0gMDsKKwllbHNlIGlmIChkaXYgPiBkY2xrLT5tYXNrKQorCQlkaXYgPSBkY2xrLT5tYXNrOworCisJanpfY2xrX3JlZ193cml0ZV9tYXNrKGRjbGstPnJlZywgZGl2LCBkY2xrLT5tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBqel9jbGtfbGRjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpbnQgZGl2OworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBqel9jbGtfcGxsX2hhbGZfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJaWYgKHJhdGUgPiAxNTAwMDAwMDApCisJCXJldHVybiAxNTAwMDAwMDA7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisJaWYgKGRpdiA8IDEpCisJCWRpdiA9IDE7CisJZWxzZSBpZiAoZGl2ID4gMzIpCisJCWRpdiA9IDMyOworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gZGl2OworfQorCitzdGF0aWMgaW50IGp6X2Nsa19sZGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpbnQgZGl2OworCisJaWYgKHJhdGUgPiAxNTAwMDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2ID0ganpfY2xrX3BsbF9oYWxmX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIHJhdGUgLSAxOworCWlmIChkaXYgPCAwKQorCQlkaXYgPSAwOworCWVsc2UgaWYgKGRpdiA+IDMxKQorCQlkaXYgPSAzMTsKKworCWp6X2Nsa19yZWdfd3JpdGVfbWFzayhKWl9SRUdfQ0xPQ0tfQ1RSTCwgZGl2IDw8IEpaX0NMT0NLX0NUUkxfTERJVl9PRkZTRVQsCisJCQkJSlpfQ0xPQ0tfQ1RSTF9MRElWX01BU0spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGp6X2Nsa19sZGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGRpdjsKKworCWRpdiA9IGp6X2Nsa19yZWdfcmVhZChKWl9SRUdfQ0xPQ0tfQ1RSTCkgJiBKWl9DTE9DS19DVFJMX0xESVZfTUFTSzsKKwlkaXYgPj49IEpaX0NMT0NLX0NUUkxfTERJVl9PRkZTRVQ7CisKKwlyZXR1cm4ganpfY2xrX3BsbF9oYWxmX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIChkaXYgKyAxKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGp6X2Nsa19vcHNfbGQgPSB7CisJLnNldF9yYXRlID0ganpfY2xrX2xkY2xrX3NldF9yYXRlLAorCS5nZXRfcmF0ZSA9IGp6X2Nsa19sZGNsa19nZXRfcmF0ZSwKKwkucm91bmRfcmF0ZSA9IGp6X2Nsa19sZGNsa19yb3VuZF9yYXRlLAorCS5lbmFibGUgPSBqel9jbGtfZW5hYmxlX2dhdGluZywKKwkuZGlzYWJsZSA9IGp6X2Nsa19kaXNhYmxlX2dhdGluZywKKwkuaXNfZW5hYmxlZCA9IGp6X2Nsa19pc19lbmFibGVkX2dhdGluZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGp6X2Nsa19sZCA9IHsKKwkubmFtZSA9ICJsY2QiLAorCS5nYXRlX2JpdCA9IEpaX0NMT0NLX0dBVEVfTENELAorCS5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmLAorCS5vcHMgPSAmanpfY2xrX29wc19sZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBqel9jbGtfaTJzX29wcyA9IHsKKwkuc2V0X3JhdGUgPSBqel9jbGtfZGl2aWRlZF9zZXRfcmF0ZSwKKwkuZ2V0X3JhdGUgPSBqel9jbGtfZGl2aWRlZF9nZXRfcmF0ZSwKKwkuZW5hYmxlID0ganpfY2xrX2VuYWJsZV9nYXRpbmcsCisJLmRpc2FibGUgPSBqel9jbGtfZGlzYWJsZV9nYXRpbmcsCisJLmlzX2VuYWJsZWQgPSBqel9jbGtfaXNfZW5hYmxlZF9nYXRpbmcsCisJLnNldF9wYXJlbnQgPSBqel9jbGtfaTJzX3NldF9wYXJlbnQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMganpfY2xrX3NwaV9vcHMgPSB7CisJLnNldF9yYXRlID0ganpfY2xrX2RpdmlkZWRfc2V0X3JhdGUsCisJLmdldF9yYXRlID0ganpfY2xrX2RpdmlkZWRfZ2V0X3JhdGUsCisJLmVuYWJsZSA9IGp6X2Nsa19lbmFibGVfZ2F0aW5nLAorCS5kaXNhYmxlID0ganpfY2xrX2Rpc2FibGVfZ2F0aW5nLAorCS5pc19lbmFibGVkID0ganpfY2xrX2lzX2VuYWJsZWRfZ2F0aW5nLAorCS5zZXRfcGFyZW50ID0ganpfY2xrX3NwaV9zZXRfcGFyZW50LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGp6X2Nsa19kaXZpZGVkX29wcyA9IHsKKwkuc2V0X3JhdGUgPSBqel9jbGtfZGl2aWRlZF9zZXRfcmF0ZSwKKwkuZ2V0X3JhdGUgPSBqel9jbGtfZGl2aWRlZF9nZXRfcmF0ZSwKKwkuZW5hYmxlID0ganpfY2xrX2VuYWJsZV9nYXRpbmcsCisJLmRpc2FibGUgPSBqel9jbGtfZGlzYWJsZV9nYXRpbmcsCisJLmlzX2VuYWJsZWQgPSBqel9jbGtfaXNfZW5hYmxlZF9nYXRpbmcsCit9OworCitzdGF0aWMgc3RydWN0IGRpdmlkZWRfY2xrIGp6NDc0MF9jbG9ja19kaXZpZGVkX2Nsa3NbXSA9IHsKKwlbMF0gPSB7CisJCS5jbGsgPSB7CisJCQkubmFtZSA9ICJpMnMiLAorCQkJLnBhcmVudCA9ICZqel9jbGtfZXh0LmNsaywKKwkJCS5nYXRlX2JpdCA9IEpaX0NMT0NLX0dBVEVfSTJTLAorCQkJLm9wcyA9ICZqel9jbGtfaTJzX29wcywKKwkJfSwKKwkJLnJlZyA9IEpaX1JFR19DTE9DS19JMlMsCisJCS5tYXNrID0gSlpfQ0xPQ0tfSTJTX0RJVl9NQVNLLAorCX0sCisJWzFdID0geworCQkuY2xrID0geworCQkJLm5hbWUgPSAic3BpIiwKKwkJCS5wYXJlbnQgPSAmanpfY2xrX2V4dC5jbGssCisJCQkuZ2F0ZV9iaXQgPSBKWl9DTE9DS19HQVRFX1NQSSwKKwkJCS5vcHMgPSAmanpfY2xrX3NwaV9vcHMsCisJCX0sCisJCS5yZWcgPSBKWl9SRUdfQ0xPQ0tfU1BJLAorCQkubWFzayA9IEpaX0NMT0NLX1NQSV9ESVZfTUFTSywKKwl9LAorCVsyXSA9IHsKKwkJLmNsayA9IHsKKwkJCS5uYW1lID0gImxjZF9wY2xrIiwKKwkJCS5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmLAorCQkJLmdhdGVfYml0ID0gSlo0NzQwX0NMS19OT1RfR0FURUQsCisJCQkub3BzID0gJmp6X2Nsa19kaXZpZGVkX29wcywKKwkJfSwKKwkJLnJlZyA9IEpaX1JFR19DTE9DS19MQ0QsCisJCS5tYXNrID0gSlpfQ0xPQ0tfTENEX0RJVl9NQVNLLAorCX0sCisJWzNdID0geworCQkuY2xrID0geworCQkJLm5hbWUgPSAibW1jIiwKKwkJCS5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmLAorCQkJLmdhdGVfYml0ID0gSlpfQ0xPQ0tfR0FURV9NTUMsCisJCQkub3BzID0gJmp6X2Nsa19kaXZpZGVkX29wcywKKwkJfSwKKwkJLnJlZyA9IEpaX1JFR19DTE9DS19NTUMsCisJCS5tYXNrID0gSlpfQ0xPQ0tfTU1DX0RJVl9NQVNLLAorCX0sCisJWzRdID0geworCQkuY2xrID0geworCQkJLm5hbWUgPSAidWhjIiwKKwkJCS5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmLAorCQkJLmdhdGVfYml0ID0gSlpfQ0xPQ0tfR0FURV9VSEMsCisJCQkub3BzID0gJmp6X2Nsa19kaXZpZGVkX29wcywKKwkJfSwKKwkJLnJlZyA9IEpaX1JFR19DTE9DS19VSEMsCisJCS5tYXNrID0gSlpfQ0xPQ0tfVUhDX0RJVl9NQVNLLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMganpfY2xrX3VkY19vcHMgPSB7CisJLnNldF9wYXJlbnQgPSBqel9jbGtfdWRjX3NldF9wYXJlbnQsCisJLnNldF9yYXRlID0ganpfY2xrX3VkY19zZXRfcmF0ZSwKKwkuZ2V0X3JhdGUgPSBqel9jbGtfdWRjX2dldF9yYXRlLAorCS5lbmFibGUgPSBqel9jbGtfdWRjX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGp6X2Nsa191ZGNfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZCA9IGp6X2Nsa191ZGNfaXNfZW5hYmxlZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBqel9jbGtfc2ltcGxlX29wcyA9IHsKKwkuZW5hYmxlID0ganpfY2xrX2VuYWJsZV9nYXRpbmcsCisJLmRpc2FibGUgPSBqel9jbGtfZGlzYWJsZV9nYXRpbmcsCisJLmlzX2VuYWJsZWQgPSBqel9jbGtfaXNfZW5hYmxlZF9nYXRpbmcsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBqejQ3NDBfY2xvY2tfc2ltcGxlX2Nsa3NbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lID0gInVkYyIsCisJCS5wYXJlbnQgPSAmanpfY2xrX2V4dC5jbGssCisJCS5vcHMgPSAmanpfY2xrX3VkY19vcHMsCisJfSwKKwlbMV0gPSB7CisJCS5uYW1lID0gInVhcnQwIiwKKwkJLnBhcmVudCA9ICZqel9jbGtfZXh0LmNsaywKKwkJLmdhdGVfYml0ID0gSlpfQ0xPQ0tfR0FURV9VQVJUMCwKKwkJLm9wcyA9ICZqel9jbGtfc2ltcGxlX29wcywKKwl9LAorCVsyXSA9IHsKKwkJLm5hbWUgPSAidWFydDEiLAorCQkucGFyZW50ID0gJmp6X2Nsa19leHQuY2xrLAorCQkuZ2F0ZV9iaXQgPSBKWl9DTE9DS19HQVRFX1VBUlQxLAorCQkub3BzID0gJmp6X2Nsa19zaW1wbGVfb3BzLAorCX0sCisJWzNdID0geworCQkubmFtZSA9ICJkbWEiLAorCQkucGFyZW50ID0gJmp6X2Nsa19oaWdoX3NwZWVkX3BlcmlwaGVyYWwuY2xrLAorCQkuZ2F0ZV9iaXQgPSBKWl9DTE9DS19HQVRFX1VBUlQwLAorCQkub3BzID0gJmp6X2Nsa19zaW1wbGVfb3BzLAorCX0sCisJWzRdID0geworCQkubmFtZSA9ICJpcHUiLAorCQkucGFyZW50ID0gJmp6X2Nsa19oaWdoX3NwZWVkX3BlcmlwaGVyYWwuY2xrLAorCQkuZ2F0ZV9iaXQgPSBKWl9DTE9DS19HQVRFX0lQVSwKKwkJLm9wcyA9ICZqel9jbGtfc2ltcGxlX29wcywKKwl9LAorCVs1XSA9IHsKKwkJLm5hbWUgPSAiYWRjIiwKKwkJLnBhcmVudCA9ICZqel9jbGtfZXh0LmNsaywKKwkJLmdhdGVfYml0ID0gSlpfQ0xPQ0tfR0FURV9BREMsCisJCS5vcHMgPSAmanpfY2xrX3NpbXBsZV9vcHMsCisJfSwKKwlbNl0gPSB7CisJCS5uYW1lID0gImkyYyIsCisJCS5wYXJlbnQgPSAmanpfY2xrX2V4dC5jbGssCisJCS5nYXRlX2JpdCA9IEpaX0NMT0NLX0dBVEVfSTJDLAorCQkub3BzID0gJmp6X2Nsa19zaW1wbGVfb3BzLAorCX0sCisJWzddID0geworCQkubmFtZSA9ICJhaWMiLAorCQkucGFyZW50ID0gJmp6X2Nsa19leHQuY2xrLAorCQkuZ2F0ZV9iaXQgPSBKWl9DTE9DS19HQVRFX0FJQywKKwkJLm9wcyA9ICZqel9jbGtfc2ltcGxlX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzdGF0aWNfY2xrIGp6X2Nsa19ydGMgPSB7CisJLmNsayA9IHsKKwkJLm5hbWUgPSAicnRjIiwKKwkJLmdhdGVfYml0ID0gSlpfQ0xPQ0tfR0FURV9SVEMsCisJCS5vcHMgPSAmanpfY2xrX3N0YXRpY19vcHMsCisJfSwKKwkucmF0ZSA9IDMyNzY4LAorfTsKKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmICghY2xrLT5vcHMtPmVuYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY2xrLT5vcHMtPmVuYWJsZShjbGspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2VuYWJsZSk7CisKK3ZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGstPm9wcy0+ZGlzYWJsZSkKKwkJY2xrLT5vcHMtPmRpc2FibGUoY2xrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19kaXNhYmxlKTsKKworaW50IGNsa19pc19lbmFibGVkKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoY2xrLT5vcHMtPmlzX2VuYWJsZWQpCisJCXJldHVybiBjbGstPm9wcy0+aXNfZW5hYmxlZChjbGspOworCisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoY2xrLT5vcHMtPmdldF9yYXRlKQorCQlyZXR1cm4gY2xrLT5vcHMtPmdldF9yYXRlKGNsayk7CisJaWYgKGNsay0+cGFyZW50KQorCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2dldF9yYXRlKTsKKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpZiAoIWNsay0+b3BzLT5zZXRfcmF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNsay0+b3BzLT5zZXRfcmF0ZShjbGssIHJhdGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3NldF9yYXRlKTsKKworbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpZiAoY2xrLT5vcHMtPnJvdW5kX3JhdGUpCisJCXJldHVybiBjbGstPm9wcy0+cm91bmRfcmF0ZShjbGssIHJhdGUpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjbGtfcm91bmRfcmF0ZSk7CisKK2ludCBjbGtfc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwlpbnQgcmV0OworCWludCBlbmFibGVkOworCisJaWYgKCFjbGstPm9wcy0+c2V0X3BhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbmFibGVkID0gY2xrX2lzX2VuYWJsZWQoY2xrKTsKKwlpZiAoZW5hYmxlZCkKKwkJY2xrX2Rpc2FibGUoY2xrKTsKKwlyZXQgPSBjbGstPm9wcy0+c2V0X3BhcmVudChjbGssIHBhcmVudCk7CisJaWYgKGVuYWJsZWQpCisJCWNsa19lbmFibGUoY2xrKTsKKworCWp6NDc0MF9jbG9ja19kZWJ1Z2ZzX3VwZGF0ZV9wYXJlbnQoY2xrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjbGtfc2V0X3BhcmVudCk7CisKK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjbGsgKmNsazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrLCAmanpfY2xvY2tzLCBsaXN0KSB7CisJCWlmIChzdHJjbXAoY2xrLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIGNsazsKKwl9CisJcmV0dXJuIEVSUl9QVFIoLUVOWElPKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19nZXQpOworCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3B1dCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGtfYWRkKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlsaXN0X2FkZF90YWlsKCZjbGstPmxpc3QsICZqel9jbG9ja3MpOworCisJano0NzQwX2Nsb2NrX2RlYnVnZnNfYWRkX2NsayhjbGspOworfQorCitzdGF0aWMgdm9pZCBjbGtfcmVnaXN0ZXJfY2xrcyh2b2lkKQoreworCXNpemVfdCBpOworCisJY2xrX2FkZCgmanpfY2xrX2V4dC5jbGspOworCWNsa19hZGQoJmp6X2Nsa19wbGwpOworCWNsa19hZGQoJmp6X2Nsa19wbGxfaGFsZik7CisJY2xrX2FkZCgmanpfY2xrX2NwdS5jbGspOworCWNsa19hZGQoJmp6X2Nsa19oaWdoX3NwZWVkX3BlcmlwaGVyYWwuY2xrKTsKKwljbGtfYWRkKCZqel9jbGtfbG93X3NwZWVkX3BlcmlwaGVyYWwuY2xrKTsKKwljbGtfYWRkKCZqel9jbGtfa28pOworCWNsa19hZGQoJmp6X2Nsa19sZCk7CisJY2xrX2FkZCgmanpfY2xrX3J0Yy5jbGspOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoano0NzQwX2Nsb2NrX2RpdmlkZWRfY2xrcyk7ICsraSkKKwkJY2xrX2FkZCgmano0NzQwX2Nsb2NrX2RpdmlkZWRfY2xrc1tpXS5jbGspOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoano0NzQwX2Nsb2NrX3NpbXBsZV9jbGtzKTsgKytpKQorCQljbGtfYWRkKCZqejQ3NDBfY2xvY2tfc2ltcGxlX2Nsa3NbaV0pOworfQorCit2b2lkIGp6NDc0MF9jbG9ja19zZXRfd2FpdF9tb2RlKGVudW0gano0NzQwX3dhaXRfbW9kZSBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgSlo0NzQwX1dBSVRfTU9ERV9JRExFOgorCQlqel9jbGtfcmVnX2NsZWFyX2JpdHMoSlpfUkVHX0NMT0NLX0xPV19QT1dFUiwgSlpfQ0xPQ0tfTE9XX1BPV0VSX01PREVfU0xFRVApOworCQlicmVhazsKKwljYXNlIEpaNDc0MF9XQUlUX01PREVfU0xFRVA6CisJCWp6X2Nsa19yZWdfc2V0X2JpdHMoSlpfUkVHX0NMT0NLX0xPV19QT1dFUiwgSlpfQ0xPQ0tfTE9XX1BPV0VSX01PREVfU0xFRVApOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgano0NzQwX2Nsb2NrX3VkY19kaXNhYmxlX2F1dG9fc3VzcGVuZCh2b2lkKQoreworCWp6X2Nsa19yZWdfY2xlYXJfYml0cyhKWl9SRUdfQ0xPQ0tfR0FURSwgSlpfQ0xPQ0tfR0FURV9VREMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoano0NzQwX2Nsb2NrX3VkY19kaXNhYmxlX2F1dG9fc3VzcGVuZCk7CisKK3ZvaWQgano0NzQwX2Nsb2NrX3VkY19lbmFibGVfYXV0b19zdXNwZW5kKHZvaWQpCit7CisJanpfY2xrX3JlZ19zZXRfYml0cyhKWl9SRUdfQ0xPQ0tfR0FURSwgSlpfQ0xPQ0tfR0FURV9VREMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoano0NzQwX2Nsb2NrX3VkY19lbmFibGVfYXV0b19zdXNwZW5kKTsKKwordm9pZCBqejQ3NDBfY2xvY2tfc3VzcGVuZCh2b2lkKQoreworCWp6X2Nsa19yZWdfc2V0X2JpdHMoSlpfUkVHX0NMT0NLX0dBVEUsCisJCUpaX0NMT0NLX0dBVEVfVENVIHwgSlpfQ0xPQ0tfR0FURV9ETUFDIHwgSlpfQ0xPQ0tfR0FURV9VQVJUMCk7CisKKwlqel9jbGtfcmVnX2NsZWFyX2JpdHMoSlpfUkVHX0NMT0NLX1BMTCwgSlpfQ0xPQ0tfUExMX0VOQUJMRUQpOworfQorCit2b2lkIGp6NDc0MF9jbG9ja19yZXN1bWUodm9pZCkKK3sKKwl1aW50MzJfdCBwbGw7CisKKwlqel9jbGtfcmVnX3NldF9iaXRzKEpaX1JFR19DTE9DS19QTEwsIEpaX0NMT0NLX1BMTF9FTkFCTEVEKTsKKworCWRvIHsKKwkJcGxsID0ganpfY2xrX3JlZ19yZWFkKEpaX1JFR19DTE9DS19QTEwpOworCX0gd2hpbGUgKCEocGxsICYgSlpfQ0xPQ0tfUExMX1NUQUJMRSkpOworCisJanpfY2xrX3JlZ19jbGVhcl9iaXRzKEpaX1JFR19DTE9DS19HQVRFLAorCQlKWl9DTE9DS19HQVRFX1RDVSB8IEpaX0NMT0NLX0dBVEVfRE1BQyB8IEpaX0NMT0NLX0dBVEVfVUFSVDApOworfQorCitzdGF0aWMgaW50IGp6NDc0MF9jbG9ja19pbml0KHZvaWQpCit7CisJdWludDMyX3QgdmFsOworCisJanpfY2xvY2tfYmFzZSA9IGlvcmVtYXAoSlo0NzQwX0NQTV9CQVNFX0FERFIsIDB4MTAwKTsKKwlpZiAoIWp6X2Nsb2NrX2Jhc2UpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2tfaW5pdCgmanpfY2xvY2tfbG9jayk7CisKKwlqel9jbGtfZXh0LnJhdGUgPSBqejQ3NDBfY2xvY2tfYmRhdGEuZXh0X3JhdGU7CisJanpfY2xrX3J0Yy5yYXRlID0gano0NzQwX2Nsb2NrX2JkYXRhLnJ0Y19yYXRlOworCisJdmFsID0ganpfY2xrX3JlZ19yZWFkKEpaX1JFR19DTE9DS19TUEkpOworCisJaWYgKHZhbCAmIEpaX0NMT0NLX1NQSV9TUkNfUExMKQorCQlqejQ3NDBfY2xvY2tfZGl2aWRlZF9jbGtzWzFdLmNsay5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmOworCisJdmFsID0ganpfY2xrX3JlZ19yZWFkKEpaX1JFR19DTE9DS19DVFJMKTsKKworCWlmICh2YWwgJiBKWl9DTE9DS19DVFJMX0kyU19TUkNfUExMKQorCQlqejQ3NDBfY2xvY2tfZGl2aWRlZF9jbGtzWzBdLmNsay5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmOworCisJaWYgKHZhbCAmIEpaX0NMT0NLX0NUUkxfVURDX1NSQ19QTEwpCisJCWp6NDc0MF9jbG9ja19zaW1wbGVfY2xrc1swXS5wYXJlbnQgPSAmanpfY2xrX3BsbF9oYWxmOworCisJano0NzQwX2Nsb2NrX2RlYnVnZnNfaW5pdCgpOworCisJY2xrX3JlZ2lzdGVyX2Nsa3MoKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChqejQ3NDBfY2xvY2tfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL2Nsb2NrLmggYi9hcmNoL21pcHMvano0NzQwL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwNzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvY2xvY2suaApAQCAtMCwwICsxLDc2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBjbG9jayBzdXBwb3J0CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19NSVBTX0paNDc0MF9DTE9DS19IX18KKyNkZWZpbmUgX19NSVBTX0paNDc0MF9DTE9DS19IX18KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworc3RydWN0IGp6NDc0MF9jbG9ja19ib2FyZF9kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGV4dF9yYXRlOworCXVuc2lnbmVkIGxvbmcgcnRjX3JhdGU7Cit9OworCitleHRlcm4gc3RydWN0IGp6NDc0MF9jbG9ja19ib2FyZF9kYXRhIGp6NDc0MF9jbG9ja19iZGF0YTsKKwordm9pZCBqejQ3NDBfY2xvY2tfc3VzcGVuZCh2b2lkKTsKK3ZvaWQgano0NzQwX2Nsb2NrX3Jlc3VtZSh2b2lkKTsKKworc3RydWN0IGNsazsKKworc3RydWN0IGNsa19vcHMgeworCXVuc2lnbmVkIGxvbmcgKCpnZXRfcmF0ZSkoc3RydWN0IGNsayAqY2xrKTsKKwl1bnNpZ25lZCBsb25nICgqcm91bmRfcmF0ZSkoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworCWludCAoKnNldF9yYXRlKShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CisJaW50ICgqZW5hYmxlKShzdHJ1Y3QgY2xrICpjbGspOworCWludCAoKmRpc2FibGUpKHN0cnVjdCBjbGsgKmNsayk7CisJaW50ICgqaXNfZW5hYmxlZCkoc3RydWN0IGNsayAqY2xrKTsKKworCWludCAoKnNldF9wYXJlbnQpKHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KTsKKworfTsKKworc3RydWN0IGNsayB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgY2xrICpwYXJlbnQ7CisKKwl1aW50MzJfdCBnYXRlX2JpdDsKKworCWNvbnN0IHN0cnVjdCBjbGtfb3BzICpvcHM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2VudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGFyZW50X2VudHJ5OworI2VuZGlmCisKK307CisKKyNkZWZpbmUgSlo0NzQwX0NMS19OT1RfR0FURUQgKCh1aW50MzJfdCktMSkKKworaW50IGNsa19pc19lbmFibGVkKHN0cnVjdCBjbGsgKmNsayk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3ZvaWQgano0NzQwX2Nsb2NrX2RlYnVnZnNfaW5pdCh2b2lkKTsKK3ZvaWQgano0NzQwX2Nsb2NrX2RlYnVnZnNfYWRkX2NsayhzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBqejQ3NDBfY2xvY2tfZGVidWdmc191cGRhdGVfcGFyZW50KHN0cnVjdCBjbGsgKmNsayk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGp6NDc0MF9jbG9ja19kZWJ1Z2ZzX2luaXQodm9pZCkge307CitzdGF0aWMgaW5saW5lIHZvaWQgano0NzQwX2Nsb2NrX2RlYnVnZnNfYWRkX2NsayhzdHJ1Y3QgY2xrICpjbGspIHt9Oworc3RhdGljIGlubGluZSB2b2lkIGp6NDc0MF9jbG9ja19kZWJ1Z2ZzX3VwZGF0ZV9wYXJlbnQoc3RydWN0IGNsayAqY2xrKSB7fTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvZG1hLmMgYi9hcmNoL21pcHMvano0NzQwL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmU3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL2RtYS5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBETUEgc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvZG1hLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KKworI2RlZmluZSBKWl9SRUdfRE1BX1NSQ19BRERSKHgpCQkoMHgwMCArICh4KSAqIDB4MjApCisjZGVmaW5lIEpaX1JFR19ETUFfRFNUX0FERFIoeCkJCSgweDA0ICsgKHgpICogMHgyMCkKKyNkZWZpbmUgSlpfUkVHX0RNQV9UUkFOU0ZFUl9DT1VOVCh4KQkoMHgwOCArICh4KSAqIDB4MjApCisjZGVmaW5lIEpaX1JFR19ETUFfUkVRX1RZUEUoeCkJCSgweDBDICsgKHgpICogMHgyMCkKKyNkZWZpbmUgSlpfUkVHX0RNQV9TVEFUVVNfQ1RSTCh4KQkoMHgxMCArICh4KSAqIDB4MjApCisjZGVmaW5lIEpaX1JFR19ETUFfQ01EKHgpCQkoMHgxNCArICh4KSAqIDB4MjApCisjZGVmaW5lIEpaX1JFR19ETUFfREVTQ19BRERSKHgpCQkoMHgxOCArICh4KSAqIDB4MjApCisKKyNkZWZpbmUgSlpfUkVHX0RNQV9DVFJMCQkJMHgzMDAKKyNkZWZpbmUgSlpfUkVHX0RNQV9JUlEJCQkweDMwNAorI2RlZmluZSBKWl9SRUdfRE1BX0RPT1JCRUxMCQkweDMwOAorI2RlZmluZSBKWl9SRUdfRE1BX0RPT1JCRUxMX1NFVAkJMHgzMEMKKworI2RlZmluZSBKWl9ETUFfU1RBVFVTX0NUUkxfTk9fREVTQwkJQklUKDMxKQorI2RlZmluZSBKWl9ETUFfU1RBVFVTX0NUUkxfREVTQ19JTlYJCUJJVCg2KQorI2RlZmluZSBKWl9ETUFfU1RBVFVTX0NUUkxfQUREUl9FUlIJCUJJVCg0KQorI2RlZmluZSBKWl9ETUFfU1RBVFVTX0NUUkxfVFJBTlNGRVJfRE9ORQlCSVQoMykKKyNkZWZpbmUgSlpfRE1BX1NUQVRVU19DVFJMX0hBTFQJCQlCSVQoMikKKyNkZWZpbmUgSlpfRE1BX1NUQVRVU19DVFJMX0NPVU5UX1RFUk1JTkFURQlCSVQoMSkKKyNkZWZpbmUgSlpfRE1BX1NUQVRVU19DVFJMX0VOQUJMRQkJQklUKDApCisKKyNkZWZpbmUgSlpfRE1BX0NNRF9TUkNfSU5DCQkJQklUKDIzKQorI2RlZmluZSBKWl9ETUFfQ01EX0RTVF9JTkMJCQlCSVQoMjIpCisjZGVmaW5lIEpaX0RNQV9DTURfUkRJTF9NQVNLCQkJKDB4ZiA8PCAxNikKKyNkZWZpbmUgSlpfRE1BX0NNRF9TUkNfV0lEVEhfTUFTSwkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgSlpfRE1BX0NNRF9EU1RfV0lEVEhfTUFTSwkJKDB4MyA8PCAxMikKKyNkZWZpbmUgSlpfRE1BX0NNRF9JTlRFUlZBTF9MRU5HVEhfTUFTSwkJKDB4NyA8PCA4KQorI2RlZmluZSBKWl9ETUFfQ01EX0JMT0NLX01PREUJCQlCSVQoNykKKyNkZWZpbmUgSlpfRE1BX0NNRF9ERVNDX1ZBTElECQkJQklUKDQpCisjZGVmaW5lIEpaX0RNQV9DTURfREVTQ19WQUxJRF9NT0RFCQlCSVQoMykKKyNkZWZpbmUgSlpfRE1BX0NNRF9WQUxJRF9JUlFfRU5BQkxFCQlCSVQoMikKKyNkZWZpbmUgSlpfRE1BX0NNRF9UUkFOU0ZFUl9JUlFfRU5BQkxFCQlCSVQoMSkKKyNkZWZpbmUgSlpfRE1BX0NNRF9MSU5LX0VOQUJMRQkJCUJJVCgwKQorCisjZGVmaW5lIEpaX0RNQV9DTURfRkxBR1NfT0ZGU0VUIDIyCisjZGVmaW5lIEpaX0RNQV9DTURfUkRJTF9PRkZTRVQgMTYKKyNkZWZpbmUgSlpfRE1BX0NNRF9TUkNfV0lEVEhfT0ZGU0VUIDE0CisjZGVmaW5lIEpaX0RNQV9DTURfRFNUX1dJRFRIX09GRlNFVCAxMgorI2RlZmluZSBKWl9ETUFfQ01EX1RSQU5TRkVSX1NJWkVfT0ZGU0VUIDgKKyNkZWZpbmUgSlpfRE1BX0NNRF9NT0RFX09GRlNFVCA3CisKKyNkZWZpbmUgSlpfRE1BX0NUUkxfUFJJT1JJVFlfTUFTSwkoMHgzIDw8IDgpCisjZGVmaW5lIEpaX0RNQV9DVFJMX0hBTFQJCUJJVCgzKQorI2RlZmluZSBKWl9ETUFfQ1RSTF9BRERSRVNTX0VSUk9SCUJJVCgyKQorI2RlZmluZSBKWl9ETUFfQ1RSTF9FTkFCTEUJCUJJVCgwKQorCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmp6NDc0MF9kbWFfYmFzZTsKK3N0YXRpYyBzcGlubG9ja190IGp6NDc0MF9kbWFfbG9jazsKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBqejQ3NDBfZG1hX3JlYWQoc2l6ZV90IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoano0NzQwX2RtYV9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGp6NDc0MF9kbWFfd3JpdGUoc2l6ZV90IHJlZywgdWludDMyX3QgdmFsKQoreworCXdyaXRlbCh2YWwsIGp6NDc0MF9kbWFfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfZG1hX3dyaXRlX21hc2soc2l6ZV90IHJlZywgdWludDMyX3QgdmFsLCB1aW50MzJfdCBtYXNrKQoreworCXVpbnQzMl90IHZhbDI7CisJdmFsMiA9IGp6NDc0MF9kbWFfcmVhZChyZWcpOworCXZhbDIgJj0gfm1hc2s7CisJdmFsMiB8PSB2YWw7CisJano0NzQwX2RtYV93cml0ZShyZWcsIHZhbDIpOworfQorCitzdHJ1Y3Qgano0NzQwX2RtYV9jaGFuIHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdm9pZCAqZGV2OworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwllbnVtIGp6NDc0MF9kbWFfZmxhZ3MgZmxhZ3M7CisJdWludDMyX3QgdHJhbnNmZXJfc2hpZnQ7CisKKwlqejQ3NDBfZG1hX2NvbXBsZXRlX2NhbGxiYWNrX3QgY29tcGxldGVfY2I7CisKKwl1bnNpZ25lZCB1c2VkOjE7Cit9OworCisjZGVmaW5lIEpaNDc0MF9ETUFfQ0hBTk5FTChfaWQpIHsgLmlkID0gX2lkIH0KKworc3RydWN0IGp6NDc0MF9kbWFfY2hhbiBqejQ3NDBfZG1hX2NoYW5uZWxzW10gPSB7CisJSlo0NzQwX0RNQV9DSEFOTkVMKDApLAorCUpaNDc0MF9ETUFfQ0hBTk5FTCgxKSwKKwlKWjQ3NDBfRE1BX0NIQU5ORUwoMiksCisJSlo0NzQwX0RNQV9DSEFOTkVMKDMpLAorCUpaNDc0MF9ETUFfQ0hBTk5FTCg0KSwKKwlKWjQ3NDBfRE1BX0NIQU5ORUwoNSksCit9OworCitzdHJ1Y3Qgano0NzQwX2RtYV9jaGFuICpqejQ3NDBfZG1hX3JlcXVlc3Qodm9pZCAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSA9IE5VTEw7CisKKwlzcGluX2xvY2soJmp6NDc0MF9kbWFfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShqejQ3NDBfZG1hX2NoYW5uZWxzKTsgKytpKSB7CisJCWlmICghano0NzQwX2RtYV9jaGFubmVsc1tpXS51c2VkKSB7CisJCQlkbWEgPSAmano0NzQwX2RtYV9jaGFubmVsc1tpXTsKKwkJCWRtYS0+dXNlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZqejQ3NDBfZG1hX2xvY2spOworCisJaWYgKCFkbWEpCisJCXJldHVybiBOVUxMOworCisJZG1hLT5kZXYgPSBkZXY7CisJZG1hLT5uYW1lID0gbmFtZTsKKworCXJldHVybiBkbWE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqejQ3NDBfZG1hX3JlcXVlc3QpOworCit2b2lkIGp6NDc0MF9kbWFfY29uZmlndXJlKHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSwKKwljb25zdCBzdHJ1Y3Qgano0NzQwX2RtYV9jb25maWcgKmNvbmZpZykKK3sKKwl1aW50MzJfdCBjbWQ7CisKKwlzd2l0Y2ggKGNvbmZpZy0+dHJhbnNmZXJfc2l6ZSkgeworCWNhc2UgSlo0NzQwX0RNQV9UUkFOU0ZFUl9TSVpFXzJCWVRFOgorCQlkbWEtPnRyYW5zZmVyX3NoaWZ0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBKWjQ3NDBfRE1BX1RSQU5TRkVSX1NJWkVfNEJZVEU6CisJCWRtYS0+dHJhbnNmZXJfc2hpZnQgPSAyOworCQlicmVhazsKKwljYXNlIEpaNDc0MF9ETUFfVFJBTlNGRVJfU0laRV8xNkJZVEU6CisJCWRtYS0+dHJhbnNmZXJfc2hpZnQgPSA0OworCQlicmVhazsKKwljYXNlIEpaNDc0MF9ETUFfVFJBTlNGRVJfU0laRV8zMkJZVEU6CisJCWRtYS0+dHJhbnNmZXJfc2hpZnQgPSA1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkbWEtPnRyYW5zZmVyX3NoaWZ0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJY21kID0gY29uZmlnLT5mbGFncyA8PCBKWl9ETUFfQ01EX0ZMQUdTX09GRlNFVDsKKwljbWQgfD0gY29uZmlnLT5zcmNfd2lkdGggPDwgSlpfRE1BX0NNRF9TUkNfV0lEVEhfT0ZGU0VUOworCWNtZCB8PSBjb25maWctPmRzdF93aWR0aCA8PCBKWl9ETUFfQ01EX0RTVF9XSURUSF9PRkZTRVQ7CisJY21kIHw9IGNvbmZpZy0+dHJhbnNmZXJfc2l6ZSA8PCBKWl9ETUFfQ01EX1RSQU5TRkVSX1NJWkVfT0ZGU0VUOworCWNtZCB8PSBjb25maWctPm1vZGUgPDwgSlpfRE1BX0NNRF9NT0RFX09GRlNFVDsKKwljbWQgfD0gSlpfRE1BX0NNRF9UUkFOU0ZFUl9JUlFfRU5BQkxFOworCisJano0NzQwX2RtYV93cml0ZShKWl9SRUdfRE1BX0NNRChkbWEtPmlkKSwgY21kKTsKKwlqejQ3NDBfZG1hX3dyaXRlKEpaX1JFR19ETUFfU1RBVFVTX0NUUkwoZG1hLT5pZCksIDApOworCWp6NDc0MF9kbWFfd3JpdGUoSlpfUkVHX0RNQV9SRVFfVFlQRShkbWEtPmlkKSwgY29uZmlnLT5yZXF1ZXN0X3R5cGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoano0NzQwX2RtYV9jb25maWd1cmUpOworCit2b2lkIGp6NDc0MF9kbWFfc2V0X3NyY19hZGRyKHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSwgZG1hX2FkZHJfdCBzcmMpCit7CisJano0NzQwX2RtYV93cml0ZShKWl9SRUdfRE1BX1NSQ19BRERSKGRtYS0+aWQpLCBzcmMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoano0NzQwX2RtYV9zZXRfc3JjX2FkZHIpOworCit2b2lkIGp6NDc0MF9kbWFfc2V0X2RzdF9hZGRyKHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSwgZG1hX2FkZHJfdCBkc3QpCit7CisJano0NzQwX2RtYV93cml0ZShKWl9SRUdfRE1BX0RTVF9BRERSKGRtYS0+aWQpLCBkc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoano0NzQwX2RtYV9zZXRfZHN0X2FkZHIpOworCit2b2lkIGp6NDc0MF9kbWFfc2V0X3RyYW5zZmVyX2NvdW50KHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSwgdWludDMyX3QgY291bnQpCit7CisJY291bnQgPj49IGRtYS0+dHJhbnNmZXJfc2hpZnQ7CisJano0NzQwX2RtYV93cml0ZShKWl9SRUdfRE1BX1RSQU5TRkVSX0NPVU5UKGRtYS0+aWQpLCBjb3VudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqejQ3NDBfZG1hX3NldF90cmFuc2Zlcl9jb3VudCk7CisKK3ZvaWQgano0NzQwX2RtYV9zZXRfY29tcGxldGVfY2Ioc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqZG1hLAorCWp6NDc0MF9kbWFfY29tcGxldGVfY2FsbGJhY2tfdCBjYikKK3sKKwlkbWEtPmNvbXBsZXRlX2NiID0gY2I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqejQ3NDBfZG1hX3NldF9jb21wbGV0ZV9jYik7CisKK3ZvaWQgano0NzQwX2RtYV9mcmVlKHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSkKK3sKKwlkbWEtPmRldiA9IE5VTEw7CisJZG1hLT5jb21wbGV0ZV9jYiA9IE5VTEw7CisJZG1hLT51c2VkID0gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGp6NDc0MF9kbWFfZnJlZSk7CisKK3ZvaWQgano0NzQwX2RtYV9lbmFibGUoc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqZG1hKQoreworCWp6NDc0MF9kbWFfd3JpdGVfbWFzayhKWl9SRUdfRE1BX1NUQVRVU19DVFJMKGRtYS0+aWQpLAorCQkJSlpfRE1BX1NUQVRVU19DVFJMX05PX0RFU0MgfCBKWl9ETUFfU1RBVFVTX0NUUkxfRU5BQkxFLAorCQkJSlpfRE1BX1NUQVRVU19DVFJMX0hBTFQgfCBKWl9ETUFfU1RBVFVTX0NUUkxfTk9fREVTQyB8CisJCQlKWl9ETUFfU1RBVFVTX0NUUkxfRU5BQkxFKTsKKworCWp6NDc0MF9kbWFfd3JpdGVfbWFzayhKWl9SRUdfRE1BX0NUUkwsCisJCQlKWl9ETUFfQ1RSTF9FTkFCTEUsCisJCQlKWl9ETUFfQ1RSTF9IQUxUIHwgSlpfRE1BX0NUUkxfRU5BQkxFKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGp6NDc0MF9kbWFfZW5hYmxlKTsKKwordm9pZCBqejQ3NDBfZG1hX2Rpc2FibGUoc3RydWN0IGp6NDc0MF9kbWFfY2hhbiAqZG1hKQoreworCWp6NDc0MF9kbWFfd3JpdGVfbWFzayhKWl9SRUdfRE1BX1NUQVRVU19DVFJMKGRtYS0+aWQpLCAwLAorCQkJSlpfRE1BX1NUQVRVU19DVFJMX0VOQUJMRSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqejQ3NDBfZG1hX2Rpc2FibGUpOworCit1aW50MzJfdCBqejQ3NDBfZG1hX2dldF9yZXNpZHVlKGNvbnN0IHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSkKK3sKKwl1aW50MzJfdCByZXNpZHVlOworCXJlc2lkdWUgPSBqejQ3NDBfZG1hX3JlYWQoSlpfUkVHX0RNQV9UUkFOU0ZFUl9DT1VOVChkbWEtPmlkKSk7CisJcmV0dXJuIHJlc2lkdWUgPDwgZG1hLT50cmFuc2Zlcl9zaGlmdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGp6NDc0MF9kbWFfZ2V0X3Jlc2lkdWUpOworCitzdGF0aWMgdm9pZCBqejQ3NDBfZG1hX2NoYW5faXJxKHN0cnVjdCBqejQ3NDBfZG1hX2NoYW4gKmRtYSkKK3sKKwl1aW50MzJfdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBqejQ3NDBfZG1hX3JlYWQoSlpfUkVHX0RNQV9TVEFUVVNfQ1RSTChkbWEtPmlkKSk7CisKKwlqejQ3NDBfZG1hX3dyaXRlX21hc2soSlpfUkVHX0RNQV9TVEFUVVNfQ1RSTChkbWEtPmlkKSwgMCwKKwkJSlpfRE1BX1NUQVRVU19DVFJMX0VOQUJMRSB8IEpaX0RNQV9TVEFUVVNfQ1RSTF9UUkFOU0ZFUl9ET05FKTsKKworCWlmIChkbWEtPmNvbXBsZXRlX2NiKQorCQlkbWEtPmNvbXBsZXRlX2NiKGRtYSwgMCwgZG1hLT5kZXYpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgano0NzQwX2RtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVpbnQzMl90IGlycV9zdGF0dXM7CisJdW5zaWduZWQgaW50IGk7CisKKwlpcnFfc3RhdHVzID0gcmVhZGwoano0NzQwX2RtYV9iYXNlICsgSlpfUkVHX0RNQV9JUlEpOworCisJZm9yIChpID0gMDsgaSA8IDY7ICsraSkgeworCQlpZiAoaXJxX3N0YXR1cyAmICgxIDw8IGkpKQorCQkJano0NzQwX2RtYV9jaGFuX2lycSgmano0NzQwX2RtYV9jaGFubmVsc1tpXSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGp6NDc0MF9kbWFfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCByZXQ7CisKKwlqejQ3NDBfZG1hX2Jhc2UgPSBpb3JlbWFwKEpaNDc0MF9ETUFDX0JBU0VfQUREUiwgMHg0MDApOworCisJaWYgKCFqejQ3NDBfZG1hX2Jhc2UpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2tfaW5pdCgmano0NzQwX2RtYV9sb2NrKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKEpaNDc0MF9JUlFfRE1BQywgano0NzQwX2RtYV9pcnEsIDAsICJETUEiLCBOVUxMKTsKKworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAiSlo0NzQwIERNQTogRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKGp6NDc0MF9kbWFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL2dwaW8uYyBiL2FyY2gvbWlwcy9qejQ3NDAvZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjYwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL2dwaW8uYwpAQCAtMCwwICsxLDYwNCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHBsYXRmb3JtIEdQSU8gc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9iYXNlLmg+CisKKyNkZWZpbmUgSlo0NzQwX0dQSU9fQkFTRV9BICgzMiowKQorI2RlZmluZSBKWjQ3NDBfR1BJT19CQVNFX0IgKDMyKjEpCisjZGVmaW5lIEpaNDc0MF9HUElPX0JBU0VfQyAoMzIqMikKKyNkZWZpbmUgSlo0NzQwX0dQSU9fQkFTRV9EICgzMiozKQorCisjZGVmaW5lIEpaNDc0MF9HUElPX05VTV9BIDMyCisjZGVmaW5lIEpaNDc0MF9HUElPX05VTV9CIDMyCisjZGVmaW5lIEpaNDc0MF9HUElPX05VTV9DIDMxCisjZGVmaW5lIEpaNDc0MF9HUElPX05VTV9EIDMyCisKKyNkZWZpbmUgSlo0NzQwX0lSUV9HUElPX0JBU0VfQSAoSlo0NzQwX0lSUV9HUElPKDApICsgSlo0NzQwX0dQSU9fQkFTRV9BKQorI2RlZmluZSBKWjQ3NDBfSVJRX0dQSU9fQkFTRV9CIChKWjQ3NDBfSVJRX0dQSU8oMCkgKyBKWjQ3NDBfR1BJT19CQVNFX0IpCisjZGVmaW5lIEpaNDc0MF9JUlFfR1BJT19CQVNFX0MgKEpaNDc0MF9JUlFfR1BJTygwKSArIEpaNDc0MF9HUElPX0JBU0VfQykKKyNkZWZpbmUgSlo0NzQwX0lSUV9HUElPX0JBU0VfRCAoSlo0NzQwX0lSUV9HUElPKDApICsgSlo0NzQwX0dQSU9fQkFTRV9EKQorCisjZGVmaW5lIEpaX1JFR19HUElPX1BJTgkJCTB4MDAKKyNkZWZpbmUgSlpfUkVHX0dQSU9fREFUQQkJMHgxMAorI2RlZmluZSBKWl9SRUdfR1BJT19EQVRBX1NFVAkJMHgxNAorI2RlZmluZSBKWl9SRUdfR1BJT19EQVRBX0NMRUFSCQkweDE4CisjZGVmaW5lIEpaX1JFR19HUElPX01BU0sJCTB4MjAKKyNkZWZpbmUgSlpfUkVHX0dQSU9fTUFTS19TRVQJCTB4MjQKKyNkZWZpbmUgSlpfUkVHX0dQSU9fTUFTS19DTEVBUgkJMHgyOAorI2RlZmluZSBKWl9SRUdfR1BJT19QVUxMCQkweDMwCisjZGVmaW5lIEpaX1JFR19HUElPX1BVTExfU0VUCQkweDM0CisjZGVmaW5lIEpaX1JFR19HUElPX1BVTExfQ0xFQVIJCTB4MzgKKyNkZWZpbmUgSlpfUkVHX0dQSU9fRlVOQwkJMHg0MAorI2RlZmluZSBKWl9SRUdfR1BJT19GVU5DX1NFVAkJMHg0NAorI2RlZmluZSBKWl9SRUdfR1BJT19GVU5DX0NMRUFSCQkweDQ4CisjZGVmaW5lIEpaX1JFR19HUElPX1NFTEVDVAkJMHg1MAorI2RlZmluZSBKWl9SRUdfR1BJT19TRUxFQ1RfU0VUCQkweDU0CisjZGVmaW5lIEpaX1JFR19HUElPX1NFTEVDVF9DTEVBUgkweDU4CisjZGVmaW5lIEpaX1JFR19HUElPX0RJUkVDVElPTgkJMHg2MAorI2RlZmluZSBKWl9SRUdfR1BJT19ESVJFQ1RJT05fU0VUCTB4NjQKKyNkZWZpbmUgSlpfUkVHX0dQSU9fRElSRUNUSU9OX0NMRUFSCTB4NjgKKyNkZWZpbmUgSlpfUkVHX0dQSU9fVFJJR0dFUgkJMHg3MAorI2RlZmluZSBKWl9SRUdfR1BJT19UUklHR0VSX1NFVAkJMHg3NAorI2RlZmluZSBKWl9SRUdfR1BJT19UUklHR0VSX0NMRUFSCTB4NzgKKyNkZWZpbmUgSlpfUkVHX0dQSU9fRkxBRwkJMHg4MAorI2RlZmluZSBKWl9SRUdfR1BJT19GTEFHX0NMRUFSCQkweDE0CisKKyNkZWZpbmUgR1BJT19UT19CSVQoZ3BpbykgQklUKGdwaW8gJiAweDFmKQorI2RlZmluZSBHUElPX1RPX1JFRyhncGlvLCByZWcpIChncGlvX3RvX2p6X2dwaW9fY2hpcChncGlvKS0+YmFzZSArIChyZWcpKQorI2RlZmluZSBDSElQX1RPX1JFRyhjaGlwLCByZWcpIChncGlvX2NoaXBfdG9fanpfZ3Bpb19jaGlwKGNoaXApLT5iYXNlICsgKHJlZykpCisKK3N0cnVjdCBqel9ncGlvX2NoaXAgeworCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgaW50IGlycV9iYXNlOworCXVpbnQzMl90IHdha2V1cDsKKwl1aW50MzJfdCBzdXNwZW5kX21hc2s7CisJdWludDMyX3QgZWRnZV90cmlnZ2VyX2JvdGg7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKKwlzdHJ1Y3QgaXJxX2NoaXAgaXJxX2NoaXA7CisJc3RydWN0IHN5c19kZXZpY2Ugc3lzZGV2OworfTsKKworc3RhdGljIHN0cnVjdCBqel9ncGlvX2NoaXAgano0NzQwX2dwaW9fY2hpcHNbXTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QganpfZ3Bpb19jaGlwICpncGlvX3RvX2p6X2dwaW9fY2hpcCh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gJmp6NDc0MF9ncGlvX2NoaXBzW2dwaW8gPj4gNV07Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGp6X2dwaW9fY2hpcCAqZ3Bpb19jaGlwX3RvX2p6X2dwaW9fY2hpcChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvX2NoaXApCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihncGlvX2NoaXAsIHN0cnVjdCBqel9ncGlvX2NoaXAsIGdwaW9fY2hpcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGp6X2dwaW9fY2hpcCAqaXJxX3RvX2p6X2dwaW9fY2hpcCh1bnNpZ25lZCBpbnQgaXJxKQoreworCXJldHVybiBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQganpfZ3Bpb193cml0ZV9iaXQodW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVkIGludCByZWcpCit7CisJd3JpdGVsKEdQSU9fVE9fQklUKGdwaW8pLCBHUElPX1RPX1JFRyhncGlvLCByZWcpKTsKK30KKworaW50IGp6X2dwaW9fc2V0X2Z1bmN0aW9uKGludCBncGlvLCBlbnVtIGp6X2dwaW9fZnVuY3Rpb24gZnVuY3Rpb24pCit7CisJaWYgKGZ1bmN0aW9uID09IEpaX0dQSU9fRlVOQ19OT05FKSB7CisJCWp6X2dwaW9fd3JpdGVfYml0KGdwaW8sIEpaX1JFR19HUElPX0ZVTkNfQ0xFQVIpOworCQlqel9ncGlvX3dyaXRlX2JpdChncGlvLCBKWl9SRUdfR1BJT19TRUxFQ1RfQ0xFQVIpOworCQlqel9ncGlvX3dyaXRlX2JpdChncGlvLCBKWl9SRUdfR1BJT19UUklHR0VSX0NMRUFSKTsKKwl9IGVsc2UgeworCQlqel9ncGlvX3dyaXRlX2JpdChncGlvLCBKWl9SRUdfR1BJT19GVU5DX1NFVCk7CisJCWp6X2dwaW9fd3JpdGVfYml0KGdwaW8sIEpaX1JFR19HUElPX1RSSUdHRVJfQ0xFQVIpOworCQlzd2l0Y2ggKGZ1bmN0aW9uKSB7CisJCWNhc2UgSlpfR1BJT19GVU5DMToKKwkJCWp6X2dwaW9fd3JpdGVfYml0KGdwaW8sIEpaX1JFR19HUElPX1NFTEVDVF9DTEVBUik7CisJCQlicmVhazsKKwkJY2FzZSBKWl9HUElPX0ZVTkMzOgorCQkJanpfZ3Bpb193cml0ZV9iaXQoZ3BpbywgSlpfUkVHX0dQSU9fVFJJR0dFUl9TRVQpOworCQljYXNlIEpaX0dQSU9fRlVOQzI6IC8qIEZhbGx0cm91Z2ggKi8KKwkJCWp6X2dwaW9fd3JpdGVfYml0KGdwaW8sIEpaX1JFR19HUElPX1NFTEVDVF9TRVQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqel9ncGlvX3NldF9mdW5jdGlvbik7CisKK2ludCBqel9ncGlvX2J1bGtfcmVxdWVzdChjb25zdCBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QgKnJlcXVlc3QsIHNpemVfdCBudW0pCit7CisJc2l6ZV90IGk7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSwgKytyZXF1ZXN0KSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChyZXF1ZXN0LT5ncGlvLCByZXF1ZXN0LT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCQlqel9ncGlvX3NldF9mdW5jdGlvbihyZXF1ZXN0LT5ncGlvLCByZXF1ZXN0LT5mdW5jdGlvbik7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwlmb3IgKC0tcmVxdWVzdDsgaSA+IDA7IC0taSwgLS1yZXF1ZXN0KSB7CisJCWdwaW9fZnJlZShyZXF1ZXN0LT5ncGlvKTsKKwkJanpfZ3Bpb19zZXRfZnVuY3Rpb24ocmVxdWVzdC0+Z3BpbywgSlpfR1BJT19GVU5DX05PTkUpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChqel9ncGlvX2J1bGtfcmVxdWVzdCk7CisKK3ZvaWQganpfZ3Bpb19idWxrX2ZyZWUoY29uc3Qgc3RydWN0IGp6X2dwaW9fYnVsa19yZXF1ZXN0ICpyZXF1ZXN0LCBzaXplX3QgbnVtKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgKytpLCArK3JlcXVlc3QpIHsKKwkJZ3Bpb19mcmVlKHJlcXVlc3QtPmdwaW8pOworCQlqel9ncGlvX3NldF9mdW5jdGlvbihyZXF1ZXN0LT5ncGlvLCBKWl9HUElPX0ZVTkNfTk9ORSk7CisJfQorCit9CitFWFBPUlRfU1lNQk9MX0dQTChqel9ncGlvX2J1bGtfZnJlZSk7CisKK3ZvaWQganpfZ3Bpb19idWxrX3N1c3BlbmQoY29uc3Qgc3RydWN0IGp6X2dwaW9fYnVsa19yZXF1ZXN0ICpyZXF1ZXN0LCBzaXplX3QgbnVtKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgKytpLCArK3JlcXVlc3QpIHsKKwkJanpfZ3Bpb19zZXRfZnVuY3Rpb24ocmVxdWVzdC0+Z3BpbywgSlpfR1BJT19GVU5DX05PTkUpOworCQlqel9ncGlvX3dyaXRlX2JpdChyZXF1ZXN0LT5ncGlvLCBKWl9SRUdfR1BJT19ESVJFQ1RJT05fQ0xFQVIpOworCQlqel9ncGlvX3dyaXRlX2JpdChyZXF1ZXN0LT5ncGlvLCBKWl9SRUdfR1BJT19QVUxMX1NFVCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoanpfZ3Bpb19idWxrX3N1c3BlbmQpOworCit2b2lkIGp6X2dwaW9fYnVsa19yZXN1bWUoY29uc3Qgc3RydWN0IGp6X2dwaW9fYnVsa19yZXF1ZXN0ICpyZXF1ZXN0LCBzaXplX3QgbnVtKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgKytpLCArK3JlcXVlc3QpCisJCWp6X2dwaW9fc2V0X2Z1bmN0aW9uKHJlcXVlc3QtPmdwaW8sIHJlcXVlc3QtPmZ1bmN0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGp6X2dwaW9fYnVsa19yZXN1bWUpOworCit2b2lkIGp6X2dwaW9fZW5hYmxlX3B1bGx1cCh1bnNpZ25lZCBncGlvKQoreworCWp6X2dwaW9fd3JpdGVfYml0KGdwaW8sIEpaX1JFR19HUElPX1BVTExfQ0xFQVIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoanpfZ3Bpb19lbmFibGVfcHVsbHVwKTsKKwordm9pZCBqel9ncGlvX2Rpc2FibGVfcHVsbHVwKHVuc2lnbmVkIGdwaW8pCit7CisJanpfZ3Bpb193cml0ZV9iaXQoZ3BpbywgSlpfUkVHX0dQSU9fUFVMTF9TRVQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoanpfZ3Bpb19kaXNhYmxlX3B1bGx1cCk7CisKK3N0YXRpYyBpbnQganpfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gISEocmVhZGwoQ0hJUF9UT19SRUcoY2hpcCwgSlpfUkVHX0dQSU9fUElOKSkgJiBCSVQoZ3BpbykpOworfQorCitzdGF0aWMgdm9pZCBqel9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJdWludDMyX3QgX19pb21lbSAqcmVnID0gQ0hJUF9UT19SRUcoY2hpcCwgSlpfUkVHX0dQSU9fREFUQV9TRVQpOworCXJlZyArPSAhdmFsdWU7CisJd3JpdGVsKEJJVChncGlvKSwgcmVnKTsKK30KKworc3RhdGljIGludCBqel9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbywKKwlpbnQgdmFsdWUpCit7CisJd3JpdGVsKEJJVChncGlvKSwgQ0hJUF9UT19SRUcoY2hpcCwgSlpfUkVHX0dQSU9fRElSRUNUSU9OX1NFVCkpOworCWp6X2dwaW9fc2V0X3ZhbHVlKGNoaXAsIGdwaW8sIHZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGp6X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCit7CisJd3JpdGVsKEJJVChncGlvKSwgQ0hJUF9UT19SRUcoY2hpcCwgSlpfUkVHX0dQSU9fRElSRUNUSU9OX0NMRUFSKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGp6X2dwaW9fcG9ydF9kaXJlY3Rpb25faW5wdXQoaW50IHBvcnQsIHVpbnQzMl90IG1hc2spCit7CisJd3JpdGVsKG1hc2ssIEdQSU9fVE9fUkVHKHBvcnQsIEpaX1JFR19HUElPX0RJUkVDVElPTl9DTEVBUikpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGp6X2dwaW9fcG9ydF9kaXJlY3Rpb25faW5wdXQpOworCitpbnQganpfZ3Bpb19wb3J0X2RpcmVjdGlvbl9vdXRwdXQoaW50IHBvcnQsIHVpbnQzMl90IG1hc2spCit7CisJd3JpdGVsKG1hc2ssIEdQSU9fVE9fUkVHKHBvcnQsIEpaX1JFR19HUElPX0RJUkVDVElPTl9TRVQpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChqel9ncGlvX3BvcnRfZGlyZWN0aW9uX291dHB1dCk7CisKK3ZvaWQganpfZ3Bpb19wb3J0X3NldF92YWx1ZShpbnQgcG9ydCwgdWludDMyX3QgdmFsdWUsIHVpbnQzMl90IG1hc2spCit7CisJd3JpdGVsKH52YWx1ZSAmIG1hc2ssIEdQSU9fVE9fUkVHKHBvcnQsIEpaX1JFR19HUElPX0RBVEFfQ0xFQVIpKTsKKwl3cml0ZWwodmFsdWUgJiBtYXNrLCBHUElPX1RPX1JFRyhwb3J0LCBKWl9SRUdfR1BJT19EQVRBX1NFVCkpOworfQorRVhQT1JUX1NZTUJPTChqel9ncGlvX3BvcnRfc2V0X3ZhbHVlKTsKKwordWludDMyX3QganpfZ3Bpb19wb3J0X2dldF92YWx1ZShpbnQgcG9ydCwgdWludDMyX3QgbWFzaykKK3sKKwl1aW50MzJfdCB2YWx1ZSA9IHJlYWRsKEdQSU9fVE9fUkVHKHBvcnQsIEpaX1JFR19HUElPX1BJTikpOworCisJcmV0dXJuIHZhbHVlICYgbWFzazsKK30KK0VYUE9SVF9TWU1CT0woanpfZ3Bpb19wb3J0X2dldF92YWx1ZSk7CisKK2ludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBKWjQ3NDBfSVJRX0dQSU8oMCkgKyBncGlvOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ3Bpb190b19pcnEpOworCitpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQoreworCXJldHVybiBpcnEgLSBKWjQ3NDBfSVJRX0dQSU8oMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfdG9fZ3Bpbyk7CisKKyNkZWZpbmUgSVJRX1RPX0JJVChpcnEpIEJJVChpcnFfdG9fZ3BpbyhpcnEpICYgMHgxZikKKworc3RhdGljIHZvaWQganpfZ3Bpb19jaGVja190cmlnZ2VyX2JvdGgoc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGlycSkKK3sKKwl1aW50MzJfdCB2YWx1ZTsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1aW50MzJfdCBtYXNrID0gSVJRX1RPX0JJVChpcnEpOworCisJaWYgKCEoY2hpcC0+ZWRnZV90cmlnZ2VyX2JvdGggJiBtYXNrKSkKKwkJcmV0dXJuOworCisJcmVnID0gY2hpcC0+YmFzZTsKKworCXZhbHVlID0gcmVhZGwoY2hpcC0+YmFzZSArIEpaX1JFR19HUElPX1BJTik7CisJaWYgKHZhbHVlICYgbWFzaykKKwkJcmVnICs9IEpaX1JFR19HUElPX0RJUkVDVElPTl9DTEVBUjsKKwllbHNlCisJCXJlZyArPSBKWl9SRUdfR1BJT19ESVJFQ1RJT05fU0VUOworCisJd3JpdGVsKG1hc2ssIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGp6X2dwaW9faXJxX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXVpbnQzMl90IGZsYWc7CisJdW5zaWduZWQgaW50IGdwaW9faXJxOworCXVuc2lnbmVkIGludCBncGlvX2Jhbms7CisJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGdldF9pcnFfZGVzY19kYXRhKGRlc2MpOworCisJZ3Bpb19iYW5rID0gSlo0NzQwX0lSUV9HUElPMCAtIGlycTsKKworCWZsYWcgPSByZWFkbChjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fRkxBRyk7CisKKwlpZiAoIWZsYWcpCisJCXJldHVybjsKKworCWdwaW9faXJxID0gX19mbHMoZmxhZyk7CisKKwlqel9ncGlvX2NoZWNrX3RyaWdnZXJfYm90aChjaGlwLCBpcnEpOworCisJZ3Bpb19pcnEgKz0gKGdwaW9fYmFuayA8PCA1KSArIEpaNDc0MF9JUlFfR1BJTygwKTsKKworCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX2lycSk7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQganpfZ3Bpb19zZXRfaXJxX2JpdCh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXAgPSBpcnFfdG9fanpfZ3Bpb19jaGlwKGlycSk7CisJd3JpdGVsKElSUV9UT19CSVQoaXJxKSwgY2hpcC0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGp6X2dwaW9faXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fTUFTS19TRVQpOworfTsKKworc3RhdGljIHZvaWQganpfZ3Bpb19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGlycV90b19qel9ncGlvX2NoaXAoaXJxKTsKKworCWp6X2dwaW9fY2hlY2tfdHJpZ2dlcl9ib3RoKGNoaXAsIGlycSk7CisKKwlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fTUFTS19DTEVBUik7Cit9OworCisvKiBUT0RPOiBDaGVjayBpZiBmdW5jdGlvbiBpcyBncGlvICovCitzdGF0aWMgdW5zaWduZWQgaW50IGp6X2dwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJanpfZ3Bpb19zZXRfaXJxX2JpdChpcnEsIEpaX1JFR19HUElPX1NFTEVDVF9TRVQpOworCisJZGVzYy0+c3RhdHVzICY9IH5JUlFfTUFTS0VEOworCWp6X2dwaW9faXJxX3VubWFzayhpcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGp6X2dwaW9faXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWp6X2dwaW9faXJxX21hc2soaXJxKTsKKwlkZXNjLT5zdGF0dXMgfD0gSVJRX01BU0tFRDsKKworCS8qIFNldCBkaXJlY3Rpb24gdG8gaW5wdXQgKi8KKwlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fRElSRUNUSU9OX0NMRUFSKTsKKwlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fU0VMRUNUX0NMRUFSKTsKK30KKworc3RhdGljIHZvaWQganpfZ3Bpb19pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJanpfZ3Bpb19zZXRfaXJxX2JpdChpcnEsIEpaX1JFR19HUElPX0ZMQUdfQ0xFQVIpOworfTsKKworc3RhdGljIGludCBqel9ncGlvX2lycV9zZXRfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQoreworCXN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXAgPSBpcnFfdG9fanpfZ3Bpb19jaGlwKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWp6X2dwaW9faXJxX21hc2soaXJxKTsKKworCWlmIChmbG93X3R5cGUgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7CisJCXVpbnQzMl90IHZhbHVlID0gcmVhZGwoY2hpcC0+YmFzZSArIEpaX1JFR19HUElPX1BJTik7CisJCWlmICh2YWx1ZSAmIElSUV9UT19CSVQoaXJxKSkKKwkJCWZsb3dfdHlwZSA9IElSUV9UWVBFX0VER0VfRkFMTElORzsKKwkJZWxzZQorCQkJZmxvd190eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkc7CisJCWNoaXAtPmVkZ2VfdHJpZ2dlcl9ib3RoIHw9IElSUV9UT19CSVQoaXJxKTsKKwl9IGVsc2UgeworCQljaGlwLT5lZGdlX3RyaWdnZXJfYm90aCAmPSB+SVJRX1RPX0JJVChpcnEpOworCX0KKworCXN3aXRjaCAoZmxvd190eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJanpfZ3Bpb19zZXRfaXJxX2JpdChpcnEsIEpaX1JFR19HUElPX0RJUkVDVElPTl9TRVQpOworCQlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fVFJJR0dFUl9TRVQpOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJanpfZ3Bpb19zZXRfaXJxX2JpdChpcnEsIEpaX1JFR19HUElPX0RJUkVDVElPTl9DTEVBUik7CisJCWp6X2dwaW9fc2V0X2lycV9iaXQoaXJxLCBKWl9SRUdfR1BJT19UUklHR0VSX1NFVCk7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJanpfZ3Bpb19zZXRfaXJxX2JpdChpcnEsIEpaX1JFR19HUElPX0RJUkVDVElPTl9TRVQpOworCQlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fVFJJR0dFUl9DTEVBUik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQlqel9ncGlvX3NldF9pcnFfYml0KGlycSwgSlpfUkVHX0dQSU9fRElSRUNUSU9OX0NMRUFSKTsKKwkJanpfZ3Bpb19zZXRfaXJxX2JpdChpcnEsIEpaX1JFR19HUElPX1RSSUdHRVJfQ0xFQVIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShkZXNjLT5zdGF0dXMgJiBJUlFfTUFTS0VEKSkKKwkJanpfZ3Bpb19pcnFfdW5tYXNrKGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9ncGlvX2lycV9zZXRfd2FrZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgb24pCit7CisJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGlycV90b19qel9ncGlvX2NoaXAoaXJxKTsKKwlzcGluX2xvY2soJmNoaXAtPmxvY2spOworCWlmIChvbikKKwkJY2hpcC0+d2FrZXVwIHw9IElSUV9UT19CSVQoaXJxKTsKKwllbHNlCisJCWNoaXAtPndha2V1cCAmPSB+SVJRX1RPX0JJVChpcnEpOworCXNwaW5fdW5sb2NrKCZjaGlwLT5sb2NrKTsKKworCXNldF9pcnFfd2FrZShjaGlwLT5pcnEsIG9uKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgbG9jayBjbGFzcyB0ZWxscyBsb2NrZGVwIHRoYXQgR1BJTyBpcnFzIGFyZSBpbiBhIGRpZmZlcmVudAorICogY2F0ZWdvcnkgdGhhbiB0aGVpciBwYXJlbnRzLCBzbyBpdCB3b24ndCByZXBvcnQgZmFsc2UgcmVjdXJzaW9uLgorICovCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKKworI2RlZmluZSBKWjQ3NDBfR1BJT19DSElQKF9iYW5rKSB7IFwKKwkuaXJxX2Jhc2UgPSBKWjQ3NDBfSVJRX0dQSU9fQkFTRV8gIyMgX2JhbmssIFwKKwkuZ3Bpb19jaGlwID0geyBcCisJCS5sYWJlbCA9ICJCYW5rICIgIyBfYmFuaywgXAorCQkub3duZXIgPSBUSElTX01PRFVMRSwgXAorCQkuc2V0ID0ganpfZ3Bpb19zZXRfdmFsdWUsIFwKKwkJLmdldCA9IGp6X2dwaW9fZ2V0X3ZhbHVlLCBcCisJCS5kaXJlY3Rpb25fb3V0cHV0ID0ganpfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LCBcCisJCS5kaXJlY3Rpb25faW5wdXQgPSBqel9ncGlvX2RpcmVjdGlvbl9pbnB1dCwgXAorCQkuYmFzZSA9IEpaNDc0MF9HUElPX0JBU0VfICMjIF9iYW5rLCBcCisJCS5uZ3BpbyA9IEpaNDc0MF9HUElPX05VTV8gIyMgX2JhbmssIFwKKwl9LCBcCisJLmlycV9jaGlwID0gIHsgXAorCQkubmFtZSA9ICJHUElPIEJhbmsgIiAjIF9iYW5rLCBcCisJCS5tYXNrID0ganpfZ3Bpb19pcnFfbWFzaywgXAorCQkudW5tYXNrID0ganpfZ3Bpb19pcnFfdW5tYXNrLCBcCisJCS5hY2sgPSBqel9ncGlvX2lycV9hY2ssIFwKKwkJLnN0YXJ0dXAgPSBqel9ncGlvX2lycV9zdGFydHVwLCBcCisJCS5zaHV0ZG93biA9IGp6X2dwaW9faXJxX3NodXRkb3duLCBcCisJCS5zZXRfdHlwZSA9IGp6X2dwaW9faXJxX3NldF90eXBlLCBcCisJCS5zZXRfd2FrZSA9IGp6X2dwaW9faXJxX3NldF93YWtlLCBcCisJfSwgXAorfQorCitzdGF0aWMgc3RydWN0IGp6X2dwaW9fY2hpcCBqejQ3NDBfZ3Bpb19jaGlwc1tdID0geworCUpaNDc0MF9HUElPX0NISVAoQSksCisJSlo0NzQwX0dQSU9fQ0hJUChCKSwKKwlKWjQ3NDBfR1BJT19DSElQKEMpLAorCUpaNDc0MF9HUElPX0NISVAoRCksCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqel9ncGlvX2NoaXAgKnN5c2Rldl90b19jaGlwKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBqel9ncGlvX2NoaXAsIHN5c2Rldik7Cit9CisKK3N0YXRpYyBpbnQgano0NzQwX2dwaW9fc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IHN5c2Rldl90b19jaGlwKGRldik7CisKKwljaGlwLT5zdXNwZW5kX21hc2sgPSByZWFkbChjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fTUFTSyk7CisJd3JpdGVsKH4oY2hpcC0+d2FrZXVwKSwgY2hpcC0+YmFzZSArIEpaX1JFR19HUElPX01BU0tfU0VUKTsKKwl3cml0ZWwoY2hpcC0+d2FrZXVwLCBjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fTUFTS19DTEVBUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqejQ3NDBfZ3Bpb19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QganpfZ3Bpb19jaGlwICpjaGlwID0gc3lzZGV2X3RvX2NoaXAoZGV2KTsKKwl1aW50MzJfdCBtYXNrID0gY2hpcC0+c3VzcGVuZF9tYXNrOworCisJd3JpdGVsKH5tYXNrLCBjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fTUFTS19DTEVBUik7CisJd3JpdGVsKG1hc2ssIGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19NQVNLX1NFVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgano0NzQwX2dwaW9fc3lzZGV2X2NsYXNzID0geworCS5uYW1lID0gImdwaW8iLAorCS5zdXNwZW5kID0gano0NzQwX2dwaW9fc3VzcGVuZCwKKwkucmVzdW1lID0gano0NzQwX2dwaW9fcmVzdW1lLAorfTsKKworc3RhdGljIGludCBqejQ3NDBfZ3Bpb19jaGlwX2luaXQoc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGlkKQoreworCWludCByZXQsIGlycTsKKworCWNoaXAtPnN5c2Rldi5pZCA9IGlkOworCWNoaXAtPnN5c2Rldi5jbHMgPSAmano0NzQwX2dwaW9fc3lzZGV2X2NsYXNzOworCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmY2hpcC0+c3lzZGV2KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+bG9jayk7CisKKwljaGlwLT5iYXNlID0gaW9yZW1hcChKWjQ3NDBfR1BJT19CQVNFX0FERFIgKyAoaWQgKiAweDEwMCksIDB4MTAwKTsKKworCWdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpb19jaGlwKTsKKworCWNoaXAtPmlycSA9IEpaNDc0MF9JUlFfSU5UQ19HUElPKGlkKTsKKwlzZXRfaXJxX2RhdGEoY2hpcC0+aXJxLCBjaGlwKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihjaGlwLT5pcnEsIGp6X2dwaW9faXJxX2RlbXV4X2hhbmRsZXIpOworCisJZm9yIChpcnEgPSBjaGlwLT5pcnFfYmFzZTsgaXJxIDwgY2hpcC0+aXJxX2Jhc2UgKyBjaGlwLT5ncGlvX2NoaXAubmdwaW87ICsraXJxKSB7CisJCWxvY2tkZXBfc2V0X2NsYXNzKCZpcnFfZGVzY1tpcnFdLmxvY2ssICZncGlvX2xvY2tfY2xhc3MpOworCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsIGNoaXApOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmY2hpcC0+aXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBqejQ3NDBfZ3Bpb19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3Rlcigmano0NzQwX2dwaW9fc3lzZGV2X2NsYXNzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoano0NzQwX2dwaW9fY2hpcHMpOyArK2kpCisJCWp6NDc0MF9ncGlvX2NoaXBfaW5pdCgmano0NzQwX2dwaW9fY2hpcHNbaV0sIGkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSlo0NzQwIEdQSU8gaW5pdGFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoano0NzQwX2dwaW9faW5pdCk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2VxX3JlZyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXAsCisJY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzZXFfcHJpbnRmKHMsICJcdCVzOiAlMDh4XG4iLCBuYW1lLCByZWFkbChjaGlwLT5iYXNlICsgcmVnKSk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWdzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGp6NDc0MF9ncGlvX2NoaXBzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoano0NzQwX2dwaW9fY2hpcHMpOyArK2ksICsrY2hpcCkgeworCQlzZXFfcHJpbnRmKHMsICI9PUdQSU8gJWQ9PVxuIiwgaSk7CisJCWdwaW9fc2VxX3JlZyhzLCBjaGlwLCAiUGluIiwgSlpfUkVHX0dQSU9fUElOKTsKKwkJZ3Bpb19zZXFfcmVnKHMsIGNoaXAsICJEYXRhIiwgSlpfUkVHX0dQSU9fREFUQSk7CisJCWdwaW9fc2VxX3JlZyhzLCBjaGlwLCAiTWFzayIsIEpaX1JFR19HUElPX01BU0spOworCQlncGlvX3NlcV9yZWcocywgY2hpcCwgIlB1bGwiLCBKWl9SRUdfR1BJT19QVUxMKTsKKwkJZ3Bpb19zZXFfcmVnKHMsIGNoaXAsICJGdW5jIiwgSlpfUkVHX0dQSU9fRlVOQyk7CisJCWdwaW9fc2VxX3JlZyhzLCBjaGlwLCAiU2VsZWN0IiwgSlpfUkVHX0dQSU9fU0VMRUNUKTsKKwkJZ3Bpb19zZXFfcmVnKHMsIGNoaXAsICJEaXJlY3Rpb24iLCBKWl9SRUdfR1BJT19ESVJFQ1RJT04pOworCQlncGlvX3NlcV9yZWcocywgY2hpcCwgIlRyaWdnZXIiLCBKWl9SRUdfR1BJT19UUklHR0VSKTsKKwkJZ3Bpb19zZXFfcmVnKHMsIGNoaXAsICJGbGFnIiwgSlpfUkVHX0dQSU9fRkxBRyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWdzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGdwaW9fcmVnc19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3Bpb19yZWdzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gZ3Bpb19yZWdzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdwaW9fZGVidWdmc19pbml0KHZvaWQpCit7CisJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoImp6X3JlZ3NfZ3BpbyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCU5VTEwsIE5VTEwsICZncGlvX3JlZ3Nfb3BlcmF0aW9ucyk7CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwoZ3Bpb19kZWJ1Z2ZzX2luaXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmMgYi9hcmNoL21pcHMvano0NzQwL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzNmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL2lycS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqICBKWjQ3NDAgcGxhdGZvcm0gSVJRIHN1cHBvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KKworc3RhdGljIHZvaWQgX19pb21lbSAqanpfaW50Y19iYXNlOworc3RhdGljIHVpbnQzMl90IGp6X2ludGNfd2FrZXVwOworc3RhdGljIHVpbnQzMl90IGp6X2ludGNfc2F2ZWQ7CisKKyNkZWZpbmUgSlpfUkVHX0lOVENfU1RBVFVTCTB4MDAKKyNkZWZpbmUgSlpfUkVHX0lOVENfTUFTSwkweDA0CisjZGVmaW5lIEpaX1JFR19JTlRDX1NFVF9NQVNLCTB4MDgKKyNkZWZpbmUgSlpfUkVHX0lOVENfQ0xFQVJfTUFTSwkweDBjCisjZGVmaW5lIEpaX1JFR19JTlRDX1BFTkRJTkcJMHgxMAorCisjZGVmaW5lIElSUV9CSVQoeCkgQklUKCh4KSAtIEpaNDc0MF9JUlFfQkFTRSkKKworc3RhdGljIHZvaWQgaW50Y19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJd3JpdGVsKElSUV9CSVQoaXJxKSwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfQ0xFQVJfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGludGNfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl3cml0ZWwoSVJRX0JJVChpcnEpLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19TRVRfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgaW50Y19pcnFfc2V0X3dha2UodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IG9uKQoreworCWlmIChvbikKKwkJanpfaW50Y193YWtldXAgfD0gSVJRX0JJVChpcnEpOworCWVsc2UKKwkJanpfaW50Y193YWtldXAgJj0gfklSUV9CSVQoaXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGludGNfaXJxX3R5cGUgPSB7CisJLm5hbWUgPQkJIklOVEMiLAorCS5tYXNrID0JCWludGNfaXJxX21hc2ssCisJLm1hc2tfYWNrID0JaW50Y19pcnFfbWFzaywKKwkudW5tYXNrID0JaW50Y19pcnFfdW5tYXNrLAorCS5zZXRfd2FrZSA9CWludGNfaXJxX3NldF93YWtlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGp6NDc0MF9jYXNjYWRlKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJdWludDMyX3QgaXJxX3JlZzsKKworCWlycV9yZWcgPSByZWFkbChqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19QRU5ESU5HKTsKKworCWlmIChpcnFfcmVnKQorCQlnZW5lcmljX2hhbmRsZV9pcnEoX19mbHMoaXJxX3JlZykgKyBKWjQ3NDBfSVJRX0JBU0UpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBqejQ3NDBfY2FzY2FkZV9hY3Rpb24gPSB7CisJLmhhbmRsZXIgPSBqejQ3NDBfY2FzY2FkZSwKKwkubmFtZSA9ICJKWjQ3NDAgY2FzY2FkZSBpbnRlcnJ1cHQiLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQoreworCWludCBpOworCW1pcHNfY3B1X2lycV9pbml0KCk7CisKKwlqel9pbnRjX2Jhc2UgPSBpb3JlbWFwKEpaNDc0MF9JTlRDX0JBU0VfQUREUiwgMHgxNCk7CisKKwlmb3IgKGkgPSBKWjQ3NDBfSVJRX0JBU0U7IGkgPCBKWjQ3NDBfSVJRX0JBU0UgKyAzMjsgaSsrKSB7CisJCWludGNfaXJxX21hc2soaSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmaW50Y19pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CisJfQorCisJc2V0dXBfaXJxKDIsICZqejQ3NDBfY2FzY2FkZV9hY3Rpb24pOworfQorCithc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGVuZGluZyA9IHJlYWRfYzBfc3RhdHVzKCkgJiByZWFkX2MwX2NhdXNlKCkgJiBTVDBfSU07CisJaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQMikKKwkJZG9fSVJRKDIpOworCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQMykKKwkJZG9fSVJRKDMpOworCWVsc2UKKwkJc3B1cmlvdXNfaW50ZXJydXB0KCk7Cit9CisKK3ZvaWQgano0NzQwX2ludGNfc3VzcGVuZCh2b2lkKQoreworCWp6X2ludGNfc2F2ZWQgPSByZWFkbChqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19NQVNLKTsKKwl3cml0ZWwofmp6X2ludGNfd2FrZXVwLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19TRVRfTUFTSyk7CisJd3JpdGVsKGp6X2ludGNfd2FrZXVwLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19DTEVBUl9NQVNLKTsKK30KKwordm9pZCBqejQ3NDBfaW50Y19yZXN1bWUodm9pZCkKK3sKKwl3cml0ZWwofmp6X2ludGNfc2F2ZWQsIGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX0NMRUFSX01BU0spOworCXdyaXRlbChqel9pbnRjX3NhdmVkLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19TRVRfTUFTSyk7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworc3RhdGljIGlubGluZSB2b2lkIGludGNfc2VxX3JlZyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNvbnN0IGNoYXIgKm5hbWUsCisJdW5zaWduZWQgaW50IHJlZykKK3sKKwlzZXFfcHJpbnRmKHMsICIlczpcdFx0JTA4eFxuIiwgbmFtZSwgcmVhZGwoanpfaW50Y19iYXNlICsgcmVnKSk7Cit9CisKK3N0YXRpYyBpbnQgaW50Y19yZWdzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJaW50Y19zZXFfcmVnKHMsICJTdGF0dXMiLCBKWl9SRUdfSU5UQ19TVEFUVVMpOworCWludGNfc2VxX3JlZyhzLCAiTWFzayIsIEpaX1JFR19JTlRDX01BU0spOworCWludGNfc2VxX3JlZyhzLCAiUGVuZGluZyIsIEpaX1JFR19JTlRDX1BFTkRJTkcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50Y19yZWdzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGludGNfcmVnc19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW50Y19yZWdzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gaW50Y19yZWdzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGludGNfZGVidWdmc19pbml0KHZvaWQpCit7CisJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoImp6X3JlZ3NfaW50YyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCU5VTEwsIE5VTEwsICZpbnRjX3JlZ3Nfb3BlcmF0aW9ucyk7CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwoaW50Y19kZWJ1Z2ZzX2luaXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmggYi9hcmNoL21pcHMvano0NzQwL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjVlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL2lycS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fTUlQU19KWjQ3NDBfSVJRX0hfXworI2RlZmluZSBfX01JUFNfSlo0NzQwX0lSUV9IX18KKworZXh0ZXJuIHZvaWQgano0NzQwX2ludGNfc3VzcGVuZCh2b2lkKTsKK2V4dGVybiB2b2lkIGp6NDc0MF9pbnRjX3Jlc3VtZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvano0NzQwL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViYzJiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvcGxhdGZvcm0uYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHBsYXRmb3JtIGRldmljZXMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJjbG9jay5oIgorCisvKiBPSENJIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugano0NzQwX3VzYl9vaGNpX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gSlo0NzQwX1VIQ19CQVNFX0FERFIsCisJCS5lbmQJPSBKWjQ3NDBfVUhDX0JBU0VfQUREUiArIDB4MTAwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBKWjQ3NDBfSVJRX1VIQywKKwkJLmVuZAk9IEpaNDc0MF9JUlFfVUhDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfdXNiX29oY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJqejQ3NDAtb2hjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayA9ICZqejQ3NDBfdXNiX29oY2lfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqejQ3NDBfdXNiX29oY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBqejQ3NDBfdXNiX29oY2lfcmVzb3VyY2VzLAorfTsKKworLyogVURDIChVU0IgZ2FkZ2V0IGNvbnRyb2xsZXIpICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF91c2JfZ2R0X3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gSlo0NzQwX1VEQ19CQVNFX0FERFIsCisJCS5lbmQJPSBKWjQ3NDBfVURDX0JBU0VfQUREUiArIDB4MTAwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBKWjQ3NDBfSVJRX1VEQywKKwkJLmVuZAk9IEpaNDc0MF9JUlFfVURDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfdWRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAianotdWRjIiwKKwkuaWQJCT0gLTEsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrID0gJmp6NDc0MF91ZGNfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqejQ3NDBfdXNiX2dkdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGp6NDc0MF91c2JfZ2R0X3Jlc291cmNlcywKK307CisKKy8qIE1NQy9TRCBjb250cm9sbGVyICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF9tbWNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBKWjQ3NDBfTVNDX0JBU0VfQUREUiwKKwkJLmVuZAk9IEpaNDc0MF9NU0NfQkFTRV9BRERSICsgMHgxMDAwIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IEpaNDc0MF9JUlFfTVNDLAorCQkuZW5kCT0gSlo0NzQwX0lSUV9NU0MsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX21tY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImp6NDc0MC1tbWMiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayA9ICZqejQ3NDBfbW1jX2RldmljZS5kZXYuY29oZXJlbnRfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGp6NDc0MF9tbWNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBqejQ3NDBfbW1jX3Jlc291cmNlcywKK307CisKKy8qIFJUQyBjb250cm9sbGVyICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF9ydGNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBKWjQ3NDBfUlRDX0JBU0VfQUREUiwKKwkJLmVuZAk9IEpaNDc0MF9SVENfQkFTRV9BRERSICsgMHgzOCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgID0gSlo0NzQwX0lSUV9SVEMsCisJCS5lbmQJPSBKWjQ3NDBfSVJRX1JUQywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX3J0Y19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImp6NDc0MC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoano0NzQwX3J0Y19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGp6NDc0MF9ydGNfcmVzb3VyY2VzLAorfTsKKworLyogSTJDIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugano0NzQwX2kyY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IEpaNDc0MF9JMkNfQkFTRV9BRERSLAorCQkuZW5kCT0gSlo0NzQwX0kyQ19CQVNFX0FERFIgKyAweDEwMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gSlo0NzQwX0lSUV9JMkMsCisJCS5lbmQJPSBKWjQ3NDBfSVJRX0kyQywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfaTJjX2RldmljZSA9IHsKKwkubmFtZQkJPSAiano0NzQwLWkyYyIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShqejQ3NDBfaTJjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gano0NzQwX2kyY19yZXNvdXJjZXMsCit9OworCisvKiBOQU5EIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugano0NzQwX25hbmRfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJtbWlvIiwKKwkJLnN0YXJ0CT0gSlo0NzQwX0VNQ19CQVNFX0FERFIsCisJCS5lbmQJPSBKWjQ3NDBfRU1DX0JBU0VfQUREUiArIDB4MTAwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZQk9ICJiYW5rIiwKKwkJLnN0YXJ0CT0gMHgxODAwMDAwMCwKKwkJLmVuZAk9IDB4MTgwQzAwMDAgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfbmFuZF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiano0NzQwLW5hbmQiLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShqejQ3NDBfbmFuZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGp6NDc0MF9uYW5kX3Jlc291cmNlcywKK307CisKKy8qIExDRCBjb250cm9sbGVyICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF9mcmFtZWJ1ZmZlcl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IEpaNDc0MF9MQ0RfQkFTRV9BRERSLAorCQkuZW5kCT0gSlo0NzQwX0xDRF9CQVNFX0FERFIgKyAweDEwMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfZnJhbWVidWZmZXJfZGV2aWNlID0geworCS5uYW1lCQk9ICJqejQ3NDAtZmIiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoano0NzQwX2ZyYW1lYnVmZmVyX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gano0NzQwX2ZyYW1lYnVmZmVyX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmano0NzQwX2ZyYW1lYnVmZmVyX2RldmljZS5kZXYuY29oZXJlbnRfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisKKy8qIEkyUyBjb250cm9sbGVyICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGp6NDc0MF9pMnNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBKWjQ3NDBfQUlDX0JBU0VfQUREUiwKKwkJLmVuZAk9IEpaNDc0MF9BSUNfQkFTRV9BRERSICsgMHgzOCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGp6NDc0MF9pMnNfZGV2aWNlID0geworCS5uYW1lCQk9ICJqejQ3NDAtaTJzIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGp6NDc0MF9pMnNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBqejQ3NDBfaTJzX3Jlc291cmNlcywKK307CisKKy8qIFBDTSAqLworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfcGNtX2RldmljZSA9IHsKKwkubmFtZQkJPSAiano0NzQwLXBjbSIsCisJLmlkCQk9IC0xLAorfTsKKworLyogQ29kZWMgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugano0NzQwX2NvZGVjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gSlo0NzQwX0FJQ19CQVNFX0FERFIgKyAweDgwLAorCQkuZW5kCT0gSlo0NzQwX0FJQ19CQVNFX0FERFIgKyAweDg4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX2NvZGVjX2RldmljZSA9IHsKKwkubmFtZQkJPSAiano0NzQwLWNvZGVjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGp6NDc0MF9jb2RlY19yZXNvdXJjZXMsCit9OworCisvKiBBREMgY29udHJvbGxlciAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBqejQ3NDBfYWRjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gSlo0NzQwX1NBRENfQkFTRV9BRERSLAorCQkuZW5kCT0gSlo0NzQwX1NBRENfQkFTRV9BRERSICsgMHgzMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IEpaNDc0MF9JUlFfU0FEQywKKwkJLmVuZAk9IEpaNDc0MF9JUlFfU0FEQywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydAk9IEpaNDc0MF9JUlFfQURDX0JBU0UsCisJCS5lbmQJPSBKWjQ3NDBfSVJRX0FEQ19CQVNFLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBqejQ3NDBfYWRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAiano0NzQwLWFkYyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqejQ3NDBfYWRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gano0NzQwX2FkY19yZXNvdXJjZXMsCit9OworCisvKiBTZXJpYWwgKi8KKyNkZWZpbmUgSlo0NzQwX1VBUlRfREFUQShfaWQpIFwKKwl7IFwKKwkJLmZsYWdzID0gVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQIHwgVVBGX0ZJWEVEX1RZUEUsIFwKKwkJLmlvdHlwZSA9IFVQSU9fTUVNLCBcCisJCS5yZWdzaGlmdCA9IDIsIFwKKwkJLnNlcmlhbF9vdXQgPSBqejQ3NDBfc2VyaWFsX291dCwgXAorCQkudHlwZSA9IFBPUlRfMTY1NTAsIFwKKwkJLm1hcGJhc2UgPSBKWjQ3NDBfVUFSVCAjIyBfaWQgIyMgX0JBU0VfQUREUiwgXAorCQkuaXJxID0gSlo0NzQwX0lSUV9VQVJUICMjIF9pZCwgXAorCX0KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBqejQ3NDBfdWFydF9kYXRhW10gPSB7CisJSlo0NzQwX1VBUlRfREFUQSgwKSwKKwlKWjQ3NDBfVUFSVF9EQVRBKDEpLAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugano0NzQwX3VhcnRfZGV2aWNlID0geworCS5uYW1lID0gInNlcmlhbDgyNTAiLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSBqejQ3NDBfdWFydF9kYXRhLAorCX0sCit9OworCit2b2lkIGp6NDc0MF9zZXJpYWxfZGV2aWNlX3JlZ2lzdGVyKHZvaWQpCit7CisJc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwOworCisJZm9yIChwID0gano0NzQwX3VhcnRfZGF0YTsgcC0+ZmxhZ3MgIT0gMDsgKytwKQorCQlwLT51YXJ0Y2xrID0gano0NzQwX2Nsb2NrX2JkYXRhLmV4dF9yYXRlOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZqejQ3NDBfdWFydF9kZXZpY2UpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9wbS5jIGIvYXJjaC9taXBzL2p6NDc0MC9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTk0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL3BtLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoJSlo0NzQwIFNvQyBwb3dlciBtYW5hZ2VtZW50IHN1cHBvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvY2xvY2suaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiaXJxLmgiCisKK3N0YXRpYyBpbnQgano0NzQwX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlqejQ3NDBfaW50Y19zdXNwZW5kKCk7CisJano0NzQwX2Nsb2NrX3N1c3BlbmQoKTsKKworCWp6NDc0MF9jbG9ja19zZXRfd2FpdF9tb2RlKEpaNDc0MF9XQUlUX01PREVfU0xFRVApOworCisJX19hc21fXygiLnNldFx0bWlwczNcblx0IgorCQkid2FpdFxuXHQiCisJCSIuc2V0XHRtaXBzMCIpOworCisJano0NzQwX2Nsb2NrX3NldF93YWl0X21vZGUoSlo0NzQwX1dBSVRfTU9ERV9JRExFKTsKKworCWp6NDc0MF9jbG9ja19yZXN1bWUoKTsKKwlqejQ3NDBfaW50Y19yZXN1bWUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGp6NDc0MF9wbV9vcHMgPSB7CisJLnZhbGlkCQk9IHN1c3BlbmRfdmFsaWRfb25seV9tZW0sCisJLmVudGVyCQk9IGp6NDc0MF9wbV9lbnRlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGp6NDc0MF9wbV9pbml0KHZvaWQpCit7CisJc3VzcGVuZF9zZXRfb3BzKCZqejQ3NDBfcG1fb3BzKTsKKwlyZXR1cm4gMDsKKworfQorbGF0ZV9pbml0Y2FsbChqejQ3NDBfcG1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL3Byb20uYyBiL2FyY2gvbWlwcy9qejQ3NDAvcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWFjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL3Byb20uYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBwcm9tIGNvZGUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KKwordm9pZCBqejQ3NDBfaW5pdF9jbWRsaW5lKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gQ09NTUFORF9MSU5FX1NJWkUgLSAxOworCWludCBpOworCWNoYXIgKmRzdCA9ICYoYXJjc19jbWRsaW5lWzBdKTsKKwljaGFyICpzcmM7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAmJiBjb3VudDsgKytpKSB7CisJCXNyYyA9IGFyZ3ZbaV07CisJCXdoaWxlICgqc3JjICYmIGNvdW50KSB7CisJCQkqZHN0KysgPSAqc3JjKys7CisJCQktLWNvdW50OworCQl9CisJCSpkc3QrKyA9ICcgJzsKKwl9CisJaWYgKGkgPiAxKQorCQktLWRzdDsKKworCSpkc3QgPSAwOworfQorCit2b2lkIF9faW5pdCBwcm9tX2luaXQodm9pZCkKK3sKKwlqejQ3NDBfaW5pdF9jbWRsaW5lKChpbnQpZndfYXJnMCwgKGNoYXIgKiopZndfYXJnMSk7CisJbWlwc19tYWNodHlwZSA9IE1BQ0hfSU5HRU5JQ19KWjQ3NDA7Cit9CisKK3ZvaWQgX19pbml0IHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQoreworfQorCisjZGVmaW5lIFVBUlRfUkVHKF9yZWcpICgodm9pZCBfX2lvbWVtICopQ0tTRUcxQUREUihKWjQ3NDBfVUFSVDBfQkFTRV9BRERSICsgKF9yZWcgPDwgMikpKQorCit2b2lkIHByb21fcHV0Y2hhcihjaGFyIGMpCit7CisJdWludDhfdCBsc3I7CisKKwlkbyB7CisJCWxzciA9IHJlYWRiKFVBUlRfUkVHKFVBUlRfTFNSKSk7CisJfSB3aGlsZSAoKGxzciAmIFVBUlRfTFNSX1RFTVQpID09IDApOworCisJd3JpdGViKGMsIFVBUlRfUkVHKFVBUlRfVFgpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvcHdtLmMgYi9hcmNoL21pcHMvano0NzQwL3B3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNmE2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL3B3bS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHBsYXRmb3JtIFBXTSBzdXBwb3J0CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcHdtLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2dwaW8uaD4KKyNpbmNsdWRlICJ0aW1lci5oIgorCitzdGF0aWMgc3RydWN0IGNsayAqano0NzQwX3B3bV9jbGs7CisKK0RFRklORV9NVVRFWChqejQ3NDBfcHdtX211dGV4KTsKKworc3RydWN0IHB3bV9kZXZpY2UgeworCXVuc2lnbmVkIGludCBpZDsKKwl1bnNpZ25lZCBpbnQgZ3BpbzsKKwlib29sIHVzZWQ7Cit9OworCitzdGF0aWMgc3RydWN0IHB3bV9kZXZpY2Ugano0NzQwX3B3bV9saXN0W10gPSB7CisJeyAyLCBKWl9HUElPX1BXTTIsIGZhbHNlIH0sCisJeyAzLCBKWl9HUElPX1BXTTMsIGZhbHNlIH0sCisJeyA0LCBKWl9HUElPX1BXTTQsIGZhbHNlIH0sCisJeyA1LCBKWl9HUElPX1BXTTUsIGZhbHNlIH0sCisJeyA2LCBKWl9HUElPX1BXTTYsIGZhbHNlIH0sCisJeyA3LCBKWl9HUElPX1BXTTcsIGZhbHNlIH0sCit9OworCitzdHJ1Y3QgcHdtX2RldmljZSAqcHdtX3JlcXVlc3QoaW50IGlkLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcHdtX2RldmljZSAqcHdtOworCisJaWYgKGlkIDwgMiB8fCBpZCA+IDcgfHwgIWp6NDc0MF9wd21fY2xrKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCW11dGV4X2xvY2soJmp6NDc0MF9wd21fbXV0ZXgpOworCisJcHdtID0gJmp6NDc0MF9wd21fbGlzdFtpZCAtIDJdOworCWlmIChwd20tPnVzZWQpCisJCXJldCA9IC1FQlVTWTsKKwllbHNlCisJCXB3bS0+dXNlZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJmp6NDc0MF9wd21fbXV0ZXgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCXJldCA9IGdwaW9fcmVxdWVzdChwd20tPmdwaW8sIGxhYmVsKTsKKworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBwd20gZ3BpbzogJWRcbiIsIHJldCk7CisJCXB3bS0+dXNlZCA9IGZhbHNlOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCWp6X2dwaW9fc2V0X2Z1bmN0aW9uKHB3bS0+Z3BpbywgSlpfR1BJT19GVU5DX1BXTSk7CisKKwlqejQ3NDBfdGltZXJfc3RhcnQoaWQpOworCisJcmV0dXJuIHB3bTsKK30KKwordm9pZCBwd21fZnJlZShzdHJ1Y3QgcHdtX2RldmljZSAqcHdtKQoreworCXB3bV9kaXNhYmxlKHB3bSk7CisJano0NzQwX3RpbWVyX3NldF9jdHJsKHB3bS0+aWQsIDApOworCisJanpfZ3Bpb19zZXRfZnVuY3Rpb24ocHdtLT5ncGlvLCBKWl9HUElPX0ZVTkNfTk9ORSk7CisJZ3Bpb19mcmVlKHB3bS0+Z3Bpbyk7CisKKwlqejQ3NDBfdGltZXJfc3RvcChwd20tPmlkKTsKKworCXB3bS0+dXNlZCA9IGZhbHNlOworfQorCitpbnQgcHdtX2NvbmZpZyhzdHJ1Y3QgcHdtX2RldmljZSAqcHdtLCBpbnQgZHV0eV9ucywgaW50IHBlcmlvZF9ucykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgcGVyaW9kLCBkdXR5OworCXVuc2lnbmVkIGludCBwcmVzY2FsZXIgPSAwOworCXVuc2lnbmVkIGludCBpZCA9IHB3bS0+aWQ7CisJdWludDE2X3QgY3RybDsKKwlib29sIGlzX2VuYWJsZWQ7CisKKwlpZiAoZHV0eV9ucyA8IDAgfHwgZHV0eV9ucyA+IHBlcmlvZF9ucykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSAodW5zaWduZWQgbG9uZyBsb25nKWNsa19nZXRfcmF0ZShqejQ3NDBfcHdtX2NsaykgKiBwZXJpb2RfbnM7CisJZG9fZGl2KHRtcCwgMTAwMDAwMDAwMCk7CisJcGVyaW9kID0gdG1wOworCisJd2hpbGUgKHBlcmlvZCA+IDB4ZmZmZiAmJiBwcmVzY2FsZXIgPCA2KSB7CisJCXBlcmlvZCA+Pj0gMjsKKwkJKytwcmVzY2FsZXI7CisJfQorCisJaWYgKHByZXNjYWxlciA9PSA2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpcGVyaW9kICogZHV0eV9uczsKKwlkb19kaXYodG1wLCBwZXJpb2RfbnMpOworCWR1dHkgPSBwZXJpb2QgLSB0bXA7CisKKwlpZiAoZHV0eSA+PSBwZXJpb2QpCisJCWR1dHkgPSBwZXJpb2QgLSAxOworCisJaXNfZW5hYmxlZCA9IGp6NDc0MF90aW1lcl9pc19lbmFibGVkKGlkKTsKKwlpZiAoaXNfZW5hYmxlZCkKKwkJcHdtX2Rpc2FibGUocHdtKTsKKworCWp6NDc0MF90aW1lcl9zZXRfY291bnQoaWQsIDApOworCWp6NDc0MF90aW1lcl9zZXRfZHV0eShpZCwgZHV0eSk7CisJano0NzQwX3RpbWVyX3NldF9wZXJpb2QoaWQsIHBlcmlvZCk7CisKKwljdHJsID0gSlpfVElNRVJfQ1RSTF9QUkVTQ0FMRVIocHJlc2NhbGVyKSB8IEpaX1RJTUVSX0NUUkxfU1JDX0VYVCB8CisJCUpaX1RJTUVSX0NUUkxfUFdNX0FCQlJVUFRfU0hVVERPV047CisKKwlqejQ3NDBfdGltZXJfc2V0X2N0cmwoaWQsIGN0cmwpOworCisJaWYgKGlzX2VuYWJsZWQpCisJCXB3bV9lbmFibGUocHdtKTsKKworCXJldHVybiAwOworfQorCitpbnQgcHdtX2VuYWJsZShzdHJ1Y3QgcHdtX2RldmljZSAqcHdtKQoreworCXVpbnQzMl90IGN0cmwgPSBqejQ3NDBfdGltZXJfZ2V0X2N0cmwocHdtLT5pZCk7CisKKwljdHJsIHw9IEpaX1RJTUVSX0NUUkxfUFdNX0VOQUJMRTsKKwlqejQ3NDBfdGltZXJfc2V0X2N0cmwocHdtLT5pZCwgY3RybCk7CisJano0NzQwX3RpbWVyX2VuYWJsZShwd20tPmlkKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHB3bV9kaXNhYmxlKHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJdWludDMyX3QgY3RybCA9IGp6NDc0MF90aW1lcl9nZXRfY3RybChwd20tPmlkKTsKKworCWN0cmwgJj0gfkpaX1RJTUVSX0NUUkxfUFdNX0VOQUJMRTsKKwlqejQ3NDBfdGltZXJfZGlzYWJsZShwd20tPmlkKTsKKwlqejQ3NDBfdGltZXJfc2V0X2N0cmwocHdtLT5pZCwgY3RybCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGp6NDc0MF9wd21faW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJano0NzQwX3B3bV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJleHQiKTsKKworCWlmIChJU19FUlIoano0NzQwX3B3bV9jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoano0NzQwX3B3bV9jbGspOworCQlqejQ3NDBfcHdtX2NsayA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KK3N1YnN5c19pbml0Y2FsbChqejQ3NDBfcHdtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9yZXNldC5jIGIvYXJjaC9taXBzL2p6NDc0MC9yZXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWZiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL3Jlc2V0LmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvYmFzZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC90aW1lci5oPgorCitzdGF0aWMgdm9pZCBqejQ3NDBfaGFsdCh2b2lkKQoreworCXdoaWxlICgxKSB7CisJCV9fYXNtX18oIi5zZXQgcHVzaDtcbiIKKwkJCSIuc2V0IG1pcHMzO1xuIgorCQkJIndhaXQ7XG4iCisJCQkiLnNldCBwb3A7XG4iCisJCSk7CisJfQorfQorCisjZGVmaW5lIEpaX1JFR19XRFRfREFUQSAweDAwCisjZGVmaW5lIEpaX1JFR19XRFRfQ09VTlRFUl9FTkFCTEUgMHgwNAorI2RlZmluZSBKWl9SRUdfV0RUX0NPVU5URVIgMHgwOAorI2RlZmluZSBKWl9SRUdfV0RUX0NUUkwgMHgwYworCitzdGF0aWMgdm9pZCBqejQ3NDBfcmVzdGFydChjaGFyICpjb21tYW5kKQoreworCXZvaWQgX19pb21lbSAqd2R0X2Jhc2UgPSBpb3JlbWFwKEpaNDc0MF9XRFRfQkFTRV9BRERSLCAweDBmKTsKKworCWp6NDc0MF90aW1lcl9lbmFibGVfd2F0Y2hkb2coKTsKKworCXdyaXRlYigwLCB3ZHRfYmFzZSArIEpaX1JFR19XRFRfQ09VTlRFUl9FTkFCTEUpOworCisJd3JpdGV3KDAsIHdkdF9iYXNlICsgSlpfUkVHX1dEVF9DT1VOVEVSKTsKKwl3cml0ZXcoMCwgd2R0X2Jhc2UgKyBKWl9SRUdfV0RUX0RBVEEpOworCXdyaXRldyhCSVQoMiksIHdkdF9iYXNlICsgSlpfUkVHX1dEVF9DVFJMKTsKKworCXdyaXRlYigxLCB3ZHRfYmFzZSArIEpaX1JFR19XRFRfQ09VTlRFUl9FTkFCTEUpOworCWp6NDc0MF9oYWx0KCk7Cit9CisKKyNkZWZpbmUgSlpfUkVHX1JUQ19DVFJMCQkweDAwCisjZGVmaW5lIEpaX1JFR19SVENfSElCRVJOQVRFCTB4MjAKKworI2RlZmluZSBKWl9SVENfQ1RSTF9XUkRZCUJJVCg3KQorCitzdGF0aWMgdm9pZCBqejQ3NDBfcG93ZXJfb2ZmKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpydGNfYmFzZSA9IGlvcmVtYXAoSlo0NzQwX1JUQ19CQVNFX0FERFIsIDB4MjQpOworCXVpbnQzMl90IGN0cmw7CisKKwlkbyB7CisJCWN0cmwgPSByZWFkbChydGNfYmFzZSArIEpaX1JFR19SVENfQ1RSTCk7CisJfSB3aGlsZSAoIShjdHJsICYgSlpfUlRDX0NUUkxfV1JEWSkpOworCisJd3JpdGVsKDEsIHJ0Y19iYXNlICsgSlpfUkVHX1JUQ19ISUJFUk5BVEUpOworCWp6NDc0MF9oYWx0KCk7Cit9CisKK3ZvaWQgano0NzQwX3Jlc2V0X2luaXQodm9pZCkKK3sKKwlfbWFjaGluZV9yZXN0YXJ0ID0gano0NzQwX3Jlc3RhcnQ7CisJX21hY2hpbmVfaGFsdCA9IGp6NDc0MF9oYWx0OworCXBtX3Bvd2VyX29mZiA9IGp6NDc0MF9wb3dlcl9vZmY7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL3Jlc2V0LmggYi9hcmNoL21pcHMvano0NzQwL3Jlc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwMmFiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvcmVzZXQuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19NSVBTX0paNDc0MF9SRVNFVF9IX18KKyNkZWZpbmUgX19NSVBTX0paNDc0MF9SRVNFVF9IX18KKworZXh0ZXJuIHZvaWQgano0NzQwX3Jlc2V0X2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9zZXJpYWwuYyBiL2FyY2gvbWlwcy9qejQ3NDAvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzZGU0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvc2VyaWFsLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICogIEpaNDc0MCBzZXJpYWwgc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKwordm9pZCBqejQ3NDBfc2VyaWFsX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3dpdGNoIChvZmZzZXQpIHsKKwljYXNlIFVBUlRfRkNSOgorCQl2YWx1ZSB8PSAweDEwOyAvKiBFbmFibGUgdWFydCBtb2R1bGUgKi8KKwkJYnJlYWs7CisJY2FzZSBVQVJUX0lFUjoKKwkJdmFsdWUgfD0gKHZhbHVlICYgMHg0KSA8PCAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJd3JpdGViKHZhbHVlLCBwLT5tZW1iYXNlICsgKG9mZnNldCA8PCBwLT5yZWdzaGlmdCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9zZXJpYWwuaCBiL2FyY2gvbWlwcy9qejQ3NDAvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmZTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvc2VyaWFsLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICogIEpaNDc0MCBzZXJpYWwgc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fTUlQU19KWjQ3NDBfU0VSSUFMX0hfXworCit2b2lkIGp6NDc0MF9zZXJpYWxfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQsIGludCB2YWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9zZXR1cC5jIGIvYXJjaC9taXBzL2p6NDc0MC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWUxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL3NldHVwLmMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHNldHVwIGNvZGUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSAicmVzZXQuaCIKKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwlqejQ3NDBfcmVzZXRfaW5pdCgpOworfQorCitjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKK3sKKwlyZXR1cm4gIkpaNDc0MCI7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL3RpbWUuYyBiL2FyY2gvbWlwcy9qejQ3NDAvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDE2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvano0NzQwL3RpbWUuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICogIEpaNDc0MCBwbGF0Zm9ybSB0aW1lIHN1cHBvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2lycS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKKyNkZWZpbmUgVElNRVJfQ0xPQ0tFVkVOVCAwCisjZGVmaW5lIFRJTUVSX0NMT0NLU09VUkNFIDEKKworc3RhdGljIHVpbnQxNl90IGp6NDc0MF9qaWZmaWVzX3Blcl90aWNrOworCitzdGF0aWMgY3ljbGVfdCBqejQ3NDBfY2xvY2tzb3VyY2VfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXJldHVybiBqejQ3NDBfdGltZXJfZ2V0X2NvdW50KFRJTUVSX0NMT0NLU09VUkNFKTsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBqejQ3NDBfY2xvY2tzb3VyY2UgPSB7CisJLm5hbWUgPSAiano0NzQwLXRpbWVyIiwKKwkucmF0aW5nID0gMjAwLAorCS5yZWFkID0gano0NzQwX2Nsb2Nrc291cmNlX3JlYWQsCisJLm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDE2KSwKKwkuZmxhZ3MgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBqejQ3NDBfY2xvY2tldmVudF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2QgPSBkZXZpZDsKKworCWp6NDc0MF90aW1lcl9hY2tfZnVsbChUSU1FUl9DTE9DS0VWRU5UKTsKKworCWlmIChjZC0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwkJano0NzQwX3RpbWVyX2Rpc2FibGUoVElNRVJfQ0xPQ0tFVkVOVCk7CisKKwljZC0+ZXZlbnRfaGFuZGxlcihjZCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGp6NDc0MF9jbG9ja2V2ZW50X3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCWp6NDc0MF90aW1lcl9zZXRfY291bnQoVElNRVJfQ0xPQ0tFVkVOVCwgMCk7CisJCWp6NDc0MF90aW1lcl9zZXRfcGVyaW9kKFRJTUVSX0NMT0NLRVZFTlQsIGp6NDc0MF9qaWZmaWVzX3Blcl90aWNrKTsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKKwkJano0NzQwX3RpbWVyX2lycV9mdWxsX2VuYWJsZShUSU1FUl9DTE9DS0VWRU5UKTsKKwkJano0NzQwX3RpbWVyX2VuYWJsZShUSU1FUl9DTE9DS0VWRU5UKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCWp6NDc0MF90aW1lcl9kaXNhYmxlKFRJTUVSX0NMT0NLRVZFTlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgano0NzQwX2Nsb2NrZXZlbnRfc2V0X25leHQodW5zaWduZWQgbG9uZyBldnQsCisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2QpCit7CisJano0NzQwX3RpbWVyX3NldF9jb3VudChUSU1FUl9DTE9DS0VWRU5ULCAwKTsKKwlqejQ3NDBfdGltZXJfc2V0X3BlcmlvZChUSU1FUl9DTE9DS0VWRU5ULCBldnQpOworCWp6NDc0MF90aW1lcl9lbmFibGUoVElNRVJfQ0xPQ0tFVkVOVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2Ugano0NzQwX2Nsb2NrZXZlbnQgPSB7CisJLm5hbWUgPSAiano0NzQwLXRpbWVyIiwKKwkuZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQywKKwkuc2V0X25leHRfZXZlbnQgPSBqejQ3NDBfY2xvY2tldmVudF9zZXRfbmV4dCwKKwkuc2V0X21vZGUgPSBqejQ3NDBfY2xvY2tldmVudF9zZXRfbW9kZSwKKwkucmF0aW5nID0gMjAwLAorCS5pcnEgPSBKWjQ3NDBfSVJRX1RDVTAsCit9OworCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0aW1lcl9pcnFhY3Rpb24gPSB7CisJLmhhbmRsZXIJPSBqejQ3NDBfY2xvY2tldmVudF9pcnEsCisJLmZsYWdzCQk9IElSUUZfUEVSQ1BVIHwgSVJRRl9USU1FUiwKKwkubmFtZQkJPSAiano0NzQwLXRpbWVyaXJxIiwKKwkuZGV2X2lkCQk9ICZqejQ3NDBfY2xvY2tldmVudCwKK307CisKK3ZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwl1aW50MzJfdCBjbGtfcmF0ZTsKKwl1aW50MTZfdCBjdHJsOworCisJano0NzQwX3RpbWVyX2luaXQoKTsKKworCWNsa19yYXRlID0gano0NzQwX2Nsb2NrX2JkYXRhLmV4dF9yYXRlID4+IDQ7CisJano0NzQwX2ppZmZpZXNfcGVyX3RpY2sgPSBESVZfUk9VTkRfQ0xPU0VTVChjbGtfcmF0ZSwgSFopOworCisJY2xvY2tldmVudF9zZXRfY2xvY2soJmp6NDc0MF9jbG9ja2V2ZW50LCBjbGtfcmF0ZSk7CisJano0NzQwX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygxMDAsICZqejQ3NDBfY2xvY2tldmVudCk7CisJano0NzQwX2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweGZmZmYsICZqejQ3NDBfY2xvY2tldmVudCk7CisJano0NzQwX2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7CisKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmp6NDc0MF9jbG9ja2V2ZW50KTsKKworCWNsb2Nrc291cmNlX3NldF9jbG9jaygmano0NzQwX2Nsb2Nrc291cmNlLCBjbGtfcmF0ZSk7CisJcmV0ID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmp6NDc0MF9jbG9ja3NvdXJjZSk7CisKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjbG9ja3NvdXJjZTogJWRcbiIsIHJldCk7CisKKwlzZXR1cF9pcnEoSlo0NzQwX0lSUV9UQ1UwLCAmdGltZXJfaXJxYWN0aW9uKTsKKworCWN0cmwgPSBKWl9USU1FUl9DVFJMX1BSRVNDQUxFXzE2IHwgSlpfVElNRVJfQ1RSTF9TUkNfRVhUOworCisJano0NzQwX3RpbWVyX3NldF9jdHJsKFRJTUVSX0NMT0NLRVZFTlQsIGN0cmwpOworCWp6NDc0MF90aW1lcl9zZXRfY3RybChUSU1FUl9DTE9DS1NPVVJDRSwgY3RybCk7CisKKwlqejQ3NDBfdGltZXJfc2V0X3BlcmlvZChUSU1FUl9DTE9DS0VWRU5ULCBqejQ3NDBfamlmZmllc19wZXJfdGljayk7CisJano0NzQwX3RpbWVyX2lycV9mdWxsX2VuYWJsZShUSU1FUl9DTE9DS0VWRU5UKTsKKworCWp6NDc0MF90aW1lcl9zZXRfcGVyaW9kKFRJTUVSX0NMT0NLU09VUkNFLCAweGZmZmYpOworCisJano0NzQwX3RpbWVyX2VuYWJsZShUSU1FUl9DTE9DS0VWRU5UKTsKKwlqejQ3NDBfdGltZXJfZW5hYmxlKFRJTUVSX0NMT0NLU09VUkNFKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvdGltZXIuYyBiL2FyY2gvbWlwcy9qejQ3NDAvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmMwMTUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2p6NDc0MC90aW1lci5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqICBKWjQ3NDAgcGxhdGZvcm0gdGltZXIgc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAidGltZXIuaCIKKworI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9iYXNlLmg+CisKK3ZvaWQgX19pb21lbSAqano0NzQwX3RpbWVyX2Jhc2U7CisKK3ZvaWQgano0NzQwX3RpbWVyX2VuYWJsZV93YXRjaGRvZyh2b2lkKQoreworCXdyaXRlbChCSVQoMTYpLCBqejQ3NDBfdGltZXJfYmFzZSArIEpaX1JFR19USU1FUl9TVE9QX0NMRUFSKTsKK30KKwordm9pZCBqejQ3NDBfdGltZXJfZGlzYWJsZV93YXRjaGRvZyh2b2lkKQoreworCXdyaXRlbChCSVQoMTYpLCBqejQ3NDBfdGltZXJfYmFzZSArIEpaX1JFR19USU1FUl9TVE9QX1NFVCk7Cit9CisKK3ZvaWQgX19pbml0IGp6NDc0MF90aW1lcl9pbml0KHZvaWQpCit7CisJano0NzQwX3RpbWVyX2Jhc2UgPSBpb3JlbWFwKEpaNDc0MF9UQ1VfQkFTRV9BRERSLCAweDEwMCk7CisKKwlpZiAoIWp6NDc0MF90aW1lcl9iYXNlKQorCQlwYW5pYygiRmFpbGVkIHRvIGlvcmVtYXAgdGltZXIgcmVnaXN0ZXJzIik7CisKKwkvKiBEaXNhYmxlIGFsbCB0aW1lciBjbG9ja3MgZXhjZXB0IGZvciB0aG9zZSB1c2VkIGFzIHN5c3RlbSB0aW1lcnMgKi8KKwl3cml0ZWwoMHgwMDAxMDBmYywgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfU1RPUF9TRVQpOworCisJLyogVGltZXIgaXJxcyBhcmUgdW5tYXNrZWQgYnkgZGVmYXVsdCwgbWFzayB0aGVtICovCisJd3JpdGVsKDB4MDBmZjAwZmYsIGp6NDc0MF90aW1lcl9iYXNlICsgSlpfUkVHX1RJTUVSX01BU0tfU0VUKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvdGltZXIuaCBiL2FyY2gvbWlwcy9qejQ3NDAvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2EzOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2p6NDc0MC90aW1lci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIHBsYXRmb3JtIHRpbWVyIHN1cHBvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fTUlQU19KWjQ3NDBfVElNRVJfSF9fCisjZGVmaW5lIF9fTUlQU19KWjQ3NDBfVElNRVJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIEpaX1JFR19USU1FUl9TVE9QCQkweDBDCisjZGVmaW5lIEpaX1JFR19USU1FUl9TVE9QX1NFVAkJMHgxQworI2RlZmluZSBKWl9SRUdfVElNRVJfU1RPUF9DTEVBUgkJMHgyQworI2RlZmluZSBKWl9SRUdfVElNRVJfRU5BQkxFCQkweDAwCisjZGVmaW5lIEpaX1JFR19USU1FUl9FTkFCTEVfU0VUCQkweDA0CisjZGVmaW5lIEpaX1JFR19USU1FUl9FTkFCTEVfQ0xFQVIJMHgwOAorI2RlZmluZSBKWl9SRUdfVElNRVJfRkxBRwkJMHgxMAorI2RlZmluZSBKWl9SRUdfVElNRVJfRkxBR19TRVQJCTB4MTQKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX0ZMQUdfQ0xFQVIJCTB4MTgKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX01BU0sJCTB4MjAKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX01BU0tfU0VUCQkweDI0CisjZGVmaW5lIEpaX1JFR19USU1FUl9NQVNLX0NMRUFSCQkweDI4CisKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX0RGUih4KSAoKCh4KSAqIDB4MTApICsgMHgzMCkKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX0RIUih4KSAoKCh4KSAqIDB4MTApICsgMHgzNCkKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX0NOVCh4KSAoKCh4KSAqIDB4MTApICsgMHgzOCkKKyNkZWZpbmUgSlpfUkVHX1RJTUVSX0NUUkwoeCkgKCgoeCkgKiAweDEwKSArIDB4M0MpCisKKyNkZWZpbmUgSlpfVElNRVJfSVJRX0hBTEYoeCkgQklUKCh4KSArIDB4MTApCisjZGVmaW5lIEpaX1RJTUVSX0lSUV9GVUxMKHgpIEJJVCh4KQorCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfUFdNX0FCQlJVUFRfU0hVVERPV04JQklUKDkpCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfUFdNX0FDVElWRV9MT1cJCUJJVCg4KQorI2RlZmluZSBKWl9USU1FUl9DVFJMX1BXTV9FTkFCTEUJCUJJVCg3KQorI2RlZmluZSBKWl9USU1FUl9DVFJMX1BSRVNDQUxFX01BU0sJCTB4MWMKKyNkZWZpbmUgSlpfVElNRVJfQ1RSTF9QUkVTQ0FMRV9PRkZTRVQJCTB4MworI2RlZmluZSBKWl9USU1FUl9DVFJMX1BSRVNDQUxFXzEJCSgwIDw8IDMpCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfUFJFU0NBTEVfNAkJKDEgPDwgMykKKyNkZWZpbmUgSlpfVElNRVJfQ1RSTF9QUkVTQ0FMRV8xNgkJKDIgPDwgMykKKyNkZWZpbmUgSlpfVElNRVJfQ1RSTF9QUkVTQ0FMRV82NAkJKDMgPDwgMykKKyNkZWZpbmUgSlpfVElNRVJfQ1RSTF9QUkVTQ0FMRV8yNTYJCSg0IDw8IDMpCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfUFJFU0NBTEVfMTAyNAkJKDUgPDwgMykKKworI2RlZmluZSBKWl9USU1FUl9DVFJMX1BSRVNDQUxFUih4KSAoKHgpIDw8IEpaX1RJTUVSX0NUUkxfUFJFU0NBTEVfT0ZGU0VUKQorCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfU1JDX0VYVAkJQklUKDIpCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfU1JDX1JUQwkJQklUKDEpCisjZGVmaW5lIEpaX1RJTUVSX0NUUkxfU1JDX1BDTEsJCUJJVCgwKQorCitleHRlcm4gdm9pZCBfX2lvbWVtICpqejQ3NDBfdGltZXJfYmFzZTsKK3ZvaWQgX19pbml0IGp6NDc0MF90aW1lcl9pbml0KHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgano0NzQwX3RpbWVyX3N0b3AodW5zaWduZWQgaW50IHRpbWVyKQoreworCXdyaXRlbChCSVQodGltZXIpLCBqejQ3NDBfdGltZXJfYmFzZSArIEpaX1JFR19USU1FUl9TVE9QX1NFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfdGltZXJfc3RhcnQodW5zaWduZWQgaW50IHRpbWVyKQoreworCXdyaXRlbChCSVQodGltZXIpLCBqejQ3NDBfdGltZXJfYmFzZSArIEpaX1JFR19USU1FUl9TVE9QX0NMRUFSKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGp6NDc0MF90aW1lcl9pc19lbmFibGVkKHVuc2lnbmVkIGludCB0aW1lcikKK3sKKwlyZXR1cm4gcmVhZGIoano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfRU5BQkxFKSAmIEJJVCh0aW1lcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfdGltZXJfZW5hYmxlKHVuc2lnbmVkIGludCB0aW1lcikKK3sKKwl3cml0ZWIoQklUKHRpbWVyKSwgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfRU5BQkxFX1NFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfdGltZXJfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdGltZXIpCit7CisJd3JpdGViKEJJVCh0aW1lciksIGp6NDc0MF90aW1lcl9iYXNlICsgSlpfUkVHX1RJTUVSX0VOQUJMRV9DTEVBUik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGp6NDc0MF90aW1lcl9zZXRfcGVyaW9kKHVuc2lnbmVkIGludCB0aW1lciwgdWludDE2X3QgcGVyaW9kKQoreworCXdyaXRldyhwZXJpb2QsIGp6NDc0MF90aW1lcl9iYXNlICsgSlpfUkVHX1RJTUVSX0RGUih0aW1lcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgano0NzQwX3RpbWVyX3NldF9kdXR5KHVuc2lnbmVkIGludCB0aW1lciwgdWludDE2X3QgZHV0eSkKK3sKKwl3cml0ZXcoZHV0eSwgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfREhSKHRpbWVyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfdGltZXJfc2V0X2NvdW50KHVuc2lnbmVkIGludCB0aW1lciwgdWludDE2X3QgY291bnQpCit7CisJd3JpdGV3KGNvdW50LCBqejQ3NDBfdGltZXJfYmFzZSArIEpaX1JFR19USU1FUl9DTlQodGltZXIpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBqejQ3NDBfdGltZXJfZ2V0X2NvdW50KHVuc2lnbmVkIGludCB0aW1lcikKK3sKKwlyZXR1cm4gcmVhZHcoano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfQ05UKHRpbWVyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfdGltZXJfYWNrX2Z1bGwodW5zaWduZWQgaW50IHRpbWVyKQoreworCXdyaXRlbChKWl9USU1FUl9JUlFfRlVMTCh0aW1lciksIGp6NDc0MF90aW1lcl9iYXNlICsgSlpfUkVHX1RJTUVSX0ZMQUdfQ0xFQVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgano0NzQwX3RpbWVyX2lycV9mdWxsX2VuYWJsZSh1bnNpZ25lZCBpbnQgdGltZXIpCit7CisJd3JpdGVsKEpaX1RJTUVSX0lSUV9GVUxMKHRpbWVyKSwgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfRkxBR19DTEVBUik7CisJd3JpdGVsKEpaX1RJTUVSX0lSUV9GVUxMKHRpbWVyKSwgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfTUFTS19DTEVBUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3NDBfdGltZXJfaXJxX2Z1bGxfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdGltZXIpCit7CisJd3JpdGVsKEpaX1RJTUVSX0lSUV9GVUxMKHRpbWVyKSwgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfTUFTS19TRVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgano0NzQwX3RpbWVyX3NldF9jdHJsKHVuc2lnbmVkIGludCB0aW1lciwgdWludDE2X3QgY3RybCkKK3sKKwl3cml0ZXcoY3RybCwgano0NzQwX3RpbWVyX2Jhc2UgKyBKWl9SRUdfVElNRVJfQ1RSTCh0aW1lcikpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGp6NDc0MF90aW1lcl9nZXRfY3RybCh1bnNpZ25lZCBpbnQgdGltZXIpCit7CisJcmV0dXJuIHJlYWR3KGp6NDc0MF90aW1lcl9iYXNlICsgSlpfUkVHX1RJTUVSX0NUUkwodGltZXIpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQppbmRleCA3YTZhYzUwLi4wNmY4NDgyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKQEAgLTc2LDYgKzc2LDcgQEAKIG9iai0kKENPTkZJR19JUlFfR1Q2NDFYWCkJKz0gaXJxLWd0NjQxeHgubwogb2JqLSQoQ09ORklHX0lSUV9HSUMpCQkrPSBpcnEtZ2ljLm8KIAorb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLm8KIG9iai0kKENPTkZJR18zMkJJVCkJCSs9IHNjYWxsMzItbzMyLm8KIG9iai0kKENPTkZJR182NEJJVCkJCSs9IHNjYWxsNjQtNjQubwogb2JqLSQoQ09ORklHX01JUFMzMl9DT01QQVQpCSs9IGxpbnV4MzIubyBwdHJhY2UzMi5vIHNpZ25hbDMyLm8KQEAgLTEwMSw2ICsxMDIsNCBAQAogCiBvYmotJChDT05GSUdfTUlQU19DUFVGUkVRKQkrPSBjcHVmcmVxLwogCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgotCiBDUFBGTEFHU192bWxpbnV4LmxkcwkJOj0gJChLQlVJTERfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGNhNmM4MzIuLjZiMzBmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTEyNiw3ICsxMjYsNiBAQAogCSAgICAgICB0aHJlYWQuY3AwX2JhZHVhZGRyKTsKIAlPRkZTRVQoVEhSRUFEX0VDT0RFLCB0YXNrX3N0cnVjdCwgXAogCSAgICAgICB0aHJlYWQuZXJyb3JfY29kZSk7Ci0JT0ZGU0VUKFRIUkVBRF9UUkFQTk8sIHRhc2tfc3RydWN0LCB0aHJlYWQudHJhcF9ubyk7CiAJT0ZGU0VUKFRIUkVBRF9UUkFNUCwgdGFza19zdHJ1Y3QsIFwKIAkgICAgICAgdGhyZWFkLmlyaXhfdHJhbXBvbGluZSk7CiAJT0ZGU0VUKFRIUkVBRF9PTERDVFgsIHRhc2tfc3RydWN0LCBcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NldnQtcjRrLmMgYi9hcmNoL21pcHMva2VybmVsL2NldnQtcjRrLmMKaW5kZXggMGIyNDUwYy4uMmE0ZDUwZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXI0ay5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1yNGsuYwpAQCAtMTYzLDcgKzE2Myw2IEBACiAKIGludCBfX2NwdWluaXQgcjRrX2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQogewotCXVpbnQ2NF90IG1pcHNfZnJlcSA9IG1pcHNfaHB0X2ZyZXF1ZW5jeTsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkOwogCXVuc2lnbmVkIGludCBpcnE7CkBAIC0xODgsOSArMTg3LDkgQEAKIAljZC0+bmFtZQkJPSAiTUlQUyI7CiAJY2QtPmZlYXR1cmVzCQk9IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CiAKKwljbG9ja2V2ZW50X3NldF9jbG9jayhjZCwgbWlwc19ocHRfZnJlcXVlbmN5KTsKKwogCS8qIENhbGN1bGF0ZSB0aGUgbWluIC8gbWF4IGRlbHRhICovCi0JY2QtPm11bHQJPSBkaXZfc2MoKHVuc2lnbmVkIGxvbmcpIG1pcHNfZnJlcSwgTlNFQ19QRVJfU0VDLCAzMik7Ci0JY2QtPnNoaWZ0CQk9IDMyOwogCWNkLT5tYXhfZGVsdGFfbnMJPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N2ZmZmZmZmYsIGNkKTsKIAljZC0+bWluX2RlbHRhX25zCT0gY2xvY2tldmVudF9kZWx0YTJucygweDMwMCwgY2QpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1idWdzNjQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LWJ1Z3M2NC5jCmluZGV4IDQwOGQwYTAuLmI4YmI4YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LWJ1Z3M2NC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LWJ1Z3M2NC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAlwYW5pYyhidWc2NGhpdCwgIURBRERJX1dBUiA/IGRhZGRpd2FyIDogbm93YXIpOwogfQogCi1pbnQgZGFkZGl1X2J1ZyBfX2NwdWluaXRkYXRhID0gLTE7CitpbnQgZGFkZGl1X2J1ZyAgPSAtMTsKIAogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2RhZGRpdSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKaW5kZXggMzU2MmI4NS4uYjFiMzA0ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCkBAIC0xODcsNiArMTg3LDcgQEAKIAljYXNlIENQVV9CQ002MzU4OgogCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT046CiAJY2FzZSBDUFVfQ0FWSVVNX09DVEVPTl9QTFVTOgorCWNhc2UgQ1BVX0paUklTQzoKIAkJY3B1X3dhaXQgPSByNGtfd2FpdDsKIAkJYnJlYWs7CiAKQEAgLTc2MCw2ICs3NjEsOSBAQAogCQlvayA9IGRlY29kZV9jb25maWc0KGMpOwogCiAJbWlwc19wcm9iZV93YXRjaF9yZWdpc3RlcnMoYyk7CisKKwlpZiAoY3B1X2hhc19taXBzX3IyKQorCQljLT5jb3JlID0gcmVhZF9jMF9lYmFzZSgpICYgMHgzZmY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcHJvYmVfbWlwcyhzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCB1bnNpZ25lZCBpbnQgY3B1KQpAQCAtOTU2LDYgKzk2MCwyMiBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdV9wcm9iZV9pbmdlbmljKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMsIHVuc2lnbmVkIGludCBjcHUpCit7CisJZGVjb2RlX2NvbmZpZ3MoYyk7CisJLyogSlpSSVNDIGRvZXMgbm90IGltcGxlbWVudCB0aGUgQ1AwIGNvdW50ZXIuICovCisJYy0+b3B0aW9ucyAmPSB+TUlQU19DUFVfQ09VTlRFUjsKKwlzd2l0Y2ggKGMtPnByb2Nlc3Nvcl9pZCAmIDB4ZmYwMCkgeworCWNhc2UgUFJJRF9JTVBfSlpSSVNDOgorCQljLT5jcHV0eXBlID0gQ1BVX0paUklTQzsKKwkJX19jcHVfbmFtZVtjcHVdID0gIkluZ2VuaWMgSlpSSVNDIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoIlVua25vd24gSW5nZW5pYyBQcm9jZXNzb3IgSUQhIik7CisJCWJyZWFrOworCX0KK30KKwogY29uc3QgY2hhciAqX19jcHVfbmFtZVtOUl9DUFVTXTsKIGNvbnN0IGNoYXIgKl9fZWxmX3BsYXRmb3JtOwogCkBAIC05OTQsNiArMTAxNCw5IEBACiAJY2FzZSBQUklEX0NPTVBfQ0FWSVVNOgogCQljcHVfcHJvYmVfY2F2aXVtKGMsIGNwdSk7CiAJCWJyZWFrOworCWNhc2UgUFJJRF9DT01QX0lOR0VOSUM6CisJCWNwdV9wcm9iZV9pbmdlbmljKGMsIGNwdSk7CisJCWJyZWFrOwogCX0KIAogCUJVR19PTighX19jcHVfbmFtZVtjcHVdKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jIGIvYXJjaC9taXBzL2tlcm5lbC9rZ2RiLmMKaW5kZXggOWI3OGZmNi4uMWY0ZTJmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9rZ2RiLmMKQEAgLTUwLDYgKzUwLDE1MSBAQAogCXsgMCwgMH0JCQkvKiBNdXN0IGJlIGxhc3QgKi8KIH07CiAKK3N0cnVjdCBkYmdfcmVnX2RlZl90IGRiZ19yZWdfZGVmW0RCR19NQVhfUkVHX05VTV0gPQoreworCXsgInplcm8iLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMF0pIH0sCisJeyAiYXQiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMV0pIH0sCisJeyAidjAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMl0pIH0sCisJeyAidjEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbM10pIH0sCisJeyAiYTAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbNF0pIH0sCisJeyAiYTEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbNV0pIH0sCisJeyAiYTIiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbNl0pIH0sCisJeyAiYTMiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbN10pIH0sCisJeyAidDAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbOF0pIH0sCisJeyAidDEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbOV0pIH0sCisJeyAidDIiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTBdKSB9LAorCXsgInQzIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzExXSkgfSwKKwl7ICJ0NCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1sxMl0pIH0sCisJeyAidDUiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTNdKSB9LAorCXsgInQ2IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE0XSkgfSwKKwl7ICJ0NyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1sxNV0pIH0sCisJeyAiczAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTZdKSB9LAorCXsgInMxIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzE3XSkgfSwKKwl7ICJzMiIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1sxOF0pIH0sCisJeyAiczMiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTldKSB9LAorCXsgInM0IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzIwXSkgfSwKKwl7ICJzNSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1syMV0pIH0sCisJeyAiczYiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjJdKSB9LAorCXsgInM3IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzIzXSkgfSwKKwl7ICJ0OCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1syNF0pIH0sCisJeyAidDkiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjVdKSB9LAorCXsgImswIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI2XSkgfSwKKwl7ICJrMSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1syN10pIH0sCisJeyAiZ3AiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjhdKSB9LAorCXsgInNwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzI5XSkgfSwKKwl7ICJzOCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1szMF0pIH0sCisJeyAicmEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMzFdKSB9LAorCXsgInNyIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBjcDBfc3RhdHVzKSB9LAorCXsgImxvIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBsbykgfSwKKwl7ICJoaSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaGkpIH0sCisJeyAiYmFkIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBjcDBfYmFkdmFkZHIpIH0sCisJeyAiY2F1c2UiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGNwMF9jYXVzZSkgfSwKKwl7ICJwYyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgY3AwX2VwYykgfSwKKwl7ICJmMCIsIEdEQl9TSVpFT0ZfUkVHLCAwIH0sCisJeyAiZjEiLCBHREJfU0laRU9GX1JFRywgMSB9LAorCXsgImYyIiwgR0RCX1NJWkVPRl9SRUcsIDIgfSwKKwl7ICJmMyIsIEdEQl9TSVpFT0ZfUkVHLCAzIH0sCisJeyAiZjQiLCBHREJfU0laRU9GX1JFRywgNCB9LAorCXsgImY1IiwgR0RCX1NJWkVPRl9SRUcsIDUgfSwKKwl7ICJmNiIsIEdEQl9TSVpFT0ZfUkVHLCA2IH0sCisJeyAiZjciLCBHREJfU0laRU9GX1JFRywgNyB9LAorCXsgImY4IiwgR0RCX1NJWkVPRl9SRUcsIDggfSwKKwl7ICJmOSIsIEdEQl9TSVpFT0ZfUkVHLCA5IH0sCisJeyAiZjEwIiwgR0RCX1NJWkVPRl9SRUcsIDEwIH0sCisJeyAiZjExIiwgR0RCX1NJWkVPRl9SRUcsIDExIH0sCisJeyAiZjEyIiwgR0RCX1NJWkVPRl9SRUcsIDEyIH0sCisJeyAiZjEzIiwgR0RCX1NJWkVPRl9SRUcsIDEzIH0sCisJeyAiZjE0IiwgR0RCX1NJWkVPRl9SRUcsIDE0IH0sCisJeyAiZjE1IiwgR0RCX1NJWkVPRl9SRUcsIDE1IH0sCisJeyAiZjE2IiwgR0RCX1NJWkVPRl9SRUcsIDE2IH0sCisJeyAiZjE3IiwgR0RCX1NJWkVPRl9SRUcsIDE3IH0sCisJeyAiZjE4IiwgR0RCX1NJWkVPRl9SRUcsIDE4IH0sCisJeyAiZjE5IiwgR0RCX1NJWkVPRl9SRUcsIDE5IH0sCisJeyAiZjIwIiwgR0RCX1NJWkVPRl9SRUcsIDIwIH0sCisJeyAiZjIxIiwgR0RCX1NJWkVPRl9SRUcsIDIxIH0sCisJeyAiZjIyIiwgR0RCX1NJWkVPRl9SRUcsIDIyIH0sCisJeyAiZjIzIiwgR0RCX1NJWkVPRl9SRUcsIDIzIH0sCisJeyAiZjI0IiwgR0RCX1NJWkVPRl9SRUcsIDI0IH0sCisJeyAiZjI1IiwgR0RCX1NJWkVPRl9SRUcsIDI1IH0sCisJeyAiZjI2IiwgR0RCX1NJWkVPRl9SRUcsIDI2IH0sCisJeyAiZjI3IiwgR0RCX1NJWkVPRl9SRUcsIDI3IH0sCisJeyAiZjI4IiwgR0RCX1NJWkVPRl9SRUcsIDI4IH0sCisJeyAiZjI5IiwgR0RCX1NJWkVPRl9SRUcsIDI5IH0sCisJeyAiZjMwIiwgR0RCX1NJWkVPRl9SRUcsIDMwIH0sCisJeyAiZjMxIiwgR0RCX1NJWkVPRl9SRUcsIDMxIH0sCisJeyAiZnNyIiwgR0RCX1NJWkVPRl9SRUcsIDAgfSwKKwl7ICJmaXIiLCBHREJfU0laRU9GX1JFRywgMCB9LAorfTsKKworaW50IGRiZ19zZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZnBfcmVnOworCisJaWYgKHJlZ25vIDwgMCB8fCByZWdubyA+PSBEQkdfTUFYX1JFR19OVU0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQgIT0gLTEgJiYgcmVnbm8gPCAzOCkgeworCQltZW1jcHkoKHZvaWQgKilyZWdzICsgZGJnX3JlZ19kZWZbcmVnbm9dLm9mZnNldCwgbWVtLAorCQkgICAgICAgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCX0gZWxzZSBpZiAoY3VycmVudCAmJiBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0ICE9IC0xICYmIHJlZ25vIDwgNzIpIHsKKwkJLyogRlAgcmVnaXN0ZXJzIDM4IC0+IDY5ICovCisJCWlmICghKHJlZ3MtPmNwMF9zdGF0dXMgJiBTVDBfQ1UxKSkKKwkJCXJldHVybiAwOworCQlpZiAocmVnbm8gPT0gNzApIHsKKwkJCS8qIFByb2Nlc3MgdGhlIGZjcjMxL2ZzciAocmVnaXN0ZXIgNzApICovCisJCQltZW1jcHkoKHZvaWQgKikmY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwgbWVtLAorCQkJICAgICAgIGRiZ19yZWdfZGVmW3JlZ25vXS5zaXplKTsKKwkJCWdvdG8gb3V0X3NhdmU7CisJCX0gZWxzZSBpZiAocmVnbm8gPT0gNzEpIHsKKwkJCS8qIElnbm9yZSB0aGUgZmlyIChyZWdpc3RlciA3MSkgKi8KKwkJCWdvdG8gb3V0X3NhdmU7CisJCX0KKwkJZnBfcmVnID0gZGJnX3JlZ19kZWZbcmVnbm9dLm9mZnNldDsKKwkJbWVtY3B5KCh2b2lkICopJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ZwX3JlZ10sIG1lbSwKKwkJICAgICAgIGRiZ19yZWdfZGVmW3JlZ25vXS5zaXplKTsKK291dF9zYXZlOgorCQlyZXN0b3JlX2ZwKGN1cnJlbnQpOworCX0KKworCXJldHVybiAwOworfQorCitjaGFyICpkYmdfZ2V0X3JlZyhpbnQgcmVnbm8sIHZvaWQgKm1lbSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGZwX3JlZzsKKworCWlmIChyZWdubyA+PSBEQkdfTUFYX1JFR19OVU0gfHwgcmVnbm8gPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0ICE9IC0xICYmIHJlZ25vIDwgMzgpIHsKKwkJLyogRmlyc3QgMzggcmVnaXN0ZXJzICovCisJCW1lbWNweShtZW0sICh2b2lkICopcmVncyArIGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQsCisJCSAgICAgICBkYmdfcmVnX2RlZltyZWdub10uc2l6ZSk7CisJfSBlbHNlIGlmIChjdXJyZW50ICYmIGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQgIT0gLTEgJiYgcmVnbm8gPCA3MikgeworCQkvKiBGUCByZWdpc3RlcnMgMzggLT4gNjkgKi8KKwkJaWYgKCEocmVncy0+Y3AwX3N0YXR1cyAmIFNUMF9DVTEpKQorCQkJZ290byBvdXQ7CisJCXNhdmVfZnAoY3VycmVudCk7CisJCWlmIChyZWdubyA9PSA3MCkgeworCQkJLyogUHJvY2VzcyB0aGUgZmNyMzEvZnNyIChyZWdpc3RlciA3MCkgKi8KKwkJCW1lbWNweShtZW0sICh2b2lkICopJmN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEsCisJCQkgICAgICAgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAocmVnbm8gPT0gNzEpIHsKKwkJCS8qIElnbm9yZSB0aGUgZmlyIChyZWdpc3RlciA3MSkgKi8KKwkJCW1lbXNldChtZW0sIDAsIGRiZ19yZWdfZGVmW3JlZ25vXS5zaXplKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZwX3JlZyA9IGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQ7CisJCW1lbWNweShtZW0sICh2b2lkICopJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ZwX3JlZ10sCisJCSAgICAgICBkYmdfcmVnX2RlZltyZWdub10uc2l6ZSk7CisJfQorCitvdXQ6CisJcmV0dXJuIGRiZ19yZWdfZGVmW3JlZ25vXS5uYW1lOworCit9CisKIHZvaWQgYXJjaF9rZ2RiX2JyZWFrcG9pbnQodm9pZCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTg0LDY0ICsyMjksNiBAQAogCXJldHVybiBTSUdIVVA7CQkvKiBkZWZhdWx0IGZvciB0aGluZ3Mgd2UgZG9uJ3Qga25vdyBhYm91dCAqLwogfQogCi12b2lkIHB0X3JlZ3NfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCByZWc7Ci0KLSNpZiAoS0dEQl9HREJfUkVHX1NJWkUgPT0gMzIpCi0JdTMyICpwdHIgPSAodTMyICopZ2RiX3JlZ3M7Ci0jZWxzZQotCXU2NCAqcHRyID0gKHU2NCAqKWdkYl9yZWdzOwotI2VuZGlmCi0KLQlmb3IgKHJlZyA9IDA7IHJlZyA8IDMyOyByZWcrKykKLQkJKihwdHIrKykgPSByZWdzLT5yZWdzW3JlZ107Ci0KLQkqKHB0cisrKSA9IHJlZ3MtPmNwMF9zdGF0dXM7Ci0JKihwdHIrKykgPSByZWdzLT5sbzsKLQkqKHB0cisrKSA9IHJlZ3MtPmhpOwotCSoocHRyKyspID0gcmVncy0+Y3AwX2JhZHZhZGRyOwotCSoocHRyKyspID0gcmVncy0+Y3AwX2NhdXNlOwotCSoocHRyKyspID0gcmVncy0+Y3AwX2VwYzsKLQotCS8qIEZQIFJFR1MgKi8KLQlpZiAoIShjdXJyZW50ICYmIChyZWdzLT5jcDBfc3RhdHVzICYgU1QwX0NVMSkpKQotCQlyZXR1cm47Ci0KLQlzYXZlX2ZwKGN1cnJlbnQpOwotCWZvciAocmVnID0gMDsgcmVnIDwgMzI7IHJlZysrKQotCQkqKHB0cisrKSA9IGN1cnJlbnQtPnRocmVhZC5mcHUuZnByW3JlZ107Ci19Ci0KLXZvaWQgZ2RiX3JlZ3NfdG9fcHRfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IHJlZzsKLQotI2lmIChLR0RCX0dEQl9SRUdfU0laRSA9PSAzMikKLQljb25zdCB1MzIgKnB0ciA9ICh1MzIgKilnZGJfcmVnczsKLSNlbHNlCi0JY29uc3QgdTY0ICpwdHIgPSAodTY0ICopZ2RiX3JlZ3M7Ci0jZW5kaWYKLQotCWZvciAocmVnID0gMDsgcmVnIDwgMzI7IHJlZysrKQotCQlyZWdzLT5yZWdzW3JlZ10gPSAqKHB0cisrKTsKLQotCXJlZ3MtPmNwMF9zdGF0dXMgPSAqKHB0cisrKTsKLQlyZWdzLT5sbyA9ICoocHRyKyspOwotCXJlZ3MtPmhpID0gKihwdHIrKyk7Ci0JcmVncy0+Y3AwX2JhZHZhZGRyID0gKihwdHIrKyk7Ci0JcmVncy0+Y3AwX2NhdXNlID0gKihwdHIrKyk7Ci0JcmVncy0+Y3AwX2VwYyA9ICoocHRyKyspOwotCi0JLyogRlAgUkVHUyBmcm9tIGN1cnJlbnQgKi8KLQlpZiAoIShjdXJyZW50ICYmIChyZWdzLT5jcDBfc3RhdHVzICYgU1QwX0NVMSkpKQotCQlyZXR1cm47Ci0KLQlmb3IgKHJlZyA9IDA7IHJlZyA8IDMyOyByZWcrKykKLQkJY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbcmVnXSA9ICoocHRyKyspOwotCXJlc3RvcmVfZnAoY3VycmVudCk7Ci19Ci0KIC8qCiAgKiBTaW1pbGFyIHRvIHJlZ3NfdG9fZ2RiX3JlZ3MoKSBleGNlcHQgdGhhdCBwcm9jZXNzIGlzIHNsZWVwaW5nIGFuZCBzbwogICogd2UgbWF5IG5vdCBiZSBhYmxlIHRvIGdldCBhbGwgdGhlIGluZm8uCkBAIC0yNDIsNyArMzI5LDcgQEAKIH07CiAKIC8qCi0gKiBIYW5kbGUgdGhlICdzJyBhbmQgJ2MnIGNvbW1hbmRzCisgKiBIYW5kbGUgdGhlICdjJyBjb21tYW5kCiAgKi8KIGludCBrZ2RiX2FyY2hfaGFuZGxlX2V4Y2VwdGlvbihpbnQgdmVjdG9yLCBpbnQgc2lnbm8sIGludCBlcnJfY29kZSwKIAkJCSAgICAgICBjaGFyICpyZW1jb21faW5fYnVmZmVyLCBjaGFyICpyZW1jb21fb3V0X2J1ZmZlciwKQEAgLTI1MCwyMCArMzM3LDE0IEBACiB7CiAJY2hhciAqcHRyOwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJc3dpdGNoIChyZW1jb21faW5fYnVmZmVyWzBdKSB7Ci0JY2FzZSAncyc6CiAJY2FzZSAnYyc6CiAJCS8qIGhhbmRsZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyICovCiAJCXB0ciA9ICZyZW1jb21faW5fYnVmZmVyWzFdOwogCQlpZiAoa2dkYl9oZXgybG9uZygmcHRyLCAmYWRkcmVzcykpCiAJCQlyZWdzLT5jcDBfZXBjID0gYWRkcmVzczsKIAotCQlhdG9taWNfc2V0KCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCwgLTEpOwotCQlpZiAocmVtY29tX2luX2J1ZmZlclswXSA9PSAncycpCi0JCQlhdG9taWNfc2V0KCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCwgY3B1KTsKLQogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9rcHJvYmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyODY4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwva3Byb2Jlcy5jCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogIEtlcm5lbCBQcm9iZXMgKEtQcm9iZXMpCisgKiAgYXJjaC9taXBzL2tlcm5lbC9rcHJvYmVzLmMKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICogIENvcHlyaWdodCAyMDEwIENhdml1bSBOZXR3b3JrcworICoKKyAqICBTb21lIHBvcnRpb25zIGNvcGllZCBmcm9tIHRoZSBwb3dlcnBjIHZlcnNpb24uCisgKgorICogICBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMiwgMjAwNAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYnJlYWsuaD4KKyNpbmNsdWRlIDxhc20vaW5zdC5oPgorCitzdGF0aWMgY29uc3QgdW5pb24gbWlwc19pbnN0cnVjdGlvbiBicmVha3BvaW50X2luc24gPSB7CisJLmJfZm9ybWF0ID0geworCQkub3Bjb2RlID0gc3BlY19vcCwKKwkJLmNvZGUgPSBCUktfS1BST0JFX0JQLAorCQkuZnVuYyA9IGJyZWFrX29wCisJfQorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludDJfaW5zbiA9IHsKKwkuYl9mb3JtYXQgPSB7CisJCS5vcGNvZGUgPSBzcGVjX29wLAorCQkuY29kZSA9IEJSS19LUFJPQkVfU1NURVBCUCwKKwkJLmZ1bmMgPSBicmVha19vcAorCX0KK307CisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwgY3VycmVudF9rcHJvYmUpOworREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZV9jdGxibGssIGtwcm9iZV9jdGxibGspOworCitzdGF0aWMgaW50IF9fa3Byb2JlcyBpbnNuX2hhc19kZWxheXNsb3QodW5pb24gbWlwc19pbnN0cnVjdGlvbiBpbnNuKQoreworCXN3aXRjaCAoaW5zbi5pX2Zvcm1hdC5vcGNvZGUpIHsKKworCQkvKgorCQkgKiBUaGlzIGdyb3VwIGNvbnRhaW5zOgorCQkgKiBqciBhbmQgamFsciBhcmUgaW4gcl9mb3JtYXQgZm9ybWF0LgorCQkgKi8KKwljYXNlIHNwZWNfb3A6CisJCXN3aXRjaCAoaW5zbi5yX2Zvcm1hdC5mdW5jKSB7CisJCWNhc2UganJfb3A6CisJCWNhc2UgamFscl9vcDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbnNuX29rOworCQl9CisKKwkJLyoKKwkJICogVGhpcyBncm91cCBjb250YWluczoKKwkJICogYmx0el9vcCwgYmdlel9vcCwgYmx0emxfb3AsIGJnZXpsX29wLAorCQkgKiBibHR6YWxfb3AsIGJnZXphbF9vcCwgYmx0emFsbF9vcCwgYmdlemFsbF9vcC4KKwkJICovCisJY2FzZSBiY29uZF9vcDoKKworCQkvKgorCQkgKiBUaGVzZSBhcmUgdW5jb25kaXRpb25hbCBhbmQgaW4gal9mb3JtYXQuCisJCSAqLworCWNhc2UgamFsX29wOgorCWNhc2Ugal9vcDoKKworCQkvKgorCQkgKiBUaGVzZSBhcmUgY29uZGl0aW9uYWwgYW5kIGluIGlfZm9ybWF0LgorCQkgKi8KKwljYXNlIGJlcV9vcDoKKwljYXNlIGJlcWxfb3A6CisJY2FzZSBibmVfb3A6CisJY2FzZSBibmVsX29wOgorCWNhc2UgYmxlel9vcDoKKwljYXNlIGJsZXpsX29wOgorCWNhc2UgYmd0el9vcDoKKwljYXNlIGJndHpsX29wOgorCisJCS8qCisJCSAqIFRoZXNlIGFyZSB0aGUgRlBBL2NwMSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorCQkgKi8KKwljYXNlIGNvcDFfb3A6CisKKyNpZmRlZiBDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04KKwljYXNlIGx3YzJfb3A6IC8qIFRoaXMgaXMgYmJpdDAgb24gT2N0ZW9uICovCisJY2FzZSBsZGMyX29wOiAvKiBUaGlzIGlzIGJiaXQwMzIgb24gT2N0ZW9uICovCisJY2FzZSBzd2MyX29wOiAvKiBUaGlzIGlzIGJiaXQxIG9uIE9jdGVvbiAqLworCWNhc2Ugc2RjMl9vcDogLyogVGhpcyBpcyBiYml0MTMyIG9uIE9jdGVvbiAqLworI2VuZGlmCisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK2luc25fb2s6CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCXVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gaW5zbjsKKwl1bmlvbiBtaXBzX2luc3RydWN0aW9uIHByZXZfaW5zbjsKKwlpbnQgcmV0ID0gMDsKKworCXByZXZfaW5zbiA9IHAtPmFkZHJbLTFdOworCWluc24gPSBwLT5hZGRyWzBdOworCisJaWYgKGluc25faGFzX2RlbGF5c2xvdChpbnNuKSB8fCBpbnNuX2hhc19kZWxheXNsb3QocHJldl9pbnNuKSkgeworCQlwcl9ub3RpY2UoIktwcm9iZXMgZm9yIGJyYW5jaCBhbmQganVtcCBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBpbnNuOiBtdXN0IGJlIG9uIHNwZWNpYWwgZXhlY3V0YWJsZSBwYWdlIG9uIG1pcHMuICovCisJcC0+YWluc24uaW5zbiA9IGdldF9pbnNuX3Nsb3QoKTsKKwlpZiAoIXAtPmFpbnNuLmluc24pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJbiB0aGUga3Byb2JlLT5haW5zbi5pbnNuW10gYXJyYXkgd2Ugc3RvcmUgdGhlIG9yaWdpbmFsCisJICogaW5zdHJ1Y3Rpb24gYXQgaW5kZXggemVybyBhbmQgYSBicmVhayB0cmFwIGluc3RydWN0aW9uIGF0CisJICogaW5kZXggb25lLgorCSAqLworCisJbWVtY3B5KCZwLT5haW5zbi5pbnNuWzBdLCBwLT5hZGRyLCBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisJcC0+YWluc24uaW5zblsxXSA9IGJyZWFrcG9pbnQyX2luc247CisJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwkqcC0+YWRkciA9IGJyZWFrcG9pbnRfaW5zbjsKKwlmbHVzaF9pbnNuX3Nsb3QocCk7Cit9CisKK3ZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCSpwLT5hZGRyID0gcC0+b3Bjb2RlOworCWZsdXNoX2luc25fc2xvdChwKTsKK30KKwordm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfcHJldmlvdXNfa3Byb2JlKHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCit7CisJa2NiLT5wcmV2X2twcm9iZS5rcCA9IGtwcm9iZV9ydW5uaW5nKCk7CisJa2NiLT5wcmV2X2twcm9iZS5zdGF0dXMgPSBrY2ItPmtwcm9iZV9zdGF0dXM7CisJa2NiLT5wcmV2X2twcm9iZS5vbGRfU1IgPSBrY2ItPmtwcm9iZV9vbGRfU1I7CisJa2NiLT5wcmV2X2twcm9iZS5zYXZlZF9TUiA9IGtjYi0+a3Byb2JlX3NhdmVkX1NSOworCWtjYi0+cHJldl9rcHJvYmUuc2F2ZWRfZXBjID0ga2NiLT5rcHJvYmVfc2F2ZWRfZXBjOworfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX3ByZXZpb3VzX2twcm9iZShzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQoreworCV9fZ2V0X2NwdV92YXIoY3VycmVudF9rcHJvYmUpID0ga2NiLT5wcmV2X2twcm9iZS5rcDsKKwlrY2ItPmtwcm9iZV9zdGF0dXMgPSBrY2ItPnByZXZfa3Byb2JlLnN0YXR1czsKKwlrY2ItPmtwcm9iZV9vbGRfU1IgPSBrY2ItPnByZXZfa3Byb2JlLm9sZF9TUjsKKwlrY2ItPmtwcm9iZV9zYXZlZF9TUiA9IGtjYi0+cHJldl9rcHJvYmUuc2F2ZWRfU1I7CisJa2NiLT5rcHJvYmVfc2F2ZWRfZXBjID0ga2NiLT5wcmV2X2twcm9iZS5zYXZlZF9lcGM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jdXJyZW50X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgICAgICBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQoreworCV9fZ2V0X2NwdV92YXIoY3VycmVudF9rcHJvYmUpID0gcDsKKwlrY2ItPmtwcm9iZV9zYXZlZF9TUiA9IGtjYi0+a3Byb2JlX29sZF9TUiA9IChyZWdzLT5jcDBfc3RhdHVzICYgU1QwX0lFKTsKKwlrY2ItPmtwcm9iZV9zYXZlZF9lcGMgPSByZWdzLT5jcDBfZXBjOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmVncy0+Y3AwX3N0YXR1cyAmPSB+U1QwX0lFOworCisJLyogc2luZ2xlIHN0ZXAgaW5saW5lIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGJyZWFrICovCisJaWYgKHAtPm9wY29kZS53b3JkID09IGJyZWFrcG9pbnRfaW5zbi53b3JkIHx8CisJICAgIHAtPm9wY29kZS53b3JkID09IGJyZWFrcG9pbnQyX2luc24ud29yZCkKKwkJcmVncy0+Y3AwX2VwYyA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CisJZWxzZQorCQlyZWdzLT5jcDBfZXBjID0gKHVuc2lnbmVkIGxvbmcpJnAtPmFpbnNuLmluc25bMF07Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGtwcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcHJvYmUgKnA7CisJaW50IHJldCA9IDA7CisJa3Byb2JlX29wY29kZV90ICphZGRyOworCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2I7CisKKwlhZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKSByZWdzLT5jcDBfZXBjOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGJlIHByZWVtcHRlZCBmb3IgdGhlIGVudGlyZQorCSAqIGR1cmF0aW9uIG9mIGtwcm9iZSBwcm9jZXNzaW5nCisJICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKKworCS8qIENoZWNrIHdlJ3JlIG5vdCBhY3R1YWxseSByZWN1cnNpbmcgKi8KKwlpZiAoa3Byb2JlX3J1bm5pbmcoKSkgeworCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKKwkJaWYgKHApIHsKKwkJCWlmIChrY2ItPmtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX0hJVF9TUyAmJgorCQkJICAgIHAtPmFpbnNuLmluc24tPndvcmQgPT0gYnJlYWtwb2ludF9pbnNuLndvcmQpIHsKKwkJCQlyZWdzLT5jcDBfc3RhdHVzICY9IH5TVDBfSUU7CisJCQkJcmVncy0+Y3AwX3N0YXR1cyB8PSBrY2ItPmtwcm9iZV9zYXZlZF9TUjsKKwkJCQlnb3RvIG5vX2twcm9iZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBoYXZlIHJlZW50ZXJlZCB0aGUga3Byb2JlX2hhbmRsZXIoKSwgc2luY2UKKwkJCSAqIGFub3RoZXIgcHJvYmUgd2FzIGhpdCB3aGlsZSB3aXRoaW4gdGhlIGhhbmRsZXIuCisJCQkgKiBXZSBoZXJlIHNhdmUgdGhlIG9yaWdpbmFsIGtwcm9iZXMgdmFyaWFibGVzIGFuZAorCQkJICoganVzdCBzaW5nbGUgc3RlcCBvbiB0aGUgaW5zdHJ1Y3Rpb24gb2YgdGhlIG5ldyBwcm9iZQorCQkJICogd2l0aG91dCBjYWxsaW5nIGFueSB1c2VyIGhhbmRsZXJzLgorCQkJICovCisJCQlzYXZlX3ByZXZpb3VzX2twcm9iZShrY2IpOworCQkJc2V0X2N1cnJlbnRfa3Byb2JlKHAsIHJlZ3MsIGtjYik7CisJCQlrcHJvYmVzX2luY19ubWlzc2VkX2NvdW50KHApOworCQkJcHJlcGFyZV9zaW5nbGVzdGVwKHAsIHJlZ3MpOworCQkJa2NiLT5rcHJvYmVfc3RhdHVzID0gS1BST0JFX1JFRU5URVI7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhZGRyLT53b3JkICE9IGJyZWFrcG9pbnRfaW5zbi53b3JkKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCBieQorCQkJCSAqIGFub3RoZXIgY3B1IHJpZ2h0IGFmdGVyIHdlIGhpdCwgbm8gZnVydGhlcgorCQkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlCisJCQkJICovCisJCQkJcmV0ID0gMTsKKwkJCQlnb3RvIG5vX2twcm9iZTsKKwkJCX0KKwkJCXAgPSBfX2dldF9jcHVfdmFyKGN1cnJlbnRfa3Byb2JlKTsKKwkJCWlmIChwLT5icmVha19oYW5kbGVyICYmIHAtPmJyZWFrX2hhbmRsZXIocCwgcmVncykpCisJCQkJZ290byBzc19wcm9iZTsKKwkJfQorCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlwID0gZ2V0X2twcm9iZShhZGRyKTsKKwlpZiAoIXApIHsKKwkJaWYgKGFkZHItPndvcmQgIT0gYnJlYWtwb2ludF9pbnNuLndvcmQpIHsKKwkJCS8qCisJCQkgKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCByaWdodAorCQkJICogYWZ0ZXIgd2UgaGl0IGl0LiAgQW5vdGhlciBjcHUgaGFzIHJlbW92ZWQKKwkJCSAqIGVpdGhlciBhIHByb2JlcG9pbnQgb3IgYSBkZWJ1Z2dlciBicmVha3BvaW50CisJCQkgKiBhdCB0aGlzIGFkZHJlc3MuICBJbiBlaXRoZXIgY2FzZSwgbm8gZnVydGhlcgorCQkJICogaGFuZGxpbmcgb2YgdGhpcyBpbnRlcnJ1cHQgaXMgYXBwcm9wcmlhdGUuCisJCQkgKi8KKwkJCXJldCA9IDE7CisJCX0KKwkJLyogTm90IG9uZSBvZiBvdXJzOiBsZXQga2VybmVsIGhhbmRsZSBpdCAqLworCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlzZXRfY3VycmVudF9rcHJvYmUocCwgcmVncywga2NiKTsKKwlrY2ItPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX0FDVElWRTsKKworCWlmIChwLT5wcmVfaGFuZGxlciAmJiBwLT5wcmVfaGFuZGxlcihwLCByZWdzKSkgeworCQkvKiBoYW5kbGVyIGhhcyBhbHJlYWR5IHNldCB0aGluZ3MgdXAsIHNvIHNraXAgc3Mgc2V0dXAgKi8KKwkJcmV0dXJuIDE7CisJfQorCitzc19wcm9iZToKKwlwcmVwYXJlX3NpbmdsZXN0ZXAocCwgcmVncyk7CisJa2NiLT5rcHJvYmVfc3RhdHVzID0gS1BST0JFX0hJVF9TUzsKKwlyZXR1cm4gMTsKKworbm9fa3Byb2JlOgorCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgc2luZ2xlLXN0ZXBwaW5nLiAgcC0+YWRkciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAqIGluc3RydWN0aW9uIHdob3NlIGZpcnN0IGJ5dGUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICJicmVhayAwIgorICogaW5zdHJ1Y3Rpb24uICBUbyBhdm9pZCB0aGUgU01QIHByb2JsZW1zIHRoYXQgY2FuIG9jY3VyIHdoZW4gd2UKKyAqIHRlbXBvcmFyaWx5IHB1dCBiYWNrIHRoZSBvcmlnaW5hbCBvcGNvZGUgdG8gc2luZ2xlLXN0ZXAsIHdlCisgKiBzaW5nbGUtc3RlcHBlZCBhIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcworICogY29weSBpcyBwLT5haW5zbi5pbnNuLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdG8gcmV0dXJuIGZyb20gdGhlIHBvc3Qtc2luZ2xlLXN0ZXAKKyAqIGJyZWFrcG9pbnQgdHJhcC4KKyAqLworc3RhdGljIHZvaWQgX19rcHJvYmVzIHJlc3VtZV9leGVjdXRpb24oc3RydWN0IGtwcm9iZSAqcCwKKwkJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgICAgIHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnX2VwYyA9IGtjYi0+a3Byb2JlX3NhdmVkX2VwYzsKKwlyZWdzLT5jcDBfZXBjID0gb3JpZ19lcGMgKyA0OworfQorCitzdGF0aWMgaW5saW5lIGludCBwb3N0X2twcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcHJvYmUgKmN1ciA9IGtwcm9iZV9ydW5uaW5nKCk7CisJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisKKwlpZiAoIWN1cikKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGtjYi0+a3Byb2JlX3N0YXR1cyAhPSBLUFJPQkVfUkVFTlRFUikgJiYgY3VyLT5wb3N0X2hhbmRsZXIpIHsKKwkJa2NiLT5rcHJvYmVfc3RhdHVzID0gS1BST0JFX0hJVF9TU0RPTkU7CisJCWN1ci0+cG9zdF9oYW5kbGVyKGN1ciwgcmVncywgMCk7CisJfQorCisJcmVzdW1lX2V4ZWN1dGlvbihjdXIsIHJlZ3MsIGtjYik7CisKKwlyZWdzLT5jcDBfc3RhdHVzIHw9IGtjYi0+a3Byb2JlX3NhdmVkX1NSOworCisJLyogUmVzdG9yZSBiYWNrIHRoZSBvcmlnaW5hbCBzYXZlZCBrcHJvYmVzIHZhcmlhYmxlcyBhbmQgY29udGludWUuICovCisJaWYgKGtjYi0+a3Byb2JlX3N0YXR1cyA9PSBLUFJPQkVfUkVFTlRFUikgeworCQlyZXN0b3JlX3ByZXZpb3VzX2twcm9iZShrY2IpOworCQlnb3RvIG91dDsKKwl9CisJcmVzZXRfY3VycmVudF9rcHJvYmUoKTsKK291dDoKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpCit7CisJc3RydWN0IGtwcm9iZSAqY3VyID0ga3Byb2JlX3J1bm5pbmcoKTsKKwlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKKworCWlmIChjdXItPmZhdWx0X2hhbmRsZXIgJiYgY3VyLT5mYXVsdF9oYW5kbGVyKGN1ciwgcmVncywgdHJhcG5yKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoa2NiLT5rcHJvYmVfc3RhdHVzICYgS1BST0JFX0hJVF9TUykgeworCQlyZXN1bWVfZXhlY3V0aW9uKGN1ciwgcmVncywga2NiKTsKKwkJcmVncy0+Y3AwX3N0YXR1cyB8PSBrY2ItPmtwcm9iZV9vbGRfU1I7CisKKwkJcmVzZXRfY3VycmVudF9rcHJvYmUoKTsKKwkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyYXBwZXIgcm91dGluZSBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KKyAqLworaW50IF9fa3Byb2JlcyBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOworCWludCByZXQgPSBOT1RJRllfRE9ORTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBESUVfQlJFQUs6CisJCWlmIChrcHJvYmVfaGFuZGxlcihhcmdzLT5yZWdzKSkKKwkJCXJldCA9IE5PVElGWV9TVE9QOworCQlicmVhazsKKwljYXNlIERJRV9TU1RFUEJQOgorCQlpZiAocG9zdF9rcHJvYmVfaGFuZGxlcihhcmdzLT5yZWdzKSkKKwkJCXJldCA9IE5PVElGWV9TVE9QOworCQlicmVhazsKKworCWNhc2UgRElFX1BBR0VfRkFVTFQ6CisJCS8qIGtwcm9iZV9ydW5uaW5nKCkgbmVlZHMgc21wX3Byb2Nlc3Nvcl9pZCgpICovCisJCXByZWVtcHRfZGlzYWJsZSgpOworCisJCWlmIChrcHJvYmVfcnVubmluZygpCisJCSAgICAmJiBrcHJvYmVfZmF1bHRfaGFuZGxlcihhcmdzLT5yZWdzLCBhcmdzLT50cmFwbnIpKQorCQkJcmV0ID0gTk9USUZZX1NUT1A7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgX19rcHJvYmVzIHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CisJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisKKwlrY2ItPmpwcm9iZV9zYXZlZF9yZWdzID0gKnJlZ3M7CisJa2NiLT5qcHJvYmVfc2F2ZWRfc3AgPSByZWdzLT5yZWdzWzI5XTsKKworCW1lbWNweShrY2ItPmpwcm9iZXNfc3RhY2ssICh2b2lkICopa2NiLT5qcHJvYmVfc2F2ZWRfc3AsCisJICAgICAgIE1JTl9KUFJPQkVTX1NUQUNLX1NJWkUoa2NiLT5qcHJvYmVfc2F2ZWRfc3ApKTsKKworCXJlZ3MtPmNwMF9lcGMgPSAodW5zaWduZWQgbG9uZykoanAtPmVudHJ5KTsKKworCXJldHVybiAxOworfQorCisvKiBEZWZpbmVkIGluIHRoZSBpbmxpbmUgYXNtIGJlbG93LiAqLwordm9pZCBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKTsKKwordm9pZCBfX2twcm9iZXMganByb2JlX3JldHVybih2b2lkKQoreworCS8qIEFzc2VtYmxlciBxdWlyayBuZWNlc3NpdGF0ZXMgdGhpcyAnMCxjb2RlJyBidXNpbmVzcy4gICovCisJYXNtIHZvbGF0aWxlKAorCQkiYnJlYWsgMCwlMFxuXHQiCisJCSIuZ2xvYmwganByb2JlX3JldHVybl9lbmRcbiIKKwkJImpwcm9iZV9yZXR1cm5fZW5kOlxuIgorCQk6IDogIm4iIChCUktfS1BST0JFX0JQKSA6ICJtZW1vcnkiKTsKK30KKworaW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisKKwlpZiAocmVncy0+Y3AwX2VwYyA+PSAodW5zaWduZWQgbG9uZylqcHJvYmVfcmV0dXJuICYmCisJICAgIHJlZ3MtPmNwMF9lcGMgPD0gKHVuc2lnbmVkIGxvbmcpanByb2JlX3JldHVybl9lbmQpIHsKKwkJKnJlZ3MgPSBrY2ItPmpwcm9iZV9zYXZlZF9yZWdzOworCQltZW1jcHkoKHZvaWQgKilrY2ItPmpwcm9iZV9zYXZlZF9zcCwga2NiLT5qcHJvYmVzX3N0YWNrLAorCQkgICAgICAgTUlOX0pQUk9CRVNfU1RBQ0tfU0laRShrY2ItPmpwcm9iZV9zYXZlZF9zcCkpOworCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gcmV0dXJuIHByb2JlIHRyYW1wb2xpbmU6CisgKgktIGluaXRfa3Byb2JlcygpIGVzdGFibGlzaGVzIGEgcHJvYmVwb2ludCBoZXJlCisgKgktIFdoZW4gdGhlIHByb2JlZCBmdW5jdGlvbiByZXR1cm5zLCB0aGlzIHByb2JlIGNhdXNlcyB0aGUKKyAqCSAgaGFuZGxlcnMgdG8gZmlyZQorICovCitzdGF0aWMgdm9pZCBfX3VzZWQga3JldHByb2JlX3RyYW1wb2xpbmVfaG9sZGVyKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKAorCQkiLnNldCBwdXNoXG5cdCIKKwkJLyogS2VlcCB0aGUgYXNzZW1ibGVyIGZyb20gcmVvcmRlcmluZyBhbmQgcGxhY2luZyBKUiBoZXJlLiAqLworCQkiLnNldCBub3Jlb3JkZXJcblx0IgorCQkibm9wXG5cdCIKKwkJIi5nbG9iYWwga3JldHByb2JlX3RyYW1wb2xpbmVcbiIKKwkJImtyZXRwcm9iZV90cmFtcG9saW5lOlxuXHQiCisJCSJub3Bcblx0IgorCQkiLnNldCBwb3AiCisJCTogOiA6ICJtZW1vcnkiKTsKK30KKwordm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKTsKKwordm9pZCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyaS0+cmV0X2FkZHIgPSAoa3Byb2JlX29wY29kZV90ICopIHJlZ3MtPnJlZ3NbMzFdOworCisJLyogUmVwbGFjZSB0aGUgcmV0dXJuIGFkZHIgd2l0aCB0cmFtcG9saW5lIGFkZHIgKi8KKwlyZWdzLT5yZWdzWzMxXSA9ICh1bnNpZ25lZCBsb25nKWtyZXRwcm9iZV90cmFtcG9saW5lOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIHByb2JlIGF0IGtyZXRwcm9iZSB0cmFtcG9saW5lIGlzIGhpdAorICovCitzdGF0aWMgaW50IF9fa3Byb2JlcyB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwKKwkJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgZW1wdHlfcnA7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFncywgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylrcmV0cHJvYmVfdHJhbXBvbGluZTsKKworCUlOSVRfSExJU1RfSEVBRCgmZW1wdHlfcnApOworCWtyZXRwcm9iZV9oYXNoX2xvY2soY3VycmVudCwgJmhlYWQsICZmbGFncyk7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCisJICogdGFzayBlaXRoZXIgYmVjYXVzZSBhbiBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aAorCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoYW4gb25lIHJldHVybgorCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCisJICoKKwkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKKwkgKiAgICAgLSBpbnN0YW5jZXMgYXJlIGFsd2F5cyBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdAorCSAqICAgICAtIHdoZW4gbXVsdGlwbGUgcmV0dXJuIHByb2JlcyBhcmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUKKwkgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKwkJaWYgKHJpLT50YXNrICE9IGN1cnJlbnQpCisJCQkvKiBhbm90aGVyIHRhc2sgaXMgc2hhcmluZyBvdXIgaGFzaCBidWNrZXQgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmIChyaS0+cnAgJiYgcmktPnJwLT5oYW5kbGVyKQorCQkJcmktPnJwLT5oYW5kbGVyKHJpLCByZWdzKTsKKworCQlvcmlnX3JldF9hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpcmktPnJldF9hZGRyOworCQlyZWN5Y2xlX3JwX2luc3QocmksICZlbXB0eV9ycCk7CisKKwkJaWYgKG9yaWdfcmV0X2FkZHJlc3MgIT0gdHJhbXBvbGluZV9hZGRyZXNzKQorCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgcmV0dXJuIGFkZHJlc3MuIEFueSBvdGhlcgorCQkJICogaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sgYXJlIGZvcgorCQkJICogb3RoZXIgY2FsbHMgZGVlcGVyIG9uIHRoZSBjYWxsIHN0YWNrCisJCQkgKi8KKwkJCWJyZWFrOworCX0KKworCWtyZXRwcm9iZV9hc3NlcnQocmksIG9yaWdfcmV0X2FkZHJlc3MsIHRyYW1wb2xpbmVfYWRkcmVzcyk7CisJaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSA9IG9yaWdfcmV0X2FkZHJlc3M7CisKKwlyZXNldF9jdXJyZW50X2twcm9iZSgpOworCWtyZXRwcm9iZV9oYXNoX3VubG9jayhjdXJyZW50LCAmZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgJmVtcHR5X3JwLCBobGlzdCkgeworCQlobGlzdF9kZWwoJnJpLT5obGlzdCk7CisJCWtmcmVlKHJpKTsKKwl9CisJLyoKKwkgKiBCeSByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSwgd2UgYXJlIHRlbGxpbmcKKwkgKiBrcHJvYmVfaGFuZGxlcigpIHRoYXQgd2UgZG9uJ3Qgd2FudCB0aGUgcG9zdF9oYW5kbGVyCisJICogdG8gcnVuIChhbmQgaGF2ZSByZS1lbmFibGVkIHByZWVtcHRpb24pCisJICovCisJcmV0dXJuIDE7Cit9CisKK2ludCBfX2twcm9iZXMgYXJjaF90cmFtcG9saW5lX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCWlmIChwLT5hZGRyID09IChrcHJvYmVfb3Bjb2RlX3QgKilrcmV0cHJvYmVfdHJhbXBvbGluZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrcHJvYmUgdHJhbXBvbGluZV9wID0geworCS5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKWtyZXRwcm9iZV90cmFtcG9saW5lLAorCS5wcmVfaGFuZGxlciA9IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcgorfTsKKworaW50IF9faW5pdCBhcmNoX2luaXRfa3Byb2Jlcyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9rcHJvYmUoJnRyYW1wb2xpbmVfcCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21jb3VudC5TIGIvYXJjaC9taXBzL2tlcm5lbC9tY291bnQuUwppbmRleCA2YmZjYjdhLi40Yzk2OGU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21jb3VudC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbWNvdW50LlMKQEAgLTE2NSwxMiArMTY1LDEyIEBACiAKIAkvKiBhcmczOiBHZXQgZnJhbWUgcG9pbnRlciBvZiBjdXJyZW50IHN0YWNrICovCiAjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQkgbW92ZQlhMiwgZnAKKwltb3ZlCWEyLCBmcAogI2Vsc2UgLyogISBDT05GSUdfRlJBTUVfUE9JTlRFUiAqLwogI2lmZGVmIENPTkZJR182NEJJVAotCSBQVFJfTEEJYTIsIFBUX1NJWkUoc3ApCisJUFRSX0xBCWEyLCBQVF9TSVpFKHNwKQogI2Vsc2UKLQkgUFRSX0xBCWEyLCAoUFRfU0laRSs4KShzcCkKKwlQVFJfTEEJYTIsIChQVF9TSVpFKzgpKHNwKQogI2VuZGlmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCmluZGV4IGE0ZmFjZWUuLmEzZDY2MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKQEAgLTQwMCwyMiArNDAwLDIyIEBACiAJUFRSCXN5c19pb3ByaW9fc2V0CiAJUFRSCXN5c19pb3ByaW9fZ2V0CiAJUFRSCWNvbXBhdF9zeXNfdXRpbWVuc2F0Ci0JUFRSCWNvbXBhdF9zeXNfc2lnbmFsZmQJCS8qIDUyODAgKi8KKwlQVFIJY29tcGF0X3N5c19zaWduYWxmZAkJLyogNjI4MCAqLwogCVBUUglzeXNfbmlfc3lzY2FsbAogCVBUUglzeXNfZXZlbnRmZAogCVBUUglzeXNfZmFsbG9jYXRlCiAJUFRSCXN5c190aW1lcmZkX2NyZWF0ZQotCVBUUgljb21wYXRfc3lzX3RpbWVyZmRfZ2V0dGltZQkvKiA1Mjg1ICovCisJUFRSCWNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lCS8qIDYyODUgKi8KIAlQVFIJY29tcGF0X3N5c190aW1lcmZkX3NldHRpbWUKIAlQVFIJc3lzX3NpZ25hbGZkNAogCVBUUglzeXNfZXZlbnRmZDIKIAlQVFIJc3lzX2Vwb2xsX2NyZWF0ZTEKLQlQVFIJc3lzX2R1cDMJCQkvKiA1MjkwICovCisJUFRSCXN5c19kdXAzCQkJLyogNjI5MCAqLwogCVBUUglzeXNfcGlwZTIKIAlQVFIJc3lzX2lub3RpZnlfaW5pdDEKIAlQVFIJc3lzX3ByZWFkdgogCVBUUglzeXNfcHdyaXRldgotCVBUUgljb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvCS8qIDUyOTUgKi8KKwlQVFIJY29tcGF0X3N5c19ydF90Z3NpZ3F1ZXVlaW5mbwkvKiA2Mjk1ICovCiAJUFRSCXN5c19wZXJmX2V2ZW50X29wZW4KIAlQVFIJc3lzX2FjY2VwdDQKIAlQVFIgICAgIGNvbXBhdF9zeXNfcmVjdm1tc2cKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCmluZGV4IDZjZGNhMTkuLjM4M2FlYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAuYwpAQCAtNDcsOCArNDcsMTIgQEAKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAKIHZvbGF0aWxlIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsJLyogQml0bWFzayBvZiBzdGFydGVkIHNlY29uZGFyaWVzICovCisKIGludCBfX2NwdV9udW1iZXJfbWFwW05SX0NQVVNdOwkJLyogTWFwIHBoeXNpY2FsIHRvIGxvZ2ljYWwgKi8KK0VYUE9SVF9TWU1CT0woX19jcHVfbnVtYmVyX21hcCk7CisKIGludCBfX2NwdV9sb2dpY2FsX21hcFtOUl9DUFVTXTsJCS8qIE1hcCBsb2dpY2FsIHRvIHBoeXNpY2FsICovCitFWFBPUlRfU1lNQk9MKF9fY3B1X2xvZ2ljYWxfbWFwKTsKIAogLyogTnVtYmVyIG9mIFRDcyAob3Igc2libGluZ3MgaW4gSW50ZWwgc3BlYWspIHBlciBDUFUgY29yZSAqLwogaW50IHNtcF9udW1fc2libGluZ3MgPSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMgYi9hcmNoL21pcHMva2VybmVsL3NtdGMuYwppbmRleCBhOTVkZWE1Li5jZmViMmMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtdGMuYwpAQCAtOTc1LDggKzk3NSw3IEBACiAJCQlpcGlfY2FsbF9pbnRlcnJ1cHQoKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJJbXBvc3NpYmxlIFNNVEMgSVBJIEFyZ3VtZW50IDB4JXhcbiIsCi0JCQkJKGludClhcmdfY29weSk7CisJCQlwcmludGsoIkltcG9zc2libGUgU01UQyBJUEkgQXJndW1lbnQgJXBcbiIsIGFyZ19jb3B5KTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCBkZDgxYjBmLi41OGJhYjJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2JyYW5jaC5oPgpAQCAtMTE2LDcgKzExOCw3IEBACiAJCSAgICAoIXZtbSB8fCBhZGRyICsgbGVuIDw9IHZtbS0+dm1fc3RhcnQpKQogCQkJcmV0dXJuIGFkZHI7CiAJfQotCWFkZHIgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CisJYWRkciA9IGN1cnJlbnQtPm1tLT5tbWFwX2Jhc2U7CiAJaWYgKGRvX2NvbG9yX2FsaWduKQogCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKTsKIAllbHNlCkBAIC0xMzQsNiArMTM2LDUxIEBACiAJfQogfQogCit2b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJhbmRvbV9mYWN0b3IgPSAwVUw7CisKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpIHsKKwkJcmFuZG9tX2ZhY3RvciA9IGdldF9yYW5kb21faW50KCk7CisJCXJhbmRvbV9mYWN0b3IgPSByYW5kb21fZmFjdG9yIDw8IFBBR0VfU0hJRlQ7CisJCWlmIChUQVNLX0lTXzMyQklUX0FERFIpCisJCQlyYW5kb21fZmFjdG9yICY9IDB4ZmZmZmZmdWw7CisJCWVsc2UKKwkJCXJhbmRvbV9mYWN0b3IgJj0gMHhmZmZmZmZmdWw7CisJfQorCisJbW0tPm1tYXBfYmFzZSA9IFRBU0tfVU5NQVBQRURfQkFTRSArIHJhbmRvbV9mYWN0b3I7CisJbW0tPmdldF91bm1hcHBlZF9hcmVhID0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYTsKKwltbS0+dW5tYXBfYXJlYSA9IGFyY2hfdW5tYXBfYXJlYTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJya19ybmQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJuZCA9IGdldF9yYW5kb21faW50KCk7CisKKwlybmQgPSBybmQgPDwgUEFHRV9TSElGVDsKKwkvKiA4TUIgZm9yIDMyYml0LCAyNTZNQiBmb3IgNjRiaXQgKi8KKwlpZiAoVEFTS19JU18zMkJJVF9BRERSKQorCQlybmQgPSBybmQgJiAweDdmZmZmZnVsOworCWVsc2UKKwkJcm5kID0gcm5kICYgMHhmZmZmZmZmdWw7CisKKwlyZXR1cm4gcm5kOworfQorCit1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBtbS0+YnJrOworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJcmV0ID0gUEFHRV9BTElHTihiYXNlICsgYnJrX3JuZCgpKTsKKworCWlmIChyZXQgPCBtbS0+YnJrKQorCQlyZXR1cm4gbW0tPmJyazsKKworCXJldHVybiByZXQ7Cit9CisKIFNZU0NBTExfREVGSU5FNihtaXBzX21tYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHVuc2lnbmVkIGxvbmcsIGxlbiwKIAl1bnNpZ25lZCBsb25nLCBwcm90LCB1bnNpZ25lZCBsb25nLCBmbGFncywgdW5zaWduZWQgbG9uZywKIAlmZCwgb2ZmX3QsIG9mZnNldCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCA4NTI3ODA4Li4wM2VjMDAxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2tkYi5oPgogCkBAIC0zMzQsNyArMzM1LDcgQEAKIAlfX3Nob3dfcmVncygoc3RydWN0IHB0X3JlZ3MgKilyZWdzKTsKIH0KIAotdm9pZCBzaG93X3JlZ2lzdGVycyhjb25zdCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJY29uc3QgaW50IGZpZWxkID0gMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIApAQCAtMzU2LDkgKzM1NywxNCBAQAogCXByaW50aygiXG4iKTsKIH0KIAorc3RhdGljIGludCByZWdzX3RvX3RyYXBucihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gKHJlZ3MtPmNwMF9jYXVzZSA+PiAyKSAmIDB4MWY7Cit9CisKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOwogCi12b2lkIF9fbm9yZXR1cm4gZGllKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3ZvaWQgX19ub3JldHVybiBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdGF0aWMgaW50IGRpZV9jb3VudGVyOwogCWludCBzaWcgPSBTSUdTRUdWOwpAQCAtMzY2LDcgKzM3Miw3IEBACiAJdW5zaWduZWQgbG9uZyBkdnByZXQgPSBkdnBlKCk7CiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwogCi0Jbm90aWZ5X2RpZShESUVfT09QUywgc3RyLCAoc3RydWN0IHB0X3JlZ3MgKilyZWdzLCBTSUdTRUdWLCAwLCAwKTsKKwlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIDAsIHJlZ3NfdG9fdHJhcG5yKHJlZ3MpLCBTSUdTRUdWKTsKIAogCWNvbnNvbGVfdmVyYm9zZSgpOwogCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKQEAgLTM3NSw3ICszODEsNyBAQAogCW1pcHNfbXRfcmVnZHVtcChkdnByZXQpOwogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAotCWlmIChub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIDAsIGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCBTSUdTRUdWKSA9PSBOT1RJRllfU1RPUCkKKwlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCAwLCByZWdzX3RvX3RyYXBucihyZWdzKSwgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCiAJCXNpZyA9IDA7CiAKIAlwcmludGsoIiVzWyMlZF06XG4iLCBzdHIsICsrZGllX2NvdW50ZXIpOwpAQCAtNDQ5LDcgKzQ1NSw3IEBACiAJcHJpbnRrKEtFUk5fQUxFUlQgIiVzIGJ1cyBlcnJvciwgZXBjID09ICUwKmx4LCByYSA9PSAlMCpseFxuIiwKIAkgICAgICAgZGF0YSA/ICJEYXRhIiA6ICJJbnN0cnVjdGlvbiIsCiAJICAgICAgIGZpZWxkLCByZWdzLT5jcDBfZXBjLCBmaWVsZCwgcmVncy0+cmVnc1szMV0pOwotCWlmIChub3RpZnlfZGllKERJRV9PT1BTLCAiYnVzIGVycm9yIiwgcmVncywgU0lHQlVTLCAwLCAwKQorCWlmIChub3RpZnlfZGllKERJRV9PT1BTLCAiYnVzIGVycm9yIiwgcmVncywgMCwgcmVnc190b190cmFwbnIocmVncyksIFNJR0JVUykKIAkgICAgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKIApAQCAtNjUwLDcgKzY1Niw3IEBACiB7CiAJc2lnaW5mb190IGluZm87CiAKLQlpZiAobm90aWZ5X2RpZShESUVfRlAsICJGUCBleGNlcHRpb24iLCByZWdzLCBTSUdGUEUsIDAsIDApCisJaWYgKG5vdGlmeV9kaWUoRElFX0ZQLCAiRlAgZXhjZXB0aW9uIiwgcmVncywgMCwgcmVnc190b190cmFwbnIocmVncyksIFNJR0ZQRSkKIAkgICAgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKIAlkaWVfaWZfa2VybmVsKCJGUCBleGNlcHRpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzKTsKQEAgLTcxMywxMSArNzE5LDExIEBACiAJY2hhciBiWzQwXTsKIAogI2lmZGVmIENPTkZJR19LR0RCX0xPV19MRVZFTF9UUkFQCi0JaWYgKGtnZGJfbGxfdHJhcChESUVfVFJBUCwgc3RyLCByZWdzLCBjb2RlLCAwLCAwKSA9PSBOT1RJRllfU1RPUCkKKwlpZiAoa2dkYl9sbF90cmFwKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGNvZGUsIHJlZ3NfdG9fdHJhcG5yKHJlZ3MpLCBTSUdUUkFQKSA9PSBOT1RJRllfU1RPUCkKIAkJcmV0dXJuOwogI2VuZGlmIC8qIENPTkZJR19LR0RCX0xPV19MRVZFTF9UUkFQICovCiAKLQlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBjb2RlLCAwLCAwKSA9PSBOT1RJRllfU1RPUCkKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBjb2RlLCByZWdzX3RvX3RyYXBucihyZWdzKSwgU0lHVFJBUCkgPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKIAogCS8qCkBAIC03ODMsNiArNzg5LDI1IEBACiAJaWYgKGJjb2RlID49ICgxIDw8IDEwKSkKIAkJYmNvZGUgPj49IDEwOwogCisJLyoKKwkgKiBub3RpZnkgdGhlIGtwcm9iZSBoYW5kbGVycywgaWYgaW5zdHJ1Y3Rpb24gaXMgbGlrZWx5IHRvCisJICogcGVydGFpbiB0byB0aGVtLgorCSAqLworCXN3aXRjaCAoYmNvZGUpIHsKKwljYXNlIEJSS19LUFJPQkVfQlA6CisJCWlmIChub3RpZnlfZGllKERJRV9CUkVBSywgImRlYnVnIiwgcmVncywgYmNvZGUsIHJlZ3NfdG9fdHJhcG5yKHJlZ3MpLCBTSUdUUkFQKSA9PSBOT1RJRllfU1RPUCkKKwkJCXJldHVybjsKKwkJZWxzZQorCQkJYnJlYWs7CisJY2FzZSBCUktfS1BST0JFX1NTVEVQQlA6CisJCWlmIChub3RpZnlfZGllKERJRV9TU1RFUEJQLCAic2luZ2xlX3N0ZXAiLCByZWdzLCBiY29kZSwgcmVnc190b190cmFwbnIocmVncyksIFNJR1RSQVApID09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworCQllbHNlCisJCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlkb190cmFwX29yX2JwKHJlZ3MsIGJjb2RlLCAiQnJlYWsiKTsKIAlyZXR1cm47CiAKQEAgLTgxNSw3ICs4NDAsNyBAQAogCXVuc2lnbmVkIGludCBvcGNvZGUgPSAwOwogCWludCBzdGF0dXMgPSAtMTsKIAotCWlmIChub3RpZnlfZGllKERJRV9SSSwgIlJJIEZhdWx0IiwgcmVncywgU0lHU0VHViwgMCwgMCkKKwlpZiAobm90aWZ5X2RpZShESUVfUkksICJSSSBGYXVsdCIsIHJlZ3MsIDAsIHJlZ3NfdG9fdHJhcG5yKHJlZ3MpLCBTSUdJTEwpCiAJICAgID09IE5PVElGWV9TVE9QKQogCQlyZXR1cm47CiAKQEAgLTkwNywxMSArOTMyLDYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGRlZmF1bHRfY3UyX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gZGVmYXVsdF9jdTJfY2FsbCwKLQkucHJpb3JpdHkJPSAweDgwMDAwMDAwLAkJLyogUnVuIGxhc3QgICovCi19OwotCiBhc21saW5rYWdlIHZvaWQgZG9fY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGludCBfX3VzZXIgKmVwYzsKQEAgLTE3MzQsNSArMTc1NCw1IEBACiAKIAlzb3J0X2V4dGFibGUoX19zdGFydF9fX2RiZV90YWJsZSwgX19zdG9wX19fZGJlX3RhYmxlKTsKIAotCXJlZ2lzdGVyX2N1Ml9ub3RpZmllcigmZGVmYXVsdF9jdTJfbm90aWZpZXIpOworCWN1Ml9ub3RpZmllcihkZWZhdWx0X2N1Ml9jYWxsLCAweDgwMDAwMDAwKTsJLyogUnVuIGxhc3QgICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvTWFrZWZpbGUgYi9hcmNoL21pcHMvbGFzYXQvTWFrZWZpbGUKaW5kZXggMzM3OTE2MC4uOWNjNGU0ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xhc2F0L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9NYWtlZmlsZQpAQCAtMTIsNSArMTIsMyBAQAogCiBjbGVhbjoKIAltYWtlIC1DIGltYWdlIGNsZWFuCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvUGxhdGZvcm0gYi9hcmNoL21pcHMvbGFzYXQvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwMjUyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9QbGF0Zm9ybQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTEFTQVQgcGxhdGZvcm1zCisjCitwbGF0Zm9ybS0kKENPTkZJR19MQVNBVCkJKz0gbGFzYXQvCitjZmxhZ3MtJChDT05GSUdfTEFTQVQpCQkrPQkJCQkJXAorCQktSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFzYXQKK2xvYWQtJChDT05GSUdfTEFTQVQpCQkrPSAweGZmZmZmZmZmODAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY5MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL1BsYXRmb3JtCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTG9vbmdzb24gUHJvY2Vzc29ycycgU3VwcG9ydAorIworCisjIE9ubHkgZ2NjID49IDQuNCBoYXZlIExvb25nc29uIHNwZWNpZmljIHN1cHBvcnQKK2NmbGFncy0kKENPTkZJR19DUFVfTE9PTkdTT04yKQkrPSAtV2EsLS10cmFwCitjZmxhZ3MtJChDT05GSUdfQ1BVX0xPT05HU09OMkUpICs9IFwKKwkkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1sb29uZ3NvbjJlLC1tYXJjaD1yNDYwMCkKK2NmbGFncy0kKENPTkZJR19DUFVfTE9PTkdTT04yRikgKz0gXAorCSQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWxvb25nc29uMmYsLW1hcmNoPXI0NjAwKQorIyBFbmFibGUgdGhlIHdvcmthcm91bmRzIGZvciBMb29uZ3NvbjJmCitpZmRlZiBDT05GSUdfQ1BVX0xPT05HU09OMkZfV09SS0FST1VORFMKKyAgaWZlcSAoJChjYWxsIGFzLW9wdGlvbiwtV2EkKGNvbW1hKS1tZml4LWxvb25nc29uMmYtbm9wLCksKQorICAgICQoZXJyb3Igb25seSBiaW51dGlscyA+PSAyLjIwLjIgaGF2ZSBuZWVkZWQgb3B0aW9uIC1tZml4LWxvb25nc29uMmYtbm9wKQorICBlbHNlCisgICAgY2ZsYWdzLSQoQ09ORklHX0NQVV9OT1BfV09SS0FST1VORFMpICs9IC1XYSQoY29tbWEpLW1maXgtbG9vbmdzb24yZi1ub3AKKyAgZW5kaWYKKyAgaWZlcSAoJChjYWxsIGFzLW9wdGlvbiwtV2EkKGNvbW1hKS1tZml4LWxvb25nc29uMmYtanVtcCwpLCkKKyAgICAkKGVycm9yIG9ubHkgYmludXRpbHMgPj0gMi4yMC4yIGhhdmUgbmVlZGVkIG9wdGlvbiAtbWZpeC1sb29uZ3NvbjJmLWp1bXApCisgIGVsc2UKKyAgICBjZmxhZ3MtJChDT05GSUdfQ1BVX0pVTVBfV09SS0FST1VORFMpICs9IC1XYSQoY29tbWEpLW1maXgtbG9vbmdzb24yZi1qdW1wCisgIGVuZGlmCitlbmRpZgorCisjCisjIExvb25nc29uIE1hY2hpbmVzJyBTdXBwb3J0CisjCisKK3BsYXRmb3JtLSQoQ09ORklHX01BQ0hfTE9PTkdTT04pICs9IGxvb25nc29uLworY2ZsYWdzLSQoQ09ORklHX01BQ0hfTE9PTkdTT04pICs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3NvbiAtbW5vLWJyYW5jaC1saWtlbHkKK2xvYWQtJChDT05GSUdfTEVNT1RFX0ZVTE9PTkcyRSkgKz0gMHhmZmZmZmZmZjgwMTAwMDAwCitsb2FkLSQoQ09ORklHX0xFTU9URV9NQUNIMkYpICs9IDB4ZmZmZmZmZmY4MDIwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9jczU1MzYvTWFrZWZpbGUgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2NzNTUzNi9NYWtlZmlsZQppbmRleCA1MTBkNGNkLi5mMTJlNjQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2NzNTUzNi9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2NzNTUzNi9NYWtlZmlsZQpAQCAtOSw1ICs5LDMgQEAKICMgRW5hYmxlIGNzNTUzNiBtZmdwdCBUaW1lcgogIwogb2JqLSQoQ09ORklHX0NTNTUzNl9NRkdQVCkgKz0gY3M1NTM2X21mZ3B0Lm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2lycS5jCmluZGV4IDIwZTczMjguLjU4OTc0NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9pcnEuYwpAQCAtMjEsMTkgKzIxLDE2IEBACiAKIAkvKiB3b3JrYXJvdW5kIHRoZSBJTyBkbWEgcHJvYmxlbTogbGV0IGNwdSBsb29waW5nIHRvIGFsbG93IERNQSBmaW5pc2ggKi8KIAlpbnRfc3RhdHVzID0gTE9PTkdTT05fSU5USVNSOwotCWlmIChpbnRfc3RhdHVzICYgKDEgPDwgMTApKSB7Ci0JCXdoaWxlIChpbnRfc3RhdHVzICYgKDEgPDwgMTApKSB7Ci0JCQl1ZGVsYXkoMSk7Ci0JCQlpbnRfc3RhdHVzID0gTE9PTkdTT05fSU5USVNSOwotCQl9CisJd2hpbGUgKGludF9zdGF0dXMgJiAoMSA8PCAxMCkpIHsKKwkJdWRlbGF5KDEpOworCQlpbnRfc3RhdHVzID0gTE9PTkdTT05fSU5USVNSOwogCX0KIAogCS8qIEdldCBwZW5kaW5nIHNvdXJjZXMsIG1hc2tlZCBieSBjdXJyZW50IGVuYWJsZXMgKi8KIAlpbnRfc3RhdHVzID0gTE9PTkdTT05fSU5USVNSICYgTE9PTkdTT05fSU5URU47CiAKLQlpZiAoaW50X3N0YXR1cyAhPSAwKSB7CisJaWYgKGludF9zdGF0dXMpIHsKIAkJaSA9IF9fZmZzKGludF9zdGF0dXMpOwotCQlpbnRfc3RhdHVzICY9IH4oMSA8PCBpKTsKIAkJZG9fSVJRKExPT05HU09OX0lSUV9CQVNFICsgaSk7CiAJfQogfQpAQCAtNTYsOSArNTMsNiBAQAogCSAqLwogCWNsZWFyX2MwX3N0YXR1cyhTVDBfSU0gfCBTVDBfQkVWKTsKIAotCS8qIHNldHRpbmcgaXJxIHRyaWdnZXIgbW9kZSAqLwotCXNldF9pcnFfdHJpZ2dlcl9tb2RlKCk7Ci0KIAkvKiBubyBzdGVlciAqLwogCUxPT05HU09OX0lOVFNURUVSID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2Z1bG9vbmctMmUvTWFrZWZpbGUgYi9hcmNoL21pcHMvbG9vbmdzb24vZnVsb29uZy0yZS9NYWtlZmlsZQppbmRleCAzYWJhNWZjLi5iNzYyMjcyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vZnVsb29uZy0yZS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vZnVsb29uZy0yZS9NYWtlZmlsZQpAQCAtMyw1ICszLDMgQEAKICMKIAogb2JqLXkgKz0gaXJxLm8gcmVzZXQubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2Z1bG9vbmctMmUvaXJxLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vZnVsb29uZy0yZS9pcnEuYwppbmRleCAzMjBlOTM3Li5kNjFhMDQyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vZnVsb29uZy0yZS9pcnEuYworKysgYi9hcmNoL21pcHMvbG9vbmdzb24vZnVsb29uZy0yZS9pcnEuYwpAQCAtMzAsNyArMzAsNyBAQAogCWlmIChwZW5kaW5nICYgQ0FVU0VGX0lQNykKIAkJZG9fSVJRKE1JUFNfQ1BVX0lSUV9CQVNFICsgNyk7CiAJZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDYpIC8qIHBlcmYgY291bnRlciBsb3ZlcmZsb3cgKi8KLQkJZG9fSVJRKExPT05HU09OMl9QRVJGQ05UX0lSUSk7CisJCWRvX3BlcmZjbnRfSVJRKCk7CiAJZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDUpCiAJCWk4MjU5X2lycWRpc3BhdGNoKCk7CiAJZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDIpCkBAIC00NCwxMyArNDQsNiBAQAogCS5uYW1lID0gImNhc2NhZGUiLAogfTsKIAotdm9pZCBfX2luaXQgc2V0X2lycV90cmlnZ2VyX21vZGUodm9pZCkKLXsKLQkvKiBtb3N0IGJvbml0byBpcnEgc2hvdWxkIGJlIGxldmVsIHRyaWdnZXJlZCAqLwotCUxPT05HU09OX0lOVEVER0UgPSBMT09OR1NPTl9JQ1VfU1lTVEVNRVJSIHwgTE9PTkdTT05fSUNVX01BU1RFUkVSUiB8Ci0JICAgIExPT05HU09OX0lDVV9SRVRSWUVSUiB8IExPT05HU09OX0lDVV9NQk9YRVM7Ci19Ci0KIHZvaWQgX19pbml0IG1hY2hfaW5pdF9pcnEodm9pZCkKIHsKIAkvKiBpbml0IGFsbCBjb250cm9sbGVyCkBAIC01OSw2ICs1MiwxMCBAQAogCSAqICAgMzItNjMgICAgICAgIC0tLS0tLT4gYm9uaXRvIGlycQogCSAqLwogCisJLyogbW9zdCBib25pdG8gaXJxIHNob3VsZCBiZSBsZXZlbCB0cmlnZ2VyZWQgKi8KKwlMT09OR1NPTl9JTlRFREdFID0gTE9PTkdTT05fSUNVX1NZU1RFTUVSUiB8IExPT05HU09OX0lDVV9NQVNURVJFUlIgfAorCSAgICBMT09OR1NPTl9JQ1VfUkVUUllFUlIgfCBMT09OR1NPTl9JQ1VfTUJPWEVTOworCiAJLyogU2V0cyB0aGUgZmlyc3QtbGV2ZWwgaW50ZXJydXB0IGRpc3BhdGNoZXIuICovCiAJbWlwc19jcHVfaXJxX2luaXQoKTsKIAlpbml0X2k4MjU5X2lycXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9sZW1vdGUtMmYvaXJxLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vbGVtb3RlLTJmL2lycS5jCmluZGV4IDFkOGI0ZDIuLjA4MWRiMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9sZW1vdGUtMmYvaXJxLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2xlbW90ZS0yZi9pcnEuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPG1hY2hpbmUuaD4KIAogI2RlZmluZSBMT09OR1NPTl9USU1FUl9JUlEJKE1JUFNfQ1BVX0lSUV9CQVNFICsgNykJLyogY3B1IHRpbWVyICovCi0jZGVmaW5lIExPT05HU09OX1BFUkZDTlRfSVJRCShNSVBTX0NQVV9JUlFfQkFTRSArIDYpCS8qIGNwdSBwZXJmIGNvdW50ZXIgKi8KICNkZWZpbmUgTE9PTkdTT05fTk9SVEhfQlJJREdFX0lSUQkoTUlQU19DUFVfSVJRX0JBU0UgKyA2KQkvKiBib25pdG8gKi8KICNkZWZpbmUgTE9PTkdTT05fVUFSVF9JUlEJKE1JUFNfQ1BVX0lSUV9CQVNFICsgMykJLyogY3B1IHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIExPT05HU09OX1NPVVRIX0JSSURHRV9JUlEJKE1JUFNfQ1BVX0lSUV9CQVNFICsgMikJLyogaTgyNTkgKi8KQEAgLTc5LDkgKzc4LDcgQEAKIAlpZiAocGVuZGluZyAmIENBVVNFRl9JUDcpCiAJCWRvX0lSUShMT09OR1NPTl9USU1FUl9JUlEpOwogCWVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVA2KSB7CS8qIE5vcnRoIEJyaWRnZSwgUGVyZiBjb3VudGVyICovCi0jaWYgZGVmaW5lZChDT05GSUdfT1BST0ZJTEUpIHx8IGRlZmluZWQoQ09ORklHX09QUk9GSUxFX01PRFVMRSkKLQkJZG9fSVJRKExPT05HU09OMl9QRVJGQ05UX0lSUSk7Ci0jZW5kaWYKKwkJZG9fcGVyZmNudF9JUlEoKTsKIAkJYm9uaXRvX2lycWRpc3BhdGNoKCk7CiAJfSBlbHNlIGlmIChwZW5kaW5nICYgQ0FVU0VGX0lQMykJLyogQ1BVIFVBUlQgKi8KIAkJZG9fSVJRKExPT05HU09OX1VBUlRfSVJRKTsKQEAgLTkxLDEzICs4OCw2IEBACiAJCXNwdXJpb3VzX2ludGVycnVwdCgpOwogfQogCi12b2lkIF9faW5pdCBzZXRfaXJxX3RyaWdnZXJfbW9kZSh2b2lkKQotewotCS8qIHNldHVwIGNzNTUzNiBhcyBoaWdoIGxldmVsIHRyaWdnZXIgKi8KLQlMT09OR1NPTl9JTlRQT0wgPSBMT09OR1NPTl9JTlRfQklUX0lOVDAgfCBMT09OR1NPTl9JTlRfQklUX0lOVDE7Ci0JTE9PTkdTT05fSU5URURHRSAmPSB+KExPT05HU09OX0lOVF9CSVRfSU5UMCB8IExPT05HU09OX0lOVF9CSVRfSU5UMSk7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBpcDZfYWN0aW9uKGludCBjcGwsIHZvaWQgKmRldl9pZCkKIHsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xMjIsNiArMTEyLDEwIEBACiAJICogICAzMi02MyAgICAgICAgLS0tLS0tPiBib25pdG8gaXJxCiAJICovCiAKKwkvKiBzZXR1cCBjczU1MzYgYXMgaGlnaCBsZXZlbCB0cmlnZ2VyICovCisJTE9PTkdTT05fSU5UUE9MID0gTE9PTkdTT05fSU5UX0JJVF9JTlQwIHwgTE9PTkdTT05fSU5UX0JJVF9JTlQxOworCUxPT05HU09OX0lOVEVER0UgJj0gfihMT09OR1NPTl9JTlRfQklUX0lOVDAgfCBMT09OR1NPTl9JTlRfQklUX0lOVDEpOworCiAJLyogU2V0cyB0aGUgZmlyc3QtbGV2ZWwgaW50ZXJydXB0IGRpc3BhdGNoZXIuICovCiAJbWlwc19jcHVfaXJxX2luaXQoKTsKIAlpbml0X2k4MjU5X2lycXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tYXRoLWVtdS9NYWtlZmlsZQppbmRleCBkNTQ3ZWZkLi45NjYwNzIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L01ha2VmaWxlCkBAIC0xMCw0ICsxMCwzIEBACiAJICAgc3Bfc2NhbGIubyBzcF9zaW1wbGUubyBzcF90aW50Lm8gc3BfZmludC5vIHNwX3Rsb25nLm8gc3BfZmxvbmcubyBcCiAJICAgZHBfc3FydC5vIHNwX3NxcnQubyBrZXJuZWxfbGlua2FnZS5vIGRzZW11bC5vCiAKLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvZHBfbW9kZi5jIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX21vZGYuYwppbmRleCAyNTg2MWE0Li5hODU3MGU1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvZHBfbW9kZi5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9tb2RmLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogLyogbW9kZiBmdW5jdGlvbiBpcyBhbHdheXMgZXhhY3QgZm9yIGEgZmluaXRlIG51bWJlcgogKi8KLWllZWU3NTRkcCBpZWVlNzU0ZHBfbW9kZihpZWVlNzU0ZHAgeCwgaWVlZTc1NGRwICogaXApCitpZWVlNzU0ZHAgaWVlZTc1NGRwX21vZGYoaWVlZTc1NGRwIHgsIGllZWU3NTRkcCAqaXApCiB7CiAJQ09NUFhEUDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21hdGgtZW11L2RwX3RpbnQuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF90aW50LmMKaW5kZXggNzdiMmI3Yy4uMjQ0Nzg2MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2RwX3RpbnQuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUvZHBfdGludC5jCkBAIC02OSw4ICs2OSw3IEBACiAJCQlyb3VuZCA9IDA7CiAJCQlzdGlja3kgPSByZXNpZHVlICE9IDA7CiAJCQl4bSA9IDA7Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlyZXNpZHVlID0geG0gPDwgKDY0IC0gRFBfTUJJVFMgKyB4ZSk7CiAJCQlyb3VuZCA9IChyZXNpZHVlID4+IDYzKSAhPSAwOwogCQkJc3RpY2t5ID0gKHJlc2lkdWUgPDwgMSkgIT0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF90bG9uZy5jIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX3Rsb25nLmMKaW5kZXggZDcxMTEzZS4uMGYwN2VjMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2RwX3Rsb25nLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX3Rsb25nLmMKQEAgLTcxLDggKzcxLDcgQEAKIAkJCXJvdW5kID0gMDsKIAkJCXN0aWNreSA9IHJlc2lkdWUgIT0gMDsKIAkJCXhtID0gMDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIFNoaWZ0aW5nIGEgdTY0IDY0IHRpbWVzIGRvZXMgbm90IHdvcmssCiAJCQkqIHNvIHdlIGRvIGl0IGluIHR3byBzdGVwcy4gQmUgYXdhcmUgdGhhdCB4ZQogCQkJKiBtYXkgYmUgLTEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9tb2RmLmMgYi9hcmNoL21pcHMvbWF0aC1lbXUvc3BfbW9kZi5jCmluZGV4IDRiMWRiYWMuLjc2NTY4OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9tb2RmLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L3NwX21vZGYuYwpAQCAtMjksNyArMjksNyBAQAogCiAvKiBtb2RmIGZ1bmN0aW9uIGlzIGFsd2F5cyBleGFjdCBmb3IgYSBmaW5pdGUgbnVtYmVyCiAqLwotaWVlZTc1NHNwIGllZWU3NTRzcF9tb2RmKGllZWU3NTRzcCB4LCBpZWVlNzU0c3AgKiBpcCkKK2llZWU3NTRzcCBpZWVlNzU0c3BfbW9kZihpZWVlNzU0c3AgeCwgaWVlZTc1NHNwICppcCkKIHsKIAlDT01QWFNQOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvc3BfdGludC5jIGIvYXJjaC9taXBzL21hdGgtZW11L3NwX3RpbnQuYwppbmRleCAxZDczZDJhLi4zNTJkYzNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvc3BfdGludC5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF90aW50LmMKQEAgLTcyLDggKzcyLDcgQEAKIAkJCXJvdW5kID0gMDsKIAkJCXN0aWNreSA9IHJlc2lkdWUgIT0gMDsKIAkJCXhtID0gMDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCS8qIFNoaWZ0aW5nIGEgdTMyIDMyIHRpbWVzIGRvZXMgbm90IHdvcmssCiAJCQkqIHNvIHdlIGRvIGl0IGluIHR3byBzdGVwcy4gQmUgYXdhcmUgdGhhdCB4ZQogCQkJKiBtYXkgYmUgLTEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF90bG9uZy5jIGIvYXJjaC9taXBzL21hdGgtZW11L3NwX3Rsb25nLmMKaW5kZXggNGJlMjFhYS4uOTJjZDljNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L3NwX3Rsb25nLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L3NwX3Rsb25nLmMKQEAgLTcxLDggKzcxLDcgQEAKIAkJCXJvdW5kID0gMDsKIAkJCXN0aWNreSA9IHJlc2lkdWUgIT0gMDsKIAkJCXhtID0gMDsKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXJlc2lkdWUgPSB4bSA8PCAoMzIgLSBTUF9NQklUUyArIHhlKTsKIAkJCXJvdW5kID0gKHJlc2lkdWUgPj4gMzEpICE9IDA7CiAJCQlzdGlja3kgPSAocmVzaWR1ZSA8PCAxKSAhPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHNzaW0vTWFrZWZpbGUgYi9hcmNoL21pcHMvbWlwc3NpbS9NYWtlZmlsZQppbmRleCA0MWI5NjU3Li4wMTQxMGEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwc3NpbS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbWlwc3NpbS9NYWtlZmlsZQpAQCAtMjEsNSArMjEsMyBAQAogCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKSArPSBzaW1fY29uc29sZS5vCiBvYmotJChDT05GSUdfTUlQU19NVF9TTVRDKSArPSBzaW1fc210Yy5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwc3NpbS9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9taXBzc2ltL1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjYwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbWlwc3NpbS9QbGF0Zm9ybQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgTUlQUyBTSU0KKyMKK3BsYXRmb3JtLSQoQ09ORklHX01JUFNfU0lNKQkrPSBtaXBzc2ltLworY2ZsYWdzLSQoQ09ORklHX01JUFNfU0lNKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWlwc3NpbQorbG9hZC0kKENPTkZJR19NSVBTX1NJTSkJCSs9IDB4ODAxMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tbS9NYWtlZmlsZQppbmRleCBmMGU0MzU1Li5kNjc5Yzc3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL21tL01ha2VmaWxlCkBAIC0zNCw1ICszNCwzIEBACiBvYmotJChDT05GSUdfUjUwMDBfQ1BVX1NDQUNIRSkgICs9IHNjLXI1ay5vCiBvYmotJChDT05GSUdfUk03MDAwX0NQVV9TQ0FDSEUpCSs9IHNjLXJtN2subwogb2JqLSQoQ09ORklHX01JUFNfQ1BVX1NDQUNIRSkJKz0gc2MtbWlwcy5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vZmF1bHQuYyBiL2FyY2gvbWlwcy9tbS9mYXVsdC5jCmluZGV4IGI3OGY3ZDkuLjc4M2FkMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9mYXVsdC5jCkBAIC0xNiw4ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgkJLyogRm9yIHVuYmxhbmtfc2NyZWVuKCkgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKICNpbmNsdWRlIDxhc20vYnJhbmNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC0yNSwxMyArMjUsMTQgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vaGlnaG1lbS5oPgkJLyogRm9yIFZNQUxMT0NfRU5EICovCisjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBwYWdlIGZhdWx0cy4gIEl0IGRldGVybWluZXMgdGhlIGFkZHJlc3MsCiAgKiBhbmQgdGhlIHByb2JsZW0sIGFuZCB0aGVuIHBhc3NlcyBpdCBvZmYgdG8gb25lIG9mIHRoZSBhcHByb3ByaWF0ZQogICogcm91dGluZXMuCiAgKi8KLWFzbWxpbmthZ2Ugdm9pZCBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHdyaXRlLAorYXNtbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHdyaXRlLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSA9IE5VTEw7CkBAIC00Nyw2ICs0OCwxNyBAQAogCSAgICAgICBmaWVsZCwgcmVncy0+Y3AwX2VwYyk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19LUFJPQkVTCisJLyoKKwkgKiBUaGlzIGlzIHRvIG5vdGlmeSB0aGUgZmF1bHQgaGFuZGxlciBvZiB0aGUga3Byb2Jlcy4gIFRoZQorCSAqIGV4Y2VwdGlvbiBjb2RlIGlzIHJlZHVuZGFudCBhcyBpdCBpcyBhbHNvIGNhcnJpZWQgaW4gUkVHUywKKwkgKiBidXQgd2UgcGFzcyBpdCBhbnlob3cuCisJICovCisJaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgLTEsCisJCSAgICAgICAocmVncy0+Y3AwX2NhdXNlID4+IDIpICYgMHgxZiwgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybjsKKyNlbmRpZgorCiAJaW5mby5zaV9jb2RlID0gU0VHVl9NQVBFUlI7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3NjLXJtN2suYyBiL2FyY2gvbWlwcy9tbS9zYy1ybTdrLmMKaW5kZXggZGU2OWJmYi4uMWVmNzVjZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3NjLXJtN2suYworKysgYi9hcmNoL21pcHMvbW0vc2Mtcm03ay5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlb3BzLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+IC8qIGZvciBydW5fdW5jYWNoZWQoKSAqLwogCiAvKiBQcmltYXJ5IGNhY2hlIHBhcmFtZXRlcnMuICovCkBAIC0yNSwxMSArMjYsMTUgQEAKIC8qIFNlY29uZGFyeSBjYWNoZSBwYXJhbWV0ZXJzLiAqLwogI2RlZmluZSBzY2FjaGVfc2l6ZQkoMjU2KjEwMjQpCS8qIEZpeGVkIHRvIDI1NktpQiBvbiBSTTcwMDAgKi8KIAorLyogVGVydGlhcnkgY2FjaGUgcGFyYW1ldGVycyAqLworI2RlZmluZSB0Y19sc2l6ZQkzMgorCiBleHRlcm4gdW5zaWduZWQgbG9uZyBpY2FjaGVfd2F5X3NpemUsIGRjYWNoZV93YXlfc2l6ZTsKK3Vuc2lnbmVkIGxvbmcgdGNhY2hlX3NpemU7CiAKICNpbmNsdWRlIDxhc20vcjRrY2FjaGUuaD4KIAotc3RhdGljIGludCBybTdrX3RjYWNoZV9lbmFibGVkOworc3RhdGljIGludCBybTdrX3RjYWNoZV9pbml0OwogCiAvKgogICogV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIHRoZSBwcmltYXJ5IGNhY2hlIGRjYWNoZSBiZWZvcmUgRE1BLgpAQCAtNDYsNyArNTEsNyBAQAogCiAJYmxhc3Rfc2NhY2hlX3JhbmdlKGFkZHIsIGFkZHIgKyBzaXplKTsKIAotCWlmICghcm03a190Y2FjaGVfZW5hYmxlZCkKKwlpZiAoIXJtN2tfdGNhY2hlX2luaXQpCiAJCXJldHVybjsKIAogCWEgPSBhZGRyICYgfih0Y19wYWdlc2l6ZSAtIDEpOwpAQCAtNzAsNyArNzUsNyBAQAogCiAJYmxhc3RfaW52X3NjYWNoZV9yYW5nZShhZGRyLCBhZGRyICsgc2l6ZSk7CiAKLQlpZiAoIXJtN2tfdGNhY2hlX2VuYWJsZWQpCisJaWYgKCFybTdrX3RjYWNoZV9pbml0KQogCQlyZXR1cm47CiAKIAlhID0gYWRkciAmIH4odGNfcGFnZXNpemUgLSAxKTsKQEAgLTgzLDYgKzg4LDQ1IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBibGFzdF9ybTdrX3RjYWNoZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBDS1NFRzBBRERSKDApOworCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyB0Y2FjaGVfc2l6ZTsKKworCXdyaXRlX2MwX3RhZ2xvKDApOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCWNhY2hlX29wKFBhZ2VfSW52YWxpZGF0ZV9ULCBzdGFydCk7CisJCXN0YXJ0ICs9IHRjX3BhZ2VzaXplOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgaW4gdW5jYWNoZWQgYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIF9fY3B1aW5pdCB2b2lkIF9fcm03a190Y19lbmFibGUodm9pZCkKK3sKKwlpbnQgaTsKKworCXNldF9jMF9jb25maWcoUk03S19DT05GX1RFKTsKKworCXdyaXRlX2MwX3RhZ2xvKDApOworCXdyaXRlX2MwX3RhZ2hpKDApOworCisJZm9yIChpID0gMDsgaSA8IHRjYWNoZV9zaXplOyBpICs9IHRjX2xzaXplKQorCQljYWNoZV9vcChJbmRleF9TdG9yZV9UYWdfVCwgQ0tTRUcwQUREUihpKSk7Cit9CisKK3N0YXRpYyBfX2NwdWluaXQgdm9pZCBybTdrX3RjX2VuYWJsZSh2b2lkKQoreworCWlmIChyZWFkX2MwX2NvbmZpZygpICYgUk03S19DT05GX1RFKQorCQlyZXR1cm47CisKKwlCVUdfT04odGNhY2hlX3NpemUgPT0gMCk7CisKKwlydW5fdW5jYWNoZWQoX19ybTdrX3RjX2VuYWJsZSk7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGluIHVuY2FjaGVkIGFkZHJlc3Mgc3BhY2UuCiAgKi8KQEAgLTk1LDE2ICsxMzksOCBAQAogCXdyaXRlX2MwX3RhZ2xvKDApOwogCXdyaXRlX2MwX3RhZ2hpKDApOwogCi0JZm9yIChpID0gMDsgaSA8IHNjYWNoZV9zaXplOyBpICs9IHNjX2xzaXplKSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJICAgICAgIi5zZXQgbm9yZW9yZGVyXG5cdCIKLQkJICAgICAgIi5zZXQgbWlwczNcblx0IgotCQkgICAgICAiY2FjaGUgJTEsICglMClcblx0IgotCQkgICAgICAiLnNldCBtaXBzMFxuXHQiCi0JCSAgICAgICIuc2V0IHJlb3JkZXIiCi0JCSAgICAgIDoKLQkJICAgICAgOiAiciIgKENLU0VHMEFERFIoaSkpLCAiaSIgKEluZGV4X1N0b3JlX1RhZ19TRCkpOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2NhY2hlX3NpemU7IGkgKz0gc2NfbHNpemUpCisJCWNhY2hlX29wKEluZGV4X1N0b3JlX1RhZ19TRCwgQ0tTRUcwQUREUihpKSk7CiB9CiAKIHN0YXRpYyBfX2NwdWluaXQgdm9pZCBybTdrX3NjX2VuYWJsZSh2b2lkKQpAQCAtMTEyLDEzICsxNDgsMjkgQEAKIAlpZiAocmVhZF9jMF9jb25maWcoKSAmIFJNN0tfQ09ORl9TRSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgc2Vjb25kYXJ5IGNhY2hlLi4uXG4iKTsKKwlwcl9pbmZvKCJFbmFibGluZyBzZWNvbmRhcnkgY2FjaGUuLi5cbiIpOwogCXJ1bl91bmNhY2hlZChfX3JtN2tfc2NfZW5hYmxlKTsKKworCWlmIChybTdrX3RjYWNoZV9pbml0KQorCQlybTdrX3RjX2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBybTdrX3RjX2Rpc2FibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJsYXN0X3JtN2tfdGNhY2hlKCk7CisJY2xlYXJfYzBfY29uZmlnKFJNN0tfQ09ORl9URSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBybTdrX3NjX2Rpc2FibGUodm9pZCkKIHsKIAljbGVhcl9jMF9jb25maWcoUk03S19DT05GX1NFKTsKKworCWlmIChybTdrX3RjYWNoZV9pbml0KQorCQlybTdrX3RjX2Rpc2FibGUoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBiY2FjaGVfb3BzIHJtN2tfc2Nfb3BzID0gewpAQCAtMTI4LDYgKzE4MCw1MiBAQAogCS5iY19pbnYgPSBybTdrX3NjX2ludgogfTsKIAorLyoKKyAqIFRoaXMgaXMgYSBwcm9iaW5nIGZ1bmN0aW9uIGxpa2UgdGhlIG9uZSBmb3VuZCBpbiBjLXI0ay5jLCB3ZSBsb29rIGZvciB0aGUKKyAqIHdyYXAgYXJvdW5kIHBvaW50IHdpdGggZGlmZmVyZW50IGFkZHJlc3Nlcy4KKyAqLworc3RhdGljIF9fY3B1aW5pdCB2b2lkIF9fcHJvYmVfdGNhY2hlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgYWRkciwgYmVnaW4sIGVuZCwgcG93MjsKKworCWJlZ2luID0gKHVuc2lnbmVkIGxvbmcpICZfc3RleHQ7CisJYmVnaW4gICY9IH4oKDggKiAxMDI0ICogMTAyNCkgLSAxKTsKKwllbmQgPSBiZWdpbiArICg4ICogMTAyNCAqIDEwMjQpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc2V0X2MwX2NvbmZpZyhSTTdLX0NPTkZfVEUpOworCisJLyogRmlsbCBzaXplLW11bHRpcGxlIGxpbmVzIHdpdGggYSB2YWxpZCB0YWcgKi8KKwlwb3cyID0gKDI1NiAqIDEwMjQpOworCWZvciAoYWRkciA9IGJlZ2luOyBhZGRyIDw9IGVuZDsgYWRkciA9IChiZWdpbiArIHBvdzIpKSB7CisJCXVuc2lnbmVkIGxvbmcgKnAgPSAodW5zaWduZWQgbG9uZyAqKSBhZGRyOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibm9wIiA6IDogInIiICgqcCkpOworCQlwb3cyIDw8PSAxOworCX0KKworCS8qIExvYWQgZmlyc3QgbGluZSB3aXRoIGEgMCB0YWcsIHRvIGNoZWNrIGFmdGVyICovCisJd3JpdGVfYzBfdGFnbG8oMCk7CisJd3JpdGVfYzBfdGFnaGkoMCk7CisJY2FjaGVfb3AoSW5kZXhfU3RvcmVfVGFnX1QsIGJlZ2luKTsKKworCS8qIExvb2sgZm9yIHRoZSB3cmFwLWFyb3VuZCAqLworCXBvdzIgPSAoNTEyICogMTAyNCk7CisJZm9yIChhZGRyID0gYmVnaW4gKyAoNTEyICogMTAyNCk7IGFkZHIgPD0gZW5kOyBhZGRyID0gYmVnaW4gKyBwb3cyKSB7CisJCWNhY2hlX29wKEluZGV4X0xvYWRfVGFnX1QsIGFkZHIpOworCQlpZiAoIXJlYWRfYzBfdGFnbG8oKSkKKwkJCWJyZWFrOworCQlwb3cyIDw8PSAxOworCX0KKworCWFkZHIgLT0gYmVnaW47CisJdGNhY2hlX3NpemUgPSBhZGRyOworCisJY2xlYXJfYzBfY29uZmlnKFJNN0tfQ09ORl9URSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKIHZvaWQgX19jcHVpbml0IHJtN2tfc2NfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKQEAgLTE0NywyNyArMjQ1LDI2IEBACiAJaWYgKCEoY29uZmlnICYgUk03S19DT05GX1NFKSkKIAkJcm03a19zY19lbmFibGUoKTsKIAorCWJjb3BzID0gJnJtN2tfc2Nfb3BzOworCiAJLyoKIAkgKiBXaGlsZSB3ZSdyZSBhdCBpdCBsZXQncyBkZWFsIHdpdGggdGhlIHRlcnRpYXJ5IGNhY2hlLgogCSAqLwotCWlmICghKGNvbmZpZyAmIFJNN0tfQ09ORl9UQykpIHsKIAotCQkvKgotCQkgKiBXZSBjYW4ndCBlbmFibGUgdGhlIEwzIGNhY2hlIHlldC4gVGhlcmUgbWF5IGJlIGJvYXJkLXNwZWNpZmljCi0JCSAqIG1hZ2ljIG5lY2Vzc2FyeSB0byB0dXJuIGl0IG9uLCBhbmQgYmxpbmRseSBhc2tpbmcgdGhlIENQVSB0bwotCQkgKiBzdGFydCB1c2luZyBpdCB3b3VsZCBtYXkgZ2l2ZSBjYWNoZSBlcnJvcnMuCi0JCSAqCi0JCSAqIEFsc28sIGJvYXJkLXNwZWNpZmljIGtub3dsZWRnZSBtYXkgYWxsb3cgdXMgdG8gdXNlIHRoZQotCQkgKiBDQUNIRSBGbGFzaF9JbnZhbGlkYXRlX1QgaW5zdHJ1Y3Rpb24gaWYgdGhlIHRhZyBSQU0gc3VwcG9ydHMKLQkJICogaXQsIGFuZCBtYXkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgTDMgY2FjaGUgc28gd2UgZG9uJ3QgaGF2ZQotCQkgKiB0byBwcm9iZSBpdC4KLQkJICovCi0JCXByaW50ayhLRVJOX0lORk8gIlRlcnRpYXJ5IGNhY2hlIHByZXNlbnQsICVzIGVuYWJsZWRcbiIsCi0JCSAgICAgICAoY29uZmlnICYgUk03S19DT05GX1RFKSA/ICJhbHJlYWR5IiA6ICJub3QgKHlldCkiKTsKKwlybTdrX3RjYWNoZV9pbml0ID0gMDsKKwl0Y2FjaGVfc2l6ZSA9IDA7CiAKLQkJaWYgKChjb25maWcgJiBSTTdLX0NPTkZfVEUpKQotCQkJcm03a190Y2FjaGVfZW5hYmxlZCA9IDE7Ci0JfQorCWlmIChjb25maWcgJiBSTTdLX0NPTkZfVEMpCisJCXJldHVybjsKIAotCWJjb3BzID0gJnJtN2tfc2Nfb3BzOworCS8qCisJICogTm8gZWZmaWNpZW50IHdheSB0byBhc2sgdGhlIGhhcmR3YXJlIGZvciB0aGUgc2l6ZSBvZiB0aGUgdGNhY2hlLAorCSAqIHNvIG11c3QgcHJvYmUgZm9yIGl0LgorCSAqLworCXJ1bl91bmNhY2hlZChfX3Byb2JlX3RjYWNoZSk7CisJcm03a190Y19lbmFibGUoKTsKKwlybTdrX3RjYWNoZV9pbml0ID0gMTsKKwljLT50Y2FjaGUubGluZXN6ID0gdGNfbHNpemU7CisJYy0+dGNhY2hlLndheXMgPSAxOworCXByX2luZm8oIlRlcnRpYXJ5IGNhY2hlIHNpemUgJWxkSy5cbiIsICh0Y2FjaGVfc2l6ZSA+PiAxMCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYmV4LmMgYi9hcmNoL21pcHMvbW0vdGxiZXguYwppbmRleCA4NmYwMDRkLi40NTEwZTYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiZXguYworKysgYi9hcmNoL21pcHMvbW0vdGxiZXguYwpAQCAtNDA5LDYgKzQwOSwxMSBAQAogCQl0bGJ3KHApOwogCQlicmVhazsKIAorCWNhc2UgQ1BVX0paUklTQzoKKwkJdGxidyhwKTsKKwkJdWFzbV9pX25vcChwKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlwYW5pYygiTm8gVExCIHJlZmlsbCBoYW5kbGVyIHlldCAoQ1BVIHR5cGU6ICVkKSIsCiAJCSAgICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdWFzbS5jIGIvYXJjaC9taXBzL21tL3Vhc20uYwppbmRleCA2MTFkNTY0Li5kMjY0N2E0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdWFzbS5jCisrKyBiL2FyY2gvbWlwcy9tbS91YXNtLmMKQEAgLTYyLDEyICs2MiwxMyBAQAogCWluc25fYmVxbCwgaW5zbl9iZ2V6LCBpbnNuX2JnZXpsLCBpbnNuX2JsdHosIGluc25fYmx0emwsCiAJaW5zbl9ibmUsIGluc25fY2FjaGUsIGluc25fZGFkZHUsIGluc25fZGFkZGl1LCBpbnNuX2RtZmMwLAogCWluc25fZG10YzAsIGluc25fZHNsbCwgaW5zbl9kc2xsMzIsIGluc25fZHNyYSwgaW5zbl9kc3JsLAotCWluc25fZHNybDMyLCBpbnNuX2Ryb3RyLCBpbnNuX2RzdWJ1LCBpbnNuX2VyZXQsIGluc25faiwgaW5zbl9qYWwsCi0JaW5zbl9qciwgaW5zbl9sZCwgaW5zbl9sbCwgaW5zbl9sbGQsIGluc25fbHVpLCBpbnNuX2x3LCBpbnNuX21mYzAsCi0JaW5zbl9tdGMwLCBpbnNuX29yLCBpbnNuX29yaSwgaW5zbl9wcmVmLCBpbnNuX3JmZSwgaW5zbl9zYywgaW5zbl9zY2QsCi0JaW5zbl9zZCwgaW5zbl9zbGwsIGluc25fc3JhLCBpbnNuX3NybCwgaW5zbl9yb3RyLCBpbnNuX3N1YnUsIGluc25fc3csCi0JaW5zbl90bGJwLCBpbnNuX3RsYnIsIGluc25fdGxid2ksIGluc25fdGxid3IsIGluc25feG9yLCBpbnNuX3hvcmksCi0JaW5zbl9kaW5zLCBpbnNuX3N5c2NhbGwKKwlpbnNuX2RzcmwzMiwgaW5zbl9kcm90ciwgaW5zbl9kcm90cjMyLCBpbnNuX2RzdWJ1LCBpbnNuX2VyZXQsCisJaW5zbl9qLCBpbnNuX2phbCwgaW5zbl9qciwgaW5zbl9sZCwgaW5zbl9sbCwgaW5zbl9sbGQsCisJaW5zbl9sdWksIGluc25fbHcsIGluc25fbWZjMCwgaW5zbl9tdGMwLCBpbnNuX29yLCBpbnNuX29yaSwKKwlpbnNuX3ByZWYsIGluc25fcmZlLCBpbnNuX3NjLCBpbnNuX3NjZCwgaW5zbl9zZCwgaW5zbl9zbGwsCisJaW5zbl9zcmEsIGluc25fc3JsLCBpbnNuX3JvdHIsIGluc25fc3VidSwgaW5zbl9zdywgaW5zbl90bGJwLAorCWluc25fdGxiciwgaW5zbl90bGJ3aSwgaW5zbl90bGJ3ciwgaW5zbl94b3IsIGluc25feG9yaSwKKwlpbnNuX2RpbnMsIGluc25fc3lzY2FsbCwgaW5zbl9iYml0MCwgaW5zbl9iYml0MQogfTsKIAogc3RydWN0IGluc24gewpAQCAtODUsNyArODYsNyBAQAogCSB8IChlKSA8PCBSRV9TSAkJCQkJCVwKIAkgfCAoZikgPDwgRlVOQ19TSCkKIAotc3RhdGljIHN0cnVjdCBpbnNuIGluc25fdGFibGVbXSBfX2NwdWluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBpbnNuIGluc25fdGFibGVbXSBfX3Vhc21pbml0ZGF0YSA9IHsKIAl7IGluc25fYWRkaXUsIE0oYWRkaXVfb3AsIDAsIDAsIDAsIDAsIDApLCBSUyB8IFJUIHwgU0lNTSB9LAogCXsgaW5zbl9hZGR1LCBNKHNwZWNfb3AsIDAsIDAsIDAsIDAsIGFkZHVfb3ApLCBSUyB8IFJUIHwgUkQgfSwKIAl7IGluc25fYW5kLCBNKHNwZWNfb3AsIDAsIDAsIDAsIDAsIGFuZF9vcCksIFJTIHwgUlQgfCBSRCB9LApAQCAtMTA4LDYgKzEwOSw3IEBACiAJeyBpbnNuX2RzcmwsIE0oc3BlY19vcCwgMCwgMCwgMCwgMCwgZHNybF9vcCksIFJUIHwgUkQgfCBSRSB9LAogCXsgaW5zbl9kc3JsMzIsIE0oc3BlY19vcCwgMCwgMCwgMCwgMCwgZHNybDMyX29wKSwgUlQgfCBSRCB8IFJFIH0sCiAJeyBpbnNuX2Ryb3RyLCBNKHNwZWNfb3AsIDEsIDAsIDAsIDAsIGRzcmxfb3ApLCBSVCB8IFJEIHwgUkUgfSwKKwl7IGluc25fZHJvdHIzMiwgTShzcGVjX29wLCAxLCAwLCAwLCAwLCBkc3JsMzJfb3ApLCBSVCB8IFJEIHwgUkUgfSwKIAl7IGluc25fZHN1YnUsIE0oc3BlY19vcCwgMCwgMCwgMCwgMCwgZHN1YnVfb3ApLCBSUyB8IFJUIHwgUkQgfSwKIAl7IGluc25fZXJldCwgIE0oY29wMF9vcCwgY29wX29wLCAwLCAwLCAwLCBlcmV0X29wKSwgIDAgfSwKIAl7IGluc25faiwgIE0oal9vcCwgMCwgMCwgMCwgMCwgMCksICBKSU1NIH0sCkBAIC0xNDEsMTIgKzE0MywxNCBAQAogCXsgaW5zbl94b3JpLCAgTSh4b3JpX29wLCAwLCAwLCAwLCAwLCAwKSwgIFJTIHwgUlQgfCBVSU1NIH0sCiAJeyBpbnNuX2RpbnMsIE0oc3BlYzNfb3AsIDAsIDAsIDAsIDAsIGRpbnNfb3ApLCBSUyB8IFJUIHwgUkQgfCBSRSB9LAogCXsgaW5zbl9zeXNjYWxsLCBNKHNwZWNfb3AsIDAsIDAsIDAsIDAsIHN5c2NhbGxfb3ApLCBTQ0lNTX0sCisJeyBpbnNuX2JiaXQwLCBNKGx3YzJfb3AsIDAsIDAsIDAsIDAsIDApLCBSUyB8IFJUIHwgQklNTSB9LAorCXsgaW5zbl9iYml0MSwgTShzd2MyX29wLCAwLCAwLCAwLCAwLCAwKSwgUlMgfCBSVCB8IEJJTU0gfSwKIAl7IGluc25faW52YWxpZCwgMCwgMCB9CiB9OwogCiAjdW5kZWYgTQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfcnModTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgX191YXNtaW5pdCB1MzIgYnVpbGRfcnModTMyIGFyZykKIHsKIAlpZiAoYXJnICYgflJTX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0xNTQsNyArMTU4LDcgQEAKIAlyZXR1cm4gKGFyZyAmIFJTX01BU0spIDw8IFJTX1NIOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfcnQodTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgX191YXNtaW5pdCB1MzIgYnVpbGRfcnQodTMyIGFyZykKIHsKIAlpZiAoYXJnICYgflJUX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0xNjIsNyArMTY2LDcgQEAKIAlyZXR1cm4gKGFyZyAmIFJUX01BU0spIDw8IFJUX1NIOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfcmQodTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgX191YXNtaW5pdCB1MzIgYnVpbGRfcmQodTMyIGFyZykKIHsKIAlpZiAoYXJnICYgflJEX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0xNzAsNyArMTc0LDcgQEAKIAlyZXR1cm4gKGFyZyAmIFJEX01BU0spIDw8IFJEX1NIOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfcmUodTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgX191YXNtaW5pdCB1MzIgYnVpbGRfcmUodTMyIGFyZykKIHsKIAlpZiAoYXJnICYgflJFX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0xNzgsNyArMTgyLDcgQEAKIAlyZXR1cm4gKGFyZyAmIFJFX01BU0spIDw8IFJFX1NIOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfc2ltbShzMzIgYXJnKQorc3RhdGljIGlubGluZSBfX3Vhc21pbml0IHUzMiBidWlsZF9zaW1tKHMzMiBhcmcpCiB7CiAJaWYgKGFyZyA+IDB4N2ZmZiB8fCBhcmcgPCAtMHg4MDAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJNaWNyby1hc3NlbWJsZXIgZmllbGQgb3ZlcmZsb3dcbiIpOwpAQCAtMTg2LDcgKzE5MCw3IEBACiAJcmV0dXJuIGFyZyAmIDB4ZmZmZjsKIH0KIAotc3RhdGljIGlubGluZSBfX2NwdWluaXQgdTMyIGJ1aWxkX3VpbW0odTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgX191YXNtaW5pdCB1MzIgYnVpbGRfdWltbSh1MzIgYXJnKQogewogCWlmIChhcmcgJiB+SU1NX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0xOTQsNyArMTk4LDcgQEAKIAlyZXR1cm4gYXJnICYgSU1NX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19jcHVpbml0IHUzMiBidWlsZF9iaW1tKHMzMiBhcmcpCitzdGF0aWMgaW5saW5lIF9fdWFzbWluaXQgdTMyIGJ1aWxkX2JpbW0oczMyIGFyZykKIHsKIAlpZiAoYXJnID4gMHgxZmZmZiB8fCBhcmcgPCAtMHgyMDAwMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTWljcm8tYXNzZW1ibGVyIGZpZWxkIG92ZXJmbG93XG4iKTsKQEAgLTIwNSw3ICsyMDksNyBAQAogCXJldHVybiAoKGFyZyA8IDApID8gKDEgPDwgMTUpIDogMCkgfCAoKGFyZyA+PiAyKSAmIDB4N2ZmZik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19jcHVpbml0IHUzMiBidWlsZF9qaW1tKHUzMiBhcmcpCitzdGF0aWMgaW5saW5lIF9fdWFzbWluaXQgdTMyIGJ1aWxkX2ppbW0odTMyIGFyZykKIHsKIAlpZiAoYXJnICYgfigoSklNTV9NQVNLKSA8PCAyKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTWljcm8tYXNzZW1ibGVyIGZpZWxkIG92ZXJmbG93XG4iKTsKQEAgLTIxMyw3ICsyMTcsNyBAQAogCXJldHVybiAoYXJnID4+IDIpICYgSklNTV9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfc2NpbW0odTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgX191YXNtaW5pdCB1MzIgYnVpbGRfc2NpbW0odTMyIGFyZykKIHsKIAlpZiAoYXJnICYgflNDSU1NX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0yMjEsNyArMjI1LDcgQEAKIAlyZXR1cm4gKGFyZyAmIFNDSU1NX01BU0spIDw8IFNDSU1NX1NIOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfZnVuYyh1MzIgYXJnKQorc3RhdGljIGlubGluZSBfX3Vhc21pbml0IHUzMiBidWlsZF9mdW5jKHUzMiBhcmcpCiB7CiAJaWYgKGFyZyAmIH5GVU5DX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0yMjksNyArMjMzLDcgQEAKIAlyZXR1cm4gYXJnICYgRlVOQ19NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIF9fY3B1aW5pdCB1MzIgYnVpbGRfc2V0KHUzMiBhcmcpCitzdGF0aWMgaW5saW5lIF9fdWFzbWluaXQgdTMyIGJ1aWxkX3NldCh1MzIgYXJnKQogewogCWlmIChhcmcgJiB+U0VUX01BU0spCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1pY3JvLWFzc2VtYmxlciBmaWVsZCBvdmVyZmxvd1xuIik7CkBAIC0yNDEsNyArMjQ1LDcgQEAKICAqIFRoZSBvcmRlciBvZiBvcGNvZGUgYXJndW1lbnRzIGlzIGltcGxpY2l0bHkgbGVmdCB0byByaWdodCwKICAqIHN0YXJ0aW5nIHdpdGggUlMgYW5kIGVuZGluZyB3aXRoIEZVTkMgb3IgSU1NLgogICovCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgYnVpbGRfaW5zbih1MzIgKipidWYsIGVudW0gb3Bjb2RlIG9wYywgLi4uKQorc3RhdGljIHZvaWQgX191YXNtaW5pdCBidWlsZF9pbnNuKHUzMiAqKmJ1ZiwgZW51bSBvcGNvZGUgb3BjLCAuLi4pCiB7CiAJc3RydWN0IGluc24gKmlwID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTI5MSw2NyArMjk1LDc4IEBACiBJcF91MXUydTMob3ApCQkJCQkJXAogewkJCQkJCQlcCiAJYnVpbGRfaW5zbihidWYsIGluc24jI29wLCBhLCBiLCBjKTsJCVwKLX0KK30JCQkJCQkJXAorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21faSMjb3ApOwogCiAjZGVmaW5lIElfdTJ1MXUzKG9wKQkJCQkJXAogSXBfdTJ1MXUzKG9wKQkJCQkJCVwKIHsJCQkJCQkJXAogCWJ1aWxkX2luc24oYnVmLCBpbnNuIyNvcCwgYiwgYSwgYyk7CQlcCi19Cit9CQkJCQkJCVwKK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2kjI29wKTsKIAogI2RlZmluZSBJX3UzdTF1MihvcCkJCQkJCVwKIElwX3UzdTF1MihvcCkJCQkJCQlcCiB7CQkJCQkJCVwKIAlidWlsZF9pbnNuKGJ1ZiwgaW5zbiMjb3AsIGIsIGMsIGEpOwkJXAotfQorfQkJCQkJCQlcCitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pIyNvcCk7CiAKICNkZWZpbmUgSV91MXUyczMob3ApCQkJCQlcCiBJcF91MXUyczMob3ApCQkJCQkJXAogewkJCQkJCQlcCiAJYnVpbGRfaW5zbihidWYsIGluc24jI29wLCBhLCBiLCBjKTsJCVwKLX0KK30JCQkJCQkJXAorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21faSMjb3ApOwogCiAjZGVmaW5lIElfdTJzM3UxKG9wKQkJCQkJXAogSXBfdTJzM3UxKG9wKQkJCQkJCVwKIHsJCQkJCQkJXAogCWJ1aWxkX2luc24oYnVmLCBpbnNuIyNvcCwgYywgYSwgYik7CQlcCi19Cit9CQkJCQkJCVwKK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2kjI29wKTsKIAogI2RlZmluZSBJX3UydTFzMyhvcCkJCQkJCVwKIElwX3UydTFzMyhvcCkJCQkJCQlcCiB7CQkJCQkJCVwKIAlidWlsZF9pbnNuKGJ1ZiwgaW5zbiMjb3AsIGIsIGEsIGMpOwkJXAotfQorfQkJCQkJCQlcCitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pIyNvcCk7CiAKICNkZWZpbmUgSV91MnUxbXNidTMob3ApCQkJCQlcCiBJcF91MnUxbXNidTMob3ApCQkJCQlcCiB7CQkJCQkJCVwKIAlidWlsZF9pbnNuKGJ1ZiwgaW5zbiMjb3AsIGIsIGEsIGMrZC0xLCBjKTsJXAotfQorfQkJCQkJCQlcCitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pIyNvcCk7CiAKICNkZWZpbmUgSV91MXUyKG9wKQkJCQkJXAogSXBfdTF1MihvcCkJCQkJCQlcCiB7CQkJCQkJCVwKIAlidWlsZF9pbnNuKGJ1ZiwgaW5zbiMjb3AsIGEsIGIpOwkJXAotfQorfQkJCQkJCQlcCitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pIyNvcCk7CiAKICNkZWZpbmUgSV91MXMyKG9wKQkJCQkJXAogSXBfdTFzMihvcCkJCQkJCQlcCiB7CQkJCQkJCVwKIAlidWlsZF9pbnNuKGJ1ZiwgaW5zbiMjb3AsIGEsIGIpOwkJXAotfQorfQkJCQkJCQlcCitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pIyNvcCk7CiAKICNkZWZpbmUgSV91MShvcCkJCQkJCVwKIElwX3UxKG9wKQkJCQkJCVwKIHsJCQkJCQkJXAogCWJ1aWxkX2luc24oYnVmLCBpbnNuIyNvcCwgYSk7CQkJXAotfQorfQkJCQkJCQlcCitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pIyNvcCk7CiAKICNkZWZpbmUgSV8wKG9wKQkJCQkJCVwKIElwXzAob3ApCQkJCQkJXAogewkJCQkJCQlcCiAJYnVpbGRfaW5zbihidWYsIGluc24jI29wKTsJCQlcCi19Cit9CQkJCQkJCVwKK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2kjI29wKTsKIAogSV91MnUxczMoX2FkZGl1KQogSV91M3UxdTIoX2FkZHUpCkBAIC0zNzUsNiArMzkwLDcgQEAKIElfdTJ1MXUzKF9kc3JsKQogSV91MnUxdTMoX2RzcmwzMikKIElfdTJ1MXUzKF9kcm90cikKK0lfdTJ1MXUzKF9kcm90cjMyKQogSV91M3UxdTIoX2RzdWJ1KQogSV8wKF9lcmV0KQogSV91MShfaikKQEAgLTQwOCwxNiArNDI0LDE5IEBACiBJX3UydTF1MyhfeG9yaSkKIElfdTJ1MW1zYnUzKF9kaW5zKTsKIElfdTEoX3N5c2NhbGwpOworSV91MXUyczMoX2JiaXQwKTsKK0lfdTF1MnMzKF9iYml0MSk7CiAKIC8qIEhhbmRsZSBsYWJlbHMuICovCi12b2lkIF9fY3B1aW5pdCB1YXNtX2J1aWxkX2xhYmVsKHN0cnVjdCB1YXNtX2xhYmVsICoqbGFiLCB1MzIgKmFkZHIsIGludCBsaWQpCit2b2lkIF9fdWFzbWluaXQgdWFzbV9idWlsZF9sYWJlbChzdHJ1Y3QgdWFzbV9sYWJlbCAqKmxhYiwgdTMyICphZGRyLCBpbnQgbGlkKQogewogCSgqbGFiKS0+YWRkciA9IGFkZHI7CiAJKCpsYWIpLT5sYWIgPSBsaWQ7CiAJKCpsYWIpKys7CiB9CitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9idWlsZF9sYWJlbCk7CiAKLWludCBfX2NwdWluaXQgdWFzbV9pbl9jb21wYXRfc3BhY2VfcChsb25nIGFkZHIpCitpbnQgX191YXNtaW5pdCB1YXNtX2luX2NvbXBhdF9zcGFjZV9wKGxvbmcgYWRkcikKIHsKIAkvKiBJcyB0aGlzIGFkZHJlc3MgaW4gMzJiaXQgY29tcGF0IHNwYWNlPyAqLwogI2lmZGVmIENPTkZJR182NEJJVApAQCAtNDI2LDggKzQ0NSw5IEBACiAJcmV0dXJuIDE7CiAjZW5kaWYKIH0KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2luX2NvbXBhdF9zcGFjZV9wKTsKIAotc3RhdGljIGludCBfX2NwdWluaXQgdWFzbV9yZWxfaGlnaGVzdChsb25nIHZhbCkKK3N0YXRpYyBpbnQgX191YXNtaW5pdCB1YXNtX3JlbF9oaWdoZXN0KGxvbmcgdmFsKQogewogI2lmZGVmIENPTkZJR182NEJJVAogCXJldHVybiAoKCgodmFsICsgMHg4MDAwODAwMDgwMDBMKSA+PiA0OCkgJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKQEAgLTQzNiw3ICs0NTYsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgX19jcHVpbml0IHVhc21fcmVsX2hpZ2hlcihsb25nIHZhbCkKK3N0YXRpYyBpbnQgX191YXNtaW5pdCB1YXNtX3JlbF9oaWdoZXIobG9uZyB2YWwpCiB7CiAjaWZkZWYgQ09ORklHXzY0QklUCiAJcmV0dXJuICgoKCh2YWwgKyAweDgwMDA4MDAwTCkgPj4gMzIpICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7CkBAIC00NDUsMTcgKzQ2NSwxOSBAQAogI2VuZGlmCiB9CiAKLWludCBfX2NwdWluaXQgdWFzbV9yZWxfaGkobG9uZyB2YWwpCitpbnQgX191YXNtaW5pdCB1YXNtX3JlbF9oaShsb25nIHZhbCkKIHsKIAlyZXR1cm4gKCgoKHZhbCArIDB4ODAwMEwpID4+IDE2KSAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21fcmVsX2hpKTsKIAotaW50IF9fY3B1aW5pdCB1YXNtX3JlbF9sbyhsb25nIHZhbCkKK2ludCBfX3Vhc21pbml0IHVhc21fcmVsX2xvKGxvbmcgdmFsKQogewogCXJldHVybiAoKHZhbCAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21fcmVsX2xvKTsKIAotdm9pZCBfX2NwdWluaXQgVUFTTV9pX0xBX21vc3RseSh1MzIgKipidWYsIHVuc2lnbmVkIGludCBycywgbG9uZyBhZGRyKQordm9pZCBfX3Vhc21pbml0IFVBU01faV9MQV9tb3N0bHkodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgcnMsIGxvbmcgYWRkcikKIHsKIAlpZiAoIXVhc21faW5fY29tcGF0X3NwYWNlX3AoYWRkcikpIHsKIAkJdWFzbV9pX2x1aShidWYsIHJzLCB1YXNtX3JlbF9oaWdoZXN0KGFkZHIpKTsKQEAgLTQ3MCw4ICs0OTIsOSBAQAogCX0gZWxzZQogCQl1YXNtX2lfbHVpKGJ1ZiwgcnMsIHVhc21fcmVsX2hpKGFkZHIpKTsKIH0KK1VBU01fRVhQT1JUX1NZTUJPTChVQVNNX2lfTEFfbW9zdGx5KTsKIAotdm9pZCBfX2NwdWluaXQgVUFTTV9pX0xBKHUzMiAqKmJ1ZiwgdW5zaWduZWQgaW50IHJzLCBsb25nIGFkZHIpCit2b2lkIF9fdWFzbWluaXQgVUFTTV9pX0xBKHUzMiAqKmJ1ZiwgdW5zaWduZWQgaW50IHJzLCBsb25nIGFkZHIpCiB7CiAJVUFTTV9pX0xBX21vc3RseShidWYsIHJzLCBhZGRyKTsKIAlpZiAodWFzbV9yZWxfbG8oYWRkcikpIHsKQEAgLTQ4MSw5ICs1MDQsMTAgQEAKIAkJCXVhc21faV9hZGRpdShidWYsIHJzLCBycywgdWFzbV9yZWxfbG8oYWRkcikpOwogCX0KIH0KK1VBU01fRVhQT1JUX1NZTUJPTChVQVNNX2lfTEEpOwogCiAvKiBIYW5kbGUgcmVsb2NhdGlvbnMuICovCi12b2lkIF9fY3B1aW5pdAordm9pZCBfX3Vhc21pbml0CiB1YXNtX3JfbWlwc19wYzE2KHN0cnVjdCB1YXNtX3JlbG9jICoqcmVsLCB1MzIgKmFkZHIsIGludCBsaWQpCiB7CiAJKCpyZWwpLT5hZGRyID0gYWRkcjsKQEAgLTQ5MSw4ICs1MTUsOSBAQAogCSgqcmVsKS0+bGFiID0gbGlkOwogCSgqcmVsKSsrOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21fcl9taXBzX3BjMTYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVpbml0CitzdGF0aWMgaW5saW5lIHZvaWQgX191YXNtaW5pdAogX19yZXNvbHZlX3JlbG9jcyhzdHJ1Y3QgdWFzbV9yZWxvYyAqcmVsLCBzdHJ1Y3QgdWFzbV9sYWJlbCAqbGFiKQogewogCWxvbmcgbGFkZHIgPSAobG9uZylsYWItPmFkZHI7CkBAIC01MDksNyArNTM0LDcgQEAKIAl9CiB9CiAKLXZvaWQgX19jcHVpbml0Cit2b2lkIF9fdWFzbWluaXQKIHVhc21fcmVzb2x2ZV9yZWxvY3Moc3RydWN0IHVhc21fcmVsb2MgKnJlbCwgc3RydWN0IHVhc21fbGFiZWwgKmxhYikKIHsKIAlzdHJ1Y3QgdWFzbV9sYWJlbCAqbDsKQEAgLTUxOSwyNCArNTQ0LDI3IEBACiAJCQlpZiAocmVsLT5sYWIgPT0gbC0+bGFiKQogCQkJCV9fcmVzb2x2ZV9yZWxvY3MocmVsLCBsKTsKIH0KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX3Jlc29sdmVfcmVsb2NzKTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9tb3ZlX3JlbG9jcyhzdHJ1Y3QgdWFzbV9yZWxvYyAqcmVsLCB1MzIgKmZpcnN0LCB1MzIgKmVuZCwgbG9uZyBvZmYpCiB7CiAJZm9yICg7IHJlbC0+bGFiICE9IFVBU01fTEFCRUxfSU5WQUxJRDsgcmVsKyspCiAJCWlmIChyZWwtPmFkZHIgPj0gZmlyc3QgJiYgcmVsLT5hZGRyIDwgZW5kKQogCQkJcmVsLT5hZGRyICs9IG9mZjsKIH0KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX21vdmVfcmVsb2NzKTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9tb3ZlX2xhYmVscyhzdHJ1Y3QgdWFzbV9sYWJlbCAqbGFiLCB1MzIgKmZpcnN0LCB1MzIgKmVuZCwgbG9uZyBvZmYpCiB7CiAJZm9yICg7IGxhYi0+bGFiICE9IFVBU01fTEFCRUxfSU5WQUxJRDsgbGFiKyspCiAJCWlmIChsYWItPmFkZHIgPj0gZmlyc3QgJiYgbGFiLT5hZGRyIDwgZW5kKQogCQkJbGFiLT5hZGRyICs9IG9mZjsKIH0KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX21vdmVfbGFiZWxzKTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9jb3B5X2hhbmRsZXIoc3RydWN0IHVhc21fcmVsb2MgKnJlbCwgc3RydWN0IHVhc21fbGFiZWwgKmxhYiwgdTMyICpmaXJzdCwKIAkJICB1MzIgKmVuZCwgdTMyICp0YXJnZXQpCiB7CkBAIC01NDcsOCArNTc1LDkgQEAKIAl1YXNtX21vdmVfcmVsb2NzKHJlbCwgZmlyc3QsIGVuZCwgb2ZmKTsKIAl1YXNtX21vdmVfbGFiZWxzKGxhYiwgZmlyc3QsIGVuZCwgb2ZmKTsKIH0KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2NvcHlfaGFuZGxlcik7CiAKLWludCBfX2NwdWluaXQgdWFzbV9pbnNuX2hhc19iZGVsYXkoc3RydWN0IHVhc21fcmVsb2MgKnJlbCwgdTMyICphZGRyKQoraW50IF9fdWFzbWluaXQgdWFzbV9pbnNuX2hhc19iZGVsYXkoc3RydWN0IHVhc21fcmVsb2MgKnJlbCwgdTMyICphZGRyKQogewogCWZvciAoOyByZWwtPmxhYiAhPSBVQVNNX0xBQkVMX0lOVkFMSUQ7IHJlbCsrKSB7CiAJCWlmIChyZWwtPmFkZHIgPT0gYWRkcgpAQCAtNTU5LDYxICs1ODgsODggQEAKIAogCXJldHVybiAwOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21faW5zbl9oYXNfYmRlbGF5KTsKIAogLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBsYWJlbGVkIGJyYW5jaGVzLiAqLwotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9pbF9ibHR6KHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgaW50IGxpZCkKIHsKIAl1YXNtX3JfbWlwc19wYzE2KHIsICpwLCBsaWQpOwogCXVhc21faV9ibHR6KHAsIHJlZywgMCk7CiB9CitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pbF9ibHR6KTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9pbF9iKHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgaW50IGxpZCkKIHsKIAl1YXNtX3JfbWlwc19wYzE2KHIsICpwLCBsaWQpOwogCXVhc21faV9iKHAsIDApOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21faWxfYik7CiAKLXZvaWQgX19jcHVpbml0Cit2b2lkIF9fdWFzbWluaXQKIHVhc21faWxfYmVxeih1MzIgKipwLCBzdHJ1Y3QgdWFzbV9yZWxvYyAqKnIsIHVuc2lnbmVkIGludCByZWcsIGludCBsaWQpCiB7CiAJdWFzbV9yX21pcHNfcGMxNihyLCAqcCwgbGlkKTsKIAl1YXNtX2lfYmVxeihwLCByZWcsIDApOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21faWxfYmVxeik7CiAKLXZvaWQgX19jcHVpbml0Cit2b2lkIF9fdWFzbWluaXQKIHVhc21faWxfYmVxemwodTMyICoqcCwgc3RydWN0IHVhc21fcmVsb2MgKipyLCB1bnNpZ25lZCBpbnQgcmVnLCBpbnQgbGlkKQogewogCXVhc21fcl9taXBzX3BjMTYociwgKnAsIGxpZCk7CiAJdWFzbV9pX2JlcXpsKHAsIHJlZywgMCk7CiB9CitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pbF9iZXF6bCk7CiAKLXZvaWQgX19jcHVpbml0Cit2b2lkIF9fdWFzbWluaXQKIHVhc21faWxfYm5lKHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZzEsCiAJdW5zaWduZWQgaW50IHJlZzIsIGludCBsaWQpCiB7CiAJdWFzbV9yX21pcHNfcGMxNihyLCAqcCwgbGlkKTsKIAl1YXNtX2lfYm5lKHAsIHJlZzEsIHJlZzIsIDApOwogfQorVUFTTV9FWFBPUlRfU1lNQk9MKHVhc21faWxfYm5lKTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9pbF9ibmV6KHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgaW50IGxpZCkKIHsKIAl1YXNtX3JfbWlwc19wYzE2KHIsICpwLCBsaWQpOwogCXVhc21faV9ibmV6KHAsIHJlZywgMCk7CiB9CitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pbF9ibmV6KTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9pbF9iZ2V6bCh1MzIgKipwLCBzdHJ1Y3QgdWFzbV9yZWxvYyAqKnIsIHVuc2lnbmVkIGludCByZWcsIGludCBsaWQpCiB7CiAJdWFzbV9yX21pcHNfcGMxNihyLCAqcCwgbGlkKTsKIAl1YXNtX2lfYmdlemwocCwgcmVnLCAwKTsKIH0KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2lsX2JnZXpsKTsKIAotdm9pZCBfX2NwdWluaXQKK3ZvaWQgX191YXNtaW5pdAogdWFzbV9pbF9iZ2V6KHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgaW50IGxpZCkKIHsKIAl1YXNtX3JfbWlwc19wYzE2KHIsICpwLCBsaWQpOwogCXVhc21faV9iZ2V6KHAsIHJlZywgMCk7CiB9CitVQVNNX0VYUE9SVF9TWU1CT0wodWFzbV9pbF9iZ2V6KTsKKwordm9pZCBfX3Vhc21pbml0Cit1YXNtX2lsX2JiaXQwKHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywKKwkgICAgICB1bnNpZ25lZCBpbnQgYml0LCBpbnQgbGlkKQoreworCXVhc21fcl9taXBzX3BjMTYociwgKnAsIGxpZCk7CisJdWFzbV9pX2JiaXQwKHAsIHJlZywgYml0LCAwKTsKK30KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2lsX2JiaXQwKTsKKwordm9pZCBfX3Vhc21pbml0Cit1YXNtX2lsX2JiaXQxKHUzMiAqKnAsIHN0cnVjdCB1YXNtX3JlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywKKwkgICAgICB1bnNpZ25lZCBpbnQgYml0LCBpbnQgbGlkKQoreworCXVhc21fcl9taXBzX3BjMTYociwgKnAsIGxpZCk7CisJdWFzbV9pX2JiaXQxKHAsIHJlZywgYml0LCAwKTsKK30KK1VBU01fRVhQT1JUX1NZTUJPTCh1YXNtX2lsX2JiaXQxKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvTWFrZWZpbGUgYi9hcmNoL21pcHMvbXRpLW1hbHRhL01ha2VmaWxlCmluZGV4IDMyZTg0NzguLjYwNzllZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9NYWtlZmlsZQpAQCAtMTUsNSArMTUsMyBAQAogCiAjIEZJWE1FIEZJWE1FIEZJWE1FCiBvYmotJChDT05GSUdfTUlQU19NVF9TTVRDKQkrPSBtYWx0YS1zbXRjLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvUGxhdGZvcm0gYi9hcmNoL21pcHMvbXRpLW1hbHRhL1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTQ4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL1BsYXRmb3JtCkBAIC0wLDAgKzEsNyBAQAorIworIyBNSVBTIE1hbHRhIGJvYXJkCisjCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX01BTFRBKQkrPSBtdGktbWFsdGEvCitjZmxhZ3MtJChDT05GSUdfTUlQU19NQUxUQSkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhCitsb2FkLSQoQ09ORklHX01JUFNfTUFMVEEpCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAorYWxsLSQoQ09ORklHX01JUFNfTUFMVEEpCTo9ICQoQ09NUFJFU1NJT05fRk5BTUUpLmJpbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4MzN4L2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9ueHAvcG54ODMzeC9jb21tb24vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTZmM2IuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL254cC9wbng4MzN4L2NvbW1vbi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb2JqLXkgOj0gaW50ZXJydXB0cy5vIHBsYXRmb3JtLm8gcHJvbS5vIHNldHVwLm8gcmVzZXQubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4MzN4L3N0YjIyeC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9ueHAvcG54ODMzeC9zdGIyMngvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWM1ODAuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL254cC9wbng4MzN4L3N0YjIyeC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotbGliLXkgOj0gYm9hcmQubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9jb21tb24vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWU3YjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMKLSMgUGVyIEhhbGxzbWFyaywgcGVyLmhhbGxzbWFya0BtdmlzdGEuY29tCi0jCi0jICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0jIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBQTlg4NTUwIHNwZWNpZmljIGtlcm5lbCBpbnRlcmZhY2Ugcm91dGluZXMKLSMgdW5kZXIgTGludXguCi0jCi0KLW9iai15IDo9IHNldHVwLm8gcHJvbS5vIGludC5vIHJlc2V0Lm8gdGltZS5vIHByb2MubyBwbGF0Zm9ybS5vCi1vYmotJChDT05GSUdfUENJKSArPSBwY2kubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2picy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9qYnMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmE4Y2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL254cC9wbng4NTUwL2picy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi0jIE1ha2VmaWxlIGZvciB0aGUgTlhQIEpCUyBCb2FyZC4KLQotbGliLXkgOj0gaW5pdC5vIGJvYXJkX3NldHVwLm8gaXJxbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9zdGI4MTAvTWFrZWZpbGUgYi9hcmNoL21pcHMvbnhwL3BueDg1NTAvc3RiODEwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjkxZDcyLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9zdGI4MTAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotIyBNYWtlZmlsZSBmb3IgdGhlIE5YUCBTVEI4MTAgQm9hcmQuCi0KLWxpYi15IDo9IHByb21faW5pdC5vIGJvYXJkX3NldHVwLm8gaXJxbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvbXNpLW9jdGVvbi5jIGIvYXJjaC9taXBzL3BjaS9tc2ktb2N0ZW9uLmMKaW5kZXggMDM3NDJlNi4uZDgwODA0OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9tc2ktb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL3BjaS9tc2ktb2N0ZW9uLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IENhdml1bSBOZXR3b3JrcworICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDksIDIwMTAgQ2F2aXVtIE5ldHdvcmtzCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMiw3ICsyMiw3IEBACiAgKiBFYWNoIGJpdCBpbiBtc2lfZnJlZV9pcnFfYml0bWFzayByZXByZXNlbnRzIGEgTVNJIGludGVycnVwdCB0aGF0IGlzCiAgKiBpbiB1c2UuCiAgKi8KLXN0YXRpYyB1aW50NjRfdCBtc2lfZnJlZV9pcnFfYml0bWFzazsKK3N0YXRpYyB1NjQgbXNpX2ZyZWVfaXJxX2JpdG1hc2tbNF07CiAKIC8qCiAgKiBFYWNoIGJpdCBpbiBtc2lfbXVsdGlwbGVfaXJxX2JpdG1hc2sgdGVsbHMgdGhhdCB0aGUgZGV2aWNlIHVzaW5nCkBAIC0zMCw3ICszMCw3IEBACiAgKiBpcyB1c2VkIHNvIHdlIGNhbiBkaXNhYmxlIGFsbCBvZiB0aGUgTVNJIGludGVycnVwdHMgd2hlbiBhIGRldmljZQogICogdXNlcyBtdWx0aXBsZS4KICAqLwotc3RhdGljIHVpbnQ2NF90IG1zaV9tdWx0aXBsZV9pcnFfYml0bWFzazsKK3N0YXRpYyB1NjQgbXNpX211bHRpcGxlX2lycV9iaXRtYXNrWzRdOwogCiAvKgogICogVGhpcyBsb2NrIGNvbnRyb2xzIHVwZGF0ZXMgdG8gbXNpX2ZyZWVfaXJxX2JpdG1hc2sgYW5kCkBAIC0zOCw2ICszOCwxMSBAQAogICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1zaV9mcmVlX2lycV9iaXRtYXNrX2xvY2spOwogCisvKgorICogTnVtYmVyIG9mIE1TSSBJUlFzIHVzZWQuIFRoaXMgdmFyaWFibGUgaXMgc2V0IHVwIGluCisgKiB0aGUgbW9kdWxlIGluaXQgdGltZS4KKyAqLworc3RhdGljIGludCBtc2lfaXJxX3NpemU7CiAKIC8qKgogICogQ2FsbGVkIHdoZW4gYSBkcml2ZXIgcmVxdWVzdCBNU0kgaW50ZXJydXB0cyBpbnN0ZWFkIG9mIHRoZQpAQCAtNTQsMTIgKzU5LDEzIEBACiBpbnQgYXJjaF9zZXR1cF9tc2lfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2lfZGVzYyAqZGVzYykKIHsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7Ci0JdWludDE2X3QgY29udHJvbDsKKwl1MTYgY29udHJvbDsKIAlpbnQgY29uZmlndXJlZF9wcml2YXRlX2JpdHM7CiAJaW50IHJlcXVlc3RfcHJpdmF0ZV9iaXRzOwotCWludCBpcnE7CisJaW50IGlycSA9IDA7CiAJaW50IGlycV9zdGVwOwotCXVpbnQ2NF90IHNlYXJjaF9tYXNrOworCXU2NCBzZWFyY2hfbWFzazsKKwlpbnQgaW5kZXg7CiAKIAkvKgogCSAqIFJlYWQgdGhlIE1TSSBjb25maWcgdG8gZmlndXJlIG91dCBob3cgbWFueSBJUlFzIHRoaXMgZGV2aWNlCkBAIC0xMTEsMjkgKzExNywzMSBAQAogCSAqIHVzZS4KIAkgKi8KIAlzcGluX2xvY2soJm1zaV9mcmVlX2lycV9iaXRtYXNrX2xvY2spOwotCWZvciAoaXJxID0gMDsgaXJxIDwgNjQ7IGlycSArPSBpcnFfc3RlcCkgewotCQlpZiAoKG1zaV9mcmVlX2lycV9iaXRtYXNrICYgKHNlYXJjaF9tYXNrIDw8IGlycSkpID09IDApIHsKLQkJCW1zaV9mcmVlX2lycV9iaXRtYXNrIHw9IHNlYXJjaF9tYXNrIDw8IGlycTsKLQkJCW1zaV9tdWx0aXBsZV9pcnFfYml0bWFzayB8PSAoc2VhcmNoX21hc2sgPj4gMSkgPDwgaXJxOwotCQkJYnJlYWs7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbXNpX2lycV9zaXplLzY0OyBpbmRleCsrKSB7CisJCWZvciAoaXJxID0gMDsgaXJxIDwgNjQ7IGlycSArPSBpcnFfc3RlcCkgeworCQkJaWYgKChtc2lfZnJlZV9pcnFfYml0bWFza1tpbmRleF0gJiAoc2VhcmNoX21hc2sgPDwgaXJxKSkgPT0gMCkgeworCQkJCW1zaV9mcmVlX2lycV9iaXRtYXNrW2luZGV4XSB8PSBzZWFyY2hfbWFzayA8PCBpcnE7CisJCQkJbXNpX211bHRpcGxlX2lycV9iaXRtYXNrW2luZGV4XSB8PSAoc2VhcmNoX21hc2sgPj4gMSkgPDwgaXJxOworCQkJCWdvdG8gbXNpX2lycV9hbGxvY2F0ZWQ7CisJCQl9CiAJCX0KIAl9Cittc2lfaXJxX2FsbG9jYXRlZDoKIAlzcGluX3VubG9jaygmbXNpX2ZyZWVfaXJxX2JpdG1hc2tfbG9jayk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHNlYXJjaCBmb3IgYXZhaWxhYmxlIGludGVycnVwdHMgZGlkbid0IGZhaWwgKi8KIAlpZiAoaXJxID49IDY0KSB7CiAJCWlmIChyZXF1ZXN0X3ByaXZhdGVfYml0cykgewotCQkJcHJfZXJyKCJhcmNoX3NldHVwX21zaV9pcnE6IFVuYWJsZSB0byBmaW5kICVkIGZyZWUgIgotCQkJICAgICAgICJpbnRlcnJ1cHRzLCB0cnlpbmcganVzdCBvbmUiLAorCQkJcHJfZXJyKCJhcmNoX3NldHVwX21zaV9pcnE6IFVuYWJsZSB0byBmaW5kICVkIGZyZWUgaW50ZXJydXB0cywgdHJ5aW5nIGp1c3Qgb25lIiwKIAkJCSAgICAgICAxIDw8IHJlcXVlc3RfcHJpdmF0ZV9iaXRzKTsKIAkJCXJlcXVlc3RfcHJpdmF0ZV9iaXRzID0gMDsKIAkJCWdvdG8gdHJ5X29ubHlfb25lOwogCQl9IGVsc2UKLQkJCXBhbmljKCJhcmNoX3NldHVwX21zaV9pcnE6IFVuYWJsZSB0byBmaW5kIGEgZnJlZSBNU0kgIgotCQkJICAgICAgImludGVycnVwdCIpOworCQkJcGFuaWMoImFyY2hfc2V0dXBfbXNpX2lycTogVW5hYmxlIHRvIGZpbmQgYSBmcmVlIE1TSSBpbnRlcnJ1cHQiKTsKIAl9CiAKIAkvKiBNU0kgaW50ZXJydXB0cyBzdGFydCBhdCBsb2dpY2FsIElSUSBPQ1RFT05fSVJRX01TSV9CSVQwICovCisJaXJxICs9IGluZGV4KjY0OwogCWlycSArPSBPQ1RFT05fSVJRX01TSV9CSVQwOwogCiAJc3dpdGNoIChvY3Rlb25fZG1hX2Jhcl90eXBlKSB7CkBAIC0xNjksNiArMTc3LDM0IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBhcmNoX3NldHVwX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCWludCByZXQ7CisKKwkvKgorCSAqIE1TSS1YIGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJaWYgKHR5cGUgPT0gUENJX0NBUF9JRF9NU0lYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSWYgYW4gYXJjaGl0ZWN0dXJlIHdhbnRzIHRvIHN1cHBvcnQgbXVsdGlwbGUgTVNJLCBpdCBuZWVkcyB0bworCSAqIG92ZXJyaWRlIGFyY2hfc2V0dXBfbXNpX2lycXMoKQorCSAqLworCWlmICh0eXBlID09IFBDSV9DQVBfSURfTVNJICYmIG52ZWMgPiAxKQorCQlyZXR1cm4gMTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1zaV9saXN0LCBsaXN0KSB7CisJCXJldCA9IGFyY2hfc2V0dXBfbXNpX2lycShkZXYsIGVudHJ5KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmV0ID4gMCkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKworCXJldHVybiAwOworfQogCiAvKioKICAqIENhbGxlZCB3aGVuIGEgZGV2aWNlIG5vIGxvbmdlciBuZWVkcyBpdHMgTVNJIGludGVycnVwdHMuIEFsbApAQCAtMTc5LDEyICsyMTUsMTggQEAKIHZvaWQgYXJjaF90ZWFyZG93bl9tc2lfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaW50IG51bWJlcl9pcnFzOwotCXVpbnQ2NF90IGJpdG1hc2s7CisJdTY0IGJpdG1hc2s7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgaXJxMDsKIAotCWlmICgoaXJxIDwgT0NURU9OX0lSUV9NU0lfQklUMCkgfHwgKGlycSA+IE9DVEVPTl9JUlFfTVNJX0JJVDYzKSkKKwlpZiAoKGlycSA8IE9DVEVPTl9JUlFfTVNJX0JJVDApCisJCXx8IChpcnEgPiBtc2lfaXJxX3NpemUgKyBPQ1RFT05fSVJRX01TSV9CSVQwKSkKIAkJcGFuaWMoImFyY2hfdGVhcmRvd25fbXNpX2lycTogQXR0ZW1wdGVkIHRvIHRlYXJkb3duIGlsbGVnYWwgIgogCQkgICAgICAiTVNJIGludGVycnVwdCAoJWQpIiwgaXJxKTsKKwogCWlycSAtPSBPQ1RFT05fSVJRX01TSV9CSVQwOworCWluZGV4ID0gaXJxIC8gNjQ7CisJaXJxMCA9IGlycSAlIDY0OwogCiAJLyoKIAkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIElSUXMgd2UgbmVlZCB0byBmcmVlIGJ5IGxvb2tpbmcgYXQgdGhlCkBAIC0xOTIsOTcgKzIzNCwxOTggQEAKIAkgKiBJUlEgaXMgYWxzbyBvd25lZCBieSB0aGlzIGRldmljZS4KIAkgKi8KIAludW1iZXJfaXJxcyA9IDA7Ci0Jd2hpbGUgKChpcnErbnVtYmVyX2lycXMgPCA2NCkgJiYKLQkgICAgICAgKG1zaV9tdWx0aXBsZV9pcnFfYml0bWFzayAmICgxdWxsIDw8IChpcnEgKyBudW1iZXJfaXJxcykpKSkKKwl3aGlsZSAoKGlycTAgKyBudW1iZXJfaXJxcyA8IDY0KSAmJgorCSAgICAgICAobXNpX211bHRpcGxlX2lycV9iaXRtYXNrW2luZGV4XQorCQkmICgxdWxsIDw8IChpcnEwICsgbnVtYmVyX2lycXMpKSkpCiAJCW51bWJlcl9pcnFzKys7CiAJbnVtYmVyX2lycXMrKzsKIAkvKiBNYXNrIHdpdGggb25lIGJpdCBmb3IgZWFjaCBJUlEgKi8KIAliaXRtYXNrID0gKDEgPDwgbnVtYmVyX2lycXMpIC0gMTsKIAkvKiBTaGlmdCB0aGUgbWFzayB0byB0aGUgY29ycmVjdCBiaXQgbG9jYXRpb24gKi8KLQliaXRtYXNrIDw8PSBpcnE7Ci0JaWYgKChtc2lfZnJlZV9pcnFfYml0bWFzayAmIGJpdG1hc2spICE9IGJpdG1hc2spCisJYml0bWFzayA8PD0gaXJxMDsKKwlpZiAoKG1zaV9mcmVlX2lycV9iaXRtYXNrW2luZGV4XSAmIGJpdG1hc2spICE9IGJpdG1hc2spCiAJCXBhbmljKCJhcmNoX3RlYXJkb3duX21zaV9pcnE6IEF0dGVtcHRlZCB0byB0ZWFyZG93biBNU0kgIgogCQkgICAgICAiaW50ZXJydXB0ICglZCkgbm90IGluIHVzZSIsIGlycSk7CiAKIAkvKiBDaGVja3MgYXJlIGRvbmUsIHVwZGF0ZSB0aGUgaW4gdXNlIGJpdG1hc2sgKi8KIAlzcGluX2xvY2soJm1zaV9mcmVlX2lycV9iaXRtYXNrX2xvY2spOwotCW1zaV9mcmVlX2lycV9iaXRtYXNrICY9IH5iaXRtYXNrOwotCW1zaV9tdWx0aXBsZV9pcnFfYml0bWFzayAmPSB+Yml0bWFzazsKKwltc2lfZnJlZV9pcnFfYml0bWFza1tpbmRleF0gJj0gfmJpdG1hc2s7CisJbXNpX211bHRpcGxlX2lycV9iaXRtYXNrW2luZGV4XSAmPSB+Yml0bWFzazsKIAlzcGluX3VubG9jaygmbXNpX2ZyZWVfaXJxX2JpdG1hc2tfbG9jayk7CiB9CiAKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKG9jdGVvbl9pcnFfbXNpX2xvY2spOworCitzdGF0aWMgdTY0IG1zaV9yY3ZfcmVnWzRdOworc3RhdGljIHU2NCBtaXNfZW5hX3JlZ1s0XTsKKworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9tc2lfZW5hYmxlX3BjaWUodW5zaWduZWQgaW50IGlycSkKK3sKKwl1NjQgZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXNpX251bWJlciA9IGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDA7CisJaW50IGlycV9pbmRleCA9IG1zaV9udW1iZXIgPj4gNjsKKwlpbnQgaXJxX2JpdCA9IG1zaV9udW1iZXIgJiAweDNmOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX21zaV9sb2NrLCBmbGFncyk7CisJZW4gPSBjdm14X3JlYWRfY3NyKG1pc19lbmFfcmVnW2lycV9pbmRleF0pOworCWVuIHw9IDF1bGwgPDwgaXJxX2JpdDsKKwljdm14X3dyaXRlX2NzcihtaXNfZW5hX3JlZ1tpcnFfaW5kZXhdLCBlbik7CisJY3ZteF9yZWFkX2NzcihtaXNfZW5hX3JlZ1tpcnFfaW5kZXhdKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2N0ZW9uX2lycV9tc2lfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX21zaV9kaXNhYmxlX3BjaWUodW5zaWduZWQgaW50IGlycSkKK3sKKwl1NjQgZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXNpX251bWJlciA9IGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDA7CisJaW50IGlycV9pbmRleCA9IG1zaV9udW1iZXIgPj4gNjsKKwlpbnQgaXJxX2JpdCA9IG1zaV9udW1iZXIgJiAweDNmOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX21zaV9sb2NrLCBmbGFncyk7CisJZW4gPSBjdm14X3JlYWRfY3NyKG1pc19lbmFfcmVnW2lycV9pbmRleF0pOworCWVuICY9IH4oMXVsbCA8PCBpcnFfYml0KTsKKwljdm14X3dyaXRlX2NzcihtaXNfZW5hX3JlZ1tpcnFfaW5kZXhdLCBlbik7CisJY3ZteF9yZWFkX2NzcihtaXNfZW5hX3JlZ1tpcnFfaW5kZXhdKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2N0ZW9uX2lycV9tc2lfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9tc2lfcGNpZSA9IHsKKwkubmFtZSA9ICJNU0kiLAorCS5lbmFibGUgPSBvY3Rlb25faXJxX21zaV9lbmFibGVfcGNpZSwKKwkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfbXNpX2Rpc2FibGVfcGNpZSwKK307CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfbXNpX2VuYWJsZV9wY2kodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKgorCSAqIE9jdGVvbiBQQ0kgZG9lc24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIG1hc2svdW5tYXNrIE1TSQorCSAqIGludGVycnVwdHMgaW5kaXZpZHVhbGx5LiBJbnN0ZWFkIG9mIG1hc2tpbmcvdW5tYXNraW5nIHRoZW0KKwkgKiBpbiBncm91cHMgb2YgMTYsIHdlIHNpbXBsZSBhc3N1bWUgTVNJIGRldmljZXMgYXJlIHdlbGwKKwkgKiBiZWhhdmVkLiBNU0kgaW50ZXJydXB0cyBhcmUgYWx3YXlzIGVuYWJsZSBhbmQgdGhlIEFDSyBpcworCSAqIGFzc3VtZWQgdG8gYmUgZW5vdWdoCisJICovCit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfbXNpX2Rpc2FibGVfcGNpKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyogU2VlIGNvbW1lbnQgaW4gZW5hYmxlICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgb2N0ZW9uX2lycV9jaGlwX21zaV9wY2kgPSB7CisJLm5hbWUgPSAiTVNJIiwKKwkuZW5hYmxlID0gb2N0ZW9uX2lycV9tc2lfZW5hYmxlX3BjaSwKKwkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfbXNpX2Rpc2FibGVfcGNpLAorfTsKIAogLyoKICAqIENhbGxlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgd2hlbiBhbiBNU0kgaW50ZXJydXB0CiAgKiBvY2N1cnMuCiAgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBvY3Rlb25fbXNpX2ludGVycnVwdChpbnQgY3BsLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgaXJxcmV0dXJuX3QgX19vY3Rlb25fbXNpX2RvX2ludGVycnVwdChpbnQgaW5kZXgsIHU2NCBtc2lfYml0cykKIHsKLQl1aW50NjRfdCBtc2lfYml0czsKIAlpbnQgaXJxOworCWludCBiaXQ7CiAKLQlpZiAob2N0ZW9uX2RtYV9iYXJfdHlwZSA9PSBPQ1RFT05fRE1BX0JBUl9UWVBFX1BDSUUpCi0JCW1zaV9iaXRzID0gY3ZteF9yZWFkX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfUkNWMCk7Ci0JZWxzZQotCQltc2lfYml0cyA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9OUElfTlBJX01TSV9SQ1YpOwotCWlycSA9IGZsczY0KG1zaV9iaXRzKTsKLQlpZiAoaXJxKSB7Ci0JCWlycSArPSBPQ1RFT05fSVJRX01TSV9CSVQwIC0gMTsKLQkJaWYgKGlycV9kZXNjW2lycV0uYWN0aW9uKSB7Ci0JCQlkb19JUlEoaXJxKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiU3B1cmlvdXMgTVNJIGludGVycnVwdCAlZFxuIiwgaXJxKTsKLQkJCWlmIChvY3Rlb25faGFzX2ZlYXR1cmUoT0NURU9OX0ZFQVRVUkVfUENJRSkpIHsKLQkJCQkvKiBUaGVzZSBjaGlwcyBoYXZlIFBDSWUgKi8KLQkJCQljdm14X3dyaXRlX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfUkNWMCwKLQkJCQkJICAgICAgIDF1bGwgPDwgKGlycSAtCi0JCQkJCQkJT0NURU9OX0lSUV9NU0lfQklUMCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBUaGVzZSBjaGlwcyBoYXZlIFBDSSAqLwotCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfTlBJX05QSV9NU0lfUkNWLAotCQkJCQkgICAgICAgMXVsbCA8PCAoaXJxIC0KLQkJCQkJCQlPQ1RFT05fSVJRX01TSV9CSVQwKSk7Ci0JCQl9Ci0JCX0KKwliaXQgPSBmbHM2NChtc2lfYml0cyk7CisJaWYgKGJpdCkgeworCQliaXQtLTsKKwkJLyogQWNrbm93bGVkZ2UgaXQgZmlyc3QuICovCisJCWN2bXhfd3JpdGVfY3NyKG1zaV9yY3ZfcmVnW2luZGV4XSwgMXVsbCA8PCBiaXQpOworCisJCWlycSA9IGJpdCArIE9DVEVPTl9JUlFfTVNJX0JJVDAgKyA2NCAqIGluZGV4OworCQlkb19JUlEoaXJxKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKKyNkZWZpbmUgT0NURU9OX01TSV9JTlRfSEFORExFUl9YKHgpCQkJCQlcCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2N0ZW9uX21zaV9pbnRlcnJ1cHQjI3goaW50IGNwbCwgdm9pZCAqZGV2X2lkKQlcCit7CQkJCQkJCQkJXAorCXU2NCBtc2lfYml0cyA9IGN2bXhfcmVhZF9jc3IobXNpX3Jjdl9yZWdbKHgpXSk7CQkJXAorCXJldHVybiBfX29jdGVvbl9tc2lfZG9faW50ZXJydXB0KCh4KSwgbXNpX2JpdHMpOwkJXAorfQorCisvKgorICogQ3JlYXRlIG9jdGVvbl9tc2lfaW50ZXJydXB0ezAtM30gZnVuY3Rpb24gYm9keQorICovCitPQ1RFT05fTVNJX0lOVF9IQU5ETEVSX1goMCk7CitPQ1RFT05fTVNJX0lOVF9IQU5ETEVSX1goMSk7CitPQ1RFT05fTVNJX0lOVF9IQU5ETEVSX1goMik7CitPQ1RFT05fTVNJX0lOVF9IQU5ETEVSX1goMyk7CiAKIC8qCiAgKiBJbml0aWFsaXplcyB0aGUgTVNJIGludGVycnVwdCBoYW5kbGluZyBjb2RlCiAgKi8KLWludCBvY3Rlb25fbXNpX2luaXRpYWxpemUodm9pZCkKK2ludCBfX2luaXQgb2N0ZW9uX21zaV9pbml0aWFsaXplKHZvaWQpCiB7CisJaW50IGlycTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKm1zaTsKKworCWlmIChvY3Rlb25fZG1hX2Jhcl90eXBlID09IE9DVEVPTl9ETUFfQkFSX1RZUEVfUENJRSkgeworCQltc2lfcmN2X3JlZ1swXSA9IENWTVhfUEVYUF9OUEVJX01TSV9SQ1YwOworCQltc2lfcmN2X3JlZ1sxXSA9IENWTVhfUEVYUF9OUEVJX01TSV9SQ1YxOworCQltc2lfcmN2X3JlZ1syXSA9IENWTVhfUEVYUF9OUEVJX01TSV9SQ1YyOworCQltc2lfcmN2X3JlZ1szXSA9IENWTVhfUEVYUF9OUEVJX01TSV9SQ1YzOworCQltaXNfZW5hX3JlZ1swXSA9IENWTVhfUEVYUF9OUEVJX01TSV9FTkIwOworCQltaXNfZW5hX3JlZ1sxXSA9IENWTVhfUEVYUF9OUEVJX01TSV9FTkIxOworCQltaXNfZW5hX3JlZ1syXSA9IENWTVhfUEVYUF9OUEVJX01TSV9FTkIyOworCQltaXNfZW5hX3JlZ1szXSA9IENWTVhfUEVYUF9OUEVJX01TSV9FTkIzOworCQltc2kgPSAmb2N0ZW9uX2lycV9jaGlwX21zaV9wY2llOworCX0gZWxzZSB7CisJCW1zaV9yY3ZfcmVnWzBdID0gQ1ZNWF9OUElfTlBJX01TSV9SQ1Y7CisjZGVmaW5lIElOVkFMSURfR0VORVJBVEVfQURFIDB4ODcwMDAwMDAwMDAwMDAwMFVMTDsKKwkJbXNpX3Jjdl9yZWdbMV0gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbXNpX3Jjdl9yZWdbMl0gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbXNpX3Jjdl9yZWdbM10gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbWlzX2VuYV9yZWdbMF0gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbWlzX2VuYV9yZWdbMV0gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbWlzX2VuYV9yZWdbMl0gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbWlzX2VuYV9yZWdbM10gPSBJTlZBTElEX0dFTkVSQVRFX0FERTsKKwkJbXNpID0gJm9jdGVvbl9pcnFfY2hpcF9tc2lfcGNpOworCX0KKworCWZvciAoaXJxID0gT0NURU9OX0lSUV9NU0lfQklUMDsgaXJxIDw9IE9DVEVPTl9JUlFfTVNJX0xBU1Q7IGlycSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBtc2ksIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwogCWlmIChvY3Rlb25faGFzX2ZlYXR1cmUoT0NURU9OX0ZFQVRVUkVfUENJRSkpIHsKLQkJaWYgKHJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTAsIG9jdGVvbl9tc2lfaW50ZXJydXB0LAotCQkJCUlSUUZfU0hBUkVELAotCQkJCSJNU0lbMDo2M10iLCBvY3Rlb25fbXNpX2ludGVycnVwdCkpCi0JCQlwYW5pYygicmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMCkgZmFpbGVkIik7Ci0JfSBlbHNlIGlmIChvY3Rlb25faXNfcGNpX2hvc3QoKSkgewotCQlpZiAocmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMCwgb2N0ZW9uX21zaV9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9TSEFSRUQsCi0JCQkJIk1TSVswOjE1XSIsIG9jdGVvbl9tc2lfaW50ZXJydXB0KSkKKwkJaWYgKHJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTAsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCwKKwkJCQkwLCAiTVNJWzA6NjNdIiwgb2N0ZW9uX21zaV9pbnRlcnJ1cHQwKSkKIAkJCXBhbmljKCJyZXF1ZXN0X2lycShPQ1RFT05fSVJRX1BDSV9NU0kwKSBmYWlsZWQiKTsKIAotCQlpZiAocmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMSwgb2N0ZW9uX21zaV9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9TSEFSRUQsCi0JCQkJIk1TSVsxNjozMV0iLCBvY3Rlb25fbXNpX2ludGVycnVwdCkpCisJCWlmIChyZXF1ZXN0X2lycShPQ1RFT05fSVJRX1BDSV9NU0kxLCBvY3Rlb25fbXNpX2ludGVycnVwdDEsCisJCQkJMCwgIk1TSVs2NDoxMjddIiwgb2N0ZW9uX21zaV9pbnRlcnJ1cHQxKSkKIAkJCXBhbmljKCJyZXF1ZXN0X2lycShPQ1RFT05fSVJRX1BDSV9NU0kxKSBmYWlsZWQiKTsKIAotCQlpZiAocmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMiwgb2N0ZW9uX21zaV9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9TSEFSRUQsCi0JCQkJIk1TSVszMjo0N10iLCBvY3Rlb25fbXNpX2ludGVycnVwdCkpCisJCWlmIChyZXF1ZXN0X2lycShPQ1RFT05fSVJRX1BDSV9NU0kyLCBvY3Rlb25fbXNpX2ludGVycnVwdDIsCisJCQkJMCwgIk1TSVsxMjc6MTkxXSIsIG9jdGVvbl9tc2lfaW50ZXJydXB0MikpCiAJCQlwYW5pYygicmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMikgZmFpbGVkIik7CiAKLQkJaWYgKHJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTMsIG9jdGVvbl9tc2lfaW50ZXJydXB0LAotCQkJCUlSUUZfU0hBUkVELAotCQkJCSJNU0lbNDg6NjNdIiwgb2N0ZW9uX21zaV9pbnRlcnJ1cHQpKQorCQlpZiAocmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMywgb2N0ZW9uX21zaV9pbnRlcnJ1cHQzLAorCQkJCTAsICJNU0lbMTkyOjI1NV0iLCBvY3Rlb25fbXNpX2ludGVycnVwdDMpKQogCQkJcGFuaWMoInJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTMpIGZhaWxlZCIpOwogCisJCW1zaV9pcnFfc2l6ZSA9IDI1NjsKKwl9IGVsc2UgaWYgKG9jdGVvbl9pc19wY2lfaG9zdCgpKSB7CisJCWlmIChyZXF1ZXN0X2lycShPQ1RFT05fSVJRX1BDSV9NU0kwLCBvY3Rlb25fbXNpX2ludGVycnVwdDAsCisJCQkJMCwgIk1TSVswOjE1XSIsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCkpCisJCQlwYW5pYygicmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMCkgZmFpbGVkIik7CisKKwkJaWYgKHJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTEsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCwKKwkJCQkwLCAiTVNJWzE2OjMxXSIsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCkpCisJCQlwYW5pYygicmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMSkgZmFpbGVkIik7CisKKwkJaWYgKHJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTIsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCwKKwkJCQkwLCAiTVNJWzMyOjQ3XSIsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCkpCisJCQlwYW5pYygicmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMikgZmFpbGVkIik7CisKKwkJaWYgKHJlcXVlc3RfaXJxKE9DVEVPTl9JUlFfUENJX01TSTMsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCwKKwkJCQkwLCAiTVNJWzQ4OjYzXSIsIG9jdGVvbl9tc2lfaW50ZXJydXB0MCkpCisJCQlwYW5pYygicmVxdWVzdF9pcnEoT0NURU9OX0lSUV9QQ0lfTVNJMykgZmFpbGVkIik7CisJCW1zaV9pcnFfc2l6ZSA9IDY0OwogCX0KIAlyZXR1cm4gMDsKIH0KLQogc3Vic3lzX2luaXRjYWxsKG9jdGVvbl9tc2lfaW5pdGlhbGl6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy10aXRhbi1odC5jIGIvYXJjaC9taXBzL3BjaS9vcHMtdGl0YW4taHQuYwppbmRleCA3NDljMTkyLi41N2Q1NGFkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL29wcy10aXRhbi1odC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLXRpdGFuLWh0LmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vdGl0YW5fZGVwLmg+CiAKIHN0YXRpYyBpbnQgdGl0YW5faHRfY29uZmlnX3JlYWRfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCWludCBvZmZzZXQsIHUzMiAqIHZhbCkKKwlpbnQgb2Zmc2V0LCB1MzIgKnZhbCkKIHsKIAl2b2xhdGlsZSB1aW50MzJfdCBhZGRyZXNzOwogCWludCBidXNubzsKQEAgLTY0LDcgKzY0LDcgQEAKIH0KIAogc3RhdGljIGludCB0aXRhbl9odF9jb25maWdfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JaW50IG9mZnNldCwgaW50IHNpemUsIHUzMiAqIHZhbCkKKwlpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgdTMyICp2YWwpCiB7CiAJdWludDMyX3QgZHdvcmQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpZS1vY3Rlb24uYyBiL2FyY2gvbWlwcy9wY2kvcGNpZS1vY3Rlb24uYwppbmRleCA2YWE1YzU0Li44NjEzNjFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaWUtb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2llLW9jdGVvbi5jCkBAIC00MDIsNiArNDAyLDEwIEBACiAJbnBlaV9jdGxfc3RhdHVzMi5zLm1wcyA9IDA7CiAJLyogTWF4IHJlYWQgcmVxdWVzdCBzaXplID0gMTI4IGJ5dGVzIGZvciBiZXN0IE9jdGVvbiBETUEgcGVyZm9ybWFuY2UgKi8KIAlucGVpX2N0bF9zdGF0dXMyLnMubXJycyA9IDA7CisJaWYgKHBjaWVfcG9ydCkKKwkJbnBlaV9jdGxfc3RhdHVzMi5zLmMxX2IxX3MgPSAzOyAvKiBQb3J0MSBCQVIxIFNpemUgMjU2TUIgKi8KKwllbHNlCisJCW5wZWlfY3RsX3N0YXR1czIucy5jMF9iMV9zID0gMzsgLyogUG9ydDAgQkFSMSBTaXplIDI1Nk1CICovCiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QRVhQX05QRUlfQ1RMX1NUQVRVUzIsIG5wZWlfY3RsX3N0YXR1czIudTY0KTsKIAogCS8qIEVDUkMgR2VuZXJhdGlvbiAoUENJRSpfQ0ZHMDcwW0dFLENFXSkgKi8KQEAgLTY2Niw2ICs2NzAsOCBAQAogc3RhdGljIGludCBjdm14X3BjaWVfcmNfaW5pdGlhbGl6ZShpbnQgcGNpZV9wb3J0KQogewogCWludCBpOworCWludCBiYXNlOworCXU2NCBhZGRyX3N3aXp6bGU7CiAJdW5pb24gY3ZteF9jaXVfc29mdF9wcnN0IGNpdV9zb2Z0X3Byc3Q7CiAJdW5pb24gY3ZteF9wZXNjeF9iaXN0X3N0YXR1cyBwZXNjeF9iaXN0X3N0YXR1czsKIAl1bmlvbiBjdm14X3Blc2N4X2Jpc3Rfc3RhdHVzMiBwZXNjeF9iaXN0X3N0YXR1czI7CkBAIC02NzQsNiArNjgwLDcgQEAKIAl1bmlvbiBjdm14X25wZWlfbWVtX2FjY2Vzc19zdWJpZHggbWVtX2FjY2Vzc19zdWJpZDsKIAl1bmlvbiBjdm14X25wZWlfZGJnX2RhdGEgbnBlaV9kYmdfZGF0YTsKIAl1bmlvbiBjdm14X3Blc2N4X2N0bF9zdGF0dXMyIHBlc2N4X2N0bF9zdGF0dXMyOworCXVuaW9uIGN2bXhfbnBlaV9iYXIxX2luZGV4eCBiYXIxX2luZGV4OwogCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgYXJlbid0IHRyeWluZyB0byBzZXR1cCBhIHRhcmdldCBtb2RlIGludGVyZmFjZQpAQCAtOTE4LDEyICs5MjUsMzAgQEAKIAkvKiBTZXQgT2N0ZW9uJ3MgQkFSMCB0byBkZWNvZGUgMC0xNktCLiBJdCBvdmVybGFwcyB3aXRoIEJhcjIgKi8KIAljdm14X3dyaXRlX2NzcihDVk1YX1BFU0NYX1AyTl9CQVIwX1NUQVJUKHBjaWVfcG9ydCksIDApOwogCi0JLyoKLQkgKiBEaXNhYmxlIE9jdGVvbidzIEJBUjEuIEl0IGlzbid0IG5lZWRlZCBpbiBSQyBtb2RlIHNpbmNlCi0JICogQkFSMiBtYXBzIGFsbCBvZiBtZW1vcnkuIEJBUjIgYWxzbyBtYXBzIDI1Nk1CLTUxMk1CIGludG8KLQkgKiB0aGUgMm5kIDI1Nk1CIG9mIG1lbW9yeS4KLQkgKi8KLQljdm14X3dyaXRlX2NzcihDVk1YX1BFU0NYX1AyTl9CQVIxX1NUQVJUKHBjaWVfcG9ydCksIC0xKTsKKwkvKiBCQVIxIGZvbGxvd3MgQkFSMiB3aXRoIGEgZ2FwLiAqLworCWN2bXhfd3JpdGVfY3NyKENWTVhfUEVTQ1hfUDJOX0JBUjFfU1RBUlQocGNpZV9wb3J0KSwgQ1ZNWF9QQ0lFX0JBUjFfUkNfQkFTRSk7CisKKwliYXIxX2luZGV4LnUzMiA9IDA7CisJYmFyMV9pbmRleC5zLmFkZHJfaWR4ID0gKENWTVhfUENJRV9CQVIxX1BIWVNfQkFTRSA+PiAyMik7CisJYmFyMV9pbmRleC5zLmNhID0gMTsgICAgICAgLyogTm90IENhY2hlZCAqLworCWJhcjFfaW5kZXgucy5lbmRfc3dwID0gMTsgIC8qIEVuZGlhbiBTd2FwIG1vZGUgKi8KKwliYXIxX2luZGV4LnMuYWRkcl92ID0gMTsgICAvKiBWYWxpZCBlbnRyeSAqLworCisJYmFzZSA9IHBjaWVfcG9ydCA/IDE2IDogMDsKKworCS8qIEJpZyBlbmRpYW4gc3dpenpsZSBmb3IgMzItYml0IFBFWFBfTkNCIHJlZ2lzdGVyLiAqLworI2lmZGVmIF9fTUlQU0VCX18KKwlhZGRyX3N3aXp6bGUgPSA0OworI2Vsc2UKKwlhZGRyX3N3aXp6bGUgPSAwOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJY3ZteF93cml0ZTY0X3VpbnQzMigoQ1ZNWF9QRVhQX05QRUlfQkFSMV9JTkRFWFgoYmFzZSkgXiBhZGRyX3N3aXp6bGUpLAorCQkJCSAgICBiYXIxX2luZGV4LnUzMik7CisJCWJhc2UrKzsKKwkJLyogMjU2TUIgLyAxNiA+PiAyMiA9PSA0ICovCisJCWJhcjFfaW5kZXgucy5hZGRyX2lkeCArPSAoKCgxdWxsIDw8IDI4KSAvIDE2dWxsKSA+PiAyMik7CisJfQogCiAJLyoKIAkgKiBTZXQgT2N0ZW9uJ3MgQkFSMiB0byBkZWNvZGUgMC0yXjM5LiBCYXIwIGFuZCBCYXIxIHRha2UKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL1BsYXRmb3JtIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5MmYyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL1BsYXRmb3JtCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgUE1DLVNpZXJyYSBNU1AgU09DcworIworcGxhdGZvcm0tJChDT05GSUdfUE1DX01TUCkJKz0gcG1jLXNpZXJyYS9tc3A3MXh4LworY2ZsYWdzLSQoQ09ORklHX1BNQ19NU1ApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4IFwKKwkJCQkJLW1uby1icmFuY2gtbGlrZWx5Citsb2FkLSQoQ09ORklHX1BNQ19NU1ApCQkrPSAweGZmZmZmZmZmODAxMDAwMDAKKworIworIyBQTUMtU2llcnJhIFlvc2VtaXRlCisjCitwbGF0Zm9ybS0kKENPTkZJR19QTUNfWU9TRU1JVEUpCSs9IHBtYy1zaWVycmEveW9zZW1pdGUvCitjZmxhZ3MtJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gteW9zZW1pdGUKK2xvYWQtJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX2h3YnV0dG9uLmMgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9od2J1dHRvbi5jCmluZGV4IDExNzY5YjUuLmM4NDFmMDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX2h3YnV0dG9uLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfaHdidXR0b24uYwpAQCAtMzIsOSArMzIsNiBAQAogI2luY2x1ZGUgPG1zcF9pbnQuaD4KICNpbmNsdWRlIDxtc3BfcmVncy5oPgogI2luY2x1ZGUgPG1zcF9yZWdvcHMuaD4KLSNpZmRlZiBDT05GSUdfUE1DVFdJTEVECi0jaW5jbHVkZSA8bXNwX2xlZF9tYWNyb3MuaD4KLSNlbmRpZgogCiAvKiBGb3IgaHdidXR0b25faW50ZXJydXB0LT5pbml0aWFsX3N0YXRlICovCiAjZGVmaW5lIEhXQlVUVE9OX0hJCTB4MQpAQCAtODIsMTAgKzc5LDYgQEAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFOREJZIHN3aXRjaCB3YXMgc2V0IHRvIE9OIChub3QgaW1wbGVtZW50ZWQpXG4iKTsKIAogCS8qIFRPRE86IFB1dCBib2FyZCBpbiBzdGFuZGJ5IG1vZGUgKi8KLSNpZmRlZiBDT05GSUdfUE1DVFdJTEVECi0JbXNwX2xlZF90dXJuX29mZihNU1BfTEVEX1BXUlNUQU5EQllfR1JFRU4pOwotCW1zcF9sZWRfdHVybl9vbihNU1BfTEVEX1BXUlNUQU5EQllfUkVEKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBzdGFuZGJ5X29mZih2b2lkICpkYXRhKQpAQCAtOTQsMTAgKzg3LDYgQEAKIAkJIlNUQU5EQlkgc3dpdGNoIHdhcyBzZXQgdG8gT0ZGIChub3QgaW1wbGVtZW50ZWQpXG4iKTsKIAogCS8qIFRPRE86IFRha2Ugb3V0IG9mIHN0YW5kYnkgbW9kZSAqLwotI2lmZGVmIENPTkZJR19QTUNUV0lMRUQKLQltc3BfbGVkX3R1cm5fb24oTVNQX0xFRF9QV1JTVEFOREJZX0dSRUVOKTsKLQltc3BfbGVkX3R1cm5fb2ZmKE1TUF9MRURfUFdSU1RBTkRCWV9SRUQpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHdidXR0b25faW50ZXJydXB0IHNvZnRyZXNldF9zdyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2h0LWlycS5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvaHQtaXJxLmMKaW5kZXggNWFlYzQwNS4uODZiOThlOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvaHQtaXJxLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvaHQtaXJxLmMKQEAgLTM1LDE4ICszNSwxNyBAQAogICovCiB2b2lkIF9faW5pdCB0aXRhbl9odF9wY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotICAgICAgICBzdHJ1Y3QgcGNpX2J1cyAqY3VycmVudF9idXMgPSBidXM7Ci0gICAgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXZpY2VzOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzX2xpbms7CisJc3RydWN0IHBjaV9idXMgKmN1cnJlbnRfYnVzID0gYnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXZpY2VzOworCXN0cnVjdCBsaXN0X2hlYWQgKmRldmljZXNfbGluazsKIAogCWxpc3RfZm9yX2VhY2goZGV2aWNlc19saW5rLCAmKGN1cnJlbnRfYnVzLT5kZXZpY2VzKSkgewotICAgICAgICAgICAgICAgIGRldmljZXMgPSBwY2lfZGV2X2IoZGV2aWNlc19saW5rKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisJCWRldmljZXMgPSBwY2lfZGV2X2IoZGV2aWNlc19saW5rKTsKKwkJaWYgKGRldmljZXMgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwogCX0KIAogCS8qCiAJICogUExYIGFuZCBTUEtUIHJlbGF0ZWQgY2hhbmdlcyBnbyBoZXJlCiAJICovCi0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2lycS5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvaXJxLmMKaW5kZXggNTEwMjFjZi4uMjViYmJmNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvaXJxLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvaXJxLmMKQEAgLTE1MCw4ICsxNTAsNCBAQAogCW1pcHNfY3B1X2lycV9pbml0KCk7CiAJcm03a19jcHVfaXJxX2luaXQoKTsKIAlybTlrX2NwdV9pcnFfaW5pdCgpOwotCi0jaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCi0JcmVnaXN0ZXJfZ2RiX2NvbnNvbGUoKTsKLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDgzM3gvTWFrZWZpbGUgYi9hcmNoL21pcHMvcG54ODMzeC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM0Njk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BueDgzM3gvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmotJChDT05GSUdfU09DX1BOWDgzM1gpCSs9IGNvbW1vbi8KK29iai0kKENPTkZJR19OWFBfU1RCMjIwKQkrPSBzdGIyMngvCitvYmotJChDT05GSUdfTlhQX1NUQjIyNSkJKz0gc3RiMjJ4LwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDgzM3gvUGxhdGZvcm0gYi9hcmNoL21pcHMvcG54ODMzeC9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTZlYzRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BueDgzM3gvUGxhdGZvcm0KQEAgLTAsMCArMSw1IEBACisjIE5YUCBTVEIyMjUKK3BsYXRmb3JtLSQoQ09ORklHX1NPQ19QTlg4MzNYKQkrPSBwbng4MzN4LworY2ZsYWdzLSQoQ09ORklHX1NPQ19QTlg4MzNYKSAgICArPSAtSWFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDgzM3gKK2xvYWQtJChDT05GSUdfTlhQX1NUQjIyMCkJKz0gMHhmZmZmZmZmZjgwMDAxMDAwCitsb2FkLSQoQ09ORklHX05YUF9TVEIyMjUpCSs9IDB4ZmZmZmZmZmY4MDAwMTAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDgzM3gvY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL3BueDgzM3gvY29tbW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDZkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG54ODMzeC9jb21tb24vTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLXkgOj0gaW50ZXJydXB0cy5vIHBsYXRmb3JtLm8gcHJvbS5vIHNldHVwLm8gcmVzZXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4MzN4L2NvbW1vbi9pbnRlcnJ1cHRzLmMgYi9hcmNoL21pcHMvcG54ODMzeC9jb21tb24vaW50ZXJydXB0cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDgzM3gvY29tbW9uL2ludGVycnVwdHMuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDgzM3gvY29tbW9uL2ludGVycnVwdHMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4MzN4L2NvbW1vbi9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL3BueDgzM3gvY29tbW9uL3BsYXRmb3JtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ueHAvcG54ODMzeC9jb21tb24vcGxhdGZvcm0uYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDgzM3gvY29tbW9uL3BsYXRmb3JtLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ueHAvcG54ODMzeC9jb21tb24vcHJvbS5jIGIvYXJjaC9taXBzL3BueDgzM3gvY29tbW9uL3Byb20uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL254cC9wbng4MzN4L2NvbW1vbi9wcm9tLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9wbng4MzN4L2NvbW1vbi9wcm9tLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ueHAvcG54ODMzeC9jb21tb24vcmVzZXQuYyBiL2FyY2gvbWlwcy9wbng4MzN4L2NvbW1vbi9yZXNldC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDgzM3gvY29tbW9uL3Jlc2V0LmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9wbng4MzN4L2NvbW1vbi9yZXNldC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbnhwL3BueDgzM3gvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvcG54ODMzeC9jb21tb24vc2V0dXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL254cC9wbng4MzN4L2NvbW1vbi9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL21pcHMvcG54ODMzeC9jb21tb24vc2V0dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDgzM3gvc3RiMjJ4L01ha2VmaWxlIGIvYXJjaC9taXBzL3BueDgzM3gvc3RiMjJ4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTgwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG54ODMzeC9zdGIyMngvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLXkgOj0gYm9hcmQubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4MzN4L3N0YjIyeC9ib2FyZC5jIGIvYXJjaC9taXBzL3BueDgzM3gvc3RiMjJ4L2JvYXJkLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ueHAvcG54ODMzeC9zdGIyMngvYm9hcmQuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDgzM3gvc3RiMjJ4L2JvYXJkLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbng4NTUwL01ha2VmaWxlIGIvYXJjaC9taXBzL3BueDg1NTAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3ZTg1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wbng4NTUwL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX1NPQ19QTlg4NTUwKQkrPSBjb21tb24vCitvYmotJChDT05GSUdfUE5YODU1MF9KQlMpCSs9IGpicy8KK29iai0kKENPTkZJR19QTlg4NTUwX1NUQjgxMCkJKz0gc3RiODEwLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDg1NTAvUGxhdGZvcm0gYi9hcmNoL21pcHMvcG54ODU1MC9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdmYmRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BueDg1NTAvUGxhdGZvcm0KQEAgLTAsMCArMSw3IEBACitwbGF0Zm9ybS0kKENPTkZJR19TT0NfUE5YODU1MCkJKz0gcG54ODU1MC8KKworY2ZsYWdzLSQoQ09ORklHX1NPQ19QTlg4NTUwKQkrPQkJCQkJXAorCQktSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MAorCitsb2FkLSQoQ09ORklHX1BOWDg1NTBfSkJTKQkrPSAweGZmZmZmZmZmODAwNjAwMDAKK2xvYWQtJChDT05GSUdfUE5YODU1MF9TVEI4MTApCSs9IDB4ZmZmZmZmZmY4MDA2MDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Y2U2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vTWFrZWZpbGUKQEAgLTAsMCArMSwyNiBAQAorIworIyBQZXIgSGFsbHNtYXJrLCBwZXIuaGFsbHNtYXJrQG12aXN0YS5jb20KKyMKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNYWtlZmlsZSBmb3IgdGhlIFBOWDg1NTAgc3BlY2lmaWMga2VybmVsIGludGVyZmFjZSByb3V0aW5lcworIyB1bmRlciBMaW51eC4KKyMKKworb2JqLXkgOj0gc2V0dXAubyBwcm9tLm8gaW50Lm8gcmVzZXQubyB0aW1lLm8gcHJvYy5vIHBsYXRmb3JtLm8KK29iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL2ludC5jIGIvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL2ludC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL2ludC5jCnJlbmFtZSB0byBhcmNoL21pcHMvcG54ODU1MC9jb21tb24vaW50LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbng4NTUwL2NvbW1vbi9wY2kuYyBiL2FyY2gvbWlwcy9wbng4NTUwL2NvbW1vbi9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGU4NmRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3BjaS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICoKKyAqIEF1dGhvcjogc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8Z2xiLmg+CisjaW5jbHVkZSA8bmFuZC5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaV9pb19yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBQTlg4NTUwX1BDSUlPICsgMHgxMDAwLAkvKiByZXNlcnZlIHJlZ2FjeSBJL08gc3BhY2UgKi8KKwkuZW5kCT0gUE5YODU1MF9QQ0lJTyArIFBOWDg1NTBfUENJSU9fU0laRSwKKwkubmFtZQk9ICJwY2kgSU8gc3BhY2UiLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGNpX21lbV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBQTlg4NTUwX1BDSU1FTSwKKwkuZW5kCT0gUE5YODU1MF9QQ0lNRU0gKyBQTlg4NTUwX1BDSU1FTV9TSVpFIC0gMSwKKwkubmFtZQk9ICJwY2kgbWVtb3J5IHNwYWNlIiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQorfTsKKworZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHBueDg1NTBfcGNpX29wczsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwbng4NTUwX2NvbnRyb2xsZXIgPSB7CisJLnBjaV9vcHMJPSAmcG54ODU1MF9wY2lfb3BzLAorCS5pb19tYXBfYmFzZQk9IFBOWDg1NTBfUE9SVF9CQVNFLAorCS5pb19yZXNvdXJjZQk9ICZwY2lfaW9fcmVzb3VyY2UsCisJLm1lbV9yZXNvdXJjZQk9ICZwY2lfbWVtX3Jlc291cmNlLAorfTsKKworLyogUmV0dXJuIHRoZSB0b3RhbCBzaXplIG9mIERSQU0tbWVtb3J5LCAoUkFOSzAgKyBSQU5LMSkgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc3lzdGVtX21lbV9zaXplKHZvaWQpCit7CisJLyogUmVhZCBJUDIwMzFfUkFOSzBfQUREUl9MTyAqLworCXVuc2lnbmVkIGxvbmcgZHJhbV9yMF9sbyA9IGlubChQQ0lfQkFTRSB8IDB4NjUwMTApOworCS8qIFJlYWQgSVAyMDMxX1JBTksxX0FERFJfSEkgKi8KKwl1bnNpZ25lZCBsb25nIGRyYW1fcjFfaGkgPSBpbmwoUENJX0JBU0UgfCAweDY1MDE4KTsKKworCXJldHVybiBkcmFtX3IxX2hpIC0gZHJhbV9yMF9sbyArIDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBueDg1NTBfcGNpX3NldHVwKHZvaWQpCit7CisJaW50IHBjaV9tZW1fY29kZTsKKwlpbnQgbWVtX3NpemUgPSBnZXRfc3lzdGVtX21lbV9zaXplKCkgPj4gMjA7CisKKwkvKiBDbGVhciB0aGUgR2xvYmFsIDIgUmVnaXN0ZXIsIFBDSSBJbnRhIE91dHB1dCBFbmFibGUgUmVnaXN0ZXJzCisJICAgQml0IDE6RW5hYmxlIERBQyBQb3dlcmRvd24KKwkgIC0+IDA6REFDcyBhcmUgZW5hYmxlZCBhbmQgYXJlIHdvcmtpbmcgbm9ybWFsbHkKKwkgICAgIDE6REFDcyBhcmUgcG93ZXJkb3duCisJICAgQml0IDA6RW5hYmxlIG9mIFBDSSBpbnRhIG91dHB1dAorCSAgLT4gMCA9IERpc2FibGUgUENJIGludGEgb3V0cHV0CisJICAgICAxID0gRW5hYmxlIFBDSSBpbnRhIG91dHB1dAorCSovCisJUE5YODU1MF9HTEIyX0VOQUJfSU5UQV9PID0gMDsKKworCS8qIENhbGMgdGhlIFBDSSBtZW0gc2l6ZSBjb2RlICovCisJaWYgKG1lbV9zaXplID49IDEyOCkKKwkJcGNpX21lbV9jb2RlID0gU0laRV8xMjhNOworCWVsc2UgaWYgKG1lbV9zaXplID49IDY0KQorCQlwY2lfbWVtX2NvZGUgPSBTSVpFXzY0TTsKKwllbHNlIGlmIChtZW1fc2l6ZSA+PSAzMikKKwkJcGNpX21lbV9jb2RlID0gU0laRV8zMk07CisJZWxzZQorCQlwY2lfbWVtX2NvZGUgPSBTSVpFXzE2TTsKKworCS8qIFNldCBQQ0lfWElPIHJlZ2lzdGVycyAqLworCW91dGwocGNpX21lbV9yZXNvdXJjZS5zdGFydCwgUENJX0JBU0UgfCBQQ0lfQkFTRTFfTE8pOworCW91dGwocGNpX21lbV9yZXNvdXJjZS5lbmQgKyAxLCBQQ0lfQkFTRSB8IFBDSV9CQVNFMV9ISSk7CisJb3V0bChwY2lfaW9fcmVzb3VyY2Uuc3RhcnQsIFBDSV9CQVNFIHwgUENJX0JBU0UyX0xPKTsKKwlvdXRsKHBjaV9pb19yZXNvdXJjZS5lbmQsIFBDSV9CQVNFIHwgUENJX0JBU0UyX0hJKTsKKworCS8qIFNlbmQgbWVtb3J5IHRyYW5zYWN0aW9uIHZpYSBQQ0lfQkFTRTIgKi8KKwlvdXRsKDB4MDAwMDAwMDEsIFBDSV9CQVNFIHwgUENJX0lPKTsKKworCS8qIFVubG9jayB0aGUgc2V0dXAgcmVnaXN0ZXIgKi8KKwlvdXRsKDB4Y2EsIFBDSV9CQVNFIHwgUENJX1VOTE9DS1JFRyk7CisKKwkvKgorCSAqIEJBUjAgb2YgUE5YODU1MCAocGNpIGJhc2UgMTApIG11c3QgYmUgemVybyBpbiBvcmRlciBmb3IgaWRlCisJICogdG8gd29yaywgYW5kIGluIG9yZGVyIGZvciBidXNfdG9fYmFkZHIgdG8gd29yayB3aXRob3V0IGFueQorCSAqIGhhY2tzLgorCSAqLworCW91dGwoMHgwMDAwMDAwMCwgUENJX0JBU0UgfCBQQ0lfQkFTRTEwKTsKKworCS8qCisJICpUaGVzZSB0d28gYmFycyBhcmUgc2V0IGJ5IGRlZmF1bHQgb3IgdGhlIGJvb3QgY29kZS4KKwkgKiBIb3dldmVyLCBpdCdzIHNhZmVyIHRvIHNldCB0aGVtIGhlcmUgc28gd2UncmUgbm90IGJvb3QKKwkgKiBjb2RlIGRlcGVuZGVudC4KKwkgKi8KKwlvdXRsKDB4MWJlMDAwMDAsIFBDSV9CQVNFIHwgUENJX0JBU0UxNCk7ICAvKiBQTlggTU1JTyAqLworCW91dGwoUE5YODU1MF9OQU5EX0JBU0VfQUREUiwgUENJX0JBU0UgfCBQQ0lfQkFTRTE4KTsgIC8qIFhJTyAgICAgICovCisKKwlvdXRsKFBDSV9FTl9UQSB8CisJICAgICBQQ0lfRU5fUENJMk1NSSB8CisJICAgICBQQ0lfRU5fWElPIHwKKwkgICAgIFBDSV9TRVRVUF9CQVNFMThfU0laRShTSVpFXzMyTSkgfAorCSAgICAgUENJX1NFVFVQX0JBU0UxOF9FTiB8CisJICAgICBQQ0lfU0VUVVBfQkFTRTE0X0VOIHwKKwkgICAgIFBDSV9TRVRVUF9CQVNFMTBfUFJFRiB8CisJICAgICBQQ0lfU0VUVVBfQkFTRTEwX1NJWkUocGNpX21lbV9jb2RlKSB8CisJICAgICBQQ0lfU0VUVVBfQ0ZHTUFOQUdFX0VOIHwKKwkgICAgIFBDSV9TRVRVUF9QQ0lBUkJfRU4sCisJICAgICBQQ0lfQkFTRSB8CisJICAgICBQQ0lfU0VUVVApOwkvKiBQQ0lfU0VUVVAgKi8KKwlvdXRsKDB4MDAwMDAwMDAsIFBDSV9CQVNFIHwgUENJX0NUUkwpOwkvKiBQQ0lfQ09OVFJPTCAqLworCisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJnBueDg1NTBfY29udHJvbGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChwbng4NTUwX3BjaV9zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vcGxhdGZvcm0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9wbGF0Zm9ybS5jCnJlbmFtZSB0byBhcmNoL21pcHMvcG54ODU1MC9jb21tb24vcGxhdGZvcm0uYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9wcm9jLmMgYi9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vcHJvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL3Byb2MuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Byb2MuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9wcm9tLmMgYi9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vcHJvbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL3Byb20uYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Byb20uYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9yZXNldC5jIGIvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Jlc2V0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ueHAvcG54ODU1MC9jb21tb24vcmVzZXQuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Jlc2V0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbng4NTUwL2NvbW1vbi9zZXR1cC5jIGIvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyNDZjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wbng4NTUwL2NvbW1vbi9zZXR1cC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICoKKyAqIDIuNiBwb3J0LCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYworICoKKyAqICBCYXNlZCBvbiBQZXIgSGFsbHNtYXJrLCBwZXIuaGFsbHNtYXJrQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcG54OHh4eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisKKyNpbmNsdWRlIDxnbGIuaD4KKyNpbmNsdWRlIDxpbnQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDx1YXJ0Lmg+CisjaW5jbHVkZSA8bmFuZC5oPgorCitleHRlcm4gdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCk7CitleHRlcm4gdm9pZCBwbng4NTUwX21hY2hpbmVfcmVzdGFydChjaGFyICopOworZXh0ZXJuIHZvaWQgcG54ODU1MF9tYWNoaW5lX2hhbHQodm9pZCk7CitleHRlcm4gdm9pZCBwbng4NTUwX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpOworZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBpb3BvcnRfcmVzb3VyY2U7CitleHRlcm4gc3RydWN0IHJlc291cmNlIGlvbWVtX3Jlc291cmNlOworZXh0ZXJuIGNoYXIgKnByb21fZ2V0Y21kbGluZSh2b2lkKTsKKworc3RydWN0IHJlc291cmNlIHN0YW5kYXJkX2lvX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwMCwKKwkJLmVuZAk9IDB4MWYsCisJCS5uYW1lCT0gImRtYTEiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKKwl9LCB7CisJCS5zdGFydAk9IDB4NDAsCisJCS5lbmQJPSAweDVmLAorCQkubmFtZQk9ICJ0aW1lciIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQorCX0sIHsKKwkJLnN0YXJ0CT0gMHg4MCwKKwkJLmVuZAk9IDB4OGYsCisJCS5uYW1lCT0gImRtYSBwYWdlIHJlZyIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQorCX0sIHsKKwkJLnN0YXJ0CT0gMHhjMCwKKwkJLmVuZAk9IDB4ZGYsCisJCS5uYW1lCT0gImRtYTIiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKKwl9LAorfTsKKworI2RlZmluZSBTVEFOREFSRF9JT19SRVNPVVJDRVMgQVJSQVlfU0laRShzdGFuZGFyZF9pb19yZXNvdXJjZXMpCisKK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgcGNpX2lvX3Jlc291cmNlOworZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBwY2lfbWVtX3Jlc291cmNlOworCisvKiBSZXR1cm4gdGhlIHRvdGFsIHNpemUgb2YgRFJBTS1tZW1vcnksIChSQU5LMCArIFJBTksxKSAqLwordW5zaWduZWQgbG9uZyBnZXRfc3lzdGVtX21lbV9zaXplKHZvaWQpCit7CisJLyogUmVhZCBJUDIwMzFfUkFOSzBfQUREUl9MTyAqLworCXVuc2lnbmVkIGxvbmcgZHJhbV9yMF9sbyA9IGlubChQQ0lfQkFTRSB8IDB4NjUwMTApOworCS8qIFJlYWQgSVAyMDMxX1JBTksxX0FERFJfSEkgKi8KKwl1bnNpZ25lZCBsb25nIGRyYW1fcjFfaGkgPSBpbmwoUENJX0JBU0UgfCAweDY1MDE4KTsKKworCXJldHVybiBkcmFtX3IxX2hpIC0gZHJhbV9yMF9sbyArIDE7Cit9CisKK2ludCBwbng4NTUwX2NvbnNvbGVfcG9ydCA9IC0xOworCit2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQoreworCWludCBpOworCWNoYXIqIGFyZ3B0cjsKKworCWJvYXJkX3NldHVwKCk7ICAvKiBib2FyZCBzcGVjaWZpYyBzZXR1cCAqLworCisgICAgICAgIF9tYWNoaW5lX3Jlc3RhcnQgPSBwbng4NTUwX21hY2hpbmVfcmVzdGFydDsKKyAgICAgICAgX21hY2hpbmVfaGFsdCA9IHBueDg1NTBfbWFjaGluZV9oYWx0OworICAgICAgICBwbV9wb3dlcl9vZmYgPSBwbng4NTUwX21hY2hpbmVfcG93ZXJfb2ZmOworCisJLyogQ2xlYXIgdGhlIEdsb2JhbCAyIFJlZ2lzdGVyLCBQQ0kgSW50YSBPdXRwdXQgRW5hYmxlIFJlZ2lzdGVycworCSAgIEJpdCAxOkVuYWJsZSBEQUMgUG93ZXJkb3duCisJICAtPiAwOkRBQ3MgYXJlIGVuYWJsZWQgYW5kIGFyZSB3b3JraW5nIG5vcm1hbGx5CisJICAgICAxOkRBQ3MgYXJlIHBvd2VyZG93bgorCSAgIEJpdCAwOkVuYWJsZSBvZiBQQ0kgaW50YSBvdXRwdXQKKwkgIC0+IDAgPSBEaXNhYmxlIFBDSSBpbnRhIG91dHB1dAorCSAgICAgMSA9IEVuYWJsZSBQQ0kgaW50YSBvdXRwdXQKKwkqLworCVBOWDg1NTBfR0xCMl9FTkFCX0lOVEFfTyA9IDA7CisKKwkvKiBJTy9NRU0gcmVzb3VyY2VzLiAqLworCXNldF9pb19wb3J0X2Jhc2UoUE5YODU1MF9QT1JUX0JBU0UpOworCWlvcG9ydF9yZXNvdXJjZS5zdGFydCA9IDA7CisJaW9wb3J0X3Jlc291cmNlLmVuZCA9IH4wOworCWlvbWVtX3Jlc291cmNlLnN0YXJ0ID0gMDsKKwlpb21lbV9yZXNvdXJjZS5lbmQgPSB+MDsKKworCS8qIFJlcXVlc3QgSS9PIHNwYWNlIGZvciBkZXZpY2VzIG9uIHRoaXMgYm9hcmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBTkRBUkRfSU9fUkVTT1VSQ0VTOyBpKyspCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgc3RhbmRhcmRfaW9fcmVzb3VyY2VzICsgaSk7CisKKwkvKiBQbGFjZSB0aGUgTW9kZSBDb250cm9sIGJpdCBmb3IgR1BJTyBwaW4gMTYgaW4gcHJpbWFyeSBmdW5jdGlvbiAqLworCS8qIFBpbiAxNiBpcyB1c2VkIGJ5IFVBUlQxLCBVQTFfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJb3V0bCgoUE5YODU1MF9HUElPX01PREVfUFJJTU9QIDw8IFBOWDg1NTBfR1BJT19NQ18xNl9CSVQpIHwKKwkJCShQTlg4NTUwX0dQSU9fTU9ERV9QUklNT1AgPDwgUE5YODU1MF9HUElPX01DXzE3X0JJVCksCisJCQlQTlg4NTUwX0dQSU9fTUMxKTsKKworCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworCWlmICgoYXJncHRyID0gc3Ryc3RyKGFyZ3B0ciwgImNvbnNvbGU9dHR5UyIpKSAhPSBOVUxMKSB7CisJCWFyZ3B0ciArPSBzdHJsZW4oImNvbnNvbGU9dHR5UyIpOworCQlwbng4NTUwX2NvbnNvbGVfcG9ydCA9ICphcmdwdHIgPT0gJzAnID8gMCA6IDE7CisKKwkJLyogV2UgbXVzdCBpbml0aWFsaXplIHRoZSBVQVJUIChjb25zb2xlKSBiZWZvcmUgZWFybHkgcHJpbnRrICovCisJCS8qIFNldCBMQ1IgdG8gOC1iaXQgYW5kIEJBVUQgdG8gMzg0MDAgKG5vIDUpICAgICAgICAgICAgICAgICovCisJCWlwMzEwNl9sY3IoVUFSVF9CQVNFLCBwbng4NTUwX2NvbnNvbGVfcG9ydCkgPQorCQkJUE5YOFhYWF9VQVJUX0xDUl84QklUOworCQlpcDMxMDZfYmF1ZChVQVJUX0JBU0UsIHBueDg1NTBfY29uc29sZV9wb3J0KSA9IDU7CisJfQorCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi90aW1lLmMgYi9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vdGltZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL3RpbWUuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3RpbWUuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDg1NTAvamJzL01ha2VmaWxlIGIvYXJjaC9taXBzL3BueDg1NTAvamJzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZGMzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG54ODU1MC9qYnMvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisKKyMgTWFrZWZpbGUgZm9yIHRoZSBOWFAgSkJTIEJvYXJkLgorCitvYmoteSA6PSBpbml0Lm8gYm9hcmRfc2V0dXAubyBpcnFtYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2picy9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL3BueDg1NTAvamJzL2JvYXJkX3NldHVwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ueHAvcG54ODU1MC9qYnMvYm9hcmRfc2V0dXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDg1NTAvamJzL2JvYXJkX3NldHVwLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9qYnMvaW5pdC5jIGIvYXJjaC9taXBzL3BueDg1NTAvamJzL2luaXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL254cC9wbng4NTUwL2picy9pbml0LmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9wbng4NTUwL2picy9pbml0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9qYnMvaXJxbWFwLmMgYi9hcmNoL21pcHMvcG54ODU1MC9qYnMvaXJxbWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ueHAvcG54ODU1MC9qYnMvaXJxbWFwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9wbng4NTUwL2picy9pcnFtYXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDg1NTAvc3RiODEwL01ha2VmaWxlIGIvYXJjaC9taXBzL3BueDg1NTAvc3RiODEwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNGZmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG54ODU1MC9zdGI4MTAvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisKKyMgTWFrZWZpbGUgZm9yIHRoZSBOWFAgU1RCODEwIEJvYXJkLgorCitvYmoteSA6PSBwcm9tX2luaXQubyBib2FyZF9zZXR1cC5vIGlycW1hcC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbnhwL3BueDg1NTAvc3RiODEwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvcG54ODU1MC9zdGI4MTAvYm9hcmRfc2V0dXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL254cC9wbng4NTUwL3N0YjgxMC9ib2FyZF9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL21pcHMvcG54ODU1MC9zdGI4MTAvYm9hcmRfc2V0dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL3N0YjgxMC9pcnFtYXAuYyBiL2FyY2gvbWlwcy9wbng4NTUwL3N0YjgxMC9pcnFtYXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL254cC9wbng4NTUwL3N0YjgxMC9pcnFtYXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3BueDg1NTAvc3RiODEwL2lycW1hcC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbnhwL3BueDg1NTAvc3RiODEwL3Byb21faW5pdC5jIGIvYXJjaC9taXBzL3BueDg1NTAvc3RiODEwL3Byb21faW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvbnhwL3BueDg1NTAvc3RiODEwL3Byb21faW5pdC5jCnJlbmFtZSB0byBhcmNoL21pcHMvcG54ODU1MC9zdGI4MTAvcHJvbV9pbml0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L01ha2VmaWxlIGIvYXJjaC9taXBzL3Bvd2VydHYvTWFrZWZpbGUKaW5kZXggMGEwZDczYy4uYmFmNmU5MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3Bvd2VydHYvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvTWFrZWZpbGUKQEAgLTIzLDYgKzIzLDkgQEAKICMgdW5kZXIgTGludXguCiAjCiAKLW9iai15ICs9IGluaXQubyBtZW1vcnkubyByZXNldC5vIHRpbWUubyBwb3dlcnR2X3NldHVwLm8gYXNpYy8gcGNpLworb2JqLXkgKz0gaW5pdC5vIGlvcmVtYXAubyBtZW1vcnkubyBwb3dlcnR2X3NldHVwLm8gcmVzZXQubyB0aW1lLm8gXAorCWFzaWMvIHBjaS8KIAotRVhUUkFfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKK29iai0kKENPTkZJR19VU0IpICs9IHBvd2VydHYtdXNiLm8KKworRVhUUkFfQ0ZMQUdTICs9IC1XYWxsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9wb3dlcnR2L1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjVhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG93ZXJ0di9QbGF0Zm9ybQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgQ2lzY28gUG93ZXJUViBQbGF0Zm9ybQorIworcGxhdGZvcm0tJChDT05GSUdfUE9XRVJUVikJKz0gcG93ZXJ0di8KK2NmbGFncy0kKENPTkZJR19QT1dFUlRWKQkrPQkJCQkJXAorCQktSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0dgorbG9hZC0kKENPTkZJR19QT1dFUlRWKQkJKz0gMHhmZmZmZmZmZjkwODAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL01ha2VmaWxlIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9NYWtlZmlsZQppbmRleCBiZWJmZGNmLi5mMGU5NWRjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvTWFrZWZpbGUKQEAgLTE2LDggKzE2LDggQEAKICMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICMKIAotb2JqLXkgKz0gYXNpYy1jYWxsaW9wZS5vIGFzaWMtY3JvbnVzLm8gYXNpYy16ZXVzLm8gYXNpY19kZXZpY2VzLm8gYXNpY19pbnQubyBcCi0JIGlycV9hc2ljLm8gcHJlYWxsb2MtY2FsbGlvcGUubyBwcmVhbGxvYy1jcm9udXMubyBcCi0JIHByZWFsbG9jLWNyb251c2xpdGUubyBwcmVhbGxvYy16ZXVzLm8KK29iai15ICs9IGFzaWMtY2FsbGlvcGUubyBhc2ljLWNyb251cy5vIGFzaWMtZ2FpYS5vIGFzaWMtemV1cy5vIFwKKwlhc2ljX2RldmljZXMubyBhc2ljX2ludC5vIGlycV9hc2ljLm8gcHJlYWxsb2MtY2FsbGlvcGUubyBcCisJcHJlYWxsb2MtY3JvbnVzLm8gcHJlYWxsb2MtY3JvbnVzbGl0ZS5vIHByZWFsbG9jLWdhaWEubyBwcmVhbGxvYy16ZXVzLm8KIAogRVhUUkFfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpYy1jYWxsaW9wZS5jIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWNhbGxpb3BlLmMKaW5kZXggMWFlNjYyMy4uMGExNzBlMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWNhbGxpb3BlLmMKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWNhbGxpb3BlLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkuaW50X2RvY3Npc19lbiA9IHsucGh5cyA9IENBTExJT1BFX0FERFIoMHhBMDI4RjQpfSwKIAogCS5taXBzX3BsbF9zZXR1cCA9IHsucGh5cyA9IENBTExJT1BFX0FERFIoMHg5ODAwMDApfSwKLQkudXNiX2ZzID0gey5waHlzID0gQ0FMTElPUEVfQUREUigweDk4MDAzMCl9LAorCS5mczQzMng0YjRfdXNiX2N0bCA9IHsucGh5cyA9IENBTExJT1BFX0FERFIoMHg5ODAwMzApfSwKIAkudGVzdF9idXMgPSB7LnBoeXMgPSBDQUxMSU9QRV9BRERSKDB4OTgwMENDKX0sCiAJLmNydF9zcGFyZSA9IHsucGh5cyA9IENBTExJT1BFX0FERFIoMHg5ODAwZDQpfSwKIAkudXNiMl9vaGNpX2ludF9tYXNrID0gey5waHlzID0gQ0FMTElPUEVfQUREUigweDlBMDAwYyl9LApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWNyb251cy5jIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWNyb251cy5jCmluZGV4IDViYjY0YmYuLmJiYzBjMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpYy1jcm9udXMuYworKysgYi9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWMtY3JvbnVzLmMKQEAgLTc3LDEzICs3NywxMyBAQAogCS5pbnRfZG9jc2lzX2VuID0gey5waHlzID0gQ1JPTlVTX0FERFIoMHgyQTI4RjQpfSwKIAogCS5taXBzX3BsbF9zZXR1cCA9IHsucGh5cyA9IENST05VU19BRERSKDB4MUMwMDAwKX0sCi0JLnVzYl9mcyA9IHsucGh5cyA9IENST05VU19BRERSKDB4MUMwMDE4KX0sCisJLmZzNDMyeDRiNF91c2JfY3RsID0gey5waHlzID0gQ1JPTlVTX0FERFIoMHgxQzAwMjgpfSwKIAkudGVzdF9idXMgPSB7LnBoeXMgPSBDUk9OVVNfQUREUigweDFDMDBDQyl9LAogCS5jcnRfc3BhcmUgPSB7LnBoeXMgPSBDUk9OVVNfQUREUigweDFjMDBkNCl9LAogCS51c2IyX29oY2lfaW50X21hc2sgPSB7LnBoeXMgPSBDUk9OVVNfQUREUigweDIwMDAwQyl9LAogCS51c2IyX3N0cmFwID0gey5waHlzID0gQ1JPTlVTX0FERFIoMHgyMDAwMTQpfSwKIAkuZWhjaV9oY2FwYmFzZSA9IHsucGh5cyA9IENST05VU19BRERSKDB4MjFGRTAwKX0sCi0JLm9oY2lfaGNfcmV2aXNpb24gPSB7LnBoeXMgPSBDUk9OVVNfQUREUigweDFFMDAwMCl9LAorCS5vaGNpX2hjX3JldmlzaW9uID0gey5waHlzID0gQ1JPTlVTX0FERFIoMHgyMWZjMDApfSwKIAkuYmNtMV9ic19sbWlfc3RlZXIgPSB7LnBoeXMgPSBDUk9OVVNfQUREUigweDJFMDAwOCl9LAogCS51c2IyX2NvbnRyb2wgPSB7LnBoeXMgPSBDUk9OVVNfQUREUigweDJFMDA0Qyl9LAogCS51c2IyX3N0YnVzX29iYyA9IHsucGh5cyA9IENST05VU19BRERSKDB4MjFGRjAwKX0sCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWMtZ2FpYS5jIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWdhaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWRkYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljLWdhaWEuYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogTG9jYXRpb25zIG9mIGRldmljZXMgaW4gdGhlIEdhaWEgQVNJQworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFNjaWVudGlmaWMtQXRsYW50YSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKgorICogQXV0aG9yOiAgICAgICBEYXZpZCBWb21MZWhuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1wb3dlcnR2L2FzaWMuaD4KKworY29uc3Qgc3RydWN0IHJlZ2lzdGVyX21hcCBnYWlhX3JlZ2lzdGVyX21hcCBfX2luaXRkYXRhID0geworCS5laWNfc2xvdzBfc3RydF9hZGQgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDAwMDAwMH0sCisJLmVpY19jZmdfYml0cyA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MDAwMDM4fSwKKwkuZWljX3JlYWR5X3N0YXR1cyA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MDAwMDRDfSwKKworCS5jaGlwdmVyMyA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkEwODAwfSwKKwkuY2hpcHZlcjIgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMDgwNH0sCisJLmNoaXB2ZXIxID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTA4MDh9LAorCS5jaGlwdmVyMCA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkEwODBDfSwKKworCS8qIFRoZSByZWdpc3RlcnMgb2YgSVJCbGFzdGVyICovCisJLnVhcnQxX2ludHN0YXQgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMTgwMH0sCisJLnVhcnQxX2ludGVuID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTE4MDR9LAorCS51YXJ0MV9jb25maWcxID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTE4MDh9LAorCS51YXJ0MV9jb25maWcyID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTE4MEN9LAorCS51YXJ0MV9kaXZpc29yaGkgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMTgxMH0sCisJLnVhcnQxX2Rpdmlzb3JsbyA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkExODE0fSwKKwkudWFydDFfZGF0YSA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkExODE4fSwKKwkudWFydDFfc3RhdHVzID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTE4MUN9LAorCisJLmludF9zdGF0XzMgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMjgwMH0sCisJLmludF9zdGF0XzIgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMjgwNH0sCisJLmludF9zdGF0XzEgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMjgwOH0sCisJLmludF9zdGF0XzAgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMjgwQ30sCisJLmludF9jb25maWcgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMjgxMH0sCisJLmludF9pbnRfc2NhbiA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkEyODE4fSwKKwkuaWVuX2ludF8zID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4MzB9LAorCS5pZW5faW50XzIgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMjgzNH0sCisJLmllbl9pbnRfMSA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkEyODM4fSwKKwkuaWVuX2ludF8wID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4M0N9LAorCS5pbnRfbGV2ZWxfM18zID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4ODB9LAorCS5pbnRfbGV2ZWxfM18yID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4ODR9LAorCS5pbnRfbGV2ZWxfM18xID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4ODh9LAorCS5pbnRfbGV2ZWxfM18wID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4OEN9LAorCS5pbnRfbGV2ZWxfMl8zID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4OTB9LAorCS5pbnRfbGV2ZWxfMl8yID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4OTR9LAorCS5pbnRfbGV2ZWxfMl8xID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4OTh9LAorCS5pbnRfbGV2ZWxfMl8wID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4OUN9LAorCS5pbnRfbGV2ZWxfMV8zID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QTB9LAorCS5pbnRfbGV2ZWxfMV8yID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QTR9LAorCS5pbnRfbGV2ZWxfMV8xID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QTh9LAorCS5pbnRfbGV2ZWxfMV8wID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QUN9LAorCS5pbnRfbGV2ZWxfMF8zID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QjB9LAorCS5pbnRfbGV2ZWxfMF8yID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QjR9LAorCS5pbnRfbGV2ZWxfMF8xID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4Qjh9LAorCS5pbnRfbGV2ZWxfMF8wID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4QkN9LAorCS5pbnRfZG9jc2lzX2VuID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTI4RjR9LAorCisJLm1pcHNfcGxsX3NldHVwID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgxQzAwMDB9LAorCS5mczQzMng0YjRfdXNiX2N0bCA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MUMwMDI0fSwKKwkudGVzdF9idXMgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDFDMDBDQ30sCisJLmNydF9zcGFyZSA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MWMwMTA4fSwKKwkudXNiMl9vaGNpX2ludF9tYXNrID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyMDAwMEN9LAorCS51c2IyX3N0cmFwID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyMDAwMTR9LAorCS5laGNpX2hjYXBiYXNlID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyMUZFMDB9LAorCS5vaGNpX2hjX3JldmlzaW9uID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyMWZjMDB9LAorCS5iY20xX2JzX2xtaV9zdGVlciA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkUwMDA0fSwKKwkudXNiMl9jb250cm9sID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyRTAwNEN9LAorCS51c2IyX3N0YnVzX29iYyA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MjFGRjAwfSwKKwkudXNiMl9zdGJ1c19tZXNzX3NpemUgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDIxRkYwNH0sCisJLnVzYjJfc3RidXNfY2h1bmtfc2l6ZSA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MjFGRjA4fSwKKworCS5wY2llX3JlZ3MgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDIyMDAwMH0sCisJLnRpbV9jaCA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkEyQzEwfSwKKwkudGltX2NsID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTJDMTR9LAorCS5ncGlvX2RvdXQgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMkMyMH0sCisJLmdwaW9fZGluID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTJDMjR9LAorCS5ncGlvX2RpciA9IHsucGh5cyA9IEdBSUFfSU9fQkFTRSArIDB4MkEyQzJDfSwKKwkud2F0Y2hkb2cgPSB7LnBoeXMgPSBHQUlBX0lPX0JBU0UgKyAweDJBMkMzMH0sCisJLmZyb250X3BhbmVsID0gey5waHlzID0gR0FJQV9JT19CQVNFICsgMHgyQTM4MDB9LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpYy16ZXVzLmMgYi9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWMtemV1cy5jCmluZGV4IDA5NWNiZTEwLi40YTA1YmIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWMtemV1cy5jCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpYy16ZXVzLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkuaW50X2RvY3Npc19lbiA9IHsucGh5cyA9IFpFVVNfQUREUigweDI4MjhGNCl9LAogCiAJLm1pcHNfcGxsX3NldHVwID0gey5waHlzID0gWkVVU19BRERSKDB4MWEwMDAwKX0sCi0JLnVzYl9mcyA9IHsucGh5cyA9IFpFVVNfQUREUigweDFhMDAxOCl9LAorCS5mczQzMng0YjRfdXNiX2N0bCA9IHsucGh5cyA9IFpFVVNfQUREUigweDFhMDAxOCl9LAogCS50ZXN0X2J1cyA9IHsucGh5cyA9IFpFVVNfQUREUigweDFhMDIzOCl9LAogCS5jcnRfc3BhcmUgPSB7LnBoeXMgPSBaRVVTX0FERFIoMHgxYTAwOTApfSwKIAkudXNiMl9vaGNpX2ludF9tYXNrID0gey5waHlzID0gWkVVU19BRERSKDB4MWUwMDBjKX0sCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWNfZGV2aWNlcy5jIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljX2RldmljZXMuYwppbmRleCA5ZWM1MjNlLi5lNTZmYTYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWNfZGV2aWNlcy5jCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpY19kZXZpY2VzLmMKQEAgLTEsNyArMSw2IEBACiAvKgotICogICAgICAgICAgICAgICAgICAgQVNJQyBEZXZpY2UgTGlzdCBJbnRpYWxpemF0aW9uCiAgKgotICogRGVzY3JpcHRpb246ICBEZWZpbmVzIHRoZSBwbGF0Zm9ybSByZXNvdXJjZXMgZm9yIHRoZSBTQSBzZXR0b3AuCisgKiBEZXNjcmlwdGlvbjogIERlZmluZXMgdGhlIHBsYXRmb3JtIHJlc291cmNlcyBmb3IgR2FpYS1iYXNlZCBzZXR0b3BzLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFNjaWVudGlmaWMtQXRsYW50YSwgSW5jLgogICoKQEAgLTE5LDExICsxOCw2IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKgotICogQXV0aG9yOiAgICAgICBLZW4gRXBwaW5ldHQKLSAqICAgICAgICAgICAgICAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0gKgotICogRGVzY3JpcHRpb246ICBEZWZpbmVzIHRoZSBwbGF0Zm9ybSByZXNvdXJjZXMgZm9yIHRoZSBTQSBzZXR0b3AuCi0gKgogICogTk9URTogVGhlIGJvb3Rsb2FkZXIgYWxsb2NhdGVzIHBlcnNpc3RlbnQgbWVtb3J5IGF0IGFuIGFkZHJlc3Mgd2hpY2ggaXMKICAqIDE2IE1pQiBiZWxvdyB0aGUgZW5kIG9mIHRoZSBoaWdoZXN0IGFkZHJlc3MgaW4gS1NFRzAuIEFsbCBmaXhlZAogICogYWRkcmVzcyBtZW1vcnkgcmVzZXJ2YXRpb25zIG11c3QgYXZvaWQgdGhpcyByZWdpb24uCkBAIC0zOSw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CkBAIC03NCwxNCArNjcsMTMgQEAKIHVuc2lnbmVkIGxvbmcgYXNpY19iYXNlOwogRVhQT1JUX1NZTUJPTChhc2ljX2Jhc2UpOwkJCS8qIEV4cG9ydGVkIGZvciB0ZXN0aW5nICovCiBzdHJ1Y3QgcmVzb3VyY2UgKmdwX3Jlc291cmNlczsKLXN0YXRpYyBib29sIHVzYl9jb25maWd1cmVkOwogCiAvKgogICogRG9uJ3QgcmVjb21tZW5kIHRvIHVzZSBpdCBkaXJlY3RseSwgaXQgaXMgdXN1YWxseSB1c2VkIGJ5IGtlcm5lbCBpbnRlcm5hbGx5LgogICogUG9ydGFibGUgY29kZSBzaG91bGQgYmUgdXNpbmcgaW50ZXJmYWNlcyBzdWNoIGFzIGlvcmVtcCwgZG1hX21hcF9zaW5nbGUsIGV0Yy4KICAqLwotdW5zaWduZWQgbG9uZyBwaHlzX3RvX2J1c19vZmZzZXQ7Ci1FWFBPUlRfU1lNQk9MKHBoeXNfdG9fYnVzX29mZnNldCk7Cit1bnNpZ25lZCBsb25nIHBoeXNfdG9fZG1hX29mZnNldDsKK0VYUE9SVF9TWU1CT0wocGh5c190b19kbWFfb2Zmc2V0KTsKIAogLyoKICAqCkBAIC05NywxMDEgKzg5LDE5IEBACiB9OwogCiAvKgotICoKLSAqIFVTQiBIb3N0IFJlc291cmNlIERlZmluaXRpb24KLSAqCi0gKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlaGNpX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnBhcmVudCA9ICZhc2ljX3Jlc291cmNlLAotCQkuc3RhcnQgID0gMCwKLQkJLmVuZCAgICA9IDB4ZmYsCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLnN0YXJ0ICA9IGlycV91c2JlaGNpLAotCQkuZW5kICAgID0gaXJxX3VzYmVoY2ksCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHU2NCBlaGNpX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlaGNpX2RldmljZSA9IHsKLQkubmFtZSA9ICJwb3dlcnR2LWVoY2kiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSAyLAotCS5yZXNvdXJjZSA9IGVoY2lfcmVzb3VyY2VzLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzayA9ICZlaGNpX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb2hjaV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5wYXJlbnQgPSAmYXNpY19yZXNvdXJjZSwKLQkJLnN0YXJ0ICA9IDAsCi0JCS5lbmQgICAgPSAweGZmLAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydCAgPSBpcnFfdXNib2hjaSwKLQkJLmVuZCAgICA9IGlycV91c2JvaGNpLAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb2hjaV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAicG93ZXJ0di1vaGNpIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gMiwKLQkucmVzb3VyY2UgPSBvaGNpX3Jlc291cmNlcywKLQkuZGV2ID0gewotCQkuZG1hX21hc2sgPSAmb2hjaV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdID0gewotCSZlaGNpX2RldmljZSwKLQkmb2hjaV9kZXZpY2UsCi19OwotCi0vKgotICoKLSAqIFBsYXRmb3JtIENvbmZpZ3VyYXRpb24gYW5kIERldmljZSBJbml0aWFsaXphdGlvbgotICoKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGZzX3VwZGF0ZShpbnQgcGUsIGludCBtZCwgaW50IHNkaXYsIGludCBkaXNhYmxlX2Rpdl9ieV8zKQotewotCWludCBlbl9wcmcsIGJ5cCwgcHdyLCBuc2IsIHZhbDsKLQlpbnQgc291dDsKLQotCXNvdXQgPSAxOwotCWVuX3ByZyA9IDE7Ci0JYnlwID0gMDsKLQluc2IgPSAxOwotCXB3ciA9IDE7Ci0KLQl2YWwgPSAoKHNkaXYgPDwgMjkpIHwgKG1kIDw8IDI0KSB8IChwZTw8OCkgfCAoc291dDw8MykgfCAoYnlwPDwyKSB8Ci0JCShuc2I8PDEpIHwgKGRpc2FibGVfZGl2X2J5XzM8PDUpKTsKLQotCWFzaWNfd3JpdGUodmFsLCB1c2JfZnMpOwotCWFzaWNfd3JpdGUodmFsIHwgKGVuX3ByZzw8NCksIHVzYl9mcyk7Ci0JYXNpY193cml0ZSh2YWwgfCAoZW5fcHJnPDw0KSB8IHB3ciwgdXNiX2ZzKTsKLX0KLQotLyoKICAqIEFsbG93IG92ZXJyaWRlIG9mIGJvb3Rsb2FkZXItc3BlY2lmaWVkIG1vZGVsCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvbiBmYWlsdXJlLiAgVGhpcyBwYXJhbWV0ZXIKKyAqIGFsbG93cyBvdmVycmlkaW5nIG9mIHRoZSBib290bG9hZGVyLXNwZWNpZmllZCBtb2RlbC4KICAqLwogc3RhdGljIGNoYXIgX19pbml0ZGF0YSBjbWRsaW5lW0NPTU1BTkRfTElORV9TSVpFXTsKIAogI2RlZmluZQlGT1JDRUZBTUlMWV9QQVJBTQkiZm9yY2VmYW1pbHkiCiAKKy8qCisgKiBjaGVja19mb3JjZWZhbWlseSAtIGNoZWNrIGZvciwgYW5kIHBhcnNlLCBmb3JjZWZhbWlseSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCisgKiBAZm9yY2VkX2ZhbWlseToJUG9pbnRlciB0byB0d28tY2hhcmFjdGVyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZQorICoJCQl2YWx1ZSBvZiB0aGUgZm9yY2VkZmFtaWx5IHBhcmFtZXRlciwgaWYgYW55LgorICovCiBzdGF0aWMgX19pbml0IGludCBjaGVja19mb3JjZWZhbWlseSh1bnNpZ25lZCBjaGFyIGZvcmNlZF9mYW1pbHlbMl0pCiB7CiAJY29uc3QgY2hhciAqcDsKQEAgLTIzMSwxNCArMTQxLDEwIEBACiAgKi8KIHN0YXRpYyBfX2luaXQgbm9pbmxpbmUgdm9pZCBwbGF0Zm9ybV9zZXRfZmFtaWx5KHZvaWQpCiB7Ci0jZGVmaW5lIEJPT1RMRFJGQU1JTFkoYnl0ZTEsIGJ5dGUwKSAoKChieXRlMSkgPDwgOCkgfCAoYnl0ZTApKQotCiAJdW5zaWduZWQgY2hhciBmb3JjZWRfZmFtaWx5WzJdOwogCXVuc2lnbmVkIHNob3J0IGJvb3RsZHJfZmFtaWx5OwogCi0JY2hlY2tfZm9yY2VmYW1pbHkoZm9yY2VkX2ZhbWlseSk7Ci0KLQlpZiAoZm9yY2VkX2ZhbWlseVswXSAhPSAnXDAnICYmIGZvcmNlZF9mYW1pbHlbMV0gIT0gJ1wwJykKKwlpZiAoY2hlY2tfZm9yY2VmYW1pbHkoZm9yY2VkX2ZhbWlseSkgPT0gMCkKIAkJYm9vdGxkcl9mYW1pbHkgPSBCT09UTERSRkFNSUxZKGZvcmNlZF9mYW1pbHlbMF0sCiAJCQlmb3JjZWRfZmFtaWx5WzFdKTsKIAllbHNlIHsKQEAgLTI4OSw2ICsxOTUsOSBAQAogCWNhc2UgQk9PVExEUkZBTUlMWSgnRicsICcxJyk6CiAJCXBsYXRmb3JtX2ZhbWlseSA9IEZBTUlMWV8xNTAwVlpGOwogCQlicmVhazsKKwljYXNlIEJPT1RMRFJGQU1JTFkoJzgnLCAnNycpOgorCQlwbGF0Zm9ybV9mYW1pbHkgPSBGQU1JTFlfODcwMDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcGxhdGZvcm1fZmFtaWx5ID0gLTE7CiAJfQpAQCAtMzAxLDI0ICsyMTAsOSBAQAogRVhQT1JUX1NZTUJPTChwbGF0Zm9ybV9nZXRfZmFtaWx5KTsKIAogLyoKLSAqIFxicmllZiB1c2JfZXllX2NvbmZpZ3VyZSgpIGZvciBvcHRpbWl6aW5nIHRoZSBVU0IgZXllIG9uIENhbGxpb3BlLgotICoKLSAqIFxwYXJhbSAgICAgdW5zaWduZWQgaW50IHZhbHVlIHNhdmVkIHRvIHRoZSByZWdpc3Rlci4KLSAqCi0gKiBccmV0dXJuICAgIG5vbmUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB1c2JfZXllX2NvbmZpZ3VyZSh1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JYXNpY193cml0ZShhc2ljX3JlYWQoY3J0X3NwYXJlKSB8IHZhbHVlLCBjcnRfc3BhcmUpOwotfQotCi0vKgogICogcGxhdGZvcm1fZ2V0X2FzaWMgLSBkZXRlcm1pbmUgdGhlIEFTSUMgdHlwZS4KICAqCi0gKiBccGFyYW0gICAgIG5vbmUKLSAqCi0gKiBccmV0dXJuICAgIEFTSUMgdHlwZTsgQVNJQ19VTktOT1dOIGlmIG5vbmUKKyAqIFJldHVybnMgdGhlIEFTSUMgdHlwZSwgb3IgQVNJQ19VTktOT1dOIGlmIHVua25vd24KICAqCiAgKi8KIGVudW0gYXNpY190eXBlIHBsYXRmb3JtX2dldF9hc2ljKHZvaWQpCkBAIC0zMjgsOTMgKzIyMiwxMCBAQAogRVhQT1JUX1NZTUJPTChwbGF0Zm9ybV9nZXRfYXNpYyk7CiAKIC8qCi0gKiBwbGF0Zm9ybV9jb25maWd1cmVfdXNiIC0gdXNiIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gcGxhdGZvcm0gdHlwZS4KLSAqIEBiY20xX3VzYjJfY3RsOgl2YWx1ZSBmb3IgdGhlIEJDTTFfVVNCMl9DVEwgcmVnaXN0ZXIsIHdoaWNoIGlzCi0gKgkJCXF1aXJreQorICogc2V0X3JlZ2lzdGVyX21hcCAtIHNldCBBU0lDIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KKyAqIEBwaHlzX2Jhc2U6CVBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJhc2Ugb2YgdGhlIEFTSUMgcmVnaXN0ZXJzCisgKiBAbWFwOglEZXNjcmlwdGlvbiBvZiBrZXkgQVNJQyByZWdpc3RlcnMKICAqLwotc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX2NvbmZpZ3VyZV91c2Iodm9pZCkKLXsKLQl1MzIgYmNtMV91c2IyX2N0bDsKLQotCWlmICh1c2JfY29uZmlndXJlZCkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChhc2ljKSB7Ci0JY2FzZSBBU0lDX1pFVVM6Ci0JY2FzZSBBU0lDX0NST05VUzoKLQljYXNlIEFTSUNfQ1JPTlVTTElURToKLQkJZnNfdXBkYXRlKDB4MDAwMCwgMHgxMSwgMHgwMiwgMCk7Ci0JCWJjbTFfdXNiMl9jdGwgPSAweDgwMzsKLQkJYnJlYWs7Ci0KLQljYXNlIEFTSUNfQ0FMTElPUEU6Ci0JCWZzX3VwZGF0ZSgweDAwMDAsIDB4MTEsIDB4MDIsIDEpOwotCi0JCXN3aXRjaCAocGxhdGZvcm1fZmFtaWx5KSB7Ci0JCWNhc2UgRkFNSUxZXzE1MDBWWkU6Ci0JCQlicmVhazsKLQotCQljYXNlIEZBTUlMWV8xNTAwVlpGOgotCQkJdXNiX2V5ZV9jb25maWd1cmUoMHgwMDNjMDAwMCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJdXNiX2V5ZV9jb25maWd1cmUoMHgwMDMwMDAwMCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWJjbTFfdXNiMl9jdGwgPSAweDgwMzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIlVua25vd24gQVNJQyB0eXBlOiAlZFxuIiwgYXNpYyk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHR1cm4gb24gVVNCIHBvd2VyICovCi0JYXNpY193cml0ZSgwLCB1c2IyX3N0cmFwKTsKLQkvKiBFbmFibGUgYWxsIE9IQ0kgaW50ZXJydXB0cyAqLwotCWFzaWNfd3JpdGUoYmNtMV91c2IyX2N0bCwgdXNiMl9jb250cm9sKTsKLQkvKiBVU0IyX1NUQlVTX09CQyBzdG9yZTMyL2xvYWQzMiAqLwotCWFzaWNfd3JpdGUoMywgdXNiMl9zdGJ1c19vYmMpOwotCS8qIFVTQjJfU1RCVVNfTUVTU19TSVpFIDIgcGFja2V0cyAqLwotCWFzaWNfd3JpdGUoMSwgdXNiMl9zdGJ1c19tZXNzX3NpemUpOwotCS8qIFVTQjJfU1RCVVNfQ0hVTktfU0laRSAyIHBhY2tldHMgKi8KLQlhc2ljX3dyaXRlKDEsIHVzYjJfc3RidXNfY2h1bmtfc2l6ZSk7Ci0KLQl1c2JfY29uZmlndXJlZCA9IHRydWU7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIFVTQiBFSENJIGludGVyZmFjZQotICovCi12b2lkIHBsYXRmb3JtX2NvbmZpZ3VyZV91c2JfZWhjaSgpCi17Ci0JcGxhdGZvcm1fY29uZmlndXJlX3VzYigpOwotfQotCi0vKgotICogU2V0IHVwIHRoZSBVU0IgT0hDSSBpbnRlcmZhY2UKLSAqLwotdm9pZCBwbGF0Zm9ybV9jb25maWd1cmVfdXNiX29oY2koKQotewotCXBsYXRmb3JtX2NvbmZpZ3VyZV91c2IoKTsKLX0KLQotLyoKLSAqIFNodXQgdGhlIFVTQiBFSENJIGludGVyZmFjZSBkb3duLS1jdXJyZW50bHkgYSBOT1AKLSAqLwotdm9pZCBwbGF0Zm9ybV91bmNvbmZpZ3VyZV91c2JfZWhjaSgpCi17Ci19Ci0KLS8qCi0gKiBTaHV0IHRoZSBVU0IgT0hDSSBpbnRlcmZhY2UgZG93bi0tY3VycmVudGx5IGEgTk9QCi0gKi8KLXZvaWQgcGxhdGZvcm1fdW5jb25maWd1cmVfdXNiX29oY2koKQotewotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3JlZ2lzdGVyX21hcCh1bnNpZ25lZCBsb25nIHBoeXNfYmFzZSwKIAljb25zdCBzdHJ1Y3QgcmVnaXN0ZXJfbWFwICptYXApCiB7CkBAIC01MjYsNiArMzM3LDE1IEBACiAJCQkiRFZSX0NBUEFCTEVcbiIpOwogCQlicmVhazsKIAorCWNhc2UgRkFNSUxZXzg3MDA6CisJCXBsYXRmb3JtX2ZlYXR1cmVzID0gRkZTX0NBUEFCTEUgfCBQQ0lFX0NBUEFCTEU7CisJCWFzaWMgPSBBU0lDX0dBSUE7CisJCXNldF9yZWdpc3Rlcl9tYXAoR0FJQV9JT19CQVNFLCAmZ2FpYV9yZWdpc3Rlcl9tYXApOworCQlncF9yZXNvdXJjZXMgPSBkdnJfZ2FpYV9yZXNvdXJjZXM7CisKKwkJcHJfaW5mbygiUGxhdGZvcm06IDg3MDAgLSBHQUlBLCBEVlJfQ0FQQUJMRVxuIik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcHJfY3JpdCgiUGxhdGZvcm06ICBVTktOT1dOIFBMQVRGT1JNXG4iKTsKIAkJYnJlYWs7CkBAIC01MzMsMTAgKzM1MywxMCBAQAogCiAJc3dpdGNoIChhc2ljKSB7CiAJY2FzZSBBU0lDX1pFVVM6Ci0JCXBoeXNfdG9fYnVzX29mZnNldCA9IDB4MzAwMDAwMDA7CisJCXBoeXNfdG9fZG1hX29mZnNldCA9IDB4MzAwMDAwMDA7CiAJCWJyZWFrOwogCWNhc2UgQVNJQ19DQUxMSU9QRToKLQkJcGh5c190b19idXNfb2Zmc2V0ID0gMHgxMDAwMDAwMDsKKwkJcGh5c190b19kbWFfb2Zmc2V0ID0gMHgxMDAwMDAwMDsKIAkJYnJlYWs7CiAJY2FzZSBBU0lDX0NST05VU0xJVEU6CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwpAQCAtNTQ2LDQyICszNjYsMTYgQEAKIAkJICogMHgyWFhYWFhYWC4gSWYgMHgxMDAwMDAwMCBhbGlhc2VzIGludG8gMHg2MDAwMDAwMC0KIAkJICogMHg2WFhYWFhYWCwgdGhlIG9mZnNldCBzaG91bGQgYmUgMHg1MDAwMDAwMCwgbm90IDB4MTAwMDAwMDAuCiAJCSAqLwotCQlwaHlzX3RvX2J1c19vZmZzZXQgPSAweDEwMDAwMDAwOworCQlwaHlzX3RvX2RtYV9vZmZzZXQgPSAweDEwMDAwMDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwaHlzX3RvX2J1c19vZmZzZXQgPSAweDAwMDAwMDAwOworCQlwaHlzX3RvX2RtYV9vZmZzZXQgPSAweDAwMDAwMDAwOwogCQlicmVhazsKIAl9CiB9CiAKLS8qKgotICogcGxhdGZvcm1fZGV2aWNlc19pbml0IC0gc2V0cyB1cCBVU0IgZGV2aWNlIHJlc291cnNlLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBwbGF0Zm9ybV9kZXZpY2VzX2luaXQodm9pZCkKLXsKLQlwcl9ub3RpY2UoIiVzOiAtLS0tLSBJbml0aWFsaXppbmcgVVNCIHJlc291cmNlcyAtLS0tLVxuIiwgX19mdW5jX18pOwotCi0JYXNpY19yZXNvdXJjZS5zdGFydCA9IGFzaWNfcGh5X2Jhc2U7Ci0JYXNpY19yZXNvdXJjZS5lbmQgKz0gYXNpY19yZXNvdXJjZS5zdGFydDsKLQotCWVoY2lfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gYXNpY19yZWdfcGh5c19hZGRyKGVoY2lfaGNhcGJhc2UpOwotCWVoY2lfcmVzb3VyY2VzWzBdLmVuZCArPSBlaGNpX3Jlc291cmNlc1swXS5zdGFydDsKLQotCW9oY2lfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gYXNpY19yZWdfcGh5c19hZGRyKG9oY2lfaGNfcmV2aXNpb24pOwotCW9oY2lfcmVzb3VyY2VzWzBdLmVuZCArPSBvaGNpX3Jlc291cmNlc1swXS5zdGFydDsKLQotCXNldF9pb19wb3J0X2Jhc2UoMCk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKLQotCXJldHVybiAwOwotfQotCi1hcmNoX2luaXRjYWxsKHBsYXRmb3JtX2RldmljZXNfaW5pdCk7Ci0KIC8qCi0gKgotICogQk9PVE1FTSBBTExPQ0FUSU9OCisgKiBSRVNPVVJDRSBBTExPQ0FUSU9OCiAgKgogICovCiAvKgpAQCAtNjAzLDcgKzM5Nyw3IEBACiAJCWludCBzaXplID0gZ3BfcmVzb3VyY2VzW2ldLmVuZCAtIGdwX3Jlc291cmNlc1tpXS5zdGFydCArIDE7CiAJCWlmICgoZ3BfcmVzb3VyY2VzW2ldLnN0YXJ0ICE9IDApICYmCiAJCQkoKGdwX3Jlc291cmNlc1tpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSAhPSAwKSkgewotCQkJcmVzZXJ2ZV9ib290bWVtKGJ1c190b19waHlzKGdwX3Jlc291cmNlc1tpXS5zdGFydCksCisJCQlyZXNlcnZlX2Jvb3RtZW0oZG1hX3RvX3BoeXMoZ3BfcmVzb3VyY2VzW2ldLnN0YXJ0KSwKIAkJCQlzaXplLCAwKTsKIAkJCXRvdGFsICs9IGdwX3Jlc291cmNlc1tpXS5lbmQgLQogCQkJCWdwX3Jlc291cmNlc1tpXS5zdGFydCArIDE7CkBAIC02MjcsNyArNDIxLDcgQEAKIAogCQkJZWxzZSB7CiAJCQkJZ3BfcmVzb3VyY2VzW2ldLnN0YXJ0ID0KLQkJCQkJcGh5c190b19idXModmlydF90b19waHlzKG1lbSkpOworCQkJCQlwaHlzX3RvX2RtYSh2aXJ0X3RvX3BoeXMobWVtKSk7CiAJCQkJZ3BfcmVzb3VyY2VzW2ldLmVuZCA9CiAJCQkJCWdwX3Jlc291cmNlc1tpXS5zdGFydCArIHNpemUgLSAxOwogCQkJCXRvdGFsICs9IHNpemU7CkBAIC02OTEsNyArNDg1LDcgQEAKIAlpZiAocmVzb3VyY2UgJiYgcG1lbWFkZHIgJiYgcG1lbWxlbikgewogCQkvKiBUaGUgYWRkcmVzcyBwcm92aWRlZCBieSBib290bG9hZGVyIGlzIGluIGtzZWcwLiBDb252ZXJ0IHRvCiAJCSAqIGEgYnVzIGFkZHJlc3MuICovCi0JCXJlc291cmNlLT5zdGFydCA9IHBoeXNfdG9fYnVzKHBtZW1hZGRyIC0gMHg4MDAwMDAwMCk7CisJCXJlc291cmNlLT5zdGFydCA9IHBoeXNfdG9fZG1hKHBtZW1hZGRyIC0gMHg4MDAwMDAwMCk7CiAJCXJlc291cmNlLT5lbmQgPSByZXNvdXJjZS0+c3RhcnQgKyBwbWVtbGVuIC0gMTsKIAogCQlwcl9pbmZvKCJwZXJzaXN0ZW50IG1lbW9yeTogc3RhcnQ9MHgleCAgZW5kPTB4JXhcbiIsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL3ByZWFsbG9jLWdhaWEuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvcHJlYWxsb2MtZ2FpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzhjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL3ByZWFsbG9jLWdhaWEuYwpAQCAtMCwwICsxLDU4OSBAQAorLyoKKyAqIE1lbW9yeSBwcmUtYWxsb2NhdGlvbnMgZm9yIEdhaWEgYm94ZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkgU2NpZW50aWZpYy1BdGxhbnRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBBdXRob3I6ICAgICAgIERhdmlkIFZvbUxlaG4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBvd2VydHYvYXNpYy5oPgorCisvKgorICogRFZSX0NBUEFCTEUgR0FJQSBSRVNPVVJDRVMKKyAqLworc3RydWN0IHJlc291cmNlIGR2cl9nYWlhX3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7CisJLyoKKwkgKgorCSAqIFZJREVPMSAvIExYMQorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIlNUMjMxYUltYWdlIiwJLyogRGVsdGEtTXUgMSBpbWFnZSBhbmQgcmFtICovCisJCS5zdGFydCAgPSAweDI0MDAwMDAwLAorCQkuZW5kICAgID0gMHgyNDFGRkZGRiwJCS8qIDJNaUIgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZSAgID0gIlNUMjMxYU1vbml0b3IiLAkvKiA4S2lCIGJsb2NrIFNUMjMxYSBtb25pdG9yICovCisJCS5zdGFydCAgPSAweDI0MjAwMDAwLAorCQkuZW5kICAgID0gMHgyNDIwMUZGRiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZSAgID0gIk1lZGlhTWVtb3J5MSIsCisJCS5zdGFydCAgPSAweDI0MjAyMDAwLAorCQkuZW5kICAgID0gMHgyNUZGRkZGRiwgLyp+MjkuOU1pQiAoMzJNaUIgLSAoMk1pQiArIDhLaUIpKSAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkvKgorCSAqCisJICogVklERU8yIC8gTFgyCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiU1QyMzFiSW1hZ2UiLAkvKiBEZWx0YS1NdSAyIGltYWdlIGFuZCByYW0gKi8KKwkJLnN0YXJ0ICA9IDB4NjAwMDAwMDAsCisJCS5lbmQgICAgPSAweDYwMUZGRkZGLAkJLyogMk1pQiAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTywKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJTVDIzMWJNb25pdG9yIiwJLyogOEtpQiBibG9jayBTVDIzMWIgbW9uaXRvciAqLworCQkuc3RhcnQgID0gMHg2MDIwMDAwMCwKKwkJLmVuZCAgICA9IDB4NjAyMDFGRkYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJeworCQkubmFtZSAgID0gIk1lZGlhTWVtb3J5MiIsCisJCS5zdGFydCAgPSAweDYwMjAyMDAwLAorCQkuZW5kICAgID0gMHg2MUZGRkZGRiwgLyp+MjkuOU1pQiAoMzJNaUIgLSAoMk1pQiArIDhLaUIpKSAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTywKKwl9LAorCS8qCisJICoKKwkgKiBTeXNhdWRpbyBEcml2ZXIKKwkgKgorCSAqIFRoaXMgZHJpdmVyIHJlcXVpcmVzOgorCSAqCisJICogQXJiaXRyYXJ5IEJhc2VkIEJ1ZmZlcnM6CisJICogIERTUF9JbWFnZV9CdWZmIC0gRFNQIGNvZGUgYW5kIGRhdGEgaW1hZ2VzICgxTUIpCisJICogIEFEU0NfQ1BVX1BDTV9CdWZmIC0gQURTQyBDUFUgUENNIGJ1ZmZlciAoNDBLQikKKwkgKiAgQURTQ19BVVhfQnVmZiAtIEFEU0MgQVVYIGJ1ZmZlciAoMTZLQikKKwkgKiAgQURTQ19NYWluX0J1ZmYgLSBBRFNDIE1haW4gYnVmZmVyICgxNktCKQorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkRTUF9JbWFnZV9CdWZmIiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDAwMEZGRkZGLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiQURTQ19DUFVfUENNX0J1ZmYiLAorCQkuc3RhcnQgID0gMHgwMDAwMDAwMCwKKwkJLmVuZCAgICA9IDB4MDAwMDlGRkYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJBRFNDX0FVWF9CdWZmIiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDAwMDAzRkZGLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiQURTQ19NYWluX0J1ZmYiLAorCQkuc3RhcnQgID0gMHgwMDAwMDAwMCwKKwkJLmVuZCAgICA9IDB4MDAwMDNGRkYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS8qCisJICoKKwkgKiBTVEFWRU0gZHJpdmVyL1NUQVBJCisJICoKKwkgKiBUaGlzIGRyaXZlciByZXF1aXJlczoKKwkgKgorCSAqIEFyYml0cmFyeSBCYXNlZCBCdWZmZXJzOgorCSAqICBUaGlzIG1lbW9yeSBhcmVhIGlzIHVzZWQgZm9yIGFsbG9jYXRpbmcgYnVmZmVycyBmb3IgVmlkZW8gZGVjb2RpbmcKKwkgKiAgcHVycG9zZXMuICBBbGxvY2F0aW9uL0RlLWFsbG9jYXRpb24gd2l0aGluIHRoaXMgYnVmZmVyIGlzIG1hbmFnZWQKKwkgKiAgYnkgdGhlIFNUQVZNRU0gZHJpdmVyIG9mIHRoZSBTVEFQSS4gIFRoZXkgY291bGQgYmUgRGVjaW1hdGVkCisJICogIFBpY3R1cmUgQnVmZmVycywgSW50ZXJtZWRpYXRlIEJ1ZmZlcnMsIGFzIGRlZW1lZCBuZWNlc3NhcnkgZm9yCisJICogIHZpZGVvIGRlY29kaW5nIHB1cnBvc2VzLCBmb3IgYW55IHZpZGVvIGRlY29kZXJzIG9uIFpldXMuCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiQVZNRU1QYXJ0aXRpb24wIiwKKwkJLnN0YXJ0ICA9IDB4NjM1ODAwMDAsCisJCS5lbmQgICAgPSAweDY0MTgwMDAwIC0gMSwgIC8qIDEyIE1CIHRvdGFsICovCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJLyoKKwkgKgorCSAqIERPQ1NJUyBTdWJzeXN0ZW0KKwkgKgorCSAqIFRoaXMgZHJpdmVyIHJlcXVpcmVzOgorCSAqCisJICogQXJiaXRyYXJ5IEJhc2VkIEJ1ZmZlcnM6CisJICogIERvY3NpcyAtCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiRG9jc2lzIiwKKwkJLnN0YXJ0ICA9IDB4NjIwMDAwMDAsCisJCS5lbmQgICAgPSAweDYyNzAwMDAwIC0gMSwJLyogNyBNQiB0b3RhbCAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTywKKwl9LAorCS8qCisJICoKKwkgKiBHSFcgSEFMIERyaXZlcgorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgR3JhcGhpY3NIZWFwIC0gUG93ZXJUViBHcmFwaGljcyBIZWFwCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiR3JhcGhpY3NIZWFwIiwKKwkJLnN0YXJ0ICA9IDB4NjI3MDAwMDAsCisJCS5lbmQgICAgPSAweDYzNTAwMDAwIC0gMSwJLyogMTQgTUIgdG90YWwgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogbXVsdGkgY29tIGJ1ZmZlciBhcmVhCisJICoKKwkgKiBUaGlzIGRyaXZlciByZXF1aXJlczoKKwkgKgorCSAqIEFyYml0cmFyeSBCYXNlZCBCdWZmZXJzOgorCSAqICBEb2NzaXMgLQorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIk11bHRpY29tU0hNIiwKKwkJLnN0YXJ0ICA9IDB4MjYwMDAwMDAsCisJCS5lbmQgICAgPSAweDI2MDIwMDAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLyoKKwkgKgorCSAqIERNQSBSaW5nIGJ1ZmZlcgorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgRG9jc2lzIC0KKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJCTU1fQnVmZmVyIiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDAwMjgwMDAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLyoKKwkgKgorCSAqIERpc3BsYXkgYmlucyBidWZmZXIgZm9yIHVuaXQwCisJICoKKwkgKiBUaGlzIGRyaXZlciByZXF1aXJlczoKKwkgKgorCSAqIEFyYml0cmFyeSBCYXNlZCBCdWZmZXJzOgorCSAqICBEaXNwbGF5IEJpbnMgZm9yIHVuaXQwCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiRGlzcGxheUJpbnMwIiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDAwMDAwRkZGLAkJLyogNCBLQiB0b3RhbCAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkvKgorCSAqCisJICogRGlzcGxheSBiaW5zIGJ1ZmZlcgorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgRGlzcGxheSBCaW5zIGZvciB1bml0MQorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkRpc3BsYXlCaW5zMSIsCisJCS5zdGFydCAgPSAweDY0QUQ0MDAwLAorCQkuZW5kICAgID0gMHg2NEFENTAwMCAtIDEsICAvKiA0IEtCIHRvdGFsICovCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJLyoKKwkgKgorCSAqIElURlMKKwkgKgorCSAqIFRoaXMgZHJpdmVyIHJlcXVpcmVzOgorCSAqCisJICogQXJiaXRyYXJ5IEJhc2VkIEJ1ZmZlcnM6CisJICogIERvY3NpcyAtCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiSVRGUyIsCisJCS5zdGFydCAgPSAweDY0MTgwMDAwLAorCQkvKiA4MTUsMTA0IGJ5dGVzIGVhY2ggZm9yIDIgSVRGUyBwYXJ0aXRpb25zLiAqLworCQkuZW5kICAgID0gMHg2NDMwREZGRiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogQVZGUworCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgRG9jc2lzIC0KKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJBdmZzRG1hTWVtIiwKKwkJLnN0YXJ0ICA9IDB4NjQzMEUwMDAsCisJCS8qICg5NDVLICogOCkgPSAoMTI4SyAqMykgNSBwbGF5YmFja3MgLyAzIHNlcnZlciAqLworCQkuZW5kICAgID0gMHg2NEFEMDAwMCAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJeworCQkubmFtZSAgID0gIkF2ZnNGaWxlU3lzIiwKKwkJLnN0YXJ0ICA9IDB4NjRBRDAwMDAsCisJCS5lbmQgICAgPSAweDY0QUQxMDAwIC0gMSwgIC8qIDRLICovCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJLyoKKwkgKgorCSAqIFNtYXJ0Y2FyZAorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgUmVhZCBhbmQgd3JpdGUgYnVmZmVycyBmb3IgSW50ZXJuYWwvRXh0ZXJuYWwgY2FyZHMKKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJTbWFydENhcmRJbmZvIiwKKwkJLnN0YXJ0ICA9IDB4NjRBRDEwMDAsCisJCS5lbmQgICAgPSAweDY0QUQzODAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogS0FWTkVUCisJICogICAgTlAgUmVzZXQgVmVjdG9yIC0gbXVzdCBiZSBvZiB0aGUgZm9ybSB4eEN4eHh4eAorCSAqCSAgIE5QIEltYWdlIC0gbXVzdCBiZSB2aWRlbyBiYW5rIDEKKwkgKgkgICBOUCBJUEMgLSBtdXN0IGJlIHZpZGVvIGJhbmsgMgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJOUF9SZXNldF9WZWN0b3IiLAorCQkuc3RhcnQgID0gMHgyN2MwMDAwMCwKKwkJLmVuZCAgICA9IDB4MjdjMDEwMDAgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiTlBfSW1hZ2UiLAorCQkuc3RhcnQgID0gMHgyNzAyMDAwMCwKKwkJLmVuZCAgICA9IDB4MjcwNjAwMDAgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiTlBfSVBDIiwKKwkJLnN0YXJ0ICA9IDB4NjM1MDAwMDAsCisJCS5lbmQgICAgPSAweDYzNTgwMDAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqIEFkZCBvdGhlciByZXNvdXJjZXMgaGVyZQorCSAqLworCXsgfSwKK307CisKKy8qCisgKiBOT05fRFZSX0NBUEFCTEUgR0FJQSBSRVNPVVJDRVMKKyAqLworc3RydWN0IHJlc291cmNlIG5vbl9kdnJfZ2FpYV9yZXNvdXJjZXNbXSBfX2luaXRkYXRhID0geworCS8qCisJICoKKwkgKiBWSURFTzEgLyBMWDEKKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJTVDIzMWFJbWFnZSIsCS8qIERlbHRhLU11IDEgaW1hZ2UgYW5kIHJhbSAqLworCQkuc3RhcnQgID0gMHgyNDAwMDAwMCwKKwkJLmVuZCAgICA9IDB4MjQxRkZGRkYsCQkvKiAyTWlCICovCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJTVDIzMWFNb25pdG9yIiwJLyogOEtpQiBibG9jayBTVDIzMWEgbW9uaXRvciAqLworCQkuc3RhcnQgID0gMHgyNDIwMDAwMCwKKwkJLmVuZCAgICA9IDB4MjQyMDFGRkYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJNZWRpYU1lbW9yeTEiLAorCQkuc3RhcnQgID0gMHgyNDIwMjAwMCwKKwkJLmVuZCAgICA9IDB4MjVGRkZGRkYsIC8qfjI5LjlNaUIgKDMyTWlCIC0gKDJNaUIgKyA4S2lCKSkgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLyoKKwkgKgorCSAqIFZJREVPMiAvIExYMgorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIlNUMjMxYkltYWdlIiwJLyogRGVsdGEtTXUgMiBpbWFnZSBhbmQgcmFtICovCisJCS5zdGFydCAgPSAweDYwMDAwMDAwLAorCQkuZW5kICAgID0gMHg2MDFGRkZGRiwJCS8qIDJNaUIgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiU1QyMzFiTW9uaXRvciIsCS8qIDhLaUIgYmxvY2sgU1QyMzFiIG1vbml0b3IgKi8KKwkJLnN0YXJ0ICA9IDB4NjAyMDAwMDAsCisJCS5lbmQgICAgPSAweDYwMjAxRkZGLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTywKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJNZWRpYU1lbW9yeTIiLAorCQkuc3RhcnQgID0gMHg2MDIwMjAwMCwKKwkJLmVuZCAgICA9IDB4NjFGRkZGRkYsIC8qfjI5LjlNaUIgKDMyTWlCIC0gKDJNaUIgKyA4S2lCKSkgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogU3lzYXVkaW8gRHJpdmVyCisJICoKKwkgKiBUaGlzIGRyaXZlciByZXF1aXJlczoKKwkgKgorCSAqIEFyYml0cmFyeSBCYXNlZCBCdWZmZXJzOgorCSAqICBEU1BfSW1hZ2VfQnVmZiAtIERTUCBjb2RlIGFuZCBkYXRhIGltYWdlcyAoMU1CKQorCSAqICBBRFNDX0NQVV9QQ01fQnVmZiAtIEFEU0MgQ1BVIFBDTSBidWZmZXIgKDQwS0IpCisJICogIEFEU0NfQVVYX0J1ZmYgLSBBRFNDIEFVWCBidWZmZXIgKDE2S0IpCisJICogIEFEU0NfTWFpbl9CdWZmIC0gQURTQyBNYWluIGJ1ZmZlciAoMTZLQikKKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJEU1BfSW1hZ2VfQnVmZiIsCisJCS5zdGFydCAgPSAweDAwMDAwMDAwLAorCQkuZW5kICAgID0gMHgwMDBGRkZGRiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZSAgID0gIkFEU0NfQ1BVX1BDTV9CdWZmIiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDAwMDA5RkZGLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiQURTQ19BVVhfQnVmZiIsCisJCS5zdGFydCAgPSAweDAwMDAwMDAwLAorCQkuZW5kICAgID0gMHgwMDAwM0ZGRiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZSAgID0gIkFEU0NfTWFpbl9CdWZmIiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDAwMDAzRkZGLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkvKgorCSAqCisJICogU1RBVkVNIGRyaXZlci9TVEFQSQorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgVGhpcyBtZW1vcnkgYXJlYSBpcyB1c2VkIGZvciBhbGxvY2F0aW5nIGJ1ZmZlcnMgZm9yIFZpZGVvIGRlY29kaW5nCisJICogIHB1cnBvc2VzLiAgQWxsb2NhdGlvbi9EZS1hbGxvY2F0aW9uIHdpdGhpbiB0aGlzIGJ1ZmZlciBpcyBtYW5hZ2VkCisJICogIGJ5IHRoZSBTVEFWTUVNIGRyaXZlciBvZiB0aGUgU1RBUEkuICBUaGV5IGNvdWxkIGJlIERlY2ltYXRlZAorCSAqICBQaWN0dXJlIEJ1ZmZlcnMsIEludGVybWVkaWF0ZSBCdWZmZXJzLCBhcyBkZWVtZWQgbmVjZXNzYXJ5IGZvcgorCSAqICB2aWRlbyBkZWNvZGluZyBwdXJwb3NlcywgZm9yIGFueSB2aWRlbyBkZWNvZGVycyBvbiBaZXVzLgorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkFWTUVNUGFydGl0aW9uMCIsCisJCS5zdGFydCAgPSAweDYzNTgwMDAwLAorCQkuZW5kICAgID0gMHg2NDE4MDAwMCAtIDEsICAvKiAxMiBNQiB0b3RhbCAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTywKKwl9LAorCS8qCisJICoKKwkgKiBET0NTSVMgU3Vic3lzdGVtCisJICoKKwkgKiBUaGlzIGRyaXZlciByZXF1aXJlczoKKwkgKgorCSAqIEFyYml0cmFyeSBCYXNlZCBCdWZmZXJzOgorCSAqICBEb2NzaXMgLQorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkRvY3NpcyIsCisJCS5zdGFydCAgPSAweDYyMDAwMDAwLAorCQkuZW5kICAgID0gMHg2MjcwMDAwMCAtIDEsCS8qIDcgTUIgdG90YWwgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogR0hXIEhBTCBEcml2ZXIKKwkgKgorCSAqIFRoaXMgZHJpdmVyIHJlcXVpcmVzOgorCSAqCisJICogQXJiaXRyYXJ5IEJhc2VkIEJ1ZmZlcnM6CisJICogIEdyYXBoaWNzSGVhcCAtIFBvd2VyVFYgR3JhcGhpY3MgSGVhcAorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkdyYXBoaWNzSGVhcCIsCisJCS5zdGFydCAgPSAweDYyNzAwMDAwLAorCQkuZW5kICAgID0gMHg2MzUwMDAwMCAtIDEsCS8qIDE0IE1CIHRvdGFsICovCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJLyoKKwkgKgorCSAqIG11bHRpIGNvbSBidWZmZXIgYXJlYQorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgRG9jc2lzIC0KKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJNdWx0aWNvbVNITSIsCisJCS5zdGFydCAgPSAweDI2MDAwMDAwLAorCQkuZW5kICAgID0gMHgyNjAyMDAwMCAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS8qCisJICoKKwkgKiBETUEgUmluZyBidWZmZXIKKwkgKgorCSAqIFRoaXMgZHJpdmVyIHJlcXVpcmVzOgorCSAqCisJICogQXJiaXRyYXJ5IEJhc2VkIEJ1ZmZlcnM6CisJICogIERvY3NpcyAtCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiQk1NX0J1ZmZlciIsCisJCS5zdGFydCAgPSAweDAwMDAwMDAwLAorCQkuZW5kICAgID0gMHgwMDBBQTAwMCAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS8qCisJICoKKwkgKiBEaXNwbGF5IGJpbnMgYnVmZmVyIGZvciB1bml0MAorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgRGlzcGxheSBCaW5zIGZvciB1bml0MAorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkRpc3BsYXlCaW5zMCIsCisJCS5zdGFydCAgPSAweDAwMDAwMDAwLAorCQkuZW5kICAgID0gMHgwMDAwMEZGRiwJCS8qIDQgS0IgdG90YWwgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLyoKKwkgKgorCSAqIERpc3BsYXkgYmlucyBidWZmZXIKKwkgKgorCSAqIFRoaXMgZHJpdmVyIHJlcXVpcmVzOgorCSAqCisJICogQXJiaXRyYXJ5IEJhc2VkIEJ1ZmZlcnM6CisJICogIERpc3BsYXkgQmlucyBmb3IgdW5pdDEKKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJEaXNwbGF5QmluczEiLAorCQkuc3RhcnQgID0gMHg2NEFENDAwMCwKKwkJLmVuZCAgICA9IDB4NjRBRDUwMDAgLSAxLCAgLyogNCBLQiB0b3RhbCAqLworCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTywKKwl9LAorCS8qCisJICoKKwkgKiBBVkZTOiBwbGF5ZXIgSEFMIG1lbW9yeQorCSAqCisJICoKKwkgKi8KKwl7CisJCS5uYW1lICAgPSAiQXZmc0RtYU1lbSIsCisJCS5zdGFydCAgPSAweDY0MzBFMDAwLAorCQkuZW5kICAgID0gMHg2NDVEMkMwMCAtIDEsICAvKiA5NDVLICogMyBmb3IgcGxheWJhY2sgKi8KKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogUE1FTQorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgUGVyc2lzdGVudCBtZW1vcnkgZm9yIGRpYWdub3N0aWNzLgorCSAqCisJICovCisJeworCQkubmFtZSAgID0gIkRpYWdQZXJzaXN0ZW50TWVtb3J5IiwKKwkJLnN0YXJ0ICA9IDB4MDAwMDAwMDAsCisJCS5lbmQgICAgPSAweDEwMDAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLyoKKwkgKgorCSAqIFNtYXJ0Y2FyZAorCSAqCisJICogVGhpcyBkcml2ZXIgcmVxdWlyZXM6CisJICoKKwkgKiBBcmJpdHJhcnkgQmFzZWQgQnVmZmVyczoKKwkgKiAgUmVhZCBhbmQgd3JpdGUgYnVmZmVycyBmb3IgSW50ZXJuYWwvRXh0ZXJuYWwgY2FyZHMKKwkgKgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJTbWFydENhcmRJbmZvIiwKKwkJLnN0YXJ0ICA9IDB4NjRBRDEwMDAsCisJCS5lbmQgICAgPSAweDY0QUQzODAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwkvKgorCSAqCisJICogS0FWTkVUCisJICogICAgTlAgUmVzZXQgVmVjdG9yIC0gbXVzdCBiZSBvZiB0aGUgZm9ybSB4eEN4eHh4eAorCSAqCSAgIE5QIEltYWdlIC0gbXVzdCBiZSB2aWRlbyBiYW5rIDEKKwkgKgkgICBOUCBJUEMgLSBtdXN0IGJlIHZpZGVvIGJhbmsgMgorCSAqLworCXsKKwkJLm5hbWUgICA9ICJOUF9SZXNldF9WZWN0b3IiLAorCQkuc3RhcnQgID0gMHgyN2MwMDAwMCwKKwkJLmVuZCAgICA9IDB4MjdjMDEwMDAgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiTlBfSW1hZ2UiLAorCQkuc3RhcnQgID0gMHgyNzAyMDAwMCwKKwkJLmVuZCAgICA9IDB4MjcwNjAwMDAgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICAgPSAiTlBfSVBDIiwKKwkJLnN0YXJ0ICA9IDB4NjM1MDAwMDAsCisJCS5lbmQgICAgPSAweDYzNTgwMDAwIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwl7IH0sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3Bvd2VydHYvaW5pdC5jIGIvYXJjaC9taXBzL3Bvd2VydHYvaW5pdC5jCmluZGV4IDBhZmUyMjcuLjgzNTUyMjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlcnR2L2luaXQuYworKysgYi9hcmNoL21pcHMvcG93ZXJ0di9pbml0LmMKQEAgLTExNyw4ICsxMTcsMTAgQEAKIAlib2FyZF9ubWlfaGFuZGxlcl9zZXR1cCA9IG1pcHNfbm1pX3NldHVwOwogCWJvYXJkX2VqdGFnX2hhbmRsZXJfc2V0dXAgPSBtaXBzX2VqdGFnX3NldHVwOwogCi0JaWYgKHByb21fYXJnYyA9PSAxKQorCWlmIChwcm9tX2FyZ2MgPT0gMSkgeworCQlzdHJsY2F0KGFyY3NfY21kbGluZSwgIiAiLCBDT01NQU5EX0xJTkVfU0laRSk7CiAJCXN0cmxjYXQoYXJjc19jbWRsaW5lLCBwcm9tX2FyZ3YsIENPTU1BTkRfTElORV9TSVpFKTsKKwl9CiAKIAljb25maWd1cmVfcGxhdGZvcm0oKTsKIAlwcm9tX21lbWluaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L2lvcmVtYXAuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L2lvcmVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdjNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvaW9yZW1hcC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICoJCQlpb3JlbWFwLmMKKyAqCisgKiBTdXBwb3J0IGZvciBtYXBwaW5nIGJldHdlZW4gZG1hX2FkZHJfdCB2YWx1ZXMgYSBwaHlzX2FkZHJfdCB2YWx1ZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkgU2NpZW50aWZpYy1BdGxhbnRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBBdXRob3I6ICAgICAgIERhdmlkIFZvbUxlaG4gPGR2b21sZWhuQGNpc2NvLmNvbT4KKyAqCisgKiBEZXNjcmlwdGlvbjogIERlZmluZXMgdGhlIHBsYXRmb3JtIHJlc291cmNlcyBmb3IgdGhlIFNBIHNldHRvcC4KKyAqCisgKiBOT1RFOiBUaGUgYm9vdGxvYWRlciBhbGxvY2F0ZXMgcGVyc2lzdGVudCBtZW1vcnkgYXQgYW4gYWRkcmVzcyB3aGljaCBpcworICogMTYgTWlCIGJlbG93IHRoZSBlbmQgb2YgdGhlIGhpZ2hlc3QgYWRkcmVzcyBpbiBLU0VHMC4gQWxsIGZpeGVkCisgKiBhZGRyZXNzIG1lbW9yeSByZXNlcnZhdGlvbnMgbXVzdCBhdm9pZCB0aGlzIHJlZ2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1wb3dlcnR2L2lvcmVtYXAuaD4KKworLyoKKyAqIERlZmluZSB0aGUgc2l6ZXMgb2YgYW5kIG1hc2tzIGZvciBncmFpbnMgaW4gcGh5c2ljYWwgYW5kIERNQSBzcGFjZS4gVGhlCisgKiB2YWx1ZXMgYXJlIHRoZSBzYW1lIGJ1dCB0aGUgdHlwZXMgYXJlIG5vdC4KKyAqLworI2RlZmluZSBJT1JfUEhZU19HUkFJTgkJKChwaHlzX2FkZHJfdCkgMSA8PCBJT1JfTFNCSVRTKQorI2RlZmluZSBJT1JfUEhZU19HUkFJTl9NQVNLCShJT1JfUEhZU19HUkFJTiAtIDEpCisKKyNkZWZpbmUgSU9SX0RNQV9HUkFJTgkJKChkbWFfYWRkcl90KSAxIDw8IElPUl9MU0JJVFMpCisjZGVmaW5lIElPUl9ETUFfR1JBSU5fTUFTSwkoSU9SX0RNQV9HUkFJTiAtIDEpCisKKy8qCisgKiBWYWx1ZXMgdGhhdCwgd2hlbiBhY2Nlc3NlZCBieSBhbiBpbmRleCBkZXJpdmVkIGZyb20gYSBwaHlzX2FkZHJfdCBhbmQKKyAqIGFkZGVkIHRvIHBoeXNfYWRkcl90IHZhbHVlLCB5aWVsZCBhIERNQSBhZGRyZXNzCisgKi8KK3N0cnVjdCBpb3JfcGh5c190b19kbWEgX2lvcl9waHlzX3RvX2RtYVtJT1JfTlVNX1BIWVNfVE9fRE1BXTsKK0VYUE9SVF9TWU1CT0woX2lvcl9waHlzX3RvX2RtYSk7CisKKy8qCisgKiBWYWx1ZXMgdGhhdCwgd2hlbiBhY2Nlc3NlZCBieSBhbiBpbmRleCBkZXJpdmVkIGZyb20gYSBkbWFfYWRkcl90IGFuZAorICogYWRkZWQgdG8gdGhhdCBkbWFfYWRkcl90IHZhbHVlLCB5aWVsZCBhIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworc3RydWN0IGlvcl9kbWFfdG9fcGh5cyBfaW9yX2RtYV90b19waHlzW0lPUl9OVU1fRE1BX1RPX1BIWVNdOworRVhQT1JUX1NZTUJPTChfaW9yX2RtYV90b19waHlzKTsKKworLyoqCisgKiBzZXR1cF9kbWFfdG9fcGh5cyAtIHNldCB1cCBjb252ZXJzaW9uIGZyb20gRE1BIHRvIHBoeXNpY2FsIGFkZHJlc3NlcworICogQGRtYV9pZHg6CVRvcCBJT1JfTFNCSVRTIGJpdHMgb2YgdGhlIERNQSBhZGRyZXNzLCBpLmUuIGFuIGluZGV4CisgKgkJaW50byB0aGUgYXJyYXkgX2RtYV90b19waHlzLgorICogQGRlbHRhOglWYWx1ZSB0aGF0LCB3aGVuIGFkZGVkIHRvIHRoZSBETUEgYWRkcmVzcywgd2lsbCB5aWVsZCB0aGUKKyAqCQlwaHlzaWNhbCBhZGRyZXNzCisgKiBAczoJCU51bWJlciBvZiBieXRlcyBpbiB0aGUgc2VjdGlvbiBvZiBtZW1vcnkgd2l0aCB0aGUgZ2l2ZW4gZGVsdGEKKyAqCQliZXR3ZWVuIERNQSBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzLgorICovCitzdGF0aWMgdm9pZCBzZXR1cF9kbWFfdG9fcGh5cyhkbWFfYWRkcl90IGRtYSwgcGh5c19hZGRyX3QgZGVsdGEsIGRtYV9hZGRyX3QgcykKK3sKKwlpbnQgZG1hX2lkeCwgZmlyc3RfaWR4LCBsYXN0X2lkeDsKKwlwaHlzX2FkZHJfdCBmaXJzdCwgbGFzdDsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBpbmRpY2VzLCByb3VuZGluZyB0aGUgZmlyc3QgdXAgYW5kCisJICogdGhlIHNlY29uZCBkb3duLgorCSAqLworCWZpcnN0ID0gZG1hICYgfklPUl9ETUFfR1JBSU5fTUFTSzsKKwlsYXN0ID0gKGRtYSArIHMgLSAxKSAmIH5JT1JfRE1BX0dSQUlOX01BU0s7CisJZmlyc3RfaWR4ID0gZmlyc3QgPj4gSU9SX0xTQklUUzsJCS8qIENvbnZlcnQgdG8gaW5kaWNlcyAqLworCWxhc3RfaWR4ID0gbGFzdCA+PiBJT1JfTFNCSVRTOworCisJZm9yIChkbWFfaWR4ID0gZmlyc3RfaWR4OyBkbWFfaWR4IDw9IGxhc3RfaWR4OyBkbWFfaWR4KyspCisJCV9pb3JfZG1hX3RvX3BoeXNbZG1hX2lkeF0ub2Zmc2V0ID0gZGVsdGEgPj4gSU9SX0RNQV9TSElGVDsKK30KKworLyoqCisgKiBzZXR1cF9waHlzX3RvX2RtYSAtIHNldCB1cCBjb252ZXJzaW9uIGZyb20gRE1BIHRvIHBoeXNpY2FsIGFkZHJlc3NlcworICogQHBoeXNfaWR4OglUb3AgSU9SX0xTQklUUyBiaXRzIG9mIHRoZSBETUEgYWRkcmVzcywgaS5lLiBhbiBpbmRleAorICoJCWludG8gdGhlIGFycmF5IF9waHlzX3RvX2RtYS4KKyAqIEBkZWx0YToJVmFsdWUgdGhhdCwgd2hlbiBhZGRlZCB0byB0aGUgRE1BIGFkZHJlc3MsIHdpbGwgeWllbGQgdGhlCisgKgkJcGh5c2ljYWwgYWRkcmVzcworICogQHM6CQlOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNlY3Rpb24gb2YgbWVtb3J5IHdpdGggdGhlIGdpdmVuIGRlbHRhCisgKgkJYmV0d2VlbiBETUEgYW5kIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfcGh5c190b19kbWEocGh5c19hZGRyX3QgcGh5cywgZG1hX2FkZHJfdCBkZWx0YSwgcGh5c19hZGRyX3QgcykKK3sKKwlpbnQgcGh5c19pZHgsIGZpcnN0X2lkeCwgbGFzdF9pZHg7CisJcGh5c19hZGRyX3QgZmlyc3QsIGxhc3Q7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgaW5kaWNlcywgcm91bmRpbmcgdGhlIGZpcnN0IHVwIGFuZAorCSAqIHRoZSBzZWNvbmQgZG93bi4KKwkgKi8KKwlmaXJzdCA9IHBoeXMgJiB+SU9SX1BIWVNfR1JBSU5fTUFTSzsKKwlsYXN0ID0gKHBoeXMgKyBzIC0gMSkgJiB+SU9SX1BIWVNfR1JBSU5fTUFTSzsKKwlmaXJzdF9pZHggPSBmaXJzdCA+PiBJT1JfTFNCSVRTOwkJLyogQ29udmVydCB0byBpbmRpY2VzICovCisJbGFzdF9pZHggPSBsYXN0ID4+IElPUl9MU0JJVFM7CisKKwlmb3IgKHBoeXNfaWR4ID0gZmlyc3RfaWR4OyBwaHlzX2lkeCA8PSBsYXN0X2lkeDsgcGh5c19pZHgrKykKKwkJX2lvcl9waHlzX3RvX2RtYVtwaHlzX2lkeF0ub2Zmc2V0ID0gZGVsdGEgPj4gSU9SX1BIWVNfU0hJRlQ7Cit9CisKKy8qKgorICogaW9yZW1hcF9hZGRfbWFwIC0gYWRkIHRvIHRoZSBwaHlzaWNhbCBhbmQgRE1BIGFkZHJlc3MgY29udmVyc2lvbiBhcnJheXMKKyAqIEBwaHlzOglQcm9jZXNzJ3MgdmlldyBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIG1lbW9yeSBjaHVuaworICogQGRtYToJRE1BIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBtZW1vcnkgY2h1bmsKKyAqIEBzaXplOglTaXplLCBpbiBieXRlcywgb2YgdGhlIGNodW5rIG9mIG1lbW9yeQorICoKKyAqIE5PVEU6IEl0IG1pZ2h0IGJlIG9idmlvdXMsIGJ1dCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBAc2l6ZSBieXRlcyBoYXZlCisgKiB0aGUgc2FtZSBvZmZzZXQgYmV0d2VlbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlIERNQSBhZGRyZXNzLgorICovCit2b2lkIGlvcmVtYXBfYWRkX21hcChwaHlzX2FkZHJfdCBwaHlzLCBwaHlzX2FkZHJfdCBkbWEsIHBoeXNfYWRkcl90IHNpemUpCit7CisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKChkbWEgJiBJT1JfRE1BX0dSQUlOX01BU0spICE9IDAgfHwKKwkJKHBoeXMgJiBJT1JfUEhZU19HUkFJTl9NQVNLKSAhPSAwIHx8CisJCShzaXplICYgSU9SX1BIWVNfR1JBSU5fTUFTSykgIT0gMCkKKwkJcHJfY3JpdCgiTWVtb3J5IGFsbG9jYXRpb24gbXVzdCBiZSBpbiBjaHVua3Mgb2YgMHgleCBieXRlc1xuIiwKKwkJCUlPUl9QSFlTX0dSQUlOKTsKKworCXNldHVwX2RtYV90b19waHlzKGRtYSwgcGh5cyAtIGRtYSwgc2l6ZSk7CisJc2V0dXBfcGh5c190b19kbWEocGh5cywgZG1hIC0gcGh5cywgc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9tZW1vcnkuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L21lbW9yeS5jCmluZGV4IGY0OWViM2QuLjczODgwYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlcnR2L21lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L21lbW9yeS5jCkBAIC0zMCwyOCArMzAsMTQxIEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBvd2VydHYvYXNpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBvd2VydHYvaW9yZW1hcC5oPgogCiAjaW5jbHVkZSAiaW5pdC5oIgogCiAvKiBNZW1vcnkgY29uc3RhbnRzICovCiAjZGVmaW5lIEtJQklCWVRFKG4pCQkoKG4pICogMTAyNCkJLyogTnVtYmVyIG9mIGtpYmlieXRlcyAqLwogI2RlZmluZSBNRUJJQllURShuKQkJKChuKSAqIEtJQklCWVRFKDEwMjQpKSAvKiBOdW1iZXIgb2YgbWViaWJ5dGVzICovCi0jZGVmaW5lIERFRkFVTFRfTUVNU0laRQkJTUVCSUJZVEUoMjU2KQkvKiBJZiBubyBtZW1zaXplIHByb3ZpZGVkICovCi0jZGVmaW5lIExPV19NRU1fTUFYCQlNRUJJQllURSgyNTIpCS8qIE1heCB1c2FibGUgbG93IG1lbSAqLwotI2RlZmluZSBSRVNfQk9PVExEUl9NRU1TSVpFCU1FQklCWVRFKDEpCS8qIE1lbW9yeSByZXNlcnZlZCBmb3IgYmxkciAqLwotI2RlZmluZSBCT09UX01FTV9TSVpFCQlLSUJJQllURSgyNTYpCS8qIE1lbW9yeSByZXNlcnZlZCBmb3IgYmxkciAqLwotI2RlZmluZSBQSFlTX01FTV9TVEFSVAkJMHgxMDAwMDAwMAkvKiBTdGFydCBvZiBwaHlzaWNhbCBtZW1vcnkgKi8KKyNkZWZpbmUgREVGQVVMVF9NRU1TSVpFCQlNRUJJQllURSgxMjgpCS8qIElmIG5vIG1lbXNpemUgcHJvdmlkZWQgKi8KIAotY2hhciBfX2luaXRkYXRhIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworI2RlZmluZSBCTERSX1NJWkUJS0lCSUJZVEUoMjU2KQkJLyogTWVtb3J5IHJlc2VydmVkIGZvciBibGRyICovCisjZGVmaW5lIFJWX1NJWkUJCU1FQklCWVRFKDQpCQkvKiBTaXplIG9mIHJlc2V0IHZlY3RvciAqLwogCi12b2lkIF9faW5pdCBwcm9tX21lbWluaXQodm9pZCkKKyNkZWZpbmUgTE9XX01FTV9FTkQJMHgyMDAwMDAwMAkJLyogSGlnaGVzdCBsb3cgbWVtb3J5IGFkZHJlc3MgKi8KKyNkZWZpbmUgQkxEUl9BTElBUwkweDEwMDAwMDAwCQkvKiBCb290bG9hZGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgUlZfUEhZUwkJMHgxZmMwMDAwMAkJLyogUmVzZXQgdmVjdG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUgTE9XX1JBTV9FTkQJUlZfUEhZUwkJCS8qIEVuZCBvZiByZWFsIFJBTSBpbiBsb3cgbWVtICovCisKKy8qCisgKiBWZXJ5IGxvdy1sZXZlbCBjb252ZXJzaW9uIGZyb20gcHJvY2Vzc29yIHBoeXNpY2FsIGFkZHJlc3MgdG8gZGV2aWNlCisgKiBETUEgYWRkcmVzcyBmb3IgdGhlIGZpcnN0IGJhbmsgb2YgbWVtb3J5LgorICovCisjZGVmaW5lIFBIWVNfVE9fRE1BKHBhZGRyKQkoKHBhZGRyKSArIChDT05GSUdfTE9XX1JBTV9ETUEgLSBMT1dfUkFNX0FMSUFTKSkKKwordW5zaWduZWQgbG9uZyBwdHZfbWVtc2l6ZTsKKworLyoKKyAqIHN0cnVjdCBsb3dfbWVtX3Jlc2VydmVkIC0gSXRlbXMgaW4gbG93IG1lbW1vcnkgdGhhdCBhcmUgcmVzZXJ2ZWQKKyAqIEBzdGFydDoJUGh5c2ljYWwgYWRkcmVzcyBvZiBpdGVtCisgKiBAc2l6ZToJU2l6ZSwgaW4gYnl0ZXMsIG9mIHRoaXMgaXRlbQorICogQGlzX2FsaWFzZWQ6CVRydWUgaWYgdGhpcyBpcyBSQU0gYWxpYXNlZCBmcm9tIGFub3RoZXIgbG9jYXRpb24uIElmIGZhbHNlLAorICoJCWl0IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIGFsaWFzZWQgUkFNIGFuZCB0aGUgUkFNIGluIHRoZQorICoJCXVuYWxpYXNlZCBhZGRyZXNzIGlzIHN0aWxsIHZpc2libGUgb3V0c2lkZSBvZiBsb3cgbWVtb3J5LgorICovCitzdHJ1Y3QgbG93X21lbV9yZXNlcnZlZCB7CisJcGh5c19hZGRyX3QJc3RhcnQ7CisJcGh5c19hZGRyX3QJc2l6ZTsKKwlib29sCQlpc19hbGlhc2VkOworfTsKKworLyoKKyAqIE11c3QgYmUgaW4gYXNjZW5kaW5nIGFkZHJlc3Mgb3JkZXIKKyAqLworc3RydWN0IGxvd19tZW1fcmVzZXJ2ZWQgbG93X21lbV9yZXNlcnZlZFtdID0geworCXtCTERSX0FMSUFTLCBCTERSX1NJWkUsIHRydWV9LAkvKiBCb290bG9hZGVyIFJBTSAqLworCXtSVl9QSFlTLCBSVl9TSVpFLCBmYWxzZX0sCS8qIFJlc2V0IHZlY3RvciAqLworfTsKKworLyoKKyAqIHN0cnVjdCBtZW1fbGF5b3V0IC0gbGF5b3V0IG9mIGEgcGllY2Ugb2YgdGhlIHN5c3RlbSBSQU0KKyAqIEBwaHlzOglQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGlzIHBpZWNlIG9mIFJBTS4gVGhpcyBpcyB0aGUKKyAqCQlhZGRyZXNzIGF0IHdoaWNoIGJvdGggdGhlIHByb2Nlc3NvciBhbmQgSS9PIGRldmljZXMgc2VlIHRoZQorICoJCVJBTS4KKyAqIEBhbGlhczoJQWxpYXMgb2YgdGhpcyBwaWVjZSBvZiBtZW1vcnkgaW4gb3JkZXIgdG8gbWFrZSBpdCBhcHBlYXIgaW4KKyAqCQl0aGUgbG93IG1lbW9yeSBwYXJ0IG9mIHRoZSBwcm9jZXNzb3IncyBhZGRyZXNzIHNwYWNlLiBJL08KKyAqCQlkZXZpY2VzIGRvbid0IHNlZSBhbnl0aGluZyBoZXJlLgorICogQHNpemU6CVNpemUsIGluIGJ5dGVzLCBvZiB0aGlzIHBpZWNlIG9mIFJBTQorICovCitzdHJ1Y3QgbWVtX2xheW91dCB7CisJcGh5c19hZGRyX3QJcGh5czsKKwlwaHlzX2FkZHJfdAlhbGlhczsKKwlwaHlzX2FkZHJfdAlzaXplOworfTsKKworLyoKKyAqIHN0cnVjdCBtZW1fbGF5b3V0X2xpc3QgLSBsaXN0IGRlc2NyaXB0b3IgZm9yIGxheW91dHMgb2Ygc3lzdGVtIFJBTSBwaWVjZXMKKyAqIEBmYW1pbHk6CVNwZWNpZmllcyB0aGUgZmFtaWx5IGJlaW5nIGRlc2NyaWJlZAorICogQG46CQlOdW1iZXIgb2YgJnN0cnVjdCBtZW1fbGF5b3V0IGVsZW1lbnRzCisgKiBAbGF5b3V0OglQb2ludGVyIHRvIHRoZSBsaXN0IG9mICZtZW1fbGF5b3V0IHN0cnVjdHVyZXMKKyAqLworc3RydWN0IG1lbV9sYXlvdXRfbGlzdCB7CisJZW51bSBmYW1pbHlfdHlwZQlmYW1pbHk7CisJc2l6ZV90CQkJbjsKKwlzdHJ1Y3QgbWVtX2xheW91dAkqbGF5b3V0OworfTsKKworc3RhdGljIHN0cnVjdCBtZW1fbGF5b3V0IGYxNTAwX2xheW91dFtdID0geworCXsweDIwMDAwMDAwLCAweDEwMDAwMDAwLCBNRUJJQllURSgyNTYpfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2xheW91dCBmNDUwMF9sYXlvdXRbXSA9IHsKKwl7MHg0MDAwMDAwMCwgMHgxMDAwMDAwMCwgTUVCSUJZVEUoMjU2KX0sCisJezB4MjAwMDAwMDAsIDB4MjAwMDAwMDAsIE1FQklCWVRFKDMyKX0sCit9OworCitzdGF0aWMgc3RydWN0IG1lbV9sYXlvdXQgZjg1MDBfbGF5b3V0W10gPSB7CisJezB4NDAwMDAwMDAsIDB4MTAwMDAwMDAsIE1FQklCWVRFKDI1Nil9LAorCXsweDIwMDAwMDAwLCAweDIwMDAwMDAwLCBNRUJJQllURSgzMil9LAorCXsweDMwMDAwMDAwLCAweDMwMDAwMDAwLCBNRUJJQllURSgzMil9LAorfTsKKworc3RhdGljIHN0cnVjdCBtZW1fbGF5b3V0IGZ4NjAwX2xheW91dFtdID0geworCXsweDIwMDAwMDAwLCAweDEwMDAwMDAwLCBNRUJJQllURSgyNTYpfSwKKwl7MHg2MDAwMDAwMCwgMHg2MDAwMDAwMCwgTUVCSUJZVEUoMTI4KX0sCit9OworCitzdGF0aWMgc3RydWN0IG1lbV9sYXlvdXRfbGlzdCBsYXlvdXRfbGlzdFtdID0geworCXtGQU1JTFlfMTUwMCwgQVJSQVlfU0laRShmMTUwMF9sYXlvdXQpLCBmMTUwMF9sYXlvdXR9LAorCXtGQU1JTFlfMTUwMFZaRSwgQVJSQVlfU0laRShmMTUwMF9sYXlvdXQpLCBmMTUwMF9sYXlvdXR9LAorCXtGQU1JTFlfMTUwMFZaRiwgQVJSQVlfU0laRShmMTUwMF9sYXlvdXQpLCBmMTUwMF9sYXlvdXR9LAorCXtGQU1JTFlfNDUwMCwgQVJSQVlfU0laRShmNDUwMF9sYXlvdXQpLCBmNDUwMF9sYXlvdXR9LAorCXtGQU1JTFlfODUwMCwgQVJSQVlfU0laRShmODUwMF9sYXlvdXQpLCBmODUwMF9sYXlvdXR9LAorCXtGQU1JTFlfODUwMFJORywgQVJSQVlfU0laRShmODUwMF9sYXlvdXQpLCBmODUwMF9sYXlvdXR9LAorCXtGQU1JTFlfNDYwMCwgQVJSQVlfU0laRShmeDYwMF9sYXlvdXQpLCBmeDYwMF9sYXlvdXR9LAorCXtGQU1JTFlfNDYwMFZaQSwgQVJSQVlfU0laRShmeDYwMF9sYXlvdXQpLCBmeDYwMF9sYXlvdXR9LAorCXtGQU1JTFlfODYwMCwgQVJSQVlfU0laRShmeDYwMF9sYXlvdXQpLCBmeDYwMF9sYXlvdXR9LAorCXtGQU1JTFlfODYwMFZaQiwgQVJSQVlfU0laRShmeDYwMF9sYXlvdXQpLCBmeDYwMF9sYXlvdXR9LAorfTsKKworLyogSWYgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBsYXlvdXQsIHVzZSB0aGlzICovCitzdGF0aWMgc3RydWN0IG1lbV9sYXlvdXQgZGVmYXVsdF9sYXlvdXRbXSA9IHsKKwl7MHgyMDAwMDAwMCwgMHgxMDAwMDAwMCwgTUVCSUJZVEUoMTI4KX0sCit9OworCisvKioKKyAqIHJlZ2lzdGVyX25vbl9yYW0gLSByZWdpc3RlciBsb3cgbWVtb3J5IG5vdCBhdmFpbGFibGUgZm9yIFJBTSB1c2FnZQorICovCitzdGF0aWMgX19pbml0IHZvaWQgcmVnaXN0ZXJfbm9uX3JhbSh2b2lkKQogeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG93X21lbV9yZXNlcnZlZCk7IGkrKykKKwkJYWRkX21lbW9yeV9yZWdpb24obG93X21lbV9yZXNlcnZlZFtpXS5zdGFydCwKKwkJCWxvd19tZW1fcmVzZXJ2ZWRbaV0uc2l6ZSwgQk9PVF9NRU1fUkVTRVJWRUQpOworfQorCisvKioKKyAqIGdldF9tZW1zaXplIC0gZ2V0IHRoZSBzaXplIG9mIG1lbW9yeSBhcyBhIHNpbmdsZSBiYW5rCisgKi8KK3N0YXRpYyBwaHlzX2FkZHJfdCBnZXRfbWVtc2l6ZSh2b2lkKQoreworCXN0YXRpYyBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdIF9faW5pdGRhdGE7CisJcGh5c19hZGRyX3QgbWVtc2l6ZSA9IDA7CiAJY2hhciAqbWVtc2l6ZV9zdHI7Ci0JdW5zaWduZWQgbG9uZyBtZW1zaXplID0gMDsKLQl1bnNpZ25lZCBpbnQgcGh5c2VuZDsKIAljaGFyICpwdHI7Ci0JaW50IGxvd19tZW07Ci0JaW50IGhpZ2hfbWVtOwogCiAJLyogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBmaXJzdCBmb3IgYSBtZW1zaXplIGRpcmVjdGl2ZSAqLwogCXN0cmNweShjbWRsaW5lLCBhcmNzX2NtZGxpbmUpOwpAQCAtNzMsOTggKzE4NiwxNTggQEAKIAkJaWYgKG1lbXNpemUgPT0gMCkgewogCQkJaWYgKF9wcm9tX21lbXNpemUgIT0gMCkgewogCQkJCW1lbXNpemUgPSBfcHJvbV9tZW1zaXplOwotCQkJCXByX2luZm8oIl9wcm9tX21lbXNpemUgPSAweCVseFxuIiwgbWVtc2l6ZSk7CisJCQkJcHJfaW5mbygiX3Byb21fbWVtc2l6ZSA9IDB4JXhcbiIsIG1lbXNpemUpOwogCQkJCS8qIGFkZCBpbiBtZW1vcnkgdGhhdCB0aGUgYm9vdGxvYWRlciBkb2Vzbid0CiAJCQkJICogcmVwb3J0ICovCi0JCQkJbWVtc2l6ZSArPSBCT09UX01FTV9TSVpFOworCQkJCW1lbXNpemUgKz0gQkxEUl9TSVpFOwogCQkJfSBlbHNlIHsKIAkJCQltZW1zaXplID0gREVGQVVMVF9NRU1TSVpFOwogCQkJCXByX2luZm8oIk1lbXNpemUgbm90IHBhc3NlZCBieSBib290bG9hZGVyLCAiCi0JCQkJCSJkZWZhdWx0aW5nIHRvIDB4JWx4XG4iLCBtZW1zaXplKTsKKwkJCQkJImRlZmF1bHRpbmcgdG8gMHgleFxuIiwgbWVtc2l6ZSk7CiAJCQl9CiAJCX0KIAl9CiAKLQlwaHlzZW5kID0gUEZOX0FMSUdOKCZfZW5kKSAtIDB4ODAwMDAwMDA7Ci0JaWYgKG1lbXNpemUgPiBMT1dfTUVNX01BWCkgewotCQlsb3dfbWVtID0gTE9XX01FTV9NQVg7Ci0JCWhpZ2hfbWVtID0gbWVtc2l6ZSAtIGxvd19tZW07Ci0JfSBlbHNlIHsKLQkJbG93X21lbSA9IG1lbXNpemU7Ci0JCWhpZ2hfbWVtID0gMDsKKwlyZXR1cm4gbWVtc2l6ZTsKK30KKworLyoqCisgKiByZWdpc3Rlcl9sb3dfcmFtIC0gcmVnaXN0ZXIgYW4gYWxpYXNlZCBzZWN0aW9uIG9mIFJBTQorICogQHA6CQlBbGlhcyBhZGRyZXNzIG9mIG1lbW9yeQorICogQG46CQlOdW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzZWN0aW9uIG9mIG1lbW9yeQorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWdpc3RlcmVkCisgKgorICovCitzdGF0aWMgX19pbml0IHBoeXNfYWRkcl90IHJlZ2lzdGVyX2xvd19yYW0ocGh5c19hZGRyX3QgcCwgcGh5c19hZGRyX3QgbikKK3sKKwlwaHlzX2FkZHJfdCBzOworCWludCBpOworCXBoeXNfYWRkcl90IG9yaWdfbjsKKworCW9yaWdfbiA9IG47CisKKwlCVUdfT04ocCArIG4gPiBSVl9QSFlTKTsKKworCWZvciAoaSA9IDA7IG4gIT0gMCAmJiBpIDwgQVJSQVlfU0laRShsb3dfbWVtX3Jlc2VydmVkKTsgaSsrKSB7CisJCXBoeXNfYWRkcl90IHN0YXJ0OworCQlwaHlzX2FkZHJfdCBzaXplOworCisJCXN0YXJ0ID0gbG93X21lbV9yZXNlcnZlZFtpXS5zdGFydDsKKwkJc2l6ZSA9IGxvd19tZW1fcmVzZXJ2ZWRbaV0uc2l6ZTsKKworCQkvKiBIYW5kbGUgbWVtb3J5IGJlZm9yZSB0aGlzIGxvdyBtZW1vcnkgc2VjdGlvbiAqLworCQlpZiAocCA8IHN0YXJ0KSB7CisJCQlwaHlzX2FkZHJfdCBzOworCQkJcyA9IG1pbihuLCBzdGFydCAtIHApOworCQkJYWRkX21lbW9yeV9yZWdpb24ocCwgcywgQk9PVF9NRU1fUkFNKTsKKwkJCXAgKz0gczsKKwkJCW4gLT0gczsKKwkJfQorCisJCS8qIEhhbmRsZSB0aGUgbG93IG1lbW9yeSBzZWN0aW9uIGl0c2VsZi4gSWYgaXQncyBhbGlhc2VkLAorCQkgKiB3ZSByZWR1Y2UgdGhlIG51bWJlciBvZiBieWVzIGxlZnQsIGJ1dCBpZiBub3QsIHRoZSBSQU0KKwkJICogaXMgYXZhaWxhYmxlIGVsc2V3aGVyZSBhbmQgd2UgZG9uJ3QgcmVkdWNlIHRoZSBudW1iZXIgb2YKKwkJICogYnl0ZXMgcmVtYWluaW5nLiAqLworCQlpZiAocCA9PSBzdGFydCkgeworCQkJaWYgKGxvd19tZW1fcmVzZXJ2ZWRbaV0uaXNfYWxpYXNlZCkgeworCQkJCXMgPSBtaW4obiwgc2l6ZSk7CisJCQkJbiAtPSBzOworCQkJCXAgKz0gczsKKwkJCX0gZWxzZQorCQkJCXAgKz0gbjsKKwkJfQogCX0KIAorCXJldHVybiBvcmlnX24gLSBuOworfQorCiAvKgotICogVE9ETzogV2Ugd2lsbCB1c2UgdGhlIGhhcmQgY29kZSBmb3IgbWVtb3J5IGNvbmZpZ3VyYXRpb24gdW50aWwKLSAqIHRoZSBib290bG9hZGVyIHJlbGVhc2VzIHRoZWlyIGRldmljZSB0cmVlIHRvIHVzLgorICogcmVnaXN0ZXJfcmFtIC0gcmVnaXN0ZXIgcmVhbCBSQU0KKyAqIEBwOglBZGRyZXNzIG9mIG1lbW9yeSBhcyBzZWVuIGJ5IGRldmljZXMKKyAqIEBhbGlhczoJSWYgdGhlIG1lbW9yeSBpcyBzZWVuIGF0IGFuIGFkZGl0aW9uYWwgYWRkcmVzcyBieSB0aGUgcHJvY2Vzc29yLAorICoJCXRoaXMgd2lsbCBiZSB0aGUgYWRkcmVzcywgb3RoZXJ3aXNlIGl0IGlzIHRoZSBzYW1lIGFzIEBwLgorICogQG46CQlOdW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBzZWN0aW9uIG9mIG1lbW9yeQogICovCitzdGF0aWMgX19pbml0IHZvaWQgcmVnaXN0ZXJfcmFtKHBoeXNfYWRkcl90IHAsIHBoeXNfYWRkcl90IGFsaWFzLAorCXBoeXNfYWRkcl90IG4pCit7CiAJLyoKLQkgKiBBZGQgdGhlIG1lbW9yeSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBib290bG9hZGVyIHRvIHRoZQotCSAqIG1lbW9yeSBtYXAuCisJICogSWYgc29tZSBvciBhbGwgb2YgdGhpcyBtZW1vcnkgaGFzIGFuIGFsaWFzLCBicmVhayBpdCBpbnRvIHRoZQorCSAqIGFsaWFzZWQgYW5kIG5vbi1hbGlhc2VkIHBvcnRpb24uCiAJICovCi0JYWRkX21lbW9yeV9yZWdpb24oUEhZU19NRU1fU1RBUlQsIFJFU19CT09UTERSX01FTVNJWkUsCi0JCUJPT1RfTUVNX1JFU0VSVkVEKTsKLSNpZmRlZiBDT05GSUdfSElHSE1FTV8yNTZfMTI4Ci0JLyoKLQkgKiBBZGQgbWVtb3J5IGluIGxvdyBmb3IgZ2VuZXJhbCB1c2UgYnkgdGhlIGtlcm5lbCBhbmQgaXRzIGZyaWVuZHMKLQkgKiAobGlrZSBkcml2ZXJzLCBhcHBsaWNhdGlvbnMsIGV0YykuCi0JICovCi0JYWRkX21lbW9yeV9yZWdpb24oUEhZU19NRU1fU1RBUlQgKyBSRVNfQk9PVExEUl9NRU1TSVpFLAotCQlMT1dfTUVNX01BWCAtIFJFU19CT09UTERSX01FTVNJWkUsIEJPT1RfTUVNX1JBTSk7Ci0JLyoKLQkgKiBBZGQgdGhlIG1lbW9yeSByZXNlcnZlZCBmb3IgcmVzZXQgdmVjdG9yLgotCSAqLwotCWFkZF9tZW1vcnlfcmVnaW9uKDB4MWZjMDAwMDAsIE1FQklCWVRFKDQpLCBCT09UX01FTV9SRVNFUlZFRCk7Ci0JLyoKLQkgKiBBZGQgdGhlIG1lbW9yeSByZXNlcnZlZC4KLQkgKi8KLQlhZGRfbWVtb3J5X3JlZ2lvbigweDIwMDAwMDAwLCBNRUJJQllURSgxMDI0ICsgNzUpLCBCT09UX01FTV9SRVNFUlZFRCk7Ci0JLyoKLQkgKiBBZGQgbWVtb3J5IGluIGhpZ2ggZm9yIGdlbmVyYWwgdXNlIGJ5IHRoZSBrZXJuZWwgYW5kIGl0cyBmcmllbmRzCi0JICogKGxpa2UgZHJpdmVycywgYXBwbGljYXRpb25zLCBldGMpLgotCSAqCi0JICogNzVNQiBpcyByZXNlcnZlZCBmb3IgZGV2aWNlcyB3aGljaCBhcmUgdXNpbmcgdGhlIG1lbW9yeSBpbiBoaWdoLgotCSAqLwotCWFkZF9tZW1vcnlfcmVnaW9uKDB4NjAwMDAwMDAgKyBNRUJJQllURSg3NSksIE1FQklCWVRFKDEyOCAtIDc1KSwKLQkJQk9PVF9NRU1fUkFNKTsKLSNlbGlmIGRlZmluZWQgQ09ORklHX0hJR0hNRU1fMTI4XzEyOAotCS8qCi0JICogQWRkIG1lbW9yeSBpbiBsb3cgZm9yIGdlbmVyYWwgdXNlIGJ5IHRoZSBrZXJuZWwgYW5kIGl0cyBmcmllbmRzCi0JICogKGxpa2UgZHJpdmVycywgYXBwbGljYXRpb25zLCBldGMpLgotCSAqLwotCWFkZF9tZW1vcnlfcmVnaW9uKFBIWVNfTUVNX1NUQVJUICsgUkVTX0JPT1RMRFJfTUVNU0laRSwKLQkJTUVCSUJZVEUoMTI4KSAtIFJFU19CT09UTERSX01FTVNJWkUsIEJPT1RfTUVNX1JBTSk7Ci0JLyoKLQkgKiBBZGQgdGhlIG1lbW9yeSByZXNlcnZlZC4KLQkgKi8KLQlhZGRfbWVtb3J5X3JlZ2lvbihQSFlTX01FTV9TVEFSVCArIE1FQklCWVRFKDEyOCksCi0JCU1FQklCWVRFKDEyOCArIDEwMjQgKyA3NSksIEJPT1RfTUVNX1JFU0VSVkVEKTsKLQkvKgotCSAqIEFkZCBtZW1vcnkgaW4gaGlnaCBmb3IgZ2VuZXJhbCB1c2UgYnkgdGhlIGtlcm5lbCBhbmQgaXRzIGZyaWVuZHMKLQkgKiAobGlrZSBkcml2ZXJzLCBhcHBsaWNhdGlvbnMsIGV0YykuCi0JICoKLQkgKiA3NU1CIGlzIHJlc2VydmVkIGZvciBkZXZpY2VzIHdoaWNoIGFyZSB1c2luZyB0aGUgbWVtb3J5IGluIGhpZ2guCi0JICovCi0JYWRkX21lbW9yeV9yZWdpb24oMHg2MDAwMDAwMCArIE1FQklCWVRFKDc1KSwgTUVCSUJZVEUoMTI4IC0gNzUpLAotCQlCT09UX01FTV9SQU0pOwotI2Vsc2UKLQkvKiBBZGQgbG93IG1lbW9yeSByZWdpb25zIGZvciBlaXRoZXI6Ci0JICogICAtIG5vLWhpZ2htZW1vcnkgY29uZmlndXJhdGlvbiBjYXNlIC1PUi0KLQkgKiAgIC0gaGlnaG1lbW9yeSAiSElHSE1FTV9MT1dCQU5LX09OTFkiIGNhc2UKLQkgKi8KLQkvKgotCSAqIEFkZCBtZW1vcnkgZm9yIGdlbmVyYWwgdXNlIGJ5IHRoZSBrZXJuZWwgYW5kIGl0cyBmcmllbmRzCi0JICogKGxpa2UgZHJpdmVycywgYXBwbGljYXRpb25zLCBldGMpLgotCSAqLwotCWFkZF9tZW1vcnlfcmVnaW9uKFBIWVNfTUVNX1NUQVJUICsgUkVTX0JPT1RMRFJfTUVNU0laRSwKLQkJbG93X21lbSAtIFJFU19CT09UTERSX01FTVNJWkUsIEJPT1RfTUVNX1JBTSk7Ci0JLyoKLQkgKiBBZGQgdGhlIG1lbW9yeSByZXNlcnZlZCBmb3IgcmVzZXQgdmVjdG9yLgotCSAqLwotCWFkZF9tZW1vcnlfcmVnaW9uKDB4MWZjMDAwMDAsIE1FQklCWVRFKDQpLCBCT09UX01FTV9SRVNFUlZFRCk7CisJaWYgKHAgIT0gYWxpYXMpIHsKKwkJcGh5c19hZGRyX3QgYWxpYXNfc2l6ZTsKKwkJcGh5c19hZGRyX3QgcmVnaXN0ZXJlZDsKKworCQlhbGlhc19zaXplID0gbWluKG4sIExPV19SQU1fRU5EIC0gYWxpYXMpOworCQlyZWdpc3RlcmVkID0gcmVnaXN0ZXJfbG93X3JhbShhbGlhcywgYWxpYXNfc2l6ZSk7CisJCWlvcmVtYXBfYWRkX21hcChhbGlhcywgcCwgbik7CisJCW4gLT0gcmVnaXN0ZXJlZDsKKwkJcCArPSByZWdpc3RlcmVkOworCX0KKworI2lmZGVmIENPTkZJR19ISUdITUVNCisJaWYgKG4gIT0gMCkgeworCQlhZGRfbWVtb3J5X3JlZ2lvbihwLCBuLCBCT09UX01FTV9SQU0pOworCQlpb3JlbWFwX2FkZF9tYXAocCwgcCwgbik7CisJfQogI2VuZGlmCiB9CiAKKy8qKgorICogcmVnaXN0ZXJfYWRkcmVzc19zcGFjZSAtIHJlZ2lzdGVyIHRoaW5ncyBpbiB0aGUgYWRkcmVzcyBzcGFjZQorICogQG1lbXNpemU6CU51bWJlciBvZiBieXRlcyBvZiBSQU0gaW5zdGFsbGVkCisgKgorICogVGFrZXMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBvZiBSQU0gYW5kIHJlZ2lzdGVycyBhcyBtYW55IG9mIHRoZSByZWdpb25zLAorICogb3IgcGFydGlhbCByZWdpb25zLCBhcyBpdCBjYW4uIFNvLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1pZ2h0IGhhdmUKKyAqIHR3byByZWdpb25zIHdpdGggMjU2IE1pQiBlYWNoLiBJZiB0aGUgbWVtc2l6ZSBwYXNzZWQgaW4gb24gdGhlIGNvbW1hbmQgbGluZQorICogaXMgMzg0IE1pQiwgaXQgd2lsbCByZWdpc3RlciB0aGUgZmlyc3QgcmVnaW9uIHdpdGggMjU2IE1pQiBhbmQgdGhlIHNlY29uZAorICogd2l0aCAxMjggTWlCLgorICovCitzdGF0aWMgX19pbml0IHZvaWQgcmVnaXN0ZXJfYWRkcmVzc19zcGFjZShwaHlzX2FkZHJfdCBtZW1zaXplKQoreworCWludCBpOworCXBoeXNfYWRkcl90IHNpemU7CisJc2l6ZV90IG47CisJc3RydWN0IG1lbV9sYXlvdXQgKmxheW91dDsKKwllbnVtIGZhbWlseV90eXBlIGZhbWlseTsKKworCS8qCisJICogUmVnaXN0ZXIgYWxsIG9mIHRoZSB0aGluZ3MgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHRvIHRoZSBrZXJuZWwgYXMKKwkgKiBtZW1vcnkuCisJICovCisJcmVnaXN0ZXJfbm9uX3JhbSgpOworCisJLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5IGRlc2NyaXB0aW9uICovCisJZmFtaWx5ID0gcGxhdGZvcm1fZ2V0X2ZhbWlseSgpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGF5b3V0X2xpc3QpOyBpKyspIHsKKwkJaWYgKGxheW91dF9saXN0W2ldLmZhbWlseSA9PSBmYW1pbHkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGxheW91dF9saXN0KSkgeworCQluID0gQVJSQVlfU0laRShkZWZhdWx0X2xheW91dCk7CisJCWxheW91dCA9IGRlZmF1bHRfbGF5b3V0OworCX0gZWxzZSB7CisJCW4gPSBsYXlvdXRfbGlzdFtpXS5uOworCQlsYXlvdXQgPSBsYXlvdXRfbGlzdFtpXS5sYXlvdXQ7CisJfQorCisJZm9yIChpID0gMDsgbWVtc2l6ZSAhPSAwICYmIGkgPCBuOyBpKyspIHsKKwkJc2l6ZSA9IG1pbihtZW1zaXplLCBsYXlvdXRbaV0uc2l6ZSk7CisJCXJlZ2lzdGVyX3JhbShsYXlvdXRbaV0ucGh5cywgbGF5b3V0W2ldLmFsaWFzLCBzaXplKTsKKwkJbWVtc2l6ZSAtPSBzaXplOworCX0KK30KKwordm9pZCBfX2luaXQgcHJvbV9tZW1pbml0KHZvaWQpCit7CisJcHR2X21lbXNpemUgPSBnZXRfbWVtc2l6ZSgpOworCXJlZ2lzdGVyX2FkZHJlc3Nfc3BhY2UocHR2X21lbXNpemUpOworfQorCiB2b2lkIF9faW5pdCBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9wb3dlcnR2LXVzYi5jIGIvYXJjaC9taXBzL3Bvd2VydHYvcG93ZXJ0di11c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWM4NWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvcG93ZXJ0di11c2IuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqCQkJCXBvd2VydHYtdXNiLmMKKyAqCisgKiBEZXNjcmlwdGlvbjogIEFTSUMtc3BlY2lmaWMgVVNCIGRldmljZSBzZXR1cCBhbmQgc2h1dGRvd24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBTY2llbnRpZmljLUF0bGFudGEsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBDaXNjbyBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBBdXRob3I6ICAgICAgIEtlbiBFcHBpbmV0dAorICogICAgICAgICAgICAgICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBOT1RFOiBUaGUgYm9vdGxvYWRlciBhbGxvY2F0ZXMgcGVyc2lzdGVudCBtZW1vcnkgYXQgYW4gYWRkcmVzcyB3aGljaCBpcworICogMTYgTWlCIGJlbG93IHRoZSBlbmQgb2YgdGhlIGhpZ2hlc3QgYWRkcmVzcyBpbiBLU0VHMC4gQWxsIGZpeGVkCisgKiBhZGRyZXNzIG1lbW9yeSByZXNlcnZhdGlvbnMgbXVzdCBhdm9pZCB0aGlzIHJlZ2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtcG93ZXJ0di9hc2ljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtcG93ZXJ0di9pbnRlcnJ1cHRzLmg+CisKKy8qIG1pc2NfY2xrX2N0bDEgdmFsdWVzICovCisjZGVmaW5lIE1DQzFfMzBNSFpfUE9XRVJVUF9TRUxFQ1QJKDEgPDwgMTQpCisjZGVmaW5lIE1DQzFfRElWOQkJCSgxIDw8IDEzKQorI2RlZmluZSBNQ0MxX0VUSE1JUFNfUE9XRVJVUF9TRUxFQ1QJKDEgPDwgMTEpCisjZGVmaW5lIE1DQzFfVVNCX1BPV0VSVVBfU0VMRUNUCQkoMSA8PCAxKQorI2RlZmluZSBNQ0MxX0NMT0NLMTA4X1BPV0VSVVBfU0VMRUNUCSgxIDw8IDApCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgY2xvY2sgc2VsZWN0ICovCisjZGVmaW5lIE1DQzFfVVNCX0NMT0NLX0hJR0hfWgkJKDAgPDwgNCkKKyNkZWZpbmUgTUNDMV9VU0JfQ0xPQ0tfNDhNSFoJCSgxIDw8IDQpCisjZGVmaW5lIE1DQzFfVVNCX0NMT0NLXzI0TUhaCQkoMiA8PCA0KQorI2RlZmluZSBNQ0MxX1VTQl9DTE9DS182TUhaCQkoMyA8PCA0KQorCisjZGVmaW5lIE1DQzFfQ09ORklHCShNQ0MxXzMwTUhaX1BPV0VSVVBfU0VMRUNUIHwJCVwKKwkJCSBNQ0MxX0RJVjkgfAkJCQlcCisJCQkgTUNDMV9FVEhNSVBTX1BPV0VSVVBfU0VMRUNUIHwJCVwKKwkJCSBNQ0MxX1VTQl9QT1dFUlVQX1NFTEVDVCB8CQlcCisJCQkgTUNDMV9DTE9DSzEwOF9QT1dFUlVQX1NFTEVDVCkKKworLyogbWlzY19jbGtfY3RsMiB2YWx1ZXMgKi8KKyNkZWZpbmUgTUNDMl9HTUlJX0dDTEtfVE9fUEFECQkoMSA8PCAzMSkKKyNkZWZpbmUgTUNDMl9FVEhFUjEyNV8wX0NMT0NLX1NFTEVDVAkoMSA8PCAyOSkKKyNkZWZpbmUgTUNDMl9STUlJXzBfQ0xPQ0tfU0VMRUNUCSgxIDw8IDI4KQorI2RlZmluZSBNQ0MyX0dNSUlfVFgwX0NMT0NLX1NFTEVDVAkoMSA8PCAyNykKKyNkZWZpbmUgTUNDMl9HTUlJX1JYMF9DTE9DS19TRUxFQ1QJKDEgPDwgMjYpCisjZGVmaW5lIE1DQzJfRVRIRVIxMjVfMV9DTE9DS19TRUxFQ1QJKDEgPDwgMjQpCisjZGVmaW5lIE1DQzJfUk1JSV8xX0NMT0NLX1NFTEVDVAkoMSA8PCAyMykKKyNkZWZpbmUgTUNDMl9HTUlJX1RYMV9DTE9DS19TRUxFQ1QJKDEgPDwgMjIpCisjZGVmaW5lIE1DQzJfR01JSV9SWDFfQ0xPQ0tfU0VMRUNUCSgxIDw8IDIxKQorI2RlZmluZSBNQ0MyX0VUSEVSMTI1XzJfQ0xPQ0tfU0VMRUNUCSgxIDw8IDE5KQorI2RlZmluZSBNQ0MyX1JNSUlfMl9DTE9DS19TRUxFQ1QJKDEgPDwgMTgpCisjZGVmaW5lIE1DQzJfR01JSV9UWDJfQ0xPQ0tfU0VMRUNUCSgxIDw8IDE3KQorI2RlZmluZSBNQ0MyX0dNSUlfUlgyX0NMT0NLX1NFTEVDVAkoMSA8PCAxNikKKworI2RlZmluZSBFVEhFUl9DTEtfQ09ORklHCShNQ0MyX0dNSUlfR0NMS19UT19QQUQgfAlcCisJCQkJIE1DQzJfRVRIRVIxMjVfMF9DTE9DS19TRUxFQ1QgfAlcCisJCQkJIE1DQzJfUk1JSV8wX0NMT0NLX1NFTEVDVCB8CVwKKwkJCQkgTUNDMl9HTUlJX1RYMF9DTE9DS19TRUxFQ1QgfAlcCisJCQkJIE1DQzJfR01JSV9SWDBfQ0xPQ0tfU0VMRUNUIHwJXAorCQkJCSBNQ0MyX0VUSEVSMTI1XzFfQ0xPQ0tfU0VMRUNUIHwJXAorCQkJCSBNQ0MyX1JNSUlfMV9DTE9DS19TRUxFQ1QgfAlcCisJCQkJIE1DQzJfR01JSV9UWDFfQ0xPQ0tfU0VMRUNUIHwJXAorCQkJCSBNQ0MyX0dNSUlfUlgxX0NMT0NLX1NFTEVDVCB8CVwKKwkJCQkgTUNDMl9FVEhFUjEyNV8yX0NMT0NLX1NFTEVDVCB8CVwKKwkJCQkgTUNDMl9STUlJXzJfQ0xPQ0tfU0VMRUNUIHwJXAorCQkJCSBNQ0MyX0dNSUlfVFgyX0NMT0NLX1NFTEVDVCB8CVwKKwkJCQkgTUNDMl9HTUlJX1JYMl9DTE9DS19TRUxFQ1QpCisKKy8qIG1pc2NfY2xrX2N0bDIgZGVmaW5pdGlvbnMgZm9yIEdhaWEgKi8KKyNkZWZpbmUgRlNYNEFfUkVGX1NFTEVDVAkJKDEgPDwgMTYpCisjZGVmaW5lIEZTWDRCX1JFRl9TRUxFQ1QJCSgxIDw8IDE3KQorI2RlZmluZSBGU1g0Q19SRUZfU0VMRUNUCQkoMSA8PCAxOCkKKyNkZWZpbmUgRERSX1BMTF9SRUZfU0VMRUNUCQkoMSA8PCAxOSkKKyNkZWZpbmUgTUlQU19QTExfUkVGX1NFTEVDVAkJKDEgPDwgMjApCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgUUFNIGZyZXF1ZW5jeSBzZWxlY3QgcmVnaXN0ZXIgRlM0MzJYNEE0X1FBTV9DVEwgKi8KKyNkZWZpbmUgUUFNX0ZTX1NESVZfU0hJRlQJCTI5CisjZGVmaW5lIFFBTV9GU19NRF9TSElGVAkJCTI0CisjZGVmaW5lIFFBTV9GU19NRF9NQVNLCQkJMHgxZgkvKiBDdXQgZG93biB0byA1IGJpdHMgKi8KKyNkZWZpbmUgUUFNX0ZTX1BFX1NISUZUCQkJOAorCisjZGVmaW5lIFFBTV9GU19ESVNBQkxFX0RJVklERV9CWV8zCQkoMSA8PCA1KQorI2RlZmluZSBRQU1fRlNfRU5BQkxFX1BST0dSQU0JCQkoMSA8PCA0KQorI2RlZmluZQlRQU1fRlNfRU5BQkxFX09VVFBVVAkJCSgxIDw8IDMpCisjZGVmaW5lCVFBTV9GU19TRUxFQ1RfVEVTVF9CWVBBU1MJCSgxIDw8IDIpCisjZGVmaW5lCVFBTV9GU19ESVNBQkxFX0RJR0lUQUxfU1RBTkRCWQkJKDEgPDwgMSkKKyNkZWZpbmUgUUFNX0ZTX0NIT09TRV9GUwkJCSgxIDw8IDApCisKKy8qIERlZmluaXRpb25zIGZvciBmczQzMng0YV9jdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUUFNX0ZTX05TRElWXzU0TUhaCQkJKDEgPDwgMikKKworLyogRGVmaW5pdGlvbnMgZm9yIGJjbTFfdXNiMl9jdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQkNNMV9VU0IyX0NUTF9CSVNUT0sJCQkJKDEgPDwgMTEpCisjZGVmaW5lIEJDTTFfVVNCMl9DVExfUE9SVDJfU0hJRlRfSksJCQkoMSA8PCA3KQorI2RlZmluZSBCQ00xX1VTQjJfQ1RMX1BPUlQxX1NISUZUX0pLCQkJKDEgPDwgNikKKyNkZWZpbmUgQkNNMV9VU0IyX0NUTF9QT1JUMl9GQVNUX0VER0UJCQkoMSA8PCA1KQorI2RlZmluZSBCQ00xX1VTQjJfQ1RMX1BPUlQxX0ZBU1RfRURHRQkJCSgxIDw8IDQpCisjZGVmaW5lIEJDTTFfVVNCMl9DVExfRUhDSV9QUlRfUFdSX0FDVElWRV9ISUdICQkoMSA8PCAxKQorI2RlZmluZSBCQ00xX1VTQjJfQ1RMX0FQUF9QUlRfT1ZSQ1VSX0lOX0FDVElWRV9ISUdICSgxIDw8IDApCisKKy8qIERlZmluaXRpb25zIGZvciBjcnRfc3BhcmUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1JUX1NQQVJFX1BPUlQyX1NISUZUX0pLCQkJKDEgPDwgMjEpCisjZGVmaW5lIENSVF9TUEFSRV9QT1JUMV9TSElGVF9KSwkJCSgxIDw8IDIwKQorI2RlZmluZSBDUlRfU1BBUkVfUE9SVDJfRkFTVF9FREdFCQkJKDEgPDwgMTkpCisjZGVmaW5lIENSVF9TUEFSRV9QT1JUMV9GQVNUX0VER0UJCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ1JUX1NQQVJFX0RJVklERV9CWV85X0ZST01fNDMyCQkJKDEgPDwgMTcpCisjZGVmaW5lIENSVF9TUEFSRV9VU0JfRElWSURFX0JZXzkJCQkoMSA8PCAxNikKKworLyogRGVmaW5pdGlvbnMgZm9yIHVzYjJfc3RidXNfb2JjIHJlZ2lzdGVyICovCisjZGVmaW5lIFVTQl9TVEJVU19PQkNfU1RPUkUzMl9MT0FEMzIJCQkweDMKKworLyogRGVmaW5pdGlvbnMgZm9yIHVzYjJfc3RidXNfbWVzc19zaXplIHJlZ2lzdGVyICovCisjZGVmaW5lIFVTQjJfU1RCVVNfTUVTU19TSVpFXzIJCQkJMHgxCS8qIDIgcGFja2V0cyAqLworCisvKiBEZWZpbml0aW9ucyBmb3IgdXNiMl9zdGJ1c19jaHVua19zaXplIHJlZ2lzdGVyICovCisjZGVmaW5lIFVTQjJfU1RCVVNfQ0hVTktfU0laRV8yCQkJCTB4MQkvKiAyIHBhY2tldHMgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIHVzYjJfc3RyYXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNCMl9TVFJBUF9IRlJFUV9TRUxFQ1QJCQkJMHgxCisKKy8qCisgKiBVU0IgSG9zdCBSZXNvdXJjZSBEZWZpbml0aW9uCisgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlaGNpX3Jlc291cmNlc1tdID0geworCXsKKwkJLnBhcmVudCA9ICZhc2ljX3Jlc291cmNlLAorCQkuc3RhcnQgID0gMCwKKwkJLmVuZCAgICA9IDB4ZmYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICA9IGlycV91c2JlaGNpLAorCQkuZW5kICAgID0gaXJxX3VzYmVoY2ksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHU2NCBlaGNpX2RtYW1hc2sgPSAweGZmZmZmZmZmVUxMOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlaGNpX2RldmljZSA9IHsKKwkubmFtZSA9ICJwb3dlcnR2LWVoY2kiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSA9IGVoY2lfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayA9ICZlaGNpX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb2hjaV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5wYXJlbnQgPSAmYXNpY19yZXNvdXJjZSwKKwkJLnN0YXJ0ICA9IDAsCisJCS5lbmQgICAgPSAweGZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgPSBpcnFfdXNib2hjaSwKKwkJLmVuZCAgICA9IGlycV91c2JvaGNpLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMTDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb2hjaV9kZXZpY2UgPSB7CisJLm5hbWUgPSAicG93ZXJ0di1vaGNpIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gMiwKKwkucmVzb3VyY2UgPSBvaGNpX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmb2hjaV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCit9OworCitzdGF0aWMgdW5zaWduZWQgdXNiX3VzZXJzOworc3RhdGljIERFRklORV9TUElOTE9DSyh1c2JfcmVnc19sb2NrKTsKKworLyoKKyAqCisgKiBmc191cGRhdGUgLSBzZXQgZnJlcXVlbmN5IHN5bnRoZXNpemVyIGZvciBVU0IKKyAqIEBwZV9iaXRzCQlQaGFzZSB0YXAgc2V0dGluZworICogQG1kX2JpdHMJCUNvYXJzZSBzZWxlY3RvciBidXMgZm9yIGFsZ29yaXRobSBvZiBwaGFzZSB0YXAKKyAqIEBzZGl2X2JpdHMJCU91dHB1dCBkaXZpZGVyIHNldHRpbmcKKyAqIEBkaXNhYmxlX2Rpdl9ieV8zCUVpdGhlciBRQU1fRlNfRElTQUJMRV9ESVZJREVfQllfMyBvciB6ZXJvCisgKiBAc3RhbmRieQkJRWl0aGVyIFFBTV9GU19ESVNBQkxFX0RJR0lUQUxfU1RBTkRCWSBvciB6ZXJvCisgKgorICogUUFNIGZyZXF1ZW5jeSBzZWxlY3Rpb24gY29kZSwgd2hpY2ggYWZmZWN0cyB0aGUgZnJlcXVlbmN5IGF0IHdoaWNoIFVTQgorICogcnVucy4gVGhlIGZyZXF1ZW5jeSBpcyBjYWxjdWxhdGVkIGFzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJeMTUgKiBuZGl2ICogRmluCisgKiBGb3V0ID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgKHNkaXYgKiAoaXBlICogKDEgKyBtZC8zMikgLSAoaXBlIC0gMl4xNSkqKDEgKyAobWQgKyAxKS8zMikpKQorICogd2hlcmU6CisgKiBGaW4JCTU0IE1IegorICogbmRpdgkJUUFNX0ZTX05TRElWXzU0TUhaID8gOCA6IDE2CisgKiBzZGl2CQkxIDw8IChzZGl2X2JpdHMgKyAxKQorICogaXBlCQlTYW1lIGFzIHBlX2JpdHMKKyAqIG1kCQlBIGZpdmUtYml0LCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgKHJhbmdlIFstMTYsIDE1XSksIHdoaWNoCisgKgkJaXMgdGhlIGxvd2VyIDUgYml0cyBvZiBtZF9iaXRzLgorICovCitzdGF0aWMgdm9pZCBmc191cGRhdGUodTMyIHBlX2JpdHMsIGludCBtZF9iaXRzLCB1MzIgc2Rpdl9iaXRzLAorCXUzMiBkaXNhYmxlX2Rpdl9ieV8zLCB1MzIgc3RhbmRieSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKChzZGl2X2JpdHMgPDwgUUFNX0ZTX1NESVZfU0hJRlQpIHwKKwkJKChtZF9iaXRzICYgUUFNX0ZTX01EX01BU0spIDw8IFFBTV9GU19NRF9TSElGVCkgfAorCQkocGVfYml0cyA8PCBRQU1fRlNfUEVfU0hJRlQpIHwKKwkJUUFNX0ZTX0VOQUJMRV9PVVRQVVQgfAorCQlzdGFuZGJ5IHwKKwkJZGlzYWJsZV9kaXZfYnlfMyk7CisJYXNpY193cml0ZSh2YWwsIGZzNDMyeDRiNF91c2JfY3RsKTsKKwlhc2ljX3dyaXRlKHZhbCB8IFFBTV9GU19FTkFCTEVfUFJPR1JBTSwgZnM0MzJ4NGI0X3VzYl9jdGwpOworCWFzaWNfd3JpdGUodmFsIHwgUUFNX0ZTX0VOQUJMRV9QUk9HUkFNIHwgUUFNX0ZTX0NIT09TRV9GUywKKwkJZnM0MzJ4NGI0X3VzYl9jdGwpOworfQorCisvKgorICogdXNiX2V5ZV9jb25maWd1cmUgLSBmb3Igb3B0aW1pemluZyB0aGUgc2hhcGUgVVNCIGV5ZSB3YXZlZm9ybQorICogQHNldDoJQml0cyB0byBzZXQgaW4gdGhlIHJlZ2lzdGVyCisgKiBAY2xlYXI6CUJpdHMgdG8gY2xlYXIgaW4gdGhlIHJlZ2lzdGVyOyBlYWNoIGJpdCB3aXRoIGEgb25lIHdpbGwKKyAqCQliZSBzZXQgaW4gdGhlIHJlZ2lzdGVyLCB6ZXJvIGJpdHMgd2lsbCBub3QgYmUgbW9kaWZpZWQKKyAqLworc3RhdGljIHZvaWQgdXNiX2V5ZV9jb25maWd1cmUodTMyIHNldCwgdTMyIGNsZWFyKQoreworCXUzMiBvbGQ7CisKKwlvbGQgPSBhc2ljX3JlYWQoY3J0X3NwYXJlKTsKKwlvbGQgfD0gc2V0OworCW9sZCAmPSB+Y2xlYXI7CisJYXNpY193cml0ZShvbGQsIGNydF9zcGFyZSk7Cit9CisKKy8qCisgKiBwbGF0Zm9ybV9jb25maWd1cmVfdXNiIC0gdXNiIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gcGxhdGZvcm0gdHlwZS4KKyAqLworc3RhdGljIHZvaWQgcGxhdGZvcm1fY29uZmlndXJlX3VzYih2b2lkKQoreworCXUzMiBiY20xX3VzYjJfY3RsX3ZhbHVlOworCWVudW0gYXNpY190eXBlIGFzaWNfdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYl9yZWdzX2xvY2ssIGZsYWdzKTsKKwl1c2JfdXNlcnMrKzsKKworCWlmICh1c2JfdXNlcnMgIT0gMSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JfcmVnc19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlhc2ljX3R5cGUgPSBwbGF0Zm9ybV9nZXRfYXNpYygpOworCisJc3dpdGNoIChhc2ljX3R5cGUpIHsKKwljYXNlIEFTSUNfWkVVUzoKKwkJZnNfdXBkYXRlKDB4MDAwMCwgLTE1LCAweDAyLCAwLCAwKTsKKwkJYmNtMV91c2IyX2N0bF92YWx1ZSA9IEJDTTFfVVNCMl9DVExfRUhDSV9QUlRfUFdSX0FDVElWRV9ISUdIIHwKKwkJCUJDTTFfVVNCMl9DVExfQVBQX1BSVF9PVlJDVVJfSU5fQUNUSVZFX0hJR0g7CisJCWJyZWFrOworCisJY2FzZSBBU0lDX0NST05VUzoKKwljYXNlIEFTSUNfQ1JPTlVTTElURToKKwkJdXNiX2V5ZV9jb25maWd1cmUoMCwgQ1JUX1NQQVJFX1VTQl9ESVZJREVfQllfOSk7CisJCWZzX3VwZGF0ZSgweDgwMDAsIC0xNCwgMHgwMywgUUFNX0ZTX0RJU0FCTEVfRElWSURFX0JZXzMsCisJCQlRQU1fRlNfRElTQUJMRV9ESUdJVEFMX1NUQU5EQlkpOworCQliY20xX3VzYjJfY3RsX3ZhbHVlID0gQkNNMV9VU0IyX0NUTF9FSENJX1BSVF9QV1JfQUNUSVZFX0hJR0ggfAorCQkJQkNNMV9VU0IyX0NUTF9BUFBfUFJUX09WUkNVUl9JTl9BQ1RJVkVfSElHSDsKKwkJYnJlYWs7CisKKwljYXNlIEFTSUNfQ0FMTElPUEU6CisJCWZzX3VwZGF0ZSgweDAwMDAsIC0xNSwgMHgwMiwgUUFNX0ZTX0RJU0FCTEVfRElWSURFX0JZXzMsCisJCQlRQU1fRlNfRElTQUJMRV9ESUdJVEFMX1NUQU5EQlkpOworCisJCXN3aXRjaCAocGxhdGZvcm1fZ2V0X2ZhbWlseSgpKSB7CisJCWNhc2UgRkFNSUxZXzE1MDBWWkU6CisJCQlicmVhazsKKworCQljYXNlIEZBTUlMWV8xNTAwVlpGOgorCQkJdXNiX2V5ZV9jb25maWd1cmUoQ1JUX1NQQVJFX1BPUlQyX1NISUZUX0pLIHwKKwkJCQlDUlRfU1BBUkVfUE9SVDFfU0hJRlRfSksgfAorCQkJCUNSVF9TUEFSRV9QT1JUMl9GQVNUX0VER0UgfAorCQkJCUNSVF9TUEFSRV9QT1JUMV9GQVNUX0VER0UsIDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXVzYl9leWVfY29uZmlndXJlKENSVF9TUEFSRV9QT1JUMl9TSElGVF9KSyB8CisJCQkJQ1JUX1NQQVJFX1BPUlQxX1NISUZUX0pLLCAwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYmNtMV91c2IyX2N0bF92YWx1ZSA9IEJDTTFfVVNCMl9DVExfQklTVE9LIHwKKwkJCUJDTTFfVVNCMl9DVExfRUhDSV9QUlRfUFdSX0FDVElWRV9ISUdIIHwKKwkJCUJDTTFfVVNCMl9DVExfQVBQX1BSVF9PVlJDVVJfSU5fQUNUSVZFX0hJR0g7CisJCWJyZWFrOworCisJY2FzZSBBU0lDX0dBSUE6CisJCWZzX3VwZGF0ZSgweDgwMDAsIC0xNCwgMHgwMywgUUFNX0ZTX0RJU0FCTEVfRElWSURFX0JZXzMsCisJCQlRQU1fRlNfRElTQUJMRV9ESUdJVEFMX1NUQU5EQlkpOworCQliY20xX3VzYjJfY3RsX3ZhbHVlID0gQkNNMV9VU0IyX0NUTF9CSVNUT0sgfAorCQkJQkNNMV9VU0IyX0NUTF9FSENJX1BSVF9QV1JfQUNUSVZFX0hJR0ggfAorCQkJQkNNMV9VU0IyX0NUTF9BUFBfUFJUX09WUkNVUl9JTl9BQ1RJVkVfSElHSDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoIlVua25vd24gQVNJQyB0eXBlOiAlZFxuIiwgYXNpY190eXBlKTsKKwkJYmNtMV91c2IyX2N0bF92YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIHR1cm4gb24gVVNCIHBvd2VyICovCisJYXNpY193cml0ZSgwLCB1c2IyX3N0cmFwKTsKKwkvKiBFbmFibGUgYWxsIE9IQ0kgaW50ZXJydXB0cyAqLworCWFzaWNfd3JpdGUoYmNtMV91c2IyX2N0bF92YWx1ZSwgdXNiMl9jb250cm9sKTsKKwkvKiB1c2IyX3N0YnVzX29iYyBzdG9yZTMyL2xvYWQzMiAqLworCWFzaWNfd3JpdGUoVVNCX1NUQlVTX09CQ19TVE9SRTMyX0xPQUQzMiwgdXNiMl9zdGJ1c19vYmMpOworCS8qIHVzYjJfc3RidXNfbWVzc19zaXplIDIgcGFja2V0cyAqLworCWFzaWNfd3JpdGUoVVNCMl9TVEJVU19NRVNTX1NJWkVfMiwgdXNiMl9zdGJ1c19tZXNzX3NpemUpOworCS8qIHVzYjJfc3RidXNfY2h1bmtfc2l6ZSAyIHBhY2tldHMgKi8KKwlhc2ljX3dyaXRlKFVTQjJfU1RCVVNfQ0hVTktfU0laRV8yLCB1c2IyX3N0YnVzX2NodW5rX3NpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYl9yZWdzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcGxhdGZvcm1fdW5jb25maWd1cmVfdXNiKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JfcmVnc19sb2NrLCBmbGFncyk7CisJdXNiX3VzZXJzLS07CisJaWYgKHVzYl91c2VycyA9PSAwKQorCQlhc2ljX3dyaXRlKFVTQjJfU1RSQVBfSEZSRVFfU0VMRUNULCB1c2IyX3N0cmFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JfcmVnc19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIFVTQiBFSENJIGludGVyZmFjZQorICovCit2b2lkIHBsYXRmb3JtX2NvbmZpZ3VyZV91c2JfZWhjaSgpCit7CisJcGxhdGZvcm1fY29uZmlndXJlX3VzYigpOworfQorRVhQT1JUX1NZTUJPTChwbGF0Zm9ybV9jb25maWd1cmVfdXNiX2VoY2kpOworCisvKgorICogU2V0IHVwIHRoZSBVU0IgT0hDSSBpbnRlcmZhY2UKKyAqLwordm9pZCBwbGF0Zm9ybV9jb25maWd1cmVfdXNiX29oY2koKQoreworCXBsYXRmb3JtX2NvbmZpZ3VyZV91c2IoKTsKK30KK0VYUE9SVF9TWU1CT0wocGxhdGZvcm1fY29uZmlndXJlX3VzYl9vaGNpKTsKKworLyoKKyAqIFNodXQgdGhlIFVTQiBFSENJIGludGVyZmFjZSBkb3duCisgKi8KK3ZvaWQgcGxhdGZvcm1fdW5jb25maWd1cmVfdXNiX2VoY2koKQoreworCXBsYXRmb3JtX3VuY29uZmlndXJlX3VzYigpOworfQorRVhQT1JUX1NZTUJPTChwbGF0Zm9ybV91bmNvbmZpZ3VyZV91c2JfZWhjaSk7CisKKy8qCisgKiBTaHV0IHRoZSBVU0IgT0hDSSBpbnRlcmZhY2UgZG93bgorICovCit2b2lkIHBsYXRmb3JtX3VuY29uZmlndXJlX3VzYl9vaGNpKCkKK3sKKwlwbGF0Zm9ybV91bmNvbmZpZ3VyZV91c2IoKTsKK30KK0VYUE9SVF9TWU1CT0wocGxhdGZvcm1fdW5jb25maWd1cmVfdXNiX29oY2kpOworCisvKioKKyAqIHBsYXRmb3JtX2RldmljZXNfaW5pdCAtIHNldHMgdXAgVVNCIGRldmljZSByZXNvdXJzZS4KKyAqLworaW50IF9faW5pdCBwbGF0Zm9ybV91c2JfZGV2aWNlc19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiplaGNpX2RldiwKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqb2hjaV9kZXYpCit7CisJKmVoY2lfZGV2ID0gJmVoY2lfZGV2aWNlOworCWVoY2lfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gYXNpY19yZWdfcGh5c19hZGRyKGVoY2lfaGNhcGJhc2UpOworCWVoY2lfcmVzb3VyY2VzWzBdLmVuZCArPSBlaGNpX3Jlc291cmNlc1swXS5zdGFydDsKKworCSpvaGNpX2RldiA9ICZvaGNpX2RldmljZTsKKwlvaGNpX3Jlc291cmNlc1swXS5zdGFydCA9IGFzaWNfcmVnX3BoeXNfYWRkcihvaGNpX2hjX3JldmlzaW9uKTsKKwlvaGNpX3Jlc291cmNlc1swXS5lbmQgKz0gb2hjaV9yZXNvdXJjZXNbMF0uc3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L3Bvd2VydHZfc2V0dXAuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L3Bvd2VydHZfc2V0dXAuYwppbmRleCBhZjJjYWUwLi4zOTMzYzM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9wb3dlcnR2X3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvcG93ZXJ0dl9zZXR1cC5jCkBAIC0xOTksMTQgKzE5OSw4IEBACiAJCW15X3JlZ3MuY3AwX3N0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCk7CiAJfQogCi0jaWZkZWYgQ09ORklHX0RJQUdOT1NUSUNTCi0JZmFpbHVyZV9yZXBvcnQoKGNoYXIgKikgY2F1c2Vfc3RyaW5nLAotCQloYXZlX2RpZV9yZWdzID8gJmRpZV9yZWdzIDogJm15X3JlZ3MpOwotCWhhdmVfZGllX3JlZ3MgPSBmYWxzZTsKLSNlbHNlCiAJcHJfY3JpdCgiSSdtIGZlZWxpbmcgYSBiaXQgc2xlZXB5LiBobW1tbW0uLi4gcGVyaGFwcyBhIG5hcCB3b3VsZC4uLiAiCiAJCSJ6enp6Li4uIFxuIik7Ci0jZW5kaWYKIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYjUzMi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9yYjUzMi9NYWtlZmlsZQppbmRleCA4ZjBiNmI2Li5lZmRlY2RiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmI1MzIvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3JiNTMyL01ha2VmaWxlCkBAIC0zLDUgKzMsMyBAQAogIwogCiBvYmoteQkgKz0gaXJxLm8gdGltZS5vIHNldHVwLm8gc2VyaWFsLm8gcHJvbS5vIGdwaW8ubyBkZXZpY2VzLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYjUzMi9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9yYjUzMi9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWVjNDVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3JiNTMyL1BsYXRmb3JtCkBAIC0wLDAgKzEsNyBAQAorIworIyBSb3V0ZXJib2FyZCA1MzIKKyMKK3BsYXRmb3JtLSQoQ09ORklHX01JS1JPVElLX1JCNTMyKQkrPSByYjUzMi8KK2NmbGFncy0kKENPTkZJR19NSUtST1RJS19SQjUzMikJCSs9CQkJCVwKKwkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQKK2xvYWQtJChDT05GSUdfTUlLUk9USUtfUkI1MzIpCQkrPSAweGZmZmZmZmZmODAxMDEwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9NYWtlZmlsZQppbmRleCA0MTZiMThmLi5jYzUzODQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjIvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL01ha2VmaWxlCkBAIC05LDUgKzksMyBAQAogb2JqLSQoQ09ORklHX1NHSV9JUDIyKSArPSBpcDIyLWJlcnIubwogb2JqLSQoQ09ORklHX1NHSV9JUDI4KSArPSBpcDI4LWJlcnIubwogb2JqLSQoQ09ORklHX0VJU0EpCSs9IGlwMjItZWlzYS5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvUGxhdGZvcm0gYi9hcmNoL21pcHMvc2dpLWlwMjIvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhNGI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9QbGF0Zm9ybQpAQCAtMCwwICsxLDM0IEBACisjCisjIFNHSSBJUDIyIChJbmR5L0luZGlnbzIpCisjCisjIFNldCB0aGUgbG9hZCBhZGRyZXNzIHRvID49IDB4ZmZmZmZmZmY4ODA2OTAwMCBpZiB5b3Ugd2FudCB0byBsZWF2ZSBzcGFjZSBmb3IKKyMgc3ltbW9uLCAweGZmZmZmZmZmODAwMDIwMDAgZm9yIHByb2R1Y3Rpb24ga2VybmVscy4gIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdAorIyBiZSBhbGlnbmVkIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGtlcm5lbCBzdGFjayBzaXplIG9yIHRoZSBoYW5kbGluZyBvZiB0aGUKKyMgY3VycmVudCB2YXJpYWJsZSB3aWxsIGJyZWFrIHNvIGZvciA2NC1iaXQga2VybmVscyB3ZSBoYXZlIHRvIHJhaXNlIHRoZSBzdGFydAorIyBhZGRyZXNzIGJ5IDhrYi4KKyMKK3BsYXRmb3JtLSQoQ09ORklHX1NHSV9JUDIyKQkJKz0gc2dpLWlwMjIvCitjZmxhZ3MtJChDT05GSUdfU0dJX0lQMjIpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDIyCitpZmRlZiBDT05GSUdfMzJCSVQKK2xvYWQtJChDT05GSUdfU0dJX0lQMjIpCQkrPSAweGZmZmZmZmZmODgwMDIwMDAKK2VuZGlmCitpZmRlZiBDT05GSUdfNjRCSVQKK2xvYWQtJChDT05GSUdfU0dJX0lQMjIpCQkrPSAweGZmZmZmZmZmODgwMDQwMDAKK2VuZGlmCisKKyMKKyMgU0dJIElQMjggKEluZGlnbzIgUjEwaykKKyMKKyMgU2V0IHRoZSBsb2FkIGFkZHJlc3MgdG8gPj0gMHhhODAwMDAwMDIwMDgwMDAwIGlmIHlvdSB3YW50IHRvIGxlYXZlIHNwYWNlIGZvcgorIyBzeW1tb24sIDB4YTgwMDAwMDAyMDAwNDAwMCBmb3IgcHJvZHVjdGlvbiBrZXJuZWxzID8gIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdAorIyBiZSAxNmtiIGFsaWduZWQgb3IgdGhlIGhhbmRsaW5nIG9mIHRoZSBjdXJyZW50IHZhcmlhYmxlIHdpbGwgYnJlYWsuCisjIFNpbXBsaWZpZWQ6IHdoYXQgSVAyMiBkb2VzIGF0IDEyOE1CKyBpbiBrc2VnTiwgSVAyOCBkb2VzIGF0IDUxMk1CKyBpbiB4a3BoeXMKKyMKK2lmZGVmIENPTkZJR19TR0lfSVAyOAorICBpZmVxICgkKGNhbGwgY2Mtb3B0aW9uLXluLC1tcjEway1jYWNoZS1iYXJyaWVyPXN0b3JlKSwgbikKKyAgICAgICQoZXJyb3IgZ2NjIGRvZXNuJ3Qgc3VwcG9ydCBuZWVkZWQgb3B0aW9uIC1tcjEway1jYWNoZS1iYXJyaWVyPXN0b3JlKQorICBlbmRpZgorZW5kaWYKK3BsYXRmb3JtLSQoQ09ORklHX1NHSV9JUDI4KQkJKz0gc2dpLWlwMjIvCitjZmxhZ3MtJChDT05GSUdfU0dJX0lQMjgpCSs9IC1tcjEway1jYWNoZS1iYXJyaWVyPXN0b3JlIC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI4Citsb2FkLSQoQ09ORklHX1NHSV9JUDI4KQkJKz0gMHhhODAwMDAwMDIwMDA0MDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvTWFrZWZpbGUgYi9hcmNoL21pcHMvc2dpLWlwMjcvTWFrZWZpbGUKaW5kZXggMzFmNDkzMS4uMWYyOWU3NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9NYWtlZmlsZQpAQCAtOCw1ICs4LDMgQEAKIAogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gaXAyNy1jb25zb2xlLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBpcDI3LXNtcC5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvUGxhdGZvcm0gYi9hcmNoL21pcHMvc2dpLWlwMjcvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiOWMyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9QbGF0Zm9ybQpAQCAtMCwwICsxLDE5IEBACisjCisjIFNHSS1JUDI3IChPcmlnaW4yMDAvMjAwMCkKKyMKKyMgU2V0IHRoZSBsb2FkIGFkZHJlc3MgdG8gPj0gMHhjMDAwMDAwMDAwMzAwMDAwIGlmIHlvdSB3YW50IHRvIGxlYXZlIHNwYWNlIGZvcgorIyBzeW1tb24sIDB4YzAwMDAwMDAwMDAxYzAwMCBmb3IgcHJvZHVjdGlvbiBrZXJuZWxzLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZSBtdXN0CisjIGJlIDE2a2IgYWxpZ25lZCBvciB0aGUgaGFuZGxpbmcgb2YgdGhlIGN1cnJlbnQgdmFyaWFibGUgd2lsbCBicmVhay4KKyMKK2lmZGVmIENPTkZJR19TR0lfSVAyNworcGxhdGZvcm0tJChDT05GSUdfU0dJX0lQMjcpCSs9IHNnaS1pcDI3LworY2ZsYWdzLSQoQ09ORklHX1NHSV9JUDI3KQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNworaWZkZWYgQ09ORklHX01BUFBFRF9LRVJORUwKK2xvYWQtJChDT05GSUdfU0dJX0lQMjcpCQkrPSAweGMwMDAwMDAwNDAwMWMwMDAKK09CSkNPUFlGTEFHUwkJCTo9IC0tY2hhbmdlLWFkZHJlc3Nlcz0weDNmZmZmZmZmODAwMDAwMDAKK2RhdGFvZmZzZXQtJChDT05GSUdfU0dJX0lQMjcpCSs9IDB4MDEwMDAwMDAKK2Vsc2UKK2xvYWQtJChDT05GSUdfU0dJX0lQMjcpCQkrPSAweGE4MDAwMDAwMDAwMWMwMDAKK09CSkNPUFlGTEFHUwkJCTo9IC0tY2hhbmdlLWFkZHJlc3Nlcz0weDU3ZmZmZmZmODAwMDAwMDAKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjcta2xjb25maWcuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWtsY29uZmlnLmMKaW5kZXggZGQ4MzBiMy4uN2FmZTE0NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjcta2xjb25maWcuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1rbGNvbmZpZy5jCkBAIC00OCw3ICs0OCw3IEBACiAJcmV0dXJuIGZpbmRfY29tcG9uZW50KGJyZCwgKGtsaW5mb190ICopTlVMTCwgc3RydWN0X3R5cGUpOwogfQogCi1sYm9hcmRfdCAqIGZpbmRfbGJvYXJkKGxib2FyZF90ICpzdGFydCwgdW5zaWduZWQgY2hhciBicmRfdHlwZSkKK2xib2FyZF90ICpmaW5kX2xib2FyZChsYm9hcmRfdCAqc3RhcnQsIHVuc2lnbmVkIGNoYXIgYnJkX3R5cGUpCiB7CiAJLyogU2VhcmNoIGFsbCBib2FyZHMgc3RvcmVkIG9uIHRoaXMgbm9kZS4gKi8KIAl3aGlsZSAoc3RhcnQpIHsKQEAgLTYwLDcgKzYwLDcgQEAKIAlyZXR1cm4gKGxib2FyZF90ICopTlVMTDsKIH0KIAotbGJvYXJkX3QgKiBmaW5kX2xib2FyZF9jbGFzcyhsYm9hcmRfdCAqc3RhcnQsIHVuc2lnbmVkIGNoYXIgYnJkX3R5cGUpCitsYm9hcmRfdCAqZmluZF9sYm9hcmRfY2xhc3MobGJvYXJkX3QgKnN0YXJ0LCB1bnNpZ25lZCBjaGFyIGJyZF90eXBlKQogewogCS8qIFNlYXJjaCBhbGwgYm9hcmRzIHN0b3JlZCBvbiB0aGlzIG5vZGUuICovCiAJd2hpbGUgKHN0YXJ0KSB7CkBAIC03OCw3ICs3OCw3IEBACiAJcmV0dXJuIENQVUlEX1RPX0NPTVBBQ1RfTk9ERUlEKGNwdSk7CiB9CiAKLWtsY3B1X3QgKiBuYXNpZF9zbGljZV90b19jcHVpbmZvKG5hc2lkX3QgbmFzaWQsIGludCBzbGljZSkKK2tsY3B1X3QgKm5hc2lkX3NsaWNlX3RvX2NwdWluZm8obmFzaWRfdCBuYXNpZCwgaW50IHNsaWNlKQogewogCWxib2FyZF90ICpicmQ7CiAJa2xjcHVfdCAqYWNwdTsKQEAgLTk3LDcgKzk3LDcgQEAKIAlyZXR1cm4gKGtsY3B1X3QgKilOVUxMOwogfQogCi1rbGNwdV90ICogc25fZ2V0X2NwdWluZm8oY3B1aWRfdCBjcHUpCitrbGNwdV90ICpzbl9nZXRfY3B1aW5mbyhjcHVpZF90IGNwdSkKIHsKIAluYXNpZF90IG5hc2lkOwogCWludCBzbGljZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAzMi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9NYWtlZmlsZQppbmRleCAzMWM5YWExLi42MGYwMjI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3NnaS1pcDMyL01ha2VmaWxlCkBAIC01LDUgKzUsMyBAQAogCiBvYmoteQkrPSBpcDMyLWJlcnIubyBpcDMyLWlycS5vIGlwMzItcGxhdGZvcm0ubyBpcDMyLXNldHVwLm8gaXAzMi1yZXNldC5vIFwKIAkgICBjcmltZS5vIGlwMzItbWVtb3J5Lm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAzMi9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3NnaS1pcDMyL1BsYXRmb3JtCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgU0dJLUlQMzIgKE8yKQorIworIyBTZXQgdGhlIGxvYWQgYWRkcmVzcyB0byA+PSA4MDA2OTAwMCBpZiB5b3Ugd2FudCB0byBsZWF2ZSBzcGFjZSBmb3Igc3ltbW9uLAorIyAweGZmZmZmZmZmODAwMDQwMDAgZm9yIHByb2R1Y3Rpb24ga2VybmVscy4gIE5vdGUgdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBhbGlnbmVkIHRvCisjIGEgbXVsdGlwbGUgb2YgdGhlIGtlcm5lbCBzdGFjayBzaXplIG9yIHRoZSBoYW5kbGluZyBvZiB0aGUgY3VycmVudCB2YXJpYWJsZQorIyB3aWxsIGJyZWFrLgorIworcGxhdGZvcm0tJChDT05GSUdfU0dJX0lQMzIpCSs9IHNnaS1pcDMyLworY2ZsYWdzLSQoQ09ORklHX1NHSV9JUDMyKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAzMgorbG9hZC0kKENPTkZJR19TR0lfSVAzMikJCSs9IDB4ZmZmZmZmZmY4MDAwNDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9zaWJ5dGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlZDJjOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyNyBAQAorIworIyBTaWJ5dGUgU0IxMjUwIC8gQkNNMTQ4MCBmYW1pbHkgb2YgU09DcworIworb2JqLSQoQ09ORklHX1NJQllURV9CQ00xMTJYKQkrPSBzYjEyNTAvCitvYmotJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IGNvbW1vbi8KK29iai0kKENPTkZJR19TSUJZVEVfU0IxMjUwKQkrPSBzYjEyNTAvCitvYmotJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0gY29tbW9uLworb2JqLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSBiY20xNDgwLworb2JqLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSBjb21tb24vCitvYmotJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IGJjbTE0ODAvCitvYmotJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IGNvbW1vbi8KKworIworIyBTaWJ5dGUgQkNNOTExMjB4IChDYXJtZWwpIGJvYXJkCisjIFNpYnl0ZSBCQ005MTEyMEMgKENSaGluZSkgYm9hcmQKKyMgU2lieXRlIEJDTTkxMTI1QyAoQ1Job25lKSBib2FyZAorIyBTaWJ5dGUgQkNNOTExMjVFIChSaG9uZSkgYm9hcmQKKyMgU2lieXRlIFNXQVJNIGJvYXJkCisjIFNpYnl0ZSBCQ005MXg4MCAoQmlnU3VyKSBib2FyZAorIworb2JqLSQoQ09ORklHX1NJQllURV9DQVJNRUwpCSs9IHN3YXJtLworb2JqLSQoQ09ORklHX1NJQllURV9DUkhJTkUpCSs9IHN3YXJtLworb2JqLSQoQ09ORklHX1NJQllURV9DUkhPTkUpCSs9IHN3YXJtLworb2JqLSQoQ09ORklHX1NJQllURV9SSE9ORSkJKz0gc3dhcm0vCitvYmotJChDT05GSUdfU0lCWVRFX1NFTlRPU0EpCSs9IHN3YXJtLworb2JqLSQoQ09ORklHX1NJQllURV9TV0FSTSkJKz0gc3dhcm0vCitvYmotJChDT05GSUdfU0lCWVRFX0JJR1NVUikJKz0gc3dhcm0vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL1BsYXRmb3JtIGIvYXJjaC9taXBzL3NpYnl0ZS9QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFkZmUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9QbGF0Zm9ybQpAQCAtMCwwICsxLDQzIEBACisjCisjIFRoZXNlIGFyZSBhbGwgcmF0aGVyIHNpbWlsYXIgc28gd2UgY29uc2lkZXIgdGhlbSBhIHNpbmdsZSBwbGF0Zm9ybQorIworcGxhdGZvcm0tJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IHNpYnl0ZS8KK3BsYXRmb3JtLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IHNpYnl0ZS8KK3BsYXRmb3JtLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSBzaWJ5dGUvCitwbGF0Zm9ybS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gc2lieXRlLworCisjCisjIFNpYnl0ZSBTQjEyNTAgLyBCQ00xNDgwIGZhbWlseSBvZiBTT0NzCisjCitjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9CQkJCQlcCisJCS1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1zaWJ5dGUJCVwKKwkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTI1MF8xMTJ4X0FMTAorCitwbGF0Zm9ybS0kKENPTkZJR19TSUJZVEVfU0IxMjUwKQkrPSBzaWJ5dGUvCitjZmxhZ3MtJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0JCQkJCVwKKwkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXNpYnl0ZQkJXAorCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xMjUwXzExMnhfQUxMCisKK2NmbGFncy0kKENPTkZJR19TSUJZVEVfQkNNMXg1NSkJKz0JCQkJCVwKKwkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXNpYnl0ZQkJXAorCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xNDgwX0FMTAorCitjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9CQkJCQlcCisJCS1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1zaWJ5dGUJCVwKKwkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTQ4MF9BTEwKKworIworIyBTaWJ5dGUgQkNNOTExMjB4IChDYXJtZWwpIGJvYXJkCisjIFNpYnl0ZSBCQ005MTEyMEMgKENSaGluZSkgYm9hcmQKKyMgU2lieXRlIEJDTTkxMTI1QyAoQ1Job25lKSBib2FyZAorIyBTaWJ5dGUgQkNNOTExMjVFIChSaG9uZSkgYm9hcmQKKyMgU2lieXRlIFNXQVJNIGJvYXJkCisjIFNpYnl0ZSBCQ005MXg4MCAoQmlnU3VyKSBib2FyZAorIworbG9hZC0kKENPTkZJR19TSUJZVEVfQ0FSTUVMKQk6PSAweGZmZmZmZmZmODAxMDAwMDAKK2xvYWQtJChDT05GSUdfU0lCWVRFX0NSSElORSkJOj0gMHhmZmZmZmZmZjgwMTAwMDAwCitsb2FkLSQoQ09ORklHX1NJQllURV9DUkhPTkUpCTo9IDB4ZmZmZmZmZmY4MDEwMDAwMAorbG9hZC0kKENPTkZJR19TSUJZVEVfUkhPTkUpCTo9IDB4ZmZmZmZmZmY4MDEwMDAwMAorbG9hZC0kKENPTkZJR19TSUJZVEVfU0VOVE9TQSkJOj0gMHhmZmZmZmZmZjgwMTAwMDAwCitsb2FkLSQoQ09ORklHX1NJQllURV9TV0FSTSkJOj0gMHhmZmZmZmZmZjgwMTAwMDAwCitsb2FkLSQoQ09ORklHX1NJQllURV9CSUdTVVIpCTo9IDB4ZmZmZmZmZmY4MDEwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL01ha2VmaWxlIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL01ha2VmaWxlCmluZGV4IGYyOTJmN2QuLmNkYzRjNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvTWFrZWZpbGUKQEAgLTEsNSArMSwzIEBACiBvYmoteSA6PSBzZXR1cC5vIGlycS5vIHRpbWUubwogCiBvYmotJChDT05GSUdfU01QKQkJCSs9IHNtcC5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL01ha2VmaWxlCmluZGV4IDRmNjU5ODMuLjM2YWE3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL01ha2VmaWxlCkBAIC0xLDUgKzEsMyBAQAogb2JqLXkgOj0gY2ZlLm8KIG9iai0kKENPTkZJR19TSUJZVEVfQ0ZFX0NPTlNPTEUpCSs9IGNmZV9jb25zb2xlLm8KIG9iai0kKENPTkZJR19TSUJZVEVfVEJQUk9GKQkJKz0gc2JfdGJwcm9mLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL01ha2VmaWxlIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvTWFrZWZpbGUKaW5kZXggMTg5NmY0ZS4uZDNkOTY5ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvTWFrZWZpbGUKQEAgLTIsNSArMiwzIEBACiAKIG9iai0kKENPTkZJR19TTVApCQkJKz0gc21wLm8KIG9iai0kKENPTkZJR19TSUJZVEVfQlVTX1dBVENIRVIpCSs9IGJ1c193YXRjaGVyLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zbmkvTWFrZWZpbGUgYi9hcmNoL21pcHMvc25pL01ha2VmaWxlCmluZGV4IGE3ZGJlZWIuLjlkM2JhZDMyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc25pL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9zbmkvTWFrZWZpbGUKQEAgLTQsNSArNCwzIEBACiAKIG9iai15ICs9IGlycS5vIHJlc2V0Lm8gc2V0dXAubyBhMjByLm8gcm0yMDAubyBwY2ltdC5vIHBjaXQubyB0aW1lLm8KIG9iai0kKENPTkZJR19FSVNBKSArPSBlaXNhLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zbmkvUGxhdGZvcm0gYi9hcmNoL21pcHMvc25pL1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDRhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvc25pL1BsYXRmb3JtCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgU05JIFJNCisjCitwbGF0Zm9ybS0kKENPTkZJR19TTklfUk0pCQkrPSBzbmkvCitjZmxhZ3MtJChDT05GSUdfU05JX1JNKQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJtCitpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KK2xvYWQtJChDT05GSUdfU05JX1JNKQkJKz0gMHhmZmZmZmZmZjgwNjAwMDAwCitlbHNlCitsb2FkLSQoQ09ORklHX1NOSV9STSkJCSs9IDB4ZmZmZmZmZmY4MDAzMDAwMAorZW5kaWYKK2FsbC0kKENPTkZJR19TTklfUk0pCQk6PSAkKENPTVBSRVNTSU9OX0ZOQU1FKS5lY29mZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvTWFrZWZpbGUgYi9hcmNoL21pcHMvdHh4OS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc4N2RhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3R4eDkvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBDb21tb24gVFh4OQorIworb2JqLSQoQ09ORklHX01BQ0hfVFgzOVhYKSAgICAgICs9IGdlbmVyaWMvCitvYmotJChDT05GSUdfTUFDSF9UWDQ5WFgpICAgICAgKz0gZ2VuZXJpYy8KKworIworIyBUb3NoaWJhIEpNUi1UWDM5MjcgYm9hcmQKKyMKK29iai0kKENPTkZJR19UT1NISUJBX0pNUjM5MjcpICArPSBqbXIzOTI3LworCisjCisjIFRvc2hpYmEgUkJUWDQ5WFggYm9hcmRzCisjCitvYmotJChDT05GSUdfVE9TSElCQV9SQlRYNDkyNykgKz0gcmJ0eDQ5MjcvCitvYmotJChDT05GSUdfVE9TSElCQV9SQlRYNDkzOCkgKz0gcmJ0eDQ5MzgvCitvYmotJChDT05GSUdfVE9TSElCQV9SQlRYNDkzOSkgKz0gcmJ0eDQ5MzkvCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9QbGF0Zm9ybSBiL2FyY2gvbWlwcy90eHg5L1BsYXRmb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDFhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvdHh4OS9QbGF0Zm9ybQpAQCAtMCwwICsxLDEwIEBACitwbGF0Zm9ybS0kKENPTkZJR19NQUNIX1RYMzlYWCkJKz0gdHh4OS8KK3BsYXRmb3JtLSQoQ09ORklHX01BQ0hfVFg0OVhYKQkrPSB0eHg5LworCitjZmxhZ3MtJChDT05GSUdfTUFDSF9UWDM5WFgpCSs9CQkJCQlcCisJCS1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDM5eHgKK2NmbGFncy0kKENPTkZJR19NQUNIX1RYNDlYWCkJKz0JCQkJCVwKKwkJIC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDQ5eHgKKworbG9hZC0kKENPTkZJR19NQUNIX1RYMzlYWCkgICAgICArPSAweGZmZmZmZmZmODAwNTAwMDAKK2xvYWQtJChDT05GSUdfTUFDSF9UWDQ5WFgpICAgICAgKz0gMHhmZmZmZmZmZjgwMTAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL01ha2VmaWxlIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9NYWtlZmlsZQppbmRleCBmMjU3OWNlLi4xODYzYzE2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvTWFrZWZpbGUKQEAgLTExLDUgKzExLDMgQEAKIG9iai0kKENPTkZJR19UT1NISUJBX0ZQQ0lCMCkJKz0gc21zY19mZGMzN204MXgubwogb2JqLSQoQ09ORklHX1NQSSkJCSs9IHNwaV9lZXByb20ubwogb2JqLSQoQ09ORklHX1RYWDlfN1NFR0xFRCkJKz0gN3NlZ2xlZC5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9qbXIzOTI3L01ha2VmaWxlIGIvYXJjaC9taXBzL3R4eDkvam1yMzkyNy9NYWtlZmlsZQppbmRleCAyMGQ2MWFjLi45ZjVkNWI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9qbXIzOTI3L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L2ptcjM5MjcvTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiAjCiAKIG9iai15CSs9IHByb20ubyBpcnEubyBzZXR1cC5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkyNy9NYWtlZmlsZSBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L01ha2VmaWxlCmluZGV4IGYzZTFmNTkuLjYwYjI0YzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L01ha2VmaWxlCkBAIC0xLDMgKzEgQEAKIG9iai15CSs9IHByb20ubyBzZXR1cC5vIGlycS5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9NYWtlZmlsZSBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L01ha2VmaWxlCmluZGV4IGYzZTFmNTkuLjYwYjI0YzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L01ha2VmaWxlCkBAIC0xLDMgKzEgQEAKIG9iai15CSs9IHByb20ubyBzZXR1cC5vIGlycS5vCi0KLUVYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9NYWtlZmlsZSBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L01ha2VmaWxlCmluZGV4IDMyMzJjZDAuLjVjODQ2MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L01ha2VmaWxlCkBAIC0xLDMgKzEgQEAKIG9iai15CSArPSBpcnEubyBzZXR1cC5vIHByb20ubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9QbGF0Zm9ybSBiL2FyY2gvbWlwcy92cjQxeHgvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjOGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvUGxhdGZvcm0KQEAgLTAsMCArMSwzMiBAQAorIworIyBORUMgVlI0MTAwIHNlcmllcyBiYXNlZCBtYWNoaW5lcworIworcGxhdGZvcm0tJChDT05GSUdfTUFDSF9WUjQxWFgpCSs9IHZyNDF4eC9jb21tb24vCitjZmxhZ3MtJChDT05GSUdfTUFDSF9WUjQxWFgpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC12cjQxeHgKKworIworIyBDQVNJTyBDQVNTSVBFSUEgRS01NS82NSAoVlI0MTExKQorIworcGxhdGZvcm0tJChDT05GSUdfQ0FTSU9fRTU1KQkrPSB2cjQxeHgvY2FzaW8tZTU1LworbG9hZC0kKENPTkZJR19DQVNJT19FNTUpCSs9IDB4ZmZmZmZmZmY4MDAwNDAwMAorCisjCisjIElCTSBXb3JrUGFkIHo1MCAoVlI0MTIxKQorIworcGxhdGZvcm0tJChDT05GSUdfSUJNX1dPUktQQUQpCSs9IHZyNDF4eC9pYm0td29ya3BhZC8KK2xvYWQtJChDT05GSUdfSUJNX1dPUktQQUQpCSs9IDB4ZmZmZmZmZmY4MDAwNDAwMAorCisjCisjIFRBTkJBQyBWUjQxMzEgbXVsdGljaGlwIG1vZHVsZShUQjAyMjUpIGFuZCBUQU5CQUMgVlI0MTMxRElNTShUQjAyMjkpIChWUjQxMzEpCisjCitsb2FkLSQoQ09ORklHX1RBTkJBQ19UQjAyMlgpCSs9IDB4ZmZmZmZmZmY4MDAwMDAwMAorCisjCisjIFZpY3RvciBNUC1DMzAzLzMwNCAoVlI0MTIyKQorIworbG9hZC0kKENPTkZJR19WSUNUT1JfTVBDMzBYKQkrPSAweGZmZmZmZmZmODAwMDEwMDAKKworIworIyBaQU8gTmV0d29ya3MgQ2FwY2VsbGEgKFZSNDEzMSkKKyMKK2xvYWQtJChDT05GSUdfWkFPX0NBUENFTExBKQkrPSAweGZmZmZmZmZmODAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vTWFrZWZpbGUKaW5kZXggN2Q1ZDgzYi4uZDBkODRlYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiAjCiAKIG9iai15CSs9IGJjdS5vIGNtdS5vIGdpdS5vIGljdS5vIGluaXQubyBpcnEubyBwbXUubyBydGMubyBzaXUubyB0eXBlLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy93cnBwbWMvTWFrZWZpbGUgYi9hcmNoL21pcHMvd3JwcG1jL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2NjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvd3JwcG1jL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgMjAwNiBXaW5kIFJpdmVyIFN5c3RlbSwgSW5jLgorIyBBdXRob3I6IFJvbmdrYWkuWmhhbiA8cm9uZ2thaS56aGFuQHdpbmRyaXZlci5jb20+CisjCisjIE1ha2VmaWxlIGZvciB0aGUgV2luZCBSaXZlciBNSVBTIDRLYyBQUE1DIEV2YWwgQm9hcmQKKyMKKworb2JqLXkgKz0gaXJxLm8gcGNpLm8gcmVzZXQubyBzZXJpYWwubyBzZXR1cC5vIHRpbWUubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3dycHBtYy9QbGF0Zm9ybSBiL2FyY2gvbWlwcy93cnBwbWMvUGxhdGZvcm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ODY0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy93cnBwbWMvUGxhdGZvcm0KQEAgLTAsMCArMSw3IEBACisjCisjIFdpbmQgUml2ZXIgUFBNQyBCb2FyZCAoNEtDICsgR1Q2NDEyMCkKKyMKK3BsYXRmb3JtLSQoQ09ORklHX1dSX1BQTUMpCSs9IHdycHBtYy8KK2NmbGFncy0kKENPTkZJR19XUl9QUE1DKQkrPSAJCQkJCVwKKwkJLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXdycHBtYworbG9hZC0kKENPTkZJR19XUl9QUE1DKQkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvaXJxLmMgYi9hcmNoL21pcHMvd3JwcG1jL2lycS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvaXJxLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy93cnBwbWMvaXJxLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9wY2kuYyBiL2FyY2gvbWlwcy93cnBwbWMvcGNpLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9wY2kuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3dycHBtYy9wY2kuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jL3Jlc2V0LmMgYi9hcmNoL21pcHMvd3JwcG1jL3Jlc2V0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9yZXNldC5jCnJlbmFtZSB0byBhcmNoL21pcHMvd3JwcG1jL3Jlc2V0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9zZXJpYWwuYyBiL2FyY2gvbWlwcy93cnBwbWMvc2VyaWFsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9zZXJpYWwuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3dycHBtYy9zZXJpYWwuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jL3NldHVwLmMgYi9hcmNoL21pcHMvd3JwcG1jL3NldHVwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL21pcHMvd3JwcG1jL3NldHVwLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy90aW1lLmMgYi9hcmNoL21pcHMvd3JwcG1jL3RpbWUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jL3RpbWUuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3dycHBtYy90aW1lLmMKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vbG9jYWw2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzkzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2Zpcm13YXJlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZmlybXdhcmUuYwppbmRleCA0YzI0N2UwLi5kZjk3MWZhIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZmlybXdhcmUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZmlybXdhcmUuYwpAQCAtMTEyMyw3ICsxMTIzLDYgQEAKICAqLwogaW50IHBkY19pb2RjX3ByaW50KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0ciwgdW5zaWduZWQgY291bnQpCiB7Ci0Jc3RhdGljIGludCBwb3N4OyAgICAgICAgLyogZm9yIHNpbXBsZSBUQUItU2ltdWxhdGlvbi4uLiAqLwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTExMzMsMTkgKzExMzIsMTIgQEAKIAkJCWlvZGNfZGJ1ZltpKzBdID0gJ1xyJzsKIAkJCWlvZGNfZGJ1ZltpKzFdID0gJ1xuJzsKIAkJCWkgKz0gMjsKLQkJCXBvc3ggPSAwOwogCQkJZ290byBwcmludDsKLQkJY2FzZSAnXHQnOgotCQkJd2hpbGUgKHBvc3ggJiA3KSB7Ci0JCQkJaW9kY19kYnVmW2ldID0gJyAnOwotCQkJCWkrKywgcG9zeCsrOwotCQkJfQotCQkJYnJlYWs7CiAJCWNhc2UgJ1xiJzoJLyogQlMgKi8KLQkJCXBvc3ggLT0gMjsKKwkJCWktLTsgLyogb3ZlcndyaXRlIGxhc3QgKi8KIAkJZGVmYXVsdDoKIAkJCWlvZGNfZGJ1ZltpXSA9IHN0cltpXTsKLQkJCWkrKywgcG9zeCsrOworCQkJaSsrOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggOTg3NzM3Mi4uNWJlYjk3YiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9mdHJhY2UuYwpAQCAtODIsNyArODIsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmV0OwogCiAJcG9wX3JldHVybl90cmFjZSgmdHJhY2UsICZyZXQpOwotCXRyYWNlLnJldHRpbWUgPSBjcHVfY2xvY2socmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJdHJhY2UucmV0dGltZSA9IGxvY2FsX2Nsb2NrKCk7CiAJZnRyYWNlX2dyYXBoX3JldHVybigmdHJhY2UpOwogCiAJaWYgKHVubGlrZWx5KCFyZXQpKSB7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNhbGx0aW1lID0gY3B1X2Nsb2NrKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCWNhbGx0aW1lID0gbG9jYWxfY2xvY2soKTsKIAogCWlmIChwdXNoX3JldHVybl90cmFjZShvbGQsIGNhbGx0aW1lLAogCQkJCXNlbGZfYWRkciwgJnRyYWNlLmRlcHRoKSA9PSAtRUJVU1kpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggMjVlNmJmNC4uNjMxZTVhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTExNyw2ICsxMTcsOCBAQAogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgT0YKKwlzZWxlY3QgT0ZfRkxBVFRSRUUKIAlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAogCXNlbGVjdCBIQVZFX0RZTkFNSUNfRlRSQUNFCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCkBAIC0xMzgsNiArMTQwLDcgQEAKIAlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NCBpZiBQUEMzMgogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCiAJc2VsZWN0IEhBVkVfUkVHU19BTkRfU1RBQ0tfQUNDRVNTX0FQSQorCXNlbGVjdCBIQVZFX0hXX0JSRUFLUE9JTlQgaWYgUEVSRl9FVkVOVFMgJiYgUFBDX0JPT0szU182NAogCiBjb25maWcgRUFSTFlfUFJJTlRLCiAJYm9vbApAQCAtMTY5LDEwICsxNzIsNiBAQAogY29uZmlnIFBQQ19PRgogCWRlZl9ib29sIHkKIAotY29uZmlnIE9GCi0JZGVmX2Jvb2wgeQotCXNlbGVjdCBPRl9GTEFUVFJFRQotCiBjb25maWcgUFBDX1VEQkdfMTY1NTAKIAlib29sCiAJZGVmYXVsdCBuCkBAIC0xOTUsMTAgKzE5NCw2IEBACiAJZGVmYXVsdCB5IGlmIFBNQUNfQVBNX0VNVQogCWJvb2wKIAotY29uZmlnIERUQwotICAgICAgIGJvb2wKLSAgICAgICBkZWZhdWx0IHkKLQogY29uZmlnIERFRkFVTFRfVUlNQUdFCiAJYm9vbAogCWhlbHAKQEAgLTIxNSw3ICsyMTAsNyBAQAogY29uZmlnIEFSQ0hfU1VTUEVORF9QT1NTSUJMRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFEQl9QTVUgfHwgUFBDX0VGSUtBIHx8IFBQQ19MSVRFNTIwMCB8fCBQUENfODN4eCB8fCBcCi0JCSAgIFBQQ184NXh4IHx8IFBQQ184Nnh4CisJCSAgIFBQQ184NXh4IHx8IFBQQ184Nnh4IHx8IFBQQ19QU0VSSUVTCiAKIGNvbmZpZyBQUENfRENSX05BVElWRQogCWJvb2wKQEAgLTM0OCw3ICszNDMsNyBAQAogCiBjb25maWcgS0VYRUMKIAlib29sICJrZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIChQUENfQk9PSzNTIHx8IChGU0xfQk9PS0UgJiYgIVNNUCkpICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gKFBQQ19CT09LM1MgfHwgRlNMX0JPT0tFKSAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBrZXhlYyBpcyBhIHN5c3RlbSBjYWxsIHRoYXQgaW1wbGVtZW50cyB0aGUgYWJpbGl0eSB0byBzaHV0ZG93biB5b3VyCiAJICBjdXJyZW50IGtlcm5lbCwgYW5kIHRvIHN0YXJ0IGFub3RoZXIga2VybmVsLiAgSXQgaXMgbGlrZSBhIHJlYm9vdApAQCAtMzY1LDggKzM2MCw4IEBACiAKIGNvbmZpZyBDUkFTSF9EVU1QCiAJYm9vbCAiQnVpbGQgYSBrZHVtcCBjcmFzaCBrZXJuZWwiCi0JZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHgKLQlzZWxlY3QgUkVMT0NBVEFCTEUgaWYgUFBDNjQKKwlkZXBlbmRzIG9uIFBQQzY0IHx8IDZ4eCB8fCBGU0xfQk9PS0UKKwlzZWxlY3QgUkVMT0NBVEFCTEUgaWYgUFBDNjQgfHwgRlNMX0JPT0tFCiAJaGVscAogCSAgQnVpbGQgYSBrZXJuZWwgc3VpdGFibGUgZm9yIHVzZSBhcyBhIGtkdW1wIGNhcHR1cmUga2VybmVsLgogCSAgVGhlIHNhbWUga2VybmVsIGJpbmFyeSBjYW4gYmUgdXNlZCBhcyBwcm9kdWN0aW9uIGtlcm5lbCBhbmQgZHVtcApAQCAtNTc1LDE0ICs1NzAsNiBAQAogCSAgd2hlbiBkZWFsaW5nIHdpdGggUE9XRVI1IGNwdXMgYXQgYSBjb3N0IG9mIHNsaWdodGx5IGluY3JlYXNlZAogCSAgb3ZlcmhlYWQgaW4gc29tZSBwbGFjZXMuIElmIHVuc3VyZSBzYXkgTiBoZXJlLgogCi1jb25maWcgUFJPQ19ERVZJQ0VUUkVFCi0JYm9vbCAiU3VwcG9ydCBmb3IgZGV2aWNlIHRyZWUgaW4gL3Byb2MiCi0JZGVwZW5kcyBvbiBQUk9DX0ZTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGRldmljZS10cmVlIGRpcmVjdG9yeSB1bmRlciAvcHJvYyB3aGljaCBjb250YWlucwotCSAgYW4gaW1hZ2Ugb2YgdGhlIGRldmljZSB0cmVlIHRoYXQgdGhlIGtlcm5lbCBjb3BpZXMgZnJvbSBPcGVuCi0JICBGaXJtd2FyZSBvciBvdGhlciBib290IGZpcm13YXJlLiBJZiB1bnN1cmUsIHNheSBZIGhlcmUuCi0KIGNvbmZpZyBDTURMSU5FX0JPT0wKIAlib29sICJEZWZhdWx0IGJvb3Rsb2FkZXIga2VybmVsIGFyZ3VtZW50cyIKIApAQCAtNjY1LDcgKzY1Miw3IEBACiAKIGNvbmZpZyBHRU5FUklDX0lTQV9ETUEKIAlib29sCi0JZGVwZW5kcyBvbiBQUEM2NCB8fCBQT1dFUjQgfHwgNnh4ICYmICFDUE0yCisJZGVwZW5kcyBvbiBJU0FfRE1BX0FQSQogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX0lORElSRUNUX1BDSQpAQCAtODk0LDcgKzg4MSw3IEBACiBjb25maWcgS0VSTkVMX1NUQVJUCiAJaGV4ICJWaXJ0dWFsIGFkZHJlc3Mgb2Yga2VybmVsIGJhc2UiIGlmIEtFUk5FTF9TVEFSVF9CT09MCiAJZGVmYXVsdCBQQUdFX09GRlNFVCBpZiBQQUdFX09GRlNFVF9CT09MCi0JZGVmYXVsdCAiMHhjMjAwMDAwMCIgaWYgQ1JBU0hfRFVNUAorCWRlZmF1bHQgIjB4YzIwMDAwMDAiIGlmIENSQVNIX0RVTVAgJiYgIVJFTE9DQVRBQkxFCiAJZGVmYXVsdCAiMHhjMDAwMDAwMCIKIAogY29uZmlnIFBIWVNJQ0FMX1NUQVJUX0JPT0wKQEAgLTkwNyw3ICs4OTQsNyBAQAogCiBjb25maWcgUEhZU0lDQUxfU1RBUlQKIAloZXggIlBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQiIGlmIFBIWVNJQ0FMX1NUQVJUX0JPT0wKLQlkZWZhdWx0ICIweDAyMDAwMDAwIiBpZiBQUENfU1REX01NVSAmJiBDUkFTSF9EVU1QCisJZGVmYXVsdCAiMHgwMjAwMDAwMCIgaWYgUFBDX1NURF9NTVUgJiYgQ1JBU0hfRFVNUCAmJiAhUkVMT0NBVEFCTEUKIAlkZWZhdWx0ICIweDAwMDAwMDAwIgogCiBjb25maWcgUEhZU0lDQUxfQUxJR04KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCA3N2NmZTdhLi41ZDQyZjVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC05NCw3ICs5NCw3IEBACiBlbmRpZgogZW5kaWYKIAotTERGTEFHU19NT0RVTEUJKz0gYXJjaC9wb3dlcnBjL2xpYi9jcnRzYXZyZXMubworS0JVSUxEX0xERkxBR1NfTU9EVUxFICs9IGFyY2gvcG93ZXJwYy9saWIvY3J0c2F2cmVzLm8KIAogaWZlcSAoJChDT05GSUdfVFVORV9DRUxMKSx5KQogCUtCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9Y2VsbCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY2FueW9ubGFuZHMuZHRzCmluZGV4IGNkNTZiYjUuLjU4MDZlZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwotCQkJCWludGVycnVwdHMgPSA8MHgxZCAweDQ+OworCQkJCWludGVycnVwdHMgPSA8MjggMHg0PjsKIAkJCX07CiAKIAkJCVVBUlQzOiBzZXJpYWxAZWY2MDA2MDAgewpAQCAtMjgxLDcgKzI4MSw3IEBACiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwotCQkJCWludGVycnVwdHMgPSA8MHgxZSAweDQ+OworCQkJCWludGVycnVwdHMgPSA8MjkgMHg0PjsKIAkJCX07CiAKIAkJCUlJQzA6IGkyY0BlZjYwMDcwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMKaW5kZXggZDYyYTRmYi4uZTYxOGZjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dsYWNpZXIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nbGFjaWVyLmR0cwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwotCQkJCWludGVycnVwdHMgPSA8MHgxZCAweDQ+OworCQkJCWludGVycnVwdHMgPSA8MjggMHg0PjsKIAkJCX07CiAKIAkJCVVBUlQzOiBzZXJpYWxAZWY2MDA2MDAgewpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwotCQkJCWludGVycnVwdHMgPSA8MHgxZSAweDQ+OworCQkJCWludGVycnVwdHMgPSA8MjkgMHg0PjsKIAkJCX07CiAKIAkJCUlJQzA6IGkyY0BlZjYwMDcwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3ZWIyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4cmRiLmR0cwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIE1QQzgzMDhSREIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICogQ29weXJpZ2h0IDIwMTAgSWx5YSBZYW5vaywgRW1jcmFmdCBTeXN0ZW1zLCB5YW5va0BlbWNyYWZ0LmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMDhyZGIiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJYWxpYXNlcyB7CisJCWV0aGVybmV0MCA9ICZlbmV0MDsKKwkJZXRoZXJuZXQxID0gJmVuZXQxOworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJcGNpMCA9ICZwY2kwOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsODMwOEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDwxNjM4ND47CisJCQlpLWNhY2hlLXNpemUgPSA8MTYzODQ+OworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQl9OworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA4MDAwMDAwPjsJLy8gMTI4TUIgYXQgMAorCX07CisKKwlsb2NhbGJ1c0BlMDAwNTAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMxNS1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCQlyZWcgPSA8MHhlMDAwNTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDc3IDB4OD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCisJCS8vIENTMCBhbmQgQ1MxIGFyZSBzd2FwcGVkIHdoZW4KKwkJLy8gYm9vdGluZyBmcm9tIG5hbmQsIGJ1dCB0aGUKKwkJLy8gYWRkcmVzc2VzIGFyZSB0aGUgc2FtZS4KKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhmZTAwMDAwMCAweDAwODAwMDAwCisJCSAgICAgICAgICAweDEgMHgwIDB4ZTA2MDAwMDAgMHgwMDAwMjAwMAorCQkgICAgICAgICAgMHgyIDB4MCAweGYwMDAwMDAwIDB4MDAwMjAwMDAKKwkJICAgICAgICAgIDB4MyAweDAgMHhmYTAwMDAwMCAweDAwMDA4MDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwweDAgMHgwIDB4ODAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8Mj47CisJCQlkZXZpY2Utd2lkdGggPSA8MT47CisKKwkJCXUtYm9vdEAwIHsKKwkJCQlyZWcgPSA8MHgwIDB4NjAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCQllbnZANjAwMDAgeworCQkJCXJlZyA9IDwweDYwMDAwIDB4MTAwMDA+OworCQkJfTsKKwkJCWVudjFANzAwMDAgeworCQkJCXJlZyA9IDwweDcwMDAwIDB4MTAwMDA+OworCQkJfTsKKwkJCWtlcm5lbEA4MDAwMCB7CisJCQkJcmVnID0gPDB4ODAwMDAgMHgyMDAwMDA+OworCQkJfTsKKwkJCWR0YkAyODAwMDAgeworCQkJCXJlZyA9IDwweDI4MDAwMCAweDEwMDAwPjsKKwkJCX07CisJCQlyYW1kaXNrQDI5MDAwMCB7CisJCQkJcmVnID0gPDB4MjkwMDAwIDB4NTcwMDAwPjsKKwkJCX07CisJCX07CisKKwkJbmFuZEAxLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTUtZmNtLW5hbmQiLAorCQkJICAgICAgICAgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7CisJCQlyZWcgPSA8MHgxIDB4MCAweDIwMDA+OworCisJCQlqZmZzMkAwIHsKKwkJCQlyZWcgPSA8MHgwIDB4MjAwMDAwMD47CisJCQl9OworCQl9OworCX07CisKKwlpbW1yQGUwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzE1LWltbXIiLCAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwwIDB4ZTAwMDAwMDAgMHgwMDEwMDAwMD47CisJCXJlZyA9IDwweGUwMDAwMDAwIDB4MDAwMDAyMDA+OworCQlidXMtZnJlcXVlbmN5ID0gPDA+OworCisJCWkyY0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNCAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCQlkZnNycjsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzM5IjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQl9OworCQl9OworCisJCXVzYkAyMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbC11c2IyLWRyIjsKKwkJCXJlZyA9IDwweDIzMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDB4OD47CisJCQlkcl9tb2RlID0gInBlcmlwaGVyYWwiOworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisKKwkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjQwMDAgMHgxMDAwPjsKKworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKKwkJCXJlZyA9IDwweDI0MDAwIDB4MTAwMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MzIgMHg4IDMzIDB4OCAzNCAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCQl0YmktaGFuZGxlID0gPCAmdGJpMCA+OworCQkJcGh5LWhhbmRsZSA9IDwgJnBoeTIgPjsKKwkJCWZzbCxtYWdpYy1wYWNrZXQ7CisKKwkJCW1kaW9ANTIwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLW1kaW8iOworCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKKwkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CisJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCQkJCQlpbnRlcnJ1cHRzID0gPDE3IDB4OD47CisJCQkJCXJlZyA9IDwweDI+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJCX07CisJCQkJdGJpMDogdGJpLXBoeUAxMSB7CisJCQkJCXJlZyA9IDwweDExPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJZW5ldDE6IGV0aGVybmV0QDI1MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQltb2RlbCA9ICJlVFNFQyI7CisJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOworCQkJcmVnID0gPDB4MjUwMDAgMHgxMDAwPjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyNTAwMCAweDEwMDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDM1IDB4OCAzNiAweDggMzcgMHg4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCQkJdGJpLWhhbmRsZSA9IDwgJnRiaTEgPjsKKwkJCS8qIFZpdGVzc2UgNzM4NSBpc24ndCBvbiB0aGUgTURJTyBidXMgKi8KKwkJCWZpeGVkLWxpbmsgPSA8MSAxIDEwMDAgMCAwPjsKKwkJCWZzbCxtYWdpYy1wYWNrZXQ7CisKKwkJCW1kaW9ANTIwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7CisJCQkJcmVnID0gPDB4NTIwIDB4MjA+OworCisJCQkJdGJpMTogdGJpLXBoeUAxMSB7CisJCQkJCXJlZyA9IDwweDExPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MTMzMzMzMzMzPjsKKwkJCWludGVycnVwdHMgPSA8OSAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCX07CisKKwkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MTMzMzMzMzMzPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMHg4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCQl9OworCisJCWdwaW9AYzAwIHsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJZGV2aWNlX3R5cGUgPSAiZ3BpbyI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzA4LWdwaW8iLCAiZnNsLG1wYzgzNDktZ3BpbyI7CisJCQlyZWcgPSA8MHhjMDAgMHgxOD47CisJCQlpbnRlcnJ1cHRzID0gPDc0IDB4OD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKworCQkvKiBJUElDCisJCSAqIGludGVycnVwdHMgY2VsbCA9IDxpbnRyICMsIHNlbnNlPgorCQkgKiBzZW5zZSB2YWx1ZXMgbWF0Y2ggbGludXggSU9SRVNPVVJDRV9JUlFfKiBkZWZpbmVzOgorCQkgKiBzZW5zZSA9PSA4OiBMZXZlbCwgbG93IGFzc2VydGlvbgorCQkgKiBzZW5zZSA9PSAyOiBFZGdlLCBoaWdoLXRvLWxvdyBjaGFuZ2UKKwkJICovCisJCWlwaWM6IGludGVycnVwdC1jb250cm9sbGVyQDcwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxpcGljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4NzAwIDB4MTAwPjsKKwkJCWRldmljZV90eXBlID0gImlwaWMiOworCQl9OworCisJCWlwaWMtbXNpQDdjMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxpcGljLW1zaSI7CisJCQlyZWcgPSA8MHg3YzAgMHg0MD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwweDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwgMHg0MyAweDgKKwkJCQkJMHg0ICAweDgKKwkJCQkJMHg1MSAweDgKKwkJCQkJMHg1MiAweDgKKwkJCQkJMHg1NiAweDgKKwkJCQkJMHg1NyAweDgKKwkJCQkJMHg1OCAweDgKKwkJCQkJMHg1OSAweDggPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CisJCX07CisKKwl9OworCisJcGNpMDogcGNpZUBlMDAwOTAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMwOC1wY2llIiwgImZzbCxtcGM4MzE0LXBjaWUiOworCQlyZWcgPSA8MHhlMDAwOTAwMCAweDAwMDAxMDAwCisJCQkweGIwMDAwMDAwIDB4MDEwMDAwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJICAgICAgICAgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4YjEwMDAwMDAgMCAweDAwODAwMDAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPDAgMCAwIDEgJmlwaWMgMSA4CisJCQkJIDAgMCAwIDIgJmlwaWMgMSA4CisJCQkJIDAgMCAwIDMgJmlwaWMgMSA4CisJCQkJIDAgMCAwIDQgJmlwaWMgMSA4PjsKKwkJaW50ZXJydXB0cyA9IDwweDEgMHg4PjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKworCQlwY2llQDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhhMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAKKwkJCQkgIDAgMHgxMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDA4MDAwMDA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCmluZGV4IDlkYzI5MjkuLjhkMWJmMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKQEAgLTcxLDE0ICs3MSwxNCBAQAogCQl9OwogCiAJCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJfTsKIAogCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCw4NTQwLWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1sMi1jYWNoZS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CiAJCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsJLy8gTDIsIDI1NksKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwppbmRleCA5YTNhZDMxLi44N2ZmOTY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCkBAIC03MSwxNCArNzEsMTQgQEAKIAkJfTsKIAogCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MS1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCX07CiAKIAkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDEtbDItY2FjaGUtY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwogCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47CS8vIEwyLCAyNTZLCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCmluZGV4IDk4ZTk0YjQuLmQ3OTM5NjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCkBAIC03MywxNCArNzMsMTQgQEAKIAkJfTsKIAogCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCX07CiAKIAkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0NC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtbDItY2FjaGUtY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwogCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47CS8vIEwyLCAyNTZLCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKaW5kZXggMGY1MjYyNC4uYTE3YTU1NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cwpAQCAtNzQsMTQgKzc0LDE0IEBACiAJCX07CiAKIAkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCw4NTQ4LW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQl9OwogCiAJCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbDItY2FjaGUtY29udHJvbGxlciI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWwyLWNhY2hlLWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OwkvLyBMMiwgNTEySwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCmluZGV4IDA2NWIyZjAuLjVjNTYxNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKQEAgLTcxLDE0ICs3MSwxNCBAQAogCQl9OwogCiAJCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJfTsKIAogCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCw4NTU1LWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CiAJCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsJLy8gTDIsIDI1NksKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cwppbmRleCBhNWJiMWVjLi42ZTg1ZTFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCkBAIC03MSwxNCArNzEsMTQgQEAKIAkJfTsKIAogCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCX07CiAKIAkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtbDItY2FjaGUtY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwogCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47CS8vIEwyLCAyNTZLCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKaW5kZXggOTJmYjE3OC4uMzBjZjBlMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKQEAgLTEyNCwxNCArMTI0LDE0IEBACiAJCX07CiAKIAkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQl9OwogCiAJCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbDItY2FjaGUtY29udHJvbGxlciI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LWwyLWNhY2hlLWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OwkvLyBMMiwgNTEySwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIxbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMW1kcy5kdHMKaW5kZXggN2ZhZDJkZjIuLmFkNWI4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMW1kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIxbWRzLmR0cwpAQCAtNjE3LDYgKzYxNyw3IEBACiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CiAJCWZzbCxxZS1udW0tcmlzY3MgPSA8MT47CiAJCWZzbCxxZS1udW0tc251bXMgPSA8Mjg+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOyAvKiBubyBmaXJtd2FyZSBsb2FkZWQgKi8KIAogCQlxZWljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA4MCB7CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmNiMTBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogUDEwMjIgRFMgMzZCaXQgUGh5c2ljYWwgQWRkcmVzcyBNYXAgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisvZHRzLXYxLzsKKy8geworCW1vZGVsID0gImZzbCxQMTAyMiI7CisJY29tcGF0aWJsZSA9ICJmc2wsUDEwMjJEUyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlwY2kwID0gJnBjaTA7CisJCXBjaTEgPSAmcGNpMTsKKwkJcGNpMiA9ICZwY2kyOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsUDEwMjJAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJUG93ZXJQQyxQMTAyMkAxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJbG9jYWxidXNAZmZmZTA1MDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxOSAyPjsKKworCQlyYW5nZXMgPSA8MHgwIDB4MCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwCisJCQkgIDB4MSAweDAgMHhmIDB4ZTAwMDAwMDAgMHgwODAwMDAwMAorCQkJICAweDIgMHgwIDB4MCAweGZmYTAwMDAwIDB4MDAwNDAwMDAKKwkJCSAgMHgzIDB4MCAweGYgMHhmZmRmMDAwMCAweDAwMDA4MDAwPjsKKworCQlub3JAMCwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MHgwIDB4MCAweDgwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwxPjsKKworCQkJcGFydGl0aW9uQDAgeworCQkJCXJlZyA9IDwweDAgMHgwMzAwMDAwMD47CisJCQkJbGFiZWwgPSAicmFtZGlzay1ub3IiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAzMDAwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMzAwMDAwMCAweDAwZTAwMDAwPjsKKwkJCQlsYWJlbCA9ICJkaWFnbm9zdGljLW5vciI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDNlMDAwMDAgeworCQkJCXJlZyA9IDwweDAzZTAwMDAwIDB4MDAyMDAwMDA+OworCQkJCWxhYmVsID0gImRpbmstbm9yIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25ANDAwMDAwMCB7CisJCQkJcmVnID0gPDB4MDQwMDAwMDAgMHgwMDQwMDAwMD47CisJCQkJbGFiZWwgPSAia2VybmVsLW5vciI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDQ0MDAwMDAgeworCQkJCXJlZyA9IDwweDA0NDAwMDAwIDB4MDNiMDAwMDA+OworCQkJCWxhYmVsID0gImpmZnMyLW5vciI7CisJCQl9OworCisJCQlwYXJ0aXRpb25AN2YwMDAwMCB7CisJCQkJcmVnID0gPDB4MDdmMDAwMDAgMHgwMDA4MDAwMD47CisJCQkJbGFiZWwgPSAiZHRiLW5vciI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDdmODAwMDAgeworCQkJCXJlZyA9IDwweDA3ZjgwMDAwIDB4MDAwODAwMDA+OworCQkJCWxhYmVsID0gInUtYm9vdC1ub3IiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCX07CisKKwkJbmFuZEAyLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVsYmMtZmNtLW5hbmQiOworCQkJcmVnID0gPDB4MiAweDAgMHg0MDAwMD47CisKKwkJCXBhcnRpdGlvbkAwIHsKKwkJCQlyZWcgPSA8MHgwIDB4MDIwMDAwMDA+OworCQkJCWxhYmVsID0gInUtYm9vdC1uYW5kIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMjAwMDAwMCB7CisJCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDAwMD47CisJCQkJbGFiZWwgPSAiamZmczItbmFuZCI7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMTIwMDAwMDAgeworCQkJCXJlZyA9IDwweDEyMDAwMDAwIDB4MTAwMDAwMDA+OworCQkJCWxhYmVsID0gInJhbWRpc2stbmFuZCI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDIyMDAwMDAwIHsKKwkJCQlyZWcgPSA8MHgyMjAwMDAwMCAweDA0MDAwMDAwPjsKKwkJCQlsYWJlbCA9ICJrZXJuZWwtbmFuZCI7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMjYwMDAwMDAgeworCQkJCXJlZyA9IDwweDI2MDAwMDAwIDB4MDEwMDAwMDA+OworCQkJCWxhYmVsID0gImR0Yi1uYW5kIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMjcwMDAwMDAgeworCQkJCXJlZyA9IDwweDI3MDAwMDAwIDB4MTkwMDAwMDA+OworCQkJCWxhYmVsID0gInJlc2VydmVkLW5hbmQiOworCQkJfTsKKwkJfTsKKwl9OworCisJc29jQGZmZmUwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJZGV2aWNlX3R5cGUgPSAic29jIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItaW1tciIsICJzaW1wbGUtYnVzIjsKKwkJcmFuZ2VzID0gPDB4MCAweGYgMHhmZmUwMDAwMCAweDEwMDAwMD47CisJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJCWVjbS1sYXdAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwxMj47CisJCX07CisKKwkJZWNtQDEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItZWNtIiwgImZzbCxlY20iOworCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJfTsKKworCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCX07CisKKwkJaTJjQDMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDMxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OworCQkJZGZzcnI7CisKKwkJCXdtODc3Njpjb2RlY0AxYSB7CisJCQkJY29tcGF0aWJsZSA9ICJ3bGYsd204Nzc2IjsKKwkJCQlyZWcgPSA8MHgxYT47CisJCQkJLyogTUNMSyBzb3VyY2UgaXMgYSBzdGFuZC1hbG9uZSBvc2NpbGxhdG9yICovCisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEyMjg4MDAwPjsKKwkJCX07CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQl9OworCisJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKKwkJfTsKKworCQlzcGlANzAwMCB7CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVzcGkiOworCQkJcmVnID0gPDB4NzAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1OSAweDI+OworCQkJZXNwaSxudW0tc3MtYml0cyA9IDw0PjsKKwkJCW1vZGUgPSAiY3B1IjsKKworCQkJZnNsX20yNXA4MEAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlc3BpLWZsYXNoIjsKKwkJCQlyZWcgPSA8MD47CisJCQkJbGludXgsbW9kYWxpYXMgPSAiZnNsX20yNXA4MCI7CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkAwIHsKKwkJCQkJbGFiZWwgPSAidS1ib290LXNwaSI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AMTAwMDAwIHsKKwkJCQkJbGFiZWwgPSAia2VybmVsLXNwaSI7CisJCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25ANjAwMDAwIHsKKwkJCQkJbGFiZWwgPSAiZHRiLXNwaSI7CisJCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25ANzAwMDAwIHsKKwkJCQkJbGFiZWwgPSAiZmlsZSBzeXN0ZW0tc3BpIjsKKwkJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDkwMDAwMD47CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJc3NpQDE1MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtc3NpIjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlyZWcgPSA8MHgxNTAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDc1IDI+OworCQkJZnNsLG1vZGUgPSAiaTJzLXNsYXZlIjsKKwkJCWNvZGVjLWhhbmRsZSA9IDwmd204Nzc2PjsKKwkJCWZzbCxwbGF5YmFjay1kbWEgPSA8JmRtYTAwPjsKKwkJCWZzbCxjYXB0dXJlLWRtYSA9IDwmZG1hMDE+OworCQkJZnNsLGZpZm8tZGVwdGggPSA8MTY+OworCQl9OworCisJCWRtYUBjMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHhjMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4YzEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZG1hMDA6IGRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc2IDI+OworCQkJfTsKKwkJCWRtYTAxOiBkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc3IDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDw3OCAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8NzkgMj47CisJCQl9OworCQl9OworCisJCWdwaW86IGdwaW8tY29udHJvbGxlckBmMDAwIHsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ncGlvIjsKKwkJCXJlZyA9IDwweGYwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0NyAweDI+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwgMjU2SworCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJfTsKKworCQlkbWFAMjEzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDIxMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIwIDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8MjEgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0cyA9IDwyMyAyPjsKKwkJCX07CisJCX07CisKKwkJdXNiQDIyMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC11c2IyLWRyIjsKKwkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDI4IDB4Mj47CisJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwkJfTsKKworCQltZGlvQDI0MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxldHNlYzItbWRpbyI7CisJCQlyZWcgPSA8MHgyNDAwMCAweDEwMDAgMHhiMDAzMCAweDQ+OworCisJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQkJaW50ZXJydXB0cyA9IDwzIDE+OworCQkJCXJlZyA9IDwweDE+OworCQkJfTsKKwkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKKwkJCQlpbnRlcnJ1cHRzID0gPDkgMT47CisJCQkJcmVnID0gPDB4Mj47CisJCQl9OworCQl9OworCisJCW1kaW9AMjUwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMi1tZGlvIjsKKwkJCXJlZyA9IDwweDI1MDAwIDB4MTAwMCAweGIxMDMwIDB4ND47CisJCX07CisKKwkJZW5ldDA6IGV0aGVybmV0QEIwMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQltb2RlbCA9ICJlVFNFQyI7CisJCQljb21wYXRpYmxlID0gImZzbCxldHNlYzIiOworCQkJZnNsLG51bV9yeF9xdWV1ZXMgPSA8MHg4PjsKKwkJCWZzbCxudW1fdHhfcXVldWVzID0gPDB4OD47CisJCQlmc2wsbWFnaWMtcGFja2V0OworCQkJZnNsLHdha2Utb24tZmlsZXI7CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWZpeGVkLWxpbmsgPSA8MSAxIDEwMDAgMCAwPjsKKwkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CisJCQlxdWV1ZS1ncm91cEAweworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweEIwMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwIDIgMzQgMj47CisJCQl9OworCQkJcXVldWUtZ3JvdXBAMXsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MHhCNDAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8MTcgMiAxOCAyIDI0IDI+OworCQkJfTsKKwkJfTsKKworCQllbmV0MTogZXRoZXJuZXRAQjEwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCW1vZGVsID0gImVUU0VDIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMiI7CisJCQlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OworCQkJZnNsLG51bV90eF9xdWV1ZXMgPSA8MHg4PjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJZml4ZWQtbGluayA9IDwxIDEgMTAwMCAwIDA+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwkJCXF1ZXVlLWdyb3VwQDB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4QjEwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMzYgMiA0MCAyPjsKKwkJCX07CisJCQlxdWV1ZS1ncm91cEAxeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweEI1MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1MSAyIDUyIDIgNjcgMj47CisJCQl9OworCQl9OworCisJCXNkaGNpQDJlMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWVzZGhjIiwgImZzbCxlc2RoYyI7CisJCQlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw3MiAweDI+OworCQkJZnNsLHNkaGNpLWF1dG8tY21kMTI7CisJCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJY3J5cHRvQDMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMyIsICJmc2wsc2VjMy4xIiwgImZzbCxzZWMzLjAiLAorCQkJCSAgICAgImZzbCxzZWMyLjQiLCAiZnNsLHNlYzIuMiIsICJmc2wsc2VjMi4xIiwKKwkJCQkgICAgICJmc2wsc2VjMi4wIjsKKwkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAyIDU4IDI+OworCQkJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKKwkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKKwkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHg5N2M+OworCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDNhMzBhYmY+OworCQl9OworCisJCXNhdGFAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1zYXRhIiwgImZzbCxwcS1zYXRhIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJaW50ZXJydXB0cyA9IDw3NCAweDI+OworCQl9OworCisJCXNhdGFAMTkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1zYXRhIiwgImZzbCxwcS1zYXRhIjsKKwkJCXJlZyA9IDwweDE5MDAwIDB4MTAwMD47CisJCQljZWxsLWluZGV4ID0gPDI+OworCQkJaW50ZXJydXB0cyA9IDw0MSAweDI+OworCQl9OworCisJCXBvd2VyQGUwMDcweworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1wbWMiLCAiZnNsLG1wYzg1NDgtcG1jIjsKKwkJCXJlZyA9IDwweGUwMDcwIDB4MjA+OworCQl9OworCisJCWRpc3BsYXlAMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGl1IiwgImZzbCxwMTAyMi1kaXUiOworCQkJcmVnID0gPDB4MTAwMDAgMTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDY0IDI+OworCQl9OworCisJCXRpbWVyQDQxMTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtZ2xvYmFsLXRpbWVyIjsKKwkJCXJlZyA9IDwweDQxMTAwIDB4MjA0PjsKKwkJCWludGVycnVwdHMgPSA8MHhmNyAweDI+OworCQl9OworCisJCW1waWM6IHBpY0A0MDAwMCB7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OworCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKKwkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKKwkJfTsKKworCQltc2lANDE2MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItbXNpIiwgImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTYwMCAweDgwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGUwIDAKKwkJCQkweGUxIDAKKwkJCQkweGUyIDAKKwkJCQkweGUzIDAKKwkJCQkweGU0IDAKKwkJCQkweGU1IDAKKwkJCQkweGU2IDAKKwkJCQkweGU3IDA+OworCQl9OworCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWd1dHMiOworCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZmZTA5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItcGNpZSI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4ZiAweGZmZTA5MDAwIDAgMHgxMDAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCTAwMDAgMCAwIDIgJm1waWMgNSAxCisJCQkwMDAwIDAgMCAzICZtcGljIDYgMQorCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKKwkJCT47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDAgMHgxMDAwMDA+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZmUwYTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXBjaWUiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwweGYgMHhmZmUwYTAwMCAwIDB4MTAwMD47CisJCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMHhjIDB4NDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZiAweGZmYzIwMDAwIDB4MCAweDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkwMDAwIDAgMCAyICZtcGljIDEgMQorCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCisJCQk+OworCQlwY2llQDAgeworCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworCisKKwlwY2kyOiBwY2llQGZmZmUwYjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXBjaWUiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwweGYgMHhmZmUwYjAwMCAwIDB4MTAwMD47CisJCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZiAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgOCAxCisJCQkwMDAwIDAgMCAyICZtcGljIDkgMQorCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxCisJCQkwMDAwIDAgMCA0ICZtcGljIDExIDEKKwkJCT47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDAgMHgxMDAwMDA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BkbTM2MG5nLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wZG0zNjBuZy5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkZmE1YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wZG0zNjBuZy5kdHMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBEZXZpY2UgVHJlZSBTb3VyY2UgZm9yIElGTSBQRE0zNjBORy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOSAtIDIwMTAgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZy4KKyAqIEFuYXRvbGlqIEd1c3RzY2hpbiA8YWd1c3RAZGVueC5kZT4KKyAqCisgKiBCYXNlZCBvbiBNUEM1MTIxRSBBRFMgZHRzLgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisKKy8geworCW1vZGVsID0gInBkbTM2MG5nIjsKKwljb21wYXRpYmxlID0gImlmbSxwZG0zNjBuZyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisKKwlhbGlhc2VzIHsKKwkJZXRoZXJuZXQwID0gJmV0aDA7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw1MTIxQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDB4MjA+OwkvLyAzMiBieXRlcworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MHgyMD47CS8vIDMyIGJ5dGVzCisJCQlkLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJLy8gTDEsIDMySworCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CS8vIEwxLCAzMksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDw0OTUwMDAwMD47Ly8gNDkuNSBNSHogKGNzYi80KQorCQkJYnVzLWZyZXF1ZW5jeSA9IDwxOTgwMDAwMDA+OwkvLyAxOTggTUh6IGNzYiBidXMKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzOTYwMDAwMDA+OwkvLyAzOTYgTUh6IHBwYyBjb3JlCisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MjAwMDAwMDA+OwkvLyA1MTJNQiBhdCAwCisJfTsKKworCW5mY0A0MDAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtbmZjIjsKKwkJcmVnID0gPDB4NDAwMDAwMDAgMHgxMDAwMDA+OworCQlpbnRlcnJ1cHRzID0gPDB4NiAweDg+OworCQkjYWRkcmVzcy1jZWxscyA9IDwweDE+OworCQkjc2l6ZS1jZWxscyA9IDwweDE+OworCQliYW5rLXdpZHRoID0gPDB4MT47CisJCWNoaXBzID0gPDB4MT47CisKKwkJcGFydGl0aW9uQDAgeworCQkJbGFiZWwgPSAibmFuZDAiOworCQkJcmVnID0gPDB4MCAweDQwMDAwMDAwPjsKKwkJfTsKKwl9OworCisJc3JhbUA1MDAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtc3JhbSI7CisJCXJlZyA9IDwweDUwMDAwMDAwIDB4MjAwMDA+OwkvLyAxMjhLIGF0IDB4NTAwMDAwMDAKKwl9OworCisJbG9jYWxidXNAODAwMDAwMjAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWxvY2FsYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHg4MDAwMDAyMCAweDQwPjsKKworCQlyYW5nZXMgPSA8MHgwIDB4MCAweGYwMDAwMDAwIDB4MTAwMDAwMDAgICAvKiBGbGFzaCAqLworCQkJICAweDIgMHgwIDB4NTAwNDAwMDAgMHgwMDAyMDAwMD47IC8qIENTMjogTVJBTSAqLworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImFtZCxzMjlnbDAxZ3AiLCAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwwIDB4MDAwMDAwMDAgMHgwODAwMDAwMAorCQkJICAgICAgIDAgMHgwODAwMDAwMCAweDA4MDAwMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQliYW5rLXdpZHRoID0gPDQ+OworCQkJZGV2aWNlLXdpZHRoID0gPDI+OworCisJCQlwYXJ0aXRpb25AMCB7CisJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMDgwMDAwPjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCQkJcGFydGl0aW9uQDgwMDAwIHsKKwkJCQlsYWJlbCA9ICJlbnZpcm9ubWVudCI7CisJCQkJcmVnID0gPDB4MDAwODAwMDAgMHgwMDA4MDAwMD47CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKwkJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJCWxhYmVsID0gInNwbGFzaC1pbWFnZSI7CisJCQkJcmVnID0gPDB4MDAxMDAwMDAgMHgwMDA4MDAwMD47CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKwkJCXBhcnRpdGlvbkAxODAwMDAgeworCQkJCWxhYmVsID0gImRldmljZS10cmVlIjsKKwkJCQlyZWcgPSA8MHgwMDE4MDAwMCAweDAwMDQwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMWMwMDAwIHsKKwkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCXJlZyA9IDwweDAwMWMwMDAwIDB4MDA1MDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkA2YzAwMDAgeworCQkJCWxhYmVsID0gImZpbGVzeXN0ZW0iOworCQkJCXJlZyA9IDwweDAwNmMwMDAwIDB4MDc5NDAwMDA+OworCQkJfTsKKwkJfTsKKworCQltcmFtMEAyLDAgeworCQkJY29tcGF0aWJsZSA9ICJtdGQtcmFtIjsKKwkJCXJlZyA9IDwyIDB4MDAwMDAgMHgxMDAwMD47CisJCQliYW5rLXdpZHRoID0gPDI+OworCQl9OworCisJCW1yYW0xQDIsMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJtdGQtcmFtIjsKKwkJCXJlZyA9IDwyIDB4MDEwMDAwIDB4MTAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJfTsKKwl9OworCisJc29jQDgwMDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1pbW1yIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlyYW5nZXMgPSA8MHgwIDB4ODAwMDAwMDAgMHg0MDAwMDA+OworCQlyZWcgPSA8MHg4MDAwMDAwMCAweDQwMDAwMD47CisJCWJ1cy1mcmVxdWVuY3kgPSA8NjYwMDAwMDA+OwkvLyA2NiBNSHogaXBzIGJ1cworCisJCS8vIElQSUMKKwkJLy8gaW50ZXJydXB0cyBjZWxsID0gPGludHIgIywgc2Vuc2U+CisJCS8vIHNlbnNlIHZhbHVlcyBtYXRjaCBsaW51eCBJT1JFU09VUkNFX0lSUV8qIGRlZmluZXM6CisJCS8vIHNlbnNlID09IDg6IExldmVsLCBsb3cgYXNzZXJ0aW9uCisJCS8vIHNlbnNlID09IDI6IEVkZ2UsIGhpZ2gtdG8tbG93IGNoYW5nZQorCQkvLworCQlpcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckBjMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1pcGljIiwgImZzbCxpcGljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4YzAwIDB4MTAwPjsKKwkJfTsKKworCQlydGNAYTAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXJ0YyI7CisJCQlyZWcgPSA8MHhhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw3OSAweDggODAgMHg4PjsKKwkJfTsKKworCQlyZXNldEBlMDAgewkvLyBSZXNldCBtb2R1bGUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtcmVzZXQiOworCQkJcmVnID0gPDB4ZTAwIDB4MTAwPjsKKwkJfTsKKworCQljbG9ja0BmMDAgewkvLyBDbG9jayBjb250cm9sCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWNsb2NrIjsKKwkJCXJlZyA9IDwweGYwMCAweDEwMD47CisJCX07CisKKwkJcG1jQDEwMDB7CS8vUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBtYyI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8ODMgMHgyPjsKKwkJfTsKKworCQlncGlvQDExMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1ncGlvIjsKKwkJCXJlZyA9IDwweDExMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw3OCAweDg+OworCQl9OworCisJCWNhbkAxMzAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtbXNjYW4iOworCQkJaW50ZXJydXB0cyA9IDwxMiAweDg+OworCQkJcmVnID0gPDB4MTMwMCAweDgwPjsKKwkJfTsKKworCQljYW5AMTM4MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MTMgMHg4PjsKKwkJCXJlZyA9IDwweDEzODAgMHg4MD47CisJCX07CisKKwkJaTJjQDE3MDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtaTJjIjsKKwkJCXJlZyA9IDwweDE3MDAgMHgyMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4OSAweDg+OworCQkJZnNsLHByZXNlcnZlLWNsb2NraW5nOworCisJCQllZXByb21ANTAgeworCQkJCWNvbXBhdGlibGUgPSAiYXQsMjRjMDEiOworCQkJCXJlZyA9IDwweDUwPjsKKwkJCX07CisKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJzdG0sbTQxdDAwIjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQl9OworCQl9OworCisJCWkyY0AxNzQwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWkyYyI7CisJCQlyZWcgPSA8MHgxNzQwIDB4MjA+OworCQkJaW50ZXJydXB0cyA9IDwweGIgMHg4PjsKKwkJCWZzbCxwcmVzZXJ2ZS1jbG9ja2luZzsKKwkJfTsKKworCQlpMmNjb250cm9sQDE3NjAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1pMmMtY3RybCI7CisJCQlyZWcgPSA8MHgxNzYwIDB4OD47CisJCX07CisKKwkJYXhlQDIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1heGUiOworCQkJcmVnID0gPDB4MjAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDB4OD47CisJCX07CisKKwkJZGlzcGxheUAyMTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtZGl1IjsKKwkJCXJlZyA9IDwweDIxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw2NCAweDg+OworCQl9OworCisJCWNhbkAyMzAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtbXNjYW4iOworCQkJaW50ZXJydXB0cyA9IDw5MCAweDg+OworCQkJcmVnID0gPDB4MjMwMCAweDgwPjsKKwkJfTsKKworCQljYW5AMjM4MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8OTEgMHg4PjsKKwkJCXJlZyA9IDwweDIzODAgMHg4MD47CisJCX07CisKKwkJdml1QDI0MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS12aXUiOworCQkJcmVnID0gPDB4MjQwMCAweDQwMD47CisJCQlpbnRlcnJ1cHRzID0gPDY3IDB4OD47CisJCX07CisKKwkJbWRpb0AyODAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtZmVjLW1kaW8iOworCQkJcmVnID0gPDB4MjgwMCAweDIwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJcGh5OiBldGhlcm5ldC1waHlAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbXNjLGxhbjg3MDAiOworCQkJCXJlZyA9IDwweDFmPjsKKwkJCX07CisJCX07CisKKwkJZXRoMDogZXRoZXJuZXRAMjgwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWZlYyI7CisJCQlyZWcgPSA8MHgyODAwIDB4MjAwPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDw0IDB4OD47CisJCQlwaHktaGFuZGxlID0gPCAmcGh5ID47CisJCX07CisKKwkJLy8gVVNCMSB1c2luZyBleHRlcm5hbCBVTFBJIFBIWQorCQl1c2JAMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXVzYjItZHIiOworCQkJcmVnID0gPDB4MzAwMCAweDYwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0MyAweDg+OworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJCXBoeV90eXBlID0gInVscGkiOworCQl9OworCisJCS8vIFVTQjAgdXNpbmcgaW50ZXJuYWwgVVRNSSBQSFkKKwkJdXNiQDQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS11c2IyLWRyIjsKKwkJCXJlZyA9IDwweDQwMDAgMHg2MDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8NDQgMHg4PjsKKwkJCWRyX21vZGUgPSAib3RnIjsKKwkJCXBoeV90eXBlID0gInV0bWlfd2lkZSI7CisJCQlmc2wsaW52ZXJ0LXB3ci1mYXVsdDsKKwkJfTsKKworCQkvLyBJTyBjb250cm9sCisJCWlvY3RsQGEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1pb2N0bCI7CisJCQlyZWcgPSA8MHhBMDAwIDB4MTAwMD47CisJCX07CisKKwkJLy8gNTEyeCBQU0NzIGFyZSBub3QgNTJ4eCBQU0NzIGNvbXBhdGlibGUKKwkJc2VyaWFsQDExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtcHNjLXVhcnQiLCAiZnNsLG1wYzUxMjEtcHNjIjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlyZWcgPSA8MHgxMTAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CisJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKKwkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQl9OworCisJCXNlcmlhbEAxMTEwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBzYy11YXJ0IiwgImZzbCxtcGM1MTIxLXBzYyI7CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJcmVnID0gPDB4MTExMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OworCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJfTsKKworCQlzZXJpYWxAMTEyMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2MtdWFydCIsICJmc2wsbXBjNTEyMS1wc2MiOworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCXJlZyA9IDwweDExMjAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKKwkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OworCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCX07CisKKwkJc2VyaWFsQDExMzAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtcHNjLXVhcnQiLCAiZnNsLG1wYzUxMjEtcHNjIjsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQlyZWcgPSA8MHgxMTMwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CisJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKKwkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQl9OworCisJCXNlcmlhbEAxMTQwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBzYy11YXJ0IiwgImZzbCxtcGM1MTIxLXBzYyI7CisJCQljZWxsLWluZGV4ID0gPDQ+OworCQkJcmVnID0gPDB4MTE0MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0MCAweDg+OworCQkJZnNsLHJ4LWZpZm8tc2l6ZSA9IDwxNj47CisJCQlmc2wsdHgtZmlmby1zaXplID0gPDE2PjsKKwkJfTsKKworCQlzZXJpYWxAMTE2MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2MtdWFydCIsICJmc2wsbXBjNTEyMS1wc2MiOworCQkJY2VsbC1pbmRleCA9IDw2PjsKKwkJCXJlZyA9IDwweDExNjAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKKwkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OworCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCX07CisKKwkJc2VyaWFsQDExODAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtcHNjLXVhcnQiLCAiZnNsLG1wYzUxMjEtcHNjIjsKKwkJCWNlbGwtaW5kZXggPSA8OD47CisJCQlyZWcgPSA8MHgxMTgwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQwIDB4OD47CisJCQlmc2wscngtZmlmby1zaXplID0gPDE2PjsKKwkJCWZzbCx0eC1maWZvLXNpemUgPSA8MTY+OworCQl9OworCisJCXNlcmlhbEAxMUIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBzYy11YXJ0IiwgImZzbCxtcGM1MTIxLXBzYyI7CisJCQljZWxsLWluZGV4ID0gPDExPjsKKwkJCXJlZyA9IDwweDExQjAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKKwkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OworCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisJCX07CisKKwkJcHNjZmlmb0AxMWYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBzYy1maWZvIjsKKwkJCXJlZyA9IDwweDExZjAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKKwkJfTsKKworCQlzcGlAMTE5MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2Mtc3BpIiwgImZzbCxtcGM1MTIxLXBzYyI7CisJCQljZWxsLWluZGV4ID0gPDk+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDExOTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDAgMHg4PjsKKwkJCWZzbCxyeC1maWZvLXNpemUgPSA8MTY+OworCQkJZnNsLHR4LWZpZm8tc2l6ZSA9IDwxNj47CisKKwkJCS8vIDc4NDUgdG91Y2ggc2NyZWVuIGNvbnRyb2xsZXIKKwkJCXRzQDAgeworCQkJCWNvbXBhdGlibGUgPSAidGksYWRzNzg0NiI7CisJCQkJcmVnID0gPDB4MD47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MzAwMDAwMD47CisJCQkJLy8gcGVuIGlycSBpcyBHUElPMjUKKwkJCQlpbnRlcnJ1cHRzID0gPDc4IDB4OD47CisJCQl9OworCQl9OworCisJCWRtYUAxNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWRtYSI7CisJCQlyZWcgPSA8MHgxNDAwMCAweDE4MDA+OworCQkJaW50ZXJydXB0cyA9IDw2NSAweDg+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3N0eHNzYTg1NTUuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3N0eHNzYTg1NTUuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWZkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3R4c3NhODU1NS5kdHMKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBNUEM4NTU1LWJhc2VkIFNUeCBHUDMgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNpbGljb24gVHVybmtleSBFeHByZXNzIExMQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworCisvIHsKKwltb2RlbCA9ICJzdHgsZ3AzIjsKKyAgICAgICAgY29tcGF0aWJsZSA9ICJzdHgsZ3AzLTg1NjAiLCAic3R4LGdwMyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwlhbGlhc2VzIHsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlwY2kwID0gJnBjaTA7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw4NTU1QDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQkJZC1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCisJCQlpLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJCS8vIEwxLCAzMksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gIDMzIE1IeiwgZnJvbSB1Ym9vdAorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJLy8gMTY2IE1IegorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkvLyA4MjUgTUh6LCBmcm9tIHVib290CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MTAwMDAwMDA+OworCX07CisKKwlzb2M4NTU1QGUwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTAwMDAwMDAgMHgxMDAwMDA+OworCQlidXMtZnJlcXVlbmN5ID0gPDA+OworCisJCWVjbS1sYXdAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDw4PjsKKwkJfTsKKworCQllY21AMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LWVjbSIsICJmc2wsZWNtIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTcgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJfTsKKworCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OworCQl9OworCisJCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtbDItY2FjaGUtY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47CS8vIEwyLCAyNTZLCisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCX07CisKKwkJaTJjQDMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlkZnNycjsKKwkJfTsKKworCQlkbWFAMjEzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgyMTMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjAgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjEgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OworCQkJfTsKKwkJfTsKKworCQllbmV0MDogZXRoZXJuZXRAMjQwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCW1vZGVsID0gIlRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKKwkJCXJlZyA9IDwweDI0MDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjQwMDAgMHgxMDAwPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwIDIgMzQgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisKKwkJCW1kaW9ANTIwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLW1kaW8iOworCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKKworCQkJCXBoeTA6IGV0aGVybmV0LXBoeUAyIHsKKwkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJCWludGVycnVwdHMgPSA8NSAxPjsKKwkJCQkJcmVnID0gPDB4Mj47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJfTsKKwkJCQlwaHkxOiBldGhlcm5ldC1waHlANCB7CisJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CisJCQkJCXJlZyA9IDwweDQ+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJCX07CisJCQkJdGJpMDogdGJpLXBoeUAxMSB7CisJCQkJCXJlZyA9IDwweDExPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJZW5ldDE6IGV0aGVybmV0QDI1MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQltb2RlbCA9ICJUU0VDIjsKKwkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CisJCQlyZWcgPSA8MHgyNTAwMCAweDEwMDA+OworCQkJcmFuZ2VzID0gPDB4MCAweDI1MDAwIDB4MTAwMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MzUgMiAzNiAyIDQwIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkxPjsKKwkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OworCisJCQltZGlvQDUyMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiOworCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKKworCQkJCXRiaTE6IHRiaS1waHlAMTEgeworCQkJCQlyZWcgPSA8MHgxMT47CisJCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQkJCX07CisJCQl9OworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PworCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJY3J5cHRvQDMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzIuMCI7CisJCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NDUgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47CisJCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47CisJCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4N2U+OworCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDAxMDEwZWJmPjsKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCX07CisKKwkJY3BtQDkxOWMwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LWNwbSIsICJmc2wsY3BtMiI7CisJCQlyZWcgPSA8MHg5MTljMCAweDMwPjsKKwkJCXJhbmdlczsKKworCQkJbXVyYW1AODAwMDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJhbmdlcyA9IDwweDAgMHg4MDAwMCAweDEwMDAwPjsKKworCQkJCWRhdGFAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGNwbS1tdXJhbS1kYXRhIjsKKwkJCQkJcmVnID0gPDB4MCAweDIwMDAgMHg5MDAwIDB4MTAwMD47CisJCQkJfTsKKwkJCX07CisKKwkJCWJyZ0A5MTlmMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU1NS1icmciLAorCQkJCSAgICAgICAgICAgICAiZnNsLGNwbTItYnJnIiwKKwkJCQkgICAgICAgICAgICAgImZzbCxjcG0tYnJnIjsKKwkJCQlyZWcgPSA8MHg5MTlmMCAweDEwIDB4OTE1ZjAgMHgxMD47CisJCQl9OworCisJCQljcG1waWM6IHBpY0A5MGMwMCB7CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ2IDI+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCXJlZyA9IDwweDkwYzAwIDB4ODA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtY3BtLXBpYyIsICJmc2wsY3BtMi1waWMiOworCQkJfTsKKwkJfTsKKwl9OworCisJcGNpMDogcGNpQGUwMDA4MDAwIHsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4MWY4MDAgMHgwIDB4MCAweDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCisJCQkvKiBJRFNFTCAweDEwICovCisJCQkweDgwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQorCQkJMHg4MDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKKwkJCTB4ODAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCisJCQkweDgwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQorCisJCQkvKiBJRFNFTCAweDExICovCisJCQkweDg4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQorCQkJMHg4ODAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKKwkJCTB4ODgwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCisJCQkweDg4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQorCisJCQkvKiBJRFNFTCAweDEyIChTbG90IDEpICovCisJCQkweDkwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQorCQkJMHg5MDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKKwkJCTB4OTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCisJCQkweDkwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQorCisJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCisJCQkweDk4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgxIDB4MQorCQkJMHg5ODAwIDB4MCAweDAgMHgyICZtcGljIDB4MiAweDEKKwkJCTB4OTgwMCAweDAgMHgwIDB4MyAmbXBpYyAweDMgMHgxCisJCQkweDk4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgwIDB4MQorCisJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCisJCQkweGEwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQorCQkJMHhhMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKKwkJCTB4YTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDAgMHgxCisJCQkweGEwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQorCisJCQkvKiBJRFNFTCAweDE1IChTbG90IDQpICovCisJCQkweGE4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQorCQkJMHhhODAwIDB4MCAweDAgMHgyICZtcGljIDB4MCAweDEKKwkJCTB4YTgwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCisJCQkweGE4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQorCisJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KKwkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCisJCQkweDE5MDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEKKwkJCTB4MTkwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MQorCQkJMHgxOTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCisJCQkweDE5MDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDE+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJaW50ZXJydXB0cyA9IDwyNCAyPjsKKwkJYnVzLXJhbmdlID0gPDAgMD47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MCAweGUyMDAwMDAwIDB4MCAweDEwMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw2NjY2NjY2Nj47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4ZTAwMDgwMDAgMHgxMDAwPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1wY2kiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCisJCWk4MjU5QDE5MDAwIHsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4MTkwMDAgMHgwIDB4MCAweDAgMHgxPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxpaWMiOworCQkJaW50ZXJydXB0cyA9IDwxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBjaTA+OworCQl9OworCX07CisKKwlwY2kxOiBwY2lAZTAwMDkwMDAgeworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKworCQkJLyogSURTRUwgMHgxNSAqLworCQkJMHhhODAwIDB4MCAweDAgMHgxICZtcGljIDB4YiAweDEKKwkJCTB4YTgwMCAweDAgMHgwIDB4MiAmbXBpYyAweGIgMHgxCisJCQkweGE4MDAgMHgwIDB4MCAweDMgJm1waWMgMHhiIDB4MQorCQkJMHhhODAwIDB4MCAweDAgMHg0ICZtcGljIDB4YiAweDE+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJaW50ZXJydXB0cyA9IDwyNSAyPjsKKwkJYnVzLXJhbmdlID0gPDAgMD47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MCAweGUzMDAwMDAwIDB4MCAweDEwMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw2NjY2NjY2Nj47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4ZTAwMDkwMDAgMHgxMDAwPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1wY2kiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDAuZHRzCmluZGV4IDcxMzQ3NTMuLjE1Y2E3MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0MC5kdHMKQEAgLTI4OSw3ICsyODksMTQgQEAKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCQkvKiBJRFNFTCAyOCAqLwogCQkJCSAweGUwMDAgMCAwIDEgJm1waWMgMiAxCi0JCQkJIDB4ZTAwMCAwIDAgMiAmbXBpYyAzIDE+OworCQkJCSAweGUwMDAgMCAwIDIgJm1waWMgMyAxCisJCQkJIDB4ZTAwMCAwIDAgMyAmbXBpYyA2IDEKKwkJCQkgMHhlMDAwIDAgMCA0ICZtcGljIDUgMQorCisJCQkJLyogSURTRUwgMTEgKi8KKwkJCQkgMHg1ODAwIDAgMCAxICZtcGljIDYgMQorCQkJCSAweDU4MDAgMCAwIDIgJm1waWMgNSAxCisJCQkJID47CiAKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCWludGVycnVwdHMgPSA8MjQgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0MS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0MS5kdHMKaW5kZXggYjMwZjYzNy4uZjQ5ZDA5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQxLmR0cwpAQCAtMzExLDcgKzMxMSwxNCBAQAogCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJCS8qIElEU0VMIDI4ICovCiAJCQkJIDB4ZTAwMCAwIDAgMSAmbXBpYyAyIDEKLQkJCQkgMHhlMDAwIDAgMCAyICZtcGljIDMgMT47CisJCQkJIDB4ZTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkgMHhlMDAwIDAgMCAzICZtcGljIDYgMQorCQkJCSAweGUwMDAgMCAwIDQgJm1waWMgNSAxCisKKwkJCQkvKiBJRFNFTCAxMSAqLworCQkJCSAweDU4MDAgMCAwIDEgJm1waWMgNiAxCisJCQkJIDB4NTgwMCAwIDAgMiAmbXBpYyA1IDEKKwkJCQkgPjsKIAogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJaW50ZXJydXB0cyA9IDwyNCAyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LWJpZ2ZsYXNoLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LWJpZ2ZsYXNoLmR0cwppbmRleCA2MWYyNWUxLi41ZGJiMzZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC1iaWdmbGFzaC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDgtYmlnZmxhc2guZHRzCkBAIC00NDIsNyArNDQyLDE0IEBACiAJCWludGVycnVwdC1tYXAgPSA8CiAJCQkJLyogSURTRUwgMjggKi8KIAkJCQkgMHhlMDAwIDAgMCAxICZtcGljIDIgMQotCQkJCSAweGUwMDAgMCAwIDIgJm1waWMgMyAxPjsKKwkJCQkgMHhlMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCSAweGUwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkJIDB4ZTAwMCAwIDAgNCAmbXBpYyA1IDEKKworCQkJCS8qIElEU0VMIDExICovCisJCQkJIDB4NTgwMCAwIDAgMSAmbXBpYyA2IDEKKwkJCQkgMHg1ODAwIDAgMCAyICZtcGljIDUgMQorCQkJCSA+OwogCiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQlpbnRlcnJ1cHRzID0gPDI0IDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDguZHRzCmluZGV4IDAyNTc1OWMuLmEwNTBhZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC5kdHMKQEAgLTQ0Miw3ICs0NDIsMTQgQEAKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCQkvKiBJRFNFTCAyOCAqLwogCQkJCSAweGUwMDAgMCAwIDEgJm1waWMgMiAxCi0JCQkJIDB4ZTAwMCAwIDAgMiAmbXBpYyAzIDE+OworCQkJCSAweGUwMDAgMCAwIDIgJm1waWMgMyAxCisJCQkJIDB4ZTAwMCAwIDAgMyAmbXBpYyA2IDEKKwkJCQkgMHhlMDAwIDAgMCA0ICZtcGljIDUgMQorCisJCQkJLyogSURTRUwgMTEgKi8KKwkJCQkgMHg1ODAwIDAgMCAxICZtcGljIDYgMQorCQkJCSAweDU4MDAgMCAwIDIgJm1waWMgNSAxCisJCQkJID47CiAKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCWludGVycnVwdHMgPSA8MjQgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU1NS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU1NS5kdHMKaW5kZXggOTVlMjg3My4uODFiYWQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NTUuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTU1LmR0cwpAQCAtMzExLDcgKzMxMSwxNCBAQAogCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJCS8qIElEU0VMIDI4ICovCiAJCQkJIDB4ZTAwMCAwIDAgMSAmbXBpYyAyIDEKLQkJCQkgMHhlMDAwIDAgMCAyICZtcGljIDMgMT47CisJCQkJIDB4ZTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkgMHhlMDAwIDAgMCAzICZtcGljIDYgMQorCQkJCSAweGUwMDAgMCAwIDQgJm1waWMgNSAxCisKKwkJCQkvKiBJRFNFTCAxMSAqLworCQkJCSAweDU4MDAgMCAwIDEgJm1waWMgNiAxCisJCQkJIDB4NTgwMCAwIDAgMiAmbXBpYyA1IDEKKwkJCQkgPjsKIAogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJaW50ZXJydXB0cyA9IDwyNCAyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTYwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTYwLmR0cwppbmRleCBmZjcwNTgwLi4yMmVjMzliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU2MC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NjAuZHRzCkBAIC0zODIsNyArMzgyLDE0IEBACiAJCWludGVycnVwdC1tYXAgPSA8CiAJCQkJLyogSURTRUwgMjggKi8KIAkJCQkgMHhlMDAwIDAgMCAxICZtcGljIDIgMQotCQkJCSAweGUwMDAgMCAwIDIgJm1waWMgMyAxPjsKKwkJCQkgMHhlMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCSAweGUwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkJIDB4ZTAwMCAwIDAgNCAmbXBpYyA1IDEKKworCQkJCS8qIElEU0VMIDExICovCisJCQkJIDB4NTgwMCAwIDAgMSAmbXBpYyA2IDEKKwkJCQkgMHg1ODAwIDAgMCAyICZtcGljIDUgMQorCQkJCSA+OwogCiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQlpbnRlcnJ1cHRzID0gPDI0IDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTh4eC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtOHh4LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmRhN2VjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTh4eC5kdHMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBUUU04WFggRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CisgKiAyMDEwIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisKKy8geworCW1vZGVsID0gIlRRTTh4eCI7CisJY29tcGF0aWJsZSA9ICJ0cWMsdHFtOHh4IjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWFsaWFzZXMgeworCQlldGhlcm5ldDAgPSAmZXRoMDsKKwkJZXRoZXJuZXQxID0gJmV0aDE7CisJCW1kaW8xID0gJnBoeTE7CisJCXNlcmlhbDAgPSAmc21jMTsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLDg2MEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDE2PjsJLy8gMTYgYnl0ZXMKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDE2PjsJLy8gMTYgYnl0ZXMKKwkJCWQtY2FjaGUtc2l6ZSA9IDwweDEwMDA+OwkJLy8gTDEsIDRLCisJCQlpLWNhY2hlLXNpemUgPSA8MHgxMDAwPjsJCS8vIEwxLCA0SworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OworCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MTUgMj47CS8vIGRlY3JlbWVudGVyIGludGVycnVwdAorCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmUElDPjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4MCAweDIwMDAwMDA+OworCX07CisKKwlsb2NhbGJ1c0BmZmYwMDEwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MC1sb2NhbGJ1cyIsICJmc2wscHExLWxvY2FsYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhmZmYwMDEwMCAweDQwPjsKKworCQlyYW5nZXMgPSA8CisJCQkweDAgMHgwIDB4NDAwMDAwMDAgMHg4MDAwMDAKKwkJPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDgwMDAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJYmFuay13aWR0aCA9IDw0PjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJfTsKKwl9OworCisJc29jQGZmZjAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQlyYW5nZXMgPSA8MHgwIDB4ZmZmMDAwMDAgMHgwMDAwNDAwMD47CisKKwkJcGh5MTogbWRpb0BlMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY2LWZlYy1tZGlvIiwgImZzbCxwcTEtZmVjLW1kaW8iOworCQkJcmVnID0gPDB4ZTAwIDB4MTg4PjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlQSFk6IGV0aGVybmV0LXBoeUBmIHsKKwkJCQlyZWcgPSA8MHhmPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJfTsKKwkJfTsKKworCQlldGgxOiBldGhlcm5ldEBlMDAgeworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjYtZmVjLWVuZXQiLAorCQkJICAgICAgICAgICAgICJmc2wscHExLWZlYy1lbmV0IjsKKwkJCXJlZyA9IDwweGUwMCAweDE4OD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZQSUM+OworCQkJcGh5LWhhbmRsZSA9IDwmUEhZPjsKKwkJCWxpbnV4LG5ldHdvcmstaW5kZXggPSA8MT47CisJCX07CisKKwkJUElDOiBwaWNAMCB7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHgwIDB4MjQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYwLXBpYyIsICJmc2wscHExLXBpYyI7CisJCX07CisKKwkJY3BtQDljMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYwLWNwbSIsICJmc2wsY3BtMSI7CisJCQlyYW5nZXM7CisJCQlyZWcgPSA8MHg5YzAgMHg0MD47CisJCQlicmctZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDI+OwkvLyBjcG0gZXJyb3IgaW50ZXJydXB0CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDUE1fUElDPjsKKworCQkJbXVyYW1AMjAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmFuZ2VzID0gPDB4MCAweDIwMDAgMHgyMDAwPjsKKworCQkJCWRhdGFAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGNwbS1tdXJhbS1kYXRhIjsKKwkJCQkJcmVnID0gPDB4MCAweDIwMDA+OworCQkJCX07CisJCQl9OworCisJCQlicmdAOWYwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjAtYnJnIiwKKwkJCQkJICAgICAiZnNsLGNwbTEtYnJnIiwKKwkJCQkJICAgICAiZnNsLGNwbS1icmciOworCQkJCXJlZyA9IDwweDlmMCAweDEwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQl9OworCisJCQlDUE1fUElDOiBwaWNAOTMwIHsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmUElDPjsKKwkJCQlyZWcgPSA8MHg5MzAgMHgyMD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYwLWNwbS1waWMiLAorCQkJCSAgICAgICAgICAgICAiZnNsLGNwbTEtcGljIjsKKwkJCX07CisKKworCQkJc21jMTogc2VyaWFsQGE4MCB7CisJCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjAtc21jLXVhcnQiLAorCQkJCSAgICAgICAgICAgICAiZnNsLGNwbTEtc21jLXVhcnQiOworCQkJCXJlZyA9IDwweGE4MCAweDEwIDB4M2U4MCAweDQwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNQTV9QSUM+OworCQkJCWZzbCxjcG0tYnJnID0gPDE+OworCQkJCWZzbCxjcG0tY29tbWFuZCA9IDwweDkwPjsKKwkJCX07CisKKwkJCWV0aDA6IGV0aGVybmV0QGEwMCB7CisJCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYwLXNjYy1lbmV0IiwKKwkJCQkgICAgICAgICAgICAgImZzbCxjcG0xLXNjYy1lbmV0IjsKKwkJCQlyZWcgPSA8MHhhMDAgMHgxOCAweDNjMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNQTV9QSUM+OworCQkJCWZzbCxjcG0tY29tbWFuZCA9IDwwMDAwPjsKKwkJCQlsaW51eCxuZXR3b3JrLWluZGV4ID0gPDA+OworCQkJCWZpeGVkLWxpbmsgPSA8MCAwIDEwIDAgMD47CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZwppbmRleCBjZmViZWY5Li5kMzJmMzFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZwpAQCAtMTksNyArMTksOCBAQAogQ09ORklHX0ZTTF9FTUJfUEVSRk1PTj15CiBDT05GSUdfQk9PS0U9eQogQ09ORklHX0ZTTF9CT09LRT15Ci0jIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19QVEVfNjRCSVQ9eQorQ09ORklHX1BIWVNfNjRCSVQ9eQogQ09ORklHX1NQRT15CiBDT05GSUdfUFBDX01NVV9OT0hBU0g9eQogQ09ORklHX1BQQ19NTVVfTk9IQVNIXzMyPXkKQEAgLTI4LDcgKzI5LDcgQEAKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDMzI9eQogQ09ORklHX1dPUkRfU0laRT0zMgotIyBDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQpAQCAtMjM5LDYgKzI0MCw3IEBACiBDT05GSUdfTVBDODUzNl9EUz15CiBDT05GSUdfTVBDODV4eF9EUz15CiBDT05GSUdfTVBDODV4eF9SREI9eQorQ09ORklHX1AxMDIyX0RTPXkKIENPTkZJR19TT0NSQVRFUz15CiBDT05GSUdfS1NJODU2MD15CiBDT05GSUdfWEVTX01QQzg1eHg9eQpAQCAtMzExLDcgKzMxMyw3IEBACiBDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiBDT05GSUdfTUlHUkFUSU9OPXkKLSMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19QSFlTX0FERFJfVF82NEJJVD15CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfQk9VTkNFPXkKIENPTkZJR19WSVJUX1RPX0JVUz15CkBAIC0zMjEsNyArMzIzLDcgQEAKICMgQ09ORklHX1BQQ18xNktfUEFHRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzY0S19QQUdFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfMjU2S19QQUdFUyBpcyBub3Qgc2V0Ci1DT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTIKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKIENPTkZJR19FWFRSQV9UQVJHRVRTPSIiCkBAIC0xMTIyLDE2ICsxMTI0LDEzIEBACiAjIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKIENPTkZJR19TT1VORD15Ci1DT05GSUdfU09VTkRfT1NTX0NPUkU9eQotQ09ORklHX1NPVU5EX09TU19DT1JFX1BSRUNMQUlNPXkKKyMgQ09ORklHX1NPVU5EX09TU19DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19TTkQ9eQogQ09ORklHX1NORF9USU1FUj15CiBDT05GSUdfU05EX1BDTT15CiAjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfT1NTRU1VTD15Ci1DT05GSUdfU05EX01JWEVSX09TUz15Ci1DT05GSUdfU05EX1BDTV9PU1M9eQotQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQorIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENNX09TUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfSFJUSU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CkBAIC0xMTQ1LDEyICsxMTQ0LDcgQEAKICMgQ09ORklHX1NORF9TQkFXRV9TRVEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzFfU0VRIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQUM5N19DT0RFQz15Ci1DT05GSUdfU05EX0RSSVZFUlM9eQotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RSSVZFUlMgaXMgbm90IHNldAogQ09ORklHX1NORF9QQ0k9eQogIyBDT05GSUdfU05EX0FEMTg4OSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQUxTMzAwIGlzIG5vdCBzZXQKQEAgLTEyMTgsMTIgKzEyMTIsOCBAQAogIyBDT05GSUdfU05EX1ZJUlRVT1NPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfUFBDPXkKLUNPTkZJR19TTkRfVVNCPXkKLSMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAotIyBDT05GSUdfU05EX1VTQl9VQTEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVVNCX1VTWDJZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BQQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVVNCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0FDOTdfQlVTPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZwppbmRleCBmNTQ1MWQ4Li5mOTNkZTEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCkBAIC0xOSw3ICsxOSw4IEBACiBDT05GSUdfRlNMX0VNQl9QRVJGTU9OPXkKIENPTkZJR19CT09LRT15CiBDT05GSUdfRlNMX0JPT0tFPXkKLSMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1BURV82NEJJVD15CitDT05GSUdfUEhZU182NEJJVD15CiBDT05GSUdfU1BFPXkKIENPTkZJR19QUENfTU1VX05PSEFTSD15CiBDT05GSUdfUFBDX01NVV9OT0hBU0hfMzI9eQpAQCAtMjksNyArMzAsNyBAQAogQ09ORklHX05SX0NQVVM9OAogQ09ORklHX1BQQzMyPXkKIENPTkZJR19XT1JEX1NJWkU9MzIKLSMgQ09ORklHX0FSQ0hfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUEhZU19BRERSX1RfNjRCSVQ9eQogQ09ORklHX01NVT15CiBDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKQEAgLTI0Myw2ICsyNDQsNyBAQAogQ09ORklHX01QQzg1MzZfRFM9eQogQ09ORklHX01QQzg1eHhfRFM9eQogQ09ORklHX01QQzg1eHhfUkRCPXkKK0NPTkZJR19QMTAyMl9EUz15CiBDT05GSUdfU09DUkFURVM9eQogQ09ORklHX0tTSTg1NjA9eQogQ09ORklHX1hFU19NUEM4NXh4PXkKQEAgLTMxNiw3ICszMTgsNyBAQAogQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogQ09ORklHX01JR1JBVElPTj15Ci0jIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfUEhZU19BRERSX1RfNjRCSVQ9eQogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0JPVU5DRT15CiBDT05GSUdfVklSVF9UT19CVVM9eQpAQCAtMzI2LDcgKzMyOCw3IEBACiAjIENPTkZJR19QUENfMTZLX1BBR0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ182NEtfUEFHRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzI1NktfUEFHRVMgaXMgbm90IHNldAotQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEyCiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUUkFfVEFSR0VUUz0iIgpAQCAtMTEyNywxNiArMTEyOSwxMyBAQAogIyBDT05GSUdfVkdBQ09OX1NPRlRfU0NST0xMQkFDSyBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15CiBDT05GSUdfU09VTkQ9eQotQ09ORklHX1NPVU5EX09TU19DT1JFPXkKLUNPTkZJR19TT1VORF9PU1NfQ09SRV9QUkVDTEFJTT15CisjIENPTkZJR19TT1VORF9PU1NfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfU05EPXkKIENPTkZJR19TTkRfVElNRVI9eQogQ09ORklHX1NORF9QQ009eQogIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX09TU0VNVUw9eQotQ09ORklHX1NORF9NSVhFUl9PU1M9eQotQ09ORklHX1NORF9QQ01fT1NTPXkKLUNPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9NSVhFUl9PU1MgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDTV9PU1MgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0hSVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldApAQCAtMTE1MCwxMiArMTE0OSw3IEBACiAjIENPTkZJR19TTkRfU0JBV0VfU0VRIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTVUxMEsxX1NFUSBpcyBub3Qgc2V0CiBDT05GSUdfU05EX0FDOTdfQ09ERUM9eQotQ09ORklHX1NORF9EUklWRVJTPXkKLSMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EUklWRVJTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfUENJPXkKICMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0CkBAIC0xMjIzLDEyICsxMjE3LDggQEAKICMgQ09ORklHX1NORF9WSVJUVU9TTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1BQQz15Ci1DT05GSUdfU05EX1VTQj15Ci0jIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9VU0JfVUExMDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1VTQl9VU1gyWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QUEMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19BQzk3X0JVUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy90cW04eHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvdHFtOHh4X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU2NTRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvdHFtOHh4X2RlZmNvbmZpZwpAQCAtMCwwICsxLDkzNCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjM0LXJjMQorIyBUdWUgTWFyIDIzIDA4OjIyOjE1IDIwMTAKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc3VwcG9ydAorIworIyBDT05GSUdfUFBDX0JPT0szU18zMiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODV4eCBpcyBub3Qgc2V0CitDT05GSUdfUFBDXzh4eD15CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAorQ09ORklHXzh4eD15CitDT05GSUdfUFBDX01NVV9OT0hBU0g9eQorQ09ORklHX1BQQ19NTVVfTk9IQVNIXzMyPXkKKyMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15CitDT05GSUdfUFBDMzI9eQorQ09ORklHX1dPUkRfU0laRT0zMgorIyBDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKKyMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FRURfUEVSX0NQVV9FTUJFRF9GSVJTVF9DSFVOSyBpcyBub3Qgc2V0CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX05SX0lSUVM9NTEyCitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CisjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19PRj15CisjIENPTkZJR19QUENfVURCR18xNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RUQz15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfREVCVUdfUEFHRUFMTE9DPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorCisjCisjIFJDVSBTdWJzeXN0ZW0KKyMKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTllfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xVQl9ERUJVRz15CitDT05GSUdfQ09NUEFUX0JSSz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQorQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CitDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9ETUFfQVRUUlM9eQorQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19CQVNFX1NNQUxMPTEKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CitDT05GSUdfQkxPQ0s9eQorQ09ORklHX0xCREFGPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJkZWFkbGluZSIKKyMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTVVURVhfU1BJTl9PTl9PV05FUiBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCisjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorQ09ORklHX0NQTTE9eQorIyBDT05GSUdfTVBDOFhYRkFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NlhBRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDODg1QURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FUDg4WEMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0FEREVSODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NR1NVVkQgaXMgbm90IHNldAorQ09ORklHX1RRTThYWD15CisKKyMKKyMgTVBDOHh4IENQTSBPcHRpb25zCisjCisKKyMKKyMgR2VuZXJpYyBNUEM4eHggT3B0aW9ucworIworQ09ORklHXzh4eF9DT1BZQkFDSz15CisjIENPTkZJR184eHhfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR184eHhfQ1BVNiBpcyBub3Qgc2V0CisjIENPTkZJR184eHhfQ1BVMTUgaXMgbm90IHNldAorQ09ORklHX05PX1VDT0RFX1BBVENIPXkKKyMgQ09ORklHX1VTQl9TT0ZfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9VQ09ERV9QQVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1BJX1NNQzFfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfUFEyQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQyBpcyBub3Qgc2V0CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEMxMDYgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfSU9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfUVVJQ0NfRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTTF9VTEkxNTc1IGlzIG5vdCBzZXQKK0NPTkZJR19DUE09eQorIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorQ09ORklHX0haXzEwMD15CisjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR184WFhfTUlOSU1BTF9GUEVNVT15CisjIENPTkZJR19JT01NVV9IRUxQRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1dJT1RMQiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQorQ09ORklHX0FSQ0hfSEFTX1dBTEtfTUVNT1JZPXkKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFPXkKK0NPTkZJR19TUEFSU0VfSVJRPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MzIKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKK0NPTkZJR19QUENfNEtfUEFHRVM9eQorIyBDT05GSUdfUFBDXzE2S19QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ18yNTZLX1BBR0VTIGlzIG5vdCBzZXQKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTExCitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfRVhUUkFfVEFSR0VUUz0iIgorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX05FRURfRE1BX01BUF9TVEFURT15CitDT05GSUdfRlNMX1NPQz15CisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1FTUEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVNfUkFQSURJTyBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19QQUdFX09GRlNFVD0weGMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19QSFlTSUNBTF9TVEFSVD0weDAwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19DT05TSVNURU5UX1NJWkU9MHgwMDIwMDAwMAorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKK0NPTkZJR19NVERfT0ZfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUF9PRj15CisjIENPTkZJR19NVERfQ0ZJX0ZMQUdBRE0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBMUEREUiBmbGFzaCBtZW1vcnkgZHJpdmVycworIworIyBDT05GSUdfTVREX0xQRERSIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorQ09ORklHX09GX0ZMQVRUUkVFPXkKK0NPTkZJR19PRl9EWU5BTUlDPXkKK0NPTkZJR19PRl9ERVZJQ0U9eQorQ09ORklHX09GX01ESU89eQorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19QSFlMSUI9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKK0NPTkZJR19EQVZJQ09NX1BIWT15CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVElPTkFMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVEUxMFhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTSV9FVDEwMTFDX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfRklYRURfUEhZPXkKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfRVRIT0MgaXMgbm90IHNldAorIyBDT05GSUdfRE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CisjIENPTkZJR19YSUxJTlhfRU1BQ0xJVEUgaXMgbm90IHNldAorQ09ORklHX0ZTX0VORVQ9eQorQ09ORklHX0ZTX0VORVRfSEFTX1NDQz15CitDT05GSUdfRlNfRU5FVF9IQVNfRkVDPXkKK0NPTkZJR19GU19FTkVUX01ESU9fRkVDPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKKworIworIyBFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DUE09eQorQ09ORklHX1NFUklBTF9DUE1fQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfVElNQkVSREFMRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfR1JMSUJfR0FJU0xFUl9BUEJVQVJUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hWQ19VREJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTV9USU1FUklPTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5fUlRDPXkKKyMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VEQUMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFRJIFZMWU5RCisjCisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorQ09ORklHX0ZTTk9USUZZPXkKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CisjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTE9HRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19TUVVBU0hGUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFMgaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQorQ09ORklHX05MQVRUUj15CitDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CitDT05GSUdfRlRSQUNFPXkKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX0RFRkFVTFRfVFJBQ0VSUyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RJU0FCTEVfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfV0VSUk9SPXkKK0NPTkZJR19QUklOVF9TVEFDS19ERVBUSD02NAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RFX1BBVENISU5HX1NFTEZURVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUl9GSVhVUF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19NU0lfQklUTUFQX1NFTEZURVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hNT04gaXMgbm90IHNldAorIyBDT05GSUdfSVJRU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfU01BQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9UT01PWU8gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorQ09ORklHX1BQQ19DTE9DSz15CitDT05GSUdfUFBDX0xJQl9SSEVBUD15CisjIENPTkZJR19WSVJUVUFMSVpBVElPTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYWJzX2FkZHIuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hYnNfYWRkci5oCmluZGV4IDlhODQ2ZWYuLjVhYjBiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hYnNfYWRkci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hYnNfYWRkci5oCkBAIC02OSw3ICs2OSw3IEBACiAgKiBMZWdhY3kgaVNlcmllcyBIeXBlcnZpc29yIGNhbGxzCiAgKi8KICNkZWZpbmUgaXNlcmllc19odl9hZGRyKHZpcnRhZGRyKQlcCi0JKDB4ODAwMDAwMDAwMDAwMDAwMCB8IHZpcnRfdG9fYWJzKHZpcnRhZGRyKSkKKwkoMHg4MDAwMDAwMDAwMDAwMDAwVUwgfCB2aXJ0X3RvX2Ficyh2aXJ0YWRkcikpCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0FCU19BRERSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tY29tcGF0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXNtLWNvbXBhdC5oCmluZGV4IDIwNDhhNmEuLmRlY2FkOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tY29tcGF0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2FzbS1jb21wYXQuaApAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBQUENfU1RMQ1gJc3RyaW5naWZ5X2luX2Moc3RkY3guKQogI2RlZmluZSBQUENfQ05UTFpMCXN0cmluZ2lmeV9pbl9jKGNudGx6ZCkKICNkZWZpbmUgUFBDX0xSX1NUS09GRgkxNgorI2RlZmluZSBQUENfTUlOX1NUS0ZSTQkxMTIKIAogLyogTW92ZSB0byBDUiwgc2luZ2xlLWVudHJ5IG9wdGltaXplZCB2ZXJzaW9uLiBPbmx5IGF2YWlsYWJsZQogICogb24gUE9XRVI0IGFuZCBsYXRlci4KQEAgLTU1LDYgKzU2LDcgQEAKICNkZWZpbmUgUFBDX0NOVExaTAlzdHJpbmdpZnlfaW5fYyhjbnRsencpCiAjZGVmaW5lIFBQQ19NVE9DUkYJc3RyaW5naWZ5X2luX2MobXRjcmYpCiAjZGVmaW5lIFBQQ19MUl9TVEtPRkYJNAorI2RlZmluZSBQUENfTUlOX1NUS0ZSTQkxNgogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaAppbmRleCBiMGIyMTEzLi4zYTQwYTk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaApAQCAtMTk3LDYgKzE5Nyw3IEBACiAjZGVmaW5lIENQVV9GVFJfU0FPCQkJTE9OR19BU01fQ09OU1QoMHgwMDIwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NQX1VTRV9EQ0JUWgkJTE9OR19BU01fQ09OU1QoMHgwMDQwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1VOQUxJR05FRF9MRF9TVEQJTE9OR19BU01fQ09OU1QoMHgwMDgwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBDUFVfRlRSX0FTWU1fU01UCQlMT05HX0FTTV9DT05TVCgweDAxMDAwMDAwMDAwMDAwMDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTQxMiw3ICs0MTMsNyBAQAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSB8IFwKLQkgICAgQ1BVX0ZUUl9EU0NSIHwgQ1BVX0ZUUl9TQU8pCisJICAgIENQVV9GVFJfRFNDUiB8IENQVV9GVFJfU0FPICB8IENQVV9GVFJfQVNZTV9TTVQpCiAjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MV1NZTkMgfCBcCiAJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCkBAIC01MTcsNiArNTE4LDEwIEBACiAJCSYgZmVhdHVyZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCisjZGVmaW5lIEhCUF9OVU0gMQorI2VuZGlmIC8qIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQgKi8KKwogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kYmVsbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RiZWxsLmgKaW5kZXggNTAxMTg5YS4uMDg5M2FiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RiZWxsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RiZWxsLmgKQEAgLTI3LDEwICsyNywxMCBAQAogCVBQQ19HX0RCRUxMX01DID0gNCwJLyogZ3Vlc3QgbWNoZWNrIGRvb3JiZWxsICovCiB9OwogCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZGJlbGxfc21wX21lc3NhZ2VbTlJfQ1BVU107Ci1leHRlcm4gdm9pZCBzbXBfZGJlbGxfbWVzc2FnZV9wYXNzKGludCB0YXJnZXQsIGludCBtc2cpOwotI2VuZGlmCitleHRlcm4gdm9pZCBkb29yYmVsbF9tZXNzYWdlX3Bhc3MoaW50IHRhcmdldCwgaW50IG1zZyk7CitleHRlcm4gdm9pZCBkb29yYmVsbF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIHZvaWQgZG9vcmJlbGxfY2hlY2tfc2VsZih2b2lkKTsKK2V4dGVybiB2b2lkIGRvb3JiZWxsX3NldHVwX3RoaXNfY3B1KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHBjX21zZ3NuZChlbnVtIHBwY19kYmVsbCB0eXBlLCB1MzIgZmxhZ3MsIHUzMiB0YWcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKaW5kZXggNTExOWI3ZC4uZGUwM2NhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaApAQCAtNzQsNiArNzQsNyBAQAogI2RlZmluZSBIX05PVF9FTk9VR0hfUkVTT1VSQ0VTIC00NAogI2RlZmluZSBIX1JfU1RBVEUgICAgICAgLTQ1CiAjZGVmaW5lIEhfUkVTQ0lOREVORCAgICAtNDYKKyNkZWZpbmUgSF9NVUxUSV9USFJFQURTX0FDVElWRSAtOTAwNQogCiAKIC8qIExvbmcgQnVzeSBpcyBhIGNvbmRpdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSB0aGUgZmlybXdhcmUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzNlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBQb3dlclBDIEJvb2tJSUkgUyBoYXJkd2FyZSBicmVha3BvaW50IGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCwgSUJNIENvcnBvcmF0aW9uLgorICogQXV0aG9yOiBLLlByYXNhZCA8cHJhc2FkQGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfUFBDX0JPT0szU182NF9IV19CUkVBS1BPSU5UX0gKKyNkZWZpbmUgX1BQQ19CT09LM1NfNjRfSFdfQlJFQUtQT0lOVF9ICisKKyNpZmRlZglfX0tFUk5FTF9fCisjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAorCitzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50IHsKKwlib29sCQlleHRyYW5lb3VzX2ludGVycnVwdDsKKwl1OAkJbGVuOyAvKiBsZW5ndGggb2YgdGhlIHRhcmdldCBkYXRhIHN5bWJvbCAqLworCWludAkJdHlwZTsKKwl1bnNpZ25lZCBsb25nCWFkZHJlc3M7Cit9OworCisjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RydWN0IHBlcmZfZXZlbnQ7CitzdHJ1Y3QgcG11Oworc3RydWN0IHBlcmZfc2FtcGxlX2RhdGE7CisKKyNkZWZpbmUgSFdfQlJFQUtQT0lOVF9BTElHTiAweDcKKy8qIE1heGltdW0gcGVybWlzc2libGUgbGVuZ3RoIG9mIGFueSBIVyBCcmVha3BvaW50ICovCisjZGVmaW5lIEhXX0JSRUFLUE9JTlRfTEVOIDB4OAorCitleHRlcm4gaW50IGh3X2JyZWFrcG9pbnRfc2xvdHMoaW50IHR5cGUpOworZXh0ZXJuIGludCBhcmNoX2JwX2dlbmVyaWNfZmllbGRzKGludCB0eXBlLCBpbnQgKmdlbl9icF90eXBlKTsKK2V4dGVybiBpbnQgYXJjaF9jaGVja19icF9pbl9rZXJuZWxzcGFjZShzdHJ1Y3QgcGVyZl9ldmVudCAqYnApOworZXh0ZXJuIGludCBhcmNoX3ZhbGlkYXRlX2h3YmtwdF9zZXR0aW5ncyhzdHJ1Y3QgcGVyZl9ldmVudCAqYnApOworZXh0ZXJuIGludCBod19icmVha3BvaW50X2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAorCQkJCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpOworaW50IGFyY2hfaW5zdGFsbF9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCk7Cit2b2lkIGFyY2hfdW5pbnN0YWxsX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKTsKK3ZvaWQgaHdfYnJlYWtwb2ludF9wbXVfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApOworZXh0ZXJuIHZvaWQgZmx1c2hfcHRyYWNlX2h3X2JyZWFrcG9pbnQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCitleHRlcm4gc3RydWN0IHBtdSBwZXJmX29wc19icDsKK2V4dGVybiB2b2lkIHB0cmFjZV90cmlnZ2VyZWQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBpbnQgbm1pLAorCQkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBod19icmVha3BvaW50X2Rpc2FibGUodm9pZCkKK3sKKwlzZXRfZGFicigwKTsKK30KK2V4dGVybiB2b2lkIHRocmVhZF9jaGFuZ2VfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworI2Vsc2UJLyogQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCAqLworc3RhdGljIGlubGluZSB2b2lkIGh3X2JyZWFrcG9pbnRfZGlzYWJsZSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aHJlYWRfY2hhbmdlX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykgeyB9CisjZW5kaWYJLyogQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCAqLworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfUFBDX0JPT0szU182NF9IV19CUkVBS1BPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCBlY2JhMzdhLi42N2FiNWZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0zMDAsMzQgKzMwMCw2IEBACiAgKi8KIGV4dGVybiB2b2lkIGlycV9mcmVlX3ZpcnQodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBjb3VudCk7CiAKLQotLyogLS0gT0YgaGVscGVycyAtLSAqLwotCi0vKioKLSAqIGlycV9jcmVhdGVfb2ZfbWFwcGluZyAtIE1hcCBhIGhhcmR3YXJlIGludGVycnVwdCBpbnRvIGxpbnV4IHZpcnEgc3BhY2UKLSAqIEBjb250cm9sbGVyOiBEZXZpY2Ugbm9kZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAqIEBpbnNwZWM6IEludGVycnVwdCBzcGVjaWZpZXIgZnJvbSB0aGUgZGV2aWNlLXRyZWUKLSAqIEBpbnRzaXplOiBTaXplIG9mIHRoZSBpbnRlcnJ1cHQgc3BlY2lmaWVyIGZyb20gdGhlIGRldmljZS10cmVlCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXJxX2NyZWF0ZV9tYXBwaW5nIGV4Y2VwdCB0aGF0IGl0IHRha2VzCi0gKiBhcyBpbnB1dCBpbmZvcm1hdGlvbnMgc3RyYWlnaHQgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKHR5cGljYWxseSB0aGUgcmVzdWx0cwotICogb2YgdGhlIG9mX2lycV9tYXBfKigpIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX29mX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAotCQkJCQkgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUpOwotCi0vKioKLSAqIGlycV9vZl9wYXJzZV9hbmRfbWFwIC0gUGFyc2UgYW5kIE1hcCBhbiBpbnRlcnJ1cHQgaW50byBsaW51eCB2aXJxIHNwYWNlCi0gKiBAZGV2aWNlOiBEZXZpY2Ugbm9kZSBvZiB0aGUgZGV2aWNlIHdob3NlIGludGVycnVwdCBpcyB0byBiZSBtYXBwZWQKLSAqIEBpbmRleDogSW5kZXggb2YgdGhlIGludGVycnVwdCB0byBtYXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciB0aGF0IGNoYWlucyBvZl9pcnFfbWFwX29uZSgpIGFuZAotICogaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKCkgdG8gbWFrZSB0aGluZ3MgZWFzaWVyIHRvIGNhbGxlcnMKLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfb2ZfcGFyc2VfYW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4KTsKLQotLyogLS0gRW5kIE9GIGhlbHBlcnMgLS0gKi8KLQogLyoqCiAgKiBpcnFfZWFybHlfaW5pdCAtIEluaXQgaXJxIHJlbWFwcGluZyBzdWJzeXN0ZW0KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKaW5kZXggNmY3NGQ5My4uODI3NGEyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCkBAIC0xMTUsNyArMTE1LDE1IEBACiBleHRlcm4gaW50IGt2bXBwY19tbXVfbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqcHRlKTsKIGV4dGVybiBpbnQga3ZtcHBjX21tdV9tYXBfc2VnbWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGVhZGRyKTsKIGV4dGVybiB2b2lkIGt2bXBwY19tbXVfZmx1c2hfc2VnbWVudHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLWV4dGVybiBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqa3ZtcHBjX21tdV9maW5kX3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBlYSwgYm9vbCBkYXRhKTsKKworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9ocHRlX2NhY2hlX21hcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBocHRlX2NhY2hlICpwdGUpOworZXh0ZXJuIHN0cnVjdCBocHRlX2NhY2hlICprdm1wcGNfbW11X2hwdGVfY2FjaGVfbmV4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9ocHRlX2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2V4dGVybiBpbnQga3ZtcHBjX21tdV9ocHRlX2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2V4dGVybiB2b2lkIGt2bXBwY19tbXVfaW52YWxpZGF0ZV9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlKTsKK2V4dGVybiBpbnQga3ZtcHBjX21tdV9ocHRlX3N5c2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBrdm1wcGNfbW11X2hwdGVfc3lzZXhpdCh2b2lkKTsKKwogZXh0ZXJuIGludCBrdm1wcGNfbGQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyAqZWFkZHIsIGludCBzaXplLCB2b2lkICpwdHIsIGJvb2wgZGF0YSk7CiBleHRlcm4gaW50IGt2bXBwY19zdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nICplYWRkciwgaW50IHNpemUsIHZvaWQgKnB0ciwgYm9vbCBkYXRhKTsKIGV4dGVybiB2b2lkIGt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCB2ZWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9mcHUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fZnB1LmgKaW5kZXggOTRmMDVkZS4uYzNkNGYwNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9mcHUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2ZwdS5oCkBAIC0yMiwyNCArMjIsMjQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWV4dGVybiB2b2lkIGZwc19mcmVzKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1MzIgKmRzdCwgdTMyICpzcmMxKTsKLWV4dGVybiB2b2lkIGZwc19mcnNxcnRlKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1MzIgKmRzdCwgdTMyICpzcmMxKTsKLWV4dGVybiB2b2lkIGZwc19mc3FydHMoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQsIHUzMiAqZHN0LCB1MzIgKnNyYzEpOworZXh0ZXJuIHZvaWQgZnBzX2ZyZXModTY0ICpmcHNjciwgdTMyICpkc3QsIHUzMiAqc3JjMSk7CitleHRlcm4gdm9pZCBmcHNfZnJzcXJ0ZSh1NjQgKmZwc2NyLCB1MzIgKmRzdCwgdTMyICpzcmMxKTsKK2V4dGVybiB2b2lkIGZwc19mc3FydHModTY0ICpmcHNjciwgdTMyICpkc3QsIHUzMiAqc3JjMSk7CiAKLWV4dGVybiB2b2lkIGZwc19mYWRkcyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyKTsKLWV4dGVybiB2b2lkIGZwc19mZGl2cyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyKTsKLWV4dGVybiB2b2lkIGZwc19mbXVscyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyKTsKLWV4dGVybiB2b2lkIGZwc19mc3VicyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyKTsKK2V4dGVybiB2b2lkIGZwc19mYWRkcyh1NjQgKmZwc2NyLCB1MzIgKmRzdCwgdTMyICpzcmMxLCB1MzIgKnNyYzIpOworZXh0ZXJuIHZvaWQgZnBzX2ZkaXZzKHU2NCAqZnBzY3IsIHUzMiAqZHN0LCB1MzIgKnNyYzEsIHUzMiAqc3JjMik7CitleHRlcm4gdm9pZCBmcHNfZm11bHModTY0ICpmcHNjciwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyKTsKK2V4dGVybiB2b2lkIGZwc19mc3Vicyh1NjQgKmZwc2NyLCB1MzIgKmRzdCwgdTMyICpzcmMxLCB1MzIgKnNyYzIpOwogCi1leHRlcm4gdm9pZCBmcHNfZm1hZGRzKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1MzIgKmRzdCwgdTMyICpzcmMxLCB1MzIgKnNyYzIsCitleHRlcm4gdm9pZCBmcHNfZm1hZGRzKHU2NCAqZnBzY3IsIHUzMiAqZHN0LCB1MzIgKnNyYzEsIHUzMiAqc3JjMiwKIAkJICAgICAgIHUzMiAqc3JjMyk7Ci1leHRlcm4gdm9pZCBmcHNfZm1zdWJzKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1MzIgKmRzdCwgdTMyICpzcmMxLCB1MzIgKnNyYzIsCitleHRlcm4gdm9pZCBmcHNfZm1zdWJzKHU2NCAqZnBzY3IsIHUzMiAqZHN0LCB1MzIgKnNyYzEsIHUzMiAqc3JjMiwKIAkJICAgICAgIHUzMiAqc3JjMyk7Ci1leHRlcm4gdm9pZCBmcHNfZm5tYWRkcyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyLAorZXh0ZXJuIHZvaWQgZnBzX2ZubWFkZHModTY0ICpmcHNjciwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyLAogCQkgICAgICAgIHUzMiAqc3JjMyk7Ci1leHRlcm4gdm9pZCBmcHNfZm5tc3VicyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyLAorZXh0ZXJuIHZvaWQgZnBzX2ZubXN1YnModTY0ICpmcHNjciwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyLAogCQkgICAgICAgIHUzMiAqc3JjMyk7Ci1leHRlcm4gdm9pZCBmcHNfZnNlbChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyLAorZXh0ZXJuIHZvaWQgZnBzX2ZzZWwodTY0ICpmcHNjciwgdTMyICpkc3QsIHUzMiAqc3JjMSwgdTMyICpzcmMyLAogCQkgICAgIHUzMiAqc3JjMyk7CiAKICNkZWZpbmUgRlBEX09ORV9JTihuYW1lKSBleHRlcm4gdm9pZCBmcGRfICMjIG5hbWUodTY0ICpmcHNjciwgdTMyICpjciwgXApAQCAtODIsNCArODIsNyBAQAogRlBEX1RIUkVFX0lOKGZubXN1YikKIEZQRF9USFJFRV9JTihmbm1hZGQpCiAKK2V4dGVybiB2b2lkIGt2bV9jdnRfZmQodTMyICpmcm9tLCB1NjQgKnRvLCB1NjQgKmZwc2NyKTsKK2V4dGVybiB2b2lkIGt2bV9jdnRfZGYodTY0ICpmcm9tLCB1MzIgKnRvLCB1NjQgKmZwc2NyKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDBjOWFkODYuLmIwYjIzYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0zNSwxMCArMzUsMTcgQEAKICNkZWZpbmUgS1ZNX0NPQUxFU0NFRF9NTUlPX1BBR0VfT0ZGU0VUIDEKIAogLyogV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgbGFyZ2UgcGFnZXMuICovCisjZGVmaW5lIEtWTV9IUEFHRV9HRk5fU0hJRlQoeCkJMAogI2RlZmluZSBLVk1fTlJfUEFHRV9TSVpFUwkxCiAjZGVmaW5lIEtWTV9QQUdFU19QRVJfSFBBR0UoeCkJKDFVTDw8MzEpCiAKLSNkZWZpbmUgSFBURUdfQ0FDSEVfTlVNIDEwMjQKKyNkZWZpbmUgSFBURUdfQ0FDSEVfTlVNCQkJKDEgPDwgMTUpCisjZGVmaW5lIEhQVEVHX0hBU0hfQklUU19QVEUJCTEzCisjZGVmaW5lIEhQVEVHX0hBU0hfQklUU19WUFRFCQkxMworI2RlZmluZSBIUFRFR19IQVNIX0JJVFNfVlBURV9MT05HCTUKKyNkZWZpbmUgSFBURUdfSEFTSF9OVU1fUFRFCQkoMSA8PCBIUFRFR19IQVNIX0JJVFNfUFRFKQorI2RlZmluZSBIUFRFR19IQVNIX05VTV9WUFRFCQkoMSA8PCBIUFRFR19IQVNIX0JJVFNfVlBURSkKKyNkZWZpbmUgSFBURUdfSEFTSF9OVU1fVlBURV9MT05HCSgxIDw8IEhQVEVHX0hBU0hfQklUU19WUFRFX0xPTkcpCiAKIHN0cnVjdCBrdm07CiBzdHJ1Y3Qga3ZtX3J1bjsKQEAgLTE1MSw2ICsxNTgsOSBAQAogfTsKIAogc3RydWN0IGhwdGVfY2FjaGUgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfcHRlOworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfdnB0ZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0X3ZwdGVfbG9uZzsKIAl1NjQgaG9zdF92YTsKIAl1NjQgcGZuOwogCXVsb25nIHNsb3Q7CkBAIC0yODIsOCArMjkyLDEwIEBACiAJdW5zaWduZWQgbG9uZyBwZW5kaW5nX2V4Y2VwdGlvbnM7CiAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szUwotCXN0cnVjdCBocHRlX2NhY2hlIGhwdGVfY2FjaGVbSFBURUdfQ0FDSEVfTlVNXTsKLQlpbnQgaHB0ZV9jYWNoZV9vZmZzZXQ7CisJc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3B0ZVtIUFRFR19IQVNIX05VTV9QVEVdOworCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF92cHRlW0hQVEVHX0hBU0hfTlVNX1ZQVEVdOworCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF92cHRlX2xvbmdbSFBURUdfSEFTSF9OVU1fVlBURV9MT05HXTsKKwlpbnQgaHB0ZV9jYWNoZV9jb3VudDsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2xvY2FsNjQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCmluZGV4IDc3MTZlNjguLmFkYzhlNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaApAQCAtMjY2LDYgKzI2Niw3IEBACiAJdm9pZCAoKnN1c3BlbmRfZGlzYWJsZV9pcnFzKSh2b2lkKTsKIAl2b2lkICgqc3VzcGVuZF9lbmFibGVfaXJxcykodm9pZCk7CiAjZW5kaWYKKwlpbnQgKCpzdXNwZW5kX2Rpc2FibGVfY3B1KSh2b2lkKTsKIAogI2lmZGVmIENPTkZJR19BUkNIX0NQVV9QUk9CRV9SRUxFQVNFCiAJc3NpemVfdCAoKmNwdV9wcm9iZSkoY29uc3QgY2hhciAqLCBzaXplX3QpOwpAQCAtMjc3LDYgKzI3OCw3IEBACiBleHRlcm4gdm9pZCBwb3dlcjRfaWRsZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBvd2VyNF9jcHVfb2ZmbGluZV9wb3dlcnNhdmUodm9pZCk7CiBleHRlcm4gdm9pZCBwcGM2eHhfaWRsZSh2b2lkKTsKK2V4dGVybiB2b2lkIGJvb2szZV9pZGxlKHZvaWQpOwogCiAvKgogICogcHBjX21kIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgbWFjaGluZSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2lvLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaW8uaAppbmRleCA2NzVlMTU5Li43YWI4MmM4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaW8uaApAQCAtMzgsNyArMzgsNyBAQAogewogCXN0cnVjdCBtYWNpb19idXMJKmJ1czsJCS8qIG1hY2lvIGJ1cyB0aGlzIGRldmljZSBpcyBvbiAqLwogCXN0cnVjdCBtYWNpb19kZXYJKm1lZGlhX2JheTsJLyogRGV2aWNlIGlzIHBhcnQgb2YgYSBtZWRpYSBiYXkgKi8KLQlzdHJ1Y3Qgb2ZfZGV2aWNlCW9mZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJb2ZkZXY7CiAJc3RydWN0IGRldmljZV9kbWFfcGFyYW1ldGVycyBkbWFfcGFybXM7IC8qIGlkZSBuZWVkcyB0aGF0ICovCiAJaW50CQkJbl9yZXNvdXJjZXM7CiAJc3RydWN0IHJlc291cmNlCQlyZXNvdXJjZVtNQUNJT19ERVZfQ09VTlRfUkVTT1VSQ0VTXTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCmluZGV4IDc0Njk1ODEuLjg3YTFkNzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaApAQCAtMTkzLDYgKzE5MywxMCBAQAogewogCXVuc2lnbmVkIGludAlzaGlmdDsJLyogbnVtYmVyIG9mIGJpdHMgKi8KIAl1bnNpZ25lZCBpbnQJZW5jOwkvKiBQVEUgZW5jb2RpbmcgKi8KKwl1bnNpZ25lZCBpbnQgICAgaW5kOyAgICAvKiBDb3JyZXNwb25kaW5nIGluZGlyZWN0IHBhZ2Ugc2l6ZSBzaGlmdCAqLworCXVuc2lnbmVkIGludAlmbGFnczsKKyNkZWZpbmUgTU1VX1BBR0VfU0laRV9ESVJFQ1QJMHgxCS8qIFN1cHBvcnRlZCBhcyBhIGRpcmVjdCBzaXplICovCisjZGVmaW5lIE1NVV9QQUdFX1NJWkVfSU5ESVJFQ1QJMHgyCS8qIFN1cHBvcnRlZCBhcyBhbiBpbmRpcmVjdCBzaXplICovCiB9OwogZXh0ZXJuIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21wYzUxMjEuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGM1MTIxLmgKaW5kZXggZTZhMzBiYi4uOGMwYWIyYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21wYzUxMjEuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBjNTEyMS5oCkBAIC0yMSw0ICsyMSwzNiBAQAogCXUzMglyY2VyOwkvKiBSZXNldCBDb250cm9sIEVuYWJsZSBSZWdpc3RlciAqLwogfTsKIAorLyoKKyAqIENsb2NrIENvbnRyb2wgTW9kdWxlCisgKi8KK3N0cnVjdCBtcGM1MTJ4X2NjbSB7CisJdTMyCXNwbXI7CS8qIFN5c3RlbSBQTEwgTW9kZSBSZWdpc3RlciAqLworCXUzMglzY2NyMTsJLyogU3lzdGVtIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworCXUzMglzY2NyMjsJLyogU3lzdGVtIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgMiAqLworCXUzMglzY2ZyMTsJLyogU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSBSZWdpc3RlciAxICovCisJdTMyCXNjZnIyOwkvKiBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IFJlZ2lzdGVyIDIgKi8KKwl1MzIJc2NmcjJzOwkvKiBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IFNoYWRvdyBSZWdpc3RlciAyICovCisJdTMyCWJjcjsJLyogQnJlYWQgQ3J1bWIgUmVnaXN0ZXIgKi8KKwl1MzIJcDBjY3I7CS8qIFBTQzAgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMglwMWNjcjsJLyogUFNDMSBDQ1IgKi8KKwl1MzIJcDJjY3I7CS8qIFBTQzIgQ0NSICovCisJdTMyCXAzY2NyOwkvKiBQU0MzIENDUiAqLworCXUzMglwNGNjcjsJLyogUFNDNCBDQ1IgKi8KKwl1MzIJcDVjY3I7CS8qIFBTQzUgQ0NSICovCisJdTMyCXA2Y2NyOwkvKiBQU0M2IENDUiAqLworCXUzMglwN2NjcjsJLyogUFNDNyBDQ1IgKi8KKwl1MzIJcDhjY3I7CS8qIFBTQzggQ0NSICovCisJdTMyCXA5Y2NyOwkvKiBQU0M5IENDUiAqLworCXUzMglwMTBjY3I7CS8qIFBTQzEwIENDUiAqLworCXUzMglwMTFjY3I7CS8qIFBTQzExIENDUiAqLworCXUzMglzcGNjcjsJLyogU1BESUYgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgljY2NyOwkvKiBDRk0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMglkY2NyOwkvKiBESVUgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgltMWNjcjsJLyogTVNDQU4xIENDUiAqLworCXUzMgltMmNjcjsJLyogTVNDQU4yIENDUiAqLworCXUzMgltM2NjcjsJLyogTVNDQU4zIENDUiAqLworCXUzMgltNGNjcjsJLyogTVNDQU40IENDUiAqLworCXU4CXJlc1sweDk4XTsgLyogUmVzZXJ2ZWQgKi8KK307CiAjZW5kaWYgLyogX19BU01fUE9XRVJQQ19NUEM1MTIxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRlOTdlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vZl9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QT1dFUlBDX09GX0RFVklDRV9ICi0jZGVmaW5lIF9BU01fUE9XRVJQQ19PRl9ERVZJQ0VfSAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0KLS8qCi0gKiBUaGUgb2ZfZGV2aWNlIGlzIGEga2luZCBvZiAiYmFzZSBjbGFzcyIgdGhhdCBpcyBhIHN1cGVyc2V0IG9mCi0gKiBzdHJ1Y3QgZGV2aWNlIGZvciB1c2UgYnkgZGV2aWNlcyBhdHRhY2hlZCB0byBhbiBPRiBub2RlIGFuZAotICogcHJvYmVkIHVzaW5nIE9GIHByb3BlcnRpZXMuCi0gKi8KLXN0cnVjdCBvZl9kZXZpY2UKLXsKLQlzdHJ1Y3QgZGV2aWNlCQlkZXY7CQkvKiBHZW5lcmljIGRldmljZSBpbnRlcmZhY2UgKi8KLQlzdHJ1Y3QgcGRldl9hcmNoZGF0YQlhcmNoZGF0YTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXZpY2VfYWxsb2Moc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJIGNvbnN0IGNoYXIgKmJ1c19pZCwKLQkJCQkJIHN0cnVjdCBkZXZpY2UgKnBhcmVudCk7Ci0KLWV4dGVybiBpbnQgb2ZfZGV2aWNlX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfQVNNX1BPV0VSUENfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vZl9wbGF0Zm9ybS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWFhMzQuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jaWZuZGVmIF9BU01fUE9XRVJQQ19PRl9QTEFURk9STV9ICi0jZGVmaW5lIF9BU01fUE9XRVJQQ19PRl9QTEFURk9STV9ICi0vKgotICogICAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgotICoJCQkgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotLyogUGxhdGZvcm0gZGV2aWNlcyBhbmQgYnVzc2VzIGNyZWF0aW9uICovCi1leHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJICAgY29uc3QgY2hhciAqYnVzX2lkLAotCQkJCQkJICAgc3RydWN0IGRldmljZSAqcGFyZW50KTsKLS8qIHBzZXVkbyAibWF0Y2hlcyIgdmFsdWUgdG8gbm90IGRvIGRlZXAgcHJvYmUgKi8KLSNkZWZpbmUgT0ZfTk9fREVFUF9QUk9CRSAoKHN0cnVjdCBvZl9kZXZpY2VfaWQgKiktMSkKLQotZXh0ZXJuIGludCBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoc3RydWN0IGRldmljZV9ub2RlICpyb290LAotCQkJCSBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAotCQkJCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOwotCi1leHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZShwaGFuZGxlIHBoKTsKLQotZXh0ZXJuIHZvaWQgb2ZfaW5zdGFudGlhdGVfcnRjKHZvaWQpOwotCi0jZW5kaWYJLyogX0FTTV9QT1dFUlBDX09GX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCmluZGV4IDhjZTc5NjMuLjFmZjY2NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaApAQCAtMTQ2LDcgKzE0Niw3IEBACiBleHRlcm4gc3RydWN0IHBhY2Ffc3RydWN0ICpwYWNhOwogZXh0ZXJuIF9faW5pdGRhdGEgc3RydWN0IHBhY2Ffc3RydWN0IGJvb3RfcGFjYTsKIGV4dGVybiB2b2lkIGluaXRpYWxpc2VfcGFjYShzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKm5ld19wYWNhLCBpbnQgY3B1KTsKLQorZXh0ZXJuIHZvaWQgc2V0dXBfcGFjYShzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKm5ld19wYWNhKTsKIGV4dGVybiB2b2lkIGFsbG9jYXRlX3BhY2FzKHZvaWQpOwogZXh0ZXJuIHZvaWQgZnJlZV91bnVzZWRfcGFjYXModm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCmluZGV4IDc2ZTFmMzEuLjUxZTllNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaApAQCAtMzAzLDEzICszMDMsOCBAQAogZXh0ZXJuIHZvaWQgcGNpYmlvc19zZXR1cF9waGJfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CiAKICNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7CiBleHRlcm4gaW50IHBjaWJpb3NfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcyk7CiAjZWxzZQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQotewotCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaWJpb3NfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcykKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJjcHUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJjcHUuaAppbmRleCBmODc5MjUyLi4yY2VkZWZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyY3B1LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmNwdS5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfUEVSQ1BVX0hfCiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QRVJDUFVfSF8KICNpZmRlZiBfX3Bvd2VycGM2NF9fCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogLyoKICAqIFNhbWUgYXMgYXNtLWdlbmVyaWMvcGVyY3B1LmgsIGV4Y2VwdCB0aGF0IHdlIHN0b3JlIHRoZSBwZXIgY3B1IG9mZnNldApAQCAtMTIsOSArMTEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KIAotI2RlZmluZSBfX3Blcl9jcHVfb2Zmc2V0KGNwdSkgKHBhY2FbY3B1XS5kYXRhX29mZnNldCkKICNkZWZpbmUgX19teV9jcHVfb2Zmc2V0IGxvY2FsX3BhY2EtPmRhdGFfb2Zmc2V0Ci0jZGVmaW5lIHBlcl9jcHVfb2Zmc2V0KHgpIChfX3Blcl9jcHVfb2Zmc2V0KHgpKQogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCmluZGV4IGU2ZDRjZTYuLjVjMTZiODkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtMjEsMyArMjEsMTUgQEAKICNpZmRlZiBDT05GSUdfRlNMX0VNQl9QRVJGX0VWRU5UCiAjaW5jbHVkZSA8YXNtL3BlcmZfZXZlbnRfZnNsX2VtYi5oPgogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisjZGVmaW5lIHBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncyhyZWdzLCBfX2lwKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJKHJlZ3MpLT5uaXAgPSBfX2lwOwkJCQlcCisJCShyZWdzKS0+Z3ByWzFdID0gKih1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKTsJXAorCQlhc20gdm9sYXRpbGUoIm1mbXNyICUwIiA6ICI9ciIgKChyZWdzKS0+bXNyKSk7CVwKKwl9IHdoaWxlICgwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAppbmRleCBkNTUzYmJlLi40M2FkYzhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmgKQEAgLTUyLDEzICs1MiwxNyBAQAogI2RlZmluZSBQUENfSU5TVF9XQUlUCQkJMHg3YzAwMDA3YwogI2RlZmluZSBQUENfSU5TVF9UTEJJVkFYCQkweDdjMDAwNjI0CiAjZGVmaW5lIFBQQ19JTlNUX1RMQlNSWF9ET1QJCTB4N2MwMDA2YTUKKyNkZWZpbmUgUFBDX0lOU1RfWFhMT1IJCQkweGYwMDAwNTEwCiAKIC8qIG1hY3JvcyB0byBpbnNlcnQgZmllbGRzIGludG8gb3Bjb2RlcyAqLwogI2RlZmluZSBfX1BQQ19SQShhKQkoKChhKSAmIDB4MWYpIDw8IDE2KQogI2RlZmluZSBfX1BQQ19SQihiKQkoKChiKSAmIDB4MWYpIDw8IDExKQogI2RlZmluZSBfX1BQQ19SUyhzKQkoKChzKSAmIDB4MWYpIDw8IDIxKQogI2RlZmluZSBfX1BQQ19SVChzKQlfX1BQQ19SUyhzKQorI2RlZmluZSBfX1BQQ19YQShhKQkoKCgoYSkgJiAweDFmKSA8PCAxNikgfCAoKChhKSAmIDB4MjApID4+IDMpKQorI2RlZmluZSBfX1BQQ19YQihiKQkoKCgoYikgJiAweDFmKSA8PCAxMSkgfCAoKChiKSAmIDB4MjApID4+IDQpKQogI2RlZmluZSBfX1BQQ19YUyhzKQkoKCgocykgJiAweDFmKSA8PCAyMSkgfCAoKChzKSAmIDB4MjApID4+IDUpKQorI2RlZmluZSBfX1BQQ19YVChzKQlfX1BQQ19YUyhzKQogI2RlZmluZSBfX1BQQ19UX1RMQih0KQkoKCh0KSAmIDB4MykgPDwgMjEpCiAjZGVmaW5lIF9fUFBDX1dDKHcpCSgoKHcpICYgMHgzKSA8PCAyMSkKIC8qCkBAIC0xMDYsOSArMTEwLDEyIEBACiAgKiB0aGUgMTI4IGJpdCBsb2FkIHN0b3JlIGluc3RydWN0aW9ucyBiYXNlZCBvbiB0aGF0LgogICovCiAjZGVmaW5lIFZTWF9YWDEocywgYSwgYikJKF9fUFBDX1hTKHMpIHwgX19QUENfUkEoYSkgfCBfX1BQQ19SQihiKSkKKyNkZWZpbmUgVlNYX1hYMyh0LCBhLCBiKQkoX19QUENfWFQodCkgfCBfX1BQQ19YQShhKSB8IF9fUFBDX1hCKGIpKQogI2RlZmluZSBTVFhWRDJYKHMsIGEsIGIpCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1NUWFZEMlggfCBcCiAJCQkJCSAgICAgICBWU1hfWFgxKChzKSwgKGEpLCAoYikpKQogI2RlZmluZSBMWFZEMlgocywgYSwgYikJCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX0xYVkQyWCB8IFwKIAkJCQkJICAgICAgIFZTWF9YWDEoKHMpLCAoYSksIChiKSkpCisjZGVmaW5lIFhYTE9SKHQsIGEsIGIpCQlzdHJpbmdpZnlfaW5fYygubG9uZyBQUENfSU5TVF9YWExPUiB8IFwKKwkJCQkJICAgICAgIFZTWF9YWDMoKHQpLCAoYSksIChiKSkpCiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUFBDX09QQ09ERV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNzQ5MmZlOC4uMTljMDViMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMjA5LDYgKzIwOSwxNCBAQAogI2lmZGVmIENPTkZJR19QUEM2NAogCXVuc2lnbmVkIGxvbmcJc3RhcnRfdGI7CS8qIFN0YXJ0IHB1cnIgd2hlbiBwcm9jIHN3aXRjaGVkIGluICovCiAJdW5zaWduZWQgbG9uZwlhY2N1bV90YjsJLyogVG90YWwgYWNjdW1pbGF0ZWQgcHVyciBmb3IgcHJvY2VzcyAqLworI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqcHRyYWNlX2Jwc1tIQlBfTlVNXTsKKwkvKgorCSAqIEhlbHBzIGlkZW50aWZ5IHNvdXJjZSBvZiBzaW5nbGUtc3RlcCBleGNlcHRpb24gYW5kIHN1YnNlcXVlbnQKKwkgKiBody1icmVha3BvaW50IGVuYWJsZW1lbnQKKwkgKi8KKwlzdHJ1Y3QgcGVyZl9ldmVudCAqbGFzdF9oaXRfdWJwOworI2VuZGlmIC8qIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQgKi8KICNlbmRpZgogCXVuc2lnbmVkIGxvbmcJZGFicjsJCS8qIERhdGEgYWRkcmVzcyBicmVha3BvaW50IHJlZ2lzdGVyICovCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IGRkZDQwOGEuLmFlMjZmMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMTcsOSArMTcsNiBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKQEAgLTQzLDQ5ICs0MCwxNCBAQAogICogT0YgYWRkcmVzcyByZXRyZWl2YWwgJiB0cmFuc2xhdGlvbgogICovCiAKLS8qIFRyYW5zbGF0ZSBhbiBPRiBhZGRyZXNzIGJsb2NrIGludG8gYSBDUFUgcGh5c2ljYWwgYWRkcmVzcwotICovCi1leHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IHUzMiAqYWRkcik7Ci0KIC8qIFRyYW5zbGF0ZSBhIERNQSBhZGRyZXNzIGZyb20gZGV2aWNlIHNwYWNlIHRvIENQVSBzcGFjZSAqLwogZXh0ZXJuIHU2NCBvZl90cmFuc2xhdGVfZG1hX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCiAJCQkJICAgIGNvbnN0IHUzMiAqaW5fYWRkcik7CiAKLS8qIEV4dHJhY3QgYW4gYWRkcmVzcyBmcm9tIGEgZGV2aWNlLCByZXR1cm5zIHRoZSByZWdpb24gc2l6ZSBhbmQKLSAqIHRoZSBhZGRyZXNzIHNwYWNlIGZsYWdzIHRvby4gVGhlIFBDSSB2ZXJzaW9uIHVzZXMgYSBCQVIgbnVtYmVyCi0gKiBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIGluZGV4Ci0gKi8KLWV4dGVybiBjb25zdCB1MzIgKm9mX2dldF9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCi0JCQkgICB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpOwogI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiBjb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywKLQkJCSAgICAgICB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgY29uc3QgdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCi0JCWludCBiYXJfbm8sIHU2NCAqc2l6ZSwgdW5zaWduZWQgaW50ICpmbGFncykKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0KLS8qIEdldCBhbiBhZGRyZXNzIGFzIGEgcmVzb3VyY2UuIE5vdGUgdGhhdCBpZiB5b3VyIGFkZHJlc3MgaXMKLSAqIGEgUElPIGFkZHJlc3MsIHRoZSBjb252ZXJzaW9uIHdpbGwgZmFpbCBpZiB0aGUgcGh5c2ljYWwgYWRkcmVzcwotICogY2FuJ3QgYmUgaW50ZXJuYWxseSBjb252ZXJ0ZWQgdG8gYW4gSU8gdG9rZW4gd2l0aAotICogcGNpX2FkZHJlc3NfdG9fcGlvKCksIHRoYXQgaXMgYmVjYXVzZSBpdCdzIGVpdGhlciBjYWxsZWQgdG8gZWFybHkKLSAqIG9yIGl0IGNhbid0IGJlIG1hdGNoZWQgdG8gYW55IGhvc3QgYnJpZGdlIElPIHNwYWNlCi0gKi8KLWV4dGVybiBpbnQgb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAotCQkJCSAgc3RydWN0IHJlc291cmNlICpyKTsKLSNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gaW50IG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyLAotCQkJCSAgICAgIHN0cnVjdCByZXNvdXJjZSAqcik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCi0JCXN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUENJICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7CisjZGVmaW5lIHBjaV9hZGRyZXNzX3RvX3BpbyBwY2lfYWRkcmVzc190b19waW8KKyNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKIC8qIFBhcnNlIHRoZSBpYm0sZG1hLXdpbmRvdyBwcm9wZXJ0eSBvZiBhbiBPRiBub2RlIGludG8gdGhlIGJ1c25vLCBwaHlzIGFuZAogICogc2l6ZSBwYXJhbWV0ZXJzLgpAQCAtMTA0LDY5ICs2NiwxMiBAQAogLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwogZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAotLyoKLSAqIE9GIGludGVycnVwdCBtYXBwaW5nCi0gKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgd2hlbiBhbiBpbnRlcnJ1cHQgaXMgbWFwcGVkLiBUaGUgY29udHJvbGxlcgotICogZmllbGQgbmVlZHMgdG8gYmUgcHV0KCkgYWZ0ZXIgdXNlCi0gKi8KLQotI2RlZmluZSBPRl9NQVhfSVJRX1NQRUMJCSA0IC8qIFdlIGhhbmRsZSBzcGVjaWZpZXJzIG9mIGF0IG1vc3QgNCBjZWxscyAqLwotCi1zdHJ1Y3Qgb2ZfaXJxIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXI7CS8qIEludGVycnVwdCBjb250cm9sbGVyIG5vZGUgKi8KLQl1MzIgc2l6ZTsJCQkvKiBTcGVjaWZpZXIgc2l6ZSAqLwotCXUzMiBzcGVjaWZpZXJbT0ZfTUFYX0lSUV9TUEVDXTsJLyogU3BlY2lmaWVyIGNvcHkgKi8KLX07Ci0KLS8qKgotICogb2ZfaXJxX21hcF9pbml0IC0gSW5pdGlhbGl6ZSB0aGUgaXJxIHJlbWFwcGVyCi0gKiBAZmxhZ3M6CWZsYWdzIGRlZmluaW5nIHdvcmthcm91bmRzIHRvIGVuYWJsZQotICoKLSAqIFNvbWUgbWFjaGluZXMgaGF2ZSBidWdzIGluIHRoZSBkZXZpY2UtdHJlZSB3aGljaCByZXF1aXJlIGNlcnRhaW4gd29ya2Fyb3VuZHMKLSAqIHRvIGJlIGFwcGxpZWQuIENhbGwgdGhpcyBiZWZvcmUgYW55IGludGVycnVwdCBtYXBwaW5nIGF0dGVtcHRzIHRvIGVuYWJsZQotICogdGhvc2Ugd29ya2Fyb3VuZHMuCi0gKi8KLSNkZWZpbmUgT0ZfSU1BUF9PTERXT1JMRF9NQUMJMHgwMDAwMDAwMQotI2RlZmluZSBPRl9JTUFQX05PX1BIQU5ETEUJMHgwMDAwMDAwMgotCi1leHRlcm4gdm9pZCBvZl9pcnFfbWFwX2luaXQodW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBvZl9pcnFfbWFwX3JhdyAtIExvdyBsZXZlbCBpbnRlcnJ1cHQgdHJlZSBwYXJzaW5nCi0gKiBAcGFyZW50Ogl0aGUgZGV2aWNlIGludGVycnVwdCBwYXJlbnQKLSAqIEBpbnRzcGVjOglpbnRlcnJ1cHQgc3BlY2lmaWVyICgiaW50ZXJydXB0cyIgcHJvcGVydHkgb2YgdGhlIGRldmljZSkKLSAqIEBvaW50c2l6ZTogICBzaXplIG9mIHRoZSBwYXNzZWQgaW4gaW50ZXJydXB0IHNwZWNpZmllcgotICogQGFkZHI6CWFkZHJlc3Mgc3BlY2lmaWVyIChzdGFydCBvZiAicmVnIiBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlKQotICogQG91dF9pcnE6CXN0cnVjdHVyZSBvZl9pcnEgZmlsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbG93LWxldmVsIGludGVycnVwdCB0cmVlIHdhbGtpbmcgZnVuY3Rpb24uIEl0Ci0gKiBjYW4gYmUgdXNlZCB0byBkbyBhIHBhcnRpYWwgd2FsayB3aXRoIHN5bnRoZXRpemVkIHJlZyBhbmQgaW50ZXJydXB0cwotICogcHJvcGVydGllcywgZm9yIGV4YW1wbGUgd2hlbiByZXNvbHZpbmcgUENJIGludGVycnVwdHMgd2hlbiBubyBkZXZpY2UKLSAqIG5vZGUgZXhpc3QgZm9yIHRoZSBwYXJlbnQuCi0gKgotICovCi0KLWV4dGVybiBpbnQgb2ZfaXJxX21hcF9yYXcoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIGNvbnN0IHUzMiAqaW50c3BlYywKLQkJCSAgdTMyIG9pbnRzaXplLCBjb25zdCB1MzIgKmFkZHIsCi0JCQkgIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpOwotCi0KLS8qKgotICogb2ZfaXJxX21hcF9vbmUgLSBSZXNvbHZlIGFuIGludGVycnVwdCBmb3IgYSBkZXZpY2UKLSAqIEBkZXZpY2U6CXRoZSBkZXZpY2Ugd2hvc2UgaW50ZXJydXB0IGlzIHRvIGJlIHJlc29sdmVkCi0gKiBAaW5kZXg6ICAgICAJaW5kZXggb2YgdGhlIGludGVycnVwdCB0byByZXNvbHZlCi0gKiBAb3V0X2lycToJc3RydWN0dXJlIG9mX2lycSBmaWxsZWQgYnkgdGhpcyBmdW5jdGlvbgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMgYW4gaW50ZXJydXB0LCB3YWxraW5nIHRoZSB0cmVlLCBmb3IgYSBnaXZlbgotICogZGV2aWNlLXRyZWUgbm9kZS4gSXQncyB0aGUgaGlnaCBsZXZlbCBwZW5kYW50IHRvIG9mX2lycV9tYXBfcmF3KCkuCi0gKiBJdCBhbHNvIGltcGxlbWVudHMgdGhlIHdvcmthcm91bmRzIGZvciBPbGRXb2xyZCBNYWNzLgotICovCi1leHRlcm4gaW50IG9mX2lycV9tYXBfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBpbnQgaW5kZXgsCi0JCQkgIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpOworI2lmZGVmIENPTkZJR19OVU1BCitleHRlcm4gaW50IG9mX25vZGVfdG9fbmlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBvZl9ub2RlX3RvX25pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSkgeyByZXR1cm4gMDsgfQorI2VuZGlmCisjZGVmaW5lIG9mX25vZGVfdG9fbmlkIG9mX25vZGVfdG9fbmlkCiAKIC8qKgogICogb2ZfaXJxX21hcF9wY2kgLSBSZXNvbHZlIHRoZSBpbnRlcnJ1cHQgZm9yIGEgUENJIGRldmljZQpAQCAtMTgwLDE5ICs4NSwxOSBAQAogICogcmVzb2x2aW5nIHVzaW5nIHRoZSBPRiB0cmVlIHdhbGtpbmcuCiAgKi8KIHN0cnVjdCBwY2lfZGV2Oworc3RydWN0IG9mX2lycTsKIGV4dGVybiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpOwogCi1leHRlcm4gaW50IG9mX2lycV90b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAotCQkJc3RydWN0IHJlc291cmNlICpyKTsKK2V4dGVybiB2b2lkIG9mX2luc3RhbnRpYXRlX3J0Yyh2b2lkKTsKIAotLyoqCi0gKiBvZl9pb21hcCAtIE1hcHMgdGhlIG1lbW9yeSBtYXBwZWQgSU8gZm9yIGEgZ2l2ZW4gZGV2aWNlX25vZGUKLSAqIEBkZXZpY2U6CXRoZSBkZXZpY2Ugd2hvc2UgaW8gcmFuZ2Ugd2lsbCBiZSBtYXBwZWQKLSAqIEBpbmRleDoJaW5kZXggb2YgdGhlIGlvIHJhbmdlCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1hcHBlZCBtZW1vcnkKLSAqLwotZXh0ZXJuIHZvaWQgX19pb21lbSAqb2ZfaW9tYXAoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCk7CisvKiBUaGVzZSBpbmNsdWRlcyBhcmUgcHV0IGF0IHRoZSBib3R0b20gYmVjYXVzZSB0aGV5IG1heSBjb250YWluIHRoaW5ncworICogdGhhdCBhcmUgb3ZlcnJpZGRlbiBieSB0aGlzIGZpbGUuICBJZGVhbGx5IHRoZXkgc2hvdWxkbid0IGJlIGluY2x1ZGVkCisgKiBieSB0aGlzIGZpbGUsIGJ1dCB0aGVyZSBhcmUgYSBidW5jaCBvZiAuYyBmaWxlcyB0aGF0IGN1cnJlbnRseSBkZXBlbmQKKyAqIG9uIGl0LiAgRXZlbnR1YWxseSB0aGV5IHdpbGwgYmUgY2xlYW5lZCB1cC4gKi8KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX1BPV0VSUENfUFJPTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKaW5kZXggZDYyZmRmNC4uZDhiZTAxNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaApAQCAtODkwLDcgKzg5MCw3IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2RlZmluZSBtZm1zcigpCQkoe3Vuc2lnbmVkIGxvbmcgcnZhbDsgXAogCQkJYXNtIHZvbGF0aWxlKCJtZm1zciAlMCIgOiAiPXIiIChydmFsKSk7IHJ2YWw7fSkKLSNpZmRlZiBDT05GSUdfUFBDNjQKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAogI2RlZmluZSBfX210bXNyZCh2LCBsKQlhc20gdm9sYXRpbGUoIm10bXNyZCAlMCwiIF9fc3RyaW5naWZ5KGwpIFwKIAkJCQkgICAgIDogOiAiciIgKHYpIDogIm1lbW9yeSIpCiAjZGVmaW5lIG10bXNyZCh2KQlfX210bXNyZCgodiksIDApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmgKaW5kZXggMjM2MDMxNy4uNjY3YTQ5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaApAQCAtMjksOCArMjksOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM0VfNjQpCiAjZGVmaW5lIE1TUl8JCU1TUl9NRSB8IE1TUl9DRQogI2RlZmluZSBNU1JfS0VSTkVMICAgICAgTVNSXyB8IE1TUl9DTQotI2RlZmluZSBNU1JfVVNFUjMyCU1TUl8gfCBNU1JfUFIgfCBNU1JfRUUKLSNkZWZpbmUgTVNSX1VTRVI2NAlNU1JfVVNFUjMyIHwgTVNSX0NNCisjZGVmaW5lIE1TUl9VU0VSMzIJTVNSXyB8IE1TUl9QUiB8IE1TUl9FRSB8IE1TUl9ERQorI2RlZmluZSBNU1JfVVNFUjY0CU1TUl9VU0VSMzIgfCBNU1JfQ00gfCBNU1JfREUKICNlbGlmIGRlZmluZWQgKENPTkZJR180MHgpCiAjZGVmaW5lIE1TUl9LRVJORUwJKE1TUl9NRXxNU1JfUkl8TVNSX0lSfE1TUl9EUnxNU1JfQ0UpCiAjZGVmaW5lIE1TUl9VU0VSCShNU1JfS0VSTkVMfE1TUl9QUnxNU1JfRUUpCkBAIC02Miw2ICs2Miw3IEBACiAjZGVmaW5lIFNQUk5fVExCMFBTCTB4MTU4CS8qIFRMQiAwIFBhZ2UgU2l6ZSBSZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX01BUzVfTUFTNgkweDE1YwkvKiBNTVUgQXNzaXN0IFJlZ2lzdGVyIDUgfHwgNiAqLwogI2RlZmluZSBTUFJOX01BUzhfTUFTMQkweDE1ZAkvKiBNTVUgQXNzaXN0IFJlZ2lzdGVyIDggfHwgMSAqLworI2RlZmluZSBTUFJOX0VQVENGRwkweDE1ZQkvKiBFbWJlZGRlZCBQYWdlIFRhYmxlIENvbmZpZyAqLwogI2RlZmluZSBTUFJOX01BUzdfTUFTMwkweDE3NAkvKiBNTVUgQXNzaXN0IFJlZ2lzdGVyIDcgfHwgMyAqLwogI2RlZmluZSBTUFJOX01BUzBfTUFTMQkweDE3NQkvKiBNTVUgQXNzaXN0IFJlZ2lzdGVyIDAgfHwgMSAqLwogI2RlZmluZSBTUFJOX0lWT1IwCTB4MTkwCS8qIEludGVycnVwdCBWZWN0b3IgT2Zmc2V0IFJlZ2lzdGVyIDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCmluZGV4IDIwZGU3M2MuLjNkMzVmOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaApAQCAtNjMsNiArNjMsMTQgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldjsJLyogdmlydHVhbCBhZGRyZXNzIHBvaW50ZXIgKi8KIH07CiAKK3N0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSB7CisJYXRvbWljX3Qgd29ya2luZzsgLyogbnVtYmVyIG9mIGNwdXMgYWNjZXNzaW5nIHRoaXMgc3RydWN0ICovCisJYXRvbWljX3QgZG9uZTsKKwlpbnQgdG9rZW47IC8qIGlibSxzdXNwZW5kLW1lICovCisJYXRvbWljX3QgZXJyb3I7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRlOyAvKiB3YWl0IG9uIHRoaXMgdW50aWwgd29ya2luZyA9PSAwICovCit9OworCiAvKiBSVEFTIGV2ZW50IGNsYXNzZXMgKi8KICNkZWZpbmUgUlRBU19JTlRFUk5BTF9FUlJPUgkJMHg4MDAwMDAwMCAvKiBzZXQgYml0IDAgKi8KICNkZWZpbmUgUlRBU19FUE9XX1dBUk5JTkcJCTB4NDAwMDAwMDAgLyogc2V0IGJpdCAxICovCkBAIC0xMzcsNiArMTQ1LDkgQEAKICNkZWZpbmUgUlRBU19UWVBFX1BNR01fQ09ORklHX0NIQU5HRQkweDcwCiAjZGVmaW5lIFJUQVNfVFlQRV9QTUdNX1NFUlZJQ0VfUFJPQwkweDcxCiAKKy8qIFJUQVMgY2hlY2stZXhjZXB0aW9uIHZlY3RvciBvZmZzZXQgKi8KKyNkZWZpbmUgUlRBU19WRUNUT1JfRVhURVJOQUxfSU5URVJSVVBUCTB4NTAwCisKIHN0cnVjdCBydGFzX2Vycm9yX2xvZyB7CiAJdW5zaWduZWQgbG9uZyB2ZXJzaW9uOjg7CQkvKiBBcmNoaXRlY3R1cmFsIHZlcnNpb24gKi8KIAl1bnNpZ25lZCBsb25nIHNldmVyaXR5OjM7CQkvKiBTZXZlcml0eSBsZXZlbCBvZiBlcnJvciAqLwpAQCAtMTc0LDYgKzE4NSw4IEBACiBleHRlcm4gaW50IHJ0YXNfc2V0X2luZGljYXRvcl9mYXN0KGludCBpbmRpY2F0b3IsIGludCBpbmRleCwgaW50IG5ld192YWx1ZSk7CiBleHRlcm4gdm9pZCBydGFzX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCk7CiBleHRlcm4gdm9pZCBydGFzX2luaXRpYWxpemUodm9pZCk7CitleHRlcm4gaW50IHJ0YXNfc3VzcGVuZF9jcHUoc3RydWN0IHJ0YXNfc3VzcGVuZF9tZV9kYXRhICpkYXRhKTsKK2V4dGVybiBpbnQgcnRhc19zdXNwZW5kX2xhc3RfY3B1KHN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSAqZGF0YSk7CiAKIHN0cnVjdCBydGNfdGltZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJ0YXNfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXUuaAppbmRleCA3YWUyNzUzLi5lM2JkYWRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc211LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtdS5oCkBAIC00NTcsOCArNDU3LDggQEAKICAqLwogZXh0ZXJuIGludCBzbXVfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgc211X3ByZXNlbnQodm9pZCk7Ci1zdHJ1Y3Qgb2ZfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKnNtdV9nZXRfb2ZkZXYodm9pZCk7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtdV9nZXRfb2ZkZXYodm9pZCk7CiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBhNjI5N2M2Li42YzI5NGFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC01MTUsMTEgKzUxNSw4IEBACiAgKiBwb3dlcnMgb2YgMiB3cml0ZXMgdW50aWwgaXQgcmVhY2hlcyBzdWZmaWNpZW50IGFsaWdubWVudCkuCiAgKgogICogQmFzZWQgb24gdGhpcyB3ZSBkaXNhYmxlIHRoZSBJUCBoZWFkZXIgYWxpZ25tZW50IGluIG5ldHdvcmsgZHJpdmVycy4KLSAqIFdlIGFsc28gbW9kaWZ5IE5FVF9TS0JfUEFEIHRvIGJlIGEgY2FjaGVsaW5lIGluIHNpemUsIHRodXMgbWFpbnRhaW5pbmcKLSAqIGNhY2hlbGluZSBhbGlnbm1lbnQgb2YgYnVmZmVycy4KICAqLwogI2RlZmluZSBORVRfSVBfQUxJR04JMAotI2RlZmluZSBORVRfU0tCX1BBRAlMMV9DQUNIRV9CWVRFUwogCiAjZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCQkJCQkJXAogICAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggMzJhZGY3Mi4uYWZlNGFhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTQxLDggKzQxLDYgQEAKIAkJCSAgICAgICBjcHVfYWxsX21hc2sgOgkJCQlcCiAJCQkgICAgICAgbm9kZV90b19jcHVtYXNrX21hcFtub2RlXSkKIAotaW50IG9mX25vZGVfdG9fbmlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKLQogc3RydWN0IHBjaV9idXM7CiAjaWZkZWYgQ09ORklHX1BDSQogZXh0ZXJuIGludCBwY2lidXNfdG9fbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKQEAgLTg3LDYgKzg1LDkgQEAKIAkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJCQlcCiB9CiAKK2V4dGVybiBpbnQgX19ub2RlX2Rpc3RhbmNlKGludCwgaW50KTsKKyNkZWZpbmUgbm9kZV9kaXN0YW5jZShhLCBiKSBfX25vZGVfZGlzdGFuY2UoYSwgYikKKwogZXh0ZXJuIHZvaWQgX19pbml0IGR1bXBfbnVtYV9jcHVfdG9wb2xvZ3kodm9pZCk7CiAKIGV4dGVybiBpbnQgc3lzZnNfYWRkX2RldmljZV90b19ub2RlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGludCBuaWQpOwpAQCAtOTQsMTEgKzk1LDYgQEAKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSBpbnQgb2Zfbm9kZV90b19uaWQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX251bWFfY3B1X3RvcG9sb2d5KHZvaWQpIHt9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBpbnQgbmlkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNThkMDU3Mi4uMWRkYTcwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0zNCwxMyArMzQsMTQgQEAKIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gc3lzX3BwYzMyLm8gXAogCQkJCSAgIHNpZ25hbF82NC5vIHB0cmFjZTMyLm8gXAogCQkJCSAgIHBhY2EubyBudnJhbV82NC5vIGZpcm13YXJlLm8KK29iai0kKENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQpCSs9IGh3X2JyZWFrcG9pbnQubwogb2JqLSQoQ09ORklHX1BQQ19CT09LM1NfNjQpCSs9IGNwdV9zZXR1cF9wcGM5NzAubyBjcHVfc2V0dXBfcGE2dC5vCiBvYmo2NC0kKENPTkZJR19SRUxPQ0FUQUJMRSkJKz0gcmVsb2NfNjQubwotb2JqLSQoQ09ORklHX1BQQ19CT09LM0VfNjQpCSs9IGV4Y2VwdGlvbnMtNjRlLm8KK29iai0kKENPTkZJR19QUENfQk9PSzNFXzY0KQkrPSBleGNlcHRpb25zLTY0ZS5vIGlkbGVfYm9vazNlLm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHZkc282NC8KIG9iai0kKENPTkZJR19BTFRJVkVDKQkJKz0gdmVjZW11Lm8KIG9iai0kKENPTkZJR19QUENfOTcwX05BUCkJKz0gaWRsZV9wb3dlcjQubwotb2JqLSQoQ09ORklHX1BQQ19PRikJCSs9IG9mX2RldmljZS5vIG9mX3BsYXRmb3JtLm8gcHJvbV9wYXJzZS5vCitvYmotJChDT05GSUdfUFBDX09GKQkJKz0gb2ZfcGxhdGZvcm0ubyBwcm9tX3BhcnNlLm8KIG9iai0kKENPTkZJR19QUENfQ0xPQ0spCQkrPSBjbG9jay5vCiBwcm9jZnMteQkJCTo9IHByb2NfcG93ZXJwYy5vCiBvYmotJChDT05GSUdfUFJPQ19GUykJCSs9ICQocHJvY2ZzLXkpCkBAIC02Nyw2ICs2OCw3IEBACiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vIG1vZHVsZV8kKENPTkZJR19XT1JEX1NJWkUpLm8KIG9iai0kKENPTkZJR180NHgpCQkrPSBjcHVfc2V0dXBfNDR4Lm8KIG9iai0kKENPTkZJR19GU0xfQk9PS0UpCQkrPSBjcHVfc2V0dXBfZnNsX2Jvb2tlLm8gZGJlbGwubworb2JqLSQoQ09ORklHX1BQQ19CT09LM0VfNjQpCSs9IGRiZWxsLm8KIAogZXh0cmEteQkJCQk6PSBoZWFkXyQoQ09ORklHX1dPUkRfU0laRSkubwogZXh0cmEtJChDT05GSUdfUFBDX0JPT0szRV8zMikJOj0gaGVhZF9uZXdfYm9va2UubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGFjYmJhYzYuLjFjMDYwN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTE5NCw3ICsxOTQsNiBAQAogCURFRklORShQQUNBX1NUQVJUU1BVUlIsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc3RhcnRzcHVycikpOwogCURFRklORShQQUNBX1VTRVJfVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB1c2VyX3RpbWUpKTsKIAlERUZJTkUoUEFDQV9TWVNURU1fVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzeXN0ZW1fdGltZSkpOwotCURFRklORShQQUNBX0RBVEFfT0ZGU0VULCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGRhdGFfb2Zmc2V0KSk7CiAJREVGSU5FKFBBQ0FfVFJBUF9TQVZFLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHRyYXBfc2F2ZSkpOwogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIKIAlERUZJTkUoUEFDQV9LVk1fU1ZDUFUsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc2hhZG93X3ZjcHUpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCA4N2FhMGYzLi42NWUyYjRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC0xMzY0LDEwICsxMzY0LDEwIEBACiAJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfNHh4LAogCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKLQl7CS8qIDQwNUVYICovCi0JCS5wdnJfbWFzawkJPSAweGZmZmYwMDA0LAotCQkucHZyX3ZhbHVlCQk9IDB4MTI5MTAwMDQsCi0JCS5jcHVfbmFtZQkJPSAiNDA1RVgiLAorCXsJLyogNDA1RVggUmV2LiBBL0Igd2l0aCBTZWN1cml0eSAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwZiwKKwkJLnB2cl92YWx1ZQkJPSAweDEyOTEwMDA3LAorCQkuY3B1X25hbWUJCT0gIjQwNUVYIFJldi4gQS9CIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180MFgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLApAQCAtMTM3NywxMCArMTM3NywxMTQgQEAKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja180eHgsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAotCXsJLyogNDA1RVhyICovCi0JCS5wdnJfbWFzawkJPSAweGZmZmYwMDA0LAorCXsJLyogNDA1RVggUmV2LiBDIHdpdGhvdXQgU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwZCwKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWCBSZXYuIEMiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQwWCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCisJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFXzQweCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja180eHgsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKKwl9LAorCXsJLyogNDA1RVggUmV2LiBDIHdpdGggU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwZiwKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWCBSZXYuIEMiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQwWCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCisJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFXzQweCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja180eHgsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKKwl9LAorCXsJLyogNDA1RVggUmV2LiBEIHdpdGhvdXQgU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwMywKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWCBSZXYuIEQiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQwWCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCisJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFXzQweCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja180eHgsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKKwl9LAorCXsJLyogNDA1RVggUmV2LiBEIHdpdGggU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwNSwKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWCBSZXYuIEQiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQwWCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCisJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFXzQweCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja180eHgsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKKwl9LAorCXsJLyogNDA1RVhyIFJldi4gQS9CIHdpdGhvdXQgU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwMSwKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWHIgUmV2LiBBL0IiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQwWCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCisJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFXzQweCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja180eHgsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKKwl9LAorCXsJLyogNDA1RVhyIFJldi4gQyB3aXRob3V0IFNlY3VyaXR5ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDBmLAorCQkucHZyX3ZhbHVlCQk9IDB4MTI5MTAwMDksCisJCS5jcHVfbmFtZQkJPSAiNDA1RVhyIFJldi4gQyIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDBYLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8CisJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKKwkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSX1RZUEVfNDB4LAorCQkuaWNhY2hlX2JzaXplCQk9IDMyLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrXzR4eCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAorCX0sCisJewkvKiA0MDVFWHIgUmV2LiBDIHdpdGggU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwYiwKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWHIgUmV2LiBDIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180MFgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAorCQkubW11X2ZlYXR1cmVzCQk9IE1NVV9GVFJfVFlQRV80MHgsCisJCS5pY2FjaGVfYnNpemUJCT0gMzIsCisJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfNHh4LAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCisJfSwKKwl7CS8qIDQwNUVYciBSZXYuIEQgd2l0aG91dCBTZWN1cml0eSAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwZiwKIAkJLnB2cl92YWx1ZQkJPSAweDEyOTEwMDAwLAotCQkuY3B1X25hbWUJCT0gIjQwNUVYciIsCisJCS5jcHVfbmFtZQkJPSAiNDA1RVhyIFJldi4gRCIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDBYLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8CisJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKKwkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSX1RZUEVfNDB4LAorCQkuaWNhY2hlX2JzaXplCQk9IDMyLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrXzR4eCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAorCX0sCisJewkvKiA0MDVFWHIgUmV2LiBEIHdpdGggU2VjdXJpdHkgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMGYsCisJCS5wdnJfdmFsdWUJCT0gMHgxMjkxMDAwMiwKKwkJLmNwdV9uYW1lCQk9ICI0MDVFWHIgUmV2LiBEIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180MFgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYwppbmRleCA0MGY1MjQ2Li44ZTA1YzE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMTI4LDkgKzEyOCw5IEBACiAJaWYgKCFjc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQljc2l6ZSA9IG1pbihjc2l6ZSwgUEFHRV9TSVpFKTsKKwljc2l6ZSA9IG1pbl90KHNpemVfdCwgY3NpemUsIFBBR0VfU0laRSk7CiAKLQlpZiAocGZuIDwgbWF4X3BmbikgeworCWlmICgobWluX2xvd19wZm4gPCBwZm4pICYmIChwZm4gPCBtYXhfcGZuKSkgewogCQl2YWRkciA9IF9fdmEocGZuIDw8IFBBR0VfU0hJRlQpOwogCQljc2l6ZSA9IGNvcHlfb2xkbWVtX3ZhZGRyKHZhZGRyLCBidWYsIGNzaXplLCBvZmZzZXQsIHVzZXJidWYpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RiZWxsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RiZWxsLmMKaW5kZXggMTQ5MzczNC4uMzMwN2E1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kYmVsbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZGJlbGwuYwpAQCAtMTMsMzIgKzEzLDg4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCiAjaW5jbHVkZSA8YXNtL2RiZWxsLmg+CisjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCi11bnNpZ25lZCBsb25nIGRiZWxsX3NtcF9tZXNzYWdlW05SX0NQVVNdOworc3RydWN0IGRvb3JiZWxsX2NwdV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCW1lc3NhZ2VzOwkvKiBjdXJyZW50IG1lc3NhZ2VzIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQJdGFnOwkJLyogdGFnIHZhbHVlICovCit9OwogCi12b2lkIHNtcF9kYmVsbF9tZXNzYWdlX3Bhc3MoaW50IHRhcmdldCwgaW50IG1zZykKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZG9vcmJlbGxfY3B1X2luZm8sIGRvb3JiZWxsX2NwdV9pbmZvKTsKKwordm9pZCBkb29yYmVsbF9zZXR1cF90aGlzX2NwdSh2b2lkKQogeworCXN0cnVjdCBkb29yYmVsbF9jcHVfaW5mbyAqaW5mbyA9ICZfX2dldF9jcHVfdmFyKGRvb3JiZWxsX2NwdV9pbmZvKTsKKworCWluZm8tPm1lc3NhZ2VzID0gMDsKKwlpbmZvLT50YWcgPSBtZnNwcihTUFJOX1BJUikgJiAweDNmZmY7Cit9CisKK3ZvaWQgZG9vcmJlbGxfbWVzc2FnZV9wYXNzKGludCB0YXJnZXQsIGludCBtc2cpCit7CisJc3RydWN0IGRvb3JiZWxsX2NwdV9pbmZvICppbmZvOwogCWludCBpOwogCi0JaWYodGFyZ2V0IDwgTlJfQ1BVUykgewotCQlzZXRfYml0KG1zZywgJmRiZWxsX3NtcF9tZXNzYWdlW3RhcmdldF0pOwotCQlwcGNfbXNnc25kKFBQQ19EQkVMTCwgMCwgdGFyZ2V0KTsKKwlpZiAodGFyZ2V0IDwgTlJfQ1BVUykgeworCQlpbmZvID0gJnBlcl9jcHUoZG9vcmJlbGxfY3B1X2luZm8sIHRhcmdldCk7CisJCXNldF9iaXQobXNnLCAmaW5mby0+bWVzc2FnZXMpOworCQlwcGNfbXNnc25kKFBQQ19EQkVMTCwgMCwgaW5mby0+dGFnKTsKIAl9Ci0JZWxzZSBpZih0YXJnZXQgPT0gTVNHX0FMTF9CVVRfU0VMRikgeworCWVsc2UgaWYgKHRhcmdldCA9PSBNU0dfQUxMX0JVVF9TRUxGKSB7CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQkJaWYgKGkgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJCWNvbnRpbnVlOwotCQkJc2V0X2JpdChtc2csICZkYmVsbF9zbXBfbWVzc2FnZVtpXSk7Ci0JCQlwcGNfbXNnc25kKFBQQ19EQkVMTCwgMCwgaSk7CisJCQlpbmZvID0gJnBlcl9jcHUoZG9vcmJlbGxfY3B1X2luZm8sIGkpOworCQkJc2V0X2JpdChtc2csICZpbmZvLT5tZXNzYWdlcyk7CisJCQlwcGNfbXNnc25kKFBQQ19EQkVMTCwgMCwgaW5mby0+dGFnKTsKIAkJfQogCX0KIAllbHNlIHsgLyogdGFyZ2V0ID09IE1TR19BTEwgKi8KLQkJZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQkJc2V0X2JpdChtc2csICZkYmVsbF9zbXBfbWVzc2FnZVtpXSk7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQkJaW5mbyA9ICZwZXJfY3B1KGRvb3JiZWxsX2NwdV9pbmZvLCBpKTsKKwkJCXNldF9iaXQobXNnLCAmaW5mby0+bWVzc2FnZXMpOworCQl9CiAJCXBwY19tc2dzbmQoUFBDX0RCRUxMLCBQUENfREJFTExfTVNHX0JSRENBU1QsIDApOwogCX0KIH0KLSNlbmRpZgorCit2b2lkIGRvb3JiZWxsX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CisJc3RydWN0IGRvb3JiZWxsX2NwdV9pbmZvICppbmZvID0gJl9fZ2V0X2NwdV92YXIoZG9vcmJlbGxfY3B1X2luZm8pOworCWludCBtc2c7CisKKwkvKiBXYXJuaW5nOiByZWdzIGNhbiBiZSBOVUxMIHdoZW4gY2FsbGVkIGZyb20gaXJxIGVuYWJsZSAqLworCisJaWYgKCFpbmZvLT5tZXNzYWdlcyB8fCAobnVtX29ubGluZV9jcHVzKCkgPCAyKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKG1zZyA9IDA7IG1zZyA8IDQ7IG1zZysrKQorCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KG1zZywgJmluZm8tPm1lc3NhZ2VzKSkKKwkJCXNtcF9tZXNzYWdlX3JlY3YobXNnKTsKKworb3V0OgorCXNldF9pcnFfcmVncyhvbGRfcmVncyk7Cit9CisKK3ZvaWQgZG9vcmJlbGxfY2hlY2tfc2VsZih2b2lkKQoreworCXN0cnVjdCBkb29yYmVsbF9jcHVfaW5mbyAqaW5mbyA9ICZfX2dldF9jcHVfdmFyKGRvb3JiZWxsX2NwdV9pbmZvKTsKKworCWlmICghaW5mby0+bWVzc2FnZXMpCisJCXJldHVybjsKKworCXBwY19tc2dzbmQoUFBDX0RCRUxMLCAwLCBpbmZvLT50YWcpOworfQorCisjZWxzZSAvKiBDT05GSUdfU01QICovCit2b2lkIGRvb3JiZWxsX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJSZWNlaXZlZCBkb29yYmVsbCBvbiBub24tc21wIHN5c3RlbVxuIik7Cit9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1zd2lvdGxiLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1zd2lvdGxiLmMKaW5kZXggMDJmNzI0Zi4uNDI5NWUwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtc3dpb3RsYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLXN3aW90bGIuYwpAQCAtODIsMTcgKzgyLDkgQEAKIAkucHJpb3JpdHkgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcGNfc3dpb3RsYl9vZl9idXNfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwcGNfc3dpb3RsYl9idXNfbm90aWZ5LAotCS5wcmlvcml0eSA9IDAsCi19OwotCiBpbnQgX19pbml0IHN3aW90bGJfc2V0dXBfYnVzX25vdGlmaWVyKHZvaWQpCiB7CiAJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwKIAkJCSAgICAgICZwcGNfc3dpb3RsYl9wbGF0X2J1c19ub3RpZmllcik7Ci0JYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwKLQkJCSAgICAgICZwcGNfc3dpb3RsYl9vZl9idXNfbm90aWZpZXIpOwotCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMKaW5kZXggMjRkY2MwZS4uNWM0MzA2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUwpAQCAtMTkxLDYgKzE5MSwxMiBAQAogCXN0aAlyMSxQQUNBX1RSQVBfU0FWRShyMTMpOwkvKiBzdG9yZSB0cmFwICovCQkgICAgXAogCWIJYmFkX3N0YWNrX2Jvb2szZTsJLyogYmFkIHN0YWNrIGVycm9yICovCiAKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGlzIHN0dWIsIG1ha2Ugc3VyZSB5b3UgY2hjZWsKKwkqICAgdGhlIGRlYnVnIGV4Y2VwdGlvbiBoYW5kbGVyIHdoaWNoIGhhbmRsZXMgc2luZ2xlIHN0ZXBwaW5nCisJKiAgIGludG8gZXhjZXB0aW9ucyBmcm9tIHVzZXJzcGFjZSwgYW5kIHRoZSBNTSBjb2RlIGluCisJKiAgIGFyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMgd2hpY2ggcGF0Y2hlcyB0aGUgYnJhbmNoIGhlcmUKKwkqICAgYW5kIHdvdWxkIG5lZWQgdG8gYmUgdXBkYXRlZCBpZiB0aGF0IGJyYW5jaCBpcyBtb3ZlZAorCSovCiAjZGVmaW5lCUVYQ0VQVElPTl9TVFVCKGxvYywgbGFiZWwpCQkJCQlcCiAJLiA9IGludGVycnVwdF9iYXNlX2Jvb2szZSArIGxvYzsJCQkJXAogCW5vcDsJLyogVG8gbWFrZSBkZWJ1ZyBpbnRlcnJ1cHRzIGhhcHB5ICovCQkJXApAQCAtMjA0LDExICsyMTAsMzAgQEAKIAlsaXMJcixUU1JfRklTQGg7CQkJCQkJXAogCW10c3ByCVNQUk5fVFNSLHIKIAorLyogVXNlZCBieSBhc3luY2hyb25vdXMgaW50ZXJydXB0IHRoYXQgbWF5IGhhcHBlbiBpbiB0aGUgaWRsZSBsb29wLgorICoKKyAqIFRoaXMgY2hlY2sgaWYgdGhlIHRocmVhZCB3YXMgaW4gdGhlIGlkbGUgbG9vcCwgYW5kIGlmIHllcywgcmV0dXJucworICogdG8gdGhlIGNhbGxlciByYXRoZXIgdGhhbiB0aGUgUEMuIFRoaXMgaXMgdG8gYXZvaWQgYSByYWNlIGlmCisgKiBpbnRlcnJ1cHRzIGhhcHBlbiBiZWZvcmUgdGhlIHdhaXQgaW5zdHJ1Y3Rpb24uCisgKi8KKyNkZWZpbmUgQ0hFQ0tfTkFQUElORygpCQkJCQkJCVwKKwljbHJyZGkJcjExLHIxLFRIUkVBRF9TSElGVDsJCQkJCVwKKwlsZAlyMTAsVElfTE9DQUxfRkxBR1MocjExKTsJCQkJXAorCWFuZGkuCXI5LHIxMCxfVExGX05BUFBJTkc7CQkJCQlcCisJYmVxKwkxZjsJCQkJCQkJXAorCWxkCXI4LF9MSU5LKHIxKTsJCQkJCQlcCisJcmx3aW5tCXI3LHIxMCwwLH5fVExGX05BUFBJTkc7CQkJCQlcCisJc3RkCXI4LF9OSVAocjEpOwkJCQkJCVwKKwlzdGQJcjcsVElfTE9DQUxfRkxBR1MocjExKTsJCQkJCVwKKzE6CisKKwogI2RlZmluZSBNQVNLQUJMRV9FWENFUFRJT04odHJhcG51bSwgbGFiZWwsIGhkbHIsIGFjaykJCQlcCiAJU1RBUlRfRVhDRVBUSU9OKGxhYmVsKTsJCQkJCQlcCiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0codHJhcG51bSwgUFJPTE9HX0FERElUSU9OX01BU0tBQkxFKQlcCiAJRVhDRVBUSU9OX0NPTU1PTih0cmFwbnVtLCBQQUNBX0VYR0VOLCBJTlRTX0RJU0FCTEVfQUxMKQkJXAogCWFjayhyOCk7CQkJCQkJCVwKKwlDSEVDS19OQVBQSU5HKCk7CQkJCQkJXAogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQ7CQkJCVwKIAlibAloZGxyOwkJCQkJCQlcCiAJYgkucmV0X2Zyb21fZXhjZXB0X2xpdGU7CkBAIC0yNDYsMTEgKzI3MSw5IEBACiAJRVhDRVBUSU9OX1NUVUIoMHgxYTAsIHdhdGNoZG9nKQkJCS8qIDB4MDlmMCAqLwogCUVYQ0VQVElPTl9TVFVCKDB4MWMwLCBkYXRhX3RsYl9taXNzKQogCUVYQ0VQVElPTl9TVFVCKDB4MWUwLCBpbnN0cnVjdGlvbl90bGJfbWlzcykKKwlFWENFUFRJT05fU1RVQigweDI4MCwgZG9vcmJlbGwpCisJRVhDRVBUSU9OX1NUVUIoMHgyYTAsIGRvb3JiZWxsX2NyaXQpCiAKLSNpZiAwCi0JRVhDRVBUSU9OX1NUVUIoMHgyODAsIHByb2Nlc3Nvcl9kb29yYmVsbCkKLQlFWENFUFRJT05fU1RVQigweDIyMCwgcHJvY2Vzc29yX2Rvb3JiZWxsX2NyaXQpCi0jZW5kaWYKIAkuZ2xvYmwgaW50ZXJydXB0X2VuZF9ib29rM2UKIGludGVycnVwdF9lbmRfYm9vazNlOgogCkBAIC0yNTksNiArMjgyLDcgQEAKIAlDUklUX0VYQ0VQVElPTl9QUk9MT0coMHgxMDAsIFBST0xPR19BRERJVElPTl9OT05FKQogLy8JRVhDRVBUSU9OX0NPTU1PTigweDEwMCwgUEFDQV9FWENSSVQsIElOVFNfRElTQUJMRV9BTEwpCiAvLwlibAlzcGVjaWFsX3JlZ19zYXZlX2NyaXQKKy8vCUNIRUNLX05BUFBJTkcoKTsKIC8vCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIC8vCWJsCS5jcml0aWNhbF9leGNlcHRpb24KIC8vCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKQEAgLTI3MCw2ICsyOTQsNyBAQAogLy8JRVhDRVBUSU9OX0NPTU1PTigweDIwMCwgUEFDQV9FWE1DLCBJTlRTX0RJU0FCTEVfQUxMKQogLy8JYmwJc3BlY2lhbF9yZWdfc2F2ZV9tYwogLy8JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorLy8JQ0hFQ0tfTkFQUElORygpOwogLy8JYmwJLm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uCiAvLwliCXJldF9mcm9tX21jX2V4Y2VwdAogCWIJLgpAQCAtMzQwLDYgKzM2NSw3IEBACiAJQ1JJVF9FWENFUFRJT05fUFJPTE9HKDB4OWYwLCBQUk9MT0dfQURESVRJT05fTk9ORSkKIC8vCUVYQ0VQVElPTl9DT01NT04oMHg5ZjAsIFBBQ0FfRVhDUklULCBJTlRTX0RJU0FCTEVfQUxMKQogLy8JYmwJc3BlY2lhbF9yZWdfc2F2ZV9jcml0CisvLwlDSEVDS19OQVBQSU5HKCk7CiAvLwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAvLwlibAkudW5rbm93bl9leGNlcHRpb24KIC8vCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKQEAgLTQyOCw2ICs0NTQsMjAgQEAKIGtlcm5lbF9kYmdfZXhjOgogCWIJLgkvKiBOWUkgKi8KIAorLyogRG9vcmJlbGwgaW50ZXJydXB0ICovCisJTUFTS0FCTEVfRVhDRVBUSU9OKDB4MjA3MCwgZG9vcmJlbGwsIC5kb29yYmVsbF9leGNlcHRpb24sIEFDS19OT05FKQorCisvKiBEb29yYmVsbCBjcml0aWNhbCBJbnRlcnJ1cHQgKi8KKwlTVEFSVF9FWENFUFRJT04oZG9vcmJlbGxfY3JpdCk7CisJQ1JJVF9FWENFUFRJT05fUFJPTE9HKDB4MjA4MCwgUFJPTE9HX0FERElUSU9OX05PTkUpCisvLwlFWENFUFRJT05fQ09NTU9OKDB4MjA4MCwgUEFDQV9FWENSSVQsIElOVFNfRElTQUJMRV9BTEwpCisvLwlibAlzcGVjaWFsX3JlZ19zYXZlX2NyaXQKKy8vCUNIRUNLX05BUFBJTkcoKTsKKy8vCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKy8vCWJsCS5kb29yYmVsbF9jcml0aWNhbF9leGNlcHRpb24KKy8vCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKKwliCS4KKwogCiAvKgogICogQW4gaW50ZXJydXB0IGNhbWUgaW4gd2hpbGUgc29mdC1kaXNhYmxlZDsgY2xlYXIgRUUgaW4gU1JSMSwKQEAgLTU2Myw2ICs2MDMsOCBAQAogQkFEX1NUQUNLX1RSQU1QT0xJTkUoMHhlMDApCiBCQURfU1RBQ0tfVFJBTVBPTElORSgweGYwMCkKIEJBRF9TVEFDS19UUkFNUE9MSU5FKDB4ZjIwKQorQkFEX1NUQUNLX1RSQU1QT0xJTkUoMHgyMDcwKQorQkFEX1NUQUNLX1RSQU1QT0xJTkUoMHgyMDgwKQogCiAJLmdsb2JsCWJhZF9zdGFja19ib29rM2UKIGJhZF9zdGFja19ib29rM2U6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKaW5kZXggM2U0MjNmYi4uZjUzMDI5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwpAQCAtODI4LDYgKzgyOCw3IEBACiAKIC8qIFdlIGhhdmUgYSBkYXRhIGJyZWFrcG9pbnQgZXhjZXB0aW9uIC0gaGFuZGxlIGl0ICovCiBoYW5kbGVfZGFicl9mYXVsdDoKKwlibAkuc2F2ZV9udmdwcnMKIAlsZCAgICAgIHI0LF9EQVIocjEpCiAJbGQgICAgICByNSxfRFNJU1IocjEpCiAJYWRkaSAgICByMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9od19icmVha3BvaW50LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2h3X2JyZWFrcG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWNkMDQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9od19icmVha3BvaW50LmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBIV19icmVha3BvaW50OiBhIHVuaWZpZWQga2VybmVsL3VzZXItc3BhY2UgaGFyZHdhcmUgYnJlYWtwb2ludCBmYWNpbGl0eSwKKyAqIHVzaW5nIHRoZSBDUFUncyBkZWJ1ZyByZWdpc3RlcnMuIERlcml2ZWQgZnJvbQorICogImFyY2gveDg2L2tlcm5lbC9od19icmVha3BvaW50LmMiCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBJQk0gQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSy5QcmFzYWQgPHByYXNhZEBsaW51eC52bmV0LmlibS5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vaHdfYnJlYWtwb2ludC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc3N0ZXAuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogU3RvcmVzIHRoZSBicmVha3BvaW50cyBjdXJyZW50bHkgaW4gdXNlIG9uIGVhY2ggYnJlYWtwb2ludCBhZGRyZXNzCisgKiByZWdpc3RlciBmb3IgZXZlcnkgY3B1CisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9ldmVudCAqLCBicF9wZXJfcmVnKTsKKworLyoKKyAqIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGRhdGEgb3IgaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludHMgYXZhaWxhYmxlLgorICovCitpbnQgaHdfYnJlYWtwb2ludF9zbG90cyhpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBUWVBFX0RBVEEpCisJCXJldHVybiBIQlBfTlVNOworCXJldHVybiAwOwkJLyogbm8gaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludHMgYXZhaWxhYmxlICovCit9CisKKy8qCisgKiBJbnN0YWxsIGEgcGVyZiBjb3VudGVyIGJyZWFrcG9pbnQuCisgKgorICogV2Ugc2VlayBhIGZyZWUgZGVidWcgYWRkcmVzcyByZWdpc3RlciBhbmQgdXNlIGl0IGZvciB0aGlzCisgKiBicmVha3BvaW50LgorICoKKyAqIEF0b21pYzogd2UgaG9sZCB0aGUgY291bnRlci0+Y3R4LT5sb2NrIGFuZCB3ZSBvbmx5IGhhbmRsZSB2YXJpYWJsZXMKKyAqIGFuZCByZWdpc3RlcnMgbG9jYWwgdG8gdGhpcyBjcHUuCisgKi8KK2ludCBhcmNoX2luc3RhbGxfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCit7CisJc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludCAqaW5mbyA9IGNvdW50ZXJfYXJjaF9icChicCk7CisJc3RydWN0IHBlcmZfZXZlbnQgKipzbG90ID0gJl9fZ2V0X2NwdV92YXIoYnBfcGVyX3JlZyk7CisKKwkqc2xvdCA9IGJwOworCisJLyoKKwkgKiBEbyBub3QgaW5zdGFsbCBEQUJSIHZhbHVlcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBzaW5nbGUtc3RlcHBlZC4KKwkgKiBJZiBzbywgREFCUiB3aWxsIGJlIHBvcHVsYXRlZCBpbiBzaW5nbGVfc3RlcF9kYWJyX2luc3RydWN0aW9uKCkuCisJICovCisJaWYgKGN1cnJlbnQtPnRocmVhZC5sYXN0X2hpdF91YnAgIT0gYnApCisJCXNldF9kYWJyKGluZm8tPmFkZHJlc3MgfCBpbmZvLT50eXBlIHwgREFCUl9UUkFOU0xBVElPTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVuaW5zdGFsbCB0aGUgYnJlYWtwb2ludCBjb250YWluZWQgaW4gdGhlIGdpdmVuIGNvdW50ZXIuCisgKgorICogRmlyc3Qgd2Ugc2VhcmNoIHRoZSBkZWJ1ZyBhZGRyZXNzIHJlZ2lzdGVyIGl0IHVzZXMgYW5kIHRoZW4gd2UgZGlzYWJsZQorICogaXQuCisgKgorICogQXRvbWljOiB3ZSBob2xkIHRoZSBjb3VudGVyLT5jdHgtPmxvY2sgYW5kIHdlIG9ubHkgaGFuZGxlIHZhcmlhYmxlcworICogYW5kIHJlZ2lzdGVycyBsb2NhbCB0byB0aGlzIGNwdS4KKyAqLwordm9pZCBhcmNoX3VuaW5zdGFsbF9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqKnNsb3QgPSAmX19nZXRfY3B1X3ZhcihicF9wZXJfcmVnKTsKKworCWlmICgqc2xvdCAhPSBicCkgeworCQlXQVJOX09OQ0UoMSwgIkNhbid0IGZpbmQgdGhlIGJyZWFrcG9pbnQiKTsKKwkJcmV0dXJuOworCX0KKworCSpzbG90ID0gTlVMTDsKKwlzZXRfZGFicigwKTsKK30KKworLyoKKyAqIFBlcmZvcm0gY2xlYW51cCBvZiBhcmNoLXNwZWNpZmljIGNvdW50ZXJzIGR1cmluZyB1bnJlZ2lzdHJhdGlvbgorICogb2YgdGhlIHBlcmYtZXZlbnQKKyAqLwordm9pZCBhcmNoX3VucmVnaXN0ZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCit7CisJLyoKKwkgKiBJZiB0aGUgYnJlYWtwb2ludCBpcyB1bnJlZ2lzdGVyZWQgYmV0d2VlbiBhIGh3X2JyZWFrcG9pbnRfaGFuZGxlcigpCisJICogYW5kIHRoZSBzaW5nbGVfc3RlcF9kYWJyX2luc3RydWN0aW9uKCksIHRoZW4gY2xlYW51cCB0aGUgYnJlYWtwb2ludAorCSAqIHJlc3RvcmF0aW9uIHZhcmlhYmxlcyB0byBwcmV2ZW50IGRhbmdsaW5nIHBvaW50ZXJzLgorCSAqLworCWlmIChicC0+Y3R4LT50YXNrKQorCQlicC0+Y3R4LT50YXNrLT50aHJlYWQubGFzdF9oaXRfdWJwID0gTlVMTDsKK30KKworLyoKKyAqIENoZWNrIGZvciB2aXJ0dWFsIGFkZHJlc3MgaW4ga2VybmVsIHNwYWNlLgorICovCitpbnQgYXJjaF9jaGVja19icF9pbl9rZXJuZWxzcGFjZShzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCit7CisJc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludCAqaW5mbyA9IGNvdW50ZXJfYXJjaF9icChicCk7CisKKwlyZXR1cm4gaXNfa2VybmVsX2FkZHIoaW5mby0+YWRkcmVzcyk7Cit9CisKK2ludCBhcmNoX2JwX2dlbmVyaWNfZmllbGRzKGludCB0eXBlLCBpbnQgKmdlbl9icF90eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgREFCUl9EQVRBX1JFQUQ6CisJCSpnZW5fYnBfdHlwZSA9IEhXX0JSRUFLUE9JTlRfUjsKKwkJYnJlYWs7CisJY2FzZSBEQUJSX0RBVEFfV1JJVEU6CisJCSpnZW5fYnBfdHlwZSA9IEhXX0JSRUFLUE9JTlRfVzsKKwkJYnJlYWs7CisJY2FzZSAoREFCUl9EQVRBX1dSSVRFIHwgREFCUl9EQVRBX1JFQUQpOgorCQkqZ2VuX2JwX3R5cGUgPSAoSFdfQlJFQUtQT0lOVF9XIHwgSFdfQlJFQUtQT0lOVF9SKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVmFsaWRhdGUgdGhlIGFyY2gtc3BlY2lmaWMgSFcgQnJlYWtwb2ludCByZWdpc3RlciBzZXR0aW5ncworICovCitpbnQgYXJjaF92YWxpZGF0ZV9od2JrcHRfc2V0dGluZ3Moc3RydWN0IHBlcmZfZXZlbnQgKmJwKQoreworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBhcmNoX2h3X2JyZWFrcG9pbnQgKmluZm8gPSBjb3VudGVyX2FyY2hfYnAoYnApOworCisJaWYgKCFicCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoYnAtPmF0dHIuYnBfdHlwZSkgeworCWNhc2UgSFdfQlJFQUtQT0lOVF9SOgorCQlpbmZvLT50eXBlID0gREFCUl9EQVRBX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgSFdfQlJFQUtQT0lOVF9XOgorCQlpbmZvLT50eXBlID0gREFCUl9EQVRBX1dSSVRFOworCQlicmVhazsKKwljYXNlIEhXX0JSRUFLUE9JTlRfUiB8IEhXX0JSRUFLUE9JTlRfVzoKKwkJaW5mby0+dHlwZSA9IChEQUJSX0RBVEFfUkVBRCB8IERBQlJfREFUQV9XUklURSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiByZXQ7CisJfQorCisJaW5mby0+YWRkcmVzcyA9IGJwLT5hdHRyLmJwX2FkZHI7CisJaW5mby0+bGVuID0gYnAtPmF0dHIuYnBfbGVuOworCisJLyoKKwkgKiBTaW5jZSBicmVha3BvaW50IGxlbmd0aCBjYW4gYmUgYSBtYXhpbXVtIG9mIEhXX0JSRUFLUE9JTlRfTEVOKDgpCisJICogYW5kIGJyZWFrcG9pbnQgYWRkcmVzc2VzIGFyZSBhbGlnbmVkIHRvIG5lYXJlc3QgZG91YmxlLXdvcmQKKwkgKiBIV19CUkVBS1BPSU5UX0FMSUdOIGJ5IHJvdW5kaW5nIG9mZiB0byB0aGUgbG93ZXIgYWRkcmVzcywgdGhlCisJICogJ3N5bWJvbHNpemUnIHNob3VsZCBzYXRpc2Z5IHRoZSBjaGVjayBiZWxvdy4KKwkgKi8KKwlpZiAoaW5mby0+bGVuID4KKwkgICAgKEhXX0JSRUFLUE9JTlRfTEVOIC0gKGluZm8tPmFkZHJlc3MgJiBIV19CUkVBS1BPSU5UX0FMSUdOKSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKgorICogUmVzdG9yZXMgdGhlIGJyZWFrcG9pbnQgb24gdGhlIGRlYnVnIHJlZ2lzdGVycy4KKyAqIEludm9rZSB0aGlzIGZ1bmN0aW9uIGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGlzCisgKiBhYm91dCB0byBjaGFuZ2UgdG8gY2F1c2UgbG9zcyBvZiBNU1JfU0Ugc2V0dGluZ3MuCisgKi8KK3ZvaWQgdGhyZWFkX2NoYW5nZV9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludCAqaW5mbzsKKworCWlmIChsaWtlbHkoIXRzay0+dGhyZWFkLmxhc3RfaGl0X3VicCkpCisJCXJldHVybjsKKworCWluZm8gPSBjb3VudGVyX2FyY2hfYnAodHNrLT50aHJlYWQubGFzdF9oaXRfdWJwKTsKKwlyZWdzLT5tc3IgJj0gfk1TUl9TRTsKKwlzZXRfZGFicihpbmZvLT5hZGRyZXNzIHwgaW5mby0+dHlwZSB8IERBQlJfVFJBTlNMQVRJT04pOworCXRzay0+dGhyZWFkLmxhc3RfaGl0X3VicCA9IE5VTEw7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVidWcgZXhjZXB0aW9uIG5vdGlmaWNhdGlvbnMuCisgKi8KK2ludCBfX2twcm9iZXMgaHdfYnJlYWtwb2ludF9oYW5kbGVyKHN0cnVjdCBkaWVfYXJncyAqYXJncykKK3sKKwlpbnQgcmMgPSBOT1RJRllfU1RPUDsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqYnA7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBhcmdzLT5yZWdzOworCWludCBzdGVwcGVkID0gMTsKKwlzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50ICppbmZvOworCXVuc2lnbmVkIGludCBpbnN0cjsKKwl1bnNpZ25lZCBsb25nIGRhciA9IHJlZ3MtPmRhcjsKKworCS8qIERpc2FibGUgYnJlYWtwb2ludHMgZHVyaW5nIGV4Y2VwdGlvbiBoYW5kbGluZyAqLworCXNldF9kYWJyKDApOworCisJLyoKKwkgKiBUaGUgY291bnRlciBtYXkgYmUgY29uY3VycmVudGx5IHJlbGVhc2VkIGJ1dCB0aGF0IGNhbiBvbmx5CisJICogb2NjdXIgZnJvbSBhIGNhbGxfcmN1KCkgcGF0aC4gV2UgY2FuIHRoZW4gc2FmZWx5IGZldGNoCisJICogdGhlIGJyZWFrcG9pbnQsIHVzZSBpdHMgY2FsbGJhY2ssIHRvdWNoIGl0cyBjb3VudGVyCisJICogd2hpbGUgd2UgYXJlIGluIGFuIHJjdV9yZWFkX2xvY2soKSBwYXRoLgorCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKworCWJwID0gX19nZXRfY3B1X3ZhcihicF9wZXJfcmVnKTsKKwlpZiAoIWJwKQorCQlnb3RvIG91dDsKKwlpbmZvID0gY291bnRlcl9hcmNoX2JwKGJwKTsKKworCS8qCisJICogUmV0dXJuIGVhcmx5IGFmdGVyIGludm9raW5nIHVzZXItY2FsbGJhY2sgZnVuY3Rpb24gd2l0aG91dCByZXN0b3JpbmcKKwkgKiBEQUJSIGlmIHRoZSBicmVha3BvaW50IGlzIGZyb20gcHRyYWNlIHdoaWNoIGFsd2F5cyBvcGVyYXRlcyBpbgorCSAqIG9uZS1zaG90IG1vZGUuIFRoZSBwdHJhY2UtZWQgcHJvY2VzcyB3aWxsIHJlY2VpdmUgdGhlIFNJR1RSQVAgc2lnbmFsCisJICogZ2VuZXJhdGVkIGluIGRvX2RhYnIoKS4KKwkgKi8KKwlpZiAoYnAtPm92ZXJmbG93X2hhbmRsZXIgPT0gcHRyYWNlX3RyaWdnZXJlZCkgeworCQlwZXJmX2JwX2V2ZW50KGJwLCByZWdzKTsKKwkJcmMgPSBOT1RJRllfRE9ORTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBWZXJpZnkgaWYgZGFyIGxpZXMgd2l0aGluIHRoZSBhZGRyZXNzIHJhbmdlIG9jY3VwaWVkIGJ5IHRoZSBzeW1ib2wKKwkgKiBiZWluZyB3YXRjaGVkIHRvIGZpbHRlciBleHRyYW5lb3VzIGV4Y2VwdGlvbnMuICBJZiBpdCBkb2Vzbid0LAorCSAqIHdlIHN0aWxsIG5lZWQgdG8gc2luZ2xlLXN0ZXAgdGhlIGluc3RydWN0aW9uLCBidXQgd2UgZG9uJ3QKKwkgKiBnZW5lcmF0ZSBhbiBldmVudC4KKwkgKi8KKwlpbmZvLT5leHRyYW5lb3VzX2ludGVycnVwdCA9ICEoKGJwLT5hdHRyLmJwX2FkZHIgPD0gZGFyKSAmJgorCQkJKGRhciAtIGJwLT5hdHRyLmJwX2FkZHIgPCBicC0+YXR0ci5icF9sZW4pKTsKKworCS8qIERvIG5vdCBlbXVsYXRlIHVzZXItc3BhY2UgaW5zdHJ1Y3Rpb25zLCBpbnN0ZWFkIHNpbmdsZS1zdGVwIHRoZW0gKi8KKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWJwLT5jdHgtPnRhc2stPnRocmVhZC5sYXN0X2hpdF91YnAgPSBicDsKKwkJcmVncy0+bXNyIHw9IE1TUl9TRTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RlcHBlZCA9IDA7CisJaW5zdHIgPSAwOworCWlmICghX19nZXRfdXNlcl9pbmF0b21pYyhpbnN0ciwgKHVuc2lnbmVkIGludCAqKSByZWdzLT5uaXApKQorCQlzdGVwcGVkID0gZW11bGF0ZV9zdGVwKHJlZ3MsIGluc3RyKTsKKworCS8qCisJICogZW11bGF0ZV9zdGVwKCkgY291bGQgbm90IGV4ZWN1dGUgaXQuIFdlJ3ZlIGZhaWxlZCBpbiByZWxpYWJseQorCSAqIGhhbmRsaW5nIHRoZSBody1icmVha3BvaW50LiBVbnJlZ2lzdGVyIGl0IGFuZCB0aHJvdyBhIHdhcm5pbmcKKwkgKiBtZXNzYWdlIHRvIGxldCB0aGUgdXNlciBrbm93IGFib3V0IGl0LgorCSAqLworCWlmICghc3RlcHBlZCkgeworCQlXQVJOKDEsICJVbmFibGUgdG8gaGFuZGxlIGhhcmR3YXJlIGJyZWFrcG9pbnQuIEJyZWFrcG9pbnQgYXQgIgorCQkJIjB4JWx4IHdpbGwgYmUgZGlzYWJsZWQuIiwgaW5mby0+YWRkcmVzcyk7CisJCXBlcmZfZXZlbnRfZGlzYWJsZShicCk7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIEFzIGEgcG9saWN5LCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCBpbiBhICd0cmlnZ2VyLWFmdGVyLWV4ZWN1dGUnCisJICogZmFzaGlvbgorCSAqLworCWlmICghaW5mby0+ZXh0cmFuZW91c19pbnRlcnJ1cHQpCisJCXBlcmZfYnBfZXZlbnQoYnAsIHJlZ3MpOworCisJc2V0X2RhYnIoaW5mby0+YWRkcmVzcyB8IGluZm8tPnR5cGUgfCBEQUJSX1RSQU5TTEFUSU9OKTsKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBIYW5kbGUgc2luZ2xlLXN0ZXAgZXhjZXB0aW9ucyBmb2xsb3dpbmcgYSBEQUJSIGhpdC4KKyAqLworaW50IF9fa3Byb2JlcyBzaW5nbGVfc3RlcF9kYWJyX2luc3RydWN0aW9uKHN0cnVjdCBkaWVfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGFyZ3MtPnJlZ3M7CisJc3RydWN0IHBlcmZfZXZlbnQgKmJwID0gTlVMTDsKKwlzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50ICpicF9pbmZvOworCisJYnAgPSBjdXJyZW50LT50aHJlYWQubGFzdF9oaXRfdWJwOworCS8qCisJICogQ2hlY2sgaWYgd2UgYXJlIHNpbmdsZS1zdGVwcGluZyBhcyBhIHJlc3VsdCBvZiBhCisJICogcHJldmlvdXMgSFcgQnJlYWtwb2ludCBleGNlcHRpb24KKwkgKi8KKwlpZiAoIWJwKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlicF9pbmZvID0gY291bnRlcl9hcmNoX2JwKGJwKTsKKworCS8qCisJICogV2Ugc2hhbGwgaW52b2tlIHRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gaW4gdGhlIHNpbmdsZQorCSAqIHN0ZXBwaW5nIGhhbmRsZXIgdG8gY29uZmlybSB0byAndHJpZ2dlci1hZnRlci1leGVjdXRlJyBzZW1hbnRpY3MKKwkgKi8KKwlpZiAoIWJwX2luZm8tPmV4dHJhbmVvdXNfaW50ZXJydXB0KQorCQlwZXJmX2JwX2V2ZW50KGJwLCByZWdzKTsKKworCXNldF9kYWJyKGJwX2luZm8tPmFkZHJlc3MgfCBicF9pbmZvLT50eXBlIHwgREFCUl9UUkFOU0xBVElPTik7CisJY3VycmVudC0+dGhyZWFkLmxhc3RfaGl0X3VicCA9IE5VTEw7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzIHdhcyBiZWluZyBzaW5nbGUtc3RlcHBlZCBieSBwdHJhY2UsIGxldCB0aGUKKwkgKiBvdGhlciBzaW5nbGUtc3RlcCBhY3Rpb25zIG9jY3VyIChlLmcuIGdlbmVyYXRlIFNJR1RSQVApLgorCSAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJcmV0dXJuIE5PVElGWV9TVE9QOworfQorCisvKgorICogSGFuZGxlIGRlYnVnIGV4Y2VwdGlvbiBub3RpZmljYXRpb25zLgorICovCitpbnQgX19rcHJvYmVzIGh3X2JyZWFrcG9pbnRfZXhjZXB0aW9uc19ub3RpZnkoCisJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgRElFX0RBQlJfTUFUQ0g6CisJCXJldCA9IGh3X2JyZWFrcG9pbnRfaGFuZGxlcihkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBESUVfU1NURVA6CisJCXJldCA9IHNpbmdsZV9zdGVwX2RhYnJfaW5zdHJ1Y3Rpb24oZGF0YSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSB1c2VyIGJyZWFrcG9pbnRzIHVzZWQgYnkgcHRyYWNlCisgKi8KK3ZvaWQgZmx1c2hfcHRyYWNlX2h3X2JyZWFrcG9pbnQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQgPSAmdHNrLT50aHJlYWQ7CisKKwl1bnJlZ2lzdGVyX2h3X2JyZWFrcG9pbnQodC0+cHRyYWNlX2Jwc1swXSk7CisJdC0+cHRyYWNlX2Jwc1swXSA9IE5VTEw7Cit9CisKK3ZvaWQgaHdfYnJlYWtwb2ludF9wbXVfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCit7CisJLyogVE9ETyAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwppbmRleCAyMTI2NmFiLi45YjYyNmNmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwpAQCAtMTQwLDE5ICsxNDAsMTkgQEAKIAogc3RhdGljIGludCBpYm1lYnVzX21hdGNoX3BhdGgoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSB0b19vZl9kZXZpY2UoZGV2KS0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpLT5kZXYub2Zfbm9kZTsKIAlyZXR1cm4gKGRuLT5mdWxsX25hbWUgJiYKIAkJKHN0cmNhc2VjbXAoKGNoYXIgKilkYXRhLCBkbi0+ZnVsbF9uYW1lKSA9PSAwKSk7CiB9CiAKIHN0YXRpYyBpbnQgaWJtZWJ1c19tYXRjaF9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldiktPmRldi5vZl9ub2RlID09IGRhdGE7CisJcmV0dXJuIHRvX3BsYXRmb3JtX2RldmljZShkZXYpLT5kZXYub2Zfbm9kZSA9PSBkYXRhOwogfQogCiBzdGF0aWMgaW50IGlibWVidXNfY3JlYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewotCXN0cnVjdCBvZl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXY7CiAJaW50IHJldDsKIAogCWRldiA9IG9mX2RldmljZV9hbGxvYyhkbiwgTlVMTCwgJmlibWVidXNfYnVzX2RldmljZSk7CkBAIC0yOTgsNyArMjk4LDcgQEAKIAogCWlmICgoZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZpYm1lYnVzX2J1c190eXBlLCBOVUxMLCBwYXRoLAogCQkJCSAgIGlibWVidXNfbWF0Y2hfcGF0aCkpKSB7Ci0JCW9mX2RldmljZV91bnJlZ2lzdGVyKHRvX29mX2RldmljZShkZXYpKTsKKwkJb2ZfZGV2aWNlX3VucmVnaXN0ZXIodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwogCiAJCWtmcmVlKHBhdGgpOwogCQlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNlLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMDAyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9ib29rM2UuUwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgSUJNIENvcnAsIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBHZW5lcmljIGlkbGUgcm91dGluZSBmb3IgQm9vazNFIHByb2Nlc3NvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1vcGNvZGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKy8qIDY0LWJpdCB2ZXJzaW9uIG9ubHkgZm9yIG5vdyAqLworI2lmZGVmIENPTkZJR19QUEM2NAorCitfR0xPQkFMKGJvb2szZV9pZGxlKQorCS8qIFNhdmUgTFIgZm9yIGxhdGVyICovCisJbWZscglyMAorCXN0ZAlyMCwxNihyMSkKKworCS8qIEhhcmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJd3J0ZWVpCTAKKworCS8qIE5vdyBjaGVjayBpZiBhbiBpbnRlcnJ1cHQgY2FtZSBpbiB3aGlsZSB3ZSB3ZXJlIHNvZnQgZGlzYWJsZWQKKwkgKiBzaW5jZSB3ZSBtYXkgb3RoZXJ3aXNlIGxvc2UgaXQgKGRvb3JiZWxscyBldGMuLi4pLiBXZSBrbm93CisJICogdGhhdCBzaW5jZSBQQUNBSEFSRElSUUVOIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgaW4gdGhhdCBjYXNlLgorCSAqLworCWxieglyMyxQQUNBSEFSRElSUUVOKHIxMykKKwljbXB3aQljcjAscjMsMAorCWJlcWxyCisKKwkvKiBOb3cgd2UgYXJlIGdvaW5nIHRvIG1hcmsgb3Vyc2VsdmVzIGFzIHNvZnQgYW5kIGhhcmQgZW5hYmxlcyBpbgorCSAqIG9yZGVyIHRvIGJlIGFibGUgdG8gdGFrZSBpbnRlcnJ1cHRzIHdoaWxlIGFzbGVlcC4gV2UgaW5mb3JtIGxvY2tkZXAKKwkgKiBvZiB0aGF0LiBXZSBkb24ndCBhY3R1YWxseSB0dXJuIGludGVycnVwdHMgb24ganVzdCB5ZXQgdGhvLgorCSAqLworI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCXN0ZHUgICAgcjEsLTEyOChyMSkKKwlibAkudHJhY2VfaGFyZGlycXNfb24KKyNlbmRpZgorCWxpCXIwLDEKKwlzdGIJcjAsUEFDQVNPRlRJUlFFTihyMTMpCisJc3RiCXIwLFBBQ0FIQVJESVJRRU4ocjEzKQorCQorCS8qIEludGVycnVwdHMgd2lsbCBtYWtlIHVzZSByZXR1cm4gdG8gTFIsIHNvIGdldCBzb21ldGhpbmcgd2Ugd2FudAorCSAqIGluIHRoZXJlCisJICovCisJYmwJMWYKKworCS8qIEhhcmQgZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCisJd3J0ZWVpCTAKKworCS8qIE1hcmsgdGhlbSBvZmYgYWdhaW4gaW4gdGhlIFBBQ0EgYXMgd2VsbCAqLworCWxpCXIwLDAKKwlzdGIJcjAsUEFDQVNPRlRJUlFFTihyMTMpCisJc3RiCXIwLFBBQ0FIQVJESVJRRU4ocjEzKQorCisJLyogVGVsbCBsb2NrZGVwIGFib3V0IGl0ICovCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJYmwJLnRyYWNlX2hhcmRpcnFzX29mZgorCWFkZGkgICAgcjEscjEsMTI4CisjZW5kaWYKKwlsZAlyMCwxNihyMSkKKwltdGxyCXIwCisJYmxyCisKKzE6CS8qIExldCdzIHNldCB0aGUgX1RMRl9OQVBQSU5HIGZsYWcgc28gaW50ZXJydXB0cyBtYWtlIHVzIHJldHVybgorCSAqIHRvIHRoZSByaWdodCBzcG90CisJKi8KKwljbHJyZGkJcjExLHIxLFRIUkVBRF9TSElGVAorCWxkCXIxMCxUSV9MT0NBTF9GTEFHUyhyMTEpCisJb3JpCXIxMCxyMTAsX1RMRl9OQVBQSU5HCisJc3RkCXIxMCxUSV9MT0NBTF9GTEFHUyhyMTEpCisKKwkvKiBXZSBjYW4gbm93IHJlLWVuYWJsZSBoYXJkIGludGVycnVwdHMgYW5kIGdvIHRvIHNsZWVwICovCisJd3J0ZWVpCTEKKzE6CVBQQ19XQUlUKDApCisJYgkxYgorCisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCA3N2JlM2QwLi5kM2NlNjdjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTUzLDYgKzUzLDggQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTY0LDYgKzY2LDggQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9kYmVsbC5oPgorCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KQEAgLTE1MywxNCArMTU3LDI4IEBACiAJaWYgKGdldF9oYXJkX2VuYWJsZWQoKSkKIAkJcmV0dXJuOwogCisjaWYgZGVmaW5lZChDT05GSUdfQk9PS0UpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBkb29yYmVsbCBpbnRlcnJ1cHRzIGFuZCByZXNlbmQgdG8gb3Vyc2VsZiAqLworCWRvb3JiZWxsX2NoZWNrX3NlbGYoKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBOZWVkIHRvIGhhcmQtZW5hYmxlIGludGVycnVwdHMgaGVyZS4gIFNpbmNlIGN1cnJlbnRseSBkaXNhYmxlZCwKIAkgKiBubyBuZWVkIHRvIHRha2UgZnVydGhlciBhc20gcHJlY2F1dGlvbnMgYWdhaW5zdCBwcmVlbXB0aW9uOyBidXQKIAkgKiB1c2UgbG9jYWxfcGFjYSBpbnN0ZWFkIG9mIGdldF9wYWNhKCkgdG8gYXZvaWQgcHJlZW1wdGlvbiBjaGVja2luZy4KIAkgKi8KIAlsb2NhbF9wYWNhLT5oYXJkX2VuYWJsZWQgPSBlbjsKKworI2lmbmRlZiBDT05GSUdfQk9PS0UKKwkvKiBPbiBzZXJ2ZXIsIHJlLXRyaWdnZXIgdGhlIGRlY3JlbWVudGVyIGlmIGl0IHdlbnQgbmVnYXRpdmUgc2luY2UKKwkgKiBzb21lIHByb2Nlc3NvcnMgb25seSB0cmlnZ2VyIG9uIGVkZ2UgdHJhbnNpdGlvbnMgb2YgdGhlIHNpZ24gYml0LgorCSAqCisJICogQm9va0UgaGFzIGEgbGV2ZWwgc2Vuc2l0aXZlIGRlY3JlbWVudGVyIChsYXRjaGVzIGluIFRTUikgc28gd2UKKwkgKiBkb24ndCBuZWVkIHRoYXQKKwkgKi8KIAlpZiAoKGludCltZnNwcihTUFJOX0RFQykgPCAwKQogCQltdHNwcihTUFJOX0RFQywgMSk7CisjZW5kaWYgLyogQ09ORklHX0JPT0tFICovCiAKIAkvKgogCSAqIEZvcmNlIHRoZSBkZWxpdmVyeSBvZiBwZW5kaW5nIHNvZnQtZGlzYWJsZWQgaW50ZXJydXB0cyBvbiBQUzMuCkBAIC04MDQsMTggKzgyMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX29mX21hcHBpbmcpOwogCi11bnNpZ25lZCBpbnQgaXJxX29mX3BhcnNlX2FuZF9tYXAoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0KLQlpZiAob2ZfaXJxX21hcF9vbmUoZGV2LCBpbmRleCwgJm9pcnEpKQotCQlyZXR1cm4gTk9fSVJROwotCi0JcmV0dXJuIGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAotCQkJCSAgICAgb2lycS5zaXplKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlycV9vZl9wYXJzZV9hbmRfbWFwKTsKLQogdm9pZCBpcnFfZGlzcG9zZV9tYXBwaW5nKHVuc2lnbmVkIGludCB2aXJxKQogewogCXN0cnVjdCBpcnFfaG9zdCAqaG9zdDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva2dkYi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMKaW5kZXggODJhN2IyMi4uN2Y2MWEzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICgqKHUzMiAqKSAocmVncy0+bmlwKSA9PSAqKHUzMiAqKSAoJmFyY2hfa2dkYl9vcHMuZ2RiX2JwdF9pbnN0cikpCi0JCXJlZ3MtPm5pcCArPSA0OworCQlyZWdzLT5uaXAgKz0gQlJFQUtfSU5TVFJfU0laRTsKIAogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwppbmRleCAwMzVhZGE1Li5jMWZkMGY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCA4OWYwMDUxLi5kZDZjMTQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtNDUsNiArNDUsMTggQEAKIAkJcHBjX21kLm1hY2hpbmVfa2V4ZWNfY2xlYW51cChpbWFnZSk7CiB9CiAKK3ZvaWQgYXJjaF9jcmFzaF9zYXZlX3ZtY29yZWluZm8odm9pZCkKK3sKKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCisJVk1DT1JFSU5GT19TWU1CT0wobm9kZV9kYXRhKTsKKwlWTUNPUkVJTkZPX0xFTkdUSChub2RlX2RhdGEsIE1BWF9OVU1OT0RFUyk7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMKKwlWTUNPUkVJTkZPX1NZTUJPTChjb250aWdfcGFnZV9kYXRhKTsKKyNlbmRpZgorfQorCiAvKgogICogRG8gbm90IGFsbG9jYXRlIG1lbW9yeSAob3IgZmFpbCBpbiBhbnkgd2F5KSBpbiBtYWNoaW5lX2tleGVjKCkuCiAgKiBXZSBhcmUgcGFzdCB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuLCBjb21taXR0ZWQgdG8gcmVib290aW5nIG5vdy4KQEAgLTE0NCwyNCArMTU2LDI0IEBACiB9CiAKIC8qIFZhbHVlcyB3ZSBuZWVkIHRvIGV4cG9ydCB0byB0aGUgc2Vjb25kIGtlcm5lbCB2aWEgdGhlIGRldmljZSB0cmVlLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcga2VybmVsX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNyYXNoa19zaXplOworc3RhdGljIHBoeXNfYWRkcl90IGtlcm5lbF9lbmQ7CitzdGF0aWMgcGh5c19hZGRyX3QgY3Jhc2hrX3NpemU7CiAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkga2VybmVsX2VuZF9wcm9wID0gewogCS5uYW1lID0gImxpbnV4LGtlcm5lbC1lbmQiLAotCS5sZW5ndGggPSBzaXplb2YodW5zaWduZWQgbG9uZyksCisJLmxlbmd0aCA9IHNpemVvZihwaHlzX2FkZHJfdCksCiAJLnZhbHVlID0gJmtlcm5lbF9lbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHByb3BlcnR5IGNyYXNoa19iYXNlX3Byb3AgPSB7CiAJLm5hbWUgPSAibGludXgsY3Jhc2hrZXJuZWwtYmFzZSIsCi0JLmxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkubGVuZ3RoID0gc2l6ZW9mKHBoeXNfYWRkcl90KSwKIAkudmFsdWUgPSAmY3Jhc2hrX3Jlcy5zdGFydCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgY3Jhc2hrX3NpemVfcHJvcCA9IHsKIAkubmFtZSA9ICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwKLQkubGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCS5sZW5ndGggPSBzaXplb2YocGh5c19hZGRyX3QpLAogCS52YWx1ZSA9ICZjcmFzaGtfc2l6ZSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKaW5kZXggZWQzMWEyOS4uNTgzYWY3MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKQEAgLTE1LDYgKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CkBAIC0yNSw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CS8qIF9lbmQgKi8KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaHdfYnJlYWtwb2ludC5oPgogCiBpbnQgZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7CkBAIC0xNjUsNiArMTY4LDcgQEAKIAl3aGlsZShrZXhlY19hbGxfaXJxX2Rpc2FibGVkID09IDApCiAJCWNwdV9yZWxheCgpOwogCW1iKCk7IC8qIG1ha2Ugc3VyZSBhbGwgaXJxcyBhcmUgZGlzYWJsZWQgYmVmb3JlIHRoaXMgKi8KKwlod19icmVha3BvaW50X2Rpc2FibGUoKTsKIAkvKgogCSAqIE5vdyBldmVyeSBDUFUgaGFzIElSUXMgb2ZmLCB3ZSBjYW4gY2xlYXIgb3V0IGFueSBwZW5kaW5nCiAJICogSVBJcyBhbmQgYmUgc3VyZSB0aGF0IG5vIG1vcmUgd2lsbCBjb21lIGluIGFmdGVyIHRoaXMuCkBAIC0xODAsOCArMTg0LDIyIEBACiB7CiAJaW50IG15X2NwdSwgaSwgbm90aWZpZWQ9LTE7CiAKKwlod19icmVha3BvaW50X2Rpc2FibGUoKTsKIAlteV9jcHUgPSBnZXRfY3B1KCk7Ci0JLyogTWFrZSBzdXJlIGVhY2ggQ1BVIGhhcyBhdGxlYXN0IG1hZGUgaXQgdG8gdGhlIHN0YXRlIHdlIG5lZWQgKi8KKwkvKiBNYWtlIHN1cmUgZWFjaCBDUFUgaGFzIGF0IGxlYXN0IG1hZGUgaXQgdG8gdGhlIHN0YXRlIHdlIG5lZWQuCisJICoKKwkgKiBGSVhNRTogVGhlcmUgaXMgYSAoc2xpbSkgY2hhbmNlIG9mIGEgcHJvYmxlbSBpZiBub3QgYWxsIG9mIHRoZSBDUFVzCisJICogYXJlIGNvcnJlY3RseSBvbmxpbmVkLiAgSWYgc29tZWhvdyB3ZSBzdGFydCBhIENQVSBvbiBib290IHdpdGggUlRBUworCSAqIHN0YXJ0LWNwdSwgYnV0IHNvbWVob3cgdGhhdCBDUFUgZG9lc24ndCB3cml0ZSBjYWxsaW5fY3B1X21hcFtdIGluCisJICogdGltZSwgdGhlIGJvb3QgQ1BVIHdpbGwgdGltZW91dC4gIElmIGl0IGRvZXMgZXZlbnR1YWxseSBleGVjdXRlCisJICogc3R1ZmYsIHRoZSBzZWNvbmRhcnkgd2lsbCBzdGFydCB1cCAocGFjYVtdLmNwdV9zdGFydCB3YXMgd3JpdHRlbikgYW5kCisJICogZ2V0IGludG8gYSBwZWN1bGlhciBzdGF0ZS4gIElmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cworCSAqIHNtcF9vcHMtPnRha2VfdGltZWJhc2UoKSwgdGhlIHNlY29uZGFyeSBDUFUgd2lsbCBwcm9iYWJseSBiZSBzcGlubmluZworCSAqIGluIHRoZXJlLiAgSWYgbm90IChpLmUuIHBzZXJpZXMpLCB0aGUgc2Vjb25kYXJ5IHdpbGwgY29udGludWUgb24gYW5kCisJICogdHJ5IHRvIG9ubGluZSBpdHNlbGYvaWRsZS9ldGMuIElmIGl0IHN1cnZpdmVzIHRoYXQsIHdlIG5lZWQgdG8gZmluZAorCSAqIHRoZXNlIHBvc3NpYmxlLWJ1dC1ub3Qtb25saW5lLWJ1dC1zaG91bGQtYmUgQ1BVcyBhbmQgY2hhcGVyb25lIHRoZW0KKwkgKiBpbnRvIGtleGVjX3NtcF93YWl0KCkuCisJICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CiAJCWlmIChpID09IG15X2NwdSkKIAkJCWNvbnRpbnVlOwpAQCAtMTg5LDkgKzIwNyw5IEBACiAJCXdoaWxlIChwYWNhW2ldLmtleGVjX3N0YXRlIDwgd2FpdF9zdGF0ZSkgewogCQkJYmFycmllcigpOwogCQkJaWYgKGkgIT0gbm90aWZpZWQpIHsKLQkJCQlwcmludGsoICJrZXhlYzogd2FpdGluZyBmb3IgY3B1ICVkIChwaHlzaWNhbCIKLQkJCQkJCSIgJWQpIHRvIGVudGVyICVpIHN0YXRlXG4iLAotCQkJCQlpLCBwYWNhW2ldLmh3X2NwdV9pZCwgd2FpdF9zdGF0ZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAia2V4ZWM6IHdhaXRpbmcgZm9yIGNwdSAlZCAiCisJCQkJICAgICAgICIocGh5c2ljYWwgJWQpIHRvIGVudGVyICVpIHN0YXRlXG4iLAorCQkJCSAgICAgICBpLCBwYWNhW2ldLmh3X2NwdV9pZCwgd2FpdF9zdGF0ZSk7CiAJCQkJbm90aWZpZWQgPSBpOwogCQkJfQogCQl9CkBAIC0xOTksOSArMjE3LDMyIEBACiAJbWIoKTsKIH0KIAorLyoKKyAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIGVhY2ggcHJlc2VudCBDUFUgaXMgb25saW5lLiAgVGhlIG5leHQga2VybmVsIHdpbGwgc2NhbgorICogdGhlIGRldmljZSB0cmVlIGFuZCBhc3N1bWUgcHJpbWFyeSB0aHJlYWRzIGFyZSBvbmxpbmUgYW5kIHF1ZXJ5IHNlY29uZGFyeQorICogdGhyZWFkcyB2aWEgUlRBUyB0byBvbmxpbmUgdGhlbSBpZiByZXF1aXJlZC4gIElmIHdlIGRvbid0IG9ubGluZSBwcmltYXJ5CisgKiB0aHJlYWRzLCB0aGV5IHdpbGwgYmUgc3R1Y2suICBIb3dldmVyLCB3ZSBhbHNvIG9ubGluZSBzZWNvbmRhcnkgdGhyZWFkcyBhcyB3ZQorICogbWF5IGJlIHVzaW5nICdjZWRlIG9mZmxpbmUnLiAgSW4gdGhpcyBjYXNlIFJUQVMgZG9lc24ndCBzZWUgdGhlIHNlY29uZGFyeQorICogdGhyZWFkcyBhcyBvZmZsaW5lIC0tIGFuZCBhZ2FpbiwgdGhlc2UgQ1BVcyB3aWxsIGJlIHN0dWNrLgorICoKKyAqIFNvLCB3ZSBvbmxpbmUgYWxsIENQVXMgdGhhdCBzaG91bGQgYmUgcnVubmluZywgaW5jbHVkaW5nIHNlY29uZGFyeSB0aHJlYWRzLgorICovCitzdGF0aWMgdm9pZCB3YWtlX29mZmxpbmVfY3B1cyh2b2lkKQoreworCWludCBjcHUgPSAwOworCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCWlmICghY3B1X29ubGluZShjcHUpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJrZXhlYzogV2FraW5nIG9mZmxpbmUgY3B1ICVkLlxuIiwKKwkJCSAgICAgICBjcHUpOworCQkJY3B1X3VwKGNwdSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyB2b2lkIGtleGVjX3ByZXBhcmVfY3B1cyh2b2lkKQogewotCisJd2FrZV9vZmZsaW5lX2NwdXMoKTsKIAlzbXBfY2FsbF9mdW5jdGlvbihrZXhlY19zbXBfZG93biwgTlVMTCwgLyogd2FpdCAqLzApOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJbWIoKTsgLyogbWFrZSBzdXJlIElSUXMgYXJlIGRpc2FibGVkIGJlZm9yZSB3ZSBzYXkgdGhleSBhcmUgKi8KQEAgLTIxNSw3ICsyNTYsMTAgQEAKIAlpZiAocHBjX21kLmtleGVjX2NwdV9kb3duKQogCQlwcGNfbWQua2V4ZWNfY3B1X2Rvd24oMCwgMCk7CiAKLQkvKiBCZWZvcmUgcmVtb3ZpbmcgTU1VIG1hcGluZ3MgbWFrZSBzdXJlIGFsbCBDUFVzIGhhdmUgZW50ZXJlZCByZWFsIG1vZGUgKi8KKwkvKgorCSAqIEJlZm9yZSByZW1vdmluZyBNTVUgbWFwcGluZ3MgbWFrZSBzdXJlIGFsbCBDUFVzIGhhdmUgZW50ZXJlZCByZWFsCisJICogbW9kZToKKwkgKi8KIAlrZXhlY19wcmVwYXJlX2NwdXNfd2FpdChLRVhFQ19TVEFURV9SRUFMX01PREUpOwogCiAJcHV0X2NwdSgpOwpAQCAtMjU3LDYgKzMwMSwxMiBAQAogc3RhdGljIHVuaW9uIHRocmVhZF91bmlvbiBrZXhlY19zdGFjayBfX2luaXRfdGFza19kYXRhID0KIAl7IH07CiAKKy8qCisgKiBGb3Igc2ltaWxhciByZWFzb25zIHRvIHRoZSBzdGFjayBhYm92ZSwgdGhlIGtleGVjaW5nIENQVSBuZWVkcyB0byBiZSBvbiBhCisgKiBzdGF0aWMgUEFDQTsgd2Ugc3dpdGNoIHRvIGtleGVjX3BhY2EuCisgKi8KK3N0cnVjdCBwYWNhX3N0cnVjdCBrZXhlY19wYWNhOworCiAvKiBPdXIgYXNzZW1ibHkgaGVscGVyLCBpbiBrZXhlY19zdHViLlMgKi8KIGV4dGVybiBOT1JFVF9UWVBFIHZvaWQga2V4ZWNfc2VxdWVuY2Uodm9pZCAqbmV3c3RhY2ssIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkJCXZvaWQgKmltYWdlLCB2b2lkICpjb250cm9sLApAQCAtMjc4LDEyICszMjgsMjggQEAKIAlpZiAoY3Jhc2hpbmdfY3B1ID09IC0xKQogCQlrZXhlY19wcmVwYXJlX2NwdXMoKTsKIAorCXByX2RlYnVnKCJrZXhlYzogU3RhcnRpbmcgc3dpdGNob3ZlciBzZXF1ZW5jZS5cbiIpOworCiAJLyogc3dpdGNoIHRvIGEgc3RhdGljbHkgYWxsb2NhdGVkIHN0YWNrLiAgQmFzZWQgb24gaXJxIHN0YWNrIGNvZGUuCiAJICogWFhYOiB0aGUgdGFzayBzdHJ1Y3Qgd2lsbCBsaWtlbHkgYmUgaW52YWxpZCBvbmNlIHdlIGRvIHRoZSBjb3B5IQogCSAqLwogCWtleGVjX3N0YWNrLnRocmVhZF9pbmZvLnRhc2sgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPnRhc2s7CiAJa2V4ZWNfc3RhY2sudGhyZWFkX2luZm8uZmxhZ3MgPSAwOwogCisJLyogV2UgbmVlZCBhIHN0YXRpYyBQQUNBLCB0b287IGNvcHkgdGhpcyBDUFUncyBQQUNBIG92ZXIgYW5kIHN3aXRjaCB0bworCSAqIGl0LiAgQWxzbyBwb2lzb24gcGVyX2NwdV9vZmZzZXQgdG8gY2F0Y2ggYW55b25lIHVzaW5nIG5vbi1zdGF0aWMKKwkgKiBkYXRhLgorCSAqLworCW1lbWNweSgma2V4ZWNfcGFjYSwgZ2V0X3BhY2EoKSwgc2l6ZW9mKHN0cnVjdCBwYWNhX3N0cnVjdCkpOworCWtleGVjX3BhY2EuZGF0YV9vZmZzZXQgPSAweGVkZWFkZGVhZGVlZWVlZWVVTDsKKwlwYWNhID0gKHN0cnVjdCBwYWNhX3N0cnVjdCAqKVJFTE9DX0hJREUoJmtleGVjX3BhY2EsIDApIC0KKwkJa2V4ZWNfcGFjYS5wYWNhX2luZGV4OworCXNldHVwX3BhY2EoJmtleGVjX3BhY2EpOworCisJLyogWFhYOiBJZiBhbnlvbmUgZG9lcyAnZHluYW1pYyBscHBhY2FzJyB0aGlzIHdpbGwgYWxzbyBuZWVkIHRvIGJlCisJICogc3dpdGNoZWQgdG8gYSBzdGF0aWMgdmVyc2lvbiEKKwkgKi8KKwogCS8qIFNvbWUgdGhpbmdzIGFyZSBiZXN0IGRvbmUgaW4gYXNzZW1ibHkuICBGaW5kaW5nIGdsb2JhbHMgd2l0aAogCSAqIGEgdG9jIGlzIGVhc2llciBpbiBDLCBzbyBwYXNzIGluIHdoYXQgd2UgY2FuLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUwppbmRleCAyMmU1MDdjLi4yZDI5NzUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUwpAQCAtMTI3LDI5ICsxMjcsMyBAQAogX0dMT0JBTChfX3Jlc3RvcmVfY3B1X3Bvd2VyNykKIAkvKiBwbGFjZSBob2xkZXIgKi8KIAlibHIKLQotLyoKLSAqIEdldCBhIG1pbmltYWwgc2V0IG9mIHJlZ2lzdGVycyBmb3Igb3VyIGNhbGxlcidzIG50aCBjYWxsZXIuCi0gKiByMyA9IHJlZ3MgcG9pbnRlciwgcjUgPSBuLgotICoKLSAqIFdlIG9ubHkgZ2V0IFIxIChzdGFjayBwb2ludGVyKSwgTklQIChuZXh0IGluc3RydWN0aW9uIHBvaW50ZXIpCi0gKiBhbmQgTFIgKGxpbmsgcmVnaXN0ZXIpLiAgVGhlc2UgYXJlIGFsbCB3ZSBjYW4gZ2V0IGluIHRoZQotICogZ2VuZXJhbCBjYXNlIHdpdGhvdXQgZG9pbmcgY29tcGxpY2F0ZWQgc3RhY2sgdW53aW5kaW5nLCBidXQKLSAqIGZvcnR1bmF0ZWx5IHRoZXkgYXJlIGVub3VnaCB0byBkbyBhIHN0YWNrIGJhY2t0cmFjZSwgd2hpY2gKLSAqIGlzIGFsbCB3ZSBuZWVkIHRoZW0gZm9yLgotICovCi1fR0xPQkFMKHBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncykKLQltcglyNixyMQotCWNtcHdpCXI1LDAKLQltZmxyCXI0Ci0JYmxlCTJmCi0JbXRjdHIJcjUKLTE6CVBQQ19MTAlyNiwwKHI2KQotCWJkbnoJMWIKLQlQUENfTEwJcjQsUFBDX0xSX1NUS09GRihyNikKLTI6CVBQQ19MTAlyNywwKHI2KQotCVBQQ19MTAlyNyxQUENfTFJfU1RLT0ZGKHI3KQotCVBQQ19TVEwJcjYsR1BSMS1TVEFDS19GUkFNRV9PVkVSSEVBRChyMykKLQlQUENfU1RMCXI0LF9OSVAtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjMpCi0JUFBDX1NUTAlyNyxfTElOSy1TVEFDS19GUkFNRV9PVkVSSEVBRChyMykKLQlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc4ZTAyLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9kY3IuaD4KLQotc3RhdGljIHZvaWQgb2ZfZGV2aWNlX21ha2VfYnVzX2lkKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKLXsKLQlzdGF0aWMgYXRvbWljX3QgYnVzX25vX3JlZ19tYWdpYzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBkZXYtPmRldi5vZl9ub2RlOwotCWNvbnN0IHUzMiAqcmVnOwotCXU2NCBhZGRyOwotCWludCBtYWdpYzsKLQotCS8qCi0JICogSWYgaXQncyBhIERDUiBiYXNlZCBkZXZpY2UsIHVzZSAnZCcgZm9yIG5hdGl2ZSBEQ1JzCi0JICogYW5kICdEJyBmb3IgTU1JTyBEQ1JzLgotCSAqLwotI2lmZGVmIENPTkZJR19QUENfRENSCi0JcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCk7Ci0JaWYgKHJlZykgewotI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQotCQlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAiZCV4LiVzIiwgKnJlZywgbm9kZS0+bmFtZSk7Ci0jZWxzZSAvKiBDT05GSUdfUFBDX0RDUl9OQVRJVkUgKi8KLQkJYWRkciA9IG9mX3RyYW5zbGF0ZV9kY3JfYWRkcmVzcyhub2RlLCAqcmVnLCBOVUxMKTsKLQkJaWYgKGFkZHIgIT0gT0ZfQkFEX0FERFIpIHsKLQkJCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJEJWxseC4lcyIsCi0JCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIsIG5vZGUtPm5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0jZW5kaWYgLyogIUNPTkZJR19QUENfRENSX05BVElWRSAqLwotCX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX0RDUiAqLwotCi0JLyoKLQkgKiBGb3IgTU1JTywgZ2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzCi0JICovCi0JcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKLQlpZiAocmVnKSB7Ci0JCWFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhub2RlLCByZWcpOwotCQlpZiAoYWRkciAhPSBPRl9CQURfQUREUikgewotCQkJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiVsbHguJXMiLAotCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyLCBub2RlLT5uYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogTm8gQnVzSUQsIHVzZSB0aGUgbm9kZSBuYW1lIGFuZCBhZGQgYSBnbG9iYWxseSBpbmNyZW1lbnRlZAotCSAqIGNvdW50ZXIgKGFuZCBwcmF5Li4uKQotCSAqLwotCW1hZ2ljID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmJ1c19ub19yZWdfbWFnaWMpOwotCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlcy4lZCIsIG5vZGUtPm5hbWUsIG1hZ2ljIC0gMSk7Ci19Ci0KLXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldmljZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgY29uc3QgY2hhciAqYnVzX2lkLAotCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQotewotCXN0cnVjdCBvZl9kZXZpY2UgKmRldjsKLQotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkZXYtPmRldi5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobnApOwotCWRldi0+ZGV2LmRtYV9tYXNrID0gJmRldi0+YXJjaGRhdGEuZG1hX21hc2s7Ci0JZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OwotCWRldi0+ZGV2LnJlbGVhc2UgPSBvZl9yZWxlYXNlX2RldjsKLQotCWlmIChidXNfaWQpCi0JCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlcyIsIGJ1c19pZCk7Ci0JZWxzZQotCQlvZl9kZXZpY2VfbWFrZV9idXNfaWQoZGV2KTsKLQotCXJldHVybiBkZXY7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2RldmljZV9hbGxvYyk7Ci0KLWludCBvZl9kZXZpY2VfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQotewotCXN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2OwotCWNvbnN0IGNoYXIgKmNvbXBhdDsKLQlpbnQgc2VlbiA9IDAsIGNwbGVuLCBzbDsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9mZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7Ci0KLQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiT0ZfTkFNRT0lcyIsIG9mZGV2LT5kZXYub2Zfbm9kZS0+bmFtZSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk9GX1RZUEU9JXMiLCBvZmRldi0+ZGV2Lm9mX25vZGUtPnR5cGUpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotICAgICAgICAvKiBTaW5jZSB0aGUgY29tcGF0aWJsZSBmaWVsZCBjYW4gY29udGFpbiBwcmV0dHkgbXVjaCBhbnl0aGluZwotICAgICAgICAgKiBpdCdzIG5vdCByZWFsbHkgbGVnYWwgdG8gc3BsaXQgaXQgb3V0IHdpdGggY29tbWFzLiBXZSBzcGxpdCBpdAotICAgICAgICAgKiB1cCB1c2luZyBhIG51bWJlciBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW5zdGVhZC4gKi8KLQotCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKLQl3aGlsZSAoY29tcGF0ICYmICpjb21wYXQgJiYgY3BsZW4gPiAwKSB7Ci0JCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJPRl9DT01QQVRJQkxFXyVkPSVzIiwgc2VlbiwgY29tcGF0KSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXNsID0gc3RybGVuIChjb21wYXQpICsgMTsKLQkJY29tcGF0ICs9IHNsOwotCQljcGxlbiAtPSBzbDsKLQkJc2VlbisrOwotCX0KLQotCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJPRl9DT01QQVRJQkxFX049JWQiLCBzZWVuKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBtb2RhbGlhcyBpcyB0cmlja2llciwgd2UgYWRkIGl0IGluIDIgc3RlcHMgKi8KLQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9IikpCi0JCXJldHVybiAtRU5PTUVNOwotCXNsID0gb2ZfZGV2aWNlX2dldF9tb2RhbGlhcyhvZmRldiwgJmVudi0+YnVmW2Vudi0+YnVmbGVuLTFdLAotCQkJCSAgICBzaXplb2YoZW52LT5idWYpIC0gZW52LT5idWZsZW4pOwotCWlmIChzbCA+PSAoc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZW52LT5idWZsZW4gKz0gc2w7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX3VldmVudCk7Ci1FWFBPUlRfU1lNQk9MKG9mX2RldmljZV9nZXRfbW9kYWxpYXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCmluZGV4IDQ4N2E5ODguLmIyYzM2M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKQEAgLTI4LDIwNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCi0vKgotICogVGhlIGxpc3Qgb2YgT0YgSURzIGJlbG93IGlzIHVzZWQgZm9yIG1hdGNoaW5nIGJ1cyB0eXBlcyBpbiB0aGUKLSAqIHN5c3RlbSB3aG9zZSBkZXZpY2VzIGFyZSB0byBiZSBleHBvc2VkIGFzIG9mX3BsYXRmb3JtX2RldmljZXMuCi0gKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsaXN0IHZhbGlkIGZvciBtb3N0IHBsYXRmb3Jtcy4gVGhpcyBmaWxlIHByb3ZpZGVzCi0gKiBmdW5jdGlvbnMgd2hvIGNhbiB0YWtlIGFuIGV4cGxpY2l0IGxpc3QgaWYgbmVjZXNzYXJ5IHRob3VnaAotICoKLSAqIFRoZSBzZWFyY2ggaXMgYWx3YXlzIHBlcmZvcm1lZCByZWN1cnNpdmVseSBsb29raW5nIGZvciBjaGlsZHJlbiBvZgotICogdGhlIHByb3ZpZGVkIGRldmljZV9ub2RlIGFuZCByZWN1cnNpdmVseSBpZiBzdWNoIGEgY2hpbGRyZW4gbWF0Y2hlcwotICogYSBidXMgdHlwZSBpbiB0aGUgbGlzdAotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2RlZmF1bHRfYnVzX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAudHlwZSA9ICJzcGlkZXIiLCB9LAotCXsgLnR5cGUgPSAiYXhvbiIsIH0sCi0JeyAudHlwZSA9ICJwbGI1IiwgfSwKLQl7IC50eXBlID0gInBsYjQiLCB9LAotCXsgLnR5cGUgPSAib3BiIiwgfSwKLQl7IC50eXBlID0gImViYyIsIH0sCi0Je30sCi19OwotCi1zdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgPSB7Ci0gICAgICAgLnVldmVudAk9IG9mX2RldmljZV91ZXZlbnQsCi19OwotRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9idXNfdHlwZSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9mX2J1c19kcml2ZXJfaW5pdCh2b2lkKQotewotCXJldHVybiBvZl9idXNfdHlwZV9pbml0KCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwgIm9mX3BsYXRmb3JtIik7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKG9mX2J1c19kcml2ZXJfaW5pdCk7Ci0KLXN0cnVjdCBvZl9kZXZpY2UqIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKLQkJCQkJICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7Ci0KLQlkZXYgPSBvZl9kZXZpY2VfYWxsb2MobnAsIGJ1c19pZCwgcGFyZW50KTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkZXYtPmFyY2hkYXRhLmRtYV9tYXNrID0gMHhmZmZmZmZmZlVMOwotCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotCWRldi0+ZGV2LmJ1cyA9ICZvZl9wbGF0Zm9ybV9idXNfdHlwZTsKLQotCS8qIFdlIGRvIG5vdCBmaWxsIHRoZSBETUEgb3BzIGZvciBwbGF0Zm9ybSBkZXZpY2VzIGJ5IGRlZmF1bHQuCi0JICogVGhpcyBpcyBjdXJyZW50bHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwbGF0Zm9ybSBjb2RlCi0JICogdG8gZG8gc3VjaCwgcG9zc2libHkgdXNpbmcgYSBkZXZpY2Ugbm90aWZpZXIKLQkgKi8KLQotCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoZGV2KSAhPSAwKSB7Ci0JCW9mX2RldmljZV9mcmVlKGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBkZXY7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUpOwotCi0KLQotLyoqCi0gKiBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlIC0gQ3JlYXRlIGFuIE9GIGRldmljZSBmb3IgYSBidXMgbm9kZSBhbmQgYWxsIGl0cwotICogY2hpbGRyZW4uIE9wdGlvbmFsbHkgcmVjdXJzaXZlbHkgaW5zdGFuY2lhdGUgbWF0Y2hpbmcgYnVzc2VzLgotICogQGJ1czogZGV2aWNlIG5vZGUgb2YgdGhlIGJ1cyB0byBpbnN0YW5jaWF0ZQotICogQG1hdGNoZXM6IG1hdGNoIHRhYmxlLCBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCwgT0ZfTk9fREVFUF9QUk9CRSB0bwotICogZGlzYWxsb3cgcmVjdXJzaXZlIGNyZWF0aW9uIG9mIGNoaWxkIGJ1c3NlcwotICovCi1zdGF0aWMgaW50IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpidXMsCi0JCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAotCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7Ci0Jc3RydWN0IG9mX2RldmljZSAqZGV2OwotCWludCByYyA9IDA7Ci0KLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGJ1cywgY2hpbGQpIHsKLQkJcHJfZGVidWcoIiAgIGNyZWF0ZSBjaGlsZDogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOwotCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNoaWxkLCBOVUxMLCBwYXJlbnQpOwotCQlpZiAoZGV2ID09IE5VTEwpCi0JCQlyYyA9IC1FTk9NRU07Ci0JCWVsc2UgaWYgKCFvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGNoaWxkKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocmMgPT0gMCkgewotCQkJcHJfZGVidWcoIiAgIGFuZCBzdWIgYnVzc2VzXG4iKTsKLQkJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShjaGlsZCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKLQkJfSBpZiAocmMpIHsKLQkJCW9mX25vZGVfcHV0KGNoaWxkKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUgLSBQcm9iZSB0aGUgZGV2aWNlLXRyZWUgZm9yIHBsYXRmb3JtIGJ1c3NlcwotICogQHJvb3Q6IHBhcmVudCBvZiB0aGUgZmlyc3QgbGV2ZWwgdG8gcHJvYmUgb3IgTlVMTCBmb3IgdGhlIHJvb3Qgb2YgdGhlIHRyZWUKLSAqIEBtYXRjaGVzOiBtYXRjaCB0YWJsZSwgTlVMTCB0byB1c2UgdGhlIGRlZmF1bHQKLSAqIEBwYXJlbnQ6IHBhcmVudCB0byBob29rIGRldmljZXMgZnJvbSwgTlVMTCBmb3IgdG9wbGV2ZWwKLSAqCi0gKiBOb3RlIHRoYXQgY2hpbGRyZW4gb2YgdGhlIHByb3ZpZGVkIHJvb3QgYXJlIG5vdCBpbnN0YW5jaWF0ZWQgYXMgZGV2aWNlcwotICogdW5sZXNzIHRoZSBzcGVjaWZpZWQgcm9vdCBpdHNlbGYgbWF0Y2hlcyB0aGUgYnVzIGxpc3QgYW5kIGlzIG5vdCBOVUxMLgotICovCi0KLWludCBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoc3RydWN0IGRldmljZV9ub2RlICpyb290LAotCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAotCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7Ci0JaW50IHJjID0gMDsKLQotCWlmIChtYXRjaGVzID09IE5VTEwpCi0JCW1hdGNoZXMgPSBvZl9kZWZhdWx0X2J1c19pZHM7Ci0JaWYgKG1hdGNoZXMgPT0gT0ZfTk9fREVFUF9QUk9CRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHJvb3QgPT0gTlVMTCkKLQkJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JZWxzZQotCQlvZl9ub2RlX2dldChyb290KTsKLQotCXByX2RlYnVnKCJvZl9wbGF0Zm9ybV9idXNfcHJvYmUoKVxuIik7Ci0JcHJfZGVidWcoIiBzdGFydGluZyBhdDogJXNcbiIsIHJvb3QtPmZ1bGxfbmFtZSk7Ci0KLQkvKiBEbyBhIHNlbGYgY2hlY2sgb2YgYnVzIHR5cGUsIGlmIHRoZXJlJ3MgYSBtYXRjaCwgY3JlYXRlCi0JICogY2hpbGRyZW4KLQkgKi8KLQlpZiAob2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCByb290KSkgewotCQlwcl9kZWJ1ZygiIHJvb3QgbWF0Y2gsIGNyZWF0ZSBhbGwgc3ViIGRldmljZXNcbiIpOwotCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHJvb3QsIE5VTEwsIHBhcmVudCk7Ci0JCWlmIChkZXYgPT0gTlVMTCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCXByX2RlYnVnKCIgY3JlYXRlIGFsbCBzdWIgYnVzc2VzXG4iKTsKLQkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKHJvb3QsIG1hdGNoZXMsICZkZXYtPmRldik7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShyb290LCBjaGlsZCkgewotCQlpZiAoIW9mX21hdGNoX25vZGUobWF0Y2hlcywgY2hpbGQpKQotCQkJY29udGludWU7Ci0KLQkJcHJfZGVidWcoIiAgbWF0Y2g6ICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKLQkJZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShjaGlsZCwgTlVMTCwgcGFyZW50KTsKLQkJaWYgKGRldiA9PSBOVUxMKQotCQkJcmMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7Ci0JCWlmIChyYykgewotCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0gYmFpbDoKLQlvZl9ub2RlX3B1dChyb290KTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX3BsYXRmb3JtX2J1c19wcm9iZSk7Ci0KLXN0YXRpYyBpbnQgb2ZfZGV2X25vZGVfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXJldHVybiB0b19vZl9kZXZpY2UoZGV2KS0+ZGV2Lm9mX25vZGUgPT0gZGF0YTsKLX0KLQotc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCWRldiA9IGJ1c19maW5kX2RldmljZSgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsCi0JCQkgICAgICBOVUxMLCBucCwgb2ZfZGV2X25vZGVfbWF0Y2gpOwotCWlmIChkZXYpCi0JCXJldHVybiB0b19vZl9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZmluZF9kZXZpY2VfYnlfbm9kZSk7Ci0KLXN0YXRpYyBpbnQgb2ZfZGV2X3BoYW5kbGVfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXBoYW5kbGUgKnBoID0gZGF0YTsKLQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldiktPmRldi5vZl9ub2RlLT5waGFuZGxlID09ICpwaDsKLX0KLQotc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZShwaGFuZGxlIHBoKQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCWRldiA9IGJ1c19maW5kX2RldmljZSgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsCi0JCQkgICAgICBOVUxMLCAmcGgsIG9mX2Rldl9waGFuZGxlX21hdGNoKTsKLQlpZiAoZGV2KQotCQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X3BoYW5kbGUpOwotCi0KICNpZmRlZiBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSQogCiAvKiBUaGUgcHJvYmluZyBvZiBQQ0kgY29udHJvbGxlcnMgZnJvbSBvZl9wbGF0Zm9ybSBpcyBjdXJyZW50bHkKQEAgLTIzNyw3ICszNiw3IEBACiAgKiBsYWNraW5nIHNvbWUgYml0cyBuZWVkZWQgaGVyZS4KICAqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBvZl9wY2lfcGhiX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9mX3BjaV9waGJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BhY2EuYwppbmRleCAxMzlhNzczLi5kMGEyNmYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BhY2EuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BhY2EuYwpAQCAtMTA1LDYgKzEwNSwxNiBAQAogI2VuZGlmIC8qIENPTkZJR19QUENfU1REX01NVV82NCAqLwogfQogCisvKiBQdXQgdGhlIHBhY2EgcG9pbnRlciBpbnRvIHIxMyBhbmQgU1BSR19QQUNBICovCit2b2lkIHNldHVwX3BhY2Eoc3RydWN0IHBhY2Ffc3RydWN0ICpuZXdfcGFjYSkKK3sKKwlsb2NhbF9wYWNhID0gbmV3X3BhY2E7CisJbXRzcHIoU1BSTl9TUFJHX1BBQ0EsIGxvY2FsX3BhY2EpOworI2lmZGVmIENPTkZJR19QUENfQk9PSzNFCisJbXRzcHIoU1BSTl9TUFJHX1RMQl9FWEZSQU1FLCBsb2NhbF9wYWNhLT5leHRsYik7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBfX2luaXRkYXRhIHBhY2Ffc2l6ZTsKIAogdm9pZCBfX2luaXQgYWxsb2NhdGVfcGFjYXModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKaW5kZXggNWIzOGY2YS4uOTAyMWM0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA1YzE0ZmZlLi5kMzAxYTMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtNDEwLDE1ICs0MTAsMTUgQEAKIAkgKiBUaGVyZWZvcmUgd2UgdHJlYXQgdGhlbSBsaWtlIE5NSXMuCiAJICovCiAJZG8gewotCQlwcmV2ID0gYXRvbWljNjRfcmVhZCgmZXZlbnQtPmh3LnByZXZfY291bnQpOworCQlwcmV2ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7CiAJCWJhcnJpZXIoKTsKIAkJdmFsID0gcmVhZF9wbWMoZXZlbnQtPmh3LmlkeCk7Ci0JfSB3aGlsZSAoYXRvbWljNjRfY21weGNoZygmZXZlbnQtPmh3LnByZXZfY291bnQsIHByZXYsIHZhbCkgIT0gcHJldik7CisJfSB3aGlsZSAobG9jYWw2NF9jbXB4Y2hnKCZldmVudC0+aHcucHJldl9jb3VudCwgcHJldiwgdmFsKSAhPSBwcmV2KTsKIAogCS8qIFRoZSBjb3VudGVycyBhcmUgb25seSAzMiBiaXRzIHdpZGUgKi8KIAlkZWx0YSA9ICh2YWwgLSBwcmV2KSAmIDB4ZmZmZmZmZmZ1bDsKLQlhdG9taWM2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOwotCWF0b21pYzY0X3N1YihkZWx0YSwgJmV2ZW50LT5ody5wZXJpb2RfbGVmdCk7CisJbG9jYWw2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOworCWxvY2FsNjRfc3ViKGRlbHRhLCAmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0KTsKIH0KIAogLyoKQEAgLTQ0NCwxMCArNDQ0LDEwIEBACiAJCWlmICghZXZlbnQtPmh3LmlkeCkKIAkJCWNvbnRpbnVlOwogCQl2YWwgPSAoZXZlbnQtPmh3LmlkeCA9PSA1KSA/IHBtYzUgOiBwbWM2OwotCQlwcmV2ID0gYXRvbWljNjRfcmVhZCgmZXZlbnQtPmh3LnByZXZfY291bnQpOworCQlwcmV2ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7CiAJCWV2ZW50LT5ody5pZHggPSAwOwogCQlkZWx0YSA9ICh2YWwgLSBwcmV2KSAmIDB4ZmZmZmZmZmZ1bDsKLQkJYXRvbWljNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKKwkJbG9jYWw2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOwogCX0KIH0KIApAQCAtNDYyLDcgKzQ2Miw3IEBACiAJCWV2ZW50ID0gY3B1aHctPmxpbWl0ZWRfY291bnRlcltpXTsKIAkJZXZlbnQtPmh3LmlkeCA9IGNwdWh3LT5saW1pdGVkX2h3aWR4W2ldOwogCQl2YWwgPSAoZXZlbnQtPmh3LmlkeCA9PSA1KSA/IHBtYzUgOiBwbWM2OwotCQlhdG9taWM2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCB2YWwpOworCQlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnByZXZfY291bnQsIHZhbCk7CiAJCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIAl9CiB9CkBAIC02NjYsMTEgKzY2NiwxMSBAQAogCQl9CiAJCXZhbCA9IDA7CiAJCWlmIChldmVudC0+aHcuc2FtcGxlX3BlcmlvZCkgewotCQkJbGVmdCA9IGF0b21pYzY0X3JlYWQoJmV2ZW50LT5ody5wZXJpb2RfbGVmdCk7CisJCQlsZWZ0ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucGVyaW9kX2xlZnQpOwogCQkJaWYgKGxlZnQgPCAweDgwMDAwMDAwTCkKIAkJCQl2YWwgPSAweDgwMDAwMDAwTCAtIGxlZnQ7CiAJCX0KLQkJYXRvbWljNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgdmFsKTsKKwkJbG9jYWw2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCB2YWwpOwogCQlldmVudC0+aHcuaWR4ID0gaWR4OwogCQl3cml0ZV9wbWMoaWR4LCB2YWwpOwogCQlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CkBAIC03NTQsNyArNzU0LDcgQEAKIAkgKiBza2lwIHRoZSBzY2hlZHVsYWJpbGl0eSB0ZXN0IGhlcmUsIGl0IHdpbGwgYmUgcGVmb3JtZWQKIAkgKiBhdCBjb21taXQgdGltZSgtPmNvbW1pdF90eG4pIGFzIGEgd2hvbGUKIAkgKi8KLQlpZiAoY3B1aHctPmdyb3VwX2ZsYWcgJiBQRVJGX0VWRU5UX1RYTl9TVEFSVEVEKQorCWlmIChjcHVody0+Z3JvdXBfZmxhZyAmIFBFUkZfRVZFTlRfVFhOKQogCQlnb3RvIG5vY2hlY2s7CiAKIAlpZiAoY2hlY2tfZXhjbHVkZXMoY3B1aHctPmV2ZW50LCBjcHVody0+ZmxhZ3MsIG4wLCAxKSkKQEAgLTg0NSw4ICs4NDUsOCBAQAogCWlmIChsZWZ0IDwgMHg4MDAwMDAwMEwpCiAJCXZhbCA9IDB4ODAwMDAwMDBMIC0gbGVmdDsKIAl3cml0ZV9wbWMoZXZlbnQtPmh3LmlkeCwgdmFsKTsKLQlhdG9taWM2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCB2YWwpOwotCWF0b21pYzY0X3NldCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnByZXZfY291bnQsIHZhbCk7CisJbG9jYWw2NF9zZXQoJmV2ZW50LT5ody5wZXJpb2RfbGVmdCwgbGVmdCk7CiAJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwogCXBlcmZfZW5hYmxlKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtODYxLDcgKzg2MSw3IEBACiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWh3ID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKLQljcHVody0+Z3JvdXBfZmxhZyB8PSBQRVJGX0VWRU5UX1RYTl9TVEFSVEVEOworCWNwdWh3LT5ncm91cF9mbGFnIHw9IFBFUkZfRVZFTlRfVFhOOwogCWNwdWh3LT5uX3R4bl9zdGFydCA9IGNwdWh3LT5uX2V2ZW50czsKIH0KIApAQCAtODc0LDcgKzg3NCw3IEBACiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWh3ID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKLQljcHVody0+Z3JvdXBfZmxhZyAmPSB+UEVSRl9FVkVOVF9UWE5fU1RBUlRFRDsKKwljcHVody0+Z3JvdXBfZmxhZyAmPSB+UEVSRl9FVkVOVF9UWE47CiB9CiAKIC8qCkBAIC05MDAsNiArOTAwLDcgQEAKIAlmb3IgKGkgPSBjcHVody0+bl90eG5fc3RhcnQ7IGkgPCBuOyArK2kpCiAJCWNwdWh3LT5ldmVudFtpXS0+aHcuY29uZmlnID0gY3B1aHctPmV2ZW50c1tpXTsKIAorCWNwdWh3LT5ncm91cF9mbGFnICY9IH5QRVJGX0VWRU5UX1RYTjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExMSw3ICsxMTEyLDcgQEAKIAlldmVudC0+aHcuY29uZmlnID0gZXZlbnRzW25dOwogCWV2ZW50LT5ody5ldmVudF9iYXNlID0gY2ZsYWdzW25dOwogCWV2ZW50LT5ody5sYXN0X3BlcmlvZCA9IGV2ZW50LT5ody5zYW1wbGVfcGVyaW9kOwotCWF0b21pYzY0X3NldCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0LCBldmVudC0+aHcubGFzdF9wZXJpb2QpOworCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucGVyaW9kX2xlZnQsIGV2ZW50LT5ody5sYXN0X3BlcmlvZCk7CiAKIAkvKgogCSAqIFNlZSBpZiB3ZSBuZWVkIHRvIHJlc2VydmUgdGhlIFBNVS4KQEAgLTExNDksMTYgKzExNTAsMTYgQEAKIAlpbnQgcmVjb3JkID0gMDsKIAogCS8qIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaW50ZXJydXB0cyBoZXJlICovCi0JcHJldiA9IGF0b21pYzY0X3JlYWQoJmV2ZW50LT5ody5wcmV2X2NvdW50KTsKKwlwcmV2ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7CiAJZGVsdGEgPSAodmFsIC0gcHJldikgJiAweGZmZmZmZmZmdWw7Ci0JYXRvbWljNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKKwlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7CiAKIAkvKgogCSAqIFNlZSBpZiB0aGUgdG90YWwgcGVyaW9kIGZvciB0aGlzIGV2ZW50IGhhcyBleHBpcmVkLAogCSAqIGFuZCB1cGRhdGUgZm9yIHRoZSBuZXh0IHBlcmlvZC4KIAkgKi8KIAl2YWwgPSAwOwotCWxlZnQgPSBhdG9taWM2NF9yZWFkKCZldmVudC0+aHcucGVyaW9kX2xlZnQpIC0gZGVsdGE7CisJbGVmdCA9IGxvY2FsNjRfcmVhZCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0KSAtIGRlbHRhOwogCWlmIChwZXJpb2QpIHsKIAkJaWYgKGxlZnQgPD0gMCkgewogCQkJbGVmdCArPSBwZXJpb2Q7CkBAIC0xMTk2LDggKzExOTcsOCBAQAogCX0KIAogCXdyaXRlX3BtYyhldmVudC0+aHcuaWR4LCB2YWwpOwotCWF0b21pYzY0X3NldCgmZXZlbnQtPmh3LnByZXZfY291bnQsIHZhbCk7Ci0JYXRvbWljNjRfc2V0KCZldmVudC0+aHcucGVyaW9kX2xlZnQsIGxlZnQpOworCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgdmFsKTsKKwlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0LCBsZWZ0KTsKIAlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9ldmVudF9mc2xfZW1iLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfZXZlbnRfZnNsX2VtYi5jCmluZGV4IDM2OTg3MmYuLjFiYTQ1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9ldmVudF9mc2xfZW1iLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50X2ZzbF9lbWIuYwpAQCAtMTYyLDE1ICsxNjIsMTUgQEAKIAkgKiBUaGVyZWZvcmUgd2UgdHJlYXQgdGhlbSBsaWtlIE5NSXMuCiAJICovCiAJZG8gewotCQlwcmV2ID0gYXRvbWljNjRfcmVhZCgmZXZlbnQtPmh3LnByZXZfY291bnQpOworCQlwcmV2ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7CiAJCWJhcnJpZXIoKTsKIAkJdmFsID0gcmVhZF9wbWMoZXZlbnQtPmh3LmlkeCk7Ci0JfSB3aGlsZSAoYXRvbWljNjRfY21weGNoZygmZXZlbnQtPmh3LnByZXZfY291bnQsIHByZXYsIHZhbCkgIT0gcHJldik7CisJfSB3aGlsZSAobG9jYWw2NF9jbXB4Y2hnKCZldmVudC0+aHcucHJldl9jb3VudCwgcHJldiwgdmFsKSAhPSBwcmV2KTsKIAogCS8qIFRoZSBjb3VudGVycyBhcmUgb25seSAzMiBiaXRzIHdpZGUgKi8KIAlkZWx0YSA9ICh2YWwgLSBwcmV2KSAmIDB4ZmZmZmZmZmZ1bDsKLQlhdG9taWM2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOwotCWF0b21pYzY0X3N1YihkZWx0YSwgJmV2ZW50LT5ody5wZXJpb2RfbGVmdCk7CisJbG9jYWw2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOworCWxvY2FsNjRfc3ViKGRlbHRhLCAmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0KTsKIH0KIAogLyoKQEAgLTI5NiwxMSArMjk2LDExIEBACiAKIAl2YWwgPSAwOwogCWlmIChldmVudC0+aHcuc2FtcGxlX3BlcmlvZCkgewotCQlzNjQgbGVmdCA9IGF0b21pYzY0X3JlYWQoJmV2ZW50LT5ody5wZXJpb2RfbGVmdCk7CisJCXM2NCBsZWZ0ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucGVyaW9kX2xlZnQpOwogCQlpZiAobGVmdCA8IDB4ODAwMDAwMDBMKQogCQkJdmFsID0gMHg4MDAwMDAwMEwgLSBsZWZ0OwogCX0KLQlhdG9taWM2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCB2YWwpOworCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgdmFsKTsKIAl3cml0ZV9wbWMoaSwgdmFsKTsKIAlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CiAKQEAgLTM3MSw4ICszNzEsOCBAQAogCWlmIChsZWZ0IDwgMHg4MDAwMDAwMEwpCiAJCXZhbCA9IDB4ODAwMDAwMDBMIC0gbGVmdDsKIAl3cml0ZV9wbWMoZXZlbnQtPmh3LmlkeCwgdmFsKTsKLQlhdG9taWM2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCB2YWwpOwotCWF0b21pYzY0X3NldCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnByZXZfY291bnQsIHZhbCk7CisJbG9jYWw2NF9zZXQoJmV2ZW50LT5ody5wZXJpb2RfbGVmdCwgbGVmdCk7CiAJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwogCXBlcmZfZW5hYmxlKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNTAwLDcgKzUwMCw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9UU1VQUCk7CiAKIAlldmVudC0+aHcubGFzdF9wZXJpb2QgPSBldmVudC0+aHcuc2FtcGxlX3BlcmlvZDsKLQlhdG9taWM2NF9zZXQoJmV2ZW50LT5ody5wZXJpb2RfbGVmdCwgZXZlbnQtPmh3Lmxhc3RfcGVyaW9kKTsKKwlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0LCBldmVudC0+aHcubGFzdF9wZXJpb2QpOwogCiAJLyoKIAkgKiBTZWUgaWYgd2UgbmVlZCB0byByZXNlcnZlIHRoZSBQTVUuCkBAIC01NDEsMTYgKzU0MSwxNiBAQAogCWludCByZWNvcmQgPSAwOwogCiAJLyogd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpbnRlcnJ1cHRzIGhlcmUgKi8KLQlwcmV2ID0gYXRvbWljNjRfcmVhZCgmZXZlbnQtPmh3LnByZXZfY291bnQpOworCXByZXYgPSBsb2NhbDY0X3JlYWQoJmV2ZW50LT5ody5wcmV2X2NvdW50KTsKIAlkZWx0YSA9ICh2YWwgLSBwcmV2KSAmIDB4ZmZmZmZmZmZ1bDsKLQlhdG9taWM2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOworCWxvY2FsNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKIAogCS8qCiAJICogU2VlIGlmIHRoZSB0b3RhbCBwZXJpb2QgZm9yIHRoaXMgZXZlbnQgaGFzIGV4cGlyZWQsCiAJICogYW5kIHVwZGF0ZSBmb3IgdGhlIG5leHQgcGVyaW9kLgogCSAqLwogCXZhbCA9IDA7Ci0JbGVmdCA9IGF0b21pYzY0X3JlYWQoJmV2ZW50LT5ody5wZXJpb2RfbGVmdCkgLSBkZWx0YTsKKwlsZWZ0ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucGVyaW9kX2xlZnQpIC0gZGVsdGE7CiAJaWYgKHBlcmlvZCkgewogCQlpZiAobGVmdCA8PSAwKSB7CiAJCQlsZWZ0ICs9IHBlcmlvZDsKQEAgLTU2Niw5ICs1NjYsMTAgQEAKIAkgKiBGaW5hbGx5IHJlY29yZCBkYXRhIGlmIHJlcXVlc3RlZC4KIAkgKi8KIAlpZiAocmVjb3JkKSB7Ci0JCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGEgPSB7Ci0JCQkucGVyaW9kCT0gZXZlbnQtPmh3Lmxhc3RfcGVyaW9kLAotCQl9OworCQlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBkYXRhOworCisJCXBlcmZfc2FtcGxlX2RhdGFfaW5pdCgmZGF0YSwgMCk7CisJCWRhdGEucGVyaW9kID0gZXZlbnQtPmh3Lmxhc3RfcGVyaW9kOwogCiAJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCBubWksICZkYXRhLCByZWdzKSkgewogCQkJLyoKQEAgLTU4NCw4ICs1ODUsOCBAQAogCX0KIAogCXdyaXRlX3BtYyhldmVudC0+aHcuaWR4LCB2YWwpOwotCWF0b21pYzY0X3NldCgmZXZlbnQtPmh3LnByZXZfY291bnQsIHZhbCk7Ci0JYXRvbWljNjRfc2V0KCZldmVudC0+aHcucGVyaW9kX2xlZnQsIGxlZnQpOworCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgdmFsKTsKKwlsb2NhbDY0X3NldCgmZXZlbnQtPmh3LnBlcmlvZF9sZWZ0LCBsZWZ0KTsKIAlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IDNiNGRjYzguLmFiM2UzOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtMTAxLDEwICsxMDEsNiBAQAogRVhQT1JUX1NZTUJPTChzdGFydF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAotI2lmZGVmIENPTkZJR19QUENfRlBVCi1FWFBPUlRfU1lNQk9MX0dQTChjdnRfZGYpOwotRVhQT1JUX1NZTUJPTF9HUEwoY3Z0X2ZkKTsKLSNlbmRpZgogRVhQT1JUX1NZTUJPTChnaXZldXBfZnB1KTsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogRVhQT1JUX1NZTUJPTChnaXZldXBfYWx0aXZlYyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDc3MzQyNGQuLmU3OGE1YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ2MiwxNCArNDYzLDQyIEBACiAjaWZkZWYgQ09ORklHX1BQQ19BRFZfREVCVUdfUkVHUwogCXN3aXRjaF9ib29rZV9kZWJ1Z19yZWdzKCZuZXctPnRocmVhZCk7CiAjZWxzZQorLyoKKyAqIEZvciBQUENfQk9PSzNTXzY0LCB3ZSB1c2UgdGhlIGh3LWJyZWFrcG9pbnQgaW50ZXJmYWNlcyB0aGF0IHdvdWxkCisgKiBzY2hlZHVsZSBEQUJSCisgKi8KKyNpZm5kZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAogCWlmICh1bmxpa2VseShfX2dldF9jcHVfdmFyKGN1cnJlbnRfZGFicikgIT0gbmV3LT50aHJlYWQuZGFicikpCiAJCXNldF9kYWJyKG5ldy0+dGhyZWFkLmRhYnIpOworI2VuZGlmIC8qIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQgKi8KICNlbmRpZgogCiAKIAluZXdfdGhyZWFkID0gJm5ldy0+dGhyZWFkOwogCW9sZF90aHJlYWQgPSAmY3VycmVudC0+dGhyZWFkOwogCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szRV82NCkKKwkvKiBYWFggQ3VycmVudCBCb29rM0UgY29kZSBkb2Vzbid0IGRlYWwgd2l0aCBrZXJuZWwgc2lkZSBEQkNSMCwKKwkgKiB3ZSBhbHdheXMgaG9sZCB0aGUgdXNlciB2YWx1ZXMsIHNvIHdlIHNldCBpdCBub3cuCisJICoKKwkgKiBIb3dldmVyLCB3ZSBlbnN1cmUgdGhlIGtlcm5lbCBNU1I6REUgaXMgYXBwcm9wcmlhdGVseSBjbGVhcmVkIHRvbworCSAqIHRvIGF2b2lkIHNwdXJyaW91cyBzaW5nbGUgc3RlcCBleGNlcHRpb25zIGluIHRoZSBrZXJuZWwuCisJICoKKwkgKiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgdG8gbWVyZ2Ugd2l0aCB0aGUgcHBjMzIgY29kZSBhdCBzb21lIHBvaW50LAorCSAqIGJ1dCBJIGRvbid0IGxpa2UgbXVjaCB3aGF0IHBwYzMyIGlzIGRvaW5nIHRvZGF5IHNvIHRoZXJlJ3Mgc29tZQorCSAqIHRoaW5raW5nIG5lZWRlZCB0aGVyZQorCSAqLworCWlmICgobmV3X3RocmVhZC0+ZGJjcjAgfCBvbGRfdGhyZWFkLT5kYmNyMCkgJiBEQkNSMF9JRE0pIHsKKwkJdTMyIGRiY3IwOworCisJCW10bXNyKG1mbXNyKCkgJiB+TVNSX0RFKTsKKwkJaXN5bmMoKTsKKwkJZGJjcjAgPSBtZnNwcihTUFJOX0RCQ1IwKTsKKwkJZGJjcjAgPSAoZGJjcjAgJiBEQkNSMF9FRE0pIHwgbmV3X3RocmVhZC0+ZGJjcjA7CisJCW10c3ByKFNQUk5fREJDUjAsIGRiY3IwKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQzY0X0JPT0szRSAqLworCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJLyoKIAkgKiBDb2xsZWN0IHByb2Nlc3NvciB1dGlsaXphdGlvbiBkYXRhIHBlciBwcm9jZXNzCkBAIC02NDIsNyArNjcxLDExIEBACiB7CiAJZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSgpOwogCisjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVFMKKwlmbHVzaF9wdHJhY2VfaHdfYnJlYWtwb2ludChjdXJyZW50KTsKKyNlbHNlIC8qIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlRTICovCiAJc2V0X2RlYnVnX3JlZ19kZWZhdWx0cygmY3VycmVudC0+dGhyZWFkKTsKKyNlbmRpZiAvKiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UUyAqLwogfQogCiB2b2lkCkBAIC02NjAsNiArNjkzLDkgQEAKIAlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZChjdXJyZW50KTsKIAlmbHVzaF92c3hfdG9fdGhyZWFkKGN1cnJlbnQpOwogCWZsdXNoX3NwZV90b190aHJlYWQoY3VycmVudCk7CisjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAorCWZsdXNoX3B0cmFjZV9od19icmVha3BvaW50KHRzayk7CisjZW5kaWYgLyogQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCAqLwogfQogCiAvKgpAQCAtMTI2MywzICsxMjk5LDE0IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCisjaWZkZWYgQ09ORklHX1NNUAoraW50IGFyY2hfc2Rfc2libGluZ19hc3ltX3BhY2tpbmcodm9pZCkKK3sKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVNZTV9TTVQpKSB7CisJCXByaW50a19vbmNlKEtFUk5fSU5GTyAiRW5hYmxpbmcgQXN5bW1ldHJpYyBTTVQgc2NoZWR1bGluZ1xuIik7CisJCXJldHVybiBTRF9BU1lNX1BBQ0tJTkc7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwppbmRleCAzYjZmOGFlLi45NDFmZjRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKQEAgLTMxMSw2ICszMTEsMjQgQEAKIAljYWxsX3Byb20oIndyaXRlIiwgMywgMSwgX3Byb20tPnN0ZG91dCwgYnVmLCBuaWJibGVzKTsKIH0KIAorLyogbWF4IG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBpbiBhbiB1bnNpZ25lZCBsb25nICovCisjZGVmaW5lIFVMX0RJR0lUUyAyMQorc3RhdGljIHZvaWQgX19pbml0IHByb21fcHJpbnRfZGVjKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWludCBpLCBzaXplOworCWNoYXIgYnVmW1VMX0RJR0lUUysxXTsKKwlzdHJ1Y3QgcHJvbV90ICpfcHJvbSA9ICZSRUxPQyhwcm9tKTsKKworCWZvciAoaSA9IFVMX0RJR0lUUy0xOyBpID49IDA7ICBpLS0pIHsKKwkJYnVmW2ldID0gKHZhbCAlIDEwKSArICcwJzsKKwkJdmFsID0gdmFsLzEwOworCQlpZiAodmFsID09IDApCisJCQlicmVhazsKKwl9CisJLyogc2hpZnQgc3R1ZmYgZG93biAqLworCXNpemUgPSBVTF9ESUdJVFMgLSBpOworCWNhbGxfcHJvbSgid3JpdGUiLCAzLCAxLCBfcHJvbS0+c3Rkb3V0LCBidWYraSwgc2l6ZSk7Cit9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwcm9tX3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKQEAgLTM1MCw2ICszNjgsMTQgQEAKIAkJCXYgPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CiAJCQlwcm9tX3ByaW50X2hleCh2KTsKIAkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCSsrcTsKKwkJCWlmICgqcSA9PSAndScpIHsgLyogJyVsdScgKi8KKwkJCQkrK3E7CisJCQkJdiA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwkJCQlwcm9tX3ByaW50X2RlYyh2KTsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAJfQogfQpAQCAtODM1LDExICs4NjEsMTEgQEAKIAkJaWYgKHBsZW4gPT0gUFJPTV9FUlJPUikKIAkJCWJyZWFrOwogCQlwbGVuID4+PSAyOwotCQlwcm9tX2RlYnVnKCJGb3VuZCAweCV4IHNtdCB0aHJlYWRzIHBlciBjb3JlXG4iLCAodW5zaWduZWQgbG9uZylwbGVuKTsKKwkJcHJvbV9kZWJ1ZygiRm91bmQgJWx1IHNtdCB0aHJlYWRzIHBlciBjb3JlXG4iLCAodW5zaWduZWQgbG9uZylwbGVuKTsKIAogCQkvKiBTYW5pdHkgY2hlY2sgKi8KIAkJaWYgKHBsZW4gPCAxIHx8IHBsZW4gPiA2NCkgewotCQkJcHJvbV9wcmludGYoIlRocmVhZHMgcGVyIGNvcmUgMHgleCBvdXQgb2YgYm91bmRzLCBhc3N1bWluZyAxXG4iLAorCQkJcHJvbV9wcmludGYoIlRocmVhZHMgcGVyIGNvcmUgJWx1IG91dCBvZiBib3VuZHMsIGFzc3VtaW5nIDFcbiIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nKXBsZW4pOwogCQkJcmV0dXJuIDE7CiAJCX0KQEAgLTg2OSwxMiArODk1LDEyIEBACiAJCWNvcmVzID0gKHUzMiAqKVBUUlJFTE9DKCZpYm1fYXJjaGl0ZWN0dXJlX3ZlY1tJQk1fQVJDSF9WRUNfTlJDT1JFU19PRkZTRVRdKTsKIAkJaWYgKCpjb3JlcyAhPSBOUl9DUFVTKSB7CiAJCQlwcm9tX3ByaW50ZigiV0FSTklORyAhICIKLQkJCQkgICAgImlibV9hcmNoaXRlY3R1cmVfdmVjIHN0cnVjdHVyZSBpbmNvbnNpc3RlbnQ6IDB4JXggIVxuIiwKKwkJCQkgICAgImlibV9hcmNoaXRlY3R1cmVfdmVjIHN0cnVjdHVyZSBpbmNvbnNpc3RlbnQ6ICVsdSFcbiIsCiAJCQkJICAgICpjb3Jlcyk7CiAJCX0gZWxzZSB7CiAJCQkqY29yZXMgPSBESVZfUk9VTkRfVVAoTlJfQ1BVUywgcHJvbV9jb3VudF9zbXRfdGhyZWFkcygpKTsKLQkJCXByb21fcHJpbnRmKCJNYXggbnVtYmVyIG9mIGNvcmVzIHBhc3NlZCB0byBmaXJtd2FyZTogMHgleFxuIiwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpKmNvcmVzKTsKKwkJCXByb21fcHJpbnRmKCJNYXggbnVtYmVyIG9mIGNvcmVzIHBhc3NlZCB0byBmaXJtd2FyZTogJWx1IChOUl9DUFVTID0gJWx1KVxuIiwKKwkJCQkgICAgKmNvcmVzLCBOUl9DUFVTKTsKIAkJfQogCiAJCS8qIHRyeSBjYWxsaW5nIHRoZSBpYm0sY2xpZW50LWFyY2hpdGVjdHVyZS1zdXBwb3J0IG1ldGhvZCAqLwpAQCAtMTQ4Miw3ICsxNTA4LDcgQEAKIAkJcmVnID0gLTE7CiAJCXByb21fZ2V0cHJvcChub2RlLCAicmVnIiwgJnJlZywgc2l6ZW9mKHJlZykpOwogCi0JCXByb21fZGVidWcoImNwdSBodyBpZHggICA9IDB4JXhcbiIsIHJlZyk7CisJCXByb21fZGVidWcoImNwdSBodyBpZHggICA9ICVsdVxuIiwgcmVnKTsKIAogCQkvKiBJbml0IHRoZSBhY2tub3dsZWRnZSB2YXIgd2hpY2ggd2lsbCBiZSByZXNldCBieQogCQkgKiB0aGUgc2Vjb25kYXJ5IGNwdSB3aGVuIGl0IGF3YWtlbnMgZnJvbSBpdHMgT0YKQEAgLTE0OTIsNyArMTUxOCw3IEBACiAKIAkJaWYgKHJlZyAhPSBfcHJvbS0+Y3B1KSB7CiAJCQkvKiBQcmltYXJ5IFRocmVhZCBvZiBub24tYm9vdCBjcHUgKi8KLQkJCXByb21fcHJpbnRmKCJzdGFydGluZyBjcHUgaHcgaWR4ICV4Li4uICIsIHJlZyk7CisJCQlwcm9tX3ByaW50Zigic3RhcnRpbmcgY3B1IGh3IGlkeCAlbHUuLi4gIiwgcmVnKTsKIAkJCWNhbGxfcHJvbSgic3RhcnQtY3B1IiwgMywgMCwgbm9kZSwKIAkJCQkgIHNlY29uZGFyeV9ob2xkLCByZWcpOwogCkBAIC0xNTA3LDcgKzE1MzMsNyBAQAogCQl9CiAjaWZkZWYgQ09ORklHX1NNUAogCQllbHNlCi0JCQlwcm9tX3ByaW50ZigiYm9vdCBjcHUgaHcgaWR4ICV4XG4iLCByZWcpOworCQkJcHJvbV9wcmludGYoImJvb3QgY3B1IGh3IGlkeCAlbHVcbiIsIHJlZyk7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCX0KIApAQCAtMjQyMCw3ICsyNDQ2LDcgQEAKIAlwcm9tX2dldHByb3AoY3B1X3BrZywgInJlZyIsICZnZXRwcm9wX3J2YWwsIHNpemVvZihnZXRwcm9wX3J2YWwpKTsKIAlfcHJvbS0+Y3B1ID0gZ2V0cHJvcF9ydmFsOwogCi0JcHJvbV9kZWJ1ZygiQm9vdGluZyBDUFUgaHcgaW5kZXggPSAweCV4XG4iLCBfcHJvbS0+Y3B1KTsKKwlwcm9tX2RlYnVnKCJCb290aW5nIENQVSBodyBpbmRleCA9ICVsdVxuIiwgX3Byb20tPmNwdSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwcm9tX2NoZWNrX2luaXRyZCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCA4MzYyNjIwLi44ODMzNGFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtNiwyMzIgKzYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAKLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IHByaW50ayhmbXQpOyB9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0jZGVmaW5lIFBSdTY0CSIlbHgiCi0jZWxzZQotI2RlZmluZSBQUnU2NAkiJWxseCIKLSNlbmRpZgotCi0vKiBNYXggYWRkcmVzcyBzaXplIHdlIGRlYWwgd2l0aCAqLwotI2RlZmluZSBPRl9NQVhfQUREUl9DRUxMUwk0Ci0jZGVmaW5lIE9GX0NIRUNLX0NPVU5UUyhuYSwgbnMpCSgobmEpID4gMCAmJiAobmEpIDw9IE9GX01BWF9BRERSX0NFTExTICYmIFwKLQkJCShucykgPiAwKQotCi1zdGF0aWMgc3RydWN0IG9mX2J1cyAqb2ZfbWF0Y2hfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCi0JCWNvbnN0IHUzMiAqYWRkcnAsIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCXN0cnVjdCByZXNvdXJjZSAqcik7Ci0KLQotLyogRGVidWcgdXRpbGl0eSAqLwotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgY29uc3QgdTMyICphZGRyLCBpbnQgbmEpCi17Ci0JcHJpbnRrKCIlcyIsIHMpOwotCXdoaWxlKG5hLS0pCi0JCXByaW50aygiICUwOHgiLCAqKGFkZHIrKykpOwotCXByaW50aygiXG4iKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgY29uc3QgdTMyICphZGRyLCBpbnQgbmEpIHsgfQotI2VuZGlmCi0KLQotLyogQ2FsbGJhY2tzIGZvciBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcnMgKi8KLXN0cnVjdCBvZl9idXMgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JY29uc3QgY2hhcgkqYWRkcmVzc2VzOwotCWludAkJKCptYXRjaCkoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpOwotCXZvaWQJCSgqY291bnRfY2VsbHMpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsCi0JCQkJICAgICAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpOwotCXU2NAkJKCptYXApKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwKLQkJCQlpbnQgbmEsIGludCBucywgaW50IHBuYSk7Ci0JaW50CQkoKnRyYW5zbGF0ZSkodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpOwotCXVuc2lnbmVkIGludAkoKmdldF9mbGFncykoY29uc3QgdTMyICphZGRyKTsKLX07Ci0KLQotLyoKLSAqIERlZmF1bHQgdHJhbnNsYXRvciAoZ2VuZXJpYyBidXMpCi0gKi8KLQotc3RhdGljIHZvaWQgb2ZfYnVzX2RlZmF1bHRfY291bnRfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCi0JCQkJICAgICAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCi17Ci0JaWYgKGFkZHJjKQotCQkqYWRkcmMgPSBvZl9uX2FkZHJfY2VsbHMoZGV2KTsKLQlpZiAoc2l6ZWMpCi0JCSpzaXplYyA9IG9mX25fc2l6ZV9jZWxscyhkZXYpOwotfQotCi1zdGF0aWMgdTY0IG9mX2J1c19kZWZhdWx0X21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsCi0JCWludCBuYSwgaW50IG5zLCBpbnQgcG5hKQotewotCXU2NCBjcCwgcywgZGE7Ci0KLQljcCA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlLCBuYSk7Ci0JcyAgPSBvZl9yZWFkX251bWJlcihyYW5nZSArIG5hICsgcG5hLCBucyk7Ci0JZGEgPSBvZl9yZWFkX251bWJlcihhZGRyLCBuYSk7Ci0KLQlEQkcoIk9GOiBkZWZhdWx0IG1hcCwgY3A9IlBSdTY0Iiwgcz0iUFJ1NjQiLCBkYT0iUFJ1NjQiXG4iLAotCSAgICBjcCwgcywgZGEpOwotCi0JaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCi0JCXJldHVybiBPRl9CQURfQUREUjsKLQlyZXR1cm4gZGEgLSBjcDsKLX0KLQotc3RhdGljIGludCBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpCi17Ci0JdTY0IGEgPSBvZl9yZWFkX251bWJlcihhZGRyLCBuYSk7Ci0JbWVtc2V0KGFkZHIsIDAsIG5hICogNCk7Ci0JYSArPSBvZmZzZXQ7Ci0JaWYgKG5hID4gMSkKLQkJYWRkcltuYSAtIDJdID0gYSA+PiAzMjsKLQlhZGRyW25hIC0gMV0gPSBhICYgMHhmZmZmZmZmZnU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfZGVmYXVsdF9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQotewotCXJldHVybiBJT1JFU09VUkNFX01FTTsKLX0KLQotCiAjaWZkZWYgQ09ORklHX1BDSQotLyoKLSAqIFBDSSBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcgotICovCi0KLXN0YXRpYyBpbnQgb2ZfYnVzX3BjaV9tYXRjaChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCS8qICJ2Y2kiIGlzIGZvciB0aGUgL2NoYW9zIGJyaWRnZSBvbiAxc3QtZ2VuIFBDSSBwb3dlcm1hY3MgKi8KLQlyZXR1cm4gIXN0cmNtcChucC0+dHlwZSwgInBjaSIpIHx8ICFzdHJjbXAobnAtPnR5cGUsICJ2Y2kiKTsKLX0KLQotc3RhdGljIHZvaWQgb2ZfYnVzX3BjaV9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCi17Ci0JaWYgKGFkZHJjKQotCQkqYWRkcmMgPSAzOwotCWlmIChzaXplYykKLQkJKnNpemVjID0gMjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCi17Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQl1MzIgdyA9IGFkZHJbMF07Ci0KLQlzd2l0Y2goKHcgPj4gMjQpICYgMHgwMykgewotCWNhc2UgMHgwMToKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JTzsKLQkJYnJlYWs7Ci0JY2FzZSAweDAyOiAvKiAzMiBiaXRzICovCi0JY2FzZSAweDAzOiAvKiA2NCBiaXRzICovCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOwotCQlicmVhazsKLQl9Ci0JaWYgKHcgJiAweDQwMDAwMDAwKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX1BSRUZFVENIOwotCXJldHVybiBmbGFnczsKLX0KLQotc3RhdGljIHU2NCBvZl9idXNfcGNpX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQotewotCXU2NCBjcCwgcywgZGE7Ci0JdW5zaWduZWQgaW50IGFmLCByZjsKLQotCWFmID0gb2ZfYnVzX3BjaV9nZXRfZmxhZ3MoYWRkcik7Ci0JcmYgPSBvZl9idXNfcGNpX2dldF9mbGFncyhyYW5nZSk7Ci0KLQkvKiBDaGVjayBhZGRyZXNzIHR5cGUgbWF0Y2ggKi8KLQlpZiAoKGFmIF4gcmYpICYgKElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9JTykpCi0JCXJldHVybiBPRl9CQURfQUREUjsKLQotCS8qIFJlYWQgYWRkcmVzcyB2YWx1ZXMsIHNraXBwaW5nIGhpZ2ggY2VsbCAqLwotCWNwID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyAxLCBuYSAtIDEpOwotCXMgID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOwotCWRhID0gb2ZfcmVhZF9udW1iZXIoYWRkciArIDEsIG5hIC0gMSk7Ci0KLQlEQkcoIk9GOiBQQ0kgbWFwLCBjcD0iUFJ1NjQiLCBzPSJQUnU2NCIsIGRhPSJQUnU2NCJcbiIsIGNwLCBzLCBkYSk7Ci0KLQlpZiAoZGEgPCBjcCB8fCBkYSA+PSAoY3AgKyBzKSkKLQkJcmV0dXJuIE9GX0JBRF9BRERSOwotCXJldHVybiBkYSAtIGNwOwotfQotCi1zdGF0aWMgaW50IG9mX2J1c19wY2lfdHJhbnNsYXRlKHUzMiAqYWRkciwgdTY0IG9mZnNldCwgaW50IG5hKQotewotCXJldHVybiBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUoYWRkciArIDEsIG9mZnNldCwgbmEgLSAxKTsKLX0KLQotY29uc3QgdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sIHU2NCAqc2l6ZSwKLQkJCXVuc2lnbmVkIGludCAqZmxhZ3MpCi17Ci0JY29uc3QgdTMyICpwcm9wOwotCXVuc2lnbmVkIGludCBwc2l6ZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudDsKLQlzdHJ1Y3Qgb2ZfYnVzICpidXM7Ci0JaW50IG9uZXNpemUsIGksIG5hLCBuczsKLQotCS8qIEdldCBwYXJlbnQgJiBtYXRjaCBidXMgdHlwZSAqLwotCXBhcmVudCA9IG9mX2dldF9wYXJlbnQoZGV2KTsKLQlpZiAocGFyZW50ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWJ1cyA9IG9mX21hdGNoX2J1cyhwYXJlbnQpOwotCWlmIChzdHJjbXAoYnVzLT5uYW1lLCAicGNpIikpIHsKLQkJb2Zfbm9kZV9wdXQocGFyZW50KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1cy0+Y291bnRfY2VsbHMoZGV2LCAmbmEsICZucyk7Ci0Jb2Zfbm9kZV9wdXQocGFyZW50KTsKLQlpZiAoIU9GX0NIRUNLX0NPVU5UUyhuYSwgbnMpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIEdldCAicmVnIiBvciAiYXNzaWduZWQtYWRkcmVzc2VzIiBwcm9wZXJ0eSAqLwotCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCBidXMtPmFkZHJlc3NlcywgJnBzaXplKTsKLQlpZiAocHJvcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwc2l6ZSAvPSA0OwotCi0Jb25lc2l6ZSA9IG5hICsgbnM7Ci0JZm9yIChpID0gMDsgcHNpemUgPj0gb25lc2l6ZTsgcHNpemUgLT0gb25lc2l6ZSwgcHJvcCArPSBvbmVzaXplLCBpKyspCi0JCWlmICgocHJvcFswXSAmIDB4ZmYpID09ICgoYmFyX25vICogNCkgKyBQQ0lfQkFTRV9BRERSRVNTXzApKSB7Ci0JCQlpZiAoc2l6ZSkKLQkJCQkqc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKHByb3AgKyBuYSwgbnMpOwotCQkJaWYgKGZsYWdzKQotCQkJCSpmbGFncyA9IGJ1cy0+Z2V0X2ZsYWdzKHByb3ApOwotCQkJcmV0dXJuIHByb3A7Ci0JCX0KLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0X3BjaV9hZGRyZXNzKTsKLQotaW50IG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyLAotCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQljb25zdCB1MzIJKmFkZHJwOwotCXU2NAkJc2l6ZTsKLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0KLQlhZGRycCA9IG9mX2dldF9wY2lfYWRkcmVzcyhkZXYsIGJhciwgJnNpemUsICZmbGFncyk7Ci0JaWYgKGFkZHJwID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCBhZGRycCwgc2l6ZSwgZmxhZ3MsIHIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2UpOwotCiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKQEAgLTMxMywzNDUgKzkyLDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfcGNpKTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKLS8qCi0gKiBJU0EgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3IKLSAqLwotCi1zdGF0aWMgaW50IG9mX2J1c19pc2FfbWF0Y2goc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlyZXR1cm4gIXN0cmNtcChucC0+bmFtZSwgImlzYSIpOwotfQotCi1zdGF0aWMgdm9pZCBvZl9idXNfaXNhX2NvdW50X2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsCi0JCQkJICAgaW50ICphZGRyYywgaW50ICpzaXplYykKLXsKLQlpZiAoYWRkcmMpCi0JCSphZGRyYyA9IDI7Ci0JaWYgKHNpemVjKQotCQkqc2l6ZWMgPSAxOwotfQotCi1zdGF0aWMgdTY0IG9mX2J1c19pc2FfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCi17Ci0JdTY0IGNwLCBzLCBkYTsKLQotCS8qIENoZWNrIGFkZHJlc3MgdHlwZSBtYXRjaCAqLwotCWlmICgoYWRkclswXSBeIHJhbmdlWzBdKSAmIDB4MDAwMDAwMDEpCi0JCXJldHVybiBPRl9CQURfQUREUjsKLQotCS8qIFJlYWQgYWRkcmVzcyB2YWx1ZXMsIHNraXBwaW5nIGhpZ2ggY2VsbCAqLwotCWNwID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyAxLCBuYSAtIDEpOwotCXMgID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOwotCWRhID0gb2ZfcmVhZF9udW1iZXIoYWRkciArIDEsIG5hIC0gMSk7Ci0KLQlEQkcoIk9GOiBJU0EgbWFwLCBjcD0iUFJ1NjQiLCBzPSJQUnU2NCIsIGRhPSJQUnU2NCJcbiIsIGNwLCBzLCBkYSk7Ci0KLQlpZiAoZGEgPCBjcCB8fCBkYSA+PSAoY3AgKyBzKSkKLQkJcmV0dXJuIE9GX0JBRF9BRERSOwotCXJldHVybiBkYSAtIGNwOwotfQotCi1zdGF0aWMgaW50IG9mX2J1c19pc2FfdHJhbnNsYXRlKHUzMiAqYWRkciwgdTY0IG9mZnNldCwgaW50IG5hKQotewotCXJldHVybiBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUoYWRkciArIDEsIG9mZnNldCwgbmEgLSAxKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfaXNhX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCi17Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQl1MzIgdyA9IGFkZHJbMF07Ci0KLQlpZiAodyAmIDEpCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87Ci0JZWxzZQotCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKLQlyZXR1cm4gZmxhZ3M7Ci19Ci0KLQotLyoKLSAqIEFycmF5IG9mIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycwotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfYnVzIG9mX2J1c3Nlc1tdID0gewotI2lmZGVmIENPTkZJR19QQ0kKLQkvKiBQQ0kgKi8KLQl7Ci0JCS5uYW1lID0gInBjaSIsCi0JCS5hZGRyZXNzZXMgPSAiYXNzaWduZWQtYWRkcmVzc2VzIiwKLQkJLm1hdGNoID0gb2ZfYnVzX3BjaV9tYXRjaCwKLQkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX3BjaV9jb3VudF9jZWxscywKLQkJLm1hcCA9IG9mX2J1c19wY2lfbWFwLAotCQkudHJhbnNsYXRlID0gb2ZfYnVzX3BjaV90cmFuc2xhdGUsCi0JCS5nZXRfZmxhZ3MgPSBvZl9idXNfcGNpX2dldF9mbGFncywKLQl9LAotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQkvKiBJU0EgKi8KLQl7Ci0JCS5uYW1lID0gImlzYSIsCi0JCS5hZGRyZXNzZXMgPSAicmVnIiwKLQkJLm1hdGNoID0gb2ZfYnVzX2lzYV9tYXRjaCwKLQkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX2lzYV9jb3VudF9jZWxscywKLQkJLm1hcCA9IG9mX2J1c19pc2FfbWFwLAotCQkudHJhbnNsYXRlID0gb2ZfYnVzX2lzYV90cmFuc2xhdGUsCi0JCS5nZXRfZmxhZ3MgPSBvZl9idXNfaXNhX2dldF9mbGFncywKLQl9LAotCS8qIERlZmF1bHQgKi8KLQl7Ci0JCS5uYW1lID0gImRlZmF1bHQiLAotCQkuYWRkcmVzc2VzID0gInJlZyIsCi0JCS5tYXRjaCA9IE5VTEwsCi0JCS5jb3VudF9jZWxscyA9IG9mX2J1c19kZWZhdWx0X2NvdW50X2NlbGxzLAotCQkubWFwID0gb2ZfYnVzX2RlZmF1bHRfbWFwLAotCQkudHJhbnNsYXRlID0gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlLAotCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9mX2J1cyAqb2ZfbWF0Y2hfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvZl9idXNzZXMpOyBpICsrKQotCQlpZiAoIW9mX2J1c3Nlc1tpXS5tYXRjaCB8fCBvZl9idXNzZXNbaV0ubWF0Y2gobnApKQotCQkJcmV0dXJuICZvZl9idXNzZXNbaV07Ci0JQlVHKCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfdHJhbnNsYXRlX29uZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgc3RydWN0IG9mX2J1cyAqYnVzLAotCQkJICAgIHN0cnVjdCBvZl9idXMgKnBidXMsIHUzMiAqYWRkciwKLQkJCSAgICBpbnQgbmEsIGludCBucywgaW50IHBuYSwgY29uc3QgY2hhciAqcnByb3ApCi17Ci0JY29uc3QgdTMyICpyYW5nZXM7Ci0JdW5zaWduZWQgaW50IHJsZW47Ci0JaW50IHJvbmU7Ci0JdTY0IG9mZnNldCA9IE9GX0JBRF9BRERSOwotCi0JLyogTm9ybWFsbHksIGFuIGFic2VuY2Ugb2YgYSAicmFuZ2VzIiBwcm9wZXJ0eSBtZWFucyB3ZSBhcmUKLQkgKiBjcm9zc2luZyBhIG5vbi10cmFuc2xhdGFibGUgYm91bmRhcnksIGFuZCB0aHVzIHRoZSBhZGRyZXNzZXMKLQkgKiBiZWxvdyB0aGUgY3VycmVudCBub3QgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBDUFUgcGh5c2ljYWwgb25lcy4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB3aGlsZSB0aGlzIGlzIHZlcnkgY2xlYXIgaW4gdGhlIHNwZWMsIGl0J3Mgbm90Ci0JICogd2hhdCBBcHBsZSB1bmRlcnN0b29kLCBhbmQgdGhleSBkbyBoYXZlIHRoaW5ncyBsaWtlIC91bmktbiBvcgotCSAqIC9odCBub2RlcyB3aXRoIG5vICJyYW5nZXMiIHByb3BlcnR5IGFuZCBhIGxvdCBvZiBwZXJmZWN0bHkKLQkgKiB1c2VhYmxlIG1hcHBlZCBkZXZpY2VzIGJlbG93IHRoZW0uIFRodXMgd2UgdHJlYXQgdGhlIGFic2VuY2Ugb2YKLQkgKiAicmFuZ2VzIiBhcyBlcXVpdmFsZW50IHRvIGFuIGVtcHR5ICJyYW5nZXMiIHByb3BlcnR5IHdoaWNoIG1lYW5zCi0JICogYSAxOjEgdHJhbnNsYXRpb24gYXQgdGhhdCBsZXZlbC4gSXQncyB1cCB0byB0aGUgY2FsbGVyIG5vdCB0byB0cnkKLQkgKiB0byB0cmFuc2xhdGUgYWRkcmVzc2VzIHRoYXQgYXJlbid0IHN1cHBvc2VkIHRvIGJlIHRyYW5zbGF0ZWQgaW4KLQkgKiB0aGUgZmlyc3QgcGxhY2UuIC0tQmVuSC4KLQkgKi8KLQlyYW5nZXMgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LCBycHJvcCwgJnJsZW4pOwotCWlmIChyYW5nZXMgPT0gTlVMTCB8fCBybGVuID09IDApIHsKLQkJb2Zmc2V0ID0gb2ZfcmVhZF9udW1iZXIoYWRkciwgbmEpOwotCQltZW1zZXQoYWRkciwgMCwgcG5hICogNCk7Ci0JCURCRygiT0Y6IG5vIHJhbmdlcywgMToxIHRyYW5zbGF0aW9uXG4iKTsKLQkJZ290byBmaW5pc2g7Ci0JfQotCi0JREJHKCJPRjogd2Fsa2luZyByYW5nZXMuLi5cbiIpOwotCi0JLyogTm93IHdhbGsgdGhyb3VnaCB0aGUgcmFuZ2VzICovCi0JcmxlbiAvPSA0OwotCXJvbmUgPSBuYSArIHBuYSArIG5zOwotCWZvciAoOyBybGVuID49IHJvbmU7IHJsZW4gLT0gcm9uZSwgcmFuZ2VzICs9IHJvbmUpIHsKLQkJb2Zmc2V0ID0gYnVzLT5tYXAoYWRkciwgcmFuZ2VzLCBuYSwgbnMsIHBuYSk7Ci0JCWlmIChvZmZzZXQgIT0gT0ZfQkFEX0FERFIpCi0JCQlicmVhazsKLQl9Ci0JaWYgKG9mZnNldCA9PSBPRl9CQURfQUREUikgewotCQlEQkcoIk9GOiBub3QgZm91bmQgIVxuIik7Ci0JCXJldHVybiAxOwotCX0KLQltZW1jcHkoYWRkciwgcmFuZ2VzICsgbmEsIDQgKiBwbmEpOwotCi0gZmluaXNoOgotCW9mX2R1bXBfYWRkcigiT0Y6IHBhcmVudCB0cmFuc2xhdGlvbiBmb3I6IiwgYWRkciwgcG5hKTsKLQlEQkcoIk9GOiB3aXRoIG9mZnNldDogIlBSdTY0IlxuIiwgb2Zmc2V0KTsKLQotCS8qIFRyYW5zbGF0ZSBpdCBpbnRvIHBhcmVudCBidXMgc3BhY2UgKi8KLQlyZXR1cm4gcGJ1cy0+dHJhbnNsYXRlKGFkZHIsIG9mZnNldCwgcG5hKTsKLX0KLQotCi0vKgotICogVHJhbnNsYXRlIGFuIGFkZHJlc3MgZnJvbSB0aGUgZGV2aWNlLXRyZWUgaW50byBhIENQVSBwaHlzaWNhbCBhZGRyZXNzLAotICogdGhpcyB3YWxrcyB1cCB0aGUgdHJlZSBhbmQgYXBwbGllcyB0aGUgdmFyaW91cyBidXMgbWFwcGluZ3Mgb24gdGhlCi0gKiB3YXkuCi0gKgotICogTm90ZTogV2UgY29uc2lkZXIgdGhhdCBjcm9zc2luZyBhbnkgbGV2ZWwgd2l0aCAjc2l6ZS1jZWxscyA9PSAwIHRvIG1lYW4KLSAqIHRoYXQgdHJhbnNsYXRpb24gaXMgaW1wb3NzaWJsZSAodGhhdCBpcyB3ZSBhcmUgbm90IGRlYWxpbmcgd2l0aCBhIHZhbHVlCi0gKiB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBjcHUgcGh5c2ljYWwgYWRkcmVzcykuIFRoaXMgaXMgbm90IHJlYWxseSBzcGVjaWZpZWQKLSAqIHRoYXQgd2F5LCBidXQgdGhpcyBpcyB0cmFkaXRpb25hbGx5IHRoZSB3YXkgSUJNIGF0IGxlYXN0IGRvIHRoaW5ncwotICovCi11NjQgX19vZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyLAotCQkJICAgY29uc3QgY2hhciAqcnByb3ApCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBvZl9idXMgKmJ1cywgKnBidXM7Ci0JdTMyIGFkZHJbT0ZfTUFYX0FERFJfQ0VMTFNdOwotCWludCBuYSwgbnMsIHBuYSwgcG5zOwotCXU2NCByZXN1bHQgPSBPRl9CQURfQUREUjsKLQotCURCRygiT0Y6ICoqIHRyYW5zbGF0aW9uIGZvciBkZXZpY2UgJXMgKipcbiIsIGRldi0+ZnVsbF9uYW1lKTsKLQotCS8qIEluY3JlYXNlIHJlZmNvdW50IGF0IGN1cnJlbnQgbGV2ZWwgKi8KLQlvZl9ub2RlX2dldChkZXYpOwotCi0JLyogR2V0IHBhcmVudCAmIG1hdGNoIGJ1cyB0eXBlICovCi0JcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkKLQkJZ290byBiYWlsOwotCWJ1cyA9IG9mX21hdGNoX2J1cyhwYXJlbnQpOwotCi0JLyogQ291bmQgYWRkcmVzcyBjZWxscyAmIGNvcHkgYWRkcmVzcyBsb2NhbGx5ICovCi0JYnVzLT5jb3VudF9jZWxscyhkZXYsICZuYSwgJm5zKTsKLQlpZiAoIU9GX0NIRUNLX0NPVU5UUyhuYSwgbnMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHJvbV9wYXJzZTogQmFkIGNlbGwgY291bnQgZm9yICVzXG4iLAotCQkgICAgICAgZGV2LT5mdWxsX25hbWUpOwotCQlnb3RvIGJhaWw7Ci0JfQotCW1lbWNweShhZGRyLCBpbl9hZGRyLCBuYSAqIDQpOwotCi0JREJHKCJPRjogYnVzIGlzICVzIChuYT0lZCwgbnM9JWQpIG9uICVzXG4iLAotCSAgICBidXMtPm5hbWUsIG5hLCBucywgcGFyZW50LT5mdWxsX25hbWUpOwotCW9mX2R1bXBfYWRkcigiT0Y6IHRyYW5zbGF0aW5nIGFkZHJlc3M6IiwgYWRkciwgbmEpOwotCi0JLyogVHJhbnNsYXRlICovCi0JZm9yICg7OykgewotCQkvKiBTd2l0Y2ggdG8gcGFyZW50IGJ1cyAqLwotCQlvZl9ub2RlX3B1dChkZXYpOwotCQlkZXYgPSBwYXJlbnQ7Ci0JCXBhcmVudCA9IG9mX2dldF9wYXJlbnQoZGV2KTsKLQotCQkvKiBJZiByb290LCB3ZSBoYXZlIGZpbmlzaGVkICovCi0JCWlmIChwYXJlbnQgPT0gTlVMTCkgewotCQkJREJHKCJPRjogcmVhY2hlZCByb290IG5vZGVcbiIpOwotCQkJcmVzdWx0ID0gb2ZfcmVhZF9udW1iZXIoYWRkciwgbmEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBHZXQgbmV3IHBhcmVudCBidXMgYW5kIGNvdW50cyAqLwotCQlwYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7Ci0JCXBidXMtPmNvdW50X2NlbGxzKGRldiwgJnBuYSwgJnBucyk7Ci0JCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKHBuYSwgcG5zKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwcm9tX3BhcnNlOiBCYWQgY2VsbCBjb3VudCBmb3IgJXNcbiIsCi0JCQkgICAgICAgZGV2LT5mdWxsX25hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlEQkcoIk9GOiBwYXJlbnQgYnVzIGlzICVzIChuYT0lZCwgbnM9JWQpIG9uICVzXG4iLAotCQkgICAgcGJ1cy0+bmFtZSwgcG5hLCBwbnMsIHBhcmVudC0+ZnVsbF9uYW1lKTsKLQotCQkvKiBBcHBseSBidXMgdHJhbnNsYXRpb24gKi8KLQkJaWYgKG9mX3RyYW5zbGF0ZV9vbmUoZGV2LCBidXMsIHBidXMsIGFkZHIsIG5hLCBucywgcG5hLCBycHJvcCkpCi0JCQlicmVhazsKLQotCQkvKiBDb21wbGV0ZSB0aGUgbW92ZSB1cCBvbmUgbGV2ZWwgKi8KLQkJbmEgPSBwbmE7Ci0JCW5zID0gcG5zOwotCQlidXMgPSBwYnVzOwotCi0JCW9mX2R1bXBfYWRkcigiT0Y6IG9uZSBsZXZlbCB0cmFuc2xhdGlvbjoiLCBhZGRyLCBuYSk7Ci0JfQotIGJhaWw6Ci0Jb2Zfbm9kZV9wdXQocGFyZW50KTsKLQlvZl9ub2RlX3B1dChkZXYpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmluX2FkZHIpCi17Ci0JcmV0dXJuIF9fb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZGV2LCBpbl9hZGRyLCAicmFuZ2VzIik7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX3RyYW5zbGF0ZV9hZGRyZXNzKTsKLQotdTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyKQotewotCXJldHVybiBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgaW5fYWRkciwgImRtYS1yYW5nZXMiKTsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfdHJhbnNsYXRlX2RtYV9hZGRyZXNzKTsKLQotY29uc3QgdTMyICpvZl9nZXRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCB1NjQgKnNpemUsCi0JCSAgICB1bnNpZ25lZCBpbnQgKmZsYWdzKQotewotCWNvbnN0IHUzMiAqcHJvcDsKLQl1bnNpZ25lZCBpbnQgcHNpemU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7Ci0Jc3RydWN0IG9mX2J1cyAqYnVzOwotCWludCBvbmVzaXplLCBpLCBuYSwgbnM7Ci0KLQkvKiBHZXQgcGFyZW50ICYgbWF0Y2ggYnVzIHR5cGUgKi8KLQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7Ci0JaWYgKHBhcmVudCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlidXMgPSBvZl9tYXRjaF9idXMocGFyZW50KTsKLQlidXMtPmNvdW50X2NlbGxzKGRldiwgJm5hLCAmbnMpOwotCW9mX25vZGVfcHV0KHBhcmVudCk7Ci0JaWYgKCFPRl9DSEVDS19DT1VOVFMobmEsIG5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBHZXQgInJlZyIgb3IgImFzc2lnbmVkLWFkZHJlc3NlcyIgcHJvcGVydHkgKi8KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgYnVzLT5hZGRyZXNzZXMsICZwc2l6ZSk7Ci0JaWYgKHByb3AgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcHNpemUgLz0gNDsKLQotCW9uZXNpemUgPSBuYSArIG5zOwotCWZvciAoaSA9IDA7IHBzaXplID49IG9uZXNpemU7IHBzaXplIC09IG9uZXNpemUsIHByb3AgKz0gb25lc2l6ZSwgaSsrKQotCQlpZiAoaSA9PSBpbmRleCkgewotCQkJaWYgKHNpemUpCi0JCQkJKnNpemUgPSBvZl9yZWFkX251bWJlcihwcm9wICsgbmEsIG5zKTsKLQkJCWlmIChmbGFncykKLQkJCQkqZmxhZ3MgPSBidXMtPmdldF9mbGFncyhwcm9wKTsKLQkJCXJldHVybiBwcm9wOwotCQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2dldF9hZGRyZXNzKTsKLQotc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqYWRkcnAsCi0JCQkJICAgIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQl1NjQgdGFkZHI7Ci0KLQlpZiAoKGZsYWdzICYgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSkpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXRhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZGV2LCBhZGRycCk7Ci0JaWYgKHRhZGRyID09IE9GX0JBRF9BRERSKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltZW1zZXQociwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJdW5zaWduZWQgbG9uZyBwb3J0OwotCQlwb3J0ID0gcGNpX2FkZHJlc3NfdG9fcGlvKHRhZGRyKTsKLQkJaWYgKHBvcnQgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJci0+c3RhcnQgPSBwb3J0OwotCQlyLT5lbmQgPSBwb3J0ICsgc2l6ZSAtIDE7Ci0JfSBlbHNlIHsKLQkJci0+c3RhcnQgPSB0YWRkcjsKLQkJci0+ZW5kID0gdGFkZHIgKyBzaXplIC0gMTsKLQl9Ci0Jci0+ZmxhZ3MgPSBmbGFnczsKLQlyLT5uYW1lID0gZGV2LT5uYW1lOwotCXJldHVybiAwOwotfQotCi1pbnQgb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAotCQkJICAgc3RydWN0IHJlc291cmNlICpyKQotewotCWNvbnN0IHUzMgkqYWRkcnA7Ci0JdTY0CQlzaXplOwotCXVuc2lnbmVkIGludAlmbGFnczsKLQotCWFkZHJwID0gb2ZfZ2V0X2FkZHJlc3MoZGV2LCBpbmRleCwgJnNpemUsICZmbGFncyk7Ci0JaWYgKGFkZHJwID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCBhZGRycCwgc2l6ZSwgZmxhZ3MsIHIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfYWRkcmVzc190b19yZXNvdXJjZSk7Ci0KIHZvaWQgb2ZfcGFyc2VfZG1hX3dpbmRvdyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBjb25zdCB2b2lkICpkbWFfd2luZG93X3Byb3AsCiAJCXVuc2lnbmVkIGxvbmcgKmJ1c25vLCB1bnNpZ25lZCBsb25nICpwaHlzLCB1bnNpZ25lZCBsb25nICpzaXplKQogewpAQCAtNjc4LDM0MiArMTE4LDYgQEAKIAkqc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKGRtYV93aW5kb3csIGNlbGxzKTsKIH0KIAotLyoKLSAqIEludGVycnVwdCByZW1hcHBlcgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfaXJxX3dvcmthcm91bmRzOwotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfaXJxX2RmbHRfcGljOwotCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpvZl9pcnFfZmluZF9wYXJlbnQoc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnA7Ci0JY29uc3QgcGhhbmRsZSAqcGFycDsKLQotCWlmICghb2Zfbm9kZV9nZXQoY2hpbGQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWRvIHsKLQkJcGFycCA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgImludGVycnVwdC1wYXJlbnQiLCBOVUxMKTsKLQkJaWYgKHBhcnAgPT0gTlVMTCkKLQkJCXAgPSBvZl9nZXRfcGFyZW50KGNoaWxkKTsKLQkJZWxzZSB7Ci0JCQlpZiAob2ZfaXJxX3dvcmthcm91bmRzICYgT0ZfSU1BUF9OT19QSEFORExFKQotCQkJCXAgPSBvZl9ub2RlX2dldChvZl9pcnFfZGZsdF9waWMpOwotCQkJZWxzZQotCQkJCXAgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGFycCk7Ci0JCX0KLQkJb2Zfbm9kZV9wdXQoY2hpbGQpOwotCQljaGlsZCA9IHA7Ci0JfSB3aGlsZSAocCAmJiBvZl9nZXRfcHJvcGVydHkocCwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKSA9PSBOVUxMKTsKLQotCXJldHVybiBwOwotfQotCi0vKiBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSBjYWxsZWQgaWYgeW91IGRvbid0IGhhdmUgYW55IHNwZWNpYWwgd29ya2Fyb3VuZAotICogZmxhZ3MgdG8gcGFzcwotICovCi12b2lkIG9mX2lycV9tYXBfaW5pdCh1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0Jb2ZfaXJxX3dvcmthcm91bmRzID0gZmxhZ3M7Ci0KLQkvKiBPbGRXb3JsZCwgZG9uJ3QgYm90aGVyIGxvb2tpbmcgYXQgb3RoZXIgdGhpbmdzICovCi0JaWYgKGZsYWdzICYgT0ZfSU1BUF9PTERXT1JMRF9NQUMpCi0JCXJldHVybjsKLQotCS8qIElmIHdlIGRvbid0IGhhdmUgcGhhbmRsZXMsIGxldCdzIHRyeSB0byBsb2NhdGUgYSBkZWZhdWx0IGludGVycnVwdAotCSAqIGNvbnRyb2xsZXIgKGhhcHBlbnMgd2hlbiBib290aW5nIHdpdGggQm9vdFgpLiBXZSBkbyBhIGZpcnN0IG1hdGNoCi0JICogaGVyZSwgaG9wZWZ1bGx5LCB0aGF0IG9ubHkgZXZlciBoYXBwZW5zIG9uIG1hY2hpbmVzIHdpdGggb25lCi0JICogY29udHJvbGxlci4KLQkgKi8KLQlpZiAoZmxhZ3MgJiBPRl9JTUFQX05PX1BIQU5ETEUpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCQlmb3JfZWFjaF9ub2RlX3dpdGhfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtY29udHJvbGxlciIpIHsKLQkJCS8qIFNraXAgL2Nob3Nlbi9pbnRlcnJ1cHQtY29udHJvbGxlciAqLwotCQkJaWYgKHN0cmNtcChucC0+bmFtZSwgImNob3NlbiIpID09IDApCi0JCQkJY29udGludWU7Ci0JCQkvKiBJdCBzZWVtcyBsaWtlIGF0IGxlYXN0IG9uZSBwZXJzb24gb24gdGhpcyBwbGFuZXQgd2FudHMKLQkJCSAqIHRvIHVzZSBCb290WCBvbiBhIG1hY2hpbmUgd2l0aCBhbiBBcHBsZUtpd2kgY29udHJvbGxlcgotCQkJICogd2hpY2ggaGFwcGVucyB0byBwcmV0ZW5kIHRvIGJlIGFuIGludGVycnVwdAotCQkJICogY29udHJvbGxlciB0b28uCi0JCQkgKi8KLQkJCWlmIChzdHJjbXAobnAtPm5hbWUsICJBcHBsZUtpd2kiKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSSB0aGluayB3ZSBmb3VuZCBvbmUgISAqLwotCQkJb2ZfaXJxX2RmbHRfcGljID0gbnA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotfQotCi1pbnQgb2ZfaXJxX21hcF9yYXcoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIGNvbnN0IHUzMiAqaW50c3BlYywgdTMyIG9pbnRzaXplLAotCQljb25zdCB1MzIgKmFkZHIsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICppcGFyLCAqdG5vZGUsICpvbGQgPSBOVUxMLCAqbmV3cGFyID0gTlVMTDsKLQljb25zdCB1MzIgKnRtcCwgKmltYXAsICppbWFzazsKLQl1MzIgaW50c2l6ZSA9IDEsIGFkZHJzaXplLCBuZXdpbnRzaXplID0gMCwgbmV3YWRkcnNpemUgPSAwOwotCWludCBpbWFwbGVuLCBtYXRjaCwgaTsKLQotCURCRygib2ZfaXJxX21hcF9yYXc6IHBhcj0lcyxpbnRzcGVjPVsweCUwOHggMHglMDh4Li4uXSxvaW50c2l6ZT0lZFxuIiwKLQkgICAgcGFyZW50LT5mdWxsX25hbWUsIGludHNwZWNbMF0sIGludHNwZWNbMV0sIG9pbnRzaXplKTsKLQotCWlwYXIgPSBvZl9ub2RlX2dldChwYXJlbnQpOwotCi0JLyogRmlyc3QgZ2V0IHRoZSAjaW50ZXJydXB0LWNlbGxzIHByb3BlcnR5IG9mIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHRoYXQgdGVsbHMgdXMgaG93IHRvIGludGVycHJldCB0aGUgcGFzc2VkLWluIGludHNwZWMuIElmIHRoZXJlCi0JICogaXMgbm9uZSwgd2UgYXJlIG5pY2UgYW5kIGp1c3Qgd2FsayB1cCB0aGUgdHJlZQotCSAqLwotCWRvIHsKLQkJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KGlwYXIsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCk7Ci0JCWlmICh0bXAgIT0gTlVMTCkgewotCQkJaW50c2l6ZSA9ICp0bXA7Ci0JCQlicmVhazsKLQkJfQotCQl0bm9kZSA9IGlwYXI7Ci0JCWlwYXIgPSBvZl9pcnFfZmluZF9wYXJlbnQoaXBhcik7Ci0JCW9mX25vZGVfcHV0KHRub2RlKTsKLQl9IHdoaWxlIChpcGFyKTsKLQlpZiAoaXBhciA9PSBOVUxMKSB7Ci0JCURCRygiIC0+IG5vIHBhcmVudCBmb3VuZCAhXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCURCRygib2ZfaXJxX21hcF9yYXc6IGlwYXI9JXMsIHNpemU9JWRcbiIsIGlwYXItPmZ1bGxfbmFtZSwgaW50c2l6ZSk7Ci0KLQlpZiAob2ludHNpemUgIT0gaW50c2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBMb29rIGZvciB0aGlzICNhZGRyZXNzLWNlbGxzLiBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGUgb2xkIGxpbnV4Ci0JICogdHJpY2sgb2YgbG9va2luZyBmb3IgdGhlIHBhcmVudCBoZXJlIGFzIHNvbWUgZGV2aWNlLXRyZWVzIHJlbHkgb24gaXQKLQkgKi8KLQlvbGQgPSBvZl9ub2RlX2dldChpcGFyKTsKLQlkbyB7Ci0JCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShvbGQsICIjYWRkcmVzcy1jZWxscyIsIE5VTEwpOwotCQl0bm9kZSA9IG9mX2dldF9wYXJlbnQob2xkKTsKLQkJb2Zfbm9kZV9wdXQob2xkKTsKLQkJb2xkID0gdG5vZGU7Ci0JfSB3aGlsZShvbGQgJiYgdG1wID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG9sZCk7Ci0Jb2xkID0gTlVMTDsKLQlhZGRyc2l6ZSA9ICh0bXAgPT0gTlVMTCkgPyAyIDogKnRtcDsKLQotCURCRygiIC0+IGFkZHJzaXplPSVkXG4iLCBhZGRyc2l6ZSk7Ci0KLQkvKiBOb3cgc3RhcnQgdGhlIGFjdHVhbCAicHJvcGVyIiB3YWxrIG9mIHRoZSBpbnRlcnJ1cHQgdHJlZSAqLwotCXdoaWxlIChpcGFyICE9IE5VTEwpIHsKLQkJLyogTm93IGNoZWNrIGlmIGN1cnNvciBpcyBhbiBpbnRlcnJ1cHQtY29udHJvbGxlciBhbmQgaWYgaXQgaXMKLQkJICogdGhlbiB3ZSBhcmUgZG9uZQotCQkgKi8KLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiLCBOVUxMKSAhPQotCQkJCU5VTEwpIHsKLQkJCURCRygiIC0+IGdvdCBpdCAhXG4iKTsKLQkJCW1lbWNweShvdXRfaXJxLT5zcGVjaWZpZXIsIGludHNwZWMsCi0JCQkgICAgICAgaW50c2l6ZSAqIHNpemVvZih1MzIpKTsKLQkJCW91dF9pcnEtPnNpemUgPSBpbnRzaXplOwotCQkJb3V0X2lycS0+Y29udHJvbGxlciA9IGlwYXI7Ci0JCQlvZl9ub2RlX3B1dChvbGQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBOb3cgbG9vayBmb3IgYW4gaW50ZXJydXB0LW1hcCAqLwotCQlpbWFwID0gb2ZfZ2V0X3Byb3BlcnR5KGlwYXIsICJpbnRlcnJ1cHQtbWFwIiwgJmltYXBsZW4pOwotCQkvKiBObyBpbnRlcnJ1cHQgbWFwLCBjaGVjayBmb3IgYW4gaW50ZXJydXB0IHBhcmVudCAqLwotCQlpZiAoaW1hcCA9PSBOVUxMKSB7Ci0JCQlEQkcoIiAtPiBubyBtYXAsIGdldHRpbmcgcGFyZW50XG4iKTsKLQkJCW5ld3BhciA9IG9mX2lycV9maW5kX3BhcmVudChpcGFyKTsKLQkJCWdvdG8gc2tpcGxldmVsOwotCQl9Ci0JCWltYXBsZW4gLz0gc2l6ZW9mKHUzMik7Ci0KLQkJLyogTG9vayBmb3IgYSBtYXNrICovCi0JCWltYXNrID0gb2ZfZ2V0X3Byb3BlcnR5KGlwYXIsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKLQotCQkvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBubyAicmVnIiBwcm9wZXJ0eSBhbmQgd2UgYXR0ZW1wdCB0byBwYXJzZQotCQkgKiBhbiBpbnRlcnJ1cHQtbWFwLCB0aGVuICNhZGRyZXNzLWNlbGxzIG11c3QgYmUgMC4KLQkJICogRmFpbCBpZiBpdCdzIG5vdC4KLQkJICovCi0JCWlmIChhZGRyID09IE5VTEwgJiYgYWRkcnNpemUgIT0gMCkgewotCQkJREJHKCIgLT4gbm8gcmVnIHBhc3NlZCBpbiB3aGVuIG5lZWRlZCAhXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCS8qIFBhcnNlIGludGVycnVwdC1tYXAgKi8KLQkJbWF0Y2ggPSAwOwotCQl3aGlsZSAoaW1hcGxlbiA+IChhZGRyc2l6ZSArIGludHNpemUgKyAxKSAmJiAhbWF0Y2gpIHsKLQkJCS8qIENvbXBhcmUgc3BlY2lmaWVycyAqLwotCQkJbWF0Y2ggPSAxOwotCQkJZm9yIChpID0gMDsgaSA8IGFkZHJzaXplICYmIG1hdGNoOyArK2kpIHsKLQkJCQl1MzIgbWFzayA9IGltYXNrID8gaW1hc2tbaV0gOiAweGZmZmZmZmZmdTsKLQkJCQltYXRjaCA9ICgoYWRkcltpXSBeIGltYXBbaV0pICYgbWFzaykgPT0gMDsKLQkJCX0KLQkJCWZvciAoOyBpIDwgKGFkZHJzaXplICsgaW50c2l6ZSkgJiYgbWF0Y2g7ICsraSkgewotCQkJCXUzMiBtYXNrID0gaW1hc2sgPyBpbWFza1tpXSA6IDB4ZmZmZmZmZmZ1OwotCQkJCW1hdGNoID0KLQkJCQkgICAoKGludHNwZWNbaS1hZGRyc2l6ZV0gXiBpbWFwW2ldKSAmIG1hc2spID09IDA7Ci0JCQl9Ci0JCQlpbWFwICs9IGFkZHJzaXplICsgaW50c2l6ZTsKLQkJCWltYXBsZW4gLT0gYWRkcnNpemUgKyBpbnRzaXplOwotCi0JCQlEQkcoIiAtPiBtYXRjaD0lZCAoaW1hcGxlbj0lZClcbiIsIG1hdGNoLCBpbWFwbGVuKTsKLQotCQkJLyogR2V0IHRoZSBpbnRlcnJ1cHQgcGFyZW50ICovCi0JCQlpZiAob2ZfaXJxX3dvcmthcm91bmRzICYgT0ZfSU1BUF9OT19QSEFORExFKQotCQkJCW5ld3BhciA9IG9mX25vZGVfZ2V0KG9mX2lycV9kZmx0X3BpYyk7Ci0JCQllbHNlCi0JCQkJbmV3cGFyID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKHBoYW5kbGUpKmltYXApOwotCQkJaW1hcCsrOwotCQkJLS1pbWFwbGVuOwotCi0JCQkvKiBDaGVjayBpZiBub3QgZm91bmQgKi8KLQkJCWlmIChuZXdwYXIgPT0gTlVMTCkgewotCQkJCURCRygiIC0+IGltYXAgcGFyZW50IG5vdCBmb3VuZCAhXG4iKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0KLQkJCS8qIEdldCAjaW50ZXJydXB0LWNlbGxzIGFuZCAjYWRkcmVzcy1jZWxscyBvZiBuZXcKLQkJCSAqIHBhcmVudAotCQkJICovCi0JCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkobmV3cGFyLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOwotCQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCQkJREJHKCIgLT4gcGFyZW50IGxhY2tzICNpbnRlcnJ1cHQtY2VsbHMgIVxuIik7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJbmV3aW50c2l6ZSA9ICp0bXA7Ci0JCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkobmV3cGFyLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKLQkJCW5ld2FkZHJzaXplID0gKHRtcCA9PSBOVUxMKSA/IDAgOiAqdG1wOwotCi0JCQlEQkcoIiAtPiBuZXdpbnRzaXplPSVkLCBuZXdhZGRyc2l6ZT0lZFxuIiwKLQkJCSAgICBuZXdpbnRzaXplLCBuZXdhZGRyc2l6ZSk7Ci0KLQkJCS8qIENoZWNrIGZvciBtYWxmb3JtZWQgcHJvcGVydGllcyAqLwotCQkJaWYgKGltYXBsZW4gPCAobmV3YWRkcnNpemUgKyBuZXdpbnRzaXplKSkKLQkJCQlnb3RvIGZhaWw7Ci0KLQkJCWltYXAgKz0gbmV3YWRkcnNpemUgKyBuZXdpbnRzaXplOwotCQkJaW1hcGxlbiAtPSBuZXdhZGRyc2l6ZSArIG5ld2ludHNpemU7Ci0KLQkJCURCRygiIC0+IGltYXBsZW49JWRcbiIsIGltYXBsZW4pOwotCQl9Ci0JCWlmICghbWF0Y2gpCi0JCQlnb3RvIGZhaWw7Ci0KLQkJb2Zfbm9kZV9wdXQob2xkKTsKLQkJb2xkID0gb2Zfbm9kZV9nZXQobmV3cGFyKTsKLQkJYWRkcnNpemUgPSBuZXdhZGRyc2l6ZTsKLQkJaW50c2l6ZSA9IG5ld2ludHNpemU7Ci0JCWludHNwZWMgPSBpbWFwIC0gaW50c2l6ZTsKLQkJYWRkciA9IGludHNwZWMgLSBhZGRyc2l6ZTsKLQotCXNraXBsZXZlbDoKLQkJLyogSXRlcmF0ZSBhZ2FpbiB3aXRoIG5ldyBwYXJlbnQgKi8KLQkJREJHKCIgLT4gbmV3IHBhcmVudDogJXNcbiIsIG5ld3BhciA/IG5ld3Bhci0+ZnVsbF9uYW1lIDogIjw+Iik7Ci0JCW9mX25vZGVfcHV0KGlwYXIpOwotCQlpcGFyID0gbmV3cGFyOwotCQluZXdwYXIgPSBOVUxMOwotCX0KLSBmYWlsOgotCW9mX25vZGVfcHV0KGlwYXIpOwotCW9mX25vZGVfcHV0KG9sZCk7Ci0Jb2Zfbm9kZV9wdXQobmV3cGFyKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfaXJxX21hcF9yYXcpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKQotc3RhdGljIGludCBvZl9pcnFfbWFwX29sZHdvcmxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBpbnQgaW5kZXgsCi0JCQkgICAgICAgc3RydWN0IG9mX2lycSAqb3V0X2lycSkKLXsKLQljb25zdCB1MzIgKmludHMgPSBOVUxMOwotCWludCBpbnRsZW47Ci0KLQkvKgotCSAqIE9sZCBtYWNoaW5lcyBqdXN0IGhhdmUgYSBsaXN0IG9mIGludGVycnVwdCBudW1iZXJzCi0JICogYW5kIG5vIGludGVycnVwdC1jb250cm9sbGVyIG5vZGVzLiBXZSBhbHNvIGhhdmUgZG9kZ3kKLQkgKiBjYXNlcyB3aGVyZSB0aGUgQVBQTCxpbnRlcnJ1cHRzIHByb3BlcnR5IGlzIGNvbXBsZXRlbHkKLQkgKiBtaXNzaW5nIGJlaGluZCBwY2ktcGNpIGJyaWRnZXMgYW5kIHdlIGhhdmUgdG8gZ2V0IGl0Ci0JICogZnJvbSB0aGUgcGFyZW50ICh0aGUgYnJpZGdlIGl0c2VsZiwgYXMgYXBwbGUganVzdCB3aXJlZAotCSAqIGV2ZXJ5dGhpbmcgdG9nZXRoZXIgb24gdGhlc2UpCi0JICovCi0Jd2hpbGUgKGRldmljZSkgewotCQlpbnRzID0gb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgIkFBUEwsaW50ZXJydXB0cyIsICZpbnRsZW4pOwotCQlpZiAoaW50cyAhPSBOVUxMKQotCQkJYnJlYWs7Ci0JCWRldmljZSA9IGRldmljZS0+cGFyZW50OwotCQlpZiAoZGV2aWNlICYmIHN0cmNtcChkZXZpY2UtPnR5cGUsICJwY2kiKSAhPSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpbnRzID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCWludGxlbiAvPSBzaXplb2YodTMyKTsKLQotCWlmIChpbmRleCA+PSBpbnRsZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb3V0X2lycS0+Y29udHJvbGxlciA9IE5VTEw7Ci0Jb3V0X2lycS0+c3BlY2lmaWVyWzBdID0gaW50c1tpbmRleF07Ci0Jb3V0X2lycS0+c2l6ZSA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlIC8qIGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikgKi8KLXN0YXRpYyBpbnQgb2ZfaXJxX21hcF9vbGR3b3JsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4LAotCQkJICAgICAgIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0jZW5kaWYgLyogIShkZWZpbmVkKENPTkZJR19QUENfUE1BQykgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpKSAqLwotCi1pbnQgb2ZfaXJxX21hcF9vbmUoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCwgc3RydWN0IG9mX2lycSAqb3V0X2lycSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnA7Ci0JY29uc3QgdTMyICppbnRzcGVjLCAqdG1wLCAqYWRkcjsKLQl1MzIgaW50c2l6ZSwgaW50bGVuOwotCWludCByZXMgPSAtRUlOVkFMOwotCi0JREJHKCJvZl9pcnFfbWFwX29uZTogZGV2PSVzLCBpbmRleD0lZFxuIiwgZGV2aWNlLT5mdWxsX25hbWUsIGluZGV4KTsKLQotCS8qIE9sZFdvcmxkIG1hYyBzdHVmZiBpcyAic3BlY2lhbCIsIGhhbmRsZSBvdXQgb2YgbGluZSAqLwotCWlmIChvZl9pcnFfd29ya2Fyb3VuZHMgJiBPRl9JTUFQX09MRFdPUkxEX01BQykKLQkJcmV0dXJuIG9mX2lycV9tYXBfb2xkd29ybGQoZGV2aWNlLCBpbmRleCwgb3V0X2lycSk7Ci0KLQkvKiBHZXQgdGhlIGludGVycnVwdHMgcHJvcGVydHkgKi8KLQlpbnRzcGVjID0gb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgImludGVycnVwdHMiLCAmaW50bGVuKTsKLQlpZiAoaW50c3BlYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpbnRsZW4gLz0gc2l6ZW9mKHUzMik7Ci0KLQkvKiBHZXQgdGhlIHJlZyBwcm9wZXJ0eSAoaWYgYW55KSAqLwotCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAicmVnIiwgTlVMTCk7Ci0KLQkvKiBMb29rIGZvciB0aGUgaW50ZXJydXB0IHBhcmVudC4gKi8KLQlwID0gb2ZfaXJxX2ZpbmRfcGFyZW50KGRldmljZSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBHZXQgc2l6ZSBvZiBpbnRlcnJ1cHQgc3BlY2lmaWVyICovCi0JdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KHAsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQlpbnRzaXplID0gKnRtcDsKLQotCURCRygiIGludHNpemU9JWQgaW50bGVuPSVkXG4iLCBpbnRzaXplLCBpbnRsZW4pOwotCi0JLyogQ2hlY2sgaW5kZXggKi8KLQlpZiAoKGluZGV4ICsgMSkgKiBpbnRzaXplID4gaW50bGVuKQotCQlnb3RvIG91dDsKLQotCS8qIEdldCBuZXcgc3BlY2lmaWVyIGFuZCBtYXAgaXQgKi8KLQlyZXMgPSBvZl9pcnFfbWFwX3JhdyhwLCBpbnRzcGVjICsgaW5kZXggKiBpbnRzaXplLCBpbnRzaXplLAotCQkJICAgICBhZGRyLCBvdXRfaXJxKTsKLW91dDoKLQlvZl9ub2RlX3B1dChwKTsKLQlyZXR1cm4gcmVzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfaXJxX21hcF9vbmUpOwotCiAvKioKICAqIFNlYXJjaCB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBiZXN0IE1BQyBhZGRyZXNzIHRvIHVzZS4gICdtYWMtYWRkcmVzcycgaXMKICAqIGNoZWNrZWQgZmlyc3QsIGJlY2F1c2UgdGhhdCBpcyBzdXBwb3NlZCB0byBjb250YWluIHRvICJtb3N0IHJlY2VudCIgTUFDCkBAIC0xMDUxLDI5ICsxNTUsMyBAQAogCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRfbWFjX2FkZHJlc3MpOwotCi1pbnQgb2ZfaXJxX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsIHN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQlpbnQgaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LCBpbmRleCk7Ci0KLQkvKiBPbmx5IGRlcmVmZXJlbmNlIHRoZSByZXNvdXJjZSBpZiBib3RoIHRoZQotCSAqIHJlc291cmNlIGFuZCB0aGUgaXJxIGFyZSB2YWxpZC4gKi8KLQlpZiAociAmJiBpcnEgIT0gTk9fSVJRKSB7Ci0JCXItPnN0YXJ0ID0gci0+ZW5kID0gaXJxOwotCQlyLT5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwotCX0KLQotCXJldHVybiBpcnE7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9pcnFfdG9fcmVzb3VyY2UpOwotCi12b2lkIF9faW9tZW0gKm9mX2lvbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGluZGV4LCAmcmVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gaW9yZW1hcChyZXMuc3RhcnQsIDEgKyByZXMuZW5kIC0gcmVzLnN0YXJ0KTsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfaW9tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggN2EwYzAxOTkuLjExZjNjZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwpAQCAtMzIsNiArMzIsOCBAQAogI2lmZGVmIENPTkZJR19QUEMzMgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaHdfYnJlYWtwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTg2Niw5ICs4NjgsMzQgQEAKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwogfQogCisjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAordm9pZCBwdHJhY2VfdHJpZ2dlcmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgaW50IG5taSwKKwkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKKworCS8qCisJICogRGlzYWJsZSB0aGUgYnJlYWtwb2ludCByZXF1ZXN0IGhlcmUgc2luY2UgcHRyYWNlIGhhcyBkZWZpbmVkIGEKKwkgKiBvbmUtc2hvdCBiZWhhdmlvdXIgZm9yIGJyZWFrcG9pbnQgZXhjZXB0aW9ucyBpbiBQUEM2NC4KKwkgKiBUaGUgU0lHVFJBUCBzaWduYWwgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZm9yIHVzIGluIGRvX2RhYnIoKS4KKwkgKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGFib3V0IHRoYXQgaGVyZQorCSAqLworCWF0dHIgPSBicC0+YXR0cjsKKwlhdHRyLmRpc2FibGVkID0gdHJ1ZTsKKwltb2RpZnlfdXNlcl9od19icmVha3BvaW50KGJwLCAmYXR0cik7Cit9CisjZW5kaWYgLyogQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCAqLworCiBpbnQgcHRyYWNlX3NldF9kZWJ1Z3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCiB7CisjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAorCWludCByZXQ7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICYodGFzay0+dGhyZWFkKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqYnA7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOworI2VuZGlmIC8qIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQgKi8KKwogCS8qIEZvciBwcGM2NCB3ZSBzdXBwb3J0IG9uZSBEQUJSIGFuZCBubyBJQUJSJ3MgYXQgdGhlIG1vbWVudCAocHBjNjQpLgogCSAqICBGb3IgZW1iZWRkZWQgcHJvY2Vzc29ycyB3ZSBzdXBwb3J0IG9uZSBEQUMgYW5kIG5vIElBQydzIGF0IHRoZQogCSAqICBtb21lbnQuCkBAIC04OTYsNiArOTIzLDQzIEBACiAJLyogRW5zdXJlIGJyZWFrcG9pbnQgdHJhbnNsYXRpb24gYml0IGlzIHNldCAqLwogCWlmIChkYXRhICYmICEoZGF0YSAmIERBQlJfVFJBTlNMQVRJT04pKQogCQlyZXR1cm4gLUVJTzsKKyNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCisJYnAgPSB0aHJlYWQtPnB0cmFjZV9icHNbMF07CisJaWYgKCghZGF0YSkgfHwgIShkYXRhICYgKERBQlJfREFUQV9XUklURSB8IERBQlJfREFUQV9SRUFEKSkpIHsKKwkJaWYgKGJwKSB7CisJCQl1bnJlZ2lzdGVyX2h3X2JyZWFrcG9pbnQoYnApOworCQkJdGhyZWFkLT5wdHJhY2VfYnBzWzBdID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGJwKSB7CisJCWF0dHIgPSBicC0+YXR0cjsKKwkJYXR0ci5icF9hZGRyID0gZGF0YSAmIH5IV19CUkVBS1BPSU5UX0FMSUdOOworCQlhcmNoX2JwX2dlbmVyaWNfZmllbGRzKGRhdGEgJgorCQkJCQkoREFCUl9EQVRBX1dSSVRFIHwgREFCUl9EQVRBX1JFQUQpLAorCQkJCQkJCSZhdHRyLmJwX3R5cGUpOworCQlyZXQgPSAgbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChicCwgJmF0dHIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJdGhyZWFkLT5wdHJhY2VfYnBzWzBdID0gYnA7CisJCXRocmVhZC0+ZGFiciA9IGRhdGE7CisJCXJldHVybiAwOworCX0KKworCS8qIENyZWF0ZSBhIG5ldyBicmVha3BvaW50IHJlcXVlc3QgaWYgb25lIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeSAqLworCWh3X2JyZWFrcG9pbnRfaW5pdCgmYXR0cik7CisJYXR0ci5icF9hZGRyID0gZGF0YSAmIH5IV19CUkVBS1BPSU5UX0FMSUdOOworCWFyY2hfYnBfZ2VuZXJpY19maWVsZHMoZGF0YSAmIChEQUJSX0RBVEFfV1JJVEUgfCBEQUJSX0RBVEFfUkVBRCksCisJCQkJCQkJCSZhdHRyLmJwX3R5cGUpOworCisJdGhyZWFkLT5wdHJhY2VfYnBzWzBdID0gYnAgPSByZWdpc3Rlcl91c2VyX2h3X2JyZWFrcG9pbnQoJmF0dHIsCisJCQkJCQkJcHRyYWNlX3RyaWdnZXJlZCwgdGFzayk7CisJaWYgKElTX0VSUihicCkpIHsKKwkJdGhyZWFkLT5wdHJhY2VfYnBzWzBdID0gTlVMTDsKKwkJcmV0dXJuIFBUUl9FUlIoYnApOworCX0KKworI2VuZGlmIC8qIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQgKi8KIAogCS8qIE1vdmUgY29udGVudHMgdG8gdGhlIERBQlIgcmVnaXN0ZXIgKi8KIAl0YXNrLT50aHJlYWQuZGFiciA9IGRhdGE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCmluZGV4IGQwNTE2ZGIuLjQxMDQ4ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCkBAIC00NywxNCArNDcsNiBAQAogfTsKIEVYUE9SVF9TWU1CT0wocnRhcyk7CiAKLXN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSB7Ci0JYXRvbWljX3Qgd29ya2luZzsgLyogbnVtYmVyIG9mIGNwdXMgYWNjZXNzaW5nIHRoaXMgc3RydWN0ICovCi0JYXRvbWljX3QgZG9uZTsKLQlpbnQgdG9rZW47IC8qIGlibSxzdXNwZW5kLW1lICovCi0JaW50IGVycm9yOwotCXN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0ZTsgLyogd2FpdCBvbiB0aGlzIHVudGlsIHdvcmtpbmcgPT0gMCAqLwotfTsKLQogREVGSU5FX1NQSU5MT0NLKHJ0YXNfZGF0YV9idWZfbG9jayk7CiBFWFBPUlRfU1lNQk9MKHJ0YXNfZGF0YV9idWZfbG9jayk7CiAKQEAgLTcxNCwxNCArNzA2LDUzIEBACiAKIHN0YXRpYyBpbnQgaWJtX3N1c3BlbmRfbWVfdG9rZW4gPSBSVEFTX1VOS05PV05fU0VSVklDRTsKICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKLXN0YXRpYyB2b2lkIHJ0YXNfcGVyY3B1X3N1c3BlbmRfbWUodm9pZCAqaW5mbykKK3N0YXRpYyBpbnQgX19ydGFzX3N1c3BlbmRfbGFzdF9jcHUoc3RydWN0IHJ0YXNfc3VzcGVuZF9tZV9kYXRhICpkYXRhLCBpbnQgd2FrZV93aGVuX2RvbmUpCit7CisJdTE2IHNsYl9zaXplID0gbW11X3NsYl9zaXplOworCWludCByYyA9IEhfTVVMVElfVEhSRUFEU19BQ1RJVkU7CisJaW50IGNwdTsKKworCXNsYl9zZXRfc2l6ZShTTEJfTUlOX1NJWkUpOworCXByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nIGlibSxzdXNwZW5kLW1lIG9uIGNwdSAlaVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCXdoaWxlIChyYyA9PSBIX01VTFRJX1RIUkVBRFNfQUNUSVZFICYmICFhdG9taWNfcmVhZCgmZGF0YS0+ZG9uZSkgJiYKKwkgICAgICAgIWF0b21pY19yZWFkKCZkYXRhLT5lcnJvcikpCisJCXJjID0gcnRhc19jYWxsKGRhdGEtPnRva2VuLCAwLCAxLCBOVUxMKTsKKworCWlmIChyYyB8fCBhdG9taWNfcmVhZCgmZGF0YS0+ZXJyb3IpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpYm0sc3VzcGVuZC1tZSByZXR1cm5lZCAlZFxuIiwgcmMpOworCQlzbGJfc2V0X3NpemUoc2xiX3NpemUpOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmZGF0YS0+ZXJyb3IpKQorCQlyYyA9IGF0b21pY19yZWFkKCZkYXRhLT5lcnJvcik7CisKKwlhdG9taWNfc2V0KCZkYXRhLT5lcnJvciwgcmMpOworCisJaWYgKHdha2Vfd2hlbl9kb25lKSB7CisJCWF0b21pY19zZXQoJmRhdGEtPmRvbmUsIDEpOworCisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQkJcGxwYXJfaGNhbGxfbm9yZXRzKEhfUFJPRCwgZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpKTsKKwl9CisKKwlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmRhdGEtPndvcmtpbmcpID09IDApCisJCWNvbXBsZXRlKGRhdGEtPmNvbXBsZXRlKTsKKworCXJldHVybiByYzsKK30KKworaW50IHJ0YXNfc3VzcGVuZF9sYXN0X2NwdShzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgKmRhdGEpCit7CisJYXRvbWljX2luYygmZGF0YS0+d29ya2luZyk7CisJcmV0dXJuIF9fcnRhc19zdXNwZW5kX2xhc3RfY3B1KGRhdGEsIDApOworfQorCitzdGF0aWMgaW50IF9fcnRhc19zdXNwZW5kX2NwdShzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgKmRhdGEsIGludCB3YWtlX3doZW5fZG9uZSkKIHsKIAlsb25nIHJjID0gSF9TVUNDRVNTOwogCXVuc2lnbmVkIGxvbmcgbXNyX3NhdmU7Ci0JdTE2IHNsYl9zaXplID0gbW11X3NsYl9zaXplOwogCWludCBjcHU7Ci0Jc3RydWN0IHJ0YXNfc3VzcGVuZF9tZV9kYXRhICpkYXRhID0KLQkJKHN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSAqKWluZm87CiAKIAlhdG9taWNfaW5jKCZkYXRhLT53b3JraW5nKTsKIApAQCAtNzI5LDcgKzc2MCw3IEBACiAJbXNyX3NhdmUgPSBtZm1zcigpOwogCW10bXNyKG1zcl9zYXZlICYgfihNU1JfRUUpKTsKIAotCXdoaWxlIChyYyA9PSBIX1NVQ0NFU1MgJiYgIWF0b21pY19yZWFkKCZkYXRhLT5kb25lKSkKKwl3aGlsZSAocmMgPT0gSF9TVUNDRVNTICYmICFhdG9taWNfcmVhZCgmZGF0YS0+ZG9uZSkgJiYgIWF0b21pY19yZWFkKCZkYXRhLT5lcnJvcikpCiAJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfSk9JTik7CiAKIAltdG1zcihtc3Jfc2F2ZSk7CkBAIC03NDEsMzMgKzc3MiwzNyBAQAogCQkvKiBBbGwgb3RoZXIgY3B1cyBhcmUgaW4gSF9KT0lOLCB0aGlzIGNwdSBkb2VzCiAJCSAqIHRoZSBzdXNwZW5kLgogCQkgKi8KLQkJc2xiX3NldF9zaXplKFNMQl9NSU5fU0laRSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nIGlibSxzdXNwZW5kLW1lIG9uIGNwdSAlaVxuIiwKLQkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCWRhdGEtPmVycm9yID0gcnRhc19jYWxsKGRhdGEtPnRva2VuLCAwLCAxLCBOVUxMKTsKLQotCQlpZiAoZGF0YS0+ZXJyb3IpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJpYm0sc3VzcGVuZC1tZSByZXR1cm5lZCAlZFxuIiwKLQkJCSAgICAgICBkYXRhLT5lcnJvcik7Ci0JCQlzbGJfc2V0X3NpemUoc2xiX3NpemUpOwotCQl9CisJCXJldHVybiBfX3J0YXNfc3VzcGVuZF9sYXN0X2NwdShkYXRhLCB3YWtlX3doZW5fZG9uZSk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJIX0pPSU4gb24gY3B1ICVpIGZhaWxlZCB3aXRoIHJjID0gJWxkXG4iLAogCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCByYyk7Ci0JCWRhdGEtPmVycm9yID0gcmM7CisJCWF0b21pY19zZXQoJmRhdGEtPmVycm9yLCByYyk7CiAJfQogCi0JYXRvbWljX3NldCgmZGF0YS0+ZG9uZSwgMSk7CisJaWYgKHdha2Vfd2hlbl9kb25lKSB7CisJCWF0b21pY19zZXQoJmRhdGEtPmRvbmUsIDEpOwogCi0JLyogVGhpcyBjcHUgZGlkIHRoZSBzdXNwZW5kIG9yIGdvdCBhbiBlcnJvcjsgaW4gZWl0aGVyIGNhc2UsCi0JICogd2UgbmVlZCB0byBwcm9kIGFsbCBvdGhlciBvdGhlciBjcHVzIG91dCBvZiBqb2luIHN0YXRlLgotCSAqIEV4dHJhIHByb2RzIGFyZSBoYXJtbGVzcy4KLQkgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJcGxwYXJfaGNhbGxfbm9yZXRzKEhfUFJPRCwgZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpKTsKKwkJLyogVGhpcyBjcHUgZGlkIHRoZSBzdXNwZW5kIG9yIGdvdCBhbiBlcnJvcjsgaW4gZWl0aGVyIGNhc2UsCisJCSAqIHdlIG5lZWQgdG8gcHJvZCBhbGwgb3RoZXIgb3RoZXIgY3B1cyBvdXQgb2Ygam9pbiBzdGF0ZS4KKwkJICogRXh0cmEgcHJvZHMgYXJlIGhhcm1sZXNzLgorCQkgKi8KKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCQlwbHBhcl9oY2FsbF9ub3JldHMoSF9QUk9ELCBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSkpOworCX0KIG91dDoKIAlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmRhdGEtPndvcmtpbmcpID09IDApCiAJCWNvbXBsZXRlKGRhdGEtPmNvbXBsZXRlKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBydGFzX3N1c3BlbmRfY3B1KHN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gX19ydGFzX3N1c3BlbmRfY3B1KGRhdGEsIDApOworfQorCitzdGF0aWMgdm9pZCBydGFzX3BlcmNwdV9zdXNwZW5kX21lKHZvaWQgKmluZm8pCit7CisJX19ydGFzX3N1c3BlbmRfY3B1KChzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgKilpbmZvLCAxKTsKIH0KIAogc3RhdGljIGludCBydGFzX2libV9zdXNwZW5kX21lKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MpCkBAIC04MDIsMjIgKzgzNywyMiBAQAogCiAJYXRvbWljX3NldCgmZGF0YS53b3JraW5nLCAwKTsKIAlhdG9taWNfc2V0KCZkYXRhLmRvbmUsIDApOworCWF0b21pY19zZXQoJmRhdGEuZXJyb3IsIDApOwogCWRhdGEudG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sc3VzcGVuZC1tZSIpOwotCWRhdGEuZXJyb3IgPSAwOwogCWRhdGEuY29tcGxldGUgPSAmZG9uZTsKIAogCS8qIENhbGwgZnVuY3Rpb24gb24gYWxsIENQVXMuICBPbmUgb2YgdXMgd2lsbCBtYWtlIHRoZQogCSAqIHJ0YXMgY2FsbAogCSAqLwogCWlmIChvbl9lYWNoX2NwdShydGFzX3BlcmNwdV9zdXNwZW5kX21lLCAmZGF0YSwgMCkpCi0JCWRhdGEuZXJyb3IgPSAtRUlOVkFMOworCQlhdG9taWNfc2V0KCZkYXRhLmVycm9yLCAtRUlOVkFMKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOwogCi0JaWYgKGRhdGEuZXJyb3IgIT0gMCkKKwlpZiAoYXRvbWljX3JlYWQoJmRhdGEuZXJyb3IpICE9IDApCiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgZG9pbmcgZ2xvYmFsIGpvaW5cbiIpOwogCi0JcmV0dXJuIGRhdGEuZXJyb3I7CisJcmV0dXJuIGF0b21pY19yZWFkKCZkYXRhLmVycm9yKTsKIH0KICNlbHNlIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogc3RhdGljIGludCBydGFzX2libV9zdXNwZW5kX21lKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCBiN2U2YzdlLi4xNWFkZTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTk0LDYgKzk0LDEwIEBACiAJLm9yaWdfdmlkZW9fcG9pbnRzID0gMTYKIH07CiAKKy8qIFZhcmlhYmxlcyByZXF1aXJlZCB0byBzdG9yZSBsZWdhY3kgSU8gaXJxIHJvdXRpbmcgKi8KK2ludCBvZl9pODA0Ml9rYmRfaXJxOworaW50IG9mX2k4MDQyX2F1eF9pcnE7CisKICNpZmRlZiBfX0RPX0lSUV9DQU5PTgogLyogWFhYIHNob3VsZCBnbyBlbHNld2hlcmUgZXZlbnR1YWxseSAqLwogaW50IHBwY19kb19jYW5vbmljYWxpemVfaXJxczsKQEAgLTU3NSw2ICs1NzksMTUgQEAKIAkJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgInBucFBOUCxmMDMiKTsKIAkJaWYgKG5wKSB7CiAJCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKKworCQkJb2ZfaTgwNDJfa2JkX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBhcmVudCwgMCk7CisJCQlpZiAoIW9mX2k4MDQyX2tiZF9pcnEpCisJCQkJb2ZfaTgwNDJfa2JkX2lycSA9IDE7CisKKwkJCW9mX2k4MDQyX2F1eF9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwYXJlbnQsIDEpOworCQkJaWYgKCFvZl9pODA0Ml9hdXhfaXJxKQorCQkJCW9mX2k4MDQyX2F1eF9pcnEgPSAxMjsKKwogCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJbnAgPSBwYXJlbnQ7CiAJCQlicmVhazsKQEAgLTcwMSwxNiArNzE0LDkgQEAKIAkucHJpb3JpdHkgPSBJTlRfTUFYLAogfTsKIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcGNfZGZsdF9vZl9idXNfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwcGNfZGZsdF9idXNfbm90aWZ5LAotCS5wcmlvcml0eSA9IElOVF9NQVgsCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9idXNfbm90aWZpZXIodm9pZCkKIHsKIAlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcHBjX2RmbHRfcGxhdF9idXNfbm90aWZpZXIpOwotCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICZwcGNfZGZsdF9vZl9idXNfbm90aWZpZXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCBkMTM1ZjkzLi4xYmVlNGI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0xNDIsMTYgKzE0Miw2IEBACiAjZGVmaW5lIGNoZWNrX3NtdF9lbmFibGVkKCkKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLS8qIFB1dCB0aGUgcGFjYSBwb2ludGVyIGludG8gcjEzIGFuZCBTUFJHX1BBQ0EgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9wYWNhKHN0cnVjdCBwYWNhX3N0cnVjdCAqbmV3X3BhY2EpCi17Ci0JbG9jYWxfcGFjYSA9IG5ld19wYWNhOwotCW10c3ByKFNQUk5fU1BSR19QQUNBLCBsb2NhbF9wYWNhKTsKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQotCW10c3ByKFNQUk5fU1BSR19UTEJfRVhGUkFNRSwgbG9jYWxfcGFjYS0+ZXh0bGIpOwotI2VuZGlmCi19Ci0KIC8qCiAgKiBFYXJseSBpbml0aWFsaXphdGlvbiBlbnRyeSBwb2ludC4gVGhpcyBpcyBjYWxsZWQgYnkgaGVhZC5TCiAgKiB3aXRoIE1NVSB0cmFuc2xhdGlvbiBkaXNhYmxlZC4gV2UgcmVseSBvbiB0aGUgImZlYXR1cmUiIG9mCkBAIC02MDAsNiArNTkwLDkgQEAKIAkJcmV0dXJuIFJFTU9URV9ESVNUQU5DRTsKIH0KIAordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfb2Zmc2V0W05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9vZmZzZXQpOworCiB2b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpCiB7CiAJY29uc3Qgc2l6ZV90IGR5bl9zaXplID0gUEVSQ1BVX01PRFVMRV9SRVNFUlZFICsgUEVSQ1BVX0RZTkFNSUNfUkVTRVJWRTsKQEAgLTYyNCw4ICs2MTcsMTAgQEAKIAkJcGFuaWMoImNhbm5vdCBpbml0aWFsaXplIHBlcmNwdSBhcmVhIChlcnI9JWQpIiwgcmMpOwogCiAJZGVsdGEgPSAodW5zaWduZWQgbG9uZylwY3B1X2Jhc2VfYWRkciAtICh1bnNpZ25lZCBsb25nKV9fcGVyX2NwdV9zdGFydDsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQotCQlwYWNhW2NwdV0uZGF0YV9vZmZzZXQgPSBkZWx0YSArIHBjcHVfdW5pdF9vZmZzZXRzW2NwdV07CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworICAgICAgICAgICAgICAgIF9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IGRlbHRhICsgcGNwdV91bml0X29mZnNldHNbY3B1XTsKKwkJcGFjYVtjcHVdLmRhdGFfb2Zmc2V0ID0gX19wZXJfY3B1X29mZnNldFtjcHVdOworCX0KIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuYwppbmRleCBhMGFmYjU1Li43MTA5ZjViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9od19icmVha3BvaW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKQEAgLTE0OSw2ICsxNTAsOCBAQAogCWlmIChjdXJyZW50LT50aHJlYWQuZGFicikKIAkJc2V0X2RhYnIoY3VycmVudC0+dGhyZWFkLmRhYnIpOwogI2VuZGlmCisJLyogUmUtZW5hYmxlIHRoZSBicmVha3BvaW50cyBmb3IgdGhlIHNpZ25hbCBzdGFjayAqLworCXRocmVhZF9jaGFuZ2VfcGMoY3VycmVudCwgcmVncyk7CiAKIAlpZiAoaXMzMikgewogICAgICAgICAJaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDg3NjRkYWEuLmE2MWIzZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtNDk5LDE0ICs0OTksNiBAQAogCWN1cnJlbnQtPmFjdGl2ZV9tbSA9ICZpbml0X21tOwogCiAJc21wX3N0b3JlX2NwdV9pbmZvKGNwdSk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19CT09LRSkgfHwgZGVmaW5lZChDT05GSUdfNDB4KQotCS8qIENsZWFyIGFueSBwZW5kaW5nIHRpbWVyIGludGVycnVwdHMgKi8KLQltdHNwcihTUFJOX1RTUiwgVFNSX0VOVyB8IFRTUl9XSVMgfCBUU1JfRElTIHwgVFNSX0ZJUyk7Ci0KLQkvKiBFbmFibGUgZGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCi0JbXRzcHIoU1BSTl9UQ1IsIFRDUl9ESUUpOwotI2VuZGlmCiAJc2V0X2RlYyh0Yl90aWNrc19wZXJfamlmZnkpOwogCXByZWVtcHRfZGlzYWJsZSgpOwogCWNwdV9jYWxsaW5fbWFwW2NwdV0gPSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N1c3BlbmQuYwppbmRleCA2ZmM2MzI4Li4wMTY3ZDUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N1c3BlbmQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N1c3BlbmQuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBEaXN0cmlidXRlIHVuZGVyIEdQTHYyCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIENvcHlyaWdodCAoYykgMjAwMSBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCAyNWZjMzM5Li5hNDVhNjNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC01NSw5ICs1NSw2IEBACiAjZW5kaWYKICNpbmNsdWRlIDxhc20va2V4ZWMuaD4KICNpbmNsdWRlIDxhc20vcHBjLW9wY29kZS5oPgotI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKLSNpbmNsdWRlIDxhc20vZGJlbGwuaD4KLSNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdHRVIpIHx8IGRlZmluZWQoQ09ORklHX0tFWEVDKQogaW50ICgqX19kZWJ1Z2dlcikoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIF9fcmVhZF9tb3N0bHk7CkBAIC02ODgsNyArNjg1LDcgQEAKIAogdm9pZCBfX2twcm9iZXMgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJlZ3MtPm1zciAmPSB+KE1TUl9TRSB8IE1TUl9CRSk7ICAvKiBUdXJuIG9mZiAndHJhY2UnIGJpdHMgKi8KKwljbGVhcl9zaW5nbGVfc3RlcChyZWdzKTsKIAogCWlmIChub3RpZnlfZGllKERJRV9TU1RFUCwgInNpbmdsZV9zdGVwIiwgcmVncywgNSwKIAkJCQkJNSwgU0lHVFJBUCkgPT0gTk9USUZZX1NUT1ApCkBAIC03MDcsMTAgKzcwNCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVtdWxhdGVfc2luZ2xlX3N0ZXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaWYgKHNpbmdsZV9zdGVwcGluZyhyZWdzKSkgewotCQljbGVhcl9zaW5nbGVfc3RlcChyZWdzKTsKLQkJX2V4Y2VwdGlvbihTSUdUUkFQLCByZWdzLCBUUkFQX1RSQUNFLCAwKTsKLQl9CisJaWYgKHNpbmdsZV9zdGVwcGluZyhyZWdzKSkKKwkJc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHJlZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX3BhcnNlX2Zwc2NyKHVuc2lnbmVkIGxvbmcgZnBzY3IpCkBAIC0xMzQ0LDI0ICsxMzM5LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfVlNYICovCiAKICNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCi0KLXZvaWQgZG9vcmJlbGxfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBtc2c7Ci0KLQlpZiAobnVtX29ubGluZV9jcHVzKCkgPCAyKQotCQlyZXR1cm47Ci0KLQlmb3IgKG1zZyA9IDA7IG1zZyA8IDQ7IG1zZysrKQotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KG1zZywgJmRiZWxsX3NtcF9tZXNzYWdlW2NwdV0pKQotCQkJc21wX21lc3NhZ2VfcmVjdihtc2cpOwotI2Vsc2UKLQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWNlaXZlZCBkb29yYmVsbCBvbiBub24tc21wIHN5c3RlbVxuIik7Ci0jZW5kaWYKLX0KLQogdm9pZCBDYWNoZUxvY2tpbmdFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJCSAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vNDR4X3RsYi5jIGIvYXJjaC9wb3dlcnBjL2t2bS80NHhfdGxiLmMKaW5kZXggODEyMzEyNS4uOWI5YjVjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS80NHhfdGxiLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS80NHhfdGxiLmMKQEAgLTMxNiw3ICszMTYsOCBAQAogCWdmbiA9IGdwYWRkciA+PiBQQUdFX1NISUZUOwogCW5ld19wYWdlID0gZ2ZuX3RvX3BhZ2UodmNwdS0+a3ZtLCBnZm4pOwogCWlmIChpc19lcnJvcl9wYWdlKG5ld19wYWdlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGdldCBndWVzdCBwYWdlIGZvciBnZm4gJWx4IVxuIiwgZ2ZuKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBnZXQgZ3Vlc3QgcGFnZSBmb3IgZ2ZuICVsbHghXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylnZm4pOwogCQlrdm1fcmVsZWFzZV9wYWdlX2NsZWFuKG5ld19wYWdlKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCmluZGV4IGZmNDM2MDYuLmQ0NWM4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQpAQCAtNDUsNiArNDUsNyBAQAogCWJvb2szcy5vIFwKIAlib29rM3NfZW11bGF0ZS5vIFwKIAlib29rM3NfaW50ZXJydXB0cy5vIFwKKwlib29rM3NfbW11X2hwdGUubyBcCiAJYm9vazNzXzY0X21tdV9ob3N0Lm8gXAogCWJvb2szc182NF9tbXUubyBcCiAJYm9vazNzXzMyX21tdS5vCkBAIC01Nyw2ICs1OCw3IEBACiAJYm9vazNzLm8gXAogCWJvb2szc19lbXVsYXRlLm8gXAogCWJvb2szc19pbnRlcnJ1cHRzLm8gXAorCWJvb2szc19tbXVfaHB0ZS5vIFwKIAlib29rM3NfMzJfbW11X2hvc3QubyBcCiAJYm9vazNzXzMyX21tdS5vCiBrdm0tb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzMyKSA6PSAkKGt2bS1ib29rM3NfMzItb2JqcykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCmluZGV4IGI5OThhYmYuLmEzY2VmMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwpAQCAtMTA0Nyw4ICsxMDQ3LDYgQEAKIHsKIAlpbnQgaTsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogCXJlZ3MtPnBjID0ga3ZtcHBjX2dldF9wYyh2Y3B1KTsKIAlyZWdzLT5jciA9IGt2bXBwY19nZXRfY3IodmNwdSk7CiAJcmVncy0+Y3RyID0ga3ZtcHBjX2dldF9jdHIodmNwdSk7CkBAIC0xMDY5LDggKzEwNjcsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3MtPmdwcik7IGkrKykKIAkJcmVncy0+Z3ByW2ldID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgaSk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDc4LDggKzEwNzQsNiBAQAogewogCWludCBpOwogCi0JdmNwdV9sb2FkKHZjcHUpOwotCiAJa3ZtcHBjX3NldF9wYyh2Y3B1LCByZWdzLT5wYyk7CiAJa3ZtcHBjX3NldF9jcih2Y3B1LCByZWdzLT5jcik7CiAJa3ZtcHBjX3NldF9jdHIodmNwdSwgcmVncy0+Y3RyKTsKQEAgLTEwOTksOCArMTA5Myw2IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVncy0+Z3ByKTsgaSsrKQogCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCBpLCByZWdzLT5ncHJbaV0pOwogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExMCw4ICsxMTAyLDYgQEAKIAlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CiAJaW50IGk7CiAKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlzcmVncy0+cHZyID0gdmNwdS0+YXJjaC5wdnI7CiAKIAlzcmVncy0+dS5zLnNkcjEgPSB0b19ib29rM3ModmNwdSktPnNkcjE7CkBAIC0xMTMxLDggKzExMjEsNiBAQAogCQl9CiAJfQogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE0Miw4ICsxMTMwLDYgQEAKIAlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CiAJaW50IGk7CiAKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlrdm1wcGNfc2V0X3B2cih2Y3B1LCBzcmVncy0+cHZyKTsKIAogCXZjcHUzcy0+c2RyMSA9IHNyZWdzLT51LnMuc2RyMTsKQEAgLTExNzEsOCArMTE1Nyw2IEBACiAJLyogRmx1c2ggdGhlIE1NVSBhZnRlciBtZXNzaW5nIHdpdGggdGhlIHNlZ21lbnRzICovCiAJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMzA5LDEyICsxMjkzLDE3IEBACiBpbnQgX19rdm1wcGNfdmNwdV9ydW4oc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCB0aHJlYWRfc3RydWN0IGV4dF9ia3A7CisJZG91YmxlIGZwclszMl1bVFNfRlBSV0lEVEhdOworCXVuc2lnbmVkIGludCBmcHNjcjsKKwlpbnQgZnBleGNfbW9kZTsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwotCWJvb2wgc2F2ZV92ZWMgPSBjdXJyZW50LT50aHJlYWQudXNlZF92cjsKKwl2ZWN0b3IxMjggdnJbMzJdOworCXZlY3RvcjEyOCB2c2NyOworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIodnJzYXZlKTsKKwlpbnQgdXNlZF92cjsKICNlbmRpZgogI2lmZGVmIENPTkZJR19WU1gKLQlib29sIHNhdmVfdnN4ID0gY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyOworCWludCB1c2VkX3ZzcjsKICNlbmRpZgogCXVsb25nIGV4dF9tc3I7CiAKQEAgLTEzMjcsMjcgKzEzMTYsMjcgQEAKIAkvKiBTYXZlIEZQVSBzdGF0ZSBpbiBzdGFjayAqLwogCWlmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX0ZQKQogCQlnaXZldXBfZnB1KGN1cnJlbnQpOwotCW1lbWNweShleHRfYmtwLmZwciwgY3VycmVudC0+dGhyZWFkLmZwciwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC5mcHIpKTsKLQlleHRfYmtwLmZwc2NyID0gY3VycmVudC0+dGhyZWFkLmZwc2NyOwotCWV4dF9ia3AuZnBleGNfbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlOworCW1lbWNweShmcHIsIGN1cnJlbnQtPnRocmVhZC5mcHIsIHNpemVvZihjdXJyZW50LT50aHJlYWQuZnByKSk7CisJZnBzY3IgPSBjdXJyZW50LT50aHJlYWQuZnBzY3IudmFsOworCWZwZXhjX21vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBleGNfbW9kZTsKIAogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJLyogU2F2ZSBBbHRpdmVjIHN0YXRlIGluIHN0YWNrICovCi0JaWYgKHNhdmVfdmVjKSB7CisJdXNlZF92ciA9IGN1cnJlbnQtPnRocmVhZC51c2VkX3ZyOworCWlmICh1c2VkX3ZyKSB7CiAJCWlmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX1ZFQykKIAkJCWdpdmV1cF9hbHRpdmVjKGN1cnJlbnQpOwotCQltZW1jcHkoZXh0X2JrcC52ciwgY3VycmVudC0+dGhyZWFkLnZyLCBzaXplb2YoZXh0X2JrcC52cikpOwotCQlleHRfYmtwLnZzY3IgPSBjdXJyZW50LT50aHJlYWQudnNjcjsKLQkJZXh0X2JrcC52cnNhdmUgPSBjdXJyZW50LT50aHJlYWQudnJzYXZlOworCQltZW1jcHkodnIsIGN1cnJlbnQtPnRocmVhZC52ciwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC52cikpOworCQl2c2NyID0gY3VycmVudC0+dGhyZWFkLnZzY3I7CisJCXZyc2F2ZSA9IGN1cnJlbnQtPnRocmVhZC52cnNhdmU7CiAJfQotCWV4dF9ia3AudXNlZF92ciA9IGN1cnJlbnQtPnRocmVhZC51c2VkX3ZyOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVlNYCiAJLyogU2F2ZSBWU1ggc3RhdGUgaW4gc3RhY2sgKi8KLQlpZiAoc2F2ZV92c3ggJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVlNYKSkKKwl1c2VkX3ZzciA9IGN1cnJlbnQtPnRocmVhZC51c2VkX3ZzcjsKKwlpZiAodXNlZF92c3IgJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVlNYKSkKIAkJCV9fZ2l2ZXVwX3ZzeChjdXJyZW50KTsKLQlleHRfYmtwLnVzZWRfdnNyID0gY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyOwogI2VuZGlmCiAKIAkvKiBSZW1lbWJlciB0aGUgTVNSIHdpdGggZGlzYWJsZWQgZXh0ZW5zaW9ucyAqLwpAQCAtMTM3MiwyMiArMTM2MSwyMiBAQAogCWt2bXBwY19naXZldXBfZXh0KHZjcHUsIE1TUl9WU1gpOwogCiAJLyogUmVzdG9yZSBGUFUgc3RhdGUgZnJvbSBzdGFjayAqLwotCW1lbWNweShjdXJyZW50LT50aHJlYWQuZnByLCBleHRfYmtwLmZwciwgc2l6ZW9mKGV4dF9ia3AuZnByKSk7Ci0JY3VycmVudC0+dGhyZWFkLmZwc2NyID0gZXh0X2JrcC5mcHNjcjsKLQljdXJyZW50LT50aHJlYWQuZnBleGNfbW9kZSA9IGV4dF9ia3AuZnBleGNfbW9kZTsKKwltZW1jcHkoY3VycmVudC0+dGhyZWFkLmZwciwgZnByLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLmZwcikpOworCWN1cnJlbnQtPnRocmVhZC5mcHNjci52YWwgPSBmcHNjcjsKKwljdXJyZW50LT50aHJlYWQuZnBleGNfbW9kZSA9IGZwZXhjX21vZGU7CiAKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCS8qIFJlc3RvcmUgQWx0aXZlYyBzdGF0ZSBmcm9tIHN0YWNrICovCi0JaWYgKHNhdmVfdmVjICYmIGN1cnJlbnQtPnRocmVhZC51c2VkX3ZyKSB7Ci0JCW1lbWNweShjdXJyZW50LT50aHJlYWQudnIsIGV4dF9ia3AudnIsIHNpemVvZihleHRfYmtwLnZyKSk7Ci0JCWN1cnJlbnQtPnRocmVhZC52c2NyID0gZXh0X2JrcC52c2NyOwotCQljdXJyZW50LT50aHJlYWQudnJzYXZlPSBleHRfYmtwLnZyc2F2ZTsKKwlpZiAodXNlZF92ciAmJiBjdXJyZW50LT50aHJlYWQudXNlZF92cikgeworCQltZW1jcHkoY3VycmVudC0+dGhyZWFkLnZyLCB2ciwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC52cikpOworCQljdXJyZW50LT50aHJlYWQudnNjciA9IHZzY3I7CisJCWN1cnJlbnQtPnRocmVhZC52cnNhdmUgPSB2cnNhdmU7CiAJfQotCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZyID0gZXh0X2JrcC51c2VkX3ZyOworCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZyID0gdXNlZF92cjsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1ZTWAotCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZzciA9IGV4dF9ia3AudXNlZF92c3I7CisJY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyID0gdXNlZF92c3I7CiAjZW5kaWYKIAogCXJldHVybiByZXQ7CkBAIC0xMzk1LDEyICsxMzg0LDIyIEBACiAKIHN0YXRpYyBpbnQga3ZtcHBjX2Jvb2szc19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGt2bV9pbml0KE5VTEwsIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzKSwgMCwKLQkJCVRISVNfTU9EVUxFKTsKKwlpbnQgcjsKKworCXIgPSBrdm1faW5pdChOVUxMLCBzaXplb2Yoc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyksIDAsCisJCSAgICAgVEhJU19NT0RVTEUpOworCisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGt2bXBwY19tbXVfaHB0ZV9zeXNpbml0KCk7CisKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIHZvaWQga3ZtcHBjX2Jvb2szc19leGl0KHZvaWQpCiB7CisJa3ZtcHBjX21tdV9ocHRlX3N5c2V4aXQoKTsKIAlrdm1fZXhpdCgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc18zMl9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdS5jCmluZGV4IDBiMTA1MDMuLjMyOTJkNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdS5jCkBAIC0zNTQsMTAgKzM1NCwxMCBAQAogCQkqdnNpZCA9IFZTSURfUkVBTF9EUiB8IGd2c2lkOwogCQlicmVhazsKIAljYXNlIE1TUl9EUnxNU1JfSVI6Ci0JCWlmICghc3ItPnZhbGlkKQotCQkJcmV0dXJuIC0xOwotCi0JCSp2c2lkID0gc3ItPnZzaWQ7CisJCWlmIChzci0+dmFsaWQpCisJCQkqdnNpZCA9IHNyLT52c2lkOworCQllbHNlCisJCQkqdnNpZCA9IFZTSURfQkFUIHwgZ3ZzaWQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfbW11X2hvc3QuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdV9ob3N0LmMKaW5kZXggMGJiNjYwMC4uMGI1MWVmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfbW11X2hvc3QuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc18zMl9tbXVfaG9zdC5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogCiAjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KICNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgpAQCAtNTcsMTM5ICs1OCwyNiBAQAogc3RhdGljIHVsb25nIGh0YWI7CiBzdGF0aWMgdTMyIGh0YWJtYXNrOwogCi1zdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBocHRlX2NhY2hlICpwdGUpCit2b2lkIGt2bXBwY19tbXVfaW52YWxpZGF0ZV9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlKQogewogCXZvbGF0aWxlIHUzMiAqcHRlZzsKIAotCWRwcmludGtfbW11KCJLVk06IEZsdXNoaW5nIFNQVEU6IDB4JWxseCAoMHglbGx4KSAtPiAweCVsbHhcbiIsCi0JCSAgICBwdGUtPnB0ZS5lYWRkciwgcHRlLT5wdGUudnBhZ2UsIHB0ZS0+aG9zdF92YSk7Ci0KKwkvKiBSZW1vdmUgZnJvbSBob3N0IEhUQUIgKi8KIAlwdGVnID0gKHUzMiopcHRlLT5zbG90OwotCiAJcHRlZ1swXSA9IDA7CisKKwkvKiBBbmQgbWFrZSBzdXJlIGl0J3MgZ29uZSBmcm9tIHRoZSBUTEIgdG9vICovCiAJYXNtIHZvbGF0aWxlICgic3luYyIpOwogCWFzbSB2b2xhdGlsZSAoInRsYmllICUwIiA6IDogInIiIChwdGUtPnB0ZS5lYWRkcikgOiAibWVtb3J5Iik7CiAJYXNtIHZvbGF0aWxlICgic3luYyIpOwogCWFzbSB2b2xhdGlsZSAoInRsYnN5bmMiKTsKLQotCXB0ZS0+aG9zdF92YSA9IDA7Ci0KLQlpZiAocHRlLT5wdGUubWF5X3dyaXRlKQotCQlrdm1fcmVsZWFzZV9wZm5fZGlydHkocHRlLT5wZm4pOwotCWVsc2UKLQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHB0ZS0+cGZuKTsKLX0KLQotdm9pZCBrdm1wcGNfbW11X3B0ZV9mbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGd1ZXN0X2VhLCB1bG9uZyBlYV9tYXNrKQotewotCWludCBpOwotCi0JZHByaW50a19tbXUoIktWTTogRmx1c2hpbmcgJWQgU2hhZG93IFBURXM6IDB4JXggJiAweCV4XG4iLAotCQkgICAgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCwgZ3Vlc3RfZWEsIGVhX21hc2spOwotCUJVR19PTih2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0ID4gSFBURUdfQ0FDSEVfTlVNKTsKLQotCWd1ZXN0X2VhICY9IGVhX21hc2s7Ci0JZm9yIChpID0gMDsgaSA8IHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQ7IGkrKykgewotCQlzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlOwotCi0JCXB0ZSA9ICZ2Y3B1LT5hcmNoLmhwdGVfY2FjaGVbaV07Ci0JCWlmICghcHRlLT5ob3N0X3ZhKQotCQkJY29udGludWU7Ci0KLQkJaWYgKChwdGUtPnB0ZS5lYWRkciAmIGVhX21hc2spID09IGd1ZXN0X2VhKSB7Ci0JCQlpbnZhbGlkYXRlX3B0ZSh2Y3B1LCBwdGUpOwotCQl9Ci0JfQotCi0JLyogRG9pbmcgYSBjb21wbGV0ZSBmbHVzaCAtPiBzdGFydCBmcm9tIHNjcmF0Y2ggKi8KLQlpZiAoIWVhX21hc2spCi0JCXZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQgPSAwOwotfQotCi12b2lkIGt2bXBwY19tbXVfcHRlX3ZmbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndWVzdF92cCwgdTY0IHZwX21hc2spCi17Ci0JaW50IGk7Ci0KLQlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyAlZCBTaGFkb3cgdlBURXM6IDB4JWxseCAmIDB4JWxseFxuIiwKLQkJICAgIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQsIGd1ZXN0X3ZwLCB2cF9tYXNrKTsKLQlCVUdfT04odmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA+IEhQVEVHX0NBQ0hFX05VTSk7Ci0KLQlndWVzdF92cCAmPSB2cF9tYXNrOwotCWZvciAoaSA9IDA7IGkgPCB2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0OyBpKyspIHsKLQkJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKLQotCQlwdGUgPSAmdmNwdS0+YXJjaC5ocHRlX2NhY2hlW2ldOwotCQlpZiAoIXB0ZS0+aG9zdF92YSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgocHRlLT5wdGUudnBhZ2UgJiB2cF9tYXNrKSA9PSBndWVzdF92cCkgewotCQkJaW52YWxpZGF0ZV9wdGUodmNwdSwgcHRlKTsKLQkJfQotCX0KLX0KLQotdm9pZCBrdm1wcGNfbW11X3B0ZV9wZmx1c2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBwYV9zdGFydCwgdWxvbmcgcGFfZW5kKQotewotCWludCBpOwotCi0JZHByaW50a19tbXUoIktWTTogRmx1c2hpbmcgJWQgU2hhZG93IHBQVEVzOiAweCVsbHggJiAweCVsbHhcbiIsCi0JCSAgICB2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0LCBwYV9zdGFydCwgcGFfZW5kKTsKLQlCVUdfT04odmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA+IEhQVEVHX0NBQ0hFX05VTSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7Ci0JCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7Ci0KLQkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKLQkJaWYgKCFwdGUtPmhvc3RfdmEpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHB0ZS0+cHRlLnJhZGRyID49IHBhX3N0YXJ0KSAmJgotCQkgICAgKHB0ZS0+cHRlLnJhZGRyIDwgcGFfZW5kKSkgewotCQkJaW52YWxpZGF0ZV9wdGUodmNwdSwgcHRlKTsKLQkJfQotCX0KLX0KLQotc3RydWN0IGt2bXBwY19wdGUgKmt2bXBwY19tbXVfZmluZF9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWEsIGJvb2wgZGF0YSkKLXsKLQlpbnQgaTsKLQl1NjQgZ3Vlc3RfdnA7Ci0KLQlndWVzdF92cCA9IHZjcHUtPmFyY2gubW11LmVhX3RvX3ZwKHZjcHUsIGVhLCBmYWxzZSk7Ci0JZm9yIChpPTA7IGk8dmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7Ci0JCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7Ci0KLQkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKLQkJaWYgKCFwdGUtPmhvc3RfdmEpCi0JCQljb250aW51ZTsKLQotCQlpZiAocHRlLT5wdGUudnBhZ2UgPT0gZ3Vlc3RfdnApCi0JCQlyZXR1cm4gJnB0ZS0+cHRlOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGt2bXBwY19tbXVfaHB0ZV9jYWNoZV9uZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpZiAodmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA9PSBIUFRFR19DQUNIRV9OVU0pCi0JCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIDAsIDApOwotCi0JcmV0dXJuIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQrKzsKIH0KIAogLyogV2Uga2VlcCA1MTIgZ3ZzaWQtPmh2c2lkIGVudHJpZXMsIG1hcHBpbmcgdGhlIGd1ZXN0IG9uZXMgdG8gdGhlIGFycmF5IHVzaW5nCiAgKiBhIGhhc2gsIHNvIHdlIGRvbid0IHdhc3RlIGN5Y2xlcyBvbiBsb29waW5nICovCiBzdGF0aWMgdTE2IGt2bXBwY19zaWRfaGFzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndnNpZCkKIHsKLQlyZXR1cm4gKHUxNikoKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNykpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNikpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNSkpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNCkpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMykpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMikpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMSkpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMCkpICYgU0lEX01BUF9NQVNLKSk7CisJcmV0dXJuIGhhc2hfNjQoZ3ZzaWQsIFNJRF9NQVBfQklUUyk7CiB9CiAKIApAQCAtMjU2LDcgKzE0NCw2IEBACiAJcmVnaXN0ZXIgaW50IHJyID0gMDsKIAlib29sIHByaW1hcnkgPSBmYWxzZTsKIAlib29sIGV2aWN0ID0gZmFsc2U7Ci0JaW50IGhwdGVfaWQ7CiAJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKIAogCS8qIEdldCBob3N0IHBoeXNpY2FsIGFkZHJlc3MgZm9yIGdwYSAqLwpAQCAtMzQxLDggKzIyOCw3IEBACiAKIAkvKiBOb3cgdGVsbCBvdXIgU2hhZG93IFBURSBjb2RlIGFib3V0IHRoZSBuZXcgcGFnZSAqLwogCi0JaHB0ZV9pZCA9IGt2bXBwY19tbXVfaHB0ZV9jYWNoZV9uZXh0KHZjcHUpOwotCXB0ZSA9ICZ2Y3B1LT5hcmNoLmhwdGVfY2FjaGVbaHB0ZV9pZF07CisJcHRlID0ga3ZtcHBjX21tdV9ocHRlX2NhY2hlX25leHQodmNwdSk7CiAKIAlkcHJpbnRrX21tdSgiS1ZNOiAlYyVjIE1hcCAweCVsbHg6IFslbHhdIDB4JWxseCAoMHglbGx4KSAtPiAlbHhcbiIsCiAJCSAgICBvcmlnX3B0ZS0+bWF5X3dyaXRlID8gJ3cnIDogJy0nLApAQCAtMzU1LDYgKzI0MSw4IEBACiAJcHRlLT5wdGUgPSAqb3JpZ19wdGU7CiAJcHRlLT5wZm4gPSBocGFkZHIgPj4gUEFHRV9TSElGVDsKIAorCWt2bXBwY19tbXVfaHB0ZV9jYWNoZV9tYXAodmNwdSwgcHRlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC00MzksNyArMzI3LDcgQEAKIAogdm9pZCBrdm1wcGNfbW11X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIDAsIDApOworCWt2bXBwY19tbXVfaHB0ZV9kZXN0cm95KHZjcHUpOwogCXByZWVtcHRfZGlzYWJsZSgpOwogCV9fZGVzdHJveV9jb250ZXh0KHRvX2Jvb2szcyh2Y3B1KS0+Y29udGV4dF9pZCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKQEAgLTQ3OSw1ICszNjcsNyBAQAogCWh0YWJtYXNrID0gKChzZHIxICYgMHgxRkYpIDw8IDE2KSB8IDB4RkZDMDsKIAlodGFiID0gKHVsb25nKV9fdmEoc2RyMSAmIDB4ZmZmZjAwMDApOwogCisJa3ZtcHBjX21tdV9ocHRlX2luaXQodmNwdSk7CisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X21tdV9ob3N0LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXVfaG9zdC5jCmluZGV4IGU0YjU3NDQuLjM4NDE3OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X21tdV9ob3N0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11X2hvc3QuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KIAogI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3MuaD4KQEAgLTQ2LDEzNSArNDcsMjAgQEAKICNkZWZpbmUgZHByaW50a19zbGIoYSwgLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3B0ZShzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlKQordm9pZCBrdm1wcGNfbW11X2ludmFsaWRhdGVfcHRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGhwdGVfY2FjaGUgKnB0ZSkKIHsKLQlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyBTUFQ6IDB4JWx4ICgweCVsbHgpIC0+IDB4JWxseFxuIiwKLQkJICAgIHB0ZS0+cHRlLmVhZGRyLCBwdGUtPnB0ZS52cGFnZSwgcHRlLT5ob3N0X3ZhKTsKLQogCXBwY19tZC5ocHRlX2ludmFsaWRhdGUocHRlLT5zbG90LCBwdGUtPmhvc3RfdmEsCiAJCQkgICAgICAgTU1VX1BBR0VfNEssIE1NVV9TRUdTSVpFXzI1Nk0sCiAJCQkgICAgICAgZmFsc2UpOwotCXB0ZS0+aG9zdF92YSA9IDA7Ci0KLQlpZiAocHRlLT5wdGUubWF5X3dyaXRlKQotCQlrdm1fcmVsZWFzZV9wZm5fZGlydHkocHRlLT5wZm4pOwotCWVsc2UKLQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHB0ZS0+cGZuKTsKLX0KLQotdm9pZCBrdm1wcGNfbW11X3B0ZV9mbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGd1ZXN0X2VhLCB1bG9uZyBlYV9tYXNrKQotewotCWludCBpOwotCi0JZHByaW50a19tbXUoIktWTTogRmx1c2hpbmcgJWQgU2hhZG93IFBURXM6IDB4JWx4ICYgMHglbHhcbiIsCi0JCSAgICB2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0LCBndWVzdF9lYSwgZWFfbWFzayk7Ci0JQlVHX09OKHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQgPiBIUFRFR19DQUNIRV9OVU0pOwotCi0JZ3Vlc3RfZWEgJj0gZWFfbWFzazsKLQlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7Ci0JCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7Ci0KLQkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKLQkJaWYgKCFwdGUtPmhvc3RfdmEpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHB0ZS0+cHRlLmVhZGRyICYgZWFfbWFzaykgPT0gZ3Vlc3RfZWEpIHsKLQkJCWludmFsaWRhdGVfcHRlKHB0ZSk7Ci0JCX0KLQl9Ci0KLQkvKiBEb2luZyBhIGNvbXBsZXRlIGZsdXNoIC0+IHN0YXJ0IGZyb20gc2NyYXRjaCAqLwotCWlmICghZWFfbWFzaykKLQkJdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA9IDA7Ci19Ci0KLXZvaWQga3ZtcHBjX21tdV9wdGVfdmZsdXNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGd1ZXN0X3ZwLCB1NjQgdnBfbWFzaykKLXsKLQlpbnQgaTsKLQotCWRwcmludGtfbW11KCJLVk06IEZsdXNoaW5nICVkIFNoYWRvdyB2UFRFczogMHglbGx4ICYgMHglbGx4XG4iLAotCQkgICAgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCwgZ3Vlc3RfdnAsIHZwX21hc2spOwotCUJVR19PTih2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0ID4gSFBURUdfQ0FDSEVfTlVNKTsKLQotCWd1ZXN0X3ZwICY9IHZwX21hc2s7Ci0JZm9yIChpID0gMDsgaSA8IHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQ7IGkrKykgewotCQlzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlOwotCi0JCXB0ZSA9ICZ2Y3B1LT5hcmNoLmhwdGVfY2FjaGVbaV07Ci0JCWlmICghcHRlLT5ob3N0X3ZhKQotCQkJY29udGludWU7Ci0KLQkJaWYgKChwdGUtPnB0ZS52cGFnZSAmIHZwX21hc2spID09IGd1ZXN0X3ZwKSB7Ci0JCQlpbnZhbGlkYXRlX3B0ZShwdGUpOwotCQl9Ci0JfQotfQotCi12b2lkIGt2bXBwY19tbXVfcHRlX3BmbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIHBhX3N0YXJ0LCB1bG9uZyBwYV9lbmQpCi17Ci0JaW50IGk7Ci0KLQlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyAlZCBTaGFkb3cgcFBURXM6IDB4JWx4ICYgMHglbHhcbiIsCi0JCSAgICB2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0LCBwYV9zdGFydCwgcGFfZW5kKTsKLQlCVUdfT04odmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA+IEhQVEVHX0NBQ0hFX05VTSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7Ci0JCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7Ci0KLQkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKLQkJaWYgKCFwdGUtPmhvc3RfdmEpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHB0ZS0+cHRlLnJhZGRyID49IHBhX3N0YXJ0KSAmJgotCQkgICAgKHB0ZS0+cHRlLnJhZGRyIDwgcGFfZW5kKSkgewotCQkJaW52YWxpZGF0ZV9wdGUocHRlKTsKLQkJfQotCX0KLX0KLQotc3RydWN0IGt2bXBwY19wdGUgKmt2bXBwY19tbXVfZmluZF9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWEsIGJvb2wgZGF0YSkKLXsKLQlpbnQgaTsKLQl1NjQgZ3Vlc3RfdnA7Ci0KLQlndWVzdF92cCA9IHZjcHUtPmFyY2gubW11LmVhX3RvX3ZwKHZjcHUsIGVhLCBmYWxzZSk7Ci0JZm9yIChpPTA7IGk8dmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7Ci0JCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7Ci0KLQkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKLQkJaWYgKCFwdGUtPmhvc3RfdmEpCi0JCQljb250aW51ZTsKLQotCQlpZiAocHRlLT5wdGUudnBhZ2UgPT0gZ3Vlc3RfdnApCi0JCQlyZXR1cm4gJnB0ZS0+cHRlOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGt2bXBwY19tbXVfaHB0ZV9jYWNoZV9uZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpZiAodmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA9PSBIUFRFR19DQUNIRV9OVU0pCi0JCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIDAsIDApOwotCi0JcmV0dXJuIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQrKzsKIH0KIAogLyogV2Uga2VlcCA1MTIgZ3ZzaWQtPmh2c2lkIGVudHJpZXMsIG1hcHBpbmcgdGhlIGd1ZXN0IG9uZXMgdG8gdGhlIGFycmF5IHVzaW5nCiAgKiBhIGhhc2gsIHNvIHdlIGRvbid0IHdhc3RlIGN5Y2xlcyBvbiBsb29waW5nICovCiBzdGF0aWMgdTE2IGt2bXBwY19zaWRfaGFzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndnNpZCkKIHsKLQlyZXR1cm4gKHUxNikoKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNykpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNikpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNSkpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNCkpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMykpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMikpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMSkpICYgU0lEX01BUF9NQVNLKSBeCi0JCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMCkpICYgU0lEX01BUF9NQVNLKSk7CisJcmV0dXJuIGhhc2hfNjQoZ3ZzaWQsIFNJRF9NQVBfQklUUyk7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBrdm1wcGNfc2lkX21hcCAqZmluZF9zaWRfdnNpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndnNpZCkKIHsKIAlzdHJ1Y3Qga3ZtcHBjX3NpZF9tYXAgKm1hcDsKQEAgLTI3Myw4ICsxNTksNyBAQAogCQlhdHRlbXB0Kys7CiAJCWdvdG8gbWFwX2FnYWluOwogCX0gZWxzZSB7Ci0JCWludCBocHRlX2lkID0ga3ZtcHBjX21tdV9ocHRlX2NhY2hlX25leHQodmNwdSk7Ci0JCXN0cnVjdCBocHRlX2NhY2hlICpwdGUgPSAmdmNwdS0+YXJjaC5ocHRlX2NhY2hlW2hwdGVfaWRdOworCQlzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlID0ga3ZtcHBjX21tdV9ocHRlX2NhY2hlX25leHQodmNwdSk7CiAKIAkJZHByaW50a19tbXUoIktWTTogJWMlYyBNYXAgMHglbHg6IFslbHhdIDB4JWx4ICgweCVsbHgpIC0+ICVseFxuIiwKIAkJCSAgICAoKHJmbGFncyAmIEhQVEVfUl9QUCkgPT0gMykgPyAnLScgOiAndycsCkBAIC0yOTIsNiArMTc3LDggQEAKIAkJcHRlLT5ob3N0X3ZhID0gdmE7CiAJCXB0ZS0+cHRlID0gKm9yaWdfcHRlOwogCQlwdGUtPnBmbiA9IGhwYWRkciA+PiBQQUdFX1NISUZUOworCisJCWt2bXBwY19tbXVfaHB0ZV9jYWNoZV9tYXAodmNwdSwgcHRlKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQxOCw3ICszMDUsNyBAQAogCiB2b2lkIGt2bXBwY19tbXVfZGVzdHJveShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Ja3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CisJa3ZtcHBjX21tdV9ocHRlX2Rlc3Ryb3kodmNwdSk7CiAJX19kZXN0cm95X2NvbnRleHQodG9fYm9vazNzKHZjcHUpLT5jb250ZXh0X2lkKTsKIH0KIApAQCAtNDM2LDUgKzMyMyw3IEBACiAJdmNwdTNzLT52c2lkX2ZpcnN0ID0gdmNwdTNzLT5jb250ZXh0X2lkIDw8IFVTRVJfRVNJRF9CSVRTOwogCXZjcHUzcy0+dnNpZF9uZXh0ID0gdmNwdTNzLT52c2lkX2ZpcnN0OwogCisJa3ZtcHBjX21tdV9ocHRlX2luaXQodmNwdSk7CisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX21tdV9ocHRlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19tbXVfaHB0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjhkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19tbXVfaHB0ZS5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNVU0UgTGludXggUHJvZHVjdHMgR21iSC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3JzOgorICogICAgIEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisKKyNkZWZpbmUgUFRFX1NJWkUJMTIKKworLyogI2RlZmluZSBERUJVR19NTVUgKi8KKworI2lmZGVmIERFQlVHX01NVQorI2RlZmluZSBkcHJpbnRrX21tdShhLCAuLi4pIHByaW50ayhLRVJOX0lORk8gYSwgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBkcHJpbnRrX21tdShhLCAuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaHB0ZV9jYWNoZTsKKworc3RhdGljIGlubGluZSB1NjQga3ZtcHBjX21tdV9oYXNoX3B0ZSh1NjQgZWFkZHIpCit7CisJcmV0dXJuIGhhc2hfNjQoZWFkZHIgPj4gUFRFX1NJWkUsIEhQVEVHX0hBU0hfQklUU19QVEUpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBrdm1wcGNfbW11X2hhc2hfdnB0ZSh1NjQgdnBhZ2UpCit7CisJcmV0dXJuIGhhc2hfNjQodnBhZ2UgJiAweGZmZmZmZmZmZlVMTCwgSFBURUdfSEFTSF9CSVRTX1ZQVEUpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBrdm1wcGNfbW11X2hhc2hfdnB0ZV9sb25nKHU2NCB2cGFnZSkKK3sKKwlyZXR1cm4gaGFzaF82NCgodnBhZ2UgJiAweGZmZmZmZjAwMFVMTCkgPj4gMTIsCisJCSAgICAgICBIUFRFR19IQVNIX0JJVFNfVlBURV9MT05HKTsKK30KKwordm9pZCBrdm1wcGNfbW11X2hwdGVfY2FjaGVfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGhwdGVfY2FjaGUgKnB0ZSkKK3sKKwl1NjQgaW5kZXg7CisKKwkvKiBBZGQgdG8gZVBURSBsaXN0ICovCisJaW5kZXggPSBrdm1wcGNfbW11X2hhc2hfcHRlKHB0ZS0+cHRlLmVhZGRyKTsKKwlobGlzdF9hZGRfaGVhZCgmcHRlLT5saXN0X3B0ZSwgJnZjcHUtPmFyY2guaHB0ZV9oYXNoX3B0ZVtpbmRleF0pOworCisJLyogQWRkIHRvIHZQVEUgbGlzdCAqLworCWluZGV4ID0ga3ZtcHBjX21tdV9oYXNoX3ZwdGUocHRlLT5wdGUudnBhZ2UpOworCWhsaXN0X2FkZF9oZWFkKCZwdGUtPmxpc3RfdnB0ZSwgJnZjcHUtPmFyY2guaHB0ZV9oYXNoX3ZwdGVbaW5kZXhdKTsKKworCS8qIEFkZCB0byB2UFRFX2xvbmcgbGlzdCAqLworCWluZGV4ID0ga3ZtcHBjX21tdV9oYXNoX3ZwdGVfbG9uZyhwdGUtPnB0ZS52cGFnZSk7CisJaGxpc3RfYWRkX2hlYWQoJnB0ZS0+bGlzdF92cHRlX2xvbmcsCisJCSAgICAgICAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfdnB0ZV9sb25nW2luZGV4XSk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfcHRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGhwdGVfY2FjaGUgKnB0ZSkKK3sKKwlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyBTUFQ6IDB4JWx4ICgweCVsbHgpIC0+IDB4JWxseFxuIiwKKwkJICAgIHB0ZS0+cHRlLmVhZGRyLCBwdGUtPnB0ZS52cGFnZSwgcHRlLT5ob3N0X3ZhKTsKKworCS8qIERpZmZlcmVudCBmb3IgMzIgYW5kIDY0IGJpdCAqLworCWt2bXBwY19tbXVfaW52YWxpZGF0ZV9wdGUodmNwdSwgcHRlKTsKKworCWlmIChwdGUtPnB0ZS5tYXlfd3JpdGUpCisJCWt2bV9yZWxlYXNlX3Bmbl9kaXJ0eShwdGUtPnBmbik7CisJZWxzZQorCQlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocHRlLT5wZm4pOworCisJaGxpc3RfZGVsKCZwdGUtPmxpc3RfcHRlKTsKKwlobGlzdF9kZWwoJnB0ZS0+bGlzdF92cHRlKTsKKwlobGlzdF9kZWwoJnB0ZS0+bGlzdF92cHRlX2xvbmcpOworCisJdmNwdS0+YXJjaC5ocHRlX2NhY2hlX2NvdW50LS07CisJa21lbV9jYWNoZV9mcmVlKGhwdGVfY2FjaGUsIHB0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19tbXVfcHRlX2ZsdXNoX2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIUFRFR19IQVNIX05VTV9WUFRFX0xPTkc7IGkrKykgeworCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCA9ICZ2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlX2xvbmdbaV07CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdGUsIG5vZGUsIHRtcCwgbGlzdCwgbGlzdF92cHRlX2xvbmcpCisJCQlpbnZhbGlkYXRlX3B0ZSh2Y3B1LCBwdGUpOworCX0KK30KKworc3RhdGljIHZvaWQga3ZtcHBjX21tdV9wdGVfZmx1c2hfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGd1ZXN0X2VhKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CisKKwkvKiBGaW5kIHRoZSBsaXN0IG9mIGVudHJpZXMgaW4gdGhlIG1hcCAqLworCWxpc3QgPSAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfcHRlW2t2bXBwY19tbXVfaGFzaF9wdGUoZ3Vlc3RfZWEpXTsKKworCS8qIENoZWNrIHRoZSBsaXN0IGZvciBtYXRjaGluZyBlbnRyaWVzIGFuZCBpbnZhbGlkYXRlICovCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdGUsIG5vZGUsIHRtcCwgbGlzdCwgbGlzdF9wdGUpCisJCWlmICgocHRlLT5wdGUuZWFkZHIgJiB+MHhmZmZVTCkgPT0gZ3Vlc3RfZWEpCisJCQlpbnZhbGlkYXRlX3B0ZSh2Y3B1LCBwdGUpOworfQorCit2b2lkIGt2bXBwY19tbXVfcHRlX2ZsdXNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZ3Vlc3RfZWEsIHVsb25nIGVhX21hc2spCit7CisJdTY0IGk7CisKKwlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyAlZCBTaGFkb3cgUFRFczogMHglbHggJiAweCVseFxuIiwKKwkJICAgIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9jb3VudCwgZ3Vlc3RfZWEsIGVhX21hc2spOworCisJZ3Vlc3RfZWEgJj0gZWFfbWFzazsKKworCXN3aXRjaCAoZWFfbWFzaykgeworCWNhc2UgfjB4ZmZmVUw6CisJCWt2bXBwY19tbXVfcHRlX2ZsdXNoX3BhZ2UodmNwdSwgZ3Vlc3RfZWEpOworCQlicmVhazsKKwljYXNlIDB4MGZmZmYwMDA6CisJCS8qIDMyLWJpdCBmbHVzaCB3L28gc2VnbWVudCwgZ28gdGhyb3VnaCBhbGwgcG9zc2libGUgc2VnbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDB4MTAwMDAwMDAwVUxMOyBpICs9IDB4MTAwMDAwMDBVTEwpCisJCQlrdm1wcGNfbW11X3B0ZV9mbHVzaCh2Y3B1LCBndWVzdF9lYSB8IGksIH4weGZmZlVMKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBEb2luZyBhIGNvbXBsZXRlIGZsdXNoIC0+IHN0YXJ0IGZyb20gc2NyYXRjaCAqLworCQlrdm1wcGNfbW11X3B0ZV9mbHVzaF9hbGwodmNwdSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCX0KK30KKworLyogRmx1c2ggd2l0aCBtYXNrIDB4ZmZmZmZmZmZmICovCitzdGF0aWMgdm9pZCBrdm1wcGNfbW11X3B0ZV92Zmx1c2hfc2hvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3Vlc3RfdnApCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICp0bXA7CisJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKKwl1NjQgdnBfbWFzayA9IDB4ZmZmZmZmZmZmVUxMOworCisJbGlzdCA9ICZ2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlW2t2bXBwY19tbXVfaGFzaF92cHRlKGd1ZXN0X3ZwKV07CisKKwkvKiBDaGVjayB0aGUgbGlzdCBmb3IgbWF0Y2hpbmcgZW50cmllcyBhbmQgaW52YWxpZGF0ZSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHRlLCBub2RlLCB0bXAsIGxpc3QsIGxpc3RfdnB0ZSkKKwkJaWYgKChwdGUtPnB0ZS52cGFnZSAmIHZwX21hc2spID09IGd1ZXN0X3ZwKQorCQkJaW52YWxpZGF0ZV9wdGUodmNwdSwgcHRlKTsKK30KKworLyogRmx1c2ggd2l0aCBtYXNrIDB4ZmZmZmZmMDAwICovCitzdGF0aWMgdm9pZCBrdm1wcGNfbW11X3B0ZV92Zmx1c2hfbG9uZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndWVzdF92cCkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKKwlzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlOworCXU2NCB2cF9tYXNrID0gMHhmZmZmZmYwMDBVTEw7CisKKwlsaXN0ID0gJnZjcHUtPmFyY2guaHB0ZV9oYXNoX3ZwdGVfbG9uZ1sKKwkJa3ZtcHBjX21tdV9oYXNoX3ZwdGVfbG9uZyhndWVzdF92cCldOworCisJLyogQ2hlY2sgdGhlIGxpc3QgZm9yIG1hdGNoaW5nIGVudHJpZXMgYW5kIGludmFsaWRhdGUgKi8KKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0ZSwgbm9kZSwgdG1wLCBsaXN0LCBsaXN0X3ZwdGVfbG9uZykKKwkJaWYgKChwdGUtPnB0ZS52cGFnZSAmIHZwX21hc2spID09IGd1ZXN0X3ZwKQorCQkJaW52YWxpZGF0ZV9wdGUodmNwdSwgcHRlKTsKK30KKwordm9pZCBrdm1wcGNfbW11X3B0ZV92Zmx1c2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3Vlc3RfdnAsIHU2NCB2cF9tYXNrKQoreworCWRwcmludGtfbW11KCJLVk06IEZsdXNoaW5nICVkIFNoYWRvdyB2UFRFczogMHglbGx4ICYgMHglbGx4XG4iLAorCQkgICAgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX2NvdW50LCBndWVzdF92cCwgdnBfbWFzayk7CisJZ3Vlc3RfdnAgJj0gdnBfbWFzazsKKworCXN3aXRjaCh2cF9tYXNrKSB7CisJY2FzZSAweGZmZmZmZmZmZlVMTDoKKwkJa3ZtcHBjX21tdV9wdGVfdmZsdXNoX3Nob3J0KHZjcHUsIGd1ZXN0X3ZwKTsKKwkJYnJlYWs7CisJY2FzZSAweGZmZmZmZjAwMFVMTDoKKwkJa3ZtcHBjX21tdV9wdGVfdmZsdXNoX2xvbmcodmNwdSwgZ3Vlc3RfdnApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorfQorCit2b2lkIGt2bXBwY19tbXVfcHRlX3BmbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIHBhX3N0YXJ0LCB1bG9uZyBwYV9lbmQpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICp0bXA7CisJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKKwlpbnQgaTsKKworCWRwcmludGtfbW11KCJLVk06IEZsdXNoaW5nICVkIFNoYWRvdyBwUFRFczogMHglbHggLSAweCVseFxuIiwKKwkJICAgIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9jb3VudCwgcGFfc3RhcnQsIHBhX2VuZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFBURUdfSEFTSF9OVU1fVlBURV9MT05HOyBpKyspIHsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QgPSAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfdnB0ZV9sb25nW2ldOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHRlLCBub2RlLCB0bXAsIGxpc3QsIGxpc3RfdnB0ZV9sb25nKQorCQkJaWYgKChwdGUtPnB0ZS5yYWRkciA+PSBwYV9zdGFydCkgJiYKKwkJCSAgICAocHRlLT5wdGUucmFkZHIgPCBwYV9lbmQpKQorCQkJCWludmFsaWRhdGVfcHRlKHZjcHUsIHB0ZSk7CisJfQorfQorCitzdHJ1Y3QgaHB0ZV9jYWNoZSAqa3ZtcHBjX21tdV9ocHRlX2NhY2hlX25leHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CisKKwlwdGUgPSBrbWVtX2NhY2hlX3phbGxvYyhocHRlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwl2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfY291bnQrKzsKKworCWlmICh2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfY291bnQgPT0gSFBURUdfQ0FDSEVfTlVNKQorCQlrdm1wcGNfbW11X3B0ZV9mbHVzaF9hbGwodmNwdSk7CisKKwlyZXR1cm4gcHRlOworfQorCit2b2lkIGt2bXBwY19tbXVfaHB0ZV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1wcGNfbW11X3B0ZV9mbHVzaCh2Y3B1LCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX21tdV9ocHRlX2luaXRfaGFzaChzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaF9saXN0LCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmhhc2hfbGlzdFtpXSk7Cit9CisKK2ludCBrdm1wcGNfbW11X2hwdGVfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJLyogaW5pdCBocHRlIGxvb2t1cCBoYXNoZXMgKi8KKwlrdm1wcGNfbW11X2hwdGVfaW5pdF9oYXNoKHZjcHUtPmFyY2guaHB0ZV9oYXNoX3B0ZSwKKwkJCQkgIEFSUkFZX1NJWkUodmNwdS0+YXJjaC5ocHRlX2hhc2hfcHRlKSk7CisJa3ZtcHBjX21tdV9ocHRlX2luaXRfaGFzaCh2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlLAorCQkJCSAgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlKSk7CisJa3ZtcHBjX21tdV9ocHRlX2luaXRfaGFzaCh2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlX2xvbmcsCisJCQkJICBBUlJBWV9TSVpFKHZjcHUtPmFyY2guaHB0ZV9oYXNoX3ZwdGVfbG9uZykpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1wcGNfbW11X2hwdGVfc3lzaW5pdCh2b2lkKQoreworCS8qIGluaXQgaHB0ZSBzbGFiIGNhY2hlICovCisJaHB0ZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJrdm0tc3B0Iiwgc2l6ZW9mKHN0cnVjdCBocHRlX2NhY2hlKSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBocHRlX2NhY2hlKSwgMCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBrdm1wcGNfbW11X2hwdGVfc3lzZXhpdCh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShocHRlX2NhY2hlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3BhaXJlZF9zaW5nbGVzLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wYWlyZWRfc2luZ2xlcy5jCmluZGV4IGE5ZjY2YWIuLjQ3NGYyZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3BhaXJlZF9zaW5nbGVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcGFpcmVkX3NpbmdsZXMuYwpAQCAtMTU5LDEwICsxNTksNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX3N5bmNfcXByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHJ0KQogewotCXN0cnVjdCB0aHJlYWRfc3RydWN0IHQ7Ci0KLQl0LmZwc2NyLnZhbCA9IHZjcHUtPmFyY2guZnBzY3I7Ci0JY3Z0X2RmKChkb3VibGUqKSZ2Y3B1LT5hcmNoLmZwcltydF0sIChmbG9hdCopJnZjcHUtPmFyY2gucXByW3J0XSwgJnQpOworCWt2bV9jdnRfZGYoJnZjcHUtPmFyY2guZnByW3J0XSwgJnZjcHUtPmFyY2gucXByW3J0XSwgJnZjcHUtPmFyY2guZnBzY3IpOwogfQogCiBzdGF0aWMgdm9pZCBrdm1wcGNfaW5qZWN0X3BmKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZWFkZHIsIGJvb2wgaXNfc3RvcmUpCkBAIC0xODMsNyArMTgwLDYgQEAKIAkJCQkgICBpbnQgcnMsIHVsb25nIGFkZHIsIGludCBsc190eXBlKQogewogCWludCBlbXVsYXRlZCA9IEVNVUxBVEVfRkFJTDsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB0OwogCWludCByOwogCWNoYXIgdG1wWzhdOwogCWludCBsZW4gPSBzaXplb2YodTMyKTsKQEAgLTE5MSw4ICsxODcsNiBAQAogCWlmIChsc190eXBlID09IEZQVV9MU19ET1VCTEUpCiAJCWxlbiA9IHNpemVvZih1NjQpOwogCi0JdC5mcHNjci52YWwgPSB2Y3B1LT5hcmNoLmZwc2NyOwotCiAJLyogcmVhZCBmcm9tIG1lbW9yeSAqLwogCXIgPSBrdm1wcGNfbGQodmNwdSwgJmFkZHIsIGxlbiwgdG1wLCB0cnVlKTsKIAl2Y3B1LT5hcmNoLnBhZGRyX2FjY2Vzc2VkID0gYWRkcjsKQEAgLTIxMCw3ICsyMDQsNyBAQAogCS8qIHB1dCBpbiByZWdpc3RlcnMgKi8KIAlzd2l0Y2ggKGxzX3R5cGUpIHsKIAljYXNlIEZQVV9MU19TSU5HTEU6Ci0JCWN2dF9mZCgoZmxvYXQqKXRtcCwgKGRvdWJsZSopJnZjcHUtPmFyY2guZnByW3JzXSwgJnQpOworCQlrdm1fY3Z0X2ZkKCh1MzIqKXRtcCwgJnZjcHUtPmFyY2guZnByW3JzXSwgJnZjcHUtPmFyY2guZnBzY3IpOwogCQl2Y3B1LT5hcmNoLnFwcltyc10gPSAqKCh1MzIqKXRtcCk7CiAJCWJyZWFrOwogCWNhc2UgRlBVX0xTX0RPVUJMRToKQEAgLTIyOSwxNyArMjIzLDE0IEBACiAJCQkJICAgIGludCBycywgdWxvbmcgYWRkciwgaW50IGxzX3R5cGUpCiB7CiAJaW50IGVtdWxhdGVkID0gRU1VTEFURV9GQUlMOwotCXN0cnVjdCB0aHJlYWRfc3RydWN0IHQ7CiAJaW50IHI7CiAJY2hhciB0bXBbOF07CiAJdTY0IHZhbDsKIAlpbnQgbGVuOwogCi0JdC5mcHNjci52YWwgPSB2Y3B1LT5hcmNoLmZwc2NyOwotCiAJc3dpdGNoIChsc190eXBlKSB7CiAJY2FzZSBGUFVfTFNfU0lOR0xFOgotCQljdnRfZGYoKGRvdWJsZSopJnZjcHUtPmFyY2guZnByW3JzXSwgKGZsb2F0Kil0bXAsICZ0KTsKKwkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbcnNdLCAodTMyKil0bXAsICZ2Y3B1LT5hcmNoLmZwc2NyKTsKIAkJdmFsID0gKigodTMyKil0bXApOwogCQlsZW4gPSBzaXplb2YodTMyKTsKIAkJYnJlYWs7CkBAIC0yNzgsMTMgKzI2OSwxMCBAQAogCQkJCSAgIGludCBycywgdWxvbmcgYWRkciwgYm9vbCB3LCBpbnQgaSkKIHsKIAlpbnQgZW11bGF0ZWQgPSBFTVVMQVRFX0ZBSUw7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgdDsKIAlpbnQgcjsKIAlmbG9hdCBvbmUgPSAxLjA7CiAJdTMyIHRtcFsyXTsKIAotCXQuZnBzY3IudmFsID0gdmNwdS0+YXJjaC5mcHNjcjsKLQogCS8qIHJlYWQgZnJvbSBtZW1vcnkgKi8KIAlpZiAodykgewogCQlyID0ga3ZtcHBjX2xkKHZjcHUsICZhZGRyLCBzaXplb2YodTMyKSwgdG1wLCB0cnVlKTsKQEAgLTMwOCw3ICsyOTYsNyBAQAogCWVtdWxhdGVkID0gRU1VTEFURV9ET05FOwogCiAJLyogcHV0IGluIHJlZ2lzdGVycyAqLwotCWN2dF9mZCgoZmxvYXQqKSZ0bXBbMF0sIChkb3VibGUqKSZ2Y3B1LT5hcmNoLmZwcltyc10sICZ0KTsKKwlrdm1fY3Z0X2ZkKCZ0bXBbMF0sICZ2Y3B1LT5hcmNoLmZwcltyc10sICZ2Y3B1LT5hcmNoLmZwc2NyKTsKIAl2Y3B1LT5hcmNoLnFwcltyc10gPSB0bXBbMV07CiAKIAlkcHJpbnRrKEtFUk5fSU5GTyAiS1ZNOiBQU1FfTEQgWzB4JXgsIDB4JXhdIGF0IDB4JWx4ICglZClcbiIsIHRtcFswXSwKQEAgLTMyMiwxNCArMzEwLDExIEBACiAJCQkJICAgIGludCBycywgdWxvbmcgYWRkciwgYm9vbCB3LCBpbnQgaSkKIHsKIAlpbnQgZW11bGF0ZWQgPSBFTVVMQVRFX0ZBSUw7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgdDsKIAlpbnQgcjsKIAl1MzIgdG1wWzJdOwogCWludCBsZW4gPSB3ID8gc2l6ZW9mKHUzMikgOiBzaXplb2YodTY0KTsKIAotCXQuZnBzY3IudmFsID0gdmNwdS0+YXJjaC5mcHNjcjsKLQotCWN2dF9kZigoZG91YmxlKikmdmNwdS0+YXJjaC5mcHJbcnNdLCAoZmxvYXQqKSZ0bXBbMF0sICZ0KTsKKwlrdm1fY3Z0X2RmKCZ2Y3B1LT5hcmNoLmZwcltyc10sICZ0bXBbMF0sICZ2Y3B1LT5hcmNoLmZwc2NyKTsKIAl0bXBbMV0gPSB2Y3B1LT5hcmNoLnFwcltyc107CiAKIAlyID0ga3ZtcHBjX3N0KHZjcHUsICZhZGRyLCBsZW4sIHRtcCwgdHJ1ZSk7CkBAIC01MTcsNyArNTAyLDcgQEAKIHN0YXRpYyBpbnQga3ZtcHBjX3BzX3RocmVlX2luKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCByYywKIAkJCQkgICAgICBpbnQgcmVnX291dCwgaW50IHJlZ19pbjEsIGludCByZWdfaW4yLAogCQkJCSAgICAgIGludCByZWdfaW4zLCBpbnQgc2NhbGFyLAotCQkJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwKKwkJCQkgICAgICB2b2lkICgqZnVuYykodTY0ICpmcHNjciwKIAkJCQkJCSB1MzIgKmRzdCwgdTMyICpzcmMxLAogCQkJCQkJIHUzMiAqc3JjMiwgdTMyICpzcmMzKSkKIHsKQEAgLTUyNiwyNyArNTExLDI1IEBACiAJdTMyIHBzMF9vdXQ7CiAJdTMyIHBzMF9pbjEsIHBzMF9pbjIsIHBzMF9pbjM7CiAJdTMyIHBzMV9pbjEsIHBzMV9pbjIsIHBzMV9pbjM7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgdDsKLQl0LmZwc2NyLnZhbCA9IHZjcHUtPmFyY2guZnBzY3I7CiAKIAkvKiBSQyAqLwogCVdBUk5fT04ocmMpOwogCiAJLyogUFMwICovCi0JY3Z0X2RmKChkb3VibGUqKSZmcHJbcmVnX2luMV0sIChmbG9hdCopJnBzMF9pbjEsICZ0KTsKLQljdnRfZGYoKGRvdWJsZSopJmZwcltyZWdfaW4yXSwgKGZsb2F0KikmcHMwX2luMiwgJnQpOwotCWN2dF9kZigoZG91YmxlKikmZnByW3JlZ19pbjNdLCAoZmxvYXQqKSZwczBfaW4zLCAmdCk7CisJa3ZtX2N2dF9kZigmZnByW3JlZ19pbjFdLCAmcHMwX2luMSwgJnZjcHUtPmFyY2guZnBzY3IpOworCWt2bV9jdnRfZGYoJmZwcltyZWdfaW4yXSwgJnBzMF9pbjIsICZ2Y3B1LT5hcmNoLmZwc2NyKTsKKwlrdm1fY3Z0X2RmKCZmcHJbcmVnX2luM10sICZwczBfaW4zLCAmdmNwdS0+YXJjaC5mcHNjcik7CiAKIAlpZiAoc2NhbGFyICYgU0NBTEFSX0xPVykKIAkJcHMwX2luMiA9IHFwcltyZWdfaW4yXTsKIAotCWZ1bmMoJnQsICZwczBfb3V0LCAmcHMwX2luMSwgJnBzMF9pbjIsICZwczBfaW4zKTsKKwlmdW5jKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmcHMwX291dCwgJnBzMF9pbjEsICZwczBfaW4yLCAmcHMwX2luMyk7CiAKIAlkcHJpbnRrKEtFUk5fSU5GTyAiUFMzIHBzMCAtPiBmKDB4JXgsIDB4JXgsIDB4JXgpID0gMHgleFxuIiwKIAkJCSAgcHMwX2luMSwgcHMwX2luMiwgcHMwX2luMywgcHMwX291dCk7CiAKIAlpZiAoIShzY2FsYXIgJiBTQ0FMQVJfTk9fUFMwKSkKLQkJY3Z0X2ZkKChmbG9hdCopJnBzMF9vdXQsIChkb3VibGUqKSZmcHJbcmVnX291dF0sICZ0KTsKKwkJa3ZtX2N2dF9mZCgmcHMwX291dCwgJmZwcltyZWdfb3V0XSwgJnZjcHUtPmFyY2guZnBzY3IpOwogCiAJLyogUFMxICovCiAJcHMxX2luMSA9IHFwcltyZWdfaW4xXTsKQEAgLTU1Nyw3ICs1NDAsNyBAQAogCQlwczFfaW4yID0gcHMwX2luMjsKIAogCWlmICghKHNjYWxhciAmIFNDQUxBUl9OT19QUzEpKQotCQlmdW5jKCZ0LCAmcXByW3JlZ19vdXRdLCAmcHMxX2luMSwgJnBzMV9pbjIsICZwczFfaW4zKTsKKwkJZnVuYygmdmNwdS0+YXJjaC5mcHNjciwgJnFwcltyZWdfb3V0XSwgJnBzMV9pbjEsICZwczFfaW4yLCAmcHMxX2luMyk7CiAKIAlkcHJpbnRrKEtFUk5fSU5GTyAiUFMzIHBzMSAtPiBmKDB4JXgsIDB4JXgsIDB4JXgpID0gMHgleFxuIiwKIAkJCSAgcHMxX2luMSwgcHMxX2luMiwgcHMxX2luMywgcXByW3JlZ19vdXRdKTsKQEAgLTU2OCw3ICs1NTEsNyBAQAogc3RhdGljIGludCBrdm1wcGNfcHNfdHdvX2luKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCByYywKIAkJCQkgICAgaW50IHJlZ19vdXQsIGludCByZWdfaW4xLCBpbnQgcmVnX2luMiwKIAkJCQkgICAgaW50IHNjYWxhciwKLQkJCQkgICAgdm9pZCAoKmZ1bmMpKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LAorCQkJCSAgICB2b2lkICgqZnVuYykodTY0ICpmcHNjciwKIAkJCQkJCSB1MzIgKmRzdCwgdTMyICpzcmMxLAogCQkJCQkJIHUzMiAqc3JjMikpCiB7CkBAIC01NzgsMjcgKzU2MSwyNSBAQAogCXUzMiBwczBfaW4xLCBwczBfaW4yOwogCXUzMiBwczFfb3V0OwogCXUzMiBwczFfaW4xLCBwczFfaW4yOwotCXN0cnVjdCB0aHJlYWRfc3RydWN0IHQ7Ci0JdC5mcHNjci52YWwgPSB2Y3B1LT5hcmNoLmZwc2NyOwogCiAJLyogUkMgKi8KIAlXQVJOX09OKHJjKTsKIAogCS8qIFBTMCAqLwotCWN2dF9kZigoZG91YmxlKikmZnByW3JlZ19pbjFdLCAoZmxvYXQqKSZwczBfaW4xLCAmdCk7CisJa3ZtX2N2dF9kZigmZnByW3JlZ19pbjFdLCAmcHMwX2luMSwgJnZjcHUtPmFyY2guZnBzY3IpOwogCiAJaWYgKHNjYWxhciAmIFNDQUxBUl9MT1cpCiAJCXBzMF9pbjIgPSBxcHJbcmVnX2luMl07CiAJZWxzZQotCQljdnRfZGYoKGRvdWJsZSopJmZwcltyZWdfaW4yXSwgKGZsb2F0KikmcHMwX2luMiwgJnQpOworCQlrdm1fY3Z0X2RmKCZmcHJbcmVnX2luMl0sICZwczBfaW4yLCAmdmNwdS0+YXJjaC5mcHNjcik7CiAKLQlmdW5jKCZ0LCAmcHMwX291dCwgJnBzMF9pbjEsICZwczBfaW4yKTsKKwlmdW5jKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmcHMwX291dCwgJnBzMF9pbjEsICZwczBfaW4yKTsKIAogCWlmICghKHNjYWxhciAmIFNDQUxBUl9OT19QUzApKSB7CiAJCWRwcmludGsoS0VSTl9JTkZPICJQUzIgcHMwIC0+IGYoMHgleCwgMHgleCkgPSAweCV4XG4iLAogCQkJCSAgcHMwX2luMSwgcHMwX2luMiwgcHMwX291dCk7CiAKLQkJY3Z0X2ZkKChmbG9hdCopJnBzMF9vdXQsIChkb3VibGUqKSZmcHJbcmVnX291dF0sICZ0KTsKKwkJa3ZtX2N2dF9mZCgmcHMwX291dCwgJmZwcltyZWdfb3V0XSwgJnZjcHUtPmFyY2guZnBzY3IpOwogCX0KIAogCS8qIFBTMSAqLwpAQCAtNjA4LDcgKzU4OSw3IEBACiAJaWYgKHNjYWxhciAmIFNDQUxBUl9ISUdIKQogCQlwczFfaW4yID0gcHMwX2luMjsKIAotCWZ1bmMoJnQsICZwczFfb3V0LCAmcHMxX2luMSwgJnBzMV9pbjIpOworCWZ1bmMoJnZjcHUtPmFyY2guZnBzY3IsICZwczFfb3V0LCAmcHMxX2luMSwgJnBzMV9pbjIpOwogCiAJaWYgKCEoc2NhbGFyICYgU0NBTEFSX05PX1BTMSkpIHsKIAkJcXByW3JlZ19vdXRdID0gcHMxX291dDsKQEAgLTYyMiwzMSArNjAzLDI5IEBACiAKIHN0YXRpYyBpbnQga3ZtcHBjX3BzX29uZV9pbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgcmMsCiAJCQkJICAgIGludCByZWdfb3V0LCBpbnQgcmVnX2luLAotCQkJCSAgICB2b2lkICgqZnVuYykoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQsCisJCQkJICAgIHZvaWQgKCpmdW5jKSh1NjQgKnQsCiAJCQkJCQkgdTMyICpkc3QsIHUzMiAqc3JjMSkpCiB7CiAJdTMyICpxcHIgPSB2Y3B1LT5hcmNoLnFwcjsKIAl1NjQgKmZwciA9IHZjcHUtPmFyY2guZnByOwogCXUzMiBwczBfb3V0LCBwczBfaW47CiAJdTMyIHBzMV9pbjsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB0OwotCXQuZnBzY3IudmFsID0gdmNwdS0+YXJjaC5mcHNjcjsKIAogCS8qIFJDICovCiAJV0FSTl9PTihyYyk7CiAKIAkvKiBQUzAgKi8KLQljdnRfZGYoKGRvdWJsZSopJmZwcltyZWdfaW5dLCAoZmxvYXQqKSZwczBfaW4sICZ0KTsKLQlmdW5jKCZ0LCAmcHMwX291dCwgJnBzMF9pbik7CisJa3ZtX2N2dF9kZigmZnByW3JlZ19pbl0sICZwczBfaW4sICZ2Y3B1LT5hcmNoLmZwc2NyKTsKKwlmdW5jKCZ2Y3B1LT5hcmNoLmZwc2NyLCAmcHMwX291dCwgJnBzMF9pbik7CiAKIAlkcHJpbnRrKEtFUk5fSU5GTyAiUFMxIHBzMCAtPiBmKDB4JXgpID0gMHgleFxuIiwKIAkJCSAgcHMwX2luLCBwczBfb3V0KTsKIAotCWN2dF9mZCgoZmxvYXQqKSZwczBfb3V0LCAoZG91YmxlKikmZnByW3JlZ19vdXRdLCAmdCk7CisJa3ZtX2N2dF9mZCgmcHMwX291dCwgJmZwcltyZWdfb3V0XSwgJnZjcHUtPmFyY2guZnBzY3IpOwogCiAJLyogUFMxICovCiAJcHMxX2luID0gcXByW3JlZ19pbl07Ci0JZnVuYygmdCwgJnFwcltyZWdfb3V0XSwgJnBzMV9pbik7CisJZnVuYygmdmNwdS0+YXJjaC5mcHNjciwgJnFwcltyZWdfb3V0XSwgJnBzMV9pbik7CiAKIAlkcHJpbnRrKEtFUk5fSU5GTyAiUFMxIHBzMSAtPiBmKDB4JXgpID0gMHgleFxuIiwKIAkJCSAgcHMxX2luLCBxcHJbcmVnX291dF0pOwpAQCAtNjcyLDEzICs2NTEsMTAgQEAKIAogCWJvb2wgcmNvbXAgPSAoaW5zdCAmIDEpID8gdHJ1ZSA6IGZhbHNlOwogCXUzMiBjciA9IGt2bXBwY19nZXRfY3IodmNwdSk7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgdDsKICNpZmRlZiBERUJVRwogCWludCBpOwogI2VuZGlmCiAKLQl0LmZwc2NyLnZhbCA9IHZjcHUtPmFyY2guZnBzY3I7Ci0KIAlpZiAoIWt2bXBwY19pbnN0X2lzX3BhaXJlZF9zaW5nbGUodmNwdSwgaW5zdCkpCiAJCXJldHVybiBFTVVMQVRFX0ZBSUw7CiAKQEAgLTY5NSw3ICs2NzEsNyBAQAogI2lmZGVmIERFQlVHCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC5mcHIpOyBpKyspIHsKIAkJdTMyIGY7Ci0JCWN2dF9kZigoZG91YmxlKikmdmNwdS0+YXJjaC5mcHJbaV0sIChmbG9hdCopJmYsICZ0KTsKKwkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbaV0sICZmLCAmdmNwdS0+YXJjaC5mcHNjcik7CiAJCWRwcmludGsoS0VSTl9JTkZPICJGUFJbJWRdID0gMHgleCAvIDB4JWxseCAgICBRUFJbJWRdID0gMHgleFxuIiwKIAkJCWksIGYsIHZjcHUtPmFyY2guZnByW2ldLCBpLCB2Y3B1LT5hcmNoLnFwcltpXSk7CiAJfQpAQCAtODE5LDggKzc5NSw5IEBACiAJCQlXQVJOX09OKHJjb21wKTsKIAkJCXZjcHUtPmFyY2guZnByW2F4X3JkXSA9IHZjcHUtPmFyY2guZnByW2F4X3JhXTsKIAkJCS8qIHZjcHUtPmFyY2gucXByW2F4X3JkXSA9IHZjcHUtPmFyY2guZnByW2F4X3JiXTsgKi8KLQkJCWN2dF9kZigoZG91YmxlKikmdmNwdS0+YXJjaC5mcHJbYXhfcmJdLAotCQkJICAgICAgIChmbG9hdCopJnZjcHUtPmFyY2gucXByW2F4X3JkXSwgJnQpOworCQkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbYXhfcmJdLAorCQkJCSAgICZ2Y3B1LT5hcmNoLnFwcltheF9yZF0sCisJCQkJICAgJnZjcHUtPmFyY2guZnBzY3IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfTUVSR0UwMToKIAkJCVdBUk5fT04ocmNvbXApOwpAQCAtODMwLDE3ICs4MDcsMjAgQEAKIAkJY2FzZSBPUF80WF9QU19NRVJHRTEwOgogCQkJV0FSTl9PTihyY29tcCk7CiAJCQkvKiB2Y3B1LT5hcmNoLmZwcltheF9yZF0gPSB2Y3B1LT5hcmNoLnFwcltheF9yYV07ICovCi0JCQljdnRfZmQoKGZsb2F0KikmdmNwdS0+YXJjaC5xcHJbYXhfcmFdLAotCQkJICAgICAgIChkb3VibGUqKSZ2Y3B1LT5hcmNoLmZwcltheF9yZF0sICZ0KTsKKwkJCWt2bV9jdnRfZmQoJnZjcHUtPmFyY2gucXByW2F4X3JhXSwKKwkJCQkgICAmdmNwdS0+YXJjaC5mcHJbYXhfcmRdLAorCQkJCSAgICZ2Y3B1LT5hcmNoLmZwc2NyKTsKIAkJCS8qIHZjcHUtPmFyY2gucXByW2F4X3JkXSA9IHZjcHUtPmFyY2guZnByW2F4X3JiXTsgKi8KLQkJCWN2dF9kZigoZG91YmxlKikmdmNwdS0+YXJjaC5mcHJbYXhfcmJdLAotCQkJICAgICAgIChmbG9hdCopJnZjcHUtPmFyY2gucXByW2F4X3JkXSwgJnQpOworCQkJa3ZtX2N2dF9kZigmdmNwdS0+YXJjaC5mcHJbYXhfcmJdLAorCQkJCSAgICZ2Y3B1LT5hcmNoLnFwcltheF9yZF0sCisJCQkJICAgJnZjcHUtPmFyY2guZnBzY3IpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BfNFhfUFNfTUVSR0UxMToKIAkJCVdBUk5fT04ocmNvbXApOwogCQkJLyogdmNwdS0+YXJjaC5mcHJbYXhfcmRdID0gdmNwdS0+YXJjaC5xcHJbYXhfcmFdOyAqLwotCQkJY3Z0X2ZkKChmbG9hdCopJnZjcHUtPmFyY2gucXByW2F4X3JhXSwKLQkJCSAgICAgICAoZG91YmxlKikmdmNwdS0+YXJjaC5mcHJbYXhfcmRdLCAmdCk7CisJCQlrdm1fY3Z0X2ZkKCZ2Y3B1LT5hcmNoLnFwcltheF9yYV0sCisJCQkJICAgJnZjcHUtPmFyY2guZnByW2F4X3JkXSwKKwkJCQkgICAmdmNwdS0+YXJjaC5mcHNjcik7CiAJCQl2Y3B1LT5hcmNoLnFwcltheF9yZF0gPSB2Y3B1LT5hcmNoLnFwcltheF9yYl07CiAJCQlicmVhazsKIAkJfQpAQCAtMTI3NSw3ICsxMjU1LDcgQEAKICNpZmRlZiBERUJVRwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZjcHUtPmFyY2guZnByKTsgaSsrKSB7CiAJCXUzMiBmOwotCQljdnRfZGYoKGRvdWJsZSopJnZjcHUtPmFyY2guZnByW2ldLCAoZmxvYXQqKSZmLCAmdCk7CisJCWt2bV9jdnRfZGYoJnZjcHUtPmFyY2guZnByW2ldLCAmZiwgJnZjcHUtPmFyY2guZnBzY3IpOwogCQlkcHJpbnRrKEtFUk5fSU5GTyAiRlBSWyVkXSA9IDB4JXhcbiIsIGksIGYpOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCmluZGV4IGEzM2FiOGMuLjhkNGUzNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwcmlvcml0eSkKIHsKIAlpbnQgYWxsb3dlZCA9IDA7Ci0JdWxvbmcgbXNyX21hc2s7CisJdWxvbmcgdW5pbml0aWFsaXplZF92YXIobXNyX21hc2spOwogCWJvb2wgdXBkYXRlX2VzciA9IGZhbHNlLCB1cGRhdGVfZGVhciA9IGZhbHNlOwogCiAJc3dpdGNoIChwcmlvcml0eSkgewpAQCAtNDg1LDggKzQ4NSw2IEBACiB7CiAJaW50IGk7CiAKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlyZWdzLT5wYyA9IHZjcHUtPmFyY2gucGM7CiAJcmVncy0+Y3IgPSBrdm1wcGNfZ2V0X2NyKHZjcHUpOwogCXJlZ3MtPmN0ciA9IHZjcHUtPmFyY2guY3RyOwpAQCAtNTA3LDggKzUwNSw2IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVncy0+Z3ByKTsgaSsrKQogCQlyZWdzLT5ncHJbaV0gPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCBpKTsKIAotCXZjcHVfcHV0KHZjcHUpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxNiw4ICs1MTIsNiBAQAogewogCWludCBpOwogCi0JdmNwdV9sb2FkKHZjcHUpOwotCiAJdmNwdS0+YXJjaC5wYyA9IHJlZ3MtPnBjOwogCWt2bXBwY19zZXRfY3IodmNwdSwgcmVncy0+Y3IpOwogCXZjcHUtPmFyY2guY3RyID0gcmVncy0+Y3RyOwpAQCAtNTM3LDggKzUzMSw2IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVncy0+Z3ByKTsgaSsrKQogCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCBpLCByZWdzLT5ncHJbaV0pOwogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTY5LDkgKzU2MSw3IEBACiB7CiAJaW50IHI7CiAKLQl2Y3B1X2xvYWQodmNwdSk7CiAJciA9IGt2bXBwY19jb3JlX3ZjcHVfdHJhbnNsYXRlKHZjcHUsIHRyKTsKLQl2Y3B1X3B1dCh2Y3B1KTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9mcHUuUyBiL2FyY2gvcG93ZXJwYy9rdm0vZnB1LlMKaW5kZXggMmIzNDBhMy4uY2IzNGJiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9mcHUuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2ZwdS5TCkBAIC0yNzEsMyArMjcxLDIxIEBACiBGUERfVEhSRUVfSU4oZm1hZGQpCiBGUERfVEhSRUVfSU4oZm5tc3ViKQogRlBEX1RIUkVFX0lOKGZubWFkZCkKKworX0dMT0JBTChrdm1fY3Z0X2ZkKQorCWxmZAkwLDAocjUpCQkJLyogbG9hZCB1cCBmcHNjciB2YWx1ZSAqLworCU1URlNGX0woMCkKKwlsZnMJMCwwKHIzKQorCXN0ZmQJMCwwKHI0KQorCW1mZnMJMAorCXN0ZmQJMCwwKHI1KQkJCS8qIHNhdmUgbmV3IGZwc2NyIHZhbHVlICovCisJYmxyCisKK19HTE9CQUwoa3ZtX2N2dF9kZikKKwlsZmQJMCwwKHI1KQkJCS8qIGxvYWQgdXAgZnBzY3IgdmFsdWUgKi8KKwlNVEZTRl9MKDApCisJbGZkCTAsMChyMykKKwlzdGZzCTAsMChyNCkKKwltZmZzCTAKKwlzdGZkCTAsMChyNSkJCQkvKiBzYXZlIG5ldyBmcHNjciB2YWx1ZSAqLworCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMgYi9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYwppbmRleCA5Yjg2ODNmLi43MmE0YWQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYwpAQCAtMzYsMTEgKzM2LDYgQEAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgInRyYWNlLmgiCiAKLWdmbl90IHVuYWxpYXNfZ2ZuKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQotewotCXJldHVybiBnZm47Ci19Ci0KIGludCBrdm1fYXJjaF92Y3B1X3J1bm5hYmxlKHN0cnVjdCBrdm1fdmNwdSAqdikKIHsKIAlyZXR1cm4gISh2LT5hcmNoLm1zciAmIE1TUl9XRSkgfHwgISEodi0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpOwpAQCAtMjg3LDcgKzI4Miw3IEBACiBzdGF0aWMgdm9pZCBrdm1wcGNfY29tcGxldGVfbW1pb19sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9ydW4gKnJ1bikKIHsKLQl1NjQgZ3ByOworCXU2NCB1bmluaXRpYWxpemVkX3ZhcihncHIpOwogCiAJaWYgKHJ1bi0+bW1pby5sZW4gPiBzaXplb2YoZ3ByKSkgewogCQlwcmludGsoS0VSTl9FUlIgImJhZCBNTUlPIGxlbmd0aDogJWRcbiIsIHJ1bi0+bW1pby5sZW4pOwpAQCAtNDIzLDggKzQxOCw2IEBACiAJaW50IHI7CiAJc2lnc2V0X3Qgc2lnc2F2ZWQ7CiAKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlpZiAodmNwdS0+c2lnc2V0X2FjdGl2ZSkKIAkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZ2Y3B1LT5zaWdzZXQsICZzaWdzYXZlZCk7CiAKQEAgLTQ1Niw4ICs0NDksNiBAQAogCWlmICh2Y3B1LT5zaWdzZXRfYWN0aXZlKQogCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3NhdmVkLCBOVUxMKTsKIAotCXZjcHVfcHV0KHZjcHUpOwotCiAJcmV0dXJuIHI7CiB9CiAKQEAgLTUyMyw4ICs1MTQsOSBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmlycSwgYXJncCwgc2l6ZW9mKGlycSkpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fdmNwdV9pb2N0bF9pbnRlcnJ1cHQodmNwdSwgJmlycSk7Ci0JCWJyZWFrOworCQlnb3RvIG91dDsKIAl9CisKIAljYXNlIEtWTV9FTkFCTEVfQ0FQOgogCXsKIAkJc3RydWN0IGt2bV9lbmFibGVfY2FwIGNhcDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vdGltaW5nLmMgYi9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5jCmluZGV4IDcwMzc4NTUuLjQ2ZmEwNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vdGltaW5nLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS90aW1pbmcuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJfQogCiAJaWYgKGMgPT0gJ2MnKSB7Ci0JCXN0cnVjdCBzZXFfZmlsZSAqc2VxZiA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCXN0cnVjdCBzZXFfZmlsZSAqc2VxZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gc2VxZi0+cHJpdmF0ZTsKIAkJLyogV3JpdGUgZG9lcyBub3QgYWZmZWN0IG91ciBidWZmZXJzIHByZXZpb3VzbHkgZ2VuZXJhdGVkIHdpdGgKIAkJICogc2hvdy4gc2VxX2ZpbGUgaXMgbG9ja2VkIGhlcmUgdG8gcHJldmVudCByYWNlcyBvZiBpbml0IHdpdGgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCmluZGV4IDExMWRhMWMuLjViYjg5YzgyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKQEAgLTE4LDggKzE4LDkgQEAKIAogb2JqLSQoQ09ORklHX1BQQzY0KQkrPSBjb3B5cGFnZV82NC5vIGNvcHl1c2VyXzY0Lm8gXAogCQkJICAgbWVtY3B5XzY0Lm8gdXNlcmNvcHlfNjQubyBtZW1fNjQubyBzdHJpbmcubwotb2JqLSQoQ09ORklHX1hNT04pCSs9IHNzdGVwLm8KLW9iai0kKENPTkZJR19LUFJPQkVTKQkrPSBzc3RlcC5vCitvYmotJChDT05GSUdfWE1PTikJKz0gc3N0ZXAubyBsZHN0ZnAubworb2JqLSQoQ09ORklHX0tQUk9CRVMpCSs9IHNzdGVwLm8gbGRzdGZwLm8KK29iai0kKENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQpCSs9IHNzdGVwLm8gbGRzdGZwLm8KIAogaWZlcSAoJChDT05GSUdfUFBDNjQpLHkpCiBvYmotJChDT05GSUdfU01QKQkrPSBsb2Nrcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2xkc3RmcC5TIGIvYXJjaC9wb3dlcnBjL2xpYi9sZHN0ZnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ0ODYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9sZHN0ZnAuUwpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIEZsb2F0aW5nLXBvaW50LCBWTVgvQWx0aXZlYyBhbmQgVlNYIGxvYWRzIGFuZCBzdG9yZXMKKyAqIGZvciB1c2UgaW4gaW5zdHJ1Y3Rpb24gZW11bGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDEwIFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycC4gPHBhdWx1c0BhdTEuaWJtLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1vcGNvZGUuaD4KKyNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2RlZmluZSBTVEtGUk0JKFBQQ19NSU5fU1RLRlJNICsgMTYpCisKKwkubWFjcm8JZXh0YWIJaW5zdHIsaGFuZGxlcgorCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJUFBDX0xPTkcgXGluc3RyLFxoYW5kbGVyCisJLnByZXZpb3VzCisJLmVuZG0KKworCS5tYWNybwlpbnN0MzIJb3AKK3JlZyA9IDAKKwkucmVwdAkzMgorMjA6CVxvcAlyZWcsMCxyNAorCWIJM2YKKwlleHRhYgkyMGIsOTlmCityZWcgPSByZWcgKyAxCisJLmVuZHIKKwkuZW5kbQorCisvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIGZyTiBpbnRvIGZyMDsgTiBpcyBpbiByMy4gKi8KK19HTE9CQUwoZ2V0X2ZwcikKKwltZmxyCXIwCisJcmx3aW5tCXIzLHIzLDMsMHhmOAorCWJjbAkyMCwzMSwxZgorCWJscgkJCS8qIGZyMCBpcyBhbHJlYWR5IGluIGZyMCAqLworCW5vcAorcmVnID0gMQorCS5yZXB0CTMxCisJZm1yCWZyMCxyZWcKKwlibHIKK3JlZyA9IHJlZyArIDEKKwkuZW5kcgorMToJbWZscglyNQorCWFkZAlyNSxyMyxyNQorCW10Y3RyCXI1CisJbXRscglyMAorCWJjdHIKKworLyogUHV0IHRoZSBjb250ZW50cyBvZiBmcjAgaW50byBmck47IE4gaXMgaW4gcjMuICovCitfR0xPQkFMKHB1dF9mcHIpCisJbWZscglyMAorCXJsd2lubQlyMyxyMywzLDB4ZjgKKwliY2wJMjAsMzEsMWYKKwlibHIJCQkvKiBmcjAgaXMgYWxyZWFkeSBpbiBmcjAgKi8KKwlub3AKK3JlZyA9IDEKKwkucmVwdAkzMQorCWZtcglyZWcsZnIwCisJYmxyCityZWcgPSByZWcgKyAxCisJLmVuZHIKKzE6CW1mbHIJcjUKKwlhZGQJcjUscjMscjUKKwltdGN0cglyNQorCW10bHIJcjAKKwliY3RyCisKKy8qIExvYWQgRlAgcmVnIE4gZnJvbSBmbG9hdCBhdCAqcC4gIE4gaXMgaW4gcjMsIHAgaW4gcjQuICovCitfR0xPQkFMKGRvX2xmcykKKwlQUENfU1RMVSByMSwtU1RLRlJNKHIxKQorCW1mbHIJcjAKKwlQUENfU1RMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW1mbXNyCXI2CisJb3JpCXI3LHI2LE1TUl9GUAorCWNtcHdpCWNyNyxyMywwCisJbXRtc3JkCXI3CisJaXN5bmMKKwliZXEJY3I3LDFmCisJc3RmZAlmcjAsU1RLRlJNLTE2KHIxKQorMToJbGkJcjksLUVGQVVMVAorMjoJbGZzCWZyMCwwKHI0KQorCWxpCXI5LDAKKzM6CWJsCXB1dF9mcHIKKwliZXEJY3I3LDRmCisJbGZkCWZyMCxTVEtGUk0tMTYocjEpCis0OglQUENfTEwJcjAsU1RLRlJNK1BQQ19MUl9TVEtPRkYocjEpCisJbXRscglyMAorCW10bXNyZAlyNgorCWlzeW5jCisJbXIJcjMscjkKKwlhZGRpCXIxLHIxLFNUS0ZSTQorCWJscgorCWV4dGFiCTJiLDNiCisKKy8qIExvYWQgRlAgcmVnIE4gZnJvbSBkb3VibGUgYXQgKnAuICBOIGlzIGluIHIzLCBwIGluIHI0LiAqLworX0dMT0JBTChkb19sZmQpCisJUFBDX1NUTFUgcjEsLVNUS0ZSTShyMSkKKwltZmxyCXIwCisJUFBDX1NUTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltZm1zcglyNgorCW9yaQlyNyxyNixNU1JfRlAKKwljbXB3aQljcjcscjMsMAorCW10bXNyZAlyNworCWlzeW5jCisJYmVxCWNyNywxZgorCXN0ZmQJZnIwLFNUS0ZSTS0xNihyMSkKKzE6CWxpCXI5LC1FRkFVTFQKKzI6CWxmZAlmcjAsMChyNCkKKwlsaQlyOSwwCiszOgliZXEJY3I3LDRmCisJYmwJcHV0X2ZwcgorCWxmZAlmcjAsU1RLRlJNLTE2KHIxKQorNDoJUFBDX0xMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW10bHIJcjAKKwltdG1zcmQJcjYKKwlpc3luYworCW1yCXIzLHI5CisJYWRkaQlyMSxyMSxTVEtGUk0KKwlibHIKKwlleHRhYgkyYiwzYgorCisvKiBTdG9yZSBGUCByZWcgTiB0byBmbG9hdCBhdCAqcC4gIE4gaXMgaW4gcjMsIHAgaW4gcjQuICovCitfR0xPQkFMKGRvX3N0ZnMpCisJUFBDX1NUTFUgcjEsLVNUS0ZSTShyMSkKKwltZmxyCXIwCisJUFBDX1NUTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltZm1zcglyNgorCW9yaQlyNyxyNixNU1JfRlAKKwljbXB3aQljcjcscjMsMAorCW10bXNyZAlyNworCWlzeW5jCisJYmVxCWNyNywxZgorCXN0ZmQJZnIwLFNUS0ZSTS0xNihyMSkKKwlibAlnZXRfZnByCisxOglsaQlyOSwtRUZBVUxUCisyOglzdGZzCWZyMCwwKHI0KQorCWxpCXI5LDAKKzM6CWJlcQljcjcsNGYKKwlsZmQJZnIwLFNUS0ZSTS0xNihyMSkKKzQ6CVBQQ19MTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltdGxyCXIwCisJbXRtc3JkCXI2CisJaXN5bmMKKwltcglyMyxyOQorCWFkZGkJcjEscjEsU1RLRlJNCisJYmxyCisJZXh0YWIJMmIsM2IKKworLyogU3RvcmUgRlAgcmVnIE4gdG8gZG91YmxlIGF0ICpwLiAgTiBpcyBpbiByMywgcCBpbiByNC4gKi8KK19HTE9CQUwoZG9fc3RmZCkKKwlQUENfU1RMVSByMSwtU1RLRlJNKHIxKQorCW1mbHIJcjAKKwlQUENfU1RMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW1mbXNyCXI2CisJb3JpCXI3LHI2LE1TUl9GUAorCWNtcHdpCWNyNyxyMywwCisJbXRtc3JkCXI3CisJaXN5bmMKKwliZXEJY3I3LDFmCisJc3RmZAlmcjAsU1RLRlJNLTE2KHIxKQorCWJsCWdldF9mcHIKKzE6CWxpCXI5LC1FRkFVTFQKKzI6CXN0ZmQJZnIwLDAocjQpCisJbGkJcjksMAorMzoJYmVxCWNyNyw0ZgorCWxmZAlmcjAsU1RLRlJNLTE2KHIxKQorNDoJUFBDX0xMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW10bHIJcjAKKwltdG1zcmQJcjYKKwlpc3luYworCW1yCXIzLHI5CisJYWRkaQlyMSxyMSxTVEtGUk0KKwlibHIKKwlleHRhYgkyYiwzYgorCisjaWZkZWYgQ09ORklHX0FMVElWRUMKKy8qIEdldCB0aGUgY29udGVudHMgb2YgdnJOIGludG8gdnIwOyBOIGlzIGluIHIzLiAqLworX0dMT0JBTChnZXRfdnIpCisJbWZscglyMAorCXJsd2lubQlyMyxyMywzLDB4ZjgKKwliY2wJMjAsMzEsMWYKKwlibHIJCQkvKiB2cjAgaXMgYWxyZWFkeSBpbiB2cjAgKi8KKwlub3AKK3JlZyA9IDEKKwkucmVwdAkzMQorCXZvcgl2cjAscmVnLHJlZwkvKiBhc3NlbWJsZXIgZG9lc24ndCBrbm93IHZtcj8gKi8KKwlibHIKK3JlZyA9IHJlZyArIDEKKwkuZW5kcgorMToJbWZscglyNQorCWFkZAlyNSxyMyxyNQorCW10Y3RyCXI1CisJbXRscglyMAorCWJjdHIKKworLyogUHV0IHRoZSBjb250ZW50cyBvZiB2cjAgaW50byB2ck47IE4gaXMgaW4gcjMuICovCitfR0xPQkFMKHB1dF92cikKKwltZmxyCXIwCisJcmx3aW5tCXIzLHIzLDMsMHhmOAorCWJjbAkyMCwzMSwxZgorCWJscgkJCS8qIHZyMCBpcyBhbHJlYWR5IGluIHZyMCAqLworCW5vcAorcmVnID0gMQorCS5yZXB0CTMxCisJdm9yCXJlZyx2cjAsdnIwCisJYmxyCityZWcgPSByZWcgKyAxCisJLmVuZHIKKzE6CW1mbHIJcjUKKwlhZGQJcjUscjMscjUKKwltdGN0cglyNQorCW10bHIJcjAKKwliY3RyCisKKy8qIExvYWQgdmVjdG9yIHJlZyBOIGZyb20gKnAuICBOIGlzIGluIHIzLCBwIGluIHI0LiAqLworX0dMT0JBTChkb19sdngpCisJUFBDX1NUTFUgcjEsLVNUS0ZSTShyMSkKKwltZmxyCXIwCisJUFBDX1NUTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltZm1zcglyNgorCW9yaXMJcjcscjYsTVNSX1ZFQ0BoCisJY21wd2kJY3I3LHIzLDAKKwlsaQlyOCxTVEtGUk0tMTYKKwltdG1zcmQJcjcKKwlpc3luYworCWJlcQljcjcsMWYKKwlzdHZ4CXZyMCxyMSxyOAorMToJbGkJcjksLUVGQVVMVAorMjoJbHZ4CXZyMCwwLHI0CisJbGkJcjksMAorMzoJYmVxCWNyNyw0ZgorCWJsCXB1dF92cgorCWx2eAl2cjAscjEscjgKKzQ6CVBQQ19MTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltdGxyCXIwCisJbXRtc3JkCXI2CisJaXN5bmMKKwltcglyMyxyOQorCWFkZGkJcjEscjEsU1RLRlJNCisJYmxyCisJZXh0YWIJMmIsM2IKKworLyogU3RvcmUgdmVjdG9yIHJlZyBOIHRvICpwLiAgTiBpcyBpbiByMywgcCBpbiByNC4gKi8KK19HTE9CQUwoZG9fc3R2eCkKKwlQUENfU1RMVSByMSwtU1RLRlJNKHIxKQorCW1mbHIJcjAKKwlQUENfU1RMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW1mbXNyCXI2CisJb3JpcwlyNyxyNixNU1JfVkVDQGgKKwljbXB3aQljcjcscjMsMAorCWxpCXI4LFNUS0ZSTS0xNgorCW10bXNyZAlyNworCWlzeW5jCisJYmVxCWNyNywxZgorCXN0dngJdnIwLHIxLHI4CisJYmwJZ2V0X3ZyCisxOglsaQlyOSwtRUZBVUxUCisyOglzdHZ4CXZyMCwwLHI0CisJbGkJcjksMAorMzoJYmVxCWNyNyw0ZgorCWx2eAl2cjAscjEscjgKKzQ6CVBQQ19MTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltdGxyCXIwCisJbXRtc3JkCXI2CisJaXN5bmMKKwltcglyMyxyOQorCWFkZGkJcjEscjEsU1RLRlJNCisJYmxyCisJZXh0YWIJMmIsM2IKKyNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLworCisjaWZkZWYgQ09ORklHX1ZTWAorLyogR2V0IHRoZSBjb250ZW50cyBvZiB2c3JOIGludG8gdnNyMDsgTiBpcyBpbiByMy4gKi8KK19HTE9CQUwoZ2V0X3ZzcikKKwltZmxyCXIwCisJcmx3aW5tCXIzLHIzLDMsMHgxZjgKKwliY2wJMjAsMzEsMWYKKwlibHIJCQkvKiB2c3IwIGlzIGFscmVhZHkgaW4gdnNyMCAqLworCW5vcAorcmVnID0gMQorCS5yZXB0CTYzCisJWFhMT1IoMCxyZWcscmVnKQorCWJscgorcmVnID0gcmVnICsgMQorCS5lbmRyCisxOgltZmxyCXI1CisJYWRkCXI1LHIzLHI1CisJbXRjdHIJcjUKKwltdGxyCXIwCisJYmN0cgorCisvKiBQdXQgdGhlIGNvbnRlbnRzIG9mIHZzcjAgaW50byB2c3JOOyBOIGlzIGluIHIzLiAqLworX0dMT0JBTChwdXRfdnNyKQorCW1mbHIJcjAKKwlybHdpbm0JcjMscjMsMywweDFmOAorCWJjbAkyMCwzMSwxZgorCWJscgkJCS8qIHZyMCBpcyBhbHJlYWR5IGluIHZyMCAqLworCW5vcAorcmVnID0gMQorCS5yZXB0CTYzCisJWFhMT1IocmVnLDAsMCkKKwlibHIKK3JlZyA9IHJlZyArIDEKKwkuZW5kcgorMToJbWZscglyNQorCWFkZAlyNSxyMyxyNQorCW10Y3RyCXI1CisJbXRscglyMAorCWJjdHIKKworLyogTG9hZCBWU1ggcmVnIE4gZnJvbSB2ZWN0b3IgZG91Ymxld29yZCAqcC4gIE4gaXMgaW4gcjMsIHAgaW4gcjQuICovCitfR0xPQkFMKGRvX2x4dmQyeCkKKwlQUENfU1RMVSByMSwtU1RLRlJNKHIxKQorCW1mbHIJcjAKKwlQUENfU1RMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW1mbXNyCXI2CisJb3JpcwlyNyxyNixNU1JfVlNYQGgKKwljbXB3aQljcjcscjMsMAorCWxpCXI4LFNUS0ZSTS0xNgorCW10bXNyZAlyNworCWlzeW5jCisJYmVxCWNyNywxZgorCVNUWFZEMlgoMCxyMSxyOCkKKzE6CWxpCXI5LC1FRkFVTFQKKzI6CUxYVkQyWCgwLDAscjQpCisJbGkJcjksMAorMzoJYmVxCWNyNyw0ZgorCWJsCXB1dF92c3IKKwlMWFZEMlgoMCxyMSxyOCkKKzQ6CVBQQ19MTAlyMCxTVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwltdGxyCXIwCisJbXRtc3JkCXI2CisJaXN5bmMKKwltcglyMyxyOQorCWFkZGkJcjEscjEsU1RLRlJNCisJYmxyCisJZXh0YWIJMmIsM2IKKworLyogU3RvcmUgVlNYIHJlZyBOIHRvIHZlY3RvciBkb3VibGV3b3JkICpwLiAgTiBpcyBpbiByMywgcCBpbiByNC4gKi8KK19HTE9CQUwoZG9fc3R4dmQyeCkKKwlQUENfU1RMVSByMSwtU1RLRlJNKHIxKQorCW1mbHIJcjAKKwlQUENfU1RMCXIwLFNUS0ZSTStQUENfTFJfU1RLT0ZGKHIxKQorCW1mbXNyCXI2CisJb3JpcwlyNyxyNixNU1JfVlNYQGgKKwljbXB3aQljcjcscjMsMAorCWxpCXI4LFNUS0ZSTS0xNgorCW10bXNyZAlyNworCWlzeW5jCisJYmVxCWNyNywxZgorCVNUWFZEMlgoMCxyMSxyOCkKKwlibAlnZXRfdnNyCisxOglsaQlyOSwtRUZBVUxUCisyOglTVFhWRDJYKDAsMCxyNCkKKwlsaQlyOSwwCiszOgliZXEJY3I3LDRmCisJTFhWRDJYKDAscjEscjgpCis0OglQUENfTEwJcjAsU1RLRlJNK1BQQ19MUl9TVEtPRkYocjEpCisJbXRscglyMAorCW10bXNyZAlyNgorCWlzeW5jCisJbXIJcjMscjkKKwlhZGRpCXIxLHIxLFNUS0ZSTQorCWJscgorCWV4dGFiCTJiLDNiCisKKyNlbmRpZiAvKiBDT05GSUdfVlNYICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMgYi9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMKaW5kZXggMTNiN2Q1NC4uZTBhOTg1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvc3N0ZXAuYwpAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogCiBleHRlcm4gY2hhciBzeXN0ZW1fY2FsbF9jb21tb25bXTsKIApAQCAtMjMsNiArMjUsMjMgQEAKICNkZWZpbmUgTVNSX01BU0sJMHg4N2MwZmZmZgogI2VuZGlmCiAKKy8qIEJpdHMgaW4gWEVSICovCisjZGVmaW5lIFhFUl9TTwkJMHg4MDAwMDAwMFUKKyNkZWZpbmUgWEVSX09WCQkweDQwMDAwMDAwVQorI2RlZmluZSBYRVJfQ0EJCTB4MjAwMDAwMDBVCisKKy8qCisgKiBGdW5jdGlvbnMgaW4gbGRzdGZwLlMKKyAqLworZXh0ZXJuIGludCBkb19sZnMoaW50IHJuLCB1bnNpZ25lZCBsb25nIGVhKTsKK2V4dGVybiBpbnQgZG9fbGZkKGludCBybiwgdW5zaWduZWQgbG9uZyBlYSk7CitleHRlcm4gaW50IGRvX3N0ZnMoaW50IHJuLCB1bnNpZ25lZCBsb25nIGVhKTsKK2V4dGVybiBpbnQgZG9fc3RmZChpbnQgcm4sIHVuc2lnbmVkIGxvbmcgZWEpOworZXh0ZXJuIGludCBkb19sdngoaW50IHJuLCB1bnNpZ25lZCBsb25nIGVhKTsKK2V4dGVybiBpbnQgZG9fc3R2eChpbnQgcm4sIHVuc2lnbmVkIGxvbmcgZWEpOworZXh0ZXJuIGludCBkb19seHZkMngoaW50IHJuLCB1bnNpZ25lZCBsb25nIGVhKTsKK2V4dGVybiBpbnQgZG9fc3R4dmQyeChpbnQgcm4sIHVuc2lnbmVkIGxvbmcgZWEpOworCiAvKgogICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24gd291bGQgYnJhbmNoLgogICovCkBAIC00NiwxNiArNjUsNDk5IEBACiAJcmV0dXJuIDE7CiB9CiAKKworc3RhdGljIGxvbmcgX19rcHJvYmVzIGFkZHJlc3Nfb2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZWEsIGludCBuYikKK3sKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIF9fYWNjZXNzX29rKGVhLCBuYiwgVVNFUl9EUyk7Cit9CisKIC8qCi0gKiBFbXVsYXRlIGluc3RydWN0aW9ucyB0aGF0IGNhdXNlIGEgdHJhbnNmZXIgb2YgY29udHJvbC4KKyAqIENhbGN1bGF0ZSBlZmZlY3RpdmUgYWRkcmVzcyBmb3IgYSBELWZvcm0gaW5zdHJ1Y3Rpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIGRmb3JtX2VhKHVuc2lnbmVkIGludCBpbnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHJhOworCXVuc2lnbmVkIGxvbmcgZWE7CisKKwlyYSA9IChpbnN0ciA+PiAxNikgJiAweDFmOworCWVhID0gKHNpZ25lZCBzaG9ydCkgaW5zdHI7CQkvKiBzaWduLWV4dGVuZCAqLworCWlmIChyYSkgeworCQllYSArPSByZWdzLT5ncHJbcmFdOworCQlpZiAoaW5zdHIgJiAweDA0MDAwMDAwKQkJLyogdXBkYXRlIGZvcm1zICovCisJCQlyZWdzLT5ncHJbcmFdID0gZWE7CisJfQorI2lmZGVmIF9fcG93ZXJwYzY0X18KKwlpZiAoIShyZWdzLT5tc3IgJiBNU1JfU0YpKQorCQllYSAmPSAweGZmZmZmZmZmVUw7CisjZW5kaWYKKwlyZXR1cm4gZWE7Cit9CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisvKgorICogQ2FsY3VsYXRlIGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBhIERTLWZvcm0gaW5zdHJ1Y3Rpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIGRzZm9ybV9lYSh1bnNpZ25lZCBpbnQgaW5zdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByYTsKKwl1bnNpZ25lZCBsb25nIGVhOworCisJcmEgPSAoaW5zdHIgPj4gMTYpICYgMHgxZjsKKwllYSA9IChzaWduZWQgc2hvcnQpIChpbnN0ciAmIH4zKTsJLyogc2lnbi1leHRlbmQgKi8KKwlpZiAocmEpIHsKKwkJZWEgKz0gcmVncy0+Z3ByW3JhXTsKKwkJaWYgKChpbnN0ciAmIDMpID09IDEpCQkvKiB1cGRhdGUgZm9ybXMgKi8KKwkJCXJlZ3MtPmdwcltyYV0gPSBlYTsKKwl9CisJaWYgKCEocmVncy0+bXNyICYgTVNSX1NGKSkKKwkJZWEgJj0gMHhmZmZmZmZmZlVMOworCXJldHVybiBlYTsKK30KKyNlbmRpZiAvKiBfX3Bvd2VycGM2NCAqLworCisvKgorICogQ2FsY3VsYXRlIGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBhbiBYLWZvcm0gaW5zdHJ1Y3Rpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIHhmb3JtX2VhKHVuc2lnbmVkIGludCBpbnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgICBpbnQgZG9fdXBkYXRlKQoreworCWludCByYSwgcmI7CisJdW5zaWduZWQgbG9uZyBlYTsKKworCXJhID0gKGluc3RyID4+IDE2KSAmIDB4MWY7CisJcmIgPSAoaW5zdHIgPj4gMTEpICYgMHgxZjsKKwllYSA9IHJlZ3MtPmdwcltyYl07CisJaWYgKHJhKSB7CisJCWVhICs9IHJlZ3MtPmdwcltyYV07CisJCWlmIChkb191cGRhdGUpCQkvKiB1cGRhdGUgZm9ybXMgKi8KKwkJCXJlZ3MtPmdwcltyYV0gPSBlYTsKKwl9CisjaWZkZWYgX19wb3dlcnBjNjRfXworCWlmICghKHJlZ3MtPm1zciAmIE1TUl9TRikpCisJCWVhICY9IDB4ZmZmZmZmZmZVTDsKKyNlbmRpZgorCXJldHVybiBlYTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbGFyZ2VzdCBwb3dlciBvZiAyLCBub3QgZ3JlYXRlciB0aGFuIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKyAqIHN1Y2ggdGhhdCB4IGlzIGEgbXVsdGlwbGUgb2YgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtYXhfYWxpZ24odW5zaWduZWQgbG9uZyB4KQoreworCXggfD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXJldHVybiB4ICYgLXg7CQkvKiBpc29sYXRlcyByaWdodG1vc3QgYml0ICovCit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ5dGVyZXZfMih1bnNpZ25lZCBsb25nIHgpCit7CisJcmV0dXJuICgoeCA+PiA4KSAmIDB4ZmYpIHwgKCh4ICYgMHhmZikgPDwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBieXRlcmV2XzQodW5zaWduZWQgbG9uZyB4KQoreworCXJldHVybiAoKHggPj4gMjQpICYgMHhmZikgfCAoKHggPj4gOCkgJiAweGZmMDApIHwKKwkJKCh4ICYgMHhmZjAwKSA8PCA4KSB8ICgoeCAmIDB4ZmYpIDw8IDI0KTsKK30KKworI2lmZGVmIF9fcG93ZXJwYzY0X18KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBieXRlcmV2XzgodW5zaWduZWQgbG9uZyB4KQoreworCXJldHVybiAoYnl0ZXJldl80KHgpIDw8IDMyKSB8IGJ5dGVyZXZfNCh4ID4+IDMyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa3Byb2JlcyByZWFkX21lbV9hbGlnbmVkKHVuc2lnbmVkIGxvbmcgKmRlc3QsIHVuc2lnbmVkIGxvbmcgZWEsCisJCQkJICAgICAgaW50IG5iKQoreworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgeCA9IDA7CisKKwlzd2l0Y2ggKG5iKSB7CisJY2FzZSAxOgorCQllcnIgPSBfX2dldF91c2VyKHgsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSBlYSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZXJyID0gX19nZXRfdXNlcih4LCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIGVhKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQllcnIgPSBfX2dldF91c2VyKHgsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGVhKTsKKwkJYnJlYWs7CisjaWZkZWYgX19wb3dlcnBjNjRfXworCWNhc2UgODoKKwkJZXJyID0gX19nZXRfdXNlcih4LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZWEpOworCQlicmVhazsKKyNlbmRpZgorCX0KKwlpZiAoIWVycikKKwkJKmRlc3QgPSB4OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIHJlYWRfbWVtX3VuYWxpZ25lZCh1bnNpZ25lZCBsb25nICpkZXN0LCB1bnNpZ25lZCBsb25nIGVhLAorCQkJCQlpbnQgbmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyB4LCBiLCBjOworCisJLyogdW5hbGlnbmVkLCBkbyB0aGlzIGluIHBpZWNlcyAqLworCXggPSAwOworCWZvciAoOyBuYiA+IDA7IG5iIC09IGMpIHsKKwkJYyA9IG1heF9hbGlnbihlYSk7CisJCWlmIChjID4gbmIpCisJCQljID0gbWF4X2FsaWduKG5iKTsKKwkJZXJyID0gcmVhZF9tZW1fYWxpZ25lZCgmYiwgZWEsIGMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJeCA9ICh4IDw8ICg4ICogYykpICsgYjsKKwkJZWEgKz0gYzsKKwl9CisJKmRlc3QgPSB4OworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBtZW1vcnkgYXQgYWRkcmVzcyBlYSBmb3IgbmIgYnl0ZXMsIHJldHVybiAwIGZvciBzdWNjZXNzCisgKiBvciAtRUZBVUxUIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IF9fa3Byb2JlcyByZWFkX21lbSh1bnNpZ25lZCBsb25nICpkZXN0LCB1bnNpZ25lZCBsb25nIGVhLCBpbnQgbmIsCisJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoIWFkZHJlc3Nfb2socmVncywgZWEsIG5iKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKChlYSAmIChuYiAtIDEpKSA9PSAwKQorCQlyZXR1cm4gcmVhZF9tZW1fYWxpZ25lZChkZXN0LCBlYSwgbmIpOworCXJldHVybiByZWFkX21lbV91bmFsaWduZWQoZGVzdCwgZWEsIG5iLCByZWdzKTsKK30KKworc3RhdGljIGludCBfX2twcm9iZXMgd3JpdGVfbWVtX2FsaWduZWQodW5zaWduZWQgbG9uZyB2YWwsIHVuc2lnbmVkIGxvbmcgZWEsCisJCQkJICAgICAgIGludCBuYikKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAobmIpIHsKKwljYXNlIDE6CisJCWVyciA9IF9fcHV0X3VzZXIodmFsLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgZWEpOworCQlicmVhazsKKwljYXNlIDI6CisJCWVyciA9IF9fcHV0X3VzZXIodmFsLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIGVhKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQllcnIgPSBfX3B1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZWEpOworCQlicmVhazsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJY2FzZSA4OgorCQllcnIgPSBfX3B1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGVhKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2twcm9iZXMgd3JpdGVfbWVtX3VuYWxpZ25lZCh1bnNpZ25lZCBsb25nIHZhbCwgdW5zaWduZWQgbG9uZyBlYSwKKwkJCQkJIGludCBuYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGM7CisKKwkvKiB1bmFsaWduZWQgb3IgbGl0dGxlLWVuZGlhbiwgZG8gdGhpcyBpbiBwaWVjZXMgKi8KKwlmb3IgKDsgbmIgPiAwOyBuYiAtPSBjKSB7CisJCWMgPSBtYXhfYWxpZ24oZWEpOworCQlpZiAoYyA+IG5iKQorCQkJYyA9IG1heF9hbGlnbihuYik7CisJCWVyciA9IHdyaXRlX21lbV9hbGlnbmVkKHZhbCA+PiAobmIgLSBjKSAqIDgsIGVhLCBjKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCSsrZWE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogV3JpdGUgbWVtb3J5IGF0IGFkZHJlc3MgZWEgZm9yIG5iIGJ5dGVzLCByZXR1cm4gMCBmb3Igc3VjY2VzcworICogb3IgLUVGQVVMVCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworc3RhdGljIGludCBfX2twcm9iZXMgd3JpdGVfbWVtKHVuc2lnbmVkIGxvbmcgdmFsLCB1bnNpZ25lZCBsb25nIGVhLCBpbnQgbmIsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKCFhZGRyZXNzX29rKHJlZ3MsIGVhLCBuYikpCisJCXJldHVybiAtRUZBVUxUOworCWlmICgoZWEgJiAobmIgLSAxKSkgPT0gMCkKKwkJcmV0dXJuIHdyaXRlX21lbV9hbGlnbmVkKHZhbCwgZWEsIG5iKTsKKwlyZXR1cm4gd3JpdGVfbWVtX3VuYWxpZ25lZCh2YWwsIGVhLCBuYiwgcmVncyk7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgYWRkcmVzcyBhbmQgYWxpZ25tZW50LCBhbmQgY2FsbCBmdW5jIHRvIGRvIHRoZSBhY3R1YWwKKyAqIGxvYWQgb3Igc3RvcmUuCisgKi8KK3N0YXRpYyBpbnQgX19rcHJvYmVzIGRvX2ZwX2xvYWQoaW50IHJuLCBpbnQgKCpmdW5jKShpbnQsIHVuc2lnbmVkIGxvbmcpLAorCQkJCXVuc2lnbmVkIGxvbmcgZWEsIGludCBuYiwKKwkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsW3NpemVvZihkb3VibGUpIC8gc2l6ZW9mKGxvbmcpXTsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKworCWlmICghYWRkcmVzc19vayhyZWdzLCBlYSwgbmIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKGVhICYgMykgPT0gMCkKKwkJcmV0dXJuICgqZnVuYykocm4sIGVhKTsKKwlwdHIgPSAodW5zaWduZWQgbG9uZykgJnZhbFswXTsKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDggfHwgbmIgPT0gNCkgeworCQllcnIgPSByZWFkX21lbV91bmFsaWduZWQoJnZhbFswXSwgZWEsIG5iLCByZWdzKTsKKwkJcHRyICs9IHNpemVvZih1bnNpZ25lZCBsb25nKSAtIG5iOworCX0gZWxzZSB7CisJCS8qIHJlYWRpbmcgYSBkb3VibGUgb24gMzItYml0ICovCisJCWVyciA9IHJlYWRfbWVtX3VuYWxpZ25lZCgmdmFsWzBdLCBlYSwgNCwgcmVncyk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcmVhZF9tZW1fdW5hbGlnbmVkKCZ2YWxbMV0sIGVhICsgNCwgNCwgcmVncyk7CisJfQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcmV0dXJuICgqZnVuYykocm4sIHB0cik7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGRvX2ZwX3N0b3JlKGludCBybiwgaW50ICgqZnVuYykoaW50LCB1bnNpZ25lZCBsb25nKSwKKwkJCQkgdW5zaWduZWQgbG9uZyBlYSwgaW50IG5iLAorCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsW3NpemVvZihkb3VibGUpIC8gc2l6ZW9mKGxvbmcpXTsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKworCWlmICghYWRkcmVzc19vayhyZWdzLCBlYSwgbmIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKGVhICYgMykgPT0gMCkKKwkJcmV0dXJuICgqZnVuYykocm4sIGVhKTsKKwlwdHIgPSAodW5zaWduZWQgbG9uZykgJnZhbFswXTsKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDggfHwgbmIgPT0gNCkgeworCQlwdHIgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gbmI7CisJCWVyciA9ICgqZnVuYykocm4sIHB0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSB3cml0ZV9tZW1fdW5hbGlnbmVkKHZhbFswXSwgZWEsIG5iLCByZWdzKTsKKwl9IGVsc2UgeworCQkvKiB3cml0aW5nIGEgZG91YmxlIG9uIDMyLWJpdCAqLworCQllcnIgPSAoKmZ1bmMpKHJuLCBwdHIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gd3JpdGVfbWVtX3VuYWxpZ25lZCh2YWxbMF0sIGVhLCA0LCByZWdzKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSB3cml0ZV9tZW1fdW5hbGlnbmVkKHZhbFsxXSwgZWEgKyA0LCA0LCByZWdzKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19BTFRJVkVDCisvKiBGb3IgQWx0aXZlYy9WTVgsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgYWxpZ25tZW50ICovCitzdGF0aWMgaW50IF9fa3Byb2JlcyBkb192ZWNfbG9hZChpbnQgcm4sIGludCAoKmZ1bmMpKGludCwgdW5zaWduZWQgbG9uZyksCisJCQkJIHVuc2lnbmVkIGxvbmcgZWEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICghYWRkcmVzc19vayhyZWdzLCBlYSAmIH4weGZVTCwgMTYpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gKCpmdW5jKShybiwgZWEpOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcyBkb192ZWNfc3RvcmUoaW50IHJuLCBpbnQgKCpmdW5jKShpbnQsIHVuc2lnbmVkIGxvbmcpLAorCQkJCSAgdW5zaWduZWQgbG9uZyBlYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKCFhZGRyZXNzX29rKHJlZ3MsIGVhICYgfjB4ZlVMLCAxNikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAoKmZ1bmMpKHJuLCBlYSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KKworI2lmZGVmIENPTkZJR19WU1gKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGRvX3ZzeF9sb2FkKGludCBybiwgaW50ICgqZnVuYykoaW50LCB1bnNpZ25lZCBsb25nKSwKKwkJCQkgdW5zaWduZWQgbG9uZyBlYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHZhbFsyXTsKKworCWlmICghYWRkcmVzc19vayhyZWdzLCBlYSwgMTYpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKGVhICYgMykgPT0gMCkKKwkJcmV0dXJuICgqZnVuYykocm4sIGVhKTsKKwllcnIgPSByZWFkX21lbV91bmFsaWduZWQoJnZhbFswXSwgZWEsIDgsIHJlZ3MpOworCWlmICghZXJyKQorCQllcnIgPSByZWFkX21lbV91bmFsaWduZWQoJnZhbFsxXSwgZWEgKyA4LCA4LCByZWdzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gKCpmdW5jKShybiwgKHVuc2lnbmVkIGxvbmcpICZ2YWxbMF0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGRvX3ZzeF9zdG9yZShpbnQgcm4sIGludCAoKmZ1bmMpKGludCwgdW5zaWduZWQgbG9uZyksCisJCQkJIHVuc2lnbmVkIGxvbmcgZWEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyB2YWxbMl07CisKKwlpZiAoIWFkZHJlc3Nfb2socmVncywgZWEsIDE2KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKChlYSAmIDMpID09IDApCisJCXJldHVybiAoKmZ1bmMpKHJuLCBlYSk7CisJZXJyID0gKCpmdW5jKShybiwgKHVuc2lnbmVkIGxvbmcpICZ2YWxbMF0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gd3JpdGVfbWVtX3VuYWxpZ25lZCh2YWxbMF0sIGVhLCA4LCByZWdzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gd3JpdGVfbWVtX3VuYWxpZ25lZCh2YWxbMV0sIGVhICsgOCwgOCwgcmVncyk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZiAvKiBDT05GSUdfVlNYICovCisKKyNkZWZpbmUgX19wdXRfdXNlcl9hc214KHgsIGFkZHIsIGVyciwgb3AsIGNyKQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCisJCSIxOgkiIG9wICIgJTIsMCwlM1xuIgkJXAorCQkiCW1mY3IJJTFcbiIJCQlcCisJCSIyOlxuIgkJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAorCQkiMzoJbGkJJTAsJTRcbiIJCVwKKwkJIgliCTJiXG4iCQkJXAorCQkiLnByZXZpb3VzXG4iCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCVwKKwkJCVBQQ19MT05HX0FMSUdOICJcbiIJCVwKKwkJCVBQQ19MT05HICIxYiwzYlxuIgkJXAorCQkiLnByZXZpb3VzIgkJCQlcCisJCTogIj1yIiAoZXJyKSwgIj1yIiAoY3IpCQkJXAorCQk6ICJyIiAoeCksICJyIiAoYWRkciksICJpIiAoLUVGQVVMVCksICIwIiAoZXJyKSkKKworI2RlZmluZSBfX2dldF91c2VyX2FzbXgoeCwgYWRkciwgZXJyLCBvcCkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAorCQkiMToJIm9wIiAlMSwwLCUyXG4iCQkJXAorCQkiMjpcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJIjM6CWxpCSUwLCUzXG4iCQlcCisJCSIJYgkyYlxuIgkJCVwKKwkJIi5wcmV2aW91c1xuIgkJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQlcCisJCQlQUENfTE9OR19BTElHTiAiXG4iCQlcCisJCQlQUENfTE9ORyAiMWIsM2JcbiIJCVwKKwkJIi5wcmV2aW91cyIJCQkJXAorCQk6ICI9ciIgKGVyciksICI9ciIgKHgpCQkJXAorCQk6ICJyIiAoYWRkciksICJpIiAoLUVGQVVMVCksICIwIiAoZXJyKSkKKworI2RlZmluZSBfX2NhY2hlb3BfdXNlcl9hc214KGFkZHIsIGVyciwgb3ApCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCVwKKwkJIjE6CSJvcCIgMCwlMVxuIgkJCVwKKwkJIjI6XG4iCQkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCSIzOglsaQklMCwlM1xuIgkJXAorCQkiCWIJMmJcbiIJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkJUFBDX0xPTkdfQUxJR04gIlxuIgkJXAorCQkJUFBDX0xPTkcgIjFiLDNiXG4iCQlcCisJCSIucHJldmlvdXMiCQkJCVwKKwkJOiAiPXIiIChlcnIpCQkJCVwKKwkJOiAiciIgKGFkZHIpLCAiaSIgKC1FRkFVTFQpLCAiMCIgKGVycikpCisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBzZXRfY3IwKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcmQpCit7CisJbG9uZyB2YWwgPSByZWdzLT5ncHJbcmRdOworCisJcmVncy0+Y2NyID0gKHJlZ3MtPmNjciAmIDB4MGZmZmZmZmYpIHwgKChyZWdzLT54ZXIgPj4gMykgJiAweDEwMDAwMDAwKTsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJaWYgKCEocmVncy0+bXNyICYgTVNSX1NGKSkKKwkJdmFsID0gKGludCkgdmFsOworI2VuZGlmCisJaWYgKHZhbCA8IDApCisJCXJlZ3MtPmNjciB8PSAweDgwMDAwMDAwOworCWVsc2UgaWYgKHZhbCA+IDApCisJCXJlZ3MtPmNjciB8PSAweDQwMDAwMDAwOworCWVsc2UKKwkJcmVncy0+Y2NyIHw9IDB4MjAwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBhZGRfd2l0aF9jYXJyeShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJkLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwxLCB1bnNpZ25lZCBsb25nIHZhbDIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5X2luKQoreworCXVuc2lnbmVkIGxvbmcgdmFsID0gdmFsMSArIHZhbDI7CisKKwlpZiAoY2FycnlfaW4pCisJCSsrdmFsOworCXJlZ3MtPmdwcltyZF0gPSB2YWw7CisjaWZkZWYgX19wb3dlcnBjNjRfXworCWlmICghKHJlZ3MtPm1zciAmIE1TUl9TRikpIHsKKwkJdmFsID0gKHVuc2lnbmVkIGludCkgdmFsOworCQl2YWwxID0gKHVuc2lnbmVkIGludCkgdmFsMTsKKwl9CisjZW5kaWYKKwlpZiAodmFsIDwgdmFsMSB8fCAoY2FycnlfaW4gJiYgdmFsID09IHZhbDEpKQorCQlyZWdzLT54ZXIgfD0gWEVSX0NBOworCWVsc2UKKwkJcmVncy0+eGVyICY9IH5YRVJfQ0E7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBkb19jbXBfc2lnbmVkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIHYxLCBsb25nIHYyLAorCQkJCSAgICBpbnQgY3JmbGQpCit7CisJdW5zaWduZWQgaW50IGNydmFsLCBzaGlmdDsKKworCWNydmFsID0gKHJlZ3MtPnhlciA+PiAzMSkgJiAxOwkJLyogZ2V0IFNPIGJpdCAqLworCWlmICh2MSA8IHYyKQorCQljcnZhbCB8PSA4OworCWVsc2UgaWYgKHYxID4gdjIpCisJCWNydmFsIHw9IDQ7CisJZWxzZQorCQljcnZhbCB8PSAyOworCXNoaWZ0ID0gKDcgLSBjcmZsZCkgKiA0OworCXJlZ3MtPmNjciA9IChyZWdzLT5jY3IgJiB+KDB4ZiA8PCBzaGlmdCkpIHwgKGNydmFsIDw8IHNoaWZ0KTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzIGRvX2NtcF91bnNpZ25lZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyB2MSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHYyLCBpbnQgY3JmbGQpCit7CisJdW5zaWduZWQgaW50IGNydmFsLCBzaGlmdDsKKworCWNydmFsID0gKHJlZ3MtPnhlciA+PiAzMSkgJiAxOwkJLyogZ2V0IFNPIGJpdCAqLworCWlmICh2MSA8IHYyKQorCQljcnZhbCB8PSA4OworCWVsc2UgaWYgKHYxID4gdjIpCisJCWNydmFsIHw9IDQ7CisJZWxzZQorCQljcnZhbCB8PSAyOworCXNoaWZ0ID0gKDcgLSBjcmZsZCkgKiA0OworCXJlZ3MtPmNjciA9IChyZWdzLT5jY3IgJiB+KDB4ZiA8PCBzaGlmdCkpIHwgKGNydmFsIDw8IHNoaWZ0KTsKK30KKworLyoKKyAqIEVsZW1lbnRzIG9mIDMyLWJpdCByb3RhdGUgYW5kIG1hc2sgaW5zdHJ1Y3Rpb25zLgorICovCisjZGVmaW5lIE1BU0szMihtYiwgbWUpCSgoMHhmZmZmZmZmZlVMID4+IChtYikpICsgXAorCQkJICgoc2lnbmVkIGxvbmcpLTB4ODAwMDAwMDBMID4+IChtZSkpICsgKChtZSkgPj0gKG1iKSkpCisjaWZkZWYgX19wb3dlcnBjNjRfXworI2RlZmluZSBNQVNLNjRfTChtYikJKH4wVUwgPj4gKG1iKSkKKyNkZWZpbmUgTUFTSzY0X1IobWUpCSgoc2lnbmVkIGxvbmcpLTB4ODAwMDAwMDAwMDAwMDAwMEwgPj4gKG1lKSkKKyNkZWZpbmUgTUFTSzY0KG1iLCBtZSkJKE1BU0s2NF9MKG1iKSArIE1BU0s2NF9SKG1lKSArICgobWUpID49IChtYikpKQorI2RlZmluZSBEQVRBMzIoeCkJKCgoeCkgJiAweGZmZmZmZmZmVUwpIHwgKCgoeCkgJiAweGZmZmZmZmZmVUwpIDw8IDMyKSkKKyNlbHNlCisjZGVmaW5lIERBVEEzMih4KQkoeCkKKyNlbmRpZgorI2RlZmluZSBST1RBVEUoeCwgbikJKChuKSA/ICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICg4ICogc2l6ZW9mKGxvbmcpIC0gKG4pKSkpIDogKHgpKQorCisvKgorICogRW11bGF0ZSBpbnN0cnVjdGlvbnMgdGhhdCBjYXVzZSBhIHRyYW5zZmVyIG9mIGNvbnRyb2wsCisgKiBsb2FkcyBhbmQgc3RvcmVzLCBhbmQgYSBmZXcgb3RoZXIgaW5zdHJ1Y3Rpb25zLgogICogUmV0dXJucyAxIGlmIHRoZSBzdGVwIHdhcyBlbXVsYXRlZCwgMCBpZiBub3QsCiAgKiBvciAtMSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgb25lIHRoYXQgc2hvdWxkIG5vdCBiZSBzdGVwcGVkLAogICogc3VjaCBhcyBhbiByZmlkLCBvciBhIG10bXNyZCB0aGF0IHdvdWxkIGNsZWFyIE1TUl9SSS4KICAqLwogaW50IF9fa3Byb2JlcyBlbXVsYXRlX3N0ZXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKIHsKLQl1bnNpZ25lZCBpbnQgb3Bjb2RlLCBycywgcmIsIHJkLCBzcHI7CisJdW5zaWduZWQgaW50IG9wY29kZSwgcmEsIHJiLCByZCwgc3ByLCB1OwogCXVuc2lnbmVkIGxvbmcgaW50IGltbTsKKwl1bnNpZ25lZCBsb25nIGludCB2YWwsIHZhbDI7CisJdW5zaWduZWQgbG9uZyBpbnQgZWE7CisJdW5zaWduZWQgaW50IGNyLCBtYiwgbWUsIHNoOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBvbGRfcmE7CisJbG9uZyBpdmFsOwogCiAJb3Bjb2RlID0gaW5zdHIgPj4gMjY7CiAJc3dpdGNoIChvcGNvZGUpIHsKQEAgLTc4LDcgKzU4MCwxMyBAQAogCQkgKiBlbnRyeSBjb2RlIHdvcmtzLiAgSWYgdGhhdCBpcyBjaGFuZ2VkLCB0aGlzIHdpbGwKIAkJICogbmVlZCB0byBiZSBjaGFuZ2VkIGFsc28uCiAJCSAqLworCQlpZiAocmVncy0+Z3ByWzBdID09IDB4MWViZSAmJgorCQkgICAgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUkVBTF9MRSkpIHsKKwkJCXJlZ3MtPm1zciBePSBNU1JfTEU7CisJCQlnb3RvIGluc3RyX2RvbmU7CisJCX0KIAkJcmVncy0+Z3ByWzldID0gcmVncy0+Z3ByWzEzXTsKKwkJcmVncy0+Z3ByWzEwXSA9IE1TUl9LRVJORUw7CiAJCXJlZ3MtPmdwclsxMV0gPSByZWdzLT5uaXAgKyA0OwogCQlyZWdzLT5ncHJbMTJdID0gcmVncy0+bXNyICYgTVNSX01BU0s7CiAJCXJlZ3MtPmdwclsxM10gPSAodW5zaWduZWQgbG9uZykgZ2V0X3BhY2EoKTsKQEAgLTEwMiw5ICs2MTAsOSBAQAogCQlyZWdzLT5uaXAgPSBpbW07CiAJCXJldHVybiAxOwogCWNhc2UgMTk6Ci0JCXN3aXRjaCAoaW5zdHIgJiAweDdmZSkgewotCQljYXNlIDB4MjA6CS8qIGJjbHIgKi8KLQkJY2FzZSAweDQyMDoJLyogYmNjdHIgKi8KKwkJc3dpdGNoICgoaW5zdHIgPj4gMSkgJiAweDNmZikgeworCQljYXNlIDE2OgkvKiBiY2xyICovCisJCWNhc2UgNTI4OgkvKiBiY2N0ciAqLwogCQkJaW1tID0gKGluc3RyICYgMHg0MDApPyByZWdzLT5jdHI6IHJlZ3MtPmxpbms7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCWlmICgocmVncy0+bXNyICYgTVNSX1NGKSA9PSAwKSB7CkBAIC0xMTYsMzAgKzYyNCwyMzMgQEAKIAkJCWlmIChicmFuY2hfdGFrZW4oaW5zdHIsIHJlZ3MpKQogCQkJCXJlZ3MtPm5pcCA9IGltbTsKIAkJCXJldHVybiAxOwotCQljYXNlIDB4MjQ6CS8qIHJmaWQsIHNjYXJ5ICovCisKKwkJY2FzZSAxODoJLyogcmZpZCwgc2NhcnkgKi8KIAkJCXJldHVybiAtMTsKKworCQljYXNlIDE1MDoJLyogaXN5bmMgKi8KKwkJCWlzeW5jKCk7CisJCQlnb3RvIGluc3RyX2RvbmU7CisKKwkJY2FzZSAzMzoJLyogY3Jub3IgKi8KKwkJY2FzZSAxMjk6CS8qIGNyYW5kYyAqLworCQljYXNlIDE5MzoJLyogY3J4b3IgKi8KKwkJY2FzZSAyMjU6CS8qIGNybmFuZCAqLworCQljYXNlIDI1NzoJLyogY3JhbmQgKi8KKwkJY2FzZSAyODk6CS8qIGNyZXF2ICovCisJCWNhc2UgNDE3OgkvKiBjcm9yYyAqLworCQljYXNlIDQ0OToJLyogY3JvciAqLworCQkJcmEgPSAoaW5zdHIgPj4gMTYpICYgMHgxZjsKKwkJCXJiID0gKGluc3RyID4+IDExKSAmIDB4MWY7CisJCQlyZCA9IChpbnN0ciA+PiAyMSkgJiAweDFmOworCQkJcmEgPSAocmVncy0+Y2NyID4+ICgzMSAtIHJhKSkgJiAxOworCQkJcmIgPSAocmVncy0+Y2NyID4+ICgzMSAtIHJiKSkgJiAxOworCQkJdmFsID0gKGluc3RyID4+ICg2ICsgcmEgKiAyICsgcmIpKSAmIDE7CisJCQlyZWdzLT5jY3IgPSAocmVncy0+Y2NyICYgfigxVUwgPDwgKDMxIC0gcmQpKSkgfAorCQkJCSh2YWwgPDwgKDMxIC0gcmQpKTsKKwkJCWdvdG8gaW5zdHJfZG9uZTsKIAkJfQorCQlicmVhazsKIAljYXNlIDMxOgotCQlyZCA9IChpbnN0ciA+PiAyMSkgJiAweDFmOwotCQlzd2l0Y2ggKGluc3RyICYgMHg3ZmUpIHsKLQkJY2FzZSAweGE2OgkvKiBtZm1zciAqLworCQlzd2l0Y2ggKChpbnN0ciA+PiAxKSAmIDB4M2ZmKSB7CisJCWNhc2UgNTk4OgkvKiBzeW5jICovCisjaWZkZWYgX19wb3dlcnBjNjRfXworCQkJc3dpdGNoICgoaW5zdHIgPj4gMjEpICYgMykgeworCQkJY2FzZSAxOgkJLyogbHdzeW5jICovCisJCQkJYXNtIHZvbGF0aWxlKCJsd3N5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwkJCQlnb3RvIGluc3RyX2RvbmU7CisJCQljYXNlIDI6CQkvKiBwdGVzeW5jICovCisJCQkJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCQkJZ290byBpbnN0cl9kb25lOworCQkJfQorI2VuZGlmCisJCQltYigpOworCQkJZ290byBpbnN0cl9kb25lOworCisJCWNhc2UgODU0OgkvKiBlaWVpbyAqLworCQkJZWllaW8oKTsKKwkJCWdvdG8gaW5zdHJfZG9uZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBGb2xsb3dpbmcgY2FzZXMgcmVmZXIgdG8gcmVncy0+Z3ByW10sIHNvIHdlIG5lZWQgYWxsIHJlZ3MgKi8KKwlpZiAoIUZVTExfUkVHUyhyZWdzKSkKKwkJcmV0dXJuIDA7CisKKwlyZCA9IChpbnN0ciA+PiAyMSkgJiAweDFmOworCXJhID0gKGluc3RyID4+IDE2KSAmIDB4MWY7CisJcmIgPSAoaW5zdHIgPj4gMTEpICYgMHgxZjsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSA3OgkJLyogbXVsbGkgKi8KKwkJcmVncy0+Z3ByW3JkXSA9IHJlZ3MtPmdwcltyYV0gKiAoc2hvcnQpIGluc3RyOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDg6CQkvKiBzdWJmaWMgKi8KKwkJaW1tID0gKHNob3J0KSBpbnN0cjsKKwkJYWRkX3dpdGhfY2FycnkocmVncywgcmQsIH5yZWdzLT5ncHJbcmFdLCBpbW0sIDEpOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDEwOgkvKiBjbXBsaSAqLworCQlpbW0gPSAodW5zaWduZWQgc2hvcnQpIGluc3RyOworCQl2YWwgPSByZWdzLT5ncHJbcmFdOworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJaWYgKChyZCAmIDEpID09IDApCisJCQl2YWwgPSAodW5zaWduZWQgaW50KSB2YWw7CisjZW5kaWYKKwkJZG9fY21wX3Vuc2lnbmVkKHJlZ3MsIHZhbCwgaW1tLCByZCA+PiAyKTsKKwkJZ290byBpbnN0cl9kb25lOworCisJY2FzZSAxMToJLyogY21waSAqLworCQlpbW0gPSAoc2hvcnQpIGluc3RyOworCQl2YWwgPSByZWdzLT5ncHJbcmFdOworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJaWYgKChyZCAmIDEpID09IDApCisJCQl2YWwgPSAoaW50KSB2YWw7CisjZW5kaWYKKwkJZG9fY21wX3NpZ25lZChyZWdzLCB2YWwsIGltbSwgcmQgPj4gMik7CisJCWdvdG8gaW5zdHJfZG9uZTsKKworCWNhc2UgMTI6CS8qIGFkZGljICovCisJCWltbSA9IChzaG9ydCkgaW5zdHI7CisJCWFkZF93aXRoX2NhcnJ5KHJlZ3MsIHJkLCByZWdzLT5ncHJbcmFdLCBpbW0sIDApOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDEzOgkvKiBhZGRpYy4gKi8KKwkJaW1tID0gKHNob3J0KSBpbnN0cjsKKwkJYWRkX3dpdGhfY2FycnkocmVncywgcmQsIHJlZ3MtPmdwcltyYV0sIGltbSwgMCk7CisJCXNldF9jcjAocmVncywgcmQpOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDE0OgkvKiBhZGRpICovCisJCWltbSA9IChzaG9ydCkgaW5zdHI7CisJCWlmIChyYSkKKwkJCWltbSArPSByZWdzLT5ncHJbcmFdOworCQlyZWdzLT5ncHJbcmRdID0gaW1tOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDE1OgkvKiBhZGRpcyAqLworCQlpbW0gPSAoKHNob3J0KSBpbnN0cikgPDwgMTY7CisJCWlmIChyYSkKKwkJCWltbSArPSByZWdzLT5ncHJbcmFdOworCQlyZWdzLT5ncHJbcmRdID0gaW1tOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDIwOgkvKiBybHdpbWkgKi8KKwkJbWIgPSAoaW5zdHIgPj4gNikgJiAweDFmOworCQltZSA9IChpbnN0ciA+PiAxKSAmIDB4MWY7CisJCXZhbCA9IERBVEEzMihyZWdzLT5ncHJbcmRdKTsKKwkJaW1tID0gTUFTSzMyKG1iLCBtZSk7CisJCXJlZ3MtPmdwcltyYV0gPSAocmVncy0+Z3ByW3JhXSAmIH5pbW0pIHwgKFJPVEFURSh2YWwsIHJiKSAmIGltbSk7CisJCWdvdG8gbG9naWNhbF9kb25lOworCisJY2FzZSAyMToJLyogcmx3aW5tICovCisJCW1iID0gKGluc3RyID4+IDYpICYgMHgxZjsKKwkJbWUgPSAoaW5zdHIgPj4gMSkgJiAweDFmOworCQl2YWwgPSBEQVRBMzIocmVncy0+Z3ByW3JkXSk7CisJCXJlZ3MtPmdwcltyYV0gPSBST1RBVEUodmFsLCByYikgJiBNQVNLMzIobWIsIG1lKTsKKwkJZ290byBsb2dpY2FsX2RvbmU7CisKKwljYXNlIDIzOgkvKiBybHdubSAqLworCQltYiA9IChpbnN0ciA+PiA2KSAmIDB4MWY7CisJCW1lID0gKGluc3RyID4+IDEpICYgMHgxZjsKKwkJcmIgPSByZWdzLT5ncHJbcmJdICYgMHgxZjsKKwkJdmFsID0gREFUQTMyKHJlZ3MtPmdwcltyZF0pOworCQlyZWdzLT5ncHJbcmFdID0gUk9UQVRFKHZhbCwgcmIpICYgTUFTSzMyKG1iLCBtZSk7CisJCWdvdG8gbG9naWNhbF9kb25lOworCisJY2FzZSAyNDoJLyogb3JpICovCisJCWltbSA9ICh1bnNpZ25lZCBzaG9ydCkgaW5zdHI7CisJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdIHwgaW1tOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDI1OgkvKiBvcmlzICovCisJCWltbSA9ICh1bnNpZ25lZCBzaG9ydCkgaW5zdHI7CisJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdIHwgKGltbSA8PCAxNik7CisJCWdvdG8gaW5zdHJfZG9uZTsKKworCWNhc2UgMjY6CS8qIHhvcmkgKi8KKwkJaW1tID0gKHVuc2lnbmVkIHNob3J0KSBpbnN0cjsKKwkJcmVncy0+Z3ByW3JhXSA9IHJlZ3MtPmdwcltyZF0gXiBpbW07CisJCWdvdG8gaW5zdHJfZG9uZTsKKworCWNhc2UgMjc6CS8qIHhvcmlzICovCisJCWltbSA9ICh1bnNpZ25lZCBzaG9ydCkgaW5zdHI7CisJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdIF4gKGltbSA8PCAxNik7CisJCWdvdG8gaW5zdHJfZG9uZTsKKworCWNhc2UgMjg6CS8qIGFuZGkuICovCisJCWltbSA9ICh1bnNpZ25lZCBzaG9ydCkgaW5zdHI7CisJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdICYgaW1tOworCQlzZXRfY3IwKHJlZ3MsIHJhKTsKKwkJZ290byBpbnN0cl9kb25lOworCisJY2FzZSAyOToJLyogYW5kaXMuICovCisJCWltbSA9ICh1bnNpZ25lZCBzaG9ydCkgaW5zdHI7CisJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdICYgKGltbSA8PCAxNik7CisJCXNldF9jcjAocmVncywgcmEpOworCQlnb3RvIGluc3RyX2RvbmU7CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJY2FzZSAzMDoJLyogcmxkKiAqLworCQltYiA9ICgoaW5zdHIgPj4gNikgJiAweDFmKSB8IChpbnN0ciAmIDB4MjApOworCQl2YWwgPSByZWdzLT5ncHJbcmRdOworCQlpZiAoKGluc3RyICYgMHgxMCkgPT0gMCkgeworCQkJc2ggPSByYiB8ICgoaW5zdHIgJiAyKSA8PCA0KTsKKwkJCXZhbCA9IFJPVEFURSh2YWwsIHNoKTsKKwkJCXN3aXRjaCAoKGluc3RyID4+IDIpICYgMykgeworCQkJY2FzZSAwOgkJLyogcmxkaWNsICovCisJCQkJcmVncy0+Z3ByW3JhXSA9IHZhbCAmIE1BU0s2NF9MKG1iKTsKKwkJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKwkJCWNhc2UgMToJCS8qIHJsZGljciAqLworCQkJCXJlZ3MtPmdwcltyYV0gPSB2YWwgJiBNQVNLNjRfUihtYik7CisJCQkJZ290byBsb2dpY2FsX2RvbmU7CisJCQljYXNlIDI6CQkvKiBybGRpYyAqLworCQkJCXJlZ3MtPmdwcltyYV0gPSB2YWwgJiBNQVNLNjQobWIsIDYzIC0gc2gpOworCQkJCWdvdG8gbG9naWNhbF9kb25lOworCQkJY2FzZSAzOgkJLyogcmxkaW1pICovCisJCQkJaW1tID0gTUFTSzY0KG1iLCA2MyAtIHNoKTsKKwkJCQlyZWdzLT5ncHJbcmFdID0gKHJlZ3MtPmdwcltyYV0gJiB+aW1tKSB8CisJCQkJCSh2YWwgJiBpbW0pOworCQkJCWdvdG8gbG9naWNhbF9kb25lOworCQkJfQorCQl9IGVsc2UgeworCQkJc2ggPSByZWdzLT5ncHJbcmJdICYgMHgzZjsKKwkJCXZhbCA9IFJPVEFURSh2YWwsIHNoKTsKKwkJCXN3aXRjaCAoKGluc3RyID4+IDEpICYgNykgeworCQkJY2FzZSAwOgkJLyogcmxkY2wgKi8KKwkJCQlyZWdzLT5ncHJbcmFdID0gdmFsICYgTUFTSzY0X0wobWIpOworCQkJCWdvdG8gbG9naWNhbF9kb25lOworCQkJY2FzZSAxOgkJLyogcmxkY3IgKi8KKwkJCQlyZWdzLT5ncHJbcmFdID0gdmFsICYgTUFTSzY0X1IobWIpOworCQkJCWdvdG8gbG9naWNhbF9kb25lOworCQkJfQorCQl9CisjZW5kaWYKKworCWNhc2UgMzE6CisJCXN3aXRjaCAoKGluc3RyID4+IDEpICYgMHgzZmYpIHsKKwkJY2FzZSA4MzoJLyogbWZtc3IgKi8KKwkJCWlmIChyZWdzLT5tc3IgJiBNU1JfUFIpCisJCQkJYnJlYWs7CiAJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+bXNyICYgTVNSX01BU0s7Ci0JCQlyZWdzLT5uaXAgKz0gNDsKLQkJCWlmICgocmVncy0+bXNyICYgTVNSX1NGKSA9PSAwKQotCQkJCXJlZ3MtPm5pcCAmPSAweGZmZmZmZmZmVUw7Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSAweDEyNDoJLyogbXRtc3IgKi8KKwkJCWdvdG8gaW5zdHJfZG9uZTsKKwkJY2FzZSAxNDY6CS8qIG10bXNyICovCisJCQlpZiAocmVncy0+bXNyICYgTVNSX1BSKQorCQkJCWJyZWFrOwogCQkJaW1tID0gcmVncy0+Z3ByW3JkXTsKIAkJCWlmICgoaW1tICYgTVNSX1JJKSA9PSAwKQogCQkJCS8qIGNhbid0IHN0ZXAgbXRtc3IgdGhhdCB3b3VsZCBjbGVhciBNU1JfUkkgKi8KIAkJCQlyZXR1cm4gLTE7CiAJCQlyZWdzLT5tc3IgPSBpbW07Ci0JCQlyZWdzLT5uaXAgKz0gNDsKLQkJCXJldHVybiAxOworCQkJZ290byBpbnN0cl9kb25lOwogI2lmZGVmIENPTkZJR19QUEM2NAotCQljYXNlIDB4MTY0OgkvKiBtdG1zcmQgKi8KKwkJY2FzZSAxNzg6CS8qIG10bXNyZCAqLwogCQkJLyogb25seSBNU1JfRUUgYW5kIE1TUl9SSSBnZXQgY2hhbmdlZCBpZiBiaXQgMTUgc2V0ICovCiAJCQkvKiBtdG1zcmQgZG9lc24ndCBjaGFuZ2UgTVNSX0hWIGFuZCBNU1JfTUUgKi8KKwkJCWlmIChyZWdzLT5tc3IgJiBNU1JfUFIpCisJCQkJYnJlYWs7CiAJCQlpbW0gPSAoaW5zdHIgJiAweDEwMDAwKT8gMHg4MDAyOiAweGVmZmZmZmZmZmZmZmVmZmZVTDsKIAkJCWltbSA9IChyZWdzLT5tc3IgJiBNU1JfTUFTSyAmIH5pbW0pCiAJCQkJfCAocmVncy0+Z3ByW3JkXSAmIGltbSk7CkBAIC0xNDcsNTcgKzg1OCw3NzAgQEAKIAkJCQkvKiBjYW4ndCBzdGVwIG10bXNyZCB0aGF0IHdvdWxkIGNsZWFyIE1TUl9SSSAqLwogCQkJCXJldHVybiAtMTsKIAkJCXJlZ3MtPm1zciA9IGltbTsKLQkJCXJlZ3MtPm5pcCArPSA0OwotCQkJaWYgKChpbW0gJiBNU1JfU0YpID09IDApCi0JCQkJcmVncy0+bmlwICY9IDB4ZmZmZmZmZmZVTDsKLQkJCXJldHVybiAxOworCQkJZ290byBpbnN0cl9kb25lOwogI2VuZGlmCi0JCWNhc2UgMHgyNjoJLyogbWZjciAqLworCQljYXNlIDE5OgkvKiBtZmNyICovCiAJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+Y2NyOwogCQkJcmVncy0+Z3ByW3JkXSAmPSAweGZmZmZmZmZmVUw7Ci0JCQlnb3RvIG10c3ByX291dDsKLQkJY2FzZSAweDJhNjoJLyogbWZzcHIgKi8KKwkJCWdvdG8gaW5zdHJfZG9uZTsKKworCQljYXNlIDE0NDoJLyogbXRjcmYgKi8KKwkJCWltbSA9IDB4ZjAwMDAwMDBVTDsKKwkJCXZhbCA9IHJlZ3MtPmdwcltyZF07CisJCQlmb3IgKHNoID0gMDsgc2ggPCA4OyArK3NoKSB7CisJCQkJaWYgKGluc3RyICYgKDB4ODAwMDAgPj4gc2gpKQorCQkJCQlyZWdzLT5jY3IgPSAocmVncy0+Y2NyICYgfmltbSkgfAorCQkJCQkJKHZhbCAmIGltbSk7CisJCQkJaW1tID4+PSA0OworCQkJfQorCQkJZ290byBpbnN0cl9kb25lOworCisJCWNhc2UgMzM5OgkvKiBtZnNwciAqLwogCQkJc3ByID0gKGluc3RyID4+IDExKSAmIDB4M2ZmOwogCQkJc3dpdGNoIChzcHIpIHsKIAkJCWNhc2UgMHgyMDoJLyogbWZ4ZXIgKi8KIAkJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+eGVyOwogCQkJCXJlZ3MtPmdwcltyZF0gJj0gMHhmZmZmZmZmZlVMOwotCQkJCWdvdG8gbXRzcHJfb3V0OworCQkJCWdvdG8gaW5zdHJfZG9uZTsKIAkJCWNhc2UgMHgxMDA6CS8qIG1mbHIgKi8KIAkJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+bGluazsKLQkJCQlnb3RvIG10c3ByX291dDsKKwkJCQlnb3RvIGluc3RyX2RvbmU7CiAJCQljYXNlIDB4MTIwOgkvKiBtZmN0ciAqLwogCQkJCXJlZ3MtPmdwcltyZF0gPSByZWdzLT5jdHI7Ci0JCQkJZ290byBtdHNwcl9vdXQ7CisJCQkJZ290byBpbnN0cl9kb25lOwogCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgMHgzNzg6CS8qIG9yeCAqLwotCQkJaWYgKGluc3RyICYgMSkKLQkJCQlicmVhazsKLQkJCXJzID0gKGluc3RyID4+IDIxKSAmIDB4MWY7Ci0JCQlyYiA9IChpbnN0ciA+PiAxMSkgJiAweDFmOwotCQkJaWYgKHJzID09IHJiKSB7CQkvKiBtciAqLwotCQkJCXJkID0gKGluc3RyID4+IDE2KSAmIDB4MWY7Ci0JCQkJcmVncy0+Z3ByW3JkXSA9IHJlZ3MtPmdwcltyc107Ci0JCQkJZ290byBtdHNwcl9vdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDNhNjoJLyogbXRzcHIgKi8KKworCQljYXNlIDQ2NzoJLyogbXRzcHIgKi8KIAkJCXNwciA9IChpbnN0ciA+PiAxMSkgJiAweDNmZjsKIAkJCXN3aXRjaCAoc3ByKSB7CiAJCQljYXNlIDB4MjA6CS8qIG10eGVyICovCiAJCQkJcmVncy0+eGVyID0gKHJlZ3MtPmdwcltyZF0gJiAweGZmZmZmZmZmVUwpOwotCQkJCWdvdG8gbXRzcHJfb3V0OworCQkJCWdvdG8gaW5zdHJfZG9uZTsKIAkJCWNhc2UgMHgxMDA6CS8qIG10bHIgKi8KIAkJCQlyZWdzLT5saW5rID0gcmVncy0+Z3ByW3JkXTsKLQkJCQlnb3RvIG10c3ByX291dDsKKwkJCQlnb3RvIGluc3RyX2RvbmU7CiAJCQljYXNlIDB4MTIwOgkvKiBtdGN0ciAqLwogCQkJCXJlZ3MtPmN0ciA9IHJlZ3MtPmdwcltyZF07Ci1tdHNwcl9vdXQ6Ci0JCQkJcmVncy0+bmlwICs9IDQ7Ci0JCQkJcmV0dXJuIDE7CisJCQkJZ290byBpbnN0cl9kb25lOwogCQkJfQorCQkJYnJlYWs7CisKKy8qCisgKiBDb21wYXJlIGluc3RydWN0aW9ucworICovCisJCWNhc2UgMDoJLyogY21wICovCisJCQl2YWwgPSByZWdzLT5ncHJbcmFdOworCQkJdmFsMiA9IHJlZ3MtPmdwcltyYl07CisjaWZkZWYgX19wb3dlcnBjNjRfXworCQkJaWYgKChyZCAmIDEpID09IDApIHsKKwkJCQkvKiB3b3JkICgzMi1iaXQpIGNvbXBhcmUgKi8KKwkJCQl2YWwgPSAoaW50KSB2YWw7CisJCQkJdmFsMiA9IChpbnQpIHZhbDI7CisJCQl9CisjZW5kaWYKKwkJCWRvX2NtcF9zaWduZWQocmVncywgdmFsLCB2YWwyLCByZCA+PiAyKTsKKwkJCWdvdG8gaW5zdHJfZG9uZTsKKworCQljYXNlIDMyOgkvKiBjbXBsICovCisJCQl2YWwgPSByZWdzLT5ncHJbcmFdOworCQkJdmFsMiA9IHJlZ3MtPmdwcltyYl07CisjaWZkZWYgX19wb3dlcnBjNjRfXworCQkJaWYgKChyZCAmIDEpID09IDApIHsKKwkJCQkvKiB3b3JkICgzMi1iaXQpIGNvbXBhcmUgKi8KKwkJCQl2YWwgPSAodW5zaWduZWQgaW50KSB2YWw7CisJCQkJdmFsMiA9ICh1bnNpZ25lZCBpbnQpIHZhbDI7CisJCQl9CisjZW5kaWYKKwkJCWRvX2NtcF91bnNpZ25lZChyZWdzLCB2YWwsIHZhbDIsIHJkID4+IDIpOworCQkJZ290byBpbnN0cl9kb25lOworCisvKgorICogQXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMKKyAqLworCQljYXNlIDg6CS8qIHN1YmZjICovCisJCQlhZGRfd2l0aF9jYXJyeShyZWdzLCByZCwgfnJlZ3MtPmdwcltyYV0sCisJCQkJICAgICAgIHJlZ3MtPmdwcltyYl0sIDEpOworCQkJZ290byBhcml0aF9kb25lOworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJY2FzZSA5OgkvKiBtdWxoZHUgKi8KKwkJCWFzbSgibXVsaGR1ICUwLCUxLCUyIiA6ICI9ciIgKHJlZ3MtPmdwcltyZF0pIDoKKwkJCSAgICAiciIgKHJlZ3MtPmdwcltyYV0pLCAiciIgKHJlZ3MtPmdwcltyYl0pKTsKKwkJCWdvdG8gYXJpdGhfZG9uZTsKKyNlbmRpZgorCQljYXNlIDEwOgkvKiBhZGRjICovCisJCQlhZGRfd2l0aF9jYXJyeShyZWdzLCByZCwgcmVncy0+Z3ByW3JhXSwKKwkJCQkgICAgICAgcmVncy0+Z3ByW3JiXSwgMCk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSAxMToJLyogbXVsaHd1ICovCisJCQlhc20oIm11bGh3dSAlMCwlMSwlMiIgOiAiPXIiIChyZWdzLT5ncHJbcmRdKSA6CisJCQkgICAgInIiIChyZWdzLT5ncHJbcmFdKSwgInIiIChyZWdzLT5ncHJbcmJdKSk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSA0MDoJLyogc3ViZiAqLworCQkJcmVncy0+Z3ByW3JkXSA9IHJlZ3MtPmdwcltyYl0gLSByZWdzLT5ncHJbcmFdOworCQkJZ290byBhcml0aF9kb25lOworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJY2FzZSA3MzoJLyogbXVsaGQgKi8KKwkJCWFzbSgibXVsaGQgJTAsJTEsJTIiIDogIj1yIiAocmVncy0+Z3ByW3JkXSkgOgorCQkJICAgICJyIiAocmVncy0+Z3ByW3JhXSksICJyIiAocmVncy0+Z3ByW3JiXSkpOworCQkJZ290byBhcml0aF9kb25lOworI2VuZGlmCisJCWNhc2UgNzU6CS8qIG11bGh3ICovCisJCQlhc20oIm11bGh3ICUwLCUxLCUyIiA6ICI9ciIgKHJlZ3MtPmdwcltyZF0pIDoKKwkJCSAgICAiciIgKHJlZ3MtPmdwcltyYV0pLCAiciIgKHJlZ3MtPmdwcltyYl0pKTsKKwkJCWdvdG8gYXJpdGhfZG9uZTsKKworCQljYXNlIDEwNDoJLyogbmVnICovCisJCQlyZWdzLT5ncHJbcmRdID0gLXJlZ3MtPmdwcltyYV07CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSAxMzY6CS8qIHN1YmZlICovCisJCQlhZGRfd2l0aF9jYXJyeShyZWdzLCByZCwgfnJlZ3MtPmdwcltyYV0sIHJlZ3MtPmdwcltyYl0sCisJCQkJICAgICAgIHJlZ3MtPnhlciAmIFhFUl9DQSk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSAxMzg6CS8qIGFkZGUgKi8KKwkJCWFkZF93aXRoX2NhcnJ5KHJlZ3MsIHJkLCByZWdzLT5ncHJbcmFdLCByZWdzLT5ncHJbcmJdLAorCQkJCSAgICAgICByZWdzLT54ZXIgJiBYRVJfQ0EpOworCQkJZ290byBhcml0aF9kb25lOworCisJCWNhc2UgMjAwOgkvKiBzdWJmemUgKi8KKwkJCWFkZF93aXRoX2NhcnJ5KHJlZ3MsIHJkLCB+cmVncy0+Z3ByW3JhXSwgMEwsCisJCQkJICAgICAgIHJlZ3MtPnhlciAmIFhFUl9DQSk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSAyMDI6CS8qIGFkZHplICovCisJCQlhZGRfd2l0aF9jYXJyeShyZWdzLCByZCwgcmVncy0+Z3ByW3JhXSwgMEwsCisJCQkJICAgICAgIHJlZ3MtPnhlciAmIFhFUl9DQSk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSAyMzI6CS8qIHN1YmZtZSAqLworCQkJYWRkX3dpdGhfY2FycnkocmVncywgcmQsIH5yZWdzLT5ncHJbcmFdLCAtMUwsCisJCQkJICAgICAgIHJlZ3MtPnhlciAmIFhFUl9DQSk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisjaWZkZWYgX19wb3dlcnBjNjRfXworCQljYXNlIDIzMzoJLyogbXVsbGQgKi8KKwkJCXJlZ3MtPmdwcltyZF0gPSByZWdzLT5ncHJbcmFdICogcmVncy0+Z3ByW3JiXTsKKwkJCWdvdG8gYXJpdGhfZG9uZTsKKyNlbmRpZgorCQljYXNlIDIzNDoJLyogYWRkbWUgKi8KKwkJCWFkZF93aXRoX2NhcnJ5KHJlZ3MsIHJkLCByZWdzLT5ncHJbcmFdLCAtMUwsCisJCQkJICAgICAgIHJlZ3MtPnhlciAmIFhFUl9DQSk7CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKwkJY2FzZSAyMzU6CS8qIG11bGx3ICovCisJCQlyZWdzLT5ncHJbcmRdID0gKHVuc2lnbmVkIGludCkgcmVncy0+Z3ByW3JhXSAqCisJCQkJKHVuc2lnbmVkIGludCkgcmVncy0+Z3ByW3JiXTsKKwkJCWdvdG8gYXJpdGhfZG9uZTsKKworCQljYXNlIDI2NjoJLyogYWRkICovCisJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+Z3ByW3JhXSArIHJlZ3MtPmdwcltyYl07CisJCQlnb3RvIGFyaXRoX2RvbmU7CisjaWZkZWYgX19wb3dlcnBjNjRfXworCQljYXNlIDQ1NzoJLyogZGl2ZHUgKi8KKwkJCXJlZ3MtPmdwcltyZF0gPSByZWdzLT5ncHJbcmFdIC8gcmVncy0+Z3ByW3JiXTsKKwkJCWdvdG8gYXJpdGhfZG9uZTsKKyNlbmRpZgorCQljYXNlIDQ1OToJLyogZGl2d3UgKi8KKwkJCXJlZ3MtPmdwcltyZF0gPSAodW5zaWduZWQgaW50KSByZWdzLT5ncHJbcmFdIC8KKwkJCQkodW5zaWduZWQgaW50KSByZWdzLT5ncHJbcmJdOworCQkJZ290byBhcml0aF9kb25lOworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJY2FzZSA0ODk6CS8qIGRpdmQgKi8KKwkJCXJlZ3MtPmdwcltyZF0gPSAobG9uZyBpbnQpIHJlZ3MtPmdwcltyYV0gLworCQkJCShsb25nIGludCkgcmVncy0+Z3ByW3JiXTsKKwkJCWdvdG8gYXJpdGhfZG9uZTsKKyNlbmRpZgorCQljYXNlIDQ5MToJLyogZGl2dyAqLworCQkJcmVncy0+Z3ByW3JkXSA9IChpbnQpIHJlZ3MtPmdwcltyYV0gLworCQkJCShpbnQpIHJlZ3MtPmdwcltyYl07CisJCQlnb3RvIGFyaXRoX2RvbmU7CisKKworLyoKKyAqIExvZ2ljYWwgaW5zdHJ1Y3Rpb25zCisgKi8KKwkJY2FzZSAyNjoJLyogY250bHp3ICovCisJCQlhc20oImNudGx6dyAlMCwlMSIgOiAiPXIiIChyZWdzLT5ncHJbcmFdKSA6CisJCQkgICAgInIiIChyZWdzLT5ncHJbcmRdKSk7CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJCWNhc2UgNTg6CS8qIGNudGx6ZCAqLworCQkJYXNtKCJjbnRsemQgJTAsJTEiIDogIj1yIiAocmVncy0+Z3ByW3JhXSkgOgorCQkJICAgICJyIiAocmVncy0+Z3ByW3JkXSkpOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisjZW5kaWYKKwkJY2FzZSAyODoJLyogYW5kICovCisJCQlyZWdzLT5ncHJbcmFdID0gcmVncy0+Z3ByW3JkXSAmIHJlZ3MtPmdwcltyYl07CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKworCQljYXNlIDYwOgkvKiBhbmRjICovCisJCQlyZWdzLT5ncHJbcmFdID0gcmVncy0+Z3ByW3JkXSAmIH5yZWdzLT5ncHJbcmJdOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSAxMjQ6CS8qIG5vciAqLworCQkJcmVncy0+Z3ByW3JhXSA9IH4ocmVncy0+Z3ByW3JkXSB8IHJlZ3MtPmdwcltyYl0pOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSAyODQ6CS8qIHhvciAqLworCQkJcmVncy0+Z3ByW3JhXSA9IH4ocmVncy0+Z3ByW3JkXSBeIHJlZ3MtPmdwcltyYl0pOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSAzMTY6CS8qIHhvciAqLworCQkJcmVncy0+Z3ByW3JhXSA9IHJlZ3MtPmdwcltyZF0gXiByZWdzLT5ncHJbcmJdOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSA0MTI6CS8qIG9yYyAqLworCQkJcmVncy0+Z3ByW3JhXSA9IHJlZ3MtPmdwcltyZF0gfCB+cmVncy0+Z3ByW3JiXTsKKwkJCWdvdG8gbG9naWNhbF9kb25lOworCisJCWNhc2UgNDQ0OgkvKiBvciAqLworCQkJcmVncy0+Z3ByW3JhXSA9IHJlZ3MtPmdwcltyZF0gfCByZWdzLT5ncHJbcmJdOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSA0NzY6CS8qIG5hbmQgKi8KKwkJCXJlZ3MtPmdwcltyYV0gPSB+KHJlZ3MtPmdwcltyZF0gJiByZWdzLT5ncHJbcmJdKTsKKwkJCWdvdG8gbG9naWNhbF9kb25lOworCisJCWNhc2UgOTIyOgkvKiBleHRzaCAqLworCQkJcmVncy0+Z3ByW3JhXSA9IChzaWduZWQgc2hvcnQpIHJlZ3MtPmdwcltyZF07CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKworCQljYXNlIDk1NDoJLyogZXh0c2IgKi8KKwkJCXJlZ3MtPmdwcltyYV0gPSAoc2lnbmVkIGNoYXIpIHJlZ3MtPmdwcltyZF07CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJCWNhc2UgOTg2OgkvKiBleHRzdyAqLworCQkJcmVncy0+Z3ByW3JhXSA9IChzaWduZWQgaW50KSByZWdzLT5ncHJbcmRdOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisjZW5kaWYKKworLyoKKyAqIFNoaWZ0IGluc3RydWN0aW9ucworICovCisJCWNhc2UgMjQ6CS8qIHNsdyAqLworCQkJc2ggPSByZWdzLT5ncHJbcmJdICYgMHgzZjsKKwkJCWlmIChzaCA8IDMyKQorCQkJCXJlZ3MtPmdwcltyYV0gPSAocmVncy0+Z3ByW3JkXSA8PCBzaCkgJiAweGZmZmZmZmZmVUw7CisJCQllbHNlCisJCQkJcmVncy0+Z3ByW3JhXSA9IDA7CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKworCQljYXNlIDUzNjoJLyogc3J3ICovCisJCQlzaCA9IHJlZ3MtPmdwcltyYl0gJiAweDNmOworCQkJaWYgKHNoIDwgMzIpCisJCQkJcmVncy0+Z3ByW3JhXSA9IChyZWdzLT5ncHJbcmRdICYgMHhmZmZmZmZmZlVMKSA+PiBzaDsKKwkJCWVsc2UKKwkJCQlyZWdzLT5ncHJbcmFdID0gMDsKKwkJCWdvdG8gbG9naWNhbF9kb25lOworCisJCWNhc2UgNzkyOgkvKiBzcmF3ICovCisJCQlzaCA9IHJlZ3MtPmdwcltyYl0gJiAweDNmOworCQkJaXZhbCA9IChzaWduZWQgaW50KSByZWdzLT5ncHJbcmRdOworCQkJcmVncy0+Z3ByW3JhXSA9IGl2YWwgPj4gKHNoIDwgMzIgPyBzaCA6IDMxKTsKKwkJCWlmIChpdmFsIDwgMCAmJiAoc2ggPj0gMzIgfHwgKGl2YWwgJiAoKDEgPDwgc2gpIC0gMSkpICE9IDApKQorCQkJCXJlZ3MtPnhlciB8PSBYRVJfQ0E7CisJCQllbHNlCisJCQkJcmVncy0+eGVyICY9IH5YRVJfQ0E7CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKworCQljYXNlIDgyNDoJLyogc3Jhd2kgKi8KKwkJCXNoID0gcmI7CisJCQlpdmFsID0gKHNpZ25lZCBpbnQpIHJlZ3MtPmdwcltyZF07CisJCQlyZWdzLT5ncHJbcmFdID0gaXZhbCA+PiBzaDsKKwkJCWlmIChpdmFsIDwgMCAmJiAoaXZhbCAmICgoMSA8PCBzaCkgLSAxKSkgIT0gMCkKKwkJCQlyZWdzLT54ZXIgfD0gWEVSX0NBOworCQkJZWxzZQorCQkJCXJlZ3MtPnhlciAmPSB+WEVSX0NBOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJCWNhc2UgMjc6CS8qIHNsZCAqLworCQkJc2ggPSByZWdzLT5ncHJbcmRdICYgMHg3ZjsKKwkJCWlmIChzaCA8IDY0KQorCQkJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdIDw8IHNoOworCQkJZWxzZQorCQkJCXJlZ3MtPmdwcltyYV0gPSAwOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSA1Mzk6CS8qIHNyZCAqLworCQkJc2ggPSByZWdzLT5ncHJbcmJdICYgMHg3ZjsKKwkJCWlmIChzaCA8IDY0KQorCQkJCXJlZ3MtPmdwcltyYV0gPSByZWdzLT5ncHJbcmRdID4+IHNoOworCQkJZWxzZQorCQkJCXJlZ3MtPmdwcltyYV0gPSAwOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSA3OTQ6CS8qIHNyYWQgKi8KKwkJCXNoID0gcmVncy0+Z3ByW3JiXSAmIDB4N2Y7CisJCQlpdmFsID0gKHNpZ25lZCBsb25nIGludCkgcmVncy0+Z3ByW3JkXTsKKwkJCXJlZ3MtPmdwcltyYV0gPSBpdmFsID4+IChzaCA8IDY0ID8gc2ggOiA2Myk7CisJCQlpZiAoaXZhbCA8IDAgJiYgKHNoID49IDY0IHx8IChpdmFsICYgKCgxIDw8IHNoKSAtIDEpKSAhPSAwKSkKKwkJCQlyZWdzLT54ZXIgfD0gWEVSX0NBOworCQkJZWxzZQorCQkJCXJlZ3MtPnhlciAmPSB+WEVSX0NBOworCQkJZ290byBsb2dpY2FsX2RvbmU7CisKKwkJY2FzZSA4MjY6CS8qIHNyYWRpIHdpdGggc2hfNSA9IDAgKi8KKwkJY2FzZSA4Mjc6CS8qIHNyYWRpIHdpdGggc2hfNSA9IDEgKi8KKwkJCXNoID0gcmIgfCAoKGluc3RyICYgMikgPDwgNCk7CisJCQlpdmFsID0gKHNpZ25lZCBsb25nIGludCkgcmVncy0+Z3ByW3JkXTsKKwkJCXJlZ3MtPmdwcltyYV0gPSBpdmFsID4+IHNoOworCQkJaWYgKGl2YWwgPCAwICYmIChpdmFsICYgKCgxIDw8IHNoKSAtIDEpKSAhPSAwKQorCQkJCXJlZ3MtPnhlciB8PSBYRVJfQ0E7CisJCQllbHNlCisJCQkJcmVncy0+eGVyICY9IH5YRVJfQ0E7CisJCQlnb3RvIGxvZ2ljYWxfZG9uZTsKKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKKy8qCisgKiBDYWNoZSBpbnN0cnVjdGlvbnMKKyAqLworCQljYXNlIDU0OgkvKiBkY2JzdCAqLworCQkJZWEgPSB4Zm9ybV9lYShpbnN0ciwgcmVncywgMCk7CisJCQlpZiAoIWFkZHJlc3Nfb2socmVncywgZWEsIDgpKQorCQkJCXJldHVybiAwOworCQkJZXJyID0gMDsKKwkJCV9fY2FjaGVvcF91c2VyX2FzbXgoZWEsIGVyciwgImRjYnN0Iik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiAwOworCQkJZ290byBpbnN0cl9kb25lOworCisJCWNhc2UgODY6CS8qIGRjYmYgKi8KKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIDApOworCQkJaWYgKCFhZGRyZXNzX29rKHJlZ3MsIGVhLCA4KSkKKwkJCQlyZXR1cm4gMDsKKwkJCWVyciA9IDA7CisJCQlfX2NhY2hlb3BfdXNlcl9hc214KGVhLCBlcnIsICJkY2JmIik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiAwOworCQkJZ290byBpbnN0cl9kb25lOworCisJCWNhc2UgMjQ2OgkvKiBkY2J0c3QgKi8KKwkJCWlmIChyZCA9PSAwKSB7CisJCQkJZWEgPSB4Zm9ybV9lYShpbnN0ciwgcmVncywgMCk7CisJCQkJcHJlZmV0Y2h3KCh2b2lkICopIGVhKTsKKwkJCX0KKwkJCWdvdG8gaW5zdHJfZG9uZTsKKworCQljYXNlIDI3ODoJLyogZGNidCAqLworCQkJaWYgKHJkID09IDApIHsKKwkJCQllYSA9IHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKTsKKwkJCQlwcmVmZXRjaCgodm9pZCAqKSBlYSk7CisJCQl9CisJCQlnb3RvIGluc3RyX2RvbmU7CisKIAkJfQorCQlicmVhazsKIAl9Ci0JcmV0dXJuIDA7CisKKwkvKgorCSAqIEZvbGxvd2luZyBjYXNlcyBhcmUgZm9yIGxvYWRzIGFuZCBzdG9yZXMsIHNvIGJhaWwgb3V0CisJICogaWYgd2UncmUgaW4gbGl0dGxlLWVuZGlhbiBtb2RlLgorCSAqLworCWlmIChyZWdzLT5tc3IgJiBNU1JfTEUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBTYXZlIHJlZ2lzdGVyIFJBIGluIGNhc2UgaXQncyBhbiB1cGRhdGUgZm9ybSBsb2FkIG9yIHN0b3JlCisJICogYW5kIHRoZSBhY2Nlc3MgZmF1bHRzLgorCSAqLworCW9sZF9yYSA9IHJlZ3MtPmdwcltyYV07CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgMzE6CisJCXUgPSBpbnN0ciAmIDB4NDA7CisJCXN3aXRjaCAoKGluc3RyID4+IDEpICYgMHgzZmYpIHsKKwkJY2FzZSAyMDoJLyogbHdhcnggKi8KKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIDApOworCQkJaWYgKGVhICYgMykKKwkJCQlicmVhazsJCS8qIGNhbid0IGhhbmRsZSBtaXNhbGlnbmVkICovCisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKCFhZGRyZXNzX29rKHJlZ3MsIGVhLCA0KSkKKwkJCQlnb3RvIGxkc3RfZG9uZTsKKwkJCWVyciA9IDA7CisJCQlfX2dldF91c2VyX2FzbXgodmFsLCBlYSwgZXJyLCAibHdhcngiKTsKKwkJCWlmICghZXJyKQorCQkJCXJlZ3MtPmdwcltyZF0gPSB2YWw7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworCQljYXNlIDE1MDoJLyogc3R3Y3guICovCisJCQllYSA9IHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKTsKKwkJCWlmIChlYSAmIDMpCisJCQkJYnJlYWs7CQkvKiBjYW4ndCBoYW5kbGUgbWlzYWxpZ25lZCAqLworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmICghYWRkcmVzc19vayhyZWdzLCBlYSwgNCkpCisJCQkJZ290byBsZHN0X2RvbmU7CisJCQllcnIgPSAwOworCQkJX19wdXRfdXNlcl9hc214KHJlZ3MtPmdwcltyZF0sIGVhLCBlcnIsICJzdHdjeC4iLCBjcik7CisJCQlpZiAoIWVycikKKwkJCQlyZWdzLT5jY3IgPSAocmVncy0+Y2NyICYgMHgwZmZmZmZmZikgfAorCQkJCQkoY3IgJiAweGUwMDAwMDAwKSB8CisJCQkJCSgocmVncy0+eGVyID4+IDMpICYgMHgxMDAwMDAwMCk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJY2FzZSA4NDoJLyogbGRhcnggKi8KKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIDApOworCQkJaWYgKGVhICYgNykKKwkJCQlicmVhazsJCS8qIGNhbid0IGhhbmRsZSBtaXNhbGlnbmVkICovCisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKCFhZGRyZXNzX29rKHJlZ3MsIGVhLCA4KSkKKwkJCQlnb3RvIGxkc3RfZG9uZTsKKwkJCWVyciA9IDA7CisJCQlfX2dldF91c2VyX2FzbXgodmFsLCBlYSwgZXJyLCAibGRhcngiKTsKKwkJCWlmICghZXJyKQorCQkJCXJlZ3MtPmdwcltyZF0gPSB2YWw7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworCQljYXNlIDIxNDoJLyogc3RkY3guICovCisJCQllYSA9IHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKTsKKwkJCWlmIChlYSAmIDcpCisJCQkJYnJlYWs7CQkvKiBjYW4ndCBoYW5kbGUgbWlzYWxpZ25lZCAqLworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmICghYWRkcmVzc19vayhyZWdzLCBlYSwgOCkpCisJCQkJZ290byBsZHN0X2RvbmU7CisJCQllcnIgPSAwOworCQkJX19wdXRfdXNlcl9hc214KHJlZ3MtPmdwcltyZF0sIGVhLCBlcnIsICJzdGRjeC4iLCBjcik7CisJCQlpZiAoIWVycikKKwkJCQlyZWdzLT5jY3IgPSAocmVncy0+Y2NyICYgMHgwZmZmZmZmZikgfAorCQkJCQkoY3IgJiAweGUwMDAwMDAwKSB8CisJCQkJCSgocmVncy0+eGVyID4+IDMpICYgMHgxMDAwMDAwMCk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworCQljYXNlIDIxOgkvKiBsZHggKi8KKwkJY2FzZSA1MzoJLyogbGR1eCAqLworCQkJZXJyID0gcmVhZF9tZW0oJnJlZ3MtPmdwcltyZF0sIHhmb3JtX2VhKGluc3RyLCByZWdzLCB1KSwKKwkJCQkgICAgICAgOCwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKyNlbmRpZgorCisJCWNhc2UgMjM6CS8qIGx3enggKi8KKwkJY2FzZSA1NToJLyogbHd6dXggKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSksCisJCQkJICAgICAgIDQsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKwkJY2FzZSA4NzoJLyogbGJ6eCAqLworCQljYXNlIDExOToJLyogbGJ6dXggKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSksCisJCQkJICAgICAgIDEsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCQljYXNlIDEwMzoJLyogbHZ4ICovCisJCWNhc2UgMzU5OgkvKiBsdnhsICovCisJCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfVkVDKSkKKwkJCQlicmVhazsKKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIDApOworCQkJZXJyID0gZG9fdmVjX2xvYWQocmQsIGRvX2x2eCwgZWEsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKwkJY2FzZSAyMzE6CS8qIHN0dnggKi8KKwkJY2FzZSA0ODc6CS8qIHN0dnhsICovCisJCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfVkVDKSkKKwkJCQlicmVhazsKKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIDApOworCQkJZXJyID0gZG9fdmVjX3N0b3JlKHJkLCBkb19zdHZ4LCBlYSwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKyNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLworCisjaWZkZWYgX19wb3dlcnBjNjRfXworCQljYXNlIDE0OToJLyogc3RkeCAqLworCQljYXNlIDE4MToJLyogc3RkdXggKi8KKwkJCXZhbCA9IHJlZ3MtPmdwcltyZF07CisJCQllcnIgPSB3cml0ZV9tZW0odmFsLCB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSksIDgsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisjZW5kaWYKKworCQljYXNlIDE1MToJLyogc3R3eCAqLworCQljYXNlIDE4MzoJLyogc3R3dXggKi8KKwkJCXZhbCA9IHJlZ3MtPmdwcltyZF07CisJCQllcnIgPSB3cml0ZV9tZW0odmFsLCB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSksIDQsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKwkJY2FzZSAyMTU6CS8qIHN0YnggKi8KKwkJY2FzZSAyNDc6CS8qIHN0YnV4ICovCisJCQl2YWwgPSByZWdzLT5ncHJbcmRdOworCQkJZXJyID0gd3JpdGVfbWVtKHZhbCwgeGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpLCAxLCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCisJCWNhc2UgMjc5OgkvKiBsaHp4ICovCisJCWNhc2UgMzExOgkvKiBsaHp1eCAqLworCQkJZXJyID0gcmVhZF9tZW0oJnJlZ3MtPmdwcltyZF0sIHhmb3JtX2VhKGluc3RyLCByZWdzLCB1KSwKKwkJCQkgICAgICAgMiwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwkJY2FzZSAzNDE6CS8qIGx3YXggKi8KKwkJY2FzZSAzNzM6CS8qIGx3YXV4ICovCisJCQllcnIgPSByZWFkX21lbSgmcmVncy0+Z3ByW3JkXSwgeGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpLAorCQkJCSAgICAgICA0LCByZWdzKTsKKwkJCWlmICghZXJyKQorCQkJCXJlZ3MtPmdwcltyZF0gPSAoc2lnbmVkIGludCkgcmVncy0+Z3ByW3JkXTsKKwkJCWdvdG8gbGRzdF9kb25lOworI2VuZGlmCisKKwkJY2FzZSAzNDM6CS8qIGxoYXggKi8KKwkJY2FzZSAzNzU6CS8qIGxoYXV4ICovCisJCQllcnIgPSByZWFkX21lbSgmcmVncy0+Z3ByW3JkXSwgeGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpLAorCQkJCSAgICAgICAyLCByZWdzKTsKKwkJCWlmICghZXJyKQorCQkJCXJlZ3MtPmdwcltyZF0gPSAoc2lnbmVkIHNob3J0KSByZWdzLT5ncHJbcmRdOworCQkJZ290byBsZHN0X2RvbmU7CisKKwkJY2FzZSA0MDc6CS8qIHN0aHggKi8KKwkJY2FzZSA0Mzk6CS8qIHN0aHV4ICovCisJCQl2YWwgPSByZWdzLT5ncHJbcmRdOworCQkJZXJyID0gd3JpdGVfbWVtKHZhbCwgeGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpLCAyLCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCisjaWZkZWYgX19wb3dlcnBjNjRfXworCQljYXNlIDUzMjoJLyogbGRicnggKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZ2YWwsIHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKSwgOCwgcmVncyk7CisJCQlpZiAoIWVycikKKwkJCQlyZWdzLT5ncHJbcmRdID0gYnl0ZXJldl84KHZhbCk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworI2VuZGlmCisKKwkJY2FzZSA1MzQ6CS8qIGx3YnJ4ICovCisJCQllcnIgPSByZWFkX21lbSgmdmFsLCB4Zm9ybV9lYShpbnN0ciwgcmVncywgMCksIDQsIHJlZ3MpOworCQkJaWYgKCFlcnIpCisJCQkJcmVncy0+Z3ByW3JkXSA9IGJ5dGVyZXZfNCh2YWwpOworCQkJZ290byBsZHN0X2RvbmU7CisKKwkJY2FzZSA1MzU6CS8qIGxmc3ggKi8KKwkJY2FzZSA1Njc6CS8qIGxmc3V4ICovCisJCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfRlApKQorCQkJCWJyZWFrOworCQkJZWEgPSB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSk7CisJCQllcnIgPSBkb19mcF9sb2FkKHJkLCBkb19sZnMsIGVhLCA0LCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCisJCWNhc2UgNTk5OgkvKiBsZmR4ICovCisJCWNhc2UgNjMxOgkvKiBsZmR1eCAqLworCQkJaWYgKCEocmVncy0+bXNyICYgTVNSX0ZQKSkKKwkJCQlicmVhazsKKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpOworCQkJZXJyID0gZG9fZnBfbG9hZChyZCwgZG9fbGZkLCBlYSwgOCwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworCQljYXNlIDY2MzoJLyogc3Rmc3ggKi8KKwkJY2FzZSA2OTU6CS8qIHN0ZnN1eCAqLworCQkJaWYgKCEocmVncy0+bXNyICYgTVNSX0ZQKSkKKwkJCQlicmVhazsKKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpOworCQkJZXJyID0gZG9fZnBfc3RvcmUocmQsIGRvX3N0ZnMsIGVhLCA0LCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCisJCWNhc2UgNzI3OgkvKiBzdGZkeCAqLworCQljYXNlIDc1OToJLyogc3RmZHV4ICovCisJCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfRlApKQorCQkJCWJyZWFrOworCQkJZWEgPSB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSk7CisJCQllcnIgPSBkb19mcF9zdG9yZShyZCwgZG9fc3RmZCwgZWEsIDgsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJCWNhc2UgNjYwOgkvKiBzdGRicnggKi8KKwkJCXZhbCA9IGJ5dGVyZXZfOChyZWdzLT5ncHJbcmRdKTsKKwkJCWVyciA9IHdyaXRlX21lbSh2YWwsIHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKSwgOCwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworI2VuZGlmCisJCWNhc2UgNjYyOgkvKiBzdHdicnggKi8KKwkJCXZhbCA9IGJ5dGVyZXZfNChyZWdzLT5ncHJbcmRdKTsKKwkJCWVyciA9IHdyaXRlX21lbSh2YWwsIHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKSwgNCwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworCQljYXNlIDc5MDoJLyogbGhicnggKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZ2YWwsIHhmb3JtX2VhKGluc3RyLCByZWdzLCAwKSwgMiwgcmVncyk7CisJCQlpZiAoIWVycikKKwkJCQlyZWdzLT5ncHJbcmRdID0gYnl0ZXJldl8yKHZhbCk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKworCQljYXNlIDkxODoJLyogc3RoYnJ4ICovCisJCQl2YWwgPSBieXRlcmV2XzIocmVncy0+Z3ByW3JkXSk7CisJCQllcnIgPSB3cml0ZV9tZW0odmFsLCB4Zm9ybV9lYShpbnN0ciwgcmVncywgMCksIDIsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKyNpZmRlZiBDT05GSUdfVlNYCisJCWNhc2UgODQ0OgkvKiBseHZkMnggKi8KKwkJY2FzZSA4NzY6CS8qIGx4dmQydXggKi8KKwkJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9WU1gpKQorCQkJCWJyZWFrOworCQkJcmQgfD0gKGluc3RyICYgMSkgPDwgNTsKKwkJCWVhID0geGZvcm1fZWEoaW5zdHIsIHJlZ3MsIHUpOworCQkJZXJyID0gZG9fdnN4X2xvYWQocmQsIGRvX2x4dmQyeCwgZWEsIHJlZ3MpOworCQkJZ290byBsZHN0X2RvbmU7CisKKwkJY2FzZSA5NzI6CS8qIHN0eHZkMnggKi8KKwkJY2FzZSAxMDA0OgkvKiBzdHh2ZDJ1eCAqLworCQkJaWYgKCEocmVncy0+bXNyICYgTVNSX1ZTWCkpCisJCQkJYnJlYWs7CisJCQlyZCB8PSAoaW5zdHIgJiAxKSA8PCA1OworCQkJZWEgPSB4Zm9ybV9lYShpbnN0ciwgcmVncywgdSk7CisJCQllcnIgPSBkb192c3hfc3RvcmUocmQsIGRvX3N0eHZkMngsIGVhLCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCisjZW5kaWYgLyogQ09ORklHX1ZTWCAqLworCQl9CisJCWJyZWFrOworCisJY2FzZSAzMjoJLyogbHd6ICovCisJY2FzZSAzMzoJLyogbHd6dSAqLworCQllcnIgPSByZWFkX21lbSgmcmVncy0+Z3ByW3JkXSwgZGZvcm1fZWEoaW5zdHIsIHJlZ3MpLCA0LCByZWdzKTsKKwkJZ290byBsZHN0X2RvbmU7CisKKwljYXNlIDM0OgkvKiBsYnogKi8KKwljYXNlIDM1OgkvKiBsYnp1ICovCisJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCBkZm9ybV9lYShpbnN0ciwgcmVncyksIDEsIHJlZ3MpOworCQlnb3RvIGxkc3RfZG9uZTsKKworCWNhc2UgMzY6CS8qIHN0dyAqLworCWNhc2UgMzc6CS8qIHN0d3UgKi8KKwkJdmFsID0gcmVncy0+Z3ByW3JkXTsKKwkJZXJyID0gd3JpdGVfbWVtKHZhbCwgZGZvcm1fZWEoaW5zdHIsIHJlZ3MpLCA0LCByZWdzKTsKKwkJZ290byBsZHN0X2RvbmU7CisKKwljYXNlIDM4OgkvKiBzdGIgKi8KKwljYXNlIDM5OgkvKiBzdGJ1ICovCisJCXZhbCA9IHJlZ3MtPmdwcltyZF07CisJCWVyciA9IHdyaXRlX21lbSh2YWwsIGRmb3JtX2VhKGluc3RyLCByZWdzKSwgMSwgcmVncyk7CisJCWdvdG8gbGRzdF9kb25lOworCisJY2FzZSA0MDoJLyogbGh6ICovCisJY2FzZSA0MToJLyogbGh6dSAqLworCQllcnIgPSByZWFkX21lbSgmcmVncy0+Z3ByW3JkXSwgZGZvcm1fZWEoaW5zdHIsIHJlZ3MpLCAyLCByZWdzKTsKKwkJZ290byBsZHN0X2RvbmU7CisKKwljYXNlIDQyOgkvKiBsaGEgKi8KKwljYXNlIDQzOgkvKiBsaGF1ICovCisJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCBkZm9ybV9lYShpbnN0ciwgcmVncyksIDIsIHJlZ3MpOworCQlpZiAoIWVycikKKwkJCXJlZ3MtPmdwcltyZF0gPSAoc2lnbmVkIHNob3J0KSByZWdzLT5ncHJbcmRdOworCQlnb3RvIGxkc3RfZG9uZTsKKworCWNhc2UgNDQ6CS8qIHN0aCAqLworCWNhc2UgNDU6CS8qIHN0aHUgKi8KKwkJdmFsID0gcmVncy0+Z3ByW3JkXTsKKwkJZXJyID0gd3JpdGVfbWVtKHZhbCwgZGZvcm1fZWEoaW5zdHIsIHJlZ3MpLCAyLCByZWdzKTsKKwkJZ290byBsZHN0X2RvbmU7CisKKwljYXNlIDQ2OgkvKiBsbXcgKi8KKwkJcmEgPSAoaW5zdHIgPj4gMTYpICYgMHgxZjsKKwkJaWYgKHJhID49IHJkKQorCQkJYnJlYWs7CQkvKiBpbnZhbGlkIGZvcm0sIHJhIGluIHJhbmdlIHRvIGxvYWQgKi8KKwkJZWEgPSBkZm9ybV9lYShpbnN0ciwgcmVncyk7CisJCWRvIHsKKwkJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCBlYSwgNCwgcmVncyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiAwOworCQkJZWEgKz0gNDsKKwkJfSB3aGlsZSAoKytyZCA8IDMyKTsKKwkJZ290byBpbnN0cl9kb25lOworCisJY2FzZSA0NzoJLyogc3RtdyAqLworCQllYSA9IGRmb3JtX2VhKGluc3RyLCByZWdzKTsKKwkJZG8geworCQkJZXJyID0gd3JpdGVfbWVtKHJlZ3MtPmdwcltyZF0sIGVhLCA0LCByZWdzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIDA7CisJCQllYSArPSA0OworCQl9IHdoaWxlICgrK3JkIDwgMzIpOworCQlnb3RvIGluc3RyX2RvbmU7CisKKwljYXNlIDQ4OgkvKiBsZnMgKi8KKwljYXNlIDQ5OgkvKiBsZnN1ICovCisJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9GUCkpCisJCQlicmVhazsKKwkJZWEgPSBkZm9ybV9lYShpbnN0ciwgcmVncyk7CisJCWVyciA9IGRvX2ZwX2xvYWQocmQsIGRvX2xmcywgZWEsIDQsIHJlZ3MpOworCQlnb3RvIGxkc3RfZG9uZTsKKworCWNhc2UgNTA6CS8qIGxmZCAqLworCWNhc2UgNTE6CS8qIGxmZHUgKi8KKwkJaWYgKCEocmVncy0+bXNyICYgTVNSX0ZQKSkKKwkJCWJyZWFrOworCQllYSA9IGRmb3JtX2VhKGluc3RyLCByZWdzKTsKKwkJZXJyID0gZG9fZnBfbG9hZChyZCwgZG9fbGZkLCBlYSwgOCwgcmVncyk7CisJCWdvdG8gbGRzdF9kb25lOworCisJY2FzZSA1MjoJLyogc3RmcyAqLworCWNhc2UgNTM6CS8qIHN0ZnN1ICovCisJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9GUCkpCisJCQlicmVhazsKKwkJZWEgPSBkZm9ybV9lYShpbnN0ciwgcmVncyk7CisJCWVyciA9IGRvX2ZwX3N0b3JlKHJkLCBkb19zdGZzLCBlYSwgNCwgcmVncyk7CisJCWdvdG8gbGRzdF9kb25lOworCisJY2FzZSA1NDoJLyogc3RmZCAqLworCWNhc2UgNTU6CS8qIHN0ZmR1ICovCisJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9GUCkpCisJCQlicmVhazsKKwkJZWEgPSBkZm9ybV9lYShpbnN0ciwgcmVncyk7CisJCWVyciA9IGRvX2ZwX3N0b3JlKHJkLCBkb19zdGZkLCBlYSwgOCwgcmVncyk7CisJCWdvdG8gbGRzdF9kb25lOworCisjaWZkZWYgX19wb3dlcnBjNjRfXworCWNhc2UgNTg6CS8qIGxkW3VdLCBsd2EgKi8KKwkJc3dpdGNoIChpbnN0ciAmIDMpIHsKKwkJY2FzZSAwOgkJLyogbGQgKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCBkc2Zvcm1fZWEoaW5zdHIsIHJlZ3MpLAorCQkJCSAgICAgICA4LCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCQljYXNlIDE6CQkvKiBsZHUgKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCBkc2Zvcm1fZWEoaW5zdHIsIHJlZ3MpLAorCQkJCSAgICAgICA4LCByZWdzKTsKKwkJCWdvdG8gbGRzdF9kb25lOworCQljYXNlIDI6CQkvKiBsd2EgKi8KKwkJCWVyciA9IHJlYWRfbWVtKCZyZWdzLT5ncHJbcmRdLCBkc2Zvcm1fZWEoaW5zdHIsIHJlZ3MpLAorCQkJCSAgICAgICA0LCByZWdzKTsKKwkJCWlmICghZXJyKQorCQkJCXJlZ3MtPmdwcltyZF0gPSAoc2lnbmVkIGludCkgcmVncy0+Z3ByW3JkXTsKKwkJCWdvdG8gbGRzdF9kb25lOworCQl9CisJCWJyZWFrOworCisJY2FzZSA2MjoJLyogc3RkW3VdICovCisJCXZhbCA9IHJlZ3MtPmdwcltyZF07CisJCXN3aXRjaCAoaW5zdHIgJiAzKSB7CisJCWNhc2UgMDoJCS8qIHN0ZCAqLworCQkJZXJyID0gd3JpdGVfbWVtKHZhbCwgZHNmb3JtX2VhKGluc3RyLCByZWdzKSwgOCwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKwkJY2FzZSAxOgkJLyogc3RkdSAqLworCQkJZXJyID0gd3JpdGVfbWVtKHZhbCwgZHNmb3JtX2VhKGluc3RyLCByZWdzKSwgOCwgcmVncyk7CisJCQlnb3RvIGxkc3RfZG9uZTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKKwl9CisJZXJyID0gLUVJTlZBTDsKKworIGxkc3RfZG9uZToKKwlpZiAoZXJyKSB7CisJCXJlZ3MtPmdwcltyYV0gPSBvbGRfcmE7CisJCXJldHVybiAwOwkvKiBpbnZva2UgRFNJIGlmIC1FRkFVTFQ/ICovCisJfQorIGluc3RyX2RvbmU6CisJcmVncy0+bmlwICs9IDQ7CisjaWZkZWYgX19wb3dlcnBjNjRfXworCWlmICgocmVncy0+bXNyICYgTVNSX1NGKSA9PSAwKQorCQlyZWdzLT5uaXAgJj0gMHhmZmZmZmZmZlVMOworI2VuZGlmCisJcmV0dXJuIDE7CisKKyBsb2dpY2FsX2RvbmU6CisJaWYgKGluc3RyICYgMSkKKwkJc2V0X2NyMChyZWdzLCByYSk7CisJZ290byBpbnN0cl9kb25lOworCisgYXJpdGhfZG9uZToKKwlpZiAoaW5zdHIgJiAxKQorCQlzZXRfY3IwKHJlZ3MsIHJkKTsKKwlnb3RvIGluc3RyX2RvbmU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwppbmRleCBjZGM3NTI2Li40YjY2YTFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKQEAgLTEwNCw5ICsxMDQsMTAgQEAKIH0KIAogLyoKLSAqIFNldCB1cCBvbmUgb2YgdGhlIEkvRCBCQVQgKGJsb2NrIGFkZHJlc3MgdHJhbnNsYXRpb24pIHJlZ2lzdGVyIHBhaXJzLgotICogVGhlIHBhcmFtZXRlcnMgYXJlIG5vdCBjaGVja2VkOyBpbiBwYXJ0aWN1bGFyIHNpemUgbXVzdCBiZSBhIHBvd2VyCi0gKiBvZiA0IGJldHdlZW4gNGsgYW5kIDI1Nk0uCisgKiBTZXQgdXAgYSB2YXJpYWJsZS1zaXplIFRMQiBlbnRyeSAodGxiY2FtKS4gVGhlIHBhcmFtZXRlcnMgYXJlIG5vdCBjaGVja2VkOworICogaW4gcGFydGljdWxhciBzaXplIG11c3QgYmUgYSBwb3dlciBvZiA0IGJldHdlZW4gNGsgYW5kIDI1Nk0gKG9yIDFHLCBmb3IgY3B1cworICogdGhhdCBzdXBwb3J0IGV4dGVuZGVkIHBhZ2Ugc2l6ZXMpLiAgTm90ZSB0aGF0IHdoaWxlIHNvbWUgY3B1cyBzdXBwb3J0IGEKKyAqIHBhZ2Ugc2l6ZSBvZiA0Rywgd2UgZG9uJ3QgYWxsb3cgaXRzIHVzZSBoZXJlLgogICovCiBzdGF0aWMgdm9pZCBzZXR0bGJjYW0oaW50IGluZGV4LCB1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCiAJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgaW50IHBpZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IGFhNzMxYWYuLjAwMjg3OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtNDIsNiArNDIsMTIgQEAKIAogc3RhdGljIGludCBtaW5fY29tbW9uX2RlcHRoOwogc3RhdGljIGludCBuX21lbV9hZGRyX2NlbGxzLCBuX21lbV9zaXplX2NlbGxzOworc3RhdGljIGludCBmb3JtMV9hZmZpbml0eTsKKworI2RlZmluZSBNQVhfRElTVEFOQ0VfUkVGX1BPSU5UUyA0CitzdGF0aWMgaW50IGRpc3RhbmNlX3JlZl9wb2ludHNfZGVwdGg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ICpkaXN0YW5jZV9yZWZfcG9pbnRzOworc3RhdGljIGludCBkaXN0YW5jZV9sb29rdXBfdGFibGVbTUFYX05VTU5PREVTXVtNQVhfRElTVEFOQ0VfUkVGX1BPSU5UU107CiAKIC8qCiAgKiBBbGxvY2F0ZSBub2RlX3RvX2NwdW1hc2tfbWFwIGJhc2VkIG9uIG51bWJlciBvZiBhdmFpbGFibGUgbm9kZXMKQEAgLTIwNCw2ICsyMTAsMzkgQEAKIAlyZXR1cm4gcHJvcDsKIH0KIAoraW50IF9fbm9kZV9kaXN0YW5jZShpbnQgYSwgaW50IGIpCit7CisJaW50IGk7CisJaW50IGRpc3RhbmNlID0gTE9DQUxfRElTVEFOQ0U7CisKKwlpZiAoIWZvcm0xX2FmZmluaXR5KQorCQlyZXR1cm4gZGlzdGFuY2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aDsgaSsrKSB7CisJCWlmIChkaXN0YW5jZV9sb29rdXBfdGFibGVbYV1baV0gPT0gZGlzdGFuY2VfbG9va3VwX3RhYmxlW2JdW2ldKQorCQkJYnJlYWs7CisKKwkJLyogRG91YmxlIHRoZSBkaXN0YW5jZSBmb3IgZWFjaCBOVU1BIGxldmVsICovCisJCWRpc3RhbmNlICo9IDI7CisJfQorCisJcmV0dXJuIGRpc3RhbmNlOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2Rpc3RhbmNlX2xvb2t1cF90YWJsZShpbnQgbmlkLAorCQljb25zdCB1bnNpZ25lZCBpbnQgKmFzc29jaWF0aXZpdHkpCit7CisJaW50IGk7CisKKwlpZiAoIWZvcm0xX2FmZmluaXR5KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aDsgaSsrKSB7CisJCWRpc3RhbmNlX2xvb2t1cF90YWJsZVtuaWRdW2ldID0KKwkJCWFzc29jaWF0aXZpdHlbZGlzdGFuY2VfcmVmX3BvaW50c1tpXV07CisJfQorfQorCiAvKiBSZXR1cm5zIG5pZCBpbiB0aGUgcmFuZ2UgWzAuLk1BWF9OVU1OT0RFUy0xXSwgb3IgLTEgaWYgbm8gdXNlZnVsIG51bWEKICAqIGluZm8gaXMgZm91bmQuCiAgKi8KQEAgLTIyNSw2ICsyNjQsMTAgQEAKIAkvKiBQT1dFUjQgTFBBUiB1c2VzIDB4ZmZmZiBhcyBpbnZhbGlkIG5vZGUgKi8KIAlpZiAobmlkID09IDB4ZmZmZiB8fCBuaWQgPj0gTUFYX05VTU5PREVTKQogCQluaWQgPSAtMTsKKworCWlmIChuaWQgPiAwICYmIHRtcFswXSA+PSBkaXN0YW5jZV9yZWZfcG9pbnRzX2RlcHRoKQorCQlpbml0aWFsaXplX2Rpc3RhbmNlX2xvb2t1cF90YWJsZShuaWQsIHRtcCk7CisKIG91dDoKIAlyZXR1cm4gbmlkOwogfQpAQCAtMjUxLDI2ICsyOTQsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9mX25vZGVfdG9fbmlkKTsKIAotLyoKLSAqIEluIHRoZW9yeSwgdGhlICJpYm0sYXNzb2NpYXRpdml0eSIgcHJvcGVydHkgbWF5IGNvbnRhaW4gbXVsdGlwbGUKLSAqIGFzc29jaWF0aXZpdHkgbGlzdHMgYmVjYXVzZSBhIHJlc291cmNlIG1heSBiZSBtdWx0aXBseSBjb25uZWN0ZWQKLSAqIGludG8gdGhlIG1hY2hpbmUuICBUaGlzIHJlc291cmNlIHRoZW4gaGFzIGRpZmZlcmVudCBhc3NvY2lhdGl2aXR5Ci0gKiBjaGFyYWN0ZXJpc3RpY3MgcmVsYXRpdmUgdG8gaXRzIG11bHRpcGxlIGNvbm5lY3Rpb25zLiAgV2UgaWdub3JlCi0gKiB0aGlzIGZvciBub3cuICBXZSBhbHNvIGFzc3VtZSB0aGF0IGFsbCBjcHUgYW5kIG1lbW9yeSBzZXRzIGhhdmUKLSAqIHRoZWlyIGRpc3RhbmNlcyByZXByZXNlbnRlZCBhdCBhIGNvbW1vbiBsZXZlbC4gIFRoaXMgd29uJ3QgYmUKLSAqIHRydWUgZm9yIGhpZXJhcmNoaWNhbCBOVU1BLgotICoKLSAqIEluIGFueSBjYXNlIHRoZSBpYm0sYXNzb2NpYXRpdml0eS1yZWZlcmVuY2UtcG9pbnRzIHNob3VsZCBnaXZlCi0gKiB0aGUgY29ycmVjdCBkZXB0aCBmb3IgYSBub3JtYWwgTlVNQSBzeXN0ZW0uCi0gKgotICogLSBEYXZlIEhhbnNlbiA8aGF2ZWJsdWVAdXMuaWJtLmNvbT4KLSAqLwogc3RhdGljIGludCBfX2luaXQgZmluZF9taW5fY29tbW9uX2RlcHRoKHZvaWQpCiB7Ci0JaW50IGRlcHRoLCBpbmRleDsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnJlZl9wb2ludHM7CisJaW50IGRlcHRoOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcnRhc19yb290OwotCXVuc2lnbmVkIGludCBsZW47CiAJc3RydWN0IGRldmljZV9ub2RlICpjaG9zZW47CiAJY29uc3QgY2hhciAqdmVjNTsKIApAQCAtMjgwLDE4ICszMDcsMjggQEAKIAkJcmV0dXJuIC0xOwogCiAJLyoKLQkgKiB0aGlzIHByb3BlcnR5IGlzIDIgMzItYml0IGludGVnZXJzLCBlYWNoIHJlcHJlc2VudGluZyBhIGxldmVsIG9mCi0JICogZGVwdGggaW4gdGhlIGFzc29jaWF0aXZpdHkgbm9kZXMuICBUaGUgZmlyc3QgaXMgZm9yIGFuIFNNUAotCSAqIGNvbmZpZ3VyYXRpb24gKHNob3VsZCBiZSBhbGwgMCdzKSBhbmQgdGhlIHNlY29uZCBpcyBmb3IgYSBub3JtYWwKLQkgKiBOVU1BIGNvbmZpZ3VyYXRpb24uCisJICogVGhpcyBwcm9wZXJ0eSBpcyBhIHNldCBvZiAzMi1iaXQgaW50ZWdlcnMsIGVhY2ggcmVwcmVzZW50aW5nCisJICogYW4gaW5kZXggaW50byB0aGUgaWJtLGFzc29jaWF0aXZpdHkgbm9kZXMuCisJICoKKwkgKiBXaXRoIGZvcm0gMCBhZmZpbml0eSB0aGUgZmlyc3QgaW50ZWdlciBpcyBmb3IgYW4gU01QIGNvbmZpZ3VyYXRpb24KKwkgKiAoc2hvdWxkIGJlIGFsbCAwJ3MpIGFuZCB0aGUgc2Vjb25kIGlzIGZvciBhIG5vcm1hbCBOVU1BCisJICogY29uZmlndXJhdGlvbi4gV2UgaGF2ZSBvbmx5IG9uZSBsZXZlbCBvZiBOVU1BLgorCSAqCisJICogV2l0aCBmb3JtIDEgYWZmaW5pdHkgdGhlIGZpcnN0IGludGVnZXIgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKwkgKiBOVU1BIGJvdW5kYXJ5IGFuZCB0aGUgZm9sbG93aW5nIGFyZSBwcm9ncmVzc2l2ZWx5IGxlc3Mgc2lnbmlmaWNhbnQKKwkgKiBib3VuZGFyaWVzLiBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBsZXZlbCBvZiBOVU1BLgogCSAqLwotCWluZGV4ID0gMTsKLQlyZWZfcG9pbnRzID0gb2ZfZ2V0X3Byb3BlcnR5KHJ0YXNfcm9vdCwKLQkJCSJpYm0sYXNzb2NpYXRpdml0eS1yZWZlcmVuY2UtcG9pbnRzIiwgJmxlbik7CisJZGlzdGFuY2VfcmVmX3BvaW50cyA9IG9mX2dldF9wcm9wZXJ0eShydGFzX3Jvb3QsCisJCQkJCSJpYm0sYXNzb2NpYXRpdml0eS1yZWZlcmVuY2UtcG9pbnRzIiwKKwkJCQkJJmRpc3RhbmNlX3JlZl9wb2ludHNfZGVwdGgpOwogCi0JLyoKLQkgKiBGb3IgZm9ybSAxIGFmZmluaXR5IGluZm9ybWF0aW9uIHdlIHdhbnQgdGhlIGZpcnN0IGZpZWxkCi0JICovCisJaWYgKCFkaXN0YW5jZV9yZWZfcG9pbnRzKSB7CisJCWRiZygiTlVNQTogaWJtLGFzc29jaWF0aXZpdHktcmVmZXJlbmNlLXBvaW50cyBub3QgZm91bmQuXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aCAvPSBzaXplb2YoaW50KTsKKwogI2RlZmluZSBWRUM1X0FGRklOSVRZX0JZVEUJNQogI2RlZmluZSBWRUM1X0FGRklOSVRZCQkweDgwCiAJY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW4iKTsKQEAgLTI5OSwxOSArMzM2LDM4IEBACiAJCXZlYzUgPSBvZl9nZXRfcHJvcGVydHkoY2hvc2VuLCAiaWJtLGFyY2hpdGVjdHVyZS12ZWMtNSIsIE5VTEwpOwogCQlpZiAodmVjNSAmJiAodmVjNVtWRUM1X0FGRklOSVRZX0JZVEVdICYgVkVDNV9BRkZJTklUWSkpIHsKIAkJCWRiZygiVXNpbmcgZm9ybSAxIGFmZmluaXR5XG4iKTsKLQkJCWluZGV4ID0gMDsKKwkJCWZvcm0xX2FmZmluaXR5ID0gMTsKIAkJfQogCX0KIAotCWlmICgobGVuID49IDIgKiBzaXplb2YodW5zaWduZWQgaW50KSkgJiYgcmVmX3BvaW50cykgewotCQlkZXB0aCA9IHJlZl9wb2ludHNbaW5kZXhdOworCWlmIChmb3JtMV9hZmZpbml0eSkgeworCQlkZXB0aCA9IGRpc3RhbmNlX3JlZl9wb2ludHNbMF07CiAJfSBlbHNlIHsKLQkJZGJnKCJOVU1BOiBpYm0sYXNzb2NpYXRpdml0eS1yZWZlcmVuY2UtcG9pbnRzIG5vdCBmb3VuZC5cbiIpOwotCQlkZXB0aCA9IC0xOwotCX0KLQlvZl9ub2RlX3B1dChydGFzX3Jvb3QpOworCQlpZiAoZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aCA8IDIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5VTUE6ICIKKwkJCQkic2hvcnQgaWJtLGFzc29jaWF0aXZpdHktcmVmZXJlbmNlLXBvaW50c1xuIik7CisJCQlnb3RvIGVycjsKKwkJfQogCisJCWRlcHRoID0gZGlzdGFuY2VfcmVmX3BvaW50c1sxXTsKKwl9CisKKwkvKgorCSAqIFdhcm4gYW5kIGNhcCBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgbW9yZSB0aGFuCisJICogTUFYX0RJU1RBTkNFX1JFRl9QT0lOVFMgZG9tYWlucy4KKwkgKi8KKwlpZiAoZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aCA+IE1BWF9ESVNUQU5DRV9SRUZfUE9JTlRTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5VTUE6IGRpc3RhbmNlIGFycmF5IGNhcHBlZCBhdCAiCisJCQkiJWQgZW50cmllc1xuIiwgTUFYX0RJU1RBTkNFX1JFRl9QT0lOVFMpOworCQlkaXN0YW5jZV9yZWZfcG9pbnRzX2RlcHRoID0gTUFYX0RJU1RBTkNFX1JFRl9QT0lOVFM7CisJfQorCisJb2Zfbm9kZV9wdXQocnRhc19yb290KTsKIAlyZXR1cm4gZGVwdGg7CisKK2VycjoKKwlvZl9ub2RlX3B1dChydGFzX3Jvb3QpOworCXJldHVybiAtMTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGdldF9uX21lbV9jZWxscyhpbnQgKm5fYWRkcl9jZWxscywgaW50ICpuX3NpemVfY2VsbHMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYwppbmRleCBlYmMyZjM4Li4yYzdlODAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMKQEAgLTkyLDcgKzkyLDYgQEAKIAogc3RhdGljIHZvaWQgcHRlX2ZyZWVfc3VibWl0KHN0cnVjdCBwdGVfZnJlZWxpc3RfYmF0Y2ggKmJhdGNoKQogewotCUlOSVRfUkNVX0hFQUQoJmJhdGNoLT5yY3UpOwogCWNhbGxfcmN1KCZiYXRjaC0+cmN1LCBwdGVfZnJlZV9yY3VfY2FsbGJhY2spOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2gzMi5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoMzIuYwppbmRleCA4YWFhOGI3Li42OTA1NjZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2gzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfaGFzaDMyLmMKQEAgLTg5LDE3ICs4OSw2IEBACiAgKiAgICAtLSBDb3J0CiAgKi8KIAotLyoKLSAqIDc1MCBTTVAgaXMgYSBCYWQgSWRlYSBiZWNhdXNlIHRoZSA3NTAgZG9lc24ndCBicm9hZGNhc3QgYWxsCi0gKiB0aGUgY2FjaGUgb3BlcmF0aW9ucyBvbiB0aGUgYnVzLiAgSGVuY2Ugd2UgbmVlZCB0byB1c2UgYW4gSVBJCi0gKiB0byBnZXQgdGhlIG90aGVyIENQVShzKSB0byBpbnZhbGlkYXRlIHRoZWlyIFRMQnMuCi0gKi8KLSNpZmRlZiBDT05GSUdfU01QXzc1MAotI2RlZmluZSBGSU5JU0hfRkxVU0gJc21wX3NlbmRfdGxiX2ludmFsaWRhdGUoMCkKLSNlbHNlCi0jZGVmaW5lIEZJTklTSF9GTFVTSAlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQogc3RhdGljIHZvaWQgZmx1c2hfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQl1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTEzOCw3ICsxMjcsNiBAQAogdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCWZsdXNoX3JhbmdlKCZpbml0X21tLCBzdGFydCwgZW5kKTsKLQlGSU5JU0hfRkxVU0g7CiB9CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UpOwogCkBAIC0xNjIsNyArMTUwLDYgQEAKIAkgKi8KIAlmb3IgKG1wID0gbW0tPm1tYXA7IG1wICE9IE5VTEw7IG1wID0gbXAtPnZtX25leHQpCiAJCWZsdXNoX3JhbmdlKG1wLT52bV9tbSwgbXAtPnZtX3N0YXJ0LCBtcC0+dm1fZW5kKTsKLQlGSU5JU0hfRkxVU0g7CiB9CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9tbSk7CiAKQEAgLTE3OSw3ICsxNjYsNiBAQAogCXBtZCA9IHBtZF9vZmZzZXQocHVkX29mZnNldChwZ2Rfb2Zmc2V0KG1tLCB2bWFkZHIpLCB2bWFkZHIpLCB2bWFkZHIpOwogCWlmICghcG1kX25vbmUoKnBtZCkpCiAJCWZsdXNoX2hhc2hfcGFnZXMobW0tPmNvbnRleHQuaWQsIHZtYWRkciwgcG1kX3ZhbCgqcG1kKSwgMSk7Ci0JRklOSVNIX0ZMVVNIOwogfQogRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcGFnZSk7CiAKQEAgLTE5Miw2ICsxNzgsNSBAQAogCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCWZsdXNoX3JhbmdlKHZtYS0+dm1fbW0sIHN0YXJ0LCBlbmQpOwotCUZJTklTSF9GTFVTSDsKIH0KIEVYUE9SVF9TWU1CT0woZmx1c2hfdGxiX3JhbmdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCmluZGV4IGQ4Njk1YjAuLmZlMzkxZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwpAQCAtNDYsNiArNDYsNyBAQAogc3RydWN0IG1tdV9wc2l6ZV9kZWYgbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfQ09VTlRdID0gewogCVtNTVVfUEFHRV80S10gPSB7CiAJCS5zaGlmdAk9IDEyLAorCQkuaW5kCT0gMjAsCiAJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzRLLAogCX0sCiAJW01NVV9QQUdFXzE2S10gPSB7CkBAIC01NCw2ICs1NSw3IEBACiAJfSwKIAlbTU1VX1BBR0VfNjRLXSA9IHsKIAkJLnNoaWZ0CT0gMTYsCisJCS5pbmQJPSAyOCwKIAkJLmVuYwk9IEJPT0szRV9QQUdFU1pfNjRLLAogCX0sCiAJW01NVV9QQUdFXzFNXSA9IHsKQEAgLTYyLDYgKzY0LDcgQEAKIAl9LAogCVtNTVVfUEFHRV8xNk1dID0gewogCQkuc2hpZnQJPSAyNCwKKwkJLmluZAk9IDM2LAogCQkuZW5jCT0gQk9PSzNFX1BBR0VTWl8xNk0sCiAJfSwKIAlbTU1VX1BBR0VfMjU2TV0gPSB7CkBAIC0zNDQsMTYgKzM0NywxMDggQEAKIAl9CiB9CiAKLS8qCi0gKiBFYXJseSBpbml0aWFsaXphdGlvbiBvZiB0aGUgTU1VIFRMQiBjb2RlCi0gKi8KLXN0YXRpYyB2b2lkIF9fZWFybHlfaW5pdF9tbXUoaW50IGJvb3RfY3B1KQorc3RhdGljIHZvaWQgc2V0dXBfcGFnZV9zaXplcyh2b2lkKQoreworCXVuc2lnbmVkIGludCB0bGIwY2ZnID0gbWZzcHIoU1BSTl9UTEIwQ0ZHKTsKKwl1bnNpZ25lZCBpbnQgdGxiMHBzID0gbWZzcHIoU1BSTl9UTEIwUFMpOworCXVuc2lnbmVkIGludCBlcHRjZmcgPSBtZnNwcihTUFJOX0VQVENGRyk7CisJaW50IGksIHBzaXplOworCisJLyogTG9vayBmb3Igc3VwcG9ydGVkIGRpcmVjdCBzaXplcyAqLworCWZvciAocHNpemUgPSAwOyBwc2l6ZSA8IE1NVV9QQUdFX0NPVU5UOyArK3BzaXplKSB7CisJCXN0cnVjdCBtbXVfcHNpemVfZGVmICpkZWYgPSAmbW11X3BzaXplX2RlZnNbcHNpemVdOworCisJCWlmICh0bGIwcHMgJiAoMVUgPDwgKGRlZi0+c2hpZnQgLSAxMCkpKQorCQkJZGVmLT5mbGFncyB8PSBNTVVfUEFHRV9TSVpFX0RJUkVDVDsKKwl9CisKKwkvKiBJbmRpcmVjdCBwYWdlIHNpemVzIHN1cHBvcnRlZCA/ICovCisJaWYgKCh0bGIwY2ZnICYgVExCbkNGR19JTkQpID09IDApCisJCWdvdG8gbm9faW5kaXJlY3Q7CisKKwkvKiBOb3csIHdlIG9ubHkgZGVhbCB3aXRoIG9uZSBJTkQgcGFnZSBzaXplIGZvciBlYWNoCisJICogZGlyZWN0IHNpemUuIEhvcGVmdWxseSBhbGwgaW1wbGVtZW50YXRpb25zIHRvZGF5IGFyZQorCSAqIHVuYW1iaWd1b3VzLCBidXQgd2UgbWlnaHQgd2FudCB0byBiZSBjYXJlZnVsIGluIHRoZQorCSAqIGZ1dHVyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBwcywgc3BzOworCisJCXNwcyA9IGVwdGNmZyAmIDB4MWY7CisJCWVwdGNmZyA+Pj0gNTsKKwkJcHMgPSBlcHRjZmcgJiAweDFmOworCQllcHRjZmcgPj49IDU7CisJCWlmICghcHMgfHwgIXNwcykKKwkJCWNvbnRpbnVlOworCQlmb3IgKHBzaXplID0gMDsgcHNpemUgPCBNTVVfUEFHRV9DT1VOVDsgcHNpemUrKykgeworCQkJc3RydWN0IG1tdV9wc2l6ZV9kZWYgKmRlZiA9ICZtbXVfcHNpemVfZGVmc1twc2l6ZV07CisKKwkJCWlmIChwcyA9PSAoZGVmLT5zaGlmdCAtIDEwKSkKKwkJCQlkZWYtPmZsYWdzIHw9IE1NVV9QQUdFX1NJWkVfSU5ESVJFQ1Q7CisJCQlpZiAoc3BzID09IChkZWYtPnNoaWZ0IC0gMTApKQorCQkJCWRlZi0+aW5kID0gcHMgKyAxMDsKKwkJfQorCX0KKyBub19pbmRpcmVjdDoKKworCS8qIENsZWFudXAgYXJyYXkgYW5kIHByaW50IHN1bW1hcnkgKi8KKwlwcl9pbmZvKCJNTVU6IFN1cHBvcnRlZCBwYWdlIHNpemVzXG4iKTsKKwlmb3IgKHBzaXplID0gMDsgcHNpemUgPCBNTVVfUEFHRV9DT1VOVDsgKytwc2l6ZSkgeworCQlzdHJ1Y3QgbW11X3BzaXplX2RlZiAqZGVmID0gJm1tdV9wc2l6ZV9kZWZzW3BzaXplXTsKKwkJY29uc3QgY2hhciAqX19wYWdlX3R5cGVfbmFtZXNbXSA9IHsKKwkJCSJ1bnN1cHBvcnRlZCIsCisJCQkiZGlyZWN0IiwKKwkJCSJpbmRpcmVjdCIsCisJCQkiZGlyZWN0ICYgaW5kaXJlY3QiCisJCX07CisJCWlmIChkZWYtPmZsYWdzID09IDApIHsKKwkJCWRlZi0+c2hpZnQgPSAwOwkKKwkJCWNvbnRpbnVlOworCQl9CisJCXByX2luZm8oIiAgJThsZCBLQiBhcyAlc1xuIiwgMXVsIDw8IChkZWYtPnNoaWZ0IC0gMTApLAorCQkJX19wYWdlX3R5cGVfbmFtZXNbZGVmLT5mbGFncyAmIDB4M10pOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfbW11X2h0dyh2b2lkKQogewogCWV4dGVybiB1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2Jhc2VfYm9vazNlOwogCWV4dGVybiB1bnNpZ25lZCBpbnQgZXhjX2RhdGFfdGxiX21pc3NfaHR3X2Jvb2szZTsKIAlleHRlcm4gdW5zaWduZWQgaW50IGV4Y19pbnN0cnVjdGlvbl90bGJfbWlzc19odHdfYm9vazNlOwogCiAJdW5zaWduZWQgaW50ICppYmFzZSA9ICZpbnRlcnJ1cHRfYmFzZV9ib29rM2U7CisKKwkvKiBDaGVjayBpZiBIVyB0YWJsZXdhbGsgaXMgcHJlc2VudCwgYW5kIGlmIHllcywgZW5hYmxlIGl0IGJ5OgorCSAqCisJICogLSBwYXRjaGluZyB0aGUgVExCIG1pc3MgaGFuZGxlcnMgdG8gYnJhbmNoIHRvIHRoZQorCSAqICAgb25lIGRlZGljYXRlcyB0byBpdAorCSAqCisJICogLSBzZXR0aW5nIHRoZSBnbG9iYWwgYm9vazNlX2h0d19lbmFibGVkCisgICAgICAgCSAqLworCXVuc2lnbmVkIGludCB0bGIwY2ZnID0gbWZzcHIoU1BSTl9UTEIwQ0ZHKTsKKworCWlmICgodGxiMGNmZyAmIFRMQm5DRkdfSU5EKSAmJgorCSAgICAodGxiMGNmZyAmIFRMQm5DRkdfUFQpKSB7CisJCS8qIE91ciBleGNlcHRpb25zIHZlY3RvcnMgc3RhcnQgd2l0aCBhIE5PUCBhbmQgLXRoZW4tIGEgYnJhbmNoCisJCSAqIHRvIGRlYWwgd2l0aCBzaW5nbGUgc3RlcHBpbmcgZnJvbSB1c2Vyc3BhY2Ugd2hpY2ggc3RvcHMgb24KKwkJICogdGhlIHNlY29uZCBpbnN0cnVjdGlvbi4gVGh1cyB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBzZWNvbmQKKwkJICogaW5zdHJ1Y3Rpb24gb2YgdGhlIGV4Y2VwdGlvbiwgbm90IHRoZSBmaXJzdCBvbmUKKwkJICovCisJCXBhdGNoX2JyYW5jaChpYmFzZSArICgweDFjMCAvIDQpICsgMSwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpJmV4Y19kYXRhX3RsYl9taXNzX2h0d19ib29rM2UsIDApOworCQlwYXRjaF9icmFuY2goaWJhc2UgKyAoMHgxZTAgLyA0KSArIDEsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSZleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfaHR3X2Jvb2szZSwgMCk7CisJCWJvb2szZV9odHdfZW5hYmxlZCA9IDE7CisJfQorCXByX2luZm8oIk1NVTogQm9vazNFIFBhZ2UgVGFibGVzICVzXG4iLAorCQlib29rM2VfaHR3X2VuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKK30KKworLyoKKyAqIEVhcmx5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBNTVUgVExCIGNvZGUKKyAqLworc3RhdGljIHZvaWQgX19lYXJseV9pbml0X21tdShpbnQgYm9vdF9jcHUpCit7CiAJdW5zaWduZWQgaW50IG1hczQ7CiAKIAkvKiBYWFggVGhpcyB3aWxsIGhhdmUgdG8gYmUgZGVjaWRlZCBhdCBydW50aW1lLCBidXQgcmlnaHQKQEAgLTM3MCwzNSArNDY1LDE3IEBACiAJICovCiAJbW11X3ZtZW1tYXBfcHNpemUgPSBNTVVfUEFHRV8xNk07CiAKLQkvKiBDaGVjayBpZiBIVyB0YWJsZXdhbGsgaXMgcHJlc2VudCwgYW5kIGlmIHllcywgZW5hYmxlIGl0IGJ5OgotCSAqCi0JICogLSBwYXRjaGluZyB0aGUgVExCIG1pc3MgaGFuZGxlcnMgdG8gYnJhbmNoIHRvIHRoZQotCSAqICAgb25lIGRlZGljYXRlcyB0byBpdAotCSAqCi0JICogLSBzZXR0aW5nIHRoZSBnbG9iYWwgYm9vazNlX2h0d19lbmFibGVkCi0JICoKLQkgKiAtIFNldCBNQVM0OklOREQgYW5kIGRlZmF1bHQgcGFnZSBzaXplCi0JICovCi0KIAkvKiBYWFggVGhpcyBjb2RlIG9ubHkgY2hlY2tzIGZvciBUTEIgMCBjYXBhYmlsaXRpZXMgYW5kIGRvZXNuJ3QKIAkgKiAgICAgY2hlY2sgd2hhdCBwYWdlIHNpemUgY29tYm9zIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIEhXLiBJdAogCSAqICAgICBhbHNvIGRvZXNuJ3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc2VwYXJhdGUgYXJyYXkgaG9sZHMKIAkgKiAgICAgdGhlIElORCBlbnRyaWVzIGZyb20gdGhlIGFycmF5IGxvYWRlZCBieSB0aGUgUFQuCiAJICovCiAJaWYgKGJvb3RfY3B1KSB7Ci0JCXVuc2lnbmVkIGludCB0bGIwY2ZnID0gbWZzcHIoU1BSTl9UTEIwQ0ZHKTsKKwkJLyogTG9vayBmb3Igc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgKi8KKwkJc2V0dXBfcGFnZV9zaXplcygpOwogCi0JCS8qIENoZWNrIGlmIEhXIGxvYWRlciBpcyBzdXBwb3J0ZWQgKi8KLQkJaWYgKCh0bGIwY2ZnICYgVExCbkNGR19JTkQpICYmCi0JCSAgICAodGxiMGNmZyAmIFRMQm5DRkdfUFQpKSB7Ci0JCQlwYXRjaF9icmFuY2goaWJhc2UgKyAoMHgxYzAgLyA0KSwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpJmV4Y19kYXRhX3RsYl9taXNzX2h0d19ib29rM2UsIDApOwotCQkJcGF0Y2hfYnJhbmNoKGliYXNlICsgKDB4MWUwIC8gNCksCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSZleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfaHR3X2Jvb2szZSwgMCk7Ci0JCQlib29rM2VfaHR3X2VuYWJsZWQgPSAxOwotCQl9Ci0JCXByX2luZm8oIk1NVTogQm9vazNFIFBhZ2UgVGFibGVzICVzXG4iLAotCQkJYm9vazNlX2h0d19lbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisJCS8qIExvb2sgZm9yIEhXIHRhYmxld2FsayBzdXBwb3J0ICovCisJCXNldHVwX21tdV9odHcoKTsKIAl9CiAKIAkvKiBTZXQgTUFTNCBiYXNlZCBvbiBwYWdlIHRhYmxlIHNldHRpbmcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCA3M2UxYzJjLi5lMjE5Y2E0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw2IEBACiBvcHJvZmlsZS0kKENPTkZJR19PUFJPRklMRV9DRUxMKSArPSBvcF9tb2RlbF9jZWxsLm8gXAogCQljZWxsL3NwdV9wcm9maWxlci5vIGNlbGwvdm1hX21hcC5vIFwKIAkJY2VsbC9zcHVfdGFza19zeW5jLm8KLW9wcm9maWxlLSQoQ09ORklHX1BQQzY0KSArPSBvcF9tb2RlbF9yczY0Lm8gb3BfbW9kZWxfcG93ZXI0Lm8gb3BfbW9kZWxfcGE2dC5vCitvcHJvZmlsZS0kKENPTkZJR19QUENfQk9PSzNTXzY0KSArPSBvcF9tb2RlbF9yczY0Lm8gb3BfbW9kZWxfcG93ZXI0Lm8gb3BfbW9kZWxfcGE2dC5vCiBvcHJvZmlsZS0kKENPTkZJR19GU0xfRU1CX1BFUkZNT04pICs9IG9wX21vZGVsX2ZzbF9lbWIubwogb3Byb2ZpbGUtJChDT05GSUdfNnh4KSArPSBvcF9tb2RlbF83NDUwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwppbmRleCAyMWYxNmVkLi5kNjVlNjhmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzd2l0Y2ggKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfdHlwZSkgewotI2lmZGVmIENPTkZJR19QUEM2NAorI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CiAjaWZkZWYgQ09ORklHX09QUk9GSUxFX0NFTEwKIAkJY2FzZSBQUENfT1BST0ZJTEVfQ0VMTDoKIAkJCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcKaW5kZXggZWM2NDI2NC4uYjcyMTc2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnCkBAIC03MSwyMiArNzEsNiBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFNQ0MgUFBDNDA1RVggYm9hcmQuCiAKLSNjb25maWcgUkVEV09PRF81Ci0jCWJvb2wgIlJlZHdvb2QtNSIKLSMJZGVwZW5kcyBvbiA0MHgKLSMJZGVmYXVsdCBuCi0jCXNlbGVjdCBTVEIwM3h4eAotIwloZWxwCi0jCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFNUQjA0IGV2YWx1YXRpb24gYm9hcmQuCi0KLSNjb25maWcgUkVEV09PRF82Ci0jCWJvb2wgIlJlZHdvb2QtNiIKLSMJZGVwZW5kcyBvbiA0MHgKLSMJZGVmYXVsdCBuCi0jCXNlbGVjdCBTVEIwM3h4eAotIwloZWxwCi0jCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFNUQngyNXh4IGV2YWx1YXRpb24gYm9hcmQuCi0KICNjb25maWcgU1lDQU1PUkUKICMJYm9vbCAiU3ljYW1vcmUiCiAjCWRlcGVuZHMgb24gNDB4CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCmluZGV4IDRkYWM5YjAuLjI3YjA2NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCkBAIC0xLDMyICsxLDM0IEBACiBjb25maWcgUFBDX01QQzUxMngKLQlib29sCisJYm9vbCAiNTEyeC1iYXNlZCBib2FyZHMiCisJZGVwZW5kcyBvbiA2eHgKIAlzZWxlY3QgRlNMX1NPQwogCXNlbGVjdCBJUElDCiAJc2VsZWN0IFBQQ19DTE9DSwogCXNlbGVjdCBQUENfUENJX0NIT0lDRQogCXNlbGVjdCBGU0xfUENJIGlmIFBDSQogCi1jb25maWcgUFBDX01QQzUxMjEKLQlib29sCi0Jc2VsZWN0IFBQQ19NUEM1MTJ4Ci0KIGNvbmZpZyBNUEM1MTIxX0FEUwogCWJvb2wgIkZyZWVzY2FsZSBNUEM1MTIxRSBBRFMiCi0JZGVwZW5kcyBvbiA2eHgKKwlkZXBlbmRzIG9uIFBQQ19NUEM1MTJ4CiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCi0Jc2VsZWN0IFBQQ19NUEM1MTIxCiAJc2VsZWN0IE1QQzUxMjFfQURTX0NQTEQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM1MTIxRSBBRFMgYm9hcmQuCiAKIGNvbmZpZyBNUEM1MTIxX0dFTkVSSUMKIAlib29sICJHZW5lcmljIHN1cHBvcnQgZm9yIHNpbXBsZSBNUEM1MTIxIGJhc2VkIGJvYXJkcyIKLQlkZXBlbmRzIG9uIDZ4eAorCWRlcGVuZHMgb24gUFBDX01QQzUxMngKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKLQlzZWxlY3QgUFBDX01QQzUxMjEKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHNpbXBsZSBNUEM1MTIxIGJhc2VkIGJvYXJkcwogCSAgd2hpY2ggZG8gbm90IG5lZWQgY3VzdG9tIHBsYXRmb3JtIHNwZWNpZmljIHNldHVwLgogCiAJICBDb21wYXRpYmxlIGJvYXJkcyBpbmNsdWRlOiAgUHJvdG9uaWMgTFZUIGJhc2UgYm9hcmRzIChaQU5NQ1UKIAkgIGFuZCBWSUNWVDIpLgorCitjb25maWcgUERNMzYwTkcKKwlib29sICJpZm0gUERNMzYwTkcgYm9hcmQiCisJZGVwZW5kcyBvbiBQUENfTVBDNTEyeAorCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBETTM2ME5HIGJvYXJkLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L01ha2VmaWxlCmluZGV4IDkwYmUyZjUuLjRlZmMxYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvTWFrZWZpbGUKQEAgLTQsMyArNCw0IEBACiBvYmoteQkJCQkrPSBjbG9jay5vIG1wYzUxMnhfc2hhcmVkLm8KIG9iai0kKENPTkZJR19NUEM1MTIxX0FEUykJKz0gbXBjNTEyMV9hZHMubyBtcGM1MTIxX2Fkc19jcGxkLm8KIG9iai0kKENPTkZJR19NUEM1MTIxX0dFTkVSSUMpCSs9IG1wYzUxMjFfZ2VuZXJpYy5vCitvYmotJChDT05GSUdfUERNMzYwTkcpCQkrPSBwZG0zNjBuZy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay5jCmluZGV4IDRjNDIyNDYuLjViMjQzYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay5jCkBAIC0yOTIsNiArMjkyLDE1IEBACiAJY2xrLT5yYXRlID0gcmF0ZTsKIH0KIAorc3RhdGljIHZvaWQgdml1X2Nsa19jYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisKKwlyYXRlID0gc3lzX2Nsay5yYXRlOworCXJhdGUgLz0gMjsKKwljbGstPnJhdGUgPSByYXRlOworfQorCiBzdGF0aWMgdm9pZCBoYWxmX2Nsa19jYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIDI7CkBAIC00MTIsNiArNDIxLDE0IEBACiAJLmNhbGMgPSBkaXVfY2xrX2NhbGMsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayB2aXVfY2xrID0geworCS5uYW1lID0gInZpdV9jbGsiLAorCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKKwkucmVnID0gMSwKKwkuYml0ID0gMTgsCisJLmNhbGMgPSB2aXVfY2xrX2NhbGMsCit9OworCiBzdGF0aWMgc3RydWN0IGNsayBheGVfY2xrID0gewogCS5uYW1lID0gImF4ZV9jbGsiLAogCS5mbGFncyA9IENMS19IQVNfQ1RSTCwKQEAgLTUzNSw2ICs1NTIsNyBAQAogCSZyZWZfY2xrLAogCSZzeXNfY2xrLAogCSZkaXVfY2xrLAorCSZ2aXVfY2xrLAogCSZjc2JfY2xrLAogCSZlMzAwX2NsaywKIAkmaXBzX2NsaywKQEAgLTY2MCw3ICs2NzgsNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJY29uc3QgdTMyICpjZWxsX2luZGV4OwotCXN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2OwogCiAJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZnNsLG1wYzUxMjEtcHNjIikgewogCQljZWxsX2luZGV4ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2VsbC1pbmRleCIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHMuYwppbmRleCBlZTZhZTEyLi5kY2VmNmFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHMuYwpAQCAtNDIsNiArNDIsNyBAQAogCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjNTEyMS1wY2kiKQogCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogI2VuZGlmCisJbXBjNTEyeF9zZXR1cF9kaXUoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzUxMjFfYWRzX2luaXRfSVJRKHZvaWQpCkBAIC02NSw2ICs2Niw3IEBACiAJLnByb2JlCQkJPSBtcGM1MTIxX2Fkc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBtcGM1MTIxX2Fkc19zZXR1cF9hcmNoLAogCS5pbml0CQkJPSBtcGM1MTJ4X2luaXQsCisJLmluaXRfZWFybHkJCT0gbXBjNTEyeF9pbml0X2RpdSwKIAkuaW5pdF9JUlEJCT0gbXBjNTEyMV9hZHNfaW5pdF9JUlEsCiAJLmdldF9pcnEJCT0gaXBpY19nZXRfaXJxLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfZ2VuZXJpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfZ2VuZXJpYy5jCmluZGV4IGE2YzBlM2EuLmU0ODdlYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2dlbmVyaWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9nZW5lcmljLmMKQEAgLTUyLDYgKzUyLDggQEAKIAkubmFtZQkJCT0gIk1QQzUxMjEgZ2VuZXJpYyIsCiAJLnByb2JlCQkJPSBtcGM1MTIxX2dlbmVyaWNfcHJvYmUsCiAJLmluaXQJCQk9IG1wYzUxMnhfaW5pdCwKKwkuaW5pdF9lYXJseQkJPSBtcGM1MTJ4X2luaXRfZGl1LAorCS5zZXR1cF9hcmNoCQk9IG1wYzUxMnhfc2V0dXBfZGl1LAogCS5pbml0X0lSUQkJPSBtcGM1MTJ4X2luaXRfSVJRLAogCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeC5oCmluZGV4IGIyZGFjYTAuLjFhYjZkMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnguaApAQCAtMTYsNCArMTYsNiBAQAogZXh0ZXJuIGludCBfX2luaXQgbXBjNTEyMV9jbGtfaW5pdCh2b2lkKTsKIHZvaWQgX19pbml0IG1wYzUxMnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpOwogZXh0ZXJuIHZvaWQgbXBjNTEyeF9yZXN0YXJ0KGNoYXIgKmNtZCk7CitleHRlcm4gdm9pZCBtcGM1MTJ4X2luaXRfZGl1KHZvaWQpOworZXh0ZXJuIHZvaWQgbXBjNTEyeF9zZXR1cF9kaXUodm9pZCk7CiAjZW5kaWYJCQkJLyogX19NUEM1MTJYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnhfc2hhcmVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYwppbmRleCA3MDdlNTcyLi5lNDFlYmJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYwpAQCAtMTYsNyArMTYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvZnNsLWRpdS1mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pcGljLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTU0LDYgKzU4LDI4NiBAQAogCQk7CiB9CiAKK3N0cnVjdCBmc2xfZGl1X3NoYXJlZF9mYiB7CisJdTgJCWdhbW1hWzB4MzAwXTsJLyogMzItYml0IGFsaWduZWQhICovCisJc3RydWN0IGRpdV9hZAlhZDA7CQkvKiAzMi1iaXQgYWxpZ25lZCEgKi8KKwlwaHlzX2FkZHJfdAlmYl9waHlzOworCXNpemVfdAkJZmJfbGVuOworCWJvb2wJCWluX3VzZTsKK307CisKK3Vuc2lnbmVkIGludCBtcGM1MTJ4X2dldF9waXhlbF9mb3JtYXQodW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsLAorCQkJCSAgICAgIGludCBtb25pdG9yX3BvcnQpCit7CisJc3dpdGNoIChiaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMzI6CisJCXJldHVybiAweDg4ODgzMzE2OworCWNhc2UgMjQ6CisJCXJldHVybiAweDg4MDgyMjE5OworCWNhc2UgMTY6CisJCXJldHVybiAweDY1MDUzMTE4OworCX0KKwlyZXR1cm4gMHgwMDAwMDQwMDsKK30KKwordm9pZCBtcGM1MTJ4X3NldF9nYW1tYV90YWJsZShpbnQgbW9uaXRvcl9wb3J0LCBjaGFyICpnYW1tYV90YWJsZV9iYXNlKQoreworfQorCit2b2lkIG1wYzUxMnhfc2V0X21vbml0b3JfcG9ydChpbnQgbW9uaXRvcl9wb3J0KQoreworfQorCisjZGVmaW5lIERJVV9ESVZfTUFTSwkweDAwMDAwMGZmCit2b2lkIG1wYzUxMnhfc2V0X3BpeGVsX2Nsb2NrKHVuc2lnbmVkIGludCBwaXhjbG9jaykKK3sKKwl1bnNpZ25lZCBsb25nIGJlc3R2YWwsIGJlc3RmcmVxLCBzcGVlZCwgYnVzZnJlcTsKKwl1bnNpZ25lZCBsb25nIG1pbnBpeGNsb2NrLCBtYXhwaXhjbG9jaywgcGl4dmFsOworCXN0cnVjdCBtcGM1MTJ4X2NjbSBfX2lvbWVtICpjY207CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1MzIgdGVtcDsKKwlsb25nIGVycjsKKwlpbnQgaTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM1MTIxLWNsb2NrIik7CisJaWYgKCFucCkgeworCQlwcl9lcnIoIkNhbid0IGZpbmQgY2xvY2sgY29udHJvbCBtb2R1bGUuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWNjbSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlvZl9ub2RlX3B1dChucCk7CisJaWYgKCFjY20pIHsKKwkJcHJfZXJyKCJDYW4ndCBtYXAgY2xvY2sgY29udHJvbCBtb2R1bGUgcmVnLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKKwlpZiAobnApIHsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wID0KKwkJCW9mX2dldF9wcm9wZXJ0eShucCwgImJ1cy1mcmVxdWVuY3kiLCBOVUxMKTsKKworCQlvZl9ub2RlX3B1dChucCk7CisJCWlmIChwcm9wKSB7CisJCQlidXNmcmVxID0gKnByb3A7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIkNhbid0IGdldCBidXMtZnJlcXVlbmN5IHByb3BlcnR5XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiQ2FuJ3QgZmluZCAnY3B1JyBub2RlLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBQaXhlbCBDbG9jayBjb25maWd1cmF0aW9uICovCisJcHJfZGVidWcoIkRJVTogQnVzIEZyZXF1ZW5jeSA9ICVsdVxuIiwgYnVzZnJlcSk7CisJc3BlZWQgPSBidXNmcmVxICogNDsgLyogRElVX0RJViByYXRpbyBpcyA0ICogQ1NCX0NMSyAvIERJVV9DTEsgKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgcGl4ZWwgY2xvY2sgd2l0aCB0aGUgc21hbGxlc3QgZXJyb3IgKi8KKwkvKiBjYWxjdWxhdGUgdGhlIGZvbGxvd2luZyBpbiBzdGVwcyB0byBhdm9pZCBvdmVyZmxvdyAqLworCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgaW4gcHMgLSAlZFxuIiwgcGl4Y2xvY2spOworCXRlbXAgPSAoMTAwMDAwMDAwMCAvIHBpeGNsb2NrKSAqIDEwMDA7CisJcGl4Y2xvY2sgPSB0ZW1wOworCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgZnJlcSAtICV1XG4iLCBwaXhjbG9jayk7CisKKwl0ZW1wID0gdGVtcCAvIDIwOyAvKiBwaXhjbG9jayAqIDAuMDUgKi8KKwlwcl9kZWJ1ZygiZGV2aWF0aW9uID0gJWRcbiIsIHRlbXApOworCW1pbnBpeGNsb2NrID0gcGl4Y2xvY2sgLSB0ZW1wOworCW1heHBpeGNsb2NrID0gcGl4Y2xvY2sgKyB0ZW1wOworCXByX2RlYnVnKCJESVUgbWlucGl4Y2xvY2sgLSAlbHVcbiIsIG1pbnBpeGNsb2NrKTsKKwlwcl9kZWJ1ZygiRElVIG1heHBpeGNsb2NrIC0gJWx1XG4iLCBtYXhwaXhjbG9jayk7CisJcGl4dmFsID0gc3BlZWQvcGl4Y2xvY2s7CisJcHJfZGVidWcoIkRJVSBwaXh2YWwgPSAlbHVcbiIsIHBpeHZhbCk7CisKKwllcnIgPSBMT05HX01BWDsKKwliZXN0dmFsID0gcGl4dmFsOworCXByX2RlYnVnKCJESVUgYmVzdHZhbCA9ICVsdVxuIiwgYmVzdHZhbCk7CisKKwliZXN0ZnJlcSA9IDA7CisJZm9yIChpID0gLTE7IGkgPD0gMTsgaSsrKSB7CisJCXRlbXAgPSBzcGVlZCAvIChwaXh2YWwraSk7CisJCXByX2RlYnVnKCJESVUgdGVzdCBwaXh2YWwgaT0lZCwgcGl4dmFsPSVsdSwgdGVtcCBmcmVxLiA9ICV1XG4iLAorCQkJaSwgcGl4dmFsLCB0ZW1wKTsKKwkJaWYgKCh0ZW1wIDwgbWlucGl4Y2xvY2spIHx8ICh0ZW1wID4gbWF4cGl4Y2xvY2spKQorCQkJcHJfZGVidWcoIkRJVSBleGNlZWRzIG1vbml0b3IgcmFuZ2UgKCVsdSB0byAlbHUpXG4iLAorCQkJCW1pbnBpeGNsb2NrLCBtYXhwaXhjbG9jayk7CisJCWVsc2UgaWYgKGFicyh0ZW1wIC0gcGl4Y2xvY2spIDwgZXJyKSB7CisJCQlwcl9kZWJ1ZygiRW50ZXJlZCB0aGUgZWxzZSBpZiBibG9jayAlZFxuIiwgaSk7CisJCQllcnIgPSBhYnModGVtcCAtIHBpeGNsb2NrKTsKKwkJCWJlc3R2YWwgPSBwaXh2YWwgKyBpOworCQkJYmVzdGZyZXEgPSB0ZW1wOworCQl9CisJfQorCisJcHJfZGVidWcoIkRJVSBjaG9zZSA9ICVseFxuIiwgYmVzdHZhbCk7CisJcHJfZGVidWcoIkRJVSBlcnJvciA9ICVsZFxuIE5vbVBpeENsayAiLCBlcnIpOworCXByX2RlYnVnKCJESVU6IEJlc3QgRnJlcSA9ICVseFxuIiwgYmVzdGZyZXEpOworCS8qIE1vZGlmeSBESVVfRElWIGluIENDTSBTQ0ZSMSAqLworCXRlbXAgPSBpbl9iZTMyKCZjY20tPnNjZnIxKTsKKwlwcl9kZWJ1ZygiRElVOiBDdXJyZW50IHZhbHVlIG9mIFNDRlIxOiAweCUwOHhcbiIsIHRlbXApOworCXRlbXAgJj0gfkRJVV9ESVZfTUFTSzsKKwl0ZW1wIHw9IChiZXN0dmFsICYgRElVX0RJVl9NQVNLKTsKKwlvdXRfYmUzMigmY2NtLT5zY2ZyMSwgdGVtcCk7CisJcHJfZGVidWcoIkRJVTogTW9kaWZpZWQgdmFsdWUgb2YgU0NGUjE6IDB4JTA4eFxuIiwgdGVtcCk7CisJaW91bm1hcChjY20pOworfQorCitzc2l6ZV90IG1wYzUxMnhfc2hvd19tb25pdG9yX3BvcnQoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgLSA1MTIxIExDRFxuIik7Cit9CisKK2ludCBtcGM1MTJ4X3NldF9zeXNmc19tb25pdG9yX3BvcnQoaW50IHZhbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmc2xfZGl1X3NoYXJlZF9mYiBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oOCkpKSBkaXVfc2hhcmVkX2ZiOworCisjaWYgZGVmaW5lZChDT05GSUdfRkJfRlNMX0RJVSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVVfTU9EVUxFKQorc3RhdGljIGlubGluZSB2b2lkIG1wYzUxMnhfZnJlZV9ib290bWVtKHN0cnVjdCBwYWdlICpwYWdlKQoreworCV9fQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJQlVHX09OKFBhZ2VUYWlsKHBhZ2UpKTsKKwlCVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPiAxKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fY291bnQsIDEpOworCV9fZnJlZV9wYWdlKHBhZ2UpOworCXRvdGFscmFtX3BhZ2VzKys7Cit9CisKK3ZvaWQgbXBjNTEyeF9yZWxlYXNlX2Jvb3RtZW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBkaXVfc2hhcmVkX2ZiLmZiX3BoeXMgJiBQQUdFX01BU0s7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZGl1X3NoYXJlZF9mYi5mYl9sZW47CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCisJaWYgKGRpdV9zaGFyZWRfZmIuaW5fdXNlKSB7CisJCXN0YXJ0ID0gUEZOX1VQKGFkZHIpOworCQllbmQgPSBQRk5fRE9XTihhZGRyICsgc2l6ZSk7CisKKwkJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCsrKQorCQkJbXBjNTEyeF9mcmVlX2Jvb3RtZW0ocGZuX3RvX3BhZ2Uoc3RhcnQpKTsKKworCQlkaXVfc2hhcmVkX2ZiLmluX3VzZSA9IGZhbHNlOworCX0KKwlkaXVfb3BzLnJlbGVhc2VfYm9vdG1lbQk9IE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIENoZWNrIGlmIERJVSB3YXMgcHJlLWluaXRpYWxpemVkLiBJZiBzbywgcGVyZm9ybSBzdGVwcworICogbmVlZGVkIHRvIGNvbnRpbnVlIGRpc3BsYXlpbmcgdGhyb3VnaCB0aGUgd2hvbGUgYm9vdCBwcm9jZXNzLgorICogTW92ZSBhcmVhIGRlc2NyaXB0b3IgYW5kIGdhbW1hIHRhYmxlIGVsc2V3aGVyZSwgdGhleSBhcmUKKyAqIGRlc3Ryb3llZCBieSBib290bWVtIGFsbG9jYXRvciBvdGhlcndpc2UuIFRoZSBmcmFtZSBidWZmZXIKKyAqIGFkZHJlc3MgcmFuZ2Ugd2lsbCBiZSByZXNlcnZlZCBpbiBzZXR1cF9hcmNoKCkgYWZ0ZXIgYm9vdG1lbQorICogYWxsb2NhdG9yIGlzIHVwLgorICovCit2b2lkIF9faW5pdCBtcGM1MTJ4X2luaXRfZGl1KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmRpdV9yZWc7CisJcGh5c19hZGRyX3QgZGVzYzsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgbW9kZSwgcGl4X2ZtdCwgcmVzLCBicHA7CisJdW5zaWduZWQgbG9uZyBkc3Q7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjNTEyMS1kaXUiKTsKKwlpZiAoIW5wKSB7CisJCXByX2VycigiTm8gRElVIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJZGl1X3JlZyA9IG9mX2lvbWFwKG5wLCAwKTsKKwlvZl9ub2RlX3B1dChucCk7CisJaWYgKCFkaXVfcmVnKSB7CisJCXByX2VycigiQ2FuJ3QgbWFwIERJVVxuIik7CisJCXJldHVybjsKKwl9CisKKwltb2RlID0gaW5fYmUzMigmZGl1X3JlZy0+ZGl1X21vZGUpOworCWlmIChtb2RlICE9IE1GQl9NT0RFMSkgeworCQlwcl9pbmZvKCIlczogRElVIE9GRlxuIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXNjID0gaW5fYmUzMigmZGl1X3JlZy0+ZGVzY1swXSk7CisJdmFkZHIgPSBpb3JlbWFwKGRlc2MsIHNpemVvZihzdHJ1Y3QgZGl1X2FkKSk7CisJaWYgKCF2YWRkcikgeworCQlwcl9lcnIoIkNhbid0IG1hcCBESVUgYXJlYSBkZXNjLlxuIik7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoJmRpdV9zaGFyZWRfZmIuYWQwLCB2YWRkciwgc2l6ZW9mKHN0cnVjdCBkaXVfYWQpKTsKKwkvKiBmbHVzaCBmYiBhcmVhIGRlc2NyaXB0b3IgKi8KKwlkc3QgPSAodW5zaWduZWQgbG9uZykmZGl1X3NoYXJlZF9mYi5hZDA7CisJZmx1c2hfZGNhY2hlX3JhbmdlKGRzdCwgZHN0ICsgc2l6ZW9mKHN0cnVjdCBkaXVfYWQpIC0gMSk7CisKKwlyZXMgPSBpbl9iZTMyKCZkaXVfcmVnLT5kaXNwX3NpemUpOworCXBpeF9mbXQgPSBpbl9sZTMyKHZhZGRyKTsKKwlicHAgPSAoKHBpeF9mbXQgPj4gMTYpICYgMHgzKSArIDE7CisJZGl1X3NoYXJlZF9mYi5mYl9waHlzID0gaW5fbGUzMih2YWRkciArIDQpOworCWRpdV9zaGFyZWRfZmIuZmJfbGVuID0gKChyZXMgJiAweGZmZjAwMDApID4+IDE2KSAqIChyZXMgJiAweGZmZikgKiBicHA7CisJZGl1X3NoYXJlZF9mYi5pbl91c2UgPSB0cnVlOworCWlvdW5tYXAodmFkZHIpOworCisJZGVzYyA9IGluX2JlMzIoJmRpdV9yZWctPmdhbW1hKTsKKwl2YWRkciA9IGlvcmVtYXAoZGVzYywgc2l6ZW9mKGRpdV9zaGFyZWRfZmIuZ2FtbWEpKTsKKwlpZiAoIXZhZGRyKSB7CisJCXByX2VycigiQ2FuJ3QgbWFwIERJVSBhcmVhIGRlc2MuXG4iKTsKKwkJZGl1X3NoYXJlZF9mYi5pbl91c2UgPSBmYWxzZTsKKwkJZ290byBvdXQ7CisJfQorCW1lbWNweSgmZGl1X3NoYXJlZF9mYi5nYW1tYSwgdmFkZHIsIHNpemVvZihkaXVfc2hhcmVkX2ZiLmdhbW1hKSk7CisJLyogZmx1c2ggZ2FtbWEgdGFibGUgKi8KKwlkc3QgPSAodW5zaWduZWQgbG9uZykmZGl1X3NoYXJlZF9mYi5nYW1tYTsKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoZHN0LCBkc3QgKyBzaXplb2YoZGl1X3NoYXJlZF9mYi5nYW1tYSkgLSAxKTsKKworCWlvdW5tYXAodmFkZHIpOworCW91dF9iZTMyKCZkaXVfcmVnLT5nYW1tYSwgdmlydF90b19waHlzKCZkaXVfc2hhcmVkX2ZiLmdhbW1hKSk7CisJb3V0X2JlMzIoJmRpdV9yZWctPmRlc2NbMV0sIDApOworCW91dF9iZTMyKCZkaXVfcmVnLT5kZXNjWzJdLCAwKTsKKwlvdXRfYmUzMigmZGl1X3JlZy0+ZGVzY1swXSwgdmlydF90b19waHlzKCZkaXVfc2hhcmVkX2ZiLmFkMCkpOworCitvdXQ6CisJaW91bm1hcChkaXVfcmVnKTsKK30KKwordm9pZCBfX2luaXQgbXBjNTEyeF9zZXR1cF9kaXUodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXZSBkbyBub3QgYWxsb2NhdGUgYW5kIGNvbmZpZ3VyZSBuZXcgYXJlYSBmb3IgYml0bWFwIGJ1ZmZlcgorCSAqIGJlY2F1c2UgaXQgd291bGQgcmVxdWVyZSBjb3B5aW5nIGJpdG1hcCBkYXRhIChzcGxhc2ggaW1hZ2UpCisJICogYW5kIHNvIG5lZ2F0aXZlbHkgYWZmZWN0IGJvb3QgdGltZS4gSW5zdGVhZCB3ZSByZXNlcnZlIHRoZQorCSAqIGFscmVhZHkgY29uZmlndXJlZCBmcmFtZSBidWZmZXIgYXJlYSBzbyB0aGF0IGl0IHdvbid0IGJlCisJICogZGVzdHJveWVkLiBUaGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byByZXNlcnZlIGFuZAorCSAqIGFsc28gaXQncyBsZW5ndGggaXMgcGFzc2VkIHRvIHJlc2VydmVfYm9vdG1lbSgpLiBJdCB3aWxsIGJlCisJICogZnJlZWQgbGF0ZXIgb24gZmlyc3Qgb3BlbiBvZiBmYmRldiwgd2hlbiBzcGxhc2ggaW1hZ2UgaXMgbm90CisJICogbmVlZGVkIGFueSBtb3JlLgorCSAqLworCWlmIChkaXVfc2hhcmVkX2ZiLmluX3VzZSkgeworCQlyZXQgPSByZXNlcnZlX2Jvb3RtZW0oZGl1X3NoYXJlZF9mYi5mYl9waHlzLAorCQkJCSAgICAgIGRpdV9zaGFyZWRfZmIuZmJfbGVuLAorCQkJCSAgICAgIEJPT1RNRU1fRVhDTFVTSVZFKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogcmVzZXJ2ZSBib290bWVtIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZGl1X3NoYXJlZF9mYi5pbl91c2UgPSBmYWxzZTsKKwkJfQorCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19GQl9GU0xfRElVX01PRFVMRSkKKwlkaXVfb3BzLmdldF9waXhlbF9mb3JtYXQJPSBtcGM1MTJ4X2dldF9waXhlbF9mb3JtYXQ7CisJZGl1X29wcy5zZXRfZ2FtbWFfdGFibGUJCT0gbXBjNTEyeF9zZXRfZ2FtbWFfdGFibGU7CisJZGl1X29wcy5zZXRfbW9uaXRvcl9wb3J0CT0gbXBjNTEyeF9zZXRfbW9uaXRvcl9wb3J0OworCWRpdV9vcHMuc2V0X3BpeGVsX2Nsb2NrCQk9IG1wYzUxMnhfc2V0X3BpeGVsX2Nsb2NrOworCWRpdV9vcHMuc2hvd19tb25pdG9yX3BvcnQJPSBtcGM1MTJ4X3Nob3dfbW9uaXRvcl9wb3J0OworCWRpdV9vcHMuc2V0X3N5c2ZzX21vbml0b3JfcG9ydAk9IG1wYzUxMnhfc2V0X3N5c2ZzX21vbml0b3JfcG9ydDsKKwlkaXVfb3BzLnJlbGVhc2VfYm9vdG1lbQkJPSBtcGM1MTJ4X3JlbGVhc2VfYm9vdG1lbTsKKyNlbmRpZgorfQorCiB2b2lkIF9faW5pdCBtcGM1MTJ4X2luaXRfSVJRKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9wZG0zNjBuZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L3BkbTM2MG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3NWU4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9wZG0zNjBuZy5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBBbmF0b2xpaiBHdXN0c2NoaW4sIDxhZ3VzdEBkZW54LmRlPgorICoKKyAqIFBETTM2ME5HIGJvYXJkIHNldHVwCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pcGljLmg+CisKKyNpbmNsdWRlICJtcGM1MTJ4LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nl9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworc3RhdGljIHZvaWQgKnBkbTM2MG5nX2dwaW9fYmFzZTsKKworc3RhdGljIGludCBwZG0zNjBuZ19nZXRfcGVuZG93bl9zdGF0ZSh2b2lkKQoreworCXUzMiByZWc7CisKKwlyZWcgPSBpbl9iZTMyKHBkbTM2MG5nX2dwaW9fYmFzZSArIDB4Yyk7CisJaWYgKHJlZyAmIDB4NDApCisJCXNldGJpdHMzMihwZG0zNjBuZ19ncGlvX2Jhc2UgKyAweGMsIDB4NDApOworCisJcmVnID0gaW5fYmUzMihwZG0zNjBuZ19ncGlvX2Jhc2UgKyAweDgpOworCisJLyogcmV0dXJuIDEgaWYgcGVuIGlzIGRvd24gKi8KKwlyZXR1cm4gKHJlZyAmIDB4NDApID09IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIHBkbTM2MG5nX2Fkczc4NDZfcGRhdGEgPSB7CisJLm1vZGVsCQkJPSA3ODQ1LAorCS5nZXRfcGVuZG93bl9zdGF0ZQk9IHBkbTM2MG5nX2dldF9wZW5kb3duX3N0YXRlLAorCS5pcnFfZmxhZ3MJCT0gSVJRRl9UUklHR0VSX0xPVywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBkbTM2MG5nX3BlbmlycV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM1MTIxLWdwaW8iKTsKKwlpZiAoIW5wKSB7CisJCXByX2VycigiJXM6IENhbid0IGZpbmQgJ21wYzUxMjEtZ3Bpbycgbm9kZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwZG0zNjBuZ19ncGlvX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmICghcGRtMzYwbmdfZ3Bpb19iYXNlKSB7CisJCXByX2VycigiJXM6IENhbid0IG1hcCBncGlvIHJlZ3MuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlvdXRfYmUzMihwZG0zNjBuZ19ncGlvX2Jhc2UgKyAweGMsIDB4ZmZmZmZmZmYpOworCXNldGJpdHMzMihwZG0zNjBuZ19ncGlvX2Jhc2UgKyAweDE4LCAweDIwMDApOworCXNldGJpdHMzMihwZG0zNjBuZ19ncGlvX2Jhc2UgKyAweDEwLCAweDQwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBkbTM2MG5nX3RvdWNoc2NyZWVuX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqX19kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gX19kZXY7CisKKwlpZiAoKGV2ZW50ID09IEJVU19OT1RJRllfQUREX0RFVklDRSkgJiYKKwkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5vZl9ub2RlLCAidGksYWRzNzg0NiIpKSB7CisJCWRldi0+cGxhdGZvcm1fZGF0YSA9ICZwZG0zNjBuZ19hZHM3ODQ2X3BkYXRhOworCQlyZXR1cm4gTk9USUZZX09LOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGRtMzYwbmdfdG91Y2hzY3JlZW5fbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBwZG0zNjBuZ190b3VjaHNjcmVlbl9ub3RpZmllcl9jYWxsLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHBkbTM2MG5nX3RvdWNoc2NyZWVuX2luaXQodm9pZCkKK3sKKwlpZiAocGRtMzYwbmdfcGVuaXJxX2luaXQoKSkKKwkJcmV0dXJuOworCisJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZzcGlfYnVzX3R5cGUsICZwZG0zNjBuZ190b3VjaHNjcmVlbl9uYik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwZG0zNjBuZ190b3VjaHNjcmVlbl9pbml0KHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYgKi8KKwordm9pZCBfX2luaXQgcGRtMzYwbmdfaW5pdCh2b2lkKQoreworCW1wYzUxMnhfaW5pdCgpOworCXBkbTM2MG5nX3RvdWNoc2NyZWVuX2luaXQoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGRtMzYwbmdfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisKKwlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJpZm0scGRtMzYwbmciKTsKK30KKworZGVmaW5lX21hY2hpbmUocGRtMzYwbmcpIHsKKwkubmFtZQkJCT0gIlBETTM2ME5HIiwKKwkucHJvYmUJCQk9IHBkbTM2MG5nX3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IG1wYzUxMnhfc2V0dXBfZGl1LAorCS5pbml0CQkJPSBwZG0zNjBuZ19pbml0LAorCS5pbml0X2Vhcmx5CQk9IG1wYzUxMnhfaW5pdF9kaXUsCisJLmluaXRfSVJRCQk9IG1wYzUxMnhfaW5pdF9JUlEsCisJLmdldF9pcnEJCT0gaXBpY19nZXRfaXJxLAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5yZXN0YXJ0CQk9IG1wYzUxMnhfcmVzdGFydCwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCmluZGV4IDZkNTg0ZjQuLmRlNTViYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwaW8uYwppbmRleCBjYTUzMDVhLi4wZGFkOWE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3Bpby5jCkBAIC0xNDcsMjYgKzE0NywyNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1Mnh4X3drdXBfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1Mnh4X3drdXBfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwICpjaGlwOwogCXN0cnVjdCBtcGM1Mnh4X2dwaW9fd2t1cCBfX2lvbWVtICpyZWdzOwotCXN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mY2hpcDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKIAlpbnQgcmV0OwogCiAJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW9mY2hpcCA9ICZjaGlwLT5tbWNoaXAub2ZfZ2M7CisJZ2MgPSAmY2hpcC0+bW1jaGlwLmdjOwogCi0Jb2ZjaGlwLT5ncGlvX2NlbGxzICAgICAgICAgID0gMjsKLQlvZmNoaXAtPmdjLm5ncGlvICAgICAgICAgICAgPSA4OwotCW9mY2hpcC0+Z2MuZGlyZWN0aW9uX2lucHV0ICA9IG1wYzUyeHhfd2t1cF9ncGlvX2Rpcl9pbjsKLQlvZmNoaXAtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfb3V0OwotCW9mY2hpcC0+Z2MuZ2V0ICAgICAgICAgICAgICA9IG1wYzUyeHhfd2t1cF9ncGlvX2dldDsKLQlvZmNoaXAtPmdjLnNldCAgICAgICAgICAgICAgPSBtcGM1Mnh4X3drdXBfZ3Bpb19zZXQ7CisJZ2MtPm5ncGlvICAgICAgICAgICAgPSA4OworCWdjLT5kaXJlY3Rpb25faW5wdXQgID0gbXBjNTJ4eF93a3VwX2dwaW9fZGlyX2luOworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gbXBjNTJ4eF93a3VwX2dwaW9fZGlyX291dDsKKwlnYy0+Z2V0ICAgICAgICAgICAgICA9IG1wYzUyeHhfd2t1cF9ncGlvX2dldDsKKwlnYy0+c2V0ICAgICAgICAgICAgICA9IG1wYzUyeHhfd2t1cF9ncGlvX3NldDsKIAogCXJldCA9IG9mX21tX2dwaW9jaGlwX2FkZChvZmRldi0+ZGV2Lm9mX25vZGUsICZjaGlwLT5tbWNoaXApOwogCWlmIChyZXQpCkBAIC0xODAsNyArMTc5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3N0YXRpYyBpbnQgbXBjNTJ4eF9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCiB7CiAJcmV0dXJuIC1FQlVTWTsKIH0KQEAgLTMxMSwxMSArMzEwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG1wYzUyeHhfc2ltcGxlX2dwaW9jaGlwX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorc3RhdGljIGludCBfX2RldmluaXQgbXBjNTJ4eF9zaW1wbGVfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwICpjaGlwOwotCXN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mY2hpcDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKIAlzdHJ1Y3QgbXBjNTJ4eF9ncGlvIF9faW9tZW0gKnJlZ3M7CiAJaW50IHJldDsKIApAQCAtMzIzLDE0ICszMjIsMTMgQEAKIAlpZiAoIWNoaXApCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jb2ZjaGlwID0gJmNoaXAtPm1tY2hpcC5vZl9nYzsKKwlnYyA9ICZjaGlwLT5tbWNoaXAuZ2M7CiAKLQlvZmNoaXAtPmdwaW9fY2VsbHMgICAgICAgICAgPSAyOwotCW9mY2hpcC0+Z2MubmdwaW8gICAgICAgICAgICA9IDMyOwotCW9mY2hpcC0+Z2MuZGlyZWN0aW9uX2lucHV0ICA9IG1wYzUyeHhfc2ltcGxlX2dwaW9fZGlyX2luOwotCW9mY2hpcC0+Z2MuZGlyZWN0aW9uX291dHB1dCA9IG1wYzUyeHhfc2ltcGxlX2dwaW9fZGlyX291dDsKLQlvZmNoaXAtPmdjLmdldCAgICAgICAgICAgICAgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvX2dldDsKLQlvZmNoaXAtPmdjLnNldCAgICAgICAgICAgICAgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvX3NldDsKKwlnYy0+bmdwaW8gICAgICAgICAgICA9IDMyOworCWdjLT5kaXJlY3Rpb25faW5wdXQgID0gbXBjNTJ4eF9zaW1wbGVfZ3Bpb19kaXJfaW47CisJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvX2Rpcl9vdXQ7CisJZ2MtPmdldCAgICAgICAgICAgICAgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvX2dldDsKKwlnYy0+c2V0ICAgICAgICAgICAgICA9IG1wYzUyeHhfc2ltcGxlX2dwaW9fc2V0OwogCiAJcmV0ID0gb2ZfbW1fZ3Bpb2NoaXBfYWRkKG9mZGV2LT5kZXYub2Zfbm9kZSwgJmNoaXAtPm1tY2hpcCk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKaW5kZXggNDZjOTM1Ny4uZmVhODMzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKQEAgLTc4LDcgKzc4LDcgQEAKICAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQogICogQHJlZ3M6IHZpcnR1YWwgYWRkcmVzcyBvZiBHUFQgcmVnaXN0ZXJzCiAgKiBAbG9jazogc3BpbmxvY2sgdG8gY29vcmRpbmF0ZSBiZXR3ZWVuIGRpZmZlcmVudCBmdW5jdGlvbnMuCi0gKiBAb2ZfZ2M6IG9mX2dwaW9fY2hpcCBpbnN0YW5jZSBzdHJ1Y3R1cmU7IHVzZWQgd2hlbiBHUElPIGlzIGVuYWJsZWQKKyAqIEBnYzogZ3Bpb19jaGlwIGluc3RhbmNlIHN0cnVjdHVyZTsgdXNlZCB3aGVuIEdQSU8gaXMgZW5hYmxlZAogICogQGlycWhvc3Q6IFBvaW50ZXIgdG8gaXJxX2hvc3QgaW5zdGFuY2U7IHVzZWQgd2hlbiBJUlEgbW9kZSBpcyBzdXBwb3J0ZWQKICAqIEB3ZHRfbW9kZTogb25seSByZWxldmFudCBmb3IgZ3B0MDogYml0IDAgKE1QQzUyeHhfR1BUX0NBTl9XRFQpIGluZGljYXRlcwogICogICBpZiB0aGUgZ3B0IG1heSBiZSB1c2VkIGFzIHdkdCwgYml0IDEgKE1QQzUyeHhfR1BUX0lTX1dEVCkgaW5kaWNhdGVzCkBAIC05NCw3ICs5NCw3IEBACiAJdTggd2R0X21vZGU7CiAKICNpZiBkZWZpbmVkKENPTkZJR19HUElPTElCKQotCXN0cnVjdCBvZl9ncGlvX2NoaXAgb2ZfZ2M7CisJc3RydWN0IGdwaW9fY2hpcCBnYzsKICNlbmRpZgogfTsKIApAQCAtMjgwLDcgKzI4MCw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfR1BJT0xJQikKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdjX3RvX21wYzUyeHhfZ3B0KHN0cnVjdCBncGlvX2NoaXAgKmdjKQogewotCXJldHVybiBjb250YWluZXJfb2YodG9fb2ZfZ3Bpb19jaGlwKGdjKSwgc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYsb2ZfZ2MpOworCXJldHVybiBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBtcGM1Mnh4X2dwdF9wcml2LCBnYyk7CiB9CiAKIHN0YXRpYyBpbnQgbXBjNTJ4eF9ncHRfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQpAQCAtMzM2LDI4ICszMzYsMjUgQEAKIAlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobm9kZSwgImdwaW8tY29udHJvbGxlciIsIE5VTEwpKQogCQlyZXR1cm47CiAKLQlncHQtPm9mX2djLmdjLmxhYmVsID0ga3N0cmR1cChub2RlLT5mdWxsX25hbWUsIEdGUF9LRVJORUwpOwotCWlmICghZ3B0LT5vZl9nYy5nYy5sYWJlbCkgeworCWdwdC0+Z2MubGFiZWwgPSBrc3RyZHVwKG5vZGUtPmZ1bGxfbmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncHQtPmdjLmxhYmVsKSB7CiAJCWRldl9lcnIoZ3B0LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWdwdC0+b2ZfZ2MuZ3Bpb19jZWxscyA9IDI7Ci0JZ3B0LT5vZl9nYy5nYy5uZ3BpbyA9IDE7Ci0JZ3B0LT5vZl9nYy5nYy5kaXJlY3Rpb25faW5wdXQgID0gbXBjNTJ4eF9ncHRfZ3Bpb19kaXJfaW47Ci0JZ3B0LT5vZl9nYy5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gbXBjNTJ4eF9ncHRfZ3Bpb19kaXJfb3V0OwotCWdwdC0+b2ZfZ2MuZ2MuZ2V0ID0gbXBjNTJ4eF9ncHRfZ3Bpb19nZXQ7Ci0JZ3B0LT5vZl9nYy5nYy5zZXQgPSBtcGM1Mnh4X2dwdF9ncGlvX3NldDsKLQlncHQtPm9mX2djLmdjLmJhc2UgPSAtMTsKLQlncHQtPm9mX2djLnhsYXRlID0gb2ZfZ3Bpb19zaW1wbGVfeGxhdGU7Ci0Jbm9kZS0+ZGF0YSA9ICZncHQtPm9mX2djOwotCW9mX25vZGVfZ2V0KG5vZGUpOworCWdwdC0+Z2MubmdwaW8gPSAxOworCWdwdC0+Z2MuZGlyZWN0aW9uX2lucHV0ICA9IG1wYzUyeHhfZ3B0X2dwaW9fZGlyX2luOworCWdwdC0+Z2MuZGlyZWN0aW9uX291dHB1dCA9IG1wYzUyeHhfZ3B0X2dwaW9fZGlyX291dDsKKwlncHQtPmdjLmdldCA9IG1wYzUyeHhfZ3B0X2dwaW9fZ2V0OworCWdwdC0+Z2Muc2V0ID0gbXBjNTJ4eF9ncHRfZ3Bpb19zZXQ7CisJZ3B0LT5nYy5iYXNlID0gLTE7CisJZ3B0LT5nYy5vZl9ub2RlID0gbm9kZTsKIAogCS8qIFNldHVwIGV4dGVybmFsIHBpbiBpbiBHUElPIG1vZGUgKi8KIAljbHJzZXRiaXRzX2JlMzIoJmdwdC0+cmVncy0+bW9kZSwgTVBDNTJ4eF9HUFRfTU9ERV9NU19NQVNLLAogCQkJTVBDNTJ4eF9HUFRfTU9ERV9NU19HUElPKTsKIAotCXJjID0gZ3Bpb2NoaXBfYWRkKCZncHQtPm9mX2djLmdjKTsKKwlyYyA9IGdwaW9jaGlwX2FkZCgmZ3B0LT5nYyk7CiAJaWYgKHJjKQogCQlkZXZfZXJyKGdwdC0+ZGV2LCAiZ3Bpb2NoaXBfYWRkKCkgZmFpbGVkOyByYz0laVxuIiwgcmMpOwogCkBAIC03MjMsNyArNzIwLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogb2ZfcGxhdGZvcm0gYnVzIGJpbmRpbmcgY29kZQogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1Mnh4X2dwdF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1wYzUyeHhfZ3B0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2LAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0OwpAQCAtNzY5LDcgKzc2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXBjNTJ4eF9ncHRfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQorc3RhdGljIGludCBtcGM1Mnh4X2dwdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCiB7CiAJcmV0dXJuIC1FQlVTWTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2xwYmZpZm8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2xwYmZpZm8uYwppbmRleCBlODZhZWM2Li5mNGFjMjEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9scGJmaWZvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfbHBiZmlmby5jCkBAIC00MzYsOCArNDM2LDggQEAKIH0KIEVYUE9SVF9TWU1CT0wobXBjNTJ4eF9scGJmaWZvX2Fib3J0KTsKIAotc3RhdGljIGludCBfX2RldmluaXQKLW1wYzUyeHhfbHBiZmlmb19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1Mnh4X2xwYmZpZm9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaW50IHJjID0gLUVOT01FTTsKQEAgLTUwNyw3ICs1MDcsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IG1wYzUyeHhfbHBiZmlmb19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtcGM1Mnh4X2xwYmZpZm9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQogewogCWlmIChscGJmaWZvLmRldiAhPSAmb3AtPmRldikKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvZXA4MjQ4ZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L2VwODI0OGUuYwppbmRleCA5ZjJlNTJiLi4xNTY1ZTA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvZXA4MjQ4ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9lcDgyNDhlLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCS5vcHMgPSAmZXA4MjQ4ZV9tZGlvX29wcywKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVwODI0OGVfbWRpb19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVwODI0OGVfbWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgbWlpX2J1cyAqYnVzOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBlcDgyNDhlX21kaW9fcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQorc3RhdGljIGludCBlcDgyNDhlX21kaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQogewogCUJVRygpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwppbmRleCBmNDlhMjU0Li4wMjE3NjNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwpAQCAtOSw2ICs5LDE0IEBACiAKIGlmIFBQQ184M3h4CiAKK2NvbmZpZyBNUEM4MzB4X1JEQgorCWJvb2wgIkZyZWVzY2FsZSBNUEM4MzB4IFJEQiIKKwlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwlzZWxlY3QgUFBDX01QQzgzMXgKKwlzZWxlY3QgRlNMX0dUTQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1QQzgzMDggUkRCIGJvYXJkLgorCiBjb25maWcgTVBDODMxeF9SREIKIAlib29sICJGcmVlc2NhbGUgTVBDODMxeCBSREIiCiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKaW5kZXggZTEzOWMzNi4uNmU4YmJiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAKIG9iai15CQkJCTo9IG1pc2MubyB1c2Iubwogb2JqLSQoQ09ORklHX1NVU1BFTkQpCQkrPSBzdXNwZW5kLm8gc3VzcGVuZC1hc20ubwogb2JqLSQoQ09ORklHX01DVV9NUEM4MzQ5RU1JVFgpCSs9IG1jdV9tcGM4MzQ5ZW1pdHgubworb2JqLSQoQ09ORklHX01QQzgzMHhfUkRCKQkrPSBtcGM4MzB4X3JkYi5vCiBvYmotJChDT05GSUdfTVBDODMxeF9SREIpCSs9IG1wYzgzMXhfcmRiLm8KIG9iai0kKENPTkZJR19NUEM4MzJ4X1JEQikJKz0gbXBjODMyeF9yZGIubwogb2JqLSQoQ09ORklHX01QQzgzNHhfTURTKQkrPSBtcGM4MzR4X21kcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYwppbmRleCBkMTE5YTdjLi43MDc5OGFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKQEAgLTM1LDkgKzM1LDggQEAKIAogc3RydWN0IG1jdSB7CiAJc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBvZl9ncGlvX2NoaXAgb2ZfZ2M7CisJc3RydWN0IGdwaW9fY2hpcCBnYzsKIAl1OCByZWdfY3RybDsKIH07CiAKQEAgLTU2LDggKzU1LDcgQEAKIAogc3RhdGljIHZvaWQgbWN1X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKIHsKLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9IHRvX29mX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1jdSAqbWN1ID0gY29udGFpbmVyX29mKG9mX2djLCBzdHJ1Y3QgbWN1LCBvZl9nYyk7CisJc3RydWN0IG1jdSAqbWN1ID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgbWN1LCBnYyk7CiAJdTggYml0ID0gMSA8PCAoNCArIGdwaW8pOwogCiAJbXV0ZXhfbG9jaygmbWN1LT5sb2NrKTsKQEAgLTc5LDkgKzc3LDcgQEAKIHN0YXRpYyBpbnQgbWN1X2dwaW9jaGlwX2FkZChzdHJ1Y3QgbWN1ICptY3UpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9ICZtY3UtPm9mX2djOwotCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJm9mX2djLT5nYzsKLQlpbnQgcmV0OworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJm1jdS0+Z2M7CiAKIAlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbWN1LW1wYzgzNDllbWl0eCIpOwogCWlmICghbnApCkBAIC05NCwzMiArOTAsMTQgQEAKIAlnYy0+YmFzZSA9IC0xOwogCWdjLT5zZXQgPSBtY3VfZ3Bpb19zZXQ7CiAJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtY3VfZ3Bpb19kaXJfb3V0OwotCW9mX2djLT5ncGlvX2NlbGxzID0gMjsKLQlvZl9nYy0+eGxhdGUgPSBvZl9ncGlvX3NpbXBsZV94bGF0ZTsKKwlnYy0+b2Zfbm9kZSA9IG5wOwogCi0JbnAtPmRhdGEgPSBvZl9nYzsKLQltY3UtPm5wID0gbnA7Ci0KLQkvKgotCSAqIFdlIGRvbid0IHdhbnQgdG8gbG9zZSB0aGUgbm9kZSwgaXRzIC0+ZGF0YSBhbmQgLT5mdWxsX25hbWUuLi4KLQkgKiBTbywgaWYgc3VjY2VlZGVkLCB3ZSBkb24ndCBwdXQgdGhlIG5vZGUgaGVyZS4KLQkgKi8KLQlyZXQgPSBncGlvY2hpcF9hZGQoZ2MpOwotCWlmIChyZXQpCi0JCW9mX25vZGVfcHV0KG5wKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBncGlvY2hpcF9hZGQoZ2MpOwogfQogCiBzdGF0aWMgaW50IG1jdV9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IG1jdSAqbWN1KQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJm1jdS0+b2ZfZ2MuZ2MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0Jb2Zfbm9kZV9wdXQobWN1LT5ucCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3Bpb2NoaXBfcmVtb3ZlKCZtY3UtPmdjKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgbWN1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xODIsMTAgKzE2MCwxNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtY3VfaWRzKTsKIAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbWN1X29mX21hdGNoX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtY3UtbXBjODM0OWVtaXR4IiwgfSwKKwl7IH0sCit9OworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWN1X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJtY3UtbXBjODM0OWVtaXR4IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1jdV9vZl9tYXRjaF90YWJsZSwKIAl9LAogCS5wcm9iZSA9IG1jdV9wcm9iZSwKIAkucmVtb3ZlCT0gX19kZXZleGl0X3AobWN1X3JlbW92ZSksCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMweF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTAyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMweF9yZGIuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMHhfcmRiLmMKKyAqCisgKiBEZXNjcmlwdGlvbjogTVBDODMweCBSREIgYm9hcmQgc3BlY2lmaWMgcm91dGluZXMuCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gbXBjODMxeF9yZGIuYworICoKKyAqIENvcHlyaWdodCAoQykgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gMjAwOS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMC4gSWx5YSBZYW5vaywgRW1jcmFmdCBTeXN0ZW1zLCB5YW5va0BlbWNyYWZ0LmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaXBpYy5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgIm1wYzgzeHguaCIKKworLyoKKyAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKKyAqLworc3RhdGljIHZvaWQgX19pbml0IG1wYzgzMHhfcmRiX3NldHVwX2FyY2godm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKyNlbmRpZgorCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJtcGM4MzB4X3JkYl9zZXR1cF9hcmNoKCkiLCAwKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzMDgtcGNpZSIpCisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CisjZW5kaWYKKwltcGM4MzF4X3VzYl9jZmcoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1wYzgzMHhfcmRiX2luaXRfSVJRKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImlwaWMiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm47CisKKwlpcGljX2luaXQobnAsIDApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzLAorCSAqIGluIGNhc2UgdGhlIGJvb3Qgcm9tIGNoYW5nZWQgc29tZXRoaW5nIG9uIHVzLgorCSAqLworCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKK30KKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBtcGM4MzB4X3JkYl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIk1QQzgzMDhSREIiKSB8fAorCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4MzA4cmRiIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIgfSwKKwl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzB4X3JkYiwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKworZGVmaW5lX21hY2hpbmUobXBjODMweF9yZGIpIHsKKwkubmFtZQkJCT0gIk1QQzgzMHggUkRCIiwKKwkucHJvYmUJCQk9IG1wYzgzMHhfcmRiX3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IG1wYzgzMHhfcmRiX3NldHVwX2FyY2gsCisJLmluaXRfSVJRCQk9IG1wYzgzMHhfcmRiX2luaXRfSVJRLAorCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKKwkucmVzdGFydAkJPSBtcGM4M3h4X3Jlc3RhcnQsCisJLnRpbWVfaW5pdAkJPSBtcGM4M3h4X3RpbWVfaW5pdCwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYwppbmRleCBlYmU2YzM1Li43NWFlNzdmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlpbnQgaGFzX2RlZXBfc2xlZXA7CiB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZSAqcG1jX2RldjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbWNfZGV2Owogc3RhdGljIGludCBoYXNfZGVlcF9zbGVlcCwgZGVlcF9zbGVlcGluZzsKIHN0YXRpYyBpbnQgcG1jX2lycTsKIHN0YXRpYyBzdHJ1Y3QgbXBjODN4eF9wbWMgX19pb21lbSAqcG1jX3JlZ3M7CkBAIC0zMTgsNyArMzE4LDcgQEAKIAkuZW5kID0gbXBjODN4eF9zdXNwZW5kX2VuZCwKIH07CiAKLXN0YXRpYyBpbnQgcG1jX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorc3RhdGljIGludCBwbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZkZXYtPmRldi5vZl9ub2RlOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwbWNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQorc3RhdGljIGludCBwbWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQogewogCXJldHVybiAtRVBFUk07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwppbmRleCAzYTJhZGUyLi5iZWExZjU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwpAQCAtNjUsNiArNjUsMTQgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4NXh4IFJEQiAoUDIwMjAgUkRCKSBib2FyZAogCitjb25maWcgUDEwMjJfRFMKKwlib29sICJGcmVlc2NhbGUgUDEwMjIgRFMiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IENPTkZJR19QSFlTXzY0QklUCSMgVGhlIERUUyBoYXMgMzYtYml0IGFkZHJlc3NlcworCXNlbGVjdCBTV0lPVExCCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIFAxMDIyRFMgcmVmZXJlbmNlIGJvYXJkLgorCiBjb25maWcgU09DUkFURVMKIAlib29sICJTb2NyYXRlcyIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQppbmRleCAzODdjMTI4Li5hMmVjM2Y4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfTVBDODV4eF9EUykgICs9IG1wYzg1eHhfZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfTURTKSArPSBtcGM4NXh4X21kcy5vCiBvYmotJChDT05GSUdfTVBDODV4eF9SREIpICs9IG1wYzg1eHhfcmRiLm8KK29iai0kKENPTkZJR19QMTAyMl9EUykgICAgKz0gcDEwMjJfZHMubwogb2JqLSQoQ09ORklHX1A0MDgwX0RTKSAgICArPSBwNDA4MF9kcy5vIGNvcmVuZXRfZHMubwogb2JqLSQoQ09ORklHX1NUWF9HUDMpCSAgKz0gc3R4X2dwMy5vCiBvYmotJChDT05GSUdfVFFNODV4eCkJICArPSB0cW04NXh4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggNDk0NTEzNi4uZGE2NGJlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTE1OCw1MSArMTU4LDEwOCBAQAogZXh0ZXJuIHZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfbWRzX3NldHVwX2FyY2godm9pZCkKKyNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X3FlX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeyAudHlwZSA9ICJxZSIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wscWUiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X3B1Ymxpc2hfcWVfZGV2aWNlcyh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RhdGljIHU4IF9faW9tZW0gKmJjc3JfcmVncyA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLSNlbmRpZgotCWRtYV9hZGRyX3QgbWF4ID0gMHhmZmZmZmZmZjsKIAotCWlmIChwcGNfbWQucHJvZ3Jlc3MpCi0JCXBwY19tZC5wcm9ncmVzcygibXBjODV4eF9tZHNfc2V0dXBfYXJjaCgpIiwgMCk7CisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHFlIik7CisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODV4eF9xZV9pZHMsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tZHNfcmVzZXRfdWNjX3BoeXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0YXRpYyB1OCBfX2lvbWVtICpiY3NyX3JlZ3M7CiAKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSBOVUxMKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaWYgKCFucCkKKwkJcmV0dXJuOwogCi0JCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwotCQliY3NyX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArMSk7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQl9CisJYmNzcl9yZWdzID0gb2ZfaW9tYXAobnAsIDApOworCW9mX25vZGVfcHV0KG5wKTsKKwlpZiAoIWJjc3JfcmVncykKKwkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgInBjaSIpIHsKLQkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLG1wYzg1NDAtcGNpIikgfHwKLQkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLG1wYzg1NDgtcGNpZSIpKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKLQkJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyc3JjKTsKLQkJCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODAwMCkKLQkJCQlmc2xfYWRkX2JyaWRnZShucCwgMSk7Ci0JCQllbHNlCi0JCQkJZnNsX2FkZF9icmlkZ2UobnAsIDApOworCWlmIChtYWNoaW5lX2lzKG1wYzg1NjhfbWRzKSkgeworI2RlZmluZSBCQ1NSX1VDQzFfR0VUSF9FTgkoMHgxIDw8IDcpCisjZGVmaW5lIEJDU1JfVUNDMl9HRVRIX0VOCSgweDEgPDwgNykKKyNkZWZpbmUgQkNTUl9VQ0MxX01PREVfTVNLCSgweDMgPDwgNCkKKyNkZWZpbmUgQkNTUl9VQ0MyX01PREVfTVNLCSgweDMgPDwgMCkKIAotCQkJaG9zZSA9IHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShucCk7Ci0JCQltYXggPSBtaW4obWF4LCBob3NlLT5kbWFfd2luZG93X2Jhc2VfY3VyICsKLQkJCQkJaG9zZS0+ZG1hX3dpbmRvd19zaXplKTsKKwkJLyogVHVybiBvZmYgVUNDMSAmIFVDQzIgKi8KKwkJY2xyYml0czgoJmJjc3JfcmVnc1s4XSwgQkNTUl9VQ0MxX0dFVEhfRU4pOworCQljbHJiaXRzOCgmYmNzcl9yZWdzWzldLCBCQ1NSX1VDQzJfR0VUSF9FTik7CisKKwkJLyogTW9kZSBpcyBSR01JSSwgYWxsIGJpdHMgY2xlYXIgKi8KKwkJY2xyYml0czgoJmJjc3JfcmVnc1sxMV0sIEJDU1JfVUNDMV9NT0RFX01TSyB8CisJCQkJCSBCQ1NSX1VDQzJfTU9ERV9NU0spOworCisJCS8qIFR1cm4gVUNDMSAmIFVDQzIgb24gKi8KKwkJc2V0Yml0czgoJmJjc3JfcmVnc1s4XSwgQkNTUl9VQ0MxX0dFVEhfRU4pOworCQlzZXRiaXRzOCgmYmNzcl9yZWdzWzldLCBCQ1NSX1VDQzJfR0VUSF9FTik7CisJfSBlbHNlIGlmIChtYWNoaW5lX2lzKG1wYzg1NjlfbWRzKSkgeworI2RlZmluZSBCQ1NSN19VQ0MxMl9HRVRIblJTVAkoMHgxIDw8IDIpCisjZGVmaW5lIEJDU1I4X1VFTV9NQVJWRUxMX1JTVAkoMHgxIDw8IDEpCisjZGVmaW5lIEJDU1JfVUNDX1JHTUlJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEJDU1JfVUNDX1JUQkkJCSgweDEgPDwgNSkKKwkJLyoKKwkJICogVS1Cb290IG1hbmdsZXMgaW50ZXJydXB0IHBvbGFyaXR5IGZvciBNYXJ2ZWxsIFBIWXMsCisJCSAqIHNvIHJlc2V0IGJ1aWx0LWluIGFuZCBVRU0gTWFydmVsbCBQSFlzLCB0aGlzIHB1dHMKKwkJICogdGhlIFBIWXMgaW50byB0aGVpciBub3JtYWwgc3RhdGUuCisJCSAqLworCQljbHJiaXRzOCgmYmNzcl9yZWdzWzddLCBCQ1NSN19VQ0MxMl9HRVRIblJTVCk7CisJCXNldGJpdHM4KCZiY3NyX3JlZ3NbOF0sIEJDU1I4X1VFTV9NQVJWRUxMX1JTVCk7CisKKwkJc2V0Yml0czgoJmJjc3JfcmVnc1s3XSwgQkNTUjdfVUNDMTJfR0VUSG5SU1QpOworCQljbHJiaXRzOCgmYmNzcl9yZWdzWzhdLCBCQ1NSOF9VRU1fTUFSVkVMTF9SU1QpOworCisJCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKKwkJCQkJCSJuZXR3b3JrIiwKKwkJCQkJCSJ1Y2NfZ2V0aCIpKSAhPSBOVUxMOykgeworCQkJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wOworCQkJaW50IHVjY19udW07CisKKwkJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJjZWxsLWluZGV4IiwgTlVMTCk7CisJCQlpZiAocHJvcCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQl1Y2NfbnVtID0gKnByb3AgLSAxOworCisJCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWNvbm5lY3Rpb24tdHlwZSIsIE5VTEwpOworCQkJaWYgKHByb3AgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHN0cmNtcCgicnRiaSIsIChjb25zdCBjaGFyICopcHJvcCkgPT0gMCkKKwkJCQljbHJzZXRiaXRzXzgoJmJjc3JfcmVnc1s3ICsgdWNjX251bV0sCisJCQkJCUJDU1JfVUNDX1JHTUlJLCBCQ1NSX1VDQ19SVEJJKTsKIAkJfQorCX0gZWxzZSBpZiAobWFjaGluZV9pcyhwMTAyMV9tZHMpKSB7CisjZGVmaW5lIEJDU1IxMV9FTkVUX01JQ1JTVCAgICAgKDB4MSA8PCA1KQorCQkvKiBSZXNldCBNaWNyZWwgUEhZICovCisJCWNscmJpdHM4KCZiY3NyX3JlZ3NbMTFdLCBCQ1NSMTFfRU5FVF9NSUNSU1QpOworCQlzZXRiaXRzOCgmYmNzcl9yZWdzWzExXSwgQkNTUjExX0VORVRfTUlDUlNUKTsKIAl9Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKLQltcGM4NXh4X3NtcF9pbml0KCk7Ci0jZW5kaWYKKwlpb3VubWFwKGJjc3JfcmVncyk7Cit9CiAKLSNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCitzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tZHNfcWVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKIAlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUiKTsKIAlpZiAoIW5wKSB7CiAJCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInFlIik7CkBAIC0yMTAsNiArMjY3LDExIEBACiAJCQlyZXR1cm47CiAJfQogCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKIAlxZV9yZXNldCgpOwogCW9mX25vZGVfcHV0KG5wKTsKIApAQCAtMjI0LDcwICsyODYsNyBAQAogCQkJcGFyX2lvX29mX2NvbmZpZyh1Y2MpOwogCX0KIAotCWlmIChiY3NyX3JlZ3MpIHsKLQkJaWYgKG1hY2hpbmVfaXMobXBjODU2OF9tZHMpKSB7Ci0jZGVmaW5lIEJDU1JfVUNDMV9HRVRIX0VOCSgweDEgPDwgNykKLSNkZWZpbmUgQkNTUl9VQ0MyX0dFVEhfRU4JKDB4MSA8PCA3KQotI2RlZmluZSBCQ1NSX1VDQzFfTU9ERV9NU0sJKDB4MyA8PCA0KQotI2RlZmluZSBCQ1NSX1VDQzJfTU9ERV9NU0sJKDB4MyA8PCAwKQotCi0JCQkvKiBUdXJuIG9mZiBVQ0MxICYgVUNDMiAqLwotCQkJY2xyYml0czgoJmJjc3JfcmVnc1s4XSwgQkNTUl9VQ0MxX0dFVEhfRU4pOwotCQkJY2xyYml0czgoJmJjc3JfcmVnc1s5XSwgQkNTUl9VQ0MyX0dFVEhfRU4pOwotCi0JCQkvKiBNb2RlIGlzIFJHTUlJLCBhbGwgYml0cyBjbGVhciAqLwotCQkJY2xyYml0czgoJmJjc3JfcmVnc1sxMV0sIEJDU1JfVUNDMV9NT0RFX01TSyB8Ci0JCQkJCQkgQkNTUl9VQ0MyX01PREVfTVNLKTsKLQotCQkJLyogVHVybiBVQ0MxICYgVUNDMiBvbiAqLwotCQkJc2V0Yml0czgoJmJjc3JfcmVnc1s4XSwgQkNTUl9VQ0MxX0dFVEhfRU4pOwotCQkJc2V0Yml0czgoJmJjc3JfcmVnc1s5XSwgQkNTUl9VQ0MyX0dFVEhfRU4pOwotCQl9IGVsc2UgaWYgKG1hY2hpbmVfaXMobXBjODU2OV9tZHMpKSB7Ci0jZGVmaW5lIEJDU1I3X1VDQzEyX0dFVEhuUlNUCSgweDEgPDwgMikKLSNkZWZpbmUgQkNTUjhfVUVNX01BUlZFTExfUlNUCSgweDEgPDwgMSkKLSNkZWZpbmUgQkNTUl9VQ0NfUkdNSUkJCSgweDEgPDwgNikKLSNkZWZpbmUgQkNTUl9VQ0NfUlRCSQkJKDB4MSA8PCA1KQotCQkJLyoKLQkJCSAqIFUtQm9vdCBtYW5nbGVzIGludGVycnVwdCBwb2xhcml0eSBmb3IgTWFydmVsbCBQSFlzLAotCQkJICogc28gcmVzZXQgYnVpbHQtaW4gYW5kIFVFTSBNYXJ2ZWxsIFBIWXMsIHRoaXMgcHV0cwotCQkJICogdGhlIFBIWXMgaW50byB0aGVpciBub3JtYWwgc3RhdGUuCi0JCQkgKi8KLQkJCWNscmJpdHM4KCZiY3NyX3JlZ3NbN10sIEJDU1I3X1VDQzEyX0dFVEhuUlNUKTsKLQkJCXNldGJpdHM4KCZiY3NyX3JlZ3NbOF0sIEJDU1I4X1VFTV9NQVJWRUxMX1JTVCk7Ci0KLQkJCXNldGJpdHM4KCZiY3NyX3JlZ3NbN10sIEJDU1I3X1VDQzEyX0dFVEhuUlNUKTsKLQkJCWNscmJpdHM4KCZiY3NyX3JlZ3NbOF0sIEJDU1I4X1VFTV9NQVJWRUxMX1JTVCk7Ci0KLQkJCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKLQkJCQkJCQkibmV0d29yayIsCi0JCQkJCQkJInVjY19nZXRoIikpICE9IE5VTEw7KSB7Ci0JCQkJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wOwotCQkJCWludCB1Y2NfbnVtOwotCi0JCQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNlbGwtaW5kZXgiLCBOVUxMKTsKLQkJCQlpZiAocHJvcCA9PSBOVUxMKQotCQkJCQljb250aW51ZTsKLQotCQkJCXVjY19udW0gPSAqcHJvcCAtIDE7Ci0KLQkJCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWNvbm5lY3Rpb24tdHlwZSIsIE5VTEwpOwotCQkJCWlmIChwcm9wID09IE5VTEwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKHN0cmNtcCgicnRiaSIsIChjb25zdCBjaGFyICopcHJvcCkgPT0gMCkKLQkJCQkJY2xyc2V0Yml0c184KCZiY3NyX3JlZ3NbNyArIHVjY19udW1dLAotCQkJCQkJQkNTUl9VQ0NfUkdNSUksIEJDU1JfVUNDX1JUQkkpOwotCQkJfQotCi0JCX0gZWxzZSBpZiAobWFjaGluZV9pcyhwMTAyMV9tZHMpKSB7Ci0jZGVmaW5lIEJDU1IxMV9FTkVUX01JQ1JTVCAgICAgKDB4MSA8PCA1KQotCQkJLyogUmVzZXQgTWljcmVsIFBIWSAqLwotCQkJY2xyYml0czgoJmJjc3JfcmVnc1sxMV0sIEJDU1IxMV9FTkVUX01JQ1JTVCk7Ci0JCQlzZXRiaXRzOCgmYmNzcl9yZWdzWzExXSwgQkNTUjExX0VORVRfTUlDUlNUKTsKLQkJfQotCi0JCWlvdW5tYXAoYmNzcl9yZWdzKTsKLQl9CisJbXBjODV4eF9tZHNfcmVzZXRfdWNjX3BoeXMoKTsKIAogCWlmIChtYWNoaW5lX2lzKHAxMDIxX21kcykpIHsKICNkZWZpbmUgTVBDODV4eF9QTVVYQ1JfT0ZGU0VUICAgICAgICAgICAweDYwCkBAIC0zMjIsOCArMzIxLDcyIEBACiAJCX0KIAogCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfbWRzX3FlaWNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUiKTsKKwlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuOworCX0KKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxxZS1pYyIpOworCWlmICghbnApIHsKKwkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicWVpYyIpOworCQlpZiAoIW5wKQorCQkJcmV0dXJuOworCX0KKworCWlmIChtYWNoaW5lX2lzKHAxMDIxX21kcykpCisJCXFlX2ljX2luaXQobnAsIDAsIHFlX2ljX2Nhc2NhZGVfbG93X21waWMsCisJCQkJcWVfaWNfY2FzY2FkZV9oaWdoX21waWMpOworCWVsc2UKKwkJcWVfaWNfaW5pdChucCwgMCwgcWVfaWNfY2FzY2FkZV9tdXhlZF9tcGljLCBOVUxMKTsKKwlvZl9ub2RlX3B1dChucCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfcHVibGlzaF9xZV9kZXZpY2VzKHZvaWQpIHsgfQorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfbWRzX3FlX2luaXQodm9pZCkgeyB9CitzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tZHNfcWVpY19pbml0KHZvaWQpIHsgfQogI2VuZGlmCS8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KIAorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfbWRzX3NldHVwX2FyY2godm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworI2VuZGlmCisJZG1hX2FkZHJfdCBtYXggPSAweGZmZmZmZmZmOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJtcGM4NXh4X21kc19zZXR1cF9hcmNoKCkiLCAwKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSB7CisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGM4NTQwLXBjaSIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGM4NTQ4LXBjaWUiKSkgeworCQkJc3RydWN0IHJlc291cmNlIHJzcmM7CisJCQlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyYyk7CisJCQlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDgwMDApCisJCQkJZnNsX2FkZF9icmlkZ2UobnAsIDEpOworCQkJZWxzZQorCQkJCWZzbF9hZGRfYnJpZGdlKG5wLCAwKTsKKworCQkJaG9zZSA9IHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShucCk7CisJCQltYXggPSBtaW4obWF4LCBob3NlLT5kbWFfd2luZG93X2Jhc2VfY3VyICsKKwkJCQkJaG9zZS0+ZG1hX3dpbmRvd19zaXplKTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorCW1wYzg1eHhfc21wX2luaXQoKTsKKyNlbmRpZgorCisJbXBjODV4eF9tZHNfcWVfaW5pdCgpOworCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKIAlpZiAobWVtYmxvY2tfZW5kX29mX0RSQU0oKSA+IG1heCkgewogCQlwcGNfc3dpb3RsYl9lbmFibGUgPSAxOwpAQCAtMzY5LDggKzQzMiw2IEBACiAJeyAudHlwZSA9ICJzb2MiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLnR5cGUgPSAicWUiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHFlIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLHJhcGlkaW8tZGVsdGEiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtZ3V0cyIsIH0sCkBAIC0zODIsOCArNDQzLDYgQEAKIAl7IC50eXBlID0gInNvYyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAudHlwZSA9ICJxZSIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wscWUiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCiAJe30sCiB9OwpAQCAtMzk1LDE2ICs0NTQsMTYgQEAKIAlpZiAobWFjaGluZV9pcyhtcGM4NTY5X21kcykpCiAJCXNpbXBsZV9ncGlvY2hpcF9pbml0KCJmc2wsbXBjODU2OW1kcy1iY3NyLWdwaW8iKTsKIAotCS8qIFB1Ymxpc2ggdGhlIFFFIGRldmljZXMgKi8KIAlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODV4eF9pZHMsIE5VTEwpOworCW1wYzg1eHhfcHVibGlzaF9xZV9kZXZpY2VzKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcDEwMjFfcHVibGlzaF9kZXZpY2VzKHZvaWQpCiB7Ci0JLyogUHVibGlzaCB0aGUgUUUgZGV2aWNlcyAqLwogCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBwMTAyMV9pZHMsIE5VTEwpOworCW1wYzg1eHhfcHVibGlzaF9xZV9kZXZpY2VzKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0MSwyMSArNTAwLDcgQEAKIAlvZl9ub2RlX3B1dChucCk7CiAKIAltcGljX2luaXQobXBpYyk7Ci0KLSNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHFlLWljIik7Ci0JaWYgKCFucCkgewotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJxZWljIik7Ci0JCWlmICghbnApCi0JCQlyZXR1cm47Ci0JfQotCWlmIChtYWNoaW5lX2lzKHAxMDIxX21kcykpCi0JCXFlX2ljX2luaXQobnAsIDAsIHFlX2ljX2Nhc2NhZGVfbG93X21waWMsCi0JCQkJcWVfaWNfY2FzY2FkZV9oaWdoX21waWMpOwotCWVsc2UKLQkJcWVfaWNfaW5pdChucCwgMCwgcWVfaWNfY2FzY2FkZV9tdXhlZF9tcGljLCBOVUxMKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0jZW5kaWYJCQkJLyogQ09ORklHX1FVSUNDX0VOR0lORSAqLworCW1wYzg1eHhfbWRzX3FlaWNfaW5pdCgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4X21kc19wcm9iZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ2N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBQMTAyMkRTIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzCisgKgorICogQXV0aG9yczogVHJhdmlzIFdoZWF0bGV5IDx0cmF2aXMud2hlYXRsZXlAZnJlZXNjYWxlLmNvbT4KKyAqICAgICAgICAgIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgKiAgICAgICAgICBUaW11ciBUYWJpIDx0aW11ckBmcmVlc2NhbGUuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHRha2VuIGZyb20gdGhlIEZyZWVzY2FsZSBQMTAyMkRTIEJTUCwgd2l0aCBtb2RpZmljYXRpb25zOgorICogMSkgTm8gRElVIHN1cHBvcnQgKHBlbmRpbmcgcmV3cml0ZSBvZiBESVUgY29kZSkKKyAqIDIpIE5vIEFNUCBzdXBwb3J0CisgKiAzKSBObyBQQ0kgZW5kcG9pbnQgc3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2xtYi5oPgorCisjaW5jbHVkZSA8YXNtL21waWMuaD4KKyNpbmNsdWRlIDxhc20vc3dpb3RsYi5oPgorCisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgorCit2b2lkIF9faW5pdCBwMTAyMl9kc19waWNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljOworCXN0cnVjdCByZXNvdXJjZSByOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOworCWlmICghbnApIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKKwltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKKwkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8CisJCU1QSUNfQklHX0VORElBTiB8IE1QSUNfQlJPS0VOX0ZSUl9OSVJRUyB8CisJCU1QSUNfU0lOR0xFX0RFU1RfQ1BVLAorCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CisKKwlCVUdfT04obXBpYyA9PSBOVUxMKTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwltcGljX2luaXQobXBpYyk7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIF9faW5pdCBtcGM4NXh4X3NtcF9pbml0KHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwMTAyMl9kc19zZXR1cF9hcmNoKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisjZW5kaWYKKwlkbWFfYWRkcl90IG1heCA9IDB4ZmZmZmZmZmY7CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoInAxMDIyX2RzX3NldHVwX2FyY2goKSIsIDApOworCisjaWZkZWYgQ09ORklHX1BDSQorCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wscDEwMjItcGNpZSIpIHsKKwkJc3RydWN0IHJlc291cmNlIHJzcmM7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKworCQlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyYyk7CisKKwkJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4MDAwKQorCQkJZnNsX2FkZF9icmlkZ2UobnAsIDEpOworCQllbHNlCisJCQlmc2xfYWRkX2JyaWRnZShucCwgMCk7CisKKwkJaG9zZSA9IHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShucCk7CisJCW1heCA9IG1pbihtYXgsIGhvc2UtPmRtYV93aW5kb3dfYmFzZV9jdXIgKworCQkJICBob3NlLT5kbWFfd2luZG93X3NpemUpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorCW1wYzg1eHhfc21wX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NXSU9UTEIKKwlpZiAobG1iX2VuZF9vZl9EUkFNKCkgPiBtYXgpIHsKKwkJcHBjX3N3aW90bGJfZW5hYmxlID0gMTsKKwkJc2V0X3BjaV9kbWFfb3BzKCZzd2lvdGxiX2RtYV9vcHMpOworCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwY2lfZG1hX2Rldl9zZXR1cF9zd2lvdGxiOworCX0KKyNlbmRpZgorCisJcHJfaW5mbygiRnJlZXNjYWxlIFAxMDIyIERTIHJlZmVyZW5jZSBib2FyZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgcDEwMjJfZHNfaWRzW10gPSB7CisJeyAudHlwZSA9ICJzb2MiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwMTAyMl9kc19wdWJsaXNoX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHAxMDIyX2RzX2lkcywgTlVMTCk7Cit9CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyMl9kcywgcDEwMjJfZHNfcHVibGlzaF9kZXZpY2VzKTsKKworbWFjaGluZV9hcmNoX2luaXRjYWxsKHAxMDIyX2RzLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CisKKy8qCisgKiBDYWxsZWQgdmVyeSBlYXJseSwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKKyAqLworc3RhdGljIGludCBfX2luaXQgcDEwMjJfZHNfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisKKwlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wscDEwMjJkcyIpOworfQorCitkZWZpbmVfbWFjaGluZShwMTAyMl9kcykgeworCS5uYW1lCQkJPSAiUDEwMjIgRFMiLAorCS5wcm9iZQkJCT0gcDEwMjJfZHNfcHJvYmUsCisJLnNldHVwX2FyY2gJCT0gcDEwMjJfZHNfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJCT0gcDEwMjJfZHNfcGljX2luaXQsCisjaWZkZWYgQ09ORklHX1BDSQorCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKyNlbmRpZgorCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKKwkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKaW5kZXggYTE1ZjU4Mi4uYTZiMTA2NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTI0LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vZGJlbGwuaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L21waWMuaD4KIAogZXh0ZXJuIHZvaWQgX19lYXJseV9zdGFydCh2b2lkKTsKIApAQCAtOTksMTIgKzEwMSw3MCBAQAogc21wXzg1eHhfc2V0dXBfY3B1KGludCBjcHVfbnIpCiB7CiAJbXBpY19zZXR1cF90aGlzX2NwdSgpOworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EQkVMTCkpCisJCWRvb3JiZWxsX3NldHVwX3RoaXNfY3B1KCk7CiB9CiAKIHN0cnVjdCBzbXBfb3BzX3Qgc21wXzg1eHhfb3BzID0gewogCS5raWNrX2NwdSA9IHNtcF84NXh4X2tpY2tfY3B1LAorI2lmZGVmIENPTkZJR19LRVhFQworCS5naXZlX3RpbWViYXNlCT0gc21wX2dlbmVyaWNfZ2l2ZV90aW1lYmFzZSwKKwkudGFrZV90aW1lYmFzZQk9IHNtcF9nZW5lcmljX3Rha2VfdGltZWJhc2UsCisjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3N0YXRpYyBpbnQga2V4ZWNfZG93bl9jcHVzID0gMDsKKwordm9pZCBtcGM4NXh4X3NtcF9rZXhlY19jcHVfZG93bihpbnQgY3Jhc2hfc2h1dGRvd24sIGludCBzZWNvbmRhcnkpCit7CisJbXBpY190ZWFyZG93bl90aGlzX2NwdSgxKTsKKworCS8qIFdoZW4gY3Jhc2hpbmcsIHRoaXMgZ2V0cyBjYWxsZWQgb24gYWxsIENQVSdzIHdlIG9ubHkKKwkgKiB0YWtlIGRvd24gdGhlIG5vbi1ib290IGNwdXMgKi8KKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGJvb3RfY3B1aWQpCisJeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlrZXhlY19kb3duX2NwdXMrKzsKKworCQl3aGlsZSAoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtcGM4NXh4X3NtcF9rZXhlY19kb3duKHZvaWQgKmFyZykKK3sKKwlpZiAocHBjX21kLmtleGVjX2NwdV9kb3duKQorCQlwcGNfbWQua2V4ZWNfY3B1X2Rvd24oMCwxKTsKK30KKworc3RhdGljIHZvaWQgbXBjODV4eF9zbXBfbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwlpbnQgdGltZW91dCA9IDIwMDA7CisJaW50IGk7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGJvb3RfY3B1aWQpKTsKKworCXNtcF9jYWxsX2Z1bmN0aW9uKG1wYzg1eHhfc21wX2tleGVjX2Rvd24sIE5VTEwsIDApOworCisJd2hpbGUgKCAoa2V4ZWNfZG93bl9jcHVzICE9IChudW1fb25saW5lX2NwdXMoKSAtIDEpKSAmJgorCQkoIHRpbWVvdXQgPiAwICkgKQorCXsKKwkJdGltZW91dC0tOworCX0KKworCWlmICggIXRpbWVvdXQgKQorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBicmluZyBkb3duIHNlY29uZGFyeSBjcHUocykiKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcHJlc2VudF9jcHVzKCk7IGkrKykKKwl7CisJCWlmICggaSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkgKSBjb250aW51ZTsKKwkJbXBpY19yZXNldF9jb3JlKGkpOworCX0KKworCWRlZmF1bHRfbWFjaGluZV9rZXhlYyhpbWFnZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0tFWEVDICovCisKIHZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpAQCAtMTE3LDkgKzE3NywxNCBAQAogCX0KIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EQkVMTCkpCi0JCXNtcF84NXh4X29wcy5tZXNzYWdlX3Bhc3MgPSBzbXBfZGJlbGxfbWVzc2FnZV9wYXNzOworCQlzbXBfODV4eF9vcHMubWVzc2FnZV9wYXNzID0gZG9vcmJlbGxfbWVzc2FnZV9wYXNzOwogCiAJQlVHX09OKCFzbXBfODV4eF9vcHMubWVzc2FnZV9wYXNzKTsKIAogCXNtcF9vcHMgPSAmc21wXzg1eHhfb3BzOworCisjaWZkZWYgQ09ORklHX0tFWEVDCisJcHBjX21kLmtleGVjX2NwdV9kb3duID0gbXBjODV4eF9zbXBfa2V4ZWNfY3B1X2Rvd247CisJcHBjX21kLm1hY2hpbmVfa2V4ZWMgPSBtcGM4NXh4X3NtcF9tYWNoaW5lX2tleGVjOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYwppbmRleCA1YjBhYjk5Li44ZjI5YmJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKQEAgLTE1MSw2ICsxNTEsMjcgQEAKIAlzZXFfcHJpbnRmKG0sICJQTEwgc2V0dGluZ1x0OiAweCV4XG4iLCAoKHBoaWQxID4+IDI0KSAmIDB4M2YpKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHRxbTg1eHhfdGkxNTIwX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBEbyBub3QgZG8gdGhlIGZpeHVwIG9uIG90aGVyIHBsYXRmb3JtcyEgKi8KKwlpZiAoIW1hY2hpbmVfaXModHFtODV4eCkpCisJCXJldHVybjsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJVc2luZyBUSSAxNTIwIGZpeHVwIG9uIFRRTTg1eHhcbiIpOworCisJLyoKKwkgKiBFbmFibGUgUDJDQ0xLIGJpdCBpbiBzeXN0ZW0gY29udHJvbCByZWdpc3RlcgorCSAqIHRvIGVuYWJsZSBDTE9DSyBvdXRwdXQgdG8gcG93ZXIgY2hpcAorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDgwLCAmdmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODAsIHZhbCB8ICgxIDw8IDI3KSk7CisKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1RJLCBQQ0lfREVWSUNFX0lEX1RJXzE1MjAsCisJCXRxbTg1eHhfdGkxNTIwX2ZpeHVwKTsKKwogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9ncGlvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYwppbmRleCBiOGNiMDhkLi40ZmY3YjFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYwpAQCAtMTE4LDEyICsxMTgsMTIgQEAKIAkJfQogCiAJCS8qIFNldHVwIHBvaW50ZXJzIHRvIGNoaXAgZnVuY3Rpb25zICovCi0JCWdlZl9ncGlvX2NoaXAtPm9mX2djLmdwaW9fY2VsbHMgPSAyOwotCQlnZWZfZ3Bpb19jaGlwLT5vZl9nYy5nYy5uZ3BpbyA9IDE5OwotCQlnZWZfZ3Bpb19jaGlwLT5vZl9nYy5nYy5kaXJlY3Rpb25faW5wdXQgPSBnZWZfZ3Bpb19kaXJfaW47Ci0JCWdlZl9ncGlvX2NoaXAtPm9mX2djLmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBnZWZfZ3Bpb19kaXJfb3V0OwotCQlnZWZfZ3Bpb19jaGlwLT5vZl9nYy5nYy5nZXQgPSBnZWZfZ3Bpb19nZXQ7Ci0JCWdlZl9ncGlvX2NoaXAtPm9mX2djLmdjLnNldCA9IGdlZl9ncGlvX3NldDsKKwkJZ2VmX2dwaW9fY2hpcC0+Z2Mub2ZfZ3Bpb19uX2NlbGxzID0gMjsKKwkJZ2VmX2dwaW9fY2hpcC0+Z2MubmdwaW8gPSAxOTsKKwkJZ2VmX2dwaW9fY2hpcC0+Z2MuZGlyZWN0aW9uX2lucHV0ID0gZ2VmX2dwaW9fZGlyX2luOworCQlnZWZfZ3Bpb19jaGlwLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gZ2VmX2dwaW9fZGlyX291dDsKKwkJZ2VmX2dwaW9fY2hpcC0+Z2MuZ2V0ID0gZ2VmX2dwaW9fZ2V0OworCQlnZWZfZ3Bpb19jaGlwLT5nYy5zZXQgPSBnZWZfZ3Bpb19zZXQ7CiAKIAkJLyogVGhpcyBmdW5jdGlvbiBhZGRzIGEgbWVtb3J5IG1hcHBlZCBHUElPIGNoaXAgKi8KIAkJcmV0dmFsID0gb2ZfbW1fZ3Bpb2NoaXBfYWRkKG5wLCBnZWZfZ3Bpb19jaGlwKTsKQEAgLTE0NiwxMiArMTQ2LDEyIEBACiAJCX0KIAogCQkvKiBTZXR1cCBwb2ludGVycyB0byBjaGlwIGZ1bmN0aW9ucyAqLwotCQlnZWZfZ3Bpb19jaGlwLT5vZl9nYy5ncGlvX2NlbGxzID0gMjsKLQkJZ2VmX2dwaW9fY2hpcC0+b2ZfZ2MuZ2MubmdwaW8gPSA2OwotCQlnZWZfZ3Bpb19jaGlwLT5vZl9nYy5nYy5kaXJlY3Rpb25faW5wdXQgPSBnZWZfZ3Bpb19kaXJfaW47Ci0JCWdlZl9ncGlvX2NoaXAtPm9mX2djLmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBnZWZfZ3Bpb19kaXJfb3V0OwotCQlnZWZfZ3Bpb19jaGlwLT5vZl9nYy5nYy5nZXQgPSBnZWZfZ3Bpb19nZXQ7Ci0JCWdlZl9ncGlvX2NoaXAtPm9mX2djLmdjLnNldCA9IGdlZl9ncGlvX3NldDsKKwkJZ2VmX2dwaW9fY2hpcC0+Z2Mub2ZfZ3Bpb19uX2NlbGxzID0gMjsKKwkJZ2VmX2dwaW9fY2hpcC0+Z2MubmdwaW8gPSA2OworCQlnZWZfZ3Bpb19jaGlwLT5nYy5kaXJlY3Rpb25faW5wdXQgPSBnZWZfZ3Bpb19kaXJfaW47CisJCWdlZl9ncGlvX2NoaXAtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBnZWZfZ3Bpb19kaXJfb3V0OworCQlnZWZfZ3Bpb19jaGlwLT5nYy5nZXQgPSBnZWZfZ3Bpb19nZXQ7CisJCWdlZl9ncGlvX2NoaXAtPmdjLnNldCA9IGdlZl9ncGlvX3NldDsKIAogCQkvKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBtZW1vcnkgbWFwcGVkIEdQSU8gY2hpcCAqLwogCQlyZXR2YWwgPSBvZl9tbV9ncGlvY2hpcF9hZGQobnAsIGdlZl9ncGlvX2NoaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L0tjb25maWcKaW5kZXggNDhhOTIwYS4uZGQzNWNlMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCkBAIC01NSw2ICs1NSwxMiBAQAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgS2V5bWlsZSBNR1NVVkQgYm9hcmQuCiAKK2NvbmZpZyBUUU04WFgKKwlib29sICJUUU04WFgiCisJc2VsZWN0IENQTTEKKwloZWxwCisJICBzdXBwb3J0IGZvciB0aGUgbXBjOHh4IGJhc2VkIGJvYXJkcyBmcm9tIFRRTS4KKwogZW5kY2hvaWNlCiAKIG1lbnUgIkZyZWVzY2FsZSBFdGhlcm5ldCBkcml2ZXIgcGxhdGZvcm0tc3BlY2lmaWMgb3B0aW9ucyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvTWFrZWZpbGUKaW5kZXggYmRiZmQ3NDkuLmE0OTFmZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L01ha2VmaWxlCkBAIC03LDMgKzcsNCBAQAogb2JqLSQoQ09ORklHX1BQQ19FUDg4WEMpICArPSBlcDg4eGMubwogb2JqLSQoQ09ORklHX1BQQ19BRERFUjg3NSkgKz0gYWRkZXI4NzUubwogb2JqLSQoQ09ORklHX1BQQ19NR1NVVkQpICs9IG1nc3V2ZC5vCitvYmotJChDT05GSUdfVFFNOFhYKSAgICAgICs9IHRxbTh4eF9zZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC90cW04eHhfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L3RxbTh4eF9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWM2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC90cW04eHhfc2V0dXAuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIFBsYXRmb3JtIHNldHVwIGZvciB0aGUgTVBDOHh4IGJhc2VkIGJvYXJkcyBmcm9tIFRRTS4KKyAqCisgKiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KKyAqIENvcHlyaWdodCAyMDEwIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSAorICoKKyAqIGJhc2VkIG9uOgorICogVml0YWx5IEJvcmR1ZyA8dmJvcmR1Z0BydS5tdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqIEhlYXZpbHkgbW9kaWZpZWQgYnkgU2NvdHQgV29vZCA8c2NvdHR3b29kQGZyZWVzY2FsZS5jb20+CisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CisjaW5jbHVkZSA8bGludXgvZnNfdWFydF9wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21wYzh4eC5oPgorI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KKyNpbmNsdWRlIDxhc20vY3BtMS5oPgorI2luY2x1ZGUgPGFzbS9mc19wZC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisKKyNpbmNsdWRlICJtcGM4eHguaCIKKworc3RydWN0IGNwbV9waW4geworCWludCBwb3J0LCBwaW4sIGZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIGNwbV9waW4gdHFtOHh4X3BpbnNbXSA9IHsKKwkvKiBTTUMxICovCisJe0NQTV9QT1JUQiwgMjQsIENQTV9QSU5fSU5QVVR9LCAvKiBSWCAqLworCXtDUE1fUE9SVEIsIDI1LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9TRUNPTkRBUll9LCAvKiBUWCAqLworCisJLyogU0NDMSAqLworCXtDUE1fUE9SVEEsIDUsIENQTV9QSU5fSU5QVVR9LCAvKiBDTEsxICovCisJe0NQTV9QT1JUQSwgNywgQ1BNX1BJTl9JTlBVVH0sIC8qIENMSzIgKi8KKwl7Q1BNX1BPUlRBLCAxNCwgQ1BNX1BJTl9JTlBVVH0sIC8qIFRYICovCisJe0NQTV9QT1JUQSwgMTUsIENQTV9QSU5fSU5QVVR9LCAvKiBSWCAqLworCXtDUE1fUE9SVEMsIDE1LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9TRUNPTkRBUll9LCAvKiBURU5BICovCisJe0NQTV9QT1JUQywgMTAsIENQTV9QSU5fSU5QVVQgfCBDUE1fUElOX1NFQ09OREFSWSB8IENQTV9QSU5fR1BJT30sCisJe0NQTV9QT1JUQywgMTEsIENQTV9QSU5fSU5QVVQgfCBDUE1fUElOX1NFQ09OREFSWSB8IENQTV9QSU5fR1BJT30sCit9OworCitzdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgY3BtX3BpbiB0cW04eHhfZmVjX3BpbnNbXSA9IHsKKwkvKiBNSUkgKi8KKwl7Q1BNX1BPUlRELCAzLCBDUE1fUElOX09VVFBVVH0sCisJe0NQTV9QT1JURCwgNCwgQ1BNX1BJTl9PVVRQVVR9LAorCXtDUE1fUE9SVEQsIDUsIENQTV9QSU5fT1VUUFVUfSwKKwl7Q1BNX1BPUlRELCA2LCBDUE1fUElOX09VVFBVVH0sCisJe0NQTV9QT1JURCwgNywgQ1BNX1BJTl9PVVRQVVR9LAorCXtDUE1fUE9SVEQsIDgsIENQTV9QSU5fT1VUUFVUfSwKKwl7Q1BNX1BPUlRELCA5LCBDUE1fUElOX09VVFBVVH0sCisJe0NQTV9QT1JURCwgMTAsIENQTV9QSU5fT1VUUFVUfSwKKwl7Q1BNX1BPUlRELCAxMSwgQ1BNX1BJTl9PVVRQVVR9LAorCXtDUE1fUE9SVEQsIDEyLCBDUE1fUElOX09VVFBVVH0sCisJe0NQTV9QT1JURCwgMTMsIENQTV9QSU5fT1VUUFVUfSwKKwl7Q1BNX1BPUlRELCAxNCwgQ1BNX1BJTl9PVVRQVVR9LAorCXtDUE1fUE9SVEQsIDE1LCBDUE1fUElOX09VVFBVVH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9waW5zKGludCBuLCBzdHJ1Y3QgY3BtX3BpbiAqcGluKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQljcG0xX3NldF9waW4ocGluLT5wb3J0LCBwaW4tPnBpbiwgcGluLT5mbGFncyk7CisJCXBpbisrOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaW9wb3J0cyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG5vZGU7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCWludAlsZW47CisKKwlpbml0X3BpbnMoQVJSQVlfU0laRSh0cW04eHhfcGlucyksICZ0cW04eHhfcGluc1swXSk7CisKKwljcG0xX2Nsa19zZXR1cChDUE1fQ0xLX1NNQzEsIENQTV9CUkcxLCBDUE1fQ0xLX1JUWCk7CisKKwlkbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJhbGlhc2VzIik7CisJaWYgKGRub2RlID09IE5VTEwpCisJCXJldHVybjsKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkbm9kZSwgImV0aGVybmV0MSIsICZsZW4pOworCWlmIChwcm9wID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGluaXQgRkVDIHBpbnMgKi8KKwlpbml0X3BpbnMoQVJSQVlfU0laRSh0cW04eHhfZmVjX3BpbnMpLCAmdHFtOHh4X2ZlY19waW5zWzBdKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRxbTh4eF9zZXR1cF9hcmNoKHZvaWQpCit7CisJY3BtX3Jlc2V0KCk7CisJaW5pdF9pb3BvcnRzKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRxbTh4eF9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbm9kZSA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgInRxYyx0cW04eHgiKTsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7CisJeyAubmFtZSA9ICJzb2MiLCB9LAorCXsgLm5hbWUgPSAiY3BtIiwgfSwKKwl7IC5uYW1lID0gImxvY2FsYnVzIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHRxbTh4eCwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKworZGVmaW5lX21hY2hpbmUodHFtOHh4KSB7CisJLm5hbWUJCQk9ICJUUU04eHgiLAorCS5wcm9iZQkJCT0gdHFtOHh4X3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IHRxbTh4eF9zZXR1cF9hcmNoLAorCS5pbml0X0lSUQkJPSBtcGM4eHhfcGljc19pbml0LAorCS5nZXRfaXJxCQk9IG1wYzh4eF9nZXRfaXJxLAorCS5yZXN0YXJ0CQk9IG1wYzh4eF9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBtcGM4eHhfY2FsaWJyYXRlX2RlY3IsCisJLnNldF9ydGNfdGltZQkJPSBtcGM4eHhfc2V0X3J0Y190aW1lLAorCS5nZXRfcnRjX3RpbWUJCT0gbXBjOHh4X2dldF9ydGNfdGltZSwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FtaWdhb25lL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FtaWdhb25lL3NldHVwLmMKaW5kZXggZmI0ZWIwZC4uMDNhYWJjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9hbWlnYW9uZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYW1pZ2FvbmUvc2V0dXAuYwpAQCAtMTMsMTIgKzEzLDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCmluZGV4IDYyNTdlNTMuLjk3MDg1NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAkubWFwCT0gbXNpY19ob3N0X21hcCwKIH07CiAKLXN0YXRpYyBpbnQgYXhvbl9tc2lfc2h1dGRvd24oc3RydWN0IG9mX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBheG9uX21zaV9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGF4b25fbXNpYyAqbXNpYyA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2aWNlLT5kZXYpOwogCXUzMiB0bXA7CkBAIC0zNDIsNyArMzQyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBheG9uX21zaV9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXZpY2UsCitzdGF0aWMgaW50IGF4b25fbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSwKIAkJCSAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqZGV2aWNlX2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBkZXZpY2UtPmRldi5vZl9ub2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2lvbW11LmMKaW5kZXggMzlkMzYxYy4uYmVlYzQwNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pb21tdS5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAljZWxsZWJfaW5pdF9kaXJlY3RfbWFwcGluZygpOwogCXNldF9wY2lfZG1hX29wcygmZG1hX2RpcmVjdF9vcHMpOwogCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IGNlbGxlYl9wY2lfZG1hX2Rldl9zZXR1cDsKLQlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJm9mX3BsYXRmb3JtX2J1c190eXBlLCAmY2VsbGViX29mX2J1c19ub3RpZmllcik7CisJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJmNlbGxlYl9vZl9idXNfbm90aWZpZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IDM3MTI5MDAuLjU4YjEzY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC0xMjA0LDcgKzEyMDQsNyBAQAogCS8qIFJlZ2lzdGVyIGNhbGxiYWNrcyBvbiBPRiBwbGF0Zm9ybSBkZXZpY2UgYWRkaXRpb24vcmVtb3ZhbAogCSAqIHRvIGhhbmRsZSBsaW5raW5nIHRoZW0gdG8gdGhlIHJpZ2h0IERNQSBvcGVyYXRpb25zCiAJICovCi0JYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwgJmNlbGxfb2ZfYnVzX25vdGlmaWVyKTsKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmY2VsbF9vZl9idXNfbm90aWZpZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcXBhY2Vfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9xcGFjZV9zZXR1cC5jCmluZGV4IGM1Y2UwMmUuLjFiNTc0OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9xcGFjZV9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9xcGFjZV9zZXR1cC5jCkBAIC02MSwxMiArNjEsMjQgQEAKIAlwcmludGsoIioqKiAlMDR4IDogJXNcbiIsIGhleCwgcyA/IHMgOiAiIik7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFwYWNlX2J1c19pZHNbXSBfX2luaXRkYXRhID0geworCXsgLnR5cGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCisJeyAudHlwZSA9ICJzcGlkZXIiLCB9LAorCXsgLnR5cGUgPSAiYXhvbiIsIH0sCisJeyAudHlwZSA9ICJwbGI1IiwgfSwKKwl7IC50eXBlID0gInBsYjQiLCB9LAorCXsgLnR5cGUgPSAib3BiIiwgfSwKKwl7IC50eXBlID0gImViYyIsIH0sCisJe30sCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBxcGFjZV9wdWJsaXNoX2RldmljZXModm9pZCkKIHsKIAlpbnQgbm9kZTsKIAogCS8qIFB1Ymxpc2ggT0YgcGxhdGZvcm0gZGV2aWNlcyBmb3Igc291dGhicmlkZ2UgSU9zICovCi0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIE5VTEwsIE5VTEwpOworCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBxcGFjZV9idXNfaWRzLCBOVUxMKTsKIAogCS8qIFRoZXJlIGlzIG5vIGRldmljZSBmb3IgdGhlIE1JQyBtZW1vcnkgY29udHJvbGxlciwgdGh1cyB3ZSBjcmVhdGUKIAkgKiBhIHBsYXRmb3JtIGRldmljZSBmb3IgaXQgdG8gYXR0YWNoIHRoZSBFREFDIGRyaXZlciB0by4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKaW5kZXggNTAzODVkYi4uNjkxOTk1NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKQEAgLTE0MSw2ICsxNDEsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2VsbF9idXNfaWRzW10gX19pbml0ZGF0YSA9IHsKKwl7IC50eXBlID0gInNvYyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAorCXsgLnR5cGUgPSAic3BpZGVyIiwgfSwKKwl7IC50eXBlID0gImF4b24iLCB9LAorCXsgLnR5cGUgPSAicGxiNSIsIH0sCisJeyAudHlwZSA9ICJwbGI0IiwgfSwKKwl7IC50eXBlID0gIm9wYiIsIH0sCisJeyAudHlwZSA9ICJlYmMiLCB9LAorCXt9LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgY2VsbF9wdWJsaXNoX2RldmljZXModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwpAQCAtMTQ4LDcgKzE2MCw3IEBACiAJaW50IG5vZGU7CiAKIAkvKiBQdWJsaXNoIE9GIHBsYXRmb3JtIGRldmljZXMgZm9yIHNvdXRoYnJpZGdlIElPcyAqLwotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBOVUxMLCBOVUxMKTsKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgY2VsbF9idXNfaWRzLCBOVUxMKTsKIAogCS8qIE9uIHNwaWRlciBiYXNlZCBibGFkZXMsIHdlIG5lZWQgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBPRgogCSAqIHBsYXRmb3JtIGRldmljZXMgZm9yIHRoZSBQQ0kgaG9zdCBicmlkZ2VzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCmluZGV4IGQyYzFkNDkuLjMzZTVmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jCmluZGV4IDAwYjY3MzAuLmI2ZGI3Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW8uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMKQEAgLTg3LDEyICs4NywxMSBAQAogCiAJaWYgKCFucCkKIAkJcmV0dXJuIE5VTEw7Ci0JbnAtPmZ1bGxfbmFtZSA9IGttYWxsb2Moc3RybGVuKHBhdGgpICsgMSwgR0ZQX0tFUk5FTCk7CisJbnAtPmZ1bGxfbmFtZSA9IGtzdHJkdXAocGF0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFucC0+ZnVsbF9uYW1lKSB7CiAJCWtmcmVlKG5wKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXN0cmNweShucC0+ZnVsbF9uYW1lLCBwYXRoKTsKIAlvZl9ub2RlX3NldF9mbGFnKG5wLCBPRl9EWU5BTUlDKTsKIAlrcmVmX2luaXQoJm5wLT5rcmVmKTsKIAlucC0+cGFyZW50ID0gb2Zfbm9kZV9nZXQocGFyZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2dwaW9fbWRpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKaW5kZXggNjI3ZWUwOC4uYTVkOTA3YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fbWRpb19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fbWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZmRldi0+ZGV2OwpAQCAtMjc1LDcgKzI3NSw3IEBACiB9CiAKIAotc3RhdGljIGludCBncGlvX21kaW9fcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZ3Bpb19tZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1paV9idXMgKmJ1cyA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCmluZGV4IDllMWI5ZmQuLjM5ZGY2YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvcG11Lmg+CkBAIC0yMTkxLDcgKzIxOTMsMTEgQEAKIAkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsCWludHJlcGlkX2ZlYXR1cmVzLAogCQlQTUFDX01CX01BWV9TTEVFUCwKIAl9LAotCXsJImlNYWMsMSIsCQkJImlNYWMgKGZpcnN0IGdlbmVyYXRpb24pIiwKKwl7ICAgICAgICJQb3dlck1hYzEwLDIiLCAgICAgICAgICAgICAgICAgIk1hYyBtaW5pIChMYXRlIDIwMDUpIiwKKwkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsICAgICBpbnRyZXBpZF9mZWF0dXJlcywKKwkJUE1BQ19NQl9NQVlfU0xFRVAsCisJfSwKKyAJewkiaU1hYywxIiwJCQkiaU1hYyAoZmlyc3QgZ2VuZXJhdGlvbikiLAogCQlQTUFDX1RZUEVfT1JJR19JTUFDLAkJcGFkZGluZ3Rvbl9mZWF0dXJlcywKIAkJMAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwppbmRleCA2MzBhNTMzLi44OTBkNWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKQEAgLTQ2LDYgKzQ2LDEwIEBACiAgICAgICAgIHVuc2lnbmVkIGludCAgICBsZXZlbDsKIH07CiAKKy8qIFdvcmthcm91bmQgZmxhZ3MgZm9yIDMyYml0IHBvd2VybWFjIG1hY2hpbmVzICovCit1bnNpZ25lZCBpbnQgb2ZfaXJxX3dvcmthcm91bmRzOworc3RydWN0IGRldmljZV9ub2RlICpvZl9pcnFfZGZsdF9waWM7CisKIC8qIERlZmF1bHQgYWRkcmVzc2VzICovCiBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3IF9faW9tZW0gKnBtYWNfaXJxX2h3WzRdOwogCkBAIC00MjgsNiArNDMyLDQyIEBACiAJc2V0dXBfaXJxKGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCAyMCksICZ4bW9uX2FjdGlvbik7CiAjZW5kaWYKIH0KKworaW50IG9mX2lycV9tYXBfb2xkd29ybGQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCwKKwkJCXN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCit7CisJY29uc3QgdTMyICppbnRzID0gTlVMTDsKKwlpbnQgaW50bGVuOworCisJLyoKKwkgKiBPbGQgbWFjaGluZXMganVzdCBoYXZlIGEgbGlzdCBvZiBpbnRlcnJ1cHQgbnVtYmVycworCSAqIGFuZCBubyBpbnRlcnJ1cHQtY29udHJvbGxlciBub2Rlcy4gV2UgYWxzbyBoYXZlIGRvZGd5CisJICogY2FzZXMgd2hlcmUgdGhlIEFQUEwsaW50ZXJydXB0cyBwcm9wZXJ0eSBpcyBjb21wbGV0ZWx5CisJICogbWlzc2luZyBiZWhpbmQgcGNpLXBjaSBicmlkZ2VzIGFuZCB3ZSBoYXZlIHRvIGdldCBpdAorCSAqIGZyb20gdGhlIHBhcmVudCAodGhlIGJyaWRnZSBpdHNlbGYsIGFzIGFwcGxlIGp1c3Qgd2lyZWQKKwkgKiBldmVyeXRoaW5nIHRvZ2V0aGVyIG9uIHRoZXNlKQorCSAqLworCXdoaWxlIChkZXZpY2UpIHsKKwkJaW50cyA9IG9mX2dldF9wcm9wZXJ0eShkZXZpY2UsICJBQVBMLGludGVycnVwdHMiLCAmaW50bGVuKTsKKwkJaWYgKGludHMgIT0gTlVMTCkKKwkJCWJyZWFrOworCQlkZXZpY2UgPSBkZXZpY2UtPnBhcmVudDsKKwkJaWYgKGRldmljZSAmJiBzdHJjbXAoZGV2aWNlLT50eXBlLCAicGNpIikgIT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaW50cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpbnRsZW4gLz0gc2l6ZW9mKHUzMik7CisKKwlpZiAoaW5kZXggPj0gaW50bGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW91dF9pcnEtPmNvbnRyb2xsZXIgPSBOVUxMOworCW91dF9pcnEtPnNwZWNpZmllclswXSA9IGludHNbaW5kZXhdOworCW91dF9pcnEtPnNpemUgPSAxOworCisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKIHN0YXRpYyB2b2lkIHBtYWNfdTNfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCkBAIC01NTksMTkgKzU5OSwzOSBAQAogCiB2b2lkIF9faW5pdCBwbWFjX3BpY19pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQogCS8qIFdlIGNvbmZpZ3VyZSB0aGUgT0YgcGFyc2luZyBiYXNlZCBvbiBvdXIgb2xkd29ybGQgdnMuIG5ld3dvcmxkCiAJICogcGxhdGZvcm0gdHlwZSBhbmQgd2V0aGVyIHdlIHdlcmUgYm9vdGVkIGJ5IEJvb3RYLgogCSAqLwogI2lmZGVmIENPTkZJR19QUEMzMgogCWlmICghcG1hY19uZXd3b3JsZCkKLQkJZmxhZ3MgfD0gT0ZfSU1BUF9PTERXT1JMRF9NQUM7CisJCW9mX2lycV93b3JrYXJvdW5kcyB8PSBPRl9JTUFQX09MRFdPUkxEX01BQzsKIAlpZiAob2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGJvb3R4IiwgTlVMTCkgIT0gTlVMTCkKLQkJZmxhZ3MgfD0gT0ZfSU1BUF9OT19QSEFORExFOwotI2VuZGlmIC8qIENPTkZJR19QUENfMzIgKi8KKwkJb2ZfaXJxX3dvcmthcm91bmRzIHw9IE9GX0lNQVBfTk9fUEhBTkRMRTsKIAotCW9mX2lycV9tYXBfaW5pdChmbGFncyk7CisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBwaGFuZGxlcyBvbiBhIG5ld3dvcmxkLCB0aGVuIHRyeSB0byBsb2NhdGUgYQorCSAqIGRlZmF1bHQgaW50ZXJydXB0IGNvbnRyb2xsZXIgKGhhcHBlbnMgd2hlbiBib290aW5nIHdpdGggQm9vdFgpLgorCSAqIFdlIGRvIGEgZmlyc3QgbWF0Y2ggaGVyZSwgaG9wZWZ1bGx5LCB0aGF0IG9ubHkgZXZlciBoYXBwZW5zIG9uCisJICogbWFjaGluZXMgd2l0aCBvbmUgY29udHJvbGxlci4KKwkgKi8KKwlpZiAocG1hY19uZXd3b3JsZCAmJiAob2ZfaXJxX3dvcmthcm91bmRzICYgT0ZfSU1BUF9OT19QSEFORExFKSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJCWZvcl9lYWNoX25vZGVfd2l0aF9wcm9wZXJ0eShucCwgImludGVycnVwdC1jb250cm9sbGVyIikgeworCQkJLyogU2tpcCAvY2hvc2VuL2ludGVycnVwdC1jb250cm9sbGVyICovCisJCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiY2hvc2VuIikgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qIEl0IHNlZW1zIGxpa2UgYXQgbGVhc3Qgb25lIHBlcnNvbiB3YW50cworCQkJICogdG8gdXNlIEJvb3RYIG9uIGEgbWFjaGluZSB3aXRoIGFuIEFwcGxlS2l3aQorCQkJICogY29udHJvbGxlciB3aGljaCBoYXBwZW5zIHRvIHByZXRlbmQgdG8gYmUgYW4KKwkJCSAqIGludGVycnVwdCBjb250cm9sbGVyIHRvby4gKi8KKwkJCWlmIChzdHJjbXAobnAtPm5hbWUsICJBcHBsZUtpd2kiKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJLyogSSB0aGluayB3ZSBmb3VuZCBvbmUgISAqLworCQkJb2ZfaXJxX2RmbHRfcGljID0gbnA7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIAogCS8qIFdlIGZpcnN0IHRyeSB0byBkZXRlY3QgQXBwbGUncyBuZXcgQ29yZTk5IGNoaXBzZXQsIHNpbmNlIG1hYy1pbwogCSAqIGlzIHF1aXRlIGRpZmZlcmVudCBvbiB0aG9zZSBtYWNoaW5lcyBhbmQgY29udGFpbnMgYW4gSUJNIE1QSUMyLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCmluZGV4IDJjMGVkODcuLjMxMjRjZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCSAqIEFzIGx2MV9yZWFkX2h0YWJfZW50cmllcygpIGRvZXMgbm90IGdpdmUgdXMgdGhlIFJQTiwgd2UgY2FuCiAJICogbm90IHN5bnRoZXNpemUgdGhlIG5ldyBocHRlX3IgdmFsdWUgaGVyZSwgYW5kIHRoZXJlZm9yZSBjYW4KIAkgKiBub3QgdXBkYXRlIHRoZSBocHRlIHdpdGggbHYxX2luc2VydF9odGFiX2VudHJ5KCksIHNvIHdlCi0JICogaW5zdGVkIGludmFsaWRhdGUgaXQgYW5kIGFzayB0aGUgY2FsbGVyIHRvIHVwZGF0ZSBpdCB2aWEKKwkgKiBpbnN0ZWFkIGludmFsaWRhdGUgaXQgYW5kIGFzayB0aGUgY2FsbGVyIHRvIHVwZGF0ZSBpdCB2aWEKIAkgKiBwczNfaHB0ZV9pbnNlcnQoKSBieSByZXR1cm5pbmcgYSAtMSB2YWx1ZS4KIAkgKi8KIAlpZiAoIUhQVEVfVl9DT01QQVJFKGhwdGVfdiwgd2FudF92KSB8fCAhKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCAzZGJlZjMwLi4wNDZhY2U5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC0yNiwzICsyNiw3IEBACiBvYmotJChDT05GSUdfUEhZUF9EVU1QKQkrPSBwaHlwX2R1bXAubwogb2JqLSQoQ09ORklHX0NNTSkJCSs9IGNtbS5vCiBvYmotJChDT05GSUdfRFRMKQkJKz0gZHRsLm8KKworaWZlcSAoJChDT05GSUdfUFBDX1BTRVJJRVMpLHkpCitvYmotJChDT05GSUdfU1VTUEVORCkJCSs9IHN1c3BlbmQubworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKaW5kZXggZDcxZTU4NS4uMjI3YzFjMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKQEAgLTQ2Myw2ICs0NjMsNyBAQAogCQkJCWJyZWFrOwogCiAJCQlpZiAoZ2V0X2NwdV9jdXJyZW50X3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX09OTElORSkgeworCQkJCXNldF9wcmVmZXJyZWRfb2ZmbGluZV9zdGF0ZShjcHUsIENQVV9TVEFURV9PRkZMSU5FKTsKIAkJCQljcHVfbWFwc191cGRhdGVfZG9uZSgpOwogCQkJCXJjID0gY3B1X2Rvd24oY3B1KTsKIAkJCQlpZiAocmMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKaW5kZXggMzBiOTg3Yi4uOGVkMGQyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMjg4LDggKzI4OCw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5waWFyX2xvY2spOwogCi0Jd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7Ci0KKwlmb3JfZWFjaF9wY2lfZGV2KGRldikgewogCQlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKGRldik7CiAKIAkJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ldmVudF9zb3VyY2VzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZXZlbnRfc291cmNlcy5jCmluZGV4IGU4ODljOWQuLjI2MDVjMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ldmVudF9zb3VyY2VzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2V2ZW50X3NvdXJjZXMuYwpAQCAtNDEsOSArNDEsMTIgQEAKIAkJCWlmIChjb3VudCA+IDE1KQogCQkJCWJyZWFrOwogCQkJdmlycXNbY291bnRdID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsICoob3BpY3Byb3ArKykpOwotCQkJaWYgKHZpcnFzW2NvdW50XSA9PSBOT19JUlEpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICIKLQkJCQkgICAgICAgIm51bWJlciBmb3IgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCQkJaWYgKHZpcnFzW2NvdW50XSA9PSBOT19JUlEpIHsKKwkJCQlwcl9lcnIoImV2ZW50LXNvdXJjZXM6IFVuYWJsZSB0byBhbGxvY2F0ZSAiCisJCQkJICAgICAgICJpbnRlcnJ1cHQgbnVtYmVyIGZvciAlc1xuIiwKKwkJCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CisJCQkJV0FSTl9PTigxKTsKKwkJCX0KIAkJCWVsc2UKIAkJCQljb3VudCsrOwogCkBAIC01OSw5ICs2MiwxMiBAQAogCQkJdmlycXNbY291bnRdID0gaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKG9pcnEuY29udHJvbGxlciwKIAkJCQkJCQkgICAgb2lycS5zcGVjaWZpZXIsCiAJCQkJCQkJICAgIG9pcnEuc2l6ZSk7Ci0JCQlpZiAodmlycXNbY291bnRdID09IE5PX0lSUSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQgIgotCQkJCSAgICAgICAibnVtYmVyIGZvciAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCQlpZiAodmlycXNbY291bnRdID09IE5PX0lSUSkgeworCQkJCXByX2VycigiZXZlbnQtc291cmNlczogVW5hYmxlIHRvIGFsbG9jYXRlICIKKwkJCQkgICAgICAgImludGVycnVwdCBudW1iZXIgZm9yICVzXG4iLAorCQkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJCQlXQVJOX09OKDEpOworCQkJfQogCQkJZWxzZQogCQkJCWNvdW50Kys7CiAJCX0KQEAgLTcwLDggKzc2LDkgQEAKIAkvKiBOb3cgcmVxdWVzdCB0aGVtICovCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaWYgKHJlcXVlc3RfaXJxKHZpcnFzW2ldLCBoYW5kbGVyLCAwLCBuYW1lLCBOVUxMKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgJWQgZm9yICIKLQkJCSAgICAgICAiJXNcbiIsIHZpcnFzW2ldLCBucC0+ZnVsbF9uYW1lKTsKKwkJCXByX2VycigiZXZlbnQtc291cmNlczogVW5hYmxlIHRvIHJlcXVlc3QgaW50ZXJydXB0ICIKKwkJCSAgICAgICAiJWQgZm9yICVzXG4iLCB2aXJxc1tpXSwgbnAtPmZ1bGxfbmFtZSk7CisJCQlXQVJOX09OKDEpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwppbmRleCA4Zjg1ZjM5Li5mZDUwY2NkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwpAQCAtMTE2LDYgKzExNiw5IEBACiAKIAlpZiAoZ2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX0lOQUNUSVZFKSB7CiAJCXNldF9jcHVfY3VycmVudF9zdGF0ZShjcHUsIENQVV9TVEFURV9JTkFDVElWRSk7CisJCWlmIChwcGNfbWQuc3VzcGVuZF9kaXNhYmxlX2NwdSkKKwkJCXBwY19tZC5zdXNwZW5kX2Rpc2FibGVfY3B1KCk7CisKIAkJY2VkZV9sYXRlbmN5X2hpbnQgPSAyOwogCiAJCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CkBAIC0xOTAsMTIgKzE5MywxMiBAQAogCiAJaWYgKGdldF9wcmVmZXJyZWRfb2ZmbGluZV9zdGF0ZShjcHUpID09IENQVV9TVEFURV9JTkFDVElWRSkgewogCQljcHVfc3RhdHVzID0gMTsKLQkJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMTAwMDsgdHJpZXMrKykgeworCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCA1MDAwOyB0cmllcysrKSB7CiAJCQlpZiAoZ2V0X2NwdV9jdXJyZW50X3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX0lOQUNUSVZFKSB7CiAJCQkJY3B1X3N0YXR1cyA9IDA7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQljcHVfcmVsYXgoKTsKKwkJCW1zbGVlcCgxKTsKIAkJfQogCX0gZWxzZSBpZiAoZ2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX09GRkxJTkUpIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Jhcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Jhcy5jCmluZGV4IDQxYTNlOWEuLmE0ZmM2ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yYXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmFzLmMKQEAgLTYxLDcgKzYxLDYgQEAKIAogI2RlZmluZSBFUE9XX1NFTlNPUl9UT0tFTgk5CiAjZGVmaW5lIEVQT1dfU0VOU09SX0lOREVYCTAKLSNkZWZpbmUgUkFTX1ZFQ1RPUl9PRkZTRVQJMHg1MDAKIAogc3RhdGljIGlycXJldHVybl90IHJhc19lcG93X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIGlycXJldHVybl90IHJhc19lcnJvcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKQEAgLTEyMSw3ICsxMjAsNyBAQAogCXNwaW5fbG9jaygmcmFzX2xvZ19idWZfbG9jayk7CiAKIAlzdGF0dXMgPSBydGFzX2NhbGwocmFzX2NoZWNrX2V4Y2VwdGlvbl90b2tlbiwgNiwgMSwgTlVMTCwKLQkJCSAgIFJBU19WRUNUT1JfT0ZGU0VULAorCQkJICAgUlRBU19WRUNUT1JfRVhURVJOQUxfSU5URVJSVVBULAogCQkJICAgaXJxX21hcFtpcnFdLmh3aXJxLAogCQkJICAgUlRBU19FUE9XX1dBUk5JTkcgfCBSVEFTX1BPV0VSTUdNX0VWRU5UUywKIAkJCSAgIGNyaXRpY2FsLCBfX3BhKCZyYXNfbG9nX2J1ZiksCkBAIC0xNTYsNyArMTU1LDcgQEAKIAlzcGluX2xvY2soJnJhc19sb2dfYnVmX2xvY2spOwogCiAJc3RhdHVzID0gcnRhc19jYWxsKHJhc19jaGVja19leGNlcHRpb25fdG9rZW4sIDYsIDEsIE5VTEwsCi0JCQkgICBSQVNfVkVDVE9SX09GRlNFVCwKKwkJCSAgIFJUQVNfVkVDVE9SX0VYVEVSTkFMX0lOVEVSUlVQVCwKIAkJCSAgIGlycV9tYXBbaXJxXS5od2lycSwKIAkJCSAgIFJUQVNfSU5URVJOQUxfRVJST1IsIDEgLypUaW1lIENyaXRpY2FsICovLAogCQkJICAgX19wYSgmcmFzX2xvZ19idWYpLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCAxYTU4NjM3Li41N2RkYmI0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMTE4LDEyICsxMTgsMTAgQEAKIAlpZiAoIW5wKQogCQlnb3RvIG91dF9lcnI7CiAKLQlucC0+ZnVsbF9uYW1lID0ga21hbGxvYyhzdHJsZW4ocGF0aCkgKyAxLCBHRlBfS0VSTkVMKTsKKwlucC0+ZnVsbF9uYW1lID0ga3N0cmR1cChwYXRoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5wLT5mdWxsX25hbWUpCiAJCWdvdG8gb3V0X2VycjsKIAotCXN0cmNweShucC0+ZnVsbF9uYW1lLCBwYXRoKTsKLQogCW5wLT5wcm9wZXJ0aWVzID0gcHJvcGxpc3Q7CiAJb2Zfbm9kZV9zZXRfZmxhZyhucCwgT0ZfRFlOQU1JQyk7CiAJa3JlZl9pbml0KCZucC0+a3JlZik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcyMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQnJpYW4gS2luZyBJQk0gQ29ycG9yYXRpb24KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICoKKyAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAqCisgICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9ydGFzLmg+CisKK3N0YXRpYyB1NjQgc3RyZWFtX2lkOworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHN1c3BlbmRfc3lzZGV2Oworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihzdXNwZW5kX3dvcmspOworc3RhdGljIHN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSBzdXNwZW5kX2RhdGE7CitzdGF0aWMgYXRvbWljX3Qgc3VzcGVuZGluZzsKKworLyoqCisgKiBwc2VyaWVzX3N1c3BlbmRfYmVnaW4gLSBGaXJzdCBwaGFzZSBvZiBoaWJlcm5hdGlvbgorICoKKyAqIENoZWNrIHRvIGVuc3VyZSB3ZSBhcmUgaW4gYSB2YWxpZCBzdGF0ZSB0byBoaWJlcm5hdGUKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBwc2VyaWVzX3N1c3BlbmRfYmVnaW4oc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCWxvbmcgdmFzaV9zdGF0ZSwgcmM7CisJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTExfQlVGU0laRV07CisKKwkvKiBNYWtlIHN1cmUgdGhlIHN0YXRlIGlzIHZhbGlkICovCisJcmMgPSBwbHBhcl9oY2FsbChIX1ZBU0lfU1RBVEUsIHJldGJ1Ziwgc3RyZWFtX2lkKTsKKworCXZhc2lfc3RhdGUgPSByZXRidWZbMF07CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJwc2VyaWVzX3N1c3BlbmRfYmVnaW46IHZhc2lfc3RhdGUgcmV0dXJuZWQgJWxkXG4iLHJjKTsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSBpZiAodmFzaV9zdGF0ZSA9PSBIX1ZBU0lfRU5BQkxFRCkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgaWYgKHZhc2lfc3RhdGUgIT0gSF9WQVNJX1NVU1BFTkRJTkcpIHsKKwkJcHJfZXJyKCJwc2VyaWVzX3N1c3BlbmRfYmVnaW46IHZhc2lfc3RhdGUgcmV0dXJuZWQgc3RhdGUgJWxkXG4iLAorCQkgICAgICAgdmFzaV9zdGF0ZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzZXJpZXNfc3VzcGVuZF9jcHUgLSBTdXNwZW5kIGEgc2luZ2xlIENQVQorICoKKyAqIE1ha2VzIHRoZSBIX0pPSU4gY2FsbCB0byBzdXNwZW5kIHRoZSBDUFUKKyAqCisgKiovCitzdGF0aWMgaW50IHBzZXJpZXNfc3VzcGVuZF9jcHUodm9pZCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJnN1c3BlbmRpbmcpKQorCQlyZXR1cm4gcnRhc19zdXNwZW5kX2NwdSgmc3VzcGVuZF9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwc2VyaWVzX3N1c3BlbmRfZW50ZXIgLSBGaW5hbCBwaGFzZSBvZiBoaWJlcm5hdGlvbgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IHBzZXJpZXNfc3VzcGVuZF9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJaW50IHJjID0gcnRhc19zdXNwZW5kX2xhc3RfY3B1KCZzdXNwZW5kX2RhdGEpOworCisJYXRvbWljX3NldCgmc3VzcGVuZGluZywgMCk7CisJYXRvbWljX3NldCgmc3VzcGVuZF9kYXRhLmRvbmUsIDEpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBwc2VyaWVzX3ByZXBhcmVfbGF0ZSAtIFByZXBhcmUgdG8gc3VzcGVuZCBhbGwgb3RoZXIgQ1BVcworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IHBzZXJpZXNfcHJlcGFyZV9sYXRlKHZvaWQpCit7CisJYXRvbWljX3NldCgmc3VzcGVuZGluZywgMSk7CisJYXRvbWljX3NldCgmc3VzcGVuZF9kYXRhLndvcmtpbmcsIDApOworCWF0b21pY19zZXQoJnN1c3BlbmRfZGF0YS5kb25lLCAwKTsKKwlhdG9taWNfc2V0KCZzdXNwZW5kX2RhdGEuZXJyb3IsIDApOworCXN1c3BlbmRfZGF0YS5jb21wbGV0ZSA9ICZzdXNwZW5kX3dvcms7CisJSU5JVF9DT01QTEVUSU9OKHN1c3BlbmRfd29yayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3RvcmVfaGliZXJuYXRlIC0gSW5pdGlhdGUgcGFydGl0aW9uIGhpYmVybmF0aW9uCisgKiBAY2xhc3NkZXY6CXN5c2RldiBjbGFzcyBzdHJ1Y3QKKyAqIEBhdHRyOgkJY2xhc3MgZGV2aWNlIGF0dHJpYnV0ZSBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqIEBjb3VudDoJCWJ1ZmZlciBzaXplCisgKgorICogV3JpdGUgdGhlIHN0cmVhbSBJRCByZWNlaXZlZCBmcm9tIHRoZSBITUMgdG8gdGhpcyBmaWxlCisgKiB0byB0cmlnZ2VyIGhpYmVybmF0aW5nIHRoZSBwYXJ0aXRpb24KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfaGliZXJuYXRlKHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsYXNzZGV2LAorCQkJICAgICAgIHN0cnVjdCBzeXNkZXZfY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByYzsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN0cmVhbV9pZCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCisJZG8geworCQlyYyA9IHBzZXJpZXNfc3VzcGVuZF9iZWdpbihQTV9TVVNQRU5EX01FTSk7CisJCWlmIChyYyA9PSAtRUFHQUlOKQorCQkJc3NsZWVwKDEpOworCX0gd2hpbGUgKHJjID09IC1FQUdBSU4pOworCisJaWYgKCFyYykKKwkJcmMgPSBwbV9zdXNwZW5kKFBNX1NVU1BFTkRfTUVNKTsKKworCXN0cmVhbV9pZCA9IDA7CisKKwlpZiAoIXJjKQorCQlyYyA9IGNvdW50OworCXJldHVybiByYzsKK30KKworc3RhdGljIFNZU0RFVl9DTEFTU19BVFRSKGhpYmVybmF0ZSwgU19JV1VTUiwgTlVMTCwgc3RvcmVfaGliZXJuYXRlKTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgc3VzcGVuZF9zeXNkZXZfY2xhc3MgPSB7CisJLm5hbWUgPSAicG93ZXIiLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBwc2VyaWVzX3N1c3BlbmRfb3BzID0geworCS52YWxpZAkJPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAorCS5iZWdpbgkJPSBwc2VyaWVzX3N1c3BlbmRfYmVnaW4sCisJLnByZXBhcmVfbGF0ZQk9IHBzZXJpZXNfcHJlcGFyZV9sYXRlLAorCS5lbnRlcgkJPSBwc2VyaWVzX3N1c3BlbmRfZW50ZXIsCit9OworCisvKioKKyAqIHBzZXJpZXNfc3VzcGVuZF9zeXNmc19yZWdpc3RlciAtIFJlZ2lzdGVyIHdpdGggc3lzZnMKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBwc2VyaWVzX3N1c3BlbmRfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlpbnQgcmM7CisKKwlpZiAoKHJjID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZzdXNwZW5kX3N5c2Rldl9jbGFzcykpKQorCQlyZXR1cm4gcmM7CisKKwlzeXNkZXYtPmlkID0gMDsKKwlzeXNkZXYtPmNscyA9ICZzdXNwZW5kX3N5c2Rldl9jbGFzczsKKworCWlmICgocmMgPSBzeXNkZXZfY2xhc3NfY3JlYXRlX2ZpbGUoJnN1c3BlbmRfc3lzZGV2X2NsYXNzLCAmYXR0cl9oaWJlcm5hdGUpKSkKKwkJZ290byBjbGFzc191bnJlZ2lzdGVyOworCisJcmV0dXJuIDA7CisKK2NsYXNzX3VucmVnaXN0ZXI6CisJc3lzZGV2X2NsYXNzX3VucmVnaXN0ZXIoJnN1c3BlbmRfc3lzZGV2X2NsYXNzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogcHNlcmllc19zdXNwZW5kX2luaXQgLSBpbml0Y2FsbCBmb3IgcFNlcmllcyBzdXNwZW5kCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgX19pbml0IHBzZXJpZXNfc3VzcGVuZF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKCFtYWNoaW5lX2lzKHBzZXJpZXMpIHx8ICFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCQlyZXR1cm4gMDsKKworCXN1c3BlbmRfZGF0YS50b2tlbiA9IHJ0YXNfdG9rZW4oImlibSxzdXNwZW5kLW1lIik7CisJaWYgKHN1c3BlbmRfZGF0YS50b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHJjID0gcHNlcmllc19zdXNwZW5kX3N5c2ZzX3JlZ2lzdGVyKCZzdXNwZW5kX3N5c2RldikpKQorCQlyZXR1cm4gcmM7CisKKwlwcGNfbWQuc3VzcGVuZF9kaXNhYmxlX2NwdSA9IHBzZXJpZXNfc3VzcGVuZF9jcHU7CisJc3VzcGVuZF9zZXRfb3BzKCZwc2VyaWVzX3N1c3BlbmRfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChwc2VyaWVzX3N1c3BlbmRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwppbmRleCBmMTlkMTk0Li41YjIyYjA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKQEAgLTU0OSw4ICs1NDksNiBAQAogewogCXVuc2lnbmVkIGxvbmcgKnRndCA9ICZwZXJfY3B1KHhpY3NfaXBpX21lc3NhZ2UsIGNwdSk7CiAKLQlXQVJOX09OKGNwdV9pc19vZmZsaW5lKGNwdSkpOwotCiAJbWIoKTsJLyogb3JkZXIgbW1pbyBjbGVhcmluZyBxaXJyICovCiAJd2hpbGUgKCp0Z3QpIHsKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQUENfTVNHX0NBTExfRlVOQ1RJT04sIHRndCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKaW5kZXggNDAyZDIyMS4uMjY1OWE2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyBpbnQgYXpmc19tYWpvciwgYXpmc19taW5vcjsKIAogc3RydWN0IGF4b25fcmFtX2JhbmsgewotCXN0cnVjdCBvZl9kZXZpY2UJKmRldmljZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpkZXZpY2U7CiAJc3RydWN0IGdlbmRpc2sJCSpkaXNrOwogCXVuc2lnbmVkIGludAkJaXJxX2lkOwogCXVuc2lnbmVkIGxvbmcJCXBoX2FkZHI7CkBAIC03Miw3ICs3Miw3IEBACiBzdGF0aWMgc3NpemVfdAogYXhvbl9yYW1fc3lzZnNfZWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXZpY2UgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgYXhvbl9yYW1fYmFuayAqYmFuayA9IGRldmljZS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKIAlCVUdfT04oIWJhbmspOwpAQCAtOTAsNyArOTAsNyBAQAogc3RhdGljIGlycXJldHVybl90CiBheG9uX3JhbV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqZGV2aWNlID0gZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSA9IGRldjsKIAlzdHJ1Y3QgYXhvbl9yYW1fYmFuayAqYmFuayA9IGRldmljZS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKIAlCVUdfT04oIWJhbmspOwpAQCAtMTc0LDggKzE3NCw4IEBACiAgKiBheG9uX3JhbV9wcm9iZSAtIHByb2JlKCkgbWV0aG9kIGZvciBwbGF0Zm9ybSBkcml2ZXIKICAqIEBkZXZpY2UsIEBkZXZpY2VfaWQ6IHNlZSBvZl9wbGF0Zm9ybV9kcml2ZXIgbWV0aG9kCiAgKi8KLXN0YXRpYyBpbnQKLWF4b25fcmFtX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldmljZSwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqZGV2aWNlX2lkKQorc3RhdGljIGludCBheG9uX3JhbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UsCisJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmRldmljZV9pZCkKIHsKIAlzdGF0aWMgaW50IGF4b25fcmFtX2JhbmtfaWQgPSAtMTsKIAlzdHJ1Y3QgYXhvbl9yYW1fYmFuayAqYmFuazsKQEAgLTMwNCw3ICszMDQsNyBAQAogICogQGRldmljZTogc2VlIG9mX3BsYXRmb3JtX2RyaXZlciBtZXRob2QKICAqLwogc3RhdGljIGludAotYXhvbl9yYW1fcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldmljZSkKK2F4b25fcmFtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGF4b25fcmFtX2JhbmsgKmJhbmsgPSBkZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL2Jlc3Rjb21tLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL2Jlc3Rjb21tLmMKaW5kZXggYTdjNWM0Ny4uNjUwMjU2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9iZXN0Y29tbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vYmVzdGNvbW0uYwpAQCAtMzY1LDggKzM2NSw4IEBACiAvKiBPRiBwbGF0Zm9ybSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotbXBjNTJ4eF9iY29tX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1wYzUyeHhfYmNvbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKKwkJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZm5fc3JhbTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzX2Jjb207CkBAIC00NjEsOCArNDYxLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50Ci1tcGM1Mnh4X2Jjb21fcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQorc3RhdGljIGludCBtcGM1Mnh4X2Jjb21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQogewogCS8qIENsZWFuIHVwIHRoZSBlbmdpbmUgKi8KIAliY29tX2VuZ2luZV9jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL3NyYW0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vc3JhbS5jCmluZGV4IDVkNzRlZjcuLjEyMjUwMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vc3JhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vc3JhbS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwppbmRleCA4ZDEwM2NhLi4wMDg1MjEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwpAQCAtNjIxLDcgKzYyMSw2IEBACiB7CiAJc3RydWN0IGNwbTFfZ3BpbzE2X2NoaXAgKmNwbTFfZ2M7CiAJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7Ci0Jc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2M7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAKIAljcG0xX2djID0ga3phbGxvYyhzaXplb2YoKmNwbTFfZ2MpLCBHRlBfS0VSTkVMKTsKQEAgLTYzMSwxMSArNjMwLDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmY3BtMV9nYy0+bG9jayk7CiAKIAltbV9nYyA9ICZjcG0xX2djLT5tbV9nYzsKLQlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7Ci0JZ2MgPSAmb2ZfZ2MtPmdjOworCWdjID0gJm1tX2djLT5nYzsKIAogCW1tX2djLT5zYXZlX3JlZ3MgPSBjcG0xX2dwaW8xNl9zYXZlX3JlZ3M7Ci0Jb2ZfZ2MtPmdwaW9fY2VsbHMgPSAyOwogCWdjLT5uZ3BpbyA9IDE2OwogCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBjcG0xX2dwaW8xNl9kaXJfaW47CiAJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBjcG0xX2dwaW8xNl9kaXJfb3V0OwpAQCAtNzQ1LDcgKzc0Miw2IEBACiB7CiAJc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2M7CiAJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7Ci0Jc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2M7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAKIAljcG0xX2djID0ga3phbGxvYyhzaXplb2YoKmNwbTFfZ2MpLCBHRlBfS0VSTkVMKTsKQEAgLTc1NSwxMSArNzUxLDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmY3BtMV9nYy0+bG9jayk7CiAKIAltbV9nYyA9ICZjcG0xX2djLT5tbV9nYzsKLQlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7Ci0JZ2MgPSAmb2ZfZ2MtPmdjOworCWdjID0gJm1tX2djLT5nYzsKIAogCW1tX2djLT5zYXZlX3JlZ3MgPSBjcG0xX2dwaW8zMl9zYXZlX3JlZ3M7Ci0Jb2ZfZ2MtPmdwaW9fY2VsbHMgPSAyOwogCWdjLT5uZ3BpbyA9IDMyOwogCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBjcG0xX2dwaW8zMl9kaXJfaW47CiAJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBjcG0xX2dwaW8zMl9kaXJfb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYwppbmRleCA4OGI5ODEyLi4yYjY5YWEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYwpAQCAtMzI1LDcgKzMyNSw2IEBACiB7CiAJc3RydWN0IGNwbTJfZ3BpbzMyX2NoaXAgKmNwbTJfZ2M7CiAJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7Ci0Jc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2M7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAKIAljcG0yX2djID0ga3phbGxvYyhzaXplb2YoKmNwbTJfZ2MpLCBHRlBfS0VSTkVMKTsKQEAgLTMzNSwxMSArMzM0LDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmY3BtMl9nYy0+bG9jayk7CiAKIAltbV9nYyA9ICZjcG0yX2djLT5tbV9nYzsKLQlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7Ci0JZ2MgPSAmb2ZfZ2MtPmdjOworCWdjID0gJm1tX2djLT5nYzsKIAogCW1tX2djLT5zYXZlX3JlZ3MgPSBjcG0yX2dwaW8zMl9zYXZlX3JlZ3M7Ci0Jb2ZfZ2MtPmdwaW9fY2VsbHMgPSAyOwogCWdjLT5uZ3BpbyA9IDMyOwogCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBjcG0yX2dwaW8zMl9kaXJfaW47CiAJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBjcG0yX2dwaW8zMl9kaXJfb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfZ3RtLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYwppbmRleCBlY2E0NTQ1Li43ZGQyODg1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwppbmRleCA5NjJjMmQ4Li44Nzk5MWQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJcmF3X3NwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKIH0KIAotc3RhdGljIGludCBmc2xfb2ZfbXNpX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3N0YXRpYyBpbnQgZnNsX29mX21zaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCiB7CiAJc3RydWN0IGZzbF9tc2kgKm1zaSA9IG9mZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpbnQgdmlycSwgaTsKQEAgLTI3NCw3ICsyNzQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfb2ZfbXNpX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZzbF9vZl9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAogCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBmc2xfbXNpICptc2k7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCmluZGV4IDM1NmM2YTAuLjIwOTM4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCkBAIC00MTIsNiArNDEyLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfRlNMX1NPQ19CT09LRSB8fCBDT05GSUdfUFBDXzg2eHggKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ184M3h4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfTVBDNTEyeCkKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODMwOCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODMxNEUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzgzMTQsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzgzMTVFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcG1jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYwppbmRleCA5MDgyZWI5Li40NGRlODU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYwpAQCAtNTgsNyArNTgsOCBAQAogCS5lbnRlciA9IHBtY19zdXNwZW5kX2VudGVyLAogfTsKIAotc3RhdGljIGludCBwbWNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBwbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCisJCSAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQpCiB7CiAJcG1jX3JlZ3MgPSBvZl9pb21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwogCWlmICghcG1jX3JlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCmluZGV4IDMwZTE2MjYuLjhiZDg2NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCkBAIC0xMzM4LDcgKzEzMzgsNyBAQAogICogbWFzdGVyIHBvcnQgd2l0aCBzeXN0ZW0tc3BlY2lmaWMgaW5mbywgYW5kIHJlZ2lzdGVycyB0aGUKICAqIG1hc3RlciBwb3J0IHdpdGggdGhlIFJhcGlkSU8gc3Vic3lzdGVtLgogICovCi1pbnQgZnNsX3Jpb19zZXR1cChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitpbnQgZnNsX3Jpb19zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJpb19vcHMgKm9wczsKIAlzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0OwpAQCAtMTUzNiw3ICsxNTM2LDcgQEAKIAogLyogVGhlIHByb2JlIGZ1bmN0aW9uIGZvciBSYXBpZElPIHBlZXItdG8tcGVlciBuZXR3b3JrLgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfb2ZfcmlvX3Jwbl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfb2ZfcmlvX3Jwbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCmluZGV4IDQyMzgxYmIuLjUzNjA5NDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCkBAIC0zMCw2ICszMCw3IEBACiAJdm9pZCAoKnNldF9waXhlbF9jbG9jaykgKHVuc2lnbmVkIGludCBwaXhjbG9jayk7CiAJc3NpemVfdCAoKnNob3dfbW9uaXRvcl9wb3J0KSAoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqYnVmKTsKIAlpbnQgKCpzZXRfc3lzZnNfbW9uaXRvcl9wb3J0KSAoaW50IHZhbCk7CisJdm9pZCAoKnJlbGVhc2VfYm9vdG1lbSkgKHZvaWQpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kaXVfZGF0YV9vcHMgZGl1X29wczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4eF9ncGlvLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eHhfZ3Bpby5jCmluZGV4IDgzZjUxOTYuLjJiNjkwODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4eF9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYwpAQCAtMjU3LDcgKzI1Nyw2IEBACiB7CiAJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djOwogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwotCXN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mX2djOwogCXN0cnVjdCBncGlvX2NoaXAgKmdjOwogCXVuc2lnbmVkIGh3aXJxOwogCWludCByZXQ7CkBAIC0yNzEsMTEgKzI3MCw5IEBACiAJc3Bpbl9sb2NrX2luaXQoJm1wYzh4eHhfZ2MtPmxvY2spOwogCiAJbW1fZ2MgPSAmbXBjOHh4eF9nYy0+bW1fZ2M7Ci0Jb2ZfZ2MgPSAmbW1fZ2MtPm9mX2djOwotCWdjID0gJm9mX2djLT5nYzsKKwlnYyA9ICZtbV9nYy0+Z2M7CiAKIAltbV9nYy0+c2F2ZV9yZWdzID0gbXBjOHh4eF9ncGlvX3NhdmVfcmVnczsKLQlvZl9nYy0+Z3Bpb19jZWxscyA9IDI7CiAJZ2MtPm5ncGlvID0gTVBDOFhYWF9HUElPX1BJTlM7CiAJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IG1wYzh4eHhfZ3Bpb19kaXJfaW47CiAJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM4eHh4X2dwaW9fZGlyX291dDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggMjBiNzNjMC4uN2MxMzQyNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTE2MzYsNiArMTYzNiwyNCBAQAogewogCW1waWNfc2V0dXBfdGhpc19jcHUoKTsKIH0KKwordm9pZCBtcGljX3Jlc2V0X2NvcmUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfcHJpbWFyeTsKKwl1MzIgcGlyOworCWludCBjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCS8qIFNldCB0YXJnZXQgYml0IGZvciBjb3JlIHJlc2V0ICovCisJcGlyID0gbXBpY19yZWFkKG1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19QUk9DRVNTT1JfSU5JVCkpOworCXBpciB8PSAoMSA8PCBjcHVpZCk7CisJbXBpY193cml0ZShtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfUFJPQ0VTU09SX0lOSVQpLCBwaXIpOworCW1waWNfcmVhZChtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfUFJPQ0VTU09SX0lOSVQpKTsKKworCS8qIFJlc3RvcmUgdGFyZ2V0IGJpdCBhZnRlciByZXNldCBjb21wbGV0ZSAqLworCXBpciAmPSB+KDEgPDwgY3B1aWQpOworCW1waWNfd3JpdGUobXBpYy0+Z3JlZ3MsIE1QSUNfSU5GTyhHUkVHX1BST0NFU1NPUl9JTklUKSwgcGlyKTsKKwltcGljX3JlYWQobXBpYy0+Z3JlZ3MsIE1QSUNfSU5GTyhHUkVHX1BST0NFU1NPUl9JTklUKSk7Cit9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oCmluZGV4IGVmZjQzM2MuLmU0YTZkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oCkBAIC0zNyw1ICszNyw2IEBACiBleHRlcm4gaW50IG1waWNfc2V0X2lycV90eXBlKHVuc2lnbmVkIGludCB2aXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKTsKIGV4dGVybiB2b2lkIG1waWNfc2V0X3ZlY3Rvcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHZlY3Rvcik7CiBleHRlcm4gaW50IG1waWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKTsKK2V4dGVybiB2b2lkIG1waWNfcmVzZXRfY29yZShpbnQgY3B1KTsKIAogI2VuZGlmIC8qIF9QT1dFUlBDX1NZU0RFVl9NUElDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYwppbmRleCAzMWFjZDNiLi4xMzk4YmM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCkBAIC0yMCwxMiArMjAsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAotLyoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBuZWNlc3Nhcnkgc2V0dXAgZm9yIHRoZSBtdjY0eDYwIGRyaXZlcnMuCi0gKiBUaGVzZSBkcml2ZXJzIGFyZSB1bnVzdWFsIGluIHRoYXQgdGhleSB3b3JrIG9uIGJvdGggdGhlIE1JUFMgYW5kIFBvd2VyUEMKLSAqIGFyY2hpdGVjdHVyZXMuICBCZWNhdXNlIG9mIHRoYXQsIHRoZSBkcml2ZXJzIGRvIG5vdCBzdXBwb3J0IHRoZSBub3JtYWwKLSAqIFBvd2VyUEMgb2ZfcGxhdGZvcm1fYnVzX3R5cGUuICBUaGV5IHN1cHBvcnQgcGxhdGZvcm1fYnVzX3R5cGUgaW5zdGVhZC4KLSAqLworLyogVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBzZXR1cCBmb3IgdGhlIG12NjR4NjAgZHJpdmVycy4gKi8KIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9tdjY0eDYwX2RldmljZXNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NDMwNi1kZXZjdHJsIiwgfSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYwppbmRleCAxOThmMjg4Li43N2JiM2Y0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCkBAIC03Myw3ICs3Myw2IEBACiAJLmF0dHIgPSB7CiAJCS5uYW1lID0gImhzX3JlZyIsCiAJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnNpemUgID0gTVY2NFg2MF9WQUxfTEVOX01BWCwKIAkucmVhZCAgPSBtdjY0eDYwX2hzX3JlZ19yZWFkLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcG1pLmMKaW5kZXggZDA3MTM3YS4uMjRhMGJiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jCkBAIC00Myw3ICs0Myw3IEBACiAJc3RydWN0IG11dGV4CQltc2dfbXV0ZXg7CiAJcG1pX21lc3NhZ2VfdAkJbXNnOwogCXN0cnVjdCBjb21wbGV0aW9uCSpjb21wbGV0aW9uOwotCXN0cnVjdCBvZl9kZXZpY2UJKmRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpkZXY7CiAJaW50CQkJaXJxOwogCXU4IF9faW9tZW0JCSpwbWlfcmVnOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJc3Bpbl91bmxvY2soJmRhdGEtPmhhbmRsZXJfc3BpbmxvY2spOwogfQogCi1zdGF0aWMgaW50IHBtaV9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBtaV9vZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5kZXYub2Zfbm9kZTsKQEAgLTE4NSw3ICsxODUsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBwbWlfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcG1pX29mX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBtaV9oYW5kbGVyICpoYW5kbGVyLCAqdG1wOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9ncGlvLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9ncGlvLmMKaW5kZXggMzgxMmZjMy4uZmM2NWFkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfZ3Bpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2dwaW8uYwpAQCAtMTgxLDcgKzE4MSw2IEBACiAJCWludCByZXQ7CiAJCXN0cnVjdCBwcGM0eHhfZ3Bpb19jaGlwICpwcGM0eHhfZ2M7CiAJCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwotCQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYzsKIAkJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAKIAkJcHBjNHh4X2djID0ga3phbGxvYyhzaXplb2YoKnBwYzR4eF9nYyksIEdGUF9LRVJORUwpOwpAQCAtMTkzLDEwICsxOTIsOCBAQAogCQlzcGluX2xvY2tfaW5pdCgmcHBjNHh4X2djLT5sb2NrKTsKIAogCQltbV9nYyA9ICZwcGM0eHhfZ2MtPm1tX2djOwotCQlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7Ci0JCWdjID0gJm9mX2djLT5nYzsKKwkJZ2MgPSAmbW1fZ2MtPmdjOwogCi0JCW9mX2djLT5ncGlvX2NlbGxzID0gMjsKIAkJZ2MtPm5ncGlvID0gMzI7CiAJCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBwcGM0eHhfZ3Bpb19kaXJfaW47CiAJCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gcHBjNHh4X2dwaW9fZGlyX291dDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYwppbmRleCBkYzhmOGQ2Li4zNmJmODQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jCkBAIC0xMzgsOCArMTM4LDggQEAKIHN0cnVjdCBxZV9waW4gKnFlX3Bpbl9yZXF1ZXN0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgcWVfcGluICpxZV9waW47Ci0Jc3RydWN0IGRldmljZV9ub2RlICpnYzsKLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpncGlvX25wOworCXN0cnVjdCBncGlvX2NoaXAgKmdjOwogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwogCXN0cnVjdCBxZV9ncGlvX2NoaXAgKnFlX2djOwogCWludCBlcnI7CkBAIC0xNTUsNDAgKzE1NSw0MCBAQAogCX0KIAogCWVyciA9IG9mX3BhcnNlX3BoYW5kbGVzX3dpdGhfYXJncyhucCwgImdwaW9zIiwgIiNncGlvLWNlbGxzIiwgaW5kZXgsCi0JCQkJCSAgJmdjLCAmZ3Bpb19zcGVjKTsKKwkJCQkJICAmZ3Bpb19ucCwgJmdwaW9fc3BlYyk7CiAJaWYgKGVycikgewogCQlwcl9kZWJ1ZygiJXM6IGNhbid0IHBhcnNlIGdwaW9zIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyMDsKIAl9CiAKLQlpZiAoIW9mX2RldmljZV9pc19jb21wYXRpYmxlKGdjLCAiZnNsLG1wYzgzMjMtcWUtcGFyaW8tYmFuayIpKSB7CisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShncGlvX25wLCAiZnNsLG1wYzgzMjMtcWUtcGFyaW8tYmFuayIpKSB7CiAJCXByX2RlYnVnKCIlczogdHJpZWQgdG8gZ2V0IGEgbm9uLXFlIHBpblxuIiwgX19mdW5jX18pOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGVycjE7CiAJfQogCi0Jb2ZfZ2MgPSBnYy0+ZGF0YTsKLQlpZiAoIW9mX2djKSB7CisJZ2MgPSBvZl9ub2RlX3RvX2dwaW9jaGlwKGdwaW9fbnApOworCWlmICghZ2MpIHsKIAkJcHJfZGVidWcoIiVzOiBncGlvIGNvbnRyb2xsZXIgJXMgaXNuJ3QgcmVnaXN0ZXJlZFxuIiwKLQkJCSBucC0+ZnVsbF9uYW1lLCBnYy0+ZnVsbF9uYW1lKTsKKwkJCSBucC0+ZnVsbF9uYW1lLCBncGlvX25wLT5mdWxsX25hbWUpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycjE7CiAJfQogCi0JZ3Bpb19jZWxscyA9IG9mX2dldF9wcm9wZXJ0eShnYywgIiNncGlvLWNlbGxzIiwgJnNpemUpOworCWdwaW9fY2VsbHMgPSBvZl9nZXRfcHJvcGVydHkoZ3Bpb19ucCwgIiNncGlvLWNlbGxzIiwgJnNpemUpOwogCWlmICghZ3Bpb19jZWxscyB8fCBzaXplICE9IHNpemVvZigqZ3Bpb19jZWxscykgfHwKLQkJCSpncGlvX2NlbGxzICE9IG9mX2djLT5ncGlvX2NlbGxzKSB7CisJCQkqZ3Bpb19jZWxscyAhPSBnYy0+b2ZfZ3Bpb19uX2NlbGxzKSB7CiAJCXByX2RlYnVnKCIlczogd3JvbmcgI2dwaW8tY2VsbHMgZm9yICVzXG4iLAotCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQkJIG5wLT5mdWxsX25hbWUsIGdwaW9fbnAtPmZ1bGxfbmFtZSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyMTsKIAl9CiAKLQllcnIgPSBvZl9nYy0+eGxhdGUob2ZfZ2MsIG5wLCBncGlvX3NwZWMsIE5VTEwpOworCWVyciA9IGdjLT5vZl94bGF0ZShnYywgbnAsIGdwaW9fc3BlYywgTlVMTCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyMTsKIAotCW1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKCZvZl9nYy0+Z2MpOworCW1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKIAlxZV9nYyA9IHRvX3FlX2dwaW9fY2hpcChtbV9nYyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCWlmICghZXJyKQogCQlyZXR1cm4gcWVfcGluOwogZXJyMToKLQlvZl9ub2RlX3B1dChnYyk7CisJb2Zfbm9kZV9wdXQoZ3Bpb19ucCk7CiBlcnIwOgogCWtmcmVlKHFlX3Bpbik7CiAJcHJfZGVidWcoIiVzIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIGVycik7CkBAIC0zMDcsNyArMzA3LDYgQEAKIAkJaW50IHJldDsKIAkJc3RydWN0IHFlX2dwaW9fY2hpcCAqcWVfZ2M7CiAJCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwotCQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYzsKIAkJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAKIAkJcWVfZ2MgPSBremFsbG9jKHNpemVvZigqcWVfZ2MpLCBHRlBfS0VSTkVMKTsKQEAgLTMxOSwxMSArMzE4LDkgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJnFlX2djLT5sb2NrKTsKIAogCQltbV9nYyA9ICZxZV9nYy0+bW1fZ2M7Ci0JCW9mX2djID0gJm1tX2djLT5vZl9nYzsKLQkJZ2MgPSAmb2ZfZ2MtPmdjOworCQlnYyA9ICZtbV9nYy0+Z2M7CiAKIAkJbW1fZ2MtPnNhdmVfcmVncyA9IHFlX2dwaW9fc2F2ZV9yZWdzOwotCQlvZl9nYy0+Z3Bpb19jZWxscyA9IDI7CiAJCWdjLT5uZ3BpbyA9IFFFX1BJT19QSU5TOwogCQlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gcWVfZ3Bpb19kaXJfaW47CiAJCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gcWVfZ3Bpb19kaXJfb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKaW5kZXggMDkzZTBhZS4uM2RhODAxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCkBAIC02NTEsMTQgKzY1MSwxNSBAQAogRVhQT1JUX1NZTUJPTChxZV9nZXRfbnVtX29mX3NudW1zKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NVU1BFTkQpICYmIGRlZmluZWQoQ09ORklHX1BQQ184NXh4KQotc3RhdGljIGludCBxZV9yZXN1bWUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCitzdGF0aWMgaW50IHFlX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKIHsKIAlpZiAoIXFlX2FsaXZlX2R1cmluZ19zbGVlcCgpKQogCQlxZV9yZXNldCgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFlX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgcWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCisJCSAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYwppbmRleCBkNWZiMTczLi5iNmRlZmRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jCkBAIC05MSw3ICs5MSw2IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgdThfZ3Bpb19jaGlwICp1OF9nYzsKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYzsKLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYzsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKIAogCXU4X2djID0ga3phbGxvYyhzaXplb2YoKnU4X2djKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMDEsMTEgKzEwMCw5IEBACiAJc3Bpbl9sb2NrX2luaXQoJnU4X2djLT5sb2NrKTsKIAogCW1tX2djID0gJnU4X2djLT5tbV9nYzsKLQlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7Ci0JZ2MgPSAmb2ZfZ2MtPmdjOworCWdjID0gJm1tX2djLT5nYzsKIAogCW1tX2djLT5zYXZlX3JlZ3MgPSB1OF9ncGlvX3NhdmVfcmVnczsKLQlvZl9nYy0+Z3Bpb19jZWxscyA9IDI7CiAJZ2MtPm5ncGlvID0gODsKIAlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gdThfZ3Bpb19kaXJfaW47CiAJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSB1OF9ncGlvX2Rpcl9vdXQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggOGJhZDdkNS4uMDU1NDQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMTU1LDYgKzE1NSw5IEBACiAjaWZkZWYgQ09ORklHXzQ0eAogc3RhdGljIHZvaWQgZHVtcF90bGJfNDR4KHZvaWQpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKK3N0YXRpYyB2b2lkIGR1bXBfdGxiX2Jvb2szZSh2b2lkKTsKKyNlbmRpZgogCiBzdGF0aWMgaW50IHhtb25fbm9fYXV0b19iYWNrdHJhY2U7CiAKQEAgLTg4OCw2ICs4OTEsMTEgQEAKIAkJCWR1bXBfdGxiXzQ0eCgpOwogCQkJYnJlYWs7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQorCQljYXNlICd1JzoKKwkJCWR1bXBfdGxiX2Jvb2szZSgpOworCQkJYnJlYWs7CisjZW5kaWYKIAkJZGVmYXVsdDoKIAkJCXByaW50ZigiVW5yZWNvZ25pemVkIGNvbW1hbmQ6ICIpOwogCQkgICAgICAgIGRvIHsKQEAgLTI3MDEsNiArMjcwOSwxNTAgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfNDR4ICovCiAKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQorc3RhdGljIHZvaWQgZHVtcF90bGJfYm9vazNlKHZvaWQpCit7CisJdTMyIG1tdWNmZywgcGlkbWFzaywgbHBpZG1hc2s7CisJdTY0IHJhbWFzazsKKwlpbnQgaSwgdGxiLCBudGxicywgcGlkc3osIGxwaWRzeiwgcmFzeiwgbHJhdCA9IDA7CisJaW50IG1tdV92ZXJzaW9uOworCXN0YXRpYyBjb25zdCBjaGFyICpwZ3N6X25hbWVzW10gPSB7CisJCSIgIDFLIiwKKwkJIiAgMksiLAorCQkiICA0SyIsCisJCSIgIDhLIiwKKwkJIiAxNksiLAorCQkiIDMySyIsCisJCSIgNjRLIiwKKwkJIjEyOEsiLAorCQkiMjU2SyIsCisJCSI1MTJLIiwKKwkJIiAgMU0iLAorCQkiICAyTSIsCisJCSIgIDRNIiwKKwkJIiAgOE0iLAorCQkiIDE2TSIsCisJCSIgMzJNIiwKKwkJIiA2NE0iLAorCQkiMTI4TSIsCisJCSIyNTZNIiwKKwkJIjUxMk0iLAorCQkiICAxRyIsCisJCSIgIDJHIiwKKwkJIiAgNEciLAorCQkiICA4RyIsCisJCSIgMTZHIiwKKwkJIiAzMkciLAorCQkiIDY0RyIsCisJCSIxMjhHIiwKKwkJIjI1NkciLAorCQkiNTEyRyIsCisJCSIgIDFUIiwKKwkJIiAgMlQiLAorCX07CisKKwkvKiBHYXRoZXIgc29tZSBpbmZvcyBhYm91dCB0aGUgTU1VICovCisJbW11Y2ZnID0gbWZzcHIoU1BSTl9NTVVDRkcpOworCW1tdV92ZXJzaW9uID0gKG1tdWNmZyAmIDMpICsgMTsKKwludGxicyA9ICgobW11Y2ZnID4+IDIpICYgMykgKyAxOworCXBpZHN6ID0gKChtbXVjZmcgPj4gNikgJiAweDFmKSArIDE7CisJbHBpZHN6ID0gKG1tdWNmZyA+PiAyNCkgJiAweGY7CisJcmFzeiA9IChtbXVjZmcgPj4gMTYpICYgMHg3ZjsKKwlpZiAoKG1tdV92ZXJzaW9uID4gMSkgJiYgKG1tdWNmZyAmIDB4MTAwMDApKQorCQlscmF0ID0gMTsKKwlwcmludGYoIkJvb2szRSBNTVUgTUFWPSVkLjAsJWQgVExCcywlZC1iaXQgUElELCVkLWJpdCBMUElELCVkLWJpdCBSQVxuIiwKKwkgICAgICAgbW11X3ZlcnNpb24sIG50bGJzLCBwaWRzeiwgbHBpZHN6LCByYXN6KTsKKwlwaWRtYXNrID0gKDF1bCA8PCBwaWRzeikgLSAxOworCWxwaWRtYXNrID0gKDF1bCA8PCBscGlkc3opIC0gMTsKKwlyYW1hc2sgPSAoMXVsbCA8PCByYXN6KSAtIDE7CisKKwlmb3IgKHRsYiA9IDA7IHRsYiA8IG50bGJzOyB0bGIrKykgeworCQl1MzIgdGxiY2ZnOworCQlpbnQgbmVudCwgYXNzb2MsIG5ld19jYyA9IDE7CisJCXByaW50ZigiVExCICVkOlxuLS0tLS0tXG4iLCB0bGIpOworCQlzd2l0Y2godGxiKSB7CisJCWNhc2UgMDoKKwkJCXRsYmNmZyA9IG1mc3ByKFNQUk5fVExCMENGRyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdGxiY2ZnID0gbWZzcHIoU1BSTl9UTEIxQ0ZHKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl0bGJjZmcgPSBtZnNwcihTUFJOX1RMQjJDRkcpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXRsYmNmZyA9IG1mc3ByKFNQUk5fVExCM0NGRyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiVW5zdXBwb3J0ZWQgVExCIG51bWJlciAhXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5lbnQgPSB0bGJjZmcgJiAweGZmZjsKKwkJYXNzb2MgPSAodGxiY2ZnID4+IDI0KSAmIDB4ZmY7CisJCWZvciAoaSA9IDA7IGkgPCBuZW50OyBpKyspIHsKKwkJCXUzMiBtYXMwID0gTUFTMF9UTEJTRUwodGxiKTsKKwkJCXUzMiBtYXMxID0gTUFTMV9UU0laRShCT09LM0VfUEFHRVNaXzRLKTsKKwkJCXU2NCBtYXMyID0gMDsKKwkJCXU2NCBtYXM3X21hczM7CisJCQlpbnQgZXNlbCA9IGksIGNjID0gaTsKKworCQkJaWYgKGFzc29jICE9IDApIHsKKwkJCQljYyA9IGkgLyBhc3NvYzsKKwkJCQllc2VsID0gaSAlIGFzc29jOworCQkJCW1hczIgPSBjYyAqIDB4MTAwMDsKKwkJCX0KKworCQkJbWFzMCB8PSBNQVMwX0VTRUwoZXNlbCk7CisJCQltdHNwcihTUFJOX01BUzAsIG1hczApOworCQkJbXRzcHIoU1BSTl9NQVMxLCBtYXMxKTsKKwkJCW10c3ByKFNQUk5fTUFTMiwgbWFzMik7CisJCQlhc20gdm9sYXRpbGUoInRsYnJlICAwLDAsMCIgOiA6IDogIm1lbW9yeSIpOworCQkJbWFzMSA9IG1mc3ByKFNQUk5fTUFTMSk7CisJCQltYXMyID0gbWZzcHIoU1BSTl9NQVMyKTsKKwkJCW1hczdfbWFzMyA9IG1mc3ByKFNQUk5fTUFTN19NQVMzKTsKKwkJCWlmIChhc3NvYyAmJiAoaSAlIGFzc29jKSA9PSAwKQorCQkJCW5ld19jYyA9IDE7CisJCQlpZiAoIShtYXMxICYgTUFTMV9WQUxJRCkpCisJCQkJY29udGludWU7CisJCQlpZiAoYXNzb2MgPT0gMCkKKwkJCQlwcmludGYoIiUwNHgtICIsIGkpOworCQkJZWxzZSBpZiAobmV3X2NjKQorCQkJCXByaW50ZigiJTA0eC0lYyIsIGNjLCAnQScgKyBlc2VsKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiAgICB8JWMiLCAnQScgKyBlc2VsKTsKKwkJCW5ld19jYyA9IDA7CisJCQlwcmludGYoIiAlMDE2bGx4ICUwNHggJXMgJWMlYyBBUyVjIiwKKwkJCSAgICAgICBtYXMyICYgfjB4M2ZmdWxsLAorCQkJICAgICAgIChtYXMxID4+IDE2KSAmIDB4M2ZmZiwKKwkJCSAgICAgICBwZ3N6X25hbWVzWyhtYXMxID4+IDcpICYgMHgxZl0sCisJCQkgICAgICAgbWFzMSAmIE1BUzFfSU5EID8gJ0knIDogJyAnLAorCQkJICAgICAgIG1hczEgJiBNQVMxX0lQUk9UID8gJ1AnIDogJyAnLAorCQkJICAgICAgIG1hczEgJiBNQVMxX1RTID8gJzEnIDogJzAnKTsKKwkJCXByaW50ZigiICVjJWMlYyVjJWMlYyVjIiwKKwkJCSAgICAgICBtYXMyICYgTUFTMl9YMCA/ICdhJyA6ICcgJywKKwkJCSAgICAgICBtYXMyICYgTUFTMl9YMSA/ICd2JyA6ICcgJywKKwkJCSAgICAgICBtYXMyICYgTUFTMl9XICA/ICd3JyA6ICcgJywKKwkJCSAgICAgICBtYXMyICYgTUFTMl9JICA/ICdpJyA6ICcgJywKKwkJCSAgICAgICBtYXMyICYgTUFTMl9NICA/ICdtJyA6ICcgJywKKwkJCSAgICAgICBtYXMyICYgTUFTMl9HICA/ICdnJyA6ICcgJywKKwkJCSAgICAgICBtYXMyICYgTUFTMl9FICA/ICdlJyA6ICcgJyk7CisJCQlwcmludGYoIiAlMDE2bGx4IiwgbWFzN19tYXMzICYgcmFtYXNrICYgfjB4N2ZmdWxsKTsKKwkJCWlmIChtYXMxICYgTUFTMV9JTkQpCisJCQkJcHJpbnRmKCIgJXNcbiIsCisJCQkJICAgICAgIHBnc3pfbmFtZXNbKG1hczdfbWFzMyA+PiAxKSAmIDB4MWZdKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiBVJWMlYyVjIFMlYyVjJWNcbiIsCisJCQkJICAgICAgIG1hczdfbWFzMyAmIE1BUzNfVVggPyAneCcgOiAnICcsCisJCQkJICAgICAgIG1hczdfbWFzMyAmIE1BUzNfVVcgPyAndycgOiAnICcsCisJCQkJICAgICAgIG1hczdfbWFzMyAmIE1BUzNfVVIgPyAncicgOiAnICcsCisJCQkJICAgICAgIG1hczdfbWFzMyAmIE1BUzNfU1ggPyAneCcgOiAnICcsCisJCQkJICAgICAgIG1hczdfbWFzMyAmIE1BUzNfU1cgPyAndycgOiAnICcsCisJCQkJICAgICAgIG1hczdfbWFzMyAmIE1BUzNfU1IgPyAncicgOiAnICcpOworCQl9CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNFICovCisKIHN0YXRpYyB2b2lkIHhtb25faW5pdChpbnQgZW5hYmxlKQogewogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL01ha2VmaWxlIGIvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IDMwYzVmMDEuLjBjOWU2YzZkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC0yNCw3ICsyNCw4IEBACiBlbHNlCiBMRF9CRkQJCTo9IGVsZjY0LXMzOTAKIExERkxBR1MJCTo9IC1tIGVsZjY0X3MzOTAKLU1PREZMQUdTCSs9IC1mcGljIC1EX19QSUNfXworS0JVSUxEX0FGTEFHU19NT0RVTEUgKz0gLWZwaWMgLURfX1BJQ19fCitLQlVJTERfQ0ZMQUdTX01PRFVMRSArPSAtZnBpYyAtRF9fUElDX18KIEtCVUlMRF9DRkxBR1MJKz0gLW02NAogS0JVSUxEX0FGTEFHUwkrPSAtbTY0CiBVVFNfTUFDSElORQk6PSBzMzkweApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX25ldF9zdW0uYyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9uZXRfc3VtLmMKaW5kZXggOWE5NTg2Zi4uZjAyZTg5YyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX25ldF9zdW0uYworKysgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfbmV0X3N1bS5jCkBAIC04NSw3ICs4NSw4IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfbmV0ZGV2X3JjdSgmaW5pdF9uZXQsIGRldikgewotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBkZXZfZ2V0X3N0YXRzKGRldik7CisJCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCB0ZW1wOworCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBkZXZfZ2V0X3N0YXRzKGRldiwgJnRlbXApOwogCiAJCXJ4X3BhY2tldHMgKz0gc3RhdHMtPnJ4X3BhY2tldHM7CiAJCXR4X3BhY2tldHMgKz0gc3RhdHMtPnR4X3BhY2tldHM7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL01ha2VmaWxlIGIvYXJjaC9zMzkwL2NyeXB0by9NYWtlZmlsZQppbmRleCA2YTExNTdmLi4xY2Y4MWQ3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vTWFrZWZpbGUKQEAgLTUsNiArNSw2IEBACiBvYmotJChDT05GSUdfQ1JZUFRPX1NIQTFfUzM5MCkgKz0gc2hhMV9zMzkwLm8gc2hhX2NvbW1vbi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1NIQTI1Nl9TMzkwKSArPSBzaGEyNTZfczM5MC5vIHNoYV9jb21tb24ubwogb2JqLSQoQ09ORklHX0NSWVBUT19TSEE1MTJfUzM5MCkgKz0gc2hhNTEyX3MzOTAubyBzaGFfY29tbW9uLm8KLW9iai0kKENPTkZJR19DUllQVE9fREVTX1MzOTApICs9IGRlc19zMzkwLm8gZGVzX2NoZWNrX2tleS5vCitvYmotJChDT05GSUdfQ1JZUFRPX0RFU19TMzkwKSArPSBkZXNfczM5MC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0FFU19TMzkwKSArPSBhZXNfczM5MC5vCiBvYmotJChDT05GSUdfUzM5MF9QUk5HKSArPSBwcm5nLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vY3J5cHRvX2Rlcy5oIGIvYXJjaC9zMzkwL2NyeXB0by9jcnlwdG9fZGVzLmgKaW5kZXggYzk2NGI2NC4uNjIxMDQ1NyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9jcnlwdG9fZGVzLmgKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9jcnlwdG9fZGVzLmgKQEAgLTE1LDQgKzE1LDQgQEAKIAogZXh0ZXJuIGludCBjcnlwdG9fZGVzX2NoZWNrX2tleShjb25zdCB1OCosIHVuc2lnbmVkIGludCwgdTMyKik7CiAKLSNlbmRpZiAvL19fQ1JZUFRPX0RFU19IX18KKyNlbmRpZiAvKl9fQ1JZUFRPX0RFU19IX18qLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCmluZGV4IDJiYzQ3OWEuLmNjNTQyMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKQEAgLTE0LDMyICsxNCwyMSBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Rlcy5oPgogCiAjaW5jbHVkZSAiY3J5cHRfczM5MC5oIgotI2luY2x1ZGUgImNyeXB0b19kZXMuaCIKLQotI2RlZmluZSBERVNfQkxPQ0tfU0laRSA4Ci0jZGVmaW5lIERFU19LRVlfU0laRSA4Ci0KLSNkZWZpbmUgREVTM18xMjhfS0VZX1NJWkUJKDIgKiBERVNfS0VZX1NJWkUpCi0jZGVmaW5lIERFUzNfMTI4X0JMT0NLX1NJWkUJREVTX0JMT0NLX1NJWkUKIAogI2RlZmluZSBERVMzXzE5Ml9LRVlfU0laRQkoMyAqIERFU19LRVlfU0laRSkKLSNkZWZpbmUgREVTM18xOTJfQkxPQ0tfU0laRQlERVNfQkxPQ0tfU0laRQogCiBzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4IHsKIAl1OCBpdltERVNfQkxPQ0tfU0laRV07CiAJdTgga2V5W0RFU19LRVlfU0laRV07CiB9OwogCi1zdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggewotCXU4IGl2W0RFU19CTE9DS19TSVpFXTsKLQl1OCBrZXlbREVTM18xMjhfS0VZX1NJWkVdOwotfTsKLQogc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4IHsKIAl1OCBpdltERVNfQkxPQ0tfU0laRV07CiAJdTgga2V5W0RFUzNfMTkyX0tFWV9TSVpFXTsKQEAgLTUwLDEzICszOSwxNiBAQAogewogCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7Ci0JaW50IHJldDsKKwl1MzIgdG1wW0RFU19FWFBLRVlfV09SRFNdOwogCi0JLyogdGVzdCBpZiBrZXkgaXMgdmFsaWQgKG5vdCBhIHdlYWsga2V5KSAqLwotCXJldCA9IGNyeXB0b19kZXNfY2hlY2tfa2V5KGtleSwga2V5bGVuLCBmbGFncyk7Ci0JaWYgKHJldCA9PSAwKQotCQltZW1jcHkoZGN0eC0+a2V5LCBrZXksIGtleWxlbik7Ci0JcmV0dXJuIHJldDsKKwkvKiBjaGVjayBmb3Igd2VhayBrZXlzICovCisJaWYgKCFkZXNfZWtleSh0bXAsIGtleSkgJiYgKCpmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgeworCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbWNweShkY3R4LT5rZXksIGtleSwga2V5bGVuKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQpAQCAtMjM3LDE2NSArMjI5LDYgQEAKICAqICAgY29tcGxlbWVudGF0aW9uIGtleXMuICBBbnkgd2Vha25lc3MgaXMgb2J2aWF0ZWQgYnkgdGhlIHVzZSBvZgogICogICBtdWx0aXBsZSBrZXlzLgogICoKLSAqICAgSG93ZXZlciwgaWYgdGhlIHR3byAgaW5kZXBlbmRlbnQgNjQtYml0IGtleXMgYXJlIGVxdWFsLAotICogICB0aGVuIHRoZSBERVMzIG9wZXJhdGlvbiBpcyBzaW1wbHkgdGhlIHNhbWUgYXMgREVTLgotICogICBJbXBsZW1lbnRlcnMgTVVTVCByZWplY3Qga2V5cyB0aGF0IGV4aGliaXQgdGhpcyBwcm9wZXJ0eS4KLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGVzM18xMjhfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCi0JCQkgICB1bnNpZ25lZCBpbnQga2V5bGVuKQotewotCWludCBpLCByZXQ7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpkY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQljb25zdCB1OCAqdGVtcF9rZXkgPSBrZXk7Ci0JdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKLQotCWlmICghKG1lbWNtcChrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSkgJiYKLQkgICAgKCpmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgewotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCB0ZW1wX2tleSArPSBERVNfS0VZX1NJWkUpIHsKLQkJcmV0ID0gY3J5cHRvX2Rlc19jaGVja19rZXkodGVtcF9rZXksIERFU19LRVlfU0laRSwgZmxhZ3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCW1lbWNweShkY3R4LT5rZXksIGtleSwga2V5bGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVzM18xMjhfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQotewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0KLQljcnlwdF9zMzkwX2ttKEtNX1RERUFfMTI4X0VOQ1JZUFQsIGRjdHgtPmtleSwgZHN0LCAodm9pZCopc3JjLAotCQkgICAgICBERVMzXzEyOF9CTE9DS19TSVpFKTsKLX0KLQotc3RhdGljIHZvaWQgZGVzM18xMjhfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQotewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0KLQljcnlwdF9zMzkwX2ttKEtNX1RERUFfMTI4X0RFQ1JZUFQsIGRjdHgtPmtleSwgZHN0LCAodm9pZCopc3JjLAotCQkgICAgICBERVMzXzEyOF9CTE9DS19TSVpFKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlczNfMTI4X2FsZyA9IHsKLQkuY3JhX25hbWUJCT0JImRlczNfZWRlMTI4IiwKLQkuY3JhX2RyaXZlcl9uYW1lCT0JImRlczNfZWRlMTI4LXMzOTAiLAotCS5jcmFfcHJpb3JpdHkJCT0JQ1JZUFRfUzM5MF9QUklPUklUWSwKLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JREVTM18xMjhfQkxPQ0tfU0laRSwKLQkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCksCi0JLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGRlczNfMTI4X2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7Ci0JCS5jaXBoZXIgPSB7Ci0JCQkuY2lhX21pbl9rZXlzaXplCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JCQkuY2lhX21heF9rZXlzaXplCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JCQkuY2lhX3NldGtleQkJPQlkZXMzXzEyOF9zZXRrZXksCi0JCQkuY2lhX2VuY3J5cHQJCT0JZGVzM18xMjhfZW5jcnlwdCwKLQkJCS5jaWFfZGVjcnlwdAkJPQlkZXMzXzEyOF9kZWNyeXB0LAotCQl9Ci0JfQotfTsKLQotc3RhdGljIGludCBlY2JfZGVzM18xMjhfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKLQlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKLQotCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIEtNX1RERUFfMTI4X0VOQ1JZUFQsIHNjdHgtPmtleSwgJndhbGspOwotfQotCi1zdGF0aWMgaW50IGVjYl9kZXMzXzEyOF9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwotCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwotCi0JYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgS01fVERFQV8xMjhfREVDUllQVCwgc2N0eC0+a2V5LCAmd2Fsayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBlY2JfZGVzM18xMjhfYWxnID0gewotCS5jcmFfbmFtZQkJPQkiZWNiKGRlczNfZWRlMTI4KSIsCi0JLmNyYV9kcml2ZXJfbmFtZQk9CSJlY2ItZGVzM19lZGUxMjgtczM5MCIsCi0JLmNyYV9wcmlvcml0eQkJPQlDUllQVF9TMzkwX0NPTVBPU0lURV9QUklPUklUWSwKLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JREVTM18xMjhfQkxPQ0tfU0laRSwKLQkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCksCi0JLmNyYV90eXBlCQk9CSZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCi0JLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKAotCQkJCQkJZWNiX2RlczNfMTI4X2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7Ci0JCS5ibGtjaXBoZXIgPSB7Ci0JCQkubWluX2tleXNpemUJCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JCQkubWF4X2tleXNpemUJCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JCQkuc2V0a2V5CQkJPQlkZXMzXzEyOF9zZXRrZXksCi0JCQkuZW5jcnlwdAkJPQllY2JfZGVzM18xMjhfZW5jcnlwdCwKLQkJCS5kZWNyeXB0CQk9CWVjYl9kZXMzXzEyOF9kZWNyeXB0LAotCQl9Ci0JfQotfTsKLQotc3RhdGljIGludCBjYmNfZGVzM18xMjhfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKLQlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKLQotCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIEtNQ19UREVBXzEyOF9FTkNSWVBULCBzY3R4LT5pdiwgJndhbGspOwotfQotCi1zdGF0aWMgaW50IGNiY19kZXMzXzEyOF9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwotCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwotCi0JYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgS01DX1RERUFfMTI4X0RFQ1JZUFQsIHNjdHgtPml2LCAmd2Fsayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjYmNfZGVzM18xMjhfYWxnID0gewotCS5jcmFfbmFtZQkJPQkiY2JjKGRlczNfZWRlMTI4KSIsCi0JLmNyYV9kcml2ZXJfbmFtZQk9CSJjYmMtZGVzM19lZGUxMjgtczM5MCIsCi0JLmNyYV9wcmlvcml0eQkJPQlDUllQVF9TMzkwX0NPTVBPU0lURV9QUklPUklUWSwKLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JREVTM18xMjhfQkxPQ0tfU0laRSwKLQkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCksCi0JLmNyYV90eXBlCQk9CSZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCi0JLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKAotCQkJCQkJY2JjX2RlczNfMTI4X2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7Ci0JCS5ibGtjaXBoZXIgPSB7Ci0JCQkubWluX2tleXNpemUJCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JCQkubWF4X2tleXNpemUJCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JCQkuaXZzaXplCQkJPQlERVMzXzEyOF9CTE9DS19TSVpFLAotCQkJLnNldGtleQkJCT0JZGVzM18xMjhfc2V0a2V5LAotCQkJLmVuY3J5cHQJCT0JY2JjX2RlczNfMTI4X2VuY3J5cHQsCi0JCQkuZGVjcnlwdAkJPQljYmNfZGVzM18xMjhfZGVjcnlwdCwKLQkJfQotCX0KLX07Ci0KLS8qCi0gKiBSRkMyNDUxOgotICoKLSAqICAgRm9yIERFUy1FREUzLCB0aGVyZSBpcyBubyBrbm93biBuZWVkIHRvIHJlamVjdCB3ZWFrIG9yCi0gKiAgIGNvbXBsZW1lbnRhdGlvbiBrZXlzLiAgQW55IHdlYWtuZXNzIGlzIG9idmlhdGVkIGJ5IHRoZSB1c2Ugb2YKLSAqICAgbXVsdGlwbGUga2V5cy4KLSAqCiAgKiAgIEhvd2V2ZXIsIGlmIHRoZSBmaXJzdCB0d28gb3IgbGFzdCB0d28gaW5kZXBlbmRlbnQgNjQtYml0IGtleXMgYXJlCiAgKiAgIGVxdWFsIChrMSA9PSBrMiBvciBrMiA9PSBrMyksIHRoZW4gdGhlIERFUzMgb3BlcmF0aW9uIGlzIHNpbXBseSB0aGUKICAqICAgc2FtZSBhcyBERVMuICBJbXBsZW1lbnRlcnMgTVVTVCByZWplY3Qga2V5cyB0aGF0IGV4aGliaXQgdGhpcwpAQCAtNDA1LDkgKzIzOCw3IEBACiBzdGF0aWMgaW50IGRlczNfMTkyX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAogCQkJICAgdW5zaWduZWQgaW50IGtleWxlbikKIHsKLQlpbnQgaSwgcmV0OwogCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JY29uc3QgdTggKnRlbXBfa2V5ID0ga2V5OwogCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7CiAKIAlpZiAoIShtZW1jbXAoa2V5LCAma2V5W0RFU19LRVlfU0laRV0sIERFU19LRVlfU0laRSkgJiYKQEAgLTQxNywxMSArMjQ4LDYgQEAKIAkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX1dFQUtfS0VZOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IDM7IGkrKywgdGVtcF9rZXkgKz0gREVTX0tFWV9TSVpFKSB7Ci0JCXJldCA9IGNyeXB0b19kZXNfY2hlY2tfa2V5KHRlbXBfa2V5LCBERVNfS0VZX1NJWkUsIGZsYWdzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KIAltZW1jcHkoZGN0eC0+a2V5LCBrZXksIGtleWxlbik7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzEsNyArMjU3LDcgQEAKIAlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKmRjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCiAJY3J5cHRfczM5MF9rbShLTV9UREVBXzE5Ml9FTkNSWVBULCBkY3R4LT5rZXksIGRzdCwgKHZvaWQqKXNyYywKLQkJICAgICAgREVTM18xOTJfQkxPQ0tfU0laRSk7CisJCSAgICAgIERFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHZvaWQgZGVzM18xOTJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQpAQCAtNDM5LDcgKzI2NSw3IEBACiAJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpkY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAogCWNyeXB0X3MzOTBfa20oS01fVERFQV8xOTJfREVDUllQVCwgZGN0eC0+a2V5LCBkc3QsICh2b2lkKilzcmMsCi0JCSAgICAgIERFUzNfMTkyX0JMT0NLX1NJWkUpOworCQkgICAgICBERVNfQkxPQ0tfU0laRSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBkZXMzXzE5Ml9hbGcgPSB7CkBAIC00NDcsNyArMjczLDcgQEAKIAkuY3JhX2RyaXZlcl9uYW1lCT0JImRlczNfZWRlLXMzOTAiLAogCS5jcmFfcHJpb3JpdHkJCT0JQ1JZUFRfUzM5MF9QUklPUklUWSwKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JREVTM18xOTJfQkxPQ0tfU0laRSwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlERVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCksCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGRlczNfMTkyX2FsZy5jcmFfbGlzdCksCkBAIC00ODksNyArMzE1LDcgQEAKIAkuY3JhX2RyaXZlcl9uYW1lCT0JImVjYi1kZXMzX2VkZS1zMzkwIiwKIAkuY3JhX3ByaW9yaXR5CQk9CUNSWVBUX1MzOTBfQ09NUE9TSVRFX1BSSU9SSVRZLAogCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKLQkuY3JhX2Jsb2Nrc2l6ZQkJPQlERVMzXzE5Ml9CTE9DS19TSVpFLAorCS5jcmFfYmxvY2tzaXplCQk9CURFU19CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4KSwKIAkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKQEAgLTUzMyw3ICszNTksNyBAQAogCS5jcmFfZHJpdmVyX25hbWUJPQkiY2JjLWRlczNfZWRlLXMzOTAiLAogCS5jcmFfcHJpb3JpdHkJCT0JQ1JZUFRfUzM5MF9DT01QT1NJVEVfUFJJT1JJVFksCiAJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAotCS5jcmFfYmxvY2tzaXplCQk9CURFUzNfMTkyX0JMT0NLX1NJWkUsCisJLmNyYV9ibG9ja3NpemUJCT0JREVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHgpLAogCS5jcmFfdHlwZQkJPQkmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAogCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLApAQCAtNTQzLDcgKzM2OSw3IEBACiAJCS5ibGtjaXBoZXIgPSB7CiAJCQkubWluX2tleXNpemUJCT0JREVTM18xOTJfS0VZX1NJWkUsCiAJCQkubWF4X2tleXNpemUJCT0JREVTM18xOTJfS0VZX1NJWkUsCi0JCQkuaXZzaXplCQkJPQlERVMzXzE5Ml9CTE9DS19TSVpFLAorCQkJLml2c2l6ZQkJCT0JREVTX0JMT0NLX1NJWkUsCiAJCQkuc2V0a2V5CQkJPQlkZXMzXzE5Ml9zZXRrZXksCiAJCQkuZW5jcnlwdAkJPQljYmNfZGVzM18xOTJfZW5jcnlwdCwKIAkJCS5kZWNyeXB0CQk9CWNiY19kZXMzXzE5Ml9kZWNyeXB0LApAQCAtNTUzLDEwICszNzksOSBAQAogCiBzdGF0aWMgaW50IGRlc19zMzkwX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKCFjcnlwdF9zMzkwX2Z1bmNfYXZhaWxhYmxlKEtNX0RFQV9FTkNSWVBUKSB8fAotCSAgICAhY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLTV9UREVBXzEyOF9FTkNSWVBUKSB8fAogCSAgICAhY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLTV9UREVBXzE5Ml9FTkNSWVBUKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC01NjksMTcgKzM5NCw2IEBACiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2Rlc19hbGcpOwogCWlmIChyZXQpCiAJCWdvdG8gY2JjX2Rlc19lcnI7Ci0KLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzXzEyOF9hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZGVzM18xMjhfZXJyOwotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmVjYl9kZXMzXzEyOF9hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZWNiX2RlczNfMTI4X2VycjsKLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZjYmNfZGVzM18xMjhfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGNiY19kZXMzXzEyOF9lcnI7Ci0KIAlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzXzE5Ml9hbGcpOwogCWlmIChyZXQpCiAJCWdvdG8gZGVzM18xOTJfZXJyOwpAQCAtNTg5LDcgKzQwMyw2IEBACiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2RlczNfMTkyX2FsZyk7CiAJaWYgKHJldCkKIAkJZ290byBjYmNfZGVzM18xOTJfZXJyOwotCiBvdXQ6CiAJcmV0dXJuIHJldDsKIApAQCAtNTk4LDEyICs0MTEsNiBAQAogZWNiX2RlczNfMTkyX2VycjoKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfMTkyX2FsZyk7CiBkZXMzXzE5Ml9lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzM18xMjhfYWxnKTsKLWNiY19kZXMzXzEyOF9lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzM18xMjhfYWxnKTsKLWVjYl9kZXMzXzEyOF9lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXMzXzEyOF9hbGcpOwotZGVzM18xMjhfZXJyOgogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2JjX2Rlc19hbGcpOwogY2JjX2Rlc19lcnI6CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzX2FsZyk7CkBAIC02MTMsMjEgKzQyMCwxOCBAQAogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVzX3MzOTBfZmluaSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGRlc19zMzkwX2V4aXQodm9pZCkKIHsKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmNiY19kZXMzXzE5Ml9hbGcpOwogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZWNiX2RlczNfMTkyX2FsZyk7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXMzXzE5Ml9hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2JjX2RlczNfMTI4X2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzM18xMjhfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfMTI4X2FsZyk7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzX2FsZyk7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzX2FsZyk7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXNfYWxnKTsKIH0KIAogbW9kdWxlX2luaXQoZGVzX3MzOTBfaW5pdCk7Ci1tb2R1bGVfZXhpdChkZXNfczM5MF9maW5pKTsKK21vZHVsZV9leGl0KGRlc19zMzkwX2V4aXQpOwogCiBNT0RVTEVfQUxJQVMoImRlcyIpOwogTU9EVUxFX0FMSUFTKCJkZXMzX2VkZSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCAyNzYwNWI2Li5jZWY3ZGJmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtMjYsNyArMjYsNyBAQAogCiBzdHJ1Y3Qgc2NhX2VudHJ5IHsKIAlhdG9taWNfdCBzY247Ci0JX191NjQJcmVzZXJ2ZWQ7CisJX191MzIJcmVzZXJ2ZWQ7CiAJX191NjQJc2RhOwogCV9fdTY0CXJlc2VydmVkMlsyXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC00MSw3ICs0MSw4IEBACiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIEtWTV9OUl9QQUdFX1NJWkVTIDIKLSNkZWZpbmUgS1ZNX0hQQUdFX1NISUZUKHgpIChQQUdFX1NISUZUICsgKCh4KSAtIDEpICogOCkKKyNkZWZpbmUgS1ZNX0hQQUdFX0dGTl9TSElGVCh4KSAoKCh4KSAtIDEpICogOCkKKyNkZWZpbmUgS1ZNX0hQQUdFX1NISUZUKHgpIChQQUdFX1NISUZUICsgS1ZNX0hQQUdFX0dGTl9TSElGVCh4KSkKICNkZWZpbmUgS1ZNX0hQQUdFX1NJWkUoeCkgKDFVTCA8PCBLVk1fSFBBR0VfU0hJRlQoeCkpCiAjZGVmaW5lIEtWTV9IUEFHRV9NQVNLKHgpCSh+KEtWTV9IUEFHRV9TSVpFKHgpIC0gMSkpCiAjZGVmaW5lIEtWTV9QQUdFU19QRVJfSFBBR0UoeCkJKEtWTV9IUEFHRV9TSVpFKHgpIC8gUEFHRV9TSVpFKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvY2FsNjQuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCmluZGV4IDBlYWFlNjI2Li4yYmE2MzAyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKQEAgLTg0LDYgKzg0LDcgQEAKIAogI2RlZmluZSBRSUJfQUNfT1VUQk9VTkRfUENJX1NVUFBPUlRFRAkweDQwCiAjZGVmaW5lIFFJQl9SRkxBR1NfRU5BQkxFX1FFQlNNCQkweDgwCisjZGVmaW5lIFFJQl9SRkxBR1NfRU5BQkxFX0RBVEFfRElWCTB4MDIKIAogLyoqCiAgKiBzdHJ1Y3QgcWliIC0gcXVldWUgaW5mb3JtYXRpb24gYmxvY2sgKFFJQikKQEAgLTI4NCw2ICsyODUsOSBAQAogCXU4IHZhbFtRRElPX01BWF9CVUZGRVJTX1BFUl9RXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCgyNTYpKSk7CiAKKyNkZWZpbmUgQ0hTQ19BQzJfREFUQV9ESVZfQVZBSUxBQkxFCTB4MDAxMAorI2RlZmluZSBDSFNDX0FDMl9EQVRBX0RJVl9FTkFCTEVECTB4MDAwMgorCiBzdHJ1Y3QgcWRpb19zc3FkX2Rlc2MgewogCXU4IGZsYWdzOwogCXU4Ojg7CkBAIC0zMzIsNiArMzM2LDcgQEAKICAqIEBhZGFwdGVyX25hbWU6IG5hbWUgZm9yIHRoZSBhZGFwdGVyCiAgKiBAcWliX3BhcmFtX2ZpZWxkX2Zvcm1hdDogZm9ybWF0IGZvciBxaWJfcGFybV9maWVsZAogICogQHFpYl9wYXJhbV9maWVsZDogcG9pbnRlciB0byAxMjggYnl0ZXMgb3IgTlVMTCwgaWYgbm8gcGFyYW0gZmllbGQKKyAqIEBxaWJfcmZsYWdzOiByZmxhZ3MgdG8gc2V0CiAgKiBAaW5wdXRfc2xpYl9lbGVtZW50czogcG9pbnRlciB0byBub19pbnB1dF9xcyAqIDEyOCB3b3JkcyBvZiBkYXRhIG9yIE5VTEwKICAqIEBvdXRwdXRfc2xpYl9lbGVtZW50czogcG9pbnRlciB0byBub19vdXRwdXRfcXMgKiAxMjggd29yZHMgb2YgZGF0YSBvciBOVUxMCiAgKiBAbm9faW5wdXRfcXM6IG51bWJlciBvZiBpbnB1dCBxdWV1ZXMKQEAgLTM0OCw2ICszNTMsNyBAQAogCXVuc2lnbmVkIGNoYXIgYWRhcHRlcl9uYW1lWzhdOwogCXVuc2lnbmVkIGludCBxaWJfcGFyYW1fZmllbGRfZm9ybWF0OwogCXVuc2lnbmVkIGNoYXIgKnFpYl9wYXJhbV9maWVsZDsKKwl1bnNpZ25lZCBjaGFyIHFpYl9yZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyAqaW5wdXRfc2xpYl9lbGVtZW50czsKIAl1bnNpZ25lZCBsb25nICpvdXRwdXRfc2xpYl9lbGVtZW50czsKIAl1bnNpZ25lZCBpbnQgbm9faW5wdXRfcXM7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggZDVlM2U2MC4uYmVhOWVlMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtNTM1LDggKzUzNSwxNiBAQAogCWwJJXIzLF9fTENfUEdNX0lMQwkjIGxvYWQgcHJvZ3JhbSBpbnRlcnJ1cHRpb24gY29kZQogCWxhCSVyOCwweDdmCiAJbnIJJXI4LCVyMyAJCSMgY2xlYXIgcGVyLWV2ZW50LWJpdCBhbmQgaWxjCi0JYmUJQkFTRUQocGdtX2V4aXQpCQkjIG9ubHkgcGVyIG9yIHBlcitjaGVjayA/Ci0JYglCQVNFRChwZ21fZG9fY2FsbCkKKwliZQlCQVNFRChwZ21fZXhpdDIpCSMgb25seSBwZXIgb3IgcGVyK2NoZWNrID8KKwlsCSVyNyxCQVNFRCguTGp1bXBfdGFibGUpCisJc2xsCSVyOCwyCisJbAklcjcsMCglcjgsJXI3KQkJIyBsb2FkIGFkZHJlc3Mgb2YgaGFuZGxlciByb3V0aW5lCisJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCisJYmFzcgklcjE0LCVyNwkJIyBicmFuY2ggdG8gaW50ZXJydXB0LWhhbmRsZXIKK3BnbV9leGl0MjoKKwlUUkFDRV9JUlFTX09OCisJc3Rvc20JX19TRl9FTVBUWSglcjE1KSwweDAzCSMgcmVlbmFibGUgaW50ZXJydXB0cworCWIJQkFTRUQoc3lzY19yZXR1cm4pCiAKICMKICMgaXQgd2FzIGEgc2luZ2xlIHN0ZXBwZWQgU1ZDIHRoYXQgaXMgY2F1c2luZyBhbGwgdGhlIHRyb3VibGUKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKaW5kZXggZTcxOTJlMS4uOGJjY2VjMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKQEAgLTU0NCw4ICs1NDQsMTYgQEAKIAlsZ2YJJXIzLF9fTENfUEdNX0lMQwkjIGxvYWQgcHJvZ3JhbSBpbnRlcnJ1cHRpb24gY29kZQogCWxnaGkJJXI4LDB4N2YKIAluZ3IJJXI4LCVyMwkJCSMgY2xlYXIgcGVyLWV2ZW50LWJpdCBhbmQgaWxjCi0JamUJcGdtX2V4aXQKLQlqCXBnbV9kb19jYWxsCisJamUJcGdtX2V4aXQyCisJc2xsCSVyOCwzCisJbGFybAklcjEscGdtX2NoZWNrX3RhYmxlCisJbGcJJXIxLDAoJXI4LCVyMSkJCSMgbG9hZCBhZGRyZXNzIG9mIGhhbmRsZXIgcm91dGluZQorCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQorCWJhc3IJJXIxNCwlcjEJCSMgYnJhbmNoIHRvIGludGVycnVwdC1oYW5kbGVyCitwZ21fZXhpdDI6CisJVFJBQ0VfSVJRU19PTgorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwlqCXN5c2NfcmV0dXJuCiAKICMKICMgaXQgd2FzIGEgc2luZ2xlIHN0ZXBwZWQgU1ZDIHRoYXQgaXMgY2F1c2luZyBhbGwgdGhlIHRyb3VibGUKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggYWViMzBjNi4uMjg5NmNhYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTUyNCw4ICs1MjQsMTEgQEAKIAlpZiAoIWV0cl9lYWNyLnNsKQogCQlyZXR1cm47CiAJZGlzYWJsZV9zeW5jX2Nsb2NrKE5VTEwpOwotCXNldF9iaXQoRVRSX0VWRU5UX1NXSVRDSF9MT0NBTCwgJmV0cl9ldmVudHMpOwotCXF1ZXVlX3dvcmsodGltZV9zeW5jX3dxLCAmZXRyX3dvcmspOworCWlmICghdGVzdF9hbmRfc2V0X2JpdChFVFJfRVZFTlRfU1dJVENIX0xPQ0FMLCAmZXRyX2V2ZW50cykpIHsKKwkJZXRyX2VhY3IuZXMgPSBldHJfZWFjci5zbCA9IDA7CisJCWV0cl9zZXRyKCZldHJfZWFjcik7CisJCXF1ZXVlX3dvcmsodGltZV9zeW5jX3dxLCAmZXRyX3dvcmspOworCX0KIH0KIAogLyoKQEAgLTUzOSw4ICs1NDIsMTEgQEAKIAlpZiAoIWV0cl9lYWNyLmVzKQogCQlyZXR1cm47CiAJZGlzYWJsZV9zeW5jX2Nsb2NrKE5VTEwpOwotCXNldF9iaXQoRVRSX0VWRU5UX1NZTkNfQ0hFQ0ssICZldHJfZXZlbnRzKTsKLQlxdWV1ZV93b3JrKHRpbWVfc3luY193cSwgJmV0cl93b3JrKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRVRSX0VWRU5UX1NZTkNfQ0hFQ0ssICZldHJfZXZlbnRzKSkgeworCQlldHJfZWFjci5lcyA9IDA7CisJCWV0cl9zZXRyKCZldHJfZWFjcik7CisJCXF1ZXVlX3dvcmsodGltZV9zeW5jX3dxLCAmZXRyX3dvcmspOworCX0KIH0KIAogLyoKQEAgLTkwMiw3ICs5MDgsNyBAQAogCSAqIERvIG5vdCB0cnkgdG8gZ2V0IHRoZSBhbHRlcm5hdGUgcG9ydCBhaWIgaWYgdGhlIGNsb2NrCiAJICogaXMgbm90IGluIHN5bmMgeWV0LgogCSAqLwotCWlmICghY2hlY2tfc3luY19jbG9jaygpKQorCWlmICghZWFjci5lcyB8fCAhY2hlY2tfc3luY19jbG9jaygpKQogCQlyZXR1cm4gZWFjcjsKIAogCS8qCkBAIC0xMDY0LDcgKzEwNzAsNyBAQAogCSAqIElmIHRoZSBjbG9jayBpcyBpbiBzeW5jIGp1c3QgdXBkYXRlIHRoZSBlYWNyIGFuZCByZXR1cm4uCiAJICogSWYgdGhlcmUgaXMgbm8gdmFsaWQgc3luYyBwb3J0IHdhaXQgZm9yIGEgcG9ydCB1cGRhdGUuCiAJICovCi0JaWYgKGNoZWNrX3N5bmNfY2xvY2soKSB8fCBzeW5jX3BvcnQgPCAwKSB7CisJaWYgKChlYWNyLmVzICYmIGNoZWNrX3N5bmNfY2xvY2soKSkgfHwgc3luY19wb3J0IDwgMCkgewogCQlldHJfdXBkYXRlX2VhY3IoZWFjcik7CiAJCWV0cl9zZXRfdG9sZWNfdGltZW91dChub3cpOwogCQlnb3RvIG91dF91bmxvY2s7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jIGIvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYwppbmRleCAzZGRjMzA4Li5mN2I2ZGY0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCisrKyBiL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCXNwaW5fbG9ja19iaCgmdmNwdS0+YXJjaC5sb2NhbF9pbnQubG9jayk7CiAJaWYgKHZjcHUtPmFyY2gubG9jYWxfaW50LmFjdGlvbl9iaXRzICYgQUNUSU9OX1NUT1JFX09OX1NUT1ApIHsKIAkJdmNwdS0+YXJjaC5sb2NhbF9pbnQuYWN0aW9uX2JpdHMgJj0gfkFDVElPTl9TVE9SRV9PTl9TVE9QOwotCQlyYyA9IF9fa3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXModmNwdSwKKwkJcmMgPSBrdm1fczM5MF92Y3B1X3N0b3JlX3N0YXR1cyh2Y3B1LAogCQkJCQkJICBLVk1fUzM5MF9TVE9SRV9TVEFUVVNfTk9BRERSKTsKIAkJaWYgKHJjID49IDApCiAJCQlyYyA9IC1FT1BOT1RTVVBQOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCmluZGV4IGFlMzcwNTguLjRmZTY4NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYworKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKQEAgLTIwNyw2ICsyMDcsNyBAQAogdm9pZCBrdm1fYXJjaF92Y3B1X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCVZDUFVfRVZFTlQodmNwdSwgMywgIiVzIiwgImZyZWUgY3B1Iik7CisJY2xlYXJfYml0KDYzIC0gdmNwdS0+dmNwdV9pZCwgKHVuc2lnbmVkIGxvbmcgKikgJnZjcHUtPmt2bS0+YXJjaC5zY2EtPm1jbik7CiAJaWYgKHZjcHUtPmt2bS0+YXJjaC5zY2EtPmNwdVt2Y3B1LT52Y3B1X2lkXS5zZGEgPT0KIAkJKF9fdTY0KSB2Y3B1LT5hcmNoLnNpZV9ibG9jaykKIAkJdmNwdS0+a3ZtLT5hcmNoLnNjYS0+Y3B1W3ZjcHUtPnZjcHVfaWRdLnNkYSA9IDA7CkBAIC0yOTYsNyArMjk3LDcgQEAKIHsKIAlhdG9taWNfc2V0KCZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y3B1ZmxhZ3MsIENQVVNUQVRfWkFSQ0gpOwogCXNldF9iaXQoS1ZNX1JFUV9NTVVfUkVMT0FELCAmdmNwdS0+cmVxdWVzdHMpOwotCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2IgICA9IDI7CisJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYiAgID0gNjsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhICAgPSAweEMxMDAyMDAxVTsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZmFjICAgPSAoaW50KSAobG9uZykgZmFjaWxpdGllczsKIAlocnRpbWVyX2luaXQoJnZjcHUtPmFyY2guY2tjX3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CkBAIC0zMjksNiArMzMwLDcgQEAKIAkJa3ZtLT5hcmNoLnNjYS0+Y3B1W2lkXS5zZGEgPSAoX191NjQpIHZjcHUtPmFyY2guc2llX2Jsb2NrOwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5zY2FvaCA9IChfX3UzMikoKChfX3U2NClrdm0tPmFyY2guc2NhKSA+PiAzMik7CiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPnNjYW9sID0gKF9fdTMyKShfX3U2NClrdm0tPmFyY2guc2NhOworCXNldF9iaXQoNjMgLSBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmt2bS0+YXJjaC5zY2EtPm1jbik7CiAKIAlzcGluX2xvY2tfaW5pdCgmdmNwdS0+YXJjaC5sb2NhbF9pbnQubG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnZjcHUtPmFyY2gubG9jYWxfaW50Lmxpc3QpOwpAQCAtMzYzLDYzICszNjUsNDkgQEAKIAogc3RhdGljIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2luaXRpYWxfcmVzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAlrdm1fczM5MF92Y3B1X2luaXRpYWxfcmVzZXQodmNwdSk7Ci0JdmNwdV9wdXQodmNwdSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9yZWdzICpyZWdzKQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAltZW1jcHkoJnZjcHUtPmFyY2guZ3Vlc3RfZ3BycywgJnJlZ3MtPmdwcnMsIHNpemVvZihyZWdzLT5ncHJzKSk7Ci0JdmNwdV9wdXQodmNwdSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9yZWdzICpyZWdzKQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAltZW1jcHkoJnJlZ3MtPmdwcnMsICZ2Y3B1LT5hcmNoLmd1ZXN0X2dwcnMsIHNpemVvZihyZWdzLT5ncHJzKSk7Ci0JdmNwdV9wdXQodmNwdSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9zcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJICBzdHJ1Y3Qga3ZtX3NyZWdzICpzcmVncykKIHsKLQl2Y3B1X2xvYWQodmNwdSk7CiAJbWVtY3B5KCZ2Y3B1LT5hcmNoLmd1ZXN0X2FjcnMsICZzcmVncy0+YWNycywgc2l6ZW9mKHNyZWdzLT5hY3JzKSk7CiAJbWVtY3B5KCZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyLCAmc3JlZ3MtPmNycywgc2l6ZW9mKHNyZWdzLT5jcnMpKTsKLQl2Y3B1X3B1dCh2Y3B1KTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfZ2V0X3NyZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAltZW1jcHkoJnNyZWdzLT5hY3JzLCAmdmNwdS0+YXJjaC5ndWVzdF9hY3JzLCBzaXplb2Yoc3JlZ3MtPmFjcnMpKTsKIAltZW1jcHkoJnNyZWdzLT5jcnMsICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyLCBzaXplb2Yoc3JlZ3MtPmNycykpOwotCXZjcHVfcHV0KHZjcHUpOwogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9mcHUgKmZwdSkKIHsKLQl2Y3B1X2xvYWQodmNwdSk7CiAJbWVtY3B5KCZ2Y3B1LT5hcmNoLmd1ZXN0X2ZwcmVncy5mcHJzLCAmZnB1LT5mcHJzLCBzaXplb2YoZnB1LT5mcHJzKSk7CiAJdmNwdS0+YXJjaC5ndWVzdF9mcHJlZ3MuZnBjID0gZnB1LT5mcGM7Ci0JdmNwdV9wdXQodmNwdSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2ZwdSAqZnB1KQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAltZW1jcHkoJmZwdS0+ZnBycywgJnZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwcnMsIHNpemVvZihmcHUtPmZwcnMpKTsKIAlmcHUtPmZwYyA9IHZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwYzsKLQl2Y3B1X3B1dCh2Y3B1KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDI3LDE0ICs0MTUsMTIgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JdmNwdV9sb2FkKHZjcHUpOwogCWlmIChhdG9taWNfcmVhZCgmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmNwdWZsYWdzKSAmIENQVVNUQVRfUlVOTklORykKIAkJcmMgPSAtRUJVU1k7CiAJZWxzZSB7CiAJCXZjcHUtPnJ1bi0+cHN3X21hc2sgPSBwc3cubWFzazsKIAkJdmNwdS0+cnVuLT5wc3dfYWRkciA9IHBzdy5hZGRyOwogCX0KLQl2Y3B1X3B1dCh2Y3B1KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ5OCw4ICs0ODQsNiBAQAogCWludCByYzsKIAlzaWdzZXRfdCBzaWdzYXZlZDsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogcmVydW5fdmNwdToKIAlpZiAodmNwdS0+cmVxdWVzdHMpCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9NTVVfUkVMT0FELCAmdmNwdS0+cmVxdWVzdHMpKQpAQCAtNTY4LDggKzU1Miw2IEBACiAJaWYgKHZjcHUtPnNpZ3NldF9hY3RpdmUpCiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc2lnc2F2ZWQsIE5VTEwpOwogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAl2Y3B1LT5zdGF0LmV4aXRfdXNlcnNwYWNlKys7CiAJcmV0dXJuIHJjOwogfQpAQCAtNTg5LDcgKzU3MSw3IEBACiAgKiBLVk1fUzM5MF9TVE9SRV9TVEFUVVNfTk9BRERSOiAtPiAweDEyMDAgb24gNjQgYml0CiAgKiBLVk1fUzM5MF9TVE9SRV9TVEFUVVNfUFJFRklYRUQ6IC0+IHByZWZpeAogICovCi1pbnQgX19rdm1fczM5MF92Y3B1X3N0b3JlX3N0YXR1cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcikKK2ludCBrdm1fczM5MF92Y3B1X3N0b3JlX3N0YXR1cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAljb25zdCB1bnNpZ25lZCBjaGFyIGFyY2htb2RlID0gMTsKIAlpbnQgcHJlZml4OwpAQCAtNjUxLDQ1ICs2MzMsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBrdm1fczM5MF92Y3B1X3N0b3JlX3N0YXR1cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlpbnQgcmM7Ci0KLQl2Y3B1X2xvYWQodmNwdSk7Ci0JcmMgPSBfX2t2bV9zMzkwX3ZjcHVfc3RvcmVfc3RhdHVzKHZjcHUsIGFkZHIpOwotCXZjcHVfcHV0KHZjcHUpOwotCXJldHVybiByYzsKLX0KLQogbG9uZyBrdm1fYXJjaF92Y3B1X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBpb2N0bCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWxvbmcgcjsKIAogCXN3aXRjaCAoaW9jdGwpIHsKIAljYXNlIEtWTV9TMzkwX0lOVEVSUlVQVDogewogCQlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0IHMzOTBpbnQ7CiAKKwkJciA9IC1FRkFVTFQ7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmczM5MGludCwgYXJncCwgc2l6ZW9mKHMzOTBpbnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3ZjcHUodmNwdSwgJnMzOTBpbnQpOworCQkJYnJlYWs7CisJCXIgPSBrdm1fczM5MF9pbmplY3RfdmNwdSh2Y3B1LCAmczM5MGludCk7CisJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9TMzkwX1NUT1JFX1NUQVRVUzoKLQkJcmV0dXJuIGt2bV9zMzkwX3ZjcHVfc3RvcmVfc3RhdHVzKHZjcHUsIGFyZyk7CisJCXIgPSBrdm1fczM5MF92Y3B1X3N0b3JlX3N0YXR1cyh2Y3B1LCBhcmcpOworCQlicmVhazsKIAljYXNlIEtWTV9TMzkwX1NFVF9JTklUSUFMX1BTVzogewogCQlwc3dfdCBwc3c7CiAKKwkJciA9IC1FRkFVTFQ7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmcHN3LCBhcmdwLCBzaXplb2YocHN3KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2luaXRpYWxfcHN3KHZjcHUsIHBzdyk7CisJCQlicmVhazsKKwkJciA9IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2luaXRpYWxfcHN3KHZjcHUsIHBzdyk7CisJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9TMzkwX0lOSVRJQUxfUkVTRVQ6Ci0JCXJldHVybiBrdm1fYXJjaF92Y3B1X2lvY3RsX2luaXRpYWxfcmVzZXQodmNwdSk7CisJCXIgPSBrdm1fYXJjaF92Y3B1X2lvY3RsX2luaXRpYWxfcmVzZXQodmNwdSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCTsKKwkJciA9IC1FSU5WQUw7CiAJfQotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByOwogfQogCiAvKiBTZWN0aW9uOiBtZW1vcnkgcmVsYXRlZCAqLwpAQCAtNzQ0LDExICs3MjMsNiBAQAogewogfQogCi1nZm5fdCB1bmFsaWFzX2dmbihzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKLXsKLQlyZXR1cm4gZ2ZuOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBrdm1fczM5MF9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaCBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAppbmRleCBjZmE5ZDE3Li5hN2I3NTg2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCkBAIC05Miw3ICs5Miw3IEBACiBpbnQga3ZtX3MzOTBfaGFuZGxlX3NpZ3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogLyogaW1wbGVtZW50ZWQgaW4ga3ZtLXMzOTAuYyAqLwotaW50IF9fa3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAoraW50IGt2bV9zMzkwX3ZjcHVfc3RvcmVfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyKTsKIC8qIGltcGxlbWVudGVkIGluIGRpYWcuYyAqLwogaW50IGt2bV9zMzkwX2hhbmRsZV9kaWFnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL01ha2VmaWxlIGIvYXJjaC9zY29yZS9NYWtlZmlsZQppbmRleCA2OGUwY2QwLi5kNzdkYzYzIDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL01ha2VmaWxlCisrKyBiL2FyY2gvc2NvcmUvTWFrZWZpbGUKQEAgLTIwLDcgKzIwLDggQEAKICMKIEtCVUlMRF9BRkxBR1MgKz0gJChjZmxhZ3MteSkKIEtCVUlMRF9DRkxBR1MgKz0gJChjZmxhZ3MteSkKLU1PREZMQUdTICs9IC1tbG9uZy1jYWxscworS0JVSUxEX0FGTEFHU19NT0RVTEUgKz0gLW1sb25nLWNhbGxzCitLQlVJTERfQ0ZMQUdTX01PRFVMRSArPSAtbWxvbmctY2FsbHMKIExERkxBR1MgKz0gLS1vZm9ybWF0IGVsZjMyLWxpdHRsZXNjb3JlCiBMREZMQUdTX3ZtbGludXgJKz0gLUcwIC1zdGF0aWMgLW5vc3RkbGliCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKaW5kZXggM2ExNzBiZC4uZGUzNzViNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJLmZvcm1hdF9uYW1lID0gIlVZVlkiLAogCS5mb3JtYXRfZGVwdGggPSAxNiwKIAkuZm9ybWF0ID0gewotCQkuY29kZSA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0JFLAorCQkuY29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMlg4LAogCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0sCiAJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKIAkJLndpZHRoID0gNjQwLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2Nsa2Rldi5jIGIvYXJjaC9zaC9rZXJuZWwvY2xrZGV2LmMKaW5kZXggZGVmZGQ2ZS4uYmVmYzI1NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY2xrZGV2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY2xrZGV2LmMKQEAgLTM2LDcgKzM2LDcgQEAKICAqICBJZiBhbiBlbnRyeSBoYXMgYSBkZXZpY2UgSUQsIGl0IG11c3QgbWF0Y2gKICAqICBJZiBhbiBlbnRyeSBoYXMgYSBjb25uZWN0aW9uIElELCBpdCBtdXN0IG1hdGNoCiAgKiBUaGVuIHdlIHRha2UgdGhlIG1vc3Qgc3BlY2lmaWMgZW50cnkgLSB3aXRoIHRoZSBmb2xsb3dpbmcKLSAqIG9yZGVyIG9mIHByZWNpZGVuY2U6IGRlditjb24gPiBkZXYgb25seSA+IGNvbiBvbmx5LgorICogb3JkZXIgb2YgcHJlY2VkZW5jZTogZGV2K2NvbiA+IGRldiBvbmx5ID4gY29uIG9ubHkuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfZmluZChjb25zdCBjaGFyICpkZXZfaWQsIGNvbnN0IGNoYXIgKmNvbl9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvc2gva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA4MWI2ZGU0Li43YTNkYzM1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0xODUsMTAgKzE4NSwxMCBAQAogCSAqIHRoaXMgaXMgdGhlIHNpbXBsZXN0IGFwcHJvYWNoIGZvciBtYWludGFpbmluZyBjb25zaXN0ZW5jeS4KIAkgKi8KIGFnYWluOgotCXByZXZfcmF3X2NvdW50ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wcmV2X2NvdW50KTsKKwlwcmV2X3Jhd19jb3VudCA9IGxvY2FsNjRfcmVhZCgmaHdjLT5wcmV2X2NvdW50KTsKIAluZXdfcmF3X2NvdW50ID0gc2hfcG11LT5yZWFkKGlkeCk7CiAKLQlpZiAoYXRvbWljNjRfY21weGNoZygmaHdjLT5wcmV2X2NvdW50LCBwcmV2X3Jhd19jb3VudCwKKwlpZiAobG9jYWw2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAogCQkJICAgICBuZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKIAkJZ290byBhZ2FpbjsKIApAQCAtMjAzLDcgKzIwMyw3IEBACiAJZGVsdGEgPSAobmV3X3Jhd19jb3VudCA8PCBzaGlmdCkgLSAocHJldl9yYXdfY291bnQgPDwgc2hpZnQpOwogCWRlbHRhID4+PSBzaGlmdDsKIAotCWF0b21pYzY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7CisJbG9jYWw2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOwogfQogCiBzdGF0aWMgdm9pZCBzaF9wbXVfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggMWNkMGQ5ZC4uNDkxZTlkNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMTgsNiArMTgsNyBAQAogY29uZmlnIFNQQVJDCiAJYm9vbAogCWRlZmF1bHQgeQorCXNlbGVjdCBPRgogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX09QUk9GSUxFCiAJc2VsZWN0IEhBVkVfQVJDSF9LR0RCIGlmICFTTVAgfHwgU1BBUkM2NApAQCAtMTQ1LDkgKzE0Niw2IEBACiBjb25maWcgQVJDSF9OT19WSVJUX1RPX0JVUwogCWRlZl9ib29sIHkKIAotY29uZmlnIE9GCi0JZGVmX2Jvb2wgeQotCiBjb25maWcgQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0MKIAlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9ib290L2J0Zml4dXBwcmVwLmMgYi9hcmNoL3NwYXJjL2Jvb3QvYnRmaXh1cHByZXAuYwppbmRleCBlN2YyOTQwLi5kYTAzMTE1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2Jvb3QvYnRmaXh1cHByZXAuYworKysgYi9hcmNoL3NwYXJjL2Jvb3QvYnRmaXh1cHByZXAuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCXN3aXRjaCAoYnVmZmVyW25iYXNlKzNdKSB7CiAJCWNhc2UgJ2YnOgogCQkJaWYgKGluaXR2YWwpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCB1c2UgcHJlLWluaXRhbGl6ZWQgZml4dXBzIGZvciBjYWxsc1xuJXNcbiIsIGJ1ZmZlcik7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgdXNlIHByZS1pbml0aWFsaXplZCBmaXh1cHMgZm9yIGNhbGxzXG4lc1xuIiwgYnVmZmVyKTsKIAkJCQlleGl0KDEpOwogCQkJfQogCQkJaWYgKCFzdHJjbXAgKHNlY3QsICJfX2tzeW10YWIiKSkgewpAQCAtMjczLDcgKzI3Myw3IEBACiAJCQlicmVhazsKIAkJY2FzZSAnaSc6CiAJCQlpZiAoaW5pdHZhbCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHVzZSBwcmUtaW5pdGFsaXplZCBmaXh1cHMgZm9yIElOVFxuJXNcbiIsIGJ1ZmZlcik7CisJCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgdXNlIHByZS1pbml0aWFsaXplZCBmaXh1cHMgZm9yIElOVFxuJXNcbiIsIGJ1ZmZlcik7CiAJCQkJZXhpdCgxKTsKIAkJCX0KIAkJCWlmIChzdHJuY21wIChidWZmZXIgKyBtb2RlKzksICJISTIyICAgICAgIiwgMTApICYmIHN0cm5jbXAgKGJ1ZmZlciArIG1vZGUrOSwgIkxPMTAgICAgICAiLCAxMCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RldmljZS5oCmluZGV4IGQ0YzQ1MjEuLmRhYTZhOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZGV2aWNlLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9kZXZpY2UuaApAQCAtNiwxOCArNiwyNSBAQAogI2lmbmRlZiBfQVNNX1NQQVJDX0RFVklDRV9ICiAjZGVmaW5lIF9BU01fU1BBUkNfREVWSUNFX0gKIAorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorCiBzdHJ1Y3QgZGV2aWNlX25vZGU7Ci1zdHJ1Y3Qgb2ZfZGV2aWNlOworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIAogc3RydWN0IGRldl9hcmNoZGF0YSB7CiAJdm9pZAkJCSppb21tdTsKIAl2b2lkCQkJKnN0YzsKIAl2b2lkCQkJKmhvc3RfY29udHJvbGxlcjsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlCSpvcDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpvcDsKIAlpbnQJCQludW1hX25vZGU7CiB9OwogCitleHRlcm4gdm9pZCBvZl9wcm9wYWdhdGVfYXJjaGRhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYnVzKTsKKwogc3RydWN0IHBkZXZfYXJjaGRhdGEgeworCXN0cnVjdCByZXNvdXJjZQkJcmVzb3VyY2VbUFJPTVJFR19NQVhdOworCXVuc2lnbmVkIGludAkJaXJxc1tQUk9NSU5UUl9NQVhdOworCWludAkJCW51bV9pcnFzOwogfTsKIAogI2VuZGlmIC8qIF9BU01fU1BBUkNfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV82NC5oCmluZGV4IDhmYWMzYWIuLjY1OTdjZTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfNjQuaApAQCAtNDMsNyArNDMsNyBAQAogLyogWW91J2xsIG9ubHkgZXZlciBmaW5kIG9uZSBjb250cm9sbGVyIG9uIGFuIFVsdHJhIGFueXdheXMuICovCiBzdGF0aWMgc3RydWN0IHN1bl9mbHB5X2NvbnRyb2xsZXIgKnN1bl9mZGMgPSAoc3RydWN0IHN1bl9mbHB5X2NvbnRyb2xsZXIgKiktMTsKIHVuc2lnbmVkIGxvbmcgZmRjX3N0YXR1czsKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlICpmbG9wcHlfb3AgPSBOVUxMOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmZsb3BweV9vcCA9IE5VTEw7CiAKIHN0cnVjdCBzdW5fZmxvcHB5X29wcyB7CiAJdW5zaWduZWQgY2hhcgkoKmZkX2luYikgKHVuc2lnbmVkIGxvbmcgcG9ydCk7CkBAIC01NDgsNyArNTQ4LDcgQEAKIHsKIAlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCXN0cnVjdCBvZl9kZXZpY2UgKm9wOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wOwogCWNvbnN0IGNoYXIgKnByb3A7CiAJY2hhciBzdGF0ZVsxMjhdOwogCkBAIC01NjcsNyArNTY3LDcgQEAKIAl9CiAJaWYgKG9wKSB7CiAJCWZsb3BweV9vcCA9IG9wOwotCQlGTE9QUFlfSVJRID0gb3AtPmlycXNbMF07CisJCUZMT1BQWV9JUlEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVidXNfZHA7CiAJCXZvaWQgX19pb21lbSAqYXV4aW9fcmVnOwpAQCAtNTkzLDcgKzU5Myw3IEBACiAJCWlmIChzdGF0ZV9wcm9wICYmICFzdHJuY21wKHN0YXRlX3Byb3AsICJkaXNhYmxlZCIsIDgpKQogCQkJcmV0dXJuIDA7CiAKLQkJRkxPUFBZX0lSUSA9IG9wLT5pcnFzWzBdOworCQlGTE9QUFlfSVJRID0gb3AtPmFyY2hkYXRhLmlycXNbMF07CiAKIAkJLyogTWFrZSBzdXJlIHRoZSBoaWdoIGRlbnNpdHkgYml0IGlzIHNldCwgc29tZSBzeXN0ZW1zCiAJCSAqIChtb3N0IG5vdGFibHkgVWx0cmE1L1VsdHJhMTApIGNvbWUgdXAgd2l0aCBpdCBjbGVhci4KQEAgLTY2MSw3ICs2NjEsNyBAQAogCQljb25maWcgPSAwOwogCQlmb3IgKGRwID0gZWJ1c19kcC0+Y2hpbGQ7IGRwOyBkcCA9IGRwLT5zaWJsaW5nKSB7CiAJCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgImVjcHAiKSkgewotCQkJCXN0cnVjdCBvZl9kZXZpY2UgKmVjcHBfb3A7CisJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZWNwcF9vcDsKIAogCQkJCWVjcHBfb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKIAkJCQlpZiAoZWNwcF9vcCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbG9jYWw2NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vZl9kZXZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyMDI0Ni4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NQQVJDX09GX0RFVklDRV9ICi0jZGVmaW5lIF9BU01fU1BBUkNfT0ZfREVWSUNFX0gKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgotCi0vKgotICogVGhlIG9mX2RldmljZSBpcyBhIGtpbmQgb2YgImJhc2UgY2xhc3MiIHRoYXQgaXMgYSBzdXBlcnNldCBvZgotICogc3RydWN0IGRldmljZSBmb3IgdXNlIGJ5IGRldmljZXMgYXR0YWNoZWQgdG8gYW4gT0Ygbm9kZSBhbmQKLSAqIHByb2JlZCB1c2luZyBPRiBwcm9wZXJ0aWVzLgotICovCi1zdHJ1Y3Qgb2ZfZGV2aWNlCi17Ci0Jc3RydWN0IGRldmljZQkJCWRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UJCQlyZXNvdXJjZVtQUk9NUkVHX01BWF07Ci0JdW5zaWduZWQgaW50CQkJaXJxc1tQUk9NSU5UUl9NQVhdOwotCWludAkJCQludW1faXJxczsKLQotCXZvaWQJCQkJKnN5c2RhdGE7Ci0KLQlpbnQJCQkJc2xvdDsKLQlpbnQJCQkJcG9ydGlkOwotCWludAkJCQljbG9ja19mcmVxOwotfTsKLQotZXh0ZXJuIHZvaWQgX19pb21lbSAqb2ZfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBvZl9pb3VubWFwKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiB2b2lkIG9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShzdHJ1Y3Qgb2ZfZGV2aWNlICpidXMpOwotCi0vKiBUaGlzIGlzIGp1c3QgaGVyZSBkdXJpbmcgdGhlIHRyYW5zaXRpb24gKi8KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotI2VuZGlmIC8qIF9BU01fU1BBUkNfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb2ZfcGxhdGZvcm0uaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb2ZfcGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkYTk5MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19PRl9QTEFURk9STV9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19PRl9QTEFURk9STV9ICi0vKgotICogICAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgotICoJCQkgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KLSAqICAgIE1vZGlmaWVkIGZvciBTcGFyYyBieSBtZXJnaW5nIHBhcnRzIG9mIGFzbS9vZl9kZXZpY2UuaAotICoJCWJ5IFN0ZXBoZW4gUm90aHdlbGwKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2RlZmluZSBvZl9idXNfdHlwZQlvZl9wbGF0Zm9ybV9idXNfdHlwZQkvKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFycG9ydC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKaW5kZXggYzMzM2I4ZC4uNGY3YWZhMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogCXJldHVybiBlYnVzX2RtYV9yZXNpZHVlKCZzcGFyY19lYnVzX2RtYXNbZG1hbnJdLmluZm8pOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlY3BwX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVjcHBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXVuc2lnbmVkIGxvbmcgYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKIAl1bnNpZ25lZCBsb25nIGNvbmZpZyA9IG9wLT5yZXNvdXJjZVsxXS5zdGFydDsKQEAgLTExNiw3ICsxMTYsNyBAQAogCXBhcmVudCA9IG9wLT5kZXYub2Zfbm9kZS0+cGFyZW50OwogCWlmICghc3RyY21wKHBhcmVudC0+bmFtZSwgImRtYSIpKSB7CiAJCXAgPSBwYXJwb3J0X3BjX3Byb2JlX3BvcnQoYmFzZSwgYmFzZSArIDB4NDAwLAotCQkJCQkgIG9wLT5pcnFzWzBdLCBQQVJQT1JUX0RNQV9OT0ZJRk8sCisJCQkJCSAgb3AtPmFyY2hkYXRhLmlycXNbMF0sIFBBUlBPUlRfRE1BX05PRklGTywKIAkJCQkJICBvcC0+ZGV2LnBhcmVudC0+cGFyZW50LCAwKTsKIAkJaWYgKCFwKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJICAgICAgIDAsIFBUUl9MUFRfUkVHX0RJUik7CiAKIAlwID0gcGFycG9ydF9wY19wcm9iZV9wb3J0KGJhc2UsIGJhc2UgKyAweDQwMCwKLQkJCQkgIG9wLT5pcnFzWzBdLAorCQkJCSAgb3AtPmFyY2hkYXRhLmlycXNbMF0sCiAJCQkJICBzbG90LAogCQkJCSAgb3AtPmRldi5wYXJlbnQsCiAJCQkJICAwKTsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGVjcHBfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQorc3RhdGljIGludCBfX2RldmV4aXQgZWNwcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCiB7CiAJc3RydWN0IHBhcnBvcnQgKnAgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOwogCWludCBzbG90ID0gcC0+ZG1hOwpAQCAtMjQzLDkgKzI0Myw3IEBACiAKIHN0YXRpYyBpbnQgcGFycG9ydF9wY19maW5kX25vbnBjaV9wb3J0cyhpbnQgYXV0b2lycSwgaW50IGF1dG9kbWEpCiB7Ci0Jb2ZfcmVnaXN0ZXJfZHJpdmVyKCZlY3BwX2RyaXZlciwgJm9mX2J1c190eXBlKTsKLQotCXJldHVybiAwOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmVjcHBfZHJpdmVyKTsKIH0KIAogI2VuZGlmIC8qICEoX0FTTV9TUEFSQzY0X1BBUlBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAppbmRleCA3ZTI2Njk4Li43NGM0ZTBjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtNiw3ICs2LDE1IEBACiAjZGVmaW5lCVBFUkZfRVZFTlRfSU5ERVhfT0ZGU0VUCTAKIAogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKwogZXh0ZXJuIHZvaWQgaW5pdF9od19wZXJmX2V2ZW50cyh2b2lkKTsKKworZXh0ZXJuIHZvaWQKK19fcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGlwLCBpbnQgc2tpcCk7CisKKyNkZWZpbmUgcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzKHB0X3JlZ3MsIGlwKQlcCisJX19wZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3MocHRfcmVncywgaXAsIDEpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2h3X3BlcmZfZXZlbnRzKHZvaWQpCXsgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IGY4NDU4MjguLjI5MWYxMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHJvbS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHJvbS5oCkBAIC00MywyMCArNDMsMjIgQEAKIGV4dGVybiBpbnQgb2ZfZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwgaW50IGxlbik7CiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBpbnQgb2Zfbm9kZV90b19uaWQoc3RydWN0IGRldmljZV9ub2RlICpkcCk7Ci0jZWxzZQotI2RlZmluZSBvZl9ub2RlX3RvX25pZChkcCkJKC0xKQorI2RlZmluZSBvZl9ub2RlX3RvX25pZCBvZl9ub2RlX3RvX25pZAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIHByb21fYnVpbGRfZGV2aWNldHJlZSh2b2lkKTsKIGV4dGVybiB2b2lkIG9mX3BvcHVsYXRlX3ByZXNlbnRfbWFzayh2b2lkKTsKIGV4dGVybiB2b2lkIG9mX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCk7CiAKK3N0cnVjdCByZXNvdXJjZTsKK2V4dGVybiB2b2lkIF9faW9tZW0gKm9mX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgb2ZfaW91bm1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpOworCiAvKiBUaGVzZSByb3V0aW5lcyBhcmUgaGVyZSB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgd2l0aCBob3cgcG93ZXJwYwogICogaGFuZGxlcyBJUlEgbWFwcGluZyBmb3IgT0YgZGV2aWNlIG5vZGVzLiAgV2UgcHJlY29tcHV0ZSBhbmQgcGVybWFuZW50bHkKLSAqIHJlZ2lzdGVyIHRoZW0gaW4gdGhlIG9mX2RldmljZSBvYmplY3RzLCB3aGVyZWFzIHBvd2VycGMgY29tcHV0ZXMgdGhlbQorICogcmVnaXN0ZXIgdGhlbSBpbiB0aGUgcGxhdGZvcm1fZGV2aWNlIG9iamVjdHMsIHdoZXJlYXMgcG93ZXJwYyBjb21wdXRlcyB0aGVtCiAgKiBvbiByZXF1ZXN0LgogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGlycV9vZl9wYXJzZV9hbmRfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGluZGV4KTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZGlzcG9zZV9tYXBwaW5nKHVuc2lnbmVkIGludCB2aXJxKQogewogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXBjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYwppbmRleCBiMjc0NzZjLi4yYzAwNDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYwpAQCAtNjgsNyArNjgsNyBAQAogI2VuZGlmCiB9IAogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXBjX2ZyZWUoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgaW5saW5lIHZvaWQgYXBjX2ZyZWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCiB7CiAJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCByZWdzLCByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pKTsKIH0KQEAgLTEzNiw3ICsxMzYsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXBjX21pc2NkZXYgPSB7IEFQQ19NSU5PUiwgQVBDX0RFVk5BTUUsICZhcGNfZm9wcyB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhcGNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhcGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJaW50IGVycjsKQEAgLTE4NCw3ICsxODQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhcGNfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmFwY19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYXBjX2RyaXZlcik7CiB9CiAKIC8qIFRoaXMgZHJpdmVyIGlzIG5vdCBjcml0aWNhbCB0byB0aGUgYm9vdCBwcm9jZXNzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fNjQuYwppbmRleCBkZGM4NDEyLi4zZWZkM2M1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzY0LmMKQEAgLTEwMiw3ICsxMDIsOCBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdXhpb19tYXRjaCk7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGF1eGlvX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdXhpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPmRldi5vZl9ub2RlOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKQEAgLTE0Miw3ICsxNDMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhdXhpb19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYXV4aW9fZHJpdmVyLCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmF1eGlvX2RyaXZlcik7CiB9CiAKIC8qIE11c3QgYmUgYWZ0ZXIgc3Vic3lzX2luaXRjYWxsKCkgc28gdGhhdCBidXNzZXMgYXJlIHByb2JlZC4gIE11c3QKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NlbnRyYWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NlbnRyYWwuYwppbmRleCA0MzQzMzVmLi5jZmEyNjI0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9jZW50cmFsLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2VudHJhbC5jCkBAIC01OSw3ICs1OSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjbG9ja19ib2FyZF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNsb2NrX2JvYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgY2xvY2tfYm9hcmQgKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGZoY19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZoY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZmhjICpwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKQEAgLTI2NSw4ICsyNjUsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzdW5maXJlX2luaXQodm9pZCkKIHsKLQkodm9pZCkgb2ZfcmVnaXN0ZXJfZHJpdmVyKCZmaGNfZHJpdmVyLCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOwotCSh2b2lkKSBvZl9yZWdpc3Rlcl9kcml2ZXIoJmNsb2NrX2JvYXJkX2RyaXZlciwgJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKKwkodm9pZCkgb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmaGNfZHJpdmVyKTsKKwkodm9pZCkgb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZjbG9ja19ib2FyZF9kcml2ZXIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMKaW5kZXggODcwY2I2NS4uMDhjNDY2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvY2htYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2NobWMuYwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBqYnVzbWNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBqYnVzbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqbWVtX3JlZ3M7CkBAIC02OTAsNyArNjkwLDcgQEAKIAkJCQkgICAgICBjaG1jX3JlYWRfbWNyZWcocCwgQ0hNQ1RSTF9ERUNPREU0KSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNobWNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaG1jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLAogCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+ZGV2Lm9mX25vZGU7CkBAIC03NjUsNyArNzY1LDcgQEAKIAlnb3RvIG91dDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgdXMzbWNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1czNtY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlpZiAobWNfdHlwZSA9PSBNQ19UWVBFX1NBRkFSSSkKQEAgLTc3NSwyMSArNzc1LDIxIEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjaG1jX2Rlc3Ryb3koc3RydWN0IG9mX2RldmljZSAqb3AsIHN0cnVjdCBjaG1jICpwKQorc3RhdGljIHZvaWQgX19kZXZleGl0IGNobWNfZGVzdHJveShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwgc3RydWN0IGNobWMgKnApCiB7CiAJbGlzdF9kZWwoJnAtPmxpc3QpOwogCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcC0+cmVncywgMHg0OCk7CiAJa2ZyZWUocCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBqYnVzbWNfZGVzdHJveShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgc3RydWN0IGpidXNtYyAqcCkKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBqYnVzbWNfZGVzdHJveShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwgc3RydWN0IGpidXNtYyAqcCkKIHsKIAltY19saXN0X2RlbCgmcC0+bGlzdCk7CiAJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCBKQlVTTUNfUkVHU19TSVpFKTsKIAlrZnJlZShwKTsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgdXMzbWNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQorc3RhdGljIGludCBfX2RldmV4aXQgdXMzbWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQogewogCXZvaWQgKnAgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOwogCkBAIC04NDgsNyArODQ4LDcgQEAKIAlyZXQgPSByZWdpc3Rlcl9kaW1tX3ByaW50ZXIodXMzbWNfZGltbV9wcmludGVyKTsKIAogCWlmICghcmV0KSB7Ci0JCXJldCA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmdXMzbWNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCQlyZXQgPSBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnVzM21jX2RyaXZlcik7CiAJCWlmIChyZXQpCiAJCQl1bnJlZ2lzdGVyX2RpbW1fcHJpbnRlcih1czNtY19kaW1tX3ByaW50ZXIpOwogCX0KQEAgLTg1OSw3ICs4NTksNyBAQAogewogCWlmICh1czNtY19wbGF0Zm9ybSgpKSB7CiAJCXVucmVnaXN0ZXJfZGltbV9wcmludGVyKHVzM21jX2RpbW1fcHJpbnRlcik7Ci0JCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZ1czNtY19kcml2ZXIpOworCQlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdXMzbWNfZHJpdmVyKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2hlbHBlcnMuUyBiL2FyY2gvc3BhcmMva2VybmVsL2hlbHBlcnMuUwppbmRleCA5MjA5MGNjLi42ODJmZWUwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9oZWxwZXJzLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaGVscGVycy5TCkBAIC00Nyw5ICs0Nyw5IEBACiAJLnNpemUJCXN0YWNrX3RyYWNlX2ZsdXNoLC4tc3RhY2tfdHJhY2VfZmx1c2gKIAogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUwotCS5nbG9ibAkJcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzCi0JLnR5cGUJCXBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncywjZnVuY3Rpb24KLXBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVnczoKKwkuZ2xvYmwJCV9fcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzCisJLnR5cGUJCV9fcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzLCNmdW5jdGlvbgorX19wZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3M6CiAJLyogV2UgYWx3YXlzIHJlYWQgdGhlICVwc3RhdGUgaW50byAlbzUgc2luY2Ugd2Ugd2lsbCB1c2UKIAkgKiB0aGF0IHRvIGNvbnN0cnVjdCBhIGZha2UgJXRzdGF0ZSB0byBzdG9yZSBpbnRvIHRoZSByZWdzLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYwppbmRleCA3MDNlNGFhLi40MWY3ZTRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiBzdGF0aWMgdm9pZCAqc2J1c19hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBsZW4sCiAJCQkJIGRtYV9hZGRyX3QgKmRtYV9hZGRycCwgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGxlbl90b3RhbCA9IChsZW4gKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0s7CiAJdW5zaWduZWQgbG9uZyB2YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzMyLmMKaW5kZXggNDdlNjNmMS4uMmQwNTVhMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzMyLmMKQEAgLTI0MSwxMCArMjQxLDEwIEBACiAKIHN0YXRpYyBpbnQgb2ZfcmVzb3VyY2VfdmVyYm9zZTsKIAotc3RhdGljIHZvaWQgX19pbml0IGJ1aWxkX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgdm9pZCBfX2luaXQgYnVpbGRfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqcF9vcDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwX29wOwogCXN0cnVjdCBvZl9idXMgKmJ1czsKIAlpbnQgbmEsIG5zOwogCWludCBpbmRleCwgbnVtX3JlZzsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCWlmICghcGFyZW50KQogCQlyZXR1cm47CiAKLQlwX29wID0gdG9fb2ZfZGV2aWNlKHBhcmVudCk7CisJcF9vcCA9IHRvX3BsYXRmb3JtX2RldmljZShwYXJlbnQpOwogCWJ1cyA9IG9mX21hdGNoX2J1cyhwX29wLT5kZXYub2Zfbm9kZSk7CiAJYnVzLT5jb3VudF9jZWxscyhvcC0+ZGV2Lm9mX25vZGUsICZuYSwgJm5zKTsKIApAQCAtMjY3LDYgKzI2Nyw4IEBACiAJLyogQ29udmVyIHRvIG51bS1lbnRyaWVzLiAgKi8KIAludW1fcmVnIC89IG5hICsgbnM7CiAKKwlvcC0+cmVzb3VyY2UgPSBvcC0+YXJjaGRhdGEucmVzb3VyY2U7CisJb3AtPm51bV9yZXNvdXJjZXMgPSBudW1fcmVnOwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bV9yZWc7IGluZGV4KyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyID0gJm9wLT5yZXNvdXJjZVtpbmRleF07CiAJCXUzMiBhZGRyW09GX01BWF9BRERSX0NFTExTXTsKQEAgLTMzMywxMCArMzM1LDEwIEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZSAqIF9faW5pdCBzY2FuX29uZV9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpkcCwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICogX19pbml0IHNjYW5fb25lX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAogCQkJCQkJIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGt6YWxsb2Moc2l6ZW9mKCpvcCksIEdGUF9LRVJORUwpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0ga3phbGxvYyhzaXplb2YoKm9wKSwgR0ZQX0tFUk5FTCk7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaW50cjsKIAlzdHJ1Y3QgZGV2X2FyY2hkYXRhICpzZDsKIAlpbnQgbGVuLCBpOwpAQCAtMzQ5LDI3ICszNTEsMjEgQEAKIAogCW9wLT5kZXYub2Zfbm9kZSA9IGRwOwogCi0Jb3AtPmNsb2NrX2ZyZXEgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLAotCQkJCQkgICAgICAgKDI1KjEwMDAqMTAwMCkpOwotCW9wLT5wb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJ1cGEtcG9ydGlkIiwgLTEpOwotCWlmIChvcC0+cG9ydGlkID09IC0xKQotCQlvcC0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgLTEpOwotCiAJaW50ciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImludHIiLCAmbGVuKTsKIAlpZiAoaW50cikgewotCQlvcC0+bnVtX2lycXMgPSBsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21faXJxcyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBvcC0+bnVtX2lycXM7IGkrKykKLQkJCW9wLT5pcnFzW2ldID0gaW50cltpXS5wcmk7CisJCW9wLT5hcmNoZGF0YS5udW1faXJxcyA9IGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9pcnFzKTsKKwkJZm9yIChpID0gMDsgaSA8IG9wLT5hcmNoZGF0YS5udW1faXJxczsgaSsrKQorCQkJb3AtPmFyY2hkYXRhLmlycXNbaV0gPSBpbnRyW2ldLnByaTsKIAl9IGVsc2UgewogCQljb25zdCB1bnNpZ25lZCBpbnQgKmlycSA9CiAJCQlvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgJmxlbik7CiAKIAkJaWYgKGlycSkgewotCQkJb3AtPm51bV9pcnFzID0gbGVuIC8gc2l6ZW9mKHVuc2lnbmVkIGludCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgb3AtPm51bV9pcnFzOyBpKyspCi0JCQkJb3AtPmlycXNbaV0gPSBpcnFbaV07CisJCQlvcC0+YXJjaGRhdGEubnVtX2lycXMgPSBsZW4gLyBzaXplb2YodW5zaWduZWQgaW50KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBvcC0+YXJjaGRhdGEubnVtX2lycXM7IGkrKykKKwkJCQlvcC0+YXJjaGRhdGEuaXJxc1tpXSA9IGlycVtpXTsKIAkJfSBlbHNlIHsKLQkJCW9wLT5udW1faXJxcyA9IDA7CisJCQlvcC0+YXJjaGRhdGEubnVtX2lycXMgPSAwOwogCQl9CiAJfQogCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKQEAgLTQxMSw4ICs0MDcsOCBAQAogCQkJZ290byBidWlsZF9yZXNvdXJjZXM7CiAJCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgb3AtPm51bV9pcnFzOyBpKyspIHsKLQkJCWludCB0aGlzX2lycSA9IG9wLT5pcnFzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgb3AtPmFyY2hkYXRhLm51bV9pcnFzOyBpKyspIHsKKwkJCWludCB0aGlzX2lycSA9IG9wLT5hcmNoZGF0YS5pcnFzW2ldOwogCQkJaW50IHNidXNsID0gcGlsX3RvX3NidXNbdGhpc19pcnFdOwogCiAJCQlpZiAoc2J1c2wpCkBAIC00MjAsNyArNDE2LDcgQEAKIAkJCQkJICAgIChzYnVzbCA8PCAyKSArCiAJCQkJCSAgICBzbG90KTsKIAotCQkJb3AtPmlycXNbaV0gPSB0aGlzX2lycTsKKwkJCW9wLT5hcmNoZGF0YS5pcnFzW2ldID0gdGhpc19pcnE7CiAJCX0KIAl9CiAKQEAgLTQyOCw3ICs0MjQsNyBAQAogCWJ1aWxkX2RldmljZV9yZXNvdXJjZXMob3AsIHBhcmVudCk7CiAKIAlvcC0+ZGV2LnBhcmVudCA9IHBhcmVudDsKLQlvcC0+ZGV2LmJ1cyA9ICZvZl9wbGF0Zm9ybV9idXNfdHlwZTsKKwlvcC0+ZGV2LmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZTsKIAlpZiAoIXBhcmVudCkKIAkJZGV2X3NldF9uYW1lKCZvcC0+ZGV2LCAicm9vdCIpOwogCWVsc2UKQEAgLTQ0Nyw3ICs0NDMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNjYW5fdHJlZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7CiAJd2hpbGUgKGRwKSB7Ci0JCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gc2Nhbl9vbmVfZGV2aWNlKGRwLCBwYXJlbnQpOworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCA9IHNjYW5fb25lX2RldmljZShkcCwgcGFyZW50KTsKIAogCQlpZiAob3ApCiAJCQlzY2FuX3RyZWUoZHAtPmNoaWxkLCAmb3AtPmRldik7CkBAIC00NTYsMzAgKzQ1MiwxOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNjYW5fb2ZfZGV2aWNlcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2Nhbl9vZl9kZXZpY2VzKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFyZW50OwogCiAJcGFyZW50ID0gc2Nhbl9vbmVfZGV2aWNlKHJvb3QsIE5VTEwpOwogCWlmICghcGFyZW50KQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJc2Nhbl90cmVlKHJvb3QtPmNoaWxkLCAmcGFyZW50LT5kZXYpOworCXJldHVybiAwOwogfQotCi1zdGF0aWMgaW50IF9faW5pdCBvZl9idXNfZHJpdmVyX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gb2ZfYnVzX3R5cGVfaW5pdCgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICJvZiIpOwotCWlmICghZXJyKQotCQlzY2FuX29mX2RldmljZXMoKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKG9mX2J1c19kcml2ZXJfaW5pdCk7Citwb3N0Y29yZV9pbml0Y2FsbChzY2FuX29mX2RldmljZXMpOwogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9kZWJ1ZyhjaGFyICpzdHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCmluZGV4IDFkYWU4MDcuLjYzY2Q0ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCkBAIC0zMTAsMTAgKzMxMCwxMCBAQAogCiBzdGF0aWMgaW50IG9mX3Jlc291cmNlX3ZlcmJvc2U7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBidWlsZF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorc3RhdGljIHZvaWQgX19pbml0IGJ1aWxkX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCiAJCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQogewotCXN0cnVjdCBvZl9kZXZpY2UgKnBfb3A7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcF9vcDsKIAlzdHJ1Y3Qgb2ZfYnVzICpidXM7CiAJaW50IG5hLCBuczsKIAlpbnQgaW5kZXgsIG51bV9yZWc7CkBAIC0zMjIsNyArMzIyLDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuOwogCi0JcF9vcCA9IHRvX29mX2RldmljZShwYXJlbnQpOworCXBfb3AgPSB0b19wbGF0Zm9ybV9kZXZpY2UocGFyZW50KTsKIAlidXMgPSBvZl9tYXRjaF9idXMocF9vcC0+ZGV2Lm9mX25vZGUpOwogCWJ1cy0+Y291bnRfY2VsbHMob3AtPmRldi5vZl9ub2RlLCAmbmEsICZucyk7CiAKQEAgLTM0NCw2ICszNDQsOCBAQAogCQludW1fcmVnID0gUFJPTVJFR19NQVg7CiAJfQogCisJb3AtPnJlc291cmNlID0gb3AtPmFyY2hkYXRhLnJlc291cmNlOworCW9wLT5udW1fcmVzb3VyY2VzID0gbnVtX3JlZzsKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1fcmVnOyBpbmRleCsrKSB7CiAJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZvcC0+cmVzb3VyY2VbaW5kZXhdOwogCQl1MzIgYWRkcltPRl9NQVhfQUREUl9DRUxMU107CkBAIC01MjYsNyArNTI4LDcgQEAKIAogc3RhdGljIGludCBvZl9pcnFfdmVyYm9zZTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYnVpbGRfb25lX2RldmljZV9pcnEoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBidWlsZF9vbmVfZGV2aWNlX2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQkJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCQkJCXVuc2lnbmVkIGludCBpcnEpCiB7CkBAIC02MjgsMTAgKzYzMCwxMCBAQAogCXJldHVybiBpcnE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlICogX19pbml0IHNjYW5fb25lX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBfX2luaXQgc2Nhbl9vbmVfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCiAJCQkJCQkgc3RydWN0IGRldmljZSAqcGFyZW50KQogewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0ga3phbGxvYyhzaXplb2YoKm9wKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AgPSBremFsbG9jKHNpemVvZigqb3ApLCBHRlBfS0VSTkVMKTsKIAljb25zdCB1bnNpZ25lZCBpbnQgKmlycTsKIAlzdHJ1Y3QgZGV2X2FyY2hkYXRhICpzZDsKIAlpbnQgbGVuLCBpOwpAQCAtNjQ0LDM0ICs2NDYsMjggQEAKIAogCW9wLT5kZXYub2Zfbm9kZSA9IGRwOwogCi0Jb3AtPmNsb2NrX2ZyZXEgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLAotCQkJCQkgICAgICAgKDI1KjEwMDAqMTAwMCkpOwotCW9wLT5wb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJ1cGEtcG9ydGlkIiwgLTEpOwotCWlmIChvcC0+cG9ydGlkID09IC0xKQotCQlvcC0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgLTEpOwotCiAJaXJxID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0cyIsICZsZW4pOwogCWlmIChpcnEpIHsKLQkJb3AtPm51bV9pcnFzID0gbGVuIC8gNDsKKwkJb3AtPmFyY2hkYXRhLm51bV9pcnFzID0gbGVuIC8gNDsKIAogCQkvKiBQcmV2ZW50IG92ZXJydW5uaW5nIHRoZSBvcC0+aXJxc1tdIGFycmF5LiAgKi8KLQkJaWYgKG9wLT5udW1faXJxcyA+IFBST01JTlRSX01BWCkgeworCQlpZiAob3AtPmFyY2hkYXRhLm51bV9pcnFzID4gUFJPTUlOVFJfTUFYKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG1hbnkgaXJxcyAoJWQpLCAiCiAJCQkgICAgICAgImxpbWl0aW5nIHRvICVkLlxuIiwKLQkJCSAgICAgICBkcC0+ZnVsbF9uYW1lLCBvcC0+bnVtX2lycXMsIFBST01JTlRSX01BWCk7Ci0JCQlvcC0+bnVtX2lycXMgPSBQUk9NSU5UUl9NQVg7CisJCQkgICAgICAgZHAtPmZ1bGxfbmFtZSwgb3AtPmFyY2hkYXRhLm51bV9pcnFzLCBQUk9NSU5UUl9NQVgpOworCQkJb3AtPmFyY2hkYXRhLm51bV9pcnFzID0gUFJPTUlOVFJfTUFYOwogCQl9Ci0JCW1lbWNweShvcC0+aXJxcywgaXJxLCBvcC0+bnVtX2lycXMgKiA0KTsKKwkJbWVtY3B5KG9wLT5hcmNoZGF0YS5pcnFzLCBpcnEsIG9wLT5hcmNoZGF0YS5udW1faXJxcyAqIDQpOwogCX0gZWxzZSB7Ci0JCW9wLT5udW1faXJxcyA9IDA7CisJCW9wLT5hcmNoZGF0YS5udW1faXJxcyA9IDA7CiAJfQogCiAJYnVpbGRfZGV2aWNlX3Jlc291cmNlcyhvcCwgcGFyZW50KTsKLQlmb3IgKGkgPSAwOyBpIDwgb3AtPm51bV9pcnFzOyBpKyspCi0JCW9wLT5pcnFzW2ldID0gYnVpbGRfb25lX2RldmljZV9pcnEob3AsIHBhcmVudCwgb3AtPmlycXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBvcC0+YXJjaGRhdGEubnVtX2lycXM7IGkrKykKKwkJb3AtPmFyY2hkYXRhLmlycXNbaV0gPSBidWlsZF9vbmVfZGV2aWNlX2lycShvcCwgcGFyZW50LCBvcC0+YXJjaGRhdGEuaXJxc1tpXSk7CiAKIAlvcC0+ZGV2LnBhcmVudCA9IHBhcmVudDsKLQlvcC0+ZGV2LmJ1cyA9ICZvZl9wbGF0Zm9ybV9idXNfdHlwZTsKKwlvcC0+ZGV2LmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZTsKIAlpZiAoIXBhcmVudCkKIAkJZGV2X3NldF9uYW1lKCZvcC0+ZGV2LCAicm9vdCIpOwogCWVsc2UKQEAgLTY5MCw3ICs2ODYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNjYW5fdHJlZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7CiAJd2hpbGUgKGRwKSB7Ci0JCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gc2Nhbl9vbmVfZGV2aWNlKGRwLCBwYXJlbnQpOworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCA9IHNjYW5fb25lX2RldmljZShkcCwgcGFyZW50KTsKIAogCQlpZiAob3ApCiAJCQlzY2FuX3RyZWUoZHAtPmNoaWxkLCAmb3AtPmRldik7CkBAIC02OTksMzAgKzY5NSwxOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNjYW5fb2ZfZGV2aWNlcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2Nhbl9vZl9kZXZpY2VzKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFyZW50OwogCiAJcGFyZW50ID0gc2Nhbl9vbmVfZGV2aWNlKHJvb3QsIE5VTEwpOwogCWlmICghcGFyZW50KQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJc2Nhbl90cmVlKHJvb3QtPmNoaWxkLCAmcGFyZW50LT5kZXYpOworCXJldHVybiAwOwogfQotCi1zdGF0aWMgaW50IF9faW5pdCBvZl9idXNfZHJpdmVyX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gb2ZfYnVzX3R5cGVfaW5pdCgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICJvZiIpOwotCWlmICghZXJyKQotCQlzY2FuX29mX2RldmljZXMoKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKG9mX2J1c19kcml2ZXJfaW5pdCk7Citwb3N0Y29yZV9pbml0Y2FsbChzY2FuX29mX2RldmljZXMpOwogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9kZWJ1ZyhjaGFyICpzdHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMKaW5kZXggMTBjNmMzNi4uNDlkZGZmNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV9jb21tb24uYwpAQCAtMTEsNDggKzExLDI4IEBACiAKICNpbmNsdWRlICJvZl9kZXZpY2VfY29tbW9uLmgiCiAKLXN0YXRpYyBpbnQgbm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqb3AgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZGF0YTsKLQotCXJldHVybiAob3AtPmRldi5vZl9ub2RlID09IGRwKTsKLX0KLQotc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGJ1c19maW5kX2RldmljZSgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsCi0JCQkJCSAgICAgZHAsIG5vZGVfbWF0Y2gpOwotCi0JaWYgKGRldikKLQkJcmV0dXJuIHRvX29mX2RldmljZShkZXYpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUpOwotCiB1bnNpZ25lZCBpbnQgaXJxX29mX3BhcnNlX2FuZF9tYXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5vZGUpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShub2RlKTsKIAotCWlmICghb3AgfHwgaW5kZXggPj0gb3AtPm51bV9pcnFzKQorCWlmICghb3AgfHwgaW5kZXggPj0gb3AtPmFyY2hkYXRhLm51bV9pcnFzKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBvcC0+aXJxc1tpbmRleF07CisJcmV0dXJuIG9wLT5hcmNoZGF0YS5pcnFzW2luZGV4XTsKIH0KIEVYUE9SVF9TWU1CT0woaXJxX29mX3BhcnNlX2FuZF9tYXApOwogCiAvKiBUYWtlIHRoZSBhcmNoZGF0YSB2YWx1ZXMgZm9yIElPTU1VLCBTVEMsIGFuZCBIT1NUREFUQSBmb3VuZCBpbgotICogQlVTIGFuZCBwcm9wYWdhdGUgdG8gYWxsIGNoaWxkIG9mX2RldmljZSBvYmplY3RzLgorICogQlVTIGFuZCBwcm9wYWdhdGUgdG8gYWxsIGNoaWxkIHBsYXRmb3JtX2RldmljZSBvYmplY3RzLgogICovCi12b2lkIG9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShzdHJ1Y3Qgb2ZfZGV2aWNlICpidXMpCit2b2lkIG9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpidXMpCiB7CiAJc3RydWN0IGRldl9hcmNoZGF0YSAqYnVzX3NkID0gJmJ1cy0+ZGV2LmFyY2hkYXRhOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzX2RwID0gYnVzLT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCiAJZm9yIChkcCA9IGJ1c19kcC0+Y2hpbGQ7IGRwOyBkcCA9IGRwLT5zaWJsaW5nKSB7Ci0JCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CiAKIAkJb3AtPmRldi5hcmNoZGF0YS5pb21tdSA9IGJ1c19zZC0+aW9tbXU7CiAJCW9wLT5kZXYuYXJjaGRhdGEuc3RjID0gYnVzX3NkLT5zdGM7CkBAIC02NCw5ICs0NCw2IEBACiAJfQogfQogCi1zdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGU7Ci1FWFBPUlRfU1lNQk9MKG9mX3BsYXRmb3JtX2J1c190eXBlKTsKLQogc3RhdGljIHZvaWQgZ2V0X2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCiB7CiAJaWYgKGFkZHJjKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCA4YTgzNjNhLi40MTM3NTc5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAgKiBpbnRvIHBoeXNpY2FsIGFkZHJlc3MgcmVzb3VyY2VzLCB3ZSBvbmx5IGhhdmUgdG8gZmlndXJlIG91dCB0aGUgcmVnaXN0ZXIKICAqIG1hcHBpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIHBjaV9wYXJzZV9vZl9hZGRycyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKK3N0YXRpYyB2b2lkIHBjaV9wYXJzZV9vZl9hZGRycyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTI0OCw3ICsyNDgsNyBAQAogewogCXN0cnVjdCBkZXZfYXJjaGRhdGEgKnNkOwogCXN0cnVjdCBwY2lfc2xvdCAqc2xvdDsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCWNvbnN0IGNoYXIgKnR5cGU7CiAJdTMyIGNsYXNzOwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJCWRldi0+aGRyX3R5cGUgPSBQQ0lfSEVBREVSX1RZUEVfTk9STUFMOwogCQlkZXYtPnJvbV9iYXNlX3JlZyA9IFBDSV9ST01fQUREUkVTUzsKIAotCQlkZXYtPmlycSA9IHNkLT5vcC0+aXJxc1swXTsKKwkJZGV2LT5pcnEgPSBzZC0+b3AtPmFyY2hkYXRhLmlycXNbMF07CiAJCWlmIChkZXYtPmlycSA9PSAweGZmZmZmZmZmKQogCQkJZGV2LT5pcnEgPSBQQ0lfSVJRX05PTkU7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ZpcmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9maXJlLmMKaW5kZXggNTFjZmEwOS4uZWZiODk2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ZpcmUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfZmlyZS5jCkBAIC00MTAsNyArNDEwLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcGNpX2ZpcmVfcGJtX2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCSAgICAgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgdTMyIHBvcnRpZCkKKwkJCQkgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsIHUzMiBwb3J0aWQpCiB7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5kZXYub2Zfbm9kZTsKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBmaXJlX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorc3RhdGljIGludCBfX2RldmluaXQgZmlyZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPmRldi5vZl9ub2RlOwpAQCAtNTE4LDcgKzUxOCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGZpcmVfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmZpcmVfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZpcmVfZHJpdmVyKTsKIH0KIAogc3Vic3lzX2luaXRjYWxsKGZpcmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfaW1wbC5oIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ltcGwuaAppbmRleCAwMzE4NjgyLi5lMjBlZDVmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfaW1wbC5oCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9pbXBsLmgKQEAgLTkxLDcgKzkxLDcgQEAKIAljaGFyCQkJCSpuYW1lOwogCiAJLyogT0JQIHNwZWNpZmljIGluZm9ybWF0aW9uLiAqLwotCXN0cnVjdCBvZl9kZXZpY2UJCSpvcDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqb3A7CiAJdTY0CQkJCWlub19iaXRtYXA7CiAKIAkvKiBQQk0gSS9PIGFuZCBNZW1vcnkgc3BhY2UgcmVzb3VyY2VzLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCmluZGV4IDU1OGE3MDUuLjIyZWFiN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfcHN5Y2hvLmMKQEAgLTI4NSw3ICsyODUsNyBAQAogI2RlZmluZSAgUFNZQ0hPX0VDQ0NUUkxfQ0UJIDB4MjAwMDAwMDAwMDAwMDAwMFVMIC8qIEVuYWJsZSBDRSBJTnRlcnJ1cHRzICovCiBzdGF0aWMgdm9pZCBwc3ljaG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwYm0tPm9wLT5kZXYub2Zfbm9kZSk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKHBibS0+b3AtPmRldi5vZl9ub2RlKTsKIAl1bnNpZ25lZCBsb25nIGJhc2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVnczsKIAl1NjQgdG1wOwogCWludCBlcnI7CkBAIC0zMDIsMjMgKzMwMiwyMyBAQAogCSAqIDU6IFBPV0VSIE1BTkFHRU1FTlQKIAkgKi8KIAotCWlmIChvcC0+bnVtX2lycXMgPCA2KQorCWlmIChvcC0+YXJjaGRhdGEubnVtX2lycXMgPCA2KQogCQlyZXR1cm47CiAKIAkvKiBXZSByZWFsbHkgbWVhbiB0byBpZ25vcmUgdGhlIHJldHVybiByZXN1bHQgaGVyZS4gIFR3bwogCSAqIFBDSSBjb250cm9sbGVyIHNoYXJlIHRoZSBzYW1lIGludGVycnVwdCBudW1iZXJzIGFuZAogCSAqIGRyaXZlIHRoZSBzYW1lIGZyb250LWVuZCBoYXJkd2FyZS4KIAkgKi8KLQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1sxXSwgcHN5Y2hvX3VlX2ludHIsIElSUUZfU0hBUkVELAorCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzFdLCBwc3ljaG9fdWVfaW50ciwgSVJRRl9TSEFSRUQsCiAJCQkgICJQU1lDSE9fVUUiLCBwYm0pOwotCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzJdLCBwc3ljaG9fY2VfaW50ciwgSVJRRl9TSEFSRUQsCisJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMl0sIHBzeWNob19jZV9pbnRyLCBJUlFGX1NIQVJFRCwKIAkJCSAgIlBTWUNIT19DRSIsIHBibSk7CiAKIAkvKiBUaGlzIG9uZSwgaG93ZXZlciwgb3VnaHQgbm90IHRvIGZhaWwuICBXZSBjYW4ganVzdCB3YXJuCiAJICogYWJvdXQgaXQgc2luY2UgdGhlIHN5c3RlbSBjYW4gc3RpbGwgb3BlcmF0ZSBwcm9wZXJseSBldmVuCiAJICogaWYgdGhpcyBmYWlscy4KIAkgKi8KLQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1swXSwgcHN5Y2hvX3BjaWVycl9pbnRyLCBJUlFGX1NIQVJFRCwKKwllcnIgPSByZXF1ZXN0X2lycShvcC0+YXJjaGRhdGEuaXJxc1swXSwgcHN5Y2hvX3BjaWVycl9pbnRyLCBJUlFGX1NIQVJFRCwKIAkJCSAgIlBTWUNIT19QQ0lFUlIiLCBwYm0pOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgUENJRVJSLCAiCkBAIC00ODMsNyArNDgzLDcgQEAKICNkZWZpbmUgUFNZQ0hPX01FTVNQQUNFX1NJWkUJMHgwN2ZmZmZmZmZVTAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcHN5Y2hvX3BibV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICAgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgaW50IGlzX3BibV9hKQorCQkJCSAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLCBpbnQgaXNfcGJtX2EpCiB7CiAJcHN5Y2hvX3BibV9pbml0X2NvbW1vbihwYm0sIG9wLCAiUFNZQ0hPIiwgUEJNX0NISVBfVFlQRV9QU1lDSE8pOwogCXBzeWNob19wYm1fc3RyYnVmX2luaXQocGJtLCBpc19wYm1fYSk7CkBAIC01MDMsNyArNTAzLDcgQEAKIAogI2RlZmluZSBQU1lDSE9fQ09ORklHU1BBQ0UJMHgwMDEwMDAwMDBVTAogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwc3ljaG9fcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwc3ljaG9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcHJfcmVnczsKQEAgLTYxMiw3ICs2MTIsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwc3ljaG9faW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnBzeWNob19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcHN5Y2hvX2RyaXZlcik7CiB9CiAKIHN1YnN5c19pbml0Y2FsbChwc3ljaG9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2FicmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zYWJyZS5jCmluZGV4IDZkYWQ4ZTMuLjVjM2Y1ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zYWJyZS5jCkBAIC0zMTEsNyArMzExLDcgQEAKIHN0YXRpYyB2b2lkIHNhYnJlX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gcGJtLT5vcC0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IG9mX2RldmljZSAqb3A7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3A7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcGJtLT5jb250cm9sbGVyX3JlZ3M7CiAJdTY0IHRtcDsKIAlpbnQgZXJyOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJICogMjogQ0UgRVJSCiAJICogMzogUE9XRVIgRkFJTAogCSAqLwotCWlmIChvcC0+bnVtX2lycXMgPCA0KQorCWlmIChvcC0+YXJjaGRhdGEubnVtX2lycXMgPCA0KQogCQlyZXR1cm47CiAKIAkvKiBXZSBjbGVhciB0aGUgZXJyb3IgYml0cyBpbiB0aGUgYXBwcm9wcmlhdGUgQUZTUiBiZWZvcmUKQEAgLTM0MSw3ICszNDEsNyBAQAogCQkgICAgU0FCUkVfVUVBRlNSX1NEVEUgfCBTQUJSRV9VRUFGU1JfUERURSksCiAJCSAgIGJhc2UgKyBTQUJSRV9VRV9BRlNSKTsKIAotCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzFdLCBzYWJyZV91ZV9pbnRyLCAwLCAiU0FCUkVfVUUiLCBwYm0pOworCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzFdLCBzYWJyZV91ZV9pbnRyLCAwLCAiU0FCUkVfVUUiLCBwYm0pOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZG4ndCByZWdpc3RlciBVRSwgZXJyPSVkLlxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwgZXJyKTsKQEAgLTM1MSwxMSArMzUxLDExIEBACiAJCSAgIGJhc2UgKyBTQUJSRV9DRV9BRlNSKTsKIAogCi0JZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMl0sIHNhYnJlX2NlX2ludHIsIDAsICJTQUJSRV9DRSIsIHBibSk7CisJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMl0sIHNhYnJlX2NlX2ludHIsIDAsICJTQUJSRV9DRSIsIHBibSk7CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkbid0IHJlZ2lzdGVyIENFLCBlcnI9JWQuXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBlcnIpOwotCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzBdLCBwc3ljaG9fcGNpZXJyX2ludHIsIDAsCisJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMF0sIHBzeWNob19wY2llcnJfaW50ciwgMCwKIAkJCSAgIlNBQlJFX1BDSUVSUiIsIHBibSk7CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkbid0IHJlZ2lzdGVyIFBDSUVSUiwgZXJyPSVkLlxuIiwKQEAgLTQ0Myw3ICs0NDMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc2FicmVfcGJtX2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCSAgICAgc3RydWN0IG9mX2RldmljZSAqb3ApCisJCQkJICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKIHsKIAlwc3ljaG9fcGJtX2luaXRfY29tbW9uKHBibSwgb3AsICJTQUJSRSIsIFBCTV9DSElQX1RZUEVfU0FCUkUpOwogCXBibS0+cGNpX2Fmc3IgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX1BJT0FGU1I7CkBAIC00NTIsNyArNDUyLDcgQEAKIAlzYWJyZV9zY2FuX2J1cyhwYm0sICZvcC0+ZGV2KTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc2FicmVfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYWJyZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnByX3JlZ3M7CkBAIC02MDYsNyArNjA2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2FicmVfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnNhYnJlX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZzYWJyZV9kcml2ZXIpOwogfQogCiBzdWJzeXNfaW5pdGNhbGwoc2FicmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKaW5kZXggOTdhMWFlMi4uNDQ1YTQ3YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYwpAQCAtODQ0LDcgKzg0NCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHRvbWF0aWxsb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKHBibS0+b3AtPmRldi5vZl9ub2RlKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUocGJtLT5vcC0+ZGV2Lm9mX25vZGUpOwogCXU2NCB0bXAsIGVycl9tYXNrLCBlcnJfbm9fbWFzazsKIAlpbnQgZXJyOwogCkBAIC04NTcsMTQgKzg1NywxNCBAQAogCSAqLwogCiAJaWYgKHBibV9yb3V0ZXNfdGhpc19pbm8ocGJtLCBTQ0hJWk9fVUVfSU5PKSkgewotCQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1sxXSwgc2NoaXpvX3VlX2ludHIsIDAsCisJCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzFdLCBzY2hpem9fdWVfaW50ciwgMCwKIAkJCQkgICJUT01BVElMTE9fVUUiLCBwYm0pOwogCQlpZiAoZXJyKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCByZWdpc3RlciBVRSwgIgogCQkJICAgICAgICJlcnI9JWRcbiIsIHBibS0+bmFtZSwgZXJyKTsKIAl9CiAJaWYgKHBibV9yb3V0ZXNfdGhpc19pbm8ocGJtLCBTQ0hJWk9fQ0VfSU5PKSkgewotCQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1syXSwgc2NoaXpvX2NlX2ludHIsIDAsCisJCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzJdLCBzY2hpem9fY2VfaW50ciwgMCwKIAkJCQkgICJUT01BVElMTE9fQ0UiLCBwYm0pOwogCQlpZiAoZXJyKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCByZWdpc3RlciBDRSwgIgpAQCAtODcyLDEwICs4NzIsMTAgQEAKIAl9CiAJZXJyID0gMDsKIAlpZiAocGJtX3JvdXRlc190aGlzX2lubyhwYm0sIFNDSElaT19QQ0lFUlJfQV9JTk8pKSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzBdLCBzY2hpem9fcGNpZXJyX2ludHIsIDAsCisJCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzBdLCBzY2hpem9fcGNpZXJyX2ludHIsIDAsCiAJCQkJICAiVE9NQVRJTExPX1BDSUVSUiIsIHBibSk7CiAJfSBlbHNlIGlmIChwYm1fcm91dGVzX3RoaXNfaW5vKHBibSwgU0NISVpPX1BDSUVSUl9CX0lOTykpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMF0sIHNjaGl6b19wY2llcnJfaW50ciwgMCwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMF0sIHNjaGl6b19wY2llcnJfaW50ciwgMCwKIAkJCQkgICJUT01BVElMTE9fUENJRVJSIiwgcGJtKTsKIAl9CiAJaWYgKGVycikKQEAgLTg4Myw3ICs4ODMsNyBAQAogCQkgICAgICAgImVycj0lZFxuIiwgcGJtLT5uYW1lLCBlcnIpOwogCiAJaWYgKHBibV9yb3V0ZXNfdGhpc19pbm8ocGJtLCBTQ0hJWk9fU0VSUl9JTk8pKSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzNdLCBzY2hpem9fc2FmYXJpZXJyX2ludHIsIDAsCisJCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzNdLCBzY2hpem9fc2FmYXJpZXJyX2ludHIsIDAsCiAJCQkJICAiVE9NQVRJTExPX1NFUlIiLCBwYm0pOwogCQlpZiAoZXJyKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCByZWdpc3RlciBTRVJSLCAiCkBAIC05MzksNyArOTM5LDcgQEAKIAogc3RhdGljIHZvaWQgc2NoaXpvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUocGJtLT5vcC0+ZGV2Lm9mX25vZGUpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwYm0tPm9wLT5kZXYub2Zfbm9kZSk7CiAJdTY0IHRtcCwgZXJyX21hc2ssIGVycl9ub19tYXNrOwogCWludCBlcnI7CiAKQEAgLTk1MiwxNCArOTUyLDE0IEBACiAJICovCiAKIAlpZiAocGJtX3JvdXRlc190aGlzX2lubyhwYm0sIFNDSElaT19VRV9JTk8pKSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzFdLCBzY2hpem9fdWVfaW50ciwgMCwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMV0sIHNjaGl6b191ZV9pbnRyLCAwLAogCQkJCSAgIlNDSElaT19VRSIsIHBibSk7CiAJCWlmIChlcnIpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IHJlZ2lzdGVyIFVFLCAiCiAJCQkgICAgICAgImVycj0lZFxuIiwgcGJtLT5uYW1lLCBlcnIpOwogCX0KIAlpZiAocGJtX3JvdXRlc190aGlzX2lubyhwYm0sIFNDSElaT19DRV9JTk8pKSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzJdLCBzY2hpem9fY2VfaW50ciwgMCwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMl0sIHNjaGl6b19jZV9pbnRyLCAwLAogCQkJCSAgIlNDSElaT19DRSIsIHBibSk7CiAJCWlmIChlcnIpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IHJlZ2lzdGVyIENFLCAiCkBAIC05NjcsMTAgKzk2NywxMCBAQAogCX0KIAllcnIgPSAwOwogCWlmIChwYm1fcm91dGVzX3RoaXNfaW5vKHBibSwgU0NISVpPX1BDSUVSUl9BX0lOTykpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMF0sIHNjaGl6b19wY2llcnJfaW50ciwgMCwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMF0sIHNjaGl6b19wY2llcnJfaW50ciwgMCwKIAkJCQkgICJTQ0hJWk9fUENJRVJSIiwgcGJtKTsKIAl9IGVsc2UgaWYgKHBibV9yb3V0ZXNfdGhpc19pbm8ocGJtLCBTQ0hJWk9fUENJRVJSX0JfSU5PKSkgewotCQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1swXSwgc2NoaXpvX3BjaWVycl9pbnRyLCAwLAorCQllcnIgPSByZXF1ZXN0X2lycShvcC0+YXJjaGRhdGEuaXJxc1swXSwgc2NoaXpvX3BjaWVycl9pbnRyLCAwLAogCQkJCSAgIlNDSElaT19QQ0lFUlIiLCBwYm0pOwogCX0KIAlpZiAoZXJyKQpAQCAtOTc4LDcgKzk3OCw3IEBACiAJCSAgICAgICAiZXJyPSVkXG4iLCBwYm0tPm5hbWUsIGVycik7CiAKIAlpZiAocGJtX3JvdXRlc190aGlzX2lubyhwYm0sIFNDSElaT19TRVJSX0lOTykpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbM10sIHNjaGl6b19zYWZhcmllcnJfaW50ciwgMCwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbM10sIHNjaGl6b19zYWZhcmllcnJfaW50ciwgMCwKIAkJCQkgICJTQ0hJWk9fU0VSUiIsIHBibSk7CiAJCWlmIChlcnIpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IHJlZ2lzdGVyIFNFUlIsICIKQEAgLTEzMDcsNyArMTMwNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNjaGl6b19wYm1faW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgdTMyIHBvcnRpZCwKKwkJCQkgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLCB1MzIgcG9ydGlkLAogCQkJCSAgICAgaW50IGNoaXBfdHlwZSkKIHsKIAljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKQEAgLTE0MTMsNyArMTQxMyw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IF9fc2NoaXpvX2luaXQoc3RydWN0IG9mX2RldmljZSAqb3AsIHVuc2lnbmVkIGxvbmcgY2hpcF90eXBlKQorc3RhdGljIGludCBfX2RldmluaXQgX19zY2hpem9faW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwgdW5zaWduZWQgbG9uZyBjaGlwX3R5cGUpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CkBAIC0xNDYwLDcgKzE0NjAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNjaGl6b19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjaGl6b19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXJldHVybiBfX3NjaGl6b19pbml0KG9wLCAodW5zaWduZWQgbG9uZykgbWF0Y2gtPmRhdGEpOwpAQCAtMTUwMSw3ICsxNTAxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2NoaXpvX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZzY2hpem9fZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnNjaGl6b19kcml2ZXIpOwogfQogCiBzdWJzeXNfaW5pdGNhbGwoc2NoaXpvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCBhMjRhZjZmLi43NDMzNDRhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwpAQCAtODc5LDcgKzg3OSw3IEBACiAjZW5kaWYgLyogIShDT05GSUdfUENJX01TSSkgKi8KIAogc3RhdGljIGludCBfX2RldmluaXQgcGNpX3N1bjR2X3BibV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkJc3RydWN0IG9mX2RldmljZSAqb3AsIHUzMiBkZXZoYW5kbGUpCisJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLCB1MzIgZGV2aGFuZGxlKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+ZGV2Lm9mX25vZGU7CiAJaW50IGVycjsKQEAgLTkxOCw3ICs5MTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwY2lfc3VuNHZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2lfc3VuNHZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKQEAgLTEwMTksNyArMTAxOSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBjaV9zdW40dl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmcGNpX3N1bjR2X2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZwY2lfc3VuNHZfZHJpdmVyKTsKIH0KIAogc3Vic3lzX2luaXRjYWxsKHBjaV9zdW40dl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA0NGZhYWJjLi4zNTdjZWQzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC01NzIsMTggKzU3MiwxOCBAQAogCXM2NCBkZWx0YTsKIAogYWdhaW46Ci0JcHJldl9yYXdfY291bnQgPSBhdG9taWM2NF9yZWFkKCZod2MtPnByZXZfY291bnQpOworCXByZXZfcmF3X2NvdW50ID0gbG9jYWw2NF9yZWFkKCZod2MtPnByZXZfY291bnQpOwogCW5ld19yYXdfY291bnQgPSByZWFkX3BtYyhpZHgpOwogCi0JaWYgKGF0b21pYzY0X2NtcHhjaGcoJmh3Yy0+cHJldl9jb3VudCwgcHJldl9yYXdfY291bnQsCisJaWYgKGxvY2FsNjRfY21weGNoZygmaHdjLT5wcmV2X2NvdW50LCBwcmV2X3Jhd19jb3VudCwKIAkJCSAgICAgbmV3X3Jhd19jb3VudCkgIT0gcHJldl9yYXdfY291bnQpCiAJCWdvdG8gYWdhaW47CiAKIAlkZWx0YSA9IChuZXdfcmF3X2NvdW50IDw8IHNoaWZ0KSAtIChwcmV2X3Jhd19jb3VudCA8PCBzaGlmdCk7CiAJZGVsdGEgPj49IHNoaWZ0OwogCi0JYXRvbWljNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKLQlhdG9taWM2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKKwlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7CisJbG9jYWw2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKIAogCXJldHVybiBuZXdfcmF3X2NvdW50OwogfQpAQCAtNTkxLDI3ICs1OTEsMjcgQEAKIHN0YXRpYyBpbnQgc3BhcmNfcGVyZl9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkgICAgICAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKIHsKLQlzNjQgbGVmdCA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+cGVyaW9kX2xlZnQpOworCXM2NCBsZWZ0ID0gbG9jYWw2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KTsKIAlzNjQgcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVyaW9kOwogCWludCByZXQgPSAwOwogCiAJaWYgKHVubGlrZWx5KGxlZnQgPD0gLXBlcmlvZCkpIHsKIAkJbGVmdCA9IHBlcmlvZDsKLQkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOwogCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOwogCQlyZXQgPSAxOwogCX0KIAogCWlmICh1bmxpa2VseShsZWZ0IDw9IDApKSB7CiAJCWxlZnQgKz0gcGVyaW9kOwotCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7CiAJCWh3Yy0+bGFzdF9wZXJpb2QgPSBwZXJpb2Q7CiAJCXJldCA9IDE7CiAJfQogCWlmIChsZWZ0ID4gTUFYX1BFUklPRCkKIAkJbGVmdCA9IE1BWF9QRVJJT0Q7CiAKLQlhdG9taWM2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgKHU2NCktbGVmdCk7CisJbG9jYWw2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgKHU2NCktbGVmdCk7CiAKIAl3cml0ZV9wbWMoaWR4LCAodTY0KSgtbGVmdCkgJiAweGZmZmZmZmZmKTsKIApAQCAtMTAwNiw3ICsxMDA2LDcgQEAKIAkgKiBza2lwIHRoZSBzY2hlZHVsYWJpbGl0eSB0ZXN0IGhlcmUsIGl0IHdpbGwgYmUgcGVmb3JtZWQKIAkgKiBhdCBjb21taXQgdGltZSgtPmNvbW1pdF90eG4pIGFzIGEgd2hvbGUKIAkgKi8KLQlpZiAoY3B1Yy0+Z3JvdXBfZmxhZyAmIFBFUkZfRVZFTlRfVFhOX1NUQVJURUQpCisJaWYgKGNwdWMtPmdyb3VwX2ZsYWcgJiBQRVJGX0VWRU5UX1RYTikKIAkJZ290byBub2NoZWNrOwogCiAJaWYgKGNoZWNrX2V4Y2x1ZGVzKGNwdWMtPmV2ZW50LCBuMCwgMSkpCkBAIC0xMDg4LDcgKzEwODgsNyBAQAogCWlmICghaHdjLT5zYW1wbGVfcGVyaW9kKSB7CiAJCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IE1BWF9QRVJJT0Q7CiAJCWh3Yy0+bGFzdF9wZXJpb2QgPSBod2MtPnNhbXBsZV9wZXJpb2Q7Ci0JCWF0b21pYzY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgaHdjLT5zYW1wbGVfcGVyaW9kKTsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTAzLDcgKzExMDMsNyBAQAogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCi0JY3B1aHctPmdyb3VwX2ZsYWcgfD0gUEVSRl9FVkVOVF9UWE5fU1RBUlRFRDsKKwljcHVody0+Z3JvdXBfZmxhZyB8PSBQRVJGX0VWRU5UX1RYTjsKIH0KIAogLyoKQEAgLTExMTUsNyArMTExNSw3IEBACiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWh3ID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKLQljcHVody0+Z3JvdXBfZmxhZyAmPSB+UEVSRl9FVkVOVF9UWE5fU1RBUlRFRDsKKwljcHVody0+Z3JvdXBfZmxhZyAmPSB+UEVSRl9FVkVOVF9UWE47CiB9CiAKIC8qCkBAIC0xMTM4LDYgKzExMzgsNyBAQAogCWlmIChzcGFyY19jaGVja19jb25zdHJhaW50cyhjcHVjLT5ldmVudCwgY3B1Yy0+ZXZlbnRzLCBuKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKKwljcHVjLT5ncm91cF9mbGFnICY9IH5QRVJGX0VWRU5UX1RYTjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wbWMuYwppbmRleCA5NTg5ZDhiLi45NDUzNmE4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wbWMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wbWMuYwpAQCAtNTEsNyArNTEsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHBtY19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLApAQCAtODksNyArODksNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbWNfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnBtY19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcG1jX2RyaXZlcik7CiB9CiAKIC8qIFRoaXMgZHJpdmVyIGlzIG5vdCBjcml0aWNhbCB0byB0aGUgYm9vdCBwcm9jZXNzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYwppbmRleCAxNjhkNGNiLi4yYzU5ZjRkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKQEAgLTMzLDEwICszMywxMCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwb3dlcl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwb3dlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmb3AtPnJlc291cmNlWzBdOwotCXVuc2lnbmVkIGludCBpcnE9IG9wLT5pcnFzWzBdOworCXVuc2lnbmVkIGludCBpcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAogCXBvd2VyX3JlZyA9IG9mX2lvcmVtYXAocmVzLCAwLCAweDQsICJwb3dlciIpOwogCkBAIC03MCw3ICs3MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBvd2VyX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZwb3dlcl9kcml2ZXIsICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcG93ZXJfZHJpdmVyKTsKIH0KIAogZGV2aWNlX2luaXRjYWxsKHBvd2VyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbS5oIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbS5oCmluZGV4IGE4NTkxZWYuLmVlYjA0YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb20uaAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmgKQEAgLTksMTQgKzksNiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IHByb21fdW5pcXVlX2lkOwogCi1zdGF0aWMgaW5saW5lIGludCBpc19yb290X25vZGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlpZiAoIWRwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAoZHAtPnBhcmVudCA9PSBOVUxMKTsKLX0KLQogZXh0ZXJuIGNoYXIgKmJ1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApOwogZXh0ZXJuIHZvaWQgb2ZfY29uc29sZV9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMKaW5kZXggNDY2YTMyNy4uODY1OTdkOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KQEAgLTgxLDcgKzgxLDcgQEAKIAkJcmV0dXJuOwogCiAJcmVncyA9IHJwcm9wLT52YWx1ZTsKLQlpZiAoIWlzX3Jvb3Rfbm9kZShkcC0+cGFyZW50KSkgeworCWlmICghb2Zfbm9kZV9pc19yb290KGRwLT5wYXJlbnQpKSB7CiAJCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKIAkJCWRwLT5uYW1lLAogCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciA+PiAzMlVMKSwKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQlyZXR1cm47CiAKIAlyZWdzID0gcHJvcC0+dmFsdWU7Ci0JaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKKwlpZiAoIW9mX25vZGVfaXNfcm9vdChkcC0+cGFyZW50KSkgewogCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCiAJCQlkcC0+bmFtZSwKIAkJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCksCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYwppbmRleCA1N2FjOWUyLi4xZjgzMGRhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogCiAJbiA9IHByb21fZWFybHlfYWxsb2MobGVuKTsKIAlzdHJjcHkobiwgZHAtPnBhcmVudC0+ZnVsbF9uYW1lKTsKLQlpZiAoIWlzX3Jvb3Rfbm9kZShkcC0+cGFyZW50KSkgeworCWlmICghb2Zfbm9kZV9pc19yb290KGRwLT5wYXJlbnQpKSB7CiAJCXN0cmNweShuICsgcGxlbiwgIi8iKTsKIAkJcGxlbisrOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYwppbmRleCA1NzAyYWQ0Li5jZTY1MTE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jCkBAIC03MTksNyArNzE5LDcgQEAKIAkJCQkgICAgICB2b2lkICpfZGF0YSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNlbnRyYWxfZHAgPSBfZGF0YTsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpjZW50cmFsX29wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShjZW50cmFsX2RwKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjZW50cmFsX29wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShjZW50cmFsX2RwKTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CiAJdTMyIHRtcDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYwppbmRleCAzZjM0YWM4Li5mZTJhZjY2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCkBAIC00NDcsNyArNDQ3LDcgQEAKIAogfQogCi12b2lkIHBzeWNob19wYm1faW5pdF9jb21tb24oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLCBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKK3ZvaWQgcHN5Y2hvX3BibV9pbml0X2NvbW1vbihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLAogCQkJICAgIGNvbnN0IGNoYXIgKmNoaXBfbmFtZSwgaW50IGNoaXBfdHlwZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPmRldi5vZl9ub2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5oIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5oCmluZGV4IDA5MmMyNzguLjU5MGI0ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uaAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAkJCSAgICAgdW5zaWduZWQgbG9uZyB3cml0ZV9jb21wbGV0ZV9vZmZzZXQpOwogCiBleHRlcm4gdm9pZCBwc3ljaG9fcGJtX2luaXRfY29tbW9uKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwKIAkJCQkgICBjb25zdCBjaGFyICpjaGlwX25hbWUsIGludCBjaGlwX3R5cGUpOwogCiAjZW5kaWYgLyogX1BTWUNIT19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCmluZGV4IGNmZWFmMDQuLjJjYTMyZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMKQEAgLTU3LDcgKzU3LDcgQEAKIHZvaWQgc2J1c19zZXRfc2J1czY0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGJ1cnN0cykKIHsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHRvX29mX2RldmljZShkZXYpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOwogCXVuc2lnbmVkIGxvbmcgY2ZnX3JlZzsKIAlpbnQgc2xvdDsKQEAgLTIwNCw3ICsyMDQsNyBAQAogCXJldHVybiBpbWFwICsgZGlmZjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzYnVzX2J1aWxkX2lycShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgdW5zaWduZWQgaW50IGlubykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsIHVuc2lnbmVkIGludCBpbm8pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdSA9IG9wLT5kZXYuYXJjaGRhdGEuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyByZWdfYmFzZSA9IGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcgLSAweDIwMDBVTDsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogI2RlZmluZSAgU1lTSU9fVUVBRlNSX1JFU1YyIDB4MDAwMDAwMWZmZmZmZmZmZlVMIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBzeXNpb191ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGRldl9pZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCA9IGRldl9pZDsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gb3AtPmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwogCXVuc2lnbmVkIGxvbmcgYWZzcl9yZWcsIGFmYXJfcmVnOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAjZGVmaW5lICBTWVNJT19DRUFGU1JfUkVTVjIgMHgwMDAwMDAxZmZmZmZmZmZmVUwgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAqLwogc3RhdGljIGlycXJldHVybl90IHN5c2lvX2NlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZGV2X2lkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gZGV2X2lkOwogCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBvcC0+ZGV2LmFyY2hkYXRhLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWc7CkBAIC00MjAsNyArNDIwLDcgQEAKICNkZWZpbmUgIFNZU0lPX1NCQUZTUl9SRVNWMyAweDAwMDAwMDFmZmZmZmZmZmZVTCAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICovCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3lzaW9fc2J1c19lcnJvcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGRldl9pZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCA9IGRldl9pZDsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gb3AtPmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGFmc3JfcmVnLCBhZmFyX3JlZywgcmVnX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAjZGVmaW5lIFNZU0lPX0NFX0lOTwkJMHgzNQogI2RlZmluZSBTWVNJT19TQlVTRVJSX0lOTwkweDM2CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzeXNpb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzeXNpb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKIHsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gb3AtPmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwpAQCAtNTM0LDcgKzUzNCw3IEBACiB9CiAKIC8qIEJvb3QgdGltZSBpbml0aWFsaXphdGlvbi4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2lvbW11X2luaXQoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgdm9pZCBfX2luaXQgc2J1c19pb21tdV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQogewogCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPmRldi5vZl9ub2RlOwpAQCAtNjYzLDcgKzY2Myw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAogCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgInNidXMiKSB7Ci0JCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CiAKIAkJc2J1c19pb21tdV9pbml0KG9wKTsKIAkJb2ZfcHJvcGFnYXRlX2FyY2hkYXRhKG9wKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfMzIuYwppbmRleCBlNDA0YjA2Li45Yzc0M2IxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV8zMi5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgY2xvY2tfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgY2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+ZGV2Lm9mX25vZGU7CiAJY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAvKiBQcm9iZSBmb3IgdGhlIG1vc3RlayByZWFsIHRpbWUgY2xvY2sgY2hpcC4gKi8KIHN0YXRpYyBpbnQgX19pbml0IGNsb2NrX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZjbG9ja19kcml2ZXIsICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY2xvY2tfZHJpdmVyKTsKIH0KIC8qIE11c3QgYmUgYWZ0ZXIgc3Vic3lzX2luaXRjYWxsKCkgc28gdGhhdCBidXNzZXMgYXJlIHByb2JlZC4gIE11c3QKICAqIGJlIGJlZm9yZSBkZXZpY2VfaW5pdGNhbGwoKSBiZWNhdXNlIHRoaW5ncyBsaWtlIHRoZSBSVEMgZHJpdmVyCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKaW5kZXggMjFlOWZjYS4uM2JjOWM5OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpAQCAtNDE5LDcgKzQxOSw3IEBACiAJLm51bV9yZXNvdXJjZXMJPSAxLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgcnRjX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IHJlc291cmNlICpyOwogCkBAIC00NzcsNyArNDc3LDcgQEAKIAkubnVtX3Jlc291cmNlcwk9IDEsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBicTQ4MDJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgYnE0ODAyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBCUTQ4MDIgcmVncyBhdCAweCVsbHhcbiIsCkBAIC01MzQsNyArNTM0LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgbW9zdGVrX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1vc3Rla19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5kZXYub2Zfbm9kZTsKIApAQCAtNTg2LDkgKzU4Niw5IEBACiAJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpCiAJCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJ0Y19zdW40dl9kZXZpY2UpOwogCi0JKHZvaWQpIG9mX3JlZ2lzdGVyX2RyaXZlcigmcnRjX2RyaXZlciwgJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKLQkodm9pZCkgb2ZfcmVnaXN0ZXJfZHJpdmVyKCZtb3N0ZWtfZHJpdmVyLCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOwotCSh2b2lkKSBvZl9yZWdpc3Rlcl9kcml2ZXIoJmJxNDgwMl9kcml2ZXIsICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisJKHZvaWQpIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcnRjX2RyaXZlcik7CisJKHZvaWQpIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbW9zdGVrX2RyaXZlcik7CisJKHZvaWQpIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYnE0ODAyX2RyaXZlcik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW8tdW5pdC5jIGIvYXJjaC9zcGFyYy9tbS9pby11bml0LmMKaW5kZXggMDA1ZTc1OC4uZmM1OGMzZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pby11bml0LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pby11bml0LmMKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgSU9QRVJNICAgICAgICAoSU9VUFRFX0NBQ0hFIHwgSU9VUFRFX1dSSVRFIHwgSU9VUFRFX1ZBTElEKQogI2RlZmluZSBNS0lPUFRFKHBoeXMpIF9faW9wdGUoKCgocGh5cyk+PjQpICYgSU9VUFRFX1BBR0UpIHwgSU9QRVJNKQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW91bml0X2lvbW11X2luaXQoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgdm9pZCBfX2luaXQgaW91bml0X2lvbW11X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCiB7CiAJc3RydWN0IGlvdW5pdF9zdHJ1Y3QgKmlvdW5pdDsKIAlpb3B0ZV90ICp4cHQsICp4cHRlbmQ7CkBAIC03NCw3ICs3NCw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAogCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgInNiaSIpIHsKLQkJc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKIAogCQlpb3VuaXRfaW9tbXVfaW5pdChvcCk7CiAJCW9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShvcCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2lvbW11LmMgYi9hcmNoL3NwYXJjL21tL2lvbW11LmMKaW5kZXggYjJlNmU3My4uMDdmYzZhNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pb21tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW9tbXUuYwpAQCAtNTYsMTQgKzU2LDE0IEBACiAjZGVmaW5lIElPUEVSTSAgICAgICAgKElPUFRFX0NBQ0hFIHwgSU9QVEVfV1JJVEUgfCBJT1BURV9WQUxJRCkKICNkZWZpbmUgTUtJT1BURShwZm4sIHBlcm0pICgoKCgocGZuKTw8OCkgJiBJT1BURV9QQUdFKSB8IChwZXJtKSkgJiB+SU9QVEVfV0FaKQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2J1c19pb21tdV9pbml0KHN0cnVjdCBvZl9kZXZpY2UgKm9wKQorc3RhdGljIHZvaWQgX19pbml0IHNidXNfaW9tbXVfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKIHsKIAlzdHJ1Y3QgaW9tbXVfc3RydWN0ICppb21tdTsKIAl1bnNpZ25lZCBpbnQgaW1wbCwgdmVyczsKIAl1bnNpZ25lZCBsb25nICpiaXRtYXA7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKLQlpb21tdSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV9zdHJ1Y3QpLCBHRlBfQVRPTUlDKTsKKwlpb21tdSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlvbW11KSB7CiAJCXByb21fcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgaW9tbXUgc3RydWN0dXJlXG4iKTsKIAkJcHJvbV9oYWx0KCk7CkBAIC0xMzIsNyArMTMyLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCiAJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRwLCAiaW9tbXUiKSB7Ci0JCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CiAKIAkJc2J1c19pb21tdV9pbml0KG9wKTsKIAkJb2ZfcHJvcGFnYXRlX2FyY2hkYXRhKG9wKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKaW5kZXggZjA1MzcyNi4uMmFiMjMzYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKQEAgLTI1LDExICsyNSw2IEBACiAjaW5jbHVkZSAibmV0X2tlcm4uaCIKICNpbmNsdWRlICJuZXRfdXNlci5oIgogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2V0aGVyX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICphZGRyKQotewotCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci19Ci0KICNkZWZpbmUgRFJJVkVSX05BTUUgInVtbC1uZXRkZXYiCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sob3BlbmVkX2xvY2spOwpAQCAtMjY2LDcgKzI2MSw3IEBACiAJc3RydWN0IHNvY2thZGRyICpod2FkZHIgPSBhZGRyOwogCiAJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwotCXNldF9ldGhlcl9tYWMoZGV2LCBod2FkZHItPnNhX2RhdGEpOworCWV0aF9tYWNfYWRkcihkZXYsIGh3YWRkci0+c2FfZGF0YSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTM4MCw3ICszNzUsNiBAQAogCS5uZG9fdHhfdGltZW91dCAJPSB1bWxfbmV0X3R4X3RpbWVvdXQsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSB1bWxfbmV0X3NldF9tYWMsCiAJLm5kb19jaGFuZ2VfbXR1IAk9IHVtbF9uZXRfY2hhbmdlX210dSwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiB9OwogCkBAIC00NzgsNyArNDcyLDcgQEAKIAkgICAgKCgqdHJhbnNwb3J0LT51c2VyLT5pbml0KSgmbHAtPnVzZXIsIGRldikgIT0gMCkpCiAJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAKLQlzZXRfZXRoZXJfbWFjKGRldiwgZGV2aWNlLT5tYWMpOworCWV0aF9tYWNfYWRkcihkZXYsIGRldmljZS0+bWFjKTsKIAlkZXYtPm10dSA9IHRyYW5zcG9ydC0+dXNlci0+bXR1OwogCWRldi0+bmV0ZGV2X29wcyA9ICZ1bWxfbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJnVtbF9uZXRfZXRodG9vbF9vcHM7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsLmgKaW5kZXggMDg0ZGU0YS4uMDAzMmY5MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vcGd0YWJsZS0zbGV2ZWwuaApAQCAtNjAsNyArNjAsNyBAQAogCXNldF9wdWQocHVkLCBfX3B1ZChfUEFHRV9UQUJMRSArIF9fcGEocG1kKSkpCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgc2V0X3B1ZChwdWRwdHIsIHB1ZHZhbCkgc2V0XzY0Yml0KChwaHlzX3QgKikgKHB1ZHB0ciksIHB1ZF92YWwocHVkdmFsKSkKKyNkZWZpbmUgc2V0X3B1ZChwdWRwdHIsIHB1ZHZhbCkgc2V0XzY0Yml0KCh1NjQgKikgKHB1ZHB0ciksIHB1ZF92YWwocHVkdmFsKSkKICNlbHNlCiAjZGVmaW5lIHNldF9wdWQocHVkcHRyLCBwdWR2YWwpICgqKHB1ZHB0cikgPSAocHVkdmFsKSkKICNlbmRpZgpAQCAtNzMsNyArNzMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9ta3VwdG9kYXRlKHBnZF90IHBnZCkgeyBwZ2RfdmFsKHBnZCkgJj0gfl9QQUdFX05FV1BBR0U7IH0KIAogI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBzZXRfcG1kKHBtZHB0ciwgcG1kdmFsKSBzZXRfNjRiaXQoKHBoeXNfdCAqKSAocG1kcHRyKSwgcG1kX3ZhbChwbWR2YWwpKQorI2RlZmluZSBzZXRfcG1kKHBtZHB0ciwgcG1kdmFsKSBzZXRfNjRiaXQoKHU2NCAqKSAocG1kcHRyKSwgcG1kX3ZhbChwbWR2YWwpKQogI2Vsc2UKICNkZWZpbmUgc2V0X3BtZChwbWRwdHIsIHBtZHZhbCkgKCoocG1kcHRyKSA9IChwbWR2YWwpKQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCA1NDZiNjEwYS4uYmFhMzRlNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC01NSw2ICs1NSw3IEBACiAJc2VsZWN0IEhBVkVfSFdfQlJFQUtQT0lOVAogCXNlbGVjdCBIQVZFX01JWEVEX0JSRUFLUE9JTlRTX1JFR1MKIAlzZWxlY3QgUEVSRl9FVkVOVFMKKwlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UU19OTUkKIAlzZWxlY3QgQU5PTl9JTk9ERVMKIAlzZWxlY3QgSEFWRV9BUkNIX0tNRU1DSEVDSwogCXNlbGVjdCBIQVZFX1VTRVJfUkVUVVJOX05PVElGSUVSCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L01ha2VmaWxlIGIvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQppbmRleCBlYzc0OWMyLi5mN2NiMDg2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKQEAgLTI2LDEwICsyNiwxMCBAQAogdGFyZ2V0cwkJKz0gZmRpbWFnZSBmZGltYWdlMTQ0IGZkaW1hZ2UyODggaW1hZ2UuaXNvIG10b29scy5jb25mCiBzdWJkaXItCQk6PSBjb21wcmVzc2VkCiAKLXNldHVwLXkJCSs9IGEyMC5vIGJpb3NjYWxsLm8gY21kbGluZS5vIGNvcHkubyBjcHUubyBjcHVjaGVjay5vIGVkZC5vCi1zZXR1cC15CQkrPSBoZWFkZXIubyBtYWluLm8gbWNhLm8gbWVtb3J5Lm8gcG0ubyBwbWp1bXAubwotc2V0dXAteQkJKz0gcHJpbnRmLm8gcmVncy5vIHN0cmluZy5vIHR0eS5vIHZpZGVvLm8gdmlkZW8tbW9kZS5vCi1zZXR1cC15CQkrPSB2ZXJzaW9uLm8KK3NldHVwLXkJCSs9IGEyMC5vIGJpb3NjYWxsLm8gY21kbGluZS5vIGNvcHkubyBjcHUubyBjcHVjaGVjay5vCitzZXR1cC15CQkrPSBlYXJseV9zZXJpYWxfY29uc29sZS5vIGVkZC5vIGhlYWRlci5vIG1haW4ubyBtY2EubyBtZW1vcnkubworc2V0dXAteQkJKz0gcG0ubyBwbWp1bXAubyBwcmludGYubyByZWdzLm8gc3RyaW5nLm8gdHR5Lm8gdmlkZW8ubworc2V0dXAteQkJKz0gdmlkZW8tbW9kZS5vIHZlcnNpb24ubwogc2V0dXAtJChDT05GSUdfWDg2X0FQTV9CT09UKSArPSBhcG0ubwogCiAjIFRoZSBsaW5rIG9yZGVyIG9mIHRoZSB2aWRlby0qLm8gbW9kdWxlcyBjYW4gbWF0dGVyLiAgSW4gcGFydGljdWxhciwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvYm9vdC5oIGIvYXJjaC94ODYvYm9vdC9ib290LmgKaW5kZXggOTgyMzlkMi4uYzcwOTNiZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9ib290LmgKKysrIGIvYXJjaC94ODYvYm9vdC9ib290LmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJiaXRvcHMuaCIKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKyNpbmNsdWRlICJjdHlwZS5oIgogCiAvKiBVc2VmdWwgbWFjcm9zICovCiAjZGVmaW5lIEJVSUxEX0JVR19PTihjb25kaXRpb24pICgodm9pZClzaXplb2YoY2hhclsxIC0gMiohIShjb25kaXRpb24pXSkpCkBAIC0zNyw2ICszOCw4IEBACiBleHRlcm4gc3RydWN0IHNldHVwX2hlYWRlciBoZHI7CiBleHRlcm4gc3RydWN0IGJvb3RfcGFyYW1zIGJvb3RfcGFyYW1zOwogCisjZGVmaW5lIGNwdV9yZWxheCgpCWFzbSB2b2xhdGlsZSgicmVwOyBub3AiKQorCiAvKiBCYXNpYyBwb3J0IEkvTyAqLwogc3RhdGljIGlubGluZSB2b2lkIG91dGIodTggdiwgdTE2IHBvcnQpCiB7CkBAIC0xOTgsMTEgKzIwMSw2IEBACiAJcmV0dXJuIGRpZmY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzZGlnaXQoaW50IGNoKQotewotCXJldHVybiAoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKTsKLX0KLQogLyogSGVhcCAtLSBhdmFpbGFibGUgZm9yIGR5bmFtaWMgbGlzdHMuICovCiBleHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciAqSEVBUDsKQEAgLTI4Nyw4ICsyODUsMTggQEAKIHZvaWQgaW50Y2FsbCh1OCBpbnRfbm8sIGNvbnN0IHN0cnVjdCBiaW9zcmVncyAqaXJlZywgc3RydWN0IGJpb3NyZWdzICpvcmVnKTsKIAogLyogY21kbGluZS5jICovCi1pbnQgY21kbGluZV9maW5kX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUpOwotaW50IGNtZGxpbmVfZmluZF9vcHRpb25fYm9vbChjb25zdCBjaGFyICpvcHRpb24pOworaW50IF9fY21kbGluZV9maW5kX29wdGlvbih1MzIgY21kbGluZV9wdHIsIGNvbnN0IGNoYXIgKm9wdGlvbiwgY2hhciAqYnVmZmVyLCBpbnQgYnVmc2l6ZSk7CitpbnQgX19jbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2wodTMyIGNtZGxpbmVfcHRyLCBjb25zdCBjaGFyICpvcHRpb24pOworc3RhdGljIGlubGluZSBpbnQgY21kbGluZV9maW5kX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUpCit7CisJcmV0dXJuIF9fY21kbGluZV9maW5kX29wdGlvbihib290X3BhcmFtcy5oZHIuY21kX2xpbmVfcHRyLCBvcHRpb24sIGJ1ZmZlciwgYnVmc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNtZGxpbmVfZmluZF9vcHRpb25fYm9vbChjb25zdCBjaGFyICpvcHRpb24pCit7CisJcmV0dXJuIF9fY21kbGluZV9maW5kX29wdGlvbl9ib29sKGJvb3RfcGFyYW1zLmhkci5jbWRfbGluZV9wdHIsIG9wdGlvbik7Cit9CisKIAogLyogY3B1LmMsIGNwdWNoZWNrLmMgKi8KIHN0cnVjdCBjcHVfZmVhdHVyZXMgewpAQCAtMzAwLDYgKzMwOCwxMCBAQAogaW50IGNoZWNrX2NwdShpbnQgKmNwdV9sZXZlbF9wdHIsIGludCAqcmVxX2xldmVsX3B0ciwgdTMyICoqZXJyX2ZsYWdzX3B0cik7CiBpbnQgdmFsaWRhdGVfY3B1KHZvaWQpOwogCisvKiBlYXJseV9zZXJpYWxfY29uc29sZS5jICovCitleHRlcm4gaW50IGVhcmx5X3NlcmlhbF9iYXNlOwordm9pZCBjb25zb2xlX2luaXQodm9pZCk7CisKIC8qIGVkZC5jICovCiB2b2lkIHF1ZXJ5X2VkZCh2b2lkKTsKIApAQCAtMzI5LDggKzM0MSwxMCBAQAogCiAvKiBzdHJpbmcuYyAqLwogaW50IHN0cmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKTsKK2ludCBzdHJuY21wKGNvbnN0IGNoYXIgKmNzLCBjb25zdCBjaGFyICpjdCwgc2l6ZV90IGNvdW50KTsKIHNpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW4pOwogdW5zaWduZWQgaW50IGF0b3UoY29uc3QgY2hhciAqcyk7Cit1bnNpZ25lZCBsb25nIGxvbmcgc2ltcGxlX3N0cnRvdWxsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpOwogCiAvKiB0dHkuYyAqLwogdm9pZCBwdXRzKGNvbnN0IGNoYXIgKik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NtZGxpbmUuYyBiL2FyY2gveDg2L2Jvb3QvY21kbGluZS5jCmluZGV4IGExZDM1NjMuLjZiM2I2ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY21kbGluZS5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY21kbGluZS5jCkBAIC0yNyw5ICsyNyw4IEBACiAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGFyZ3VtZW50IChyZWdhcmRsZXNzIG9mIGlmIGl0IHdhcwogICogdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgYnVmZmVyKSwgb3IgLTEgb24gbm90IGZvdW5kLgogICovCi1pbnQgY21kbGluZV9maW5kX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUpCitpbnQgX19jbWRsaW5lX2ZpbmRfb3B0aW9uKHUzMiBjbWRsaW5lX3B0ciwgY29uc3QgY2hhciAqb3B0aW9uLCBjaGFyICpidWZmZXIsIGludCBidWZzaXplKQogewotCXUzMiBjbWRsaW5lX3B0ciA9IGJvb3RfcGFyYW1zLmhkci5jbWRfbGluZV9wdHI7CiAJYWRkcl90IGNwdHI7CiAJY2hhciBjOwogCWludCBsZW4gPSAtMTsKQEAgLTEwMCw5ICs5OSw4IEBACiAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGF0IG9wdGlvbiAoc3RhcnRzIGNvdW50aW5nIHdpdGggMSkKICAqIG9yIDAgb24gbm90IGZvdW5kCiAgKi8KLWludCBjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woY29uc3QgY2hhciAqb3B0aW9uKQoraW50IF9fY21kbGluZV9maW5kX29wdGlvbl9ib29sKHUzMiBjbWRsaW5lX3B0ciwgY29uc3QgY2hhciAqb3B0aW9uKQogewotCXUzMiBjbWRsaW5lX3B0ciA9IGJvb3RfcGFyYW1zLmhkci5jbWRfbGluZV9wdHI7CiAJYWRkcl90IGNwdHI7CiAJY2hhciBjOwogCWludCBwb3MgPSAwLCB3c3RhcnQgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IGZiYjQ3ZGEuLjBjMjI5NTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAjIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CiAjCiAKLXRhcmdldHMgOj0gdm1saW51eC5sZHMgdm1saW51eCB2bWxpbnV4LmJpbiB2bWxpbnV4LmJpbi5neiB2bWxpbnV4LmJpbi5iejIgdm1saW51eC5iaW4ubHptYSB2bWxpbnV4LmJpbi5sem8gaGVhZF8kKEJJVFMpLm8gbWlzYy5vIHBpZ2d5Lm8KK3RhcmdldHMgOj0gdm1saW51eC5sZHMgdm1saW51eCB2bWxpbnV4LmJpbiB2bWxpbnV4LmJpbi5neiB2bWxpbnV4LmJpbi5iejIgdm1saW51eC5iaW4ubHptYSB2bWxpbnV4LmJpbi5sem8gaGVhZF8kKEJJVFMpLm8gbWlzYy5vIHN0cmluZy5vIGNtZGxpbmUubyBlYXJseV9zZXJpYWxfY29uc29sZS5vIHBpZ2d5Lm8KIAogS0JVSUxEX0NGTEFHUyA6PSAtbSQoQklUUykgLURfX0tFUk5FTF9fICQoTElOVVhfSU5DTFVERSkgLU8yCiBLQlVJTERfQ0ZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mUElDCkBAIC0yMyw3ICsyMyw3IEBACiAKIGhvc3Rwcm9ncy15CTo9IG1rcGlnZ3kKIAotJChvYmopL3ZtbGludXg6ICQob2JqKS92bWxpbnV4LmxkcyAkKG9iaikvaGVhZF8kKEJJVFMpLm8gJChvYmopL21pc2MubyAkKG9iaikvcGlnZ3kubyBGT1JDRQorJChvYmopL3ZtbGludXg6ICQob2JqKS92bWxpbnV4LmxkcyAkKG9iaikvaGVhZF8kKEJJVFMpLm8gJChvYmopL21pc2MubyAkKG9iaikvc3RyaW5nLm8gJChvYmopL2NtZGxpbmUubyAkKG9iaikvZWFybHlfc2VyaWFsX2NvbnNvbGUubyAkKG9iaikvcGlnZ3kubyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQogCUA6CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9jbWRsaW5lLmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvY21kbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjJmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvY21kbGluZS5jCkBAIC0wLDAgKzEsMjEgQEAKKyNpbmNsdWRlICJtaXNjLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZzOworc3RhdGljIGlubGluZSB2b2lkIHNldF9mcyh1bnNpZ25lZCBsb25nIHNlZykKK3sKKwlmcyA9IHNlZyA8PCA0OyAgLyogc2hpZnQgaXQgYmFjayAqLworfQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGFkZHJfdDsKK3N0YXRpYyBpbmxpbmUgY2hhciByZGZzOChhZGRyX3QgYWRkcikKK3sKKwlyZXR1cm4gKigoY2hhciAqKShmcyArIGFkZHIpKTsKK30KKyNpbmNsdWRlICIuLi9jbWRsaW5lLmMiCitpbnQgY21kbGluZV9maW5kX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUpCit7CisJcmV0dXJuIF9fY21kbGluZV9maW5kX29wdGlvbihyZWFsX21vZGUtPmhkci5jbWRfbGluZV9wdHIsIG9wdGlvbiwgYnVmZmVyLCBidWZzaXplKTsKK30KK2ludCBjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woY29uc3QgY2hhciAqb3B0aW9uKQoreworCXJldHVybiBfX2NtZGxpbmVfZmluZF9vcHRpb25fYm9vbChyZWFsX21vZGUtPmhkci5jbWRfbGluZV9wdHIsIG9wdGlvbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWFybHlfc2VyaWFsX2NvbnNvbGUuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYXJseV9zZXJpYWxfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWU4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWFybHlfc2VyaWFsX2NvbnNvbGUuYwpAQCAtMCwwICsxLDUgQEAKKyNpbmNsdWRlICJtaXNjLmgiCisKK2ludCBlYXJseV9zZXJpYWxfYmFzZTsKKworI2luY2x1ZGUgIi4uL2Vhcmx5X3NlcmlhbF9jb25zb2xlLmMiCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwppbmRleCBmNTQzYjcwLi42N2E2NTVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKQEAgLTEyNCw2ICsxMjQsMTkgQEAKIAlyZXAJc3Rvc2wKIAogLyoKKyAqIEFkanVzdCBvdXIgb3duIEdPVAorICovCisJbGVhbAlfZ290KCVlYngpLCAlZWR4CisJbGVhbAlfZWdvdCglZWJ4KSwgJWVjeAorMToKKwljbXBsCSVlY3gsICVlZHgKKwlqYWUJMmYKKwlhZGRsCSVlYngsICglZWR4KQorCWFkZGwJJDQsICVlZHgKKwlqbXAJMWIKKzI6CisKKy8qCiAgKiBEbyB0aGUgZGVjb21wcmVzc2lvbiwgYW5kIGp1bXAgdG8gdGhlIG5ldyBrZXJuZWwuLgogICovCiAJbGVhbAl6X2V4dHJhY3Rfb2Zmc2V0X25lZ2F0aXZlKCVlYngpLCAlZWJwCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwppbmRleCBmYWZmMGRjLi41MmY4NWExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKQEAgLTI4MCw2ICsyODAsMTkgQEAKIAlyZXAJc3Rvc3EKIAogLyoKKyAqIEFkanVzdCBvdXIgb3duIEdPVAorICovCisJbGVhcQlfZ290KCVyaXApLCAlcmR4CisJbGVhcQlfZWdvdCglcmlwKSwgJXJjeAorMToKKwljbXBxCSVyY3gsICVyZHgKKwlqYWUJMmYKKwlhZGRxCSVyYngsICglcmR4KQorCWFkZHEJJDgsICVyZHgKKwlqbXAJMWIKKzI6CisJCisvKgogICogRG8gdGhlIGRlY29tcHJlc3Npb24sIGFuZCBqdW1wIHRvIHRoZSBuZXcga2VybmVsLi4KICAqLwogCXB1c2hxCSVyc2kJCQkvKiBTYXZlIHRoZSByZWFsIG1vZGUgYXJndW1lbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IDUxZTI0MDcuLjhmN2JlZjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtOSwyMyArOSw3IEBACiAgKiBIaWdoIGxvYWRlZCBzdHVmZiBieSBIYW5zIExlcm1lbiAmIFdlcm5lciBBbG1lc2JlcmdlciwgRmViLiAxOTk2CiAgKi8KIAotLyoKLSAqIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCwgYmVjYXVzZSBubyBpbmRpcmVjdGlvbnMgYXJlIGFsbG93ZWQgaGVyZSwgYW5kCi0gKiBwYXJhdmlydF9vcHMgaXMgYSBraW5kIG9mIG9uZS4gQXMgaXQgd2lsbCBvbmx5IHJ1biBpbiBiYXJlbWV0YWwgYW55d2F5LAotICogd2UganVzdCBrZWVwIGl0IGZyb20gaGFwcGVuaW5nCi0gKi8KLSN1bmRlZiBDT05GSUdfUEFSQVZJUlQKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0jZGVmaW5lIF9BU01fWDg2X0RFU0NfSCAxCi0jZW5kaWYKLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vYm9vdC5oPgotI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KKyNpbmNsdWRlICJtaXNjLmgiCiAKIC8qIFdBUk5JTkchIQogICogVGhpcyBjb2RlIGlzIGNvbXBpbGVkIHdpdGggLWZQSUMgYW5kIGl0IGlzIHJlbG9jYXRlZCBkeW5hbWljYWxseQpAQCAtMTIzLDE1ICsxMDcsMTMgQEAKIC8qCiAgKiBUaGlzIGlzIHNldCB1cCBieSB0aGUgc2V0dXAtcm91dGluZSBhdCBib290LXRpbWUKICAqLwotc3RhdGljIHN0cnVjdCBib290X3BhcmFtcyAqcmVhbF9tb2RlOwkJLyogUG9pbnRlciB0byByZWFsLW1vZGUgZGF0YSAqLworc3RydWN0IGJvb3RfcGFyYW1zICpyZWFsX21vZGU7CQkvKiBQb2ludGVyIHRvIHJlYWwtbW9kZSBkYXRhICovCiBzdGF0aWMgaW50IHF1aWV0Oworc3RhdGljIGludCBkZWJ1ZzsKIAogdm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CiB2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CiAKLXN0YXRpYyB2b2lkIF9fcHV0c3RyKGludCwgY29uc3QgY2hhciAqKTsKLSNkZWZpbmUgcHV0c3RyKF9feCkgIF9fcHV0c3RyKDAsIF9feCkKLQogI2lmZGVmIENPTkZJR19YODZfNjQKICNkZWZpbmUgbWVtcHRyIGxvbmcKICNlbHNlCkBAIC0xNzAsNyArMTUyLDIxIEBACiAJCXZpZG1lbVtpXSA9ICcgJzsKIH0KIAotc3RhdGljIHZvaWQgX19wdXRzdHIoaW50IGVycm9yLCBjb25zdCBjaGFyICpzKQorI2RlZmluZSBYTVRSRFkgICAgICAgICAgMHgyMAorCisjZGVmaW5lIFRYUiAgICAgICAgICAgICAwICAgICAgIC8qICBUcmFuc21pdCByZWdpc3RlciAoV1JJVEUpICovCisjZGVmaW5lIExTUiAgICAgICAgICAgICA1ICAgICAgIC8qICBMaW5lIFN0YXR1cyAgICAgICAgICAgICAgICovCitzdGF0aWMgdm9pZCBzZXJpYWxfcHV0Y2hhcihpbnQgY2gpCit7CisJdW5zaWduZWQgdGltZW91dCA9IDB4ZmZmZjsKKworCXdoaWxlICgoaW5iKGVhcmx5X3NlcmlhbF9iYXNlICsgTFNSKSAmIFhNVFJEWSkgPT0gMCAmJiAtLXRpbWVvdXQpCisJCWNwdV9yZWxheCgpOworCisJb3V0YihjaCwgZWFybHlfc2VyaWFsX2Jhc2UgKyBUWFIpOworfQorCit2b2lkIF9fcHV0c3RyKGludCBlcnJvciwgY29uc3QgY2hhciAqcykKIHsKIAlpbnQgeCwgeSwgcG9zOwogCWNoYXIgYzsKQEAgLTE3OSw2ICsxNzUsMTQgQEAKIAlpZiAoIWVycm9yKQogCQlyZXR1cm47CiAjZW5kaWYKKwlpZiAoZWFybHlfc2VyaWFsX2Jhc2UpIHsKKwkJY29uc3QgY2hhciAqc3RyID0gczsKKwkJd2hpbGUgKCpzdHIpIHsKKwkJCWlmICgqc3RyID09ICdcbicpCisJCQkJc2VyaWFsX3B1dGNoYXIoJ1xyJyk7CisJCQlzZXJpYWxfcHV0Y2hhcigqc3RyKyspOworCQl9CisJfQogCiAJaWYgKHJlYWxfbW9kZS0+c2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlID09IDAgJiYKIAkgICAgbGluZXMgPT0gMCAmJiBjb2xzID09IDApCkBAIC0zMDUsOCArMzA5LDEwIEBACiB7CiAJcmVhbF9tb2RlID0gcm1vZGU7CiAKLQlpZiAocmVhbF9tb2RlLT5oZHIubG9hZGZsYWdzICYgUVVJRVRfRkxBRykKKwlpZiAoY21kbGluZV9maW5kX29wdGlvbl9ib29sKCJxdWlldCIpKQogCQlxdWlldCA9IDE7CisJaWYgKGNtZGxpbmVfZmluZF9vcHRpb25fYm9vbCgiZGVidWciKSkKKwkJZGVidWcgPSAxOwogCiAJaWYgKHJlYWxfbW9kZS0+c2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlID09IDcpIHsKIAkJdmlkbWVtID0gKGNoYXIgKikgMHhiMDAwMDsKQEAgLTMxOSw2ICszMjUsMTAgQEAKIAlsaW5lcyA9IHJlYWxfbW9kZS0+c2NyZWVuX2luZm8ub3JpZ192aWRlb19saW5lczsKIAljb2xzID0gcmVhbF9tb2RlLT5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX2NvbHM7CiAKKwljb25zb2xlX2luaXQoKTsKKwlpZiAoZGVidWcpCisJCXB1dHN0cigiZWFybHkgY29uc29sZSBpbiBkZWNvbXByZXNzX2tlcm5lbFxuIik7CisKIAlmcmVlX21lbV9wdHIgICAgID0gaGVhcDsJLyogSGVhcCAqLwogCWZyZWVfbWVtX2VuZF9wdHIgPSBoZWFwICsgQk9PVF9IRUFQX1NJWkU7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmggYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTljODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgQk9PVF9DT01QUkVTU0VEX01JU0NfSAorI2RlZmluZSBCT09UX0NPTVBSRVNTRURfTUlTQ19ICisKKy8qCisgKiB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwsIGJlY2F1c2Ugbm8gaW5kaXJlY3Rpb25zIGFyZSBhbGxvd2VkIGhlcmUsIGFuZAorICogcGFyYXZpcnRfb3BzIGlzIGEga2luZCBvZiBvbmUuIEFzIGl0IHdpbGwgb25seSBydW4gaW4gYmFyZW1ldGFsIGFueXdheSwKKyAqIHdlIGp1c3Qga2VlcCBpdCBmcm9tIGhhcHBlbmluZworICovCisjdW5kZWYgQ09ORklHX1BBUkFWSVJUCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorI2RlZmluZSBfQVNNX1g4Nl9ERVNDX0ggMQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3QuaD4KKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisKKyNkZWZpbmUgQk9PVF9CT09UX0gKKyNpbmNsdWRlICIuLi9jdHlwZS5oIgorCisvKiBtaXNjLmMgKi8KK2V4dGVybiBzdHJ1Y3QgYm9vdF9wYXJhbXMgKnJlYWxfbW9kZTsJCS8qIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGRhdGEgKi8KK3ZvaWQgX19wdXRzdHIoaW50IGVycm9yLCBjb25zdCBjaGFyICpzKTsKKyNkZWZpbmUgcHV0c3RyKF9feCkgIF9fcHV0c3RyKDAsIF9feCkKKyNkZWZpbmUgcHV0cyhfX3gpICBfX3B1dHN0cigwLCBfX3gpCisKKy8qIGNtZGxpbmUuYyAqLworaW50IGNtZGxpbmVfZmluZF9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCBjaGFyICpidWZmZXIsIGludCBidWZzaXplKTsKK2ludCBjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woY29uc3QgY2hhciAqb3B0aW9uKTsKKworLyogZWFybHlfc2VyaWFsX2NvbnNvbGUuYyAqLworZXh0ZXJuIGludCBlYXJseV9zZXJpYWxfYmFzZTsKK3ZvaWQgY29uc29sZV9pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWIzZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICIuLi9zdHJpbmcuYyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMKaW5kZXggNWRkYWJjZS4uMzRkMDQ3YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMKQEAgLTQxLDYgKzQxLDEyIEBACiAJCSooLnJvZGF0YS4qKQogCQlfZXJvZGF0YSA9IC4gOwogCX0KKwkuZ290IDogeworCQlfZ290ID0gLjsKKwkJS0VFUCgqKC5nb3QucGx0KSkKKwkJS0VFUCgqKC5nb3QpKQorCQlfZWdvdCA9IC47CisJfQogCS5kYXRhIDoJewogCQlfZGF0YSA9IC4gOwogCQkqKC5kYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jdHlwZS5oIGIvYXJjaC94ODYvYm9vdC9jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTEzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L2N0eXBlLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBCT09UX0lTRElHSVRfSAorCisjZGVmaW5lIEJPT1RfSVNESUdJVF9ICisKK3N0YXRpYyBpbmxpbmUgaW50IGlzZGlnaXQoaW50IGNoKQoreworCXJldHVybiAoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXN4ZGlnaXQoaW50IGNoKQoreworCWlmIChpc2RpZ2l0KGNoKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvZWFybHlfc2VyaWFsX2NvbnNvbGUuYyBiL2FyY2gveDg2L2Jvb3QvZWFybHlfc2VyaWFsX2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzBmNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvYm9vdC9lYXJseV9zZXJpYWxfY29uc29sZS5jCkBAIC0wLDAgKzEsMTM5IEBACisjaW5jbHVkZSAiYm9vdC5oIgorCisjZGVmaW5lIERFRkFVTFRfU0VSSUFMX1BPUlQgMHgzZjggLyogdHR5UzAgKi8KKworI2RlZmluZSBYTVRSRFkgICAgICAgICAgMHgyMAorCisjZGVmaW5lIERMQUIJCTB4ODAKKworI2RlZmluZSBUWFIgICAgICAgICAgICAgMCAgICAgICAvKiAgVHJhbnNtaXQgcmVnaXN0ZXIgKFdSSVRFKSAqLworI2RlZmluZSBSWFIgICAgICAgICAgICAgMCAgICAgICAvKiAgUmVjZWl2ZSByZWdpc3RlciAgKFJFQUQpICAqLworI2RlZmluZSBJRVIgICAgICAgICAgICAgMSAgICAgICAvKiAgSW50ZXJydXB0IEVuYWJsZSAgICAgICAgICAqLworI2RlZmluZSBJSVIgICAgICAgICAgICAgMiAgICAgICAvKiAgSW50ZXJydXB0IElEICAgICAgICAgICAgICAqLworI2RlZmluZSBGQ1IgICAgICAgICAgICAgMiAgICAgICAvKiAgRklGTyBjb250cm9sICAgICAgICAgICAgICAqLworI2RlZmluZSBMQ1IgICAgICAgICAgICAgMyAgICAgICAvKiAgTGluZSBjb250cm9sICAgICAgICAgICAgICAqLworI2RlZmluZSBNQ1IgICAgICAgICAgICAgNCAgICAgICAvKiAgTW9kZW0gY29udHJvbCAgICAgICAgICAgICAqLworI2RlZmluZSBMU1IgICAgICAgICAgICAgNSAgICAgICAvKiAgTGluZSBTdGF0dXMgICAgICAgICAgICAgICAqLworI2RlZmluZSBNU1IgICAgICAgICAgICAgNiAgICAgICAvKiAgTW9kZW0gU3RhdHVzICAgICAgICAgICAgICAqLworI2RlZmluZSBETEwgICAgICAgICAgICAgMCAgICAgICAvKiAgRGl2aXNvciBMYXRjaCBMb3cgICAgICAgICAqLworI2RlZmluZSBETEggICAgICAgICAgICAgMSAgICAgICAvKiAgRGl2aXNvciBsYXRjaCBIaWdoICAgICAgICAqLworCisjZGVmaW5lIERFRkFVTFRfQkFVRCA5NjAwCisKK3N0YXRpYyB2b2lkIGVhcmx5X3NlcmlhbF9pbml0KGludCBwb3J0LCBpbnQgYmF1ZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgZGl2aXNvcjsKKworCW91dGIoMHgzLCBwb3J0ICsgTENSKTsJLyogOG4xICovCisJb3V0YigwLCBwb3J0ICsgSUVSKTsJLyogbm8gaW50ZXJydXB0ICovCisJb3V0YigwLCBwb3J0ICsgRkNSKTsJLyogbm8gZmlmbyAqLworCW91dGIoMHgzLCBwb3J0ICsgTUNSKTsJLyogRFRSICsgUlRTICovCisKKwlkaXZpc29yCT0gMTE1MjAwIC8gYmF1ZDsKKwljID0gaW5iKHBvcnQgKyBMQ1IpOworCW91dGIoYyB8IERMQUIsIHBvcnQgKyBMQ1IpOworCW91dGIoZGl2aXNvciAmIDB4ZmYsIHBvcnQgKyBETEwpOworCW91dGIoKGRpdmlzb3IgPj4gOCkgJiAweGZmLCBwb3J0ICsgRExIKTsKKwlvdXRiKGMgJiB+RExBQiwgcG9ydCArIExDUik7CisKKwllYXJseV9zZXJpYWxfYmFzZSA9IHBvcnQ7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2Vhcmx5cHJpbnRrKHZvaWQpCit7CisJaW50IGJhdWQgPSBERUZBVUxUX0JBVUQ7CisJY2hhciBhcmdbMzJdOworCWludCBwb3MgPSAwOworCWludCBwb3J0ID0gMDsKKworCWlmIChjbWRsaW5lX2ZpbmRfb3B0aW9uKCJlYXJseXByaW50ayIsIGFyZywgc2l6ZW9mIGFyZykgPiAwKSB7CisJCWNoYXIgKmU7CisKKwkJaWYgKCFzdHJuY21wKGFyZywgInNlcmlhbCIsIDYpKSB7CisJCQlwb3J0ID0gREVGQVVMVF9TRVJJQUxfUE9SVDsKKwkJCXBvcyArPSA2OworCQl9CisKKwkJaWYgKGFyZ1twb3NdID09ICcsJykKKwkJCXBvcysrOworCisJCWlmICghc3RybmNtcChhcmcsICJ0dHlTIiwgNCkpIHsKKwkJCXN0YXRpYyBjb25zdCBpbnQgYmFzZXNbXSA9IHsgMHgzZjgsIDB4MmY4IH07CisJCQlpbnQgaWR4ID0gMDsKKworCQkJaWYgKCFzdHJuY21wKGFyZyArIHBvcywgInR0eVMiLCA0KSkKKwkJCQlwb3MgKz0gNDsKKworCQkJaWYgKGFyZ1twb3MrK10gPT0gJzEnKQorCQkJCWlkeCA9IDE7CisKKwkJCXBvcnQgPSBiYXNlc1tpZHhdOworCQl9CisKKwkJaWYgKGFyZ1twb3NdID09ICcsJykKKwkJCXBvcysrOworCisJCWJhdWQgPSBzaW1wbGVfc3RydG91bGwoYXJnICsgcG9zLCAmZSwgMCk7CisJCWlmIChiYXVkID09IDAgfHwgYXJnICsgcG9zID09IGUpCisJCQliYXVkID0gREVGQVVMVF9CQVVEOworCX0KKworCWlmIChwb3J0KQorCQllYXJseV9zZXJpYWxfaW5pdChwb3J0LCBiYXVkKTsKK30KKworI2RlZmluZSBCQVNFX0JBVUQgKDE4NDMyMDAvMTYpCitzdGF0aWMgdW5zaWduZWQgaW50IHByb2JlX2JhdWQoaW50IHBvcnQpCit7CisJdW5zaWduZWQgY2hhciBsY3IsIGRsbCwgZGxoOworCXVuc2lnbmVkIGludCBxdW90OworCisJbGNyID0gaW5iKHBvcnQgKyBMQ1IpOworCW91dGIobGNyIHwgRExBQiwgcG9ydCArIExDUik7CisJZGxsID0gaW5iKHBvcnQgKyBETEwpOworCWRsaCA9IGluYihwb3J0ICsgRExIKTsKKwlvdXRiKGxjciwgcG9ydCArIExDUik7CisJcXVvdCA9IChkbGggPDwgOCkgfCBkbGw7CisKKwlyZXR1cm4gQkFTRV9CQVVEIC8gcXVvdDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfY29uc29sZV91YXJ0ODI1MCh2b2lkKQoreworCWNoYXIgb3B0c3RyWzY0XSwgKm9wdGlvbnM7CisJaW50IGJhdWQgPSBERUZBVUxUX0JBVUQ7CisJaW50IHBvcnQgPSAwOworCisJLyoKKwkgKiBjb25zb2xlPXVhcnQ4MjUwLGlvLDB4M2Y4LDExNTIwMG44CisJICogbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgbGFzdCBvbmUgY29uc29sZSAhCisJICovCisJaWYgKGNtZGxpbmVfZmluZF9vcHRpb24oImNvbnNvbGUiLCBvcHRzdHIsIHNpemVvZiBvcHRzdHIpIDw9IDApCisJCXJldHVybjsKKworCW9wdGlvbnMgPSBvcHRzdHI7CisKKwlpZiAoIXN0cm5jbXAob3B0aW9ucywgInVhcnQ4MjUwLGlvLCIsIDEyKSkKKwkJcG9ydCA9IHNpbXBsZV9zdHJ0b3VsbChvcHRpb25zICsgMTIsICZvcHRpb25zLCAwKTsKKwllbHNlIGlmICghc3RybmNtcChvcHRpb25zLCAidWFydCxpbywiLCA4KSkKKwkJcG9ydCA9IHNpbXBsZV9zdHJ0b3VsbChvcHRpb25zICsgOCwgJm9wdGlvbnMsIDApOworCWVsc2UKKwkJcmV0dXJuOworCisJaWYgKG9wdGlvbnMgJiYgKG9wdGlvbnNbMF0gPT0gJywnKSkKKwkJYmF1ZCA9IHNpbXBsZV9zdHJ0b3VsbChvcHRpb25zICsgMSwgJm9wdGlvbnMsIDApOworCWVsc2UKKwkJYmF1ZCA9IHByb2JlX2JhdWQocG9ydCk7CisKKwlpZiAocG9ydCkKKwkJZWFybHlfc2VyaWFsX2luaXQocG9ydCwgYmF1ZCk7Cit9CisKK3ZvaWQgY29uc29sZV9pbml0KHZvaWQpCit7CisJcGFyc2VfZWFybHlwcmludGsoKTsKKworCWlmICghZWFybHlfc2VyaWFsX2Jhc2UpCisJCXBhcnNlX2NvbnNvbGVfdWFydDgyNTAoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvbWFpbi5jIGIvYXJjaC94ODYvYm9vdC9tYWluLmMKaW5kZXggMTQwMTcyYi4uNDAzNThjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9tYWluLmMKKysrIGIvYXJjaC94ODYvYm9vdC9tYWluLmMKQEAgLTEzMCw2ICsxMzAsMTEgQEAKIAkvKiBGaXJzdCwgY29weSB0aGUgYm9vdCBoZWFkZXIgaW50byB0aGUgInplcm9wYWdlIiAqLwogCWNvcHlfYm9vdF9wYXJhbXMoKTsKIAorCS8qIEluaXRpYWxpemUgdGhlIGVhcmx5LWJvb3QgY29uc29sZSAqLworCWNvbnNvbGVfaW5pdCgpOworCWlmIChjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woImRlYnVnIikpCisJCXB1dHMoImVhcmx5IGNvbnNvbGUgaW4gc2V0dXAgY29kZVxuIik7CisKIAkvKiBFbmQgb2YgaGVhcCBjaGVjayAqLwogCWluaXRfaGVhcCgpOwogCkBAIC0xNjgsMTAgKzE3Myw2IEBACiAJLyogU2V0IHRoZSB2aWRlbyBtb2RlICovCiAJc2V0X3ZpZGVvKCk7CiAKLQkvKiBQYXJzZSBjb21tYW5kIGxpbmUgZm9yICdxdWlldCcgYW5kIHBhc3MgaXQgdG8gZGVjb21wcmVzc29yLiAqLwotCWlmIChjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woInF1aWV0IikpCi0JCWJvb3RfcGFyYW1zLmhkci5sb2FkZmxhZ3MgfD0gUVVJRVRfRkxBRzsKLQogCS8qIERvIHRoZSBsYXN0IHRoaW5ncyBhbmQgaW52b2tlIHByb3RlY3RlZCBtb2RlICovCiAJZ29fdG9fcHJvdGVjdGVkX21vZGUoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvcHJpbnRmLmMgYi9hcmNoL3g4Ni9ib290L3ByaW50Zi5jCmluZGV4IDUwZTQ3Y2QuLmNkYWM5MWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvcHJpbnRmLmMKKysrIGIvYXJjaC94ODYvYm9vdC9wcmludGYuYwpAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBTTUFMTAkzMgkJLyogTXVzdCBiZSAzMiA9PSAweDIwICovCiAjZGVmaW5lIFNQRUNJQUwJNjQJCS8qIDB4ICovCiAKLSNkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsgXAorI2RlZmluZSBfX2RvX2RpdihuLCBiYXNlKSAoeyBcCiBpbnQgX19yZXM7IFwKIF9fcmVzID0gKCh1bnNpZ25lZCBsb25nKSBuKSAlICh1bnNpZ25lZCkgYmFzZTsgXAogbiA9ICgodW5zaWduZWQgbG9uZykgbikgLyAodW5zaWduZWQpIGJhc2U7IFwKQEAgLTgzLDcgKzgzLDcgQEAKIAkJdG1wW2krK10gPSAnMCc7CiAJZWxzZQogCQl3aGlsZSAobnVtICE9IDApCi0JCQl0bXBbaSsrXSA9IChkaWdpdHNbZG9fZGl2KG51bSwgYmFzZSldIHwgbG9jYXNlKTsKKwkJCXRtcFtpKytdID0gKGRpZ2l0c1tfX2RvX2RpdihudW0sIGJhc2UpXSB8IGxvY2FzZSk7CiAJaWYgKGkgPiBwcmVjaXNpb24pCiAJCXByZWNpc2lvbiA9IGk7CiAJc2l6ZSAtPSBwcmVjaXNpb247CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3N0cmluZy5jIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuYwppbmRleCBmOTRiN2EwLi4zY2JjNDA1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3N0cmluZy5jCisrKyBiL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMKQEAgLTMwLDYgKzMwLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBzdHJuY21wKGNvbnN0IGNoYXIgKmNzLCBjb25zdCBjaGFyICpjdCwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCisJd2hpbGUgKGNvdW50KSB7CisJCWMxID0gKmNzKys7CisJCWMyID0gKmN0Kys7CisJCWlmIChjMSAhPSBjMikKKwkJCXJldHVybiBjMSA8IGMyID8gLTEgOiAxOworCQlpZiAoIWMxKQorCQkJYnJlYWs7CisJCWNvdW50LS07CisJfQorCXJldHVybiAwOworfQorCiBzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbWF4bGVuKQogewogCWNvbnN0IGNoYXIgKmVzID0gczsKQEAgLTQ4LDMgKzY0LDUwIEBACiAJCWkgPSBpICogMTAgKyAoKnMrKyAtICcwJyk7CiAJcmV0dXJuIGk7CiB9CisKKy8qIFdvcmtzIG9ubHkgZm9yIGRpZ2l0cyBhbmQgbGV0dGVycywgYnV0IHNtYWxsIGFuZCBmYXN0ICovCisjZGVmaW5lIFRPTE9XRVIoeCkgKCh4KSB8IDB4MjApCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ltcGxlX2d1ZXNzX2Jhc2UoY29uc3QgY2hhciAqY3ApCit7CisJaWYgKGNwWzBdID09ICcwJykgeworCQlpZiAoVE9MT1dFUihjcFsxXSkgPT0gJ3gnICYmIGlzeGRpZ2l0KGNwWzJdKSkKKwkJCXJldHVybiAxNjsKKwkJZWxzZQorCQkJcmV0dXJuIDg7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDEwOworCX0KK30KKworLyoqCisgKiBzaW1wbGVfc3RydG91bGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZworICogQGNwOiBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZworICogQGVuZHA6IEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGhlcmUKKyAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlCisgKi8KKwordW5zaWduZWQgbG9uZyBsb25nIHNpbXBsZV9zdHJ0b3VsbChjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQgPSAwOworCisJaWYgKCFiYXNlKQorCQliYXNlID0gc2ltcGxlX2d1ZXNzX2Jhc2UoY3ApOworCisJaWYgKGJhc2UgPT0gMTYgJiYgY3BbMF0gPT0gJzAnICYmIFRPTE9XRVIoY3BbMV0pID09ICd4JykKKwkJY3AgKz0gMjsKKworCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCQl2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcCAtICcwJyA6IFRPTE9XRVIoKmNwKSAtICdhJyArIDEwOworCQlpZiAodmFsdWUgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlyZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgdmFsdWU7CisJCWNwKys7CisJfQorCWlmIChlbmRwKQorCQkqZW5kcCA9IChjaGFyICopY3A7CisKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC90dHkuYyBiL2FyY2gveDg2L2Jvb3QvdHR5LmMKaW5kZXggMDFlYzY5Yy4uZGVmMjQ1MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC90dHkuYworKysgYi9hcmNoL3g4Ni9ib290L3R0eS5jCkBAIC0xMCwyNCArMTAsMzcgQEAKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qCi0gKiBWZXJ5IHNpbXBsZSBzY3JlZW4gSS9PCi0gKiBYWFg6IFByb2JhYmx5IHNob3VsZCBhZGQgdmVyeSBzaW1wbGUgc2VyaWFsIEkvTz8KKyAqIFZlcnkgc2ltcGxlIHNjcmVlbiBhbmQgc2VyaWFsIEkvTwogICovCiAKICNpbmNsdWRlICJib290LmgiCiAKK2ludCBlYXJseV9zZXJpYWxfYmFzZTsKKworI2RlZmluZSBYTVRSRFkgICAgICAgICAgMHgyMAorCisjZGVmaW5lIFRYUiAgICAgICAgICAgICAwICAgICAgIC8qICBUcmFuc21pdCByZWdpc3RlciAoV1JJVEUpICovCisjZGVmaW5lIExTUiAgICAgICAgICAgICA1ICAgICAgIC8qICBMaW5lIFN0YXR1cyAgICAgICAgICAgICAgICovCisKIC8qCiAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGluIC5pbml0dGV4dCBzbyB0aGV5IGNhbiBiZSB1c2VkIHRvIHNpZ25hbAogICogZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uLgogICovCiAKLXZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXR0ZXh0IikpKSBwdXRjaGFyKGludCBjaCkKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5pbml0dGV4dCIpKSkgc2VyaWFsX3B1dGNoYXIoaW50IGNoKQoreworCXVuc2lnbmVkIHRpbWVvdXQgPSAweGZmZmY7CisKKwl3aGlsZSAoKGluYihlYXJseV9zZXJpYWxfYmFzZSArIExTUikgJiBYTVRSRFkpID09IDAgJiYgLS10aW1lb3V0KQorCQljcHVfcmVsYXgoKTsKKworCW91dGIoY2gsIGVhcmx5X3NlcmlhbF9iYXNlICsgVFhSKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXR0ZXh0IikpKSBiaW9zX3B1dGNoYXIoaW50IGNoKQogewogCXN0cnVjdCBiaW9zcmVncyBpcmVnOwogCi0JaWYgKGNoID09ICdcbicpCi0JCXB1dGNoYXIoJ1xyJyk7CS8qIFxuIC0+IFxyXG4gKi8KLQogCWluaXRyZWdzKCZpcmVnKTsKIAlpcmVnLmJ4ID0gMHgwMDA3OwogCWlyZWcuY3ggPSAweDAwMDE7CkBAIC0zNiw2ICs0OSwxNyBAQAogCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogfQogCit2b2lkIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5pbml0dGV4dCIpKSkgcHV0Y2hhcihpbnQgY2gpCit7CisJaWYgKGNoID09ICdcbicpCisJCXB1dGNoYXIoJ1xyJyk7CS8qIFxuIC0+IFxyXG4gKi8KKworCWJpb3NfcHV0Y2hhcihjaCk7CisKKwlpZiAoZWFybHlfc2VyaWFsX2Jhc2UgIT0gMCkKKwkJc2VyaWFsX3B1dGNoYXIoY2gpOworfQorCiB2b2lkIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5pbml0dGV4dCIpKSkgcHV0cyhjb25zdCBjaGFyICpzdHIpCiB7CiAJd2hpbGUgKCpzdHIpCkBAIC0xMTIsMyArMTM2LDQgQEAKIAogCXJldHVybiAwOwkJLyogVGltZW91dCEgKi8KIH0KKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcKaW5kZXggZDI4ZmFkMS4uZTNhMzI0MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZworKysgYi9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnCkBAIC0xNDcxLDYgKzE0NzEsNyBAQAogIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0NPUkVURU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEtHVEVNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcKaW5kZXggNmM4NmFjZC4uNDI1MWY4MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnCisrKyBiL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZwpAQCAtMTQ1Niw2ICsxNDU2LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19DT1JFVEVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BLR1RFTVAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oCmluZGV4IGFhMmMzOWQuLjkyMDkxZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FjcGkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hY3BpLmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PSAweDA1ICYmCiAJICAgIGJvb3RfY3B1X2RhdGEueDg2X21hc2sgPCAweDBBKQogCQlyZXR1cm4gMTsKLQllbHNlIGlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQU1EQzFFKSkKKwllbHNlIGlmIChjMWVfZGV0ZWN0ZWQpCiAJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIG1heF9jc3RhdGU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGJfdGltZXIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCmluZGV4IGM3NGEyZWUuLmE2OWIxYWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCkBAIC01NSw3ICs1NSw2IEBACiBleHRlcm4gaW50IGFyY2hfc2V0dXBfYXBidF9pcnFzKGludCBpcnEsIGludCB0cmlnZ2VyLCBpbnQgbWFzaywgaW50IGNwdSk7CiBleHRlcm4gdm9pZCBhcGJ0X3NldHVwX3NlY29uZGFyeV9jbG9jayh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfaWQ7Ci1leHRlcm4gaW50IGRpc2FibGVfYXBidF9wZXJjcHU7CiAKIGV4dGVybiBzdHJ1Y3Qgc2ZpX3RpbWVyX3RhYmxlX2VudHJ5ICpzZmlfZ2V0X210bXIoaW50IGhpbnQpOwogZXh0ZXJuIHZvaWQgc2ZpX2ZyZWVfbXRtcihzdHJ1Y3Qgc2ZpX3RpbWVyX3RhYmxlX2VudHJ5ICptdG1yKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaAppbmRleCA4ODU5ZTEyLi4yODRhNmU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oCkBAIC0xMSwzOCArMTEsNDIgQEAKIGV4dGVybiB2b2lkIF9feGNoZ193cm9uZ19zaXplKHZvaWQpOwogCiAvKgotICogTm90ZTogbm8gImxvY2siIHByZWZpeCBldmVuIG9uIFNNUDogeGNoZyBhbHdheXMgaW1wbGllcyBsb2NrIGFueXdheQotICogTm90ZSAyOiB4Y2hnIGhhcyBzaWRlIGVmZmVjdCwgc28gdGhhdCBhdHRyaWJ1dGUgdm9sYXRpbGUgaXMgbmVjZXNzYXJ5LAotICoJICBidXQgZ2VuZXJhbGx5IHRoZSBwcmltaXRpdmUgaXMgaW52YWxpZCwgKnB0ciBpcyBvdXRwdXQgYXJndW1lbnQuIC0tQU5LCisgKiBOb3RlOiBubyAibG9jayIgcHJlZml4IGV2ZW4gb24gU01QOiB4Y2hnIGFsd2F5cyBpbXBsaWVzIGxvY2sgYW55d2F5LgorICogU2luY2UgdGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBwcm90ZWN0IG90aGVyIG1lbW9yeSBpbmZvcm1hdGlvbiwgd2UKKyAqIHVzZSAiYXNtIHZvbGF0aWxlIiBhbmQgIm1lbW9yeSIgY2xvYmJlcnMgdG8gcHJldmVudCBnY2MgZnJvbSBtb3ZpbmcKKyAqIGluZm9ybWF0aW9uIGFyb3VuZC4KICAqLwotCi1zdHJ1Y3QgX194Y2hnX2R1bW15IHsKLQl1bnNpZ25lZCBsb25nIGFbMTAwXTsKLX07Ci0jZGVmaW5lIF9feGcoeCkgKChzdHJ1Y3QgX194Y2hnX2R1bW15ICopKHgpKQotCiAjZGVmaW5lIF9feGNoZyh4LCBwdHIsIHNpemUpCQkJCQkJXAogKHsJCQkJCQkJCQlcCiAJX190eXBlb2YoKihwdHIpKSBfX3ggPSAoeCk7CQkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ2IgJWIwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1xIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm0iICgqX194ZyhwdHIpKSwgIjAiIChfX3gpCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKCJ4Y2hnYiAlMCwlMSIJCQkJXAorCQkJICAgICA6ICI9cSIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAogCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAogCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKIAljYXNlIDI6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ3cgJXcwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm0iICgqX194ZyhwdHIpKSwgIjAiIChfX3gpCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MTYgKl9fcHRyID0gKHZvbGF0aWxlIHUxNiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUoInhjaGd3ICUwLCUxIgkJCQlcCisJCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICIwIiAoX194KQkJCQlcCiAJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCiAJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAogCWNhc2UgNDoJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCiAJCWFzbSB2b2xhdGlsZSgieGNoZ2wgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibSIgKCpfX3hnKHB0cikpLCAiMCIgKF9feCkJCVwKKwkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogIjAiIChfX3gpCQkJCVwKIAkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKIAkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCiAJZGVmYXVsdDoJCQkJCQkJXAogCQlfX3hjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAogCX0JCQkJCQkJCVwKQEAgLTUzLDYwICs1NywzMyBAQAogCV9feGNoZygodiksIChwdHIpLCBzaXplb2YoKnB0cikpCiAKIC8qCi0gKiBUaGUgc2VtYW50aWNzIG9mIFhDSEdDTVA4QiBhcmUgYSBiaXQgc3RyYW5nZSwgdGhpcyBpcyB3aHkKLSAqIHRoZXJlIGlzIGEgbG9vcCBhbmQgdGhlIGxvYWRpbmcgb2YgJSVlYXggYW5kICUlZWR4IGhhcyB0bwotICogYmUgaW5zaWRlLiBUaGlzIGlubGluZXMgd2VsbCBpbiBtb3N0IGNhc2VzLCB0aGUgY2FjaGVkCi0gKiBjb3N0IGlzIGFyb3VuZCB+MzggY3ljbGVzLiAoaW4gdGhlIGZ1dHVyZSB3ZSBtaWdodCB3YW50Ci0gKiB0byBkbyBhbiBTSU1ELzNETk9XIS9NTVgvRlBVIDY0LWJpdCBzdG9yZSBoZXJlLCBidXQgdGhhdAotICogbWlnaHQgaGF2ZSBhbiBpbXBsaWNpdCBGUFUtc2F2ZSBhcyBhIGNvc3QsIHNvIGl0J3Mgbm90Ci0gKiBjbGVhciB3aGljaCBwYXRoIHRvIGdvLikKKyAqIENNUFhDSEc4QiBvbmx5IHdyaXRlcyB0byB0aGUgdGFyZ2V0IGlmIHdlIGhhZCB0aGUgcHJldmlvdXMKKyAqIHZhbHVlIGluIHJlZ2lzdGVycywgb3RoZXJ3aXNlIGl0IGFjdHMgYXMgYSByZWFkIGFuZCBnaXZlcyB1cyB0aGUKKyAqICJuZXcgcHJldmlvdXMiIHZhbHVlLiAgVGhhdCBpcyB3aHkgdGhlcmUgaXMgYSBsb29wLiAgUHJlbG9hZGluZworICogRURYOkVBWCBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogaW4gdGhlIGNvbW1vbiBjYXNlIGl0IG1lYW5zCisgKiB3ZSBuZWVkIG9ubHkgb25lIGxvY2tlZCBvcGVyYXRpb24uCiAgKgotICogY21weGNoZzhiIG11c3QgYmUgdXNlZCB3aXRoIHRoZSBsb2NrIHByZWZpeCBoZXJlIHRvIGFsbG93Ci0gKiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXRvbWljYWxseSwgc2VlIHBhZ2UgMy0xMDIKLSAqIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQgcmVmZXJlbmNlIDI0MzE5MTAyLnBkZi4gV2UgbmVlZAotICogdGhlIHJlYWRlciBzaWRlIHRvIHNlZSB0aGUgY29oZXJlbnQgNjRiaXQgdmFsdWUuCisgKiBBIFNJTUQvM0ROT1chL01NWC9GUFUgNjQtYml0IHN0b3JlIGhlcmUgd291bGQgcmVxdWlyZSBhdCB0aGUgdmVyeQorICogbGVhc3QgYW4gRlBVIHNhdmUgYW5kL29yICVjcjAudHMgbWFuaXB1bGF0aW9uLgorICoKKyAqIGNtcHhjaGc4YiBtdXN0IGJlIHVzZWQgd2l0aCB0aGUgbG9jayBwcmVmaXggaGVyZSB0byBhbGxvdyB0aGUKKyAqIGluc3RydWN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0b21pY2FsbHkuICBXZSBuZWVkIHRvIGhhdmUgdGhlIHJlYWRlcgorICogc2lkZSB0byBzZWUgdGhlIGNvaGVyZW50IDY0Yml0IHZhbHVlLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfNjRiaXQodW5zaWduZWQgbG9uZyBsb25nICpwdHIsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGxvdywgdW5zaWduZWQgaW50IGhpZ2gpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0XzY0Yml0KHZvbGF0aWxlIHU2NCAqcHRyLCB1NjQgdmFsdWUpCiB7CisJdTMyIGxvdyAgPSB2YWx1ZTsKKwl1MzIgaGlnaCA9IHZhbHVlID4+IDMyOworCXU2NCBwcmV2ID0gKnB0cjsKKwogCWFzbSB2b2xhdGlsZSgiXG4xOlx0IgotCQkgICAgICJtb3ZsICglMCksICUlZWF4XG5cdCIKLQkJICAgICAibW92bCA0KCUwKSwgJSVlZHhcblx0IgotCQkgICAgIExPQ0tfUFJFRklYICJjbXB4Y2hnOGIgKCUwKVxuXHQiCisJCSAgICAgTE9DS19QUkVGSVggImNtcHhjaGc4YiAlMFxuXHQiCiAJCSAgICAgImpueiAxYiIKLQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KLQkJICAgICA6ICJEIihwdHIpLAotCQkgICAgICAgImIiKGxvdyksCi0JCSAgICAgICAiYyIoaGlnaCkKLQkJICAgICA6ICJheCIsICJkeCIsICJtZW1vcnkiKTsKKwkJICAgICA6ICI9bSIgKCpwdHIpLCAiK0EiIChwcmV2KQorCQkgICAgIDogImIiIChsb3cpLCAiYyIgKGhpZ2gpCisJCSAgICAgOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF82NGJpdF9jb25zdGFudCh1bnNpZ25lZCBsb25nIGxvbmcgKnB0ciwKLQkJCQkJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKQotewotCV9fc2V0XzY0Yml0KHB0ciwgKHVuc2lnbmVkIGludCl2YWx1ZSwgKHVuc2lnbmVkIGludCkodmFsdWUgPj4gMzIpKTsKLX0KLQotI2RlZmluZSBsbF9sb3coeCkJKigoKHVuc2lnbmVkIGludCAqKSYoeCkpICsgMCkKLSNkZWZpbmUgbGxfaGlnaCh4KQkqKCgodW5zaWduZWQgaW50ICopJih4KSkgKyAxKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfNjRiaXRfdmFyKHVuc2lnbmVkIGxvbmcgbG9uZyAqcHRyLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSkKLXsKLQlfX3NldF82NGJpdChwdHIsIGxsX2xvdyh2YWx1ZSksIGxsX2hpZ2godmFsdWUpKTsKLX0KLQotI2RlZmluZSBzZXRfNjRiaXQocHRyLCB2YWx1ZSkJCQlcCi0JKF9fYnVpbHRpbl9jb25zdGFudF9wKCh2YWx1ZSkpCQlcCi0JID8gX19zZXRfNjRiaXRfY29uc3RhbnQoKHB0ciksICh2YWx1ZSkpCVwKLQkgOiBfX3NldF82NGJpdF92YXIoKHB0ciksICh2YWx1ZSkpKQotCi0jZGVmaW5lIF9zZXRfNjRiaXQocHRyLCB2YWx1ZSkJCQkJCQlcCi0JKF9fYnVpbHRpbl9jb25zdGFudF9wKHZhbHVlKQkJCQkJXAotCSA/IF9fc2V0XzY0Yml0KHB0ciwgKHVuc2lnbmVkIGludCkodmFsdWUpLAkJCVwKLQkJICAgICAgICh1bnNpZ25lZCBpbnQpKCh2YWx1ZSkgPj4gMzIpKQkJCVwKLQkgOiBfX3NldF82NGJpdChwdHIsIGxsX2xvdygodmFsdWUpKSwgbGxfaGlnaCgodmFsdWUpKSkpCi0KIGV4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpOwogCiAvKgpAQCAtMTIxLDIzICs5OCwzMiBAQAogCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnYiAlYjEsJTIiCQkJXAotCQkJICAgICA6ICI9YSIoX19yZXQpCQkJCVwKLQkJCSAgICAgOiAicSIoX19uZXcpLCAibSIoKl9feGcocHRyKSksICIwIihfX29sZCkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTggKl9fcHRyID0gKHZvbGF0aWxlIHU4ICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnYiAlMiwlMSIJCQlcCisJCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogInEiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAogCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAogCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKIAljYXNlIDI6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hndyAldzEsJTIiCQkJXAotCQkJICAgICA6ICI9YSIoX19yZXQpCQkJCVwKLQkJCSAgICAgOiAiciIoX19uZXcpLCAibSIoKl9feGcocHRyKSksICIwIihfX29sZCkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTE2ICpfX3B0ciA9ICh2b2xhdGlsZSB1MTYgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGd3ICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCiAJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCiAJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAogCWNhc2UgNDoJCQkJCQkJCVwKLQkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdsICUxLCUyIgkJCVwKLQkJCSAgICAgOiAiPWEiKF9fcmV0KQkJCQlcCi0JCQkgICAgIDogInIiKF9fbmV3KSwgIm0iKCpfX3hnKHB0cikpLCAiMCIoX19vbGQpCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnbCAlMiwlMSIJCQlcCisJCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAogCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAogCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKIAlkZWZhdWx0OgkJCQkJCQlcCiAJCV9fY21weGNoZ193cm9uZ19zaXplKCk7CQkJCQlcCiAJfQkJCQkJCQkJXApAQCAtMTc1LDMyICsxNjEsMjggQEAKIAkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKG4pKSkKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2NtcHhjaGc2NCh2b2xhdGlsZSB2b2lkICpwdHIsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBsb25nIG9sZCwKLQkJCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbmV3KQorc3RhdGljIGlubGluZSB1NjQgX19jbXB4Y2hnNjQodm9sYXRpbGUgdTY0ICpwdHIsIHU2NCBvbGQsIHU2NCBuZXcpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHByZXY7Ci0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJjbXB4Y2hnOGIgJTMiCi0JCSAgICAgOiAiPUEiKHByZXYpCi0JCSAgICAgOiAiYiIoKHVuc2lnbmVkIGxvbmcpbmV3KSwKLQkJICAgICAgICJjIigodW5zaWduZWQgbG9uZykobmV3ID4+IDMyKSksCi0JCSAgICAgICAibSIoKl9feGcocHRyKSksCi0JCSAgICAgICAiMCIob2xkKQorCXU2NCBwcmV2OworCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAiY21weGNoZzhiICUxIgorCQkgICAgIDogIj1BIiAocHJldiksCisJCSAgICAgICAiK20iICgqcHRyKQorCQkgICAgIDogImIiICgodTMyKW5ldyksCisJCSAgICAgICAiYyIgKCh1MzIpKG5ldyA+PiAzMikpLAorCQkgICAgICAgIjAiIChvbGQpCiAJCSAgICAgOiAibWVtb3J5Iik7CiAJcmV0dXJuIHByZXY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fY21weGNoZzY0X2xvY2FsKHZvbGF0aWxlIHZvaWQgKnB0ciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvbGQsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGxvbmcgbmV3KQorc3RhdGljIGlubGluZSB1NjQgX19jbXB4Y2hnNjRfbG9jYWwodm9sYXRpbGUgdTY0ICpwdHIsIHU2NCBvbGQsIHU2NCBuZXcpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHByZXY7Ci0JYXNtIHZvbGF0aWxlKCJjbXB4Y2hnOGIgJTMiCi0JCSAgICAgOiAiPUEiKHByZXYpCi0JCSAgICAgOiAiYiIoKHVuc2lnbmVkIGxvbmcpbmV3KSwKLQkJICAgICAgICJjIigodW5zaWduZWQgbG9uZykobmV3ID4+IDMyKSksCi0JCSAgICAgICAibSIoKl9feGcocHRyKSksCi0JCSAgICAgICAiMCIob2xkKQorCXU2NCBwcmV2OworCWFzbSB2b2xhdGlsZSgiY21weGNoZzhiICUxIgorCQkgICAgIDogIj1BIiAocHJldiksCisJCSAgICAgICAiK20iICgqcHRyKQorCQkgICAgIDogImIiICgodTMyKW5ldyksCisJCSAgICAgICAiYyIgKCh1MzIpKG5ldyA+PiAzMikpLAorCQkgICAgICAgIjAiIChvbGQpCiAJCSAgICAgOiAibWVtb3J5Iik7CiAJcmV0dXJuIHByZXY7CiB9CkBAIC0yNjQsOCArMjQ2LDYgQEAKICAqIHRvIHNpbXVsYXRlIHRoZSBjbXB4Y2hnOGIgb24gdGhlIDgwMzg2IGFuZCA4MDQ4NiBDUFUuCiAgKi8KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBjbXB4Y2hnXzQ4Nl91NjQodm9sYXRpbGUgdm9pZCAqLCB1NjQsIHU2NCk7Ci0KICNkZWZpbmUgY21weGNoZzY0KHB0ciwgbywgbikJCQkJCVwKICh7CQkJCQkJCQlcCiAJX190eXBlb2ZfXygqKHB0cikpIF9fcmV0OwkJCQlcCkBAIC0yODMsMjAgKzI2MywyMCBAQAogCV9fcmV0OyB9KQogCiAKLQotI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fcmV0OwkJCQkJXAotCWlmIChsaWtlbHkoYm9vdF9jcHVfZGF0YS54ODYgPiA0KSkJCQkJXAotCQlfX3JldCA9IChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnNjRfbG9jYWwoKHB0ciksCVwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKShvKSwJCVwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKShuKSk7CQlcCi0JZWxzZQkJCQkJCQkJXAotCQlfX3JldCA9IChfX3R5cGVvZl9fKCoocHRyKSkpY21weGNoZ180ODZfdTY0KChwdHIpLAlcCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykobyksCQlcCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykobikpOwkJXAotCV9fcmV0OwkJCQkJCQkJXAotfSkKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikJCQkJXAorKHsJCQkJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19yZXQ7CQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQgPSAobyk7CQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19uZXcgPSAobik7CQkJCVwKKwlhbHRlcm5hdGl2ZV9pbygiY2FsbCBjbXB4Y2hnOGJfZW11IiwJCQlcCisJCSAgICAgICAiY21weGNoZzhiICglJWVzaSkiICwJCQlcCisJCSAgICAgICBYODZfRkVBVFVSRV9DWDgsCQkJCVwKKwkJICAgICAgICI9QSIgKF9fcmV0KSwJCQkJXAorCQkgICAgICAgIlMiICgocHRyKSksICIwIiAoX19vbGQpLAkJXAorCQkgICAgICAgImIiICgodW5zaWduZWQgaW50KV9fbmV3KSwJCVwKKwkJICAgICAgICJjIiAoKHVuc2lnbmVkIGludCkoX19uZXc+PjMyKSkJCVwKKwkJICAgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJX19yZXQ7IH0pCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzY0LmgKaW5kZXggNDg1YWU0MS4uNDIzYWU1OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ182NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaApAQCAtMyw1MSArMyw2MCBAQAogCiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+IC8qIFByb3ZpZGVzIExPQ0tfUFJFRklYICovCiAKLSNkZWZpbmUgX194Zyh4KSAoKHZvbGF0aWxlIGxvbmcgKikoeCkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfNjRiaXQodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfNjRiaXQodm9sYXRpbGUgdTY0ICpwdHIsIHU2NCB2YWwpCiB7CiAJKnB0ciA9IHZhbDsKIH0KIAotI2RlZmluZSBfc2V0XzY0Yml0IHNldF82NGJpdAotCiBleHRlcm4gdm9pZCBfX3hjaGdfd3Jvbmdfc2l6ZSh2b2lkKTsKIGV4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpOwogCiAvKgotICogTm90ZTogbm8gImxvY2siIHByZWZpeCBldmVuIG9uIFNNUDogeGNoZyBhbHdheXMgaW1wbGllcyBsb2NrIGFueXdheQotICogTm90ZSAyOiB4Y2hnIGhhcyBzaWRlIGVmZmVjdCwgc28gdGhhdCBhdHRyaWJ1dGUgdm9sYXRpbGUgaXMgbmVjZXNzYXJ5LAotICoJICBidXQgZ2VuZXJhbGx5IHRoZSBwcmltaXRpdmUgaXMgaW52YWxpZCwgKnB0ciBpcyBvdXRwdXQgYXJndW1lbnQuIC0tQU5LCisgKiBOb3RlOiBubyAibG9jayIgcHJlZml4IGV2ZW4gb24gU01QOiB4Y2hnIGFsd2F5cyBpbXBsaWVzIGxvY2sgYW55d2F5LgorICogU2luY2UgdGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBwcm90ZWN0IG90aGVyIG1lbW9yeSBpbmZvcm1hdGlvbiwgd2UKKyAqIHVzZSAiYXNtIHZvbGF0aWxlIiBhbmQgIm1lbW9yeSIgY2xvYmJlcnMgdG8gcHJldmVudCBnY2MgZnJvbSBtb3ZpbmcKKyAqIGluZm9ybWF0aW9uIGFyb3VuZC4KICAqLwogI2RlZmluZSBfX3hjaGcoeCwgcHRyLCBzaXplKQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCV9fdHlwZW9mKCoocHRyKSkgX194ID0gKHgpOwkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCiAJY2FzZSAxOgkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoInhjaGdiICViMCwlMSIJCQkJXAotCQkJICAgICA6ICI9cSIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtIiAoKl9feGcocHRyKSksICIwIiAoX194KQkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTggKl9fcHRyID0gKHZvbGF0aWxlIHU4ICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZSgieGNoZ2IgJTAsJTEiCQkJCVwKKwkJCSAgICAgOiAiPXEiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogIjAiIChfX3gpCQkJCVwKIAkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKIAkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCiAJY2FzZSAyOgkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoInhjaGd3ICV3MCwlMSIJCQkJXAotCQkJICAgICA6ICI9ciIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtIiAoKl9feGcocHRyKSksICIwIiAoX194KQkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTE2ICpfX3B0ciA9ICh2b2xhdGlsZSB1MTYgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKCJ4Y2hndyAlMCwlMSIJCQkJXAorCQkJICAgICA6ICI9ciIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAogCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAogCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKIAljYXNlIDQ6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ2wgJWswLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm0iICgqX194ZyhwdHIpKSwgIjAiIChfX3gpCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUoInhjaGdsICUwLCUxIgkJCQlcCisJCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICIwIiAoX194KQkJCQlcCiAJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCiAJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAogCWNhc2UgODoJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHU2NCAqX19wdHIgPSAodm9sYXRpbGUgdTY0ICopKHB0cik7CQlcCiAJCWFzbSB2b2xhdGlsZSgieGNoZ3EgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibSIgKCpfX3hnKHB0cikpLCAiMCIgKF9feCkJCVwKKwkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogIjAiIChfX3gpCQkJCVwKIAkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKIAkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCiAJZGVmYXVsdDoJCQkJCQkJXAogCQlfX3hjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAogCX0JCQkJCQkJCVwKQEAgLTcxLDI5ICs4MCw0MSBAQAogCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnYiAlYjEsJTIiCQkJXAotCQkJICAgICA6ICI9YSIoX19yZXQpCQkJCVwKLQkJCSAgICAgOiAicSIoX19uZXcpLCAibSIoKl9feGcocHRyKSksICIwIihfX29sZCkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTggKl9fcHRyID0gKHZvbGF0aWxlIHU4ICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnYiAlMiwlMSIJCQlcCisJCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogInEiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAogCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAogCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKIAljYXNlIDI6CQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hndyAldzEsJTIiCQkJXAotCQkJICAgICA6ICI9YSIoX19yZXQpCQkJCVwKLQkJCSAgICAgOiAiciIoX19uZXcpLCAibSIoKl9feGcocHRyKSksICIwIihfX29sZCkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTE2ICpfX3B0ciA9ICh2b2xhdGlsZSB1MTYgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGd3ICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCiAJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCiAJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAogCWNhc2UgNDoJCQkJCQkJCVwKLQkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdsICVrMSwlMiIJCQlcCi0JCQkgICAgIDogIj1hIihfX3JldCkJCQkJXAotCQkJICAgICA6ICJyIihfX25ldyksICJtIigqX194ZyhwdHIpKSwgIjAiKF9fb2xkKQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2wgJTIsJTEiCQkJXAorCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKIAkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKIAkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCiAJY2FzZSA4OgkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ3EgJTEsJTIiCQkJXAotCQkJICAgICA6ICI9YSIoX19yZXQpCQkJCVwKLQkJCSAgICAgOiAiciIoX19uZXcpLCAibSIoKl9feGcocHRyKSksICIwIihfX29sZCkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTY0ICpfX3B0ciA9ICh2b2xhdGlsZSB1NjQgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdxICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCiAJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCiAJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAogCWRlZmF1bHQ6CQkJCQkJCVwKIAkJX19jbXB4Y2hnX3dyb25nX3NpemUoKTsJCQkJCVwKIAl9CQkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKaW5kZXggNDY4MTQ1OS4uMGIyMDViOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaApAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9yZXF1aXJlZC1mZWF0dXJlcy5oPgogCi0jZGVmaW5lIE5DQVBJTlRTCTkJLyogTiAzMi1iaXQgd29yZHMgd29ydGggb2YgaW5mbyAqLworI2RlZmluZSBOQ0FQSU5UUwkxMAkvKiBOIDMyLWJpdCB3b3JkcyB3b3J0aCBvZiBpbmZvICovCiAKIC8qCiAgKiBOb3RlOiBJZiB0aGUgY29tbWVudCBiZWdpbnMgd2l0aCBhIHF1b3RlZCBzdHJpbmcsIHRoYXQgc3RyaW5nIGlzIHVzZWQKQEAgLTg5LDcgKzg5LDcgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDICgzKjMyKzE4KSAvKiAiIiBMZmVuY2Ugc3luY2hyb25pemVzIFJEVFNDICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFXzExQVAJKDMqMzIrMTkpIC8qICIiIEJhZCBsb2NhbCBBUElDIGFrYSAxMUFQICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX05PUEwJKDMqMzIrMjApIC8qIFRoZSBOT1BMICgwRiAxRikgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0FNREMxRQkoMyozMisyMSkgLyogQU1EIEMxRSBkZXRlY3RlZCAqLworCQkJCQkgIC8qIDIxIGF2YWlsYWJsZSwgd2FzIEFNRF9DMUUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFRPUE9MT0dZCSgzKjMyKzIyKSAvKiBjcHUgdG9wb2xvZ3kgZW51bSBleHRlbnNpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQ19SRUxJQUJMRSAoMyozMisyMykgLyogVFNDIGlzIGtub3duIHRvIGJlIHJlbGlhYmxlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDCSgzKjMyKzI0KSAvKiBUU0MgZG9lcyBub3Qgc3RvcCBpbiBDIHN0YXRlcyAqLwpAQCAtMTI0LDYgKzEyNCw4IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1hTQVZFCSg0KjMyKzI2KSAvKiBYU0FWRS9YUlNUT1IvWFNFVEJWL1hHRVRCViAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9PU1hTQVZFCSg0KjMyKzI3KSAvKiAiIiBYU0FWRSBlbmFibGVkIGluIHRoZSBPUyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9BVlgJCSg0KjMyKzI4KSAvKiBBZHZhbmNlZCBWZWN0b3IgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9GMTZDCSg0KjMyKzI5KSAvKiAxNi1iaXQgZnAgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUkRSTkQJKDQqMzIrMzApIC8qIFRoZSBSRFJBTkQgaW5zdHJ1Y3Rpb24gKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfSFlQRVJWSVNPUgkoNCozMiszMSkgLyogUnVubmluZyBvbiBhIGh5cGVydmlzb3IgKi8KIAogLyogVklBL0N5cml4L0NlbnRhdXItZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4QzAwMDAwMDEsIHdvcmQgNSAqLwpAQCAtMTU3LDIyICsxNTksMjkgQEAKIAogLyoKICAqIEF1eGlsaWFyeSBmbGFnczogTGludXggZGVmaW5lZCAtIEZvciBmZWF0dXJlcyBzY2F0dGVyZWQgaW4gdmFyaW91cwotICogQ1BVSUQgbGV2ZWxzIGxpa2UgMHg2LCAweEEgZXRjCisgKiBDUFVJRCBsZXZlbHMgbGlrZSAweDYsIDB4QSBldGMsIHdvcmQgNwogICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0lEQQkJKDcqMzIrIDApIC8qIEludGVsIER5bmFtaWMgQWNjZWxlcmF0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FSQVQJKDcqMzIrIDEpIC8qIEFsd2F5cyBSdW5uaW5nIEFQSUMgVGltZXIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1BCCQkoNyozMisgMikgLyogQU1EIENvcmUgUGVyZm9ybWFuY2UgQm9vc3QgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRVBCCQkoNyozMisgMykgLyogSUEzMl9FTkVSR1lfUEVSRl9CSUFTIHN1cHBvcnQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNBVkVPUFQJKDcqMzIrIDQpIC8qIE9wdGltaXplZCBYc2F2ZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QTE4JCSg3KjMyKyA1KSAvKiBJbnRlbCBQb3dlciBMaW1pdCBOb3RpZmljYXRpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUFRTCQkoNyozMisgNikgLyogSW50ZWwgUGFja2FnZSBUaGVybWFsIFN0YXR1cyAqLwogCi0vKiBWaXJ0dWFsaXphdGlvbiBmbGFnczogTGludXggZGVmaW5lZCAqLworLyogVmlydHVhbGl6YXRpb24gZmxhZ3M6IExpbnV4IGRlZmluZWQsIHdvcmQgOCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9UUFJfU0hBRE9XICAoOCozMisgMCkgLyogSW50ZWwgVFBSIFNoYWRvdyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9WTk1JICAgICAgICAoOCozMisgMSkgLyogSW50ZWwgVmlydHVhbCBOTUkgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRkxFWFBSSU9SSVRZICg4KjMyKyAyKSAvKiBJbnRlbCBGbGV4UHJpb3JpdHkgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRVBUICAgICAgICAgKDgqMzIrIDMpIC8qIEludGVsIEV4dGVuZGVkIFBhZ2UgVGFibGUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfVlBJRCAgICAgICAgKDgqMzIrIDQpIC8qIEludGVsIFZpcnR1YWwgUHJvY2Vzc29yIElEICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX05QVAkJKDgqMzIrNSkgIC8qIEFNRCBOZXN0ZWQgUGFnZSBUYWJsZSBzdXBwb3J0ICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0xCUlYJKDgqMzIrNikgIC8qIEFNRCBMQlIgVmlydHVhbGl6YXRpb24gc3VwcG9ydCAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9TVk1MCSg4KjMyKzcpICAvKiAic3ZtX2xvY2siIEFNRCBTVk0gbG9ja2luZyBNU1IgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfTlJJUFMJKDgqMzIrOCkgIC8qICJucmlwX3NhdmUiIEFNRCBTVk0gbmV4dF9yaXAgc2F2ZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9OUFQJCSg4KjMyKyA1KSAvKiBBTUQgTmVzdGVkIFBhZ2UgVGFibGUgc3VwcG9ydCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9MQlJWCSg4KjMyKyA2KSAvKiBBTUQgTEJSIFZpcnR1YWxpemF0aW9uIHN1cHBvcnQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU1ZNTAkoOCozMisgNykgLyogInN2bV9sb2NrIiBBTUQgU1ZNIGxvY2tpbmcgTVNSICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX05SSVBTCSg4KjMyKyA4KSAvKiAibnJpcF9zYXZlIiBBTUQgU1ZNIG5leHRfcmlwIHNhdmUgKi8KKworLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDc6MCAoZWJ4KSwgd29yZCA5ICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZTR1NCQVNFCSg5KjMyKyAwKSAvKiB7UkQvV1J9e0ZTL0dTfUJBU0UgaW5zdHJ1Y3Rpb25zKi8KIAogI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQogCkBAIC0xOTQsNyArMjAzLDkgQEAKIAkgICAoKChiaXQpPj41KT09NCAmJiAoMVVMPDwoKGJpdCkmMzEpICYgUkVRVUlSRURfTUFTSzQpKSB8fAlcCiAJICAgKCgoYml0KT4+NSk9PTUgJiYgKDFVTDw8KChiaXQpJjMxKSAmIFJFUVVJUkVEX01BU0s1KSkgfHwJXAogCSAgICgoKGJpdCk+PjUpPT02ICYmICgxVUw8PCgoYml0KSYzMSkgJiBSRVFVSVJFRF9NQVNLNikpIHx8CVwKLQkgICAoKChiaXQpPj41KT09NyAmJiAoMVVMPDwoKGJpdCkmMzEpICYgUkVRVUlSRURfTUFTSzcpKSApCVwKKwkgICAoKChiaXQpPj41KT09NyAmJiAoMVVMPDwoKGJpdCkmMzEpICYgUkVRVUlSRURfTUFTSzcpKSB8fAlcCisJICAgKCgoYml0KT4+NSk9PTggJiYgKDFVTDw8KChiaXQpJjMxKSAmIFJFUVVJUkVEX01BU0s4KSkgfHwJXAorCSAgICgoKGJpdCk+PjUpPT05ICYmICgxVUw8PCgoYml0KSYzMSkgJiBSRVFVSVJFRF9NQVNLOSkpICkJXAogCSAgPyAxIDoJCQkJCQkJCVwKIAkgdGVzdF9jcHVfY2FwKGMsIGJpdCkpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAppbmRleCA5NDIyNTUzLi41MjhhMTFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKIC8qIEF2YWlsYWJsZSBIVyBicmVha3BvaW50IGxlbmd0aCBlbmNvZGluZ3MgKi8KKyNkZWZpbmUgWDg2X0JSRUFLUE9JTlRfTEVOX1gJCTB4MDAKICNkZWZpbmUgWDg2X0JSRUFLUE9JTlRfTEVOXzEJCTB4NDAKICNkZWZpbmUgWDg2X0JSRUFLUE9JTlRfTEVOXzIJCTB4NDQKICNkZWZpbmUgWDg2X0JSRUFLUE9JTlRfTEVOXzQJCTB4NGMKLSNkZWZpbmUgWDg2X0JSRUFLUE9JTlRfTEVOX0VYRUNVVEUJMHg0MAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2RlZmluZSBYODZfQlJFQUtQT0lOVF9MRU5fOAkJMHg0OApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCmluZGV4IDcwYWJkYTcuLmZmMjU0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKQEAgLTQ1LDUgKzQ1LDYgQEAKIC8qIFJlY29nbml6ZWQgaHlwZXJ2aXNvcnMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX3Ztd2FyZTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX21zX2h5cGVydjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX3hlbl9odm07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTM4Ny5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaTM4Ny5oCmluZGV4IGM5OTFiM2EuLjgxNWM1YjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2kzODcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pMzg3LmgKQEAgLTQ4Miw2ICs0ODIsOCBAQAogCW1lbWNweShkc3QtPnN0YXRlLCBzcmMtPnN0YXRlLCB4c3RhdGVfc2l6ZSk7CiB9CiAKK2V4dGVybiB2b2lkIGZwdV9maW5pdChzdHJ1Y3QgZnB1ICpmcHUpOworCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgUFNIVUZCX1hNTTVfWE1NMCAuYnl0ZSAweDY2LCAweDBmLCAweDM4LCAweDAwLCAweGM1CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKaW5kZXggNDQ3MGM5YS4uMjlmNjY3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaApAQCAtMSw2ICsxLDEyIEBACiAjaWZuZGVmIF9BU01fWDg2X0lOVEVMX1NDVV9JUENfSF8KICNkZWZpbmUgIF9BU01fWDg2X0lOVEVMX1NDVV9JUENfSF8KIAorI2RlZmluZSBJUENNU0dfVlJUQwkweEZBCSAvKiBTZXQgdlJUQyBkZXZpY2UgKi8KKworLyogQ29tbWFuZCBpZCBhc3NvY2lhdGVkIHdpdGggbWVzc2FnZSBJUENNU0dfVlJUQyAqLworI2RlZmluZSBJUENfQ01EX1ZSVENfU0VUVElNRSAgICAgIDEgLyogU2V0IHRpbWUgKi8KKyNkZWZpbmUgSVBDX0NNRF9WUlRDX1NFVEFMQVJNICAgICAyIC8qIFNldCBhbGFybSAqLworCiAvKiBSZWFkIHNpbmdsZSByZWdpc3RlciAqLwogaW50IGludGVsX3NjdV9pcGNfaW9yZWFkOCh1MTYgYWRkciwgdTggKmRhdGEpOwogCkBAIC0yOCwyMCArMzQsNiBAQAogLyogVXBkYXRlIHNpbmdsZSByZWdpc3RlciBiYXNlZCBvbiB0aGUgbWFzayAqLwogaW50IGludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKHUxNiBhZGRyLCB1OCBkYXRhLCB1OCBtYXNrKTsKIAotLyoKLSAqIEluZGlyZWN0IHJlZ2lzdGVyIHJlYWQKLSAqIENhbiBiZSB1c2VkIHdoZW4gU0NDQihTeXN0ZW0gQ29udHJvbGxlciBDb25maWd1cmF0aW9uIEJsb2NrKSByZWdpc3RlcgotICogSFJJTShIb25vciBSZXN0cmljdGVkIElQQyBNZXNzYWdlcykgaXMgc2V0IChiaXQgMjMpCi0gKi8KLWludCBpbnRlbF9zY3VfaXBjX3JlZ2lzdGVyX3JlYWQodTMyIGFkZHIsIHUzMiAqZGF0YSk7Ci0KLS8qCi0gKiBJbmRpcmVjdCByZWdpc3RlciB3cml0ZQotICogQ2FuIGJlIHVzZWQgd2hlbiBTQ0NCKFN5c3RlbSBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24gQmxvY2spIHJlZ2lzdGVyCi0gKiBIUklNKEhvbm9yIFJlc3RyaWN0ZWQgSVBDIE1lc3NhZ2VzKSBpcyBzZXQgKGJpdCAyMykKLSAqLwotaW50IGludGVsX3NjdV9pcGNfcmVnaXN0ZXJfd3JpdGUodTMyIGFkZHIsIHUzMiBkYXRhKTsKLQogLyogSXNzdWUgY29tbWFuZHMgdG8gdGhlIFNDVSB3aXRoIG9yIHdpdGhvdXQgZGF0YSAqLwogaW50IGludGVsX3NjdV9pcGNfc2ltcGxlX2NvbW1hbmQoaW50IGNtZCwgaW50IHN1Yik7CiBpbnQgaW50ZWxfc2N1X2lwY19jb21tYW5kKGludCBjbWQsIGludCBzdWIsIHUzMiAqaW4sIGludCBpbmxlbiwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCmluZGV4IDg3NjdkOTkuLmUyY2EzMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3ZlY3RvcnMuaApAQCAtMTI1LDYgKzEyNSw5IEBACiAgKi8KICNkZWZpbmUgTUNFX1NFTEZfVkVDVE9SCQkJMHhlYgogCisvKiBYZW4gdmVjdG9yIGNhbGxiYWNrIHRvIHJlY2VpdmUgZXZlbnRzIGluIGEgSFZNIGRvbWFpbiAqLworI2RlZmluZSBYRU5fSFZNX0VWVENITl9DQUxMQkFDSwkJMHhlOQorCiAjZGVmaW5lIE5SX1ZFQ1RPUlMJCQkgMjU2CiAKICNkZWZpbmUgRlBVX0lSUQkJCQkgIDEzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZ2RiLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZ2RiLmgKaW5kZXggMDA2ZGEzNi4uMzk2ZjViNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2dkYi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2tnZGIuaApAQCAtMzksOSArMzksMTEgQEAKIAlHREJfRlMsCQkJLyogMTQgKi8KIAlHREJfR1MsCQkJLyogMTUgKi8KIH07CisjZGVmaW5lIEdEQl9PUklHX0FYCQk0MQorI2RlZmluZSBEQkdfTUFYX1JFR19OVU0JCTE2CiAjZGVmaW5lIE5VTVJFR0JZVEVTCQkoKEdEQl9HUysxKSo0KQogI2Vsc2UgLyogISBDT05GSUdfWDg2XzMyICovCi1lbnVtIHJlZ25hbWVzNjQgeworZW51bSByZWduYW1lcyB7CiAJR0RCX0FYLAkJCS8qIDAgKi8KIAlHREJfQlgsCQkJLyogMSAqLwogCUdEQl9DWCwJCQkvKiAyICovCkBAIC01OSwxNSArNjEsMTUgQEAKIAlHREJfUjE0LAkJLyogMTQgKi8KIAlHREJfUjE1LAkJLyogMTUgKi8KIAlHREJfUEMsCQkJLyogMTYgKi8KKwlHREJfUFMsCQkJLyogMTcgKi8KKwlHREJfQ1MsCQkJLyogMTggKi8KKwlHREJfU1MsCQkJLyogMTkgKi8KIH07Ci0KLWVudW0gcmVnbmFtZXMzMiB7Ci0JR0RCX1BTID0gMzQsCi0JR0RCX0NTLAotCUdEQl9TUywKLX07Ci0jZGVmaW5lIE5VTVJFR0JZVEVTCQkoKEdEQl9TUysxKSo0KQotI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KKyNkZWZpbmUgR0RCX09SSUdfQVgJCTU3CisjZGVmaW5lIERCR19NQVhfUkVHX05VTQkJMjAKKy8qIDE3IDY0IGJpdCByZWdzIGFuZCAzIDMyIGJpdCByZWdzICovCisjZGVmaW5lIE5VTVJFR0JZVEVTCQkoKDE3ICogOCkgKyAoMyAqIDQpKQorI2VuZGlmIC8qICEgQ09ORklHX1g4Nl8zMiAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9rZ2RiX2JyZWFrcG9pbnQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtLmgKaW5kZXggZmY5MDA1NS4uNGQ4ZGNiZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtLmgKQEAgLTIyLDYgKzIyLDggQEAKICNkZWZpbmUgX19LVk1fSEFWRV9YRU5fSFZNCiAjZGVmaW5lIF9fS1ZNX0hBVkVfVkNQVV9FVkVOVFMKICNkZWZpbmUgX19LVk1fSEFWRV9ERUJVR1JFR1MKKyNkZWZpbmUgX19LVk1fSEFWRV9YU0FWRQorI2RlZmluZSBfX0tWTV9IQVZFX1hDUlMKIAogLyogQXJjaGl0ZWN0dXJhbCBpbnRlcnJ1cHQgbGluZSBjb3VudC4gKi8KICNkZWZpbmUgS1ZNX05SX0lOVEVSUlVQVFMgMjU2CkBAIC0yOTksNCArMzAxLDI0IEBACiAJX191NjQgcmVzZXJ2ZWRbOV07CiB9OwogCisvKiBmb3IgS1ZNX0NBUF9YU0FWRSAqLworc3RydWN0IGt2bV94c2F2ZSB7CisJX191MzIgcmVnaW9uWzEwMjRdOworfTsKKworI2RlZmluZSBLVk1fTUFYX1hDUlMJMTYKKworc3RydWN0IGt2bV94Y3IgeworCV9fdTMyIHhjcjsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCB2YWx1ZTsKK307CisKK3N0cnVjdCBrdm1feGNycyB7CisJX191MzIgbnJfeGNyczsKKwlfX3UzMiBmbGFnczsKKwlzdHJ1Y3Qga3ZtX3hjciB4Y3JzW0tWTV9NQVhfWENSU107CisJX191NjQgcGFkZGluZ1sxNl07Cit9OworCiAjZW5kaWYgLyogX0FTTV9YODZfS1ZNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCmluZGV4IDBiMjcyOWIuLjUxY2ZkNzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaApAQCAtNTEsOCArNTEsMTAgQEAKICNkZWZpbmUgWDg2RU1VTF9VTkhBTkRMRUFCTEUgICAgMQogLyogVGVybWluYXRlIGVtdWxhdGlvbiBidXQgcmV0dXJuIHN1Y2Nlc3MgdG8gdGhlIGNhbGxlci4gKi8KICNkZWZpbmUgWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQgMiAvKiBwcm9wYWdhdGUgYSBnZW5lcmF0ZWQgZmF1bHQgdG8gZ3Vlc3QgKi8KLSNkZWZpbmUgWDg2RU1VTF9SRVRSWV9JTlNUUiAgICAgMiAvKiByZXRyeSB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHNvbWUgcmVhc29uICovCi0jZGVmaW5lIFg4NkVNVUxfQ01QWENIR19GQUlMRUQgIDIgLyogY21weGNoZyBkaWQgbm90IHNlZSBleHBlY3RlZCB2YWx1ZSAqLworI2RlZmluZSBYODZFTVVMX1JFVFJZX0lOU1RSICAgICAzIC8qIHJldHJ5IHRoZSBpbnN0cnVjdGlvbiBmb3Igc29tZSByZWFzb24gKi8KKyNkZWZpbmUgWDg2RU1VTF9DTVBYQ0hHX0ZBSUxFRCAgNCAvKiBjbXB4Y2hnIGRpZCBub3Qgc2VlIGV4cGVjdGVkIHZhbHVlICovCisjZGVmaW5lIFg4NkVNVUxfSU9fTkVFREVEICAgICAgIDUgLyogSU8gaXMgbmVlZGVkIHRvIGNvbXBsZXRlIGVtdWxhdGlvbiAqLworCiBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzIHsKIAkvKgogCSAqIHJlYWRfc3RkOiBSZWFkIGJ5dGVzIG9mIHN0YW5kYXJkIChub24tZW11bGF0ZWQvc3BlY2lhbCkgbWVtb3J5LgpAQCAtOTIsNiArOTQsNyBAQAogCWludCAoKnJlYWRfZW11bGF0ZWQpKHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICAgdm9pZCAqdmFsLAogCQkJICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkgICAgIHVuc2lnbmVkIGludCAqZXJyb3IsCiAJCQkgICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIAkvKgpAQCAtMTA0LDYgKzEwNyw3IEBACiAJaW50ICgqd3JpdGVfZW11bGF0ZWQpKHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICAgIGNvbnN0IHZvaWQgKnZhbCwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZXJyb3IsCiAJCQkgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAJLyoKQEAgLTExOCw2ICsxMjIsNyBAQAogCQkJCWNvbnN0IHZvaWQgKm9sZCwKIAkJCQljb25zdCB2b2lkICpuZXcsCiAJCQkJdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCXVuc2lnbmVkIGludCAqZXJyb3IsCiAJCQkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogCWludCAoKnBpb19pbl9lbXVsYXRlZCkoaW50IHNpemUsIHVuc2lnbmVkIHNob3J0IHBvcnQsIHZvaWQgKnZhbCwKQEAgLTEzMiwxOCArMTM3LDI2IEBACiAJCQkJICAgICAgaW50IHNlZywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAl1MTYgKCpnZXRfc2VnbWVudF9zZWxlY3RvcikoaW50IHNlZywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAl2b2lkICgqc2V0X3NlZ21lbnRfc2VsZWN0b3IpKHUxNiBzZWwsIGludCBzZWcsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9jYWNoZWRfc2VnbWVudF9iYXNlKShpbnQgc2VnLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXZvaWQgKCpnZXRfZ2R0KShzdHJ1Y3QgZGVzY19wdHIgKmR0LCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXVsb25nICgqZ2V0X2NyKShpbnQgY3IsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0Jdm9pZCAoKnNldF9jcikoaW50IGNyLCB1bG9uZyB2YWwsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJaW50ICgqc2V0X2NyKShpbnQgY3IsIHVsb25nIHZhbCwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAlpbnQgKCpjcGwpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0Jdm9pZCAoKnNldF9yZmxhZ3MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByZmxhZ3MpOworCWludCAoKmdldF9kcikoaW50IGRyLCB1bnNpZ25lZCBsb25nICpkZXN0LCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCWludCAoKnNldF9kcikoaW50IGRyLCB1bnNpZ25lZCBsb25nIHZhbHVlLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCWludCAoKnNldF9tc3IpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zcl9pbmRleCwgdTY0IGRhdGEpOworCWludCAoKmdldF9tc3IpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zcl9pbmRleCwgdTY0ICpwZGF0YSk7CiB9OwogCiAvKiBUeXBlLCBhZGRyZXNzLW9mLCBhbmQgdmFsdWUgb2YgYW4gaW5zdHJ1Y3Rpb24ncyBvcGVyYW5kLiAqLwogc3RydWN0IG9wZXJhbmQgewogCWVudW0geyBPUF9SRUcsIE9QX01FTSwgT1BfSU1NLCBPUF9OT05FIH0gdHlwZTsKIAl1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyB2YWwsIG9yaWdfdmFsLCAqcHRyOworCXVuc2lnbmVkIGxvbmcgb3JpZ192YWwsICpwdHI7CisJdW5pb24geworCQl1bnNpZ25lZCBsb25nIHZhbDsKKwkJY2hhciB2YWxwdHJbc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICsgMl07CisJfTsKIH07CiAKIHN0cnVjdCBmZXRjaF9jYWNoZSB7CkBAIC0xODYsNiArMTk5LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1vZHJtX3ZhbDsKIAlzdHJ1Y3QgZmV0Y2hfY2FjaGUgZmV0Y2g7CiAJc3RydWN0IHJlYWRfY2FjaGUgaW9fcmVhZDsKKwlzdHJ1Y3QgcmVhZF9jYWNoZSBtZW1fcmVhZDsKIH07CiAKIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0IHsKQEAgLTIwMiw2ICsyMTYsMTIgQEAKIAlpbnQgaW50ZXJydXB0aWJpbGl0eTsKIAogCWJvb2wgcmVzdGFydDsgLyogcmVzdGFydCBzdHJpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgd3JpdGViYWNrICovCisKKwlpbnQgZXhjZXB0aW9uOyAvKiBleGNlcHRpb24gdGhhdCBoYXBwZW5zIGR1cmluZyBlbXVsYXRpb24gb3IgLTEgKi8KKwl1MzIgZXJyb3JfY29kZTsgLyogZXJyb3IgY29kZSBmb3IgZXhjZXB0aW9uICovCisJYm9vbCBlcnJvcl9jb2RlX3ZhbGlkOworCXVuc2lnbmVkIGxvbmcgY3IyOyAvKiBmYXVsdGVkIGFkZHJlc3MgaW4gY2FzZSBvZiAjUEYgKi8KKwogCS8qIGRlY29kZSBjYWNoZSAqLwogCXN0cnVjdCBkZWNvZGVfY2FjaGUgZGVjb2RlOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDc2ZjU0ODMuLjUwMmU1M2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9wYXJhLmg+CkBAIC0zOSwxMSArNDAsMTQgQEAKIAkJCQkgIDB4RkZGRkZGMDAwMDAwMDAwMFVMTCkKIAogI2RlZmluZSBJTlZBTElEX1BBR0UgKH4oaHBhX3QpMCkKKyNkZWZpbmUgVkFMSURfUEFHRSh4KSAoKHgpICE9IElOVkFMSURfUEFHRSkKKwogI2RlZmluZSBVTk1BUFBFRF9HVkEgKH4oZ3BhX3QpMCkKIAogLyogS1ZNIEh1Z2VwYWdlIGRlZmluaXRpb25zIGZvciB4ODYgKi8KICNkZWZpbmUgS1ZNX05SX1BBR0VfU0laRVMJMwotI2RlZmluZSBLVk1fSFBBR0VfU0hJRlQoeCkJKFBBR0VfU0hJRlQgKyAoKCh4KSAtIDEpICogOSkpCisjZGVmaW5lIEtWTV9IUEFHRV9HRk5fU0hJRlQoeCkJKCgoeCkgLSAxKSAqIDkpCisjZGVmaW5lIEtWTV9IUEFHRV9TSElGVCh4KQkoUEFHRV9TSElGVCArIEtWTV9IUEFHRV9HRk5fU0hJRlQoeCkpCiAjZGVmaW5lIEtWTV9IUEFHRV9TSVpFKHgpCSgxVUwgPDwgS1ZNX0hQQUdFX1NISUZUKHgpKQogI2RlZmluZSBLVk1fSFBBR0VfTUFTSyh4KQkofihLVk1fSFBBR0VfU0laRSh4KSAtIDEpKQogI2RlZmluZSBLVk1fUEFHRVNfUEVSX0hQQUdFKHgpCShLVk1fSFBBR0VfU0laRSh4KSAvIFBBR0VfU0laRSkKQEAgLTY5LDggKzczLDYgQEAKIAogI2RlZmluZSBJT1BMX1NISUZUIDEyCiAKLSNkZWZpbmUgS1ZNX0FMSUFTX1NMT1RTIDQKLQogI2RlZmluZSBLVk1fUEVSTUlMTEVfTU1VX1BBR0VTIDIwCiAjZGVmaW5lIEtWTV9NSU5fQUxMT0NfTU1VX1BBR0VTIDY0CiAjZGVmaW5lIEtWTV9NTVVfSEFTSF9TSElGVCAxMApAQCAtMjQxLDcgKzI0Myw3IEBACiAJdm9pZCAoKnByZWZldGNoX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgICAgIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2UpOwogCWludCAoKnN5bmNfcGFnZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKTsKKwkJCSBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgYm9vbCBjbGVhcl91bnN5bmMpOwogCXZvaWQgKCppbnZscGcpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKTsKIAlocGFfdCByb290X2hwYTsKIAlpbnQgcm9vdF9sZXZlbDsKQEAgLTMwMSw4ICszMDMsOCBAQAogCQl1bnNpZ25lZCBsb25nIG1tdV9zZXE7CiAJfSB1cGRhdGVfcHRlOwogCi0Jc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCBob3N0X2Z4X2ltYWdlOwotCXN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgZ3Vlc3RfZnhfaW1hZ2U7CisJc3RydWN0IGZwdSBndWVzdF9mcHU7CisJdTY0IHhjcjA7CiAKIAlndmFfdCBtbWlvX2ZhdWx0X2NyMjsKIAlzdHJ1Y3Qga3ZtX3Bpb19yZXF1ZXN0IHBpbzsKQEAgLTM2MCwyNiArMzYyLDExIEBACiAKIAkvKiBmaWVsZHMgdXNlZCBieSBIWVBFUi1WIGVtdWxhdGlvbiAqLwogCXU2NCBodl92YXBpYzsKLX07CiAKLXN0cnVjdCBrdm1fbWVtX2FsaWFzIHsKLQlnZm5fdCBiYXNlX2dmbjsKLQl1bnNpZ25lZCBsb25nIG5wYWdlczsKLQlnZm5fdCB0YXJnZXRfZ2ZuOwotI2RlZmluZSBLVk1fQUxJQVNfSU5WQUxJRCAgICAgMVVMCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLSNkZWZpbmUgS1ZNX0FSQ0hfSEFTX1VOQUxJQVNfSU5TVEFOVElBVElPTgotCi1zdHJ1Y3Qga3ZtX21lbV9hbGlhc2VzIHsKLQlzdHJ1Y3Qga3ZtX21lbV9hbGlhcyBhbGlhc2VzW0tWTV9BTElBU19TTE9UU107Ci0JaW50IG5hbGlhc2VzOworCWNwdW1hc2tfdmFyX3Qgd2JpbnZkX2RpcnR5X21hc2s7CiB9OwogCiBzdHJ1Y3Qga3ZtX2FyY2ggewotCXN0cnVjdCBrdm1fbWVtX2FsaWFzZXMgKmFsaWFzZXM7Ci0KIAl1bnNpZ25lZCBpbnQgbl9mcmVlX21tdV9wYWdlczsKIAl1bnNpZ25lZCBpbnQgbl9yZXF1ZXN0ZWRfbW11X3BhZ2VzOwogCXVuc2lnbmVkIGludCBuX2FsbG9jX21tdV9wYWdlczsKQEAgLTUzMyw2ICs1MjAsOCBAQAogCiAJdm9pZCAoKnNldF9zdXBwb3J0ZWRfY3B1aWQpKHUzMiBmdW5jLCBzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqZW50cnkpOwogCisJYm9vbCAoKmhhc193YmludmRfZXhpdCkodm9pZCk7CisKIAljb25zdCBzdHJ1Y3QgdHJhY2VfcHJpbnRfZmxhZ3MgKmV4aXRfcmVhc29uc19zdHI7CiB9OwogCkBAIC01NzYsNyArNTY1LDYgQEAKICNkZWZpbmUgRU1VTFRZUEVfU0tJUAkJICAgICgxIDw8IDIpCiBpbnQgZW11bGF0ZV9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQl1bnNpZ25lZCBsb25nIGNyMiwgdTE2IGVycm9yX2NvZGUsIGludCBlbXVsYXRpb25fdHlwZSk7Ci12b2lkIGt2bV9yZXBvcnRfZW11bGF0aW9uX2ZhaWx1cmUoc3RydWN0IGt2bV92Y3B1ICpjdnB1LCBjb25zdCBjaGFyICpjb250ZXh0KTsKIHZvaWQgcmVhbG1vZGVfbGdkdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiBzaXplLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogdm9pZCByZWFsbW9kZV9saWR0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IHNpemUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiAKQEAgLTU5MSwxMCArNTc5LDcgQEAKIGludCBrdm1fZW11bGF0ZV9oYWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQgZW11bGF0ZV9pbnZscGcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyZXNzKTsKIGludCBlbXVsYXRlX2NsdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLWludCBlbXVsYXRvcl9nZXRfZHIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBkciwKLQkJICAgIHVuc2lnbmVkIGxvbmcgKmRlc3QpOwotaW50IGVtdWxhdG9yX3NldF9kcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CitpbnQga3ZtX2VtdWxhdGVfd2JpbnZkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIHZvaWQga3ZtX2dldF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9zZWdtZW50ICp2YXIsIGludCBzZWcpOwogaW50IGt2bV9sb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiBzZWxlY3RvciwgaW50IHNlZyk7CkBAIC02MDIsMTUgKzU4NywxNiBAQAogaW50IGt2bV90YXNrX3N3aXRjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiB0c3Nfc2VsZWN0b3IsIGludCByZWFzb24sCiAJCSAgICBib29sIGhhc19lcnJvcl9jb2RlLCB1MzIgZXJyb3JfY29kZSk7CiAKLXZvaWQga3ZtX3NldF9jcjAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMCk7Ci12b2lkIGt2bV9zZXRfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjMpOwotdm9pZCBrdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KTsKK2ludCBrdm1fc2V0X2NyMChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IwKTsKK2ludCBrdm1fc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IzKTsKK2ludCBrdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KTsKIHZvaWQga3ZtX3NldF9jcjgoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyOCk7CiBpbnQga3ZtX3NldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyB2YWwpOwogaW50IGt2bV9nZXRfZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgZHIsIHVuc2lnbmVkIGxvbmcgKnZhbCk7CiB1bnNpZ25lZCBsb25nIGt2bV9nZXRfY3I4KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9sbXN3KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBtc3cpOwogdm9pZCBrdm1fZ2V0X2NzX2RiX2xfYml0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCAqZGIsIGludCAqbCk7CitpbnQga3ZtX3NldF94Y3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgaW5kZXgsIHU2NCB4Y3IpOwogCiBpbnQga3ZtX2dldF9tc3JfY29tbW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zciwgdTY0ICpwZGF0YSk7CiBpbnQga3ZtX3NldF9tc3JfY29tbW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zciwgdTY0IGRhdGEpOwpAQCAtNjMwLDEyICs2MTYsNyBAQAogCiB2b2lkIGt2bV9pbmplY3Rfbm1pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKLXZvaWQgZnhfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotCi1pbnQgZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQodW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgIGNvbnN0IHZvaWQgKnZhbCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2ludCBmeF9pbml0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIHZvaWQga3ZtX21tdV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX21tdV9wdGVfd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsCkBAIC02NjQsOCArNjQ1LDYgQEAKIGludCBjb21wbGV0ZV9waW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGJvb2wga3ZtX2NoZWNrX2lvcGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAotc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqZ2ZuX3RvX21lbXNsb3RfdW5hbGlhc2VkKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKTsKLQogc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYWdlX2hlYWRlcihocGFfdCBzaGFkb3dfcGFnZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHNoYWRvd19wYWdlID4+IFBBR0VfU0hJRlQpOwpAQCAtNzE5LDIxICs2OTgsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fZnhfc2F2ZShzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICppbWFnZSkKLXsKLQlhc20oImZ4c2F2ZSAoJTApIjo6ICJyIiAoaW1hZ2UpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9meF9yZXN0b3JlKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmltYWdlKQotewotCWFzbSgiZnhyc3RvciAoJTApIjo6ICJyIiAoaW1hZ2UpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9meF9maW5pdCh2b2lkKQotewotCWFzbSgiZmluaXQiKTsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgZ2V0X3JkeF9pbml0X3ZhbCh2b2lkKQogewogCXJldHVybiAweDYwMDsgLyogUDYgZmFtaWx5ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9sb2NhbDY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9sb2NhbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2xvY2FsNjQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXJzdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXJzdC5oCmluZGV4IDQ1MWQzMGUuLjE2MzUwNzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21yc3QuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcnN0LmgKQEAgLTEzLDYgKzEzLDMyIEBACiBleHRlcm4gaW50IHBjaV9tcnN0X2luaXQodm9pZCk7CiBpbnQgX19pbml0IHNmaV9wYXJzZV9tcnRjKHN0cnVjdCBzZmlfdGFibGVfaGVhZGVyICp0YWJsZSk7CiAKKy8qCisgKiBNZWRmaWVsZCBpcyB0aGUgZm9sbG93LXVwIG9mIE1vb3Jlc3Rvd24sIGl0IGNvbWJpbmVzIHR3byBjaGlwIHNvbHV0aW9uIGludG8KKyAqIG9uZS4gT3RoZXIgdGhhbiB0aGF0IGl0IGFsc28gYWRkZWQgYWx3YXlzLW9uIGFuZCBjb25zdGFudCB0c2MgYW5kIGxhcGljCisgKiB0aW1lcnMuIE1lZGZpZWxkIGlzIHRoZSBwbGF0Zm9ybSBuYW1lLCBhbmQgdGhlIGNoaXAgbmFtZSBpcyBjYWxsZWQgUGVud2VsbAorICogd2UgdHJlYXQgTWVkZmllbGQvUGVud2VsbCBhcyBhIHZhcmlhbnQgb2YgTW9vcmVzdG93bi4gUGVud2VsbCBjYW4gYmUKKyAqIGlkZW50aWZpZWQgdmlhIE1TUnMuCisgKi8KK2VudW0gbXJzdF9jcHVfdHlwZSB7CisJTVJTVF9DUFVfQ0hJUF9MSU5DUk9GVCA9IDEsCisJTVJTVF9DUFVfQ0hJUF9QRU5XRUxMLAorfTsKKworZXh0ZXJuIGVudW0gbXJzdF9jcHVfdHlwZSBfX21yc3RfY3B1X2NoaXA7CitzdGF0aWMgZW51bSBtcnN0X2NwdV90eXBlIG1yc3RfaWRlbnRpZnlfY3B1KHZvaWQpCit7CisJcmV0dXJuIF9fbXJzdF9jcHVfY2hpcDsKK30KKworZW51bSBtcnN0X3RpbWVyX29wdGlvbnMgeworCU1SU1RfVElNRVJfREVGQVVMVCwKKwlNUlNUX1RJTUVSX0FQQlRfT05MWSwKKwlNUlNUX1RJTUVSX0xBUElDX0FQQlQsCit9OworCitleHRlcm4gZW51bSBtcnN0X3RpbWVyX29wdGlvbnMgbXJzdF90aW1lcl9vcHRpb25zOworCiAjZGVmaW5lIFNGSV9NVE1SX01BWF9OVU0gOAogI2RlZmluZSBTRklfTVJUQ19NQVgJOAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCmluZGV4IDhjN2FlNDMuLjY1YmJlYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIF9FRkVSX0xNQQkJMTAgLyogTG9uZyBtb2RlIGFjdGl2ZSAocmVhZC1vbmx5KSAqLwogI2RlZmluZSBfRUZFUl9OWAkJMTEgLyogTm8gZXhlY3V0ZSBlbmFibGUgKi8KICNkZWZpbmUgX0VGRVJfU1ZNRQkJMTIgLyogRW5hYmxlIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIF9FRkVSX0xNU0xFCQkxMyAvKiBMb25nIE1vZGUgU2VnbWVudCBMaW1pdCBFbmFibGUgKi8KICNkZWZpbmUgX0VGRVJfRkZYU1IJCTE0IC8qIEVuYWJsZSBGYXN0IEZYU0FWRS9GWFJTVE9SICovCiAKICNkZWZpbmUgRUZFUl9TQ0UJCSgxPDxfRUZFUl9TQ0UpCkBAIC0yNyw2ICsyOCw3IEBACiAjZGVmaW5lIEVGRVJfTE1BCQkoMTw8X0VGRVJfTE1BKQogI2RlZmluZSBFRkVSX05YCQkJKDE8PF9FRkVSX05YKQogI2RlZmluZSBFRkVSX1NWTUUJCSgxPDxfRUZFUl9TVk1FKQorI2RlZmluZSBFRkVSX0xNU0xFCQkoMTw8X0VGRVJfTE1TTEUpCiAjZGVmaW5lIEVGRVJfRkZYU1IJCSgxPDxfRUZFUl9GRlhTUikKIAogLyogSW50ZWwgTVNScy4gU29tZSBhbHNvIGF2YWlsYWJsZSBvbiBvdGhlciBDUFVzICovCkBAIC0xNTksOCArMTYxLDYgQEAKICNkZWZpbmUgTVNSX0s3X0ZJRF9WSURfU1RBVFVTCQkweGMwMDEwMDQyCiAKIC8qIEs2IE1TUnMgKi8KLSNkZWZpbmUgTVNSX0s2X0VGRVIJCQkweGMwMDAwMDgwCi0jZGVmaW5lIE1TUl9LNl9TVEFSCQkJMHhjMDAwMDA4MQogI2RlZmluZSBNU1JfSzZfV0hDUgkJCTB4YzAwMDAwODIKICNkZWZpbmUgTVNSX0s2X1VXQ0NSCQkJMHhjMDAwMDA4NQogI2RlZmluZSBNU1JfSzZfRVBNUgkJCTB4YzAwMDAwODYKQEAgLTIyNCwxMiArMjI0LDE0IEBACiAjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0NPTlRST0wJCTB4MDAwMDAxOWEKICNkZWZpbmUgTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBUCTB4MDAwMDAxOWIKIAotI2RlZmluZSBUSEVSTV9JTlRfTE9XX0VOQUJMRQkJKDEgPDwgMCkKLSNkZWZpbmUgVEhFUk1fSU5UX0hJR0hfRU5BQkxFCQkoMSA8PCAxKQorI2RlZmluZSBUSEVSTV9JTlRfSElHSF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIFRIRVJNX0lOVF9MT1dfRU5BQkxFCQkoMSA8PCAxKQorI2RlZmluZSBUSEVSTV9JTlRfUExOX0VOQUJMRQkJKDEgPDwgMjQpCiAKICNkZWZpbmUgTVNSX0lBMzJfVEhFUk1fU1RBVFVTCQkweDAwMDAwMTljCiAKICNkZWZpbmUgVEhFUk1fU1RBVFVTX1BST0NIT1QJCSgxIDw8IDApCisjZGVmaW5lIFRIRVJNX1NUQVRVU19QT1dFUl9MSU1JVAkoMSA8PCAxMCkKIAogI2RlZmluZSBNU1JfVEhFUk0yX0NUTAkJCTB4MDAwMDAxOWQKIApAQCAtMjM5LDYgKzI0MSwxOSBAQAogCiAjZGVmaW5lIE1TUl9JQTMyX1RFTVBFUkFUVVJFX1RBUkdFVAkweDAwMDAwMWEyCiAKKyNkZWZpbmUgTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUwkweDAwMDAwMWIwCisKKyNkZWZpbmUgTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMJCTB4MDAwMDAxYjEKKworI2RlZmluZSBQQUNLQUdFX1RIRVJNX1NUQVRVU19QUk9DSE9UCQkoMSA8PCAwKQorI2RlZmluZSBQQUNLQUdFX1RIRVJNX1NUQVRVU19QT1dFUl9MSU1JVAkoMSA8PCAxMCkKKworI2RlZmluZSBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVAkweDAwMDAwMWIyCisKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9JTlRfSElHSF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX0xPV19FTkFCTEUJCSgxIDw8IDEpCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX1BMTl9FTkFCTEUJCSgxIDw8IDI0KQorCiAvKiBNSVNDX0VOQUJMRSBiaXRzOiBhcmNoaXRlY3R1cmFsICovCiAjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HCSgxVUxMIDw8IDApCiAjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQwkJKDFVTEwgPDwgMSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmgKaW5kZXggYzViYzRjMi4uMDg0ZWY5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmgKQEAgLTE0OCw4ICsxNDgsOCBAQAogI2RlZmluZSByZG1zcihtc3IsIHZhbDEsIHZhbDIpCQkJCQlcCiBkbyB7CQkJCQkJCQlcCiAJdTY0IF9fdmFsID0gbmF0aXZlX3JlYWRfbXNyKChtc3IpKTsJCQlcCi0JKHZhbDEpID0gKHUzMilfX3ZhbDsJCQkJCVwKLQkodmFsMikgPSAodTMyKShfX3ZhbCA+PiAzMik7CQkJCVwKKwkodm9pZCkoKHZhbDEpID0gKHUzMilfX3ZhbCk7CQkJCVwKKwkodm9pZCkoKHZhbDIpID0gKHUzMikoX192YWwgPj4gMzIpKTsJCQlcCiB9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgd3Jtc3IodW5zaWduZWQgbXNyLCB1bnNpZ25lZCBsb3csIHVuc2lnbmVkIGhpZ2gpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCmluZGV4IDkzZGE5YzMuLjkzMmYwZjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCkBAIC0xNyw3ICsxNyw5IEBACiAKIGV4dGVybiB2b2lkIGRpZV9ubWkoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGRvX3BhbmljKTsKIGV4dGVybiBpbnQgY2hlY2tfbm1pX3dhdGNoZG9nKHZvaWQpOworI2lmICFkZWZpbmVkKENPTkZJR19MT0NLVVBfREVURUNUT1IpCiBleHRlcm4gaW50IG5taV93YXRjaGRvZ19lbmFibGVkOworI2VuZGlmCiBleHRlcm4gaW50IGF2YWlsX3RvX3Jlc3J2X3BlcmZjdHJfbm1pX2JpdCh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCByZXNlcnZlX3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCByZWxlYXNlX3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmgKaW5kZXggY2QyYTMxZC4uNDljNzIxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaApAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBQQ0lfSEFTX0lPX0VDUwkJMHg0MDAwMAogI2RlZmluZSBQQ0lfTk9BU1NJR05fUk9NUwkweDgwMDAwCiAjZGVmaW5lIFBDSV9ST09UX05PX0NSUwkJMHgxMDAwMDAKKyNkZWZpbmUgUENJX05PQVNTSUdOX0JBUlMJMHgyMDAwMDAKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBwY2lfcHJvYmU7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBwaXJxX3RhYmxlX2FkZHI7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKaW5kZXggMjU0ODgzZC4uNmU3NDJjYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtNjgsOCArNjgsOSBAQAogCiB1bmlvbiBjcHVpZDEwX2VkeCB7CiAJc3RydWN0IHsKLQkJdW5zaWduZWQgaW50IG51bV9jb3VudGVyc19maXhlZDo0OwotCQl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6Mjg7CisJCXVuc2lnbmVkIGludCBudW1fY291bnRlcnNfZml4ZWQ6NTsKKwkJdW5zaWduZWQgaW50IGJpdF93aWR0aF9maXhlZDo4OworCQl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MTk7CiAJfSBzcGxpdDsKIAl1bnNpZ25lZCBpbnQgZnVsbDsKIH07CkBAIC0xNDAsNiArMTQxLDE5IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBwZXJmX21pc2NfZmxhZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogI2RlZmluZSBwZXJmX21pc2NfZmxhZ3MocmVncykJcGVyZl9taXNjX2ZsYWdzKHJlZ3MpCiAKKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorCisvKgorICogV2UgYWJ1c2UgYml0IDMgZnJvbSBmbGFncyB0byBwYXNzIGV4YWN0IGluZm9ybWF0aW9uLCBzZWUgcGVyZl9taXNjX2ZsYWdzCisgKiBhbmQgdGhlIGNvbW1lbnQgd2l0aCBQRVJGX0VGTEFHU19FWEFDVC4KKyAqLworI2RlZmluZSBwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3MocmVncywgX19pcCkJCXsJXAorCShyZWdzKS0+aXAgPSAoX19pcCk7CQkJCQlcCisJKHJlZ3MpLT5icCA9IGNhbGxlcl9mcmFtZV9wb2ludGVyKCk7CQkJXAorCShyZWdzKS0+Y3MgPSBfX0tFUk5FTF9DUzsJCQkJXAorCXJlZ3MtPmZsYWdzID0gMDsJCQkJCVwKK30KKwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2h3X3BlcmZfZXZlbnRzKHZvaWQpCQl7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2V2ZW50c19sYXBpY19pbml0KHZvaWQpCXsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9wNC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9wNC5oCmluZGV4IDY0YThlYmYuLmRlZjUwMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfcDQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3A0LmgKQEAgLTE5LDcgKzE5LDYgQEAKICNkZWZpbmUgQVJDSF9QNF9SRVNFUlZFRF9FU0NSCSgyKSAvKiBJUV9FU0NSKDAsMSkgbm90IGFsd2F5cyBwcmVzZW50ICovCiAjZGVmaW5lIEFSQ0hfUDRfTUFYX0VTQ1IJKEFSQ0hfUDRfVE9UQUxfRVNDUiAtIEFSQ0hfUDRfUkVTRVJWRURfRVNDUikKICNkZWZpbmUgQVJDSF9QNF9NQVhfQ0NDUgkoMTgpCi0jZGVmaW5lIEFSQ0hfUDRfTUFYX0NPVU5URVIJKEFSQ0hfUDRfTUFYX0NDQ1IgLyAyKQogCiAjZGVmaW5lIFA0X0VTQ1JfRVZFTlRfTUFTSwkweDdlMDAwMDAwVQogI2RlZmluZSBQNF9FU0NSX0VWRU5UX1NISUZUCTI1CkBAIC03MSwxMCArNzAsNiBAQAogI2RlZmluZSBQNF9DQ0NSX1RIUkVTSE9MRCh2KQkJKCh2KSA8PCBQNF9DQ0NSX1RIUkVTSE9MRF9TSElGVCkKICNkZWZpbmUgUDRfQ0NDUl9FU0VMKHYpCQkJKCh2KSA8PCBQNF9DQ0NSX0VTQ1JfU0VMRUNUX1NISUZUKQogCi0vKiBDdXN0b20gYml0cyBpbiByZWVydmVkIENDQ1IgYXJlYSAqLwotI2RlZmluZSBQNF9DQ0NSX0NBQ0hFX09QU19NQVNLCQkweDAwMDAwMDNmVQotCi0KIC8qIE5vbiBIVCBtYXNrICovCiAjZGVmaW5lIFA0X0NDQ1JfTUFTSwkJCQlcCiAJKFA0X0NDQ1JfT1ZGCQkJfAlcCkBAIC0xMDYsOCArMTAxLDcgQEAKICAqIEVTQ1IgYW5kIENDQ1IgYnV0IHJhdGhlciBhbiBvbmx5IHBhY2tlZCB2YWx1ZSBzaG91bGQKICAqIGJlIHVucGFja2VkIGFuZCB3cml0dGVuIHRvIGEgcHJvcGVyIGFkZHJlc3NlcwogICoKLSAqIHRoZSBiYXNlIGlkZWEgaXMgdG8gcGFjayBhcyBtdWNoIGluZm8gYXMKLSAqIHBvc3NpYmxlCisgKiB0aGUgYmFzZSBpZGVhIGlzIHRvIHBhY2sgYXMgbXVjaCBpbmZvIGFzIHBvc3NpYmxlCiAgKi8KICNkZWZpbmUgcDRfY29uZmlnX3BhY2tfZXNjcih2KQkJKCgodTY0KSh2KSkgPDwgMzIpCiAjZGVmaW5lIHA0X2NvbmZpZ19wYWNrX2NjY3IodikJCSgoKHU2NCkodikpICYgMHhmZmZmZmZmZlVMTCkKQEAgLTEzMCw4ICsxMjQsNiBAQAogCQl0OwkJCQkJXAogCX0pCiAKLSNkZWZpbmUgcDRfY29uZmlnX3VucGFja19jYWNoZV9ldmVudCh2KQkoKCh1NjQpKHYpKSAmIFA0X0NDQ1JfQ0FDSEVfT1BTX01BU0spCi0KICNkZWZpbmUgUDRfQ09ORklHX0hUX1NISUZUCQk2MwogI2RlZmluZSBQNF9DT05GSUdfSFQJCQkoMVVMTCA8PCBQNF9DT05GSUdfSFRfU0hJRlQpCiAKQEAgLTIxNCw2ICsyMDYsMTIgQEAKIAlyZXR1cm4gZXNjcjsKIH0KIAorLyoKKyAqIFRoaXMgYXJlIHRoZSBldmVudHMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gIkV2ZW50IFNlbGVjdCIKKyAqIGZpZWxkIG9mIEVTQ1IgcmVnaXN0ZXIsIHRoZXkgYXJlIGxpa2UgdW5pcXVlIGtleXMgd2hpY2ggYWxsb3cKKyAqIHRoZSBrZXJuZWwgdG8gZGV0ZXJtaW5hdGUgd2hpY2ggQ0NDUiBhbmQgQ09VTlRFUiBzaG91bGQgYmUKKyAqIHVzZWQgdG8gdHJhY2sgYW4gZXZlbnQKKyAqLwogZW51bSBQNF9FVkVOVFMgewogCVA0X0VWRU5UX1RDX0RFTElWRVJfTU9ERSwKIAlQNF9FVkVOVF9CUFVfRkVUQ0hfUkVRVUVTVCwKQEAgLTU2MSw3ICs1NTksNyBAQAogICogYSBjYWxsZXIgc2hvdWxkIHVzZSBQNF9FU0NSX0VNQVNLX05BTUUgaGVscGVyIHRvCiAgKiBwaWNrIHRoZSBFdmVudE1hc2sgbmVlZGVkLCBmb3IgZXhhbXBsZQogICoKLSAqCVA0X0VTQ1JfRU1BU0tfTkFNRShQNF9FVkVOVF9UQ19ERUxJVkVSX01PREUsIEREKQorICoJUDRfRVNDUl9FTUFTS19CSVQoUDRfRVZFTlRfVENfREVMSVZFUl9NT0RFLCBERCkKICAqLwogZW51bSBQNF9FU0NSX0VNQVNLUyB7CiAJUDRfR0VOX0VTQ1JfRU1BU0soUDRfRVZFTlRfVENfREVMSVZFUl9NT0RFLCBERCwgMCksCkBAIC03NTMsNDMgKzc1MSw1MCBAQAogCVA0X0dFTl9FU0NSX0VNQVNLKFA0X0VWRU5UX0lOU1RSX0NPTVBMRVRFRCwgQk9HVVMsIDEpLAogfTsKIAotLyogUDQgUEVCUzogc3RhbGUgZm9yIGEgd2hpbGUgKi8KLSNkZWZpbmUgUDRfUEVCU19NRVRSSUNfTUFTSwkweDAwMDAxZmZmVQotI2RlZmluZSBQNF9QRUJTX1VPQl9UQUcJCTB4MDEwMDAwMDBVCi0jZGVmaW5lIFA0X1BFQlNfRU5BQkxFCQkweDAyMDAwMDAwVQorLyoKKyAqIFA0IFBFQlMgc3BlY2lmaWNzIChSZXBsYXkgRXZlbnQgb25seSkKKyAqCisgKiBGb3JtYXQgKGJpdHMpOgorICogICAwLTY6IG1ldHJpYyBmcm9tIFA0X1BFQlNfTUVUUklDIGVudW0KKyAqICAgIDcgOiByZXNlcnZlZAorICogICAgOCA6IHJlc2VydmVkCisgKiA5LTExIDogcmVzZXJ2ZWQKKyAqCisgKiBOb3RlIHdlIGhhdmUgVU9QIGFuZCBQRUJTIGJpdHMgcmVzZXJ2ZWQgZm9yIG5vdworICoganVzdCBpbiBjYXNlIGlmIHdlIHdpbGwgbmVlZCB0aGVtIG9uY2UKKyAqLworI2RlZmluZSBQNF9QRUJTX0NPTkZJR19FTkFCTEUJCSgxIDw8IDcpCisjZGVmaW5lIFA0X1BFQlNfQ09ORklHX1VPUF9UQUcJCSgxIDw8IDgpCisjZGVmaW5lIFA0X1BFQlNfQ09ORklHX01FVFJJQ19NQVNLCTB4M2YKKyNkZWZpbmUgUDRfUEVCU19DT05GSUdfTUFTSwkJMHhmZgogCi0vKiBSZXBsYXkgbWV0cmljcyBmb3IgTVNSX0lBMzJfUEVCU19FTkFCTEUgYW5kIE1TUl9QNF9QRUJTX01BVFJJWF9WRVJUICovCi0jZGVmaW5lIFA0X1BFQlNfXzFzdGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQJMHgzMDAwMDAxCi0jZGVmaW5lIFA0X1BFQlNfXzJuZGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQJMHgzMDAwMDAyCi0jZGVmaW5lIFA0X1BFQlNfX2R0bGJfbG9hZF9taXNzX3JldGlyZWQJCTB4MzAwMDAwNAotI2RlZmluZSBQNF9QRUJTX19kdGxiX3N0b3JlX21pc3NfcmV0aXJlZAkweDMwMDAwMDQKLSNkZWZpbmUgUDRfUEVCU19fZHRsYl9hbGxfbWlzc19yZXRpcmVkCQkweDMwMDAwMDQKLSNkZWZpbmUgUDRfUEVCU19fdGFnZ2VkX21pc3ByZWRfYnJhbmNoCQkweDMwMTgwMDAKLSNkZWZpbmUgUDRfUEVCU19fbW9iX2xvYWRfcmVwbGF5X3JldGlyZWQJMHgzMDAwMjAwCi0jZGVmaW5lIFA0X1BFQlNfX3NwbGl0X2xvYWRfcmV0aXJlZAkJMHgzMDAwNDAwCi0jZGVmaW5lIFA0X1BFQlNfX3NwbGl0X3N0b3JlX3JldGlyZWQJCTB4MzAwMDQwMAorLyoKKyAqIG1lbTogT25seSBjb3VudGVycyBNU1JfSVFfQ09VTlRFUjQgKDE2KSBhbmQKKyAqIE1TUl9JUV9DT1VOVEVSNSAoMTcpIGFyZSBhbGxvd2VkIGZvciBQRUJTIHNhbXBsaW5nCisgKi8KKyNkZWZpbmUgUDRfUEVCU19FTkFCTEUJCQkweDAyMDAwMDAwVQorI2RlZmluZSBQNF9QRUJTX0VOQUJMRV9VT1BfVEFHCQkweDAxMDAwMDAwVQogCi0jZGVmaW5lIFA0X1ZFUlRfXzFzdGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQJMHgwMDAwMDAxCi0jZGVmaW5lIFA0X1ZFUlRfXzJuZGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQJMHgwMDAwMDAxCi0jZGVmaW5lIFA0X1ZFUlRfX2R0bGJfbG9hZF9taXNzX3JldGlyZWQJCTB4MDAwMDAwMQotI2RlZmluZSBQNF9WRVJUX19kdGxiX3N0b3JlX21pc3NfcmV0aXJlZAkweDAwMDAwMDIKLSNkZWZpbmUgUDRfVkVSVF9fZHRsYl9hbGxfbWlzc19yZXRpcmVkCQkweDAwMDAwMDMKLSNkZWZpbmUgUDRfVkVSVF9fdGFnZ2VkX21pc3ByZWRfYnJhbmNoCQkweDAwMDAwMTAKLSNkZWZpbmUgUDRfVkVSVF9fbW9iX2xvYWRfcmVwbGF5X3JldGlyZWQJMHgwMDAwMDAxCi0jZGVmaW5lIFA0X1ZFUlRfX3NwbGl0X2xvYWRfcmV0aXJlZAkJMHgwMDAwMDAxCi0jZGVmaW5lIFA0X1ZFUlRfX3NwbGl0X3N0b3JlX3JldGlyZWQJCTB4MDAwMDAwMgorI2RlZmluZSBwNF9jb25maWdfdW5wYWNrX21ldHJpYyh2KQkoKCh1NjQpKHYpKSAmIFA0X1BFQlNfQ09ORklHX01FVFJJQ19NQVNLKQorI2RlZmluZSBwNF9jb25maWdfdW5wYWNrX3BlYnModikJKCgodTY0KSh2KSkgJiBQNF9QRUJTX0NPTkZJR19NQVNLKQogCi1lbnVtIFA0X0NBQ0hFX0VWRU5UUyB7Ci0JUDRfQ0FDSEVfX05PTkUsCisjZGVmaW5lIHA0X2NvbmZpZ19wZWJzX2hhcyh2LCBtYXNrKQkocDRfY29uZmlnX3VucGFja19wZWJzKHYpICYgKG1hc2spKQogCi0JUDRfQ0FDSEVfXzFzdGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQsCi0JUDRfQ0FDSEVfXzJuZGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQsCi0JUDRfQ0FDSEVfX2R0bGJfbG9hZF9taXNzX3JldGlyZWQsCi0JUDRfQ0FDSEVfX2R0bGJfc3RvcmVfbWlzc19yZXRpcmVkLAotCVA0X0NBQ0hFX19pdGxiX3JlZmVyZW5jZV9oaXQsCi0JUDRfQ0FDSEVfX2l0bGJfcmVmZXJlbmNlX21pc3MsCitlbnVtIFA0X1BFQlNfTUVUUklDIHsKKwlQNF9QRUJTX01FVFJJQ19fbm9uZSwKIAotCVA0X0NBQ0hFX19NQVgKKwlQNF9QRUJTX01FVFJJQ19fMXN0bF9jYWNoZV9sb2FkX21pc3NfcmV0aXJlZCwKKwlQNF9QRUJTX01FVFJJQ19fMm5kbF9jYWNoZV9sb2FkX21pc3NfcmV0aXJlZCwKKwlQNF9QRUJTX01FVFJJQ19fZHRsYl9sb2FkX21pc3NfcmV0aXJlZCwKKwlQNF9QRUJTX01FVFJJQ19fZHRsYl9zdG9yZV9taXNzX3JldGlyZWQsCisJUDRfUEVCU19NRVRSSUNfX2R0bGJfYWxsX21pc3NfcmV0aXJlZCwKKwlQNF9QRUJTX01FVFJJQ19fdGFnZ2VkX21pc3ByZWRfYnJhbmNoLAorCVA0X1BFQlNfTUVUUklDX19tb2JfbG9hZF9yZXBsYXlfcmV0aXJlZCwKKwlQNF9QRUJTX01FVFJJQ19fc3BsaXRfbG9hZF9yZXRpcmVkLAorCVA0X1BFQlNfTUVUUklDX19zcGxpdF9zdG9yZV9yZXRpcmVkLAorCisJUDRfUEVCU19NRVRSSUNfX21heAogfTsKIAogI2VuZGlmIC8qIFBFUkZfRVZFTlRfUDRfSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDdlNWM2YTYuLjMyNWI3YmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC03NjIsNiArNzYyLDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nCQlib290X29wdGlvbl9pZGxlX292ZXJyaWRlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcJCWlkbGVfaGFsdDsKIGV4dGVybiB1bnNpZ25lZCBsb25nCQlpZGxlX25vbXdhaXQ7CitleHRlcm4gYm9vbAkJCWMxZV9kZXRlY3RlZDsKIAogLyoKICAqIG9uIHN5c3RlbXMgd2l0aCBjYWNoZXMsIGNhY2hlcyBtdXN0IGJlIGZsYXNoZWQgYXMgdGhlIGFic29sdXRlCkBAIC0xMDI1LDQgKzEwMjYsMjQgQEAKIAlyZXR1cm4gcmF0aW87CiB9CiAKKy8qCisgKiBBTUQgZXJyYXRhIGNoZWNraW5nCisgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX1NVUF9BTUQKK2V4dGVybiBjb25zdCBpbnQgYW1kX2VycmF0dW1fMzgzW107CitleHRlcm4gY29uc3QgaW50IGFtZF9lcnJhdHVtXzQwMFtdOworZXh0ZXJuIGJvb2wgY3B1X2hhc19hbWRfZXJyYXR1bShjb25zdCBpbnQgKik7CisKKyNkZWZpbmUgQU1EX0xFR0FDWV9FUlJBVFVNKC4uLikJCXsgLTEsIF9fVkFfQVJHU19fLCAwIH0KKyNkZWZpbmUgQU1EX09TVldfRVJSQVRVTShvc3Z3X2lkLCAuLi4pCXsgb3N2d19pZCwgX19WQV9BUkdTX18sIDAgfQorI2RlZmluZSBBTURfTU9ERUxfUkFOR0UoZiwgbV9zdGFydCwgc19zdGFydCwgbV9lbmQsIHNfZW5kKSBcCisJKChmIDw8IDI0KSB8IChtX3N0YXJ0IDw8IDE2KSB8IChzX3N0YXJ0IDw8IDEyKSB8IChtX2VuZCA8PCA0KSB8IChzX2VuZCkpCisjZGVmaW5lIEFNRF9NT0RFTF9SQU5HRV9GQU1JTFkocmFuZ2UpCSgoKHJhbmdlKSA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBBTURfTU9ERUxfUkFOR0VfU1RBUlQocmFuZ2UpCSgoKHJhbmdlKSA+PiAxMikgJiAweGZmZikKKyNkZWZpbmUgQU1EX01PREVMX1JBTkdFX0VORChyYW5nZSkJKChyYW5nZSkgJiAweGZmZikKKworI2Vsc2UKKyNkZWZpbmUgY3B1X2hhc19hbWRfZXJyYXR1bSh4KQkoZmFsc2UpCisjZW5kaWYgLyogQ09ORklHX0NQVV9TVVBfQU1EICovCisKICNlbmRpZiAvKiBfQVNNX1g4Nl9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKaW5kZXggNjRjZjJkMi4uNmM3ZmMyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZXF1aXJlZC1mZWF0dXJlcy5oCkBAIC04NCw1ICs4NCw3IEBACiAjZGVmaW5lIFJFUVVJUkVEX01BU0s1CTAKICNkZWZpbmUgUkVRVUlSRURfTUFTSzYJMAogI2RlZmluZSBSRVFVSVJFRF9NQVNLNwkwCisjZGVmaW5lIFJFUVVJUkVEX01BU0s4CTAKKyNkZWZpbmUgUkVRVUlSRURfTUFTSzkJMAogCiAjZW5kaWYgLyogX0FTTV9YODZfUkVRVUlSRURfRkVBVFVSRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmgKaW5kZXggNjA2ZWRlMS4uZDFlNDFiMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oCkBAIC0xMTgsNyArMTE4LDcgQEAKIHsKIAlhc20gdm9sYXRpbGUoIiMgYmVnaW5uaW5nIGRvd25fcmVhZFxuXHQiCiAJCSAgICAgTE9DS19QUkVGSVggX0FTTV9JTkMgIiglMSlcblx0IgotCQkgICAgIC8qIGFkZHMgMHgwMDAwMDAwMSwgcmV0dXJucyB0aGUgb2xkIHZhbHVlICovCisJCSAgICAgLyogYWRkcyAweDAwMDAwMDAxICovCiAJCSAgICAgIiAgam5zICAgICAgICAxZlxuIgogCQkgICAgICIgIGNhbGwgY2FsbF9yd3NlbV9kb3duX3JlYWRfZmFpbGVkXG4iCiAJCSAgICAgIjE6XG5cdCIKQEAgLTE1NiwxMSArMTU2LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2Rvd25fd3JpdGVfbmVzdGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgaW50IHN1YmNsYXNzKQogewogCXJ3c2VtX2NvdW50X3QgdG1wOwotCi0JdG1wID0gUldTRU1fQUNUSVZFX1dSSVRFX0JJQVM7CiAJYXNtIHZvbGF0aWxlKCIjIGJlZ2lubmluZyBkb3duX3dyaXRlXG5cdCIKIAkJICAgICBMT0NLX1BSRUZJWCAiICB4YWRkICAgICAgJTEsKCUyKVxuXHQiCi0JCSAgICAgLyogc3VidHJhY3QgMHgwMDAwZmZmZiwgcmV0dXJucyB0aGUgb2xkIHZhbHVlICovCisJCSAgICAgLyogYWRkcyAweGZmZmYwMDAxLCByZXR1cm5zIHRoZSBvbGQgdmFsdWUgKi8KIAkJICAgICAiICB0ZXN0ICAgICAgJTEsJTFcblx0IgogCQkgICAgIC8qIHdhcyB0aGUgY291bnQgMCBiZWZvcmU/ICovCiAJCSAgICAgIiAganogICAgICAgIDFmXG4iCkBAIC0xNjgsNyArMTY2LDcgQEAKIAkJICAgICAiMTpcbiIKIAkJICAgICAiIyBlbmRpbmcgZG93bl93cml0ZSIKIAkJICAgICA6ICIrbSIgKHNlbS0+Y291bnQpLCAiPWQiICh0bXApCi0JCSAgICAgOiAiYSIgKHNlbSksICIxIiAodG1wKQorCQkgICAgIDogImEiIChzZW0pLCAiMSIgKFJXU0VNX0FDVElWRV9XUklURV9CSUFTKQogCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwogfQogCkBAIC0xOTUsMTYgKzE5MywxNiBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX191cF9yZWFkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKLQlyd3NlbV9jb3VudF90IHRtcCA9IC1SV1NFTV9BQ1RJVkVfUkVBRF9CSUFTOworCXJ3c2VtX2NvdW50X3QgdG1wOwogCWFzbSB2b2xhdGlsZSgiIyBiZWdpbm5pbmcgX191cF9yZWFkXG5cdCIKIAkJICAgICBMT0NLX1BSRUZJWCAiICB4YWRkICAgICAgJTEsKCUyKVxuXHQiCiAJCSAgICAgLyogc3VidHJhY3RzIDEsIHJldHVybnMgdGhlIG9sZCB2YWx1ZSAqLwogCQkgICAgICIgIGpucyAgICAgICAgMWZcblx0IgotCQkgICAgICIgIGNhbGwgY2FsbF9yd3NlbV93YWtlXG4iCisJCSAgICAgIiAgY2FsbCBjYWxsX3J3c2VtX3dha2VcbiIgLyogZXhwZWN0cyBvbGQgdmFsdWUgaW4gJWVkeCAqLwogCQkgICAgICIxOlxuIgogCQkgICAgICIjIGVuZGluZyBfX3VwX3JlYWRcbiIKIAkJICAgICA6ICIrbSIgKHNlbS0+Y291bnQpLCAiPWQiICh0bXApCi0JCSAgICAgOiAiYSIgKHNlbSksICIxIiAodG1wKQorCQkgICAgIDogImEiIChzZW0pLCAiMSIgKC1SV1NFTV9BQ1RJVkVfUkVBRF9CSUFTKQogCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwogfQogCkBAIC0yMTYsMTAgKzIxNCw5IEBACiAJcndzZW1fY291bnRfdCB0bXA7CiAJYXNtIHZvbGF0aWxlKCIjIGJlZ2lubmluZyBfX3VwX3dyaXRlXG5cdCIKIAkJICAgICBMT0NLX1BSRUZJWCAiICB4YWRkICAgICAgJTEsKCUyKVxuXHQiCi0JCSAgICAgLyogdHJpZXMgdG8gdHJhbnNpdGlvbgotCQkJMHhmZmZmMDAwMSAtPiAweDAwMDAwMDAwICovCi0JCSAgICAgIiAganogICAgICAgMWZcbiIKLQkJICAgICAiICBjYWxsIGNhbGxfcndzZW1fd2FrZVxuIgorCQkgICAgIC8qIHN1YnRyYWN0cyAweGZmZmYwMDAxLCByZXR1cm5zIHRoZSBvbGQgdmFsdWUgKi8KKwkJICAgICAiICBqbnMgICAgICAgIDFmXG5cdCIKKwkJICAgICAiICBjYWxsIGNhbGxfcndzZW1fd2FrZVxuIiAvKiBleHBlY3RzIG9sZCB2YWx1ZSBpbiAlZWR4ICovCiAJCSAgICAgIjE6XG5cdCIKIAkJICAgICAiIyBlbmRpbmcgX191cF93cml0ZVxuIgogCQkgICAgIDogIittIiAoc2VtLT5jb3VudCksICI9ZCIgKHRtcCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IDg2YjE1MDYuLmVmMjkyYzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtODIsNyArODIsNyBAQAogICogZXhlY3V0YWJsZS4pCiAgKi8KICNkZWZpbmUgUkVTRVJWRV9CUksobmFtZSxzeikJCQkJCQlcCi0Jc3RhdGljIHZvaWQgX19zZWN0aW9uKC5kaXNjYXJkKSBfX3VzZWQJCQkJXAorCXN0YXRpYyB2b2lkIF9fc2VjdGlvbiguZGlzY2FyZC50ZXh0KSBfX3VzZWQJCQlcCiAJX19icmtfcmVzZXJ2YXRpb25fZm5fIyNuYW1lIyNfXyh2b2lkKSB7CQkJCVwKIAkJYXNtIHZvbGF0aWxlICgJCQkJCQlcCiAJCQkiLnB1c2hzZWN0aW9uIC5icmtfcmVzZXJ2YXRpb24sXCJhd1wiLEBub2JpdHM7IiBcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKaW5kZXggNGRhYjc4ZS4uMmIxNmEyYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaApAQCAtMSw2ICsxLDEzIEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgQW5kaSBLbGVlbiwgU3VTRSBMYWJzCisgKi8KKwogI2lmbmRlZiBfQVNNX1g4Nl9TVEFDS1RSQUNFX0gKICNkZWZpbmUgX0FTTV9YODZfU1RBQ0tUUkFDRV9ICiAKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKIGV4dGVybiBpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50OwogCiBzdHJ1Y3QgdGhyZWFkX2luZm87CkBAIC00Miw0ICs0OSw0NiBAQAogCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKIAkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpOwogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorI2RlZmluZSBTVEFDS1NMT1RTX1BFUl9MSU5FIDgKKyNkZWZpbmUgZ2V0X2JwKGJwKSBhc20oIm1vdmwgJSVlYnAsICUwIiA6ICI9ciIgKGJwKSA6KQorI2Vsc2UKKyNkZWZpbmUgU1RBQ0tTTE9UU19QRVJfTElORSA0CisjZGVmaW5lIGdldF9icChicCkgYXNtKCJtb3ZxICUlcmJwLCAlMCIgOiAiPXIiIChicCkgOikKKyNlbmRpZgorCitleHRlcm4gdm9pZAorc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKTsKKworZXh0ZXJuIHZvaWQKK3Nob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQl1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgY29kZV9ieXRlczsKKworLyogVGhlIGZvcm0gb2YgdGhlIHRvcCBvZiB0aGUgZnJhbWUgb24gdGhlIHN0YWNrICovCitzdHJ1Y3Qgc3RhY2tfZnJhbWUgeworCXN0cnVjdCBzdGFja19mcmFtZSAqbmV4dF9mcmFtZTsKKwl1bnNpZ25lZCBsb25nIHJldHVybl9hZGRyZXNzOworfTsKKworc3RydWN0IHN0YWNrX2ZyYW1lX2lhMzIgeworICAgIHUzMiBuZXh0X2ZyYW1lOworICAgIHUzMiByZXR1cm5fYWRkcmVzczsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjYWxsZXJfZnJhbWVfcG9pbnRlcih2b2lkKQoreworCXN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWU7CisKKwlnZXRfYnAoZnJhbWUpOworCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwlmcmFtZSA9IGZyYW1lLT5uZXh0X2ZyYW1lOworI2VuZGlmCisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnJhbWU7Cit9CisKICNlbmRpZiAvKiBfQVNNX1g4Nl9TVEFDS1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggZTdmNGQzMy4uMzNlY2MzZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTQ1Nyw0ICs0NTcsMTEgQEAKIAlhbHRlcm5hdGl2ZShBU01fTk9QMywgImxmZW5jZSIsIFg4Nl9GRUFUVVJFX0xGRU5DRV9SRFRTQyk7CiB9CiAKKy8qCisgKiBXZSBoYW5kbGUgbW9zdCB1bmFsaWduZWQgYWNjZXNzZXMgaW4gaGFyZHdhcmUuICBPbiB0aGUgb3RoZXIgaGFuZAorICogdW5hbGlnbmVkIERNQSBjYW4gYmUgcXVpdGUgZXhwZW5zaXZlIG9uIHNvbWUgTmVoYWxlbSBwcm9jZXNzb3JzLgorICoKKyAqIEJhc2VkIG9uIHRoaXMgd2UgZGlzYWJsZSB0aGUgSVAgaGVhZGVyIGFsaWdubWVudCBpbiBuZXR3b3JrIGRyaXZlcnMuCisgKi8KKyNkZWZpbmUgTkVUX0lQX0FMSUdOCTAKICNlbmRpZiAvKiBfQVNNX1g4Nl9TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdm14LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaAppbmRleCA5ZTY3NzlmLi45ZjBjYmQ5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaApAQCAtMjU3LDYgKzI1Nyw3IEBACiAjZGVmaW5lIEVYSVRfUkVBU09OX0lPX0lOU1RSVUNUSU9OICAgICAgMzAKICNkZWZpbmUgRVhJVF9SRUFTT05fTVNSX1JFQUQgICAgICAgICAgICAzMQogI2RlZmluZSBFWElUX1JFQVNPTl9NU1JfV1JJVEUgICAgICAgICAgIDMyCisjZGVmaW5lIEVYSVRfUkVBU09OX0lOVkFMSURfU1RBVEUJMzMKICNkZWZpbmUgRVhJVF9SRUFTT05fTVdBSVRfSU5TVFJVQ1RJT04gICAzNgogI2RlZmluZSBFWElUX1JFQVNPTl9NT05JVE9SX0lOU1RSVUNUSU9OIDM5CiAjZGVmaW5lIEVYSVRfUkVBU09OX1BBVVNFX0lOU1RSVUNUSU9OICAgNDAKQEAgLTI2Niw2ICsyNjcsNyBAQAogI2RlZmluZSBFWElUX1JFQVNPTl9FUFRfVklPTEFUSU9OICAgICAgIDQ4CiAjZGVmaW5lIEVYSVRfUkVBU09OX0VQVF9NSVNDT05GSUcgICAgICAgNDkKICNkZWZpbmUgRVhJVF9SRUFTT05fV0JJTlZECQk1NAorI2RlZmluZSBFWElUX1JFQVNPTl9YU0VUQlYJCTU1CiAKIC8qCiAgKiBJbnRlcnJ1cHRpb24taW5mb3JtYXRpb24gZm9ybWF0CkBAIC0zNzUsNiArMzc3LDkgQEAKICNkZWZpbmUgVk1YX0VQVF9FWFRFTlRfQ09OVEVYVF9CSVQJCSgxdWxsIDw8IDI1KQogI2RlZmluZSBWTVhfRVBUX0VYVEVOVF9HTE9CQUxfQklUCQkoMXVsbCA8PCAyNikKIAorI2RlZmluZSBWTVhfVlBJRF9FWFRFTlRfU0lOR0xFX0NPTlRFWFRfQklUICAgICAgKDF1bGwgPDwgOSkgLyogKDQxIC0gMzIpICovCisjZGVmaW5lIFZNWF9WUElEX0VYVEVOVF9HTE9CQUxfQ09OVEVYVF9CSVQgICAgICAoMXVsbCA8PCAxMCkgLyogKDQyIC0gMzIpICovCisKICNkZWZpbmUgVk1YX0VQVF9ERUZBVUxUX0dBVwkJCTMKICNkZWZpbmUgVk1YX0VQVF9NQVhfR0FXCQkJCTB4NAogI2RlZmluZSBWTVhfRVBUX01UX0VQVEVfU0hJRlQJCQkzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJjYWxsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJjYWxsLmgKaW5kZXggOWMzNzFlNC4uN2ZkYTA0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVyY2FsbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcmNhbGwuaApAQCAtNDE3LDYgKzQxNywxMiBAQAogCXJldHVybiBfaHlwZXJjYWxsMihpbnQsIG5taV9vcCwgb3AsIGFyZyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK0hZUEVSVklTT1JfaHZtX29wKGludCBvcCwgdm9pZCAqYXJnKQoreworICAgICAgIHJldHVybiBfaHlwZXJjYWxsMih1bnNpZ25lZCBsb25nLCBodm1fb3AsIG9wLCBhcmcpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQKIE1VTFRJX2ZwdV90YXNrc3dpdGNoKHN0cnVjdCBtdWx0aWNhbGxfZW50cnkgKm1jbCwgaW50IHNldCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hzYXZlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94c2F2ZS5oCmluZGV4IDJjNDM5MGMuLjMyYzM2NjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hzYXZlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veHNhdmUuaApAQCAtMTMsNiArMTMsMTIgQEAKIAogI2RlZmluZSBGWFNBVkVfU0laRQk1MTIKIAorI2RlZmluZSBYU0FWRV9IRFJfU0laRQkgICAgNjQKKyNkZWZpbmUgWFNBVkVfSERSX09GRlNFVCAgICBGWFNBVkVfU0laRQorCisjZGVmaW5lIFhTQVZFX1lNTV9TSVpFCSAgICAyNTYKKyNkZWZpbmUgWFNBVkVfWU1NX09GRlNFVCAgICAoWFNBVkVfSERSX1NJWkUgKyBYU0FWRV9IRFJfT0ZGU0VUKQorCiAvKgogICogVGhlc2UgYXJlIHRoZSBmZWF0dXJlcyB0aGF0IHRoZSBPUyBjYW4gaGFuZGxlIGN1cnJlbnRseS4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLlMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUwppbmRleCA1ODBiNGUyLi4yODU5NWQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJbW92bAklZWF4LCAlZWN4CiAJb3JsCSVlZHgsICVlY3gKIAlqegkxZgotCW1vdmwJJDB4YzAwMDAwODAsICVlY3gKKwltb3ZsCSRNU1JfRUZFUiwgJWVjeAogCXdybXNyCiAxOgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCBmY2MzYzYxZi4uMzNjZWMxNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC0yLDcgKzIsNyBAQAogICogc2xlZXAuYyAtIHg4Ni1zcGVjaWZpYyBBQ1BJIHNsZWVwIHN1cHBvcnQuCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFBhdHJpY2sgTW9jaGVsCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgogICovCiAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKaW5kZXggMGQyMDI4Ni4uZmEwNDRlMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwpAQCAtMjU3Miw2ICsyNTcyLDExIEBACiBzdGF0aWMgaW50IGFtZF9pb21tdV9kb21haW5faGFzX2NhcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgY2FwKQogeworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZOgorCQlyZXR1cm4gMTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYwOSw4ICsyNjE0LDcgQEAKIAogCXB0X2RvbWFpbi0+bW9kZSB8PSBQQUdFX01PREVfTk9ORTsKIAotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewotCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJaWYgKCFjaGVja19kZXZpY2UoJmRldi0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBiX3RpbWVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBiX3RpbWVyLmMKaW5kZXggYTM1MzQ3NS4uOGRkNzc4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwYl90aW1lci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGJfdGltZXIuYwpAQCAtNDMsMTAgKzQzLDExIEBACiAKICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL2FwYl90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CiAKICNkZWZpbmUgQVBCVF9NQVNLCQkJQ0xPQ0tTT1VSQ0VfTUFTSygzMikKICNkZWZpbmUgQVBCVF9TSElGVAkJCTIyCi0jZGVmaW5lIEFQQlRfQ0xPQ0tFVkVOVF9SQVRJTkcJCTE1MAorI2RlZmluZSBBUEJUX0NMT0NLRVZFTlRfUkFUSU5HCQkxMTAKICNkZWZpbmUgQVBCVF9DTE9DS1NPVVJDRV9SQVRJTkcJCTI1MAogI2RlZmluZSBBUEJUX01JTl9ERUxUQV9VU0VDCQkyMDAKIApAQCAtODMsOCArODQsNiBAQAogCWNoYXIgbmFtZVsxMF07CiB9OwogCi1pbnQgZGlzYWJsZV9hcGJ0X3BlcmNwdSBfX2NwdWluaXRkYXRhOwotCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGFwYnRfZGV2LCBjcHVfYXBidF9kZXYpOwogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMTk1LDI5ICsxOTQsNiBAQAogfTsKIAogLyoKLSAqIGlmIHVzZXIgZG9lcyBub3Qgd2FudCB0byB1c2UgcGVyIENQVSBhcGIgdGltZXIsIGp1c3QgZ2l2ZSBpdCBhIGxvd2VyIHJhdGluZwotICogdGhhbiBsb2NhbCBhcGljIHRpbWVyIGFuZCBza2lwIHRoZSBsYXRlIHBlciBjcHUgdGltZXIgaW5pdC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19pbml0IHNldHVwX3g4Nl9tcnN0X3RpbWVyKGNoYXIgKmFyZykKLXsKLQlpZiAoIWFyZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc3RyY21wKCJhcGJ0X29ubHkiLCBhcmcpID09IDApCi0JCWRpc2FibGVfYXBidF9wZXJjcHUgPSAwOwotCWVsc2UgaWYgKHN0cmNtcCgibGFwaWNfYW5kX2FwYnQiLCBhcmcpID09IDApCi0JCWRpc2FibGVfYXBidF9wZXJjcHUgPSAxOwotCWVsc2UgewotCQlwcl93YXJuaW5nKCJYODYgTVJTVCB0aW1lciBvcHRpb24gJXMgbm90IHJlY29nbmlzZWQiCi0JCQkgICAiIHVzZSB4ODZfbXJzdF90aW1lcj1hcGJ0X29ubHkgb3IgbGFwaWNfYW5kX2FwYnRcbiIsCi0JCQkgICBhcmcpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1fX3NldHVwKCJ4ODZfbXJzdF90aW1lcj0iLCBzZXR1cF94ODZfbXJzdF90aW1lcik7Ci0KLS8qCiAgKiBzdGFydCBjb3VudCBkb3duIGZyb20gMHhmZmZmX2ZmZmYuIHRoaXMgaXMgZG9uZSBieSB0b2dnbGluZyB0aGUgZW5hYmxlIGJpdAogICogdGhlbiBsb2FkIGluaXRpYWwgbG9hZCBjb3VudCB0byB+MC4KICAqLwpAQCAtMzM1LDcgKzMxMSw3IEBACiAJYWRldi0+bnVtID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCW1lbWNweSgmYWRldi0+ZXZ0LCAmYXBidF9jbG9ja2V2ZW50LCBzaXplb2Yoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSkpOwogCi0JaWYgKGRpc2FibGVfYXBidF9wZXJjcHUpIHsKKwlpZiAobXJzdF90aW1lcl9vcHRpb25zID09IE1SU1RfVElNRVJfTEFQSUNfQVBCVCkgewogCQlhcGJ0X2Nsb2NrZXZlbnQucmF0aW5nID0gQVBCVF9DTE9DS0VWRU5UX1JBVElORyAtIDEwMDsKIAkJZ2xvYmFsX2Nsb2NrX2V2ZW50ID0gJmFkZXYtPmV2dDsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGNsb2NrZXZlbnQgcmVnaXN0ZXJlZCBhcyBnbG9iYWxcbiIsCkBAIC00MjksNyArNDA1LDggQEAKIAogc3RhdGljIF9faW5pdCBpbnQgYXBidF9sYXRlX2luaXQodm9pZCkKIHsKLQlpZiAoZGlzYWJsZV9hcGJ0X3BlcmNwdSB8fCAhYXBiX3RpbWVyX2Jsb2NrX2VuYWJsZWQpCisJaWYgKG1yc3RfdGltZXJfb3B0aW9ucyA9PSBNUlNUX1RJTUVSX0xBUElDX0FQQlQgfHwKKwkJIWFwYl90aW1lcl9ibG9ja19lbmFibGVkKQogCQlyZXR1cm4gMDsKIAkvKiBUaGlzIG5vdGlmaWVyIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgd29ya3F1ZXVlIGlzIHJlYWR5ICovCiAJaG90Y3B1X25vdGlmaWVyKGFwYnRfY3B1aHBfbm90aWZ5LCAtMjApOwpAQCAtNDUwLDYgKzQyNyw4IEBACiAJaW50IHRpbWVyX251bTsKIAlzdHJ1Y3QgYXBidF9kZXYgKmFkZXYgPSBFVlRfVE9fQVBCVF9ERVYoZXZ0KTsKIAorCUJVR19PTighYXBidF92aXJ0X2FkZHJlc3MpOworCiAJdGltZXJfbnVtID0gYWRldi0+bnVtOwogCXByX2RlYnVnKCIlcyBDUFUgJWQgdGltZXIgJWQgbW9kZT0lZFxuIiwKIAkJIF9fZnVuY19fLCBmaXJzdF9jcHUoKmV2dC0+Y3B1bWFzayksIHRpbWVyX251bSwgbW9kZSk7CkBAIC02NzYsNyArNjU1LDcgQEAKIAl9CiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIGtlcm5lbCBjbWRsaW5lIGRpc2FibGUgYXBiIHRpbWVyLCBzbyB3ZSB3aWxsIHVzZSBsYXBpYyB0aW1lcnMgKi8KLQlpZiAoZGlzYWJsZV9hcGJ0X3BlcmNwdSkgeworCWlmIChtcnN0X3RpbWVyX29wdGlvbnMgPT0gTVJTVF9USU1FUl9MQVBJQ19BUEJUKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImFwYnQ6IGRpc2FibGVkIHBlciBjcHUgdGltZXJcbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYwppbmRleCBiNWQ4YjBiLi5hMmUwY2FmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJICogb3IgQklPUyBmb3JnZXQgdG8gcHV0IHRoYXQgaW4gcmVzZXJ2ZWQuCiAJICogdHJ5IHRvIHVwZGF0ZSBlODIwIHRvIG1ha2UgdGhhdCByZWdpb24gYXMgcmVzZXJ2ZWQuCiAJICovCi0JdTMyIGFncF9hcGVyX2Jhc2UgPSAwLCBhZ3BfYXBlcl9vcmRlciA9IDA7CisJdTMyIGFncF9hcGVyX29yZGVyID0gMDsKIAlpbnQgaSwgZml4LCBzbG90LCB2YWxpZF9hZ3AgPSAwOwogCXUzMiBjdGw7CiAJdTMyIGFwZXJfc2l6ZSA9IDAsIGFwZXJfb3JkZXIgPSAwLCBsYXN0X2FwZXJfb3JkZXIgPSAwOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCXJldHVybjsKIAogCS8qIFRoaXMgaXMgbW9zdGx5IGR1cGxpY2F0ZSBvZiBpb21tdV9ob2xlX2luaXQgKi8KLQlhZ3BfYXBlcl9iYXNlID0gc2VhcmNoX2FncF9icmlkZ2UoJmFncF9hcGVyX29yZGVyLCAmdmFsaWRfYWdwKTsKKwlzZWFyY2hfYWdwX2JyaWRnZSgmYWdwX2FwZXJfb3JkZXIsICZ2YWxpZF9hZ3ApOwogCiAJZml4ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXNfZGV2X3Jhbmdlcyk7IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9NYWtlZmlsZQppbmRleCA1NjVjMWJmLi45MTBmMjBiNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUKQEAgLTIsNyArMiwxMiBAQAogIyBNYWtlZmlsZSBmb3IgbG9jYWwgQVBJQyBkcml2ZXJzIGFuZCBmb3IgdGhlIElPLUFQSUMgY29kZQogIwogCi1vYmotJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCSs9IGFwaWMubyBhcGljX25vb3AubyBwcm9iZV8kKEJJVFMpLm8gaXBpLm8gbm1pLm8KK29iai0kKENPTkZJR19YODZfTE9DQUxfQVBJQykJKz0gYXBpYy5vIGFwaWNfbm9vcC5vIHByb2JlXyQoQklUUykubyBpcGkubworaWZuZXEgKCQoQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IpLHkpCitvYmotJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCSs9IG5taS5vCitlbmRpZgorb2JqLSQoQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IpCSs9IGh3X25taS5vCisKIG9iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gaW9fYXBpYy5vCiBvYmotJChDT05GSUdfU01QKQkJKz0gaXBpLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCmluZGV4IGE5NjQ4OWUuLjk4MDUwOGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKQEAgLTQ2MCw3ICs0NjAsNyBAQAogfQogCiAvKgotICogU2V0dXAgdGhlIGxvY2FsIEFQSUMgdGltZXIgZm9yIHRoaXMgQ1BVLiBDb3B5IHRoZSBpbml0aWxpemVkIHZhbHVlcworICogU2V0dXAgdGhlIGxvY2FsIEFQSUMgdGltZXIgZm9yIHRoaXMgQ1BVLiBDb3B5IHRoZSBpbml0aWFsaXplZCB2YWx1ZXMKICAqIG9mIHRoZSBib290IENQVSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IGluIHRoZSBmcmFtZXdvcmsuCiAgKi8KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXR1cF9BUElDX3RpbWVyKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9od19ubWkuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2h3X25taS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZmQ2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9od19ubWkuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqICBIVyBOTUkgd2F0Y2hkb2cgc3VwcG9ydAorICoKKyAqICBzdGFydGVkIGJ5IERvbiBaaWNrdXMsIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICogIEFyY2ggc3BlY2lmaWMgY2FsbHMgdG8gc3VwcG9ydCBOTUkgd2F0Y2hkb2cKKyAqCisgKiAgQml0cyBjb3BpZWQgZnJvbSBvcmlnaW5hbCBubWkuYyBmaWxlCisgKgorICovCisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogRm9yIHJlbGlhYmlsaXR5LCB3ZSdyZSBwcmVwYXJlZCB0byB3YXN0ZSBiaXRzIGhlcmUuICovCitzdGF0aWMgREVDTEFSRV9CSVRNQVAoYmFja3RyYWNlX21hc2ssIE5SX0NQVVMpIF9fcmVhZF9tb3N0bHk7CisKK3U2NCBod19ubWlfZ2V0X3NhbXBsZV9wZXJpb2Qodm9pZCkKK3sKKwlyZXR1cm4gKHU2NCkoY3B1X2toeikgKiAxMDAwICogNjA7Cit9CisKKyNpZmRlZiBBUkNIX0hBU19OTUlfV0FUQ0hET0cKK3ZvaWQgYXJjaF90cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKHZvaWQpCit7CisJaW50IGk7CisKKwljcHVtYXNrX2NvcHkodG9fY3B1bWFzayhiYWNrdHJhY2VfbWFzayksIGNwdV9vbmxpbmVfbWFzayk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzZW5kaW5nIE5NSSB0byBhbGwgQ1BVczpcbiIpOworCWFwaWMtPnNlbmRfSVBJX2FsbChOTUlfVkVDVE9SKTsKKworCS8qIFdhaXQgZm9yIHVwIHRvIDEwIHNlY29uZHMgZm9yIGFsbCBDUFVzIHRvIGRvIHRoZSBiYWNrdHJhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAgKiAxMDAwOyBpKyspIHsKKwkJaWYgKGNwdW1hc2tfZW1wdHkodG9fY3B1bWFzayhiYWNrdHJhY2VfbWFzaykpKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzCithcmNoX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2VfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKl9fYXJncykKK3sKKwlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSBfX2FyZ3M7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBESUVfTk1JOgorCWNhc2UgRElFX05NSV9JUEk6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCXJlZ3MgPSBhcmdzLT5yZWdzOworCisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCB0b19jcHVtYXNrKGJhY2t0cmFjZV9tYXNrKSkpIHsKKwkJc3RhdGljIGFyY2hfc3BpbmxvY2tfdCBsb2NrID0gX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRDsKKworCQlhcmNoX3NwaW5fbG9jaygmbG9jayk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5NSSBiYWNrdHJhY2UgZm9yIGNwdSAlZFxuIiwgY3B1KTsKKwkJc2hvd19yZWdzKHJlZ3MpOworCQlkdW1wX3N0YWNrKCk7CisJCWFyY2hfc3Bpbl91bmxvY2soJmxvY2spOworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRvX2NwdW1hc2soYmFja3RyYWNlX21hc2spKTsKKwkJcmV0dXJuIE5PVElGWV9TVE9QOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIF9fcmVhZF9tb3N0bHkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJhY2t0cmFjZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCAgICAgICAgICA9IGFyY2hfdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZV9oYW5kbGVyLAorCS5uZXh0ICAgICAgICAgICAgICAgICAgID0gTlVMTCwKKwkucHJpb3JpdHkgICAgICAgICAgICAgICA9IDEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2Uodm9pZCkKK3sKKwlyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmJhY2t0cmFjZV9ub3RpZmllcik7CisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbChyZWdpc3Rlcl90cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKTsKKyNlbmRpZgorCisvKiBTVFVCIGNhbGxzIHRvIG1pbWljIG9sZCBubWlfd2F0Y2hkb2cgYmVoYXZpb3VyICovCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCit1bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nID0gTk1JX05PTkU7CitFWFBPUlRfU1lNQk9MKG5taV93YXRjaGRvZyk7Cit2b2lkIGFjcGlfbm1pX2VuYWJsZSh2b2lkKSB7IHJldHVybjsgfQordm9pZCBhY3BpX25taV9kaXNhYmxlKHZvaWQpIHsgcmV0dXJuOyB9CisjZW5kaWYKK2F0b21pY190IG5taV9hY3RpdmUgPSBBVE9NSUNfSU5JVCgwKTsgICAgICAgICAgIC8qIG9wcm9maWxlIHVzZXMgdGhpcyAqLworRVhQT1JUX1NZTUJPTChubWlfYWN0aXZlKTsKK2ludCB1bmtub3duX25taV9wYW5pYzsKK3ZvaWQgY3B1X25taV9zZXRfd2RfZW5hYmxlZCh2b2lkKSB7IHJldHVybjsgfQordm9pZCBzdG9wX2FwaWNfbm1pX3dhdGNoZG9nKHZvaWQgKnVudXNlZCkgeyByZXR1cm47IH0KK3ZvaWQgc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2codm9pZCAqdW51c2VkKSB7IHJldHVybjsgfQoraW50IF9faW5pdCBjaGVja19ubWlfd2F0Y2hkb2codm9pZCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCmluZGV4IGU0MWVkMjQuLjRkYzAwODQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKQEAgLTMzOTcsNyArMzM5Nyw3IEBACiAKIAljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAKLQlyZWFkX21zaV9tc2dfZGVzYyhkZXNjLCAmbXNnKTsKKwlnZXRfY2FjaGVkX21zaV9tc2dfZGVzYyhkZXNjLCAmbXNnKTsKIAogCW1zZy5kYXRhICY9IH5NU0lfREFUQV9WRUNUT1JfTUFTSzsKIAltc2cuZGF0YSB8PSBNU0lfREFUQV9WRUNUT1IoY2ZnLT52ZWN0b3IpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYwppbmRleCAxZWRhZjE1Li5hNDNmNzFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYwpAQCAtNDAxLDEzICs0MDEsNiBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IHJjID0gMDsKIAotCS8qIGNoZWNrIGZvciBvdGhlciB1c2VycyBmaXJzdCAqLwotCWlmIChub3RpZnlfZGllKERJRV9OTUksICJubWkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkKLQkJCT09IE5PVElGWV9TVE9QKSB7Ci0JCXJjID0gMTsKLQkJdG91Y2hlZCA9IDE7Ci0JfQotCiAJc3VtID0gZ2V0X3RpbWVyX2lycXMoY3B1KTsKIAogCWlmIChfX2dldF9jcHVfdmFyKG5taV90b3VjaCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYwppbmRleCBjNGY5MTgyLi40YzljNjdiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBtXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jCkBAIC0xNDAsNyArMTQwLDcgQEAKICAqICAgICAgICAgaXMgbm93IHRoZSB3YXkgbGlmZSB3b3JrcykuCiAgKiAgICAgICAgIEZpeCB0aGlua28gaW4gc3VzcGVuZCgpICh3cm9uZyByZXR1cm4pLgogICogICAgICAgICBOb3RpZnkgZHJpdmVycyBvbiBjcml0aWNhbCBzdXNwZW5kLgotICogICAgICAgICBNYWtlIGthcG1kIGFic29yYiBtb3JlIGlkbGUgdGltZSAoUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogICAgICAgICBNYWtlIGthcG1kIGFic29yYiBtb3JlIGlkbGUgdGltZSAoUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiAgKiAgICAgICAgIG1vZGlmaWVkIGJ5IHNmcikuCiAgKiAgICAgICAgIERpc2FibGUgaW50ZXJydXB0cyB3aGlsZSB3ZSBhcmUgc3VzcGVuZGVkIChBbmR5IEhlbnJvaWQKICAqICAgICAgICAgPGFuZHlfaGVucm9pZEB5YWhvby5jb20+IGZpeGVkIGJ5IHNmcikuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQppbmRleCAzYTc4NWRhLi4zZjBlYmU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTEyLDExICsxMiwxMSBAQAogbm9zdGFja3AgOj0gJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IpCiBDRkxBR1NfY29tbW9uLm8JCTo9ICQobm9zdGFja3ApCiAKLW9iai15CQkJOj0gaW50ZWxfY2FjaGVpbmZvLm8gYWRkb25fY3B1aWRfZmVhdHVyZXMubworb2JqLXkJCQk6PSBpbnRlbF9jYWNoZWluZm8ubyBzY2F0dGVyZWQubyB0b3BvbG9neS5vCiBvYmoteQkJCSs9IHByb2MubyBjYXBmbGFncy5vIHBvd2VyZmxhZ3MubyBjb21tb24ubwogb2JqLXkJCQkrPSB2bXdhcmUubyBoeXBlcnZpc29yLm8gc2NoZWQubyBtc2h5cGVydi5vCiAKLW9iai0kKENPTkZJR19YODZfMzIpCSs9IGJ1Z3MubyBjbXB4Y2hnLm8KK29iai0kKENPTkZJR19YODZfMzIpCSs9IGJ1Z3Mubwogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gYnVnc182NC5vCiAKIG9iai0kKENPTkZJR19DUFVfU1VQX0lOVEVMKQkJKz0gaW50ZWwubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9hZGRvbl9jcHVpZF9mZWF0dXJlcy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9hZGRvbl9jcHVpZF9mZWF0dXJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGZhNTY4Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYWRkb25fY3B1aWRfZmVhdHVyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICoJUm91dGluZXMgdG8gaW5kZW50aWZ5IGFkZGl0aW9uYWwgY3B1IGZlYXR1cmVzIHRoYXQgYXJlIHNjYXR0ZXJlZCBpbgotICoJY3B1aWQgc3BhY2UuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLQotI2luY2x1ZGUgPGFzbS9wYXQuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotCi1zdHJ1Y3QgY3B1aWRfYml0IHsKLQl1MTYgZmVhdHVyZTsKLQl1OCByZWc7Ci0JdTggYml0OwotCXUzMiBsZXZlbDsKLX07Ci0KLWVudW0gY3B1aWRfcmVncyB7Ci0JQ1JfRUFYID0gMCwKLQlDUl9FQ1gsCi0JQ1JfRURYLAotCUNSX0VCWAotfTsKLQotdm9pZCBfX2NwdWluaXQgaW5pdF9zY2F0dGVyZWRfY3B1aWRfZmVhdHVyZXMoc3RydWN0IGNwdWluZm9feDg2ICpjKQotewotCXUzMiBtYXhfbGV2ZWw7Ci0JdTMyIHJlZ3NbNF07Ci0JY29uc3Qgc3RydWN0IGNwdWlkX2JpdCAqY2I7Ci0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IGNwdWlkX2JpdCBfX2NwdWluaXRjb25zdCBjcHVpZF9iaXRzW10gPSB7Ci0JCXsgWDg2X0ZFQVRVUkVfSURBLCAgIAkJQ1JfRUFYLCAxLCAweDAwMDAwMDA2IH0sCi0JCXsgWDg2X0ZFQVRVUkVfQVJBVCwgIAkJQ1JfRUFYLCAyLCAweDAwMDAwMDA2IH0sCi0JCXsgWDg2X0ZFQVRVUkVfQVBFUkZNUEVSRiwJQ1JfRUNYLCAwLCAweDAwMDAwMDA2IH0sCi0JCXsgWDg2X0ZFQVRVUkVfQ1BCLCAgIAkJQ1JfRURYLCA5LCAweDgwMDAwMDA3IH0sCi0JCXsgWDg2X0ZFQVRVUkVfTlBULCAgIAkJQ1JfRURYLCAwLCAweDgwMDAwMDBhIH0sCi0JCXsgWDg2X0ZFQVRVUkVfTEJSViwgIAkJQ1JfRURYLCAxLCAweDgwMDAwMDBhIH0sCi0JCXsgWDg2X0ZFQVRVUkVfU1ZNTCwgIAkJQ1JfRURYLCAyLCAweDgwMDAwMDBhIH0sCi0JCXsgWDg2X0ZFQVRVUkVfTlJJUFMsIAkJQ1JfRURYLCAzLCAweDgwMDAwMDBhIH0sCi0JCXsgMCwgMCwgMCwgMCB9Ci0JfTsKLQotCWZvciAoY2IgPSBjcHVpZF9iaXRzOyBjYi0+ZmVhdHVyZTsgY2IrKykgewotCi0JCS8qIFZlcmlmeSB0aGF0IHRoZSBsZXZlbCBpcyB2YWxpZCAqLwotCQltYXhfbGV2ZWwgPSBjcHVpZF9lYXgoY2ItPmxldmVsICYgMHhmZmZmMDAwMCk7Ci0JCWlmIChtYXhfbGV2ZWwgPCBjYi0+bGV2ZWwgfHwKLQkJICAgIG1heF9sZXZlbCA+IChjYi0+bGV2ZWwgfCAweGZmZmYpKQotCQkJY29udGludWU7Ci0KLQkJY3B1aWQoY2ItPmxldmVsLCAmcmVnc1tDUl9FQVhdLCAmcmVnc1tDUl9FQlhdLAotCQkJJnJlZ3NbQ1JfRUNYXSwgJnJlZ3NbQ1JfRURYXSk7Ci0KLQkJaWYgKHJlZ3NbY2ItPnJlZ10gJiAoMSA8PCBjYi0+Yml0KSkKLQkJCXNldF9jcHVfY2FwKGMsIGNiLT5mZWF0dXJlKTsKLQl9Ci19Ci0KLS8qIGxlYWYgMHhiIFNNVCBsZXZlbCAqLwotI2RlZmluZSBTTVRfTEVWRUwJMAotCi0vKiBsZWFmIDB4YiBzdWItbGVhZiB0eXBlcyAqLwotI2RlZmluZSBJTlZBTElEX1RZUEUJMAotI2RlZmluZSBTTVRfVFlQRQkxCi0jZGVmaW5lIENPUkVfVFlQRQkyCi0KLSNkZWZpbmUgTEVBRkJfU1VCVFlQRShlY3gpCQkoKChlY3gpID4+IDgpICYgMHhmZikKLSNkZWZpbmUgQklUU19TSElGVF9ORVhUX0xFVkVMKGVheCkJKChlYXgpICYgMHgxZikKLSNkZWZpbmUgTEVWRUxfTUFYX1NJQkxJTkdTKGVieCkJCSgoZWJ4KSAmIDB4ZmZmZikKLQotLyoKLSAqIENoZWNrIGZvciBleHRlbmRlZCB0b3BvbG9neSBlbnVtZXJhdGlvbiBjcHVpZCBsZWFmIDB4YiBhbmQgaWYgaXQKLSAqIGV4aXN0cywgdXNlIGl0IGZvciBwb3B1bGF0aW5nIGluaXRpYWxfYXBpY2lkIGFuZCBjcHUgdG9wb2xvZ3kKLSAqIGRldGVjdGlvbi4KLSAqLwotdm9pZCBfX2NwdWluaXQgZGV0ZWN0X2V4dGVuZGVkX3RvcG9sb2d5KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeCwgc3ViX2luZGV4OwotCXVuc2lnbmVkIGludCBodF9tYXNrX3dpZHRoLCBjb3JlX3BsdXNfbWFza193aWR0aDsKLQl1bnNpZ25lZCBpbnQgY29yZV9zZWxlY3RfbWFzaywgY29yZV9sZXZlbF9zaWJsaW5nczsKLQlzdGF0aWMgYm9vbCBwcmludGVkOwotCi0JaWYgKGMtPmNwdWlkX2xldmVsIDwgMHhiKQotCQlyZXR1cm47Ci0KLQljcHVpZF9jb3VudCgweGIsIFNNVF9MRVZFTCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Ci0KLQkvKgotCSAqIGNoZWNrIGlmIHRoZSBjcHVpZCBsZWFmIDB4YiBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZC4KLQkgKi8KLQlpZiAoZWJ4ID09IDAgfHwgKExFQUZCX1NVQlRZUEUoZWN4KSAhPSBTTVRfVFlQRSkpCi0JCXJldHVybjsKLQotCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1hUT1BPTE9HWSk7Ci0KLQkvKgotCSAqIGluaXRpYWwgYXBpYyBpZCwgd2hpY2ggYWxzbyByZXByZXNlbnRzIDMyLWJpdCBleHRlbmRlZCB4MmFwaWMgaWQuCi0JICovCi0JYy0+aW5pdGlhbF9hcGljaWQgPSBlZHg7Ci0KLQkvKgotCSAqIFBvcHVsYXRlIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSBzdWItbGVhZiBsZXZlbCAwLgotCSAqLwotCWNvcmVfbGV2ZWxfc2libGluZ3MgPSBzbXBfbnVtX3NpYmxpbmdzID0gTEVWRUxfTUFYX1NJQkxJTkdTKGVieCk7Ci0JY29yZV9wbHVzX21hc2tfd2lkdGggPSBodF9tYXNrX3dpZHRoID0gQklUU19TSElGVF9ORVhUX0xFVkVMKGVheCk7Ci0KLQlzdWJfaW5kZXggPSAxOwotCWRvIHsKLQkJY3B1aWRfY291bnQoMHhiLCBzdWJfaW5kZXgsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwotCi0JCS8qCi0JCSAqIENoZWNrIGZvciB0aGUgQ29yZSB0eXBlIGluIHRoZSBpbXBsZW1lbnRlZCBzdWIgbGVhdmVzLgotCQkgKi8KLQkJaWYgKExFQUZCX1NVQlRZUEUoZWN4KSA9PSBDT1JFX1RZUEUpIHsKLQkJCWNvcmVfbGV2ZWxfc2libGluZ3MgPSBMRVZFTF9NQVhfU0lCTElOR1MoZWJ4KTsKLQkJCWNvcmVfcGx1c19tYXNrX3dpZHRoID0gQklUU19TSElGVF9ORVhUX0xFVkVMKGVheCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1Yl9pbmRleCsrOwotCX0gd2hpbGUgKExFQUZCX1NVQlRZUEUoZWN4KSAhPSBJTlZBTElEX1RZUEUpOwotCi0JY29yZV9zZWxlY3RfbWFzayA9ICh+KC0xIDw8IGNvcmVfcGx1c19tYXNrX3dpZHRoKSkgPj4gaHRfbWFza193aWR0aDsKLQotCWMtPmNwdV9jb3JlX2lkID0gYXBpYy0+cGh5c19wa2dfaWQoYy0+aW5pdGlhbF9hcGljaWQsIGh0X21hc2tfd2lkdGgpCi0JCQkJCQkgJiBjb3JlX3NlbGVjdF9tYXNrOwotCWMtPnBoeXNfcHJvY19pZCA9IGFwaWMtPnBoeXNfcGtnX2lkKGMtPmluaXRpYWxfYXBpY2lkLCBjb3JlX3BsdXNfbWFza193aWR0aCk7Ci0JLyoKLQkgKiBSZWluaXQgdGhlIGFwaWNpZCwgbm93IHRoYXQgd2UgaGF2ZSBleHRlbmRlZCBpbml0aWFsX2FwaWNpZC4KLQkgKi8KLQljLT5hcGljaWQgPSBhcGljLT5waHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgMCk7Ci0KLQljLT54ODZfbWF4X2NvcmVzID0gKGNvcmVfbGV2ZWxfc2libGluZ3MgLyBzbXBfbnVtX3NpYmxpbmdzKTsKLQotCWlmICghcHJpbnRlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLAotCQkgICAgICAgYy0+cGh5c19wcm9jX2lkKTsKLQkJaWYgKGMtPng4Nl9tYXhfY29yZXMgPiAxKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogUHJvY2Vzc29yIENvcmUgSUQ6ICVkXG4iLAotCQkJICAgICAgIGMtPmNwdV9jb3JlX2lkKTsKLQkJcHJpbnRlZCA9IDE7Ci0JfQotCXJldHVybjsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggZTQ4NTgyNS4uNjBhNTdiMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC00NjYsNyArNDY2LDcgQEAKIAkJfQogCiAJfQotCWlmIChjLT54ODYgPT0gMHgxMCB8fCBjLT54ODYgPT0gMHgxMSkKKwlpZiAoYy0+eDg2ID49IDB4MTApCiAJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1JFUF9HT09EKTsKIAogCS8qIGdldCBhcGljaWQgaW5zdGVhZCBvZiBpbml0aWFsIGFwaWMgaWQgZnJvbSBjcHVpZCAqLwpAQCAtNTI5LDcgKzUyOSw3IEBACiAJCQludW1fY2FjaGVfbGVhdmVzID0gMzsKIAl9CiAKLQlpZiAoYy0+eDg2ID49IDB4ZiAmJiBjLT54ODYgPD0gMHgxMSkKKwlpZiAoYy0+eDg2ID49IDB4ZikKIAkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfSzgpOwogCiAJaWYgKGNwdV9oYXNfeG1tMikgewpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJCWZhbTEwaF9jaGVja19lbmFibGVfbW1jZmcoKTsKIAl9CiAKLQlpZiAoYyA9PSAmYm9vdF9jcHVfZGF0YSAmJiBjLT54ODYgPj0gMHhmICYmIGMtPng4NiA8PSAweDExKSB7CisJaWYgKGMgPT0gJmJvb3RfY3B1X2RhdGEgJiYgYy0+eDg2ID49IDB4ZikgewogCQl1bnNpZ25lZCBsb25nIGxvbmcgdHNlZzsKIAogCQkvKgpAQCAtNjA5LDMgKzYwOSw3NCBAQAogfTsKIAogY3B1X2Rldl9yZWdpc3RlcihhbWRfY3B1X2Rldik7CisKKy8qCisgKiBBTUQgZXJyYXRhIGNoZWNraW5nCisgKgorICogRXJyYXRhIGFyZSBkZWZpbmVkIGFzIGFycmF5cyBvZiBpbnRzIHVzaW5nIHRoZSBBTURfTEVHQUNZX0VSUkFUVU0oKSBvcgorICogQU1EX09TVldfRVJSQVRVTSgpIG1hY3Jvcy4gVGhlIGxhdHRlciBpcyBpbnRlbmRlZCBmb3IgbmV3ZXIgZXJyYXRhIHRoYXQKKyAqIGhhdmUgYW4gT1NWVyBpZCBhc3NpZ25lZCwgd2hpY2ggaXQgdGFrZXMgYXMgZmlyc3QgYXJndW1lbnQuIEJvdGggdGFrZSBhCisgKiB2YXJpYWJsZSBudW1iZXIgb2YgZmFtaWx5LXNwZWNpZmljIG1vZGVsLXN0ZXBwaW5nIHJhbmdlcyBjcmVhdGVkIGJ5CisgKiBBTURfTU9ERUxfUkFOR0UoKS4gRWFjaCBlcnJhdHVtIGFsc28gaGFzIHRvIGJlIGRlY2xhcmVkIGFzIGV4dGVybiBjb25zdAorICogaW50W10gaW4gYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmguCisgKgorICogRXhhbXBsZToKKyAqCisgKiBjb25zdCBpbnQgYW1kX2VycmF0dW1fMzE5W10gPQorICoJQU1EX0xFR0FDWV9FUlJBVFVNKEFNRF9NT0RFTF9SQU5HRSgweDEwLCAweDIsIDB4MSwgMHg0LCAweDIpLAorICoJCQkgICBBTURfTU9ERUxfUkFOR0UoMHgxMCwgMHg4LCAweDAsIDB4OCwgMHgwKSwKKyAqCQkJICAgQU1EX01PREVMX1JBTkdFKDB4MTAsIDB4OSwgMHgwLCAweDksIDB4MCkpOworICovCisKK2NvbnN0IGludCBhbWRfZXJyYXR1bV80MDBbXSA9CisJQU1EX09TVldfRVJSQVRVTSgxLCBBTURfTU9ERUxfUkFOR0UoMHhmLCAweDQxLCAweDIsIDB4ZmYsIDB4ZiksCisJCQkgICAgQU1EX01PREVMX1JBTkdFKDB4MTAsIDB4MiwgMHgxLCAweGZmLCAweGYpKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFtZF9lcnJhdHVtXzQwMCk7CisKK2NvbnN0IGludCBhbWRfZXJyYXR1bV8zODNbXSA9CisJQU1EX09TVldfRVJSQVRVTSgzLCBBTURfTU9ERUxfUkFOR0UoMHgxMCwgMCwgMCwgMHhmZiwgMHhmKSk7CitFWFBPUlRfU1lNQk9MX0dQTChhbWRfZXJyYXR1bV8zODMpOworCitib29sIGNwdV9oYXNfYW1kX2VycmF0dW0oY29uc3QgaW50ICplcnJhdHVtKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmN1cnJlbnRfY3B1X2RhdGE7CisJaW50IG9zdndfaWQgPSAqZXJyYXR1bSsrOworCXUzMiByYW5nZTsKKwl1MzIgbXM7CisKKwkvKgorCSAqIElmIGNhbGxlZCBlYXJseSBlbm91Z2ggdGhhdCBjdXJyZW50X2NwdV9kYXRhIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCisJICogeWV0LCBmYWxsIGJhY2sgdG8gYm9vdF9jcHVfZGF0YS4KKwkgKi8KKwlpZiAoY3B1LT54ODYgPT0gMCkKKwkJY3B1ID0gJmJvb3RfY3B1X2RhdGE7CisKKwlpZiAoY3B1LT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAob3N2d19pZCA+PSAwICYmIG9zdndfaWQgPCA2NTUzNiAmJgorCSAgICBjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfT1NWVykpIHsKKwkJdTY0IG9zdndfbGVuOworCisJCXJkbXNybChNU1JfQU1ENjRfT1NWV19JRF9MRU5HVEgsIG9zdndfbGVuKTsKKwkJaWYgKG9zdndfaWQgPCBvc3Z3X2xlbikgeworCQkJdTY0IG9zdndfYml0czsKKworCQkJcmRtc3JsKE1TUl9BTUQ2NF9PU1ZXX1NUQVRVUyArIChvc3Z3X2lkID4+IDYpLAorCQkJICAgIG9zdndfYml0cyk7CisJCQlyZXR1cm4gb3N2d19iaXRzICYgKDFVTEwgPDwgKG9zdndfaWQgJiAweDNmKSk7CisJCX0KKwl9CisKKwkvKiBPU1ZXIHVuYXZhaWxhYmxlIG9yIElEIHVua25vd24sIG1hdGNoIGZhbWlseS1tb2RlbC1zdGVwcGluZyByYW5nZSAqLworCW1zID0gKGNwdS0+eDg2X21vZGVsIDw8IDgpIHwgY3B1LT54ODZfbWFzazsKKwl3aGlsZSAoKHJhbmdlID0gKmVycmF0dW0rKykpCisJCWlmICgoY3B1LT54ODYgPT0gQU1EX01PREVMX1JBTkdFX0ZBTUlMWShyYW5nZSkpICYmCisJCSAgICAobXMgPj0gQU1EX01PREVMX1JBTkdFX1NUQVJUKHJhbmdlKSkgJiYKKwkJICAgIChtcyA8PSBBTURfTU9ERUxfUkFOR0VfRU5EKHJhbmdlKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2hhc19hbWRfZXJyYXR1bSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NtcHhjaGcuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY21weGNoZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU2Y2NmLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY21weGNoZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIGNtcHhjaGcqKCkgZmFsbGJhY2tzIGZvciBDUFUgbm90IHN1cHBvcnRpbmcgdGhlc2UgaW5zdHJ1Y3Rpb25zCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaWZuZGVmIENPTkZJR19YODZfQ01QWENIRwotdW5zaWduZWQgbG9uZyBjbXB4Y2hnXzM4Nl91OCh2b2xhdGlsZSB2b2lkICpwdHIsIHU4IG9sZCwgdTggbmV3KQotewotCXU4IHByZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIFBvb3IgbWFuJ3MgY21weGNoZyBmb3IgMzg2LiBVbnN1aXRhYmxlIGZvciBTTVAgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcHJldiA9ICoodTggKilwdHI7Ci0JaWYgKHByZXYgPT0gb2xkKQotCQkqKHU4ICopcHRyID0gbmV3OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcHJldjsKLX0KLUVYUE9SVF9TWU1CT0woY21weGNoZ18zODZfdTgpOwotCi11bnNpZ25lZCBsb25nIGNtcHhjaGdfMzg2X3UxNih2b2xhdGlsZSB2b2lkICpwdHIsIHUxNiBvbGQsIHUxNiBuZXcpCi17Ci0JdTE2IHByZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIFBvb3IgbWFuJ3MgY21weGNoZyBmb3IgMzg2LiBVbnN1aXRhYmxlIGZvciBTTVAgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcHJldiA9ICoodTE2ICopcHRyOwotCWlmIChwcmV2ID09IG9sZCkKLQkJKih1MTYgKilwdHIgPSBuZXc7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiBwcmV2OwotfQotRVhQT1JUX1NZTUJPTChjbXB4Y2hnXzM4Nl91MTYpOwotCi11bnNpZ25lZCBsb25nIGNtcHhjaGdfMzg2X3UzMih2b2xhdGlsZSB2b2lkICpwdHIsIHUzMiBvbGQsIHUzMiBuZXcpCi17Ci0JdTMyIHByZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIFBvb3IgbWFuJ3MgY21weGNoZyBmb3IgMzg2LiBVbnN1aXRhYmxlIGZvciBTTVAgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcHJldiA9ICoodTMyICopcHRyOwotCWlmIChwcmV2ID09IG9sZCkKLQkJKih1MzIgKilwdHIgPSBuZXc7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiBwcmV2OwotfQotRVhQT1JUX1NZTUJPTChjbXB4Y2hnXzM4Nl91MzIpOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX1g4Nl9DTVBYQ0hHNjQKLXVuc2lnbmVkIGxvbmcgbG9uZyBjbXB4Y2hnXzQ4Nl91NjQodm9sYXRpbGUgdm9pZCAqcHRyLCB1NjQgb2xkLCB1NjQgbmV3KQotewotCXU2NCBwcmV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBQb29yIG1hbidzIGNtcHhjaGc4YiBmb3IgMzg2IGFuZCA0ODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlwcmV2ID0gKih1NjQgKilwdHI7Ci0JaWYgKHByZXYgPT0gb2xkKQotCQkqKHU2NCAqKXB0ciA9IG5ldzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHByZXY7Ci19Ci1FWFBPUlRfU1lNQk9MKGNtcHhjaGdfNDg2X3U2NCk7Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggNjhlNGE2Zi4uZjEwMjczMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC01NTEsNiArNTUxLDE2IEBACiAJCWMtPng4Nl9jYXBhYmlsaXR5WzRdID0gZXhjYXA7CiAJfQogCisJLyogQWRkaXRpb25hbCBJbnRlbC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDAwMDAwMDA3ICovCisJaWYgKGMtPmNwdWlkX2xldmVsID49IDB4MDAwMDAwMDcpIHsKKwkJdTMyIGVheCwgZWJ4LCBlY3gsIGVkeDsKKworCQljcHVpZF9jb3VudCgweDAwMDAwMDA3LCAwLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworCQlpZiAoZWF4ID4gMCkKKwkJCWMtPng4Nl9jYXBhYmlsaXR5WzldID0gZWJ4OworCX0KKwogCS8qIEFNRC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDgwMDAwMDAxICovCiAJeGx2bCA9IGNwdWlkX2VheCgweDgwMDAwMDAwKTsKIAljLT5leHRlbmRlZF9jcHVpZF9sZXZlbCA9IHhsdmw7CkBAIC01NzYsNiArNTg2LDcgQEAKIAlpZiAoYy0+ZXh0ZW5kZWRfY3B1aWRfbGV2ZWwgPj0gMHg4MDAwMDAwNykKIAkJYy0+eDg2X3Bvd2VyID0gY3B1aWRfZWR4KDB4ODAwMDAwMDcpOwogCisJaW5pdF9zY2F0dGVyZWRfY3B1aWRfZmVhdHVyZXMoYyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpZGVudGlmeV9jcHVfd2l0aG91dF9jcHVpZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC03MzEsNyArNzQyLDYgQEAKIAogCWdldF9tb2RlbF9uYW1lKGMpOyAvKiBEZWZhdWx0IG5hbWUgKi8KIAotCWluaXRfc2NhdHRlcmVkX2NwdWlkX2ZlYXR1cmVzKGMpOwogCWRldGVjdF9ub3BsKGMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKaW5kZXggMWQzY2RkYS4uMjQ2Y2QzYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0zMjQsOCArMzIzLDYgQEAKIAkJfQogCX0KIAotCXRyYWNlX3Bvd2VyX2ZyZXF1ZW5jeShQT1dFUl9QU1RBVEUsIGRhdGEtPmZyZXFfdGFibGVbbmV4dF9zdGF0ZV0uZnJlcXVlbmN5KTsKLQogCXN3aXRjaCAoZGF0YS0+Y3B1X2ZlYXR1cmUpIHsKIAljYXNlIFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRToKIAkJY21kLnR5cGUgPSBTWVNURU1fSU5URUxfTVNSX0NBUEFCTEU7CkBAIC0zNTEsNyArMzQ4LDcgQEAKIAogCWZyZXFzLm9sZCA9IHBlcmYtPnN0YXRlc1twZXJmLT5zdGF0ZV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCWZyZXFzLm5ldyA9IGRhdGEtPmZyZXFfdGFibGVbbmV4dF9zdGF0ZV0uZnJlcXVlbmN5OwotCWZvcl9lYWNoX2NwdShpLCBjbWQubWFzaykgeworCWZvcl9lYWNoX2NwdShpLCBwb2xpY3ktPmNwdXMpIHsKIAkJZnJlcXMuY3B1ID0gaTsKIAkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKIAl9CkBAIC0zNjcsNyArMzY0LDcgQEAKIAkJfQogCX0KIAotCWZvcl9lYWNoX2NwdShpLCBjbWQubWFzaykgeworCWZvcl9lYWNoX2NwdShpLCBwb2xpY3ktPmNwdXMpIHsKIAkJZnJlcXMuY3B1ID0gaTsKIAkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKaW5kZXggMTZlMzQ4My4uMzI5NzRjZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jCkBAIC0xNjksMTIgKzE2OSw5IEBACiAgKglMb3cgTGV2ZWwgY2hpcHNldCBpbnRlcmZhY2UJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ3hfY2hpcHNldF90YmxbXSBfX2luaXRkYXRhID0gewotCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0xFR0FDWSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTIwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IFBDSV9WREVWSUNFKENZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZKSwgfSwKKwl7IFBDSV9WREVWSUNFKENZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjApLCB9LAorCXsgUENJX1ZERVZJQ0UoQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUxMCksIH0sCiAJeyAwLCB9LAogfTsKIApAQCAtMTk5LDcgKzE5Niw3IEBACiAJfQogCiAJLyogZGV0ZWN0IHdoaWNoIGNvbXBhbmlvbiBjaGlwIGlzIHVzZWQgKi8KLQl3aGlsZSAoKGd4X3BjaSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGd4X3BjaSkpICE9IE5VTEwpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KGd4X3BjaSkgewogCQlpZiAoKHBjaV9tYXRjaF9pZChneF9jaGlwc2V0X3RibCwgZ3hfcGNpKSkgIT0gTlVMTCkKIAkJCXJldHVybiBneF9wY2k7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCA3ZTdlZWE0Li4wMzE2MmRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2luaXQgbG9uZ2hhdWxfZ2V0X3Jhbmdlcyh2b2lkKQorc3RhdGljIGludCBfX2NwdWluaXQgbG9uZ2hhdWxfZ2V0X3Jhbmdlcyh2b2lkKQogewogCXVuc2lnbmVkIGludCBpLCBqLCBrID0gMDsKIAl1bnNpZ25lZCBpbnQgcmF0aW87CkBAIC01MzAsNyArNTMwLDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBfX2luaXQgbG9uZ2hhdWxfc2V0dXBfdm9sdGFnZXNjYWxpbmcodm9pZCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBsb25naGF1bF9zZXR1cF92b2x0YWdlc2NhbGluZyh2b2lkKQogewogCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKIAlzdHJ1Y3QgbVZfcG9zIG1pbnZpZCwgbWF4dmlkLCB2aWQ7CkBAIC03ODQsNyArNzg0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbG9uZ2hhdWxfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBsb25naGF1bF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoMCk7CiAJY2hhciAqY3B1bmFtZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCmluZGV4IGUyMzYwYTQuLmNiZjQ4ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCkBAIC01Niw3ICs1Niw3IEBACiAvKgogICogVklBIEMzIFNhbXVlbCAxICAmIFNhbXVlbCAyIChzdGVwcGluZyAwKQogICovCi1zdGF0aWMgY29uc3QgaW50IF9faW5pdGRhdGEgc2FtdWVsMV9tdWx0c1sxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IF9fY3B1aW5pdGRhdGEgc2FtdWVsMV9tdWx0c1sxNl0gPSB7CiAJLTEsIC8qIDAwMDAgLT4gUkVTRVJWRUQgKi8KIAkzMCwgLyogMDAwMSAtPiAgMy4weCAqLwogCTQwLCAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC03NSw3ICs3NSw3IEBACiAJLTEsIC8qIDExMTEgLT4gUkVTRVJWRUQgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgX19pbml0ZGF0YSBzYW11ZWwxX2VibGNyWzE2XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX19jcHVpbml0ZGF0YSBzYW11ZWwxX2VibGNyWzE2XSA9IHsKIAk1MCwgLyogMDAwMCAtPiBSRVNFUlZFRCAqLwogCTMwLCAvKiAwMDAxIC0+ICAzLjB4ICovCiAJNDAsIC8qIDAwMTAgLT4gIDQuMHggKi8KQEAgLTk3LDcgKzk3LDcgQEAKIC8qCiAgKiBWSUEgQzMgU2FtdWVsMiBTdGVwcGluZyAxLT4xNQogICovCi1zdGF0aWMgY29uc3QgaW50IF9faW5pdGRhdGEgc2FtdWVsMl9lYmxjclsxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IF9fY3B1aW5pdGRhdGEgc2FtdWVsMl9lYmxjclsxNl0gPSB7CiAJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCiAJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC0xMTksNyArMTE5LDcgQEAKIC8qCiAgKiBWSUEgQzMgRXpyYQogICovCi1zdGF0aWMgY29uc3QgaW50IF9faW5pdGRhdGEgZXpyYV9tdWx0c1sxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IF9fY3B1aW5pdGRhdGEgZXpyYV9tdWx0c1sxNl0gPSB7CiAJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCiAJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgX19pbml0ZGF0YSBlenJhX2VibGNyWzE2XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX19jcHVpbml0ZGF0YSBlenJhX2VibGNyWzE2XSA9IHsKIAk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KIAkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KIAk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KQEAgLTE2MCw3ICsxNjAsNyBAQAogLyoKICAqIFZJQSBDMyAoRXpyYS1UKSBbQzVNXS4KICAqLwotc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIGV6cmF0X211bHRzWzMyXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX19jcHVpbml0ZGF0YSBlenJhdF9tdWx0c1szMl0gPSB7CiAJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCiAJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC0xOTYsNyArMTk2LDcgQEAKIAktMSwgIC8qIDExMTEgLT4gUkVTRVJWRUQgKDEyLjB4KSAqLwogfTsKIAotc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIGV6cmF0X2VibGNyWzMyXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX19jcHVpbml0ZGF0YSBlenJhdF9lYmxjclszMl0gPSB7CiAJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCiAJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC0yMzUsNyArMjM1LDcgQEAKIC8qCiAgKiBWSUEgQzMgTmVoZW1pYWggKi8KIAotc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9tdWx0c1szMl0gPSB7CitzdGF0aWMgY29uc3QgaW50IF9fY3B1aW5pdGRhdGEgbmVoZW1pYWhfbXVsdHNbMzJdID0gewogCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLwogCS0xLCAvKiAwMDAxIC0+IDE2LjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC0yNzAsNyArMjcwLDcgQEAKIAktMSwgLyogMTExMSAtPiAxMi4weCAqLwogfTsKIAotc3RhdGljIGNvbnN0IGludCBfX2luaXRkYXRhIG5laGVtaWFoX2VibGNyWzMyXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX19jcHVpbml0ZGF0YSBuZWhlbWlhaF9lYmxjclszMl0gPSB7CiAJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCiAJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCiAJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCkBAIC0zMTUsNyArMzE1LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBwb3M7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1WX3BvcyBfX2luaXRkYXRhIHZybTg1X21WWzMyXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbVZfcG9zIF9fY3B1aW5pdGRhdGEgdnJtODVfbVZbMzJdID0gewogCXsxMjUwLCA4fSwJezEyMDAsIDZ9LAl7MTE1MCwgNH0sCXsxMTAwLCAyfSwKIAl7MTA1MCwgMH0sCXsxODAwLCAzMH0sCXsxNzUwLCAyOH0sCXsxNzAwLCAyNn0sCiAJezE2NTAsIDI0fSwJezE2MDAsIDIyfSwJezE1NTAsIDIwfSwJezE1MDAsIDE4fSwKQEAgLTMyNiwxNCArMzI2LDE0IEBACiAJezE0NzUsIDE3fSwJezE0MjUsIDE1fSwJezEzNzUsIDEzfSwJezEzMjUsIDExfQogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX19pbml0ZGF0YSBtVl92cm04NVszMl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfX2NwdWluaXRkYXRhIG1WX3ZybTg1WzMyXSA9IHsKIAkweDA0LAkweDE0LAkweDAzLAkweDEzLAkweDAyLAkweDEyLAkweDAxLAkweDExLAogCTB4MDAsCTB4MTAsCTB4MGYsCTB4MWYsCTB4MGUsCTB4MWUsCTB4MGQsCTB4MWQsCiAJMHgwYywJMHgxYywJMHgwYiwJMHgxYiwJMHgwYSwJMHgxYSwJMHgwOSwJMHgxOSwKIAkweDA4LAkweDE4LAkweDA3LAkweDE3LAkweDA2LAkweDE2LAkweDA1LAkweDE1CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1WX3BvcyBfX2luaXRkYXRhIG1vYmlsZXZybV9tVlszMl0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1WX3BvcyBfX2NwdWluaXRkYXRhIG1vYmlsZXZybV9tVlszMl0gPSB7CiAJezE3NTAsIDMxfSwJezE3MDAsIDMwfSwJezE2NTAsIDI5fSwJezE2MDAsIDI4fSwKIAl7MTU1MCwgMjd9LAl7MTUwMCwgMjZ9LAl7MTQ1MCwgMjV9LAl7MTQwMCwgMjR9LAogCXsxMzUwLCAyM30sCXsxMzAwLCAyMn0sCXsxMjUwLCAyMX0sCXsxMjAwLCAyMH0sCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAl7Njc1LCAzfSwJezY1MCwgMn0sCXs2MjUsIDF9LAl7NjAwLCAwfQogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX19pbml0ZGF0YSBtVl9tb2JpbGV2cm1bMzJdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX19jcHVpbml0ZGF0YSBtVl9tb2JpbGV2cm1bMzJdID0gewogCTB4MWYsCTB4MWUsCTB4MWQsCTB4MWMsCTB4MWIsCTB4MWEsCTB4MTksCTB4MTgsCiAJMHgxNywJMHgxNiwJMHgxNSwJMHgxNCwJMHgxMywJMHgxMiwJMHgxMSwJMHgxMCwKIAkweDBmLAkweDBlLAkweDBkLAkweDBjLAkweDBiLAkweDBhLAkweDA5LAkweDA4LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdydW4uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMKaW5kZXggZTdiNTU5ZC4uZmMwOWYxNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdydW4uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ3J1bi5jCkBAIC0xNjUsOCArMTY1LDggQEAKICAqIFRNVEEgcnVsZXM6CiAgKiBwZXJmb3JtYW5jZV9wY3RnID0gKHRhcmdldF9mcmVxIC0gbG93X2ZyZXEpLyhoaWdoX2ZyZXEgLSBsb3dfZnJlcSkKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgbG9uZ3J1bl9kZXRlcm1pbmVfZnJlcXModW5zaWduZWQgaW50ICpsb3dfZnJlcSwKLQkJCQkJCSAgIHVuc2lnbmVkIGludCAqaGlnaF9mcmVxKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2NwdWluaXQgbG9uZ3J1bl9kZXRlcm1pbmVfZnJlcXModW5zaWduZWQgaW50ICpsb3dfZnJlcSwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCAqaGlnaF9mcmVxKQogewogCXUzMiBtc3JfbG8sIG1zcl9oaTsKIAl1MzIgc2F2ZV9sbywgc2F2ZV9oaTsKQEAgLTI1OCw3ICsyNTgsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19pbml0IGxvbmdydW5fY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBsb25ncnVuX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCWludCByZXN1bHQgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCmluZGV4IDdiOGE4YmEuLmJkMWNhYzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCkBAIC0xNzgsMTMgKzE3OCw4IEBACiAJCX0KIAl9CiAKLQlpZiAoYy0+eDg2ICE9IDB4RikgewotCQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIENQVS4gIgotCQkJCSJQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gIgotCQkJCSI8Y3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmc+XG4iKTsKKwlpZiAoYy0+eDg2ICE9IDB4RikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogb24gUC00cywgdGhlIFRTQyBydW5zIHdpdGggY29uc3RhbnQgZnJlcXVlbmN5IGluZGVwZW5kZW50IHdoZXRoZXIKIAkgKiB0aHJvdHRsaW5nIGlzIGFjdGl2ZSBvciBub3QuICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCmluZGV4IDlhOTcxMTYuLjRhNDVmZDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC01NjksNyArNTY5LDcgQEAKICAqIFdlIHdpbGwgdGhlbiBnZXQgdGhlIHNhbWUga2luZCBvZiBiZWhhdmlvdXIgYWxyZWFkeSB0ZXN0ZWQgdW5kZXIKICAqIHRoZSAid2VsbC1rbm93biIgb3RoZXIgT1MuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGZpeHVwX3NndGModm9pZCkKK3N0YXRpYyBpbnQgX19jcHVpbml0IGZpeHVwX3NndGModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgc2d0YzsKIAl1bnNpZ25lZCBpbnQgbTsKQEAgLTYwMyw3ICs2MDMsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19pbml0IGFjZXJfY3B1ZnJlcV9wc3QoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBhY2VyX2NwdWZyZXFfcHN0KGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewogCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCiAJCSIlcyBsYXB0b3Agd2l0aCBicm9rZW4gUFNUIHRhYmxlcyBpbiBCSU9TIGRldGVjdGVkLlxuIiwKQEAgLTYyMSw3ICs2MjEsNyBAQAogICogQSBCSU9TIHVwZGF0ZSBpcyBhbGwgdGhhdCBjYW4gc2F2ZSB0aGVtLgogICogTWVudGlvbiB0aGlzLCBhbmQgZGlzYWJsZSBjcHVmcmVxLgogICovCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBwb3dlcm5vd19kbWlfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2NwdWluaXRkYXRhIHBvd2Vybm93X2RtaV90YWJsZVtdID0gewogCXsKIAkJLmNhbGxiYWNrID0gYWNlcl9jcHVmcmVxX3BzdCwKIAkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIiwKQEAgLTYzMyw3ICs2MzMsNyBAQAogCXsgfQogfTsKIAotc3RhdGljIGludCBfX2luaXQgcG93ZXJub3dfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBwb3dlcm5vd19jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAl1bmlvbiBtc3JfZmlkdmlkc3RhdHVzIGZpZHZpZHN0YXR1czsKIAlpbnQgcmVzdWx0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwppbmRleCAzZTkwY2NlLi40OTE5NzdiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtOSw3ICs5LDcgQEAKICAqICBCYXNlZCBvbiB0aGUgcG93ZXJub3ctazcuYyBtb2R1bGUgd3JpdHRlbiBieSBEYXZlIEpvbmVzLgogICogIChDKSAyMDAzIERhdmUgSm9uZXMgb24gYmVoYWxmIG9mIFN1U0UgTGFicwogICogIChDKSAyMDA0IERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KLSAqICAoQykgMjAwNCBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKiAgKEMpIDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgogICogIEJhc2VkIHVwb24gZGF0YXNoZWV0cyAmIHNhbXBsZSBDUFVzIGtpbmRseSBwcm92aWRlZCBieSBBTUQuCiAgKgpAQCAtODA2LDYgKzgwNiw4IEBACiAJICogd3d3LmFtZC5jb20KIAkgKi8KIAlwcmludGsoS0VSTl9FUlIgRldfQlVHIFBGWCAiTm8gUFNCIG9yIEFDUEkgX1BTUyBvYmplY3RzXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJNYWtlIHN1cmUgdGhhdCB5b3VyIEJJT1MgaXMgdXAgdG8gZGF0ZSIKKwkJIiBhbmQgQ29vbCdOJ1F1aWV0IHN1cHBvcnQgaXMgZW5hYmxlZCBpbiBCSU9TIHNldHVwXG4iKTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtOTEwLDggKzkxMiw4IEBACiB7CiAJaW50IGk7CiAJdTMyIGhpID0gMCwgbG8gPSAwOwotCXJkbXNyKE1TUl9QU1RBVEVfQ1VSX0xJTUlULCBoaSwgbG8pOwotCWRhdGEtPm1heF9od19wc3RhdGUgPSAoaGkgJiBIV19QU1RBVEVfTUFYX01BU0spID4+IEhXX1BTVEFURV9NQVhfU0hJRlQ7CisJcmRtc3IoTVNSX1BTVEFURV9DVVJfTElNSVQsIGxvLCBoaSk7CisJZGF0YS0+bWF4X2h3X3BzdGF0ZSA9IChsbyAmIEhXX1BTVEFURV9NQVhfTUFTSykgPj4gSFdfUFNUQVRFX01BWF9TSElGVDsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykgewogCQl1MzIgaW5kZXg7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2h5cGVydmlzb3IuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCmluZGV4IGRkNTMxY2MuLjgwOTVmODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCkBAIC0zNCw2ICszNCw5IEBACiB7CiAJJng4Nl9oeXBlcl92bXdhcmUsCiAJJng4Nl9oeXBlcl9tc19oeXBlcnYsCisjaWZkZWYgQ09ORklHX1hFTl9QVkhWTQorCSZ4ODZfaHlwZXJfeGVuX2h2bSwKKyNlbmRpZgogfTsKIAogY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2ICp4ODZfaHlwZXI7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwppbmRleCAzM2VhZTIwLi44OThjMmY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKQEAgLTM0Nyw4ICszNDcsOCBAQAogCXJldHVybiBsMzsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0Ci1hbWRfY2hlY2tfbDNfZGlzYWJsZShpbnQgaW5kZXgsIHN0cnVjdCBfY3B1aWQ0X2luZm9fcmVncyAqdGhpc19sZWFmKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGFtZF9jaGVja19sM19kaXNhYmxlKHN0cnVjdCBfY3B1aWQ0X2luZm9fcmVncyAqdGhpc19sZWFmLAorCQkJCQkgICBpbnQgaW5kZXgpCiB7CiAJaW50IG5vZGU7CiAKQEAgLTM5NiwyMCArMzk2LDM5IEBACiAJdGhpc19sZWFmLT5sMyA9IGwzX2NhY2hlc1tub2RlXTsKIH0KIAorLyoKKyAqIGNoZWNrIHdoZXRoZXIgYSBzbG90IHVzZWQgZm9yIGRpc2FibGluZyBhbiBMMyBpbmRleCBpcyBvY2N1cGllZC4KKyAqIEBsMzogTDMgY2FjaGUgZGVzY3JpcHRvcgorICogQHNsb3Q6IHNsb3QgbnVtYmVyICgwLi4xKQorICoKKyAqIEByZXR1cm5zOiB0aGUgZGlzYWJsZWQgaW5kZXggaWYgdXNlZCBvciBuZWdhdGl2ZSB2YWx1ZSBpZiBzbG90IGZyZWUuCisgKi8KK2ludCBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdChzdHJ1Y3QgYW1kX2wzX2NhY2hlICpsMywgdW5zaWduZWQgc2xvdCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gMDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChsMy0+ZGV2LCAweDFCQyArIHNsb3QgKiA0LCAmcmVnKTsKKworCS8qIGNoZWNrIHdoZXRoZXIgdGhpcyBzbG90IGlzIGFjdGl2YXRlZCBhbHJlYWR5ICovCisJaWYgKHJlZyAmICgzVUwgPDwgMzApKQorCQlyZXR1cm4gcmVnICYgMHhmZmY7CisKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKIAkJCQkgIHVuc2lnbmVkIGludCBzbG90KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0aGlzX2xlYWYtPmwzLT5kZXY7Ci0JdW5zaWduZWQgaW50IHJlZyA9IDA7CisJaW50IGluZGV4OwogCiAJaWYgKCF0aGlzX2xlYWYtPmwzIHx8ICF0aGlzX2xlYWYtPmwzLT5jYW5fZGlzYWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FSU5WQUw7CisJaW5kZXggPSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdCh0aGlzX2xlYWYtPmwzLCBzbG90KTsKKwlpZiAoaW5kZXggPj0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZGV4KTsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4MUJDICsgc2xvdCAqIDQsICZyZWcpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgcmVnKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICJGUkVFXG4iKTsKIH0KIAogI2RlZmluZSBTSE9XX0NBQ0hFX0RJU0FCTEUoc2xvdCkJCQkJCVwKQEAgLTQ1MSwzNyArNDcwLDc0IEBACiAJfQogfQogCi0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2NhY2hlX2Rpc2FibGUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLAotCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCSAgIHVuc2lnbmVkIGludCBzbG90KQorLyoKKyAqIGRpc2FibGUgYSBMMyBjYWNoZSBpbmRleCBieSB1c2luZyBhIGRpc2FibGUtc2xvdAorICoKKyAqIEBsMzogICAgTDMgY2FjaGUgZGVzY3JpcHRvcgorICogQGNwdTogICBBIENQVSBvbiB0aGUgbm9kZSBjb250YWluaW5nIHRoZSBMMyBjYWNoZQorICogQHNsb3Q6ICBzbG90IG51bWJlciAoMC4uMSkKKyAqIEBpbmRleDogaW5kZXggdG8gZGlzYWJsZQorICoKKyAqIEByZXR1cm46IDAgb24gc3VjY2VzcywgZXJyb3Igc3RhdHVzIG9uIGZhaWx1cmUKKyAqLworaW50IGFtZF9zZXRfbDNfZGlzYWJsZV9zbG90KHN0cnVjdCBhbWRfbDNfY2FjaGUgKmwzLCBpbnQgY3B1LCB1bnNpZ25lZCBzbG90LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IHRoaXNfbGVhZi0+bDMtPmRldjsKLQlpbnQgY3B1ID0gY3B1bWFza19maXJzdCh0b19jcHVtYXNrKHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApKTsKLQl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisJaW50IHJldCA9IDA7CiAKICNkZWZpbmUgU1VCQ0FDSEVfTUFTSwkoM1VMIDw8IDIwKQogI2RlZmluZSBTVUJDQUNIRV9JTkRFWAkweGZmZgogCi0JaWYgKCF0aGlzX2xlYWYtPmwzIHx8ICF0aGlzX2xlYWYtPmwzLT5jYW5fZGlzYWJsZSkKKwkvKgorCSAqIGNoZWNrIHdoZXRoZXIgdGhpcyBzbG90IGlzIGFscmVhZHkgdXNlZCBvcgorCSAqIHRoZSBpbmRleCBpcyBhbHJlYWR5IGRpc2FibGVkCisJICovCisJcmV0ID0gYW1kX2dldF9sM19kaXNhYmxlX3Nsb3QobDMsIHNsb3QpOworCWlmIChyZXQgPj0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIGNoZWNrIHdoZXRoZXIgdGhlIG90aGVyIHNsb3QgaGFzIGRpc2FibGVkIHRoZQorCSAqIHNhbWUgaW5kZXggYWxyZWFkeQorCSAqLworCWlmIChpbmRleCA9PSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdChsMywgIXNsb3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRvIG5vdCBhbGxvdyB3cml0ZXMgb3V0c2lkZSBvZiBhbGxvd2VkIGJpdHMgKi8KKwlpZiAoKGluZGV4ICYgfihTVUJDQUNIRV9NQVNLIHwgU1VCQ0FDSEVfSU5ERVgpKSB8fAorCSAgICAoKGluZGV4ICYgU1VCQ0FDSEVfSU5ERVgpID4gbDMtPmluZGljZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFtZF9sM19kaXNhYmxlX2luZGV4KGwzLCBjcHUsIHNsb3QsIGluZGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jYWNoZV9kaXNhYmxlKHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZiwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgdW5zaWduZWQgaW50IHNsb3QpCit7CisJdW5zaWduZWQgbG9uZyB2YWwgPSAwOworCWludCBjcHUsIGVyciA9IDA7CisKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIWRldikKKwlpZiAoIXRoaXNfbGVhZi0+bDMgfHwgIXRoaXNfbGVhZi0+bDMtPmNhbl9kaXNhYmxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWNwdSA9IGNwdW1hc2tfZmlyc3QodG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CisKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGRvIG5vdCBhbGxvdyB3cml0ZXMgb3V0c2lkZSBvZiBhbGxvd2VkIGJpdHMgKi8KLQlpZiAoKHZhbCAmIH4oU1VCQ0FDSEVfTUFTSyB8IFNVQkNBQ0hFX0lOREVYKSkgfHwKLQkgICAgKCh2YWwgJiBTVUJDQUNIRV9JTkRFWCkgPiB0aGlzX2xlYWYtPmwzLT5pbmRpY2VzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhbWRfbDNfZGlzYWJsZV9pbmRleCh0aGlzX2xlYWYtPmwzLCBjcHUsIHNsb3QsIHZhbCk7Ci0KKwllcnIgPSBhbWRfc2V0X2wzX2Rpc2FibGVfc2xvdCh0aGlzX2xlYWYtPmwzLCBjcHUsIHNsb3QsIHZhbCk7CisJaWYgKGVycikgeworCQlpZiAoZXJyID09IC1FRVhJU1QpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJMMyBkaXNhYmxlIHNsb3QgJWQgaW4gdXNlIVxuIiwKKwkJCQkJICAgIHNsb3QpOworCQlyZXR1cm4gZXJyOworCX0KIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTUwMiw3ICs1NTgsNyBAQAogCiAjZWxzZQkvKiBDT05GSUdfQ1BVX1NVUF9BTUQgKi8KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdAotYW1kX2NoZWNrX2wzX2Rpc2FibGUoaW50IGluZGV4LCBzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgKnRoaXNfbGVhZikKK2FtZF9jaGVja19sM19kaXNhYmxlKHN0cnVjdCBfY3B1aWQ0X2luZm9fcmVncyAqdGhpc19sZWFmLCBpbnQgaW5kZXgpCiB7CiB9OwogI2VuZGlmIC8qIENPTkZJR19DUFVfU1VQX0FNRCAqLwpAQCAtNTE4LDcgKzU3NCw3IEBACiAKIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKSB7CiAJCWFtZF9jcHVpZDQoaW5kZXgsICZlYXgsICZlYngsICZlY3gpOwotCQlhbWRfY2hlY2tfbDNfZGlzYWJsZShpbmRleCwgdGhpc19sZWFmKTsKKwkJYW1kX2NoZWNrX2wzX2Rpc2FibGUodGhpc19sZWFmLCBpbmRleCk7CiAJfSBlbHNlIHsKIAkJY3B1aWRfY291bnQoNCwgaW5kZXgsICZlYXguZnVsbCwgJmVieC5mdWxsLCAmZWN4LmZ1bGwsICZlZHgpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKaW5kZXggMThjYzQyNS4uZTEyNjlkNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKQEAgLTUxLDcgKzUxLDcgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgobWNlX3JlYWRfbXV0ZXgpOwogCiAjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZV9jaGVja19tY2UocCkgXAotCXJjdV9kZXJlZmVyZW5jZV9jaGVjaygocCksIFwKKwlyY3VfZGVyZWZlcmVuY2VfaW5kZXhfY2hlY2soKHApLCBcCiAJCQkgICAgICByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQoKSB8fCBcCiAJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJm1jZV9yZWFkX211dGV4KSkKIApAQCAtNjAwLDYgKzYwMCw3IEBACiAJCSAqLwogCQlpZiAoIShmbGFncyAmIE1DUF9ET05UTE9HKSAmJiAhbWNlX2RvbnRfbG9nX2NlKSB7CiAJCQltY2VfbG9nKCZtKTsKKwkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsICZtKTsKIAkJCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwppbmRleCBlMWEwYTNiLi5jMmE4YjI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKQEAgLTM0LDE1ICszNCwyNSBAQAogLyogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIHJlcG9ydGluZyB0aGVybWFsIGV2ZW50cyAqLwogI2RlZmluZSBDSEVDS19JTlRFUlZBTAkJKDMwMCAqIEhaKQogCi0vKgotICogQ3VycmVudCB0aGVybWFsIHRocm90dGxpbmcgc3RhdGU6Ci0gKi8KLXN0cnVjdCB0aGVybWFsX3N0YXRlIHsKLQlib29sCQkJaXNfdGhyb3R0bGVkOworI2RlZmluZSBUSEVSTUFMX1RIUk9UVExJTkdfRVZFTlQJMAorI2RlZmluZSBQT1dFUl9MSU1JVF9FVkVOVAkJMQogCisvKgorICogQ3VycmVudCB0aGVybWFsIGV2ZW50IHN0YXRlOgorICovCitzdHJ1Y3QgX3RoZXJtYWxfc3RhdGUgeworCWJvb2wJCQluZXdfZXZlbnQ7CisJaW50CQkJZXZlbnQ7CiAJdTY0CQkJbmV4dF9jaGVjazsKLQl1bnNpZ25lZCBsb25nCQl0aHJvdHRsZV9jb3VudDsKLQl1bnNpZ25lZCBsb25nCQlsYXN0X3Rocm90dGxlX2NvdW50OworCXVuc2lnbmVkIGxvbmcJCWNvdW50OworCXVuc2lnbmVkIGxvbmcJCWxhc3RfY291bnQ7Cit9OworCitzdHJ1Y3QgdGhlcm1hbF9zdGF0ZSB7CisJc3RydWN0IF90aGVybWFsX3N0YXRlIGNvcmVfdGhyb3R0bGU7CisJc3RydWN0IF90aGVybWFsX3N0YXRlIGNvcmVfcG93ZXJfbGltaXQ7CisJc3RydWN0IF90aGVybWFsX3N0YXRlIHBhY2thZ2VfdGhyb3R0bGU7CisJc3RydWN0IF90aGVybWFsX3N0YXRlIHBhY2thZ2VfcG93ZXJfbGltaXQ7CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRoZXJtYWxfc3RhdGUsIHRoZXJtYWxfc3RhdGUpOwpAQCAtNTMsMTEgKzYzLDEzIEBACiAKICNpZmRlZiBDT05GSUdfU1lTRlMKICNkZWZpbmUgZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8oX25hbWUpCQkJCVwKLQlzdGF0aWMgU1lTREVWX0FUVFIoX25hbWUsIDA0NDQsIHRoZXJtX3Rocm90X3N5c2Rldl9zaG93XyMjX25hbWUsIE5VTEwpCisJc3RhdGljIFNZU0RFVl9BVFRSKF9uYW1lLCAwNDQ0LAkJCQkJXAorCQkJICAgdGhlcm1fdGhyb3Rfc3lzZGV2X3Nob3dfIyNfbmFtZSwJCVwKKwkJCQkgICBOVUxMKQkJCQlcCiAKLSNkZWZpbmUgZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmMobmFtZSkJCQlcCisjZGVmaW5lIGRlZmluZV90aGVybV90aHJvdF9zeXNkZXZfc2hvd19mdW5jKGV2ZW50LCBuYW1lKQkJXAogCQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3QgdGhlcm1fdGhyb3Rfc3lzZGV2X3Nob3dfIyNuYW1lKAkJCQlcCitzdGF0aWMgc3NpemVfdCB0aGVybV90aHJvdF9zeXNkZXZfc2hvd18jI2V2ZW50IyNfIyNuYW1lKAkJXAogCQkJc3RydWN0IHN5c19kZXZpY2UgKmRldiwJCQkJXAogCQkJc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCQkJXAogCQkJY2hhciAqYnVmKQkJCQkJXApAQCAtNjYsMzAgKzc4LDQyIEBACiAJc3NpemVfdCByZXQ7CQkJCQkJCVwKIAkJCQkJCQkJCVwKIAlwcmVlbXB0X2Rpc2FibGUoKTsJLyogQ1BVIGhvdHBsdWcgKi8JCQlcCi0JaWYgKGNwdV9vbmxpbmUoY3B1KSkJCQkJCQlcCisJaWYgKGNwdV9vbmxpbmUoY3B1KSkgewkJCQkJCVwKIAkJcmV0ID0gc3ByaW50ZihidWYsICIlbHVcbiIsCQkJCVwKLQkJCSAgICAgIHBlcl9jcHUodGhlcm1hbF9zdGF0ZSwgY3B1KS5uYW1lKTsJXAotCWVsc2UJCQkJCQkJCVwKKwkJCSAgICAgIHBlcl9jcHUodGhlcm1hbF9zdGF0ZSwgY3B1KS5ldmVudC5uYW1lKTsJXAorCX0gZWxzZQkJCQkJCQkJXAogCQlyZXQgPSAwOwkJCQkJCVwKIAlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJCVwKIAkJCQkJCQkJCVwKIAlyZXR1cm4gcmV0OwkJCQkJCQlcCiB9CiAKLWRlZmluZV90aGVybV90aHJvdF9zeXNkZXZfc2hvd19mdW5jKHRocm90dGxlX2NvdW50KTsKLWRlZmluZV90aGVybV90aHJvdF9zeXNkZXZfb25lX3JvKHRocm90dGxlX2NvdW50KTsKK2RlZmluZV90aGVybV90aHJvdF9zeXNkZXZfc2hvd19mdW5jKGNvcmVfdGhyb3R0bGUsIGNvdW50KTsKK2RlZmluZV90aGVybV90aHJvdF9zeXNkZXZfb25lX3JvKGNvcmVfdGhyb3R0bGVfY291bnQpOworCitkZWZpbmVfdGhlcm1fdGhyb3Rfc3lzZGV2X3Nob3dfZnVuYyhjb3JlX3Bvd2VyX2xpbWl0LCBjb3VudCk7CitkZWZpbmVfdGhlcm1fdGhyb3Rfc3lzZGV2X29uZV9ybyhjb3JlX3Bvd2VyX2xpbWl0X2NvdW50KTsKKworZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmMocGFja2FnZV90aHJvdHRsZSwgY291bnQpOworZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8ocGFja2FnZV90aHJvdHRsZV9jb3VudCk7CisKK2RlZmluZV90aGVybV90aHJvdF9zeXNkZXZfc2hvd19mdW5jKHBhY2thZ2VfcG93ZXJfbGltaXQsIGNvdW50KTsKK2RlZmluZV90aGVybV90aHJvdF9zeXNkZXZfb25lX3JvKHBhY2thZ2VfcG93ZXJfbGltaXRfY291bnQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdGhlcm1hbF90aHJvdHRsZV9hdHRyc1tdID0gewotCSZhdHRyX3Rocm90dGxlX2NvdW50LmF0dHIsCisJJmF0dHJfY29yZV90aHJvdHRsZV9jb3VudC5hdHRyLAogCU5VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRoZXJtYWxfdGhyb3R0bGVfYXR0cl9ncm91cCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRoZXJtYWxfYXR0cl9ncm91cCA9IHsKIAkuYXR0cnMJPSB0aGVybWFsX3Rocm90dGxlX2F0dHJzLAogCS5uYW1lCT0gInRoZXJtYWxfdGhyb3R0bGUiCiB9OwogI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCisjZGVmaW5lIENPUkVfTEVWRUwJMAorI2RlZmluZSBQQUNLQUdFX0xFVkVMCTEKKwogLyoqKgogICogdGhlcm1fdGhyb3RfcHJvY2VzcyAtIFByb2Nlc3MgdGhlcm1hbCB0aHJvdHRsaW5nIGV2ZW50IGZyb20gaW50ZXJydXB0CiAgKiBAY3VycjogV2hldGhlciB0aGUgY29uZGl0aW9uIGlzIGN1cnJlbnQgb3Igbm90IChib29sZWFuKSwgc2luY2UgdGhlCkBAIC0xMDYsMzkgKzEzMCw3MCBAQAogICogICAgICAgICAgMSA6IEV2ZW50IHNob3VsZCBiZSBsb2dnZWQgZnVydGhlciwgYW5kIGEgbWVzc2FnZSBoYXMgYmVlbgogICogICAgICAgICAgICAgIHByaW50ZWQgdG8gdGhlIHN5c2xvZy4KICAqLwotc3RhdGljIGludCB0aGVybV90aHJvdF9wcm9jZXNzKGJvb2wgaXNfdGhyb3R0bGVkKQorc3RhdGljIGludCB0aGVybV90aHJvdF9wcm9jZXNzKGJvb2wgbmV3X2V2ZW50LCBpbnQgZXZlbnQsIGludCBsZXZlbCkKIHsKLQlzdHJ1Y3QgdGhlcm1hbF9zdGF0ZSAqc3RhdGU7Ci0JdW5zaWduZWQgaW50IHRoaXNfY3B1OwotCWJvb2wgd2FzX3Rocm90dGxlZDsKKwlzdHJ1Y3QgX3RoZXJtYWxfc3RhdGUgKnN0YXRlOworCXVuc2lnbmVkIGludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlib29sIG9sZF9ldmVudDsKIAl1NjQgbm93OworCXN0cnVjdCB0aGVybWFsX3N0YXRlICpwc3RhdGUgPSAmcGVyX2NwdSh0aGVybWFsX3N0YXRlLCB0aGlzX2NwdSk7CiAKLQl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlub3cgPSBnZXRfamlmZmllc182NCgpOwotCXN0YXRlID0gJnBlcl9jcHUodGhlcm1hbF9zdGF0ZSwgdGhpc19jcHUpOworCWlmIChsZXZlbCA9PSBDT1JFX0xFVkVMKSB7CisJCWlmIChldmVudCA9PSBUSEVSTUFMX1RIUk9UVExJTkdfRVZFTlQpCisJCQlzdGF0ZSA9ICZwc3RhdGUtPmNvcmVfdGhyb3R0bGU7CisJCWVsc2UgaWYgKGV2ZW50ID09IFBPV0VSX0xJTUlUX0VWRU5UKQorCQkJc3RhdGUgPSAmcHN0YXRlLT5jb3JlX3Bvd2VyX2xpbWl0OworCQllbHNlCisJCQkgcmV0dXJuIDA7CisJfSBlbHNlIGlmIChsZXZlbCA9PSBQQUNLQUdFX0xFVkVMKSB7CisJCWlmIChldmVudCA9PSBUSEVSTUFMX1RIUk9UVExJTkdfRVZFTlQpCisJCQlzdGF0ZSA9ICZwc3RhdGUtPnBhY2thZ2VfdGhyb3R0bGU7CisJCWVsc2UgaWYgKGV2ZW50ID09IFBPV0VSX0xJTUlUX0VWRU5UKQorCQkJc3RhdGUgPSAmcHN0YXRlLT5wYWNrYWdlX3Bvd2VyX2xpbWl0OworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CiAKLQl3YXNfdGhyb3R0bGVkID0gc3RhdGUtPmlzX3Rocm90dGxlZDsKLQlzdGF0ZS0+aXNfdGhyb3R0bGVkID0gaXNfdGhyb3R0bGVkOworCW9sZF9ldmVudCA9IHN0YXRlLT5uZXdfZXZlbnQ7CisJc3RhdGUtPm5ld19ldmVudCA9IG5ld19ldmVudDsKIAotCWlmIChpc190aHJvdHRsZWQpCi0JCXN0YXRlLT50aHJvdHRsZV9jb3VudCsrOworCWlmIChuZXdfZXZlbnQpCisJCXN0YXRlLT5jb3VudCsrOwogCiAJaWYgKHRpbWVfYmVmb3JlNjQobm93LCBzdGF0ZS0+bmV4dF9jaGVjaykgJiYKLQkJCXN0YXRlLT50aHJvdHRsZV9jb3VudCAhPSBzdGF0ZS0+bGFzdF90aHJvdHRsZV9jb3VudCkKKwkJCXN0YXRlLT5jb3VudCAhPSBzdGF0ZS0+bGFzdF9jb3VudCkKIAkJcmV0dXJuIDA7CiAKIAlzdGF0ZS0+bmV4dF9jaGVjayA9IG5vdyArIENIRUNLX0lOVEVSVkFMOwotCXN0YXRlLT5sYXN0X3Rocm90dGxlX2NvdW50ID0gc3RhdGUtPnRocm90dGxlX2NvdW50OworCXN0YXRlLT5sYXN0X2NvdW50ID0gc3RhdGUtPmNvdW50OwogCiAJLyogaWYgd2UganVzdCBlbnRlcmVkIHRoZSB0aGVybWFsIGV2ZW50ICovCi0JaWYgKGlzX3Rocm90dGxlZCkgewotCQlwcmludGsoS0VSTl9DUklUICJDUFUlZDogVGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkLCBjcHUgY2xvY2sgdGhyb3R0bGVkICh0b3RhbCBldmVudHMgPSAlbHUpXG4iLCB0aGlzX2NwdSwgc3RhdGUtPnRocm90dGxlX2NvdW50KTsKKwlpZiAobmV3X2V2ZW50KSB7CisJCWlmIChldmVudCA9PSBUSEVSTUFMX1RIUk9UVExJTkdfRVZFTlQpCisJCQlwcmludGsoS0VSTl9DUklUICJDUFUlZDogJXMgdGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkLCBjcHUgY2xvY2sgdGhyb3R0bGVkICh0b3RhbCBldmVudHMgPSAlbHUpXG4iLAorCQkJCXRoaXNfY3B1LAorCQkJCWxldmVsID09IENPUkVfTEVWRUwgPyAiQ29yZSIgOiAiUGFja2FnZSIsCisJCQkJc3RhdGUtPmNvdW50KTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJWQ6ICVzIHBvd2VyIGxpbWl0IG5vdGlmaWNhdGlvbiAodG90YWwgZXZlbnRzID0gJWx1KVxuIiwKKwkJCQl0aGlzX2NwdSwKKwkJCQlsZXZlbCA9PSBDT1JFX0xFVkVMID8gIkNvcmUiIDogIlBhY2thZ2UiLAorCQkJCXN0YXRlLT5jb3VudCk7CiAKIAkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOwogCQlyZXR1cm4gMTsKIAl9Ci0JaWYgKHdhc190aHJvdHRsZWQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVJWQ6IFRlbXBlcmF0dXJlL3NwZWVkIG5vcm1hbFxuIiwgdGhpc19jcHUpOworCWlmIChvbGRfZXZlbnQpIHsKKwkJaWYgKGV2ZW50ID09IFRIRVJNQUxfVEhST1RUTElOR19FVkVOVCkKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVSVkOiAlcyB0ZW1wZXJhdHVyZS9zcGVlZCBub3JtYWxcbiIsCisJCQkJdGhpc19jcHUsCisJCQkJbGV2ZWwgPT0gQ09SRV9MRVZFTCA/ICJDb3JlIiA6ICJQYWNrYWdlIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVSVkOiAlcyBwb3dlciBsaW1pdCBub3JtYWxcbiIsCisJCQkJdGhpc19jcHUsCisJCQkJbGV2ZWwgPT0gQ09SRV9MRVZFTCA/ICJDb3JlIiA6ICJQYWNrYWdlIik7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMTQ5LDEzICsyMDQsMzIgQEAKIC8qIEFkZC9SZW1vdmUgdGhlcm1hbF90aHJvdHRsZSBpbnRlcmZhY2UgZm9yIENQVSBkZXZpY2U6ICovCiBzdGF0aWMgX19jcHVpbml0IGludCB0aGVybWFsX3Rocm90dGxlX2FkZF9kZXYoc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXYpCiB7Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwKLQkJCQkgICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOworCWludCBlcnI7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX2F0dHJfZ3JvdXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTE4pKQorCQllcnIgPSBzeXNmc19hZGRfZmlsZV90b19ncm91cCgmc3lzX2Rldi0+a29iaiwKKwkJCQkJICAgICAgJmF0dHJfY29yZV9wb3dlcl9saW1pdF9jb3VudC5hdHRyLAorCQkJCQkgICAgICB0aGVybWFsX2F0dHJfZ3JvdXAubmFtZSk7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUFRTKSkKKwkJZXJyID0gc3lzZnNfYWRkX2ZpbGVfdG9fZ3JvdXAoJnN5c19kZXYtPmtvYmosCisJCQkJCSAgICAgICZhdHRyX3BhY2thZ2VfdGhyb3R0bGVfY291bnQuYXR0ciwKKwkJCQkJICAgICAgdGhlcm1hbF9hdHRyX2dyb3VwLm5hbWUpOworCQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTE4pKQorCQkJZXJyID0gc3lzZnNfYWRkX2ZpbGVfdG9fZ3JvdXAoJnN5c19kZXYtPmtvYmosCisJCQkJCSZhdHRyX3BhY2thZ2VfcG93ZXJfbGltaXRfY291bnQuYXR0ciwKKwkJCQkJdGhlcm1hbF9hdHRyX2dyb3VwLm5hbWUpOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIF9fY3B1aW5pdCB2b2lkIHRoZXJtYWxfdGhyb3R0bGVfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKIHsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJnRoZXJtYWxfYXR0cl9ncm91cCk7CiB9CiAKIC8qIE11dGV4IHByb3RlY3RpbmcgZGV2aWNlIGNyZWF0aW9uIGFnYWluc3QgQ1BVIGhvdHBsdWc6ICovCkBAIC0yMjYsMTQgKzMwMCw1MCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovCiAKKy8qCisgKiBTZXQgdXAgdGhlIG1vc3QgdHdvIHNpZ25pZmljYW50IGJpdCB0byBub3RpZnkgbWNlIGxvZyB0aGF0IHRoaXMgdGhlcm1hbAorICogZXZlbnQgdHlwZS4KKyAqIFRoaXMgaXMgYSB0ZW1wIHNvbHV0aW9uLiBNYXkgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlIHdpdGggbWNlIGxvZworICogaW5mcmFzdHVyZS4KKyAqLworI2RlZmluZSBDT1JFX1RIUk9UVExFRAkJKDApCisjZGVmaW5lIENPUkVfUE9XRVJfTElNSVQJKChfX3U2NCkxIDw8IDYyKQorI2RlZmluZSBQQUNLQUdFX1RIUk9UVExFRAkoKF9fdTY0KTIgPDwgNjIpCisjZGVmaW5lIFBBQ0tBR0VfUE9XRVJfTElNSVQJKChfX3U2NCkzIDw8IDYyKQorCiAvKiBUaGVybWFsIHRyYW5zaXRpb24gaW50ZXJydXB0IGhhbmRsZXIgKi8KIHN0YXRpYyB2b2lkIGludGVsX3RoZXJtYWxfaW50ZXJydXB0KHZvaWQpCiB7CiAJX191NjQgbXNyX3ZhbDsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCXJkbXNybChNU1JfSUEzMl9USEVSTV9TVEFUVVMsIG1zcl92YWwpOwotCWlmICh0aGVybV90aHJvdF9wcm9jZXNzKChtc3JfdmFsICYgVEhFUk1fU1RBVFVTX1BST0NIT1QpICE9IDApKQotCQltY2VfbG9nX3RoZXJtX3Rocm90X2V2ZW50KG1zcl92YWwpOworCisJaWYgKHRoZXJtX3Rocm90X3Byb2Nlc3MobXNyX3ZhbCAmIFRIRVJNX1NUQVRVU19QUk9DSE9ULAorCQkJCVRIRVJNQUxfVEhST1RUTElOR19FVkVOVCwKKwkJCQlDT1JFX0xFVkVMKSAhPSAwKQorCQltY2VfbG9nX3RoZXJtX3Rocm90X2V2ZW50KENPUkVfVEhST1RUTEVEIHwgbXNyX3ZhbCk7CisKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTE4pKQorCQlpZiAodGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgVEhFUk1fU1RBVFVTX1BPV0VSX0xJTUlULAorCQkJCQlQT1dFUl9MSU1JVF9FVkVOVCwKKwkJCQkJQ09SRV9MRVZFTCkgIT0gMCkKKwkJCW1jZV9sb2dfdGhlcm1fdGhyb3RfZXZlbnQoQ09SRV9QT1dFUl9MSU1JVCB8IG1zcl92YWwpOworCisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUFRTKSkgeworCQlyZG1zcmwoTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMsIG1zcl92YWwpOworCQlpZiAodGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgUEFDS0FHRV9USEVSTV9TVEFUVVNfUFJPQ0hPVCwKKwkJCQkJVEhFUk1BTF9USFJPVFRMSU5HX0VWRU5ULAorCQkJCQlQQUNLQUdFX0xFVkVMKSAhPSAwKQorCQkJbWNlX2xvZ190aGVybV90aHJvdF9ldmVudChQQUNLQUdFX1RIUk9UVExFRCB8IG1zcl92YWwpOworCQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTE4pKQorCQkJaWYgKHRoZXJtX3Rocm90X3Byb2Nlc3MobXNyX3ZhbCAmCisJCQkJCVBBQ0tBR0VfVEhFUk1fU1RBVFVTX1BPV0VSX0xJTUlULAorCQkJCQlQT1dFUl9MSU1JVF9FVkVOVCwKKwkJCQkJUEFDS0FHRV9MRVZFTCkgIT0gMCkKKwkJCQltY2VfbG9nX3RoZXJtX3Rocm90X2V2ZW50KFBBQ0tBR0VfUE9XRVJfTElNSVQKKwkJCQkJCQkgIHwgbXNyX3ZhbCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB1bmV4cGVjdGVkX3RoZXJtYWxfaW50ZXJydXB0KHZvaWQpCkBAIC0zMzUsOCArNDQ1LDI2IEBACiAJYXBpY193cml0ZShBUElDX0xWVFRITVIsIGgpOwogCiAJcmRtc3IoTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBULCBsLCBoKTsKLQl3cm1zcihNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQsCi0JCWwgfCAoVEhFUk1fSU5UX0xPV19FTkFCTEUgfCBUSEVSTV9JTlRfSElHSF9FTkFCTEUpLCBoKTsKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTE4pKQorCQl3cm1zcihNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQsCisJCSAgICAgIGwgfCAoVEhFUk1fSU5UX0xPV19FTkFCTEUKKwkJCXwgVEhFUk1fSU5UX0hJR0hfRU5BQkxFIHwgVEhFUk1fSU5UX1BMTl9FTkFCTEUpLCBoKTsKKwllbHNlCisJCXdybXNyKE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVCwKKwkJICAgICAgbCB8IChUSEVSTV9JTlRfTE9XX0VOQUJMRSB8IFRIRVJNX0lOVF9ISUdIX0VOQUJMRSksIGgpOworCisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUFRTKSkgeworCQlyZG1zcihNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVCwgbCwgaCk7CisJCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BMTikpCisJCQl3cm1zcihNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVCwKKwkJCSAgICAgIGwgfCAoUEFDS0FHRV9USEVSTV9JTlRfTE9XX0VOQUJMRQorCQkJCXwgUEFDS0FHRV9USEVSTV9JTlRfSElHSF9FTkFCTEUKKwkJCQl8IFBBQ0tBR0VfVEhFUk1fSU5UX1BMTl9FTkFCTEUpLCBoKTsKKwkJZWxzZQorCQkJd3Jtc3IoTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9JTlRFUlJVUFQsCisJCQkgICAgICBsIHwgKFBBQ0tBR0VfVEhFUk1fSU5UX0xPV19FTkFCTEUKKwkJCQl8IFBBQ0tBR0VfVEhFUk1fSU5UX0hJR0hfRU5BQkxFKSwgaCk7CisJfQogCiAJc21wX3RoZXJtYWxfdmVjdG9yID0gaW50ZWxfdGhlcm1hbF9pbnRlcnJ1cHQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYwppbmRleCAxNmY0MWJiLi5kOTQ0YmY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL21zaHlwZXJ2Lmg+CiAKIHN0cnVjdCBtc19oeXBlcnZfaW5mbyBtc19oeXBlcnY7CitFWFBPUlRfU1lNQk9MX0dQTChtc19oeXBlcnYpOwogCiBzdGF0aWMgYm9vbCBfX2luaXQgbXNfaHlwZXJ2X3BsYXRmb3JtKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwppbmRleCBmZDMxYTQ0Li43ZDI4ZDdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKQEAgLTQzMywxMyArNDMzLDEyIEBACiB7CiAJdW5zaWduZWQgaW50IG1hc2tfbG8sIG1hc2tfaGksIGJhc2VfbG8sIGJhc2VfaGk7CiAJdW5zaWduZWQgaW50IHRtcCwgaGk7Ci0JaW50IGNwdTsKIAogCS8qCiAJICogZ2V0X210cnIgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSBtdHJyX3N0YXRlLCBhbHNvIGl0IGNvdWxkIGJlIGNhbGxlZAogCSAqIGZyb20gYW55IGNwdSwgc28gdHJ5IHRvIHByaW50IGl0IG91dCBkaXJlY3RseS4KIAkgKi8KLQljcHUgPSBnZXRfY3B1KCk7CisJZ2V0X2NwdSgpOwogCiAJcmRtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCBtYXNrX2xvLCBtYXNrX2hpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwppbmRleCA1ZGI1YjdkLi5mMmRhMjBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwpAQCAtMjIwLDYgKzIyMCw3IEBACiAJCQkJCQkgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqZXZlbnRfY29uc3RyYWludHM7CiAJdm9pZAkJKCpxdWlya3MpKHZvaWQpOworCWludAkJcGVyZmN0cl9zZWNvbmRfd3JpdGU7CiAKIAlpbnQJCSgqY3B1X3ByZXBhcmUpKGludCBjcHUpOwogCXZvaWQJCSgqY3B1X3N0YXJ0aW5nKShpbnQgY3B1KTsKQEAgLTI5NSwxMCArMjk2LDEwIEBACiAJICogY291bnQgdG8gdGhlIGdlbmVyaWMgZXZlbnQgYXRvbWljYWxseToKIAkgKi8KIGFnYWluOgotCXByZXZfcmF3X2NvdW50ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wcmV2X2NvdW50KTsKKwlwcmV2X3Jhd19jb3VudCA9IGxvY2FsNjRfcmVhZCgmaHdjLT5wcmV2X2NvdW50KTsKIAlyZG1zcmwoaHdjLT5ldmVudF9iYXNlICsgaWR4LCBuZXdfcmF3X2NvdW50KTsKIAotCWlmIChhdG9taWM2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAorCWlmIChsb2NhbDY0X2NtcHhjaGcoJmh3Yy0+cHJldl9jb3VudCwgcHJldl9yYXdfY291bnQsCiAJCQkJCW5ld19yYXdfY291bnQpICE9IHByZXZfcmF3X2NvdW50KQogCQlnb3RvIGFnYWluOwogCkBAIC0zMTMsOCArMzE0LDggQEAKIAlkZWx0YSA9IChuZXdfcmF3X2NvdW50IDw8IHNoaWZ0KSAtIChwcmV2X3Jhd19jb3VudCA8PCBzaGlmdCk7CiAJZGVsdGEgPj49IHNoaWZ0OwogCi0JYXRvbWljNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKLQlhdG9taWM2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKKwlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7CisJbG9jYWw2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKIAogCXJldHVybiBuZXdfcmF3X2NvdW50OwogfQpAQCAtNDM4LDcgKzQzOSw3IEBACiAJaWYgKCFod2MtPnNhbXBsZV9wZXJpb2QpIHsKIAkJaHdjLT5zYW1wbGVfcGVyaW9kID0geDg2X3BtdS5tYXhfcGVyaW9kOwogCQlod2MtPmxhc3RfcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVyaW9kOwotCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CisJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIElmIHdlIGhhdmUgYSBQTVUgaW5pdGlhbGl6ZWQgYnV0IG5vIEFQSUMKQEAgLTg4NSw3ICs4ODYsNyBAQAogeDg2X3BlcmZfZXZlbnRfc2V0X3BlcmlvZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0JczY0IGxlZnQgPSBhdG9taWM2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KTsKKwlzNjQgbGVmdCA9IGxvY2FsNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CiAJczY0IHBlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKIAlpbnQgcmV0ID0gMCwgaWR4ID0gaHdjLT5pZHg7CiAKQEAgLTg5NywxNCArODk4LDE0IEBACiAJICovCiAJaWYgKHVubGlrZWx5KGxlZnQgPD0gLXBlcmlvZCkpIHsKIAkJbGVmdCA9IHBlcmlvZDsKLQkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOwogCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOwogCQlyZXQgPSAxOwogCX0KIAogCWlmICh1bmxpa2VseShsZWZ0IDw9IDApKSB7CiAJCWxlZnQgKz0gcGVyaW9kOwotCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7CiAJCWh3Yy0+bGFzdF9wZXJpb2QgPSBwZXJpb2Q7CiAJCXJldCA9IDE7CiAJfQpAQCAtOTIzLDEwICs5MjQsMTkgQEAKIAkgKiBUaGUgaHcgZXZlbnQgc3RhcnRzIGNvdW50aW5nIGZyb20gdGhpcyBldmVudCBvZmZzZXQsCiAJICogbWFyayBpdCB0byBiZSBhYmxlIHRvIGV4dHJhIGZ1dHVyZSBkZWx0YXM6CiAJICovCi0JYXRvbWljNjRfc2V0KCZod2MtPnByZXZfY291bnQsICh1NjQpLWxlZnQpOworCWxvY2FsNjRfc2V0KCZod2MtPnByZXZfY291bnQsICh1NjQpLWxlZnQpOwogCi0Jd3Jtc3JsKGh3Yy0+ZXZlbnRfYmFzZSArIGlkeCwKKwl3cm1zcmwoaHdjLT5ldmVudF9iYXNlICsgaWR4LCAodTY0KSgtbGVmdCkgJiB4ODZfcG11LmNudHZhbF9tYXNrKTsKKworCS8qCisJICogRHVlIHRvIGVycmF0dW0gb24gY2VydGFuIGNwdSB3ZSBuZWVkCisJICogYSBzZWNvbmQgd3JpdGUgdG8gYmUgc3VyZSB0aGUgcmVnaXN0ZXIKKwkgKiBpcyB1cGRhdGVkIHByb3Blcmx5CisJICovCisJaWYgKHg4Nl9wbXUucGVyZmN0cl9zZWNvbmRfd3JpdGUpIHsKKwkJd3Jtc3JsKGh3Yy0+ZXZlbnRfYmFzZSArIGlkeCwKIAkJCSh1NjQpKC1sZWZ0KSAmIHg4Nl9wbXUuY250dmFsX21hc2spOworCX0KIAogCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIApAQCAtOTY5LDcgKzk3OSw3IEBACiAJICogc2tpcCB0aGUgc2NoZWR1bGFiaWxpdHkgdGVzdCBoZXJlLCBpdCB3aWxsIGJlIHBlZm9ybWVkCiAJICogYXQgY29tbWl0IHRpbWUoLT5jb21taXRfdHhuKSBhcyBhIHdob2xlCiAJICovCi0JaWYgKGNwdWMtPmdyb3VwX2ZsYWcgJiBQRVJGX0VWRU5UX1RYTl9TVEFSVEVEKQorCWlmIChjcHVjLT5ncm91cF9mbGFnICYgUEVSRl9FVkVOVF9UWE4pCiAJCWdvdG8gb3V0OwogCiAJcmV0ID0geDg2X3BtdS5zY2hlZHVsZV9ldmVudHMoY3B1YywgbiwgYXNzaWduKTsKQEAgLTEwOTYsNyArMTEwNiw3IEBACiAJICogVGhlIGV2ZW50cyBuZXZlciBnb3Qgc2NoZWR1bGVkIGFuZCAtPmNhbmNlbF90eG4gd2lsbCB0cnVuY2F0ZQogCSAqIHRoZSBldmVudF9saXN0LgogCSAqLwotCWlmIChjcHVjLT5ncm91cF9mbGFnICYgUEVSRl9FVkVOVF9UWE5fU1RBUlRFRCkKKwlpZiAoY3B1Yy0+Z3JvdXBfZmxhZyAmIFBFUkZfRVZFTlRfVFhOKQogCQlyZXR1cm47CiAKIAl4ODZfcG11X3N0b3AoZXZlbnQpOwpAQCAtMTM4OCw3ICsxMzk4LDcgQEAKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCi0JY3B1Yy0+Z3JvdXBfZmxhZyB8PSBQRVJGX0VWRU5UX1RYTl9TVEFSVEVEOworCWNwdWMtPmdyb3VwX2ZsYWcgfD0gUEVSRl9FVkVOVF9UWE47CiAJY3B1Yy0+bl90eG4gPSAwOwogfQogCkBAIC0xNDAxLDcgKzE0MTEsNyBAQAogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKLQljcHVjLT5ncm91cF9mbGFnICY9IH5QRVJGX0VWRU5UX1RYTl9TVEFSVEVEOworCWNwdWMtPmdyb3VwX2ZsYWcgJj0gflBFUkZfRVZFTlRfVFhOOwogCS8qCiAJICogVHJ1bmNhdGUgdGhlIGNvbGxlY3RlZCBldmVudHMuCiAJICovCkBAIC0xNDM1LDExICsxNDQ1LDcgQEAKIAkgKi8KIAltZW1jcHkoY3B1Yy0+YXNzaWduLCBhc3NpZ24sIG4qc2l6ZW9mKGludCkpOwogCi0JLyoKLQkgKiBDbGVhciBvdXQgdGhlIHR4biBjb3VudCBzbyB0aGF0IC0+Y2FuY2VsX3R4bigpIHdoaWNoIGdldHMKLQkgKiBydW4gYWZ0ZXIgLT5jb21taXRfdHhuKCkgZG9lc24ndCB1bmRvIHRoaW5ncy4KLQkgKi8KLQljcHVjLT5uX3R4biA9IDA7CisJY3B1Yy0+Z3JvdXBfZmxhZyAmPSB+UEVSRl9FVkVOVF9UWE47CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MDcsOCArMTYxMyw2IEBACiAJLndhbGtfc3RhY2sJCT0gcHJpbnRfY29udGV4dF9zdGFja19icCwKIH07CiAKLSNpbmNsdWRlICIuLi9kdW1wc3RhY2suaCIKLQogc3RhdGljIHZvaWQKIHBlcmZfY2FsbGNoYWluX2tlcm5lbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSkKIHsKQEAgLTE3MzAsMjIgKzE3MzQsNiBAQAogCXJldHVybiBlbnRyeTsKIH0KIAotdm9pZCBwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgaXAsIGludCBza2lwKQotewotCXJlZ3MtPmlwID0gaXA7Ci0JLyoKLQkgKiBwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3MgYWRkcyBhbm90aGVyIGNhbGwsIHdlIG5lZWQgdG8gaW5jcmVtZW50Ci0JICogdGhlIHNraXAgbGV2ZWwKLQkgKi8KLQlyZWdzLT5icCA9IHJld2luZF9mcmFtZV9wb2ludGVyKHNraXAgKyAxKTsKLQlyZWdzLT5jcyA9IF9fS0VSTkVMX0NTOwotCS8qCi0JICogV2UgYWJ1c2UgYml0IDMgdG8gcGFzcyBleGFjdCBpbmZvcm1hdGlvbiwgc2VlIHBlcmZfbWlzY19mbGFncwotCSAqIGFuZCB0aGUgY29tbWVudCB3aXRoIFBFUkZfRUZMQUdTX0VYQUNULgotCSAqLwotCXJlZ3MtPmZsYWdzID0gMDsKLX0KLQogdW5zaWduZWQgbG9uZyBwZXJmX2luc3RydWN0aW9uX3BvaW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBpcDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKaW5kZXggYWU4NWQ2OS4uMTA3NzExYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKQEAgLTIxLDIyICsyMSwzNiBAQAogCWNoYXIgY250clsyXVtQNF9DTlRSX0xJTUlUXTsJCS8qIGNvdW50ZXIgaW5kZXggKG9mZnNldCksIC0xIG9uIGFic2NlbmNlICovCiB9OwogCi1zdHJ1Y3QgcDRfY2FjaGVfZXZlbnRfYmluZCB7CitzdHJ1Y3QgcDRfcGVic19iaW5kIHsKIAl1bnNpZ25lZCBpbnQgbWV0cmljX3BlYnM7CiAJdW5zaWduZWQgaW50IG1ldHJpY192ZXJ0OwogfTsKIAotI2RlZmluZSBQNF9HRU5fQ0FDSEVfRVZFTlRfQklORChuYW1lKQkJXAotCVtQNF9DQUNIRV9fIyNuYW1lXSA9IHsJCQlcCi0JCS5tZXRyaWNfcGVicyA9IFA0X1BFQlNfXyMjbmFtZSwJXAotCQkubWV0cmljX3ZlcnQgPSBQNF9WRVJUX18jI25hbWUsCVwKKy8qIGl0IHNldHMgUDRfUEVCU19FTkFCTEVfVU9QX1RBRyBhcyB3ZWxsICovCisjZGVmaW5lIFA0X0dFTl9QRUJTX0JJTkQobmFtZSwgcGVicywgdmVydCkJCQlcCisJW1A0X1BFQlNfTUVUUklDX18jI25hbWVdID0gewkJCQlcCisJCS5tZXRyaWNfcGVicyA9IHBlYnMgfCBQNF9QRUJTX0VOQUJMRV9VT1BfVEFHLAlcCisJCS5tZXRyaWNfdmVydCA9IHZlcnQsCQkJCVwKIAl9CiAKLXN0YXRpYyBzdHJ1Y3QgcDRfY2FjaGVfZXZlbnRfYmluZCBwNF9jYWNoZV9ldmVudF9iaW5kX21hcFtdID0gewotCVA0X0dFTl9DQUNIRV9FVkVOVF9CSU5EKDFzdGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQpLAotCVA0X0dFTl9DQUNIRV9FVkVOVF9CSU5EKDJuZGxfY2FjaGVfbG9hZF9taXNzX3JldGlyZWQpLAotCVA0X0dFTl9DQUNIRV9FVkVOVF9CSU5EKGR0bGJfbG9hZF9taXNzX3JldGlyZWQpLAotCVA0X0dFTl9DQUNIRV9FVkVOVF9CSU5EKGR0bGJfc3RvcmVfbWlzc19yZXRpcmVkKSwKKy8qCisgKiBub3RlIHdlIGhhdmUgUDRfUEVCU19FTkFCTEVfVU9QX1RBRyBhbHdheXMgc2V0IGhlcmUKKyAqCisgKiBpdCdzIG5lZWRlZCBmb3IgbWFwcGluZyBQNF9QRUJTX0NPTkZJR19NRVRSSUNfTUFTSyBiaXRzIG9mCisgKiBldmVudCBjb25maWd1cmF0aW9uIHRvIGZpbmQgb3V0IHdoaWNoIHZhbHVlcyBhcmUgdG8gYmUKKyAqIHdyaXR0ZW4gaW50byBNU1JfSUEzMl9QRUJTX0VOQUJMRSBhbmQgTVNSX1A0X1BFQlNfTUFUUklYX1ZFUlQKKyAqIHJlc2dpc3RlcnMKKyAqLworc3RhdGljIHN0cnVjdCBwNF9wZWJzX2JpbmQgcDRfcGVic19iaW5kX21hcFtdID0geworCVA0X0dFTl9QRUJTX0JJTkQoMXN0bF9jYWNoZV9sb2FkX21pc3NfcmV0aXJlZCwJMHgwMDAwMDAxLCAweDAwMDAwMDEpLAorCVA0X0dFTl9QRUJTX0JJTkQoMm5kbF9jYWNoZV9sb2FkX21pc3NfcmV0aXJlZCwJMHgwMDAwMDAyLCAweDAwMDAwMDEpLAorCVA0X0dFTl9QRUJTX0JJTkQoZHRsYl9sb2FkX21pc3NfcmV0aXJlZCwJMHgwMDAwMDA0LCAweDAwMDAwMDEpLAorCVA0X0dFTl9QRUJTX0JJTkQoZHRsYl9zdG9yZV9taXNzX3JldGlyZWQsCTB4MDAwMDAwNCwgMHgwMDAwMDAyKSwKKwlQNF9HRU5fUEVCU19CSU5EKGR0bGJfYWxsX21pc3NfcmV0aXJlZCwJCTB4MDAwMDAwNCwgMHgwMDAwMDAzKSwKKwlQNF9HRU5fUEVCU19CSU5EKHRhZ2dlZF9taXNwcmVkX2JyYW5jaCwJCTB4MDAxODAwMCwgMHgwMDAwMDEwKSwKKwlQNF9HRU5fUEVCU19CSU5EKG1vYl9sb2FkX3JlcGxheV9yZXRpcmVkLAkweDAwMDAyMDAsIDB4MDAwMDAwMSksCisJUDRfR0VOX1BFQlNfQklORChzcGxpdF9sb2FkX3JldGlyZWQsCQkweDAwMDA0MDAsIDB4MDAwMDAwMSksCisJUDRfR0VOX1BFQlNfQklORChzcGxpdF9zdG9yZV9yZXRpcmVkLAkJMHgwMDAwNDAwLCAweDAwMDAwMDIpLAogfTsKIAogLyoKQEAgLTI4MSwxMCArMjk1LDEwIEBACiAJfSwKIH07CiAKLSNkZWZpbmUgUDRfR0VOX0NBQ0hFX0VWRU5UKGV2ZW50LCBiaXQsIGNhY2hlX2V2ZW50KQkJCSAgXAorI2RlZmluZSBQNF9HRU5fQ0FDSEVfRVZFTlQoZXZlbnQsIGJpdCwgbWV0cmljKQkJCQkgIFwKIAlwNF9jb25maWdfcGFja19lc2NyKFA0X0VTQ1JfRVZFTlQoZXZlbnQpCQkJfCBcCiAJCQkgICAgUDRfRVNDUl9FTUFTS19CSVQoZXZlbnQsIGJpdCkpCQl8IFwKLQlwNF9jb25maWdfcGFja19jY2NyKGNhY2hlX2V2ZW50CQkJCQl8IFwKKwlwNF9jb25maWdfcGFja19jY2NyKG1ldHJpYwkJCQkJfCBcCiAJCQkgICAgUDRfQ0NDUl9FU0VMKFA0X09QQ09ERV9FU0VMKFA0X09QQ09ERShldmVudCkpKSkKIAogc3RhdGljIF9faW5pdGNvbnN0IGNvbnN0IHU2NCBwNF9od19jYWNoZV9ldmVudF9pZHMKQEAgLTI5NiwzNCArMzEwLDM0IEBACiAJWyBDKE9QX1JFQUQpIF0gPSB7CiAJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IFA0X0dFTl9DQUNIRV9FVkVOVChQNF9FVkVOVF9SRVBMQVlfRVZFTlQsIE5CT0dVUywKLQkJCQkJCVA0X0NBQ0hFX18xc3RsX2NhY2hlX2xvYWRfbWlzc19yZXRpcmVkKSwKKwkJCQkJCVA0X1BFQlNfTUVUUklDX18xc3RsX2NhY2hlX2xvYWRfbWlzc19yZXRpcmVkKSwKIAl9LAogIH0sCiAgWyBDKExMICApIF0gPSB7CiAJWyBDKE9QX1JFQUQpIF0gPSB7CiAJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IFA0X0dFTl9DQUNIRV9FVkVOVChQNF9FVkVOVF9SRVBMQVlfRVZFTlQsIE5CT0dVUywKLQkJCQkJCVA0X0NBQ0hFX18ybmRsX2NhY2hlX2xvYWRfbWlzc19yZXRpcmVkKSwKKwkJCQkJCVA0X1BFQlNfTUVUUklDX18ybmRsX2NhY2hlX2xvYWRfbWlzc19yZXRpcmVkKSwKIAl9LAogfSwKICBbIEMoRFRMQikgXSA9IHsKIAlbIEMoT1BfUkVBRCkgXSA9IHsKIAkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAsCiAJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gUDRfR0VOX0NBQ0hFX0VWRU5UKFA0X0VWRU5UX1JFUExBWV9FVkVOVCwgTkJPR1VTLAotCQkJCQkJUDRfQ0FDSEVfX2R0bGJfbG9hZF9taXNzX3JldGlyZWQpLAorCQkJCQkJUDRfUEVCU19NRVRSSUNfX2R0bGJfbG9hZF9taXNzX3JldGlyZWQpLAogCX0sCiAJWyBDKE9QX1dSSVRFKSBdID0gewogCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MCwKIAkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSBQNF9HRU5fQ0FDSEVfRVZFTlQoUDRfRVZFTlRfUkVQTEFZX0VWRU5ULCBOQk9HVVMsCi0JCQkJCQlQNF9DQUNIRV9fZHRsYl9zdG9yZV9taXNzX3JldGlyZWQpLAorCQkJCQkJUDRfUEVCU19NRVRSSUNfX2R0bGJfc3RvcmVfbWlzc19yZXRpcmVkKSwKIAl9LAogIH0sCiAgWyBDKElUTEIpIF0gPSB7CiAJWyBDKE9QX1JFQUQpIF0gPSB7CiAJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gUDRfR0VOX0NBQ0hFX0VWRU5UKFA0X0VWRU5UX0lUTEJfUkVGRVJFTkNFLCBISVQsCi0JCQkJCQlQNF9DQUNIRV9faXRsYl9yZWZlcmVuY2VfaGl0KSwKKwkJCQkJCVA0X1BFQlNfTUVUUklDX19ub25lKSwKIAkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSBQNF9HRU5fQ0FDSEVfRVZFTlQoUDRfRVZFTlRfSVRMQl9SRUZFUkVOQ0UsIE1JU1MsCi0JCQkJCQlQNF9DQUNIRV9faXRsYl9yZWZlcmVuY2VfbWlzcyksCisJCQkJCQlQNF9QRUJTX01FVFJJQ19fbm9uZSksCiAJfSwKIAlbIEMoT1BfV1JJVEUpIF0gPSB7CiAJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCkBAIC00MTQsMTEgKzQyOCwzNyBAQAogCXJldHVybiBjb25maWc7CiB9CiAKK3N0YXRpYyBpbnQgcDRfdmFsaWRhdGVfcmF3X2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgdjsKKworCS8qIHVzZXIgZGF0YSBtYXkgaGF2ZSBvdXQtb2YtYm91bmQgZXZlbnQgaW5kZXggKi8KKwl2ID0gcDRfY29uZmlnX3VucGFja19ldmVudChldmVudC0+YXR0ci5jb25maWcpOworCWlmICh2ID49IEFSUkFZX1NJWkUocDRfZXZlbnRfYmluZF9tYXApKSB7CisJCXByX3dhcm5pbmcoIlA0IFBNVTogVW5rbm93biBldmVudCBjb2RlOiAlZFxuIiwgdik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogaXQgbWF5IGhhdmUgc29tZSBzY3Jld2VkIFBFQlMgYml0cworCSAqLworCWlmIChwNF9jb25maWdfcGVic19oYXMoZXZlbnQtPmF0dHIuY29uZmlnLCBQNF9QRUJTX0NPTkZJR19FTkFCTEUpKSB7CisJCXByX3dhcm5pbmcoIlA0IFBNVTogUEVCUyBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdiA9IHA0X2NvbmZpZ191bnBhY2tfbWV0cmljKGV2ZW50LT5hdHRyLmNvbmZpZyk7CisJaWYgKHYgPj0gQVJSQVlfU0laRShwNF9wZWJzX2JpbmRfbWFwKSkgeworCQlwcl93YXJuaW5nKCJQNCBQTVU6IFVua25vd24gbWV0cmljIGNvZGU6ICVkXG4iLCB2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcDRfaHdfY29uZmlnKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlpbnQgY3B1ID0gZ2V0X2NwdSgpOwogCWludCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IGV2bnQ7CiAJdTMyIGVzY3IsIGNjY3I7CiAKIAkvKgpAQCAtNDM4LDEyICs0NzgsOSBAQAogCiAJaWYgKGV2ZW50LT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX1JBVykgewogCi0JCS8qIHVzZXIgZGF0YSBtYXkgaGF2ZSBvdXQtb2YtYm91bmQgZXZlbnQgaW5kZXggKi8KLQkJZXZudCA9IHA0X2NvbmZpZ191bnBhY2tfZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKTsKLQkJaWYgKGV2bnQgPj0gQVJSQVlfU0laRShwNF9ldmVudF9iaW5kX21hcCkpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJcmMgPSBwNF92YWxpZGF0ZV9yYXdfZXZlbnQoZXZlbnQpOworCQlpZiAocmMpCiAJCQlnb3RvIG91dDsKLQkJfQogCiAJCS8qCiAJCSAqIFdlIGRvbid0IGNvbnRyb2wgcmF3IGV2ZW50cyBzbyBpdCdzIHVwIHRvIHRoZSBjYWxsZXIKQEAgLTQ1MSwxMiArNDg4LDE1IEBACiAJCSAqIG9uIEhUIG1hY2hpbmUgYnV0IGFsbG93IEhULWNvbXBhdGlibGUgc3BlY2lmaWNzIHRvIGJlCiAJCSAqIHBhc3NlZCBvbikKIAkJICoKKwkJICogTm90ZSB0aGF0IGZvciBSQVcgZXZlbnRzIHdlIGFsbG93IHVzZXIgdG8gdXNlIFA0X0NDQ1JfUkVTRVJWRUQKKwkJICogYml0cyBzaW5jZSB3ZSBrZWVwIGFkZGl0aW9uYWwgaW5mbyBoZXJlIChmb3IgY2FjaGUgZXZlbnRzIGFuZCBldGMpCisJCSAqCiAJCSAqIFhYWDogSFQgd2lkZSB0aGluZ3Mgc2hvdWxkIGNoZWNrIHBlcmZfcGFyYW5vaWRfY3B1KCkgJiYKIAkJICogICAgICBDQVBfU1lTX0FETUlOCiAJCSAqLwogCQlldmVudC0+aHcuY29uZmlnIHw9IGV2ZW50LT5hdHRyLmNvbmZpZyAmCiAJCQkocDRfY29uZmlnX3BhY2tfZXNjcihQNF9FU0NSX01BU0tfSFQpIHwKLQkJCSBwNF9jb25maWdfcGFja19jY2NyKFA0X0NDQ1JfTUFTS19IVCkpOworCQkJIHA0X2NvbmZpZ19wYWNrX2NjY3IoUDRfQ0NDUl9NQVNLX0hUIHwgUDRfQ0NDUl9SRVNFUlZFRCkpOwogCX0KIAogCXJjID0geDg2X3NldHVwX3BlcmZjdHIoZXZlbnQpOwpAQCAtNDgyLDYgKzUyMiwyOSBAQAogCXJldHVybiBvdmVyZmxvdzsKIH0KIAorc3RhdGljIHZvaWQgcDRfcG11X2Rpc2FibGVfcGVicyh2b2lkKQoreworCS8qCisJICogRklYTUUKKwkgKgorCSAqIEl0J3Mgc3RpbGwgYWxsb3dlZCB0aGF0IHR3byB0aHJlYWRzIHNldHVwIHNhbWUgY2FjaGUKKwkgKiBldmVudHMgc28gd2UgY2FuJ3Qgc2ltcGx5IGNsZWFyIG1ldHJpY3MgdW50aWwgd2Uga25ldworCSAqIG5vb25lIGlzIGRlcGVuZGluZyBvbiB1cywgc28gd2UgbmVlZCBraW5kIG9mIGNvdW50ZXIKKwkgKiBmb3IgIlJlcGxheUV2ZW50IiB1c2Vycy4KKwkgKgorCSAqIFdoYXQgaXMgbW9yZSBjb21wbGV4IC0tIFJBVyBldmVudHMsIGlmIHVzZXIgKGZvciBzb21lCisJICogcmVhc29uKSB3aWxsIHBhc3Mgc29tZSBjYWNoZSBldmVudCBtZXRyaWMgd2l0aCBpbXByb3BlcgorCSAqIGV2ZW50IG9wY29kZSAtLSBpdCdzIGZpbmUgZnJvbSBoYXJkd2FyZSBwb2ludCBvZiB2aWV3CisJICogYnV0IGNvbXBsZXRlbHkgbm9uc2VuY2UgZnJvbSAibWVhbmluZyIgb2Ygc3VjaCBhY3Rpb24uCisJICoKKwkgKiBTbyBhdCBtb21lbnQgbGV0IGxlYXZlIG1ldHJpY3MgdHVybmVkIG9uIGZvcmV2ZXIgLS0gaXQncworCSAqIG9rIGZvciBub3cgYnV0IG5lZWQgdG8gYmUgcmV2aXNpdGVkIQorCSAqCisJICogKHZvaWQpY2hlY2tpbmdfd3Jtc3JsKE1TUl9JQTMyX1BFQlNfRU5BQkxFLCAodTY0KTApOworCSAqICh2b2lkKWNoZWNraW5nX3dybXNybChNU1JfUDRfUEVCU19NQVRSSVhfVkVSVCwgKHU2NCkwKTsKKwkgKi8KK30KKwogc3RhdGljIGlubGluZSB2b2lkIHA0X3BtdV9kaXNhYmxlX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKQEAgLTUwNyw2ICs1NzAsMjYgQEAKIAkJCWNvbnRpbnVlOwogCQlwNF9wbXVfZGlzYWJsZV9ldmVudChldmVudCk7CiAJfQorCisJcDRfcG11X2Rpc2FibGVfcGVicygpOworfQorCisvKiBjb25maWd1cmF0aW9uIG11c3QgYmUgdmFsaWQgKi8KK3N0YXRpYyB2b2lkIHA0X3BtdV9lbmFibGVfcGVicyh1NjQgY29uZmlnKQoreworCXN0cnVjdCBwNF9wZWJzX2JpbmQgKmJpbmQ7CisJdW5zaWduZWQgaW50IGlkeDsKKworCUJVSUxEX0JVR19PTihQNF9QRUJTX01FVFJJQ19fbWF4ID4gUDRfUEVCU19DT05GSUdfTUVUUklDX01BU0spOworCisJaWR4ID0gcDRfY29uZmlnX3VucGFja19tZXRyaWMoY29uZmlnKTsKKwlpZiAoaWR4ID09IFA0X1BFQlNfTUVUUklDX19ub25lKQorCQlyZXR1cm47CisKKwliaW5kID0gJnA0X3BlYnNfYmluZF9tYXBbaWR4XTsKKworCSh2b2lkKWNoZWNraW5nX3dybXNybChNU1JfSUEzMl9QRUJTX0VOQUJMRSwJKHU2NCliaW5kLT5tZXRyaWNfcGVicyk7CisJKHZvaWQpY2hlY2tpbmdfd3Jtc3JsKE1TUl9QNF9QRUJTX01BVFJJWF9WRVJULAkodTY0KWJpbmQtPm1ldHJpY192ZXJ0KTsKIH0KIAogc3RhdGljIHZvaWQgcDRfcG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC01MTUsOSArNTk4LDcgQEAKIAlpbnQgdGhyZWFkID0gcDRfaHRfY29uZmlnX3RocmVhZChod2MtPmNvbmZpZyk7CiAJdTY0IGVzY3JfY29uZiA9IHA0X2NvbmZpZ191bnBhY2tfZXNjcihwNF9jbGVhcl9odF9iaXQoaHdjLT5jb25maWcpKTsKIAl1bnNpZ25lZCBpbnQgaWR4ID0gcDRfY29uZmlnX3VucGFja19ldmVudChod2MtPmNvbmZpZyk7Ci0JdW5zaWduZWQgaW50IGlkeF9jYWNoZSA9IHA0X2NvbmZpZ191bnBhY2tfY2FjaGVfZXZlbnQoaHdjLT5jb25maWcpOwogCXN0cnVjdCBwNF9ldmVudF9iaW5kICpiaW5kOwotCXN0cnVjdCBwNF9jYWNoZV9ldmVudF9iaW5kICpiaW5kX2NhY2hlOwogCXU2NCBlc2NyX2FkZHIsIGNjY3I7CiAKIAliaW5kID0gJnA0X2V2ZW50X2JpbmRfbWFwW2lkeF07CkBAIC01MzcsMTYgKzYxOCwxMCBAQAogCWNjY3IgPSBwNF9jb25maWdfdW5wYWNrX2NjY3IoaHdjLT5jb25maWcpOwogCiAJLyoKLQkgKiBpdCBjb3VsZCBiZSBDYWNoZSBldmVudCBzbyB0aGF0IHdlIG5lZWQgdG8KLQkgKiBzZXQgbWV0cmljcyBpbnRvIGFkZGl0aW9uYWwgTVNScworCSAqIGl0IGNvdWxkIGJlIENhY2hlIGV2ZW50IHNvIHdlIG5lZWQgdG8gd3JpdGUgbWV0cmljcworCSAqIGludG8gYWRkaXRpb25hbCBNU1JzCiAJICovCi0JQlVJTERfQlVHX09OKFA0X0NBQ0hFX19NQVggPiBQNF9DQ0NSX0NBQ0hFX09QU19NQVNLKTsKLQlpZiAoaWR4X2NhY2hlID4gUDRfQ0FDSEVfX05PTkUgJiYKLQkJaWR4X2NhY2hlIDwgQVJSQVlfU0laRShwNF9jYWNoZV9ldmVudF9iaW5kX21hcCkpIHsKLQkJYmluZF9jYWNoZSA9ICZwNF9jYWNoZV9ldmVudF9iaW5kX21hcFtpZHhfY2FjaGVdOwotCQkodm9pZCljaGVja2luZ193cm1zcmwoTVNSX0lBMzJfUEVCU19FTkFCTEUsICh1NjQpYmluZF9jYWNoZS0+bWV0cmljX3BlYnMpOwotCQkodm9pZCljaGVja2luZ193cm1zcmwoTVNSX1A0X1BFQlNfTUFUUklYX1ZFUlQsICh1NjQpYmluZF9jYWNoZS0+bWV0cmljX3ZlcnQpOwotCX0KKwlwNF9wbXVfZW5hYmxlX3BlYnMoaHdjLT5jb25maWcpOwogCiAJKHZvaWQpY2hlY2tpbmdfd3Jtc3JsKGVzY3JfYWRkciwgZXNjcl9jb25mKTsKIAkodm9pZCljaGVja2luZ193cm1zcmwoaHdjLT5jb25maWdfYmFzZSArIGh3Yy0+aWR4LApAQCAtODI5LDYgKzkwNCwxNSBAQAogCS5tYXhfcGVyaW9kCQk9ICgxVUxMIDw8IDM5KSAtIDEsCiAJLmh3X2NvbmZpZwkJPSBwNF9od19jb25maWcsCiAJLnNjaGVkdWxlX2V2ZW50cwk9IHA0X3BtdV9zY2hlZHVsZV9ldmVudHMsCisJLyoKKwkgKiBUaGlzIGhhbmRsZXMgZXJyYXR1bSBOMTUgaW4gaW50ZWwgZG9jIDI0OTE5OS0wMjksCisJICogdGhlIGNvdW50ZXIgbWF5IG5vdCBiZSB1cGRhdGVkIGNvcnJlY3RseSBvbiB3cml0ZQorCSAqIHNvIHdlIG5lZWQgYSBzZWNvbmQgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIHRoZSB0cmljaworCSAqICh0aGUgb2ZmaWNpYWwgd29ya2Fyb3VuZCBkaWRuJ3Qgd29yaykKKwkgKgorCSAqIHRoZSBmb3JtZXIgaWRlYSBpcyB0YWtlbiBmcm9tIE9Qcm9maWxlIGNvZGUKKwkgKi8KKwkucGVyZmN0cl9zZWNvbmRfd3JpdGUJPSAxLAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgcDRfcG11X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvc2NhdHRlcmVkLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3NjYXR0ZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjRkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3NjYXR0ZXJlZC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKglSb3V0aW5lcyB0byBpbmRlbnRpZnkgYWRkaXRpb25hbCBjcHUgZmVhdHVyZXMgdGhhdCBhcmUgc2NhdHRlcmVkIGluCisgKgljcHVpZCBzcGFjZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL3BhdC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGFzbS9hcGljLmg+CisKK3N0cnVjdCBjcHVpZF9iaXQgeworCXUxNiBmZWF0dXJlOworCXU4IHJlZzsKKwl1OCBiaXQ7CisJdTMyIGxldmVsOworCXUzMiBzdWJfbGVhZjsKK307CisKK2VudW0gY3B1aWRfcmVncyB7CisJQ1JfRUFYID0gMCwKKwlDUl9FQ1gsCisJQ1JfRURYLAorCUNSX0VCWAorfTsKKwordm9pZCBfX2NwdWluaXQgaW5pdF9zY2F0dGVyZWRfY3B1aWRfZmVhdHVyZXMoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBtYXhfbGV2ZWw7CisJdTMyIHJlZ3NbNF07CisJY29uc3Qgc3RydWN0IGNwdWlkX2JpdCAqY2I7CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNwdWlkX2JpdCBfX2NwdWluaXRjb25zdCBjcHVpZF9iaXRzW10gPSB7CisJCXsgWDg2X0ZFQVRVUkVfSURBLAkJQ1JfRUFYLCAxLCAweDAwMDAwMDA2LCAwIH0sCisJCXsgWDg2X0ZFQVRVUkVfQVJBVCwJCUNSX0VBWCwgMiwgMHgwMDAwMDAwNiwgMCB9LAorCQl7IFg4Nl9GRUFUVVJFX1BMTiwJCUNSX0VBWCwgNCwgMHgwMDAwMDAwNiwgMCB9LAorCQl7IFg4Nl9GRUFUVVJFX1BUUywJCUNSX0VBWCwgNiwgMHgwMDAwMDAwNiwgMCB9LAorCQl7IFg4Nl9GRUFUVVJFX0FQRVJGTVBFUkYsCUNSX0VDWCwgMCwgMHgwMDAwMDAwNiwgMCB9LAorCQl7IFg4Nl9GRUFUVVJFX0VQQiwJCUNSX0VDWCwgMywgMHgwMDAwMDAwNiwgMCB9LAorCQl7IFg4Nl9GRUFUVVJFX1hTQVZFT1BULAkJQ1JfRUFYLAkwLCAweDAwMDAwMDBkLCAxIH0sCisJCXsgWDg2X0ZFQVRVUkVfQ1BCLAkJQ1JfRURYLCA5LCAweDgwMDAwMDA3LCAwIH0sCisJCXsgWDg2X0ZFQVRVUkVfTlBULAkJQ1JfRURYLCAwLCAweDgwMDAwMDBhLCAwIH0sCisJCXsgWDg2X0ZFQVRVUkVfTEJSViwJCUNSX0VEWCwgMSwgMHg4MDAwMDAwYSwgMCB9LAorCQl7IFg4Nl9GRUFUVVJFX1NWTUwsCQlDUl9FRFgsIDIsIDB4ODAwMDAwMGEsIDAgfSwKKwkJeyBYODZfRkVBVFVSRV9OUklQUywJCUNSX0VEWCwgMywgMHg4MDAwMDAwYSwgMCB9LAorCQl7IDAsIDAsIDAsIDAsIDAgfQorCX07CisKKwlmb3IgKGNiID0gY3B1aWRfYml0czsgY2ItPmZlYXR1cmU7IGNiKyspIHsKKworCQkvKiBWZXJpZnkgdGhhdCB0aGUgbGV2ZWwgaXMgdmFsaWQgKi8KKwkJbWF4X2xldmVsID0gY3B1aWRfZWF4KGNiLT5sZXZlbCAmIDB4ZmZmZjAwMDApOworCQlpZiAobWF4X2xldmVsIDwgY2ItPmxldmVsIHx8CisJCSAgICBtYXhfbGV2ZWwgPiAoY2ItPmxldmVsIHwgMHhmZmZmKSkKKwkJCWNvbnRpbnVlOworCisJCWNwdWlkX2NvdW50KGNiLT5sZXZlbCwgY2ItPnN1Yl9sZWFmLCAmcmVnc1tDUl9FQVhdLAorCQkJICAgICZyZWdzW0NSX0VCWF0sICZyZWdzW0NSX0VDWF0sICZyZWdzW0NSX0VEWF0pOworCisJCWlmIChyZWdzW2NiLT5yZWddICYgKDEgPDwgY2ItPmJpdCkpCisJCQlzZXRfY3B1X2NhcChjLCBjYi0+ZmVhdHVyZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS90b3BvbG9neS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS90b3BvbG9neS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTdlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3RvcG9sb2d5LmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENoZWNrIGZvciBleHRlbmRlZCB0b3BvbG9neSBlbnVtZXJhdGlvbiBjcHVpZCBsZWFmIDB4YiBhbmQgaWYgaXQKKyAqIGV4aXN0cywgdXNlIGl0IGZvciBwb3B1bGF0aW5nIGluaXRpYWxfYXBpY2lkIGFuZCBjcHUgdG9wb2xvZ3kKKyAqIGRldGVjdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vcGF0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisvKiBsZWFmIDB4YiBTTVQgbGV2ZWwgKi8KKyNkZWZpbmUgU01UX0xFVkVMCTAKKworLyogbGVhZiAweGIgc3ViLWxlYWYgdHlwZXMgKi8KKyNkZWZpbmUgSU5WQUxJRF9UWVBFCTAKKyNkZWZpbmUgU01UX1RZUEUJMQorI2RlZmluZSBDT1JFX1RZUEUJMgorCisjZGVmaW5lIExFQUZCX1NVQlRZUEUoZWN4KQkJKCgoZWN4KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIEJJVFNfU0hJRlRfTkVYVF9MRVZFTChlYXgpCSgoZWF4KSAmIDB4MWYpCisjZGVmaW5lIExFVkVMX01BWF9TSUJMSU5HUyhlYngpCQkoKGVieCkgJiAweGZmZmYpCisKKy8qCisgKiBDaGVjayBmb3IgZXh0ZW5kZWQgdG9wb2xvZ3kgZW51bWVyYXRpb24gY3B1aWQgbGVhZiAweGIgYW5kIGlmIGl0CisgKiBleGlzdHMsIHVzZSBpdCBmb3IgcG9wdWxhdGluZyBpbml0aWFsX2FwaWNpZCBhbmQgY3B1IHRvcG9sb2d5CisgKiBkZXRlY3Rpb24uCisgKi8KK3ZvaWQgX19jcHVpbml0IGRldGVjdF9leHRlbmRlZF90b3BvbG9neShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHgsIHN1Yl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgaHRfbWFza193aWR0aCwgY29yZV9wbHVzX21hc2tfd2lkdGg7CisJdW5zaWduZWQgaW50IGNvcmVfc2VsZWN0X21hc2ssIGNvcmVfbGV2ZWxfc2libGluZ3M7CisJc3RhdGljIGJvb2wgcHJpbnRlZDsKKworCWlmIChjLT5jcHVpZF9sZXZlbCA8IDB4YikKKwkJcmV0dXJuOworCisJY3B1aWRfY291bnQoMHhiLCBTTVRfTEVWRUwsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCisJLyoKKwkgKiBjaGVjayBpZiB0aGUgY3B1aWQgbGVhZiAweGIgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuCisJICovCisJaWYgKGVieCA9PSAwIHx8IChMRUFGQl9TVUJUWVBFKGVjeCkgIT0gU01UX1RZUEUpKQorCQlyZXR1cm47CisKKwlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9YVE9QT0xPR1kpOworCisJLyoKKwkgKiBpbml0aWFsIGFwaWMgaWQsIHdoaWNoIGFsc28gcmVwcmVzZW50cyAzMi1iaXQgZXh0ZW5kZWQgeDJhcGljIGlkLgorCSAqLworCWMtPmluaXRpYWxfYXBpY2lkID0gZWR4OworCisJLyoKKwkgKiBQb3B1bGF0ZSBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZyb20gc3ViLWxlYWYgbGV2ZWwgMC4KKwkgKi8KKwljb3JlX2xldmVsX3NpYmxpbmdzID0gc21wX251bV9zaWJsaW5ncyA9IExFVkVMX01BWF9TSUJMSU5HUyhlYngpOworCWNvcmVfcGx1c19tYXNrX3dpZHRoID0gaHRfbWFza193aWR0aCA9IEJJVFNfU0hJRlRfTkVYVF9MRVZFTChlYXgpOworCisJc3ViX2luZGV4ID0gMTsKKwlkbyB7CisJCWNwdWlkX2NvdW50KDB4Yiwgc3ViX2luZGV4LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworCQkvKgorCQkgKiBDaGVjayBmb3IgdGhlIENvcmUgdHlwZSBpbiB0aGUgaW1wbGVtZW50ZWQgc3ViIGxlYXZlcy4KKwkJICovCisJCWlmIChMRUFGQl9TVUJUWVBFKGVjeCkgPT0gQ09SRV9UWVBFKSB7CisJCQljb3JlX2xldmVsX3NpYmxpbmdzID0gTEVWRUxfTUFYX1NJQkxJTkdTKGVieCk7CisJCQljb3JlX3BsdXNfbWFza193aWR0aCA9IEJJVFNfU0hJRlRfTkVYVF9MRVZFTChlYXgpOworCQkJYnJlYWs7CisJCX0KKworCQlzdWJfaW5kZXgrKzsKKwl9IHdoaWxlIChMRUFGQl9TVUJUWVBFKGVjeCkgIT0gSU5WQUxJRF9UWVBFKTsKKworCWNvcmVfc2VsZWN0X21hc2sgPSAofigtMSA8PCBjb3JlX3BsdXNfbWFza193aWR0aCkpID4+IGh0X21hc2tfd2lkdGg7CisKKwljLT5jcHVfY29yZV9pZCA9IGFwaWMtPnBoeXNfcGtnX2lkKGMtPmluaXRpYWxfYXBpY2lkLCBodF9tYXNrX3dpZHRoKQorCQkJCQkJICYgY29yZV9zZWxlY3RfbWFzazsKKwljLT5waHlzX3Byb2NfaWQgPSBhcGljLT5waHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgY29yZV9wbHVzX21hc2tfd2lkdGgpOworCS8qCisJICogUmVpbml0IHRoZSBhcGljaWQsIG5vdyB0aGF0IHdlIGhhdmUgZXh0ZW5kZWQgaW5pdGlhbF9hcGljaWQuCisJICovCisJYy0+YXBpY2lkID0gYXBpYy0+cGh5c19wa2dfaWQoYy0+aW5pdGlhbF9hcGljaWQsIDApOworCisJYy0+eDg2X21heF9jb3JlcyA9IChjb3JlX2xldmVsX3NpYmxpbmdzIC8gc21wX251bV9zaWJsaW5ncyk7CisKKwlpZiAoIXByaW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogUGh5c2ljYWwgUHJvY2Vzc29yIElEOiAlZFxuIiwKKwkJICAgICAgIGMtPnBoeXNfcHJvY19pZCk7CisJCWlmIChjLT54ODZfbWF4X2NvcmVzID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gICJDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAlZFxuIiwKKwkJCSAgICAgICBjLT5jcHVfY29yZV9pZCk7CisJCXByaW50ZWQgPSAxOworCX0KKwlyZXR1cm47CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYwppbmRleCBjODlhMzg2Li42ZTg3NTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCkBAIC0xOCw3ICsxOCw2IEBACiAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCi0jaW5jbHVkZSAiZHVtcHN0YWNrLmgiCiAKIGludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CiBpbnQgcGFuaWNfb25faW9fbm1pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5oIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWE5M2JlLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwotICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBBbmRpIEtsZWVuLCBTdVNFIExhYnMKLSAqLwotCi0jaWZuZGVmIERVTVBTVEFDS19ICi0jZGVmaW5lIERVTVBTVEFDS19ICi0KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0jZGVmaW5lIFNUQUNLU0xPVFNfUEVSX0xJTkUgOAotI2RlZmluZSBnZXRfYnAoYnApIGFzbSgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoYnApIDopCi0jZWxzZQotI2RlZmluZSBTVEFDS1NMT1RTX1BFUl9MSU5FIDQKLSNkZWZpbmUgZ2V0X2JwKGJwKSBhc20oIm1vdnEgJSVyYnAsICUwIiA6ICI9ciIgKGJwKSA6KQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLWV4dGVybiB2b2lkCi1zaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpOwotCi1leHRlcm4gdm9pZAotc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBjb2RlX2J5dGVzOwotCi0vKiBUaGUgZm9ybSBvZiB0aGUgdG9wIG9mIHRoZSBmcmFtZSBvbiB0aGUgc3RhY2sgKi8KLXN0cnVjdCBzdGFja19mcmFtZSB7Ci0Jc3RydWN0IHN0YWNrX2ZyYW1lICpuZXh0X2ZyYW1lOwotCXVuc2lnbmVkIGxvbmcgcmV0dXJuX2FkZHJlc3M7Ci19OwotCi1zdHJ1Y3Qgc3RhY2tfZnJhbWVfaWEzMiB7Ci0gICAgdTMyIG5leHRfZnJhbWU7Ci0gICAgdTMyIHJldHVybl9hZGRyZXNzOwotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJld2luZF9mcmFtZV9wb2ludGVyKGludCBuKQotewotCXN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWU7Ci0KLQlnZXRfYnAoZnJhbWUpOwotCi0jaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQl3aGlsZSAobi0tKSB7Ci0JCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcygmZnJhbWUtPm5leHRfZnJhbWUsIGZyYW1lKSkKLQkJCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWZyYW1lOwotfQotCi0jZW5kaWYgLyogRFVNUFNUQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwppbmRleCAxMTU0MGExLi4wZjYzNzZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCkBAIC0xNiw4ICsxNiw2IEBACiAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCi0jaW5jbHVkZSAiZHVtcHN0YWNrLmgiCi0KIAogdm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IDI3MmM5ZjEuLjU3YTIxZjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKLSNpbmNsdWRlICJkdW1wc3RhY2suaCIKIAogI2RlZmluZSBOX0VYQ0VQVElPTl9TVEFDS1NfRU5EIFwKIAkJKE5fRVhDRVBUSU9OX1NUQUNLUyArIERFQlVHX1NUS1NaL0VYQ0VQVElPTl9TVEtTWiAtIDIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IGNkNDkxNDEuLjI1OGU5M2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCkBAIC02MTEsMTQgKzYxMSwxNCBAQAogICogY29tcGVuc2F0aW5nIGZvciB0aGUgb2Zmc2V0IGJ5IGNoYW5naW5nIHRvIHRoZSBFU1BGSVggc2VnbWVudCB3aXRoCiAgKiBhIGJhc2UgYWRkcmVzcyB0aGF0IG1hdGNoZXMgZm9yIHRoZSBkaWZmZXJlbmNlLgogICovCisjZGVmaW5lIEdEVF9FU1BGSVhfU1MgUEVSX0NQVV9WQVIoZ2R0X3BhZ2UpICsgKEdEVF9FTlRSWV9FU1BGSVhfU1MgKiA4KQogCW1vdiAlZXNwLCAlZWR4CQkJLyogbG9hZCBrZXJuZWwgZXNwICovCiAJbW92IFBUX09MREVTUCglZXNwKSwgJWVheAkvKiBsb2FkIHVzZXJzcGFjZSBlc3AgKi8KIAltb3YgJWR4LCAlYXgJCQkvKiBlYXg6IG5ldyBrZXJuZWwgZXNwICovCiAJc3ViICVlYXgsICVlZHgJCQkvKiBvZmZzZXQgKGxvdyB3b3JkIGlzIDApICovCi0JUEVSX0NQVShnZHRfcGFnZSwgJWVieCkKIAlzaHIgJDE2LCAlZWR4Ci0JbW92ICVkbCwgR0RUX0VOVFJZX0VTUEZJWF9TUyAqIDggKyA0KCVlYngpIC8qIGJpdHMgMTYuLjIzICovCi0JbW92ICVkaCwgR0RUX0VOVFJZX0VTUEZJWF9TUyAqIDggKyA3KCVlYngpIC8qIGJpdHMgMjQuLjMxICovCisJbW92ICVkbCwgR0RUX0VTUEZJWF9TUyArIDQgLyogYml0cyAxNi4uMjMgKi8KKwltb3YgJWRoLCBHRFRfRVNQRklYX1NTICsgNyAvKiBiaXRzIDI0Li4zMSAqLwogCXB1c2hsICRfX0VTUEZJWF9TUwogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJcHVzaCAlZWF4CQkJLyogbmV3IGtlcm5lbCBlc3AgKi8KQEAgLTc5MSw5ICs3OTEsOCBAQAogICogbm9ybWFsIHN0YWNrIGFuZCBhZGp1c3RzIEVTUCB3aXRoIHRoZSBtYXRjaGluZyBvZmZzZXQuCiAgKi8KIAkvKiBmaXh1cCB0aGUgc3RhY2sgKi8KLQlQRVJfQ1BVKGdkdF9wYWdlLCAlZWJ4KQotCW1vdiBHRFRfRU5UUllfRVNQRklYX1NTICogOCArIDQoJWVieCksICVhbCAvKiBiaXRzIDE2Li4yMyAqLwotCW1vdiBHRFRfRU5UUllfRVNQRklYX1NTICogOCArIDcoJWVieCksICVhaCAvKiBiaXRzIDI0Li4zMSAqLworCW1vdiBHRFRfRVNQRklYX1NTICsgNCwgJWFsIC8qIGJpdHMgMTYuLjIzICovCisJbW92IEdEVF9FU1BGSVhfU1MgKyA3LCAlYWggLyogYml0cyAyNC4uMzEgKi8KIAlzaGwgJDE2LCAlZWF4CiAJYWRkbCAlZXNwLCAlZWF4CQkJLyogdGhlIGFkanVzdGVkIHN0YWNrIHBvaW50ZXIgKi8KIAlwdXNobCAkX19LRVJORUxfRFMKQEAgLTExNjYsNiArMTE2NSw5IEBACiAucHJldmlvdXMKIEVORFBST0MoeGVuX2ZhaWxzYWZlX2NhbGxiYWNrKQogCitCVUlMRF9JTlRFUlJVUFQzKHhlbl9odm1fY2FsbGJhY2tfdmVjdG9yLCBYRU5fSFZNX0VWVENITl9DQUxMQkFDSywKKwkJeGVuX2V2dGNobl9kb191cGNhbGwpCisKICNlbmRpZgkvKiBDT05GSUdfWEVOICovCiAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IDRkYjdjNGQuLmM1ZWE1Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCkBAIC0xMDY1LDYgKzEwNjUsNyBAQAogRU5EKFxzeW0pCiAuZW5kbQogCisjZGVmaW5lIElOSVRfVFNTX0lTVCh4KSBQRVJfQ1BVX1ZBUihpbml0X3RzcykgKyAoVFNTX2lzdCArICgoeCkgLSAxKSAqIDgpCiAubWFjcm8gcGFyYW5vaWR6ZXJvZW50cnlfaXN0IHN5bSBkb19zeW0gaXN0CiBFTlRSWShcc3ltKQogCUlOVFJfRlJBTUUKQEAgLTEwNzYsMTAgKzEwNzcsOSBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJbW92cSAlcnNwLCVyZGkJCS8qIHB0X3JlZ3MgcG9pbnRlciAqLwogCXhvcmwgJWVzaSwlZXNpCQkvKiBubyBlcnJvciBjb2RlICovCi0JUEVSX0NQVShpbml0X3RzcywgJXIxMikKLQlzdWJxICRFWENFUFRJT05fU1RLU1osIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcjEyKQorCXN1YnEgJEVYQ0VQVElPTl9TVEtTWiwgSU5JVF9UU1NfSVNUKFxpc3QpCiAJY2FsbCBcZG9fc3ltCi0JYWRkcSAkRVhDRVBUSU9OX1NUS1NaLCBUU1NfaXN0ICsgKFxpc3QgLSAxKSAqIDgoJXIxMikKKwlhZGRxICRFWENFUFRJT05fU1RLU1osIElOSVRfVFNTX0lTVChcaXN0KQogCWptcCBwYXJhbm9pZF9leGl0CS8qICVlYng6IG5vIHN3YXBncyBmbGFnICovCiAJQ0ZJX0VORFBST0MKIEVORChcc3ltKQpAQCAtMTMyOSw2ICsxMzI5LDkgQEAKIAlDRklfRU5EUFJPQwogRU5EKHhlbl9mYWlsc2FmZV9jYWxsYmFjaykKIAorYXBpY2ludGVycnVwdCBYRU5fSFZNX0VWVENITl9DQUxMQkFDSyBcCisJeGVuX2h2bV9jYWxsYmFja192ZWN0b3IgeGVuX2V2dGNobl9kb191cGNhbGwKKwogI2VuZGlmIC8qIENPTkZJR19YRU4gKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkMzIuYwppbmRleCBiMmUyNDYwLi43ODQzNjBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZDMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQzMi5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpMzg2X2RlZmF1bHRfZWFybHlfc2V0dXAodm9pZCkKIHsKLQkvKiBJbml0aWxpemUgMzJiaXQgc3BlY2lmaWMgc2V0dXAgZnVuY3Rpb25zICovCisJLyogSW5pdGlhbGl6ZSAzMmJpdCBzcGVjaWZpYyBzZXR1cCBmdW5jdGlvbnMgKi8KIAl4ODZfaW5pdC5yZXNvdXJjZXMucHJvYmVfcm9tcyA9IHByb2JlX3JvbXM7CiAJeDg2X2luaXQucmVzb3VyY2VzLnJlc2VydmVfcmVzb3VyY2VzID0gaTM4Nl9yZXNlcnZlX3Jlc291cmNlczsKIAl4ODZfaW5pdC5tcHBhcnNlLnNldHVwX2lvYXBpY19pZHMgPSBzZXR1cF9pb2FwaWNfaWRzX2Zyb21fbXBjOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggM2QxZTZmMS4uMjM5MDQ2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCkBAIC0yMzQsOSArMjM0LDggQEAKIAkgKiBpbml0IGRhdGEgc2VjdGlvbiB0aWxsIHBlciBjcHUgYXJlYXMgYXJlIHNldCB1cC4KIAkgKi8KIAltb3ZsCSRNU1JfR1NfQkFTRSwlZWN4Ci0JbW92cQlpbml0aWFsX2dzKCVyaXApLCVyYXgKLQltb3ZxICAgICVyYXgsJXJkeAotCXNocnEJJDMyLCVyZHgKKwltb3ZsCWluaXRpYWxfZ3MoJXJpcCksJWVheAorCW1vdmwJaW5pdGlhbF9ncys0KCVyaXApLCVlZHgKIAl3cm1zcgkKIAogCS8qIGVzaSBpcyBwb2ludGVyIHRvIHJlYWwgbW9kZSBzdHJ1Y3R1cmUgd2l0aCBpbnRlcmVzdGluZyBpbmZvLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2h3X2JyZWFrcG9pbnQuYyBiL2FyY2gveDg2L2tlcm5lbC9od19icmVha3BvaW50LmMKaW5kZXggYThmMWI4MC4uYTQ3NGVjMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2h3X2JyZWFrcG9pbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCkBAIC0yMDgsNiArMjA4LDkgQEAKIHsKIAkvKiBMZW4gKi8KIAlzd2l0Y2ggKHg4Nl9sZW4pIHsKKwljYXNlIFg4Nl9CUkVBS1BPSU5UX0xFTl9YOgorCQkqZ2VuX2xlbiA9IHNpemVvZihsb25nKTsKKwkJYnJlYWs7CiAJY2FzZSBYODZfQlJFQUtQT0lOVF9MRU5fMToKIAkJKmdlbl9sZW4gPSBIV19CUkVBS1BPSU5UX0xFTl8xOwogCQlicmVhazsKQEAgLTI1MSw2ICsyNTQsMjkgQEAKIAogCWluZm8tPmFkZHJlc3MgPSBicC0+YXR0ci5icF9hZGRyOwogCisJLyogVHlwZSAqLworCXN3aXRjaCAoYnAtPmF0dHIuYnBfdHlwZSkgeworCWNhc2UgSFdfQlJFQUtQT0lOVF9XOgorCQlpbmZvLT50eXBlID0gWDg2X0JSRUFLUE9JTlRfV1JJVEU7CisJCWJyZWFrOworCWNhc2UgSFdfQlJFQUtQT0lOVF9XIHwgSFdfQlJFQUtQT0lOVF9SOgorCQlpbmZvLT50eXBlID0gWDg2X0JSRUFLUE9JTlRfUlc7CisJCWJyZWFrOworCWNhc2UgSFdfQlJFQUtQT0lOVF9YOgorCQlpbmZvLT50eXBlID0gWDg2X0JSRUFLUE9JTlRfRVhFQ1VURTsKKwkJLyoKKwkJICogeDg2IGluc3QgYnJlYWtwb2ludHMgbmVlZCB0byBoYXZlIGEgc3BlY2lmaWMgdW5kZWZpbmVkIGxlbi4KKwkJICogQnV0IHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgdXNlcnNwYWNlIGlzIG5vdCB0cnlpbmcgdG8gc2V0dXAKKwkJICogYW4gdW5zdXBwb3J0ZWQgbGVuZ3RoLCB0byBnZXQgYSByYW5nZSBicmVha3BvaW50IGZvciBleGFtcGxlLgorCQkgKi8KKwkJaWYgKGJwLT5hdHRyLmJwX2xlbiA9PSBzaXplb2YobG9uZykpIHsKKwkJCWluZm8tPmxlbiA9IFg4Nl9CUkVBS1BPSU5UX0xFTl9YOworCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBMZW4gKi8KIAlzd2l0Y2ggKGJwLT5hdHRyLmJwX2xlbikgewogCWNhc2UgSFdfQlJFQUtQT0lOVF9MRU5fMToKQEAgLTI3MSwyMSArMjk3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogVHlwZSAqLwotCXN3aXRjaCAoYnAtPmF0dHIuYnBfdHlwZSkgewotCWNhc2UgSFdfQlJFQUtQT0lOVF9XOgotCQlpbmZvLT50eXBlID0gWDg2X0JSRUFLUE9JTlRfV1JJVEU7Ci0JCWJyZWFrOwotCWNhc2UgSFdfQlJFQUtQT0lOVF9XIHwgSFdfQlJFQUtQT0lOVF9SOgotCQlpbmZvLT50eXBlID0gWDg2X0JSRUFLUE9JTlRfUlc7Ci0JCWJyZWFrOwotCWNhc2UgSFdfQlJFQUtQT0lOVF9YOgotCQlpbmZvLT50eXBlID0gWDg2X0JSRUFLUE9JTlRfRVhFQ1VURTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAvKgpAQCAtMzA1LDYgKzMxNiw5IEBACiAJcmV0ID0gLUVJTlZBTDsKIAogCXN3aXRjaCAoaW5mby0+bGVuKSB7CisJY2FzZSBYODZfQlJFQUtQT0lOVF9MRU5fWDoKKwkJYWxpZ24gPSBzaXplb2YobG9uZykgLTE7CisJCWJyZWFrOwogCWNhc2UgWDg2X0JSRUFLUE9JTlRfTEVOXzE6CiAJCWFsaWduID0gMDsKIAkJYnJlYWs7CkBAIC00NjYsNiArNDgwLDEzIEBACiAKIAkJcGVyZl9icF9ldmVudChicCwgYXJncy0+cmVncyk7CiAKKwkJLyoKKwkJICogU2V0IHVwIHJlc3VtZSBmbGFnIHRvIGF2b2lkIGJyZWFrcG9pbnQgcmVjdXJzaW9uIHdoZW4KKwkJICogcmV0dXJuaW5nIGJhY2sgdG8gb3JpZ2luLgorCQkgKi8KKwkJaWYgKGJwLT5ody5pbmZvLnR5cGUgPT0gWDg2X0JSRUFLUE9JTlRfRVhFQ1VURSkKKwkJCWFyZ3MtPnJlZ3MtPmZsYWdzIHw9IFg4Nl9FRkxBR1NfUkY7CisKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODYva2VybmVsL2kzODcuYwppbmRleCA4NmNlZjZiLi5jNDQ0NGJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogfQogI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KIAotc3RhdGljIHZvaWQgZnB1X2Zpbml0KHN0cnVjdCBmcHUgKmZwdSkKK3ZvaWQgZnB1X2Zpbml0KHN0cnVjdCBmcHUgKmZwdSkKIHsKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJaWYgKCFIQVZFX0hXRlApIHsKQEAgLTEzMiw2ICsxMzIsNyBAQAogCQlmcC0+Zm9zID0gMHhmZmZmMDAwMHU7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoZnB1X2Zpbml0KTsKIAogLyoKICAqIFRoZSBfY3VycmVudF8gdGFzayBpcyB1c2luZyB0aGUgRlBVIGZvciB0aGUgZmlyc3QgdGltZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggNGY0YWY3NS4uZWYxMDk0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC00OSw1NSArNDksOTQgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KIAotLyoqCi0gKglwdF9yZWdzX3RvX2dkYl9yZWdzIC0gQ29udmVydCBwdHJhY2UgcmVncyB0byBHREIgcmVncwotICoJQGdkYl9yZWdzOiBBIHBvaW50ZXIgdG8gaG9sZCB0aGUgcmVnaXN0ZXJzIGluIHRoZSBvcmRlciBHREIgd2FudHMuCi0gKglAcmVnczogVGhlICZzdHJ1Y3QgcHRfcmVncyBvZiB0aGUgY3VycmVudCBwcm9jZXNzLgotICoKLSAqCUNvbnZlcnQgdGhlIHB0X3JlZ3MgaW4gQHJlZ3MgaW50byB0aGUgZm9ybWF0IGZvciByZWdpc3RlcnMgdGhhdAotICoJR0RCIGV4cGVjdHMsIHN0b3JlZCBpbiBAZ2RiX3JlZ3MuCi0gKi8KLXZvaWQgcHRfcmVnc190b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdHJ1Y3QgZGJnX3JlZ19kZWZfdCBkYmdfcmVnX2RlZltEQkdfTUFYX1JFR19OVU1dID0KIHsKLSNpZm5kZWYgQ09ORklHX1g4Nl8zMgotCXUzMiAqZ2RiX3JlZ3MzMiA9ICh1MzIgKilnZGJfcmVnczsKLSNlbmRpZgotCWdkYl9yZWdzW0dEQl9BWF0JPSByZWdzLT5heDsKLQlnZGJfcmVnc1tHREJfQlhdCT0gcmVncy0+Yng7Ci0JZ2RiX3JlZ3NbR0RCX0NYXQk9IHJlZ3MtPmN4OwotCWdkYl9yZWdzW0dEQl9EWF0JPSByZWdzLT5keDsKLQlnZGJfcmVnc1tHREJfU0ldCT0gcmVncy0+c2k7Ci0JZ2RiX3JlZ3NbR0RCX0RJXQk9IHJlZ3MtPmRpOwotCWdkYl9yZWdzW0dEQl9CUF0JPSByZWdzLT5icDsKLQlnZGJfcmVnc1tHREJfUENdCT0gcmVncy0+aXA7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotCWdkYl9yZWdzW0dEQl9QU10JPSByZWdzLT5mbGFnczsKLQlnZGJfcmVnc1tHREJfRFNdCT0gcmVncy0+ZHM7Ci0JZ2RiX3JlZ3NbR0RCX0VTXQk9IHJlZ3MtPmVzOwotCWdkYl9yZWdzW0dEQl9DU10JPSByZWdzLT5jczsKLQlnZGJfcmVnc1tHREJfRlNdCT0gMHhGRkZGOwotCWdkYl9yZWdzW0dEQl9HU10JPSAweEZGRkY7Ci0JaWYgKHVzZXJfbW9kZV92bShyZWdzKSkgewotCQlnZGJfcmVnc1tHREJfU1NdID0gcmVncy0+c3M7Ci0JCWdkYl9yZWdzW0dEQl9TUF0gPSByZWdzLT5zcDsKLQl9IGVsc2UgewotCQlnZGJfcmVnc1tHREJfU1NdID0gX19LRVJORUxfRFM7Ci0JCWdkYl9yZWdzW0dEQl9TUF0gPSBrZXJuZWxfc3RhY2tfcG9pbnRlcihyZWdzKTsKLQl9CisJeyAiYXgiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYXgpIH0sCisJeyAiY3giLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgY3gpIH0sCisJeyAiZHgiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZHgpIH0sCisJeyAiYngiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYngpIH0sCisJeyAic3AiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3ApIH0sCisJeyAiYnAiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYnApIH0sCisJeyAic2kiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc2kpIH0sCisJeyAiZGkiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZGkpIH0sCisJeyAiaXAiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaXApIH0sCisJeyAiZmxhZ3MiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZmxhZ3MpIH0sCisJeyAiY3MiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgY3MpIH0sCisJeyAic3MiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3MpIH0sCisJeyAiZHMiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZHMpIH0sCisJeyAiZXMiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZXMpIH0sCisJeyAiZnMiLCA0LCAtMSB9LAorCXsgImdzIiwgNCwgLTEgfSwKICNlbHNlCi0JZ2RiX3JlZ3NbR0RCX1I4XQk9IHJlZ3MtPnI4OwotCWdkYl9yZWdzW0dEQl9SOV0JPSByZWdzLT5yOTsKLQlnZGJfcmVnc1tHREJfUjEwXQk9IHJlZ3MtPnIxMDsKLQlnZGJfcmVnc1tHREJfUjExXQk9IHJlZ3MtPnIxMTsKLQlnZGJfcmVnc1tHREJfUjEyXQk9IHJlZ3MtPnIxMjsKLQlnZGJfcmVnc1tHREJfUjEzXQk9IHJlZ3MtPnIxMzsKLQlnZGJfcmVnc1tHREJfUjE0XQk9IHJlZ3MtPnIxNDsKLQlnZGJfcmVnc1tHREJfUjE1XQk9IHJlZ3MtPnIxNTsKLQlnZGJfcmVnczMyW0dEQl9QU10JPSByZWdzLT5mbGFnczsKLQlnZGJfcmVnczMyW0dEQl9DU10JPSByZWdzLT5jczsKLQlnZGJfcmVnczMyW0dEQl9TU10JPSByZWdzLT5zczsKLQlnZGJfcmVnc1tHREJfU1BdCT0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CisJeyAiYXgiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYXgpIH0sCisJeyAiYngiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYngpIH0sCisJeyAiY3giLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgY3gpIH0sCisJeyAiZHgiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZHgpIH0sCisJeyAic2kiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZHgpIH0sCisJeyAiZGkiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZGkpIH0sCisJeyAiYnAiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYnApIH0sCisJeyAic3AiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3ApIH0sCisJeyAicjgiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjgpIH0sCisJeyAicjkiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjkpIH0sCisJeyAicjEwIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxMCkgfSwKKwl7ICJyMTEiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjExKSB9LAorCXsgInIxMiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTIpIH0sCisJeyAicjEzIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxMykgfSwKKwl7ICJyMTQiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjE0KSB9LAorCXsgInIxNSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTUpIH0sCisJeyAiaXAiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaXApIH0sCisJeyAiZmxhZ3MiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZmxhZ3MpIH0sCisJeyAiY3MiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgY3MpIH0sCisJeyAic3MiLCA0LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3MpIH0sCiAjZW5kaWYKK307CisKK2ludCBkYmdfc2V0X3JlZyhpbnQgcmVnbm8sIHZvaWQgKm1lbSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKAorI2lmZGVmIENPTkZJR19YODZfMzIKKwkgICAgcmVnbm8gPT0gR0RCX1NTIHx8IHJlZ25vID09IEdEQl9GUyB8fCByZWdubyA9PSBHREJfR1MgfHwKKyNlbmRpZgorCSAgICByZWdubyA9PSBHREJfU1AgfHwgcmVnbm8gPT0gR0RCX09SSUdfQVgpCisJCXJldHVybiAwOworCisJaWYgKGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQgIT0gLTEpCisJCW1lbWNweSgodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0LCBtZW0sCisJCSAgICAgICBkYmdfcmVnX2RlZltyZWdub10uc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKmRiZ19nZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVnbm8gPT0gR0RCX09SSUdfQVgpIHsKKwkJbWVtY3B5KG1lbSwgJnJlZ3MtPm9yaWdfYXgsIHNpemVvZihyZWdzLT5vcmlnX2F4KSk7CisJCXJldHVybiAib3JpZ19heCI7CisJfQorCWlmIChyZWdubyA+PSBEQkdfTUFYX1JFR19OVU0gfHwgcmVnbm8gPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0ICE9IC0xKQorCQltZW1jcHkobWVtLCAodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0LAorCQkgICAgICAgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCisJc3dpdGNoIChyZWdubykgeworI2lmZGVmIENPTkZJR19YODZfMzIKKwljYXNlIEdEQl9TUzoKKwkJaWYgKCF1c2VyX21vZGVfdm0ocmVncykpCisJCQkqKHVuc2lnbmVkIGxvbmcgKiltZW0gPSBfX0tFUk5FTF9EUzsKKwkJYnJlYWs7CisJY2FzZSBHREJfU1A6CisJCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKQorCQkJKih1bnNpZ25lZCBsb25nICopbWVtID0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CisJCWJyZWFrOworCWNhc2UgR0RCX0dTOgorCWNhc2UgR0RCX0ZTOgorCQkqKHVuc2lnbmVkIGxvbmcgKiltZW0gPSAweEZGRkY7CisJCWJyZWFrOworI2VuZGlmCisJfQorCXJldHVybiBkYmdfcmVnX2RlZltyZWdub10ubmFtZTsKIH0KIAogLyoqCkBAIC0xNTAsNTQgKzE4OSwxMyBAQAogCWdkYl9yZWdzW0dEQl9TUF0JPSBwLT50aHJlYWQuc3A7CiB9CiAKLS8qKgotICoJZ2RiX3JlZ3NfdG9fcHRfcmVncyAtIENvbnZlcnQgR0RCIHJlZ3MgdG8gcHRyYWNlIHJlZ3MuCi0gKglAZ2RiX3JlZ3M6IEEgcG9pbnRlciB0byBob2xkIHRoZSByZWdpc3RlcnMgd2UndmUgcmVjZWl2ZWQgZnJvbSBHREIuCi0gKglAcmVnczogQSBwb2ludGVyIHRvIGEgJnN0cnVjdCBwdF9yZWdzIHRvIGhvbGQgdGhlc2UgdmFsdWVzIGluLgotICoKLSAqCUNvbnZlcnQgdGhlIEdEQiByZWdzIGluIEBnZGJfcmVncyBpbnRvIHRoZSBwdF9yZWdzLCBhbmQgc3RvcmUgdGhlbQotICoJaW4gQHJlZ3MuCi0gKi8KLXZvaWQgZ2RiX3JlZ3NfdG9fcHRfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0jaWZuZGVmIENPTkZJR19YODZfMzIKLQl1MzIgKmdkYl9yZWdzMzIgPSAodTMyICopZ2RiX3JlZ3M7Ci0jZW5kaWYKLQlyZWdzLT5heAkJPSBnZGJfcmVnc1tHREJfQVhdOwotCXJlZ3MtPmJ4CQk9IGdkYl9yZWdzW0dEQl9CWF07Ci0JcmVncy0+Y3gJCT0gZ2RiX3JlZ3NbR0RCX0NYXTsKLQlyZWdzLT5keAkJPSBnZGJfcmVnc1tHREJfRFhdOwotCXJlZ3MtPnNpCQk9IGdkYl9yZWdzW0dEQl9TSV07Ci0JcmVncy0+ZGkJCT0gZ2RiX3JlZ3NbR0RCX0RJXTsKLQlyZWdzLT5icAkJPSBnZGJfcmVnc1tHREJfQlBdOwotCXJlZ3MtPmlwCQk9IGdkYl9yZWdzW0dEQl9QQ107Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXJlZ3MtPmZsYWdzCQk9IGdkYl9yZWdzW0dEQl9QU107Ci0JcmVncy0+ZHMJCT0gZ2RiX3JlZ3NbR0RCX0RTXTsKLQlyZWdzLT5lcwkJPSBnZGJfcmVnc1tHREJfRVNdOwotCXJlZ3MtPmNzCQk9IGdkYl9yZWdzW0dEQl9DU107Ci0jZWxzZQotCXJlZ3MtPnI4CQk9IGdkYl9yZWdzW0dEQl9SOF07Ci0JcmVncy0+cjkJCT0gZ2RiX3JlZ3NbR0RCX1I5XTsKLQlyZWdzLT5yMTAJCT0gZ2RiX3JlZ3NbR0RCX1IxMF07Ci0JcmVncy0+cjExCQk9IGdkYl9yZWdzW0dEQl9SMTFdOwotCXJlZ3MtPnIxMgkJPSBnZGJfcmVnc1tHREJfUjEyXTsKLQlyZWdzLT5yMTMJCT0gZ2RiX3JlZ3NbR0RCX1IxM107Ci0JcmVncy0+cjE0CQk9IGdkYl9yZWdzW0dEQl9SMTRdOwotCXJlZ3MtPnIxNQkJPSBnZGJfcmVnc1tHREJfUjE1XTsKLQlyZWdzLT5mbGFncwkJPSBnZGJfcmVnczMyW0dEQl9QU107Ci0JcmVncy0+Y3MJCT0gZ2RiX3JlZ3MzMltHREJfQ1NdOwotCXJlZ3MtPnNzCQk9IGdkYl9yZWdzMzJbR0RCX1NTXTsKLSNlbmRpZgotfQotCiBzdGF0aWMgc3RydWN0IGh3X2JyZWFrcG9pbnQgewogCXVuc2lnbmVkCQllbmFibGVkOwogCXVuc2lnbmVkIGxvbmcJCWFkZHI7CiAJaW50CQkJbGVuOwogCWludAkJCXR5cGU7CiAJc3RydWN0IHBlcmZfZXZlbnQJKipwZXY7Ci19IGJyZWFraW5mb1s0XTsKK30gYnJlYWtpbmZvW0hCUF9OVU1dOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlYXJseV9kcjc7CiAKQEAgLTIwNSw3ICsyMDMsNyBAQAogewogCWludCBicmVha25vOwogCi0JZm9yIChicmVha25vID0gMDsgYnJlYWtubyA8IDQ7IGJyZWFrbm8rKykgeworCWZvciAoYnJlYWtubyA9IDA7IGJyZWFrbm8gPCBIQlBfTlVNOyBicmVha25vKyspIHsKIAkJc3RydWN0IHBlcmZfZXZlbnQgKmJwOwogCQlzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50ICppbmZvOwogCQlpbnQgdmFsOwpAQCAtMjkyLDEwICsyOTAsMTAgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJZm9yIChpID0gMDsgaSA8IEhCUF9OVU07IGkrKykKIAkJaWYgKGJyZWFraW5mb1tpXS5hZGRyID09IGFkZHIgJiYgYnJlYWtpbmZvW2ldLmVuYWJsZWQpCiAJCQlicmVhazsKLQlpZiAoaSA9PSA0KQorCWlmIChpID09IEhCUF9OVU0pCiAJCXJldHVybiAtMTsKIAogCWlmIChod19icmVha19yZWxlYXNlX3Nsb3QoaSkpIHsKQEAgLTMxMyw3ICszMTEsNyBAQAogCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBwZXJmX2V2ZW50ICpicDsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgSEJQX05VTTsgaSsrKSB7CiAJCWlmICghYnJlYWtpbmZvW2ldLmVuYWJsZWQpCiAJCQljb250aW51ZTsKIAkJYnAgPSAqcGVyX2NwdV9wdHIoYnJlYWtpbmZvW2ldLnBldiwgY3B1KTsKQEAgLTMzMywxMCArMzMxLDEwIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBIQlBfTlVNOyBpKyspCiAJCWlmICghYnJlYWtpbmZvW2ldLmVuYWJsZWQpCiAJCQlicmVhazsKLQlpZiAoaSA9PSA0KQorCWlmIChpID09IEhCUF9OVU0pCiAJCXJldHVybiAtMTsKIAogCXN3aXRjaCAoYnB0eXBlKSB7CkBAIC0zOTcsNyArMzk1LDcgQEAKIAogCS8qIERpc2FibGUgaGFyZHdhcmUgZGVidWdnaW5nIHdoaWxlIHdlIGFyZSBpbiBrZ2RiOiAqLwogCXNldF9kZWJ1Z3JlZygwVUwsIDcpOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgSEJQX05VTTsgaSsrKSB7CiAJCWlmICghYnJlYWtpbmZvW2ldLmVuYWJsZWQpCiAJCQljb250aW51ZTsKIAkJaWYgKGRiZ19pc19lYXJseSkgewpAQCAtNDU4LDcgKzQ1Niw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCWNoYXIgKnB0cjsKLQlpbnQgbmV3UEM7CiAKIAlzd2l0Y2ggKHJlbWNvbUluQnVmZmVyWzBdKSB7CiAJY2FzZSAnYyc6CkBAIC00NjksOCArNDY2LDYgQEAKIAkJCWxpbnV4X3JlZ3MtPmlwID0gYWRkcjsKIAljYXNlICdEJzoKIAljYXNlICdrJzoKLQkJbmV3UEMgPSBsaW51eF9yZWdzLT5pcDsKLQogCQkvKiBjbGVhciB0aGUgdHJhY2UgYml0ICovCiAJCWxpbnV4X3JlZ3MtPmZsYWdzICY9IH5YODZfRUZMQUdTX1RGOwogCQlhdG9taWNfc2V0KCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCwgLTEpOwpAQCAtNTcyLDcgKzU2Nyw2IEBACiAJcmV0dXJuIE5PVElGWV9TVE9QOwogfQogCi0jaWZkZWYgQ09ORklHX0tHREJfTE9XX0xFVkVMX1RSQVAKIGludCBrZ2RiX2xsX3RyYXAoaW50IGNtZCwgY29uc3QgY2hhciAqc3RyLAogCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyLCBpbnQgdHJhcCwgaW50IHNpZykKIHsKQEAgLTU5MCw3ICs1ODQsNiBAQAogCiAJcmV0dXJuIF9fa2dkYl9ub3RpZnkoJmFyZ3MsIGNtZCk7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0tHREJfTE9XX0xFVkVMX1RSQVAgKi8KIAogc3RhdGljIGludAoga2dkYl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqcHRyKQpAQCAtNjI1LDYgKzYxOCwxMiBAQAogCXJldHVybiByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtnZGJfbm90aWZpZXIpOwogfQogCitzdGF0aWMgdm9pZCBrZ2RiX2h3X292ZXJmbG93X2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbm1pLAorCQlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa2dkYl9sbF90cmFwKERJRV9ERUJVRywgImRlYnVnIiwgcmVncywgMCwgMCwgU0lHVFJBUCk7Cit9CisKIHZvaWQga2dkYl9hcmNoX2xhdGUodm9pZCkKIHsKIAlpbnQgaSwgY3B1OwpAQCAtNjQxLDcgKzY0MCw3IEBACiAJYXR0ci5icF9sZW4gPSBIV19CUkVBS1BPSU5UX0xFTl8xOwogCWF0dHIuYnBfdHlwZSA9IEhXX0JSRUFLUE9JTlRfVzsKIAlhdHRyLmRpc2FibGVkID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEhCUF9OVU07IGkrKykgewogCQlpZiAoYnJlYWtpbmZvW2ldLnBldikKIAkJCWNvbnRpbnVlOwogCQlicmVha2luZm9baV0ucGV2ID0gcmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KCZhdHRyLCBOVUxMKTsKQEAgLTY1NSw2ICs2NTQsNyBAQAogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQkJcGV2ZW50ID0gcGVyX2NwdV9wdHIoYnJlYWtpbmZvW2ldLnBldiwgY3B1KTsKIAkJCXBldmVudFswXS0+aHcuc2FtcGxlX3BlcmlvZCA9IDE7CisJCQlwZXZlbnRbMF0tPm92ZXJmbG93X2hhbmRsZXIgPSBrZ2RiX2h3X292ZXJmbG93X2hhbmRsZXI7CiAJCQlpZiAocGV2ZW50WzBdLT5kZXN0cm95ICE9IE5VTEwpIHsKIAkJCQlwZXZlbnRbMF0tPmRlc3Ryb3kgPSBOVUxMOwogCQkJCXJlbGVhc2VfYnBfc2xvdCgqcGV2ZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDY3NTg3OWIuLjFiZmI2Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYwpAQCAtMTI2LDE2ICsxMjYsMjIgQEAKIH0KIAogLyoKLSAqIENoZWNrIGZvciB0aGUgUkVYIHByZWZpeCB3aGljaCBjYW4gb25seSBleGlzdCBvbiBYODZfNjQKLSAqIFg4Nl8zMiBhbHdheXMgcmV0dXJucyAwCisgKiBTa2lwIHRoZSBwcmVmaXhlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgX19rcHJvYmVzIGlzX1JFWF9wcmVmaXgoa3Byb2JlX29wY29kZV90ICppbnNuKQorc3RhdGljIGtwcm9iZV9vcGNvZGVfdCAqX19rcHJvYmVzIHNraXBfcHJlZml4ZXMoa3Byb2JlX29wY29kZV90ICppbnNuKQogeworCWluc25fYXR0cl90IGF0dHI7CisKKwlhdHRyID0gaW5hdF9nZXRfb3Bjb2RlX2F0dHJpYnV0ZSgoaW5zbl9ieXRlX3QpKmluc24pOworCXdoaWxlIChpbmF0X2lzX2xlZ2FjeV9wcmVmaXgoYXR0cikpIHsKKwkJaW5zbisrOworCQlhdHRyID0gaW5hdF9nZXRfb3Bjb2RlX2F0dHJpYnV0ZSgoaW5zbl9ieXRlX3QpKmluc24pOworCX0KICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JaWYgKCgqaW5zbiAmIDB4ZjApID09IDB4NDApCi0JCXJldHVybiAxOworCWlmIChpbmF0X2lzX3JleF9wcmVmaXgoYXR0cikpCisJCWluc24rKzsKICNlbmRpZgotCXJldHVybiAwOworCXJldHVybiBpbnNuOwogfQogCiAvKgpAQCAtMjcyLDYgKzI3OCw5IEBACiAgKi8KIHN0YXRpYyBpbnQgX19rcHJvYmVzIGlzX0lGX21vZGlmaWVyKGtwcm9iZV9vcGNvZGVfdCAqaW5zbikKIHsKKwkvKiBTa2lwIHByZWZpeGVzICovCisJaW5zbiA9IHNraXBfcHJlZml4ZXMoaW5zbik7CisKIAlzd2l0Y2ggKCppbnNuKSB7CiAJY2FzZSAweGZhOgkJLyogY2xpICovCiAJY2FzZSAweGZiOgkJLyogc3RpICovCkBAIC0yODAsMTMgKzI4OSw2IEBACiAJCXJldHVybiAxOwogCX0KIAotCS8qCi0JICogb24gWDg2XzY0LCAweDQwLTB4NGYgYXJlIFJFWCBwcmVmaXhlcyBzbyB3ZSBuZWVkIHRvIGxvb2sKLQkgKiBhdCB0aGUgbmV4dCBieXRlIGluc3RlYWQuLiBidXQgb2YgY291cnNlIG5vdCByZWN1cnNlIGluZmluaXRlbHkKLQkgKi8KLQlpZiAoaXNfUkVYX3ByZWZpeChpbnNuKSkKLQkJcmV0dXJuIGlzX0lGX21vZGlmaWVyKCsraW5zbik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODAzLDkgKzgwNSw4IEBACiAJdW5zaWduZWQgbG9uZyBvcmlnX2lwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKIAlrcHJvYmVfb3Bjb2RlX3QgKmluc24gPSBwLT5haW5zbi5pbnNuOwogCi0JLypza2lwIHRoZSBSRVggcHJlZml4Ki8KLQlpZiAoaXNfUkVYX3ByZWZpeChpbnNuKSkKLQkJaW5zbisrOworCS8qIFNraXAgcHJlZml4ZXMgKi8KKwlpbnNuID0gc2tpcF9wcmVmaXhlcyhpbnNuKTsKIAogCXJlZ3MtPmZsYWdzICY9IH5YODZfRUZMQUdTX1RGOwogCXN3aXRjaCAoKmluc24pIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcnN0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXJzdC5jCmluZGV4IDU5MTVlMGIuLjc5YWU2ODEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcnN0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL21yc3QuYwpAQCAtMjUsOCArMjUsMzQgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vYXBiX3RpbWVyLmg+CiAKKy8qCisgKiB0aGUgY2xvY2tldmVudCBkZXZpY2VzIG9uIE1vb3Jlc3Rvd24vTWVkZmllbGQgY2FuIGJlIEFQQlQgb3IgTEFQSUMgY2xvY2ssCisgKiBjbWRsaW5lIG9wdGlvbiB4ODZfbXJzdF90aW1lciBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgY29uZmlndXJhdGlvbgorICogdG8gcHJlZmVyIG9uZSBvciB0aGUgb3RoZXIuCisgKiBhdCBydW50aW1lLCB0aGVyZSBhcmUgYmFzaWNhbGx5IHRocmVlIHRpbWVyIGNvbmZpZ3VyYXRpb25zOgorICogMS4gcGVyIGNwdSBhcGJ0IGNsb2NrIG9ubHkKKyAqIDIuIHBlciBjcHUgYWx3YXlzLW9uIGxhcGljIGNsb2NrcyBvbmx5LCB0aGlzIGlzIFBlbndlbGwvTWVkZmllbGQgb25seQorICogMy4gcGVyIGNwdSBsYXBpYyBjbG9jayAoQzNTVE9QKSBhbmQgb25lIGFwYnQgY2xvY2ssIHdpdGggYnJvYWRjYXN0LgorICoKKyAqIGJ5IGRlZmF1bHQgKHdpdGhvdXQgY21kbGluZSBvcHRpb24pLCBwbGF0Zm9ybSBjb2RlIGZpcnN0IGRldGVjdHMgY3B1IHR5cGUKKyAqIHRvIHNlZSBpZiB3ZSBhcmUgb24gbGluY3JvZnQgb3IgcGVud2VsbCwgdGhlbiBzZXQgdXAgYm90aCBsYXBpYyBvciBhcGJ0CisgKiBjbG9ja3MgYWNjb3JkaW5nbHkuCisgKiBpLmUuIGJ5IGRlZmF1bHQsIG1lZGZpZWxkIHVzZXMgY29uZmlndXJhdGlvbiAjMiwgbW9vcmVzdG93biB1c2VzICMxLgorICogY29uZmlnICMzIGlzIHN1cHBvcnRlZCBidXQgbm90IHJlY29tbWVuZGVkIG9uIG1lZGZpZWxkLgorICoKKyAqIHJhdGluZyBhbmQgZmVhdHVyZSBzdW1tYXJ5OgorICogbGFwaWMgKHdpdGggQzNTVE9QKSAtLS0tLS0tLS0gMTAwCisgKiBhcGJ0IChhbHdheXMtb24pIC0tLS0tLS0tLS0tLSAxMTAKKyAqIGxhcGljIChhbHdheXMtb24sQVJBVCkgLS0tLS0tIDE1MAorICovCisKK19fY3B1aW5pdGRhdGEgZW51bSBtcnN0X3RpbWVyX29wdGlvbnMgbXJzdF90aW1lcl9vcHRpb25zOworCiBzdGF0aWMgdTMyIHNmaV9tdGltZXJfdXNhZ2VbU0ZJX01UTVJfTUFYX05VTV07CiBzdGF0aWMgc3RydWN0IHNmaV90aW1lcl90YWJsZV9lbnRyeSBzZmlfbXRpbWVyX2FycmF5W1NGSV9NVE1SX01BWF9OVU1dOworZW51bSBtcnN0X2NwdV90eXBlIF9fbXJzdF9jcHVfY2hpcDsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fbXJzdF9jcHVfY2hpcCk7CisKIGludCBzZmlfbXRpbWVyX251bTsKIAogc3RydWN0IHNmaV9ydGNfdGFibGVfZW50cnkgc2ZpX21ydGNfYXJyYXlbU0ZJX01SVENfTUFYXTsKQEAgLTE2NywxOCArMTkzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIHRoZSBzZWNvbmRhcnkgY2xvY2sgaW4gTW9vcmVzdG93biBjYW4gYmUgQVBCVCBvciBMQVBJQyBjbG9jaywgZGVmYXVsdCB0bwotICogQVBCVCBidXQgY21kbGluZSBvcHRpb24gY2FuIGFsc28gb3ZlcnJpZGUgaXQuCi0gKi8KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBtcnN0X3NldHVwX3NlY29uZGFyeV9jbG9jayh2b2lkKQotewotCS8qIHJlc3RvcmUgZGVmYXVsdCBsYXBpYyBjbG9jayBpZiBkaXNhYmxlZCBieSBjbWRsaW5lICovCi0JaWYgKGRpc2FibGVfYXBidF9wZXJjcHUpCi0JCXJldHVybiBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jaygpOwotCWFwYnRfc2V0dXBfc2Vjb25kYXJ5X2Nsb2NrKCk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBtcnN0X2NhbGlicmF0ZV90c2Modm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBmYXN0X2NhbGlicmF0ZTsKQEAgLTE5NSw2ICsyMDksMjEgQEAKIAogdm9pZCBfX2luaXQgbXJzdF90aW1lX2luaXQodm9pZCkKIHsKKwlzd2l0Y2ggKG1yc3RfdGltZXJfb3B0aW9ucykgeworCWNhc2UgTVJTVF9USU1FUl9BUEJUX09OTFk6CisJCWJyZWFrOworCWNhc2UgTVJTVF9USU1FUl9MQVBJQ19BUEJUOgorCQl4ODZfaW5pdC50aW1lcnMuc2V0dXBfcGVyY3B1X2Nsb2NrZXYgPSBzZXR1cF9ib290X0FQSUNfY2xvY2s7CisJCXg4Nl9jcHVpbml0LnNldHVwX3BlcmNwdV9jbG9ja2V2ID0gc2V0dXBfc2Vjb25kYXJ5X0FQSUNfY2xvY2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FSQVQpKQorCQkJYnJlYWs7CisJCXg4Nl9pbml0LnRpbWVycy5zZXR1cF9wZXJjcHVfY2xvY2tldiA9IHNldHVwX2Jvb3RfQVBJQ19jbG9jazsKKwkJeDg2X2NwdWluaXQuc2V0dXBfcGVyY3B1X2Nsb2NrZXYgPSBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jazsKKwkJcmV0dXJuOworCX0KKwkvKiB3ZSBuZWVkIGF0IGxlYXN0IG9uZSBBUEIgdGltZXIgKi8KIAlzZmlfdGFibGVfcGFyc2UoU0ZJX1NJR19NVE1SLCBOVUxMLCBOVUxMLCBzZmlfcGFyc2VfbXRtcik7CiAJcHJlX2luaXRfYXBpY19JUlEwKCk7CiAJYXBidF90aW1lX2luaXQoKTsKQEAgLTIwNSwxNiArMjM0LDIxIEBACiAJc2ZpX3RhYmxlX3BhcnNlKFNGSV9TSUdfTVJUQywgTlVMTCwgTlVMTCwgc2ZpX3BhcnNlX21ydGMpOwogfQogCi0vKgotICogaWYgd2UgdXNlIHBlciBjcHUgYXBiIHRpbWVyLCB0aGUgYm9vdGNsb2NrIGFscmVhZHkgc2V0dXAuIGlmIHdlIHVzZSBsYXBpYwotICogdGltZXIgYW5kIG9uZSBhcGJ0IHRpbWVyIGZvciBicm9hZGNhc3QsIHdlIG5lZWQgdG8gc2V0IHVwIGxhcGljIGJvb3QgY2xvY2suCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBtcnN0X3NldHVwX2Jvb3RfY2xvY2sodm9pZCkKK3ZvaWQgX19jcHVpbml0IG1yc3RfYXJjaF9zZXR1cCh2b2lkKQogewotCXByX2luZm8oIiVzOiBwZXIgY3B1IGFwYnQgZmxhZyAlZCBcbiIsIF9fZnVuY19fLCBkaXNhYmxlX2FwYnRfcGVyY3B1KTsKLQlpZiAoZGlzYWJsZV9hcGJ0X3BlcmNwdSkKLQkJc2V0dXBfYm9vdF9BUElDX2Nsb2NrKCk7Ci19OworCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDB4MjcpCisJCV9fbXJzdF9jcHVfY2hpcCA9IE1SU1RfQ1BVX0NISVBfUEVOV0VMTDsKKwllbHNlIGlmIChib290X2NwdV9kYXRhLng4NiA9PSA2ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDB4MjYpCisJCV9fbXJzdF9jcHVfY2hpcCA9IE1SU1RfQ1BVX0NISVBfTElOQ1JPRlQ7CisJZWxzZSB7CisJCXByX2VycigiVW5rbm93biBNb29yZXN0b3duIENQVSAoJWQ6JWQpLCBkZWZhdWx0IHRvIExpbmNyb2Z0XG4iLAorCQkJYm9vdF9jcHVfZGF0YS54ODYsIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsKTsKKwkJX19tcnN0X2NwdV9jaGlwID0gTVJTVF9DUFVfQ0hJUF9MSU5DUk9GVDsKKwl9CisJcHJfZGVidWcoIk1vb3Jlc3Rvd24gQ1BVICVzIGlkZW50aWZpZWRcbiIsCisJCShfX21yc3RfY3B1X2NoaXAgPT0gTVJTVF9DUFVfQ0hJUF9MSU5DUk9GVCkgPworCQkiTGluY3JvZnQiIDogIlBlbndlbGwiKTsKK30KIAogLyogTUlEIHN5c3RlbXMgZG9uJ3QgaGF2ZSBpODA0MiBjb250cm9sbGVyICovCiBzdGF0aWMgaW50IG1yc3RfaTgwNDJfZGV0ZWN0KHZvaWQpCkBAIC0yMzIsMTEgKzI2NiwxMyBAQAogCXg4Nl9pbml0LnJlc291cmNlcy5yZXNlcnZlX3Jlc291cmNlcyA9IHg4Nl9pbml0X25vb3A7CiAKIAl4ODZfaW5pdC50aW1lcnMudGltZXJfaW5pdCA9IG1yc3RfdGltZV9pbml0OwotCXg4Nl9pbml0LnRpbWVycy5zZXR1cF9wZXJjcHVfY2xvY2tldiA9IG1yc3Rfc2V0dXBfYm9vdF9jbG9jazsKKwl4ODZfaW5pdC50aW1lcnMuc2V0dXBfcGVyY3B1X2Nsb2NrZXYgPSB4ODZfaW5pdF9ub29wOwogCiAJeDg2X2luaXQuaXJxcy5wcmVfdmVjdG9yX2luaXQgPSB4ODZfaW5pdF9ub29wOwogCi0JeDg2X2NwdWluaXQuc2V0dXBfcGVyY3B1X2Nsb2NrZXYgPSBtcnN0X3NldHVwX3NlY29uZGFyeV9jbG9jazsKKwl4ODZfaW5pdC5vZW0uYXJjaF9zZXR1cCA9IG1yc3RfYXJjaF9zZXR1cDsKKworCXg4Nl9jcHVpbml0LnNldHVwX3BlcmNwdV9jbG9ja2V2ID0gYXBidF9zZXR1cF9zZWNvbmRhcnlfY2xvY2s7CiAKIAl4ODZfcGxhdGZvcm0uY2FsaWJyYXRlX3RzYyA9IG1yc3RfY2FsaWJyYXRlX3RzYzsKIAl4ODZfcGxhdGZvcm0uaTgwNDJfZGV0ZWN0ID0gbXJzdF9pODA0Ml9kZXRlY3Q7CkBAIC0yNTAsMyArMjg2LDI2IEBACiAJeDg2X2luaXQubXBwYXJzZS5nZXRfc21wX2NvbmZpZyA9IHg4Nl9pbml0X3VpbnRfbm9vcDsKIAogfQorCisvKgorICogaWYgdXNlciBkb2VzIG5vdCB3YW50IHRvIHVzZSBwZXIgQ1BVIGFwYiB0aW1lciwganVzdCBnaXZlIGl0IGEgbG93ZXIgcmF0aW5nCisgKiB0aGFuIGxvY2FsIGFwaWMgdGltZXIgYW5kIHNraXAgdGhlIGxhdGUgcGVyIGNwdSB0aW1lciBpbml0LgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgc2V0dXBfeDg2X21yc3RfdGltZXIoY2hhciAqYXJnKQoreworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJjbXAoImFwYnRfb25seSIsIGFyZykgPT0gMCkKKwkJbXJzdF90aW1lcl9vcHRpb25zID0gTVJTVF9USU1FUl9BUEJUX09OTFk7CisJZWxzZSBpZiAoc3RyY21wKCJsYXBpY19hbmRfYXBidCIsIGFyZykgPT0gMCkKKwkJbXJzdF90aW1lcl9vcHRpb25zID0gTVJTVF9USU1FUl9MQVBJQ19BUEJUOworCWVsc2UgeworCQlwcl93YXJuaW5nKCJYODYgTVJTVCB0aW1lciBvcHRpb24gJXMgbm90IHJlY29nbmlzZWQiCisJCQkgICAiIHVzZSB4ODZfbXJzdF90aW1lcj1hcGJ0X29ubHkgb3IgbGFwaWNfYW5kX2FwYnRcbiIsCisJCQkgICBhcmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJ4ODZfbXJzdF90aW1lcj0iLCBzZXR1cF94ODZfbXJzdF90aW1lcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlN2UzNTIxLi5kNDAxZjFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI4LDYgKzI4LDcgQEAKIEVYUE9SVF9TWU1CT0woaWRsZV9ub213YWl0KTsKIAogc3RydWN0IGttZW1fY2FjaGUgKnRhc2tfeHN0YXRlX2NhY2hlcDsKK0VYUE9SVF9TWU1CT0xfR1BMKHRhc2tfeHN0YXRlX2NhY2hlcCk7CiAKIGludCBhcmNoX2R1cF90YXNrX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmRzdCwgc3RydWN0IHRhc2tfc3RydWN0ICpzcmMpCiB7CkBAIC0zNzEsNyArMzcyLDcgQEAKIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCiB7CiAJaWYgKGhsdF91c2VfaGFsdCgpKSB7Ci0JCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgMSk7CisJCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJj0gflRTX1BPTExJTkc7CiAJCS8qCiAJCSAqIFRTX1BPTExJTkctY2xlYXJlZCBzdGF0ZSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdlCkBAIC00NDEsNyArNDQyLDcgQEAKICAqLwogdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBheCwgdW5zaWduZWQgbG9uZyBjeCkKIHsKLQl0cmFjZV9wb3dlcl9zdGFydChQT1dFUl9DU1RBVEUsIChheD4+NCkrMSk7CisJdHJhY2VfcG93ZXJfc3RhcnQoUE9XRVJfQ1NUQVRFLCAoYXg+PjQpKzEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQlpZiAoY3B1X2hhcygmY3VycmVudF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfQ0xGTFVTSF9NT05JVE9SKSkKIAkJCWNsZmx1c2goKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyk7CkBAIC00NTcsNyArNDU4LDcgQEAKIHN0YXRpYyB2b2lkIG13YWl0X2lkbGUodm9pZCkKIHsKIAlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgMSk7CisJCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkJaWYgKGNwdV9oYXMoJmN1cnJlbnRfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0NMRkxVU0hfTU9OSVRPUikpCiAJCQljbGZsdXNoKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MpOwogCkBAIC00NzgsNyArNDc5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcG9sbF9pZGxlKHZvaWQpCiB7Ci0JdHJhY2VfcG93ZXJfc3RhcnQoUE9XRVJfQ1NUQVRFLCAwKTsKKwl0cmFjZV9wb3dlcl9zdGFydChQT1dFUl9DU1RBVEUsIDAsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCiAJCWNwdV9yZWxheCgpOwpAQCAtNTI1LDQ0ICs1MjYsMTAgQEAKIAlyZXR1cm4gKGVkeCAmIE1XQUlUX0VEWF9DMSk7CiB9CiAKLS8qCi0gKiBDaGVjayBmb3IgQU1EIENQVXMsIHdoZXJlIEFQSUMgdGltZXIgaW50ZXJydXB0IGRvZXMgbm90IHdha2UgdXAgQ1BVIGZyb20gQzFlLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCi0gKiAtIEVycmF0dW0gIzQwMCBmb3IgTlBUIGZhbWlseSAweGYgYW5kIGZhbWlseSAweDEwIENQVXMKLSAqIC0gRXJyYXR1bSAjMzY1IGZvciBmYW1pbHkgMHgxMSAobm90IGFmZmVjdGVkIGJlY2F1c2UgQzFlIG5vdCBpbiB1c2UpCi0gKi8KLXN0YXRpYyBpbnQgX19jcHVpbml0IGNoZWNrX2MxZV9pZGxlKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQl1NjQgdmFsOwotCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKQotCQlnb3RvIG5vX2MxZV9pZGxlOwotCi0JLyogRmFtaWx5IDB4MGYgbW9kZWxzIDwgcmV2IEYgZG8gbm90IGhhdmUgQzFFICovCi0JaWYgKGMtPng4NiA9PSAweDBGICYmIGMtPng4Nl9tb2RlbCA+PSAweDQwKQotCQlyZXR1cm4gMTsKLQotCWlmIChjLT54ODYgPT0gMHgxMCkgewotCQkvKgotCQkgKiBjaGVjayBPU1ZXIGJpdCBmb3IgQ1BVcyB0aGF0IGFyZSBub3QgYWZmZWN0ZWQKLQkJICogYnkgZXJyYXR1bSAjNDAwCi0JCSAqLwotCQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9PU1ZXKSkgewotCQkJcmRtc3JsKE1TUl9BTUQ2NF9PU1ZXX0lEX0xFTkdUSCwgdmFsKTsKLQkJCWlmICh2YWwgPj0gMikgewotCQkJCXJkbXNybChNU1JfQU1ENjRfT1NWV19TVEFUVVMsIHZhbCk7Ci0JCQkJaWYgKCEodmFsICYgQklUKDEpKSkKLQkJCQkJZ290byBub19jMWVfaWRsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLW5vX2MxZV9pZGxlOgotCXJldHVybiAwOwotfQorYm9vbCBjMWVfZGV0ZWN0ZWQ7CitFWFBPUlRfU1lNQk9MKGMxZV9kZXRlY3RlZCk7CiAKIHN0YXRpYyBjcHVtYXNrX3Zhcl90IGMxZV9tYXNrOwotc3RhdGljIGludCBjMWVfZGV0ZWN0ZWQ7CiAKIHZvaWQgYzFlX3JlbW92ZV9jcHUoaW50IGNwdSkKIHsKQEAgLTU4NCwxMiArNTUxLDEyIEBACiAJCXUzMiBsbywgaGk7CiAKIAkJcmRtc3IoTVNSX0s4X0lOVF9QRU5ESU5HX01TRywgbG8sIGhpKTsKKwogCQlpZiAobG8gJiBLOF9JTlRQX0MxRV9BQ1RJVkVfTUFTSykgewotCQkJYzFlX2RldGVjdGVkID0gMTsKKwkJCWMxZV9kZXRlY3RlZCA9IHRydWU7CiAJCQlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9OT05TVE9QX1RTQykpCiAJCQkJbWFya190c2NfdW5zdGFibGUoIlRTQyBoYWx0IGluIEFNRCBDMUUiKTsKIAkJCXByaW50ayhLRVJOX0lORk8gIlN5c3RlbSBoYXMgQU1EIEMxRSBlbmFibGVkXG4iKTsKLQkJCXNldF9jcHVfY2FwKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BTURDMUUpOwogCQl9CiAJfQogCkBAIC02MzgsNyArNjA1LDggQEAKIAkJICovCiAJCXByaW50ayhLRVJOX0lORk8gInVzaW5nIG13YWl0IGluIGlkbGUgdGhyZWFkcy5cbiIpOwogCQlwbV9pZGxlID0gbXdhaXRfaWRsZTsKLQl9IGVsc2UgaWYgKGNoZWNrX2MxZV9pZGxlKGMpKSB7CisJfSBlbHNlIGlmIChjcHVfaGFzX2FtZF9lcnJhdHVtKGFtZF9lcnJhdHVtXzQwMCkpIHsKKwkJLyogRTQwMDogQVBJQyB0aW1lciBpbnRlcnJ1cHQgZG9lcyBub3Qgd2FrZSB1cCBDUFUgZnJvbSBDMWUgKi8KIAkJcHJpbnRrKEtFUk5fSU5GTyAidXNpbmcgQzFFIGF3YXJlIGlkbGUgcm91dGluZVxuIik7CiAJCXBtX2lkbGUgPSBjMWVfaWRsZTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDhkMTI4NzguLjk2NTg2YzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtNTcsNiArNTcsOCBAQAogI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CisKIGFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2ZvcmsiKTsKIAogLyoKQEAgLTExMSw2ICsxMTMsOCBAQAogCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7CiAJCQlwbV9pZGxlKCk7CiAJCQlzdGFydF9jcml0aWNhbF90aW1pbmdzKCk7CisKKwkJCXRyYWNlX3Bvd2VyX2VuZChzbXBfcHJvY2Vzc29yX2lkKCkpOwogCQl9CiAJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKaW5kZXggM2MyNDIyYS4uM2Q5ZWE1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC01MSw2ICs1MSw4IEBACiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KKwogYXNtbGlua2FnZSBleHRlcm4gdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCiBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBvbGRfcnNwKTsKQEAgLTEzOCw2ICsxNDAsOSBAQAogCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7CiAJCQlwbV9pZGxlKCk7CiAJCQlzdGFydF9jcml0aWNhbF90aW1pbmdzKCk7CisKKwkJCXRyYWNlX3Bvd2VyX2VuZChzbXBfcHJvY2Vzc29yX2lkKCkpOworCiAJCQkvKiBJbiBtYW55IGNhc2VzIHRoZSBpbnRlcnJ1cHQgdGhhdCBlbmRlZCBpZGxlCiAJCQkgICBoYXMgYWxyZWFkeSBjYWxsZWQgZXhpdF9pZGxlLiBCdXQgc29tZSBpZGxlCiAJCQkgICBsb29wcyBjYW4gYmUgd29rZW4gdXAgd2l0aG91dCBpbnRlcnJ1cHQuICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYwppbmRleCA5MjJlZWZiLi5iNTNjNTI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTIzLDExICsyMywxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzYXZlX3N0YWNrX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCitzdGF0aWMgdm9pZAorX19zYXZlX3N0YWNrX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBib29sIHJlbGlhYmxlLCBib29sIG5vc2NoZWQpCiB7CiAJc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSA9IGRhdGE7CisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKIAlpZiAoIXJlbGlhYmxlKQogCQlyZXR1cm47CisjZW5kaWYKKwlpZiAobm9zY2hlZCAmJiBpbl9zY2hlZF9mdW5jdGlvbnMoYWRkcikpCisJCXJldHVybjsKIAlpZiAodHJhY2UtPnNraXAgPiAwKSB7CiAJCXRyYWNlLT5za2lwLS07CiAJCXJldHVybjsKQEAgLTM2LDIwICs0MSwxNSBAQAogCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7CiB9CiAKK3N0YXRpYyB2b2lkIHNhdmVfc3RhY2tfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKK3sKKwlyZXR1cm4gX19zYXZlX3N0YWNrX2FkZHJlc3MoZGF0YSwgYWRkciwgcmVsaWFibGUsIGZhbHNlKTsKK30KKwogc3RhdGljIHZvaWQKIHNhdmVfc3RhY2tfYWRkcmVzc19ub3NjaGVkKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQogewotCXN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UgPSAoc3RydWN0IHN0YWNrX3RyYWNlICopZGF0YTsKLQlpZiAoIXJlbGlhYmxlKQotCQlyZXR1cm47Ci0JaWYgKGluX3NjaGVkX2Z1bmN0aW9ucyhhZGRyKSkKLQkJcmV0dXJuOwotCWlmICh0cmFjZS0+c2tpcCA+IDApIHsKLQkJdHJhY2UtPnNraXAtLTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gYWRkcjsKKwlyZXR1cm4gX19zYXZlX3N0YWNrX2FkZHJlc3MoZGF0YSwgYWRkciwgcmVsaWFibGUsIHRydWUpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHNhdmVfc3RhY2tfb3BzID0gewpAQCAtOTYsMTIgKzk2LDEzIEBACiAKIC8qIFVzZXJzcGFjZSBzdGFja3RyYWNlIC0gYmFzZWQgb24ga2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYyAqLwogCi1zdHJ1Y3Qgc3RhY2tfZnJhbWUgeworc3RydWN0IHN0YWNrX2ZyYW1lX3VzZXIgewogCWNvbnN0IHZvaWQgX191c2VyCSpuZXh0X2ZwOwogCXVuc2lnbmVkIGxvbmcJCXJldF9hZGRyOwogfTsKIAotc3RhdGljIGludCBjb3B5X3N0YWNrX2ZyYW1lKGNvbnN0IHZvaWQgX191c2VyICpmcCwgc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSkKK3N0YXRpYyBpbnQKK2NvcHlfc3RhY2tfZnJhbWUoY29uc3Qgdm9pZCBfX3VzZXIgKmZwLCBzdHJ1Y3Qgc3RhY2tfZnJhbWVfdXNlciAqZnJhbWUpCiB7CiAJaW50IHJldDsKIApAQCAtMTI2LDcgKzEyNyw3IEBACiAJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gcmVncy0+aXA7CiAKIAl3aGlsZSAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpIHsKLQkJc3RydWN0IHN0YWNrX2ZyYW1lIGZyYW1lOworCQlzdHJ1Y3Qgc3RhY2tfZnJhbWVfdXNlciBmcmFtZTsKIAogCQlmcmFtZS5uZXh0X2ZwID0gTlVMTDsKIAkJZnJhbWUucmV0X2FkZHIgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCA3MjVlZjRkLi42MDc4OGRlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMzkyLDcgKzM5MiwxMyBAQAogCQlpZiAobm90aWZ5X2RpZShESUVfTk1JX0lQSSwgIm5taV9pcGkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkKIAkJCQkJCQkJPT0gTk9USUZZX1NUT1ApCiAJCQlyZXR1cm47CisKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQorCQkJCQkJCT09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworCisjaWZuZGVmIENPTkZJR19MT0NLVVBfREVURUNUT1IKIAkJLyoKIAkJICogT2ssIHNvIHRoaXMgaXMgbm9uZSBvZiB0aGUgZG9jdW1lbnRlZCBOTUkgc291cmNlcywKIAkJICogc28gaXQgbXVzdCBiZSB0aGUgTk1JIHdhdGNoZG9nLgpAQCAtNDAwLDYgKzQwNiw3IEBACiAJCWlmIChubWlfd2F0Y2hkb2dfdGljayhyZWdzLCByZWFzb24pKQogCQkJcmV0dXJuOwogCQlpZiAoIWRvX25taV9jYWxsYmFjayhyZWdzLCBjcHUpKQorI2VuZGlmIC8qICFDT05GSUdfTE9DS1VQX0RFVEVDVE9SICovCiAJCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOwogI2Vsc2UKIAkJdW5rbm93bl9ubWlfZXJyb3IocmVhc29uLCByZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92ZXJpZnlfY3B1XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvdmVyaWZ5X2NwdV82NC5TCmluZGV4IDQ1YjZmOGEuLjU2YThjMmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92ZXJpZnlfY3B1XzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZlcmlmeV9jcHVfNjQuUwpAQCAtMzEsNiArMzEsNyBAQAogICovCiAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KIAogdmVyaWZ5X2NwdToKIAlwdXNoZmwJCQkJIyBTYXZlIGNhbGxlciBwYXNzZWQgZmxhZ3MKQEAgLTg4LDcgKzg5LDcgQEAKIAlqZQl2ZXJpZnlfY3B1X3NzZV9vawogCXRlc3QJJWRpLCVkaQogCWp6CXZlcmlmeV9jcHVfbm9fbG9uZ21vZGUJIyBvbmx5IHRyeSB0byBmb3JjZSBTU0Ugb24gQU1ECi0JbW92bAkkMHhjMDAxMDAxNSwlZWN4CSMgSFdDUgorCW1vdmwJJE1TUl9LN19IV0NSLCVlY3gKIAlyZG1zcgogCWJ0cgkkMTUsJWVheAkJIyBlbmFibGUgU1NFCiAJd3Jtc3IKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC94c2F2ZS5jIGIvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKaW5kZXggMzdlNjhmYy4uOTgwMTQ5OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKQEAgLTM2LDE1ICszNiwxNCBAQAogCiAJZXJyID0gX19jb3B5X2Zyb21fdXNlcihmeF9zd191c2VyLCAmYnVmLT5zd19yZXNlcnZlZFswXSwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IF9mcHhfc3dfYnl0ZXMpKTsKLQogCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyoKIAkgKiBGaXJzdCBNYWdpYyBjaGVjayBmYWlsZWQuCiAJICovCiAJaWYgKGZ4X3N3X3VzZXItPm1hZ2ljMSAhPSBGUF9YU1RBVEVfTUFHSUMxKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKIAkgKiBDaGVjayBmb3IgZXJyb3Igc2NlbmFyaW9zLgpAQCAtNTIsMTkgKzUxLDIxIEBACiAJaWYgKGZ4X3N3X3VzZXItPnhzdGF0ZV9zaXplIDwgbWluX3hzdGF0ZV9zaXplIHx8CiAJICAgIGZ4X3N3X3VzZXItPnhzdGF0ZV9zaXplID4geHN0YXRlX3NpemUgfHwKIAkgICAgZnhfc3dfdXNlci0+eHN0YXRlX3NpemUgPiBmeF9zd191c2VyLT5leHRlbmRlZF9zaXplKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyID0gX19nZXRfdXNlcihtYWdpYzIsIChfX3UzMiAqKSAoKCh2b2lkICopZnBzdGF0ZSkgKwogCQkJCQkgICAgZnhfc3dfdXNlci0+ZXh0ZW5kZWRfc2l6ZSAtCiAJCQkJCSAgICBGUF9YU1RBVEVfTUFHSUMyX1NJWkUpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCS8qCiAJICogQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBzZWNvbmQgbWFnaWMgd29yZCBhdCB0aGUgZW5kIG9mIG1lbW9yeQogCSAqIGxheW91dC4gVGhpcyBkZXRlY3RzIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIGp1c3QgY29waWVkIHRoZSBsZWdhY3kKIAkgKiBmcHN0YXRlIGxheW91dCB3aXRoIG91dCBjb3B5aW5nIHRoZSBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbgogCSAqIGluIHRoZSBtZW1vcnkgbGF5b3V0LgogCSAqLwotCWlmIChlcnIgfHwgbWFnaWMyICE9IEZQX1hTVEFURV9NQUdJQzIpCi0JCXJldHVybiAtMTsKKwlpZiAobWFnaWMyICE9IEZQX1hTVEFURV9NQUdJQzIpCisJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jIGIvYXJjaC94ODYva3ZtL2VtdWxhdGUuYwppbmRleCA1YWMwYmI0Li5iMzhiZDhiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jCkBAIC05LDYgKzksNyBAQAogICogcHJpdmlsZWdlZCBpbnN0cnVjdGlvbnM6CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0CisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxhdGVzLgogICoKICAqICAgQXZpIEtpdml0eSA8YXZpQHF1bXJhbmV0LmNvbT4KICAqICAgWWFuaXYgS2FtYXkgPHlhbml2QHF1bXJhbmV0LmNvbT4KQEAgLTY3LDYgKzY4LDkgQEAKICNkZWZpbmUgU3JjSW1tVUJ5dGUgKDg8PDQpICAgICAgLyogOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQuICovCiAjZGVmaW5lIFNyY0ltbVUgICAgICg5PDw0KSAgICAgIC8qIEltbWVkaWF0ZSBvcGVyYW5kLCB1bnNpZ25lZCAqLwogI2RlZmluZSBTcmNTSSAgICAgICAoMHhhPDw0KQkvKiBTb3VyY2UgaXMgaW4gdGhlIERTOlJTSSAqLworI2RlZmluZSBTcmNJbW1GQWRkciAoMHhiPDw0KQkvKiBTb3VyY2UgaXMgaW1tZWRpYXRlIGZhciBhZGRyZXNzICovCisjZGVmaW5lIFNyY01lbUZBZGRyICgweGM8PDQpCS8qIFNvdXJjZSBpcyBmYXIgYWRkcmVzcyBpbiBtZW1vcnkgKi8KKyNkZWZpbmUgU3JjQWNjICAgICAgKDB4ZDw8NCkJLyogU291cmNlIEFjY3VtdWxhdG9yICovCiAjZGVmaW5lIFNyY01hc2sgICAgICgweGY8PDQpCiAvKiBHZW5lcmljIE1vZFJNIGRlY29kZS4gKi8KICNkZWZpbmUgTW9kUk0gICAgICAgKDE8PDgpCkBAIC04OCwxMCArOTIsNiBAQAogI2RlZmluZSBTcmMyQ0wgICAgICAoMTw8MjkpCiAjZGVmaW5lIFNyYzJJbW1CeXRlICgyPDwyOSkKICNkZWZpbmUgU3JjMk9uZSAgICAgKDM8PDI5KQotI2RlZmluZSBTcmMySW1tMTYgICAoNDw8MjkpCi0jZGVmaW5lIFNyYzJNZW0xNiAgICg1PDwyOSkgLyogVXNlZCBmb3IgRXAgZW5jb2RpbmcuIEZpcnN0IGFyZ3VtZW50IGhhcyB0byBiZQotCQkJICAgICAgIGluIG1lbW9yeSBhbmQgc2Vjb25kIGFyZ3VtZW50IGlzIGxvY2F0ZWQKLQkJCSAgICAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3Qgb25lIGluIG1lbW9yeS4gKi8KICNkZWZpbmUgU3JjMk1hc2sgICAgKDc8PDI5KQogCiBlbnVtIHsKQEAgLTEyNCwxNSArMTI0LDE1IEBACiAJLyogMHgyMCAtIDB4MjcgKi8KIAlCeXRlT3AgfCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IExvY2ssIERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgTG9jaywKIAlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCi0JRHN0QWNjIHwgU3JjSW1tQnl0ZSwgRHN0QWNjIHwgU3JjSW1tLCAwLCAwLAorCUJ5dGVPcCB8IERzdEFjYyB8IFNyY0ltbUJ5dGUsIERzdEFjYyB8IFNyY0ltbSwgMCwgMCwKIAkvKiAweDI4IC0gMHgyRiAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgTG9jaywgRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBMb2NrLAogCUJ5dGVPcCB8IERzdFJlZyB8IFNyY01lbSB8IE1vZFJNLCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwKLQkwLCAwLCAwLCAwLAorCUJ5dGVPcCB8IERzdEFjYyB8IFNyY0ltbUJ5dGUsIERzdEFjYyB8IFNyY0ltbSwgMCwgMCwKIAkvKiAweDMwIC0gMHgzNyAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgTG9jaywgRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBMb2NrLAogCUJ5dGVPcCB8IERzdFJlZyB8IFNyY01lbSB8IE1vZFJNLCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwKLQkwLCAwLCAwLCAwLAorCUJ5dGVPcCB8IERzdEFjYyB8IFNyY0ltbUJ5dGUsIERzdEFjYyB8IFNyY0ltbSwgMCwgMCwKIAkvKiAweDM4IC0gMHgzRiAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKIAlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCkBAIC0xNzAsMjAgKzE3MCwyMCBAQAogCS8qIDB4ODggLSAweDhGICovCiAJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBNb3YsIERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgTW92LAogCUJ5dGVPcCB8IERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwKLQlEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IE1vdiwgTW9kUk0gfCBEc3RSZWcsCi0JRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsIEdyb3VwIHwgR3JvdXAxQSwKKwlEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBNb3YsIE1vZFJNIHwgRHN0UmVnLAorCUltcGxpY2l0T3BzIHwgU3JjTWVtMTYgfCBNb2RSTSwgR3JvdXAgfCBHcm91cDFBLAogCS8qIDB4OTAgLSAweDk3ICovCiAJRHN0UmVnLCBEc3RSZWcsIERzdFJlZywgRHN0UmVnLAlEc3RSZWcsIERzdFJlZywgRHN0UmVnLCBEc3RSZWcsCiAJLyogMHg5OCAtIDB4OUYgKi8KLQkwLCAwLCBTcmNJbW0gfCBTcmMySW1tMTYgfCBObzY0LCAwLAorCTAsIDAsIFNyY0ltbUZBZGRyIHwgTm82NCwgMCwKIAlJbXBsaWNpdE9wcyB8IFN0YWNrLCBJbXBsaWNpdE9wcyB8IFN0YWNrLCAwLCAwLAogCS8qIDB4QTAgLSAweEE3ICovCi0JQnl0ZU9wIHwgRHN0UmVnIHwgU3JjTWVtIHwgTW92IHwgTWVtQWJzLCBEc3RSZWcgfCBTcmNNZW0gfCBNb3YgfCBNZW1BYnMsCi0JQnl0ZU9wIHwgRHN0TWVtIHwgU3JjUmVnIHwgTW92IHwgTWVtQWJzLCBEc3RNZW0gfCBTcmNSZWcgfCBNb3YgfCBNZW1BYnMsCisJQnl0ZU9wIHwgRHN0QWNjIHwgU3JjTWVtIHwgTW92IHwgTWVtQWJzLCBEc3RBY2MgfCBTcmNNZW0gfCBNb3YgfCBNZW1BYnMsCisJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjQWNjIHwgTW92IHwgTWVtQWJzLCBEc3RNZW0gfCBTcmNBY2MgfCBNb3YgfCBNZW1BYnMsCiAJQnl0ZU9wIHwgU3JjU0kgfCBEc3RESSB8IE1vdiB8IFN0cmluZywgU3JjU0kgfCBEc3RESSB8IE1vdiB8IFN0cmluZywKIAlCeXRlT3AgfCBTcmNTSSB8IERzdERJIHwgU3RyaW5nLCBTcmNTSSB8IERzdERJIHwgU3RyaW5nLAogCS8qIDB4QTggLSAweEFGICovCi0JMCwgMCwgQnl0ZU9wIHwgRHN0REkgfCBNb3YgfCBTdHJpbmcsIERzdERJIHwgTW92IHwgU3RyaW5nLAorCURzdEFjYyB8IFNyY0ltbUJ5dGUgfCBCeXRlT3AsIERzdEFjYyB8IFNyY0ltbSwgQnl0ZU9wIHwgRHN0REkgfCBNb3YgfCBTdHJpbmcsIERzdERJIHwgTW92IHwgU3RyaW5nLAogCUJ5dGVPcCB8IFNyY1NJIHwgRHN0QWNjIHwgTW92IHwgU3RyaW5nLCBTcmNTSSB8IERzdEFjYyB8IE1vdiB8IFN0cmluZywKIAlCeXRlT3AgfCBEc3RESSB8IFN0cmluZywgRHN0REkgfCBTdHJpbmcsCiAJLyogMHhCMCAtIDB4QjcgKi8KQEAgLTIxNSw3ICsyMTUsNyBAQAogCUJ5dGVPcCB8IFNyY0ltbVVCeXRlIHwgRHN0QWNjLCBTcmNJbW1VQnl0ZSB8IERzdEFjYywKIAkvKiAweEU4IC0gMHhFRiAqLwogCVNyY0ltbSB8IFN0YWNrLCBTcmNJbW0gfCBJbXBsaWNpdE9wcywKLQlTcmNJbW1VIHwgU3JjMkltbTE2IHwgTm82NCwgU3JjSW1tQnl0ZSB8IEltcGxpY2l0T3BzLAorCVNyY0ltbUZBZGRyIHwgTm82NCwgU3JjSW1tQnl0ZSB8IEltcGxpY2l0T3BzLAogCVNyY05vbmUgfCBCeXRlT3AgfCBEc3RBY2MsIFNyY05vbmUgfCBEc3RBY2MsCiAJU3JjTm9uZSB8IEJ5dGVPcCB8IERzdEFjYywgU3JjTm9uZSB8IERzdEFjYywKIAkvKiAweEYwIC0gMHhGNyAqLwpAQCAtMzM3LDIwICszMzcsMjAgQEAKIAlbR3JvdXAxQSo4XSA9CiAJRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTW92IHwgU3RhY2ssIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAJW0dyb3VwM19CeXRlKjhdID0KLQlCeXRlT3AgfCBTcmNJbW0gfCBEc3RNZW0gfCBNb2RSTSwgMCwKKwlCeXRlT3AgfCBTcmNJbW0gfCBEc3RNZW0gfCBNb2RSTSwgQnl0ZU9wIHwgU3JjSW1tIHwgRHN0TWVtIHwgTW9kUk0sCiAJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sCiAJMCwgMCwgMCwgMCwKIAlbR3JvdXAzKjhdID0KLQlEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgMCwKKwlEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgRHN0TWVtIHwgU3JjSW1tIHwgTW9kUk0sCiAJRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sCiAJMCwgMCwgMCwgMCwKIAlbR3JvdXA0KjhdID0KLQlCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sIEJ5dGVPcCB8IERzdE1lbSB8IFNyY05vbmUgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrLCBCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrLAogCTAsIDAsIDAsIDAsIDAsIDAsCiAJW0dyb3VwNSo4XSA9Ci0JRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sCisJRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTG9jaywgRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTG9jaywKIAlTcmNNZW0gfCBNb2RSTSB8IFN0YWNrLCAwLAotCVNyY01lbSB8IE1vZFJNIHwgU3RhY2ssIFNyY01lbSB8IE1vZFJNIHwgU3JjMk1lbTE2IHwgSW1wbGljaXRPcHMsCisJU3JjTWVtIHwgTW9kUk0gfCBTdGFjaywgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IEltcGxpY2l0T3BzLAogCVNyY01lbSB8IE1vZFJNIHwgU3RhY2ssIDAsCiAJW0dyb3VwNyo4XSA9CiAJMCwgMCwgTW9kUk0gfCBTcmNNZW0gfCBQcml2LCBNb2RSTSB8IFNyY01lbSB8IFByaXYsCkBAIC01NzYsNiArNTc2LDEzIEBACiAJKF90eXBlKV94OwkJCQkJCQlcCiB9KQogCisjZGVmaW5lIGluc25fZmV0Y2hfYXJyKF9hcnIsIF9zaXplLCBfZWlwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsJcmMgPSBkb19pbnNuX2ZldGNoKGN0eHQsIG9wcywgKF9laXApLCBfYXJyLCAoX3NpemUpKTsJCVwKKwlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkJCQkJCVwKKwkJZ290byBkb25lOwkJCQkJCVwKKwkoX2VpcCkgKz0gKF9zaXplKTsJCQkJCQlcCit9KQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWRfbWFzayhzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjKQogewogCXJldHVybiAoMVVMIDw8IChjLT5hZF9ieXRlcyA8PCAzKSkgLSAxOwpAQCAtNjE3LDMxICs2MjQsNjYgQEAKIAljLT5zZWdfb3ZlcnJpZGUgPSBzZWc7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNlZ19iYXNlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgc2VnKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2VnX2Jhc2Uoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisJCQkgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBzZWcpCiB7CiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCAmJiBzZWcgPCBWQ1BVX1NSRUdfRlMpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIGt2bV94ODZfb3BzLT5nZXRfc2VnbWVudF9iYXNlKGN0eHQtPnZjcHUsIHNlZyk7CisJcmV0dXJuIG9wcy0+Z2V0X2NhY2hlZF9zZWdtZW50X2Jhc2Uoc2VnLCBjdHh0LT52Y3B1KTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2VnX292ZXJyaWRlX2Jhc2Uoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisJCQkJICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCQkgICAgICAgc3RydWN0IGRlY29kZV9jYWNoZSAqYykKIHsKIAlpZiAoIWMtPmhhc19zZWdfb3ZlcnJpZGUpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHNlZ19iYXNlKGN0eHQsIGMtPnNlZ19vdmVycmlkZSk7CisJcmV0dXJuIHNlZ19iYXNlKGN0eHQsIG9wcywgYy0+c2VnX292ZXJyaWRlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXNfYmFzZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVzX2Jhc2Uoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisJCQkgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKIHsKLQlyZXR1cm4gc2VnX2Jhc2UoY3R4dCwgVkNQVV9TUkVHX0VTKTsKKwlyZXR1cm4gc2VnX2Jhc2UoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfRVMpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzc19iYXNlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3NfYmFzZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQogewotCXJldHVybiBzZWdfYmFzZShjdHh0LCBWQ1BVX1NSRUdfU1MpOworCXJldHVybiBzZWdfYmFzZShjdHh0LCBvcHMsIFZDUFVfU1JFR19TUyk7Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdGVfZXhjZXB0aW9uKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgdmVjLAorCQkJCSAgICAgIHUzMiBlcnJvciwgYm9vbCB2YWxpZCkKK3sKKwljdHh0LT5leGNlcHRpb24gPSB2ZWM7CisJY3R4dC0+ZXJyb3JfY29kZSA9IGVycm9yOworCWN0eHQtPmVycm9yX2NvZGVfdmFsaWQgPSB2YWxpZDsKKwljdHh0LT5yZXN0YXJ0ID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdGVfZ3Aoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBlcnIpCit7CisJZW11bGF0ZV9leGNlcHRpb24oY3R4dCwgR1BfVkVDVE9SLCBlcnIsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBlbXVsYXRlX3BmKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgICAgICBpbnQgZXJyKQoreworCWN0eHQtPmNyMiA9IGFkZHI7CisJZW11bGF0ZV9leGNlcHRpb24oY3R4dCwgUEZfVkVDVE9SLCBlcnIsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBlbXVsYXRlX3VkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCWVtdWxhdGVfZXhjZXB0aW9uKGN0eHQsIFVEX1ZFQ1RPUiwgMCwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBlbXVsYXRlX3RzKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgZXJyKQoreworCWVtdWxhdGVfZXhjZXB0aW9uKGN0eHQsIFRTX1ZFQ1RPUiwgZXJyLCB0cnVlKTsKIH0KIAogc3RhdGljIGludCBkb19mZXRjaF9pbnNuX2J5dGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCkBAIC05MzIsMTIgKzk3NCw5IEBACiAJLyogd2UgY2Fubm90IGRlY29kZSBpbnNuIGJlZm9yZSB3ZSBjb21wbGV0ZSBwcmV2aW91cyByZXAgaW5zbiAqLwogCVdBUk5fT04oY3R4dC0+cmVzdGFydCk7CiAKLQkvKiBTaGFkb3cgY29weSBvZiByZWdpc3RlciBzdGF0ZS4gQ29tbWl0dGVkIG9uIHN1Y2Nlc3NmdWwgZW11bGF0aW9uLiAqLwotCW1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IGRlY29kZV9jYWNoZSkpOwogCWMtPmVpcCA9IGN0eHQtPmVpcDsKIAljLT5mZXRjaC5zdGFydCA9IGMtPmZldGNoLmVuZCA9IGMtPmVpcDsKLQljdHh0LT5jc19iYXNlID0gc2VnX2Jhc2UoY3R4dCwgVkNQVV9TUkVHX0NTKTsKLQltZW1jcHkoYy0+cmVncywgY3R4dC0+dmNwdS0+YXJjaC5yZWdzLCBzaXplb2YgYy0+cmVncyk7CisJY3R4dC0+Y3NfYmFzZSA9IHNlZ19iYXNlKGN0eHQsIG9wcywgVkNQVV9TUkVHX0NTKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgWDg2RU1VTF9NT0RFX1JFQUw6CkBAIC0xMDYwLDcgKzEwOTksNyBAQAogCQlzZXRfc2VnX292ZXJyaWRlKGMsIFZDUFVfU1JFR19EUyk7CiAKIAlpZiAoISghYy0+dHdvYnl0ZSAmJiBjLT5iID09IDB4OGQpKQotCQljLT5tb2RybV9lYSArPSBzZWdfb3ZlcnJpZGVfYmFzZShjdHh0LCBjKTsKKwkJYy0+bW9kcm1fZWEgKz0gc2VnX292ZXJyaWRlX2Jhc2UoY3R4dCwgb3BzLCBjKTsKIAogCWlmIChjLT5hZF9ieXRlcyAhPSA4KQogCQljLT5tb2RybV9lYSA9ICh1MzIpYy0+bW9kcm1fZWE7CkBAIC0xMTQ4LDYgKzExODcsMjUgQEAKIAkJZWxzZQogCQkJYy0+c3JjLnZhbCA9IGluc25fZmV0Y2godTgsIDEsIGMtPmVpcCk7CiAJCWJyZWFrOworCWNhc2UgU3JjQWNjOgorCQljLT5zcmMudHlwZSA9IE9QX1JFRzsKKwkJYy0+c3JjLmJ5dGVzID0gKGMtPmQgJiBCeXRlT3ApID8gMSA6IGMtPm9wX2J5dGVzOworCQljLT5zcmMucHRyID0gJmMtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CisJCXN3aXRjaCAoYy0+c3JjLmJ5dGVzKSB7CisJCQljYXNlIDE6CisJCQkJYy0+c3JjLnZhbCA9ICoodTggKiljLT5zcmMucHRyOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWMtPnNyYy52YWwgPSAqKHUxNiAqKWMtPnNyYy5wdHI7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJYy0+c3JjLnZhbCA9ICoodTMyICopYy0+c3JjLnB0cjsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCQljLT5zcmMudmFsID0gKih1NjQgKiljLT5zcmMucHRyOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCWNhc2UgU3JjT25lOgogCQljLT5zcmMuYnl0ZXMgPSAxOwogCQljLT5zcmMudmFsID0gMTsKQEAgLTExNTYsMTAgKzEyMTQsMjEgQEAKIAkJYy0+c3JjLnR5cGUgPSBPUF9NRU07CiAJCWMtPnNyYy5ieXRlcyA9IChjLT5kICYgQnl0ZU9wKSA/IDEgOiBjLT5vcF9ieXRlczsKIAkJYy0+c3JjLnB0ciA9ICh1bnNpZ25lZCBsb25nICopCi0JCQlyZWdpc3Rlcl9hZGRyZXNzKGMsICBzZWdfb3ZlcnJpZGVfYmFzZShjdHh0LCBjKSwKKwkJCXJlZ2lzdGVyX2FkZHJlc3MoYywgIHNlZ19vdmVycmlkZV9iYXNlKGN0eHQsIG9wcywgYyksCiAJCQkJCSBjLT5yZWdzW1ZDUFVfUkVHU19SU0ldKTsKIAkJYy0+c3JjLnZhbCA9IDA7CiAJCWJyZWFrOworCWNhc2UgU3JjSW1tRkFkZHI6CisJCWMtPnNyYy50eXBlID0gT1BfSU1NOworCQljLT5zcmMucHRyID0gKHVuc2lnbmVkIGxvbmcgKiljLT5laXA7CisJCWMtPnNyYy5ieXRlcyA9IGMtPm9wX2J5dGVzICsgMjsKKwkJaW5zbl9mZXRjaF9hcnIoYy0+c3JjLnZhbHB0ciwgYy0+c3JjLmJ5dGVzLCBjLT5laXApOworCQlicmVhazsKKwljYXNlIFNyY01lbUZBZGRyOgorCQljLT5zcmMudHlwZSA9IE9QX01FTTsKKwkJYy0+c3JjLnB0ciA9ICh1bnNpZ25lZCBsb25nICopYy0+bW9kcm1fZWE7CisJCWMtPnNyYy5ieXRlcyA9IGMtPm9wX2J5dGVzICsgMjsKKwkJYnJlYWs7CiAJfQogCiAJLyoKQEAgLTExNzksMjIgKzEyNDgsMTAgQEAKIAkJYy0+c3JjMi5ieXRlcyA9IDE7CiAJCWMtPnNyYzIudmFsID0gaW5zbl9mZXRjaCh1OCwgMSwgYy0+ZWlwKTsKIAkJYnJlYWs7Ci0JY2FzZSBTcmMySW1tMTY6Ci0JCWMtPnNyYzIudHlwZSA9IE9QX0lNTTsKLQkJYy0+c3JjMi5wdHIgPSAodW5zaWduZWQgbG9uZyAqKWMtPmVpcDsKLQkJYy0+c3JjMi5ieXRlcyA9IDI7Ci0JCWMtPnNyYzIudmFsID0gaW5zbl9mZXRjaCh1MTYsIDIsIGMtPmVpcCk7Ci0JCWJyZWFrOwogCWNhc2UgU3JjMk9uZToKIAkJYy0+c3JjMi5ieXRlcyA9IDE7CiAJCWMtPnNyYzIudmFsID0gMTsKIAkJYnJlYWs7Ci0JY2FzZSBTcmMyTWVtMTY6Ci0JCWMtPnNyYzIudHlwZSA9IE9QX01FTTsKLQkJYy0+c3JjMi5ieXRlcyA9IDI7Ci0JCWMtPnNyYzIucHRyID0gKHVuc2lnbmVkIGxvbmcgKikoYy0+bW9kcm1fZWEgKyBjLT5zcmMuYnl0ZXMpOwotCQljLT5zcmMyLnZhbCA9IDA7Ci0JCWJyZWFrOwogCX0KIAogCS8qIERlY29kZSBhbmQgZmV0Y2ggdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQ6IHJlZ2lzdGVyIG9yIG1lbW9yeS4gKi8KQEAgLTEyNTMsNyArMTMxMCw3IEBACiAJCWMtPmRzdC50eXBlID0gT1BfTUVNOwogCQljLT5kc3QuYnl0ZXMgPSAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDogYy0+b3BfYnl0ZXM7CiAJCWMtPmRzdC5wdHIgPSAodW5zaWduZWQgbG9uZyAqKQotCQkJcmVnaXN0ZXJfYWRkcmVzcyhjLCBlc19iYXNlKGN0eHQpLAorCQkJcmVnaXN0ZXJfYWRkcmVzcyhjLCBlc19iYXNlKGN0eHQsIG9wcyksCiAJCQkJCSBjLT5yZWdzW1ZDUFVfUkVHU19SREldKTsKIAkJYy0+ZHN0LnZhbCA9IDA7CiAJCWJyZWFrOwpAQCAtMTI2Myw2ICsxMzIwLDM3IEBACiAJcmV0dXJuIChyYyA9PSBYODZFTVVMX1VOSEFORExFQUJMRSkgPyAtMSA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgcmVhZF9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCisJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkZXN0LCB1bnNpZ25lZCBzaXplKQoreworCWludCByYzsKKwlzdHJ1Y3QgcmVhZF9jYWNoZSAqbWMgPSAmY3R4dC0+ZGVjb2RlLm1lbV9yZWFkOworCXUzMiBlcnI7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgbiA9IG1pbihzaXplLCA4dSk7CisJCXNpemUgLT0gbjsKKwkJaWYgKG1jLT5wb3MgPCBtYy0+ZW5kKQorCQkJZ290byByZWFkX2NhY2hlZDsKKworCQlyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZChhZGRyLCBtYy0+ZGF0YSArIG1jLT5lbmQsIG4sICZlcnIsCisJCQkJCWN0eHQtPnZjcHUpOworCQlpZiAocmMgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpCisJCQllbXVsYXRlX3BmKGN0eHQsIGFkZHIsIGVycik7CisJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQorCQkJcmV0dXJuIHJjOworCQltYy0+ZW5kICs9IG47CisKKwlyZWFkX2NhY2hlZDoKKwkJbWVtY3B5KGRlc3QsIG1jLT5kYXRhICsgbWMtPnBvcywgbik7CisJCW1jLT5wb3MgKz0gbjsKKwkJZGVzdCArPSBuOworCQlhZGRyICs9IG47CisJfQorCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCiBzdGF0aWMgaW50IHBpb19pbl9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKIAkJCSAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCSAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBzaG9ydCBwb3J0LApAQCAtMTMzMCwxMyArMTQxOCwxMyBAQAogCWdldF9kZXNjcmlwdG9yX3RhYmxlX3B0cihjdHh0LCBvcHMsIHNlbGVjdG9yLCAmZHQpOwogCiAJaWYgKGR0LnNpemUgPCBpbmRleCAqIDggKyA3KSB7Ci0JCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgc2VsZWN0b3IgJiAweGZmZmMpOworCQllbXVsYXRlX2dwKGN0eHQsIHNlbGVjdG9yICYgMHhmZmZjKTsKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCX0KIAlhZGRyID0gZHQuYWRkcmVzcyArIGluZGV4ICogODsKIAlyZXQgPSBvcHMtPnJlYWRfc3RkKGFkZHIsIGRlc2MsIHNpemVvZiAqZGVzYywgY3R4dC0+dmNwdSwgICZlcnIpOwogCWlmIChyZXQgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpCi0JCWt2bV9pbmplY3RfcGFnZV9mYXVsdChjdHh0LT52Y3B1LCBhZGRyLCBlcnIpOworCQllbXVsYXRlX3BmKGN0eHQsIGFkZHIsIGVycik7CiAKICAgICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTM1NSwxNCArMTQ0MywxNCBAQAogCWdldF9kZXNjcmlwdG9yX3RhYmxlX3B0cihjdHh0LCBvcHMsIHNlbGVjdG9yLCAmZHQpOwogCiAJaWYgKGR0LnNpemUgPCBpbmRleCAqIDggKyA3KSB7Ci0JCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgc2VsZWN0b3IgJiAweGZmZmMpOworCQllbXVsYXRlX2dwKGN0eHQsIHNlbGVjdG9yICYgMHhmZmZjKTsKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCX0KIAogCWFkZHIgPSBkdC5hZGRyZXNzICsgaW5kZXggKiA4OwogCXJldCA9IG9wcy0+d3JpdGVfc3RkKGFkZHIsIGRlc2MsIHNpemVvZiAqZGVzYywgY3R4dC0+dmNwdSwgJmVycik7CiAJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkKLQkJa3ZtX2luamVjdF9wYWdlX2ZhdWx0KGN0eHQtPnZjcHUsIGFkZHIsIGVycik7CisJCWVtdWxhdGVfcGYoY3R4dCwgYWRkciwgZXJyKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNDgxLDExICsxNTY5LDcwIEBACiAJb3BzLT5zZXRfY2FjaGVkX2Rlc2NyaXB0b3IoJnNlZ19kZXNjLCBzZWcsIGN0eHQtPnZjcHUpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogZXhjZXB0aW9uOgotCWt2bV9xdWV1ZV9leGNlcHRpb25fZShjdHh0LT52Y3B1LCBlcnJfdmVjLCBlcnJfY29kZSk7CisJZW11bGF0ZV9leGNlcHRpb24oY3R4dCwgZXJyX3ZlYywgZXJyX2NvZGUsIHRydWUpOwogCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVtdWxhdGVfcHVzaChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlYmFjayhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMpCit7CisJaW50IHJjOworCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOworCXUzMiBlcnI7CisKKwlzd2l0Y2ggKGMtPmRzdC50eXBlKSB7CisJY2FzZSBPUF9SRUc6CisJCS8qIFRoZSA0LWJ5dGUgY2FzZSAqaXMqIGNvcnJlY3Q6CisJCSAqIGluIDY0LWJpdCBtb2RlIHdlIHplcm8tZXh0ZW5kLgorCQkgKi8KKwkJc3dpdGNoIChjLT5kc3QuYnl0ZXMpIHsKKwkJY2FzZSAxOgorCQkJKih1OCAqKWMtPmRzdC5wdHIgPSAodTgpYy0+ZHN0LnZhbDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkqKHUxNiAqKWMtPmRzdC5wdHIgPSAodTE2KWMtPmRzdC52YWw7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJKmMtPmRzdC5wdHIgPSAodTMyKWMtPmRzdC52YWw7CisJCQlicmVhazsJLyogNjRiOiB6ZXJvLWV4dCAqLworCQljYXNlIDg6CisJCQkqYy0+ZHN0LnB0ciA9IGMtPmRzdC52YWw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIE9QX01FTToKKwkJaWYgKGMtPmxvY2tfcHJlZml4KQorCQkJcmMgPSBvcHMtPmNtcHhjaGdfZW11bGF0ZWQoCisJCQkJCSh1bnNpZ25lZCBsb25nKWMtPmRzdC5wdHIsCisJCQkJCSZjLT5kc3Qub3JpZ192YWwsCisJCQkJCSZjLT5kc3QudmFsLAorCQkJCQljLT5kc3QuYnl0ZXMsCisJCQkJCSZlcnIsCisJCQkJCWN0eHQtPnZjcHUpOworCQllbHNlCisJCQlyYyA9IG9wcy0+d3JpdGVfZW11bGF0ZWQoCisJCQkJCSh1bnNpZ25lZCBsb25nKWMtPmRzdC5wdHIsCisJCQkJCSZjLT5kc3QudmFsLAorCQkJCQljLT5kc3QuYnl0ZXMsCisJCQkJCSZlcnIsCisJCQkJCWN0eHQtPnZjcHUpOworCQlpZiAocmMgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpCisJCQllbXVsYXRlX3BmKGN0eHQsCisJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKWMtPmRzdC5wdHIsIGVycik7CisJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQorCQkJcmV0dXJuIHJjOworCQlicmVhazsKKwljYXNlIE9QX05PTkU6CisJCS8qIG5vIHdyaXRlYmFjayAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbXVsYXRlX3B1c2goc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisJCQkJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQogewogCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCkBAIC0xNDkzLDcgKzE2NDAsNyBAQAogCWMtPmRzdC5ieXRlcyA9IGMtPm9wX2J5dGVzOwogCWMtPmRzdC52YWwgPSBjLT5zcmMudmFsOwogCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGMsICZjLT5yZWdzW1ZDUFVfUkVHU19SU1BdLCAtYy0+b3BfYnl0ZXMpOwotCWMtPmRzdC5wdHIgPSAodm9pZCAqKSByZWdpc3Rlcl9hZGRyZXNzKGMsIHNzX2Jhc2UoY3R4dCksCisJYy0+ZHN0LnB0ciA9ICh2b2lkICopIHJlZ2lzdGVyX2FkZHJlc3MoYywgc3NfYmFzZShjdHh0LCBvcHMpLAogCQkJCQkgICAgICAgYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSk7CiB9CiAKQEAgLTE1MDQsOSArMTY1MSw5IEBACiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJaW50IHJjOwogCi0JcmMgPSBvcHMtPnJlYWRfZW11bGF0ZWQocmVnaXN0ZXJfYWRkcmVzcyhjLCBzc19iYXNlKGN0eHQpLAotCQkJCQkJIGMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0pLAotCQkJCWRlc3QsIGxlbiwgY3R4dC0+dmNwdSk7CisJcmMgPSByZWFkX2VtdWxhdGVkKGN0eHQsIG9wcywgcmVnaXN0ZXJfYWRkcmVzcyhjLCBzc19iYXNlKGN0eHQsIG9wcyksCisJCQkJCQkgICAgICAgYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSksCisJCQkgICBkZXN0LCBsZW4pOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKQEAgLTE1NDEsNyArMTY4OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgWDg2RU1VTF9NT0RFX1ZNODY6CiAJCWlmIChpb3BsIDwgMykgewotCQkJa3ZtX2luamVjdF9ncChjdHh0LT52Y3B1LCAwKTsKKwkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJCX0KIAkJY2hhbmdlX21hc2sgfD0gRUZMR19JRjsKQEAgLTE1NTcsMTUgKzE3MDQsMTQgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGVtdWxhdGVfcHVzaF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgc2VnKQorc3RhdGljIHZvaWQgZW11bGF0ZV9wdXNoX3NyZWcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisJCQkgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBzZWcpCiB7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0Jc3RydWN0IGt2bV9zZWdtZW50IHNlZ21lbnQ7CiAKLQlrdm1feDg2X29wcy0+Z2V0X3NlZ21lbnQoY3R4dC0+dmNwdSwgJnNlZ21lbnQsIHNlZyk7CisJYy0+c3JjLnZhbCA9IG9wcy0+Z2V0X3NlZ21lbnRfc2VsZWN0b3Ioc2VnLCBjdHh0LT52Y3B1KTsKIAotCWMtPnNyYy52YWwgPSBzZWdtZW50LnNlbGVjdG9yOwotCWVtdWxhdGVfcHVzaChjdHh0KTsKKwllbXVsYXRlX3B1c2goY3R4dCwgb3BzKTsKIH0KIAogc3RhdGljIGludCBlbXVsYXRlX3BvcF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LApAQCAtMTU4MywxOSArMTcyOSwzMSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgZW11bGF0ZV9wdXNoYShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3N0YXRpYyBpbnQgZW11bGF0ZV9wdXNoYShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQogewogCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCXVuc2lnbmVkIGxvbmcgb2xkX2VzcCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JTUF07CisJaW50IHJjID0gWDg2RU1VTF9DT05USU5VRTsKIAlpbnQgcmVnID0gVkNQVV9SRUdTX1JBWDsKIAogCXdoaWxlIChyZWcgPD0gVkNQVV9SRUdTX1JESSkgewogCQkocmVnID09IFZDUFVfUkVHU19SU1ApID8KIAkJKGMtPnNyYy52YWwgPSBvbGRfZXNwKSA6IChjLT5zcmMudmFsID0gYy0+cmVnc1tyZWddKTsKIAotCQllbXVsYXRlX3B1c2goY3R4dCk7CisJCWVtdWxhdGVfcHVzaChjdHh0LCBvcHMpOworCisJCXJjID0gd3JpdGViYWNrKGN0eHQsIG9wcyk7CisJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQorCQkJcmV0dXJuIHJjOworCiAJCSsrcmVnOwogCX0KKworCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBlbXVsYXRlX3BvcGEoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCkBAIC0xNjk1LDE0ICsxODUzLDE0IEBACiAJCW9sZF9laXAgPSBjLT5laXA7CiAJCWMtPmVpcCA9IGMtPnNyYy52YWw7CiAJCWMtPnNyYy52YWwgPSBvbGRfZWlwOwotCQllbXVsYXRlX3B1c2goY3R4dCk7CisJCWVtdWxhdGVfcHVzaChjdHh0LCBvcHMpOwogCQlicmVhazsKIAl9CiAJY2FzZSA0OiAvKiBqbXAgYWJzICovCiAJCWMtPmVpcCA9IGMtPnNyYy52YWw7CiAJCWJyZWFrOwogCWNhc2UgNjoJLyogcHVzaCAqLwotCQllbXVsYXRlX3B1c2goY3R4dCk7CisJCWVtdWxhdGVfcHVzaChjdHh0LCBvcHMpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CkBAIC0xNzQ4LDE0NSArMTkwNiw4MiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgd3JpdGViYWNrKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQlzd2l0Y2ggKGMtPmRzdC50eXBlKSB7Ci0JY2FzZSBPUF9SRUc6Ci0JCS8qIFRoZSA0LWJ5dGUgY2FzZSAqaXMqIGNvcnJlY3Q6Ci0JCSAqIGluIDY0LWJpdCBtb2RlIHdlIHplcm8tZXh0ZW5kLgotCQkgKi8KLQkJc3dpdGNoIChjLT5kc3QuYnl0ZXMpIHsKLQkJY2FzZSAxOgotCQkJKih1OCAqKWMtPmRzdC5wdHIgPSAodTgpYy0+ZHN0LnZhbDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQkqKHUxNiAqKWMtPmRzdC5wdHIgPSAodTE2KWMtPmRzdC52YWw7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJKmMtPmRzdC5wdHIgPSAodTMyKWMtPmRzdC52YWw7Ci0JCQlicmVhazsJLyogNjRiOiB6ZXJvLWV4dCAqLwotCQljYXNlIDg6Ci0JCQkqYy0+ZHN0LnB0ciA9IGMtPmRzdC52YWw7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIE9QX01FTToKLQkJaWYgKGMtPmxvY2tfcHJlZml4KQotCQkJcmMgPSBvcHMtPmNtcHhjaGdfZW11bGF0ZWQoCi0JCQkJCSh1bnNpZ25lZCBsb25nKWMtPmRzdC5wdHIsCi0JCQkJCSZjLT5kc3Qub3JpZ192YWwsCi0JCQkJCSZjLT5kc3QudmFsLAotCQkJCQljLT5kc3QuYnl0ZXMsCi0JCQkJCWN0eHQtPnZjcHUpOwotCQllbHNlCi0JCQlyYyA9IG9wcy0+d3JpdGVfZW11bGF0ZWQoCi0JCQkJCSh1bnNpZ25lZCBsb25nKWMtPmRzdC5wdHIsCi0JCQkJCSZjLT5kc3QudmFsLAotCQkJCQljLT5kc3QuYnl0ZXMsCi0JCQkJCWN0eHQtPnZjcHUpOwotCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKLQkJCXJldHVybiByYzsKLQkJYnJlYWs7Ci0JY2FzZSBPUF9OT05FOgotCQkvKiBubyB3cml0ZWJhY2sgKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgdm9pZCB0b2dnbGVfaW50ZXJydXB0aWJpbGl0eShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgdTMyIG1hc2spCi17Ci0JdTMyIGludF9zaGFkb3cgPSBrdm1feDg2X29wcy0+Z2V0X2ludGVycnVwdF9zaGFkb3coY3R4dC0+dmNwdSwgbWFzayk7Ci0JLyoKLQkgKiBhbiBzdGk7IHN0aTsgc2VxdWVuY2Ugb25seSBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoZSBmaXJzdAotCSAqIGluc3RydWN0aW9uLiBTbywgaWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sIGJlIGl0IGVtdWxhdGVkIG9yCi0JICogbm90LCBsZWZ0IHRoZSBzeXN0ZW0gd2l0aCB0aGUgSU5UX1NUSSBmbGFnIGVuYWJsZWQsIGl0Ci0JICogbWVhbnMgdGhhdCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpcyBhbiBzdGkuIFdlIHNob3VsZCBub3QKLQkgKiBsZWF2ZSB0aGUgZmxhZyBvbiBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGdvZXMgZm9yIG1vdiBzcwotCSAqLwotCWlmICghKGludF9zaGFkb3cgJiBtYXNrKSkKLQkJY3R4dC0+aW50ZXJydXB0aWJpbGl0eSA9IG1hc2s7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAogc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0Jc3RydWN0IGt2bV9zZWdtZW50ICpjcywgc3RydWN0IGt2bV9zZWdtZW50ICpzcykKKwkJCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywgc3RydWN0IGRlc2Nfc3RydWN0ICpjcywKKwkJCXN0cnVjdCBkZXNjX3N0cnVjdCAqc3MpCiB7Ci0JbWVtc2V0KGNzLCAwLCBzaXplb2Yoc3RydWN0IGt2bV9zZWdtZW50KSk7Ci0Ja3ZtX3g4Nl9vcHMtPmdldF9zZWdtZW50KGN0eHQtPnZjcHUsIGNzLCBWQ1BVX1NSRUdfQ1MpOwotCW1lbXNldChzcywgMCwgc2l6ZW9mKHN0cnVjdCBrdm1fc2VnbWVudCkpOworCW1lbXNldChjcywgMCwgc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkpOworCW9wcy0+Z2V0X2NhY2hlZF9kZXNjcmlwdG9yKGNzLCBWQ1BVX1NSRUdfQ1MsIGN0eHQtPnZjcHUpOworCW1lbXNldChzcywgMCwgc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkpOwogCiAJY3MtPmwgPSAwOwkJLyogd2lsbCBiZSBhZGp1c3RlZCBsYXRlciAqLwotCWNzLT5iYXNlID0gMDsJCS8qIGZsYXQgc2VnbWVudCAqLworCXNldF9kZXNjX2Jhc2UoY3MsIDApOwkvKiBmbGF0IHNlZ21lbnQgKi8KIAljcy0+ZyA9IDE7CQkvKiA0a2IgZ3JhbnVsYXJpdHkgKi8KLQljcy0+bGltaXQgPSAweGZmZmZmZmZmOwkvKiA0R0IgbGltaXQgKi8KKwlzZXRfZGVzY19saW1pdChjcywgMHhmZmZmZik7CS8qIDRHQiBsaW1pdCAqLwogCWNzLT50eXBlID0gMHgwYjsJLyogUmVhZCwgRXhlY3V0ZSwgQWNjZXNzZWQgKi8KIAljcy0+cyA9IDE7CiAJY3MtPmRwbCA9IDA7CQkvKiB3aWxsIGJlIGFkanVzdGVkIGxhdGVyICovCi0JY3MtPnByZXNlbnQgPSAxOwotCWNzLT5kYiA9IDE7CisJY3MtPnAgPSAxOworCWNzLT5kID0gMTsKIAotCXNzLT51bnVzYWJsZSA9IDA7Ci0Jc3MtPmJhc2UgPSAwOwkJLyogZmxhdCBzZWdtZW50ICovCi0Jc3MtPmxpbWl0ID0gMHhmZmZmZmZmZjsJLyogNEdCIGxpbWl0ICovCisJc2V0X2Rlc2NfYmFzZShzcywgMCk7CS8qIGZsYXQgc2VnbWVudCAqLworCXNldF9kZXNjX2xpbWl0KHNzLCAweGZmZmZmKTsJLyogNEdCIGxpbWl0ICovCiAJc3MtPmcgPSAxOwkJLyogNGtiIGdyYW51bGFyaXR5ICovCiAJc3MtPnMgPSAxOwogCXNzLT50eXBlID0gMHgwMzsJLyogUmVhZC9Xcml0ZSwgQWNjZXNzZWQgKi8KLQlzcy0+ZGIgPSAxOwkJLyogMzJiaXQgc3RhY2sgc2VnbWVudCAqLworCXNzLT5kID0gMTsJCS8qIDMyYml0IHN0YWNrIHNlZ21lbnQgKi8KIAlzcy0+ZHBsID0gMDsKLQlzcy0+cHJlc2VudCA9IDE7CisJc3MtPnAgPSAxOwogfQogCiBzdGF0aWMgaW50Ci1lbXVsYXRlX3N5c2NhbGwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCitlbXVsYXRlX3N5c2NhbGwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQlzdHJ1Y3Qga3ZtX3NlZ21lbnQgY3MsIHNzOworCXN0cnVjdCBkZXNjX3N0cnVjdCBjcywgc3M7CiAJdTY0IG1zcl9kYXRhOworCXUxNiBjc19zZWwsIHNzX3NlbDsKIAogCS8qIHN5c2NhbGwgaXMgbm90IGF2YWlsYWJsZSBpbiByZWFsIG1vZGUgKi8KIAlpZiAoY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfUkVBTCB8fAogCSAgICBjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9WTTg2KSB7Ci0JCWt2bV9xdWV1ZV9leGNlcHRpb24oY3R4dC0+dmNwdSwgVURfVkVDVE9SKTsKKwkJZW11bGF0ZV91ZChjdHh0KTsKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCX0KIAotCXNldHVwX3N5c2NhbGxzX3NlZ21lbnRzKGN0eHQsICZjcywgJnNzKTsKKwlzZXR1cF9zeXNjYWxsc19zZWdtZW50cyhjdHh0LCBvcHMsICZjcywgJnNzKTsKIAotCWt2bV94ODZfb3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsIE1TUl9TVEFSLCAmbXNyX2RhdGEpOworCW9wcy0+Z2V0X21zcihjdHh0LT52Y3B1LCBNU1JfU1RBUiwgJm1zcl9kYXRhKTsKIAltc3JfZGF0YSA+Pj0gMzI7Ci0JY3Muc2VsZWN0b3IgPSAodTE2KShtc3JfZGF0YSAmIDB4ZmZmYyk7Ci0Jc3Muc2VsZWN0b3IgPSAodTE2KShtc3JfZGF0YSArIDgpOworCWNzX3NlbCA9ICh1MTYpKG1zcl9kYXRhICYgMHhmZmZjKTsKKwlzc19zZWwgPSAodTE2KShtc3JfZGF0YSArIDgpOwogCiAJaWYgKGlzX2xvbmdfbW9kZShjdHh0LT52Y3B1KSkgewotCQljcy5kYiA9IDA7CisJCWNzLmQgPSAwOwogCQljcy5sID0gMTsKIAl9Ci0Ja3ZtX3g4Nl9vcHMtPnNldF9zZWdtZW50KGN0eHQtPnZjcHUsICZjcywgVkNQVV9TUkVHX0NTKTsKLQlrdm1feDg2X29wcy0+c2V0X3NlZ21lbnQoY3R4dC0+dmNwdSwgJnNzLCBWQ1BVX1NSRUdfU1MpOworCW9wcy0+c2V0X2NhY2hlZF9kZXNjcmlwdG9yKCZjcywgVkNQVV9TUkVHX0NTLCBjdHh0LT52Y3B1KTsKKwlvcHMtPnNldF9zZWdtZW50X3NlbGVjdG9yKGNzX3NlbCwgVkNQVV9TUkVHX0NTLCBjdHh0LT52Y3B1KTsKKwlvcHMtPnNldF9jYWNoZWRfZGVzY3JpcHRvcigmc3MsIFZDUFVfU1JFR19TUywgY3R4dC0+dmNwdSk7CisJb3BzLT5zZXRfc2VnbWVudF9zZWxlY3Rvcihzc19zZWwsIFZDUFVfU1JFR19TUywgY3R4dC0+dmNwdSk7CiAKIAljLT5yZWdzW1ZDUFVfUkVHU19SQ1hdID0gYy0+ZWlwOwogCWlmIChpc19sb25nX21vZGUoY3R4dC0+dmNwdSkpIHsKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJCWMtPnJlZ3NbVkNQVV9SRUdTX1IxMV0gPSBjdHh0LT5lZmxhZ3MgJiB+RUZMR19SRjsKIAotCQlrdm1feDg2X29wcy0+Z2V0X21zcihjdHh0LT52Y3B1LAotCQkJY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfUFJPVDY0ID8KLQkJCU1TUl9MU1RBUiA6IE1TUl9DU1RBUiwgJm1zcl9kYXRhKTsKKwkJb3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsCisJCQkgICAgIGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCA/CisJCQkgICAgIE1TUl9MU1RBUiA6IE1TUl9DU1RBUiwgJm1zcl9kYXRhKTsKIAkJYy0+ZWlwID0gbXNyX2RhdGE7CiAKLQkJa3ZtX3g4Nl9vcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX1NZU0NBTExfTUFTSywgJm1zcl9kYXRhKTsKKwkJb3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsIE1TUl9TWVNDQUxMX01BU0ssICZtc3JfZGF0YSk7CiAJCWN0eHQtPmVmbGFncyAmPSB+KG1zcl9kYXRhIHwgRUZMR19SRik7CiAjZW5kaWYKIAl9IGVsc2UgewogCQkvKiBsZWdhY3kgbW9kZSAqLwotCQlrdm1feDg2X29wcy0+Z2V0X21zcihjdHh0LT52Y3B1LCBNU1JfU1RBUiwgJm1zcl9kYXRhKTsKKwkJb3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsIE1TUl9TVEFSLCAmbXNyX2RhdGEpOwogCQljLT5laXAgPSAodTMyKW1zcl9kYXRhOwogCiAJCWN0eHQtPmVmbGFncyAmPSB+KEVGTEdfVk0gfCBFRkxHX0lGIHwgRUZMR19SRik7CkBAIC0xODk2LDE1ICsxOTkxLDE2IEBACiB9CiAKIHN0YXRpYyBpbnQKLWVtdWxhdGVfc3lzZW50ZXIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCitlbXVsYXRlX3N5c2VudGVyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMpCiB7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0Jc3RydWN0IGt2bV9zZWdtZW50IGNzLCBzczsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QgY3MsIHNzOwogCXU2NCBtc3JfZGF0YTsKKwl1MTYgY3Nfc2VsLCBzc19zZWw7CiAKIAkvKiBpbmplY3QgI0dQIGlmIGluIHJlYWwgbW9kZSAqLwogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9SRUFMKSB7Ci0JCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7CisJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAl9CiAKQEAgLTE5MTIsNjcgKzIwMDgsNzAgQEAKIAkqIFRoZXJlZm9yZSwgd2UgaW5qZWN0IGFuICNVRC4KIAkqLwogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpIHsKLQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbihjdHh0LT52Y3B1LCBVRF9WRUNUT1IpOworCQllbXVsYXRlX3VkKGN0eHQpOwogCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJfQogCi0Jc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoY3R4dCwgJmNzLCAmc3MpOworCXNldHVwX3N5c2NhbGxzX3NlZ21lbnRzKGN0eHQsIG9wcywgJmNzLCAmc3MpOwogCi0Ja3ZtX3g4Nl9vcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX0lBMzJfU1lTRU5URVJfQ1MsICZtc3JfZGF0YSk7CisJb3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsIE1TUl9JQTMyX1NZU0VOVEVSX0NTLCAmbXNyX2RhdGEpOwogCXN3aXRjaCAoY3R4dC0+bW9kZSkgewogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1QzMjoKIAkJaWYgKChtc3JfZGF0YSAmIDB4ZmZmYykgPT0gMHgwKSB7Ci0JCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOworCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKIAkJCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJfQogCQlicmVhazsKIAljYXNlIFg4NkVNVUxfTU9ERV9QUk9UNjQ6CiAJCWlmIChtc3JfZGF0YSA9PSAweDApIHsKLQkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7CisJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQl9CiAJCWJyZWFrOwogCX0KIAogCWN0eHQtPmVmbGFncyAmPSB+KEVGTEdfVk0gfCBFRkxHX0lGIHwgRUZMR19SRik7Ci0JY3Muc2VsZWN0b3IgPSAodTE2KW1zcl9kYXRhOwotCWNzLnNlbGVjdG9yICY9IH5TRUxFQ1RPUl9SUExfTUFTSzsKLQlzcy5zZWxlY3RvciA9IGNzLnNlbGVjdG9yICsgODsKLQlzcy5zZWxlY3RvciAmPSB+U0VMRUNUT1JfUlBMX01BU0s7CisJY3Nfc2VsID0gKHUxNiltc3JfZGF0YTsKKwljc19zZWwgJj0gflNFTEVDVE9SX1JQTF9NQVNLOworCXNzX3NlbCA9IGNzX3NlbCArIDg7CisJc3Nfc2VsICY9IH5TRUxFQ1RPUl9SUExfTUFTSzsKIAlpZiAoY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfUFJPVDY0CiAJCXx8IGlzX2xvbmdfbW9kZShjdHh0LT52Y3B1KSkgewotCQljcy5kYiA9IDA7CisJCWNzLmQgPSAwOwogCQljcy5sID0gMTsKIAl9CiAKLQlrdm1feDg2X29wcy0+c2V0X3NlZ21lbnQoY3R4dC0+dmNwdSwgJmNzLCBWQ1BVX1NSRUdfQ1MpOwotCWt2bV94ODZfb3BzLT5zZXRfc2VnbWVudChjdHh0LT52Y3B1LCAmc3MsIFZDUFVfU1JFR19TUyk7CisJb3BzLT5zZXRfY2FjaGVkX2Rlc2NyaXB0b3IoJmNzLCBWQ1BVX1NSRUdfQ1MsIGN0eHQtPnZjcHUpOworCW9wcy0+c2V0X3NlZ21lbnRfc2VsZWN0b3IoY3Nfc2VsLCBWQ1BVX1NSRUdfQ1MsIGN0eHQtPnZjcHUpOworCW9wcy0+c2V0X2NhY2hlZF9kZXNjcmlwdG9yKCZzcywgVkNQVV9TUkVHX1NTLCBjdHh0LT52Y3B1KTsKKwlvcHMtPnNldF9zZWdtZW50X3NlbGVjdG9yKHNzX3NlbCwgVkNQVV9TUkVHX1NTLCBjdHh0LT52Y3B1KTsKIAotCWt2bV94ODZfb3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsIE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgJm1zcl9kYXRhKTsKKwlvcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX0lBMzJfU1lTRU5URVJfRUlQLCAmbXNyX2RhdGEpOwogCWMtPmVpcCA9IG1zcl9kYXRhOwogCi0Ja3ZtX3g4Nl9vcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX0lBMzJfU1lTRU5URVJfRVNQLCAmbXNyX2RhdGEpOworCW9wcy0+Z2V0X21zcihjdHh0LT52Y3B1LCBNU1JfSUEzMl9TWVNFTlRFUl9FU1AsICZtc3JfZGF0YSk7CiAJYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSA9IG1zcl9kYXRhOwogCiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQKLWVtdWxhdGVfc3lzZXhpdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK2VtdWxhdGVfc3lzZXhpdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQogewogCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCXN0cnVjdCBrdm1fc2VnbWVudCBjcywgc3M7CisJc3RydWN0IGRlc2Nfc3RydWN0IGNzLCBzczsKIAl1NjQgbXNyX2RhdGE7CiAJaW50IHVzZXJtb2RlOworCXUxNiBjc19zZWwsIHNzX3NlbDsKIAogCS8qIGluamVjdCAjR1AgaWYgaW4gcmVhbCBtb2RlIG9yIFZpcnR1YWwgODA4NiBtb2RlICovCiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1JFQUwgfHwKIAkgICAgY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfVk04NikgewotCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOworCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJfQogCi0Jc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoY3R4dCwgJmNzLCAmc3MpOworCXNldHVwX3N5c2NhbGxzX3NlZ21lbnRzKGN0eHQsIG9wcywgJmNzLCAmc3MpOwogCiAJaWYgKChjLT5yZXhfcHJlZml4ICYgMHg4KSAhPSAweDApCiAJCXVzZXJtb2RlID0gWDg2RU1VTF9NT0RFX1BST1Q2NDsKQEAgLTE5ODEsMzUgKzIwODAsMzcgQEAKIAogCWNzLmRwbCA9IDM7CiAJc3MuZHBsID0gMzsKLQlrdm1feDg2X29wcy0+Z2V0X21zcihjdHh0LT52Y3B1LCBNU1JfSUEzMl9TWVNFTlRFUl9DUywgJm1zcl9kYXRhKTsKKwlvcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX0lBMzJfU1lTRU5URVJfQ1MsICZtc3JfZGF0YSk7CiAJc3dpdGNoICh1c2VybW9kZSkgewogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1QzMjoKLQkJY3Muc2VsZWN0b3IgPSAodTE2KShtc3JfZGF0YSArIDE2KTsKKwkJY3Nfc2VsID0gKHUxNikobXNyX2RhdGEgKyAxNik7CiAJCWlmICgobXNyX2RhdGEgJiAweGZmZmMpID09IDB4MCkgewotCQkJa3ZtX2luamVjdF9ncChjdHh0LT52Y3B1LCAwKTsKKwkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJCX0KLQkJc3Muc2VsZWN0b3IgPSAodTE2KShtc3JfZGF0YSArIDI0KTsKKwkJc3Nfc2VsID0gKHUxNikobXNyX2RhdGEgKyAyNCk7CiAJCWJyZWFrOwogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1Q2NDoKLQkJY3Muc2VsZWN0b3IgPSAodTE2KShtc3JfZGF0YSArIDMyKTsKKwkJY3Nfc2VsID0gKHUxNikobXNyX2RhdGEgKyAzMik7CiAJCWlmIChtc3JfZGF0YSA9PSAweDApIHsKLQkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7CisJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQl9Ci0JCXNzLnNlbGVjdG9yID0gY3Muc2VsZWN0b3IgKyA4OwotCQljcy5kYiA9IDA7CisJCXNzX3NlbCA9IGNzX3NlbCArIDg7CisJCWNzLmQgPSAwOwogCQljcy5sID0gMTsKIAkJYnJlYWs7CiAJfQotCWNzLnNlbGVjdG9yIHw9IFNFTEVDVE9SX1JQTF9NQVNLOwotCXNzLnNlbGVjdG9yIHw9IFNFTEVDVE9SX1JQTF9NQVNLOworCWNzX3NlbCB8PSBTRUxFQ1RPUl9SUExfTUFTSzsKKwlzc19zZWwgfD0gU0VMRUNUT1JfUlBMX01BU0s7CiAKLQlrdm1feDg2X29wcy0+c2V0X3NlZ21lbnQoY3R4dC0+dmNwdSwgJmNzLCBWQ1BVX1NSRUdfQ1MpOwotCWt2bV94ODZfb3BzLT5zZXRfc2VnbWVudChjdHh0LT52Y3B1LCAmc3MsIFZDUFVfU1JFR19TUyk7CisJb3BzLT5zZXRfY2FjaGVkX2Rlc2NyaXB0b3IoJmNzLCBWQ1BVX1NSRUdfQ1MsIGN0eHQtPnZjcHUpOworCW9wcy0+c2V0X3NlZ21lbnRfc2VsZWN0b3IoY3Nfc2VsLCBWQ1BVX1NSRUdfQ1MsIGN0eHQtPnZjcHUpOworCW9wcy0+c2V0X2NhY2hlZF9kZXNjcmlwdG9yKCZzcywgVkNQVV9TUkVHX1NTLCBjdHh0LT52Y3B1KTsKKwlvcHMtPnNldF9zZWdtZW50X3NlbGVjdG9yKHNzX3NlbCwgVkNQVV9TUkVHX1NTLCBjdHh0LT52Y3B1KTsKIAotCWMtPmVpcCA9IGN0eHQtPnZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXTsKLQljLT5yZWdzW1ZDUFVfUkVHU19SU1BdID0gY3R4dC0+dmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCWMtPmVpcCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CisJYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF07CiAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KQEAgLTIwMzAsMjUgKzIxMzEsMjUgQEAKIAkJCQkJICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCQkJICAgIHUxNiBwb3J0LCB1MTYgbGVuKQogewotCXN0cnVjdCBrdm1fc2VnbWVudCB0cl9zZWc7CisJc3RydWN0IGRlc2Nfc3RydWN0IHRyX3NlZzsKIAlpbnQgcjsKIAl1MTYgaW9fYml0bWFwX3B0cjsKIAl1OCBwZXJtLCBiaXRfaWR4ID0gcG9ydCAmIDB4NzsKIAl1bnNpZ25lZCBtYXNrID0gKDEgPDwgbGVuKSAtIDE7CiAKLQlrdm1fZ2V0X3NlZ21lbnQoY3R4dC0+dmNwdSwgJnRyX3NlZywgVkNQVV9TUkVHX1RSKTsKLQlpZiAodHJfc2VnLnVudXNhYmxlKQorCW9wcy0+Z2V0X2NhY2hlZF9kZXNjcmlwdG9yKCZ0cl9zZWcsIFZDUFVfU1JFR19UUiwgY3R4dC0+dmNwdSk7CisJaWYgKCF0cl9zZWcucCkKIAkJcmV0dXJuIGZhbHNlOwotCWlmICh0cl9zZWcubGltaXQgPCAxMDMpCisJaWYgKGRlc2NfbGltaXRfc2NhbGVkKCZ0cl9zZWcpIDwgMTAzKQogCQlyZXR1cm4gZmFsc2U7Ci0JciA9IG9wcy0+cmVhZF9zdGQodHJfc2VnLmJhc2UgKyAxMDIsICZpb19iaXRtYXBfcHRyLCAyLCBjdHh0LT52Y3B1LAotCQkJICBOVUxMKTsKKwlyID0gb3BzLT5yZWFkX3N0ZChnZXRfZGVzY19iYXNlKCZ0cl9zZWcpICsgMTAyLCAmaW9fYml0bWFwX3B0ciwgMiwKKwkJCSAgY3R4dC0+dmNwdSwgTlVMTCk7CiAJaWYgKHIgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChpb19iaXRtYXBfcHRyICsgcG9ydC84ID4gdHJfc2VnLmxpbWl0KQorCWlmIChpb19iaXRtYXBfcHRyICsgcG9ydC84ID4gZGVzY19saW1pdF9zY2FsZWQoJnRyX3NlZykpCiAJCXJldHVybiBmYWxzZTsKLQlyID0gb3BzLT5yZWFkX3N0ZCh0cl9zZWcuYmFzZSArIGlvX2JpdG1hcF9wdHIgKyBwb3J0LzgsICZwZXJtLCAxLAotCQkJICBjdHh0LT52Y3B1LCBOVUxMKTsKKwlyID0gb3BzLT5yZWFkX3N0ZChnZXRfZGVzY19iYXNlKCZ0cl9zZWcpICsgaW9fYml0bWFwX3B0ciArIHBvcnQvOCwKKwkJCSAgJnBlcm0sIDEsIGN0eHQtPnZjcHUsIE5VTEwpOwogCWlmIChyICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAoKHBlcm0gPj4gYml0X2lkeCkgJiBtYXNrKQpAQCAtMjA2NiwxNyArMjE2Nyw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB1MzIgZ2V0X2NhY2hlZF9kZXNjcmlwdG9yX2Jhc2Uoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkJICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAotCQkJCSAgICAgIGludCBzZWcpCi17Ci0Jc3RydWN0IGRlc2Nfc3RydWN0IGRlc2M7Ci0JaWYgKG9wcy0+Z2V0X2NhY2hlZF9kZXNjcmlwdG9yKCZkZXNjLCBzZWcsIGN0eHQtPnZjcHUpKQotCQlyZXR1cm4gZ2V0X2Rlc2NfYmFzZSgmZGVzYyk7Ci0JZWxzZQotCQlyZXR1cm4gfjA7Ci19Ci0KIHN0YXRpYyB2b2lkIHNhdmVfc3RhdGVfdG9fdHNzMTYoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCiAJCQkJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAogCQkJCXN0cnVjdCB0c3Nfc2VnbWVudF8xNiAqdHNzKQpAQCAtMjE2NSw3ICsyMjU1LDcgQEAKIAkJCSAgICAmZXJyKTsKIAlpZiAocmV0ID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKSB7CiAJCS8qIEZJWE1FOiBuZWVkIHRvIHByb3ZpZGUgcHJlY2lzZSBmYXVsdCBhZGRyZXNzICovCi0JCWt2bV9pbmplY3RfcGFnZV9mYXVsdChjdHh0LT52Y3B1LCBvbGRfdHNzX2Jhc2UsIGVycik7CisJCWVtdWxhdGVfcGYoY3R4dCwgb2xkX3Rzc19iYXNlLCBlcnIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMjE3NSw3ICsyMjY1LDcgQEAKIAkJCSAgICAgJmVycik7CiAJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgewogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQoY3R4dC0+dmNwdSwgb2xkX3Rzc19iYXNlLCBlcnIpOworCQllbXVsYXRlX3BmKGN0eHQsIG9sZF90c3NfYmFzZSwgZXJyKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIxODMsNyArMjI3Myw3IEBACiAJCQkgICAgJmVycik7CiAJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgewogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQoY3R4dC0+dmNwdSwgbmV3X3Rzc19iYXNlLCBlcnIpOworCQllbXVsYXRlX3BmKGN0eHQsIG5ld190c3NfYmFzZSwgZXJyKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIxOTYsNyArMjI4Niw3IEBACiAJCQkJICAgICBjdHh0LT52Y3B1LCAmZXJyKTsKIAkJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgewogCQkJLyogRklYTUU6IG5lZWQgdG8gcHJvdmlkZSBwcmVjaXNlIGZhdWx0IGFkZHJlc3MgKi8KLQkJCWt2bV9pbmplY3RfcGFnZV9mYXVsdChjdHh0LT52Y3B1LCBuZXdfdHNzX2Jhc2UsIGVycik7CisJCQllbXVsYXRlX3BmKGN0eHQsIG5ld190c3NfYmFzZSwgZXJyKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC0yMjM4LDcgKzIzMjgsMTAgQEAKIAlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmV0OwogCi0Jb3BzLT5zZXRfY3IoMywgdHNzLT5jcjMsIGN0eHQtPnZjcHUpOworCWlmIChvcHMtPnNldF9jcigzLCB0c3MtPmNyMywgY3R4dC0+dmNwdSkpIHsKKwkJZW11bGF0ZV9ncChjdHh0LCAwKTsKKwkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOworCX0KIAljLT5laXAgPSB0c3MtPmVpcDsKIAljdHh0LT5lZmxhZ3MgPSB0c3MtPmVmbGFncyB8IDI7CiAJYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHRzcy0+ZWF4OwpAQCAtMjMwNCw3ICsyMzk3LDcgQEAKIAkJCSAgICAmZXJyKTsKIAlpZiAocmV0ID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKSB7CiAJCS8qIEZJWE1FOiBuZWVkIHRvIHByb3ZpZGUgcHJlY2lzZSBmYXVsdCBhZGRyZXNzICovCi0JCWt2bV9pbmplY3RfcGFnZV9mYXVsdChjdHh0LT52Y3B1LCBvbGRfdHNzX2Jhc2UsIGVycik7CisJCWVtdWxhdGVfcGYoY3R4dCwgb2xkX3Rzc19iYXNlLCBlcnIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMjMxNCw3ICsyNDA3LDcgQEAKIAkJCSAgICAgJmVycik7CiAJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgewogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQoY3R4dC0+dmNwdSwgb2xkX3Rzc19iYXNlLCBlcnIpOworCQllbXVsYXRlX3BmKGN0eHQsIG9sZF90c3NfYmFzZSwgZXJyKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIzMjIsNyArMjQxNSw3IEBACiAJCQkgICAgJmVycik7CiAJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgewogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQoY3R4dC0+dmNwdSwgbmV3X3Rzc19iYXNlLCBlcnIpOworCQllbXVsYXRlX3BmKGN0eHQsIG5ld190c3NfYmFzZSwgZXJyKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIzMzUsNyArMjQyOCw3IEBACiAJCQkJICAgICBjdHh0LT52Y3B1LCAmZXJyKTsKIAkJaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgewogCQkJLyogRklYTUU6IG5lZWQgdG8gcHJvdmlkZSBwcmVjaXNlIGZhdWx0IGFkZHJlc3MgKi8KLQkJCWt2bV9pbmplY3RfcGFnZV9mYXVsdChjdHh0LT52Y3B1LCBuZXdfdHNzX2Jhc2UsIGVycik7CisJCQllbXVsYXRlX3BmKGN0eHQsIG5ld190c3NfYmFzZSwgZXJyKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC0yMzUyLDcgKzI0NDUsNyBAQAogCWludCByZXQ7CiAJdTE2IG9sZF90c3Nfc2VsID0gb3BzLT5nZXRfc2VnbWVudF9zZWxlY3RvcihWQ1BVX1NSRUdfVFIsIGN0eHQtPnZjcHUpOwogCXVsb25nIG9sZF90c3NfYmFzZSA9Ci0JCWdldF9jYWNoZWRfZGVzY3JpcHRvcl9iYXNlKGN0eHQsIG9wcywgVkNQVV9TUkVHX1RSKTsKKwkJb3BzLT5nZXRfY2FjaGVkX3NlZ21lbnRfYmFzZShWQ1BVX1NSRUdfVFIsIGN0eHQtPnZjcHUpOwogCXUzMiBkZXNjX2xpbWl0OwogCiAJLyogRklYTUU6IG9sZF90c3NfYmFzZSA9PSB+MCA/ICovCkBAIC0yMzY5LDcgKzI0NjIsNyBAQAogCWlmIChyZWFzb24gIT0gVEFTS19TV0lUQ0hfSVJFVCkgewogCQlpZiAoKHRzc19zZWxlY3RvciAmIDMpID4gbmV4dF90c3NfZGVzYy5kcGwgfHwKIAkJICAgIG9wcy0+Y3BsKGN0eHQtPnZjcHUpID4gbmV4dF90c3NfZGVzYy5kcGwpIHsKLQkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7CisJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQl9CiAJfQpAQCAtMjM3OCw4ICsyNDcxLDcgQEAKIAlpZiAoIW5leHRfdHNzX2Rlc2MucCB8fAogCSAgICAoKGRlc2NfbGltaXQgPCAweDY3ICYmIChuZXh0X3Rzc19kZXNjLnR5cGUgJiA4KSkgfHwKIAkgICAgIGRlc2NfbGltaXQgPCAweDJiKSkgewotCQlrdm1fcXVldWVfZXhjZXB0aW9uX2UoY3R4dC0+dmNwdSwgVFNfVkVDVE9SLAotCQkJCSAgICAgIHRzc19zZWxlY3RvciAmIDB4ZmZmYyk7CisJCWVtdWxhdGVfdHMoY3R4dCwgdHNzX3NlbGVjdG9yICYgMHhmZmZjKTsKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCX0KIApAQCAtMjQyNSw3ICsyNTE3LDcgQEAKIAkJYy0+b3BfYnl0ZXMgPSBjLT5hZF9ieXRlcyA9IChuZXh0X3Rzc19kZXNjLnR5cGUgJiA4KSA/IDQgOiAyOwogCQljLT5sb2NrX3ByZWZpeCA9IDA7CiAJCWMtPnNyYy52YWwgPSAodW5zaWduZWQgbG9uZykgZXJyb3JfY29kZTsKLQkJZW11bGF0ZV9wdXNoKGN0eHQpOworCQllbXVsYXRlX3B1c2goY3R4dCwgb3BzKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjQzOSwxOCArMjUzMSwxNiBAQAogCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCByYzsKIAotCW1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IGRlY29kZV9jYWNoZSkpOwogCWMtPmVpcCA9IGN0eHQtPmVpcDsKLQltZW1jcHkoYy0+cmVncywgY3R4dC0+dmNwdS0+YXJjaC5yZWdzLCBzaXplb2YgYy0+cmVncyk7CiAJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwogCiAJcmMgPSBlbXVsYXRvcl9kb190YXNrX3N3aXRjaChjdHh0LCBvcHMsIHRzc19zZWxlY3RvciwgcmVhc29uLAogCQkJCSAgICAgaGFzX2Vycm9yX2NvZGUsIGVycm9yX2NvZGUpOwogCiAJaWYgKHJjID09IFg4NkVNVUxfQ09OVElOVUUpIHsKLQkJbWVtY3B5KGN0eHQtPnZjcHUtPmFyY2gucmVncywgYy0+cmVncywgc2l6ZW9mIGMtPnJlZ3MpOwotCQlrdm1fcmlwX3dyaXRlKGN0eHQtPnZjcHUsIGMtPmVpcCk7CiAJCXJjID0gd3JpdGViYWNrKGN0eHQsIG9wcyk7CisJCWlmIChyYyA9PSBYODZFTVVMX0NPTlRJTlVFKQorCQkJY3R4dC0+ZWlwID0gYy0+ZWlwOwogCX0KIAogCXJldHVybiAocmMgPT0gWDg2RU1VTF9VTkhBTkRMRUFCTEUpID8gLTEgOiAwOwpAQCAtMjQ3NCwyOSArMjU2NCwyMiBAQAogCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAJaW50IHNhdmVkX2RzdF90eXBlID0gYy0+ZHN0LnR5cGU7CiAKLQljdHh0LT5pbnRlcnJ1cHRpYmlsaXR5ID0gMDsKLQotCS8qIFNoYWRvdyBjb3B5IG9mIHJlZ2lzdGVyIHN0YXRlLiBDb21taXR0ZWQgb24gc3VjY2Vzc2Z1bCBlbXVsYXRpb24uCi0JICogTk9URTogd2UgY2FuIGNvcHkgdGhlbSBmcm9tIHZjcHUgYXMgeDg2X2RlY29kZV9pbnNuKCkgZG9lc24ndAotCSAqIG1vZGlmeSB0aGVtLgotCSAqLwotCi0JbWVtY3B5KGMtPnJlZ3MsIGN0eHQtPnZjcHUtPmFyY2gucmVncywgc2l6ZW9mIGMtPnJlZ3MpOworCWN0eHQtPmRlY29kZS5tZW1fcmVhZC5wb3MgPSAwOwogCiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCAmJiAoYy0+ZCAmIE5vNjQpKSB7Ci0JCWt2bV9xdWV1ZV9leGNlcHRpb24oY3R4dC0+dmNwdSwgVURfVkVDVE9SKTsKKwkJZW11bGF0ZV91ZChjdHh0KTsKIAkJZ290byBkb25lOwogCX0KIAogCS8qIExPQ0sgcHJlZml4IGlzIGFsbG93ZWQgb25seSB3aXRoIHNvbWUgaW5zdHJ1Y3Rpb25zICovCiAJaWYgKGMtPmxvY2tfcHJlZml4ICYmICghKGMtPmQgJiBMb2NrKSB8fCBjLT5kc3QudHlwZSAhPSBPUF9NRU0pKSB7Ci0JCWt2bV9xdWV1ZV9leGNlcHRpb24oY3R4dC0+dmNwdSwgVURfVkVDVE9SKTsKKwkJZW11bGF0ZV91ZChjdHh0KTsKIAkJZ290byBkb25lOwogCX0KIAogCS8qIFByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24gY2FuIGJlIGV4ZWN1dGVkIG9ubHkgaW4gQ1BMPTAgKi8KIAlpZiAoKGMtPmQgJiBQcml2KSAmJiBvcHMtPmNwbChjdHh0LT52Y3B1KSkgewotCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOworCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0yNTA2LDcgKzI1ODksNyBAQAogCQlpZiAoYWRkcmVzc19tYXNrKGMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0pID09IDApIHsKIAkJc3RyaW5nX2RvbmU6CiAJCQljdHh0LT5yZXN0YXJ0ID0gZmFsc2U7Ci0JCQlrdm1fcmlwX3dyaXRlKGN0eHQtPnZjcHUsIGMtPmVpcCk7CisJCQljdHh0LT5laXAgPSBjLT5laXA7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJLyogVGhlIHNlY29uZCB0ZXJtaW5hdGlvbiBjb25kaXRpb24gb25seSBhcHBsaWVzIGZvciBSRVBFCkBAIC0yNTI5LDIwICsyNjEyLDE2IEBACiAJfQogCiAJaWYgKGMtPnNyYy50eXBlID09IE9QX01FTSkgewotCQlyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZCgodW5zaWduZWQgbG9uZyljLT5zcmMucHRyLAotCQkJCQkmYy0+c3JjLnZhbCwKLQkJCQkJYy0+c3JjLmJ5dGVzLAotCQkJCQljdHh0LT52Y3B1KTsKKwkJcmMgPSByZWFkX2VtdWxhdGVkKGN0eHQsIG9wcywgKHVuc2lnbmVkIGxvbmcpYy0+c3JjLnB0ciwKKwkJCQkJYy0+c3JjLnZhbHB0ciwgYy0+c3JjLmJ5dGVzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJCWMtPnNyYy5vcmlnX3ZhbCA9IGMtPnNyYy52YWw7CiAJfQogCiAJaWYgKGMtPnNyYzIudHlwZSA9PSBPUF9NRU0pIHsKLQkJcmMgPSBvcHMtPnJlYWRfZW11bGF0ZWQoKHVuc2lnbmVkIGxvbmcpYy0+c3JjMi5wdHIsCi0JCQkJCSZjLT5zcmMyLnZhbCwKLQkJCQkJYy0+c3JjMi5ieXRlcywKLQkJCQkJY3R4dC0+dmNwdSk7CisJCXJjID0gcmVhZF9lbXVsYXRlZChjdHh0LCBvcHMsICh1bnNpZ25lZCBsb25nKWMtPnNyYzIucHRyLAorCQkJCQkmYy0+c3JjMi52YWwsIGMtPnNyYzIuYnl0ZXMpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKIAl9CkBAIC0yNTUzLDggKzI2MzIsOCBAQAogCiAJaWYgKChjLT5kc3QudHlwZSA9PSBPUF9NRU0pICYmICEoYy0+ZCAmIE1vdikpIHsKIAkJLyogb3B0aW1pc2F0aW9uIC0gYXZvaWQgc2xvdyBlbXVsYXRlZCByZWFkIGlmIE1vdiAqLwotCQlyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZCgodW5zaWduZWQgbG9uZyljLT5kc3QucHRyLCAmYy0+ZHN0LnZhbCwKLQkJCQkJYy0+ZHN0LmJ5dGVzLCBjdHh0LT52Y3B1KTsKKwkJcmMgPSByZWFkX2VtdWxhdGVkKGN0eHQsIG9wcywgKHVuc2lnbmVkIGxvbmcpYy0+ZHN0LnB0ciwKKwkJCQkgICAmYy0+ZHN0LnZhbCwgYy0+ZHN0LmJ5dGVzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJfQpAQCAtMjU3MSw3ICsyNjUwLDcgQEAKIAkJZW11bGF0ZV8yb3BfU3JjVigiYWRkIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMHgwNjoJCS8qIHB1c2ggZXMgKi8KLQkJZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0VTKTsKKwkJZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfRVMpOwogCQlicmVhazsKIAljYXNlIDB4MDc6CQkvKiBwb3AgZXMgKi8KIAkJcmMgPSBlbXVsYXRlX3BvcF9zcmVnKGN0eHQsIG9wcywgVkNQVV9TUkVHX0VTKTsKQEAgLTI1ODMsMTQgKzI2NjIsMTQgQEAKIAkJZW11bGF0ZV8yb3BfU3JjVigib3IiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAweDBlOgkJLyogcHVzaCBjcyAqLwotCQllbXVsYXRlX3B1c2hfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfQ1MpOworCQllbXVsYXRlX3B1c2hfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19DUyk7CiAJCWJyZWFrOwogCWNhc2UgMHgxMCAuLi4gMHgxNToKIAkgICAgICBhZGM6CQkvKiBhZGMgKi8KIAkJZW11bGF0ZV8yb3BfU3JjVigiYWRjIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMHgxNjoJCS8qIHB1c2ggc3MgKi8KLQkJZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX1NTKTsKKwkJZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfU1MpOwogCQlicmVhazsKIAljYXNlIDB4MTc6CQkvKiBwb3Agc3MgKi8KIAkJcmMgPSBlbXVsYXRlX3BvcF9zcmVnKGN0eHQsIG9wcywgVkNQVV9TUkVHX1NTKTsKQEAgLTI2MDIsNyArMjY4MSw3IEBACiAJCWVtdWxhdGVfMm9wX1NyY1YoInNiYiIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDB4MWU6CQkvKiBwdXNoIGRzICovCi0JCWVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19EUyk7CisJCWVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIG9wcywgVkNQVV9TUkVHX0RTKTsKIAkJYnJlYWs7CiAJY2FzZSAweDFmOgkJLyogcG9wIGRzICovCiAJCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19EUyk7CkBAIC0yNjMyLDcgKzI3MTEsNyBAQAogCQllbXVsYXRlXzFvcCgiZGVjIiwgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDB4NTAgLi4uIDB4NTc6ICAvKiBwdXNoIHJlZyAqLwotCQllbXVsYXRlX3B1c2goY3R4dCk7CisJCWVtdWxhdGVfcHVzaChjdHh0LCBvcHMpOwogCQlicmVhazsKIAljYXNlIDB4NTggLi4uIDB4NWY6IC8qIHBvcCByZWcgKi8KIAlwb3BfaW5zdHJ1Y3Rpb246CkBAIC0yNjQxLDcgKzI3MjAsOSBAQAogCQkJZ290byBkb25lOwogCQlicmVhazsKIAljYXNlIDB4NjA6CS8qIHB1c2hhICovCi0JCWVtdWxhdGVfcHVzaGEoY3R4dCk7CisJCXJjID0gZW11bGF0ZV9wdXNoYShjdHh0LCBvcHMpOworCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKKwkJCWdvdG8gZG9uZTsKIAkJYnJlYWs7CiAJY2FzZSAweDYxOgkvKiBwb3BhICovCiAJCXJjID0gZW11bGF0ZV9wb3BhKGN0eHQsIG9wcyk7CkBAIC0yNjU1LDE0ICsyNzM2LDE0IEBACiAJCWJyZWFrOwogCWNhc2UgMHg2ODogLyogcHVzaCBpbW0gKi8KIAljYXNlIDB4NmE6IC8qIHB1c2ggaW1tOCAqLwotCQllbXVsYXRlX3B1c2goY3R4dCk7CisJCWVtdWxhdGVfcHVzaChjdHh0LCBvcHMpOwogCQlicmVhazsKIAljYXNlIDB4NmM6CQkvKiBpbnNiICovCiAJY2FzZSAweDZkOgkJLyogaW5zdy9pbnNkICovCiAJCWMtPmRzdC5ieXRlcyA9IG1pbihjLT5kc3QuYnl0ZXMsIDR1KTsKIAkJaWYgKCFlbXVsYXRvcl9pb19wZXJtaXRlZChjdHh0LCBvcHMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF0sCiAJCQkJCSAgYy0+ZHN0LmJ5dGVzKSkgewotCQkJa3ZtX2luamVjdF9ncChjdHh0LT52Y3B1LCAwKTsKKwkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJaWYgKCFwaW9faW5fZW11bGF0ZWQoY3R4dCwgb3BzLCBjLT5kc3QuYnl0ZXMsCkBAIC0yNjc0LDcgKzI3NTUsNyBAQAogCQljLT5zcmMuYnl0ZXMgPSBtaW4oYy0+c3JjLmJ5dGVzLCA0dSk7CiAJCWlmICghZW11bGF0b3JfaW9fcGVybWl0ZWQoY3R4dCwgb3BzLCBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdLAogCQkJCQkgIGMtPnNyYy5ieXRlcykpIHsKLQkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7CisJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJZ290byBkb25lOwogCQl9CiAJCW9wcy0+cGlvX291dF9lbXVsYXRlZChjLT5zcmMuYnl0ZXMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF0sCkBAIC0yNzA3LDYgKzI3ODgsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgMHg4NCAuLi4gMHg4NToKKwl0ZXN0OgogCQllbXVsYXRlXzJvcF9TcmNWKCJ0ZXN0IiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMHg4NiAuLi4gMHg4NzoJLyogeGNoZyAqLwpAQCAtMjczNSwxOCArMjgxNywxMyBAQAogCQlicmVhazsKIAljYXNlIDB4ODggLi4uIDB4OGI6CS8qIG1vdiAqLwogCQlnb3RvIG1vdjsKLQljYXNlIDB4OGM6IHsgLyogbW92IHIvbSwgc3JlZyAqLwotCQlzdHJ1Y3Qga3ZtX3NlZ21lbnQgc2VncmVnOwotCi0JCWlmIChjLT5tb2RybV9yZWcgPD0gVkNQVV9TUkVHX0dTKQotCQkJa3ZtX2dldF9zZWdtZW50KGN0eHQtPnZjcHUsICZzZWdyZWcsIGMtPm1vZHJtX3JlZyk7Ci0JCWVsc2UgewotCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbihjdHh0LT52Y3B1LCBVRF9WRUNUT1IpOworCWNhc2UgMHg4YzogIC8qIG1vdiByL20sIHNyZWcgKi8KKwkJaWYgKGMtPm1vZHJtX3JlZyA+IFZDUFVfU1JFR19HUykgeworCQkJZW11bGF0ZV91ZChjdHh0KTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQljLT5kc3QudmFsID0gc2VncmVnLnNlbGVjdG9yOworCQljLT5kc3QudmFsID0gb3BzLT5nZXRfc2VnbWVudF9zZWxlY3RvcihjLT5tb2RybV9yZWcsIGN0eHQtPnZjcHUpOwogCQlicmVhazsKLQl9CiAJY2FzZSAweDhkOiAvKiBsZWEgcjE2L3IzMiwgbSAqLwogCQljLT5kc3QudmFsID0gYy0+bW9kcm1fZWE7CiAJCWJyZWFrOwpAQCAtMjc1NywxMiArMjgzNCwxMiBAQAogCiAJCWlmIChjLT5tb2RybV9yZWcgPT0gVkNQVV9TUkVHX0NTIHx8CiAJCSAgICBjLT5tb2RybV9yZWcgPiBWQ1BVX1NSRUdfR1MpIHsKLQkJCWt2bV9xdWV1ZV9leGNlcHRpb24oY3R4dC0+dmNwdSwgVURfVkVDVE9SKTsKKwkJCWVtdWxhdGVfdWQoY3R4dCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAogCQlpZiAoYy0+bW9kcm1fcmVnID09IFZDUFVfU1JFR19TUykKLQkJCXRvZ2dsZV9pbnRlcnJ1cHRpYmlsaXR5KGN0eHQsIEtWTV9YODZfU0hBRE9XX0lOVF9NT1ZfU1MpOworCQkJY3R4dC0+aW50ZXJydXB0aWJpbGl0eSA9IEtWTV9YODZfU0hBRE9XX0lOVF9NT1ZfU1M7CiAKIAkJcmMgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHNlbCwgYy0+bW9kcm1fcmVnKTsKIApAQCAtMjc3NSwxOSArMjg1MiwxOSBAQAogCQkJZ290byBkb25lOwogCQlicmVhazsKIAljYXNlIDB4OTA6IC8qIG5vcCAvIHhjaGcgcjgscmF4ICovCi0JCWlmICghKGMtPnJleF9wcmVmaXggJiAxKSkgeyAvKiBub3AgKi8KLQkJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKKwkJaWYgKGMtPmRzdC5wdHIgPT0gKHVuc2lnbmVkIGxvbmcgKikmYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXSkgeworCQkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOyAgLyogbm9wICovCiAJCQlicmVhazsKIAkJfQogCWNhc2UgMHg5MSAuLi4gMHg5NzogLyogeGNoZyByZWcscmF4ICovCi0JCWMtPnNyYy50eXBlID0gYy0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWMtPnNyYy5ieXRlcyA9IGMtPmRzdC5ieXRlcyA9IGMtPm9wX2J5dGVzOworCQljLT5zcmMudHlwZSA9IE9QX1JFRzsKKwkJYy0+c3JjLmJ5dGVzID0gYy0+b3BfYnl0ZXM7CiAJCWMtPnNyYy5wdHIgPSAodW5zaWduZWQgbG9uZyAqKSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKIAkJYy0+c3JjLnZhbCA9ICooYy0+c3JjLnB0cik7CiAJCWdvdG8geGNoZzsKIAljYXNlIDB4OWM6IC8qIHB1c2hmICovCiAJCWMtPnNyYy52YWwgPSAgKHVuc2lnbmVkIGxvbmcpIGN0eHQtPmVmbGFnczsKLQkJZW11bGF0ZV9wdXNoKGN0eHQpOworCQllbXVsYXRlX3B1c2goY3R4dCwgb3BzKTsKIAkJYnJlYWs7CiAJY2FzZSAweDlkOiAvKiBwb3BmICovCiAJCWMtPmRzdC50eXBlID0gT1BfUkVHOwpAQCAtMjc5NywxOSArMjg3NCwxNSBAQAogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKIAkJYnJlYWs7Ci0JY2FzZSAweGEwIC4uLiAweGExOgkvKiBtb3YgKi8KLQkJYy0+ZHN0LnB0ciA9ICh1bnNpZ25lZCBsb25nICopJmMtPnJlZ3NbVkNQVV9SRUdTX1JBWF07Ci0JCWMtPmRzdC52YWwgPSBjLT5zcmMudmFsOwotCQlicmVhazsKLQljYXNlIDB4YTIgLi4uIDB4YTM6CS8qIG1vdiAqLwotCQljLT5kc3QudmFsID0gKHVuc2lnbmVkIGxvbmcpYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKLQkJYnJlYWs7CisJY2FzZSAweGEwIC4uLiAweGEzOgkvKiBtb3YgKi8KIAljYXNlIDB4YTQgLi4uIDB4YTU6CS8qIG1vdnMgKi8KIAkJZ290byBtb3Y7CiAJY2FzZSAweGE2IC4uLiAweGE3OgkvKiBjbXBzICovCiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsgLyogRGlzYWJsZSB3cml0ZWJhY2suICovCiAJCURQUklOVEYoImNtcHM6IG1lbTE9MHglcCBtZW0yPTB4JXBcbiIsIGMtPnNyYy5wdHIsIGMtPmRzdC5wdHIpOwogCQlnb3RvIGNtcDsKKwljYXNlIDB4YTggLi4uIDB4YTk6CS8qIHRlc3QgYXgsIGltbSAqLworCQlnb3RvIHRlc3Q7CiAJY2FzZSAweGFhIC4uLiAweGFiOgkvKiBzdG9zICovCiAJCWMtPmRzdC52YWwgPSBjLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwogCQlicmVhazsKQEAgLTI4NTUsMTkgKzI5MjgsMjMgQEAKIAkJbG9uZyBpbnQgcmVsID0gYy0+c3JjLnZhbDsKIAkJYy0+c3JjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBjLT5laXA7CiAJCWptcF9yZWwoYywgcmVsKTsKLQkJZW11bGF0ZV9wdXNoKGN0eHQpOworCQllbXVsYXRlX3B1c2goY3R4dCwgb3BzKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMHhlOTogLyogam1wIHJlbCAqLwogCQlnb3RvIGptcDsKLQljYXNlIDB4ZWE6IC8qIGptcCBmYXIgKi8KKwljYXNlIDB4ZWE6IHsgLyogam1wIGZhciAqLworCQl1bnNpZ25lZCBzaG9ydCBzZWw7CiAJanVtcF9mYXI6Ci0JCWlmIChsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIGMtPnNyYzIudmFsLAotCQkJCQkgICAgVkNQVV9TUkVHX0NTKSkKKwkJbWVtY3B5KCZzZWwsIGMtPnNyYy52YWxwdHIgKyBjLT5vcF9ieXRlcywgMik7CisKKwkJaWYgKGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9wcywgc2VsLCBWQ1BVX1NSRUdfQ1MpKQogCQkJZ290byBkb25lOwogCi0JCWMtPmVpcCA9IGMtPnNyYy52YWw7CisJCWMtPmVpcCA9IDA7CisJCW1lbWNweSgmYy0+ZWlwLCBjLT5zcmMudmFscHRyLCBjLT5vcF9ieXRlcyk7CiAJCWJyZWFrOworCX0KIAljYXNlIDB4ZWI6CiAJICAgICAgam1wOgkJLyogam1wIHJlbCBzaG9ydCAqLwogCQlqbXBfcmVsKGMsIGMtPnNyYy52YWwpOwpAQCAtMjg3OSwyMCArMjk1NiwyMCBAQAogCWRvX2lvX2luOgogCQljLT5kc3QuYnl0ZXMgPSBtaW4oYy0+ZHN0LmJ5dGVzLCA0dSk7CiAJCWlmICghZW11bGF0b3JfaW9fcGVybWl0ZWQoY3R4dCwgb3BzLCBjLT5zcmMudmFsLCBjLT5kc3QuYnl0ZXMpKSB7Ci0JCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOworCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQlpZiAoIXBpb19pbl9lbXVsYXRlZChjdHh0LCBvcHMsIGMtPmRzdC5ieXRlcywgYy0+c3JjLnZhbCwKIAkJCQkgICAgICZjLT5kc3QudmFsKSkKIAkJCWdvdG8gZG9uZTsgLyogSU8gaXMgbmVlZGVkICovCiAJCWJyZWFrOwotCWNhc2UgMHhlZTogLyogb3V0IGFsLGR4ICovCi0JY2FzZSAweGVmOiAvKiBvdXQgKGUvcilheCxkeCAqLworCWNhc2UgMHhlZTogLyogb3V0IGR4LGFsICovCisJY2FzZSAweGVmOiAvKiBvdXQgZHgsKGUvcilheCAqLwogCQljLT5zcmMudmFsID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKIAlkb19pb19vdXQ6CiAJCWMtPmRzdC5ieXRlcyA9IG1pbihjLT5kc3QuYnl0ZXMsIDR1KTsKIAkJaWYgKCFlbXVsYXRvcl9pb19wZXJtaXRlZChjdHh0LCBvcHMsIGMtPnNyYy52YWwsIGMtPmRzdC5ieXRlcykpIHsKLQkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7CisJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJZ290byBkb25lOwogCQl9CiAJCW9wcy0+cGlvX291dF9lbXVsYXRlZChjLT5kc3QuYnl0ZXMsIGMtPnNyYy52YWwsICZjLT5kc3QudmFsLCAxLApAQCAtMjkxNiwxOCArMjk5MywyMCBAQAogCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCQlicmVhazsKIAljYXNlIDB4ZmE6IC8qIGNsaSAqLwotCQlpZiAoZW11bGF0b3JfYmFkX2lvcGwoY3R4dCwgb3BzKSkKLQkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7Ci0JCWVsc2UgeworCQlpZiAoZW11bGF0b3JfYmFkX2lvcGwoY3R4dCwgb3BzKSkgeworCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIHsKIAkJCWN0eHQtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19JRjsKIAkJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweGZiOiAvKiBzdGkgKi8KLQkJaWYgKGVtdWxhdG9yX2JhZF9pb3BsKGN0eHQsIG9wcykpCi0JCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOwotCQllbHNlIHsKLQkJCXRvZ2dsZV9pbnRlcnJ1cHRpYmlsaXR5KGN0eHQsIEtWTV9YODZfU0hBRE9XX0lOVF9TVEkpOworCQlpZiAoZW11bGF0b3JfYmFkX2lvcGwoY3R4dCwgb3BzKSkgeworCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIHsKKwkJCWN0eHQtPmludGVycnVwdGliaWxpdHkgPSBLVk1fWDg2X1NIQURPV19JTlRfU1RJOwogCQkJY3R4dC0+ZWZsYWdzIHw9IFg4Nl9FRkxBR1NfSUY7CiAJCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCQl9CkBAIC0yOTY0LDExICszMDQzLDEyIEBACiAJYy0+ZHN0LnR5cGUgPSBzYXZlZF9kc3RfdHlwZTsKIAogCWlmICgoYy0+ZCAmIFNyY01hc2spID09IFNyY1NJKQotCQlzdHJpbmdfYWRkcl9pbmMoY3R4dCwgc2VnX292ZXJyaWRlX2Jhc2UoY3R4dCwgYyksIFZDUFVfUkVHU19SU0ksCi0JCQkJJmMtPnNyYyk7CisJCXN0cmluZ19hZGRyX2luYyhjdHh0LCBzZWdfb3ZlcnJpZGVfYmFzZShjdHh0LCBvcHMsIGMpLAorCQkJCVZDUFVfUkVHU19SU0ksICZjLT5zcmMpOwogCiAJaWYgKChjLT5kICYgRHN0TWFzaykgPT0gRHN0REkpCi0JCXN0cmluZ19hZGRyX2luYyhjdHh0LCBlc19iYXNlKGN0eHQpLCBWQ1BVX1JFR1NfUkRJLCAmYy0+ZHN0KTsKKwkJc3RyaW5nX2FkZHJfaW5jKGN0eHQsIGVzX2Jhc2UoY3R4dCwgb3BzKSwgVkNQVV9SRUdTX1JESSwKKwkJCQkmYy0+ZHN0KTsKIAogCWlmIChjLT5yZXBfcHJlZml4ICYmIChjLT5kICYgU3RyaW5nKSkgewogCQlzdHJ1Y3QgcmVhZF9jYWNoZSAqcmMgPSAmY3R4dC0+ZGVjb2RlLmlvX3JlYWQ7CkBAIC0yOTgxLDExICszMDYxLDEyIEBACiAJCSAgICAocmMtPmVuZCAhPSAwICYmIHJjLT5lbmQgPT0gcmMtPnBvcykpCiAJCQljdHh0LT5yZXN0YXJ0ID0gZmFsc2U7CiAJfQotCi0JLyogQ29tbWl0IHNoYWRvdyByZWdpc3RlciBzdGF0ZS4gKi8KLQltZW1jcHkoY3R4dC0+dmNwdS0+YXJjaC5yZWdzLCBjLT5yZWdzLCBzaXplb2YgYy0+cmVncyk7Ci0Ja3ZtX3JpcF93cml0ZShjdHh0LT52Y3B1LCBjLT5laXApOwotCW9wcy0+c2V0X3JmbGFncyhjdHh0LT52Y3B1LCBjdHh0LT5lZmxhZ3MpOworCS8qCisJICogcmVzZXQgcmVhZCBjYWNoZSBoZXJlIGluIGNhc2Ugc3RyaW5nIGluc3RydWN0aW9uIGlzIHJlc3RhcmVkCisJICogd2l0aG91dCBkZWNvZGluZworCSAqLworCWN0eHQtPmRlY29kZS5tZW1fcmVhZC5lbmQgPSAwOworCWN0eHQtPmVpcCA9IGMtPmVpcDsKIAogZG9uZToKIAlyZXR1cm4gKHJjID09IFg4NkVNVUxfVU5IQU5ETEVBQkxFKSA/IC0xIDogMDsKQEAgLTMwNTEsNyArMzEzMiw3IEBACiAJCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CiAJCQlicmVhazsKIAkJY2FzZSA1OiAvKiBub3QgZGVmaW5lZCAqLwotCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbihjdHh0LT52Y3B1LCBVRF9WRUNUT1IpOworCQkJZW11bGF0ZV91ZChjdHh0KTsKIAkJCWdvdG8gZG9uZTsKIAkJY2FzZSA3OiAvKiBpbnZscGcqLwogCQkJZW11bGF0ZV9pbnZscGcoY3R4dC0+dmNwdSwgYy0+bW9kcm1fZWEpOwpAQCAtMzA2Myw3ICszMTQ0LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIDB4MDU6IAkJLyogc3lzY2FsbCAqLwotCQlyYyA9IGVtdWxhdGVfc3lzY2FsbChjdHh0KTsKKwkJcmMgPSBlbXVsYXRlX3N5c2NhbGwoY3R4dCwgb3BzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJCWVsc2UKQEAgLTMwNzMsOCArMzE1NCwxMSBAQAogCQllbXVsYXRlX2NsdHMoY3R4dC0+dmNwdSk7CiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKIAkJYnJlYWs7Ci0JY2FzZSAweDA4OgkJLyogaW52ZCAqLwogCWNhc2UgMHgwOToJCS8qIHdiaW52ZCAqLworCQlrdm1fZW11bGF0ZV93YmludmQoY3R4dC0+dmNwdSk7CisJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSAweDA4OgkJLyogaW52ZCAqLwogCWNhc2UgMHgwZDoJCS8qIEdycFAgKHByZWZldGNoKSAqLwogCWNhc2UgMHgxODoJCS8qIEdycDE2IChwcmVmZXRjaC9ub3ApICovCiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKQEAgLTMwODQsNyArMzE2OCw3IEBACiAJCWNhc2UgMToKIAkJY2FzZSA1IC4uLiA3OgogCQljYXNlIDkgLi4uIDE1OgotCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbihjdHh0LT52Y3B1LCBVRF9WRUNUT1IpOworCQkJZW11bGF0ZV91ZChjdHh0KTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQljLT5yZWdzW2MtPm1vZHJtX3JtXSA9IG9wcy0+Z2V0X2NyKGMtPm1vZHJtX3JlZywgY3R4dC0+dmNwdSk7CkBAIC0zMDkzLDMxICszMTc3LDQyIEBACiAJY2FzZSAweDIxOiAvKiBtb3YgZnJvbSBkciB0byByZWcgKi8KIAkJaWYgKChvcHMtPmdldF9jcig0LCBjdHh0LT52Y3B1KSAmIFg4Nl9DUjRfREUpICYmCiAJCSAgICAoYy0+bW9kcm1fcmVnID09IDQgfHwgYy0+bW9kcm1fcmVnID09IDUpKSB7Ci0JCQlrdm1fcXVldWVfZXhjZXB0aW9uKGN0eHQtPnZjcHUsIFVEX1ZFQ1RPUik7CisJCQllbXVsYXRlX3VkKGN0eHQpOwogCQkJZ290byBkb25lOwogCQl9Ci0JCWVtdWxhdG9yX2dldF9kcihjdHh0LCBjLT5tb2RybV9yZWcsICZjLT5yZWdzW2MtPm1vZHJtX3JtXSk7CisJCW9wcy0+Z2V0X2RyKGMtPm1vZHJtX3JlZywgJmMtPnJlZ3NbYy0+bW9kcm1fcm1dLCBjdHh0LT52Y3B1KTsKIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBubyB3cml0ZWJhY2sgKi8KIAkJYnJlYWs7CiAJY2FzZSAweDIyOiAvKiBtb3YgcmVnLCBjciAqLwotCQlvcHMtPnNldF9jcihjLT5tb2RybV9yZWcsIGMtPm1vZHJtX3ZhbCwgY3R4dC0+dmNwdSk7CisJCWlmIChvcHMtPnNldF9jcihjLT5tb2RybV9yZWcsIGMtPm1vZHJtX3ZhbCwgY3R4dC0+dmNwdSkpIHsKKwkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CisJCQlnb3RvIGRvbmU7CisJCX0KIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwogCQlicmVhazsKIAljYXNlIDB4MjM6IC8qIG1vdiBmcm9tIHJlZyB0byBkciAqLwogCQlpZiAoKG9wcy0+Z2V0X2NyKDQsIGN0eHQtPnZjcHUpICYgWDg2X0NSNF9ERSkgJiYKIAkJICAgIChjLT5tb2RybV9yZWcgPT0gNCB8fCBjLT5tb2RybV9yZWcgPT0gNSkpIHsKLQkJCWt2bV9xdWV1ZV9leGNlcHRpb24oY3R4dC0+dmNwdSwgVURfVkVDVE9SKTsKKwkJCWVtdWxhdGVfdWQoY3R4dCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQkJZW11bGF0b3Jfc2V0X2RyKGN0eHQsIGMtPm1vZHJtX3JlZywgYy0+cmVnc1tjLT5tb2RybV9ybV0pOworCisJCWlmIChvcHMtPnNldF9kcihjLT5tb2RybV9yZWcsIGMtPnJlZ3NbYy0+bW9kcm1fcm1dICYKKwkJCQkoKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkgPworCQkJCSB+MFVMTCA6IH4wVSksIGN0eHQtPnZjcHUpIDwgMCkgeworCQkJLyogI1VEIGNvbmRpdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIGNvZGUgYWJvdmUgKi8KKwkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwogCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CS8qIG5vIHdyaXRlYmFjayAqLwogCQlicmVhazsKIAljYXNlIDB4MzA6CiAJCS8qIHdybXNyICovCiAJCW1zcl9kYXRhID0gKHUzMiljLT5yZWdzW1ZDUFVfUkVHU19SQVhdCiAJCQl8ICgodTY0KWMtPnJlZ3NbVkNQVV9SRUdTX1JEWF0gPDwgMzIpOwotCQlpZiAoa3ZtX3NldF9tc3IoY3R4dC0+dmNwdSwgYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgbXNyX2RhdGEpKSB7Ci0JCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOworCQlpZiAob3BzLT5zZXRfbXNyKGN0eHQtPnZjcHUsIGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0sIG1zcl9kYXRhKSkgeworCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQlyYyA9IFg4NkVNVUxfQ09OVElOVUU7CkBAIC0zMTI1LDggKzMyMjAsOCBAQAogCQlicmVhazsKIAljYXNlIDB4MzI6CiAJCS8qIHJkbXNyICovCi0JCWlmIChrdm1fZ2V0X21zcihjdHh0LT52Y3B1LCBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdLCAmbXNyX2RhdGEpKSB7Ci0JCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOworCQlpZiAob3BzLT5nZXRfbXNyKGN0eHQtPnZjcHUsIGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0sICZtc3JfZGF0YSkpIHsKKwkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0gZWxzZSB7CiAJCQljLT5yZWdzW1ZDUFVfUkVHU19SQVhdID0gKHUzMiltc3JfZGF0YTsKQEAgLTMxMzYsMTQgKzMyMzEsMTQgQEAKIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwogCQlicmVhazsKIAljYXNlIDB4MzQ6CQkvKiBzeXNlbnRlciAqLwotCQlyYyA9IGVtdWxhdGVfc3lzZW50ZXIoY3R4dCk7CisJCXJjID0gZW11bGF0ZV9zeXNlbnRlcihjdHh0LCBvcHMpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKIAkJZWxzZQogCQkJZ290byB3cml0ZWJhY2s7CiAJCWJyZWFrOwogCWNhc2UgMHgzNToJCS8qIHN5c2V4aXQgKi8KLQkJcmMgPSBlbXVsYXRlX3N5c2V4aXQoY3R4dCk7CisJCXJjID0gZW11bGF0ZV9zeXNleGl0KGN0eHQsIG9wcyk7CiAJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkJZ290byBkb25lOwogCQllbHNlCkBAIC0zMTYwLDcgKzMyNTUsNyBAQAogCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CiAJCWJyZWFrOwogCWNhc2UgMHhhMDoJICAvKiBwdXNoIGZzICovCi0JCWVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19GUyk7CisJCWVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIG9wcywgVkNQVV9TUkVHX0ZTKTsKIAkJYnJlYWs7CiAJY2FzZSAweGExOgkgLyogcG9wIGZzICovCiAJCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19GUyk7CkBAIC0zMTc5LDcgKzMyNzQsNyBAQAogCQllbXVsYXRlXzJvcF9jbCgic2hsZCIsIGMtPnNyYzIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDB4YTg6CS8qIHB1c2ggZ3MgKi8KLQkJZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0dTKTsKKwkJZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfR1MpOwogCQlicmVhazsKIAljYXNlIDB4YTk6CS8qIHBvcCBncyAqLwogCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfR1MpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2k4MjU0LmMgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuYwppbmRleCAwMTUwYWZmLi4wZmQ2Mzc4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYworKysgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuYwpAQCAtNSw2ICs1LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogICogQ29weXJpZ2h0IChjKSAyMDA3IEtlaXIgRnJhc2VyLCBYZW5Tb3VyY2UgSW5jCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA5IFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGF0ZXMuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQogICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTMzLDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiaXJxLmgiCiAjaW5jbHVkZSAiaTgyNTQuaCIKQEAgLTI0MywxMSArMjQ1LDIyIEBACiB7CiAJc3RydWN0IGt2bV9rcGl0X3N0YXRlICpwcyA9IGNvbnRhaW5lcl9vZihraWFuLCBzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUsCiAJCQkJCQkgaXJxX2Fja19ub3RpZmllcik7Ci0JcmF3X3NwaW5fbG9jaygmcHMtPmluamVjdF9sb2NrKTsKLQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJnBzLT5waXRfdGltZXIucGVuZGluZykgPCAwKQorCWludCB2YWx1ZTsKKworCXNwaW5fbG9jaygmcHMtPmluamVjdF9sb2NrKTsKKwl2YWx1ZSA9IGF0b21pY19kZWNfcmV0dXJuKCZwcy0+cGl0X3RpbWVyLnBlbmRpbmcpOworCWlmICh2YWx1ZSA8IDApCisJCS8qIHNwdXJpb3VzIGFja3MgY2FuIGJlIGdlbmVyYXRlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZQorCQkgKiBQSUMgaXMgYmVpbmcgcmVzZXQuICBIYW5kbGUgaXQgZ3JhY2VmdWxseSBoZXJlCisJCSAqLwogCQlhdG9taWNfaW5jKCZwcy0+cGl0X3RpbWVyLnBlbmRpbmcpOworCWVsc2UgaWYgKHZhbHVlID4gMCkKKwkJLyogaW4gdGhpcyBjYXNlLCB3ZSBoYWQgbXVsdGlwbGUgb3V0c3RhbmRpbmcgcGl0IGludGVycnVwdHMKKwkJICogdGhhdCB3ZSBuZWVkZWQgdG8gaW5qZWN0LiAgUmVpbmplY3QKKwkJICovCisJCXF1ZXVlX3dvcmsocHMtPnBpdC0+d3EsICZwcy0+cGl0LT5leHBpcmVkKTsKIAlwcy0+aXJxX2FjayA9IDE7Ci0JcmF3X3NwaW5fdW5sb2NrKCZwcy0+aW5qZWN0X2xvY2spOworCXNwaW5fdW5sb2NrKCZwcy0+aW5qZWN0X2xvY2spOwogfQogCiB2b2lkIF9fa3ZtX21pZ3JhdGVfcGl0X3RpbWVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTI2MywxMCArMjc2LDEwIEBACiAJCWhydGltZXJfc3RhcnRfZXhwaXJlcyh0aW1lciwgSFJUSU1FUl9NT0RFX0FCUyk7CiB9CiAKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfcGl0X3RpbWVyKHN0cnVjdCBrdm1fdGltZXIgKnB0KQorc3RhdGljIHZvaWQgZGVzdHJveV9waXRfdGltZXIoc3RydWN0IGt2bV9waXQgKnBpdCkKIHsKLQlwcl9kZWJ1ZygiZXhlY3V0ZSBkZWwgdGltZXIhXG4iKTsKLQlocnRpbWVyX2NhbmNlbCgmcHQtPnRpbWVyKTsKKwlocnRpbWVyX2NhbmNlbCgmcGl0LT5waXRfc3RhdGUucGl0X3RpbWVyLnRpbWVyKTsKKwljYW5jZWxfd29ya19zeW5jKCZwaXQtPmV4cGlyZWQpOwogfQogCiBzdGF0aWMgYm9vbCBrcGl0X2lzX3BlcmlvZGljKHN0cnVjdCBrdm1fdGltZXIgKmt0aW1lcikKQEAgLTI4MCw2ICsyOTMsNjAgQEAKIAkuaXNfcGVyaW9kaWMgPSBrcGl0X2lzX3BlcmlvZGljLAogfTsKIAorc3RhdGljIHZvaWQgcGl0X2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBrdm1fcGl0ICpwaXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGt2bV9waXQsIGV4cGlyZWQpOworCXN0cnVjdCBrdm0gKmt2bSA9IHBpdC0+a3ZtOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlpbnQgaTsKKwlzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUgKnBzID0gJnBpdC0+cGl0X3N0YXRlOworCWludCBpbmplY3QgPSAwOworCisJLyogVHJ5IHRvIGluamVjdCBwZW5kaW5nIGludGVycnVwdHMgd2hlbgorCSAqIGxhc3Qgb25lIGhhcyBiZWVuIGFja2VkLgorCSAqLworCXNwaW5fbG9jaygmcHMtPmluamVjdF9sb2NrKTsKKwlpZiAocHMtPmlycV9hY2spIHsKKwkJcHMtPmlycV9hY2sgPSAwOworCQlpbmplY3QgPSAxOworCX0KKwlzcGluX3VubG9jaygmcHMtPmluamVjdF9sb2NrKTsKKwlpZiAoaW5qZWN0KSB7CisJCWt2bV9zZXRfaXJxKGt2bSwga3ZtLT5hcmNoLnZwaXQtPmlycV9zb3VyY2VfaWQsIDAsIDEpOworCQlrdm1fc2V0X2lycShrdm0sIGt2bS0+YXJjaC52cGl0LT5pcnFfc291cmNlX2lkLCAwLCAwKTsKKworCQkvKgorCQkgKiBQcm92aWRlcyBOTUkgd2F0Y2hkb2cgc3VwcG9ydCB2aWEgVmlydHVhbCBXaXJlIG1vZGUuCisJCSAqIFRoZSByb3V0ZSBpczogUElUIC0+IFBJQyAtPiBMVlQwIGluIE5NSSBtb2RlLgorCQkgKgorCQkgKiBOb3RlOiBPdXIgVmlydHVhbCBXaXJlIGltcGxlbWVudGF0aW9uIGlzIHNpbXBsaWZpZWQsIG9ubHkKKwkJICogcHJvcGFnYXRpbmcgUElUIGludGVycnVwdHMgdG8gYWxsIFZDUFVzIHdoZW4gdGhleSBoYXZlIHNldAorCQkgKiBMVlQwIHRvIE5NSSBkZWxpdmVyeS4gT3RoZXIgUElDIGludGVycnVwdHMgYXJlIGp1c3Qgc2VudCB0bworCQkgKiBWQ1BVMCwgYW5kIG9ubHkgaWYgaXRzIExWVDAgaXMgaW4gRVhUSU5UIG1vZGUuCisJCSAqLworCQlpZiAoa3ZtLT5hcmNoLnZhcGljc19pbl9ubWlfbW9kZSA+IDApCisJCQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBrdm0pCisJCQkJa3ZtX2FwaWNfbm1pX3dkX2RlbGl2ZXIodmNwdSk7CisJfQorfQorCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgcGl0X3RpbWVyX2ZuKHN0cnVjdCBocnRpbWVyICpkYXRhKQoreworCXN0cnVjdCBrdm1fdGltZXIgKmt0aW1lciA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3Qga3ZtX3RpbWVyLCB0aW1lcik7CisJc3RydWN0IGt2bV9waXQgKnB0ID0ga3RpbWVyLT5rdm0tPmFyY2gudnBpdDsKKworCWlmIChrdGltZXItPnJlaW5qZWN0IHx8ICFhdG9taWNfcmVhZCgma3RpbWVyLT5wZW5kaW5nKSkgeworCQlhdG9taWNfaW5jKCZrdGltZXItPnBlbmRpbmcpOworCQlxdWV1ZV93b3JrKHB0LT53cSwgJnB0LT5leHBpcmVkKTsKKwl9CisKKwlpZiAoa3RpbWVyLT50X29wcy0+aXNfcGVyaW9kaWMoa3RpbWVyKSkgeworCQlocnRpbWVyX2FkZF9leHBpcmVzX25zKCZrdGltZXItPnRpbWVyLCBrdGltZXItPnBlcmlvZCk7CisJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CisJfSBlbHNlCisJCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KKwogc3RhdGljIHZvaWQgY3JlYXRlX3BpdF90aW1lcihzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUgKnBzLCB1MzIgdmFsLCBpbnQgaXNfcGVyaW9kKQogewogCXN0cnVjdCBrdm1fdGltZXIgKnB0ID0gJnBzLT5waXRfdGltZXI7CkBAIC0yOTEsMTMgKzM1OCwxMyBAQAogCiAJLyogVE9ETyBUaGUgbmV3IHZhbHVlIG9ubHkgYWZmZWN0ZWQgYWZ0ZXIgdGhlIHJldHJpZ2dlcmVkICovCiAJaHJ0aW1lcl9jYW5jZWwoJnB0LT50aW1lcik7CisJY2FuY2VsX3dvcmtfc3luYygmcHMtPnBpdC0+ZXhwaXJlZCk7CiAJcHQtPnBlcmlvZCA9IGludGVydmFsOwogCXBzLT5pc19wZXJpb2RpYyA9IGlzX3BlcmlvZDsKIAotCXB0LT50aW1lci5mdW5jdGlvbiA9IGt2bV90aW1lcl9mbjsKKwlwdC0+dGltZXIuZnVuY3Rpb24gPSBwaXRfdGltZXJfZm47CiAJcHQtPnRfb3BzID0gJmtwaXRfb3BzOwogCXB0LT5rdm0gPSBwcy0+cGl0LT5rdm07Ci0JcHQtPnZjcHUgPSBwdC0+a3ZtLT5ic3BfdmNwdTsKIAogCWF0b21pY19zZXQoJnB0LT5wZW5kaW5nLCAwKTsKIAlwcy0+aXJxX2FjayA9IDE7CkBAIC0zNDYsNyArNDEzLDcgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXN0cm95X3BpdF90aW1lcigmcHMtPnBpdF90aW1lcik7CisJCWRlc3Ryb3lfcGl0X3RpbWVyKGt2bS0+YXJjaC52cGl0KTsKIAl9CiB9CiAKQEAgLTYyNSw3ICs2OTIsMTUgQEAKIAogCW11dGV4X2luaXQoJnBpdC0+cGl0X3N0YXRlLmxvY2spOwogCW11dGV4X2xvY2soJnBpdC0+cGl0X3N0YXRlLmxvY2spOwotCXJhd19zcGluX2xvY2tfaW5pdCgmcGl0LT5waXRfc3RhdGUuaW5qZWN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwaXQtPnBpdF9zdGF0ZS5pbmplY3RfbG9jayk7CisKKwlwaXQtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImt2bS1waXQtd3EiKTsKKwlpZiAoIXBpdC0+d3EpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwaXQtPnBpdF9zdGF0ZS5sb2NrKTsKKwkJa2ZyZWUocGl0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUlOSVRfV09SSygmcGl0LT5leHBpcmVkLCBwaXRfZG9fd29yayk7CiAKIAlrdm0tPmFyY2gudnBpdCA9IHBpdDsKIAlwaXQtPmt2bSA9IGt2bTsKQEAgLTY3Nyw2ICs3NTIsOSBAQAogCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKIAogCWlmIChrdm0tPmFyY2gudnBpdCkgeworCQlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZrdm0tPmFyY2gudnBpdC0+ZGV2KTsKKwkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLAorCQkJCQkgICAgICAma3ZtLT5hcmNoLnZwaXQtPnNwZWFrZXJfZGV2KTsKIAkJa3ZtX3VucmVnaXN0ZXJfaXJxX21hc2tfbm90aWZpZXIoa3ZtLCAwLAogCQkJCQkgICAgICAgJmt2bS0+YXJjaC52cGl0LT5tYXNrX25vdGlmaWVyKTsKIAkJa3ZtX3VucmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sCkBAIC02ODQsNTQgKzc2MiwxMCBAQAogCQltdXRleF9sb2NrKCZrdm0tPmFyY2gudnBpdC0+cGl0X3N0YXRlLmxvY2spOwogCQl0aW1lciA9ICZrdm0tPmFyY2gudnBpdC0+cGl0X3N0YXRlLnBpdF90aW1lci50aW1lcjsKIAkJaHJ0aW1lcl9jYW5jZWwodGltZXIpOworCQljYW5jZWxfd29ya19zeW5jKCZrdm0tPmFyY2gudnBpdC0+ZXhwaXJlZCk7CiAJCWt2bV9mcmVlX2lycV9zb3VyY2VfaWQoa3ZtLCBrdm0tPmFyY2gudnBpdC0+aXJxX3NvdXJjZV9pZCk7CiAJCW11dGV4X3VubG9jaygma3ZtLT5hcmNoLnZwaXQtPnBpdF9zdGF0ZS5sb2NrKTsKKwkJZGVzdHJveV93b3JrcXVldWUoa3ZtLT5hcmNoLnZwaXQtPndxKTsKIAkJa2ZyZWUoa3ZtLT5hcmNoLnZwaXQpOwogCX0KIH0KLQotc3RhdGljIHZvaWQgX19pbmplY3RfcGl0X3RpbWVyX2ludHIoc3RydWN0IGt2bSAqa3ZtKQotewotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKLQlpbnQgaTsKLQotCWt2bV9zZXRfaXJxKGt2bSwga3ZtLT5hcmNoLnZwaXQtPmlycV9zb3VyY2VfaWQsIDAsIDEpOwotCWt2bV9zZXRfaXJxKGt2bSwga3ZtLT5hcmNoLnZwaXQtPmlycV9zb3VyY2VfaWQsIDAsIDApOwotCi0JLyoKLQkgKiBQcm92aWRlcyBOTUkgd2F0Y2hkb2cgc3VwcG9ydCB2aWEgVmlydHVhbCBXaXJlIG1vZGUuCi0JICogVGhlIHJvdXRlIGlzOiBQSVQgLT4gUElDIC0+IExWVDAgaW4gTk1JIG1vZGUuCi0JICoKLQkgKiBOb3RlOiBPdXIgVmlydHVhbCBXaXJlIGltcGxlbWVudGF0aW9uIGlzIHNpbXBsaWZpZWQsIG9ubHkKLQkgKiBwcm9wYWdhdGluZyBQSVQgaW50ZXJydXB0cyB0byBhbGwgVkNQVXMgd2hlbiB0aGV5IGhhdmUgc2V0Ci0JICogTFZUMCB0byBOTUkgZGVsaXZlcnkuIE90aGVyIFBJQyBpbnRlcnJ1cHRzIGFyZSBqdXN0IHNlbnQgdG8KLQkgKiBWQ1BVMCwgYW5kIG9ubHkgaWYgaXRzIExWVDAgaXMgaW4gRVhUSU5UIG1vZGUuCi0JICovCi0JaWYgKGt2bS0+YXJjaC52YXBpY3NfaW5fbm1pX21vZGUgPiAwKQotCQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBrdm0pCi0JCQlrdm1fYXBpY19ubWlfd2RfZGVsaXZlcih2Y3B1KTsKLX0KLQotdm9pZCBrdm1faW5qZWN0X3BpdF90aW1lcl9pcnFzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3Qga3ZtX3BpdCAqcGl0ID0gdmNwdS0+a3ZtLT5hcmNoLnZwaXQ7Ci0Jc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOwotCXN0cnVjdCBrdm1fa3BpdF9zdGF0ZSAqcHM7Ci0KLQlpZiAocGl0KSB7Ci0JCWludCBpbmplY3QgPSAwOwotCQlwcyA9ICZwaXQtPnBpdF9zdGF0ZTsKLQotCQkvKiBUcnkgdG8gaW5qZWN0IHBlbmRpbmcgaW50ZXJydXB0cyB3aGVuCi0JCSAqIGxhc3Qgb25lIGhhcyBiZWVuIGFja2VkLgotCQkgKi8KLQkJcmF3X3NwaW5fbG9jaygmcHMtPmluamVjdF9sb2NrKTsKLQkJaWYgKGF0b21pY19yZWFkKCZwcy0+cGl0X3RpbWVyLnBlbmRpbmcpICYmIHBzLT5pcnFfYWNrKSB7Ci0JCQlwcy0+aXJxX2FjayA9IDA7Ci0JCQlpbmplY3QgPSAxOwotCQl9Ci0JCXJhd19zcGluX3VubG9jaygmcHMtPmluamVjdF9sb2NrKTsKLQkJaWYgKGluamVjdCkKLQkJCV9faW5qZWN0X3BpdF90aW1lcl9pbnRyKGt2bSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2k4MjU0LmggYi9hcmNoL3g4Ni9rdm0vaTgyNTQuaAppbmRleCA5MDBkNmIwLi40NmQwOGNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaTgyNTQuaAorKysgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuaApAQCAtMjcsNyArMjcsNyBAQAogCXUzMiAgICBzcGVha2VyX2RhdGFfb247CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJc3RydWN0IGt2bV9waXQgKnBpdDsKLQlyYXdfc3BpbmxvY2tfdCBpbmplY3RfbG9jazsKKwlzcGlubG9ja190IGluamVjdF9sb2NrOwogCXVuc2lnbmVkIGxvbmcgaXJxX2FjazsKIAlzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgaXJxX2Fja19ub3RpZmllcjsKIH07CkBAIC00MCw2ICs0MCw4IEBACiAJc3RydWN0IGt2bV9rcGl0X3N0YXRlIHBpdF9zdGF0ZTsKIAlpbnQgaXJxX3NvdXJjZV9pZDsKIAlzdHJ1Y3Qga3ZtX2lycV9tYXNrX25vdGlmaWVyIG1hc2tfbm90aWZpZXI7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBleHBpcmVkOwogfTsKIAogI2RlZmluZSBLVk1fUElUX0JBU0VfQUREUkVTUwkgICAgMHg0MApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2k4MjU5LmMgYi9hcmNoL3g4Ni9rdm0vaTgyNTkuYwppbmRleCA5MzgyNWZmLi44ZDEwYzA2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaTgyNTkuYworKysgYi9hcmNoL3g4Ni9rdm0vaTgyNTkuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBGYWJyaWNlIEJlbGxhcmQKICAqIENvcHlyaWdodCAoYykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDkgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsYXRlcy4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMzMsNiArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSAidHJhY2UuaCIKIAorc3RhdGljIHZvaWQgcGljX2lycV9yZXF1ZXN0KHN0cnVjdCBrdm0gKmt2bSwgaW50IGxldmVsKTsKKwogc3RhdGljIHZvaWQgcGljX2xvY2soc3RydWN0IGt2bV9waWMgKnMpCiAJX19hY3F1aXJlcygmcy0+bG9jaykKIHsKQEAgLTQzLDE2ICs0NiwyNSBAQAogCV9fcmVsZWFzZXMoJnMtPmxvY2spCiB7CiAJYm9vbCB3YWtldXAgPSBzLT53YWtldXBfbmVlZGVkOwotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsICpmb3VuZCA9IE5VTEw7CisJaW50IGk7CiAKIAlzLT53YWtldXBfbmVlZGVkID0gZmFsc2U7CiAKIAlyYXdfc3Bpbl91bmxvY2soJnMtPmxvY2spOwogCiAJaWYgKHdha2V1cCkgewotCQl2Y3B1ID0gcy0+a3ZtLT5ic3BfdmNwdTsKLQkJaWYgKHZjcHUpCi0JCQlrdm1fdmNwdV9raWNrKHZjcHUpOworCQlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBzLT5rdm0pIHsKKwkJCWlmIChrdm1fYXBpY19hY2NlcHRfcGljX2ludHIodmNwdSkpIHsKKwkJCQlmb3VuZCA9IHZjcHU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJZm91bmQgPSBzLT5rdm0tPmJzcF92Y3B1OworCisJCWt2bV92Y3B1X2tpY2soZm91bmQpOwogCX0KIH0KIApAQCAtMTczLDEwICsxODUsNyBAQAogCQlwaWNfc2V0X2lycTEoJnMtPnBpY3NbMF0sIDIsIDApOwogCX0KIAlpcnEgPSBwaWNfZ2V0X2lycSgmcy0+cGljc1swXSk7Ci0JaWYgKGlycSA+PSAwKQotCQlzLT5pcnFfcmVxdWVzdChzLT5pcnFfcmVxdWVzdF9vcGFxdWUsIDEpOwotCWVsc2UKLQkJcy0+aXJxX3JlcXVlc3Qocy0+aXJxX3JlcXVlc3Rfb3BhcXVlLCAwKTsKKwlwaWNfaXJxX3JlcXVlc3Qocy0+a3ZtLCBpcnEgPj0gMCk7CiB9CiAKIHZvaWQga3ZtX3BpY191cGRhdGVfaXJxKHN0cnVjdCBrdm1fcGljICpzKQpAQCAtMjYxLDggKzI3MCw3IEBACiB2b2lkIGt2bV9waWNfcmVzZXQoc3RydWN0IGt2bV9rcGljX3N0YXRlICpzKQogewogCWludCBpcnE7Ci0Jc3RydWN0IGt2bSAqa3ZtID0gcy0+cGljc19zdGF0ZS0+aXJxX3JlcXVlc3Rfb3BhcXVlOwotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTAgPSBrdm0tPmJzcF92Y3B1OworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTAgPSBzLT5waWNzX3N0YXRlLT5rdm0tPmJzcF92Y3B1OwogCXU4IGlyciA9IHMtPmlyciwgaXNyID0gcy0+aW1yOwogCiAJcy0+bGFzdF9pcnIgPSAwOwpAQCAtMzAxLDggKzMwOSw3IEBACiAJCQkvKgogCQkJICogZGVhc3NlcnQgYSBwZW5kaW5nIGludGVycnVwdAogCQkJICovCi0JCQlzLT5waWNzX3N0YXRlLT5pcnFfcmVxdWVzdChzLT5waWNzX3N0YXRlLT4KLQkJCQkJCSAgIGlycV9yZXF1ZXN0X29wYXF1ZSwgMCk7CisJCQlwaWNfaXJxX3JlcXVlc3Qocy0+cGljc19zdGF0ZS0+a3ZtLCAwKTsKIAkJCXMtPmluaXRfc3RhdGUgPSAxOwogCQkJcy0+aW5pdDQgPSB2YWwgJiAxOwogCQkJaWYgKHZhbCAmIDB4MDIpCkBAIC0zNTYsMTAgKzM2MywyMCBAQAogCQl9CiAJfSBlbHNlCiAJCXN3aXRjaCAocy0+aW5pdF9zdGF0ZSkgewotCQljYXNlIDA6CQkvKiBub3JtYWwgbW9kZSAqLworCQljYXNlIDA6IHsgLyogbm9ybWFsIG1vZGUgKi8KKwkJCXU4IGltcl9kaWZmID0gcy0+aW1yIF4gdmFsLAorCQkJCW9mZiA9IChzID09ICZzLT5waWNzX3N0YXRlLT5waWNzWzBdKSA/IDAgOiA4OwogCQkJcy0+aW1yID0gdmFsOworCQkJZm9yIChpcnEgPSAwOyBpcnEgPCBQSUNfTlVNX1BJTlMvMjsgaXJxKyspCisJCQkJaWYgKGltcl9kaWZmICYgKDEgPDwgaXJxKSkKKwkJCQkJa3ZtX2ZpcmVfbWFza19ub3RpZmllcnMoCisJCQkJCQlzLT5waWNzX3N0YXRlLT5rdm0sCisJCQkJCQlTRUxFQ1RfUElDKGlycSArIG9mZiksCisJCQkJCQlpcnEgKyBvZmYsCisJCQkJCQkhIShzLT5pbXIgJiAoMSA8PCBpcnEpKSk7CiAJCQlwaWNfdXBkYXRlX2lycShzLT5waWNzX3N0YXRlKTsKIAkJCWJyZWFrOworCQl9CiAJCWNhc2UgMToKIAkJCXMtPmlycV9iYXNlID0gdmFsICYgMHhmODsKIAkJCXMtPmluaXRfc3RhdGUgPSAyOwpAQCAtNTE4LDkgKzUzNSw4IEBACiAvKgogICogY2FsbGJhY2sgd2hlbiBQSUMwIGlycSBzdGF0dXMgY2hhbmdlZAogICovCi1zdGF0aWMgdm9pZCBwaWNfaXJxX3JlcXVlc3Qodm9pZCAqb3BhcXVlLCBpbnQgbGV2ZWwpCitzdGF0aWMgdm9pZCBwaWNfaXJxX3JlcXVlc3Qoc3RydWN0IGt2bSAqa3ZtLCBpbnQgbGV2ZWwpCiB7Ci0Jc3RydWN0IGt2bSAqa3ZtID0gb3BhcXVlOwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IGt2bS0+YnNwX3ZjcHU7CiAJc3RydWN0IGt2bV9waWMgKnMgPSBwaWNfaXJxY2hpcChrdm0pOwogCWludCBpcnEgPSBwaWNfZ2V0X2lycSgmcy0+cGljc1swXSk7CkBAIC01NDksOCArNTY1LDYgQEAKIAlzLT5rdm0gPSBrdm07CiAJcy0+cGljc1swXS5lbGNyX21hc2sgPSAweGY4OwogCXMtPnBpY3NbMV0uZWxjcl9tYXNrID0gMHhkZTsKLQlzLT5pcnFfcmVxdWVzdCA9IHBpY19pcnFfcmVxdWVzdDsKLQlzLT5pcnFfcmVxdWVzdF9vcGFxdWUgPSBrdm07CiAJcy0+cGljc1swXS5waWNzX3N0YXRlID0gczsKIAlzLT5waWNzWzFdLnBpY3Nfc3RhdGUgPSBzOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaXJxLmMgYi9hcmNoL3g4Ni9rdm0vaXJxLmMKaW5kZXggOTZkZmJiNi4uMjA5NWEwNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lycS5jCisrKyBiL2FyY2gveDg2L2t2bS9pcnEuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBpcnEuYzogQVBJIGZvciBpbiBrZXJuZWwgaW50ZXJydXB0IGNvbnRyb2xsZXIKICAqIENvcHlyaWdodCAoYykgMjAwNywgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgMjAwOSBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxhdGVzLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtODksNyArOTAsNiBAQAogdm9pZCBrdm1faW5qZWN0X3BlbmRpbmdfdGltZXJfaXJxcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJa3ZtX2luamVjdF9hcGljX3RpbWVyX2lycXModmNwdSk7Ci0Ja3ZtX2luamVjdF9waXRfdGltZXJfaXJxcyh2Y3B1KTsKIAkvKiBUT0RPOiBQSVQsIFJUQyBldGMuICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1faW5qZWN0X3BlbmRpbmdfdGltZXJfaXJxcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaXJxLmggYi9hcmNoL3g4Ni9rdm0vaXJxLmgKaW5kZXggY2QxZjM2Mi4uZmZlZDA2OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lycS5oCisrKyBiL2FyY2gveDg2L2t2bS9pcnEuaApAQCAtMzgsOCArMzgsNiBAQAogc3RydWN0IGt2bTsKIHN0cnVjdCBrdm1fdmNwdTsKIAotdHlwZWRlZiB2b2lkIGlycV9yZXF1ZXN0X2Z1bmModm9pZCAqb3BhcXVlLCBpbnQgbGV2ZWwpOwotCiBzdHJ1Y3Qga3ZtX2twaWNfc3RhdGUgewogCXU4IGxhc3RfaXJyOwkvKiBlZGdlIGRldGVjdGlvbiAqLwogCXU4IGlycjsJCS8qIGludGVycnVwdCByZXF1ZXN0IHJlZ2lzdGVyICovCkBAIC02Nyw4ICs2NSw2IEBACiAJdW5zaWduZWQgcGVuZGluZ19hY2tzOwogCXN0cnVjdCBrdm0gKmt2bTsKIAlzdHJ1Y3Qga3ZtX2twaWNfc3RhdGUgcGljc1syXTsgLyogMCBpcyBtYXN0ZXIgcGljLCAxIGlzIHNsYXZlIHBpYyAqLwotCWlycV9yZXF1ZXN0X2Z1bmMgKmlycV9yZXF1ZXN0OwotCXZvaWQgKmlycV9yZXF1ZXN0X29wYXF1ZTsKIAlpbnQgb3V0cHV0OwkJLyogaW50ciBmcm9tIG1hc3RlciBQSUMgKi8KIAlzdHJ1Y3Qga3ZtX2lvX2RldmljZSBkZXY7CiAJdm9pZCAoKmFja19ub3RpZmllcikodm9pZCAqb3BhcXVlLCBpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oIGIvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKaW5kZXggY2ZmODUxYy4uNjQ5MWFjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKKysrIGIvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKQEAgLTM2LDYgKzM2LDggQEAKIAogc3RhdGljIGlubGluZSB1NjQga3ZtX3BkcHRyX3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaW5kZXgpCiB7CisJbWlnaHRfc2xlZXAoKTsgIC8qIG9uIHN2bSAqLworCiAJaWYgKCF0ZXN0X2JpdChWQ1BVX0VYUkVHX1BEUFRSLAogCQkgICAgICAodW5zaWduZWQgbG9uZyAqKSZ2Y3B1LT5hcmNoLnJlZ3NfYXZhaWwpKQogCQlrdm1feDg2X29wcy0+Y2FjaGVfcmVnKHZjcHUsIFZDUFVfRVhSRUdfUERQVFIpOwpAQCAtNjksNCArNzEsMTAgQEAKIAlyZXR1cm4ga3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgfjBVTCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTY0IGt2bV9yZWFkX2VkeF9lYXgoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiAoa3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JBWCkgJiAtMXUpCisJCXwgKCh1NjQpKGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SRFgpICYgLTF1KSA8PCAzMik7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmMgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwppbmRleCAxZWI3YTRhLi43N2Q4YzBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYworKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwpAQCAtNSw2ICs1LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNiBRdW1yYW5ldCwgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA3IE5vdmVsbAogICogQ29weXJpZ2h0IChDKSAyMDA3IEludGVsCisgKiBDb3B5cmlnaHQgMjAwOSBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxhdGVzLgogICoKICAqIEF1dGhvcnM6CiAgKiAgIERvciBMYW9yIDxkb3IubGFvckBxdW1yYW5ldC5jb20+CkBAIC0zMjgsNyArMzI5LDcgQEAKIAkJICAgImRlc3RfbW9kZSAweCV4LCBzaG9ydF9oYW5kIDB4JXhcbiIsCiAJCSAgIHRhcmdldCwgc291cmNlLCBkZXN0LCBkZXN0X21vZGUsIHNob3J0X2hhbmQpOwogCi0JQVNTRVJUKCF0YXJnZXQpOworCUFTU0VSVCh0YXJnZXQpOwogCXN3aXRjaCAoc2hvcnRfaGFuZCkgewogCWNhc2UgQVBJQ19ERVNUX05PU0hPUlQ6CiAJCWlmIChkZXN0X21vZGUgPT0gMCkKQEAgLTUzMyw3ICs1MzQsNyBAQAogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IGFwaWMtPnZjcHU7CiAJc3RydWN0IGt2bV9ydW4gKnJ1biA9IHZjcHUtPnJ1bjsKIAotCXNldF9iaXQoS1ZNX1JFUV9SRVBPUlRfVFBSX0FDQ0VTUywgJnZjcHUtPnJlcXVlc3RzKTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfUkVQT1JUX1RQUl9BQ0NFU1MsIHZjcHUpOwogCXJ1bi0+dHByX2FjY2Vzcy5yaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CiAJcnVuLT50cHJfYWNjZXNzLmlzX3dyaXRlID0gd3JpdGU7CiB9CkBAIC0xMTA2LDEzICsxMTA3LDExIEBACiAJdTMyIGx2dDAgPSBhcGljX2dldF9yZWcodmNwdS0+YXJjaC5hcGljLCBBUElDX0xWVDApOwogCWludCByID0gMDsKIAotCWlmIChrdm1fdmNwdV9pc19ic3AodmNwdSkpIHsKLQkJaWYgKCFhcGljX2h3X2VuYWJsZWQodmNwdS0+YXJjaC5hcGljKSkKLQkJCXIgPSAxOwotCQlpZiAoKGx2dDAgJiBBUElDX0xWVF9NQVNLRUQpID09IDAgJiYKLQkJICAgIEdFVF9BUElDX0RFTElWRVJZX01PREUobHZ0MCkgPT0gQVBJQ19NT0RFX0VYVElOVCkKLQkJCXIgPSAxOwotCX0KKwlpZiAoIWFwaWNfaHdfZW5hYmxlZCh2Y3B1LT5hcmNoLmFwaWMpKQorCQlyID0gMTsKKwlpZiAoKGx2dDAgJiBBUElDX0xWVF9NQVNLRUQpID09IDAgJiYKKwkgICAgR0VUX0FQSUNfREVMSVZFUllfTU9ERShsdnQwKSA9PSBBUElDX01PREVfRVhUSU5UKQorCQlyID0gMTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IGIxZWQwYTEuLjMxMWY2ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTcsNiArNyw3IEBACiAgKiBNTVUgc3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBRdW1yYW5ldCwgSW5jLgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsYXRlcy4KICAqCiAgKiBBdXRob3JzOgogICogICBZYW5pdiBLYW1heSAgPHlhbml2QHF1bXJhbmV0LmNvbT4KQEAgLTMyLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NyY3UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vY21weGNoZy5oPgpAQCAtOTAsOCArOTIsNiBAQAogI2RlZmluZSBQVF9GSVJTVF9BVkFJTF9CSVRTX1NISUZUIDkKICNkZWZpbmUgUFQ2NF9TRUNPTkRfQVZBSUxfQklUU19TSElGVCA1MgogCi0jZGVmaW5lIFZBTElEX1BBR0UoeCkgKCh4KSAhPSBJTlZBTElEX1BBR0UpCi0KICNkZWZpbmUgUFQ2NF9MRVZFTF9CSVRTIDkKIAogI2RlZmluZSBQVDY0X0xFVkVMX1NISUZUKGxldmVsKSBcCkBAIC0xNzMsNyArMTczLDcgQEAKIAkgICAgIHNoYWRvd193YWxrX29rYXkoJihfd2Fsa2VyKSk7CQkJXAogCSAgICAgc2hhZG93X3dhbGtfbmV4dCgmKF93YWxrZXIpKSkKIAotdHlwZWRlZiBpbnQgKCptbXVfcGFyZW50X3dhbGtfZm4pIChzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCk7Cit0eXBlZGVmIHZvaWQgKCptbXVfcGFyZW50X3dhbGtfZm4pIChzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpzcHRlKTsKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwdGVfY2hhaW5fY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJtYXBfZGVzY19jYWNoZTsKQEAgLTI4MSwxMyArMjgxLDM4IEBACiAKIHN0YXRpYyB2b2lkIF9fc2V0X3NwdGUodTY0ICpzcHRlcCwgdTY0IHNwdGUpCiB7CisJc2V0XzY0Yml0KHNwdGVwLCBzcHRlKTsKK30KKworc3RhdGljIHU2NCBfX3hjaGdfc3B0ZSh1NjQgKnNwdGVwLCB1NjQgbmV3X3NwdGUpCit7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCXNldF82NGJpdCgodW5zaWduZWQgbG9uZyAqKXNwdGVwLCBzcHRlKTsKKwlyZXR1cm4geGNoZyhzcHRlcCwgbmV3X3NwdGUpOwogI2Vsc2UKLQlzZXRfNjRiaXQoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKXNwdGVwLCBzcHRlKTsKKwl1NjQgb2xkX3NwdGU7CisKKwlkbyB7CisJCW9sZF9zcHRlID0gKnNwdGVwOworCX0gd2hpbGUgKGNtcHhjaGc2NChzcHRlcCwgb2xkX3NwdGUsIG5ld19zcHRlKSAhPSBvbGRfc3B0ZSk7CisKKwlyZXR1cm4gb2xkX3NwdGU7CiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX3NwdGUodTY0ICpzcHRlcCwgdTY0IG5ld19zcHRlKQoreworCXU2NCBvbGRfc3B0ZTsKKworCWlmICghc2hhZG93X2FjY2Vzc2VkX21hc2sgfHwgKG5ld19zcHRlICYgc2hhZG93X2FjY2Vzc2VkX21hc2spIHx8CisJICAgICAgIWlzX3JtYXBfc3B0ZSgqc3B0ZXApKQorCQlfX3NldF9zcHRlKHNwdGVwLCBuZXdfc3B0ZSk7CisJZWxzZSB7CisJCW9sZF9zcHRlID0gX194Y2hnX3NwdGUoc3B0ZXAsIG5ld19zcHRlKTsKKwkJaWYgKG9sZF9zcHRlICYgc2hhZG93X2FjY2Vzc2VkX21hc2spCisJCQltYXJrX3BhZ2VfYWNjZXNzZWQocGZuX3RvX3BhZ2Uoc3B0ZV90b19wZm4ob2xkX3NwdGUpKSk7CisJfQorfQorCiBzdGF0aWMgaW50IG1tdV90b3B1cF9tZW1vcnlfY2FjaGUoc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlICpjYWNoZSwKIAkJCQkgIHN0cnVjdCBrbWVtX2NhY2hlICpiYXNlX2NhY2hlLCBpbnQgbWluKQogewpAQCAtMzA0LDEwICszMjksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbW11X2ZyZWVfbWVtb3J5X2NhY2hlKHN0cnVjdCBrdm1fbW11X21lbW9yeV9jYWNoZSAqbWMpCitzdGF0aWMgdm9pZCBtbXVfZnJlZV9tZW1vcnlfY2FjaGUoc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlICptYywKKwkJCQkgIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSkKIHsKIAl3aGlsZSAobWMtPm5vYmpzKQotCQlrZnJlZShtYy0+b2JqZWN0c1stLW1jLT5ub2Jqc10pOworCQlrbWVtX2NhY2hlX2ZyZWUoY2FjaGUsIG1jLT5vYmplY3RzWy0tbWMtPm5vYmpzXSk7CiB9CiAKIHN0YXRpYyBpbnQgbW11X3RvcHVwX21lbW9yeV9jYWNoZV9wYWdlKHN0cnVjdCBrdm1fbW11X21lbW9yeV9jYWNoZSAqY2FjaGUsCkBAIC0zNTUsMTAgKzM4MSwxMSBAQAogCiBzdGF0aWMgdm9pZCBtbXVfZnJlZV9tZW1vcnlfY2FjaGVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQltbXVfZnJlZV9tZW1vcnlfY2FjaGUoJnZjcHUtPmFyY2gubW11X3B0ZV9jaGFpbl9jYWNoZSk7Ci0JbW11X2ZyZWVfbWVtb3J5X2NhY2hlKCZ2Y3B1LT5hcmNoLm1tdV9ybWFwX2Rlc2NfY2FjaGUpOworCW1tdV9mcmVlX21lbW9yeV9jYWNoZSgmdmNwdS0+YXJjaC5tbXVfcHRlX2NoYWluX2NhY2hlLCBwdGVfY2hhaW5fY2FjaGUpOworCW1tdV9mcmVlX21lbW9yeV9jYWNoZSgmdmNwdS0+YXJjaC5tbXVfcm1hcF9kZXNjX2NhY2hlLCBybWFwX2Rlc2NfY2FjaGUpOwogCW1tdV9mcmVlX21lbW9yeV9jYWNoZV9wYWdlKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2NhY2hlKTsKLQltbXVfZnJlZV9tZW1vcnlfY2FjaGUoJnZjcHUtPmFyY2gubW11X3BhZ2VfaGVhZGVyX2NhY2hlKTsKKwltbXVfZnJlZV9tZW1vcnlfY2FjaGUoJnZjcHUtPmFyY2gubW11X3BhZ2VfaGVhZGVyX2NhY2hlLAorCQkJCW1tdV9wYWdlX2hlYWRlcl9jYWNoZSk7CiB9CiAKIHN0YXRpYyB2b2lkICptbXVfbWVtb3J5X2NhY2hlX2FsbG9jKHN0cnVjdCBrdm1fbW11X21lbW9yeV9jYWNoZSAqbWMsCkBAIC0zNzksNyArNDA2LDcgQEAKIAogc3RhdGljIHZvaWQgbW11X2ZyZWVfcHRlX2NoYWluKHN0cnVjdCBrdm1fcHRlX2NoYWluICpwYykKIHsKLQlrZnJlZShwYyk7CisJa21lbV9jYWNoZV9mcmVlKHB0ZV9jaGFpbl9jYWNoZSwgcGMpOwogfQogCiBzdGF0aWMgc3RydWN0IGt2bV9ybWFwX2Rlc2MgKm1tdV9hbGxvY19ybWFwX2Rlc2Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMzkwLDcgKzQxNywyMyBAQAogCiBzdGF0aWMgdm9pZCBtbXVfZnJlZV9ybWFwX2Rlc2Moc3RydWN0IGt2bV9ybWFwX2Rlc2MgKnJkKQogewotCWtmcmVlKHJkKTsKKwlrbWVtX2NhY2hlX2ZyZWUocm1hcF9kZXNjX2NhY2hlLCByZCk7Cit9CisKK3N0YXRpYyBnZm5fdCBrdm1fbW11X3BhZ2VfZ2V0X2dmbihzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgaW50IGluZGV4KQoreworCWlmICghc3AtPnJvbGUuZGlyZWN0KQorCQlyZXR1cm4gc3AtPmdmbnNbaW5kZXhdOworCisJcmV0dXJuIHNwLT5nZm4gKyAoaW5kZXggPDwgKChzcC0+cm9sZS5sZXZlbCAtIDEpICogUFQ2NF9MRVZFTF9CSVRTKSk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9tbXVfcGFnZV9zZXRfZ2ZuKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBpbnQgaW5kZXgsIGdmbl90IGdmbikKK3sKKwlpZiAoc3AtPnJvbGUuZGlyZWN0KQorCQlCVUdfT04oZ2ZuICE9IGt2bV9tbXVfcGFnZV9nZXRfZ2ZuKHNwLCBpbmRleCkpOworCWVsc2UKKwkJc3AtPmdmbnNbaW5kZXhdID0gZ2ZuOwogfQogCiAvKgpAQCAtNDAzLDggKzQ0Niw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBpZHg7CiAKLQlpZHggPSAoZ2ZuIC8gS1ZNX1BBR0VTX1BFUl9IUEFHRShsZXZlbCkpIC0KLQkgICAgICAoc2xvdC0+YmFzZV9nZm4gLyBLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKSk7CisJaWR4ID0gKGdmbiA+PiBLVk1fSFBBR0VfR0ZOX1NISUZUKGxldmVsKSkgLQorCSAgICAgIChzbG90LT5iYXNlX2dmbiA+PiBLVk1fSFBBR0VfR0ZOX1NISUZUKGxldmVsKSk7CiAJcmV0dXJuICZzbG90LT5scGFnZV9pbmZvW2xldmVsIC0gMl1baWR4XS53cml0ZV9jb3VudDsKIH0KIApAQCAtNDE0LDkgKzQ1Nyw3IEBACiAJaW50ICp3cml0ZV9jb3VudDsKIAlpbnQgaTsKIAotCWdmbiA9IHVuYWxpYXNfZ2ZuKGt2bSwgZ2ZuKTsKLQotCXNsb3QgPSBnZm5fdG9fbWVtc2xvdF91bmFsaWFzZWQoa3ZtLCBnZm4pOworCXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CiAJZm9yIChpID0gUFRfRElSRUNUT1JZX0xFVkVMOwogCSAgICAgaSA8IFBUX1BBR0VfVEFCTEVfTEVWRUwgKyBLVk1fTlJfUEFHRV9TSVpFUzsgKytpKSB7CiAJCXdyaXRlX2NvdW50ICAgPSBzbG90X2xhcmdlcGFnZV9pZHgoZ2ZuLCBzbG90LCBpKTsKQEAgLTQzMCw4ICs0NzEsNyBAQAogCWludCAqd3JpdGVfY291bnQ7CiAJaW50IGk7CiAKLQlnZm4gPSB1bmFsaWFzX2dmbihrdm0sIGdmbik7Ci0Jc2xvdCA9IGdmbl90b19tZW1zbG90X3VuYWxpYXNlZChrdm0sIGdmbik7CisJc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKTsKIAlmb3IgKGkgPSBQVF9ESVJFQ1RPUllfTEVWRUw7CiAJICAgICBpIDwgUFRfUEFHRV9UQUJMRV9MRVZFTCArIEtWTV9OUl9QQUdFX1NJWkVTOyArK2kpIHsKIAkJd3JpdGVfY291bnQgICA9IHNsb3RfbGFyZ2VwYWdlX2lkeChnZm4sIHNsb3QsIGkpOwpAQCAtNDQ3LDggKzQ4Nyw3IEBACiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdDsKIAlpbnQgKmxhcmdlcGFnZV9pZHg7CiAKLQlnZm4gPSB1bmFsaWFzX2dmbihrdm0sIGdmbik7Ci0Jc2xvdCA9IGdmbl90b19tZW1zbG90X3VuYWxpYXNlZChrdm0sIGdmbik7CisJc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKTsKIAlpZiAoc2xvdCkgewogCQlsYXJnZXBhZ2VfaWR4ID0gc2xvdF9sYXJnZXBhZ2VfaWR4KGdmbiwgc2xvdCwgbGV2ZWwpOwogCQlyZXR1cm4gKmxhcmdlcGFnZV9pZHg7CkBAIC01MDEsNyArNTQwLDYgQEAKIAogLyoKICAqIFRha2UgZ2ZuIGFuZCByZXR1cm4gdGhlIHJldmVyc2UgbWFwcGluZyB0byBpdC4KLSAqIE5vdGU6IGdmbiBtdXN0IGJlIHVuYWxpYXNlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXQgY2FsbGVkCiAgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmdmbl90b19ybWFwKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBpbnQgbGV2ZWwpCkBAIC01MTMsOCArNTUxLDggQEAKIAlpZiAobGlrZWx5KGxldmVsID09IFBUX1BBR0VfVEFCTEVfTEVWRUwpKQogCQlyZXR1cm4gJnNsb3QtPnJtYXBbZ2ZuIC0gc2xvdC0+YmFzZV9nZm5dOwogCi0JaWR4ID0gKGdmbiAvIEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpKSAtCi0JCShzbG90LT5iYXNlX2dmbiAvIEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpKTsKKwlpZHggPSAoZ2ZuID4+IEtWTV9IUEFHRV9HRk5fU0hJRlQobGV2ZWwpKSAtCisJCShzbG90LT5iYXNlX2dmbiA+PiBLVk1fSFBBR0VfR0ZOX1NISUZUKGxldmVsKSk7CiAKIAlyZXR1cm4gJnNsb3QtPmxwYWdlX2luZm9bbGV2ZWwgLSAyXVtpZHhdLnJtYXBfcGRlOwogfQpAQCAtNTQxLDkgKzU3OSw4IEBACiAKIAlpZiAoIWlzX3JtYXBfc3B0ZSgqc3B0ZSkpCiAJCXJldHVybiBjb3VudDsKLQlnZm4gPSB1bmFsaWFzX2dmbih2Y3B1LT5rdm0sIGdmbik7CiAJc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGUpKTsKLQlzcC0+Z2Zuc1tzcHRlIC0gc3AtPnNwdF0gPSBnZm47CisJa3ZtX21tdV9wYWdlX3NldF9nZm4oc3AsIHNwdGUgLSBzcC0+c3B0LCBnZm4pOwogCXJtYXBwID0gZ2ZuX3RvX3JtYXAodmNwdS0+a3ZtLCBnZm4sIHNwLT5yb2xlLmxldmVsKTsKIAlpZiAoISpybWFwcCkgewogCQlybWFwX3ByaW50aygicm1hcF9hZGQ6ICVwICVsbHggMC0+MVxuIiwgc3B0ZSwgKnNwdGUpOwpAQCAtNjAwLDE5ICs2MzcsMTMgQEAKIAlzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqZGVzYzsKIAlzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqcHJldl9kZXNjOwogCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCXBmbl90IHBmbjsKKwlnZm5fdCBnZm47CiAJdW5zaWduZWQgbG9uZyAqcm1hcHA7CiAJaW50IGk7CiAKLQlpZiAoIWlzX3JtYXBfc3B0ZSgqc3B0ZSkpCi0JCXJldHVybjsKIAlzcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZSkpOwotCXBmbiA9IHNwdGVfdG9fcGZuKCpzcHRlKTsKLQlpZiAoKnNwdGUgJiBzaGFkb3dfYWNjZXNzZWRfbWFzaykKLQkJa3ZtX3NldF9wZm5fYWNjZXNzZWQocGZuKTsKLQlpZiAoaXNfd3JpdGFibGVfcHRlKCpzcHRlKSkKLQkJa3ZtX3NldF9wZm5fZGlydHkocGZuKTsKLQlybWFwcCA9IGdmbl90b19ybWFwKGt2bSwgc3AtPmdmbnNbc3B0ZSAtIHNwLT5zcHRdLCBzcC0+cm9sZS5sZXZlbCk7CisJZ2ZuID0ga3ZtX21tdV9wYWdlX2dldF9nZm4oc3AsIHNwdGUgLSBzcC0+c3B0KTsKKwlybWFwcCA9IGdmbl90b19ybWFwKGt2bSwgZ2ZuLCBzcC0+cm9sZS5sZXZlbCk7CiAJaWYgKCEqcm1hcHApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJybWFwX3JlbW92ZTogJXAgJWxseCAwLT5CVUdcbiIsIHNwdGUsICpzcHRlKTsKIAkJQlVHKCk7CkBAIC02NDQsNiArNjc1LDMyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzZXRfc3B0ZV90cmFja19iaXRzKHU2NCAqc3B0ZXAsIHU2NCBuZXdfc3B0ZSkKK3sKKwlwZm5fdCBwZm47CisJdTY0IG9sZF9zcHRlID0gKnNwdGVwOworCisJaWYgKCFzaGFkb3dfYWNjZXNzZWRfbWFzayB8fCAhaXNfc2hhZG93X3ByZXNlbnRfcHRlKG9sZF9zcHRlKSB8fAorCSAgICAgIG9sZF9zcHRlICYgc2hhZG93X2FjY2Vzc2VkX21hc2spIHsKKwkJX19zZXRfc3B0ZShzcHRlcCwgbmV3X3NwdGUpOworCX0gZWxzZQorCQlvbGRfc3B0ZSA9IF9feGNoZ19zcHRlKHNwdGVwLCBuZXdfc3B0ZSk7CisKKwlpZiAoIWlzX3JtYXBfc3B0ZShvbGRfc3B0ZSkpCisJCXJldHVybjsKKwlwZm4gPSBzcHRlX3RvX3BmbihvbGRfc3B0ZSk7CisJaWYgKCFzaGFkb3dfYWNjZXNzZWRfbWFzayB8fCBvbGRfc3B0ZSAmIHNoYWRvd19hY2Nlc3NlZF9tYXNrKQorCQlrdm1fc2V0X3Bmbl9hY2Nlc3NlZChwZm4pOworCWlmIChpc193cml0YWJsZV9wdGUob2xkX3NwdGUpKQorCQlrdm1fc2V0X3Bmbl9kaXJ0eShwZm4pOworfQorCitzdGF0aWMgdm9pZCBkcm9wX3NwdGUoc3RydWN0IGt2bSAqa3ZtLCB1NjQgKnNwdGVwLCB1NjQgbmV3X3NwdGUpCit7CisJc2V0X3NwdGVfdHJhY2tfYml0cyhzcHRlcCwgbmV3X3NwdGUpOworCXJtYXBfcmVtb3ZlKGt2bSwgc3B0ZXApOworfQorCiBzdGF0aWMgdTY0ICpybWFwX25leHQoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nICpybWFwcCwgdTY0ICpzcHRlKQogewogCXN0cnVjdCBrdm1fcm1hcF9kZXNjICpkZXNjOwpAQCAtNjc2LDcgKzczMyw2IEBACiAJdTY0ICpzcHRlOwogCWludCBpLCB3cml0ZV9wcm90ZWN0ZWQgPSAwOwogCi0JZ2ZuID0gdW5hbGlhc19nZm4oa3ZtLCBnZm4pOwogCXJtYXBwID0gZ2ZuX3RvX3JtYXAoa3ZtLCBnZm4sIFBUX1BBR0VfVEFCTEVfTEVWRUwpOwogCiAJc3B0ZSA9IHJtYXBfbmV4dChrdm0sIHJtYXBwLCBOVUxMKTsKQEAgLTY4NSw3ICs3NDEsNyBAQAogCQlCVUdfT04oISgqc3B0ZSAmIFBUX1BSRVNFTlRfTUFTSykpOwogCQlybWFwX3ByaW50aygicm1hcF93cml0ZV9wcm90ZWN0OiBzcHRlICVwICVsbHhcbiIsIHNwdGUsICpzcHRlKTsKIAkJaWYgKGlzX3dyaXRhYmxlX3B0ZSgqc3B0ZSkpIHsKLQkJCV9fc2V0X3NwdGUoc3B0ZSwgKnNwdGUgJiB+UFRfV1JJVEFCTEVfTUFTSyk7CisJCQl1cGRhdGVfc3B0ZShzcHRlLCAqc3B0ZSAmIH5QVF9XUklUQUJMRV9NQVNLKTsKIAkJCXdyaXRlX3Byb3RlY3RlZCA9IDE7CiAJCX0KIAkJc3B0ZSA9IHJtYXBfbmV4dChrdm0sIHJtYXBwLCBzcHRlKTsKQEAgLTcwOSw5ICs3NjUsOSBAQAogCQkJQlVHX09OKCgqc3B0ZSAmIChQVF9QQUdFX1NJWkVfTUFTS3xQVF9QUkVTRU5UX01BU0spKSAhPSAoUFRfUEFHRV9TSVpFX01BU0t8UFRfUFJFU0VOVF9NQVNLKSk7CiAJCQlwZ3ByaW50aygicm1hcF93cml0ZV9wcm90ZWN0KGxhcmdlKTogc3B0ZSAlcCAlbGx4ICVsbGRcbiIsIHNwdGUsICpzcHRlLCBnZm4pOwogCQkJaWYgKGlzX3dyaXRhYmxlX3B0ZSgqc3B0ZSkpIHsKLQkJCQlybWFwX3JlbW92ZShrdm0sIHNwdGUpOworCQkJCWRyb3Bfc3B0ZShrdm0sIHNwdGUsCisJCQkJCSAgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOwogCQkJCS0ta3ZtLT5zdGF0LmxwYWdlczsKLQkJCQlfX3NldF9zcHRlKHNwdGUsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKIAkJCQlzcHRlID0gTlVMTDsKIAkJCQl3cml0ZV9wcm90ZWN0ZWQgPSAxOwogCQkJfQpAQCAtNzMxLDggKzc4Nyw3IEBACiAJd2hpbGUgKChzcHRlID0gcm1hcF9uZXh0KGt2bSwgcm1hcHAsIE5VTEwpKSkgewogCQlCVUdfT04oISgqc3B0ZSAmIFBUX1BSRVNFTlRfTUFTSykpOwogCQlybWFwX3ByaW50aygia3ZtX3JtYXBfdW5tYXBfaHZhOiBzcHRlICVwICVsbHhcbiIsIHNwdGUsICpzcHRlKTsKLQkJcm1hcF9yZW1vdmUoa3ZtLCBzcHRlKTsKLQkJX19zZXRfc3B0ZShzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCWRyb3Bfc3B0ZShrdm0sIHNwdGUsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKIAkJbmVlZF90bGJfZmx1c2ggPSAxOwogCX0KIAlyZXR1cm4gbmVlZF90bGJfZmx1c2g7CkBAIC03NTQsOCArODA5LDcgQEAKIAkJcm1hcF9wcmludGsoImt2bV9zZXRfcHRlX3JtYXBwOiBzcHRlICVwICVsbHhcbiIsIHNwdGUsICpzcHRlKTsKIAkJbmVlZF9mbHVzaCA9IDE7CiAJCWlmIChwdGVfd3JpdGUoKnB0ZXApKSB7Ci0JCQlybWFwX3JlbW92ZShrdm0sIHNwdGUpOwotCQkJX19zZXRfc3B0ZShzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCQlkcm9wX3NwdGUoa3ZtLCBzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CiAJCQlzcHRlID0gcm1hcF9uZXh0KGt2bSwgcm1hcHAsIE5VTEwpOwogCQl9IGVsc2UgewogCQkJbmV3X3NwdGUgPSAqc3B0ZSAmfiAoUFQ2NF9CQVNFX0FERFJfTUFTSyk7CkBAIC03NjMsOSArODE3LDggQEAKIAogCQkJbmV3X3NwdGUgJj0gflBUX1dSSVRBQkxFX01BU0s7CiAJCQluZXdfc3B0ZSAmPSB+U1BURV9IT1NUX1dSSVRFQUJMRTsKLQkJCWlmIChpc193cml0YWJsZV9wdGUoKnNwdGUpKQotCQkJCWt2bV9zZXRfcGZuX2RpcnR5KHNwdGVfdG9fcGZuKCpzcHRlKSk7Ci0JCQlfX3NldF9zcHRlKHNwdGUsIG5ld19zcHRlKTsKKwkJCW5ld19zcHRlICY9IH5zaGFkb3dfYWNjZXNzZWRfbWFzazsKKwkJCXNldF9zcHRlX3RyYWNrX2JpdHMoc3B0ZSwgbmV3X3NwdGUpOwogCQkJc3B0ZSA9IHJtYXBfbmV4dChrdm0sIHJtYXBwLCBzcHRlKTsKIAkJfQogCX0KQEAgLTc5OSw4ICs4NTIsMTIgQEAKIAkJCXJldCA9IGhhbmRsZXIoa3ZtLCAmbWVtc2xvdC0+cm1hcFtnZm5fb2Zmc2V0XSwgZGF0YSk7CiAKIAkJCWZvciAoaiA9IDA7IGogPCBLVk1fTlJfUEFHRV9TSVpFUyAtIDE7ICsraikgewotCQkJCWludCBpZHggPSBnZm5fb2Zmc2V0OwotCQkJCWlkeCAvPSBLVk1fUEFHRVNfUEVSX0hQQUdFKFBUX0RJUkVDVE9SWV9MRVZFTCArIGopOworCQkJCXVuc2lnbmVkIGxvbmcgaWR4OworCQkJCWludCBzaDsKKworCQkJCXNoID0gS1ZNX0hQQUdFX0dGTl9TSElGVChQVF9ESVJFQ1RPUllfTEVWRUwraik7CisJCQkJaWR4ID0gKChtZW1zbG90LT5iYXNlX2dmbitnZm5fb2Zmc2V0KSA+PiBzaCkgLQorCQkJCQkobWVtc2xvdC0+YmFzZV9nZm4gPj4gc2gpOwogCQkJCXJldCB8PSBoYW5kbGVyKGt2bSwKIAkJCQkJJm1lbXNsb3QtPmxwYWdlX2luZm9bal1baWR4XS5ybWFwX3BkZSwKIAkJCQkJZGF0YSk7CkBAIC04NjMsNyArOTIwLDYgQEAKIAogCXNwID0gcGFnZV9oZWFkZXIoX19wYShzcHRlKSk7CiAKLQlnZm4gPSB1bmFsaWFzX2dmbih2Y3B1LT5rdm0sIGdmbik7CiAJcm1hcHAgPSBnZm5fdG9fcm1hcCh2Y3B1LT5rdm0sIGdmbiwgc3AtPnJvbGUubGV2ZWwpOwogCiAJa3ZtX3VubWFwX3JtYXBwKHZjcHUtPmt2bSwgcm1hcHAsIDApOwpAQCAtODk0LDEwICs5NTAsMTIgQEAKIHN0YXRpYyB2b2lkIGt2bV9tbXVfZnJlZV9wYWdlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7CiAJQVNTRVJUKGlzX2VtcHR5X3NoYWRvd19wYWdlKHNwLT5zcHQpKTsKKwlobGlzdF9kZWwoJnNwLT5oYXNoX2xpbmspOwogCWxpc3RfZGVsKCZzcC0+bGluayk7CiAJX19mcmVlX3BhZ2UodmlydF90b19wYWdlKHNwLT5zcHQpKTsKLQlfX2ZyZWVfcGFnZSh2aXJ0X3RvX3BhZ2Uoc3AtPmdmbnMpKTsKLQlrZnJlZShzcCk7CisJaWYgKCFzcC0+cm9sZS5kaXJlY3QpCisJCV9fZnJlZV9wYWdlKHZpcnRfdG9fcGFnZShzcC0+Z2ZucykpOworCWttZW1fY2FjaGVfZnJlZShtbXVfcGFnZV9oZWFkZXJfY2FjaGUsIHNwKTsKIAkrK2t2bS0+YXJjaC5uX2ZyZWVfbW11X3BhZ2VzOwogfQogCkBAIC05MDcsMTMgKzk2NSwxNSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGt2bV9tbXVfcGFnZSAqa3ZtX21tdV9hbGxvY19wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkJICAgICAgIHU2NCAqcGFyZW50X3B0ZSkKKwkJCQkJICAgICAgIHU2NCAqcGFyZW50X3B0ZSwgaW50IGRpcmVjdCkKIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKIAogCXNwID0gbW11X21lbW9yeV9jYWNoZV9hbGxvYygmdmNwdS0+YXJjaC5tbXVfcGFnZV9oZWFkZXJfY2FjaGUsIHNpemVvZiAqc3ApOwogCXNwLT5zcHQgPSBtbXVfbWVtb3J5X2NhY2hlX2FsbG9jKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2NhY2hlLCBQQUdFX1NJWkUpOwotCXNwLT5nZm5zID0gbW11X21lbW9yeV9jYWNoZV9hbGxvYygmdmNwdS0+YXJjaC5tbXVfcGFnZV9jYWNoZSwgUEFHRV9TSVpFKTsKKwlpZiAoIWRpcmVjdCkKKwkJc3AtPmdmbnMgPSBtbXVfbWVtb3J5X2NhY2hlX2FsbG9jKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2NhY2hlLAorCQkJCQkJICBQQUdFX1NJWkUpOwogCXNldF9wYWdlX3ByaXZhdGUodmlydF90b19wYWdlKHNwLT5zcHQpLCAodW5zaWduZWQgbG9uZylzcCk7CiAJbGlzdF9hZGQoJnNwLT5saW5rLCAmdmNwdS0+a3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMpOwogCWJpdG1hcF96ZXJvKHNwLT5zbG90X2JpdG1hcCwgS1ZNX01FTU9SWV9TTE9UUyArIEtWTV9QUklWQVRFX01FTV9TTE9UUyk7CkBAIC05OTgsNyArMTA1OCw2IEBACiAJQlVHKCk7CiB9CiAKLQogc3RhdGljIHZvaWQgbW11X3BhcmVudF93YWxrKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBtbXVfcGFyZW50X3dhbGtfZm4gZm4pCiB7CiAJc3RydWN0IGt2bV9wdGVfY2hhaW4gKnB0ZV9jaGFpbjsKQEAgLTEwMDgsNjMgKzEwNjcsMzcgQEAKIAogCWlmICghc3AtPm11bHRpbWFwcGVkICYmIHNwLT5wYXJlbnRfcHRlKSB7CiAJCXBhcmVudF9zcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3AtPnBhcmVudF9wdGUpKTsKLQkJZm4ocGFyZW50X3NwKTsKLQkJbW11X3BhcmVudF93YWxrKHBhcmVudF9zcCwgZm4pOwotCQlyZXR1cm47Ci0JfQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ZV9jaGFpbiwgbm9kZSwgJnNwLT5wYXJlbnRfcHRlcywgbGluaykKLQkJZm9yIChpID0gMDsgaSA8IE5SX1BURV9DSEFJTl9FTlRSSUVTOyArK2kpIHsKLQkJCWlmICghcHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpXSkKLQkJCQlicmVhazsKLQkJCXBhcmVudF9zcCA9IHBhZ2VfaGVhZGVyKF9fcGEocHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpXSkpOwotCQkJZm4ocGFyZW50X3NwKTsKLQkJCW1tdV9wYXJlbnRfd2FsayhwYXJlbnRfc3AsIGZuKTsKLQkJfQotfQotCi1zdGF0aWMgdm9pZCBrdm1fbW11X3VwZGF0ZV91bnN5bmNfYml0bWFwKHU2NCAqc3B0ZSkKLXsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0Jc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGUpKTsKLQotCWluZGV4ID0gc3B0ZSAtIHNwLT5zcHQ7Ci0JaWYgKCFfX3Rlc3RfYW5kX3NldF9iaXQoaW5kZXgsIHNwLT51bnN5bmNfY2hpbGRfYml0bWFwKSkKLQkJc3AtPnVuc3luY19jaGlsZHJlbisrOwotCVdBUk5fT04oIXNwLT51bnN5bmNfY2hpbGRyZW4pOwotfQotCi1zdGF0aWMgdm9pZCBrdm1fbW11X3VwZGF0ZV9wYXJlbnRzX3Vuc3luYyhzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKLXsKLQlzdHJ1Y3Qga3ZtX3B0ZV9jaGFpbiAqcHRlX2NoYWluOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCWludCBpOwotCi0JaWYgKCFzcC0+cGFyZW50X3B0ZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFzcC0+bXVsdGltYXBwZWQpIHsKLQkJa3ZtX21tdV91cGRhdGVfdW5zeW5jX2JpdG1hcChzcC0+cGFyZW50X3B0ZSk7CisJCWZuKHBhcmVudF9zcCwgc3AtPnBhcmVudF9wdGUpOwogCQlyZXR1cm47CiAJfQogCiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocHRlX2NoYWluLCBub2RlLCAmc3AtPnBhcmVudF9wdGVzLCBsaW5rKQogCQlmb3IgKGkgPSAwOyBpIDwgTlJfUFRFX0NIQUlOX0VOVFJJRVM7ICsraSkgewotCQkJaWYgKCFwdGVfY2hhaW4tPnBhcmVudF9wdGVzW2ldKQorCQkJdTY0ICpzcHRlID0gcHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpXTsKKworCQkJaWYgKCFzcHRlKQogCQkJCWJyZWFrOwotCQkJa3ZtX21tdV91cGRhdGVfdW5zeW5jX2JpdG1hcChwdGVfY2hhaW4tPnBhcmVudF9wdGVzW2ldKTsKKwkJCXBhcmVudF9zcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZSkpOworCQkJZm4ocGFyZW50X3NwLCBzcHRlKTsKIAkJfQogfQogCi1zdGF0aWMgaW50IHVuc3luY193YWxrX2ZuKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQotewotCWt2bV9tbXVfdXBkYXRlX3BhcmVudHNfdW5zeW5jKHNwKTsKLQlyZXR1cm4gMTsKLX0KLQorc3RhdGljIHZvaWQgbWFya191bnN5bmMoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsIHU2NCAqc3B0ZSk7CiBzdGF0aWMgdm9pZCBrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmMoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7Ci0JbW11X3BhcmVudF93YWxrKHNwLCB1bnN5bmNfd2Fsa19mbik7Ci0Ja3ZtX21tdV91cGRhdGVfcGFyZW50c191bnN5bmMoc3ApOworCW1tdV9wYXJlbnRfd2FsayhzcCwgbWFya191bnN5bmMpOworfQorCitzdGF0aWMgdm9pZCBtYXJrX3Vuc3luYyhzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpzcHRlKQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKworCWluZGV4ID0gc3B0ZSAtIHNwLT5zcHQ7CisJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChpbmRleCwgc3AtPnVuc3luY19jaGlsZF9iaXRtYXApKQorCQlyZXR1cm47CisJaWYgKHNwLT51bnN5bmNfY2hpbGRyZW4rKykKKwkJcmV0dXJuOworCWt2bV9tbXVfbWFya19wYXJlbnRzX3Vuc3luYyhzcCk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vbnBhZ2luZ19wcmVmZXRjaF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKQEAgLTEwNzcsNyArMTExMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbm9ucGFnaW5nX3N5bmNfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkgICAgICAgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCisJCQkgICAgICAgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsIGJvb2wgY2xlYXJfdW5zeW5jKQogewogCXJldHVybiAxOwogfQpAQCAtMTEyMywzNSArMTE1Niw0MCBAQAogCWludCBpLCByZXQsIG5yX3Vuc3luY19sZWFmID0gMDsKIAogCWZvcl9lYWNoX3Vuc3luY19jaGlsZHJlbihzcC0+dW5zeW5jX2NoaWxkX2JpdG1hcCwgaSkgeworCQlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpjaGlsZDsKIAkJdTY0IGVudCA9IHNwLT5zcHRbaV07CiAKLQkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZShlbnQpICYmICFpc19sYXJnZV9wdGUoZW50KSkgewotCQkJc3RydWN0IGt2bV9tbXVfcGFnZSAqY2hpbGQ7Ci0JCQljaGlsZCA9IHBhZ2VfaGVhZGVyKGVudCAmIFBUNjRfQkFTRV9BRERSX01BU0spOworCQlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZShlbnQpIHx8IGlzX2xhcmdlX3B0ZShlbnQpKQorCQkJZ290byBjbGVhcl9jaGlsZF9iaXRtYXA7CiAKLQkJCWlmIChjaGlsZC0+dW5zeW5jX2NoaWxkcmVuKSB7Ci0JCQkJaWYgKG1tdV9wYWdlc19hZGQocHZlYywgY2hpbGQsIGkpKQotCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJY2hpbGQgPSBwYWdlX2hlYWRlcihlbnQgJiBQVDY0X0JBU0VfQUREUl9NQVNLKTsKIAotCQkJCXJldCA9IF9fbW11X3Vuc3luY193YWxrKGNoaWxkLCBwdmVjKTsKLQkJCQlpZiAoIXJldCkKLQkJCQkJX19jbGVhcl9iaXQoaSwgc3AtPnVuc3luY19jaGlsZF9iaXRtYXApOwotCQkJCWVsc2UgaWYgKHJldCA+IDApCi0JCQkJCW5yX3Vuc3luY19sZWFmICs9IHJldDsKLQkJCQllbHNlCi0JCQkJCXJldHVybiByZXQ7Ci0JCQl9CisJCWlmIChjaGlsZC0+dW5zeW5jX2NoaWxkcmVuKSB7CisJCQlpZiAobW11X3BhZ2VzX2FkZChwdmVjLCBjaGlsZCwgaSkpCisJCQkJcmV0dXJuIC1FTk9TUEM7CiAKLQkJCWlmIChjaGlsZC0+dW5zeW5jKSB7Ci0JCQkJbnJfdW5zeW5jX2xlYWYrKzsKLQkJCQlpZiAobW11X3BhZ2VzX2FkZChwdmVjLCBjaGlsZCwgaSkpCi0JCQkJCXJldHVybiAtRU5PU1BDOwotCQkJfQotCQl9CisJCQlyZXQgPSBfX21tdV91bnN5bmNfd2FsayhjaGlsZCwgcHZlYyk7CisJCQlpZiAoIXJldCkKKwkJCQlnb3RvIGNsZWFyX2NoaWxkX2JpdG1hcDsKKwkJCWVsc2UgaWYgKHJldCA+IDApCisJCQkJbnJfdW5zeW5jX2xlYWYgKz0gcmV0OworCQkJZWxzZQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSBpZiAoY2hpbGQtPnVuc3luYykgeworCQkJbnJfdW5zeW5jX2xlYWYrKzsKKwkJCWlmIChtbXVfcGFnZXNfYWRkKHB2ZWMsIGNoaWxkLCBpKSkKKwkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfSBlbHNlCisJCQkgZ290byBjbGVhcl9jaGlsZF9iaXRtYXA7CisKKwkJY29udGludWU7CisKK2NsZWFyX2NoaWxkX2JpdG1hcDoKKwkJX19jbGVhcl9iaXQoaSwgc3AtPnVuc3luY19jaGlsZF9iaXRtYXApOworCQlzcC0+dW5zeW5jX2NoaWxkcmVuLS07CisJCVdBUk5fT04oKGludClzcC0+dW5zeW5jX2NoaWxkcmVuIDwgMCk7CiAJfQogCi0JaWYgKGZpbmRfZmlyc3RfYml0KHNwLT51bnN5bmNfY2hpbGRfYml0bWFwLCA1MTIpID09IDUxMikKLQkJc3AtPnVuc3luY19jaGlsZHJlbiA9IDA7CiAKIAlyZXR1cm4gbnJfdW5zeW5jX2xlYWY7CiB9CkBAIC0xMTY2LDI2ICsxMjA0LDYgQEAKIAlyZXR1cm4gX19tbXVfdW5zeW5jX3dhbGsoc3AsIHB2ZWMpOwogfQogCi1zdGF0aWMgc3RydWN0IGt2bV9tbXVfcGFnZSAqa3ZtX21tdV9sb29rdXBfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKLXsKLQl1bnNpZ25lZCBpbmRleDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OwotCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCi0JcGdwcmludGsoIiVzOiBsb29raW5nIGZvciBnZm4gJWx4XG4iLCBfX2Z1bmNfXywgZ2ZuKTsKLQlpbmRleCA9IGt2bV9wYWdlX3RhYmxlX2hhc2hmbihnZm4pOwotCWJ1Y2tldCA9ICZrdm0tPmFyY2gubW11X3BhZ2VfaGFzaFtpbmRleF07Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkoc3AsIG5vZGUsIGJ1Y2tldCwgaGFzaF9saW5rKQotCQlpZiAoc3AtPmdmbiA9PSBnZm4gJiYgIXNwLT5yb2xlLmRpcmVjdAotCQkgICAgJiYgIXNwLT5yb2xlLmludmFsaWQpIHsKLQkJCXBncHJpbnRrKCIlczogZm91bmQgcm9sZSAleFxuIiwKLQkJCQkgX19mdW5jX18sIHNwLT5yb2xlLndvcmQpOwotCQkJcmV0dXJuIHNwOwotCQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyB2b2lkIGt2bV91bmxpbmtfdW5zeW5jX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKIHsKIAlXQVJOX09OKCFzcC0+dW5zeW5jKTsKQEAgLTExOTQsMjAgKzEyMTIsMzYgQEAKIAktLWt2bS0+c3RhdC5tbXVfdW5zeW5jOwogfQogCi1zdGF0aWMgaW50IGt2bV9tbXVfemFwX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCk7CitzdGF0aWMgaW50IGt2bV9tbXVfcHJlcGFyZV96YXBfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICppbnZhbGlkX2xpc3QpOworc3RhdGljIHZvaWQga3ZtX21tdV9jb21taXRfemFwX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICppbnZhbGlkX2xpc3QpOwogCi1zdGF0aWMgaW50IGt2bV9zeW5jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKKyNkZWZpbmUgZm9yX2VhY2hfZ2ZuX3NwKGt2bSwgc3AsIGdmbiwgcG9zKQkJCQlcCisgIGhsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwLCBwb3MsCQkJCQkJXAorICAgJihrdm0pLT5hcmNoLm1tdV9wYWdlX2hhc2hba3ZtX3BhZ2VfdGFibGVfaGFzaGZuKGdmbildLCBoYXNoX2xpbmspCVwKKwlpZiAoKHNwKS0+Z2ZuICE9IChnZm4pKSB7fSBlbHNlCisKKyNkZWZpbmUgZm9yX2VhY2hfZ2ZuX2luZGlyZWN0X3ZhbGlkX3NwKGt2bSwgc3AsIGdmbiwgcG9zKQkJXAorICBobGlzdF9mb3JfZWFjaF9lbnRyeShzcCwgcG9zLAkJCQkJCVwKKyAgICYoa3ZtKS0+YXJjaC5tbXVfcGFnZV9oYXNoW2t2bV9wYWdlX3RhYmxlX2hhc2hmbihnZm4pXSwgaGFzaF9saW5rKQlcCisJCWlmICgoc3ApLT5nZm4gIT0gKGdmbikgfHwgKHNwKS0+cm9sZS5kaXJlY3QgfHwJCVwKKwkJCShzcCktPnJvbGUuaW52YWxpZCkge30gZWxzZQorCisvKiBAc3AtPmdmbiBzaG91bGQgYmUgd3JpdGUtcHJvdGVjdGVkIGF0IHRoZSBjYWxsIHNpdGUgKi8KK3N0YXRpYyBpbnQgX19rdm1fc3luY19wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsCisJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICppbnZhbGlkX2xpc3QsIGJvb2wgY2xlYXJfdW5zeW5jKQogewogCWlmIChzcC0+cm9sZS5jcjRfcGFlICE9ICEhaXNfcGFlKHZjcHUpKSB7Ci0JCWt2bV9tbXVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCk7CisJCWt2bV9tbXVfcHJlcGFyZV96YXBfcGFnZSh2Y3B1LT5rdm0sIHNwLCBpbnZhbGlkX2xpc3QpOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAocm1hcF93cml0ZV9wcm90ZWN0KHZjcHUtPmt2bSwgc3AtPmdmbikpCi0JCWt2bV9mbHVzaF9yZW1vdGVfdGxicyh2Y3B1LT5rdm0pOwotCWt2bV91bmxpbmtfdW5zeW5jX3BhZ2UodmNwdS0+a3ZtLCBzcCk7Ci0JaWYgKHZjcHUtPmFyY2gubW11LnN5bmNfcGFnZSh2Y3B1LCBzcCkpIHsKLQkJa3ZtX21tdV96YXBfcGFnZSh2Y3B1LT5rdm0sIHNwKTsKKwlpZiAoY2xlYXJfdW5zeW5jKQorCQlrdm1fdW5saW5rX3Vuc3luY19wYWdlKHZjcHUtPmt2bSwgc3ApOworCisJaWYgKHZjcHUtPmFyY2gubW11LnN5bmNfcGFnZSh2Y3B1LCBzcCwgY2xlYXJfdW5zeW5jKSkgeworCQlrdm1fbW11X3ByZXBhcmVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCwgaW52YWxpZF9saXN0KTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0xMjE1LDYgKzEyNDksNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBrdm1fc3luY19wYWdlX3RyYW5zaWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCit7CisJTElTVF9IRUFEKGludmFsaWRfbGlzdCk7CisJaW50IHJldDsKKworCXJldCA9IF9fa3ZtX3N5bmNfcGFnZSh2Y3B1LCBzcCwgJmludmFsaWRfbGlzdCwgZmFsc2UpOworCWlmIChyZXQpCisJCWt2bV9tbXVfY29tbWl0X3phcF9wYWdlKHZjcHUtPmt2bSwgJmludmFsaWRfbGlzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGt2bV9zeW5jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKKwkJCSBzdHJ1Y3QgbGlzdF9oZWFkICppbnZhbGlkX2xpc3QpCit7CisJcmV0dXJuIF9fa3ZtX3N5bmNfcGFnZSh2Y3B1LCBzcCwgaW52YWxpZF9saXN0LCB0cnVlKTsKK30KKworLyogQGdmbiBzaG91bGQgYmUgd3JpdGUtcHJvdGVjdGVkIGF0IHRoZSBjYWxsIHNpdGUgKi8KK3N0YXRpYyB2b2lkIGt2bV9zeW5jX3BhZ2VzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgIGdmbl90IGdmbikKK3sKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCUxJU1RfSEVBRChpbnZhbGlkX2xpc3QpOworCWJvb2wgZmx1c2ggPSBmYWxzZTsKKworCWZvcl9lYWNoX2dmbl9pbmRpcmVjdF92YWxpZF9zcCh2Y3B1LT5rdm0sIHMsIGdmbiwgbm9kZSkgeworCQlpZiAoIXMtPnVuc3luYykKKwkJCWNvbnRpbnVlOworCisJCVdBUk5fT04ocy0+cm9sZS5sZXZlbCAhPSBQVF9QQUdFX1RBQkxFX0xFVkVMKTsKKwkJaWYgKChzLT5yb2xlLmNyNF9wYWUgIT0gISFpc19wYWUodmNwdSkpIHx8CisJCQkodmNwdS0+YXJjaC5tbXUuc3luY19wYWdlKHZjcHUsIHMsIHRydWUpKSkgeworCQkJa3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKHZjcHUtPmt2bSwgcywgJmludmFsaWRfbGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlrdm1fdW5saW5rX3Vuc3luY19wYWdlKHZjcHUtPmt2bSwgcyk7CisJCWZsdXNoID0gdHJ1ZTsKKwl9CisKKwlrdm1fbW11X2NvbW1pdF96YXBfcGFnZSh2Y3B1LT5rdm0sICZpbnZhbGlkX2xpc3QpOworCWlmIChmbHVzaCkKKwkJa3ZtX21tdV9mbHVzaF90bGIodmNwdSk7Cit9CisKIHN0cnVjdCBtbXVfcGFnZV9wYXRoIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYXJlbnRbUFQ2NF9ST09UX0xFVkVMLTFdOwogCXVuc2lnbmVkIGludCBpZHhbUFQ2NF9ST09UX0xFVkVMLTFdOwpAQCAtMTI4MSw2ICsxMzYxLDcgQEAKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKIAlzdHJ1Y3QgbW11X3BhZ2VfcGF0aCBwYXJlbnRzOwogCXN0cnVjdCBrdm1fbW11X3BhZ2VzIHBhZ2VzOworCUxJU1RfSEVBRChpbnZhbGlkX2xpc3QpOwogCiAJa3ZtX21tdV9wYWdlc19pbml0KHBhcmVudCwgJnBhcmVudHMsICZwYWdlcyk7CiAJd2hpbGUgKG1tdV91bnN5bmNfd2FsayhwYXJlbnQsICZwYWdlcykpIHsKQEAgLTEyOTMsOSArMTM3NCwxMCBAQAogCQkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7CiAKIAkJZm9yX2VhY2hfc3AocGFnZXMsIHNwLCBwYXJlbnRzLCBpKSB7Ci0JCQlrdm1fc3luY19wYWdlKHZjcHUsIHNwKTsKKwkJCWt2bV9zeW5jX3BhZ2UodmNwdSwgc3AsICZpbnZhbGlkX2xpc3QpOwogCQkJbW11X3BhZ2VzX2NsZWFyX3BhcmVudHMoJnBhcmVudHMpOwogCQl9CisJCWt2bV9tbXVfY29tbWl0X3phcF9wYWdlKHZjcHUtPmt2bSwgJmludmFsaWRfbGlzdCk7CiAJCWNvbmRfcmVzY2hlZF9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAkJa3ZtX21tdV9wYWdlc19pbml0KHBhcmVudCwgJnBhcmVudHMsICZwYWdlcyk7CiAJfQpAQCAtMTMxMCwxMSArMTM5MiwxMCBAQAogCQkJCQkgICAgIHU2NCAqcGFyZW50X3B0ZSkKIHsKIAl1bmlvbiBrdm1fbW11X3BhZ2Vfcm9sZSByb2xlOwotCXVuc2lnbmVkIGluZGV4OwogCXVuc2lnbmVkIHF1YWRyYW50OwotCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQ7CiAJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICp0bXA7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJYm9vbCBuZWVkX3N5bmMgPSBmYWxzZTsKIAogCXJvbGUgPSB2Y3B1LT5hcmNoLm1tdS5iYXNlX3JvbGU7CiAJcm9sZS5sZXZlbCA9IGxldmVsOwpAQCAtMTMyMiw0MCArMTQwMyw0NSBAQAogCWlmIChyb2xlLmRpcmVjdCkKIAkJcm9sZS5jcjRfcGFlID0gMDsKIAlyb2xlLmFjY2VzcyA9IGFjY2VzczsKLQlpZiAodmNwdS0+YXJjaC5tbXUucm9vdF9sZXZlbCA8PSBQVDMyX1JPT1RfTEVWRUwpIHsKKwlpZiAoIXRkcF9lbmFibGVkICYmIHZjcHUtPmFyY2gubW11LnJvb3RfbGV2ZWwgPD0gUFQzMl9ST09UX0xFVkVMKSB7CiAJCXF1YWRyYW50ID0gZ2FkZHIgPj4gKFBBR0VfU0hJRlQgKyAoUFQ2NF9QVF9CSVRTICogbGV2ZWwpKTsKIAkJcXVhZHJhbnQgJj0gKDEgPDwgKChQVDMyX1BUX0JJVFMgLSBQVDY0X1BUX0JJVFMpICogbGV2ZWwpKSAtIDE7CiAJCXJvbGUucXVhZHJhbnQgPSBxdWFkcmFudDsKIAl9Ci0JaW5kZXggPSBrdm1fcGFnZV90YWJsZV9oYXNoZm4oZ2ZuKTsKLQlidWNrZXQgPSAmdmNwdS0+a3ZtLT5hcmNoLm1tdV9wYWdlX2hhc2hbaW5kZXhdOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3AsIG5vZGUsIHRtcCwgYnVja2V0LCBoYXNoX2xpbmspCi0JCWlmIChzcC0+Z2ZuID09IGdmbikgewotCQkJaWYgKHNwLT51bnN5bmMpCi0JCQkJaWYgKGt2bV9zeW5jX3BhZ2UodmNwdSwgc3ApKQotCQkJCQljb250aW51ZTsKKwlmb3JfZWFjaF9nZm5fc3AodmNwdS0+a3ZtLCBzcCwgZ2ZuLCBub2RlKSB7CisJCWlmICghbmVlZF9zeW5jICYmIHNwLT51bnN5bmMpCisJCQluZWVkX3N5bmMgPSB0cnVlOwogCi0JCQlpZiAoc3AtPnJvbGUud29yZCAhPSByb2xlLndvcmQpCi0JCQkJY29udGludWU7CisJCWlmIChzcC0+cm9sZS53b3JkICE9IHJvbGUud29yZCkKKwkJCWNvbnRpbnVlOwogCi0JCQltbXVfcGFnZV9hZGRfcGFyZW50X3B0ZSh2Y3B1LCBzcCwgcGFyZW50X3B0ZSk7Ci0JCQlpZiAoc3AtPnVuc3luY19jaGlsZHJlbikgewotCQkJCXNldF9iaXQoS1ZNX1JFUV9NTVVfU1lOQywgJnZjcHUtPnJlcXVlc3RzKTsKLQkJCQlrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmMoc3ApOwotCQkJfQotCQkJdHJhY2Vfa3ZtX21tdV9nZXRfcGFnZShzcCwgZmFsc2UpOwotCQkJcmV0dXJuIHNwOwotCQl9CisJCWlmIChzcC0+dW5zeW5jICYmIGt2bV9zeW5jX3BhZ2VfdHJhbnNpZW50KHZjcHUsIHNwKSkKKwkJCWJyZWFrOworCisJCW1tdV9wYWdlX2FkZF9wYXJlbnRfcHRlKHZjcHUsIHNwLCBwYXJlbnRfcHRlKTsKKwkJaWYgKHNwLT51bnN5bmNfY2hpbGRyZW4pIHsKKwkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9NTVVfU1lOQywgdmNwdSk7CisJCQlrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmMoc3ApOworCQl9IGVsc2UgaWYgKHNwLT51bnN5bmMpCisJCQlrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmMoc3ApOworCisJCXRyYWNlX2t2bV9tbXVfZ2V0X3BhZ2Uoc3AsIGZhbHNlKTsKKwkJcmV0dXJuIHNwOworCX0KIAkrK3ZjcHUtPmt2bS0+c3RhdC5tbXVfY2FjaGVfbWlzczsKLQlzcCA9IGt2bV9tbXVfYWxsb2NfcGFnZSh2Y3B1LCBwYXJlbnRfcHRlKTsKKwlzcCA9IGt2bV9tbXVfYWxsb2NfcGFnZSh2Y3B1LCBwYXJlbnRfcHRlLCBkaXJlY3QpOwogCWlmICghc3ApCiAJCXJldHVybiBzcDsKIAlzcC0+Z2ZuID0gZ2ZuOwogCXNwLT5yb2xlID0gcm9sZTsKLQlobGlzdF9hZGRfaGVhZCgmc3AtPmhhc2hfbGluaywgYnVja2V0KTsKKwlobGlzdF9hZGRfaGVhZCgmc3AtPmhhc2hfbGluaywKKwkJJnZjcHUtPmt2bS0+YXJjaC5tbXVfcGFnZV9oYXNoW2t2bV9wYWdlX3RhYmxlX2hhc2hmbihnZm4pXSk7CiAJaWYgKCFkaXJlY3QpIHsKIAkJaWYgKHJtYXBfd3JpdGVfcHJvdGVjdCh2Y3B1LT5rdm0sIGdmbikpCiAJCQlrdm1fZmx1c2hfcmVtb3RlX3RsYnModmNwdS0+a3ZtKTsKKwkJaWYgKGxldmVsID4gUFRfUEFHRV9UQUJMRV9MRVZFTCAmJiBuZWVkX3N5bmMpCisJCQlrdm1fc3luY19wYWdlcyh2Y3B1LCBnZm4pOworCiAJCWFjY291bnRfc2hhZG93ZWQodmNwdS0+a3ZtLCBnZm4pOwogCX0KIAlpZiAoc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUgIT0gc2hhZG93X25vdHJhcF9ub25wcmVzZW50X3B0ZSkKQEAgLTE0MDIsNiArMTQ4OCw0NyBAQAogCS0taXRlcmF0b3ItPmxldmVsOwogfQogCitzdGF0aWMgdm9pZCBsaW5rX3NoYWRvd19wYWdlKHU2NCAqc3B0ZXAsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCXU2NCBzcHRlOworCisJc3B0ZSA9IF9fcGEoc3AtPnNwdCkKKwkJfCBQVF9QUkVTRU5UX01BU0sgfCBQVF9BQ0NFU1NFRF9NQVNLCisJCXwgUFRfV1JJVEFCTEVfTUFTSyB8IFBUX1VTRVJfTUFTSzsKKwlfX3NldF9zcHRlKHNwdGVwLCBzcHRlKTsKK30KKworc3RhdGljIHZvaWQgZHJvcF9sYXJnZV9zcHRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICpzcHRlcCkKK3sKKwlpZiAoaXNfbGFyZ2VfcHRlKCpzcHRlcCkpIHsKKwkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgc3B0ZXAsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9kaXJlY3Rfc3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCAqc3B0ZXAsCisJCQkJICAgdW5zaWduZWQgZGlyZWN0X2FjY2VzcykKK3sKKwlpZiAoaXNfc2hhZG93X3ByZXNlbnRfcHRlKCpzcHRlcCkgJiYgIWlzX2xhcmdlX3B0ZSgqc3B0ZXApKSB7CisJCXN0cnVjdCBrdm1fbW11X3BhZ2UgKmNoaWxkOworCisJCS8qCisJCSAqIEZvciB0aGUgZGlyZWN0IHNwLCBpZiB0aGUgZ3Vlc3QgcHRlJ3MgZGlydHkgYml0CisJCSAqIGNoYW5nZWQgZm9ybSBjbGVhbiB0byBkaXJ0eSwgaXQgd2lsbCBjb3JydXB0IHRoZQorCQkgKiBzcCdzIGFjY2VzczogYWxsb3cgd3JpdGFibGUgaW4gdGhlIHJlYWQtb25seSBzcCwKKwkJICogc28gd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgc3B0ZSBhdCB0aGlzIHBvaW50IHRvIGdldAorCQkgKiBhIG5ldyBzcCB3aXRoIHRoZSBjb3JyZWN0IGFjY2Vzcy4KKwkJICovCisJCWNoaWxkID0gcGFnZV9oZWFkZXIoKnNwdGVwICYgUFQ2NF9CQVNFX0FERFJfTUFTSyk7CisJCWlmIChjaGlsZC0+cm9sZS5hY2Nlc3MgPT0gZGlyZWN0X2FjY2VzcykKKwkJCXJldHVybjsKKworCQltbXVfcGFnZV9yZW1vdmVfcGFyZW50X3B0ZShjaGlsZCwgc3B0ZXApOworCQlfX3NldF9zcHRlKHNwdGVwLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyh2Y3B1LT5rdm0pOworCX0KK30KKwogc3RhdGljIHZvaWQga3ZtX21tdV9wYWdlX3VubGlua19jaGlsZHJlbihzdHJ1Y3Qga3ZtICprdm0sCiAJCQkJCSBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKIHsKQEAgLTE0MjIsNyArMTU0OSw4IEBACiAJCQl9IGVsc2UgewogCQkJCWlmIChpc19sYXJnZV9wdGUoZW50KSkKIAkJCQkJLS1rdm0tPnN0YXQubHBhZ2VzOwotCQkJCXJtYXBfcmVtb3ZlKGt2bSwgJnB0W2ldKTsKKwkJCQlkcm9wX3NwdGUoa3ZtLCAmcHRbaV0sCisJCQkJCSAgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOwogCQkJfQogCQl9CiAJCXB0W2ldID0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGU7CkBAIC0xNDY0LDcgKzE1OTIsOCBAQAogfQogCiBzdGF0aWMgaW50IG1tdV96YXBfdW5zeW5jX2NoaWxkcmVuKHN0cnVjdCBrdm0gKmt2bSwKLQkJCQkgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYXJlbnQpCisJCQkJICAgc3RydWN0IGt2bV9tbXVfcGFnZSAqcGFyZW50LAorCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmludmFsaWRfbGlzdCkKIHsKIAlpbnQgaSwgemFwcGVkID0gMDsKIAlzdHJ1Y3QgbW11X3BhZ2VfcGF0aCBwYXJlbnRzOwpAQCAtMTQ3OCw3ICsxNjA3LDcgQEAKIAkJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7CiAKIAkJZm9yX2VhY2hfc3AocGFnZXMsIHNwLCBwYXJlbnRzLCBpKSB7Ci0JCQlrdm1fbW11X3phcF9wYWdlKGt2bSwgc3ApOworCQkJa3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKGt2bSwgc3AsIGludmFsaWRfbGlzdCk7CiAJCQltbXVfcGFnZXNfY2xlYXJfcGFyZW50cygmcGFyZW50cyk7CiAJCQl6YXBwZWQrKzsKIAkJfQpAQCAtMTQ4OCwzMiArMTYxNyw1MiBAQAogCXJldHVybiB6YXBwZWQ7CiB9CiAKLXN0YXRpYyBpbnQga3ZtX21tdV96YXBfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQorc3RhdGljIGludCBrdm1fbW11X3ByZXBhcmVfemFwX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqaW52YWxpZF9saXN0KQogewogCWludCByZXQ7CiAKLQl0cmFjZV9rdm1fbW11X3phcF9wYWdlKHNwKTsKKwl0cmFjZV9rdm1fbW11X3ByZXBhcmVfemFwX3BhZ2Uoc3ApOwogCSsra3ZtLT5zdGF0Lm1tdV9zaGFkb3dfemFwcGVkOwotCXJldCA9IG1tdV96YXBfdW5zeW5jX2NoaWxkcmVuKGt2bSwgc3ApOworCXJldCA9IG1tdV96YXBfdW5zeW5jX2NoaWxkcmVuKGt2bSwgc3AsIGludmFsaWRfbGlzdCk7CiAJa3ZtX21tdV9wYWdlX3VubGlua19jaGlsZHJlbihrdm0sIHNwKTsKIAlrdm1fbW11X3VubGlua19wYXJlbnRzKGt2bSwgc3ApOwotCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOwogCWlmICghc3AtPnJvbGUuaW52YWxpZCAmJiAhc3AtPnJvbGUuZGlyZWN0KQogCQl1bmFjY291bnRfc2hhZG93ZWQoa3ZtLCBzcC0+Z2ZuKTsKIAlpZiAoc3AtPnVuc3luYykKIAkJa3ZtX3VubGlua191bnN5bmNfcGFnZShrdm0sIHNwKTsKIAlpZiAoIXNwLT5yb290X2NvdW50KSB7Ci0JCWhsaXN0X2RlbCgmc3AtPmhhc2hfbGluayk7Ci0JCWt2bV9tbXVfZnJlZV9wYWdlKGt2bSwgc3ApOworCQkvKiBDb3VudCBzZWxmICovCisJCXJldCsrOworCQlsaXN0X21vdmUoJnNwLT5saW5rLCBpbnZhbGlkX2xpc3QpOwogCX0gZWxzZSB7Ci0JCXNwLT5yb2xlLmludmFsaWQgPSAxOwogCQlsaXN0X21vdmUoJnNwLT5saW5rLCAma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMpOwogCQlrdm1fcmVsb2FkX3JlbW90ZV9tbXVzKGt2bSk7CiAJfQorCisJc3AtPnJvbGUuaW52YWxpZCA9IDE7CiAJa3ZtX21tdV9yZXNldF9sYXN0X3B0ZV91cGRhdGVkKGt2bSk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQga3ZtX21tdV9jb21taXRfemFwX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICppbnZhbGlkX2xpc3QpCit7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7CisKKwlpZiAobGlzdF9lbXB0eShpbnZhbGlkX2xpc3QpKQorCQlyZXR1cm47CisKKwlrdm1fZmx1c2hfcmVtb3RlX3RsYnMoa3ZtKTsKKworCWRvIHsKKwkJc3AgPSBsaXN0X2ZpcnN0X2VudHJ5KGludmFsaWRfbGlzdCwgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7CisJCVdBUk5fT04oIXNwLT5yb2xlLmludmFsaWQgfHwgc3AtPnJvb3RfY291bnQpOworCQlrdm1fbW11X2ZyZWVfcGFnZShrdm0sIHNwKTsKKwl9IHdoaWxlICghbGlzdF9lbXB0eShpbnZhbGlkX2xpc3QpKTsKKworfQorCiAvKgogICogQ2hhbmdpbmcgdGhlIG51bWJlciBvZiBtbXUgcGFnZXMgYWxsb2NhdGVkIHRvIHRoZSB2bQogICogTm90ZTogaWYga3ZtX25yX21tdV9wYWdlcyBpcyB0b28gc21hbGwsIHlvdSB3aWxsIGdldCBkZWFkIGxvY2sKQEAgLTE1MjEsNiArMTY3MCw3IEBACiB2b2lkIGt2bV9tbXVfY2hhbmdlX21tdV9wYWdlcyhzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGludCBrdm1fbnJfbW11X3BhZ2VzKQogewogCWludCB1c2VkX3BhZ2VzOworCUxJU1RfSEVBRChpbnZhbGlkX2xpc3QpOwogCiAJdXNlZF9wYWdlcyA9IGt2bS0+YXJjaC5uX2FsbG9jX21tdV9wYWdlcyAtIGt2bS0+YXJjaC5uX2ZyZWVfbW11X3BhZ2VzOwogCXVzZWRfcGFnZXMgPSBtYXgoMCwgdXNlZF9wYWdlcyk7CkBAIC0xNTM4LDkgKzE2ODgsMTAgQEAKIAogCQkJcGFnZSA9IGNvbnRhaW5lcl9vZihrdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcy5wcmV2LAogCQkJCQkgICAgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7Ci0JCQl1c2VkX3BhZ2VzIC09IGt2bV9tbXVfemFwX3BhZ2Uoa3ZtLCBwYWdlKTsKLQkJCXVzZWRfcGFnZXMtLTsKKwkJCXVzZWRfcGFnZXMgLT0ga3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKGt2bSwgcGFnZSwKKwkJCQkJCQkgICAgICAgJmludmFsaWRfbGlzdCk7CiAJCX0KKwkJa3ZtX21tdV9jb21taXRfemFwX3BhZ2Uoa3ZtLCAmaW52YWxpZF9saXN0KTsKIAkJa3ZtX25yX21tdV9wYWdlcyA9IHVzZWRfcGFnZXM7CiAJCWt2bS0+YXJjaC5uX2ZyZWVfbW11X3BhZ2VzID0gMDsKIAl9CkBAIC0xNTUzLDQ3ICsxNzA0LDM2IEBACiAKIHN0YXRpYyBpbnQga3ZtX21tdV91bnByb3RlY3RfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKLQl1bnNpZ25lZCBpbmRleDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OwogCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlMSVNUX0hFQUQoaW52YWxpZF9saXN0KTsKIAlpbnQgcjsKIAogCXBncHJpbnRrKCIlczogbG9va2luZyBmb3IgZ2ZuICVseFxuIiwgX19mdW5jX18sIGdmbik7CiAJciA9IDA7Ci0JaW5kZXggPSBrdm1fcGFnZV90YWJsZV9oYXNoZm4oZ2ZuKTsKLQlidWNrZXQgPSAma3ZtLT5hcmNoLm1tdV9wYWdlX2hhc2hbaW5kZXhdOwotcmVzdGFydDoKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwLCBub2RlLCBuLCBidWNrZXQsIGhhc2hfbGluaykKLQkJaWYgKHNwLT5nZm4gPT0gZ2ZuICYmICFzcC0+cm9sZS5kaXJlY3QpIHsKLQkJCXBncHJpbnRrKCIlczogZ2ZuICVseCByb2xlICV4XG4iLCBfX2Z1bmNfXywgZ2ZuLAotCQkJCSBzcC0+cm9sZS53b3JkKTsKLQkJCXIgPSAxOwotCQkJaWYgKGt2bV9tbXVfemFwX3BhZ2Uoa3ZtLCBzcCkpCi0JCQkJZ290byByZXN0YXJ0OwotCQl9CisKKwlmb3JfZWFjaF9nZm5faW5kaXJlY3RfdmFsaWRfc3Aoa3ZtLCBzcCwgZ2ZuLCBub2RlKSB7CisJCXBncHJpbnRrKCIlczogZ2ZuICVseCByb2xlICV4XG4iLCBfX2Z1bmNfXywgZ2ZuLAorCQkJIHNwLT5yb2xlLndvcmQpOworCQlyID0gMTsKKwkJa3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKGt2bSwgc3AsICZpbnZhbGlkX2xpc3QpOworCX0KKwlrdm1fbW11X2NvbW1pdF96YXBfcGFnZShrdm0sICZpbnZhbGlkX2xpc3QpOwogCXJldHVybiByOwogfQogCiBzdGF0aWMgdm9pZCBtbXVfdW5zaGFkb3coc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCiB7Ci0JdW5zaWduZWQgaW5kZXg7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5uOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCUxJU1RfSEVBRChpbnZhbGlkX2xpc3QpOwogCi0JaW5kZXggPSBrdm1fcGFnZV90YWJsZV9oYXNoZm4oZ2ZuKTsKLQlidWNrZXQgPSAma3ZtLT5hcmNoLm1tdV9wYWdlX2hhc2hbaW5kZXhdOwotcmVzdGFydDoKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwLCBub2RlLCBubiwgYnVja2V0LCBoYXNoX2xpbmspIHsKLQkJaWYgKHNwLT5nZm4gPT0gZ2ZuICYmICFzcC0+cm9sZS5kaXJlY3QKLQkJICAgICYmICFzcC0+cm9sZS5pbnZhbGlkKSB7Ci0JCQlwZ3ByaW50aygiJXM6IHphcCAlbHggJXhcbiIsCi0JCQkJIF9fZnVuY19fLCBnZm4sIHNwLT5yb2xlLndvcmQpOwotCQkJaWYgKGt2bV9tbXVfemFwX3BhZ2Uoa3ZtLCBzcCkpCi0JCQkJZ290byByZXN0YXJ0OwotCQl9CisJZm9yX2VhY2hfZ2ZuX2luZGlyZWN0X3ZhbGlkX3NwKGt2bSwgc3AsIGdmbiwgbm9kZSkgeworCQlwZ3ByaW50aygiJXM6IHphcCAlbHggJXhcbiIsCisJCQkgX19mdW5jX18sIGdmbiwgc3AtPnJvbGUud29yZCk7CisJCWt2bV9tbXVfcHJlcGFyZV96YXBfcGFnZShrdm0sIHNwLCAmaW52YWxpZF9saXN0KTsKIAl9CisJa3ZtX21tdV9jb21taXRfemFwX3BhZ2Uoa3ZtLCAmaW52YWxpZF9saXN0KTsKIH0KIAogc3RhdGljIHZvaWQgcGFnZV9oZWFkZXJfdXBkYXRlX3Nsb3Qoc3RydWN0IGt2bSAqa3ZtLCB2b2lkICpwdGUsIGdmbl90IGdmbikKQEAgLTE3MjMsNDcgKzE4NjMsNTEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9nZXRfZ3Vlc3RfbWVtb3J5X3R5cGUpOwogCi1zdGF0aWMgaW50IGt2bV91bnN5bmNfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQorc3RhdGljIHZvaWQgX19rdm1fdW5zeW5jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKIHsKLQl1bnNpZ25lZCBpbmRleDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OwotCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnM7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCi0JaW5kZXggPSBrdm1fcGFnZV90YWJsZV9oYXNoZm4oc3AtPmdmbik7Ci0JYnVja2V0ID0gJnZjcHUtPmt2bS0+YXJjaC5tbXVfcGFnZV9oYXNoW2luZGV4XTsKLQkvKiBkb24ndCB1bnN5bmMgaWYgcGFnZXRhYmxlIGlzIHNoYWRvd2VkIHdpdGggbXVsdGlwbGUgcm9sZXMgKi8KLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIG5vZGUsIG4sIGJ1Y2tldCwgaGFzaF9saW5rKSB7Ci0JCWlmIChzLT5nZm4gIT0gc3AtPmdmbiB8fCBzLT5yb2xlLmRpcmVjdCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocy0+cm9sZS53b3JkICE9IHNwLT5yb2xlLndvcmQpCi0JCQlyZXR1cm4gMTsKLQl9CiAJdHJhY2Vfa3ZtX21tdV91bnN5bmNfcGFnZShzcCk7CiAJKyt2Y3B1LT5rdm0tPnN0YXQubW11X3Vuc3luYzsKIAlzcC0+dW5zeW5jID0gMTsKIAogCWt2bV9tbXVfbWFya19wYXJlbnRzX3Vuc3luYyhzcCk7Ci0KIAltbXVfY29udmVydF9ub3RyYXAoc3ApOwotCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrdm1fdW5zeW5jX3BhZ2VzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgIGdmbl90IGdmbikKK3sKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJZm9yX2VhY2hfZ2ZuX2luZGlyZWN0X3ZhbGlkX3NwKHZjcHUtPmt2bSwgcywgZ2ZuLCBub2RlKSB7CisJCWlmIChzLT51bnN5bmMpCisJCQljb250aW51ZTsKKwkJV0FSTl9PTihzLT5yb2xlLmxldmVsICE9IFBUX1BBR0VfVEFCTEVfTEVWRUwpOworCQlfX2t2bV91bnN5bmNfcGFnZSh2Y3B1LCBzKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgbW11X25lZWRfd3JpdGVfcHJvdGVjdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGdmbiwKIAkJCQkgIGJvb2wgY2FuX3Vuc3luYykKIHsKLQlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzaGFkb3c7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlib29sIG5lZWRfdW5zeW5jID0gZmFsc2U7CiAKLQlzaGFkb3cgPSBrdm1fbW11X2xvb2t1cF9wYWdlKHZjcHUtPmt2bSwgZ2ZuKTsKLQlpZiAoc2hhZG93KSB7Ci0JCWlmIChzaGFkb3ctPnJvbGUubGV2ZWwgIT0gUFRfUEFHRV9UQUJMRV9MRVZFTCkKKwlmb3JfZWFjaF9nZm5faW5kaXJlY3RfdmFsaWRfc3AodmNwdS0+a3ZtLCBzLCBnZm4sIG5vZGUpIHsKKwkJaWYgKCFjYW5fdW5zeW5jKQogCQkJcmV0dXJuIDE7Ci0JCWlmIChzaGFkb3ctPnVuc3luYykKLQkJCXJldHVybiAwOwotCQlpZiAoY2FuX3Vuc3luYyAmJiBvb3Nfc2hhZG93KQotCQkJcmV0dXJuIGt2bV91bnN5bmNfcGFnZSh2Y3B1LCBzaGFkb3cpOwotCQlyZXR1cm4gMTsKKworCQlpZiAocy0+cm9sZS5sZXZlbCAhPSBQVF9QQUdFX1RBQkxFX0xFVkVMKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKCFuZWVkX3Vuc3luYyAmJiAhcy0+dW5zeW5jKSB7CisJCQlpZiAoIW9vc19zaGFkb3cpCisJCQkJcmV0dXJuIDE7CisJCQluZWVkX3Vuc3luYyA9IHRydWU7CisJCX0KIAl9CisJaWYgKG5lZWRfdW5zeW5jKQorCQlrdm1fdW5zeW5jX3BhZ2VzKHZjcHUsIGdmbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4MDQsMTMgKzE5NDgsMTQgQEAKIAlzcHRlIHw9ICh1NjQpcGZuIDw8IFBBR0VfU0hJRlQ7CiAKIAlpZiAoKHB0ZV9hY2Nlc3MgJiBBQ0NfV1JJVEVfTUFTSykKLQkgICAgfHwgKHdyaXRlX2ZhdWx0ICYmICFpc193cml0ZV9wcm90ZWN0aW9uKHZjcHUpICYmICF1c2VyX2ZhdWx0KSkgeworCSAgICB8fCAoIXRkcF9lbmFibGVkICYmIHdyaXRlX2ZhdWx0ICYmICFpc193cml0ZV9wcm90ZWN0aW9uKHZjcHUpCisJCSYmICF1c2VyX2ZhdWx0KSkgewogCiAJCWlmIChsZXZlbCA+IFBUX1BBR0VfVEFCTEVfTEVWRUwgJiYKIAkJICAgIGhhc193cnByb3RlY3RlZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuLCBsZXZlbCkpIHsKIAkJCXJldCA9IDE7Ci0JCQlzcHRlID0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGU7Ci0JCQlnb3RvIHNldF9wdGU7CisJCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlcCwgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOworCQkJZ290byBkb25lOwogCQl9CiAKIAkJc3B0ZSB8PSBQVF9XUklUQUJMRV9NQVNLOwpAQCAtMTg0MSw3ICsxOTg2LDEwIEBACiAJCW1hcmtfcGFnZV9kaXJ0eSh2Y3B1LT5rdm0sIGdmbik7CiAKIHNldF9wdGU6Ci0JX19zZXRfc3B0ZShzcHRlcCwgc3B0ZSk7CisJaWYgKGlzX3dyaXRhYmxlX3B0ZSgqc3B0ZXApICYmICFpc193cml0YWJsZV9wdGUoc3B0ZSkpCisJCWt2bV9zZXRfcGZuX2RpcnR5KHBmbik7CisJdXBkYXRlX3NwdGUoc3B0ZXAsIHNwdGUpOworZG9uZToKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xODUzLDcgKzIwMDEsNiBAQAogCQkJIGJvb2wgcmVzZXRfaG9zdF9wcm90ZWN0aW9uKQogewogCWludCB3YXNfcm1hcHBlZCA9IDA7Ci0JaW50IHdhc193cml0YWJsZSA9IGlzX3dyaXRhYmxlX3B0ZSgqc3B0ZXApOwogCWludCBybWFwX2NvdW50OwogCiAJcGdwcmludGsoIiVzOiBzcHRlICVsbHggYWNjZXNzICV4IHdyaXRlX2ZhdWx0ICVkIgpAQCAtMTg3OCw4ICsyMDI1LDcgQEAKIAkJfSBlbHNlIGlmIChwZm4gIT0gc3B0ZV90b19wZm4oKnNwdGVwKSkgewogCQkJcGdwcmludGsoImhmbiBvbGQgJWx4IG5ldyAlbHhcbiIsCiAJCQkJIHNwdGVfdG9fcGZuKCpzcHRlcCksIHBmbik7Ci0JCQlybWFwX3JlbW92ZSh2Y3B1LT5rdm0sIHNwdGVwKTsKLQkJCV9fc2V0X3NwdGUoc3B0ZXAsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCWRyb3Bfc3B0ZSh2Y3B1LT5rdm0sIHNwdGVwLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CiAJCQlrdm1fZmx1c2hfcmVtb3RlX3RsYnModmNwdS0+a3ZtKTsKIAkJfSBlbHNlCiAJCQl3YXNfcm1hcHBlZCA9IDE7CkBAIC0xODkwLDcgKzIwMzYsNyBAQAogCQkgICAgICByZXNldF9ob3N0X3Byb3RlY3Rpb24pKSB7CiAJCWlmICh3cml0ZV9mYXVsdCkKIAkJCSpwdHdyaXRlID0gMTsKLQkJa3ZtX3g4Nl9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKKwkJa3ZtX21tdV9mbHVzaF90bGIodmNwdSk7CiAJfQogCiAJcGdwcmludGsoIiVzOiBzZXR0aW5nIHNwdGUgJWxseFxuIiwgX19mdW5jX18sICpzcHRlcCk7CkBAIC0xOTA0LDE1ICsyMDUwLDEwIEBACiAJcGFnZV9oZWFkZXJfdXBkYXRlX3Nsb3QodmNwdS0+a3ZtLCBzcHRlcCwgZ2ZuKTsKIAlpZiAoIXdhc19ybWFwcGVkKSB7CiAJCXJtYXBfY291bnQgPSBybWFwX2FkZCh2Y3B1LCBzcHRlcCwgZ2ZuKTsKLQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CiAJCWlmIChybWFwX2NvdW50ID4gUk1BUF9SRUNZQ0xFX1RIUkVTSE9MRCkKIAkJCXJtYXBfcmVjeWNsZSh2Y3B1LCBzcHRlcCwgZ2ZuKTsKLQl9IGVsc2UgewotCQlpZiAod2FzX3dyaXRhYmxlKQotCQkJa3ZtX3JlbGVhc2VfcGZuX2RpcnR5KHBmbik7Ci0JCWVsc2UKLQkJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihwZm4pOwogCX0KKwlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocGZuKTsKIAlpZiAoc3BlY3VsYXRpdmUpIHsKIAkJdmNwdS0+YXJjaC5sYXN0X3B0ZV91cGRhdGVkID0gc3B0ZXA7CiAJCXZjcHUtPmFyY2gubGFzdF9wdGVfZ2ZuID0gZ2ZuOwpAQCAtMTk0MSw3ICsyMDgyLDEwIEBACiAJCX0KIAogCQlpZiAoKml0ZXJhdG9yLnNwdGVwID09IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKSB7Ci0JCQlwc2V1ZG9fZ2ZuID0gKGl0ZXJhdG9yLmFkZHIgJiBQVDY0X0RJUl9CQVNFX0FERFJfTUFTSykgPj4gUEFHRV9TSElGVDsKKwkJCXU2NCBiYXNlX2FkZHIgPSBpdGVyYXRvci5hZGRyOworCisJCQliYXNlX2FkZHIgJj0gUFQ2NF9MVkxfQUREUl9NQVNLKGl0ZXJhdG9yLmxldmVsKTsKKwkJCXBzZXVkb19nZm4gPSBiYXNlX2FkZHIgPj4gUEFHRV9TSElGVDsKIAkJCXNwID0ga3ZtX21tdV9nZXRfcGFnZSh2Y3B1LCBwc2V1ZG9fZ2ZuLCBpdGVyYXRvci5hZGRyLAogCQkJCQkgICAgICBpdGVyYXRvci5sZXZlbCAtIDEsCiAJCQkJCSAgICAgIDEsIEFDQ19BTEwsIGl0ZXJhdG9yLnNwdGVwKTsKQEAgLTE5NjAsNiArMjEwNCwyOSBAQAogCXJldHVybiBwdF93cml0ZTsKIH0KIAorc3RhdGljIHZvaWQga3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQoreworCWNoYXIgYnVmWzFdOworCXZvaWQgX191c2VyICpodmE7CisJaW50IHI7CisKKwkvKiBUb3VjaCB0aGUgcGFnZSwgc28gc2VuZCBTSUdCVVMgKi8KKwlodmEgPSAodm9pZCBfX3VzZXIgKilnZm5fdG9faHZhKGt2bSwgZ2ZuKTsKKwlyID0gY29weV9mcm9tX3VzZXIoYnVmLCBodmEsIDEpOworfQorCitzdGF0aWMgaW50IGt2bV9oYW5kbGVfYmFkX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIHBmbl90IHBmbikKK3sKKwlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocGZuKTsKKwlpZiAoaXNfaHdwb2lzb25fcGZuKHBmbikpIHsKKwkJa3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKGt2bSwgZ2ZuKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpc19mYXVsdF9wZm4ocGZuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBub25wYWdpbmdfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgdiwgaW50IHdyaXRlLCBnZm5fdCBnZm4pCiB7CiAJaW50IHI7CkBAIC0xOTgzLDEwICsyMTUwLDggQEAKIAlwZm4gPSBnZm5fdG9fcGZuKHZjcHUtPmt2bSwgZ2ZuKTsKIAogCS8qIG1taW8gKi8KLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpIHsKLQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7Ci0JCXJldHVybiAxOwotCX0KKwlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCisJCXJldHVybiBrdm1faGFuZGxlX2JhZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuLCBwZm4pOwogCiAJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAlpZiAobW11X25vdGlmaWVyX3JldHJ5KHZjcHUsIG1tdV9zZXEpKQpAQCAtMjAwOSw2ICsyMTc0LDcgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKKwlMSVNUX0hFQUQoaW52YWxpZF9saXN0KTsKIAogCWlmICghVkFMSURfUEFHRSh2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSkpCiAJCXJldHVybjsKQEAgLTIwMTgsOCArMjE4NCwxMCBAQAogCiAJCXNwID0gcGFnZV9oZWFkZXIocm9vdCk7CiAJCS0tc3AtPnJvb3RfY291bnQ7Ci0JCWlmICghc3AtPnJvb3RfY291bnQgJiYgc3AtPnJvbGUuaW52YWxpZCkKLQkJCWt2bV9tbXVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCk7CisJCWlmICghc3AtPnJvb3RfY291bnQgJiYgc3AtPnJvbGUuaW52YWxpZCkgeworCQkJa3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKHZjcHUtPmt2bSwgc3AsICZpbnZhbGlkX2xpc3QpOworCQkJa3ZtX21tdV9jb21taXRfemFwX3BhZ2UodmNwdS0+a3ZtLCAmaW52YWxpZF9saXN0KTsKKwkJfQogCQl2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSA9IElOVkFMSURfUEFHRTsKIAkJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogCQlyZXR1cm47CkBAIC0yMDMyLDEwICsyMjAwLDEyIEBACiAJCQlzcCA9IHBhZ2VfaGVhZGVyKHJvb3QpOwogCQkJLS1zcC0+cm9vdF9jb3VudDsKIAkJCWlmICghc3AtPnJvb3RfY291bnQgJiYgc3AtPnJvbGUuaW52YWxpZCkKLQkJCQlrdm1fbW11X3phcF9wYWdlKHZjcHUtPmt2bSwgc3ApOworCQkJCWt2bV9tbXVfcHJlcGFyZV96YXBfcGFnZSh2Y3B1LT5rdm0sIHNwLAorCQkJCQkJCSAmaW52YWxpZF9saXN0KTsKIAkJfQogCQl2Y3B1LT5hcmNoLm1tdS5wYWVfcm9vdFtpXSA9IElOVkFMSURfUEFHRTsKIAl9CisJa3ZtX21tdV9jb21taXRfemFwX3BhZ2UodmNwdS0+a3ZtLCAmaW52YWxpZF9saXN0KTsKIAlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAJdmNwdS0+YXJjaC5tbXUucm9vdF9ocGEgPSBJTlZBTElEX1BBR0U7CiB9CkBAIC0yMDQ1LDcgKzIyMTUsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKCFrdm1faXNfdmlzaWJsZV9nZm4odmNwdS0+a3ZtLCByb290X2dmbikpIHsKLQkJc2V0X2JpdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgJnZjcHUtPnJlcXVlc3RzKTsKKwkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgdmNwdSk7CiAJCXJldCA9IDE7CiAJfQogCkBAIC0yMDczLDYgKzIyNDMsNyBAQAogCQkJcm9vdF9nZm4gPSAwOwogCQl9CiAJCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CisJCWt2bV9tbXVfZnJlZV9zb21lX3BhZ2VzKHZjcHUpOwogCQlzcCA9IGt2bV9tbXVfZ2V0X3BhZ2UodmNwdSwgcm9vdF9nZm4sIDAsCiAJCQkJICAgICAgUFQ2NF9ST09UX0xFVkVMLCBkaXJlY3QsCiAJCQkJICAgICAgQUNDX0FMTCwgTlVMTCk7CkBAIC0yMTAzLDYgKzIyNzQsNyBAQAogCQkJcm9vdF9nZm4gPSBpIDw8IDMwOwogCQl9CiAJCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CisJCWt2bV9tbXVfZnJlZV9zb21lX3BhZ2VzKHZjcHUpOwogCQlzcCA9IGt2bV9tbXVfZ2V0X3BhZ2UodmNwdSwgcm9vdF9nZm4sIGkgPDwgMzAsCiAJCQkJICAgICAgUFQzMl9ST09UX0xFVkVMLCBkaXJlY3QsCiAJCQkJICAgICAgQUNDX0FMTCwgTlVMTCk7CkBAIC0yMTk4LDEwICsyMzcwLDggQEAKIAltbXVfc2VxID0gdmNwdS0+a3ZtLT5tbXVfbm90aWZpZXJfc2VxOwogCXNtcF9ybWIoKTsKIAlwZm4gPSBnZm5fdG9fcGZuKHZjcHUtPmt2bSwgZ2ZuKTsKLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpIHsKLQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7Ci0JCXJldHVybiAxOwotCX0KKwlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCisJCXJldHVybiBrdm1faGFuZGxlX2JhZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuLCBwZm4pOwogCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAJaWYgKG1tdV9ub3RpZmllcl9yZXRyeSh2Y3B1LCBtbXVfc2VxKSkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMjI0Myw3ICsyNDEzLDcgQEAKIHZvaWQga3ZtX21tdV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCSsrdmNwdS0+c3RhdC50bGJfZmx1c2g7Ci0Ja3ZtX3g4Nl9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVExCX0ZMVVNILCB2Y3B1KTsKIH0KIAogc3RhdGljIHZvaWQgcGFnaW5nX25ld19jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjQ1NywxMCArMjYyNyw5IEBACiBzdGF0aWMgdm9pZCBkZXN0cm95X2t2bV9tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCUFTU0VSVCh2Y3B1KTsKLQlpZiAoVkFMSURfUEFHRSh2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSkpIHsKKwlpZiAoVkFMSURfUEFHRSh2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSkpCisJCS8qIG1tdS5mcmVlKCkgc2hvdWxkIHNldCByb290X2hwYSA9IElOVkFMSURfUEFHRSAqLwogCQl2Y3B1LT5hcmNoLm1tdS5mcmVlKHZjcHUpOwotCQl2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSA9IElOVkFMSURfUEFHRTsKLQl9CiB9CiAKIGludCBrdm1fbW11X3Jlc2V0X2NvbnRleHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjQ3Nyw5ICsyNjQ2LDYgQEAKIAlyID0gbW11X3RvcHVwX21lbW9yeV9jYWNoZXModmNwdSk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwotCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7Ci0Ja3ZtX21tdV9mcmVlX3NvbWVfcGFnZXModmNwdSk7Ci0Jc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogCXIgPSBtbXVfYWxsb2Nfcm9vdHModmNwdSk7CiAJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAltbXVfc3luY19yb290cyh2Y3B1KTsKQEAgLTI1MDgsNyArMjY3NCw3IEBACiAJcHRlID0gKnNwdGU7CiAJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZShwdGUpKSB7CiAJCWlmIChpc19sYXN0X3NwdGUocHRlLCBzcC0+cm9sZS5sZXZlbCkpCi0JCQlybWFwX3JlbW92ZSh2Y3B1LT5rdm0sIHNwdGUpOworCQkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgc3B0ZSwgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOwogCQllbHNlIHsKIAkJCWNoaWxkID0gcGFnZV9oZWFkZXIocHRlICYgUFQ2NF9CQVNFX0FERFJfTUFTSyk7CiAJCQltbXVfcGFnZV9yZW1vdmVfcGFyZW50X3B0ZShjaGlsZCwgc3B0ZSk7CkBAIC0yNTI5LDYgKzI2OTUsOSBAQAogCQlyZXR1cm47CiAgICAgICAgIH0KIAorCWlmIChpc19yc3ZkX2JpdHNfc2V0KHZjcHUsICoodTY0ICopbmV3LCBQVF9QQUdFX1RBQkxFX0xFVkVMKSkKKwkJcmV0dXJuOworCiAJKyt2Y3B1LT5rdm0tPnN0YXQubW11X3B0ZV91cGRhdGVkOwogCWlmICghc3AtPnJvbGUuY3I0X3BhZSkKIAkJcGFnaW5nMzJfdXBkYXRlX3B0ZSh2Y3B1LCBzcCwgc3B0ZSwgbmV3KTsKQEAgLTI1NDksMTEgKzI3MTgsMTUgQEAKIAlyZXR1cm4gKG9sZCAmIH5uZXcgJiBQVDY0X1BFUk1fTUFTSykgIT0gMDsKIH0KIAotc3RhdGljIHZvaWQgbW11X3B0ZV93cml0ZV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgb2xkLCB1NjQgbmV3KQorc3RhdGljIHZvaWQgbW11X3B0ZV93cml0ZV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIHphcF9wYWdlLAorCQkJCSAgICBib29sIHJlbW90ZV9mbHVzaCwgYm9vbCBsb2NhbF9mbHVzaCkKIHsKLQlpZiAobmVlZF9yZW1vdGVfZmx1c2gob2xkLCBuZXcpKQorCWlmICh6YXBfcGFnZSkKKwkJcmV0dXJuOworCisJaWYgKHJlbW90ZV9mbHVzaCkKIAkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7Ci0JZWxzZQorCWVsc2UgaWYgKGxvY2FsX2ZsdXNoKQogCQlrdm1fbW11X2ZsdXNoX3RsYih2Y3B1KTsKIH0KIApAQCAtMjYwMywxMCArMjc3NiwxMCBAQAogCQkgICAgICAgYm9vbCBndWVzdF9pbml0aWF0ZWQpCiB7CiAJZ2ZuX3QgZ2ZuID0gZ3BhID4+IFBBR0VfU0hJRlQ7CisJdW5pb24ga3ZtX21tdV9wYWdlX3JvbGUgbWFzayA9IHsgLndvcmQgPSAwIH07CiAJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQ7Ci0JdW5zaWduZWQgaW5kZXg7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJTElTVF9IRUFEKGludmFsaWRfbGlzdCk7CiAJdTY0IGVudHJ5LCBnZW50cnk7CiAJdTY0ICpzcHRlOwogCXVuc2lnbmVkIG9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGdwYSk7CkBAIC0yNjE5LDYgKzI3OTIsOSBAQAogCWludCBucHRlOwogCWludCByOwogCWludCBpbnZscGdfY291bnRlcjsKKwlib29sIHJlbW90ZV9mbHVzaCwgbG9jYWxfZmx1c2gsIHphcF9wYWdlOworCisJemFwX3BhZ2UgPSByZW1vdGVfZmx1c2ggPSBsb2NhbF9mbHVzaCA9IGZhbHNlOwogCiAJcGdwcmludGsoIiVzOiBncGEgJWxseCBieXRlcyAlZFxuIiwgX19mdW5jX18sIGdwYSwgYnl0ZXMpOwogCkBAIC0yNjc0LDEzICsyODUwLDkgQEAKIAkJCXZjcHUtPmFyY2gubGFzdF9wdGVfdXBkYXRlZCA9IE5VTEw7CiAJCX0KIAl9Ci0JaW5kZXggPSBrdm1fcGFnZV90YWJsZV9oYXNoZm4oZ2ZuKTsKLQlidWNrZXQgPSAmdmNwdS0+a3ZtLT5hcmNoLm1tdV9wYWdlX2hhc2hbaW5kZXhdOwogCi1yZXN0YXJ0OgotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3AsIG5vZGUsIG4sIGJ1Y2tldCwgaGFzaF9saW5rKSB7Ci0JCWlmIChzcC0+Z2ZuICE9IGdmbiB8fCBzcC0+cm9sZS5kaXJlY3QgfHwgc3AtPnJvbGUuaW52YWxpZCkKLQkJCWNvbnRpbnVlOworCW1hc2suY3IwX3dwID0gbWFzay5jcjRfcGFlID0gbWFzay5ueGUgPSAxOworCWZvcl9lYWNoX2dmbl9pbmRpcmVjdF92YWxpZF9zcCh2Y3B1LT5rdm0sIHNwLCBnZm4sIG5vZGUpIHsKIAkJcHRlX3NpemUgPSBzcC0+cm9sZS5jcjRfcGFlID8gOCA6IDQ7CiAJCW1pc2FsaWduZWQgPSAob2Zmc2V0IF4gKG9mZnNldCArIGJ5dGVzIC0gMSkpICYgfihwdGVfc2l6ZSAtIDEpOwogCQltaXNhbGlnbmVkIHw9IGJ5dGVzIDwgNDsKQEAgLTI2OTcsOCArMjg2OSw4IEBACiAJCQkgKi8KIAkJCXBncHJpbnRrKCJtaXNhbGlnbmVkOiBncGEgJWxseCBieXRlcyAlZCByb2xlICV4XG4iLAogCQkJCSBncGEsIGJ5dGVzLCBzcC0+cm9sZS53b3JkKTsKLQkJCWlmIChrdm1fbW11X3phcF9wYWdlKHZjcHUtPmt2bSwgc3ApKQotCQkJCWdvdG8gcmVzdGFydDsKKwkJCXphcF9wYWdlIHw9ICEha3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKHZjcHUtPmt2bSwgc3AsCisJCQkJCQkgICAgICZpbnZhbGlkX2xpc3QpOwogCQkJKyt2Y3B1LT5rdm0tPnN0YXQubW11X2Zsb29kZWQ7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMjcyMiwxNiArMjg5NCwyMiBAQAogCQkJaWYgKHF1YWRyYW50ICE9IHNwLT5yb2xlLnF1YWRyYW50KQogCQkJCWNvbnRpbnVlOwogCQl9CisJCWxvY2FsX2ZsdXNoID0gdHJ1ZTsKIAkJc3B0ZSA9ICZzcC0+c3B0W3BhZ2Vfb2Zmc2V0IC8gc2l6ZW9mKCpzcHRlKV07CiAJCXdoaWxlIChucHRlLS0pIHsKIAkJCWVudHJ5ID0gKnNwdGU7CiAJCQltbXVfcHRlX3dyaXRlX3phcF9wdGUodmNwdSwgc3AsIHNwdGUpOwotCQkJaWYgKGdlbnRyeSkKKwkJCWlmIChnZW50cnkgJiYKKwkJCSAgICAgICEoKHNwLT5yb2xlLndvcmQgXiB2Y3B1LT5hcmNoLm1tdS5iYXNlX3JvbGUud29yZCkKKwkJCSAgICAgICYgbWFzay53b3JkKSkKIAkJCQltbXVfcHRlX3dyaXRlX25ld19wdGUodmNwdSwgc3AsIHNwdGUsICZnZW50cnkpOwotCQkJbW11X3B0ZV93cml0ZV9mbHVzaF90bGIodmNwdSwgZW50cnksICpzcHRlKTsKKwkJCWlmICghcmVtb3RlX2ZsdXNoICYmIG5lZWRfcmVtb3RlX2ZsdXNoKGVudHJ5LCAqc3B0ZSkpCisJCQkJcmVtb3RlX2ZsdXNoID0gdHJ1ZTsKIAkJCSsrc3B0ZTsKIAkJfQogCX0KKwltbXVfcHRlX3dyaXRlX2ZsdXNoX3RsYih2Y3B1LCB6YXBfcGFnZSwgcmVtb3RlX2ZsdXNoLCBsb2NhbF9mbHVzaCk7CisJa3ZtX21tdV9jb21taXRfemFwX3BhZ2UodmNwdS0+a3ZtLCAmaW52YWxpZF9saXN0KTsKIAlrdm1fbW11X2F1ZGl0KHZjcHUsICJwb3N0IHB0ZSB3cml0ZSIpOwogCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAlpZiAoIWlzX2Vycm9yX3Bmbih2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUucGZuKSkgewpAQCAtMjc1OSwxNSArMjkzNywyMSBAQAogCiB2b2lkIF9fa3ZtX21tdV9mcmVlX3NvbWVfcGFnZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXdoaWxlICh2Y3B1LT5rdm0tPmFyY2gubl9mcmVlX21tdV9wYWdlcyA8IEtWTV9SRUZJTExfUEFHRVMgJiYKKwlpbnQgZnJlZV9wYWdlczsKKwlMSVNUX0hFQUQoaW52YWxpZF9saXN0KTsKKworCWZyZWVfcGFnZXMgPSB2Y3B1LT5rdm0tPmFyY2gubl9mcmVlX21tdV9wYWdlczsKKwl3aGlsZSAoZnJlZV9wYWdlcyA8IEtWTV9SRUZJTExfUEFHRVMgJiYKIAkgICAgICAgIWxpc3RfZW1wdHkoJnZjcHUtPmt2bS0+YXJjaC5hY3RpdmVfbW11X3BhZ2VzKSkgewogCQlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKIAogCQlzcCA9IGNvbnRhaW5lcl9vZih2Y3B1LT5rdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcy5wcmV2LAogCQkJCSAgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7Ci0JCWt2bV9tbXVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCk7CisJCWZyZWVfcGFnZXMgKz0ga3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKHZjcHUtPmt2bSwgc3AsCisJCQkJCQkgICAgICAgJmludmFsaWRfbGlzdCk7CiAJCSsrdmNwdS0+a3ZtLT5zdGF0Lm1tdV9yZWN5Y2xlZDsKIAl9CisJa3ZtX21tdV9jb21taXRfemFwX3BhZ2UodmNwdS0+a3ZtLCAmaW52YWxpZF9saXN0KTsKIH0KIAogaW50IGt2bV9tbXVfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGNyMiwgdTMyIGVycm9yX2NvZGUpCkBAIC0yNzk1LDExICsyOTc5LDggQEAKIAkJcmV0dXJuIDE7CiAJY2FzZSBFTVVMQVRFX0RPX01NSU86CiAJCSsrdmNwdS0+c3RhdC5tbWlvX2V4aXRzOwotCQlyZXR1cm4gMDsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBFTVVMQVRFX0ZBSUw6Ci0JCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKLQkJdmNwdS0+cnVuLT5pbnRlcm5hbC5zdWJlcnJvciA9IEtWTV9JTlRFUk5BTF9FUlJPUl9FTVVMQVRJT047Ci0JCXZjcHUtPnJ1bi0+aW50ZXJuYWwubmRhdGEgPSAwOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKQEAgLTI4OTYsNyArMzA3Nyw3IEBACiAJCXB0ID0gc3AtPnNwdDsKIAkJZm9yIChpID0gMDsgaSA8IFBUNjRfRU5UX1BFUl9QQUdFOyArK2kpCiAJCQkvKiBhdm9pZCBSTVcgKi8KLQkJCWlmIChwdFtpXSAmIFBUX1dSSVRBQkxFX01BU0spCisJCQlpZiAoaXNfd3JpdGFibGVfcHRlKHB0W2ldKSkKIAkJCQlwdFtpXSAmPSB+UFRfV1JJVEFCTEVfTUFTSzsKIAl9CiAJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CkBAIC0yOTA1LDI1ICszMDg2LDI2IEBACiB2b2lkIGt2bV9tbXVfemFwX2FsbChzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsICpub2RlOworCUxJU1RfSEVBRChpbnZhbGlkX2xpc3QpOwogCiAJc3Bpbl9sb2NrKCZrdm0tPm1tdV9sb2NrKTsKIHJlc3RhcnQ6CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwLCBub2RlLCAma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMsIGxpbmspCi0JCWlmIChrdm1fbW11X3phcF9wYWdlKGt2bSwgc3ApKQorCQlpZiAoa3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlKGt2bSwgc3AsICZpbnZhbGlkX2xpc3QpKQogCQkJZ290byByZXN0YXJ0OwogCisJa3ZtX21tdV9jb21taXRfemFwX3BhZ2Uoa3ZtLCAmaW52YWxpZF9saXN0KTsKIAlzcGluX3VubG9jaygma3ZtLT5tbXVfbG9jayk7Ci0KLQlrdm1fZmx1c2hfcmVtb3RlX3RsYnMoa3ZtKTsKIH0KIAotc3RhdGljIGludCBrdm1fbW11X3JlbW92ZV9zb21lX2FsbG9jX21tdV9wYWdlcyhzdHJ1Y3Qga3ZtICprdm0pCitzdGF0aWMgaW50IGt2bV9tbXVfcmVtb3ZlX3NvbWVfYWxsb2NfbW11X3BhZ2VzKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmludmFsaWRfbGlzdCkKIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYWdlOwogCiAJcGFnZSA9IGNvbnRhaW5lcl9vZihrdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcy5wcmV2LAogCQkJICAgIHN0cnVjdCBrdm1fbW11X3BhZ2UsIGxpbmspOwotCXJldHVybiBrdm1fbW11X3phcF9wYWdlKGt2bSwgcGFnZSkgKyAxOworCXJldHVybiBrdm1fbW11X3ByZXBhcmVfemFwX3BhZ2Uoa3ZtLCBwYWdlLCBpbnZhbGlkX2xpc3QpOwogfQogCiBzdGF0aWMgaW50IG1tdV9zaHJpbmsoc3RydWN0IHNocmlua2VyICpzaHJpbmssIGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzaykKQEAgLTI5MzYsNiArMzExOCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGt2bSwgJnZtX2xpc3QsIHZtX2xpc3QpIHsKIAkJaW50IG5wYWdlcywgaWR4LCBmcmVlZF9wYWdlczsKKwkJTElTVF9IRUFEKGludmFsaWRfbGlzdCk7CiAKIAkJaWR4ID0gc3JjdV9yZWFkX2xvY2soJmt2bS0+c3JjdSk7CiAJCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CkBAIC0yOTQzLDEyICszMTI2LDE0IEBACiAJCQkga3ZtLT5hcmNoLm5fZnJlZV9tbXVfcGFnZXM7CiAJCWNhY2hlX2NvdW50ICs9IG5wYWdlczsKIAkJaWYgKCFrdm1fZnJlZWQgJiYgbnJfdG9fc2NhbiA+IDAgJiYgbnBhZ2VzID4gMCkgewotCQkJZnJlZWRfcGFnZXMgPSBrdm1fbW11X3JlbW92ZV9zb21lX2FsbG9jX21tdV9wYWdlcyhrdm0pOworCQkJZnJlZWRfcGFnZXMgPSBrdm1fbW11X3JlbW92ZV9zb21lX2FsbG9jX21tdV9wYWdlcyhrdm0sCisJCQkJCQkJICAmaW52YWxpZF9saXN0KTsKIAkJCWNhY2hlX2NvdW50IC09IGZyZWVkX3BhZ2VzOwogCQkJa3ZtX2ZyZWVkID0ga3ZtOwogCQl9CiAJCW5yX3RvX3NjYW4tLTsKIAorCQlrdm1fbW11X2NvbW1pdF96YXBfcGFnZShrdm0sICZpbnZhbGlkX2xpc3QpOwogCQlzcGluX3VubG9jaygma3ZtLT5tbXVfbG9jayk7CiAJCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+c3JjdSwgaWR4KTsKIAl9CkBAIC0zMDc0LDcgKzMyNTksNyBAQAogCiBzdGF0aWMgaW50IGt2bV9wdl9tbXVfZmx1c2hfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlrdm1fc2V0X2NyMyh2Y3B1LCB2Y3B1LT5hcmNoLmNyMyk7CisJKHZvaWQpa3ZtX3NldF9jcjModmNwdSwgdmNwdS0+YXJjaC5jcjMpOwogCXJldHVybiAxOwogfQogCkBAIC0zMzMxLDkgKzM1MTYsOSBAQAogCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnJldl9zcDsKIAlnZm5fdCBnZm47CiAKLQlpZiAoKnNwdGVwICYgUFRfV1JJVEFCTEVfTUFTSykgeworCWlmIChpc193cml0YWJsZV9wdGUoKnNwdGVwKSkgewogCQlyZXZfc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGVwKSk7Ci0JCWdmbiA9IHJldl9zcC0+Z2Zuc1tzcHRlcCAtIHJldl9zcC0+c3B0XTsKKwkJZ2ZuID0ga3ZtX21tdV9wYWdlX2dldF9nZm4ocmV2X3NwLCBzcHRlcCAtIHJldl9zcC0+c3B0KTsKIAogCQlpZiAoIWdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKSkgewogCQkJaWYgKCFwcmludGtfcmF0ZWxpbWl0KCkpCkBAIC0zMzQ3LDggKzM1MzIsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJcm1hcHAgPSBnZm5fdG9fcm1hcChrdm0sIHJldl9zcC0+Z2Zuc1tzcHRlcCAtIHJldl9zcC0+c3B0XSwKLQkJCQkgICAgcmV2X3NwLT5yb2xlLmxldmVsKTsKKwkJcm1hcHAgPSBnZm5fdG9fcm1hcChrdm0sIGdmbiwgcmV2X3NwLT5yb2xlLmxldmVsKTsKIAkJaWYgKCEqcm1hcHApIHsKIAkJCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJCXJldHVybjsKQEAgLTMzODEsNyArMzU2NSw3IEBACiAKIAkJCWlmICghKGVudCAmIFBUX1BSRVNFTlRfTUFTSykpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIShlbnQgJiBQVF9XUklUQUJMRV9NQVNLKSkKKwkJCWlmICghaXNfd3JpdGFibGVfcHRlKGVudCkpCiAJCQkJY29udGludWU7CiAJCQlpbnNwZWN0X3NwdGVfaGFzX3JtYXAodmNwdS0+a3ZtLCAmcHRbaV0pOwogCQl9CkBAIC0zNDA5LDEzICszNTkzLDEyIEBACiAJCWlmIChzcC0+dW5zeW5jKQogCQkJY29udGludWU7CiAKLQkJZ2ZuID0gdW5hbGlhc19nZm4odmNwdS0+a3ZtLCBzcC0+Z2ZuKTsKLQkJc2xvdCA9IGdmbl90b19tZW1zbG90X3VuYWxpYXNlZCh2Y3B1LT5rdm0sIHNwLT5nZm4pOworCQlzbG90ID0gZ2ZuX3RvX21lbXNsb3QodmNwdS0+a3ZtLCBzcC0+Z2ZuKTsKIAkJcm1hcHAgPSAmc2xvdC0+cm1hcFtnZm4gLSBzbG90LT5iYXNlX2dmbl07CiAKIAkJc3B0ZSA9IHJtYXBfbmV4dCh2Y3B1LT5rdm0sIHJtYXBwLCBOVUxMKTsKIAkJd2hpbGUgKHNwdGUpIHsKLQkJCWlmICgqc3B0ZSAmIFBUX1dSSVRBQkxFX01BU0spCisJCQlpZiAoaXNfd3JpdGFibGVfcHRlKCpzcHRlKSkKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAoJXMpIHNoYWRvdyBwYWdlIGhhcyAiCiAJCQkJIndyaXRhYmxlIG1hcHBpbmdzOiBnZm4gJWx4IHJvbGUgJXhcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIGF1ZGl0X21zZywgc3AtPmdmbiwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9tbXV0cmFjZS5oIGIvYXJjaC94ODYva3ZtL21tdXRyYWNlLmgKaW5kZXggNDJmMDdiMS4uM2FhYjBmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL21tdXRyYWNlLmgKKysrIGIvYXJjaC94ODYva3ZtL21tdXRyYWNlLmgKQEAgLTE5MCw3ICsxOTAsNyBAQAogCVRQX0FSR1Moc3ApCiApOwogCi1ERUZJTkVfRVZFTlQoa3ZtX21tdV9wYWdlX2NsYXNzLCBrdm1fbW11X3phcF9wYWdlLAorREVGSU5FX0VWRU5UKGt2bV9tbXVfcGFnZV9jbGFzcywga3ZtX21tdV9wcmVwYXJlX3phcF9wYWdlLAogCVRQX1BST1RPKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKSwKIAogCVRQX0FSR1Moc3ApCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vcGFnaW5nX3RtcGwuaCBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCmluZGV4IDIzMzFiZGMuLjUxZWY5MDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCisrKyBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCkBAIC03LDYgKzcsNyBAQAogICogTU1VIHN1cHBvcnQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUXVtcmFuZXQsIEluYy4KKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGF0ZXMuCiAgKgogICogQXV0aG9yczoKICAqICAgWWFuaXYgS2FtYXkgIDx5YW5pdkBxdW1yYW5ldC5jb20+CkBAIC0xMTgsMjEgKzExOSwyNSBAQAogewogCXB0X2VsZW1lbnRfdCBwdGU7CiAJZ2ZuX3QgdGFibGVfZ2ZuOwotCXVuc2lnbmVkIGluZGV4LCBwdF9hY2Nlc3MsIHB0ZV9hY2Nlc3M7CisJdW5zaWduZWQgaW5kZXgsIHB0X2FjY2VzcywgdW5pbml0aWFsaXplZF92YXIocHRlX2FjY2Vzcyk7CiAJZ3BhX3QgcHRlX2dwYTsKLQlpbnQgcnN2ZF9mYXVsdCA9IDA7CisJYm9vbCBlcGVybSwgcHJlc2VudCwgcnN2ZF9mYXVsdDsKIAogCXRyYWNlX2t2bV9tbXVfcGFnZXRhYmxlX3dhbGsoYWRkciwgd3JpdGVfZmF1bHQsIHVzZXJfZmF1bHQsCiAJCQkJICAgICBmZXRjaF9mYXVsdCk7CiB3YWxrOgorCXByZXNlbnQgPSB0cnVlOworCWVwZXJtID0gcnN2ZF9mYXVsdCA9IGZhbHNlOwogCXdhbGtlci0+bGV2ZWwgPSB2Y3B1LT5hcmNoLm1tdS5yb290X2xldmVsOwogCXB0ZSA9IHZjcHUtPmFyY2guY3IzOwogI2lmIFBUVFlQRSA9PSA2NAogCWlmICghaXNfbG9uZ19tb2RlKHZjcHUpKSB7CiAJCXB0ZSA9IGt2bV9wZHB0cl9yZWFkKHZjcHUsIChhZGRyID4+IDMwKSAmIDMpOwogCQl0cmFjZV9rdm1fbW11X3BhZ2luZ19lbGVtZW50KHB0ZSwgd2Fsa2VyLT5sZXZlbCk7Ci0JCWlmICghaXNfcHJlc2VudF9ncHRlKHB0ZSkpCi0JCQlnb3RvIG5vdF9wcmVzZW50OworCQlpZiAoIWlzX3ByZXNlbnRfZ3B0ZShwdGUpKSB7CisJCQlwcmVzZW50ID0gZmFsc2U7CisJCQlnb3RvIGVycm9yOworCQl9CiAJCS0td2Fsa2VyLT5sZXZlbDsKIAl9CiAjZW5kaWYKQEAgLTE1MCwzNyArMTU1LDQyIEBACiAJCXdhbGtlci0+dGFibGVfZ2ZuW3dhbGtlci0+bGV2ZWwgLSAxXSA9IHRhYmxlX2dmbjsKIAkJd2Fsa2VyLT5wdGVfZ3BhW3dhbGtlci0+bGV2ZWwgLSAxXSA9IHB0ZV9ncGE7CiAKLQkJaWYgKGt2bV9yZWFkX2d1ZXN0KHZjcHUtPmt2bSwgcHRlX2dwYSwgJnB0ZSwgc2l6ZW9mKHB0ZSkpKQotCQkJZ290byBub3RfcHJlc2VudDsKKwkJaWYgKGt2bV9yZWFkX2d1ZXN0KHZjcHUtPmt2bSwgcHRlX2dwYSwgJnB0ZSwgc2l6ZW9mKHB0ZSkpKSB7CisJCQlwcmVzZW50ID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQogCiAJCXRyYWNlX2t2bV9tbXVfcGFnaW5nX2VsZW1lbnQocHRlLCB3YWxrZXItPmxldmVsKTsKIAotCQlpZiAoIWlzX3ByZXNlbnRfZ3B0ZShwdGUpKQotCQkJZ290byBub3RfcHJlc2VudDsKKwkJaWYgKCFpc19wcmVzZW50X2dwdGUocHRlKSkgeworCQkJcHJlc2VudCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KIAotCQlyc3ZkX2ZhdWx0ID0gaXNfcnN2ZF9iaXRzX3NldCh2Y3B1LCBwdGUsIHdhbGtlci0+bGV2ZWwpOwotCQlpZiAocnN2ZF9mYXVsdCkKLQkJCWdvdG8gYWNjZXNzX2Vycm9yOworCQlpZiAoaXNfcnN2ZF9iaXRzX3NldCh2Y3B1LCBwdGUsIHdhbGtlci0+bGV2ZWwpKSB7CisJCQlyc3ZkX2ZhdWx0ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKHdyaXRlX2ZhdWx0ICYmICFpc193cml0YWJsZV9wdGUocHRlKSkKIAkJCWlmICh1c2VyX2ZhdWx0IHx8IGlzX3dyaXRlX3Byb3RlY3Rpb24odmNwdSkpCi0JCQkJZ290byBhY2Nlc3NfZXJyb3I7CisJCQkJZXBlcm0gPSB0cnVlOwogCiAJCWlmICh1c2VyX2ZhdWx0ICYmICEocHRlICYgUFRfVVNFUl9NQVNLKSkKLQkJCWdvdG8gYWNjZXNzX2Vycm9yOworCQkJZXBlcm0gPSB0cnVlOwogCiAjaWYgUFRUWVBFID09IDY0CiAJCWlmIChmZXRjaF9mYXVsdCAmJiAocHRlICYgUFQ2NF9OWF9NQVNLKSkKLQkJCWdvdG8gYWNjZXNzX2Vycm9yOworCQkJZXBlcm0gPSB0cnVlOwogI2VuZGlmCiAKLQkJaWYgKCEocHRlICYgUFRfQUNDRVNTRURfTUFTSykpIHsKKwkJaWYgKCFlcGVybSAmJiAhcnN2ZF9mYXVsdCAmJiAhKHB0ZSAmIFBUX0FDQ0VTU0VEX01BU0spKSB7CiAJCQl0cmFjZV9rdm1fbW11X3NldF9hY2Nlc3NlZF9iaXQodGFibGVfZ2ZuLCBpbmRleCwKIAkJCQkJCSAgICAgICBzaXplb2YocHRlKSk7Ci0JCQltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCB0YWJsZV9nZm4pOwogCQkJaWYgKEZOQU1FKGNtcHhjaGdfZ3B0ZSkodmNwdS0+a3ZtLCB0YWJsZV9nZm4sCiAJCQkgICAgaW5kZXgsIHB0ZSwgcHRlfFBUX0FDQ0VTU0VEX01BU0spKQogCQkJCWdvdG8gd2FsazsKKwkJCW1hcmtfcGFnZV9kaXJ0eSh2Y3B1LT5rdm0sIHRhYmxlX2dmbik7CiAJCQlwdGUgfD0gUFRfQUNDRVNTRURfTUFTSzsKIAkJfQogCkBAIC0yMTMsMTUgKzIyMywxOCBAQAogCQktLXdhbGtlci0+bGV2ZWw7CiAJfQogCisJaWYgKCFwcmVzZW50IHx8IGVwZXJtIHx8IHJzdmRfZmF1bHQpCisJCWdvdG8gZXJyb3I7CisKIAlpZiAod3JpdGVfZmF1bHQgJiYgIWlzX2RpcnR5X2dwdGUocHRlKSkgewogCQlib29sIHJldDsKIAogCQl0cmFjZV9rdm1fbW11X3NldF9kaXJ0eV9iaXQodGFibGVfZ2ZuLCBpbmRleCwgc2l6ZW9mKHB0ZSkpOwotCQltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCB0YWJsZV9nZm4pOwogCQlyZXQgPSBGTkFNRShjbXB4Y2hnX2dwdGUpKHZjcHUtPmt2bSwgdGFibGVfZ2ZuLCBpbmRleCwgcHRlLAogCQkJICAgIHB0ZXxQVF9ESVJUWV9NQVNLKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gd2FsazsKKwkJbWFya19wYWdlX2RpcnR5KHZjcHUtPmt2bSwgdGFibGVfZ2ZuKTsKIAkJcHRlIHw9IFBUX0RJUlRZX01BU0s7CiAJCXdhbGtlci0+cHRlc1t3YWxrZXItPmxldmVsIC0gMV0gPSBwdGU7CiAJfQpAQCAtMjI5LDIyICsyNDIsMTggQEAKIAl3YWxrZXItPnB0X2FjY2VzcyA9IHB0X2FjY2VzczsKIAl3YWxrZXItPnB0ZV9hY2Nlc3MgPSBwdGVfYWNjZXNzOwogCXBncHJpbnRrKCIlczogcHRlICVsbHggcHRlX2FjY2VzcyAleCBwdF9hY2Nlc3MgJXhcbiIsCi0JCSBfX2Z1bmNfXywgKHU2NClwdGUsIHB0X2FjY2VzcywgcHRlX2FjY2Vzcyk7CisJCSBfX2Z1bmNfXywgKHU2NClwdGUsIHB0ZV9hY2Nlc3MsIHB0X2FjY2Vzcyk7CiAJcmV0dXJuIDE7CiAKLW5vdF9wcmVzZW50OgorZXJyb3I6CiAJd2Fsa2VyLT5lcnJvcl9jb2RlID0gMDsKLQlnb3RvIGVycjsKLQotYWNjZXNzX2Vycm9yOgotCXdhbGtlci0+ZXJyb3JfY29kZSA9IFBGRVJSX1BSRVNFTlRfTUFTSzsKLQotZXJyOgorCWlmIChwcmVzZW50KQorCQl3YWxrZXItPmVycm9yX2NvZGUgfD0gUEZFUlJfUFJFU0VOVF9NQVNLOwogCWlmICh3cml0ZV9mYXVsdCkKIAkJd2Fsa2VyLT5lcnJvcl9jb2RlIHw9IFBGRVJSX1dSSVRFX01BU0s7CiAJaWYgKHVzZXJfZmF1bHQpCiAJCXdhbGtlci0+ZXJyb3JfY29kZSB8PSBQRkVSUl9VU0VSX01BU0s7Ci0JaWYgKGZldGNoX2ZhdWx0KQorCWlmIChmZXRjaF9mYXVsdCAmJiBpc19ueCh2Y3B1KSkKIAkJd2Fsa2VyLT5lcnJvcl9jb2RlIHw9IFBGRVJSX0ZFVENIX01BU0s7CiAJaWYgKHJzdmRfZmF1bHQpCiAJCXdhbGtlci0+ZXJyb3JfY29kZSB8PSBQRkVSUl9SU1ZEX01BU0s7CkBAIC0yNTIsNyArMjYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgRk5BTUUodXBkYXRlX3B0ZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYWdlLAorc3RhdGljIHZvaWQgRk5BTUUodXBkYXRlX3B0ZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKIAkJCSAgICAgIHU2NCAqc3B0ZSwgY29uc3Qgdm9pZCAqcHRlKQogewogCXB0X2VsZW1lbnRfdCBncHRlOwpAQCAtMjYzLDcgKzI3Miw3IEBACiAJZ3B0ZSA9ICooY29uc3QgcHRfZWxlbWVudF90ICopcHRlOwogCWlmICh+Z3B0ZSAmIChQVF9QUkVTRU5UX01BU0sgfCBQVF9BQ0NFU1NFRF9NQVNLKSkgewogCQlpZiAoIWlzX3ByZXNlbnRfZ3B0ZShncHRlKSkgewotCQkJaWYgKHBhZ2UtPnVuc3luYykKKwkJCWlmIChzcC0+dW5zeW5jKQogCQkJCW5ld19zcHRlID0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGU7CiAJCQllbHNlCiAJCQkJbmV3X3NwdGUgPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOwpAQCAtMjcyLDcgKzI4MSw3IEBACiAJCXJldHVybjsKIAl9CiAJcGdwcmludGsoIiVzOiBncHRlICVsbHggc3B0ZSAlcFxuIiwgX19mdW5jX18sICh1NjQpZ3B0ZSwgc3B0ZSk7Ci0JcHRlX2FjY2VzcyA9IHBhZ2UtPnJvbGUuYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIGdwdGUpOworCXB0ZV9hY2Nlc3MgPSBzcC0+cm9sZS5hY2Nlc3MgJiBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgZ3B0ZSk7CiAJaWYgKGdwdGVfdG9fZ2ZuKGdwdGUpICE9IHZjcHUtPmFyY2gudXBkYXRlX3B0ZS5nZm4pCiAJCXJldHVybjsKIAlwZm4gPSB2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUucGZuOwpAQCAtMjg1LDExICsyOTQsMjIgQEAKIAkgKiB3ZSBjYWxsIG1tdV9zZXRfc3B0ZSgpIHdpdGggcmVzZXRfaG9zdF9wcm90ZWN0aW9uID0gdHJ1ZSBiZWFjdXNlIHRoYXQKIAkgKiB2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUucGZuIHdhcyBmZXRjaGVkIGZyb20gZ2V0X3VzZXJfcGFnZXMod3JpdGUgPSAxKS4KIAkgKi8KLQltbXVfc2V0X3NwdGUodmNwdSwgc3B0ZSwgcGFnZS0+cm9sZS5hY2Nlc3MsIHB0ZV9hY2Nlc3MsIDAsIDAsCi0JCSAgICAgZ3B0ZSAmIFBUX0RJUlRZX01BU0ssIE5VTEwsIFBUX1BBR0VfVEFCTEVfTEVWRUwsCisJbW11X3NldF9zcHRlKHZjcHUsIHNwdGUsIHNwLT5yb2xlLmFjY2VzcywgcHRlX2FjY2VzcywgMCwgMCwKKwkJICAgICBpc19kaXJ0eV9ncHRlKGdwdGUpLCBOVUxMLCBQVF9QQUdFX1RBQkxFX0xFVkVMLAogCQkgICAgIGdwdGVfdG9fZ2ZuKGdwdGUpLCBwZm4sIHRydWUsIHRydWUpOwogfQogCitzdGF0aWMgYm9vbCBGTkFNRShncHRlX2NoYW5nZWQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQlzdHJ1Y3QgZ3Vlc3Rfd2Fsa2VyICpndywgaW50IGxldmVsKQoreworCWludCByOworCXB0X2VsZW1lbnRfdCBjdXJyX3B0ZTsKKworCXIgPSBrdm1fcmVhZF9ndWVzdF9hdG9taWModmNwdS0+a3ZtLCBndy0+cHRlX2dwYVtsZXZlbCAtIDFdLAorCQkJCSAgJmN1cnJfcHRlLCBzaXplb2YoY3Vycl9wdGUpKTsKKwlyZXR1cm4gciB8fCBjdXJyX3B0ZSAhPSBndy0+cHRlc1tsZXZlbCAtIDFdOworfQorCiAvKgogICogRmV0Y2ggYSBzaGFkb3cgcHRlIGZvciBhIHNwZWNpZmljIGxldmVsIGluIHRoZSBwYWdpbmcgaGllcmFyY2h5LgogICovCkBAIC0yOTksNzUgKzMxOSw4NiBAQAogCQkJIGludCAqcHR3cml0ZSwgcGZuX3QgcGZuKQogewogCXVuc2lnbmVkIGFjY2VzcyA9IGd3LT5wdF9hY2Nlc3M7Ci0Jc3RydWN0IGt2bV9tbXVfcGFnZSAqc2hhZG93X3BhZ2U7Ci0JdTY0IHNwdGUsICpzcHRlcCA9IE5VTEw7Ci0JaW50IGRpcmVjdDsKLQlnZm5fdCB0YWJsZV9nZm47Ci0JaW50IHI7Ci0JaW50IGxldmVsOwotCXB0X2VsZW1lbnRfdCBjdXJyX3B0ZTsKLQlzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrX2l0ZXJhdG9yIGl0ZXJhdG9yOworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwID0gTlVMTDsKKwlib29sIGRpcnR5ID0gaXNfZGlydHlfZ3B0ZShndy0+cHRlc1tndy0+bGV2ZWwgLSAxXSk7CisJaW50IHRvcF9sZXZlbDsKKwl1bnNpZ25lZCBkaXJlY3RfYWNjZXNzOworCXN0cnVjdCBrdm1fc2hhZG93X3dhbGtfaXRlcmF0b3IgaXQ7CiAKIAlpZiAoIWlzX3ByZXNlbnRfZ3B0ZShndy0+cHRlc1tndy0+bGV2ZWwgLSAxXSkpCiAJCXJldHVybiBOVUxMOwogCi0JZm9yX2VhY2hfc2hhZG93X2VudHJ5KHZjcHUsIGFkZHIsIGl0ZXJhdG9yKSB7Ci0JCWxldmVsID0gaXRlcmF0b3IubGV2ZWw7Ci0JCXNwdGVwID0gaXRlcmF0b3Iuc3B0ZXA7Ci0JCWlmIChpdGVyYXRvci5sZXZlbCA9PSBobGV2ZWwpIHsKLQkJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzcHRlcCwgYWNjZXNzLAotCQkJCSAgICAgZ3ctPnB0ZV9hY2Nlc3MgJiBhY2Nlc3MsCi0JCQkJICAgICB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwKLQkJCQkgICAgIGd3LT5wdGVzW2d3LT5sZXZlbC0xXSAmIFBUX0RJUlRZX01BU0ssCi0JCQkJICAgICBwdHdyaXRlLCBsZXZlbCwKLQkJCQkgICAgIGd3LT5nZm4sIHBmbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7CisJZGlyZWN0X2FjY2VzcyA9IGd3LT5wdF9hY2Nlc3MgJiBndy0+cHRlX2FjY2VzczsKKwlpZiAoIWRpcnR5KQorCQlkaXJlY3RfYWNjZXNzICY9IH5BQ0NfV1JJVEVfTUFTSzsKKworCXRvcF9sZXZlbCA9IHZjcHUtPmFyY2gubW11LnJvb3RfbGV2ZWw7CisJaWYgKHRvcF9sZXZlbCA9PSBQVDMyRV9ST09UX0xFVkVMKQorCQl0b3BfbGV2ZWwgPSBQVDMyX1JPT1RfTEVWRUw7CisJLyoKKwkgKiBWZXJpZnkgdGhhdCB0aGUgdG9wLWxldmVsIGdwdGUgaXMgc3RpbGwgdGhlcmUuICBTaW5jZSB0aGUgcGFnZQorCSAqIGlzIGEgcm9vdCBwYWdlLCBpdCBpcyBlaXRoZXIgd3JpdGUgcHJvdGVjdGVkIChhbmQgY2Fubm90IGJlCisJICogY2hhbmdlZCBmcm9tIG5vdyBvbikgb3IgaXQgaXMgaW52YWxpZCAoaW4gd2hpY2ggY2FzZSwgd2UgZG9uJ3QKKwkgKiByZWFsbHkgY2FyZSBpZiBpdCBjaGFuZ2VzIHVuZGVybmVhdGggdXMgYWZ0ZXIgdGhpcyBwb2ludCkuCisJICovCisJaWYgKEZOQU1FKGdwdGVfY2hhbmdlZCkodmNwdSwgZ3csIHRvcF9sZXZlbCkpCisJCWdvdG8gb3V0X2dwdGVfY2hhbmdlZDsKKworCWZvciAoc2hhZG93X3dhbGtfaW5pdCgmaXQsIHZjcHUsIGFkZHIpOworCSAgICAgc2hhZG93X3dhbGtfb2theSgmaXQpICYmIGl0LmxldmVsID4gZ3ctPmxldmVsOworCSAgICAgc2hhZG93X3dhbGtfbmV4dCgmaXQpKSB7CisJCWdmbl90IHRhYmxlX2dmbjsKKworCQlkcm9wX2xhcmdlX3NwdGUodmNwdSwgaXQuc3B0ZXApOworCisJCXNwID0gTlVMTDsKKwkJaWYgKCFpc19zaGFkb3dfcHJlc2VudF9wdGUoKml0LnNwdGVwKSkgeworCQkJdGFibGVfZ2ZuID0gZ3ctPnRhYmxlX2dmbltpdC5sZXZlbCAtIDJdOworCQkJc3AgPSBrdm1fbW11X2dldF9wYWdlKHZjcHUsIHRhYmxlX2dmbiwgYWRkciwgaXQubGV2ZWwtMSwKKwkJCQkJICAgICAgZmFsc2UsIGFjY2VzcywgaXQuc3B0ZXApOwogCQl9CiAKLQkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApICYmICFpc19sYXJnZV9wdGUoKnNwdGVwKSkKLQkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBWZXJpZnkgdGhhdCB0aGUgZ3B0ZSBpbiB0aGUgcGFnZSB3ZSd2ZSBqdXN0IHdyaXRlCisJCSAqIHByb3RlY3RlZCBpcyBzdGlsbCB0aGVyZS4KKwkJICovCisJCWlmIChGTkFNRShncHRlX2NoYW5nZWQpKHZjcHUsIGd3LCBpdC5sZXZlbCAtIDEpKQorCQkJZ290byBvdXRfZ3B0ZV9jaGFuZ2VkOwogCi0JCWlmIChpc19sYXJnZV9wdGUoKnNwdGVwKSkgewotCQkJcm1hcF9yZW1vdmUodmNwdS0+a3ZtLCBzcHRlcCk7Ci0JCQlfX3NldF9zcHRlKHNwdGVwLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7Ci0JCQlrdm1fZmx1c2hfcmVtb3RlX3RsYnModmNwdS0+a3ZtKTsKLQkJfQotCi0JCWlmIChsZXZlbCA8PSBndy0+bGV2ZWwpIHsKLQkJCWludCBkZWx0YSA9IGxldmVsIC0gZ3ctPmxldmVsICsgMTsKLQkJCWRpcmVjdCA9IDE7Ci0JCQlpZiAoIWlzX2RpcnR5X2dwdGUoZ3ctPnB0ZXNbbGV2ZWwgLSBkZWx0YV0pKQotCQkJCWFjY2VzcyAmPSB+QUNDX1dSSVRFX01BU0s7Ci0JCQl0YWJsZV9nZm4gPSBncHRlX3RvX2dmbihndy0+cHRlc1tsZXZlbCAtIGRlbHRhXSk7Ci0JCQkvKiBhZHZhbmNlIHRhYmxlX2dmbiB3aGVuIGVtdWxhdGluZyAxZ2IgcGFnZXMgd2l0aCA0ayAqLwotCQkJaWYgKGRlbHRhID09IDApCi0JCQkJdGFibGVfZ2ZuICs9IFBUX0lOREVYKGFkZHIsIGxldmVsKTsKLQkJCWFjY2VzcyAmPSBndy0+cHRlX2FjY2VzczsKLQkJfSBlbHNlIHsKLQkJCWRpcmVjdCA9IDA7Ci0JCQl0YWJsZV9nZm4gPSBndy0+dGFibGVfZ2ZuW2xldmVsIC0gMl07Ci0JCX0KLQkJc2hhZG93X3BhZ2UgPSBrdm1fbW11X2dldF9wYWdlKHZjcHUsIHRhYmxlX2dmbiwgYWRkciwgbGV2ZWwtMSwKLQkJCQkJICAgICAgIGRpcmVjdCwgYWNjZXNzLCBzcHRlcCk7Ci0JCWlmICghZGlyZWN0KSB7Ci0JCQlyID0ga3ZtX3JlYWRfZ3Vlc3RfYXRvbWljKHZjcHUtPmt2bSwKLQkJCQkJCSAgZ3ctPnB0ZV9ncGFbbGV2ZWwgLSAyXSwKLQkJCQkJCSAgJmN1cnJfcHRlLCBzaXplb2YoY3Vycl9wdGUpKTsKLQkJCWlmIChyIHx8IGN1cnJfcHRlICE9IGd3LT5wdGVzW2xldmVsIC0gMl0pIHsKLQkJCQlrdm1fbW11X3B1dF9wYWdlKHNoYWRvd19wYWdlLCBzcHRlcCk7Ci0JCQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7Ci0JCQkJc3B0ZXAgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJc3B0ZSA9IF9fcGEoc2hhZG93X3BhZ2UtPnNwdCkKLQkJCXwgUFRfUFJFU0VOVF9NQVNLIHwgUFRfQUNDRVNTRURfTUFTSwotCQkJfCBQVF9XUklUQUJMRV9NQVNLIHwgUFRfVVNFUl9NQVNLOwotCQkqc3B0ZXAgPSBzcHRlOworCQlpZiAoc3ApCisJCQlsaW5rX3NoYWRvd19wYWdlKGl0LnNwdGVwLCBzcCk7CiAJfQogCi0JcmV0dXJuIHNwdGVwOworCWZvciAoOworCSAgICAgc2hhZG93X3dhbGtfb2theSgmaXQpICYmIGl0LmxldmVsID4gaGxldmVsOworCSAgICAgc2hhZG93X3dhbGtfbmV4dCgmaXQpKSB7CisJCWdmbl90IGRpcmVjdF9nZm47CisKKwkJdmFsaWRhdGVfZGlyZWN0X3NwdGUodmNwdSwgaXQuc3B0ZXAsIGRpcmVjdF9hY2Nlc3MpOworCisJCWRyb3BfbGFyZ2Vfc3B0ZSh2Y3B1LCBpdC5zcHRlcCk7CisKKwkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZSgqaXQuc3B0ZXApKQorCQkJY29udGludWU7CisKKwkJZGlyZWN0X2dmbiA9IGd3LT5nZm4gJiB+KEtWTV9QQUdFU19QRVJfSFBBR0UoaXQubGV2ZWwpIC0gMSk7CisKKwkJc3AgPSBrdm1fbW11X2dldF9wYWdlKHZjcHUsIGRpcmVjdF9nZm4sIGFkZHIsIGl0LmxldmVsLTEsCisJCQkJICAgICAgdHJ1ZSwgZGlyZWN0X2FjY2VzcywgaXQuc3B0ZXApOworCQlsaW5rX3NoYWRvd19wYWdlKGl0LnNwdGVwLCBzcCk7CisJfQorCisJbW11X3NldF9zcHRlKHZjcHUsIGl0LnNwdGVwLCBhY2Nlc3MsIGd3LT5wdGVfYWNjZXNzICYgYWNjZXNzLAorCQkgICAgIHVzZXJfZmF1bHQsIHdyaXRlX2ZhdWx0LCBkaXJ0eSwgcHR3cml0ZSwgaXQubGV2ZWwsCisJCSAgICAgZ3ctPmdmbiwgcGZuLCBmYWxzZSwgdHJ1ZSk7CisKKwlyZXR1cm4gaXQuc3B0ZXA7CisKK291dF9ncHRlX2NoYW5nZWQ6CisJaWYgKHNwKQorCQlrdm1fbW11X3B1dF9wYWdlKHNwLCBpdC5zcHRlcCk7CisJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC00MzEsMTEgKzQ2Miw4IEBACiAJcGZuID0gZ2ZuX3RvX3Bmbih2Y3B1LT5rdm0sIHdhbGtlci5nZm4pOwogCiAJLyogbW1pbyAqLwotCWlmIChpc19lcnJvcl9wZm4ocGZuKSkgewotCQlwZ3ByaW50aygiZ2ZuICVseCBpcyBtbWlvXG4iLCB3YWxrZXIuZ2ZuKTsKLQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7Ci0JCXJldHVybiAxOwotCX0KKwlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCisJCXJldHVybiBrdm1faGFuZGxlX2JhZF9wYWdlKHZjcHUtPmt2bSwgd2Fsa2VyLmdmbiwgcGZuKTsKIAogCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAJaWYgKG1tdV9ub3RpZmllcl9yZXRyeSh2Y3B1LCBtbXVfc2VxKSkKQEAgLTQ0Myw2ICs0NzEsNyBAQAogCWt2bV9tbXVfZnJlZV9zb21lX3BhZ2VzKHZjcHUpOwogCXNwdGVwID0gRk5BTUUoZmV0Y2gpKHZjcHUsIGFkZHIsICZ3YWxrZXIsIHVzZXJfZmF1bHQsIHdyaXRlX2ZhdWx0LAogCQkJICAgICBsZXZlbCwgJndyaXRlX3B0LCBwZm4pOworCSh2b2lkKXNwdGVwOwogCXBncHJpbnRrKCIlczogc2hhZG93IHB0ZSAlcCAlbGx4IHB0d3JpdGUgJWRcbiIsIF9fZnVuY19fLAogCQkgc3B0ZXAsICpzcHRlcCwgd3JpdGVfcHQpOwogCkBAIC00NjQsNiArNDkzLDcgQEAKIHN0YXRpYyB2b2lkIEZOQU1FKGludmxwZykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEpCiB7CiAJc3RydWN0IGt2bV9zaGFkb3dfd2Fsa19pdGVyYXRvciBpdGVyYXRvcjsKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKIAlncGFfdCBwdGVfZ3BhID0gLTE7CiAJaW50IGxldmVsOwogCXU2NCAqc3B0ZXA7CkBAIC00NzUsMTAgKzUwNSwxMyBAQAogCQlsZXZlbCA9IGl0ZXJhdG9yLmxldmVsOwogCQlzcHRlcCA9IGl0ZXJhdG9yLnNwdGVwOwogCisJCXNwID0gcGFnZV9oZWFkZXIoX19wYShzcHRlcCkpOwogCQlpZiAoaXNfbGFzdF9zcHRlKCpzcHRlcCwgbGV2ZWwpKSB7Ci0JCQlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZXApKTsKIAkJCWludCBvZmZzZXQsIHNoaWZ0OwogCisJCQlpZiAoIXNwLT51bnN5bmMpCisJCQkJYnJlYWs7CisKIAkJCXNoaWZ0ID0gUEFHRV9TSElGVCAtCiAJCQkJICAoUFRfTEVWRUxfQklUUyAtIFBUNjRfTEVWRUxfQklUUykgKiBsZXZlbDsKIAkJCW9mZnNldCA9IHNwLT5yb2xlLnF1YWRyYW50IDw8IHNoaWZ0OwpAQCAtNDg3LDE2ICs1MjAsMTcgQEAKIAkJCXB0ZV9ncGEgKz0gKHNwdGVwIC0gc3AtPnNwdCkgKiBzaXplb2YocHRfZWxlbWVudF90KTsKIAogCQkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApKSB7Ci0JCQkJcm1hcF9yZW1vdmUodmNwdS0+a3ZtLCBzcHRlcCk7CiAJCQkJaWYgKGlzX2xhcmdlX3B0ZSgqc3B0ZXApKQogCQkJCQktLXZjcHUtPmt2bS0+c3RhdC5scGFnZXM7CisJCQkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgc3B0ZXAsCisJCQkJCSAgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOwogCQkJCW5lZWRfZmx1c2ggPSAxOwotCQkJfQotCQkJX19zZXRfc3B0ZShzcHRlcCwgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOworCQkJfSBlbHNlCisJCQkJX19zZXRfc3B0ZShzcHRlcCwgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApKQorCQlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApIHx8ICFzcC0+dW5zeW5jX2NoaWxkcmVuKQogCQkJYnJlYWs7CiAJfQogCkBAIC01NzAsOSArNjA0LDkgQEAKICAqIFVzaW5nIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZnJvbSBzcC0+Z2ZucyBpcyBzYWZlIGJlY2F1c2U6CiAgKiAtIFRoZSBzcHRlIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc3RydWN0IHBhZ2UsIHNvIHRoZSBwZm4gZm9yIGEgZ2l2ZW4gZ2ZuCiAgKiAgIGNhbid0IGNoYW5nZSB1bmxlc3MgYWxsIHNwdGVzIHBvaW50aW5nIHRvIGl0IGFyZSBudWtlZCBmaXJzdC4KLSAqIC0gQWxpYXMgY2hhbmdlcyB6YXAgdGhlIGVudGlyZSBzaGFkb3cgY2FjaGUuCiAgKi8KLXN0YXRpYyBpbnQgRk5BTUUoc3luY19wYWdlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQorc3RhdGljIGludCBGTkFNRShzeW5jX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsCisJCQkgICAgYm9vbCBjbGVhcl91bnN5bmMpCiB7CiAJaW50IGksIG9mZnNldCwgbnJfcHJlc2VudDsKIAlib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbjsKQEAgLTU4MCw2ICs2MTQsOSBAQAogCiAJb2Zmc2V0ID0gbnJfcHJlc2VudCA9IDA7CiAKKwkvKiBkaXJlY3Qga3ZtX21tdV9wYWdlIGNhbiBub3QgYmUgdW5zeW5jLiAqLworCUJVR19PTihzcC0+cm9sZS5kaXJlY3QpOworCiAJaWYgKFBUVFlQRSA9PSAzMikKIAkJb2Zmc2V0ID0gc3AtPnJvbGUucXVhZHJhbnQgPDwgUFQ2NF9MRVZFTF9CSVRTOwogCkBAIC01ODksNyArNjI2LDcgQEAKIAkJdW5zaWduZWQgcHRlX2FjY2VzczsKIAkJcHRfZWxlbWVudF90IGdwdGU7CiAJCWdwYV90IHB0ZV9ncGE7Ci0JCWdmbl90IGdmbiA9IHNwLT5nZm5zW2ldOworCQlnZm5fdCBnZm47CiAKIAkJaWYgKCFpc19zaGFkb3dfcHJlc2VudF9wdGUoc3AtPnNwdFtpXSkpCiAJCQljb250aW51ZTsKQEAgLTYwMCwxNiArNjM3LDE3IEBACiAJCQkJCSAgc2l6ZW9mKHB0X2VsZW1lbnRfdCkpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKGdwdGVfdG9fZ2ZuKGdwdGUpICE9IGdmbiB8fCAhaXNfcHJlc2VudF9ncHRlKGdwdGUpIHx8Ci0JCSAgICAhKGdwdGUgJiBQVF9BQ0NFU1NFRF9NQVNLKSkgeworCQlnZm4gPSBncHRlX3RvX2dmbihncHRlKTsKKwkJaWYgKGlzX3JzdmRfYml0c19zZXQodmNwdSwgZ3B0ZSwgUFRfUEFHRV9UQUJMRV9MRVZFTCkKKwkJICAgICAgfHwgZ2ZuICE9IHNwLT5nZm5zW2ldIHx8ICFpc19wcmVzZW50X2dwdGUoZ3B0ZSkKKwkJICAgICAgfHwgIShncHRlICYgUFRfQUNDRVNTRURfTUFTSykpIHsKIAkJCXU2NCBub25wcmVzZW50OwogCi0JCQlybWFwX3JlbW92ZSh2Y3B1LT5rdm0sICZzcC0+c3B0W2ldKTsKLQkJCWlmIChpc19wcmVzZW50X2dwdGUoZ3B0ZSkpCisJCQlpZiAoaXNfcHJlc2VudF9ncHRlKGdwdGUpIHx8ICFjbGVhcl91bnN5bmMpCiAJCQkJbm9ucHJlc2VudCA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOwogCQkJZWxzZQogCQkJCW5vbnByZXNlbnQgPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOwotCQkJX19zZXRfc3B0ZSgmc3AtPnNwdFtpXSwgbm9ucHJlc2VudCk7CisJCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCAmc3AtPnNwdFtpXSwgbm9ucHJlc2VudCk7CiAJCQljb250aW51ZTsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vc3ZtLmMgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKaW5kZXggY2U0MzhlMC4uYmM1YjliOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3N2bS5jCisrKyBiL2FyY2gveDg2L2t2bS9zdm0uYwpAQCAtNCw2ICs0LDcgQEAKICAqIEFNRCBTVk0gc3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBRdW1yYW5ldCwgSW5jLgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsYXRlcy4KICAqCiAgKiBBdXRob3JzOgogICogICBZYW5pdiBLYW1heSAgPHlhbml2QHF1bXJhbmV0LmNvbT4KQEAgLTEzMCw3ICsxMzEsNyBAQAogCXUzMiBpbmRleDsgICAvKiBJbmRleCBvZiB0aGUgTVNSICovCiAJYm9vbCBhbHdheXM7IC8qIFRydWUgaWYgaW50ZXJjZXB0IGlzIGFsd2F5cyBvbiAqLwogfSBkaXJlY3RfYWNjZXNzX21zcnNbXSA9IHsKLQl7IC5pbmRleCA9IE1TUl9LNl9TVEFSLAkJCQkuYWx3YXlzID0gdHJ1ZSAgfSwKKwl7IC5pbmRleCA9IE1TUl9TVEFSLAkJCQkuYWx3YXlzID0gdHJ1ZSAgfSwKIAl7IC5pbmRleCA9IE1TUl9JQTMyX1NZU0VOVEVSX0NTLAkJLmFsd2F5cyA9IHRydWUgIH0sCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCXsgLmluZGV4ID0gTVNSX0dTX0JBU0UsCQkJCS5hbHdheXMgPSB0cnVlICB9LApAQCAtMjg1LDExICsyODYsMTEgQEAKIAogc3RhdGljIHZvaWQgc3ZtX3NldF9lZmVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGVmZXIpCiB7CisJdmNwdS0+YXJjaC5lZmVyID0gZWZlcjsKIAlpZiAoIW5wdF9lbmFibGVkICYmICEoZWZlciAmIEVGRVJfTE1BKSkKIAkJZWZlciAmPSB+RUZFUl9MTUU7CiAKIAl0b19zdm0odmNwdSktPnZtY2ItPnNhdmUuZWZlciA9IGVmZXIgfCBFRkVSX1NWTUU7Ci0JdmNwdS0+YXJjaC5lZmVyID0gZWZlcjsKIH0KIAogc3RhdGljIGludCBpc19leHRlcm5hbF9pbnRlcnJ1cHQodTMyIGluZm8pCkBAIC0zODMsOCArMzg0LDcgQEAKIAlpbnQgZXJyOwogCXU2NCB2YWw7CiAKLQkvKiBPbmx5IEZhbTEwaCBpcyBhZmZlY3RlZCAqLwotCWlmIChib290X2NwdV9kYXRhLng4NiAhPSAweDEwKQorCWlmICghY3B1X2hhc19hbWRfZXJyYXR1bShhbWRfZXJyYXR1bV8zODMpKQogCQlyZXR1cm47CiAKIAkvKiBVc2UgX3NhZmUgdmFyaWFudHMgdG8gbm90IGJyZWFrIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiAqLwpAQCAtNjQwLDcgKzY0MCw3IEBACiAKIAlpZiAobmVzdGVkKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImt2bTogTmVzdGVkIFZpcnR1YWxpemF0aW9uIGVuYWJsZWRcbiIpOwotCQlrdm1fZW5hYmxlX2VmZXJfYml0cyhFRkVSX1NWTUUpOworCQlrdm1fZW5hYmxlX2VmZXJfYml0cyhFRkVSX1NWTUUgfCBFRkVSX0xNU0xFKTsKIAl9CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CkBAIC04MDYsNyArODA2LDcgQEAKIAkgKiBzdm1fc2V0X2NyMCgpIHNldHMgUEcgYW5kIFdQIGFuZCBjbGVhcnMgTlcgYW5kIENEIG9uIHNhdmUtPmNyMC4KIAkgKi8KIAlzdm0tPnZjcHUuYXJjaC5jcjAgPSBYODZfQ1IwX05XIHwgWDg2X0NSMF9DRCB8IFg4Nl9DUjBfRVQ7Ci0Ja3ZtX3NldF9jcjAoJnN2bS0+dmNwdSwgc3ZtLT52Y3B1LmFyY2guY3IwKTsKKwkodm9pZClrdm1fc2V0X2NyMCgmc3ZtLT52Y3B1LCBzdm0tPnZjcHUuYXJjaC5jcjApOwogCiAJc2F2ZS0+Y3I0ID0gWDg2X0NSNF9QQUU7CiAJLyogcmR4ID0gPz8gKi8KQEAgLTkwMywxMyArOTAzLDE4IEBACiAJc3ZtLT5hc2lkX2dlbmVyYXRpb24gPSAwOwogCWluaXRfdm1jYihzdm0pOwogCi0JZnhfaW5pdCgmc3ZtLT52Y3B1KTsKKwllcnIgPSBmeF9pbml0KCZzdm0tPnZjcHUpOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9wYWdlNDsKKwogCXN2bS0+dmNwdS5hcmNoLmFwaWNfYmFzZSA9IDB4ZmVlMDAwMDAgfCBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7CiAJaWYgKGt2bV92Y3B1X2lzX2JzcCgmc3ZtLT52Y3B1KSkKIAkJc3ZtLT52Y3B1LmFyY2guYXBpY19iYXNlIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0JTUDsKIAogCXJldHVybiAmc3ZtLT52Y3B1OwogCitmcmVlX3BhZ2U0OgorCV9fZnJlZV9wYWdlKGhzYXZlX3BhZ2UpOwogZnJlZV9wYWdlMzoKIAlfX2ZyZWVfcGFnZXMobmVzdGVkX21zcnBtX3BhZ2VzLCBNU1JQTV9BTExPQ19PUkRFUik7CiBmcmVlX3BhZ2UyOgpAQCAtMTQ4OCw3ICsxNDkzLDcgQEAKIAkJICovCiAJCXByX2VycigiS1ZNOiBHdWVzdCB0cmlnZ2VyZWQgQU1EIEVycmF0dW0gMzgzXG4iKTsKIAotCQlzZXRfYml0KEtWTV9SRVFfVFJJUExFX0ZBVUxULCAmc3ZtLT52Y3B1LnJlcXVlc3RzKTsKKwkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgJnN2bS0+dmNwdSk7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTE1MzUsNyArMTU0MCw3IEBACiAJc3RyaW5nID0gKGlvX2luZm8gJiBTVk1fSU9JT19TVFJfTUFTSykgIT0gMDsKIAlpbiA9IChpb19pbmZvICYgU1ZNX0lPSU9fVFlQRV9NQVNLKSAhPSAwOwogCWlmIChzdHJpbmcgfHwgaW4pCi0JCXJldHVybiAhKGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgMCkgPT0gRU1VTEFURV9ET19NTUlPKTsKKwkJcmV0dXJuIGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgMCkgPT0gRU1VTEFURV9ET05FOwogCiAJcG9ydCA9IGlvX2luZm8gPj4gMTY7CiAJc2l6ZSA9IChpb19pbmZvICYgU1ZNX0lPSU9fU0laRV9NQVNLKSA+PiBTVk1fSU9JT19TSVpFX1NISUZUOwpAQCAtMTk1Nyw3ICsxOTYyLDcgQEAKIAkJc3ZtLT52bWNiLT5zYXZlLmNyMyA9IGhzYXZlLT5zYXZlLmNyMzsKIAkJc3ZtLT52Y3B1LmFyY2guY3IzID0gaHNhdmUtPnNhdmUuY3IzOwogCX0gZWxzZSB7Ci0JCWt2bV9zZXRfY3IzKCZzdm0tPnZjcHUsIGhzYXZlLT5zYXZlLmNyMyk7CisJCSh2b2lkKWt2bV9zZXRfY3IzKCZzdm0tPnZjcHUsIGhzYXZlLT5zYXZlLmNyMyk7CiAJfQogCWt2bV9yZWdpc3Rlcl93cml0ZSgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkFYLCBoc2F2ZS0+c2F2ZS5yYXgpOwogCWt2bV9yZWdpc3Rlcl93cml0ZSgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUlNQLCBoc2F2ZS0+c2F2ZS5yc3ApOwpAQCAtMjA4MCw3ICsyMDg1LDcgQEAKIAkJc3ZtLT52bWNiLT5zYXZlLmNyMyA9IG5lc3RlZF92bWNiLT5zYXZlLmNyMzsKIAkJc3ZtLT52Y3B1LmFyY2guY3IzID0gbmVzdGVkX3ZtY2ItPnNhdmUuY3IzOwogCX0gZWxzZQotCQlrdm1fc2V0X2NyMygmc3ZtLT52Y3B1LCBuZXN0ZWRfdm1jYi0+c2F2ZS5jcjMpOworCQkodm9pZClrdm1fc2V0X2NyMygmc3ZtLT52Y3B1LCBuZXN0ZWRfdm1jYi0+c2F2ZS5jcjMpOwogCiAJLyogR3Vlc3QgcGFnaW5nIG1vZGUgaXMgYWN0aXZlIC0gcmVzZXQgbW11ICovCiAJa3ZtX21tdV9yZXNldF9jb250ZXh0KCZzdm0tPnZjcHUpOwpAQCAtMjM4NiwxNiArMjM5MSwxMiBAQAogCiBzdGF0aWMgaW50IGludmxwZ19pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7Ci0JaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwgMCwgMCwgMCkgIT0gRU1VTEFURV9ET05FKQotCQlwcl91bmltcGwoJnN2bS0+dmNwdSwgIiVzOiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1LCAwLCAwLCAwKSA9PSBFTVVMQVRFX0RPTkU7CiB9CiAKIHN0YXRpYyBpbnQgZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7Ci0JaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwgMCwgMCwgMCkgIT0gRU1VTEFURV9ET05FKQotCQlwcl91bmltcGwoJnN2bS0+dmNwdSwgIiVzOiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1LCAwLCAwLCAwKSA9PSBFTVVMQVRFX0RPTkU7CiB9CiAKIHN0YXRpYyBpbnQgY3I4X3dyaXRlX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKQEAgLTI0MzEsNyArMjQzMiw3IEBACiAJCSpkYXRhID0gdHNjX29mZnNldCArIG5hdGl2ZV9yZWFkX3RzYygpOwogCQlicmVhazsKIAl9Ci0JY2FzZSBNU1JfSzZfU1RBUjoKKwljYXNlIE1TUl9TVEFSOgogCQkqZGF0YSA9IHN2bS0+dm1jYi0+c2F2ZS5zdGFyOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC0yNTU1LDcgKzI1NTYsNyBAQAogCiAJCWJyZWFrOwogCX0KLQljYXNlIE1TUl9LNl9TVEFSOgorCWNhc2UgTVNSX1NUQVI6CiAJCXN2bS0+dm1jYi0+c2F2ZS5zdGFyID0gZGF0YTsKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX1g4Nl82NApAQCAtMjcyNiw2ICsyNzI3LDk5IEBACiAJW1NWTV9FWElUX05QRl0JCQkJPSBwZl9pbnRlcmNlcHRpb24sCiB9OwogCit2b2lkIGR1bXBfdm1jYihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CisJc3RydWN0IHZtY2JfY29udHJvbF9hcmVhICpjb250cm9sID0gJnN2bS0+dm1jYi0+Y29udHJvbDsKKwlzdHJ1Y3Qgdm1jYl9zYXZlX2FyZWEgKnNhdmUgPSAmc3ZtLT52bWNiLT5zYXZlOworCisJcHJfZXJyKCJWTUNCIENvbnRyb2wgQXJlYTpcbiIpOworCXByX2VycigiY3JfcmVhZDogICAgICAgICAgICAlMDR4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfY3JfcmVhZCk7CisJcHJfZXJyKCJjcl93cml0ZTogICAgICAgICAgICUwNHhcbiIsIGNvbnRyb2wtPmludGVyY2VwdF9jcl93cml0ZSk7CisJcHJfZXJyKCJkcl9yZWFkOiAgICAgICAgICAgICUwNHhcbiIsIGNvbnRyb2wtPmludGVyY2VwdF9kcl9yZWFkKTsKKwlwcl9lcnIoImRyX3dyaXRlOiAgICAgICAgICAgJTA0eFxuIiwgY29udHJvbC0+aW50ZXJjZXB0X2RyX3dyaXRlKTsKKwlwcl9lcnIoImV4Y2VwdGlvbnM6ICAgICAgICAgJTA4eFxuIiwgY29udHJvbC0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMpOworCXByX2VycigiaW50ZXJjZXB0czogICAgICAgICAlMDE2bGx4XG4iLCBjb250cm9sLT5pbnRlcmNlcHQpOworCXByX2VycigicGF1c2UgZmlsdGVyIGNvdW50OiAlZFxuIiwgY29udHJvbC0+cGF1c2VfZmlsdGVyX2NvdW50KTsKKwlwcl9lcnIoImlvcG1fYmFzZV9wYTogICAgICAgJTAxNmxseFxuIiwgY29udHJvbC0+aW9wbV9iYXNlX3BhKTsKKwlwcl9lcnIoIm1zcnBtX2Jhc2VfcGE6ICAgICAgJTAxNmxseFxuIiwgY29udHJvbC0+bXNycG1fYmFzZV9wYSk7CisJcHJfZXJyKCJ0c2Nfb2Zmc2V0OiAgICAgICAgICUwMTZsbHhcbiIsIGNvbnRyb2wtPnRzY19vZmZzZXQpOworCXByX2VycigiYXNpZDogICAgICAgICAgICAgICAlZFxuIiwgY29udHJvbC0+YXNpZCk7CisJcHJfZXJyKCJ0bGJfY3RsOiAgICAgICAgICAgICVkXG4iLCBjb250cm9sLT50bGJfY3RsKTsKKwlwcl9lcnIoImludF9jdGw6ICAgICAgICAgICAgJTA4eFxuIiwgY29udHJvbC0+aW50X2N0bCk7CisJcHJfZXJyKCJpbnRfdmVjdG9yOiAgICAgICAgICUwOHhcbiIsIGNvbnRyb2wtPmludF92ZWN0b3IpOworCXByX2VycigiaW50X3N0YXRlOiAgICAgICAgICAlMDh4XG4iLCBjb250cm9sLT5pbnRfc3RhdGUpOworCXByX2VycigiZXhpdF9jb2RlOiAgICAgICAgICAlMDh4XG4iLCBjb250cm9sLT5leGl0X2NvZGUpOworCXByX2VycigiZXhpdF9pbmZvMTogICAgICAgICAlMDE2bGx4XG4iLCBjb250cm9sLT5leGl0X2luZm9fMSk7CisJcHJfZXJyKCJleGl0X2luZm8yOiAgICAgICAgICUwMTZsbHhcbiIsIGNvbnRyb2wtPmV4aXRfaW5mb18yKTsKKwlwcl9lcnIoImV4aXRfaW50X2luZm86ICAgICAgJTA4eFxuIiwgY29udHJvbC0+ZXhpdF9pbnRfaW5mbyk7CisJcHJfZXJyKCJleGl0X2ludF9pbmZvX2VycjogICUwOHhcbiIsIGNvbnRyb2wtPmV4aXRfaW50X2luZm9fZXJyKTsKKwlwcl9lcnIoIm5lc3RlZF9jdGw6ICAgICAgICAgJWxsZFxuIiwgY29udHJvbC0+bmVzdGVkX2N0bCk7CisJcHJfZXJyKCJuZXN0ZWRfY3IzOiAgICAgICAgICUwMTZsbHhcbiIsIGNvbnRyb2wtPm5lc3RlZF9jcjMpOworCXByX2VycigiZXZlbnRfaW5qOiAgICAgICAgICAlMDh4XG4iLCBjb250cm9sLT5ldmVudF9pbmopOworCXByX2VycigiZXZlbnRfaW5qX2VycjogICAgICAlMDh4XG4iLCBjb250cm9sLT5ldmVudF9pbmpfZXJyKTsKKwlwcl9lcnIoImxicl9jdGw6ICAgICAgICAgICAgJWxsZFxuIiwgY29udHJvbC0+bGJyX2N0bCk7CisJcHJfZXJyKCJuZXh0X3JpcDogICAgICAgICAgICUwMTZsbHhcbiIsIGNvbnRyb2wtPm5leHRfcmlwKTsKKwlwcl9lcnIoIlZNQ0IgU3RhdGUgU2F2ZSBBcmVhOlxuIik7CisJcHJfZXJyKCJlczogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5lcy5zZWxlY3Rvciwgc2F2ZS0+ZXMuYXR0cmliLAorCQlzYXZlLT5lcy5saW1pdCwgc2F2ZS0+ZXMuYmFzZSk7CisJcHJfZXJyKCJjczogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5jcy5zZWxlY3Rvciwgc2F2ZS0+Y3MuYXR0cmliLAorCQlzYXZlLT5jcy5saW1pdCwgc2F2ZS0+Y3MuYmFzZSk7CisJcHJfZXJyKCJzczogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5zcy5zZWxlY3Rvciwgc2F2ZS0+c3MuYXR0cmliLAorCQlzYXZlLT5zcy5saW1pdCwgc2F2ZS0+c3MuYmFzZSk7CisJcHJfZXJyKCJkczogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5kcy5zZWxlY3Rvciwgc2F2ZS0+ZHMuYXR0cmliLAorCQlzYXZlLT5kcy5saW1pdCwgc2F2ZS0+ZHMuYmFzZSk7CisJcHJfZXJyKCJmczogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5mcy5zZWxlY3Rvciwgc2F2ZS0+ZnMuYXR0cmliLAorCQlzYXZlLT5mcy5saW1pdCwgc2F2ZS0+ZnMuYmFzZSk7CisJcHJfZXJyKCJnczogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5ncy5zZWxlY3Rvciwgc2F2ZS0+Z3MuYXR0cmliLAorCQlzYXZlLT5ncy5saW1pdCwgc2F2ZS0+Z3MuYmFzZSk7CisJcHJfZXJyKCJnZHRyOiBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT5nZHRyLnNlbGVjdG9yLCBzYXZlLT5nZHRyLmF0dHJpYiwKKwkJc2F2ZS0+Z2R0ci5saW1pdCwgc2F2ZS0+Z2R0ci5iYXNlKTsKKwlwcl9lcnIoImxkdHI6IHM6ICUwNHggYTogJTA0eCBsOiAlMDh4IGI6ICUwMTZsbHhcbiIsCisJCXNhdmUtPmxkdHIuc2VsZWN0b3IsIHNhdmUtPmxkdHIuYXR0cmliLAorCQlzYXZlLT5sZHRyLmxpbWl0LCBzYXZlLT5sZHRyLmJhc2UpOworCXByX2VycigiaWR0cjogczogJTA0eCBhOiAlMDR4IGw6ICUwOHggYjogJTAxNmxseFxuIiwKKwkJc2F2ZS0+aWR0ci5zZWxlY3Rvciwgc2F2ZS0+aWR0ci5hdHRyaWIsCisJCXNhdmUtPmlkdHIubGltaXQsIHNhdmUtPmlkdHIuYmFzZSk7CisJcHJfZXJyKCJ0cjogICBzOiAlMDR4IGE6ICUwNHggbDogJTA4eCBiOiAlMDE2bGx4XG4iLAorCQlzYXZlLT50ci5zZWxlY3Rvciwgc2F2ZS0+dHIuYXR0cmliLAorCQlzYXZlLT50ci5saW1pdCwgc2F2ZS0+dHIuYmFzZSk7CisJcHJfZXJyKCJjcGw6ICAgICAgICAgICAgJWQgICAgICAgICAgICAgICAgZWZlcjogICAgICAgICAlMDE2bGx4XG4iLAorCQlzYXZlLT5jcGwsIHNhdmUtPmVmZXIpOworCXByX2VycigiY3IwOiAgICAgICAgICAgICUwMTZsbHggY3IyOiAgICAgICAgICAlMDE2bGx4XG4iLAorCQlzYXZlLT5jcjAsIHNhdmUtPmNyMik7CisJcHJfZXJyKCJjcjM6ICAgICAgICAgICAgJTAxNmxseCBjcjQ6ICAgICAgICAgICUwMTZsbHhcbiIsCisJCXNhdmUtPmNyMywgc2F2ZS0+Y3I0KTsKKwlwcl9lcnIoImRyNjogICAgICAgICAgICAlMDE2bGx4IGRyNzogICAgICAgICAgJTAxNmxseFxuIiwKKwkJc2F2ZS0+ZHI2LCBzYXZlLT5kcjcpOworCXByX2VycigicmlwOiAgICAgICAgICAgICUwMTZsbHggcmZsYWdzOiAgICAgICAlMDE2bGx4XG4iLAorCQlzYXZlLT5yaXAsIHNhdmUtPnJmbGFncyk7CisJcHJfZXJyKCJyc3A6ICAgICAgICAgICAgJTAxNmxseCByYXg6ICAgICAgICAgICUwMTZsbHhcbiIsCisJCXNhdmUtPnJzcCwgc2F2ZS0+cmF4KTsKKwlwcl9lcnIoInN0YXI6ICAgICAgICAgICAlMDE2bGx4IGxzdGFyOiAgICAgICAgJTAxNmxseFxuIiwKKwkJc2F2ZS0+c3Rhciwgc2F2ZS0+bHN0YXIpOworCXByX2VycigiY3N0YXI6ICAgICAgICAgICUwMTZsbHggc2ZtYXNrOiAgICAgICAlMDE2bGx4XG4iLAorCQlzYXZlLT5jc3Rhciwgc2F2ZS0+c2ZtYXNrKTsKKwlwcl9lcnIoImtlcm5lbF9nc19iYXNlOiAlMDE2bGx4IHN5c2VudGVyX2NzOiAgJTAxNmxseFxuIiwKKwkJc2F2ZS0+a2VybmVsX2dzX2Jhc2UsIHNhdmUtPnN5c2VudGVyX2NzKTsKKwlwcl9lcnIoInN5c2VudGVyX2VzcDogICAlMDE2bGx4IHN5c2VudGVyX2VpcDogJTAxNmxseFxuIiwKKwkJc2F2ZS0+c3lzZW50ZXJfZXNwLCBzYXZlLT5zeXNlbnRlcl9laXApOworCXByX2VycigiZ3BhdDogICAgICAgICAgICUwMTZsbHggZGJnY3RsOiAgICAgICAlMDE2bGx4XG4iLAorCQlzYXZlLT5nX3BhdCwgc2F2ZS0+ZGJnY3RsKTsKKwlwcl9lcnIoImJyX2Zyb206ICAgICAgICAlMDE2bGx4IGJyX3RvOiAgICAgICAgJTAxNmxseFxuIiwKKwkJc2F2ZS0+YnJfZnJvbSwgc2F2ZS0+YnJfdG8pOworCXByX2VycigiZXhjcF9mcm9tOiAgICAgICUwMTZsbHggZXhjcF90bzogICAgICAlMDE2bGx4XG4iLAorCQlzYXZlLT5sYXN0X2V4Y3BfZnJvbSwgc2F2ZS0+bGFzdF9leGNwX3RvKTsKKworfQorCiBzdGF0aWMgaW50IGhhbmRsZV9leGl0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKQEAgLTI3NzAsNiArMjg2NCw4IEBACiAJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfRkFJTF9FTlRSWTsKIAkJa3ZtX3J1bi0+ZmFpbF9lbnRyeS5oYXJkd2FyZV9lbnRyeV9mYWlsdXJlX3JlYXNvbgogCQkJPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlOworCQlwcl9lcnIoIktWTTogRkFJTEVEIFZNUlVOIFdJVEggVk1DQjpcbiIpOworCQlkdW1wX3ZtY2IodmNwdSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjgyNiw5ICsyOTIyLDYgQEAKIHsKIAlzdHJ1Y3Qgdm1jYl9jb250cm9sX2FyZWEgKmNvbnRyb2w7CiAKLQl0cmFjZV9rdm1faW5qX3ZpcnEoaXJxKTsKLQotCSsrc3ZtLT52Y3B1LnN0YXQuaXJxX2luamVjdGlvbnM7CiAJY29udHJvbCA9ICZzdm0tPnZtY2ItPmNvbnRyb2w7CiAJY29udHJvbC0+aW50X3ZlY3RvciA9IGlycTsKIAljb250cm9sLT5pbnRfY3RsICY9IH5WX0lOVFJfUFJJT19NQVNLOwpAQCAtMjg0Miw2ICsyOTM1LDkgQEAKIAogCUJVR19PTighKGdpZl9zZXQoc3ZtKSkpOwogCisJdHJhY2Vfa3ZtX2lual92aXJxKHZjcHUtPmFyY2guaW50ZXJydXB0Lm5yKTsKKwkrK3ZjcHUtPnN0YXQuaXJxX2luamVjdGlvbnM7CisKIAlzdm0tPnZtY2ItPmNvbnRyb2wuZXZlbnRfaW5qID0gdmNwdS0+YXJjaC5pbnRlcnJ1cHQubnIgfAogCQlTVk1fRVZUSU5KX1ZBTElEIHwgU1ZNX0VWVElOSl9UWVBFX0lOVFI7CiB9CkBAIC0zMzI3LDYgKzM0MjMsMTEgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sIHN2bV9oYXNfd2JpbnZkX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIHZvaWQgc3ZtX2ZwdV9kZWFjdGl2YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKQEAgLTM0MTEsNiArMzUxMiw4IEBACiAJLnJkdHNjcF9zdXBwb3J0ZWQgPSBzdm1fcmR0c2NwX3N1cHBvcnRlZCwKIAogCS5zZXRfc3VwcG9ydGVkX2NwdWlkID0gc3ZtX3NldF9zdXBwb3J0ZWRfY3B1aWQsCisKKwkuaGFzX3diaW52ZF9leGl0ID0gc3ZtX2hhc193YmludmRfZXhpdCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHN2bV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdGltZXIuYyBiL2FyY2gveDg2L2t2bS90aW1lci5jCmluZGV4IDRkZGFkYjEuLmUxNmEwZGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS90aW1lci5jCisrKyBiL2FyY2gveDg2L2t2bS90aW1lci5jCkBAIC0xLDMgKzEsMTcgQEAKKy8qCisgKiBLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBUaGlzIG1vZHVsZSBlbmFibGVzIG1hY2hpbmVzIHdpdGggSW50ZWwgVlQteCBleHRlbnNpb25zIHRvIHJ1biB2aXJ0dWFsCisgKiBtYWNoaW5lcyB3aXRob3V0IGVtdWxhdGlvbiBvciBiaW5hcnkgdHJhbnNsYXRpb24uCisgKgorICogdGltZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGF0ZXMuCisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KQEAgLTE4LDcgKzMyLDcgQEAKIAlpZiAoa3RpbWVyLT5yZWluamVjdCB8fCAhYXRvbWljX3JlYWQoJmt0aW1lci0+cGVuZGluZykpIHsKIAkJYXRvbWljX2luYygma3RpbWVyLT5wZW5kaW5nKTsKIAkJLyogRklYTUU6IHRoaXMgY29kZSBzaG91bGQgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgdmNwdXMgKi8KLQkJc2V0X2JpdChLVk1fUkVRX1BFTkRJTkdfVElNRVIsICZ2Y3B1LT5yZXF1ZXN0cyk7CisJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9QRU5ESU5HX1RJTUVSLCB2Y3B1KTsKIAl9CiAKIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZShxKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS92bXguYyBiL2FyY2gveDg2L2t2bS92bXguYwppbmRleCBlZTAzNjc5Li40OWIyNWVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vdm14LmMKKysrIGIvYXJjaC94ODYva3ZtL3ZteC5jCkBAIC01LDYgKzUsNyBAQAogICogbWFjaGluZXMgd2l0aG91dCBlbXVsYXRpb24gb3IgYmluYXJ5IHRyYW5zbGF0aW9uLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBRdW1yYW5ldCwgSW5jLgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsYXRlcy4KICAqCiAgKiBBdXRob3JzOgogICogICBBdmkgS2l2aXR5ICAgPGF2aUBxdW1yYW5ldC5jb20+CkBAIC0zNiw2ICszNyw4IEBACiAjaW5jbHVkZSA8YXNtL3ZteC5oPgogI2luY2x1ZGUgPGFzbS92aXJ0ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL21jZS5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL3hjci5oPgogCiAjaW5jbHVkZSAidHJhY2UuaCIKIApAQCAtNjMsNiArNjYsOSBAQAogc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGVtdWxhdGVfaW52YWxpZF9ndWVzdF9zdGF0ZSA9IDA7CiBtb2R1bGVfcGFyYW0oZW11bGF0ZV9pbnZhbGlkX2d1ZXN0X3N0YXRlLCBib29sLCBTX0lSVUdPKTsKIAorc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IHZtbV9leGNsdXNpdmUgPSAxOworbW9kdWxlX3BhcmFtKHZtbV9leGNsdXNpdmUsIGJvb2wsIFNfSVJVR08pOworCiAjZGVmaW5lIEtWTV9HVUVTVF9DUjBfTUFTS19VTlJFU1RSSUNURURfR1VFU1QJCQkJXAogCShYODZfQ1IwX1dQIHwgWDg2X0NSMF9ORSB8IFg4Nl9DUjBfTlcgfCBYODZfQ1IwX0NEKQogI2RlZmluZSBLVk1fR1VFU1RfQ1IwX01BU0sJCQkJCQlcCkBAIC0xNzMsMTAgKzE3OSwxMyBAQAogCiBzdGF0aWMgaW50IGluaXRfcm1vZGUoc3RydWN0IGt2bSAqa3ZtKTsKIHN0YXRpYyB1NjQgY29uc3RydWN0X2VwdHAodW5zaWduZWQgbG9uZyByb290X2hwYSk7CitzdGF0aWMgdm9pZCBrdm1fY3B1X3ZteG9uKHU2NCBhZGRyKTsKK3N0YXRpYyB2b2lkIGt2bV9jcHVfdm14b2ZmKHZvaWQpOwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZtY3MgKiwgdm14YXJlYSk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZtY3MgKiwgY3VycmVudF92bWNzKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbGlzdF9oZWFkLCB2Y3B1c19vbl9jcHUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBkZXNjX3B0ciwgaG9zdF9nZHQpOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X2lvX2JpdG1hcF9hOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9pb19iaXRtYXBfYjsKQEAgLTIzMSwxNCArMjQwLDE0IEBACiBzdGF0aWMgdm9pZCBlcHRfc2F2ZV9wZHB0cnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogLyoKLSAqIEtlZXAgTVNSX0s2X1NUQVIgYXQgdGhlIGVuZCwgYXMgc2V0dXBfbXNycygpIHdpbGwgdHJ5IHRvIG9wdGltaXplIGl0CisgKiBLZWVwIE1TUl9TVEFSIGF0IHRoZSBlbmQsIGFzIHNldHVwX21zcnMoKSB3aWxsIHRyeSB0byBvcHRpbWl6ZSBpdAogICogYXdheSBieSBkZWNyZW1lbnRpbmcgdGhlIGFycmF5IHNpemUuCiAgKi8KIHN0YXRpYyBjb25zdCB1MzIgdm14X21zcl9pbmRleFtdID0gewogI2lmZGVmIENPTkZJR19YODZfNjQKIAlNU1JfU1lTQ0FMTF9NQVNLLCBNU1JfTFNUQVIsIE1TUl9DU1RBUiwKICNlbmRpZgotCU1TUl9FRkVSLCBNU1JfVFNDX0FVWCwgTVNSX0s2X1NUQVIsCisJTVNSX0VGRVIsIE1TUl9UU0NfQVVYLCBNU1JfU1RBUiwKIH07CiAjZGVmaW5lIE5SX1ZNWF9NU1IgQVJSQVlfU0laRSh2bXhfbXNyX2luZGV4KQogCkBAIC0zMzQsNiArMzQzLDExIEBACiAJcmV0dXJuIHZteF9jYXBhYmlsaXR5LmVwdCAmIFZNWF9FUFRfMUdCX1BBR0VfQklUOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgY3B1X2hhc192bXhfZXB0XzRsZXZlbHModm9pZCkKK3sKKwlyZXR1cm4gdm14X2NhcGFiaWxpdHkuZXB0ICYgVk1YX0VQVF9QQUdFX1dBTEtfNF9CSVQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaGFzX3ZteF9pbnZlcHRfaW5kaXZpZHVhbF9hZGRyKHZvaWQpCiB7CiAJcmV0dXJuIHZteF9jYXBhYmlsaXR5LmVwdCAmIFZNWF9FUFRfRVhURU5UX0lORElWSURVQUxfQklUOwpAQCAtMzQ5LDYgKzM2MywxNiBAQAogCXJldHVybiB2bXhfY2FwYWJpbGl0eS5lcHQgJiBWTVhfRVBUX0VYVEVOVF9HTE9CQUxfQklUOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgY3B1X2hhc192bXhfaW52dnBpZF9zaW5nbGUodm9pZCkKK3sKKwlyZXR1cm4gdm14X2NhcGFiaWxpdHkudnBpZCAmIFZNWF9WUElEX0VYVEVOVF9TSU5HTEVfQ09OVEVYVF9CSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaGFzX3ZteF9pbnZ2cGlkX2dsb2JhbCh2b2lkKQoreworCXJldHVybiB2bXhfY2FwYWJpbGl0eS52cGlkICYgVk1YX1ZQSURfRVhURU5UX0dMT0JBTF9DT05URVhUX0JJVDsKK30KKwogc3RhdGljIGlubGluZSBib29sIGNwdV9oYXNfdm14X2VwdCh2b2lkKQogewogCXJldHVybiB2bWNzX2NvbmZpZy5jcHVfYmFzZWRfMm5kX2V4ZWNfY3RybCAmCkBAIC0zODksNiArNDEzLDEyIEBACiAJcmV0dXJuIHZtY3NfY29uZmlnLnBpbl9iYXNlZF9leGVjX2N0cmwgJiBQSU5fQkFTRURfVklSVFVBTF9OTUlTOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgY3B1X2hhc192bXhfd2JpbnZkX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gdm1jc19jb25maWcuY3B1X2Jhc2VkXzJuZF9leGVjX2N0cmwgJgorCQlTRUNPTkRBUllfRVhFQ19XQklOVkRfRVhJVElORzsKK30KKwogc3RhdGljIGlubGluZSBib29sIHJlcG9ydF9mbGV4cHJpb3JpdHkodm9pZCkKIHsKIAlyZXR1cm4gZmxleHByaW9yaXR5X2VuYWJsZWQ7CkBAIC00NTMsNiArNDgzLDE5IEBACiAJCSAgICAgICB2bWNzLCBwaHlzX2FkZHIpOwogfQogCitzdGF0aWMgdm9pZCB2bWNzX2xvYWQoc3RydWN0IHZtY3MgKnZtY3MpCit7CisJdTY0IHBoeXNfYWRkciA9IF9fcGEodm1jcyk7CisJdTggZXJyb3I7CisKKwlhc20gdm9sYXRpbGUgKF9fZXgoQVNNX1ZNWF9WTVBUUkxEX1JBWCkgIjsgc2V0bmEgJTAiCisJCQk6ICI9ZyIoZXJyb3IpIDogImEiKCZwaHlzX2FkZHIpLCAibSIocGh5c19hZGRyKQorCQkJOiAiY2MiLCAibWVtb3J5Iik7CisJaWYgKGVycm9yKQorCQlwcmludGsoS0VSTl9FUlIgImt2bTogdm1wdHJsZCAlcC8lbGx4IGZhaWxcbiIsCisJCSAgICAgICB2bWNzLCBwaHlzX2FkZHIpOworfQorCiBzdGF0aWMgdm9pZCBfX3ZjcHVfY2xlYXIodm9pZCAqYXJnKQogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gYXJnOwpAQCAtNDc1LDEyICs1MTgsMjcgQEAKIAlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUodm14LT52Y3B1LmNwdSwgX192Y3B1X2NsZWFyLCB2bXgsIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdnBpZF9zeW5jX3ZjcHVfYWxsKHN0cnVjdCB2Y3B1X3ZteCAqdm14KQorc3RhdGljIGlubGluZSB2b2lkIHZwaWRfc3luY192Y3B1X3NpbmdsZShzdHJ1Y3QgdmNwdV92bXggKnZteCkKIHsKIAlpZiAodm14LT52cGlkID09IDApCiAJCXJldHVybjsKIAotCV9faW52dnBpZChWTVhfVlBJRF9FWFRFTlRfU0lOR0xFX0NPTlRFWFQsIHZteC0+dnBpZCwgMCk7CisJaWYgKGNwdV9oYXNfdm14X2ludnZwaWRfc2luZ2xlKCkpCisJCV9faW52dnBpZChWTVhfVlBJRF9FWFRFTlRfU0lOR0xFX0NPTlRFWFQsIHZteC0+dnBpZCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cGlkX3N5bmNfdmNwdV9nbG9iYWwodm9pZCkKK3sKKwlpZiAoY3B1X2hhc192bXhfaW52dnBpZF9nbG9iYWwoKSkKKwkJX19pbnZ2cGlkKFZNWF9WUElEX0VYVEVOVF9BTExfQ09OVEVYVCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cGlkX3N5bmNfY29udGV4dChzdHJ1Y3QgdmNwdV92bXggKnZteCkKK3sKKwlpZiAoY3B1X2hhc192bXhfaW52dnBpZF9zaW5nbGUoKSkKKwkJdnBpZF9zeW5jX3ZjcHVfc2luZ2xlKHZteCk7CisJZWxzZQorCQl2cGlkX3N5bmNfdmNwdV9nbG9iYWwoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGVwdF9zeW5jX2dsb2JhbCh2b2lkKQpAQCAtODEyLDYgKzg3MCw5IEBACiAJCXdybXNybChNU1JfS0VSTkVMX0dTX0JBU0UsIHZteC0+bXNyX2hvc3Rfa2VybmVsX2dzX2Jhc2UpOwogCX0KICNlbmRpZgorCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX1VTRURGUFUpCisJCWNsdHMoKTsKKwlsb2FkX2dkdCgmX19nZXRfY3B1X3Zhcihob3N0X2dkdCkpOwogfQogCiBzdGF0aWMgdm9pZCB2bXhfbG9hZF9ob3N0X3N0YXRlKHN0cnVjdCB2Y3B1X3ZteCAqdm14KQpAQCAtODI4LDM1ICs4ODksMzAgQEAKIHN0YXRpYyB2b2lkIHZteF92Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOwotCXU2NCBwaHlzX2FkZHIgPSBfX3BhKHZteC0+dm1jcyk7CiAJdTY0IHRzY190aGlzLCBkZWx0YSwgbmV3X29mZnNldDsKKwl1NjQgcGh5c19hZGRyID0gX19wYShwZXJfY3B1KHZteGFyZWEsIGNwdSkpOwogCi0JaWYgKHZjcHUtPmNwdSAhPSBjcHUpIHsKKwlpZiAoIXZtbV9leGNsdXNpdmUpCisJCWt2bV9jcHVfdm14b24ocGh5c19hZGRyKTsKKwllbHNlIGlmICh2Y3B1LT5jcHUgIT0gY3B1KQogCQl2Y3B1X2NsZWFyKHZteCk7Ci0JCWt2bV9taWdyYXRlX3RpbWVycyh2Y3B1KTsKLQkJc2V0X2JpdChLVk1fUkVRX1RMQl9GTFVTSCwgJnZjcHUtPnJlcXVlc3RzKTsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbGlzdF9hZGQoJnZteC0+bG9jYWxfdmNwdXNfbGluaywKLQkJCSAmcGVyX2NwdSh2Y3B1c19vbl9jcHUsIGNwdSkpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQogCiAJaWYgKHBlcl9jcHUoY3VycmVudF92bWNzLCBjcHUpICE9IHZteC0+dm1jcykgewotCQl1OCBlcnJvcjsKLQogCQlwZXJfY3B1KGN1cnJlbnRfdm1jcywgY3B1KSA9IHZteC0+dm1jczsKLQkJYXNtIHZvbGF0aWxlIChfX2V4KEFTTV9WTVhfVk1QVFJMRF9SQVgpICI7IHNldG5hICUwIgotCQkJICAgICAgOiAiPWciKGVycm9yKSA6ICJhIigmcGh5c19hZGRyKSwgIm0iKHBoeXNfYWRkcikKLQkJCSAgICAgIDogImNjIik7Ci0JCWlmIChlcnJvcikKLQkJCXByaW50ayhLRVJOX0VSUiAia3ZtOiB2bXB0cmxkICVwLyVsbHggZmFpbFxuIiwKLQkJCSAgICAgICB2bXgtPnZtY3MsIHBoeXNfYWRkcik7CisJCXZtY3NfbG9hZCh2bXgtPnZtY3MpOwogCX0KIAogCWlmICh2Y3B1LT5jcHUgIT0gY3B1KSB7CiAJCXN0cnVjdCBkZXNjX3B0ciBkdDsKIAkJdW5zaWduZWQgbG9uZyBzeXNlbnRlcl9lc3A7CiAKKwkJa3ZtX21pZ3JhdGVfdGltZXJzKHZjcHUpOworCQlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVExCX0ZMVVNILCB2Y3B1KTsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJbGlzdF9hZGQoJnZteC0+bG9jYWxfdmNwdXNfbGluaywKKwkJCSAmcGVyX2NwdSh2Y3B1c19vbl9jcHUsIGNwdSkpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKIAkJdmNwdS0+Y3B1ID0gY3B1OwogCQkvKgogCQkgKiBMaW51eCB1c2VzIHBlci1jcHUgVFNTIGFuZCBHRFQsIHNvIHNldCB0aGVzZSB3aGVuIHN3aXRjaGluZwpAQCAtODg0LDYgKzk0MCwxMCBAQAogc3RhdGljIHZvaWQgdm14X3ZjcHVfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlfX3ZteF9sb2FkX2hvc3Rfc3RhdGUodG9fdm14KHZjcHUpKTsKKwlpZiAoIXZtbV9leGNsdXNpdmUpIHsKKwkJX192Y3B1X2NsZWFyKHRvX3ZteCh2Y3B1KSk7CisJCWt2bV9jcHVfdm14b2ZmKCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB2bXhfZnB1X2FjdGl2YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTEwNTcsMTAgKzExMTcsMTAgQEAKIAkJaWYgKGluZGV4ID49IDAgJiYgdm14LT5yZHRzY3BfZW5hYmxlZCkKIAkJCW1vdmVfbXNyX3VwKHZteCwgaW5kZXgsIHNhdmVfbm1zcnMrKyk7CiAJCS8qCi0JCSAqIE1TUl9LNl9TVEFSIGlzIG9ubHkgbmVlZGVkIG9uIGxvbmcgbW9kZSBndWVzdHMsIGFuZCBvbmx5CisJCSAqIE1TUl9TVEFSIGlzIG9ubHkgbmVlZGVkIG9uIGxvbmcgbW9kZSBndWVzdHMsIGFuZCBvbmx5CiAJCSAqIGlmIGVmZXIuc2NlIGlzIGVuYWJsZWQuCiAJCSAqLwotCQlpbmRleCA9IF9fZmluZF9tc3JfaW5kZXgodm14LCBNU1JfSzZfU1RBUik7CisJCWluZGV4ID0gX19maW5kX21zcl9pbmRleCh2bXgsIE1TUl9TVEFSKTsKIAkJaWYgKChpbmRleCA+PSAwKSAmJiAodm14LT52Y3B1LmFyY2guZWZlciAmIEVGRVJfU0NFKSkKIAkJCW1vdmVfbXNyX3VwKHZteCwgaW5kZXgsIHNhdmVfbm1zcnMrKyk7CiAJfQpAQCAtMTI4Niw2ICsxMzQ2LDEzIEBACiAJLyogbG9ja2VkIGJ1dCBub3QgZW5hYmxlZCAqLwogfQogCitzdGF0aWMgdm9pZCBrdm1fY3B1X3ZteG9uKHU2NCBhZGRyKQoreworCWFzbSB2b2xhdGlsZSAoQVNNX1ZNWF9WTVhPTl9SQVgKKwkJCTogOiAiYSIoJmFkZHIpLCAibSIoYWRkcikKKwkJCTogIm1lbW9yeSIsICJjYyIpOworfQorCiBzdGF0aWMgaW50IGhhcmR3YXJlX2VuYWJsZSh2b2lkICpnYXJiYWdlKQogewogCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtMTMwOCwxMSArMTM3NSwxMyBAQAogCQl3cm1zcmwoTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MLCBvbGQgfCB0ZXN0X2JpdHMpOwogCX0KIAl3cml0ZV9jcjQocmVhZF9jcjQoKSB8IFg4Nl9DUjRfVk1YRSk7IC8qIEZJWE1FOiBub3QgY3B1IGhvdHBsdWcgc2FmZSAqLwotCWFzbSB2b2xhdGlsZSAoQVNNX1ZNWF9WTVhPTl9SQVgKLQkJICAgICAgOiA6ICJhIigmcGh5c19hZGRyKSwgIm0iKHBoeXNfYWRkcikKLQkJICAgICAgOiAibWVtb3J5IiwgImNjIik7CiAKLQllcHRfc3luY19nbG9iYWwoKTsKKwlpZiAodm1tX2V4Y2x1c2l2ZSkgeworCQlrdm1fY3B1X3ZteG9uKHBoeXNfYWRkcik7CisJCWVwdF9zeW5jX2dsb2JhbCgpOworCX0KKworCXN0b3JlX2dkdCgmX19nZXRfY3B1X3Zhcihob3N0X2dkdCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzM0LDEzICsxNDAzLDE1IEBACiBzdGF0aWMgdm9pZCBrdm1fY3B1X3ZteG9mZih2b2lkKQogewogCWFzbSB2b2xhdGlsZSAoX19leChBU01fVk1YX1ZNWE9GRikgOiA6IDogImNjIik7Ci0Jd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9WTVhFKTsKIH0KIAogc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZSh2b2lkICpnYXJiYWdlKQogewotCXZtY2xlYXJfbG9jYWxfdmNwdXMoKTsKLQlrdm1fY3B1X3ZteG9mZigpOworCWlmICh2bW1fZXhjbHVzaXZlKSB7CisJCXZtY2xlYXJfbG9jYWxfdmNwdXMoKTsKKwkJa3ZtX2NwdV92bXhvZmYoKTsKKwl9CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9WTVhFKTsKIH0KIAogc3RhdGljIF9faW5pdCBpbnQgYWRqdXN0X3ZteF9jb250cm9scyh1MzIgY3RsX21pbiwgdTMyIGN0bF9vcHQsCkBAIC0xNTM5LDcgKzE2MTAsOCBAQAogCWlmICghY3B1X2hhc192bXhfdnBpZCgpKQogCQllbmFibGVfdnBpZCA9IDA7CiAKLQlpZiAoIWNwdV9oYXNfdm14X2VwdCgpKSB7CisJaWYgKCFjcHVfaGFzX3ZteF9lcHQoKSB8fAorCSAgICAhY3B1X2hhc192bXhfZXB0XzRsZXZlbHMoKSkgewogCQllbmFibGVfZXB0ID0gMDsKIAkJZW5hYmxlX3VucmVzdHJpY3RlZF9ndWVzdCA9IDA7CiAJfQpAQCAtMTYyOCw3ICsxNzAwLDcgQEAKIAkJZ2ZuX3QgYmFzZV9nZm47CiAKIAkJc2xvdHMgPSBrdm1fbWVtc2xvdHMoa3ZtKTsKLQkJYmFzZV9nZm4gPSBrdm0tPm1lbXNsb3RzLT5tZW1zbG90c1swXS5iYXNlX2dmbiArCisJCWJhc2VfZ2ZuID0gc2xvdHMtPm1lbXNsb3RzWzBdLmJhc2VfZ2ZuICsKIAkJCQkga3ZtLT5tZW1zbG90cy0+bWVtc2xvdHNbMF0ubnBhZ2VzIC0gMzsKIAkJcmV0dXJuIGJhc2VfZ2ZuIDw8IFBBR0VfU0hJRlQ7CiAJfQpAQCAtMTc1OSw5ICsxODMxLDEyIEBACiAKIHN0YXRpYyB2b2lkIHZteF9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXZwaWRfc3luY192Y3B1X2FsbCh0b192bXgodmNwdSkpOwotCWlmIChlbmFibGVfZXB0KQorCXZwaWRfc3luY19jb250ZXh0KHRvX3ZteCh2Y3B1KSk7CisJaWYgKGVuYWJsZV9lcHQpIHsKKwkJaWYgKCFWQUxJRF9QQUdFKHZjcHUtPmFyY2gubW11LnJvb3RfaHBhKSkKKwkJCXJldHVybjsKIAkJZXB0X3N5bmNfY29udGV4dChjb25zdHJ1Y3RfZXB0cCh2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSkpOworCX0KIH0KIAogc3RhdGljIHZvaWQgdm14X2RlY2FjaGVfY3IwX2d1ZXN0X2JpdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjUwNyw3ICsyNTgyLDcgQEAKIAl2bWNzX3dyaXRlMzIoUEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BVENILCAhIWJ5cGFzc19ndWVzdF9wZik7CiAJdm1jc193cml0ZTMyKENSM19UQVJHRVRfQ09VTlQsIDApOyAgICAgICAgICAgLyogMjIuMi4xICovCiAKLQl2bWNzX3dyaXRlbChIT1NUX0NSMCwgcmVhZF9jcjAoKSk7ICAvKiAyMi4yLjMgKi8KKwl2bWNzX3dyaXRlbChIT1NUX0NSMCwgcmVhZF9jcjAoKSB8IFg4Nl9DUjBfVFMpOyAgLyogMjIuMi4zICovCiAJdm1jc193cml0ZWwoSE9TVF9DUjQsIHJlYWRfY3I0KCkpOyAgLyogMjIuMi4zLCAyMi4yLjUgKi8KIAl2bWNzX3dyaXRlbChIT1NUX0NSMywgcmVhZF9jcjMoKSk7ICAvKiAyMi4yLjMgIEZJWE1FOiBzaGFkb3cgdGFibGVzICovCiAKQEAgLTI1OTksMjEgKzI2NzQsMjcgQEAKIAogc3RhdGljIGludCBpbml0X3Jtb2RlKHN0cnVjdCBrdm0gKmt2bSkKIHsKKwlpbnQgaWR4LCByZXQgPSAwOworCisJaWR4ID0gc3JjdV9yZWFkX2xvY2soJmt2bS0+c3JjdSk7CiAJaWYgKCFpbml0X3Jtb2RlX3Rzcyhrdm0pKQotCQlyZXR1cm4gMDsKKwkJZ290byBleGl0OwogCWlmICghaW5pdF9ybW9kZV9pZGVudGl0eV9tYXAoa3ZtKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisJCWdvdG8gZXhpdDsKKworCXJldCA9IDE7CitleGl0OgorCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+c3JjdSwgaWR4KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHZteF92Y3B1X3Jlc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKIAl1NjQgbXNyOwotCWludCByZXQsIGlkeDsKKwlpbnQgcmV0OwogCiAJdmNwdS0+YXJjaC5yZWdzX2F2YWlsID0gfigoMSA8PCBWQ1BVX1JFR1NfUklQKSB8ICgxIDw8IFZDUFVfUkVHU19SU1ApKTsKLQlpZHggPSBzcmN1X3JlYWRfbG9jaygmdmNwdS0+a3ZtLT5zcmN1KTsKIAlpZiAoIWluaXRfcm1vZGUodm14LT52Y3B1Lmt2bSkpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0yNjMwLDcgKzI3MTEsOSBAQAogCQltc3IgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfQlNQOwogCWt2bV9zZXRfYXBpY19iYXNlKCZ2bXgtPnZjcHUsIG1zcik7CiAKLQlmeF9pbml0KCZ2bXgtPnZjcHUpOworCXJldCA9IGZ4X2luaXQoJnZteC0+dmNwdSk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dDsKIAogCXNlZ19zZXR1cChWQ1BVX1NSRUdfQ1MpOwogCS8qCkBAIC0yNzEzLDcgKzI3OTYsNyBAQAogCXZteF9mcHVfYWN0aXZhdGUoJnZteC0+dmNwdSk7CiAJdXBkYXRlX2V4Y2VwdGlvbl9iaXRtYXAoJnZteC0+dmNwdSk7CiAKLQl2cGlkX3N5bmNfdmNwdV9hbGwodm14KTsKKwl2cGlkX3N5bmNfY29udGV4dCh2bXgpOwogCiAJcmV0ID0gMDsKIApAQCAtMjcyMSw3ICsyODA0LDYgQEAKIAl2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCA9IDA7CiAKIG91dDoKLQlzcmN1X3JlYWRfdW5sb2NrKCZ2Y3B1LT5rdm0tPnNyY3UsIGlkeCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjgyNiw5ICsyOTA4LDcgQEAKIHsKIAlpZiAoIWNwdV9oYXNfdmlydHVhbF9ubWlzKCkpCiAJCXJldHVybiB0b192bXgodmNwdSktPnNvZnRfdm5taV9ibG9ja2VkOwotCWVsc2UKLQkJcmV0dXJuICEhKHZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTykgJgotCQkJICBHVUVTVF9JTlRSX1NUQVRFX05NSSk7CisJcmV0dXJuIHZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTykJJiBHVUVTVF9JTlRSX1NUQVRFX05NSTsKIH0KIAogc3RhdGljIHZvaWQgdm14X3NldF9ubWlfbWFzayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgbWFza2VkKQpAQCAtMzA3MCw3ICszMTUwLDcgQEAKIAkrK3ZjcHUtPnN0YXQuaW9fZXhpdHM7CiAKIAlpZiAoc3RyaW5nIHx8IGluKQotCQlyZXR1cm4gIShlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDAsIDAsIDApID09IEVNVUxBVEVfRE9fTU1JTyk7CisJCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDAsIDAsIDApID09IEVNVUxBVEVfRE9ORTsKIAogCXBvcnQgPSBleGl0X3F1YWxpZmljYXRpb24gPj4gMTY7CiAJc2l6ZSA9IChleGl0X3F1YWxpZmljYXRpb24gJiA3KSArIDE7CkBAIC0zMDkwLDExICszMTcwLDIwIEBACiAJaHlwZXJjYWxsWzJdID0gMHhjMTsKIH0KIAorc3RhdGljIHZvaWQgY29tcGxldGVfaW5zbl9ncChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBlcnIpCit7CisJaWYgKGVycikKKwkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKKwllbHNlCisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX2NyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiwgdmFsOwogCWludCBjcjsKIAlpbnQgcmVnOworCWludCBlcnI7CiAKIAlleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CiAJY3IgPSBleGl0X3F1YWxpZmljYXRpb24gJiAxNTsKQEAgLTMxMDUsMTYgKzMxOTQsMTYgQEAKIAkJdHJhY2Vfa3ZtX2NyX3dyaXRlKGNyLCB2YWwpOwogCQlzd2l0Y2ggKGNyKSB7CiAJCWNhc2UgMDoKLQkJCWt2bV9zZXRfY3IwKHZjcHUsIHZhbCk7Ci0JCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQkJZXJyID0ga3ZtX3NldF9jcjAodmNwdSwgdmFsKTsKKwkJCWNvbXBsZXRlX2luc25fZ3AodmNwdSwgZXJyKTsKIAkJCXJldHVybiAxOwogCQljYXNlIDM6Ci0JCQlrdm1fc2V0X2NyMyh2Y3B1LCB2YWwpOwotCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJCWVyciA9IGt2bV9zZXRfY3IzKHZjcHUsIHZhbCk7CisJCQljb21wbGV0ZV9pbnNuX2dwKHZjcHUsIGVycik7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA0OgotCQkJa3ZtX3NldF9jcjQodmNwdSwgdmFsKTsKLQkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCQllcnIgPSBrdm1fc2V0X2NyNCh2Y3B1LCB2YWwpOworCQkJY29tcGxldGVfaW5zbl9ncCh2Y3B1LCBlcnIpOwogCQkJcmV0dXJuIDE7CiAJCWNhc2UgODogewogCQkJCXU4IGNyOF9wcmV2ID0ga3ZtX2dldF9jcjgodmNwdSk7CkBAIC0zMzIxLDI4ICszNDEwLDIzIEBACiBzdGF0aWMgaW50IGhhbmRsZV93YmludmQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7Ci0JLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIFZULWQvcGFzcy10aHJvdWdoIGRldmljZSAqLworCWt2bV9lbXVsYXRlX3diaW52ZCh2Y3B1KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfeHNldGJ2KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1NjQgbmV3X2J2ID0ga3ZtX3JlYWRfZWR4X2VheCh2Y3B1KTsKKwl1MzIgaW5kZXggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkNYKTsKKworCWlmIChrdm1fc2V0X3hjcih2Y3B1LCBpbmRleCwgbmV3X2J2KSA9PSAwKQorCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwogCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IGhhbmRsZV9hcGljX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBleGl0X3F1YWxpZmljYXRpb247Ci0JZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCi0JZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOwotCW9mZnNldCA9IGV4aXRfcXVhbGlmaWNhdGlvbiAmIDB4ZmZmdWw7Ci0KLQllciA9IGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgMCk7Ci0KLQlpZiAoZXIgIT0gIEVNVUxBVEVfRE9ORSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJGYWlsIHRvIGhhbmRsZSBhcGljIGFjY2VzcyB2bWV4aXQhIE9mZnNldCBpcyAweCVseFxuIiwKLQkJICAgICAgIG9mZnNldCk7Ci0JCXJldHVybiAtRU5PRVhFQzsKLQl9Ci0JcmV0dXJuIDE7CisJcmV0dXJuIGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgMCkgPT0gRU1VTEFURV9ET05FOwogfQogCiBzdGF0aWMgaW50IGhhbmRsZV90YXNrX3N3aXRjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0zNTU0LDEzICszNjM4LDggQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaWYgKGVyciAhPSBFTVVMQVRFX0RPTkUpIHsKLQkJCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKLQkJCXZjcHUtPnJ1bi0+aW50ZXJuYWwuc3ViZXJyb3IgPSBLVk1fSU5URVJOQUxfRVJST1JfRU1VTEFUSU9OOwotCQkJdmNwdS0+cnVuLT5pbnRlcm5hbC5uZGF0YSA9IDA7Ci0JCQlyZXQgPSAwOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJaWYgKGVyciAhPSBFTVVMQVRFX0RPTkUpCisJCQlyZXR1cm4gMDsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlnb3RvIG91dDsKQEAgLTM2MjMsNiArMzcwMiw3IEBACiAJW0VYSVRfUkVBU09OX1RQUl9CRUxPV19USFJFU0hPTERdICAgICA9IGhhbmRsZV90cHJfYmVsb3dfdGhyZXNob2xkLAogCVtFWElUX1JFQVNPTl9BUElDX0FDQ0VTU10gICAgICAgICAgICAgPSBoYW5kbGVfYXBpY19hY2Nlc3MsCiAJW0VYSVRfUkVBU09OX1dCSU5WRF0gICAgICAgICAgICAgICAgICA9IGhhbmRsZV93YmludmQsCisJW0VYSVRfUkVBU09OX1hTRVRCVl0gICAgICAgICAgICAgICAgICA9IGhhbmRsZV94c2V0YnYsCiAJW0VYSVRfUkVBU09OX1RBU0tfU1dJVENIXSAgICAgICAgICAgICA9IGhhbmRsZV90YXNrX3N3aXRjaCwKIAlbRVhJVF9SRUFTT05fTUNFX0RVUklOR19WTUVOVFJZXSAgICAgID0gaGFuZGxlX21hY2hpbmVfY2hlY2ssCiAJW0VYSVRfUkVBU09OX0VQVF9WSU9MQVRJT05dCSAgICAgID0gaGFuZGxlX2VwdF92aW9sYXRpb24sCkBAIC0zNjU2LDYgKzM3MzYsMTMgQEAKIAlpZiAoZW5hYmxlX2VwdCAmJiBpc19wYWdpbmcodmNwdSkpCiAJCXZjcHUtPmFyY2guY3IzID0gdm1jc19yZWFkbChHVUVTVF9DUjMpOwogCisJaWYgKGV4aXRfcmVhc29uICYgVk1YX0VYSVRfUkVBU09OU19GQUlMRURfVk1FTlRSWSkgeworCQl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfRkFJTF9FTlRSWTsKKwkJdmNwdS0+cnVuLT5mYWlsX2VudHJ5LmhhcmR3YXJlX2VudHJ5X2ZhaWx1cmVfcmVhc29uCisJCQk9IGV4aXRfcmVhc29uOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAodW5saWtlbHkodm14LT5mYWlsKSkgewogCQl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfRkFJTF9FTlRSWTsKIAkJdmNwdS0+cnVuLT5mYWlsX2VudHJ5LmhhcmR3YXJlX2VudHJ5X2ZhaWx1cmVfcmVhc29uCkBAIC0zODYxLDExICszOTQ4LDYgQEAKIAlpZiAodmNwdS0+Z3Vlc3RfZGVidWcgJiBLVk1fR1VFU1REQkdfU0lOR0xFU1RFUCkKIAkJdm14X3NldF9pbnRlcnJ1cHRfc2hhZG93KHZjcHUsIDApOwogCi0JLyoKLQkgKiBMb2FkaW5nIGd1ZXN0IGZwdSBtYXkgaGF2ZSBjbGVhcmVkIGhvc3QgY3IwLnRzCi0JICovCi0Jdm1jc193cml0ZWwoSE9TVF9DUjAsIHJlYWRfY3IwKCkpOwotCiAJYXNtKAogCQkvKiBTdG9yZSBob3N0IHJlZ2lzdGVycyAqLwogCQkicHVzaCAlJSJSImR4OyBwdXNoICUlIlIiYnA7IgpAQCAtNDAwMSw2ICs0MDgzLDE5IEBACiAJa21lbV9jYWNoZV9mcmVlKGt2bV92Y3B1X2NhY2hlLCB2bXgpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdm1jc19pbml0KHN0cnVjdCB2bWNzICp2bWNzKQoreworCXU2NCBwaHlzX2FkZHIgPSBfX3BhKHBlcl9jcHUodm14YXJlYSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkpOworCisJaWYgKCF2bW1fZXhjbHVzaXZlKQorCQlrdm1fY3B1X3ZteG9uKHBoeXNfYWRkcik7CisKKwl2bWNzX2NsZWFyKHZtY3MpOworCisJaWYgKCF2bW1fZXhjbHVzaXZlKQorCQlrdm1fY3B1X3ZteG9mZigpOworfQorCiBzdGF0aWMgc3RydWN0IGt2bV92Y3B1ICp2bXhfY3JlYXRlX3ZjcHUoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJaW50IGVycjsKQEAgLTQwMjYsNyArNDEyMSw3IEBACiAJaWYgKCF2bXgtPnZtY3MpCiAJCWdvdG8gZnJlZV9tc3JzOwogCi0Jdm1jc19jbGVhcih2bXgtPnZtY3MpOworCXZtY3NfaW5pdCh2bXgtPnZtY3MpOwogCiAJY3B1ID0gZ2V0X2NwdSgpOwogCXZteF92Y3B1X2xvYWQoJnZteC0+dmNwdSwgY3B1KTsKQEAgLTQyNjUsNiArNDM2MCw4IEBACiAJLnJkdHNjcF9zdXBwb3J0ZWQgPSB2bXhfcmR0c2NwX3N1cHBvcnRlZCwKIAogCS5zZXRfc3VwcG9ydGVkX2NwdWlkID0gdm14X3NldF9zdXBwb3J0ZWRfY3B1aWQsCisKKwkuaGFzX3diaW52ZF9leGl0ID0gY3B1X2hhc192bXhfd2JpbnZkX2V4aXQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB2bXhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IDdmYTg5YzMuLjI1ZjE5MDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTYsNiArNiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUXVtcmFuZXQsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwOCBRdW1yYW5ldCwgSW5jLgogICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsYXRlcy4KICAqCiAgKiBBdXRob3JzOgogICogICBBdmkgS2l2aXR5ICAgPGF2aUBxdW1yYW5ldC5jb20+CkBAIC00MSwxNyArNDIsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2t2bS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICJ0cmFjZS5oIgogCiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgPGFzbS94Y3IuaD4KIAogI2RlZmluZSBNQVhfSU9fTVNSUyAyNTYKICNkZWZpbmUgQ1IwX1JFU0VSVkVEX0JJVFMJCQkJCQlcCkBAIC02Miw2ICs2NSw3IEBACiAJKH4odW5zaWduZWQgbG9uZykoWDg2X0NSNF9WTUUgfCBYODZfQ1I0X1BWSSB8IFg4Nl9DUjRfVFNEIHwgWDg2X0NSNF9ERVwKIAkJCSAgfCBYODZfQ1I0X1BTRSB8IFg4Nl9DUjRfUEFFIHwgWDg2X0NSNF9NQ0UJXAogCQkJICB8IFg4Nl9DUjRfUEdFIHwgWDg2X0NSNF9QQ0UgfCBYODZfQ1I0X09TRlhTUglcCisJCQkgIHwgWDg2X0NSNF9PU1hTQVZFIFwKIAkJCSAgfCBYODZfQ1I0X09TWE1NRVhDUFQgfCBYODZfQ1I0X1ZNWEUpKQogCiAjZGVmaW5lIENSOF9SRVNFUlZFRF9CSVRTICh+KHVuc2lnbmVkIGxvbmcpWDg2X0NSOF9UUFIpCkBAIC0xNDcsNiArMTUxLDEzIEBACiAJeyBOVUxMIH0KIH07CiAKK3U2NCBfX3JlYWRfbW9zdGx5IGhvc3RfeGNyMDsKKworc3RhdGljIGlubGluZSB1MzIgYml0KGludCBiaXRubykKK3sKKwlyZXR1cm4gMSA8PCAoYml0bm8gJiAzMSk7Cit9CisKIHN0YXRpYyB2b2lkIGt2bV9vbl91c2VyX3JldHVybihzdHJ1Y3QgdXNlcl9yZXR1cm5fbm90aWZpZXIgKnVybikKIHsKIAl1bnNpZ25lZCBzbG90OwpAQCAtMjg1LDcgKzI5Niw3IEBACiAJcHJldl9uciA9IHZjcHUtPmFyY2guZXhjZXB0aW9uLm5yOwogCWlmIChwcmV2X25yID09IERGX1ZFQ1RPUikgewogCQkvKiB0cmlwbGUgZmF1bHQgLT4gc2h1dGRvd24gKi8KLQkJc2V0X2JpdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgJnZjcHUtPnJlcXVlc3RzKTsKKwkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgdmNwdSk7CiAJCXJldHVybjsKIAl9CiAJY2xhc3MxID0gZXhjZXB0aW9uX2NsYXNzKHByZXZfbnIpOwpAQCAtNDE0LDEyMSArNDI1LDE2MyBAQAogCXJldHVybiBjaGFuZ2VkOwogfQogCi12b2lkIGt2bV9zZXRfY3IwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApCitpbnQga3ZtX3NldF9jcjAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMCkKIHsKKwl1bnNpZ25lZCBsb25nIG9sZF9jcjAgPSBrdm1fcmVhZF9jcjAodmNwdSk7CisJdW5zaWduZWQgbG9uZyB1cGRhdGVfYml0cyA9IFg4Nl9DUjBfUEcgfCBYODZfQ1IwX1dQIHwKKwkJCQkgICAgWDg2X0NSMF9DRCB8IFg4Nl9DUjBfTlc7CisKIAljcjAgfD0gWDg2X0NSMF9FVDsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKLQlpZiAoY3IwICYgMHhmZmZmZmZmZjAwMDAwMDAwVUwpIHsKLQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoY3IwICYgMHhmZmZmZmZmZjAwMDAwMDAwVUwpCisJCXJldHVybiAxOwogI2VuZGlmCiAKIAljcjAgJj0gfkNSMF9SRVNFUlZFRF9CSVRTOwogCi0JaWYgKChjcjAgJiBYODZfQ1IwX05XKSAmJiAhKGNyMCAmIFg4Nl9DUjBfQ0QpKSB7Ci0JCWt2bV9pbmplY3RfZ3AodmNwdSwgMCk7Ci0JCXJldHVybjsKLQl9CisJaWYgKChjcjAgJiBYODZfQ1IwX05XKSAmJiAhKGNyMCAmIFg4Nl9DUjBfQ0QpKQorCQlyZXR1cm4gMTsKIAotCWlmICgoY3IwICYgWDg2X0NSMF9QRykgJiYgIShjcjAgJiBYODZfQ1IwX1BFKSkgewotCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCQlyZXR1cm47Ci0JfQorCWlmICgoY3IwICYgWDg2X0NSMF9QRykgJiYgIShjcjAgJiBYODZfQ1IwX1BFKSkKKwkJcmV0dXJuIDE7CiAKIAlpZiAoIWlzX3BhZ2luZyh2Y3B1KSAmJiAoY3IwICYgWDg2X0NSMF9QRykpIHsKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJCWlmICgodmNwdS0+YXJjaC5lZmVyICYgRUZFUl9MTUUpKSB7CiAJCQlpbnQgY3NfZGIsIGNzX2w7CiAKLQkJCWlmICghaXNfcGFlKHZjcHUpKSB7Ci0JCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCQlpZiAoIWlzX3BhZSh2Y3B1KSkKKwkJCQlyZXR1cm4gMTsKIAkJCWt2bV94ODZfb3BzLT5nZXRfY3NfZGJfbF9iaXRzKHZjcHUsICZjc19kYiwgJmNzX2wpOwotCQkJaWYgKGNzX2wpIHsKLQkJCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCQkJCXJldHVybjsKLQotCQkJfQorCQkJaWYgKGNzX2wpCisJCQkJcmV0dXJuIDE7CiAJCX0gZWxzZQogI2VuZGlmCi0JCWlmIChpc19wYWUodmNwdSkgJiYgIWxvYWRfcGRwdHJzKHZjcHUsIHZjcHUtPmFyY2guY3IzKSkgewotCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCXJldHVybjsKLQkJfQotCisJCWlmIChpc19wYWUodmNwdSkgJiYgIWxvYWRfcGRwdHJzKHZjcHUsIHZjcHUtPmFyY2guY3IzKSkKKwkJCXJldHVybiAxOwogCX0KIAogCWt2bV94ODZfb3BzLT5zZXRfY3IwKHZjcHUsIGNyMCk7CiAKLQlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7Ci0JcmV0dXJuOworCWlmICgoY3IwIF4gb2xkX2NyMCkgJiB1cGRhdGVfYml0cykKKwkJa3ZtX21tdV9yZXNldF9jb250ZXh0KHZjcHUpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3NldF9jcjApOwogCiB2b2lkIGt2bV9sbXN3KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBtc3cpCiB7Ci0Ja3ZtX3NldF9jcjAodmNwdSwga3ZtX3JlYWRfY3IwX2JpdHModmNwdSwgfjB4MGV1bCkgfCAobXN3ICYgMHgwZikpOworCSh2b2lkKWt2bV9zZXRfY3IwKHZjcHUsIGt2bV9yZWFkX2NyMF9iaXRzKHZjcHUsIH4weDBldWwpIHwgKG1zdyAmIDB4MGYpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9sbXN3KTsKIAotdm9pZCBrdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQoraW50IF9fa3ZtX3NldF94Y3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgaW5kZXgsIHU2NCB4Y3IpCit7CisJdTY0IHhjcjA7CisKKwkvKiBPbmx5IHN1cHBvcnQgWENSX1hGRUFUVVJFX0VOQUJMRURfTUFTSyh4Y3IwKSBub3cgICovCisJaWYgKGluZGV4ICE9IFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0spCisJCXJldHVybiAxOworCXhjcjAgPSB4Y3I7CisJaWYgKGt2bV94ODZfb3BzLT5nZXRfY3BsKHZjcHUpICE9IDApCisJCXJldHVybiAxOworCWlmICghKHhjcjAgJiBYU1RBVEVfRlApKQorCQlyZXR1cm4gMTsKKwlpZiAoKHhjcjAgJiBYU1RBVEVfWU1NKSAmJiAhKHhjcjAgJiBYU1RBVEVfU1NFKSkKKwkJcmV0dXJuIDE7CisJaWYgKHhjcjAgJiB+aG9zdF94Y3IwKQorCQlyZXR1cm4gMTsKKwl2Y3B1LT5hcmNoLnhjcjAgPSB4Y3IwOworCXZjcHUtPmd1ZXN0X3hjcjBfbG9hZGVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGt2bV9zZXRfeGNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIGluZGV4LCB1NjQgeGNyKQoreworCWlmIChfX2t2bV9zZXRfeGNyKHZjcHUsIGluZGV4LCB4Y3IpKSB7CisJCWt2bV9pbmplY3RfZ3AodmNwdSwgMCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9zZXRfeGNyKTsKKworc3RhdGljIGJvb2wgZ3Vlc3RfY3B1aWRfaGFzX3hzYXZlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYmVzdDsKKworCWJlc3QgPSBrdm1fZmluZF9jcHVpZF9lbnRyeSh2Y3B1LCAxLCAwKTsKKwlyZXR1cm4gYmVzdCAmJiAoYmVzdC0+ZWN4ICYgYml0KFg4Nl9GRUFUVVJFX1hTQVZFKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9jcHVpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmJlc3Q7CisKKwliZXN0ID0ga3ZtX2ZpbmRfY3B1aWRfZW50cnkodmNwdSwgMSwgMCk7CisJaWYgKCFiZXN0KQorCQlyZXR1cm47CisKKwkvKiBVcGRhdGUgT1NYU0FWRSBiaXQgKi8KKwlpZiAoY3B1X2hhc194c2F2ZSAmJiBiZXN0LT5mdW5jdGlvbiA9PSAweDEpIHsKKwkJYmVzdC0+ZWN4ICY9IH4oYml0KFg4Nl9GRUFUVVJFX09TWFNBVkUpKTsKKwkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfT1NYU0FWRSkpCisJCQliZXN0LT5lY3ggfD0gYml0KFg4Nl9GRUFUVVJFX09TWFNBVkUpOworCX0KK30KKworaW50IGt2bV9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCiB7CiAJdW5zaWduZWQgbG9uZyBvbGRfY3I0ID0ga3ZtX3JlYWRfY3I0KHZjcHUpOwogCXVuc2lnbmVkIGxvbmcgcGRwdHJfYml0cyA9IFg4Nl9DUjRfUEdFIHwgWDg2X0NSNF9QU0UgfCBYODZfQ1I0X1BBRTsKIAotCWlmIChjcjQgJiBDUjRfUkVTRVJWRURfQklUUykgewotCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCQlyZXR1cm47Ci0JfQorCWlmIChjcjQgJiBDUjRfUkVTRVJWRURfQklUUykKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWd1ZXN0X2NwdWlkX2hhc194c2F2ZSh2Y3B1KSAmJiAoY3I0ICYgWDg2X0NSNF9PU1hTQVZFKSkKKwkJcmV0dXJuIDE7CiAKIAlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKSB7Ci0JCWlmICghKGNyNCAmIFg4Nl9DUjRfUEFFKSkgewotCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAoIShjcjQgJiBYODZfQ1I0X1BBRSkpCisJCQlyZXR1cm4gMTsKIAl9IGVsc2UgaWYgKGlzX3BhZ2luZyh2Y3B1KSAmJiAoY3I0ICYgWDg2X0NSNF9QQUUpCiAJCSAgICYmICgoY3I0IF4gb2xkX2NyNCkgJiBwZHB0cl9iaXRzKQotCQkgICAmJiAhbG9hZF9wZHB0cnModmNwdSwgdmNwdS0+YXJjaC5jcjMpKSB7Ci0JCWt2bV9pbmplY3RfZ3AodmNwdSwgMCk7Ci0JCXJldHVybjsKLQl9CisJCSAgICYmICFsb2FkX3BkcHRycyh2Y3B1LCB2Y3B1LT5hcmNoLmNyMykpCisJCXJldHVybiAxOwogCi0JaWYgKGNyNCAmIFg4Nl9DUjRfVk1YRSkgewotCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCQlyZXR1cm47Ci0JfQorCWlmIChjcjQgJiBYODZfQ1I0X1ZNWEUpCisJCXJldHVybiAxOworCiAJa3ZtX3g4Nl9vcHMtPnNldF9jcjQodmNwdSwgY3I0KTsKLQl2Y3B1LT5hcmNoLmNyNCA9IGNyNDsKLQlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CisKKwlpZiAoKGNyNCBeIG9sZF9jcjQpICYgcGRwdHJfYml0cykKKwkJa3ZtX21tdV9yZXNldF9jb250ZXh0KHZjcHUpOworCisJaWYgKChjcjQgXiBvbGRfY3I0KSAmIFg4Nl9DUjRfT1NYU0FWRSkKKwkJdXBkYXRlX2NwdWlkKHZjcHUpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fc2V0X2NyNCk7CiAKLXZvaWQga3ZtX3NldF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMykKK2ludCBrdm1fc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IzKQogewogCWlmIChjcjMgPT0gdmNwdS0+YXJjaC5jcjMgJiYgIXBkcHRyc19jaGFuZ2VkKHZjcHUpKSB7CiAJCWt2bV9tbXVfc3luY19yb290cyh2Y3B1KTsKIAkJa3ZtX21tdV9mbHVzaF90bGIodmNwdSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGlzX2xvbmdfbW9kZSh2Y3B1KSkgewotCQlpZiAoY3IzICYgQ1IzX0xfTU9ERV9SRVNFUlZFRF9CSVRTKSB7Ci0JCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCQkJcmV0dXJuOwotCQl9CisJCWlmIChjcjMgJiBDUjNfTF9NT0RFX1JFU0VSVkVEX0JJVFMpCisJCQlyZXR1cm4gMTsKIAl9IGVsc2UgewogCQlpZiAoaXNfcGFlKHZjcHUpKSB7Ci0JCQlpZiAoY3IzICYgQ1IzX1BBRV9SRVNFUlZFRF9CSVRTKSB7Ci0JCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoaXNfcGFnaW5nKHZjcHUpICYmICFsb2FkX3BkcHRycyh2Y3B1LCBjcjMpKSB7Ci0JCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCQlpZiAoY3IzICYgQ1IzX1BBRV9SRVNFUlZFRF9CSVRTKQorCQkJCXJldHVybiAxOworCQkJaWYgKGlzX3BhZ2luZyh2Y3B1KSAmJiAhbG9hZF9wZHB0cnModmNwdSwgY3IzKSkKKwkJCQlyZXR1cm4gMTsKIAkJfQogCQkvKgogCQkgKiBXZSBkb24ndCBjaGVjayByZXNlcnZlZCBiaXRzIGluIG5vbnBhZSBtb2RlLCBiZWNhdXNlCkBAIC01NDYsMjQgKzU5OSwyOCBAQAogCSAqIHRvIGRlYnVnKSBiZWhhdmlvciBvbiB0aGUgZ3Vlc3Qgc2lkZS4KIAkgKi8KIAlpZiAodW5saWtlbHkoIWdmbl90b19tZW1zbG90KHZjcHUtPmt2bSwgY3IzID4+IFBBR0VfU0hJRlQpKSkKLQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQllbHNlIHsKLQkJdmNwdS0+YXJjaC5jcjMgPSBjcjM7Ci0JCXZjcHUtPmFyY2gubW11Lm5ld19jcjModmNwdSk7Ci0JfQorCQlyZXR1cm4gMTsKKwl2Y3B1LT5hcmNoLmNyMyA9IGNyMzsKKwl2Y3B1LT5hcmNoLm1tdS5uZXdfY3IzKHZjcHUpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3NldF9jcjMpOwogCi12b2lkIGt2bV9zZXRfY3I4KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjgpCitpbnQgX19rdm1fc2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I4KQogewotCWlmIChjcjggJiBDUjhfUkVTRVJWRURfQklUUykgewotCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCQlyZXR1cm47Ci0JfQorCWlmIChjcjggJiBDUjhfUkVTRVJWRURfQklUUykKKwkJcmV0dXJuIDE7CiAJaWYgKGlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCiAJCWt2bV9sYXBpY19zZXRfdHByKHZjcHUsIGNyOCk7CiAJZWxzZQogCQl2Y3B1LT5hcmNoLmNyOCA9IGNyODsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBrdm1fc2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I4KQoreworCWlmIChfX2t2bV9zZXRfY3I4KHZjcHUsIGNyOCkpCisJCWt2bV9pbmplY3RfZ3AodmNwdSwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fc2V0X2NyOCk7CiAKQEAgLTU3Niw3ICs2MzMsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2dldF9jcjgpOwogCi1pbnQga3ZtX3NldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW50IF9fa3ZtX3NldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJc3dpdGNoIChkcikgewogCWNhc2UgMCAuLi4gMzoKQEAgLTU4NSwyOSArNjQyLDIxIEBACiAJCQl2Y3B1LT5hcmNoLmVmZl9kYltkcl0gPSB2YWw7CiAJCWJyZWFrOwogCWNhc2UgNDoKLQkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfREUpKSB7Ci0JCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7Ci0JCQlyZXR1cm4gMTsKLQkJfQorCQlpZiAoa3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgWDg2X0NSNF9ERSkpCisJCQlyZXR1cm4gMTsgLyogI1VEICovCiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgNjoKLQkJaWYgKHZhbCAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkgewotCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCXJldHVybiAxOwotCQl9CisJCWlmICh2YWwgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpCisJCQlyZXR1cm4gLTE7IC8qICNHUCAqLwogCQl2Y3B1LT5hcmNoLmRyNiA9ICh2YWwgJiBEUjZfVk9MQVRJTEUpIHwgRFI2X0ZJWEVEXzE7CiAJCWJyZWFrOwogCWNhc2UgNToKLQkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfREUpKSB7Ci0JCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7Ci0JCQlyZXR1cm4gMTsKLQkJfQorCQlpZiAoa3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgWDg2X0NSNF9ERSkpCisJCQlyZXR1cm4gMTsgLyogI1VEICovCiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6IC8qIDcgKi8KLQkJaWYgKHZhbCAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkgewotCQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLQkJCXJldHVybiAxOwotCQl9CisJCWlmICh2YWwgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpCisJCQlyZXR1cm4gLTE7IC8qICNHUCAqLwogCQl2Y3B1LT5hcmNoLmRyNyA9ICh2YWwgJiBEUjdfVk9MQVRJTEUpIHwgRFI3X0ZJWEVEXzE7CiAJCWlmICghKHZjcHUtPmd1ZXN0X2RlYnVnICYgS1ZNX0dVRVNUREJHX1VTRV9IV19CUCkpIHsKIAkJCWt2bV94ODZfb3BzLT5zZXRfZHI3KHZjcHUsIHZjcHUtPmFyY2guZHI3KTsKQEAgLTYxOCwyOCArNjY3LDM3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworaW50IGt2bV9zZXRfZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgZHIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWludCByZXM7CisKKwlyZXMgPSBfX2t2bV9zZXRfZHIodmNwdSwgZHIsIHZhbCk7CisJaWYgKHJlcyA+IDApCisJCWt2bV9xdWV1ZV9leGNlcHRpb24odmNwdSwgVURfVkVDVE9SKTsKKwllbHNlIGlmIChyZXMgPCAwKQorCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOworCisJcmV0dXJuIHJlczsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9zZXRfZHIpOwogCi1pbnQga3ZtX2dldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyAqdmFsKQorc3RhdGljIGludCBfa3ZtX2dldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyAqdmFsKQogewogCXN3aXRjaCAoZHIpIHsKIAljYXNlIDAgLi4uIDM6CiAJCSp2YWwgPSB2Y3B1LT5hcmNoLmRiW2RyXTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQlpZiAoa3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgWDg2X0NSNF9ERSkpIHsKLQkJCWt2bV9xdWV1ZV9leGNlcHRpb24odmNwdSwgVURfVkVDVE9SKTsKKwkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfREUpKQogCQkJcmV0dXJuIDE7Ci0JCX0KIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSA2OgogCQkqdmFsID0gdmNwdS0+YXJjaC5kcjY7CiAJCWJyZWFrOwogCWNhc2UgNToKLQkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfREUpKSB7Ci0JCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7CisJCWlmIChrdm1fcmVhZF9jcjRfYml0cyh2Y3B1LCBYODZfQ1I0X0RFKSkKIAkJCXJldHVybiAxOwotCQl9CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6IC8qIDcgKi8KIAkJKnZhbCA9IHZjcHUtPmFyY2guZHI3OwpAQCAtNjQ4LDEyICs3MDYsMTYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2dldF9kcik7CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGJpdChpbnQgYml0bm8pCitpbnQga3ZtX2dldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyAqdmFsKQogewotCXJldHVybiAxIDw8IChiaXRubyAmIDMxKTsKKwlpZiAoX2t2bV9nZXRfZHIodmNwdSwgZHIsIHZhbCkpIHsKKwkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBVRF9WRUNUT1IpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fZ2V0X2RyKTsKIAogLyoKICAqIExpc3Qgb2YgbXNyIG51bWJlcnMgd2hpY2ggd2UgZXhwb3NlIHRvIHVzZXJzcGFjZSB0aHJvdWdoIEtWTV9HRVRfTVNSUwpAQCAtNjcxLDcgKzczMyw3IEBACiAJSFZfWDY0X01TUl9HVUVTVF9PU19JRCwgSFZfWDY0X01TUl9IWVBFUkNBTEwsCiAJSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFLAogCU1TUl9JQTMyX1NZU0VOVEVSX0NTLCBNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwKLQlNU1JfSzZfU1RBUiwKKwlNU1JfU1RBUiwKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJTVNSX0NTVEFSLCBNU1JfS0VSTkVMX0dTX0JBU0UsIE1TUl9TWVNDQUxMX01BU0ssIE1TUl9MU1RBUiwKICNlbmRpZgpAQCAtNjgyLDEwICs3NDQsMTQgQEAKIAogc3RhdGljIHUzMiBlbXVsYXRlZF9tc3JzW10gPSB7CiAJTVNSX0lBMzJfTUlTQ19FTkFCTEUsCisJTVNSX0lBMzJfTUNHX1NUQVRVUywKKwlNU1JfSUEzMl9NQ0dfQ1RMLAogfTsKIAogc3RhdGljIGludCBzZXRfZWZlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBlZmVyKQogeworCXU2NCBvbGRfZWZlciA9IHZjcHUtPmFyY2guZWZlcjsKKwogCWlmIChlZmVyICYgZWZlcl9yZXNlcnZlZF9iaXRzKQogCQlyZXR1cm4gMTsKIApAQCAtNzE0LDExICs3ODAsMTMgQEAKIAogCWt2bV94ODZfb3BzLT5zZXRfZWZlcih2Y3B1LCBlZmVyKTsKIAotCXZjcHUtPmFyY2guZWZlciA9IGVmZXI7Ci0KIAl2Y3B1LT5hcmNoLm1tdS5iYXNlX3JvbGUubnhlID0gKGVmZXIgJiBFRkVSX05YKSAmJiAhdGRwX2VuYWJsZWQ7CiAJa3ZtX21tdV9yZXNldF9jb250ZXh0KHZjcHUpOwogCisJLyogVXBkYXRlIHJlc2VydmVkIGJpdHMgKi8KKwlpZiAoKGVmZXIgXiBvbGRfZWZlcikgJiBFRkVSX05YKQorCQlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODgyLDcgKzk1MCw3IEBACiAKIAlpZiAoIXZjcHUtPnRpbWVfcGFnZSkKIAkJcmV0dXJuIDA7Ci0Jc2V0X2JpdChLVk1fUkVRX0tWTUNMT0NLX1VQREFURSwgJnYtPnJlcXVlc3RzKTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfS1ZNQ0xPQ0tfVVBEQVRFLCB2KTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTUyNCwxNiArMTU5MiwxMiBAQAogewogCWludCBpLCBpZHg7CiAKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlpZHggPSBzcmN1X3JlYWRfbG9jaygmdmNwdS0+a3ZtLT5zcmN1KTsKIAlmb3IgKGkgPSAwOyBpIDwgbXNycy0+bm1zcnM7ICsraSkKIAkJaWYgKGRvX21zcih2Y3B1LCBlbnRyaWVzW2ldLmluZGV4LCAmZW50cmllc1tpXS5kYXRhKSkKIAkJCWJyZWFrOwogCXNyY3VfcmVhZF91bmxvY2soJnZjcHUtPmt2bS0+c3JjdSwgaWR4KTsKIAotCXZjcHVfcHV0KHZjcHUpOwotCiAJcmV0dXJuIGk7CiB9CiAKQEAgLTE2MTgsNiArMTY4Miw3IEBACiAJY2FzZSBLVk1fQ0FQX1BDSV9TRUdNRU5UOgogCWNhc2UgS1ZNX0NBUF9ERUJVR1JFR1M6CiAJY2FzZSBLVk1fQ0FQX1g4Nl9ST0JVU1RfU0lOR0xFU1RFUDoKKwljYXNlIEtWTV9DQVBfWFNBVkU6CiAJCXIgPSAxOwogCQlicmVhazsKIAljYXNlIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU86CkBAIC0xNjQxLDYgKzE3MDYsOSBAQAogCWNhc2UgS1ZNX0NBUF9NQ0U6CiAJCXIgPSBLVk1fTUFYX01DRV9CQU5LUzsKIAkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX1hDUlM6CisJCXIgPSBjcHVfaGFzX3hzYXZlOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyID0gMDsKIAkJYnJlYWs7CkBAIC0xNzE3LDggKzE3ODUsMjggQEAKIAlyZXR1cm4gcjsKIH0KIAorc3RhdGljIHZvaWQgd2JpbnZkX2lwaSh2b2lkICpnYXJiYWdlKQoreworCXdiaW52ZCgpOworfQorCitzdGF0aWMgYm9vbCBuZWVkX2VtdWxhdGVfd2JpbnZkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+a3ZtLT5hcmNoLmlvbW11X2RvbWFpbiAmJgorCQkhKHZjcHUtPmt2bS0+YXJjaC5pb21tdV9mbGFncyAmIEtWTV9JT01NVV9DQUNIRV9DT0hFUkVOQ1kpOworfQorCiB2b2lkIGt2bV9hcmNoX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCiB7CisJLyogQWRkcmVzcyBXQklOVkQgbWF5IGJlIGV4ZWN1dGVkIGJ5IGd1ZXN0ICovCisJaWYgKG5lZWRfZW11bGF0ZV93YmludmQodmNwdSkpIHsKKwkJaWYgKGt2bV94ODZfb3BzLT5oYXNfd2JpbnZkX2V4aXQoKSkKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHZjcHUtPmFyY2gud2JpbnZkX2RpcnR5X21hc2spOworCQllbHNlIGlmICh2Y3B1LT5jcHUgIT0gLTEgJiYgdmNwdS0+Y3B1ICE9IGNwdSkKKwkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSh2Y3B1LT5jcHUsCisJCQkJCXdiaW52ZF9pcGksIE5VTEwsIDEpOworCX0KKwogCWt2bV94ODZfb3BzLT52Y3B1X2xvYWQodmNwdSwgY3B1KTsKIAlpZiAodW5saWtlbHkocGVyX2NwdShjcHVfdHNjX2toeiwgY3B1KSA9PSAwKSkgewogCQl1bnNpZ25lZCBsb25nIGtoeiA9IGNwdWZyZXFfcXVpY2tfZ2V0KGNwdSk7CkBAIC0xNzMxLDggKzE4MTksOCBAQAogCiB2b2lkIGt2bV9hcmNoX3ZjcHVfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlrdm1fcHV0X2d1ZXN0X2ZwdSh2Y3B1KTsKIAlrdm1feDg2X29wcy0+dmNwdV9wdXQodmNwdSk7CisJa3ZtX3B1dF9ndWVzdF9mcHUodmNwdSk7CiB9CiAKIHN0YXRpYyBpbnQgaXNfZWZlcl9ueCh2b2lkKQpAQCAtMTc4MSw3ICsxODY5LDYgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoY3B1aWRfZW50cmllcywgZW50cmllcywKIAkJCSAgIGNwdWlkLT5uZW50ICogc2l6ZW9mKHN0cnVjdCBrdm1fY3B1aWRfZW50cnkpKSkKIAkJZ290byBvdXRfZnJlZTsKLQl2Y3B1X2xvYWQodmNwdSk7CiAJZm9yIChpID0gMDsgaSA8IGNwdWlkLT5uZW50OyBpKyspIHsKIAkJdmNwdS0+YXJjaC5jcHVpZF9lbnRyaWVzW2ldLmZ1bmN0aW9uID0gY3B1aWRfZW50cmllc1tpXS5mdW5jdGlvbjsKIAkJdmNwdS0+YXJjaC5jcHVpZF9lbnRyaWVzW2ldLmVheCA9IGNwdWlkX2VudHJpZXNbaV0uZWF4OwpAQCAtMTc5OSw3ICsxODg2LDcgQEAKIAlyID0gMDsKIAlrdm1fYXBpY19zZXRfdmVyc2lvbih2Y3B1KTsKIAlrdm1feDg2X29wcy0+Y3B1aWRfdXBkYXRlKHZjcHUpOwotCXZjcHVfcHV0KHZjcHUpOworCXVwZGF0ZV9jcHVpZCh2Y3B1KTsKIAogb3V0X2ZyZWU6CiAJdmZyZWUoY3B1aWRfZW50cmllcyk7CkBAIC0xODIwLDExICsxOTA3LDEwIEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ2Y3B1LT5hcmNoLmNwdWlkX2VudHJpZXMsIGVudHJpZXMsCiAJCQkgICBjcHVpZC0+bmVudCAqIHNpemVvZihzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MikpKQogCQlnb3RvIG91dDsKLQl2Y3B1X2xvYWQodmNwdSk7CiAJdmNwdS0+YXJjaC5jcHVpZF9uZW50ID0gY3B1aWQtPm5lbnQ7CiAJa3ZtX2FwaWNfc2V0X3ZlcnNpb24odmNwdSk7CiAJa3ZtX3g4Nl9vcHMtPmNwdWlkX3VwZGF0ZSh2Y3B1KTsKLQl2Y3B1X3B1dCh2Y3B1KTsKKwl1cGRhdGVfY3B1aWQodmNwdSk7CiAJcmV0dXJuIDA7CiAKIG91dDoKQEAgLTE4MzcsNyArMTkyMyw2IEBACiB7CiAJaW50IHI7CiAKLQl2Y3B1X2xvYWQodmNwdSk7CiAJciA9IC1FMkJJRzsKIAlpZiAoY3B1aWQtPm5lbnQgPCB2Y3B1LT5hcmNoLmNwdWlkX25lbnQpCiAJCWdvdG8gb3V0OwpAQCAtMTg0OSw3ICsxOTM0LDYgQEAKIAogb3V0OgogCWNwdWlkLT5uZW50ID0gdmNwdS0+YXJjaC5jcHVpZF9uZW50OwotCXZjcHVfcHV0KHZjcHUpOwogCXJldHVybiByOwogfQogCkBAIC0xOTAxLDEzICsxOTg1LDEzIEBACiAJCTAgLyogUmVzZXJ2ZWQgKi8gfCBmX2xtIHwgRigzRE5PV0VYVCkgfCBGKDNETk9XKTsKIAkvKiBjcHVpZCAxLmVjeCAqLwogCWNvbnN0IHUzMiBrdm1fc3VwcG9ydGVkX3dvcmQ0X3g4Nl9mZWF0dXJlcyA9Ci0JCUYoWE1NMykgfCAwIC8qIFJlc2VydmVkLCBEVEVTNjQsIE1PTklUT1IgKi8gfAorCQlGKFhNTTMpIHwgRihQQ0xNVUxRRFEpIHwgMCAvKiBEVEVTNjQsIE1PTklUT1IgKi8gfAogCQkwIC8qIERTLUNQTCwgVk1YLCBTTVgsIEVTVCAqLyB8CiAJCTAgLyogVE0yICovIHwgRihTU1NFMykgfCAwIC8qIENOWFQtSUQgKi8gfCAwIC8qIFJlc2VydmVkICovIHwKIAkJMCAvKiBSZXNlcnZlZCAqLyB8IEYoQ1gxNikgfCAwIC8qIHhUUFIgVXBkYXRlLCBQRENNICovIHwKIAkJMCAvKiBSZXNlcnZlZCwgRENBICovIHwgRihYTU00XzEpIHwKIAkJRihYTU00XzIpIHwgRihYMkFQSUMpIHwgRihNT1ZCRSkgfCBGKFBPUENOVCkgfAotCQkwIC8qIFJlc2VydmVkLCBYU0FWRSwgT1NYU0FWRSAqLzsKKwkJMCAvKiBSZXNlcnZlZCwgQUVTICovIHwgRihYU0FWRSkgfCAwIC8qIE9TWFNBVkUgKi8gfCBGKEFWWCk7CiAJLyogY3B1aWQgMHg4MDAwMDAwMS5lY3ggKi8KIAljb25zdCB1MzIga3ZtX3N1cHBvcnRlZF93b3JkNl94ODZfZmVhdHVyZXMgPQogCQlGKExBSEZfTE0pIHwgRihDTVBfTEVHQUNZKSB8IEYoU1ZNKSB8IDAgLyogRXh0QXBpY1NwYWNlICovIHwKQEAgLTE5MjIsNyArMjAwNiw3IEBACiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSAwOgotCQllbnRyeS0+ZWF4ID0gbWluKGVudHJ5LT5lYXgsICh1MzIpMHhiKTsKKwkJZW50cnktPmVheCA9IG1pbihlbnRyeS0+ZWF4LCAodTMyKTB4ZCk7CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJZW50cnktPmVkeCAmPSBrdm1fc3VwcG9ydGVkX3dvcmQwX3g4Nl9mZWF0dXJlczsKQEAgLTE5ODAsNiArMjA2NCwyMCBAQAogCQl9CiAJCWJyZWFrOwogCX0KKwljYXNlIDB4ZDogeworCQlpbnQgaTsKKworCQllbnRyeS0+ZmxhZ3MgfD0gS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWDsKKwkJZm9yIChpID0gMTsgKm5lbnQgPCBtYXhuZW50OyArK2kpIHsKKwkJCWlmIChlbnRyeVtpIC0gMV0uZWF4ID09IDAgJiYgaSAhPSAyKQorCQkJCWJyZWFrOworCQkJZG9fY3B1aWRfMV9lbnQoJmVudHJ5W2ldLCBmdW5jdGlvbiwgaSk7CisJCQllbnRyeVtpXS5mbGFncyB8PQorCQkJICAgICAgIEtWTV9DUFVJRF9GTEFHX1NJR05JRkNBTlRfSU5ERVg7CisJCQkrKypuZW50OworCQl9CisJCWJyZWFrOworCX0KIAljYXNlIEtWTV9DUFVJRF9TSUdOQVRVUkU6IHsKIAkJY2hhciBzaWduYXR1cmVbMTJdID0gIktWTUtWTUtWTVwwXDAiOwogCQl1MzIgKnNpZ3B0ciA9ICh1MzIgKilzaWduYXR1cmU7CkBAIC0yMDgxLDkgKzIxNzksNyBAQAogc3RhdGljIGludCBrdm1fdmNwdV9pb2N0bF9nZXRfbGFwaWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgICBzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlICpzKQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAltZW1jcHkocy0+cmVncywgdmNwdS0+YXJjaC5hcGljLT5yZWdzLCBzaXplb2YgKnMpOwotCXZjcHVfcHV0KHZjcHUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDkxLDExICsyMTg3LDkgQEAKIHN0YXRpYyBpbnQga3ZtX3ZjcHVfaW9jdGxfc2V0X2xhcGljKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgICAgc3RydWN0IGt2bV9sYXBpY19zdGF0ZSAqcykKIHsKLQl2Y3B1X2xvYWQodmNwdSk7CiAJbWVtY3B5KHZjcHUtPmFyY2guYXBpYy0+cmVncywgcy0+cmVncywgc2l6ZW9mICpzKTsKIAlrdm1fYXBpY19wb3N0X3N0YXRlX3Jlc3RvcmUodmNwdSk7CiAJdXBkYXRlX2NyOF9pbnRlcmNlcHQodmNwdSk7Ci0JdmNwdV9wdXQodmNwdSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMDcsMjAgKzIyMDEsMTUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCiAJCXJldHVybiAtRU5YSU87Ci0JdmNwdV9sb2FkKHZjcHUpOwogCiAJa3ZtX3F1ZXVlX2ludGVycnVwdCh2Y3B1LCBpcnEtPmlycSwgZmFsc2UpOwogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBrdm1fdmNwdV9pb2N0bF9ubWkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAlrdm1faW5qZWN0X25taSh2Y3B1KTsKLQl2Y3B1X3B1dCh2Y3B1KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjE0MCw3ICsyMjI5LDYgQEAKIAlpbnQgcjsKIAl1bnNpZ25lZCBiYW5rX251bSA9IG1jZ19jYXAgJiAweGZmLCBiYW5rOwogCi0JdmNwdV9sb2FkKHZjcHUpOwogCXIgPSAtRUlOVkFMOwogCWlmICghYmFua19udW0gfHwgYmFua19udW0gPj0gS1ZNX01BWF9NQ0VfQkFOS1MpCiAJCWdvdG8gb3V0OwpAQCAtMjE1NSw3ICsyMjQzLDYgQEAKIAlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgYmFua19udW07IGJhbmsrKykKIAkJdmNwdS0+YXJjaC5tY2VfYmFua3NbYmFuayo0XSA9IH4odTY0KTA7CiBvdXQ6Ci0JdmNwdV9wdXQodmNwdSk7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTIxODgsNyArMjI3NSw3IEBACiAJCQlwcmludGsoS0VSTl9ERUJVRyAia3ZtOiBzZXRfbWNlOiAiCiAJCQkgICAgICAgImluamVjdHMgbWNlIGV4Y2VwdGlvbiB3aGlsZSAiCiAJCQkgICAgICAgInByZXZpb3VzIG9uZSBpcyBpbiBwcm9ncmVzcyFcbiIpOwotCQkJc2V0X2JpdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgJnZjcHUtPnJlcXVlc3RzKTsKKwkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9UUklQTEVfRkFVTFQsIHZjcHUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKGJhbmtzWzFdICYgTUNJX1NUQVRVU19WQUwpCkBAIC0yMjEzLDggKzIzMDAsNiBAQAogc3RhdGljIHZvaWQga3ZtX3ZjcHVfaW9jdGxfeDg2X2dldF92Y3B1X2V2ZW50cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX3ZjcHVfZXZlbnRzICpldmVudHMpCiB7Ci0JdmNwdV9sb2FkKHZjcHUpOwotCiAJZXZlbnRzLT5leGNlcHRpb24uaW5qZWN0ZWQgPQogCQl2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nICYmCiAJCSFrdm1fZXhjZXB0aW9uX2lzX3NvZnQodmNwdS0+YXJjaC5leGNlcHRpb24ubnIpOwpAQCAtMjIzOSw4ICsyMzI0LDYgQEAKIAlldmVudHMtPmZsYWdzID0gKEtWTV9WQ1BVRVZFTlRfVkFMSURfTk1JX1BFTkRJTkcKIAkJCSB8IEtWTV9WQ1BVRVZFTlRfVkFMSURfU0lQSV9WRUNUT1IKIAkJCSB8IEtWTV9WQ1BVRVZFTlRfVkFMSURfU0hBRE9XKTsKLQotCXZjcHVfcHV0KHZjcHUpOwogfQogCiBzdGF0aWMgaW50IGt2bV92Y3B1X2lvY3RsX3g4Nl9zZXRfdmNwdV9ldmVudHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LApAQCAtMjI1MSw4ICsyMzM0LDYgQEAKIAkJCSAgICAgIHwgS1ZNX1ZDUFVFVkVOVF9WQUxJRF9TSEFET1cpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogCXZjcHUtPmFyY2guZXhjZXB0aW9uLnBlbmRpbmcgPSBldmVudHMtPmV4Y2VwdGlvbi5pbmplY3RlZDsKIAl2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5uciA9IGV2ZW50cy0+ZXhjZXB0aW9uLm5yOwogCXZjcHUtPmFyY2guZXhjZXB0aW9uLmhhc19lcnJvcl9jb2RlID0gZXZlbnRzLT5leGNlcHRpb24uaGFzX2Vycm9yX2NvZGU7CkBAIC0yMjc1LDIyICsyMzU2LDE2IEBACiAJaWYgKGV2ZW50cy0+ZmxhZ3MgJiBLVk1fVkNQVUVWRU5UX1ZBTElEX1NJUElfVkVDVE9SKQogCQl2Y3B1LT5hcmNoLnNpcGlfdmVjdG9yID0gZXZlbnRzLT5zaXBpX3ZlY3RvcjsKIAotCXZjcHVfcHV0KHZjcHUpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV92Y3B1X2lvY3RsX3g4Nl9nZXRfZGVidWdyZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkJICAgICBzdHJ1Y3Qga3ZtX2RlYnVncmVncyAqZGJncmVncykKIHsKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAltZW1jcHkoZGJncmVncy0+ZGIsIHZjcHUtPmFyY2guZGIsIHNpemVvZih2Y3B1LT5hcmNoLmRiKSk7CiAJZGJncmVncy0+ZHI2ID0gdmNwdS0+YXJjaC5kcjY7CiAJZGJncmVncy0+ZHI3ID0gdmNwdS0+YXJjaC5kcjc7CiAJZGJncmVncy0+ZmxhZ3MgPSAwOwotCi0JdmNwdV9wdXQodmNwdSk7CiB9CiAKIHN0YXRpYyBpbnQga3ZtX3ZjcHVfaW9jdGxfeDg2X3NldF9kZWJ1Z3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LApAQCAtMjI5OSw0MCArMjM3NCwxMTMgQEAKIAlpZiAoZGJncmVncy0+ZmxhZ3MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdmNwdV9sb2FkKHZjcHUpOwotCiAJbWVtY3B5KHZjcHUtPmFyY2guZGIsIGRiZ3JlZ3MtPmRiLCBzaXplb2YodmNwdS0+YXJjaC5kYikpOwogCXZjcHUtPmFyY2guZHI2ID0gZGJncmVncy0+ZHI2OwogCXZjcHUtPmFyY2guZHI3ID0gZGJncmVncy0+ZHI3OwogCi0JdmNwdV9wdXQodmNwdSk7Ci0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQga3ZtX3ZjcHVfaW9jdGxfeDg2X2dldF94c2F2ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJCSBzdHJ1Y3Qga3ZtX3hzYXZlICpndWVzdF94c2F2ZSkKK3sKKwlpZiAoY3B1X2hhc194c2F2ZSkKKwkJbWVtY3B5KGd1ZXN0X3hzYXZlLT5yZWdpb24sCisJCQkmdmNwdS0+YXJjaC5ndWVzdF9mcHUuc3RhdGUtPnhzYXZlLAorCQkJc2l6ZW9mKHN0cnVjdCB4c2F2ZV9zdHJ1Y3QpKTsKKwllbHNlIHsKKwkJbWVtY3B5KGd1ZXN0X3hzYXZlLT5yZWdpb24sCisJCQkmdmNwdS0+YXJjaC5ndWVzdF9mcHUuc3RhdGUtPmZ4c2F2ZSwKKwkJCXNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSk7CisJCSoodTY0ICopJmd1ZXN0X3hzYXZlLT5yZWdpb25bWFNBVkVfSERSX09GRlNFVCAvIHNpemVvZih1MzIpXSA9CisJCQlYU1RBVEVfRlBTU0U7CisJfQorfQorCitzdGF0aWMgaW50IGt2bV92Y3B1X2lvY3RsX3g4Nl9zZXRfeHNhdmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQlzdHJ1Y3Qga3ZtX3hzYXZlICpndWVzdF94c2F2ZSkKK3sKKwl1NjQgeHN0YXRlX2J2ID0KKwkJKih1NjQgKikmZ3Vlc3RfeHNhdmUtPnJlZ2lvbltYU0FWRV9IRFJfT0ZGU0VUIC8gc2l6ZW9mKHUzMildOworCisJaWYgKGNwdV9oYXNfeHNhdmUpCisJCW1lbWNweSgmdmNwdS0+YXJjaC5ndWVzdF9mcHUuc3RhdGUtPnhzYXZlLAorCQkJZ3Vlc3RfeHNhdmUtPnJlZ2lvbiwgc2l6ZW9mKHN0cnVjdCB4c2F2ZV9zdHJ1Y3QpKTsKKwllbHNlIHsKKwkJaWYgKHhzdGF0ZV9idiAmIH5YU1RBVEVfRlBTU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtY3B5KCZ2Y3B1LT5hcmNoLmd1ZXN0X2ZwdS5zdGF0ZS0+ZnhzYXZlLAorCQkJZ3Vlc3RfeHNhdmUtPnJlZ2lvbiwgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV92Y3B1X2lvY3RsX3g4Nl9nZXRfeGNycyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJCXN0cnVjdCBrdm1feGNycyAqZ3Vlc3RfeGNycykKK3sKKwlpZiAoIWNwdV9oYXNfeHNhdmUpIHsKKwkJZ3Vlc3RfeGNycy0+bnJfeGNycyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlndWVzdF94Y3JzLT5ucl94Y3JzID0gMTsKKwlndWVzdF94Y3JzLT5mbGFncyA9IDA7CisJZ3Vlc3RfeGNycy0+eGNyc1swXS54Y3IgPSBYQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLOworCWd1ZXN0X3hjcnMtPnhjcnNbMF0udmFsdWUgPSB2Y3B1LT5hcmNoLnhjcjA7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3ZjcHVfaW9jdGxfeDg2X3NldF94Y3JzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgICAgc3RydWN0IGt2bV94Y3JzICpndWVzdF94Y3JzKQoreworCWludCBpLCByID0gMDsKKworCWlmICghY3B1X2hhc194c2F2ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ3Vlc3RfeGNycy0+bnJfeGNycyA+IEtWTV9NQVhfWENSUyB8fCBndWVzdF94Y3JzLT5mbGFncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3Vlc3RfeGNycy0+bnJfeGNyczsgaSsrKQorCQkvKiBPbmx5IHN1cHBvcnQgWENSMCBjdXJyZW50bHkgKi8KKwkJaWYgKGd1ZXN0X3hjcnMtPnhjcnNbMF0ueGNyID09IFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0spIHsKKwkJCXIgPSBfX2t2bV9zZXRfeGNyKHZjcHUsIFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0ssCisJCQkJZ3Vlc3RfeGNycy0+eGNyc1swXS52YWx1ZSk7CisJCQlicmVhazsKKwkJfQorCWlmIChyKQorCQlyID0gLUVJTlZBTDsKKwlyZXR1cm4gcjsKK30KKwogbG9uZyBrdm1fYXJjaF92Y3B1X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBpb2N0bCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCByOwotCXN0cnVjdCBrdm1fbGFwaWNfc3RhdGUgKmxhcGljID0gTlVMTDsKKwl1bmlvbiB7CisJCXN0cnVjdCBrdm1fbGFwaWNfc3RhdGUgKmxhcGljOworCQlzdHJ1Y3Qga3ZtX3hzYXZlICp4c2F2ZTsKKwkJc3RydWN0IGt2bV94Y3JzICp4Y3JzOworCQl2b2lkICpidWZmZXI7CisJfSB1OwogCisJdS5idWZmZXIgPSBOVUxMOwogCXN3aXRjaCAoaW9jdGwpIHsKIAljYXNlIEtWTV9HRVRfTEFQSUM6IHsKIAkJciA9IC1FSU5WQUw7CiAJCWlmICghdmNwdS0+YXJjaC5hcGljKQogCQkJZ290byBvdXQ7Ci0JCWxhcGljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9sYXBpY19zdGF0ZSksIEdGUF9LRVJORUwpOworCQl1LmxhcGljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9sYXBpY19zdGF0ZSksIEdGUF9LRVJORUwpOwogCiAJCXIgPSAtRU5PTUVNOwotCQlpZiAoIWxhcGljKQorCQlpZiAoIXUubGFwaWMpCiAJCQlnb3RvIG91dDsKLQkJciA9IGt2bV92Y3B1X2lvY3RsX2dldF9sYXBpYyh2Y3B1LCBsYXBpYyk7CisJCXIgPSBrdm1fdmNwdV9pb2N0bF9nZXRfbGFwaWModmNwdSwgdS5sYXBpYyk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGxhcGljLCBzaXplb2Yoc3RydWN0IGt2bV9sYXBpY19zdGF0ZSkpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIHUubGFwaWMsIHNpemVvZihzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlKSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMjM0MSwxNCArMjQ4OSwxNCBAQAogCQlyID0gLUVJTlZBTDsKIAkJaWYgKCF2Y3B1LT5hcmNoLmFwaWMpCiAJCQlnb3RvIG91dDsKLQkJbGFwaWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCXUubGFwaWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJCXIgPSAtRU5PTUVNOwotCQlpZiAoIWxhcGljKQorCQlpZiAoIXUubGFwaWMpCiAJCQlnb3RvIG91dDsKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihsYXBpYywgYXJncCwgc2l6ZW9mKHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHUubGFwaWMsIGFyZ3AsIHNpemVvZihzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlKSkpCiAJCQlnb3RvIG91dDsKLQkJciA9IGt2bV92Y3B1X2lvY3RsX3NldF9sYXBpYyh2Y3B1LCBsYXBpYyk7CisJCXIgPSBrdm1fdmNwdV9pb2N0bF9zZXRfbGFwaWModmNwdSwgdS5sYXBpYyk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAwOwpAQCAtMjQ2NCw5ICsyNjEyLDcgQEAKIAkJciA9IC1FRkFVTFQ7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmbWNlLCBhcmdwLCBzaXplb2YgbWNlKSkKIAkJCWdvdG8gb3V0OwotCQl2Y3B1X2xvYWQodmNwdSk7CiAJCXIgPSBrdm1fdmNwdV9pb2N0bF94ODZfc2V0X21jZSh2Y3B1LCAmbWNlKTsKLQkJdmNwdV9wdXQodmNwdSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9HRVRfVkNQVV9FVkVOVFM6IHsKQEAgLTI1MTMsMTEgKzI2NTksNjcgQEAKIAkJciA9IGt2bV92Y3B1X2lvY3RsX3g4Nl9zZXRfZGVidWdyZWdzKHZjcHUsICZkYmdyZWdzKTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgS1ZNX0dFVF9YU0FWRTogeworCQl1LnhzYXZlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV94c2F2ZSksIEdGUF9LRVJORUwpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKCF1LnhzYXZlKQorCQkJYnJlYWs7CisKKwkJa3ZtX3ZjcHVfaW9jdGxfeDg2X2dldF94c2F2ZSh2Y3B1LCB1LnhzYXZlKTsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB1LnhzYXZlLCBzaXplb2Yoc3RydWN0IGt2bV94c2F2ZSkpKQorCQkJYnJlYWs7CisJCXIgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBLVk1fU0VUX1hTQVZFOiB7CisJCXUueHNhdmUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX3hzYXZlKSwgR0ZQX0tFUk5FTCk7CisJCXIgPSAtRU5PTUVNOworCQlpZiAoIXUueHNhdmUpCisJCQlicmVhazsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHUueHNhdmUsIGFyZ3AsIHNpemVvZihzdHJ1Y3Qga3ZtX3hzYXZlKSkpCisJCQlicmVhazsKKworCQlyID0ga3ZtX3ZjcHVfaW9jdGxfeDg2X3NldF94c2F2ZSh2Y3B1LCB1LnhzYXZlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX0dFVF9YQ1JTOiB7CisJCXUueGNycyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1feGNycyksIEdGUF9LRVJORUwpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKCF1LnhjcnMpCisJCQlicmVhazsKKworCQlrdm1fdmNwdV9pb2N0bF94ODZfZ2V0X3hjcnModmNwdSwgdS54Y3JzKTsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB1LnhjcnMsCisJCQkJIHNpemVvZihzdHJ1Y3Qga3ZtX3hjcnMpKSkKKwkJCWJyZWFrOworCQlyID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX1NFVF9YQ1JTOiB7CisJCXUueGNycyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1feGNycyksIEdGUF9LRVJORUwpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKCF1LnhjcnMpCisJCQlicmVhazsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHUueGNycywgYXJncCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGt2bV94Y3JzKSkpCisJCQlicmVhazsKKworCQlyID0ga3ZtX3ZjcHVfaW9jdGxfeDg2X3NldF94Y3JzKHZjcHUsIHUueGNycyk7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlyID0gLUVJTlZBTDsKIAl9CiBvdXQ6Ci0Ja2ZyZWUobGFwaWMpOworCWtmcmVlKHUuYnVmZmVyKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMjU2MCwxMTUgKzI3NjIsNiBAQAogCXJldHVybiBrdm0tPmFyY2gubl9hbGxvY19tbXVfcGFnZXM7CiB9CiAKLWdmbl90IHVuYWxpYXNfZ2ZuX2luc3RhbnRpYXRpb24oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGt2bV9tZW1fYWxpYXMgKmFsaWFzOwotCXN0cnVjdCBrdm1fbWVtX2FsaWFzZXMgKmFsaWFzZXM7Ci0KLQlhbGlhc2VzID0ga3ZtX2FsaWFzZXMoa3ZtKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhbGlhc2VzLT5uYWxpYXNlczsgKytpKSB7Ci0JCWFsaWFzID0gJmFsaWFzZXMtPmFsaWFzZXNbaV07Ci0JCWlmIChhbGlhcy0+ZmxhZ3MgJiBLVk1fQUxJQVNfSU5WQUxJRCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZ2ZuID49IGFsaWFzLT5iYXNlX2dmbgotCQkgICAgJiYgZ2ZuIDwgYWxpYXMtPmJhc2VfZ2ZuICsgYWxpYXMtPm5wYWdlcykKLQkJCXJldHVybiBhbGlhcy0+dGFyZ2V0X2dmbiArIGdmbiAtIGFsaWFzLT5iYXNlX2dmbjsKLQl9Ci0JcmV0dXJuIGdmbjsKLX0KLQotZ2ZuX3QgdW5hbGlhc19nZm4oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGt2bV9tZW1fYWxpYXMgKmFsaWFzOwotCXN0cnVjdCBrdm1fbWVtX2FsaWFzZXMgKmFsaWFzZXM7Ci0KLQlhbGlhc2VzID0ga3ZtX2FsaWFzZXMoa3ZtKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhbGlhc2VzLT5uYWxpYXNlczsgKytpKSB7Ci0JCWFsaWFzID0gJmFsaWFzZXMtPmFsaWFzZXNbaV07Ci0JCWlmIChnZm4gPj0gYWxpYXMtPmJhc2VfZ2ZuCi0JCSAgICAmJiBnZm4gPCBhbGlhcy0+YmFzZV9nZm4gKyBhbGlhcy0+bnBhZ2VzKQotCQkJcmV0dXJuIGFsaWFzLT50YXJnZXRfZ2ZuICsgZ2ZuIC0gYWxpYXMtPmJhc2VfZ2ZuOwotCX0KLQlyZXR1cm4gZ2ZuOwotfQotCi0vKgotICogU2V0IGEgbmV3IGFsaWFzIHJlZ2lvbi4gIEFsaWFzZXMgbWFwIGEgcG9ydGlvbiBvZiBwaHlzaWNhbCBtZW1vcnkgaW50bwotICogYW5vdGhlciBwb3J0aW9uLiAgVGhpcyBpcyB1c2VmdWwgZm9yIG1lbW9yeSB3aW5kb3dzLCBmb3IgZXhhbXBsZSB0aGUgUEMKLSAqIFZHQSByZWdpb24uCi0gKi8KLXN0YXRpYyBpbnQga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfYWxpYXMoc3RydWN0IGt2bSAqa3ZtLAotCQkJCQkgc3RydWN0IGt2bV9tZW1vcnlfYWxpYXMgKmFsaWFzKQotewotCWludCByLCBuOwotCXN0cnVjdCBrdm1fbWVtX2FsaWFzICpwOwotCXN0cnVjdCBrdm1fbWVtX2FsaWFzZXMgKmFsaWFzZXMsICpvbGRfYWxpYXNlczsKLQotCXIgPSAtRUlOVkFMOwotCS8qIEdlbmVyYWwgc2FuaXR5IGNoZWNrcyAqLwotCWlmIChhbGlhcy0+bWVtb3J5X3NpemUgJiAoUEFHRV9TSVpFIC0gMSkpCi0JCWdvdG8gb3V0OwotCWlmIChhbGlhcy0+Z3Vlc3RfcGh5c19hZGRyICYgKFBBR0VfU0laRSAtIDEpKQotCQlnb3RvIG91dDsKLQlpZiAoYWxpYXMtPnNsb3QgPj0gS1ZNX0FMSUFTX1NMT1RTKQotCQlnb3RvIG91dDsKLQlpZiAoYWxpYXMtPmd1ZXN0X3BoeXNfYWRkciArIGFsaWFzLT5tZW1vcnlfc2l6ZQotCSAgICA8IGFsaWFzLT5ndWVzdF9waHlzX2FkZHIpCi0JCWdvdG8gb3V0OwotCWlmIChhbGlhcy0+dGFyZ2V0X3BoeXNfYWRkciArIGFsaWFzLT5tZW1vcnlfc2l6ZQotCSAgICA8IGFsaWFzLT50YXJnZXRfcGh5c19hZGRyKQotCQlnb3RvIG91dDsKLQotCXIgPSAtRU5PTUVNOwotCWFsaWFzZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX21lbV9hbGlhc2VzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhbGlhc2VzKQotCQlnb3RvIG91dDsKLQotCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7Ci0KLQkvKiBpbnZhbGlkYXRlIGFueSBnZm4gcmVmZXJlbmNlIGluIGNhc2Ugb2YgZGVsZXRpb24vc2hyaW5raW5nICovCi0JbWVtY3B5KGFsaWFzZXMsIGt2bS0+YXJjaC5hbGlhc2VzLCBzaXplb2Yoc3RydWN0IGt2bV9tZW1fYWxpYXNlcykpOwotCWFsaWFzZXMtPmFsaWFzZXNbYWxpYXMtPnNsb3RdLmZsYWdzIHw9IEtWTV9BTElBU19JTlZBTElEOwotCW9sZF9hbGlhc2VzID0ga3ZtLT5hcmNoLmFsaWFzZXM7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGt2bS0+YXJjaC5hbGlhc2VzLCBhbGlhc2VzKTsKLQlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZCgma3ZtLT5zcmN1KTsKLQlrdm1fbW11X3phcF9hbGwoa3ZtKTsKLQlrZnJlZShvbGRfYWxpYXNlcyk7Ci0KLQlyID0gLUVOT01FTTsKLQlhbGlhc2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9tZW1fYWxpYXNlcyksIEdGUF9LRVJORUwpOwotCWlmICghYWxpYXNlcykKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JbWVtY3B5KGFsaWFzZXMsIGt2bS0+YXJjaC5hbGlhc2VzLCBzaXplb2Yoc3RydWN0IGt2bV9tZW1fYWxpYXNlcykpOwotCi0JcCA9ICZhbGlhc2VzLT5hbGlhc2VzW2FsaWFzLT5zbG90XTsKLQlwLT5iYXNlX2dmbiA9IGFsaWFzLT5ndWVzdF9waHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKLQlwLT5ucGFnZXMgPSBhbGlhcy0+bWVtb3J5X3NpemUgPj4gUEFHRV9TSElGVDsKLQlwLT50YXJnZXRfZ2ZuID0gYWxpYXMtPnRhcmdldF9waHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKLQlwLT5mbGFncyAmPSB+KEtWTV9BTElBU19JTlZBTElEKTsKLQotCWZvciAobiA9IEtWTV9BTElBU19TTE9UUzsgbiA+IDA7IC0tbikKLQkJaWYgKGFsaWFzZXMtPmFsaWFzZXNbbiAtIDFdLm5wYWdlcykKLQkJCWJyZWFrOwotCWFsaWFzZXMtPm5hbGlhc2VzID0gbjsKLQotCW9sZF9hbGlhc2VzID0ga3ZtLT5hcmNoLmFsaWFzZXM7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGt2bS0+YXJjaC5hbGlhc2VzLCBhbGlhc2VzKTsKLQlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZCgma3ZtLT5zcmN1KTsKLQlrZnJlZShvbGRfYWxpYXNlcyk7Ci0JciA9IDA7Ci0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwotb3V0OgotCXJldHVybiByOwotfQotCiBzdGF0aWMgaW50IGt2bV92bV9pb2N0bF9nZXRfaXJxY2hpcChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1faXJxY2hpcCAqY2hpcCkKIHsKIAlpbnQgcjsKQEAgLTI3OTcsNyArMjg5MCw2IEBACiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDsKIAl1bnNpZ25lZCBsb25nIG47CiAJdW5zaWduZWQgbG9uZyBpc19kaXJ0eSA9IDA7Ci0JdW5zaWduZWQgbG9uZyAqZGlydHlfYml0bWFwID0gTlVMTDsKIAogCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7CiAKQEAgLTI4MTIsMjcgKzI5MDQsMzAgQEAKIAogCW4gPSBrdm1fZGlydHlfYml0bWFwX2J5dGVzKG1lbXNsb3QpOwogCi0JciA9IC1FTk9NRU07Ci0JZGlydHlfYml0bWFwID0gdm1hbGxvYyhuKTsKLQlpZiAoIWRpcnR5X2JpdG1hcCkKLQkJZ290byBvdXQ7Ci0JbWVtc2V0KGRpcnR5X2JpdG1hcCwgMCwgbik7Ci0KIAlmb3IgKGkgPSAwOyAhaXNfZGlydHkgJiYgaSA8IG4vc2l6ZW9mKGxvbmcpOyBpKyspCiAJCWlzX2RpcnR5ID0gbWVtc2xvdC0+ZGlydHlfYml0bWFwW2ldOwogCiAJLyogSWYgbm90aGluZyBpcyBkaXJ0eSwgZG9uJ3QgYm90aGVyIG1lc3Npbmcgd2l0aCBwYWdlIHRhYmxlcy4gKi8KIAlpZiAoaXNfZGlydHkpIHsKIAkJc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsICpvbGRfc2xvdHM7CisJCXVuc2lnbmVkIGxvbmcgKmRpcnR5X2JpdG1hcDsKIAogCQlzcGluX2xvY2soJmt2bS0+bW11X2xvY2spOwogCQlrdm1fbW11X3Nsb3RfcmVtb3ZlX3dyaXRlX2FjY2Vzcyhrdm0sIGxvZy0+c2xvdCk7CiAJCXNwaW5fdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKIAotCQlzbG90cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fbWVtc2xvdHMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzbG90cykKLQkJCWdvdG8gb3V0X2ZyZWU7CisJCXIgPSAtRU5PTUVNOworCQlkaXJ0eV9iaXRtYXAgPSB2bWFsbG9jKG4pOworCQlpZiAoIWRpcnR5X2JpdG1hcCkKKwkJCWdvdG8gb3V0OworCQltZW1zZXQoZGlydHlfYml0bWFwLCAwLCBuKTsKIAorCQlyID0gLUVOT01FTTsKKwkJc2xvdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2xvdHMpIHsKKwkJCXZmcmVlKGRpcnR5X2JpdG1hcCk7CisJCQlnb3RvIG91dDsKKwkJfQogCQltZW1jcHkoc2xvdHMsIGt2bS0+bWVtc2xvdHMsIHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSk7CiAJCXNsb3RzLT5tZW1zbG90c1tsb2ctPnNsb3RdLmRpcnR5X2JpdG1hcCA9IGRpcnR5X2JpdG1hcDsKIApAQCAtMjg0MSwxMyArMjkzNiwyMCBAQAogCQlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZCgma3ZtLT5zcmN1KTsKIAkJZGlydHlfYml0bWFwID0gb2xkX3Nsb3RzLT5tZW1zbG90c1tsb2ctPnNsb3RdLmRpcnR5X2JpdG1hcDsKIAkJa2ZyZWUob2xkX3Nsb3RzKTsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihsb2ctPmRpcnR5X2JpdG1hcCwgZGlydHlfYml0bWFwLCBuKSkgeworCQkJdmZyZWUoZGlydHlfYml0bWFwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXZmcmVlKGRpcnR5X2JpdG1hcCk7CisJfSBlbHNlIHsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjbGVhcl91c2VyKGxvZy0+ZGlydHlfYml0bWFwLCBuKSkKKwkJCWdvdG8gb3V0OwogCX0KIAogCXIgPSAwOwotCWlmIChjb3B5X3RvX3VzZXIobG9nLT5kaXJ0eV9iaXRtYXAsIGRpcnR5X2JpdG1hcCwgbikpCi0JCXIgPSAtRUZBVUxUOwotb3V0X2ZyZWU6Ci0JdmZyZWUoZGlydHlfYml0bWFwKTsKIG91dDoKIAltdXRleF91bmxvY2soJmt2bS0+c2xvdHNfbG9jayk7CiAJcmV0dXJuIHI7CkBAIC0yODY3LDcgKzI5NjksNiBAQAogCXVuaW9uIHsKIAkJc3RydWN0IGt2bV9waXRfc3RhdGUgcHM7CiAJCXN0cnVjdCBrdm1fcGl0X3N0YXRlMiBwczI7Ci0JCXN0cnVjdCBrdm1fbWVtb3J5X2FsaWFzIGFsaWFzOwogCQlzdHJ1Y3Qga3ZtX3BpdF9jb25maWcgcGl0X2NvbmZpZzsKIAl9IHU7CiAKQEAgLTI4ODgsMjIgKzI5ODksNiBAQAogCQkJZ290byBvdXQ7CiAJCWJyZWFrOwogCX0KLQljYXNlIEtWTV9TRVRfTUVNT1JZX1JFR0lPTjogewotCQlzdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24ga3ZtX21lbTsKLQkJc3RydWN0IGt2bV91c2Vyc3BhY2VfbWVtb3J5X3JlZ2lvbiBrdm1fdXNlcnNwYWNlX21lbTsKLQotCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fbWVtLCBhcmdwLCBzaXplb2Yga3ZtX21lbSkpCi0JCQlnb3RvIG91dDsKLQkJa3ZtX3VzZXJzcGFjZV9tZW0uc2xvdCA9IGt2bV9tZW0uc2xvdDsKLQkJa3ZtX3VzZXJzcGFjZV9tZW0uZmxhZ3MgPSBrdm1fbWVtLmZsYWdzOwotCQlrdm1fdXNlcnNwYWNlX21lbS5ndWVzdF9waHlzX2FkZHIgPSBrdm1fbWVtLmd1ZXN0X3BoeXNfYWRkcjsKLQkJa3ZtX3VzZXJzcGFjZV9tZW0ubWVtb3J5X3NpemUgPSBrdm1fbWVtLm1lbW9yeV9zaXplOwotCQlyID0ga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uKGt2bSwgJmt2bV91c2Vyc3BhY2VfbWVtLCAwKTsKLQkJaWYgKHIpCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgS1ZNX1NFVF9OUl9NTVVfUEFHRVM6CiAJCXIgPSBrdm1fdm1faW9jdGxfc2V0X25yX21tdV9wYWdlcyhrdm0sIGFyZyk7CiAJCWlmIChyKQpAQCAtMjkxMiwxNCArMjk5Nyw2IEBACiAJY2FzZSBLVk1fR0VUX05SX01NVV9QQUdFUzoKIAkJciA9IGt2bV92bV9pb2N0bF9nZXRfbnJfbW11X3BhZ2VzKGt2bSk7CiAJCWJyZWFrOwotCWNhc2UgS1ZNX1NFVF9NRU1PUllfQUxJQVM6Ci0JCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnUuYWxpYXMsIGFyZ3AsIHNpemVvZihzdHJ1Y3Qga3ZtX21lbW9yeV9hbGlhcykpKQotCQkJZ290byBvdXQ7Ci0JCXIgPSBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9hbGlhcyhrdm0sICZ1LmFsaWFzKTsKLQkJaWYgKHIpCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7CiAJY2FzZSBLVk1fQ1JFQVRFX0lSUUNISVA6IHsKIAkJc3RydWN0IGt2bV9waWMgKnZwaWM7CiAKQEAgLTMyNTksNyArMzMzNiw3IEBACiAJCX0KIAkJcmV0ID0ga3ZtX3JlYWRfZ3Vlc3QodmNwdS0+a3ZtLCBncGEsIGRhdGEsIHRvcmVhZCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlyID0gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJCQlyID0gWDg2RU1VTF9JT19ORUVERUQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0zMzE1LDcgKzMzOTIsNyBAQAogCQl9CiAJCXJldCA9IGt2bV93cml0ZV9ndWVzdCh2Y3B1LT5rdm0sIGdwYSwgZGF0YSwgdG93cml0ZSk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlyID0gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJCQlyID0gWDg2RU1VTF9JT19ORUVERUQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0zMzMwLDEwICszNDA3LDEwIEBACiBzdGF0aWMgaW50IGVtdWxhdG9yX3JlYWRfZW11bGF0ZWQodW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgdm9pZCAqdmFsLAogCQkJCSAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCSAgdW5zaWduZWQgaW50ICplcnJvcl9jb2RlLAogCQkJCSAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWdwYV90ICAgICAgICAgICAgICAgICBncGE7Ci0JdTMyIGVycm9yX2NvZGU7CiAKIAlpZiAodmNwdS0+bW1pb19yZWFkX2NvbXBsZXRlZCkgewogCQltZW1jcHkodmFsLCB2Y3B1LT5tbWlvX2RhdGEsIGJ5dGVzKTsKQEAgLTMzNDMsMTIgKzM0MjAsMTAgQEAKIAkJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiAJfQogCi0JZ3BhID0ga3ZtX21tdV9ndmFfdG9fZ3BhX3JlYWQodmNwdSwgYWRkciwgJmVycm9yX2NvZGUpOworCWdwYSA9IGt2bV9tbXVfZ3ZhX3RvX2dwYV9yZWFkKHZjcHUsIGFkZHIsIGVycm9yX2NvZGUpOwogCi0JaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpIHsKLQkJa3ZtX2luamVjdF9wYWdlX2ZhdWx0KHZjcHUsIGFkZHIsIGVycm9yX2NvZGUpOworCWlmIChncGEgPT0gVU5NQVBQRURfR1ZBKQogCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0JfQogCiAJLyogRm9yIEFQSUMgYWNjZXNzIHZtZXhpdCAqLwogCWlmICgoZ3BhICYgUEFHRV9NQVNLKSA9PSBBUElDX0RFRkFVTFRfUEhZU19CQVNFKQpAQCAtMzM3MCwxMSArMzQ0NSwxMiBAQAogCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1JFQURfVU5TQVRJU0ZJRUQsIGJ5dGVzLCBncGEsIDApOwogCiAJdmNwdS0+bW1pb19uZWVkZWQgPSAxOwotCXZjcHUtPm1taW9fcGh5c19hZGRyID0gZ3BhOwotCXZjcHUtPm1taW9fc2l6ZSA9IGJ5dGVzOwotCXZjcHUtPm1taW9faXNfd3JpdGUgPSAwOworCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9NTUlPOworCXZjcHUtPnJ1bi0+bW1pby5waHlzX2FkZHIgPSB2Y3B1LT5tbWlvX3BoeXNfYWRkciA9IGdwYTsKKwl2Y3B1LT5ydW4tPm1taW8ubGVuID0gdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7CisJdmNwdS0+cnVuLT5tbWlvLmlzX3dyaXRlID0gdmNwdS0+bW1pb19pc193cml0ZSA9IDA7CiAKLQlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJcmV0dXJuIFg4NkVNVUxfSU9fTkVFREVEOwogfQogCiBpbnQgZW11bGF0b3Jfd3JpdGVfcGh5cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKQEAgLTMzOTIsMTcgKzM0NjgsMTUgQEAKIHN0YXRpYyBpbnQgZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWRfb25lcGFnZSh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJCSAgIGNvbnN0IHZvaWQgKnZhbCwKIAkJCQkJICAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKmVycm9yX2NvZGUsCiAJCQkJCSAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlncGFfdCAgICAgICAgICAgICAgICAgZ3BhOwotCXUzMiBlcnJvcl9jb2RlOwogCi0JZ3BhID0ga3ZtX21tdV9ndmFfdG9fZ3BhX3dyaXRlKHZjcHUsIGFkZHIsICZlcnJvcl9jb2RlKTsKKwlncGEgPSBrdm1fbW11X2d2YV90b19ncGFfd3JpdGUodmNwdSwgYWRkciwgZXJyb3JfY29kZSk7CiAKLQlpZiAoZ3BhID09IFVOTUFQUEVEX0dWQSkgewotCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQodmNwdSwgYWRkciwgZXJyb3JfY29kZSk7CisJaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpCiAJCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQl9CiAKIAkvKiBGb3IgQVBJQyBhY2Nlc3Mgdm1leGl0ICovCiAJaWYgKChncGEgJiBQQUdFX01BU0spID09IEFQSUNfREVGQVVMVF9QSFlTX0JBU0UpCkBAIC0zNDIwLDEwICszNDk0LDExIEBACiAJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogCiAJdmNwdS0+bW1pb19uZWVkZWQgPSAxOwotCXZjcHUtPm1taW9fcGh5c19hZGRyID0gZ3BhOwotCXZjcHUtPm1taW9fc2l6ZSA9IGJ5dGVzOwotCXZjcHUtPm1taW9faXNfd3JpdGUgPSAxOwotCW1lbWNweSh2Y3B1LT5tbWlvX2RhdGEsIHZhbCwgYnl0ZXMpOworCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9NTUlPOworCXZjcHUtPnJ1bi0+bW1pby5waHlzX2FkZHIgPSB2Y3B1LT5tbWlvX3BoeXNfYWRkciA9IGdwYTsKKwl2Y3B1LT5ydW4tPm1taW8ubGVuID0gdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7CisJdmNwdS0+cnVuLT5tbWlvLmlzX3dyaXRlID0gdmNwdS0+bW1pb19pc193cml0ZSA9IDE7CisJbWVtY3B5KHZjcHUtPnJ1bi0+bW1pby5kYXRhLCB2YWwsIGJ5dGVzKTsKIAogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQpAQCAtMzQzMSw2ICszNTA2LDcgQEAKIGludCBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZCh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgY29uc3Qgdm9pZCAqdmFsLAogCQkJICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmVycm9yX2NvZGUsCiAJCQkgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCS8qIENyb3NzaW5nIGEgcGFnZSBib3VuZGFyeT8gKi8KQEAgLTM0MzgsMTYgKzM1MTQsMTcgQEAKIAkJaW50IHJjLCBub3c7CiAKIAkJbm93ID0gLWFkZHIgJiB+UEFHRV9NQVNLOwotCQlyYyA9IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBub3csIHZjcHUpOworCQlyYyA9IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBub3csIGVycm9yX2NvZGUsCisJCQkJCQkgICAgIHZjcHUpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAkJYWRkciArPSBub3c7CiAJCXZhbCArPSBub3c7CiAJCWJ5dGVzIC09IG5vdzsKIAl9Ci0JcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBieXRlcywgdmNwdSk7CisJcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBieXRlcywgZXJyb3JfY29kZSwKKwkJCQkJICAgICAgIHZjcHUpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQpOwogCiAjZGVmaW5lIENNUFhDSEdfVFlQRSh0LCBwdHIsIG9sZCwgbmV3KSBcCiAJKGNtcHhjaGcoKHQgKikocHRyKSwgKih0ICopKG9sZCksICoodCAqKShuZXcpKSA9PSAqKHQgKikob2xkKSkKQEAgLTM0NjMsNiArMzU0MCw3IEBACiAJCQkJICAgICBjb25zdCB2b2lkICpvbGQsCiAJCQkJICAgICBjb25zdCB2b2lkICpuZXcsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmVycm9yX2NvZGUsCiAJCQkJICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJZ3BhX3QgZ3BhOwpAQCAtMzQ4NCw2ICszNTYyLDEwIEBACiAJCWdvdG8gZW11bF93cml0ZTsKIAogCXBhZ2UgPSBnZm5fdG9fcGFnZSh2Y3B1LT5rdm0sIGdwYSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoaXNfZXJyb3JfcGFnZShwYWdlKSkgeworCQlrdm1fcmVsZWFzZV9wYWdlX2NsZWFuKHBhZ2UpOworCQlnb3RvIGVtdWxfd3JpdGU7CisJfQogCiAJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJa2FkZHIgKz0gb2Zmc2V0X2luX3BhZ2UoZ3BhKTsKQEAgLTM1MTYsNyArMzU5OCw3IEBACiBlbXVsX3dyaXRlOgogCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAia3ZtOiBlbXVsYXRpbmcgZXhjaGFuZ2UgYXMgd3JpdGVcbiIpOwogCi0JcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkKGFkZHIsIG5ldywgYnl0ZXMsIHZjcHUpOworCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChhZGRyLCBuZXcsIGJ5dGVzLCBlcnJvcl9jb2RlLCB2Y3B1KTsKIH0KIAogc3RhdGljIGludCBrZXJuZWxfcGlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdm9pZCAqcGQpCkBAIC0zNjA0LDYgKzM2ODYsMjEgQEAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAoraW50IGt2bV9lbXVsYXRlX3diaW52ZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaWYgKCFuZWVkX2VtdWxhdGVfd2JpbnZkKHZjcHUpKQorCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKKworCWlmIChrdm1feDg2X29wcy0+aGFzX3diaW52ZF9leGl0KCkpIHsKKwkJc21wX2NhbGxfZnVuY3Rpb25fbWFueSh2Y3B1LT5hcmNoLndiaW52ZF9kaXJ0eV9tYXNrLAorCQkJCXdiaW52ZF9pcGksIE5VTEwsIDEpOworCQljcHVtYXNrX2NsZWFyKHZjcHUtPmFyY2gud2JpbnZkX2RpcnR5X21hc2spOworCX0KKwl3YmludmQoKTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9lbXVsYXRlX3diaW52ZCk7CisKIGludCBlbXVsYXRlX2NsdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWt2bV94ODZfb3BzLT5zZXRfY3IwKHZjcHUsIGt2bV9yZWFkX2NyMF9iaXRzKHZjcHUsIH5YODZfQ1IwX1RTKSk7CkBAIC0zNjExLDM2ICszNzA4LDE3IEBACiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKLWludCBlbXVsYXRvcl9nZXRfZHIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBkciwgdW5zaWduZWQgbG9uZyAqZGVzdCkKK2ludCBlbXVsYXRvcl9nZXRfZHIoaW50IGRyLCB1bnNpZ25lZCBsb25nICpkZXN0LCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuIGt2bV9nZXRfZHIoY3R4dC0+dmNwdSwgZHIsIGRlc3QpOworCXJldHVybiBfa3ZtX2dldF9kcih2Y3B1LCBkciwgZGVzdCk7CiB9CiAKLWludCBlbXVsYXRvcl9zZXRfZHIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBkciwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK2ludCBlbXVsYXRvcl9zZXRfZHIoaW50IGRyLCB1bnNpZ25lZCBsb25nIHZhbHVlLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXNrID0gKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkgPyB+MFVMTCA6IH4wVTsKIAotCXJldHVybiBrdm1fc2V0X2RyKGN0eHQtPnZjcHUsIGRyLCB2YWx1ZSAmIG1hc2spOworCXJldHVybiBfX2t2bV9zZXRfZHIodmNwdSwgZHIsIHZhbHVlKTsKIH0KIAotdm9pZCBrdm1fcmVwb3J0X2VtdWxhdGlvbl9mYWlsdXJlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgY29uc3QgY2hhciAqY29udGV4dCkKLXsKLQl1OCBvcGNvZGVzWzRdOwotCXVuc2lnbmVkIGxvbmcgcmlwID0ga3ZtX3JpcF9yZWFkKHZjcHUpOwotCXVuc2lnbmVkIGxvbmcgcmlwX2xpbmVhcjsKLQotCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlyZXR1cm47Ci0KLQlyaXBfbGluZWFyID0gcmlwICsgZ2V0X3NlZ21lbnRfYmFzZSh2Y3B1LCBWQ1BVX1NSRUdfQ1MpOwotCi0Ja3ZtX3JlYWRfZ3Vlc3RfdmlydChyaXBfbGluZWFyLCAodm9pZCAqKW9wY29kZXMsIDQsIHZjcHUsIE5VTEwpOwotCi0JcHJpbnRrKEtFUk5fRVJSICJlbXVsYXRpb24gZmFpbGVkICglcykgcmlwICVseCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCSAgICAgICBjb250ZXh0LCByaXAsIG9wY29kZXNbMF0sIG9wY29kZXNbMV0sIG9wY29kZXNbMl0sIG9wY29kZXNbM10pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlcG9ydF9lbXVsYXRpb25fZmFpbHVyZSk7Ci0KIHN0YXRpYyB1NjQgbWtfY3JfNjQodTY0IGN1cnJfY3IsIHUzMiBuZXdfdmFsKQogewogCXJldHVybiAoY3Vycl9jciAmIH4oKDFVTEwgPDwgMzIpIC0gMSkpIHwgbmV3X3ZhbDsKQEAgLTM2NzQsMjcgKzM3NTIsMzIgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyB2b2lkIGVtdWxhdG9yX3NldF9jcihpbnQgY3IsIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW50IGVtdWxhdG9yX3NldF9jcihpbnQgY3IsIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJaW50IHJlcyA9IDA7CisKIAlzd2l0Y2ggKGNyKSB7CiAJY2FzZSAwOgotCQlrdm1fc2V0X2NyMCh2Y3B1LCBta19jcl82NChrdm1fcmVhZF9jcjAodmNwdSksIHZhbCkpOworCQlyZXMgPSBrdm1fc2V0X2NyMCh2Y3B1LCBta19jcl82NChrdm1fcmVhZF9jcjAodmNwdSksIHZhbCkpOwogCQlicmVhazsKIAljYXNlIDI6CiAJCXZjcHUtPmFyY2guY3IyID0gdmFsOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWt2bV9zZXRfY3IzKHZjcHUsIHZhbCk7CisJCXJlcyA9IGt2bV9zZXRfY3IzKHZjcHUsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgNDoKLQkJa3ZtX3NldF9jcjQodmNwdSwgbWtfY3JfNjQoa3ZtX3JlYWRfY3I0KHZjcHUpLCB2YWwpKTsKKwkJcmVzID0ga3ZtX3NldF9jcjQodmNwdSwgbWtfY3JfNjQoa3ZtX3JlYWRfY3I0KHZjcHUpLCB2YWwpKTsKIAkJYnJlYWs7CiAJY2FzZSA4OgotCQlrdm1fc2V0X2NyOCh2Y3B1LCB2YWwgJiAweGZVTCk7CisJCXJlcyA9IF9fa3ZtX3NldF9jcjgodmNwdSwgdmFsICYgMHhmVUwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQl2Y3B1X3ByaW50Zih2Y3B1LCAiJXM6IHVuZXhwZWN0ZWQgY3IgJXVcbiIsIF9fZnVuY19fLCBjcik7CisJCXJlcyA9IC0xOwogCX0KKworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQgZW11bGF0b3JfZ2V0X2NwbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0zNzA3LDYgKzM3OTAsMTIgQEAKIAlrdm1feDg2X29wcy0+Z2V0X2dkdCh2Y3B1LCBkdCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVtdWxhdG9yX2dldF9jYWNoZWRfc2VnbWVudF9iYXNlKGludCBzZWcsCisJCQkJCQkgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIGdldF9zZWdtZW50X2Jhc2UodmNwdSwgc2VnKTsKK30KKwogc3RhdGljIGJvb2wgZW11bGF0b3JfZ2V0X2NhY2hlZF9kZXNjcmlwdG9yKHN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYywgaW50IHNlZywKIAkJCQkJICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtMzc3OSwxMSArMzg2OCw2IEBACiAJa3ZtX3NldF9zZWdtZW50KHZjcHUsICZrdm1fc2VnLCBzZWcpOwogfQogCi1zdGF0aWMgdm9pZCBlbXVsYXRvcl9zZXRfcmZsYWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByZmxhZ3MpCi17Ci0Ja3ZtX3g4Nl9vcHMtPnNldF9yZmxhZ3ModmNwdSwgcmZsYWdzKTsKLX0KLQogc3RhdGljIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgZW11bGF0ZV9vcHMgPSB7CiAJLnJlYWRfc3RkICAgICAgICAgICAgPSBrdm1fcmVhZF9ndWVzdF92aXJ0X3N5c3RlbSwKIAkud3JpdGVfc3RkICAgICAgICAgICA9IGt2bV93cml0ZV9ndWVzdF92aXJ0X3N5c3RlbSwKQEAgLTM3OTcsMTEgKzM4ODEsMTUgQEAKIAkuc2V0X2NhY2hlZF9kZXNjcmlwdG9yID0gZW11bGF0b3Jfc2V0X2NhY2hlZF9kZXNjcmlwdG9yLAogCS5nZXRfc2VnbWVudF9zZWxlY3RvciA9IGVtdWxhdG9yX2dldF9zZWdtZW50X3NlbGVjdG9yLAogCS5zZXRfc2VnbWVudF9zZWxlY3RvciA9IGVtdWxhdG9yX3NldF9zZWdtZW50X3NlbGVjdG9yLAorCS5nZXRfY2FjaGVkX3NlZ21lbnRfYmFzZSA9IGVtdWxhdG9yX2dldF9jYWNoZWRfc2VnbWVudF9iYXNlLAogCS5nZXRfZ2R0ICAgICAgICAgICAgID0gZW11bGF0b3JfZ2V0X2dkdCwKIAkuZ2V0X2NyICAgICAgICAgICAgICA9IGVtdWxhdG9yX2dldF9jciwKIAkuc2V0X2NyICAgICAgICAgICAgICA9IGVtdWxhdG9yX3NldF9jciwKIAkuY3BsICAgICAgICAgICAgICAgICA9IGVtdWxhdG9yX2dldF9jcGwsCi0JLnNldF9yZmxhZ3MgICAgICAgICAgPSBlbXVsYXRvcl9zZXRfcmZsYWdzLAorCS5nZXRfZHIgICAgICAgICAgICAgID0gZW11bGF0b3JfZ2V0X2RyLAorCS5zZXRfZHIgICAgICAgICAgICAgID0gZW11bGF0b3Jfc2V0X2RyLAorCS5zZXRfbXNyICAgICAgICAgICAgID0ga3ZtX3NldF9tc3IsCisJLmdldF9tc3IgICAgICAgICAgICAgPSBrdm1fZ2V0X21zciwKIH07CiAKIHN0YXRpYyB2b2lkIGNhY2hlX2FsbF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTM4MTIsMTQgKzM5MDAsNzUgQEAKIAl2Y3B1LT5hcmNoLnJlZ3NfZGlydHkgPSB+MDsKIH0KIAorc3RhdGljIHZvaWQgdG9nZ2xlX2ludGVycnVwdGliaWxpdHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbWFzaykKK3sKKwl1MzIgaW50X3NoYWRvdyA9IGt2bV94ODZfb3BzLT5nZXRfaW50ZXJydXB0X3NoYWRvdyh2Y3B1LCBtYXNrKTsKKwkvKgorCSAqIGFuIHN0aTsgc3RpOyBzZXF1ZW5jZSBvbmx5IGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhlIGZpcnN0CisJICogaW5zdHJ1Y3Rpb24uIFNvLCBpZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiwgYmUgaXQgZW11bGF0ZWQgb3IKKwkgKiBub3QsIGxlZnQgdGhlIHN5c3RlbSB3aXRoIHRoZSBJTlRfU1RJIGZsYWcgZW5hYmxlZCwgaXQKKwkgKiBtZWFucyB0aGF0IHRoZSBsYXN0IGluc3RydWN0aW9uIGlzIGFuIHN0aS4gV2Ugc2hvdWxkIG5vdAorCSAqIGxlYXZlIHRoZSBmbGFnIG9uIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgZ29lcyBmb3IgbW92IHNzCisJICovCisJaWYgKCEoaW50X3NoYWRvdyAmIG1hc2spKQorCQlrdm1feDg2X29wcy0+c2V0X2ludGVycnVwdF9zaGFkb3codmNwdSwgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGluamVjdF9lbXVsYXRlZF9leGNlcHRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0ID0gJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0OworCWlmIChjdHh0LT5leGNlcHRpb24gPT0gUEZfVkVDVE9SKQorCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQodmNwdSwgY3R4dC0+Y3IyLCBjdHh0LT5lcnJvcl9jb2RlKTsKKwllbHNlIGlmIChjdHh0LT5lcnJvcl9jb2RlX3ZhbGlkKQorCQlrdm1fcXVldWVfZXhjZXB0aW9uX2UodmNwdSwgY3R4dC0+ZXhjZXB0aW9uLCBjdHh0LT5lcnJvcl9jb2RlKTsKKwllbHNlCisJCWt2bV9xdWV1ZV9leGNlcHRpb24odmNwdSwgY3R4dC0+ZXhjZXB0aW9uKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfZW11bGF0aW9uX2ZhaWx1cmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCSsrdmNwdS0+c3RhdC5pbnNuX2VtdWxhdGlvbl9mYWlsOworCXRyYWNlX2t2bV9lbXVsYXRlX2luc25fZmFpbGVkKHZjcHUpOworCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwl2Y3B1LT5ydW4tPmludGVybmFsLnN1YmVycm9yID0gS1ZNX0lOVEVSTkFMX0VSUk9SX0VNVUxBVElPTjsKKwl2Y3B1LT5ydW4tPmludGVybmFsLm5kYXRhID0gMDsKKwlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7CisJcmV0dXJuIEVNVUxBVEVfRkFJTDsKK30KKworc3RhdGljIGJvb2wgcmVleGVjdXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKQoreworCWdwYV90IGdwYTsKKworCWlmICh0ZHBfZW5hYmxlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBpZiBlbXVsYXRpb24gd2FzIGR1ZSB0byBhY2Nlc3MgdG8gc2hhZG93ZWQgcGFnZSB0YWJsZQorCSAqIGFuZCBpdCBmYWlsZWQgdHJ5IHRvIHVuc2hhZG93IHBhZ2UgYW5kIHJlLWVudGV0ciB0aGUKKwkgKiBndWVzdCB0byBsZXQgQ1BVIGV4ZWN1dGUgdGhlIGluc3RydWN0aW9uLgorCSAqLworCWlmIChrdm1fbW11X3VucHJvdGVjdF9wYWdlX3ZpcnQodmNwdSwgZ3ZhKSkKKwkJcmV0dXJuIHRydWU7CisKKwlncGEgPSBrdm1fbW11X2d2YV90b19ncGFfc3lzdGVtKHZjcHUsIGd2YSwgTlVMTCk7CisKKwlpZiAoZ3BhID09IFVOTUFQUEVEX0dWQSkKKwkJcmV0dXJuIHRydWU7IC8qIGxldCBjcHUgZ2VuZXJhdGUgZmF1bHQgKi8KKworCWlmICgha3ZtX2lzX2Vycm9yX2h2YShnZm5fdG9faHZhKHZjcHUtPmt2bSwgZ3BhID4+IFBBR0VfU0hJRlQpKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIGludCBlbXVsYXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCXVuc2lnbmVkIGxvbmcgY3IyLAogCQkJdTE2IGVycm9yX2NvZGUsCiAJCQlpbnQgZW11bGF0aW9uX3R5cGUpCiB7Ci0JaW50IHIsIHNoYWRvd19tYXNrOwotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmM7Ci0Jc3RydWN0IGt2bV9ydW4gKnJ1biA9IHZjcHUtPnJ1bjsKKwlpbnQgcjsKKwlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZTsKIAogCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUodmNwdSk7CiAJdmNwdS0+YXJjaC5tbWlvX2ZhdWx0X2NyMiA9IGNyMjsKQEAgLTM4MzEsOCArMzk4MCw2IEBACiAJICovCiAJY2FjaGVfYWxsX3JlZ3ModmNwdSk7CiAKLQl2Y3B1LT5tbWlvX2lzX3dyaXRlID0gMDsKLQogCWlmICghKGVtdWxhdGlvbl90eXBlICYgRU1VTFRZUEVfTk9fREVDT0RFKSkgewogCQlpbnQgY3NfZGIsIGNzX2w7CiAJCWt2bV94ODZfb3BzLT5nZXRfY3NfZGJfbF9iaXRzKHZjcHUsICZjc19kYiwgJmNzX2wpOwpAQCAtMzg0NiwxMyArMzk5MywxNiBAQAogCQkJPyBYODZFTVVMX01PREVfVk04NiA6IGNzX2wKIAkJCT8gWDg2RU1VTF9NT0RFX1BST1Q2NCA6CWNzX2RiCiAJCQk/IFg4NkVNVUxfTU9ERV9QUk9UMzIgOiBYODZFTVVMX01PREVfUFJPVDE2OworCQltZW1zZXQoYywgMCwgc2l6ZW9mKHN0cnVjdCBkZWNvZGVfY2FjaGUpKTsKKwkJbWVtY3B5KGMtPnJlZ3MsIHZjcHUtPmFyY2gucmVncywgc2l6ZW9mIGMtPnJlZ3MpOworCQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5pbnRlcnJ1cHRpYmlsaXR5ID0gMDsKKwkJdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZXhjZXB0aW9uID0gLTE7CiAKIAkJciA9IHg4Nl9kZWNvZGVfaW5zbigmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQsICZlbXVsYXRlX29wcyk7CiAJCXRyYWNlX2t2bV9lbXVsYXRlX2luc25fc3RhcnQodmNwdSk7CiAKIAkJLyogT25seSBhbGxvdyBlbXVsYXRpb24gb2Ygc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIG9uICNVRAogCQkgKiAobmFtZWx5IFZNTUNBTEwsIHN5c2VudGVyLCBzeXNleGl0LCBzeXNjYWxsKSovCi0JCWMgPSAmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZGVjb2RlOwogCQlpZiAoZW11bGF0aW9uX3R5cGUgJiBFTVVMVFlQRV9UUkFQX1VEKSB7CiAJCQlpZiAoIWMtPnR3b2J5dGUpCiAJCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKQEAgLTM4ODAsMTEgKzQwMzAsMTEgQEAKIAogCQkrK3ZjcHUtPnN0YXQuaW5zbl9lbXVsYXRpb247CiAJCWlmIChyKSAgewotCQkJKyt2Y3B1LT5zdGF0Lmluc25fZW11bGF0aW9uX2ZhaWw7Ci0JCQl0cmFjZV9rdm1fZW11bGF0ZV9pbnNuX2ZhaWxlZCh2Y3B1KTsKLQkJCWlmIChrdm1fbW11X3VucHJvdGVjdF9wYWdlX3ZpcnQodmNwdSwgY3IyKSkKKwkJCWlmIChyZWV4ZWN1dGVfaW5zdHJ1Y3Rpb24odmNwdSwgY3IyKSkKIAkJCQlyZXR1cm4gRU1VTEFURV9ET05FOwotCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKKwkJCWlmIChlbXVsYXRpb25fdHlwZSAmIEVNVUxUWVBFX1NLSVApCisJCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKKwkJCXJldHVybiBoYW5kbGVfZW11bGF0aW9uX2ZhaWx1cmUodmNwdSk7CiAJCX0KIAl9CiAKQEAgLTM4OTMsMTIgKzQwNDMsMjkgQEAKIAkJcmV0dXJuIEVNVUxBVEVfRE9ORTsKIAl9CiAKKwkvKiB0aGlzIGlzIG5lZWRlZCBmb3Igdm13YXJlIGJhY2tkb3IgaW50ZXJmYWNlIHRvIHdvcmsgc2luY2UgaXQKKwkgICBjaGFuZ2VzIHJlZ2lzdGVycyB2YWx1ZXMgIGR1cmluZyBJTyBvcGVyYXRpb24gKi8KKwltZW1jcHkoYy0+cmVncywgdmNwdS0+YXJjaC5yZWdzLCBzaXplb2YgYy0+cmVncyk7CisKIHJlc3RhcnQ6CiAJciA9IHg4Nl9lbXVsYXRlX2luc24oJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LCAmZW11bGF0ZV9vcHMpOwotCXNoYWRvd19tYXNrID0gdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuaW50ZXJydXB0aWJpbGl0eTsKIAotCWlmIChyID09IDApCi0JCWt2bV94ODZfb3BzLT5zZXRfaW50ZXJydXB0X3NoYWRvdyh2Y3B1LCBzaGFkb3dfbWFzayk7CisJaWYgKHIpIHsgLyogZW11bGF0aW9uIGZhaWxlZCAqLworCQlpZiAocmVleGVjdXRlX2luc3RydWN0aW9uKHZjcHUsIGNyMikpCisJCQlyZXR1cm4gRU1VTEFURV9ET05FOworCisJCXJldHVybiBoYW5kbGVfZW11bGF0aW9uX2ZhaWx1cmUodmNwdSk7CisJfQorCisJdG9nZ2xlX2ludGVycnVwdGliaWxpdHkodmNwdSwgdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuaW50ZXJydXB0aWJpbGl0eSk7CisJa3ZtX3g4Nl9vcHMtPnNldF9yZmxhZ3ModmNwdSwgdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZWZsYWdzKTsKKwltZW1jcHkodmNwdS0+YXJjaC5yZWdzLCBjLT5yZWdzLCBzaXplb2YgYy0+cmVncyk7CisJa3ZtX3JpcF93cml0ZSh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5laXApOworCisJaWYgKHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmV4Y2VwdGlvbiA+PSAwKSB7CisJCWluamVjdF9lbXVsYXRlZF9leGNlcHRpb24odmNwdSk7CisJCXJldHVybiBFTVVMQVRFX0RPTkU7CisJfQogCiAJaWYgKHZjcHUtPmFyY2gucGlvLmNvdW50KSB7CiAJCWlmICghdmNwdS0+YXJjaC5waW8uaW4pCkBAIC0zOTA2LDM1ICs0MDczLDEyIEBACiAJCXJldHVybiBFTVVMQVRFX0RPX01NSU87CiAJfQogCi0JaWYgKHIgfHwgdmNwdS0+bW1pb19pc193cml0ZSkgewotCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfTU1JTzsKLQkJcnVuLT5tbWlvLnBoeXNfYWRkciA9IHZjcHUtPm1taW9fcGh5c19hZGRyOwotCQltZW1jcHkocnVuLT5tbWlvLmRhdGEsIHZjcHUtPm1taW9fZGF0YSwgOCk7Ci0JCXJ1bi0+bW1pby5sZW4gPSB2Y3B1LT5tbWlvX3NpemU7Ci0JCXJ1bi0+bW1pby5pc193cml0ZSA9IHZjcHUtPm1taW9faXNfd3JpdGU7Ci0JfQotCi0JaWYgKHIpIHsKLQkJaWYgKGt2bV9tbXVfdW5wcm90ZWN0X3BhZ2VfdmlydCh2Y3B1LCBjcjIpKQotCQkJZ290byBkb25lOwotCQlpZiAoIXZjcHUtPm1taW9fbmVlZGVkKSB7Ci0JCQkrK3ZjcHUtPnN0YXQuaW5zbl9lbXVsYXRpb25fZmFpbDsKLQkJCXRyYWNlX2t2bV9lbXVsYXRlX2luc25fZmFpbGVkKHZjcHUpOwotCQkJa3ZtX3JlcG9ydF9lbXVsYXRpb25fZmFpbHVyZSh2Y3B1LCAibW1pbyIpOwotCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKLQkJfQorCWlmICh2Y3B1LT5tbWlvX25lZWRlZCkgeworCQlpZiAodmNwdS0+bW1pb19pc193cml0ZSkKKwkJCXZjcHUtPm1taW9fbmVlZGVkID0gMDsKIAkJcmV0dXJuIEVNVUxBVEVfRE9fTU1JTzsKIAl9CiAKLQlpZiAodmNwdS0+bW1pb19pc193cml0ZSkgewotCQl2Y3B1LT5tbWlvX25lZWRlZCA9IDA7Ci0JCXJldHVybiBFTVVMQVRFX0RPX01NSU87Ci0JfQotCi1kb25lOgotCWlmICh2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nKQotCQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5yZXN0YXJ0ID0gZmFsc2U7Ci0KIAlpZiAodmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQucmVzdGFydCkKIAkJZ290byByZXN0YXJ0OwogCkBAIC00MTA4LDYgKzQyNTIsOSBAQAogCiAJcGVyZl9yZWdpc3Rlcl9ndWVzdF9pbmZvX2NhbGxiYWNrcygma3ZtX2d1ZXN0X2Nicyk7CiAKKwlpZiAoY3B1X2hhc194c2F2ZSkKKwkJaG9zdF94Y3IwID0geGdldGJ2KFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0spOworCiAJcmV0dXJuIDA7CiAKIG91dDoKQEAgLTQyNzAsNyArNDQxNyw3IEBACiAKIAlrdm1feDg2X29wcy0+cGF0Y2hfaHlwZXJjYWxsKHZjcHUsIGluc3RydWN0aW9uKTsKIAotCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChyaXAsIGluc3RydWN0aW9uLCAzLCB2Y3B1KTsKKwlyZXR1cm4gZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQocmlwLCBpbnN0cnVjdGlvbiwgMywgTlVMTCwgdmNwdSk7CiB9CiAKIHZvaWQgcmVhbG1vZGVfbGdkdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiBsaW1pdCwgdW5zaWduZWQgbG9uZyBiYXNlKQpAQCAtNDUwNiw1OSArNDY1Myw3OCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQga3ZtX2xvYWRfZ3Vlc3RfeGNyMChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfT1NYU0FWRSkgJiYKKwkJCSF2Y3B1LT5ndWVzdF94Y3IwX2xvYWRlZCkgeworCQkvKiBrdm1fc2V0X3hjcigpIGFsc28gZGVwZW5kcyBvbiB0aGlzICovCisJCXhzZXRidihYQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLLCB2Y3B1LT5hcmNoLnhjcjApOworCQl2Y3B1LT5ndWVzdF94Y3IwX2xvYWRlZCA9IDE7CisJfQorfQorCitzdGF0aWMgdm9pZCBrdm1fcHV0X2d1ZXN0X3hjcjAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICh2Y3B1LT5ndWVzdF94Y3IwX2xvYWRlZCkgeworCQlpZiAodmNwdS0+YXJjaC54Y3IwICE9IGhvc3RfeGNyMCkKKwkJCXhzZXRidihYQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLLCBob3N0X3hjcjApOworCQl2Y3B1LT5ndWVzdF94Y3IwX2xvYWRlZCA9IDA7CisJfQorfQorCiBzdGF0aWMgaW50IHZjcHVfZW50ZXJfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWludCByOwogCWJvb2wgcmVxX2ludF93aW4gPSAhaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSAmJgogCQl2Y3B1LT5ydW4tPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdzsKIAotCWlmICh2Y3B1LT5yZXF1ZXN0cykKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLVk1fUkVRX01NVV9SRUxPQUQsICZ2Y3B1LT5yZXF1ZXN0cykpCi0JCQlrdm1fbW11X3VubG9hZCh2Y3B1KTsKLQotCXIgPSBrdm1fbW11X3JlbG9hZCh2Y3B1KTsKLQlpZiAodW5saWtlbHkocikpCi0JCWdvdG8gb3V0OwotCiAJaWYgKHZjcHUtPnJlcXVlc3RzKSB7Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9NSUdSQVRFX1RJTUVSLCAmdmNwdS0+cmVxdWVzdHMpKQorCQlpZiAoa3ZtX2NoZWNrX3JlcXVlc3QoS1ZNX1JFUV9NTVVfUkVMT0FELCB2Y3B1KSkKKwkJCWt2bV9tbXVfdW5sb2FkKHZjcHUpOworCQlpZiAoa3ZtX2NoZWNrX3JlcXVlc3QoS1ZNX1JFUV9NSUdSQVRFX1RJTUVSLCB2Y3B1KSkKIAkJCV9fa3ZtX21pZ3JhdGVfdGltZXJzKHZjcHUpOwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfS1ZNQ0xPQ0tfVVBEQVRFLCAmdmNwdS0+cmVxdWVzdHMpKQorCQlpZiAoa3ZtX2NoZWNrX3JlcXVlc3QoS1ZNX1JFUV9LVk1DTE9DS19VUERBVEUsIHZjcHUpKQogCQkJa3ZtX3dyaXRlX2d1ZXN0X3RpbWUodmNwdSk7Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9NTVVfU1lOQywgJnZjcHUtPnJlcXVlc3RzKSkKKwkJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfTU1VX1NZTkMsIHZjcHUpKQogCQkJa3ZtX21tdV9zeW5jX3Jvb3RzKHZjcHUpOwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfVExCX0ZMVVNILCAmdmNwdS0+cmVxdWVzdHMpKQorCQlpZiAoa3ZtX2NoZWNrX3JlcXVlc3QoS1ZNX1JFUV9UTEJfRkxVU0gsIHZjcHUpKQogCQkJa3ZtX3g4Nl9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLVk1fUkVRX1JFUE9SVF9UUFJfQUNDRVNTLAotCQkJCSAgICAgICAmdmNwdS0+cmVxdWVzdHMpKSB7CisJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX1JFUE9SVF9UUFJfQUNDRVNTLCB2Y3B1KSkgewogCQkJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX1RQUl9BQ0NFU1M7CiAJCQlyID0gMDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9UUklQTEVfRkFVTFQsICZ2Y3B1LT5yZXF1ZXN0cykpIHsKKwkJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfVFJJUExFX0ZBVUxULCB2Y3B1KSkgewogCQkJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX1NIVVRET1dOOwogCQkJciA9IDA7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfREVBQ1RJVkFURV9GUFUsICZ2Y3B1LT5yZXF1ZXN0cykpIHsKKwkJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfREVBQ1RJVkFURV9GUFUsIHZjcHUpKSB7CiAJCQl2Y3B1LT5mcHVfYWN0aXZlID0gMDsKIAkJCWt2bV94ODZfb3BzLT5mcHVfZGVhY3RpdmF0ZSh2Y3B1KTsKIAkJfQogCX0KIAorCXIgPSBrdm1fbW11X3JlbG9hZCh2Y3B1KTsKKwlpZiAodW5saWtlbHkocikpCisJCWdvdG8gb3V0OworCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlrdm1feDg2X29wcy0+cHJlcGFyZV9ndWVzdF9zd2l0Y2godmNwdSk7CiAJaWYgKHZjcHUtPmZwdV9hY3RpdmUpCiAJCWt2bV9sb2FkX2d1ZXN0X2ZwdSh2Y3B1KTsKKwlrdm1fbG9hZF9ndWVzdF94Y3IwKHZjcHUpOworCisJYXRvbWljX3NldCgmdmNwdS0+Z3Vlc3RfbW9kZSwgMSk7CisJc21wX3dtYigpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAotCWNsZWFyX2JpdChLVk1fUkVRX0tJQ0ssICZ2Y3B1LT5yZXF1ZXN0cyk7Ci0Jc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKLQotCWlmICh2Y3B1LT5yZXF1ZXN0cyB8fCBuZWVkX3Jlc2NoZWQoKSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlzZXRfYml0KEtWTV9SRVFfS0lDSywgJnZjcHUtPnJlcXVlc3RzKTsKKwlpZiAoIWF0b21pY19yZWFkKCZ2Y3B1LT5ndWVzdF9tb2RlKSB8fCB2Y3B1LT5yZXF1ZXN0cworCSAgICB8fCBuZWVkX3Jlc2NoZWQoKSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlhdG9taWNfc2V0KCZ2Y3B1LT5ndWVzdF9tb2RlLCAwKTsKKwkJc21wX3dtYigpOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCXByZWVtcHRfZW5hYmxlKCk7CiAJCXIgPSAxOwpAQCAtNDYwMyw3ICs0NzY5LDggQEAKIAlpZiAoaHdfYnJlYWtwb2ludF9hY3RpdmUoKSkKIAkJaHdfYnJlYWtwb2ludF9yZXN0b3JlKCk7CiAKLQlzZXRfYml0KEtWTV9SRVFfS0lDSywgJnZjcHUtPnJlcXVlc3RzKTsKKwlhdG9taWNfc2V0KCZ2Y3B1LT5ndWVzdF9tb2RlLCAwKTsKKwlzbXBfd21iKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJKyt2Y3B1LT5zdGF0LmV4aXRzOwpAQCAtNDY2NSw3ICs0ODMyLDcgQEAKIAkJCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+c3JjdSwgdmNwdS0+c3JjdV9pZHgpOwogCQkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7CiAJCQl2Y3B1LT5zcmN1X2lkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwotCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLVk1fUkVRX1VOSEFMVCwgJnZjcHUtPnJlcXVlc3RzKSkKKwkJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX1VOSEFMVCwgdmNwdSkpCiAJCQl7CiAJCQkJc3dpdGNoKHZjcHUtPmFyY2gubXBfc3RhdGUpIHsKIAkJCQljYXNlIEtWTV9NUF9TVEFURV9IQUxURUQ6CkBAIC00NzE3LDggKzQ4ODQsNiBAQAogCWludCByOwogCXNpZ3NldF90IHNpZ3NhdmVkOwogCi0JdmNwdV9sb2FkKHZjcHUpOwotCiAJaWYgKHZjcHUtPnNpZ3NldF9hY3RpdmUpCiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmdmNwdS0+c2lnc2V0LCAmc2lnc2F2ZWQpOwogCkBAIC00NzQzLDcgKzQ5MDgsNyBAQAogCQl2Y3B1LT5zcmN1X2lkeCA9IHNyY3VfcmVhZF9sb2NrKCZ2Y3B1LT5rdm0tPnNyY3UpOwogCQlyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwLCAwLCBFTVVMVFlQRV9OT19ERUNPREUpOwogCQlzcmN1X3JlYWRfdW5sb2NrKCZ2Y3B1LT5rdm0tPnNyY3UsIHZjcHUtPnNyY3VfaWR4KTsKLQkJaWYgKHIgPT0gRU1VTEFURV9ET19NTUlPKSB7CisJCWlmIChyICE9IEVNVUxBVEVfRE9ORSkgewogCQkJciA9IDA7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDc1OSwxNCArNDkyNCwxMSBAQAogCWlmICh2Y3B1LT5zaWdzZXRfYWN0aXZlKQogCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3NhdmVkLCBOVUxMKTsKIAotCXZjcHVfcHV0KHZjcHUpOwogCXJldHVybiByOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9nZXRfcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcmVncyAqcmVncykKIHsKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlyZWdzLT5yYXggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKIAlyZWdzLT5yYnggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkJYKTsKIAlyZWdzLT5yY3ggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkNYKTsKQEAgLTQ3ODksMTUgKzQ5NTEsMTEgQEAKIAlyZWdzLT5yaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CiAJcmVncy0+cmZsYWdzID0ga3ZtX2dldF9yZmxhZ3ModmNwdSk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcmVncyAqcmVncykKIHsKLQl2Y3B1X2xvYWQodmNwdSk7Ci0KIAlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JBWCwgcmVncy0+cmF4KTsKIAlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JCWCwgcmVncy0+cmJ4KTsKIAlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JDWCwgcmVncy0+cmN4KTsKQEAgLTQ4MjIsOCArNDk4MCw2IEBACiAKIAl2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nID0gZmFsc2U7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCkBAIC00ODQyLDggKzQ5OTgsNiBAQAogewogCXN0cnVjdCBkZXNjX3B0ciBkdDsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogCWt2bV9nZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmNzLCBWQ1BVX1NSRUdfQ1MpOwogCWt2bV9nZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmRzLCBWQ1BVX1NSRUdfRFMpOwogCWt2bV9nZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmVzLCBWQ1BVX1NSRUdfRVMpOwpAQCAtNDg3NSwzMiArNTAyOSwyNyBAQAogCQlzZXRfYml0KHZjcHUtPmFyY2guaW50ZXJydXB0Lm5yLAogCQkJKHVuc2lnbmVkIGxvbmcgKilzcmVncy0+aW50ZXJydXB0X2JpdG1hcCk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9nZXRfbXBzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJICAgIHN0cnVjdCBrdm1fbXBfc3RhdGUgKm1wX3N0YXRlKQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAltcF9zdGF0ZS0+bXBfc3RhdGUgPSB2Y3B1LT5hcmNoLm1wX3N0YXRlOwotCXZjcHVfcHV0KHZjcHUpOwogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfbXBzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJICAgIHN0cnVjdCBrdm1fbXBfc3RhdGUgKm1wX3N0YXRlKQogewotCXZjcHVfbG9hZCh2Y3B1KTsKIAl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gbXBfc3RhdGUtPm1wX3N0YXRlOwotCXZjcHVfcHV0KHZjcHUpOwogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX3Rhc2tfc3dpdGNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IHRzc19zZWxlY3RvciwgaW50IHJlYXNvbiwKIAkJICAgIGJvb2wgaGFzX2Vycm9yX2NvZGUsIHUzMiBlcnJvcl9jb2RlKQogeworCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZGVjb2RlOwogCWludCBjc19kYiwgY3NfbCwgcmV0OwogCWNhY2hlX2FsbF9yZWdzKHZjcHUpOwogCkBAIC00OTE1LDYgKzUwNjQsOCBAQAogCQk/IFg4NkVNVUxfTU9ERV9WTTg2IDogY3NfbAogCQk/IFg4NkVNVUxfTU9ERV9QUk9UNjQgOgljc19kYgogCQk/IFg4NkVNVUxfTU9ERV9QUk9UMzIgOiBYODZFTVVMX01PREVfUFJPVDE2OworCW1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IGRlY29kZV9jYWNoZSkpOworCW1lbWNweShjLT5yZWdzLCB2Y3B1LT5hcmNoLnJlZ3MsIHNpemVvZiBjLT5yZWdzKTsKIAogCXJldCA9IGVtdWxhdG9yX3Rhc2tfc3dpdGNoKCZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dCwgJmVtdWxhdGVfb3BzLAogCQkJCSAgIHRzc19zZWxlY3RvciwgcmVhc29uLCBoYXNfZXJyb3JfY29kZSwKQEAgLTQ5MjMsNiArNTA3NCw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKIAorCW1lbWNweSh2Y3B1LT5hcmNoLnJlZ3MsIGMtPnJlZ3MsIHNpemVvZiBjLT5yZWdzKTsKKwlrdm1fcmlwX3dyaXRlKHZjcHUsIHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmVpcCk7CiAJa3ZtX3g4Nl9vcHMtPnNldF9yZmxhZ3ModmNwdSwgdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZWZsYWdzKTsKIAlyZXR1cm4gRU1VTEFURV9ET05FOwogfQpAQCAtNDkzNSw4ICs1MDg4LDYgQEAKIAlpbnQgcGVuZGluZ192ZWMsIG1heF9iaXRzOwogCXN0cnVjdCBkZXNjX3B0ciBkdDsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogCWR0LnNpemUgPSBzcmVncy0+aWR0LmxpbWl0OwogCWR0LmFkZHJlc3MgPSBzcmVncy0+aWR0LmJhc2U7CiAJa3ZtX3g4Nl9vcHMtPnNldF9pZHQodmNwdSwgJmR0KTsKQEAgLTQ5OTYsOCArNTE0Nyw2IEBACiAJICAgICFpc19wcm90bW9kZSh2Y3B1KSkKIAkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9IEtWTV9NUF9TVEFURV9SVU5OQUJMRTsKIAotCXZjcHVfcHV0KHZjcHUpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUwMDcsMTIgKzUxNTYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHJmbGFnczsKIAlpbnQgaSwgcjsKIAotCXZjcHVfbG9hZCh2Y3B1KTsKLQogCWlmIChkYmctPmNvbnRyb2wgJiAoS1ZNX0dVRVNUREJHX0lOSkVDVF9EQiB8IEtWTV9HVUVTVERCR19JTkpFQ1RfQlApKSB7CiAJCXIgPSAtRUJVU1k7CiAJCWlmICh2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nKQotCQkJZ290byB1bmxvY2tfb3V0OworCQkJZ290byBvdXQ7CiAJCWlmIChkYmctPmNvbnRyb2wgJiBLVk1fR1VFU1REQkdfSU5KRUNUX0RCKQogCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBEQl9WRUNUT1IpOwogCQllbHNlCkBAIC01MDU0LDM0ICs1MjAxLDEyIEBACiAKIAlyID0gMDsKIAotdW5sb2NrX291dDoKLQl2Y3B1X3B1dCh2Y3B1KTsKK291dDoKIAogCXJldHVybiByOwogfQogCiAvKgotICogZnhzYXZlIGZwdSBzdGF0ZS4gIFRha2VuIGZyb20geDg2XzY0L3Byb2Nlc3Nvci5oLiAgVG8gYmUga2lsbGVkIHdoZW4KLSAqIHdlIGhhdmUgYXNtL3g4Ni9wcm9jZXNzb3IuaAotICovCi1zdHJ1Y3QgZnhzYXZlIHsKLQl1MTYJY3dkOwotCXUxNglzd2Q7Ci0JdTE2CXR3ZDsKLQl1MTYJZm9wOwotCXU2NAlyaXA7Ci0JdTY0CXJkcDsKLQl1MzIJbXhjc3I7Ci0JdTMyCW14Y3NyX21hc2s7Ci0JdTMyCXN0X3NwYWNlWzMyXTsJLyogOCoxNiBieXRlcyBmb3IgZWFjaCBGUC1yZWcgPSAxMjggYnl0ZXMgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JdTMyCXhtbV9zcGFjZVs2NF07CS8qIDE2KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAyNTYgYnl0ZXMgKi8KLSNlbHNlCi0JdTMyCXhtbV9zcGFjZVszMl07CS8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggWE1NLXJlZyA9IDEyOCBieXRlcyAqLwotI2VuZGlmCi19OwotCi0vKgogICogVHJhbnNsYXRlIGEgZ3Vlc3QgdmlydHVhbCBhZGRyZXNzIHRvIGEgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcy4KICAqLwogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfdHJhbnNsYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKQEAgLTUwOTEsNyArNTIxNiw2IEBACiAJZ3BhX3QgZ3BhOwogCWludCBpZHg7CiAKLQl2Y3B1X2xvYWQodmNwdSk7CiAJaWR4ID0gc3JjdV9yZWFkX2xvY2soJnZjcHUtPmt2bS0+c3JjdSk7CiAJZ3BhID0ga3ZtX21tdV9ndmFfdG9fZ3BhX3N5c3RlbSh2Y3B1LCB2YWRkciwgTlVMTCk7CiAJc3JjdV9yZWFkX3VubG9jaygmdmNwdS0+a3ZtLT5zcmN1LCBpZHgpOwpAQCAtNTA5OSwxNiArNTIyMywxNCBAQAogCXRyLT52YWxpZCA9IGdwYSAhPSBVTk1BUFBFRF9HVkE7CiAJdHItPndyaXRlYWJsZSA9IDE7CiAJdHItPnVzZXJtb2RlID0gMDsKLQl2Y3B1X3B1dCh2Y3B1KTsKIAogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9nZXRfZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9mcHUgKmZwdSkKIHsKLQlzdHJ1Y3QgZnhzYXZlICpmeHNhdmUgPSAoc3RydWN0IGZ4c2F2ZSAqKSZ2Y3B1LT5hcmNoLmd1ZXN0X2Z4X2ltYWdlOwotCi0JdmNwdV9sb2FkKHZjcHUpOworCXN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4c2F2ZSA9CisJCQkmdmNwdS0+YXJjaC5ndWVzdF9mcHUuc3RhdGUtPmZ4c2F2ZTsKIAogCW1lbWNweShmcHUtPmZwciwgZnhzYXZlLT5zdF9zcGFjZSwgMTI4KTsKIAlmcHUtPmZjdyA9IGZ4c2F2ZS0+Y3dkOwpAQCAtNTExOSwxNiArNTI0MSwxMyBAQAogCWZwdS0+bGFzdF9kcCA9IGZ4c2F2ZS0+cmRwOwogCW1lbWNweShmcHUtPnhtbSwgZnhzYXZlLT54bW1fc3BhY2UsIHNpemVvZiBmeHNhdmUtPnhtbV9zcGFjZSk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9mcHUgKmZwdSkKIHsKLQlzdHJ1Y3QgZnhzYXZlICpmeHNhdmUgPSAoc3RydWN0IGZ4c2F2ZSAqKSZ2Y3B1LT5hcmNoLmd1ZXN0X2Z4X2ltYWdlOwotCi0JdmNwdV9sb2FkKHZjcHUpOworCXN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4c2F2ZSA9CisJCQkmdmNwdS0+YXJjaC5ndWVzdF9mcHUuc3RhdGUtPmZ4c2F2ZTsKIAogCW1lbWNweShmeHNhdmUtPnN0X3NwYWNlLCBmcHUtPmZwciwgMTI4KTsKIAlmeHNhdmUtPmN3ZCA9IGZwdS0+ZmN3OwpAQCAtNTEzOSw2MSArNTI1OCw2MyBAQAogCWZ4c2F2ZS0+cmRwID0gZnB1LT5sYXN0X2RwOwogCW1lbWNweShmeHNhdmUtPnhtbV9zcGFjZSwgZnB1LT54bW0sIHNpemVvZiBmeHNhdmUtPnhtbV9zcGFjZSk7CiAKLQl2Y3B1X3B1dCh2Y3B1KTsKLQogCXJldHVybiAwOwogfQogCi12b2lkIGZ4X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoraW50IGZ4X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXVuc2lnbmVkIGFmdGVyX214Y3NyX21hc2s7CisJaW50IGVycjsKKworCWVyciA9IGZwdV9hbGxvYygmdmNwdS0+YXJjaC5ndWVzdF9mcHUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmcHVfZmluaXQoJnZjcHUtPmFyY2guZ3Vlc3RfZnB1KTsKIAogCS8qCi0JICogVG91Y2ggdGhlIGZwdSB0aGUgZmlyc3QgdGltZSBpbiBub24gYXRvbWljIGNvbnRleHQgYXMgaWYKLQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBmcHUgaW5zdHJ1Y3Rpb24gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyCi0JICogd2lsbCBmaXJlIGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb24gcmV0dXJucyBhbmQgaXQnbGwgaGF2ZSB0bwotCSAqIGFsbG9jYXRlIHJhbSB3aXRoIEdGUF9LRVJORUwuCisJICogRW5zdXJlIGd1ZXN0IHhjcjAgaXMgdmFsaWQgZm9yIGxvYWRpbmcKIAkgKi8KLQlpZiAoIXVzZWRfbWF0aCgpKQotCQlrdm1fZnhfc2F2ZSgmdmNwdS0+YXJjaC5ob3N0X2Z4X2ltYWdlKTsKLQotCS8qIEluaXRpYWxpemUgZ3Vlc3QgRlBVIGJ5IHJlc2V0dGluZyBvdXJzIGFuZCBzYXZpbmcgaW50byBndWVzdCdzICovCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0Ja3ZtX2Z4X3NhdmUoJnZjcHUtPmFyY2guaG9zdF9meF9pbWFnZSk7Ci0Ja3ZtX2Z4X2Zpbml0KCk7Ci0Ja3ZtX2Z4X3NhdmUoJnZjcHUtPmFyY2guZ3Vlc3RfZnhfaW1hZ2UpOwotCWt2bV9meF9yZXN0b3JlKCZ2Y3B1LT5hcmNoLmhvc3RfZnhfaW1hZ2UpOwotCXByZWVtcHRfZW5hYmxlKCk7CisJdmNwdS0+YXJjaC54Y3IwID0gWFNUQVRFX0ZQOwogCiAJdmNwdS0+YXJjaC5jcjAgfD0gWDg2X0NSMF9FVDsKLQlhZnRlcl9teGNzcl9tYXNrID0gb2Zmc2V0b2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCwgc3Rfc3BhY2UpOwotCXZjcHUtPmFyY2guZ3Vlc3RfZnhfaW1hZ2UubXhjc3IgPSAweDFmODA7Ci0JbWVtc2V0KCh2b2lkICopJnZjcHUtPmFyY2guZ3Vlc3RfZnhfaW1hZ2UgKyBhZnRlcl9teGNzcl9tYXNrLAotCSAgICAgICAwLCBzaXplb2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCkgLSBhZnRlcl9teGNzcl9tYXNrKTsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnhfaW5pdCk7CiAKK3N0YXRpYyB2b2lkIGZ4X2ZyZWUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWZwdV9mcmVlKCZ2Y3B1LT5hcmNoLmd1ZXN0X2ZwdSk7Cit9CisKIHZvaWQga3ZtX2xvYWRfZ3Vlc3RfZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpZiAodmNwdS0+Z3Vlc3RfZnB1X2xvYWRlZCkKIAkJcmV0dXJuOwogCisJLyoKKwkgKiBSZXN0b3JlIGFsbCBwb3NzaWJsZSBzdGF0ZXMgaW4gdGhlIGd1ZXN0LAorCSAqIGFuZCBhc3N1bWUgaG9zdCB3b3VsZCB1c2UgYWxsIGF2YWlsYWJsZSBiaXRzLgorCSAqIEd1ZXN0IHhjcjAgd291bGQgYmUgbG9hZGVkIGxhdGVyLgorCSAqLworCWt2bV9wdXRfZ3Vlc3RfeGNyMCh2Y3B1KTsKIAl2Y3B1LT5ndWVzdF9mcHVfbG9hZGVkID0gMTsKLQlrdm1fZnhfc2F2ZSgmdmNwdS0+YXJjaC5ob3N0X2Z4X2ltYWdlKTsKLQlrdm1fZnhfcmVzdG9yZSgmdmNwdS0+YXJjaC5ndWVzdF9meF9pbWFnZSk7CisJdW5sYXp5X2ZwdShjdXJyZW50KTsKKwlmcHVfcmVzdG9yZV9jaGVja2luZygmdmNwdS0+YXJjaC5ndWVzdF9mcHUpOwogCXRyYWNlX2t2bV9mcHUoMSk7CiB9CiAKIHZvaWQga3ZtX3B1dF9ndWVzdF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWt2bV9wdXRfZ3Vlc3RfeGNyMCh2Y3B1KTsKKwogCWlmICghdmNwdS0+Z3Vlc3RfZnB1X2xvYWRlZCkKIAkJcmV0dXJuOwogCiAJdmNwdS0+Z3Vlc3RfZnB1X2xvYWRlZCA9IDA7Ci0Ja3ZtX2Z4X3NhdmUoJnZjcHUtPmFyY2guZ3Vlc3RfZnhfaW1hZ2UpOwotCWt2bV9meF9yZXN0b3JlKCZ2Y3B1LT5hcmNoLmhvc3RfZnhfaW1hZ2UpOworCWZwdV9zYXZlX2luaXQoJnZjcHUtPmFyY2guZ3Vlc3RfZnB1KTsKIAkrK3ZjcHUtPnN0YXQuZnB1X3JlbG9hZDsKLQlzZXRfYml0KEtWTV9SRVFfREVBQ1RJVkFURV9GUFUsICZ2Y3B1LT5yZXF1ZXN0cyk7CisJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX0RFQUNUSVZBVEVfRlBVLCB2Y3B1KTsKIAl0cmFjZV9rdm1fZnB1KDApOwogfQogCkBAIC01MjA0LDYgKzUzMjUsOCBAQAogCQl2Y3B1LT5hcmNoLnRpbWVfcGFnZSA9IE5VTEw7CiAJfQogCisJZnJlZV9jcHVtYXNrX3Zhcih2Y3B1LT5hcmNoLndiaW52ZF9kaXJ0eV9tYXNrKTsKKwlmeF9mcmVlKHZjcHUpOwogCWt2bV94ODZfb3BzLT52Y3B1X2ZyZWUodmNwdSk7CiB9CiAKQEAgLTUyMTcsOSArNTM0MCw2IEBACiB7CiAJaW50IHI7CiAKLQkvKiBXZSBkbyBmeHNhdmU6IHRoaXMgbXVzdCBiZSBhbGlnbmVkLiAqLwotCUJVR19PTigodW5zaWduZWQgbG9uZykmdmNwdS0+YXJjaC5ob3N0X2Z4X2ltYWdlICYgMHhGKTsKLQogCXZjcHUtPmFyY2gubXRycl9zdGF0ZS5oYXZlX2ZpeGVkID0gMTsKIAl2Y3B1X2xvYWQodmNwdSk7CiAJciA9IGt2bV9hcmNoX3ZjcHVfcmVzZXQodmNwdSk7CkBAIC01MjQxLDYgKzUzNjEsNyBAQAogCWt2bV9tbXVfdW5sb2FkKHZjcHUpOwogCXZjcHVfcHV0KHZjcHUpOwogCisJZnhfZnJlZSh2Y3B1KTsKIAlrdm1feDg2X29wcy0+dmNwdV9mcmVlKHZjcHUpOwogfQogCkBAIC01MzM0LDcgKzU0NTUsMTIgQEAKIAl9CiAJdmNwdS0+YXJjaC5tY2dfY2FwID0gS1ZNX01BWF9NQ0VfQkFOS1M7CiAKKwlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmdmNwdS0+YXJjaC53YmludmRfZGlydHlfbWFzaywgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZmFpbF9mcmVlX21jZV9iYW5rczsKKwogCXJldHVybiAwOworZmFpbF9mcmVlX21jZV9iYW5rczoKKwlrZnJlZSh2Y3B1LT5hcmNoLm1jZV9iYW5rcyk7CiBmYWlsX2ZyZWVfbGFwaWM6CiAJa3ZtX2ZyZWVfbGFwaWModmNwdSk7CiBmYWlsX21tdV9kZXN0cm95OgpAQCAtNTM2NCwxMiArNTQ5MCw2IEBACiAJaWYgKCFrdm0pCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0Ja3ZtLT5hcmNoLmFsaWFzZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX21lbV9hbGlhc2VzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrdm0tPmFyY2guYWxpYXNlcykgewotCQlrZnJlZShrdm0pOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0KIAlJTklUX0xJU1RfSEVBRCgma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMpOwogCUlOSVRfTElTVF9IRUFEKCZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQpOwogCkBAIC01NDEyLDEyICs1NTMyLDEyIEBACiB2b2lkIGt2bV9hcmNoX3N5bmNfZXZlbnRzKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAlrdm1fZnJlZV9hbGxfYXNzaWduZWRfZGV2aWNlcyhrdm0pOworCWt2bV9mcmVlX3BpdChrdm0pOwogfQogCiB2b2lkIGt2bV9hcmNoX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKQogewogCWt2bV9pb21tdV91bm1hcF9ndWVzdChrdm0pOwotCWt2bV9mcmVlX3BpdChrdm0pOwogCWtmcmVlKGt2bS0+YXJjaC52cGljKTsKIAlrZnJlZShrdm0tPmFyY2gudmlvYXBpYyk7CiAJa3ZtX2ZyZWVfdmNwdXMoa3ZtKTsKQEAgLTU0MjcsNyArNTU0Nyw2IEBACiAJaWYgKGt2bS0+YXJjaC5lcHRfaWRlbnRpdHlfcGFnZXRhYmxlKQogCQlwdXRfcGFnZShrdm0tPmFyY2guZXB0X2lkZW50aXR5X3BhZ2V0YWJsZSk7CiAJY2xlYW51cF9zcmN1X3N0cnVjdCgma3ZtLT5zcmN1KTsKLQlrZnJlZShrdm0tPmFyY2guYWxpYXNlcyk7CiAJa2ZyZWUoa3ZtKTsKIH0KIApAQCAtNTQzOCw2ICs1NTU3LDExIEBACiAJCQkJaW50IHVzZXJfYWxsb2MpCiB7CiAJaW50IG5wYWdlcyA9IG1lbXNsb3QtPm5wYWdlczsKKwlpbnQgbWFwX2ZsYWdzID0gTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTOworCisJLyogUHJldmVudCBpbnRlcm5hbCBzbG90IHBhZ2VzIGZyb20gYmVpbmcgbW92ZWQgYnkgZm9yaygpL0NPVy4gKi8KKwlpZiAobWVtc2xvdC0+aWQgPj0gS1ZNX01FTU9SWV9TTE9UUykKKwkJbWFwX2ZsYWdzID0gTUFQX1NIQVJFRCB8IE1BUF9BTk9OWU1PVVM7CiAKIAkvKlRvIGtlZXAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHVzZXJzcGFjZSwKIAkgKng4NiBuZWVkcyB0byBoYW5sZGUgIXVzZXJfYWxsb2MgY2FzZS4KQEAgLTU0NTAsNyArNTU3NCw3IEBACiAJCQl1c2Vyc3BhY2VfYWRkciA9IGRvX21tYXAoTlVMTCwgMCwKIAkJCQkJCSBucGFnZXMgKiBQQUdFX1NJWkUsCiAJCQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCQkJCSBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsCisJCQkJCQkgbWFwX2ZsYWdzLAogCQkJCQkJIDApOwogCQkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKQEAgLTU1MjMsNyArNTY0Nyw3IEBACiAKIAltZSA9IGdldF9jcHUoKTsKIAlpZiAoY3B1ICE9IG1lICYmICh1bnNpZ25lZCljcHUgPCBucl9jcHVfaWRzICYmIGNwdV9vbmxpbmUoY3B1KSkKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEtWTV9SRVFfS0lDSywgJnZjcHUtPnJlcXVlc3RzKSkKKwkJaWYgKGF0b21pY194Y2hnKCZ2Y3B1LT5ndWVzdF9tb2RlLCAwKSkKIAkJCXNtcF9zZW5kX3Jlc2NoZWR1bGUoY3B1KTsKIAlwdXRfY3B1KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2LmggYi9hcmNoL3g4Ni9rdm0veDg2LmgKaW5kZXggZjRiNTQ0NS4uYjdhNDA0NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3g4Ni5oCisrKyBiL2FyY2gveDg2L2t2bS94ODYuaApAQCAtNjUsMTMgKzY1LDYgQEAKIAlyZXR1cm4ga3ZtX3JlYWRfY3IwX2JpdHModmNwdSwgWDg2X0NSMF9QRyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGt2bV9tZW1fYWxpYXNlcyAqa3ZtX2FsaWFzZXMoc3RydWN0IGt2bSAqa3ZtKQotewotCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2soa3ZtLT5hcmNoLmFsaWFzZXMsCi0JCQlzcmN1X3JlYWRfbG9ja19oZWxkKCZrdm0tPnNyY3UpCi0JCQl8fCBsb2NrZGVwX2lzX2hlbGQoJmt2bS0+c2xvdHNfbG9jaykpOwotfQotCiB2b2lkIGt2bV9iZWZvcmVfaGFuZGxlX25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fYWZ0ZXJfaGFuZGxlX25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUgYi9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKaW5kZXggZjg3MWUwNC4uZTEwY2YwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQpAQCAtMzAsNiArMzAsNyBAQAogICAgICAgICBsaWIteSArPSBjaGVja3N1bV8zMi5vCiAgICAgICAgIGxpYi15ICs9IHN0cnN0cl8zMi5vCiAgICAgICAgIGxpYi15ICs9IHNlbWFwaG9yZV8zMi5vIHN0cmluZ18zMi5vCisgICAgICAgIGxpYi15ICs9IGNtcHhjaGcubwogaWZuZXEgKCQoQ09ORklHX1g4Nl9DTVBYQ0hHNjQpLHkpCiAgICAgICAgIGxpYi15ICs9IGNtcHhjaGc4Yl9lbXUubyBhdG9taWM2NF8zODZfMzIubwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9jbXB4Y2hnLmMgYi9hcmNoL3g4Ni9saWIvY21weGNoZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjE5ZjZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvbGliL2NtcHhjaGcuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogY21weGNoZyooKSBmYWxsYmFja3MgZm9yIENQVSBub3Qgc3VwcG9ydGluZyB0aGVzZSBpbnN0cnVjdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZm5kZWYgQ09ORklHX1g4Nl9DTVBYQ0hHCit1bnNpZ25lZCBsb25nIGNtcHhjaGdfMzg2X3U4KHZvbGF0aWxlIHZvaWQgKnB0ciwgdTggb2xkLCB1OCBuZXcpCit7CisJdTggcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUG9vciBtYW4ncyBjbXB4Y2hnIGZvciAzODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmV2ID0gKih1OCAqKXB0cjsKKwlpZiAocHJldiA9PSBvbGQpCisJCSoodTggKilwdHIgPSBuZXc7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBwcmV2OworfQorRVhQT1JUX1NZTUJPTChjbXB4Y2hnXzM4Nl91OCk7CisKK3Vuc2lnbmVkIGxvbmcgY21weGNoZ18zODZfdTE2KHZvbGF0aWxlIHZvaWQgKnB0ciwgdTE2IG9sZCwgdTE2IG5ldykKK3sKKwl1MTYgcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUG9vciBtYW4ncyBjbXB4Y2hnIGZvciAzODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmV2ID0gKih1MTYgKilwdHI7CisJaWYgKHByZXYgPT0gb2xkKQorCQkqKHUxNiAqKXB0ciA9IG5ldzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHByZXY7Cit9CitFWFBPUlRfU1lNQk9MKGNtcHhjaGdfMzg2X3UxNik7CisKK3Vuc2lnbmVkIGxvbmcgY21weGNoZ18zODZfdTMyKHZvbGF0aWxlIHZvaWQgKnB0ciwgdTMyIG9sZCwgdTMyIG5ldykKK3sKKwl1MzIgcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUG9vciBtYW4ncyBjbXB4Y2hnIGZvciAzODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmV2ID0gKih1MzIgKilwdHI7CisJaWYgKHByZXYgPT0gb2xkKQorCQkqKHUzMiAqKXB0ciA9IG5ldzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHByZXY7Cit9CitFWFBPUlRfU1lNQk9MKGNtcHhjaGdfMzg2X3UzMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jIGIvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMKaW5kZXggYTcyNWI3Zi4uMDAwMmEzYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMKKysrIGIvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMKQEAgLTM3LDYgKzM3LDI4IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIH07CiAKKy8qIGluZGljZXMgZm9yIGFkZHJlc3NfbWFya2Vyczsga2VlcCBzeW5jJ2Qgdy8gYWRkcmVzc19tYXJrZXJzIGJlbG93ICovCitlbnVtIGFkZHJlc3NfbWFya2Vyc19pZHggeworCVVTRVJfU1BBQ0VfTlIgPSAwLAorI2lmZGVmIENPTkZJR19YODZfNjQKKwlLRVJORUxfU1BBQ0VfTlIsCisJTE9XX0tFUk5FTF9OUiwKKwlWTUFMTE9DX1NUQVJUX05SLAorCVZNRU1NQVBfU1RBUlRfTlIsCisJSElHSF9LRVJORUxfTlIsCisJTU9EVUxFU19WQUREUl9OUiwKKwlNT0RVTEVTX0VORF9OUiwKKyNlbHNlCisJS0VSTkVMX1NQQUNFX05SLAorCVZNQUxMT0NfU1RBUlRfTlIsCisJVk1BTExPQ19FTkRfTlIsCisjIGlmZGVmIENPTkZJR19ISUdITUVNCisJUEtNQVBfQkFTRV9OUiwKKyMgZW5kaWYKKwlGSVhBRERSX1NUQVJUX05SLAorI2VuZGlmCit9OworCiAvKiBBZGRyZXNzIHNwYWNlIG1hcmtlcnMgaGludHMgKi8KIHN0YXRpYyBzdHJ1Y3QgYWRkcl9tYXJrZXIgYWRkcmVzc19tYXJrZXJzW10gPSB7CiAJeyAwLCAiVXNlciBTcGFjZSIgfSwKQEAgLTMzMSwxNCArMzUzLDEyIEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJLyogTm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50IG9uIHg4Ni0zMiAqLwotCWFkZHJlc3NfbWFya2Vyc1syXS5zdGFydF9hZGRyZXNzID0gVk1BTExPQ19TVEFSVDsKLQlhZGRyZXNzX21hcmtlcnNbM10uc3RhcnRfYWRkcmVzcyA9IFZNQUxMT0NfRU5EOworCWFkZHJlc3NfbWFya2Vyc1tWTUFMTE9DX1NUQVJUX05SXS5zdGFydF9hZGRyZXNzID0gVk1BTExPQ19TVEFSVDsKKwlhZGRyZXNzX21hcmtlcnNbVk1BTExPQ19FTkRfTlJdLnN0YXJ0X2FkZHJlc3MgPSBWTUFMTE9DX0VORDsKICMgaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlhZGRyZXNzX21hcmtlcnNbNF0uc3RhcnRfYWRkcmVzcyA9IFBLTUFQX0JBU0U7Ci0JYWRkcmVzc19tYXJrZXJzWzVdLnN0YXJ0X2FkZHJlc3MgPSBGSVhBRERSX1NUQVJUOwotIyBlbHNlCi0JYWRkcmVzc19tYXJrZXJzWzRdLnN0YXJ0X2FkZHJlc3MgPSBGSVhBRERSX1NUQVJUOworCWFkZHJlc3NfbWFya2Vyc1tQS01BUF9CQVNFX05SXS5zdGFydF9hZGRyZXNzID0gUEtNQVBfQkFTRTsKICMgZW5kaWYKKwlhZGRyZXNzX21hcmtlcnNbRklYQUREUl9TVEFSVF9OUl0uc3RhcnRfYWRkcmVzcyA9IEZJWEFERFJfU1RBUlQ7CiAjZW5kaWYKIAogCXBlID0gZGVidWdmc19jcmVhdGVfZmlsZSgia2VybmVsX3BhZ2VfdGFibGVzIiwgMDYwMCwgTlVMTCwgTlVMTCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfNjQuYyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwppbmRleCBlZTQxYmJhLi45YTY2NzQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCkBAIC0yLDcgKzIsNyBAQAogICogIGxpbnV4L2FyY2gveDg2XzY0L21tL2luaXQuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBBbmRpIEtsZWVuIDxha0BzdXNlLmRlPgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2lvcmVtYXAuYyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwppbmRleCAxMmU0ZDJkLi4zYmE2ZTA2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vaW9yZW1hcC5jCkBAIC02Miw4ICs2Miw4IEBACiBzdGF0aWMgdm9pZCBfX2lvbWVtICpfX2lvcmVtYXBfY2FsbGVyKHJlc291cmNlX3NpemVfdCBwaHlzX2FkZHIsCiAJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBwcm90X3ZhbCwgdm9pZCAqY2FsbGVyKQogewotCXVuc2lnbmVkIGxvbmcgcGZuLCBvZmZzZXQsIHZhZGRyOwotCXJlc291cmNlX3NpemVfdCBsYXN0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHZhZGRyOworCXJlc291cmNlX3NpemVfdCBwZm4sIGxhc3RfcGZuLCBsYXN0X2FkZHI7CiAJY29uc3QgcmVzb3VyY2Vfc2l6ZV90IHVuYWxpZ25lZF9waHlzX2FkZHIgPSBwaHlzX2FkZHI7CiAJY29uc3QgdW5zaWduZWQgbG9uZyB1bmFsaWduZWRfc2l6ZSA9IHNpemU7CiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKQEAgLTEwMCwxMCArMTAwLDggQEAKIAkvKgogCSAqIERvbid0IGFsbG93IGFueWJvZHkgdG8gcmVtYXAgbm9ybWFsIFJBTSB0aGF0IHdlJ3JlIHVzaW5nLi4KIAkgKi8KLQlmb3IgKHBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCQkJCShwZm4gPDwgUEFHRV9TSElGVCkgPCAobGFzdF9hZGRyICYgUEFHRV9NQVNLKTsKLQkJCQlwZm4rKykgewotCisJbGFzdF9wZm4gPSBsYXN0X2FkZHIgPj4gUEFHRV9TSElGVDsKKwlmb3IgKHBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOyBwZm4gPD0gbGFzdF9wZm47IHBmbisrKSB7CiAJCWludCBpc19yYW0gPSBwYWdlX2lzX3JhbShwZm4pOwogCiAJCWlmIChpc19yYW0gJiYgcGZuX3ZhbGlkKHBmbikgJiYgIVBhZ2VSZXNlcnZlZChwZm5fdG9fcGFnZShwZm4pKSkKQEAgLTExNSw3ICsxMTMsNyBAQAogCSAqIE1hcHBpbmdzIGhhdmUgdG8gYmUgcGFnZS1hbGlnbmVkCiAJICovCiAJb2Zmc2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKLQlwaHlzX2FkZHIgJj0gUEFHRV9NQVNLOworCXBoeXNfYWRkciAmPSBQSFlTSUNBTF9QQUdFX01BU0s7CiAJc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyKzEpIC0gcGh5c19hZGRyOwogCiAJcmV0dmFsID0gcmVzZXJ2ZV9tZW10eXBlKHBoeXNfYWRkciwgKHU2NClwaHlzX2FkZHIgKyBzaXplLApAQCAtNjEzLDcgKzYxMSw3IEBACiAJCXJldHVybjsKIAl9CiAJb2Zmc2V0ID0gdmlydF9hZGRyICYgflBBR0VfTUFTSzsKLQlucnBhZ2VzID0gUEFHRV9BTElHTihvZmZzZXQgKyBzaXplIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlucnBhZ2VzID0gUEFHRV9BTElHTihvZmZzZXQgKyBzaXplKSA+PiBQQUdFX1NISUZUOwogCiAJaWR4ID0gRklYX0JUTUFQX0JFR0lOIC0gTlJfRklYX0JUTUFQUypzbG90OwogCXdoaWxlIChucnBhZ2VzID4gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0va21taW8uYyBiL2FyY2gveDg2L21tL2ttbWlvLmMKaW5kZXggNWQwZTY3Zi4uZTVkNWUyYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0va21taW8uYworKysgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCkBAIC00NSw2ICs0NSw4IEBACiAJICogUHJvdGVjdGVkIGJ5IGttbWlvX2xvY2ssIHdoZW4gbGlua2VkIGludG8ga21taW9fcGFnZV90YWJsZS4KIAkgKi8KIAlpbnQgY291bnQ7CisKKwlib29sIHNjaGVkdWxlZF9mb3JfcmVsZWFzZTsKIH07CiAKIHN0cnVjdCBrbW1pb19kZWxheWVkX3JlbGVhc2UgewpAQCAtMzk4LDggKzQwMCwxMSBAQAogCUJVR19PTihmLT5jb3VudCA8IDApOwogCWlmICghZi0+Y291bnQpIHsKIAkJZGlzYXJtX2ttbWlvX2ZhdWx0X3BhZ2UoZik7Ci0JCWYtPnJlbGVhc2VfbmV4dCA9ICpyZWxlYXNlX2xpc3Q7Ci0JCSpyZWxlYXNlX2xpc3QgPSBmOworCQlpZiAoIWYtPnNjaGVkdWxlZF9mb3JfcmVsZWFzZSkgeworCQkJZi0+cmVsZWFzZV9uZXh0ID0gKnJlbGVhc2VfbGlzdDsKKwkJCSpyZWxlYXNlX2xpc3QgPSBmOworCQkJZi0+c2NoZWR1bGVkX2Zvcl9yZWxlYXNlID0gdHJ1ZTsKKwkJfQogCX0KIH0KIApAQCAtNDcxLDggKzQ3NiwxMCBAQAogCQkJcHJldnAgPSAmZi0+cmVsZWFzZV9uZXh0OwogCQl9IGVsc2UgewogCQkJKnByZXZwID0gZi0+cmVsZWFzZV9uZXh0OworCQkJZi0+cmVsZWFzZV9uZXh0ID0gTlVMTDsKKwkJCWYtPnNjaGVkdWxlZF9mb3JfcmVsZWFzZSA9IGZhbHNlOwogCQl9Ci0JCWYgPSBmLT5yZWxlYXNlX25leHQ7CisJCWYgPSAqcHJldnA7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmttbWlvX2xvY2ssIGZsYWdzKTsKIApAQCAtNTEwLDYgKzUxNyw5IEBACiAJa21taW9fY291bnQtLTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbW1pb19sb2NrLCBmbGFncyk7CiAKKwlpZiAoIXJlbGVhc2VfbGlzdCkKKwkJcmV0dXJuOworCiAJZHJlbGVhc2UgPSBrbWFsbG9jKHNpemVvZigqZHJlbGVhc2UpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWRyZWxlYXNlKSB7CiAJCXByX2NyaXQoImxlYWtpbmcga21taW9fZmF1bHRfcGFnZSBvYmplY3RzLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQuYyBiL2FyY2gveDg2L21tL3BhdC5jCmluZGV4IDY0MTIxYTEuLmY2ZmY1N2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhdC5jCisrKyBiL2FyY2gveDg2L21tL3BhdC5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAlyZXR1cm4gcmVxX3R5cGU7CiB9CiAKLXN0YXRpYyBpbnQgcGF0X3BhZ2VyYW5nZV9pc19yYW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCitzdGF0aWMgaW50IHBhdF9wYWdlcmFuZ2VfaXNfcmFtKHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IGVuZCkKIHsKIAlpbnQgcmFtX3BhZ2UgPSAwLCBub3RfcmFtcGFnZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBwYWdlX25yOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGZfaW4uYyBiL2FyY2gveDg2L21tL3BmX2luLmMKaW5kZXggMzA4ZTMyNS4uMzhlNmQxNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGZfaW4uYworKysgYi9hcmNoL3g4Ni9tbS9wZl9pbi5jCkBAIC00MCwxNiArNDAsMTYgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVnX3JvcFtdID0gewogCTB4OEEsIDB4OEIsIDB4QjYwRiwgMHhCNzBGLCAweEJFMEYsIDB4QkYwRgogfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVnX3dvcFtdID0geyAweDg4LCAweDg5IH07CitzdGF0aWMgdW5zaWduZWQgaW50IHJlZ193b3BbXSA9IHsgMHg4OCwgMHg4OSwgMHhBQSwgMHhBQiB9Owogc3RhdGljIHVuc2lnbmVkIGludCBpbW1fd29wW10gPSB7IDB4QzYsIDB4QzcgfTsKIC8qIElBMzIgTWFudWFsIDMsIDMtNDMyKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnc4W10gPSB7IDB4ODgsIDB4OEEsIDB4QzYgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnc4W10gPSB7IDB4ODgsIDB4OEEsIDB4QzYsIDB4QUEgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnczMltdID0gewotCTB4ODksIDB4OEIsIDB4QzcsIDB4QjYwRiwgMHhCNzBGLCAweEJFMEYsIDB4QkYwRgorCTB4ODksIDB4OEIsIDB4QzcsIDB4QjYwRiwgMHhCNzBGLCAweEJFMEYsIDB4QkYwRiwgMHhBQgogfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXc4W10gPSB7IDB4ODgsIDB4OEEsIDB4QzYsIDB4QjYwRiwgMHhCRTBGIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG13OFtdID0geyAweDg4LCAweDhBLCAweEM2LCAweEI2MEYsIDB4QkUwRiwgMHhBQSB9Owogc3RhdGljIHVuc2lnbmVkIGludCBtdzE2W10gPSB7IDB4QjcwRiwgMHhCRjBGIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG13MzJbXSA9IHsgMHg4OSwgMHg4QiwgMHhDNyB9Oworc3RhdGljIHVuc2lnbmVkIGludCBtdzMyW10gPSB7IDB4ODksIDB4OEIsIDB4QzcsIDB4QUIgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXc2NFtdID0ge307CiAjZWxzZSAvKiBub3QgX19pMzg2X18gKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHByZWZpeF9jb2Rlc1tdID0gewpAQCAtNjMsMjAgKzYzLDIwIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHJlZ19yb3BbXSA9IHsKIAkweDhBLCAweDhCLCAweEI2MEYsIDB4QjcwRiwgMHhCRTBGLCAweEJGMEYKIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHJlZ193b3BbXSA9IHsgMHg4OCwgMHg4OSB9Oworc3RhdGljIHVuc2lnbmVkIGludCByZWdfd29wW10gPSB7IDB4ODgsIDB4ODksIDB4QUEsIDB4QUIgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW1tX3dvcFtdID0geyAweEM2LCAweEM3IH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHJ3OFtdID0geyAweEM2LCAweDg4LCAweDhBIH07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ3OFtdID0geyAweEM2LCAweDg4LCAweDhBLCAweEFBIH07CiBzdGF0aWMgdW5zaWduZWQgaW50IHJ3MzJbXSA9IHsKLQkweEM3LCAweDg5LCAweDhCLCAweEI2MEYsIDB4QjcwRiwgMHhCRTBGLCAweEJGMEYKKwkweEM3LCAweDg5LCAweDhCLCAweEI2MEYsIDB4QjcwRiwgMHhCRTBGLCAweEJGMEYsIDB4QUIKIH07CiAvKiA4IGJpdCBvbmx5ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG13OFtdID0geyAweEM2LCAweDg4LCAweDhBLCAweEI2MEYsIDB4QkUwRiB9Oworc3RhdGljIHVuc2lnbmVkIGludCBtdzhbXSA9IHsgMHhDNiwgMHg4OCwgMHg4QSwgMHhCNjBGLCAweEJFMEYsIDB4QUEgfTsKIC8qIDE2IGJpdCBvbmx5ICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG13MTZbXSA9IHsgMHhCNzBGLCAweEJGMEYgfTsKIC8qIDE2IG9yIDMyIGJpdCAqLwogc3RhdGljIHVuc2lnbmVkIGludCBtdzMyW10gPSB7IDB4QzcgfTsKIC8qIDE2LCAzMiBvciA2NCBiaXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXc2NFtdID0geyAweDg5LCAweDhCIH07CitzdGF0aWMgdW5zaWduZWQgaW50IG13NjRbXSA9IHsgMHg4OSwgMHg4QiwgMHhBQiB9OwogI2VuZGlmIC8qIG5vdCBfX2kzODZfXyAqLwogCiBzdHJ1Y3QgcHJlZml4X2JpdHMgewpAQCAtNDEwLDcgKzQxMCw2IEBACiB1bnNpZ25lZCBsb25nIGdldF9pbnNfcmVnX3ZhbCh1bnNpZ25lZCBsb25nIGluc19hZGRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlOwotCXVuc2lnbmVkIGNoYXIgbW9kX3JtOwogCWludCByZWc7CiAJdW5zaWduZWQgY2hhciAqcDsKIAlzdHJ1Y3QgcHJlZml4X2JpdHMgcHJmOwpAQCAtNDM3LDggKzQzNiwxMyBAQAogCWdvdG8gZXJyOwogCiBkb193b3JrOgotCW1vZF9ybSA9ICpwOwotCXJlZyA9ICgobW9kX3JtID4+IDMpICYgMHg3KSB8IChwcmYucmV4ciA8PCAzKTsKKwkvKiBmb3IgU1RPUywgc291cmNlIHJlZ2lzdGVyIGlzIGZpeGVkICovCisJaWYgKG9wY29kZSA9PSAweEFBIHx8IG9wY29kZSA9PSAweEFCKSB7CisJCXJlZyA9IGFyZ19BWDsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBjaGFyIG1vZF9ybSA9ICpwOworCQlyZWcgPSAoKG1vZF9ybSA+PiAzKSAmIDB4NykgfCAocHJmLnJleHIgPDwgMyk7CisJfQogCXN3aXRjaCAoZ2V0X2luc19yZWdfd2lkdGgoaW5zX2FkZHIpKSB7CiAJY2FzZSAxOgogCQlyZXR1cm4gKmdldF9yZWdfdzgocmVnLCBwcmYucmV4LCByZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3Rlc3RtbWlvdHJhY2UuYyBiL2FyY2gveDg2L21tL3Rlc3RtbWlvdHJhY2UuYwppbmRleCA4NTY1ZDk0Li4zODg2OGFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS90ZXN0bW1pb3RyYWNlLmMKKysrIGIvYXJjaC94ODYvbW0vdGVzdG1taW90cmFjZS5jCkBAIC05MCw2ICs5MCwyNyBAQAogCWlvdW5tYXAocCk7CiB9CiAKKy8qCisgKiBUZXN0cyBob3cgbW1pb3RyYWNlIGJlaGF2ZXMgaW4gZmFjZSBvZiBtdWx0aXBsZSBpb3JlbWFwIC8gaW91bm1hcHMgaW4KKyAqIGEgc2hvcnQgdGltZS4gV2UgaGFkIGEgYnVnIGluIGRlZmVycmVkIGZyZWVpbmcgcHJvY2VkdXJlIHdoaWNoIHRyaWVkCisgKiB0byBmcmVlIHRoaXMgcmVnaW9uIG11bHRpcGxlIHRpbWVzIChpb3JlbWFwIGNhbiByZXVzZSB0aGUgc2FtZSBhZGRyZXNzCisgKiBmb3IgbWFueSBtYXBwaW5ncykuCisgKi8KK3N0YXRpYyB2b2lkIGRvX3Rlc3RfYnVsa19pb3JlbWFwcGluZyh2b2lkKQoreworCXZvaWQgX19pb21lbSAqcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CisJCXAgPSBpb3JlbWFwX25vY2FjaGUobW1pb19hZGRyZXNzLCBQQUdFX1NJWkUpOworCQlpZiAocCkKKwkJCWlvdW5tYXAocCk7CisJfQorCisJLyogRm9yY2UgZnJlZWluZy4gSWYgaXQgd2lsbCBjcmFzaCB3ZSB3aWxsIGtub3cgd2h5LiAqLworCXN5bmNocm9uaXplX3JjdSgpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBzaXplID0gKHJlYWRfZmFyKSA/ICg4IDw8IDIwKSA6ICgxNiA8PCAxMCk7CkBAIC0xMDQsNiArMTI1LDcgQEAKIAkJICAgImFuZCB3cml0aW5nIDE2IGtCIG9mIHJ1YmJpc2ggaW4gdGhlcmUuXG4iLAogCQkgICBzaXplID4+IDEwLCBtbWlvX2FkZHJlc3MpOwogCWRvX3Rlc3Qoc2l6ZSk7CisJZG9fdGVzdF9idWxrX2lvcmVtYXBwaW5nKCk7CiAJcHJfaW5mbygiQWxsIGRvbmUuXG4iKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3RsYi5jIGIvYXJjaC94ODYvbW0vdGxiLmMKaW5kZXggNDI2ZjNhMS4uYzAzZjE0YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vdGxiLmMKKysrIGIvYXJjaC94ODYvbW0vdGxiLmMKQEAgLTI3OCwxMSArMjc4LDkgQEAKIAogc3RhdGljIHZvaWQgZG9fZmx1c2hfdGxiX2FsbCh2b2lkICppbmZvKQogewotCXVuc2lnbmVkIGxvbmcgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCiAJX19mbHVzaF90bGJfYWxsKCk7CiAJaWYgKHBlcmNwdV9yZWFkKGNwdV90bGJzdGF0ZS5zdGF0ZSkgPT0gVExCU1RBVEVfTEFaWSkKLQkJbGVhdmVfbW0oY3B1KTsKKwkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIH0KIAogdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggYjI4ZDJmMS4uMWJhNjdkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtNjM0LDYgKzYzNCwxOCBAQAogCWlmIChmb3JjZV9hcmNoX3BlcmZtb24gJiYgY3B1X2hhc19hcmNoX3BlcmZtb24pCiAJCXJldHVybiAwOwogCisJLyoKKwkgKiBEb2N1bWVudGF0aW9uIG9uIGlkZW50aWZ5aW5nIEludGVsIHByb2Nlc3NvcnMgYnkgQ1BVIGZhbWlseQorCSAqIGFuZCBtb2RlbCBjYW4gYmUgZm91bmQgaW4gdGhlIEludGVsIFNvZnR3YXJlIERldmVsb3BlcidzCisJICogTWFudWFscyAoU0RNKToKKwkgKgorCSAqICBodHRwOi8vd3d3LmludGVsLmNvbS9wcm9kdWN0cy9wcm9jZXNzb3IvbWFudWFscy8KKwkgKgorCSAqIEFzIG9mIE1heSAyMDEwIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHdhcyBpbiB0aGU6CisJICogIkludGVsIDY0IGFuZCBJQS0zMiBBcmNoaXRlY3R1cmVzIFNvZnR3YXJlIERldmVsb3BlcidzCisJICogTWFudWFsIFZvbHVtZSAzQjogU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlIiwgIlRhYmxlIEItMQorCSAqIENQVUlEIFNpZ25hdHVyZSBWYWx1ZXMgb2YgRGlzcGxheUZhbWlseV9EaXNwbGF5TW9kZWwiLgorCSAqLwogCXN3aXRjaCAoY3B1X21vZGVsKSB7CiAJY2FzZSAwIC4uLiAyOgogCQkqY3B1X3R5cGUgPSAiaTM4Ni9wcHJvIjsKQEAgLTY1NSwxMiArNjY3LDEyIEBACiAJY2FzZSAxNTogY2FzZSAyMzoKIAkJKmNwdV90eXBlID0gImkzODYvY29yZV8yIjsKIAkJYnJlYWs7CisJY2FzZSAweDFhOgogCWNhc2UgMHgyZToKLQljYXNlIDI2OgogCQlzcGVjID0gJm9wX2FyY2hfcGVyZm1vbl9zcGVjOwogCQkqY3B1X3R5cGUgPSAiaTM4Ni9jb3JlX2k3IjsKIAkJYnJlYWs7Ci0JY2FzZSAyODoKKwljYXNlIDB4MWM6CiAJCSpjcHVfdHlwZSA9ICJpMzg2L2F0b20iOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2FjcGkuYyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKaW5kZXggMmVjMDRjNC4uMTU0NjZjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2FjcGkuYworKysgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCkBAIC0zNCw2ICszNCwxNSBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJ4MzgwMCIpLAogCQl9LAogCX0sCisJLyogaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjAwNyAqLworCS8qIDIwMDYgQU1EIEhUL1ZJQSBzeXN0ZW0gd2l0aCB0d28gaG9zdCBicmlkZ2VzICovCisgICAgICAgIHsKKwkJLmNhbGxiYWNrID0gc2V0X3VzZV9jcnMsCisJCS5pZGVudCA9ICJBU1JvY2sgQUxpdmVTQVRBMi1HTEFOIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFMaXZlU0FUQTItR0xBTiIpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgIH0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCAyMTVhMjdhLi5hMDc3MmFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC0xMjUsNiArMTI1LDIzIEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyb21fciA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCXN0cnVjdCByZXNvdXJjZSAqYmFyX3I7CisJaW50IGJhcjsKKworCWlmIChwY2lfcHJvYmUgJiBQQ0lfTk9BU1NJR05fQkFSUykgeworCQkvKgorCQkqIElmIHRoZSBCSU9TIGRpZCBub3QgYXNzaWduIHRoZSBCQVIsIHplcm8gb3V0IHRoZQorCQkqIHJlc291cmNlIHNvIHRoZSBrZXJuZWwgZG9lc24ndCBhdHRtZXB0IHRvIGFzc2lnbgorCQkqIGl0IGxhdGVyIG9uIGluIHBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yZXNvdXJjZXMKKwkJKi8KKwkJZm9yIChiYXIgPSAwOyBiYXIgPD0gUENJX1NURF9SRVNPVVJDRV9FTkQ7IGJhcisrKSB7CisJCQliYXJfciA9ICZkZXYtPnJlc291cmNlW2Jhcl07CisJCQlpZiAoYmFyX3ItPnN0YXJ0ID09IDAgJiYgYmFyX3ItPmVuZCAhPSAwKSB7CisJCQkJYmFyX3ItPmZsYWdzID0gMDsKKwkJCQliYXJfci0+ZW5kID0gMDsKKwkJCX0KKwkJfQorCX0KIAogCWlmIChwY2lfcHJvYmUgJiBQQ0lfTk9BU1NJR05fUk9NUykgewogCQlpZiAocm9tX3ItPnBhcmVudCkKQEAgLTUwOSw2ICs1MjYsOSBAQAogCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub3JvbSIpKSB7CiAJCXBjaV9wcm9iZSB8PSBQQ0lfTk9BU1NJR05fUk9NUzsKIAkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vYmFyIikpIHsKKwkJcGNpX3Byb2JlIHw9IFBDSV9OT0FTU0lHTl9CQVJTOworCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYXNzaWduLWJ1c3NlcyIpKSB7CiAJCXBjaV9wcm9iZSB8PSBQQ0lfQVNTSUdOX0FMTF9CVVNTRVM7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDk4MTBhMGYuLmY1NDdlZTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTk4OSw3ICs5ODksNyBAQAogCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIFBDSSBJTlQgJWMgLT4gSVJRICVkXG4iLCBtc2csICdBJyArIHBpbiAtIDEsIGlycSk7CiAKIAkvKiBVcGRhdGUgSVJRIGZvciBhbGwgZGV2aWNlcyB3aXRoIHRoZSBzYW1lIHBpcnEgdmFsdWUgKi8KLQl3aGlsZSAoKGRldjIgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYyKSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2MikgewogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYyLCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CiAJCWlmICghcGluKQogCQkJY29udGludWU7CkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCXU4IHBpbjsKIAogCURCRyhLRVJOX0RFQlVHICJQQ0k6IElSUSBmaXh1cFxuIik7Ci0Jd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJLyoKIAkJICogSWYgdGhlIEJJT1MgaGFzIHNldCBhbiBvdXQgb2YgcmFuZ2UgSVJRIG51bWJlciwganVzdAogCQkgKiBpZ25vcmUgaXQuICBBbHNvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggSVJRJ3MgYXJlCkBAIC0xMDUyLDcgKzEwNTIsNyBAQAogCQlyZXR1cm47CiAKIAlkZXYgPSBOVUxMOwotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwogCQlpZiAoIXBpbikKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC94ODYvcGNpL2xlZ2FjeS5jCmluZGV4IDhkNDYwZWEuLmM4OTI2NmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9sZWdhY3kuYworKysgYi9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBwY2liaW9zX3NjYW5fc3BlY2lmaWNfYnVzKGludCBidXNuKQordm9pZCBfX2RldmluaXQgcGNpYmlvc19zY2FuX3NwZWNpZmljX2J1cyhpbnQgYnVzbikKIHsKIAlpbnQgZGV2Zm47CiAJbG9uZyBub2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcG93ZXIvY3B1LmMgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwppbmRleCAxMjkwYmE1Li5lN2U4YzVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwpAQCAtNCw3ICs0LDcgQEAKICAqIERpc3RyaWJ1dGUgdW5kZXIgR1BMdjIKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIENvcHlyaWdodCAoYykgMjAwMSBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jIGIvYXJjaC94ODYvcG93ZXIvaGliZXJuYXRlXzY0LmMKaW5kZXggZDI0Zjk4My4uNDYwZjMxNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcG93ZXIvaGliZXJuYXRlXzY0LmMKKysrIGIvYXJjaC94ODYvcG93ZXIvaGliZXJuYXRlXzY0LmMKQEAgLTQsNyArNCw3IEBACiAgKiBEaXN0cmlidXRlIHVuZGVyIEdQTHYyCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA3IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KLSAqIENvcHlyaWdodCAoYykgMjAwMiBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4KICAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlIGIvYXJjaC94ODYvdmRzby9NYWtlZmlsZQppbmRleCA2YjRmZmVkLi40YTJhZmExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKQEAgLTEyMCw3ICsxMjAsOCBAQAogcXVpZXRfY21kX3Zkc28gPSBWRFNPICAgICRACiAgICAgICBjbWRfdmRzbyA9ICQoQ0MpIC1ub3N0ZGxpYiAtbyAkQCBcCiAJCSAgICAgICAkKFZEU09fTERGTEFHUykgJChWRFNPX0xERkxBR1NfJChmaWx0ZXIgJS5sZHMsJCheRikpKSBcCi0JCSAgICAgICAtV2wsLVQsJChmaWx0ZXIgJS5sZHMsJF4pICQoZmlsdGVyICUubywkXikKKwkJICAgICAgIC1XbCwtVCwkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKSAmJiBcCisJCSBzaCAkKHNyY3RyZWUpLyQoc3JjKS9jaGVja3VuZGVmLnNoICckKE5NKScgJyRAJwogCiBWRFNPX0xERkxBR1MgPSAtZlBJQyAtc2hhcmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKIEdDT1ZfUFJPRklMRSA6PSBuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL2NoZWNrdW5kZWYuc2ggYi9hcmNoL3g4Ni92ZHNvL2NoZWNrdW5kZWYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2VlOTBhOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3Zkc28vY2hlY2t1bmRlZi5zaApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKK25tPSIkMSIKK2ZpbGU9IiQyIgorJG5tICIkZmlsZSIgfCBncmVwICdeICpVJyA+IC9kZXYvbnVsbCAyPiYxCitpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICBleGl0IDAKK2Vsc2UKKyAgICBlY2hvICIkZmlsZTogdW5kZWZpbmVkIHN5bWJvbHMgZm91bmQiID4mMgorICAgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jCmluZGV4IDAyYjQ0MmUuLjM2ZGY5OTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYwpAQCAtMzc0LDcgKzM3NCw3IEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAKLV9faW5pdGNhbGwoc3lzZW50ZXJfc2V0dXApOworc3Vic3lzX2luaXRjYWxsKHN5c2VudGVyX3NldHVwKTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIC8qIFJlZ2lzdGVyIHZzeXNjYWxsMzIgaW50byB0aGUgQUJJIHRhYmxlICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdmRzby92bWEuYwppbmRleCBhYzc0ODY5Li40MzQ1NmVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAl2ZHNvX2VuYWJsZWQgPSAwOwogCXJldHVybiAtRU5PTUVNOwogfQotX19pbml0Y2FsbChpbml0X3Zkc29fdmFycyk7CitzdWJzeXNfaW5pdGNhbGwoaW5pdF92ZHNvX3ZhcnMpOwogCiBzdHJ1Y3QgbGludXhfYmlucHJtOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vS2NvbmZpZyBiL2FyY2gveDg2L3hlbi9LY29uZmlnCmluZGV4IGI4M2UxMTkuLjY4MTI4YTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9LY29uZmlnCisrKyBiL2FyY2gveDg2L3hlbi9LY29uZmlnCkBAIC0xMyw2ICsxMywxMSBAQAogCSAga2VybmVsIHRvIGJvb3QgaW4gYSBwYXJhdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQgdW5kZXIgdGhlCiAJICBYZW4gaHlwZXJ2aXNvci4KIAorY29uZmlnIFhFTl9QVkhWTQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFhFTgorCWRlcGVuZHMgb24gWDg2X0xPQ0FMX0FQSUMKKwogY29uZmlnIFhFTl9NQVhfRE9NQUlOX01FTU9SWQogICAgICAgIGludCAiTWF4aW11bSBhbGxvd2VkIHNpemUgb2YgYSBkb21haW4gaW4gZ2lnYWJ5dGVzIgogICAgICAgIGRlZmF1bHQgOCBpZiBYODZfMzIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZSBiL2FyY2gveDg2L3hlbi9NYWtlZmlsZQppbmRleCAzYmI0ZmMyLi45MzA5NTQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw3IEBACiAKIG9iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1cC5vIG11bHRpY2FsbHMubyBtbXUubyBpcnEubyBcCiAJCQl0aW1lLm8geGVuLWFzbS5vIHhlbi1hc21fJChCSVRTKS5vIFwKLQkJCWdyYW50LXRhYmxlLm8gc3VzcGVuZC5vCisJCQlncmFudC10YWJsZS5vIHN1c3BlbmQubyBwbGF0Zm9ybS1wY2ktdW5wbHVnLm8KIAogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKSs9IHNwaW5sb2NrLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCA2NWQ4ZDc5Li5kNGZmNWU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAeGVuc291cmNlLmNvbT4sIFhlblNvdXJjZSBJbmMsIDIwMDcKICAqLwogCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtMzUsOCArMzYsMTAgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZlcnNpb24uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3BoeXNkZXYuaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZjcHUuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CisjaW5jbHVkZSA8eGVuL2h2bS5oPgogI2luY2x1ZGUgPHhlbi9odmMtY29uc29sZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CkBAIC01NSw3ICs1OCw5IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrcHJvdGVjdG9yLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogI2luY2x1ZGUgInhlbi1vcHMuaCIKICNpbmNsdWRlICJtbXUuaCIKQEAgLTc2LDYgKzgxLDEwIEBACiAKIHZvaWQgKnhlbl9pbml0aWFsX2dkdDsKIAorUkVTRVJWRV9CUksoc2hhcmVkX2luZm9fcGFnZV9icmssIFBBR0VfU0laRSk7CitfX3JlYWRfbW9zdGx5IGludCB4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2s7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2spOworCiAvKgogICogUG9pbnQgYXQgc29tZSBlbXB0eSBtZW1vcnkgdG8gc3RhcnQgd2l0aC4gV2UgbWFwIHRoZSByZWFsIHNoYXJlZF9pbmZvCiAgKiBwYWdlIGFzIHNvb24gYXMgZml4bWFwIGlzIHVwIGFuZCBydW5uaW5nLgpAQCAtOTcsNiArMTA2LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgaGF2ZV92Y3B1X2luZm9fcGxhY2VtZW50ID0gMTsKIAorc3RhdGljIHZvaWQgY2xhbXBfbWF4X2NwdXModm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKHNldHVwX21heF9jcHVzID4gTUFYX1ZJUlRfQ1BVUykKKwkJc2V0dXBfbWF4X2NwdXMgPSBNQVhfVklSVF9DUFVTOworI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIHhlbl92Y3B1X3NldHVwKGludCBjcHUpCiB7CiAJc3RydWN0IHZjcHVfcmVnaXN0ZXJfdmNwdV9pbmZvIGluZm87CkBAIC0xMDQsMTMgKzEyMSwxNyBAQAogCXN0cnVjdCB2Y3B1X2luZm8gKnZjcHVwOwogCiAJQlVHX09OKEhZUEVSVklTT1Jfc2hhcmVkX2luZm8gPT0gJnhlbl9kdW1teV9zaGFyZWRfaW5mbyk7Ci0JcGVyX2NwdSh4ZW5fdmNwdSwgY3B1KSA9ICZIWVBFUlZJU09SX3NoYXJlZF9pbmZvLT52Y3B1X2luZm9bY3B1XTsKIAotCWlmICghaGF2ZV92Y3B1X2luZm9fcGxhY2VtZW50KQotCQlyZXR1cm47CQkvKiBhbHJlYWR5IHRlc3RlZCwgbm90IGF2YWlsYWJsZSAqLworCWlmIChjcHUgPCBNQVhfVklSVF9DUFVTKQorCQlwZXJfY3B1KHhlbl92Y3B1LGNwdSkgPSAmSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+dmNwdV9pbmZvW2NwdV07CisKKwlpZiAoIWhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCkgeworCQlpZiAoY3B1ID49IE1BWF9WSVJUX0NQVVMpCisJCQljbGFtcF9tYXhfY3B1cygpOworCQlyZXR1cm47CisJfQogCiAJdmNwdXAgPSAmcGVyX2NwdSh4ZW5fdmNwdV9pbmZvLCBjcHUpOwotCiAJaW5mby5tZm4gPSBhcmJpdHJhcnlfdmlydF90b19tZm4odmNwdXApOwogCWluZm8ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UodmNwdXApOwogCkBAIC0xMjUsNiArMTQ2LDcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJyZWdpc3Rlcl92Y3B1X2luZm8gZmFpbGVkOiBlcnI9JWRcbiIsIGVycik7CiAJCWhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCA9IDA7CisJCWNsYW1wX21heF9jcHVzKCk7CiAJfSBlbHNlIHsKIAkJLyogVGhpcyBjcHUgaXMgdXNpbmcgdGhlIHJlZ2lzdGVyZWQgdmNwdSBpbmZvLCBldmVuIGlmCiAJCSAgIGxhdGVyIG9uZXMgZmFpbCB0by4gKi8KQEAgLTczMSw3ICs3NTMsNiBAQAogCiAjZW5kaWYKIAotCiBzdGF0aWMgdm9pZCB4ZW5fY2x0cyh2b2lkKQogewogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwpAQCAtOTI2LDEwICs5NDcsNiBAQAogCS5wYXRjaCA9IHhlbl9wYXRjaCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfdGltZV9vcHMgeGVuX3RpbWVfb3BzIF9faW5pdGRhdGEgPSB7Ci0JLnNjaGVkX2Nsb2NrID0geGVuX3NjaGVkX2Nsb2NrLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9jcHVfb3BzIHhlbl9jcHVfb3BzIF9faW5pdGRhdGEgPSB7CiAJLmNwdWlkID0geGVuX2NwdWlkLAogCkBAIC0xMDI4LDYgKzEwNDUsMjMgQEAKIAl4ZW5fcmVib290KFNIVVRET1dOX2NyYXNoKTsKIH0KIAorc3RhdGljIGludAoreGVuX3BhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXhlbl9yZWJvb3QoU0hVVERPV05fY3Jhc2gpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5fcGFuaWNfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGw9IHhlbl9wYW5pY19ldmVudCwKK307CisKK2ludCB4ZW5fcGFuaWNfaGFuZGxlcl9pbml0KHZvaWQpCit7CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmeGVuX3BhbmljX2Jsb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoaW5lX29wcyBfX2luaXRkYXRhIHhlbl9tYWNoaW5lX29wcyA9IHsKIAkucmVzdGFydCA9IHhlbl9yZXN0YXJ0LAogCS5oYWx0ID0geGVuX21hY2hpbmVfaGFsdCwKQEAgLTEwNjcsNyArMTEwMSw2IEBACiAJLyogSW5zdGFsbCBYZW4gcGFyYXZpcnQgb3BzICovCiAJcHZfaW5mbyA9IHhlbl9pbmZvOwogCXB2X2luaXRfb3BzID0geGVuX2luaXRfb3BzOwotCXB2X3RpbWVfb3BzID0geGVuX3RpbWVfb3BzOwogCXB2X2NwdV9vcHMgPSB4ZW5fY3B1X29wczsKIAlwdl9hcGljX29wcyA9IHhlbl9hcGljX29wczsKIApAQCAtMTA3NSwxMyArMTEwOCw3IEBACiAJeDg2X2luaXQub2VtLmFyY2hfc2V0dXAgPSB4ZW5fYXJjaF9zZXR1cDsKIAl4ODZfaW5pdC5vZW0uYmFubmVyID0geGVuX2Jhbm5lcjsKIAotCXg4Nl9pbml0LnRpbWVycy50aW1lcl9pbml0ID0geGVuX3RpbWVfaW5pdDsKLQl4ODZfaW5pdC50aW1lcnMuc2V0dXBfcGVyY3B1X2Nsb2NrZXYgPSB4ODZfaW5pdF9ub29wOwotCXg4Nl9jcHVpbml0LnNldHVwX3BlcmNwdV9jbG9ja2V2ID0geDg2X2luaXRfbm9vcDsKLQotCXg4Nl9wbGF0Zm9ybS5jYWxpYnJhdGVfdHNjID0geGVuX3RzY19raHo7Ci0JeDg2X3BsYXRmb3JtLmdldF93YWxsY2xvY2sgPSB4ZW5fZ2V0X3dhbGxjbG9jazsKLQl4ODZfcGxhdGZvcm0uc2V0X3dhbGxjbG9jayA9IHhlbl9zZXRfd2FsbGNsb2NrOworCXhlbl9pbml0X3RpbWVfb3BzKCk7CiAKIAkvKgogCSAqIFNldCB1cCBzb21lIHBhZ2V0YWJsZSBzdGF0ZSBiZWZvcmUgc3RhcnRpbmcgdG8gc2V0IGFueSBwdGVzLgpAQCAtMTIwNiwzICsxMjMzLDEzOSBAQAogCXg4Nl82NF9zdGFydF9yZXNlcnZhdGlvbnMoKGNoYXIgKilfX3BhX3N5bWJvbCgmYm9vdF9wYXJhbXMpKTsKICNlbmRpZgogfQorCitzdGF0aWMgdWludDMyX3QgeGVuX2NwdWlkX2Jhc2Uodm9pZCkKK3sKKwl1aW50MzJfdCBiYXNlLCBlYXgsIGVieCwgZWN4LCBlZHg7CisJY2hhciBzaWduYXR1cmVbMTNdOworCisJZm9yIChiYXNlID0gMHg0MDAwMDAwMDsgYmFzZSA8IDB4NDAwMTAwMDA7IGJhc2UgKz0gMHgxMDApIHsKKwkJY3B1aWQoYmFzZSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgMCkgPSBlYng7CisJCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgNCkgPSBlY3g7CisJCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgOCkgPSBlZHg7CisJCXNpZ25hdHVyZVsxMl0gPSAwOworCisJCWlmICghc3RyY21wKCJYZW5WTU1YZW5WTU0iLCBzaWduYXR1cmUpICYmICgoZWF4IC0gYmFzZSkgPj0gMikpCisJCQlyZXR1cm4gYmFzZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2h2bV9wdl9pbmZvKGludCAqbWFqb3IsIGludCAqbWlub3IpCit7CisJdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4LCBwYWdlcywgbXNyLCBiYXNlOworCXU2NCBwZm47CisKKwliYXNlID0geGVuX2NwdWlkX2Jhc2UoKTsKKwljcHVpZChiYXNlICsgMSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwkqbWFqb3IgPSBlYXggPj4gMTY7CisJKm1pbm9yID0gZWF4ICYgMHhmZmZmOworCXByaW50ayhLRVJOX0lORk8gIlhlbiB2ZXJzaW9uICVkLiVkLlxuIiwgKm1ham9yLCAqbWlub3IpOworCisJY3B1aWQoYmFzZSArIDIsICZwYWdlcywgJm1zciwgJmVjeCwgJmVkeCk7CisKKwlwZm4gPSBfX3BhKGh5cGVyY2FsbF9wYWdlKTsKKwl3cm1zcl9zYWZlKG1zciwgKHUzMilwZm4sICh1MzIpKHBmbiA+PiAzMikpOworCisJeGVuX3NldHVwX2ZlYXR1cmVzKCk7CisKKwlwdl9pbmZvID0geGVuX2luZm87CisJcHZfaW5mby5rZXJuZWxfcnBsID0gMDsKKworCXhlbl9kb21haW5fdHlwZSA9IFhFTl9IVk1fRE9NQUlOOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgeGVuX2h2bV9pbml0X3NoYXJlZF9pbmZvKHZvaWQpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgeGVuX2FkZF90b19waHlzbWFwIHhhdHA7CisJc3RhdGljIHN0cnVjdCBzaGFyZWRfaW5mbyAqc2hhcmVkX2luZm9fcGFnZSA9IDA7CisKKwlpZiAoIXNoYXJlZF9pbmZvX3BhZ2UpCisJCXNoYXJlZF9pbmZvX3BhZ2UgPSAoc3RydWN0IHNoYXJlZF9pbmZvICopCisJCQlleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwl4YXRwLmRvbWlkID0gRE9NSURfU0VMRjsKKwl4YXRwLmlkeCA9IDA7CisJeGF0cC5zcGFjZSA9IFhFTk1BUFNQQUNFX3NoYXJlZF9pbmZvOworCXhhdHAuZ3BmbiA9IF9fcGEoc2hhcmVkX2luZm9fcGFnZSkgPj4gUEFHRV9TSElGVDsKKwlpZiAoSFlQRVJWSVNPUl9tZW1vcnlfb3AoWEVOTUVNX2FkZF90b19waHlzbWFwLCAmeGF0cCkpCisJCUJVRygpOworCisJSFlQRVJWSVNPUl9zaGFyZWRfaW5mbyA9IChzdHJ1Y3Qgc2hhcmVkX2luZm8gKilzaGFyZWRfaW5mb19wYWdlOworCisJLyogeGVuX3ZjcHUgaXMgYSBwb2ludGVyIHRvIHRoZSB2Y3B1X2luZm8gc3RydWN0IGluIHRoZSBzaGFyZWRfaW5mbworCSAqIHBhZ2UsIHdlIHVzZSBpdCBpbiB0aGUgZXZlbnQgY2hhbm5lbCB1cGNhbGwgYW5kIGluIHNvbWUgcHZjbG9jaworCSAqIHJlbGF0ZWQgZnVuY3Rpb25zLiBXZSBkb24ndCBuZWVkIHRoZSB2Y3B1X2luZm8gcGxhY2VtZW50CisJICogb3B0aW1pemF0aW9ucyBiZWNhdXNlIHdlIGRvbid0IHVzZSBhbnkgcHZfbW11IG9yIHB2X2lycSBvcCBvbgorCSAqIEhWTS4KKwkgKiBXaGVuIHhlbl9odm1faW5pdF9zaGFyZWRfaW5mbyBpcyBydW4gYXQgYm9vdCB0aW1lIG9ubHkgdmNwdSAwIGlzCisJICogb25saW5lIGJ1dCB4ZW5faHZtX2luaXRfc2hhcmVkX2luZm8gaXMgcnVuIGF0IHJlc3VtZSB0aW1lIHRvbyBhbmQKKwkgKiBpbiB0aGF0IGNhc2UgbXVsdGlwbGUgdmNwdXMgbWlnaHQgYmUgb25saW5lLiAqLworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXBlcl9jcHUoeGVuX3ZjcHUsIGNwdSkgPSAmSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+dmNwdV9pbmZvW2NwdV07CisJfQorfQorCisjaWZkZWYgQ09ORklHX1hFTl9QVkhWTQorc3RhdGljIGludCBfX2NwdWluaXQgeGVuX2h2bV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJaW50IGNwdSA9IChsb25nKWhjcHU7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9VUF9QUkVQQVJFOgorCQlwZXJfY3B1KHhlbl92Y3B1LCBjcHUpID0gJkhZUEVSVklTT1Jfc2hhcmVkX2luZm8tPnZjcHVfaW5mb1tjcHVdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIHhlbl9odm1fY3B1X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0geGVuX2h2bV9jcHVfbm90aWZ5LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHhlbl9odm1fZ3Vlc3RfaW5pdCh2b2lkKQoreworCWludCByOworCWludCBtYWpvciwgbWlub3I7CisKKwlyID0gaW5pdF9odm1fcHZfaW5mbygmbWFqb3IsICZtaW5vcik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm47CisKKwl4ZW5faHZtX2luaXRfc2hhcmVkX2luZm8oKTsKKworCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2h2bV9jYWxsYmFja192ZWN0b3IpKQorCQl4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2sgPSAxOworCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmeGVuX2h2bV9jcHVfbm90aWZpZXIpOworCXhlbl91bnBsdWdfZW11bGF0ZWRfZGV2aWNlcygpOworCWhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCA9IDA7CisJeDg2X2luaXQuaXJxcy5pbnRyX2luaXQgPSB4ZW5faW5pdF9JUlE7CisJeGVuX2h2bV9pbml0X3RpbWVfb3BzKCk7CisJeGVuX2h2bV9pbml0X21tdV9vcHMoKTsKK30KKworc3RhdGljIGJvb2wgX19pbml0IHhlbl9odm1fcGxhdGZvcm0odm9pZCkKK3sKKwlpZiAoeGVuX3B2X2RvbWFpbigpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIXhlbl9jcHVpZF9iYXNlKCkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitjb25zdCBfX3JlZmNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX2h2bSA9IHsKKwkubmFtZQkJCT0gIlhlbiBIVk0iLAorCS5kZXRlY3QJCQk9IHhlbl9odm1fcGxhdGZvcm0sCisJLmluaXRfcGxhdGZvcm0JCT0geGVuX2h2bV9ndWVzdF9pbml0LAorfTsKK0VYUE9SVF9TWU1CT0woeDg2X2h5cGVyX3hlbl9odm0pOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggOTE0ZjA0Ni4uNDEzYjE5YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtNTgsNiArNTgsNyBAQAogCiAjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaHZtL2h2bV9vcC5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHhlbi9odmMtY29uc29sZS5oPgogCkBAIC0xOTQxLDYgKzE5NDIsNDAgQEAKIAlwdl9tbXVfb3BzID0geGVuX21tdV9vcHM7CiB9CiAKKyNpZmRlZiBDT05GSUdfWEVOX1BWSFZNCitzdGF0aWMgdm9pZCB4ZW5faHZtX2V4aXRfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgeGVuX2h2bV9wYWdldGFibGVfZHlpbmcgYTsKKwlpbnQgcmM7CisKKwlhLmRvbWlkID0gRE9NSURfU0VMRjsKKwlhLmdwYSA9IF9fcGEobW0tPnBnZCk7CisJcmMgPSBIWVBFUlZJU09SX2h2bV9vcChIVk1PUF9wYWdldGFibGVfZHlpbmcsICZhKTsKKwlXQVJOX09OX09OQ0UocmMgPCAwKTsKK30KKworc3RhdGljIGludCBpc19wYWdldGFibGVfZHlpbmdfc3VwcG9ydGVkKHZvaWQpCit7CisJc3RydWN0IHhlbl9odm1fcGFnZXRhYmxlX2R5aW5nIGE7CisJaW50IHJjID0gMDsKKworCWEuZG9taWQgPSBET01JRF9TRUxGOworCWEuZ3BhID0gMHgwMDsKKwlyYyA9IEhZUEVSVklTT1JfaHZtX29wKEhWTU9QX3BhZ2V0YWJsZV9keWluZywgJmEpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkhWTU9QX3BhZ2V0YWJsZV9keWluZyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIF9faW5pdCB4ZW5faHZtX2luaXRfbW11X29wcyh2b2lkKQoreworCWlmIChpc19wYWdldGFibGVfZHlpbmdfc3VwcG9ydGVkKCkpCisJCXB2X21tdV9vcHMuZXhpdF9tbWFwID0geGVuX2h2bV9leGl0X21tYXA7Cit9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19YRU5fREVCVUdfRlMKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRfbW11X2RlYnVnOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5oIGIvYXJjaC94ODYveGVuL21tdS5oCmluZGV4IDVmZTZiYzcuLmZhOTM4YzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuaAorKysgYi9hcmNoL3g4Ni94ZW4vbW11LmgKQEAgLTYwLDQgKzYwLDUgQEAKIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IyX2RpcmVjdCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgeGVuX2luaXRfbW11X29wcyh2b2lkKTsKK2V4dGVybiB2b2lkIHhlbl9odm1faW5pdF9tbXVfb3BzKHZvaWQpOwogI2VuZGlmCS8qIF9YRU5fTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9wbGF0Zm9ybS1wY2ktdW5wbHVnLmMgYi9hcmNoL3g4Ni94ZW4vcGxhdGZvcm0tcGNpLXVucGx1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGMwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni94ZW4vcGxhdGZvcm0tcGNpLXVucGx1Zy5jCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwbGF0Zm9ybS1wY2ktdW5wbHVnLmMKKyAqCisgKiBYZW4gcGxhdGZvcm0gUENJIGRldmljZSBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgQ2l0cml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDx4ZW4vcGxhdGZvcm1fcGNpLmg+CisKKyNkZWZpbmUgWEVOX1BMQVRGT1JNX0VSUl9NQUdJQyAtMQorI2RlZmluZSBYRU5fUExBVEZPUk1fRVJSX1BST1RPQ09MIC0yCisjZGVmaW5lIFhFTl9QTEFURk9STV9FUlJfQkxBQ0tMSVNUIC0zCisKKy8qIHN0b3JlIHRoZSB2YWx1ZSBvZiB4ZW5fZW11bF91bnBsdWcgYWZ0ZXIgdGhlIHVucGx1ZyBpcyBkb25lICovCitpbnQgeGVuX3BsYXRmb3JtX3BjaV91bnBsdWc7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fcGxhdGZvcm1fcGNpX3VucGx1Zyk7CisjaWZkZWYgQ09ORklHX1hFTl9QVkhWTQorc3RhdGljIGludCB4ZW5fZW11bF91bnBsdWc7CisKK3N0YXRpYyBpbnQgX19pbml0IGNoZWNrX3BsYXRmb3JtX21hZ2ljKHZvaWQpCit7CisJc2hvcnQgbWFnaWM7CisJY2hhciBwcm90b2NvbDsKKworCW1hZ2ljID0gaW53KFhFTl9JT1BPUlRfTUFHSUMpOworCWlmIChtYWdpYyAhPSBYRU5fSU9QT1JUX01BR0lDX1ZBTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlhlbiBQbGF0Zm9ybSBQQ0k6IHVucmVjb2duaXNlZCBtYWdpYyB2YWx1ZVxuIik7CisJCXJldHVybiBYRU5fUExBVEZPUk1fRVJSX01BR0lDOworCX0KKworCXByb3RvY29sID0gaW5iKFhFTl9JT1BPUlRfUFJPVE9WRVIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlhlbiBQbGF0Zm9ybSBQQ0k6IEkvTyBwcm90b2NvbCB2ZXJzaW9uICVkXG4iLAorCQkJcHJvdG9jb2wpOworCisJc3dpdGNoIChwcm90b2NvbCkgeworCWNhc2UgMToKKwkJb3V0dyhYRU5fSU9QT1JUX0xJTlVYX1BST0ROVU0sIFhFTl9JT1BPUlRfUFJPRE5VTSk7CisJCW91dGwoWEVOX0lPUE9SVF9MSU5VWF9EUlZWRVIsIFhFTl9JT1BPUlRfRFJWVkVSKTsKKwkJaWYgKGludyhYRU5fSU9QT1JUX01BR0lDKSAhPSBYRU5fSU9QT1JUX01BR0lDX1ZBTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJYZW4gUGxhdGZvcm06IGJsYWNrbGlzdGVkIGJ5IGhvc3RcbiIpOworCQkJcmV0dXJuIFhFTl9QTEFURk9STV9FUlJfQkxBQ0tMSVNUOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlhlbiBQbGF0Zm9ybSBQQ0k6IHVua25vd24gSS9PIHByb3RvY29sIHZlcnNpb24iKTsKKwkJcmV0dXJuIFhFTl9QTEFURk9STV9FUlJfUFJPVE9DT0w7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHhlbl91bnBsdWdfZW11bGF0ZWRfZGV2aWNlcyh2b2lkKQoreworCWludCByOworCisJLyogY2hlY2sgdGhlIHZlcnNpb24gb2YgdGhlIHhlbiBwbGF0Zm9ybSBQQ0kgZGV2aWNlICovCisJciA9IGNoZWNrX3BsYXRmb3JtX21hZ2ljKCk7CisJLyogSWYgdGhlIHZlcnNpb24gbWF0Y2hlcyBlbmFibGUgdGhlIFhlbiBwbGF0Zm9ybSBQQ0kgZHJpdmVyLgorCSAqIEFsc28gZW5hYmxlIHRoZSBYZW4gcGxhdGZvcm0gUENJIGRyaXZlciBpZiB0aGUgdmVyc2lvbiBpcyByZWFsbHkgb2xkCisJICogYW5kIHRoZSB1c2VyIHRvbGQgdXMgdG8gaWdub3JlIGl0LiAqLworCWlmIChyICYmICEociA9PSBYRU5fUExBVEZPUk1fRVJSX01BR0lDICYmCisJCQkoeGVuX2VtdWxfdW5wbHVnICYgWEVOX1VOUExVR19JR05PUkUpKSkKKwkJcmV0dXJuOworCS8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB4ZW5fZW11bF91bnBsdWcgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3IKKwkgKiBub3QgdGhlIFhlbiBQViBmcm9udGVuZHMgYW5kIHRoZSBYZW4gcGxhdGZvcm0gUENJIGRyaXZlciBoYXZlCisJICogYmVlbiBjb21waWxlZCBmb3IgdGhpcyBrZXJuZWwgKG1vZHVsZXMgb3IgYnVpbHQtaW4gYXJlIGJvdGggT0spLiAqLworCWlmICgheGVuX2VtdWxfdW5wbHVnKSB7CisJCWlmICh4ZW5fbXVzdF91bnBsdWdfbmljcygpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJOZXRmcm9udCBhbmQgdGhlIFhlbiBwbGF0Zm9ybSBQQ0kgZHJpdmVyIGhhdmUgIgorCQkJCQkiYmVlbiBjb21waWxlZCBmb3IgdGhpcyBrZXJuZWw6IHVucGx1ZyBlbXVsYXRlZCBOSUNzLlxuIik7CisJCQl4ZW5fZW11bF91bnBsdWcgfD0gWEVOX1VOUExVR19BTExfTklDUzsKKwkJfQorCQlpZiAoeGVuX211c3RfdW5wbHVnX2Rpc2tzKCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkJsa2Zyb250IGFuZCB0aGUgWGVuIHBsYXRmb3JtIFBDSSBkcml2ZXIgaGF2ZSAiCisJCQkJCSJiZWVuIGNvbXBpbGVkIGZvciB0aGlzIGtlcm5lbDogdW5wbHVnIGVtdWxhdGVkIGRpc2tzLlxuIgorCQkJCQkiWW91IG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoZSByb290IGRldmljZVxuIgorCQkJCQkiZnJvbSAvZGV2L2hkW2EtZF0gdG8gL2Rldi94dmRbYS1kXVxuIgorCQkJCQkiaW4geW91ciByb290PSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvblxuIik7CisJCQl4ZW5fZW11bF91bnBsdWcgfD0gWEVOX1VOUExVR19BTExfSURFX0RJU0tTOworCQl9CisJfQorCS8qIE5vdyB1bnBsdWcgdGhlIGVtdWxhdGVkIGRldmljZXMgKi8KKwlpZiAoISh4ZW5fZW11bF91bnBsdWcgJiBYRU5fVU5QTFVHX0lHTk9SRSkpCisJCW91dHcoeGVuX2VtdWxfdW5wbHVnLCBYRU5fSU9QT1JUX1VOUExVRyk7CisJeGVuX3BsYXRmb3JtX3BjaV91bnBsdWcgPSB4ZW5fZW11bF91bnBsdWc7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3hlbl9lbXVsX3VucGx1ZyhjaGFyICphcmcpCit7CisJY2hhciAqcCwgKnE7CisJaW50IGw7CisKKwlmb3IgKHAgPSBhcmc7IHA7IHAgPSBxKSB7CisJCXEgPSBzdHJjaHIocCwgJywnKTsKKwkJaWYgKHEpIHsKKwkJCWwgPSBxIC0gcDsKKwkJCXErKzsKKwkJfSBlbHNlIHsKKwkJCWwgPSBzdHJsZW4ocCk7CisJCX0KKwkJaWYgKCFzdHJuY21wKHAsICJhbGwiLCBsKSkKKwkJCXhlbl9lbXVsX3VucGx1ZyB8PSBYRU5fVU5QTFVHX0FMTDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocCwgImlkZS1kaXNrcyIsIGwpKQorCQkJeGVuX2VtdWxfdW5wbHVnIHw9IFhFTl9VTlBMVUdfQUxMX0lERV9ESVNLUzsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocCwgImF1eC1pZGUtZGlza3MiLCBsKSkKKwkJCXhlbl9lbXVsX3VucGx1ZyB8PSBYRU5fVU5QTFVHX0FVWF9JREVfRElTS1M7CisJCWVsc2UgaWYgKCFzdHJuY21wKHAsICJuaWNzIiwgbCkpCisJCQl4ZW5fZW11bF91bnBsdWcgfD0gWEVOX1VOUExVR19BTExfTklDUzsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocCwgImlnbm9yZSIsIGwpKQorCQkJeGVuX2VtdWxfdW5wbHVnIHw9IFhFTl9VTlBMVUdfSUdOT1JFOworCQllbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1bnJlY29nbmlzZWQgb3B0aW9uICclcycgIgorCQkJCSAiaW4gcGFyYW1ldGVyICd4ZW5fZW11bF91bnBsdWcnXG4iLCBwKTsKKwl9CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgieGVuX2VtdWxfdW5wbHVnIiwgcGFyc2VfeGVuX2VtdWxfdW5wbHVnKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwppbmRleCBhZDAwNDdmLi4zMjhiMDAzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9jYWxsYmFjay5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvcGh5c2Rldi5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8eGVuL2ZlYXR1cmVzLmg+CiAKICNpbmNsdWRlICJ4ZW4tb3BzLmgiCkBAIC0zMiw2ICszMyw3MyBAQAogZXh0ZXJuIHZvaWQgeGVuX3N5c2NhbGxfdGFyZ2V0KHZvaWQpOwogZXh0ZXJuIHZvaWQgeGVuX3N5c2NhbGwzMl90YXJnZXQodm9pZCk7CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCB4ZW5fcmVsZWFzZV9jaHVuayhwaHlzX2FkZHJfdCBzdGFydF9hZGRyLAorCQkJCQkgICAgICBwaHlzX2FkZHJfdCBlbmRfYWRkcikKK3sKKwlzdHJ1Y3QgeGVuX21lbW9yeV9yZXNlcnZhdGlvbiByZXNlcnZhdGlvbiA9IHsKKwkJLmFkZHJlc3NfYml0cyA9IDAsCisJCS5leHRlbnRfb3JkZXIgPSAwLAorCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgorCX07CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCXVuc2lnbmVkIGxvbmcgbGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgcmV0OworCisJc3RhcnQgPSBQRk5fVVAoc3RhcnRfYWRkcik7CisJZW5kID0gUEZOX0RPV04oZW5kX2FkZHIpOworCisJaWYgKGVuZCA8PSBzdGFydCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJ4ZW5fcmVsZWFzZV9jaHVuazogbG9va2luZyBhdCBhcmVhIHBmbiAlbHgtJWx4OiAiLAorCSAgICAgICBzdGFydCwgZW5kKTsKKwlmb3IocGZuID0gc3RhcnQ7IHBmbiA8IGVuZDsgcGZuKyspIHsKKwkJdW5zaWduZWQgbG9uZyBtZm4gPSBwZm5fdG9fbWZuKHBmbik7CisKKwkJLyogTWFrZSBzdXJlIHBmbiBleGlzdHMgdG8gc3RhcnQgd2l0aCAqLworCQlpZiAobWZuID09IElOVkFMSURfUDJNX0VOVFJZIHx8IG1mbl90b19wZm4obWZuKSAhPSBwZm4pCisJCQljb250aW51ZTsKKworCQlzZXRfeGVuX2d1ZXN0X2hhbmRsZShyZXNlcnZhdGlvbi5leHRlbnRfc3RhcnQsICZtZm4pOworCQlyZXNlcnZhdGlvbi5ucl9leHRlbnRzID0gMTsKKworCQlyZXQgPSBIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fZGVjcmVhc2VfcmVzZXJ2YXRpb24sCisJCQkJCSAgICZyZXNlcnZhdGlvbik7CisJCVdBUk4ocmV0ICE9IDEsICJGYWlsZWQgdG8gcmVsZWFzZSBtZW1vcnkgJWx4LSVseCBlcnI9JWRcbiIsCisJCSAgICAgc3RhcnQsIGVuZCwgcmV0KTsKKwkJaWYgKHJldCA9PSAxKSB7CisJCQlzZXRfcGh5c190b19tYWNoaW5lKHBmbiwgSU5WQUxJRF9QMk1fRU5UUlkpOworCQkJbGVuKys7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fQ09OVCAiJWxkIHBhZ2VzIGZyZWVkXG4iLCBsZW4pOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IHhlbl9yZXR1cm5fdW51c2VkX21lbW9yeSh1bnNpZ25lZCBsb25nIG1heF9wZm4sCisJCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBlODIwbWFwICplODIwKQoreworCXBoeXNfYWRkcl90IG1heF9hZGRyID0gUEZOX1BIWVMobWF4X3Bmbik7CisJcGh5c19hZGRyX3QgbGFzdF9lbmQgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVsZWFzZWQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcCAmJiBsYXN0X2VuZCA8IG1heF9hZGRyOyBpKyspIHsKKwkJcGh5c19hZGRyX3QgZW5kID0gZTgyMC0+bWFwW2ldLmFkZHI7CisJCWVuZCA9IG1pbihtYXhfYWRkciwgZW5kKTsKKworCQlyZWxlYXNlZCArPSB4ZW5fcmVsZWFzZV9jaHVuayhsYXN0X2VuZCwgZW5kKTsKKwkJbGFzdF9lbmQgPSBlODIwLT5tYXBbaV0uYWRkciArIGU4MjAtPm1hcFtpXS5zaXplOworCX0KKworCWlmIChsYXN0X2VuZCA8IG1heF9hZGRyKQorCQlyZWxlYXNlZCArPSB4ZW5fcmVsZWFzZV9jaHVuayhsYXN0X2VuZCwgbWF4X2FkZHIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAicmVsZWFzZWQgJWxkIHBhZ2VzIG9mIHVudXNlZCBtZW1vcnlcbiIsIHJlbGVhc2VkKTsKKwlyZXR1cm4gcmVsZWFzZWQ7Cit9CiAKIC8qKgogICogbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAgLSBIb29rIGZvciBtYWNoaW5lIHNwZWNpZmljIG1lbW9yeSBzZXR1cC4KQEAgLTY3LDYgKzEzNSw4IEBACiAKIAlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7CiAKKwl4ZW5fcmV0dXJuX3VudXNlZF9tZW1vcnkoeGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzLCAmZTgyMCk7CisKIAlyZXR1cm4gIlhlbiI7CiB9CiAKQEAgLTE1Niw2ICsyMjYsOCBAQAogCXN0cnVjdCBwaHlzZGV2X3NldF9pb3BsIHNldF9pb3BsOwogCWludCByYzsKIAorCXhlbl9wYW5pY19oYW5kbGVyX2luaXQoKTsKKwogCUhZUEVSVklTT1Jfdm1fYXNzaXN0KFZNQVNTVF9DTURfZW5hYmxlLCBWTUFTU1RfVFlQRV80Z2Jfc2VnbWVudHMpOwogCUhZUEVSVklTT1Jfdm1fYXNzaXN0KFZNQVNTVF9DTURfZW5hYmxlLCBWTUFTU1RfVFlQRV93cml0YWJsZV9wYWdldGFibGVzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NtcC5jIGIvYXJjaC94ODYveGVuL3NtcC5jCmluZGV4IGEyOTY5M2YuLjI1ZjIzMmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zbXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc21wLmMKQEAgLTM5NCw2ICszOTQsOCBAQAogCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKIAkvKiBzaG91bGQgc2V0IHVwIGEgbWluaW1hbCBnZHQgKi8KIAorCXNldF9jcHVfb25saW5lKGNwdSwgZmFsc2UpOworCiAJSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9kb3duLCBjcHUsIE5VTEwpOwogCUJVRygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3N1c3BlbmQuYyBiL2FyY2gveDg2L3hlbi9zdXNwZW5kLmMKaW5kZXggYTljNjYxMS4uMWQ3ODlkNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3N1c3BlbmQuYworKysgYi9hcmNoL3g4Ni94ZW4vc3VzcGVuZC5jCkBAIC0yNiw2ICsyNiwxOCBAQAogCQlCVUcoKTsKIH0KIAordm9pZCB4ZW5faHZtX3Bvc3Rfc3VzcGVuZChpbnQgc3VzcGVuZF9jYW5jZWxsZWQpCit7CisJaW50IGNwdTsKKwl4ZW5faHZtX2luaXRfc2hhcmVkX2luZm8oKTsKKwl4ZW5fY2FsbGJhY2tfdmVjdG9yKCk7CisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jaykpIHsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZvKGNwdSk7CisJCX0KKwl9Cit9CisKIHZvaWQgeGVuX3Bvc3Rfc3VzcGVuZChpbnQgc3VzcGVuZF9jYW5jZWxsZWQpCiB7CiAJeGVuX2J1aWxkX21mbl9saXN0X2xpc3QoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi90aW1lLmMgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCmluZGV4IGIzYzZjNTkuLjFhNTM1M2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi90aW1lLmMKKysrIGIvYXJjaC94ODYveGVuL3RpbWUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAKICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5jbHVkZSA8eGVuL2ZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZjcHUuaD4KIApAQCAtMTU1LDQ3ICsxNTYsOCBAQAogCWFjY291bnRfaWRsZV90aWNrcyh0aWNrcyk7CiB9CiAKLS8qCi0gKiBYZW4gc2NoZWRfY2xvY2sgaW1wbGVtZW50YXRpb24uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5zdG9sZW4KLSAqIG5hbm9zZWNvbmRzLCB3aGljaCBpcyBuYW5vc2Vjb25kcyB0aGUgVkNQVSBzcGVudCBpbiBSVU5OSU5HK0JMT0NLRUQKLSAqIHN0YXRlcy4KLSAqLwotdW5zaWduZWQgbG9uZyBsb25nIHhlbl9zY2hlZF9jbG9jayh2b2lkKQotewotCXN0cnVjdCB2Y3B1X3J1bnN0YXRlX2luZm8gc3RhdGU7Ci0JY3ljbGVfdCBub3c7Ci0JdTY0IHJldDsKLQlzNjQgb2Zmc2V0OwotCi0JLyoKLQkgKiBJZGVhbGx5IHNjaGVkX2Nsb2NrIHNob3VsZCBiZSBjYWxsZWQgb24gYSBwZXItY3B1IGJhc2lzCi0JICogYW55d2F5LCBzbyBwcmVlbXB0IHNob3VsZCBhbHJlYWR5IGJlIGRpc2FibGVkLCBidXQgdGhhdCdzCi0JICogbm90IGN1cnJlbnQgcHJhY3RpY2UgYXQgdGhlIG1vbWVudC4KLQkgKi8KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQotCW5vdyA9IHhlbl9jbG9ja3NvdXJjZV9yZWFkKCk7Ci0KLQlnZXRfcnVuc3RhdGVfc25hcHNob3QoJnN0YXRlKTsKLQotCVdBUk5fT04oc3RhdGUuc3RhdGUgIT0gUlVOU1RBVEVfcnVubmluZyk7Ci0KLQlvZmZzZXQgPSBub3cgLSBzdGF0ZS5zdGF0ZV9lbnRyeV90aW1lOwotCWlmIChvZmZzZXQgPCAwKQotCQlvZmZzZXQgPSAwOwotCi0JcmV0ID0gc3RhdGUudGltZVtSVU5TVEFURV9ibG9ja2VkXSArCi0JCXN0YXRlLnRpbWVbUlVOU1RBVEVfcnVubmluZ10gKwotCQlvZmZzZXQ7Ci0KLQlwcmVlbXB0X2VuYWJsZSgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCiAvKiBHZXQgdGhlIFRTQyBzcGVlZCBmcm9tIFhlbiAqLwotdW5zaWduZWQgbG9uZyB4ZW5fdHNjX2toeih2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3RzY19raHoodm9pZCkKIHsKIAlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqaW5mbyA9CiAJCSZIWVBFUlZJU09SX3NoYXJlZF9pbmZvLT52Y3B1X2luZm9bMF0udGltZTsKQEAgLTIzMCw3ICsxOTIsNyBAQAogCXB1dF9jcHVfdmFyKHhlbl92Y3B1KTsKIH0KIAotdW5zaWduZWQgbG9uZyB4ZW5fZ2V0X3dhbGxjbG9jayh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX2dldF93YWxsY2xvY2sodm9pZCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKQEAgLTIzOCw3ICsyMDAsNyBAQAogCXJldHVybiB0cy50dl9zZWM7CiB9CiAKLWludCB4ZW5fc2V0X3dhbGxjbG9jayh1bnNpZ25lZCBsb25nIG5vdykKK3N0YXRpYyBpbnQgeGVuX3NldF93YWxsY2xvY2sodW5zaWduZWQgbG9uZyBub3cpCiB7CiAJLyogZG8gbm90aGluZyBmb3IgZG9tVSAqLwogCXJldHVybiAtMTsKQEAgLTQ3Myw3ICs0MzUsMTEgQEAKIAl9CiB9CiAKLV9faW5pdCB2b2lkIHhlbl90aW1lX2luaXQodm9pZCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfdGltZV9vcHMgeGVuX3RpbWVfb3BzIF9faW5pdGRhdGEgPSB7CisJLnNjaGVkX2Nsb2NrID0geGVuX2Nsb2Nrc291cmNlX3JlYWQsCit9OworCitzdGF0aWMgX19pbml0IHZvaWQgeGVuX3RpbWVfaW5pdCh2b2lkKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHRpbWVzcGVjIHRwOwpAQCAtNDk3LDMgKzQ2Myw0NyBAQAogCXhlbl9zZXR1cF90aW1lcihjcHUpOwogCXhlbl9zZXR1cF9jcHVfY2xvY2tldmVudHMoKTsKIH0KKworX19pbml0IHZvaWQgeGVuX2luaXRfdGltZV9vcHModm9pZCkKK3sKKwlwdl90aW1lX29wcyA9IHhlbl90aW1lX29wczsKKworCXg4Nl9pbml0LnRpbWVycy50aW1lcl9pbml0ID0geGVuX3RpbWVfaW5pdDsKKwl4ODZfaW5pdC50aW1lcnMuc2V0dXBfcGVyY3B1X2Nsb2NrZXYgPSB4ODZfaW5pdF9ub29wOworCXg4Nl9jcHVpbml0LnNldHVwX3BlcmNwdV9jbG9ja2V2ID0geDg2X2luaXRfbm9vcDsKKworCXg4Nl9wbGF0Zm9ybS5jYWxpYnJhdGVfdHNjID0geGVuX3RzY19raHo7CisJeDg2X3BsYXRmb3JtLmdldF93YWxsY2xvY2sgPSB4ZW5fZ2V0X3dhbGxjbG9jazsKKwl4ODZfcGxhdGZvcm0uc2V0X3dhbGxjbG9jayA9IHhlbl9zZXRfd2FsbGNsb2NrOworfQorCisjaWZkZWYgQ09ORklHX1hFTl9QVkhWTQorc3RhdGljIHZvaWQgeGVuX2h2bV9zZXR1cF9jcHVfY2xvY2tldmVudHModm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZvKGNwdSk7CisJeGVuX3NldHVwX3RpbWVyKGNwdSk7CisJeGVuX3NldHVwX2NwdV9jbG9ja2V2ZW50cygpOworfQorCitfX2luaXQgdm9pZCB4ZW5faHZtX2luaXRfdGltZV9vcHModm9pZCkKK3sKKwkvKiB2ZWN0b3IgY2FsbGJhY2sgaXMgbmVlZGVkIG90aGVyd2lzZSB3ZSBjYW5ub3QgcmVjZWl2ZSBpbnRlcnJ1cHRzCisJICogb24gY3B1ID4gMCAqLworCWlmICgheGVuX2hhdmVfdmVjdG9yX2NhbGxiYWNrICYmIG51bV9wcmVzZW50X2NwdXMoKSA+IDEpCisJCXJldHVybjsKKwlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jaykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiWGVuIGRvZXNuJ3Qgc3VwcG9ydCBwdmNsb2NrIG9uIEhWTSwiCisJCQkJImRpc2FibGUgcHYgdGltZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJcHZfdGltZV9vcHMgPSB4ZW5fdGltZV9vcHM7CisJeDg2X2luaXQudGltZXJzLnNldHVwX3BlcmNwdV9jbG9ja2V2ID0geGVuX3RpbWVfaW5pdDsKKwl4ODZfY3B1aW5pdC5zZXR1cF9wZXJjcHVfY2xvY2tldiA9IHhlbl9odm1fc2V0dXBfY3B1X2Nsb2NrZXZlbnRzOworCisJeDg2X3BsYXRmb3JtLmNhbGlicmF0ZV90c2MgPSB4ZW5fdHNjX2toejsKKwl4ODZfcGxhdGZvcm0uZ2V0X3dhbGxjbG9jayA9IHhlbl9nZXRfd2FsbGNsb2NrOworCXg4Nl9wbGF0Zm9ybS5zZXRfd2FsbGNsb2NrID0geGVuX3NldF93YWxsY2xvY2s7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi94ZW4tb3BzLmggYi9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCmluZGV4IGY5MTUzYTMuLjdjOGFiODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKKysrIGIvYXJjaC94ODYveGVuL3hlbi1vcHMuaApAQCAtMzgsNiArMzgsMTAgQEAKIHZvaWQgeGVuX2VuYWJsZV9zeXNjYWxsKHZvaWQpOwogdm9pZCB4ZW5fdmNwdV9yZXN0b3JlKHZvaWQpOwogCit2b2lkIHhlbl9jYWxsYmFja192ZWN0b3Iodm9pZCk7Cit2b2lkIHhlbl9odm1faW5pdF9zaGFyZWRfaW5mbyh2b2lkKTsKK3ZvaWQgX19pbml0IHhlbl91bnBsdWdfZW11bGF0ZWRfZGV2aWNlcyh2b2lkKTsKKwogdm9pZCBfX2luaXQgeGVuX2J1aWxkX2R5bmFtaWNfcGh5c190b19tYWNoaW5lKHZvaWQpOwogCiB2b2lkIHhlbl9pbml0X2lycV9vcHModm9pZCk7CkBAIC00NiwxMSArNTAsOCBAQAogdm9pZCB4ZW5fdGVhcmRvd25fdGltZXIoaW50IGNwdSk7CiBjeWNsZV90IHhlbl9jbG9ja3NvdXJjZV9yZWFkKHZvaWQpOwogdm9pZCB4ZW5fc2V0dXBfY3B1X2Nsb2NrZXZlbnRzKHZvaWQpOwotdW5zaWduZWQgbG9uZyB4ZW5fdHNjX2toeih2b2lkKTsKLXZvaWQgX19pbml0IHhlbl90aW1lX2luaXQodm9pZCk7Ci11bnNpZ25lZCBsb25nIHhlbl9nZXRfd2FsbGNsb2NrKHZvaWQpOwotaW50IHhlbl9zZXRfd2FsbGNsb2NrKHVuc2lnbmVkIGxvbmcgdGltZSk7Ci11bnNpZ25lZCBsb25nIGxvbmcgeGVuX3NjaGVkX2Nsb2NrKHZvaWQpOwordm9pZCBfX2luaXQgeGVuX2luaXRfdGltZV9vcHModm9pZCk7Cit2b2lkIF9faW5pdCB4ZW5faHZtX2luaXRfdGltZV9vcHModm9pZCk7CiAKIGlycXJldHVybl90IHhlbl9kZWJ1Z19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIApAQCAtMTAxLDQgKzEwMiw2IEBACiB2b2lkIHhlbl9zeXNyZXQ2NCh2b2lkKTsKIHZvaWQgeGVuX2FkanVzdF9leGNlcHRpb25fZnJhbWUodm9pZCk7CiAKK2V4dGVybiBpbnQgeGVuX3BhbmljX2hhbmRsZXJfaW5pdCh2b2lkKTsKKwogI2VuZGlmIC8qIFhFTl9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9NYWtlZmlsZQppbmRleCA0Y2FmZmFjLi43NjA4NTU5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9NYWtlZmlsZQorKysgYi9hcmNoL3h0ZW5zYS9NYWtlZmlsZQpAQCAtMzUsNiArMzUsOCBAQAogCiBLQlVJTERfQ0ZMQUdTICs9IC1waXBlIC1tbG9uZ2NhbGxzCiAKK0tCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWZvcmNlLW5vLXBpYywpCisKIHZhcmRpcnMgOj0gJChwYXRzdWJzdCAlLGFyY2gveHRlbnNhL3ZhcmlhbnRzLyUvLCQodmFyaWFudC15KSkKIHBsZmRpcnMgOj0gJChwYXRzdWJzdCAlLGFyY2gveHRlbnNhL3BsYXRmb3Jtcy8lLywkKHBsYXRmb3JtLXkpKQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9jb25maWdzL2lzc19kZWZjb25maWcgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2lzc19kZWZjb25maWcKaW5kZXggZjE5ODU0MC4uNzM2ODE2NCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvY29uZmlncy9pc3NfZGVmY29uZmlnCisrKyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZwpAQCAtMSwxOTMgKzEsMjE0IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEtcmMyCi0jIEZyaSBGZWIgMjUgMTk6MjE6MjQgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjM0LXJjNgorIyBUdWUgQXVnICAzIDAwOjEwOjU0IDIwMTAKICMKLUNPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BPXkKIENPTkZJR19YVEVOU0E9eQotIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfTk9fSU9QT1JUPXkKK0NPTkZJR19IWj0xMDAKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKICMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19LT0JKRUNUX1VFVkVOVCBpcyBub3Qgc2V0CisKKyMKKyMgUkNVIFN1YnN5c3RlbQorIworQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfVElOWV9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCi1DT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKLUNPTkZJR19DQ19BTElHTl9MT09QUz0wCi1DT05GSUdfQ0NfQUxJR05fSlVNUFM9MAotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQUlPPXkKIAogIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKK0NPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19MQkRBRj15CitDT05GSUdfQkxLX0RFVl9CU0c9eQorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKKyMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTVVURVhfU1BJTl9PTl9PV05FUiBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfVkFSSUFOVF9JUlFfU1dJVENIIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMKICMKIENPTkZJR19YVEVOU0FfVkFSSUFOVF9GU0Y9eQotQ09ORklHX01NVT15CisjIENPTkZJR19YVEVOU0FfVkFSSUFOVF9EQzIzMkIgaXMgbm90IHNldAorIyBDT05GSUdfWFRFTlNBX1ZBUklBTlRfUzYwMDAgaXMgbm90IHNldAogIyBDT05GSUdfWFRFTlNBX1VOQUxJR05FRF9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci0KLSMKLSMgUGxhdGZvcm0gb3B0aW9ucwotIwotQ09ORklHX1hURU5TQV9QTEFURk9STV9JU1M9eQotIyBDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hUMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YVEVOU0FfUExBVEZPUk1fQVJVQkEgaXMgbm90IHNldAotIyBDT05GSUdfWFRFTlNBX0NBTElCUkFURV9DQ09VTlQgaXMgbm90IHNldAotQ09ORklHX1hURU5TQV9DUFVfQ0xPQ0s9MTAKLSMgQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMzg0MDAgZXRoMD10dW50YXAsLHRhcDAgaXA9MTkyLjE2OC4xNjguNToxOTIuMTY4LjE2OC4xIHJvb3Q9bmZzIG5mc3Jvb3Q9MTkyLjE2OC4xNjguMTovb3B0L21vbnRhdmlzdGEvcHJvL2RldmtpdC94dGVuc2EvbGludXhfYmUvdGFyZ2V0IgorQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UPXkKIENPTkZJR19TRVJJQUxfQ09OU09MRT15CiBDT05GSUdfWFRFTlNBX0lTU19ORVRXT1JLPXkKIAogIwogIyBCdXMgb3B0aW9ucwogIworIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjIFBsYXRmb3JtIG9wdGlvbnMKICMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CitDT05GSUdfWFRFTlNBX1BMQVRGT1JNX0lTUz15CisjIENPTkZJR19YVEVOU0FfUExBVEZPUk1fWFQyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hURU5TQV9QTEFURk9STV9TNjEwNSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWSBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDM4NDAwIGV0aDA9dHVudGFwLCx0YXAwIGlwPTE5Mi4xNjguMTY4LjU6MTkyLjE2OC4xNjguMSByb290PW5mcyBuZnNyb290PTE5Mi4xNjguMTY4LjE6L29wdC9tb250YXZpc3RhL3Byby9kZXZraXQveHRlbnNhL2xpbnV4X2JlL3RhcmdldCIKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwotIyBQQy1jYXJkIGJyaWRnZXMKLSMKLQotIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKLSMgRXhlY3R1YWJsZSBmaWxlIGZvcm1hdHMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19LQ09SRV9FTEY9eQogQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLSMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLSMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAotIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwogQ09ORklHX05FVD15CiAKICMKICMgTmV0d29ya2luZyBvcHRpb25zCiAjCiBDT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQpAQCAtMTk5LDIxICsyMjAsMjggQEAKICMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfTFJPPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTIyMSw3NyArMjQ5LDEyNiBAQAogIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAogIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JrIHRlc3RpbmcKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKKyMKKyMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKworIworIyBEUkJEIGRpc2FibGVkIGJlY2F1c2UgUFJPQ19GUywgSU5FVCBvciBDT05ORUNUT1Igbm90IHNlbGVjdGVkCisjCisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRUVQUk9NIHN1cHBvcnQKKyMKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTSV9NT0Q9eQorIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWSUNFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKICMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCiAjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CiAKICMKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfU1BBUlNFS01BUCBpcyBub3Qgc2V0CiAKICMKICMgVXNlcmxhbmQgaW50ZXJmYWNlcwogIwogIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKIAogIwotIyBJbnB1dCBJL08gZHJpdmVycwotIwotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLQotIwogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCiAjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC0zMDIsMTggKzM3OSw0NyBAQAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCisjIENPTkZJR19TRVJJQUxfVElNQkVSREFMRSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU0gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAogCiAjCi0jIFdhdGNoZG9nIENhcmRzCisjIFBQUyBzdXBwb3J0CiAjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0hUMTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQogCkBAIC0zMjEsOTggKzQyNywxMTEgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKIENPTkZJR19TT0ZUX1dBVENIRE9HPXkKLSMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKICMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQogIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKIAogIwotIyBJMkMgc3VwcG9ydAorIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiAjCiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKICMKLSMgVVNCIHN1cHBvcnQKKyMgU3BlY2lhbCBISUQgZHJpdmVycwogIworQ09ORklHX1VTQl9TVVBQT1JUPXkKICMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKIAogIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMgRW5hYmxlIEhvc3Qgb3IgR2FkZ2V0IHN1cHBvcnQgdG8gc2VlIEludmVudHJhIG9wdGlvbnMKICMKIAogIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CiAKICMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAorIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKICMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIAogIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMgVEkgVkxZTlEKICMKLSMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCiAjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CitDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCkBAIC00MzIsMTkgKzU1MSwxNCBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CiBDT05GSUdfU1lTRlM9eQotQ09ORklHX0RFVkZTX0ZTPXkKLUNPTkZJR19ERVZGU19NT1VOVD15Ci0jIENPTkZJR19ERVZGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAogQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTQ1MiwyOSArNTY2LDIyIEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTE9HRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotQ09ORklHX05GU19ESVJFQ1RJTz15CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci0jIENPTkZJR19FWFBPUlRGUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DRVBIX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldApAQCAtNDg1LDQzICs1OTIsMTc1IEBACiAjCiAjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKICMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCi1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1I9eQorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TTUFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1RPTU9ZTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKK0NPTkZJR19DUllQVE89eQogCiAjCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQorQ09ORklHX0NSWVBUT19STkc9eQorQ09ORklHX0NSWVBUT19STkcyPXkKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCiAjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKK0NPTkZJR19DUllQVE9fQUVTPXkKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKK0NPTkZJR19DUllQVE9fQU5TSV9DUFJORz15CitDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19ETUE9eQorQ09ORklHX05MQVRUUj15CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggYTUwOGYyZi4uMzc2Y2Q5ZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMTE1LDYgKzExNSw3IEBACiAjZGVmaW5lIGZsdXNoX2NhY2hlX3ZtYXAoc3RhcnQsZW5kKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LGVuZCkJCQlkbyB7IH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgQVJDSF9JTVBMRU1FTlRTX0ZMVVNIX0RDQUNIRV9QQUdFIDAKICNkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQkJZG8geyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLGFkZHIscGZuKQkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NvcHJvY2Vzc29yLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jb3Byb2Nlc3Nvci5oCmluZGV4IDY1YTI4NWQuLjc1Yzk0YTEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NvcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY29wcm9jZXNzb3IuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBfWFRFTlNBX0NPUFJPQ0VTU09SX0gKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPHZhcmlhbnQvdGllLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggNWViNmQ2OS4uNmU2NWVhZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNkZWZpbmUgX1hURU5TQV9FTEZfSAogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9jb3Byb2Nlc3Nvci5oPgogCiAvKiBYdGVuc2EgcHJvY2Vzc29yIEVMRiBhcmNoaXRlY3R1cmUtbWFnaWMgbnVtYmVyICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2xvY2FsNjQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2xvY2FsNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbG9jYWw2NC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbDY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKaW5kZXggNGY0YTc5OC4uNDBjZjliYyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApAQCAtMTQsNiArMTQsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIC8qCiAgKiBBbGxvY2F0aW5nIGFuZCBmcmVlaW5nIGEgcG1kIGlzIHRyaXZpYWw6IHRoZSAxLWVudHJ5IHBtZCBpcwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAwZWE0OTM3Li4zYWNiMjZlIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTIsNyArMTIsNiBAQAogI2RlZmluZSBfWFRFTlNBX1BST0NFU1NPUl9ICiAKICNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KLSNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxwbGF0Zm9ybS9oYXJkd2FyZS5oPgogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggM2M1NDlmNy4uMGQ0MmM5MyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTc3LDYgKzc3LDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2luY2x1ZGUgPGFzbS9jb3Byb2Nlc3Nvci5oPgorCiAvKgogICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKICAqIGtlcm5lbCBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbCBvciBvdGhlciBrZXJuZWwgZW50cnkuCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNmY1NmQ5NS4uMmQyNzI4YiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjMsOCArMjMsOCBAQAogIwogIyBSZXBsaWNhdGUgcnVsZXMgaW4gc2NyaXB0cy9NYWtlZmlsZS5idWlsZAogCi1zZWQteSA9IC1lICdzLyhcKFwuW2Etel0qaXRcfFwucmVmXHxcKVwudGV4dCkvKFwxLmxpdGVyYWwgXDEudGV4dCkvZycJXAotCS1lICdzLyhcKFwudGV4dFwuW2Etel0qXCkpLyhcMS5saXRlcmFsIFwxKS9nJworc2VkLXkgPSAtZSAncy9cKihcKFwuW2Etel0qaXRcfFwucmVmXHxcKVwudGV4dCkvKihcMS5saXRlcmFsIFwxLnRleHQpL2cnICAgIFwKKwktZSAncy9cKihcKFwudGV4dFwuW2Etel0qXCkpLyooXDEubGl0ZXJhbCBcMSkvZycKIAogcXVpZXRfY21kX19jcHBfbGRzX1MgPSBMRFMgICAgICRACiAgICAgICBjbWRfX2NwcF9sZHNfUyA9ICQoQ1BQKSAkKGNwcF9mbGFncykgLVAgLUMgLVV4dGVuc2EgLURfX0FTU0VNQkxZX18gJDwgXApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAwNzBmZjhhLi43ZGMzZjkxIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUwppbmRleCA3N2ZjOWY2Li41ZmQwMWY2IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2hlYWQuUwppbmRleCBkMjE1YWRjLi4zZWY5MWE3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKQEAgLTE4NCw4ICsxODQsOCBAQAogCSAqIE5vdyBjbGVhciB0aGUgQlNTIHNlZ21lbnQuCiAJICovCiAKLQltb3ZpCWEyLCBfYnNzX3N0YXJ0CSMgc3RhcnQgb2YgQlNTCi0JbW92aQlhMywgX2Jzc19lbmQJIyBlbmQgb2YgQlNTCisJbW92aQlhMiwgX19ic3Nfc3RhcnQJIyBzdGFydCBvZiBCU1MKKwltb3ZpCWEzLCBfX2Jzc19zdG9wCSMgZW5kIG9mIEJTUwogCiAJX19sb29wdAlhMiwgYTMsIGE0LCAyCiAJczMyaQlhMCwgYTIsIDAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvbmV0d29yay5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKaW5kZXggODdlMjE4Zi4uZjcxN2UyMCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKQEAgLTYyMyw2ICs2MjMsMTkgQEAKIAogc3RhdGljIGludCBkcml2ZXJfcmVnaXN0ZXJlZDsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpc3NfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaXNzX25ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSBpc3NfbmV0X2Nsb3NlLAorCS5uZG9fZ2V0X3N0YXRzCQk9IGlzc19uZXRfZ2V0X3N0YXRzLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBpc3NfbmV0X3N0YXJ0X3htaXQsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGlzc19uZXRfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGlzc19uZXRfc2V0X21hYywKKwkvLy5uZG9fZG9faW9jdGwJCT0gaXNzX25ldF9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gaXNzX25ldF90eF90aW1lb3V0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaXNzX25ldF9zZXRfbXVsdGljYXN0X2xpc3QsCit9OworCiBzdGF0aWMgaW50IGlzc19uZXRfY29uZmlndXJlKGludCBpbmRleCwgY2hhciAqaW5pdCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtNjg2LDE1ICs2OTksOCBAQAogCSAqLwogCXNucHJpbnRmKGRldi0+bmFtZSwgc2l6ZW9mIGRldi0+bmFtZSwgImV0aCVkIiwgaW5kZXgpOwogCisJZGV2LT5uZXRkZXZfb3BzID0gJmlzc19uZXRkZXZfb3BzOwogCWRldi0+bXR1ID0gbHAtPm10dTsKLQlkZXYtPm9wZW4gPSBpc3NfbmV0X29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpc3NfbmV0X3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gaXNzX25ldF9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9IGlzc19uZXRfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaXNzX25ldF9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT50eF90aW1lb3V0ID0gaXNzX25ldF90eF90aW1lb3V0OwotCWRldi0+c2V0X21hY19hZGRyZXNzID0gaXNzX25ldF9zZXRfbWFjOwotCWRldi0+Y2hhbmdlX210dSA9IGlzc19uZXRfY2hhbmdlX210dTsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gKEhaID4+IDEpOwogCWRldi0+aXJxID0gLTE7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWcKaW5kZXggOWQ5NDM0Zi4uMWNkNDk3ZCAxMDA2NDQKLS0tIGEvY3J5cHRvL0tjb25maWcKKysrIGIvY3J5cHRvL0tjb25maWcKQEAgLTgwLDYgKzgwLDExIEBACiAKIGNvbmZpZyBDUllQVE9fUENPTVAKIAl0cmlzdGF0ZQorCXNlbGVjdCBDUllQVE9fUENPTVAyCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKworY29uZmlnIENSWVBUT19QQ09NUDIKKwl0cmlzdGF0ZQogCXNlbGVjdCBDUllQVE9fQUxHQVBJMgogCiBjb25maWcgQ1JZUFRPX01BTkFHRVIKQEAgLTk0LDcgKzk5LDE1IEBACiAJc2VsZWN0IENSWVBUT19BRUFEMgogCXNlbGVjdCBDUllQVE9fSEFTSDIKIAlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUjIKLQlzZWxlY3QgQ1JZUFRPX1BDT01QCisJc2VsZWN0IENSWVBUT19QQ09NUDIKKworY29uZmlnIENSWVBUT19NQU5BR0VSX1RFU1RTCisJYm9vbCAiUnVuIGFsZ29saXRobXMnIHNlbGYtdGVzdHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUllQVE9fTUFOQUdFUjIKKwloZWxwCisJICBSdW4gY3J5cHRvbWFuYWdlcidzIHRlc3RzIGZvciB0aGUgbmV3IGNyeXB0byBhbGdvcml0aG1zIGJlaW5nCisJICByZWdpc3RlcmVkLgogCiBjb25maWcgQ1JZUFRPX0dGMTI4TVVMCiAJdHJpc3RhdGUgIkdGKDJeMTI4KSBtdWx0aXBsaWNhdGlvbiBmdW5jdGlvbnMgKEVYUEVSSU1FTlRBTCkiCmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggZDdlNjQ0MS4uNDIzYjdkZSAxMDA2NDQKLS0tIGEvY3J5cHRvL01ha2VmaWxlCisrKyBiL2NyeXB0by9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogY3J5cHRvX2hhc2gtb2JqcyArPSBzaGFzaC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0hBU0gyKSArPSBjcnlwdG9faGFzaC5vCiAKLW9iai0kKENPTkZJR19DUllQVE9fUENPTVApICs9IHBjb21wcmVzcy5vCitvYmotJChDT05GSUdfQ1JZUFRPX1BDT01QMikgKz0gcGNvbXByZXNzLm8KIAogY3J5cHRvbWdyLW9ianMgOj0gYWxnYm9zcy5vIHRlc3RtZ3IubwogCkBAIC02MSw3ICs2MSw3IEBACiBvYmotJChDT05GSUdfQ1JZUFRPX0RFUykgKz0gZGVzX2dlbmVyaWMubwogb2JqLSQoQ09ORklHX0NSWVBUT19GQ1JZUFQpICs9IGZjcnlwdC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSArPSBibG93ZmlzaC5vCi1vYmotJChDT05GSUdfQ1JZUFRPX1RXT0ZJU0gpICs9IHR3b2Zpc2gubworb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIKSArPSB0d29maXNoX2dlbmVyaWMubwogb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX0NPTU1PTikgKz0gdHdvZmlzaF9jb21tb24ubwogb2JqLSQoQ09ORklHX0NSWVBUT19TRVJQRU5UKSArPSBzZXJwZW50Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQUVTKSArPSBhZXNfZ2VuZXJpYy5vCmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnYm9zcy5jIGIvY3J5cHRvL2FsZ2Jvc3MuYwppbmRleCBjM2MxOTZiLi40MGJkMzkxIDEwMDY0NAotLS0gYS9jcnlwdG8vYWxnYm9zcy5jCisrKyBiL2NyeXB0by9hbGdib3NzLmMKQEAgLTIwNiw2ICsyMDYsNyBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX01BTkFHRVJfVEVTVFMKIHN0YXRpYyBpbnQgY3J5cHRvbWdyX3Rlc3Qodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX3Rlc3RfcGFyYW0gKnBhcmFtID0gZGF0YTsKQEAgLTI2Niw2ICsyNjcsNyBAQAogZXJyOgogCXJldHVybiBOT1RJRllfT0s7CiB9CisjZW5kaWYgLyogQ09ORklHX0NSWVBUT19NQU5BR0VSX1RFU1RTICovCiAKIHN0YXRpYyBpbnQgY3J5cHRvbWdyX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgbXNnLAogCQkJICAgIHZvaWQgKmRhdGEpCkBAIC0yNzMsOCArMjc1LDEwIEBACiAJc3dpdGNoIChtc2cpIHsKIAljYXNlIENSWVBUT19NU0dfQUxHX1JFUVVFU1Q6CiAJCXJldHVybiBjcnlwdG9tZ3Jfc2NoZWR1bGVfcHJvYmUoZGF0YSk7CisjaWZkZWYgQ09ORklHX0NSWVBUT19NQU5BR0VSX1RFU1RTCiAJY2FzZSBDUllQVE9fTVNHX0FMR19SRUdJU1RFUjoKIAkJcmV0dXJuIGNyeXB0b21ncl9zY2hlZHVsZV90ZXN0KGRhdGEpOworI2VuZGlmCiAJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2F1dGhlbmMuYyBiL2NyeXB0by9hdXRoZW5jLmMKaW5kZXggYjk4ODRlZS4uYTVhMjJjZiAxMDA2NDQKLS0tIGEvY3J5cHRvL2F1dGhlbmMuYworKysgYi9jcnlwdG8vYXV0aGVuYy5jCkBAIC02MTYsNyArNjE2LDcgQEAKIAlhdXRoID0gYWhhc2hfYXR0cl9hbGcodGJbMV0sIENSWVBUT19BTEdfVFlQRV9IQVNILAogCQkJICAgICAgIENSWVBUT19BTEdfVFlQRV9BSEFTSF9NQVNLKTsKIAlpZiAoSVNfRVJSKGF1dGgpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGF1dGgpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGF1dGgpOwogCiAJYXV0aF9iYXNlID0gJmF1dGgtPmJhc2U7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9jdHIuYyBiL2NyeXB0by9jdHIuYwppbmRleCA2YzNiZmFiLi40Y2E3MjIyIDEwMDY0NAotLS0gYS9jcnlwdG8vY3RyLmMKKysrIGIvY3J5cHRvL2N0ci5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAlhbGcgPSBjcnlwdG9fYXR0cl9hbGcodGJbMV0sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7CiAJaWYgKElTX0VSUihhbGcpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworCQlyZXR1cm4gRVJSX0NBU1QoYWxnKTsKIAogCS8qIEJsb2NrIHNpemUgbXVzdCBiZSA+PSA0IGJ5dGVzLiAqLwogCWVyciA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9jcnlwdG8vcGNyeXB0LmMgYi9jcnlwdG8vcGNyeXB0LmMKaW5kZXggMjQ3MTc4Yy4uZGUzMDc4MiAxMDA2NDQKLS0tIGEvY3J5cHRvL3BjcnlwdC5jCisrKyBiL2NyeXB0by9wY3J5cHQuYwpAQCAtMjQsMTIgKzI0LDQwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxjcnlwdG8vcGNyeXB0Lmg+CiAKLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwY3J5cHRfZW5jX3BhZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwY3J5cHRfZGVjX3BhZGF0YTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZW5jd3E7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRlY3dxOworc3RydWN0IHBhZGF0YV9wY3J5cHQgeworCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0OworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCS8qCisJICogQ3B1bWFzayBmb3IgY2FsbGJhY2sgQ1BVcy4gSXQgc2hvdWxkIGJlCisJICogZXF1YWwgdG8gc2VyaWFsIGNwdW1hc2sgb2YgY29ycmVzcG9uZGluZyBwYWRhdGEgaW5zdGFuY2UsCisJICogc28gaXQgaXMgdXBkYXRlZCB3aGVuIHBhZGF0YSBub3RpZmllcyB1cyBhYm91dCBzZXJpYWwKKwkgKiBjcHVtYXNrIGNoYW5nZS4KKwkgKgorCSAqIGNiX2NwdW1hc2sgaXMgcHJvdGVjdGVkIGJ5IFJDVS4gVGhpcyBmYWN0IHByZXZlbnRzIHVzIGZyb20KKwkgKiB1c2luZyBjcHVtYXNrX3Zhcl90IGRpcmVjdGx5IGJlY2F1c2UgdGhlIGFjdHVhbCB0eXBlIG9mCisJICogY3B1bXNha192YXJfdCBkZXBlbmRzIG9uIGtlcm5lbCBjb25maWd1cmF0aW9uKHBhcnRpY3VsYXJseSBvbgorCSAqIENPTkZJR19DUFVNQVNLX09GRlNUQUNLIG1hY3JvKS4gRGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uCisJICogY3B1bWFza192YXJfdCBtYXkgYmUgZWl0aGVyIGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGNwdW1hc2sKKwkgKiBvciBhIHZhcmlhYmxlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suIFRodXMgd2UgY2FuIG5vdCBzYWZlbHkgdXNlCisJICogY3B1bWFza192YXJfdCB3aXRoIFJDVSBvcGVyYXRpb25zIHN1Y2ggYXMgcmN1X2Fzc2lnbl9wb2ludGVyIG9yCisJICogcmN1X2RlcmVmZXJlbmNlLiBTbyBjcHVtYXNrX3Zhcl90IGlzIHdyYXBwZWQgd2l0aCBzdHJ1Y3QKKwkgKiBwY3J5cHRfY3B1bWFzayB3aGljaCBtYWtlcyBwb3NzaWJsZSB0byB1c2UgaXQgd2l0aCBSQ1UuCisJICovCisJc3RydWN0IHBjcnlwdF9jcHVtYXNrIHsKKwkJY3B1bWFza192YXJfdCBtYXNrOworCX0gKmNiX2NwdW1hc2s7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5ibG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFkYXRhX3BjcnlwdCBwZW5jcnlwdDsKK3N0YXRpYyBzdHJ1Y3QgcGFkYXRhX3BjcnlwdCBwZGVjcnlwdDsKK3N0YXRpYyBzdHJ1Y3Qga3NldCAgICAgICAgICAgKnBjcnlwdF9rc2V0OwogCiBzdHJ1Y3QgcGNyeXB0X2luc3RhbmNlX2N0eCB7CiAJc3RydWN0IGNyeXB0b19zcGF3biBzcGF3bjsKQEAgLTQyLDI1ICs3MCwzMiBAQAogfTsKIAogc3RhdGljIGludCBwY3J5cHRfZG9fcGFyYWxsZWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIHVuc2lnbmVkIGludCAqY2JfY3B1LAotCQkJICAgICAgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpCisJCQkgICAgICBzdHJ1Y3QgcGFkYXRhX3BjcnlwdCAqcGNyeXB0KQogewogCXVuc2lnbmVkIGludCBjcHVfaW5kZXgsIGNwdSwgaTsKKwlzdHJ1Y3QgcGNyeXB0X2NwdW1hc2sgKmNwdW1hc2s7CiAKIAljcHUgPSAqY2JfY3B1OwogCi0JaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVfYWN0aXZlX21hc2spKQorCXJjdV9yZWFkX2xvY2tfYmgoKTsKKwljcHVtYXNrID0gcmN1X2RlcmVmZXJlbmNlKHBjcnlwdC0+Y2JfY3B1bWFzayk7CisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVtYXNrLT5tYXNrKSkKIAkJCWdvdG8gb3V0OwogCi0JY3B1X2luZGV4ID0gY3B1ICUgY3B1bWFza193ZWlnaHQoY3B1X2FjdGl2ZV9tYXNrKTsKKwlpZiAoIWNwdW1hc2tfd2VpZ2h0KGNwdW1hc2stPm1hc2spKQorCQkJZ290byBvdXQ7CiAKLQljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9hY3RpdmVfbWFzayk7CisJY3B1X2luZGV4ID0gY3B1ICUgY3B1bWFza193ZWlnaHQoY3B1bWFzay0+bWFzayk7CisKKwljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdW1hc2stPm1hc2spOwogCWZvciAoaSA9IDA7IGkgPCBjcHVfaW5kZXg7IGkrKykKLQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X2FjdGl2ZV9tYXNrKTsKKwkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1bWFzay0+bWFzayk7CiAKIAkqY2JfY3B1ID0gY3B1OwogCiBvdXQ6Ci0JcmV0dXJuIHBhZGF0YV9kb19wYXJhbGxlbChwaW5zdCwgcGFkYXRhLCBjcHUpOworCXJjdV9yZWFkX3VubG9ja19iaCgpOworCXJldHVybiBwYWRhdGFfZG9fcGFyYWxsZWwocGNyeXB0LT5waW5zdCwgcGFkYXRhLCBjcHUpOwogfQogCiBzdGF0aWMgaW50IHBjcnlwdF9hZWFkX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKnBhcmVudCwKQEAgLTE0MiwxMSArMTc3LDkgQEAKIAkJCSAgICAgICByZXEtPmNyeXB0bGVuLCByZXEtPml2KTsKIAlhZWFkX3JlcXVlc3Rfc2V0X2Fzc29jKGNyZXEsIHJlcS0+YXNzb2MsIHJlcS0+YXNzb2NsZW4pOwogCi0JZXJyID0gcGNyeXB0X2RvX3BhcmFsbGVsKHBhZGF0YSwgJmN0eC0+Y2JfY3B1LCBwY3J5cHRfZW5jX3BhZGF0YSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllbHNlCi0JCWVyciA9IGNyeXB0b19hZWFkX2VuY3J5cHQoY3JlcSk7CisJZXJyID0gcGNyeXB0X2RvX3BhcmFsbGVsKHBhZGF0YSwgJmN0eC0+Y2JfY3B1LCAmcGVuY3J5cHQpOworCWlmICghZXJyKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE4NiwxMSArMjE5LDkgQEAKIAkJCSAgICAgICByZXEtPmNyeXB0bGVuLCByZXEtPml2KTsKIAlhZWFkX3JlcXVlc3Rfc2V0X2Fzc29jKGNyZXEsIHJlcS0+YXNzb2MsIHJlcS0+YXNzb2NsZW4pOwogCi0JZXJyID0gcGNyeXB0X2RvX3BhcmFsbGVsKHBhZGF0YSwgJmN0eC0+Y2JfY3B1LCBwY3J5cHRfZGVjX3BhZGF0YSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllbHNlCi0JCWVyciA9IGNyeXB0b19hZWFkX2RlY3J5cHQoY3JlcSk7CisJZXJyID0gcGNyeXB0X2RvX3BhcmFsbGVsKHBhZGF0YSwgJmN0eC0+Y2JfY3B1LCAmcGRlY3J5cHQpOworCWlmICghZXJyKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTIzMiwxMSArMjYzLDkgQEAKIAlhZWFkX2dpdmNyeXB0X3NldF9hc3NvYyhjcmVxLCBhcmVxLT5hc3NvYywgYXJlcS0+YXNzb2NsZW4pOwogCWFlYWRfZ2l2Y3J5cHRfc2V0X2dpdihjcmVxLCByZXEtPmdpdiwgcmVxLT5zZXEpOwogCi0JZXJyID0gcGNyeXB0X2RvX3BhcmFsbGVsKHBhZGF0YSwgJmN0eC0+Y2JfY3B1LCBwY3J5cHRfZW5jX3BhZGF0YSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllbHNlCi0JCWVyciA9IGNyeXB0b19hZWFkX2dpdmVuY3J5cHQoY3JlcSk7CisJZXJyID0gcGNyeXB0X2RvX3BhcmFsbGVsKHBhZGF0YSwgJmN0eC0+Y2JfY3B1LCAmcGVuY3J5cHQpOworCWlmICghZXJyKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTM3Niw2ICs0MDUsMTE1IEBACiAJa2ZyZWUoaW5zdCk7CiB9CiAKK3N0YXRpYyBpbnQgcGNyeXB0X2NwdW1hc2tfY2hhbmdlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwYWRhdGFfcGNyeXB0ICpwY3J5cHQ7CisJc3RydWN0IHBjcnlwdF9jcHVtYXNrICpuZXdfbWFzaywgKm9sZF9tYXNrOworCXN0cnVjdCBwYWRhdGFfY3B1bWFzayAqY3B1bWFzayA9IChzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgKilkYXRhOworCisJaWYgKCEodmFsICYgUEFEQVRBX0NQVV9TRVJJQUwpKQorCQlyZXR1cm4gMDsKKworCXBjcnlwdCA9IGNvbnRhaW5lcl9vZihzZWxmLCBzdHJ1Y3QgcGFkYXRhX3BjcnlwdCwgbmJsb2NrKTsKKwluZXdfbWFzayA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfbWFzayksIEdGUF9LRVJORUwpOworCWlmICghbmV3X21hc2spCisJCXJldHVybiAtRU5PTUVNOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJm5ld19tYXNrLT5tYXNrLCBHRlBfS0VSTkVMKSkgeworCQlrZnJlZShuZXdfbWFzayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW9sZF9tYXNrID0gcGNyeXB0LT5jYl9jcHVtYXNrOworCisJY3B1bWFza19jb3B5KG5ld19tYXNrLT5tYXNrLCBjcHVtYXNrLT5jYmNwdSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHBjcnlwdC0+Y2JfY3B1bWFzaywgbmV3X21hc2spOworCXN5bmNocm9uaXplX3JjdV9iaCgpOworCisJZnJlZV9jcHVtYXNrX3ZhcihvbGRfbWFzay0+bWFzayk7CisJa2ZyZWUob2xkX21hc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjcnlwdF9zeXNmc19hZGQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJldDsKKworCXBpbnN0LT5rb2JqLmtzZXQgPSBwY3J5cHRfa3NldDsKKwlyZXQgPSBrb2JqZWN0X2FkZCgmcGluc3QtPmtvYmosIE5VTEwsIG5hbWUpOworCWlmICghcmV0KQorCQlrb2JqZWN0X3VldmVudCgmcGluc3QtPmtvYmosIEtPQkpfQUREKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGNyeXB0X2luaXRfcGFkYXRhKHN0cnVjdCBwYWRhdGFfcGNyeXB0ICpwY3J5cHQsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBwY3J5cHRfY3B1bWFzayAqbWFzazsKKworCWdldF9vbmxpbmVfY3B1cygpOworCisJcGNyeXB0LT53cSA9IGNyZWF0ZV93b3JrcXVldWUobmFtZSk7CisJaWYgKCFwY3J5cHQtPndxKQorCQlnb3RvIGVycjsKKworCXBjcnlwdC0+cGluc3QgPSBwYWRhdGFfYWxsb2NfcG9zc2libGUocGNyeXB0LT53cSk7CisJaWYgKCFwY3J5cHQtPnBpbnN0KQorCQlnb3RvIGVycl9kZXN0cm95X3dvcmtxdWV1ZTsKKworCW1hc2sgPSBrbWFsbG9jKHNpemVvZigqbWFzayksIEdGUF9LRVJORUwpOworCWlmICghbWFzaykKKwkJZ290byBlcnJfZnJlZV9wYWRhdGE7CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmbWFzay0+bWFzaywgR0ZQX0tFUk5FTCkpIHsKKwkJa2ZyZWUobWFzayk7CisJCWdvdG8gZXJyX2ZyZWVfcGFkYXRhOworCX0KKworCWNwdW1hc2tfYW5kKG1hc2stPm1hc2ssIGNwdV9wb3NzaWJsZV9tYXNrLCBjcHVfYWN0aXZlX21hc2spOworCXJjdV9hc3NpZ25fcG9pbnRlcihwY3J5cHQtPmNiX2NwdW1hc2ssIG1hc2spOworCisJcGNyeXB0LT5uYmxvY2subm90aWZpZXJfY2FsbCA9IHBjcnlwdF9jcHVtYXNrX2NoYW5nZV9ub3RpZnk7CisJcmV0ID0gcGFkYXRhX3JlZ2lzdGVyX2NwdW1hc2tfbm90aWZpZXIocGNyeXB0LT5waW5zdCwgJnBjcnlwdC0+bmJsb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2NwdW1hc2s7CisKKwlyZXQgPSBwY3J5cHRfc3lzZnNfYWRkKHBjcnlwdC0+cGluc3QsIG5hbWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfbm90aWZpZXI7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKKworCXJldHVybiByZXQ7CisKK2Vycl91bnJlZ2lzdGVyX25vdGlmaWVyOgorCXBhZGF0YV91bnJlZ2lzdGVyX2NwdW1hc2tfbm90aWZpZXIocGNyeXB0LT5waW5zdCwgJnBjcnlwdC0+bmJsb2NrKTsKK2Vycl9mcmVlX2NwdW1hc2s6CisJZnJlZV9jcHVtYXNrX3ZhcihtYXNrLT5tYXNrKTsKKwlrZnJlZShtYXNrKTsKK2Vycl9mcmVlX3BhZGF0YToKKwlwYWRhdGFfZnJlZShwY3J5cHQtPnBpbnN0KTsKK2Vycl9kZXN0cm95X3dvcmtxdWV1ZToKKwlkZXN0cm95X3dvcmtxdWV1ZShwY3J5cHQtPndxKTsKK2VycjoKKwlwdXRfb25saW5lX2NwdXMoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBjcnlwdF9maW5pX3BhZGF0YShzdHJ1Y3QgcGFkYXRhX3BjcnlwdCAqcGNyeXB0KQoreworCWtvYmplY3RfcHV0KCZwY3J5cHQtPnBpbnN0LT5rb2JqKTsKKwlmcmVlX2NwdW1hc2tfdmFyKHBjcnlwdC0+Y2JfY3B1bWFzay0+bWFzayk7CisJa2ZyZWUocGNyeXB0LT5jYl9jcHVtYXNrKTsKKworCXBhZGF0YV9zdG9wKHBjcnlwdC0+cGluc3QpOworCXBhZGF0YV91bnJlZ2lzdGVyX2NwdW1hc2tfbm90aWZpZXIocGNyeXB0LT5waW5zdCwgJnBjcnlwdC0+bmJsb2NrKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShwY3J5cHQtPndxKTsKKwlwYWRhdGFfZnJlZShwY3J5cHQtPnBpbnN0KTsKK30KKwogc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgcGNyeXB0X3RtcGwgPSB7CiAJLm5hbWUgPSAicGNyeXB0IiwKIAkuYWxsb2MgPSBwY3J5cHRfYWxsb2MsCkBAIC0zODUsNTIgKzUyMywzOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwY3J5cHRfaW5pdCh2b2lkKQogewotCWVuY3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgicGVuY3J5cHQiKTsKLQlpZiAoIWVuY3dxKQorCWludCBlcnIgPSAtRU5PTUVNOworCisJcGNyeXB0X2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJwY3J5cHQiLCBOVUxMLCBrZXJuZWxfa29iaik7CisJaWYgKCFwY3J5cHRfa3NldCkKIAkJZ290byBlcnI7CiAKLQlkZWN3cSA9IGNyZWF0ZV93b3JrcXVldWUoInBkZWNyeXB0Iik7Ci0JaWYgKCFkZWN3cSkKLQkJZ290byBlcnJfZGVzdHJveV9lbmN3cTsKKwllcnIgPSBwY3J5cHRfaW5pdF9wYWRhdGEoJnBlbmNyeXB0LCAicGVuY3J5cHQiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91bnJlZ19rc2V0OwogCisJZXJyID0gcGNyeXB0X2luaXRfcGFkYXRhKCZwZGVjcnlwdCwgInBkZWNyeXB0Iik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZGVpbml0X3BlbmNyeXB0OwogCi0JcGNyeXB0X2VuY19wYWRhdGEgPSBwYWRhdGFfYWxsb2MoY3B1X3Bvc3NpYmxlX21hc2ssIGVuY3dxKTsKLQlpZiAoIXBjcnlwdF9lbmNfcGFkYXRhKQotCQlnb3RvIGVycl9kZXN0cm95X2RlY3dxOwotCi0JcGNyeXB0X2RlY19wYWRhdGEgPSBwYWRhdGFfYWxsb2MoY3B1X3Bvc3NpYmxlX21hc2ssIGRlY3dxKTsKLQlpZiAoIXBjcnlwdF9kZWNfcGFkYXRhKQotCQlnb3RvIGVycl9mcmVlX3BhZGF0YTsKLQotCXBhZGF0YV9zdGFydChwY3J5cHRfZW5jX3BhZGF0YSk7Ci0JcGFkYXRhX3N0YXJ0KHBjcnlwdF9kZWNfcGFkYXRhKTsKKwlwYWRhdGFfc3RhcnQocGVuY3J5cHQucGluc3QpOworCXBhZGF0YV9zdGFydChwZGVjcnlwdC5waW5zdCk7CiAKIAlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3RlbXBsYXRlKCZwY3J5cHRfdG1wbCk7CiAKLWVycl9mcmVlX3BhZGF0YToKLQlwYWRhdGFfZnJlZShwY3J5cHRfZW5jX3BhZGF0YSk7Ci0KLWVycl9kZXN0cm95X2RlY3dxOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGRlY3dxKTsKLQotZXJyX2Rlc3Ryb3lfZW5jd3E6Ci0JZGVzdHJveV93b3JrcXVldWUoZW5jd3EpOwotCitlcnJfZGVpbml0X3BlbmNyeXB0OgorCXBjcnlwdF9maW5pX3BhZGF0YSgmcGVuY3J5cHQpOworZXJyX3VucmVnX2tzZXQ6CisJa3NldF91bnJlZ2lzdGVyKHBjcnlwdF9rc2V0KTsKIGVycjoKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGNyeXB0X2V4aXQodm9pZCkKIHsKLQlwYWRhdGFfc3RvcChwY3J5cHRfZW5jX3BhZGF0YSk7Ci0JcGFkYXRhX3N0b3AocGNyeXB0X2RlY19wYWRhdGEpOworCXBjcnlwdF9maW5pX3BhZGF0YSgmcGVuY3J5cHQpOworCXBjcnlwdF9maW5pX3BhZGF0YSgmcGRlY3J5cHQpOwogCi0JZGVzdHJveV93b3JrcXVldWUoZW5jd3EpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGRlY3dxKTsKLQotCXBhZGF0YV9mcmVlKHBjcnlwdF9lbmNfcGFkYXRhKTsKLQlwYWRhdGFfZnJlZShwY3J5cHRfZGVjX3BhZGF0YSk7Ci0KKwlrc2V0X3VucmVnaXN0ZXIocGNyeXB0X2tzZXQpOwogCWNyeXB0b191bnJlZ2lzdGVyX3RlbXBsYXRlKCZwY3J5cHRfdG1wbCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NyeXB0by90ZXN0bWdyLmMgYi9jcnlwdG8vdGVzdG1nci5jCmluZGV4IDVjOGFhYTAuLmFiZDk4MGM3IDEwMDY0NAotLS0gYS9jcnlwdG8vdGVzdG1nci5jCisrKyBiL2NyeXB0by90ZXN0bWdyLmMKQEAgLTIyLDYgKzIyLDE3IEBACiAjaW5jbHVkZSA8Y3J5cHRvL3JuZy5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2lmbmRlZiBDT05GSUdfQ1JZUFRPX01BTkFHRVJfVEVTVFMKKworLyogYSBwZXJmZWN0IG5vcCAqLworaW50IGFsZ190ZXN0KGNvbnN0IGNoYXIgKmRyaXZlciwgY29uc3QgY2hhciAqYWxnLCB1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKICNpbmNsdWRlICJ0ZXN0bWdyLmgiCiAKIC8qCkBAIC0yNTMwLDQgKzI1NDEsNyBAQAogbm9uX2ZpcHNfYWxnOgogCXJldHVybiAtRUlOVkFMOwogfQorCisjZW5kaWYgLyogQ09ORklHX0NSWVBUT19NQU5BR0VSX1RFU1RTICovCisKIEVYUE9SVF9TWU1CT0xfR1BMKGFsZ190ZXN0KTsKZGlmZiAtLWdpdCBhL2NyeXB0by90d29maXNoLmMgYi9jcnlwdG8vdHdvZmlzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNkYTIzLi4wMDAwMDAwCi0tLSBhL2NyeXB0by90d29maXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIFR3b2Zpc2ggZm9yIENyeXB0b0FQSQotICoKLSAqIE9yaWdpbmFsbHkgVHdvZmlzaCBmb3IgR1BHCi0gKiBCeSBNYXR0aGV3IFNrYWxhIDxtc2thbGFAYW5zdXouc29va2UuYmMuY2E+LCBKdWx5IDI2LCAxOTk4Ci0gKiAyNTYtYml0IGtleSBsZW5ndGggYWRkZWQgTWFyY2ggMjAsIDE5OTkKLSAqIFNvbWUgbW9kaWZpY2F0aW9ucyB0byByZWR1Y2UgdGhlIHRleHQgc2l6ZSBieSBXZXJuZXIgS29jaCwgQXByaWwsIDE5OTgKLSAqIFBvcnRlZCB0byB0aGUga2VybmVsaSBwYXRjaCBieSBNYXJjIE11dHogPE1hcmNATXV0ei5jb20+Ci0gKiBQb3J0ZWQgdG8gQ3J5cHRvQVBJIGJ5IENvbGluIFNsYXRlciA8aG9ob0B0YWNvbWVhdC5uZXQ+Ci0gKgotICogVGhlIG9yaWdpbmFsIGF1dGhvciBoYXMgZGlzY2xhaW1lZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoaXMKLSAqIGNvZGUgYW5kIHRodXMgcHV0IGl0IGluIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgc3Vic2VxdWVudCBhdXRob3JzIAotICogaGF2ZSBwdXQgdGhpcyB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3Ci0gKiBVU0EKLSAqCi0gKiBUaGlzIGNvZGUgaXMgYSAiY2xlYW4gcm9vbSIgaW1wbGVtZW50YXRpb24sIHdyaXR0ZW4gZnJvbSB0aGUgcGFwZXIKLSAqIF9Ud29maXNoOiBBIDEyOC1CaXQgQmxvY2sgQ2lwaGVyXyBieSBCcnVjZSBTY2huZWllciwgSm9obiBLZWxzZXksCi0gKiBEb3VnIFdoaXRpbmcsIERhdmlkIFdhZ25lciwgQ2hyaXMgSGFsbCwgYW5kIE5pZWxzIEZlcmd1c29uLCBhdmFpbGFibGUKLSAqIHRocm91Z2ggaHR0cDovL3d3dy5jb3VudGVycGFuZS5jb20vdHdvZmlzaC5odG1sCi0gKgotICogRm9yIGJhY2tncm91bmQgaW5mb3JtYXRpb24gb24gbXVsdGlwbGljYXRpb24gaW4gZmluaXRlIGZpZWxkcywgdXNlZCBmb3IKLSAqIHRoZSBtYXRyaXggb3BlcmF0aW9ucyBpbiB0aGUga2V5IHNjaGVkdWxlLCBzZWUgdGhlIGJvb2sgX0NvbnRlbXBvcmFyeQotICogQWJzdHJhY3QgQWxnZWJyYV8gYnkgSm9zZXBoIEEuIEdhbGxpYW4sIGVzcGVjaWFsbHkgY2hhcHRlciAyMiBpbiB0aGUKLSAqIFRoaXJkIEVkaXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxjcnlwdG8vdHdvZmlzaC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLS8qIE1hY3JvcyB0byBjb21wdXRlIHRoZSBnKCkgZnVuY3Rpb24gaW4gdGhlIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24KLSAqIHJvdW5kcy4gIEcxIGlzIHRoZSBzdHJhaWdodCBnKCkgZnVuY3Rpb247IEcyIGluY2x1ZGVzIHRoZSA4LWJpdAotICogcm90YXRpb24gZm9yIHRoZSBoaWdoIDMyLWJpdCB3b3JkLiAqLwotCi0jZGVmaW5lIEcxKGEpIFwKLSAgICAgKGN0eC0+c1swXVsoYSkgJiAweEZGXSkgXiAoY3R4LT5zWzFdWygoYSkgPj4gOCkgJiAweEZGXSkgXAotICAgXiAoY3R4LT5zWzJdWygoYSkgPj4gMTYpICYgMHhGRl0pIF4gKGN0eC0+c1szXVsoYSkgPj4gMjRdKQotCi0jZGVmaW5lIEcyKGIpIFwKLSAgICAgKGN0eC0+c1sxXVsoYikgJiAweEZGXSkgXiAoY3R4LT5zWzJdWygoYikgPj4gOCkgJiAweEZGXSkgXAotICAgXiAoY3R4LT5zWzNdWygoYikgPj4gMTYpICYgMHhGRl0pIF4gKGN0eC0+c1swXVsoYikgPj4gMjRdKQotCi0vKiBFbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIEZlaXN0ZWwgcm91bmRzLiAgRWFjaCBvbmUgY2FsbHMgdGhlIHR3byBnKCkKLSAqIG1hY3JvcywgZG9lcyB0aGUgUEhULCBhbmQgcGVyZm9ybXMgdGhlIFhPUiBhbmQgdGhlIGFwcHJvcHJpYXRlIGJpdAotICogcm90YXRpb25zLiAgVGhlIHBhcmFtZXRlcnMgYXJlIHRoZSByb3VuZCBudW1iZXIgKHVzZWQgdG8gc2VsZWN0IHN1YmtleXMpLAotICogYW5kIHRoZSBmb3VyIDMyLWJpdCBjaHVua3Mgb2YgdGhlIHRleHQuICovCi0KLSNkZWZpbmUgRU5DUk9VTkQobiwgYSwgYiwgYywgZCkgXAotICAgeCA9IEcxIChhKTsgeSA9IEcyIChiKTsgXAotICAgeCArPSB5OyB5ICs9IHggKyBjdHgtPmtbMiAqIChuKSArIDFdOyBcCi0gICAoYykgXj0geCArIGN0eC0+a1syICogKG4pXTsgXAotICAgKGMpID0gcm9yMzIoKGMpLCAxKTsgXAotICAgKGQpID0gcm9sMzIoKGQpLCAxKSBeIHkKLQotI2RlZmluZSBERUNST1VORChuLCBhLCBiLCBjLCBkKSBcCi0gICB4ID0gRzEgKGEpOyB5ID0gRzIgKGIpOyBcCi0gICB4ICs9IHk7IHkgKz0geDsgXAotICAgKGQpIF49IHkgKyBjdHgtPmtbMiAqIChuKSArIDFdOyBcCi0gICAoZCkgPSByb3IzMigoZCksIDEpOyBcCi0gICAoYykgPSByb2wzMigoYyksIDEpOyBcCi0gICAoYykgXj0gKHggKyBjdHgtPmtbMiAqIChuKV0pCi0KLS8qIEVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gY3ljbGVzOyBlYWNoIG9uZSBpcyBzaW1wbHkgdHdvIEZlaXN0ZWwgcm91bmRzCi0gKiB3aXRoIHRoZSAzMi1iaXQgY2h1bmtzIHJlLW9yZGVyZWQgdG8gc2ltdWxhdGUgdGhlICJzd2FwIiAqLwotCi0jZGVmaW5lIEVOQ0NZQ0xFKG4pIFwKLSAgIEVOQ1JPVU5EICgyICogKG4pLCBhLCBiLCBjLCBkKTsgXAotICAgRU5DUk9VTkQgKDIgKiAobikgKyAxLCBjLCBkLCBhLCBiKQotCi0jZGVmaW5lIERFQ0NZQ0xFKG4pIFwKLSAgIERFQ1JPVU5EICgyICogKG4pICsgMSwgYywgZCwgYSwgYik7IFwKLSAgIERFQ1JPVU5EICgyICogKG4pLCBhLCBiLCBjLCBkKQotCi0vKiBNYWNyb3MgdG8gY29udmVydCB0aGUgaW5wdXQgYW5kIG91dHB1dCBieXRlcyBpbnRvIDMyLWJpdCB3b3JkcywKLSAqIGFuZCBzaW11bHRhbmVvdXNseSBwZXJmb3JtIHRoZSB3aGl0ZW5pbmcgc3RlcC4gIElOUEFDSyBwYWNrcyB3b3JkCi0gKiBudW1iZXIgbiBpbnRvIHRoZSB2YXJpYWJsZSBuYW1lZCBieSB4LCB1c2luZyB3aGl0ZW5pbmcgc3Via2V5IG51bWJlciBtLgotICogT1VUVU5QQUNLIHVucGFja3Mgd29yZCBudW1iZXIgbiBmcm9tIHRoZSB2YXJpYWJsZSBuYW1lZCBieSB4LCB1c2luZwotICogd2hpdGVuaW5nIHN1YmtleSBudW1iZXIgbS4gKi8KLQotI2RlZmluZSBJTlBBQ0sobiwgeCwgbSkgXAotICAgeCA9IGxlMzJfdG9fY3B1KHNyY1tuXSkgXiBjdHgtPndbbV0KLQotI2RlZmluZSBPVVRVTlBBQ0sobiwgeCwgbSkgXAotICAgeCBePSBjdHgtPndbbV07IFwKLSAgIGRzdFtuXSA9IGNwdV90b19sZTMyKHgpCi0KLQotCi0vKiBFbmNyeXB0IG9uZSBibG9jay4gIGluIGFuZCBvdXQgbWF5IGJlIHRoZSBzYW1lLiAqLwotc3RhdGljIHZvaWQgdHdvZmlzaF9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKLXsKLQlzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JY29uc3QgX19sZTMyICpzcmMgPSAoY29uc3QgX19sZTMyICopaW47Ci0JX19sZTMyICpkc3QgPSAoX19sZTMyICopb3V0OwotCi0JLyogVGhlIGZvdXIgMzItYml0IGNodW5rcyBvZiB0aGUgdGV4dC4gKi8KLQl1MzIgYSwgYiwgYywgZDsKLQkKLQkvKiBUZW1wb3JhcmllcyB1c2VkIGJ5IHRoZSByb3VuZCBmdW5jdGlvbi4gKi8KLQl1MzIgeCwgeTsKLQotCS8qIElucHV0IHdoaXRlbmluZyBhbmQgcGFja2luZy4gKi8KLQlJTlBBQ0sgKDAsIGEsIDApOwotCUlOUEFDSyAoMSwgYiwgMSk7Ci0JSU5QQUNLICgyLCBjLCAyKTsKLQlJTlBBQ0sgKDMsIGQsIDMpOwotCQotCS8qIEVuY3J5cHRpb24gRmVpc3RlbCBjeWNsZXMuICovCi0JRU5DQ1lDTEUgKDApOwotCUVOQ0NZQ0xFICgxKTsKLQlFTkNDWUNMRSAoMik7Ci0JRU5DQ1lDTEUgKDMpOwotCUVOQ0NZQ0xFICg0KTsKLQlFTkNDWUNMRSAoNSk7Ci0JRU5DQ1lDTEUgKDYpOwotCUVOQ0NZQ0xFICg3KTsKLQkKLQkvKiBPdXRwdXQgd2hpdGVuaW5nIGFuZCB1bnBhY2tpbmcuICovCi0JT1VUVU5QQUNLICgwLCBjLCA0KTsKLQlPVVRVTlBBQ0sgKDEsIGQsIDUpOwotCU9VVFVOUEFDSyAoMiwgYSwgNik7Ci0JT1VUVU5QQUNLICgzLCBiLCA3KTsKLQkKLX0KLQotLyogRGVjcnlwdCBvbmUgYmxvY2suICBpbiBhbmQgb3V0IG1heSBiZSB0aGUgc2FtZS4gKi8KLXN0YXRpYyB2b2lkIHR3b2Zpc2hfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCi17Ci0Jc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCWNvbnN0IF9fbGUzMiAqc3JjID0gKGNvbnN0IF9fbGUzMiAqKWluOwotCV9fbGUzMiAqZHN0ID0gKF9fbGUzMiAqKW91dDsKLSAgCi0JLyogVGhlIGZvdXIgMzItYml0IGNodW5rcyBvZiB0aGUgdGV4dC4gKi8KLQl1MzIgYSwgYiwgYywgZDsKLQkKLQkvKiBUZW1wb3JhcmllcyB1c2VkIGJ5IHRoZSByb3VuZCBmdW5jdGlvbi4gKi8KLQl1MzIgeCwgeTsKLQkKLQkvKiBJbnB1dCB3aGl0ZW5pbmcgYW5kIHBhY2tpbmcuICovCi0JSU5QQUNLICgwLCBjLCA0KTsKLQlJTlBBQ0sgKDEsIGQsIDUpOwotCUlOUEFDSyAoMiwgYSwgNik7Ci0JSU5QQUNLICgzLCBiLCA3KTsKLQkKLQkvKiBFbmNyeXB0aW9uIEZlaXN0ZWwgY3ljbGVzLiAqLwotCURFQ0NZQ0xFICg3KTsKLQlERUNDWUNMRSAoNik7Ci0JREVDQ1lDTEUgKDUpOwotCURFQ0NZQ0xFICg0KTsKLQlERUNDWUNMRSAoMyk7Ci0JREVDQ1lDTEUgKDIpOwotCURFQ0NZQ0xFICgxKTsKLQlERUNDWUNMRSAoMCk7Ci0KLQkvKiBPdXRwdXQgd2hpdGVuaW5nIGFuZCB1bnBhY2tpbmcuICovCi0JT1VUVU5QQUNLICgwLCBhLCAwKTsKLQlPVVRVTlBBQ0sgKDEsIGIsIDEpOwotCU9VVFVOUEFDSyAoMiwgYywgMik7Ci0JT1VUVU5QQUNLICgzLCBkLCAzKTsKLQotfQotCi1zdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWxnID0gewotCS5jcmFfbmFtZSAgICAgICAgICAgPSAgICJ0d29maXNoIiwKLQkuY3JhX2RyaXZlcl9uYW1lICAgID0gICAidHdvZmlzaC1nZW5lcmljIiwKLQkuY3JhX3ByaW9yaXR5ICAgICAgID0gICAxMDAsCi0JLmNyYV9mbGFncyAgICAgICAgICA9ICAgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKLQkuY3JhX2Jsb2Nrc2l6ZSAgICAgID0gICBURl9CTE9DS19TSVpFLAotCS5jcmFfY3R4c2l6ZSAgICAgICAgPSAgIHNpemVvZihzdHJ1Y3QgdHdvZmlzaF9jdHgpLAotCS5jcmFfYWxpZ25tYXNrICAgICAgPQkzLAotCS5jcmFfbW9kdWxlICAgICAgICAgPSAgIFRISVNfTU9EVUxFLAotCS5jcmFfbGlzdCAgICAgICAgICAgPSAgIExJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCi0JLmNyYV91ICAgICAgICAgICAgICA9ICAgeyAuY2lwaGVyID0gewotCS5jaWFfbWluX2tleXNpemUgICAgPSAgIFRGX01JTl9LRVlfU0laRSwKLQkuY2lhX21heF9rZXlzaXplICAgID0gICBURl9NQVhfS0VZX1NJWkUsCi0JLmNpYV9zZXRrZXkgICAgICAgICA9ICAgdHdvZmlzaF9zZXRrZXksCi0JLmNpYV9lbmNyeXB0ICAgICAgICA9ICAgdHdvZmlzaF9lbmNyeXB0LAotCS5jaWFfZGVjcnlwdCAgICAgICAgPSAgIHR3b2Zpc2hfZGVjcnlwdCB9IH0KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHR3b2Zpc2hfbW9kX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWxnKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHR3b2Zpc2hfbW9kX2Zpbmkodm9pZCkKLXsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFsZyk7Ci19Ci0KLW1vZHVsZV9pbml0KHR3b2Zpc2hfbW9kX2luaXQpOwotbW9kdWxlX2V4aXQodHdvZmlzaF9tb2RfZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTiAoIlR3b2Zpc2ggQ2lwaGVyIEFsZ29yaXRobSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3R3b2Zpc2hfZ2VuZXJpYy5jIGIvY3J5cHRvL3R3b2Zpc2hfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDdiODQKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vdHdvZmlzaF9nZW5lcmljLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBUd29maXNoIGZvciBDcnlwdG9BUEkKKyAqCisgKiBPcmlnaW5hbGx5IFR3b2Zpc2ggZm9yIEdQRworICogQnkgTWF0dGhldyBTa2FsYSA8bXNrYWxhQGFuc3V6LnNvb2tlLmJjLmNhPiwgSnVseSAyNiwgMTk5OAorICogMjU2LWJpdCBrZXkgbGVuZ3RoIGFkZGVkIE1hcmNoIDIwLCAxOTk5CisgKiBTb21lIG1vZGlmaWNhdGlvbnMgdG8gcmVkdWNlIHRoZSB0ZXh0IHNpemUgYnkgV2VybmVyIEtvY2gsIEFwcmlsLCAxOTk4CisgKiBQb3J0ZWQgdG8gdGhlIGtlcm5lbGkgcGF0Y2ggYnkgTWFyYyBNdXR6IDxNYXJjQE11dHouY29tPgorICogUG9ydGVkIHRvIENyeXB0b0FQSSBieSBDb2xpbiBTbGF0ZXIgPGhvaG9AdGFjb21lYXQubmV0PgorICoKKyAqIFRoZSBvcmlnaW5hbCBhdXRob3IgaGFzIGRpc2NsYWltZWQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGlzCisgKiBjb2RlIGFuZCB0aHVzIHB1dCBpdCBpbiB0aGUgcHVibGljIGRvbWFpbi4gVGhlIHN1YnNlcXVlbnQgYXV0aG9ycyAKKyAqIGhhdmUgcHV0IHRoaXMgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogVVNBCisgKgorICogVGhpcyBjb2RlIGlzIGEgImNsZWFuIHJvb20iIGltcGxlbWVudGF0aW9uLCB3cml0dGVuIGZyb20gdGhlIHBhcGVyCisgKiBfVHdvZmlzaDogQSAxMjgtQml0IEJsb2NrIENpcGhlcl8gYnkgQnJ1Y2UgU2NobmVpZXIsIEpvaG4gS2Vsc2V5LAorICogRG91ZyBXaGl0aW5nLCBEYXZpZCBXYWduZXIsIENocmlzIEhhbGwsIGFuZCBOaWVscyBGZXJndXNvbiwgYXZhaWxhYmxlCisgKiB0aHJvdWdoIGh0dHA6Ly93d3cuY291bnRlcnBhbmUuY29tL3R3b2Zpc2guaHRtbAorICoKKyAqIEZvciBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG9uIG11bHRpcGxpY2F0aW9uIGluIGZpbml0ZSBmaWVsZHMsIHVzZWQgZm9yCisgKiB0aGUgbWF0cml4IG9wZXJhdGlvbnMgaW4gdGhlIGtleSBzY2hlZHVsZSwgc2VlIHRoZSBib29rIF9Db250ZW1wb3JhcnkKKyAqIEFic3RyYWN0IEFsZ2VicmFfIGJ5IEpvc2VwaCBBLiBHYWxsaWFuLCBlc3BlY2lhbGx5IGNoYXB0ZXIgMjIgaW4gdGhlCisgKiBUaGlyZCBFZGl0aW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3R3b2Zpc2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisvKiBNYWNyb3MgdG8gY29tcHV0ZSB0aGUgZygpIGZ1bmN0aW9uIGluIHRoZSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uCisgKiByb3VuZHMuICBHMSBpcyB0aGUgc3RyYWlnaHQgZygpIGZ1bmN0aW9uOyBHMiBpbmNsdWRlcyB0aGUgOC1iaXQKKyAqIHJvdGF0aW9uIGZvciB0aGUgaGlnaCAzMi1iaXQgd29yZC4gKi8KKworI2RlZmluZSBHMShhKSBcCisgICAgIChjdHgtPnNbMF1bKGEpICYgMHhGRl0pIF4gKGN0eC0+c1sxXVsoKGEpID4+IDgpICYgMHhGRl0pIFwKKyAgIF4gKGN0eC0+c1syXVsoKGEpID4+IDE2KSAmIDB4RkZdKSBeIChjdHgtPnNbM11bKGEpID4+IDI0XSkKKworI2RlZmluZSBHMihiKSBcCisgICAgIChjdHgtPnNbMV1bKGIpICYgMHhGRl0pIF4gKGN0eC0+c1syXVsoKGIpID4+IDgpICYgMHhGRl0pIFwKKyAgIF4gKGN0eC0+c1szXVsoKGIpID4+IDE2KSAmIDB4RkZdKSBeIChjdHgtPnNbMF1bKGIpID4+IDI0XSkKKworLyogRW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBGZWlzdGVsIHJvdW5kcy4gIEVhY2ggb25lIGNhbGxzIHRoZSB0d28gZygpCisgKiBtYWNyb3MsIGRvZXMgdGhlIFBIVCwgYW5kIHBlcmZvcm1zIHRoZSBYT1IgYW5kIHRoZSBhcHByb3ByaWF0ZSBiaXQKKyAqIHJvdGF0aW9ucy4gIFRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgcm91bmQgbnVtYmVyICh1c2VkIHRvIHNlbGVjdCBzdWJrZXlzKSwKKyAqIGFuZCB0aGUgZm91ciAzMi1iaXQgY2h1bmtzIG9mIHRoZSB0ZXh0LiAqLworCisjZGVmaW5lIEVOQ1JPVU5EKG4sIGEsIGIsIGMsIGQpIFwKKyAgIHggPSBHMSAoYSk7IHkgPSBHMiAoYik7IFwKKyAgIHggKz0geTsgeSArPSB4ICsgY3R4LT5rWzIgKiAobikgKyAxXTsgXAorICAgKGMpIF49IHggKyBjdHgtPmtbMiAqIChuKV07IFwKKyAgIChjKSA9IHJvcjMyKChjKSwgMSk7IFwKKyAgIChkKSA9IHJvbDMyKChkKSwgMSkgXiB5CisKKyNkZWZpbmUgREVDUk9VTkQobiwgYSwgYiwgYywgZCkgXAorICAgeCA9IEcxIChhKTsgeSA9IEcyIChiKTsgXAorICAgeCArPSB5OyB5ICs9IHg7IFwKKyAgIChkKSBePSB5ICsgY3R4LT5rWzIgKiAobikgKyAxXTsgXAorICAgKGQpID0gcm9yMzIoKGQpLCAxKTsgXAorICAgKGMpID0gcm9sMzIoKGMpLCAxKTsgXAorICAgKGMpIF49ICh4ICsgY3R4LT5rWzIgKiAobildKQorCisvKiBFbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGN5Y2xlczsgZWFjaCBvbmUgaXMgc2ltcGx5IHR3byBGZWlzdGVsIHJvdW5kcworICogd2l0aCB0aGUgMzItYml0IGNodW5rcyByZS1vcmRlcmVkIHRvIHNpbXVsYXRlIHRoZSAic3dhcCIgKi8KKworI2RlZmluZSBFTkNDWUNMRShuKSBcCisgICBFTkNST1VORCAoMiAqIChuKSwgYSwgYiwgYywgZCk7IFwKKyAgIEVOQ1JPVU5EICgyICogKG4pICsgMSwgYywgZCwgYSwgYikKKworI2RlZmluZSBERUNDWUNMRShuKSBcCisgICBERUNST1VORCAoMiAqIChuKSArIDEsIGMsIGQsIGEsIGIpOyBcCisgICBERUNST1VORCAoMiAqIChuKSwgYSwgYiwgYywgZCkKKworLyogTWFjcm9zIHRvIGNvbnZlcnQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnl0ZXMgaW50byAzMi1iaXQgd29yZHMsCisgKiBhbmQgc2ltdWx0YW5lb3VzbHkgcGVyZm9ybSB0aGUgd2hpdGVuaW5nIHN0ZXAuICBJTlBBQ0sgcGFja3Mgd29yZAorICogbnVtYmVyIG4gaW50byB0aGUgdmFyaWFibGUgbmFtZWQgYnkgeCwgdXNpbmcgd2hpdGVuaW5nIHN1YmtleSBudW1iZXIgbS4KKyAqIE9VVFVOUEFDSyB1bnBhY2tzIHdvcmQgbnVtYmVyIG4gZnJvbSB0aGUgdmFyaWFibGUgbmFtZWQgYnkgeCwgdXNpbmcKKyAqIHdoaXRlbmluZyBzdWJrZXkgbnVtYmVyIG0uICovCisKKyNkZWZpbmUgSU5QQUNLKG4sIHgsIG0pIFwKKyAgIHggPSBsZTMyX3RvX2NwdShzcmNbbl0pIF4gY3R4LT53W21dCisKKyNkZWZpbmUgT1VUVU5QQUNLKG4sIHgsIG0pIFwKKyAgIHggXj0gY3R4LT53W21dOyBcCisgICBkc3Rbbl0gPSBjcHVfdG9fbGUzMih4KQorCisKKworLyogRW5jcnlwdCBvbmUgYmxvY2suICBpbiBhbmQgb3V0IG1heSBiZSB0aGUgc2FtZS4gKi8KK3N0YXRpYyB2b2lkIHR3b2Zpc2hfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWNvbnN0IF9fbGUzMiAqc3JjID0gKGNvbnN0IF9fbGUzMiAqKWluOworCV9fbGUzMiAqZHN0ID0gKF9fbGUzMiAqKW91dDsKKworCS8qIFRoZSBmb3VyIDMyLWJpdCBjaHVua3Mgb2YgdGhlIHRleHQuICovCisJdTMyIGEsIGIsIGMsIGQ7CisJCisJLyogVGVtcG9yYXJpZXMgdXNlZCBieSB0aGUgcm91bmQgZnVuY3Rpb24uICovCisJdTMyIHgsIHk7CisKKwkvKiBJbnB1dCB3aGl0ZW5pbmcgYW5kIHBhY2tpbmcuICovCisJSU5QQUNLICgwLCBhLCAwKTsKKwlJTlBBQ0sgKDEsIGIsIDEpOworCUlOUEFDSyAoMiwgYywgMik7CisJSU5QQUNLICgzLCBkLCAzKTsKKwkKKwkvKiBFbmNyeXB0aW9uIEZlaXN0ZWwgY3ljbGVzLiAqLworCUVOQ0NZQ0xFICgwKTsKKwlFTkNDWUNMRSAoMSk7CisJRU5DQ1lDTEUgKDIpOworCUVOQ0NZQ0xFICgzKTsKKwlFTkNDWUNMRSAoNCk7CisJRU5DQ1lDTEUgKDUpOworCUVOQ0NZQ0xFICg2KTsKKwlFTkNDWUNMRSAoNyk7CisJCisJLyogT3V0cHV0IHdoaXRlbmluZyBhbmQgdW5wYWNraW5nLiAqLworCU9VVFVOUEFDSyAoMCwgYywgNCk7CisJT1VUVU5QQUNLICgxLCBkLCA1KTsKKwlPVVRVTlBBQ0sgKDIsIGEsIDYpOworCU9VVFVOUEFDSyAoMywgYiwgNyk7CisJCit9CisKKy8qIERlY3J5cHQgb25lIGJsb2NrLiAgaW4gYW5kIG91dCBtYXkgYmUgdGhlIHNhbWUuICovCitzdGF0aWMgdm9pZCB0d29maXNoX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQoreworCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljb25zdCBfX2xlMzIgKnNyYyA9IChjb25zdCBfX2xlMzIgKilpbjsKKwlfX2xlMzIgKmRzdCA9IChfX2xlMzIgKilvdXQ7CisgIAorCS8qIFRoZSBmb3VyIDMyLWJpdCBjaHVua3Mgb2YgdGhlIHRleHQuICovCisJdTMyIGEsIGIsIGMsIGQ7CisJCisJLyogVGVtcG9yYXJpZXMgdXNlZCBieSB0aGUgcm91bmQgZnVuY3Rpb24uICovCisJdTMyIHgsIHk7CisJCisJLyogSW5wdXQgd2hpdGVuaW5nIGFuZCBwYWNraW5nLiAqLworCUlOUEFDSyAoMCwgYywgNCk7CisJSU5QQUNLICgxLCBkLCA1KTsKKwlJTlBBQ0sgKDIsIGEsIDYpOworCUlOUEFDSyAoMywgYiwgNyk7CisJCisJLyogRW5jcnlwdGlvbiBGZWlzdGVsIGN5Y2xlcy4gKi8KKwlERUNDWUNMRSAoNyk7CisJREVDQ1lDTEUgKDYpOworCURFQ0NZQ0xFICg1KTsKKwlERUNDWUNMRSAoNCk7CisJREVDQ1lDTEUgKDMpOworCURFQ0NZQ0xFICgyKTsKKwlERUNDWUNMRSAoMSk7CisJREVDQ1lDTEUgKDApOworCisJLyogT3V0cHV0IHdoaXRlbmluZyBhbmQgdW5wYWNraW5nLiAqLworCU9VVFVOUEFDSyAoMCwgYSwgMCk7CisJT1VUVU5QQUNLICgxLCBiLCAxKTsKKwlPVVRVTlBBQ0sgKDIsIGMsIDIpOworCU9VVFVOUEFDSyAoMywgZCwgMyk7CisKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFsZyA9IHsKKwkuY3JhX25hbWUgICAgICAgICAgID0gICAidHdvZmlzaCIsCisJLmNyYV9kcml2ZXJfbmFtZSAgICA9ICAgInR3b2Zpc2gtZ2VuZXJpYyIsCisJLmNyYV9wcmlvcml0eSAgICAgICA9ICAgMTAwLAorCS5jcmFfZmxhZ3MgICAgICAgICAgPSAgIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUgICAgICA9ICAgVEZfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUgICAgICAgID0gICBzaXplb2Yoc3RydWN0IHR3b2Zpc2hfY3R4KSwKKwkuY3JhX2FsaWdubWFzayAgICAgID0JMywKKwkuY3JhX21vZHVsZSAgICAgICAgID0gICBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QgICAgICAgICAgID0gICBMSVNUX0hFQURfSU5JVChhbGcuY3JhX2xpc3QpLAorCS5jcmFfdSAgICAgICAgICAgICAgPSAgIHsgLmNpcGhlciA9IHsKKwkuY2lhX21pbl9rZXlzaXplICAgID0gICBURl9NSU5fS0VZX1NJWkUsCisJLmNpYV9tYXhfa2V5c2l6ZSAgICA9ICAgVEZfTUFYX0tFWV9TSVpFLAorCS5jaWFfc2V0a2V5ICAgICAgICAgPSAgIHR3b2Zpc2hfc2V0a2V5LAorCS5jaWFfZW5jcnlwdCAgICAgICAgPSAgIHR3b2Zpc2hfZW5jcnlwdCwKKwkuY2lhX2RlY3J5cHQgICAgICAgID0gICB0d29maXNoX2RlY3J5cHQgfSB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCB0d29maXNoX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFsZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0d29maXNoX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhbGcpOworfQorCittb2R1bGVfaW5pdCh0d29maXNoX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHR3b2Zpc2hfbW9kX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJUd29maXNoIENpcGhlciBBbGdvcml0aG0iKTsKK01PRFVMRV9BTElBUygidHdvZmlzaCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3h0cy5jIGIvY3J5cHRvL3h0cy5jCmluZGV4IGQ4N2IwZjMuLjU1NWVjYWEgMTAwNjQ0Ci0tLSBhL2NyeXB0by94dHMuYworKysgYi9jcnlwdG8veHRzLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCWFsZyA9IGNyeXB0b19nZXRfYXR0cl9hbGcodGIsIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7CiAJaWYgKElTX0VSUihhbGcpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworCQlyZXR1cm4gRVJSX0NBU1QoYWxnKTsKIAogCWluc3QgPSBjcnlwdG9fYWxsb2NfaW5zdGFuY2UoInh0cyIsIGFsZyk7CiAJaWYgKElTX0VSUihpbnN0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggNzQ2NDExNS4uMDhlMDE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTEwNCw2ICsxMDQsMjQgQEAKIAloZWxwCiAJICBTYXkgTiB0byBkaXNhYmxlIHBvd2VyIC9zeXMgaW50ZXJmYWNlCiAKK2NvbmZpZyBBQ1BJX0VDX0RFQlVHRlMKKwl0cmlzdGF0ZSAiRUMgcmVhZC93cml0ZSBhY2Nlc3MgdGhyb3VnaCAvc3lzL2tlcm5lbC9kZWJ1Zy9lYyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgTiB0byBkaXNhYmxlIEVtYmVkZGVkIENvbnRyb2xsZXIgL3N5cy9rZXJuZWwvZGVidWcgaW50ZXJmYWNlCisKKwkgIEJlIGF3YXJlIHRoYXQgdXNpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGNvbmZ1c2UgeW91ciBFbWJlZGRlZAorCSAgQ29udHJvbGxlciBpbiBhIHdheSB0aGF0IGEgbm9ybWFsIHJlYm9vdCBpcyBub3QgZW5vdWdoLiBZb3UgdGhlbgorCSAgaGF2ZSB0byBwb3dlciBvZiB5b3VyIHN5c3RlbSwgYW5kIHJlbW92ZSB0aGUgbGFwdG9wIGJhdHRlcnkgZm9yCisJICBzb21lIHNlY29uZHMuCisJICBBbiBFbWJlZGRlZCBDb250cm9sbGVyIHR5cGljYWxseSBpcyBhdmFpbGFibGUgb24gbGFwdG9wcyBhbmQgcmVhZHMKKwkgIHNlbnNvciB2YWx1ZXMgbGlrZSBiYXR0ZXJ5IHN0YXRlIGFuZCB0ZW1wZXJhdHVyZS4KKwkgIFRoZSBrZXJuZWwgYWNjZXNzZXMgdGhlIEVDIHRocm91Z2ggQUNQSSBwYXJzZWQgY29kZSBwcm92aWRlZCBieSBCSU9TCisJICB0YWJsZXMuIFRoaXMgb3B0aW9uIGFsbG93cyB0byBhY2Nlc3MgdGhlIEVDIGRpcmVjdGx5IHdpdGhvdXQgQUNQSQorCSAgY29kZSBiZWluZyBpbnZvbHZlZC4KKwkgIFRodXMgdGhpcyBvcHRpb24gaXMgYSBkZWJ1ZyBvcHRpb24gdGhhdCBoZWxwcyB0byB3cml0ZSBBQ1BJIGRyaXZlcnMKKwkgIGFuZCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBBQ1BJIGNvZGUgb3IgRUMgZmlybXdhcmUgYnVncy4KKwogY29uZmlnIEFDUElfUFJPQ19FVkVOVAogCWJvb2wgIkRlcHJlY2F0ZWQgL3Byb2MvYWNwaS9ldmVudCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUFJPQ19GUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IDZlZTMzMTYuLjgzM2I1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTYwLDYgKzYwLDcgQEAKIG9iai0kKENPTkZJR19BQ1BJX1NCUykJCSs9IHNicy5vCiBvYmotJChDT05GSUdfQUNQSV9QT1dFUl9NRVRFUikJKz0gcG93ZXJfbWV0ZXIubwogb2JqLSQoQ09ORklHX0FDUElfSEVEKQkJKz0gaGVkLm8KK29iai0kKENPTkZJR19BQ1BJX0VDX0RFQlVHRlMpCSs9IGVjX3N5cy5vCiAKICMgcHJvY2Vzc29yIGhhcyBpdHMgb3duICJwcm9jZXNzb3IuIiBtb2R1bGVfcGFyYW0gbmFtZXNwYWNlCiBwcm9jZXNzb3IteQkJCTo9IHByb2Nlc3Nvcl9kcml2ZXIubyBwcm9jZXNzb3JfdGhyb3R0bGluZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IDVmMjAyN2QuLjFmYTBhYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0zNCw4ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTQ1LDEwICs0MywxMyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCiAjZGVmaW5lIEFDUElfRUNfQ0xBU1MJCQkiZW1iZWRkZWRfY29udHJvbGxlciIKICNkZWZpbmUgQUNQSV9FQ19ERVZJQ0VfTkFNRQkJIkVtYmVkZGVkIENvbnRyb2xsZXIiCiAjZGVmaW5lIEFDUElfRUNfRklMRV9JTkZPCQkiaW5mbyIKIAorI3VuZGVmIFBSRUZJWAogI2RlZmluZSBQUkVGSVgJCQkJIkFDUEk6IEVDOiAiCiAKIC8qIEVDIHN0YXR1cyByZWdpc3RlciAqLwpAQCAtMTA2LDE5ICsxMDcsOCBAQAogCWJvb2wgZG9uZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9lYyB7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotCXVuc2lnbmVkIGxvbmcgZ3BlOwotCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9hZGRyOwotCXVuc2lnbmVkIGxvbmcgZGF0YV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdHJhbnNhY3Rpb24gKmN1cnI7Ci0Jc3BpbmxvY2tfdCBjdXJyX2xvY2s7Ci19ICpib290X2VjLCAqZmlyc3RfZWM7CitzdHJ1Y3QgYWNwaV9lYyAqYm9vdF9lYywgKmZpcnN0X2VjOworRVhQT1JUX1NZTUJPTChmaXJzdF9lYyk7CiAKIHN0YXRpYyBpbnQgRUNfRkxBR1NfTVNJOyAvKiBPdXQtb2Ytc3BlYyBNU0kgY29udHJvbGxlciAqLwogc3RhdGljIGludCBFQ19GTEFHU19WQUxJREFURV9FQ0RUOyAvKiBBU1VTdGVjIEVDRFRzIG5lZWQgdG8gYmUgdmFsaWRhdGVkICovCkBAIC02NzksNzIgKzY2OSw2IEBACiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9lY19kaXI7Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19yZWFkX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBzZXEtPnByaXZhdGU7Ci0KLQlpZiAoIWVjKQotCQlnb3RvIGVuZDsKLQotCXNlcV9wcmludGYoc2VxLCAiZ3BlOlx0XHRcdDB4JTAyeFxuIiwgKHUzMikgZWMtPmdwZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJwb3J0czpcdFx0XHQweCUwMngsIDB4JTAyeFxuIiwKLQkJICAgKHVuc2lnbmVkKWVjLT5jb21tYW5kX2FkZHIsICh1bnNpZ25lZCllYy0+ZGF0YV9hZGRyKTsKLQlzZXFfcHJpbnRmKHNlcSwgInVzZSBnbG9iYWwgbG9jazpcdCVzXG4iLAotCQkgICBlYy0+Z2xvYmFsX2xvY2sgPyAieWVzIiA6ICJubyIpOwotICAgICAgZW5kOgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjcGlfZWNfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhY3BpX2VjX3JlYWRfaW5mbywgUERFKGlub2RlKS0+ZGF0YSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfZWNfaW5mb19vcHMgPSB7Ci0JLm9wZW4gPSBhY3BpX2VjX2luZm9fb3Blbl9mcywKLQkucmVhZCA9IHNlcV9yZWFkLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0KLQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7Ci0JCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCQkJCSAgICAgYWNwaV9lY19kaXIpOwotCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JZW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKEFDUElfRUNfRklMRV9JTkZPLCBTX0lSVUdPLAotCQkJCSBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSwKLQkJCQkgJmFjcGlfZWNfaW5mb19vcHMsIGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0KLQlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9FQ19GSUxFX0lORk8sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIGFjcGlfZWNfZGlyKTsKLQkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBOVUxMOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgYWNwaV9zdGF0dXMKQEAgLTg5NCw3ICs4MTgsMTIgQEAKIAlpZiAoIWZpcnN0X2VjKQogCQlmaXJzdF9lYyA9IGVjOwogCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBlYzsKLQlhY3BpX2VjX2FkZF9mcyhkZXZpY2UpOworCisJV0FSTighcmVxdWVzdF9yZWdpb24oZWMtPmRhdGFfYWRkciwgMSwgIkVDIGRhdGEiKSwKKwkgICAgICJDb3VsZCBub3QgcmVxdWVzdCBFQyBkYXRhIGlvIHBvcnQgMHglbHgiLCBlYy0+ZGF0YV9hZGRyKTsKKwlXQVJOKCFyZXF1ZXN0X3JlZ2lvbihlYy0+Y29tbWFuZF9hZGRyLCAxLCAiRUMgY21kIiksCisJICAgICAiQ291bGQgbm90IHJlcXVlc3QgRUMgY21kIGlvIHBvcnQgMHglbHgiLCBlYy0+Y29tbWFuZF9hZGRyKTsKKwogCXByX2luZm8oUFJFRklYICJHUEUgPSAweCVseCwgSS9POiBjb21tYW5kL3N0YXR1cyA9IDB4JWx4LCBkYXRhID0gMHglbHhcbiIsCiAJCQkgIGVjLT5ncGUsIGVjLT5jb21tYW5kX2FkZHIsIGVjLT5kYXRhX2FkZHIpOwogCkBAIC05MjEsNyArODUwLDggQEAKIAkJa2ZyZWUoaGFuZGxlcik7CiAJfQogCW11dGV4X3VubG9jaygmZWMtPmxvY2spOwotCWFjcGlfZWNfcmVtb3ZlX2ZzKGRldmljZSk7CisJcmVsZWFzZV9yZWdpb24oZWMtPmRhdGFfYWRkciwgMSk7CisJcmVsZWFzZV9yZWdpb24oZWMtPmNvbW1hbmRfYWRkciwgMSk7CiAJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CiAJaWYgKGVjID09IGZpcnN0X2VjKQogCQlmaXJzdF9lYyA9IE5VTEw7CkBAIC0xMTIwLDE2ICsxMDUwLDEwIEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlhY3BpX2VjX2RpciA9IHByb2NfbWtkaXIoQUNQSV9FQ19DTEFTUywgYWNwaV9yb290X2Rpcik7Ci0JaWYgKCFhY3BpX2VjX2RpcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAkvKiBOb3cgcmVnaXN0ZXIgdGhlIGRyaXZlciBmb3IgdGhlIEVDICovCiAJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2VjX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9FQ19DTEFTUywgYWNwaV9yb290X2Rpcik7CisJaWYgKHJlc3VsdCA8IDApCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMTQwLDkgKzEwNjQsNiBAQAogewogCiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZWNfZHJpdmVyKTsKLQotCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfRUNfQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwotCiAJcmV0dXJuOwogfQogI2VuZGlmCS8qIDAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lY19zeXMuYyBiL2RyaXZlcnMvYWNwaS9lY19zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg2OWIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2VjX3N5cy5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogZWNfc3lzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU1VTRSBQcm9kdWN0cyBHbWJIL05vdmVsbAorICogQXV0aG9yOgorICogICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIEVDIHN5c2ZzIGFjY2VzcyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGJvb2wgd3JpdGVfc3VwcG9ydDsKK21vZHVsZV9wYXJhbSh3cml0ZV9zdXBwb3J0LCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod3JpdGVfc3VwcG9ydCwgIkRhbmdlcm91cywgcmVib290IGFuZCByZW1vdmFsIG9mIGJhdHRlcnkgbWF5ICIKKwkJICJiZSBuZWVkZWQuIik7CisKKyNkZWZpbmUgRUNfU1BBQ0VfU0laRSAyNTYKKworc3RydWN0IHN5c2Rldl9jbGFzcyBhY3BpX2VjX3N5c2Rldl9jbGFzcyA9IHsKKwkubmFtZSA9ICJlYyIsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWNwaV9lY19kZWJ1Z2ZzX2RpcjsKKworc3RhdGljIGludCBhY3BpX2VjX29wZW5faW8oc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlmLT5wcml2YXRlX2RhdGEgPSBpLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFjcGlfZWNfcmVhZF9pbyhzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCS8qIFVzZSB0aGlzIGlmIHN1cHBvcnQgcmVhZGluZy93cml0aW5nIG11bHRpcGxlIEVDcyBleGlzdHMgaW4gZWMuYzoKKwkgKiBzdHJ1Y3QgYWNwaV9lYyAqZWMgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWYtPnByaXZhdGVfZGF0YSktPnByaXZhdGU7CisJICovCisJdW5zaWduZWQgaW50IHNpemUgPSBFQ19TUEFDRV9TSVpFOworCXU4ICpkYXRhID0gKHU4ICopIGJ1ZjsKKwlsb2ZmX3QgaW5pdF9vZmYgPSAqb2ZmOworCWludCBlcnIgPSAwOworCisJaWYgKCpvZmYgPj0gc2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKCpvZmYgKyBjb3VudCA+PSBzaXplKSB7CisJCXNpemUgLT0gKm9mZjsKKwkJY291bnQgPSBzaXplOworCX0gZWxzZQorCQlzaXplID0gY291bnQ7CisKKwl3aGlsZSAoc2l6ZSkgeworCQllcnIgPSBlY19yZWFkKCpvZmYsICZkYXRhWypvZmYgLSBpbml0X29mZl0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJKm9mZiArPSAxOworCQlzaXplLS07CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYWNwaV9lY193cml0ZV9pbyhzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCS8qIFVzZSB0aGlzIGlmIHN1cHBvcnQgcmVhZGluZy93cml0aW5nIG11bHRpcGxlIEVDcyBleGlzdHMgaW4gZWMuYzoKKwkgKiBzdHJ1Y3QgYWNwaV9lYyAqZWMgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWYtPnByaXZhdGVfZGF0YSktPnByaXZhdGU7CisJICovCisKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGNvdW50OworCWxvZmZfdCBpbml0X29mZiA9ICpvZmY7CisJdTggKmRhdGEgPSAodTggKikgYnVmOworCWludCBlcnIgPSAwOworCisJaWYgKCpvZmYgPj0gRUNfU1BBQ0VfU0laRSkKKwkJcmV0dXJuIDA7CisJaWYgKCpvZmYgKyBjb3VudCA+PSBFQ19TUEFDRV9TSVpFKSB7CisJCXNpemUgPSBFQ19TUEFDRV9TSVpFIC0gKm9mZjsKKwkJY291bnQgPSBzaXplOworCX0KKworCXdoaWxlIChzaXplKSB7CisJCXU4IGJ5dGVfd3JpdGUgPSBkYXRhWypvZmYgLSBpbml0X29mZl07CisJCWVyciA9IGVjX3dyaXRlKCpvZmYsIGJ5dGVfd3JpdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQkqb2ZmICs9IDE7CisJCXNpemUtLTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2VjX2lvX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgPSBhY3BpX2VjX29wZW5faW8sCisJLnJlYWQgID0gYWNwaV9lY19yZWFkX2lvLAorCS53cml0ZSA9IGFjcGlfZWNfd3JpdGVfaW8sCit9OworCitpbnQgYWNwaV9lY19hZGRfZGVidWdmcyhzdHJ1Y3QgYWNwaV9lYyAqZWMsIHVuc2lnbmVkIGludCBlY19kZXZpY2VfY291bnQpCit7CisJc3RydWN0IGRlbnRyeSAqZGV2X2RpcjsKKwljaGFyIG5hbWVbNjRdOworCW1vZGVfdCBtb2RlID0gMDQwMDsKKworCWlmIChlY19kZXZpY2VfY291bnQgPT0gMCkgeworCQlhY3BpX2VjX2RlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJlYyIsIE5VTEwpOworCQlpZiAoIWFjcGlfZWNfZGVidWdmc19kaXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcHJpbnRmKG5hbWUsICJlYyV1IiwgZWNfZGV2aWNlX2NvdW50KTsKKwlkZXZfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIGFjcGlfZWNfZGVidWdmc19kaXIpOworCWlmICghZGV2X2RpcikgeworCQlpZiAoZWNfZGV2aWNlX2NvdW50ICE9IDApCisJCQlnb3RvIGVycm9yOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX3gzMigiZ3BlIiwgMDQ0NCwgZGV2X2RpciwgKHUzMiAqKSZmaXJzdF9lYy0+Z3BlKSkKKwkJZ290byBlcnJvcjsKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woInVzZV9nbG9iYWxfbG9jayIsIDA0NDQsIGRldl9kaXIsCisJCQkJICh1MzIgKikmZmlyc3RfZWMtPmdsb2JhbF9sb2NrKSkKKwkJZ290byBlcnJvcjsKKworCWlmICh3cml0ZV9zdXBwb3J0KQorCQltb2RlID0gMDYwMDsKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoImlvIiwgbW9kZSwgZGV2X2RpciwgZWMsICZhY3BpX2VjX2lvX29wcykpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGFjcGlfZWNfZGVidWdmc19kaXIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX3N5c19pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDA7CisJaWYgKGZpcnN0X2VjKQorCQllcnIgPSBhY3BpX2VjX2FkZF9kZWJ1Z2ZzKGZpcnN0X2VjLCAwKTsKKwllbHNlCisJCWVyciA9IC1FTk9ERVY7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjcGlfZWNfc3lzX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYWNwaV9lY19kZWJ1Z2ZzX2Rpcik7Cit9CisKK21vZHVsZV9pbml0KGFjcGlfZWNfc3lzX2luaXQpOworbW9kdWxlX2V4aXQoYWNwaV9lY19zeXNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaCBiL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCmluZGV4IGY4ZjE5MGUuLjhhZTI3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCkBAIC0xOCw2ICsxOCwxMSBAQAogICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICAqLwogCisjaWZuZGVmIF9BQ1BJX0lOVEVSTkFMX0hfCisjZGVmaW5lIF9BQ1BJX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKwogI2RlZmluZSBQUkVGSVggIkFDUEk6ICIKIAogaW50IGluaXRfYWNwaV9kZXZpY2Vfbm90aWZ5KHZvaWQpOwpAQCAtNDYsNiArNTEsMjMgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWQgQ29udHJvbGxlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0cnVjdCBhY3BpX2VjIHsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBncGU7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX2FkZHI7CisJdW5zaWduZWQgbG9uZyBkYXRhX2FkZHI7CisJdW5zaWduZWQgbG9uZyBnbG9iYWxfbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtdXRleCBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0cmFuc2FjdGlvbiAqY3VycjsKKwlzcGlubG9ja190IGN1cnJfbG9jazsKKwlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7Cit9OworCitleHRlcm4gc3RydWN0IGFjcGlfZWMgKmZpcnN0X2VjOworCiBpbnQgYWNwaV9lY19pbml0KHZvaWQpOwogaW50IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKTsKIGludCBhY3BpX2Jvb3RfZWNfZW5hYmxlKHZvaWQpOwpAQCAtNjMsMyArODUsNSBAQAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGFjcGlfc2xlZXBfcHJvY19pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgorCisjZW5kaWYgLyogX0FDUElfSU5URVJOQUxfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggNGVhYzU5My4uMWY2NzA1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgpAQCAtNTQzLDYgKzU0NCwxNCBAQAogCWlmIChmbGFncyAhPSBiYXNlX2ZsYWdzKQogCQlhY3BpX3BjaV9vc2Nfc3VwcG9ydChyb290LCBmbGFncyk7CiAKKwlzdGF0dXMgPSBhY3BpX3BjaV9vc2NfY29udHJvbF9zZXQocm9vdC0+ZGV2aWNlLT5oYW5kbGUsCisJCQkJCSAgT1NDX1BDSV9FWFBSRVNTX0NBUF9TVFJVQ1RVUkVfQ09OVFJPTCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVW5hYmxlIHRvIGFzc3VtZSBQQ0llIGNvbnRyb2w6IERpc2FibGluZyBBU1BNXG4iKTsKKwkJcGNpZV9ub19hc3BtKCk7CisJfQorCiAJcGNpX2FjcGlfYWRkX2J1c19wbV9ub3RpZmllcihkZXZpY2UsIHJvb3QtPmJ1cyk7CiAJaWYgKGRldmljZS0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKQogCQlkZXZpY2Vfc2V0X3J1bl93YWtlKHJvb3QtPmJ1cy0+YnJpZGdlLCB0cnVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggMjk0ZTEwYi4uYjRjMmYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogCWlmIChjcHVfaGFzKCZjcHVfZGF0YShwci0+aWQpLCBYODZfRkVBVFVSRV9BUkFUKSkKIAkJcmV0dXJuOwogCi0JaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BTURDMUUpKQorCWlmIChjMWVfZGV0ZWN0ZWQpCiAJCXR5cGUgPSBBQ1BJX1NUQVRFX0MxOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9idXMuYyBiL2RyaXZlcnMvYW1iYS9idXMuYwppbmRleCBmNjBiMmI2Li5kMzE1OTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FtYmEvYnVzLmMKKysrIGIvZHJpdmVycy9hbWJhL2J1cy5jCkBAIC0xMjIsNiArMTIyLDMxIEBACiAKIHBvc3Rjb3JlX2luaXRjYWxsKGFtYmFfaW5pdCk7CiAKK3N0YXRpYyBpbnQgYW1iYV9nZXRfZW5hYmxlX3BjbGsoc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldikKK3sKKwlzdHJ1Y3QgY2xrICpwY2xrID0gY2xrX2dldCgmcGNkZXYtPmRldiwgImFwYl9wY2xrIik7CisJaW50IHJldDsKKworCXBjZGV2LT5wY2xrID0gcGNsazsKKworCWlmIChJU19FUlIocGNsaykpCisJCXJldHVybiBQVFJfRVJSKHBjbGspOworCisJcmV0ID0gY2xrX2VuYWJsZShwY2xrKTsKKwlpZiAocmV0KQorCQljbGtfcHV0KHBjbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYW1iYV9wdXRfZGlzYWJsZV9wY2xrKHN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYpCit7CisJc3RydWN0IGNsayAqcGNsayA9IHBjZGV2LT5wY2xrOworCisJY2xrX2Rpc2FibGUocGNsayk7CisJY2xrX3B1dChwY2xrKTsKK30KKwogLyoKICAqIFRoZXNlIGFyZSB0aGUgZGV2aWNlIG1vZGVsIGNvbnZlcnNpb24gdmVuZWVyczsgdGhleSBjb252ZXJ0IHRoZQogICogZGV2aWNlIG1vZGVsIHN0cnVjdHVyZXMgdG8gb3VyIG1vcmUgc3BlY2lmaWMgc3RydWN0dXJlcy4KQEAgLTEzMCwxNyArMTU1LDMzIEBACiB7CiAJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CiAJc3RydWN0IGFtYmFfZHJpdmVyICpwY2RydiA9IHRvX2FtYmFfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlzdHJ1Y3QgYW1iYV9pZCAqaWQ7CisJc3RydWN0IGFtYmFfaWQgKmlkID0gYW1iYV9sb29rdXAocGNkcnYtPmlkX3RhYmxlLCBwY2Rldik7CisJaW50IHJldDsKIAotCWlkID0gYW1iYV9sb29rdXAocGNkcnYtPmlkX3RhYmxlLCBwY2Rldik7CisJZG8geworCQlyZXQgPSBhbWJhX2dldF9lbmFibGVfcGNsayhwY2Rldik7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAotCXJldHVybiBwY2Rydi0+cHJvYmUocGNkZXYsIGlkKTsKKwkJcmV0ID0gcGNkcnYtPnByb2JlKHBjZGV2LCBpZCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCWJyZWFrOworCisJCWFtYmFfcHV0X2Rpc2FibGVfcGNsayhwY2Rldik7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFtYmFfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKnBjZGV2ID0gdG9fYW1iYV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgYW1iYV9kcml2ZXIgKmRydiA9IHRvX2FtYmFfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlyZXR1cm4gZHJ2LT5yZW1vdmUodG9fYW1iYV9kZXZpY2UoZGV2KSk7CisJaW50IHJldCA9IGRydi0+cmVtb3ZlKHBjZGV2KTsKKworCWFtYmFfcHV0X2Rpc2FibGVfcGNsayhwY2Rldik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhbWJhX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTIwMyw3ICsyNDQsNiBAQAogICovCiBpbnQgYW1iYV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50KQogewotCXUzMiBwaWQsIGNpZDsKIAl1MzIgc2l6ZTsKIAl2b2lkIF9faW9tZW0gKnRtcDsKIAlpbnQgaSwgcmV0OwpAQCAtMjQxLDI0ICsyODEsMzQgQEAKIAkJZ290byBlcnJfcmVsZWFzZTsKIAl9CiAKLQkvKgotCSAqIFJlYWQgcGlkIGFuZCBjaWQgYmFzZWQgb24gc2l6ZSBvZiByZXNvdXJjZQotCSAqIHRoZXkgYXJlIGxvY2F0ZWQgYXQgZW5kIG9mIHJlZ2lvbgotCSAqLwotCWZvciAocGlkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCi0JCXBpZCB8PSAocmVhZGwodG1wICsgc2l6ZSAtIDB4MjAgKyA0ICogaSkgJiAyNTUpIDw8IChpICogOCk7Ci0JZm9yIChjaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKLQkJY2lkIHw9IChyZWFkbCh0bXAgKyBzaXplIC0gMHgxMCArIDQgKiBpKSAmIDI1NSkgPDwgKGkgKiA4KTsKKwlyZXQgPSBhbWJhX2dldF9lbmFibGVfcGNsayhkZXYpOworCWlmIChyZXQgPT0gMCkgeworCQl1MzIgcGlkLCBjaWQ7CisKKwkJLyoKKwkJICogUmVhZCBwaWQgYW5kIGNpZCBiYXNlZCBvbiBzaXplIG9mIHJlc291cmNlCisJCSAqIHRoZXkgYXJlIGxvY2F0ZWQgYXQgZW5kIG9mIHJlZ2lvbgorCQkgKi8KKwkJZm9yIChwaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXBpZCB8PSAocmVhZGwodG1wICsgc2l6ZSAtIDB4MjAgKyA0ICogaSkgJiAyNTUpIDw8CisJCQkJKGkgKiA4KTsKKwkJZm9yIChjaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWNpZCB8PSAocmVhZGwodG1wICsgc2l6ZSAtIDB4MTAgKyA0ICogaSkgJiAyNTUpIDw8CisJCQkJKGkgKiA4KTsKKworCQlhbWJhX3B1dF9kaXNhYmxlX3BjbGsoZGV2KTsKKworCQlpZiAoY2lkID09IDB4YjEwNWYwMGQpCisJCQlkZXYtPnBlcmlwaGlkID0gcGlkOworCisJCWlmICghZGV2LT5wZXJpcGhpZCkKKwkJCXJldCA9IC1FTk9ERVY7CisJfQogCiAJaW91bm1hcCh0bXApOwogCi0JaWYgKGNpZCA9PSAweGIxMDVmMDBkKQotCQlkZXYtPnBlcmlwaGlkID0gcGlkOwotCi0JaWYgKCFkZXYtPnBlcmlwaGlkKSB7Ci0JCXJldCA9IC1FTk9ERVY7CisJaWYgKHJldCkKIAkJZ290byBlcnJfcmVsZWFzZTsKLQl9CiAKIAlyZXQgPSBkZXZpY2VfYWRkKCZkZXYtPmRldik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IGFhODVhOTguLjhmYWU2YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtMTg3LDYgKzE4NywxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU0FUQV9EV0MKKwl0cmlzdGF0ZSAiRGVzaWduV2FyZSBDb3JlcyBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiA0NjBFWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIG9uLWNoaXAgU0FUQSBjb250cm9sbGVyIG9mIHRoZQorCSAgQXBwbGllZE1pY3JvIHByb2Nlc3NvciA0NjBFWC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNBVEFfTVYKIAl0cmlzdGF0ZSAiTWFydmVsbCBTQVRBIHN1cHBvcnQiCiAJaGVscApAQCAtNzk2LDYgKzgwNSwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgUEFUQV9TQU1TVU5HX0NGCisJdHJpc3RhdGUgIlNhbXN1bmcgU29DIFBBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNBTVNVTkdfREVWX0lERQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYmFzaWMgc3VwcG9ydCBmb3IgU2Ftc3VuZydzIFMzQy9TNVAgYm9hcmQKKwkgIFBBVEEgY29udHJvbGxlcnMgdmlhIHRoZSBuZXcgQVRBIGxheWVyCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBQQVRBX1dJTkJPTkRfVkxCCiAJdHJpc3RhdGUgIldpbmJvbmQgVzgzNzU5QSBWTEIgUEFUQSBzdXBwb3J0IChFeHBlcmltZW50YWwpIgogCWRlcGVuZHMgb24gSVNBICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvTWFrZWZpbGUgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQppbmRleCA3ZWY4OWQ3Li42NTQwNjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19TQVRBX0ZTTCkJCSs9IHNhdGFfZnNsLm8KIG9iai0kKENPTkZJR19TQVRBX0lOSUMxNjJYKQkrPSBzYXRhX2luaWMxNjJ4Lm8KIG9iai0kKENPTkZJR19TQVRBX1NJTDI0KQkrPSBzYXRhX3NpbDI0Lm8KK29iai0kKENPTkZJR19TQVRBX0RXQykJCSs9IHNhdGFfZHdjXzQ2MGV4Lm8KIAogIyBTRkYgdy8gY3VzdG9tIERNQQogb2JqLSQoQ09ORklHX1BEQ19BRE1BKQkJKz0gcGRjX2FkbWEubwpAQCAtODcsNiArODgsNyBAQAogb2JqLSQoQ09ORklHX1BBVEFfUURJKQkJKz0gcGF0YV9xZGkubwogb2JqLSQoQ09ORklHX1BBVEFfUkI1MzIpCSs9IHBhdGFfcmI1MzJfY2Yubwogb2JqLSQoQ09ORklHX1BBVEFfUloxMDAwKQkrPSBwYXRhX3J6MTAwMC5vCitvYmotJChDT05GSUdfUEFUQV9TQU1TVU5HX0NGKQkrPSBwYXRhX3NhbXN1bmdfY2Yubwogb2JqLSQoQ09ORklHX1BBVEFfV0lOQk9ORF9WTEIpCSs9IHBhdGFfd2luYm9uZC5vCiAKICMgU2hvdWxkIGJlIGxhc3QgYnV0IHR3byBsaWJhdGEgZHJpdmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggZjI1MjI1My4uZmU3NWQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMTA0Miw3ICsxMDQyLDcgQEAKIAogCVZQUklOVEsoIkVOVEVSXG4iKTsKIAotCVdBUk5fT04oQVRBX01BWF9RVUVVRSA+IEFIQ0lfTUFYX0NNRFMpOworCVdBUk5fT04oKGludClBVEFfTUFYX1FVRVVFID4gQUhDSV9NQVhfQ01EUyk7CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMKaW5kZXggNWUxMWIxNi4uNGU5N2YzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYwpAQCAtNTQsMTkgKzU0LDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwZGF0YSAmJiBwZGF0YS0+aW5pdCkgewotCQlyYyA9IHBkYXRhLT5pbml0KGRldik7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQl9Ci0KIAlpZiAocGRhdGEgJiYgcGRhdGEtPmF0YV9wb3J0X2luZm8pCiAJCXBpID0gKnBkYXRhLT5hdGFfcG9ydF9pbmZvOwogCiAJaHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFocHJpdikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyMDsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvYyBhaGNpX2hvc3RfcHJpdlxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWhwcml2LT5mbGFncyB8PSAodW5zaWduZWQgbG9uZylwaS5wcml2YXRlX2RhdGE7CkBAIC03NCw4ICs2OCwxOSBAQAogCWhwcml2LT5tbWlvID0gZGV2bV9pb3JlbWFwKGRldiwgbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKIAlpZiAoIWhwcml2LT5tbWlvKSB7CiAJCWRldl9lcnIoZGV2LCAiY2FuJ3QgbWFwICVwUlxuIiwgbWVtKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycjA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogU29tZSBwbGF0Zm9ybXMgbWlnaHQgbmVlZCB0byBwcmVwYXJlIGZvciBtbWlvIHJlZ2lvbiBhY2Nlc3MsCisJICogd2hpY2ggY291bGQgYmUgZG9uZSBpbiB0aGUgZm9sbG93aW5nIGluaXQgY2FsbC4gU28sIHRoZSBtbWlvCisJICogcmVnaW9uIHNob3VsZG4ndCBiZSBhY2Nlc3NlZCBiZWZvcmUgaW5pdCAoaWYgcHJvdmlkZWQpIGhhcworCSAqIHJldHVybmVkIHN1Y2Nlc3NmdWxseS4KKwkgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKKwkJcmMgPSBwZGF0YS0+aW5pdChkZXYsIGhwcml2LT5tbWlvKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCX0KIAogCWFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZyhkZXYsIGhwcml2LApAQCAtMTY2LDcgKzE3MSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFoY2lfZHJpdmVyID0gewotCS5wcm9iZSA9IGFoY2lfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFoY2lfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhaGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMgYi9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCmluZGV4IDcxMDdhNjkuLmNjNWY3NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwpAQCAtNTQsNyArNTQsNiBAQAogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJaW50IGRtYV9lbmFibGVkID0gMDsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAogCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiBBVEFfR0VOX0ZPUkNFX0RNQSkgewogCQlkbWFfZW5hYmxlZCA9IDB4ZmY7CkBAIC02Myw5ICs2Miw2IEBACiAJCWRtYV9lbmFibGVkID0gaW9yZWFkOChhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX1NUQVRVUyk7CiAJfQogCi0JaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NFTkFURUspCi0JCWRtYV9lbmFibGVkID0gMHhGRjsKLQogCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CiAJCS8qIFdlIGRvbid0IHJlYWxseSBjYXJlICovCiAJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggNzQwOWY5OC4uMzk3MWJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC0xNTgsNiArMTU4LDcgQEAKIHN0cnVjdCBwaWl4X2hvc3RfcHJpdiB7CiAJY29uc3QgaW50ICptYXA7CiAJdTMyIHNhdmVkX2lvY2ZnOworCXNwaW5sb2NrX3Qgc2lkcHJfbG9jazsJLyogRklYTUU6IHJlbW92ZSBvbmNlIGxvY2tpbmcgaW4gRUggaXMgZml4ZWQgKi8KIAl2b2lkIF9faW9tZW0gKnNpZHByOwogfTsKIApAQCAtOTUxLDEyICs5NTIsMTUgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gbGluay0+YXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHJlZyA+PSBBUlJBWV9TSVpFKHBpaXhfc2lkeF9tYXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZocHJpdi0+c2lkcHJfbG9jaywgZmxhZ3MpOwogCXBpaXhfc2lkcHJfc2VsKGxpbmssIHJlZyk7CiAJKnZhbCA9IGlvcmVhZDMyKGhwcml2LT5zaWRwciArIFBJSVhfU0lEUFJfREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHByaXYtPnNpZHByX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTY0LDEyICs5NjgsMTUgQEAKIAkJCQl1bnNpZ25lZCBpbnQgcmVnLCB1MzIgdmFsKQogewogCXN0cnVjdCBwaWl4X2hvc3RfcHJpdiAqaHByaXYgPSBsaW5rLT5hcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAocmVnID49IEFSUkFZX1NJWkUocGlpeF9zaWR4X21hcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwcml2LT5zaWRwcl9sb2NrLCBmbGFncyk7CiAJcGlpeF9zaWRwcl9zZWwobGluaywgcmVnKTsKIAlpb3dyaXRlMzIodmFsLCBocHJpdi0+c2lkcHIgKyBQSUlYX1NJRFBSX0RBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwcml2LT5zaWRwcl9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NjYsNiArMTU3Myw3IEBACiAJaHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFocHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CisJc3Bpbl9sb2NrX2luaXQoJmhwcml2LT5zaWRwcl9sb2NrKTsKIAogCS8qIFNhdmUgSU9DRkcsIHRoaXMgd2lsbCBiZSB1c2VkIGZvciBjYWJsZSBkZXRlY3Rpb24sIHF1aXJrCiAJICogZGV0ZWN0aW9uIGFuZCByZXN0b3JhdGlvbiBvbiBkZXRhY2guICBUaGlzIGlzIG5lY2Vzc2FyeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggZGRmOGU0OC4uYTBhNGQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC00MTY3LDE1ICs0MTY3LDEzIEBACiAJeyAiV0RDIEFDMjMyMDBMIiwJIjIxLjEwTjIxIiwJQVRBX0hPUktBR0VfTk9ETUEgfSwKIAl7ICJDb21wYXEgQ1JELTgyNDFCIiwgCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAogCXsgIkNSRC04NDAwQiIsCQlOVUxMLCAJCUFUQV9IT1JLQUdFX05PRE1BIH0sCi0JeyAiQ1JELTg0ODBCIiwJCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAotCXsgIkNSRC04NDgyQiIsCQlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDUkQtODQ4WzAyXUIiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKIAl7ICJDUkQtODQiLAkJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCiAJeyAiU2FuRGlzayBTRFAzQiIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAogCXsgIlNhbkRpc2sgU0RQM0ItNjQiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKIAl7ICJTQU5ZTyBDRC1ST00gQ1JEIiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCiAJeyAiSElUQUNISSBDRFItOCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAotCXsgIkhJVEFDSEkgQ0RSLTgzMzUiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKLQl7ICJISVRBQ0hJIENEUi04NDM1IiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiSElUQUNISSBDRFItOFszNF0zNSIsTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCiAJeyAiVG9zaGliYSBDRC1ST00gWE0tNjIwMkIiLCBOVUxMLAlBVEFfSE9SS0FHRV9OT0RNQSB9LAogCXsgIlRPU0hJQkEgQ0QtUk9NIFhNLTE3MDJCQyIsIE5VTEwsCUFUQV9IT1JLQUdFX05PRE1BIH0sCiAJeyAiQ0QtNTMyRS1BIiwgCQlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKQEAgLTQyMTEsNzAgKzQyMDksMTYgQEAKIAl7ICJPQ1ogQ09SRV9TU0QiLAkiMDIuMTAxMDQiLAlBVEFfSE9SS0FHRV9OT05DUSB9LAogCiAJLyogU2VhZ2F0ZSBOQ1EgKyBGTFVTSCBDQUNIRSBmaXJtd2FyZSBidWcgKi8KLQl7ICJTVDMxNTAwMzQxQVMiLAkiU0QxNSIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMTUwMDM0MUFTIiwJIlNEMTYiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCXsgIlNUMzE1MDAzNDFBUyIsCSJTRDE3IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDMxNTAwMzQxQVMiLAkiU0QxOCIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMTUwMDM0MUFTIiwJIlNEMTkiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAorCXsgIlNUMzE1MDAzNDFBUyIsCSJTRDFbNS05XSIsCUFUQV9IT1JLQUdFX05PTkNRIHwKIAkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKIAotCXsgIlNUMzEwMDAzMzNBUyIsCSJTRDE1IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDMxMDAwMzMzQVMiLAkiU0QxNiIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMTAwMDMzM0FTIiwJIlNEMTciLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCXsgIlNUMzEwMDAzMzNBUyIsCSJTRDE4IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDMxMDAwMzMzQVMiLAkiU0QxOSIsCQlBVEFfSE9SS0FHRV9OT05DUSB8CisJeyAiU1QzMTAwMDMzM0FTIiwJIlNEMVs1LTldIiwJQVRBX0hPUktBR0VfTk9OQ1EgfAogCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAogCi0JeyAiU1QzNjQwNjIzQVMiLAkiU0QxNSIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzNjQwNjIzQVMiLAkiU0QxNiIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzNjQwNjIzQVMiLAkiU0QxNyIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzNjQwNjIzQVMiLAkiU0QxOCIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzNjQwNjIzQVMiLAkiU0QxOSIsCQlBVEFfSE9SS0FHRV9OT05DUSB8CisJeyAiU1QzNjQwWzM2XTIzQVMiLAkiU0QxWzUtOV0iLAlBVEFfSE9SS0FHRV9OT05DUSB8CiAJCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCiAKLQl7ICJTVDM2NDAzMjNBUyIsCSJTRDE1IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDM2NDAzMjNBUyIsCSJTRDE2IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDM2NDAzMjNBUyIsCSJTRDE3IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDM2NDAzMjNBUyIsCSJTRDE4IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQl7ICJTVDM2NDAzMjNBUyIsCSJTRDE5IiwJCUFUQV9IT1JLQUdFX05PTkNRIHwKLQkJCQkJCUFUQV9IT1JLQUdFX0ZJUk1XQVJFX1dBUk4gfSwKLQotCXsgIlNUMzMyMDgxM0FTIiwJIlNEMTUiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCXsgIlNUMzMyMDgxM0FTIiwJIlNEMTYiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCXsgIlNUMzMyMDgxM0FTIiwJIlNEMTciLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCXsgIlNUMzMyMDgxM0FTIiwJIlNEMTgiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCXsgIlNUMzMyMDgxM0FTIiwJIlNEMTkiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfAotCQkJCQkJQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTiB9LAotCi0JeyAiU1QzMzIwNjEzQVMiLAkiU0QxNSIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMzIwNjEzQVMiLAkiU0QxNiIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMzIwNjEzQVMiLAkiU0QxNyIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMzIwNjEzQVMiLAkiU0QxOCIsCQlBVEFfSE9SS0FHRV9OT05DUSB8Ci0JCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCi0JeyAiU1QzMzIwNjEzQVMiLAkiU0QxOSIsCQlBVEFfSE9SS0FHRV9OT05DUSB8CisJeyAiU1QzMzIwWzY4XTEzQVMiLAkiU0QxWzUtOV0iLAlBVEFfSE9SS0FHRV9OT05DUSB8CiAJCQkJCQlBVEFfSE9SS0FHRV9GSVJNV0FSRV9XQVJOIH0sCiAKIAkvKiBCbGFja2xpc3QgZW50cmllcyB0YWtlbiBmcm9tIFNpbGljb24gSW1hZ2UgMzEyNC8zMTMyCkBAIC00MzAzLDEyICs0MjQ3LDcgQEAKIAkvKiBEZXZpY2VzIHdoaWNoIGdldCB0aGUgSVZCIHdyb25nICovCiAJeyAiUVVBTlRVTSBGSVJFQkFMTGxjdDEwIDA1IiwgIkEwMy4wOTAwIiwgQVRBX0hPUktBR0VfSVZCLCB9LAogCS8qIE1heWJlIHdlIHNob3VsZCBqdXN0IGJsYWNrbGlzdCBUU1NUY29ycC4uLiAqLwotCXsgIlRTU1Rjb3JwIENERFZEVyBTSC1TMjAySCIsICJTQjAwIiwJICBBVEFfSE9SS0FHRV9JVkIsIH0sCi0JeyAiVFNTVGNvcnAgQ0REVkRXIFNILVMyMDJIIiwgIlNCMDEiLAkgIEFUQV9IT1JLQUdFX0lWQiwgfSwKLQl7ICJUU1NUY29ycCBDRERWRFcgU0gtUzIwMkoiLCAiU0IwMCIsCSAgQVRBX0hPUktBR0VfSVZCLCB9LAotCXsgIlRTU1Rjb3JwIENERFZEVyBTSC1TMjAySiIsICJTQjAxIiwJICBBVEFfSE9SS0FHRV9JVkIsIH0sCi0JeyAiVFNTVGNvcnAgQ0REVkRXIFNILVMyMDJOIiwgIlNCMDAiLAkgIEFUQV9IT1JLQUdFX0lWQiwgfSwKLQl7ICJUU1NUY29ycCBDRERWRFcgU0gtUzIwMk4iLCAiU0IwMSIsCSAgQVRBX0hPUktBR0VfSVZCLCB9LAorCXsgIlRTU1Rjb3JwIENERFZEVyBTSC1TMjAyW0hKTl0iLCAiU0IwWzAxXSIsICBBVEFfSE9SS0FHRV9JVkIsIH0sCiAKIAkvKiBEZXZpY2VzIHRoYXQgZG8gbm90IG5lZWQgYnJpZGdpbmcgbGltaXRzIGFwcGxpZWQgKi8KIAl7ICJNVFJPTiBNU1AtU0FUQSoiLAkJTlVMTCwJQVRBX0hPUktBR0VfQlJJREdFX09LLCB9LApAQCAtNDMyNiwyOSArNDI2NSw3MyBAQAogCXsgfQogfTsKIAotc3RhdGljIGludCBzdHJuX3BhdHRlcm5fY21wKGNvbnN0IGNoYXIgKnBhdHQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB3aWxkY2hhcikKKy8qKgorICoJZ2xvYl9tYXRjaCAtIG1hdGNoIGEgdGV4dCBzdHJpbmcgYWdhaW5zdCBhIGdsb2Itc3R5bGUgcGF0dGVybgorICoJQHRleHQ6IHRoZSBzdHJpbmcgdG8gYmUgZXhhbWluZWQKKyAqCUBwYXR0ZXJuOiB0aGUgZ2xvYi1zdHlsZSBwYXR0ZXJuIHRvIGJlIG1hdGNoZWQgYWdhaW5zdAorICoKKyAqCUVpdGhlci9ib3RoIG9mIHRleHQgYW5kIHBhdHRlcm4gY2FuIGJlIGVtcHR5IHN0cmluZ3MuCisgKgorICoJTWF0Y2ggdGV4dCBhZ2FpbnN0IGEgZ2xvYi1zdHlsZSBwYXR0ZXJuLCB3aXRoIHdpbGRjYXJkcyBhbmQgc2ltcGxlIHNldHM6CisgKgorICoJCT8JbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4KKyAqCQkqCW1hdGNoZXMgYW55IHJ1biBvZiBjaGFyYWN0ZXJzLgorICoJCVt4eXpdCW1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdGhlIHNldDogeCwgeSwgb3Igei4KKyAqCQlbYS1kXQltYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSByYW5nZTogYSwgYiwgYywgb3IgZC4KKyAqCQlbYS1kMC05XSBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIGVpdGhlciByYW5nZS4KKyAqCisgKglUaGUgc3BlY2lhbCBjaGFyYWN0ZXJzID8sIFssIC0sIG9yICosIGNhbiBiZSBtYXRjaGVkIHVzaW5nIGEgc2V0LCBlZy4gWypdCisgKglCZWhhdmlvdXIgd2l0aCBtYWxmb3JtZWQgcGF0dGVybnMgaXMgdW5kZWZpbmVkLCB0aG91Z2ggZ2VuZXJhbGx5IHJlYXNvbmFibGUuCisgKgorICoJRXhhbXBsZSBwYXR0ZXJuczogICJTRDE/IiwgICJTRDFbMC01XSIsICAiKlIwIiwgIFNEKjE/WzAxMl0qeHgiCisgKgorICoJVGhpcyBmdW5jdGlvbiB1c2VzIG9uZSBsZXZlbCBvZiByZWN1cnNpb24gcGVyICcqJyBpbiBwYXR0ZXJuLgorICoJU2luY2UgaXQgY2FsbHMgX25vdGhpbmdfIGVsc2UsIGFuZCBoYXMgX25vXyBleHBsaWNpdCBsb2NhbCB2YXJpYWJsZXMsCisgKgl0aGlzIHdpbGwgbm90IGNhdXNlIHN0YWNrIHByb2JsZW1zIGZvciBhbnkgcmVhc29uYWJsZSB1c2UgaGVyZS4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBtYXRjaCwgMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZ2xvYl9tYXRjaCAoY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqcGF0dGVybikKIHsKLQljb25zdCBjaGFyICpwOwotCWludCBsZW47CisJZG8geworCQkvKiBNYXRjaCBzaW5nbGUgY2hhcmFjdGVyIG9yIGEgJz8nIHdpbGRjYXJkICovCisJCWlmICgqdGV4dCA9PSAqcGF0dGVybiB8fCAqcGF0dGVybiA9PSAnPycpIHsKKwkJCWlmICghKnBhdHRlcm4rKykKKwkJCQlyZXR1cm4gMDsgIC8qIEVuZCBvZiBib3RoIHN0cmluZ3M6IG1hdGNoICovCisJCX0gZWxzZSB7CisJCQkvKiBNYXRjaCBzaW5nbGUgY2hhciBhZ2FpbnN0IGEgJ1snIGJyYWNrZXRlZCAnXScgcGF0dGVybiBzZXQgKi8KKwkJCWlmICghKnRleHQgfHwgKnBhdHRlcm4gIT0gJ1snKQorCQkJCWJyZWFrOyAgLyogTm90IGEgcGF0dGVybiBzZXQgKi8KKwkJCXdoaWxlICgqKytwYXR0ZXJuICYmICpwYXR0ZXJuICE9ICddJyAmJiAqdGV4dCAhPSAqcGF0dGVybikgeworCQkJCWlmICgqcGF0dGVybiA9PSAnLScgJiYgKihwYXR0ZXJuIC0gMSkgIT0gJ1snKQorCQkJCQlpZiAoKnRleHQgPiAqKHBhdHRlcm4gLSAxKSAmJiAqdGV4dCA8ICoocGF0dGVybiArIDEpKSB7CisJCQkJCQkrK3BhdHRlcm47CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJfQorCQkJaWYgKCEqcGF0dGVybiB8fCAqcGF0dGVybiA9PSAnXScpCisJCQkJcmV0dXJuIDE7ICAvKiBObyBtYXRjaCAqLworCQkJd2hpbGUgKCpwYXR0ZXJuICYmICpwYXR0ZXJuKysgIT0gJ10nKTsKKwkJfQorCX0gd2hpbGUgKCorK3RleHQgJiYgKnBhdHRlcm4pOwogCi0JLyoKLQkgKiBjaGVjayBmb3IgdHJhaWxpbmcgd2lsZGNhcmQ6ICpcMAotCSAqLwotCXAgPSBzdHJjaHIocGF0dCwgd2lsZGNoYXIpOwotCWlmIChwICYmICgoKihwICsgMSkpID09IDApKQotCQlsZW4gPSBwIC0gcGF0dDsKLQllbHNlIHsKLQkJbGVuID0gc3RybGVuKG5hbWUpOwotCQlpZiAoIWxlbikgewotCQkJaWYgKCEqcGF0dCkKLQkJCQlyZXR1cm4gMDsKLQkJCXJldHVybiAtMTsKKwkvKiBNYXRjaCBhbnkgcnVuIG9mIGNoYXJzIGFnYWluc3QgYSAnKicgd2lsZGNhcmQgKi8KKwlpZiAoKnBhdHRlcm4gPT0gJyonKSB7CisJCWlmICghKisrcGF0dGVybikKKwkJCXJldHVybiAwOyAgLyogTWF0Y2g6IGF2b2lkIHJlY3Vyc2lvbiBhdCBlbmQgb2YgcGF0dGVybiAqLworCQkvKiBMb29wIHRvIGhhbmRsZSBhZGRpdGlvbmFsIHBhdHRlcm4gY2hhcnMgYWZ0ZXIgdGhlIHdpbGRjYXJkICovCisJCXdoaWxlICgqdGV4dCkgeworCQkJaWYgKGdsb2JfbWF0Y2godGV4dCwgcGF0dGVybikgPT0gMCkKKwkJCQlyZXR1cm4gMDsgIC8qIFJlbWFpbmRlciBtYXRjaGVkICovCisJCQkrK3RleHQ7ICAvKiBBYnNvcmIgKG1hdGNoKSB0aGlzIGNoYXIgYW5kIHRyeSBhZ2FpbiAqLwogCQl9CiAJfQotCi0JcmV0dXJuIHN0cm5jbXAocGF0dCwgbmFtZSwgbGVuKTsKKwlpZiAoISp0ZXh0ICYmICEqcGF0dGVybikKKwkJcmV0dXJuIDA7ICAvKiBFbmQgb2YgYm90aCBzdHJpbmdzOiBtYXRjaCAqLworCXJldHVybiAxOyAgLyogTm8gbWF0Y2ggKi8KIH0KLQorIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXRhX2Rldl9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtW0FUQV9JRF9QUk9EX0xFTiArIDFdOwpAQCAtNDM1OSwxMCArNDM0MiwxMCBAQAogCWF0YV9pZF9jX3N0cmluZyhkZXYtPmlkLCBtb2RlbF9yZXYsIEFUQV9JRF9GV19SRVYsIHNpemVvZihtb2RlbF9yZXYpKTsKIAogCXdoaWxlIChhZC0+bW9kZWxfbnVtKSB7Ci0JCWlmICghc3Rybl9wYXR0ZXJuX2NtcChhZC0+bW9kZWxfbnVtLCBtb2RlbF9udW0sICcqJykpIHsKKwkJaWYgKCFnbG9iX21hdGNoKG1vZGVsX251bSwgYWQtPm1vZGVsX251bSkpIHsKIAkJCWlmIChhZC0+bW9kZWxfcmV2ID09IE5VTEwpCiAJCQkJcmV0dXJuIGFkLT5ob3JrYWdlOwotCQkJaWYgKCFzdHJuX3BhdHRlcm5fY21wKGFkLT5tb2RlbF9yZXYsIG1vZGVsX3JldiwgJyonKSkKKwkJCWlmICghZ2xvYl9tYXRjaChtb2RlbF9yZXYsIGFkLT5tb2RlbF9yZXYpKQogCQkJCXJldHVybiBhZC0+aG9ya2FnZTsKIAkJfQogCQlhZCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCBmNzdhNjczLi42OTc0NzRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtMjIxNCw2ICsyMjE0LDcgQEAKIAkJeyBBVEFfQ01EX1NNQVJULAkJIlNNQVJUIiB9LAogCQl7IEFUQV9DTURfTUVESUFfTE9DSywJCSJET09SIExPQ0siIH0sCiAJCXsgQVRBX0NNRF9NRURJQV9VTkxPQ0ssCQkiRE9PUiBVTkxPQ0siIH0sCisJCXsgQVRBX0NNRF9EU00sCQkJIkRBVEEgU0VUIE1BTkFHRU1FTlQiIH0sCiAJCXsgQVRBX0NNRF9DSEtfTUVEX0NSRF9UWVAsIAkiQ0hFQ0sgTUVESUEgQ0FSRCBUWVBFIiB9LAogCQl7IEFUQV9DTURfQ0ZBX1JFUV9FWFRfRVJSLCAJIkNGQSBSRVFVRVNUIEVYVEVOREVEIEVSUk9SIiB9LAogCQl7IEFUQV9DTURfQ0ZBX1dSSVRFX05FLAkJIkNGQSBXUklURSBTRUNUT1JTIFdJVEhPVVQgRVJBU0UiIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jIGIvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYwppbmRleCAxMThjMjhlLi5lOTQ0YWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTIwMSwyMyArMjAwLDI1IEBACiAKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcGRldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJcGRldi0+aW9fbGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJcGRldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKSB7CisJCQlwZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgJj0gfklPX0RBVEFfUEFUSF9XSURUSDsKKwkJCXBkZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJfQogCQlpZiAoaW8tPm53aW4gPT0gMikgewotCQkJcGRldi0+aW8uTnVtUG9ydHMxID0gODsKLQkJCXBkZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBkZXYtPmlvLk51bVBvcnRzMiA9IChzdGstPmlzX2ttZSkgPyAyIDogMTsKLQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwZGV2LCAmcGRldi0+aW8pICE9IDApCisJCQlwZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gODsKKwkJCXBkZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBkZXYtPnJlc291cmNlWzFdLT5lbmQgPSAoc3RrLT5pc19rbWUpID8gMiA6IDE7CisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocGRldikgIT0gMCkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCXN0ay0+Y3RsX2Jhc2UgPSBwZGV2LT5pby5CYXNlUG9ydDI7CisJCQlzdGstPmN0bF9iYXNlID0gcGRldi0+cmVzb3VyY2VbMV0tPnN0YXJ0OwogCQl9IGVsc2UgaWYgKChpby0+bndpbiA9PSAxKSAmJiAoaW8tPndpblswXS5sZW4gPj0gMTYpKSB7Ci0JCQlwZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCXBkZXYtPmlvLk51bVBvcnRzMiA9IDA7Ci0JCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJnBkZXYtPmlvKSAhPSAwKQorCQkJcGRldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOworCQkJcGRldi0+cmVzb3VyY2VbMV0tPmVuZCA9IDA7CisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocGRldikgIT0gMCkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCXN0ay0+Y3RsX2Jhc2UgPSBwZGV2LT5pby5CYXNlUG9ydDEgKyAweDBlOworCQkJc3RrLT5jdGxfYmFzZSA9IHBkZXYtPnJlc291cmNlWzBdLT5zdGFydCArIDB4MGU7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCS8qIElmIHdlJ3ZlIGdvdCB0aGlzIGZhciwgd2UncmUgZG9uZSAqLwpAQCAtMjQ2LDkgKzI0Nyw4IEBACiAJc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgKm9wcyA9ICZwY21jaWFfcG9ydF9vcHM7CiAKIAkvKiBTZXQgdXAgYXR0cmlidXRlcyBpbiBvcmRlciB0byBwcm9iZSBjYXJkIGFuZCBnZXQgcmVzb3VyY2VzICovCi0JcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQlwZGV2LT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCXBkZXYtPmlvLklPQWRkckxpbmVzID0gMzsKKwlwZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJcGRldi0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCXBkZXYtPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKIAlwZGV2LT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAJCWlmIChwY21jaWFfbG9vcF9jb25maWcocGRldiwgcGNtY2lhX2NoZWNrX29uZV9jb25maWcsIHN0aykpCiAJCQlnb3RvIGZhaWxlZDsgLyogTm8gc3VpdGFibGUgY29uZmlnIGZvdW5kICovCiAJfQotCWlvX2Jhc2UgPSBwZGV2LT5pby5CYXNlUG9ydDE7CisJaW9fYmFzZSA9IHBkZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAljdGxfYmFzZSA9IHN0ay0+Y3RsX2Jhc2U7CiAJaWYgKCFwZGV2LT5pcnEpCiAJCWdvdG8gZmFpbGVkOwpAQCAtMjk0LDcgKzI5NCw3IEBACiAKIAkvKiBGSVhNRTogQ291bGQgYmUgbW9yZSBwb3J0cyBhdCBiYXNlICsgMHgxMCBidXQgd2Ugb25seSBkZWFsIHdpdGgKIAkgICBvbmUgcmlnaHQgbm93ICovCi0JaWYgKHBkZXYtPmlvLk51bVBvcnRzMSA+PSAweDIwKQorCWlmIChyZXNvdXJjZV9zaXplKHBkZXYtPnJlc291cmNlWzBdKSA+PSAweDIwKQogCQluX3BvcnRzID0gMjsKIAogCWlmIChwZGV2LT5tYW5mX2lkID09IDB4MDA5NyAmJiBwZGV2LT5jYXJkX2lkID09IDB4MTYyMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2Ftc3VuZ19jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9zYW1zdW5nX2NmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5Y2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2Ftc3VuZ19jZi5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFBBVEEgZHJpdmVyIGZvciBTYW1zdW5nIFNvQ3MuCisgKiBTdXBwb3J0cyBDRiBJbnRlcmZhY2UgaW4gVHJ1ZSBJREUgbW9kZS4gQ3VycmVudGx5IG9ubHkgUElPIG1vZGUgaGFzIGJlZW4KKyAqIGltcGxlbWVudGVkOyBVRE1BIHN1cHBvcnQgaGFzIHRvIGJlIGFkZGVkLgorICoKKyAqIEJhc2VkIG9uOgorICoJUEFUQSBkcml2ZXIgZm9yIEFUOTFTQU05MjYwIFN0YXRpYyBNZW1vcnkgQ29udHJvbGxlcgorICoJUEFUQSBkcml2ZXIgZm9yIFRvc2hpYmEgU0NDIGNvbnRyb2xsZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxwbGF0L2F0YS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1hdGEuaD4KKworI2RlZmluZSBEUlZfTkFNRSAicGF0YV9zYW1zdW5nX2NmIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgorCitlbnVtIHMzY19jcHVfdHlwZSB7CisJVFlQRV9TM0M2NFhYLAorCVRZUEVfUzVQQzEwMCwKKwlUWVBFX1M1UFYyMTAsCit9OworCisvKgorICogc3RydWN0IHMzY19pZGVfaW5mbyAtIFMzQyBQQVRBIGluc3RhbmNlLgorICogQGNsazogVGhlIGNsb2NrIHJlc291cmNlIGZvciB0aGlzIGNvbnRyb2xsZXIuCisgKiBAaWRlX2FkZHI6IFRoZSBhcmVhIG1hcHBlZCBmb3IgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycy4KKyAqIEBzZnJfYWRkcjogVGhlIGFyZWEgbWFwcGVkIGZvciB0aGUgc3BlY2lhbCBmdW5jdGlvbiByZWdpc3RlcnMuCisgKiBAaXJxOiBUaGUgSVJRIG51bWJlciB3ZSBhcmUgdXNpbmcuCisgKiBAY3B1X3R5cGU6IFRoZSBleGFjdCB0eXBlIG9mIHRoaXMgY29udHJvbGxlci4KKyAqIEBmaWZvX3N0YXR1c19yZWc6IFRoZSBBVEFfRklGT19TVEFUVVMgcmVnaXN0ZXIgb2Zmc2V0LgorICovCitzdHJ1Y3QgczNjX2lkZV9pbmZvIHsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICppZGVfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnNmcl9hZGRyOworCXVuc2lnbmVkIGludCBpcnE7CisJZW51bSBzM2NfY3B1X3R5cGUgY3B1X3R5cGU7CisJdW5zaWduZWQgaW50IGZpZm9fc3RhdHVzX3JlZzsKK307CisKK3N0YXRpYyB2b2lkIHBhdGFfczNjX3NldF9lbmRpYW4odm9pZCBfX2lvbWVtICpzM2NfaWRlX3JlZ2Jhc2UsIHU4IG1vZGUpCit7CisJdTMyIHJlZyA9IHJlYWRsKHMzY19pZGVfcmVnYmFzZSArIFMzQ19BVEFfQ0ZHKTsKKwlyZWcgPSBtb2RlID8gKHJlZyAmIH5TM0NfQVRBX0NGR19TV0FQKSA6IChyZWcgfCBTM0NfQVRBX0NGR19TV0FQKTsKKwl3cml0ZWwocmVnLCBzM2NfaWRlX3JlZ2Jhc2UgKyBTM0NfQVRBX0NGRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfczNjX2NmZ19tb2RlKHZvaWQgX19pb21lbSAqczNjX2lkZV9zZnJiYXNlKQoreworCS8qIFNlbGVjdCB0cnVlLWlkZSBhcyB0aGUgaW50ZXJuYWwgb3BlcmF0aW5nIG1vZGUgKi8KKwl3cml0ZWwocmVhZGwoczNjX2lkZV9zZnJiYXNlICsgUzNDX0NGQVRBX01VWCkgfCBTM0NfQ0ZBVEFfTVVYX1RSVUVJREUsCisJCXMzY19pZGVfc2ZyYmFzZSArIFMzQ19DRkFUQV9NVVgpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworcGF0YV9zM2Nfc2V0dXBfdGltaW5nKHN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBhdGFfdGltaW5nICphdGEpCit7CisJaW50IHQxID0gYXRhLT5zZXR1cDsKKwlpbnQgdDIgPSBhdGEtPmFjdDhiOworCWludCB0MmkgPSBhdGEtPnJlYzhiOworCXVsb25nIHBpb3RpbWU7CisKKwlwaW90aW1lID0gKCh0MmkgJiAweGZmKSA8PCAxMikgfCAoKHQyICYgMHhmZikgPDwgNCkgfCAodDEgJiAweGYpOworCisJcmV0dXJuIHBpb3RpbWU7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfczNjX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQoreworCXN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8gPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGFfdGltaW5nIHRpbWluZzsKKwlpbnQgY3ljbGVfdGltZTsKKwl1bG9uZyBhdGFfY2ZnID0gcmVhZGwoaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX0NGRyk7CisJdWxvbmcgcGlvdGltZTsKKworCS8qIEVuYWJsZXMgSU9SRFkgaWYgbW9kZSByZXF1aXJlcyBpdCAqLworCWlmIChhdGFfcGlvX25lZWRfaW9yZHkoYWRldikpCisJCWF0YV9jZmcgfD0gUzNDX0FUQV9DRkdfSU9SRFlFTjsKKwllbHNlCisJCWF0YV9jZmcgJj0gflMzQ19BVEFfQ0ZHX0lPUkRZRU47CisKKwljeWNsZV90aW1lID0gKGludCkoMTAwMDAwMDAwMFVMIC8gY2xrX2dldF9yYXRlKGluZm8tPmNsaykpOworCisJYXRhX3RpbWluZ19jb21wdXRlKGFkZXYsIGFkZXYtPnBpb19tb2RlLCAmdGltaW5nLAorCQkJCQljeWNsZV90aW1lICogMTAwMCwgMCk7CisKKwlwaW90aW1lID0gcGF0YV9zM2Nfc2V0dXBfdGltaW5nKGluZm8sICZ0aW1pbmcpOworCisJd3JpdGVsKGF0YV9jZmcsIGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9DRkcpOworCXdyaXRlbChwaW90aW1lLCBpbmZvLT5pZGVfYWRkciArIFMzQ19BVEFfUElPX1RJTUUpOworfQorCisvKgorICogV2FpdHMgdW50aWwgdGhlIElERSBjb250cm9sbGVyIGlzIGFibGUgdG8gcGVyZm9ybSBuZXh0IHJlYWQvd3JpdGUKKyAqIG9wZXJhdGlvbiB0byB0aGUgZGlzay4gTmVlZGVkIGZvciA2NFhYIHNlcmllcyBib2FyZHMgb25seS4KKyAqLworc3RhdGljIGludCB3YWl0X2Zvcl9ob3N0X3JlYWR5KHN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8pCit7CisJdWxvbmcgdGltZW91dDsKKwl2b2lkIF9faW9tZW0gKmZpZm9fcmVnID0gaW5mby0+aWRlX2FkZHIgKyBpbmZvLT5maWZvX3N0YXR1c19yZWc7CisKKwkvKiB3YWl0IGZvciBtYXhpbXVtIG9mIDIwIG1zZWMgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoKHJlYWRsKGZpZm9fcmVnKSA+PiAyOCkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCisvKgorICogV3JpdGVzIHRvIG9uZSBvZiB0aGUgdGFzayBmaWxlIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgYXRhX291dGIoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1OCBhZGRyLCB2b2lkIF9faW9tZW0gKnJlZykKK3sKKwlzdHJ1Y3QgczNjX2lkZV9pbmZvICppbmZvID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCisJd2FpdF9mb3JfaG9zdF9yZWFkeShpbmZvKTsKKwl3cml0ZWIoYWRkciwgcmVnKTsKK30KKworLyoKKyAqIFJlYWRzIGZyb20gb25lIG9mIHRoZSB0YXNrIGZpbGUgcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdTggYXRhX2luYihzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIHZvaWQgX19pb21lbSAqcmVnKQoreworCXN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8gPSBob3N0LT5wcml2YXRlX2RhdGE7CisJdTggdGVtcDsKKworCXdhaXRfZm9yX2hvc3RfcmVhZHkoaW5mbyk7CisJKHZvaWQpIHJlYWRiKHJlZyk7CisJd2FpdF9mb3JfaG9zdF9yZWFkeShpbmZvKTsKKwl0ZW1wID0gcmVhZGIoaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX1BJT19SREFUQSk7CisJcmV0dXJuIHRlbXA7Cit9CisKKy8qCisgKiBwYXRhX3MzY190Zl9sb2FkIC0gc2VuZCB0YXNrZmlsZSByZWdpc3RlcnMgdG8gaG9zdCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB2b2lkIHBhdGFfczNjX3RmX2xvYWQoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQljb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCXVuc2lnbmVkIGludCBpc19hZGRyID0gdGYtPmZsYWdzICYgQVRBX1RGTEFHX0lTQUREUjsKKworCWlmICh0Zi0+Y3RsICE9IGFwLT5sYXN0X2N0bCkgeworCQlhdGFfb3V0YihhcC0+aG9zdCwgdGYtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJCWFwLT5sYXN0X2N0bCA9IHRmLT5jdGw7CisJCWF0YV93YWl0X2lkbGUoYXApOworCX0KKworCWlmIChpc19hZGRyICYmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpKSB7CisJCWF0YV9vdXRiKGFwLT5ob3N0LCB0Zi0+aG9iX2ZlYXR1cmUsIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJYXRhX291dGIoYXAtPmhvc3QsIHRmLT5ob2JfbnNlY3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCWF0YV9vdXRiKGFwLT5ob3N0LCB0Zi0+aG9iX2xiYWwsIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJYXRhX291dGIoYXAtPmhvc3QsIHRmLT5ob2JfbGJhbSwgaW9hZGRyLT5sYmFtX2FkZHIpOworCQlhdGFfb3V0YihhcC0+aG9zdCwgdGYtPmhvYl9sYmFoLCBpb2FkZHItPmxiYWhfYWRkcik7CisJfQorCisJaWYgKGlzX2FkZHIpIHsKKwkJYXRhX291dGIoYXAtPmhvc3QsIHRmLT5mZWF0dXJlLCBpb2FkZHItPmZlYXR1cmVfYWRkcik7CisJCWF0YV9vdXRiKGFwLT5ob3N0LCB0Zi0+bnNlY3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCWF0YV9vdXRiKGFwLT5ob3N0LCB0Zi0+bGJhbCwgaW9hZGRyLT5sYmFsX2FkZHIpOworCQlhdGFfb3V0YihhcC0+aG9zdCwgdGYtPmxiYW0sIGlvYWRkci0+bGJhbV9hZGRyKTsKKwkJYXRhX291dGIoYXAtPmhvc3QsIHRmLT5sYmFoLCBpb2FkZHItPmxiYWhfYWRkcik7CisJfQorCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19ERVZJQ0UpCisJCWF0YV9vdXRiKGFwLT5ob3N0LCB0Zi0+ZGV2aWNlLCBpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWF0YV93YWl0X2lkbGUoYXApOworfQorCisvKgorICogcGF0YV9zM2NfdGZfcmVhZCAtIGlucHV0IGRldmljZSdzIEFUQSB0YXNrZmlsZSBzaGFkb3cgcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIHBhdGFfczNjX3RmX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKworCXRmLT5mZWF0dXJlID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5lcnJvcl9hZGRyKTsKKwl0Zi0+bnNlY3QgPSBhdGFfaW5iKGFwLT5ob3N0LCBpb2FkZHItPm5zZWN0X2FkZHIpOworCXRmLT5sYmFsID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5sYmFsX2FkZHIpOworCXRmLT5sYmFtID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5sYmFtX2FkZHIpOworCXRmLT5sYmFoID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5sYmFoX2FkZHIpOworCXRmLT5kZXZpY2UgPSBhdGFfaW5iKGFwLT5ob3N0LCBpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKKwkJYXRhX291dGIoYXAtPmhvc3QsIHRmLT5jdGwgfCBBVEFfSE9CLCBpb2FkZHItPmN0bF9hZGRyKTsKKwkJdGYtPmhvYl9mZWF0dXJlID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5lcnJvcl9hZGRyKTsKKwkJdGYtPmhvYl9uc2VjdCA9IGF0YV9pbmIoYXAtPmhvc3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCXRmLT5ob2JfbGJhbCA9IGF0YV9pbmIoYXAtPmhvc3QsIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJdGYtPmhvYl9sYmFtID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5sYmFtX2FkZHIpOworCQl0Zi0+aG9iX2xiYWggPSBhdGFfaW5iKGFwLT5ob3N0LCBpb2FkZHItPmxiYWhfYWRkcik7CisJCWF0YV9vdXRiKGFwLT5ob3N0LCB0Zi0+Y3RsLCBpb2FkZHItPmN0bF9hZGRyKTsKKwkJYXAtPmxhc3RfY3RsID0gdGYtPmN0bDsKKwl9Cit9CisKKy8qCisgKiBwYXRhX3MzY19leGVjX2NvbW1hbmQgLSBpc3N1ZSBBVEEgY29tbWFuZCB0byBob3N0IGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHZvaWQgcGF0YV9zM2NfZXhlY19jb21tYW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJYXRhX291dGIoYXAtPmhvc3QsIHRmLT5jb21tYW5kLCBhcC0+aW9hZGRyLmNvbW1hbmRfYWRkcik7CisJYXRhX3NmZl9wYXVzZShhcCk7Cit9CisKKy8qCisgKiBwYXRhX3MzY19jaGVja19zdGF0dXMgLSBSZWFkIGRldmljZSBzdGF0dXMgcmVnaXN0ZXIKKyAqLworc3RhdGljIHU4IHBhdGFfczNjX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBhdGFfaW5iKGFwLT5ob3N0LCBhcC0+aW9hZGRyLnN0YXR1c19hZGRyKTsKK30KKworLyoKKyAqIHBhdGFfczNjX2NoZWNrX2FsdHN0YXR1cyAtIFJlYWQgYWx0ZXJuYXRlIGRldmljZSBzdGF0dXMgcmVnaXN0ZXIKKyAqLworc3RhdGljIHU4IHBhdGFfczNjX2NoZWNrX2FsdHN0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBhdGFfaW5iKGFwLT5ob3N0LCBhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyKTsKK30KKworLyoKKyAqIHBhdGFfczNjX2RhdGFfeGZlciAtIFRyYW5zZmVyIGRhdGEgYnkgUElPCisgKi8KK3Vuc2lnbmVkIGludCBwYXRhX3MzY19kYXRhX3hmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCXVuc2lnbmVkIGludCBidWZsZW4sIGludCBydykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5saW5rLT5hcDsKKwlzdHJ1Y3QgczNjX2lkZV9pbmZvICppbmZvID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKmRhdGFfYWRkciA9IGFwLT5pb2FkZHIuZGF0YV9hZGRyOworCXVuc2lnbmVkIGludCB3b3JkcyA9IGJ1ZmxlbiA+PiAxLCBpOworCXUxNiAqZGF0YV9wdHIgPSAodTE2ICopYnVmOworCisJLyogUmVxdWlyZXMgd2FpdCBzYW1lIGFzIGluIGF0YV9pbmIvYXRhX291dGIgKi8KKwlpZiAocncgPT0gUkVBRCkKKwkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyssIGRhdGFfcHRyKyspIHsKKwkJCXdhaXRfZm9yX2hvc3RfcmVhZHkoaW5mbyk7CisJCQkodm9pZCkgcmVhZHcoZGF0YV9hZGRyKTsKKwkJCXdhaXRfZm9yX2hvc3RfcmVhZHkoaW5mbyk7CisJCQkqZGF0YV9wdHIgPSByZWFkdyhpbmZvLT5pZGVfYWRkcgorCQkJCQkrIFMzQ19BVEFfUElPX1JEQVRBKTsKKwkJfQorCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyssIGRhdGFfcHRyKyspIHsKKwkJCXdhaXRfZm9yX2hvc3RfcmVhZHkoaW5mbyk7CisJCQl3cml0ZXcoKmRhdGFfcHRyLCBkYXRhX2FkZHIpOworCQl9CisKKwlpZiAoYnVmbGVuICYgMHgwMSkKKwkJZGV2X2VycihhcC0+ZGV2LCAidW5leHBlY3RlZCB0cmFpbGluZyBkYXRhXG4iKTsKKworCXJldHVybiB3b3JkcyA8PCAxOworfQorCisvKgorICogcGF0YV9zM2NfZGV2X3NlbGVjdCAtIFNlbGVjdCBkZXZpY2Ugb24gQVRBIGJ1cworICovCitzdGF0aWMgdm9pZCBwYXRhX3MzY19kZXZfc2VsZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkZXZpY2UpCit7CisJdTggdG1wID0gQVRBX0RFVklDRV9PQlM7CisKKwlpZiAoZGV2aWNlICE9IDApCisJCXRtcCB8PSBBVEFfREVWMTsKKworCWF0YV9vdXRiKGFwLT5ob3N0LCB0bXAsIGFwLT5pb2FkZHIuZGV2aWNlX2FkZHIpOworCWF0YV9zZmZfcGF1c2UoYXApOworfQorCisvKgorICogcGF0YV9zM2NfZGV2Y2hrIC0gUEFUQSBkZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0YV9zM2NfZGV2Y2hrKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJdW5zaWduZWQgaW50IGRldmljZSkKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCXU4IG5zZWN0LCBsYmFsOworCisJcGF0YV9zM2NfZGV2X3NlbGVjdChhcCwgZGV2aWNlKTsKKworCWF0YV9vdXRiKGFwLT5ob3N0LCAweDU1LCBpb2FkZHItPm5zZWN0X2FkZHIpOworCWF0YV9vdXRiKGFwLT5ob3N0LCAweGFhLCBpb2FkZHItPmxiYWxfYWRkcik7CisKKwlhdGFfb3V0YihhcC0+aG9zdCwgMHhhYSwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlhdGFfb3V0YihhcC0+aG9zdCwgMHg1NSwgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJYXRhX291dGIoYXAtPmhvc3QsIDB4NTUsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJYXRhX291dGIoYXAtPmhvc3QsIDB4YWEsIGlvYWRkci0+bGJhbF9hZGRyKTsKKworCW5zZWN0ID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlsYmFsID0gYXRhX2luYihhcC0+aG9zdCwgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJaWYgKChuc2VjdCA9PSAweDU1KSAmJiAobGJhbCA9PSAweGFhKSkKKwkJcmV0dXJuIDE7CS8qIHdlIGZvdW5kIGEgZGV2aWNlICovCisKKwlyZXR1cm4gMDsJCS8qIG5vdGhpbmcgZm91bmQgKi8KK30KKworLyoKKyAqIHBhdGFfczNjX3dhaXRfYWZ0ZXJfcmVzZXQgLSB3YWl0IGZvciBkZXZpY2VzIHRvIGJlY29tZSByZWFkeSBhZnRlciByZXNldAorICovCitzdGF0aWMgaW50IHBhdGFfczNjX3dhaXRfYWZ0ZXJfcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQl1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQoreworCWludCByYzsKKworCW1zbGVlcChBVEFfV0FJVF9BRlRFUl9SRVNFVCk7CisKKwkvKiBhbHdheXMgY2hlY2sgcmVhZGluZXNzIG9mIHRoZSBtYXN0ZXIgZGV2aWNlICovCisJcmMgPSBhdGFfc2ZmX3dhaXRfcmVhZHkobGluaywgZGVhZGxpbmUpOworCS8qIC1FTk9ERVYgbWVhbnMgdGhlIG9kZCBjbG93biBmb3Jnb3QgdGhlIEQ3IHB1bGxkb3duIHJlc2lzdG9yCisJICogYW5kIFRGIHN0YXR1cyBpcyAweGZmLCBiYWlsIG91dCBvbiBpdCB0b28uCisJICovCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBhdGFfczNjX2J1c19zb2Z0cmVzZXQgLSBQQVRBIGRldmljZSBzb2Z0d2FyZSByZXNldAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBhdGFfczNjX2J1c19zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCisJLyogc29mdHdhcmUgcmVzZXQuICBjYXVzZXMgZGV2MCB0byBiZSBzZWxlY3RlZCAqLworCWF0YV9vdXRiKGFwLT5ob3N0LCBhcC0+Y3RsLCBpb2FkZHItPmN0bF9hZGRyKTsKKwl1ZGVsYXkoMjApOworCWF0YV9vdXRiKGFwLT5ob3N0LCBhcC0+Y3RsIHwgQVRBX1NSU1QsIGlvYWRkci0+Y3RsX2FkZHIpOworCXVkZWxheSgyMCk7CisJYXRhX291dGIoYXAtPmhvc3QsIGFwLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOworCWFwLT5sYXN0X2N0bCA9IGFwLT5jdGw7CisKKwlyZXR1cm4gcGF0YV9zM2Nfd2FpdF9hZnRlcl9yZXNldCgmYXAtPmxpbmssIGRlYWRsaW5lKTsKK30KKworLyoKKyAqIHBhdGFfczNjX3NvZnRyZXNldCAtIHJlc2V0IGhvc3QgcG9ydCB2aWEgQVRBIFNSU1QKKyAqLworc3RhdGljIGludCBwYXRhX3MzY19zb2Z0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMsCisJCQkgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CisJdW5zaWduZWQgaW50IGRldm1hc2sgPSAwOworCWludCByYzsKKwl1OCBlcnI7CisKKwkvKiBkZXRlcm1pbmUgaWYgZGV2aWNlIDAgaXMgcHJlc2VudCAqLworCWlmIChwYXRhX3MzY19kZXZjaGsoYXAsIDApKQorCQlkZXZtYXNrIHw9ICgxIDw8IDApOworCisJLyogc2VsZWN0IGRldmljZSAwIGFnYWluICovCisJcGF0YV9zM2NfZGV2X3NlbGVjdChhcCwgMCk7CisKKwkvKiBpc3N1ZSBidXMgcmVzZXQgKi8KKwlyYyA9IHBhdGFfczNjX2J1c19zb2Z0cmVzZXQoYXAsIGRlYWRsaW5lKTsKKwkvKiBpZiBsaW5rIGlzIG9jY3VwaWVkLCAtRU5PREVWIHRvbyBpcyBhbiBlcnJvciAqLworCWlmIChyYyAmJiByYyAhPSAtRU5PREVWKSB7CisJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwgIlNSU1QgZmFpbGVkIChlcnJubz0lZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIGRldGVybWluZSBieSBzaWduYXR1cmUgd2hldGhlciB3ZSBoYXZlIEFUQSBvciBBVEFQSSBkZXZpY2VzICovCisJY2xhc3Nlc1swXSA9IGF0YV9zZmZfZGV2X2NsYXNzaWZ5KCZhcC0+bGluay5kZXZpY2VbMF0sCisJCQkJCSAgZGV2bWFzayAmICgxIDw8IDApLCAmZXJyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogcGF0YV9zM2Nfc2V0X2RldmN0bCAtIFdyaXRlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkIHBhdGFfczNjX3NldF9kZXZjdGwoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggY3RsKQoreworCWF0YV9vdXRiKGFwLT5ob3N0LCBjdGwsIGFwLT5pb2FkZHIuY3RsX2FkZHIpOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwYXRhX3MzY19zaHQgPSB7CisJQVRBX1BJT19TSFQoRFJWX05BTUUpLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBhdGFfczNjX3BvcnRfb3BzID0geworCS5pbmhlcml0cwkJPSAmYXRhX3NmZl9wb3J0X29wcywKKwkuc2ZmX2NoZWNrX3N0YXR1cwk9IHBhdGFfczNjX2NoZWNrX3N0YXR1cywKKwkuc2ZmX2NoZWNrX2FsdHN0YXR1cyAgICA9IHBhdGFfczNjX2NoZWNrX2FsdHN0YXR1cywKKwkuc2ZmX3RmX2xvYWQJCT0gcGF0YV9zM2NfdGZfbG9hZCwKKwkuc2ZmX3RmX3JlYWQJCT0gcGF0YV9zM2NfdGZfcmVhZCwKKwkuc2ZmX2RhdGFfeGZlcgkJPSBwYXRhX3MzY19kYXRhX3hmZXIsCisJLnNmZl9leGVjX2NvbW1hbmQJPSBwYXRhX3MzY19leGVjX2NvbW1hbmQsCisJLnNmZl9kZXZfc2VsZWN0ICAgICAgICAgPSBwYXRhX3MzY19kZXZfc2VsZWN0LAorCS5zZmZfc2V0X2RldmN0bCAgICAgICAgID0gcGF0YV9zM2Nfc2V0X2RldmN0bCwKKwkuc29mdHJlc2V0CQk9IHBhdGFfczNjX3NvZnRyZXNldCwKKwkuc2V0X3Bpb21vZGUJCT0gcGF0YV9zM2Nfc2V0X3Bpb21vZGUsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGF0YV9zNXBfcG9ydF9vcHMgPSB7CisJLmluaGVyaXRzCQk9ICZhdGFfc2ZmX3BvcnRfb3BzLAorCS5zZXRfcGlvbW9kZQkJPSBwYXRhX3MzY19zZXRfcGlvbW9kZSwKK307CisKK3N0YXRpYyB2b2lkIHBhdGFfczNjX2VuYWJsZSh2b2lkICpzM2NfaWRlX3JlZ2Jhc2UsIGJvb2wgc3RhdGUpCit7CisJdTMyIHRlbXAgPSByZWFkbChzM2NfaWRlX3JlZ2Jhc2UgKyBTM0NfQVRBX0NUUkwpOworCXRlbXAgPSBzdGF0ZSA/ICh0ZW1wIHwgMSkgOiAodGVtcCAmIH4xKTsKKwl3cml0ZWwodGVtcCwgczNjX2lkZV9yZWdiYXNlICsgUzNDX0FUQV9DVFJMKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHBhdGFfczNjX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8gPSBob3N0LT5wcml2YXRlX2RhdGE7CisJdTMyIHJlZzsKKworCXJlZyA9IHJlYWRsKGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9JUlEpOworCXdyaXRlbChyZWcsIGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9JUlEpOworCisJcmV0dXJuIGF0YV9zZmZfaW50ZXJydXB0KGlycSwgZGV2X2luc3RhbmNlKTsKK30KKworc3RhdGljIHZvaWQgcGF0YV9zM2NfaHdpbml0KHN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8sCisJCQkJc3RydWN0IHMzY19pZGVfcGxhdGRhdGEgKnBkYXRhKQoreworCXN3aXRjaCAoaW5mby0+Y3B1X3R5cGUpIHsKKwljYXNlIFRZUEVfUzNDNjRYWDoKKwkJLyogQ29uZmlndXJlIGFzIGJpZyBlbmRpYW4gKi8KKwkJcGF0YV9zM2NfY2ZnX21vZGUoaW5mby0+c2ZyX2FkZHIpOworCQlwYXRhX3MzY19zZXRfZW5kaWFuKGluZm8tPmlkZV9hZGRyLCAxKTsKKwkJcGF0YV9zM2NfZW5hYmxlKGluZm8tPmlkZV9hZGRyLCB0cnVlKTsKKwkJbXNsZWVwKDEwMCk7CisKKwkJLyogUmVtb3ZlIElSUSBTdGF0dXMgKi8KKwkJd3JpdGVsKDB4MWYsIGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9JUlEpOworCQl3cml0ZWwoMHgxYiwgaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX0lSUV9NU0spOworCQlicmVhazsKKworCWNhc2UgVFlQRV9TNVBDMTAwOgorCQlwYXRhX3MzY19jZmdfbW9kZShpbmZvLT5zZnJfYWRkcik7CisJCS8qIEZBTExUSFJPVUdIICovCisKKwljYXNlIFRZUEVfUzVQVjIxMDoKKwkJLyogQ29uZmlndXJlIGFzIGxpdHRsZSBlbmRpYW4gKi8KKwkJcGF0YV9zM2Nfc2V0X2VuZGlhbihpbmZvLT5pZGVfYWRkciwgMCk7CisJCXBhdGFfczNjX2VuYWJsZShpbmZvLT5pZGVfYWRkciwgdHJ1ZSk7CisJCW1zbGVlcCgxMDApOworCisJCS8qIFJlbW92ZSBJUlEgU3RhdHVzICovCisJCXdyaXRlbCgweDNmLCBpbmZvLT5pZGVfYWRkciArIFMzQ19BVEFfSVJRKTsKKwkJd3JpdGVsKDB4M2YsIGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9JUlFfTVNLKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBhdGFfczNjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHMzY19pZGVfcGxhdGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgczNjX2lkZV9pbmZvICppbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OworCWVudW0gczNjX2NwdV90eXBlIGNwdV90eXBlOworCWludCByZXQ7CisKKwljcHVfdHlwZSA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOworCisJaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5mby0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBtZW0gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKGRldiwgcmVzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKHJlcyksIERSVl9OQU1FKSkgeworCQlkZXZfZXJyKGRldiwgImVycm9yIHJlcXVlc3RpbmcgcmVnaXN0ZXIgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpbmZvLT5pZGVfYWRkciA9IGRldm1faW9yZW1hcChkZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFpbmZvLT5pZGVfYWRkcikgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBtYXAgSU8gYmFzZSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5mby0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiY2Zjb24iKTsKKwlpZiAoSVNfRVJSKGluZm8tPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGFjY2VzcyB0byBjZiBjb250cm9sbGVyIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihpbmZvLT5jbGspOworCQlpbmZvLT5jbGsgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCWNsa19lbmFibGUoaW5mby0+Y2xrKTsKKworCS8qIGluaXQgYXRhIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2MoZGV2LCAxKTsKKwlpZiAoIWhvc3QpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaWRlIGhvc3RcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHN0b3BfY2xrOworCX0KKworCWFwID0gaG9zdC0+cG9ydHNbMF07CisJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX01NSU87CisJYXAtPnBpb19tYXNrID0gQVRBX1BJTzQ7CisKKwlpZiAoY3B1X3R5cGUgPT0gVFlQRV9TM0M2NFhYKSB7CisJCWFwLT5vcHMgPSAmcGF0YV9zM2NfcG9ydF9vcHM7CisJCWluZm8tPnNmcl9hZGRyID0gaW5mby0+aWRlX2FkZHIgKyAweDE4MDA7CisJCWluZm8tPmlkZV9hZGRyICs9IDB4MTkwMDsKKwkJaW5mby0+Zmlmb19zdGF0dXNfcmVnID0gMHg5NDsKKwl9IGVsc2UgaWYgKGNwdV90eXBlID09IFRZUEVfUzVQQzEwMCkgeworCQlhcC0+b3BzID0gJnBhdGFfczVwX3BvcnRfb3BzOworCQlpbmZvLT5zZnJfYWRkciA9IGluZm8tPmlkZV9hZGRyICsgMHgxODAwOworCQlpbmZvLT5pZGVfYWRkciArPSAweDE5MDA7CisJCWluZm8tPmZpZm9fc3RhdHVzX3JlZyA9IDB4ODQ7CisJfSBlbHNlIHsKKwkJYXAtPm9wcyA9ICZwYXRhX3M1cF9wb3J0X29wczsKKwkJaW5mby0+Zmlmb19zdGF0dXNfcmVnID0gMHg4NDsKKwl9CisKKwlpbmZvLT5jcHVfdHlwZSA9IGNwdV90eXBlOworCisJaWYgKGluZm8tPmlycSA8PSAwKSB7CisJCWFwLT5mbGFncyB8PSBBVEFfRkxBR19QSU9fUE9MTElORzsKKwkJaW5mby0+aXJxID0gMDsKKwkJYXRhX3BvcnRfZGVzYyhhcCwgIm5vIElSUSwgdXNpbmcgUElPIHBvbGxpbmdcbiIpOworCX0KKworCWFwLT5pb2FkZHIuY21kX2FkZHIgPSAgaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX0NNRDsKKwlhcC0+aW9hZGRyLmRhdGFfYWRkciA9IGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9QSU9fRFRSOworCWFwLT5pb2FkZHIuZXJyb3JfYWRkciA9IGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9QSU9fRkVEOworCWFwLT5pb2FkZHIuZmVhdHVyZV9hZGRyID0gaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX1BJT19GRUQ7CisJYXAtPmlvYWRkci5uc2VjdF9hZGRyID0gaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX1BJT19TQ1I7CisJYXAtPmlvYWRkci5sYmFsX2FkZHIgPSBpbmZvLT5pZGVfYWRkciArIFMzQ19BVEFfUElPX0xMUjsKKwlhcC0+aW9hZGRyLmxiYW1fYWRkciA9IGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9QSU9fTE1SOworCWFwLT5pb2FkZHIubGJhaF9hZGRyID0gaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX1BJT19MSFI7CisJYXAtPmlvYWRkci5kZXZpY2VfYWRkciA9IGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9QSU9fRFZSOworCWFwLT5pb2FkZHIuc3RhdHVzX2FkZHIgPSBpbmZvLT5pZGVfYWRkciArIFMzQ19BVEFfUElPX0NTRDsKKwlhcC0+aW9hZGRyLmNvbW1hbmRfYWRkciA9IGluZm8tPmlkZV9hZGRyICsgUzNDX0FUQV9QSU9fQ1NEOworCWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIgPSBpbmZvLT5pZGVfYWRkciArIFMzQ19BVEFfUElPX0RBRDsKKwlhcC0+aW9hZGRyLmN0bF9hZGRyID0gaW5mby0+aWRlX2FkZHIgKyBTM0NfQVRBX1BJT19EQUQ7CisKKwlhdGFfcG9ydF9kZXNjKGFwLCAibW1pbyBjbWQgMHglbGx4ICIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQpOworCisJaG9zdC0+cHJpdmF0ZV9kYXRhID0gaW5mbzsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+c2V0dXBfZ3BpbykKKwkJcGRhdGEtPnNldHVwX2dwaW8oKTsKKworCS8qIFNldCBlbmRpYW5uZXNzIGFuZCBlbmFibGUgdGhlIGludGVyZmFjZSAqLworCXBhdGFfczNjX2h3aW5pdChpbmZvLCBwZGF0YSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKKworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpbmZvLT5pcnEsCisJCQlpbmZvLT5pcnEgPyBwYXRhX3MzY19pcnEgOiBOVUxMLAorCQkJMCwgJnBhdGFfczNjX3NodCk7CisKK3N0b3BfY2xrOgorCWNsa19kaXNhYmxlKGluZm8tPmNsayk7CisJY2xrX3B1dChpbmZvLT5jbGspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHBhdGFfczNjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzM2NfaWRlX2luZm8gKmluZm8gPSBob3N0LT5wcml2YXRlX2RhdGE7CisKKwlhdGFfaG9zdF9kZXRhY2goaG9zdCk7CisKKwljbGtfZGlzYWJsZShpbmZvLT5jbGspOworCWNsa19wdXQoaW5mby0+Y2xrKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHBhdGFfczNjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiBhdGFfaG9zdF9zdXNwZW5kKGhvc3QsIFBNU0dfU1VTUEVORCk7Cit9CisKK3N0YXRpYyBpbnQgcGF0YV9zM2NfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHMzY19pZGVfcGxhdGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHMzY19pZGVfaW5mbyAqaW5mbyA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKworCXBhdGFfczNjX2h3aW5pdChpbmZvLCBwZGF0YSk7CisJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwYXRhX3MzY19wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBwYXRhX3MzY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGF0YV9zM2NfcmVzdW1lLAorfTsKKyNlbmRpZgorCisvKiBkcml2ZXIgZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgcGF0YV9zM2NfZHJpdmVyX2lkc1tdID0geworCXsKKwkJLm5hbWUJCT0gInMzYzY0eHgtcGF0YSIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfUzNDNjRYWCwKKwl9LCB7CisJCS5uYW1lCQk9ICJzNXBjMTAwLXBhdGEiLAorCQkuZHJpdmVyX2RhdGEJPSBUWVBFX1M1UEMxMDAsCisJfSwgeworCQkubmFtZQkJPSAiczVwdjIxMC1wYXRhIiwKKwkJLmRyaXZlcl9kYXRhCT0gVFlQRV9TNVBWMjEwLAorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBwYXRhX3MzY19kcml2ZXJfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGF0YV9zM2NfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AocGF0YV9zM2NfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBwYXRhX3MzY19kcml2ZXJfaWRzLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IERSVl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtCT0gJnBhdGFfczNjX3BtX29wcywKKyNlbmRpZgorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwYXRhX3MzY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmcGF0YV9zM2NfZHJpdmVyLCBwYXRhX3MzY19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYXRhX3MzY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhdGFfczNjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhdGFfczNjX2luaXQpOworbW9kdWxlX2V4aXQocGF0YV9zM2NfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFiaGlsYXNoIEtlc2F2YW4sIDxhLmtlc2F2YW5Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIFNhbXN1bmcgUEFUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zY2MuYwppbmRleCBkOWRiM2Y4Li5mZTM2OTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKQEAgLTE2OCw4ICsxNjgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjY19wY2lfdGJsW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfVE9TSElCQV8yLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfU0NDX0FUQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkRFVklDRShUT1NISUJBXzIsIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9TQ0NfQVRBKSwgMH0sCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI0YzFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwpAQCAtMCwwICsxLDE3NTYgQEAKKy8qCisgKiBkcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCisgKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBDb3JlcyAoRFdDKSBTQVRBIGhvc3QgZHJpdmVyCisgKgorICogQXV0aG9yOiBNYXJrIE1pZXNmZWxkIDxtbWllc2ZlbGRAYW1jYy5jb20+CisgKgorICogUG9ydGVkIGZyb20gMi42LjE5LjIgdG8gMi42LjI1LzI2IGJ5IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKyAqIENvcHlyaWdodCAyMDA4IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBCYXNlZCBvbiB2ZXJzaW9ucyBwcm92aWRlZCBieSBBTUNDIGFuZCBTeW5vcHN5cyB3aGljaCBhcmU6CisgKiAgICAgICAgICBDb3B5cmlnaHQgMjAwNiBBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uCisgKiAgICAgICAgICBDT1BZUklHSFQgKEMpIDIwMDUgIFNZTk9QU1lTLCBJTkMuICBBTEwgUklHSFRTIFJFU0VSVkVECisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZkZWYgQ09ORklHX1NBVEFfRFdDX0RFQlVHCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQVRBX0RXQ19WREVCVUcKKyNkZWZpbmUgVkVSQk9TRV9ERUJVRworI2RlZmluZSBERUJVR19OQ1EKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImxpYmF0YS5oIgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorCisjZGVmaW5lIERSVl9OQU1FICAgICAgICAic2F0YS1kd2MiCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICAiMS4wIgorCisvKiBTQVRBIERNQSBkcml2ZXIgR2xvYmFscyAqLworI2RlZmluZSBETUFfTlVNX0NIQU5TCQkxCisjZGVmaW5lIERNQV9OVU1fQ0hBTl9SRUdTCTgKKworLyogU0FUQSBETUEgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUhCX0RNQV9CUlNUX0RGTFQJNjQJLyogMTYgZGF0YSBpdGVtcyBidXJzdCBsZW5ndGgqLworCitzdHJ1Y3QgZG1hcmVnIHsKKwl1MzIgbG93OwkJLyogTG93IGJpdHMgMC0zMSAqLworCXUzMiBoaWdoOwkJLyogSGlnaCBiaXRzIDMyLTYzICovCit9OworCisvKiBETUEgUGVyIENoYW5uZWwgcmVnaXN0ZXJzICovCitzdHJ1Y3QgZG1hX2NoYW5fcmVncyB7CisJc3RydWN0IGRtYXJlZyBzYXI7CS8qIFNvdXJjZSBBZGRyZXNzICovCisJc3RydWN0IGRtYXJlZyBkYXI7CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgZG1hcmVnIGxscDsJLyogTGlua2VkIExpc3QgUG9pbnRlciAqLworCXN0cnVjdCBkbWFyZWcgY3RsOwkvKiBDb250cm9sICovCisJc3RydWN0IGRtYXJlZyBzc3RhdDsJLyogU291cmNlIFN0YXR1cyBub3QgaW1wbGVtZW50ZWQgaW4gY29yZSAqLworCXN0cnVjdCBkbWFyZWcgZHN0YXQ7CS8qIERlc3RpbmF0aW9uIFN0YXR1cyBub3QgaW1wbGVtZW50ZWQgaW4gY29yZSovCisJc3RydWN0IGRtYXJlZyBzc3RhdGFyOwkvKiBTb3VyY2UgU3RhdHVzIEFkZHJlc3Mgbm90IGltcGwgaW4gY29yZSAqLworCXN0cnVjdCBkbWFyZWcgZHN0YXRhcjsJLyogRGVzdGluYXRpb24gU3RhdHVzIEFkZHJlc3Mgbm90IGltcGxlbWVudGUgKi8KKwlzdHJ1Y3QgZG1hcmVnIGNmZzsJLyogQ29uZmlnICovCisJc3RydWN0IGRtYXJlZyBzZ3I7CS8qIFNvdXJjZSBHYXRoZXIgKi8KKwlzdHJ1Y3QgZG1hcmVnIGRzcjsJLyogRGVzdGluYXRpb24gU2NhdHRlciAqLworfTsKKworLyogR2VuZXJpYyBJbnRlcnJ1cHQgUmVnaXN0ZXJzICovCitzdHJ1Y3QgZG1hX2ludGVycnVwdF9yZWdzIHsKKwlzdHJ1Y3QgZG1hcmVnIHRmcjsJLyogVHJhbnNmZXIgSW50ZXJydXB0ICovCisJc3RydWN0IGRtYXJlZyBibG9jazsJLyogQmxvY2sgSW50ZXJydXB0ICovCisJc3RydWN0IGRtYXJlZyBzcmN0cmFuOwkvKiBTb3VyY2UgVHJhbnNmZXIgSW50ZXJydXB0ICovCisJc3RydWN0IGRtYXJlZyBkc3R0cmFuOwkvKiBEZXN0IFRyYW5zZmVyIEludGVycnVwdCAqLworCXN0cnVjdCBkbWFyZWcgZXJyb3I7CS8qIEVycm9yICovCit9OworCitzdHJ1Y3QgYWhiX2RtYV9yZWdzIHsKKwlzdHJ1Y3QgZG1hX2NoYW5fcmVncwljaGFuX3JlZ3NbRE1BX05VTV9DSEFOX1JFR1NdOworCXN0cnVjdCBkbWFfaW50ZXJydXB0X3JlZ3MgaW50ZXJydXB0X3JhdzsJLyogUmF3IEludGVycnVwdCAqLworCXN0cnVjdCBkbWFfaW50ZXJydXB0X3JlZ3MgaW50ZXJydXB0X3N0YXR1czsJLyogSW50ZXJydXB0IFN0YXR1cyAqLworCXN0cnVjdCBkbWFfaW50ZXJydXB0X3JlZ3MgaW50ZXJydXB0X21hc2s7CS8qIEludGVycnVwdCBNYXNrICovCisJc3RydWN0IGRtYV9pbnRlcnJ1cHRfcmVncyBpbnRlcnJ1cHRfY2xlYXI7CS8qIEludGVycnVwdCBDbGVhciAqLworCXN0cnVjdCBkbWFyZWcJCXN0YXR1c0ludDsJLyogSW50ZXJydXB0IGNvbWJpbmVkKi8KKwlzdHJ1Y3QgZG1hcmVnCQlycV9zcmNyZWc7CS8qIFNyYyBUcmFucyBSZXEgKi8KKwlzdHJ1Y3QgZG1hcmVnCQlycV9kc3RyZWc7CS8qIERzdCBUcmFucyBSZXEgKi8KKwlzdHJ1Y3QgZG1hcmVnCQlycV9zZ2xfc3JjcmVnOwkvKiBTbmdsIFNyYyBUcmFucyBSZXEqLworCXN0cnVjdCBkbWFyZWcJCXJxX3NnbF9kc3RyZWc7CS8qIFNuZ2wgRHN0IFRyYW5zIFJlcSovCisJc3RydWN0IGRtYXJlZwkJcnFfbHN0X3NyY3JlZzsJLyogTGFzdCBTcmMgVHJhbnMgUmVxKi8KKwlzdHJ1Y3QgZG1hcmVnCQlycV9sc3RfZHN0cmVnOwkvKiBMYXN0IERzdCBUcmFucyBSZXEqLworCXN0cnVjdCBkbWFyZWcJCWRtYV9jZmc7CQkvKiBETUEgQ29uZmlnICovCisJc3RydWN0IGRtYXJlZwkJZG1hX2NoYW5fZW47CQkvKiBETUEgQ2hhbm5lbCBFbmFibGUqLworCXN0cnVjdCBkbWFyZWcJCWRtYV9pZDsJCQkvKiBETUEgSUQgKi8KKwlzdHJ1Y3QgZG1hcmVnCQlkbWFfdGVzdDsJCS8qIERNQSBUZXN0ICovCisJc3RydWN0IGRtYXJlZwkJcmVzMTsJCQkvKiByZXNlcnZlZCAqLworCXN0cnVjdCBkbWFyZWcJCXJlczI7CQkJLyogcmVzZXJ2ZWQgKi8KKwkvKgorCSAqIERNQSBDb21wIFBhcmFtcworCSAqIFBhcmFtIDYgPSBkbWFfcGFyYW1bMF0sIFBhcmFtIDUgPSBkbWFfcGFyYW1bMV0sCisJICogUGFyYW0gNCA9IGRtYV9wYXJhbVsyXSAuLi4KKwkgKi8KKwlzdHJ1Y3QgZG1hcmVnCQlkbWFfcGFyYW1zWzZdOworfTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIGxpbmtlZCBsaXN0IGl0ZW0gKi8KK3N0cnVjdCBsbGkgeworCXUzMgkJc2FyOwkJLyogU291cmNlIEFkZHJlc3MgKi8KKwl1MzIJCWRhcjsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwl1MzIJCWxscDsJCS8qIExpbmtlZCBMaXN0IFBvaW50ZXIgKi8KKwlzdHJ1Y3QgZG1hcmVnCWN0bDsJCS8qIENvbnRyb2wgKi8KKwlzdHJ1Y3QgZG1hcmVnCWRzdGF0OwkJLyogRGVzdGluYXRpb24gU3RhdHVzICovCit9OworCitlbnVtIHsKKwlTQVRBX0RXQ19ETUFDX0xMSV9TWiA9CShzaXplb2Yoc3RydWN0IGxsaSkpLAorCVNBVEFfRFdDX0RNQUNfTExJX05VTSA9CTI1NiwKKwlTQVRBX0RXQ19ETUFDX0xMSV9UQkxfU1ogPSAoU0FUQV9EV0NfRE1BQ19MTElfU1ogKiBcCisJCQkJCVNBVEFfRFdDX0RNQUNfTExJX05VTSksCisJU0FUQV9EV0NfRE1BQ19UV0lEVEhfQllURVMgPSA0LAorCVNBVEFfRFdDX0RNQUNfQ1RSTF9UU0laRV9NQVggPSAoMHgwMDAwMDgwMCAqIFwKKwkJCQkJCVNBVEFfRFdDX0RNQUNfVFdJRFRIX0JZVEVTKSwKK307CisKKy8qIERNQSBSZWdpc3RlciBPcGVyYXRpb24gQml0cyAqLworZW51bSB7CisJRE1BX0VOCT0JCTB4MDAwMDAwMDEsIC8qIEVuYWJsZSBBSEIgRE1BICovCisJRE1BX0NUTF9MTFBfU1JDRU4gPQkweDEwMDAwMDAwLCAvKiBCbGsgY2hhaW4gZW5hYmxlIFNyYyAqLworCURNQV9DVExfTExQX0RTVEVOID0JMHgwODAwMDAwMCwgLyogQmxrIGNoYWluIGVuYWJsZSBEc3QgKi8KK307CisKKyNkZWZpbmUJRE1BX0NUTF9CTEtfVFMoc2l6ZSkJKChzaXplKSAmIDB4MDAwMDAwRkZGKQkvKiBCbGsgVHJhbnNmZXIgc2l6ZSAqLworI2RlZmluZSBETUFfQ0hBTk5FTChjaCkJCSgweDAwMDAwMDAxIDw8IChjaCkpCS8qIFNlbGVjdCBjaGFubmVsICovCisJLyogRW5hYmxlIGNoYW5uZWwgKi8KKyNkZWZpbmUJRE1BX0VOQUJMRV9DSEFOKGNoKQkoKDB4MDAwMDAwMDEgPDwgKGNoKSkgfAkJCVwKKwkJCQkgKCgweDAwMDAwMDAwMSA8PCAoY2gpKSA8PCA4KSkKKwkvKiBEaXNhYmxlIGNoYW5uZWwgKi8KKyNkZWZpbmUJRE1BX0RJU0FCTEVfQ0hBTihjaCkJKDB4MDAwMDAwMDAgfCAoKDB4MDAwMDAwMDAxIDw8IChjaCkpIDw8IDgpKQorCS8qIFRyYW5zZmVyIFR5cGUgJiBGbG93IENvbnRyb2xsZXIgKi8KKyNkZWZpbmUJRE1BX0NUTF9UVEZDKHR5cGUpCSgoKHR5cGUpICYgMHg3KSA8PCAyMCkKKyNkZWZpbmUJRE1BX0NUTF9TTVMobnVtKQkoKChudW0pICYgMHgzKSA8PCAyNSkgLyogU3JjIE1hc3RlciBTZWxlY3QgKi8KKyNkZWZpbmUJRE1BX0NUTF9ETVMobnVtKQkoKChudW0pICYgMHgzKSA8PCAyMykvKiBEc3QgTWFzdGVyIFNlbGVjdCAqLworCS8qIFNyYyBCdXJzdCBUcmFuc2FjdGlvbiBMZW5ndGggKi8KKyNkZWZpbmUgRE1BX0NUTF9TUkNfTVNJWkUoc2l6ZSkgKCgoc2l6ZSkgJiAweDcpIDw8IDE0KQorCS8qIERzdCBCdXJzdCBUcmFuc2FjdGlvbiBMZW5ndGggKi8KKyNkZWZpbmUJRE1BX0NUTF9EU1RfTVNJWkUoc2l6ZSkgKCgoc2l6ZSkgJiAweDcpIDw8IDExKQorCS8qIFNvdXJjZSBUcmFuc2ZlciBXaWR0aCAqLworI2RlZmluZQlETUFfQ1RMX1NSQ19UUldJRChzaXplKSAoKChzaXplKSAmIDB4NykgPDwgNCkKKwkvKiBEZXN0aW5hdGlvbiBUcmFuc2ZlciBXaWR0aCAqLworI2RlZmluZQlETUFfQ1RMX0RTVF9UUldJRChzaXplKSAoKChzaXplKSAmIDB4NykgPDwgMSkKKworLyogQXNzaWduIEhXIGhhbmRzaGFraW5nIGludGVyZmFjZSAoeCkgdG8gZGVzdGluYXRpb24gLyBzb3VyY2UgcGVyaXBoZXJhbCAqLworI2RlZmluZQlETUFfQ0ZHX0hXX0hTX0RFU1QoaW50X251bSkgKCgoaW50X251bSkgJiAweEYpIDw8IDExKQorI2RlZmluZQlETUFfQ0ZHX0hXX0hTX1NSQyhpbnRfbnVtKSAoKChpbnRfbnVtKSAmIDB4RikgPDwgNykKKyNkZWZpbmUJRE1BX0xMUF9MTVMoYWRkciwgbWFzdGVyKSAoKChhZGRyKSAmIDB4ZmZmZmZmZmMpIHwgKG1hc3RlcikpCisKKy8qCisgKiBUaGlzIGRlZmluZSBpcyB1c2VkIHRvIHNldCBibG9jayBjaGFpbmluZyBkaXNhYmxlZCBpbiB0aGUgY29udHJvbCBsb3cKKyAqIHJlZ2lzdGVyLiAgSXQgaXMgYWxyZWFkeSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBzbyBpdCBjYW4gYmUgJidkIGRpcmN0bHkuCisgKiBJdCBpcyBlc3NlbnRpYWxseTogY3B1X3RvX2xlMzIofihETUFfQ1RMX0xMUF9TUkNFTiB8IERNQV9DVExfTExQX0RTVEVOKSkKKyAqLworZW51bSB7CisJRE1BX0NUTF9MTFBfRElTQUJMRV9MRTMyID0gMHhmZmZmZmZlNywKKwlETUFfQ1RMX1RURkNfUDJNX0RNQUMgPQkweDAwMDAwMDAyLCAvKiBQZXIgdG8gbWVtLCBETUFDIGNudHIgKi8KKwlETUFfQ1RMX1RURkNfTTJQX1BFUiA9CTB4MDAwMDAwMDMsIC8qIE1lbSB0byBwZXIsIHBlcmlwaGVyYWwgY250ciAqLworCURNQV9DVExfU0lOQ19JTkMgPQkweDAwMDAwMDAwLCAvKiBTb3VyY2UgQWRkcmVzcyBJbmNyZW1lbnQgKi8KKwlETUFfQ1RMX1NJTkNfREVDID0JMHgwMDAwMDIwMCwKKwlETUFfQ1RMX1NJTkNfTk9DSEFOR0UgPQkweDAwMDAwNDAwLAorCURNQV9DVExfRElOQ19JTkMgPQkweDAwMDAwMDAwLCAvKiBEZXN0aW5hdGlvbiBBZGRyZXNzIEluY3JlbWVudCAqLworCURNQV9DVExfRElOQ19ERUMgPQkweDAwMDAwMDgwLAorCURNQV9DVExfRElOQ19OT0NIQU5HRSA9CTB4MDAwMDAxMDAsCisJRE1BX0NUTF9JTlRfRU4gPQkweDAwMDAwMDAxLCAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisKKy8qIENoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBoaWdoIGJpdHMgKi8KKwlETUFfQ0ZHX0ZDTU9EX1JFUSA9CTB4MDAwMDAwMDEsIC8qIEZsb3cgQ29udHJvbCAtIHJlcXVlc3QgYmFzZWQgKi8KKwlETUFfQ0ZHX1BST1RDVEwJPQkoMHgwMDAwMDAwMyA8PCAyKSwvKiBQcm90ZWN0aW9uIENvbnRyb2wgKi8KKworLyogQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGxvdyBiaXRzICovCisJRE1BX0NGR19SRUxEX0RTVCA9CTB4ODAwMDAwMDAsIC8qIFJlbG9hZCBEZXN0IC8gU3JjIEFkZHIgKi8KKwlETUFfQ0ZHX1JFTERfU1JDID0JMHg0MDAwMDAwMCwKKwlETUFfQ0ZHX0hTX1NFTFNSQyA9CTB4MDAwMDA4MDAsIC8qIFNvZnR3YXJlIGhhbmRzaGFrZSBTcmMvIERlc3QgKi8KKwlETUFfQ0ZHX0hTX1NFTERTVCA9CTB4MDAwMDA0MDAsCisJRE1BX0NGR19GSUZPRU1QVFkgPSAgICAgKDB4MDAwMDAwMDEgPDwgOSksIC8qIEZJRk8gRW1wdHkgYml0ICovCisKKy8qIENoYW5uZWwgTGlua2VkIExpc3QgUG9pbnRlciBSZWdpc3RlciAqLworCURNQV9MTFBfQUhCTUFTVEVSMSA9CTAsCS8qIExpc3QgTWFzdGVyIFNlbGVjdCAqLworCURNQV9MTFBfQUhCTUFTVEVSMiA9CTEsCisKKwlTQVRBX0RXQ19NQVhfUE9SVFMgPSAxLAorCisJU0FUQV9EV0NfU0NSX09GRlNFVCA9IDB4MjQsCisJU0FUQV9EV0NfUkVHX09GRlNFVCA9IDB4NjQsCit9OworCisvKiBEV0MgU0FUQSBSZWdpc3RlcnMgKi8KK3N0cnVjdCBzYXRhX2R3Y19yZWdzIHsKKwl1MzIgZnB0YWdyOwkJLyogMXN0IHBhcnR5IERNQSB0YWcgKi8KKwl1MzIgZnBib3I7CQkvKiAxc3QgcGFydHkgRE1BIGJ1ZmZlciBvZmZzZXQgKi8KKwl1MzIgZnB0Y3I7CQkvKiAxc3QgcGFydHkgRE1BIFhmciBjb3VudCAqLworCXUzMiBkbWFjcjsJCS8qIERNQSBDb250cm9sICovCisJdTMyIGRidHNyOwkJLyogRE1BIEJ1cnN0IFRyYW5zYWMgc2l6ZSAqLworCXUzMiBpbnRwcjsJCS8qIEludGVycnVwdCBQZW5kaW5nICovCisJdTMyIGludG1yOwkJLyogSW50ZXJydXB0IE1hc2sgKi8KKwl1MzIgZXJybXI7CQkvKiBFcnJvciBNYXNrICovCisJdTMyIGxsY3I7CQkvKiBMaW5rIExheWVyIENvbnRyb2wgKi8KKwl1MzIgcGh5Y3I7CQkvKiBQSFkgQ29udHJvbCAqLworCXUzMiBwaHlzcjsJCS8qIFBIWSBTdGF0dXMgKi8KKwl1MzIgcnhiaXN0cGQ7CQkvKiBSZWN2ZCBCSVNUIHBhdHRlcm4gZGVmIHJlZ2lzdGVyICovCisJdTMyIHJ4YmlzdHBkMTsJCS8qIFJlY3ZkIEJJU1QgZGF0YSBkd29yZDEgKi8KKwl1MzIgcnhiaXN0cGQyOwkJLyogUmVjdmQgQklTVCBwYXR0ZXJuIGRhdGEgZHdvcmQyICovCisJdTMyIHR4YmlzdHBkOwkJLyogVHJhbnMgQklTVCBwYXR0ZXJuIGRlZiByZWdpc3RlciAqLworCXUzMiB0eGJpc3RwZDE7CQkvKiBUcmFucyBCSVNUIGRhdGEgZHdvcmQxICovCisJdTMyIHR4YmlzdHBkMjsJCS8qIFRyYW5zIEJJU1QgZGF0YSBkd29yZDIgKi8KKwl1MzIgYmlzdGNyOwkJLyogQklTVCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyIGJpc3RmY3RyOwkJLyogQklTVCBGSVMgQ291bnQgUmVnaXN0ZXIgKi8KKwl1MzIgYmlzdHNyOwkJLyogQklTVCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIgYmlzdGRlY3I7CQkvKiBCSVNUIER3b3JkIEVycm9yIGNvdW50IHJlZ2lzdGVyICovCisJdTMyIHJlc1sxNV07CQkvKiBSZXNlcnZlZCBsb2NhdGlvbnMgKi8KKwl1MzIgdGVzdHI7CQkvKiBUZXN0IFJlZ2lzdGVyICovCisJdTMyIHZlcnNpb25yOwkJLyogVmVyc2lvbiBSZWdpc3RlciAqLworCXUzMiBpZHI7CQkvKiBJRCBSZWdpc3RlciAqLworCXUzMiB1bmltcGxbMTkyXTsJLyogVW5pbXBsZW1lbnRlZCAqLworCXUzMiBkbWFkclsyNTZdOwkvKiBGSUZPIExvY2F0aW9ucyBpbiBETUEgTW9kZSAqLworfTsKKworZW51bSB7CisJU0NSX1NDT05UUk9MX0RFVF9FTkFCTEUJPQkweDAwMDAwMDAxLAorCVNDUl9TU1RBVFVTX0RFVF9QUkVTRU5UCT0JMHgwMDAwMDAwMSwKKwlTQ1JfU0VSUk9SX0RJQUdfWAk9CTB4MDQwMDAwMDAsCisvKiBEV0MgU0FUQSBSZWdpc3RlciBPcGVyYXRpb25zICovCisJU0FUQV9EV0NfVFhGSUZPX0RFUFRICT0JMHgwMUZGLAorCVNBVEFfRFdDX1JYRklGT19ERVBUSAk9CTB4MDFGRiwKKwlTQVRBX0RXQ19ETUFDUl9UTU9EX1RYQ0hFTiA9CTB4MDAwMDAwMDQsCisJU0FUQV9EV0NfRE1BQ1JfVFhDSEVOCT0gKDB4MDAwMDAwMDEgfCBTQVRBX0RXQ19ETUFDUl9UTU9EX1RYQ0hFTiksCisJU0FUQV9EV0NfRE1BQ1JfUlhDSEVOCT0gKDB4MDAwMDAwMDIgfCBTQVRBX0RXQ19ETUFDUl9UTU9EX1RYQ0hFTiksCisJU0FUQV9EV0NfRE1BQ1JfVFhSWENIX0NMRUFSID0JU0FUQV9EV0NfRE1BQ1JfVE1PRF9UWENIRU4sCisJU0FUQV9EV0NfSU5UUFJfRE1BVAk9CTB4MDAwMDAwMDEsCisJU0FUQV9EV0NfSU5UUFJfTkVXRlAJPQkweDAwMDAwMDAyLAorCVNBVEFfRFdDX0lOVFBSX1BNQUJSVAk9CTB4MDAwMDAwMDQsCisJU0FUQV9EV0NfSU5UUFJfRVJSCT0JMHgwMDAwMDAwOCwKKwlTQVRBX0RXQ19JTlRQUl9ORVdCSVNUCT0JMHgwMDAwMDAxMCwKKwlTQVRBX0RXQ19JTlRQUl9JUEYJPQkweDEwMDAwMDAwLAorCVNBVEFfRFdDX0lOVE1SX0RNQVRNCT0JMHgwMDAwMDAwMSwKKwlTQVRBX0RXQ19JTlRNUl9ORVdGUE0JPQkweDAwMDAwMDAyLAorCVNBVEFfRFdDX0lOVE1SX1BNQUJSVE0JPQkweDAwMDAwMDA0LAorCVNBVEFfRFdDX0lOVE1SX0VSUk0JPQkweDAwMDAwMDA4LAorCVNBVEFfRFdDX0lOVE1SX05FV0JJU1RNCT0JMHgwMDAwMDAxMCwKKwlTQVRBX0RXQ19MTENSX1NDUkFNRU4JPQkweDAwMDAwMDAxLAorCVNBVEFfRFdDX0xMQ1JfREVTQ1JBTUVOCT0JMHgwMDAwMDAwMiwKKwlTQVRBX0RXQ19MTENSX1JQREVOCT0JMHgwMDAwMDAwNCwKKy8qIFRoaXMgaXMgYWxsIGVycm9yIGJpdHMsIHplcm8ncyBhcmUgcmVzZXJ2ZWQgZmllbGRzLiAqLworCVNBVEFfRFdDX1NFUlJPUl9FUlJfQklUUyA9CTB4MEZGRjBGMDMKK307CisKKyNkZWZpbmUgU0FUQV9EV0NfU0NSMF9TUERfR0VUKHYpCSgoKHYpID4+IDQpICYgMHgwMDAwMDAwRikKKyNkZWZpbmUgU0FUQV9EV0NfRE1BQ1JfVFhfQ0xFQVIodikJKCgodikgJiB+U0FUQV9EV0NfRE1BQ1JfVFhDSEVOKSB8XAorCQkJCQkJIFNBVEFfRFdDX0RNQUNSX1RNT0RfVFhDSEVOKQorI2RlZmluZSBTQVRBX0RXQ19ETUFDUl9SWF9DTEVBUih2KQkoKCh2KSAmIH5TQVRBX0RXQ19ETUFDUl9SWENIRU4pIHxcCisJCQkJCQkgU0FUQV9EV0NfRE1BQ1JfVE1PRF9UWENIRU4pCisjZGVmaW5lIFNBVEFfRFdDX0RCVFNSX01XUihzaXplKQkoKChzaXplKS80KSAmIFNBVEFfRFdDX1RYRklGT19ERVBUSCkKKyNkZWZpbmUgU0FUQV9EV0NfREJUU1JfTVJEKHNpemUpCSgoKChzaXplKS80KSAmIFNBVEFfRFdDX1JYRklGT19ERVBUSClcCisJCQkJCQkgPDwgMTYpCitzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwkJLyogZ2VuZXJpYyBkZXZpY2Ugc3RydWN0ICovCisJc3RydWN0IGF0YV9wcm9iZV9lbnQJKnBlOwkJLyogcHRyIHRvIHByb2JlLWVudCAqLworCXN0cnVjdCBhdGFfaG9zdAkJKmhvc3Q7CisJdTgJCQkqcmVnX2Jhc2U7CisJc3RydWN0IHNhdGFfZHdjX3JlZ3MJKnNhdGFfZHdjX3JlZ3M7CS8qIERXIFN5bm9wc3lzIFNBVEEgc3BlY2lmaWMgKi8KKwlpbnQJCQlpcnFfZG1hOworfTsKKworI2RlZmluZSBTQVRBX0RXQ19RQ01EX01BWAkzMgorCitzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgeworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UJKmhzZGV2OworCWludAkJCWNtZF9pc3N1ZWRbU0FUQV9EV0NfUUNNRF9NQVhdOworCXN0cnVjdCBsbGkJCSpsbGl0W1NBVEFfRFdDX1FDTURfTUFYXTsgIC8qIERNQSBMTEkgdGFibGUgKi8KKwlkbWFfYWRkcl90CQlsbGl0X2RtYVtTQVRBX0RXQ19RQ01EX01BWF07CisJdTMyCQkJZG1hX2NoYW5bU0FUQV9EV0NfUUNNRF9NQVhdOworCWludAkJCWRtYV9wZW5kaW5nW1NBVEFfRFdDX1FDTURfTUFYXTsKK307CisKKy8qCisgKiBDb21tb25seSB1c2VkIERXQyBTQVRBIGRyaXZlciBNYWNyb3MKKyAqLworI2RlZmluZSBIU0RFVl9GUk9NX0hPU1QoaG9zdCkgICgoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqKVwKKwkJCQkJKGhvc3QpLT5wcml2YXRlX2RhdGEpCisjZGVmaW5lIEhTREVWX0ZST01fQVAoYXApICAoKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKilcCisJCQkJCShhcCktPmhvc3QtPnByaXZhdGVfZGF0YSkKKyNkZWZpbmUgSFNERVZQX0ZST01fQVAoYXApICAgKChzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKilcCisJCQkJCShhcCktPnByaXZhdGVfZGF0YSkKKyNkZWZpbmUgSFNERVZfRlJPTV9RQyhxYykJKChzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICopXAorCQkJCQkocWMpLT5hcC0+aG9zdC0+cHJpdmF0ZV9kYXRhKQorI2RlZmluZSBIU0RFVl9GUk9NX0hTREVWUChwKQkoKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKilcCisJCQkJCQkoaHNkZXZwKS0+aHNkZXYpCisKK2VudW0geworCVNBVEFfRFdDX0NNRF9JU1NVRURfTk9UCQk9IDAsCisJU0FUQV9EV0NfQ01EX0lTU1VFRF9QRU5ECT0gMSwKKwlTQVRBX0RXQ19DTURfSVNTVUVEX0VYRUMJPSAyLAorCVNBVEFfRFdDX0NNRF9JU1NVRURfTk9EQVRBCT0gMywKKworCVNBVEFfRFdDX0RNQV9QRU5ESU5HX05PTkUJPSAwLAorCVNBVEFfRFdDX0RNQV9QRU5ESU5HX1RYCQk9IDEsCisJU0FUQV9EV0NfRE1BX1BFTkRJTkdfUlgJCT0gMiwKK307CisKK3N0cnVjdCBzYXRhX2R3Y19ob3N0X3ByaXYgeworCXZvaWQJX19pb21lbQkgKnNjcl9hZGRyX3NzdGF0dXM7CisJdTMyCXNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkIDsKKwl1MzIJc2F0YV9kd2Nfc2FjdGl2ZV9xdWV1ZWQgOworCXUzMglkbWFfaW50ZXJydXB0X2NvdW50OworCXN0cnVjdAlhaGJfZG1hX3JlZ3MJKnNhdGFfZG1hX3JlZ3M7CisJc3RydWN0CWRldmljZQkqZHdjX2RldjsKK307CitzdHJ1Y3Qgc2F0YV9kd2NfaG9zdF9wcml2IGhvc3RfcHZ0OworLyoKKyAqIFByb3RvdHlwZXMKKyAqLworc3RhdGljIHZvaWQgc2F0YV9kd2NfYm1kbWFfc3RhcnRfYnlfdGFnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IHRhZyk7CitzdGF0aWMgaW50IHNhdGFfZHdjX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsCisJCQkJdTMyIGNoZWNrX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBzYXRhX2R3Y19kbWFfeGZlcl9jb21wbGV0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgY2hlY2tfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX2NsZWFyX2RtYWNyKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwLCB1OCB0YWcpOworc3RhdGljIGludCBkbWFfZHdjX2luaXQoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYsIGludCBpcnEpOworc3RhdGljIHZvaWQgZG1hX2R3Y19leGl0KHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2KTsKK3N0YXRpYyBpbnQgZG1hX2R3Y194ZmVyX3NldHVwKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fZWxlbXMsCisJCQkgICAgICBzdHJ1Y3QgbGxpICpsbGksIGRtYV9hZGRyX3QgZG1hX2xsaSwKKwkJCSAgICAgIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGRpcik7CitzdGF0aWMgdm9pZCBkbWFfZHdjX3hmZXJfc3RhcnQoaW50IGRtYV9jaCk7CisKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX3RmX2R1bXAoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJZGV2X3ZkYmcoaG9zdF9wdnQuZHdjX2RldiwgInRhc2tmaWxlIGNtZDogMHglMDJ4IHByb3RvY29sOiAlcyBmbGFnczoiCisJCSIweCVseCBkZXZpY2U6ICV4XG4iLCB0Zi0+Y29tbWFuZCwgYXRhX2dldF9jbWRfZGVzY3JpcHRcCisJCSh0Zi0+cHJvdG9jb2wpLCB0Zi0+ZmxhZ3MsIHRmLT5kZXZpY2UpOworCWRldl92ZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICJmZWF0dXJlOiAweCUwMnggbnNlY3Q6IDB4JXggbGJhbDogMHgleCAiCisJCSJsYmFtOiAweCV4IGxiYWg6IDB4JXhcbiIsIHRmLT5mZWF0dXJlLCB0Zi0+bnNlY3QsIHRmLT5sYmFsLAorCQkgdGYtPmxiYW0sIHRmLT5sYmFoKTsKKwlkZXZfdmRiZyhob3N0X3B2dC5kd2NfZGV2LCAiaG9iX2ZlYXR1cmU6IDB4JTAyeCBob2JfbnNlY3Q6IDB4JXggIgorCQkiaG9iX2xiYWw6IDB4JXggaG9iX2xiYW06IDB4JXggaG9iX2xiYWg6IDB4JXhcbiIsCisJCXRmLT5ob2JfZmVhdHVyZSwgdGYtPmhvYl9uc2VjdCwgdGYtPmhvYl9sYmFsLCB0Zi0+aG9iX2xiYW0sCisJCXRmLT5ob2JfbGJhaCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogZ2V0X2J1cnN0X2xlbmd0aF9lbmNvZGUKKyAqIGFyZ3VtZW50czogZGF0YWxlbmd0aDogbGVuZ3RoIGluIGJ5dGVzIG9mIGRhdGEKKyAqIHJldHVybnMgdmFsdWUgdG8gYmUgcHJvZ3JhbW1lZCBpbiByZWdpc3RlciBjb3JycmVzcG9uZGluZyB0byBkYXRhIGxlbmd0aAorICogVGhpcyB2YWx1ZSBpcyBlZmZlY3RpdmVseSB0aGUgbG9nKGJhc2UgMikgb2YgdGhlIGxlbmd0aAorICovCitzdGF0aWMgIGludCBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZShpbnQgZGF0YWxlbmd0aCkKK3sKKwlpbnQgaXRlbXMgPSBkYXRhbGVuZ3RoID4+IDI7CS8qIGRpdiBieSA0IHRvIGdldCBsd29yZCBjb3VudCAqLworCisJaWYgKGl0ZW1zID49IDY0KQorCQlyZXR1cm4gNTsKKworCWlmIChpdGVtcyA+PSAzMikKKwkJcmV0dXJuIDQ7CisKKwlpZiAoaXRlbXMgPj0gMTYpCisJCXJldHVybiAzOworCisJaWYgKGl0ZW1zID49IDgpCisJCXJldHVybiAyOworCisJaWYgKGl0ZW1zID49IDQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAgdm9pZCBjbGVhcl9jaGFuX2ludGVycnVwdHMoaW50IGMpCit7CisJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXIudGZyLmxvdyksCisJCSBETUFfQ0hBTk5FTChjKSk7CisJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXIuYmxvY2subG93KSwKKwkJIERNQV9DSEFOTkVMKGMpKTsKKwlvdXRfbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmludGVycnVwdF9jbGVhci5zcmN0cmFuLmxvdyksCisJCSBETUFfQ0hBTk5FTChjKSk7CisJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXIuZHN0dHJhbi5sb3cpLAorCQkgRE1BX0NIQU5ORUwoYykpOworCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+aW50ZXJydXB0X2NsZWFyLmVycm9yLmxvdyksCisJCSBETUFfQ0hBTk5FTChjKSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogZG1hX3JlcXVlc3RfY2hhbm5lbAorICogYXJndW1lbnRzOiBOb25lCisgKiByZXR1cm5zIGNoYW5uZWwgbnVtYmVyIGlmIGF2YWlsYWJsZSBlbHNlIC0xCisgKiBUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgdGhlIG5leHQgYXZhaWxhYmxlIERNQSBjaGFubmVsIGZyb20gdGhlIGxpc3QgdG8gdGhlCisgKiByZXF1ZXN0ZXIKKyAqLworc3RhdGljIGludCBkbWFfcmVxdWVzdF9jaGFubmVsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1BX05VTV9DSEFOUzsgaSsrKSB7CisJCWlmICghKGluX2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5kbWFfY2hhbl9lbi5sb3cpKSAmXAorCQkJRE1BX0NIQU5ORUwoaSkpKQorCQkJcmV0dXJuIGk7CisJfQorCWRldl9lcnIoaG9zdF9wdnQuZHdjX2RldiwgIiVzIE5PIGNoYW5uZWwgY2hhbl9lbjogMHglMDh4XG4iLCBfX2Z1bmNfXywKKwkJaW5fbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmRtYV9jaGFuX2VuLmxvdykpKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogZG1hX2R3Y19pbnRlcnJ1cHQKKyAqIGFyZ3VtZW50czogaXJxLCBkZXZfaWQsIHB0X3JlZ3MKKyAqIHJldHVybnMgY2hhbm5lbCBudW1iZXIgaWYgYXZhaWxhYmxlIGVsc2UgLTEKKyAqIEludGVycnVwdCBIYW5kbGVyIGZvciBEVyBBSEIgU0FUQSBETUEKKyAqLworc3RhdGljIGlycXJldHVybl90IGRtYV9kd2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmhzZGV2X2luc3RhbmNlKQoreworCWludCBjaGFuOworCXUzMiB0ZnJfcmVnLCBlcnJfcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYgPQorCQkoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqKWhzZGV2X2luc3RhbmNlOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgYXRhX2hvc3QgKiloc2Rldi0+aG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwOworCXU4IHRhZyA9IDA7CisJdW5zaWduZWQgaW50IHBvcnQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlhcCA9IGhvc3QtPnBvcnRzW3BvcnRdOworCWhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKKwl0YWcgPSBhcC0+bGluay5hY3RpdmVfdGFnOworCisJdGZyX3JlZyA9IGluX2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfc3RhdHVzLnRmclwKKwkJCS5sb3cpKTsKKwllcnJfcmVnID0gaW5fbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmludGVycnVwdF9zdGF0dXMuZXJyb3JcCisJCQkubG93KSk7CisKKwlkZXZfZGJnKGFwLT5kZXYsICJlb3Q9MHglMDh4IGVycj0weCUwOHggcGVuZGluZz0lZCBhY3RpdmUgcG9ydD0lZFxuIiwKKwkJdGZyX3JlZywgZXJyX3JlZywgaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddLCBwb3J0KTsKKworCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBETUFfTlVNX0NIQU5TOyBjaGFuKyspIHsKKwkJLyogQ2hlY2sgZm9yIGVuZC1vZi10cmFuc2ZlciBpbnRlcnJ1cHQuICovCisJCWlmICh0ZnJfcmVnICYgRE1BX0NIQU5ORUwoY2hhbikpIHsKKwkJCS8qCisJCQkgKiBFYWNoIERNQSBjb21tYW5kIHByb2R1Y2VzIDIgaW50ZXJydXB0cy4gIE9ubHkKKwkJCSAqIGNvbXBsZXRlIHRoZSBjb21tYW5kIGFmdGVyIGJvdGggaW50ZXJydXB0cyBoYXZlIGJlZW4KKwkJCSAqIHNlZW4uIChTZWUgc2F0YV9kd2NfaXNyKCkpCisJCQkgKi8KKwkJCWhvc3RfcHZ0LmRtYV9pbnRlcnJ1cHRfY291bnQrKzsKKwkJCXNhdGFfZHdjX2NsZWFyX2RtYWNyKGhzZGV2cCwgdGFnKTsKKworCQkJaWYgKGhzZGV2cC0+ZG1hX3BlbmRpbmdbdGFnXSA9PQorCQkJICAgIFNBVEFfRFdDX0RNQV9QRU5ESU5HX05PTkUpIHsKKwkJCQlkZXZfZXJyKGFwLT5kZXYsICJETUEgbm90IHBlbmRpbmcgZW90PTB4JTA4eCAiCisJCQkJCSJlcnI9MHglMDh4IHRhZz0weCUwMnggcGVuZGluZz0lZFxuIiwKKwkJCQkJdGZyX3JlZywgZXJyX3JlZywgdGFnLAorCQkJCQloc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10pOworCQkJfQorCisJCQlpZiAoKGhvc3RfcHZ0LmRtYV9pbnRlcnJ1cHRfY291bnQgJSAyKSA9PSAwKQorCQkJCXNhdGFfZHdjX2RtYV94ZmVyX2NvbXBsZXRlKGFwLCAxKTsKKworCQkJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCQkJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXJcCisJCQkJLnRmci5sb3cpLAorCQkJCSBETUFfQ0hBTk5FTChjaGFuKSk7CisJCX0KKworCQkvKiBDaGVjayBmb3IgZXJyb3IgaW50ZXJydXB0LiAqLworCQlpZiAoZXJyX3JlZyAmIERNQV9DSEFOTkVMKGNoYW4pKSB7CisJCQkvKiBUT0RPIE5lZWQgZXJyb3IgaGFuZGxlciAhICovCisJCQlkZXZfZXJyKGFwLT5kZXYsICJlcnJvciBpbnRlcnJ1cHQgZXJyX3JlZz0weCUwOHhcbiIsCisJCQkJZXJyX3JlZyk7CisKKwkJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQuICovCisJCQlvdXRfbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmludGVycnVwdF9jbGVhclwKKwkJCQkuZXJyb3IubG93KSwKKwkJCQkgRE1BX0NIQU5ORUwoY2hhbikpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogZG1hX3JlcXVlc3RfaW50ZXJydXB0cworICogYXJndW1lbnRzOiBoc2RldgorICogcmV0dXJucyBzdGF0dXMKKyAqIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIElTUiBmb3IgYSBwYXJ0aWN1bGFyIERNQSBjaGFubmVsIGludGVycnVwdAorICovCitzdGF0aWMgaW50IGRtYV9yZXF1ZXN0X2ludGVycnVwdHMoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYsIGludCBpcnEpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGNoYW47CisKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgRE1BX05VTV9DSEFOUzsgY2hhbisrKSB7CisJCS8qIFVubWFzayBlcnJvciBpbnRlcnJ1cHQgKi8KKwkJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzKS0+aW50ZXJydXB0X21hc2suZXJyb3IubG93LAorCQkJIERNQV9FTkFCTEVfQ0hBTihjaGFuKSk7CisKKwkJLyogVW5tYXNrIGVuZC1vZi10cmFuc2ZlciBpbnRlcnJ1cHQgKi8KKwkJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzKS0+aW50ZXJydXB0X21hc2sudGZyLmxvdywKKwkJCSBETUFfRU5BQkxFX0NIQU4oY2hhbikpOworCX0KKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgZG1hX2R3Y19pbnRlcnJ1cHQsIDAsICJTQVRBIERNQSIsIGhzZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoaG9zdF9wdnQuZHdjX2RldiwgIiVzOiBjb3VsZCBub3QgZ2V0IElSUSAlZFxuIiwKKwkJX19mdW5jX18sIGlycSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIE1hcmsgdGhpcyBpbnRlcnJ1cHQgYXMgcmVxdWVzdGVkICovCisJaHNkZXYtPmlycV9kbWEgPSBpcnE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogbWFwX3NnX3RvX2xsaQorICogVGhlIFN5bm9wc2lzIGRyaXZlciBoYXMgYSBjb21tZW50IHByb3Bvc2luZyB0aGF0IGJldHRlciBwZXJmb3JtYW5jZQorICogaXMgcG9zc2libGUgYnkgb25seSBlbmFibGluZyBpbnRlcnJ1cHRzIG9uIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpbmtlZCBsaXN0LgorICogSG93ZXZlciwgaXQgc2VlbXMgdGhhdCBjb3VsZCBiZSBhIHByb2JsZW0gaWYgYW4gZXJyb3IgaGFwcGVuZWQgb24gb25lIG9mIHRoZQorICogZmlyc3QgaXRlbXMuICBUaGUgdHJhbnNmZXIgd291bGQgaGFsdCwgYnV0IG5vIGVycm9yIGludGVycnVwdCB3b3VsZCBvY2N1ci4KKyAqIEN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uIHNldHMgaW50ZXJydXB0cyBlbmFibGVkIGZvciBlYWNoIGxpbmtlZCBsaXN0IGl0ZW06CisgKiBETUFfQ1RMX0lOVF9FTi4KKyAqLworc3RhdGljIGludCBtYXBfc2dfdG9fbGxpKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fZWxlbXMsCisJCQlzdHJ1Y3QgbGxpICpsbGksIGRtYV9hZGRyX3QgZG1hX2xsaSwKKwkJCXZvaWQgX19pb21lbSAqZG1hZHJfYWRkciwgaW50IGRpcikKK3sKKwlpbnQgaSwgaWR4ID0gMDsKKwlpbnQgZmlzX2xlbiA9IDA7CisJZG1hX2FkZHJfdCBuZXh0X2xscDsKKwlpbnQgYmw7CisKKwlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICIlczogc2c9JXAgbmVsZW09JWQgbGxpPSVwIGRtYV9sbGk9MHglMDh4IgorCQkiIGRtYWRyPTB4JTA4eFxuIiwgX19mdW5jX18sIHNnLCBudW1fZWxlbXMsIGxsaSwgKHUzMilkbWFfbGxpLAorCQkodTMyKWRtYWRyX2FkZHIpOworCisJYmwgPSBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZShBSEJfRE1BX0JSU1RfREZMVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW1zOyBpKyssIHNnKyspIHsKKwkJdTMyIGFkZHIsIG9mZnNldDsKKwkJdTMyIHNnX2xlbiwgbGVuOworCisJCWFkZHIgPSAodTMyKSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCXNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCWRldl9kYmcoaG9zdF9wdnQuZHdjX2RldiwgIiVzOiBlbGVtPSVkIHNnX2FkZHI9MHgleCBzZ19sZW4iCisJCQkiPSVkXG4iLCBfX2Z1bmNfXywgaSwgYWRkciwgc2dfbGVuKTsKKworCQl3aGlsZSAoc2dfbGVuKSB7CisJCQlpZiAoaWR4ID49IFNBVEFfRFdDX0RNQUNfTExJX05VTSkgeworCQkJCS8qIFRoZSBMTEkgdGFibGUgaXMgbm90IGxhcmdlIGVub3VnaC4gKi8KKwkJCQlkZXZfZXJyKGhvc3RfcHZ0LmR3Y19kZXYsICJMTEkgdGFibGUgb3ZlcnJ1biAiCisJCQkJIihpZHg9JWQpXG4iLCBpZHgpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gKHNnX2xlbiA+IFNBVEFfRFdDX0RNQUNfQ1RSTF9UU0laRV9NQVgpID8KKwkJCQlTQVRBX0RXQ19ETUFDX0NUUkxfVFNJWkVfTUFYIDogc2dfbGVuOworCisJCQlvZmZzZXQgPSBhZGRyICYgMHhmZmZmOworCQkJaWYgKChvZmZzZXQgKyBzZ19sZW4pID4gMHgxMDAwMCkKKwkJCQlsZW4gPSAweDEwMDAwIC0gb2Zmc2V0OworCisJCQkvKgorCQkJICogTWFrZSBzdXJlIGEgTExJIGJsb2NrIGlzIG5vdCBjcmVhdGVkIHRoYXQgd2lsbCBzcGFuCisJCQkgKiA4SyBtYXggRklTIGJvdW5kYXJ5LiAgSWYgdGhlIGJsb2NrIHNwYW5zIHN1Y2ggYSBGSVMKKwkJCSAqIGJvdW5kYXJ5LCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGEgRE1BIGJ1cnN0IHdpbGwKKwkJCSAqIGNyb3NzIHRoYXQgYm91bmRhcnkgLS0gdGhpcyByZXN1bHRzIGluIGFuIGVycm9yIGluCisJCQkgKiB0aGUgaG9zdCBjb250cm9sbGVyLgorCQkJICovCisJCQlpZiAoZmlzX2xlbiArIGxlbiA+IDgxOTIpIHsKKwkJCQlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICJTUExJVFRJTkc6IGZpc19sZW49IgorCQkJCQkiJWQoMHgleCkgbGVuPSVkKDB4JXgpXG4iLCBmaXNfbGVuLAorCQkJCQkgZmlzX2xlbiwgbGVuLCBsZW4pOworCQkJCWxlbiA9IDgxOTIgLSBmaXNfbGVuOworCQkJCWZpc19sZW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlmaXNfbGVuICs9IGxlbjsKKwkJCX0KKwkJCWlmIChmaXNfbGVuID09IDgxOTIpCisJCQkJZmlzX2xlbiA9IDA7CisKKwkJCS8qCisJCQkgKiBTZXQgRE1BIGFkZHJlc3NlcyBhbmQgbG93ZXIgaGFsZiBvZiBjb250cm9sIHJlZ2lzdGVyCisJCQkgKiBiYXNlZCBvbiBkaXJlY3Rpb24uCisJCQkgKi8KKwkJCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCQkJbGxpW2lkeF0uZGFyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJCQkJbGxpW2lkeF0uc2FyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFkcl9hZGRyKTsKKworCQkJCWxsaVtpZHhdLmN0bC5sb3cgPSBjcHVfdG9fbGUzMigKKwkJCQkJRE1BX0NUTF9UVEZDKERNQV9DVExfVFRGQ19QMk1fRE1BQykgfAorCQkJCQlETUFfQ1RMX1NNUygwKSB8CisJCQkJCURNQV9DVExfRE1TKDEpIHwKKwkJCQkJRE1BX0NUTF9TUkNfTVNJWkUoYmwpIHwKKwkJCQkJRE1BX0NUTF9EU1RfTVNJWkUoYmwpIHwKKwkJCQkJRE1BX0NUTF9TSU5DX05PQ0hBTkdFIHwKKwkJCQkJRE1BX0NUTF9TUkNfVFJXSUQoMikgfAorCQkJCQlETUFfQ1RMX0RTVF9UUldJRCgyKSB8CisJCQkJCURNQV9DVExfSU5UX0VOIHwKKwkJCQkJRE1BX0NUTF9MTFBfU1JDRU4gfAorCQkJCQlETUFfQ1RMX0xMUF9EU1RFTik7CisJCQl9IGVsc2UgewkvKiBETUFfVE9fREVWSUNFICovCisJCQkJbGxpW2lkeF0uc2FyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJCQkJbGxpW2lkeF0uZGFyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFkcl9hZGRyKTsKKworCQkJCWxsaVtpZHhdLmN0bC5sb3cgPSBjcHVfdG9fbGUzMigKKwkJCQkJRE1BX0NUTF9UVEZDKERNQV9DVExfVFRGQ19NMlBfUEVSKSB8CisJCQkJCURNQV9DVExfU01TKDEpIHwKKwkJCQkJRE1BX0NUTF9ETVMoMCkgfAorCQkJCQlETUFfQ1RMX1NSQ19NU0laRShibCkgfAorCQkJCQlETUFfQ1RMX0RTVF9NU0laRShibCkgfAorCQkJCQlETUFfQ1RMX0RJTkNfTk9DSEFOR0UgfAorCQkJCQlETUFfQ1RMX1NSQ19UUldJRCgyKSB8CisJCQkJCURNQV9DVExfRFNUX1RSV0lEKDIpIHwKKwkJCQkJRE1BX0NUTF9JTlRfRU4gfAorCQkJCQlETUFfQ1RMX0xMUF9TUkNFTiB8CisJCQkJCURNQV9DVExfTExQX0RTVEVOKTsKKwkJCX0KKworCQkJZGV2X2RiZyhob3N0X3B2dC5kd2NfZGV2LCAiJXMgc2V0dGluZyBjdGwuaGlnaCBsZW46ICIKKwkJCQkiMHglMDh4IHZhbDogMHglMDh4XG4iLCBfX2Z1bmNfXywKKwkJCQlsZW4sIERNQV9DVExfQkxLX1RTKGxlbiAvIDQpKTsKKworCQkJLyogUHJvZ3JhbSB0aGUgTExJIENUTCBoaWdoIHJlZ2lzdGVyICovCisJCQlsbGlbaWR4XS5jdGwuaGlnaCA9IGNwdV90b19sZTMyKERNQV9DVExfQkxLX1RTXAorCQkJCQkJKGxlbiAvIDQpKTsKKworCQkJLyogUHJvZ3JhbSB0aGUgbmV4dCBwb2ludGVyLiAgVGhlIG5leHQgcG9pbnRlciBtdXN0IGJlCisJCQkgKiB0aGUgcGh5c2ljYWwgYWRkcmVzcywgbm90IHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJCQkgKi8KKwkJCW5leHRfbGxwID0gKGRtYV9sbGkgKyAoKGlkeCArIDEpICogc2l6ZW9mKHN0cnVjdCBcCisJCQkJCQkJbGxpKSkpOworCisJCQkvKiBUaGUgbGFzdCAyIGJpdHMgZW5jb2RlIHRoZSBsaXN0IG1hc3RlciBzZWxlY3QuICovCisJCQluZXh0X2xscCA9IERNQV9MTFBfTE1TKG5leHRfbGxwLCBETUFfTExQX0FIQk1BU1RFUjIpOworCisJCQlsbGlbaWR4XS5sbHAgPSBjcHVfdG9fbGUzMihuZXh0X2xscCk7CisJCQlpZHgrKzsKKwkJCXNnX2xlbiAtPSBsZW47CisJCQlhZGRyICs9IGxlbjsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGxhc3QgbmV4dCBwdHIgaGFzIHRvIGJlIHplcm8gYW5kIHRoZSBsYXN0IGNvbnRyb2wgbG93IHJlZ2lzdGVyCisJICogaGFzIHRvIGhhdmUgTExQX1NSQ19FTiBhbmQgTExQX0RTVF9FTiAobGlua2VkIGxpc3QgcG9pbnRlciBzb3VyY2UKKwkgKiBhbmQgZGVzdGluYXRpb24gZW5hYmxlKSBzZXQgYmFjayB0byAwIChkaXNhYmxlZC4pIFRoaXMgaXMgd2hhdCB0ZWxscworCSAqIHRoZSBjb3JlIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaW5rZWQgbGlzdC4KKwkgKi8KKwlpZiAoaWR4KSB7CisJCWxsaVtpZHgtMV0ubGxwID0gMHgwMDAwMDAwMDsKKwkJbGxpW2lkeC0xXS5jdGwubG93ICY9IERNQV9DVExfTExQX0RJU0FCTEVfTEUzMjsKKworCQkvKiBGbHVzaCBjYWNoZSB0byBtZW1vcnkgKi8KKwkJZG1hX2NhY2hlX3N5bmMoTlVMTCwgbGxpLCAoc2l6ZW9mKHN0cnVjdCBsbGkpICogaWR4KSwKKwkJCSAgICAgICBETUFfQklESVJFQ1RJT05BTCk7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBkbWFfZHdjX3hmZXJfc3RhcnQKKyAqIGFyZ3VtZW50czogQ2hhbm5lbCBudW1iZXIKKyAqIFJldHVybiA6IE5vbmUKKyAqIEVuYWJsZXMgdGhlIERNQSBjaGFubmVsCisgKi8KK3N0YXRpYyB2b2lkIGRtYV9kd2NfeGZlcl9zdGFydChpbnQgZG1hX2NoKQoreworCS8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKwlvdXRfbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmRtYV9jaGFuX2VuLmxvdyksCisJCSBpbl9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+ZG1hX2NoYW5fZW4ubG93KSkgfAorCQkgRE1BX0VOQUJMRV9DSEFOKGRtYV9jaCkpOworfQorCitzdGF0aWMgaW50IGRtYV9kd2NfeGZlcl9zZXR1cChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbnVtX2VsZW1zLAorCQkJICAgICAgc3RydWN0IGxsaSAqbGxpLCBkbWFfYWRkcl90IGRtYV9sbGksCisJCQkgICAgICB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBkaXIpCit7CisJaW50IGRtYV9jaDsKKwlpbnQgbnVtX2xsaTsKKwkvKiBBY3F1aXJlIERNQSBjaGFubmVsICovCisJZG1hX2NoID0gZG1hX3JlcXVlc3RfY2hhbm5lbCgpOworCWlmIChkbWFfY2ggPT0gLTEpIHsKKwkJZGV2X2Vycihob3N0X3B2dC5kd2NfZGV2LCAiJXM6IGRtYSBjaGFubmVsIHVuYXZhaWxhYmxlXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogQ29udmVydCBTRyBsaXN0IHRvIGxpbmtlZCBsaXN0IG9mIGl0ZW1zIChMTElzKSBmb3IgQUhCIERNQSAqLworCW51bV9sbGkgPSBtYXBfc2dfdG9fbGxpKHNnLCBudW1fZWxlbXMsIGxsaSwgZG1hX2xsaSwgYWRkciwgZGlyKTsKKworCWRldl9kYmcoaG9zdF9wdnQuZHdjX2RldiwgIiVzIHNnOiAweCVwLCBjb3VudDogJWQgbGxpOiAlcCBkbWFfbGxpOiIKKwkJIiAweCUweGx4IGFkZHI6ICVwIGxsaSBjb3VudDogJWRcbiIsIF9fZnVuY19fLCBzZywgbnVtX2VsZW1zLAorCQkgbGxpLCAodTMyKWRtYV9sbGksIGFkZHIsIG51bV9sbGkpOworCisJY2xlYXJfY2hhbl9pbnRlcnJ1cHRzKGRtYV9jaCk7CisKKwkvKiBQcm9ncmFtIHRoZSBDRkcgcmVnaXN0ZXIuICovCisJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5jaGFuX3JlZ3NbZG1hX2NoXS5jZmcuaGlnaCksCisJCSBETUFfQ0ZHX1BST1RDVEwgfCBETUFfQ0ZHX0ZDTU9EX1JFUSk7CisJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5jaGFuX3JlZ3NbZG1hX2NoXS5jZmcubG93KSwgMCk7CisKKwkvKiBQcm9ncmFtIHRoZSBhZGRyZXNzIG9mIHRoZSBsaW5rZWQgbGlzdCAqLworCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+Y2hhbl9yZWdzW2RtYV9jaF0ubGxwLmxvdyksCisJCSBETUFfTExQX0xNUyhkbWFfbGxpLCBETUFfTExQX0FIQk1BU1RFUjIpKTsKKworCS8qIFByb2dyYW0gdGhlIENUTCByZWdpc3RlciB3aXRoIHNyYyBlbmFibGUgLyBkc3QgZW5hYmxlICovCisJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5jaGFuX3JlZ3NbZG1hX2NoXS5jdGwubG93KSwKKwkJIERNQV9DVExfTExQX1NSQ0VOIHwgRE1BX0NUTF9MTFBfRFNURU4pOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb246IGRtYV9kd2NfZXhpdAorICogYXJndW1lbnRzOiBOb25lCisgKiByZXR1cm5zIHN0YXR1cworICogVGhpcyBmdW5jdGlvbiBleGl0cyB0aGUgU0FUQSBETUEgZHJpdmVyCisgKi8KK3N0YXRpYyB2b2lkIGRtYV9kd2NfZXhpdChzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldikKK3sKKwlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKKwlpZiAoaG9zdF9wdnQuc2F0YV9kbWFfcmVncykKKwkJaW91bm1hcChob3N0X3B2dC5zYXRhX2RtYV9yZWdzKTsKKworCWlmIChoc2Rldi0+aXJxX2RtYSkKKwkJZnJlZV9pcnEoaHNkZXYtPmlycV9kbWEsIGhzZGV2KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBkbWFfZHdjX2luaXQKKyAqIGFyZ3VtZW50czogaHNkZXYKKyAqIHJldHVybnMgc3RhdHVzCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBTQVRBIERNQSBkcml2ZXIKKyAqLworc3RhdGljIGludCBkbWFfZHdjX2luaXQoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYsIGludCBpcnEpCit7CisJaW50IGVycjsKKworCWVyciA9IGRtYV9yZXF1ZXN0X2ludGVycnVwdHMoaHNkZXYsIGlycSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGhvc3RfcHZ0LmR3Y19kZXYsICIlczogZG1hX3JlcXVlc3RfaW50ZXJydXB0cyByZXR1cm5zIgorCQkJIiAlZFxuIiwgX19mdW5jX18sIGVycik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCS8qIEVuYWJlIERNQSAqLworCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+ZG1hX2NmZy5sb3cpLCBETUFfRU4pOworCisJZGV2X25vdGljZShob3N0X3B2dC5kd2NfZGV2LCAiRE1BIGluaXRpYWxpemVkXG4iKTsKKwlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICJTQVRBIERNQSByZWdpc3RlcnM9MHglcFxuIiwgaG9zdF9wdnQuXAorCQlzYXRhX2RtYV9yZWdzKTsKKworCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJZG1hX2R3Y19leGl0KGhzZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2F0YV9kd2Nfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NyLCB1MzIgKnZhbCkKK3sKKwlpZiAoc2NyID4gU0NSX05PVElGSUNBVElPTikgeworCQlkZXZfZXJyKGxpbmstPmFwLT5kZXYsICIlczogSW5jb3JyZWN0IFNDUiBvZmZzZXQgMHglMDJ4XG4iLAorCQkJX19mdW5jX18sIHNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSp2YWwgPSBpbl9sZTMyKCh2b2lkICopbGluay0+YXAtPmlvYWRkci5zY3JfYWRkciArIChzY3IgKiA0KSk7CisJZGV2X2RiZyhsaW5rLT5hcC0+ZGV2LCAiJXM6IGlkPSVkIHJlZz0lZCB2YWw9dmFsPTB4JTA4eFxuIiwKKwkJX19mdW5jX18sIGxpbmstPmFwLT5wcmludF9pZCwgc2NyLCAqdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhdGFfZHdjX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY3IsIHUzMiB2YWwpCit7CisJZGV2X2RiZyhsaW5rLT5hcC0+ZGV2LCAiJXM6IGlkPSVkIHJlZz0lZCB2YWw9dmFsPTB4JTA4eFxuIiwKKwkJX19mdW5jX18sIGxpbmstPmFwLT5wcmludF9pZCwgc2NyLCB2YWwpOworCWlmIChzY3IgPiBTQ1JfTk9USUZJQ0FUSU9OKSB7CisJCWRldl9lcnIobGluay0+YXAtPmRldiwgIiVzOiBJbmNvcnJlY3QgU0NSIG9mZnNldCAweCUwMnhcbiIsCisJCQkgX19mdW5jX18sIHNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlvdXRfbGUzMigodm9pZCAqKWxpbmstPmFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NyICogNCksIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBjb3JlX3Njcl9yZWFkKHVuc2lnbmVkIGludCBzY3IpCit7CisJcmV0dXJuIGluX2xlMzIoKHZvaWQgX19pb21lbSAqKShob3N0X3B2dC5zY3JfYWRkcl9zc3RhdHVzKSArXAorCQkJKHNjciAqIDQpKTsKK30KKworc3RhdGljIHZvaWQgY29yZV9zY3Jfd3JpdGUodW5zaWduZWQgaW50IHNjciwgdTMyIHZhbCkKK3sKKwlvdXRfbGUzMigodm9pZCBfX2lvbWVtICopKGhvc3RfcHZ0LnNjcl9hZGRyX3NzdGF0dXMpICsgKHNjciAqIDQpLAorCQl2YWwpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9zZXJyb3Iodm9pZCkKK3sKKwl1MzIgdmFsOworCXZhbCA9IGNvcmVfc2NyX3JlYWQoU0NSX0VSUk9SKTsKKwljb3JlX3Njcl93cml0ZShTQ1JfRVJST1IsIHZhbCk7CisKK30KKworc3RhdGljIHZvaWQgY2xlYXJfaW50ZXJydXB0X2JpdChzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldiwgdTMyIGJpdCkKK3sKKwlvdXRfbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmludHByLAorCQkgaW5fbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmludHByKSk7Cit9CisKK3N0YXRpYyB1MzIgcWNtZF90YWdfdG9fbWFzayh1OCB0YWcpCit7CisJcmV0dXJuIDB4MDAwMDAwMDEgPDwgKHRhZyAmIDB4MWYpOworfQorCisvKiBTZWUgYWhjaS5jICovCitzdGF0aWMgdm9pZCBzYXRhX2R3Y19lcnJvcl9pbnRyKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYsIHVpbnQgaW50cHIpCit7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnAgPSBIU0RFVlBfRlJPTV9BUChhcCk7CisJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmxpbmsuZWhfaW5mbzsKKwl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSAwLCBhY3Rpb24gPSAwOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTMyIHNlcnJvcjsKKwl1OCBzdGF0dXMsIHRhZzsKKwl1MzIgZXJyX3JlZzsKKworCWF0YV9laGlfY2xlYXJfZGVzYyhlaGkpOworCisJc2Vycm9yID0gY29yZV9zY3JfcmVhZChTQ1JfRVJST1IpOworCXN0YXR1cyA9IGFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApOworCisJZXJyX3JlZyA9IGluX2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfc3RhdHVzLmVycm9yLlwKKwkJCWxvdykpOworCXRhZyA9IGFwLT5saW5rLmFjdGl2ZV90YWc7CisKKwlkZXZfZXJyKGFwLT5kZXYsICIlcyBTQ1JfRVJST1I9MHglMDh4IGludHByPTB4JTA4eCBzdGF0dXM9MHglMDh4ICIKKwkJImRtYV9pbnRwPSVkIHBlbmRpbmc9JWQgaXNzdWVkPSVkIGRtYV9lcnJfc3RhdHVzPTB4JTA4eFxuIiwKKwkJX19mdW5jX18sIHNlcnJvciwgaW50cHIsIHN0YXR1cywgaG9zdF9wdnQuZG1hX2ludGVycnVwdF9jb3VudCwKKwkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddLCBoc2RldnAtPmNtZF9pc3N1ZWRbdGFnXSwgZXJyX3JlZyk7CisKKwkvKiBDbGVhciBlcnJvciByZWdpc3RlciBhbmQgaW50ZXJydXB0IGJpdCAqLworCWNsZWFyX3NlcnJvcigpOworCWNsZWFyX2ludGVycnVwdF9iaXQoaHNkZXYsIFNBVEFfRFdDX0lOVFBSX0VSUik7CisKKwkvKiBUaGlzIGlzIHRoZSBvbmx5IGVycm9yIGhhcHBlbmluZyBub3cuICBUT0RPIGNoZWNrIGZvciBleGFjdCBlcnJvciAqLworCisJZXJyX21hc2sgfD0gQUNfRVJSX0hPU1RfQlVTOworCWFjdGlvbiB8PSBBVEFfRUhfUkVTRVQ7CisKKwkvKiBQYXNzIHRoaXMgb24gdG8gRUggKi8KKwllaGktPnNlcnJvciB8PSBzZXJyb3I7CisJZWhpLT5hY3Rpb24gfD0gYWN0aW9uOworCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisJaWYgKHFjKQorCQlxYy0+ZXJyX21hc2sgfD0gZXJyX21hc2s7CisJZWxzZQorCQllaGktPmVycl9tYXNrIHw9IGVycl9tYXNrOworCisJYXRhX3BvcnRfYWJvcnQoYXApOworfQorCisvKgorICogRnVuY3Rpb24gOiBzYXRhX2R3Y19pc3IKKyAqIGFyZ3VtZW50cyA6IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncworICogUmV0dXJuIHZhbHVlIDogaXJxcmV0dXJuX3QgLSBzdGF0dXMgb2YgSVJRCisgKiBUaGlzIEludGVycnVwdCBoYW5kbGVyIGNhbGxlZCB2aWEgcG9ydCBvcHMgcmVnaXN0ZXJlZCBmdW5jdGlvbi4KKyAqIC5pcnFfaGFuZGxlciA9IHNhdGFfZHdjX2lzcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2F0YV9kd2NfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSAoc3RydWN0IGF0YV9ob3N0ICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0gSFNERVZfRlJPTV9IT1NUKGhvc3QpOworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHN0YXR1cywgdGFnOworCWludCBoYW5kbGVkLCBudW1fcHJvY2Vzc2VkLCBwb3J0ID0gMDsKKwl1aW50IGludHByLCBzYWN0aXZlLCBzYWN0aXZlMiwgdGFnX21hc2s7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnA7CisJaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCS8qIFJlYWQgdGhlIGludGVycnVwdCByZWdpc3RlciAqLworCWludHByID0gaW5fbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmludHByKTsKKworCWFwID0gaG9zdC0+cG9ydHNbcG9ydF07CisJaHNkZXZwID0gSFNERVZQX0ZST01fQVAoYXApOworCisJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgaW50cHI9MHglMDh4IGFjdGl2ZV90YWc9JWRcbiIsIF9fZnVuY19fLCBpbnRwciwKKwkJYXAtPmxpbmsuYWN0aXZlX3RhZyk7CisKKwkvKiBDaGVjayBmb3IgZXJyb3IgaW50ZXJydXB0ICovCisJaWYgKGludHByICYgU0FUQV9EV0NfSU5UUFJfRVJSKSB7CisJCXNhdGFfZHdjX2Vycm9yX2ludHIoYXAsIGhzZGV2LCBpbnRwcik7CisJCWhhbmRsZWQgPSAxOworCQlnb3RvIERPTkU7CisJfQorCisJLyogQ2hlY2sgZm9yIERNQSBTRVRVUCBGSVMgKEZQIERNQSkgaW50ZXJydXB0ICovCisJaWYgKGludHByICYgU0FUQV9EV0NfSU5UUFJfTkVXRlApIHsKKwkJY2xlYXJfaW50ZXJydXB0X2JpdChoc2RldiwgU0FUQV9EV0NfSU5UUFJfTkVXRlApOworCisJCXRhZyA9ICh1OCkoaW5fbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmZwdGFncikpOworCQlkZXZfZGJnKGFwLT5kZXYsICIlczogTkVXRlAgdGFnPSVkXG4iLCBfX2Z1bmNfXywgdGFnKTsKKwkJaWYgKGhzZGV2cC0+Y21kX2lzc3VlZFt0YWddICE9IFNBVEFfRFdDX0NNRF9JU1NVRURfUEVORCkKKwkJCWRldl93YXJuKGFwLT5kZXYsICJDTUQgdGFnPSVkIG5vdCBwZW5kaW5nP1xuIiwgdGFnKTsKKworCQlob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX2lzc3VlZCB8PSBxY21kX3RhZ190b19tYXNrKHRhZyk7CisKKwkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisJCS8qCisJCSAqIFN0YXJ0IEZQIERNQSBmb3IgTkNRIGNvbW1hbmQuICBBdCB0aGlzIHBvaW50IHRoZSB0YWcgaXMgdGhlCisJCSAqIGFjdGl2ZSB0YWcuICBJdCBpcyB0aGUgdGFnIHRoYXQgbWF0Y2hlcyB0aGUgY29tbWFuZCBhYm91dCB0bworCQkgKiBiZSBjb21wbGV0ZWQuCisJCSAqLworCQlxYy0+YXAtPmxpbmsuYWN0aXZlX3RhZyA9IHRhZzsKKwkJc2F0YV9kd2NfYm1kbWFfc3RhcnRfYnlfdGFnKHFjLCB0YWcpOworCisJCWhhbmRsZWQgPSAxOworCQlnb3RvIERPTkU7CisJfQorCXNhY3RpdmUgPSBjb3JlX3Njcl9yZWFkKFNDUl9BQ1RJVkUpOworCXRhZ19tYXNrID0gKGhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkIHwgc2FjdGl2ZSkgXiBzYWN0aXZlOworCisJLyogSWYgbm8gc2FjdGl2ZSBpc3N1ZWQgYW5kIHRhZ19tYXNrIGlzIHplcm8gdGhlbiB0aGlzIGlzIG5vdCBOQ1EgKi8KKwlpZiAoaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQgPT0gMCAmJiB0YWdfbWFzayA9PSAwKSB7CisJCWlmIChhcC0+bGluay5hY3RpdmVfdGFnID09IEFUQV9UQUdfUE9JU09OKQorCQkJdGFnID0gMDsKKwkJZWxzZQorCQkJdGFnID0gYXAtPmxpbmsuYWN0aXZlX3RhZzsKKwkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisKKwkJLyogREVWIGludGVycnVwdCB3LyBubyBhY3RpdmUgcWM/ICovCisJCWlmICh1bmxpa2VseSghcWMgfHwgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkpIHsKKwkJCWRldl9lcnIoYXAtPmRldiwgIiVzIGludGVycnVwdCB3aXRoIG5vIGFjdGl2ZSBxYyAiCisJCQkJInFjPSVwXG4iLCBfX2Z1bmNfXywgcWMpOworCQkJYXAtPm9wcy0+c2ZmX2NoZWNrX3N0YXR1cyhhcCk7CisJCQloYW5kbGVkID0gMTsKKwkJCWdvdG8gRE9ORTsKKwkJfQorCQlzdGF0dXMgPSBhcC0+b3BzLT5zZmZfY2hlY2tfc3RhdHVzKGFwKTsKKworCQlxYy0+YXAtPmxpbmsuYWN0aXZlX3RhZyA9IHRhZzsKKwkJaHNkZXZwLT5jbWRfaXNzdWVkW3RhZ10gPSBTQVRBX0RXQ19DTURfSVNTVUVEX05PVDsKKworCQlpZiAoc3RhdHVzICYgQVRBX0VSUikgeworCQkJZGV2X2RiZyhhcC0+ZGV2LCAiaW50ZXJydXB0IEFUQV9FUlIgKDB4JXgpXG4iLCBzdGF0dXMpOworCQkJc2F0YV9kd2NfcWNfY29tcGxldGUoYXAsIHFjLCAxKTsKKwkJCWhhbmRsZWQgPSAxOworCQkJZ290byBET05FOworCQl9CisKKwkJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgbm9uLU5DUSBjbWQgaW50ZXJydXB0LCBwcm90b2NvbDogJXNcbiIsCisJCQlfX2Z1bmNfXywgYXRhX2dldF9jbWRfZGVzY3JpcHQocWMtPnRmLnByb3RvY29sKSk7CitEUlZTVElMTEJVU1k6CisJCWlmIChhdGFfaXNfZG1hKHFjLT50Zi5wcm90b2NvbCkpIHsKKwkJCS8qCisJCQkgKiBFYWNoIERNQSB0cmFuc2FjdGlvbiBwcm9kdWNlcyAyIGludGVycnVwdHMuIFRoZSBETUFDCisJCQkgKiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgYW5kIHRoZSBTQVRBIGNvbnRyb2xsZXIKKwkJCSAqIG9wZXJhdGlvbiBkb25lIGludGVycnVwdC4gVGhlIGNvbW1hbmQgc2hvdWxkIGJlCisJCQkgKiBjb21wbGV0ZWQgb25seSBhZnRlciBib3RoIGludGVycnVwdHMgYXJlIHNlZW4uCisJCQkgKi8KKwkJCWhvc3RfcHZ0LmRtYV9pbnRlcnJ1cHRfY291bnQrKzsKKwkJCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gXAorCQkJCQlTQVRBX0RXQ19ETUFfUEVORElOR19OT05FKSB7CisJCQkJZGV2X2VycihhcC0+ZGV2LCAiJXM6IERNQSBub3QgcGVuZGluZyAiCisJCQkJCSJpbnRwcj0weCUwOHggc3RhdHVzPTB4JTA4eCBwZW5kaW5nIgorCQkJCQkiPSVkXG4iLCBfX2Z1bmNfXywgaW50cHIsIHN0YXR1cywKKwkJCQkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddKTsKKwkJCX0KKworCQkJaWYgKChob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50ICUgMikgPT0gMCkKKwkJCQlzYXRhX2R3Y19kbWFfeGZlcl9jb21wbGV0ZShhcCwgMSk7CisJCX0gZWxzZSBpZiAoYXRhX2lzX3BpbyhxYy0+dGYucHJvdG9jb2wpKSB7CisJCQlhdGFfc2ZmX2hzbV9tb3ZlKGFwLCBxYywgc3RhdHVzLCAwKTsKKwkJCWhhbmRsZWQgPSAxOworCQkJZ290byBET05FOworCQl9IGVsc2UgeworCQkJaWYgKHVubGlrZWx5KHNhdGFfZHdjX3FjX2NvbXBsZXRlKGFwLCBxYywgMSkpKQorCQkJCWdvdG8gRFJWU1RJTExCVVNZOworCQl9CisKKwkJaGFuZGxlZCA9IDE7CisJCWdvdG8gRE9ORTsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgYSBOQ1EgY29tbWFuZC4gQXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgZm9yIHdoaWNoCisJICogdGFncyB3ZSBoYXZlIGdvdHRlbiBhIGNvbXBsZXRpb24gaW50ZXJydXB0LiAgT25lIGludGVycnVwdCBtYXkgc2VydmUKKwkgKiBhcyBjb21wbGV0aW9uIGZvciBtb3JlIHRoYW4gb25lIG9wZXJhdGlvbiB3aGVuIGNvbW1hbmRzIGFyZSBxdWV1ZWQKKwkgKiAoTkNRKS4gIFdlIG5lZWQgdG8gcHJvY2VzcyBlYWNoIGNvbXBsZXRlZCBjb21tYW5kLgorCSAqLworCisJIC8qIHByb2Nlc3MgY29tcGxldGVkIGNvbW1hbmRzICovCisJc2FjdGl2ZSA9IGNvcmVfc2NyX3JlYWQoU0NSX0FDVElWRSk7CisJdGFnX21hc2sgPSAoaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQgfCBzYWN0aXZlKSBeIHNhY3RpdmU7CisKKwlpZiAoc2FjdGl2ZSAhPSAwIHx8IChob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX2lzc3VlZCkgPiAxIHx8IFwKKwkJCQkJCQl0YWdfbWFzayA+IDEpIHsKKwkJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgTkNROnNhY3RpdmU9MHglMDh4ICBzYWN0aXZlX2lzc3VlZD0weCUwOHgiCisJCQkidGFnX21hc2s9MHglMDh4XG4iLCBfX2Z1bmNfXywgc2FjdGl2ZSwKKwkJCWhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkLCB0YWdfbWFzayk7CisJfQorCisJaWYgKCh0YWdfbWFzayB8IChob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX2lzc3VlZCkpICE9IFwKKwkJCQkJKGhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkKSkgeworCQlkZXZfd2FybihhcC0+ZGV2LCAiQmFkIHRhZyBtYXNrPyAgc2FjdGl2ZT0weCUwOHggIgorCQkJICIoaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQpPTB4JTA4eCAgdGFnX21hc2siCisJCQkgIj0weCUwOHhcbiIsIHNhY3RpdmUsIGhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkLAorCQkJICB0YWdfbWFzayk7CisJfQorCisJLyogcmVhZCBqdXN0IHRvIGNsZWFyIC4uLiBub3QgYmFkIGlmIGN1cnJlbnRseSBzdGlsbCBidXN5ICovCisJc3RhdHVzID0gYXAtPm9wcy0+c2ZmX2NoZWNrX3N0YXR1cyhhcCk7CisJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgQVRBIHN0YXR1cyByZWdpc3Rlcj0weCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKworCXRhZyA9IDA7CisJbnVtX3Byb2Nlc3NlZCA9IDA7CisJd2hpbGUgKHRhZ19tYXNrKSB7CisJCW51bV9wcm9jZXNzZWQrKzsKKwkJd2hpbGUgKCEodGFnX21hc2sgJiAweDAwMDAwMDAxKSkgeworCQkJdGFnKys7CisJCQl0YWdfbWFzayA8PD0gMTsKKwkJfQorCisJCXRhZ19tYXNrICY9ICh+MHgwMDAwMDAwMSk7CisJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCisJCS8qIFRvIGJlIHBpY2tlZCB1cCBieSBjb21wbGV0aW9uIGZ1bmN0aW9ucyAqLworCQlxYy0+YXAtPmxpbmsuYWN0aXZlX3RhZyA9IHRhZzsKKwkJaHNkZXZwLT5jbWRfaXNzdWVkW3RhZ10gPSBTQVRBX0RXQ19DTURfSVNTVUVEX05PVDsKKworCQkvKiBMZXQgbGliYXRhL3Njc2kgbGF5ZXJzIGhhbmRsZSBlcnJvciAqLworCQlpZiAoc3RhdHVzICYgQVRBX0VSUikgeworCQkJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgQVRBX0VSUiAoMHgleClcbiIsIF9fZnVuY19fLAorCQkJCXN0YXR1cyk7CisJCQlzYXRhX2R3Y19xY19jb21wbGV0ZShhcCwgcWMsIDEpOworCQkJaGFuZGxlZCA9IDE7CisJCQlnb3RvIERPTkU7CisJCX0KKworCQkvKiBQcm9jZXNzIGNvbXBsZXRlZCBjb21tYW5kICovCisJCWRldl9kYmcoYXAtPmRldiwgIiVzIE5DUSBjb21tYW5kLCBwcm90b2NvbDogJXNcbiIsIF9fZnVuY19fLAorCQkJYXRhX2dldF9jbWRfZGVzY3JpcHQocWMtPnRmLnByb3RvY29sKSk7CisJCWlmIChhdGFfaXNfZG1hKHFjLT50Zi5wcm90b2NvbCkpIHsKKwkJCWhvc3RfcHZ0LmRtYV9pbnRlcnJ1cHRfY291bnQrKzsKKwkJCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gXAorCQkJCQlTQVRBX0RXQ19ETUFfUEVORElOR19OT05FKQorCQkJCWRldl93YXJuKGFwLT5kZXYsICIlczogRE1BIG5vdCBwZW5kaW5nP1xuIiwKKwkJCQkJX19mdW5jX18pOworCQkJaWYgKChob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50ICUgMikgPT0gMCkKKwkJCQlzYXRhX2R3Y19kbWFfeGZlcl9jb21wbGV0ZShhcCwgMSk7CisJCX0gZWxzZSB7CisJCQlpZiAodW5saWtlbHkoc2F0YV9kd2NfcWNfY29tcGxldGUoYXAsIHFjLCAxKSkpCisJCQkJZ290byBTVElMTEJVU1k7CisJCX0KKwkJY29udGludWU7CisKK1NUSUxMQlVTWToKKwkJYXAtPnN0YXRzLmlkbGVfaXJxKys7CisJCWRldl93YXJuKGFwLT5kZXYsICJTVElMTCBCVVNZIElSUSBhdGElZDogaXJxIHRyYXBcbiIsCisJCQlhcC0+cHJpbnRfaWQpOworCX0gLyogd2hpbGUgdGFnX21hc2sgKi8KKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIGFueSBjb21tYW5kcyBjb21wbGV0ZWQgd2hpbGUgd2Ugd2VyZSBwcm9jZXNzaW5nIG91cgorCSAqIGluaXRpYWwgc2V0IG9mIGNvbXBsZXRlZCBjb21tYW5kcyAocmVhZCBzdGF0dXMgY2xlYXJzIGludGVycnVwdHMsCisJICogc28gd2UgbWlnaHQgbWlzcyBhIGNvbXBsZXRlZCBjb21tYW5kIGludGVycnVwdCBpZiBvbmUgY2FtZSBpbiB3aGlsZQorCSAqIHdlIHdlcmUgcHJvY2Vzc2luZyAtLXdlIHJlYWQgc3RhdHVzIGFzIHBhcnQgb2YgcHJvY2Vzc2luZyBhIGNvbXBsZXRlZAorCSAqIGNvbW1hbmQpLgorCSAqLworCXNhY3RpdmUyID0gY29yZV9zY3JfcmVhZChTQ1JfQUNUSVZFKTsKKwlpZiAoc2FjdGl2ZTIgIT0gc2FjdGl2ZSkgeworCQlkZXZfZGJnKGFwLT5kZXYsICJNb3JlIGNvbXBsZXRlZCAtIHNhY3RpdmU9MHgleCBzYWN0aXZlMiIKKwkJCSI9MHgleFxuIiwgc2FjdGl2ZSwgc2FjdGl2ZTIpOworCX0KKwloYW5kbGVkID0gMTsKKworRE9ORToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX2NsZWFyX2RtYWNyKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwLCB1OCB0YWcpCit7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYgPSBIU0RFVl9GUk9NX0hTREVWUChoc2RldnApOworCisJaWYgKGhzZGV2cC0+ZG1hX3BlbmRpbmdbdGFnXSA9PSBTQVRBX0RXQ19ETUFfUEVORElOR19SWCkgeworCQlvdXRfbGUzMigmKGhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjciksCisJCQkgU0FUQV9EV0NfRE1BQ1JfUlhfQ0xFQVIoCisJCQkJIGluX2xlMzIoJihoc2Rldi0+c2F0YV9kd2NfcmVncy0+ZG1hY3IpKSkpOworCX0gZWxzZSBpZiAoaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddID09IFNBVEFfRFdDX0RNQV9QRU5ESU5HX1RYKSB7CisJCW91dF9sZTMyKCYoaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmRtYWNyKSwKKwkJCSBTQVRBX0RXQ19ETUFDUl9UWF9DTEVBUigKKwkJCQkgaW5fbGUzMigmKGhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjcikpKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgaXQgaW5kaWNhdGVzIHRoZSBkcml2ZXIgaXMgb3V0IG9mCisJCSAqIHN5bmMuICBJZiBpdCBkb2VzIGhhcHBlbiwgY2xlYXIgZG1hY3IgYW55d2F5LgorCQkgKi8KKwkJZGV2X2Vycihob3N0X3B2dC5kd2NfZGV2LCAiJXMgRE1BIHByb3RvY29sIFJYIGFuZCIKKwkJCSJUWCBETUEgbm90IHBlbmRpbmcgdGFnPTB4JTAyeCBwZW5kaW5nPSVkIgorCQkJIiBkbWFjcjogMHglMDh4XG4iLCBfX2Z1bmNfXywgdGFnLAorCQkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddLAorCQkJaW5fbGUzMigmKGhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjcikpKTsKKwkJb3V0X2xlMzIoJihoc2Rldi0+c2F0YV9kd2NfcmVncy0+ZG1hY3IpLAorCQkJU0FUQV9EV0NfRE1BQ1JfVFhSWENIX0NMRUFSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX2RtYV94ZmVyX2NvbXBsZXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHUzMiBjaGVja19zdGF0dXMpCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldiA9IEhTREVWX0ZST01fQVAoYXApOworCXU4IHRhZyA9IDA7CisKKwl0YWcgPSBhcC0+bGluay5hY3RpdmVfdGFnOworCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCWlmICghcWMpIHsKKwkJZGV2X2VycihhcC0+ZGV2LCAiZmFpbGVkIHRvIGdldCBxYyIpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgREVCVUdfTkNRCisJaWYgKHRhZyA+IDApIHsKKwkJZGV2X2luZm8oYXAtPmRldiwgIiVzIHRhZz0ldSBjbWQ9MHglMDJ4IGRtYSBkaXI9JXMgcHJvdG89JXMgIgorCQkJICJkbWFjcj0weCUwOHhcbiIsIF9fZnVuY19fLCBxYy0+dGFnLCBxYy0+dGYuY29tbWFuZCwKKwkJCSBhdGFfZ2V0X2NtZF9kZXNjcmlwdChxYy0+ZG1hX2RpciksCisJCQkgYXRhX2dldF9jbWRfZGVzY3JpcHQocWMtPnRmLnByb3RvY29sKSwKKwkJCSBpbl9sZTMyKCYoaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmRtYWNyKSkpOworCX0KKyNlbmRpZgorCisJaWYgKGF0YV9pc19kbWEocWMtPnRmLnByb3RvY29sKSkgeworCQlpZiAoaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddID09IFNBVEFfRFdDX0RNQV9QRU5ESU5HX05PTkUpIHsKKwkJCWRldl9lcnIoYXAtPmRldiwgIiVzIERNQSBwcm90b2NvbCBSWCBhbmQgVFggRE1BIG5vdCAiCisJCQkJInBlbmRpbmcgZG1hY3I6IDB4JTA4eFxuIiwgX19mdW5jX18sCisJCQkJaW5fbGUzMigmKGhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjcikpKTsKKwkJfQorCisJCWhzZGV2cC0+ZG1hX3BlbmRpbmdbdGFnXSA9IFNBVEFfRFdDX0RNQV9QRU5ESU5HX05PTkU7CisJCXNhdGFfZHdjX3FjX2NvbXBsZXRlKGFwLCBxYywgY2hlY2tfc3RhdHVzKTsKKwkJYXAtPmxpbmsuYWN0aXZlX3RhZyA9IEFUQV9UQUdfUE9JU09OOworCX0gZWxzZSB7CisJCXNhdGFfZHdjX3FjX2NvbXBsZXRlKGFwLCBxYywgY2hlY2tfc3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2F0YV9kd2NfcWNfY29tcGxldGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywKKwkJCQl1MzIgY2hlY2tfc3RhdHVzKQoreworCXU4IHN0YXR1cyA9IDA7CisJdTMyIG1hc2sgPSAweDA7CisJdTggdGFnID0gcWMtPnRhZzsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKKwlob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX3F1ZXVlZCA9IDA7CisJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgY2hlY2tzdGF0dXM/ICV4XG4iLCBfX2Z1bmNfXywgY2hlY2tfc3RhdHVzKTsKKworCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gU0FUQV9EV0NfRE1BX1BFTkRJTkdfVFgpCisJCWRldl9lcnIoYXAtPmRldiwgIlRYIERNQSBQRU5ESU5HXG4iKTsKKwllbHNlIGlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gU0FUQV9EV0NfRE1BX1BFTkRJTkdfUlgpCisJCWRldl9lcnIoYXAtPmRldiwgIlJYIERNQSBQRU5ESU5HXG4iKTsKKwlkZXZfZGJnKGFwLT5kZXYsICJRQyBjb21wbGV0ZSBjbWQ9MHglMDJ4IHN0YXR1cz0weCUwMnggYXRhJXU6IgorCQkiIHByb3RvY29sPSVkXG4iLCBxYy0+dGYuY29tbWFuZCwgc3RhdHVzLCBhcC0+cHJpbnRfaWQsCisJCSBxYy0+dGYucHJvdG9jb2wpOworCisJLyogY2xlYXIgYWN0aXZlIGJpdCAqLworCW1hc2sgPSAofihxY21kX3RhZ190b19tYXNrKHRhZykpKTsKKwlob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX3F1ZXVlZCA9IChob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX3F1ZXVlZCkgXAorCQkJCQkJJiBtYXNrOworCWhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkID0gKGhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkKSBcCisJCQkJCQkmIG1hc2s7CisJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2F0YV9kd2NfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYpCit7CisJLyogRW5hYmxlIHNlbGVjdGl2ZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrcmVnaXN0ZXIqLworCW91dF9sZTMyKCZoc2Rldi0+c2F0YV9kd2NfcmVncy0+aW50bXIsCisJCSBTQVRBX0RXQ19JTlRNUl9FUlJNIHwKKwkJIFNBVEFfRFdDX0lOVE1SX05FV0ZQTSB8CisJCSBTQVRBX0RXQ19JTlRNUl9QTUFCUlRNIHwKKwkJIFNBVEFfRFdDX0lOVE1SX0RNQVRNKTsKKwkvKgorCSAqIFVubWFzayB0aGUgZXJyb3IgYml0cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGFuIGVycm9yIGludGVycnVwdCBieQorCSAqIHNldHRpbmcgdGhlIGVycm9yIG1hc2sgcmVnaXN0ZXIuCisJICovCisJb3V0X2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5lcnJtciwgU0FUQV9EV0NfU0VSUk9SX0VSUl9CSVRTKTsKKworCWRldl9kYmcoaG9zdF9wdnQuZHdjX2RldiwgIiVzOiBJTlRNUiA9IDB4JTA4eCwgRVJSTVIgPSAweCUwOHhcbiIsCisJCSBfX2Z1bmNfXywgaW5fbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmludG1yKSwKKwkJaW5fbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmVycm1yKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJcG9ydC0+Y21kX2FkZHIgPSAodm9pZCAqKWJhc2UgKyAweDAwOworCXBvcnQtPmRhdGFfYWRkciA9ICh2b2lkICopYmFzZSArIDB4MDA7CisKKwlwb3J0LT5lcnJvcl9hZGRyID0gKHZvaWQgKiliYXNlICsgMHgwNDsKKwlwb3J0LT5mZWF0dXJlX2FkZHIgPSAodm9pZCAqKWJhc2UgKyAweDA0OworCisJcG9ydC0+bnNlY3RfYWRkciA9ICh2b2lkICopYmFzZSArIDB4MDg7CisKKwlwb3J0LT5sYmFsX2FkZHIgPSAodm9pZCAqKWJhc2UgKyAweDBjOworCXBvcnQtPmxiYW1fYWRkciA9ICh2b2lkICopYmFzZSArIDB4MTA7CisJcG9ydC0+bGJhaF9hZGRyID0gKHZvaWQgKiliYXNlICsgMHgxNDsKKworCXBvcnQtPmRldmljZV9hZGRyID0gKHZvaWQgKiliYXNlICsgMHgxODsKKwlwb3J0LT5jb21tYW5kX2FkZHIgPSAodm9pZCAqKWJhc2UgKyAweDFjOworCXBvcnQtPnN0YXR1c19hZGRyID0gKHZvaWQgKiliYXNlICsgMHgxYzsKKworCXBvcnQtPmFsdHN0YXR1c19hZGRyID0gKHZvaWQgKiliYXNlICsgMHgyMDsKKwlwb3J0LT5jdGxfYWRkciA9ICh2b2lkICopYmFzZSArIDB4MjA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHNhdGFfZHdjX3BvcnRfc3RhcnQKKyAqIGFyZ3VtZW50cyA6IHN0cnVjdCBhdGFfaW9wb3J0cyAqcG9ydAorICogUmV0dXJuIHZhbHVlIDogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgc2NhdHRlciBnYXRoZXIgTExJIHRhYmxlIGZvciBBSEIgRE1BCisgKi8KK3N0YXRpYyBpbnQgc2F0YV9kd2NfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2OworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpwZGV2OworCWludCBpOworCisJaHNkZXYgPSBIU0RFVl9GUk9NX0FQKGFwKTsKKworCWRldl9kYmcoYXAtPmRldiwgIiVzOiBwb3J0X25vPSVkXG4iLCBfX2Z1bmNfXywgYXAtPnBvcnRfbm8pOworCisJaHNkZXYtPmhvc3QgPSBhcC0+aG9zdDsKKwlwZGV2ID0gYXAtPmhvc3QtPmRldjsKKwlpZiAoIXBkZXYpIHsKKwkJZGV2X2VycihhcC0+ZGV2LCAiJXM6IG5vIGFwLT5ob3N0LT5kZXZcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBDTEVBTlVQOworCX0KKworCS8qIEFsbG9jYXRlIFBvcnQgU3RydWN0ICovCisJaHNkZXZwID0ga3phbGxvYyhzaXplb2YoKmhzZGV2cCksIEdGUF9LRVJORUwpOworCWlmICghaHNkZXZwKSB7CisJCWRldl9lcnIoYXAtPmRldiwgIiVzOiBrbWFsbG9jIGZhaWxlZCBmb3IgaHNkZXZwXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gQ0xFQU5VUDsKKwl9CisJaHNkZXZwLT5oc2RldiA9IGhzZGV2OworCisJZm9yIChpID0gMDsgaSA8IFNBVEFfRFdDX1FDTURfTUFYOyBpKyspCisJCWhzZGV2cC0+Y21kX2lzc3VlZFtpXSA9IFNBVEFfRFdDX0NNRF9JU1NVRURfTk9UOworCisJYXAtPmJtZG1hX3ByZCA9IDA7CS8qIHNldCB0aGVzZSBzbyBsaWJhdGEgZG9lc24ndCB1c2UgdGhlbSAqLworCWFwLT5ibWRtYV9wcmRfZG1hID0gMDsKKworCS8qCisJICogRE1BIC0gQXNzaWduIHNjYXR0ZXIgZ2F0aGVyIExMSSB0YWJsZS4gV2UgY2FuJ3QgdXNlIHRoZSBsaWJhdGEKKwkgKiB2ZXJzaW9uIHNpbmNlIGl0J3MgUFJEIGlzIElERSBQQ0kgc3BlY2lmaWMuCisJICovCisJZm9yIChpID0gMDsgaSA8IFNBVEFfRFdDX1FDTURfTUFYOyBpKyspIHsKKwkJaHNkZXZwLT5sbGl0W2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KHBkZXYsCisJCQkJCQkgICAgIFNBVEFfRFdDX0RNQUNfTExJX1RCTF9TWiwKKwkJCQkJCSAgICAgJihoc2RldnAtPmxsaXRfZG1hW2ldKSwKKwkJCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCWlmICghaHNkZXZwLT5sbGl0W2ldKSB7CisJCQlkZXZfZXJyKGFwLT5kZXYsICIlczogZG1hX2FsbG9jX2NvaGVyZW50IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gQ0xFQU5VUDsKKwkJfQorCX0KKworCWlmIChhcC0+cG9ydF9ubyA9PSAwKSAgeworCQlkZXZfZGJnKGFwLT5kZXYsICIlczogY2xlYXJpbmcgVFhDSEVOLCBSWENIRU4gaW4gRE1BQ1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJb3V0X2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjciwKKwkJCSBTQVRBX0RXQ19ETUFDUl9UWFJYQ0hfQ0xFQVIpOworCisJCWRldl9kYmcoYXAtPmRldiwgIiVzOiBzZXR0aW5nIGJ1cnN0IHNpemUgaW4gREJUU1JcbiIsCisJCQkgX19mdW5jX18pOworCQlvdXRfbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmRidHNyLAorCQkJIChTQVRBX0RXQ19EQlRTUl9NV1IoQUhCX0RNQV9CUlNUX0RGTFQpIHwKKwkJCSAgU0FUQV9EV0NfREJUU1JfTVJEKEFIQl9ETUFfQlJTVF9ERkxUKSkpOworCX0KKworCS8qIENsZWFyIGFueSBlcnJvciBiaXRzIGJlZm9yZSBsaWJhdGEgc3RhcnRzIGlzc3VpbmcgY29tbWFuZHMgKi8KKwljbGVhcl9zZXJyb3IoKTsKKwlhcC0+cHJpdmF0ZV9kYXRhID0gaHNkZXZwOworCitDTEVBTlVQOgorCWlmIChlcnIpIHsKKwkJc2F0YV9kd2NfcG9ydF9zdG9wKGFwKTsKKwkJZGV2X2RiZyhhcC0+ZGV2LCAiJXM6IGZhaWxcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGFwLT5kZXYsICIlczogZG9uZVxuIiwgX19mdW5jX18pOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWludCBpOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0gSFNERVZfRlJPTV9BUChhcCk7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnAgPSBIU0RFVlBfRlJPTV9BUChhcCk7CisKKwlkZXZfZGJnKGFwLT5kZXYsICIlczogYXAtPmlkID0gJWRcbiIsIF9fZnVuY19fLCBhcC0+cHJpbnRfaWQpOworCisJaWYgKGhzZGV2cCAmJiBoc2RldikgeworCQkvKiBkZWFsbG9jYXRlIExMSSB0YWJsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0FUQV9EV0NfUUNNRF9NQVg7IGkrKykgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQoYXAtPmhvc3QtPmRldiwKKwkJCQkJICBTQVRBX0RXQ19ETUFDX0xMSV9UQkxfU1osCisJCQkJCSBoc2RldnAtPmxsaXRbaV0sIGhzZGV2cC0+bGxpdF9kbWFbaV0pOworCQl9CisKKwkJa2ZyZWUoaHNkZXZwKTsKKwl9CisJYXAtPnByaXZhdGVfZGF0YSA9IE5VTEw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHNhdGFfZHdjX2V4ZWNfY29tbWFuZF9ieV90YWcKKyAqIGFyZ3VtZW50cyA6IGF0YV9wb3J0ICphcCwgYXRhX3Rhc2tmaWxlICp0ZiwgdTggdGFnLCB1MzIgY21kX2lzc3VlZAorICogUmV0dXJuIHZhbHVlIDogTm9uZQorICogVGhpcyBmdW5jdGlvbiBrZWVwcyB0cmFjayBvZiBpbmRpdmlkdWFsIGNvbW1hbmQgdGFnIGlkcyBhbmQgY2FsbHMKKyAqIGF0YV9leGVjX2NvbW1hbmQgaW4gbGliYXRhCisgKi8KK3N0YXRpYyB2b2lkIHNhdGFfZHdjX2V4ZWNfY29tbWFuZF9ieV90YWcoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkJIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLAorCQkJCQkgdTggdGFnLCB1MzIgY21kX2lzc3VlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwID0gSFNERVZQX0ZST01fQVAoYXApOworCisJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgY21kKDB4JTAyeCk6ICVzIHRhZz0lZFxuIiwgX19mdW5jX18sIHRmLT5jb21tYW5kLAorCQlhdGFfZ2V0X2NtZF9kZXNjcmlwdCh0ZiksIHRhZyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3QtPmxvY2ssIGZsYWdzKTsKKwloc2RldnAtPmNtZF9pc3N1ZWRbdGFnXSA9IGNtZF9pc3N1ZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3QtPmxvY2ssIGZsYWdzKTsKKwkvKgorCSAqIENsZWFyIFNFcnJvciBiZWZvcmUgZXhlY3V0aW5nIGEgbmV3IGNvbW1hbmQuCisJICogc2F0YV9kd2Nfc2NyX3dyaXRlIGFuZCByZWFkIGNhbiBub3QgYmUgdXNlZCBoZXJlLiBDbGVhcmluZyB0aGUgUE0KKwkgKiBtYW5hZ2VkIFNFcnJvciByZWdpc3RlciBmb3IgdGhlIGRpc2sgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgdGhlCisJICogdGFzayBmaWxlIGlzIGxvYWRlZC4KKwkgKi8KKwljbGVhcl9zZXJyb3IoKTsKKwlhdGFfc2ZmX2V4ZWNfY29tbWFuZChhcCwgdGYpOworfQorCitzdGF0aWMgdm9pZCBzYXRhX2R3Y19ibWRtYV9zZXR1cF9ieV90YWcoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggdGFnKQoreworCXNhdGFfZHdjX2V4ZWNfY29tbWFuZF9ieV90YWcocWMtPmFwLCAmcWMtPnRmLCB0YWcsCisJCQkJICAgICBTQVRBX0RXQ19DTURfSVNTVUVEX1BFTkQpOworfQorCitzdGF0aWMgdm9pZCBzYXRhX2R3Y19ibWRtYV9zZXR1cChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXU4IHRhZyA9IHFjLT50YWc7CisKKwlpZiAoYXRhX2lzX25jcShxYy0+dGYucHJvdG9jb2wpKSB7CisJCWRldl9kYmcocWMtPmFwLT5kZXYsICIlczogYXAtPmxpbmsuc2FjdGl2ZT0weCUwOHggdGFnPSVkXG4iLAorCQkJX19mdW5jX18sIHFjLT5hcC0+bGluay5zYWN0aXZlLCB0YWcpOworCX0gZWxzZSB7CisJCXRhZyA9IDA7CisJfQorCXNhdGFfZHdjX2JtZG1hX3NldHVwX2J5X3RhZyhxYywgdGFnKTsKK30KKworc3RhdGljIHZvaWQgc2F0YV9kd2NfYm1kbWFfc3RhcnRfYnlfdGFnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IHRhZykKK3sKKwlpbnQgc3RhcnRfZG1hOworCXUzMiByZWcsIGRtYV9jaGFuOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0gSFNERVZfRlJPTV9RQyhxYyk7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKKwlpbnQgZGlyID0gcWMtPmRtYV9kaXI7CisJZG1hX2NoYW4gPSBoc2RldnAtPmRtYV9jaGFuW3RhZ107CisKKwlpZiAoaHNkZXZwLT5jbWRfaXNzdWVkW3RhZ10gIT0gU0FUQV9EV0NfQ01EX0lTU1VFRF9OT1QpIHsKKwkJc3RhcnRfZG1hID0gMTsKKwkJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKQorCQkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddID0gU0FUQV9EV0NfRE1BX1BFTkRJTkdfVFg7CisJCWVsc2UKKwkJCWhzZGV2cC0+ZG1hX3BlbmRpbmdbdGFnXSA9IFNBVEFfRFdDX0RNQV9QRU5ESU5HX1JYOworCX0gZWxzZSB7CisJCWRldl9lcnIoYXAtPmRldiwgIiVzOiBDb21tYW5kIG5vdCBwZW5kaW5nIGNtZF9pc3N1ZWQ9JWQgIgorCQkJIih0YWc9JWQpIERNQSBOT1Qgc3RhcnRlZFxuIiwgX19mdW5jX18sCisJCQloc2RldnAtPmNtZF9pc3N1ZWRbdGFnXSwgdGFnKTsKKwkJc3RhcnRfZG1hID0gMDsKKwl9CisKKwlkZXZfZGJnKGFwLT5kZXYsICIlcyBxYz0lcCB0YWc6ICV4IGNtZDogMHglMDJ4IGRtYV9kaXI6ICVzICIKKwkJInN0YXJ0X2RtYT8gJXhcbiIsIF9fZnVuY19fLCBxYywgdGFnLCBxYy0+dGYuY29tbWFuZCwKKwkJYXRhX2dldF9jbWRfZGVzY3JpcHQocWMtPmRtYV9kaXIpLCBzdGFydF9kbWEpOworCXNhdGFfZHdjX3RmX2R1bXAoJihxYy0+dGYpKTsKKworCWlmIChzdGFydF9kbWEpIHsKKwkJcmVnID0gY29yZV9zY3JfcmVhZChTQ1JfRVJST1IpOworCQlpZiAocmVnICYgU0FUQV9EV0NfU0VSUk9SX0VSUl9CSVRTKSB7CisJCQlkZXZfZXJyKGFwLT5kZXYsICIlczogKioqKioqIFNFcnJvcj0weCUwOHggKioqKioqXG4iLAorCQkJCV9fZnVuY19fLCByZWcpOworCQl9CisKKwkJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKQorCQkJb3V0X2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjciwKKwkJCQlTQVRBX0RXQ19ETUFDUl9UWENIRU4pOworCQllbHNlCisJCQlvdXRfbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmRtYWNyLAorCQkJCVNBVEFfRFdDX0RNQUNSX1JYQ0hFTik7CisKKwkJLyogRW5hYmxlIEFIQiBETUEgdHJhbnNmZXIgb24gdGhlIHNwZWNpZmllZCBjaGFubmVsICovCisJCWRtYV9kd2NfeGZlcl9zdGFydChkbWFfY2hhbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYXRhX2R3Y19ibWRtYV9zdGFydChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXU4IHRhZyA9IHFjLT50YWc7CisKKwlpZiAoYXRhX2lzX25jcShxYy0+dGYucHJvdG9jb2wpKSB7CisJCWRldl9kYmcocWMtPmFwLT5kZXYsICIlczogYXAtPmxpbmsuc2FjdGl2ZT0weCUwOHggdGFnPSVkXG4iLAorCQkJX19mdW5jX18sIHFjLT5hcC0+bGluay5zYWN0aXZlLCB0YWcpOworCX0gZWxzZSB7CisJCXRhZyA9IDA7CisJfQorCWRldl9kYmcocWMtPmFwLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCXNhdGFfZHdjX2JtZG1hX3N0YXJ0X2J5X3RhZyhxYywgdGFnKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc2F0YV9kd2NfcWNfcHJlcF9ieV90YWcKKyAqIGFyZ3VtZW50cyA6IGF0YV9xdWV1ZWRfY21kICpxYywgdTggdGFnCisgKiBSZXR1cm4gdmFsdWUgOiBOb25lCisgKiBxY19wcmVwIGZvciBhIHBhcnRpY3VsYXIgcXVldWVkIGNvbW1hbmQgYmFzZWQgb24gdGFnCisgKi8KK3N0YXRpYyB2b2lkIHNhdGFfZHdjX3FjX3ByZXBfYnlfdGFnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IHRhZykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcWMtPnNnOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdTMyIGRtYV9jaGFuOworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0gSFNERVZfRlJPTV9BUChhcCk7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnAgPSBIU0RFVlBfRlJPTV9BUChhcCk7CisJaW50IGVycjsKKworCWRldl9kYmcoYXAtPmRldiwgIiVzOiBwb3J0PSVkIGRtYSBkaXI9JXMgbl9lbGVtPSVkXG4iLAorCQlfX2Z1bmNfXywgYXAtPnBvcnRfbm8sIGF0YV9nZXRfY21kX2Rlc2NyaXB0KHFjLT5kbWFfZGlyKSwKKwkJIHFjLT5uX2VsZW0pOworCisJZG1hX2NoYW4gPSBkbWFfZHdjX3hmZXJfc2V0dXAoc2csIHFjLT5uX2VsZW0sIGhzZGV2cC0+bGxpdFt0YWddLAorCQkJCSAgICAgIGhzZGV2cC0+bGxpdF9kbWFbdGFnXSwKKwkJCQkgICAgICAodm9pZCAqX19pb21lbSkoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5cCisJCQkJICAgICAgZG1hZHIpLCBxYy0+ZG1hX2Rpcik7CisJaWYgKGRtYV9jaGFuIDwgMCkgeworCQlkZXZfZXJyKGFwLT5kZXYsICIlczogZG1hX2R3Y194ZmVyX3NldHVwIHJldHVybnMgZXJyICVkXG4iLAorCQkJX19mdW5jX18sIGVycik7CisJCXJldHVybjsKKwl9CisJaHNkZXZwLT5kbWFfY2hhblt0YWddID0gZG1hX2NoYW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2F0YV9kd2NfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwl1MzIgc2FjdGl2ZTsKKwl1OCB0YWcgPSBxYy0+dGFnOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisKKyNpZmRlZiBERUJVR19OQ1EKKwlpZiAocWMtPnRhZyA+IDAgfHwgYXAtPmxpbmsuc2FjdGl2ZSA+IDEpCisJCWRldl9pbmZvKGFwLT5kZXYsICIlcyBhcCBpZD0lZCBjbWQoMHglMDJ4KT0lcyBxYyB0YWc9JWQgIgorCQkJICJwcm90PSVzIGFwIGFjdGl2ZV90YWc9MHglMDh4IGFwIHNhY3RpdmU9MHglMDh4XG4iLAorCQkJIF9fZnVuY19fLCBhcC0+cHJpbnRfaWQsIHFjLT50Zi5jb21tYW5kLAorCQkJIGF0YV9nZXRfY21kX2Rlc2NyaXB0KCZxYy0+dGYpLAorCQkJIHFjLT50YWcsIGF0YV9nZXRfY21kX2Rlc2NyaXB0KHFjLT50Zi5wcm90b2NvbCksCisJCQkgYXAtPmxpbmsuYWN0aXZlX3RhZywgYXAtPmxpbmsuc2FjdGl2ZSk7CisjZW5kaWYKKworCWlmICghYXRhX2lzX25jcShxYy0+dGYucHJvdG9jb2wpKQorCQl0YWcgPSAwOworCXNhdGFfZHdjX3FjX3ByZXBfYnlfdGFnKHFjLCB0YWcpOworCisJaWYgKGF0YV9pc19uY3EocWMtPnRmLnByb3RvY29sKSkgeworCQlzYWN0aXZlID0gY29yZV9zY3JfcmVhZChTQ1JfQUNUSVZFKTsKKwkJc2FjdGl2ZSB8PSAoMHgwMDAwMDAwMSA8PCB0YWcpOworCQljb3JlX3Njcl93cml0ZShTQ1JfQUNUSVZFLCBzYWN0aXZlKTsKKworCQlkZXZfZGJnKHFjLT5hcC0+ZGV2LCAiJXM6IHRhZz0lZCBhcC0+bGluay5zYWN0aXZlID0gMHglMDh4ICIKKwkJCSJzYWN0aXZlPTB4JTA4eFxuIiwgX19mdW5jX18sIHRhZywgcWMtPmFwLT5saW5rLnNhY3RpdmUsCisJCQlzYWN0aXZlKTsKKworCQlhcC0+b3BzLT5zZmZfdGZfbG9hZChhcCwgJnFjLT50Zik7CisJCXNhdGFfZHdjX2V4ZWNfY29tbWFuZF9ieV90YWcoYXAsICZxYy0+dGYsIHFjLT50YWcsCisJCQkJCSAgICAgU0FUQV9EV0NfQ01EX0lTU1VFRF9QRU5EKTsKKwl9IGVsc2UgeworCQlhdGFfc2ZmX3FjX2lzc3VlKHFjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHNhdGFfZHdjX3FjX3ByZXAKKyAqIGFyZ3VtZW50cyA6IGF0YV9xdWV1ZWRfY21kICpxYworICogUmV0dXJuIHZhbHVlIDogTm9uZQorICogcWNfcHJlcCBmb3IgYSBwYXJ0aWN1bGFyIHF1ZXVlZCBjb21tYW5kCisgKi8KKworc3RhdGljIHZvaWQgc2F0YV9kd2NfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWlmICgocWMtPmRtYV9kaXIgPT0gRE1BX05PTkUpIHx8IChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfUElPKSkKKwkJcmV0dXJuOworCisjaWZkZWYgREVCVUdfTkNRCisJaWYgKHFjLT50YWcgPiAwKQorCQlkZXZfaW5mbyhxYy0+YXAtPmRldiwgIiVzOiBxYy0+dGFnPSVkIGFwLT5hY3RpdmVfdGFnPTB4JTA4eFxuIiwKKwkJCSBfX2Z1bmNfXywgdGFnLCBxYy0+YXAtPmxpbmsuYWN0aXZlX3RhZyk7CisKKwlyZXR1cm4gOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlhcC0+bGluay5mbGFncyB8PSBBVEFfTEZMQUdfTk9fSFJTVDsKKwlhdGFfc2ZmX2Vycm9yX2hhbmRsZXIoYXApOworfQorCisvKgorICogc2NzaSBtaWQtbGF5ZXIgYW5kIGxpYmF0YSBpbnRlcmZhY2Ugc3RydWN0dXJlcworICovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzYXRhX2R3Y19zaHQgPSB7CisJQVRBX05DUV9TSFQoRFJWX05BTUUpLAorCS8qCisJICogdGVzdC1vbmx5OiBDdXJyZW50bHkgdGhpcyBkcml2ZXIgZG9lc24ndCBoYW5kbGUgTkNRCisJICogY29ycmVjdGx5LiBXZSBlbmFibGUgTkNRIGJ1dCBzZXQgdGhlIHF1ZXVlIGRlcHRoIHRvIGEKKwkgKiBtYXggb2YgMS4gVGhpcyB3aWxsIGdldCBmaXhlZCBpbiBpbiBhIGZ1dHVyZSByZWxlYXNlLgorCSAqLworCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAkvKiBBVEFfTUFYX1FVRVVFICovCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHNhdGFfZHdjX29wcyA9IHsKKwkuaW5oZXJpdHMJCT0gJmF0YV9zZmZfcG9ydF9vcHMsCisKKwkuZXJyb3JfaGFuZGxlcgkJPSBzYXRhX2R3Y19lcnJvcl9oYW5kbGVyLAorCisJLnFjX3ByZXAJCT0gc2F0YV9kd2NfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gc2F0YV9kd2NfcWNfaXNzdWUsCisKKwkuc2NyX3JlYWQJCT0gc2F0YV9kd2Nfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBzYXRhX2R3Y19zY3Jfd3JpdGUsCisKKwkucG9ydF9zdGFydAkJPSBzYXRhX2R3Y19wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gc2F0YV9kd2NfcG9ydF9zdG9wLAorCisJLmJtZG1hX3NldHVwCQk9IHNhdGFfZHdjX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydAkJPSBzYXRhX2R3Y19ibWRtYV9zdGFydCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzYXRhX2R3Y19wb3J0X2luZm9bXSA9IHsKKwl7CisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OQ1EsCisJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbyAwLTQgKi8KKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzCT0gJnNhdGFfZHdjX29wcywKKwl9LAorfTsKKworc3RhdGljIGludCBzYXRhX2R3Y19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKKwkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2OworCXUzMiBpZHIsIHZlcnNpb25yOworCWNoYXIgKnZlciA9IChjaGFyICopJnZlcnNpb25yOworCXU4ICpiYXNlID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaXJxLCByYzsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBzYXRhX2R3Y19wb3J0X2luZm9bMF07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKKworCS8qIEFsbG9jYXRlIERXQyBTQVRBIGRldmljZSAqLworCWhzZGV2ID0ga21hbGxvYyhzaXplb2YoKmhzZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhzZGV2ID09IE5VTEwpIHsKKwkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImttYWxsb2MgZmFpbGVkIGZvciBoc2RldlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwltZW1zZXQoaHNkZXYsIDAsIHNpemVvZigqaHNkZXYpKTsKKworCS8qIElvcmVtYXAgU0FUQSByZWdpc3RlcnMgKi8KKwliYXNlID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAoIWJhc2UpIHsKKwkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImlvcmVtYXAgZmFpbGVkIGZvciBTQVRBIHJlZ2lzdGVyIgorCQkJIiBhZGRyZXNzXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCWhzZGV2LT5yZWdfYmFzZSA9IGJhc2U7CisJZGV2X2RiZygmb2ZkZXYtPmRldiwgImlvcmVtYXAgZG9uZSBmb3IgU0FUQSByZWdpc3RlciBhZGRyZXNzXG4iKTsKKworCS8qIFN5bm9wc3lzIERXQyBTQVRBIHNwZWNpZmljIFJlZ2lzdGVycyAqLworCWhzZGV2LT5zYXRhX2R3Y19yZWdzID0gKHZvaWQgKl9faW9tZW0pKGJhc2UgKyBTQVRBX0RXQ19SRUdfT0ZGU0VUKTsKKworCS8qIEFsbG9jYXRlIGFuZCBmaWxsIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJm9mZGV2LT5kZXYsIHBwaSwgU0FUQV9EV0NfTUFYX1BPUlRTKTsKKwlpZiAoIWhvc3QpIHsKKwkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImF0YV9ob3N0X2FsbG9jX3BpbmZvIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhzZGV2OworCisJLyogU2V0dXAgcG9ydCAqLworCWhvc3QtPnBvcnRzWzBdLT5pb2FkZHIuY21kX2FkZHIgPSBiYXNlOworCWhvc3QtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgPSBiYXNlICsgU0FUQV9EV0NfU0NSX09GRlNFVDsKKwlob3N0X3B2dC5zY3JfYWRkcl9zc3RhdHVzID0gYmFzZSArIFNBVEFfRFdDX1NDUl9PRkZTRVQ7CisJc2F0YV9kd2Nfc2V0dXBfcG9ydCgmaG9zdC0+cG9ydHNbMF0tPmlvYWRkciwgKHVuc2lnbmVkIGxvbmcpYmFzZSk7CisKKwkvKiBSZWFkIHRoZSBJRCBhbmQgVmVyc2lvbiBSZWdpc3RlcnMgKi8KKwlpZHIgPSBpbl9sZTMyKCZoc2Rldi0+c2F0YV9kd2NfcmVncy0+aWRyKTsKKwl2ZXJzaW9uciA9IGluX2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT52ZXJzaW9ucik7CisJZGV2X25vdGljZSgmb2ZkZXYtPmRldiwgImlkICVkLCBjb250cm9sbGVyIHZlcnNpb24gJWMuJWMlY1xuIiwKKwkJICAgaWRyLCB2ZXJbMF0sIHZlclsxXSwgdmVyWzJdKTsKKworCS8qIEdldCBTQVRBIERNQSBpbnRlcnJ1cHQgbnVtYmVyICovCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAxKTsKKwlpZiAoaXJxID09IE5PX0lSUSkgeworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAibm8gU0FUQSBETUEgaXJxXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyogR2V0IHBoeXNpY2FsIFNBVEEgRE1BIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCWhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MgPSBvZl9pb21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDEpOworCWlmICghKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MpKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZCBmb3IgQUhCRE1BIHJlZ2lzdGVyIgorCQkJIiBhZGRyZXNzXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyogU2F2ZSBkZXYgZm9yIGxhdGVyIHVzZSBpbiBkZXZfeHh4KCkgcm91dGluZXMgKi8KKwlob3N0X3B2dC5kd2NfZGV2ID0gJm9mZGV2LT5kZXY7CisKKwkvKiBJbml0aWFsaXplIEFIQiBETUFDICovCisJZG1hX2R3Y19pbml0KGhzZGV2LCBpcnEpOworCisJLyogRW5hYmxlIFNBVEEgSW50ZXJydXB0cyAqLworCXNhdGFfZHdjX2VuYWJsZV9pbnRlcnJ1cHRzKGhzZGV2KTsKKworCS8qIEdldCBTQVRBIGludGVycnVwdCBudW1iZXIgKi8KKwlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOworCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJubyBTQVRBIERNQSBpcnFcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwkvKgorCSAqIE5vdywgcmVnaXN0ZXIgd2l0aCBsaWJBVEEgY29yZSwgdGhpcyB3aWxsIGFsc28gaW5pdGlhdGUgdGhlCisJICogZGV2aWNlIGRpc2NvdmVyeSBwcm9jZXNzLCBpbnZva2luZyBvdXIgcG9ydF9zdGFydCgpIGhhbmRsZXIgJgorCSAqIGVycm9yX2hhbmRsZXIoKSB0byBleGVjdXRlIGEgZHVtbXkgU29mdHJlc2V0IEVIIHNlc3Npb24KKwkgKi8KKwlyYyA9IGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIGlycSwgc2F0YV9kd2NfaXNyLCAwLCAmc2F0YV9kd2Nfc2h0KTsKKworCWlmIChyYyAhPSAwKQorCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFjdGl2YXRlIGhvc3QiKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgaG9zdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX291dDoKKwkvKiBGcmVlIFNBVEEgRE1BIHJlc291cmNlcyAqLworCWRtYV9kd2NfZXhpdChoc2Rldik7CisKKwlpZiAoYmFzZSkKKwkJaW91bm1hcChiYXNlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNhdGFfZHdjX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb2ZkZXYtPmRldjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKworCWF0YV9ob3N0X2RldGFjaChob3N0KTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCS8qIEZyZWUgU0FUQSBETUEgcmVzb3VyY2VzICovCisJZG1hX2R3Y19leGl0KGhzZGV2KTsKKworCWlvdW5tYXAoaHNkZXYtPnJlZ19iYXNlKTsKKwlrZnJlZShoc2Rldik7CisJa2ZyZWUoaG9zdCk7CisJZGV2X2RiZygmb2ZkZXYtPmRldiwgImRvbmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzYXRhX2R3Y19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYW1jYyxzYXRhLTQ2MGV4IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNhdGFfZHdjX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgc2F0YV9kd2NfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzYXRhX2R3Y19tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNhdGFfZHdjX3Byb2JlLAorCS5yZW1vdmUgPSBzYXRhX2R3Y19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYXRhX2R3Y19pbml0KHZvaWQpCit7CisJcmV0dXJuCW9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmc2F0YV9kd2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhdGFfZHdjX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmc2F0YV9kd2NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2F0YV9kd2NfaW5pdCk7Cittb2R1bGVfZXhpdChzYXRhX2R3Y19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyayBNaWVzZmVsZCA8bW1pZXNmZWxkQGFtY2MuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXNpZ25XYXJlIENvcmVzIFNBVEEgY29udHJvbGxlciBsb3cgbGV2ZXIgZHJpdmVyIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9mc2wuYwppbmRleCA2MWM4OWI1Li4xOGM5ODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfZnNsLmMKQEAgLTEwOTYsNyArMTA5Niw3IEBACiB7CiAJc3RydWN0IHNhdGFfZnNsX2hvc3RfcHJpdiAqaG9zdF9wcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKmhjcl9iYXNlID0gaG9zdF9wcml2LT5oY3JfYmFzZTsKLQl1MzIgaHN0YXR1cywgcWNfYWN0aXZlID0gMDsKKwl1MzIgaHN0YXR1cywgZG9uZV9tYXNrID0gMDsKIAlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCXUzMiBTRXJyb3I7CiAKQEAgLTExMTYsMjggKzExMTYsMjggQEAKIAl9CiAKIAkvKiBSZWFkIGNvbW1hbmQgY29tcGxldGVkIHJlZ2lzdGVyICovCi0JcWNfYWN0aXZlID0gaW9yZWFkMzIoaGNyX2Jhc2UgKyBDQyk7CisJZG9uZV9tYXNrID0gaW9yZWFkMzIoaGNyX2Jhc2UgKyBDQyk7CiAKIAlWUFJJTlRLKCJTdGF0dXMgb2YgYWxsIHF1ZXVlcyA6XG4iKTsKLQlWUFJJTlRLKCJxY19hY3RpdmUvQ0MgPSAweCV4LCBDQSA9IDB4JXgsIENFPTB4JXgsQ1E9MHgleCxhcHFhPTB4JXhcbiIsCi0JCXFjX2FjdGl2ZSwKKwlWUFJJTlRLKCJkb25lX21hc2svQ0MgPSAweCV4LCBDQSA9IDB4JXgsIENFPTB4JXgsQ1E9MHgleCxhcHFhPTB4JXhcbiIsCisJCWRvbmVfbWFzaywKIAkJaW9yZWFkMzIoaGNyX2Jhc2UgKyBDQSksCiAJCWlvcmVhZDMyKGhjcl9iYXNlICsgQ0UpLAogCQlpb3JlYWQzMihoY3JfYmFzZSArIENRKSwKIAkJYXAtPnFjX2FjdGl2ZSk7CiAKLQlpZiAocWNfYWN0aXZlICYgYXAtPnFjX2FjdGl2ZSkgeworCWlmIChkb25lX21hc2sgJiBhcC0+cWNfYWN0aXZlKSB7CiAJCWludCBpOwogCQkvKiBjbGVhciBDQyBiaXQsIHRoaXMgd2lsbCBhbHNvIGNvbXBsZXRlIHRoZSBpbnRlcnJ1cHQgKi8KLQkJaW93cml0ZTMyKHFjX2FjdGl2ZSwgaGNyX2Jhc2UgKyBDQyk7CisJCWlvd3JpdGUzMihkb25lX21hc2ssIGhjcl9iYXNlICsgQ0MpOwogCiAJCURQUklOVEsoIlN0YXR1cyBvZiBhbGwgcXVldWVzIDpcbiIpOwotCQlEUFJJTlRLKCJxY19hY3RpdmUvQ0MgPSAweCV4LCBDQSA9IDB4JXgsIENFPTB4JXhcbiIsCi0JCQlxY19hY3RpdmUsIGlvcmVhZDMyKGhjcl9iYXNlICsgQ0EpLAorCQlEUFJJTlRLKCJkb25lX21hc2svQ0MgPSAweCV4LCBDQSA9IDB4JXgsIENFPTB4JXhcbiIsCisJCQlkb25lX21hc2ssIGlvcmVhZDMyKGhjcl9iYXNlICsgQ0EpLAogCQkJaW9yZWFkMzIoaGNyX2Jhc2UgKyBDRSkpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBTQVRBX0ZTTF9RVUVVRV9ERVBUSDsgaSsrKSB7Ci0JCQlpZiAocWNfYWN0aXZlICYgKDEgPDwgaSkpIHsKKwkJCWlmIChkb25lX21hc2sgJiAoMSA8PCBpKSkgewogCQkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBpKTsKIAkJCQlpZiAocWMpIHsKIAkJCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKQEAgLTExNjQsNyArMTE2NCw3IEBACiAJCS8qIFNwdXJpb3VzIEludGVycnVwdCEhICovCiAJCURQUklOVEsoInNwdXJpb3VzIGludGVycnVwdCEhLCBDQyA9IDB4JXhcbiIsCiAJCQlpb3JlYWQzMihoY3JfYmFzZSArIENDKSk7Ci0JCWlvd3JpdGUzMihxY19hY3RpdmUsIGhjcl9iYXNlICsgQ0MpOworCQlpb3dyaXRlMzIoZG9uZV9tYXNrLCBoY3JfYmFzZSArIENDKTsKIAkJcmV0dXJuOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbXYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwppbmRleCBhNDc2Y2Q5Li45NDYzYzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX212LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCkBAIC0yNzE2LDM0ICsyNzE2LDM1IEBACiBzdGF0aWMgdm9pZCBtdl9wcm9jZXNzX2NycGJfcmVzcG9uc2Uoc3RydWN0IGF0YV9wb3J0ICphcCwKIAkJc3RydWN0IG12X2NycGIgKnJlc3BvbnNlLCB1bnNpZ25lZCBpbnQgdGFnLCBpbnQgbmNxX2VuYWJsZWQpCiB7CisJdTggYXRhX3N0YXR1czsKKwl1MTYgZWRtYV9zdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwb25zZS0+ZmxhZ3MpOwogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CiAKLQlpZiAocWMpIHsKLQkJdTggYXRhX3N0YXR1czsKLQkJdTE2IGVkbWFfc3RhdHVzID0gbGUxNl90b19jcHUocmVzcG9uc2UtPmZsYWdzKTsKLQkJLyoKLQkJICogZWRtYV9zdGF0dXMgZnJvbSBhIHJlc3BvbnNlIHF1ZXVlIGVudHJ5OgotCQkgKiAgIExTQiBpcyBmcm9tIEVETUFfRVJSX0lSUV9DQVVTRSAobm9uLU5DUSBvbmx5KS4KLQkJICogICBNU0IgaXMgc2F2ZWQgQVRBIHN0YXR1cyBmcm9tIGNvbW1hbmQgY29tcGxldGlvbi4KLQkJICovCi0JCWlmICghbmNxX2VuYWJsZWQpIHsKLQkJCXU4IGVycl9jYXVzZSA9IGVkbWFfc3RhdHVzICYgMHhmZiAmIH5FRE1BX0VSUl9ERVY7Ci0JCQlpZiAoZXJyX2NhdXNlKSB7Ci0JCQkJLyoKLQkJCQkgKiBFcnJvciB3aWxsIGJlIHNlZW4vaGFuZGxlZCBieSBtdl9lcnJfaW50cigpLgotCQkJCSAqIFNvIGRvIG5vdGhpbmcgYXQgYWxsIGhlcmUuCi0JCQkJICovCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWF0YV9zdGF0dXMgPSBlZG1hX3N0YXR1cyA+PiBDUlBCX0ZMQUdfU1RBVFVTX1NISUZUOwotCQlpZiAoIWFjX2Vycl9tYXNrKGF0YV9zdGF0dXMpKQotCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKLQkJLyogZWxzZTogbGVhdmUgaXQgZm9yIG12X2Vycl9pbnRyKCkgKi8KLQl9IGVsc2UgeworCWlmICh1bmxpa2VseSghcWMpKSB7CiAJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICIlczogbm8gcWMgZm9yIHRhZz0lZFxuIiwKIAkJCQlfX2Z1bmNfXywgdGFnKTsKKwkJcmV0dXJuOwogCX0KKworCS8qCisJICogZWRtYV9zdGF0dXMgZnJvbSBhIHJlc3BvbnNlIHF1ZXVlIGVudHJ5OgorCSAqICAgTFNCIGlzIGZyb20gRURNQV9FUlJfSVJRX0NBVVNFIChub24tTkNRIG9ubHkpLgorCSAqICAgTVNCIGlzIHNhdmVkIEFUQSBzdGF0dXMgZnJvbSBjb21tYW5kIGNvbXBsZXRpb24uCisJICovCisJaWYgKCFuY3FfZW5hYmxlZCkgeworCQl1OCBlcnJfY2F1c2UgPSBlZG1hX3N0YXR1cyAmIDB4ZmYgJiB+RURNQV9FUlJfREVWOworCQlpZiAoZXJyX2NhdXNlKSB7CisJCQkvKgorCQkJICogRXJyb3Igd2lsbCBiZSBzZWVuL2hhbmRsZWQgYnkKKwkJCSAqIG12X2Vycl9pbnRyKCkuICBTbyBkbyBub3RoaW5nIGF0IGFsbCBoZXJlLgorCQkJICovCisJCQlyZXR1cm47CisJCX0KKwl9CisJYXRhX3N0YXR1cyA9IGVkbWFfc3RhdHVzID4+IENSUEJfRkxBR19TVEFUVVNfU0hJRlQ7CisJaWYgKCFhY19lcnJfbWFzayhhdGFfc3RhdHVzKSkKKwkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwkvKiBlbHNlOiBsZWF2ZSBpdCBmb3IgbXZfZXJyX2ludHIoKSAqLwogfQogCiBzdGF0aWMgdm9pZCBtdl9wcm9jZXNzX2NycGJfZW50cmllcyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgbXZfcG9ydF9wcml2ICpwcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCAyMTE2MTEzLi5jYjg5ZWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCQkJICAgICAgTlZfQURNQV9TVEFUX0NQQkVSUiB8CiAJCQkgICAgICBOVl9BRE1BX1NUQVRfQ01EX0NPTVBMRVRFKSkgewogCQkJdTMyIGNoZWNrX2NvbW1hbmRzID0gbm90aWZpZXJfY2xlYXJzW2ldOwotCQkJaW50IHBvcywgZXJyb3IgPSAwOworCQkJaW50IHBvcywgcmM7CiAKIAkJCWlmIChzdGF0dXMgJiBOVl9BRE1BX1NUQVRfQ1BCRVJSKSB7CiAJCQkJLyogY2hlY2sgYWxsIGFjdGl2ZSBjb21tYW5kcyAqLwpAQCAtMTAzMCwxMCArMTAzMCwxMiBAQAogCQkJfQogCiAJCQkvKiBjaGVjayBDUEJzIGZvciBjb21wbGV0ZWQgY29tbWFuZHMgKi8KLQkJCXdoaWxlICgocG9zID0gZmZzKGNoZWNrX2NvbW1hbmRzKSkgJiYgIWVycm9yKSB7CisJCQl3aGlsZSAoKHBvcyA9IGZmcyhjaGVja19jb21tYW5kcykpKSB7CiAJCQkJcG9zLS07Ci0JCQkJZXJyb3IgPSBudl9hZG1hX2NoZWNrX2NwYihhcCwgcG9zLAorCQkJCXJjID0gbnZfYWRtYV9jaGVja19jcGIoYXAsIHBvcywKIAkJCQkJCW5vdGlmaWVyX2Vycm9yICYgKDEgPDwgcG9zKSk7CisJCQkJaWYgKHVubGlrZWx5KHJjKSkKKwkJCQkJY2hlY2tfY29tbWFuZHMgPSAwOwogCQkJCWNoZWNrX2NvbW1hbmRzICY9IH4oMSA8PCBwb3MpOwogCQkJfQogCQl9CkBAIC0yMTI5LDcgKzIxMzEsNiBAQAogCXN0cnVjdCBudl9zd25jcV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+bGluay5laF9pbmZvOwogCXUzMiBzYWN0aXZlOwotCWludCBucl9kb25lID0gMDsKIAl1MzIgZG9uZV9tYXNrOwogCWludCBpOwogCXU4IGhvc3Rfc3RhdDsKQEAgLTIxNzAsMjIgKzIxNzEsMjEgQEAKIAkJCXBwLT5kaGZpc19iaXRzICY9IH4oMSA8PCBpKTsKIAkJCXBwLT5kbWFmaXNfYml0cyAmPSB+KDEgPDwgaSk7CiAJCQlwcC0+c2RiZmlzX2JpdHMgfD0gKDEgPDwgaSk7Ci0JCQlucl9kb25lKys7CiAJCX0KIAl9CiAKIAlpZiAoIWFwLT5xY19hY3RpdmUpIHsKIAkJRFBSSU5USygib3ZlclxuIik7CiAJCW52X3N3bmNxX3BwX3JlaW5pdChhcCk7Ci0JCXJldHVybiBucl9kb25lOworCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAocHAtPnFjX2FjdGl2ZSAmIHBwLT5kaGZpc19iaXRzKQotCQlyZXR1cm4gbnJfZG9uZTsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoKHBwLT5uY3FfZmxhZ3MgJiBuY3Ffc2F3X2JhY2tvdXQpIHx8CiAJICAgIChwcC0+cWNfYWN0aXZlIF4gcHAtPmRoZmlzX2JpdHMpKQotCQkvKiBpZiB0aGUgY29udHJvbGxlciBjYW5uJ3QgZ2V0IGEgZGV2aWNlIHRvIGhvc3QgcmVnaXN0ZXIgRklTLAorCQkvKiBpZiB0aGUgY29udHJvbGxlciBjYW4ndCBnZXQgYSBkZXZpY2UgdG8gaG9zdCByZWdpc3RlciBGSVMsCiAJCSAqIFRoZSBkcml2ZXIgbmVlZHMgdG8gcmVpc3N1ZSB0aGUgbmV3IGNvbW1hbmQuCiAJCSAqLwogCQlsYWNrX2RoZmlzID0gMTsKQEAgLTIyMDIsNyArMjIwMiw3IEBACiAJaWYgKGxhY2tfZGhmaXMpIHsKIAkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHBwLT5sYXN0X2lzc3VlX3RhZyk7CiAJCW52X3N3bmNxX2lzc3VlX2F0YWNtZChhcCwgcWMpOwotCQlyZXR1cm4gbnJfZG9uZTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHBwLT5kZWZlcl9xdWV1ZS5kZWZlcl9iaXRzKSB7CkBAIC0yMjEyLDcgKzIyMTIsNyBAQAogCQludl9zd25jcV9pc3N1ZV9hdGFjbWQoYXAsIHFjKTsKIAl9CiAKLQlyZXR1cm4gbnJfZG9uZTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgbnZfc3duY3FfdGFnKHN0cnVjdCBhdGFfcG9ydCAqYXApCkBAIC0yMjI0LDcgKzIyMjQsNyBAQAogCXJldHVybiAodGFnICYgMHgxZik7CiB9CiAKLXN0YXRpYyBpbnQgbnZfc3duY3FfZG1hZmlzKHN0cnVjdCBhdGFfcG9ydCAqYXApCitzdGF0aWMgdm9pZCBudl9zd25jcV9kbWFmaXMoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCXVuc2lnbmVkIGludCBydzsKQEAgLTIyMzksNyArMjIzOSw3IEBACiAJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CiAKIAlpZiAodW5saWtlbHkoIXFjKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCXJ3ID0gcWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFOwogCkBAIC0yMjU0LDggKzIyNTQsNiBAQAogCQlkbWFjdGwgfD0gQVRBX0RNQV9XUjsKIAogCWlvd3JpdGU4KGRtYWN0bCB8IEFUQV9ETUFfU1RBUlQsIGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKLQotCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBudl9zd25jcV9ob3N0X2ludGVycnVwdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MTYgZmlzKQpAQCAtMjI2NSw3ICsyMjYzLDYgQEAKIAlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+bGluay5laF9pbmZvOwogCXUzMiBzZXJyb3I7CiAJdTggYXRhX3N0YXQ7Ci0JaW50IHJjID0gMDsKIAogCWF0YV9zdGF0ID0gYXAtPm9wcy0+c2ZmX2NoZWNrX3N0YXR1cyhhcCk7CiAJbnZfc3duY3FfaXJxX2NsZWFyKGFwLCBmaXMpOwpAQCAtMjMxMCw4ICsyMzA3LDcgQEAKIAkJCSJkaGZpcyAweCVYIGRtYWZpcyAweCVYIHNhY3RpdmUgMHglWFxuIiwKIAkJCWFwLT5wcmludF9pZCwgcHAtPnFjX2FjdGl2ZSwgcHAtPmRoZmlzX2JpdHMsCiAJCQlwcC0+ZG1hZmlzX2JpdHMsIHJlYWRsKHBwLT5zYWN0aXZlX2Jsb2NrKSk7Ci0JCXJjID0gbnZfc3duY3Ffc2RiZmlzKGFwKTsKLQkJaWYgKHJjIDwgMCkKKwkJaWYgKG52X3N3bmNxX3NkYmZpcyhhcCkgPCAwKQogCQkJZ290byBpcnFfZXJyb3I7CiAJfQogCkBAIC0yMzQ4LDcgKzIzNDQsNyBAQAogCQkgKi8KIAkJcHAtPmRtYWZpc19iaXRzIHw9ICgweDEgPDwgbnZfc3duY3FfdGFnKGFwKSk7CiAJCXBwLT5uY3FfZmxhZ3MgfD0gbmNxX3Nhd19kbWFzOwotCQlyYyA9IG52X3N3bmNxX2RtYWZpcyhhcCk7CisJCW52X3N3bmNxX2RtYWZpcyhhcCk7CiAJfQogCiBpcnFfZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL0tjb25maWcgYi9kcml2ZXJzL2F0bS9LY29uZmlnCmluZGV4IGYxYTBhMDAuLmJlNzQ2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL0tjb25maWcKKysrIGIvZHJpdmVycy9hdG0vS2NvbmZpZwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIGNvbmZpZyBBVE1fTklDU1RBUgogCXRyaXN0YXRlICJJRFQgNzcyMDEgKE5JQ1N0QVIpIChGb3JlUnVubmVyTEUpIgotCWRlcGVuZHMgb24gUENJICYmICE2NEJJVCAmJiBWSVJUX1RPX0JVUworCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgVGhlIE5JQ1N0QVIgY2hpcHNldCBmYW1pbHkgaXMgdXNlZCBpbiBhIGxhcmdlIG51bWJlciBvZiBBVE0gTklDcyBmb3IKIAkgIDI1IGFuZCBmb3IgMTU1IE1icHMsIGluY2x1ZGluZyBJRFQgY2FyZHMgYW5kIHRoZSBGb3JlIEZvcmVSdW5uZXJMRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vYWR1bW15LmMgYi9kcml2ZXJzL2F0bS9hZHVtbXkuYwppbmRleCA2ZDQ0ZjA3Li40NmI5NDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9hZHVtbXkuYworKysgYi9kcml2ZXJzL2F0bS9hZHVtbXkuYwpAQCAtNDAsNiArNDAsNDIgQEAKIAogc3RhdGljIExJU1RfSEVBRChhZHVtbXlfZGV2cyk7CiAKK3N0YXRpYyBzc2l6ZV90IF9fc2V0X3NpZ25hbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgYXRtX2RldiwgY2xhc3NfZGV2KTsKKwlpbnQgc2lnbmFsOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZzaWduYWwpID09IDEpIHsKKworCQlpZiAoc2lnbmFsIDwgQVRNX1BIWV9TSUdfTE9TVCB8fCBzaWduYWwgPiBBVE1fUEhZX1NJR19GT1VORCkKKwkJCXNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIHNpZ25hbCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgX19zaG93X3NpZ25hbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBhdG1fZGV2LCBjbGFzc19kZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBhdG1fZGV2LT5zaWduYWwpOworfQorc3RhdGljIERFVklDRV9BVFRSKHNpZ25hbCwgMDY0NCwgX19zaG93X3NpZ25hbCwgX19zZXRfc2lnbmFsKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdW1teV9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zaWduYWwuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHVtbXlfZ3JvdXBfYXR0cnMgPSB7CisJLm5hbWUgPSBOVUxMLCAvKiBXZSB3YW50IHRoZW0gaW4gZGV2J3Mgcm9vdCBmb2xkZXIgKi8KKwkuYXR0cnMgPSBhZHVtbXlfYXR0cnMKK307CisKIHN0YXRpYyBpbnQgX19pbml0CiBhZHVtbXlfc3RhcnQoc3RydWN0IGF0bV9kZXYgKmRldikKIHsKQEAgLTEyOCw2ICsxNjQsOSBAQAogCWFkdW1teV9kZXYtPmF0bV9kZXYgPSBhdG1fZGV2OwogCWF0bV9kZXYtPmRldl9kYXRhID0gYWR1bW15X2RldjsKIAorCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJmF0bV9kZXYtPmNsYXNzX2Rldi5rb2JqLCAmYWR1bW15X2dyb3VwX2F0dHJzKSkKKwkJZGV2X2VycigmYXRtX2Rldi0+Y2xhc3NfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIGF0dHJzIGZvciBhZHVtbXlcbiIpOworCiAJaWYgKGFkdW1teV9zdGFydChhdG1fZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICI6IGFkdW1teV9zdGFydCgpIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKaW5kZXggOWQxODY0NC4uYTMzODk2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCisrKyBiL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYwpAQCAtMjM3MSwxMCArMjM3MSw4IEBACiAvKioqKioqKioqKiBtb2R1bGUgZW50cnkgKioqKioqKioqKi8KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtYl9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX01BREdFLCBQQ0lfREVWSUNFX0lEX01BREdFX0FNQkFTU0FET1IsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JICAwLCAwLCAwIH0sCi0JeyBQQ0lfVkVORE9SX0lEX01BREdFLCBQQ0lfREVWSUNFX0lEX01BREdFX0FNQkFTU0FET1JfQkFELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCSAgMCwgMCwgMCB9LAorCXsgUENJX1ZERVZJQ0UoTUFER0UsIFBDSV9ERVZJQ0VfSURfTUFER0VfQU1CQVNTQURPUiksIDAgfSwKKwl7IFBDSV9WREVWSUNFKE1BREdFLCBQQ0lfREVWSUNFX0lEX01BREdFX0FNQkFTU0FET1JfQkFEKSwgMCB9LAogCXsgMCwgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmMgYi9kcml2ZXJzL2F0bS9lbmkuYwppbmRleCA5MGE1YTdjLi44MGY5ZjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuYworKysgYi9kcml2ZXJzL2F0bS9lbmkuYwpAQCAtMjI2OSwxMCArMjI2OSw4IEBACiAKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVuaV9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX0VGLCBQQ0lfREVWSUNFX0lEX0VGX0FUTV9GUEdBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCSAgMCwgMCwgMCAvKiBGUEdBICovIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0VGLCBQQ0lfREVWSUNFX0lEX0VGX0FUTV9BU0lDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCSAgMCwgMCwgMSAvKiBBU0lDICovIH0sCisJeyBQQ0lfVkRFVklDRShFRiwgUENJX0RFVklDRV9JRF9FRl9BVE1fRlBHQSksIDAgLyogRlBHQSAqLyB9LAorCXsgUENJX1ZERVZJQ0UoRUYsIFBDSV9ERVZJQ0VfSURfRUZfQVRNX0FTSUMpLCAxIC8qIEFTSUMgKi8gfSwKIAl7IDAsIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxlbmlfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKaW5kZXggNmU2MDBhZi4uODcxNzgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCisrKyBiL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYwpAQCAtMjAyNywxMCArMjAyNyw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBmaXJlc3RyZWFtX3BjaV90YmxbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfRlVKSVRTVV9NRSwgUENJX0RFVklDRV9JRF9GVUpJVFNVX0ZTNTAsIAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgRlNfSVM1MH0sCi0JeyBQQ0lfVkVORE9SX0lEX0ZVSklUU1VfTUUsIFBDSV9ERVZJQ0VfSURfRlVKSVRTVV9GUzE1NSwgCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBGU19JUzE1NX0sCisJeyBQQ0lfVkRFVklDRShGVUpJVFNVX01FLCBQQ0lfREVWSUNFX0lEX0ZVSklUU1VfRlM1MCksIEZTX0lTNTB9LAorCXsgUENJX1ZERVZJQ0UoRlVKSVRTVV9NRSwgUENJX0RFVklDRV9JRF9GVUpJVFNVX0ZTMTU1KSwgRlNfSVMxNTV9LAogCXsgMCwgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKaW5kZXggZGE4ZjE3Ni4uYjczODVlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYworKysgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCkBAIC0yNjU3LDcgKzI2NTcsNyBAQAogCiAJZm9yZTIwMGUtPmJ1cyA9IGJ1czsKIAlmb3JlMjAwZS0+YnVzX2RldiA9IG9wOwotCWZvcmUyMDBlLT5pcnEgPSBvcC0+aXJxc1swXTsKKwlmb3JlMjAwZS0+aXJxID0gb3AtPmFyY2hkYXRhLmlycXNbMF07CiAJZm9yZTIwMGUtPnBoeXNfYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKIAogCXNwcmludGYoZm9yZTIwMGUtPm5hbWUsICIlcy0lZCIsIGJ1cy0+bW9kZWxfbmFtZSwgaW5kZXgpOwpAQCAtMjc5NSw3ICsyNzk1LDcgQEAKIAlwcmludGsoRk9SRTIwMEUgIkZPUkUgU3lzdGVtcyAyMDBFLXNlcmllcyBBVE0gZHJpdmVyIC0gdmVyc2lvbiAiIEZPUkUyMDBFX1ZFUlNJT04gIlxuIik7CiAKICNpZmRlZiBDT05GSUdfU0JVUwotCWVyciA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfc2JhX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwllcnIgPSBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZvcmUyMDBlX3NiYV9kcml2ZXIpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAjZW5kaWYKQEAgLTI4MDYsNyArMjgwNiw3IEBACiAKICNpZmRlZiBDT05GSUdfU0JVUwogCWlmIChlcnIpCi0JCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZmb3JlMjAwZV9zYmFfZHJpdmVyKTsKKwkJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZvcmUyMDBlX3NiYV9kcml2ZXIpOwogI2VuZGlmCiAKIAlyZXR1cm4gZXJyOwpAQCAtMjgxOCw3ICsyODE4LDcgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmZvcmUyMDBlX3BjYV9kcml2ZXIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NCVVMKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfc2JhX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZvcmUyMDBlX3NiYV9kcml2ZXIpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2hlLmMgYi9kcml2ZXJzL2F0bS9oZS5jCmluZGV4IDU2YzJlOTkuLjgwMWU4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2hlLmMKKysrIGIvZHJpdmVycy9hdG0vaGUuYwpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpAQCAtNzc4LDYxICs3NzksMzkgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBoZV9pbml0X2dyb3VwKHN0cnVjdCBoZV9kZXYgKmhlX2RldiwgaW50IGdyb3VwKQogeworCXN0cnVjdCBoZV9idWZmICpoZWIsICpuZXh0OworCWRtYV9hZGRyX3QgbWFwcGluZzsKIAlpbnQgaTsKIAotCS8qIHNtYWxsIGJ1ZmZlciBwb29sICovCi0JaGVfZGV2LT5yYnBzX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoInJicHMiLCBoZV9kZXYtPnBjaV9kZXYsCi0JCQlDT05GSUdfUkJQU19CVUZTSVpFLCA4LCAwKTsKLQlpZiAoaGVfZGV2LT5yYnBzX3Bvb2wgPT0gTlVMTCkgewotCQlocHJpbnRrKCJ1bmFibGUgdG8gY3JlYXRlIHJicHMgcGFnZXNcbiIpOworCWhlX3dyaXRlbChoZV9kZXYsIDB4MCwgRzBfUkJQU19TICsgKGdyb3VwICogMzIpKTsKKwloZV93cml0ZWwoaGVfZGV2LCAweDAsIEcwX1JCUFNfVCArIChncm91cCAqIDMyKSk7CisJaGVfd3JpdGVsKGhlX2RldiwgMHgwLCBHMF9SQlBTX1FJICsgKGdyb3VwICogMzIpKTsKKwloZV93cml0ZWwoaGVfZGV2LCBSQlBfVEhSRVNIKDB4MSkgfCBSQlBfUVNJWkUoMHgwKSwKKwkJICBHMF9SQlBTX0JTICsgKGdyb3VwICogMzIpKTsKKworCS8qIGJpdG1hcCB0YWJsZSAqLworCWhlX2Rldi0+cmJwbF90YWJsZSA9IGttYWxsb2MoQklUU19UT19MT05HUyhSQlBMX1RBQkxFX1NJWkUpCisJCQkJICAgICAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZV9kZXYtPnJicGxfdGFibGUpIHsKKwkJaHByaW50aygidW5hYmxlIHRvIGFsbG9jYXRlIHJicGwgYml0bWFwIHRhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCWJpdG1hcF96ZXJvKGhlX2Rldi0+cmJwbF90YWJsZSwgUkJQTF9UQUJMRV9TSVpFKTsKIAotCWhlX2Rldi0+cmJwc19iYXNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGVfZGV2LT5wY2lfZGV2LAotCQlDT05GSUdfUkJQU19TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV9yYnApLCAmaGVfZGV2LT5yYnBzX3BoeXMpOwotCWlmIChoZV9kZXYtPnJicHNfYmFzZSA9PSBOVUxMKSB7Ci0JCWhwcmludGsoImZhaWxlZCB0byBhbGxvYyByYnBzX2Jhc2VcbiIpOwotCQlnb3RvIG91dF9kZXN0cm95X3JicHNfcG9vbDsKKwkvKiByYnBsX3ZpcnQgNjQtYml0IHBvaW50ZXJzICovCisJaGVfZGV2LT5yYnBsX3ZpcnQgPSBrbWFsbG9jKFJCUExfVEFCTEVfU0laRQorCQkJCSAgICAqIHNpemVvZihzdHJ1Y3QgaGVfYnVmZiAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZV9kZXYtPnJicGxfdmlydCkgeworCQlocHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgcmJwbCB2aXJ0IHRhYmxlXG4iKTsKKwkJZ290byBvdXRfZnJlZV9yYnBsX3RhYmxlOwogCX0KLQltZW1zZXQoaGVfZGV2LT5yYnBzX2Jhc2UsIDAsIENPTkZJR19SQlBTX1NJWkUgKiBzaXplb2Yoc3RydWN0IGhlX3JicCkpOwotCWhlX2Rldi0+cmJwc192aXJ0ID0ga21hbGxvYyhDT05GSUdfUkJQU19TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV92aXJ0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGhlX2Rldi0+cmJwc192aXJ0ID09IE5VTEwpIHsKLQkJaHByaW50aygiZmFpbGVkIHRvIGFsbG9jIHJicHNfdmlydFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfcmJwc19iYXNlOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfUkJQU19TSVpFOyArK2kpIHsKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwotCQl2b2lkICpjcHVhZGRyOwotCi0JCWNwdWFkZHIgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnJicHNfcG9vbCwgR0ZQX0tFUk5FTHxHRlBfRE1BLCAmZG1hX2hhbmRsZSk7Ci0JCWlmIChjcHVhZGRyID09IE5VTEwpCi0JCQlnb3RvIG91dF9mcmVlX3JicHNfdmlydDsKLQotCQloZV9kZXYtPnJicHNfdmlydFtpXS52aXJ0ID0gY3B1YWRkcjsKLQkJaGVfZGV2LT5yYnBzX2Jhc2VbaV0uc3RhdHVzID0gUkJQX0xPQU5FRCB8IFJCUF9TTUFMTEJVRiB8IChpIDw8IFJCUF9JTkRFWF9PRkYpOwotCQloZV9kZXYtPnJicHNfYmFzZVtpXS5waHlzID0gZG1hX2hhbmRsZTsKLQotCX0KLQloZV9kZXYtPnJicHNfdGFpbCA9ICZoZV9kZXYtPnJicHNfYmFzZVtDT05GSUdfUkJQU19TSVpFIC0gMV07Ci0KLQloZV93cml0ZWwoaGVfZGV2LCBoZV9kZXYtPnJicHNfcGh5cywgRzBfUkJQU19TICsgKGdyb3VwICogMzIpKTsKLQloZV93cml0ZWwoaGVfZGV2LCBSQlBTX01BU0soaGVfZGV2LT5yYnBzX3RhaWwpLAotCQkJCQkJRzBfUkJQU19UICsgKGdyb3VwICogMzIpKTsKLQloZV93cml0ZWwoaGVfZGV2LCBDT05GSUdfUkJQU19CVUZTSVpFLzQsCi0JCQkJCQlHMF9SQlBTX0JTICsgKGdyb3VwICogMzIpKTsKLQloZV93cml0ZWwoaGVfZGV2LAotCQkJUkJQX1RIUkVTSChDT05GSUdfUkJQU19USFJFU0gpIHwKLQkJCVJCUF9RU0laRShDT05GSUdfUkJQU19TSVpFIC0gMSkgfAotCQkJUkJQX0lOVF9FTkIsCi0JCQkJCQlHMF9SQlBTX1FJICsgKGdyb3VwICogMzIpKTsKIAogCS8qIGxhcmdlIGJ1ZmZlciBwb29sICovCiAJaGVfZGV2LT5yYnBsX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoInJicGwiLCBoZV9kZXYtPnBjaV9kZXYsCi0JCQlDT05GSUdfUkJQTF9CVUZTSVpFLCA4LCAwKTsKKwkJCQkJICAgIENPTkZJR19SQlBMX0JVRlNJWkUsIDY0LCAwKTsKIAlpZiAoaGVfZGV2LT5yYnBsX3Bvb2wgPT0gTlVMTCkgewogCQlocHJpbnRrKCJ1bmFibGUgdG8gY3JlYXRlIHJicGwgcG9vbFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfcmJwc192aXJ0OworCQlnb3RvIG91dF9mcmVlX3JicGxfdmlydDsKIAl9CiAKIAloZV9kZXYtPnJicGxfYmFzZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhlX2Rldi0+cGNpX2RldiwKQEAgLTg0MiwzMCArODIxLDI5IEBACiAJCWdvdG8gb3V0X2Rlc3Ryb3lfcmJwbF9wb29sOwogCX0KIAltZW1zZXQoaGVfZGV2LT5yYnBsX2Jhc2UsIDAsIENPTkZJR19SQlBMX1NJWkUgKiBzaXplb2Yoc3RydWN0IGhlX3JicCkpOwotCWhlX2Rldi0+cmJwbF92aXJ0ID0ga21hbGxvYyhDT05GSUdfUkJQTF9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV92aXJ0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGhlX2Rldi0+cmJwbF92aXJ0ID09IE5VTEwpIHsKLQkJaHByaW50aygiZmFpbGVkIHRvIGFsbG9jIHJicGxfdmlydFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfcmJwbF9iYXNlOwotCX0KKworCUlOSVRfTElTVF9IRUFEKCZoZV9kZXYtPnJicGxfb3V0c3RhbmRpbmcpOwogCiAJZm9yIChpID0gMDsgaSA8IENPTkZJR19SQlBMX1NJWkU7ICsraSkgewotCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7Ci0JCXZvaWQgKmNwdWFkZHI7CiAKLQkJY3B1YWRkciA9IHBjaV9wb29sX2FsbG9jKGhlX2Rldi0+cmJwbF9wb29sLCBHRlBfS0VSTkVMfEdGUF9ETUEsICZkbWFfaGFuZGxlKTsKLQkJaWYgKGNwdWFkZHIgPT0gTlVMTCkKLQkJCWdvdG8gb3V0X2ZyZWVfcmJwbF92aXJ0OworCQloZWIgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnJicGxfcG9vbCwgR0ZQX0tFUk5FTHxHRlBfRE1BLCAmbWFwcGluZyk7CisJCWlmICghaGViKQorCQkJZ290byBvdXRfZnJlZV9yYnBsOworCQloZWItPm1hcHBpbmcgPSBtYXBwaW5nOworCQlsaXN0X2FkZCgmaGViLT5lbnRyeSwgJmhlX2Rldi0+cmJwbF9vdXRzdGFuZGluZyk7CiAKLQkJaGVfZGV2LT5yYnBsX3ZpcnRbaV0udmlydCA9IGNwdWFkZHI7Ci0JCWhlX2Rldi0+cmJwbF9iYXNlW2ldLnN0YXR1cyA9IFJCUF9MT0FORUQgfCAoaSA8PCBSQlBfSU5ERVhfT0ZGKTsKLQkJaGVfZGV2LT5yYnBsX2Jhc2VbaV0ucGh5cyA9IGRtYV9oYW5kbGU7CisJCXNldF9iaXQoaSwgaGVfZGV2LT5yYnBsX3RhYmxlKTsKKwkJaGVfZGV2LT5yYnBsX3ZpcnRbaV0gPSBoZWI7CisJCWhlX2Rldi0+cmJwbF9oaW50ID0gaSArIDE7CisJCWhlX2Rldi0+cmJwbF9iYXNlW2ldLmlkeCA9ICBpIDw8IFJCUF9JRFhfT0ZGU0VUOworCQloZV9kZXYtPnJicGxfYmFzZVtpXS5waHlzID0gbWFwcGluZyArIG9mZnNldG9mKHN0cnVjdCBoZV9idWZmLCBkYXRhKTsKIAl9CiAJaGVfZGV2LT5yYnBsX3RhaWwgPSAmaGVfZGV2LT5yYnBsX2Jhc2VbQ09ORklHX1JCUExfU0laRSAtIDFdOwogCiAJaGVfd3JpdGVsKGhlX2RldiwgaGVfZGV2LT5yYnBsX3BoeXMsIEcwX1JCUExfUyArIChncm91cCAqIDMyKSk7CiAJaGVfd3JpdGVsKGhlX2RldiwgUkJQTF9NQVNLKGhlX2Rldi0+cmJwbF90YWlsKSwKIAkJCQkJCUcwX1JCUExfVCArIChncm91cCAqIDMyKSk7Ci0JaGVfd3JpdGVsKGhlX2RldiwgQ09ORklHX1JCUExfQlVGU0laRS80LAorCWhlX3dyaXRlbChoZV9kZXYsIChDT05GSUdfUkJQTF9CVUZTSVpFIC0gc2l6ZW9mKHN0cnVjdCBoZV9idWZmKSkvNCwKIAkJCQkJCUcwX1JCUExfQlMgKyAoZ3JvdXAgKiAzMikpOwogCWhlX3dyaXRlbChoZV9kZXYsCiAJCQlSQlBfVEhSRVNIKENPTkZJR19SQlBMX1RIUkVTSCkgfApAQCAtODc5LDcgKzg1Nyw3IEBACiAJCUNPTkZJR19SQlJRX1NJWkUgKiBzaXplb2Yoc3RydWN0IGhlX3JicnEpLCAmaGVfZGV2LT5yYnJxX3BoeXMpOwogCWlmIChoZV9kZXYtPnJicnFfYmFzZSA9PSBOVUxMKSB7CiAJCWhwcmludGsoImZhaWxlZCB0byBhbGxvY2F0ZSByYnJxXG4iKTsKLQkJZ290byBvdXRfZnJlZV9yYnBsX3ZpcnQ7CisJCWdvdG8gb3V0X2ZyZWVfcmJwbDsKIAl9CiAJbWVtc2V0KGhlX2Rldi0+cmJycV9iYXNlLCAwLCBDT05GSUdfUkJSUV9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV9yYnJxKSk7CiAKQEAgLTkyMCwzMyArODk4LDIwIEBACiAJcGNpX2ZyZWVfY29uc2lzdGVudChoZV9kZXYtPnBjaV9kZXYsIENPTkZJR19SQlJRX1NJWkUgKgogCQkJc2l6ZW9mKHN0cnVjdCBoZV9yYnJxKSwgaGVfZGV2LT5yYnJxX2Jhc2UsCiAJCQloZV9kZXYtPnJicnFfcGh5cyk7Ci0JaSA9IENPTkZJR19SQlBMX1NJWkU7Ci1vdXRfZnJlZV9yYnBsX3ZpcnQ6Ci0Jd2hpbGUgKGktLSkKLQkJcGNpX3Bvb2xfZnJlZShoZV9kZXYtPnJicGxfcG9vbCwgaGVfZGV2LT5yYnBsX3ZpcnRbaV0udmlydCwKLQkJCQloZV9kZXYtPnJicGxfYmFzZVtpXS5waHlzKTsKLQlrZnJlZShoZV9kZXYtPnJicGxfdmlydCk7CitvdXRfZnJlZV9yYnBsOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoZWIsIG5leHQsICZoZV9kZXYtPnJicGxfb3V0c3RhbmRpbmcsIGVudHJ5KQorCQlwY2lfcG9vbF9mcmVlKGhlX2Rldi0+cmJwbF9wb29sLCBoZWIsIGhlYi0+bWFwcGluZyk7CiAKLW91dF9mcmVlX3JicGxfYmFzZToKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGhlX2Rldi0+cGNpX2RldiwgQ09ORklHX1JCUExfU0laRSAqCiAJCQlzaXplb2Yoc3RydWN0IGhlX3JicCksIGhlX2Rldi0+cmJwbF9iYXNlLAogCQkJaGVfZGV2LT5yYnBsX3BoeXMpOwogb3V0X2Rlc3Ryb3lfcmJwbF9wb29sOgogCXBjaV9wb29sX2Rlc3Ryb3koaGVfZGV2LT5yYnBsX3Bvb2wpOworb3V0X2ZyZWVfcmJwbF92aXJ0OgorCWtmcmVlKGhlX2Rldi0+cmJwbF92aXJ0KTsKK291dF9mcmVlX3JicGxfdGFibGU6CisJa2ZyZWUoaGVfZGV2LT5yYnBsX3RhYmxlKTsKIAotCWkgPSBDT05GSUdfUkJQU19TSVpFOwotb3V0X2ZyZWVfcmJwc192aXJ0OgotCXdoaWxlIChpLS0pCi0JCXBjaV9wb29sX2ZyZWUoaGVfZGV2LT5yYnBzX3Bvb2wsIGhlX2Rldi0+cmJwc192aXJ0W2ldLnZpcnQsCi0JCQkJaGVfZGV2LT5yYnBzX2Jhc2VbaV0ucGh5cyk7Ci0Ja2ZyZWUoaGVfZGV2LT5yYnBzX3ZpcnQpOwotCi1vdXRfZnJlZV9yYnBzX2Jhc2U6Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChoZV9kZXYtPnBjaV9kZXYsIENPTkZJR19SQlBTX1NJWkUgKgotCQkJc2l6ZW9mKHN0cnVjdCBoZV9yYnApLCBoZV9kZXYtPnJicHNfYmFzZSwKLQkJCWhlX2Rldi0+cmJwc19waHlzKTsKLW91dF9kZXN0cm95X3JicHNfcG9vbDoKLQlwY2lfcG9vbF9kZXN0cm95KGhlX2Rldi0+cmJwc19wb29sKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtMTAwMiw3ICs5NjcsOCBAQAogCWhlX3dyaXRlbChoZV9kZXYsIDB4MCwgR1JQXzU0X01BUCk7CiAJaGVfd3JpdGVsKGhlX2RldiwgMHgwLCBHUlBfNzZfTUFQKTsKIAotCWlmIChyZXF1ZXN0X2lycShoZV9kZXYtPnBjaV9kZXYtPmlycSwgaGVfaXJxX2hhbmRsZXIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsIERFVl9MQUJFTCwgaGVfZGV2KSkgeworCWlmIChyZXF1ZXN0X2lycShoZV9kZXYtPnBjaV9kZXYtPmlycSwKKwkJCWhlX2lycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwgREVWX0xBQkVMLCBoZV9kZXYpKSB7CiAJCWhwcmludGsoImlycSAlZCBhbHJlYWR5IGluIHVzZVxuIiwgaGVfZGV2LT5wY2lfZGV2LT5pcnEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9ICAgCkBAIC0xNTc2LDkgKzE1NDIsMTAgQEAKIHN0YXRpYyB2b2lkCiBoZV9zdG9wKHN0cnVjdCBoZV9kZXYgKmhlX2RldikKIHsKLQl1MTYgY29tbWFuZDsKLQl1MzIgZ2VuX2NudGxfMCwgcmVnOworCXN0cnVjdCBoZV9idWZmICpoZWIsICpuZXh0OwogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXUzMiBnZW5fY250bF8wLCByZWc7CisJdTE2IGNvbW1hbmQ7CiAKIAlwY2lfZGV2ID0gaGVfZGV2LT5wY2lfZGV2OwogCkBAIC0xNjE5LDM3ICsxNTg2LDE5IEBACiAJCQkJCQloZV9kZXYtPmhzcCwgaGVfZGV2LT5oc3BfcGh5cyk7CiAKIAlpZiAoaGVfZGV2LT5yYnBsX2Jhc2UpIHsKLQkJaW50IGk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoZWIsIG5leHQsICZoZV9kZXYtPnJicGxfb3V0c3RhbmRpbmcsIGVudHJ5KQorCQkJcGNpX3Bvb2xfZnJlZShoZV9kZXYtPnJicGxfcG9vbCwgaGViLCBoZWItPm1hcHBpbmcpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfUkJQTF9TSVpFOyArK2kpIHsKLQkJCXZvaWQgKmNwdWFkZHIgPSBoZV9kZXYtPnJicGxfdmlydFtpXS52aXJ0OwotCQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlID0gaGVfZGV2LT5yYnBsX2Jhc2VbaV0ucGh5czsKLQotCQkJcGNpX3Bvb2xfZnJlZShoZV9kZXYtPnJicGxfcG9vbCwgY3B1YWRkciwgZG1hX2hhbmRsZSk7Ci0JCX0KIAkJcGNpX2ZyZWVfY29uc2lzdGVudChoZV9kZXYtPnBjaV9kZXYsIENPTkZJR19SQlBMX1NJWkUKIAkJCSogc2l6ZW9mKHN0cnVjdCBoZV9yYnApLCBoZV9kZXYtPnJicGxfYmFzZSwgaGVfZGV2LT5yYnBsX3BoeXMpOwogCX0KIAorCWtmcmVlKGhlX2Rldi0+cmJwbF92aXJ0KTsKKwlrZnJlZShoZV9kZXYtPnJicGxfdGFibGUpOworCiAJaWYgKGhlX2Rldi0+cmJwbF9wb29sKQogCQlwY2lfcG9vbF9kZXN0cm95KGhlX2Rldi0+cmJwbF9wb29sKTsKIAotCWlmIChoZV9kZXYtPnJicHNfYmFzZSkgewotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1JCUFNfU0laRTsgKytpKSB7Ci0JCQl2b2lkICpjcHVhZGRyID0gaGVfZGV2LT5yYnBzX3ZpcnRbaV0udmlydDsKLQkJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSA9IGhlX2Rldi0+cmJwc19iYXNlW2ldLnBoeXM7Ci0KLQkJCXBjaV9wb29sX2ZyZWUoaGVfZGV2LT5yYnBzX3Bvb2wsIGNwdWFkZHIsIGRtYV9oYW5kbGUpOwotCQl9Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGVfZGV2LT5wY2lfZGV2LCBDT05GSUdfUkJQU19TSVpFCi0JCQkqIHNpemVvZihzdHJ1Y3QgaGVfcmJwKSwgaGVfZGV2LT5yYnBzX2Jhc2UsIGhlX2Rldi0+cmJwc19waHlzKTsKLQl9Ci0KLQlpZiAoaGVfZGV2LT5yYnBzX3Bvb2wpCi0JCXBjaV9wb29sX2Rlc3Ryb3koaGVfZGV2LT5yYnBzX3Bvb2wpOwotCiAJaWYgKGhlX2Rldi0+cmJycV9iYXNlKQogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhlX2Rldi0+cGNpX2RldiwgQ09ORklHX1JCUlFfU0laRSAqIHNpemVvZihzdHJ1Y3QgaGVfcmJycSksCiAJCQkJCQkJaGVfZGV2LT5yYnJxX2Jhc2UsIGhlX2Rldi0+cmJycV9waHlzKTsKQEAgLTE2NzksMTMgKzE2MjgsMTMgQEAKIF9fYWxsb2NfdHBkKHN0cnVjdCBoZV9kZXYgKmhlX2RldikKIHsKIAlzdHJ1Y3QgaGVfdHBkICp0cGQ7Ci0JZG1hX2FkZHJfdCBkbWFfaGFuZGxlOyAKKwlkbWFfYWRkcl90IG1hcHBpbmc7CiAKLQl0cGQgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnRwZF9wb29sLCBHRlBfQVRPTUlDfEdGUF9ETUEsICZkbWFfaGFuZGxlKTsKKwl0cGQgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnRwZF9wb29sLCBHRlBfQVRPTUlDfEdGUF9ETUEsICZtYXBwaW5nKTsKIAlpZiAodHBkID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCQkJCi0JdHBkLT5zdGF0dXMgPSBUUERfQUREUihkbWFfaGFuZGxlKTsKKwl0cGQtPnN0YXR1cyA9IFRQRF9BRERSKG1hcHBpbmcpOwogCXRwZC0+cmVzZXJ2ZWQgPSAwOyAKIAl0cGQtPmlvdmVjWzBdLmFkZHIgPSAwOyB0cGQtPmlvdmVjWzBdLmxlbiA9IDA7CiAJdHBkLT5pb3ZlY1sxXS5hZGRyID0gMDsgdHBkLT5pb3ZlY1sxXS5sZW4gPSAwOwpAQCAtMTcxNCwxMyArMTY2MywxMiBAQAogCXN0cnVjdCBoZV9yYnJxICpyYnJxX3RhaWwgPSAoc3RydWN0IGhlX3JicnEgKikKIAkJCQkoKHVuc2lnbmVkIGxvbmcpaGVfZGV2LT5yYnJxX2Jhc2UgfAogCQkJCQloZV9kZXYtPmhzcC0+Z3JvdXBbZ3JvdXBdLnJicnFfdGFpbCk7Ci0Jc3RydWN0IGhlX3JicCAqcmJwID0gTlVMTDsKIAl1bnNpZ25lZCBjaWQsIGxhc3RjaWQgPSAtMTsKLQl1bnNpZ25lZCBidWZfbGVuID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBOVUxMOwogCXN0cnVjdCBoZV92Y2MgKmhlX3ZjYzsKLQlzdHJ1Y3QgaGVfaW92ZWMgKmlvdjsKKwlzdHJ1Y3QgaGVfYnVmZiAqaGViLCAqbmV4dDsKKwlpbnQgaTsKIAlpbnQgcGR1c19hc3NlbWJsZWQgPSAwOwogCWludCB1cGRhdGVkID0gMDsKIApAQCAtMTc0MCw0NCArMTY4OCwzNSBAQAogCQkJUkJSUV9DT05fQ0xPU0VEKGhlX2Rldi0+cmJycV9oZWFkKSA/ICIgQ09OX0NMT1NFRCIgOiAiIiwKIAkJCVJCUlFfSEJVRl9FUlIoaGVfZGV2LT5yYnJxX2hlYWQpID8gIiBIQlVGX0VSUiIgOiAiIik7CiAKLQkJaWYgKFJCUlFfQUREUihoZV9kZXYtPnJicnFfaGVhZCkgJiBSQlBfU01BTExCVUYpCi0JCQlyYnAgPSAmaGVfZGV2LT5yYnBzX2Jhc2VbUkJQX0lOREVYKFJCUlFfQUREUihoZV9kZXYtPnJicnFfaGVhZCkpXTsKLQkJZWxzZQotCQkJcmJwID0gJmhlX2Rldi0+cmJwbF9iYXNlW1JCUF9JTkRFWChSQlJRX0FERFIoaGVfZGV2LT5yYnJxX2hlYWQpKV07Ci0JCQotCQlidWZfbGVuID0gUkJSUV9CVUZMRU4oaGVfZGV2LT5yYnJxX2hlYWQpICogNDsKLQkJY2lkID0gUkJSUV9DSUQoaGVfZGV2LT5yYnJxX2hlYWQpOworCQlpID0gUkJSUV9BRERSKGhlX2Rldi0+cmJycV9oZWFkKSA+PiBSQlBfSURYX09GRlNFVDsKKwkJaGViID0gaGVfZGV2LT5yYnBsX3ZpcnRbaV07CiAKKwkJY2lkID0gUkJSUV9DSUQoaGVfZGV2LT5yYnJxX2hlYWQpOwogCQlpZiAoY2lkICE9IGxhc3RjaWQpCiAJCQl2Y2MgPSBfX2ZpbmRfdmNjKGhlX2RldiwgY2lkKTsKIAkJbGFzdGNpZCA9IGNpZDsKIAotCQlpZiAodmNjID09IE5VTEwpIHsKLQkJCWhwcmludGsoInZjYyA9PSBOVUxMICAoY2lkIDB4JXgpXG4iLCBjaWQpOwotCQkJaWYgKCFSQlJRX0hCVUZfRVJSKGhlX2Rldi0+cmJycV9oZWFkKSkKLQkJCQkJcmJwLT5zdGF0dXMgJj0gflJCUF9MT0FORUQ7CisJCWlmICh2Y2MgPT0gTlVMTCB8fCAoaGVfdmNjID0gSEVfVkNDKHZjYykpID09IE5VTEwpIHsKKwkJCWhwcmludGsoInZjYy9oZV92Y2MgPT0gTlVMTCAgKGNpZCAweCV4KVxuIiwgY2lkKTsKKwkJCWlmICghUkJSUV9IQlVGX0VSUihoZV9kZXYtPnJicnFfaGVhZCkpIHsKKwkJCQljbGVhcl9iaXQoaSwgaGVfZGV2LT5yYnBsX3RhYmxlKTsKKwkJCQlsaXN0X2RlbCgmaGViLT5lbnRyeSk7CisJCQkJcGNpX3Bvb2xfZnJlZShoZV9kZXYtPnJicGxfcG9vbCwgaGViLCBoZWItPm1hcHBpbmcpOworCQkJfQogCQkJCQkKIAkJCWdvdG8gbmV4dF9yYnJxX2VudHJ5OwogCQl9CiAKLQkJaGVfdmNjID0gSEVfVkNDKHZjYyk7Ci0JCWlmIChoZV92Y2MgPT0gTlVMTCkgewotCQkJaHByaW50aygiaGVfdmNjID09IE5VTEwgIChjaWQgMHgleClcbiIsIGNpZCk7Ci0JCQlpZiAoIVJCUlFfSEJVRl9FUlIoaGVfZGV2LT5yYnJxX2hlYWQpKQotCQkJCQlyYnAtPnN0YXR1cyAmPSB+UkJQX0xPQU5FRDsKLQkJCWdvdG8gbmV4dF9yYnJxX2VudHJ5OwotCQl9Ci0KIAkJaWYgKFJCUlFfSEJVRl9FUlIoaGVfZGV2LT5yYnJxX2hlYWQpKSB7CiAJCQlocHJpbnRrKCJIQlVGX0VSUiEgIChjaWQgMHgleClcbiIsIGNpZCk7CiAJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZHJvcCk7CiAJCQlnb3RvIHJldHVybl9ob3N0X2J1ZmZlcnM7CiAJCX0KIAotCQloZV92Y2MtPmlvdl90YWlsLT5pb3ZfYmFzZSA9IFJCUlFfQUREUihoZV9kZXYtPnJicnFfaGVhZCk7Ci0JCWhlX3ZjYy0+aW92X3RhaWwtPmlvdl9sZW4gPSBidWZfbGVuOwotCQloZV92Y2MtPnBkdV9sZW4gKz0gYnVmX2xlbjsKLQkJKytoZV92Y2MtPmlvdl90YWlsOworCQloZWItPmxlbiA9IFJCUlFfQlVGTEVOKGhlX2Rldi0+cmJycV9oZWFkKSAqIDQ7CisJCWNsZWFyX2JpdChpLCBoZV9kZXYtPnJicGxfdGFibGUpOworCQlsaXN0X21vdmVfdGFpbCgmaGViLT5lbnRyeSwgJmhlX3ZjYy0+YnVmZmVycyk7CisJCWhlX3ZjYy0+cGR1X2xlbiArPSBoZWItPmxlbjsKIAogCQlpZiAoUkJSUV9DT05fQ0xPU0VEKGhlX2Rldi0+cmJycV9oZWFkKSkgewogCQkJbGFzdGNpZCA9IC0xOwpAQCAtMTc4NiwxMiArMTcyNSw2IEBACiAJCQlnb3RvIHJldHVybl9ob3N0X2J1ZmZlcnM7CiAJCX0KIAotI2lmZGVmIG5vdGRlZgotCQlpZiAoKGhlX3ZjYy0+aW92X3RhaWwgLSBoZV92Y2MtPmlvdl9oZWFkKSA+IEhFX01BWElPVikgewotCQkJaHByaW50aygiaW92ZWMgZnVsbCEgIGNpZCAweCV4XG4iLCBjaWQpOwotCQkJZ290byByZXR1cm5faG9zdF9idWZmZXJzOwotCQl9Ci0jZW5kaWYKIAkJaWYgKCFSQlJRX0VORF9QRFUoaGVfZGV2LT5yYnJxX2hlYWQpKQogCQkJZ290byBuZXh0X3JicnFfZW50cnk7CiAKQEAgLTE4MTksMTUgKzE3NTIsOCBAQAogCiAJCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCi0JCWZvciAoaW92ID0gaGVfdmNjLT5pb3ZfaGVhZDsKLQkJCQlpb3YgPCBoZV92Y2MtPmlvdl90YWlsOyArK2lvdikgewotCQkJaWYgKGlvdi0+aW92X2Jhc2UgJiBSQlBfU01BTExCVUYpCi0JCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBpb3YtPmlvdl9sZW4pLAotCQkJCQloZV9kZXYtPnJicHNfdmlydFtSQlBfSU5ERVgoaW92LT5pb3ZfYmFzZSldLnZpcnQsIGlvdi0+aW92X2xlbik7Ci0JCQllbHNlCi0JCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBpb3YtPmlvdl9sZW4pLAotCQkJCQloZV9kZXYtPnJicGxfdmlydFtSQlBfSU5ERVgoaW92LT5pb3ZfYmFzZSldLnZpcnQsIGlvdi0+aW92X2xlbik7Ci0JCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShoZWIsICZoZV92Y2MtPmJ1ZmZlcnMsIGVudHJ5KQorCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBoZWItPmxlbiksICZoZWItPmRhdGEsIGhlYi0+bGVuKTsKIAogCQlzd2l0Y2ggKHZjYy0+cW9zLmFhbCkgewogCQkJY2FzZSBBVE1fQUFMMDoKQEAgLTE4NjcsMTcgKzE3OTMsOSBAQAogcmV0dXJuX2hvc3RfYnVmZmVyczoKIAkJKytwZHVzX2Fzc2VtYmxlZDsKIAotCQlmb3IgKGlvdiA9IGhlX3ZjYy0+aW92X2hlYWQ7Ci0JCQkJaW92IDwgaGVfdmNjLT5pb3ZfdGFpbDsgKytpb3YpIHsKLQkJCWlmIChpb3YtPmlvdl9iYXNlICYgUkJQX1NNQUxMQlVGKQotCQkJCXJicCA9ICZoZV9kZXYtPnJicHNfYmFzZVtSQlBfSU5ERVgoaW92LT5pb3ZfYmFzZSldOwotCQkJZWxzZQotCQkJCXJicCA9ICZoZV9kZXYtPnJicGxfYmFzZVtSQlBfSU5ERVgoaW92LT5pb3ZfYmFzZSldOwotCi0JCQlyYnAtPnN0YXR1cyAmPSB+UkJQX0xPQU5FRDsKLQkJfQotCi0JCWhlX3ZjYy0+aW92X3RhaWwgPSBoZV92Y2MtPmlvdl9oZWFkOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGViLCBuZXh0LCAmaGVfdmNjLT5idWZmZXJzLCBlbnRyeSkKKwkJCXBjaV9wb29sX2ZyZWUoaGVfZGV2LT5yYnBsX3Bvb2wsIGhlYiwgaGViLT5tYXBwaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmhlX3ZjYy0+YnVmZmVycyk7CiAJCWhlX3ZjYy0+cGR1X2xlbiA9IDA7CiAKIG5leHRfcmJycV9lbnRyeToKQEAgLTE5NzgsMjcgKzE4OTYsNDYgQEAKIAl9CiB9CiAKLQogc3RhdGljIHZvaWQKIGhlX3NlcnZpY2VfcmJwbChzdHJ1Y3QgaGVfZGV2ICpoZV9kZXYsIGludCBncm91cCkKIHsKLQlzdHJ1Y3QgaGVfcmJwICpuZXd0YWlsOworCXN0cnVjdCBoZV9yYnAgKm5ld190YWlsOwogCXN0cnVjdCBoZV9yYnAgKnJicGxfaGVhZDsKKwlzdHJ1Y3QgaGVfYnVmZiAqaGViOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlpbnQgaTsKIAlpbnQgbW92ZWQgPSAwOwogCiAJcmJwbF9oZWFkID0gKHN0cnVjdCBoZV9yYnAgKikgKCh1bnNpZ25lZCBsb25nKWhlX2Rldi0+cmJwbF9iYXNlIHwKIAkJCQkJUkJQTF9NQVNLKGhlX3JlYWRsKGhlX2RldiwgRzBfUkJQTF9TKSkpOwogCiAJZm9yICg7OykgewotCQluZXd0YWlsID0gKHN0cnVjdCBoZV9yYnAgKikgKCh1bnNpZ25lZCBsb25nKWhlX2Rldi0+cmJwbF9iYXNlIHwKKwkJbmV3X3RhaWwgPSAoc3RydWN0IGhlX3JicCAqKSAoKHVuc2lnbmVkIGxvbmcpaGVfZGV2LT5yYnBsX2Jhc2UgfAogCQkJCQkJUkJQTF9NQVNLKGhlX2Rldi0+cmJwbF90YWlsKzEpKTsKIAogCQkvKiB0YWJsZSAzLjQyIC0tIHJicGxfdGFpbCBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIHJicGxfaGVhZCAqLwotCQlpZiAoKG5ld3RhaWwgPT0gcmJwbF9oZWFkKSB8fCAobmV3dGFpbC0+c3RhdHVzICYgUkJQX0xPQU5FRCkpCisJCWlmIChuZXdfdGFpbCA9PSByYnBsX2hlYWQpCiAJCQlicmVhazsKIAotCQluZXd0YWlsLT5zdGF0dXMgfD0gUkJQX0xPQU5FRDsKLQkJaGVfZGV2LT5yYnBsX3RhaWwgPSBuZXd0YWlsOworCQlpID0gZmluZF9uZXh0X3plcm9fYml0KGhlX2Rldi0+cmJwbF90YWJsZSwgUkJQTF9UQUJMRV9TSVpFLCBoZV9kZXYtPnJicGxfaGludCk7CisJCWlmIChpID4gKFJCUExfVEFCTEVfU0laRSAtIDEpKSB7CisJCQlpID0gZmluZF9maXJzdF96ZXJvX2JpdChoZV9kZXYtPnJicGxfdGFibGUsIFJCUExfVEFCTEVfU0laRSk7CisJCQlpZiAoaSA+IChSQlBMX1RBQkxFX1NJWkUgLSAxKSkKKwkJCQlicmVhazsKKwkJfQorCQloZV9kZXYtPnJicGxfaGludCA9IGkgKyAxOworCisJCWhlYiA9IHBjaV9wb29sX2FsbG9jKGhlX2Rldi0+cmJwbF9wb29sLCBHRlBfQVRPTUlDfEdGUF9ETUEsICZtYXBwaW5nKTsKKwkJaWYgKCFoZWIpCisJCQlicmVhazsKKwkJaGViLT5tYXBwaW5nID0gbWFwcGluZzsKKwkJbGlzdF9hZGQoJmhlYi0+ZW50cnksICZoZV9kZXYtPnJicGxfb3V0c3RhbmRpbmcpOworCQloZV9kZXYtPnJicGxfdmlydFtpXSA9IGhlYjsKKwkJc2V0X2JpdChpLCBoZV9kZXYtPnJicGxfdGFibGUpOworCQluZXdfdGFpbC0+aWR4ID0gaSA8PCBSQlBfSURYX09GRlNFVDsKKwkJbmV3X3RhaWwtPnBoeXMgPSBtYXBwaW5nICsgb2Zmc2V0b2Yoc3RydWN0IGhlX2J1ZmYsIGRhdGEpOworCisJCWhlX2Rldi0+cmJwbF90YWlsID0gbmV3X3RhaWw7CiAJCSsrbW92ZWQ7CiAJfSAKIApAQCAtMjAwNywzMyArMTk0NCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1oZV9zZXJ2aWNlX3JicHMoc3RydWN0IGhlX2RldiAqaGVfZGV2LCBpbnQgZ3JvdXApCi17Ci0Jc3RydWN0IGhlX3JicCAqbmV3dGFpbDsKLQlzdHJ1Y3QgaGVfcmJwICpyYnBzX2hlYWQ7Ci0JaW50IG1vdmVkID0gMDsKLQotCXJicHNfaGVhZCA9IChzdHJ1Y3QgaGVfcmJwICopICgodW5zaWduZWQgbG9uZyloZV9kZXYtPnJicHNfYmFzZSB8Ci0JCQkJCVJCUFNfTUFTSyhoZV9yZWFkbChoZV9kZXYsIEcwX1JCUFNfUykpKTsKLQotCWZvciAoOzspIHsKLQkJbmV3dGFpbCA9IChzdHJ1Y3QgaGVfcmJwICopICgodW5zaWduZWQgbG9uZyloZV9kZXYtPnJicHNfYmFzZSB8Ci0JCQkJCQlSQlBTX01BU0soaGVfZGV2LT5yYnBzX3RhaWwrMSkpOwotCi0JCS8qIHRhYmxlIDMuNDIgLS0gcmJwc190YWlsIHNob3VsZCBuZXZlciBiZSBzZXQgdG8gcmJwc19oZWFkICovCi0JCWlmICgobmV3dGFpbCA9PSByYnBzX2hlYWQpIHx8IChuZXd0YWlsLT5zdGF0dXMgJiBSQlBfTE9BTkVEKSkKLQkJCWJyZWFrOwotCi0JCW5ld3RhaWwtPnN0YXR1cyB8PSBSQlBfTE9BTkVEOwotCQloZV9kZXYtPnJicHNfdGFpbCA9IG5ld3RhaWw7Ci0JCSsrbW92ZWQ7Ci0JfSAKLQotCWlmIChtb3ZlZCkKLQkJaGVfd3JpdGVsKGhlX2RldiwgUkJQU19NQVNLKGhlX2Rldi0+cmJwc190YWlsKSwgRzBfUkJQU19UKTsKLX0KLQotc3RhdGljIHZvaWQKIGhlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yMDU1LDEwICsxOTY1LDggQEAKIAkJCQlIUFJJTlRLKCJyYnJxJWQgdGhyZXNob2xkXG4iLCBncm91cCk7CiAJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQljYXNlIElUWVBFX1JCUlFfVElNRVI6Ci0JCQkJaWYgKGhlX3NlcnZpY2VfcmJycShoZV9kZXYsIGdyb3VwKSkgeworCQkJCWlmIChoZV9zZXJ2aWNlX3JicnEoaGVfZGV2LCBncm91cCkpCiAJCQkJCWhlX3NlcnZpY2VfcmJwbChoZV9kZXYsIGdyb3VwKTsKLQkJCQkJaGVfc2VydmljZV9yYnBzKGhlX2RldiwgZ3JvdXApOwotCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgSVRZUEVfVEJSUV9USFJFU0g6CiAJCQkJSFBSSU5USygidGJycSVkIHRocmVzaG9sZFxuIiwgZ3JvdXApOwpAQCAtMjA3MCw3ICsxOTc4LDcgQEAKIAkJCQloZV9zZXJ2aWNlX3JicGwoaGVfZGV2LCBncm91cCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElUWVBFX1JCUFNfVEhSRVNIOgotCQkJCWhlX3NlcnZpY2VfcmJwcyhoZV9kZXYsIGdyb3VwKTsKKwkJCQkvKiBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyBzbWFsbCBidWZmZXJzIGVuYWJsZWQgKi8KIAkJCQlicmVhazsKIAkJCWNhc2UgSVRZUEVfUEhZOgogCQkJCUhQUklOVEsoInBoeSBpbnRlcnJ1cHRcbiIpOwpAQCAtMjA5OCw3ICsyMDA2LDYgQEAKIAogCQkJCWhlX3NlcnZpY2VfcmJycShoZV9kZXYsIDApOwogCQkJCWhlX3NlcnZpY2VfcmJwbChoZV9kZXYsIDApOwotCQkJCWhlX3NlcnZpY2VfcmJwcyhoZV9kZXYsIDApOwogCQkJCWhlX3NlcnZpY2VfdGJycShoZV9kZXYsIDApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKQEAgLTIyNTIsNyArMjE1OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWhlX3ZjYy0+aW92X3RhaWwgPSBoZV92Y2MtPmlvdl9oZWFkOworCUlOSVRfTElTVF9IRUFEKCZoZV92Y2MtPmJ1ZmZlcnMpOwogCWhlX3ZjYy0+cGR1X2xlbiA9IDA7CiAJaGVfdmNjLT5yY19pbmRleCA9IC0xOwogCkBAIC0yNDA2LDggKzIzMTMsOCBAQAogCQkJZ290byBvcGVuX2ZhaWxlZDsKIAkJfQogCi0JCXJzcjEgPSBSU1IxX0dST1VQKDApOwotCQlyc3I0ID0gUlNSNF9HUk9VUCgwKTsKKwkJcnNyMSA9IFJTUjFfR1JPVVAoMCkgfCBSU1IxX1JCUExfT05MWTsKKwkJcnNyNCA9IFJTUjRfR1JPVVAoMCkgfCBSU1I0X1JCUExfT05MWTsKIAkJcnNyMCA9IHZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyA9PSBBVE1fVUJSID8gCiAJCQkJKFJTUjBfRVBEX0VOQUJMRXxSU1IwX1BQRF9FTkFCTEUpIDogMDsKIApAQCAtMjk2Myw4ICsyODcwLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2RoLCAidXNlIFNESCBmcmFtaW5nIChkZWZhdWx0IDApIik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBoZV9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX0ZPUkUsIFBDSV9ERVZJQ0VfSURfRk9SRV9IRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkgIDAsIDAsIDAgfSwKKwl7IFBDSV9WREVWSUNFKEZPUkUsIFBDSV9ERVZJQ0VfSURfRk9SRV9IRSksIDAgfSwKIAl7IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2hlLmggYi9kcml2ZXJzL2F0bS9oZS5oCmluZGV4IGMyOTgzZTAuLjExMGEyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2hlLmgKKysrIGIvZHJpdmVycy9hdG0vaGUuaApAQCAtNjcsMTEgKzY3LDYgQEAKICNkZWZpbmUgQ09ORklHX1JCUExfQlVGU0laRQk0MDk2CiAjZGVmaW5lIFJCUExfTUFTSyh4KQkJKCgodW5zaWduZWQgbG9uZykoeCkpJigoQ09ORklHX1JCUExfU0laRTw8MyktMSkpCiAKLSNkZWZpbmUgQ09ORklHX1JCUFNfU0laRQkxMDI0Ci0jZGVmaW5lIENPTkZJR19SQlBTX1RIUkVTSAk2NAotI2RlZmluZSBDT05GSUdfUkJQU19CVUZTSVpFCTEyOAotI2RlZmluZSBSQlBTX01BU0soeCkJCSgoKHVuc2lnbmVkIGxvbmcpKHgpKSYoKENPTkZJR19SQlBTX1NJWkU8PDMpLTEpKQotCiAvKiA1LjEuMyBpbml0aWFsaXplIGNvbm5lY3Rpb24gbWVtb3J5ICovCiAKICNkZWZpbmUgQ09ORklHX1JTUkEJCTB4MDAwMDAKQEAgLTIwMywzNiArMTk4LDM3IEBACiAJfSBncm91cFtIRV9OVU1fR1JPVVBTXTsKIH07CiAKLS8qIGZpZ3VyZSAyLjkgcmVjZWl2ZSBidWZmZXIgcG9vbHMgKi8KKy8qCisgKiBmaWd1cmUgMi45IHJlY2VpdmUgYnVmZmVyIHBvb2xzCisgKgorICogc2luY2UgYSB2aXJ0dWFsIGFkZHJlc3MgbWlnaHQgYmUgbW9yZSB0aGFuIDMyIGJpdHMsIHdlIHN0b3JlIGFuIGluZGV4CisgKiBpbiB0aGUgdmlydCBtZW1iZXIgb2YgaGVfcmJwLiAgTk9URTogdGhlIGxvd2VyIHNpeCBiaXRzIGluIHRoZSAgcmJycQorICogYWRkciBtZW1iZXIgYXJlIHVzZWQgZm9yIGJ1ZmZlciBzdGF0dXMgZnVydGhlciBsaW1pdGluZyB1cyB0byAyNiBiaXRzLgorICovCiAKIHN0cnVjdCBoZV9yYnAgewogCXZvbGF0aWxlIHUzMiBwaHlzOwotCXZvbGF0aWxlIHUzMiBzdGF0dXM7CisJdm9sYXRpbGUgdTMyIGlkeDsJLyogdmlydCAqLwogfTsKIAotLyogTk9URTogaXQgaXMgc3VnZ2VzdGVkIHRoYXQgdmlydCBiZSB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBob3N0Ci0gICBidWZmZXIuICBvbiBhIDY0LWJpdCBtYWNoaW5lLCB0aGlzIHdvdWxkIG5vdCB3b3JrLiAgSW5zdGVhZCwgd2UKLSAgIHN0b3JlIHRoZSByZWFsIHZpcnR1YWwgYWRkcmVzcyBpbiBhbm90aGVyIGxpc3QsIGFuZCBzdG9yZSBhbiBpbmRleAotICAgKGFuZCBidWZmZXIgc3RhdHVzKSBpbiB0aGUgdmlydCBtZW1iZXIuCi0qLworI2RlZmluZSBSQlBfSURYX09GRlNFVCA2CiAKLSNkZWZpbmUgUkJQX0lOREVYX09GRgk2Ci0jZGVmaW5lIFJCUF9JTkRFWCh4KQkoKChsb25nKSh4KSA+PiBSQlBfSU5ERVhfT0ZGKSAmIDB4ZmZmZikKLSNkZWZpbmUgUkJQX0xPQU5FRAkweDgwMDAwMDAwCi0jZGVmaW5lIFJCUF9TTUFMTEJVRgkweDQwMDAwMDAwCisvKgorICogdGhlIGhlIGRtYSBlbmdpbmUgd2lsbCB0cnkgdG8gaG9sZCBhbiBleHRyYSAxNiBidWZmZXJzIGluIGl0cyBsb2NhbAorICogY2FjaGVzLiAgYW5kIGFkZCBhIGNvdXBsZSBidWZmZXJzIGZvciBzYWZldHkuCisgKi8KIAotc3RydWN0IGhlX3ZpcnQgewotCXZvaWQgKnZpcnQ7CisjZGVmaW5lIFJCUExfVEFCTEVfU0laRSAoQ09ORklHX1JCUExfU0laRSArIDE2ICsgMikKKworc3RydWN0IGhlX2J1ZmYgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXU4IGRhdGFbXTsKIH07CiAKLSNkZWZpbmUgUkJQTF9BTElHTk1FTlQgQ09ORklHX1JCUExfU0laRQotI2RlZmluZSBSQlBTX0FMSUdOTUVOVCBDT05GSUdfUkJQU19TSVpFCi0KICNpZmRlZiBub3R5ZXQKIHN0cnVjdCBoZV9ncm91cCB7Ci0JdTMyIHJwYnNfc2l6ZSwgcnBic19xc2l6ZTsKLQlzdHJ1Y3QgaGVfcmJwIHJicHNfYmE7Ci0KIAl1MzIgcnBibF9zaXplLCBycGJsX3FzaXplOwogCXN0cnVjdCBoZV9ycGJfZW50cnkgKnJicGxfYmE7CiB9OwpAQCAtMjk3LDE4ICsyOTMsMTUgQEAKIAlzdHJ1Y3QgaGVfcmJycSAqcmJycV9iYXNlLCAqcmJycV9oZWFkOwogCWludCByYnJxX3BlYWs7CiAKKwlzdHJ1Y3QgaGVfYnVmZiAqKnJicGxfdmlydDsKKwl1bnNpZ25lZCBsb25nICpyYnBsX3RhYmxlOworCXVuc2lnbmVkIGxvbmcgcmJwbF9oaW50OwogCXN0cnVjdCBwY2lfcG9vbCAqcmJwbF9wb29sOwogCWRtYV9hZGRyX3QgcmJwbF9waHlzOwogCXN0cnVjdCBoZV9yYnAgKnJicGxfYmFzZSwgKnJicGxfdGFpbDsKLQlzdHJ1Y3QgaGVfdmlydCAqcmJwbF92aXJ0OworCXN0cnVjdCBsaXN0X2hlYWQgcmJwbF9vdXRzdGFuZGluZzsKIAlpbnQgcmJwbF9wZWFrOwogCi0Jc3RydWN0IHBjaV9wb29sICpyYnBzX3Bvb2w7Ci0JZG1hX2FkZHJfdCByYnBzX3BoeXM7Ci0Jc3RydWN0IGhlX3JicCAqcmJwc19iYXNlLCAqcmJwc190YWlsOwotCXN0cnVjdCBoZV92aXJ0ICpyYnBzX3ZpcnQ7Ci0JaW50IHJicHNfcGVhazsKLQogCWRtYV9hZGRyX3QgdGJycV9waHlzOwogCXN0cnVjdCBoZV90YnJxICp0YnJxX2Jhc2UsICp0YnJxX2hlYWQ7CiAJaW50IHRicnFfcGVhazsKQEAgLTMyMSwyMCArMzE0LDEyIEBACiAJc3RydWN0IGhlX2RldiAqbmV4dDsKIH07CiAKLXN0cnVjdCBoZV9pb3ZlYwotewotCXUzMiBpb3ZfYmFzZTsKLQl1MzIgaW92X2xlbjsKLX07Ci0KICNkZWZpbmUgSEVfTUFYSU9WIDIwCiAKIHN0cnVjdCBoZV92Y2MKIHsKLQlzdHJ1Y3QgaGVfaW92ZWMgaW92X2hlYWRbSEVfTUFYSU9WXTsKLQlzdHJ1Y3QgaGVfaW92ZWMgKmlvdl90YWlsOworCXN0cnVjdCBsaXN0X2hlYWQgYnVmZmVyczsKIAlpbnQgcGR1X2xlbjsKLQogCWludCByY19pbmRleDsKIAogCXdhaXRfcXVldWVfaGVhZF90IHJ4X3dhaXRxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcxMDUuYyBiL2RyaXZlcnMvYXRtL2lkdDc3MTA1LmMKaW5kZXggZGFiNWNmNS4uYmNhOWNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaWR0NzcxMDUuYworKysgYi9kcml2ZXJzL2F0bS9pZHQ3NzEwNS5jCkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICAgICAgICAgICAgICBpc3RhdCA9IEdFVChJU1RBVCk7IC8qIHNpZGUgZWZmZWN0OiBjbGVhcnMgYWxsIGludGVycnVwdCBzdGF0dXMgYml0cyAqLwogICAgICAgICAgICAgICAgIGlmIChpc3RhdCAmIElEVDc3MTA1X0lTVEFUX0dPT0RTSUcpIHsKICAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgc2lnbmFsIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgIGRldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfRk9VTkQ7CisgICAgICAgICAgICAgICAgICAgIGF0bV9kZXZfc2lnbmFsX2NoYW5nZShkZXYsIEFUTV9QSFlfU0lHX0ZPVU5EKTsKIAkgICAgICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzKGl0ZiAlZCk6IHNpZ25hbCBkZXRlY3RlZCBhZ2FpblxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+dHlwZSxkZXYtPm51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoIHRoZSByZWNlaXZlIEZJRk8gKi8KQEAgLTIyMiw3ICsyMjIsNyBAQAogICAgICAgICAgICAgLyogUnggU2lnbmFsIENvbmRpdGlvbiBDaGFuZ2UgLSBsaW5lIHdlbnQgdXAgb3IgZG93biAqLwogICAgICAgICAgICAgaWYgKGlzdGF0ICYgSURUNzcxMDVfSVNUQVRfR09PRFNJRykgeyAgIC8qIHNpZ25hbCBkZXRlY3RlZCBhZ2FpbiAqLwogICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKHJlc3RhcnQgdGltZXIgZG9lcyBpdCkgYnV0IEpJQyAqLwotICAgICAgICAgICAgICAgIGRldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfRk9VTkQ7CisJCWF0bV9kZXZfc2lnbmFsX2NoYW5nZShkZXYsIEFUTV9QSFlfU0lHX0ZPVU5EKTsKICAgICAgICAgICAgIH0gZWxzZSB7ICAgIC8qIHNpZ25hbCBsb3N0ICovCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHN0b3AgYWxsIHRyYW5zbWlzc2lvbiBhbmQKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBJRFQ3NzEwNV9NQ1JfRFJJQ3wKICAgICAgICAgICAgICAgICAgICAgSURUNzcxMDVfTUNSX0hBTFRUWAogICAgICAgICAgICAgICAgICAgICApICYgfklEVDc3MTA1X01DUl9FSVAsIE1DUik7Ci0gICAgICAgICAgICAgICAgZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQlhdG1fZGV2X3NpZ25hbF9jaGFuZ2UoZGV2LCBBVE1fUEhZX1NJR19MT1NUKTsKIAkgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMoaXRmICVkKTogc2lnbmFsIGxvc3RcbiIsCiAgICAgICAgICAgICAgICAgICAgIGRldi0+dHlwZSxkZXYtPm51bWJlcik7CiAgICAgICAgICAgICB9CkBAIC0yNzIsOCArMjcyLDkgQEAKIAltZW1zZXQoJlBSSVYoZGV2KS0+c3RhdHMsMCxzaXplb2Yoc3RydWN0IGlkdDc3MTA1X3N0YXRzKSk7CiAgICAgICAgIAogICAgICAgICAvKiBpbml0aWFsaXNlIGRldi0+c2lnbmFsIGZyb20gR29vZCBTaWduYWwgQml0ICovCi0gICAgICAgIGRldi0+c2lnbmFsID0gR0VUKElTVEFUKSAmIElEVDc3MTA1X0lTVEFUX0dPT0RTSUcgPyBBVE1fUEhZX1NJR19GT1VORCA6Ci0JICBBVE1fUEhZX1NJR19MT1NUOworCWF0bV9kZXZfc2lnbmFsX2NoYW5nZShkZXYsCisJCUdFVChJU1RBVCkgJiBJRFQ3NzEwNV9JU1RBVF9HT09EU0lHID8KKwkJQVRNX1BIWV9TSUdfRk9VTkQgOiBBVE1fUEhZX1NJR19MT1NUKTsKIAlpZiAoZGV2LT5zaWduYWwgPT0gQVRNX1BIWV9TSUdfTE9TVCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoaXRmICVkKTogbm8gc2lnbmFsXG4iLGRldi0+dHlwZSwKIAkJICAgIGRldi0+bnVtYmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMgYi9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jCmluZGV4IDk4NjU3YTYuLjE2NzljYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKKysrIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwpAQCAtMzM2NCw3ICszMzY0LDcgQEAKIAkJd3JpdGVsKFNBUl9TVEFUX1RNUk9GLCBTQVJfUkVHX1NUQVQpOwogCX0KIAlJUFJJTlRLKCIlczogUmVxdWVzdCBJUlEgLi4uICIsIGNhcmQtPm5hbWUpOwotCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgaWR0NzcyNTJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELAorCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgaWR0NzcyNTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCWNhcmQtPm5hbWUsIGNhcmQpICE9IDApIHsKIAkJcHJpbnRrKCIlczogY2FuJ3QgYWxsb2NhdGUgSVJRLlxuIiwgY2FyZC0+bmFtZSk7CiAJCWRlaW5pdF9jYXJkKGNhcmQpOwpAQCAtMzc3OSw4ICszNzc5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkdDc3MjUyX3BjaV90YmxbXSA9CiB7Ci0JeyBQQ0lfVkVORE9SX0lEX0lEVCwgUENJX0RFVklDRV9JRF9JRFRfSURUNzcyNTIsCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkRFVklDRShJRFQsIFBDSV9ERVZJQ0VfSURfSURUX0lEVDc3MjUyKSwgMCB9LAogCXsgMCwgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vbmljc3Rhci5jIGIvZHJpdmVycy9hdG0vbmljc3Rhci5jCmluZGV4IGI3NDczYTYuLjJmMzUxNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL25pY3N0YXIuYworKysgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKQEAgLTEsNSArMSw0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgorLyoKICAqIG5pY3N0YXIuYwogICoKICAqIERldmljZSBkcml2ZXIgc3VwcG9ydGluZyBDQlIgZm9yIElEVCA3NzIwMS83NzIxMSAiTklDU3RBUiIgYmFzZWQgY2FyZHMuCkBAIC0xNiwxMiArMTUsMTAgQEAKICAqCiAgKgogICogKEMpIElORVNDIDE5OTkKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCi0KLS8qKioqIElNUE9SVEFOVCBJTkZPUk1BVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qCisgKiBJTVBPUlRBTlQgSU5GT1JNQVRJT04KICAqCiAgKiBUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHR5cGVzIG9mIHNwaW5sb2NrczoKICAqCkBAIC0zMSw5ICsyOCw5IEBACiAgKgogICogVGhlc2UgbXVzdCBORVZFUiBiZSBncmFiYmVkIGluIHJldmVyc2Ugb3JkZXIuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCi0vKiBIZWFkZXIgZmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGVhZGVyIGZpbGVzICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQxLDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hdG0uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTUwLDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC02MSwxNiArNjAsMTEgQEAKICNpbmNsdWRlICJpZHQ3NzEwNS5oIgogI2VuZGlmIC8qIENPTkZJR19BVE1fTklDU1RBUl9VU0VfSURUNzcxMDUgKi8KIAotI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKLSMgIGVycm9yIEZJWE1FOiB0aGlzIGRyaXZlciByZXF1aXJlcyBhIDMyLWJpdCBwbGF0Zm9ybQotI2VuZGlmCi0KLS8qIEFkZGl0aW9uYWwgY29kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBZGRpdGlvbmFsIGNvZGUgKi8KIAogI2luY2x1ZGUgIm5pY3N0YXJtYWMuYyIKIAotCi0vKiBDb25maWd1cmFibGUgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMgKi8KIAogI3VuZGVmIFBIWV9MT09QQkFDSwogI3VuZGVmIFRYX0RFQlVHCkBAIC03OCwxMSArNzIsMTAgQEAKICN1bmRlZiBHRU5FUkFMX0RFQlVHCiAjdW5kZWYgRVhUUkFfREVCVUcKIAotI3VuZGVmIE5TX1VTRV9ERVNUUlVDVE9SUyAvKiBGb3Igbm93IGtlZXAgdGhpcyB1bmRlZmluZWQgdW5sZXNzIHlvdSBrbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSdyZSBnb2luZyB0byB1c2Ugb25seSByYXcgQVRNICovCisjdW5kZWYgTlNfVVNFX0RFU1RSVUNUT1JTCS8qIEZvciBub3cga2VlcCB0aGlzIHVuZGVmaW5lZCB1bmxlc3MgeW91IGtub3cKKwkJCQkgICB5b3UncmUgZ29pbmcgdG8gdXNlIG9ubHkgcmF3IEFUTSAqLwogCi0KLS8qIERvIG5vdCB0b3VjaCB0aGVzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEbyBub3QgdG91Y2ggdGhlc2UgKi8KIAogI2lmZGVmIFRYX0RFQlVHCiAjZGVmaW5lIFRYUFJJTlRLKGFyZ3MuLi4pIHByaW50ayhhcmdzKQpAQCAtMTA4LDI5MDggKzEwMSwyNzczIEBACiAjZGVmaW5lIFhQUklOVEsoYXJncy4uLikKICNlbmRpZiAvKiBFWFRSQV9ERUJVRyAqLwogCi0KLS8qIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYWNyb3MgKi8KIAogI2RlZmluZSBDTURfQlVTWShjYXJkKSAocmVhZGwoKGNhcmQpLT5tZW1iYXNlICsgU1RBVCkgJiBOU19TVEFUX0NNREJaKQogCiAjZGVmaW5lIE5TX0RFTEFZIG1kZWxheSgxKQogCi0jZGVmaW5lIEFMSUdOX0JVU19BRERSKGFkZHIsIGFsaWdubWVudCkgXAotICAgICAgICAoKCgodTMyKSAoYWRkcikpICsgKCgodTMyKSAoYWxpZ25tZW50KSkgLSAxKSkgJiB+KCgodTMyKSAoYWxpZ25tZW50KSkgLSAxKSkKLSNkZWZpbmUgQUxJR05fQUREUkVTUyhhZGRyLCBhbGlnbm1lbnQpIFwKLSAgICAgICAgYnVzX3RvX3ZpcnQoQUxJR05fQlVTX0FERFIodmlydF90b19idXMoYWRkciksIGFsaWdubWVudCkpCi0KLSN1bmRlZiBDRUlMCisjZGVmaW5lIFBUUl9ESUZGKGEsIGIpCSgodTMyKSgodW5zaWduZWQgbG9uZykoYSkgLSAodW5zaWduZWQgbG9uZykoYikpKQogCiAjaWZuZGVmIEFUTV9TS0IKICNkZWZpbmUgQVRNX1NLQihzKSAoJihzKS0+YXRtKQogI2VuZGlmCiAKKyNkZWZpbmUgc2NxX3ZpcnRfdG9fYnVzKHNjcSwgcCkgXAorCQkoc2NxLT5kbWEgKyAoKHVuc2lnbmVkIGxvbmcpKHApIC0gKHVuc2lnbmVkIGxvbmcpKHNjcSktPm9yZykpCiAKLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KIAotc3RhdGljIHUzMiBuc19yZWFkX3NyYW0obnNfZGV2ICpjYXJkLCB1MzIgc3JhbV9hZGRyZXNzKTsKLXN0YXRpYyB2b2lkIG5zX3dyaXRlX3NyYW0obnNfZGV2ICpjYXJkLCB1MzIgc3JhbV9hZGRyZXNzLCB1MzIgKnZhbHVlLCBpbnQgY291bnQpOworc3RhdGljIHUzMiBuc19yZWFkX3NyYW0obnNfZGV2ICogY2FyZCwgdTMyIHNyYW1fYWRkcmVzcyk7CitzdGF0aWMgdm9pZCBuc193cml0ZV9zcmFtKG5zX2RldiAqIGNhcmQsIHUzMiBzcmFtX2FkZHJlc3MsIHUzMiAqIHZhbHVlLAorCQkJICBpbnQgY291bnQpOwogc3RhdGljIGludCBfX2RldmluaXQgbnNfaW5pdF9jYXJkKGludCBpLCBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KTsKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBuc19pbml0X2NhcmRfZXJyb3IobnNfZGV2ICpjYXJkLCBpbnQgZXJyb3IpOwotc3RhdGljIHNjcV9pbmZvICpnZXRfc2NxKGludCBzaXplLCB1MzIgc2NkKTsKLXN0YXRpYyB2b2lkIGZyZWVfc2NxKHNjcV9pbmZvICpzY3EsIHN0cnVjdCBhdG1fdmNjICp2Y2MpOworc3RhdGljIHZvaWQgX19kZXZpbml0IG5zX2luaXRfY2FyZF9lcnJvcihuc19kZXYgKiBjYXJkLCBpbnQgZXJyb3IpOworc3RhdGljIHNjcV9pbmZvICpnZXRfc2NxKG5zX2RldiAqY2FyZCwgaW50IHNpemUsIHUzMiBzY2QpOworc3RhdGljIHZvaWQgZnJlZV9zY3EobnNfZGV2ICpjYXJkLCBzY3FfaW5mbyAqIHNjcSwgc3RydWN0IGF0bV92Y2MgKnZjYyk7CiBzdGF0aWMgdm9pZCBwdXNoX3J4YnVmcyhuc19kZXYgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBzdGF0aWMgaXJxcmV0dXJuX3QgbnNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBpbnQgbnNfb3BlbihzdHJ1Y3QgYXRtX3ZjYyAqdmNjKTsKIHN0YXRpYyB2b2lkIG5zX2Nsb3NlKHN0cnVjdCBhdG1fdmNjICp2Y2MpOwotc3RhdGljIHZvaWQgZmlsbF90c3QobnNfZGV2ICpjYXJkLCBpbnQgbiwgdmNfbWFwICp2Yyk7CitzdGF0aWMgdm9pZCBmaWxsX3RzdChuc19kZXYgKiBjYXJkLCBpbnQgbiwgdmNfbWFwICogdmMpOwogc3RhdGljIGludCBuc19zZW5kKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIGludCBwdXNoX3NjcWUobnNfZGV2ICpjYXJkLCB2Y19tYXAgKnZjLCBzY3FfaW5mbyAqc2NxLCBuc19zY3FlICp0YmQsCi0gICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfdHNxKG5zX2RldiAqY2FyZCk7Ci1zdGF0aWMgdm9pZCBkcmFpbl9zY3EobnNfZGV2ICpjYXJkLCBzY3FfaW5mbyAqc2NxLCBpbnQgcG9zKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfcnNxKG5zX2RldiAqY2FyZCk7Ci1zdGF0aWMgdm9pZCBkZXF1ZXVlX3J4KG5zX2RldiAqY2FyZCwgbnNfcnNxZSAqcnNxZSk7CitzdGF0aWMgaW50IHB1c2hfc2NxZShuc19kZXYgKiBjYXJkLCB2Y19tYXAgKiB2Yywgc2NxX2luZm8gKiBzY3EsIG5zX3NjcWUgKiB0YmQsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3RzcShuc19kZXYgKiBjYXJkKTsKK3N0YXRpYyB2b2lkIGRyYWluX3NjcShuc19kZXYgKiBjYXJkLCBzY3FfaW5mbyAqIHNjcSwgaW50IHBvcyk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3JzcShuc19kZXYgKiBjYXJkKTsKK3N0YXRpYyB2b2lkIGRlcXVldWVfcngobnNfZGV2ICogY2FyZCwgbnNfcnNxZSAqIHJzcWUpOwogI2lmZGVmIE5TX1VTRV9ERVNUUlVDVE9SUwogc3RhdGljIHZvaWQgbnNfc2JfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqc2IpOwogc3RhdGljIHZvaWQgbnNfbGJfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqbGIpOwogc3RhdGljIHZvaWQgbnNfaGJfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqaGIpOwogI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwotc3RhdGljIHZvaWQgcmVjeWNsZV9yeF9idWYobnNfZGV2ICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIHJlY3ljbGVfaW92ZWNfcnhfYnVmcyhuc19kZXYgKmNhcmQsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpOwotc3RhdGljIHZvaWQgcmVjeWNsZV9pb3ZfYnVmKG5zX2RldiAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKmlvdmIpOwotc3RhdGljIHZvaWQgZGVxdWV1ZV9zbV9idWYobnNfZGV2ICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2IpOwotc3RhdGljIHZvaWQgZGVxdWV1ZV9sZ19idWYobnNfZGV2ICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqbGIpOwotc3RhdGljIGludCBuc19wcm9jX3JlYWQoc3RydWN0IGF0bV9kZXYgKmRldiwgbG9mZl90ICpwb3MsIGNoYXIgKnBhZ2UpOwotc3RhdGljIGludCBuc19pb2N0bChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKLXN0YXRpYyB2b2lkIHdoaWNoX2xpc3QobnNfZGV2ICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHJlY3ljbGVfcnhfYnVmKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgcmVjeWNsZV9pb3ZlY19yeF9idWZzKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgcmVjeWNsZV9pb3ZfYnVmKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBza19idWZmICppb3ZiKTsKK3N0YXRpYyB2b2lkIGRlcXVldWVfc21fYnVmKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBza19idWZmICpzYik7CitzdGF0aWMgdm9pZCBkZXF1ZXVlX2xnX2J1Zihuc19kZXYgKiBjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqbGIpOworc3RhdGljIGludCBuc19wcm9jX3JlYWQoc3RydWN0IGF0bV9kZXYgKmRldiwgbG9mZl90ICogcG9zLCBjaGFyICpwYWdlKTsKK3N0YXRpYyBpbnQgbnNfaW9jdGwoc3RydWN0IGF0bV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworI2lmZGVmIEVYVFJBX0RFQlVHCitzdGF0aWMgdm9pZCB3aGljaF9saXN0KG5zX2RldiAqIGNhcmQsIHN0cnVjdCBza19idWZmICpza2IpOworI2VuZGlmCiBzdGF0aWMgdm9pZCBuc19wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgbnNfcGFyc2VfbWFjKGNoYXIgKm1hYywgdW5zaWduZWQgY2hhciAqZXNpKTsKLXN0YXRpYyBzaG9ydCBuc19oMmkoY2hhciBjKTsKIHN0YXRpYyB2b2lkIG5zX3BoeV9wdXQoc3RydWN0IGF0bV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyKTsKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcik7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBuc19waHlfZ2V0KHN0cnVjdCBhdG1fZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKLQotCi0vKiBHbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2xvYmFsIHZhcmlhYmxlcyAqLwogCiBzdGF0aWMgc3RydWN0IG5zX2RldiAqY2FyZHNbTlNfTUFYX0NBUkRTXTsKIHN0YXRpYyB1bnNpZ25lZCBudW1fY2FyZHM7Ci1zdGF0aWMgc3RydWN0IGF0bWRldl9vcHMgYXRtX29wcyA9Ci17Ci0gICAub3Blbgk9IG5zX29wZW4sCi0gICAuY2xvc2UJPSBuc19jbG9zZSwKLSAgIC5pb2N0bAk9IG5zX2lvY3RsLAotICAgLnNlbmQJPSBuc19zZW5kLAotICAgLnBoeV9wdXQJPSBuc19waHlfcHV0LAotICAgLnBoeV9nZXQJPSBuc19waHlfZ2V0LAotICAgLnByb2NfcmVhZAk9IG5zX3Byb2NfcmVhZCwKLSAgIC5vd25lcgk9IFRISVNfTU9EVUxFLAorc3RhdGljIHN0cnVjdCBhdG1kZXZfb3BzIGF0bV9vcHMgPSB7CisJLm9wZW4gPSBuc19vcGVuLAorCS5jbG9zZSA9IG5zX2Nsb3NlLAorCS5pb2N0bCA9IG5zX2lvY3RsLAorCS5zZW5kID0gbnNfc2VuZCwKKwkucGh5X3B1dCA9IG5zX3BoeV9wdXQsCisJLnBoeV9nZXQgPSBuc19waHlfZ2V0LAorCS5wcm9jX3JlYWQgPSBuc19wcm9jX3JlYWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OworCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbnNfdGltZXI7CiBzdGF0aWMgY2hhciAqbWFjW05TX01BWF9DQVJEU107CiBtb2R1bGVfcGFyYW1fYXJyYXkobWFjLCBjaGFycCwgTlVMTCwgMCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLQotLyogRnVuY3Rpb25zKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9ucyAqLwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBuaWNzdGFyX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLSAgIHN0YXRpYyBpbnQgaW5kZXggPSAtMTsKLSAgIHVuc2lnbmVkIGludCBlcnJvcjsKKwlzdGF0aWMgaW50IGluZGV4ID0gLTE7CisJdW5zaWduZWQgaW50IGVycm9yOwogCi0gICBpbmRleCsrOwotICAgY2FyZHNbaW5kZXhdID0gTlVMTDsKKwlpbmRleCsrOworCWNhcmRzW2luZGV4XSA9IE5VTEw7CiAKLSAgIGVycm9yID0gbnNfaW5pdF9jYXJkKGluZGV4LCBwY2lkZXYpOwotICAgaWYgKGVycm9yKSB7Ci0gICAgICBjYXJkc1tpbmRleC0tXSA9IE5VTEw7CS8qIGRvbid0IGluY3JlbWVudCBpbmRleCAqLwotICAgICAgZ290byBlcnJfb3V0OwotICAgfQorCWVycm9yID0gbnNfaW5pdF9jYXJkKGluZGV4LCBwY2lkZXYpOworCWlmIChlcnJvcikgeworCQljYXJkc1tpbmRleC0tXSA9IE5VTEw7CS8qIGRvbid0IGluY3JlbWVudCBpbmRleCAqLworCQlnb3RvIGVycl9vdXQ7CisJfQogCi0gICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIGVycl9vdXQ6Ci0gICByZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotCi0KIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuaWNzdGFyX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKIHsKLSAgIGludCBpLCBqOwotICAgbnNfZGV2ICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0gICBzdHJ1Y3Qgc2tfYnVmZiAqaGI7Ci0gICBzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKLSAgIHN0cnVjdCBza19idWZmICpsYjsKLSAgIHN0cnVjdCBza19idWZmICpzYjsKLSAgIAotICAgaSA9IGNhcmQtPmluZGV4OworCWludCBpLCBqOworCW5zX2RldiAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCXN0cnVjdCBza19idWZmICpoYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGI7CisJc3RydWN0IHNrX2J1ZmYgKnNiOwogCi0gICBpZiAoY2FyZHNbaV0gPT0gTlVMTCkKLSAgICAgIHJldHVybjsKKwlpID0gY2FyZC0+aW5kZXg7CiAKLSAgIGlmIChjYXJkLT5hdG1kZXYtPnBoeSAmJiBjYXJkLT5hdG1kZXYtPnBoeS0+c3RvcCkKLSAgICAgIGNhcmQtPmF0bWRldi0+cGh5LT5zdG9wKGNhcmQtPmF0bWRldik7CisJaWYgKGNhcmRzW2ldID09IE5VTEwpCisJCXJldHVybjsKIAotICAgLyogU3RvcCBldmVyeXRoaW5nICovCi0gICB3cml0ZWwoMHgwMDAwMDAwMCwgY2FyZC0+bWVtYmFzZSArIENGRyk7CisJaWYgKGNhcmQtPmF0bWRldi0+cGh5ICYmIGNhcmQtPmF0bWRldi0+cGh5LT5zdG9wKQorCQljYXJkLT5hdG1kZXYtPnBoeS0+c3RvcChjYXJkLT5hdG1kZXYpOwogCi0gICAvKiBEZS1yZWdpc3RlciBkZXZpY2UgKi8KLSAgIGF0bV9kZXZfZGVyZWdpc3RlcihjYXJkLT5hdG1kZXYpOworCS8qIFN0b3AgZXZlcnl0aGluZyAqLworCXdyaXRlbCgweDAwMDAwMDAwLCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKIAotICAgLyogRGlzYWJsZSBQQ0kgZGV2aWNlICovCi0gICBwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKLSAgIAotICAgLyogRnJlZSB1cCByZXNvdXJjZXMgKi8KLSAgIGogPSAwOwotICAgUFJJTlRLKCJuaWNzdGFyJWQ6IGZyZWVpbmcgJWQgaHVnZSBidWZmZXJzLlxuIiwgaSwgY2FyZC0+aGJwb29sLmNvdW50KTsKLSAgIHdoaWxlICgoaGIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aGJwb29sLnF1ZXVlKSkgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGRldl9rZnJlZV9za2JfYW55KGhiKTsKLSAgICAgIGorKzsKLSAgIH0KLSAgIFBSSU5USygibmljc3RhciVkOiAlZCBodWdlIGJ1ZmZlcnMgZnJlZWQuXG4iLCBpLCBqKTsKLSAgIGogPSAwOwotICAgUFJJTlRLKCJuaWNzdGFyJWQ6IGZyZWVpbmcgJWQgaW92ZWMgYnVmZmVycy5cbiIsIGksIGNhcmQtPmlvdnBvb2wuY291bnQpOwotICAgd2hpbGUgKChpb3ZiID0gc2tiX2RlcXVldWUoJmNhcmQtPmlvdnBvb2wucXVldWUpKSAhPSBOVUxMKQotICAgewotICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoaW92Yik7Ci0gICAgICBqKys7Ci0gICB9Ci0gICBQUklOVEsoIm5pY3N0YXIlZDogJWQgaW92ZWMgYnVmZmVycyBmcmVlZC5cbiIsIGksIGopOwotICAgd2hpbGUgKChsYiA9IHNrYl9kZXF1ZXVlKCZjYXJkLT5sYnBvb2wucXVldWUpKSAhPSBOVUxMKQotICAgICAgZGV2X2tmcmVlX3NrYl9hbnkobGIpOwotICAgd2hpbGUgKChzYiA9IHNrYl9kZXF1ZXVlKCZjYXJkLT5zYnBvb2wucXVldWUpKSAhPSBOVUxMKQotICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2IpOwotICAgZnJlZV9zY3EoY2FyZC0+c2NxMCwgTlVMTCk7Ci0gICBmb3IgKGogPSAwOyBqIDwgTlNfRlJTQ0RfTlVNOyBqKyspCi0gICB7Ci0gICAgICBpZiAoY2FyZC0+c2NkMnZjW2pdICE9IE5VTEwpCi0gICAgICAgICBmcmVlX3NjcShjYXJkLT5zY2QydmNbal0tPnNjcSwgY2FyZC0+c2NkMnZjW2pdLT50eF92Y2MpOwotICAgfQotICAga2ZyZWUoY2FyZC0+cnNxLm9yZyk7Ci0gICBrZnJlZShjYXJkLT50c3Eub3JnKTsKLSAgIGZyZWVfaXJxKGNhcmQtPnBjaWRldi0+aXJxLCBjYXJkKTsKLSAgIGlvdW5tYXAoY2FyZC0+bWVtYmFzZSk7Ci0gICBrZnJlZShjYXJkKTsKKwkvKiBEZS1yZWdpc3RlciBkZXZpY2UgKi8KKwlhdG1fZGV2X2RlcmVnaXN0ZXIoY2FyZC0+YXRtZGV2KTsKKworCS8qIERpc2FibGUgUENJIGRldmljZSAqLworCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOworCisJLyogRnJlZSB1cCByZXNvdXJjZXMgKi8KKwlqID0gMDsKKwlQUklOVEsoIm5pY3N0YXIlZDogZnJlZWluZyAlZCBodWdlIGJ1ZmZlcnMuXG4iLCBpLCBjYXJkLT5oYnBvb2wuY291bnQpOworCXdoaWxlICgoaGIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aGJwb29sLnF1ZXVlKSkgIT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShoYik7CisJCWorKzsKKwl9CisJUFJJTlRLKCJuaWNzdGFyJWQ6ICVkIGh1Z2UgYnVmZmVycyBmcmVlZC5cbiIsIGksIGopOworCWogPSAwOworCVBSSU5USygibmljc3RhciVkOiBmcmVlaW5nICVkIGlvdmVjIGJ1ZmZlcnMuXG4iLCBpLAorCSAgICAgICBjYXJkLT5pb3Zwb29sLmNvdW50KTsKKwl3aGlsZSAoKGlvdmIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aW92cG9vbC5xdWV1ZSkpICE9IE5VTEwpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoaW92Yik7CisJCWorKzsKKwl9CisJUFJJTlRLKCJuaWNzdGFyJWQ6ICVkIGlvdmVjIGJ1ZmZlcnMgZnJlZWQuXG4iLCBpLCBqKTsKKwl3aGlsZSAoKGxiID0gc2tiX2RlcXVldWUoJmNhcmQtPmxicG9vbC5xdWV1ZSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2JfYW55KGxiKTsKKwl3aGlsZSAoKHNiID0gc2tiX2RlcXVldWUoJmNhcmQtPnNicG9vbC5xdWV1ZSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2JfYW55KHNiKTsKKwlmcmVlX3NjcShjYXJkLCBjYXJkLT5zY3EwLCBOVUxMKTsKKwlmb3IgKGogPSAwOyBqIDwgTlNfRlJTQ0RfTlVNOyBqKyspIHsKKwkJaWYgKGNhcmQtPnNjZDJ2Y1tqXSAhPSBOVUxMKQorCQkJZnJlZV9zY3EoY2FyZCwgY2FyZC0+c2NkMnZjW2pdLT5zY3EsIGNhcmQtPnNjZDJ2Y1tqXS0+dHhfdmNjKTsKKwl9CisJaWRyX3JlbW92ZV9hbGwoJmNhcmQtPmlkcik7CisJaWRyX2Rlc3Ryb3koJmNhcmQtPmlkcik7CisJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lkZXYsIE5TX1JTUVNJWkUgKyBOU19SU1FfQUxJR05NRU5ULAorCQkJICAgIGNhcmQtPnJzcS5vcmcsIGNhcmQtPnJzcS5kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpZGV2LCBOU19UU1FTSVpFICsgTlNfVFNRX0FMSUdOTUVOVCwKKwkJCSAgICBjYXJkLT50c3Eub3JnLCBjYXJkLT50c3EuZG1hKTsKKwlmcmVlX2lycShjYXJkLT5wY2lkZXYtPmlycSwgY2FyZCk7CisJaW91bm1hcChjYXJkLT5tZW1iYXNlKTsKKwlrZnJlZShjYXJkKTsKIH0KIAotCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuaWNzdGFyX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KLXsKLQl7UENJX1ZFTkRPUl9JRF9JRFQsIFBDSV9ERVZJQ0VfSURfSURUX0lEVDc3MjAxLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuaWNzdGFyX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZERVZJQ0UoSURULCBQQ0lfREVWSUNFX0lEX0lEVF9JRFQ3NzIwMSksIDAgfSwKIAl7MCx9CQkJLyogdGVybWluYXRlIGxpc3QgKi8KIH07CisKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuaWNzdGFyX3BjaV90YmwpOwogCi0KLQogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5pY3N0YXJfZHJpdmVyID0gewotCS5uYW1lCQk9ICJuaWNzdGFyIiwKLQkuaWRfdGFibGUJPSBuaWNzdGFyX3BjaV90YmwsCi0JLnByb2JlCQk9IG5pY3N0YXJfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuaWNzdGFyX3JlbW92ZV9vbmUpLAorCS5uYW1lID0gIm5pY3N0YXIiLAorCS5pZF90YWJsZSA9IG5pY3N0YXJfcGNpX3RibCwKKwkucHJvYmUgPSBuaWNzdGFyX2luaXRfb25lLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChuaWNzdGFyX3JlbW92ZV9vbmUpLAogfTsKIAotCi0KIHN0YXRpYyBpbnQgX19pbml0IG5pY3N0YXJfaW5pdCh2b2lkKQogewotICAgdW5zaWduZWQgZXJyb3IgPSAwOwkvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsZSB3YXJuaW5nICovCisJdW5zaWduZWQgZXJyb3IgPSAwOwkvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsZSB3YXJuaW5nICovCiAKLSAgIFhQUklOVEsoIm5pY3N0YXI6IG5pY3N0YXJfaW5pdCgpIGNhbGxlZC5cbiIpOworCVhQUklOVEsoIm5pY3N0YXI6IG5pY3N0YXJfaW5pdCgpIGNhbGxlZC5cbiIpOwogCi0gICBlcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5pY3N0YXJfZHJpdmVyKTsKLSAgIAotICAgVFhQUklOVEsoIm5pY3N0YXI6IFRYIGRlYnVnIGVuYWJsZWQuXG4iKTsKLSAgIFJYUFJJTlRLKCJuaWNzdGFyOiBSWCBkZWJ1ZyBlbmFibGVkLlxuIik7Ci0gICBQUklOVEsoIm5pY3N0YXI6IEdlbmVyYWwgZGVidWcgZW5hYmxlZC5cbiIpOworCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbmljc3Rhcl9kcml2ZXIpOworCisJVFhQUklOVEsoIm5pY3N0YXI6IFRYIGRlYnVnIGVuYWJsZWQuXG4iKTsKKwlSWFBSSU5USygibmljc3RhcjogUlggZGVidWcgZW5hYmxlZC5cbiIpOworCVBSSU5USygibmljc3RhcjogR2VuZXJhbCBkZWJ1ZyBlbmFibGVkLlxuIik7CiAjaWZkZWYgUEhZX0xPT1BCQUNLCi0gICBwcmludGsoIm5pY3N0YXI6IHVzaW5nIFBIWSBsb29wYmFjay5cbiIpOworCXByaW50aygibmljc3RhcjogdXNpbmcgUEhZIGxvb3BiYWNrLlxuIik7CiAjZW5kaWYgLyogUEhZX0xPT1BCQUNLICovCi0gICBYUFJJTlRLKCJuaWNzdGFyOiBuaWNzdGFyX2luaXQoKSByZXR1cm5lZC5cbiIpOworCVhQUklOVEsoIm5pY3N0YXI6IG5pY3N0YXJfaW5pdCgpIHJldHVybmVkLlxuIik7CiAKLSAgIGlmICghZXJyb3IpIHsKLSAgICAgIGluaXRfdGltZXIoJm5zX3RpbWVyKTsKLSAgICAgIG5zX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTlNfUE9MTF9QRVJJT0Q7Ci0gICAgICBuc190aW1lci5kYXRhID0gMFVMOwotICAgICAgbnNfdGltZXIuZnVuY3Rpb24gPSBuc19wb2xsOwotICAgICAgYWRkX3RpbWVyKCZuc190aW1lcik7Ci0gICB9Ci0gICAKLSAgIHJldHVybiBlcnJvcjsKKwlpZiAoIWVycm9yKSB7CisJCWluaXRfdGltZXIoJm5zX3RpbWVyKTsKKwkJbnNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBOU19QT0xMX1BFUklPRDsKKwkJbnNfdGltZXIuZGF0YSA9IDBVTDsKKwkJbnNfdGltZXIuZnVuY3Rpb24gPSBuc19wb2xsOworCQlhZGRfdGltZXIoJm5zX3RpbWVyKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLQotCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmljc3Rhcl9jbGVhbnVwKHZvaWQpCiB7Ci0gICBYUFJJTlRLKCJuaWNzdGFyOiBuaWNzdGFyX2NsZWFudXAoKSBjYWxsZWQuXG4iKTsKKwlYUFJJTlRLKCJuaWNzdGFyOiBuaWNzdGFyX2NsZWFudXAoKSBjYWxsZWQuXG4iKTsKIAotICAgZGVsX3RpbWVyKCZuc190aW1lcik7CisJZGVsX3RpbWVyKCZuc190aW1lcik7CiAKLSAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbmljc3Rhcl9kcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbmljc3Rhcl9kcml2ZXIpOwogCi0gICBYUFJJTlRLKCJuaWNzdGFyOiBuaWNzdGFyX2NsZWFudXAoKSByZXR1cm5lZC5cbiIpOworCVhQUklOVEsoIm5pY3N0YXI6IG5pY3N0YXJfY2xlYW51cCgpIHJldHVybmVkLlxuIik7CiB9CiAKLQotCi1zdGF0aWMgdTMyIG5zX3JlYWRfc3JhbShuc19kZXYgKmNhcmQsIHUzMiBzcmFtX2FkZHJlc3MpCitzdGF0aWMgdTMyIG5zX3JlYWRfc3JhbShuc19kZXYgKiBjYXJkLCB1MzIgc3JhbV9hZGRyZXNzKQogewotICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgIHUzMiBkYXRhOwotICAgc3JhbV9hZGRyZXNzIDw8PSAyOwotICAgc3JhbV9hZGRyZXNzICY9IDB4MDAwN0ZGRkM7CS8qIGFkZHJlc3MgbXVzdCBiZSBkd29yZCBhbGlnbmVkICovCi0gICBzcmFtX2FkZHJlc3MgfD0gMHg1MDAwMDAwMDsJLyogU1JBTSByZWFkIGNvbW1hbmQgKi8KLSAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOwotICAgd2hpbGUgKENNRF9CVVNZKGNhcmQpKTsKLSAgIHdyaXRlbChzcmFtX2FkZHJlc3MsIGNhcmQtPm1lbWJhc2UgKyBDTUQpOwotICAgd2hpbGUgKENNRF9CVVNZKGNhcmQpKTsKLSAgIGRhdGEgPSByZWFkbChjYXJkLT5tZW1iYXNlICsgRFIwKTsKLSAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7Ci0gICByZXR1cm4gZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBkYXRhOworCXNyYW1fYWRkcmVzcyA8PD0gMjsKKwlzcmFtX2FkZHJlc3MgJj0gMHgwMDA3RkZGQzsJLyogYWRkcmVzcyBtdXN0IGJlIGR3b3JkIGFsaWduZWQgKi8KKwlzcmFtX2FkZHJlc3MgfD0gMHg1MDAwMDAwMDsJLyogU1JBTSByZWFkIGNvbW1hbmQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwl3cml0ZWwoc3JhbV9hZGRyZXNzLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKKwl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwlkYXRhID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIERSMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAotCi0gICAKLXN0YXRpYyB2b2lkIG5zX3dyaXRlX3NyYW0obnNfZGV2ICpjYXJkLCB1MzIgc3JhbV9hZGRyZXNzLCB1MzIgKnZhbHVlLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBuc193cml0ZV9zcmFtKG5zX2RldiAqIGNhcmQsIHUzMiBzcmFtX2FkZHJlc3MsIHUzMiAqIHZhbHVlLAorCQkJICBpbnQgY291bnQpCiB7Ci0gICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgaW50IGksIGM7Ci0gICBjb3VudC0tOwkvKiBjb3VudCByYW5nZSBub3cgaXMgMC4uMyBpbnN0ZWFkIG9mIDEuLjQgKi8KLSAgIGMgPSBjb3VudDsKLSAgIGMgPDw9IDI7CS8qIHRvIHVzZSBpbmNyZW1lbnRzIG9mIDQgKi8KLSAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOwotICAgd2hpbGUgKENNRF9CVVNZKGNhcmQpKTsKLSAgIGZvciAoaSA9IDA7IGkgPD0gYzsgaSArPSA0KQotICAgICAgd3JpdGVsKCoodmFsdWUrKyksIGNhcmQtPm1lbWJhc2UgKyBpKTsKLSAgIC8qIE5vdGU6IERSIyByZWdpc3RlcnMgYXJlIHRoZSBmaXJzdCA0IGR3b3JkcyBpbiBuaWNzdGFyJ3MgbWVtc3BhY2UsCi0gICAgICAgICAgICBzbyBjYXJkLT5tZW1iYXNlICsgRFIwID09IGNhcmQtPm1lbWJhc2UgKi8KLSAgIHNyYW1fYWRkcmVzcyA8PD0gMjsKLSAgIHNyYW1fYWRkcmVzcyAmPSAweDAwMDdGRkZDOwotICAgc3JhbV9hZGRyZXNzIHw9ICgweDQwMDAwMDAwIHwgY291bnQpOwotICAgd3JpdGVsKHNyYW1fYWRkcmVzcywgY2FyZC0+bWVtYmFzZSArIENNRCk7Ci0gICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGM7CisJY291bnQtLTsJCS8qIGNvdW50IHJhbmdlIG5vdyBpcyAwLi4zIGluc3RlYWQgb2YgMS4uNCAqLworCWMgPSBjb3VudDsKKwljIDw8PSAyOwkJLyogdG8gdXNlIGluY3JlbWVudHMgb2YgNCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOworCXdoaWxlIChDTURfQlVTWShjYXJkKSkgOworCWZvciAoaSA9IDA7IGkgPD0gYzsgaSArPSA0KQorCQl3cml0ZWwoKih2YWx1ZSsrKSwgY2FyZC0+bWVtYmFzZSArIGkpOworCS8qIE5vdGU6IERSIyByZWdpc3RlcnMgYXJlIHRoZSBmaXJzdCA0IGR3b3JkcyBpbiBuaWNzdGFyJ3MgbWVtc3BhY2UsCisJICAgc28gY2FyZC0+bWVtYmFzZSArIERSMCA9PSBjYXJkLT5tZW1iYXNlICovCisJc3JhbV9hZGRyZXNzIDw8PSAyOworCXNyYW1fYWRkcmVzcyAmPSAweDAwMDdGRkZDOworCXNyYW1fYWRkcmVzcyB8PSAoMHg0MDAwMDAwMCB8IGNvdW50KTsKKwl3cml0ZWwoc3JhbV9hZGRyZXNzLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOwogfQogCi0KIHN0YXRpYyBpbnQgX19kZXZpbml0IG5zX2luaXRfY2FyZChpbnQgaSwgc3RydWN0IHBjaV9kZXYgKnBjaWRldikKIHsKLSAgIGludCBqOwotICAgc3RydWN0IG5zX2RldiAqY2FyZCA9IE5VTEw7Ci0gICB1bnNpZ25lZCBjaGFyIHBjaV9sYXRlbmN5OwotICAgdW5zaWduZWQgZXJyb3I7Ci0gICB1MzIgZGF0YTsKLSAgIHUzMiB1MzJkWzRdOwotICAgdTMyIG5zX2NmZ19yY3RzaXplOwotICAgaW50IGJjb3VudDsKLSAgIHVuc2lnbmVkIGxvbmcgbWVtYmFzZTsKKwlpbnQgajsKKwlzdHJ1Y3QgbnNfZGV2ICpjYXJkID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHBjaV9sYXRlbmN5OworCXVuc2lnbmVkIGVycm9yOworCXUzMiBkYXRhOworCXUzMiB1MzJkWzRdOworCXUzMiBuc19jZmdfcmN0c2l6ZTsKKwlpbnQgYmNvdW50OworCXVuc2lnbmVkIGxvbmcgbWVtYmFzZTsKIAotICAgZXJyb3IgPSAwOworCWVycm9yID0gMDsKIAotICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCi0gICB7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsIGkpOwotICAgICAgZXJyb3IgPSAyOwotICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgIH0KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgeworCQlwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsIGkpOworCQllcnJvciA9IDI7CisJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisgICAgICAgIGlmICgocGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSygzMikpICE9IDApIHx8CisJICAgIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soMzIpKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJuaWNzdGFyJWQ6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iLCBpKTsKKwkJZXJyb3IgPSAyOworCQluc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisgICAgICAgIH0KIAotICAgaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2YobnNfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0gICB7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2Ugc3RydWN0dXJlLlxuIiwgaSk7Ci0gICAgICBlcnJvciA9IDI7Ci0gICAgICBuc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgfQotICAgY2FyZHNbaV0gPSBjYXJkOwotICAgc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmludF9sb2NrKTsKLSAgIHNwaW5fbG9ja19pbml0KCZjYXJkLT5yZXNfbG9jayk7Ci0gICAgICAKLSAgIHBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIGNhcmQpOwotICAgCi0gICBjYXJkLT5pbmRleCA9IGk7Ci0gICBjYXJkLT5hdG1kZXYgPSBOVUxMOwotICAgY2FyZC0+cGNpZGV2ID0gcGNpZGV2OwotICAgbWVtYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDEpOwotICAgY2FyZC0+bWVtYmFzZSA9IGlvcmVtYXAobWVtYmFzZSwgTlNfSU9SRU1BUF9TSVpFKTsKLSAgIGlmICghY2FyZC0+bWVtYmFzZSkKLSAgIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiBjYW4ndCBpb3JlbWFwKCkgbWVtYmFzZS5cbiIsaSk7Ci0gICAgICBlcnJvciA9IDM7Ci0gICAgICBuc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgfQotICAgUFJJTlRLKCJuaWNzdGFyJWQ6IG1lbWJhc2UgYXQgMHgleC5cbiIsIGksIGNhcmQtPm1lbWJhc2UpOworCWlmICgoY2FyZCA9IGttYWxsb2Moc2l6ZW9mKG5zX2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50aworCQkgICAgKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIHN0cnVjdHVyZS5cbiIsCisJCSAgICAgaSk7CisJCWVycm9yID0gMjsKKwkJbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwljYXJkc1tpXSA9IGNhcmQ7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmludF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+cmVzX2xvY2spOwogCi0gICBwY2lfc2V0X21hc3RlcihwY2lkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIGNhcmQpOwogCi0gICBpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KSAhPSAwKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IHJlYWQgUENJIGxhdGVuY3kgdGltZXIuXG4iLCBpKTsKLSAgICAgIGVycm9yID0gNjsKLSAgICAgIG5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICB9CisJY2FyZC0+aW5kZXggPSBpOworCWNhcmQtPmF0bWRldiA9IE5VTEw7CisJY2FyZC0+cGNpZGV2ID0gcGNpZGV2OworCW1lbWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAxKTsKKwljYXJkLT5tZW1iYXNlID0gaW9yZW1hcChtZW1iYXNlLCBOU19JT1JFTUFQX1NJWkUpOworCWlmICghY2FyZC0+bWVtYmFzZSkgeworCQlwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgaW9yZW1hcCgpIG1lbWJhc2UuXG4iLCBpKTsKKwkJZXJyb3IgPSAzOworCQluc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCVBSSU5USygibmljc3RhciVkOiBtZW1iYXNlIGF0IDB4JXAuXG4iLCBpLCBjYXJkLT5tZW1iYXNlKTsKKworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CisKKwlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KSAhPSAwKSB7CisJCXByaW50aygibmljc3RhciVkOiBjYW4ndCByZWFkIFBDSSBsYXRlbmN5IHRpbWVyLlxuIiwgaSk7CisJCWVycm9yID0gNjsKKwkJbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KICNpZmRlZiBOU19QQ0lfTEFURU5DWQotICAgaWYgKHBjaV9sYXRlbmN5IDwgTlNfUENJX0xBVEVOQ1kpCi0gICB7Ci0gICAgICBQUklOVEsoIm5pY3N0YXIlZDogc2V0dGluZyBQQ0kgbGF0ZW5jeSB0aW1lciB0byAlZC5cbiIsIGksIE5TX1BDSV9MQVRFTkNZKTsKLSAgICAgIGZvciAoaiA9IDE7IGogPCA0OyBqKyspCi0gICAgICB7Ci0gICAgICAgICBpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwgUENJX0xBVEVOQ1lfVElNRVIsIE5TX1BDSV9MQVRFTkNZKSAhPSAwKQotCSAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChqID09IDQpCi0gICAgICB7Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogY2FuJ3Qgc2V0IFBDSSBsYXRlbmN5IHRpbWVyIHRvICVkLlxuIiwgaSwgTlNfUENJX0xBVEVOQ1kpOwotICAgICAgICAgZXJyb3IgPSA3OwotICAgICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLQkgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgfQorCWlmIChwY2lfbGF0ZW5jeSA8IE5TX1BDSV9MQVRFTkNZKSB7CisJCVBSSU5USygibmljc3RhciVkOiBzZXR0aW5nIFBDSSBsYXRlbmN5IHRpbWVyIHRvICVkLlxuIiwgaSwKKwkJICAgICAgIE5TX1BDSV9MQVRFTkNZKTsKKwkJZm9yIChqID0gMTsgaiA8IDQ7IGorKykgeworCQkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZQorCQkJICAgIChwY2lkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCBOU19QQ0lfTEFURU5DWSkgIT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSA0KSB7CisJCQlwcmludGsKKwkJCSAgICAoIm5pY3N0YXIlZDogY2FuJ3Qgc2V0IFBDSSBsYXRlbmN5IHRpbWVyIHRvICVkLlxuIiwKKwkJCSAgICAgaSwgTlNfUENJX0xBVEVOQ1kpOworCQkJZXJyb3IgPSA3OworCQkJbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KICNlbmRpZiAvKiBOU19QQ0lfTEFURU5DWSAqLwotICAgICAgCi0gICAvKiBDbGVhciB0aW1lciBvdmVyZmxvdyAqLwotICAgZGF0YSA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKLSAgIGlmIChkYXRhICYgTlNfU1RBVF9UTVJPRikKLSAgICAgIHdyaXRlbChOU19TVEFUX1RNUk9GLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CiAKLSAgIC8qIFNvZnR3YXJlIHJlc2V0ICovCi0gICB3cml0ZWwoTlNfQ0ZHX1NXUlNULCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKLSAgIE5TX0RFTEFZOwotICAgd3JpdGVsKDB4MDAwMDAwMDAsIGNhcmQtPm1lbWJhc2UgKyBDRkcpOworCS8qIENsZWFyIHRpbWVyIG92ZXJmbG93ICovCisJZGF0YSA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwlpZiAoZGF0YSAmIE5TX1NUQVRfVE1ST0YpCisJCXdyaXRlbChOU19TVEFUX1RNUk9GLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CiAKLSAgIC8qIFBIWSByZXNldCAqLwotICAgd3JpdGVsKDB4MDAwMDAwMDgsIGNhcmQtPm1lbWJhc2UgKyBHUCk7Ci0gICBOU19ERUxBWTsKLSAgIHdyaXRlbCgweDAwMDAwMDAxLCBjYXJkLT5tZW1iYXNlICsgR1ApOwotICAgTlNfREVMQVk7Ci0gICB3aGlsZSAoQ01EX0JVU1koY2FyZCkpOwotICAgd3JpdGVsKE5TX0NNRF9XUklURV9VVElMSVRZIHwgMHgwMDAwMDEwMCwgY2FyZC0+bWVtYmFzZSArIENNRCk7CS8qIFN5bmMgVVRPUElBIHdpdGggU0FSIGNsb2NrICovCi0gICBOU19ERUxBWTsKLSAgICAgIAotICAgLyogRGV0ZWN0IFBIWSB0eXBlICovCi0gICB3aGlsZSAoQ01EX0JVU1koY2FyZCkpOwotICAgd3JpdGVsKE5TX0NNRF9SRUFEX1VUSUxJVFkgfCAweDAwMDAwMjAwLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKLSAgIHdoaWxlIChDTURfQlVTWShjYXJkKSk7Ci0gICBkYXRhID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIERSMCk7Ci0gICBzd2l0Y2goZGF0YSkgewotICAgICAgY2FzZSAweDAwMDAwMDA5OgotICAgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IFBIWSBzZWVtcyB0byBiZSAyNSBNYnBzLlxuIiwgaSk7Ci0gICAgICAgICBjYXJkLT5tYXhfcGNyID0gQVRNXzI1X1BDUjsKLSAgICAgICAgIHdoaWxlKENNRF9CVVNZKGNhcmQpKTsKLSAgICAgICAgIHdyaXRlbCgweDAwMDAwMDA4LCBjYXJkLT5tZW1iYXNlICsgRFIwKTsKLSAgICAgICAgIHdyaXRlbChOU19DTURfV1JJVEVfVVRJTElUWSB8IDB4MDAwMDAyMDAsIGNhcmQtPm1lbWJhc2UgKyBDTUQpOwotICAgICAgICAgLyogQ2xlYXIgYW4gZXZlbnR1YWwgcGVuZGluZyBpbnRlcnJ1cHQgKi8KLSAgICAgICAgIHdyaXRlbChOU19TVEFUX1NGQlFGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJLyogU29mdHdhcmUgcmVzZXQgKi8KKwl3cml0ZWwoTlNfQ0ZHX1NXUlNULCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKKwlOU19ERUxBWTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgY2FyZC0+bWVtYmFzZSArIENGRyk7CisKKwkvKiBQSFkgcmVzZXQgKi8KKwl3cml0ZWwoMHgwMDAwMDAwOCwgY2FyZC0+bWVtYmFzZSArIEdQKTsKKwlOU19ERUxBWTsKKwl3cml0ZWwoMHgwMDAwMDAwMSwgY2FyZC0+bWVtYmFzZSArIEdQKTsKKwlOU19ERUxBWTsKKwl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwl3cml0ZWwoTlNfQ01EX1dSSVRFX1VUSUxJVFkgfCAweDAwMDAwMTAwLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsJLyogU3luYyBVVE9QSUEgd2l0aCBTQVIgY2xvY2sgKi8KKwlOU19ERUxBWTsKKworCS8qIERldGVjdCBQSFkgdHlwZSAqLworCXdoaWxlIChDTURfQlVTWShjYXJkKSkgOworCXdyaXRlbChOU19DTURfUkVBRF9VVElMSVRZIHwgMHgwMDAwMDIwMCwgY2FyZC0+bWVtYmFzZSArIENNRCk7CisJd2hpbGUgKENNRF9CVVNZKGNhcmQpKSA7CisJZGF0YSA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBEUjApOworCXN3aXRjaCAoZGF0YSkgeworCWNhc2UgMHgwMDAwMDAwOToKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IFBIWSBzZWVtcyB0byBiZSAyNSBNYnBzLlxuIiwgaSk7CisJCWNhcmQtPm1heF9wY3IgPSBBVE1fMjVfUENSOworCQl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwkJd3JpdGVsKDB4MDAwMDAwMDgsIGNhcmQtPm1lbWJhc2UgKyBEUjApOworCQl3cml0ZWwoTlNfQ01EX1dSSVRFX1VUSUxJVFkgfCAweDAwMDAwMjAwLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKKwkJLyogQ2xlYXIgYW4gZXZlbnR1YWwgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKE5TX1NUQVRfU0ZCUUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKICNpZmRlZiBQSFlfTE9PUEJBQ0sKLSAgICAgICAgIHdoaWxlKENNRF9CVVNZKGNhcmQpKTsKLSAgICAgICAgIHdyaXRlbCgweDAwMDAwMDIyLCBjYXJkLT5tZW1iYXNlICsgRFIwKTsKLSAgICAgICAgIHdyaXRlbChOU19DTURfV1JJVEVfVVRJTElUWSB8IDB4MDAwMDAyMDIsIGNhcmQtPm1lbWJhc2UgKyBDTUQpOworCQl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwkJd3JpdGVsKDB4MDAwMDAwMjIsIGNhcmQtPm1lbWJhc2UgKyBEUjApOworCQl3cml0ZWwoTlNfQ01EX1dSSVRFX1VUSUxJVFkgfCAweDAwMDAwMjAyLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKICNlbmRpZiAvKiBQSFlfTE9PUEJBQ0sgKi8KLQkgYnJlYWs7Ci0gICAgICBjYXNlIDB4MDAwMDAwMzA6Ci0gICAgICBjYXNlIDB4MDAwMDAwMzE6Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogUEhZIHNlZW1zIHRvIGJlIDE1NSBNYnBzLlxuIiwgaSk7Ci0gICAgICAgICBjYXJkLT5tYXhfcGNyID0gQVRNX09DM19QQ1I7CisJCWJyZWFrOworCWNhc2UgMHgwMDAwMDAzMDoKKwljYXNlIDB4MDAwMDAwMzE6CisJCXByaW50aygibmljc3RhciVkOiBQSFkgc2VlbXMgdG8gYmUgMTU1IE1icHMuXG4iLCBpKTsKKwkJY2FyZC0+bWF4X3BjciA9IEFUTV9PQzNfUENSOwogI2lmZGVmIFBIWV9MT09QQkFDSwotICAgICAgICAgd2hpbGUoQ01EX0JVU1koY2FyZCkpOwotICAgICAgICAgd3JpdGVsKDB4MDAwMDAwMDIsIGNhcmQtPm1lbWJhc2UgKyBEUjApOwotICAgICAgICAgd3JpdGVsKE5TX0NNRF9XUklURV9VVElMSVRZIHwgMHgwMDAwMDIwNSwgY2FyZC0+bWVtYmFzZSArIENNRCk7CisJCXdoaWxlIChDTURfQlVTWShjYXJkKSkgOworCQl3cml0ZWwoMHgwMDAwMDAwMiwgY2FyZC0+bWVtYmFzZSArIERSMCk7CisJCXdyaXRlbChOU19DTURfV1JJVEVfVVRJTElUWSB8IDB4MDAwMDAyMDUsIGNhcmQtPm1lbWJhc2UgKyBDTUQpOwogI2VuZGlmIC8qIFBIWV9MT09QQkFDSyAqLwotCSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogdW5rbm93biBQSFkgdHlwZSAoMHglMDhYKS5cbiIsIGksIGRhdGEpOwotICAgICAgICAgZXJyb3IgPSA4OwotICAgICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLSAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgIH0KLSAgIHdyaXRlbCgweDAwMDAwMDAwLCBjYXJkLT5tZW1iYXNlICsgR1ApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIm5pY3N0YXIlZDogdW5rbm93biBQSFkgdHlwZSAoMHglMDhYKS5cbiIsIGksIGRhdGEpOworCQllcnJvciA9IDg7CisJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJd3JpdGVsKDB4MDAwMDAwMDAsIGNhcmQtPm1lbWJhc2UgKyBHUCk7CiAKLSAgIC8qIERldGVybWluZSBTUkFNIHNpemUgKi8KLSAgIGRhdGEgPSAweDc2NTQzMjEwOwotICAgbnNfd3JpdGVfc3JhbShjYXJkLCAweDFDMDAzLCAmZGF0YSwgMSk7Ci0gICBkYXRhID0gMHg4OUFCQ0RFRjsKLSAgIG5zX3dyaXRlX3NyYW0oY2FyZCwgMHgxNDAwMywgJmRhdGEsIDEpOwotICAgaWYgKG5zX3JlYWRfc3JhbShjYXJkLCAweDE0MDAzKSA9PSAweDg5QUJDREVGICYmCi0gICAgICAgbnNfcmVhZF9zcmFtKGNhcmQsIDB4MUMwMDMpID09IDB4NzY1NDMyMTApCi0gICAgICAgY2FyZC0+c3JhbV9zaXplID0gMTI4OwotICAgZWxzZQotICAgICAgY2FyZC0+c3JhbV9zaXplID0gMzI7Ci0gICBQUklOVEsoIm5pY3N0YXIlZDogJWRLIHggMzJiaXQgU1JBTSBzaXplLlxuIiwgaSwgY2FyZC0+c3JhbV9zaXplKTsKKwkvKiBEZXRlcm1pbmUgU1JBTSBzaXplICovCisJZGF0YSA9IDB4NzY1NDMyMTA7CisJbnNfd3JpdGVfc3JhbShjYXJkLCAweDFDMDAzLCAmZGF0YSwgMSk7CisJZGF0YSA9IDB4ODlBQkNERUY7CisJbnNfd3JpdGVfc3JhbShjYXJkLCAweDE0MDAzLCAmZGF0YSwgMSk7CisJaWYgKG5zX3JlYWRfc3JhbShjYXJkLCAweDE0MDAzKSA9PSAweDg5QUJDREVGICYmCisJICAgIG5zX3JlYWRfc3JhbShjYXJkLCAweDFDMDAzKSA9PSAweDc2NTQzMjEwKQorCQljYXJkLT5zcmFtX3NpemUgPSAxMjg7CisJZWxzZQorCQljYXJkLT5zcmFtX3NpemUgPSAzMjsKKwlQUklOVEsoIm5pY3N0YXIlZDogJWRLIHggMzJiaXQgU1JBTSBzaXplLlxuIiwgaSwgY2FyZC0+c3JhbV9zaXplKTsKIAotICAgY2FyZC0+cmN0X3NpemUgPSBOU19NQVhfUkNUU0laRTsKKwljYXJkLT5yY3Rfc2l6ZSA9IE5TX01BWF9SQ1RTSVpFOwogCiAjaWYgKE5TX01BWF9SQ1RTSVpFID09IDQwOTYpCi0gICBpZiAoY2FyZC0+c3JhbV9zaXplID09IDEyOCkKLSAgICAgIHByaW50aygibmljc3RhciVkOiBsaW1pdGluZyBtYXhpbXVtIFZDSS4gU2VlIE5TX01BWF9SQ1RTSVpFIGluIG5pY3N0YXIuaFxuIiwgaSk7CisJaWYgKGNhcmQtPnNyYW1fc2l6ZSA9PSAxMjgpCisJCXByaW50aworCQkgICAgKCJuaWNzdGFyJWQ6IGxpbWl0aW5nIG1heGltdW0gVkNJLiBTZWUgTlNfTUFYX1JDVFNJWkUgaW4gbmljc3Rhci5oXG4iLAorCQkgICAgIGkpOwogI2VsaWYgKE5TX01BWF9SQ1RTSVpFID09IDE2Mzg0KQotICAgaWYgKGNhcmQtPnNyYW1fc2l6ZSA9PSAzMikKLSAgIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiB3YXN0aW5nIG1lbW9yeS4gU2VlIE5TX01BWF9SQ1RTSVpFIGluIG5pY3N0YXIuaFxuIiwgaSk7Ci0gICAgICBjYXJkLT5yY3Rfc2l6ZSA9IDQwOTY7Ci0gICB9CisJaWYgKGNhcmQtPnNyYW1fc2l6ZSA9PSAzMikgeworCQlwcmludGsKKwkJICAgICgibmljc3RhciVkOiB3YXN0aW5nIG1lbW9yeS4gU2VlIE5TX01BWF9SQ1RTSVpFIGluIG5pY3N0YXIuaFxuIiwKKwkJICAgICBpKTsKKwkJY2FyZC0+cmN0X3NpemUgPSA0MDk2OworCX0KICNlbHNlCiAjZXJyb3IgTlNfTUFYX1JDVFNJWkUgbXVzdCBiZSBlaXRoZXIgNDA5NiBvciAxNjM4NCBpbiBuaWNzdGFyLmMKICNlbmRpZgogCi0gICBjYXJkLT52cGliaXRzID0gTlNfVlBJQklUUzsKLSAgIGlmIChjYXJkLT5yY3Rfc2l6ZSA9PSA0MDk2KQotICAgICAgY2FyZC0+dmNpYml0cyA9IDEyIC0gTlNfVlBJQklUUzsKLSAgIGVsc2UgLyogY2FyZC0+cmN0X3NpemUgPT0gMTYzODQgKi8KLSAgICAgIGNhcmQtPnZjaWJpdHMgPSAxNCAtIE5TX1ZQSUJJVFM7CisJY2FyZC0+dnBpYml0cyA9IE5TX1ZQSUJJVFM7CisJaWYgKGNhcmQtPnJjdF9zaXplID09IDQwOTYpCisJCWNhcmQtPnZjaWJpdHMgPSAxMiAtIE5TX1ZQSUJJVFM7CisJZWxzZQkJCS8qIGNhcmQtPnJjdF9zaXplID09IDE2Mzg0ICovCisJCWNhcmQtPnZjaWJpdHMgPSAxNCAtIE5TX1ZQSUJJVFM7CiAKLSAgIC8qIEluaXRpYWxpemUgdGhlIG5pY3N0YXIgZWVwcm9tL2Vwcm9tIHN0dWZmLCBmb3IgdGhlIE1BQyBhZGRyICovCi0gICBpZiAobWFjW2ldID09IE5VTEwpCi0gICAgICBuaWNzdGFyX2luaXRfZXByb20oY2FyZC0+bWVtYmFzZSk7CisJLyogSW5pdGlhbGl6ZSB0aGUgbmljc3RhciBlZXByb20vZXByb20gc3R1ZmYsIGZvciB0aGUgTUFDIGFkZHIgKi8KKwlpZiAobWFjW2ldID09IE5VTEwpCisJCW5pY3N0YXJfaW5pdF9lcHJvbShjYXJkLT5tZW1iYXNlKTsKIAotICAgLyogU2V0IHRoZSBWUEkvVkNJIE1TYiBtYXNrIHRvIHplcm8gc28gd2UgY2FuIHJlY2VpdmUgT0FNIGNlbGxzICovCi0gICB3cml0ZWwoMHgwMDAwMDAwMCwgY2FyZC0+bWVtYmFzZSArIFZQTSk7Ci0gICAgICAKLSAgIC8qIEluaXRpYWxpemUgVFNRICovCi0gICBjYXJkLT50c3Eub3JnID0ga21hbGxvYyhOU19UU1FTSVpFICsgTlNfVFNRX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7Ci0gICBpZiAoY2FyZC0+dHNxLm9yZyA9PSBOVUxMKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlIFRTUS5cbiIsIGkpOwotICAgICAgZXJyb3IgPSAxMDsKLSAgICAgIG5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICB9Ci0gICBjYXJkLT50c3EuYmFzZSA9IChuc190c2kgKikgQUxJR05fQUREUkVTUyhjYXJkLT50c3Eub3JnLCBOU19UU1FfQUxJR05NRU5UKTsKLSAgIGNhcmQtPnRzcS5uZXh0ID0gY2FyZC0+dHNxLmJhc2U7Ci0gICBjYXJkLT50c3EubGFzdCA9IGNhcmQtPnRzcS5iYXNlICsgKE5TX1RTUV9OVU1fRU5UUklFUyAtIDEpOwotICAgZm9yIChqID0gMDsgaiA8IE5TX1RTUV9OVU1fRU5UUklFUzsgaisrKQotICAgICAgbnNfdHNpX2luaXQoY2FyZC0+dHNxLmJhc2UgKyBqKTsKLSAgIHdyaXRlbCgweDAwMDAwMDAwLCBjYXJkLT5tZW1iYXNlICsgVFNRSCk7Ci0gICB3cml0ZWwoKHUzMikgdmlydF90b19idXMoY2FyZC0+dHNxLmJhc2UpLCBjYXJkLT5tZW1iYXNlICsgVFNRQik7Ci0gICBQUklOVEsoIm5pY3N0YXIlZDogVFNRIGJhc2UgYXQgMHgleCAgMHgleCAgMHgleC5cbiIsIGksICh1MzIpIGNhcmQtPnRzcS5iYXNlLAotICAgICAgICAgICh1MzIpIHZpcnRfdG9fYnVzKGNhcmQtPnRzcS5iYXNlKSwgcmVhZGwoY2FyZC0+bWVtYmFzZSArIFRTUUIpKTsKLSAgICAgIAotICAgLyogSW5pdGlhbGl6ZSBSU1EgKi8KLSAgIGNhcmQtPnJzcS5vcmcgPSBrbWFsbG9jKE5TX1JTUVNJWkUgKyBOU19SU1FfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKLSAgIGlmIChjYXJkLT5yc3Eub3JnID09IE5VTEwpCi0gICB7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgUlNRLlxuIiwgaSk7Ci0gICAgICBlcnJvciA9IDExOwotICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgIH0KLSAgIGNhcmQtPnJzcS5iYXNlID0gKG5zX3JzcWUgKikgQUxJR05fQUREUkVTUyhjYXJkLT5yc3Eub3JnLCBOU19SU1FfQUxJR05NRU5UKTsKLSAgIGNhcmQtPnJzcS5uZXh0ID0gY2FyZC0+cnNxLmJhc2U7Ci0gICBjYXJkLT5yc3EubGFzdCA9IGNhcmQtPnJzcS5iYXNlICsgKE5TX1JTUV9OVU1fRU5UUklFUyAtIDEpOwotICAgZm9yIChqID0gMDsgaiA8IE5TX1JTUV9OVU1fRU5UUklFUzsgaisrKQotICAgICAgbnNfcnNxZV9pbml0KGNhcmQtPnJzcS5iYXNlICsgaik7Ci0gICB3cml0ZWwoMHgwMDAwMDAwMCwgY2FyZC0+bWVtYmFzZSArIFJTUUgpOwotICAgd3JpdGVsKCh1MzIpIHZpcnRfdG9fYnVzKGNhcmQtPnJzcS5iYXNlKSwgY2FyZC0+bWVtYmFzZSArIFJTUUIpOwotICAgUFJJTlRLKCJuaWNzdGFyJWQ6IFJTUSBiYXNlIGF0IDB4JXguXG4iLCBpLCAodTMyKSBjYXJkLT5yc3EuYmFzZSk7Ci0gICAgICAKLSAgIC8qIEluaXRpYWxpemUgU0NRMCwgdGhlIG9ubHkgVkJSIFNDUSB1c2VkICovCi0gICBjYXJkLT5zY3ExID0gTlVMTDsKLSAgIGNhcmQtPnNjcTIgPSBOVUxMOwotICAgY2FyZC0+c2NxMCA9IGdldF9zY3EoVkJSX1NDUVNJWkUsIE5TX1ZSU0NEMCk7Ci0gICBpZiAoY2FyZC0+c2NxMCA9PSBOVUxMKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IGdldCBTQ1EwLlxuIiwgaSk7Ci0gICAgICBlcnJvciA9IDEyOwotICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgIH0KLSAgIHUzMmRbMF0gPSAodTMyKSB2aXJ0X3RvX2J1cyhjYXJkLT5zY3EwLT5iYXNlKTsKLSAgIHUzMmRbMV0gPSAodTMyKSAweDAwMDAwMDAwOwotICAgdTMyZFsyXSA9ICh1MzIpIDB4ZmZmZmZmZmY7Ci0gICB1MzJkWzNdID0gKHUzMikgMHgwMDAwMDAwMDsKLSAgIG5zX3dyaXRlX3NyYW0oY2FyZCwgTlNfVlJTQ0QwLCB1MzJkLCA0KTsKLSAgIG5zX3dyaXRlX3NyYW0oY2FyZCwgTlNfVlJTQ0QxLCB1MzJkLCA0KTsJLyogVGhlc2UgbGFzdCB0d28gd29uJ3QgYmUgdXNlZCAqLwotICAgbnNfd3JpdGVfc3JhbShjYXJkLCBOU19WUlNDRDIsIHUzMmQsIDQpOwkvKiBidXQgYXJlIGluaXRpYWxpemVkLCBqdXN0IGluIGNhc2UuLi4gKi8KLSAgIGNhcmQtPnNjcTAtPnNjZCA9IE5TX1ZSU0NEMDsKLSAgIFBSSU5USygibmljc3RhciVkOiBWQlItU0NRMCBiYXNlIGF0IDB4JXguXG4iLCBpLCAodTMyKSBjYXJkLT5zY3EwLT5iYXNlKTsKKwkvKiBTZXQgdGhlIFZQSS9WQ0kgTVNiIG1hc2sgdG8gemVybyBzbyB3ZSBjYW4gcmVjZWl2ZSBPQU0gY2VsbHMgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMCwgY2FyZC0+bWVtYmFzZSArIFZQTSk7CiAKLSAgIC8qIEluaXRpYWxpemUgVFNUcyAqLwotICAgY2FyZC0+dHN0X2FkZHIgPSBOU19UU1QwOwotICAgY2FyZC0+dHN0X2ZyZWVfZW50cmllcyA9IE5TX1RTVF9OVU1fRU5UUklFUzsKLSAgIGRhdGEgPSBOU19UU1RfT1BDT0RFX1ZBUklBQkxFOwotICAgZm9yIChqID0gMDsgaiA8IE5TX1RTVF9OVU1fRU5UUklFUzsgaisrKQotICAgICAgbnNfd3JpdGVfc3JhbShjYXJkLCBOU19UU1QwICsgaiwgJmRhdGEsIDEpOwotICAgZGF0YSA9IG5zX3RzdGVfbWFrZShOU19UU1RfT1BDT0RFX0VORCwgTlNfVFNUMCk7Ci0gICBuc193cml0ZV9zcmFtKGNhcmQsIE5TX1RTVDAgKyBOU19UU1RfTlVNX0VOVFJJRVMsICZkYXRhLCAxKTsKLSAgIGZvciAoaiA9IDA7IGogPCBOU19UU1RfTlVNX0VOVFJJRVM7IGorKykKLSAgICAgIG5zX3dyaXRlX3NyYW0oY2FyZCwgTlNfVFNUMSArIGosICZkYXRhLCAxKTsKLSAgIGRhdGEgPSBuc190c3RlX21ha2UoTlNfVFNUX09QQ09ERV9FTkQsIE5TX1RTVDEpOwotICAgbnNfd3JpdGVfc3JhbShjYXJkLCBOU19UU1QxICsgTlNfVFNUX05VTV9FTlRSSUVTLCAmZGF0YSwgMSk7Ci0gICBmb3IgKGogPSAwOyBqIDwgTlNfVFNUX05VTV9FTlRSSUVTOyBqKyspCi0gICAgICBjYXJkLT50c3RlMnZjW2pdID0gTlVMTDsKLSAgIHdyaXRlbChOU19UU1QwIDw8IDIsIGNhcmQtPm1lbWJhc2UgKyBUU1RCKTsKKwkvKiBJbml0aWFsaXplIFRTUSAqLworCWNhcmQtPnRzcS5vcmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lkZXYsCisJCQkJCSAgICAgTlNfVFNRU0laRSArIE5TX1RTUV9BTElHTk1FTlQsCisJCQkJCSAgICAgJmNhcmQtPnRzcS5kbWEpOworCWlmIChjYXJkLT50c3Eub3JnID09IE5VTEwpIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlIFRTUS5cbiIsIGkpOworCQllcnJvciA9IDEwOworCQluc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWNhcmQtPnRzcS5iYXNlID0gUFRSX0FMSUdOKGNhcmQtPnRzcS5vcmcsIE5TX1RTUV9BTElHTk1FTlQpOworCWNhcmQtPnRzcS5uZXh0ID0gY2FyZC0+dHNxLmJhc2U7CisJY2FyZC0+dHNxLmxhc3QgPSBjYXJkLT50c3EuYmFzZSArIChOU19UU1FfTlVNX0VOVFJJRVMgLSAxKTsKKwlmb3IgKGogPSAwOyBqIDwgTlNfVFNRX05VTV9FTlRSSUVTOyBqKyspCisJCW5zX3RzaV9pbml0KGNhcmQtPnRzcS5iYXNlICsgaik7CisJd3JpdGVsKDB4MDAwMDAwMDAsIGNhcmQtPm1lbWJhc2UgKyBUU1FIKTsKKwl3cml0ZWwoQUxJR04oY2FyZC0+dHNxLmRtYSwgTlNfVFNRX0FMSUdOTUVOVCksIGNhcmQtPm1lbWJhc2UgKyBUU1FCKTsKKwlQUklOVEsoIm5pY3N0YXIlZDogVFNRIGJhc2UgYXQgMHglcC5cbiIsIGksIGNhcmQtPnRzcS5iYXNlKTsKIAorCS8qIEluaXRpYWxpemUgUlNRICovCisJY2FyZC0+cnNxLm9yZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaWRldiwKKwkJCQkJICAgICBOU19SU1FTSVpFICsgTlNfUlNRX0FMSUdOTUVOVCwKKwkJCQkJICAgICAmY2FyZC0+cnNxLmRtYSk7CisJaWYgKGNhcmQtPnJzcS5vcmcgPT0gTlVMTCkgeworCQlwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgUlNRLlxuIiwgaSk7CisJCWVycm9yID0gMTE7CisJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJY2FyZC0+cnNxLmJhc2UgPSBQVFJfQUxJR04oY2FyZC0+cnNxLm9yZywgTlNfUlNRX0FMSUdOTUVOVCk7CisJY2FyZC0+cnNxLm5leHQgPSBjYXJkLT5yc3EuYmFzZTsKKwljYXJkLT5yc3EubGFzdCA9IGNhcmQtPnJzcS5iYXNlICsgKE5TX1JTUV9OVU1fRU5UUklFUyAtIDEpOworCWZvciAoaiA9IDA7IGogPCBOU19SU1FfTlVNX0VOVFJJRVM7IGorKykKKwkJbnNfcnNxZV9pbml0KGNhcmQtPnJzcS5iYXNlICsgaik7CisJd3JpdGVsKDB4MDAwMDAwMDAsIGNhcmQtPm1lbWJhc2UgKyBSU1FIKTsKKwl3cml0ZWwoQUxJR04oY2FyZC0+cnNxLmRtYSwgTlNfUlNRX0FMSUdOTUVOVCksIGNhcmQtPm1lbWJhc2UgKyBSU1FCKTsKKwlQUklOVEsoIm5pY3N0YXIlZDogUlNRIGJhc2UgYXQgMHglcC5cbiIsIGksIGNhcmQtPnJzcS5iYXNlKTsKIAotICAgLyogSW5pdGlhbGl6ZSBSQ1QuIEFBTCB0eXBlIGlzIHNldCBvbiBvcGVuaW5nIHRoZSBWQy4gKi8KKwkvKiBJbml0aWFsaXplIFNDUTAsIHRoZSBvbmx5IFZCUiBTQ1EgdXNlZCAqLworCWNhcmQtPnNjcTEgPSBOVUxMOworCWNhcmQtPnNjcTIgPSBOVUxMOworCWNhcmQtPnNjcTAgPSBnZXRfc2NxKGNhcmQsIFZCUl9TQ1FTSVpFLCBOU19WUlNDRDApOworCWlmIChjYXJkLT5zY3EwID09IE5VTEwpIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IGdldCBTQ1EwLlxuIiwgaSk7CisJCWVycm9yID0gMTI7CisJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJdTMyZFswXSA9IHNjcV92aXJ0X3RvX2J1cyhjYXJkLT5zY3EwLCBjYXJkLT5zY3EwLT5iYXNlKTsKKwl1MzJkWzFdID0gKHUzMikgMHgwMDAwMDAwMDsKKwl1MzJkWzJdID0gKHUzMikgMHhmZmZmZmZmZjsKKwl1MzJkWzNdID0gKHUzMikgMHgwMDAwMDAwMDsKKwluc193cml0ZV9zcmFtKGNhcmQsIE5TX1ZSU0NEMCwgdTMyZCwgNCk7CisJbnNfd3JpdGVfc3JhbShjYXJkLCBOU19WUlNDRDEsIHUzMmQsIDQpOwkvKiBUaGVzZSBsYXN0IHR3byB3b24ndCBiZSB1c2VkICovCisJbnNfd3JpdGVfc3JhbShjYXJkLCBOU19WUlNDRDIsIHUzMmQsIDQpOwkvKiBidXQgYXJlIGluaXRpYWxpemVkLCBqdXN0IGluIGNhc2UuLi4gKi8KKwljYXJkLT5zY3EwLT5zY2QgPSBOU19WUlNDRDA7CisJUFJJTlRLKCJuaWNzdGFyJWQ6IFZCUi1TQ1EwIGJhc2UgYXQgMHglcC5cbiIsIGksIGNhcmQtPnNjcTAtPmJhc2UpOworCisJLyogSW5pdGlhbGl6ZSBUU1RzICovCisJY2FyZC0+dHN0X2FkZHIgPSBOU19UU1QwOworCWNhcmQtPnRzdF9mcmVlX2VudHJpZXMgPSBOU19UU1RfTlVNX0VOVFJJRVM7CisJZGF0YSA9IE5TX1RTVF9PUENPREVfVkFSSUFCTEU7CisJZm9yIChqID0gMDsgaiA8IE5TX1RTVF9OVU1fRU5UUklFUzsgaisrKQorCQluc193cml0ZV9zcmFtKGNhcmQsIE5TX1RTVDAgKyBqLCAmZGF0YSwgMSk7CisJZGF0YSA9IG5zX3RzdGVfbWFrZShOU19UU1RfT1BDT0RFX0VORCwgTlNfVFNUMCk7CisJbnNfd3JpdGVfc3JhbShjYXJkLCBOU19UU1QwICsgTlNfVFNUX05VTV9FTlRSSUVTLCAmZGF0YSwgMSk7CisJZm9yIChqID0gMDsgaiA8IE5TX1RTVF9OVU1fRU5UUklFUzsgaisrKQorCQluc193cml0ZV9zcmFtKGNhcmQsIE5TX1RTVDEgKyBqLCAmZGF0YSwgMSk7CisJZGF0YSA9IG5zX3RzdGVfbWFrZShOU19UU1RfT1BDT0RFX0VORCwgTlNfVFNUMSk7CisJbnNfd3JpdGVfc3JhbShjYXJkLCBOU19UU1QxICsgTlNfVFNUX05VTV9FTlRSSUVTLCAmZGF0YSwgMSk7CisJZm9yIChqID0gMDsgaiA8IE5TX1RTVF9OVU1fRU5UUklFUzsgaisrKQorCQljYXJkLT50c3RlMnZjW2pdID0gTlVMTDsKKwl3cml0ZWwoTlNfVFNUMCA8PCAyLCBjYXJkLT5tZW1iYXNlICsgVFNUQik7CisKKwkvKiBJbml0aWFsaXplIFJDVC4gQUFMIHR5cGUgaXMgc2V0IG9uIG9wZW5pbmcgdGhlIFZDLiAqLwogI2lmZGVmIFJDUV9TVVBQT1JUCi0gICB1MzJkWzBdID0gTlNfUkNURV9SQVdDRUxMSU5URU47CisJdTMyZFswXSA9IE5TX1JDVEVfUkFXQ0VMTElOVEVOOwogI2Vsc2UKLSAgIHUzMmRbMF0gPSAweDAwMDAwMDAwOworCXUzMmRbMF0gPSAweDAwMDAwMDAwOwogI2VuZGlmIC8qIFJDUV9TVVBQT1JUICovCi0gICB1MzJkWzFdID0gMHgwMDAwMDAwMDsKLSAgIHUzMmRbMl0gPSAweDAwMDAwMDAwOwotICAgdTMyZFszXSA9IDB4RkZGRkZGRkY7Ci0gICBmb3IgKGogPSAwOyBqIDwgY2FyZC0+cmN0X3NpemU7IGorKykKLSAgICAgIG5zX3dyaXRlX3NyYW0oY2FyZCwgaiAqIDQsIHUzMmQsIDQpOyAgICAgIAotICAgICAgCi0gICBtZW1zZXQoY2FyZC0+dmNtYXAsIDAsIE5TX01BWF9SQ1RTSVpFICogc2l6ZW9mKHZjX21hcCkpOwotICAgICAgCi0gICBmb3IgKGogPSAwOyBqIDwgTlNfRlJTQ0RfTlVNOyBqKyspCi0gICAgICBjYXJkLT5zY2QydmNbal0gPSBOVUxMOworCXUzMmRbMV0gPSAweDAwMDAwMDAwOworCXUzMmRbMl0gPSAweDAwMDAwMDAwOworCXUzMmRbM10gPSAweEZGRkZGRkZGOworCWZvciAoaiA9IDA7IGogPCBjYXJkLT5yY3Rfc2l6ZTsgaisrKQorCQluc193cml0ZV9zcmFtKGNhcmQsIGogKiA0LCB1MzJkLCA0KTsKIAotICAgLyogSW5pdGlhbGl6ZSBidWZmZXIgbGV2ZWxzICovCi0gICBjYXJkLT5zYm5yLm1pbiA9IE1JTl9TQjsKLSAgIGNhcmQtPnNibnIuaW5pdCA9IE5VTV9TQjsKLSAgIGNhcmQtPnNibnIubWF4ID0gTUFYX1NCOwotICAgY2FyZC0+bGJuci5taW4gPSBNSU5fTEI7Ci0gICBjYXJkLT5sYm5yLmluaXQgPSBOVU1fTEI7Ci0gICBjYXJkLT5sYm5yLm1heCA9IE1BWF9MQjsKLSAgIGNhcmQtPmlvdm5yLm1pbiA9IE1JTl9JT1ZCOwotICAgY2FyZC0+aW92bnIuaW5pdCA9IE5VTV9JT1ZCOwotICAgY2FyZC0+aW92bnIubWF4ID0gTUFYX0lPVkI7Ci0gICBjYXJkLT5oYm5yLm1pbiA9IE1JTl9IQjsKLSAgIGNhcmQtPmhibnIuaW5pdCA9IE5VTV9IQjsKLSAgIGNhcmQtPmhibnIubWF4ID0gTUFYX0hCOwotICAgCi0gICBjYXJkLT5zbV9oYW5kbGUgPSAweDAwMDAwMDAwOwotICAgY2FyZC0+c21fYWRkciA9IDB4MDAwMDAwMDA7Ci0gICBjYXJkLT5sZ19oYW5kbGUgPSAweDAwMDAwMDAwOwotICAgY2FyZC0+bGdfYWRkciA9IDB4MDAwMDAwMDA7Ci0gICAKLSAgIGNhcmQtPmVmYmllID0gMTsJLyogVG8gcHJldmVudCBwdXNoX3J4YnVmcyBmcm9tIGVuYWJsaW5nIHRoZSBpbnRlcnJ1cHQgKi8KKwltZW1zZXQoY2FyZC0+dmNtYXAsIDAsIE5TX01BWF9SQ1RTSVpFICogc2l6ZW9mKHZjX21hcCkpOwogCi0gICAvKiBQcmUtYWxsb2NhdGUgc29tZSBodWdlIGJ1ZmZlcnMgKi8KLSAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhcmQtPmhicG9vbC5xdWV1ZSk7Ci0gICBjYXJkLT5oYnBvb2wuY291bnQgPSAwOwotICAgZm9yIChqID0gMDsgaiA8IE5VTV9IQjsgaisrKQotICAgewotICAgICAgc3RydWN0IHNrX2J1ZmYgKmhiOwotICAgICAgaGIgPSBfX2Rldl9hbGxvY19za2IoTlNfSEJVRlNJWkUsIEdGUF9LRVJORUwpOwotICAgICAgaWYgKGhiID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgJWR0aCBvZiAlZCBodWdlIGJ1ZmZlcnMuXG4iLAotICAgICAgICAgICAgICAgIGksIGosIE5VTV9IQik7Ci0gICAgICAgICBlcnJvciA9IDEzOwotICAgICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLQkgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgICAgTlNfU0tCX0NCKGhiKS0+YnVmX3R5cGUgPSBCVUZfTk9ORTsKLSAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKLSAgICAgIGNhcmQtPmhicG9vbC5jb3VudCsrOwotICAgfQorCWZvciAoaiA9IDA7IGogPCBOU19GUlNDRF9OVU07IGorKykKKwkJY2FyZC0+c2NkMnZjW2pdID0gTlVMTDsKIAorCS8qIEluaXRpYWxpemUgYnVmZmVyIGxldmVscyAqLworCWNhcmQtPnNibnIubWluID0gTUlOX1NCOworCWNhcmQtPnNibnIuaW5pdCA9IE5VTV9TQjsKKwljYXJkLT5zYm5yLm1heCA9IE1BWF9TQjsKKwljYXJkLT5sYm5yLm1pbiA9IE1JTl9MQjsKKwljYXJkLT5sYm5yLmluaXQgPSBOVU1fTEI7CisJY2FyZC0+bGJuci5tYXggPSBNQVhfTEI7CisJY2FyZC0+aW92bnIubWluID0gTUlOX0lPVkI7CisJY2FyZC0+aW92bnIuaW5pdCA9IE5VTV9JT1ZCOworCWNhcmQtPmlvdm5yLm1heCA9IE1BWF9JT1ZCOworCWNhcmQtPmhibnIubWluID0gTUlOX0hCOworCWNhcmQtPmhibnIuaW5pdCA9IE5VTV9IQjsKKwljYXJkLT5oYm5yLm1heCA9IE1BWF9IQjsKIAotICAgLyogQWxsb2NhdGUgbGFyZ2UgYnVmZmVycyAqLwotICAgc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FyZC0+bGJwb29sLnF1ZXVlKTsKLSAgIGNhcmQtPmxicG9vbC5jb3VudCA9IDA7CQkJLyogTm90IHVzZWQgKi8KLSAgIGZvciAoaiA9IDA7IGogPCBOVU1fTEI7IGorKykKLSAgIHsKLSAgICAgIHN0cnVjdCBza19idWZmICpsYjsKLSAgICAgIGxiID0gX19kZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSwgR0ZQX0tFUk5FTCk7Ci0gICAgICBpZiAobGIgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHByaW50aygibmljc3RhciVkOiBjYW4ndCBhbGxvY2F0ZSAlZHRoIG9mICVkIGxhcmdlIGJ1ZmZlcnMuXG4iLAotICAgICAgICAgICAgICAgIGksIGosIE5VTV9MQik7Ci0gICAgICAgICBlcnJvciA9IDE0OwotICAgICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLQkgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgICAgTlNfU0tCX0NCKGxiKS0+YnVmX3R5cGUgPSBCVUZfTEc7Ci0gICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+bGJwb29sLnF1ZXVlLCBsYik7Ci0gICAgICBza2JfcmVzZXJ2ZShsYiwgTlNfU01CVUZTSVpFKTsKLSAgICAgIHB1c2hfcnhidWZzKGNhcmQsIGxiKTsKLSAgICAgIC8qIER1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgcHVzaF9yeGJ1ZnMoKSB0aGlzIGlzIDEsIG5vdCAwICovCi0gICAgICBpZiAoaiA9PSAxKQotICAgICAgewotICAgICAgICAgY2FyZC0+cmNidWYgPSBsYjsKLSAgICAgICAgIGNhcmQtPnJhd2NoID0gKHUzMikgdmlydF90b19idXMobGItPmRhdGEpOwotICAgICAgfQotICAgfQotICAgLyogVGVzdCBmb3Igc3RyYW5nZSBiZWhhdmlvdXIgd2hpY2ggbGVhZHMgdG8gY3Jhc2hlcyAqLwotICAgaWYgKChiY291bnQgPSBuc19zdGF0X2xmYnFjX2dldChyZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCkpKSA8IGNhcmQtPmxibnIubWluKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IFN0cmFuZ2UuLi4gSnVzdCBhbGxvY2F0ZWQgJWQgbGFyZ2UgYnVmZmVycyBhbmQgbGZicWMgPSAlZC5cbiIsCi0gICAgICAgICAgICAgaSwgaiwgYmNvdW50KTsKLSAgICAgIGVycm9yID0gMTQ7Ci0gICAgICBuc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgfQotICAgICAgCisJY2FyZC0+c21faGFuZGxlID0gMHgwMDAwMDAwMDsKKwljYXJkLT5zbV9hZGRyID0gMHgwMDAwMDAwMDsKKwljYXJkLT5sZ19oYW5kbGUgPSAweDAwMDAwMDAwOworCWNhcmQtPmxnX2FkZHIgPSAweDAwMDAwMDAwOwogCi0gICAvKiBBbGxvY2F0ZSBzbWFsbCBidWZmZXJzICovCi0gICBza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5zYnBvb2wucXVldWUpOwotICAgY2FyZC0+c2Jwb29sLmNvdW50ID0gMDsJCQkvKiBOb3QgdXNlZCAqLwotICAgZm9yIChqID0gMDsgaiA8IE5VTV9TQjsgaisrKQotICAgewotICAgICAgc3RydWN0IHNrX2J1ZmYgKnNiOwotICAgICAgc2IgPSBfX2Rldl9hbGxvY19za2IoTlNfU01TS0JTSVpFLCBHRlBfS0VSTkVMKTsKLSAgICAgIGlmIChzYiA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlICVkdGggb2YgJWQgc21hbGwgYnVmZmVycy5cbiIsCi0gICAgICAgICAgICAgICAgaSwgaiwgTlVNX1NCKTsKLSAgICAgICAgIGVycm9yID0gMTU7Ci0gICAgICAgICBuc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOwotCSByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgICBOU19TS0JfQ0Ioc2IpLT5idWZfdHlwZSA9IEJVRl9TTTsKLSAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5zYnBvb2wucXVldWUsIHNiKTsKLSAgICAgIHNrYl9yZXNlcnZlKHNiLCBOU19BQUwwX0hFQURFUik7Ci0gICAgICBwdXNoX3J4YnVmcyhjYXJkLCBzYik7Ci0gICB9Ci0gICAvKiBUZXN0IGZvciBzdHJhbmdlIGJlaGF2aW91ciB3aGljaCBsZWFkcyB0byBjcmFzaGVzICovCi0gICBpZiAoKGJjb3VudCA9IG5zX3N0YXRfc2ZicWNfZ2V0KHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKSkpIDwgY2FyZC0+c2Juci5taW4pCi0gICB7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogU3RyYW5nZS4uLiBKdXN0IGFsbG9jYXRlZCAlZCBzbWFsbCBidWZmZXJzIGFuZCBzZmJxYyA9ICVkLlxuIiwKLSAgICAgICAgICAgICBpLCBqLCBiY291bnQpOwotICAgICAgZXJyb3IgPSAxNTsKLSAgICAgIG5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICB9Ci0gICAgICAKKwljYXJkLT5lZmJpZSA9IDE7CS8qIFRvIHByZXZlbnQgcHVzaF9yeGJ1ZnMgZnJvbSBlbmFibGluZyB0aGUgaW50ZXJydXB0ICovCiAKLSAgIC8qIEFsbG9jYXRlIGlvdmVjIGJ1ZmZlcnMgKi8KLSAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhcmQtPmlvdnBvb2wucXVldWUpOwotICAgY2FyZC0+aW92cG9vbC5jb3VudCA9IDA7Ci0gICBmb3IgKGogPSAwOyBqIDwgTlVNX0lPVkI7IGorKykKLSAgIHsKLSAgICAgIHN0cnVjdCBza19idWZmICppb3ZiOwotICAgICAgaW92YiA9IGFsbG9jX3NrYihOU19JT1ZCVUZTSVpFLCBHRlBfS0VSTkVMKTsKLSAgICAgIGlmIChpb3ZiID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgJWR0aCBvZiAlZCBpb3ZlYyBidWZmZXJzLlxuIiwKLSAgICAgICAgICAgICAgICBpLCBqLCBOVU1fSU9WQik7Ci0gICAgICAgICBlcnJvciA9IDE2OwotICAgICAgICAgbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKLQkgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgICAgTlNfU0tCX0NCKGlvdmIpLT5idWZfdHlwZSA9IEJVRl9OT05FOwotICAgICAgc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmlvdnBvb2wucXVldWUsIGlvdmIpOwotICAgICAgY2FyZC0+aW92cG9vbC5jb3VudCsrOwotICAgfQorCWlkcl9pbml0KCZjYXJkLT5pZHIpOwogCi0gICAvKiBDb25maWd1cmUgTklDU3RBUiAqLwotICAgaWYgKGNhcmQtPnJjdF9zaXplID09IDQwOTYpCi0gICAgICBuc19jZmdfcmN0c2l6ZSA9IE5TX0NGR19SQ1RTSVpFXzQwOTZfRU5UUklFUzsKLSAgIGVsc2UgLyogKGNhcmQtPnJjdF9zaXplID09IDE2Mzg0KSAqLwotICAgICAgbnNfY2ZnX3JjdHNpemUgPSBOU19DRkdfUkNUU0laRV8xNjM4NF9FTlRSSUVTOworCS8qIFByZS1hbGxvY2F0ZSBzb21lIGh1Z2UgYnVmZmVycyAqLworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhcmQtPmhicG9vbC5xdWV1ZSk7CisJY2FyZC0+aGJwb29sLmNvdW50ID0gMDsKKwlmb3IgKGogPSAwOyBqIDwgTlVNX0hCOyBqKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmhiOworCQloYiA9IF9fZGV2X2FsbG9jX3NrYihOU19IQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChoYiA9PSBOVUxMKSB7CisJCQlwcmludGsKKwkJCSAgICAoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgJWR0aCBvZiAlZCBodWdlIGJ1ZmZlcnMuXG4iLAorCQkJICAgICBpLCBqLCBOVU1fSEIpOworCQkJZXJyb3IgPSAxMzsKKwkJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJTlNfUFJWX0JVRlRZUEUoaGIpID0gQlVGX05PTkU7CisJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKKwkJY2FyZC0+aGJwb29sLmNvdW50Kys7CisJfQogCi0gICBjYXJkLT5lZmJpZSA9IDE7CisJLyogQWxsb2NhdGUgbGFyZ2UgYnVmZmVycyAqLworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhcmQtPmxicG9vbC5xdWV1ZSk7CisJY2FyZC0+bGJwb29sLmNvdW50ID0gMDsJLyogTm90IHVzZWQgKi8KKwlmb3IgKGogPSAwOyBqIDwgTlVNX0xCOyBqKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmxiOworCQlsYiA9IF9fZGV2X2FsbG9jX3NrYihOU19MR1NLQlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAobGIgPT0gTlVMTCkgeworCQkJcHJpbnRrCisJCQkgICAgKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlICVkdGggb2YgJWQgbGFyZ2UgYnVmZmVycy5cbiIsCisJCQkgICAgIGksIGosIE5VTV9MQik7CisJCQllcnJvciA9IDE0OworCQkJbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlOU19QUlZfQlVGVFlQRShsYikgPSBCVUZfTEc7CisJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5sYnBvb2wucXVldWUsIGxiKTsKKwkJc2tiX3Jlc2VydmUobGIsIE5TX1NNQlVGU0laRSk7CisJCXB1c2hfcnhidWZzKGNhcmQsIGxiKTsKKwkJLyogRHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBwdXNoX3J4YnVmcygpIHRoaXMgaXMgMSwgbm90IDAgKi8KKwkJaWYgKGogPT0gMSkgeworCQkJY2FyZC0+cmNidWYgPSBsYjsKKwkJCWNhcmQtPnJhd2NlbGwgPSAoc3RydWN0IG5zX3JjcWUgKikgbGItPmRhdGE7CisJCQljYXJkLT5yYXdjaCA9IE5TX1BSVl9ETUEobGIpOworCQl9CisJfQorCS8qIFRlc3QgZm9yIHN0cmFuZ2UgYmVoYXZpb3VyIHdoaWNoIGxlYWRzIHRvIGNyYXNoZXMgKi8KKwlpZiAoKGJjb3VudCA9CisJICAgICBuc19zdGF0X2xmYnFjX2dldChyZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCkpKSA8IGNhcmQtPmxibnIubWluKSB7CisJCXByaW50aworCQkgICAgKCJuaWNzdGFyJWQ6IFN0cmFuZ2UuLi4gSnVzdCBhbGxvY2F0ZWQgJWQgbGFyZ2UgYnVmZmVycyBhbmQgbGZicWMgPSAlZC5cbiIsCisJCSAgICAgaSwgaiwgYmNvdW50KTsKKwkJZXJyb3IgPSAxNDsKKwkJbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KIAotICAgY2FyZC0+aW50Y250ID0gMDsKLSAgIGlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgJm5zX2lycV9oYW5kbGVyLCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsICJuaWNzdGFyIiwgY2FyZCkgIT0gMCkKLSAgIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiBjYW4ndCBhbGxvY2F0ZSBJUlEgJWQuXG4iLCBpLCBwY2lkZXYtPmlycSk7Ci0gICAgICBlcnJvciA9IDk7Ci0gICAgICBuc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOwotICAgICAgcmV0dXJuIGVycm9yOwotICAgfQorCS8qIEFsbG9jYXRlIHNtYWxsIGJ1ZmZlcnMgKi8KKwlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5zYnBvb2wucXVldWUpOworCWNhcmQtPnNicG9vbC5jb3VudCA9IDA7CS8qIE5vdCB1c2VkICovCisJZm9yIChqID0gMDsgaiA8IE5VTV9TQjsgaisrKSB7CisJCXN0cnVjdCBza19idWZmICpzYjsKKwkJc2IgPSBfX2Rldl9hbGxvY19za2IoTlNfU01TS0JTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHNiID09IE5VTEwpIHsKKwkJCXByaW50aworCQkJICAgICgibmljc3RhciVkOiBjYW4ndCBhbGxvY2F0ZSAlZHRoIG9mICVkIHNtYWxsIGJ1ZmZlcnMuXG4iLAorCQkJICAgICBpLCBqLCBOVU1fU0IpOworCQkJZXJyb3IgPSAxNTsKKwkJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJTlNfUFJWX0JVRlRZUEUoc2IpID0gQlVGX1NNOworCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+c2Jwb29sLnF1ZXVlLCBzYik7CisJCXNrYl9yZXNlcnZlKHNiLCBOU19BQUwwX0hFQURFUik7CisJCXB1c2hfcnhidWZzKGNhcmQsIHNiKTsKKwl9CisJLyogVGVzdCBmb3Igc3RyYW5nZSBiZWhhdmlvdXIgd2hpY2ggbGVhZHMgdG8gY3Jhc2hlcyAqLworCWlmICgoYmNvdW50ID0KKwkgICAgIG5zX3N0YXRfc2ZicWNfZ2V0KHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKSkpIDwgY2FyZC0+c2Juci5taW4pIHsKKwkJcHJpbnRrCisJCSAgICAoIm5pY3N0YXIlZDogU3RyYW5nZS4uLiBKdXN0IGFsbG9jYXRlZCAlZCBzbWFsbCBidWZmZXJzIGFuZCBzZmJxYyA9ICVkLlxuIiwKKwkJICAgICBpLCBqLCBiY291bnQpOworCQllcnJvciA9IDE1OworCQluc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQogCi0gICAvKiBSZWdpc3RlciBkZXZpY2UgKi8KLSAgIGNhcmQtPmF0bWRldiA9IGF0bV9kZXZfcmVnaXN0ZXIoIm5pY3N0YXIiLCAmYXRtX29wcywgLTEsIE5VTEwpOwotICAgaWYgKGNhcmQtPmF0bWRldiA9PSBOVUxMKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IHJlZ2lzdGVyIGRldmljZS5cbiIsIGkpOwotICAgICAgZXJyb3IgPSAxNzsKLSAgICAgIG5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICB9Ci0gICAgICAKLSAgIGlmIChuc19wYXJzZV9tYWMobWFjW2ldLCBjYXJkLT5hdG1kZXYtPmVzaSkpIHsKLSAgICAgIG5pY3N0YXJfcmVhZF9lcHJvbShjYXJkLT5tZW1iYXNlLCBOSUNTVEFSX0VQUk9NX01BQ19BRERSX09GRlNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5hdG1kZXYtPmVzaSwgNik7Ci0gICAgICBpZiAobWVtY21wKGNhcmQtPmF0bWRldi0+ZXNpLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgNikgPT0gMCkgewotICAgICAgICAgbmljc3Rhcl9yZWFkX2Vwcm9tKGNhcmQtPm1lbWJhc2UsIE5JQ1NUQVJfRVBST01fTUFDX0FERFJfT0ZGU0VUX0FMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5hdG1kZXYtPmVzaSwgNik7Ci0gICAgICB9Ci0gICB9CisJLyogQWxsb2NhdGUgaW92ZWMgYnVmZmVycyAqLworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhcmQtPmlvdnBvb2wucXVldWUpOworCWNhcmQtPmlvdnBvb2wuY291bnQgPSAwOworCWZvciAoaiA9IDA7IGogPCBOVU1fSU9WQjsgaisrKSB7CisJCXN0cnVjdCBza19idWZmICppb3ZiOworCQlpb3ZiID0gYWxsb2Nfc2tiKE5TX0lPVkJVRlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoaW92YiA9PSBOVUxMKSB7CisJCQlwcmludGsKKwkJCSAgICAoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgJWR0aCBvZiAlZCBpb3ZlYyBidWZmZXJzLlxuIiwKKwkJCSAgICAgaSwgaiwgTlVNX0lPVkIpOworCQkJZXJyb3IgPSAxNjsKKwkJCW5zX2luaXRfY2FyZF9lcnJvcihjYXJkLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJTlNfUFJWX0JVRlRZUEUoaW92YikgPSBCVUZfTk9ORTsKKwkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmlvdnBvb2wucXVldWUsIGlvdmIpOworCQljYXJkLT5pb3Zwb29sLmNvdW50Kys7CisJfQogCi0gICBwcmludGsoIm5pY3N0YXIlZDogTUFDIGFkZHJlc3MgJXBNXG4iLCBpLCBjYXJkLT5hdG1kZXYtPmVzaSk7CisJLyogQ29uZmlndXJlIE5JQ1N0QVIgKi8KKwlpZiAoY2FyZC0+cmN0X3NpemUgPT0gNDA5NikKKwkJbnNfY2ZnX3JjdHNpemUgPSBOU19DRkdfUkNUU0laRV80MDk2X0VOVFJJRVM7CisJZWxzZQkJCS8qIChjYXJkLT5yY3Rfc2l6ZSA9PSAxNjM4NCkgKi8KKwkJbnNfY2ZnX3JjdHNpemUgPSBOU19DRkdfUkNUU0laRV8xNjM4NF9FTlRSSUVTOwogCi0gICBjYXJkLT5hdG1kZXYtPmRldl9kYXRhID0gY2FyZDsKLSAgIGNhcmQtPmF0bWRldi0+Y2lfcmFuZ2UudnBpX2JpdHMgPSBjYXJkLT52cGliaXRzOwotICAgY2FyZC0+YXRtZGV2LT5jaV9yYW5nZS52Y2lfYml0cyA9IGNhcmQtPnZjaWJpdHM7Ci0gICBjYXJkLT5hdG1kZXYtPmxpbmtfcmF0ZSA9IGNhcmQtPm1heF9wY3I7Ci0gICBjYXJkLT5hdG1kZXYtPnBoeSA9IE5VTEw7CisJY2FyZC0+ZWZiaWUgPSAxOworCisJY2FyZC0+aW50Y250ID0gMDsKKwlpZiAocmVxdWVzdF9pcnEKKwkgICAgKHBjaWRldi0+aXJxLCAmbnNfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELCAibmljc3RhciIsIGNhcmQpICE9IDApIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlIElSUSAlZC5cbiIsIGksIHBjaWRldi0+aXJxKTsKKwkJZXJyb3IgPSA5OworCQluc19pbml0X2NhcmRfZXJyb3IoY2FyZCwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogUmVnaXN0ZXIgZGV2aWNlICovCisJY2FyZC0+YXRtZGV2ID0gYXRtX2Rldl9yZWdpc3Rlcigibmljc3RhciIsICZhdG1fb3BzLCAtMSwgTlVMTCk7CisJaWYgKGNhcmQtPmF0bWRldiA9PSBOVUxMKSB7CisJCXByaW50aygibmljc3RhciVkOiBjYW4ndCByZWdpc3RlciBkZXZpY2UuXG4iLCBpKTsKKwkJZXJyb3IgPSAxNzsKKwkJbnNfaW5pdF9jYXJkX2Vycm9yKGNhcmQsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlmIChuc19wYXJzZV9tYWMobWFjW2ldLCBjYXJkLT5hdG1kZXYtPmVzaSkpIHsKKwkJbmljc3Rhcl9yZWFkX2Vwcm9tKGNhcmQtPm1lbWJhc2UsIE5JQ1NUQVJfRVBST01fTUFDX0FERFJfT0ZGU0VULAorCQkJCSAgIGNhcmQtPmF0bWRldi0+ZXNpLCA2KTsKKwkJaWYgKG1lbWNtcChjYXJkLT5hdG1kZXYtPmVzaSwgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIDYpID09CisJCSAgICAwKSB7CisJCQluaWNzdGFyX3JlYWRfZXByb20oY2FyZC0+bWVtYmFzZSwKKwkJCQkJICAgTklDU1RBUl9FUFJPTV9NQUNfQUREUl9PRkZTRVRfQUxULAorCQkJCQkgICBjYXJkLT5hdG1kZXYtPmVzaSwgNik7CisJCX0KKwl9CisKKwlwcmludGsoIm5pY3N0YXIlZDogTUFDIGFkZHJlc3MgJXBNXG4iLCBpLCBjYXJkLT5hdG1kZXYtPmVzaSk7CisKKwljYXJkLT5hdG1kZXYtPmRldl9kYXRhID0gY2FyZDsKKwljYXJkLT5hdG1kZXYtPmNpX3JhbmdlLnZwaV9iaXRzID0gY2FyZC0+dnBpYml0czsKKwljYXJkLT5hdG1kZXYtPmNpX3JhbmdlLnZjaV9iaXRzID0gY2FyZC0+dmNpYml0czsKKwljYXJkLT5hdG1kZXYtPmxpbmtfcmF0ZSA9IGNhcmQtPm1heF9wY3I7CisJY2FyZC0+YXRtZGV2LT5waHkgPSBOVUxMOwogCiAjaWZkZWYgQ09ORklHX0FUTV9OSUNTVEFSX1VTRV9TVU5JCi0gICBpZiAoY2FyZC0+bWF4X3BjciA9PSBBVE1fT0MzX1BDUikKLSAgICAgIHN1bmlfaW5pdChjYXJkLT5hdG1kZXYpOworCWlmIChjYXJkLT5tYXhfcGNyID09IEFUTV9PQzNfUENSKQorCQlzdW5pX2luaXQoY2FyZC0+YXRtZGV2KTsKICNlbmRpZiAvKiBDT05GSUdfQVRNX05JQ1NUQVJfVVNFX1NVTkkgKi8KIAogI2lmZGVmIENPTkZJR19BVE1fTklDU1RBUl9VU0VfSURUNzcxMDUKLSAgIGlmIChjYXJkLT5tYXhfcGNyID09IEFUTV8yNV9QQ1IpCi0gICAgICBpZHQ3NzEwNV9pbml0KGNhcmQtPmF0bWRldik7CisJaWYgKGNhcmQtPm1heF9wY3IgPT0gQVRNXzI1X1BDUikKKwkJaWR0NzcxMDVfaW5pdChjYXJkLT5hdG1kZXYpOwogI2VuZGlmIC8qIENPTkZJR19BVE1fTklDU1RBUl9VU0VfSURUNzcxMDUgKi8KIAotICAgaWYgKGNhcmQtPmF0bWRldi0+cGh5ICYmIGNhcmQtPmF0bWRldi0+cGh5LT5zdGFydCkKLSAgICAgIGNhcmQtPmF0bWRldi0+cGh5LT5zdGFydChjYXJkLT5hdG1kZXYpOworCWlmIChjYXJkLT5hdG1kZXYtPnBoeSAmJiBjYXJkLT5hdG1kZXYtPnBoeS0+c3RhcnQpCisJCWNhcmQtPmF0bWRldi0+cGh5LT5zdGFydChjYXJkLT5hdG1kZXYpOwogCi0gICB3cml0ZWwoTlNfQ0ZHX1JYUEFUSCB8Ci0gICAgICAgICAgTlNfQ0ZHX1NNQlVGU0laRSB8Ci0gICAgICAgICAgTlNfQ0ZHX0xHQlVGU0laRSB8Ci0gICAgICAgICAgTlNfQ0ZHX0VGQklFIHwKLSAgICAgICAgICBOU19DRkdfUlNRU0laRSB8Ci0gICAgICAgICAgTlNfQ0ZHX1ZQSUJJVFMgfAotICAgICAgICAgIG5zX2NmZ19yY3RzaXplIHwKLSAgICAgICAgICBOU19DRkdfUlhJTlRfTk9ERUxBWSB8Ci0gICAgICAgICAgTlNfQ0ZHX1JBV0lFIHwJCS8qIE9ubHkgZW5hYmxlZCBpZiBSQ1FfU1VQUE9SVCAqLwotICAgICAgICAgIE5TX0NGR19SU1FBRklFIHwKLSAgICAgICAgICBOU19DRkdfVFhFTiB8Ci0gICAgICAgICAgTlNfQ0ZHX1RYSUUgfAotICAgICAgICAgIE5TX0NGR19UU1FGSUVfT1BUIHwJCS8qIE9ubHkgZW5hYmxlZCBpZiBFTkFCTEVfVFNRRklFICovIAotICAgICAgICAgIE5TX0NGR19QSFlJRSwKLSAgICAgICAgICBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKKwl3cml0ZWwoTlNfQ0ZHX1JYUEFUSCB8IE5TX0NGR19TTUJVRlNJWkUgfCBOU19DRkdfTEdCVUZTSVpFIHwgTlNfQ0ZHX0VGQklFIHwgTlNfQ0ZHX1JTUVNJWkUgfCBOU19DRkdfVlBJQklUUyB8IG5zX2NmZ19yY3RzaXplIHwgTlNfQ0ZHX1JYSU5UX05PREVMQVkgfCBOU19DRkdfUkFXSUUgfAkvKiBPbmx5IGVuYWJsZWQgaWYgUkNRX1NVUFBPUlQgKi8KKwkgICAgICAgTlNfQ0ZHX1JTUUFGSUUgfCBOU19DRkdfVFhFTiB8IE5TX0NGR19UWElFIHwgTlNfQ0ZHX1RTUUZJRV9PUFQgfAkvKiBPbmx5IGVuYWJsZWQgaWYgRU5BQkxFX1RTUUZJRSAqLworCSAgICAgICBOU19DRkdfUEhZSUUsIGNhcmQtPm1lbWJhc2UgKyBDRkcpOwogCi0gICBudW1fY2FyZHMrKzsKKwludW1fY2FyZHMrKzsKIAotICAgcmV0dXJuIGVycm9yOworCXJldHVybiBlcnJvcjsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBuc19pbml0X2NhcmRfZXJyb3IobnNfZGV2ICpjYXJkLCBpbnQgZXJyb3IpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbnNfaW5pdF9jYXJkX2Vycm9yKG5zX2RldiAqIGNhcmQsIGludCBlcnJvcikKIHsKLSAgIGlmIChlcnJvciA+PSAxNykKLSAgIHsKLSAgICAgIHdyaXRlbCgweDAwMDAwMDAwLCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKLSAgIH0KLSAgIGlmIChlcnJvciA+PSAxNikKLSAgIHsKLSAgICAgIHN0cnVjdCBza19idWZmICppb3ZiOwotICAgICAgd2hpbGUgKChpb3ZiID0gc2tiX2RlcXVldWUoJmNhcmQtPmlvdnBvb2wucXVldWUpKSAhPSBOVUxMKQotICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoaW92Yik7Ci0gICB9Ci0gICBpZiAoZXJyb3IgPj0gMTUpCi0gICB7Ci0gICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2I7Ci0gICAgICB3aGlsZSAoKHNiID0gc2tiX2RlcXVldWUoJmNhcmQtPnNicG9vbC5xdWV1ZSkpICE9IE5VTEwpCi0gICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShzYik7Ci0gICAgICBmcmVlX3NjcShjYXJkLT5zY3EwLCBOVUxMKTsKLSAgIH0KLSAgIGlmIChlcnJvciA+PSAxNCkKLSAgIHsKLSAgICAgIHN0cnVjdCBza19idWZmICpsYjsKLSAgICAgIHdoaWxlICgobGIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+bGJwb29sLnF1ZXVlKSkgIT0gTlVMTCkKLSAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KGxiKTsKLSAgIH0KLSAgIGlmIChlcnJvciA+PSAxMykKLSAgIHsKLSAgICAgIHN0cnVjdCBza19idWZmICpoYjsKLSAgICAgIHdoaWxlICgoaGIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aGJwb29sLnF1ZXVlKSkgIT0gTlVMTCkKLSAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KGhiKTsKLSAgIH0KLSAgIGlmIChlcnJvciA+PSAxMikKLSAgIHsKLSAgICAgIGtmcmVlKGNhcmQtPnJzcS5vcmcpOwotICAgfQotICAgaWYgKGVycm9yID49IDExKQotICAgewotICAgICAga2ZyZWUoY2FyZC0+dHNxLm9yZyk7Ci0gICB9Ci0gICBpZiAoZXJyb3IgPj0gMTApCi0gICB7Ci0gICAgICBmcmVlX2lycShjYXJkLT5wY2lkZXYtPmlycSwgY2FyZCk7Ci0gICB9Ci0gICBpZiAoZXJyb3IgPj0gNCkKLSAgIHsKLSAgICAgIGlvdW5tYXAoY2FyZC0+bWVtYmFzZSk7Ci0gICB9Ci0gICBpZiAoZXJyb3IgPj0gMykKLSAgIHsKLSAgICAgIHBjaV9kaXNhYmxlX2RldmljZShjYXJkLT5wY2lkZXYpOwotICAgICAga2ZyZWUoY2FyZCk7Ci0gICB9CisJaWYgKGVycm9yID49IDE3KSB7CisJCXdyaXRlbCgweDAwMDAwMDAwLCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKKwl9CisJaWYgKGVycm9yID49IDE2KSB7CisJCXN0cnVjdCBza19idWZmICppb3ZiOworCQl3aGlsZSAoKGlvdmIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aW92cG9vbC5xdWV1ZSkpICE9IE5VTEwpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShpb3ZiKTsKKwl9CisJaWYgKGVycm9yID49IDE1KSB7CisJCXN0cnVjdCBza19idWZmICpzYjsKKwkJd2hpbGUgKChzYiA9IHNrYl9kZXF1ZXVlKCZjYXJkLT5zYnBvb2wucXVldWUpKSAhPSBOVUxMKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2IpOworCQlmcmVlX3NjcShjYXJkLCBjYXJkLT5zY3EwLCBOVUxMKTsKKwl9CisJaWYgKGVycm9yID49IDE0KSB7CisJCXN0cnVjdCBza19idWZmICpsYjsKKwkJd2hpbGUgKChsYiA9IHNrYl9kZXF1ZXVlKCZjYXJkLT5sYnBvb2wucXVldWUpKSAhPSBOVUxMKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkobGIpOworCX0KKwlpZiAoZXJyb3IgPj0gMTMpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmhiOworCQl3aGlsZSAoKGhiID0gc2tiX2RlcXVldWUoJmNhcmQtPmhicG9vbC5xdWV1ZSkpICE9IE5VTEwpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShoYik7CisJfQorCWlmIChlcnJvciA+PSAxMikgeworCQlrZnJlZShjYXJkLT5yc3Eub3JnKTsKKwl9CisJaWYgKGVycm9yID49IDExKSB7CisJCWtmcmVlKGNhcmQtPnRzcS5vcmcpOworCX0KKwlpZiAoZXJyb3IgPj0gMTApIHsKKwkJZnJlZV9pcnEoY2FyZC0+cGNpZGV2LT5pcnEsIGNhcmQpOworCX0KKwlpZiAoZXJyb3IgPj0gNCkgeworCQlpb3VubWFwKGNhcmQtPm1lbWJhc2UpOworCX0KKwlpZiAoZXJyb3IgPj0gMykgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UoY2FyZC0+cGNpZGV2KTsKKwkJa2ZyZWUoY2FyZCk7CisJfQogfQogCi0KLQotc3RhdGljIHNjcV9pbmZvICpnZXRfc2NxKGludCBzaXplLCB1MzIgc2NkKQorc3RhdGljIHNjcV9pbmZvICpnZXRfc2NxKG5zX2RldiAqY2FyZCwgaW50IHNpemUsIHUzMiBzY2QpCiB7Ci0gICBzY3FfaW5mbyAqc2NxOwotICAgaW50IGk7CisJc2NxX2luZm8gKnNjcTsKKwlpbnQgaTsKIAotICAgaWYgKHNpemUgIT0gVkJSX1NDUVNJWkUgJiYgc2l6ZSAhPSBDQlJfU0NRU0laRSkKLSAgICAgIHJldHVybiBOVUxMOworCWlmIChzaXplICE9IFZCUl9TQ1FTSVpFICYmIHNpemUgIT0gQ0JSX1NDUVNJWkUpCisJCXJldHVybiBOVUxMOwogCi0gICBzY3EgPSBrbWFsbG9jKHNpemVvZihzY3FfaW5mbyksIEdGUF9LRVJORUwpOwotICAgaWYgKHNjcSA9PSBOVUxMKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICBzY3EtPm9yZyA9IGttYWxsb2MoMiAqIHNpemUsIEdGUF9LRVJORUwpOwotICAgaWYgKHNjcS0+b3JnID09IE5VTEwpCi0gICB7Ci0gICAgICBrZnJlZShzY3EpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0gICBzY3EtPnNrYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmICopICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplIC8gTlNfU0NRRV9TSVpFKSwgR0ZQX0tFUk5FTCk7Ci0gICBpZiAoc2NxLT5za2IgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGtmcmVlKHNjcS0+b3JnKTsKLSAgICAgIGtmcmVlKHNjcSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLSAgIHNjcS0+bnVtX2VudHJpZXMgPSBzaXplIC8gTlNfU0NRRV9TSVpFOwotICAgc2NxLT5iYXNlID0gKG5zX3NjcWUgKikgQUxJR05fQUREUkVTUyhzY3EtPm9yZywgc2l6ZSk7Ci0gICBzY3EtPm5leHQgPSBzY3EtPmJhc2U7Ci0gICBzY3EtPmxhc3QgPSBzY3EtPmJhc2UgKyAoc2NxLT5udW1fZW50cmllcyAtIDEpOwotICAgc2NxLT50YWlsID0gc2NxLT5sYXN0OwotICAgc2NxLT5zY2QgPSBzY2Q7Ci0gICBzY3EtPm51bV9lbnRyaWVzID0gc2l6ZSAvIE5TX1NDUUVfU0laRTsKLSAgIHNjcS0+dGJkX2NvdW50ID0gMDsKLSAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnNjcS0+c2NxZnVsbF93YWl0cSk7Ci0gICBzY3EtPmZ1bGwgPSAwOwotICAgc3Bpbl9sb2NrX2luaXQoJnNjcS0+bG9jayk7CisJc2NxID0ga21hbGxvYyhzaXplb2Yoc2NxX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjcSkKKwkJcmV0dXJuIE5VTEw7CisgICAgICAgIHNjcS0+b3JnID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpZGV2LCAyICogc2l6ZSwgJnNjcS0+ZG1hKTsKKwlpZiAoIXNjcS0+b3JnKSB7CisJCWtmcmVlKHNjcSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzY3EtPnNrYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmICopICoKKwkJCSAgIChzaXplIC8gTlNfU0NRRV9TSVpFKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzY3EtPnNrYikgeworCQlrZnJlZShzY3EtPm9yZyk7CisJCWtmcmVlKHNjcSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzY3EtPm51bV9lbnRyaWVzID0gc2l6ZSAvIE5TX1NDUUVfU0laRTsKKwlzY3EtPmJhc2UgPSBQVFJfQUxJR04oc2NxLT5vcmcsIHNpemUpOworCXNjcS0+bmV4dCA9IHNjcS0+YmFzZTsKKwlzY3EtPmxhc3QgPSBzY3EtPmJhc2UgKyAoc2NxLT5udW1fZW50cmllcyAtIDEpOworCXNjcS0+dGFpbCA9IHNjcS0+bGFzdDsKKwlzY3EtPnNjZCA9IHNjZDsKKwlzY3EtPm51bV9lbnRyaWVzID0gc2l6ZSAvIE5TX1NDUUVfU0laRTsKKwlzY3EtPnRiZF9jb3VudCA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2NxLT5zY3FmdWxsX3dhaXRxKTsKKwlzY3EtPmZ1bGwgPSAwOworCXNwaW5fbG9ja19pbml0KCZzY3EtPmxvY2spOwogCi0gICBmb3IgKGkgPSAwOyBpIDwgc2NxLT5udW1fZW50cmllczsgaSsrKQotICAgICAgc2NxLT5za2JbaV0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBzY3EtPm51bV9lbnRyaWVzOyBpKyspCisJCXNjcS0+c2tiW2ldID0gTlVMTDsKIAotICAgcmV0dXJuIHNjcTsKKwlyZXR1cm4gc2NxOwogfQogCi0KLQogLyogRm9yIHZhcmlhYmxlIHJhdGUgU0NRIHZjYyBtdXN0IGJlIE5VTEwgKi8KLXN0YXRpYyB2b2lkIGZyZWVfc2NxKHNjcV9pbmZvICpzY3EsIHN0cnVjdCBhdG1fdmNjICp2Y2MpCitzdGF0aWMgdm9pZCBmcmVlX3NjcShuc19kZXYgKmNhcmQsIHNjcV9pbmZvICpzY3EsIHN0cnVjdCBhdG1fdmNjICp2Y2MpCiB7Ci0gICBpbnQgaTsKKwlpbnQgaTsKIAotICAgaWYgKHNjcS0+bnVtX2VudHJpZXMgPT0gVkJSX1NDUV9OVU1fRU5UUklFUykKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzY3EtPm51bV9lbnRyaWVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBpZiAoc2NxLT5za2JbaV0gIT0gTlVMTCkKLQkgewotICAgICAgICAgICAgdmNjID0gQVRNX1NLQihzY3EtPnNrYltpXSktPnZjYzsKLSAgICAgICAgICAgIGlmICh2Y2MtPnBvcCAhPSBOVUxMKQotCSAgICAgICB2Y2MtPnBvcCh2Y2MsIHNjcS0+c2tiW2ldKTsKLQkgICAgZWxzZQotICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2NxLT5za2JbaV0pOwotICAgICAgICAgfQotICAgICAgfQotICAgZWxzZSAvKiB2Y2MgbXVzdCBiZSAhPSBOVUxMICovCi0gICB7Ci0gICAgICBpZiAodmNjID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXI6IGZyZWVfc2NxKCkgY2FsbGVkIHdpdGggdmNjID09IE5VTEwgZm9yIGZpeGVkIHJhdGUgc2NxLiIpOwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjcS0+bnVtX2VudHJpZXM7IGkrKykKLSAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNjcS0+c2tiW2ldKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzY3EtPm51bV9lbnRyaWVzOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2NxLT5za2JbaV0gIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmICh2Y2MtPnBvcCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgdmNjLT5wb3AodmNjLCBzY3EtPnNrYltpXSk7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShzY3EtPnNrYltpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICB9Ci0gICBrZnJlZShzY3EtPnNrYik7Ci0gICBrZnJlZShzY3EtPm9yZyk7Ci0gICBrZnJlZShzY3EpOworCWlmIChzY3EtPm51bV9lbnRyaWVzID09IFZCUl9TQ1FfTlVNX0VOVFJJRVMpCisJCWZvciAoaSA9IDA7IGkgPCBzY3EtPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJCWlmIChzY3EtPnNrYltpXSAhPSBOVUxMKSB7CisJCQkJdmNjID0gQVRNX1NLQihzY3EtPnNrYltpXSktPnZjYzsKKwkJCQlpZiAodmNjLT5wb3AgIT0gTlVMTCkKKwkJCQkJdmNjLT5wb3AodmNjLCBzY3EtPnNrYltpXSk7CisJCQkJZWxzZQorCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShzY3EtPnNrYltpXSk7CisJCQl9CisJfSBlbHNlIHsJCS8qIHZjYyBtdXN0IGJlICE9IE5VTEwgKi8KKworCQlpZiAodmNjID09IE5VTEwpIHsKKwkJCXByaW50aworCQkJICAgICgibmljc3RhcjogZnJlZV9zY3EoKSBjYWxsZWQgd2l0aCB2Y2MgPT0gTlVMTCBmb3IgZml4ZWQgcmF0ZSBzY3EuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NxLT5udW1fZW50cmllczsgaSsrKQorCQkJCWRldl9rZnJlZV9za2JfYW55KHNjcS0+c2tiW2ldKTsKKwkJfSBlbHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgc2NxLT5udW1fZW50cmllczsgaSsrKSB7CisJCQkJaWYgKHNjcS0+c2tiW2ldICE9IE5VTEwpIHsKKwkJCQkJaWYgKHZjYy0+cG9wICE9IE5VTEwpCisJCQkJCQl2Y2MtPnBvcCh2Y2MsIHNjcS0+c2tiW2ldKTsKKwkJCQkJZWxzZQorCQkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2NxLT5za2JbaV0pOworCQkJCX0KKwkJCX0KKwl9CisJa2ZyZWUoc2NxLT5za2IpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpZGV2LAorCQkJICAgIDIgKiAoc2NxLT5udW1fZW50cmllcyA9PSBWQlJfU0NRX05VTV9FTlRSSUVTID8KKwkJCQkgVkJSX1NDUVNJWkUgOiBDQlJfU0NRU0laRSksCisJCQkgICAgc2NxLT5vcmcsIHNjcS0+ZG1hKTsKKwlrZnJlZShzY3EpOwogfQogCi0KLQogLyogVGhlIGhhbmRsZXMgcGFzc2VkIG11c3QgYmUgcG9pbnRlcnMgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUgc21hbGwKICAgIG9yIGxhcmdlIGJ1ZmZlcihzKSBjYXN0IHRvIHUzMi4gKi8KLXN0YXRpYyB2b2lkIHB1c2hfcnhidWZzKG5zX2RldiAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIHB1c2hfcnhidWZzKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0gICBzdHJ1Y3QgbnNfc2tiX2NiICpjYiA9IE5TX1NLQl9DQihza2IpOwotICAgdTMyIGhhbmRsZTEsIGFkZHIxOwotICAgdTMyIGhhbmRsZTIsIGFkZHIyOwotICAgdTMyIHN0YXQ7Ci0gICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgCi0gICAvKiAqQkFSRiogKi8KLSAgIGhhbmRsZTIgPSBhZGRyMiA9IDA7Ci0gICBoYW5kbGUxID0gKHUzMilza2I7Ci0gICBhZGRyMSA9ICh1MzIpdmlydF90b19idXMoc2tiLT5kYXRhKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaGFuZGxlMSwgKmhhbmRsZTI7CisJdTMyIGlkMSA9IDAsIGlkMiA9IDA7CisJdTMyIGFkZHIxLCBhZGRyMjsKKwl1MzIgc3RhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwkvKiAqQkFSRiogKi8KKwloYW5kbGUyID0gTlVMTDsKKwlhZGRyMiA9IDA7CisJaGFuZGxlMSA9IHNrYjsKKwlhZGRyMSA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBjaWRldiwKKwkJCSAgICAgICBza2ItPmRhdGEsCisJCQkgICAgICAgKE5TX1BSVl9CVUZUWVBFKHNrYikgPT0gQlVGX1NNCisJCQkJPyBOU19TTVNLQlNJWkUgOiBOU19MR1NLQlNJWkUpLAorCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCU5TX1BSVl9ETUEoc2tiKSA9IGFkZHIxOyAvKiBzYXZlIHNvIHdlIGNhbiB1bm1hcCBsYXRlciAqLwogCiAjaWZkZWYgR0VORVJBTF9ERUJVRwotICAgaWYgKCFhZGRyMSkKLSAgICAgIHByaW50aygibmljc3RhciVkOiBwdXNoX3J4YnVmcyBjYWxsZWQgd2l0aCBhZGRyMSA9IDAuXG4iLCBjYXJkLT5pbmRleCk7CisJaWYgKCFhZGRyMSkKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IHB1c2hfcnhidWZzIGNhbGxlZCB3aXRoIGFkZHIxID0gMC5cbiIsCisJCSAgICAgICBjYXJkLT5pbmRleCk7CiAjZW5kaWYgLyogR0VORVJBTF9ERUJVRyAqLwogCi0gICBzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgY2FyZC0+c2JmcWMgPSBuc19zdGF0X3NmYnFjX2dldChzdGF0KTsKLSAgIGNhcmQtPmxiZnFjID0gbnNfc3RhdF9sZmJxY19nZXQoc3RhdCk7Ci0gICBpZiAoY2ItPmJ1Zl90eXBlID09IEJVRl9TTSkKLSAgIHsKLSAgICAgIGlmICghYWRkcjIpCi0gICAgICB7Ci0gICAgICAgICBpZiAoY2FyZC0+c21fYWRkcikKLQkgewotCSAgICBhZGRyMiA9IGNhcmQtPnNtX2FkZHI7Ci0JICAgIGhhbmRsZTIgPSBjYXJkLT5zbV9oYW5kbGU7Ci0JICAgIGNhcmQtPnNtX2FkZHIgPSAweDAwMDAwMDAwOwotCSAgICBjYXJkLT5zbV9oYW5kbGUgPSAweDAwMDAwMDAwOwotCSB9Ci0JIGVsc2UgLyogKCFzbV9hZGRyKSAqLwotCSB7Ci0JICAgIGNhcmQtPnNtX2FkZHIgPSBhZGRyMTsKLQkgICAgY2FyZC0+c21faGFuZGxlID0gaGFuZGxlMTsKLQkgfQotICAgICAgfSAgICAgIAotICAgfQotICAgZWxzZSAvKiBidWZfdHlwZSA9PSBCVUZfTEcgKi8KLSAgIHsKLSAgICAgIGlmICghYWRkcjIpCi0gICAgICB7Ci0gICAgICAgICBpZiAoY2FyZC0+bGdfYWRkcikKLQkgewotCSAgICBhZGRyMiA9IGNhcmQtPmxnX2FkZHI7Ci0JICAgIGhhbmRsZTIgPSBjYXJkLT5sZ19oYW5kbGU7Ci0JICAgIGNhcmQtPmxnX2FkZHIgPSAweDAwMDAwMDAwOwotCSAgICBjYXJkLT5sZ19oYW5kbGUgPSAweDAwMDAwMDAwOwotCSB9Ci0JIGVsc2UgLyogKCFsZ19hZGRyKSAqLwotCSB7Ci0JICAgIGNhcmQtPmxnX2FkZHIgPSBhZGRyMTsKLQkgICAgY2FyZC0+bGdfaGFuZGxlID0gaGFuZGxlMTsKLQkgfQotICAgICAgfSAgICAgIAotICAgfQorCXN0YXQgPSByZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJY2FyZC0+c2JmcWMgPSBuc19zdGF0X3NmYnFjX2dldChzdGF0KTsKKwljYXJkLT5sYmZxYyA9IG5zX3N0YXRfbGZicWNfZ2V0KHN0YXQpOworCWlmIChOU19QUlZfQlVGVFlQRShza2IpID09IEJVRl9TTSkgeworCQlpZiAoIWFkZHIyKSB7CisJCQlpZiAoY2FyZC0+c21fYWRkcikgeworCQkJCWFkZHIyID0gY2FyZC0+c21fYWRkcjsKKwkJCQloYW5kbGUyID0gY2FyZC0+c21faGFuZGxlOworCQkJCWNhcmQtPnNtX2FkZHIgPSAweDAwMDAwMDAwOworCQkJCWNhcmQtPnNtX2hhbmRsZSA9IDB4MDAwMDAwMDA7CisJCQl9IGVsc2UgewkvKiAoIXNtX2FkZHIpICovCiAKLSAgIGlmIChhZGRyMikKLSAgIHsKLSAgICAgIGlmIChjYi0+YnVmX3R5cGUgPT0gQlVGX1NNKQotICAgICAgewotICAgICAgICAgaWYgKGNhcmQtPnNiZnFjID49IGNhcmQtPnNibnIubWF4KQotICAgICAgICAgewotICAgICAgICAgICAgc2tiX3VubGluaygoc3RydWN0IHNrX2J1ZmYgKikgaGFuZGxlMSwgJmNhcmQtPnNicG9vbC5xdWV1ZSk7Ci0gICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueSgoc3RydWN0IHNrX2J1ZmYgKikgaGFuZGxlMSk7Ci0gICAgICAgICAgICBza2JfdW5saW5rKChzdHJ1Y3Qgc2tfYnVmZiAqKSBoYW5kbGUyLCAmY2FyZC0+c2Jwb29sLnF1ZXVlKTsKLSAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KChzdHJ1Y3Qgc2tfYnVmZiAqKSBoYW5kbGUyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLQkgZWxzZQotICAgICAgICAgICAgY2FyZC0+c2JmcWMgKz0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgLyogKGJ1Zl90eXBlID09IEJVRl9MRykgKi8KLSAgICAgIHsKLSAgICAgICAgIGlmIChjYXJkLT5sYmZxYyA+PSBjYXJkLT5sYm5yLm1heCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHNrYl91bmxpbmsoKHN0cnVjdCBza19idWZmICopIGhhbmRsZTEsICZjYXJkLT5sYnBvb2wucXVldWUpOwotICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoKHN0cnVjdCBza19idWZmICopIGhhbmRsZTEpOwotICAgICAgICAgICAgc2tiX3VubGluaygoc3RydWN0IHNrX2J1ZmYgKikgaGFuZGxlMiwgJmNhcmQtPmxicG9vbC5xdWV1ZSk7Ci0gICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueSgoc3RydWN0IHNrX2J1ZmYgKikgaGFuZGxlMik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYXJkLT5sYmZxYyArPSAyOwotICAgICAgfQorCQkJCWNhcmQtPnNtX2FkZHIgPSBhZGRyMTsKKwkJCQljYXJkLT5zbV9oYW5kbGUgPSBoYW5kbGUxOworCQkJfQorCQl9CisJfSBlbHNlIHsJCS8qIGJ1Zl90eXBlID09IEJVRl9MRyAqLwogCi0gICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFhZGRyMikgeworCQkJaWYgKGNhcmQtPmxnX2FkZHIpIHsKKwkJCQlhZGRyMiA9IGNhcmQtPmxnX2FkZHI7CisJCQkJaGFuZGxlMiA9IGNhcmQtPmxnX2hhbmRsZTsKKwkJCQljYXJkLT5sZ19hZGRyID0gMHgwMDAwMDAwMDsKKwkJCQljYXJkLT5sZ19oYW5kbGUgPSAweDAwMDAwMDAwOworCQkJfSBlbHNlIHsJLyogKCFsZ19hZGRyKSAqLwogCi0gICAgICB3aGlsZSAoQ01EX0JVU1koY2FyZCkpOwotICAgICAgd3JpdGVsKGFkZHIyLCBjYXJkLT5tZW1iYXNlICsgRFIzKTsKLSAgICAgIHdyaXRlbChoYW5kbGUyLCBjYXJkLT5tZW1iYXNlICsgRFIyKTsKLSAgICAgIHdyaXRlbChhZGRyMSwgY2FyZC0+bWVtYmFzZSArIERSMSk7Ci0gICAgICB3cml0ZWwoaGFuZGxlMSwgY2FyZC0+bWVtYmFzZSArIERSMCk7Ci0gICAgICB3cml0ZWwoTlNfQ01EX1dSSVRFX0ZSRUVCVUZRIHwgY2ItPmJ1Zl90eXBlLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKLSAKLSAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7CisJCQkJY2FyZC0+bGdfYWRkciA9IGFkZHIxOworCQkJCWNhcmQtPmxnX2hhbmRsZSA9IGhhbmRsZTE7CisJCQl9CisJCX0KKwl9CiAKLSAgICAgIFhQUklOVEsoIm5pY3N0YXIlZDogUHVzaGluZyAlcyBidWZmZXJzIGF0IDB4JXggYW5kIDB4JXguXG4iLCBjYXJkLT5pbmRleCwKLSAgICAgICAgICAgICAgKGNiLT5idWZfdHlwZSA9PSBCVUZfU00gPyAic21hbGwiIDogImxhcmdlIiksIGFkZHIxLCBhZGRyMik7Ci0gICB9CisJaWYgKGFkZHIyKSB7CisJCWlmIChOU19QUlZfQlVGVFlQRShza2IpID09IEJVRl9TTSkgeworCQkJaWYgKGNhcmQtPnNiZnFjID49IGNhcmQtPnNibnIubWF4KSB7CisJCQkJc2tiX3VubGluayhoYW5kbGUxLCAmY2FyZC0+c2Jwb29sLnF1ZXVlKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShoYW5kbGUxKTsKKwkJCQlza2JfdW5saW5rKGhhbmRsZTIsICZjYXJkLT5zYnBvb2wucXVldWUpOworCQkJCWRldl9rZnJlZV9za2JfYW55KGhhbmRsZTIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZQorCQkJCWNhcmQtPnNiZnFjICs9IDI7CisJCX0gZWxzZSB7CS8qIChidWZfdHlwZSA9PSBCVUZfTEcpICovCiAKLSAgIGlmICghY2FyZC0+ZWZiaWUgJiYgY2FyZC0+c2JmcWMgPj0gY2FyZC0+c2Juci5taW4gJiYKLSAgICAgICBjYXJkLT5sYmZxYyA+PSBjYXJkLT5sYm5yLm1pbikKLSAgIHsKLSAgICAgIGNhcmQtPmVmYmllID0gMTsKLSAgICAgIHdyaXRlbCgocmVhZGwoY2FyZC0+bWVtYmFzZSArIENGRykgfCBOU19DRkdfRUZCSUUpLCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKLSAgIH0KKwkJCWlmIChjYXJkLT5sYmZxYyA+PSBjYXJkLT5sYm5yLm1heCkgeworCQkJCXNrYl91bmxpbmsoaGFuZGxlMSwgJmNhcmQtPmxicG9vbC5xdWV1ZSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoaGFuZGxlMSk7CisJCQkJc2tiX3VubGluayhoYW5kbGUyLCAmY2FyZC0+bGJwb29sLnF1ZXVlKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShoYW5kbGUyKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UKKwkJCQljYXJkLT5sYmZxYyArPSAyOworCQl9CiAKLSAgIHJldHVybjsKKwkJZG8geworCQkJaWYgKCFpZHJfcHJlX2dldCgmY2FyZC0+aWRyLCBHRlBfQVRPTUlDKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAibmljc3RhciVkOiBubyBmcmVlIG1lbW9yeSBmb3IgaWRyXG4iLAorCQkJCSAgICAgICBjYXJkLT5pbmRleCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWlmICghaWQxKQorCQkJCWVyciA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZjYXJkLT5pZHIsIGhhbmRsZTEsIDAsICZpZDEpOworCisJCQlpZiAoIWlkMiAmJiBlcnIgPT0gMCkKKwkJCQllcnIgPSBpZHJfZ2V0X25ld19hYm92ZSgmY2FyZC0+aWRyLCBoYW5kbGUyLCAwLCAmaWQyKTsKKworCQl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTik7CisKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOworCQl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwkJd3JpdGVsKGFkZHIyLCBjYXJkLT5tZW1iYXNlICsgRFIzKTsKKwkJd3JpdGVsKGlkMiwgY2FyZC0+bWVtYmFzZSArIERSMik7CisJCXdyaXRlbChhZGRyMSwgY2FyZC0+bWVtYmFzZSArIERSMSk7CisJCXdyaXRlbChpZDEsIGNhcmQtPm1lbWJhc2UgKyBEUjApOworCQl3cml0ZWwoTlNfQ01EX1dSSVRFX0ZSRUVCVUZRIHwgTlNfUFJWX0JVRlRZUEUoc2tiKSwKKwkJICAgICAgIGNhcmQtPm1lbWJhc2UgKyBDTUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOworCisJCVhQUklOVEsoIm5pY3N0YXIlZDogUHVzaGluZyAlcyBidWZmZXJzIGF0IDB4JXggYW5kIDB4JXguXG4iLAorCQkJY2FyZC0+aW5kZXgsCisJCQkoTlNfUFJWX0JVRlRZUEUoc2tiKSA9PSBCVUZfU00gPyAic21hbGwiIDogImxhcmdlIiksCisJCQlhZGRyMSwgYWRkcjIpOworCX0KKworCWlmICghY2FyZC0+ZWZiaWUgJiYgY2FyZC0+c2JmcWMgPj0gY2FyZC0+c2Juci5taW4gJiYKKwkgICAgY2FyZC0+bGJmcWMgPj0gY2FyZC0+bGJuci5taW4pIHsKKwkJY2FyZC0+ZWZiaWUgPSAxOworCQl3cml0ZWwoKHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBDRkcpIHwgTlNfQ0ZHX0VGQklFKSwKKwkJICAgICAgIGNhcmQtPm1lbWJhc2UgKyBDRkcpOworCX0KKworb3V0OgorCXJldHVybjsKIH0KIAotCi0KIHN0YXRpYyBpcnFyZXR1cm5fdCBuc19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0gICB1MzIgc3RhdF9yOwotICAgbnNfZGV2ICpjYXJkOwotICAgc3RydWN0IGF0bV9kZXYgKmRldjsKLSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHN0YXRfcjsKKwluc19kZXYgKmNhcmQ7CisJc3RydWN0IGF0bV9kZXYgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICBjYXJkID0gKG5zX2RldiAqKSBkZXZfaWQ7Ci0gICBkZXYgPSBjYXJkLT5hdG1kZXY7Ci0gICBjYXJkLT5pbnRjbnQrKzsKKwljYXJkID0gKG5zX2RldiAqKSBkZXZfaWQ7CisJZGV2ID0gY2FyZC0+YXRtZGV2OworCWNhcmQtPmludGNudCsrOwogCi0gICBQUklOVEsoIm5pY3N0YXIlZDogTklDU3RBUiBnZW5lcmF0ZWQgYW4gaW50ZXJydXB0XG4iLCBjYXJkLT5pbmRleCk7CisJUFJJTlRLKCJuaWNzdGFyJWQ6IE5JQ1N0QVIgZ2VuZXJhdGVkIGFuIGludGVycnVwdFxuIiwgY2FyZC0+aW5kZXgpOwogCi0gICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgIAotICAgc3RhdF9yID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOwogCi0gICAvKiBUcmFuc21pdCBTdGF0dXMgSW5kaWNhdG9yIGhhcyBiZWVuIHdyaXR0ZW4gdG8gVC4gUy4gUXVldWUgKi8KLSAgIGlmIChzdGF0X3IgJiBOU19TVEFUX1RTSUYpCi0gICB7Ci0gICAgICBUWFBSSU5USygibmljc3RhciVkOiBUU0kgaW50ZXJydXB0XG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICBwcm9jZXNzX3RzcShjYXJkKTsKLSAgICAgIHdyaXRlbChOU19TVEFUX1RTSUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKLSAgIH0KLSAgIAotICAgLyogSW5jb21wbGV0ZSBDUy1QRFUgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgKi8KLSAgIGlmIChzdGF0X3IgJiBOU19TVEFUX1RYSUNQKQotICAgewotICAgICAgd3JpdGVsKE5TX1NUQVRfVFhJQ1AsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKLSAgICAgIFRYUFJJTlRLKCJuaWNzdGFyJWQ6IEluY29tcGxldGUgQ1MtUERVIHRyYW5zbWl0dGVkLlxuIiwKLSAgICAgICAgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgIH0KLSAgIAotICAgLyogVHJhbnNtaXQgU3RhdHVzIFF1ZXVlIDcvOCBmdWxsICovCi0gICBpZiAoc3RhdF9yICYgTlNfU1RBVF9UU1FGKQotICAgewotICAgICAgd3JpdGVsKE5TX1NUQVRfVFNRRiwgY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgICAgUFJJTlRLKCJuaWNzdGFyJWQ6IFRTUSBmdWxsLlxuIiwgY2FyZC0+aW5kZXgpOwotICAgICAgcHJvY2Vzc190c3EoY2FyZCk7Ci0gICB9Ci0gICAKLSAgIC8qIFRpbWVyIG92ZXJmbG93ICovCi0gICBpZiAoc3RhdF9yICYgTlNfU1RBVF9UTVJPRikKLSAgIHsKLSAgICAgIHdyaXRlbChOU19TVEFUX1RNUk9GLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBQUklOVEsoIm5pY3N0YXIlZDogVGltZXIgb3ZlcmZsb3cuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICB9Ci0gICAKLSAgIC8qIFBIWSBkZXZpY2UgaW50ZXJydXB0IHNpZ25hbCBhY3RpdmUgKi8KLSAgIGlmIChzdGF0X3IgJiBOU19TVEFUX1BIWUkpCi0gICB7Ci0gICAgICB3cml0ZWwoTlNfU1RBVF9QSFlJLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBQUklOVEsoIm5pY3N0YXIlZDogUEhZIGludGVycnVwdC5cbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgIGlmIChkZXYtPnBoeSAmJiBkZXYtPnBoeS0+aW50ZXJydXB0KSB7Ci0gICAgICAgICBkZXYtPnBoeS0+aW50ZXJydXB0KGRldik7Ci0gICAgICB9Ci0gICB9CisJc3RhdF9yID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOwogCi0gICAvKiBTbWFsbCBCdWZmZXIgUXVldWUgaXMgZnVsbCAqLwotICAgaWYgKHN0YXRfciAmIE5TX1NUQVRfU0ZCUUYpCi0gICB7Ci0gICAgICB3cml0ZWwoTlNfU1RBVF9TRkJRRiwgY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IFNtYWxsIGZyZWUgYnVmZmVyIHF1ZXVlIGlzIGZ1bGwuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICB9Ci0gICAKLSAgIC8qIExhcmdlIEJ1ZmZlciBRdWV1ZSBpcyBmdWxsICovCi0gICBpZiAoc3RhdF9yICYgTlNfU1RBVF9MRkJRRikKLSAgIHsKLSAgICAgIHdyaXRlbChOU19TVEFUX0xGQlFGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogTGFyZ2UgZnJlZSBidWZmZXIgcXVldWUgaXMgZnVsbC5cbiIsIGNhcmQtPmluZGV4KTsKLSAgIH0KKwkvKiBUcmFuc21pdCBTdGF0dXMgSW5kaWNhdG9yIGhhcyBiZWVuIHdyaXR0ZW4gdG8gVC4gUy4gUXVldWUgKi8KKwlpZiAoc3RhdF9yICYgTlNfU1RBVF9UU0lGKSB7CisJCVRYUFJJTlRLKCJuaWNzdGFyJWQ6IFRTSSBpbnRlcnJ1cHRcbiIsIGNhcmQtPmluZGV4KTsKKwkJcHJvY2Vzc190c3EoY2FyZCk7CisJCXdyaXRlbChOU19TVEFUX1RTSUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwl9CiAKLSAgIC8qIFJlY2VpdmUgU3RhdHVzIFF1ZXVlIGlzIGZ1bGwgKi8KLSAgIGlmIChzdGF0X3IgJiBOU19TVEFUX1JTUUYpCi0gICB7Ci0gICAgICB3cml0ZWwoTlNfU1RBVF9SU1FGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogUlNRIGZ1bGwuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICBwcm9jZXNzX3JzcShjYXJkKTsKLSAgIH0KKwkvKiBJbmNvbXBsZXRlIENTLVBEVSBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLworCWlmIChzdGF0X3IgJiBOU19TVEFUX1RYSUNQKSB7CisJCXdyaXRlbChOU19TVEFUX1RYSUNQLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJCVRYUFJJTlRLKCJuaWNzdGFyJWQ6IEluY29tcGxldGUgQ1MtUERVIHRyYW5zbWl0dGVkLlxuIiwKKwkJCSBjYXJkLT5pbmRleCk7CisJfQogCi0gICAvKiBDb21wbGV0ZSBDUy1QRFUgcmVjZWl2ZWQgKi8KLSAgIGlmIChzdGF0X3IgJiBOU19TVEFUX0VPUERVKQotICAgewotICAgICAgUlhQUklOVEsoIm5pY3N0YXIlZDogRW5kIG9mIENTLVBEVSByZWNlaXZlZC5cbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgIHByb2Nlc3NfcnNxKGNhcmQpOwotICAgICAgd3JpdGVsKE5TX1NUQVRfRU9QRFUsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKLSAgIH0KKwkvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgNy84IGZ1bGwgKi8KKwlpZiAoc3RhdF9yICYgTlNfU1RBVF9UU1FGKSB7CisJCXdyaXRlbChOU19TVEFUX1RTUUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwkJUFJJTlRLKCJuaWNzdGFyJWQ6IFRTUSBmdWxsLlxuIiwgY2FyZC0+aW5kZXgpOworCQlwcm9jZXNzX3RzcShjYXJkKTsKKwl9CiAKLSAgIC8qIFJhdyBjZWxsIHJlY2VpdmVkICovCi0gICBpZiAoc3RhdF9yICYgTlNfU1RBVF9SQVdDRikKLSAgIHsKLSAgICAgIHdyaXRlbChOU19TVEFUX1JBV0NGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJLyogVGltZXIgb3ZlcmZsb3cgKi8KKwlpZiAoc3RhdF9yICYgTlNfU1RBVF9UTVJPRikgeworCQl3cml0ZWwoTlNfU1RBVF9UTVJPRiwgY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCQlQUklOVEsoIm5pY3N0YXIlZDogVGltZXIgb3ZlcmZsb3cuXG4iLCBjYXJkLT5pbmRleCk7CisJfQorCisJLyogUEhZIGRldmljZSBpbnRlcnJ1cHQgc2lnbmFsIGFjdGl2ZSAqLworCWlmIChzdGF0X3IgJiBOU19TVEFUX1BIWUkpIHsKKwkJd3JpdGVsKE5TX1NUQVRfUEhZSSwgY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCQlQUklOVEsoIm5pY3N0YXIlZDogUEhZIGludGVycnVwdC5cbiIsIGNhcmQtPmluZGV4KTsKKwkJaWYgKGRldi0+cGh5ICYmIGRldi0+cGh5LT5pbnRlcnJ1cHQpIHsKKwkJCWRldi0+cGh5LT5pbnRlcnJ1cHQoZGV2KTsKKwkJfQorCX0KKworCS8qIFNtYWxsIEJ1ZmZlciBRdWV1ZSBpcyBmdWxsICovCisJaWYgKHN0YXRfciAmIE5TX1NUQVRfU0ZCUUYpIHsKKwkJd3JpdGVsKE5TX1NUQVRfU0ZCUUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IFNtYWxsIGZyZWUgYnVmZmVyIHF1ZXVlIGlzIGZ1bGwuXG4iLAorCQkgICAgICAgY2FyZC0+aW5kZXgpOworCX0KKworCS8qIExhcmdlIEJ1ZmZlciBRdWV1ZSBpcyBmdWxsICovCisJaWYgKHN0YXRfciAmIE5TX1NUQVRfTEZCUUYpIHsKKwkJd3JpdGVsKE5TX1NUQVRfTEZCUUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IExhcmdlIGZyZWUgYnVmZmVyIHF1ZXVlIGlzIGZ1bGwuXG4iLAorCQkgICAgICAgY2FyZC0+aW5kZXgpOworCX0KKworCS8qIFJlY2VpdmUgU3RhdHVzIFF1ZXVlIGlzIGZ1bGwgKi8KKwlpZiAoc3RhdF9yICYgTlNfU1RBVF9SU1FGKSB7CisJCXdyaXRlbChOU19TVEFUX1JTUUYsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IFJTUSBmdWxsLlxuIiwgY2FyZC0+aW5kZXgpOworCQlwcm9jZXNzX3JzcShjYXJkKTsKKwl9CisKKwkvKiBDb21wbGV0ZSBDUy1QRFUgcmVjZWl2ZWQgKi8KKwlpZiAoc3RhdF9yICYgTlNfU1RBVF9FT1BEVSkgeworCQlSWFBSSU5USygibmljc3RhciVkOiBFbmQgb2YgQ1MtUERVIHJlY2VpdmVkLlxuIiwgY2FyZC0+aW5kZXgpOworCQlwcm9jZXNzX3JzcShjYXJkKTsKKwkJd3JpdGVsKE5TX1NUQVRfRU9QRFUsIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwl9CisKKwkvKiBSYXcgY2VsbCByZWNlaXZlZCAqLworCWlmIChzdGF0X3IgJiBOU19TVEFUX1JBV0NGKSB7CisJCXdyaXRlbChOU19TVEFUX1JBV0NGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CiAjaWZuZGVmIFJDUV9TVVBQT1JUCi0gICAgICBwcmludGsoIm5pY3N0YXIlZDogUmF3IGNlbGwgcmVjZWl2ZWQgYW5kIG5vIHN1cHBvcnQgeWV0Li4uXG4iLAotICAgICAgICAgICAgIGNhcmQtPmluZGV4KTsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IFJhdyBjZWxsIHJlY2VpdmVkIGFuZCBubyBzdXBwb3J0IHlldC4uLlxuIiwKKwkJICAgICAgIGNhcmQtPmluZGV4KTsKICNlbmRpZiAvKiBSQ1FfU1VQUE9SVCAqLwotICAgICAgLyogTk9URTogdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgbWF5IGtlZXAgYSByYXcgY2VsbCBwZW5kaW5nIHVudGlsIHRoZQotICAgICAgICAgICAgICAgbmV4dCBpbnRlcnJ1cHQuIEFzIHRoaXMgcHJlbGltaW5hcnkgc3VwcG9ydCBpcyBvbmx5IG1lYW50IHRvCi0gICAgICAgICAgICAgICBhdm9pZCBidWZmZXIgbGVha2FnZSwgdGhpcyBpcyBub3QgYW4gaXNzdWUuICovCi0gICAgICB3aGlsZSAocmVhZGwoY2FyZC0+bWVtYmFzZSArIFJBV0NUKSAhPSBjYXJkLT5yYXdjaCkKLSAgICAgIHsKLSAgICAgICAgIG5zX3JjcWUgKnJhd2NlbGw7CisJCS8qIE5PVEU6IHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIG1heSBrZWVwIGEgcmF3IGNlbGwgcGVuZGluZyB1bnRpbCB0aGUKKwkJICAgbmV4dCBpbnRlcnJ1cHQuIEFzIHRoaXMgcHJlbGltaW5hcnkgc3VwcG9ydCBpcyBvbmx5IG1lYW50IHRvCisJCSAgIGF2b2lkIGJ1ZmZlciBsZWFrYWdlLCB0aGlzIGlzIG5vdCBhbiBpc3N1ZS4gKi8KKwkJd2hpbGUgKHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBSQVdDVCkgIT0gY2FyZC0+cmF3Y2gpIHsKIAotICAgICAgICAgcmF3Y2VsbCA9IChuc19yY3FlICopIGJ1c190b192aXJ0KGNhcmQtPnJhd2NoKTsKLSAgICAgICAgIGlmIChuc19yY3FlX2lzbGFzdChyYXdjZWxsKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpvbGRidWY7CisJCQlpZiAobnNfcmNxZV9pc2xhc3QoY2FyZC0+cmF3Y2VsbCkpIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqb2xkYnVmOwogCi0gICAgICAgICAgICBvbGRidWYgPSBjYXJkLT5yY2J1ZjsKLSAgICAgICAgICAgIGNhcmQtPnJjYnVmID0gKHN0cnVjdCBza19idWZmICopIG5zX3JjcWVfbmV4dGJ1ZmhhbmRsZShyYXdjZWxsKTsKLSAgICAgICAgICAgIGNhcmQtPnJhd2NoID0gKHUzMikgdmlydF90b19idXMoY2FyZC0+cmNidWYtPmRhdGEpOwotICAgICAgICAgICAgcmVjeWNsZV9yeF9idWYoY2FyZCwgb2xkYnVmKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNhcmQtPnJhd2NoICs9IE5TX1JDUUVfU0laRTsKLSAgICAgIH0KLSAgIH0KKwkJCQlvbGRidWYgPSBjYXJkLT5yY2J1ZjsKKwkJCQljYXJkLT5yY2J1ZiA9IGlkcl9maW5kKCZjYXJkLT5pZHIsCisJCQkJCQkgICAgICAgbnNfcmNxZV9uZXh0YnVmaGFuZGxlKGNhcmQtPnJhd2NlbGwpKTsKKwkJCQljYXJkLT5yYXdjaCA9IE5TX1BSVl9ETUEoY2FyZC0+cmNidWYpOworCQkJCWNhcmQtPnJhd2NlbGwgPSAoc3RydWN0IG5zX3JjcWUgKikKKwkJCQkJCWNhcmQtPnJjYnVmLT5kYXRhOworCQkJCXJlY3ljbGVfcnhfYnVmKGNhcmQsIG9sZGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCWNhcmQtPnJhd2NoICs9IE5TX1JDUUVfU0laRTsKKwkJCQljYXJkLT5yYXdjZWxsKys7CisJCQl9CisJCX0KKwl9CiAKLSAgIC8qIFNtYWxsIGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eSAqLwotICAgaWYgKHN0YXRfciAmIE5TX1NUQVRfU0ZCUUUpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHN0cnVjdCBza19idWZmICpzYjsKKwkvKiBTbWFsbCBidWZmZXIgcXVldWUgaXMgZW1wdHkgKi8KKwlpZiAoc3RhdF9yICYgTlNfU1RBVF9TRkJRRSkgeworCQlpbnQgaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNiOwogCi0gICAgICB3cml0ZWwoTlNfU1RBVF9TRkJRRSwgY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IFNtYWxsIGZyZWUgYnVmZmVyIHF1ZXVlIGVtcHR5LlxuIiwKLSAgICAgICAgICAgICBjYXJkLT5pbmRleCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY2FyZC0+c2Juci5taW47IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHNiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpOwotICAgICAgICAgaWYgKHNiID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZWwocmVhZGwoY2FyZC0+bWVtYmFzZSArIENGRykgJiB+TlNfQ0ZHX0VGQklFLCBjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKLSAgICAgICAgICAgIGNhcmQtPmVmYmllID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgTlNfU0tCX0NCKHNiKS0+YnVmX3R5cGUgPSBCVUZfU007Ci0gICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+c2Jwb29sLnF1ZXVlLCBzYik7Ci0gICAgICAgICBza2JfcmVzZXJ2ZShzYiwgTlNfQUFMMF9IRUFERVIpOwotICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgc2IpOwotICAgICAgfQotICAgICAgY2FyZC0+c2JmcWMgPSBpOwotICAgICAgcHJvY2Vzc19yc3EoY2FyZCk7Ci0gICB9CisJCXdyaXRlbChOU19TVEFUX1NGQlFFLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJCXByaW50aygibmljc3RhciVkOiBTbWFsbCBmcmVlIGJ1ZmZlciBxdWV1ZSBlbXB0eS5cbiIsCisJCSAgICAgICBjYXJkLT5pbmRleCk7CisJCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5zYm5yLm1pbjsgaSsrKSB7CisJCQlzYiA9IGRldl9hbGxvY19za2IoTlNfU01TS0JTSVpFKTsKKwkJCWlmIChzYiA9PSBOVUxMKSB7CisJCQkJd3JpdGVsKHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBDRkcpICYKKwkJCQkgICAgICAgfk5TX0NGR19FRkJJRSwgY2FyZC0+bWVtYmFzZSArIENGRyk7CisJCQkJY2FyZC0+ZWZiaWUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJTlNfUFJWX0JVRlRZUEUoc2IpID0gQlVGX1NNOworCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPnNicG9vbC5xdWV1ZSwgc2IpOworCQkJc2tiX3Jlc2VydmUoc2IsIE5TX0FBTDBfSEVBREVSKTsKKwkJCXB1c2hfcnhidWZzKGNhcmQsIHNiKTsKKwkJfQorCQljYXJkLT5zYmZxYyA9IGk7CisJCXByb2Nlc3NfcnNxKGNhcmQpOworCX0KIAotICAgLyogTGFyZ2UgYnVmZmVyIHF1ZXVlIGVtcHR5ICovCi0gICBpZiAoc3RhdF9yICYgTlNfU1RBVF9MRkJRRSkKLSAgIHsKLSAgICAgIGludCBpOwotICAgICAgc3RydWN0IHNrX2J1ZmYgKmxiOworCS8qIExhcmdlIGJ1ZmZlciBxdWV1ZSBlbXB0eSAqLworCWlmIChzdGF0X3IgJiBOU19TVEFUX0xGQlFFKSB7CisJCWludCBpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqbGI7CiAKLSAgICAgIHdyaXRlbChOU19TVEFUX0xGQlFFLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogTGFyZ2UgZnJlZSBidWZmZXIgcXVldWUgZW1wdHkuXG4iLAotICAgICAgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjYXJkLT5sYm5yLm1pbjsgaSsrKQotICAgICAgewotICAgICAgICAgbGIgPSBkZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSk7Ci0gICAgICAgICBpZiAobGIgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlbChyZWFkbChjYXJkLT5tZW1iYXNlICsgQ0ZHKSAmIH5OU19DRkdfRUZCSUUsIGNhcmQtPm1lbWJhc2UgKyBDRkcpOwotICAgICAgICAgICAgY2FyZC0+ZWZiaWUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBOU19TS0JfQ0IobGIpLT5idWZfdHlwZSA9IEJVRl9MRzsKLSAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5sYnBvb2wucXVldWUsIGxiKTsKLSAgICAgICAgIHNrYl9yZXNlcnZlKGxiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgbGIpOwotICAgICAgfQotICAgICAgY2FyZC0+bGJmcWMgPSBpOwotICAgICAgcHJvY2Vzc19yc3EoY2FyZCk7Ci0gICB9CisJCXdyaXRlbChOU19TVEFUX0xGQlFFLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJCXByaW50aygibmljc3RhciVkOiBMYXJnZSBmcmVlIGJ1ZmZlciBxdWV1ZSBlbXB0eS5cbiIsCisJCSAgICAgICBjYXJkLT5pbmRleCk7CisJCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5sYm5yLm1pbjsgaSsrKSB7CisJCQlsYiA9IGRldl9hbGxvY19za2IoTlNfTEdTS0JTSVpFKTsKKwkJCWlmIChsYiA9PSBOVUxMKSB7CisJCQkJd3JpdGVsKHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBDRkcpICYKKwkJCQkgICAgICAgfk5TX0NGR19FRkJJRSwgY2FyZC0+bWVtYmFzZSArIENGRyk7CisJCQkJY2FyZC0+ZWZiaWUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJTlNfUFJWX0JVRlRZUEUobGIpID0gQlVGX0xHOworCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmxicG9vbC5xdWV1ZSwgbGIpOworCQkJc2tiX3Jlc2VydmUobGIsIE5TX1NNQlVGU0laRSk7CisJCQlwdXNoX3J4YnVmcyhjYXJkLCBsYik7CisJCX0KKwkJY2FyZC0+bGJmcWMgPSBpOworCQlwcm9jZXNzX3JzcShjYXJkKTsKKwl9CiAKLSAgIC8qIFJlY2VpdmUgU3RhdHVzIFF1ZXVlIGlzIDcvOCBmdWxsICovCi0gICBpZiAoc3RhdF9yICYgTlNfU1RBVF9SU1FBRikKLSAgIHsKLSAgICAgIHdyaXRlbChOU19TVEFUX1JTUUFGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBSWFBSSU5USygibmljc3RhciVkOiBSU1EgYWxtb3N0IGZ1bGwuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICBwcm9jZXNzX3JzcShjYXJkKTsKLSAgIH0KLSAgIAotICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgIFBSSU5USygibmljc3RhciVkOiBlbmQgb2YgaW50ZXJydXB0IHNlcnZpY2VcbiIsIGNhcmQtPmluZGV4KTsKLSAgIHJldHVybiBJUlFfSEFORExFRDsKKwkvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBpcyA3LzggZnVsbCAqLworCWlmIChzdGF0X3IgJiBOU19TVEFUX1JTUUFGKSB7CisJCXdyaXRlbChOU19TVEFUX1JTUUFGLCBjYXJkLT5tZW1iYXNlICsgU1RBVCk7CisJCVJYUFJJTlRLKCJuaWNzdGFyJWQ6IFJTUSBhbG1vc3QgZnVsbC5cbiIsIGNhcmQtPmluZGV4KTsKKwkJcHJvY2Vzc19yc3EoY2FyZCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKKwlQUklOVEsoIm5pY3N0YXIlZDogZW5kIG9mIGludGVycnVwdCBzZXJ2aWNlXG4iLCBjYXJkLT5pbmRleCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0KLQogc3RhdGljIGludCBuc19vcGVuKHN0cnVjdCBhdG1fdmNjICp2Y2MpCiB7Ci0gICBuc19kZXYgKmNhcmQ7Ci0gICB2Y19tYXAgKnZjOwotICAgdW5zaWduZWQgbG9uZyB0bXBsLCBtb2RsOwotICAgaW50IHRjciwgdGNyYTsJLyogdGFyZ2V0IGNlbGwgcmF0ZSwgYW5kIGFic29sdXRlIHZhbHVlICovCi0gICBpbnQgbiA9IDA7CQkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgVFNULiBJbml0aWFsaXplZCB0byByZW1vdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21waWxlciB3YXJuaW5nLiAqLwotICAgdTMyIHUzMmRbNF07Ci0gICBpbnQgZnJzY2RpID0gMDsJLyogSW5kZXggb2YgdGhlIFNDRC4gSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIHRoZSBjb21waWxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZy4gSG93IEkgd2lzaCBjb21waWxlcnMgd2VyZSBjbGV2ZXIgZW5vdWdoIHRvCi0JCQkgICB0ZWxsIHdoaWNoIHZhcmlhYmxlcyBjYW4gdHJ1bHkgYmUgdXNlZAotCQkJICAgdW5pbml0aWFsaXplZC4uLiAqLwotICAgaW50IGludXNlOwkJLyogdHggb3IgcnggdmMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciB2Y2MgKi8KLSAgIHNob3J0IHZwaSA9IHZjYy0+dnBpOwotICAgaW50IHZjaSA9IHZjYy0+dmNpOworCW5zX2RldiAqY2FyZDsKKwl2Y19tYXAgKnZjOworCXVuc2lnbmVkIGxvbmcgdG1wbCwgbW9kbDsKKwlpbnQgdGNyLCB0Y3JhOwkJLyogdGFyZ2V0IGNlbGwgcmF0ZSwgYW5kIGFic29sdXRlIHZhbHVlICovCisJaW50IG4gPSAwOwkJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIFRTVC4gSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlCisJCQkJICAgdGhlIGNvbXBpbGVyIHdhcm5pbmcuICovCisJdTMyIHUzMmRbNF07CisJaW50IGZyc2NkaSA9IDA7CQkvKiBJbmRleCBvZiB0aGUgU0NELiBJbml0aWFsaXplZCB0byByZW1vdmUgdGhlIGNvbXBpbGVyCisJCQkJICAgd2FybmluZy4gSG93IEkgd2lzaCBjb21waWxlcnMgd2VyZSBjbGV2ZXIgZW5vdWdoIHRvCisJCQkJICAgdGVsbCB3aGljaCB2YXJpYWJsZXMgY2FuIHRydWx5IGJlIHVzZWQKKwkJCQkgICB1bmluaXRpYWxpemVkLi4uICovCisJaW50IGludXNlOwkJLyogdHggb3IgcnggdmMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciB2Y2MgKi8KKwlzaG9ydCB2cGkgPSB2Y2MtPnZwaTsKKwlpbnQgdmNpID0gdmNjLT52Y2k7CiAKLSAgIGNhcmQgPSAobnNfZGV2ICopIHZjYy0+ZGV2LT5kZXZfZGF0YTsKLSAgIFBSSU5USygibmljc3RhciVkOiBvcGVuaW5nIHZwaS52Y2kgJWQuJWQgXG4iLCBjYXJkLT5pbmRleCwgKGludCkgdnBpLCB2Y2kpOwotICAgaWYgKHZjYy0+cW9zLmFhbCAhPSBBVE1fQUFMNSAmJiB2Y2MtPnFvcy5hYWwgIT0gQVRNX0FBTDApCi0gICB7Ci0gICAgICBQUklOVEsoIm5pY3N0YXIlZDogdW5zdXBwb3J0ZWQgQUFMLlxuIiwgY2FyZC0+aW5kZXgpOwotICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICB9CisJY2FyZCA9IChuc19kZXYgKikgdmNjLT5kZXYtPmRldl9kYXRhOworCVBSSU5USygibmljc3RhciVkOiBvcGVuaW5nIHZwaS52Y2kgJWQuJWQgXG4iLCBjYXJkLT5pbmRleCwgKGludCl2cGksCisJICAgICAgIHZjaSk7CisJaWYgKHZjYy0+cW9zLmFhbCAhPSBBVE1fQUFMNSAmJiB2Y2MtPnFvcy5hYWwgIT0gQVRNX0FBTDApIHsKKwkJUFJJTlRLKCJuaWNzdGFyJWQ6IHVuc3VwcG9ydGVkIEFBTC5cbiIsIGNhcmQtPmluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gICB2YyA9ICYoY2FyZC0+dmNtYXBbdnBpIDw8IGNhcmQtPnZjaWJpdHMgfCB2Y2ldKTsKLSAgIHZjYy0+ZGV2X2RhdGEgPSB2YzsKKwl2YyA9ICYoY2FyZC0+dmNtYXBbdnBpIDw8IGNhcmQtPnZjaWJpdHMgfCB2Y2ldKTsKKwl2Y2MtPmRldl9kYXRhID0gdmM7CiAKLSAgIGludXNlID0gMDsKLSAgIGlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUgJiYgdmMtPnR4KQotICAgICAgaW51c2UgPSAxOwotICAgaWYgKHZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSAmJiB2Yy0+cngpCi0gICAgICBpbnVzZSArPSAyOwotICAgaWYgKGludXNlKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6ICVzIHZjaSBhbHJlYWR5IGluIHVzZS5cbiIsIGNhcmQtPmluZGV4LAotICAgICAgICAgICAgIGludXNlID09IDEgPyAidHgiIDogaW51c2UgPT0gMiA/ICJyeCIgOiAidHggYW5kIHJ4Iik7Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgIH0KKwlpbnVzZSA9IDA7CisJaWYgKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSAmJiB2Yy0+dHgpCisJCWludXNlID0gMTsKKwlpZiAodmNjLT5xb3Mucnh0cC50cmFmZmljX2NsYXNzICE9IEFUTV9OT05FICYmIHZjLT5yeCkKKwkJaW51c2UgKz0gMjsKKwlpZiAoaW51c2UpIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6ICVzIHZjaSBhbHJlYWR5IGluIHVzZS5cbiIsIGNhcmQtPmluZGV4LAorCQkgICAgICAgaW51c2UgPT0gMSA/ICJ0eCIgOiBpbnVzZSA9PSAyID8gInJ4IiA6ICJ0eCBhbmQgcngiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gICBzZXRfYml0KEFUTV9WRl9BRERSLCZ2Y2MtPmZsYWdzKTsKKwlzZXRfYml0KEFUTV9WRl9BRERSLCAmdmNjLT5mbGFncyk7CiAKLSAgIC8qIE5PVEU6IFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IGFuIG9wZW4gY29ubmVjdGlvbidzIFFPUy4gVG8gY2hhbmdlCi0gICAgICB0aGF0LCByZW1vdmUgdGhlIEFUTV9WRl9QQVJUSUFMIGZsYWcgY2hlY2tpbmcuIFRoZXJlIG1heSBiZSBvdGhlciBjaGFuZ2VzCi0gICAgICBuZWVkZWQgdG8gZG8gdGhhdC4gKi8KLSAgIGlmICghdGVzdF9iaXQoQVRNX1ZGX1BBUlRJQUwsJnZjYy0+ZmxhZ3MpKQotICAgewotICAgICAgc2NxX2luZm8gKnNjcTsKLSAgICAgIAotICAgICAgc2V0X2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncyk7Ci0gICAgICBpZiAodmNjLT5xb3MudHh0cC50cmFmZmljX2NsYXNzID09IEFUTV9DQlIpCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayByZXF1ZXN0ZWQgY2VsbCByYXRlIGFuZCBhdmFpbGFiaWxpdHkgb2YgU0NEICovCi0gICAgICAgICBpZiAodmNjLT5xb3MudHh0cC5tYXhfcGNyID09IDAgJiYgdmNjLT5xb3MudHh0cC5wY3IgPT0gMCAmJgotICAgICAgICAgICAgIHZjYy0+cW9zLnR4dHAubWluX3BjciA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgUFJJTlRLKCJuaWNzdGFyJWQ6IHRyeWluZyB0byBvcGVuIGEgQ0JSIHZjIHdpdGggY2VsbCByYXRlID0gMCBcbiIsCi0JICAgICAgICAgICBjYXJkLT5pbmRleCk7Ci0JICAgIGNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncyk7Ci0JICAgIGNsZWFyX2JpdChBVE1fVkZfQUREUiwmdmNjLT5mbGFncyk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgIH0KKwkvKiBOT1RFOiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSBhbiBvcGVuIGNvbm5lY3Rpb24ncyBRT1MuIFRvIGNoYW5nZQorCSAgIHRoYXQsIHJlbW92ZSB0aGUgQVRNX1ZGX1BBUlRJQUwgZmxhZyBjaGVja2luZy4gVGhlcmUgbWF5IGJlIG90aGVyIGNoYW5nZXMKKwkgICBuZWVkZWQgdG8gZG8gdGhhdC4gKi8KKwlpZiAoIXRlc3RfYml0KEFUTV9WRl9QQVJUSUFMLCAmdmNjLT5mbGFncykpIHsKKwkJc2NxX2luZm8gKnNjcTsKIAotICAgICAgICAgdGNyID0gYXRtX3Bjcl9nb2FsKCYodmNjLT5xb3MudHh0cCkpOwotICAgICAgICAgdGNyYSA9IHRjciA+PSAwID8gdGNyIDogLXRjcjsKLSAgICAgIAotICAgICAgICAgUFJJTlRLKCJuaWNzdGFyJWQ6IHRhcmdldCBjZWxsIHJhdGUgPSAlZC5cbiIsIGNhcmQtPmluZGV4LAotICAgICAgICAgICAgICAgIHZjYy0+cW9zLnR4dHAubWF4X3Bjcik7CisJCXNldF9iaXQoQVRNX1ZGX1BBUlRJQUwsICZ2Y2MtPmZsYWdzKTsKKwkJaWYgKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyA9PSBBVE1fQ0JSKSB7CisJCQkvKiBDaGVjayByZXF1ZXN0ZWQgY2VsbCByYXRlIGFuZCBhdmFpbGFiaWxpdHkgb2YgU0NEICovCisJCQlpZiAodmNjLT5xb3MudHh0cC5tYXhfcGNyID09IDAgJiYgdmNjLT5xb3MudHh0cC5wY3IgPT0gMAorCQkJICAgICYmIHZjYy0+cW9zLnR4dHAubWluX3BjciA9PSAwKSB7CisJCQkJUFJJTlRLCisJCQkJICAgICgibmljc3RhciVkOiB0cnlpbmcgdG8gb3BlbiBhIENCUiB2YyB3aXRoIGNlbGwgcmF0ZSA9IDAgXG4iLAorCQkJCSAgICAgY2FyZC0+aW5kZXgpOworCQkJCWNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOworCQkJCWNsZWFyX2JpdChBVE1fVkZfQUREUiwgJnZjYy0+ZmxhZ3MpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCi0gICAgICAgICB0bXBsID0gKHVuc2lnbmVkIGxvbmcpdGNyYSAqICh1bnNpZ25lZCBsb25nKU5TX1RTVF9OVU1fRU5UUklFUzsKLSAgICAgICAgIG1vZGwgPSB0bXBsICUgY2FyZC0+bWF4X3BjcjsKKwkJCXRjciA9IGF0bV9wY3JfZ29hbCgmKHZjYy0+cW9zLnR4dHApKTsKKwkJCXRjcmEgPSB0Y3IgPj0gMCA/IHRjciA6IC10Y3I7CiAKLSAgICAgICAgIG4gPSAoaW50KSh0bXBsIC8gY2FyZC0+bWF4X3Bjcik7Ci0gICAgICAgICBpZiAodGNyID4gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtb2RsID4gMCkgbisrOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAodGNyID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG4gPSAoY2FyZC0+dHN0X2ZyZWVfZW50cmllcyAtIE5TX1RTVF9SRVNFUlZFRCkpIDw9IDApCi0JICAgIHsKLSAgICAgICAgICAgICAgIFBSSU5USygibmljc3RhciVkOiBubyBDQlIgYmFuZHdpZHRoIGZyZWUuXG4iLCBjYXJkLT5pbmRleCk7Ci0JICAgICAgIGNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncyk7Ci0JICAgICAgIGNsZWFyX2JpdChBVE1fVkZfQUREUiwmdmNjLT5mbGFncyk7Ci0gICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KKwkJCVBSSU5USygibmljc3RhciVkOiB0YXJnZXQgY2VsbCByYXRlID0gJWQuXG4iLAorCQkJICAgICAgIGNhcmQtPmluZGV4LCB2Y2MtPnFvcy50eHRwLm1heF9wY3IpOwogCi0gICAgICAgICBpZiAobiA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IHNlbGVjdGVkIGJhbmR3aWR0aCA8IGdyYW51bGFyaXR5LlxuIiwgY2FyZC0+aW5kZXgpOwotCSAgICBjbGVhcl9iaXQoQVRNX1ZGX1BBUlRJQUwsJnZjYy0+ZmxhZ3MpOwotCSAgICBjbGVhcl9iaXQoQVRNX1ZGX0FERFIsJnZjYy0+ZmxhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICB9CisJCQl0bXBsID0KKwkJCSAgICAodW5zaWduZWQgbG9uZyl0Y3JhICoodW5zaWduZWQgbG9uZykKKwkJCSAgICBOU19UU1RfTlVNX0VOVFJJRVM7CisJCQltb2RsID0gdG1wbCAlIGNhcmQtPm1heF9wY3I7CiAKLSAgICAgICAgIGlmIChuID4gKGNhcmQtPnRzdF9mcmVlX2VudHJpZXMgLSBOU19UU1RfUkVTRVJWRUQpKQotICAgICAgICAgewotICAgICAgICAgICAgUFJJTlRLKCJuaWNzdGFyJWQ6IG5vdCBlbm91Z2ggZnJlZSBDQlIgYmFuZHdpZHRoLlxuIiwgY2FyZC0+aW5kZXgpOwotCSAgICBjbGVhcl9iaXQoQVRNX1ZGX1BBUlRJQUwsJnZjYy0+ZmxhZ3MpOwotCSAgICBjbGVhcl9iaXQoQVRNX1ZGX0FERFIsJnZjYy0+ZmxhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYXJkLT50c3RfZnJlZV9lbnRyaWVzIC09IG47CisJCQluID0gKGludCkodG1wbCAvIGNhcmQtPm1heF9wY3IpOworCQkJaWYgKHRjciA+IDApIHsKKwkJCQlpZiAobW9kbCA+IDApCisJCQkJCW4rKzsKKwkJCX0gZWxzZSBpZiAodGNyID09IDApIHsKKwkJCQlpZiAoKG4gPQorCQkJCSAgICAgKGNhcmQtPnRzdF9mcmVlX2VudHJpZXMgLQorCQkJCSAgICAgIE5TX1RTVF9SRVNFUlZFRCkpIDw9IDApIHsKKwkJCQkJUFJJTlRLCisJCQkJCSAgICAoIm5pY3N0YXIlZDogbm8gQ0JSIGJhbmR3aWR0aCBmcmVlLlxuIiwKKwkJCQkJICAgICBjYXJkLT5pbmRleCk7CisJCQkJCWNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOworCQkJCQljbGVhcl9iaXQoQVRNX1ZGX0FERFIsICZ2Y2MtPmZsYWdzKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQogCi0gICAgICAgICBYUFJJTlRLKCJuaWNzdGFyJWQ6IHdyaXRpbmcgJWQgdHN0IGVudHJpZXMuXG4iLCBjYXJkLT5pbmRleCwgbik7Ci0gICAgICAgICBmb3IgKGZyc2NkaSA9IDA7IGZyc2NkaSA8IE5TX0ZSU0NEX05VTTsgZnJzY2RpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2FyZC0+c2NkMnZjW2Zyc2NkaV0gPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhcmQtPnNjZDJ2Y1tmcnNjZGldID0gdmM7Ci0gICAgICAgICAgICAgICBicmVhazsKLQkgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYgKGZyc2NkaSA9PSBOU19GUlNDRF9OVU0pCi0gICAgICAgICB7Ci0gICAgICAgICAgICBQUklOVEsoIm5pY3N0YXIlZDogbm8gU0NEIGF2YWlsYWJsZSBmb3IgQ0JSIGNoYW5uZWwuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICAgICAgICBjYXJkLT50c3RfZnJlZV9lbnRyaWVzICs9IG47Ci0JICAgIGNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncyk7Ci0JICAgIGNsZWFyX2JpdChBVE1fVkZfQUREUiwmdmNjLT5mbGFncyk7Ci0JICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgICB9CisJCQlpZiAobiA9PSAwKSB7CisJCQkJcHJpbnRrCisJCQkJICAgICgibmljc3RhciVkOiBzZWxlY3RlZCBiYW5kd2lkdGggPCBncmFudWxhcml0eS5cbiIsCisJCQkJICAgICBjYXJkLT5pbmRleCk7CisJCQkJY2xlYXJfYml0KEFUTV9WRl9QQVJUSUFMLCAmdmNjLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KEFUTV9WRl9BRERSLCAmdmNjLT5mbGFncyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CiAKLSAgICAgICAgIHZjLT5jYnJfc2NkID0gTlNfRlJTQ0QgKyBmcnNjZGkgKiBOU19GUlNDRF9TSVpFOworCQkJaWYgKG4gPiAoY2FyZC0+dHN0X2ZyZWVfZW50cmllcyAtIE5TX1RTVF9SRVNFUlZFRCkpIHsKKwkJCQlQUklOVEsKKwkJCQkgICAgKCJuaWNzdGFyJWQ6IG5vdCBlbm91Z2ggZnJlZSBDQlIgYmFuZHdpZHRoLlxuIiwKKwkJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCQljbGVhcl9iaXQoQVRNX1ZGX1BBUlRJQUwsICZ2Y2MtPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQVRNX1ZGX0FERFIsICZ2Y2MtPmZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZQorCQkJCWNhcmQtPnRzdF9mcmVlX2VudHJpZXMgLT0gbjsKIAotICAgICAgICAgc2NxID0gZ2V0X3NjcShDQlJfU0NRU0laRSwgdmMtPmNicl9zY2QpOwotICAgICAgICAgaWYgKHNjcSA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgUFJJTlRLKCJuaWNzdGFyJWQ6IGNhbid0IGdldCBmaXhlZCByYXRlIFNDUS5cbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgICAgICAgIGNhcmQtPnNjZDJ2Y1tmcnNjZGldID0gTlVMTDsKLSAgICAgICAgICAgIGNhcmQtPnRzdF9mcmVlX2VudHJpZXMgKz0gbjsKLQkgICAgY2xlYXJfYml0KEFUTV9WRl9QQVJUSUFMLCZ2Y2MtPmZsYWdzKTsKLQkgICAgY2xlYXJfYml0KEFUTV9WRl9BRERSLCZ2Y2MtPmZsYWdzKTsKLSAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgfQotCSB2Yy0+c2NxID0gc2NxOwotICAgICAgICAgdTMyZFswXSA9ICh1MzIpIHZpcnRfdG9fYnVzKHNjcS0+YmFzZSk7Ci0gICAgICAgICB1MzJkWzFdID0gKHUzMikgMHgwMDAwMDAwMDsKLSAgICAgICAgIHUzMmRbMl0gPSAodTMyKSAweGZmZmZmZmZmOwotICAgICAgICAgdTMyZFszXSA9ICh1MzIpIDB4MDAwMDAwMDA7Ci0gICAgICAgICBuc193cml0ZV9zcmFtKGNhcmQsIHZjLT5jYnJfc2NkLCB1MzJkLCA0KTsKLSAgICAgICAgIAotCSBmaWxsX3RzdChjYXJkLCBuLCB2Yyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX1VCUikKLSAgICAgIHsKLSAgICAgICAgIHZjLT5jYnJfc2NkID0gMHgwMDAwMDAwMDsKLQkgdmMtPnNjcSA9IGNhcmQtPnNjcTA7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpCi0gICAgICB7Ci0gICAgICAgICB2Yy0+dHggPSAxOwotCSB2Yy0+dHhfdmNjID0gdmNjOwotCSB2Yy0+dGJkX2NvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGlmICh2Y2MtPnFvcy5yeHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpCi0gICAgICB7Ci0gICAgICAgICB1MzIgc3RhdHVzOwotICAgICAgCi0gICAgICAgICB2Yy0+cnggPSAxOwotICAgICAgICAgdmMtPnJ4X3ZjYyA9IHZjYzsKLSAgICAgICAgIHZjLT5yeF9pb3YgPSBOVUxMOworCQkJWFBSSU5USygibmljc3RhciVkOiB3cml0aW5nICVkIHRzdCBlbnRyaWVzLlxuIiwKKwkJCQljYXJkLT5pbmRleCwgbik7CisJCQlmb3IgKGZyc2NkaSA9IDA7IGZyc2NkaSA8IE5TX0ZSU0NEX05VTTsgZnJzY2RpKyspIHsKKwkJCQlpZiAoY2FyZC0+c2NkMnZjW2Zyc2NkaV0gPT0gTlVMTCkgeworCQkJCQljYXJkLT5zY2QydmNbZnJzY2RpXSA9IHZjOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZnJzY2RpID09IE5TX0ZSU0NEX05VTSkgeworCQkJCVBSSU5USworCQkJCSAgICAoIm5pY3N0YXIlZDogbm8gU0NEIGF2YWlsYWJsZSBmb3IgQ0JSIGNoYW5uZWwuXG4iLAorCQkJCSAgICAgY2FyZC0+aW5kZXgpOworCQkJCWNhcmQtPnRzdF9mcmVlX2VudHJpZXMgKz0gbjsKKwkJCQljbGVhcl9iaXQoQVRNX1ZGX1BBUlRJQUwsICZ2Y2MtPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQVRNX1ZGX0FERFIsICZ2Y2MtPmZsYWdzKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQogCi0JIC8qIE9wZW4gdGhlIGNvbm5lY3Rpb24gaW4gaGFyZHdhcmUgKi8KLQkgaWYgKHZjYy0+cW9zLmFhbCA9PSBBVE1fQUFMNSkKLQkgICAgc3RhdHVzID0gTlNfUkNURV9BQUw1IHwgTlNfUkNURV9DT05ORUNUT1BFTjsKLQkgZWxzZSAvKiB2Y2MtPnFvcy5hYWwgPT0gQVRNX0FBTDAgKi8KLQkgICAgc3RhdHVzID0gTlNfUkNURV9BQUwwIHwgTlNfUkNURV9DT05ORUNUT1BFTjsKKwkJCXZjLT5jYnJfc2NkID0gTlNfRlJTQ0QgKyBmcnNjZGkgKiBOU19GUlNDRF9TSVpFOworCisJCQlzY3EgPSBnZXRfc2NxKGNhcmQsIENCUl9TQ1FTSVpFLCB2Yy0+Y2JyX3NjZCk7CisJCQlpZiAoc2NxID09IE5VTEwpIHsKKwkJCQlQUklOVEsoIm5pY3N0YXIlZDogY2FuJ3QgZ2V0IGZpeGVkIHJhdGUgU0NRLlxuIiwKKwkJCQkgICAgICAgY2FyZC0+aW5kZXgpOworCQkJCWNhcmQtPnNjZDJ2Y1tmcnNjZGldID0gTlVMTDsKKwkJCQljYXJkLT50c3RfZnJlZV9lbnRyaWVzICs9IG47CisJCQkJY2xlYXJfYml0KEFUTV9WRl9QQVJUSUFMLCAmdmNjLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KEFUTV9WRl9BRERSLCAmdmNjLT5mbGFncyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQl2Yy0+c2NxID0gc2NxOworCQkJdTMyZFswXSA9IHNjcV92aXJ0X3RvX2J1cyhzY3EsIHNjcS0+YmFzZSk7CisJCQl1MzJkWzFdID0gKHUzMikgMHgwMDAwMDAwMDsKKwkJCXUzMmRbMl0gPSAodTMyKSAweGZmZmZmZmZmOworCQkJdTMyZFszXSA9ICh1MzIpIDB4MDAwMDAwMDA7CisJCQluc193cml0ZV9zcmFtKGNhcmQsIHZjLT5jYnJfc2NkLCB1MzJkLCA0KTsKKworCQkJZmlsbF90c3QoY2FyZCwgbiwgdmMpOworCQl9IGVsc2UgaWYgKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyA9PSBBVE1fVUJSKSB7CisJCQl2Yy0+Y2JyX3NjZCA9IDB4MDAwMDAwMDA7CisJCQl2Yy0+c2NxID0gY2FyZC0+c2NxMDsKKwkJfQorCisJCWlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpIHsKKwkJCXZjLT50eCA9IDE7CisJCQl2Yy0+dHhfdmNjID0gdmNjOworCQkJdmMtPnRiZF9jb3VudCA9IDA7CisJCX0KKwkJaWYgKHZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSkgeworCQkJdTMyIHN0YXR1czsKKworCQkJdmMtPnJ4ID0gMTsKKwkJCXZjLT5yeF92Y2MgPSB2Y2M7CisJCQl2Yy0+cnhfaW92ID0gTlVMTDsKKworCQkJLyogT3BlbiB0aGUgY29ubmVjdGlvbiBpbiBoYXJkd2FyZSAqLworCQkJaWYgKHZjYy0+cW9zLmFhbCA9PSBBVE1fQUFMNSkKKwkJCQlzdGF0dXMgPSBOU19SQ1RFX0FBTDUgfCBOU19SQ1RFX0NPTk5FQ1RPUEVOOworCQkJZWxzZQkvKiB2Y2MtPnFvcy5hYWwgPT0gQVRNX0FBTDAgKi8KKwkJCQlzdGF0dXMgPSBOU19SQ1RFX0FBTDAgfCBOU19SQ1RFX0NPTk5FQ1RPUEVOOwogI2lmZGVmIFJDUV9TVVBQT1JUCi0gICAgICAgICBzdGF0dXMgfD0gTlNfUkNURV9SQVdDRUxMSU5URU47CisJCQlzdGF0dXMgfD0gTlNfUkNURV9SQVdDRUxMSU5URU47CiAjZW5kaWYgLyogUkNRX1NVUFBPUlQgKi8KLSAgICAgICAgIG5zX3dyaXRlX3NyYW0oY2FyZCwgTlNfUkNUICsgKHZwaSA8PCBjYXJkLT52Y2liaXRzIHwgdmNpKSAqCi0JICAgICAgICAgICAgICAgTlNfUkNUX0VOVFJZX1NJWkUsICZzdGF0dXMsIDEpOwotICAgICAgfQotICAgICAgCi0gICB9Ci0gICAKLSAgIHNldF9iaXQoQVRNX1ZGX1JFQURZLCZ2Y2MtPmZsYWdzKTsKLSAgIHJldHVybiAwOworCQkJbnNfd3JpdGVfc3JhbShjYXJkLAorCQkJCSAgICAgIE5TX1JDVCArCisJCQkJICAgICAgKHZwaSA8PCBjYXJkLT52Y2liaXRzIHwgdmNpKSAqCisJCQkJICAgICAgTlNfUkNUX0VOVFJZX1NJWkUsICZzdGF0dXMsIDEpOworCQl9CisKKwl9CisKKwlzZXRfYml0KEFUTV9WRl9SRUFEWSwgJnZjYy0+ZmxhZ3MpOworCXJldHVybiAwOwogfQogCi0KLQogc3RhdGljIHZvaWQgbnNfY2xvc2Uoc3RydWN0IGF0bV92Y2MgKnZjYykKIHsKLSAgIHZjX21hcCAqdmM7Ci0gICBuc19kZXYgKmNhcmQ7Ci0gICB1MzIgZGF0YTsKLSAgIGludCBpOwotICAgCi0gICB2YyA9IHZjYy0+ZGV2X2RhdGE7Ci0gICBjYXJkID0gdmNjLT5kZXYtPmRldl9kYXRhOwotICAgUFJJTlRLKCJuaWNzdGFyJWQ6IGNsb3NpbmcgdnBpLnZjaSAlZC4lZCBcbiIsIGNhcmQtPmluZGV4LAotICAgICAgICAgIChpbnQpIHZjYy0+dnBpLCB2Y2MtPnZjaSk7CisJdmNfbWFwICp2YzsKKwluc19kZXYgKmNhcmQ7CisJdTMyIGRhdGE7CisJaW50IGk7CiAKLSAgIGNsZWFyX2JpdChBVE1fVkZfUkVBRFksJnZjYy0+ZmxhZ3MpOwotICAgCi0gICBpZiAodmNjLT5xb3Mucnh0cC50cmFmZmljX2NsYXNzICE9IEFUTV9OT05FKQotICAgewotICAgICAgdTMyIGFkZHI7Ci0gICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgCi0gICAgICBhZGRyID0gTlNfUkNUICsgKHZjYy0+dnBpIDw8IGNhcmQtPnZjaWJpdHMgfCB2Y2MtPnZjaSkgKiBOU19SQ1RfRU5UUllfU0laRTsKLSAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOwotICAgICAgd2hpbGUoQ01EX0JVU1koY2FyZCkpOwotICAgICAgd3JpdGVsKE5TX0NNRF9DTE9TRV9DT05ORUNUSU9OIHwgYWRkciA8PCAyLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKLSAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7Ci0gICAgICAKLSAgICAgIHZjLT5yeCA9IDA7Ci0gICAgICBpZiAodmMtPnJ4X2lvdiAhPSBOVUxMKQotICAgICAgewotCSBzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKLQkgdTMyIHN0YXQ7Ci0gICAKLSAgICAgICAgIHN0YXQgPSByZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICAgICBjYXJkLT5zYmZxYyA9IG5zX3N0YXRfc2ZicWNfZ2V0KHN0YXQpOyAgIAotICAgICAgICAgY2FyZC0+bGJmcWMgPSBuc19zdGF0X2xmYnFjX2dldChzdGF0KTsKKwl2YyA9IHZjYy0+ZGV2X2RhdGE7CisJY2FyZCA9IHZjYy0+ZGV2LT5kZXZfZGF0YTsKKwlQUklOVEsoIm5pY3N0YXIlZDogY2xvc2luZyB2cGkudmNpICVkLiVkIFxuIiwgY2FyZC0+aW5kZXgsCisJICAgICAgIChpbnQpdmNjLT52cGksIHZjYy0+dmNpKTsKIAotICAgICAgICAgUFJJTlRLKCJuaWNzdGFyJWQ6IGNsb3NpbmcgYSBWQyB3aXRoIHBlbmRpbmcgcnggYnVmZmVycy5cbiIsCi0JICAgICAgICBjYXJkLT5pbmRleCk7Ci0gICAgICAgICBpb3ZiID0gdmMtPnJ4X2lvdjsKLSAgICAgICAgIHJlY3ljbGVfaW92ZWNfcnhfYnVmcyhjYXJkLCAoc3RydWN0IGlvdmVjICopIGlvdmItPmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICBOU19TS0IoaW92YiktPmlvdmNudCk7Ci0gICAgICAgICBOU19TS0IoaW92YiktPmlvdmNudCA9IDA7Ci0gICAgICAgICBOU19TS0IoaW92YiktPnZjYyA9IE5VTEw7Ci0gICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgICAgICAgIHJlY3ljbGVfaW92X2J1ZihjYXJkLCBpb3ZiKTsKLSAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludF9sb2NrLCBmbGFncyk7Ci0gICAgICAgICB2Yy0+cnhfaW92ID0gTlVMTDsKLSAgICAgIH0KLSAgIH0KKwljbGVhcl9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncyk7CiAKLSAgIGlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpCi0gICB7Ci0gICAgICB2Yy0+dHggPSAwOwotICAgfQorCWlmICh2Y2MtPnFvcy5yeHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpIHsKKwkJdTMyIGFkZHI7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgIGlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikKLSAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICBuc19zY3FlICpzY3FlcDsKLSAgICAgIHNjcV9pbmZvICpzY3E7CisJCWFkZHIgPQorCQkgICAgTlNfUkNUICsKKwkJICAgICh2Y2MtPnZwaSA8PCBjYXJkLT52Y2liaXRzIHwgdmNjLT52Y2kpICogTlNfUkNUX0VOVFJZX1NJWkU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOworCQl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwkJd3JpdGVsKE5TX0NNRF9DTE9TRV9DT05ORUNUSU9OIHwgYWRkciA8PCAyLAorCQkgICAgICAgY2FyZC0+bWVtYmFzZSArIENNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7CiAKLSAgICAgIHNjcSA9IHZjLT5zY3E7CisJCXZjLT5yeCA9IDA7CisJCWlmICh2Yy0+cnhfaW92ICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICppb3ZiOworCQkJdTMyIHN0YXQ7CiAKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICBzY3FlcCA9IHNjcS0+bmV4dDsKLSAgICAgICAgIGlmIChzY3FlcCA9PSBzY3EtPmJhc2UpCi0gICAgICAgICAgICBzY3FlcCA9IHNjcS0+bGFzdDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNjcWVwLS07Ci0gICAgICAgICBpZiAoc2NxZXAgPT0gc2NxLT50YWlsKQotICAgICAgICAgewotICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIC8qIElmIHRoZSBsYXN0IGVudHJ5IGlzIG5vdCBhIFRTUiwgcGxhY2Ugb25lIGluIHRoZSBTQ1EgaW4gb3JkZXIgdG8KLSAgICAgICAgICAgIGJlIGFibGUgdG8gY29tcGxldGVseSBkcmFpbiBpdCBhbmQgdGhlbiBjbG9zZS4gKi8KLSAgICAgICAgIGlmICghbnNfc2NxZV9pc190c3Ioc2NxZXApICYmIHNjcS0+dGFpbCAhPSBzY3EtPm5leHQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBuc19zY3FlIHRzcjsKLSAgICAgICAgICAgIHUzMiBzY2RpLCBzY3FpOwotICAgICAgICAgICAgdTMyIGRhdGE7Ci0gICAgICAgICAgICBpbnQgaW5kZXg7CisJCQlzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCQkJY2FyZC0+c2JmcWMgPSBuc19zdGF0X3NmYnFjX2dldChzdGF0KTsKKwkJCWNhcmQtPmxiZnFjID0gbnNfc3RhdF9sZmJxY19nZXQoc3RhdCk7CiAKLSAgICAgICAgICAgIHRzci53b3JkXzEgPSBuc190c3JfbWt3b3JkXzEoTlNfVFNSX0lOVEVOQUJMRSk7Ci0gICAgICAgICAgICBzY2RpID0gKHZjLT5jYnJfc2NkIC0gTlNfRlJTQ0QpIC8gTlNfRlJTQ0RfU0laRTsKLSAgICAgICAgICAgIHNjcWkgPSBzY3EtPm5leHQgLSBzY3EtPmJhc2U7Ci0gICAgICAgICAgICB0c3Iud29yZF8yID0gbnNfdHNyX21rd29yZF8yKHNjZGksIHNjcWkpOwotICAgICAgICAgICAgdHNyLndvcmRfMyA9IDB4MDAwMDAwMDA7Ci0gICAgICAgICAgICB0c3Iud29yZF80ID0gMHgwMDAwMDAwMDsKLSAgICAgICAgICAgICpzY3EtPm5leHQgPSB0c3I7Ci0gICAgICAgICAgICBpbmRleCA9IChpbnQpIHNjcWk7Ci0gICAgICAgICAgICBzY3EtPnNrYltpbmRleF0gPSBOVUxMOwotICAgICAgICAgICAgaWYgKHNjcS0+bmV4dCA9PSBzY3EtPmxhc3QpCi0gICAgICAgICAgICAgICBzY3EtPm5leHQgPSBzY3EtPmJhc2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBzY3EtPm5leHQrKzsKLSAgICAgICAgICAgIGRhdGEgPSAodTMyKSB2aXJ0X3RvX2J1cyhzY3EtPm5leHQpOwotICAgICAgICAgICAgbnNfd3JpdGVfc3JhbShjYXJkLCBzY3EtPnNjZCwgJmRhdGEsIDEpOwotICAgICAgICAgfQotICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICBzY2hlZHVsZSgpOwotICAgICAgfQorCQkJUFJJTlRLCisJCQkgICAgKCJuaWNzdGFyJWQ6IGNsb3NpbmcgYSBWQyB3aXRoIHBlbmRpbmcgcnggYnVmZmVycy5cbiIsCisJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCWlvdmIgPSB2Yy0+cnhfaW92OworCQkJcmVjeWNsZV9pb3ZlY19yeF9idWZzKGNhcmQsIChzdHJ1Y3QgaW92ZWMgKilpb3ZiLT5kYXRhLAorCQkJCQkgICAgICBOU19QUlZfSU9WQ05UKGlvdmIpKTsKKwkJCU5TX1BSVl9JT1ZDTlQoaW92YikgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludF9sb2NrLCBmbGFncyk7CisJCQlyZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOworCQkJdmMtPnJ4X2lvdiA9IE5VTEw7CisJCX0KKwl9CiAKLSAgICAgIC8qIEZyZWUgYWxsIFRTVCBlbnRyaWVzICovCi0gICAgICBkYXRhID0gTlNfVFNUX09QQ09ERV9WQVJJQUJMRTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU19UU1RfTlVNX0VOVFJJRVM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGlmIChjYXJkLT50c3RlMnZjW2ldID09IHZjKQotCSB7Ci0gICAgICAgICAgICBuc193cml0ZV9zcmFtKGNhcmQsIGNhcmQtPnRzdF9hZGRyICsgaSwgJmRhdGEsIDEpOwotICAgICAgICAgICAgY2FyZC0+dHN0ZTJ2Y1tpXSA9IE5VTEw7Ci0gICAgICAgICAgICBjYXJkLT50c3RfZnJlZV9lbnRyaWVzKys7Ci0JIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FyZC0+c2NkMnZjWyh2Yy0+Y2JyX3NjZCAtIE5TX0ZSU0NEKSAvIE5TX0ZSU0NEX1NJWkVdID0gTlVMTDsKLSAgICAgIGZyZWVfc2NxKHZjLT5zY3EsIHZjYyk7Ci0gICB9CisJaWYgKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSkgeworCQl2Yy0+dHggPSAwOworCX0KIAotICAgLyogcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIHZjYyBiZWZvcmUgZGVsZXRpbmcgaXQgKi8KLSAgIGlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpCi0gICB7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgIHNjcV9pbmZvICpzY3EgPSBjYXJkLT5zY3EwOworCWlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQluc19zY3FlICpzY3FlcDsKKwkJc2NxX2luZm8gKnNjcTsKIAotICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCXNjcSA9IHZjLT5zY3E7CiAKLSAgICAgZm9yKGkgPSAwOyBpIDwgc2NxLT5udW1fZW50cmllczsgaSsrKSB7Ci0gICAgICAgaWYoc2NxLT5za2JbaV0gJiYgQVRNX1NLQihzY3EtPnNrYltpXSktPnZjYyA9PSB2Y2MpIHsKLSAgICAgICAgQVRNX1NLQihzY3EtPnNrYltpXSktPnZjYyA9IE5VTEw7Ci0JYXRtX3JldHVybih2Y2MsIHNjcS0+c2tiW2ldLT50cnVlc2l6ZSk7Ci0gICAgICAgIFBSSU5USygibmljc3RhcjogZGVsZXRlZCBwZW5kaW5nIHZjYyBtYXBwaW5nXG4iKTsKLSAgICAgICB9Ci0gICAgIH0KKwkJZm9yICg7OykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjcS0+bG9jaywgZmxhZ3MpOworCQkJc2NxZXAgPSBzY3EtPm5leHQ7CisJCQlpZiAoc2NxZXAgPT0gc2NxLT5iYXNlKQorCQkJCXNjcWVwID0gc2NxLT5sYXN0OworCQkJZWxzZQorCQkJCXNjcWVwLS07CisJCQlpZiAoc2NxZXAgPT0gc2NxLT50YWlsKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBJZiB0aGUgbGFzdCBlbnRyeSBpcyBub3QgYSBUU1IsIHBsYWNlIG9uZSBpbiB0aGUgU0NRIGluIG9yZGVyIHRvCisJCQkgICBiZSBhYmxlIHRvIGNvbXBsZXRlbHkgZHJhaW4gaXQgYW5kIHRoZW4gY2xvc2UuICovCisJCQlpZiAoIW5zX3NjcWVfaXNfdHNyKHNjcWVwKSAmJiBzY3EtPnRhaWwgIT0gc2NxLT5uZXh0KSB7CisJCQkJbnNfc2NxZSB0c3I7CisJCQkJdTMyIHNjZGksIHNjcWk7CisJCQkJdTMyIGRhdGE7CisJCQkJaW50IGluZGV4OwogCi0gICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOwotICAgfQorCQkJCXRzci53b3JkXzEgPSBuc190c3JfbWt3b3JkXzEoTlNfVFNSX0lOVEVOQUJMRSk7CisJCQkJc2NkaSA9ICh2Yy0+Y2JyX3NjZCAtIE5TX0ZSU0NEKSAvIE5TX0ZSU0NEX1NJWkU7CisJCQkJc2NxaSA9IHNjcS0+bmV4dCAtIHNjcS0+YmFzZTsKKwkJCQl0c3Iud29yZF8yID0gbnNfdHNyX21rd29yZF8yKHNjZGksIHNjcWkpOworCQkJCXRzci53b3JkXzMgPSAweDAwMDAwMDAwOworCQkJCXRzci53b3JkXzQgPSAweDAwMDAwMDAwOworCQkJCSpzY3EtPm5leHQgPSB0c3I7CisJCQkJaW5kZXggPSAoaW50KXNjcWk7CisJCQkJc2NxLT5za2JbaW5kZXhdID0gTlVMTDsKKwkJCQlpZiAoc2NxLT5uZXh0ID09IHNjcS0+bGFzdCkKKwkJCQkJc2NxLT5uZXh0ID0gc2NxLT5iYXNlOworCQkJCWVsc2UKKwkJCQkJc2NxLT5uZXh0Kys7CisJCQkJZGF0YSA9IHNjcV92aXJ0X3RvX2J1cyhzY3EsIHNjcS0+bmV4dCk7CisJCQkJbnNfd3JpdGVfc3JhbShjYXJkLCBzY3EtPnNjZCwgJmRhdGEsIDEpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCQlzY2hlZHVsZSgpOworCQl9CiAKLSAgIHZjYy0+ZGV2X2RhdGEgPSBOVUxMOwotICAgY2xlYXJfYml0KEFUTV9WRl9QQVJUSUFMLCZ2Y2MtPmZsYWdzKTsKLSAgIGNsZWFyX2JpdChBVE1fVkZfQUREUiwmdmNjLT5mbGFncyk7CisJCS8qIEZyZWUgYWxsIFRTVCBlbnRyaWVzICovCisJCWRhdGEgPSBOU19UU1RfT1BDT0RFX1ZBUklBQkxFOworCQlmb3IgKGkgPSAwOyBpIDwgTlNfVFNUX05VTV9FTlRSSUVTOyBpKyspIHsKKwkJCWlmIChjYXJkLT50c3RlMnZjW2ldID09IHZjKSB7CisJCQkJbnNfd3JpdGVfc3JhbShjYXJkLCBjYXJkLT50c3RfYWRkciArIGksICZkYXRhLAorCQkJCQkgICAgICAxKTsKKwkJCQljYXJkLT50c3RlMnZjW2ldID0gTlVMTDsKKwkJCQljYXJkLT50c3RfZnJlZV9lbnRyaWVzKys7CisJCQl9CisJCX0KKworCQljYXJkLT5zY2QydmNbKHZjLT5jYnJfc2NkIC0gTlNfRlJTQ0QpIC8gTlNfRlJTQ0RfU0laRV0gPSBOVUxMOworCQlmcmVlX3NjcShjYXJkLCB2Yy0+c2NxLCB2Y2MpOworCX0KKworCS8qIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB2Y2MgYmVmb3JlIGRlbGV0aW5nIGl0ICovCisJaWYgKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzY3FfaW5mbyAqc2NxID0gY2FyZC0+c2NxMDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNjcS0+bnVtX2VudHJpZXM7IGkrKykgeworCQkJaWYgKHNjcS0+c2tiW2ldICYmIEFUTV9TS0Ioc2NxLT5za2JbaV0pLT52Y2MgPT0gdmNjKSB7CisJCQkJQVRNX1NLQihzY3EtPnNrYltpXSktPnZjYyA9IE5VTEw7CisJCQkJYXRtX3JldHVybih2Y2MsIHNjcS0+c2tiW2ldLT50cnVlc2l6ZSk7CisJCQkJUFJJTlRLCisJCQkJICAgICgibmljc3RhcjogZGVsZXRlZCBwZW5kaW5nIHZjYyBtYXBwaW5nXG4iKTsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOworCX0KKworCXZjYy0+ZGV2X2RhdGEgPSBOVUxMOworCWNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOworCWNsZWFyX2JpdChBVE1fVkZfQUREUiwgJnZjYy0+ZmxhZ3MpOwogCiAjaWZkZWYgUlhfREVCVUcKLSAgIHsKLSAgICAgIHUzMiBzdGF0LCBjZmc7Ci0gICAgICBzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgICAgY2ZnID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIENGRyk7Ci0gICAgICBwcmludGsoIlNUQVQgPSAweCUwOFggIENGRyA9IDB4JTA4WCAgXG4iLCBzdGF0LCBjZmcpOwotICAgICAgcHJpbnRrKCJUU1E6IGJhc2UgPSAweCUwOFggIG5leHQgPSAweCUwOFggIGxhc3QgPSAweCUwOFggIFRTUVQgPSAweCUwOFggXG4iLAotICAgICAgICAgICAgICh1MzIpIGNhcmQtPnRzcS5iYXNlLCAodTMyKSBjYXJkLT50c3EubmV4dCwodTMyKSBjYXJkLT50c3EubGFzdCwKLQkgICAgIHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBUU1FUKSk7Ci0gICAgICBwcmludGsoIlJTUTogYmFzZSA9IDB4JTA4WCAgbmV4dCA9IDB4JTA4WCAgbGFzdCA9IDB4JTA4WCAgUlNRVCA9IDB4JTA4WCBcbiIsCi0gICAgICAgICAgICAgKHUzMikgY2FyZC0+cnNxLmJhc2UsICh1MzIpIGNhcmQtPnJzcS5uZXh0LCh1MzIpIGNhcmQtPnJzcS5sYXN0LAotCSAgICAgcmVhZGwoY2FyZC0+bWVtYmFzZSArIFJTUVQpKTsKLSAgICAgIHByaW50aygiRW1wdHkgZnJlZSBidWZmZXIgcXVldWUgaW50ZXJydXB0ICVzIFxuIiwKLSAgICAgICAgICAgICBjYXJkLT5lZmJpZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotICAgICAgcHJpbnRrKCJTQkNOVCA9ICVkICBjb3VudCA9ICVkICAgTEJDTlQgPSAlZCBjb3VudCA9ICVkIFxuIiwKLSAgICAgICAgICAgICBuc19zdGF0X3NmYnFjX2dldChzdGF0KSwgY2FyZC0+c2Jwb29sLmNvdW50LAotCSAgICAgbnNfc3RhdF9sZmJxY19nZXQoc3RhdCksIGNhcmQtPmxicG9vbC5jb3VudCk7Ci0gICAgICBwcmludGsoImhicG9vbC5jb3VudCA9ICVkICBpb3Zwb29sLmNvdW50ID0gJWQgXG4iLAotICAgICAgICAgICAgIGNhcmQtPmhicG9vbC5jb3VudCwgY2FyZC0+aW92cG9vbC5jb3VudCk7Ci0gICB9CisJeworCQl1MzIgc3RhdCwgY2ZnOworCQlzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCQljZmcgPSByZWFkbChjYXJkLT5tZW1iYXNlICsgQ0ZHKTsKKwkJcHJpbnRrKCJTVEFUID0gMHglMDhYICBDRkcgPSAweCUwOFggIFxuIiwgc3RhdCwgY2ZnKTsKKwkJcHJpbnRrCisJCSAgICAoIlRTUTogYmFzZSA9IDB4JXAgIG5leHQgPSAweCVwICBsYXN0ID0gMHglcCAgVFNRVCA9IDB4JTA4WCBcbiIsCisJCSAgICAgY2FyZC0+dHNxLmJhc2UsIGNhcmQtPnRzcS5uZXh0LAorCQkgICAgIGNhcmQtPnRzcS5sYXN0LCByZWFkbChjYXJkLT5tZW1iYXNlICsgVFNRVCkpOworCQlwcmludGsKKwkJICAgICgiUlNROiBiYXNlID0gMHglcCAgbmV4dCA9IDB4JXAgIGxhc3QgPSAweCVwICBSU1FUID0gMHglMDhYIFxuIiwKKwkJICAgICBjYXJkLT5yc3EuYmFzZSwgY2FyZC0+cnNxLm5leHQsCisJCSAgICAgY2FyZC0+cnNxLmxhc3QsIHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBSU1FUKSk7CisJCXByaW50aygiRW1wdHkgZnJlZSBidWZmZXIgcXVldWUgaW50ZXJydXB0ICVzIFxuIiwKKwkJICAgICAgIGNhcmQtPmVmYmllID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCXByaW50aygiU0JDTlQgPSAlZCAgY291bnQgPSAlZCAgIExCQ05UID0gJWQgY291bnQgPSAlZCBcbiIsCisJCSAgICAgICBuc19zdGF0X3NmYnFjX2dldChzdGF0KSwgY2FyZC0+c2Jwb29sLmNvdW50LAorCQkgICAgICAgbnNfc3RhdF9sZmJxY19nZXQoc3RhdCksIGNhcmQtPmxicG9vbC5jb3VudCk7CisJCXByaW50aygiaGJwb29sLmNvdW50ID0gJWQgIGlvdnBvb2wuY291bnQgPSAlZCBcbiIsCisJCSAgICAgICBjYXJkLT5oYnBvb2wuY291bnQsIGNhcmQtPmlvdnBvb2wuY291bnQpOworCX0KICNlbmRpZiAvKiBSWF9ERUJVRyAqLwogfQogCi0KLQotc3RhdGljIHZvaWQgZmlsbF90c3QobnNfZGV2ICpjYXJkLCBpbnQgbiwgdmNfbWFwICp2YykKK3N0YXRpYyB2b2lkIGZpbGxfdHN0KG5zX2RldiAqIGNhcmQsIGludCBuLCB2Y19tYXAgKiB2YykKIHsKLSAgIHUzMiBuZXdfdHN0OwotICAgdW5zaWduZWQgbG9uZyBjbDsKLSAgIGludCBlLCByOwotICAgdTMyIGRhdGE7Ci0gICAgICAKLSAgIC8qIEl0IHdvdWxkIGJlIHZlcnkgY29tcGxpY2F0ZWQgdG8ga2VlcCB0aGUgdHdvIFRTVHMgc3luY2hyb25pemVkIHdoaWxlCi0gICAgICBhc3N1cmluZyB0aGF0IHdyaXRlcyBhcmUgb25seSBtYWRlIHRvIHRoZSBpbmFjdGl2ZSBUU1QuIFNvLCBmb3Igbm93IEkKLSAgICAgIHdpbGwgdXNlIG9ubHkgb25lIFRTVC4gSWYgcHJvYmxlbXMgb2NjdXIsIEkgd2lsbCBjaGFuZ2UgdGhpcyBhZ2FpbiAqLwotICAgCi0gICBuZXdfdHN0ID0gY2FyZC0+dHN0X2FkZHI7CisJdTMyIG5ld190c3Q7CisJdW5zaWduZWQgbG9uZyBjbDsKKwlpbnQgZSwgcjsKKwl1MzIgZGF0YTsKIAotICAgLyogRmlsbCBwcm9jZWR1cmUgKi8KKwkvKiBJdCB3b3VsZCBiZSB2ZXJ5IGNvbXBsaWNhdGVkIHRvIGtlZXAgdGhlIHR3byBUU1RzIHN5bmNocm9uaXplZCB3aGlsZQorCSAgIGFzc3VyaW5nIHRoYXQgd3JpdGVzIGFyZSBvbmx5IG1hZGUgdG8gdGhlIGluYWN0aXZlIFRTVC4gU28sIGZvciBub3cgSQorCSAgIHdpbGwgdXNlIG9ubHkgb25lIFRTVC4gSWYgcHJvYmxlbXMgb2NjdXIsIEkgd2lsbCBjaGFuZ2UgdGhpcyBhZ2FpbiAqLwogCi0gICBmb3IgKGUgPSAwOyBlIDwgTlNfVFNUX05VTV9FTlRSSUVTOyBlKyspCi0gICB7Ci0gICAgICBpZiAoY2FyZC0+dHN0ZTJ2Y1tlXSA9PSBOVUxMKQotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICBpZiAoZSA9PSBOU19UU1RfTlVNX0VOVFJJRVMpIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiBObyBmcmVlIFRTVCBlbnRyaWVzIGZvdW5kLiBcbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgIHJldHVybjsKLSAgIH0KKwluZXdfdHN0ID0gY2FyZC0+dHN0X2FkZHI7CiAKLSAgIHIgPSBuOwotICAgY2wgPSBOU19UU1RfTlVNX0VOVFJJRVM7Ci0gICBkYXRhID0gbnNfdHN0ZV9tYWtlKE5TX1RTVF9PUENPREVfRklYRUQsIHZjLT5jYnJfc2NkKTsKLSAgICAgIAotICAgd2hpbGUgKHIgPiAwKQotICAgewotICAgICAgaWYgKGNsID49IE5TX1RTVF9OVU1fRU5UUklFUyAmJiBjYXJkLT50c3RlMnZjW2VdID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBjYXJkLT50c3RlMnZjW2VdID0gdmM7Ci0gICAgICAgICBuc193cml0ZV9zcmFtKGNhcmQsIG5ld190c3QgKyBlLCAmZGF0YSwgMSk7Ci0gICAgICAgICBjbCAtPSBOU19UU1RfTlVNX0VOVFJJRVM7Ci0gICAgICAgICByLS07Ci0gICAgICB9CisJLyogRmlsbCBwcm9jZWR1cmUgKi8KIAotICAgICAgaWYgKCsrZSA9PSBOU19UU1RfTlVNX0VOVFJJRVMpIHsKLSAgICAgICAgIGUgPSAwOwotICAgICAgfQotICAgICAgY2wgKz0gbjsKLSAgIH0KLSAgIAotICAgLyogRW5kIG9mIGZpbGwgcHJvY2VkdXJlICovCi0gICAKLSAgIGRhdGEgPSBuc190c3RlX21ha2UoTlNfVFNUX09QQ09ERV9FTkQsIG5ld190c3QpOwotICAgbnNfd3JpdGVfc3JhbShjYXJkLCBuZXdfdHN0ICsgTlNfVFNUX05VTV9FTlRSSUVTLCAmZGF0YSwgMSk7Ci0gICBuc193cml0ZV9zcmFtKGNhcmQsIGNhcmQtPnRzdF9hZGRyICsgTlNfVFNUX05VTV9FTlRSSUVTLCAmZGF0YSwgMSk7Ci0gICBjYXJkLT50c3RfYWRkciA9IG5ld190c3Q7CisJZm9yIChlID0gMDsgZSA8IE5TX1RTVF9OVU1fRU5UUklFUzsgZSsrKSB7CisJCWlmIChjYXJkLT50c3RlMnZjW2VdID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJaWYgKGUgPT0gTlNfVFNUX05VTV9FTlRSSUVTKSB7CisJCXByaW50aygibmljc3RhciVkOiBObyBmcmVlIFRTVCBlbnRyaWVzIGZvdW5kLiBcbiIsIGNhcmQtPmluZGV4KTsKKwkJcmV0dXJuOworCX0KKworCXIgPSBuOworCWNsID0gTlNfVFNUX05VTV9FTlRSSUVTOworCWRhdGEgPSBuc190c3RlX21ha2UoTlNfVFNUX09QQ09ERV9GSVhFRCwgdmMtPmNicl9zY2QpOworCisJd2hpbGUgKHIgPiAwKSB7CisJCWlmIChjbCA+PSBOU19UU1RfTlVNX0VOVFJJRVMgJiYgY2FyZC0+dHN0ZTJ2Y1tlXSA9PSBOVUxMKSB7CisJCQljYXJkLT50c3RlMnZjW2VdID0gdmM7CisJCQluc193cml0ZV9zcmFtKGNhcmQsIG5ld190c3QgKyBlLCAmZGF0YSwgMSk7CisJCQljbCAtPSBOU19UU1RfTlVNX0VOVFJJRVM7CisJCQlyLS07CisJCX0KKworCQlpZiAoKytlID09IE5TX1RTVF9OVU1fRU5UUklFUykgeworCQkJZSA9IDA7CisJCX0KKwkJY2wgKz0gbjsKKwl9CisKKwkvKiBFbmQgb2YgZmlsbCBwcm9jZWR1cmUgKi8KKworCWRhdGEgPSBuc190c3RlX21ha2UoTlNfVFNUX09QQ09ERV9FTkQsIG5ld190c3QpOworCW5zX3dyaXRlX3NyYW0oY2FyZCwgbmV3X3RzdCArIE5TX1RTVF9OVU1fRU5UUklFUywgJmRhdGEsIDEpOworCW5zX3dyaXRlX3NyYW0oY2FyZCwgY2FyZC0+dHN0X2FkZHIgKyBOU19UU1RfTlVNX0VOVFJJRVMsICZkYXRhLCAxKTsKKwljYXJkLT50c3RfYWRkciA9IG5ld190c3Q7CiB9CiAKLQotCiBzdGF0aWMgaW50IG5zX3NlbmQoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLSAgIG5zX2RldiAqY2FyZDsKLSAgIHZjX21hcCAqdmM7Ci0gICBzY3FfaW5mbyAqc2NxOwotICAgdW5zaWduZWQgbG9uZyBidWZsZW47Ci0gICBuc19zY3FlIHNjcWU7Ci0gICB1MzIgZmxhZ3M7CQkvKiBUQkQgZmxhZ3MsIG5vdCBDUFUgZmxhZ3MgKi8KLSAgIAotICAgY2FyZCA9IHZjYy0+ZGV2LT5kZXZfZGF0YTsKLSAgIFRYUFJJTlRLKCJuaWNzdGFyJWQ6IG5zX3NlbmQoKSBjYWxsZWQuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICBpZiAoKHZjID0gKHZjX21hcCAqKSB2Y2MtPmRldl9kYXRhKSA9PSBOVUxMKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IHZjYy0+ZGV2X2RhdGEgPT0gTlVMTCBvbiBuc19zZW5kKCkuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT50eF9lcnIpOwotICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgIHJldHVybiAtRUlOVkFMOwotICAgfQotICAgCi0gICBpZiAoIXZjLT50eCkKLSAgIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiBUcnlpbmcgdG8gdHJhbnNtaXQgb24gYSBub24tdHggVkMuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT50eF9lcnIpOwotICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgIHJldHVybiAtRUlOVkFMOwotICAgfQotICAgCi0gICBpZiAodmNjLT5xb3MuYWFsICE9IEFUTV9BQUw1ICYmIHZjYy0+cW9zLmFhbCAhPSBBVE1fQUFMMCkKLSAgIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiBPbmx5IEFBTDAgYW5kIEFBTDUgYXJlIHN1cHBvcnRlZC5cbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4X2Vycik7Ci0gICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICB9Ci0gICAKLSAgIGlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICE9IDApCi0gICB7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogTm8gc2NhdHRlci1nYXRoZXIgeWV0LlxuIiwgY2FyZC0+aW5kZXgpOwotICAgICAgYXRvbWljX2luYygmdmNjLT5zdGF0cy0+dHhfZXJyKTsKLSAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgIH0KLSAgIAotICAgQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7CisJbnNfZGV2ICpjYXJkOworCXZjX21hcCAqdmM7CisJc2NxX2luZm8gKnNjcTsKKwl1bnNpZ25lZCBsb25nIGJ1ZmxlbjsKKwluc19zY3FlIHNjcWU7CisJdTMyIGZsYWdzOwkJLyogVEJEIGZsYWdzLCBub3QgQ1BVIGZsYWdzICovCiAKLSAgIGlmICh2Y2MtPnFvcy5hYWwgPT0gQVRNX0FBTDUpCi0gICB7Ci0gICAgICBidWZsZW4gPSAoc2tiLT5sZW4gKyA0NyArIDgpIC8gNDggKiA0ODsJLyogTXVsdGlwbGUgb2YgNDggKi8KLSAgICAgIGZsYWdzID0gTlNfVEJEX0FBTDU7Ci0gICAgICBzY3FlLndvcmRfMiA9IGNwdV90b19sZTMyKCh1MzIpIHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSkpOwotICAgICAgc2NxZS53b3JkXzMgPSBjcHVfdG9fbGUzMigodTMyKSBza2ItPmxlbik7Ci0gICAgICBzY3FlLndvcmRfNCA9IG5zX3RiZF9ta3dvcmRfNCgwLCAodTMyKSB2Y2MtPnZwaSwgKHUzMikgdmNjLT52Y2ksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVE1fU0tCKHNrYiktPmF0bV9vcHRpb25zICYgQVRNX0FUTU9QVF9DTFAgPyAxIDogMCk7Ci0gICAgICBmbGFncyB8PSBOU19UQkRfRU9QRFU7Ci0gICB9Ci0gICBlbHNlIC8qICh2Y2MtPnFvcy5hYWwgPT0gQVRNX0FBTDApICovCi0gICB7Ci0gICAgICBidWZsZW4gPSBBVE1fQ0VMTF9QQVlMT0FEOwkvKiBpLmUuLCA0OCBieXRlcyAqLwotICAgICAgZmxhZ3MgPSBOU19UQkRfQUFMMDsKLSAgICAgIHNjcWUud29yZF8yID0gY3B1X3RvX2xlMzIoKHUzMikgdmlydF90b19idXMoc2tiLT5kYXRhKSArIE5TX0FBTDBfSEVBREVSKTsKLSAgICAgIHNjcWUud29yZF8zID0gY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCk7Ci0gICAgICBpZiAoKnNrYi0+ZGF0YSAmIDB4MDIpCS8qIFBheWxvYWQgdHlwZSAxIC0gZW5kIG9mIHBkdSAqLwotICAgICAgICAgZmxhZ3MgfD0gTlNfVEJEX0VPUERVOwotICAgICAgc2NxZS53b3JkXzQgPSBjcHVfdG9fbGUzMigqKCh1MzIgKikgc2tiLT5kYXRhKSAmIH5OU19UQkRfVkNfTUFTSyk7Ci0gICAgICAvKiBGb3JjZSB0aGUgVlBJL1ZDSSB0byBiZSB0aGUgc2FtZSBhcyBpbiBWQ0Mgc3RydWN0ICovCi0gICAgICBzY3FlLndvcmRfNCB8PSBjcHVfdG9fbGUzMigoKCh1MzIpIHZjYy0+dnBpKSA8PCBOU19UQkRfVlBJX1NISUZUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKSB2Y2MtPnZjaSkgPDwgTlNfVEJEX1ZDSV9TSElGVCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVEJEX1ZDX01BU0spOwotICAgfQorCWNhcmQgPSB2Y2MtPmRldi0+ZGV2X2RhdGE7CisJVFhQUklOVEsoIm5pY3N0YXIlZDogbnNfc2VuZCgpIGNhbGxlZC5cbiIsIGNhcmQtPmluZGV4KTsKKwlpZiAoKHZjID0gKHZjX21hcCAqKSB2Y2MtPmRldl9kYXRhKSA9PSBOVUxMKSB7CisJCXByaW50aygibmljc3RhciVkOiB2Y2MtPmRldl9kYXRhID09IE5VTEwgb24gbnNfc2VuZCgpLlxuIiwKKwkJICAgICAgIGNhcmQtPmluZGV4KTsKKwkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+dHhfZXJyKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gICBpZiAodmNjLT5xb3MudHh0cC50cmFmZmljX2NsYXNzID09IEFUTV9DQlIpCi0gICB7Ci0gICAgICBzY3FlLndvcmRfMSA9IG5zX3RiZF9ta3dvcmRfMV9ub3ZicihmbGFncywgKHUzMikgYnVmbGVuKTsKLSAgICAgIHNjcSA9ICgodmNfbWFwICopIHZjYy0+ZGV2X2RhdGEpLT5zY3E7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBzY3FlLndvcmRfMSA9IG5zX3RiZF9ta3dvcmRfMShmbGFncywgKHUzMikgMSwgKHUzMikgMSwgKHUzMikgYnVmbGVuKTsKLSAgICAgIHNjcSA9IGNhcmQtPnNjcTA7Ci0gICB9CisJaWYgKCF2Yy0+dHgpIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IFRyeWluZyB0byB0cmFuc21pdCBvbiBhIG5vbi10eCBWQy5cbiIsCisJCSAgICAgICBjYXJkLT5pbmRleCk7CisJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4X2Vycik7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotICAgaWYgKHB1c2hfc2NxZShjYXJkLCB2Yywgc2NxLCAmc2NxZSwgc2tiKSAhPSAwKQotICAgewotICAgICAgYXRvbWljX2luYygmdmNjLT5zdGF0cy0+dHhfZXJyKTsKLSAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0gICAgICByZXR1cm4gLUVJTzsKLSAgIH0KLSAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4KTsKKwlpZiAodmNjLT5xb3MuYWFsICE9IEFUTV9BQUw1ICYmIHZjYy0+cW9zLmFhbCAhPSBBVE1fQUFMMCkgeworCQlwcmludGsoIm5pY3N0YXIlZDogT25seSBBQUwwIGFuZCBBQUw1IGFyZSBzdXBwb3J0ZWQuXG4iLAorCQkgICAgICAgY2FyZC0+aW5kZXgpOworCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT50eF9lcnIpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLSAgIHJldHVybiAwOworCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICE9IDApIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IE5vIHNjYXR0ZXItZ2F0aGVyIHlldC5cbiIsIGNhcmQtPmluZGV4KTsKKwkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+dHhfZXJyKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7CisKKwlOU19QUlZfRE1BKHNrYikgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wY2lkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCWlmICh2Y2MtPnFvcy5hYWwgPT0gQVRNX0FBTDUpIHsKKwkJYnVmbGVuID0gKHNrYi0+bGVuICsgNDcgKyA4KSAvIDQ4ICogNDg7CS8qIE11bHRpcGxlIG9mIDQ4ICovCisJCWZsYWdzID0gTlNfVEJEX0FBTDU7CisJCXNjcWUud29yZF8yID0gY3B1X3RvX2xlMzIoTlNfUFJWX0RNQShza2IpKTsKKwkJc2NxZS53b3JkXzMgPSBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJCXNjcWUud29yZF80ID0KKwkJICAgIG5zX3RiZF9ta3dvcmRfNCgwLCAodTMyKSB2Y2MtPnZwaSwgKHUzMikgdmNjLT52Y2ksIDAsCisJCQkJICAgIEFUTV9TS0Ioc2tiKS0+CisJCQkJICAgIGF0bV9vcHRpb25zICYgQVRNX0FUTU9QVF9DTFAgPyAxIDogMCk7CisJCWZsYWdzIHw9IE5TX1RCRF9FT1BEVTsKKwl9IGVsc2UgewkJLyogKHZjYy0+cW9zLmFhbCA9PSBBVE1fQUFMMCkgKi8KKworCQlidWZsZW4gPSBBVE1fQ0VMTF9QQVlMT0FEOwkvKiBpLmUuLCA0OCBieXRlcyAqLworCQlmbGFncyA9IE5TX1RCRF9BQUwwOworCQlzY3FlLndvcmRfMiA9IGNwdV90b19sZTMyKE5TX1BSVl9ETUEoc2tiKSArIE5TX0FBTDBfSEVBREVSKTsKKwkJc2NxZS53b3JkXzMgPSBjcHVfdG9fbGUzMigweDAwMDAwMDAwKTsKKwkJaWYgKCpza2ItPmRhdGEgJiAweDAyKQkvKiBQYXlsb2FkIHR5cGUgMSAtIGVuZCBvZiBwZHUgKi8KKwkJCWZsYWdzIHw9IE5TX1RCRF9FT1BEVTsKKwkJc2NxZS53b3JkXzQgPQorCQkgICAgY3B1X3RvX2xlMzIoKigodTMyICopIHNrYi0+ZGF0YSkgJiB+TlNfVEJEX1ZDX01BU0spOworCQkvKiBGb3JjZSB0aGUgVlBJL1ZDSSB0byBiZSB0aGUgc2FtZSBhcyBpbiBWQ0Mgc3RydWN0ICovCisJCXNjcWUud29yZF80IHw9CisJCSAgICBjcHVfdG9fbGUzMigoKCh1MzIpIHZjYy0+CisJCQkJICB2cGkpIDw8IE5TX1RCRF9WUElfU0hJRlQgfCAoKHUzMikgdmNjLT4KKwkJCQkJCQkgICAgICB2Y2kpIDw8CisJCQkJIE5TX1RCRF9WQ0lfU0hJRlQpICYgTlNfVEJEX1ZDX01BU0spOworCX0KKworCWlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgeworCQlzY3FlLndvcmRfMSA9IG5zX3RiZF9ta3dvcmRfMV9ub3ZicihmbGFncywgKHUzMikgYnVmbGVuKTsKKwkJc2NxID0gKCh2Y19tYXAgKikgdmNjLT5kZXZfZGF0YSktPnNjcTsKKwl9IGVsc2UgeworCQlzY3FlLndvcmRfMSA9CisJCSAgICBuc190YmRfbWt3b3JkXzEoZmxhZ3MsICh1MzIpIDEsICh1MzIpIDEsICh1MzIpIGJ1Zmxlbik7CisJCXNjcSA9IGNhcmQtPnNjcTA7CisJfQorCisJaWYgKHB1c2hfc2NxZShjYXJkLCB2Yywgc2NxLCAmc2NxZSwgc2tiKSAhPSAwKSB7CisJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4X2Vycik7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAtRUlPOworCX0KKwlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT50eCk7CisKKwlyZXR1cm4gMDsKIH0KIAotCi0KLXN0YXRpYyBpbnQgcHVzaF9zY3FlKG5zX2RldiAqY2FyZCwgdmNfbWFwICp2Yywgc2NxX2luZm8gKnNjcSwgbnNfc2NxZSAqdGJkLAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgcHVzaF9zY3FlKG5zX2RldiAqIGNhcmQsIHZjX21hcCAqIHZjLCBzY3FfaW5mbyAqIHNjcSwgbnNfc2NxZSAqIHRiZCwKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgIG5zX3NjcWUgdHNyOwotICAgdTMyIHNjZGksIHNjcWk7Ci0gICBpbnQgc2NxX2lzX3ZicjsKLSAgIHUzMiBkYXRhOwotICAgaW50IGluZGV4OwotICAgCi0gICBzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICB3aGlsZSAoc2NxLT50YWlsID09IHNjcS0+bmV4dCkKLSAgIHsKLSAgICAgIGlmIChpbl9pbnRlcnJ1cHQoKSkgewotICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogRXJyb3IgcHVzaGluZyBUQkQuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW5zX3NjcWUgdHNyOworCXUzMiBzY2RpLCBzY3FpOworCWludCBzY3FfaXNfdmJyOworCXUzMiBkYXRhOworCWludCBpbmRleDsKIAotICAgICAgc2NxLT5mdWxsID0gMTsKLSAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOwotICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzY3EtPnNjcWZ1bGxfd2FpdHEsIFNDUUZVTExfVElNRU9VVCk7Ci0gICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjcS0+bG9jaywgZmxhZ3MpOworCXdoaWxlIChzY3EtPnRhaWwgPT0gc2NxLT5uZXh0KSB7CisJCWlmIChpbl9pbnRlcnJ1cHQoKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCQlwcmludGsoIm5pY3N0YXIlZDogRXJyb3IgcHVzaGluZyBUQkQuXG4iLCBjYXJkLT5pbmRleCk7CisJCQlyZXR1cm4gMTsKKwkJfQogCi0gICAgICBpZiAoc2NxLT5mdWxsKSB7Ci0gICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3EtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgIHByaW50aygibmljc3RhciVkOiBUaW1lb3V0IHB1c2hpbmcgVEJELlxuIiwgY2FyZC0+aW5kZXgpOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICB9Ci0gICAqc2NxLT5uZXh0ID0gKnRiZDsKLSAgIGluZGV4ID0gKGludCkgKHNjcS0+bmV4dCAtIHNjcS0+YmFzZSk7Ci0gICBzY3EtPnNrYltpbmRleF0gPSBza2I7Ci0gICBYUFJJTlRLKCJuaWNzdGFyJWQ6IHNlbmRpbmcgc2tiIGF0IDB4JXggKHBvcyAlZCkuXG4iLAotICAgICAgICAgICBjYXJkLT5pbmRleCwgKHUzMikgc2tiLCBpbmRleCk7Ci0gICBYUFJJTlRLKCJuaWNzdGFyJWQ6IFRCRCB3cml0dGVuOlxuMHgleFxuMHgleFxuMHgleFxuMHgleFxuIGF0IDB4JXguXG4iLAotICAgICAgICAgICBjYXJkLT5pbmRleCwgbGUzMl90b19jcHUodGJkLT53b3JkXzEpLCBsZTMyX3RvX2NwdSh0YmQtPndvcmRfMiksCi0gICAgICAgICAgIGxlMzJfdG9fY3B1KHRiZC0+d29yZF8zKSwgbGUzMl90b19jcHUodGJkLT53b3JkXzQpLAotICAgICAgICAgICAodTMyKSBzY3EtPm5leHQpOwotICAgaWYgKHNjcS0+bmV4dCA9PSBzY3EtPmxhc3QpCi0gICAgICBzY3EtPm5leHQgPSBzY3EtPmJhc2U7Ci0gICBlbHNlCi0gICAgICBzY3EtPm5leHQrKzsKKwkJc2NxLT5mdWxsID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmc2NxLT5zY3FmdWxsX3dhaXRxLAorCQkJCQkgICAgICAgU0NRRlVMTF9USU1FT1VUKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjcS0+bG9jaywgZmxhZ3MpOwogCi0gICB2Yy0+dGJkX2NvdW50Kys7Ci0gICBpZiAoc2NxLT5udW1fZW50cmllcyA9PSBWQlJfU0NRX05VTV9FTlRSSUVTKQotICAgewotICAgICAgc2NxLT50YmRfY291bnQrKzsKLSAgICAgIHNjcV9pc192YnIgPSAxOwotICAgfQotICAgZWxzZQotICAgICAgc2NxX2lzX3ZiciA9IDA7CisJCWlmIChzY3EtPmZ1bGwpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOworCQkJcHJpbnRrKCJuaWNzdGFyJWQ6IFRpbWVvdXQgcHVzaGluZyBUQkQuXG4iLAorCQkJICAgICAgIGNhcmQtPmluZGV4KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCSpzY3EtPm5leHQgPSAqdGJkOworCWluZGV4ID0gKGludCkoc2NxLT5uZXh0IC0gc2NxLT5iYXNlKTsKKwlzY3EtPnNrYltpbmRleF0gPSBza2I7CisJWFBSSU5USygibmljc3RhciVkOiBzZW5kaW5nIHNrYiBhdCAweCVwIChwb3MgJWQpLlxuIiwKKwkJY2FyZC0+aW5kZXgsIHNrYiwgaW5kZXgpOworCVhQUklOVEsoIm5pY3N0YXIlZDogVEJEIHdyaXR0ZW46XG4weCV4XG4weCV4XG4weCV4XG4weCV4XG4gYXQgMHglcC5cbiIsCisJCWNhcmQtPmluZGV4LCBsZTMyX3RvX2NwdSh0YmQtPndvcmRfMSksIGxlMzJfdG9fY3B1KHRiZC0+d29yZF8yKSwKKwkJbGUzMl90b19jcHUodGJkLT53b3JkXzMpLCBsZTMyX3RvX2NwdSh0YmQtPndvcmRfNCksCisJCXNjcS0+bmV4dCk7CisJaWYgKHNjcS0+bmV4dCA9PSBzY3EtPmxhc3QpCisJCXNjcS0+bmV4dCA9IHNjcS0+YmFzZTsKKwllbHNlCisJCXNjcS0+bmV4dCsrOwogCi0gICBpZiAodmMtPnRiZF9jb3VudCA+PSBNQVhfVEJEX1BFUl9WQyB8fCBzY3EtPnRiZF9jb3VudCA+PSBNQVhfVEJEX1BFUl9TQ1EpCi0gICB7Ci0gICAgICBpbnQgaGFzX3J1biA9IDA7CisJdmMtPnRiZF9jb3VudCsrOworCWlmIChzY3EtPm51bV9lbnRyaWVzID09IFZCUl9TQ1FfTlVNX0VOVFJJRVMpIHsKKwkJc2NxLT50YmRfY291bnQrKzsKKwkJc2NxX2lzX3ZiciA9IDE7CisJfSBlbHNlCisJCXNjcV9pc192YnIgPSAwOwogCi0gICAgICB3aGlsZSAoc2NxLT50YWlsID09IHNjcS0+bmV4dCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChpbl9pbnRlcnJ1cHQoKSkgewotICAgICAgICAgICAgZGF0YSA9ICh1MzIpIHZpcnRfdG9fYnVzKHNjcS0+bmV4dCk7Ci0gICAgICAgICAgICBuc193cml0ZV9zcmFtKGNhcmQsIHNjcS0+c2NkLCAmZGF0YSwgMSk7Ci0gICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3EtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgIHByaW50aygibmljc3RhciVkOiBFcnJvciBwdXNoaW5nIFRTUi5cbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgfQorCWlmICh2Yy0+dGJkX2NvdW50ID49IE1BWF9UQkRfUEVSX1ZDCisJICAgIHx8IHNjcS0+dGJkX2NvdW50ID49IE1BWF9UQkRfUEVSX1NDUSkgeworCQlpbnQgaGFzX3J1biA9IDA7CiAKLSAgICAgICAgIHNjcS0+ZnVsbCA9IDE7Ci0gICAgICAgICBpZiAoaGFzX3J1bisrKSBicmVhazsKLSAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzY3EtPnNjcWZ1bGxfd2FpdHEsIFNDUUZVTExfVElNRU9VVCk7Ci0gICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICAgICB9CisJCXdoaWxlIChzY3EtPnRhaWwgPT0gc2NxLT5uZXh0KSB7CisJCQlpZiAoaW5faW50ZXJydXB0KCkpIHsKKwkJCQlkYXRhID0gc2NxX3ZpcnRfdG9fYnVzKHNjcSwgc2NxLT5uZXh0KTsKKwkJCQluc193cml0ZV9zcmFtKGNhcmQsIHNjcS0+c2NkLCAmZGF0YSwgMSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCQkJcHJpbnRrKCJuaWNzdGFyJWQ6IEVycm9yIHB1c2hpbmcgVFNSLlxuIiwKKwkJCQkgICAgICAgY2FyZC0+aW5kZXgpOworCQkJCXJldHVybiAwOworCQkJfQogCi0gICAgICBpZiAoIXNjcS0+ZnVsbCkKLSAgICAgIHsKLSAgICAgICAgIHRzci53b3JkXzEgPSBuc190c3JfbWt3b3JkXzEoTlNfVFNSX0lOVEVOQUJMRSk7Ci0gICAgICAgICBpZiAoc2NxX2lzX3ZicikKLSAgICAgICAgICAgIHNjZGkgPSBOU19UU1JfU0NESVNWQlI7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBzY2RpID0gKHZjLT5jYnJfc2NkIC0gTlNfRlJTQ0QpIC8gTlNfRlJTQ0RfU0laRTsKLSAgICAgICAgIHNjcWkgPSBzY3EtPm5leHQgLSBzY3EtPmJhc2U7Ci0gICAgICAgICB0c3Iud29yZF8yID0gbnNfdHNyX21rd29yZF8yKHNjZGksIHNjcWkpOwotICAgICAgICAgdHNyLndvcmRfMyA9IDB4MDAwMDAwMDA7Ci0gICAgICAgICB0c3Iud29yZF80ID0gMHgwMDAwMDAwMDsKKwkJCXNjcS0+ZnVsbCA9IDE7CisJCQlpZiAoaGFzX3J1bisrKQorCQkJCWJyZWFrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnNjcS0+c2NxZnVsbF93YWl0cSwKKwkJCQkJCSAgICAgICBTQ1FGVUxMX1RJTUVPVVQpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjcS0+bG9jaywgZmxhZ3MpOworCQl9CiAKLSAgICAgICAgICpzY3EtPm5leHQgPSB0c3I7Ci0gICAgICAgICBpbmRleCA9IChpbnQpIHNjcWk7Ci0gICAgICAgICBzY3EtPnNrYltpbmRleF0gPSBOVUxMOwotICAgICAgICAgWFBSSU5USygibmljc3RhciVkOiBUU1Igd3JpdHRlbjpcbjB4JXhcbjB4JXhcbjB4JXhcbjB4JXhcbiBhdCAweCV4LlxuIiwKLSAgICAgICAgICAgICAgICAgY2FyZC0+aW5kZXgsIGxlMzJfdG9fY3B1KHRzci53b3JkXzEpLCBsZTMyX3RvX2NwdSh0c3Iud29yZF8yKSwKLSAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUodHNyLndvcmRfMyksIGxlMzJfdG9fY3B1KHRzci53b3JkXzQpLAotCQkgKHUzMikgc2NxLT5uZXh0KTsKLSAgICAgICAgIGlmIChzY3EtPm5leHQgPT0gc2NxLT5sYXN0KQotICAgICAgICAgICAgc2NxLT5uZXh0ID0gc2NxLT5iYXNlOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2NxLT5uZXh0Kys7Ci0gICAgICAgICB2Yy0+dGJkX2NvdW50ID0gMDsKLSAgICAgICAgIHNjcS0+dGJkX2NvdW50ID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIFBSSU5USygibmljc3RhciVkOiBUaW1lb3V0IHB1c2hpbmcgVFNSLlxuIiwgY2FyZC0+aW5kZXgpOwotICAgfQotICAgZGF0YSA9ICh1MzIpIHZpcnRfdG9fYnVzKHNjcS0+bmV4dCk7Ci0gICBuc193cml0ZV9zcmFtKGNhcmQsIHNjcS0+c2NkLCAmZGF0YSwgMSk7Ci0gICAKLSAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOwotICAgCi0gICByZXR1cm4gMDsKKwkJaWYgKCFzY3EtPmZ1bGwpIHsKKwkJCXRzci53b3JkXzEgPSBuc190c3JfbWt3b3JkXzEoTlNfVFNSX0lOVEVOQUJMRSk7CisJCQlpZiAoc2NxX2lzX3ZicikKKwkJCQlzY2RpID0gTlNfVFNSX1NDRElTVkJSOworCQkJZWxzZQorCQkJCXNjZGkgPSAodmMtPmNicl9zY2QgLSBOU19GUlNDRCkgLyBOU19GUlNDRF9TSVpFOworCQkJc2NxaSA9IHNjcS0+bmV4dCAtIHNjcS0+YmFzZTsKKwkJCXRzci53b3JkXzIgPSBuc190c3JfbWt3b3JkXzIoc2NkaSwgc2NxaSk7CisJCQl0c3Iud29yZF8zID0gMHgwMDAwMDAwMDsKKwkJCXRzci53b3JkXzQgPSAweDAwMDAwMDAwOworCisJCQkqc2NxLT5uZXh0ID0gdHNyOworCQkJaW5kZXggPSAoaW50KXNjcWk7CisJCQlzY3EtPnNrYltpbmRleF0gPSBOVUxMOworCQkJWFBSSU5USworCQkJICAgICgibmljc3RhciVkOiBUU1Igd3JpdHRlbjpcbjB4JXhcbjB4JXhcbjB4JXhcbjB4JXhcbiBhdCAweCVwLlxuIiwKKwkJCSAgICAgY2FyZC0+aW5kZXgsIGxlMzJfdG9fY3B1KHRzci53b3JkXzEpLAorCQkJICAgICBsZTMyX3RvX2NwdSh0c3Iud29yZF8yKSwgbGUzMl90b19jcHUodHNyLndvcmRfMyksCisJCQkgICAgIGxlMzJfdG9fY3B1KHRzci53b3JkXzQpLCBzY3EtPm5leHQpOworCQkJaWYgKHNjcS0+bmV4dCA9PSBzY3EtPmxhc3QpCisJCQkJc2NxLT5uZXh0ID0gc2NxLT5iYXNlOworCQkJZWxzZQorCQkJCXNjcS0+bmV4dCsrOworCQkJdmMtPnRiZF9jb3VudCA9IDA7CisJCQlzY3EtPnRiZF9jb3VudCA9IDA7CisJCX0gZWxzZQorCQkJUFJJTlRLKCJuaWNzdGFyJWQ6IFRpbWVvdXQgcHVzaGluZyBUU1IuXG4iLAorCQkJICAgICAgIGNhcmQtPmluZGV4KTsKKwl9CisJZGF0YSA9IHNjcV92aXJ0X3RvX2J1cyhzY3EsIHNjcS0+bmV4dCk7CisJbnNfd3JpdGVfc3JhbShjYXJkLCBzY3EtPnNjZCwgJmRhdGEsIDEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NxLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfdHNxKG5zX2RldiAqY2FyZCkKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdHNxKG5zX2RldiAqIGNhcmQpCiB7Ci0gICB1MzIgc2NkaTsKLSAgIHNjcV9pbmZvICpzY3E7Ci0gICBuc190c2kgKnByZXZpb3VzID0gTlVMTCwgKm9uZV9haGVhZCwgKnR3b19haGVhZDsKLSAgIGludCBzZXJ2aWNlZF9lbnRyaWVzOyAgIC8qIGZsYWcgaW5kaWNhdGluZyBhdCBsZWFzdCBvbiBlbnRyeSB3YXMgc2VydmljZWQgKi8KLSAgIAotICAgc2VydmljZWRfZW50cmllcyA9IDA7Ci0gICAKLSAgIGlmIChjYXJkLT50c3EubmV4dCA9PSBjYXJkLT50c3EubGFzdCkKLSAgICAgIG9uZV9haGVhZCA9IGNhcmQtPnRzcS5iYXNlOwotICAgZWxzZQotICAgICAgb25lX2FoZWFkID0gY2FyZC0+dHNxLm5leHQgKyAxOworCXUzMiBzY2RpOworCXNjcV9pbmZvICpzY3E7CisJbnNfdHNpICpwcmV2aW91cyA9IE5VTEwsICpvbmVfYWhlYWQsICp0d29fYWhlYWQ7CisJaW50IHNlcnZpY2VkX2VudHJpZXM7CS8qIGZsYWcgaW5kaWNhdGluZyBhdCBsZWFzdCBvbiBlbnRyeSB3YXMgc2VydmljZWQgKi8KIAotICAgaWYgKG9uZV9haGVhZCA9PSBjYXJkLT50c3EubGFzdCkKLSAgICAgIHR3b19haGVhZCA9IGNhcmQtPnRzcS5iYXNlOwotICAgZWxzZQotICAgICAgdHdvX2FoZWFkID0gb25lX2FoZWFkICsgMTsKLSAgIAotICAgd2hpbGUgKCFuc190c2lfaXNlbXB0eShjYXJkLT50c3EubmV4dCkgfHwgIW5zX3RzaV9pc2VtcHR5KG9uZV9haGVhZCkgfHwKLSAgICAgICAgICAhbnNfdHNpX2lzZW1wdHkodHdvX2FoZWFkKSkKLSAgICAgICAgICAvKiBBdCBtb3N0IHR3byBlbXB0eSwgYXMgc3RhdGVkIGluIHRoZSA3NzIwMSBlcnJhdGEgKi8KLSAgIHsKLSAgICAgIHNlcnZpY2VkX2VudHJpZXMgPSAxOwotICAgIAotICAgICAgLyogU2tpcCB0aGUgb25lIG9yIHR3byBwb3NzaWJsZSBlbXB0eSBlbnRyaWVzICovCi0gICAgICB3aGlsZSAobnNfdHNpX2lzZW1wdHkoY2FyZC0+dHNxLm5leHQpKSB7Ci0gICAgICAgICBpZiAoY2FyZC0+dHNxLm5leHQgPT0gY2FyZC0+dHNxLmxhc3QpCi0gICAgICAgICAgICBjYXJkLT50c3EubmV4dCA9IGNhcmQtPnRzcS5iYXNlOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgY2FyZC0+dHNxLm5leHQrKzsKLSAgICAgIH0KLSAgICAKLSAgICAgIGlmICghbnNfdHNpX3Rtcm9mKGNhcmQtPnRzcS5uZXh0KSkKLSAgICAgIHsKLSAgICAgICAgIHNjZGkgPSBuc190c2lfZ2V0c2NkaW5kZXgoY2FyZC0+dHNxLm5leHQpOwotCSBpZiAoc2NkaSA9PSBOU19UU0lfU0NESVNWQlIpCi0JICAgIHNjcSA9IGNhcmQtPnNjcTA7Ci0JIGVsc2UKLQkgewotCSAgICBpZiAoY2FyZC0+c2NkMnZjW3NjZGldID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGNvdWxkIG5vdCBmaW5kIFZDIGZyb20gU0NEIGluZGV4LlxuIiwKLQkgICAgICAgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgICAgICAgICAgICAgIG5zX3RzaV9pbml0KGNhcmQtPnRzcS5uZXh0KTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjcSA9IGNhcmQtPnNjZDJ2Y1tzY2RpXS0+c2NxOwotICAgICAgICAgfQotICAgICAgICAgZHJhaW5fc2NxKGNhcmQsIHNjcSwgbnNfdHNpX2dldHNjcXBvcyhjYXJkLT50c3EubmV4dCkpOwotICAgICAgICAgc2NxLT5mdWxsID0gMDsKLSAgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHNjcS0+c2NxZnVsbF93YWl0cSkpOwotICAgICAgfQorCXNlcnZpY2VkX2VudHJpZXMgPSAwOwogCi0gICAgICBuc190c2lfaW5pdChjYXJkLT50c3EubmV4dCk7Ci0gICAgICBwcmV2aW91cyA9IGNhcmQtPnRzcS5uZXh0OwotICAgICAgaWYgKGNhcmQtPnRzcS5uZXh0ID09IGNhcmQtPnRzcS5sYXN0KQotICAgICAgICAgY2FyZC0+dHNxLm5leHQgPSBjYXJkLT50c3EuYmFzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgIGNhcmQtPnRzcS5uZXh0Kys7CisJaWYgKGNhcmQtPnRzcS5uZXh0ID09IGNhcmQtPnRzcS5sYXN0KQorCQlvbmVfYWhlYWQgPSBjYXJkLT50c3EuYmFzZTsKKwllbHNlCisJCW9uZV9haGVhZCA9IGNhcmQtPnRzcS5uZXh0ICsgMTsKIAotICAgICAgaWYgKGNhcmQtPnRzcS5uZXh0ID09IGNhcmQtPnRzcS5sYXN0KQotICAgICAgICAgb25lX2FoZWFkID0gY2FyZC0+dHNxLmJhc2U7Ci0gICAgICBlbHNlCi0gICAgICAgICBvbmVfYWhlYWQgPSBjYXJkLT50c3EubmV4dCArIDE7CisJaWYgKG9uZV9haGVhZCA9PSBjYXJkLT50c3EubGFzdCkKKwkJdHdvX2FoZWFkID0gY2FyZC0+dHNxLmJhc2U7CisJZWxzZQorCQl0d29fYWhlYWQgPSBvbmVfYWhlYWQgKyAxOwogCi0gICAgICBpZiAob25lX2FoZWFkID09IGNhcmQtPnRzcS5sYXN0KQotICAgICAgICAgdHdvX2FoZWFkID0gY2FyZC0+dHNxLmJhc2U7Ci0gICAgICBlbHNlCi0gICAgICAgICB0d29fYWhlYWQgPSBvbmVfYWhlYWQgKyAxOwotICAgfQorCXdoaWxlICghbnNfdHNpX2lzZW1wdHkoY2FyZC0+dHNxLm5leHQpIHx8ICFuc190c2lfaXNlbXB0eShvbmVfYWhlYWQpIHx8CisJICAgICAgICFuc190c2lfaXNlbXB0eSh0d29fYWhlYWQpKQorCQkvKiBBdCBtb3N0IHR3byBlbXB0eSwgYXMgc3RhdGVkIGluIHRoZSA3NzIwMSBlcnJhdGEgKi8KKwl7CisJCXNlcnZpY2VkX2VudHJpZXMgPSAxOwogCi0gICBpZiAoc2VydmljZWRfZW50cmllcykgewotICAgICAgd3JpdGVsKCgoKHUzMikgcHJldmlvdXMpIC0gKCh1MzIpIGNhcmQtPnRzcS5iYXNlKSksCi0gICAgICAgICAgICAgY2FyZC0+bWVtYmFzZSArIFRTUUgpOwotICAgfQorCQkvKiBTa2lwIHRoZSBvbmUgb3IgdHdvIHBvc3NpYmxlIGVtcHR5IGVudHJpZXMgKi8KKwkJd2hpbGUgKG5zX3RzaV9pc2VtcHR5KGNhcmQtPnRzcS5uZXh0KSkgeworCQkJaWYgKGNhcmQtPnRzcS5uZXh0ID09IGNhcmQtPnRzcS5sYXN0KQorCQkJCWNhcmQtPnRzcS5uZXh0ID0gY2FyZC0+dHNxLmJhc2U7CisJCQllbHNlCisJCQkJY2FyZC0+dHNxLm5leHQrKzsKKwkJfQorCisJCWlmICghbnNfdHNpX3Rtcm9mKGNhcmQtPnRzcS5uZXh0KSkgeworCQkJc2NkaSA9IG5zX3RzaV9nZXRzY2RpbmRleChjYXJkLT50c3EubmV4dCk7CisJCQlpZiAoc2NkaSA9PSBOU19UU0lfU0NESVNWQlIpCisJCQkJc2NxID0gY2FyZC0+c2NxMDsKKwkJCWVsc2UgeworCQkJCWlmIChjYXJkLT5zY2QydmNbc2NkaV0gPT0gTlVMTCkgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgibmljc3RhciVkOiBjb3VsZCBub3QgZmluZCBWQyBmcm9tIFNDRCBpbmRleC5cbiIsCisJCQkJCSAgICAgY2FyZC0+aW5kZXgpOworCQkJCQluc190c2lfaW5pdChjYXJkLT50c3EubmV4dCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJc2NxID0gY2FyZC0+c2NkMnZjW3NjZGldLT5zY3E7CisJCQl9CisJCQlkcmFpbl9zY3EoY2FyZCwgc2NxLCBuc190c2lfZ2V0c2NxcG9zKGNhcmQtPnRzcS5uZXh0KSk7CisJCQlzY3EtPmZ1bGwgPSAwOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYoc2NxLT5zY3FmdWxsX3dhaXRxKSk7CisJCX0KKworCQluc190c2lfaW5pdChjYXJkLT50c3EubmV4dCk7CisJCXByZXZpb3VzID0gY2FyZC0+dHNxLm5leHQ7CisJCWlmIChjYXJkLT50c3EubmV4dCA9PSBjYXJkLT50c3EubGFzdCkKKwkJCWNhcmQtPnRzcS5uZXh0ID0gY2FyZC0+dHNxLmJhc2U7CisJCWVsc2UKKwkJCWNhcmQtPnRzcS5uZXh0Kys7CisKKwkJaWYgKGNhcmQtPnRzcS5uZXh0ID09IGNhcmQtPnRzcS5sYXN0KQorCQkJb25lX2FoZWFkID0gY2FyZC0+dHNxLmJhc2U7CisJCWVsc2UKKwkJCW9uZV9haGVhZCA9IGNhcmQtPnRzcS5uZXh0ICsgMTsKKworCQlpZiAob25lX2FoZWFkID09IGNhcmQtPnRzcS5sYXN0KQorCQkJdHdvX2FoZWFkID0gY2FyZC0+dHNxLmJhc2U7CisJCWVsc2UKKwkJCXR3b19haGVhZCA9IG9uZV9haGVhZCArIDE7CisJfQorCisJaWYgKHNlcnZpY2VkX2VudHJpZXMpCisJCXdyaXRlbChQVFJfRElGRihwcmV2aW91cywgY2FyZC0+dHNxLmJhc2UpLAorCQkgICAgICAgY2FyZC0+bWVtYmFzZSArIFRTUUgpOwogfQogCi0KLQotc3RhdGljIHZvaWQgZHJhaW5fc2NxKG5zX2RldiAqY2FyZCwgc2NxX2luZm8gKnNjcSwgaW50IHBvcykKK3N0YXRpYyB2b2lkIGRyYWluX3NjcShuc19kZXYgKiBjYXJkLCBzY3FfaW5mbyAqIHNjcSwgaW50IHBvcykKIHsKLSAgIHN0cnVjdCBhdG1fdmNjICp2Y2M7Ci0gICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotICAgaW50IGk7Ci0gICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgCi0gICBYUFJJTlRLKCJuaWNzdGFyJWQ6IGRyYWluX3NjcSgpIGNhbGxlZCwgc2NxIGF0IDB4JXgsIHBvcyAlZC5cbiIsCi0gICAgICAgICAgIGNhcmQtPmluZGV4LCAodTMyKSBzY3EsIHBvcyk7Ci0gICBpZiAocG9zID49IHNjcS0+bnVtX2VudHJpZXMpCi0gICB7Ci0gICAgICBwcmludGsoIm5pY3N0YXIlZDogQmFkIGluZGV4IG9uIGRyYWluX3NjcSgpLlxuIiwgY2FyZC0+aW5kZXgpOwotICAgICAgcmV0dXJuOwotICAgfQorCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICBzcGluX2xvY2tfaXJxc2F2ZSgmc2NxLT5sb2NrLCBmbGFncyk7Ci0gICBpID0gKGludCkgKHNjcS0+dGFpbCAtIHNjcS0+YmFzZSk7Ci0gICBpZiAoKytpID09IHNjcS0+bnVtX2VudHJpZXMpCi0gICAgICBpID0gMDsKLSAgIHdoaWxlIChpICE9IHBvcykKLSAgIHsKLSAgICAgIHNrYiA9IHNjcS0+c2tiW2ldOwotICAgICAgWFBSSU5USygibmljc3RhciVkOiBmcmVlaW5nIHNrYiBhdCAweCV4IChpbmRleCAlZCkuXG4iLAotICAgICAgICAgICAgICBjYXJkLT5pbmRleCwgKHUzMikgc2tiLCBpKTsKLSAgICAgIGlmIChza2IgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHZjYyA9IEFUTV9TS0Ioc2tiKS0+dmNjOwotCSBpZiAodmNjICYmIHZjYy0+cG9wICE9IE5VTEwpIHsKLQkgICAgdmNjLT5wb3AodmNjLCBza2IpOwotCSB9IGVsc2UgewotCSAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotICAgICAgICAgfQotCSBzY3EtPnNrYltpXSA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBpZiAoKytpID09IHNjcS0+bnVtX2VudHJpZXMpCi0gICAgICAgICBpID0gMDsKLSAgIH0KLSAgIHNjcS0+dGFpbCA9IHNjcS0+YmFzZSArIHBvczsKLSAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjcS0+bG9jaywgZmxhZ3MpOworCVhQUklOVEsoIm5pY3N0YXIlZDogZHJhaW5fc2NxKCkgY2FsbGVkLCBzY3EgYXQgMHglcCwgcG9zICVkLlxuIiwKKwkJY2FyZC0+aW5kZXgsIHNjcSwgcG9zKTsKKwlpZiAocG9zID49IHNjcS0+bnVtX2VudHJpZXMpIHsKKwkJcHJpbnRrKCJuaWNzdGFyJWQ6IEJhZCBpbmRleCBvbiBkcmFpbl9zY3EoKS5cbiIsIGNhcmQtPmluZGV4KTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY3EtPmxvY2ssIGZsYWdzKTsKKwlpID0gKGludCkoc2NxLT50YWlsIC0gc2NxLT5iYXNlKTsKKwlpZiAoKytpID09IHNjcS0+bnVtX2VudHJpZXMpCisJCWkgPSAwOworCXdoaWxlIChpICE9IHBvcykgeworCQlza2IgPSBzY3EtPnNrYltpXTsKKwkJWFBSSU5USygibmljc3RhciVkOiBmcmVlaW5nIHNrYiBhdCAweCVwIChpbmRleCAlZCkuXG4iLAorCQkJY2FyZC0+aW5kZXgsIHNrYiwgaSk7CisJCWlmIChza2IgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wY2lkZXYsCisJCQkJCSBOU19QUlZfRE1BKHNrYiksCisJCQkJCSBza2ItPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJdmNjID0gQVRNX1NLQihza2IpLT52Y2M7CisJCQlpZiAodmNjICYmIHZjYy0+cG9wICE9IE5VTEwpIHsKKwkJCQl2Y2MtPnBvcCh2Y2MsIHNrYik7CisJCQl9IGVsc2UgeworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQl9CisJCQlzY3EtPnNrYltpXSA9IE5VTEw7CisJCX0KKwkJaWYgKCsraSA9PSBzY3EtPm51bV9lbnRyaWVzKQorCQkJaSA9IDA7CisJfQorCXNjcS0+dGFpbCA9IHNjcS0+YmFzZSArIHBvczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3EtPmxvY2ssIGZsYWdzKTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfcnNxKG5zX2RldiAqY2FyZCkKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcnNxKG5zX2RldiAqIGNhcmQpCiB7Ci0gICBuc19yc3FlICpwcmV2aW91czsKKwluc19yc3FlICpwcmV2aW91czsKIAotICAgaWYgKCFuc19yc3FlX3ZhbGlkKGNhcmQtPnJzcS5uZXh0KSkKLSAgICAgIHJldHVybjsKLSAgIGRvIHsKLSAgICAgIGRlcXVldWVfcngoY2FyZCwgY2FyZC0+cnNxLm5leHQpOwotICAgICAgbnNfcnNxZV9pbml0KGNhcmQtPnJzcS5uZXh0KTsKLSAgICAgIHByZXZpb3VzID0gY2FyZC0+cnNxLm5leHQ7Ci0gICAgICBpZiAoY2FyZC0+cnNxLm5leHQgPT0gY2FyZC0+cnNxLmxhc3QpCi0gICAgICAgICBjYXJkLT5yc3EubmV4dCA9IGNhcmQtPnJzcS5iYXNlOwotICAgICAgZWxzZQotICAgICAgICAgY2FyZC0+cnNxLm5leHQrKzsKLSAgIH0gd2hpbGUgKG5zX3JzcWVfdmFsaWQoY2FyZC0+cnNxLm5leHQpKTsKLSAgIHdyaXRlbCgoKCh1MzIpIHByZXZpb3VzKSAtICgodTMyKSBjYXJkLT5yc3EuYmFzZSkpLAotICAgICAgICAgIGNhcmQtPm1lbWJhc2UgKyBSU1FIKTsKKwlpZiAoIW5zX3JzcWVfdmFsaWQoY2FyZC0+cnNxLm5leHQpKQorCQlyZXR1cm47CisJZG8geworCQlkZXF1ZXVlX3J4KGNhcmQsIGNhcmQtPnJzcS5uZXh0KTsKKwkJbnNfcnNxZV9pbml0KGNhcmQtPnJzcS5uZXh0KTsKKwkJcHJldmlvdXMgPSBjYXJkLT5yc3EubmV4dDsKKwkJaWYgKGNhcmQtPnJzcS5uZXh0ID09IGNhcmQtPnJzcS5sYXN0KQorCQkJY2FyZC0+cnNxLm5leHQgPSBjYXJkLT5yc3EuYmFzZTsKKwkJZWxzZQorCQkJY2FyZC0+cnNxLm5leHQrKzsKKwl9IHdoaWxlIChuc19yc3FlX3ZhbGlkKGNhcmQtPnJzcS5uZXh0KSk7CisJd3JpdGVsKFBUUl9ESUZGKHByZXZpb3VzLCBjYXJkLT5yc3EuYmFzZSksIGNhcmQtPm1lbWJhc2UgKyBSU1FIKTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGRlcXVldWVfcngobnNfZGV2ICpjYXJkLCBuc19yc3FlICpyc3FlKQorc3RhdGljIHZvaWQgZGVxdWV1ZV9yeChuc19kZXYgKiBjYXJkLCBuc19yc3FlICogcnNxZSkKIHsKLSAgIHUzMiB2cGksIHZjaTsKLSAgIHZjX21hcCAqdmM7Ci0gICBzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKLSAgIHN0cnVjdCBpb3ZlYyAqaW92OwotICAgc3RydWN0IGF0bV92Y2MgKnZjYzsKLSAgIHN0cnVjdCBza19idWZmICpza2I7Ci0gICB1bnNpZ25lZCBzaG9ydCBhYWw1X2xlbjsKLSAgIGludCBsZW47Ci0gICB1MzIgc3RhdDsKKwl1MzIgdnBpLCB2Y2k7CisJdmNfbWFwICp2YzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKKwlzdHJ1Y3QgaW92ZWMgKmlvdjsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgc2hvcnQgYWFsNV9sZW47CisJaW50IGxlbjsKKwl1MzIgc3RhdDsKKwl1MzIgaWQ7CiAKLSAgIHN0YXQgPSByZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICBjYXJkLT5zYmZxYyA9IG5zX3N0YXRfc2ZicWNfZ2V0KHN0YXQpOyAgIAotICAgY2FyZC0+bGJmcWMgPSBuc19zdGF0X2xmYnFjX2dldChzdGF0KTsKKwlzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCWNhcmQtPnNiZnFjID0gbnNfc3RhdF9zZmJxY19nZXQoc3RhdCk7CisJY2FyZC0+bGJmcWMgPSBuc19zdGF0X2xmYnFjX2dldChzdGF0KTsKIAotICAgc2tiID0gKHN0cnVjdCBza19idWZmICopIGxlMzJfdG9fY3B1KHJzcWUtPmJ1ZmZlcl9oYW5kbGUpOwotICAgdnBpID0gbnNfcnNxZV92cGkocnNxZSk7Ci0gICB2Y2kgPSBuc19yc3FlX3ZjaShyc3FlKTsKLSAgIGlmICh2cGkgPj0gMVVMIDw8IGNhcmQtPnZwaWJpdHMgfHwgdmNpID49IDFVTCA8PCBjYXJkLT52Y2liaXRzKQotICAgewotICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IFNEVSByZWNlaXZlZCBmb3Igb3V0LW9mLXJhbmdlIHZjICVkLiVkLlxuIiwKLSAgICAgICAgICAgICBjYXJkLT5pbmRleCwgdnBpLCB2Y2kpOwotICAgICAgcmVjeWNsZV9yeF9idWYoY2FyZCwgc2tiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIAotICAgdmMgPSAmKGNhcmQtPnZjbWFwW3ZwaSA8PCBjYXJkLT52Y2liaXRzIHwgdmNpXSk7Ci0gICBpZiAoIXZjLT5yeCkKLSAgIHsKLSAgICAgIFJYUFJJTlRLKCJuaWNzdGFyJWQ6IFNEVSByZWNlaXZlZCBvbiBub24tcnggdmMgJWQuJWQuXG4iLAotICAgICAgICAgICAgIGNhcmQtPmluZGV4LCB2cGksIHZjaSk7Ci0gICAgICByZWN5Y2xlX3J4X2J1ZihjYXJkLCBza2IpOwotICAgICAgcmV0dXJuOwotICAgfQorCWlkID0gbGUzMl90b19jcHUocnNxZS0+YnVmZmVyX2hhbmRsZSk7CisJc2tiID0gaWRyX2ZpbmQoJmNhcmQtPmlkciwgaWQpOworCWlmICghc2tiKSB7CisJCVJYUFJJTlRLKEtFUk5fRVJSCisJCQkgIm5pY3N0YXIlZDogaWRyX2ZpbmQoKSBmYWlsZWQhXG4iLCBjYXJkLT5pbmRleCk7CisJCXJldHVybjsKKwl9CisJaWRyX3JlbW92ZSgmY2FyZC0+aWRyLCBpZCk7CisgICAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShjYXJkLT5wY2lkZXYsCisJCQkJICAgIE5TX1BSVl9ETUEoc2tiKSwKKwkJCQkgICAgKE5TX1BSVl9CVUZUWVBFKHNrYikgPT0gQlVGX1NNCisJCQkJICAgICA/IE5TX1NNU0tCU0laRSA6IE5TX0xHU0tCU0laRSksCisJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wY2lkZXYsCisJCQkgTlNfUFJWX0RNQShza2IpLAorCQkJIChOU19QUlZfQlVGVFlQRShza2IpID09IEJVRl9TTQorCQkJICA/IE5TX1NNU0tCU0laRSA6IE5TX0xHU0tCU0laRSksCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl2cGkgPSBuc19yc3FlX3ZwaShyc3FlKTsKKwl2Y2kgPSBuc19yc3FlX3ZjaShyc3FlKTsKKwlpZiAodnBpID49IDFVTCA8PCBjYXJkLT52cGliaXRzIHx8IHZjaSA+PSAxVUwgPDwgY2FyZC0+dmNpYml0cykgeworCQlwcmludGsoIm5pY3N0YXIlZDogU0RVIHJlY2VpdmVkIGZvciBvdXQtb2YtcmFuZ2UgdmMgJWQuJWQuXG4iLAorCQkgICAgICAgY2FyZC0+aW5kZXgsIHZwaSwgdmNpKTsKKwkJcmVjeWNsZV9yeF9idWYoY2FyZCwgc2tiKTsKKwkJcmV0dXJuOworCX0KIAotICAgdmNjID0gdmMtPnJ4X3ZjYzsKKwl2YyA9ICYoY2FyZC0+dmNtYXBbdnBpIDw8IGNhcmQtPnZjaWJpdHMgfCB2Y2ldKTsKKwlpZiAoIXZjLT5yeCkgeworCQlSWFBSSU5USygibmljc3RhciVkOiBTRFUgcmVjZWl2ZWQgb24gbm9uLXJ4IHZjICVkLiVkLlxuIiwKKwkJCSBjYXJkLT5pbmRleCwgdnBpLCB2Y2kpOworCQlyZWN5Y2xlX3J4X2J1ZihjYXJkLCBza2IpOworCQlyZXR1cm47CisJfQogCi0gICBpZiAodmNjLT5xb3MuYWFsID09IEFUTV9BQUwwKQotICAgewotICAgICAgc3RydWN0IHNrX2J1ZmYgKnNiOwotICAgICAgdW5zaWduZWQgY2hhciAqY2VsbDsKLSAgICAgIGludCBpOworCXZjYyA9IHZjLT5yeF92Y2M7CiAKLSAgICAgIGNlbGwgPSBza2ItPmRhdGE7Ci0gICAgICBmb3IgKGkgPSBuc19yc3FlX2NlbGxjb3VudChyc3FlKTsgaTsgaS0tKQotICAgICAgewotICAgICAgICAgaWYgKChzYiA9IGRldl9hbGxvY19za2IoTlNfU01TS0JTSVpFKSkgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygibmljc3RhciVkOiBDYW4ndCBhbGxvY2F0ZSBidWZmZXJzIGZvciBhYWwwLlxuIiwKLSAgICAgICAgICAgICAgICAgICBjYXJkLT5pbmRleCk7Ci0gICAgICAgICAgICBhdG9taWNfYWRkKGksJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoIWF0bV9jaGFyZ2UodmNjLCBzYi0+dHJ1ZXNpemUpKQotICAgICAgICAgewotICAgICAgICAgICAgUlhQUklOVEsoIm5pY3N0YXIlZDogYXRtX2NoYXJnZSgpIGRyb3BwZWQgYWFsMCBwYWNrZXRzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgICAgICAgICAgIGF0b21pY19hZGQoaS0xLCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsgLyogYWxyZWFkeSBpbmNyZWFzZWQgYnkgMSAqLwotICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBSZWJ1aWxkIHRoZSBoZWFkZXIgKi8KLSAgICAgICAgICooKHUzMiAqKSBzYi0+ZGF0YSkgPSBsZTMyX3RvX2NwdShyc3FlLT53b3JkXzEpIDw8IDQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuc19yc3FlX2NscChyc3FlKSA/IDB4MDAwMDAwMDEgOiAweDAwMDAwMDAwKTsKLSAgICAgICAgIGlmIChpID09IDEgJiYgbnNfcnNxZV9lb3BkdShyc3FlKSkKLSAgICAgICAgICAgICooKHUzMiAqKSBzYi0+ZGF0YSkgfD0gMHgwMDAwMDAwMjsKLSAgICAgICAgIHNrYl9wdXQoc2IsIE5TX0FBTDBfSEVBREVSKTsKLSAgICAgICAgIG1lbWNweShza2JfdGFpbF9wb2ludGVyKHNiKSwgY2VsbCwgQVRNX0NFTExfUEFZTE9BRCk7Ci0gICAgICAgICBza2JfcHV0KHNiLCBBVE1fQ0VMTF9QQVlMT0FEKTsKLSAgICAgICAgIEFUTV9TS0Ioc2IpLT52Y2MgPSB2Y2M7Ci0JIF9fbmV0X3RpbWVzdGFtcChzYik7Ci0gICAgICAgICB2Y2MtPnB1c2godmNjLCBzYik7Ci0gICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7Ci0gICAgICAgICBjZWxsICs9IEFUTV9DRUxMX1BBWUxPQUQ7Ci0gICAgICB9CisJaWYgKHZjYy0+cW9zLmFhbCA9PSBBVE1fQUFMMCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2I7CisJCXVuc2lnbmVkIGNoYXIgKmNlbGw7CisJCWludCBpOwogCi0gICAgICByZWN5Y2xlX3J4X2J1ZihjYXJkLCBza2IpOwotICAgICAgcmV0dXJuOwotICAgfQorCQljZWxsID0gc2tiLT5kYXRhOworCQlmb3IgKGkgPSBuc19yc3FlX2NlbGxjb3VudChyc3FlKTsgaTsgaS0tKSB7CisJCQlpZiAoKHNiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpKSA9PSBOVUxMKSB7CisJCQkJcHJpbnRrCisJCQkJICAgICgibmljc3RhciVkOiBDYW4ndCBhbGxvY2F0ZSBidWZmZXJzIGZvciBhYWwwLlxuIiwKKwkJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCQlhdG9taWNfYWRkKGksICZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghYXRtX2NoYXJnZSh2Y2MsIHNiLT50cnVlc2l6ZSkpIHsKKwkJCQlSWFBSSU5USworCQkJCSAgICAoIm5pY3N0YXIlZDogYXRtX2NoYXJnZSgpIGRyb3BwZWQgYWFsMCBwYWNrZXRzLlxuIiwKKwkJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCQlhdG9taWNfYWRkKGkgLSAxLCAmdmNjLT5zdGF0cy0+cnhfZHJvcCk7CS8qIGFscmVhZHkgaW5jcmVhc2VkIGJ5IDEgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShzYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBSZWJ1aWxkIHRoZSBoZWFkZXIgKi8KKwkJCSooKHUzMiAqKSBzYi0+ZGF0YSkgPSBsZTMyX3RvX2NwdShyc3FlLT53b3JkXzEpIDw8IDQgfAorCQkJICAgIChuc19yc3FlX2NscChyc3FlKSA/IDB4MDAwMDAwMDEgOiAweDAwMDAwMDAwKTsKKwkJCWlmIChpID09IDEgJiYgbnNfcnNxZV9lb3BkdShyc3FlKSkKKwkJCQkqKCh1MzIgKikgc2ItPmRhdGEpIHw9IDB4MDAwMDAwMDI7CisJCQlza2JfcHV0KHNiLCBOU19BQUwwX0hFQURFUik7CisJCQltZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihzYiksIGNlbGwsIEFUTV9DRUxMX1BBWUxPQUQpOworCQkJc2tiX3B1dChzYiwgQVRNX0NFTExfUEFZTE9BRCk7CisJCQlBVE1fU0tCKHNiKS0+dmNjID0gdmNjOworCQkJX19uZXRfdGltZXN0YW1wKHNiKTsKKwkJCXZjYy0+cHVzaCh2Y2MsIHNiKTsKKwkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4KTsKKwkJCWNlbGwgKz0gQVRNX0NFTExfUEFZTE9BRDsKKwkJfQogCi0gICAvKiBUbyByZWFjaCB0aGlzIHBvaW50LCB0aGUgQUFMIGxheWVyIGNhbiBvbmx5IGJlIEFBTDUgKi8KKwkJcmVjeWNsZV9yeF9idWYoY2FyZCwgc2tiKTsKKwkJcmV0dXJuOworCX0KIAotICAgaWYgKChpb3ZiID0gdmMtPnJ4X2lvdikgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGlvdmIgPSBza2JfZGVxdWV1ZSgmKGNhcmQtPmlvdnBvb2wucXVldWUpKTsKLSAgICAgIGlmIChpb3ZiID09IE5VTEwpCQkvKiBObyBidWZmZXJzIGluIHRoZSBxdWV1ZSAqLwotICAgICAgewotICAgICAgICAgaW92YiA9IGFsbG9jX3NrYihOU19JT1ZCVUZTSVpFLCBHRlBfQVRPTUlDKTsKLQkgaWYgKGlvdmIgPT0gTlVMTCkKLQkgewotCSAgICBwcmludGsoIm5pY3N0YXIlZDogT3V0IG9mIGlvdmVjIGJ1ZmZlcnMuXG4iLCBjYXJkLT5pbmRleCk7Ci0gICAgICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKLSAgICAgICAgICAgIHJlY3ljbGVfcnhfYnVmKGNhcmQsIHNrYik7Ci0gICAgICAgICAgICByZXR1cm47Ci0JIH0KLSAgICAgICAgIE5TX1NLQl9DQihpb3ZiKS0+YnVmX3R5cGUgPSBCVUZfTk9ORTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIGlmICgtLWNhcmQtPmlvdnBvb2wuY291bnQgPCBjYXJkLT5pb3Zuci5taW4pCi0JIHsKLQkgICAgc3RydWN0IHNrX2J1ZmYgKm5ld19pb3ZiOwotCSAgICBpZiAoKG5ld19pb3ZiID0gYWxsb2Nfc2tiKE5TX0lPVkJVRlNJWkUsIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQotCSAgICB7Ci0gICAgICAgICAgICAgICBOU19TS0JfQ0IoaW92YiktPmJ1Zl90eXBlID0gQlVGX05PTkU7Ci0gICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+aW92cG9vbC5xdWV1ZSwgbmV3X2lvdmIpOwotICAgICAgICAgICAgICAgY2FyZC0+aW92cG9vbC5jb3VudCsrOwotCSAgICB9Ci0JIH0KLSAgICAgIHZjLT5yeF9pb3YgPSBpb3ZiOwotICAgICAgTlNfU0tCKGlvdmIpLT5pb3ZjbnQgPSAwOwotICAgICAgaW92Yi0+bGVuID0gMDsKLSAgICAgIGlvdmItPmRhdGEgPSBpb3ZiLT5oZWFkOwotICAgICAgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihpb3ZiKTsKLSAgICAgIE5TX1NLQihpb3ZiKS0+dmNjID0gdmNjOwotICAgICAgLyogSU1QT1JUQU5UOiBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUgc21hbGwgb3IgbGFyZ2UKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlzIHN0b3JlZCBhcyBpb3ZlYyBiYXNlLCBOT1QgYSBwb2ludGVyIHRvIHRoZSAKLQkgICAgICAgICAgICBzbWFsbCBvciBsYXJnZSBidWZmZXIgaXRzZWxmLiAqLwotICAgfQotICAgZWxzZSBpZiAoTlNfU0tCKGlvdmIpLT5pb3ZjbnQgPj0gTlNfTUFYX0lPVkVDUykKLSAgIHsKLSAgICAgIHByaW50aygibmljc3RhciVkOiByZWNlaXZlZCB0b28gYmlnIEFBTDUgU0RVLlxuIiwgY2FyZC0+aW5kZXgpOwotICAgICAgYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKLSAgICAgIHJlY3ljbGVfaW92ZWNfcnhfYnVmcyhjYXJkLCAoc3RydWN0IGlvdmVjICopIGlvdmItPmRhdGEsIE5TX01BWF9JT1ZFQ1MpOwotICAgICAgTlNfU0tCKGlvdmIpLT5pb3ZjbnQgPSAwOwotICAgICAgaW92Yi0+bGVuID0gMDsKLSAgICAgIGlvdmItPmRhdGEgPSBpb3ZiLT5oZWFkOwotICAgICAgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihpb3ZiKTsKLSAgICAgIE5TX1NLQihpb3ZiKS0+dmNjID0gdmNjOwotICAgfQotICAgaW92ID0gJigoc3RydWN0IGlvdmVjICopIGlvdmItPmRhdGEpW05TX1NLQihpb3ZiKS0+aW92Y250KytdOwotICAgaW92LT5pb3ZfYmFzZSA9ICh2b2lkICopIHNrYjsKLSAgIGlvdi0+aW92X2xlbiA9IG5zX3JzcWVfY2VsbGNvdW50KHJzcWUpICogNDg7Ci0gICBpb3ZiLT5sZW4gKz0gaW92LT5pb3ZfbGVuOworCS8qIFRvIHJlYWNoIHRoaXMgcG9pbnQsIHRoZSBBQUwgbGF5ZXIgY2FuIG9ubHkgYmUgQUFMNSAqLwogCi0gICBpZiAoTlNfU0tCKGlvdmIpLT5pb3ZjbnQgPT0gMSkKLSAgIHsKLSAgICAgIGlmIChOU19TS0JfQ0Ioc2tiKS0+YnVmX3R5cGUgIT0gQlVGX1NNKQotICAgICAgewotICAgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IEV4cGVjdGVkIGEgc21hbGwgYnVmZmVyLCBhbmQgdGhpcyBpcyBub3Qgb25lLlxuIiwKLQkgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgICAgICAgIHdoaWNoX2xpc3QoY2FyZCwgc2tiKTsKLSAgICAgICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7Ci0gICAgICAgICByZWN5Y2xlX3J4X2J1ZihjYXJkLCBza2IpOwotICAgICAgICAgdmMtPnJ4X2lvdiA9IE5VTEw7Ci0gICAgICAgICByZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlIC8qIE5TX1NLQihpb3ZiKS0+aW92Y250ID49IDIgKi8KLSAgIHsKLSAgICAgIGlmIChOU19TS0JfQ0Ioc2tiKS0+YnVmX3R5cGUgIT0gQlVGX0xHKQotICAgICAgewotICAgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IEV4cGVjdGVkIGEgbGFyZ2UgYnVmZmVyLCBhbmQgdGhpcyBpcyBub3Qgb25lLlxuIiwKLQkgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgICAgICAgIHdoaWNoX2xpc3QoY2FyZCwgc2tiKTsKLSAgICAgICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7Ci0gICAgICAgICByZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgKHN0cnVjdCBpb3ZlYyAqKSBpb3ZiLT5kYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgTlNfU0tCKGlvdmIpLT5pb3ZjbnQpOwotICAgICAgICAgdmMtPnJ4X2lvdiA9IE5VTEw7Ci0gICAgICAgICByZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7Ci0JIHJldHVybjsKLSAgICAgIH0KLSAgIH0KKwlpZiAoKGlvdmIgPSB2Yy0+cnhfaW92KSA9PSBOVUxMKSB7CisJCWlvdmIgPSBza2JfZGVxdWV1ZSgmKGNhcmQtPmlvdnBvb2wucXVldWUpKTsKKwkJaWYgKGlvdmIgPT0gTlVMTCkgewkvKiBObyBidWZmZXJzIGluIHRoZSBxdWV1ZSAqLworCQkJaW92YiA9IGFsbG9jX3NrYihOU19JT1ZCVUZTSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChpb3ZiID09IE5VTEwpIHsKKwkJCQlwcmludGsoIm5pY3N0YXIlZDogT3V0IG9mIGlvdmVjIGJ1ZmZlcnMuXG4iLAorCQkJCSAgICAgICBjYXJkLT5pbmRleCk7CisJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZHJvcCk7CisJCQkJcmVjeWNsZV9yeF9idWYoY2FyZCwgc2tiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlOU19QUlZfQlVGVFlQRShpb3ZiKSA9IEJVRl9OT05FOworCQl9IGVsc2UgaWYgKC0tY2FyZC0+aW92cG9vbC5jb3VudCA8IGNhcmQtPmlvdm5yLm1pbikgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19pb3ZiOworCQkJaWYgKChuZXdfaW92YiA9CisJCQkgICAgIGFsbG9jX3NrYihOU19JT1ZCVUZTSVpFLCBHRlBfQVRPTUlDKSkgIT0gTlVMTCkgeworCQkJCU5TX1BSVl9CVUZUWVBFKGlvdmIpID0gQlVGX05PTkU7CisJCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmlvdnBvb2wucXVldWUsIG5ld19pb3ZiKTsKKwkJCQljYXJkLT5pb3Zwb29sLmNvdW50Kys7CisJCQl9CisJCX0KKwkJdmMtPnJ4X2lvdiA9IGlvdmI7CisJCU5TX1BSVl9JT1ZDTlQoaW92YikgPSAwOworCQlpb3ZiLT5sZW4gPSAwOworCQlpb3ZiLT5kYXRhID0gaW92Yi0+aGVhZDsKKwkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihpb3ZiKTsKKwkJLyogSU1QT1JUQU5UOiBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUgc21hbGwgb3IgbGFyZ2UKKwkJICAgYnVmZmVyIGlzIHN0b3JlZCBhcyBpb3ZlYyBiYXNlLCBOT1QgYSBwb2ludGVyIHRvIHRoZQorCQkgICBzbWFsbCBvciBsYXJnZSBidWZmZXIgaXRzZWxmLiAqLworCX0gZWxzZSBpZiAoTlNfUFJWX0lPVkNOVChpb3ZiKSA+PSBOU19NQVhfSU9WRUNTKSB7CisJCXByaW50aygibmljc3RhciVkOiByZWNlaXZlZCB0b28gYmlnIEFBTDUgU0RVLlxuIiwgY2FyZC0+aW5kZXgpOworCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOworCQlyZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgKHN0cnVjdCBpb3ZlYyAqKWlvdmItPmRhdGEsCisJCQkJICAgICAgTlNfTUFYX0lPVkVDUyk7CisJCU5TX1BSVl9JT1ZDTlQoaW92YikgPSAwOworCQlpb3ZiLT5sZW4gPSAwOworCQlpb3ZiLT5kYXRhID0gaW92Yi0+aGVhZDsKKwkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihpb3ZiKTsKKwl9CisJaW92ID0gJigoc3RydWN0IGlvdmVjICopaW92Yi0+ZGF0YSlbTlNfUFJWX0lPVkNOVChpb3ZiKSsrXTsKKwlpb3YtPmlvdl9iYXNlID0gKHZvaWQgKilza2I7CisJaW92LT5pb3ZfbGVuID0gbnNfcnNxZV9jZWxsY291bnQocnNxZSkgKiA0ODsKKwlpb3ZiLT5sZW4gKz0gaW92LT5pb3ZfbGVuOwogCi0gICBpZiAobnNfcnNxZV9lb3BkdShyc3FlKSkKLSAgIHsKLSAgICAgIC8qIFRoaXMgd29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QgKi8KLSAgICAgIHVuc2lnbmVkIGNoYXIgKkwxTDIgPSAodW5zaWduZWQgY2hhciAqKSgodTMyKXNrYi0+ZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW92LT5pb3ZfbGVuIC0gNik7Ci0gICAgICBhYWw1X2xlbiA9IEwxTDJbMF0gPDwgOCB8IEwxTDJbMV07Ci0gICAgICBsZW4gPSAoYWFsNV9sZW4gPT0gMHgwMDAwKSA/IDB4MTAwMDAgOiBhYWw1X2xlbjsKLSAgICAgIGlmIChuc19yc3FlX2NyY2Vycihyc3FlKSB8fAotICAgICAgICAgIGxlbiArIDggPiBpb3ZiLT5sZW4gfHwgbGVuICsgKDQ3ICsgOCkgPCBpb3ZiLT5sZW4pCi0gICAgICB7Ci0gICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogQUFMNSBDUkMgZXJyb3IiLCBjYXJkLT5pbmRleCk7Ci0gICAgICAgICBpZiAobGVuICsgOCA+IGlvdmItPmxlbiB8fCBsZW4gKyAoNDcgKyA4KSA8IGlvdmItPmxlbikKLSAgICAgICAgICAgIHByaW50aygiIC0gUERVIHNpemUgbWlzbWF0Y2guXG4iKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50aygiLlxuIik7Ci0gICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOwotICAgICAgICAgcmVjeWNsZV9pb3ZlY19yeF9idWZzKGNhcmQsIChzdHJ1Y3QgaW92ZWMgKikgaW92Yi0+ZGF0YSwKLQkgICBOU19TS0IoaW92YiktPmlvdmNudCk7Ci0JIHZjLT5yeF9pb3YgPSBOVUxMOwotICAgICAgICAgcmVjeWNsZV9pb3ZfYnVmKGNhcmQsIGlvdmIpOwotCSByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIEJ5IHRoaXMgcG9pbnQgd2UgKGhvcGVmdWxseSkgaGF2ZSBhIGNvbXBsZXRlIFNEVSB3aXRob3V0IGVycm9ycy4gKi8KLQotICAgICAgaWYgKE5TX1NLQihpb3ZiKS0+aW92Y250ID09IDEpCS8qIEp1c3QgYSBzbWFsbCBidWZmZXIgKi8KLSAgICAgIHsKLSAgICAgICAgIC8qIHNrYiBwb2ludHMgdG8gYSBzbWFsbCBidWZmZXIgKi8KLSAgICAgICAgIGlmICghYXRtX2NoYXJnZSh2Y2MsIHNrYi0+dHJ1ZXNpemUpKQotICAgICAgICAgewotICAgICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgc2tiKTsKLSAgICAgICAgICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotCSB7Ci0gICAgICAgICAgICBza2JfcHV0KHNrYiwgbGVuKTsKLSAgICAgICAgICAgIGRlcXVldWVfc21fYnVmKGNhcmQsIHNrYik7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0gICAgICAgICAgICBza2ItPmRlc3RydWN0b3IgPSBuc19zYl9kZXN0cnVjdG9yOwotI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwotICAgICAgICAgICAgQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7Ci0JICAgIF9fbmV0X3RpbWVzdGFtcChza2IpOwotICAgICAgICAgICAgdmNjLT5wdXNoKHZjYywgc2tiKTsKLSAgICAgICAgICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4KTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE5TX1NLQihpb3ZiKS0+aW92Y250ID09IDIpCS8qIE9uZSBzbWFsbCBwbHVzIG9uZSBsYXJnZSBidWZmZXIgKi8KLSAgICAgIHsKLSAgICAgICAgIHN0cnVjdCBza19idWZmICpzYjsKLQotICAgICAgICAgc2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGlvdiAtIDEpLT5pb3ZfYmFzZTsKLSAgICAgICAgIC8qIHNrYiBwb2ludHMgdG8gYSBsYXJnZSBidWZmZXIgKi8KLQotICAgICAgICAgaWYgKGxlbiA8PSBOU19TTUJVRlNJWkUpCi0JIHsKLSAgICAgICAgICAgIGlmICghYXRtX2NoYXJnZSh2Y2MsIHNiLT50cnVlc2l6ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwdXNoX3J4YnVmcyhjYXJkLCBzYik7Ci0gICAgICAgICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLQkgICAgewotICAgICAgICAgICAgICAgc2tiX3B1dChzYiwgbGVuKTsKLSAgICAgICAgICAgICAgIGRlcXVldWVfc21fYnVmKGNhcmQsIHNiKTsKLSNpZmRlZiBOU19VU0VfREVTVFJVQ1RPUlMKLSAgICAgICAgICAgICAgIHNiLT5kZXN0cnVjdG9yID0gbnNfc2JfZGVzdHJ1Y3RvcjsKLSNlbmRpZiAvKiBOU19VU0VfREVTVFJVQ1RPUlMgKi8KLSAgICAgICAgICAgICAgIEFUTV9TS0Ioc2IpLT52Y2MgPSB2Y2M7Ci0JICAgICAgIF9fbmV0X3RpbWVzdGFtcChzYik7Ci0gICAgICAgICAgICAgICB2Y2MtPnB1c2godmNjLCBzYik7Ci0gICAgICAgICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1c2hfcnhidWZzKGNhcmQsIHNrYik7Ci0KLQkgfQotCSBlbHNlCQkJLyogbGVuID4gTlNfU01CVUZTSVpFLCB0aGUgdXN1YWwgY2FzZSAqLwotCSB7Ci0gICAgICAgICAgICBpZiAoIWF0bV9jaGFyZ2UodmNjLCBza2ItPnRydWVzaXplKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHB1c2hfcnhidWZzKGNhcmQsIHNrYik7Ci0gICAgICAgICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRlcXVldWVfbGdfYnVmKGNhcmQsIHNrYik7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0gICAgICAgICAgICAgICBza2ItPmRlc3RydWN0b3IgPSBuc19sYl9kZXN0cnVjdG9yOwotI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwotICAgICAgICAgICAgICAgc2tiX3B1c2goc2tiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgICAgICAgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzYiwgc2tiLT5kYXRhLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgICAgICAgc2tiX3B1dChza2IsIGxlbiAtIE5TX1NNQlVGU0laRSk7Ci0gICAgICAgICAgICAgICBBVE1fU0tCKHNrYiktPnZjYyA9IHZjYzsKLQkgICAgICAgX19uZXRfdGltZXN0YW1wKHNrYik7Ci0gICAgICAgICAgICAgICB2Y2MtPnB1c2godmNjLCBza2IpOwotICAgICAgICAgICAgICAgYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cngpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdXNoX3J4YnVmcyhjYXJkLCBzYik7Ci0KLSAgICAgICAgIH0KLQkgCi0gICAgICB9Ci0gICAgICBlbHNlCQkJCS8qIE11c3QgcHVzaCBhIGh1Z2UgYnVmZmVyICovCi0gICAgICB7Ci0gICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaGIsICpzYiwgKmxiOwotCSBpbnQgcmVtYWluaW5nLCB0b2NvcHk7Ci0gICAgICAgICBpbnQgajsKLQotICAgICAgICAgaGIgPSBza2JfZGVxdWV1ZSgmKGNhcmQtPmhicG9vbC5xdWV1ZSkpOwotICAgICAgICAgaWYgKGhiID09IE5VTEwpCQkvKiBObyBidWZmZXJzIGluIHRoZSBxdWV1ZSAqLwotICAgICAgICAgewotCi0gICAgICAgICAgICBoYiA9IGRldl9hbGxvY19za2IoTlNfSEJVRlNJWkUpOwotICAgICAgICAgICAgaWYgKGhiID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGsoIm5pY3N0YXIlZDogT3V0IG9mIGh1Z2UgYnVmZmVycy5cbiIsIGNhcmQtPmluZGV4KTsKLSAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOwotICAgICAgICAgICAgICAgcmVjeWNsZV9pb3ZlY19yeF9idWZzKGNhcmQsIChzdHJ1Y3QgaW92ZWMgKikgaW92Yi0+ZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1NLQihpb3ZiKS0+aW92Y250KTsKLSAgICAgICAgICAgICAgIHZjLT5yeF9pb3YgPSBOVUxMOwotICAgICAgICAgICAgICAgcmVjeWNsZV9pb3ZfYnVmKGNhcmQsIGlvdmIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2FyZC0+aGJwb29sLmNvdW50IDwgY2FyZC0+aGJuci5taW4pCi0JICAgIHsKLSAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpuZXdfaGI7Ci0gICAgICAgICAgICAgICBpZiAoKG5ld19oYiA9IGRldl9hbGxvY19za2IoTlNfSEJVRlNJWkUpKSAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmhicG9vbC5xdWV1ZSwgbmV3X2hiKTsKLSAgICAgICAgICAgICAgICAgIGNhcmQtPmhicG9vbC5jb3VudCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTlNfU0tCX0NCKGhiKS0+YnVmX3R5cGUgPSBCVUZfTk9ORTsKLQkgfQotCSBlbHNlCi0gICAgICAgICBpZiAoLS1jYXJkLT5oYnBvb2wuY291bnQgPCBjYXJkLT5oYm5yLm1pbikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpuZXdfaGI7Ci0gICAgICAgICAgICBpZiAoKG5ld19oYiA9IGRldl9hbGxvY19za2IoTlNfSEJVRlNJWkUpKSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgTlNfU0tCX0NCKG5ld19oYiktPmJ1Zl90eXBlID0gQlVGX05PTkU7Ci0gICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+aGJwb29sLnF1ZXVlLCBuZXdfaGIpOwotICAgICAgICAgICAgICAgY2FyZC0+aGJwb29sLmNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FyZC0+aGJwb29sLmNvdW50IDwgY2FyZC0+aGJuci5taW4pCi0JICAgIHsKLSAgICAgICAgICAgICAgIGlmICgobmV3X2hiID0gZGV2X2FsbG9jX3NrYihOU19IQlVGU0laRSkpICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBOU19TS0JfQ0IobmV3X2hiKS0+YnVmX3R5cGUgPSBCVUZfTk9ORTsKLSAgICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIG5ld19oYik7Ci0gICAgICAgICAgICAgICAgICBjYXJkLT5oYnBvb2wuY291bnQrKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaW92ID0gKHN0cnVjdCBpb3ZlYyAqKSBpb3ZiLT5kYXRhOwotCi0gICAgICAgICBpZiAoIWF0bV9jaGFyZ2UodmNjLCBoYi0+dHJ1ZXNpemUpKQotCSB7Ci0gICAgICAgICAgICByZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgaW92LCBOU19TS0IoaW92YiktPmlvdmNudCk7Ci0gICAgICAgICAgICBpZiAoY2FyZC0+aGJwb29sLmNvdW50IDwgY2FyZC0+aGJuci5tYXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+aGJwb29sLnF1ZXVlLCBoYik7Ci0gICAgICAgICAgICAgICBjYXJkLT5oYnBvb2wuY291bnQrKzsKLSAgICAgICAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShoYik7Ci0JICAgIGF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotCSB7Ci0gICAgICAgICAgICAvKiBDb3B5IHRoZSBzbWFsbCBidWZmZXIgdG8gdGhlIGh1Z2UgYnVmZmVyICovCi0gICAgICAgICAgICBzYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBpb3YtPmlvdl9iYXNlOwotICAgICAgICAgICAgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzYiwgaGItPmRhdGEsIGlvdi0+aW92X2xlbik7Ci0gICAgICAgICAgICBza2JfcHV0KGhiLCBpb3YtPmlvdl9sZW4pOwotICAgICAgICAgICAgcmVtYWluaW5nID0gbGVuIC0gaW92LT5pb3ZfbGVuOwotICAgICAgICAgICAgaW92Kys7Ci0gICAgICAgICAgICAvKiBGcmVlIHRoZSBzbWFsbCBidWZmZXIgKi8KLSAgICAgICAgICAgIHB1c2hfcnhidWZzKGNhcmQsIHNiKTsKLQotICAgICAgICAgICAgLyogQ29weSBhbGwgbGFyZ2UgYnVmZmVycyB0byB0aGUgaHVnZSBidWZmZXIgYW5kIGZyZWUgdGhlbSAqLwotICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IE5TX1NLQihpb3ZiKS0+aW92Y250OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBsYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBpb3YtPmlvdl9iYXNlOwotICAgICAgICAgICAgICAgdG9jb3B5ID0gbWluX3QoaW50LCByZW1haW5pbmcsIGlvdi0+aW92X2xlbik7Ci0gICAgICAgICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGxiLCBza2JfdGFpbF9wb2ludGVyKGhiKSwgdG9jb3B5KTsKLSAgICAgICAgICAgICAgIHNrYl9wdXQoaGIsIHRvY29weSk7Ci0gICAgICAgICAgICAgICBpb3YrKzsKLSAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0b2NvcHk7Ci0gICAgICAgICAgICAgICBwdXNoX3J4YnVmcyhjYXJkLCBsYik7Ci0gICAgICAgICAgICB9CiAjaWZkZWYgRVhUUkFfREVCVUcKLSAgICAgICAgICAgIGlmIChyZW1haW5pbmcgIT0gMCB8fCBoYi0+bGVuICE9IGxlbikKLSAgICAgICAgICAgICAgIHByaW50aygibmljc3RhciVkOiBIdWdlIGJ1ZmZlciBsZW4gbWlzbWF0Y2guXG4iLCBjYXJkLT5pbmRleCk7Ci0jZW5kaWYgLyogRVhUUkFfREVCVUcgKi8KLSAgICAgICAgICAgIEFUTV9TS0IoaGIpLT52Y2MgPSB2Y2M7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0gICAgICAgICAgICBoYi0+ZGVzdHJ1Y3RvciA9IG5zX2hiX2Rlc3RydWN0b3I7Ci0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCi0JICAgIF9fbmV0X3RpbWVzdGFtcChoYik7Ci0gICAgICAgICAgICB2Y2MtPnB1c2godmNjLCBoYik7Ci0gICAgICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7Ci0gICAgICAgICB9Ci0gICAgICB9CisJaWYgKE5TX1BSVl9JT1ZDTlQoaW92YikgPT0gMSkgeworCQlpZiAoTlNfUFJWX0JVRlRZUEUoc2tiKSAhPSBCVUZfU00pIHsKKwkJCXByaW50aworCQkJICAgICgibmljc3RhciVkOiBFeHBlY3RlZCBhIHNtYWxsIGJ1ZmZlciwgYW5kIHRoaXMgaXMgbm90IG9uZS5cbiIsCisJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCXdoaWNoX2xpc3QoY2FyZCwgc2tiKTsKKwkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7CisJCQlyZWN5Y2xlX3J4X2J1ZihjYXJkLCBza2IpOworCQkJdmMtPnJ4X2lvdiA9IE5VTEw7CisJCQlyZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgewkJLyogTlNfUFJWX0lPVkNOVChpb3ZiKSA+PSAyICovCiAKLSAgICAgIHZjLT5yeF9pb3YgPSBOVUxMOwotICAgICAgcmVjeWNsZV9pb3ZfYnVmKGNhcmQsIGlvdmIpOwotICAgfQorCQlpZiAoTlNfUFJWX0JVRlRZUEUoc2tiKSAhPSBCVUZfTEcpIHsKKwkJCXByaW50aworCQkJICAgICgibmljc3RhciVkOiBFeHBlY3RlZCBhIGxhcmdlIGJ1ZmZlciwgYW5kIHRoaXMgaXMgbm90IG9uZS5cbiIsCisJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCXdoaWNoX2xpc3QoY2FyZCwgc2tiKTsKKwkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7CisJCQlyZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgKHN0cnVjdCBpb3ZlYyAqKWlvdmItPmRhdGEsCisJCQkJCSAgICAgIE5TX1BSVl9JT1ZDTlQoaW92YikpOworCQkJdmMtPnJ4X2lvdiA9IE5VTEw7CisJCQlyZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLyogRVhUUkFfREVCVUcgKi8KKworCWlmIChuc19yc3FlX2VvcGR1KHJzcWUpKSB7CisJCS8qIFRoaXMgd29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QgKi8KKwkJdW5zaWduZWQgY2hhciAqTDFMMiA9ICh1bnNpZ25lZCBjaGFyICopCisJCQkJCQkoc2tiLT5kYXRhICsgaW92LT5pb3ZfbGVuIC0gNik7CisJCWFhbDVfbGVuID0gTDFMMlswXSA8PCA4IHwgTDFMMlsxXTsKKwkJbGVuID0gKGFhbDVfbGVuID09IDB4MDAwMCkgPyAweDEwMDAwIDogYWFsNV9sZW47CisJCWlmIChuc19yc3FlX2NyY2Vycihyc3FlKSB8fAorCQkgICAgbGVuICsgOCA+IGlvdmItPmxlbiB8fCBsZW4gKyAoNDcgKyA4KSA8IGlvdmItPmxlbikgeworCQkJcHJpbnRrKCJuaWNzdGFyJWQ6IEFBTDUgQ1JDIGVycm9yIiwgY2FyZC0+aW5kZXgpOworCQkJaWYgKGxlbiArIDggPiBpb3ZiLT5sZW4gfHwgbGVuICsgKDQ3ICsgOCkgPCBpb3ZiLT5sZW4pCisJCQkJcHJpbnRrKCIgLSBQRFUgc2l6ZSBtaXNtYXRjaC5cbiIpOworCQkJZWxzZQorCQkJCXByaW50aygiLlxuIik7CisJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOworCQkJcmVjeWNsZV9pb3ZlY19yeF9idWZzKGNhcmQsIChzdHJ1Y3QgaW92ZWMgKilpb3ZiLT5kYXRhLAorCQkJCQkgICAgICBOU19QUlZfSU9WQ05UKGlvdmIpKTsKKwkJCXZjLT5yeF9pb3YgPSBOVUxMOworCQkJcmVjeWNsZV9pb3ZfYnVmKGNhcmQsIGlvdmIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogQnkgdGhpcyBwb2ludCB3ZSAoaG9wZWZ1bGx5KSBoYXZlIGEgY29tcGxldGUgU0RVIHdpdGhvdXQgZXJyb3JzLiAqLworCisJCWlmIChOU19QUlZfSU9WQ05UKGlvdmIpID09IDEpIHsJLyogSnVzdCBhIHNtYWxsIGJ1ZmZlciAqLworCQkJLyogc2tiIHBvaW50cyB0byBhIHNtYWxsIGJ1ZmZlciAqLworCQkJaWYgKCFhdG1fY2hhcmdlKHZjYywgc2tiLT50cnVlc2l6ZSkpIHsKKwkJCQlwdXNoX3J4YnVmcyhjYXJkLCBza2IpOworCQkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOworCQkJfSBlbHNlIHsKKwkJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCQlkZXF1ZXVlX3NtX2J1ZihjYXJkLCBza2IpOworI2lmZGVmIE5TX1VTRV9ERVNUUlVDVE9SUworCQkJCXNrYi0+ZGVzdHJ1Y3RvciA9IG5zX3NiX2Rlc3RydWN0b3I7CisjZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCisJCQkJQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7CisJCQkJX19uZXRfdGltZXN0YW1wKHNrYik7CisJCQkJdmNjLT5wdXNoKHZjYywgc2tiKTsKKwkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7CisJCQl9CisJCX0gZWxzZSBpZiAoTlNfUFJWX0lPVkNOVChpb3ZiKSA9PSAyKSB7CS8qIE9uZSBzbWFsbCBwbHVzIG9uZSBsYXJnZSBidWZmZXIgKi8KKwkJCXN0cnVjdCBza19idWZmICpzYjsKKworCQkJc2IgPSAoc3RydWN0IHNrX2J1ZmYgKikoaW92IC0gMSktPmlvdl9iYXNlOworCQkJLyogc2tiIHBvaW50cyB0byBhIGxhcmdlIGJ1ZmZlciAqLworCisJCQlpZiAobGVuIDw9IE5TX1NNQlVGU0laRSkgeworCQkJCWlmICghYXRtX2NoYXJnZSh2Y2MsIHNiLT50cnVlc2l6ZSkpIHsKKwkJCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgc2IpOworCQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlza2JfcHV0KHNiLCBsZW4pOworCQkJCQlkZXF1ZXVlX3NtX2J1ZihjYXJkLCBzYik7CisjaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCisJCQkJCXNiLT5kZXN0cnVjdG9yID0gbnNfc2JfZGVzdHJ1Y3RvcjsKKyNlbmRpZiAvKiBOU19VU0VfREVTVFJVQ1RPUlMgKi8KKwkJCQkJQVRNX1NLQihzYiktPnZjYyA9IHZjYzsKKwkJCQkJX19uZXRfdGltZXN0YW1wKHNiKTsKKwkJCQkJdmNjLT5wdXNoKHZjYywgc2IpOworCQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7CisJCQkJfQorCisJCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgc2tiKTsKKworCQkJfSBlbHNlIHsJLyogbGVuID4gTlNfU01CVUZTSVpFLCB0aGUgdXN1YWwgY2FzZSAqLworCisJCQkJaWYgKCFhdG1fY2hhcmdlKHZjYywgc2tiLT50cnVlc2l6ZSkpIHsKKwkJCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgc2tiKTsKKwkJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZHJvcCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGVxdWV1ZV9sZ19idWYoY2FyZCwgc2tiKTsKKyNpZmRlZiBOU19VU0VfREVTVFJVQ1RPUlMKKwkJCQkJc2tiLT5kZXN0cnVjdG9yID0gbnNfbGJfZGVzdHJ1Y3RvcjsKKyNlbmRpZiAvKiBOU19VU0VfREVTVFJVQ1RPUlMgKi8KKwkJCQkJc2tiX3B1c2goc2tiLCBOU19TTUJVRlNJWkUpOworCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNiLCBza2ItPmRhdGEsCisJCQkJCQkJCSAgTlNfU01CVUZTSVpFKTsKKwkJCQkJc2tiX3B1dChza2IsIGxlbiAtIE5TX1NNQlVGU0laRSk7CisJCQkJCUFUTV9TS0Ioc2tiKS0+dmNjID0gdmNjOworCQkJCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKKwkJCQkJdmNjLT5wdXNoKHZjYywgc2tiKTsKKwkJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cngpOworCQkJCX0KKworCQkJCXB1c2hfcnhidWZzKGNhcmQsIHNiKTsKKworCQkJfQorCisJCX0gZWxzZSB7CS8qIE11c3QgcHVzaCBhIGh1Z2UgYnVmZmVyICovCisKKwkJCXN0cnVjdCBza19idWZmICpoYiwgKnNiLCAqbGI7CisJCQlpbnQgcmVtYWluaW5nLCB0b2NvcHk7CisJCQlpbnQgajsKKworCQkJaGIgPSBza2JfZGVxdWV1ZSgmKGNhcmQtPmhicG9vbC5xdWV1ZSkpOworCQkJaWYgKGhiID09IE5VTEwpIHsJLyogTm8gYnVmZmVycyBpbiB0aGUgcXVldWUgKi8KKworCQkJCWhiID0gZGV2X2FsbG9jX3NrYihOU19IQlVGU0laRSk7CisJCQkJaWYgKGhiID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIm5pY3N0YXIlZDogT3V0IG9mIGh1Z2UgYnVmZmVycy5cbiIsCisJCQkJCSAgICAgY2FyZC0+aW5kZXgpOworCQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKKwkJCQkJcmVjeWNsZV9pb3ZlY19yeF9idWZzKGNhcmQsCisJCQkJCQkJICAgICAgKHN0cnVjdCBpb3ZlYyAqKQorCQkJCQkJCSAgICAgIGlvdmItPmRhdGEsCisJCQkJCQkJICAgICAgTlNfUFJWX0lPVkNOVChpb3ZiKSk7CisJCQkJCXZjLT5yeF9pb3YgPSBOVUxMOworCQkJCQlyZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7CisJCQkJCXJldHVybjsKKwkJCQl9IGVsc2UgaWYgKGNhcmQtPmhicG9vbC5jb3VudCA8IGNhcmQtPmhibnIubWluKSB7CisJCQkJCXN0cnVjdCBza19idWZmICpuZXdfaGI7CisJCQkJCWlmICgobmV3X2hiID0KKwkJCQkJICAgICBkZXZfYWxsb2Nfc2tiKE5TX0hCVUZTSVpFKSkgIT0KKwkJCQkJICAgIE5VTEwpIHsKKwkJCQkJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wuCisJCQkJCQkJICAgICAgIHF1ZXVlLCBuZXdfaGIpOworCQkJCQkJY2FyZC0+aGJwb29sLmNvdW50Kys7CisJCQkJCX0KKwkJCQl9CisJCQkJTlNfUFJWX0JVRlRZUEUoaGIpID0gQlVGX05PTkU7CisJCQl9IGVsc2UgaWYgKC0tY2FyZC0+aGJwb29sLmNvdW50IDwgY2FyZC0+aGJuci5taW4pIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X2hiOworCQkJCWlmICgobmV3X2hiID0KKwkJCQkgICAgIGRldl9hbGxvY19za2IoTlNfSEJVRlNJWkUpKSAhPSBOVUxMKSB7CisJCQkJCU5TX1BSVl9CVUZUWVBFKG5ld19oYikgPSBCVUZfTk9ORTsKKwkJCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmhicG9vbC5xdWV1ZSwKKwkJCQkJCSAgICAgICBuZXdfaGIpOworCQkJCQljYXJkLT5oYnBvb2wuY291bnQrKzsKKwkJCQl9CisJCQkJaWYgKGNhcmQtPmhicG9vbC5jb3VudCA8IGNhcmQtPmhibnIubWluKSB7CisJCQkJCWlmICgobmV3X2hiID0KKwkJCQkJICAgICBkZXZfYWxsb2Nfc2tiKE5TX0hCVUZTSVpFKSkgIT0KKwkJCQkJICAgIE5VTEwpIHsKKwkJCQkJCU5TX1BSVl9CVUZUWVBFKG5ld19oYikgPQorCQkJCQkJICAgIEJVRl9OT05FOworCQkJCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmhicG9vbC4KKwkJCQkJCQkgICAgICAgcXVldWUsIG5ld19oYik7CisJCQkJCQljYXJkLT5oYnBvb2wuY291bnQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaW92ID0gKHN0cnVjdCBpb3ZlYyAqKWlvdmItPmRhdGE7CisKKwkJCWlmICghYXRtX2NoYXJnZSh2Y2MsIGhiLT50cnVlc2l6ZSkpIHsKKwkJCQlyZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgaW92LAorCQkJCQkJICAgICAgTlNfUFJWX0lPVkNOVChpb3ZiKSk7CisJCQkJaWYgKGNhcmQtPmhicG9vbC5jb3VudCA8IGNhcmQtPmhibnIubWF4KSB7CisJCQkJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKKwkJCQkJY2FyZC0+aGJwb29sLmNvdW50Kys7CisJCQkJfSBlbHNlCisJCQkJCWRldl9rZnJlZV9za2JfYW55KGhiKTsKKwkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQ29weSB0aGUgc21hbGwgYnVmZmVyIHRvIHRoZSBodWdlIGJ1ZmZlciAqLworCQkJCXNiID0gKHN0cnVjdCBza19idWZmICopaW92LT5pb3ZfYmFzZTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNiLCBoYi0+ZGF0YSwKKwkJCQkJCQkgIGlvdi0+aW92X2xlbik7CisJCQkJc2tiX3B1dChoYiwgaW92LT5pb3ZfbGVuKTsKKwkJCQlyZW1haW5pbmcgPSBsZW4gLSBpb3YtPmlvdl9sZW47CisJCQkJaW92Kys7CisJCQkJLyogRnJlZSB0aGUgc21hbGwgYnVmZmVyICovCisJCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgc2IpOworCisJCQkJLyogQ29weSBhbGwgbGFyZ2UgYnVmZmVycyB0byB0aGUgaHVnZSBidWZmZXIgYW5kIGZyZWUgdGhlbSAqLworCQkJCWZvciAoaiA9IDE7IGogPCBOU19QUlZfSU9WQ05UKGlvdmIpOyBqKyspIHsKKwkJCQkJbGIgPSAoc3RydWN0IHNrX2J1ZmYgKilpb3YtPmlvdl9iYXNlOworCQkJCQl0b2NvcHkgPQorCQkJCQkgICAgbWluX3QoaW50LCByZW1haW5pbmcsIGlvdi0+aW92X2xlbik7CisJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEobGIsCisJCQkJCQkJCSAgc2tiX3RhaWxfcG9pbnRlcgorCQkJCQkJCQkgIChoYiksIHRvY29weSk7CisJCQkJCXNrYl9wdXQoaGIsIHRvY29weSk7CisJCQkJCWlvdisrOworCQkJCQlyZW1haW5pbmcgLT0gdG9jb3B5OworCQkJCQlwdXNoX3J4YnVmcyhjYXJkLCBsYik7CisJCQkJfQorI2lmZGVmIEVYVFJBX0RFQlVHCisJCQkJaWYgKHJlbWFpbmluZyAhPSAwIHx8IGhiLT5sZW4gIT0gbGVuKQorCQkJCQlwcmludGsKKwkJCQkJICAgICgibmljc3RhciVkOiBIdWdlIGJ1ZmZlciBsZW4gbWlzbWF0Y2guXG4iLAorCQkJCQkgICAgIGNhcmQtPmluZGV4KTsKKyNlbmRpZiAvKiBFWFRSQV9ERUJVRyAqLworCQkJCUFUTV9TS0IoaGIpLT52Y2MgPSB2Y2M7CisjaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCisJCQkJaGItPmRlc3RydWN0b3IgPSBuc19oYl9kZXN0cnVjdG9yOworI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLworCQkJCV9fbmV0X3RpbWVzdGFtcChoYik7CisJCQkJdmNjLT5wdXNoKHZjYywgaGIpOworCQkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4KTsKKwkJCX0KKwkJfQorCisJCXZjLT5yeF9pb3YgPSBOVUxMOworCQlyZWN5Y2xlX2lvdl9idWYoY2FyZCwgaW92Yik7CisJfQogCiB9CiAKLQotCiAjaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCiAKIHN0YXRpYyB2b2lkIG5zX3NiX2Rlc3RydWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNiKQogewotICAgbnNfZGV2ICpjYXJkOwotICAgdTMyIHN0YXQ7CisJbnNfZGV2ICpjYXJkOworCXUzMiBzdGF0OwogCi0gICBjYXJkID0gKG5zX2RldiAqKSBBVE1fU0tCKHNiKS0+dmNjLT5kZXYtPmRldl9kYXRhOwotICAgc3RhdCA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKLSAgIGNhcmQtPnNiZnFjID0gbnNfc3RhdF9zZmJxY19nZXQoc3RhdCk7ICAgCi0gICBjYXJkLT5sYmZxYyA9IG5zX3N0YXRfbGZicWNfZ2V0KHN0YXQpOworCWNhcmQgPSAobnNfZGV2ICopIEFUTV9TS0Ioc2IpLT52Y2MtPmRldi0+ZGV2X2RhdGE7CisJc3RhdCA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwljYXJkLT5zYmZxYyA9IG5zX3N0YXRfc2ZicWNfZ2V0KHN0YXQpOworCWNhcmQtPmxiZnFjID0gbnNfc3RhdF9sZmJxY19nZXQoc3RhdCk7CiAKLSAgIGRvCi0gICB7Ci0gICAgICBzYiA9IF9fZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUsIEdGUF9LRVJORUwpOwotICAgICAgaWYgKHNiID09IE5VTEwpCi0gICAgICAgICBicmVhazsKLSAgICAgIE5TX1NLQl9DQihzYiktPmJ1Zl90eXBlID0gQlVGX1NNOwotICAgICAgc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPnNicG9vbC5xdWV1ZSwgc2IpOwotICAgICAgc2tiX3Jlc2VydmUoc2IsIE5TX0FBTDBfSEVBREVSKTsKLSAgICAgIHB1c2hfcnhidWZzKGNhcmQsIHNiKTsKLSAgIH0gd2hpbGUgKGNhcmQtPnNiZnFjIDwgY2FyZC0+c2Juci5taW4pOworCWRvIHsKKwkJc2IgPSBfX2Rldl9hbGxvY19za2IoTlNfU01TS0JTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHNiID09IE5VTEwpCisJCQlicmVhazsKKwkJTlNfUFJWX0JVRlRZUEUoc2IpID0gQlVGX1NNOworCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+c2Jwb29sLnF1ZXVlLCBzYik7CisJCXNrYl9yZXNlcnZlKHNiLCBOU19BQUwwX0hFQURFUik7CisJCXB1c2hfcnhidWZzKGNhcmQsIHNiKTsKKwl9IHdoaWxlIChjYXJkLT5zYmZxYyA8IGNhcmQtPnNibnIubWluKTsKIH0KIAotCi0KIHN0YXRpYyB2b2lkIG5zX2xiX2Rlc3RydWN0b3Ioc3RydWN0IHNrX2J1ZmYgKmxiKQogewotICAgbnNfZGV2ICpjYXJkOwotICAgdTMyIHN0YXQ7CisJbnNfZGV2ICpjYXJkOworCXUzMiBzdGF0OwogCi0gICBjYXJkID0gKG5zX2RldiAqKSBBVE1fU0tCKGxiKS0+dmNjLT5kZXYtPmRldl9kYXRhOwotICAgc3RhdCA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKLSAgIGNhcmQtPnNiZnFjID0gbnNfc3RhdF9zZmJxY19nZXQoc3RhdCk7ICAgCi0gICBjYXJkLT5sYmZxYyA9IG5zX3N0YXRfbGZicWNfZ2V0KHN0YXQpOworCWNhcmQgPSAobnNfZGV2ICopIEFUTV9TS0IobGIpLT52Y2MtPmRldi0+ZGV2X2RhdGE7CisJc3RhdCA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwljYXJkLT5zYmZxYyA9IG5zX3N0YXRfc2ZicWNfZ2V0KHN0YXQpOworCWNhcmQtPmxiZnFjID0gbnNfc3RhdF9sZmJxY19nZXQoc3RhdCk7CiAKLSAgIGRvCi0gICB7Ci0gICAgICBsYiA9IF9fZGV2X2FsbG9jX3NrYihOU19MR1NLQlNJWkUsIEdGUF9LRVJORUwpOwotICAgICAgaWYgKGxiID09IE5VTEwpCi0gICAgICAgICBicmVhazsKLSAgICAgIE5TX1NLQl9DQihsYiktPmJ1Zl90eXBlID0gQlVGX0xHOwotICAgICAgc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmxicG9vbC5xdWV1ZSwgbGIpOwotICAgICAgc2tiX3Jlc2VydmUobGIsIE5TX1NNQlVGU0laRSk7Ci0gICAgICBwdXNoX3J4YnVmcyhjYXJkLCBsYik7Ci0gICB9IHdoaWxlIChjYXJkLT5sYmZxYyA8IGNhcmQtPmxibnIubWluKTsKKwlkbyB7CisJCWxiID0gX19kZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChsYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCU5TX1BSVl9CVUZUWVBFKGxiKSA9IEJVRl9MRzsKKwkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmxicG9vbC5xdWV1ZSwgbGIpOworCQlza2JfcmVzZXJ2ZShsYiwgTlNfU01CVUZTSVpFKTsKKwkJcHVzaF9yeGJ1ZnMoY2FyZCwgbGIpOworCX0gd2hpbGUgKGNhcmQtPmxiZnFjIDwgY2FyZC0+bGJuci5taW4pOwogfQogCi0KLQogc3RhdGljIHZvaWQgbnNfaGJfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqaGIpCiB7Ci0gICBuc19kZXYgKmNhcmQ7CisJbnNfZGV2ICpjYXJkOwogCi0gICBjYXJkID0gKG5zX2RldiAqKSBBVE1fU0tCKGhiKS0+dmNjLT5kZXYtPmRldl9kYXRhOworCWNhcmQgPSAobnNfZGV2ICopIEFUTV9TS0IoaGIpLT52Y2MtPmRldi0+ZGV2X2RhdGE7CiAKLSAgIHdoaWxlIChjYXJkLT5oYnBvb2wuY291bnQgPCBjYXJkLT5oYm5yLmluaXQpCi0gICB7Ci0gICAgICBoYiA9IF9fZGV2X2FsbG9jX3NrYihOU19IQlVGU0laRSwgR0ZQX0tFUk5FTCk7Ci0gICAgICBpZiAoaGIgPT0gTlVMTCkKLSAgICAgICAgIGJyZWFrOwotICAgICAgTlNfU0tCX0NCKGhiKS0+YnVmX3R5cGUgPSBCVUZfTk9ORTsKLSAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKLSAgICAgIGNhcmQtPmhicG9vbC5jb3VudCsrOwotICAgfQorCXdoaWxlIChjYXJkLT5oYnBvb2wuY291bnQgPCBjYXJkLT5oYm5yLmluaXQpIHsKKwkJaGIgPSBfX2Rldl9hbGxvY19za2IoTlNfSEJVRlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoaGIgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlOU19QUlZfQlVGVFlQRShoYikgPSBCVUZfTk9ORTsKKwkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmhicG9vbC5xdWV1ZSwgaGIpOworCQljYXJkLT5oYnBvb2wuY291bnQrKzsKKwl9CiB9CiAKICNlbmRpZiAvKiBOU19VU0VfREVTVFJVQ1RPUlMgKi8KIAotCi1zdGF0aWMgdm9pZCByZWN5Y2xlX3J4X2J1Zihuc19kZXYgKmNhcmQsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCByZWN5Y2xlX3J4X2J1Zihuc19kZXYgKiBjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuc19za2JfY2IgKmNiID0gTlNfU0tCX0NCKHNrYik7Ci0KLQlpZiAodW5saWtlbHkoY2ItPmJ1Zl90eXBlID09IEJVRl9OT05FKSkgewotCQlwcmludGsoIm5pY3N0YXIlZDogV2hhdCBraW5kIG9mIHJ4IGJ1ZmZlciBpcyB0aGlzP1xuIiwgY2FyZC0+aW5kZXgpOworCWlmICh1bmxpa2VseShOU19QUlZfQlVGVFlQRShza2IpID09IEJVRl9OT05FKSkgeworCQlwcmludGsoIm5pY3N0YXIlZDogV2hhdCBraW5kIG9mIHJ4IGJ1ZmZlciBpcyB0aGlzP1xuIiwKKwkJICAgICAgIGNhcmQtPmluZGV4KTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9IGVsc2UKIAkJcHVzaF9yeGJ1ZnMoY2FyZCwgc2tiKTsKIH0KIAotCi1zdGF0aWMgdm9pZCByZWN5Y2xlX2lvdmVjX3J4X2J1ZnMobnNfZGV2ICpjYXJkLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNvdW50KQorc3RhdGljIHZvaWQgcmVjeWNsZV9pb3ZlY19yeF9idWZzKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpCiB7CiAJd2hpbGUgKGNvdW50LS0gPiAwKQotCQlyZWN5Y2xlX3J4X2J1ZihjYXJkLCAoc3RydWN0IHNrX2J1ZmYgKikgKGlvdisrKS0+aW92X2Jhc2UpOworCQlyZWN5Y2xlX3J4X2J1ZihjYXJkLCAoc3RydWN0IHNrX2J1ZmYgKikoaW92KyspLT5pb3ZfYmFzZSk7CiB9CiAKLQotc3RhdGljIHZvaWQgcmVjeWNsZV9pb3ZfYnVmKG5zX2RldiAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKmlvdmIpCitzdGF0aWMgdm9pZCByZWN5Y2xlX2lvdl9idWYobnNfZGV2ICogY2FyZCwgc3RydWN0IHNrX2J1ZmYgKmlvdmIpCiB7Ci0gICBpZiAoY2FyZC0+aW92cG9vbC5jb3VudCA8IGNhcmQtPmlvdm5yLm1heCkKLSAgIHsKLSAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5pb3Zwb29sLnF1ZXVlLCBpb3ZiKTsKLSAgICAgIGNhcmQtPmlvdnBvb2wuY291bnQrKzsKLSAgIH0KLSAgIGVsc2UKLSAgICAgIGRldl9rZnJlZV9za2JfYW55KGlvdmIpOworCWlmIChjYXJkLT5pb3Zwb29sLmNvdW50IDwgY2FyZC0+aW92bnIubWF4KSB7CisJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5pb3Zwb29sLnF1ZXVlLCBpb3ZiKTsKKwkJY2FyZC0+aW92cG9vbC5jb3VudCsrOworCX0gZWxzZQorCQlkZXZfa2ZyZWVfc2tiX2FueShpb3ZiKTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGRlcXVldWVfc21fYnVmKG5zX2RldiAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKnNiKQorc3RhdGljIHZvaWQgZGVxdWV1ZV9zbV9idWYobnNfZGV2ICogY2FyZCwgc3RydWN0IHNrX2J1ZmYgKnNiKQogewotICAgc2tiX3VubGluayhzYiwgJmNhcmQtPnNicG9vbC5xdWV1ZSk7CisJc2tiX3VubGluayhzYiwgJmNhcmQtPnNicG9vbC5xdWV1ZSk7CiAjaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0gICBpZiAoY2FyZC0+c2JmcWMgPCBjYXJkLT5zYm5yLm1pbikKKwlpZiAoY2FyZC0+c2JmcWMgPCBjYXJkLT5zYm5yLm1pbikKICNlbHNlCi0gICBpZiAoY2FyZC0+c2JmcWMgPCBjYXJkLT5zYm5yLmluaXQpCi0gICB7Ci0gICAgICBzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NiOwotICAgICAgaWYgKChuZXdfc2IgPSBkZXZfYWxsb2Nfc2tiKE5TX1NNU0tCU0laRSkpICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBOU19TS0JfQ0IobmV3X3NiKS0+YnVmX3R5cGUgPSBCVUZfU007Ci0gICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+c2Jwb29sLnF1ZXVlLCBuZXdfc2IpOwotICAgICAgICAgc2tiX3Jlc2VydmUobmV3X3NiLCBOU19BQUwwX0hFQURFUik7Ci0gICAgICAgICBwdXNoX3J4YnVmcyhjYXJkLCBuZXdfc2IpOwotICAgICAgfQotICAgfQotICAgaWYgKGNhcmQtPnNiZnFjIDwgY2FyZC0+c2Juci5pbml0KQorCWlmIChjYXJkLT5zYmZxYyA8IGNhcmQtPnNibnIuaW5pdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NiOworCQlpZiAoKG5ld19zYiA9IGRldl9hbGxvY19za2IoTlNfU01TS0JTSVpFKSkgIT0gTlVMTCkgeworCQkJTlNfUFJWX0JVRlRZUEUobmV3X3NiKSA9IEJVRl9TTTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5zYnBvb2wucXVldWUsIG5ld19zYik7CisJCQlza2JfcmVzZXJ2ZShuZXdfc2IsIE5TX0FBTDBfSEVBREVSKTsKKwkJCXB1c2hfcnhidWZzKGNhcmQsIG5ld19zYik7CisJCX0KKwl9CisJaWYgKGNhcmQtPnNiZnFjIDwgY2FyZC0+c2Juci5pbml0KQogI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwotICAgewotICAgICAgc3RydWN0IHNrX2J1ZmYgKm5ld19zYjsKLSAgICAgIGlmICgobmV3X3NiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpKSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgTlNfU0tCX0NCKG5ld19zYiktPmJ1Zl90eXBlID0gQlVGX1NNOwotICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPnNicG9vbC5xdWV1ZSwgbmV3X3NiKTsKLSAgICAgICAgIHNrYl9yZXNlcnZlKG5ld19zYiwgTlNfQUFMMF9IRUFERVIpOwotICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgbmV3X3NiKTsKLSAgICAgIH0KLSAgIH0KKwl7CisJCXN0cnVjdCBza19idWZmICpuZXdfc2I7CisJCWlmICgobmV3X3NiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpKSAhPSBOVUxMKSB7CisJCQlOU19QUlZfQlVGVFlQRShuZXdfc2IpID0gQlVGX1NNOworCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPnNicG9vbC5xdWV1ZSwgbmV3X3NiKTsKKwkJCXNrYl9yZXNlcnZlKG5ld19zYiwgTlNfQUFMMF9IRUFERVIpOworCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgbmV3X3NiKTsKKwkJfQorCX0KIH0KIAotCi0KLXN0YXRpYyB2b2lkIGRlcXVldWVfbGdfYnVmKG5zX2RldiAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKmxiKQorc3RhdGljIHZvaWQgZGVxdWV1ZV9sZ19idWYobnNfZGV2ICogY2FyZCwgc3RydWN0IHNrX2J1ZmYgKmxiKQogewotICAgc2tiX3VubGluayhsYiwgJmNhcmQtPmxicG9vbC5xdWV1ZSk7CisJc2tiX3VubGluayhsYiwgJmNhcmQtPmxicG9vbC5xdWV1ZSk7CiAjaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0gICBpZiAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLm1pbikKKwlpZiAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLm1pbikKICNlbHNlCi0gICBpZiAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLmluaXQpCi0gICB7Ci0gICAgICBzdHJ1Y3Qgc2tfYnVmZiAqbmV3X2xiOwotICAgICAgaWYgKChuZXdfbGIgPSBkZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSkpICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBOU19TS0JfQ0IobmV3X2xiKS0+YnVmX3R5cGUgPSBCVUZfTEc7Ci0gICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+bGJwb29sLnF1ZXVlLCBuZXdfbGIpOwotICAgICAgICAgc2tiX3Jlc2VydmUobmV3X2xiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgbmV3X2xiKTsKLSAgICAgIH0KLSAgIH0KLSAgIGlmIChjYXJkLT5sYmZxYyA8IGNhcmQtPmxibnIuaW5pdCkKKwlpZiAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLmluaXQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19sYjsKKwkJaWYgKChuZXdfbGIgPSBkZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSkpICE9IE5VTEwpIHsKKwkJCU5TX1BSVl9CVUZUWVBFKG5ld19sYikgPSBCVUZfTEc7CisJCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+bGJwb29sLnF1ZXVlLCBuZXdfbGIpOworCQkJc2tiX3Jlc2VydmUobmV3X2xiLCBOU19TTUJVRlNJWkUpOworCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgbmV3X2xiKTsKKwkJfQorCX0KKwlpZiAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLmluaXQpCiAjZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCi0gICB7Ci0gICAgICBzdHJ1Y3Qgc2tfYnVmZiAqbmV3X2xiOwotICAgICAgaWYgKChuZXdfbGIgPSBkZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSkpICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBOU19TS0JfQ0IobmV3X2xiKS0+YnVmX3R5cGUgPSBCVUZfTEc7Ci0gICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+bGJwb29sLnF1ZXVlLCBuZXdfbGIpOwotICAgICAgICAgc2tiX3Jlc2VydmUobmV3X2xiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgbmV3X2xiKTsKLSAgICAgIH0KLSAgIH0KKwl7CisJCXN0cnVjdCBza19idWZmICpuZXdfbGI7CisJCWlmICgobmV3X2xiID0gZGV2X2FsbG9jX3NrYihOU19MR1NLQlNJWkUpKSAhPSBOVUxMKSB7CisJCQlOU19QUlZfQlVGVFlQRShuZXdfbGIpID0gQlVGX0xHOworCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPmxicG9vbC5xdWV1ZSwgbmV3X2xiKTsKKwkJCXNrYl9yZXNlcnZlKG5ld19sYiwgTlNfU01CVUZTSVpFKTsKKwkJCXB1c2hfcnhidWZzKGNhcmQsIG5ld19sYik7CisJCX0KKwl9CiB9CiAKLQotCi1zdGF0aWMgaW50IG5zX3Byb2NfcmVhZChzdHJ1Y3QgYXRtX2RldiAqZGV2LCBsb2ZmX3QgKnBvcywgY2hhciAqcGFnZSkKK3N0YXRpYyBpbnQgbnNfcHJvY19yZWFkKHN0cnVjdCBhdG1fZGV2ICpkZXYsIGxvZmZfdCAqIHBvcywgY2hhciAqcGFnZSkKIHsKLSAgIHUzMiBzdGF0OwotICAgbnNfZGV2ICpjYXJkOwotICAgaW50IGxlZnQ7CisJdTMyIHN0YXQ7CisJbnNfZGV2ICpjYXJkOworCWludCBsZWZ0OwogCi0gICBsZWZ0ID0gKGludCkgKnBvczsKLSAgIGNhcmQgPSAobnNfZGV2ICopIGRldi0+ZGV2X2RhdGE7Ci0gICBzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgaWYgKCFsZWZ0LS0pCi0gICAgICByZXR1cm4gc3ByaW50ZihwYWdlLCAiUG9vbCAgIGNvdW50ICAgIG1pbiAgIGluaXQgICAgbWF4IFxuIik7Ci0gICBpZiAoIWxlZnQtLSkKLSAgICAgIHJldHVybiBzcHJpbnRmKHBhZ2UsICJTbWFsbCAgJTVkICAlNWQgICU1ZCAgJTVkIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG5zX3N0YXRfc2ZicWNfZ2V0KHN0YXQpLCBjYXJkLT5zYm5yLm1pbiwgY2FyZC0+c2Juci5pbml0LAotCQkgICAgIGNhcmQtPnNibnIubWF4KTsKLSAgIGlmICghbGVmdC0tKQotICAgICAgcmV0dXJuIHNwcmludGYocGFnZSwgIkxhcmdlICAlNWQgICU1ZCAgJTVkICAlNWQgXG4iLAotICAgICAgICAgICAgICAgICAgICAgbnNfc3RhdF9sZmJxY19nZXQoc3RhdCksIGNhcmQtPmxibnIubWluLCBjYXJkLT5sYm5yLmluaXQsCi0JCSAgICAgY2FyZC0+bGJuci5tYXgpOwotICAgaWYgKCFsZWZ0LS0pCi0gICAgICByZXR1cm4gc3ByaW50ZihwYWdlLCAiSHVnZSAgICU1ZCAgJTVkICAlNWQgICU1ZCBcbiIsIGNhcmQtPmhicG9vbC5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmhibnIubWluLCBjYXJkLT5oYm5yLmluaXQsIGNhcmQtPmhibnIubWF4KTsKLSAgIGlmICghbGVmdC0tKQotICAgICAgcmV0dXJuIHNwcmludGYocGFnZSwgIklvdmVjICAlNWQgICU1ZCAgJTVkICAlNWQgXG4iLCBjYXJkLT5pb3Zwb29sLmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgY2FyZC0+aW92bnIubWluLCBjYXJkLT5pb3Zuci5pbml0LCBjYXJkLT5pb3Zuci5tYXgpOwotICAgaWYgKCFsZWZ0LS0pCi0gICB7Ci0gICAgICBpbnQgcmV0dmFsOwotICAgICAgcmV0dmFsID0gc3ByaW50ZihwYWdlLCAiSW50ZXJydXB0IGNvdW50ZXI6ICV1IFxuIiwgY2FyZC0+aW50Y250KTsKLSAgICAgIGNhcmQtPmludGNudCA9IDA7Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgfQorCWxlZnQgPSAoaW50KSpwb3M7CisJY2FyZCA9IChuc19kZXYgKikgZGV2LT5kZXZfZGF0YTsKKwlzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOworCWlmICghbGVmdC0tKQorCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiUG9vbCAgIGNvdW50ICAgIG1pbiAgIGluaXQgICAgbWF4IFxuIik7CisJaWYgKCFsZWZ0LS0pCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJTbWFsbCAgJTVkICAlNWQgICU1ZCAgJTVkIFxuIiwKKwkJCSAgICAgICBuc19zdGF0X3NmYnFjX2dldChzdGF0KSwgY2FyZC0+c2Juci5taW4sCisJCQkgICAgICAgY2FyZC0+c2Juci5pbml0LCBjYXJkLT5zYm5yLm1heCk7CisJaWYgKCFsZWZ0LS0pCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJMYXJnZSAgJTVkICAlNWQgICU1ZCAgJTVkIFxuIiwKKwkJCSAgICAgICBuc19zdGF0X2xmYnFjX2dldChzdGF0KSwgY2FyZC0+bGJuci5taW4sCisJCQkgICAgICAgY2FyZC0+bGJuci5pbml0LCBjYXJkLT5sYm5yLm1heCk7CisJaWYgKCFsZWZ0LS0pCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJIdWdlICAgJTVkICAlNWQgICU1ZCAgJTVkIFxuIiwKKwkJCSAgICAgICBjYXJkLT5oYnBvb2wuY291bnQsIGNhcmQtPmhibnIubWluLAorCQkJICAgICAgIGNhcmQtPmhibnIuaW5pdCwgY2FyZC0+aGJuci5tYXgpOworCWlmICghbGVmdC0tKQorCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiSW92ZWMgICU1ZCAgJTVkICAlNWQgICU1ZCBcbiIsCisJCQkgICAgICAgY2FyZC0+aW92cG9vbC5jb3VudCwgY2FyZC0+aW92bnIubWluLAorCQkJICAgICAgIGNhcmQtPmlvdm5yLmluaXQsIGNhcmQtPmlvdm5yLm1heCk7CisJaWYgKCFsZWZ0LS0pIHsKKwkJaW50IHJldHZhbDsKKwkJcmV0dmFsID0KKwkJICAgIHNwcmludGYocGFnZSwgIkludGVycnVwdCBjb3VudGVyOiAldSBcbiIsIGNhcmQtPmludGNudCk7CisJCWNhcmQtPmludGNudCA9IDA7CisJCXJldHVybiByZXR2YWw7CisJfQogI2lmIDAKLSAgIC8qIER1bXAgMjUuNiBNYnBzIFBIWSByZWdpc3RlcnMgKi8KLSAgIC8qIE5vdyB0aGVyZSdzIGEgMjUuNiBNYnBzIFBIWSBkcml2ZXIgdGhpcyBjb2RlIGlzbid0IG5lZWRlZC4gSSBsZWZ0IGl0Ci0gICAgICBoZXJlIGp1c3QgaW4gY2FzZSBpdCdzIG5lZWRlZCBmb3IgZGVidWdnaW5nLiAqLwotICAgaWYgKGNhcmQtPm1heF9wY3IgPT0gQVRNXzI1X1BDUiAmJiAhbGVmdC0tKQotICAgewotICAgICAgdTMyIHBoeV9yZWdzWzRdOwotICAgICAgdTMyIGk7CisJLyogRHVtcCAyNS42IE1icHMgUEhZIHJlZ2lzdGVycyAqLworCS8qIE5vdyB0aGVyZSdzIGEgMjUuNiBNYnBzIFBIWSBkcml2ZXIgdGhpcyBjb2RlIGlzbid0IG5lZWRlZC4gSSBsZWZ0IGl0CisJICAgaGVyZSBqdXN0IGluIGNhc2UgaXQncyBuZWVkZWQgZm9yIGRlYnVnZ2luZy4gKi8KKwlpZiAoY2FyZC0+bWF4X3BjciA9PSBBVE1fMjVfUENSICYmICFsZWZ0LS0pIHsKKwkJdTMyIHBoeV9yZWdzWzRdOworCQl1MzIgaTsKIAotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHdoaWxlIChDTURfQlVTWShjYXJkKSk7Ci0gICAgICAgICB3cml0ZWwoTlNfQ01EX1JFQURfVVRJTElUWSB8IDB4MDAwMDAyMDAgfCBpLCBjYXJkLT5tZW1iYXNlICsgQ01EKTsKLSAgICAgICAgIHdoaWxlIChDTURfQlVTWShjYXJkKSk7Ci0gICAgICAgICBwaHlfcmVnc1tpXSA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBEUjApICYgMHgwMDAwMDBGRjsKLSAgICAgIH0KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJd2hpbGUgKENNRF9CVVNZKGNhcmQpKSA7CisJCQl3cml0ZWwoTlNfQ01EX1JFQURfVVRJTElUWSB8IDB4MDAwMDAyMDAgfCBpLAorCQkJICAgICAgIGNhcmQtPm1lbWJhc2UgKyBDTUQpOworCQkJd2hpbGUgKENNRF9CVVNZKGNhcmQpKSA7CisJCQlwaHlfcmVnc1tpXSA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBEUjApICYgMHgwMDAwMDBGRjsKKwkJfQogCi0gICAgICByZXR1cm4gc3ByaW50ZihwYWdlLCAiUEhZIHJlZ3M6IDB4JTAyWCAweCUwMlggMHglMDJYIDB4JTAyWCBcbiIsCi0gICAgICAgICAgICAgICAgICAgICBwaHlfcmVnc1swXSwgcGh5X3JlZ3NbMV0sIHBoeV9yZWdzWzJdLCBwaHlfcmVnc1szXSk7Ci0gICB9CisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJQSFkgcmVnczogMHglMDJYIDB4JTAyWCAweCUwMlggMHglMDJYIFxuIiwKKwkJCSAgICAgICBwaHlfcmVnc1swXSwgcGh5X3JlZ3NbMV0sIHBoeV9yZWdzWzJdLAorCQkJICAgICAgIHBoeV9yZWdzWzNdKTsKKwl9CiAjZW5kaWYgLyogMCAtIER1bXAgMjUuNiBNYnBzIFBIWSByZWdpc3RlcnMgKi8KICNpZiAwCi0gICAvKiBEdW1wIFRTVCAqLwotICAgaWYgKGxlZnQtLSA8IE5TX1RTVF9OVU1fRU5UUklFUykKLSAgIHsKLSAgICAgIGlmIChjYXJkLT50c3RlMnZjW2xlZnQgKyAxXSA9PSBOVUxMKQotICAgICAgICAgcmV0dXJuIHNwcmludGYocGFnZSwgIiU1ZCAtIFZCUi9VQlIgXG4iLCBsZWZ0ICsgMSk7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gc3ByaW50ZihwYWdlLCAiJTVkIC0gJWQgJWQgXG4iLCBsZWZ0ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnRzdGUydmNbbGVmdCArIDFdLT50eF92Y2MtPnZwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnRzdGUydmNbbGVmdCArIDFdLT50eF92Y2MtPnZjaSk7Ci0gICB9CisJLyogRHVtcCBUU1QgKi8KKwlpZiAobGVmdC0tIDwgTlNfVFNUX05VTV9FTlRSSUVTKSB7CisJCWlmIChjYXJkLT50c3RlMnZjW2xlZnQgKyAxXSA9PSBOVUxMKQorCQkJcmV0dXJuIHNwcmludGYocGFnZSwgIiU1ZCAtIFZCUi9VQlIgXG4iLCBsZWZ0ICsgMSk7CisJCWVsc2UKKwkJCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlNWQgLSAlZCAlZCBcbiIsIGxlZnQgKyAxLAorCQkJCSAgICAgICBjYXJkLT50c3RlMnZjW2xlZnQgKyAxXS0+dHhfdmNjLT52cGksCisJCQkJICAgICAgIGNhcmQtPnRzdGUydmNbbGVmdCArIDFdLT50eF92Y2MtPnZjaSk7CisJfQogI2VuZGlmIC8qIDAgKi8KLSAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi0KLQotc3RhdGljIGludCBuc19pb2N0bChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBuc19pb2N0bChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKIHsKLSAgIG5zX2RldiAqY2FyZDsKLSAgIHBvb2xfbGV2ZWxzIHBsOwotICAgbG9uZyBidHlwZTsKLSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbnNfZGV2ICpjYXJkOworCXBvb2xfbGV2ZWxzIHBsOworCWxvbmcgYnR5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotICAgY2FyZCA9IGRldi0+ZGV2X2RhdGE7Ci0gICBzd2l0Y2ggKGNtZCkKLSAgIHsKLSAgICAgIGNhc2UgTlNfR0VUUFNUQVQ6Ci0gICAgICAgICBpZiAoZ2V0X3VzZXIocGwuYnVmdHlwZSwgJigocG9vbF9sZXZlbHMgX191c2VyICopIGFyZyktPmJ1ZnR5cGUpKQotCSAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgIHN3aXRjaCAocGwuYnVmdHlwZSkKLQkgewotCSAgICBjYXNlIE5TX0JVRlRZUEVfU01BTEw6Ci0JICAgICAgIHBsLmNvdW50ID0gbnNfc3RhdF9zZmJxY19nZXQocmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpKTsKLQkgICAgICAgcGwubGV2ZWwubWluID0gY2FyZC0+c2Juci5taW47Ci0JICAgICAgIHBsLmxldmVsLmluaXQgPSBjYXJkLT5zYm5yLmluaXQ7Ci0JICAgICAgIHBsLmxldmVsLm1heCA9IGNhcmQtPnNibnIubWF4OwotCSAgICAgICBicmVhazsKKwljYXJkID0gZGV2LT5kZXZfZGF0YTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTlNfR0VUUFNUQVQ6CisJCWlmIChnZXRfdXNlcgorCQkgICAgKHBsLmJ1ZnR5cGUsICYoKHBvb2xfbGV2ZWxzIF9fdXNlciAqKSBhcmcpLT5idWZ0eXBlKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzd2l0Y2ggKHBsLmJ1ZnR5cGUpIHsKKwkJY2FzZSBOU19CVUZUWVBFX1NNQUxMOgorCQkJcGwuY291bnQgPQorCQkJICAgIG5zX3N0YXRfc2ZicWNfZ2V0KHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKSk7CisJCQlwbC5sZXZlbC5taW4gPSBjYXJkLT5zYm5yLm1pbjsKKwkJCXBsLmxldmVsLmluaXQgPSBjYXJkLT5zYm5yLmluaXQ7CisJCQlwbC5sZXZlbC5tYXggPSBjYXJkLT5zYm5yLm1heDsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgTlNfQlVGVFlQRV9MQVJHRToKLQkgICAgICAgcGwuY291bnQgPSBuc19zdGF0X2xmYnFjX2dldChyZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCkpOwotCSAgICAgICBwbC5sZXZlbC5taW4gPSBjYXJkLT5sYm5yLm1pbjsKLQkgICAgICAgcGwubGV2ZWwuaW5pdCA9IGNhcmQtPmxibnIuaW5pdDsKLQkgICAgICAgcGwubGV2ZWwubWF4ID0gY2FyZC0+bGJuci5tYXg7Ci0JICAgICAgIGJyZWFrOworCQljYXNlIE5TX0JVRlRZUEVfTEFSR0U6CisJCQlwbC5jb3VudCA9CisJCQkgICAgbnNfc3RhdF9sZmJxY19nZXQocmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpKTsKKwkJCXBsLmxldmVsLm1pbiA9IGNhcmQtPmxibnIubWluOworCQkJcGwubGV2ZWwuaW5pdCA9IGNhcmQtPmxibnIuaW5pdDsKKwkJCXBsLmxldmVsLm1heCA9IGNhcmQtPmxibnIubWF4OworCQkJYnJlYWs7CiAKLQkgICAgY2FzZSBOU19CVUZUWVBFX0hVR0U6Ci0JICAgICAgIHBsLmNvdW50ID0gY2FyZC0+aGJwb29sLmNvdW50OwotCSAgICAgICBwbC5sZXZlbC5taW4gPSBjYXJkLT5oYm5yLm1pbjsKLQkgICAgICAgcGwubGV2ZWwuaW5pdCA9IGNhcmQtPmhibnIuaW5pdDsKLQkgICAgICAgcGwubGV2ZWwubWF4ID0gY2FyZC0+aGJuci5tYXg7Ci0JICAgICAgIGJyZWFrOworCQljYXNlIE5TX0JVRlRZUEVfSFVHRToKKwkJCXBsLmNvdW50ID0gY2FyZC0+aGJwb29sLmNvdW50OworCQkJcGwubGV2ZWwubWluID0gY2FyZC0+aGJuci5taW47CisJCQlwbC5sZXZlbC5pbml0ID0gY2FyZC0+aGJuci5pbml0OworCQkJcGwubGV2ZWwubWF4ID0gY2FyZC0+aGJuci5tYXg7CisJCQlicmVhazsKIAotCSAgICBjYXNlIE5TX0JVRlRZUEVfSU9WRUM6Ci0JICAgICAgIHBsLmNvdW50ID0gY2FyZC0+aW92cG9vbC5jb3VudDsKLQkgICAgICAgcGwubGV2ZWwubWluID0gY2FyZC0+aW92bnIubWluOwotCSAgICAgICBwbC5sZXZlbC5pbml0ID0gY2FyZC0+aW92bnIuaW5pdDsKLQkgICAgICAgcGwubGV2ZWwubWF4ID0gY2FyZC0+aW92bnIubWF4OwotCSAgICAgICBicmVhazsKKwkJY2FzZSBOU19CVUZUWVBFX0lPVkVDOgorCQkJcGwuY291bnQgPSBjYXJkLT5pb3Zwb29sLmNvdW50OworCQkJcGwubGV2ZWwubWluID0gY2FyZC0+aW92bnIubWluOworCQkJcGwubGV2ZWwuaW5pdCA9IGNhcmQtPmlvdm5yLmluaXQ7CisJCQlwbC5sZXZlbC5tYXggPSBjYXJkLT5pb3Zuci5tYXg7CisJCQlicmVhazsKIAotICAgICAgICAgICAgZGVmYXVsdDoKLQkgICAgICAgcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAKLQkgfQotICAgICAgICAgaWYgKCFjb3B5X3RvX3VzZXIoKHBvb2xfbGV2ZWxzIF9fdXNlciAqKSBhcmcsICZwbCwgc2l6ZW9mKHBsKSkpCi0JICAgIHJldHVybiAoc2l6ZW9mKHBsKSk7Ci0JIGVsc2UKLQkgICAgcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKCFjb3B5X3RvX3VzZXIoKHBvb2xfbGV2ZWxzIF9fdXNlciAqKSBhcmcsICZwbCwgc2l6ZW9mKHBsKSkpCisJCQlyZXR1cm4gKHNpemVvZihwbCkpOworCQllbHNlCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotICAgICAgY2FzZSBOU19TRVRCVUZMRVY6Ci0gICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JICAgIHJldHVybiAtRVBFUk07Ci0gICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnBsLCAocG9vbF9sZXZlbHMgX191c2VyICopIGFyZywgc2l6ZW9mKHBsKSkpCi0JICAgIHJldHVybiAtRUZBVUxUOwotCSBpZiAocGwubGV2ZWwubWluID49IHBsLmxldmVsLmluaXQgfHwgcGwubGV2ZWwuaW5pdCA+PSBwbC5sZXZlbC5tYXgpCi0JICAgIHJldHVybiAtRUlOVkFMOwotCSBpZiAocGwubGV2ZWwubWluID09IDApCi0JICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgc3dpdGNoIChwbC5idWZ0eXBlKQotCSB7Ci0JICAgIGNhc2UgTlNfQlVGVFlQRV9TTUFMTDoKLSAgICAgICAgICAgICAgIGlmIChwbC5sZXZlbC5tYXggPiBUT1BfU0IpCi0JICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCSAgICAgICBjYXJkLT5zYm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKLQkgICAgICAgY2FyZC0+c2Juci5pbml0ID0gcGwubGV2ZWwuaW5pdDsKLQkgICAgICAgY2FyZC0+c2Juci5tYXggPSBwbC5sZXZlbC5tYXg7Ci0JICAgICAgIGJyZWFrOworCWNhc2UgTlNfU0VUQlVGTEVWOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBsLCAocG9vbF9sZXZlbHMgX191c2VyICopIGFyZywgc2l6ZW9mKHBsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHBsLmxldmVsLm1pbiA+PSBwbC5sZXZlbC5pbml0CisJCSAgICB8fCBwbC5sZXZlbC5pbml0ID49IHBsLmxldmVsLm1heCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocGwubGV2ZWwubWluID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3dpdGNoIChwbC5idWZ0eXBlKSB7CisJCWNhc2UgTlNfQlVGVFlQRV9TTUFMTDoKKwkJCWlmIChwbC5sZXZlbC5tYXggPiBUT1BfU0IpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljYXJkLT5zYm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKKwkJCWNhcmQtPnNibnIuaW5pdCA9IHBsLmxldmVsLmluaXQ7CisJCQljYXJkLT5zYm5yLm1heCA9IHBsLmxldmVsLm1heDsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgTlNfQlVGVFlQRV9MQVJHRToKLSAgICAgICAgICAgICAgIGlmIChwbC5sZXZlbC5tYXggPiBUT1BfTEIpCi0JICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCSAgICAgICBjYXJkLT5sYm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKLQkgICAgICAgY2FyZC0+bGJuci5pbml0ID0gcGwubGV2ZWwuaW5pdDsKLQkgICAgICAgY2FyZC0+bGJuci5tYXggPSBwbC5sZXZlbC5tYXg7Ci0JICAgICAgIGJyZWFrOworCQljYXNlIE5TX0JVRlRZUEVfTEFSR0U6CisJCQlpZiAocGwubGV2ZWwubWF4ID4gVE9QX0xCKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJY2FyZC0+bGJuci5taW4gPSBwbC5sZXZlbC5taW47CisJCQljYXJkLT5sYm5yLmluaXQgPSBwbC5sZXZlbC5pbml0OworCQkJY2FyZC0+bGJuci5tYXggPSBwbC5sZXZlbC5tYXg7CisJCQlicmVhazsKIAotCSAgICBjYXNlIE5TX0JVRlRZUEVfSFVHRToKLSAgICAgICAgICAgICAgIGlmIChwbC5sZXZlbC5tYXggPiBUT1BfSEIpCi0JICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCSAgICAgICBjYXJkLT5oYm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKLQkgICAgICAgY2FyZC0+aGJuci5pbml0ID0gcGwubGV2ZWwuaW5pdDsKLQkgICAgICAgY2FyZC0+aGJuci5tYXggPSBwbC5sZXZlbC5tYXg7Ci0JICAgICAgIGJyZWFrOworCQljYXNlIE5TX0JVRlRZUEVfSFVHRToKKwkJCWlmIChwbC5sZXZlbC5tYXggPiBUT1BfSEIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljYXJkLT5oYm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKKwkJCWNhcmQtPmhibnIuaW5pdCA9IHBsLmxldmVsLmluaXQ7CisJCQljYXJkLT5oYm5yLm1heCA9IHBsLmxldmVsLm1heDsKKwkJCWJyZWFrOwogCi0JICAgIGNhc2UgTlNfQlVGVFlQRV9JT1ZFQzoKLSAgICAgICAgICAgICAgIGlmIChwbC5sZXZlbC5tYXggPiBUT1BfSU9WQikKLQkgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0JICAgICAgIGNhcmQtPmlvdm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKLQkgICAgICAgY2FyZC0+aW92bnIuaW5pdCA9IHBsLmxldmVsLmluaXQ7Ci0JICAgICAgIGNhcmQtPmlvdm5yLm1heCA9IHBsLmxldmVsLm1heDsKLQkgICAgICAgYnJlYWs7CisJCWNhc2UgTlNfQlVGVFlQRV9JT1ZFQzoKKwkJCWlmIChwbC5sZXZlbC5tYXggPiBUT1BfSU9WQikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWNhcmQtPmlvdm5yLm1pbiA9IHBsLmxldmVsLm1pbjsKKwkJCWNhcmQtPmlvdm5yLmluaXQgPSBwbC5sZXZlbC5pbml0OworCQkJY2FyZC0+aW92bnIubWF4ID0gcGwubGV2ZWwubWF4OworCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0JICAgICAgIHJldHVybiAtRUlOVkFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAgICAgIH0JIAotICAgICAgICAgcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDA7CiAKLSAgICAgIGNhc2UgTlNfQURKQlVGTEVWOgotICAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCSAgICByZXR1cm4gLUVQRVJNOwotICAgICAgICAgYnR5cGUgPSAobG9uZykgYXJnOwkvKiBhIGxvbmcgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgb3IgYmlnZ2VyICovCi0gICAgICAgICBzd2l0Y2ggKGJ0eXBlKQotCSB7Ci0JICAgIGNhc2UgTlNfQlVGVFlQRV9TTUFMTDoKLQkgICAgICAgd2hpbGUgKGNhcmQtPnNiZnFjIDwgY2FyZC0+c2Juci5pbml0KQotCSAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2I7CisJY2FzZSBOU19BREpCVUZMRVY6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWJ0eXBlID0gKGxvbmcpYXJnOwkvKiBhIGxvbmcgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgb3IgYmlnZ2VyICovCisJCXN3aXRjaCAoYnR5cGUpIHsKKwkJY2FzZSBOU19CVUZUWVBFX1NNQUxMOgorCQkJd2hpbGUgKGNhcmQtPnNiZnFjIDwgY2FyZC0+c2Juci5pbml0KSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNiOwogCi0gICAgICAgICAgICAgICAgICBzYiA9IF9fZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUsIEdGUF9LRVJORUwpOwotICAgICAgICAgICAgICAgICAgaWYgKHNiID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICAgIE5TX1NLQl9DQihzYiktPmJ1Zl90eXBlID0gQlVGX1NNOwotICAgICAgICAgICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPnNicG9vbC5xdWV1ZSwgc2IpOwotICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoc2IsIE5TX0FBTDBfSEVBREVSKTsKLSAgICAgICAgICAgICAgICAgIHB1c2hfcnhidWZzKGNhcmQsIHNiKTsKLQkgICAgICAgfQotCSAgICAgICBicmVhazsKKwkJCQlzYiA9IF9fZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUsIEdGUF9LRVJORUwpOworCQkJCWlmIChzYiA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlOU19QUlZfQlVGVFlQRShzYikgPSBCVUZfU007CisJCQkJc2tiX3F1ZXVlX3RhaWwoJmNhcmQtPnNicG9vbC5xdWV1ZSwgc2IpOworCQkJCXNrYl9yZXNlcnZlKHNiLCBOU19BQUwwX0hFQURFUik7CisJCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgc2IpOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgTlNfQlVGVFlQRV9MQVJHRToKLQkgICAgICAgd2hpbGUgKGNhcmQtPmxiZnFjIDwgY2FyZC0+bGJuci5pbml0KQotCSAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqbGI7CisJCWNhc2UgTlNfQlVGVFlQRV9MQVJHRToKKwkJCXdoaWxlIChjYXJkLT5sYmZxYyA8IGNhcmQtPmxibnIuaW5pdCkgeworCQkJCXN0cnVjdCBza19idWZmICpsYjsKIAotICAgICAgICAgICAgICAgICAgbGIgPSBfX2Rldl9hbGxvY19za2IoTlNfTEdTS0JTSVpFLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgICAgICAgICAgIGlmIChsYiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICBOU19TS0JfQ0IobGIpLT5idWZfdHlwZSA9IEJVRl9MRzsKLSAgICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5sYnBvb2wucXVldWUsIGxiKTsKLSAgICAgICAgICAgICAgICAgIHNrYl9yZXNlcnZlKGxiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgICAgICAgICAgcHVzaF9yeGJ1ZnMoY2FyZCwgbGIpOwotCSAgICAgICB9Ci0JICAgICAgIGJyZWFrOworCQkJCWxiID0gX19kZXZfYWxsb2Nfc2tiKE5TX0xHU0tCU0laRSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGxiID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCU5TX1BSVl9CVUZUWVBFKGxiKSA9IEJVRl9MRzsKKwkJCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+bGJwb29sLnF1ZXVlLCBsYik7CisJCQkJc2tiX3Jlc2VydmUobGIsIE5TX1NNQlVGU0laRSk7CisJCQkJcHVzaF9yeGJ1ZnMoY2FyZCwgbGIpOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgTlNfQlVGVFlQRV9IVUdFOgotICAgICAgICAgICAgICAgd2hpbGUgKGNhcmQtPmhicG9vbC5jb3VudCA+IGNhcmQtPmhibnIuaW5pdCkKLQkgICAgICAgewotICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKmhiOworCQljYXNlIE5TX0JVRlRZUEVfSFVHRToKKwkJCXdoaWxlIChjYXJkLT5oYnBvb2wuY291bnQgPiBjYXJkLT5oYm5yLmluaXQpIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqaGI7CiAKLSAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOwotCQkgIGhiID0gc2tiX2RlcXVldWUoJmNhcmQtPmhicG9vbC5xdWV1ZSk7Ci0JCSAgY2FyZC0+aGJwb29sLmNvdW50LS07Ci0gICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgaWYgKGhiID09IE5VTEwpCi0JCSAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGh1Z2UgYnVmZmVyIGNvdW50IGluY29uc2lzdGVudC5cbiIsCi0JCSAgICAgICAgICAgIGNhcmQtPmluZGV4KTsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLQkJICAgICBkZXZfa2ZyZWVfc2tiX2FueShoYik7Ci0JCSAgCi0JICAgICAgIH0KLSAgICAgICAgICAgICAgIHdoaWxlIChjYXJkLT5oYnBvb2wuY291bnQgPCBjYXJkLT5oYm5yLmluaXQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaGI7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludF9sb2NrLCBmbGFncyk7CisJCQkJaGIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aGJwb29sLnF1ZXVlKTsKKwkJCQljYXJkLT5oYnBvb2wuY291bnQtLTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOworCQkJCWlmIChoYiA9PSBOVUxMKQorCQkJCQlwcmludGsKKwkJCQkJICAgICgibmljc3RhciVkOiBodWdlIGJ1ZmZlciBjb3VudCBpbmNvbnNpc3RlbnQuXG4iLAorCQkJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCQllbHNlCisJCQkJCWRldl9rZnJlZV9za2JfYW55KGhiKTsKIAotICAgICAgICAgICAgICAgICAgaGIgPSBfX2Rldl9hbGxvY19za2IoTlNfSEJVRlNJWkUsIEdGUF9LRVJORUwpOwotICAgICAgICAgICAgICAgICAgaWYgKGhiID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICAgIE5TX1NLQl9DQihoYiktPmJ1Zl90eXBlID0gQlVGX05PTkU7Ci0gICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKLSAgICAgICAgICAgICAgICAgIGNhcmQtPmhicG9vbC5jb3VudCsrOwotICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgIH0KLQkgICAgICAgYnJlYWs7CisJCQl9CisJCQl3aGlsZSAoY2FyZC0+aGJwb29sLmNvdW50IDwgY2FyZC0+aGJuci5pbml0KSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKmhiOwogCi0gICAgICAgICAgICBjYXNlIE5TX0JVRlRZUEVfSU9WRUM6Ci0JICAgICAgIHdoaWxlIChjYXJkLT5pb3Zwb29sLmNvdW50ID4gY2FyZC0+aW92bnIuaW5pdCkKLQkgICAgICAgewotCSAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKKwkJCQloYiA9IF9fZGV2X2FsbG9jX3NrYihOU19IQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGhiID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCU5TX1BSVl9CVUZUWVBFKGhiKSA9IEJVRl9OT05FOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOworCQkJCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKKwkJCQljYXJkLT5oYnBvb2wuY291bnQrKzsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOwotCQkgIGlvdmIgPSBza2JfZGVxdWV1ZSgmY2FyZC0+aW92cG9vbC5xdWV1ZSk7Ci0JCSAgY2FyZC0+aW92cG9vbC5jb3VudC0tOwotICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpb3ZiID09IE5VTEwpCi0JCSAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6IGlvdmVjIGJ1ZmZlciBjb3VudCBpbmNvbnNpc3RlbnQuXG4iLAotCQkgICAgICAgICAgICBjYXJkLT5pbmRleCk7Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0JCSAgICAgZGV2X2tmcmVlX3NrYl9hbnkoaW92Yik7CisJCWNhc2UgTlNfQlVGVFlQRV9JT1ZFQzoKKwkJCXdoaWxlIChjYXJkLT5pb3Zwb29sLmNvdW50ID4gY2FyZC0+aW92bnIuaW5pdCkgeworCQkJCXN0cnVjdCBza19idWZmICppb3ZiOwogCi0JICAgICAgIH0KLSAgICAgICAgICAgICAgIHdoaWxlIChjYXJkLT5pb3Zwb29sLmNvdW50IDwgY2FyZC0+aW92bnIuaW5pdCkKLQkgICAgICAgewotCSAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaW92YjsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKKwkJCQlpb3ZiID0gc2tiX2RlcXVldWUoJmNhcmQtPmlvdnBvb2wucXVldWUpOworCQkJCWNhcmQtPmlvdnBvb2wuY291bnQtLTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOworCQkJCWlmIChpb3ZiID09IE5VTEwpCisJCQkJCXByaW50aworCQkJCQkgICAgKCJuaWNzdGFyJWQ6IGlvdmVjIGJ1ZmZlciBjb3VudCBpbmNvbnNpc3RlbnQuXG4iLAorCQkJCQkgICAgIGNhcmQtPmluZGV4KTsKKwkJCQllbHNlCisJCQkJCWRldl9rZnJlZV9za2JfYW55KGlvdmIpOwogCi0gICAgICAgICAgICAgICAgICBpb3ZiID0gYWxsb2Nfc2tiKE5TX0lPVkJVRlNJWkUsIEdGUF9LRVJORUwpOwotICAgICAgICAgICAgICAgICAgaWYgKGlvdmIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgICAgTlNfU0tCX0NCKGlvdmIpLT5idWZfdHlwZSA9IEJVRl9OT05FOwotICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludF9sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmY2FyZC0+aW92cG9vbC5xdWV1ZSwgaW92Yik7Ci0gICAgICAgICAgICAgICAgICBjYXJkLT5pb3Zwb29sLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRfbG9jaywgZmxhZ3MpOwotCSAgICAgICB9Ci0JICAgICAgIGJyZWFrOworCQkJfQorCQkJd2hpbGUgKGNhcmQtPmlvdnBvb2wuY291bnQgPCBjYXJkLT5pb3Zuci5pbml0KSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKmlvdmI7CiAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0JICAgICAgIHJldHVybiAtRUlOVkFMOworCQkJCWlvdmIgPSBhbGxvY19za2IoTlNfSU9WQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGlvdmIgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJTlNfUFJWX0JVRlRZUEUoaW92YikgPSBCVUZfTk9ORTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKKwkJCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+aW92cG9vbC5xdWV1ZSwgaW92Yik7CisJCQkJY2FyZC0+aW92cG9vbC5jb3VudCsrOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludF9sb2NrLCBmbGFncyk7CisJCQl9CisJCQlicmVhazsKIAotCSB9Ci0gICAgICAgICByZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOwogCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgaWYgKGRldi0+cGh5ICYmIGRldi0+cGh5LT5pb2N0bCkgewotICAgICAgICAgICAgcmV0dXJuIGRldi0+cGh5LT5pb2N0bChkZXYsIGNtZCwgYXJnKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcHJpbnRrKCJuaWNzdGFyJWQ6ICVzID09IE5VTEwgXG4iLCBjYXJkLT5pbmRleCwKLSAgICAgICAgICAgICAgICAgICBkZXYtPnBoeSA/ICJkZXYtPnBoeS0+aW9jdGwiIDogImRldi0+cGh5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLUVOT0lPQ1RMQ01EOwotICAgICAgICAgfQotICAgfQorCQl9CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJaWYgKGRldi0+cGh5ICYmIGRldi0+cGh5LT5pb2N0bCkgeworCQkJcmV0dXJuIGRldi0+cGh5LT5pb2N0bChkZXYsIGNtZCwgYXJnKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygibmljc3RhciVkOiAlcyA9PSBOVUxMIFxuIiwgY2FyZC0+aW5kZXgsCisJCQkgICAgICAgZGV2LT5waHkgPyAiZGV2LT5waHktPmlvY3RsIiA6ICJkZXYtPnBoeSIpOworCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJfQorCX0KIH0KIAotCi1zdGF0aWMgdm9pZCB3aGljaF9saXN0KG5zX2RldiAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKKyNpZmRlZiBFWFRSQV9ERUJVRworc3RhdGljIHZvaWQgd2hpY2hfbGlzdChuc19kZXYgKiBjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXByaW50aygic2tiIGJ1Zl90eXBlOiAweCUwOHhcbiIsIE5TX1NLQl9DQihza2IpLT5idWZfdHlwZSk7CisJcHJpbnRrKCJza2IgYnVmX3R5cGU6IDB4JTA4eFxuIiwgTlNfUFJWX0JVRlRZUEUoc2tiKSk7CiB9Ci0KKyNlbmRpZiAvKiBFWFRSQV9ERUJVRyAqLwogCiBzdGF0aWMgdm9pZCBuc19wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKQogewotICAgaW50IGk7Ci0gICBuc19kZXYgKmNhcmQ7Ci0gICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgdTMyIHN0YXRfciwgc3RhdF93OworCWludCBpOworCW5zX2RldiAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0X3IsIHN0YXRfdzsKIAotICAgUFJJTlRLKCJuaWNzdGFyOiBFbnRlcmluZyBuc19wb2xsKCkuXG4iKTsKLSAgIGZvciAoaSA9IDA7IGkgPCBudW1fY2FyZHM7IGkrKykKLSAgIHsKLSAgICAgIGNhcmQgPSBjYXJkc1tpXTsKLSAgICAgIGlmIChzcGluX2lzX2xvY2tlZCgmY2FyZC0+aW50X2xvY2spKSB7Ci0gICAgICAvKiBQcm9iYWJseSBpdCBpc24ndCB3b3J0aCBzcGlubmluZyAqLwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKKwlQUklOVEsoIm5pY3N0YXI6IEVudGVyaW5nIG5zX3BvbGwoKS5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FyZHM7IGkrKykgeworCQljYXJkID0gY2FyZHNbaV07CisJCWlmIChzcGluX2lzX2xvY2tlZCgmY2FyZC0+aW50X2xvY2spKSB7CisJCQkvKiBQcm9iYWJseSBpdCBpc24ndCB3b3J0aCBzcGlubmluZyAqLworCQkJY29udGludWU7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludF9sb2NrLCBmbGFncyk7CiAKLSAgICAgIHN0YXRfdyA9IDA7Ci0gICAgICBzdGF0X3IgPSByZWFkbChjYXJkLT5tZW1iYXNlICsgU1RBVCk7Ci0gICAgICBpZiAoc3RhdF9yICYgTlNfU1RBVF9UU0lGKQotICAgICAgICAgc3RhdF93IHw9IE5TX1NUQVRfVFNJRjsKLSAgICAgIGlmIChzdGF0X3IgJiBOU19TVEFUX0VPUERVKQotICAgICAgICAgc3RhdF93IHw9IE5TX1NUQVRfRU9QRFU7CisJCXN0YXRfdyA9IDA7CisJCXN0YXRfciA9IHJlYWRsKGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwkJaWYgKHN0YXRfciAmIE5TX1NUQVRfVFNJRikKKwkJCXN0YXRfdyB8PSBOU19TVEFUX1RTSUY7CisJCWlmIChzdGF0X3IgJiBOU19TVEFUX0VPUERVKQorCQkJc3RhdF93IHw9IE5TX1NUQVRfRU9QRFU7CiAKLSAgICAgIHByb2Nlc3NfdHNxKGNhcmQpOwotICAgICAgcHJvY2Vzc19yc3EoY2FyZCk7CisJCXByb2Nlc3NfdHNxKGNhcmQpOworCQlwcm9jZXNzX3JzcShjYXJkKTsKIAotICAgICAgd3JpdGVsKHN0YXRfdywgY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKLSAgIH0KLSAgIG1vZF90aW1lcigmbnNfdGltZXIsIGppZmZpZXMgKyBOU19QT0xMX1BFUklPRCk7Ci0gICBQUklOVEsoIm5pY3N0YXI6IExlYXZpbmcgbnNfcG9sbCgpLlxuIik7CisJCXdyaXRlbChzdGF0X3csIGNhcmQtPm1lbWJhc2UgKyBTVEFUKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aW50X2xvY2ssIGZsYWdzKTsKKwl9CisJbW9kX3RpbWVyKCZuc190aW1lciwgamlmZmllcyArIE5TX1BPTExfUEVSSU9EKTsKKwlQUklOVEsoIm5pY3N0YXI6IExlYXZpbmcgbnNfcG9sbCgpLlxuIik7CiB9CiAKLQotCiBzdGF0aWMgaW50IG5zX3BhcnNlX21hYyhjaGFyICptYWMsIHVuc2lnbmVkIGNoYXIgKmVzaSkKIHsKLSAgIGludCBpLCBqOwotICAgc2hvcnQgYnl0ZTEsIGJ5dGUwOworCWludCBpLCBqOworCXNob3J0IGJ5dGUxLCBieXRlMDsKIAotICAgaWYgKG1hYyA9PSBOVUxMIHx8IGVzaSA9PSBOVUxMKQotICAgICAgcmV0dXJuIC0xOwotICAgaiA9IDA7Ci0gICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgewotICAgICAgaWYgKChieXRlMSA9IG5zX2gyaShtYWNbaisrXSkpIDwgMCkKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGlmICgoYnl0ZTAgPSBuc19oMmkobWFjW2orK10pKSA8IDApCi0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBlc2lbaV0gPSAodW5zaWduZWQgY2hhcikgKGJ5dGUxICogMTYgKyBieXRlMCk7Ci0gICAgICBpZiAoaSA8IDUpCi0gICAgICB7Ci0gICAgICAgICBpZiAobWFjW2orK10gIT0gJzonKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgfQotICAgcmV0dXJuIDA7CisJaWYgKG1hYyA9PSBOVUxMIHx8IGVzaSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAoKGJ5dGUxID0gaGV4X3RvX2JpbihtYWNbaisrXSkpIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKChieXRlMCA9IGhleF90b19iaW4obWFjW2orK10pKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWVzaVtpXSA9ICh1bnNpZ25lZCBjaGFyKShieXRlMSAqIDE2ICsgYnl0ZTApOworCQlpZiAoaSA8IDUpIHsKKwkJCWlmIChtYWNbaisrXSAhPSAnOicpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOwogfQogCiAKLQotc3RhdGljIHNob3J0IG5zX2gyaShjaGFyIGMpCi17Ci0gICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICByZXR1cm4gKHNob3J0KSAoYyAtICcwJyk7Ci0gICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCi0gICAgICByZXR1cm4gKHNob3J0KSAoYyAtICdBJyArIDEwKTsKLSAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLSAgICAgIHJldHVybiAoc2hvcnQpIChjIC0gJ2EnICsgMTApOwotICAgcmV0dXJuIC0xOwotfQotCi0KLQogc3RhdGljIHZvaWQgbnNfcGh5X3B1dChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0gICBuc19kZXYgKmNhcmQ7Ci0gICB1bnNpZ25lZCBsb25nIGZsYWdzOworCW5zX2RldiAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICBjYXJkID0gZGV2LT5kZXZfZGF0YTsKLSAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5yZXNfbG9jaywgZmxhZ3MpOwotICAgd2hpbGUoQ01EX0JVU1koY2FyZCkpOwotICAgd3JpdGVsKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSwgY2FyZC0+bWVtYmFzZSArIERSMCk7Ci0gICB3cml0ZWwoTlNfQ01EX1dSSVRFX1VUSUxJVFkgfCAweDAwMDAwMjAwIHwgKGFkZHIgJiAweDAwMDAwMEZGKSwKLSAgICAgICAgICBjYXJkLT5tZW1iYXNlICsgQ01EKTsKLSAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7CisJY2FyZCA9IGRldi0+ZGV2X2RhdGE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7CisJd2hpbGUgKENNRF9CVVNZKGNhcmQpKSA7CisJd3JpdGVsKCh1MzIpIHZhbHVlLCBjYXJkLT5tZW1iYXNlICsgRFIwKTsKKwl3cml0ZWwoTlNfQ01EX1dSSVRFX1VUSUxJVFkgfCAweDAwMDAwMjAwIHwgKGFkZHIgJiAweDAwMDAwMEZGKSwKKwkgICAgICAgY2FyZC0+bWVtYmFzZSArIENNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKIH0KIAotCi0KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG5zX3BoeV9nZXQoc3RydWN0IGF0bV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotICAgbnNfZGV2ICpjYXJkOwotICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgIHVuc2lnbmVkIGxvbmcgZGF0YTsKKwluc19kZXYgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZGF0YTsKIAotICAgY2FyZCA9IGRldi0+ZGV2X2RhdGE7Ci0gICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKLSAgIHdoaWxlKENNRF9CVVNZKGNhcmQpKTsKLSAgIHdyaXRlbChOU19DTURfUkVBRF9VVElMSVRZIHwgMHgwMDAwMDIwMCB8IChhZGRyICYgMHgwMDAwMDBGRiksCi0gICAgICAgICAgY2FyZC0+bWVtYmFzZSArIENNRCk7Ci0gICB3aGlsZShDTURfQlVTWShjYXJkKSk7Ci0gICBkYXRhID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIERSMCkgJiAweDAwMDAwMEZGOwotICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKLSAgIHJldHVybiAodW5zaWduZWQgY2hhcikgZGF0YTsKKwljYXJkID0gZGV2LT5kZXZfZGF0YTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cmVzX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwl3cml0ZWwoTlNfQ01EX1JFQURfVVRJTElUWSB8IDB4MDAwMDAyMDAgfCAoYWRkciAmIDB4MDAwMDAwRkYpLAorCSAgICAgICBjYXJkLT5tZW1iYXNlICsgQ01EKTsKKwl3aGlsZSAoQ01EX0JVU1koY2FyZCkpIDsKKwlkYXRhID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIERSMCkgJiAweDAwMDAwMEZGOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnJlc19sb2NrLCBmbGFncyk7CisJcmV0dXJuICh1bnNpZ25lZCBjaGFyKWRhdGE7CiB9CiAKLQotCiBtb2R1bGVfaW5pdChuaWNzdGFyX2luaXQpOwogbW9kdWxlX2V4aXQobmljc3Rhcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL25pY3N0YXIuaCBiL2RyaXZlcnMvYXRtL25pY3N0YXIuaAppbmRleCA2MDEwZTNkLi45YmMyN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmgKKysrIGIvZHJpdmVycy9hdG0vbmljc3Rhci5oCkBAIC0xLDUgKzEsNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKKy8qCiAgKiBuaWNzdGFyLmgKICAqCiAgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIG5pY3N0YXIgZGV2aWNlIGRyaXZlci4KQEAgLTgsMjkgKzcsMjYgQEAKICAqIFBvd2VyUEMgc3VwcG9ydCBieSBKYXkgVGFsYm90dCAoamF5X3RhbGJvdHRAbWNnLm1vdC5jb20pIEFwcmlsIDE5OTkKICAqCiAgKiAoQykgSU5FU0MgMTk5OAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyAqLwogCiAjaWZuZGVmIF9MSU5VWF9OSUNTVEFSX0hfCiAjZGVmaW5lIF9MSU5VWF9OSUNTVEFSX0hfCiAKLQotLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEluY2x1ZGVzICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bV9uaWNzdGFyLmg+CiAKLQotLyogT3B0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE9wdGlvbnMgKi8KIAogI2RlZmluZSBOU19NQVhfQ0FSRFMgNAkJLyogTWF4aW11bSBudW1iZXIgb2YgTklDU3RBUiBiYXNlZCBjYXJkcwogCQkJCSAgIGNvbnRyb2xsZWQgYnkgdGhlIGRldmljZSBkcml2ZXIuIE11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgPD0gNSAqLworCQkJCSAgIGJlIDw9IDUgKi8KIAogI3VuZGVmIFJDUV9TVVBQT1JUCQkvKiBEbyBub3QgZGVmaW5lIHRoaXMgZm9yIG5vdyAqLwogCkBAIC00Myw3ICszOSw3IEBACiAjZGVmaW5lIE5TX1ZQSUJJVFMgMgkJLyogMCwgMSwgMiwgb3IgOCAqLwogCiAjZGVmaW5lIE5TX01BWF9SQ1RTSVpFIDQwOTYJLyogTnVtYmVyIG9mIGVudHJpZXMuIDQwOTYgb3IgMTYzODQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSA0MDk2IG9ubHkgaWYgKGFsbCkgeW91ciBjYXJkKHMpCisJCQkJICAgRGVmaW5lIDQwOTYgb25seSBpZiAoYWxsKSB5b3VyIGNhcmQocykKIAkJCQkgICBoYXZlIDMySyB4IDMyYml0IFNSQU0sIGluIHdoaWNoIGNhc2UKIAkJCQkgICBzZXR0aW5nIHRoaXMgdG8gMTYzODQgd2lsbCBqdXN0IHdhc3RlIGEKIAkJCQkgICBsb3Qgb2YgbWVtb3J5LgpAQCAtNTEsMzMgKzQ3LDMyIEBACiAJCQkJICAgMTI4SyB4IDMyYml0IFNSQU0gd2lsbCBsaW1pdCB0aGUgbWF4aW11bQogCQkJCSAgIFZDSS4gKi8KIAotLyojZGVmaW5lIE5TX1BDSV9MQVRFTkNZIDY0Ki8JLyogTXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyICovCisJCQkJLyojZGVmaW5lIE5TX1BDSV9MQVRFTkNZIDY0Ki8vKiBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIgKi8KIAogCS8qIE51bWJlciBvZiBidWZmZXJzIGluaXRpYWxseSBhbGxvY2F0ZWQgKi8KLSNkZWZpbmUgTlVNX1NCIDMyCS8qIE11c3QgYmUgZXZlbiAqLwotI2RlZmluZSBOVU1fTEIgMjQJLyogTXVzdCBiZSBldmVuICovCi0jZGVmaW5lIE5VTV9IQiA4CS8qIFByZS1hbGxvY2F0ZWQgaHVnZSBidWZmZXJzICovCi0jZGVmaW5lIE5VTV9JT1ZCIDQ4CS8qIElvdmVjIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTlVNX1NCIDMyCQkvKiBNdXN0IGJlIGV2ZW4gKi8KKyNkZWZpbmUgTlVNX0xCIDI0CQkvKiBNdXN0IGJlIGV2ZW4gKi8KKyNkZWZpbmUgTlVNX0hCIDgJCS8qIFByZS1hbGxvY2F0ZWQgaHVnZSBidWZmZXJzICovCisjZGVmaW5lIE5VTV9JT1ZCIDQ4CQkvKiBJb3ZlYyBidWZmZXJzICovCiAKIAkvKiBMb3dlciBsZXZlbCBmb3IgY291bnQgb2YgYnVmZmVycyAqLwotI2RlZmluZSBNSU5fU0IgOAkvKiBNdXN0IGJlIGV2ZW4gKi8KLSNkZWZpbmUgTUlOX0xCIDgJLyogTXVzdCBiZSBldmVuICovCisjZGVmaW5lIE1JTl9TQiA4CQkvKiBNdXN0IGJlIGV2ZW4gKi8KKyNkZWZpbmUgTUlOX0xCIDgJCS8qIE11c3QgYmUgZXZlbiAqLwogI2RlZmluZSBNSU5fSEIgNgogI2RlZmluZSBNSU5fSU9WQiA4CiAKIAkvKiBVcHBlciBsZXZlbCBmb3IgY291bnQgb2YgYnVmZmVycyAqLwotI2RlZmluZSBNQVhfU0IgNjQJLyogTXVzdCBiZSBldmVuLCA8PSA1MDggKi8KLSNkZWZpbmUgTUFYX0xCIDQ4CS8qIE11c3QgYmUgZXZlbiwgPD0gNTA4ICovCisjZGVmaW5lIE1BWF9TQiA2NAkJLyogTXVzdCBiZSBldmVuLCA8PSA1MDggKi8KKyNkZWZpbmUgTUFYX0xCIDQ4CQkvKiBNdXN0IGJlIGV2ZW4sIDw9IDUwOCAqLwogI2RlZmluZSBNQVhfSEIgMTAKICNkZWZpbmUgTUFYX0lPVkIgODAKIAogCS8qIFRoZXNlIGFyZSB0aGUgYWJzb2x1dGUgbWF4aW11bSBhbGxvd2VkIGZvciB0aGUgaW9jdGwoKSAqLwotI2RlZmluZSBUT1BfU0IgMjU2CS8qIE11c3QgYmUgZXZlbiwgPD0gNTA4ICovCi0jZGVmaW5lIFRPUF9MQiAxMjgJLyogTXVzdCBiZSBldmVuLCA8PSA1MDggKi8KKyNkZWZpbmUgVE9QX1NCIDI1NgkJLyogTXVzdCBiZSBldmVuLCA8PSA1MDggKi8KKyNkZWZpbmUgVE9QX0xCIDEyOAkJLyogTXVzdCBiZSBldmVuLCA8PSA1MDggKi8KICNkZWZpbmUgVE9QX0hCIDY0CiAjZGVmaW5lIFRPUF9JT1ZCIDI1NgogCi0KICNkZWZpbmUgTUFYX1RCRF9QRVJfVkMgMQkvKiBOdW1iZXIgb2YgVEJEcyBiZWZvcmUgYSBUU1IgKi8KICNkZWZpbmUgTUFYX1RCRF9QRVJfU0NRIDEwCS8qIE9ubHkgbWVhbmluZ2Z1bCBmb3IgdmFyaWFibGUgcmF0ZSBTQ1FzICovCiAKQEAgLTg5LDE1ICs4NCwxMiBAQAogCiAjZGVmaW5lIFBDUl9UT0xFUkFOQ0UgKDEuMDAwMSkKIAotCi0KLS8qIEVTSSBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFU0kgc3R1ZmYgKi8KIAogI2RlZmluZSBOSUNTVEFSX0VQUk9NX01BQ19BRERSX09GRlNFVCAweDZDCiAjZGVmaW5lIE5JQ1NUQVJfRVBST01fTUFDX0FERFJfT0ZGU0VUX0FMVCAweEY2CiAKLQotLyogI2RlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICNkZWZpbmVzICovCiAKICNkZWZpbmUgTlNfSU9SRU1BUF9TSVpFIDQwOTYKIApAQCAtMTIzLDIyICsxMTUsMTkgQEAKICNkZWZpbmUgTlNfU01TS0JTSVpFIChOU19TTUJVRlNJWkUgKyBOU19BQUwwX0hFQURFUikKICNkZWZpbmUgTlNfTEdTS0JTSVpFIChOU19TTUJVRlNJWkUgKyBOU19MR0JVRlNJWkUpCiAKKy8qIE5JQ1N0QVIgc3RydWN0dXJlcyBsb2NhdGVkIGluIGhvc3QgbWVtb3J5ICovCiAKLS8qIE5JQ1N0QVIgc3RydWN0dXJlcyBsb2NhdGVkIGluIGhvc3QgbWVtb3J5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0vKiBSU1EgLSBSZWNlaXZlIFN0YXR1cyBRdWV1ZSAKKy8qCisgKiBSU1EgLSBSZWNlaXZlIFN0YXR1cyBRdWV1ZQogICoKICAqIFdyaXR0ZW4gYnkgdGhlIE5JQ1N0QVIsIHJlYWQgYnkgdGhlIGRldmljZSBkcml2ZXIuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgbnNfcnNxZQotewotICAgdTMyIHdvcmRfMTsKLSAgIHUzMiBidWZmZXJfaGFuZGxlOwotICAgdTMyIGZpbmFsX2FhbDVfY3JjMzI7Ci0gICB1MzIgd29yZF80OwordHlwZWRlZiBzdHJ1Y3QgbnNfcnNxZSB7CisJdTMyIHdvcmRfMTsKKwl1MzIgYnVmZmVyX2hhbmRsZTsKKwl1MzIgZmluYWxfYWFsNV9jcmMzMjsKKwl1MzIgd29yZF80OwogfSBuc19yc3FlOwogCiAjZGVmaW5lIG5zX3JzcWVfdnBpKG5zX3JzcWVwKSBcCkBAIC0xNzUsMzAgKzE2NCwyNyBAQAogI2RlZmluZSBuc19yc3FlX2NlbGxjb3VudChuc19yc3FlcCkgXAogICAgICAgICAobGUzMl90b19jcHUoKG5zX3JzcWVwKS0+d29yZF80KSAmIDB4MDAwMDAxRkYpCiAjZGVmaW5lIG5zX3JzcWVfaW5pdChuc19yc3FlcCkgXAotICAgICAgICAoKG5zX3JzcWVwKS0+d29yZF80ID0gY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCkpIAorICAgICAgICAoKG5zX3JzcWVwKS0+d29yZF80ID0gY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCkpCiAKICNkZWZpbmUgTlNfUlNRX05VTV9FTlRSSUVTIChOU19SU1FTSVpFIC8gMTYpCiAjZGVmaW5lIE5TX1JTUV9BTElHTk1FTlQgTlNfUlNRU0laRQogCi0KLQotLyogUkNRIC0gUmF3IENlbGwgUXVldWUKKy8qCisgKiBSQ1EgLSBSYXcgQ2VsbCBRdWV1ZQogICoKICAqIFdyaXR0ZW4gYnkgdGhlIE5JQ1N0QVIsIHJlYWQgYnkgdGhlIGRldmljZSBkcml2ZXIuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgY2VsbF9wYXlsb2FkCi17Ci0gICB1MzIgd29yZFsxMl07Cit0eXBlZGVmIHN0cnVjdCBjZWxsX3BheWxvYWQgeworCXUzMiB3b3JkWzEyXTsKIH0gY2VsbF9wYXlsb2FkOwogCi10eXBlZGVmIHN0cnVjdCBuc19yY3FlCi17Ci0gICB1MzIgd29yZF8xOwotICAgdTMyIHdvcmRfMjsKLSAgIHUzMiB3b3JkXzM7Ci0gICB1MzIgd29yZF80OwotICAgY2VsbF9wYXlsb2FkIHBheWxvYWQ7Cit0eXBlZGVmIHN0cnVjdCBuc19yY3FlIHsKKwl1MzIgd29yZF8xOworCXUzMiB3b3JkXzI7CisJdTMyIHdvcmRfMzsKKwl1MzIgd29yZF80OworCWNlbGxfcGF5bG9hZCBwYXlsb2FkOwogfSBuc19yY3FlOwogCiAjZGVmaW5lIE5TX1JDUUVfU0laRSA2NAkJLyogYnl0ZXMgKi8KQEAgLTIxMCwyOCArMTk2LDI1IEBACiAjZGVmaW5lIG5zX3JjcWVfbmV4dGJ1ZmhhbmRsZShuc19yY3FlcCkgXAogICAgICAgICAobGUzMl90b19jcHUoKG5zX3JjcWVwKS0+d29yZF8yKSkKIAotCi0KLS8qIFNDUSAtIFNlZ21lbnRhdGlvbiBDaGFubmVsIFF1ZXVlIAorLyoKKyAqIFNDUSAtIFNlZ21lbnRhdGlvbiBDaGFubmVsIFF1ZXVlCiAgKgogICogV3JpdHRlbiBieSB0aGUgZGV2aWNlIGRyaXZlciwgcmVhZCBieSB0aGUgTklDU3RBUi4KICAqLwogCi10eXBlZGVmIHN0cnVjdCBuc19zY3FlCi17Ci0gICB1MzIgd29yZF8xOwotICAgdTMyIHdvcmRfMjsKLSAgIHUzMiB3b3JkXzM7Ci0gICB1MzIgd29yZF80OwordHlwZWRlZiBzdHJ1Y3QgbnNfc2NxZSB7CisJdTMyIHdvcmRfMTsKKwl1MzIgd29yZF8yOworCXUzMiB3b3JkXzM7CisJdTMyIHdvcmRfNDsKIH0gbnNfc2NxZTsKIAogICAgLyogTk9URTogU0NRIGVudHJpZXMgY2FuIGJlIGVpdGhlciBhIFRCRCAoVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3JzKQotICAgICAgICAgICAgb3IgVFNSIChUcmFuc21pdCBTdGF0dXMgUmVxdWVzdHMpICovCisgICAgICBvciBUU1IgKFRyYW5zbWl0IFN0YXR1cyBSZXF1ZXN0cykgKi8KIAogI2RlZmluZSBOU19TQ1FFX1RZUEVfVEJEIDB4MDAwMDAwMDAKICNkZWZpbmUgTlNfU0NRRV9UWVBFX1RTUiAweDgwMDAwMDAwCiAKLQogI2RlZmluZSBOU19UQkRfRU9QRFUgMHg0MDAwMDAwMAogI2RlZmluZSBOU19UQkRfQUFMMCAgMHgwMDAwMDAwMAogI2RlZmluZSBOU19UQkRfQUFMMzQgMHgwNDAwMDAwMApAQCAtMjUzLDEwICsyMzYsOSBAQAogI2RlZmluZSBuc190YmRfbWt3b3JkXzQoZ2ZjLCB2cGksIHZjaSwgcHQsIGNscCkgXAogICAgICAgKGNwdV90b19sZTMyKChnZmMpIDw8IDI4IHwgKHZwaSkgPDwgMjAgfCAodmNpKSA8PCA0IHwgKHB0KSA8PCAxIHwgKGNscCkpKQogCi0KICNkZWZpbmUgTlNfVFNSX0lOVEVOQUJMRSAweDIwMDAwMDAwCiAKLSNkZWZpbmUgTlNfVFNSX1NDRElTVkJSIDB4RkZGRgkJLyogVXNlIGFzIHNjZGkgZm9yIFZCUiBTQ0QgKi8KKyNkZWZpbmUgTlNfVFNSX1NDRElTVkJSIDB4RkZGRgkvKiBVc2UgYXMgc2NkaSBmb3IgVkJSIFNDRCAqLwogCiAjZGVmaW5lIG5zX3Rzcl9ta3dvcmRfMShmbGFncykgXAogICAgICAgICAoY3B1X3RvX2xlMzIoTlNfU0NRRV9UWVBFX1RTUiB8IChmbGFncykpKQpAQCAtMjczLDIyICsyNTUsMjAgQEAKIAogI2RlZmluZSBOU19TQ1FFX1NJWkUgMTYKIAotCi0KLS8qIFRTUSAtIFRyYW5zbWl0IFN0YXR1cyBRdWV1ZQorLyoKKyAqIFRTUSAtIFRyYW5zbWl0IFN0YXR1cyBRdWV1ZQogICoKICAqIFdyaXR0ZW4gYnkgdGhlIE5JQ1N0QVIsIHJlYWQgYnkgdGhlIGRldmljZSBkcml2ZXIuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgbnNfdHNpCi17Ci0gICB1MzIgd29yZF8xOwotICAgdTMyIHdvcmRfMjsKK3R5cGVkZWYgc3RydWN0IG5zX3RzaSB7CisJdTMyIHdvcmRfMTsKKwl1MzIgd29yZF8yOwogfSBuc190c2k7CiAKICAgIC8qIE5PVEU6IFRoZSBmaXJzdCB3b3JkIGNhbiBiZSBhIHN0YXR1cyB3b3JkIGNvcGllZCBmcm9tIHRoZSBUU1Igd2hpY2gKLSAgICAgICAgICAgIG9yaWdpbmF0ZWQgdGhlIFRTSSwgb3IgYSB0aW1lciBvdmVyZmxvdyBpbmRpY2F0b3IuIEluIHRoaXMgbGFzdAotCSAgICBjYXNlLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHdvcmQgaXMgYWxsIHplcm9lcy4gKi8KKyAgICAgIG9yaWdpbmF0ZWQgdGhlIFRTSSwgb3IgYSB0aW1lciBvdmVyZmxvdyBpbmRpY2F0b3IuIEluIHRoaXMgbGFzdAorICAgICAgY2FzZSwgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCB3b3JkIGlzIGFsbCB6ZXJvZXMuICovCiAKICNkZWZpbmUgTlNfVFNJX0VNUFRZICAgICAgICAgIDB4ODAwMDAwMDAKICNkZWZpbmUgTlNfVFNJX1RJTUVTVEFNUF9NQVNLIDB4MDBGRkZGRkYKQEAgLTMwMSwxMiArMjgxLDEwIEBACiAjZGVmaW5lIG5zX3RzaV9pbml0KG5zX3RzaXApIFwKICAgICAgICAgKChuc190c2lwKS0+d29yZF8yID0gY3B1X3RvX2xlMzIoTlNfVFNJX0VNUFRZKSkKIAotCiAjZGVmaW5lIE5TX1RTUVNJWkUgODE5MgogI2RlZmluZSBOU19UU1FfTlVNX0VOVFJJRVMgMTAyNAogI2RlZmluZSBOU19UU1FfQUxJR05NRU5UIDgxOTIKIAotCiAjZGVmaW5lIE5TX1RTSV9TQ0RJU1ZCUiBOU19UU1JfU0NESVNWQlIKIAogI2RlZmluZSBuc190c2lfdG1yb2YobnNfdHNpcCkgXApAQCAtMzE2LDI2ICsyOTQsMjIgQEAKICNkZWZpbmUgbnNfdHNpX2dldHNjcXBvcyhuc190c2lwKSBcCiAgICAgICAgIChsZTMyX3RvX2NwdSgobnNfdHNpcCktPndvcmRfMSkgJiAweDAwMDA3RkZGKQogCisvKiBOSUNTdEFSIHN0cnVjdHVyZXMgbG9jYXRlZCBpbiBsb2NhbCBTUkFNICovCiAKLQotLyogTklDU3RBUiBzdHJ1Y3R1cmVzIGxvY2F0ZWQgaW4gbG9jYWwgU1JBTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLS8qIFJDVCAtIFJlY2VpdmUgQ29ubmVjdGlvbiBUYWJsZQorLyoKKyAqIFJDVCAtIFJlY2VpdmUgQ29ubmVjdGlvbiBUYWJsZQogICoKICAqIFdyaXR0ZW4gYnkgYm90aCB0aGUgTklDU3RBUiBhbmQgdGhlIGRldmljZSBkcml2ZXIuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgbnNfcmN0ZQotewotICAgdTMyIHdvcmRfMTsKLSAgIHUzMiBidWZmZXJfaGFuZGxlOwotICAgdTMyIGRtYV9hZGRyZXNzOwotICAgdTMyIGFhbDVfY3JjMzI7Cit0eXBlZGVmIHN0cnVjdCBuc19yY3RlIHsKKwl1MzIgd29yZF8xOworCXUzMiBidWZmZXJfaGFuZGxlOworCXUzMiBkbWFfYWRkcmVzczsKKwl1MzIgYWFsNV9jcmMzMjsKIH0gbnNfcmN0ZTsKIAotI2RlZmluZSBOU19SQ1RFX0JTRkIgICAgICAgICAgICAweDAwMjAwMDAwICAvKiBSZXYuIEQgb25seSAqLworI2RlZmluZSBOU19SQ1RFX0JTRkIgICAgICAgICAgICAweDAwMjAwMDAwCS8qIFJldi4gRCBvbmx5ICovCiAjZGVmaW5lIE5TX1JDVEVfTlpHRkMgICAgICAgICAgIDB4MDAxMDAwMDAKICNkZWZpbmUgTlNfUkNURV9DT05ORUNUT1BFTiAgICAgMHgwMDA4MDAwMAogI2RlZmluZSBOU19SQ1RFX0FBTE1BU0sgICAgICAgICAweDAwMDcwMDAwCkBAIC0zNTgsMjUgKzMzMiwyMSBAQAogI2RlZmluZSBOU19SQ1RfRU5UUllfU0laRSA0CS8qIE51bWJlciBvZiBkd29yZHMgKi8KIAogICAgLyogTk9URTogV2UgY291bGQgbWFrZSBtYWNyb3MgdG8gY29udHJ1Y3QgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIFJDVEUsCi0gICAgICAgICAgICBidXQgdGhhdCBkb2Vzbid0IHNlZW0gdG8gbWFrZSBtdWNoIHNlbnNlLi4uICovCisgICAgICBidXQgdGhhdCBkb2Vzbid0IHNlZW0gdG8gbWFrZSBtdWNoIHNlbnNlLi4uICovCiAKLQotCi0vKiBGQkQgLSBGcmVlIEJ1ZmZlciBEZXNjcmlwdG9yCisvKgorICogRkJEIC0gRnJlZSBCdWZmZXIgRGVzY3JpcHRvcgogICoKICAqIFdyaXR0ZW4gYnkgdGhlIGRldmljZSBkcml2ZXIgdXNpbmcgdmlhIHRoZSBjb21tYW5kIHJlZ2lzdGVyLgogICovCiAKLXR5cGVkZWYgc3RydWN0IG5zX2ZiZAotewotICAgdTMyIGJ1ZmZlcl9oYW5kbGU7Ci0gICB1MzIgZG1hX2FkZHJlc3M7Cit0eXBlZGVmIHN0cnVjdCBuc19mYmQgeworCXUzMiBidWZmZXJfaGFuZGxlOworCXUzMiBkbWFfYWRkcmVzczsKIH0gbnNfZmJkOwogCi0KLQotCi0vKiBUU1QgLSBUcmFuc21pdCBTY2hlZHVsZSBUYWJsZQorLyoKKyAqIFRTVCAtIFRyYW5zbWl0IFNjaGVkdWxlIFRhYmxlCiAgKgogICogV3JpdHRlbiBieSB0aGUgZGV2aWNlIGRyaXZlci4KICAqLwpAQCAtMzg1LDQwICszNTUsMzggQEAKIAogI2RlZmluZSBOU19UU1RfT1BDT0RFX01BU0sgMHg2MDAwMDAwMAogCi0jZGVmaW5lIE5TX1RTVF9PUENPREVfTlVMTCAgICAgMHgwMDAwMDAwMCAvKiBJbnNlcnQgbnVsbCBjZWxsICovCi0jZGVmaW5lIE5TX1RTVF9PUENPREVfRklYRUQgICAgMHgyMDAwMDAwMCAvKiBDZWxsIGZyb20gYSBmaXhlZCByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgTlNfVFNUX09QQ09ERV9OVUxMICAgICAweDAwMDAwMDAwCS8qIEluc2VydCBudWxsIGNlbGwgKi8KKyNkZWZpbmUgTlNfVFNUX09QQ09ERV9GSVhFRCAgICAweDIwMDAwMDAwCS8qIENlbGwgZnJvbSBhIGZpeGVkIHJhdGUgY2hhbm5lbCAqLwogI2RlZmluZSBOU19UU1RfT1BDT0RFX1ZBUklBQkxFIDB4NDAwMDAwMDAKLSNkZWZpbmUgTlNfVFNUX09QQ09ERV9FTkQgICAgICAweDYwMDAwMDAwIC8qIEp1bXAgKi8KKyNkZWZpbmUgTlNfVFNUX09QQ09ERV9FTkQgICAgICAweDYwMDAwMDAwCS8qIEp1bXAgKi8KIAogI2RlZmluZSBuc190c3RlX21ha2Uob3Bjb2RlLCBzcmFtYWQpIChvcGNvZGUgfCBzcmFtYWQpCiAKICAgIC8qIE5PVEU6CiAKICAgICAgIC0gV2hlbiB0aGUgb3Bjb2RlIGlzIEZJWEVELCBzcmFtYWQgc3BlY2lmaWVzIHRoZSBTUkFNIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgIFNDRCBmb3IgdGhhdCBmaXhlZCByYXRlIGNoYW5uZWwuCisgICAgICBTQ0QgZm9yIHRoYXQgZml4ZWQgcmF0ZSBjaGFubmVsLgogICAgICAgLSBXaGVuIHRoZSBvcGNvZGUgaXMgRU5ELCBzcmFtYWQgc3BlY2lmaWVzIHRoZSBTUkFNIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgIGxvY2F0aW9uIG9mIHRoZSBuZXh0IFRTVCBlbnRyeSB0byByZWFkLgorICAgICAgbG9jYXRpb24gb2YgdGhlIG5leHQgVFNUIGVudHJ5IHRvIHJlYWQuCiAgICAgKi8KIAotCi0KLS8qIFNDRCAtIFNlZ21lbnRhdGlvbiBDaGFubmVsIERlc2NyaXB0b3IKKy8qCisgKiBTQ0QgLSBTZWdtZW50YXRpb24gQ2hhbm5lbCBEZXNjcmlwdG9yCiAgKgogICogV3JpdHRlbiBieSBib3RoIHRoZSBkZXZpY2UgZHJpdmVyIGFuZCB0aGUgTklDU3RBUgogICovCiAKLXR5cGVkZWYgc3RydWN0IG5zX3NjZAotewotICAgdTMyIHdvcmRfMTsKLSAgIHUzMiB3b3JkXzI7Ci0gICB1MzIgcGFydGlhbF9hYWw1X2NyYzsKLSAgIHUzMiByZXNlcnZlZDsKLSAgIG5zX3NjcWUgY2FjaGVfYTsKLSAgIG5zX3NjcWUgY2FjaGVfYjsKK3R5cGVkZWYgc3RydWN0IG5zX3NjZCB7CisJdTMyIHdvcmRfMTsKKwl1MzIgd29yZF8yOworCXUzMiBwYXJ0aWFsX2FhbDVfY3JjOworCXUzMiByZXNlcnZlZDsKKwluc19zY3FlIGNhY2hlX2E7CisJbnNfc2NxZSBjYWNoZV9iOwogfSBuc19zY2Q7CiAKLSNkZWZpbmUgTlNfU0NEX0JBU0VfTUFTS19WQVIgMHhGRkZGRTAwMAkJLyogVmFyaWFibGUgcmF0ZSAqLwotI2RlZmluZSBOU19TQ0RfQkFTRV9NQVNLX0ZJWCAweEZGRkZGQzAwCQkvKiBGaXhlZCByYXRlICovCisjZGVmaW5lIE5TX1NDRF9CQVNFX01BU0tfVkFSIDB4RkZGRkUwMDAJLyogVmFyaWFibGUgcmF0ZSAqLworI2RlZmluZSBOU19TQ0RfQkFTRV9NQVNLX0ZJWCAweEZGRkZGQzAwCS8qIEZpeGVkIHJhdGUgKi8KICNkZWZpbmUgTlNfU0NEX1RBSUxfTUFTS19WQVIgMHgwMDAwMUZGMAogI2RlZmluZSBOU19TQ0RfVEFJTF9NQVNLX0ZJWCAweDAwMDAwM0YwCiAjZGVmaW5lIE5TX1NDRF9IRUFEX01BU0tfVkFSIDB4MDAwMDFGRjAKQEAgLTQyNiwxMyArMzk0LDkgQEAKICNkZWZpbmUgTlNfU0NEX1hNSVRGT1JFVkVSICAgMHgwMjAwMDAwMAogCiAgICAvKiBOT1RFOiBUaGVyZSBhcmUgb3RoZXIgZmllbGRzIGluIHdvcmQgMiBvZiB0aGUgU0NELCBidXQgYXMgdGhleSBzaG91bGQKLSAgICAgICAgICAgIG5vdCBiZSBuZWVkZWQgaW4gdGhlIGRldmljZSBkcml2ZXIgdGhleSBhcmUgbm90IGRlZmluZWQgaGVyZS4gKi8KKyAgICAgIG5vdCBiZSBuZWVkZWQgaW4gdGhlIGRldmljZSBkcml2ZXIgdGhleSBhcmUgbm90IGRlZmluZWQgaGVyZS4gKi8KIAotCi0KLQotLyogTklDU3RBUiBsb2NhbCBTUkFNIG1lbW9yeSBtYXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyogTklDU3RBUiBsb2NhbCBTUkFNIG1lbW9yeSBtYXAgKi8KIAogI2RlZmluZSBOU19SQ1QgICAgICAgICAgIDB4MDAwMDAKICNkZWZpbmUgTlNfUkNUXzMyX0VORCAgICAweDAzRkZGCkBAIC00NTUsMTAwICs0MTksOTMgQEAKICNkZWZpbmUgTlNfTEdGQlEgICAgICAgICAweDFGQzAwCiAjZGVmaW5lIE5TX0xHRkJRX0VORCAgICAgMHgxRkZGRgogCi0KLQotLyogTklTQ3RBUiBvcGVyYXRpb24gcmVnaXN0ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyogTklTQ3RBUiBvcGVyYXRpb24gcmVnaXN0ZXJzICovCiAKIC8qIFNlZSBTZWN0aW9uIDMuNCBvZiBgSURUNzcyMTEgTklDU3RBUiBVc2VyIE1hbnVhbCcgZnJvbSB3d3cuaWR0LmNvbSAqLwogCi1lbnVtIG5zX3JlZ3MKLXsKLSAgIERSMCAgID0gMHgwMCwgICAgICAvKiBEYXRhIFJlZ2lzdGVyIDAgUi9XKi8KLSAgIERSMSAgID0gMHgwNCwgICAgICAvKiBEYXRhIFJlZ2lzdGVyIDEgVyAqLwotICAgRFIyICAgPSAweDA4LCAgICAgIC8qIERhdGEgUmVnaXN0ZXIgMiBXICovCi0gICBEUjMgICA9IDB4MEMsICAgICAgLyogRGF0YSBSZWdpc3RlciAzIFcgKi8KLSAgIENNRCAgID0gMHgxMCwgICAgICAvKiBDb21tYW5kIFcgKi8KLSAgIENGRyAgID0gMHgxNCwgICAgICAvKiBDb25maWd1cmF0aW9uIFIvVyAqLwotICAgU1RBVCAgPSAweDE4LCAgICAgIC8qIFN0YXR1cyBSL1cgKi8KLSAgIFJTUUIgID0gMHgxQywgICAgICAvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBCYXNlIFcgKi8KLSAgIFJTUVQgID0gMHgyMCwgICAgICAvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBUYWlsIFIgKi8KLSAgIFJTUUggID0gMHgyNCwgICAgICAvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBIZWFkIFcgKi8KLSAgIENEQyAgID0gMHgyOCwgICAgICAvKiBDZWxsIERyb3AgQ291bnRlciBSL2NsZWFyICovCi0gICBWUEVDICA9IDB4MkMsICAgICAgLyogVlBJL1ZDSSBMb29rdXAgRXJyb3IgQ291bnQgUi9jbGVhciAqLwotICAgSUNDICAgPSAweDMwLCAgICAgIC8qIEludmFsaWQgQ2VsbCBDb3VudCBSL2NsZWFyICovCi0gICBSQVdDVCA9IDB4MzQsICAgICAgLyogUmF3IENlbGwgVGFpbCBSICovCi0gICBUTVIgICA9IDB4MzgsICAgICAgLyogVGltZXIgUiAqLwotICAgVFNUQiAgPSAweDNDLCAgICAgIC8qIFRyYW5zbWl0IFNjaGVkdWxlIFRhYmxlIEJhc2UgUi9XICovCi0gICBUU1FCICA9IDB4NDAsICAgICAgLyogVHJhbnNtaXQgU3RhdHVzIFF1ZXVlIEJhc2UgVyAqLwotICAgVFNRVCAgPSAweDQ0LCAgICAgIC8qIFRyYW5zbWl0IFN0YXR1cyBRdWV1ZSBUYWlsIFIgKi8KLSAgIFRTUUggID0gMHg0OCwgICAgICAvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgSGVhZCBXICovCi0gICBHUCAgICA9IDB4NEMsICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIFIvVyAqLwotICAgVlBNICAgPSAweDUwICAgICAgIC8qIFZQSS9WQ0kgTWFzayBXICovCitlbnVtIG5zX3JlZ3MgeworCURSMCA9IDB4MDAsCQkvKiBEYXRhIFJlZ2lzdGVyIDAgUi9XICovCisJRFIxID0gMHgwNCwJCS8qIERhdGEgUmVnaXN0ZXIgMSBXICovCisJRFIyID0gMHgwOCwJCS8qIERhdGEgUmVnaXN0ZXIgMiBXICovCisJRFIzID0gMHgwQywJCS8qIERhdGEgUmVnaXN0ZXIgMyBXICovCisJQ01EID0gMHgxMCwJCS8qIENvbW1hbmQgVyAqLworCUNGRyA9IDB4MTQsCQkvKiBDb25maWd1cmF0aW9uIFIvVyAqLworCVNUQVQgPSAweDE4LAkJLyogU3RhdHVzIFIvVyAqLworCVJTUUIgPSAweDFDLAkJLyogUmVjZWl2ZSBTdGF0dXMgUXVldWUgQmFzZSBXICovCisJUlNRVCA9IDB4MjAsCQkvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBUYWlsIFIgKi8KKwlSU1FIID0gMHgyNCwJCS8qIFJlY2VpdmUgU3RhdHVzIFF1ZXVlIEhlYWQgVyAqLworCUNEQyA9IDB4MjgsCQkvKiBDZWxsIERyb3AgQ291bnRlciBSL2NsZWFyICovCisJVlBFQyA9IDB4MkMsCQkvKiBWUEkvVkNJIExvb2t1cCBFcnJvciBDb3VudCBSL2NsZWFyICovCisJSUNDID0gMHgzMCwJCS8qIEludmFsaWQgQ2VsbCBDb3VudCBSL2NsZWFyICovCisJUkFXQ1QgPSAweDM0LAkJLyogUmF3IENlbGwgVGFpbCBSICovCisJVE1SID0gMHgzOCwJCS8qIFRpbWVyIFIgKi8KKwlUU1RCID0gMHgzQywJCS8qIFRyYW5zbWl0IFNjaGVkdWxlIFRhYmxlIEJhc2UgUi9XICovCisJVFNRQiA9IDB4NDAsCQkvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgQmFzZSBXICovCisJVFNRVCA9IDB4NDQsCQkvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgVGFpbCBSICovCisJVFNRSCA9IDB4NDgsCQkvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgSGVhZCBXICovCisJR1AgPSAweDRDLAkJLyogR2VuZXJhbCBQdXJwb3NlIFIvVyAqLworCVZQTSA9IDB4NTAJCS8qIFZQSS9WQ0kgTWFzayBXICovCiB9OwogCi0KLS8qIE5JQ1N0QVIgY29tbWFuZHMgaXNzdWVkIHRvIHRoZSBDTUQgcmVnaXN0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKy8qIE5JQ1N0QVIgY29tbWFuZHMgaXNzdWVkIHRvIHRoZSBDTUQgcmVnaXN0ZXIgKi8KIAogLyogVG9wIDQgYml0cyBhcmUgY29tbWFuZCBvcGNvZGUsIGxvd2VyIDI4IGFyZSBwYXJhbWV0ZXJzLiAqLwogCiAjZGVmaW5lIE5TX0NNRF9OT19PUEVSQVRJT04gICAgICAgICAweDAwMDAwMDAwCi0gICAgICAgIC8qIHBhcmFtcyBhbHdheXMgMCAqLworCS8qIHBhcmFtcyBhbHdheXMgMCAqLwogCiAjZGVmaW5lIE5TX0NNRF9PUEVOQ0xPU0VfQ09OTkVDVElPTiAweDIwMDAwMDAwCi0gICAgICAgIC8qIGIxOXsxPW9wZW4sMD1jbG9zZX0gYjE4LTJ7U1JBTSBhZGRyfSAqLworCS8qIGIxOXsxPW9wZW4sMD1jbG9zZX0gYjE4LTJ7U1JBTSBhZGRyfSAqLwogCiAjZGVmaW5lIE5TX0NNRF9XUklURV9TUkFNICAgICAgICAgICAweDQwMDAwMDAwCi0gICAgICAgIC8qIGIxOC0ye1NSQU0gYWRkcn0gYjEtMHtidXJzdCBzaXplfSAqLworCS8qIGIxOC0ye1NSQU0gYWRkcn0gYjEtMHtidXJzdCBzaXplfSAqLwogCiAjZGVmaW5lIE5TX0NNRF9SRUFEX1NSQU0gICAgICAgICAgICAweDUwMDAwMDAwCi0gICAgICAgIC8qIGIxOC0ye1NSQU0gYWRkcn0gKi8KKwkvKiBiMTgtMntTUkFNIGFkZHJ9ICovCiAKICNkZWZpbmUgTlNfQ01EX1dSSVRFX0ZSRUVCVUZRICAgICAgIDB4NjAwMDAwMDAKLSAgICAgICAgLyogYjB7bGFyZ2UgYnVmIGluZGljYXRvcn0gKi8KKwkvKiBiMHtsYXJnZSBidWYgaW5kaWNhdG9yfSAqLwogCiAjZGVmaW5lIE5TX0NNRF9SRUFEX1VUSUxJVFkgICAgICAgICAweDgwMDAwMDAwCi0gICAgICAgIC8qIGI4ezE9c2VsZWN0IFVUTF9DUzF9IGI5ezE9c2VsZWN0IFVUTF9DUzB9IGI3LTB7YnVzIGFkZHJ9ICovCisJLyogYjh7MT1zZWxlY3QgVVRMX0NTMX0gYjl7MT1zZWxlY3QgVVRMX0NTMH0gYjctMHtidXMgYWRkcn0gKi8KIAogI2RlZmluZSBOU19DTURfV1JJVEVfVVRJTElUWSAgICAgICAgMHg5MDAwMDAwMAotICAgICAgICAvKiBiOHsxPXNlbGVjdCBVVExfQ1MxfSBiOXsxPXNlbGVjdCBVVExfQ1MwfSBiNy0we2J1cyBhZGRyfSAqLworCS8qIGI4ezE9c2VsZWN0IFVUTF9DUzF9IGI5ezE9c2VsZWN0IFVUTF9DUzB9IGI3LTB7YnVzIGFkZHJ9ICovCiAKICNkZWZpbmUgTlNfQ01EX09QRU5fQ09OTkVDVElPTiAoTlNfQ01EX09QRU5DTE9TRV9DT05ORUNUSU9OIHwgMHgwMDA4MDAwMCkKICNkZWZpbmUgTlNfQ01EX0NMT1NFX0NPTk5FQ1RJT04gTlNfQ01EX09QRU5DTE9TRV9DT05ORUNUSU9OCiAKKy8qIE5JQ1N0QVIgY29uZmlndXJhdGlvbiBiaXRzICovCiAKLS8qIE5JQ1N0QVIgY29uZmlndXJhdGlvbiBiaXRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTlNfQ0ZHX1NXUlNUICAgICAgICAgIDB4ODAwMDAwMDAgICAgLyogU29mdHdhcmUgUmVzZXQgKi8KLSNkZWZpbmUgTlNfQ0ZHX1JYUEFUSCAgICAgICAgIDB4MjAwMDAwMDAgICAgLyogUmVjZWl2ZSBQYXRoIEVuYWJsZSAqLwotI2RlZmluZSBOU19DRkdfU01CVUZTSVpFX01BU0sgMHgxODAwMDAwMCAgICAvKiBTbWFsbCBSZWNlaXZlIEJ1ZmZlciBTaXplICovCi0jZGVmaW5lIE5TX0NGR19MR0JVRlNJWkVfTUFTSyAweDA2MDAwMDAwICAgIC8qIExhcmdlIFJlY2VpdmUgQnVmZmVyIFNpemUgKi8KLSNkZWZpbmUgTlNfQ0ZHX0VGQklFICAgICAgICAgIDB4MDEwMDAwMDAgICAgLyogRW1wdHkgRnJlZSBCdWZmZXIgUXVldWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBOU19DRkdfUlNRU0laRV9NQVNLICAgMHgwMEMwMDAwMCAgICAvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBTaXplICovCi0jZGVmaW5lIE5TX0NGR19JQ0FDQ0VQVCAgICAgICAweDAwMjAwMDAwICAgIC8qIEludmFsaWQgQ2VsbCBBY2NlcHQgKi8KLSNkZWZpbmUgTlNfQ0ZHX0lHTk9SRUdGQyAgICAgIDB4MDAxMDAwMDAgICAgLyogSWdub3JlIEdlbmVyYWwgRmxvdyBDb250cm9sICovCi0jZGVmaW5lIE5TX0NGR19WUElCSVRTX01BU0sgICAweDAwMEMwMDAwICAgIC8qIFZQSS9WQ0kgQml0cyBTaXplIFNlbGVjdCAqLwotI2RlZmluZSBOU19DRkdfUkNUU0laRV9NQVNLICAgMHgwMDAzMDAwMCAgICAvKiBSZWNlaXZlIENvbm5lY3Rpb24gVGFibGUgU2l6ZSAqLwotI2RlZmluZSBOU19DRkdfVkNFUlJBQ0NFUFQgICAgMHgwMDAwODAwMCAgICAvKiBWUEkvVkNJIEVycm9yIENlbGwgQWNjZXB0ICovCi0jZGVmaW5lIE5TX0NGR19SWElOVF9NQVNLICAgICAweDAwMDA3MDAwICAgIC8qIEVuZCBvZiBSZWNlaXZlIFBEVSBJbnRlcnJ1cHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgKi8KLSNkZWZpbmUgTlNfQ0ZHX1JBV0lFICAgICAgICAgIDB4MDAwMDA4MDAgICAgLyogUmF3IENlbGwgUXUnIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgTlNfQ0ZHX1JTUUFGSUUgICAgICAgIDB4MDAwMDA0MDAgICAgLyogUmVjZWl2ZSBRdWV1ZSBBbG1vc3QgRnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIE5TX0NGR19SWFJNICAgICAgICAgICAweDAwMDAwMjAwICAgIC8qIFJlY2VpdmUgUk0gQ2VsbHMgKi8KLSNkZWZpbmUgTlNfQ0ZHX1RNUlJPSUUgICAgICAgIDB4MDAwMDAwODAgICAgLyogVGltZXIgUm9sbCBPdmVyIEludGVycnVwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgKi8KLSNkZWZpbmUgTlNfQ0ZHX1RYRU4gICAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogVHJhbnNtaXQgT3BlcmF0aW9uIEVuYWJsZSAqLwotI2RlZmluZSBOU19DRkdfVFhJRSAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBUcmFuc21pdCBTdGF0dXMgSW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSAqLwotI2RlZmluZSBOU19DRkdfVFhVUklFICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBUcmFuc21pdCBVbmRlci1ydW4gSW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSAqLwotI2RlZmluZSBOU19DRkdfVU1PREUgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBVdG9waWEgTW9kZSAoY2VsbC9ieXRlKSBTZWxlY3QgKi8KLSNkZWZpbmUgTlNfQ0ZHX1RTUUZJRSAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogVHJhbnNtaXQgU3RhdHVzIFF1ZXVlIEZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBOU19DRkdfUEhZSUUgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBQSFkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBOU19DRkdfU1dSU1QgICAgICAgICAgMHg4MDAwMDAwMAkvKiBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZSBOU19DRkdfUlhQQVRIICAgICAgICAgMHgyMDAwMDAwMAkvKiBSZWNlaXZlIFBhdGggRW5hYmxlICovCisjZGVmaW5lIE5TX0NGR19TTUJVRlNJWkVfTUFTSyAweDE4MDAwMDAwCS8qIFNtYWxsIFJlY2VpdmUgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgTlNfQ0ZHX0xHQlVGU0laRV9NQVNLIDB4MDYwMDAwMDAJLyogTGFyZ2UgUmVjZWl2ZSBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBOU19DRkdfRUZCSUUgICAgICAgICAgMHgwMTAwMDAwMAkvKiBFbXB0eSBGcmVlIEJ1ZmZlciBRdWV1ZQorCQkJCQkJICAgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBOU19DRkdfUlNRU0laRV9NQVNLICAgMHgwMEMwMDAwMAkvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBTaXplICovCisjZGVmaW5lIE5TX0NGR19JQ0FDQ0VQVCAgICAgICAweDAwMjAwMDAwCS8qIEludmFsaWQgQ2VsbCBBY2NlcHQgKi8KKyNkZWZpbmUgTlNfQ0ZHX0lHTk9SRUdGQyAgICAgIDB4MDAxMDAwMDAJLyogSWdub3JlIEdlbmVyYWwgRmxvdyBDb250cm9sICovCisjZGVmaW5lIE5TX0NGR19WUElCSVRTX01BU0sgICAweDAwMEMwMDAwCS8qIFZQSS9WQ0kgQml0cyBTaXplIFNlbGVjdCAqLworI2RlZmluZSBOU19DRkdfUkNUU0laRV9NQVNLICAgMHgwMDAzMDAwMAkvKiBSZWNlaXZlIENvbm5lY3Rpb24gVGFibGUgU2l6ZSAqLworI2RlZmluZSBOU19DRkdfVkNFUlJBQ0NFUFQgICAgMHgwMDAwODAwMAkvKiBWUEkvVkNJIEVycm9yIENlbGwgQWNjZXB0ICovCisjZGVmaW5lIE5TX0NGR19SWElOVF9NQVNLICAgICAweDAwMDA3MDAwCS8qIEVuZCBvZiBSZWNlaXZlIFBEVSBJbnRlcnJ1cHQKKwkJCQkJCSAgIEhhbmRsaW5nICovCisjZGVmaW5lIE5TX0NGR19SQVdJRSAgICAgICAgICAweDAwMDAwODAwCS8qIFJhdyBDZWxsIFF1JyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIE5TX0NGR19SU1FBRklFICAgICAgICAweDAwMDAwNDAwCS8qIFJlY2VpdmUgUXVldWUgQWxtb3N0IEZ1bGwKKwkJCQkJCSAgIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTlNfQ0ZHX1JYUk0gICAgICAgICAgIDB4MDAwMDAyMDAJLyogUmVjZWl2ZSBSTSBDZWxscyAqLworI2RlZmluZSBOU19DRkdfVE1SUk9JRSAgICAgICAgMHgwMDAwMDA4MAkvKiBUaW1lciBSb2xsIE92ZXIgSW50ZXJydXB0CisJCQkJCQkgICBFbmFibGUgKi8KKyNkZWZpbmUgTlNfQ0ZHX1RYRU4gICAgICAgICAgIDB4MDAwMDAwMjAJLyogVHJhbnNtaXQgT3BlcmF0aW9uIEVuYWJsZSAqLworI2RlZmluZSBOU19DRkdfVFhJRSAgICAgICAgICAgMHgwMDAwMDAxMAkvKiBUcmFuc21pdCBTdGF0dXMgSW50ZXJydXB0CisJCQkJCQkgICBFbmFibGUgKi8KKyNkZWZpbmUgTlNfQ0ZHX1RYVVJJRSAgICAgICAgIDB4MDAwMDAwMDgJLyogVHJhbnNtaXQgVW5kZXItcnVuIEludGVycnVwdAorCQkJCQkJICAgRW5hYmxlICovCisjZGVmaW5lIE5TX0NGR19VTU9ERSAgICAgICAgICAweDAwMDAwMDA0CS8qIFV0b3BpYSBNb2RlIChjZWxsL2J5dGUpIFNlbGVjdCAqLworI2RlZmluZSBOU19DRkdfVFNRRklFICAgICAgICAgMHgwMDAwMDAwMgkvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgRnVsbAorCQkJCQkJICAgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBOU19DRkdfUEhZSUUgICAgICAgICAgMHgwMDAwMDAwMQkvKiBQSFkgSW50ZXJydXB0IEVuYWJsZSAqLwogCiAjZGVmaW5lIE5TX0NGR19TTUJVRlNJWkVfNDggICAgMHgwMDAwMDAwMAogI2RlZmluZSBOU19DRkdfU01CVUZTSVpFXzk2ICAgIDB4MDgwMDAwMDAKQEAgLTU3OSwzMyArNTM2LDI5IEBACiAjZGVmaW5lIE5TX0NGR19SWElOVF82MjRVUyAgIDB4MDAwMDMwMDAKICNkZWZpbmUgTlNfQ0ZHX1JYSU5UXzg5OVVTICAgMHgwMDAwNDAwMAogCisvKiBOSUNTdEFSIFNUQVR1cyBiaXRzICovCiAKLS8qIE5JQ1N0QVIgU1RBVHVzIGJpdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTlNfU1RBVF9TRkJRQ19NQVNLIDB4RkYwMDAwMDAgICAvKiBoaSA4IGJpdHMgU21hbGwgQnVmZmVyIFF1ZXVlIENvdW50ICovCi0jZGVmaW5lIE5TX1NUQVRfTEZCUUNfTUFTSyAweDAwRkYwMDAwICAgLyogaGkgOCBiaXRzIExhcmdlIEJ1ZmZlciBRdWV1ZSBDb3VudCAqLwotI2RlZmluZSBOU19TVEFUX1RTSUYgICAgICAgMHgwMDAwODAwMCAgIC8qIFRyYW5zbWl0IFN0YXR1cyBRdWV1ZSBJbmRpY2F0b3IgKi8KLSNkZWZpbmUgTlNfU1RBVF9UWElDUCAgICAgIDB4MDAwMDQwMDAgICAvKiBUcmFuc21pdCBJbmNvbXBsZXRlIFBEVSAqLwotI2RlZmluZSBOU19TVEFUX1RTUUYgICAgICAgMHgwMDAwMTAwMCAgIC8qIFRyYW5zbWl0IFN0YXR1cyBRdWV1ZSBGdWxsICovCi0jZGVmaW5lIE5TX1NUQVRfVE1ST0YgICAgICAweDAwMDAwODAwICAgLyogVGltZXIgT3ZlcmZsb3cgKi8KLSNkZWZpbmUgTlNfU1RBVF9QSFlJICAgICAgIDB4MDAwMDA0MDAgICAvKiBQSFkgRGV2aWNlIEludGVycnVwdCAqLwotI2RlZmluZSBOU19TVEFUX0NNREJaICAgICAgMHgwMDAwMDIwMCAgIC8qIENvbW1hbmQgQnVzeSAqLwotI2RlZmluZSBOU19TVEFUX1NGQlFGICAgICAgMHgwMDAwMDEwMCAgIC8qIFNtYWxsIEJ1ZmZlciBRdWV1ZSBGdWxsICovCi0jZGVmaW5lIE5TX1NUQVRfTEZCUUYgICAgICAweDAwMDAwMDgwICAgLyogTGFyZ2UgQnVmZmVyIFF1ZXVlIEZ1bGwgKi8KLSNkZWZpbmUgTlNfU1RBVF9SU1FGICAgICAgIDB4MDAwMDAwNDAgICAvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBGdWxsICovCi0jZGVmaW5lIE5TX1NUQVRfRU9QRFUgICAgICAweDAwMDAwMDIwICAgLyogRW5kIG9mIFBEVSAqLwotI2RlZmluZSBOU19TVEFUX1JBV0NGICAgICAgMHgwMDAwMDAxMCAgIC8qIFJhdyBDZWxsIEZsYWcgKi8KLSNkZWZpbmUgTlNfU1RBVF9TRkJRRSAgICAgIDB4MDAwMDAwMDggICAvKiBTbWFsbCBCdWZmZXIgUXVldWUgRW1wdHkgKi8KLSNkZWZpbmUgTlNfU1RBVF9MRkJRRSAgICAgIDB4MDAwMDAwMDQgICAvKiBMYXJnZSBCdWZmZXIgUXVldWUgRW1wdHkgKi8KLSNkZWZpbmUgTlNfU1RBVF9SU1FBRiAgICAgIDB4MDAwMDAwMDIgICAvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBBbG1vc3QgRnVsbCAqLworI2RlZmluZSBOU19TVEFUX1NGQlFDX01BU0sgMHhGRjAwMDAwMAkvKiBoaSA4IGJpdHMgU21hbGwgQnVmZmVyIFF1ZXVlIENvdW50ICovCisjZGVmaW5lIE5TX1NUQVRfTEZCUUNfTUFTSyAweDAwRkYwMDAwCS8qIGhpIDggYml0cyBMYXJnZSBCdWZmZXIgUXVldWUgQ291bnQgKi8KKyNkZWZpbmUgTlNfU1RBVF9UU0lGICAgICAgIDB4MDAwMDgwMDAJLyogVHJhbnNtaXQgU3RhdHVzIFF1ZXVlIEluZGljYXRvciAqLworI2RlZmluZSBOU19TVEFUX1RYSUNQICAgICAgMHgwMDAwNDAwMAkvKiBUcmFuc21pdCBJbmNvbXBsZXRlIFBEVSAqLworI2RlZmluZSBOU19TVEFUX1RTUUYgICAgICAgMHgwMDAwMTAwMAkvKiBUcmFuc21pdCBTdGF0dXMgUXVldWUgRnVsbCAqLworI2RlZmluZSBOU19TVEFUX1RNUk9GICAgICAgMHgwMDAwMDgwMAkvKiBUaW1lciBPdmVyZmxvdyAqLworI2RlZmluZSBOU19TVEFUX1BIWUkgICAgICAgMHgwMDAwMDQwMAkvKiBQSFkgRGV2aWNlIEludGVycnVwdCAqLworI2RlZmluZSBOU19TVEFUX0NNREJaICAgICAgMHgwMDAwMDIwMAkvKiBDb21tYW5kIEJ1c3kgKi8KKyNkZWZpbmUgTlNfU1RBVF9TRkJRRiAgICAgIDB4MDAwMDAxMDAJLyogU21hbGwgQnVmZmVyIFF1ZXVlIEZ1bGwgKi8KKyNkZWZpbmUgTlNfU1RBVF9MRkJRRiAgICAgIDB4MDAwMDAwODAJLyogTGFyZ2UgQnVmZmVyIFF1ZXVlIEZ1bGwgKi8KKyNkZWZpbmUgTlNfU1RBVF9SU1FGICAgICAgIDB4MDAwMDAwNDAJLyogUmVjZWl2ZSBTdGF0dXMgUXVldWUgRnVsbCAqLworI2RlZmluZSBOU19TVEFUX0VPUERVICAgICAgMHgwMDAwMDAyMAkvKiBFbmQgb2YgUERVICovCisjZGVmaW5lIE5TX1NUQVRfUkFXQ0YgICAgICAweDAwMDAwMDEwCS8qIFJhdyBDZWxsIEZsYWcgKi8KKyNkZWZpbmUgTlNfU1RBVF9TRkJRRSAgICAgIDB4MDAwMDAwMDgJLyogU21hbGwgQnVmZmVyIFF1ZXVlIEVtcHR5ICovCisjZGVmaW5lIE5TX1NUQVRfTEZCUUUgICAgICAweDAwMDAwMDA0CS8qIExhcmdlIEJ1ZmZlciBRdWV1ZSBFbXB0eSAqLworI2RlZmluZSBOU19TVEFUX1JTUUFGICAgICAgMHgwMDAwMDAwMgkvKiBSZWNlaXZlIFN0YXR1cyBRdWV1ZSBBbG1vc3QgRnVsbCAqLwogCiAjZGVmaW5lIG5zX3N0YXRfc2ZicWNfZ2V0KHN0YXQpICgoKHN0YXQpICYgTlNfU1RBVF9TRkJRQ19NQVNLKSA+PiAyMykKICNkZWZpbmUgbnNfc3RhdF9sZmJxY19nZXQoc3RhdCkgKCgoc3RhdCkgJiBOU19TVEFUX0xGQlFDX01BU0spID4+IDE1KQogCi0KLQotLyogI2RlZmluZXMgd2hpY2ggZGVwZW5kIG9uIG90aGVyICNkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyogI2RlZmluZXMgd2hpY2ggZGVwZW5kIG9uIG90aGVyICNkZWZpbmVzICovCiAKICNkZWZpbmUgTlNfVFNUMCBOU19UU1RfRlJTQ0QKICNkZWZpbmUgTlNfVFNUMSAoTlNfVFNUX0ZSU0NEICsgTlNfVFNUX05VTV9FTlRSSUVTICsgMSkKQEAgLTY3Miw4ICs2MjUsNyBAQAogI2RlZmluZSBOU19DRkdfVFNRRklFX09QVCAweDAwMDAwMDAwCiAjZW5kaWYgLyogRU5BQkxFX1RTUUZJRSAqLwogCi0KLS8qIFBDSSBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgc3R1ZmYgKi8KIAogI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0lEVAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lEVCAweDExMUQKQEAgLTY4MywxMzggKzYzNSwxMjQgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JRFRfSURUNzcyMDEgMHgwMDAxCiAjZW5kaWYgLyogUENJX0RFVklDRV9JRF9JRFRfSURUNzcyMDEgKi8KIAorLyogRGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmVzICovCiAKLQotLyogRGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgbnNfc2tiX2NiIHsKLQl1MzIgYnVmX3R5cGU7CQkJLyogQlVGX1NNL0JVRl9MRy9CVUZfTk9ORSAqLworc3RydWN0IG5zX3NrYl9wcnYgeworCXUzMiBidWZfdHlwZTsJCS8qIEJVRl9TTS9CVUZfTEcvQlVGX05PTkUgKi8KKwl1MzIgZG1hOworCWludCBpb3ZjbnQ7CiB9OwogCi0jZGVmaW5lIE5TX1NLQl9DQihza2IpCSgoc3RydWN0IG5zX3NrYl9jYiAqKSgoc2tiKS0+Y2IpKQorI2RlZmluZSBOU19QUlZfQlVGVFlQRShza2IpICAgXAorICAgICAgICAoKChzdHJ1Y3QgbnNfc2tiX3BydiAqKShBVE1fU0tCKHNrYikrMSkpLT5idWZfdHlwZSkKKyNkZWZpbmUgTlNfUFJWX0RNQShza2IpIFwKKyAgICAgICAgKCgoc3RydWN0IG5zX3NrYl9wcnYgKikoQVRNX1NLQihza2IpKzEpKS0+ZG1hKQorI2RlZmluZSBOU19QUlZfSU9WQ05UKHNrYikgXAorICAgICAgICAoKChzdHJ1Y3QgbnNfc2tiX3BydiAqKShBVE1fU0tCKHNrYikrMSkpLT5pb3ZjbnQpCiAKLXR5cGVkZWYgc3RydWN0IHRzcV9pbmZvCi17Ci0gICB2b2lkICpvcmc7Ci0gICBuc190c2kgKmJhc2U7Ci0gICBuc190c2kgKm5leHQ7Ci0gICBuc190c2kgKmxhc3Q7Cit0eXBlZGVmIHN0cnVjdCB0c3FfaW5mbyB7CisJdm9pZCAqb3JnOworICAgICAgICBkbWFfYWRkcl90IGRtYTsKKwluc190c2kgKmJhc2U7CisJbnNfdHNpICpuZXh0OworCW5zX3RzaSAqbGFzdDsKIH0gdHNxX2luZm87CiAKLQotdHlwZWRlZiBzdHJ1Y3Qgc2NxX2luZm8KLXsKLSAgIHZvaWQgKm9yZzsKLSAgIG5zX3NjcWUgKmJhc2U7Ci0gICBuc19zY3FlICpsYXN0OwotICAgbnNfc2NxZSAqbmV4dDsKLSAgIHZvbGF0aWxlIG5zX3NjcWUgKnRhaWw7CQkvKiBOb3QgcmVsYXRlZCB0byB0aGUgbmljc3RhciByZWdpc3RlciAqLwotICAgdW5zaWduZWQgbnVtX2VudHJpZXM7Ci0gICBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYjsJCS8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgc2tfYnVmZnMgdXNlZCBmb3IgdHggKi8KLSAgIHUzMiBzY2Q7CQkJCS8qIFNSQU0gYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRCAqLwotICAgaW50IHRiZF9jb3VudDsJCQkvKiBPbmx5IG1lYW5pbmdmdWwgb24gdmFyaWFibGUgcmF0ZSAqLwotICAgd2FpdF9xdWV1ZV9oZWFkX3Qgc2NxZnVsbF93YWl0cTsKLSAgIHZvbGF0aWxlIGNoYXIgZnVsbDsJCQkvKiBTQ1EgZnVsbCBpbmRpY2F0b3IgKi8KLSAgIHNwaW5sb2NrX3QgbG9jazsJCQkvKiBTQ1Egc3BpbmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IHNjcV9pbmZvIHsKKwl2b2lkICpvcmc7CisJZG1hX2FkZHJfdCBkbWE7CisJbnNfc2NxZSAqYmFzZTsKKwluc19zY3FlICpsYXN0OworCW5zX3NjcWUgKm5leHQ7CisJdm9sYXRpbGUgbnNfc2NxZSAqdGFpbDsJLyogTm90IHJlbGF0ZWQgdG8gdGhlIG5pY3N0YXIgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBudW1fZW50cmllczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnNrYjsJLyogUG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycworCQkJCSAgIHRvIHRoZSBza19idWZmcyB1c2VkIGZvciB0eCAqLworCXUzMiBzY2Q7CQkvKiBTUkFNIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKwkJCQkgICBTQ0QgKi8KKwlpbnQgdGJkX2NvdW50OwkJLyogT25seSBtZWFuaW5nZnVsIG9uIHZhcmlhYmxlIHJhdGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzY3FmdWxsX3dhaXRxOworCXZvbGF0aWxlIGNoYXIgZnVsbDsJLyogU0NRIGZ1bGwgaW5kaWNhdG9yICovCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBTQ1Egc3BpbmxvY2sgKi8KIH0gc2NxX2luZm87CiAKLQotCi10eXBlZGVmIHN0cnVjdCByc3FfaW5mbwotewotICAgdm9pZCAqb3JnOwotICAgbnNfcnNxZSAqYmFzZTsKLSAgIG5zX3JzcWUgKm5leHQ7Ci0gICBuc19yc3FlICpsYXN0OwordHlwZWRlZiBzdHJ1Y3QgcnNxX2luZm8geworCXZvaWQgKm9yZzsKKyAgICAgICAgZG1hX2FkZHJfdCBkbWE7CisJbnNfcnNxZSAqYmFzZTsKKwluc19yc3FlICpuZXh0OworCW5zX3JzcWUgKmxhc3Q7CiB9IHJzcV9pbmZvOwogCi0KLXR5cGVkZWYgc3RydWN0IHNrYl9wb29sCi17Ci0gICB2b2xhdGlsZSBpbnQgY291bnQ7CQkJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIHF1ZXVlICovCi0gICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOwordHlwZWRlZiBzdHJ1Y3Qgc2tiX3Bvb2wgeworCXZvbGF0aWxlIGludCBjb3VudDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIHF1ZXVlICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBxdWV1ZTsKIH0gc2tiX3Bvb2w7CiAKIC8qIE5PVEU6IGZvciBzbWFsbCBhbmQgbGFyZ2UgYnVmZmVyIHBvb2xzLCB0aGUgY291bnQgaXMgbm90IHVzZWQsIGFzIHRoZQogICAgICAgICAgYWN0dWFsIHZhbHVlIHVzZWQgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50IGlzIHRoZSBvbmUgcmVhZCBmcm9tIHRoZQogCSBjYXJkLiAqLwogCi0KLXR5cGVkZWYgc3RydWN0IHZjX21hcAotewotICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IHR4OjE7CQkJCS8qIFRYIHZjPyAqLwotICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IHJ4OjE7CQkJCS8qIFJYIHZjPyAqLwotICAgc3RydWN0IGF0bV92Y2MgKnR4X3ZjYywgKnJ4X3ZjYzsKLSAgIHN0cnVjdCBza19idWZmICpyeF9pb3Y7CQkvKiBSWCBpb3ZlY3RvciBza2IgKi8KLSAgIHNjcV9pbmZvICpzY3E7CQkJLyogVG8ga2VlcCB0cmFjayBvZiB0aGUgU0NRICovCi0gICB1MzIgY2JyX3NjZDsJCQkJLyogU1JBTSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAgICAJCQkJICAgU0NELiAweDAwMDAwMDAwIGZvciBVQlIvVkJSL0FCUiAqLwotICAgaW50IHRiZF9jb3VudDsKK3R5cGVkZWYgc3RydWN0IHZjX21hcCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHR4OjE7CS8qIFRYIHZjPyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByeDoxOwkvKiBSWCB2Yz8gKi8KKwlzdHJ1Y3QgYXRtX3ZjYyAqdHhfdmNjLCAqcnhfdmNjOworCXN0cnVjdCBza19idWZmICpyeF9pb3Y7CS8qIFJYIGlvdmVjdG9yIHNrYiAqLworCXNjcV9pbmZvICpzY3E7CQkvKiBUbyBrZWVwIHRyYWNrIG9mIHRoZSBTQ1EgKi8KKwl1MzIgY2JyX3NjZDsJCS8qIFNSQU0gYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZworCQkJCSAgIFNDRC4gMHgwMDAwMDAwMCBmb3IgVUJSL1ZCUi9BQlIgKi8KKwlpbnQgdGJkX2NvdW50OwogfSB2Y19tYXA7CiAKLQotc3RydWN0IG5zX3NrYl9kYXRhCi17Ci0Jc3RydWN0IGF0bV92Y2MgKnZjYzsKLQlpbnQgaW92Y250OwotfTsKLQotI2RlZmluZSBOU19TS0Ioc2tiKSAoKChzdHJ1Y3QgbnNfc2tiX2RhdGEgKikgKHNrYiktPmNiKSkKLQotCi10eXBlZGVmIHN0cnVjdCBuc19kZXYKLXsKLSAgIGludCBpbmRleDsJCQkJLyogQ2FyZCBJRCB0byB0aGUgZGV2aWNlIGRyaXZlciAqLwotICAgaW50IHNyYW1fc2l6ZTsJCQkvKiBJbiBrIHggMzJiaXQgd29yZHMuIDMyIG9yIDEyOCAqLwotICAgdm9pZCBfX2lvbWVtICptZW1iYXNlOwkJLyogQ2FyZCdzIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSAgIHVuc2lnbmVkIGxvbmcgbWF4X3BjcjsKLSAgIGludCByY3Rfc2l6ZTsJCQkvKiBOdW1iZXIgb2YgZW50cmllcyAqLwotICAgaW50IHZwaWJpdHM7Ci0gICBpbnQgdmNpYml0czsKLSAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7Ci0gICBzdHJ1Y3QgYXRtX2RldiAqYXRtZGV2OwotICAgdHNxX2luZm8gdHNxOwotICAgcnNxX2luZm8gcnNxOwotICAgc2NxX2luZm8gKnNjcTAsICpzY3ExLCAqc2NxMjsJLyogVkJSIFNDUXMgKi8KLSAgIHNrYl9wb29sIHNicG9vbDsJCQkvKiBTbWFsbCBidWZmZXJzICovCi0gICBza2JfcG9vbCBsYnBvb2w7CQkJLyogTGFyZ2UgYnVmZmVycyAqLwotICAgc2tiX3Bvb2wgaGJwb29sOwkJCS8qIFByZS1hbGxvY2F0ZWQgaHVnZSBidWZmZXJzICovCi0gICBza2JfcG9vbCBpb3Zwb29sOwkJCS8qIGlvdmVjdG9yIGJ1ZmZlcnMgKi8KLSAgIHZvbGF0aWxlIGludCBlZmJpZTsJCQkvKiBFbXB0eSBmcmVlIGJ1Zi4gcXVldWUgaW50LiBlbmFibGVkICovCi0gICB2b2xhdGlsZSB1MzIgdHN0X2FkZHI7CQkvKiBTUkFNIGFkZHJlc3Mgb2YgdGhlIFRTVCBpbiB1c2UgKi8KLSAgIHZvbGF0aWxlIGludCB0c3RfZnJlZV9lbnRyaWVzOwotICAgdmNfbWFwIHZjbWFwW05TX01BWF9SQ1RTSVpFXTsKLSAgIHZjX21hcCAqdHN0ZTJ2Y1tOU19UU1RfTlVNX0VOVFJJRVNdOwotICAgdmNfbWFwICpzY2QydmNbTlNfRlJTQ0RfTlVNXTsKLSAgIGJ1Zl9uciBzYm5yOwotICAgYnVmX25yIGxibnI7Ci0gICBidWZfbnIgaGJucjsKLSAgIGJ1Zl9uciBpb3ZucjsKLSAgIGludCBzYmZxYzsKLSAgIGludCBsYmZxYzsKLSAgIHUzMiBzbV9oYW5kbGU7Ci0gICB1MzIgc21fYWRkcjsKLSAgIHUzMiBsZ19oYW5kbGU7Ci0gICB1MzIgbGdfYWRkcjsKLSAgIHN0cnVjdCBza19idWZmICpyY2J1ZjsJCS8qIEN1cnJlbnQgcmF3IGNlbGwgYnVmZmVyICovCi0gICB1MzIgcmF3Y2g7CQkJCS8qIFJhdyBjZWxsIHF1ZXVlIGhlYWQgKi8KLSAgIHVuc2lnbmVkIGludGNudDsJCQkvKiBJbnRlcnJ1cHQgY291bnRlciAqLwotICAgc3BpbmxvY2tfdCBpbnRfbG9jazsJCS8qIEludGVycnVwdCBsb2NrICovCi0gICBzcGlubG9ja190IHJlc19sb2NrOwkJLyogQ2FyZCByZXNvdXJjZSBsb2NrICovCit0eXBlZGVmIHN0cnVjdCBuc19kZXYgeworCWludCBpbmRleDsJCS8qIENhcmQgSUQgdG8gdGhlIGRldmljZSBkcml2ZXIgKi8KKwlpbnQgc3JhbV9zaXplOwkJLyogSW4gayB4IDMyYml0IHdvcmRzLiAzMiBvciAxMjggKi8KKwl2b2lkIF9faW9tZW0gKm1lbWJhc2U7CS8qIENhcmQncyBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBtYXhfcGNyOworCWludCByY3Rfc2l6ZTsJCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJaW50IHZwaWJpdHM7CisJaW50IHZjaWJpdHM7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlzdHJ1Y3QgaWRyIGlkcjsKKwlzdHJ1Y3QgYXRtX2RldiAqYXRtZGV2OworCXRzcV9pbmZvIHRzcTsKKwlyc3FfaW5mbyByc3E7CisJc2NxX2luZm8gKnNjcTAsICpzY3ExLCAqc2NxMjsJLyogVkJSIFNDUXMgKi8KKwlza2JfcG9vbCBzYnBvb2w7CS8qIFNtYWxsIGJ1ZmZlcnMgKi8KKwlza2JfcG9vbCBsYnBvb2w7CS8qIExhcmdlIGJ1ZmZlcnMgKi8KKwlza2JfcG9vbCBoYnBvb2w7CS8qIFByZS1hbGxvY2F0ZWQgaHVnZSBidWZmZXJzICovCisJc2tiX3Bvb2wgaW92cG9vbDsJLyogaW92ZWN0b3IgYnVmZmVycyAqLworCXZvbGF0aWxlIGludCBlZmJpZTsJLyogRW1wdHkgZnJlZSBidWYuIHF1ZXVlIGludC4gZW5hYmxlZCAqLworCXZvbGF0aWxlIHUzMiB0c3RfYWRkcjsJLyogU1JBTSBhZGRyZXNzIG9mIHRoZSBUU1QgaW4gdXNlICovCisJdm9sYXRpbGUgaW50IHRzdF9mcmVlX2VudHJpZXM7CisJdmNfbWFwIHZjbWFwW05TX01BWF9SQ1RTSVpFXTsKKwl2Y19tYXAgKnRzdGUydmNbTlNfVFNUX05VTV9FTlRSSUVTXTsKKwl2Y19tYXAgKnNjZDJ2Y1tOU19GUlNDRF9OVU1dOworCWJ1Zl9uciBzYm5yOworCWJ1Zl9uciBsYm5yOworCWJ1Zl9uciBoYm5yOworCWJ1Zl9uciBpb3ZucjsKKwlpbnQgc2JmcWM7CisJaW50IGxiZnFjOworCXN0cnVjdCBza19idWZmICpzbV9oYW5kbGU7CisJdTMyIHNtX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKmxnX2hhbmRsZTsKKwl1MzIgbGdfYWRkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmNidWY7CS8qIEN1cnJlbnQgcmF3IGNlbGwgYnVmZmVyICovCisgICAgICAgIHN0cnVjdCBuc19yY3FlICpyYXdjZWxsOworCXUzMiByYXdjaDsJCS8qIFJhdyBjZWxsIHF1ZXVlIGhlYWQgKi8KKwl1bnNpZ25lZCBpbnRjbnQ7CS8qIEludGVycnVwdCBjb3VudGVyICovCisJc3BpbmxvY2tfdCBpbnRfbG9jazsJLyogSW50ZXJydXB0IGxvY2sgKi8KKwlzcGlubG9ja190IHJlc19sb2NrOwkvKiBDYXJkIHJlc291cmNlIGxvY2sgKi8KIH0gbnNfZGV2OwogCi0KICAgIC8qIE5PVEU6IEVhY2ggdHN0ZTJ2YyBlbnRyeSByZWxhdGVzIGEgZ2l2ZW4gVFNUIGVudHJ5IHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICBDQlIgdmMuIElmIHRoZSBlbnRyeSBpcyBub3QgYWxsb2NhdGVkLCBpdCBtdXN0IGJlIE5VTEwuCi0JICAgIAotCSAgICBUaGVyZSBhcmUgdHdvIFRTVHMgc28gdGhlIGRyaXZlciBjYW4gbW9kaWZ5IHRoZW0gb24gdGhlIGZseQotCSAgICB3aXRob3V0IHN0b3BwaW5nIHRoZSB0cmFuc21pc3Npb24uCi0JICAgIAotCSAgICBzY2QydmMgYWxsb3dzIHVzIHRvIGZpbmQgb3V0IHVudXNlZCBmaXhlZCByYXRlIFNDRHMsIGJlY2F1c2UKLQkgICAgdGhleSBtdXN0IGhhdmUgYSBOVUxMIHBvaW50ZXIgaGVyZS4gKi8KKyAgICAgIENCUiB2Yy4gSWYgdGhlIGVudHJ5IGlzIG5vdCBhbGxvY2F0ZWQsIGl0IG11c3QgYmUgTlVMTC4KIAorICAgICAgVGhlcmUgYXJlIHR3byBUU1RzIHNvIHRoZSBkcml2ZXIgY2FuIG1vZGlmeSB0aGVtIG9uIHRoZSBmbHkKKyAgICAgIHdpdGhvdXQgc3RvcHBpbmcgdGhlIHRyYW5zbWlzc2lvbi4KKworICAgICAgc2NkMnZjIGFsbG93cyB1cyB0byBmaW5kIG91dCB1bnVzZWQgZml4ZWQgcmF0ZSBTQ0RzLCBiZWNhdXNlCisgICAgICB0aGV5IG11c3QgaGF2ZSBhIE5VTEwgcG9pbnRlciBoZXJlLiAqLwogCiAjZW5kaWYgLyogX0xJTlVYX05JQ1NUQVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL25pY3N0YXJtYWMuYyBiL2RyaXZlcnMvYXRtL25pY3N0YXJtYWMuYwppbmRleCA4NDJlMjZjLi5mNTk0NTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9uaWNzdGFybWFjLmMKKysrIGIvZHJpdmVycy9hdG0vbmljc3Rhcm1hYy5jCkBAIC0xMywxNSArMTMsMTUgQEAKIAogI2RlZmluZSBDWUNMRV9ERUxBWSA1CiAKLS8qIFRoaXMgd2FzIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uCisvKgorICAgVGhpcyB3YXMgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24KICNkZWZpbmUgb3NwX01pY3JvRGVsYXkobWljcm9zZWMpIFwKICAgICBkbyB7IGludCBfaSA9IDQqbWljcm9zZWM7IHdoaWxlICgtLV9pID4gMCkgeyBfX1NMT1dfRE9XTl9JTzsgfX0gd2hpbGUgKDApCiAqLwogI2RlZmluZSBvc3BfTWljcm9EZWxheShtaWNyb3NlYykge3Vuc2lnbmVkIGxvbmcgdXNlY29uZHMgPSAobWljcm9zZWMpOyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KCh1c2Vjb25kcykpO30KLQotCi0vKiBUaGUgZm9sbG93aW5nIHRhYmxlcyByZXByZXNlbnQgdGhlIHRpbWluZyBkaWFncmFtcyBmb3VuZCBpbgorLyoKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGVzIHJlcHJlc2VudCB0aGUgdGltaW5nIGRpYWdyYW1zIGZvdW5kIGluCiAgKiB0aGUgRGF0YSBTaGVldCBmb3IgdGhlIFhpY29yIFgyNTAyMCBFRVByb20uICBUaGUgI2RlZmluZXMgYmVsb3cKICAqIHJlcHJlc2VudCB0aGUgYml0cyBpbiB0aGUgTklDU3RBUidzIEdlbmVyYWwgUHVycG9zZSByZWdpc3RlcgogICogdGhhdCBtdXN0IGJlIHRvZ2dsZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGFjdGlvbnMgb24gdGhlIEVFUHJvbQpAQCAtMzEsODYgKzMxLDgwIEBACiAvKiBXcml0ZSBEYXRhIFRvIEVFUHJvbSBmcm9tIFNJIGxpbmUgb24gcmlzaW5nIGVkZ2Ugb2YgQ0xLICovCiAvKiBSZWFkIERhdGEgRnJvbSBFRVByb20gb24gZmFsbGluZyBlZGdlIG9mIENMSyAqLwogCi0jZGVmaW5lIENTX0hJR0gJCTB4MDAwMgkJLyogQ2hpcCBzZWxlY3QgaGlnaCAqLwotI2RlZmluZSBDU19MT1cJCTB4MDAwMAkJLyogQ2hpcCBzZWxlY3QgbG93IChhY3RpdmUgbG93KSovCi0jZGVmaW5lIENMS19ISUdICTB4MDAwNAkJLyogQ2xvY2sgaGlnaCAqLwotI2RlZmluZSBDTEtfTE9XCQkweDAwMDAJCS8qIENsb2NrIGxvdyAgKi8KLSNkZWZpbmUgU0lfSElHSAkJMHgwMDAxCQkvKiBTZXJpYWwgaW5wdXQgZGF0YSBoaWdoICovCi0jZGVmaW5lIFNJX0xPVwkJMHgwMDAwCQkvKiBTZXJpYWwgaW5wdXQgZGF0YSBsb3cgKi8KKyNkZWZpbmUgQ1NfSElHSAkJMHgwMDAyCS8qIENoaXAgc2VsZWN0IGhpZ2ggKi8KKyNkZWZpbmUgQ1NfTE9XCQkweDAwMDAJLyogQ2hpcCBzZWxlY3QgbG93IChhY3RpdmUgbG93KSAqLworI2RlZmluZSBDTEtfSElHSAkweDAwMDQJLyogQ2xvY2sgaGlnaCAqLworI2RlZmluZSBDTEtfTE9XCQkweDAwMDAJLyogQ2xvY2sgbG93ICAqLworI2RlZmluZSBTSV9ISUdICQkweDAwMDEJLyogU2VyaWFsIGlucHV0IGRhdGEgaGlnaCAqLworI2RlZmluZSBTSV9MT1cJCTB4MDAwMAkvKiBTZXJpYWwgaW5wdXQgZGF0YSBsb3cgKi8KIAogLyogUmVhZCBTdGF0dXMgUmVnaXN0ZXIgPSAwMDAwIDAxMDFiICovCiAjaWYgMAotc3RhdGljIHVfaW50MzJfdCByZHNydGFiW10gPQotewotICAgIENTX0hJR0ggfCBDTEtfSElHSCwgCi0gICAgQ1NfTE9XIHwgQ0xLX0xPVywgCi0gICAgQ0xLX0hJR0gsICAgICAgICAgICAgIC8qIDAgKi8KLSAgICBDTEtfTE9XLCAKLSAgICBDTEtfSElHSCwgICAgICAgICAgICAgLyogMCAqLwotICAgIENMS19MT1csIAotICAgIENMS19ISUdILCAgICAgICAgICAgICAvKiAwICovCi0gICAgQ0xLX0xPVywKLSAgICBDTEtfSElHSCwgICAgICAgICAgICAgLyogMCAqLwotICAgIENMS19MT1csIAotICAgIENMS19ISUdILCAgICAgICAgICAgICAvKiAwICovCi0gICAgQ0xLX0xPVyB8IFNJX0hJR0gsIAotICAgIENMS19ISUdIIHwgU0lfSElHSCwgICAvKiAxICovCi0gICAgQ0xLX0xPVyB8IFNJX0xPVywgCi0gICAgQ0xLX0hJR0gsICAgICAgICAgICAgIC8qIDAgKi8KLSAgICBDTEtfTE9XIHwgU0lfSElHSCwgCi0gICAgQ0xLX0hJR0ggfCBTSV9ISUdIICAgLyogMSAqLworc3RhdGljIHVfaW50MzJfdCByZHNydGFiW10gPSB7CisJQ1NfSElHSCB8IENMS19ISUdILAorCUNTX0xPVyB8IENMS19MT1csCisJQ0xLX0hJR0gsCQkvKiAwICovCisJQ0xLX0xPVywKKwlDTEtfSElHSCwJCS8qIDAgKi8KKwlDTEtfTE9XLAorCUNMS19ISUdILAkJLyogMCAqLworCUNMS19MT1csCisJQ0xLX0hJR0gsCQkvKiAwICovCisJQ0xLX0xPVywKKwlDTEtfSElHSCwJCS8qIDAgKi8KKwlDTEtfTE9XIHwgU0lfSElHSCwKKwlDTEtfSElHSCB8IFNJX0hJR0gsCS8qIDEgKi8KKwlDTEtfTE9XIHwgU0lfTE9XLAorCUNMS19ISUdILAkJLyogMCAqLworCUNMS19MT1cgfCBTSV9ISUdILAorCUNMS19ISUdIIHwgU0lfSElHSAkvKiAxICovCiB9OwotI2VuZGlmICAvKiAgMCAgKi8KLQorI2VuZGlmIC8qICAwICAqLwogCiAvKiBSZWFkIGZyb20gRUVQUk9NID0gMDAwMCAwMDExYiAqLwotc3RhdGljIHVfaW50MzJfdCByZWFkdGFiW10gPQotewotICAgIC8qCi0gICAgQ1NfSElHSCB8IENMS19ISUdILCAKLSAgICAqLwotICAgIENTX0xPVyB8IENMS19MT1csIAotICAgIENMS19ISUdILCAgICAgICAgICAgICAvKiAwICovCi0gICAgQ0xLX0xPVywgCi0gICAgQ0xLX0hJR0gsICAgICAgICAgICAgIC8qIDAgKi8KLSAgICBDTEtfTE9XLCAKLSAgICBDTEtfSElHSCwgICAgICAgICAgICAgLyogMCAqLwotICAgIENMS19MT1csCi0gICAgQ0xLX0hJR0gsICAgICAgICAgICAgIC8qIDAgKi8KLSAgICBDTEtfTE9XLCAKLSAgICBDTEtfSElHSCwgICAgICAgICAgICAgLyogMCAqLwotICAgIENMS19MT1csIAotICAgIENMS19ISUdILCAgICAgICAgICAgICAvKiAwICovCi0gICAgQ0xLX0xPVyB8IFNJX0hJR0gsIAotICAgIENMS19ISUdIIHwgU0lfSElHSCwgICAvKiAxICovCi0gICAgQ0xLX0xPVyB8IFNJX0hJR0gsIAotICAgIENMS19ISUdIIHwgU0lfSElHSCAgICAvKiAxICovCitzdGF0aWMgdV9pbnQzMl90IHJlYWR0YWJbXSA9IHsKKwkvKgorCSAgIENTX0hJR0ggfCBDTEtfSElHSCwKKwkgKi8KKwlDU19MT1cgfCBDTEtfTE9XLAorCUNMS19ISUdILAkJLyogMCAqLworCUNMS19MT1csCisJQ0xLX0hJR0gsCQkvKiAwICovCisJQ0xLX0xPVywKKwlDTEtfSElHSCwJCS8qIDAgKi8KKwlDTEtfTE9XLAorCUNMS19ISUdILAkJLyogMCAqLworCUNMS19MT1csCisJQ0xLX0hJR0gsCQkvKiAwICovCisJQ0xLX0xPVywKKwlDTEtfSElHSCwJCS8qIDAgKi8KKwlDTEtfTE9XIHwgU0lfSElHSCwKKwlDTEtfSElHSCB8IFNJX0hJR0gsCS8qIDEgKi8KKwlDTEtfTE9XIHwgU0lfSElHSCwKKwlDTEtfSElHSCB8IFNJX0hJR0gJLyogMSAqLwogfTsKIAotCiAvKiBDbG9jayB0byByZWFkIGZyb20vd3JpdGUgdG8gdGhlIGVlcHJvbSAqLwotc3RhdGljIHVfaW50MzJfdCBjbG9ja3RhYltdID0KLXsJCi0gICAgQ0xLX0xPVywKLSAgICBDTEtfSElHSCwKLSAgICBDTEtfTE9XLCAKLSAgICBDTEtfSElHSCwKLSAgICBDTEtfTE9XLAotICAgIENMS19ISUdILAotICAgIENMS19MT1csIAotICAgIENMS19ISUdILAotICAgIENMS19MT1csIAotICAgIENMS19ISUdILAotICAgIENMS19MT1csIAotICAgIENMS19ISUdILCAKLSAgICBDTEtfTE9XLCAKLSAgICBDTEtfSElHSCwKLSAgICBDTEtfTE9XLCAKLSAgICBDTEtfSElHSCwKLSAgICBDTEtfTE9XIAorc3RhdGljIHVfaW50MzJfdCBjbG9ja3RhYltdID0geworCUNMS19MT1csCisJQ0xLX0hJR0gsCisJQ0xLX0xPVywKKwlDTEtfSElHSCwKKwlDTEtfTE9XLAorCUNMS19ISUdILAorCUNMS19MT1csCisJQ0xLX0hJR0gsCisJQ0xLX0xPVywKKwlDTEtfSElHSCwKKwlDTEtfTE9XLAorCUNMS19ISUdILAorCUNMS19MT1csCisJQ0xLX0hJR0gsCisJQ0xLX0xPVywKKwlDTEtfSElHSCwKKwlDTEtfTE9XCiB9OwogCi0KICNkZWZpbmUgTklDU1RBUl9SRUdfV1JJVEUoYnMsIHJlZywgdmFsKSBcCiAJd2hpbGUgKCByZWFkbChicyArIFNUQVQpICYgMHgwMjAwICkgOyBcCiAJd3JpdGVsKCh2YWwpLChiYXNlKSsocmVnKSkKQEAgLTEyNCwxNTMgKzExOCwxMzEgQEAKICAqIHJlZ2lzdGVyLiAgCiAgKi8KICNpZiAwCi11X2ludDMyX3QKLW5pY3N0YXJfcmVhZF9lcHJvbV9zdGF0dXMoIHZpcnRfYWRkcl90IGJhc2UgKQordV9pbnQzMl90IG5pY3N0YXJfcmVhZF9lcHJvbV9zdGF0dXModmlydF9hZGRyX3QgYmFzZSkKIHsKLSAgIHVfaW50MzJfdAl2YWw7Ci0gICB1X2ludDMyX3QJcmJ5dGU7Ci0gICBpbnQzMl90CWksIGo7CisJdV9pbnQzMl90IHZhbDsKKwl1X2ludDMyX3QgcmJ5dGU7CisJaW50MzJfdCBpLCBqOwogCi0gICAvKiBTZW5kIHJlYWQgaW5zdHJ1Y3Rpb24gKi8KLSAgIHZhbCA9IE5JQ1NUQVJfUkVHX1JFQUQoIGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSApICYgMHhGRkZGRkZGMDsKKwkvKiBTZW5kIHJlYWQgaW5zdHJ1Y3Rpb24gKi8KKwl2YWwgPSBOSUNTVEFSX1JFR19SRUFEKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSkgJiAweEZGRkZGRkYwOwogCi0gICBmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKHJkc3J0YWIpOyBpKyspCi0gICB7Ci0JTklDU1RBUl9SRUdfV1JJVEUoIGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKLQkJKHZhbCB8IHJkc3J0YWJbaV0pICk7Ci0gICAgICAgIG9zcF9NaWNyb0RlbGF5KCBDWUNMRV9ERUxBWSApOwotICAgfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJkc3J0YWIpOyBpKyspIHsKKwkJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJCSAgKHZhbCB8IHJkc3J0YWJbaV0pKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCX0KIAotICAgLyogRG9uZSBzZW5kaW5nIGluc3RydWN0aW9uIC0gbm93IHB1bGwgZGF0YSBvZmYgb2YgYml0IDE2LCBNU0IgZmlyc3QgKi8KLSAgIC8qIERhdGEgY2xvY2tlZCBvdXQgb2YgZWVwcm9tIG9uIGZhbGxpbmcgZWRnZSBvZiBjbG9jayAqLworCS8qIERvbmUgc2VuZGluZyBpbnN0cnVjdGlvbiAtIG5vdyBwdWxsIGRhdGEgb2ZmIG9mIGJpdCAxNiwgTVNCIGZpcnN0ICovCisJLyogRGF0YSBjbG9ja2VkIG91dCBvZiBlZXByb20gb24gZmFsbGluZyBlZGdlIG9mIGNsb2NrICovCiAKLSAgIHJieXRlID0gMDsKLSAgIGZvciAoaT03LCBqPTA7IGk+PTA7IGktLSkKLSAgIHsKLQlOSUNTVEFSX1JFR19XUklURSggYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAotCQkodmFsIHwgY2xvY2t0YWJbaisrXSkgKTsKLSAgICAgICAgcmJ5dGUgfD0gKCgoTklDU1RBUl9SRUdfUkVBRCggYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFKQotCQkJJiAweDAwMDEwMDAwKSA+PiAxNikgPDwgaSk7Ci0JTklDU1RBUl9SRUdfV1JJVEUoIGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKLQkJKHZhbCB8IGNsb2NrdGFiW2orK10pICk7Ci0gICAgICAgIG9zcF9NaWNyb0RlbGF5KCBDWUNMRV9ERUxBWSApOwotICAgfQotICAgTklDU1RBUl9SRUdfV1JJVEUoIGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwgMiApOwotICAgb3NwX01pY3JvRGVsYXkoIENZQ0xFX0RFTEFZICk7Ci0gICByZXR1cm4gcmJ5dGU7CisJcmJ5dGUgPSAwOworCWZvciAoaSA9IDcsIGogPSAwOyBpID49IDA7IGktLSkgeworCQlOSUNTVEFSX1JFR19XUklURShiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UsCisJCQkJICAodmFsIHwgY2xvY2t0YWJbaisrXSkpOworCQlyYnl0ZSB8PSAoKChOSUNTVEFSX1JFR19SRUFEKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSkKKwkJCSAgICAmIDB4MDAwMTAwMDApID4+IDE2KSA8PCBpKTsKKwkJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJCSAgKHZhbCB8IGNsb2NrdGFiW2orK10pKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCX0KKwlOSUNTVEFSX1JFR19XUklURShiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UsIDIpOworCW9zcF9NaWNyb0RlbGF5KENZQ0xFX0RFTEFZKTsKKwlyZXR1cm4gcmJ5dGU7CiB9Ci0jZW5kaWYgIC8qICAwICAqLwotCisjZW5kaWYgLyogIDAgICovCiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCBjbG9jayB0aGUgUmVhZF9kYXRhIGZ1bmN0aW9uIGludG8gdGhlIFgyNTIwCiAgKiBlZXByb20sIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIHRvIHJlYWQgZnJvbSwgdGhyb3VnaCB0aGUgTmljU1RhUidzIEdlbmVyYWwKICAqIFB1cnBvc2UgcmVnaXN0ZXIuICAKICAqLwotIAotc3RhdGljIHVfaW50OF90IAotcmVhZF9lcHJvbV9ieXRlKHZpcnRfYWRkcl90IGJhc2UsIHVfaW50OF90IG9mZnNldCkKKworc3RhdGljIHVfaW50OF90IHJlYWRfZXByb21fYnl0ZSh2aXJ0X2FkZHJfdCBiYXNlLCB1X2ludDhfdCBvZmZzZXQpCiB7Ci0gICB1X2ludDMyX3QgdmFsID0gMDsKLSAgIGludCBpLGo9MDsKLSAgIHVfaW50OF90IHRlbXByZWFkID0gMDsKKwl1X2ludDMyX3QgdmFsID0gMDsKKwlpbnQgaSwgaiA9IDA7CisJdV9pbnQ4X3QgdGVtcHJlYWQgPSAwOwogCi0gICB2YWwgPSBOSUNTVEFSX1JFR19SRUFEKCBiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UgKSAmIDB4RkZGRkZGRjA7CisJdmFsID0gTklDU1RBUl9SRUdfUkVBRChiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UpICYgMHhGRkZGRkZGMDsKIAotICAgLyogU2VuZCBSRUFEIGluc3RydWN0aW9uICovCi0gICBmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKHJlYWR0YWIpOyBpKyspCi0gICB7Ci0JTklDU1RBUl9SRUdfV1JJVEUoIGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKLQkJKHZhbCB8IHJlYWR0YWJbaV0pICk7Ci0gICAgICAgIG9zcF9NaWNyb0RlbGF5KCBDWUNMRV9ERUxBWSApOwotICAgfQorCS8qIFNlbmQgUkVBRCBpbnN0cnVjdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlYWR0YWIpOyBpKyspIHsKKwkJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJCSAgKHZhbCB8IHJlYWR0YWJbaV0pKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCX0KIAotICAgLyogTmV4dCwgd2UgbmVlZCB0byBzZW5kIHRoZSBieXRlIGFkZHJlc3MgdG8gcmVhZCBmcm9tICovCi0gICBmb3IgKGk9NzsgaT49MDsgaS0tKQotICAgewotICAgICAgTklDU1RBUl9SRUdfV1JJVEUoIGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKLSAgICAgIAkJKHZhbCB8IGNsb2NrdGFiW2orK10gfCAoKG9mZnNldCA+PiBpKSAmIDEpICkgKTsKLSAgICAgIG9zcF9NaWNyb0RlbGF5KENZQ0xFX0RFTEFZKTsKLSAgICAgIE5JQ1NUQVJfUkVHX1dSSVRFKCBiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UsCi0gICAgICAJCSh2YWwgfCBjbG9ja3RhYltqKytdIHwgKChvZmZzZXQgPj4gaSkgJiAxKSApICk7Ci0gICAgICBvc3BfTWljcm9EZWxheSggQ1lDTEVfREVMQVkgKTsKLSAgIH0KKwkvKiBOZXh0LCB3ZSBuZWVkIHRvIHNlbmQgdGhlIGJ5dGUgYWRkcmVzcyB0byByZWFkIGZyb20gKi8KKwlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQlOSUNTVEFSX1JFR19XUklURShiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UsCisJCQkJICAodmFsIHwgY2xvY2t0YWJbaisrXSB8ICgob2Zmc2V0ID4+IGkpICYgMSkpKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCQlOSUNTVEFSX1JFR19XUklURShiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UsCisJCQkJICAodmFsIHwgY2xvY2t0YWJbaisrXSB8ICgob2Zmc2V0ID4+IGkpICYgMSkpKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCX0KIAotICAgaiA9IDA7Ci0gICAKLSAgIC8qIE5vdywgd2UgY2FuIHJlYWQgZGF0YSBmcm9tIHRoZSBlZXByb20gYnkgY2xvY2tpbmcgaXQgaW4gKi8KLSAgIGZvciAoaT03OyBpPj0wOyBpLS0pCi0gICB7Ci0gICAgICBOSUNTVEFSX1JFR19XUklURSggYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAotICAgICAgCQkodmFsIHwgY2xvY2t0YWJbaisrXSkgKTsKLSAgICAgIG9zcF9NaWNyb0RlbGF5KCBDWUNMRV9ERUxBWSApOwotICAgICAgdGVtcHJlYWQgfD0gKCgoTklDU1RBUl9SRUdfUkVBRCggYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFICkKLQkJJiAweDAwMDEwMDAwKSA+PiAxNikgPDwgaSk7Ci0gICAgICBOSUNTVEFSX1JFR19XUklURSggYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAotICAgICAgCQkodmFsIHwgY2xvY2t0YWJbaisrXSkgKTsKLSAgICAgIG9zcF9NaWNyb0RlbGF5KCBDWUNMRV9ERUxBWSApOwotICAgfQorCWogPSAwOwogCi0gICBOSUNTVEFSX1JFR19XUklURSggYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLCAyICk7Ci0gICBvc3BfTWljcm9EZWxheSggQ1lDTEVfREVMQVkgKTsKLSAgIHJldHVybiB0ZW1wcmVhZDsKKwkvKiBOb3csIHdlIGNhbiByZWFkIGRhdGEgZnJvbSB0aGUgZWVwcm9tIGJ5IGNsb2NraW5nIGl0IGluICovCisJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJCSAgKHZhbCB8IGNsb2NrdGFiW2orK10pKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCQl0ZW1wcmVhZCB8PQorCQkgICAgKCgoTklDU1RBUl9SRUdfUkVBRChiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UpCisJCSAgICAgICAmIDB4MDAwMTAwMDApID4+IDE2KSA8PCBpKTsKKwkJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJCSAgKHZhbCB8IGNsb2NrdGFiW2orK10pKTsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCX0KKworCU5JQ1NUQVJfUkVHX1dSSVRFKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwgMik7CisJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCXJldHVybiB0ZW1wcmVhZDsKIH0KIAotCi1zdGF0aWMgdm9pZAotbmljc3Rhcl9pbml0X2Vwcm9tKCB2aXJ0X2FkZHJfdCBiYXNlICkKK3N0YXRpYyB2b2lkIG5pY3N0YXJfaW5pdF9lcHJvbSh2aXJ0X2FkZHJfdCBiYXNlKQogewotICAgIHVfaW50MzJfdCB2YWw7CisJdV9pbnQzMl90IHZhbDsKIAotICAgIC8qCi0gICAgICogdHVybiBjaGlwIHNlbGVjdCBvZmYKLSAgICAgKi8KLSAgICB2YWwgPSBOSUNTVEFSX1JFR19SRUFEKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSkgJiAweEZGRkZGRkYwOworCS8qCisJICogdHVybiBjaGlwIHNlbGVjdCBvZmYKKwkgKi8KKwl2YWwgPSBOSUNTVEFSX1JFR19SRUFEKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSkgJiAweEZGRkZGRkYwOwogCi0gICAgTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAotICAgIAkodmFsIHwgQ1NfSElHSCB8IENMS19ISUdIKSk7Ci0gICAgb3NwX01pY3JvRGVsYXkoIENZQ0xFX0RFTEFZICk7CisJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJICAodmFsIHwgQ1NfSElHSCB8IENMS19ISUdIKSk7CisJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOwogCi0gICAgTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAotICAgIAkodmFsIHwgQ1NfSElHSCB8IENMS19MT1cpKTsKLSAgICBvc3BfTWljcm9EZWxheSggQ1lDTEVfREVMQVkgKTsKKwlOSUNTVEFSX1JFR19XUklURShiYXNlLCBOSUNTVEFSX1JFR19HRU5FUkFMX1BVUlBPU0UsCisJCQkgICh2YWwgfCBDU19ISUdIIHwgQ0xLX0xPVykpOworCW9zcF9NaWNyb0RlbGF5KENZQ0xFX0RFTEFZKTsKIAotICAgIE5JQ1NUQVJfUkVHX1dSSVRFKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKLSAgICAJKHZhbCB8IENTX0hJR0ggfCBDTEtfSElHSCkpOwotICAgIG9zcF9NaWNyb0RlbGF5KCBDWUNMRV9ERUxBWSApOworCU5JQ1NUQVJfUkVHX1dSSVRFKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKKwkJCSAgKHZhbCB8IENTX0hJR0ggfCBDTEtfSElHSCkpOworCW9zcF9NaWNyb0RlbGF5KENZQ0xFX0RFTEFZKTsKIAotICAgIE5JQ1NUQVJfUkVHX1dSSVRFKGJhc2UsIE5JQ1NUQVJfUkVHX0dFTkVSQUxfUFVSUE9TRSwKLSAgICAJKHZhbCB8IENTX0hJR0ggfCBDTEtfTE9XKSk7Ci0gICAgb3NwX01pY3JvRGVsYXkoIENZQ0xFX0RFTEFZICk7CisJTklDU1RBUl9SRUdfV1JJVEUoYmFzZSwgTklDU1RBUl9SRUdfR0VORVJBTF9QVVJQT1NFLAorCQkJICAodmFsIHwgQ1NfSElHSCB8IENMS19MT1cpKTsKKwlvc3BfTWljcm9EZWxheShDWUNMRV9ERUxBWSk7CiB9CiAKLQogLyoKICAqIFRoaXMgcm91dGluZSB3aWxsIGJlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIFJlYWRQcm9tQnl0ZSBmdW5jdGlvbgogICogYWJvdmUuCi0gKi8gCisgKi8KIAogc3RhdGljIHZvaWQKLW5pY3N0YXJfcmVhZF9lcHJvbSgKLSAgICB2aXJ0X2FkZHJfdAliYXNlLAotICAgIHVfaW50OF90CXByb21fb2Zmc2V0LAotICAgIHVfaW50OF90CSpidWZmZXIsCi0gICAgdV9pbnQzMl90CW5ieXRlcyApCituaWNzdGFyX3JlYWRfZXByb20odmlydF9hZGRyX3QgYmFzZSwKKwkJICAgdV9pbnQ4X3QgcHJvbV9vZmZzZXQsIHVfaW50OF90ICogYnVmZmVyLCB1X2ludDMyX3QgbmJ5dGVzKQogewotICAgIHVfaW50CQlpOwotICAgIAotICAgIGZvciAoaT0wOyBpPG5ieXRlczsgaSsrKQotICAgIHsKLQlidWZmZXJbaV0gPSByZWFkX2Vwcm9tX2J5dGUoIGJhc2UsIHByb21fb2Zmc2V0ICk7Ci0JKytwcm9tX29mZnNldDsKLSAJb3NwX01pY3JvRGVsYXkoIENZQ0xFX0RFTEFZICk7Ci0gICAgfQorCXVfaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspIHsKKwkJYnVmZmVyW2ldID0gcmVhZF9lcHJvbV9ieXRlKGJhc2UsIHByb21fb2Zmc2V0KTsKKwkJKytwcm9tX29mZnNldDsKKwkJb3NwX01pY3JvRGVsYXkoQ1lDTEVfREVMQVkpOworCX0KIH0KLQotCi0vKgotdm9pZCBvc3BfTWljcm9EZWxheShpbnQgeCkgewotICAgIAotfQotKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vc29sb3MtcGNpLmMgYi9kcml2ZXJzL2F0bS9zb2xvcy1wY2kuYwppbmRleCBkZWQ3NmM0Li42MTc0OTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9zb2xvcy1wY2kuYworKysgYi9kcml2ZXJzL2F0bS9zb2xvcy1wY2kuYwpAQCAtMzgzLDcgKzM4Myw3IEBACiAKIAkvKiBBbnl0aGluZyBidXQgJ1Nob3d0aW1lJyBpcyBkb3duICovCiAJaWYgKHN0cmNtcChzdGF0ZV9zdHIsICJTaG93dGltZSIpKSB7Ci0JCWNhcmQtPmF0bWRldltwb3J0XS0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGNhcmQtPmF0bWRldltwb3J0XSwgQVRNX1BIWV9TSUdfTE9TVCk7CiAJCXJlbGVhc2VfdmNjcyhjYXJkLT5hdG1kZXZbcG9ydF0pOwogCQlkZXZfaW5mbygmY2FyZC0+ZGV2LT5kZXYsICJQb3J0ICVkOiAlc1xuIiwgcG9ydCwgc3RhdGVfc3RyKTsKIAkJcmV0dXJuIDA7CkBAIC00MDEsNyArNDAxLDcgQEAKIAkJIHNuclswXT8iLCBTTlIgIjoiIiwgc25yLCBhdHRuWzBdPyIsIEF0dG4gIjoiIiwgYXR0bik7CiAJCiAJY2FyZC0+YXRtZGV2W3BvcnRdLT5saW5rX3JhdGUgPSByYXRlX2Rvd24gLyA0MjQ7Ci0JY2FyZC0+YXRtZGV2W3BvcnRdLT5zaWduYWwgPSBBVE1fUEhZX1NJR19GT1VORDsKKwlhdG1fZGV2X3NpZ25hbF9jaGFuZ2UoY2FyZC0+YXRtZGV2W3BvcnRdLCBBVE1fUEhZX1NJR19GT1VORCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNDYsNyArMTI0Niw3IEBACiAJCWNhcmQtPmF0bWRldltpXS0+Y2lfcmFuZ2UudmNpX2JpdHMgPSAxNjsKIAkJY2FyZC0+YXRtZGV2W2ldLT5kZXZfZGF0YSA9IGNhcmQ7CiAJCWNhcmQtPmF0bWRldltpXS0+cGh5X2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWk7Ci0JCWNhcmQtPmF0bWRldltpXS0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGNhcmQtPmF0bWRldltpXSwgQVRNX1BIWV9TSUdfVU5LTk9XTik7CiAKIAkJc2tiID0gYWxsb2Nfc2tiKHNpemVvZigqaGVhZGVyKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghc2tiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9zdW5pLmMgYi9kcml2ZXJzL2F0bS9zdW5pLmMKaW5kZXggZGE0YjkxZi4uNDFjNTZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vc3VuaS5jCisrKyBiL2RyaXZlcnMvYXRtL3N1bmkuYwpAQCAtMjkxLDggKzI5MSw5IEBACiAKIHN0YXRpYyB2b2lkIHBvbGxfbG9zKHN0cnVjdCBhdG1fZGV2ICpkZXYpCiB7Ci0JZGV2LT5zaWduYWwgPSBHRVQoUlNPUF9TSVMpICYgU1VOSV9SU09QX1NJU19MT1NWID8gQVRNX1BIWV9TSUdfTE9TVCA6Ci0JICBBVE1fUEhZX1NJR19GT1VORDsKKwlhdG1fZGV2X3NpZ25hbF9jaGFuZ2UoZGV2LAorCQlHRVQoUlNPUF9TSVMpICYgU1VOSV9SU09QX1NJU19MT1NWID8KKwkJQVRNX1BIWV9TSUdfTE9TVCA6IEFUTV9QSFlfU0lHX0ZPVU5EKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS96YXRtLmMgYi9kcml2ZXJzL2F0bS96YXRtLmMKaW5kZXggNzAyYWNjZS4uNGU4ODVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vemF0bS5jCisrKyBiL2RyaXZlcnMvYXRtL3phdG0uYwpAQCAtMTYzNywxMCArMTYzNyw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB6YXRtX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0gewotCXsgUENJX1ZFTkRPUl9JRF9aRUlUTkVULCBQQ0lfREVWSUNFX0lEX1pFSVRORVRfMTIyMSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgWkFUTV9DT1BQRVIgfSwKLQl7IFBDSV9WRU5ET1JfSURfWkVJVE5FVCwgUENJX0RFVklDRV9JRF9aRUlUTkVUXzEyMjUsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WREVWSUNFKFpFSVRORVQsIFBDSV9ERVZJQ0VfSURfWkVJVE5FVF8xMjIxKSwgWkFUTV9DT1BQRVIgfSwKKwl7IFBDSV9WREVWSUNFKFpFSVRORVQsIFBDSV9ERVZJQ0VfSURfWkVJVE5FVF8xMjI1KSwgMCB9LAogCXsgMCwgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB6YXRtX3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDEyZWVjM2YuLmViMWI3ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTk0NSw4ICs5NDUsOCBAQAogCWJ1c19yZW1vdmVfZmlsZShidXMsICZidXNfYXR0cl91ZXZlbnQpOwogYnVzX3VldmVudF9mYWlsOgogCWtzZXRfdW5yZWdpc3RlcigmYnVzLT5wLT5zdWJzeXMpOwotCWtmcmVlKGJ1cy0+cCk7CiBvdXQ6CisJa2ZyZWUoYnVzLT5wKTsKIAlidXMtPnAgPSBOVUxMOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA5YjlkM2JkLi5kMWIyYzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTE1OTksNyArMTU5OSw3IEBACiAgKiBvbiB0aGUgc2FtZSBkZXZpY2UgdG8gZW5zdXJlIHRoYXQgbmV3X25hbWUgaXMgdmFsaWQgYW5kCiAgKiB3b24ndCBjb25mbGljdCB3aXRoIG90aGVyIGRldmljZXMuCiAgKi8KLWludCBkZXZpY2VfcmVuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbmV3X25hbWUpCitpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5ld19uYW1lKQogewogCWNoYXIgKm9sZF9jbGFzc19uYW1lID0gTlVMTDsKIAljaGFyICpuZXdfY2xhc3NfbmFtZSA9IE5VTEw7CkBAIC0xODE5LDMgKzE4MTksNjcgQEAKIAlzcGluX3VubG9jaygmZGV2aWNlc19rc2V0LT5saXN0X2xvY2spOwogCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIH0KKworLyoKKyAqIERldmljZSBsb2dnaW5nIGZ1bmN0aW9ucworICovCisKKyNpZmRlZiBDT05GSUdfUFJJTlRLCisKK3N0YXRpYyBpbnQgX19kZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpCit7CisJaWYgKCFkZXYpCisJCXJldHVybiBwcmludGsoIiVzKE5VTEwgZGV2aWNlICopOiAlcFYiLCBsZXZlbCwgdmFmKTsKKworCXJldHVybiBwcmludGsoIiVzJXMgJXM6ICVwViIsCisJCSAgICAgIGxldmVsLCBkZXZfZHJpdmVyX3N0cmluZyhkZXYpLCBkZXZfbmFtZShkZXYpLCB2YWYpOworfQorCitpbnQgZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCSAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXIgPSBfX2Rldl9wcmludGsobGV2ZWwsIGRldiwgJnZhZik7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGRldl9wcmludGspOworCisjZGVmaW5lIGRlZmluZV9kZXZfcHJpbnRrX2xldmVsKGZ1bmMsIGtlcm5fbGV2ZWwpCQlcCitpbnQgZnVuYyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQlcCit7CQkJCQkJCQlcCisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CQkJCQlcCisJdmFfbGlzdCBhcmdzOwkJCQkJCVwKKwlpbnQgcjsJCQkJCQkJXAorCQkJCQkJCQlcCisJdmFfc3RhcnQoYXJncywgZm10KTsJCQkJCVwKKwkJCQkJCQkJXAorCXZhZi5mbXQgPSBmbXQ7CQkJCQkJXAorCXZhZi52YSA9ICZhcmdzOwkJCQkJCVwKKwkJCQkJCQkJXAorCXIgPSBfX2Rldl9wcmludGsoa2Vybl9sZXZlbCwgZGV2LCAmdmFmKTsJCVwKKwl2YV9lbmQoYXJncyk7CQkJCQkJXAorCQkJCQkJCQlcCisJcmV0dXJuIHI7CQkJCQkJXAorfQkJCQkJCQkJXAorRVhQT1JUX1NZTUJPTChmdW5jKTsKKworZGVmaW5lX2Rldl9wcmludGtfbGV2ZWwoZGV2X2VtZXJnLCBLRVJOX0VNRVJHKTsKK2RlZmluZV9kZXZfcHJpbnRrX2xldmVsKGRldl9hbGVydCwgS0VSTl9BTEVSVCk7CitkZWZpbmVfZGV2X3ByaW50a19sZXZlbChkZXZfY3JpdCwgS0VSTl9DUklUKTsKK2RlZmluZV9kZXZfcHJpbnRrX2xldmVsKGRldl9lcnIsIEtFUk5fRVJSKTsKK2RlZmluZV9kZXZfcHJpbnRrX2xldmVsKGRldl93YXJuLCBLRVJOX1dBUk5JTkcpOworZGVmaW5lX2Rldl9wcmludGtfbGV2ZWwoZGV2X25vdGljZSwgS0VSTl9OT1RJQ0UpOworZGVmaW5lX2Rldl9wcmludGtfbGV2ZWwoX2Rldl9pbmZvLCBLRVJOX0lORk8pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggNTAzYzI2Mi4uZGE1N2VlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKKysrIGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTUxLDYgKzUxLDEwIEBACiB7CiAJaW50IHJldDsKIAorCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0JJTkRfRFJJVkVSLCBkZXYpOworCiAJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+ZHJpdmVyLT5wLT5rb2JqLCAmZGV2LT5rb2JqLAogCQkJICBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOwogCWlmIChyZXQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jIGIvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jCmluZGV4IGQ0ZDhjZTUuLmYzNjllMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKQEAgLTgsNyArOCw3IEBACiAKIHN0cnVjdCBkbWFfY29oZXJlbnRfbWVtIHsKIAl2b2lkCQkqdmlydF9iYXNlOwotCXUzMgkJZGV2aWNlX2Jhc2U7CisJZG1hX2FkZHJfdAlkZXZpY2VfYmFzZTsKIAlpbnQJCXNpemU7CiAJaW50CQlmbGFnczsKIAl1bnNpZ25lZCBsb25nCSpiaXRtYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDNmMDkzYjAuLmM4YTQ0ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC04NywyOSArODcsMzIgQEAKIAogc3RydWN0IGZpcm13YXJlX3ByaXYgewogCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Ci0Jc3RydWN0IGJpbl9hdHRyaWJ1dGUgYXR0cl9kYXRhOwogCXN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAlpbnQgbnJfcGFnZXM7CiAJaW50IHBhZ2VfYXJyYXlfc2l6ZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OworCXN0cnVjdCBkZXZpY2UgZGV2OwogCWJvb2wgbm93YWl0OwogCWNoYXIgZndfaWRbXTsKIH07CiAKLXN0YXRpYyB2b2lkCi1md19sb2FkX2Fib3J0KHN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2KQorc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9wcml2ICp0b19maXJtd2FyZV9wcml2KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGZpcm13YXJlX3ByaXYsIGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2xvYWRfYWJvcnQoc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYpCiB7CiAJc2V0X2JpdChGV19TVEFUVVNfQUJPUlQsICZmd19wcml2LT5zdGF0dXMpOwogCXdtYigpOwogCWNvbXBsZXRlKCZmd19wcml2LT5jb21wbGV0aW9uKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLWZpcm13YXJlX3RpbWVvdXRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAotCQkgICAgICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAotCQkgICAgICBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBmaXJtd2FyZV90aW1lb3V0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkgICAgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGxvYWRpbmdfdGltZW91dCk7CiB9CkBAIC0xMjcsMTQgKzEzMCwxNCBAQAogICoKICAqCU5vdGU6IHplcm8gbWVhbnMgJ3dhaXQgZm9yZXZlcicuCiAgKiovCi1zdGF0aWMgc3NpemVfdAotZmlybXdhcmVfdGltZW91dF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAotCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgZmlybXdhcmVfdGltZW91dF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCSAgICAgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJbG9hZGluZ190aW1lb3V0ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAlpZiAobG9hZGluZ190aW1lb3V0IDwgMCkKIAkJbG9hZGluZ190aW1lb3V0ID0gMDsKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTQ2LDIxICsxNDksMjAgQEAKIAogc3RhdGljIHZvaWQgZndfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSB0b19maXJtd2FyZV9wcml2KGRldik7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZndfcHJpdi0+bnJfcGFnZXM7IGkrKykKIAkJX19mcmVlX3BhZ2UoZndfcHJpdi0+cGFnZXNbaV0pOwogCWtmcmVlKGZ3X3ByaXYtPnBhZ2VzKTsKIAlrZnJlZShmd19wcml2KTsKLQlrZnJlZShkZXYpOwogCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiAKIHN0YXRpYyBpbnQgZmlybXdhcmVfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSB0b19maXJtd2FyZV9wcml2KGRldik7CiAKIAlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiRklSTVdBUkU9JXMiLCBmd19wcml2LT5md19pZCkpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTgyLDggKzE4NCw5IEBACiBzdGF0aWMgc3NpemVfdCBmaXJtd2FyZV9sb2FkaW5nX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gdG9fZmlybXdhcmVfcHJpdihkZXYpOwogCWludCBsb2FkaW5nID0gdGVzdF9iaXQoRldfU1RBVFVTX0xPQURJTkcsICZmd19wcml2LT5zdGF0dXMpOworCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGxvYWRpbmcpOwogfQogCkBAIC0yMTksNyArMjIyLDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gdG9fZmlybXdhcmVfcHJpdihkZXYpOwogCWludCBsb2FkaW5nID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAlpbnQgaTsKIApAQCAtMjc3LDEzICsyODAsMTIgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGxvYWRpbmcsIDA2NDQsIGZpcm13YXJlX2xvYWRpbmdfc2hvdywgZmlybXdhcmVfbG9hZGluZ19zdG9yZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1maXJtd2FyZV9kYXRhX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsIGNoYXIgKmJ1ZmZlciwgbG9mZl90IG9mZnNldCwKLQkJICAgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgZmlybXdhcmVfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZmZlciwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKLQlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gdG9fZmlybXdhcmVfcHJpdihkZXYpOwogCXN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJc3NpemVfdCByZXRfY291bnQ7CiAKQEAgLTMyMiw4ICszMjQsNyBAQAogCXJldHVybiByZXRfY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQKLWZ3X3JlYWxsb2NfYnVmZmVyKHN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2LCBpbnQgbWluX3NpemUpCitzdGF0aWMgaW50IGZ3X3JlYWxsb2NfYnVmZmVyKHN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2LCBpbnQgbWluX3NpemUpCiB7CiAJaW50IHBhZ2VzX25lZWRlZCA9IEFMSUdOKG1pbl9zaXplLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CiAKQEAgLTM3MywxMyArMzc0LDEyIEBACiAgKglEYXRhIHdyaXR0ZW4gdG8gdGhlICdkYXRhJyBhdHRyaWJ1dGUgd2lsbCBiZSBsYXRlciBoYW5kZWQgdG8KICAqCXRoZSBkcml2ZXIgYXMgYSBmaXJtd2FyZSBpbWFnZS4KICAqKi8KLXN0YXRpYyBzc2l6ZV90Ci1maXJtd2FyZV9kYXRhX3dyaXRlKHN0cnVjdCBmaWxlKiBmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwgY2hhciAqYnVmZmVyLAotCQkgICAgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgZmlybXdhcmVfZGF0YV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZmZlciwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKLQlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gdG9fZmlybXdhcmVfcHJpdihkZXYpOwogCXN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJc3NpemVfdCByZXR2YWw7CiAKQEAgLTQyMCwxMTYgKzQyMCwxMDMgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZmlybXdhcmVfYXR0cl9kYXRhX3RtcGwgPSB7Ci0JLmF0dHIgPSB7Lm5hbWUgPSAiZGF0YSIsIC5tb2RlID0gMDY0NH0sCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZmlybXdhcmVfYXR0cl9kYXRhID0geworCS5hdHRyID0geyAubmFtZSA9ICJkYXRhIiwgLm1vZGUgPSAwNjQ0IH0sCiAJLnNpemUgPSAwLAogCS5yZWFkID0gZmlybXdhcmVfZGF0YV9yZWFkLAogCS53cml0ZSA9IGZpcm13YXJlX2RhdGFfd3JpdGUsCiB9OwogCi1zdGF0aWMgdm9pZAotZmlybXdhcmVfY2xhc3NfdGltZW91dCh1X2xvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGZpcm13YXJlX2NsYXNzX3RpbWVvdXQodV9sb25nIGRhdGEpCiB7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSAoc3RydWN0IGZpcm13YXJlX3ByaXYgKikgZGF0YTsKKwogCWZ3X2xvYWRfYWJvcnQoZndfcHJpdik7CiB9CiAKLXN0YXRpYyBpbnQgZndfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKipkZXZfcCwgY29uc3QgY2hhciAqZndfbmFtZSwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqCitmd19jcmVhdGVfaW5zdGFuY2Uoc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSwgY29uc3QgY2hhciAqZndfbmFtZSwKKwkJICAgc3RydWN0IGRldmljZSAqZGV2aWNlLCBib29sIHVldmVudCwgYm9vbCBub3dhaXQpCiB7Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9Ci0JCWt6YWxsb2Moc2l6ZW9mKCpmd19wcml2KSArIHN0cmxlbihmd19uYW1lKSArIDEgLCBHRlBfS0VSTkVMKTsKLQlzdHJ1Y3QgZGV2aWNlICpmX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpmX2RldiksIEdGUF9LRVJORUwpOworCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OworCXN0cnVjdCBkZXZpY2UgKmZfZGV2OworCWludCBlcnJvcjsKIAotCSpkZXZfcCA9IE5VTEw7Ci0KLQlpZiAoIWZ3X3ByaXYgfHwgIWZfZGV2KSB7CisJZndfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpmd19wcml2KSArIHN0cmxlbihmd19uYW1lKSArIDEgLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X3ByaXYpIHsKIAkJZGV2X2VycihkZXZpY2UsICIlczoga21hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9rZnJlZTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJZndfcHJpdi0+ZncgPSBmaXJtd2FyZTsKKwlmd19wcml2LT5ub3dhaXQgPSBub3dhaXQ7CiAJc3RyY3B5KGZ3X3ByaXYtPmZ3X2lkLCBmd19uYW1lKTsKIAlpbml0X2NvbXBsZXRpb24oJmZ3X3ByaXYtPmNvbXBsZXRpb24pOwotCWZ3X3ByaXYtPmF0dHJfZGF0YSA9IGZpcm13YXJlX2F0dHJfZGF0YV90bXBsOwotCWZ3X3ByaXYtPnRpbWVvdXQuZnVuY3Rpb24gPSBmaXJtd2FyZV9jbGFzc190aW1lb3V0OwotCWZ3X3ByaXYtPnRpbWVvdXQuZGF0YSA9ICh1X2xvbmcpIGZ3X3ByaXY7Ci0JaW5pdF90aW1lcigmZndfcHJpdi0+dGltZW91dCk7CisJc2V0dXBfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQsCisJCSAgICBmaXJtd2FyZV9jbGFzc190aW1lb3V0LCAodV9sb25nKSBmd19wcml2KTsKIAorCWZfZGV2ID0gJmZ3X3ByaXYtPmRldjsKKworCWRldmljZV9pbml0aWFsaXplKGZfZGV2KTsKIAlkZXZfc2V0X25hbWUoZl9kZXYsICIlcyIsIGRldl9uYW1lKGRldmljZSkpOwogCWZfZGV2LT5wYXJlbnQgPSBkZXZpY2U7CiAJZl9kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOwotCWRldl9zZXRfZHJ2ZGF0YShmX2RldiwgZndfcHJpdik7Ci0JZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoZl9kZXYsIDEpOwotCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcihmX2Rldik7Ci0JaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKGRldmljZSwgIiVzOiBkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXB1dF9kZXZpY2UoZl9kZXYpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQkqZGV2X3AgPSBmX2RldjsKLQlyZXR1cm4gMDsKIAotZXJyb3Jfa2ZyZWU6Ci0Ja2ZyZWUoZl9kZXYpOwotCWtmcmVlKGZ3X3ByaXYpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgZndfc2V0dXBfZGV2aWNlKHN0cnVjdCBmaXJtd2FyZSAqZncsIHN0cnVjdCBkZXZpY2UgKipkZXZfcCwKLQkJCSAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJCSAgIGludCB1ZXZlbnQsIGJvb2wgbm93YWl0KQotewotCXN0cnVjdCBkZXZpY2UgKmZfZGV2OwotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OwotCWludCByZXR2YWw7Ci0KLQkqZGV2X3AgPSBOVUxMOwotCXJldHZhbCA9IGZ3X3JlZ2lzdGVyX2RldmljZSgmZl9kZXYsIGZ3X25hbWUsIGRldmljZSk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBvdXQ7CisJZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoZl9kZXYsIHRydWUpOwogCiAJLyogTmVlZCB0byBwaW4gdGhpcyBtb2R1bGUgdW50aWwgY2xhc3MgZGV2aWNlIGlzIGRlc3Ryb3llZCAqLwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAKLQlmd19wcml2ID0gZGV2X2dldF9kcnZkYXRhKGZfZGV2KTsKLQotCWZ3X3ByaXYtPm5vd2FpdCA9IG5vd2FpdDsKLQotCWZ3X3ByaXYtPmZ3ID0gZnc7Ci0Jc3lzZnNfYmluX2F0dHJfaW5pdCgmZndfcHJpdi0+YXR0cl9kYXRhKTsKLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmZfZGV2LT5rb2JqLCAmZndfcHJpdi0+YXR0cl9kYXRhKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoZGV2aWNlLCAiJXM6IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJvcl91bnJlZzsKKwllcnJvciA9IGRldmljZV9hZGQoZl9kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKGRldmljZSwgIiVzOiBkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3B1dF9kZXY7CiAJfQogCi0JcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZfZGV2LCAmZGV2X2F0dHJfbG9hZGluZyk7Ci0JaWYgKHJldHZhbCkgeworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShmX2RldiwgJmZpcm13YXJlX2F0dHJfZGF0YSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoZGV2aWNlLCAiJXM6IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZGVsX2RldjsKKwl9CisKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShmX2RldiwgJmRldl9hdHRyX2xvYWRpbmcpOworCWlmIChlcnJvcikgewogCQlkZXZfZXJyKGRldmljZSwgIiVzOiBkZXZpY2VfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyb3JfdW5yZWc7CisJCWdvdG8gZXJyX2RlbF9iaW5fYXR0cjsKIAl9CiAKIAlpZiAodWV2ZW50KQotCQlkZXZfc2V0X3VldmVudF9zdXBwcmVzcyhmX2RldiwgMCk7Ci0JKmRldl9wID0gZl9kZXY7Ci0JZ290byBvdXQ7CisJCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKGZfZGV2LCBmYWxzZSk7CiAKLWVycm9yX3VucmVnOgotCWRldmljZV91bnJlZ2lzdGVyKGZfZGV2KTsKLW91dDoKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBmd19wcml2OworCitlcnJfZGVsX2Jpbl9hdHRyOgorCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoZl9kZXYsICZmaXJtd2FyZV9hdHRyX2RhdGEpOworZXJyX2RlbF9kZXY6CisJZGV2aWNlX2RlbChmX2Rldik7CitlcnJfcHV0X2RldjoKKwlwdXRfZGV2aWNlKGZfZGV2KTsKK2Vycl9vdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQogCi1zdGF0aWMgaW50Ci1fcmVxdWVzdF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmaXJtd2FyZV9wLCBjb25zdCBjaGFyICpuYW1lLAotCQkgc3RydWN0IGRldmljZSAqZGV2aWNlLCBpbnQgdWV2ZW50LCBib29sIG5vd2FpdCkKK3N0YXRpYyB2b2lkIGZ3X2Rlc3Ryb3lfaW5zdGFuY2Uoc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYpCiB7Ci0Jc3RydWN0IGRldmljZSAqZl9kZXY7CisJc3RydWN0IGRldmljZSAqZl9kZXYgPSAmZndfcHJpdi0+ZGV2OworCisJZGV2aWNlX3JlbW92ZV9maWxlKGZfZGV2LCAmZGV2X2F0dHJfbG9hZGluZyk7CisJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShmX2RldiwgJmZpcm13YXJlX2F0dHJfZGF0YSk7CisJZGV2aWNlX3VucmVnaXN0ZXIoZl9kZXYpOworfQorCitzdGF0aWMgaW50IF9yZXF1ZXN0X2Zpcm13YXJlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZpcm13YXJlX3AsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICAgYm9vbCB1ZXZlbnQsIGJvb2wgbm93YWl0KQorewogCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OwogCXN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsID0gMDsKIAogCWlmICghZmlybXdhcmVfcCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01NTAsNDEgKzUzNyw0MCBAQAogCWlmICh1ZXZlbnQpCiAJCWRldl9kYmcoZGV2aWNlLCAiZmlybXdhcmU6IHJlcXVlc3RpbmcgJXNcbiIsIG5hbWUpOwogCi0JcmV0dmFsID0gZndfc2V0dXBfZGV2aWNlKGZpcm13YXJlLCAmZl9kZXYsIG5hbWUsIGRldmljZSwKLQkJCQkgdWV2ZW50LCBub3dhaXQpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyb3Jfa2ZyZWVfZnc7Ci0KLQlmd19wcml2ID0gZGV2X2dldF9kcnZkYXRhKGZfZGV2KTsKKwlmd19wcml2ID0gZndfY3JlYXRlX2luc3RhbmNlKGZpcm13YXJlLCBuYW1lLCBkZXZpY2UsIHVldmVudCwgbm93YWl0KTsKKwlpZiAoSVNfRVJSKGZ3X3ByaXYpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoZndfcHJpdik7CisJCWdvdG8gb3V0OworCX0KIAogCWlmICh1ZXZlbnQpIHsKLQkJaWYgKGxvYWRpbmdfdGltZW91dCA+IDApIHsKLQkJCWZ3X3ByaXYtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBsb2FkaW5nX3RpbWVvdXQgKiBIWjsKLQkJCWFkZF90aW1lcigmZndfcHJpdi0+dGltZW91dCk7Ci0JCX0KKwkJaWYgKGxvYWRpbmdfdGltZW91dCA+IDApCisJCQltb2RfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQsCisJCQkJICByb3VuZF9qaWZmaWVzX3VwKGppZmZpZXMgKworCQkJCQkJICAgbG9hZGluZ190aW1lb3V0ICogSFopKTsKIAotCQlrb2JqZWN0X3VldmVudCgmZl9kZXYtPmtvYmosIEtPQkpfQUREKTsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmZndfcHJpdi0+Y29tcGxldGlvbik7Ci0JCXNldF9iaXQoRldfU1RBVFVTX0RPTkUsICZmd19wcml2LT5zdGF0dXMpOwotCQlkZWxfdGltZXJfc3luYygmZndfcHJpdi0+dGltZW91dCk7Ci0JfSBlbHNlCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZ3X3ByaXYtPmNvbXBsZXRpb24pOworCQlrb2JqZWN0X3VldmVudCgmZndfcHJpdi0+ZGV2LmtvYmosIEtPQkpfQUREKTsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmd19wcml2LT5jb21wbGV0aW9uKTsKKworCXNldF9iaXQoRldfU1RBVFVTX0RPTkUsICZmd19wcml2LT5zdGF0dXMpOworCWRlbF90aW1lcl9zeW5jKCZmd19wcml2LT50aW1lb3V0KTsKIAogCW11dGV4X2xvY2soJmZ3X2xvY2spOwotCWlmICghZndfcHJpdi0+ZnctPnNpemUgfHwgdGVzdF9iaXQoRldfU1RBVFVTX0FCT1JULCAmZndfcHJpdi0+c3RhdHVzKSkgeworCWlmICghZndfcHJpdi0+ZnctPnNpemUgfHwgdGVzdF9iaXQoRldfU1RBVFVTX0FCT1JULCAmZndfcHJpdi0+c3RhdHVzKSkKIAkJcmV0dmFsID0gLUVOT0VOVDsKLQkJcmVsZWFzZV9maXJtd2FyZShmd19wcml2LT5mdyk7Ci0JCSpmaXJtd2FyZV9wID0gTlVMTDsKLQl9CiAJZndfcHJpdi0+ZncgPSBOVUxMOwogCW11dGV4X3VubG9jaygmZndfbG9jayk7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoZl9kZXYpOwotCWdvdG8gb3V0OwogCi1lcnJvcl9rZnJlZV9mdzoKLQlrZnJlZShmaXJtd2FyZSk7Ci0JKmZpcm13YXJlX3AgPSBOVUxMOworCWZ3X2Rlc3Ryb3lfaW5zdGFuY2UoZndfcHJpdik7CisKIG91dDoKKwlpZiAocmV0dmFsKSB7CisJCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCQlmaXJtd2FyZV9wID0gTlVMTDsKKwl9CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC02MzUsMjMgKzYyMSwyNCBAQAogCWludCB1ZXZlbnQ7CiB9OwogCi1zdGF0aWMgaW50Ci1yZXF1ZXN0X2Zpcm13YXJlX3dvcmtfZnVuYyh2b2lkICphcmcpCitzdGF0aWMgaW50IHJlcXVlc3RfZmlybXdhcmVfd29ya19mdW5jKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZmlybXdhcmVfd29yayAqZndfd29yayA9IGFyZzsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCByZXQ7CisKIAlpZiAoIWFyZykgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gMDsKIAl9Ci0JcmV0ID0gX3JlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd193b3JrLT5uYW1lLCBmd193b3JrLT5kZXZpY2UsCi0JCWZ3X3dvcmstPnVldmVudCwgdHJ1ZSk7CiAKKwlyZXQgPSBfcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X3dvcmstPm5hbWUsIGZ3X3dvcmstPmRldmljZSwKKwkJCQlmd193b3JrLT51ZXZlbnQsIHRydWUpOwogCWZ3X3dvcmstPmNvbnQoZncsIGZ3X3dvcmstPmNvbnRleHQpOwogCiAJbW9kdWxlX3B1dChmd193b3JrLT5tb2R1bGUpOwogCWtmcmVlKGZ3X3dvcmspOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjc5LDM0ICs2NjYsMzMgQEAKIAl2b2lkICgqY29udCkoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXN0cnVjdCBmaXJtd2FyZV93b3JrICpmd193b3JrID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBmaXJtd2FyZV93b3JrKSwKLQkJCQkJCWdmcCk7CisJc3RydWN0IGZpcm13YXJlX3dvcmsgKmZ3X3dvcms7CiAKKwlmd193b3JrID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCBmaXJtd2FyZV93b3JrKSwgZ2ZwKTsKIAlpZiAoIWZ3X3dvcmspCiAJCXJldHVybiAtRU5PTUVNOworCisJZndfd29yay0+bW9kdWxlID0gbW9kdWxlOworCWZ3X3dvcmstPm5hbWUgPSBuYW1lOworCWZ3X3dvcmstPmRldmljZSA9IGRldmljZTsKKwlmd193b3JrLT5jb250ZXh0ID0gY29udGV4dDsKKwlmd193b3JrLT5jb250ID0gY29udDsKKwlmd193b3JrLT51ZXZlbnQgPSB1ZXZlbnQ7CisKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KG1vZHVsZSkpIHsKIAkJa2ZyZWUoZndfd29yayk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCSpmd193b3JrID0gKHN0cnVjdCBmaXJtd2FyZV93b3JrKSB7Ci0JCS5tb2R1bGUgPSBtb2R1bGUsCi0JCS5uYW1lID0gbmFtZSwKLQkJLmRldmljZSA9IGRldmljZSwKLQkJLmNvbnRleHQgPSBjb250ZXh0LAotCQkuY29udCA9IGNvbnQsCi0JCS51ZXZlbnQgPSB1ZXZlbnQsCi0JfTsKLQogCXRhc2sgPSBrdGhyZWFkX3J1bihyZXF1ZXN0X2Zpcm13YXJlX3dvcmtfZnVuYywgZndfd29yaywKIAkJCSAgICAiZmlybXdhcmUvJXMiLCBuYW1lKTsKLQogCWlmIChJU19FUlIodGFzaykpIHsKIAkJZndfd29yay0+Y29udChOVUxMLCBmd193b3JrLT5jb250ZXh0KTsKIAkJbW9kdWxlX3B1dChmd193b3JrLT5tb2R1bGUpOwogCQlrZnJlZShmd193b3JrKTsKIAkJcmV0dXJuIFBUUl9FUlIodGFzayk7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggNGQ5OWM4Yi4uYzZjOTMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgpAQCAtMTkxLDEzICsxOTIsMTMgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKLQlyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIG51bSwgR0ZQX0tFUk5FTCk7CisJciA9IGttZW1kdXAocmVzLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIG51bSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHIpIHsKLQkJbWVtY3B5KHIsIHJlcywgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiBudW0pOwogCQlwZGV2LT5yZXNvdXJjZSA9IHI7CiAJCXBkZXYtPm51bV9yZXNvdXJjZXMgPSBudW07CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gciA/IDAgOiAtRU5PTUVNOworCXJldHVybiAtRU5PTUVNOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMpOwogCkBAIC0zNDQsMTA4ICszNDUsNTYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKTsKIAogLyoqCi0gKiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlIC0gYWRkIGEgcGxhdGZvcm0tbGV2ZWwgZGV2aWNlIGFuZCBpdHMgcmVzb3VyY2VzCisgKiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEgLSBhZGQgYSBwbGF0Zm9ybS1sZXZlbCBkZXZpY2Ugd2l0aAorICogcmVzb3VyY2VzIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBkYXRhCisgKgorICogQHBhcmVudDogcGFyZW50IGRldmljZSBmb3IgdGhlIGRldmljZSB3ZSdyZSBhZGRpbmcKICAqIEBuYW1lOiBiYXNlIG5hbWUgb2YgdGhlIGRldmljZSB3ZSdyZSBhZGRpbmcKICAqIEBpZDogaW5zdGFuY2UgaWQKICAqIEByZXM6IHNldCBvZiByZXNvdXJjZXMgdGhhdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBkZXZpY2UKICAqIEBudW06IG51bWJlciBvZiByZXNvdXJjZXMKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzaW1wbGUgcGxhdGZvcm0gZGV2aWNlIHRoYXQgcmVxdWlyZXMgbWluaW1hbAotICogcmVzb3VyY2UgYW5kIG1lbW9yeSBtYW5hZ2VtZW50LiBDYW5uZWQgcmVsZWFzZSBmdW5jdGlvbiBmcmVlaW5nIG1lbW9yeQotICogYWxsb2NhdGVkIGZvciB0aGUgZGV2aWNlIGFsbG93cyBkcml2ZXJzIHVzaW5nIHN1Y2ggZGV2aWNlcyB0byBiZQotICogdW5sb2FkZWQgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGRldmljZSB0byBiZQotICogZHJvcHBlZC4KLSAqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGxlZ2FjeSBkcml2ZXJzIHdoaWNoCi0gKiBwcm9iZSBoYXJkd2FyZSBkaXJlY3RseS4gIEJlY2F1c2Ugc3VjaCBkcml2ZXJzIGNyZWF0ZSBzeXNmcyBkZXZpY2Ugbm9kZXMKLSAqIHRoZW1zZWx2ZXMsIHJhdGhlciB0aGFuIGxldHRpbmcgc3lzdGVtIGluZnJhc3RydWN0dXJlIGhhbmRsZSBzdWNoIGRldmljZQotICogZW51bWVyYXRpb24gdGFza3MsIHRoZXkgZG9uJ3QgZnVsbHkgY29uZm9ybSB0byB0aGUgTGludXggZHJpdmVyIG1vZGVsLgotICogSW4gcGFydGljdWxhciwgd2hlbiBzdWNoIGRyaXZlcnMgYXJlIGJ1aWx0IGFzIG1vZHVsZXMsIHRoZXkgY2FuJ3QgYmUKLSAqICJob3RwbHVnZ2VkIi4KLSAqCi0gKiBSZXR1cm5zICZzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvaW50ZXIgb24gc3VjY2Vzcywgb3IgRVJSX1BUUigpIG9uIGVycm9yLgotICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCQkJaW50IGlkLAotCQkJCQkJCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCQkJCXVuc2lnbmVkIGludCBudW0pCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlpbnQgcmV0dmFsOwotCi0JcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhuYW1lLCBpZCk7Ci0JaWYgKCFwZGV2KSB7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaWYgKG51bSkgewotCQlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByZXMsIG51bSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcjsKLQotCXJldHVybiBwZGV2OwotCi1lcnJvcjoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCXJldHVybiBFUlJfUFRSKHJldHZhbCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKTsKLQotLyoqCi0gKiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YSAtIGFkZCBhIHBsYXRmb3JtLWxldmVsIGRldmljZSB3aXRoIHBsYXRmb3JtLXNwZWNpZmljIGRhdGEKLSAqIEBwYXJlbnQ6IHBhcmVudCBkZXZpY2UgZm9yIHRoZSBkZXZpY2Ugd2UncmUgYWRkaW5nCi0gKiBAbmFtZTogYmFzZSBuYW1lIG9mIHRoZSBkZXZpY2Ugd2UncmUgYWRkaW5nCi0gKiBAaWQ6IGluc3RhbmNlIGlkCiAgKiBAZGF0YTogcGxhdGZvcm0gc3BlY2lmaWMgZGF0YSBmb3IgdGhpcyBwbGF0Zm9ybSBkZXZpY2UKICAqIEBzaXplOiBzaXplIG9mIHBsYXRmb3JtIHNwZWNpZmljIGRhdGEKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzaW1wbGUgcGxhdGZvcm0gZGV2aWNlIHRoYXQgcmVxdWlyZXMgbWluaW1hbAotICogcmVzb3VyY2UgYW5kIG1lbW9yeSBtYW5hZ2VtZW50LiBDYW5uZWQgcmVsZWFzZSBmdW5jdGlvbiBmcmVlaW5nIG1lbW9yeQotICogYWxsb2NhdGVkIGZvciB0aGUgZGV2aWNlIGFsbG93cyBkcml2ZXJzIHVzaW5nIHN1Y2ggZGV2aWNlcyB0byBiZQotICogdW5sb2FkZWQgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGRldmljZSB0byBiZQotICogZHJvcHBlZC4KLSAqCiAgKiBSZXR1cm5zICZzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvaW50ZXIgb24gc3VjY2Vzcywgb3IgRVJSX1BUUigpIG9uIGVycm9yLgogICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YSgKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdF9vcl9tb2R1bGUgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKAogCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKKwkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW0sCiAJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQogeworCWludCByZXQgPSAtRU5PTUVNOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0JaW50IHJldHZhbDsKIAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MobmFtZSwgaWQpOwotCWlmICghcGRldikgewotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KKwlpZiAoIXBkZXYpCisJCWdvdG8gZXJyOwogCiAJcGRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKIAotCWlmIChzaXplKSB7Ci0JCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBkYXRhLCBzaXplKTsKLQkJaWYgKHJldHZhbCkKLQkJCWdvdG8gZXJyb3I7CisJaWYgKHJlcykgeworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByZXMsIG51bSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKIAl9CiAKLQlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyb3I7CisJaWYgKGRhdGEpIHsKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIGRhdGEsIHNpemUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKKwlpZiAocmV0KSB7CitlcnI6CisJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQogCiAJcmV0dXJuIHBkZXY7Ci0KLWVycm9yOgotCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSk7CiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7CkBAIC02MzUsNiArNTg0LDEyIEBACiBzdGF0aWMgaW50IHBsYXRmb3JtX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJaW50IHJjOworCisJLyogU29tZSBkZXZpY2VzIGhhdmUgZXh0cmEgT0YgZGF0YSBhbmQgYW4gT0Ytc3R5bGUgTU9EQUxJQVMgKi8KKwlyYyA9IG9mX2RldmljZV91ZXZlbnQoZGV2LGVudik7CisJaWYgKHJjICE9IC1FTk9ERVYpCisJCXJldHVybiByYzsKIAogCWFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSVzJXMiLCBQTEFURk9STV9NT0RVTEVfUFJFRklYLAogCQkocGRldi0+aWRfZW50cnkpID8gcGRldi0+aWRfZW50cnktPm5hbWUgOiBwZGV2LT5uYW1lKTsKQEAgLTY3Myw3ICs2MjgsMTEgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkcnYpOwogCi0JLyogbWF0Y2ggYWdhaW5zdCB0aGUgaWQgdGFibGUgZmlyc3QgKi8KKwkvKiBBdHRlbXB0IGFuIE9GIHN0eWxlIG1hdGNoIGZpcnN0ICovCisJaWYgKG9mX2RyaXZlcl9tYXRjaF9kZXZpY2UoZGV2LCBkcnYpKQorCQlyZXR1cm4gMTsKKworCS8qIFRoZW4gdHJ5IHRvIG1hdGNoIGFnYWluc3QgdGhlIGlkIHRhYmxlICovCiAJaWYgKHBkcnYtPmlkX3RhYmxlKQogCQlyZXR1cm4gcGxhdGZvcm1fbWF0Y2hfaWQocGRydi0+aWRfdGFibGUsIHBkZXYpICE9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZQppbmRleCA4OWRlNzUzLi5jYmNjZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLSQoQ09ORklHX1BNKQkrPSBzeXNmcy5vCi1vYmotJChDT05GSUdfUE1fU0xFRVApCSs9IG1haW4ubworb2JqLSQoQ09ORklHX1BNX1NMRUVQKQkrPSBtYWluLm8gd2FrZXVwLm8KIG9iai0kKENPTkZJR19QTV9SVU5USU1FKQkrPSBydW50aW1lLm8KIG9iai0kKENPTkZJR19QTV9PUFMpCSs9IGdlbmVyaWNfb3BzLm8KIG9iai0kKENPTkZJR19QTV9UUkFDRV9SVEMpCSs9IHRyYWNlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCmluZGV4IDk0MWZjYjguLjU0MTlhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwpAQCAtNTksNiArNTksNyBAQAogewogCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09OOwogCWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKKwlkZXYtPnBvd2VyLndha2V1cF9jb3VudCA9IDA7CiAJcG1fcnVudGltZV9pbml0KGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCmluZGV4IGIwZWMwZTkuLmI3OGM0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwpAQCAtMTIzLDYgKzEyMyw0NSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1fcnVudGltZV9pZGxlKTsKIAorCisvKioKKyAqIHVwZGF0ZV9wbV9ydW50aW1lX2FjY291bnRpbmcgLSBVcGRhdGUgdGhlIHRpbWUgYWNjb3VudGluZyBvZiBwb3dlciBzdGF0ZXMKKyAqIEBkZXY6IERldmljZSB0byB1cGRhdGUgdGhlIGFjY291bnRpbmcgZm9yCisgKgorICogSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBoYXZlIHRpbWUgYWNjb3VudGluZyBvZiB0aGUgdmFyaW91cyBwb3dlciBzdGF0ZXMKKyAqIChhcyB1c2VkIGJ5IHByb2dyYW1zIHN1Y2ggYXMgUG93ZXJUT1AgdG8gc2hvdyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBydW50aW1lCisgKiBQTSksIHdlIG5lZWQgdG8gdHJhY2sgdGhlIHRpbWUgc3BlbnQgaW4gZWFjaCBzdGF0ZS4KKyAqIHVwZGF0ZV9wbV9ydW50aW1lX2FjY291bnRpbmcgbXVzdCBiZSBjYWxsZWQgZWFjaCB0aW1lIGJlZm9yZSB0aGUKKyAqIHJ1bnRpbWVfc3RhdHVzIGZpZWxkIGlzIHVwZGF0ZWQsIHRvIGFjY291bnQgdGhlIHRpbWUgaW4gdGhlIG9sZCBzdGF0ZQorICogY29ycmVjdGx5LgorICovCit2b2lkIHVwZGF0ZV9wbV9ydW50aW1lX2FjY291bnRpbmcoc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgZGVsdGE7CisKKwlkZWx0YSA9IG5vdyAtIGRldi0+cG93ZXIuYWNjb3VudGluZ190aW1lc3RhbXA7CisKKwlpZiAoZGVsdGEgPCAwKQorCQlkZWx0YSA9IDA7CisKKwlkZXYtPnBvd2VyLmFjY291bnRpbmdfdGltZXN0YW1wID0gbm93OworCisJaWYgKGRldi0+cG93ZXIuZGlzYWJsZV9kZXB0aCA+IDApCisJCXJldHVybjsKKworCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzID09IFJQTV9TVVNQRU5ERUQpCisJCWRldi0+cG93ZXIuc3VzcGVuZGVkX2ppZmZpZXMgKz0gZGVsdGE7CisJZWxzZQorCQlkZXYtPnBvd2VyLmFjdGl2ZV9qaWZmaWVzICs9IGRlbHRhOworfQorCitzdGF0aWMgdm9pZCBfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gcnBtX3N0YXR1cyBzdGF0dXMpCit7CisJdXBkYXRlX3BtX3J1bnRpbWVfYWNjb3VudGluZyhkZXYpOworCWRldi0+cG93ZXIucnVudGltZV9zdGF0dXMgPSBzdGF0dXM7Cit9CisKIC8qKgogICogX19wbV9ydW50aW1lX3N1c3BlbmQgLSBDYXJyeSBvdXQgcnVuLXRpbWUgc3VzcGVuZCBvZiBnaXZlbiBkZXZpY2UuCiAgKiBAZGV2OiBEZXZpY2UgdG8gc3VzcGVuZC4KQEAgLTE5Nyw3ICsyMzYsNyBAQAogCQlnb3RvIHJlcGVhdDsKIAl9CiAKLQlkZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzID0gUlBNX1NVU1BFTkRJTkc7CisJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fU1VTUEVORElORyk7CiAJZGV2LT5wb3dlci5kZWZlcnJlZF9yZXN1bWUgPSBmYWxzZTsKIAogCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5ydW50aW1lX3N1c3BlbmQpIHsKQEAgLTIyOCw3ICsyNjcsNyBAQAogCX0KIAogCWlmIChyZXR2YWwpIHsKLQkJZGV2LT5wb3dlci5ydW50aW1lX3N0YXR1cyA9IFJQTV9BQ1RJVkU7CisJCV9fdXBkYXRlX3J1bnRpbWVfc3RhdHVzKGRldiwgUlBNX0FDVElWRSk7CiAJCWlmIChyZXR2YWwgPT0gLUVBR0FJTiB8fCByZXR2YWwgPT0gLUVCVVNZKSB7CiAJCQlpZiAoZGV2LT5wb3dlci50aW1lcl9leHBpcmVzID09IDApCiAJCQkJbm90aWZ5ID0gdHJ1ZTsKQEAgLTIzNyw3ICsyNzYsNyBAQAogCQkJcG1fcnVudGltZV9jYW5jZWxfcGVuZGluZyhkZXYpOwogCQl9CiAJfSBlbHNlIHsKLQkJZGV2LT5wb3dlci5ydW50aW1lX3N0YXR1cyA9IFJQTV9TVVNQRU5ERUQ7CisJCV9fdXBkYXRlX3J1bnRpbWVfc3RhdHVzKGRldiwgUlBNX1NVU1BFTkRFRCk7CiAJCXBtX3J1bnRpbWVfZGVhY3RpdmF0ZV90aW1lcihkZXYpOwogCiAJCWlmIChkZXYtPnBhcmVudCkgewpAQCAtMzgxLDcgKzQyMCw3IEBACiAJCWdvdG8gcmVwZWF0OwogCX0KIAotCWRldi0+cG93ZXIucnVudGltZV9zdGF0dXMgPSBSUE1fUkVTVU1JTkc7CisJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fUkVTVU1JTkcpOwogCiAJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5wbSAmJiBkZXYtPmJ1cy0+cG0tPnJ1bnRpbWVfcmVzdW1lKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKQEAgLTQxMSwxMCArNDUwLDEwIEBACiAJfQogCiAJaWYgKHJldHZhbCkgewotCQlkZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzID0gUlBNX1NVU1BFTkRFRDsKKwkJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fU1VTUEVOREVEKTsKIAkJcG1fcnVudGltZV9jYW5jZWxfcGVuZGluZyhkZXYpOwogCX0gZWxzZSB7Ci0JCWRldi0+cG93ZXIucnVudGltZV9zdGF0dXMgPSBSUE1fQUNUSVZFOworCQlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9BQ1RJVkUpOwogCQlpZiAocGFyZW50KQogCQkJYXRvbWljX2luYygmcGFyZW50LT5wb3dlci5jaGlsZF9jb3VudCk7CiAJfQpAQCAtODQ4LDcgKzg4Nyw3IEBACiAJfQogCiAgb3V0X3NldDoKLQlkZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzID0gc3RhdHVzOworCV9fdXBkYXRlX3J1bnRpbWVfc3RhdHVzKGRldiwgc3RhdHVzKTsKIAlkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IgPSAwOwogIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnBvd2VyLmxvY2ssIGZsYWdzKTsKQEAgLTEwNzcsNiArMTExNiw3IEBACiAJZGV2LT5wb3dlci5yZXF1ZXN0X3BlbmRpbmcgPSBmYWxzZTsKIAlkZXYtPnBvd2VyLnJlcXVlc3QgPSBSUE1fUkVRX05PTkU7CiAJZGV2LT5wb3dlci5kZWZlcnJlZF9yZXN1bWUgPSBmYWxzZTsKKwlkZXYtPnBvd2VyLmFjY291bnRpbmdfdGltZXN0YW1wID0gamlmZmllczsKIAlJTklUX1dPUksoJmRldi0+cG93ZXIud29yaywgcG1fcnVudGltZV93b3JrKTsKIAogCWRldi0+cG93ZXIudGltZXJfZXhwaXJlcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCmluZGV4IGE0YzMzYmMuLmU1NmI0MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgInBvd2VyLmgiCiAKIC8qCkBAIC03Myw2ICs3NCw4IEBACiAgKglkZXZpY2UgYXJlIGtub3duIHRvIHRoZSBQTSBjb3JlLiAgSG93ZXZlciwgZm9yIHNvbWUgZGV2aWNlcyB0aGlzCiAgKglhdHRyaWJ1dGUgaXMgc2V0IHRvICJlbmFibGVkIiBieSBidXMgdHlwZSBjb2RlIG9yIGRldmljZSBkcml2ZXJzIGFuZCBpbgogICoJdGhhdCBjYXNlcyBpdCBzaG91bGQgYmUgc2FmZSB0byBsZWF2ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAqCisgKgl3YWtldXBfY291bnQgLSBSZXBvcnQgdGhlIG51bWJlciBvZiB3YWtldXAgZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGRldmljZQogICovCiAKIHN0YXRpYyBjb25zdCBjaGFyIGVuYWJsZWRbXSA9ICJlbmFibGVkIjsKQEAgLTEwOCw2ICsxMTEsNjUgQEAKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKGNvbnRyb2wsIDA2NDQsIGNvbnRyb2xfc2hvdywgY29udHJvbF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHJ0cG1fYWN0aXZlX3RpbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJdXBkYXRlX3BtX3J1bnRpbWVfYWNjb3VudGluZyhkZXYpOworCXJldCA9IHNwcmludGYoYnVmLCAiJWlcbiIsIGppZmZpZXNfdG9fbXNlY3MoZGV2LT5wb3dlci5hY3RpdmVfamlmZmllcykpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocnVudGltZV9hY3RpdmVfdGltZSwgMDQ0NCwgcnRwbV9hY3RpdmVfdGltZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgcnRwbV9zdXNwZW5kZWRfdGltZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJc3Bpbl9sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKKwl1cGRhdGVfcG1fcnVudGltZV9hY2NvdW50aW5nKGRldik7CisJcmV0ID0gc3ByaW50ZihidWYsICIlaVxuIiwKKwkJamlmZmllc190b19tc2VjcyhkZXYtPnBvd2VyLnN1c3BlbmRlZF9qaWZmaWVzKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihydW50aW1lX3N1c3BlbmRlZF90aW1lLCAwNDQ0LCBydHBtX3N1c3BlbmRlZF90aW1lX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBydHBtX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoZGV2LT5wb3dlci5ydW50aW1lX2Vycm9yKSB7CisJCXAgPSAiZXJyb3JcbiI7CisJfSBlbHNlIGlmIChkZXYtPnBvd2VyLmRpc2FibGVfZGVwdGgpIHsKKwkJcCA9ICJ1bnN1cHBvcnRlZFxuIjsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGRldi0+cG93ZXIucnVudGltZV9zdGF0dXMpIHsKKwkJY2FzZSBSUE1fU1VTUEVOREVEOgorCQkJcCA9ICJzdXNwZW5kZWRcbiI7CisJCQlicmVhazsKKwkJY2FzZSBSUE1fU1VTUEVORElORzoKKwkJCXAgPSAic3VzcGVuZGluZ1xuIjsKKwkJCWJyZWFrOworCQljYXNlIFJQTV9SRVNVTUlORzoKKwkJCXAgPSAicmVzdW1pbmdcbiI7CisJCQlicmVhazsKKwkJY2FzZSBSUE1fQUNUSVZFOgorCQkJcCA9ICJhY3RpdmVcbiI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgcCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihydW50aW1lX3N0YXR1cywgMDQ0NCwgcnRwbV9zdGF0dXNfc2hvdywgTlVMTCk7CiAjZW5kaWYKIAogc3RhdGljIHNzaXplX3QKQEAgLTE0NCw2ICsyMDYsMTYgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKHdha2V1cCwgMDY0NCwgd2FrZV9zaG93LCB3YWtlX3N0b3JlKTsKIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHNzaXplX3Qgd2FrZXVwX2NvdW50X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBkZXYtPnBvd2VyLndha2V1cF9jb3VudCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih3YWtldXBfY291bnQsIDA0NDQsIHdha2V1cF9jb3VudF9zaG93LCBOVUxMKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BNX0FEVkFOQ0VEX0RFQlVHCiAjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKIApAQCAtMTcyLDI3ICsyNDQsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgImVuYWJsZWRcbiIpOwogfQogCi1zdGF0aWMgc3NpemVfdCBydHBtX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImVycm9yXG4iKTsKLQlzd2l0Y2ggKGRldi0+cG93ZXIucnVudGltZV9zdGF0dXMpIHsKLQljYXNlIFJQTV9TVVNQRU5ERUQ6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgInN1c3BlbmRlZFxuIik7Ci0JY2FzZSBSUE1fU1VTUEVORElORzoKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAic3VzcGVuZGluZ1xuIik7Ci0JY2FzZSBSUE1fUkVTVU1JTkc6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgInJlc3VtaW5nXG4iKTsKLQljYXNlIFJQTV9BQ1RJVkU6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImFjdGl2ZVxuIik7Ci0JfQotCXJldHVybiAtRUlPOwotfQotCiBzdGF0aWMgREVWSUNFX0FUVFIocnVudGltZV91c2FnZSwgMDQ0NCwgcnRwbV91c2FnZWNvdW50X3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHJ1bnRpbWVfYWN0aXZlX2tpZHMsIDA0NDQsIHJ0cG1fY2hpbGRyZW5fc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocnVudGltZV9zdGF0dXMsIDA0NDQsIHJ0cG1fc3RhdHVzX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHJ1bnRpbWVfZW5hYmxlZCwgMDQ0NCwgcnRwbV9lbmFibGVkX3Nob3csIE5VTEwpOwogCiAjZW5kaWYKQEAgLTIyOCwxNCArMjgxLDE5IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIHBvd2VyX2F0dHJzW10gPSB7CiAjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKIAkmZGV2X2F0dHJfY29udHJvbC5hdHRyLAorCSZkZXZfYXR0cl9ydW50aW1lX3N0YXR1cy5hdHRyLAorCSZkZXZfYXR0cl9ydW50aW1lX3N1c3BlbmRlZF90aW1lLmF0dHIsCisJJmRldl9hdHRyX3J1bnRpbWVfYWN0aXZlX3RpbWUuYXR0ciwKICNlbmRpZgogCSZkZXZfYXR0cl93YWtldXAuYXR0ciwKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwkmZGV2X2F0dHJfd2FrZXVwX2NvdW50LmF0dHIsCisjZW5kaWYKICNpZmRlZiBDT05GSUdfUE1fQURWQU5DRURfREVCVUcKIAkmZGV2X2F0dHJfYXN5bmMuYXR0ciwKICNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogCSZkZXZfYXR0cl9ydW50aW1lX3VzYWdlLmF0dHIsCiAJJmRldl9hdHRyX3J1bnRpbWVfYWN0aXZlX2tpZHMuYXR0ciwKLQkmZGV2X2F0dHJfcnVudGltZV9zdGF0dXMuYXR0ciwKIAkmZGV2X2F0dHJfcnVudGltZV9lbmFibGVkLmF0dHIsCiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTk0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBkcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMgLSBTeXN0ZW0gd2FrZXVwIGV2ZW50cyBmcmFtZXdvcmsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPiwgTm92ZWxsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKy8qCisgKiBJZiBzZXQsIHRoZSBzdXNwZW5kL2hpYmVybmF0ZSBjb2RlIHdpbGwgYWJvcnQgdHJhbnNpdGlvbnMgdG8gYSBzbGVlcCBzdGF0ZQorICogaWYgd2FrZXVwIGV2ZW50cyBhcmUgcmVnaXN0ZXJlZCBkdXJpbmcgb3IgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB0cmFuc2l0aW9uLgorICovCitib29sIGV2ZW50c19jaGVja19lbmFibGVkOworCisvKiBUaGUgY291bnRlciBvZiByZWdpc3RlcmVkIHdha2V1cCBldmVudHMuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBldmVudF9jb3VudDsKKy8qIEEgcHJlc2VydmVkIG9sZCB2YWx1ZSBvZiBldmVudF9jb3VudC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhdmVkX2V2ZW50X2NvdW50OworLyogVGhlIGNvdW50ZXIgb2Ygd2FrZXVwIGV2ZW50cyBiZWluZyBwcm9jZXNzZWQuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBldmVudHNfaW5fcHJvZ3Jlc3M7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZXZlbnRzX2xvY2spOworCitzdGF0aWMgdm9pZCBwbV93YWtldXBfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIERFRklORV9USU1FUihldmVudHNfdGltZXIsIHBtX3dha2V1cF90aW1lcl9mbiwgMCwgMCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBldmVudHNfdGltZXJfZXhwaXJlczsKKworLyoKKyAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgdXNlIHRoZSBvYnNlcnZhdGlvbiB0aGF0IGVhY2ggd2FrZXVwIGV2ZW50IHN0YXJ0cyBhCisgKiBwZXJpb2QgaW4gd2hpY2ggdGhlIHN5c3RlbSBzaG91bGQgbm90IGJlIHN1c3BlbmRlZC4gIFRoZSBtb21lbnQgdGhpcyBwZXJpb2QKKyAqIHdpbGwgZW5kIGRlcGVuZHMgb24gaG93IHRoZSB3YWtldXAgZXZlbnQgaXMgZ29pbmcgdG8gYmUgcHJvY2Vzc2VkIGFmdGVyIGJlaW5nCisgKiBkZXRlY3RlZCBhbmQgYWxsIG9mIHRoZSBwb3NzaWJsZSBjYXNlcyBjYW4gYmUgZGl2aWRlZCBpbnRvIHR3byBkaXN0aW5jdAorICogZ3JvdXBzLgorICoKKyAqIEZpcnN0LCBhIHdha2V1cCBldmVudCBtYXkgYmUgZGV0ZWN0ZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb25hbCB1bml0IHRoYXQgd2lsbAorICogY2Fycnkgb3V0IHRoZSBlbnRpcmUgcHJvY2Vzc2luZyBvZiBpdCBhbmQgcG9zc2libHkgd2lsbCBwYXNzIGl0IHRvIHVzZXIgc3BhY2UKKyAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuICBJbiB0aGF0IGNhc2UgdGhlIGZ1bmN0aW9uYWwgdW5pdCB0aGF0IGhhcyBkZXRlY3RlZAorICogdGhlIGV2ZW50IG1heSBsYXRlciAiY2xvc2UiIHRoZSAibm8gc3VzcGVuZCIgcGVyaW9kIGFzc29jaWF0ZWQgd2l0aCBpdAorICogZGlyZWN0bHkgYXMgc29vbiBhcyBpdCBoYXMgYmVlbiBkZWFsdCB3aXRoLiAgVGhlIHBhaXIgb2YgcG1fc3RheV9hd2FrZSgpIGFuZAorICogcG1fcmVsYXgoKSwgYmFsYW5jZWQgd2l0aCBlYWNoIG90aGVyLCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIHN1Y2gKKyAqIHNpdHVhdGlvbnMuCisgKgorICogU2Vjb25kLCBhIHdha2V1cCBldmVudCBtYXkgYmUgZGV0ZWN0ZWQgYnkgb25lIGZ1bmN0aW9uYWwgdW5pdCBhbmQgcHJvY2Vzc2VkCisgKiBieSBhbm90aGVyIG9uZS4gIEluIHRoYXQgY2FzZSB0aGUgdW5pdCB0aGF0IGhhcyBkZXRlY3RlZCBpdCBjYW5ub3QgcmVhbGx5CisgKiAiY2xvc2UiIHRoZSAibm8gc3VzcGVuZCIgcGVyaW9kIGFzc29jaWF0ZWQgd2l0aCBpdCwgdW5sZXNzIGl0IGtub3dzIGluCisgKiBhZHZhbmNlIHdoYXQncyBnb2luZyB0byBoYXBwZW4gdG8gdGhlIGV2ZW50IGR1cmluZyBwcm9jZXNzaW5nLiAgVGhpcworICoga25vd2xlZGdlLCBob3dldmVyLCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byBpdCwgc28gaXQgY2FuIHNpbXBseSBzcGVjaWZ5IHRpbWUKKyAqIHRvIHdhaXQgYmVmb3JlIHRoZSBzeXN0ZW0gY2FuIGJlIHN1c3BlbmRlZCBhbmQgcGFzcyBpdCBhcyB0aGUgc2Vjb25kCisgKiBhcmd1bWVudCBvZiBwbV93YWtldXBfZXZlbnQoKS4KKyAqLworCisvKioKKyAqIHBtX3N0YXlfYXdha2UgLSBOb3RpZnkgdGhlIFBNIGNvcmUgdGhhdCBhIHdha2V1cCBldmVudCBpcyBiZWluZyBwcm9jZXNzZWQuCisgKiBAZGV2OiBEZXZpY2UgdGhlIHdha2V1cCBldmVudCBpcyByZWxhdGVkIHRvLgorICoKKyAqIE5vdGlmeSB0aGUgUE0gY29yZSBvZiBhIHdha2V1cCBldmVudCAoc2lnbmFsZWQgYnkgQGRldikgYnkgaW5jcmVtZW50aW5nIHRoZQorICogY291bnRlciBvZiB3YWtldXAgZXZlbnRzIGJlaW5nIHByb2Nlc3NlZC4gIElmIEBkZXYgaXMgbm90IE5VTEwsIHRoZSBjb3VudGVyCisgKiBvZiB3YWtldXAgZXZlbnRzIHJlbGF0ZWQgdG8gQGRldiBpcyBpbmNyZW1lbnRlZCB0b28uCisgKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIGRldGVjdGluZyBvZiBhIHdha2V1cCBldmVudCBpZiBwbV9yZWxheCgpIGlzIGdvaW5nCisgKiB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZXZlbnQgKGFuZCBwb3NzaWJseSBwYXNzaW5nIGl0IHRvCisgKiB1c2VyIHNwYWNlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcpLgorICoKKyAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQgcG1fc3RheV9hd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudHNfbG9jaywgZmxhZ3MpOworCWlmIChkZXYpCisJCWRldi0+cG93ZXIud2FrZXVwX2NvdW50Kys7CisKKwlldmVudHNfaW5fcHJvZ3Jlc3MrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHNfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHBtX3JlbGF4IC0gTm90aWZ5IHRoZSBQTSBjb3JlIHRoYXQgcHJvY2Vzc2luZyBvZiBhIHdha2V1cCBldmVudCBoYXMgZW5kZWQuCisgKgorICogTm90aWZ5IHRoZSBQTSBjb3JlIHRoYXQgYSB3YWtldXAgZXZlbnQgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IGRlY3JlbWVudGluZworICogdGhlIGNvdW50ZXIgb2Ygd2FrZXVwIGV2ZW50cyBiZWluZyBwcm9jZXNzZWQgYW5kIGluY3JlbWVudGluZyB0aGUgY291bnRlcgorICogb2YgcmVnaXN0ZXJlZCB3YWtldXAgZXZlbnRzLgorICoKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBmb3Igd2FrZXVwIGV2ZW50cyB3aG9zZSBwcm9jZXNzaW5nIHN0YXJ0ZWQgd2l0aCBjYWxsaW5nCisgKiBwbV9zdGF5X2F3YWtlKCkuCisgKgorICogSXQgaXMgc2FmZSB0byBjYWxsIGl0IGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQgcG1fcmVsYXgodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50c19sb2NrLCBmbGFncyk7CisJaWYgKGV2ZW50c19pbl9wcm9ncmVzcykgeworCQlldmVudHNfaW5fcHJvZ3Jlc3MtLTsKKwkJZXZlbnRfY291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBwbV93YWtldXBfdGltZXJfZm4gLSBEZWxheWVkIGZpbmFsaXphdGlvbiBvZiBhIHdha2V1cCBldmVudC4KKyAqCisgKiBEZWNyZWFzZSB0aGUgY291bnRlciBvZiB3YWtldXAgZXZlbnRzIGJlaW5nIHByb2Nlc3NlZCBhZnRlciBpdCB3YXMgaW5jcmVhc2VkCisgKiBieSBwbV93YWtldXBfZXZlbnQoKS4KKyAqLworc3RhdGljIHZvaWQgcG1fd2FrZXVwX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50c19sb2NrLCBmbGFncyk7CisJaWYgKGV2ZW50c190aW1lcl9leHBpcmVzCisJICAgICYmIHRpbWVfYmVmb3JlX2VxKGV2ZW50c190aW1lcl9leHBpcmVzLCBqaWZmaWVzKSkgeworCQlldmVudHNfaW5fcHJvZ3Jlc3MtLTsKKwkJZXZlbnRzX3RpbWVyX2V4cGlyZXMgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHNfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHBtX3dha2V1cF9ldmVudCAtIE5vdGlmeSB0aGUgUE0gY29yZSBvZiBhIHdha2V1cCBldmVudC4KKyAqIEBkZXY6IERldmljZSB0aGUgd2FrZXVwIGV2ZW50IGlzIHJlbGF0ZWQgdG8uCisgKiBAbXNlYzogQW50aWNpcGF0ZWQgZXZlbnQgcHJvY2Vzc2luZyB0aW1lIChpbiBtaWxsaXNlY29uZHMpLgorICoKKyAqIE5vdGlmeSB0aGUgUE0gY29yZSBvZiBhIHdha2V1cCBldmVudCAoc2lnbmFsZWQgYnkgQGRldikgdGhhdCB3aWxsIHRha2UKKyAqIGFwcHJveGltYXRlbHkgQG1zZWMgbWlsbGlzZWNvbmRzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUga2VybmVsLiAgSW5jcmVtZW50CisgKiB0aGUgY291bnRlciBvZiByZWdpc3RlcmVkIHdha2V1cCBldmVudHMgYW5kIChpZiBAbXNlYyBpcyBub256ZXJvKSBzZXQgdXAKKyAqIHRoZSB3YWtldXAgZXZlbnRzIHRpbWVyIHRvIGV4ZWN1dGUgcG1fd2FrZXVwX3RpbWVyX2ZuKCkgaW4gZnV0dXJlIChpZiB0aGUKKyAqIHRpbWVyIGhhcyBub3QgYmVlbiBzZXQgdXAgYWxyZWFkeSwgaW5jcmVtZW50IHRoZSBjb3VudGVyIG9mIHdha2V1cCBldmVudHMKKyAqIGJlaW5nIHByb2Nlc3NlZCkuICBJZiBAZGV2IGlzIG5vdCBOVUxMLCB0aGUgY291bnRlciBvZiB3YWtldXAgZXZlbnRzIHJlbGF0ZWQKKyAqIHRvIEBkZXYgaXMgaW5jcmVtZW50ZWQgdG9vLgorICoKKyAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQgcG1fd2FrZXVwX2V2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG1zZWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudHNfbG9jaywgZmxhZ3MpOworCWV2ZW50X2NvdW50Kys7CisJaWYgKGRldikKKwkJZGV2LT5wb3dlci53YWtldXBfY291bnQrKzsKKworCWlmIChtc2VjKSB7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKworCQlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXNlYyk7CisJCWlmICghZXhwaXJlcykKKwkJCWV4cGlyZXMgPSAxOworCisJCWlmICghZXZlbnRzX3RpbWVyX2V4cGlyZXMKKwkJICAgIHx8IHRpbWVfYWZ0ZXIoZXhwaXJlcywgZXZlbnRzX3RpbWVyX2V4cGlyZXMpKSB7CisJCQlpZiAoIWV2ZW50c190aW1lcl9leHBpcmVzKQorCQkJCWV2ZW50c19pbl9wcm9ncmVzcysrOworCisJCQltb2RfdGltZXIoJmV2ZW50c190aW1lciwgZXhwaXJlcyk7CisJCQlldmVudHNfdGltZXJfZXhwaXJlcyA9IGV4cGlyZXM7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBwbV9jaGVja193YWtldXBfZXZlbnRzIC0gQ2hlY2sgZm9yIG5ldyB3YWtldXAgZXZlbnRzLgorICoKKyAqIENvbXBhcmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cyB3aXRoIGl0cyBwcmVzZXJ2ZWQKKyAqIHZhbHVlIGZyb20gdGhlIHBhc3QgdG8gY2hlY2sgaWYgbmV3IHdha2V1cCBldmVudHMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgc2luY2UKKyAqIHRoZSBvbGQgdmFsdWUgd2FzIHN0b3JlZC4gIENoZWNrIGlmIHRoZSBjdXJyZW50IG51bWJlciBvZiB3YWtldXAgZXZlbnRzIGJlaW5nCisgKiBwcm9jZXNzZWQgaXMgemVyby4KKyAqLworYm9vbCBwbV9jaGVja193YWtldXBfZXZlbnRzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHJldCA9IHRydWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzX2xvY2ssIGZsYWdzKTsKKwlpZiAoZXZlbnRzX2NoZWNrX2VuYWJsZWQpIHsKKwkJcmV0ID0gKGV2ZW50X2NvdW50ID09IHNhdmVkX2V2ZW50X2NvdW50KSAmJiAhZXZlbnRzX2luX3Byb2dyZXNzOworCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IHJldDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBtX2dldF93YWtldXBfY291bnQgLSBSZWFkIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCB3YWtldXAgZXZlbnRzLgorICogQGNvdW50OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSB2YWx1ZSBhdC4KKyAqCisgKiBTdG9yZSB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cyBhdCB0aGUgYWRkcmVzcyBpbiBAY291bnQuICBCbG9jaworICogaWYgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHdha2V1cCBldmVudHMgYmVpbmcgcHJvY2Vzc2VkIGlzIG5vbnplcm8uCisgKgorICogUmV0dXJuIGZhbHNlIGlmIHRoZSB3YWl0IGZvciB0aGUgbnVtYmVyIG9mIHdha2V1cCBldmVudHMgYmVpbmcgcHJvY2Vzc2VkIHRvCisgKiBkcm9wIGRvd24gdG8gemVybyBoYXMgYmVlbiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCAoYW5kIHRoZSBjdXJyZW50IG51bWJlcgorICogb2Ygd2FrZXVwIGV2ZW50cyBiZWluZyBwcm9jZXNzZWQgaXMgc3RpbGwgbm9uemVybykuICBPdGhlcndpc2UgcmV0dXJuIHRydWUuCisgKi8KK2Jvb2wgcG1fZ2V0X3dha2V1cF9jb3VudCh1bnNpZ25lZCBsb25nICpjb3VudCkKK3sKKwlib29sIHJldDsKKworCXNwaW5fbG9ja19pcnEoJmV2ZW50c19sb2NrKTsKKwlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJZXZlbnRzX2NoZWNrX2VuYWJsZWQgPSBmYWxzZTsKKworCXdoaWxlIChldmVudHNfaW5fcHJvZ3Jlc3MgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZXZlbnRzX2xvY2spOworCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKDEwMCkpOworCisJCXNwaW5fbG9ja19pcnEoJmV2ZW50c19sb2NrKTsKKwl9CisJKmNvdW50ID0gZXZlbnRfY291bnQ7CisJcmV0ID0gIWV2ZW50c19pbl9wcm9ncmVzczsKKwlzcGluX3VubG9ja19pcnEoJmV2ZW50c19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBtX3NhdmVfd2FrZXVwX2NvdW50IC0gU2F2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgcmVnaXN0ZXJlZCB3YWtldXAgZXZlbnRzLgorICogQGNvdW50OiBWYWx1ZSB0byBjb21wYXJlIHdpdGggdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cy4KKyAqCisgKiBJZiBAY291bnQgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cyBhbmQgdGhlCisgKiBjdXJyZW50IG51bWJlciBvZiB3YWtldXAgZXZlbnRzIGJlaW5nIHByb2Nlc3NlZCBpcyB6ZXJvLCBzdG9yZSBAY291bnQgYXMgdGhlCisgKiBvbGQgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cyB0byBiZSB1c2VkIGJ5IHBtX2NoZWNrX3dha2V1cF9ldmVudHMoKQorICogYW5kIHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAqLworYm9vbCBwbV9zYXZlX3dha2V1cF9jb3VudCh1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxKCZldmVudHNfbG9jayk7CisJaWYgKGNvdW50ID09IGV2ZW50X2NvdW50ICYmICFldmVudHNfaW5fcHJvZ3Jlc3MpIHsKKwkJc2F2ZWRfZXZlbnRfY291bnQgPSBjb3VudDsKKwkJZXZlbnRzX2NoZWNrX2VuYWJsZWQgPSB0cnVlOworCQlyZXQgPSB0cnVlOworCX0KKwlzcGluX3VubG9ja19pcnEoJmV2ZW50c19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5jIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCmluZGV4IDUxY2VhZWUuLmUxZTcxNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKQEAgLTMzNSw3ICszMzUsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnJhaWRfbGFiZWxbXSA9IHsgIjAiLCAiNCIsICIxKDErMCkiLCAiNSIsICI1KzEiLCAiQURHIiwKIAkiVU5LTk9XTiIKIH07Ci0jZGVmaW5lIFJBSURfVU5LTk9XTiAoc2l6ZW9mKHJhaWRfbGFiZWwpIC8gc2l6ZW9mKHJhaWRfbGFiZWxbMF0pLTEpCisjZGVmaW5lIFJBSURfVU5LTk9XTiAoQVJSQVlfU0laRShyYWlkX2xhYmVsKS0xKQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKaW5kZXggZGZmNDg3MC4uZWMxNzExZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCkBAIC0xMDg3LDcgKzEwODcsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQllcG9jaC0+ZmxhZ3MgPSAwOwogCQkJCWF0b21pY19zZXQoJmVwb2NoLT5lcG9jaF9zaXplLCAwKTsKLQkJCQkvKiBhdG9taWNfc2V0KCZlcG9jaC0+YWN0aXZlLCAwKTsgaXMgYWxyYWR5IHplcm8gKi8KKwkJCQkvKiBhdG9taWNfc2V0KCZlcG9jaC0+YWN0aXZlLCAwKTsgaXMgYWxyZWFkeSB6ZXJvICovCiAJCQkJaWYgKHJ2ID09IEZFX1NUSUxMX0xJVkUpCiAJCQkJCXJ2ID0gRkVfUkVDWUNMRUQ7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCAyMThkMDkxLi4xNmMzYzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTQsNyArNCw3IEBACiAgKiBOb3RlIHRoYXQgeW91IGNhbiBub3Qgc3dhcCBvdmVyIHRoaXMgdGhpbmcsIHlldC4gU2VlbXMgdG8gd29yayBidXQKICAqIGRlYWRsb2NrcyBzb21ldGltZXMgLSB5b3UgY2FuIG5vdCBzd2FwIG92ZXIgVENQIGluIGdlbmVyYWwuCiAgKiAKLSAqIENvcHlyaWdodCAxOTk3LTIwMDAsIDIwMDggUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IDE5OTctMjAwMCwgMjAwOCBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIFBhcnRzIGNvcHlyaWdodCAyMDAxIFN0ZXZlbiBXaGl0ZWhvdXNlIDxzdGV2ZUBjaHlnd3luLmNvbT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCmluZGV4IDI1OGJjMmEuLjIzYjdjNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCkBAIC0yMjUsMTYgKzIyNSw2IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOwogCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCi0JaWYgKGNtZCA9PSAweDU2NDI0OTQ0KSB7IC8qICdWQklEJyAqLwotCQl2b2lkIF9fdXNlciAqdXNyX2RhdGEgPSAodm9pZCBfX3VzZXIgKilkYXRhOwotCQljaGFyIGlkX3N0cltWSVJUSU9fQkxLX0lEX0JZVEVTXTsKLQkJaW50IGVycjsKLQotCQllcnIgPSB2aXJ0YmxrX2dldF9pZChkaXNrLCBpZF9zdHIpOwotCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIodXNyX2RhdGEsIGlkX3N0ciwgVklSVElPX0JMS19JRF9CWVRFUykpCi0JCQllcnIgPSAtRUZBVUxUOwotCQlyZXR1cm4gZXJyOwotCX0KIAkvKgogCSAqIE9ubHkgYWxsb3cgdGhlIGdlbmVyaWMgU0NTSSBpb2N0bHMgaWYgdGhlIGhvc3QgY2FuIHN1cHBvcnQgaXQuCiAJICovCkBAIC0yODEsNiArMjcxLDI3IEBACiAJcmV0dXJuIGluZGV4IDw8IFBBUlRfQklUUzsKIH0KIAorc3RhdGljIHNzaXplX3QgdmlydGJsa19zZXJpYWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisJaW50IGVycjsKKworCS8qIHN5c2ZzIGdpdmVzIHVzIGEgUEFHRV9TSVpFIGJ1ZmZlciAqLworCUJVSUxEX0JVR19PTihQQUdFX1NJWkUgPCBWSVJUSU9fQkxLX0lEX0JZVEVTKTsKKworCWJ1ZltWSVJUSU9fQkxLX0lEX0JZVEVTXSA9ICdcMCc7CisJZXJyID0gdmlydGJsa19nZXRfaWQoZGlzaywgYnVmKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIHN0cmxlbihidWYpOworCisJaWYgKGVyciA9PSAtRUlPKSAvKiBVbnN1cHBvcnRlZD8gTWFrZSBpdCBlbXB0eS4gKi8KKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZXJyOworfQorREVWSUNFX0FUVFIoc2VyaWFsLCBTX0lSVUdPLCB2aXJ0YmxrX3NlcmlhbF9zaG93LCBOVUxMKTsKKwogc3RhdGljIGludCBfX2RldmluaXQgdmlydGJsa19wcm9iZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKIHsKIAlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsazsKQEAgLTM2NiwxMiArMzc3LDMyIEBACiAJdmJsay0+ZGlzay0+ZHJpdmVyZnNfZGV2ID0gJnZkZXYtPmRldjsKIAlpbmRleCsrOwogCi0JLyogSWYgYmFycmllcnMgYXJlIHN1cHBvcnRlZCwgdGVsbCBibG9jayBsYXllciB0aGF0IHF1ZXVlIGlzIG9yZGVyZWQgKi8KLQlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19CTEtfRl9GTFVTSCkpCisJaWYgKHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fQkxLX0ZfRkxVU0gpKSB7CisJCS8qCisJCSAqIElmIHRoZSBGTFVTSCBmZWF0dXJlIGlzIHN1cHBvcnRlZCB3ZSBkbyBoYXZlIHN1cHBvcnQgZm9yCisJCSAqIGZsdXNoaW5nIGEgdm9sYXRpbGUgd3JpdGUgY2FjaGUgb24gdGhlIGhvc3QuICBVc2UgdGhhdAorCQkgKiB0byBpbXBsZW1lbnQgd3JpdGUgYmFycmllciBzdXBwb3J0LgorCQkgKi8KIAkJYmxrX3F1ZXVlX29yZGVyZWQocSwgUVVFVUVfT1JERVJFRF9EUkFJTl9GTFVTSCwKIAkJCQkgIHZpcnRibGtfcHJlcGFyZV9mbHVzaCk7Ci0JZWxzZSBpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19CTEtfRl9CQVJSSUVSKSkKKwl9IGVsc2UgaWYgKHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fQkxLX0ZfQkFSUklFUikpIHsKKwkJLyoKKwkJICogSWYgdGhlIEJBUlJJRVIgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgdGhlIGhvc3QgZXhwZWN0cyB1cworCQkgKiB0byBvcmRlciByZXF1ZXN0IGJ5IHRhZ3MuICBUaGlzIGltcGxpZXMgdGhlcmUgaXMgbm90CisJCSAqIHZvbGF0aWxlIHdyaXRlIGNhY2hlIG9uIHRoZSBob3N0LCBhbmQgdGhhdCB0aGUgaG9zdAorCQkgKiBuZXZlciByZS1vcmRlcnMgb3V0c3RhbmRpbmcgSS9PLiAgVGhpcyBmZWF0dXJlIGlzIG5vdAorCQkgKiB1c2VmdWwgZm9yIHJlYWwgbGlmZSBzY2VuYXJpb3VzIGFuZCBkZXByZWNhdGVkLgorCQkgKi8KIAkJYmxrX3F1ZXVlX29yZGVyZWQocSwgUVVFVUVfT1JERVJFRF9UQUcsIE5VTEwpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHRoZSBGTFVTSCBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgd2UgbXVzdCBhc3N1bWUgdGhhdAorCQkgKiB0aGUgaG9zdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBraW5kIG9mIHZvbGF0aWxlIHdyaXRlCisJCSAqIGNhY2hpbmcuIFdlIHN0aWxsIG5lZWQgdG8gZHJhaW4gdGhlIHF1ZXVlIHRvIHByb3ZpZGVyCisJCSAqIHByb3BlciBiYXJyaWVyIHNlbWFudGljcy4KKwkJICovCisJCWJsa19xdWV1ZV9vcmRlcmVkKHEsIFFVRVVFX09SREVSRURfRFJBSU4sIE5VTEwpOworCX0KIAogCS8qIElmIGRpc2sgaXMgcmVhZC1vbmx5IGluIHRoZSBob3N0LCB0aGUgZ3Vlc3Qgc2hvdWxkIG9iZXkgKi8KIAlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19CTEtfRl9STykpCkBAIC00NDUsOCArNDc2LDE1IEBACiAKIAogCWFkZF9kaXNrKHZibGstPmRpc2spOworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkaXNrX3RvX2Rldih2YmxrLT5kaXNrKSwgJmRldl9hdHRyX3NlcmlhbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZGVsX2Rpc2s7CisKIAlyZXR1cm4gMDsKIAorb3V0X2RlbF9kaXNrOgorCWRlbF9nZW5kaXNrKHZibGstPmRpc2spOworCWJsa19jbGVhbnVwX3F1ZXVlKHZibGstPmRpc2stPnF1ZXVlKTsKIG91dF9wdXRfZGlzazoKIAlwdXRfZGlzayh2YmxrLT5kaXNrKTsKIG91dF9tZW1wb29sOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKaW5kZXggODJlZDQwMy4uZjYzYWMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8eGVuL2dyYW50X3RhYmxlLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CisjaW5jbHVkZSA8eGVuL3BsYXRmb3JtX3BjaS5oPgogCiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaW8vYmxraWYuaD4KQEAgLTczNyw2ICs3MzgsMzUgQEAKIAkJfQogCX0KIAorCWlmICh4ZW5faHZtX2RvbWFpbigpKSB7CisJCWNoYXIgKnR5cGU7CisJCWludCBsZW47CisJCS8qIG5vIHVucGx1ZyBoYXMgYmVlbiBkb25lOiBkbyBub3QgaG9vayBkZXZpY2VzICE9IHhlbiB2YmRzICovCisJCWlmICh4ZW5fcGxhdGZvcm1fcGNpX3VucGx1ZyAmIFhFTl9VTlBMVUdfSUdOT1JFKSB7CisJCQlpbnQgbWFqb3I7CisKKwkJCWlmICghVkRFVl9JU19FWFRFTkRFRCh2ZGV2aWNlKSkKKwkJCQltYWpvciA9IEJMS0lGX01BSk9SKHZkZXZpY2UpOworCQkJZWxzZQorCQkJCW1ham9yID0gWEVOVkJEX01BSk9SOworCisJCQlpZiAobWFqb3IgIT0gWEVOVkJEX01BSk9SKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkJIiVzOiBIVk0gZG9lcyBub3Qgc3VwcG9ydCB2YmQgJWQgYXMgeGVuIGJsb2NrIGRldmljZVxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXywgdmRldmljZSk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0KKwkJLyogZG8gbm90IGNyZWF0ZSBhIFBWIGNkcm9tIGRldmljZSBpZiB3ZSBhcmUgYW4gSFZNIGd1ZXN0ICovCisJCXR5cGUgPSB4ZW5idXNfcmVhZChYQlRfTklMLCBkZXYtPm5vZGVuYW1lLCAiZGV2aWNlLXR5cGUiLCAmbGVuKTsKKwkJaWYgKElTX0VSUih0eXBlKSkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoc3RybmNtcCh0eXBlLCAiY2Ryb20iLCA1KSA9PSAwKSB7CisJCQlrZnJlZSh0eXBlKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWtmcmVlKHR5cGUpOworCX0KIAlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pIHsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIC1FTk9NRU0sICJhbGxvY2F0aW5nIGluZm8gc3RydWN0dXJlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnIGIvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZwppbmRleCAwNThmYmNjLi4wMmRlZWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcKQEAgLTU4LDYgKzU4LDE4IEBACiAKIAkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBIQ0kgQkNTUCBwcm90b2NvbC4KIAorY29uZmlnIEJUX0hDSVVBUlRfQVRIM0sKKwlib29sICJBdGhlcm9zIEFSMzAweCBzZXJpYWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUX0hDSVVBUlQKKwloZWxwCisJICBIQ0lBVEgzSyAoSENJIEF0aGVyb3MgQVIzMDB4KSBpcyBhIHNlcmlhbCBwcm90b2NvbCBmb3IKKwkgIGNvbW11bmljYXRpb24gYmV0d2VlbiBob3N0IGFuZCBBdGhlcm9zIEFSMzAweCBCbHVldG9vdGggZGV2aWNlcy4KKwkgIFRoaXMgcHJvdG9jb2wgZW5hYmxlcyBBUjMwMHggY2hpcHMgdG8gYmUgZW5hYmxlZCB3aXRoCisJICBwb3dlciBtYW5hZ2VtZW50IHN1cHBvcnQuCisJICBFbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBBdGhlcm9zIEFSMzAweCBzZXJpYWwgQmx1ZXRvb3RoIGRldmljZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIEhDSSBVQVJUIEFUSDNLIHByb3RvY29sLgorCiBjb25maWcgQlRfSENJVUFSVF9MTAogCWJvb2wgIkhDSUxMIHByb3RvY29sIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBCVF9IQ0lVQVJUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZSBiL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCmluZGV4IDdlNWFlZDUuLjcxYmRmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCkBAIC0yNiw0ICsyNiw1IEBACiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0g0KQkrPSBoY2lfaDQubwogaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9CQ1NQKQkrPSBoY2lfYmNzcC5vCiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0xMKQkrPSBoY2lfbGwubworaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9BVEgzSykJKz0gaGNpX2F0aC5vCiBoY2lfdWFydC1vYmpzCQkJCTo9ICQoaGNpX3VhcnQteSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYwppbmRleCBiMGM4NGMxLi44YjFiNjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAogCUJUX0RCRygiZmlybXdhcmUgZGF0YSAlcCBzaXplICV6dSIsIGZpcm13YXJlLT5kYXRhLCBmaXJtd2FyZS0+c2l6ZSk7CiAKLQlkYXRhLT5md19kYXRhID0ga21hbGxvYyhmaXJtd2FyZS0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJZGF0YS0+ZndfZGF0YSA9IGttZW1kdXAoZmlybXdhcmUtPmRhdGEsIGZpcm13YXJlLT5zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEtPmZ3X2RhdGEpIHsKIAkJQlRfRVJSKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZpcm13YXJlIGltYWdlIik7CiAJCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOwpAQCAtMjM0LDcgKzIzNCw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1lbWNweShkYXRhLT5md19kYXRhLCBmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUpOwogCWRhdGEtPmZ3X3NpemUgPSBmaXJtd2FyZS0+c2l6ZTsKIAlkYXRhLT5md19zZW50ID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKaW5kZXggNmQzNGY0MC4uZDUyZTkwYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTE2MCw3ICsxNTksNyBAQAogc3RhdGljIHZvaWQgYmx1ZWNhcmRfYWN0aXZpdHlfbGVkX3RpbWVvdXQodV9sb25nIGFyZykKIHsKIAlibHVlY2FyZF9pbmZvX3QgKmluZm8gPSAoYmx1ZWNhcmRfaW5mb190ICopYXJnOwotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJaWYgKCF0ZXN0X2JpdChDQVJEX0hBU19QQ0NBUkRfSUQsICYoaW5mby0+aHdfc3RhdGUpKSkKIAkJcmV0dXJuOwpAQCAtMTc3LDcgKzE3Niw3IEBACiAKIHN0YXRpYyB2b2lkIGJsdWVjYXJkX2VuYWJsZV9hY3Rpdml0eV9sZWQoYmx1ZWNhcmRfaW5mb190ICppbmZvKQogewotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJaWYgKCF0ZXN0X2JpdChDQVJEX0hBU19QQ0NBUkRfSUQsICYoaW5mby0+aHdfc3RhdGUpKSkKIAkJcmV0dXJuOwpAQCAtMjMzLDcgKzIzMiw3IEBACiAJfQogCiAJZG8gewotCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGlvYmFzZSA9IGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBvZmZzZXQ7CiAJCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY29tbWFuZDsKIAkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWFkeV9iaXQ7CkBAIC0zODAsNyArMzc5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAogCWlmICh0ZXN0X2JpdChYTUlUX1NFTkRJTkdfUkVBRFksICYoaW5mby0+dHhfc3RhdGUpKSkKIAkJYmx1ZWNhcmRfZW5hYmxlX2FjdGl2aXR5X2xlZChpbmZvKTsKQEAgLTUwOSw3ICs1MDgsNyBAQAogCWlmICghdGVzdF9iaXQoQ0FSRF9SRUFEWSwgJihpbmZvLT5od19zdGF0ZSkpKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKLQlpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlzcGluX2xvY2soJihpbmZvLT5sb2NrKSk7CiAKQEAgLTYyMyw3ICs2MjIsNyBAQAogc3RhdGljIGludCBibHVlY2FyZF9oY2lfb3BlbihzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlibHVlY2FyZF9pbmZvX3QgKmluZm8gPSAoYmx1ZWNhcmRfaW5mb190ICopKGhkZXYtPmRyaXZlcl9kYXRhKTsKLQl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAogCWlmICh0ZXN0X2JpdChDQVJEX0hBU19QQ0NBUkRfSUQsICYoaW5mby0+aHdfc3RhdGUpKSkKIAkJYmx1ZWNhcmRfaGNpX3NldF9iYXVkX3JhdGUoaGRldiwgREVGQVVMVF9CQVVEX1JBVEUpOwpAQCAtNjQzLDcgKzY0Miw3IEBACiBzdGF0aWMgaW50IGJsdWVjYXJkX2hjaV9jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlibHVlY2FyZF9pbmZvX3QgKmluZm8gPSAoYmx1ZWNhcmRfaW5mb190ICopKGhkZXYtPmRyaXZlcl9kYXRhKTsKLQl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9SVU5OSU5HLCAmKGhkZXYtPmZsYWdzKSkpCiAJCXJldHVybiAwOwpAQCAtNzEwLDcgKzcwOSw3IEBACiAKIHN0YXRpYyBpbnQgYmx1ZWNhcmRfb3BlbihibHVlY2FyZF9pbmZvX3QgKmluZm8pCiB7Ci0JdW5zaWduZWQgaW50IGlvYmFzZSA9IGluZm8tPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJdW5zaWduZWQgaW50IGlvYmFzZSA9IGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7CiAJdW5zaWduZWQgY2hhciBpZDsKIApAQCAtODI5LDcgKzgyOCw3IEBACiAKIHN0YXRpYyBpbnQgYmx1ZWNhcmRfY2xvc2UoYmx1ZWNhcmRfaW5mb190ICppbmZvKQogewotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gaW5mby0+aGRldjsKIAogCWlmICghaGRldikKQEAgLTg2Niw5ICs4NjUsNiBAQAogCWluZm8tPnBfZGV2ID0gbGluazsKIAlsaW5rLT5wcml2ID0gaW5mbzsKIAotCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gODsKLQogCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKIAlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKIApAQCAtODkxLDEyICs4ODcsMTQgQEAKIAlpbnQgaSwgbjsKIAogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDIwOwotCWxpbmstPmlvLk51bVBvcnRzMSA9IDY0OwotCWxpbmstPmlvLklPQWRkckxpbmVzID0gNjsKKworCWxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZW5kID0gNjQ7CisJbGluay0+aW9fbGluZXMgPSA2OwogCiAJZm9yIChuID0gMDsgbiA8IDB4NDAwOyBuICs9IDB4NDApIHsKLQkJbGluay0+aW8uQmFzZVBvcnQxID0gbiBeIDB4MzAwOwotCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKwkJbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gbiBeIDB4MzAwOworCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAJCWlmIChpID09IDApCiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9icGExMHguYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jCmluZGV4IGQ5NDVjZDEuLjc1MWIzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jCkBAIC02Miw3ICs2Miw3IEBACiAJX191OCAgICB0eXBlOwogCV9fbGUxNiAgc251bTsKIAlfX2xlMTYgIGRsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQgYnBhMTB4X3JlY3Yoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBxdWV1ZSwgdm9pZCAqYnVmLCBpbnQgY291bnQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggMjFlMDVmZC4uN2FiOGYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTE4OSw3ICsxODgsNyBAQAogCQlyZXR1cm47CiAKIAlkbyB7Ci0JCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAkJcmVnaXN0ZXIgc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJcmVnaXN0ZXIgaW50IGxlbjsKIApAQCAtMjI3LDcgKzIyNiw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlhdmFpbCA9IGJ0M2NfcmVhZChpb2Jhc2UsIDB4NzAwNik7CiAJLy9wcmludGsoImJ0M2NfY3M6IHJlY2VpdmluZyAlZCBieXRlc1xuIiwgYXZhaWwpOwpAQCAtMzQ4LDcgKzM0Nyw3IEBACiAJCS8qIG91ciBpcnEgaGFuZGxlciBpcyBzaGFyZWQgKi8KIAkJcmV0dXJuIElSUV9OT05FOwogCi0JaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwlpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJc3Bpbl9sb2NrKCYoaW5mby0+bG9jaykpOwogCkBAIC00ODEsNyArNDgwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaW9iYXNlLCBzaXplLCBhZGRyLCBmY3MsIHRtcDsKIAlpbnQgaSwgZXJyID0gMDsKIAotCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAogCS8qIFJlc2V0ICovCiAJYnQzY19pb193cml0ZShpb2Jhc2UsIDB4ODA0MCwgMHgwNDA0KTsKQEAgLTY1OCw4ICs2NTcsOCBAQAogCWluZm8tPnBfZGV2ID0gbGluazsKIAlsaW5rLT5wcml2ID0gaW5mbzsKIAotCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gODsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDg7CiAKIAlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CkBAIC02ODQsMTQgKzY4MywxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgdHJ5ID0gKHVuc2lnbmVkIGxvbmcpIHByaXZfZGF0YTsKIAorCXBfZGV2LT5pb19saW5lcyA9ICh0cnkgPT0gMCkgPyAxNiA6IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCiAJaWYgKGNmLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCiAJCXBfZGV2LT5jb25mLlZwcCA9IGNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwogCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoY2YtPmlvLndpblswXS5sZW4gPT0gOCkgJiYKIAkgICAgKGNmLT5pby53aW5bMF0uYmFzZSAhPSAwKSkgewotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSAodHJ5ID09IDApID8gMTYgOgotCQkJY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gY2YtPmlvLndpblswXS5iYXNlOworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTcwOCw5ICs3MDcsOSBAQAogCiAJaWYgKChjZi0+aW8ubndpbiA+IDApICYmICgoY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0spIDw9IDMpKSB7CiAJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBiYXNlW2pdOwotCQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gYmFzZVtqXSA/IDE2IDogMzsKLQkJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGJhc2Vbal07CisJCQlwX2Rldi0+aW9fbGluZXMgPSBiYXNlW2pdID8gMTYgOiAzOworCQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldikpCiAJCQkJcmV0dXJuIDA7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZGVidWdmcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2RlYnVnZnMuYwppbmRleCBiNTBiNDFkLi41NDczOWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kZWJ1Z2ZzLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogc3RhdGljIHNzaXplX3QgYnRtcnZsX2hzY21kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKIAkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgYnRtcnZsX3ByaXZhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyIGJ1ZlsxNl07CiAJbG9uZyByZXN1bHQsIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oCmluZGV4IGJlZDBiYTYuLjkwYmRhNTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZHJ2LmgKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oCkBAIC03Niw2ICs3Niw3IEBACiAJaW50ICgqaHdfaG9zdF90b19jYXJkKSAoc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2LAogCQkJCXU4ICpwYXlsb2FkLCB1MTYgbmIpOwogCWludCAoKmh3X3dha2V1cF9maXJtd2FyZSkgKHN0cnVjdCBidG1ydmxfcHJpdmF0ZSAqcHJpdik7CisJaW50ICgqaHdfcHJvY2Vzc19pbnRfc3RhdHVzKSAoc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2KTsKIAlzcGlubG9ja190IGRyaXZlcl9sb2NrOwkJLyogc3BpbmxvY2sgdXNlZCBieSBkcml2ZXIgKi8KICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAl2b2lkICpkZWJ1Z2ZzX2RhdGE7CkBAIC0xMTgsMTMgKzExOSwxMyBAQAogCV9fbGUxNiBvY2Zfb2dmOwogCXU4IGxlbmd0aDsKIAl1OCBkYXRhWzRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYnRtcnZsX2V2ZW50IHsKIAl1OCBlYzsJCS8qIGV2ZW50IGNvdW50ZXIgKi8KIAl1OCBsZW5ndGg7CiAJdTggZGF0YVs0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogUHJvdG90eXBlIG9mIGdsb2JhbCBmdW5jdGlvbiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYwppbmRleCBlZTM3ZWYwLi4wZDMyZWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9tYWluLmMKQEAgLTUwMiwxNCArNTAyLDE3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCQlpZiAoYWRhcHRlci0+aW50X2NvdW50KSB7CiAJCQlhZGFwdGVyLT5pbnRfY291bnQgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJCXByaXYtPmh3X3Byb2Nlc3NfaW50X3N0YXR1cyhwcml2KTsKIAkJfSBlbHNlIGlmIChhZGFwdGVyLT5wc19zdGF0ZSA9PSBQU19TTEVFUCAmJgogCQkJCQkhc2tiX3F1ZXVlX2VtcHR5KCZhZGFwdGVyLT50eF9xdWV1ZSkpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJCQlhZGFwdGVyLT53YWtldXBfdHJpZXMrKzsKIAkJCXByaXYtPmh3X3dha2V1cF9maXJtd2FyZShwcml2KTsKIAkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChhZGFwdGVyLT5wc19zdGF0ZSA9PSBQU19TTEVFUCkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmMKaW5kZXggZGYwNzczZS4uZGNjMmE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jCkBAIC00Nyw2ICs0Nyw3IEBACiAgKiBtb2R1bGVfZXhpdCBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgKi8KIHN0YXRpYyB1OCB1c2VyX3JtbW9kOworc3RhdGljIHU4IHNkaW9faXJlZzsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidG1ydmxfc2Rpb19kZXZpY2UgYnRtcnZsX3NkaW9fc2Q2ODg4ID0gewogCS5oZWxwZXIJCT0gInNkODY4OF9oZWxwZXIuYmluIiwKQEAgLTgzLDEwICs4NCwxMCBAQAogCSpkYXQgPSAwOwogCiAJZndzMCA9IHNkaW9fcmVhZGIoY2FyZC0+ZnVuYywgQ0FSRF9GV19TVEFUVVMwX1JFRywgJnJldCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CiAKLQlpZiAoIXJldCkKLQkJZndzMSA9IHNkaW9fcmVhZGIoY2FyZC0+ZnVuYywgQ0FSRF9GV19TVEFUVVMxX1JFRywgJnJldCk7Ci0KKwlmd3MxID0gc2Rpb19yZWFkYihjYXJkLT5mdW5jLCBDQVJEX0ZXX1NUQVRVUzFfUkVHLCAmcmV0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMjE2LDcgKzIxNyw3IEBACiAKIAl0bXBobHByYnVmc3ogPSBBTElHTl9TWihCVE1fVVBMRF9TSVpFLCBCVFNESU9fRE1BX0FMSUdOKTsKIAotCXRtcGhscHJidWYgPSBrbWFsbG9jKHRtcGhscHJidWZzeiwgR0ZQX0tFUk5FTCk7CisJdG1waGxwcmJ1ZiA9IGt6YWxsb2ModG1waGxwcmJ1ZnN6LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRtcGhscHJidWYpIHsKIAkJQlRfRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBoZWxwZXIuIgogCQkJIiBUZXJtaW5hdGluZyBkb3dubG9hZCIpOwpAQCAtMjI0LDggKzIyNSw2IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQltZW1zZXQodG1waGxwcmJ1ZiwgMCwgdG1waGxwcmJ1ZnN6KTsKLQogCWhlbHBlcmJ1ZiA9ICh1OCAqKSBBTElHTl9BRERSKHRtcGhscHJidWYsIEJUU0RJT19ETUFfQUxJR04pOwogCiAJLyogUGVyZm9ybSBoZWxwZXIgZGF0YSB0cmFuc2ZlciAqLwpAQCAtMzE4LDcgKzMxNyw3IEBACiAJQlRfREJHKCJEb3dubG9hZGluZyBGVyBpbWFnZSAoJWQgYnl0ZXMpIiwgZmlybXdhcmVsZW4pOwogCiAJdG1wZndidWZzeiA9IEFMSUdOX1NaKEJUTV9VUExEX1NJWkUsIEJUU0RJT19ETUFfQUxJR04pOwotCXRtcGZ3YnVmID0ga21hbGxvYyh0bXBmd2J1ZnN6LCBHRlBfS0VSTkVMKTsKKwl0bXBmd2J1ZiA9IGt6YWxsb2ModG1wZndidWZzeiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bXBmd2J1ZikgewogCQlCVF9FUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGZpcm13YXJlLiIKIAkJICAgICAgICIgVGVybWluYXRpbmcgZG93bmxvYWQiKTsKQEAgLTMyNiw4ICszMjUsNiBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JbWVtc2V0KHRtcGZ3YnVmLCAwLCB0bXBmd2J1ZnN6KTsKLQogCS8qIEVuc3VyZSBhbGlnbmVkIGZpcm13YXJlIGJ1ZmZlciAqLwogCWZ3YnVmID0gKHU4ICopIEFMSUdOX0FERFIodG1wZndidWYsIEJUU0RJT19ETUFfQUxJR04pOwogCkBAIC01NTUsNzggKzU1Miw3OSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYnRtcnZsX3NkaW9fZ2V0X2ludF9zdGF0dXMoc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2LCB1OCAqIGlyZWcpCitzdGF0aWMgaW50IGJ0bXJ2bF9zZGlvX3Byb2Nlc3NfaW50X3N0YXR1cyhzdHJ1Y3QgYnRtcnZsX3ByaXZhdGUgKnByaXYpCiB7Ci0JaW50IHJldDsKLQl1OCBzZGlvX2lyZWcgPSAwOworCXVsb25nIGZsYWdzOworCXU4IGlyZWc7CiAJc3RydWN0IGJ0bXJ2bF9zZGlvX2NhcmQgKmNhcmQgPSBwcml2LT5idG1ydmxfZGV2LmNhcmQ7CiAKLQkqaXJlZyA9IDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaXJlZyA9IHNkaW9faXJlZzsKKwlzZGlvX2lyZWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAKLQlzZGlvX2lyZWcgPSBzZGlvX3JlYWRiKGNhcmQtPmZ1bmMsIEhPU1RfSU5UU1RBVFVTX1JFRywgJnJldCk7Ci0JaWYgKHJldCkgewotCQlCVF9FUlIoInNkaW9fcmVhZGI6IHJlYWQgaW50IHN0YXR1cyByZWdpc3RlciBmYWlsZWQiKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChzZGlvX2lyZWcgIT0gMCkgewotCQkvKgotCQkgKiBETl9MRF9IT1NUX0lOVF9TVEFUVVMgYW5kL29yIFVQX0xEX0hPU1RfSU5UX1NUQVRVUwotCQkgKiBDbGVhciB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBhbmQgcmUtZW5hYmxlIHRoZQotCQkgKiBpbnRlcnJ1cHQuCi0JCSAqLwotCQlCVF9EQkcoInNkaW9faXJlZyA9IDB4JXgiLCBzZGlvX2lyZWcpOwotCi0JCXNkaW9fd3JpdGViKGNhcmQtPmZ1bmMsIH4oc2Rpb19pcmVnKSAmIChETl9MRF9IT1NUX0lOVF9TVEFUVVMgfAotCQkJCQkJCVVQX0xEX0hPU1RfSU5UX1NUQVRVUyksCi0JCQkgICAgSE9TVF9JTlRTVEFUVVNfUkVHLCAmcmV0KTsKLQkJaWYgKHJldCkgewotCQkJQlRfRVJSKCJzZGlvX3dyaXRlYjogY2xlYXIgaW50IHN0YXR1cyByZWdpc3RlciAiCi0JCQkJImZhaWxlZCIpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmIChzZGlvX2lyZWcgJiBETl9MRF9IT1NUX0lOVF9TVEFUVVMpIHsKKwlzZGlvX2NsYWltX2hvc3QoY2FyZC0+ZnVuYyk7CisJaWYgKGlyZWcgJiBETl9MRF9IT1NUX0lOVF9TVEFUVVMpIHsKIAkJaWYgKHByaXYtPmJ0bXJ2bF9kZXYudHhfZG5sZF9yZHkpCiAJCQlCVF9EQkcoInR4X2RvbmUgYWxyZWFkeSByZWNlaXZlZDogIgotCQkJCSIgaW50X3N0YXR1cz0weCV4Iiwgc2Rpb19pcmVnKTsKKwkJCQkiIGludF9zdGF0dXM9MHgleCIsIGlyZWcpOwogCQllbHNlCiAJCQlwcml2LT5idG1ydmxfZGV2LnR4X2RubGRfcmR5ID0gdHJ1ZTsKIAl9CiAKLQlpZiAoc2Rpb19pcmVnICYgVVBfTERfSE9TVF9JTlRfU1RBVFVTKQorCWlmIChpcmVnICYgVVBfTERfSE9TVF9JTlRfU1RBVFVTKQogCQlidG1ydmxfc2Rpb19jYXJkX3RvX2hvc3QocHJpdik7CiAKLQkqaXJlZyA9IHNkaW9faXJlZzsKKwlzZGlvX3JlbGVhc2VfaG9zdChjYXJkLT5mdW5jKTsKIAotCXJldCA9IDA7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYnRtcnZsX3NkaW9faW50ZXJydXB0KHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7CiAJc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2OwotCXN0cnVjdCBoY2lfZGV2ICpoY2lkZXY7CiAJc3RydWN0IGJ0bXJ2bF9zZGlvX2NhcmQgKmNhcmQ7CisJdWxvbmcgZmxhZ3M7CiAJdTggaXJlZyA9IDA7CisJaW50IHJldDsKIAogCWNhcmQgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOwotCWlmIChjYXJkICYmIGNhcmQtPnByaXYpIHsKLQkJcHJpdiA9IGNhcmQtPnByaXY7Ci0JCWhjaWRldiA9IHByaXYtPmJ0bXJ2bF9kZXYuaGNpZGV2OwotCi0JCWlmIChidG1ydmxfc2Rpb19nZXRfaW50X3N0YXR1cyhwcml2LCAmaXJlZykpCi0JCQlCVF9FUlIoInJlYWRpbmcgSE9TVF9JTlRfU1RBVFVTX1JFRyBmYWlsZWQiKTsKLQkJZWxzZQotCQkJQlRfREJHKCJIT1NUX0lOVF9TVEFUVVNfUkVHICUjeCIsIGlyZWcpOwotCi0JCWJ0bXJ2bF9pbnRlcnJ1cHQocHJpdik7CisJaWYgKCFjYXJkIHx8ICFjYXJkLT5wcml2KSB7CisJCUJUX0VSUigic2JpX2ludGVycnVwdCglcCkgY2FyZCBvciBwcml2IGlzICIKKwkJCQkiTlVMTCwgY2FyZD0lcFxuIiwgZnVuYywgY2FyZCk7CisJCXJldHVybjsKIAl9CisKKwlwcml2ID0gY2FyZC0+cHJpdjsKKworCWlyZWcgPSBzZGlvX3JlYWRiKGNhcmQtPmZ1bmMsIEhPU1RfSU5UU1RBVFVTX1JFRywgJnJldCk7CisJaWYgKHJldCkgeworCQlCVF9FUlIoInNkaW9fcmVhZGI6IHJlYWQgaW50IHN0YXR1cyByZWdpc3RlciBmYWlsZWQiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcmVnICE9IDApIHsKKwkJLyoKKwkJICogRE5fTERfSE9TVF9JTlRfU1RBVFVTIGFuZC9vciBVUF9MRF9IT1NUX0lOVF9TVEFUVVMKKwkJICogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgYW5kIHJlLWVuYWJsZSB0aGUKKwkJICogaW50ZXJydXB0LgorCQkgKi8KKwkJQlRfREJHKCJpcmVnID0gMHgleCIsIGlyZWcpOworCisJCXNkaW9fd3JpdGViKGNhcmQtPmZ1bmMsIH4oaXJlZykgJiAoRE5fTERfSE9TVF9JTlRfU1RBVFVTIHwKKwkJCQkJVVBfTERfSE9TVF9JTlRfU1RBVFVTKSwKKwkJCQlIT1NUX0lOVFNUQVRVU19SRUcsICZyZXQpOworCQlpZiAocmV0KSB7CisJCQlCVF9FUlIoInNkaW9fd3JpdGViOiBjbGVhciBpbnQgc3RhdHVzIHJlZ2lzdGVyIGZhaWxlZCIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJc2Rpb19pcmVnIHw9IGlyZWc7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWJ0bXJ2bF9pbnRlcnJ1cHQocHJpdik7CiB9CiAKIHN0YXRpYyBpbnQgYnRtcnZsX3NkaW9fcmVnaXN0ZXJfZGV2KHN0cnVjdCBidG1ydmxfc2Rpb19jYXJkICpjYXJkKQpAQCAtOTMwLDYgKzkyOCw3IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlIHNwZWNpZmljIGZ1bmN0aW9uIHBvaW50ZXJzICovCiAJcHJpdi0+aHdfaG9zdF90b19jYXJkID0gYnRtcnZsX3NkaW9faG9zdF90b19jYXJkOwogCXByaXYtPmh3X3dha2V1cF9maXJtd2FyZSA9IGJ0bXJ2bF9zZGlvX3dha2V1cF9mdzsKKwlwcml2LT5od19wcm9jZXNzX2ludF9zdGF0dXMgPSBidG1ydmxfc2Rpb19wcm9jZXNzX2ludF9zdGF0dXM7CiAKIAlpZiAoYnRtcnZsX3JlZ2lzdGVyX2hkZXYocHJpdikpIHsKIAkJQlRfRVJSKCJSZWdpc3RlciBoZGV2IGZhaWxlZCEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKaW5kZXggNGVkNzI4OC4uMWM0ZjVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTE0Myw3ICsxNDIsNyBAQAogCX0KIAogCWRvIHsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGlvYmFzZSA9IGluZm8tPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCQlyZWdpc3RlciBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQlyZWdpc3RlciBpbnQgbGVuOwogCkBAIC0xODQsNyArMTgzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAogCWRvIHsKIAkJaW5mby0+aGRldi0+c3RhdC5ieXRlX3J4Kys7CkBAIC0yOTgsNyArMjk3LDcgQEAKIAkJLyogb3VyIGlycSBoYW5kbGVyIGlzIHNoYXJlZCAqLwogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlzcGluX2xvY2soJihpbmZvLT5sb2NrKSk7CiAKQEAgLTM1NSw3ICszNTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwlpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJihpbmZvLT5sb2NrKSwgZmxhZ3MpOwogCkBAIC00NzksNyArNDc4LDcgQEAKIHN0YXRpYyBpbnQgYnR1YXJ0X29wZW4oYnR1YXJ0X2luZm9fdCAqaW5mbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCiAJc3Bpbl9sb2NrX2luaXQoJihpbmZvLT5sb2NrKSk7CkBAIC01NDksNyArNTQ4LDcgQEAKIHN0YXRpYyBpbnQgYnR1YXJ0X2Nsb3NlKGJ0dWFydF9pbmZvX3QgKmluZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGluZm8tPmhkZXY7CiAKIAlpZiAoIWhkZXYpCkBAIC01ODcsOCArNTg2LDggQEAKIAlpbmZvLT5wX2RldiA9IGxpbms7CiAJbGluay0+cHJpdiA9IGluZm87CiAKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCWxpbmstPmlvLk51bVBvcnRzMSA9IDg7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA4OwogCiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwpAQCAtNjEzLDE0ICs2MTIsMTQgQEAKIHsKIAlpbnQgKnRyeSA9IHByaXZfZGF0YTsKIAorCXBfZGV2LT5pb19saW5lcyA9ICh0cnkgPT0gMCkgPyAxNiA6IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCiAJaWYgKGNmLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCiAJCXBfZGV2LT5jb25mLlZwcCA9IGNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwogCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoY2YtPmlvLndpblswXS5sZW4gPT0gOCkgJiYKIAkgICAgKGNmLT5pby53aW5bMF0uYmFzZSAhPSAwKSkgewotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSAoKnRyeSA9PSAwKSA/IDE2IDoKLQkJCWNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldikpCiAJCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC02MzcsOSArNjM2LDkgQEAKIAogCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoKGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLKSA8PSAzKSkgewogCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gYmFzZVtqXTsKLQkJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGJhc2Vbal0gPyAxNiA6IDM7Ci0JCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBiYXNlW2pdOworCQkJcF9kZXYtPmlvX2xpbmVzID0gYmFzZVtqXSA/IDE2IDogMzsKKwkJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpKQogCQkJCXJldHVybiAwOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggNWQ5Y2M1My4uZDIyY2UzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC01OSw2ICs1OSw5IEBACiAJLyogR2VuZXJpYyBCbHVldG9vdGggVVNCIGRldmljZSAqLwogCXsgVVNCX0RFVklDRV9JTkZPKDB4ZTAsIDB4MDEsIDB4MDEpIH0sCiAKKwkvKiBBcHBsZSBpTWFjMTEsMSAqLworCXsgVVNCX0RFVklDRSgweDA1YWMsIDB4ODIxNSkgfSwKKwogCS8qIEFWTSBCbHVlRlJJVFohIFVTQiB2Mi4wICovCiAJeyBVU0JfREVWSUNFKDB4MDU3YywgMHgzODAwKSB9LAogCkBAIC0xNDYsNiArMTQ5LDcgQEAKICNkZWZpbmUgQlRVU0JfQlVMS19SVU5OSU5HCTEKICNkZWZpbmUgQlRVU0JfSVNPQ19SVU5OSU5HCTIKICNkZWZpbmUgQlRVU0JfU1VTUEVORElORwkzCisjZGVmaW5lIEJUVVNCX0RJRF9JU09fUkVTVU1FCTQKIAogc3RydWN0IGJ0dXNiX2RhdGEgewogCXN0cnVjdCBoY2lfZGV2ICAgICAgICpoZGV2OwpAQCAtMTc5LDcgKzE4Myw2IEBACiAJdW5zaWduZWQgaW50IHNjb19udW07CiAJaW50IGlzb2NfYWx0c2V0dGluZzsKIAlpbnQgc3VzcGVuZF9jb3VudDsKLQlpbnQgZGlkX2lzb19yZXN1bWU6MTsKIH07CiAKIHN0YXRpYyBpbnQgaW5jX3R4KHN0cnVjdCBidHVzYl9kYXRhICpkYXRhKQpAQCAtODA3LDcgKzgxMCw3IEBACiAJaW50IGVycjsKIAogCWlmIChoZGV2LT5jb25uX2hhc2guc2NvX251bSA+IDApIHsKLQkJaWYgKCFkYXRhLT5kaWRfaXNvX3Jlc3VtZSkgeworCQlpZiAoIXRlc3RfYml0KEJUVVNCX0RJRF9JU09fUkVTVU1FLCAmZGF0YS0+ZmxhZ3MpKSB7CiAJCQllcnIgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoZGF0YS0+aXNvYyk7CiAJCQlpZiAoZXJyIDwgMCkgewogCQkJCWNsZWFyX2JpdChCVFVTQl9JU09DX1JVTk5JTkcsICZkYXRhLT5mbGFncyk7CkBAIC04MTUsNyArODE4LDcgQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAKLQkJCWRhdGEtPmRpZF9pc29fcmVzdW1lID0gMTsKKwkJCXNldF9iaXQoQlRVU0JfRElEX0lTT19SRVNVTUUsICZkYXRhLT5mbGFncyk7CiAJCX0KIAkJaWYgKGRhdGEtPmlzb2NfYWx0c2V0dGluZyAhPSAyKSB7CiAJCQljbGVhcl9iaXQoQlRVU0JfSVNPQ19SVU5OSU5HLCAmZGF0YS0+ZmxhZ3MpOwpAQCAtODM2LDEwICs4MzksOCBAQAogCQl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZkYXRhLT5pc29jX2FuY2hvcik7CiAKIAkJX19zZXRfaXNvY19pbnRlcmZhY2UoaGRldiwgMCk7Ci0JCWlmIChkYXRhLT5kaWRfaXNvX3Jlc3VtZSkgewotCQkJZGF0YS0+ZGlkX2lzb19yZXN1bWUgPSAwOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJUVVNCX0RJRF9JU09fUkVTVU1FLCAmZGF0YS0+ZmxhZ3MpKQogCQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGRhdGEtPmlzb2MpOwotCQl9CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKaW5kZXggZWYwNDRkNS4uZGI3YzhkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgpAQCAtMTA0LDcgKzEwMyw3IEBACiAJdTggdHlwZTsKIAl1OCB6ZXJvOwogCXUxNiBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBuc2hfdDsJLyogTm9raWEgU3BlY2lmaWMgSGVhZGVyICovCit9IF9fcGFja2VkIG5zaF90OwkvKiBOb2tpYSBTcGVjaWZpYyBIZWFkZXIgKi8KIAogI2RlZmluZSBOU0hMICA0CQkJCS8qIE5va2lhIFNwZWNpZmljIEhlYWRlciBMZW5ndGggKi8KIApAQCAtMTUwLDcgKzE0OSw3IEBACiAJfQogCiAJZG8gewotCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGlvYmFzZSA9IGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJCXJlZ2lzdGVyIHN0cnVjdCBza19idWZmICpza2I7CiAJCXJlZ2lzdGVyIGludCBsZW47CiAKQEAgLTIxNSw3ICsyMTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwlpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJZG8gewogCQlpbmZvLT5oZGV2LT5zdGF0LmJ5dGVfcngrKzsKQEAgLTMwMiw3ICszMDEsNyBAQAogCQkvKiBvdXIgaXJxIGhhbmRsZXIgaXMgc2hhcmVkICovCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCWlvYmFzZSA9IGluZm8tPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAogCXNwaW5fbG9jaygmKGluZm8tPmxvY2spKTsKIApAQCAtNDYyLDcgKzQ2MSw3IEBACiBzdGF0aWMgaW50IGR0bDFfb3BlbihkdGwxX2luZm9fdCAqaW5mbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBpbmZvLT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCiAJc3Bpbl9sb2NrX2luaXQoJihpbmZvLT5sb2NrKSk7CkBAIC01MDksNyArNTA4LDggQEAKIAlvdXRiKFVBUlRfTENSX1dMRU44LCBpb2Jhc2UgKyBVQVJUX0xDUik7CS8qIFJlc2V0IERMQUIgKi8KIAlvdXRiKChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwgaW9iYXNlICsgVUFSVF9NQ1IpOwogCi0JaW5mby0+cmlfbGF0Y2ggPSBpbmIoaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MSArIFVBUlRfTVNSKSAmIFVBUlRfTVNSX1JJOworCWluZm8tPnJpX2xhdGNoID0gaW5iKGluZm8tPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgKyBVQVJUX01TUikKKwkJCQkmIFVBUlRfTVNSX1JJOwogCiAJLyogVHVybiBvbiBpbnRlcnJ1cHRzICovCiAJb3V0YihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHwgVUFSVF9JRVJfVEhSSSwgaW9iYXNlICsgVUFSVF9JRVIpOwpAQCAtNTM0LDcgKzUzNCw3IEBACiBzdGF0aWMgaW50IGR0bDFfY2xvc2UoZHRsMV9pbmZvX3QgKmluZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlID0gaW5mby0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGluZm8tPmhkZXY7CiAKIAlpZiAoIWhkZXYpCkBAIC01NzIsOCArNTcyLDggQEAKIAlpbmZvLT5wX2RldiA9IGxpbms7CiAJbGluay0+cHJpdiA9IGluZm87CiAKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCWxpbmstPmlvLk51bVBvcnRzMSA9IDg7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA4OwogCiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwpAQCAtNTk3LDE0ICs1OTcsMTMgQEAKIAkJCSAgdW5zaWduZWQgaW50IHZjYywKIAkJCSAgdm9pZCAqcHJpdl9kYXRhKQogewotCWlmICgoY2YtPmlvLm53aW4gPT0gMSkgJiYgKGNmLT5pby53aW5bMF0ubGVuID4gOCkpIHsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGNmLT5pby53aW5bMF0ubGVuOwkvKnlvICovCi0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoKGNmLT5pby5ud2luICE9IDEpIHx8IChjZi0+aW8ud2luWzBdLmxlbiA8PSA4KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gY2YtPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2YtPmlvLndpblswXS5sZW47CS8qeW8gKi8KKwlwX2Rldi0+aW9fbGluZXMgPSBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpOwogfQogCiBzdGF0aWMgaW50IGR0bDFfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQpAQCAtNjEzLDcgKzYxMiw3IEBACiAJaW50IGk7CiAKIAkvKiBMb29rIGZvciBhIGdlbmVyaWMgZnVsbC1zaXplZCB3aW5kb3cgKi8KLQlsaW5rLT5pby5OdW1Qb3J0czEgPSA4OworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA4OwogCWlmIChwY21jaWFfbG9vcF9jb25maWcobGluaywgZHRsMV9jb25mY2hlY2ssIE5VTEwpIDwgMCkKIAkJZ290byBmYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9hdGguYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE2MGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2F0aC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogIEF0aGVyb3MgQ29tbXVuaWNhdGlvbiBCbHVldG9vdGggSENJQVRIM0sgVUFSVCBwcm90b2NvbAorICoKKyAqICBIQ0lBVEgzSyAoSENJIEF0aGVyb3MgQVIzMDB4IFByb3RvY29sKSBpcyBhIEF0aGVyb3MgQ29tbXVuaWNhdGlvbidzCisgKiAgcG93ZXIgbWFuYWdlbWVudCBwcm90b2NvbCBleHRlbnNpb24gdG8gSDQgdG8gc3VwcG9ydCBBUjMwMHggQmx1ZXRvb3RoIENoaXAuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqICBBY2tub3dsZWRnZW1lbnRzOgorICogIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBoY2lfaDQuYywgd2hpY2ggd2FzIHdyaXR0ZW4KKyAqICBieSBNYXhpbSBLcmFzbnlhbnNreSBhbmQgTWFyY2VsIEhvbHRtYW5uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorCisjaW5jbHVkZSAiaGNpX3VhcnQuaCIKKworc3RydWN0IGF0aF9zdHJ1Y3QgeworCXN0cnVjdCBoY2lfdWFydCAqaHU7CisJdW5zaWduZWQgaW50IGN1cl9zbGVlcDsKKworCXN0cnVjdCBza19idWZmX2hlYWQgdHhxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBjdHh0c3c7Cit9OworCitzdGF0aWMgaW50IGF0aF93YWtldXBfYXIzayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0ZXJtaW9zIHNldHRpbmdzOworCWludCBzdGF0dXMgPSB0dHktPmRyaXZlci0+b3BzLT50aW9jbWdldCh0dHksIE5VTEwpOworCisJaWYgKHN0YXR1cyAmIFRJT0NNX0NUUykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIERpc2FibGUgQXV0b21hdGljIFJUU0NUUyAqLworCW5fdHR5X2lvY3RsX2hlbHBlcih0dHksIE5VTEwsIFRDR0VUUywgKHVuc2lnbmVkIGxvbmcpJnNldHRpbmdzKTsKKwlzZXR0aW5ncy5jX2NmbGFnICY9IH5DUlRTQ1RTOworCW5fdHR5X2lvY3RsX2hlbHBlcih0dHksIE5VTEwsIFRDU0VUUywgKHVuc2lnbmVkIGxvbmcpJnNldHRpbmdzKTsKKworCS8qIENsZWFyIFJUUyBmaXJzdCAqLworCXN0YXR1cyA9IHR0eS0+ZHJpdmVyLT5vcHMtPnRpb2NtZ2V0KHR0eSwgTlVMTCk7CisJdHR5LT5kcml2ZXItPm9wcy0+dGlvY21zZXQodHR5LCBOVUxMLCAweDAwLCBUSU9DTV9SVFMpOworCW1kZWxheSgyMCk7CisKKwkvKiBTZXQgUlRTLCB3YWtlIHVwIGJvYXJkICovCisJc3RhdHVzID0gdHR5LT5kcml2ZXItPm9wcy0+dGlvY21nZXQodHR5LCBOVUxMKTsKKwl0dHktPmRyaXZlci0+b3BzLT50aW9jbXNldCh0dHksIE5VTEwsIFRJT0NNX1JUUywgMHgwMCk7CisJbWRlbGF5KDIwKTsKKworCXN0YXR1cyA9IHR0eS0+ZHJpdmVyLT5vcHMtPnRpb2NtZ2V0KHR0eSwgTlVMTCk7CisKKwluX3R0eV9pb2N0bF9oZWxwZXIodHR5LCBOVUxMLCBUQ0dFVFMsICh1bnNpZ25lZCBsb25nKSZzZXR0aW5ncyk7CisJc2V0dGluZ3MuY19jZmxhZyB8PSBDUlRTQ1RTOworCW5fdHR5X2lvY3RsX2hlbHBlcih0dHksIE5VTEwsIFRDU0VUUywgKHVuc2lnbmVkIGxvbmcpJnNldHRpbmdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGF0aF9oY2lfdWFydF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhdGhfc3RydWN0ICphdGg7CisJc3RydWN0IGhjaV91YXJ0ICpodTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJYXRoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGhfc3RydWN0LCBjdHh0c3cpOworCisJaHUgPSBhdGgtPmh1OworCXR0eSA9IGh1LT50dHk7CisKKwkvKiB2ZXJpZnkgYW5kIHdha2UgdXAgY29udHJvbGxlciAqLworCWlmIChhdGgtPmN1cl9zbGVlcCkgeworCQlzdGF0dXMgPSBhdGhfd2FrZXVwX2FyM2sodHR5KTsKKwkJaWYgKCEoc3RhdHVzICYgVElPQ01fQ1RTKSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBSZWFkeSB0byBzZW5kIERhdGEgKi8KKwljbGVhcl9iaXQoSENJX1VBUlRfU0VORElORywgJmh1LT50eF9zdGF0ZSk7CisJaGNpX3VhcnRfdHhfd2FrZXVwKGh1KTsKK30KKworLyogSW5pdGlhbGl6ZSBwcm90b2NvbCAqLworc3RhdGljIGludCBhdGhfb3BlbihzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBhdGhfc3RydWN0ICphdGg7CisKKwlCVF9EQkcoImh1ICVwIiwgaHUpOworCisJYXRoID0ga3phbGxvYyhzaXplb2YoKmF0aCksIEdGUF9BVE9NSUMpOworCWlmICghYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmF0aC0+dHhxKTsKKworCWh1LT5wcml2ID0gYXRoOworCWF0aC0+aHUgPSBodTsKKworCUlOSVRfV09SSygmYXRoLT5jdHh0c3csIGF0aF9oY2lfdWFydF93b3JrKTsKKworCXJldHVybiAwOworfQorCisvKiBGbHVzaCBwcm90b2NvbCBkYXRhICovCitzdGF0aWMgaW50IGF0aF9mbHVzaChzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBhdGhfc3RydWN0ICphdGggPSBodS0+cHJpdjsKKworCUJUX0RCRygiaHUgJXAiLCBodSk7CisKKwlza2JfcXVldWVfcHVyZ2UoJmF0aC0+dHhxKTsKKworCXJldHVybiAwOworfQorCisvKiBDbG9zZSBwcm90b2NvbCAqLworc3RhdGljIGludCBhdGhfY2xvc2Uoc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlzdHJ1Y3QgYXRoX3N0cnVjdCAqYXRoID0gaHUtPnByaXY7CisKKwlCVF9EQkcoImh1ICVwIiwgaHUpOworCisJc2tiX3F1ZXVlX3B1cmdlKCZhdGgtPnR4cSk7CisKKwljYW5jZWxfd29ya19zeW5jKCZhdGgtPmN0eHRzdyk7CisKKwlodS0+cHJpdiA9IE5VTEw7CisJa2ZyZWUoYXRoKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEhDSV9PUF9BVEhfU0xFRVAgMHhGQzA0CisKKy8qIEVucXVldWUgZnJhbWUgZm9yIHRyYW5zbWl0dGlvbiAqLworc3RhdGljIGludCBhdGhfZW5xdWV1ZShzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBhdGhfc3RydWN0ICphdGggPSBodS0+cHJpdjsKKworCWlmIChidF9jYihza2IpLT5wa3RfdHlwZSA9PSBIQ0lfU0NPREFUQV9QS1QpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVXBkYXRlIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIGZsYWcgd2l0aCBwYXJhbWV0ZXJzIG9mCisJICogSENJIHNsZWVwIGVuYWJsZSB2ZW5kb3Igc3BlY2lmaWMgSENJIGNvbW1hbmQuCisJICovCisJaWYgKGJ0X2NiKHNrYiktPnBrdF90eXBlID09IEhDSV9DT01NQU5EX1BLVCkgeworCQlzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyICpoZHIgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKworCQlpZiAoX19sZTE2X3RvX2NwdShoZHItPm9wY29kZSkgPT0gSENJX09QX0FUSF9TTEVFUCkKKwkJCWF0aC0+Y3VyX3NsZWVwID0gc2tiLT5kYXRhW0hDSV9DT01NQU5EX0hEUl9TSVpFXTsKKwl9CisKKwlCVF9EQkcoImh1ICVwIHNrYiAlcCIsIGh1LCBza2IpOworCisJLyogUHJlcGVuZCBza2Igd2l0aCBmcmFtZSB0eXBlICovCisJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMSksICZidF9jYihza2IpLT5wa3RfdHlwZSwgMSk7CisKKwlza2JfcXVldWVfdGFpbCgmYXRoLT50eHEsIHNrYik7CisJc2V0X2JpdChIQ0lfVUFSVF9TRU5ESU5HLCAmaHUtPnR4X3N0YXRlKTsKKworCXNjaGVkdWxlX3dvcmsoJmF0aC0+Y3R4dHN3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmF0aF9kZXF1ZXVlKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJc3RydWN0IGF0aF9zdHJ1Y3QgKmF0aCA9IGh1LT5wcml2OworCisJcmV0dXJuIHNrYl9kZXF1ZXVlKCZhdGgtPnR4cSk7Cit9CisKKy8qIFJlY3YgZGF0YSAqLworc3RhdGljIGludCBhdGhfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCB2b2lkICpkYXRhLCBpbnQgY291bnQpCit7CisJaWYgKGhjaV9yZWN2X3N0cmVhbV9mcmFnbWVudChodS0+aGRldiwgZGF0YSwgY291bnQpIDwgMCkKKwkJQlRfRVJSKCJGcmFtZSBSZWFzc2VtYmx5IEZhaWxlZCIpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGhjaV91YXJ0X3Byb3RvIGF0aHAgPSB7CisJLmlkID0gSENJX1VBUlRfQVRIM0ssCisJLm9wZW4gPSBhdGhfb3BlbiwKKwkuY2xvc2UgPSBhdGhfY2xvc2UsCisJLnJlY3YgPSBhdGhfcmVjdiwKKwkuZW5xdWV1ZSA9IGF0aF9lbnF1ZXVlLAorCS5kZXF1ZXVlID0gYXRoX2RlcXVldWUsCisJLmZsdXNoID0gYXRoX2ZsdXNoLAorfTsKKworaW50IF9faW5pdCBhdGhfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmYXRocCk7CisKKwlpZiAoIWVycikKKwkJQlRfSU5GTygiSENJQVRIM0sgcHJvdG9jb2wgaW5pdGlhbGl6ZWQiKTsKKwllbHNlCisJCUJUX0VSUigiSENJQVRIM0sgcHJvdG9jb2wgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZXhpdCBhdGhfZGVpbml0KHZvaWQpCit7CisJcmV0dXJuIGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oJmF0aHApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKaW5kZXggNDJkNjlkNC4uOWM1YjJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCkBAIC03MzksNyArNzM5LDcgQEAKIAkuZmx1c2gJCT0gYmNzcF9mbHVzaAogfTsKIAotaW50IGJjc3BfaW5pdCh2b2lkKQoraW50IF9faW5pdCBiY3NwX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJmJjc3ApOwogCkBAIC03NTEsNyArNzUxLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgYmNzcF9kZWluaXQodm9pZCkKK2ludCBfX2V4aXQgYmNzcF9kZWluaXQodm9pZCkKIHsKIAlyZXR1cm4gaGNpX3VhcnRfdW5yZWdpc3Rlcl9wcm90bygmYmNzcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNC5jCmluZGV4IDNmMDM4ZjUuLjdiOGFkOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNC5jCkBAIC0xNTEsMTA3ICsxNTEsOCBAQAogLyogUmVjdiBkYXRhICovCiBzdGF0aWMgaW50IGg0X3JlY3Yoc3RydWN0IGhjaV91YXJ0ICpodSwgdm9pZCAqZGF0YSwgaW50IGNvdW50KQogewotCXN0cnVjdCBoNF9zdHJ1Y3QgKmg0ID0gaHUtPnByaXY7Ci0JcmVnaXN0ZXIgY2hhciAqcHRyOwotCXN0cnVjdCBoY2lfZXZlbnRfaGRyICplaDsKLQlzdHJ1Y3QgaGNpX2FjbF9oZHIgICAqYWg7Ci0Jc3RydWN0IGhjaV9zY29faGRyICAgKnNoOwotCXJlZ2lzdGVyIGludCBsZW4sIHR5cGUsIGRsZW47Ci0KLQlCVF9EQkcoImh1ICVwIGNvdW50ICVkIHJ4X3N0YXRlICVsZCByeF9jb3VudCAlbGQiLCAKLQkJCWh1LCBjb3VudCwgaDQtPnJ4X3N0YXRlLCBoNC0+cnhfY291bnQpOwotCi0JcHRyID0gZGF0YTsKLQl3aGlsZSAoY291bnQpIHsKLQkJaWYgKGg0LT5yeF9jb3VudCkgewotCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBoNC0+cnhfY291bnQsIGNvdW50KTsKLQkJCW1lbWNweShza2JfcHV0KGg0LT5yeF9za2IsIGxlbiksIHB0ciwgbGVuKTsKLQkJCWg0LT5yeF9jb3VudCAtPSBsZW47IGNvdW50IC09IGxlbjsgcHRyICs9IGxlbjsKLQotCQkJaWYgKGg0LT5yeF9jb3VudCkKLQkJCQljb250aW51ZTsKLQotCQkJc3dpdGNoIChoNC0+cnhfc3RhdGUpIHsKLQkJCWNhc2UgSDRfVzRfREFUQToKLQkJCQlCVF9EQkcoIkNvbXBsZXRlIGRhdGEiKTsKLQotCQkJCWhjaV9yZWN2X2ZyYW1lKGg0LT5yeF9za2IpOwotCi0JCQkJaDQtPnJ4X3N0YXRlID0gSDRfVzRfUEFDS0VUX1RZUEU7Ci0JCQkJaDQtPnJ4X3NrYiA9IE5VTEw7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgSDRfVzRfRVZFTlRfSERSOgotCQkJCWVoID0gaGNpX2V2ZW50X2hkcihoNC0+cnhfc2tiKTsKLQotCQkJCUJUX0RCRygiRXZlbnQgaGVhZGVyOiBldnQgMHglMi4yeCBwbGVuICVkIiwgZWgtPmV2dCwgZWgtPnBsZW4pOwotCi0JCQkJaDRfY2hlY2tfZGF0YV9sZW4oaDQsIGVoLT5wbGVuKTsKLQkJCQljb250aW51ZTsKLQotCQkJY2FzZSBINF9XNF9BQ0xfSERSOgotCQkJCWFoID0gaGNpX2FjbF9oZHIoaDQtPnJ4X3NrYik7Ci0JCQkJZGxlbiA9IF9fbGUxNl90b19jcHUoYWgtPmRsZW4pOwotCi0JCQkJQlRfREJHKCJBQ0wgaGVhZGVyOiBkbGVuICVkIiwgZGxlbik7Ci0KLQkJCQloNF9jaGVja19kYXRhX2xlbihoNCwgZGxlbik7Ci0JCQkJY29udGludWU7Ci0KLQkJCWNhc2UgSDRfVzRfU0NPX0hEUjoKLQkJCQlzaCA9IGhjaV9zY29faGRyKGg0LT5yeF9za2IpOwotCi0JCQkJQlRfREJHKCJTQ08gaGVhZGVyOiBkbGVuICVkIiwgc2gtPmRsZW4pOwotCi0JCQkJaDRfY2hlY2tfZGF0YV9sZW4oaDQsIHNoLT5kbGVuKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCS8qIEg0X1c0X1BBQ0tFVF9UWVBFICovCi0JCXN3aXRjaCAoKnB0cikgewotCQljYXNlIEhDSV9FVkVOVF9QS1Q6Ci0JCQlCVF9EQkcoIkV2ZW50IHBhY2tldCIpOwotCQkJaDQtPnJ4X3N0YXRlID0gSDRfVzRfRVZFTlRfSERSOwotCQkJaDQtPnJ4X2NvdW50ID0gSENJX0VWRU5UX0hEUl9TSVpFOwotCQkJdHlwZSA9IEhDSV9FVkVOVF9QS1Q7Ci0JCQlicmVhazsKLQotCQljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKLQkJCUJUX0RCRygiQUNMIHBhY2tldCIpOwotCQkJaDQtPnJ4X3N0YXRlID0gSDRfVzRfQUNMX0hEUjsKLQkJCWg0LT5yeF9jb3VudCA9IEhDSV9BQ0xfSERSX1NJWkU7Ci0JCQl0eXBlID0gSENJX0FDTERBVEFfUEtUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBIQ0lfU0NPREFUQV9QS1Q6Ci0JCQlCVF9EQkcoIlNDTyBwYWNrZXQiKTsKLQkJCWg0LT5yeF9zdGF0ZSA9IEg0X1c0X1NDT19IRFI7Ci0JCQloNC0+cnhfY291bnQgPSBIQ0lfU0NPX0hEUl9TSVpFOwotCQkJdHlwZSA9IEhDSV9TQ09EQVRBX1BLVDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlCVF9FUlIoIlVua25vd24gSENJIHBhY2tldCB0eXBlICUyLjJ4IiwgKF9fdTgpKnB0cik7Ci0JCQlodS0+aGRldi0+c3RhdC5lcnJfcngrKzsKLQkJCXB0cisrOyBjb3VudC0tOwotCQkJY29udGludWU7Ci0JCX07Ci0KLQkJcHRyKys7IGNvdW50LS07Ci0KLQkJLyogQWxsb2NhdGUgcGFja2V0ICovCi0JCWg0LT5yeF9za2IgPSBidF9za2JfYWxsb2MoSENJX01BWF9GUkFNRV9TSVpFLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFoNC0+cnhfc2tiKSB7Ci0JCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbSBmb3IgbmV3IHBhY2tldCIpOwotCQkJaDQtPnJ4X3N0YXRlID0gSDRfVzRfUEFDS0VUX1RZUEU7Ci0JCQloNC0+cnhfY291bnQgPSAwOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQloNC0+cnhfc2tiLT5kZXYgPSAodm9pZCAqKSBodS0+aGRldjsKLQkJYnRfY2IoaDQtPnJ4X3NrYiktPnBrdF90eXBlID0gdHlwZTsKLQl9CisJaWYgKGhjaV9yZWN2X3N0cmVhbV9mcmFnbWVudChodS0+aGRldiwgZGF0YSwgY291bnQpIDwgMCkKKwkJQlRfRVJSKCJGcmFtZSBSZWFzc2VtYmx5IEZhaWxlZCIpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMjcyLDcgKzE3Myw3IEBACiAJLmZsdXNoCQk9IGg0X2ZsdXNoLAogfTsKIAotaW50IGg0X2luaXQodm9pZCkKK2ludCBfX2luaXQgaDRfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmaDRwKTsKIApAQCAtMjg0LDcgKzE4NSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGg0X2RlaW5pdCh2b2lkKQoraW50IF9fZXhpdCBoNF9kZWluaXQodm9pZCkKIHsKIAlyZXR1cm4gaGNpX3VhcnRfdW5yZWdpc3Rlcl9wcm90bygmaDRwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKaW5kZXggNzZhMWFiYi4uOTk4ODMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKQEAgLTIxMCw3ICsyMTAsNiBAQAogc3RhdGljIGludCBoY2lfdWFydF9zZW5kX2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGhjaV9kZXYqIGhkZXYgPSAoc3RydWN0IGhjaV9kZXYgKikgc2tiLT5kZXY7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlzdHJ1Y3QgaGNpX3VhcnQgKmh1OwogCiAJaWYgKCFoZGV2KSB7CkBAIC0yMjIsNyArMjIxLDYgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWh1ID0gKHN0cnVjdCBoY2lfdWFydCAqKSBoZGV2LT5kcml2ZXJfZGF0YTsKLQl0dHkgPSBodS0+dHR5OwogCiAJQlRfREJHKCIlczogdHlwZSAlZCBsZW4gJWQiLCBoZGV2LT5uYW1lLCBidF9jYihza2IpLT5wa3RfdHlwZSwgc2tiLT5sZW4pOwogCkBAIC0zOTcsNiArMzk1LDkgQEAKIAlpZiAoIXJlc2V0KQogCQlzZXRfYml0KEhDSV9RVUlSS19OT19SRVNFVCwgJmhkZXYtPnF1aXJrcyk7CiAKKwlpZiAodGVzdF9iaXQoSENJX1VBUlRfUkFXX0RFVklDRSwgJmh1LT5oZGV2X2ZsYWdzKSkKKwkJc2V0X2JpdChIQ0lfUVVJUktfUkFXX0RFVklDRSwgJmhkZXYtPnF1aXJrcyk7CisKIAlpZiAoaGNpX3JlZ2lzdGVyX2RldihoZGV2KSA8IDApIHsKIAkJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBIQ0kgZGV2aWNlIik7CiAJCWhjaV9mcmVlX2RldihoZGV2KTsKQEAgLTQ3Nyw2ICs0NzgsMTUgQEAKIAkJCXJldHVybiBodS0+aGRldi0+aWQ7CiAJCXJldHVybiAtRVVOQVRDSDsKIAorCWNhc2UgSENJVUFSVFNFVEZMQUdTOgorCQlpZiAodGVzdF9iaXQoSENJX1VBUlRfUFJPVE9fU0VULCAmaHUtPmZsYWdzKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWh1LT5oZGV2X2ZsYWdzID0gYXJnOworCQlicmVhazsKKworCWNhc2UgSENJVUFSVEdFVEZMQUdTOgorCQlyZXR1cm4gaHUtPmhkZXZfZmxhZ3M7CisKIAlkZWZhdWx0OgogCQllcnIgPSBuX3R0eV9pb2N0bF9oZWxwZXIodHR5LCBmaWxlLCBjbWQsIGFyZyk7CiAJCWJyZWFrOwpAQCAtNTQyLDYgKzU1Miw5IEBACiAjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfTEwKIAlsbF9pbml0KCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9BVEgzSworCWF0aF9pbml0KCk7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtNTU5LDYgKzU3Miw5IEBACiAjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfTEwKIAlsbF9kZWluaXQoKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0FUSDNLCisJYXRoX2RlaW5pdCgpOworI2VuZGlmCiAKIAkvKiBSZWxlYXNlIHR0eSByZWdpc3RyYXRpb24gb2YgbGluZSBkaXNjaXBsaW5lICovCiAJaWYgKChlcnIgPSB0dHlfdW5yZWdpc3Rlcl9sZGlzYyhOX0hDSSkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xsLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGwuYwppbmRleCBmYjg0NDVjLi4zODU5NWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGwuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGwuYwpAQCAtNzQsNyArNzQsNyBAQAogCiBzdHJ1Y3QgaGNpbGxfY21kIHsKIAl1OCBjbWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxsX3N0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyByeF9zdGF0ZTsKQEAgLTUxNyw3ICs1MTcsNyBAQAogCS5mbHVzaAkJPSBsbF9mbHVzaCwKIH07CiAKLWludCBsbF9pbml0KHZvaWQpCitpbnQgX19pbml0IGxsX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJmxscCk7CiAKQEAgLTUyOSw3ICs1MjksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBsbF9kZWluaXQodm9pZCkKK2ludCBfX2V4aXQgbGxfZGVpbml0KHZvaWQpCiB7CiAJcmV0dXJuIGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oJmxscCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaAppbmRleCA1MDExM2RiLi45OWZiMzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmgKQEAgLTMxLDE1ICszMSwyMCBAQAogI2RlZmluZSBIQ0lVQVJUU0VUUFJPVE8JCV9JT1coJ1UnLCAyMDAsIGludCkKICNkZWZpbmUgSENJVUFSVEdFVFBST1RPCQlfSU9SKCdVJywgMjAxLCBpbnQpCiAjZGVmaW5lIEhDSVVBUlRHRVRERVZJQ0UJX0lPUignVScsIDIwMiwgaW50KQorI2RlZmluZSBIQ0lVQVJUU0VURkxBR1MJCV9JT1coJ1UnLCAyMDMsIGludCkKKyNkZWZpbmUgSENJVUFSVEdFVEZMQUdTCQlfSU9SKCdVJywgMjA0LCBpbnQpCiAKIC8qIFVBUlQgcHJvdG9jb2xzICovCi0jZGVmaW5lIEhDSV9VQVJUX01BWF9QUk9UTwk1CisjZGVmaW5lIEhDSV9VQVJUX01BWF9QUk9UTwk2CiAKICNkZWZpbmUgSENJX1VBUlRfSDQJMAogI2RlZmluZSBIQ0lfVUFSVF9CQ1NQCTEKICNkZWZpbmUgSENJX1VBUlRfM1dJUkUJMgogI2RlZmluZSBIQ0lfVUFSVF9INERTCTMKICNkZWZpbmUgSENJX1VBUlRfTEwJNAorI2RlZmluZSBIQ0lfVUFSVF9BVEgzSwk1CisKKyNkZWZpbmUgSENJX1VBUlRfUkFXX0RFVklDRQkwCiAKIHN0cnVjdCBoY2lfdWFydDsKIApAQCAtNTcsNiArNjIsNyBAQAogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJc3RydWN0IGhjaV9kZXYJCSpoZGV2OwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXVuc2lnbmVkIGxvbmcJCWhkZXZfZmxhZ3M7CiAKIAlzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8JKnByb3RvOwogCXZvaWQJCQkqcHJpdjsKQEAgLTY2LDcgKzcyLDcgQEAKIAlzcGlubG9ja190CQlyeF9sb2NrOwogfTsKIAotLyogSENJX1VBUlQgZmxhZyBiaXRzICovCisvKiBIQ0lfVUFSVCBwcm90byBmbGFnIGJpdHMgKi8KICNkZWZpbmUgSENJX1VBUlRfUFJPVE9fU0VUCTAKIAogLyogVFggc3RhdGVzICAqLwpAQCAtOTEsMyArOTcsOCBAQAogaW50IGxsX2luaXQodm9pZCk7CiBpbnQgbGxfZGVpbml0KHZvaWQpOwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9BVEgzSworaW50IGF0aF9pbml0KHZvaWQpOworaW50IGF0aF9kZWluaXQodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jCmluZGV4IGFhMTA5Y2IuLmQ2MDdmNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYwpAQCAtMzcyLDYgKzM3MiwxNyBAQAogCWJyaWRnZS0+Y2FwbmR4ID0gY2FwX3B0cjsKIAogCS8qCisJKiBJZiB0aGUgZGV2aWNlIGhhcyBub3QgYmVlbiBwcm9wZXJseSBzZXR1cCwgdGhlIGZvbGxvd2luZyB3aWxsIGNhdGNoCisJKiB0aGUgcHJvYmxlbSBhbmQgc2hvdWxkIHN0b3AgdGhlIHN5c3RlbSBmcm9tIGNyYXNoaW5nLgorCSogMjAwMzA2MTAgLSBoYW1pc2hAem90Lm9yZworCSovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBFbmFibGUgUENJIGRldmljZVxuIik7CisJCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCiAJKiBUaGUgZm9sbG93aW5nIGZpeGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBCSU9TIGhhcyAiZm9yZ290dGVuIiB0bwogCSogcHJvdmlkZSBhbiBhZGRyZXNzIHJhbmdlIGZvciB0aGUgR0FSVC4KIAkqIDIwMDMwNjEwIC0gaGFtaXNoQHpvdC5vcmcKQEAgLTM4NSwxNyArMzk2LDYgQEAKIAkJfQogCX0KIAotCS8qCi0JKiBJZiB0aGUgZGV2aWNlIGhhcyBub3QgYmVlbiBwcm9wZXJseSBzZXR1cCwgdGhlIGZvbGxvd2luZyB3aWxsIGNhdGNoCi0JKiB0aGUgcHJvYmxlbSBhbmQgc2hvdWxkIHN0b3AgdGhlIHN5c3RlbSBmcm9tIGNyYXNoaW5nLgotCSogMjAwMzA2MTAgLSBoYW1pc2hAem90Lm9yZwotCSovCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBFbmFibGUgUENJIGRldmljZVxuIik7Ci0JCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KIAlpZiAoY2FwX3B0cikgewogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCmluZGV4IGQ4MzZhNzEuLmRkZjVkZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtODE2LDkgKzgxNiw5IEBACiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01DMl9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9JUk9OTEFLRV9NX0lHLAogCSAgICAiSEQgR3JhcGhpY3MiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfSUcsCi0JICAgICJTYW5keWJyaWRnZSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCBOVUxMLCAmaW50ZWxfZ2VuNl9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfTV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9NX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKKwkgICAgIlNhbmR5YnJpZGdlIiwgTlVMTCwgJmludGVsX2dlbjZfZHJpdmVyIH0sCiAJeyAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH0KIH07CiAKQEAgLTkwOCw2ICs5MDgsMTcgQEAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW50ZWwgJXMgQ2hpcHNldFxuIiwgaW50ZWxfYWdwX2NoaXBzZXRzW2ldLm5hbWUpOwogCiAJLyoKKwkqIElmIHRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHByb3Blcmx5IHNldHVwLCB0aGUgZm9sbG93aW5nIHdpbGwgY2F0Y2gKKwkqIHRoZSBwcm9ibGVtIGFuZCBzaG91bGQgc3RvcCB0aGUgc3lzdGVtIGZyb20gY3Jhc2hpbmcuCisJKiAyMDAzMDYxMCAtIGhhbWlzaEB6b3Qub3JnCisJKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgogCSogVGhlIGZvbGxvd2luZyBmaXhlcyB0aGUgY2FzZSB3aGVyZSB0aGUgQklPUyBoYXMgImZvcmdvdHRlbiIgdG8KIAkqIHByb3ZpZGUgYW4gYWRkcmVzcyByYW5nZSBmb3IgdGhlIEdBUlQuCiAJKiAyMDAzMDYxMCAtIGhhbWlzaEB6b3Qub3JnCkBAIC05MjEsMTcgKzkzMiw2IEBACiAJCX0KIAl9CiAKLQkvKgotCSogSWYgdGhlIGRldmljZSBoYXMgbm90IGJlZW4gcHJvcGVybHkgc2V0dXAsIHRoZSBmb2xsb3dpbmcgd2lsbCBjYXRjaAotCSogdGhlIHByb2JsZW0gYW5kIHNob3VsZCBzdG9wIHRoZSBzeXN0ZW0gZnJvbSBjcmFzaGluZy4KLQkqIDIwMDMwNjEwIC0gaGFtaXNoQHpvdC5vcmcKLQkqLwotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgUENJIGRldmljZVxuIik7Ci0JCWFncF9wdXRfYnJpZGdlKGJyaWRnZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCS8qIEZpbGwgaW4gdGhlIG1vZGUgcmVnaXN0ZXIgKi8KIAlpZiAoY2FwX3B0cikgewogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmggYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oCmluZGV4IDI1NDc0NjUuLmMwNWUzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmgKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaApAQCAtNjAsNiArNjAsMTIgQEAKICNkZWZpbmUgSTgxMF9QVEVfTE9DQUwJCTB4MDAwMDAwMDIKICNkZWZpbmUgSTgxMF9QVEVfVkFMSUQJCTB4MDAwMDAwMDEKICNkZWZpbmUgSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRCAgMHgwMDAwMDAwNgorLyogR1QgUFRFIGNhY2hlIGNvbnRyb2wgZmllbGRzICovCisjZGVmaW5lIEdFTjZfUFRFX1VOQ0FDSEVECTB4MDAwMDAwMDIKKyNkZWZpbmUgR0VONl9QVEVfTExDCQkweDAwMDAwMDA0CisjZGVmaW5lIEdFTjZfUFRFX0xMQ19NTEMJMHgwMDAwMDAwNgorI2RlZmluZSBHRU42X1BURV9HRkRUCQkweDAwMDAwMDA4CisKICNkZWZpbmUgSTgxMF9TTVJBTV9NSVNDQwkweDcwCiAjZGVmaW5lIEk4MTBfR0ZYX01FTV9XSU5fU0laRQkweDAwMDEwMDAwCiAjZGVmaW5lIEk4MTBfR0ZYX01FTV9XSU5fMzJNCTB4MDAwMTAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCmluZGV4IGE3NTQ3MTUuLmQyMmZmYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwpAQCAtMjUsNiArMjUsMTAgQEAKICNkZWZpbmUgVVNFX1BDSV9ETUFfQVBJIDEKICNlbmRpZgogCisvKiBNYXggYW1vdW50IG9mIHN0b2xlbiBzcGFjZSwgYW55dGhpbmcgYWJvdmUgd2lsbCBiZSByZXR1cm5lZCB0byBMaW51eCAqLworaW50IGludGVsX21heF9zdG9sZW4gPSAzMiAqIDEwMjQgKiAxMDI0OworRVhQT1JUX1NZTUJPTChpbnRlbF9tYXhfc3RvbGVuKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhcGVyX3NpemVfaW5mb19maXhlZCBpbnRlbF9pODEwX3NpemVzW10gPQogewogCXs2NCwgMTYzODQsIDR9LApAQCAtMTA0LDcgKzEwOCw3IEBACiAJREJHKCJ0cnkgbWFwcGluZyAlbHUgcGFnZXNcbiIsICh1bnNpZ25lZCBsb25nKW1lbS0+cGFnZV9jb3VudCk7CiAKIAlpZiAoc2dfYWxsb2NfdGFibGUoJnN0LCBtZW0tPnBhZ2VfY291bnQsIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnI7CiAKIAltZW0tPnNnX2xpc3QgPSBzZyA9IHN0LnNnbDsKIApAQCAtMTEzLDExICsxMTcsMTQgQEAKIAogCW1lbS0+bnVtX3NnID0gcGNpX21hcF9zZyhpbnRlbF9wcml2YXRlLnBjaWRldiwgbWVtLT5zZ19saXN0LAogCQkJCSBtZW0tPnBhZ2VfY291bnQsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JaWYgKHVubGlrZWx5KCFtZW0tPm51bV9zZykpIHsKLQkJaW50ZWxfYWdwX2ZyZWVfc2dsaXN0KG1lbSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAodW5saWtlbHkoIW1lbS0+bnVtX3NnKSkKKwkJZ290byBlcnI7CisKIAlyZXR1cm4gMDsKKworZXJyOgorCXNnX2ZyZWVfdGFibGUoJnN0KTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfYWdwX3VubWFwX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtKQpAQCAtMTc2LDcgKzE4Myw3IEBACiAJaWYgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfSEIgfHwKIAkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9NX0hCKQogCXsKLQkJY2FjaGVfYml0cyA9IEk4MzBfUFRFX1NZU1RFTV9DQUNIRUQ7CisJCWNhY2hlX2JpdHMgPSBHRU42X1BURV9MTENfTUxDOwogCX0KIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKQEAgLTcxMCw3ICs3MTcsMTIgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChndHRfZW50cmllcyA+IDApIHsKKwlpZiAoIWxvY2FsICYmIGd0dF9lbnRyaWVzID4gaW50ZWxfbWF4X3N0b2xlbikgeworCQlkZXZfaW5mbygmYWdwX2JyaWRnZS0+ZGV2LT5kZXYsCisJCQkgImRldGVjdGVkICVkSyBzdG9sZW4gbWVtb3J5LCB0cmltbWluZyB0byAlZEtcbiIsCisJCQkgZ3R0X2VudHJpZXMgLyBLQigxKSwgaW50ZWxfbWF4X3N0b2xlbiAvIEtCKDEpKTsKKwkJZ3R0X2VudHJpZXMgPSBpbnRlbF9tYXhfc3RvbGVuIC8gS0IoNCk7CisJfSBlbHNlIGlmIChndHRfZW50cmllcyA+IDApIHsKIAkJZGV2X2luZm8oJmFncF9icmlkZ2UtPmRldi0+ZGV2LCAiZGV0ZWN0ZWQgJWRLICVzIG1lbW9yeVxuIiwKIAkJICAgICAgIGd0dF9lbnRyaWVzIC8gS0IoMSksIGxvY2FsID8gImxvY2FsIiA6ICJzdG9sZW4iKTsKIAkJZ3R0X2VudHJpZXMgLz0gS0IoNCk7CkBAIC03OTcsNiArODA5LDEwIEBACiAKIAkvKiB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgTU1JTyBiYXNlIGFkZHJlc3MgaXMga25vd24gKi8KIAlpbnRlbF9pODMwX2luaXRfZ3R0X2VudHJpZXMoKTsKKwlpZiAoaW50ZWxfcHJpdmF0ZS5ndHRfZW50cmllcyA9PSAwKSB7CisJCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlID0gTlVMTDsKIApAQCAtMTI4Miw2ICsxMjk4LDExIEBACiAKIAkvKiB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgTU1JTyBiYXNlIGFkZHJlc3MgaXMga25vd24gKi8KIAlpbnRlbF9pODMwX2luaXRfZ3R0X2VudHJpZXMoKTsKKwlpZiAoaW50ZWxfcHJpdmF0ZS5ndHRfZW50cmllcyA9PSAwKSB7CisJCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5ndHQpOworCQlpb3VubWFwKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJYWdwX2JyaWRnZS0+Z2F0dF90YWJsZSA9IE5VTEw7CiAKQEAgLTEzMDksNiArMTMzMCwxNiBAQAogCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzW3R5cGVdLm1hc2s7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludGVsX2dlbjZfbWFza19tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCQkgICAgZG1hX2FkZHJfdCBhZGRyLCBpbnQgdHlwZSkKK3sKKwkvKiBTaGlmdCBoaWdoIGJpdHMgZG93biAqLworCWFkZHIgfD0gKGFkZHIgPj4gMjgpICYgMHhmZjsKKworCS8qIFR5cGUgY2hlY2tpbmcgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSAqLworCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzW3R5cGVdLm1hc2s7Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX2k5NjVfZ2V0X2d0dF9yYW5nZShpbnQgKmd0dF9vZmZzZXQsIGludCAqZ3R0X3NpemUpCiB7CiAJdTE2IHNuYl9nbWNoX2N0bDsKQEAgLTEzOTAsNiArMTQyMSwxMSBAQAogCiAJLyogd2UgaGF2ZSB0byBjYWxsIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUgYWZ0ZXIgdGhlIE1NSU8gYmFzZSBhZGRyZXNzIGlzIGtub3duICovCiAJaW50ZWxfaTgzMF9pbml0X2d0dF9lbnRyaWVzKCk7CisJaWYgKGludGVsX3ByaXZhdGUuZ3R0X2VudHJpZXMgPT0gMCkgeworCQlpb3VubWFwKGludGVsX3ByaXZhdGUuZ3R0KTsKKwkJaW91bm1hcChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWFncF9icmlkZ2UtPmdhdHRfdGFibGUgPSBOVUxMOwogCkBAIC0xNTE3LDYgKzE1NTMsMzkgQEAKICNlbmRpZgogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9nZW42X2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9pODMwX3NpemVzLAorCS5zaXplX3R5cGUJCT0gRklYRURfQVBFUl9TSVpFLAorCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSA0LAorCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSB0cnVlLAorCS5jb25maWd1cmUJCT0gaW50ZWxfaTl4eF9jb25maWd1cmUsCisJLmZldGNoX3NpemUJCT0gaW50ZWxfaTl4eF9mZXRjaF9zaXplLAorCS5jbGVhbnVwCQk9IGludGVsX2k5MTVfY2xlYW51cCwKKwkubWFza19tZW1vcnkJCT0gaW50ZWxfZ2VuNl9tYXNrX21lbW9yeSwKKwkubWFza3MJCQk9IGludGVsX2k4MTBfbWFza3MsCisJLmFncF9lbmFibGUJCT0gaW50ZWxfaTgxMF9hZ3BfZW5hYmxlLAorCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCisJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gaW50ZWxfaTk2NV9jcmVhdGVfZ2F0dF90YWJsZSwKKwkuZnJlZV9nYXR0X3RhYmxlCT0gaW50ZWxfaTgzMF9mcmVlX2dhdHRfdGFibGUsCisJLmluc2VydF9tZW1vcnkJCT0gaW50ZWxfaTkxNV9pbnNlcnRfZW50cmllcywKKwkucmVtb3ZlX21lbW9yeQkJPSBpbnRlbF9pOTE1X3JlbW92ZV9lbnRyaWVzLAorCS5hbGxvY19ieV90eXBlCQk9IGludGVsX2k4MzBfYWxsb2NfYnlfdHlwZSwKKwkuZnJlZV9ieV90eXBlCQk9IGludGVsX2k4MTBfZnJlZV9ieV90eXBlLAorCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMgICAgICAgID0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCisJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUJPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAorCS5jaGlwc2V0X2ZsdXNoCQk9IGludGVsX2k5MTVfY2hpcHNldF9mbHVzaCwKKyNpZmRlZiBVU0VfUENJX0RNQV9BUEkKKwkuYWdwX21hcF9wYWdlCQk9IGludGVsX2FncF9tYXBfcGFnZSwKKwkuYWdwX3VubWFwX3BhZ2UJCT0gaW50ZWxfYWdwX3VubWFwX3BhZ2UsCisJLmFncF9tYXBfbWVtb3J5CQk9IGludGVsX2FncF9tYXBfbWVtb3J5LAorCS5hZ3BfdW5tYXBfbWVtb3J5CT0gaW50ZWxfYWdwX3VubWFwX21lbW9yeSwKKyNlbmRpZgorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9nMzNfZHJpdmVyID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmFwZXJ0dXJlX3NpemVzCQk9IGludGVsX2k4MzBfc2l6ZXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYnNyLmMgYi9kcml2ZXJzL2NoYXIvYnNyLmMKaW5kZXggODlkODcxZS4uOTE5MTcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2Jzci5jCisrKyBiL2RyaXZlcnMvY2hhci9ic3IuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCmluZGV4IDM1Y2NhNGMuLmZhMjdkMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjb25zb2xlIGh2Y19jb25fZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBjb25zb2xlIGh2Y19jb25zb2xlID0gewogCS5uYW1lCQk9ICJodmMiLAogCS53cml0ZQkJPSBodmNfY29uc29sZV9wcmludCwKIAkuZGV2aWNlCQk9IGh2Y19jb25zb2xlX2RldmljZSwKQEAgLTIyMCw3ICsyMjAsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25zb2xlKTsKIAlyZXR1cm4gMDsKIH0KIGNvbnNvbGVfaW5pdGNhbGwoaHZjX2NvbnNvbGVfaW5pdCk7CkBAIC0yNzYsOCArMjc2LDggQEAKIAkgKiBub3cgKHNldHVwIHdvbid0IGZhaWwgYXQgdGhpcyBwb2ludCkuICBJdCdzIG9rIHRvIGp1c3QKIAkgKiBjYWxsIHJlZ2lzdGVyIGFnYWluIGlmIHByZXZpb3VzbHkgLnNldHVwIGZhaWxlZC4KIAkgKi8KLQlpZiAoaW5kZXggPT0gaHZjX2Nvbl9kcml2ZXIuaW5kZXgpCi0JCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKKwlpZiAoaW5kZXggPT0gaHZjX2NvbnNvbGUuaW5kZXgpCisJCXJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25zb2xlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQxLDcgKzY0MSw3IEBACiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQotCQkJaWYgKGhwLT5pbmRleCA9PSBodmNfY29uX2RyaXZlci5pbmRleCkgeworCQkJaWYgKGhwLT5pbmRleCA9PSBodmNfY29uc29sZS5pbmRleCkgewogCQkJCS8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLwogCQkJCS8qIFhYWCBzaG91bGQgc3VwcG9ydCBhIHNlcXVlbmNlICovCiAJCQkJaWYgKGJ1ZltpXSA9PSAnXHgwZicpIHsJLyogXk8gKi8KQEAgLTkwOSw3ICs5MDksNyBAQAogCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaHZjX2RyaXZlcik7CiAJCS8qIHJldHVybiB0dHlfc3RydWN0IGluc3RhbmNlcyBhbGxvY2F0ZWQgaW4gaHZjX2luaXQoKS4gKi8KIAkJcHV0X3R0eV9kcml2ZXIoaHZjX2RyaXZlcik7Ci0JCXVucmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCQl1bnJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25zb2xlKTsKIAl9CiB9CiBtb2R1bGVfZXhpdChodmNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZzaS5jIGIvZHJpdmVycy9jaGFyL2h2c2kuYwppbmRleCBkNGIxNGZmLi4xZjRiNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZzaS5jCisrKyBiL2RyaXZlcnMvY2hhci9odnNpLmMKQEAgLTEyNTUsNyArMTI1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBodnNpX2Nvbl9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgaHZzaV9jb25zb2xlID0gewogCS5uYW1lCQk9ICJodnNpIiwKIAkud3JpdGUJCT0gaHZzaV9jb25zb2xlX3ByaW50LAogCS5kZXZpY2UJCT0gaHZzaV9jb25zb2xlX2RldmljZSwKQEAgLTEzMDgsNyArMTMwOCw3IEBACiAJfQogCiAJaWYgKGh2c2lfY291bnQpCi0JCXJlZ2lzdGVyX2NvbnNvbGUoJmh2c2lfY29uX2RyaXZlcik7CisJCXJlZ2lzdGVyX2NvbnNvbGUoJmh2c2lfY29uc29sZSk7CiAJcmV0dXJuIDA7CiB9CiBjb25zb2xlX2luaXRjYWxsKGh2c2lfY29uc29sZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCmluZGV4IDBmOWNiZjEuLjdhNGYwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAKIHN0YXRpYyBpbnQgbjJybmdfZGF0YV9yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpCiB7Ci0Jc3RydWN0IG4ycm5nICpucCA9IChzdHJ1Y3QgbjJybmcgKikgcm5nLT5wcml2OworCXN0cnVjdCBuMnJuZyAqbnAgPSBybmctPnByaXY7CiAJdW5zaWduZWQgbG9uZyByYSA9IF9fcGEoJm5wLT50ZXN0X2RhdGEpOwogCWludCBsZW47CiAKQEAgLTc2MiwxMiArNzYyLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG4ycm5nX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZuMnJuZ19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbjJybmdfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG4ycm5nX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmbjJybmdfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbjJybmdfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobjJybmdfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCmluZGV4IDU0MTA5ZGMuLjI1YmUyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCisrKyBiL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jCkBAIC0xMzE1LDEwICsxMzE1LDE0IEBACiAJaWYgKHRlc3RfYml0KEVWX1NORCwgZGV2LT5ldmJpdCkpCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKHRlc3RfYml0KEVWX0tFWSwgZGV2LT5ldmJpdCkpCisJaWYgKHRlc3RfYml0KEVWX0tFWSwgZGV2LT5ldmJpdCkpIHsKIAkJZm9yIChpID0gS0VZX1JFU0VSVkVEOyBpIDwgQlROX01JU0M7IGkrKykKIAkJCWlmICh0ZXN0X2JpdChpLCBkZXYtPmtleWJpdCkpCiAJCQkJcmV0dXJuIHRydWU7CisJCWZvciAoaSA9IEtFWV9CUkxfRE9UMTsgaSA8PSBLRVlfQlJMX0RPVDEwOyBpKyspCisJCQlpZiAodGVzdF9iaXQoaSwgZGV2LT5rZXliaXQpKQorCQkJCXJldHVybiB0cnVlOworCX0KIAogCXJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCBmNTRkYWI4Li5hMzk4ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC05MTYsNyArOTE2LDcgQEAKIAkJCSAgICAgIE5VTEwsIGRldmxpc3RbbWlub3JdLm5hbWUpOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiB0dHlfaW5pdCgpOwogfQogCiBmc19pbml0Y2FsbChjaHJfZGV2X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwMDBfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDAwX2NzLmMKaW5kZXggZTc5NTZhYy4uZWM3M2Q5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwMDBfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDAwMF9jcy5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtNDIyLDcgKzQyMSw3IEBACiBzdGF0aWMgdm9pZCBzZXRfY2FyZHBhcmFtZXRlcihzdHJ1Y3QgY200MDAwX2RldiAqZGV2KQogewogCWludCBpOwotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBkZXYtPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJdW5zaWduZWQgaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAl1X2ludDhfdCBzdG9wYml0cyA9IDB4MDI7IC8qIElTTyBkZWZhdWx0ICovCiAKIAlERUJVR1AoMywgZGV2LCAiLT4gc2V0X2NhcmRwYXJhbWV0ZXJcbiIpOwpAQCAtNDU1LDcgKzQ1NCw3IEBACiAJdW5zaWduZWQgc2hvcnQgbnVtX2J5dGVzX3JlYWQ7CiAJdW5zaWduZWQgY2hhciBwdHNfcmVwbHlbNF07CiAJc3NpemVfdCByYzsKLQl1bnNpZ25lZCBpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBkZXYtPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlyYyA9IDA7CiAKQEAgLTY2NCw3ICs2NjMsNyBAQAogc3RhdGljIHZvaWQgbW9uaXRvcl9jYXJkKHVuc2lnbmVkIGxvbmcgcCkKIHsKIAlzdHJ1Y3QgY200MDAwX2RldiAqZGV2ID0gKHN0cnVjdCBjbTQwMDBfZGV2ICopIHA7Ci0JdW5zaWduZWQgaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXVuc2lnbmVkIHNob3J0IHM7CiAJc3RydWN0IHB0c3JlcSBwdHNyZXE7CiAJaW50IGksIGF0cmM7CkBAIC05MjUsNyArOTI0LDcgQEAKIAkJCWxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgY200MDAwX2RldiAqZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBkZXYtPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJdW5zaWduZWQgaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAlzc2l6ZV90IHJjOwogCWludCBpLCBqLCBrOwogCkBAIC0xMDQ4LDcgKzEwNDcsNyBAQAogCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBjbTQwMDBfZGV2ICpkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwl1bnNpZ25lZCBpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXVuc2lnbmVkIHNob3J0IHM7CiAJdW5zaWduZWQgY2hhciB0bXA7CiAJdW5zaWduZWQgY2hhciBpbmZvbGVuOwpAQCAtMTQwMSw3ICsxNDAwLDcgQEAKIHN0YXRpYyBsb25nIGNtbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGNtNDAwMF9kZXYgKmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCXVuc2lnbmVkIGludCBpb2Jhc2UgPSBkZXYtPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbms7CiAJaW50IHNpemU7CkBAIC0xNzUyLDE3ICsxNzUxLDEyIEBACiAJaWYgKCFjZmctPmlvLm53aW4pCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogR2V0IHRoZSBJT2FkZHIgKi8KLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2ZnLT5pby53aW5bMF0ubGVuOwotCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCWlmICghKGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQlpZiAoIShjZmctPmlvLmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZmctPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2ZnLT5pby53aW5bMF0ubGVuOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gcGNtY2lhX2lvX2NmZ19kYXRhX3dpZHRoKGNmZy0+aW8uZmxhZ3MpOworCXBfZGV2LT5pb19saW5lcyA9IGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKIAotCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIGludCBjbTQwMDBfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICogbGluaywgaW50IGRldm5vKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDQwX2NzLmMKaW5kZXggYzA3NzVjOC4uODE1Y2RlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDA0MF9jcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC0xMTAsNyArMTA5LDcgQEAKIHN0YXRpYyB2b2lkIGNtNDA0MF9kb19wb2xsKHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7CiAJc3RydWN0IHJlYWRlcl9kZXYgKmRldiA9IChzdHJ1Y3QgcmVhZGVyX2RldiAqKSBkdW1teTsKLQl1bnNpZ25lZCBpbnQgb2JzID0geGluYihkZXYtPnBfZGV2LT5pby5CYXNlUG9ydDEKKwl1bnNpZ25lZCBpbnQgb2JzID0geGluYihkZXYtPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQKIAkJCQkrIFJFR19PRkZTRVRfQlVGRkVSX1NUQVRVUyk7CiAKIAlpZiAoKG9icyAmIEJTUl9CVUxLX0lOX0ZVTEwpKSB7CkBAIC0xNDEsNyArMTQwLDcgQEAKIHN0YXRpYyBpbnQgd2FpdF9mb3JfYnVsa19vdXRfcmVhZHkoc3RydWN0IHJlYWRlcl9kZXYgKmRldikKIHsKIAlpbnQgaSwgcmM7Ci0JaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwlpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJZm9yIChpID0gMDsgaSA8IFBPTExfTE9PUF9DT1VOVDsgaSsrKSB7CiAJCWlmICgoeGluYihpb2Jhc2UgKyBSRUdfT0ZGU0VUX0JVRkZFUl9TVEFUVVMpCkBAIC0xNzEsNyArMTcwLDcgQEAKIC8qIFdyaXRlIHRvIFN5bmMgQ29udHJvbCBSZWdpc3RlciAqLwogc3RhdGljIGludCB3cml0ZV9zeW5jX3JlZyh1bnNpZ25lZCBjaGFyIHZhbCwgc3RydWN0IHJlYWRlcl9kZXYgKmRldikKIHsKLQlpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+aW8uQmFzZVBvcnQxOworCWludCBpb2Jhc2UgPSBkZXYtPnBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJaW50IHJjOwogCiAJcmMgPSB3YWl0X2Zvcl9idWxrX291dF9yZWFkeShkZXYpOwpAQCAtMTg5LDcgKzE4OCw3IEBACiBzdGF0aWMgaW50IHdhaXRfZm9yX2J1bGtfaW5fcmVhZHkoc3RydWN0IHJlYWRlcl9kZXYgKmRldikKIHsKIAlpbnQgaSwgcmM7Ci0JaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwlpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJZm9yIChpID0gMDsgaSA8IFBPTExfTE9PUF9DT1VOVDsgaSsrKSB7CiAJCWlmICgoeGluYihpb2Jhc2UgKyBSRUdfT0ZGU0VUX0JVRkZFUl9TVEFUVVMpCkBAIC0yMTksNyArMjE4LDcgQEAKIAkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCByZWFkZXJfZGV2ICpkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPmlvLkJhc2VQb3J0MTsKKwlpbnQgaW9iYXNlID0gZGV2LT5wX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXNpemVfdCBieXRlc190b19yZWFkOwogCXVuc2lnbmVkIGxvbmcgaTsKIAlzaXplX3QgbWluX2J5dGVzX3RvX3JlYWQ7CkBAIC0zMjEsNyArMzIwLDcgQEAKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgcmVhZGVyX2RldiAqZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWludCBpb2Jhc2UgPSBkZXYtPnBfZGV2LT5pby5CYXNlUG9ydDE7CisJaW50IGlvYmFzZSA9IGRldi0+cF9kZXYtPnJlc291cmNlWzBdLT5zdGFydDsKIAlzc2l6ZV90IHJjOwogCWludCBpOwogCXVuc2lnbmVkIGludCBieXRlc190b193cml0ZTsKQEAgLTUyOCwxNiArNTI3LDEyIEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogR2V0IHRoZSBJT2FkZHIgKi8KLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2ZnLT5pby53aW5bMF0ubGVuOwotCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCWlmICghKGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQlpZiAoIShjZmctPmlvLmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZmctPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2ZnLT5pby53aW5bMF0ubGVuOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gcGNtY2lhX2lvX2NmZ19kYXRhX3dpZHRoKGNmZy0+aW8uZmxhZ3MpOworCXBfZGV2LT5pb19saW5lcyA9IGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwlyYyA9IHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIAotCXJjID0gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOwogCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcF9kZXYtPmRldiwKIAkJICAgInBjbWNpYV9yZXF1ZXN0X2lvIHJldHVybmVkIDB4JXhcbiIsIHJjKTsKIAlyZXR1cm4gcmM7CkBAIC01NDksMTAgKzU0NCw2IEBACiAJc3RydWN0IHJlYWRlcl9kZXYgKmRldjsKIAlpbnQgZmFpbF9yYzsKIAotCWxpbmstPmlvLkJhc2VQb3J0MiA9IDA7Ci0JbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IDA7Ci0KIAlpZiAocGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIGNtNDA0MF9jb25maWdfY2hlY2ssIE5VTEwpKQogCQlnb3RvIGNzX3JlbGVhc2U7CiAKQEAgLTU2OCw4ICs1NTksOCBAQAogCiAJZGV2ID0gbGluay0+cHJpdjsKIAotCURFQlVHUCgyLCBkZXYsICJkZXZpY2UgIiBERVZJQ0VfTkFNRSAiJWQgYXQgMHglLjR4LTB4JS40eFxuIiwgZGV2bm8sCi0JICAgICAgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxKTsKKwlERUJVR1AoMiwgZGV2LCAiZGV2aWNlICIgREVWSUNFX05BTUUgIiVkIGF0ICVwUlxuIiwgZGV2bm8sCisJICAgICAgbGluay0+cmVzb3VyY2VbMF0pOwogCURFQlVHUCgyLCBkZXYsICI8LSByZWFkZXJfY29uZmlnIChzdWNjKVxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9tYWluLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5jCmluZGV4IDYzYzMyZTMuLjY3YmRiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9tYWluLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL21haW4uYwpAQCAtODQsMjMgKzg0LDIyIEBACiB7CiAJc3RydWN0IGlwd19kZXYgKmlwdyA9IHByaXZfZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvX3Jlc291cmNlOwotCW1lbXJlcV90IG1lbXJlcV9hdHRyX21lbW9yeTsKLQltZW1yZXFfdCBtZW1yZXFfY29tbW9uX21lbW9yeTsKIAlpbnQgcmV0OwogCi0JcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmZy0+aW8ud2luWzBdLmJhc2U7Ci0JcF9kZXYtPmlvLk51bVBvcnRzMSA9IGNmZy0+aW8ud2luWzBdLmxlbjsKLQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZmctPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2ZnLT5pby53aW5bMF0ubGVuOwogCiAJLyogMHg0MCBjYXVzZXMgaXQgdG8gZ2VuZXJhdGUgbGV2ZWwgbW9kZSBpbnRlcnJ1cHRzLiAqLwogCS8qIDB4MDQgZW5hYmxlcyBJUkVRIHBpbi4gKi8KIAlwX2Rldi0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXggfCAweDQ0OwotCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwlwX2Rldi0+aW9fbGluZXMgPSAxNjsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhwX2Rldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlvX3Jlc291cmNlID0gcmVxdWVzdF9yZWdpb24ocF9kZXYtPmlvLkJhc2VQb3J0MSwgcF9kZXYtPmlvLk51bVBvcnRzMSwKKwlpb19yZXNvdXJjZSA9IHJlcXVlc3RfcmVnaW9uKHBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShwX2Rldi0+cmVzb3VyY2VbMF0pLAogCQkJCUlQV0lSRUxFU1NfUENDQVJEX05BTUUpOwogCiAJaWYgKGNmZy0+bWVtLm53aW4gPT0gMCkKQEAgLTEyMCwxMSArMTE5LDggQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXhpdDE7CiAKLQltZW1yZXFfY29tbW9uX21lbW9yeS5DYXJkT2Zmc2V0ID0gY2ZnLT5tZW0ud2luWzBdLmNhcmRfYWRkcjsKLQltZW1yZXFfY29tbW9uX21lbW9yeS5QYWdlID0gMDsKLQogCXJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UocF9kZXYsIGlwdy0+aGFuZGxlX2NvbW1vbl9tZW1vcnksCi0JCQkJJm1lbXJlcV9jb21tb25fbWVtb3J5KTsKKwkJCQljZmctPm1lbS53aW5bMF0uY2FyZF9hZGRyKTsKIAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBleGl0MjsKQEAgLTE0OSwxMiArMTQ1LDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXhpdDI7CiAKLQltZW1yZXFfYXR0cl9tZW1vcnkuQ2FyZE9mZnNldCA9IDA7Ci0JbWVtcmVxX2F0dHJfbWVtb3J5LlBhZ2UgPSAwOwotCi0JcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShwX2RldiwgaXB3LT5oYW5kbGVfYXR0cl9tZW1vcnksCi0JCQkJJm1lbXJlcV9hdHRyX21lbW9yeSk7Ci0KKwlyZXQgPSBwY21jaWFfbWFwX21lbV9wYWdlKHBfZGV2LCBpcHctPmhhbmRsZV9hdHRyX21lbW9yeSwgMCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGV4aXQzOwogCkBAIC0xNjYsMTUgKzE1NywxMiBAQAogCXJldHVybiAwOwogCiBleGl0MzoKLQlwY21jaWFfcmVsZWFzZV93aW5kb3cocF9kZXYsIGlwdy0+aGFuZGxlX2F0dHJfbWVtb3J5KTsKIGV4aXQyOgogCWlmIChpcHctPmNvbW1vbl9tZW1vcnkpIHsKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKGlwdy0+cmVxdWVzdF9jb21tb25fbWVtb3J5LkJhc2UsCiAJCQkJaXB3LT5yZXF1ZXN0X2NvbW1vbl9tZW1vcnkuU2l6ZSk7CiAJCWlvdW5tYXAoaXB3LT5jb21tb25fbWVtb3J5KTsKLQkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KHBfZGV2LCBpcHctPmhhbmRsZV9jb21tb25fbWVtb3J5KTsKLQl9IGVsc2UKLQkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KHBfZGV2LCBpcHctPmhhbmRsZV9jb21tb25fbWVtb3J5KTsKKwl9CiBleGl0MToKIAlyZWxlYXNlX3Jlc291cmNlKGlvX3Jlc291cmNlKTsKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UocF9kZXYpOwpAQCAtMTk3LDcgKzE4NSw3IEBACiAKIAlJTklUX1dPUksoJmlwdy0+d29ya19yZWJvb3QsIHNpZ25hbGxlZF9yZWJvb3Rfd29yayk7CiAKLQlpcHdpcmVsZXNzX2luaXRfaGFyZHdhcmVfdjEoaXB3LT5oYXJkd2FyZSwgbGluay0+aW8uQmFzZVBvcnQxLAorCWlwd2lyZWxlc3NfaW5pdF9oYXJkd2FyZV92MShpcHctPmhhcmR3YXJlLCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQsCiAJCQkJICAgIGlwdy0+YXR0cl9tZW1vcnksIGlwdy0+Y29tbW9uX21lbW9yeSwKIAkJCQkgICAgaXB3LT5pc192Ml9jYXJkLCBzaWduYWxsZWRfcmVib290X2NhbGxiYWNrLAogCQkJCSAgICBpcHcpOwpAQCAtMjA5LDEwICsxOTcsNyBAQAogCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRSAiOiBDYXJkIHR5cGUgJXNcbiIsCiAJCQlpcHctPmlzX3YyX2NhcmQgPyAiVjIvVjMiIDogIlYxIik7CiAJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCi0JCQkiOiBJL08gcG9ydHMgMHglMDR4LTB4JTA0eCwgaXJxICVkXG4iLAotCQkJKHVuc2lnbmVkIGludCkgbGluay0+aW8uQmFzZVBvcnQxLAotCQkJKHVuc2lnbmVkIGludCkgKGxpbmstPmlvLkJhc2VQb3J0MSArCi0JCQkJbGluay0+aW8uTnVtUG9ydHMxIC0gMSksCisJCSI6IEkvTyBwb3J0cyAlcFIsIGlycSAlZFxuIiwgbGluay0+cmVzb3VyY2VbMF0sCiAJCQkodW5zaWduZWQgaW50KSBsaW5rLT5pcnEpOwogCWlmIChpcHctPmF0dHJfbWVtb3J5ICYmIGlwdy0+Y29tbW9uX21lbW9yeSkKIAkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCkBAIC0yNTAsMTMgKzIzNSwxMiBAQAogCQlyZWxlYXNlX21lbV9yZWdpb24oaXB3LT5yZXF1ZXN0X2F0dHJfbWVtb3J5LkJhc2UsCiAJCQkJaXB3LT5yZXF1ZXN0X2F0dHJfbWVtb3J5LlNpemUpOwogCQlpb3VubWFwKGlwdy0+YXR0cl9tZW1vcnkpOwotCQlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluaywgaXB3LT5oYW5kbGVfYXR0cl9tZW1vcnkpOworCiAJfQogCWlmIChpcHctPmNvbW1vbl9tZW1vcnkpIHsKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKGlwdy0+cmVxdWVzdF9jb21tb25fbWVtb3J5LkJhc2UsCiAJCQkJaXB3LT5yZXF1ZXN0X2NvbW1vbl9tZW1vcnkuU2l6ZSk7CiAJCWlvdW5tYXAoaXB3LT5jb21tb25fbWVtb3J5KTsKLQkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmssIGlwdy0+aGFuZGxlX2NvbW1vbl9tZW1vcnkpOwogCX0KIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CiAJcmV0dXJuIC0xOwpAQCAtMjc0LDExICsyNTgsNiBAQAogCQkJCWlwdy0+cmVxdWVzdF9hdHRyX21lbW9yeS5TaXplKTsKIAkJaW91bm1hcChpcHctPmF0dHJfbWVtb3J5KTsKIAl9Ci0JaWYgKGlwdy0+Y29tbW9uX21lbW9yeSkKLQkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGlwdy0+bGluaywgaXB3LT5oYW5kbGVfY29tbW9uX21lbW9yeSk7Ci0JaWYgKGlwdy0+YXR0cl9tZW1vcnkpCi0JCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhpcHctPmxpbmssIGlwdy0+aGFuZGxlX2F0dHJfbWVtb3J5KTsKLQogCXBjbWNpYV9kaXNhYmxlX2RldmljZShpcHctPmxpbmspOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5oIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL21haW4uaAppbmRleCA5NmQwZWYzLi5jMjA3YmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5oCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9tYWluLmgKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmggYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmgKaW5kZXggNGRhNmMyMC4uM2UxNjNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5oCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuaApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwppbmRleCAzMDg5MDNlLi45ZWNkNmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC03MCw3ICs3MCw2IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaGRsYy5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTU3MiwxOCArNTcxLDE1IEBACiAJCQkgIHVuc2lnbmVkIGludCB2Y2MsCiAJCQkgIHZvaWQgKnByaXZfZGF0YSkKIHsKLQlpZiAoY2ZnLT5pby5ud2luID4gMCkgewotCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJaWYgKCEoY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEoY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGNmZy0+aW8ud2luWzBdLmxlbjsKLQkJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKLQl9Ci0JcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFjZmctPmlvLm53aW4pCisJCXJldHVybiAtRU5PREVWOworCisJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmZy0+aW8ud2luWzBdLmJhc2U7CisJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBjZmctPmlvLndpblswXS5sZW47CisJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PSBwY21jaWFfaW9fY2ZnX2RhdGFfd2lkdGgoY2ZnLT5pby5mbGFncyk7CisJcF9kZXYtPmlvX2xpbmVzID0gY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIGludCBtZ3NscGNfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQpAQCAtNjEwLDE2ICs2MDYsMTUgQEAKICAgICBpZiAocmV0KQogCSAgICBnb3RvIGZhaWxlZDsKIAotICAgIGluZm8tPmlvX2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgaW5mby0+aW9fYmFzZSA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKICAgICBpbmZvLT5pcnFfbGV2ZWwgPSBsaW5rLT5pcnE7CiAKICAgICBkZXZfaW5mbygmbGluay0+ZGV2LCAiaW5kZXggMHglMDJ4OiIsCiAJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOwogICAgIGlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJICAgIHByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEpOwotICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JICAgIHByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCQkgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworICAgIGlmIChsaW5rLT5yZXNvdXJjZVswXSkKKwkgICAgcHJpbnRrKCIsIGlvICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKICAgICBwcmludGsoIlxuIik7CiAgICAgcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCA4ZDg1NTg3Li5jYWVmMzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC00MDcsOCArNDA3LDggQEAKIAlzdHJ1Y3QgcG9vbGluZm8gKnBvb2xpbmZvOwogCV9fdTMyICpwb29sOwogCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IGxpbWl0OwogCXN0cnVjdCBlbnRyb3B5X3N0b3JlICpwdWxsOworCWludCBsaW1pdDsKIAogCS8qIHJlYWQtd3JpdGUgZGF0YTogKi8KIAlzcGlubG9ja190IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCmluZGV4IDQ1NjFjZTIuLjMzNGNmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCkBAIC00ODQ1LDcgKzQ4NDUsNyBAQAogewogCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwYXR0ZXJuc1tdID0KIAkJezB4MDAwMCwgMHhmZmZmLCAweGFhYWEsIDB4NTU1NSwgMHg2OTY5LCAweDk2OTZ9OwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnQgPSBzaXplb2YocGF0dGVybnMpL3NpemVvZihwYXR0ZXJuc1swXSk7CisJc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IEFSUkFZX1NJWkUocGF0dGVybnMpOwogCXVuc2lnbmVkIGludCBpOwogCWludCByYyA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW8uYyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwppbmRleCBkNzFmMGZjLi41MDc0NDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCkBAIC0zMTI4LDcgKzMxMjgsNyBAQAogICogT2ssIG5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgdHR5IGRldmljZXMgYW5kIGNhbiBjb3VudAogICogb24gbWVtb3J5IGFsbG9jYXRpb25zLCBpbnRlcnJ1cHRzIGV0Yy4uCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHR0eV9pbml0KHZvaWQpCitpbnQgX19pbml0IHR0eV9pbml0KHZvaWQpCiB7CiAJY2Rldl9pbml0KCZ0dHlfY2RldiwgJnR0eV9mb3BzKTsKIAlpZiAoY2Rldl9hZGQoJnR0eV9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDApLCAxKSB8fApAQCAtMzE0OSw0ICszMTQ5LDQgQEAKICNlbmRpZgogCXJldHVybiAwOwogfQotbW9kdWxlX2luaXQodHR5X2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDdjZGI2ZWUuLjRhOWViMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC0xMDQsNiArMTA0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgva2RiLmg+CiAKICNkZWZpbmUgTUFYX05SX0NPTl9EUklWRVIgMTYKIApAQCAtMTg3LDEwICsxODgsMTUgQEAKICAqIGZnX2NvbnNvbGUgaXMgdGhlIGN1cnJlbnQgdmlydHVhbCBjb25zb2xlLAogICogbGFzdF9jb25zb2xlIGlzIHRoZSBsYXN0IHVzZWQgb25lLAogICogd2FudF9jb25zb2xlIGlzIHRoZSBjb25zb2xlIHdlIHdhbnQgdG8gc3dpdGNoIHRvLAorICogc2F2ZWRfKiB2YXJpYW50cyBhcmUgZm9yIHNhdmUvcmVzdG9yZSBhcm91bmQga2VybmVsIGRlYnVnZ2VyIGVudGVyL2xlYXZlCiAgKi8KIGludCBmZ19jb25zb2xlOwogaW50IGxhc3RfY29uc29sZTsKIGludCB3YW50X2NvbnNvbGUgPSAtMTsKK2ludCBzYXZlZF9mZ19jb25zb2xlOworaW50IHNhdmVkX2xhc3RfY29uc29sZTsKK2ludCBzYXZlZF93YW50X2NvbnNvbGU7CitpbnQgc2F2ZWRfdmNfbW9kZTsKIAogLyoKICAqIEZvciBlYWNoIGV4aXN0aW5nIGRpc3BsYXksIHdlIGhhdmUgYSBwb2ludGVyIHRvIGNvbnNvbGUgY3VycmVudGx5IHZpc2libGUKQEAgLTM0MTQsNiArMzQyMCw3OCBAQAogRVhQT1JUX1NZTUJPTChjb25faXNfYm91bmQpOwogCiAvKioKKyAqIGNvbl9kZWJ1Z19lbnRlciAtIHByZXBhcmUgdGhlIGNvbnNvbGUgZm9yIHRoZSBrZXJuZWwgZGVidWdnZXIKKyAqIEBzdzogY29uc29sZSBkcml2ZXIKKyAqCisgKiBDYWxsZWQgd2hlbiB0aGUgY29uc29sZSBpcyB0YWtlbiBvdmVyIGJ5IHRoZSBrZXJuZWwgZGVidWdnZXIsIHRoaXMKKyAqIGZ1bmN0aW9uIG5lZWRzIHRvIHNhdmUgdGhlIGN1cnJlbnQgY29uc29sZSBzdGF0ZSwgdGhlbiBwdXQgdGhlIGNvbnNvbGUKKyAqIGludG8gYSBzdGF0ZSBzdWl0YWJsZSBmb3IgdGhlIGtlcm5lbCBkZWJ1Z2dlci4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBvbiBzdWNjZXNzLCBub256ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBwcmVwYXJlCisgKiB0aGUgY29uc29sZSBmb3IgdGhlIGRlYnVnZ2VyLgorICovCitpbnQgY29uX2RlYnVnX2VudGVyKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNhdmVkX2ZnX2NvbnNvbGUgPSBmZ19jb25zb2xlOworCXNhdmVkX2xhc3RfY29uc29sZSA9IGxhc3RfY29uc29sZTsKKwlzYXZlZF93YW50X2NvbnNvbGUgPSB3YW50X2NvbnNvbGU7CisJc2F2ZWRfdmNfbW9kZSA9IHZjLT52Y19tb2RlOworCXZjLT52Y19tb2RlID0gS0RfVEVYVDsKKwljb25zb2xlX2JsYW5rZWQgPSAwOworCWlmICh2Yy0+dmNfc3ctPmNvbl9kZWJ1Z19lbnRlcikKKwkJcmV0ID0gdmMtPnZjX3N3LT5jb25fZGVidWdfZW50ZXIodmMpOworI2lmZGVmIENPTkZJR19LR0RCX0tEQgorCS8qIFNldCB0aGUgaW5pdGlhbCBMSU5FUyB2YXJpYWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQgKi8KKwlpZiAodmMtPnZjX3Jvd3MgPCA5OTkpIHsKKwkJaW50IGxpbmVjb3VudDsKKwkJY2hhciBsbnNbNF07CisJCWNvbnN0IGNoYXIgKnNldGFyZ3NbM10gPSB7CisJCQkic2V0IiwKKwkJCSJMSU5FUyIsCisJCQlsbnMsCisJCX07CisJCWlmIChrZGJnZXRpbnRlbnYoc2V0YXJnc1swXSwgJmxpbmVjb3VudCkpIHsKKwkJCXNucHJpbnRmKGxucywgNCwgIiVpIiwgdmMtPnZjX3Jvd3MpOworCQkJa2RiX3NldCgyLCBzZXRhcmdzKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfS0dEQl9LREIgKi8KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29uX2RlYnVnX2VudGVyKTsKKworLyoqCisgKiBjb25fZGVidWdfbGVhdmUgLSByZXN0b3JlIGNvbnNvbGUgc3RhdGUKKyAqIEBzdzogY29uc29sZSBkcml2ZXIKKyAqCisgKiBSZXN0b3JlIHRoZSBjb25zb2xlIHN0YXRlIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSB0aGUga2VybmVsIGRlYnVnZ2VyCisgKiB3YXMgaW52b2tlZC4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBvbiBzdWNjZXNzLCBub256ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byByZXN0b3JlCisgKiB0aGUgY29uc29sZS4KKyAqLworaW50IGNvbl9kZWJ1Z19sZWF2ZSh2b2lkKQoreworCXN0cnVjdCB2Y19kYXRhICp2YzsKKwlpbnQgcmV0ID0gMDsKKworCWZnX2NvbnNvbGUgPSBzYXZlZF9mZ19jb25zb2xlOworCWxhc3RfY29uc29sZSA9IHNhdmVkX2xhc3RfY29uc29sZTsKKwl3YW50X2NvbnNvbGUgPSBzYXZlZF93YW50X2NvbnNvbGU7CisJdmNfY29uc1tmZ19jb25zb2xlXS5kLT52Y19tb2RlID0gc2F2ZWRfdmNfbW9kZTsKKworCXZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOworCWlmICh2Yy0+dmNfc3ctPmNvbl9kZWJ1Z19sZWF2ZSkKKwkJcmV0ID0gdmMtPnZjX3N3LT5jb25fZGVidWdfbGVhdmUodmMpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb25fZGVidWdfbGVhdmUpOworCisvKioKICAqIHJlZ2lzdGVyX2Nvbl9kcml2ZXIgLSByZWdpc3RlciBjb25zb2xlIGRyaXZlciB0byBjb25zb2xlIGxheWVyCiAgKiBAY3N3OiBjb25zb2xlIGRyaXZlcgogICogQGZpcnN0OiB0aGUgZmlyc3QgY29uc29sZSB0byB0YWtlIG92ZXIsIG1pbmltdW0gdmFsdWUgaXMgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggOTM4Yjc0ZS4uMTk5ZGNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC0yOSw2ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KKwogI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19DT1JFLCBcCiAJCQkJCQkiY3B1ZnJlcS1jb3JlIiwgbXNnKQogCkBAIC02OCw3ICs3MCw3IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJ3X3NlbWFwaG9yZSwgY3B1X3BvbGljeV9yd3NlbSk7CiAKICNkZWZpbmUgbG9ja19wb2xpY3lfcndzZW0obW9kZSwgY3B1KQkJCQkJXAotaW50IGxvY2tfcG9saWN5X3J3c2VtXyMjbW9kZQkJCQkJCVwKK3N0YXRpYyBpbnQgbG9ja19wb2xpY3lfcndzZW1fIyNtb2RlCQkJCQlcCiAoaW50IGNwdSkJCQkJCQkJCVwKIHsJCQkJCQkJCQlcCiAJaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KGNwdWZyZXFfcG9saWN5X2NwdSwgY3B1KTsJCVwKQEAgLTgzLDI2ICs4NSwyMiBAQAogfQogCiBsb2NrX3BvbGljeV9yd3NlbShyZWFkLCBjcHUpOwotRVhQT1JUX1NZTUJPTF9HUEwobG9ja19wb2xpY3lfcndzZW1fcmVhZCk7CiAKIGxvY2tfcG9saWN5X3J3c2VtKHdyaXRlLCBjcHUpOwotRVhQT1JUX1NZTUJPTF9HUEwobG9ja19wb2xpY3lfcndzZW1fd3JpdGUpOwogCi12b2lkIHVubG9ja19wb2xpY3lfcndzZW1fcmVhZChpbnQgY3B1KQorc3RhdGljIHZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKGludCBjcHUpCiB7CiAJaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KGNwdWZyZXFfcG9saWN5X2NwdSwgY3B1KTsKIAlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CiAJdXBfcmVhZCgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQpOwogCi12b2lkIHVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSkKK3N0YXRpYyB2b2lkIHVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSkKIHsKIAlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUoY3B1ZnJlcV9wb2xpY3lfY3B1LCBjcHUpOwogCUJVR19PTihwb2xpY3lfY3B1ID09IC0xKTsKIAl1cF93cml0ZSgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKTsKIAogCiAvKiBpbnRlcm5hbCBwcm90b3R5cGVzICovCkBAIC0zNTQsNiArMzUyLDkgQEAKIAogCWNhc2UgQ1BVRlJFUV9QT1NUQ0hBTkdFOgogCQlhZGp1c3RfamlmZmllcyhDUFVGUkVRX1BPU1RDSEFOR0UsIGZyZXFzKTsKKwkJZHByaW50aygiRlJFUTogJWx1IC0gQ1BVOiAlbHUiLCAodW5zaWduZWQgbG9uZylmcmVxcy0+bmV3LAorCQkJKHVuc2lnbmVkIGxvbmcpZnJlcXMtPmNwdSk7CisJCXRyYWNlX3Bvd2VyX2ZyZXF1ZW5jeShQT1dFUl9QU1RBVEUsIGZyZXFzLT5uZXcsIGZyZXFzLT5jcHUpOwogCQlzcmN1X25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdWZyZXFfdHJhbnNpdGlvbl9ub3RpZmllcl9saXN0LAogCQkJCUNQVUZSRVFfUE9TVENIQU5HRSwgZnJlcXMpOwogCQlpZiAobGlrZWx5KHBvbGljeSkgJiYgbGlrZWx5KHBvbGljeS0+Y3B1ID09IGZyZXFzLT5jcHUpKQpAQCAtMTg3NSw4ICsxODc2LDcgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fcmVmZGF0YSBjcHVmcmVxX2NwdV9ub3RpZmllciA9Ci17CitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fcmVmZGF0YSBjcHVmcmVxX2NwdV9ub3RpZmllciA9IHsKICAgICAubm90aWZpZXJfY2FsbCA9IGNwdWZyZXFfY3B1X2NhbGxiYWNrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKaW5kZXggZTEzMTQyMS4uN2I1MDkzNjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKQEAgLTQ1OSw2ICs0NTksMTcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIHN5c2ZzIGVuZCAqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyB2b2lkIGRic19mcmVxX2luY3JlYXNlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcCwgdW5zaWduZWQgaW50IGZyZXEpCit7CisJaWYgKGRic190dW5lcnNfaW5zLnBvd2Vyc2F2ZV9iaWFzKQorCQlmcmVxID0gcG93ZXJzYXZlX2JpYXNfdGFyZ2V0KHAsIGZyZXEsIENQVUZSRVFfUkVMQVRJT05fSCk7CisJZWxzZSBpZiAocC0+Y3VyID09IHAtPm1heCkKKwkJcmV0dXJuOworCisJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocCwgZnJlcSwgZGJzX3R1bmVyc19pbnMucG93ZXJzYXZlX2JpYXMgPworCQkJQ1BVRlJFUV9SRUxBVElPTl9MIDogQ1BVRlJFUV9SRUxBVElPTl9IKTsKK30KKwogc3RhdGljIHZvaWQgZGJzX2NoZWNrX2NwdShzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKnRoaXNfZGJzX2luZm8pCiB7CiAJdW5zaWduZWQgaW50IG1heF9sb2FkX2ZyZXE7CkBAIC01NTEsMTkgKzU2Miw3IEBACiAKIAkvKiBDaGVjayBmb3IgZnJlcXVlbmN5IGluY3JlYXNlICovCiAJaWYgKG1heF9sb2FkX2ZyZXEgPiBkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQgKiBwb2xpY3ktPmN1cikgewotCQkvKiBpZiB3ZSBhcmUgYWxyZWFkeSBhdCBmdWxsIHNwZWVkIHRoZW4gYnJlYWsgb3V0IGVhcmx5ICovCi0JCWlmICghZGJzX3R1bmVyc19pbnMucG93ZXJzYXZlX2JpYXMpIHsKLQkJCWlmIChwb2xpY3ktPmN1ciA9PSBwb2xpY3ktPm1heCkKLQkJCQlyZXR1cm47Ci0KLQkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgcG9saWN5LT5tYXgsCi0JCQkJQ1BVRlJFUV9SRUxBVElPTl9IKTsKLQkJfSBlbHNlIHsKLQkJCWludCBmcmVxID0gcG93ZXJzYXZlX2JpYXNfdGFyZ2V0KHBvbGljeSwgcG9saWN5LT5tYXgsCi0JCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7Ci0JCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksIGZyZXEsCi0JCQkJQ1BVRlJFUV9SRUxBVElPTl9MKTsKLQkJfQorCQlkYnNfZnJlcV9pbmNyZWFzZShwb2xpY3ksIHBvbGljeS0+bWF4KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjEwLDcgKzYwOSw5IEBACiAJLyogV2Ugd2FudCBhbGwgQ1BVcyB0byBkbyBzYW1wbGluZyBuZWFybHkgb24gc2FtZSBqaWZmeSAqLwogCWludCBkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSk7CiAKLQlkZWxheSAtPSBqaWZmaWVzICUgZGVsYXk7CisJaWYgKG51bV9vbmxpbmVfY3B1cygpID4gMSkKKwkJZGVsYXkgLT0gamlmZmllcyAlIGRlbGF5OworCiAJbXV0ZXhfbG9jaygmZGJzX2luZm8tPnRpbWVyX211dGV4KTsKIAogCS8qIENvbW1vbiBOT1JNQUxfU0FNUExFIHNldHVwICovCkBAIC02MzUsNyArNjM2LDkgQEAKIHsKIAkvKiBXZSB3YW50IGFsbCBDUFVzIHRvIGRvIHNhbXBsaW5nIG5lYXJseSBvbiBzYW1lIGppZmZ5ICovCiAJaW50IGRlbGF5ID0gdXNlY3NfdG9famlmZmllcyhkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19yYXRlKTsKLQlkZWxheSAtPSBqaWZmaWVzICUgZGVsYXk7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxKQorCQlkZWxheSAtPSBqaWZmaWVzICUgZGVsYXk7CiAKIAlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfTk9STUFMX1NBTVBMRTsKIAlJTklUX0RFTEFZRURfV09SS19ERUZFUlJBQkxFKCZkYnNfaW5mby0+d29yaywgZG9fZGJzX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCmluZGV4IDE5OTQ4ODUuLmRiZWZlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwpAQCAtOTUsNyArOTUsNyBAQAogCS8qIGdpdmUgdGhlIGdvdmVybm9yIGFuIG9wcG9ydHVuaXR5IHRvIHJlZmxlY3Qgb24gdGhlIG91dGNvbWUgKi8KIAlpZiAoY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KQogCQljcHVpZGxlX2N1cnJfZ292ZXJub3ItPnJlZmxlY3QoZGV2KTsKLQl0cmFjZV9wb3dlcl9lbmQoMCk7CisJdHJhY2VfcG93ZXJfZW5kKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vYW1jYy9jcnlwdG80eHhfcmVnX2RlZi5oIGIvZHJpdmVycy9jcnlwdG8vYW1jYy9jcnlwdG80eHhfcmVnX2RlZi5oCmluZGV4IDdkNGVkYjAuLjVmNWZiYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2FtY2MvY3J5cHRvNHh4X3JlZ19kZWYuaAorKysgYi9kcml2ZXJzL2NyeXB0by9hbWNjL2NyeXB0bzR4eF9yZWdfZGVmLmgKQEAgLTExMyw3ICsxMTMsNyBAQAogI2RlZmluZSBDUllQVE80WFhfUFJOR19MRlNSX0gJCQkweDAwMDcwMDM0CiAKIC8qKgotICogSW5pdGlsaXplIENSWVBUTyBFTkdJTkUgcmVnaXN0ZXJzLCBhbmQgbWVtb3J5IGJhc2VzLgorICogSW5pdGlhbGl6ZSBDUllQVE8gRU5HSU5FIHJlZ2lzdGVycywgYW5kIG1lbW9yeSBiYXNlcy4KICAqLwogI2RlZmluZSBQUEM0WFhfUERSX1BPTEwJCQkJMHgzZmYKICNkZWZpbmUgUFBDNFhYX09VVFBVVF9USFJFU0hPTEQJCQkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9nZW9kZS1hZXMuYyBiL2RyaXZlcnMvY3J5cHRvL2dlb2RlLWFlcy5jCmluZGV4IDA5Mzg5ZGQuLjIxOWQwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2dlb2RlLWFlcy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2dlb2RlLWFlcy5jCkBAIC01NzMsNyArNTczLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGdlb2RlX2Flc190YmxbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9MWF9BRVMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9ICwKKwl7IFBDSV9WREVWSUNFKEFNRCwgUENJX0RFVklDRV9JRF9BTURfTFhfQUVTKSwgfSAsCiAJeyAwLCB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9oaWZuXzc5NXguYyBiL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCmluZGV4IDE2ZmNlM2EuLmU0NDlhYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCkBAIC0yMDE4LDcgKzIwMTgsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXE7Ci0Jc3RydWN0IGhpZm5fY29udGV4dCAqY3R4OwogCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3QgaGlmbl9kbWEgKmRtYSA9IChzdHJ1Y3QgaGlmbl9kbWEgKilkZXYtPmRlc2NfdmlydDsKIAlpbnQgaTsKQEAgLTIwMzUsNyArMjAzNCw2IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKChhc3luY19yZXEgPSBjcnlwdG9fZGVxdWV1ZV9yZXF1ZXN0KCZkZXYtPnF1ZXVlKSkpIHsKLQkJY3R4ID0gY3J5cHRvX3RmbV9jdHgoYXN5bmNfcmVxLT50Zm0pOwogCQlyZXEgPSBjb250YWluZXJfb2YoYXN5bmNfcmVxLCBzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0LCBiYXNlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTIxMzksNyArMjEzNyw2IEBACiBzdGF0aWMgaW50IGhpZm5fcHJvY2Vzc19xdWV1ZShzdHJ1Y3QgaGlmbl9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmFzeW5jX3JlcSwgKmJhY2tsb2c7Ci0Jc3RydWN0IGhpZm5fY29udGV4dCAqY3R4OwogCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAwOwpAQCAtMjE1Niw3ICsyMTUzLDYgQEAKIAkJaWYgKGJhY2tsb2cpCiAJCQliYWNrbG9nLT5jb21wbGV0ZShiYWNrbG9nLCAtRUlOUFJPR1JFU1MpOwogCi0JCWN0eCA9IGNyeXB0b190Zm1fY3R4KGFzeW5jX3JlcS0+dGZtKTsKIAkJcmVxID0gY29udGFpbmVyX29mKGFzeW5jX3JlcSwgc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCwgYmFzZSk7CiAKIAkJZXJyID0gaGlmbl9oYW5kbGVfcmVxKHJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9tdl9jZXNhLmMgYi9kcml2ZXJzL2NyeXB0by9tdl9jZXNhLmMKaW5kZXggZTA5NTQyMi4uN2QyNzllNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vbXZfY2VzYS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL212X2Nlc2EuYwpAQCAtMTA1NSwyMCArMTA1NSwyMCBAQAogCWNwLT5xdWV1ZV90aCA9IGt0aHJlYWRfcnVuKHF1ZXVlX21hbmFnLCBjcCwgIm12X2NyeXB0byIpOwogCWlmIChJU19FUlIoY3AtPnF1ZXVlX3RoKSkgewogCQlyZXQgPSBQVFJfRVJSKGNwLT5xdWV1ZV90aCk7Ci0JCWdvdG8gZXJyX3RocmVhZDsKKwkJZ290byBlcnJfdW5tYXBfc3JhbTsKIAl9CiAKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGNyeXB0b19pbnQsIElSUUZfRElTQUJMRUQsIGRldl9uYW1lKCZwZGV2LT5kZXYpLAogCQkJY3ApOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VubWFwX3NyYW07CisJCWdvdG8gZXJyX3RocmVhZDsKIAogCXdyaXRlbChTRUNfSU5UX0FDQ0VMMF9ET05FLCBjcGctPnJlZyArIFNFQ19BQ0NFTF9JTlRfTUFTSyk7CiAJd3JpdGVsKFNFQ19DRkdfU1RPUF9ESUdfRVJSLCBjcGctPnJlZyArIFNFQ19BQ0NFTF9DRkcpOwogCiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmbXZfYWVzX2FsZ19lY2IpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX3JlZzsKKwkJZ290byBlcnJfaXJxOwogCiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmbXZfYWVzX2FsZ19jYmMpOwogCWlmIChyZXQpCkBAIC0xMDkxLDkgKzEwOTEsOSBAQAogCXJldHVybiAwOwogZXJyX3VucmVnX2VjYjoKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJm12X2Flc19hbGdfZWNiKTsKLWVycl90aHJlYWQ6CitlcnJfaXJxOgogCWZyZWVfaXJxKGlycSwgY3ApOwotZXJyX3JlZzoKK2Vycl90aHJlYWQ6CiAJa3RocmVhZF9zdG9wKGNwLT5xdWV1ZV90aCk7CiBlcnJfdW5tYXBfc3JhbToKIAlpb3VubWFwKGNwLT5zcmFtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL24yX2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL24yX2NvcmUuYwppbmRleCAyMzE2M2ZkLi4yNmFmMmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9uMl9jb3JlLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vbjJfY29yZS5jCkBAIC0yMzksMjEgKzIzOSw1NyBAQAogfQogI2VuZGlmCiAKLXN0cnVjdCBuMl9iYXNlX2N0eCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKK3N0cnVjdCBuMl9haGFzaF9hbGcgeworCXN0cnVjdCBsaXN0X2hlYWQJZW50cnk7CisJY29uc3QgY2hhcgkJKmhhc2hfemVybzsKKwljb25zdCB1MzIJCSpoYXNoX2luaXQ7CisJdTgJCQlod19vcF9oYXNoc3o7CisJdTgJCQlkaWdlc3Rfc2l6ZTsKKwl1OAkJCWF1dGhfdHlwZTsKKwl1OAkJCWhtYWNfdHlwZTsKKwlzdHJ1Y3QgYWhhc2hfYWxnCWFsZzsKIH07CiAKLXN0YXRpYyB2b2lkIG4yX2Jhc2VfY3R4X2luaXQoc3RydWN0IG4yX2Jhc2VfY3R4ICpjdHgpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuMl9haGFzaF9hbGcgKm4yX2FoYXNoX2FsZyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewotCUlOSVRfTElTVF9IRUFEKCZjdHgtPmxpc3QpOworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlzdHJ1Y3QgYWhhc2hfYWxnICphaGFzaF9hbGc7CisKKwlhaGFzaF9hbGcgPSBjb250YWluZXJfb2YoYWxnLCBzdHJ1Y3QgYWhhc2hfYWxnLCBoYWxnLmJhc2UpOworCisJcmV0dXJuIGNvbnRhaW5lcl9vZihhaGFzaF9hbGcsIHN0cnVjdCBuMl9haGFzaF9hbGcsIGFsZyk7Cit9CisKK3N0cnVjdCBuMl9obWFjX2FsZyB7CisJY29uc3QgY2hhcgkJKmNoaWxkX2FsZzsKKwlzdHJ1Y3QgbjJfYWhhc2hfYWxnCWRlcml2ZWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuMl9obWFjX2FsZyAqbjJfaG1hY19hbGcoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7CisJc3RydWN0IGFoYXNoX2FsZyAqYWhhc2hfYWxnOworCisJYWhhc2hfYWxnID0gY29udGFpbmVyX29mKGFsZywgc3RydWN0IGFoYXNoX2FsZywgaGFsZy5iYXNlKTsKKworCXJldHVybiBjb250YWluZXJfb2YoYWhhc2hfYWxnLCBzdHJ1Y3QgbjJfaG1hY19hbGcsIGRlcml2ZWQuYWxnKTsKIH0KIAogc3RydWN0IG4yX2hhc2hfY3R4IHsKLQlzdHJ1Y3QgbjJfYmFzZV9jdHgJCWJhc2U7Ci0KIAlzdHJ1Y3QgY3J5cHRvX2FoYXNoCQkqZmFsbGJhY2tfdGZtOwogfTsKIAorI2RlZmluZSBOMl9IQVNIX0tFWV9NQVgJCQkzMiAvKiBIVyBsaW1pdCBmb3IgYWxsIEhNQUMgcmVxdWVzdHMgKi8KKworc3RydWN0IG4yX2htYWNfY3R4IHsKKwlzdHJ1Y3QgbjJfaGFzaF9jdHgJCWJhc2U7CisKKwlzdHJ1Y3QgY3J5cHRvX3NoYXNoCQkqY2hpbGRfc2hhc2g7CisKKwlpbnQJCQkJaGFzaF9rZXlfbGVuOworCXVuc2lnbmVkIGNoYXIJCQloYXNoX2tleVtOMl9IQVNIX0tFWV9NQVhdOworfTsKKwogc3RydWN0IG4yX2hhc2hfcmVxX2N0eCB7CiAJdW5pb24gewogCQlzdHJ1Y3QgbWQ1X3N0YXRlCW1kNTsKQEAgLTI2MSw5ICsyOTcsNiBAQAogCQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlCXNoYTI1NjsKIAl9IHU7CiAKLQl1bnNpZ25lZCBjaGFyCQkJaGFzaF9rZXlbNjRdOwotCXVuc2lnbmVkIGNoYXIJCQlrZXllZF96ZXJvX2hhc2hbMzJdOwotCiAJc3RydWN0IGFoYXNoX3JlcXVlc3QJCWZhbGxiYWNrX3JlcTsKIH07CiAKQEAgLTM1Niw2ICszODksOTQgQEAKIAljcnlwdG9fZnJlZV9haGFzaChjdHgtPmZhbGxiYWNrX3RmbSk7CiB9CiAKK3N0YXRpYyBpbnQgbjJfaG1hY19jcmFfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWNvbnN0IGNoYXIgKmZhbGxiYWNrX2RyaXZlcl9uYW1lID0gdGZtLT5fX2NydF9hbGctPmNyYV9uYW1lOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKmFoYXNoID0gX19jcnlwdG9fYWhhc2hfY2FzdCh0Zm0pOworCXN0cnVjdCBuMl9obWFjX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eChhaGFzaCk7CisJc3RydWN0IG4yX2htYWNfYWxnICpuMmFsZyA9IG4yX2htYWNfYWxnKHRmbSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqZmFsbGJhY2tfdGZtOworCXN0cnVjdCBjcnlwdG9fc2hhc2ggKmNoaWxkX3NoYXNoOworCWludCBlcnI7CisKKwlmYWxsYmFja190Zm0gPSBjcnlwdG9fYWxsb2NfYWhhc2goZmFsbGJhY2tfZHJpdmVyX25hbWUsIDAsCisJCQkJCSAgQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLKTsKKwlpZiAoSVNfRVJSKGZhbGxiYWNrX3RmbSkpIHsKKwkJcHJfd2FybmluZygiRmFsbGJhY2sgZHJpdmVyICclcycgY291bGQgbm90IGJlIGxvYWRlZCFcbiIsCisJCQkgICBmYWxsYmFja19kcml2ZXJfbmFtZSk7CisJCWVyciA9IFBUUl9FUlIoZmFsbGJhY2tfdGZtKTsKKwkJZ290byBvdXQ7CisJfQorCisJY2hpbGRfc2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2gobjJhbGctPmNoaWxkX2FsZywgMCwgMCk7CisJaWYgKElTX0VSUihjaGlsZF9zaGFzaCkpIHsKKwkJcHJfd2FybmluZygiQ2hpbGQgc2hhc2ggJyVzJyBjb3VsZCBub3QgYmUgbG9hZGVkIVxuIiwKKwkJCSAgIG4yYWxnLT5jaGlsZF9hbGcpOworCQllcnIgPSBQVFJfRVJSKGNoaWxkX3NoYXNoKTsKKwkJZ290byBvdXRfZnJlZV9mYWxsYmFjazsKKwl9CisKKwljcnlwdG9fYWhhc2hfc2V0X3JlcXNpemUoYWhhc2gsIChzaXplb2Yoc3RydWN0IG4yX2hhc2hfcmVxX2N0eCkgKworCQkJCQkgY3J5cHRvX2FoYXNoX3JlcXNpemUoZmFsbGJhY2tfdGZtKSkpOworCisJY3R4LT5jaGlsZF9zaGFzaCA9IGNoaWxkX3NoYXNoOworCWN0eC0+YmFzZS5mYWxsYmFja190Zm0gPSBmYWxsYmFja190Zm07CisJcmV0dXJuIDA7CisKK291dF9mcmVlX2ZhbGxiYWNrOgorCWNyeXB0b19mcmVlX2FoYXNoKGZhbGxiYWNrX3RmbSk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBuMl9obWFjX2NyYV9leGl0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19haGFzaCAqYWhhc2ggPSBfX2NyeXB0b19haGFzaF9jYXN0KHRmbSk7CisJc3RydWN0IG4yX2htYWNfY3R4ICpjdHggPSBjcnlwdG9fYWhhc2hfY3R4KGFoYXNoKTsKKworCWNyeXB0b19mcmVlX2FoYXNoKGN0eC0+YmFzZS5mYWxsYmFja190Zm0pOworCWNyeXB0b19mcmVlX3NoYXNoKGN0eC0+Y2hpbGRfc2hhc2gpOworfQorCitzdGF0aWMgaW50IG4yX2htYWNfYXN5bmNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbSwgY29uc3QgdTggKmtleSwKKwkJCQl1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBuMl9obWFjX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eCh0Zm0pOworCXN0cnVjdCBjcnlwdG9fc2hhc2ggKmNoaWxkX3NoYXNoID0gY3R4LT5jaGlsZF9zaGFzaDsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICpmYWxsYmFja190Zm07CisJc3RydWN0IHsKKwkJc3RydWN0IHNoYXNoX2Rlc2Mgc2hhc2g7CisJCWNoYXIgY3R4W2NyeXB0b19zaGFzaF9kZXNjc2l6ZShjaGlsZF9zaGFzaCldOworCX0gZGVzYzsKKwlpbnQgZXJyLCBicywgZHM7CisKKwlmYWxsYmFja190Zm0gPSBjdHgtPmJhc2UuZmFsbGJhY2tfdGZtOworCWVyciA9IGNyeXB0b19haGFzaF9zZXRrZXkoZmFsbGJhY2tfdGZtLCBrZXksIGtleWxlbik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRlc2Muc2hhc2gudGZtID0gY2hpbGRfc2hhc2g7CisJZGVzYy5zaGFzaC5mbGFncyA9IGNyeXB0b19haGFzaF9nZXRfZmxhZ3ModGZtKSAmCisJCUNSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKworCWJzID0gY3J5cHRvX3NoYXNoX2Jsb2Nrc2l6ZShjaGlsZF9zaGFzaCk7CisJZHMgPSBjcnlwdG9fc2hhc2hfZGlnZXN0c2l6ZShjaGlsZF9zaGFzaCk7CisJQlVHX09OKGRzID4gTjJfSEFTSF9LRVlfTUFYKTsKKwlpZiAoa2V5bGVuID4gYnMpIHsKKwkJZXJyID0gY3J5cHRvX3NoYXNoX2RpZ2VzdCgmZGVzYy5zaGFzaCwga2V5LCBrZXlsZW4sCisJCQkJCSAgY3R4LT5oYXNoX2tleSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlrZXlsZW4gPSBkczsKKwl9IGVsc2UgaWYgKGtleWxlbiA8PSBOMl9IQVNIX0tFWV9NQVgpCisJCW1lbWNweShjdHgtPmhhc2hfa2V5LCBrZXksIGtleWxlbik7CisKKwljdHgtPmhhc2hfa2V5X2xlbiA9IGtleWxlbjsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHdhaXRfZm9yX3RhaWwoc3RydWN0IHNwdV9xdWV1ZSAqcXApCiB7CiAJdW5zaWduZWQgbG9uZyBoZWFkLCBodl9yZXQ7CkBAIC0zODUsMTIgKzUwNiwxMiBAQAogCXJldHVybiBodl9yZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbjJfaGFzaF9hc3luY19kaWdlc3Qoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSwKLQkJCQl1bnNpZ25lZCBpbnQgYXV0aF90eXBlLCB1bnNpZ25lZCBpbnQgZGlnZXN0X3NpemUsCi0JCQkJdW5zaWduZWQgaW50IHJlc3VsdF9zaXplLCB2b2lkICpoYXNoX2xvYykKK3N0YXRpYyBpbnQgbjJfZG9fYXN5bmNfZGlnZXN0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYXV0aF90eXBlLCB1bnNpZ25lZCBpbnQgZGlnZXN0X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0X3NpemUsIHZvaWQgKmhhc2hfbG9jLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhdXRoX2tleSwgdW5zaWduZWQgaW50IGF1dGhfa2V5X2xlbikKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSk7Ci0Jc3RydWN0IG4yX2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fYWhhc2hfY3R4KHRmbSk7CiAJc3RydWN0IGN3cV9pbml0aWFsX2VudHJ5ICplbnQ7CiAJc3RydWN0IGNyeXB0b19oYXNoX3dhbGsgd2FsazsKIAlzdHJ1Y3Qgc3B1X3F1ZXVlICpxcDsKQEAgLTQwMyw2ICs1MjQsNyBAQAogCSAqLwogCWlmICh1bmxpa2VseShyZXEtPm5ieXRlcyA+ICgxIDw8IDE2KSkpIHsKIAkJc3RydWN0IG4yX2hhc2hfcmVxX2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJCXN0cnVjdCBuMl9oYXNoX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eCh0Zm0pOwogCiAJCWFoYXNoX3JlcXVlc3Rfc2V0X3RmbSgmcmN0eC0+ZmFsbGJhY2tfcmVxLCBjdHgtPmZhbGxiYWNrX3RmbSk7CiAJCXJjdHgtPmZhbGxiYWNrX3JlcS5iYXNlLmZsYWdzID0KQEAgLTQxNCw4ICs1MzYsNiBAQAogCQlyZXR1cm4gY3J5cHRvX2FoYXNoX2RpZ2VzdCgmcmN0eC0+ZmFsbGJhY2tfcmVxKTsKIAl9CiAKLQluMl9iYXNlX2N0eF9pbml0KCZjdHgtPmJhc2UpOwotCiAJbmJ5dGVzID0gY3J5cHRvX2hhc2hfd2Fsa19maXJzdChyZXEsICZ3YWxrKTsKIAogCWNwdSA9IGdldF9jcHUoKTsKQEAgLTQzMCwxMyArNTUwLDEzIEBACiAJICovCiAJZW50ID0gcXAtPnEgKyBxcC0+dGFpbDsKIAotCWVudC0+Y29udHJvbCA9IGNvbnRyb2xfd29yZF9iYXNlKG5ieXRlcywgMCwgMCwKKwllbnQtPmNvbnRyb2wgPSBjb250cm9sX3dvcmRfYmFzZShuYnl0ZXMsIGF1dGhfa2V5X2xlbiwgMCwKIAkJCQkJIGF1dGhfdHlwZSwgZGlnZXN0X3NpemUsCiAJCQkJCSBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAogCQkJCQkgT1BDT0RFX0lOUExBQ0VfQklUIHwKIAkJCQkJIE9QQ09ERV9BVVRIX01BQyk7CiAJZW50LT5zcmNfYWRkciA9IF9fcGEod2Fsay5kYXRhKTsKLQllbnQtPmF1dGhfa2V5X2FkZHIgPSAwVUw7CisJZW50LT5hdXRoX2tleV9hZGRyID0gYXV0aF9rZXk7CiAJZW50LT5hdXRoX2l2X2FkZHIgPSBfX3BhKGhhc2hfbG9jKTsKIAllbnQtPmZpbmFsX2F1dGhfc3RhdGVfYWRkciA9IDBVTDsKIAllbnQtPmVuY19rZXlfYWRkciA9IDBVTDsKQEAgLTQ3NSwxMTQgKzU5NSw1NSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbjJfbWQ1X2FzeW5jX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQorc3RhdGljIGludCBuMl9oYXNoX2FzeW5jX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQogeworCXN0cnVjdCBuMl9haGFzaF9hbGcgKm4yYWxnID0gbjJfYWhhc2hfYWxnKHJlcS0+YmFzZS50Zm0pOwogCXN0cnVjdCBuMl9oYXNoX3JlcV9jdHggKnJjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOwotCXN0cnVjdCBtZDVfc3RhdGUgKm0gPSAmcmN0eC0+dS5tZDU7CisJaW50IGRzOwogCisJZHMgPSBuMmFsZy0+ZGlnZXN0X3NpemU7CiAJaWYgKHVubGlrZWx5KHJlcS0+bmJ5dGVzID09IDApKSB7Ci0JCXN0YXRpYyBjb25zdCBjaGFyIG1kNV96ZXJvW01ENV9ESUdFU1RfU0laRV0gPSB7Ci0JCQkweGQ0LCAweDFkLCAweDhjLCAweGQ5LCAweDhmLCAweDAwLCAweGIyLCAweDA0LAotCQkJMHhlOSwgMHg4MCwgMHgwOSwgMHg5OCwgMHhlYywgMHhmOCwgMHg0MiwgMHg3ZSwKLQkJfTsKLQotCQltZW1jcHkocmVxLT5yZXN1bHQsIG1kNV96ZXJvLCBNRDVfRElHRVNUX1NJWkUpOworCQltZW1jcHkocmVxLT5yZXN1bHQsIG4yYWxnLT5oYXNoX3plcm8sIGRzKTsKIAkJcmV0dXJuIDA7CiAJfQotCW0tPmhhc2hbMF0gPSBjcHVfdG9fbGUzMigweDY3NDUyMzAxKTsKLQltLT5oYXNoWzFdID0gY3B1X3RvX2xlMzIoMHhlZmNkYWI4OSk7Ci0JbS0+aGFzaFsyXSA9IGNwdV90b19sZTMyKDB4OThiYWRjZmUpOwotCW0tPmhhc2hbM10gPSBjcHVfdG9fbGUzMigweDEwMzI1NDc2KTsKKwltZW1jcHkoJnJjdHgtPnUsIG4yYWxnLT5oYXNoX2luaXQsIG4yYWxnLT5od19vcF9oYXNoc3opOwogCi0JcmV0dXJuIG4yX2hhc2hfYXN5bmNfZGlnZXN0KHJlcSwgQVVUSF9UWVBFX01ENSwKLQkJCQkgICAgTUQ1X0RJR0VTVF9TSVpFLCBNRDVfRElHRVNUX1NJWkUsCi0JCQkJICAgIG0tPmhhc2gpOworCXJldHVybiBuMl9kb19hc3luY19kaWdlc3QocmVxLCBuMmFsZy0+YXV0aF90eXBlLAorCQkJCSAgbjJhbGctPmh3X29wX2hhc2hzeiwgZHMsCisJCQkJICAmcmN0eC0+dSwgMFVMLCAwKTsKIH0KIAotc3RhdGljIGludCBuMl9zaGExX2FzeW5jX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQorc3RhdGljIGludCBuMl9obWFjX2FzeW5jX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQogeworCXN0cnVjdCBuMl9obWFjX2FsZyAqbjJhbGcgPSBuMl9obWFjX2FsZyhyZXEtPmJhc2UudGZtKTsKIAlzdHJ1Y3QgbjJfaGFzaF9yZXFfY3R4ICpyY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqcyA9ICZyY3R4LT51LnNoYTE7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBuMl9obWFjX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eCh0Zm0pOworCWludCBkczsKIAotCWlmICh1bmxpa2VseShyZXEtPm5ieXRlcyA9PSAwKSkgewotCQlzdGF0aWMgY29uc3QgY2hhciBzaGExX3plcm9bU0hBMV9ESUdFU1RfU0laRV0gPSB7Ci0JCQkweGRhLCAweDM5LCAweGEzLCAweGVlLCAweDVlLCAweDZiLCAweDRiLCAweDBkLCAweDMyLAotCQkJMHg1NSwgMHhiZiwgMHhlZiwgMHg5NSwgMHg2MCwgMHgxOCwgMHg5MCwgMHhhZiwgMHhkOCwKLQkJCTB4MDcsIDB4MDkKLQkJfTsKKwlkcyA9IG4yYWxnLT5kZXJpdmVkLmRpZ2VzdF9zaXplOworCWlmICh1bmxpa2VseShyZXEtPm5ieXRlcyA9PSAwKSB8fAorCSAgICB1bmxpa2VseShjdHgtPmhhc2hfa2V5X2xlbiA+IE4yX0hBU0hfS0VZX01BWCkpIHsKKwkJc3RydWN0IG4yX2hhc2hfcmVxX2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJCXN0cnVjdCBuMl9oYXNoX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eCh0Zm0pOwogCi0JCW1lbWNweShyZXEtPnJlc3VsdCwgc2hhMV96ZXJvLCBTSEExX0RJR0VTVF9TSVpFKTsKLQkJcmV0dXJuIDA7CisJCWFoYXNoX3JlcXVlc3Rfc2V0X3RmbSgmcmN0eC0+ZmFsbGJhY2tfcmVxLCBjdHgtPmZhbGxiYWNrX3RmbSk7CisJCXJjdHgtPmZhbGxiYWNrX3JlcS5iYXNlLmZsYWdzID0KKwkJCXJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwkJcmN0eC0+ZmFsbGJhY2tfcmVxLm5ieXRlcyA9IHJlcS0+bmJ5dGVzOworCQlyY3R4LT5mYWxsYmFja19yZXEuc3JjID0gcmVxLT5zcmM7CisJCXJjdHgtPmZhbGxiYWNrX3JlcS5yZXN1bHQgPSByZXEtPnJlc3VsdDsKKworCQlyZXR1cm4gY3J5cHRvX2FoYXNoX2RpZ2VzdCgmcmN0eC0+ZmFsbGJhY2tfcmVxKTsKIAl9Ci0Jcy0+c3RhdGVbMF0gPSBTSEExX0gwOwotCXMtPnN0YXRlWzFdID0gU0hBMV9IMTsKLQlzLT5zdGF0ZVsyXSA9IFNIQTFfSDI7Ci0Jcy0+c3RhdGVbM10gPSBTSEExX0gzOwotCXMtPnN0YXRlWzRdID0gU0hBMV9INDsKKwltZW1jcHkoJnJjdHgtPnUsIG4yYWxnLT5kZXJpdmVkLmhhc2hfaW5pdCwKKwkgICAgICAgbjJhbGctPmRlcml2ZWQuaHdfb3BfaGFzaHN6KTsKIAotCXJldHVybiBuMl9oYXNoX2FzeW5jX2RpZ2VzdChyZXEsIEFVVEhfVFlQRV9TSEExLAotCQkJCSAgICBTSEExX0RJR0VTVF9TSVpFLCBTSEExX0RJR0VTVF9TSVpFLAotCQkJCSAgICBzLT5zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbjJfc2hhMjU2X2FzeW5jX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBuMl9oYXNoX3JlcV9jdHggKnJjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOwotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnMgPSAmcmN0eC0+dS5zaGEyNTY7Ci0KLQlpZiAocmVxLT5uYnl0ZXMgPT0gMCkgewotCQlzdGF0aWMgY29uc3QgY2hhciBzaGEyNTZfemVyb1tTSEEyNTZfRElHRVNUX1NJWkVdID0gewotCQkJMHhlMywgMHhiMCwgMHhjNCwgMHg0MiwgMHg5OCwgMHhmYywgMHgxYywgMHgxNCwgMHg5YSwKLQkJCTB4ZmIsIDB4ZjQsIDB4YzgsIDB4OTksIDB4NmYsIDB4YjksIDB4MjQsIDB4MjcsIDB4YWUsCi0JCQkweDQxLCAweGU0LCAweDY0LCAweDliLCAweDkzLCAweDRjLCAweGE0LCAweDk1LCAweDk5LAotCQkJMHgxYiwgMHg3OCwgMHg1MiwgMHhiOCwgMHg1NQotCQl9OwotCi0JCW1lbWNweShyZXEtPnJlc3VsdCwgc2hhMjU2X3plcm8sIFNIQTI1Nl9ESUdFU1RfU0laRSk7Ci0JCXJldHVybiAwOwotCX0KLQlzLT5zdGF0ZVswXSA9IFNIQTI1Nl9IMDsKLQlzLT5zdGF0ZVsxXSA9IFNIQTI1Nl9IMTsKLQlzLT5zdGF0ZVsyXSA9IFNIQTI1Nl9IMjsKLQlzLT5zdGF0ZVszXSA9IFNIQTI1Nl9IMzsKLQlzLT5zdGF0ZVs0XSA9IFNIQTI1Nl9INDsKLQlzLT5zdGF0ZVs1XSA9IFNIQTI1Nl9INTsKLQlzLT5zdGF0ZVs2XSA9IFNIQTI1Nl9INjsKLQlzLT5zdGF0ZVs3XSA9IFNIQTI1Nl9INzsKLQotCXJldHVybiBuMl9oYXNoX2FzeW5jX2RpZ2VzdChyZXEsIEFVVEhfVFlQRV9TSEEyNTYsCi0JCQkJICAgIFNIQTI1Nl9ESUdFU1RfU0laRSwgU0hBMjU2X0RJR0VTVF9TSVpFLAotCQkJCSAgICBzLT5zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbjJfc2hhMjI0X2FzeW5jX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBuMl9oYXNoX3JlcV9jdHggKnJjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOwotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnMgPSAmcmN0eC0+dS5zaGEyNTY7Ci0KLQlpZiAocmVxLT5uYnl0ZXMgPT0gMCkgewotCQlzdGF0aWMgY29uc3QgY2hhciBzaGEyMjRfemVyb1tTSEEyMjRfRElHRVNUX1NJWkVdID0gewotCQkJMHhkMSwgMHg0YSwgMHgwMiwgMHg4YywgMHgyYSwgMHgzYSwgMHgyYiwgMHhjOSwgMHg0NywKLQkJCTB4NjEsIDB4MDIsIDB4YmIsIDB4MjgsIDB4ODIsIDB4MzQsIDB4YzQsIDB4MTUsIDB4YTIsCi0JCQkweGIwLCAweDFmLCAweDgyLCAweDhlLCAweGE2LCAweDJhLCAweGM1LCAweGIzLCAweGU0LAotCQkJMHgyZgotCQl9OwotCi0JCW1lbWNweShyZXEtPnJlc3VsdCwgc2hhMjI0X3plcm8sIFNIQTIyNF9ESUdFU1RfU0laRSk7Ci0JCXJldHVybiAwOwotCX0KLQlzLT5zdGF0ZVswXSA9IFNIQTIyNF9IMDsKLQlzLT5zdGF0ZVsxXSA9IFNIQTIyNF9IMTsKLQlzLT5zdGF0ZVsyXSA9IFNIQTIyNF9IMjsKLQlzLT5zdGF0ZVszXSA9IFNIQTIyNF9IMzsKLQlzLT5zdGF0ZVs0XSA9IFNIQTIyNF9INDsKLQlzLT5zdGF0ZVs1XSA9IFNIQTIyNF9INTsKLQlzLT5zdGF0ZVs2XSA9IFNIQTIyNF9INjsKLQlzLT5zdGF0ZVs3XSA9IFNIQTIyNF9INzsKLQotCXJldHVybiBuMl9oYXNoX2FzeW5jX2RpZ2VzdChyZXEsIEFVVEhfVFlQRV9TSEEyNTYsCi0JCQkJICAgIFNIQTI1Nl9ESUdFU1RfU0laRSwgU0hBMjI0X0RJR0VTVF9TSVpFLAotCQkJCSAgICBzLT5zdGF0ZSk7CisJcmV0dXJuIG4yX2RvX2FzeW5jX2RpZ2VzdChyZXEsIG4yYWxnLT5kZXJpdmVkLmhtYWNfdHlwZSwKKwkJCQkgIG4yYWxnLT5kZXJpdmVkLmh3X29wX2hhc2hzeiwgZHMsCisJCQkJICAmcmN0eC0+dSwKKwkJCQkgIF9fcGEoJmN0eC0+aGFzaF9rZXkpLAorCQkJCSAgY3R4LT5oYXNoX2tleV9sZW4pOwogfQogCiBzdHJ1Y3QgbjJfY2lwaGVyX2NvbnRleHQgewpAQCAtMTIwOSwzNSArMTI3MCw5MiBAQAogCiBzdHJ1Y3QgbjJfaGFzaF90bXBsIHsKIAljb25zdCBjaGFyCSpuYW1lOwotCWludAkJKCpkaWdlc3QpKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpOworCWNvbnN0IGNoYXIJKmhhc2hfemVybzsKKwljb25zdCB1MzIJKmhhc2hfaW5pdDsKKwl1OAkJaHdfb3BfaGFzaHN6OwogCXU4CQlkaWdlc3Rfc2l6ZTsKIAl1OAkJYmxvY2tfc2l6ZTsKKwl1OAkJYXV0aF90eXBlOworCXU4CQlobWFjX3R5cGU7CiB9OworCitzdGF0aWMgY29uc3QgY2hhciBtZDVfemVyb1tNRDVfRElHRVNUX1NJWkVdID0geworCTB4ZDQsIDB4MWQsIDB4OGMsIDB4ZDksIDB4OGYsIDB4MDAsIDB4YjIsIDB4MDQsCisJMHhlOSwgMHg4MCwgMHgwOSwgMHg5OCwgMHhlYywgMHhmOCwgMHg0MiwgMHg3ZSwKK307CitzdGF0aWMgY29uc3QgdTMyIG1kNV9pbml0W01ENV9IQVNIX1dPUkRTXSA9IHsKKwljcHVfdG9fbGUzMigweDY3NDUyMzAxKSwKKwljcHVfdG9fbGUzMigweGVmY2RhYjg5KSwKKwljcHVfdG9fbGUzMigweDk4YmFkY2ZlKSwKKwljcHVfdG9fbGUzMigweDEwMzI1NDc2KSwKK307CitzdGF0aWMgY29uc3QgY2hhciBzaGExX3plcm9bU0hBMV9ESUdFU1RfU0laRV0gPSB7CisJMHhkYSwgMHgzOSwgMHhhMywgMHhlZSwgMHg1ZSwgMHg2YiwgMHg0YiwgMHgwZCwgMHgzMiwKKwkweDU1LCAweGJmLCAweGVmLCAweDk1LCAweDYwLCAweDE4LCAweDkwLCAweGFmLCAweGQ4LAorCTB4MDcsIDB4MDkKK307CitzdGF0aWMgY29uc3QgdTMyIHNoYTFfaW5pdFtTSEExX0RJR0VTVF9TSVpFIC8gNF0gPSB7CisJU0hBMV9IMCwgU0hBMV9IMSwgU0hBMV9IMiwgU0hBMV9IMywgU0hBMV9INCwKK307CitzdGF0aWMgY29uc3QgY2hhciBzaGEyNTZfemVyb1tTSEEyNTZfRElHRVNUX1NJWkVdID0geworCTB4ZTMsIDB4YjAsIDB4YzQsIDB4NDIsIDB4OTgsIDB4ZmMsIDB4MWMsIDB4MTQsIDB4OWEsCisJMHhmYiwgMHhmNCwgMHhjOCwgMHg5OSwgMHg2ZiwgMHhiOSwgMHgyNCwgMHgyNywgMHhhZSwKKwkweDQxLCAweGU0LCAweDY0LCAweDliLCAweDkzLCAweDRjLCAweGE0LCAweDk1LCAweDk5LAorCTB4MWIsIDB4NzgsIDB4NTIsIDB4YjgsIDB4NTUKK307CitzdGF0aWMgY29uc3QgdTMyIHNoYTI1Nl9pbml0W1NIQTI1Nl9ESUdFU1RfU0laRSAvIDRdID0geworCVNIQTI1Nl9IMCwgU0hBMjU2X0gxLCBTSEEyNTZfSDIsIFNIQTI1Nl9IMywKKwlTSEEyNTZfSDQsIFNIQTI1Nl9INSwgU0hBMjU2X0g2LCBTSEEyNTZfSDcsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgc2hhMjI0X3plcm9bU0hBMjI0X0RJR0VTVF9TSVpFXSA9IHsKKwkweGQxLCAweDRhLCAweDAyLCAweDhjLCAweDJhLCAweDNhLCAweDJiLCAweGM5LCAweDQ3LAorCTB4NjEsIDB4MDIsIDB4YmIsIDB4MjgsIDB4ODIsIDB4MzQsIDB4YzQsIDB4MTUsIDB4YTIsCisJMHhiMCwgMHgxZiwgMHg4MiwgMHg4ZSwgMHhhNiwgMHgyYSwgMHhjNSwgMHhiMywgMHhlNCwKKwkweDJmCit9Oworc3RhdGljIGNvbnN0IHUzMiBzaGEyMjRfaW5pdFtTSEEyNTZfRElHRVNUX1NJWkUgLyA0XSA9IHsKKwlTSEEyMjRfSDAsIFNIQTIyNF9IMSwgU0hBMjI0X0gyLCBTSEEyMjRfSDMsCisJU0hBMjI0X0g0LCBTSEEyMjRfSDUsIFNIQTIyNF9INiwgU0hBMjI0X0g3LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuMl9oYXNoX3RtcGwgaGFzaF90bXBsc1tdID0gewogCXsgLm5hbWUJCT0gIm1kNSIsCi0JICAuZGlnZXN0CT0gbjJfbWQ1X2FzeW5jX2RpZ2VzdCwKKwkgIC5oYXNoX3plcm8JPSBtZDVfemVybywKKwkgIC5oYXNoX2luaXQJPSBtZDVfaW5pdCwKKwkgIC5hdXRoX3R5cGUJPSBBVVRIX1RZUEVfTUQ1LAorCSAgLmhtYWNfdHlwZQk9IEFVVEhfVFlQRV9ITUFDX01ENSwKKwkgIC5od19vcF9oYXNoc3oJPSBNRDVfRElHRVNUX1NJWkUsCiAJICAuZGlnZXN0X3NpemUJPSBNRDVfRElHRVNUX1NJWkUsCiAJICAuYmxvY2tfc2l6ZQk9IE1ENV9ITUFDX0JMT0NLX1NJWkUgfSwKIAl7IC5uYW1lCQk9ICJzaGExIiwKLQkgIC5kaWdlc3QJPSBuMl9zaGExX2FzeW5jX2RpZ2VzdCwKKwkgIC5oYXNoX3plcm8JPSBzaGExX3plcm8sCisJICAuaGFzaF9pbml0CT0gc2hhMV9pbml0LAorCSAgLmF1dGhfdHlwZQk9IEFVVEhfVFlQRV9TSEExLAorCSAgLmhtYWNfdHlwZQk9IEFVVEhfVFlQRV9ITUFDX1NIQTEsCisJICAuaHdfb3BfaGFzaHN6CT0gU0hBMV9ESUdFU1RfU0laRSwKIAkgIC5kaWdlc3Rfc2l6ZQk9IFNIQTFfRElHRVNUX1NJWkUsCiAJICAuYmxvY2tfc2l6ZQk9IFNIQTFfQkxPQ0tfU0laRSB9LAogCXsgLm5hbWUJCT0gInNoYTI1NiIsCi0JICAuZGlnZXN0CT0gbjJfc2hhMjU2X2FzeW5jX2RpZ2VzdCwKKwkgIC5oYXNoX3plcm8JPSBzaGEyNTZfemVybywKKwkgIC5oYXNoX2luaXQJPSBzaGEyNTZfaW5pdCwKKwkgIC5hdXRoX3R5cGUJPSBBVVRIX1RZUEVfU0hBMjU2LAorCSAgLmhtYWNfdHlwZQk9IEFVVEhfVFlQRV9ITUFDX1NIQTI1NiwKKwkgIC5od19vcF9oYXNoc3oJPSBTSEEyNTZfRElHRVNUX1NJWkUsCiAJICAuZGlnZXN0X3NpemUJPSBTSEEyNTZfRElHRVNUX1NJWkUsCiAJICAuYmxvY2tfc2l6ZQk9IFNIQTI1Nl9CTE9DS19TSVpFIH0sCiAJeyAubmFtZQkJPSAic2hhMjI0IiwKLQkgIC5kaWdlc3QJPSBuMl9zaGEyMjRfYXN5bmNfZGlnZXN0LAorCSAgLmhhc2hfemVybwk9IHNoYTIyNF96ZXJvLAorCSAgLmhhc2hfaW5pdAk9IHNoYTIyNF9pbml0LAorCSAgLmF1dGhfdHlwZQk9IEFVVEhfVFlQRV9TSEEyNTYsCisJICAuaG1hY190eXBlCT0gQVVUSF9UWVBFX1JFU0VSVkVELAorCSAgLmh3X29wX2hhc2hzegk9IFNIQTI1Nl9ESUdFU1RfU0laRSwKIAkgIC5kaWdlc3Rfc2l6ZQk9IFNIQTIyNF9ESUdFU1RfU0laRSwKIAkgIC5ibG9ja19zaXplCT0gU0hBMjI0X0JMT0NLX1NJWkUgfSwKIH07CiAjZGVmaW5lIE5VTV9IQVNIX1RNUExTIEFSUkFZX1NJWkUoaGFzaF90bXBscykKIAotc3RydWN0IG4yX2FoYXNoX2FsZyB7Ci0Jc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKLQlzdHJ1Y3QgYWhhc2hfYWxnCWFsZzsKLX07CiBzdGF0aWMgTElTVF9IRUFEKGFoYXNoX2FsZ3MpOworc3RhdGljIExJU1RfSEVBRChobWFjX2FsZ3MpOwogCiBzdGF0aWMgaW50IGFsZ3NfcmVnaXN0ZXJlZDsKIApAQCAtMTI0NSwxMiArMTM2MywxOCBAQAogewogCXN0cnVjdCBuMl9jaXBoZXJfYWxnICpjaXBoZXIsICpjaXBoZXJfdG1wOwogCXN0cnVjdCBuMl9haGFzaF9hbGcgKmFsZywgKmFsZ190bXA7CisJc3RydWN0IG4yX2htYWNfYWxnICpobWFjLCAqaG1hY190bXA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2lwaGVyLCBjaXBoZXJfdG1wLCAmY2lwaGVyX2FsZ3MsIGVudHJ5KSB7CiAJCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2lwaGVyLT5hbGcpOwogCQlsaXN0X2RlbCgmY2lwaGVyLT5lbnRyeSk7CiAJCWtmcmVlKGNpcGhlcik7CiAJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShobWFjLCBobWFjX3RtcCwgJmhtYWNfYWxncywgZGVyaXZlZC5lbnRyeSkgeworCQljcnlwdG9fdW5yZWdpc3Rlcl9haGFzaCgmaG1hYy0+ZGVyaXZlZC5hbGcpOworCQlsaXN0X2RlbCgmaG1hYy0+ZGVyaXZlZC5lbnRyeSk7CisJCWtmcmVlKGhtYWMpOworCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWxnLCBhbGdfdG1wLCAmYWhhc2hfYWxncywgZW50cnkpIHsKIAkJY3J5cHRvX3VucmVnaXN0ZXJfYWhhc2goJmFsZy0+YWxnKTsKIAkJbGlzdF9kZWwoJmFsZy0+ZW50cnkpOwpAQCAtMTI5MCw4ICsxNDE0LDQ5IEBACiAJbGlzdF9hZGQoJnAtPmVudHJ5LCAmY2lwaGVyX2FsZ3MpOwogCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoYWxnKTsKIAlpZiAoZXJyKSB7CisJCXByX2VycigiJXMgYWxnIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIGFsZy0+Y3JhX25hbWUpOwogCQlsaXN0X2RlbCgmcC0+ZW50cnkpOwogCQlrZnJlZShwKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCIlcyBhbGcgcmVnaXN0ZXJlZFxuIiwgYWxnLT5jcmFfbmFtZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IF9fbjJfcmVnaXN0ZXJfb25lX2htYWMoc3RydWN0IG4yX2FoYXNoX2FsZyAqbjJhaGFzaCkKK3sKKwlzdHJ1Y3QgbjJfaG1hY19hbGcgKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCXN0cnVjdCBhaGFzaF9hbGcgKmFoYXNoOworCXN0cnVjdCBjcnlwdG9fYWxnICpiYXNlOworCWludCBlcnI7CisKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+Y2hpbGRfYWxnID0gbjJhaGFzaC0+YWxnLmhhbGcuYmFzZS5jcmFfbmFtZTsKKwltZW1jcHkoJnAtPmRlcml2ZWQsIG4yYWhhc2gsIHNpemVvZihzdHJ1Y3QgbjJfYWhhc2hfYWxnKSk7CisJSU5JVF9MSVNUX0hFQUQoJnAtPmRlcml2ZWQuZW50cnkpOworCisJYWhhc2ggPSAmcC0+ZGVyaXZlZC5hbGc7CisJYWhhc2gtPmRpZ2VzdCA9IG4yX2htYWNfYXN5bmNfZGlnZXN0OworCWFoYXNoLT5zZXRrZXkgPSBuMl9obWFjX2FzeW5jX3NldGtleTsKKworCWJhc2UgPSAmYWhhc2gtPmhhbGcuYmFzZTsKKwlzbnByaW50ZihiYXNlLT5jcmFfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgImhtYWMoJXMpIiwgcC0+Y2hpbGRfYWxnKTsKKwlzbnByaW50ZihiYXNlLT5jcmFfZHJpdmVyX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsICJobWFjLSVzLW4yIiwgcC0+Y2hpbGRfYWxnKTsKKworCWJhc2UtPmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBuMl9obWFjX2N0eCk7CisJYmFzZS0+Y3JhX2luaXQgPSBuMl9obWFjX2NyYV9pbml0OworCWJhc2UtPmNyYV9leGl0ID0gbjJfaG1hY19jcmFfZXhpdDsKKworCWxpc3RfYWRkKCZwLT5kZXJpdmVkLmVudHJ5LCAmaG1hY19hbGdzKTsKKwllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWhhc2goYWhhc2gpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCIlcyBhbGcgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwgYmFzZS0+Y3JhX25hbWUpOworCQlsaXN0X2RlbCgmcC0+ZGVyaXZlZC5lbnRyeSk7CisJCWtmcmVlKHApOworCX0gZWxzZSB7CisJCXByX2luZm8oIiVzIGFsZyByZWdpc3RlcmVkXG4iLCBiYXNlLT5jcmFfbmFtZSk7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0xMzA3LDEyICsxNDcyLDE5IEBACiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXAtPmhhc2hfemVybyA9IHRtcGwtPmhhc2hfemVybzsKKwlwLT5oYXNoX2luaXQgPSB0bXBsLT5oYXNoX2luaXQ7CisJcC0+YXV0aF90eXBlID0gdG1wbC0+YXV0aF90eXBlOworCXAtPmhtYWNfdHlwZSA9IHRtcGwtPmhtYWNfdHlwZTsKKwlwLT5od19vcF9oYXNoc3ogPSB0bXBsLT5od19vcF9oYXNoc3o7CisJcC0+ZGlnZXN0X3NpemUgPSB0bXBsLT5kaWdlc3Rfc2l6ZTsKKwogCWFoYXNoID0gJnAtPmFsZzsKIAlhaGFzaC0+aW5pdCA9IG4yX2hhc2hfYXN5bmNfaW5pdDsKIAlhaGFzaC0+dXBkYXRlID0gbjJfaGFzaF9hc3luY191cGRhdGU7CiAJYWhhc2gtPmZpbmFsID0gbjJfaGFzaF9hc3luY19maW5hbDsKIAlhaGFzaC0+ZmludXAgPSBuMl9oYXNoX2FzeW5jX2ZpbnVwOwotCWFoYXNoLT5kaWdlc3QgPSB0bXBsLT5kaWdlc3Q7CisJYWhhc2gtPmRpZ2VzdCA9IG4yX2hhc2hfYXN5bmNfZGlnZXN0OwogCiAJaGFsZyA9ICZhaGFzaC0+aGFsZzsKIAloYWxnLT5kaWdlc3RzaXplID0gdG1wbC0+ZGlnZXN0X3NpemU7CkBAIC0xMzMxLDkgKzE1MDMsMTQgQEAKIAlsaXN0X2FkZCgmcC0+ZW50cnksICZhaGFzaF9hbGdzKTsKIAllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWhhc2goYWhhc2gpOwogCWlmIChlcnIpIHsKKwkJcHJfZXJyKCIlcyBhbGcgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwgYmFzZS0+Y3JhX25hbWUpOwogCQlsaXN0X2RlbCgmcC0+ZW50cnkpOwogCQlrZnJlZShwKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCIlcyBhbGcgcmVnaXN0ZXJlZFxuIiwgYmFzZS0+Y3JhX25hbWUpOwogCX0KKwlpZiAoIWVyciAmJiBwLT5obWFjX3R5cGUgIT0gQVVUSF9UWVBFX1JFU0VSVkVEKQorCQllcnIgPSBfX24yX3JlZ2lzdGVyX29uZV9obWFjKHApOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIwNzAsMjAgKzIyNDcsMjAgQEAKIAogc3RhdGljIGludCBfX2luaXQgbjJfaW5pdCh2b2lkKQogewotCWludCBlcnIgPSBvZl9yZWdpc3Rlcl9kcml2ZXIoJm4yX2NyeXB0b19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJaW50IGVyciA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbjJfY3J5cHRvX2RyaXZlcik7CiAKIAlpZiAoIWVycikgewotCQllcnIgPSBvZl9yZWdpc3Rlcl9kcml2ZXIoJm4yX21hdV9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJCWVyciA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbjJfbWF1X2RyaXZlcik7CiAJCWlmIChlcnIpCi0JCQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmbjJfY3J5cHRvX2RyaXZlcik7CisJCQlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbjJfY3J5cHRvX2RyaXZlcik7CiAJfQogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuMl9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJm4yX21hdV9kcml2ZXIpOwotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZuMl9jcnlwdG9fZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbjJfbWF1X2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm4yX2NyeXB0b19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChuMl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jIGIvZHJpdmVycy9jcnlwdG8vb21hcC1zaGFtLmMKaW5kZXggOGIwMzQzMy4uN2QxNDg1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vb21hcC1zaGFtLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vb21hcC1zaGFtLmMKQEAgLTE1LDcgKzE1LDYgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSAiJXM6ICIgZm10LCBfX2Z1bmNfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jIGIvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jCmluZGV4IGJkNzhhY2YuLjk3ZjRhZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3RhbGl0b3MuYworKysgYi9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMKQEAgLTcyMCw3ICs3MjAsNiBAQAogI2RlZmluZSBUQUxJVE9TX01ERVVfTUFYX0NPTlRFWFRfU0laRQlUQUxJVE9TX01ERVVfQ09OVEVYVF9TSVpFX1NIQTM4NF9TSEE1MTIKIAogc3RydWN0IHRhbGl0b3NfYWhhc2hfcmVxX2N0eCB7Ci0JdTY0IGNvdW50OwogCXUzMiBod19jb250ZXh0W1RBTElUT1NfTURFVV9NQVhfQ09OVEVYVF9TSVpFIC8gc2l6ZW9mKHUzMildOwogCXVuc2lnbmVkIGludCBod19jb250ZXh0X3NpemU7CiAJdTggYnVmW0hBU0hfTUFYX0JMT0NLX1NJWkVdOwpAQCAtNzI5LDYgKzcyOCw3IEBACiAJdW5zaWduZWQgaW50IGZpcnN0OwogCXVuc2lnbmVkIGludCBsYXN0OwogCXVuc2lnbmVkIGludCB0b19oYXNoX2xhdGVyOworCXU2NCBuYnVmOwogCXN0cnVjdCBzY2F0dGVybGlzdCBidWZzbFsyXTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzcmM7CiB9OwpAQCAtMTYxMyw2ICsxNjEzLDcgQEAKIAlpZiAoIXJlcV9jdHgtPmxhc3QgJiYgcmVxX2N0eC0+dG9faGFzaF9sYXRlcikgewogCQkvKiBQb3NpdGlvbiBhbnkgcGFydGlhbCBibG9jayBmb3IgbmV4dCB1cGRhdGUvZmluYWwvZmludXAgKi8KIAkJbWVtY3B5KHJlcV9jdHgtPmJ1ZiwgcmVxX2N0eC0+YnVmbmV4dCwgcmVxX2N0eC0+dG9faGFzaF9sYXRlcik7CisJCXJlcV9jdHgtPm5idWYgPSByZXFfY3R4LT50b19oYXNoX2xhdGVyOwogCX0KIAljb21tb25fbm9uc25vb3BfaGFzaF91bm1hcChkZXYsIGVkZXNjLCBhcmVxKTsKIApAQCAtMTcyOCw3ICsxNzI5LDcgQEAKIAlzdHJ1Y3QgdGFsaXRvc19haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoYXJlcSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjb250ZXh0ICovCi0JcmVxX2N0eC0+Y291bnQgPSAwOworCXJlcV9jdHgtPm5idWYgPSAwOwogCXJlcV9jdHgtPmZpcnN0ID0gMTsgLyogZmlyc3QgaW5kaWNhdGVzIGgvdyBtdXN0IGluaXQgaXRzIGNvbnRleHQgKi8KIAlyZXFfY3R4LT5zd2luaXQgPSAwOyAvKiBhc3N1bWUgaC93IGluaXQgb2YgY29udGV4dCAqLwogCXJlcV9jdHgtPmh3X2NvbnRleHRfc2l6ZSA9CkBAIC0xNzc2LDUyICsxNzc3LDU0IEBACiAJCQljcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbSh0Zm0pKTsKIAl1bnNpZ25lZCBpbnQgbmJ5dGVzX3RvX2hhc2g7CiAJdW5zaWduZWQgaW50IHRvX2hhc2hfbGF0ZXI7Ci0JdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCBuc2c7CiAJaW50IGNoYWluZWQ7CiAKLQlpbmRleCA9IHJlcV9jdHgtPmNvdW50ICYgKGJsb2Nrc2l6ZSAtIDEpOwotCXJlcV9jdHgtPmNvdW50ICs9IG5ieXRlczsKLQotCWlmICghcmVxX2N0eC0+bGFzdCAmJiAoaW5kZXggKyBuYnl0ZXMpIDwgYmxvY2tzaXplKSB7Ci0JCS8qIEJ1ZmZlciB0aGUgcGFydGlhbCBibG9jayAqLworCWlmICghcmVxX2N0eC0+bGFzdCAmJiAobmJ5dGVzICsgcmVxX2N0eC0+bmJ1ZiA8PSBibG9ja3NpemUpKSB7CisJCS8qIEJ1ZmZlciB1cCB0byBvbmUgd2hvbGUgYmxvY2sgKi8KIAkJc2dfY29weV90b19idWZmZXIoYXJlcS0+c3JjLAogCQkJCSAgc2dfY291bnQoYXJlcS0+c3JjLCBuYnl0ZXMsICZjaGFpbmVkKSwKLQkJCQkgIHJlcV9jdHgtPmJ1ZiArIGluZGV4LCBuYnl0ZXMpOworCQkJCSAgcmVxX2N0eC0+YnVmICsgcmVxX2N0eC0+bmJ1ZiwgbmJ5dGVzKTsKKwkJcmVxX2N0eC0+bmJ1ZiArPSBuYnl0ZXM7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChpbmRleCkgewotCQkvKiBwYXJ0aWFsIGJsb2NrIGZyb20gcHJldmlvdXMgdXBkYXRlOyBjaGFpbiBpdCBpbi4gKi8KLQkJc2dfaW5pdF90YWJsZShyZXFfY3R4LT5idWZzbCwgKG5ieXRlcykgPyAyIDogMSk7Ci0JCXNnX3NldF9idWYocmVxX2N0eC0+YnVmc2wsIHJlcV9jdHgtPmJ1ZiwgaW5kZXgpOwotCQlpZiAobmJ5dGVzKQotCQkJc2NhdHRlcndhbGtfc2dfY2hhaW4ocmVxX2N0eC0+YnVmc2wsIDIsCi0JCQkJCSAgICAgYXJlcS0+c3JjKTsKKwkvKiBBdCBsZWFzdCAoYmxvY2tzaXplICsgMSkgYnl0ZXMgYXJlIGF2YWlsYWJsZSB0byBoYXNoICovCisJbmJ5dGVzX3RvX2hhc2ggPSBuYnl0ZXMgKyByZXFfY3R4LT5uYnVmOworCXRvX2hhc2hfbGF0ZXIgPSBuYnl0ZXNfdG9faGFzaCAmIChibG9ja3NpemUgLSAxKTsKKworCWlmIChyZXFfY3R4LT5sYXN0KQorCQl0b19oYXNoX2xhdGVyID0gMDsKKwllbHNlIGlmICh0b19oYXNoX2xhdGVyKQorCQkvKiBUaGVyZSBpcyBhIHBhcnRpYWwgYmxvY2suIEhhc2ggdGhlIGZ1bGwgYmxvY2socykgbm93ICovCisJCW5ieXRlc190b19oYXNoIC09IHRvX2hhc2hfbGF0ZXI7CisJZWxzZSB7CisJCS8qIEtlZXAgb25lIGJsb2NrIGJ1ZmZlcmVkICovCisJCW5ieXRlc190b19oYXNoIC09IGJsb2Nrc2l6ZTsKKwkJdG9faGFzaF9sYXRlciA9IGJsb2Nrc2l6ZTsKKwl9CisKKwkvKiBDaGFpbiBpbiBhbnkgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhICovCisJaWYgKHJlcV9jdHgtPm5idWYpIHsKKwkJbnNnID0gKHJlcV9jdHgtPm5idWYgPCBuYnl0ZXNfdG9faGFzaCkgPyAyIDogMTsKKwkJc2dfaW5pdF90YWJsZShyZXFfY3R4LT5idWZzbCwgbnNnKTsKKwkJc2dfc2V0X2J1ZihyZXFfY3R4LT5idWZzbCwgcmVxX2N0eC0+YnVmLCByZXFfY3R4LT5uYnVmKTsKKwkJaWYgKG5zZyA+IDEpCisJCQlzY2F0dGVyd2Fsa19zZ19jaGFpbihyZXFfY3R4LT5idWZzbCwgMiwgYXJlcS0+c3JjKTsKIAkJcmVxX2N0eC0+cHNyYyA9IHJlcV9jdHgtPmJ1ZnNsOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCXJlcV9jdHgtPnBzcmMgPSBhcmVxLT5zcmM7Ci0JfQotCW5ieXRlc190b19oYXNoID0gIGluZGV4ICsgbmJ5dGVzOwotCWlmICghcmVxX2N0eC0+bGFzdCkgewotCQl0b19oYXNoX2xhdGVyID0gKG5ieXRlc190b19oYXNoICYgKGJsb2Nrc2l6ZSAtIDEpKTsKLQkJaWYgKHRvX2hhc2hfbGF0ZXIpIHsKLQkJCWludCBuZW50czsKLQkJCS8qIE11c3QgY29weSB0b19oYXNoX2xhdGVyIGJ5dGVzIGZyb20gdGhlIGVuZAotCQkJICogdG8gYnVmbmV4dCAoYSBwYXJ0aWFsIGJsb2NrKSBmb3IgbGF0ZXIuCi0JCQkgKi8KLQkJCW5lbnRzID0gc2dfY291bnQoYXJlcS0+c3JjLCBuYnl0ZXMsICZjaGFpbmVkKTsKLQkJCXNnX2NvcHlfZW5kX3RvX2J1ZmZlcihhcmVxLT5zcmMsIG5lbnRzLAotCQkJCQkgICAgICByZXFfY3R4LT5idWZuZXh0LAotCQkJCQkgICAgICB0b19oYXNoX2xhdGVyLAotCQkJCQkgICAgICBuYnl0ZXMgLSB0b19oYXNoX2xhdGVyKTsKIAotCQkJLyogQWRqdXN0IGNvdW50IGZvciB3aGF0IHdpbGwgYmUgaGFzaGVkIG5vdyAqLwotCQkJbmJ5dGVzX3RvX2hhc2ggLT0gdG9faGFzaF9sYXRlcjsKLQkJfQotCQlyZXFfY3R4LT50b19oYXNoX2xhdGVyID0gdG9faGFzaF9sYXRlcjsKKwlpZiAodG9faGFzaF9sYXRlcikgeworCQlpbnQgbmVudHMgPSBzZ19jb3VudChhcmVxLT5zcmMsIG5ieXRlcywgJmNoYWluZWQpOworCQlzZ19jb3B5X2VuZF90b19idWZmZXIoYXJlcS0+c3JjLCBuZW50cywKKwkJCQkgICAgICByZXFfY3R4LT5idWZuZXh0LAorCQkJCSAgICAgIHRvX2hhc2hfbGF0ZXIsCisJCQkJICAgICAgbmJ5dGVzIC0gdG9faGFzaF9sYXRlcik7CiAJfQorCXJlcV9jdHgtPnRvX2hhc2hfbGF0ZXIgPSB0b19oYXNoX2xhdGVyOwogCi0JLyogYWxsb2NhdGUgZXh0ZW5kZWQgZGVzY3JpcHRvciAqLworCS8qIEFsbG9jYXRlIGV4dGVuZGVkIGRlc2NyaXB0b3IgKi8KIAllZGVzYyA9IGFoYXNoX2VkZXNjX2FsbG9jKGFyZXEsIG5ieXRlc190b19oYXNoKTsKIAlpZiAoSVNfRVJSKGVkZXNjKSkKIAkJcmV0dXJuIFBUUl9FUlIoZWRlc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYXRfaGRtYWMuYyBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKaW5kZXggYmQ1MjUwZS4uZTg4MDc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvYXRfaGRtYWMuYworKysgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCkBAIC02OSw3ICs2OSw3IEBACiB9CiAKIC8qKgotICogYXRjX2FsbG9jX2Rlc2NyaXB0b3IgLSBhbGxvY2F0ZSBhbmQgcmV0dXJuIGFuIGluaXRpbGl6ZWQgZGVzY3JpcHRvcgorICogYXRjX2FsbG9jX2Rlc2NyaXB0b3IgLSBhbGxvY2F0ZSBhbmQgcmV0dXJuIGFuIGluaXRpYWxpemVkIGRlc2NyaXB0b3IKICAqIEBjaGFuOiB0aGUgY2hhbm5lbCB0byBhbGxvY2F0ZSBkZXNjcmlwdG9ycyBmb3IKICAqIEBnZnBfZmxhZ3M6IEdGUCBhbGxvY2F0aW9uIGZsYWdzCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZnNsZG1hLmMgYi9kcml2ZXJzL2RtYS9mc2xkbWEuYwppbmRleCA4MDg4YjE0Li5mMGZkNmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9mc2xkbWEuYworKysgYi9kcml2ZXJzL2RtYS9mc2xkbWEuYwpAQCAtMTAsNyArMTAsNyBAQAogICogRGVzY3JpcHRpb246CiAgKiAgIERNQSBlbmdpbmUgZHJpdmVyIGZvciBGcmVlc2NhbGUgTVBDODU0MCBETUEgY29udHJvbGxlciwgd2hpY2ggaXMKICAqICAgYWxzbyBmaXQgZm9yIE1QQzg1NjAsIE1QQzg1NTUsIE1QQzg1NDgsIE1QQzg2NDEsIGFuZCBldGMuCi0gKiAgIFRoZSBzdXBwb3J0IGZvciBNUEM4MzQ5IERNQSBjb250b3JsbGVyIGlzIGFsc28gYWRkZWQuCisgKiAgIFRoZSBzdXBwb3J0IGZvciBNUEM4MzQ5IERNQSBjb250cm9sbGVyIGlzIGFsc28gYWRkZWQuCiAgKgogICogVGhpcyBkcml2ZXIgaW5zdHJ1Y3RzIHRoZSBETUEgY29udHJvbGxlciB0byBpc3N1ZSB0aGUgUENJIFJlYWQgTXVsdGlwbGUKICAqIGNvbW1hbmQgZm9yIFBDSSByZWFkIG9wZXJhdGlvbnMsIGluc3RlYWQgb2YgdXNpbmcgdGhlIGRlZmF1bHQgUENJIFJlYWQgTGluZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCAwZDJmOWRiLi43MGJiMzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpAQCAtMzksMTQgKzM5LDYgQEAKIAkgIHRoZXJlJ3JlIGZvdXIgZGVidWcgbGV2ZWxzICh4PTAsMSwyLDMgZnJvbSBsb3cgdG8gaGlnaCkuCiAJICBVc3VhbGx5IHlvdSBzaG91bGQgc2VsZWN0ICdOJy4KIAotY29uZmlnIEVEQUNfREVCVUdfVkVSQk9TRQotCWJvb2wgIk1vcmUgdmVyYm9zZSBkZWJ1Z2dpbmciCi0JZGVwZW5kcyBvbiBFREFDX0RFQlVHCi0JaGVscAotCSAgVGhpcyBvcHRpb24gbWFrZXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIG1vcmUgdmVyYm9zZS4KLQkgIFNvdXJjZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHdoZXJlIGRlYnVnZ2luZyBtZXNzYWdlCi0JICBwcmludGVkIHdpbGwgYmUgYWRkZWQgdG8gZGVidWdnaW5nIG1lc3NhZ2UuCi0KICBjb25maWcgRURBQ19ERUNPREVfTUNFCiAJdHJpc3RhdGUgIkRlY29kZSBNQ0VzIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0gKG9ubHkgb24gQU1EIGZvciBub3cpIgogCWRlcGVuZHMgb24gQ1BVX1NVUF9BTUQgJiYgWDg2X01DRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKaW5kZXggYWM5Zjc5OC4uNjcwMjM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbWQ2NF9zZXRfc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHUzMiAqYmFuZHdpZHRoKQorc3RhdGljIGludCBhbWQ2NF9zZXRfc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHUzMiBiYW5kd2lkdGgpCiB7CiAJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKIAl1MzIgbWluX3NjcnVicmF0ZSA9IDB4MDsKQEAgLTE3OCwxMCArMTc4LDEwIEBACiAKIAlkZWZhdWx0OgogCQlhbWQ2NF9wcmludGsoS0VSTl9FUlIsICJVbnN1cHBvcnRlZCBmYW1pbHkhXG4iKTsKLQkJYnJlYWs7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gYW1kNjRfc2VhcmNoX3NldF9zY3J1Yl9yYXRlKHB2dC0+bWlzY19mM19jdGwsICpiYW5kd2lkdGgsCi0JCQltaW5fc2NydWJyYXRlKTsKKwlyZXR1cm4gYW1kNjRfc2VhcmNoX3NldF9zY3J1Yl9yYXRlKHB2dC0+bWlzY19mM19jdGwsIGJhbmR3aWR0aCwKKwkJCQkJICAgbWluX3NjcnVicmF0ZSk7CiB9CiAKIHN0YXRpYyBpbnQgYW1kNjRfZ2V0X3NjcnViX3JhdGUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MzIgKmJ3KQpAQCAtNzk2LDYgKzc5NiwxMSBAQAogCiBzdGF0aWMgaW50IGdldF9jaGFubmVsX2Zyb21fZWNjX3N5bmRyb21lKHN0cnVjdCBtZW1fY3RsX2luZm8gKiwgdTE2KTsKIAorc3RhdGljIHUxNiBleHRyYWN0X3N5bmRyb21lKHN0cnVjdCBlcnJfcmVncyAqZXJyKQoreworCXJldHVybiAoKGVyci0+bmJzaCA+PiAxNSkgJiAweGZmKSB8ICgoZXJyLT5uYnNsID4+IDE2KSAmIDB4ZmYwMCk7Cit9CisKIHN0YXRpYyB2b2lkIGFtZDY0X2NwdV9kaXNwbGF5X2luZm8oc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQogewogCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweDExKQpAQCAtODg4LDYgKzg5Myw5IEBACiAJCXJldHVybjsKIAl9CiAKKwlhbWQ2NF9wcmludGsoS0VSTl9JTkZPLCAidXNpbmcgJXMgc3luZHJvbWVzLlxuIiwKKwkJICAgICAoKHB2dC0+c3luX3R5cGUgPT0gOCkgPyAieDgiIDogIng0IikpOworCiAJLyogT25seSBpZiBOT1QgZ2FuZ2VkIGRvZXMgZGNscjEgaGF2ZSB2YWxpZCBpbmZvICovCiAJaWYgKCFkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkpCiAJCWFtZDY0X2R1bXBfZHJhbWNmZ19sb3cocHZ0LT5kY2xyMSwgMSk7CkBAIC0xMTAxLDIwICsxMTA5LDE3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGs4X21hcF9zeXNhZGRyX3RvX2Nzcm93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKLQkJCQkJc3RydWN0IGVycl9yZWdzICppbmZvLAotCQkJCQl1NjQgc3lzX2FkZHIpCisJCQkJICAgIHN0cnVjdCBlcnJfcmVncyAqZXJyX2luZm8sIHU2NCBzeXNfYWRkcikKIHsKIAlzdHJ1Y3QgbWVtX2N0bF9pbmZvICpzcmNfbWNpOwotCXVuc2lnbmVkIHNob3J0IHN5bmRyb21lOwogCWludCBjaGFubmVsLCBjc3JvdzsKIAl1MzIgcGFnZSwgb2Zmc2V0OworCXUxNiBzeW5kcm9tZTsKIAotCS8qIEV4dHJhY3QgdGhlIHN5bmRyb21lIHBhcnRzIGFuZCBmb3JtIGEgMTYtYml0IHN5bmRyb21lICovCi0Jc3luZHJvbWUgID0gSElHSF9TWU5EUk9NRShpbmZvLT5uYnNsKSA8PCA4OwotCXN5bmRyb21lIHw9IExPV19TWU5EUk9NRShpbmZvLT5uYnNoKTsKKwlzeW5kcm9tZSA9IGV4dHJhY3Rfc3luZHJvbWUoZXJyX2luZm8pOwogCiAJLyogQ0hJUEtJTEwgZW5hYmxlZCAqLwotCWlmIChpbmZvLT5uYmNmZyAmIEs4X05CQ0ZHX0NISVBLSUxMKSB7CisJaWYgKGVycl9pbmZvLT5uYmNmZyAmIEs4X05CQ0ZHX0NISVBLSUxMKSB7CiAJCWNoYW5uZWwgPSBnZXRfY2hhbm5lbF9mcm9tX2VjY19zeW5kcm9tZShtY2ksIHN5bmRyb21lKTsKIAkJaWYgKGNoYW5uZWwgPCAwKSB7CiAJCQkvKgpAQCAtMTEyMyw4ICsxMTI4LDggQEAKIAkJCSAqIGFzIHN1c3BlY3QuCiAJCQkgKi8KIAkJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fV0FSTklORywKLQkJCQkgICAgICAgInVua25vd24gc3luZHJvbWUgMHgleCAtIHBvc3NpYmxlIGVycm9yICIKLQkJCQkgICAgICAgInJlcG9ydGluZyByYWNlXG4iLCBzeW5kcm9tZSk7CisJCQkJCSJ1bmtub3duIHN5bmRyb21lIDB4JTA0eCAtIHBvc3NpYmxlICIKKwkJCQkJImVycm9yIHJlcG9ydGluZyByYWNlXG4iLCBzeW5kcm9tZSk7CiAJCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgRURBQ19NT0RfU1RSKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTQzMCw3ICsxNDM1LDcgQEAKIAl1NjQgY2hhbl9vZmY7CiAKIAlpZiAoaGlfcmFuZ2Vfc2VsKSB7Ci0JCWlmICghKGRjdF9zZWxfYmFzZV9hZGRyICYgMHhGRkZGRjgwMCkgJiYKKwkJaWYgKCEoZGN0X3NlbF9iYXNlX2FkZHIgJiAweEZGRkYwMDAwKSAmJgogCQkgICBob2xlX3ZhbGlkICYmIChzeXNfYWRkciA+PSAweDEwMDAwMDAwMFVMTCkpCiAJCQljaGFuX29mZiA9IGhvbGVfb2ZmIDw8IDE2OwogCQllbHNlCkBAIC0xNjU0LDEzICsxNjU5LDEzIEBACiAgKiAoTUNYX0FERFIpLgogICovCiBzdGF0aWMgdm9pZCBmMTBfbWFwX3N5c2FkZHJfdG9fY3Nyb3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAotCQkJCSAgICAgc3RydWN0IGVycl9yZWdzICppbmZvLAorCQkJCSAgICAgc3RydWN0IGVycl9yZWdzICplcnJfaW5mbywKIAkJCQkgICAgIHU2NCBzeXNfYWRkcikKIHsKIAlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwogCXUzMiBwYWdlLCBvZmZzZXQ7Ci0JdW5zaWduZWQgc2hvcnQgc3luZHJvbWU7CiAJaW50IG5pZCwgY3Nyb3csIGNoYW4gPSAwOworCXUxNiBzeW5kcm9tZTsKIAogCWNzcm93ID0gZjEwX3RyYW5zbGF0ZV9zeXNhZGRyX3RvX2NzKHB2dCwgc3lzX2FkZHIsICZuaWQsICZjaGFuKTsKIApAQCAtMTY3MSwxNSArMTY3NiwxNCBAQAogCiAJZXJyb3JfYWRkcmVzc190b19wYWdlX2FuZF9vZmZzZXQoc3lzX2FkZHIsICZwYWdlLCAmb2Zmc2V0KTsKIAotCXN5bmRyb21lICA9IEhJR0hfU1lORFJPTUUoaW5mby0+bmJzbCkgPDwgODsKLQlzeW5kcm9tZSB8PSBMT1dfU1lORFJPTUUoaW5mby0+bmJzaCk7CisJc3luZHJvbWUgPSBleHRyYWN0X3N5bmRyb21lKGVycl9pbmZvKTsKIAogCS8qCiAJICogV2UgbmVlZCB0aGUgc3luZHJvbWVzIGZvciBjaGFubmVsIGRldGVjdGlvbiBvbmx5IHdoZW4gd2UncmUKIAkgKiBnYW5nZWQuIE90aGVyd2lzZSBAY2hhbiBzaG91bGQgYWxyZWFkeSBjb250YWluIHRoZSBjaGFubmVsIGF0CiAJICogdGhpcyBwb2ludC4KIAkgKi8KLQlpZiAoZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpICYmIHB2dC0+bmJjZmcgJiBLOF9OQkNGR19DSElQS0lMTCkKKwlpZiAoZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpICYmIChwdnQtPm5iY2ZnICYgSzhfTkJDRkdfQ0hJUEtJTEwpKQogCQljaGFuID0gZ2V0X2NoYW5uZWxfZnJvbV9lY2Nfc3luZHJvbWUobWNpLCBzeW5kcm9tZSk7CiAKIAlpZiAoY2hhbiA+PSAwKQpAQCAtMTg3OCw3ICsxODgyLDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgZGVjb2RlX3N5bmRyb21lKHUxNiBzeW5kcm9tZSwgdTE2ICp2ZWN0b3JzLCBpbnQgbnVtX3ZlY3MsCi0JCQkJIGludCB2X2RpbSkKKwkJCSAgIGludCB2X2RpbSkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgZXJyX3N5bTsKIApAQCAtMTk1NSwxMjQgKzE5NTksMjMgQEAKIHN0YXRpYyBpbnQgZ2V0X2NoYW5uZWxfZnJvbV9lY2Nfc3luZHJvbWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MTYgc3luZHJvbWUpCiB7CiAJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKLQl1MzIgdmFsdWUgPSAwOwotCWludCBlcnJfc3ltID0gMDsKKwlpbnQgZXJyX3N5bSA9IC0xOwogCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTApIHsKLQotCQlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5taXNjX2YzX2N0bCwgMHgxODAsICZ2YWx1ZSk7Ci0KLQkJLyogRjN4MTgwW0VjY1N5bWJvbFNpemVdPTEgPT4geDggc3ltYm9scyAqLwotCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiA3ICYmCi0JCSAgICB2YWx1ZSAmIEJJVCgyNSkpIHsKLQkJCWVycl9zeW0gPSBkZWNvZGVfc3luZHJvbWUoc3luZHJvbWUsIHg4X3ZlY3RvcnMsCi0JCQkJCQkgIEFSUkFZX1NJWkUoeDhfdmVjdG9ycyksIDgpOwotCQkJcmV0dXJuIG1hcF9lcnJfc3ltX3RvX2NoYW5uZWwoZXJyX3N5bSwgOCk7Ci0JCX0KKwlpZiAocHZ0LT5zeW5fdHlwZSA9PSA4KQorCQllcnJfc3ltID0gZGVjb2RlX3N5bmRyb21lKHN5bmRyb21lLCB4OF92ZWN0b3JzLAorCQkJCQkgIEFSUkFZX1NJWkUoeDhfdmVjdG9ycyksCisJCQkJCSAgcHZ0LT5zeW5fdHlwZSk7CisJZWxzZSBpZiAocHZ0LT5zeW5fdHlwZSA9PSA0KQorCQllcnJfc3ltID0gZGVjb2RlX3N5bmRyb21lKHN5bmRyb21lLCB4NF92ZWN0b3JzLAorCQkJCQkgIEFSUkFZX1NJWkUoeDRfdmVjdG9ycyksCisJCQkJCSAgcHZ0LT5zeW5fdHlwZSk7CisJZWxzZSB7CisJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsICIlczogSWxsZWdhbCBzeW5kcm9tZSB0eXBlOiAldVxuIiwKKwkJCQkJICAgX19mdW5jX18sIHB2dC0+c3luX3R5cGUpOworCQlyZXR1cm4gZXJyX3N5bTsKIAl9Ci0JZXJyX3N5bSA9IGRlY29kZV9zeW5kcm9tZShzeW5kcm9tZSwgeDRfdmVjdG9ycywgQVJSQVlfU0laRSh4NF92ZWN0b3JzKSwgNCk7Ci0JcmV0dXJuIG1hcF9lcnJfc3ltX3RvX2NoYW5uZWwoZXJyX3N5bSwgNCk7Ci19CiAKLS8qCi0gKiBDaGVjayBmb3IgdmFsaWQgZXJyb3IgaW4gdGhlIE5CIFN0YXR1cyBIaWdoIHJlZ2lzdGVyLiBJZiBzbywgcHJvY2VlZCB0byByZWFkCi0gKiBOQiBTdGF0dXMgTG93LCBOQiBBZGRyZXNzIExvdyBhbmQgTkIgQWRkcmVzcyBIaWdoIHJlZ2lzdGVycyBhbmQgc3RvcmUgZGF0YQotICogaW50byBlcnJvciBzdHJ1Y3R1cmUuCi0gKgotICogUmV0dXJuczoKLSAqCS0gMTogaWYgaGFyZHdhcmUgcmVncyBjb250YWlucyB2YWxpZCBlcnJvciBpbmZvCi0gKgktIDA6IGlmIG5vIHZhbGlkIGVycm9yIGlzIGluZGljYXRlZAotICovCi1zdGF0aWMgaW50IGFtZDY0X2dldF9lcnJvcl9pbmZvX3JlZ3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAotCQkJCSAgICAgc3RydWN0IGVycl9yZWdzICpyZWdzKQotewotCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKLQlzdHJ1Y3QgcGNpX2RldiAqbWlzY19mM19jdGw7Ci0KLQlwdnQgPSBtY2ktPnB2dF9pbmZvOwotCW1pc2NfZjNfY3RsID0gcHZ0LT5taXNjX2YzX2N0bDsKLQotCWlmIChhbWQ2NF9yZWFkX3BjaV9jZmcobWlzY19mM19jdGwsIEs4X05CU0gsICZyZWdzLT5uYnNoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShyZWdzLT5uYnNoICYgSzhfTkJTSF9WQUxJRF9CSVQpKQotCQlyZXR1cm4gMDsKLQotCS8qIHZhbGlkIGVycm9yLCByZWFkIHJlbWFpbmluZyBlcnJvciBpbmZvcm1hdGlvbiByZWdpc3RlcnMgKi8KLQlpZiAoYW1kNjRfcmVhZF9wY2lfY2ZnKG1pc2NfZjNfY3RsLCBLOF9OQlNMLCAmcmVncy0+bmJzbCkgfHwKLQkgICAgYW1kNjRfcmVhZF9wY2lfY2ZnKG1pc2NfZjNfY3RsLCBLOF9OQkVBTCwgJnJlZ3MtPm5iZWFsKSB8fAotCSAgICBhbWQ2NF9yZWFkX3BjaV9jZmcobWlzY19mM19jdGwsIEs4X05CRUFILCAmcmVncy0+bmJlYWgpIHx8Ci0JICAgIGFtZDY0X3JlYWRfcGNpX2NmZyhtaXNjX2YzX2N0bCwgSzhfTkJDRkcsICZyZWdzLT5uYmNmZykpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZXJyb3IgZGF0YSBmcm9tIGhhcmR3YXJlIGFuZCBzdG9yZSBpdAotICogaW4gdGhlIGluZm8gc3RydWN0dXJlLgotICoKLSAqIFJldHVybnM6Ci0gKgktIDE6IGlmIGEgdmFsaWQgZXJyb3IgaXMgZm91bmQKLSAqCS0gMDogaWYgbm8gZXJyb3IgaXMgZm91bmQKLSAqLwotc3RhdGljIGludCBhbWQ2NF9nZXRfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCi0JCQkJc3RydWN0IGVycl9yZWdzICppbmZvKQotewotCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKLQlzdHJ1Y3QgZXJyX3JlZ3MgcmVnczsKLQotCXB2dCA9IG1jaS0+cHZ0X2luZm87Ci0KLQlpZiAoIWFtZDY0X2dldF9lcnJvcl9pbmZvX3JlZ3MobWNpLCBpbmZvKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIEhlcmUncyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBLOCdzIEVEQUMgcmVwb3J0aW5nOiBUaGVyZSBhcmUgZm91cgotCSAqIHJlZ2lzdGVycyB3aGljaCByZXBvcnQgcGllY2VzIG9mIGVycm9yIGluZm9ybWF0aW9uLiBUaGV5IGFyZSBzaGFyZWQKLQkgKiBiZXR3ZWVuIENFcyBhbmQgVUVzLiBGdXJ0aGVybW9yZSwgY29udHJhcnkgdG8gd2hhdCBpcyBzdGF0ZWQgaW4gdGhlCi0JICogQktERywgdGhlIG92ZXJmbG93IGJpdCBpcyBuZXZlciB1c2VkISBFdmVyeSBlcnJvciBhbHdheXMgdXBkYXRlcyB0aGUKLQkgKiByZXBvcnRpbmcgcmVnaXN0ZXJzLgotCSAqCi0JICogQ2FuIHlvdSBzZWUgdGhlIHJhY2UgY29uZGl0aW9uPyBBbGwgZm91ciBlcnJvciByZXBvcnRpbmcgcmVnaXN0ZXJzCi0JICogbXVzdCBiZSByZWFkIGJlZm9yZSBhIG5ldyBlcnJvciB1cGRhdGVzIHRoZW0hIFRoZXJlIGlzIG5vIHdheSB0byByZWFkCi0JICogYWxsIGZvdXIgcmVnaXN0ZXJzIGF0b21pY2FsbHkuIFRoZSBiZXN0IHRoYW4gY2FuIGJlIGRvbmUgaXMgdG8gZGV0ZWN0Ci0JICogdGhhdCBhIHJhY2UgaGFzIG9jY3VyZWQgYW5kIHRoZW4gcmVwb3J0IHRoZSBlcnJvciB3aXRob3V0IGFueSBraW5kIG9mCi0JICogcHJlY2lzaW9uLgotCSAqCi0JICogV2hhdCBpcyBzdGlsbCBwb3NpdGl2ZSBpcyB0aGF0IGVycm9ycyBhcmUgc3RpbGwgcmVwb3J0ZWQgYW5kIHRodXMKLQkgKiBwcm9ibGVtcyBjYW4gc3RpbGwgYmUgZGV0ZWN0ZWQgLSBqdXN0IG5vdCBsb2NhbGl6ZWQgYmVjYXVzZSB0aGUKLQkgKiBzeW5kcm9tZSBhbmQgYWRkcmVzcyBhcmUgc3ByZWFkIG91dCBhY3Jvc3MgcmVnaXN0ZXJzLgotCSAqCi0JICogR3JycnJyISEhISEgIEhlcmUncyBob3BpbmcgdGhhdCBBTUQgZml4ZXMgdGhpcyBpbiBzb21lIGZ1dHVyZSBLOCByZXYuCi0JICogVUVzIGFuZCBDRXMgc2hvdWxkIGhhdmUgc2VwYXJhdGUgcmVnaXN0ZXIgc2V0cyB3aXRoIHByb3BlciBvdmVyZmxvdwotCSAqIGJpdHMgdGhhdCBhcmUgdXNlZCEgQXQgdmVyeSBsZWFzdCB0aGUgcHJvYmxlbSBjYW4gYmUgZml4ZWQgYnkKLQkgKiBob25vcmluZyB0aGUgRXJyVmFsaWQgYml0IGluICduYnNoJyBhbmQgbm90IHVwZGF0aW5nIHJlZ2lzdGVycyAtIGp1c3QKLQkgKiBzZXQgdGhlIG92ZXJmbG93IGJpdCAtIHVubGVzcyB0aGUgY3VycmVudCBlcnJvciBpcyBDRSBhbmQgdGhlIG5ldwotCSAqIGVycm9yIGlzIFVFIHdoaWNoIHdvdWxkIGJlIHRoZSBvbmx5IHNpdHVhdGlvbiBmb3Igb3ZlcndyaXRpbmcgdGhlCi0JICogY3VycmVudCB2YWx1ZXMuCi0JICovCi0KLQlyZWdzID0gKmluZm87Ci0KLQkvKiBVc2UgaW5mbyBmcm9tIHRoZSBzZWNvbmQgcmVhZCAtIG1vc3QgY3VycmVudCAqLwotCWlmICh1bmxpa2VseSghYW1kNjRfZ2V0X2Vycm9yX2luZm9fcmVncyhtY2ksIGluZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBjbGVhciB0aGUgZXJyb3IgYml0cyBpbiBoYXJkd2FyZSAqLwotCXBjaV93cml0ZV9iaXRzMzIocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJTSCwgMCwgSzhfTkJTSF9WQUxJRF9CSVQpOwotCi0JLyogQ2hlY2sgZm9yIHRoZSBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiAqLwotCWlmICgocmVncy5uYnNoICE9IGluZm8tPm5ic2gpIHx8Ci0JICAgICAocmVncy5uYnNsICE9IGluZm8tPm5ic2wpIHx8Ci0JICAgICAocmVncy5uYmVhaCAhPSBpbmZvLT5uYmVhaCkgfHwKLQkgICAgIChyZWdzLm5iZWFsICE9IGluZm8tPm5iZWFsKSkgewotCQlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX1dBUk5JTkcsCi0JCQkJImhhcmR3YXJlIFNUQVRVUyByZWFkIGFjY2VzcyByYWNlIGNvbmRpdGlvbiAiCi0JCQkJImRldGVjdGVkIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gbWFwX2Vycl9zeW1fdG9fY2hhbm5lbChlcnJfc3ltLCBwdnQtPnN5bl90eXBlKTsKIH0KIAogLyoKQEAgLTIxNzcsNyArMjA4MCw3IEBACiAJICogY2F0YXN0cm9waGljLgogCSAqLwogCWlmIChpbmZvLT5uYnNoICYgSzhfTkJTSF9PVkVSRkxPVykKLQkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIEVEQUNfTU9EX1NUUiAiRXJyb3IgT3ZlcmZsb3ciKTsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIEVEQUNfTU9EX1NUUiAiIEVycm9yIE92ZXJmbG93Iik7CiB9CiAKIHZvaWQgYW1kNjRfZGVjb2RlX2J1c19lcnJvcihpbnQgbm9kZV9pZCwgc3RydWN0IGVycl9yZWdzICpyZWdzKQpAQCAtMjE5OSwyMCArMjEwMiw2IEBACiB9CiAKIC8qCi0gKiBUaGUgbWFpbiBwb2xsaW5nICdjaGVjaycgZnVuY3Rpb24sIGNhbGxlZCBGUk9NIHRoZSBlZGFjIGNvcmUgdG8gcGVyZm9ybSB0aGUKLSAqIGVycm9yIGNoZWNraW5nIGFuZCBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCwgZXJyb3IgcHJvY2Vzc2luZy4KLSAqLwotc3RhdGljIHZvaWQgYW1kNjRfY2hlY2soc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQotewotCXN0cnVjdCBlcnJfcmVncyByZWdzOwotCi0JaWYgKGFtZDY0X2dldF9lcnJvcl9pbmZvKG1jaSwgJnJlZ3MpKSB7Ci0JCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87Ci0JCWFtZF9kZWNvZGVfbmJfbWNlKHB2dC0+bWNfbm9kZV9pZCwgJnJlZ3MsIDEpOwotCX0KLX0KLQotLyoKICAqIElucHV0OgogICoJMSkgc3RydWN0IGFtZDY0X3B2dCB3aGljaCBjb250YWlucyBwdnQtPmRyYW1fZjJfY3RsIHBvaW50ZXIKICAqCTIpIEFNRCBGYW1pbHkgaW5kZXggdmFsdWUKQEAgLTIyODQsNiArMjE3Myw3IEBACiBzdGF0aWMgdm9pZCBhbWQ2NF9yZWFkX21jX3JlZ2lzdGVycyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CiAJdTY0IG1zcl92YWw7CisJdTMyIHRtcDsKIAlpbnQgZHJhbTsKIAogCS8qCkBAIC0yMzQ5LDEwICsyMjM5LDIyIEBACiAJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0xSXzAsICZwdnQtPmRjbHIwKTsKIAlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDSFJfMCwgJnB2dC0+ZGNocjApOwogCi0JaWYgKCFkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkgJiYgYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxMCkgewotCQlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDTFJfMSwgJnB2dC0+ZGNscjEpOwotCQlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDSFJfMSwgJnB2dC0+ZGNocjEpOworCWlmIChib290X2NwdV9kYXRhLng4NiA+PSAweDEwKSB7CisJCWlmICghZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpKSB7CisJCQlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDTFJfMSwgJnB2dC0+ZGNscjEpOworCQkJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0hSXzEsICZwdnQtPmRjaHIxKTsKKwkJfQorCQlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5taXNjX2YzX2N0bCwgRVhUX05CX01DQV9DRkcsICZ0bXApOwogCX0KKworCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweDEwICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gNyAmJgorCSAgICAvKiBGM3gxODBbRWNjU3ltYm9sU2l6ZV09MSA9PiB4OCBzeW1ib2xzICovCisJICAgIHRtcCAmIEJJVCgyNSkpCisJCXB2dC0+c3luX3R5cGUgPSA4OworCWVsc2UKKwkJcHZ0LT5zeW5fdHlwZSA9IDQ7CisKIAlhbWQ2NF9kdW1wX21pc2NfcmVncyhwdnQpOwogfQogCkBAIC0yNzM5LDkgKzI2NDEsNiBAQAogCW1jaS0+ZGV2X25hbWUJCT0gcGNpX25hbWUocHZ0LT5kcmFtX2YyX2N0bCk7CiAJbWNpLT5jdGxfcGFnZV90b19waHlzCT0gTlVMTDsKIAotCS8qIElNUE9SVEFOVDogU2V0IHRoZSBwb2xsaW5nICdjaGVjaycgZnVuY3Rpb24gaW4gdGhpcyBtb2R1bGUgKi8KLQltY2ktPmVkYWNfY2hlY2sJCT0gYW1kNjRfY2hlY2s7Ci0KIAkvKiBtZW1vcnkgc2NydWJiZXIgaW50ZXJmYWNlICovCiAJbWNpLT5zZXRfc2RyYW1fc2NydWJfcmF0ZSA9IGFtZDY0X3NldF9zY3J1Yl9yYXRlOwogCW1jaS0+Z2V0X3NkcmFtX3NjcnViX3JhdGUgPSBhbWQ2NF9nZXRfc2NydWJfcmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmggYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCmluZGV4IDBkNGJmNTYuLjYxM2I5MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaApAQCAtMjQ0LDQ0ICsyNDQsMTcgQEAKIAogCiAjZGVmaW5lIEYxMF9EQ1RMX1NFTF9MT1cJCTB4MTEwCi0KLSNkZWZpbmUgZGN0X3NlbF9iYXNlYWRkcihwdnQpICAgIFwKLQkoKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdykgJiAweEZGRkZGODAwKQotCi0jZGVmaW5lIGRjdF9zZWxfaW50ZXJsZWF2ZV9hZGRyKHB2dCkgICAgXAotCSgoKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdykgPj4gNikgJiAweDMpCi0KLWVudW0gewotCUYxMF9EQ1RMX1NFTF9MT1dfRGN0U2VsSGlSbmdFbgk9IEJJVCgwKSwKLQlGMTBfRENUTF9TRUxfTE9XX0RjdFNlbEludEx2RW4JPSBCSVQoMiksCi0JRjEwX0RDVExfU0VMX0xPV19EY3RHYW5nRW4JPSBCSVQoNCksCi0JRjEwX0RDVExfU0VMX0xPV19EY3REYXRJbnRMdgk9IEJJVCg1KSwKLQlGMTBfRENUTF9TRUxfTE9XX0RyYW1FbmFibGUJPSBCSVQoOCksCi0JRjEwX0RDVExfU0VMX0xPV19NZW1DbGVhcmVkCT0gQklUKDEwKSwKLX07Ci0KLSNkZWZpbmUgICAgZGN0X2hpZ2hfcmFuZ2VfZW5hYmxlZChwdnQpICAgIFwKLQkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgRjEwX0RDVExfU0VMX0xPV19EY3RTZWxIaVJuZ0VuKQotCi0jZGVmaW5lIGRjdF9pbnRlcmxlYXZlX2VuYWJsZWQocHZ0KQkgICBcCi0JKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdyAmIEYxMF9EQ1RMX1NFTF9MT1dfRGN0U2VsSW50THZFbikKLQotI2RlZmluZSBkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkgICAgICAgIFwKLQkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgRjEwX0RDVExfU0VMX0xPV19EY3RHYW5nRW4pCi0KLSNkZWZpbmUgZGN0X2RhdGFfaW50bHZfZW5hYmxlZChwdnQpICAgIFwKLQkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgRjEwX0RDVExfU0VMX0xPV19EY3REYXRJbnRMdikKLQotI2RlZmluZSBkY3RfZHJhbV9lbmFibGVkKHB2dCkgICAgXAotCShwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cgJiBGMTBfRENUTF9TRUxfTE9XX0RyYW1FbmFibGUpCi0KLSNkZWZpbmUgZGN0X21lbW9yeV9jbGVhcmVkKHB2dCkgICAgXAotCShwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cgJiBGMTBfRENUTF9TRUxfTE9XX01lbUNsZWFyZWQpCi0KKyNkZWZpbmUgZGN0X3NlbF9iYXNlYWRkcihwdnQpCQkoKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdykgJiAweEZGRkZGODAwKQorI2RlZmluZSBkY3Rfc2VsX2ludGVybGVhdmVfYWRkcihwdnQpCSgoKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdykgPj4gNikgJiAweDMpCisjZGVmaW5lIGRjdF9oaWdoX3JhbmdlX2VuYWJsZWQocHZ0KQkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgQklUKDApKQorI2RlZmluZSBkY3RfaW50ZXJsZWF2ZV9lbmFibGVkKHB2dCkJKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdyAmIEJJVCgyKSkKKyNkZWZpbmUgZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpCShwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cgJiBCSVQoNCkpCisjZGVmaW5lIGRjdF9kYXRhX2ludGx2X2VuYWJsZWQocHZ0KQkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgQklUKDUpKQorI2RlZmluZSBkY3RfZHJhbV9lbmFibGVkKHB2dCkJCShwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cgJiBCSVQoOCkpCisjZGVmaW5lIGRjdF9tZW1vcnlfY2xlYXJlZChwdnQpCQkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgQklUKDEwKSkKIAogI2RlZmluZSBGMTBfRENUTF9TRUxfSElHSAkJMHgxMTQKIAotCiAvKgogICogRnVuY3Rpb24gMyAtIE1pc2MgQ29udHJvbAogICovCkBAIC0zODIsNiArMzU1LDggQEAKICNkZWZpbmUgSzhfTkJDQVBfU0VDREVECQkJQklUKDMpCiAjZGVmaW5lIEs4X05CQ0FQX0RDVF9EVUFMCQlCSVQoMCkKIAorI2RlZmluZSBFWFRfTkJfTUNBX0NGRwkJCTB4MTgwCisKIC8qIE1TUnMgKi8KICNkZWZpbmUgSzhfTVNSX01DR0NUTF9OQkUJCUJJVCg0KQogCkBAIC00NzEsNiArNDQ2LDkgQEAKIAl1MzIgZHJhbV9jdGxfc2VsZWN0X2hpZ2g7CS8qIERSQU0gQ29udHJvbGxlciBTZWxlY3QgSGlnaCBSZWcgKi8KIAl1MzIgb25saW5lX3NwYXJlOyAgICAgICAgICAgICAgIC8qIE9uLUxpbmUgc3BhcmUgUmVnICovCiAKKwkvKiB4NCBvciB4OCBzeW5kcm9tZXMgaW4gdXNlICovCisJdTggc3luX3R5cGU7CisKIAkvKiB0ZW1wIHN0b3JhZ2UgZm9yIHdoZW4gaW5wdXQgaXMgcmVjZWl2ZWQgZnJvbSBzeXNmcyAqLwogCXN0cnVjdCBlcnJfcmVncyBjdGxfZXJyb3JfaW5mbzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9lNzUyeF9lZGFjLmMKaW5kZXggYWUzZjgwYy4uMDczZjVhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jCkBAIC05NTgsNyArOTU4LDcgQEAKIH0KIAogLyogUHJvZ3JhbSBieXRlL3NlYyBiYW5kd2lkdGggc2NydWIgcmF0ZSB0byBoYXJkd2FyZSAqLwotc3RhdGljIGludCBzZXRfc2RyYW1fc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHUzMiAqbmV3X2J3KQorc3RhdGljIGludCBzZXRfc2RyYW1fc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHUzMiBuZXdfYncpCiB7CiAJY29uc3Qgc3RydWN0IHNjcnVicmF0ZSAqc2NydWJyYXRlczsKIAlzdHJ1Y3QgZTc1MnhfcHZ0ICpwdnQgPSAoc3RydWN0IGU3NTJ4X3B2dCAqKSBtY2ktPnB2dF9pbmZvOwpAQCAtOTc1LDcgKzk3NSw3IEBACiAJICogZGVzaXJlZCByYXRlIGFuZCBwcm9ncmFtIHRoZSBjb29yZXNwb25kaW5nIHJlZ2lzdGVyIHZhbHVlLgogCSAqLwogCWZvciAoaSA9IDA7IHNjcnVicmF0ZXNbaV0uYmFuZHdpZHRoICE9IFNEUkFURV9FT1Q7IGkrKykKLQkJaWYgKHNjcnVicmF0ZXNbaV0uYmFuZHdpZHRoID49ICpuZXdfYncpCisJCWlmIChzY3J1YnJhdGVzW2ldLmJhbmR3aWR0aCA+PSBuZXdfYncpCiAJCQlicmVhazsKIAogCWlmIChzY3J1YnJhdGVzW2ldLmJhbmR3aWR0aCA9PSBTRFJBVEVfRU9UKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCmluZGV4IGVmY2E5MzQuLmNlNzE0NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKQEAgLTQ5LDIxICs0OSwxNSBAQAogI2RlZmluZSBlZGFjX3ByaW50ayhsZXZlbCwgcHJlZml4LCBmbXQsIGFyZy4uLikgXAogCXByaW50ayhsZXZlbCAiRURBQyAiIHByZWZpeCAiOiAiIGZtdCwgIyNhcmcpCiAKLSNkZWZpbmUgZWRhY19wcmludGtfdmVyYm9zZShsZXZlbCwgcHJlZml4LCBmbXQsIGFyZy4uLikgXAotCXByaW50ayhsZXZlbCAiRURBQyAiIHByZWZpeCAiOiAiICJpbiAlcywgbGluZSBhdCAlZDogIiBmbXQsCVwKLQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjI2FyZykKLQogI2RlZmluZSBlZGFjX21jX3ByaW50ayhtY2ksIGxldmVsLCBmbXQsIGFyZy4uLikgXAogCXByaW50ayhsZXZlbCAiRURBQyBNQyVkOiAiIGZtdCwgbWNpLT5tY19pZHgsICMjYXJnKQogCiAjZGVmaW5lIGVkYWNfbWNfY2hpcHNldF9wcmludGsobWNpLCBsZXZlbCwgcHJlZml4LCBmbXQsIGFyZy4uLikgXAogCXByaW50ayhsZXZlbCAiRURBQyAiIHByZWZpeCAiIE1DJWQ6ICIgZm10LCBtY2ktPm1jX2lkeCwgIyNhcmcpCiAKLS8qIGVkYWNfZGV2aWNlIHByaW50ayAqLwogI2RlZmluZSBlZGFjX2RldmljZV9wcmludGsoY3RsLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKIAlwcmludGsobGV2ZWwgIkVEQUMgREVWSUNFJWQ6ICIgZm10LCBjdGwtPmRldl9pZHgsICMjYXJnKQogCi0vKiBlZGFjX3BjaSBwcmludGsgKi8KICNkZWZpbmUgZWRhY19wY2lfcHJpbnRrKGN0bCwgbGV2ZWwsIGZtdCwgYXJnLi4uKSBcCiAJcHJpbnRrKGxldmVsICJFREFDIFBDSSVkOiAiIGZtdCwgY3RsLT5wY2lfaWR4LCAjI2FyZykKIApAQCAtNzYsMjEgKzcwLDEyIEBACiBleHRlcm4gaW50IGVkYWNfZGVidWdfbGV2ZWw7CiBleHRlcm4gY29uc3QgY2hhciAqZWRhY19tZW1fdHlwZXNbXTsKIAotI2lmbmRlZiBDT05GSUdfRURBQ19ERUJVR19WRVJCT1NFCiAjZGVmaW5lIGVkYWNfZGVidWdfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJaWYgKGxldmVsIDw9IGVkYWNfZGVidWdfbGV2ZWwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQllZGFjX3ByaW50ayhLRVJOX0RFQlVHLCBFREFDX0RFQlVHLAkJXAogCQkJCSAgICAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNhcmcpOwlcCiAJfSB3aGlsZSAoMCkKLSNlbHNlICAvKiBDT05GSUdfRURBQ19ERUJVR19WRVJCT1NFICovCi0jZGVmaW5lIGVkYWNfZGVidWdfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAobGV2ZWwgPD0gZWRhY19kZWJ1Z19sZXZlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQllZGFjX3ByaW50a192ZXJib3NlKEtFUk5fREVCVUcsIEVEQUNfREVCVUcsIGZtdCwgXAotCQkJCQkgICAgIyNhcmcpOwkJCVwKLQl9IHdoaWxlICgwKQotI2VuZGlmCiAKICNkZWZpbmUgZGVidWdmMCggLi4uICkgZWRhY19kZWJ1Z19wcmludGsoMCwgX19WQV9BUkdTX18gKQogI2RlZmluZSBkZWJ1Z2YxKCAuLi4gKSBlZGFjX2RlYnVnX3ByaW50aygxLCBfX1ZBX0FSR1NfXyApCkBAIC0zOTMsNyArMzc4LDcgQEAKIAkgICBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgY29uZmlndXJlcyB3aGF0ZXZlciBlbHNlIG5lZWRzCiAJICAgdG8gYmUgY29uZmlndXJlZC4KIAkgKi8KLQlpbnQgKCpzZXRfc2RyYW1fc2NydWJfcmF0ZSkgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2ksIHUzMiAqIGJ3KTsKKwlpbnQgKCpzZXRfc2RyYW1fc2NydWJfcmF0ZSkgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2ksIHUzMiBidyk7CiAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgc2RyYW0gbWVtb3J5IHNjcnViIHJhdGUgZnJvbSB0aGUgaW50ZXJuYWwKIAkgICByZXByZXNlbnRhdGlvbiBhbmQgY29udmVydHMgaXQgdG8gdGhlIGNsb3Nlc3QgbWF0Y2hpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jCmluZGV4IGMyMDBjMmYuLjhhYWQ5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNfc3lzZnMuYwpAQCAtMTI0LDE5ICsxMjQsNiBAQAogCVtFREFDX1MxNkVDRDE2RURdID0gIlMxNkVDRDE2RUQiCiB9OwogCi0KLQotc3RhdGljIHNzaXplX3QgbWVtY3RybF9pbnRfc3RvcmUodm9pZCAqcHRyLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgKnZhbHVlID0gKGludCAqKXB0cjsKLQotCWlmIChpc2RpZ2l0KCpidWZmZXIpKQotCQkqdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDApOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi0KIC8qIEVEQUMgc3lzZnMgQ1NST1cgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBtZXRob2RzCiAgKi8KIApAQCAtNDUwLDUzICs0MzcsNTQgQEAKIAogLyogbWVtb3J5IHNjcnViYmluZyAqLwogc3RhdGljIHNzaXplX3QgbWNpX3NkcmFtX3NjcnViX3JhdGVfc3RvcmUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAotCQkJCQljb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCisJCQkJCSAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQogewotCXUzMiBiYW5kd2lkdGggPSAtMTsKKwl1bnNpZ25lZCBsb25nIGJhbmR3aWR0aCA9IDA7CisJaW50IGVycjsKIAotCWlmIChtY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlKSB7Ci0KLQkJbWVtY3RybF9pbnRfc3RvcmUoJmJhbmR3aWR0aCwgZGF0YSwgY291bnQpOwotCi0JCWlmICghKCptY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlKSAobWNpLCAmYmFuZHdpZHRoKSkgewotCQkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKLQkJCQkiU2NydWIgcmF0ZSBzZXQgc3VjY2Vzc2Z1bGx5LCBhcHBsaWVkOiAlZFxuIiwKLQkJCQliYW5kd2lkdGgpOwotCQl9IGVsc2UgewotCQkJLyogRklYTUU6IGVycm9yIGNvZGVzIG1heWJlPyAqLwotCQkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKLQkJCQkiU2NydWIgcmF0ZSBzZXQgRkFJTEVELCBjb3VsZCBub3QgYXBwbHk6ICVkXG4iLAotCQkJCWJhbmR3aWR0aCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBGSVhNRTogcHJvZHVjZSAibm90IGltcGxlbWVudGVkIiBFUlJPUiBmb3IgdXNlci1zaWRlLiAqLworCWlmICghbWNpLT5zZXRfc2RyYW1fc2NydWJfcmF0ZSkgewogCQllZGFjX3ByaW50ayhLRVJOX1dBUk5JTkcsIEVEQUNfTUMsCi0JCQkiTWVtb3J5IHNjcnViYmluZyAnc2V0J2NvbnRyb2wgaXMgbm90IGltcGxlbWVudGVkIVxuIik7CisJCQkgICAgIk1lbW9yeSBzY3J1YiByYXRlIHNldHRpbmcgbm90IGltcGxlbWVudGVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gY291bnQ7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoZGF0YSwgMTAsICZiYW5kd2lkdGgpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBtY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlKG1jaSwgKHUzMiliYW5kd2lkdGgpOworCWlmIChlcnIpIHsKKwkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKKwkJCSAgICAiRmFpbGVkIHNldHRpbmcgc2NydWIgcmF0ZSB0byAlbHVcbiIsIGJhbmR3aWR0aCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllbHNlIHsKKwkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKKwkJCSAgICAiU2NydWIgcmF0ZSBzZXQgdG86ICVsdVxuIiwgYmFuZHdpZHRoKTsKKwkJcmV0dXJuIGNvdW50OworCX0KIH0KIAogc3RhdGljIHNzaXplX3QgbWNpX3NkcmFtX3NjcnViX3JhdGVfc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCiB7Ci0JdTMyIGJhbmR3aWR0aCA9IC0xOworCXUzMiBiYW5kd2lkdGggPSAwOworCWludCBlcnI7CiAKLQlpZiAobWNpLT5nZXRfc2RyYW1fc2NydWJfcmF0ZSkgewotCQlpZiAoISgqbWNpLT5nZXRfc2RyYW1fc2NydWJfcmF0ZSkgKG1jaSwgJmJhbmR3aWR0aCkpIHsKLQkJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsCi0JCQkJIlNjcnViIHJhdGUgc3VjY2Vzc2Z1bGx5LCBmZXRjaGVkOiAlZFxuIiwKLQkJCQliYW5kd2lkdGgpOwotCQl9IGVsc2UgewotCQkJLyogRklYTUU6IGVycm9yIGNvZGVzIG1heWJlPyAqLwotCQkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKLQkJCQkiU2NydWIgcmF0ZSBmZXRjaCBGQUlMRUQsIGdvdDogJWRcbiIsCi0JCQkJYmFuZHdpZHRoKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIEZJWE1FOiBwcm9kdWNlICJub3QgaW1wbGVtZW50ZWQiIEVSUk9SIGZvciB1c2VyLXNpZGUuICAqLworCWlmICghbWNpLT5nZXRfc2RyYW1fc2NydWJfcmF0ZSkgewogCQllZGFjX3ByaW50ayhLRVJOX1dBUk5JTkcsIEVEQUNfTUMsCi0JCQkiTWVtb3J5IHNjcnViYmluZyAnZ2V0JyBjb250cm9sIGlzIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCQkgICAgIk1lbW9yeSBzY3J1YiByYXRlIHJlYWRpbmcgbm90IGltcGxlbWVudGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHVybiBzcHJpbnRmKGRhdGEsICIlZFxuIiwgYmFuZHdpZHRoKTsKKworCWVyciA9IG1jaS0+Z2V0X3NkcmFtX3NjcnViX3JhdGUobWNpLCAmYmFuZHdpZHRoKTsKKwlpZiAoZXJyKSB7CisJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsICJFcnJvciByZWFkaW5nIHNjcnViIHJhdGVcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwllbHNlIHsKKwkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKKwkJCSAgICAiUmVhZCBzY3J1YiByYXRlOiAlZFxuIiwgYmFuZHdpZHRoKTsKKwkJcmV0dXJuIHNwcmludGYoZGF0YSwgIiVkXG4iLCBiYW5kd2lkdGgpOworCX0KIH0KIAogLyogZGVmYXVsdCBhdHRyaWJ1dGUgZmlsZXMgZm9yIHRoZSBNQ0kgb2JqZWN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tY2VfYW1kLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tY2VfYW1kLmMKaW5kZXggOTdlNjRiYy4uYmFlOTM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWNlX2FtZC5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jZV9hbWQuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJdTMyIGVjICA9IG1jMF9zdGF0dXMgJiAweGZmZmY7CiAJdTMyIHhlYyA9IChtYzBfc3RhdHVzID4+IDE2KSAmIDB4ZjsKIAotCXByX2VtZXJnKCIgRGF0YSBDYWNoZSBFcnJvciIpOworCXByX2VtZXJnKCJEYXRhIENhY2hlIEVycm9yIik7CiAKIAlpZiAoeGVjID09IDEgJiYgVExCX0VSUk9SKGVjKSkKIAkJcHJfY29udCgiOiAlcyBUTEIgbXVsdGltYXRjaC5cbiIsIExMX01TRyhlYykpOwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJdTMyIGVjICA9IG1jMV9zdGF0dXMgJiAweGZmZmY7CiAJdTMyIHhlYyA9IChtYzFfc3RhdHVzID4+IDE2KSAmIDB4ZjsKIAotCXByX2VtZXJnKCIgSW5zdHJ1Y3Rpb24gQ2FjaGUgRXJyb3IiKTsKKwlwcl9lbWVyZygiSW5zdHJ1Y3Rpb24gQ2FjaGUgRXJyb3IiKTsKIAogCWlmICh4ZWMgPT0gMSAmJiBUTEJfRVJST1IoZWMpKQogCQlwcl9jb250KCI6ICVzIFRMQiBtdWx0aW1hdGNoLlxuIiwgTExfTVNHKGVjKSk7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAl1MzIgZWMgPSBtYzJfc3RhdHVzICYgMHhmZmZmOwogCXUzMiB4ZWMgPSAobWMyX3N0YXR1cyA+PiAxNikgJiAweGY7CiAKLQlwcl9lbWVyZygiIEJ1cyBVbml0IEVycm9yIik7CisJcHJfZW1lcmcoIkJ1cyBVbml0IEVycm9yIik7CiAKIAlpZiAoeGVjID09IDB4MSkKIAkJcHJfY29udCgiIGluIHRoZSB3cml0ZSBkYXRhIGJ1ZmZlcnMuXG4iKTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCXUzMiBlYyAgPSBtYzNfc3RhdHVzICYgMHhmZmZmOwogCXUzMiB4ZWMgPSAobWMzX3N0YXR1cyA+PiAxNikgJiAweGY7CiAKLQlwcl9lbWVyZygiIExvYWQgU3RvcmUgRXJyb3IiKTsKKwlwcl9lbWVyZygiTG9hZCBTdG9yZSBFcnJvciIpOwogCiAJaWYgKHhlYyA9PSAweDApIHsKIAkJdTggcnJyciA9IChlYyA+PiA0KSAmIDB4ZjsKQEAgLTMwNCw3ICszMDQsNyBAQAogCWlmIChUTEJfRVJST1IoZWMpICYmICFyZXBvcnRfZ2FydF9lcnJvcnMpCiAJCXJldHVybjsKIAotCXByX2VtZXJnKCIgTm9ydGhicmlkZ2UgRXJyb3IsIG5vZGUgJWQiLCBub2RlX2lkKTsKKwlwcl9lbWVyZygiTm9ydGhicmlkZ2UgRXJyb3IsIG5vZGUgJWQiLCBub2RlX2lkKTsKIAogCS8qCiAJICogRjEwaCwgcmV2RCBjYW4gZGlzYWJsZSBFcnJDcHVbMzowXSBzbyBjaGVjayB0aGF0IGZpcnN0IGFuZCBhbHNvIHRoZQpAQCAtMzQyLDEzICszNDIsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhbWRfZGVjb2RlX2Vycl9jb2RlKHVuc2lnbmVkIGludCBlYykKIHsKIAlpZiAoVExCX0VSUk9SKGVjKSkgewotCQlwcl9lbWVyZygiIFRyYW5zYWN0aW9uOiAlcywgQ2FjaGUgTGV2ZWwgJXNcbiIsCisJCXByX2VtZXJnKCJUcmFuc2FjdGlvbjogJXMsIENhY2hlIExldmVsICVzXG4iLAogCQkJIFRUX01TRyhlYyksIExMX01TRyhlYykpOwogCX0gZWxzZSBpZiAoTUVNX0VSUk9SKGVjKSkgewotCQlwcl9lbWVyZygiIFRyYW5zYWN0aW9uOiAlcywgVHlwZTogJXMsIENhY2hlIExldmVsOiAlcyIsCisJCXByX2VtZXJnKCJUcmFuc2FjdGlvbjogJXMsIFR5cGU6ICVzLCBDYWNoZSBMZXZlbDogJXMiLAogCQkJIFJSUlJfTVNHKGVjKSwgVFRfTVNHKGVjKSwgTExfTVNHKGVjKSk7CiAJfSBlbHNlIGlmIChCVVNfRVJST1IoZWMpKSB7Ci0JCXByX2VtZXJnKCIgVHJhbnNhY3Rpb24gdHlwZTogJXMoJXMpLCAlcywgQ2FjaGUgTGV2ZWw6ICVzLCAiCisJCXByX2VtZXJnKCJUcmFuc2FjdGlvbiB0eXBlOiAlcyglcyksICVzLCBDYWNoZSBMZXZlbDogJXMsICIKIAkJCSAiUGFydGljaXBhdGluZyBQcm9jZXNzb3I6ICVzXG4iLAogCQkJICBSUlJSX01TRyhlYyksIElJX01TRyhlYyksIFRPX01TRyhlYyksIExMX01TRyhlYyksCiAJCQkgIFBQX01TRyhlYykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k1MTAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pNTEwMF9lZGFjLmMKaW5kZXggZWU5NzUzY2YuLmY0NTlhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pNTEwMF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k1MTAwX2VkYWMuYwpAQCAtNTg5LDE0ICs1ODksMTMgQEAKIC8qCiAgKiBUaGUgYmFuZHdpZHRoIGlzIGJhc2VkIG9uIGV4cGVyaW1lbnRhdGlvbiwgZmVlbCBmcmVlIHRvIHJlZmluZSBpdC4KICAqLwotc3RhdGljIGludCBpNTEwMF9zZXRfc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCi0JCQkJICAgICAgIHUzMiAqYmFuZHdpZHRoKQorc3RhdGljIGludCBpNTEwMF9zZXRfc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHUzMiBiYW5kd2lkdGgpCiB7CiAJc3RydWN0IGk1MTAwX3ByaXYgKnByaXYgPSBtY2ktPnB2dF9pbmZvOwogCXUzMiBkdzsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwcml2LT5tYywgSTUxMDBfTUMsICZkdyk7Ci0JaWYgKCpiYW5kd2lkdGgpIHsKKwlpZiAoYmFuZHdpZHRoKSB7CiAJCXByaXYtPnNjcnViX2VuYWJsZSA9IDE7CiAJCWR3IHw9IEk1MTAwX01DX1NDUkJFTl9NQVNLOwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJihwcml2LT5pNTEwMF9zY3J1YmJpbmcpLApAQCAtNjEwLDcgKzYwOSw3IEBACiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocHJpdi0+bWMsIEk1MTAwX01DLCAmZHcpOwogCi0JKmJhbmR3aWR0aCA9IDU5MDAwMDAgKiBpNTEwMF9tY19zY3JiZW4oZHcpOworCWJhbmR3aWR0aCA9IDU5MDAwMDAgKiBpNTEwMF9tY19zY3JiZW4oZHcpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKaW5kZXggZjM5YjAwYS4uMTA1MjM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwpAQCAtMzM2LDYgKzMzNiw3IEBACiAJfSwKIAl7fSwKIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtcGM4NXh4X3BjaV9lcnJfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtcGM4NXh4X3BjaV9lcnJfZHJpdmVyID0gewogCS5wcm9iZSA9IG1wYzg1eHhfcGNpX2Vycl9wcm9iZSwKQEAgLTY1MCw2ICs2NTEsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1wYzg1eHhfbDJfZXJyX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXBjODV4eF9sMl9lcnJfZHJpdmVyID0gewogCS5wcm9iZSA9IG1wYzg1eHhfbDJfZXJyX3Byb2JlLApAQCAtMTEyNiw2ICsxMTI4LDcgQEAKIAl7IC5jb21wYXRpYmxlID0gImZzbCxwMjAyMC1tZW1vcnktY29udHJvbGxlciIsIH0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXBjODV4eF9tY19lcnJfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtcGM4NXh4X21jX2Vycl9kcml2ZXIgPSB7CiAJLnByb2JlID0gbXBjODV4eF9tY19lcnJfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKaW5kZXggMWIwM2JhMS4uYTZjNjcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwpAQCAtMTIyLDggKzEyMiwxNyBAQAogCSAgaXMgbmVjZXNzYXJ5IGZvciBpU0NTSSBCb290IEZpcm13YXJlIFRhYmxlIEF0dHJpYnV0ZXMgbW9kdWxlIHRvIHdvcmsKIAkgIHByb3Blcmx5LgogCitjb25maWcgSVNDU0lfQk9PVF9TWVNGUworCXRyaXN0YXRlICJpU0NTSSBCb290IFN5c2ZzIEludGVyZmFjZSIKKwlkZWZhdWx0CW4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGV4cG9zaW5nIGlTQ1NJIGJvb3QgaW5mb3JtYXRpb24KKwkgIHZpYSBzeXNmcyB0byB1c2Vyc3BhY2UuIElmIHlvdSB3aXNoIHRvIGV4cG9ydCB0aGlzIGluZm9ybWF0aW9uLAorCSAgc2F5IFkuIE90aGVyd2lzZSwgc2F5IE4uCisKIGNvbmZpZyBJU0NTSV9JQkZUCiAJdHJpc3RhdGUgImlTQ1NJIEJvb3QgRmlybXdhcmUgVGFibGUgQXR0cmlidXRlcyBtb2R1bGUiCisJc2VsZWN0IElTQ1NJX0JPT1RfU1lTRlMKIAlkZXBlbmRzIG9uIElTQ1NJX0lCRlRfRklORAogCWRlZmF1bHQJbgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCmluZGV4IDFjM2MxNzMuLjVmZTdlMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQpAQCAtMTAsNCArMTAsNSBAQAogb2JqLSQoQ09ORklHX0RNSUlEKQkJKz0gZG1pLWlkLm8KIG9iai0kKENPTkZJR19JU0NTSV9JQkZUX0ZJTkQpCSs9IGlzY3NpX2liZnRfZmluZC5vCiBvYmotJChDT05GSUdfSVNDU0lfSUJGVCkJKz0gaXNjc2lfaWJmdC5vCitvYmotJChDT05GSUdfSVNDU0lfQk9PVF9TWVNGUykJKz0gaXNjc2lfYm9vdF9zeXNmcy5vCiBvYmotJChDT05GSUdfRklSTVdBUkVfTUVNTUFQKQkrPSBtZW1tYXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKaW5kZXggYWE5YmM5ZS4uNjlhZDUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCkBAIC02MzQsOSArNjM0LDYgQEAKIAkgKiBiZWZvcmUgcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIKIAkgKi8KIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZGNkYmFzX3JlYm9vdF9uYik7Ci0Jc21pX2RhdGFfYnVmX2ZyZWUoKTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkY2RiYXNfcGRldik7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRjZGJhc19kcml2ZXIpOwogCiAJLyoKIAkgKiBXZSBoYXZlIHRvIGZyZWUgdGhlIGJ1ZmZlciBoZXJlIGluc3RlYWQgb2YgZGNkYmFzX3JlbW92ZQpAQCAtNjQ1LDYgKzY0Miw4IEBACiAJICogcmVsZWFzZWQuCiAJICovCiAJc21pX2RhdGFfYnVmX2ZyZWUoKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkY2RiYXNfcGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRjZGJhc19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChkY2RiYXNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwppbmRleCBhNzc3YTM1Li45NGE1OGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKQEAgLTIyOSwxMCArMjI5LDEyIEBACiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsX2NsYXNzX3VucmVnaXN0ZXI7CisJCWdvdG8gZmFpbF9mcmVlX2RtaV9kZXY7CiAKIAlyZXR1cm4gMDsKIAorZmFpbF9mcmVlX2RtaV9kZXY6CisJa2ZyZWUoZG1pX2Rldik7CiBmYWlsX2NsYXNzX3VucmVnaXN0ZXI6CiAKIAljbGFzc191bnJlZ2lzdGVyKCZkbWlfY2xhc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCmluZGV4IGQ0NjQ2NzIuLmIzZDIyZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKQEAgLTI3Nyw2ICsyNzcsMjkgQEAKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmxpc3QsICZkbWlfZGV2aWNlcyk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBkbWlfc2F2ZV9kZXZfb25ib2FyZChpbnQgaW5zdGFuY2UsIGludCBzZWdtZW50LCBpbnQgYnVzLAorCQkJCQlpbnQgZGV2Zm4sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRtaV9kZXZfb25ib2FyZCAqb25ib2FyZF9kZXY7CisKKwlvbmJvYXJkX2RldiA9IGRtaV9hbGxvYyhzaXplb2YoKm9uYm9hcmRfZGV2KSArIHN0cmxlbihuYW1lKSArIDEpOworCWlmICghb25ib2FyZF9kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9kZXZfb25ib2FyZDogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlyZXR1cm47CisJfQorCW9uYm9hcmRfZGV2LT5pbnN0YW5jZSA9IGluc3RhbmNlOworCW9uYm9hcmRfZGV2LT5zZWdtZW50ID0gc2VnbWVudDsKKwlvbmJvYXJkX2Rldi0+YnVzID0gYnVzOworCW9uYm9hcmRfZGV2LT5kZXZmbiA9IGRldmZuOworCisJc3RyY3B5KChjaGFyICopJm9uYm9hcmRfZGV2WzFdLCBuYW1lKTsKKwlvbmJvYXJkX2Rldi0+ZGV2LnR5cGUgPSBETUlfREVWX1RZUEVfREVWX09OQk9BUkQ7CisJb25ib2FyZF9kZXYtPmRldi5uYW1lID0gKGNoYXIgKikmb25ib2FyZF9kZXZbMV07CisJb25ib2FyZF9kZXYtPmRldi5kZXZpY2VfZGF0YSA9IG9uYm9hcmRfZGV2OworCisJbGlzdF9hZGQoJm9uYm9hcmRfZGV2LT5kZXYubGlzdCwgJmRtaV9kZXZpY2VzKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IGRtaV9zYXZlX2V4dGVuZGVkX2RldmljZXMoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtKQogewogCWNvbnN0IHU4ICpkID0gKHU4KikgZG0gKyA1OwpAQCAtMjg1LDYgKzMwOCw4IEBACiAJaWYgKCgqZCAmIDB4ODApID09IDApCiAJCXJldHVybjsKIAorCWRtaV9zYXZlX2Rldl9vbmJvYXJkKCooZCsxKSwgKih1MTYgKikoZCsyKSwgKihkKzQpLCAqKGQrNSksCisJCQkgICAgIGRtaV9zdHJpbmdfbm9zYXZlKGRtLCAqKGQtMSkpKTsKIAlkbWlfc2F2ZV9vbmVfZGV2aWNlKCpkICYgMHg3ZiwgZG1pX3N0cmluZ19ub3NhdmUoZG0sICooZCAtIDEpKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfYm9vdF9zeXNmcy5jIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9ib290X3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2YmZmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfYm9vdF9zeXNmcy5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogRXhwb3J0IHRoZSBpU0NTSSBib290IGluZm8gdG8gdXNlcmxhbmQgdmlhIHN5c2ZzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1pa2UgQ2hyaXN0aWUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2NzaV9ib290X3N5c2ZzLmg+CisKKworTU9EVUxFX0FVVEhPUigiTWlrZSBDaHJpc3RpZSA8bWljaGFlbGNAY3Mud2lzYy5lZHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInN5c2ZzIGludGVyZmFjZSBhbmQgaGVscGVycyB0byBleHBvcnQgaVNDU0kgYm9vdCBpbmZvcm1hdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworLyoKKyAqIFRoZSBrb2JqZWN0IGFuZCBhdHRyaWJ1dGUgc3RydWN0dXJlcy4KKyAqLworc3RydWN0IGlzY3NpX2Jvb3RfYXR0ciB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCWludCB0eXBlOworCXNzaXplX3QgKCpzaG93KSAodm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1Zik7Cit9OworCisvKgorICogVGhlIHJvdXRpbmUgY2FsbGVkIGZvciBhbGwgc3lzZnMgYXR0cmlidXRlcy4KKyAqLworc3RhdGljIHNzaXplX3QgaXNjc2lfYm9vdF9zaG93X2F0dHJpYnV0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmogPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpc2NzaV9ib290X2tvYmosIGtvYmopOworCXN0cnVjdCBpc2NzaV9ib290X2F0dHIgKmJvb3RfYXR0ciA9CisJCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGlzY3NpX2Jvb3RfYXR0ciwgYXR0cik7CisJc3NpemVfdCByZXQgPSAtRUlPOworCWNoYXIgKnN0ciA9IGJ1ZjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoYm9vdF9rb2JqLT5zaG93KQorCQlyZXQgPSBib290X2tvYmotPnNob3coYm9vdF9rb2JqLT5kYXRhLCBib290X2F0dHItPnR5cGUsIHN0cik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgaXNjc2lfYm9vdF9hdHRyX29wcyA9IHsKKwkuc2hvdyA9IGlzY3NpX2Jvb3Rfc2hvd19hdHRyaWJ1dGUsCit9OworCitzdGF0aWMgdm9pZCBpc2NzaV9ib290X2tvYmpfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmogPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpc2NzaV9ib290X2tvYmosIGtvYmopOworCisJa2ZyZWUoYm9vdF9rb2JqLT5kYXRhKTsKKwlrZnJlZShib290X2tvYmopOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBpc2NzaV9ib290X2t0eXBlID0geworCS5yZWxlYXNlID0gaXNjc2lfYm9vdF9rb2JqX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZpc2NzaV9ib290X2F0dHJfb3BzLAorfTsKKworI2RlZmluZSBpc2NzaV9ib290X3JkX2F0dHIoZm5uYW1lLCBzeXNmc19uYW1lLCBhdHRyX3R5cGUpCQlcCitzdGF0aWMgc3RydWN0IGlzY3NpX2Jvb3RfYXR0ciBpc2NzaV9ib290X2F0dHJfIyNmbm5hbWUgPSB7CVwKKwkuYXR0cgk9IHsgLm5hbWUgPSBfX3N0cmluZ2lmeShzeXNmc19uYW1lKSwgLm1vZGUgPSAwNDQ0IH0sCVwKKwkudHlwZQk9IGF0dHJfdHlwZSwJCQkJCQlcCit9CisKKy8qIFRhcmdldCBhdHRycyAqLworaXNjc2lfYm9vdF9yZF9hdHRyKHRndF9pbmRleCwgaW5kZXgsIElTQ1NJX0JPT1RfVEdUX0lOREVYKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cih0Z3RfZmxhZ3MsIGZsYWdzLCBJU0NTSV9CT09UX1RHVF9GTEFHUyk7Citpc2NzaV9ib290X3JkX2F0dHIodGd0X2lwLCBpcC1hZGRyLCBJU0NTSV9CT09UX1RHVF9JUF9BRERSKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cih0Z3RfcG9ydCwgcG9ydCwgSVNDU0lfQk9PVF9UR1RfUE9SVCk7Citpc2NzaV9ib290X3JkX2F0dHIodGd0X2x1biwgbHVuLCBJU0NTSV9CT09UX1RHVF9MVU4pOworaXNjc2lfYm9vdF9yZF9hdHRyKHRndF9jaGFwLCBjaGFwLXR5cGUsIElTQ1NJX0JPT1RfVEdUX0NIQVBfVFlQRSk7Citpc2NzaV9ib290X3JkX2F0dHIodGd0X25pYywgbmljLWFzc29jLCBJU0NTSV9CT09UX1RHVF9OSUNfQVNTT0MpOworaXNjc2lfYm9vdF9yZF9hdHRyKHRndF9uYW1lLCB0YXJnZXQtbmFtZSwgSVNDU0lfQk9PVF9UR1RfTkFNRSk7Citpc2NzaV9ib290X3JkX2F0dHIodGd0X2NoYXBfbmFtZSwgY2hhcC1uYW1lLCBJU0NTSV9CT09UX1RHVF9DSEFQX05BTUUpOworaXNjc2lfYm9vdF9yZF9hdHRyKHRndF9jaGFwX3NlY3JldCwgY2hhcC1zZWNyZXQsIElTQ1NJX0JPT1RfVEdUX0NIQVBfU0VDUkVUKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cih0Z3RfY2hhcF9yZXZfbmFtZSwgcmV2LWNoYXAtbmFtZSwKKwkJICAgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfTkFNRSk7Citpc2NzaV9ib290X3JkX2F0dHIodGd0X2NoYXBfcmV2X3NlY3JldCwgcmV2LWNoYXAtbmFtZS1zZWNyZXQsCisJCSAgIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0YXJnZXRfYXR0cnNbXSA9IHsKKwkmaXNjc2lfYm9vdF9hdHRyX3RndF9pbmRleC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfdGd0X2ZsYWdzLmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl90Z3RfaXAuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX3RndF9wb3J0LmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl90Z3RfbHVuLmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl90Z3RfY2hhcC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfdGd0X25pYy5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfdGd0X25hbWUuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX3RndF9jaGFwX25hbWUuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX3RndF9jaGFwX3NlY3JldC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfdGd0X2NoYXBfcmV2X25hbWUuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX3RndF9jaGFwX3Jldl9zZWNyZXQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgbW9kZV90IGlzY3NpX2Jvb3RfdGd0X2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaSkKK3sKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmogPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpc2NzaV9ib290X2tvYmosIGtvYmopOworCisJaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfdGd0X2luZGV4LmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX0lOREVYKTsKKwllbHNlIGlmIChhdHRyID09ICZpc2NzaV9ib290X2F0dHJfdGd0X2ZsYWdzLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX0ZMQUdTKTsKKwllbHNlIGlmIChhdHRyID09ICZpc2NzaV9ib290X2F0dHJfdGd0X2lwLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgICBJU0NTSV9CT09UX1RHVF9JUF9BRERSKTsKKwllbHNlIGlmIChhdHRyID09ICZpc2NzaV9ib290X2F0dHJfdGd0X3BvcnQuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgIElTQ1NJX0JPT1RfVEdUX1BPUlQpOworCWVsc2UgaWYgKGF0dHIgPT0gJmlzY3NpX2Jvb3RfYXR0cl90Z3RfbHVuLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgICBJU0NTSV9CT09UX1RHVF9MVU4pOworCWVsc2UgaWYgKGF0dHIgPT0gJmlzY3NpX2Jvb3RfYXR0cl90Z3RfY2hhcC5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX1RHVF9DSEFQX1RZUEUpOworCWVsc2UgaWYgKGF0dHIgPT0gJmlzY3NpX2Jvb3RfYXR0cl90Z3RfbmljLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX05JQ19BU1NPQyk7CisJZWxzZSBpZiAoYXR0ciA9PSAmaXNjc2lfYm9vdF9hdHRyX3RndF9uYW1lLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX05BTUUpOworCWVsc2UgaWYgKGF0dHIgPT0gJmlzY3NpX2Jvb3RfYXR0cl90Z3RfY2hhcF9uYW1lLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRSk7CisJZWxzZSBpZiAoYXR0ciA9PSAmaXNjc2lfYm9vdF9hdHRyX3RndF9jaGFwX3NlY3JldC5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX1RHVF9DSEFQX1NFQ1JFVCk7CisJZWxzZSBpZiAoYXR0ciA9PSAmaXNjc2lfYm9vdF9hdHRyX3RndF9jaGFwX3Jldl9uYW1lLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX05BTUUpOworCWVsc2UgaWYgKGF0dHIgPT0gJmlzY3NpX2Jvb3RfYXR0cl90Z3RfY2hhcF9yZXZfc2VjcmV0LmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlzY3NpX2Jvb3RfdGFyZ2V0X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gdGFyZ2V0X2F0dHJzLAorCS5pc192aXNpYmxlID0gaXNjc2lfYm9vdF90Z3RfYXR0cl9pc192aXNpYmxlLAorfTsKKworLyogRXRoZXJuZXQgYXR0cnMgKi8KK2lzY3NpX2Jvb3RfcmRfYXR0cihldGhfaW5kZXgsIGluZGV4LCBJU0NTSV9CT09UX0VUSF9JTkRFWCk7Citpc2NzaV9ib290X3JkX2F0dHIoZXRoX2ZsYWdzLCBmbGFncywgSVNDU0lfQk9PVF9FVEhfRkxBR1MpOworaXNjc2lfYm9vdF9yZF9hdHRyKGV0aF9pcCwgaXAtYWRkciwgSVNDU0lfQk9PVF9FVEhfSVBfQUREUik7Citpc2NzaV9ib290X3JkX2F0dHIoZXRoX3N1Ym5ldCwgc3VibmV0LW1hc2ssIElTQ1NJX0JPT1RfRVRIX1NVQk5FVF9NQVNLKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cihldGhfb3JpZ2luLCBvcmlnaW4sIElTQ1NJX0JPT1RfRVRIX09SSUdJTik7Citpc2NzaV9ib290X3JkX2F0dHIoZXRoX2dhdGV3YXksIGdhdGV3YXksIElTQ1NJX0JPT1RfRVRIX0dBVEVXQVkpOworaXNjc2lfYm9vdF9yZF9hdHRyKGV0aF9wcmltYXJ5X2RucywgcHJpbWFyeS1kbnMsIElTQ1NJX0JPT1RfRVRIX1BSSU1BUllfRE5TKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cihldGhfc2Vjb25kYXJ5X2Rucywgc2Vjb25kYXJ5LWRucywKKwkJICAgSVNDU0lfQk9PVF9FVEhfU0VDT05EQVJZX0ROUyk7Citpc2NzaV9ib290X3JkX2F0dHIoZXRoX2RoY3AsIGRoY3AsIElTQ1NJX0JPT1RfRVRIX0RIQ1ApOworaXNjc2lfYm9vdF9yZF9hdHRyKGV0aF92bGFuLCB2bGFuLCBJU0NTSV9CT09UX0VUSF9WTEFOKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cihldGhfbWFjLCBtYWMsIElTQ1NJX0JPT1RfRVRIX01BQyk7Citpc2NzaV9ib290X3JkX2F0dHIoZXRoX2hvc3RuYW1lLCBob3N0bmFtZSwgSVNDU0lfQk9PVF9FVEhfSE9TVE5BTUUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZXRoZXJuZXRfYXR0cnNbXSA9IHsKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9pbmRleC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfZXRoX2ZsYWdzLmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl9ldGhfaXAuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9zdWJuZXQuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9vcmlnaW4uYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9nYXRld2F5LmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl9ldGhfcHJpbWFyeV9kbnMuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9zZWNvbmRhcnlfZG5zLmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl9ldGhfZGhjcC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfZXRoX3ZsYW4uYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9tYWMuYXR0ciwKKwkmaXNjc2lfYm9vdF9hdHRyX2V0aF9ob3N0bmFtZS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBtb2RlX3QgaXNjc2lfYm9vdF9ldGhfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpKQoreworCXN0cnVjdCBpc2NzaV9ib290X2tvYmogKmJvb3Rfa29iaiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiwga29iaik7CisKKwlpZiAoYXR0ciA9PSAgJmlzY3NpX2Jvb3RfYXR0cl9ldGhfaW5kZXguYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9FVEhfSU5ERVgpOworCWVsc2UgaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfZXRoX2ZsYWdzLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfRVRIX0ZMQUdTKTsKKwllbHNlIGlmIChhdHRyID09ICAmaXNjc2lfYm9vdF9hdHRyX2V0aF9pcC5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX0VUSF9JUF9BRERSKTsKKwllbHNlIGlmIChhdHRyID09ICAmaXNjc2lfYm9vdF9hdHRyX2V0aF9zdWJuZXQuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9FVEhfU1VCTkVUX01BU0spOworCWVsc2UgaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfZXRoX29yaWdpbi5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX0VUSF9PUklHSU4pOworCWVsc2UgaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfZXRoX2dhdGV3YXkuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9FVEhfR0FURVdBWSk7CisJZWxzZSBpZiAoYXR0ciA9PSAgJmlzY3NpX2Jvb3RfYXR0cl9ldGhfcHJpbWFyeV9kbnMuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9FVEhfUFJJTUFSWV9ETlMpOworCWVsc2UgaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfZXRoX3NlY29uZGFyeV9kbnMuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9FVEhfU0VDT05EQVJZX0ROUyk7CisJZWxzZSBpZiAoYXR0ciA9PSAgJmlzY3NpX2Jvb3RfYXR0cl9ldGhfZGhjcC5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX0VUSF9ESENQKTsKKwllbHNlIGlmIChhdHRyID09ICAmaXNjc2lfYm9vdF9hdHRyX2V0aF92bGFuLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfRVRIX1ZMQU4pOworCWVsc2UgaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfZXRoX21hYy5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX0VUSF9NQUMpOworCWVsc2UgaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfZXRoX2hvc3RuYW1lLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfRVRIX0hPU1ROQU1FKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXNjc2lfYm9vdF9ldGhlcm5ldF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGV0aGVybmV0X2F0dHJzLAorCS5pc192aXNpYmxlID0gaXNjc2lfYm9vdF9ldGhfYXR0cl9pc192aXNpYmxlLAorfTsKKworLyogSW5pdGlhdG9yIGF0dHJzICovCitpc2NzaV9ib290X3JkX2F0dHIoaW5pX2luZGV4LCBpbmRleCwgSVNDU0lfQk9PVF9JTklfSU5ERVgpOworaXNjc2lfYm9vdF9yZF9hdHRyKGluaV9mbGFncywgZmxhZ3MsIElTQ1NJX0JPT1RfSU5JX0ZMQUdTKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cihpbmlfaXNucywgaXNucy1zZXJ2ZXIsIElTQ1NJX0JPT1RfSU5JX0lTTlNfU0VSVkVSKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cihpbmlfc2xwLCBzbHAtc2VydmVyLCBJU0NTSV9CT09UX0lOSV9TTFBfU0VSVkVSKTsKK2lzY3NpX2Jvb3RfcmRfYXR0cihpbmlfcHJpbWFyeV9yYWRpdXMsIHByaS1yYWRpdXMtc2VydmVyLAorCQkgICBJU0NTSV9CT09UX0lOSV9QUklfUkFESVVTX1NFUlZFUik7Citpc2NzaV9ib290X3JkX2F0dHIoaW5pX3NlY29uZGFyeV9yYWRpdXMsIHNlYy1yYWRpdXMtc2VydmVyLAorCQkgICBJU0NTSV9CT09UX0lOSV9TRUNfUkFESVVTX1NFUlZFUik7Citpc2NzaV9ib290X3JkX2F0dHIoaW5pX25hbWUsIGluaXRpYXRvci1uYW1lLCBJU0NTSV9CT09UX0lOSV9JTklUSUFUT1JfTkFNRSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbml0aWF0b3JfYXR0cnNbXSA9IHsKKwkmaXNjc2lfYm9vdF9hdHRyX2luaV9pbmRleC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfaW5pX2ZsYWdzLmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl9pbmlfaXNucy5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfaW5pX3NscC5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfaW5pX3ByaW1hcnlfcmFkaXVzLmF0dHIsCisJJmlzY3NpX2Jvb3RfYXR0cl9pbmlfc2Vjb25kYXJ5X3JhZGl1cy5hdHRyLAorCSZpc2NzaV9ib290X2F0dHJfaW5pX25hbWUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgbW9kZV90IGlzY3NpX2Jvb3RfaW5pX2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaSkKK3sKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmogPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpc2NzaV9ib290X2tvYmosIGtvYmopOworCisJaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfaW5pX2luZGV4LmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfSU5JX0lOREVYKTsKKwlpZiAoYXR0ciA9PSAgJmlzY3NpX2Jvb3RfYXR0cl9pbmlfZmxhZ3MuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9JTklfRkxBR1MpOworCWlmIChhdHRyID09ICAmaXNjc2lfYm9vdF9hdHRyX2luaV9pc25zLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfSU5JX0lTTlNfU0VSVkVSKTsKKwlpZiAoYXR0ciA9PSAgJmlzY3NpX2Jvb3RfYXR0cl9pbmlfc2xwLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfSU5JX1NMUF9TRVJWRVIpOworCWlmIChhdHRyID09ICAmaXNjc2lfYm9vdF9hdHRyX2luaV9wcmltYXJ5X3JhZGl1cy5hdHRyKQorCQlyZXR1cm4gYm9vdF9rb2JqLT5pc192aXNpYmxlKGJvb3Rfa29iai0+ZGF0YSwKKwkJCQkJICAgICBJU0NTSV9CT09UX0lOSV9QUklfUkFESVVTX1NFUlZFUik7CisJaWYgKGF0dHIgPT0gICZpc2NzaV9ib290X2F0dHJfaW5pX3NlY29uZGFyeV9yYWRpdXMuYXR0cikKKwkJcmV0dXJuIGJvb3Rfa29iai0+aXNfdmlzaWJsZShib290X2tvYmotPmRhdGEsCisJCQkJCSAgICAgSVNDU0lfQk9PVF9JTklfU0VDX1JBRElVU19TRVJWRVIpOworCWlmIChhdHRyID09ICAmaXNjc2lfYm9vdF9hdHRyX2luaV9uYW1lLmF0dHIpCisJCXJldHVybiBib290X2tvYmotPmlzX3Zpc2libGUoYm9vdF9rb2JqLT5kYXRhLAorCQkJCQkgICAgIElTQ1NJX0JPT1RfSU5JX0lOSVRJQVRPUl9OQU1FKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpc2NzaV9ib290X2luaXRpYXRvcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGluaXRpYXRvcl9hdHRycywKKwkuaXNfdmlzaWJsZSA9IGlzY3NpX2Jvb3RfaW5pX2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICoKK2lzY3NpX2Jvb3RfY3JlYXRlX2tvYmooc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0LAorCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpbmRleCwgdm9pZCAqZGF0YSwKKwkJICAgICAgIHNzaXplX3QgKCpzaG93KSAodm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZiksCisJCSAgICAgICBtb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpKQoreworCXN0cnVjdCBpc2NzaV9ib290X2tvYmogKmJvb3Rfa29iajsKKworCWJvb3Rfa29iaiA9IGt6YWxsb2Moc2l6ZW9mKCpib290X2tvYmopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJcmV0dXJuIE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmJvb3Rfa29iai0+bGlzdCk7CisKKwlib290X2tvYmotPmtvYmoua3NldCA9IGJvb3Rfa3NldC0+a3NldDsKKwlpZiAoa29iamVjdF9pbml0X2FuZF9hZGQoJmJvb3Rfa29iai0+a29iaiwgJmlzY3NpX2Jvb3Rfa3R5cGUsCisJCQkJIE5VTEwsIG5hbWUsIGluZGV4KSkgeworCQlrZnJlZShib290X2tvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm9vdF9rb2JqLT5kYXRhID0gZGF0YTsKKwlib290X2tvYmotPnNob3cgPSBzaG93OworCWJvb3Rfa29iai0+aXNfdmlzaWJsZSA9IGlzX3Zpc2libGU7CisKKwlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZib290X2tvYmotPmtvYmosIGF0dHJfZ3JvdXApKSB7CisJCS8qCisJCSAqIFdlIGRvIG5vdCB3YW50IHRvIGZyZWUgdGhpcyBiZWNhdXNlIHRoZSBjYWxsZXIKKwkJICogd2lsbCBhc3N1bWUgdGhhdCBzaW5jZSB0aGUgY3JlYXRpb24gY2FsbCBmYWlsZWQKKwkJICogdGhlIGJvb3Qga29iaiB3YXMgbm90IHNldHVwIGFuZCB0aGUgbm9ybWFsIHJlbGVhc2UKKwkJICogcGF0aCBpcyBub3QgYmVpbmcgcnVuLgorCQkgKi8KKwkJYm9vdF9rb2JqLT5kYXRhID0gTlVMTDsKKwkJa29iamVjdF9wdXQoJmJvb3Rfa29iai0+a29iaik7CisJCXJldHVybiBOVUxMOworCX0KKwlib290X2tvYmotPmF0dHJfZ3JvdXAgPSBhdHRyX2dyb3VwOworCisJa29iamVjdF91ZXZlbnQoJmJvb3Rfa29iai0+a29iaiwgS09CSl9BREQpOworCS8qIE5vdGhpbmcgYnJva2Ugc28gbGV0cyBhZGQgaXQgdG8gdGhlIGxpc3QuICovCisJbGlzdF9hZGRfdGFpbCgmYm9vdF9rb2JqLT5saXN0LCAmYm9vdF9rc2V0LT5rb2JqX2xpc3QpOworCXJldHVybiBib290X2tvYmo7Cit9CisKK3N0YXRpYyB2b2lkIGlzY3NpX2Jvb3RfcmVtb3ZlX2tvYmooc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqYm9vdF9rb2JqKQoreworCWxpc3RfZGVsKCZib290X2tvYmotPmxpc3QpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmYm9vdF9rb2JqLT5rb2JqLCBib290X2tvYmotPmF0dHJfZ3JvdXApOworCWtvYmplY3RfcHV0KCZib290X2tvYmotPmtvYmopOworfQorCisvKioKKyAqIGlzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldCgpIC0gY3JlYXRlIGJvb3QgdGFyZ2V0IHN5c2ZzIGRpcgorICogQGJvb3Rfa3NldDogYm9vdCBrc2V0CisgKiBAaW5kZXg6IHRoZSB0YXJnZXQgaWQKKyAqIEBkYXRhOiBkcml2ZXIgc3BlY2lmaWMgZGF0YSBmb3IgdGFyZ2V0CisgKiBAc2hvdzogYXR0ciBzaG93IGZ1bmN0aW9uCisgKiBAaXNfdmlzaWJsZTogYXR0ciB2aXNpYmlsaXR5IGZ1bmN0aW9uCisgKgorICogTm90ZTogVGhlIGJvb3Qgc3lzZnMgbGliIHdpbGwgZnJlZSB0aGUgZGF0YSBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsZXIKKyAqIHdoZW4gYWxsIHJlZnMgdG8gdGhlIHRhcmdldCBrb2JqZWN0IGhhdmUgYmVlbiByZWxlYXNlZC4KKyAqLworc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqCitpc2NzaV9ib290X2NyZWF0ZV90YXJnZXQoc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0LCBpbnQgaW5kZXgsCisJCQkgdm9pZCAqZGF0YSwKKwkJCSBzc2l6ZV90ICgqc2hvdykgKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpLAorCQkJIG1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSkpCit7CisJcmV0dXJuIGlzY3NpX2Jvb3RfY3JlYXRlX2tvYmooYm9vdF9rc2V0LCAmaXNjc2lfYm9vdF90YXJnZXRfYXR0cl9ncm91cCwKKwkJCQkgICAgICAidGFyZ2V0JWQiLCBpbmRleCwgZGF0YSwgc2hvdywgaXNfdmlzaWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9ib290X2NyZWF0ZV90YXJnZXQpOworCisvKioKKyAqIGlzY3NpX2Jvb3RfY3JlYXRlX2luaXRpYXRvcigpIC0gY3JlYXRlIGJvb3QgaW5pdGlhdG9yIHN5c2ZzIGRpcgorICogQGJvb3Rfa3NldDogYm9vdCBrc2V0CisgKiBAaW5kZXg6IHRoZSBpbml0aWF0b3IgaWQKKyAqIEBkYXRhOiBkcml2ZXIgc3BlY2lmaWMgZGF0YQorICogQHNob3c6IGF0dHIgc2hvdyBmdW5jdGlvbgorICogQGlzX3Zpc2libGU6IGF0dHIgdmlzaWJpbGl0eSBmdW5jdGlvbgorICoKKyAqIE5vdGU6IFRoZSBib290IHN5c2ZzIGxpYiB3aWxsIGZyZWUgdGhlIGRhdGEgcGFzc2VkIGluIGZvciB0aGUgY2FsbGVyCisgKiB3aGVuIGFsbCByZWZzIHRvIHRoZSBpbml0aWF0b3Iga29iamVjdCBoYXZlIGJlZW4gcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBpc2NzaV9ib290X2tvYmogKgoraXNjc2lfYm9vdF9jcmVhdGVfaW5pdGlhdG9yKHN0cnVjdCBpc2NzaV9ib290X2tzZXQgKmJvb3Rfa3NldCwgaW50IGluZGV4LAorCQkJICAgIHZvaWQgKmRhdGEsCisJCQkgICAgc3NpemVfdCAoKnNob3cpICh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKSwKKwkJCSAgICBtb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpKQoreworCXJldHVybiBpc2NzaV9ib290X2NyZWF0ZV9rb2JqKGJvb3Rfa3NldCwKKwkJCQkgICAgICAmaXNjc2lfYm9vdF9pbml0aWF0b3JfYXR0cl9ncm91cCwKKwkJCQkgICAgICAiaW5pdGlhdG9yIiwgaW5kZXgsIGRhdGEsIHNob3csCisJCQkJICAgICAgaXNfdmlzaWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9ib290X2NyZWF0ZV9pbml0aWF0b3IpOworCisvKioKKyAqIGlzY3NpX2Jvb3RfY3JlYXRlX2V0aGVybmV0KCkgLSBjcmVhdGUgYm9vdCBldGhlcm5ldCBzeXNmcyBkaXIKKyAqIEBib290X2tzZXQ6IGJvb3Qga3NldAorICogQGluZGV4OiB0aGUgZXRoZXJuZXQgZGV2aWNlIGlkCisgKiBAZGF0YTogZHJpdmVyIHNwZWNpZmljIGRhdGEKKyAqIEBzaG93OiBhdHRyIHNob3cgZnVuY3Rpb24KKyAqIEBpc192aXNpYmxlOiBhdHRyIHZpc2liaWxpdHkgZnVuY3Rpb24KKyAqCisgKiBOb3RlOiBUaGUgYm9vdCBzeXNmcyBsaWIgd2lsbCBmcmVlIHRoZSBkYXRhIHBhc3NlZCBpbiBmb3IgdGhlIGNhbGxlcgorICogd2hlbiBhbGwgcmVmcyB0byB0aGUgZXRoZXJuZXQga29iamVjdCBoYXZlIGJlZW4gcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBpc2NzaV9ib290X2tvYmogKgoraXNjc2lfYm9vdF9jcmVhdGVfZXRoZXJuZXQoc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0LCBpbnQgaW5kZXgsCisJCQkgICB2b2lkICpkYXRhLAorCQkJICAgc3NpemVfdCAoKnNob3cpICh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKSwKKwkJCSAgIG1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSkpCit7CisJcmV0dXJuIGlzY3NpX2Jvb3RfY3JlYXRlX2tvYmooYm9vdF9rc2V0LAorCQkJCSAgICAgICZpc2NzaV9ib290X2V0aGVybmV0X2F0dHJfZ3JvdXAsCisJCQkJICAgICAgImV0aGVybmV0JWQiLCBpbmRleCwgZGF0YSwgc2hvdywKKwkJCQkgICAgICBpc192aXNpYmxlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Jvb3RfY3JlYXRlX2V0aGVybmV0KTsKKworLyoqCisgKiBpc2NzaV9ib290X2NyZWF0ZV9rc2V0KCkgLSBjcmVhdGVzIHJvb3Qgc3lzZnMgdHJlZQorICogQHNldF9uYW1lOiBuYW1lIG9mIHJvb3QgZGlyCisgKi8KK3N0cnVjdCBpc2NzaV9ib290X2tzZXQgKmlzY3NpX2Jvb3RfY3JlYXRlX2tzZXQoY29uc3QgY2hhciAqc2V0X25hbWUpCit7CisJc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0OworCisJYm9vdF9rc2V0ID0ga3phbGxvYyhzaXplb2YoKmJvb3Rfa3NldCksIEdGUF9LRVJORUwpOworCWlmICghYm9vdF9rc2V0KQorCQlyZXR1cm4gTlVMTDsKKworCWJvb3Rfa3NldC0+a3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoc2V0X25hbWUsIE5VTEwsIGZpcm13YXJlX2tvYmopOworCWlmICghYm9vdF9rc2V0LT5rc2V0KSB7CisJCWtmcmVlKGJvb3Rfa3NldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZib290X2tzZXQtPmtvYmpfbGlzdCk7CisJcmV0dXJuIGJvb3Rfa3NldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Jvb3RfY3JlYXRlX2tzZXQpOworCisvKioKKyAqIGlzY3NpX2Jvb3RfY3JlYXRlX2hvc3Rfa3NldCgpIC0gY3JlYXRlcyByb290IHN5c2ZzIHRyZWUgZm9yIGEgc2NzaSBob3N0CisgKiBAaG9zdG5vOiBob3N0IG51bWJlciBvZiBzY3NpIGhvc3QKKyAqLworc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqaXNjc2lfYm9vdF9jcmVhdGVfaG9zdF9rc2V0KHVuc2lnbmVkIGludCBob3N0bm8pCit7CisJc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0OworCWNoYXIgKnNldF9uYW1lOworCisJc2V0X25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImlzY3NpX2Jvb3QldSIsIGhvc3Rubyk7CisJaWYgKCFzZXRfbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlib290X2tzZXQgPSBpc2NzaV9ib290X2NyZWF0ZV9rc2V0KHNldF9uYW1lKTsKKwlrZnJlZShzZXRfbmFtZSk7CisJcmV0dXJuIGJvb3Rfa3NldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Jvb3RfY3JlYXRlX2hvc3Rfa3NldCk7CisKKy8qKgorICogaXNjc2lfYm9vdF9kZXN0cm95X2tzZXQoKSAtIGRlc3Ryb3kga3NldCBhbmQga29iamVjdHMgdW5kZXIgaXQKKyAqIEBib290X2tzZXQ6IGJvb3Qga3NldAorICoKKyAqIFRoaXMgd2lsbCByZW1vdmUgdGhlIGtzZXQgYW5kIGtvYmplY3RzIGFuZCBhdHRycyB1bmRlciBpdC4KKyAqLwordm9pZCBpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQpCit7CisJc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqYm9vdF9rb2JqLCAqdG1wX2tvYmo7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9vdF9rb2JqLCB0bXBfa29iaiwKKwkJCQkgJmJvb3Rfa3NldC0+a29ial9saXN0LCBsaXN0KQorCQlpc2NzaV9ib290X3JlbW92ZV9rb2JqKGJvb3Rfa29iaik7CisKKwlrc2V0X3VucmVnaXN0ZXIoYm9vdF9rc2V0LT5rc2V0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Jvb3RfZGVzdHJveV9rc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdC5jIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMKaW5kZXggZWQyODAxYy4uNGYwNGVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIENvcHlyaWdodCAyMDA3IFJlZCBIYXQsIEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNy0yMDEwIFJlZCBIYXQsIEluYy4KICAqICBieSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CiAgKiAgQ29weXJpZ2h0IDIwMDggSUJNLCBJbmMuCiAgKiAgYnkgS29ucmFkIFJ6ZXN6dXRlayA8a29ucmFkckBsaW51eC52bmV0LmlibS5jb20+CkBAIC0xOSw2ICsxOSw5IEBACiAgKgogICogQ2hhbmdlbG9nOgogICoKKyAqICAwNiBKYW4gMjAxMCAtIFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqICAgIE5ldyBjaGFuZ2Vsb2cgZW50cmllcyBhcmUgaW4gdGhlIGdpdCBsb2cgZnJvbSBub3cgb24uICBOb3QgaGVyZS4KKyAqCiAgKiAgMTQgTWFyIDIwMDggLSBLb25yYWQgUnplc3p1dGVrIDxrZXR1enNlenJAZGFybm9rLm9yZz4KICAqICAgIFVwZGF0ZWQgY29tbWVudHMgYW5kIGNvcHlyaWdodHMuICh2MC40LjkpCiAgKgpAQCAtNzgsOSArODEsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvaXNjc2lfYm9vdF9zeXNmcy5oPgogCi0jZGVmaW5lIElCRlRfSVNDU0lfVkVSU0lPTiAiMC40LjkiCi0jZGVmaW5lIElCRlRfSVNDU0lfREFURSAiMjAwOC1NYXItMTQiCisjZGVmaW5lIElCRlRfSVNDU0lfVkVSU0lPTiAiMC41LjAiCisjZGVmaW5lIElCRlRfSVNDU0lfREFURSAiMjAxMC1GZWItMjUiCiAKIE1PRFVMRV9BVVRIT1IoIlBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4gYW5kIFwKIEtvbnJhZCBSemVzenV0ZWsgPGtldHV6c2V6ckBkYXJub2sub3JnPiIpOwpAQCAtMTY2LDEwOCArMTcxLDIwIEBACiB9OwogCiAvKgotICogV2UgZG8gbm90IHN1cHBvcnQgdGhlIG90aGVyIHR5cGVzLCBoZW5jZSB0aGUgdXNhZ2Ugb2YgTlVMTC4KLSAqIFRoaXMgbWFwcyB0byB0aGUgZW51bSBpYmZ0X2lkLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqaWJmdF9pZF9uYW1lc1tdID0KLQl7TlVMTCwgTlVMTCwgImluaXRpYXRvciIsICJldGhlcm5ldCVkIiwgInRhcmdldCVkIiwgTlVMTCwgTlVMTH07Ci0KLS8qCi0gKiBUaGUgdGV4dCBhdHRyaWJ1dGVzIG5hbWVzIGZvciBlYWNoIG9mIHRoZSBrb2JqZWN0cy4KLSovCi1lbnVtIGliZnRfZXRoX3Byb3BlcnRpZXNfZW51bSB7Ci0JaWJmdF9ldGhfaW5kZXgsCi0JaWJmdF9ldGhfZmxhZ3MsCi0JaWJmdF9ldGhfaXBfYWRkciwKLQlpYmZ0X2V0aF9zdWJuZXRfbWFzaywKLQlpYmZ0X2V0aF9vcmlnaW4sCi0JaWJmdF9ldGhfZ2F0ZXdheSwKLQlpYmZ0X2V0aF9wcmltYXJ5X2RucywKLQlpYmZ0X2V0aF9zZWNvbmRhcnlfZG5zLAotCWliZnRfZXRoX2RoY3AsCi0JaWJmdF9ldGhfdmxhbiwKLQlpYmZ0X2V0aF9tYWMsCi0JLyogaWJmdF9ldGhfcGNpX2JkZiAtIHRoaXMgaXMgcmVwbGFjZWQgYnkgbGluayB0byB0aGUgZGV2aWNlIGl0c2VsZi4gKi8KLQlpYmZ0X2V0aF9ob3N0bmFtZSwKLQlpYmZ0X2V0aF9lbmRfbWFya2VyLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmliZnRfZXRoX3Byb3BlcnRpZXNbXSA9Ci0JeyJpbmRleCIsICJmbGFncyIsICJpcC1hZGRyIiwgInN1Ym5ldC1tYXNrIiwgIm9yaWdpbiIsICJnYXRld2F5IiwKLQkicHJpbWFyeS1kbnMiLCAic2Vjb25kYXJ5LWRucyIsICJkaGNwIiwgInZsYW4iLCAibWFjIiwgImhvc3RuYW1lIiwKLQlOVUxMfTsKLQotZW51bSBpYmZ0X3RndF9wcm9wZXJ0aWVzX2VudW0gewotCWliZnRfdGd0X2luZGV4LAotCWliZnRfdGd0X2ZsYWdzLAotCWliZnRfdGd0X2lwX2FkZHIsCi0JaWJmdF90Z3RfcG9ydCwKLQlpYmZ0X3RndF9sdW4sCi0JaWJmdF90Z3RfY2hhcF90eXBlLAotCWliZnRfdGd0X25pY19hc3NvYywKLQlpYmZ0X3RndF9uYW1lLAotCWliZnRfdGd0X2NoYXBfbmFtZSwKLQlpYmZ0X3RndF9jaGFwX3NlY3JldCwKLQlpYmZ0X3RndF9yZXZfY2hhcF9uYW1lLAotCWliZnRfdGd0X3Jldl9jaGFwX3NlY3JldCwKLQlpYmZ0X3RndF9lbmRfbWFya2VyLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmliZnRfdGd0X3Byb3BlcnRpZXNbXSA9Ci0JeyJpbmRleCIsICJmbGFncyIsICJpcC1hZGRyIiwgInBvcnQiLCAibHVuIiwgImNoYXAtdHlwZSIsICJuaWMtYXNzb2MiLAotCSJ0YXJnZXQtbmFtZSIsICJjaGFwLW5hbWUiLCAiY2hhcC1zZWNyZXQiLCAicmV2LWNoYXAtbmFtZSIsCi0JInJldi1jaGFwLW5hbWUtc2VjcmV0IiwgTlVMTH07Ci0KLWVudW0gaWJmdF9pbml0aWF0b3JfcHJvcGVydGllc19lbnVtIHsKLQlpYmZ0X2luaXRfaW5kZXgsCi0JaWJmdF9pbml0X2ZsYWdzLAotCWliZnRfaW5pdF9pc25zX3NlcnZlciwKLQlpYmZ0X2luaXRfc2xwX3NlcnZlciwKLQlpYmZ0X2luaXRfcHJpX3JhZGl1c19zZXJ2ZXIsCi0JaWJmdF9pbml0X3NlY19yYWRpdXNfc2VydmVyLAotCWliZnRfaW5pdF9pbml0aWF0b3JfbmFtZSwKLQlpYmZ0X2luaXRfZW5kX21hcmtlciwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppYmZ0X2luaXRpYXRvcl9wcm9wZXJ0aWVzW10gPQotCXsiaW5kZXgiLCAiZmxhZ3MiLCAiaXNucy1zZXJ2ZXIiLCAic2xwLXNlcnZlciIsICJwcmktcmFkaXVzLXNlcnZlciIsCi0JInNlYy1yYWRpdXMtc2VydmVyIiwgImluaXRpYXRvci1uYW1lIiwgTlVMTH07Ci0KLS8qCiAgKiBUaGUga29iamVjdCBhbmQgYXR0cmlidXRlIHN0cnVjdHVyZXMuCiAgKi8KIAogc3RydWN0IGliZnRfa29iamVjdCB7Ci0Jc3RydWN0IGliZnRfdGFibGVfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGFjcGlfdGFibGVfaWJmdCAqaGVhZGVyOwogCXVuaW9uIHsKIAkJc3RydWN0IGliZnRfaW5pdGlhdG9yICppbml0aWF0b3I7CiAJCXN0cnVjdCBpYmZ0X25pYyAqbmljOwogCQlzdHJ1Y3QgaWJmdF90Z3QgKnRndDsKIAkJc3RydWN0IGliZnRfaGRyICpoZHI7CiAJfTsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIH07CiAKLXN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KSAoc3RydWN0ICBpYmZ0X2tvYmplY3QgKmVudHJ5LAotCQkJIHN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBpYmZ0X2luaXRpYXRvciAqaW5pdGlhdG9yOwotCQlzdHJ1Y3QgaWJmdF9uaWMgKm5pYzsKLQkJc3RydWN0IGliZnRfdGd0ICp0Z3Q7Ci0JCXN0cnVjdCBpYmZ0X2hkciAqaGRyOwotCX07Ci0Jc3RydWN0IGtvYmplY3QgKmtvYmo7Ci0JaW50IHR5cGU7IC8qIFRoZSBlbnVtIG9mIHRoZSB0eXBlLiBUaGlzIGNhbiBiZSBhbnkgdmFsdWUgb2Y6Ci0JCWliZnRfZXRoX3Byb3BlcnRpZXNfZW51bSwgaWJmdF90Z3RfcHJvcGVydGllc19lbnVtLAotCQlvciBpYmZ0X2luaXRpYXRvcl9wcm9wZXJ0aWVzX2VudW0uICovCi0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotfTsKLQotc3RhdGljIExJU1RfSEVBRChpYmZ0X2F0dHJfbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKGliZnRfa29iamVjdF9saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQ7CiAKIHN0YXRpYyBjb25zdCBjaGFyIG51bGxzWzE2XTsKIApAQCAtMzA2LDM1ICsyMjMsMjcgQEAKIHN0YXRpYyBpbnQgaWJmdF92ZXJpZnlfaGRyKGNoYXIgKnQsIHN0cnVjdCBpYmZ0X2hkciAqaGRyLCBpbnQgaWQsIGludCBsZW5ndGgpCiB7CiAJaWYgKGhkci0+aWQgIT0gaWQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpQkZUIGVycm9yOiBXZSBleHBlY3RlZCB0aGUgIiBcCisJCXByaW50ayhLRVJOX0VSUiAiaUJGVCBlcnJvcjogV2UgZXhwZWN0ZWQgdGhlICVzICIgXAogCQkJCSJmaWVsZCBoZWFkZXIuaWQgdG8gaGF2ZSAlZCBidXQgIiBcCi0JCQkJImZvdW5kICVkIGluc3RlYWQhXG4iLCBpZCwgaGRyLT5pZCk7CisJCQkJImZvdW5kICVkIGluc3RlYWQhXG4iLCB0LCBpZCwgaGRyLT5pZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAoaGRyLT5sZW5ndGggIT0gbGVuZ3RoKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaUJGVCBlcnJvcjogV2UgZXhwZWN0ZWQgdGhlICIgXAorCQlwcmludGsoS0VSTl9FUlIgImlCRlQgZXJyb3I6IFdlIGV4cGVjdGVkIHRoZSAlcyAiIFwKIAkJCQkiZmllbGQgaGVhZGVyLmxlbmd0aCB0byBoYXZlICVkIGJ1dCAiIFwKLQkJCQkiZm91bmQgJWQgaW5zdGVhZCFcbiIsIGxlbmd0aCwgaGRyLT5sZW5ndGgpOworCQkJCSJmb3VuZCAlZCBpbnN0ZWFkIVxuIiwgdCwgbGVuZ3RoLCBoZHItPmxlbmd0aCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpYmZ0X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGliZnRfa29iamVjdCAqaWJmdCA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaWJmdF9rb2JqZWN0LCBrb2JqKTsKLQlrZnJlZShpYmZ0KTsKLX0KLQogLyoKICAqICBSb3V0aW5lcyBmb3IgcGFyc2luZyB0aGUgaUJGVCBkYXRhIHRvIGJlIGh1bWFuIHJlYWRhYmxlLgogICovCi1zdGF0aWMgc3NpemVfdCBpYmZ0X2F0dHJfc2hvd19pbml0aWF0b3Ioc3RydWN0IGliZnRfa29iamVjdCAqZW50cnksCi0JCQkJCXN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgaWJmdF9hdHRyX3Nob3dfaW5pdGlhdG9yKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCiB7CisJc3RydWN0IGliZnRfa29iamVjdCAqZW50cnkgPSBkYXRhOwogCXN0cnVjdCBpYmZ0X2luaXRpYXRvciAqaW5pdGlhdG9yID0gZW50cnktPmluaXRpYXRvcjsKIAl2b2lkICppYmZ0X2xvYyA9IGVudHJ5LT5oZWFkZXI7CiAJY2hhciAqc3RyID0gYnVmOwpAQCAtMzQyLDI2ICsyNTEsMjYgQEAKIAlpZiAoIWluaXRpYXRvcikKIAkJcmV0dXJuIDA7CiAKLQlzd2l0Y2ggKGF0dHItPnR5cGUpIHsKLQljYXNlIGliZnRfaW5pdF9pbmRleDoKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0lOREVYOgogCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlZFxuIiwgaW5pdGlhdG9yLT5oZHIuaW5kZXgpOwogCQlicmVhazsKLQljYXNlIGliZnRfaW5pdF9mbGFnczoKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0ZMQUdTOgogCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlZFxuIiwgaW5pdGlhdG9yLT5oZHIuZmxhZ3MpOwogCQlicmVhazsKLQljYXNlIGliZnRfaW5pdF9pc25zX3NlcnZlcjoKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0lTTlNfU0VSVkVSOgogCQlzdHIgKz0gc3ByaW50Zl9pcGFkZHIoc3RyLCBpbml0aWF0b3ItPmlzbnNfc2VydmVyKTsKIAkJYnJlYWs7Ci0JY2FzZSBpYmZ0X2luaXRfc2xwX3NlcnZlcjoKKwljYXNlIElTQ1NJX0JPT1RfSU5JX1NMUF9TRVJWRVI6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIGluaXRpYXRvci0+c2xwX3NlcnZlcik7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9pbml0X3ByaV9yYWRpdXNfc2VydmVyOgorCWNhc2UgSVNDU0lfQk9PVF9JTklfUFJJX1JBRElVU19TRVJWRVI6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIGluaXRpYXRvci0+cHJpX3JhZGl1c19zZXJ2ZXIpOwogCQlicmVhazsKLQljYXNlIGliZnRfaW5pdF9zZWNfcmFkaXVzX3NlcnZlcjoKKwljYXNlIElTQ1NJX0JPT1RfSU5JX1NFQ19SQURJVVNfU0VSVkVSOgogCQlzdHIgKz0gc3ByaW50Zl9pcGFkZHIoc3RyLCBpbml0aWF0b3ItPnNlY19yYWRpdXNfc2VydmVyKTsKIAkJYnJlYWs7Ci0JY2FzZSBpYmZ0X2luaXRfaW5pdGlhdG9yX25hbWU6CisJY2FzZSBJU0NTSV9CT09UX0lOSV9JTklUSUFUT1JfTkFNRToKIAkJc3RyICs9IHNwcmludGZfc3RyaW5nKHN0ciwgaW5pdGlhdG9yLT5pbml0aWF0b3JfbmFtZV9sZW4sCiAJCQkJICAgICAgKGNoYXIgKilpYmZ0X2xvYyArCiAJCQkJICAgICAgaW5pdGlhdG9yLT5pbml0aWF0b3JfbmFtZV9vZmYpOwpAQCAtMzczLDEwICsyODIsOSBAQAogCXJldHVybiBzdHIgLSBidWY7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGliZnRfYXR0cl9zaG93X25pYyhzdHJ1Y3QgaWJmdF9rb2JqZWN0ICplbnRyeSwKLQkJCQkgIHN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGliZnRfYXR0cl9zaG93X25pYyh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQogeworCXN0cnVjdCBpYmZ0X2tvYmplY3QgKmVudHJ5ID0gZGF0YTsKIAlzdHJ1Y3QgaWJmdF9uaWMgKm5pYyA9IGVudHJ5LT5uaWM7CiAJdm9pZCAqaWJmdF9sb2MgPSBlbnRyeS0+aGVhZGVyOwogCWNoYXIgKnN0ciA9IGJ1ZjsKQEAgLTM4NSw0MiArMjkzLDQyIEBACiAJaWYgKCFuaWMpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhdHRyLT50eXBlKSB7Ci0JY2FzZSBpYmZ0X2V0aF9pbmRleDoKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0lOREVYOgogCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlZFxuIiwgbmljLT5oZHIuaW5kZXgpOwogCQlicmVhazsKLQljYXNlIGliZnRfZXRoX2ZsYWdzOgorCWNhc2UgSVNDU0lfQk9PVF9FVEhfRkxBR1M6CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCBuaWMtPmhkci5mbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfaXBfYWRkcjoKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0lQX0FERFI6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIG5pYy0+aXBfYWRkcik7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfc3VibmV0X21hc2s6CisJY2FzZSBJU0NTSV9CT09UX0VUSF9TVUJORVRfTUFTSzoKIAkJdmFsID0gY3B1X3RvX2JlMzIofigoMSA8PCAoMzItbmljLT5zdWJuZXRfbWFza19wcmVmaXgpKS0xKSk7CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVwSTQiLCAmdmFsKTsKIAkJYnJlYWs7Ci0JY2FzZSBpYmZ0X2V0aF9vcmlnaW46CisJY2FzZSBJU0NTSV9CT09UX0VUSF9PUklHSU46CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCBuaWMtPm9yaWdpbik7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfZ2F0ZXdheToKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0dBVEVXQVk6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIG5pYy0+Z2F0ZXdheSk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfcHJpbWFyeV9kbnM6CisJY2FzZSBJU0NTSV9CT09UX0VUSF9QUklNQVJZX0ROUzoKIAkJc3RyICs9IHNwcmludGZfaXBhZGRyKHN0ciwgbmljLT5wcmltYXJ5X2Rucyk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfc2Vjb25kYXJ5X2RuczoKKwljYXNlIElTQ1NJX0JPT1RfRVRIX1NFQ09OREFSWV9ETlM6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIG5pYy0+c2Vjb25kYXJ5X2Rucyk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfZGhjcDoKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0RIQ1A6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIG5pYy0+ZGhjcCk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfdmxhbjoKKwljYXNlIElTQ1NJX0JPT1RfRVRIX1ZMQU46CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCBuaWMtPnZsYW4pOwogCQlicmVhazsKLQljYXNlIGliZnRfZXRoX21hYzoKKwljYXNlIElTQ1NJX0JPT1RfRVRIX01BQzoKIAkJc3RyICs9IHNwcmludGYoc3RyLCAiJXBNXG4iLCBuaWMtPm1hYyk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfaG9zdG5hbWU6CisJY2FzZSBJU0NTSV9CT09UX0VUSF9IT1NUTkFNRToKIAkJc3RyICs9IHNwcmludGZfc3RyaW5nKHN0ciwgbmljLT5ob3N0bmFtZV9sZW4sCiAJCQkJICAgICAgKGNoYXIgKilpYmZ0X2xvYyArIG5pYy0+aG9zdG5hbWVfb2ZmKTsKIAkJYnJlYWs7CkBAIC00MzEsMTAgKzMzOSw5IEBACiAJcmV0dXJuIHN0ciAtIGJ1ZjsKIH07CiAKLXN0YXRpYyBzc2l6ZV90IGliZnRfYXR0cl9zaG93X3RhcmdldChzdHJ1Y3QgaWJmdF9rb2JqZWN0ICplbnRyeSwKLQkJCQkgICAgIHN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGliZnRfYXR0cl9zaG93X3RhcmdldCh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQogeworCXN0cnVjdCBpYmZ0X2tvYmplY3QgKmVudHJ5ID0gZGF0YTsKIAlzdHJ1Y3QgaWJmdF90Z3QgKnRndCA9IGVudHJ5LT50Z3Q7CiAJdm9pZCAqaWJmdF9sb2MgPSBlbnRyeS0+aGVhZGVyOwogCWNoYXIgKnN0ciA9IGJ1ZjsKQEAgLTQ0Myw0OCArMzUwLDQ4IEBACiAJaWYgKCF0Z3QpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhdHRyLT50eXBlKSB7Ci0JY2FzZSBpYmZ0X3RndF9pbmRleDoKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0lOREVYOgogCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlZFxuIiwgdGd0LT5oZHIuaW5kZXgpOwogCQlicmVhazsKLQljYXNlIGliZnRfdGd0X2ZsYWdzOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfRkxBR1M6CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCB0Z3QtPmhkci5mbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfaXBfYWRkcjoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0lQX0FERFI6CiAJCXN0ciArPSBzcHJpbnRmX2lwYWRkcihzdHIsIHRndC0+aXBfYWRkcik7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfcG9ydDoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1BPUlQ6CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCB0Z3QtPnBvcnQpOwogCQlicmVhazsKLQljYXNlIGliZnRfdGd0X2x1bjoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0xVTjoKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiV4IiwgKHU4KXRndC0+bHVuW2ldKTsKIAkJc3RyICs9IHNwcmludGYoc3RyLCAiXG4iKTsKIAkJYnJlYWs7Ci0JY2FzZSBpYmZ0X3RndF9uaWNfYXNzb2M6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OSUNfQVNTT0M6CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCB0Z3QtPm5pY19hc3NvYyk7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfY2hhcF90eXBlOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9UWVBFOgogCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlZFxuIiwgdGd0LT5jaGFwX3R5cGUpOwogCQlicmVhazsKLQljYXNlIGliZnRfdGd0X25hbWU6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OQU1FOgogCQlzdHIgKz0gc3ByaW50Zl9zdHJpbmcoc3RyLCB0Z3QtPnRndF9uYW1lX2xlbiwKIAkJCQkgICAgICAoY2hhciAqKWliZnRfbG9jICsgdGd0LT50Z3RfbmFtZV9vZmYpOwogCQlicmVhazsKLQljYXNlIGliZnRfdGd0X2NoYXBfbmFtZToKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRToKIAkJc3RyICs9IHNwcmludGZfc3RyaW5nKHN0ciwgdGd0LT5jaGFwX25hbWVfbGVuLAogCQkJCSAgICAgIChjaGFyICopaWJmdF9sb2MgKyB0Z3QtPmNoYXBfbmFtZV9vZmYpOwogCQlicmVhazsKLQljYXNlIGliZnRfdGd0X2NoYXBfc2VjcmV0OgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9TRUNSRVQ6CiAJCXN0ciArPSBzcHJpbnRmX3N0cmluZyhzdHIsIHRndC0+Y2hhcF9zZWNyZXRfbGVuLAogCQkJCSAgICAgIChjaGFyICopaWJmdF9sb2MgKyB0Z3QtPmNoYXBfc2VjcmV0X29mZik7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfcmV2X2NoYXBfbmFtZToKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX05BTUU6CiAJCXN0ciArPSBzcHJpbnRmX3N0cmluZyhzdHIsIHRndC0+cmV2X2NoYXBfbmFtZV9sZW4sCiAJCQkJICAgICAgKGNoYXIgKilpYmZ0X2xvYyArCiAJCQkJICAgICAgdGd0LT5yZXZfY2hhcF9uYW1lX29mZik7CiAJCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfcmV2X2NoYXBfc2VjcmV0OgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfU0VDUkVUOgogCQlzdHIgKz0gc3ByaW50Zl9zdHJpbmcoc3RyLCB0Z3QtPnJldl9jaGFwX3NlY3JldF9sZW4sCiAJCQkJICAgICAgKGNoYXIgKilpYmZ0X2xvYyArCiAJCQkJICAgICAgdGd0LT5yZXZfY2hhcF9zZWNyZXRfb2ZmKTsKQEAgLTQ5Niw1MiArNDAzLDE5IEBACiAJcmV0dXJuIHN0ciAtIGJ1ZjsKIH0KIAotLyoKLSAqIFRoZSByb3V0aW5lIGNhbGxlZCBmb3IgYWxsIHN5c2ZzIGF0dHJpYnV0ZXMuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGliZnRfc2hvd19hdHRyaWJ1dGUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWJmdF9rb2JqZWN0ICpkZXYgPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGliZnRfa29iamVjdCwga29iaik7Ci0Jc3RydWN0IGliZnRfYXR0cmlidXRlICppYmZ0X2F0dHIgPQotCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGliZnRfYXR0cmlidXRlLCBhdHRyKTsKLQlzc2l6ZV90IHJldCA9IC1FSU87Ci0JY2hhciAqc3RyID0gYnVmOwotCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gLUVBQ0NFUzsKLQotCWlmIChpYmZ0X2F0dHItPnNob3cpCi0JCXJldCA9IGliZnRfYXR0ci0+c2hvdyhkZXYsIGliZnRfYXR0ciwgc3RyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGliZnRfYXR0cl9vcHMgPSB7Ci0JLnNob3cgPSBpYmZ0X3Nob3dfYXR0cmlidXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaWJmdF9rdHlwZSA9IHsKLQkucmVsZWFzZSA9IGliZnRfcmVsZWFzZSwKLQkuc3lzZnNfb3BzID0gJmliZnRfYXR0cl9vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IGtzZXQgKmliZnRfa3NldDsKLQogc3RhdGljIGludCBfX2luaXQgaWJmdF9jaGVja19kZXZpY2Uodm9pZCkKIHsKIAlpbnQgbGVuOwogCXU4ICpwb3M7CiAJdTggY3N1bSA9IDA7CiAKLQlsZW4gPSBpYmZ0X2FkZHItPmxlbmd0aDsKKwlsZW4gPSBpYmZ0X2FkZHItPmhlYWRlci5sZW5ndGg7CiAKIAkvKiBTYW5pdHkgY2hlY2tpbmcgb2YgaUJGVC4gKi8KLQlpZiAoaWJmdF9hZGRyLT5yZXZpc2lvbiAhPSAxKSB7CisJaWYgKGliZnRfYWRkci0+aGVhZGVyLnJldmlzaW9uICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpQkZUIG1vZHVsZSBzdXBwb3J0cyBvbmx5IHJldmlzaW9uIDEsICIgXAotCQkJCSJ3aGlsZSB0aGlzIGlzICVkLlxuIiwgaWJmdF9hZGRyLT5yZXZpc2lvbik7CisJCQkJIndoaWxlIHRoaXMgaXMgJWQuXG4iLAorCQkJCWliZnRfYWRkci0+aGVhZGVyLnJldmlzaW9uKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCWZvciAocG9zID0gKHU4ICopaWJmdF9hZGRyOyBwb3MgPCAodTggKilpYmZ0X2FkZHIgKyBsZW47IHBvcysrKQpAQCAtNTU2LDEyICs0MzAsMTQ5IEBACiB9CiAKIC8qCisgKiBIZWxwZXIgcm91dGluZXJzIHRvIGNoZWNrIHRvIGRldGVybWluZSBpZiB0aGUgZW50cnkgaXMgdmFsaWQKKyAqIGluIHRoZSBwcm9wZXIgaUJGVCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBtb2RlX3QgaWJmdF9jaGVja19uaWNfZm9yKHZvaWQgKmRhdGEsIGludCB0eXBlKQoreworCXN0cnVjdCBpYmZ0X2tvYmplY3QgKmVudHJ5ID0gZGF0YTsKKwlzdHJ1Y3QgaWJmdF9uaWMgKm5pYyA9IGVudHJ5LT5uaWM7CisJbW9kZV90IHJjID0gMDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVNDU0lfQk9PVF9FVEhfSU5ERVg6CisJY2FzZSBJU0NTSV9CT09UX0VUSF9GTEFHUzoKKwkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0lQX0FERFI6CisJCWlmIChtZW1jbXAobmljLT5pcF9hZGRyLCBudWxscywgc2l6ZW9mKG5pYy0+aXBfYWRkcikpKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX1NVQk5FVF9NQVNLOgorCQlpZiAobmljLT5zdWJuZXRfbWFza19wcmVmaXgpCisJCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9FVEhfT1JJR0lOOgorCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9FVEhfR0FURVdBWToKKwkJaWYgKG1lbWNtcChuaWMtPmdhdGV3YXksIG51bGxzLCBzaXplb2YobmljLT5nYXRld2F5KSkpCisJCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9FVEhfUFJJTUFSWV9ETlM6CisJCWlmIChtZW1jbXAobmljLT5wcmltYXJ5X2RucywgbnVsbHMsCisJCQkgICBzaXplb2YobmljLT5wcmltYXJ5X2RucykpKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX1NFQ09OREFSWV9ETlM6CisJCWlmIChtZW1jbXAobmljLT5zZWNvbmRhcnlfZG5zLCBudWxscywKKwkJCSAgIHNpemVvZihuaWMtPnNlY29uZGFyeV9kbnMpKSkKKwkJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX0VUSF9ESENQOgorCQlpZiAobWVtY21wKG5pYy0+ZGhjcCwgbnVsbHMsIHNpemVvZihuaWMtPmRoY3ApKSkKKwkJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX0VUSF9WTEFOOgorCWNhc2UgSVNDU0lfQk9PVF9FVEhfTUFDOgorCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9FVEhfSE9TVE5BTUU6CisJCWlmIChuaWMtPmhvc3RuYW1lX29mZikKKwkJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbW9kZV90IF9faW5pdCBpYmZ0X2NoZWNrX3RndF9mb3Iodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJc3RydWN0IGliZnRfa29iamVjdCAqZW50cnkgPSBkYXRhOworCXN0cnVjdCBpYmZ0X3RndCAqdGd0ID0gZW50cnktPnRndDsKKwltb2RlX3QgcmMgPSAwOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9JTkRFWDoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0ZMQUdTOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfSVBfQUREUjoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1BPUlQ6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9MVU46CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OSUNfQVNTT0M6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX1RZUEU6CisJCXJjID0gU19JUlVHTzsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX05BTUU6CisJCWlmICh0Z3QtPnRndF9uYW1lX2xlbikKKwkJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX05BTUU6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX1NFQ1JFVDoKKwkJaWYgKHRndC0+Y2hhcF9uYW1lX2xlbikKKwkJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9OQU1FOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfU0VDUkVUOgorCQlpZiAodGd0LT5yZXZfY2hhcF9uYW1lX2xlbikKKwkJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbW9kZV90IF9faW5pdCBpYmZ0X2NoZWNrX2luaXRpYXRvcl9mb3Iodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJc3RydWN0IGliZnRfa29iamVjdCAqZW50cnkgPSBkYXRhOworCXN0cnVjdCBpYmZ0X2luaXRpYXRvciAqaW5pdCA9IGVudHJ5LT5pbml0aWF0b3I7CisJbW9kZV90IHJjID0gMDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVNDU0lfQk9PVF9JTklfSU5ERVg6CisJY2FzZSBJU0NTSV9CT09UX0lOSV9GTEFHUzoKKwkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0lTTlNfU0VSVkVSOgorCQlpZiAobWVtY21wKGluaXQtPmlzbnNfc2VydmVyLCBudWxscywKKwkJCSAgIHNpemVvZihpbml0LT5pc25zX3NlcnZlcikpKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX1NMUF9TRVJWRVI6CisJCWlmIChtZW1jbXAoaW5pdC0+c2xwX3NlcnZlciwgbnVsbHMsCisJCQkgICBzaXplb2YoaW5pdC0+c2xwX3NlcnZlcikpKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX1BSSV9SQURJVVNfU0VSVkVSOgorCQlpZiAobWVtY21wKGluaXQtPnByaV9yYWRpdXNfc2VydmVyLCBudWxscywKKwkJCSAgIHNpemVvZihpbml0LT5wcmlfcmFkaXVzX3NlcnZlcikpKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX1NFQ19SQURJVVNfU0VSVkVSOgorCQlpZiAobWVtY21wKGluaXQtPnNlY19yYWRpdXNfc2VydmVyLCBudWxscywKKwkJCSAgIHNpemVvZihpbml0LT5zZWNfcmFkaXVzX3NlcnZlcikpKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0lOSVRJQVRPUl9OQU1FOgorCQlpZiAoaW5pdC0+aW5pdGlhdG9yX25hbWVfbGVuKQorCQkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGliZnRfcmVnaXN0ZXJfa29iamVjdHMuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGliZnRfY3JlYXRlX2tvYmplY3Qoc3RydWN0IGliZnRfdGFibGVfaGVhZGVyICpoZWFkZXIsCi0JCQkJICAgICAgIHN0cnVjdCBpYmZ0X2hkciAqaGRyLAotCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorc3RhdGljIGludCBfX2luaXQgaWJmdF9jcmVhdGVfa29iamVjdChzdHJ1Y3QgYWNwaV90YWJsZV9pYmZ0ICpoZWFkZXIsCisJCQkJICAgICAgc3RydWN0IGliZnRfaGRyICpoZHIpCiB7CisJc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqYm9vdF9rb2JqID0gTlVMTDsKIAlzdHJ1Y3QgaWJmdF9rb2JqZWN0ICppYmZ0X2tvYmogPSBOVUxMOwogCXN0cnVjdCBpYmZ0X25pYyAqbmljID0gKHN0cnVjdCBpYmZ0X25pYyAqKWhkcjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKQEAgLTU3OCwxNCArNTg5LDQ3IEBACiAJY2FzZSBpZF9pbml0aWF0b3I6CiAJCXJjID0gaWJmdF92ZXJpZnlfaGRyKCJpbml0aWF0b3IiLCBoZHIsIGlkX2luaXRpYXRvciwKIAkJCQkgICAgIHNpemVvZigqaWJmdF9rb2JqLT5pbml0aWF0b3IpKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisKKwkJYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfaW5pdGlhdG9yKGJvb3Rfa3NldCwgaGRyLT5pbmRleCwKKwkJCQkJCWliZnRfa29iaiwKKwkJCQkJCWliZnRfYXR0cl9zaG93X2luaXRpYXRvciwKKwkJCQkJCWliZnRfY2hlY2tfaW5pdGlhdG9yX2Zvcik7CisJCWlmICghYm9vdF9rb2JqKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfaWJmdF9vYmo7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBpZF9uaWM6CiAJCXJjID0gaWJmdF92ZXJpZnlfaGRyKCJldGhlcm5ldCIsIGhkciwgaWRfbmljLAogCQkJCSAgICAgc2l6ZW9mKCppYmZ0X2tvYmotPm5pYykpOworCQlpZiAocmMpCisJCQlicmVhazsKKworCQlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChib290X2tzZXQsIGhkci0+aW5kZXgsCisJCQkJCQkgICAgICAgaWJmdF9rb2JqLAorCQkJCQkJICAgICAgIGliZnRfYXR0cl9zaG93X25pYywKKwkJCQkJCSAgICAgICBpYmZ0X2NoZWNrX25pY19mb3IpOworCQlpZiAoIWJvb3Rfa29iaikgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX2liZnRfb2JqOworCQl9CiAJCWJyZWFrOwogCWNhc2UgaWRfdGFyZ2V0OgogCQlyYyA9IGliZnRfdmVyaWZ5X2hkcigidGFyZ2V0IiwgaGRyLCBpZF90YXJnZXQsCiAJCQkJICAgICBzaXplb2YoKmliZnRfa29iai0+dGd0KSk7CisJCWlmIChyYykKKwkJCWJyZWFrOworCisJCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldChib290X2tzZXQsIGhkci0+aW5kZXgsCisJCQkJCQkgICAgIGliZnRfa29iaiwKKwkJCQkJCSAgICAgaWJmdF9hdHRyX3Nob3dfdGFyZ2V0LAorCQkJCQkJICAgICBpYmZ0X2NoZWNrX3RndF9mb3IpOworCQlpZiAoIWJvb3Rfa29iaikgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX2liZnRfb2JqOworCQl9CiAJCWJyZWFrOwogCWNhc2UgaWRfcmVzZXJ2ZWQ6CiAJY2FzZSBpZF9jb250cm9sOgpAQCAtNTk2LDI5ICs2NDAsMTcgQEAKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgImlCRlQgaGFzIHVua25vd24gc3RydWN0dXJlIHR5cGUgKCVkKS4gIiBcCiAJCQkJIlJlcG9ydCB0aGlzIGJ1ZyB0byAlLjZzIVxuIiwgaGRyLT5pZCwKLQkJCQloZWFkZXItPm9lbV9pZCk7CisJCQkJaGVhZGVyLT5oZWFkZXIub2VtX2lkKTsKIAkJcmMgPSAxOwogCQlicmVhazsKIAl9CiAKIAlpZiAocmMpIHsKIAkJLyogU2tpcCBhZGRpbmcgdGhpcyBrb2JqZWN0LCBidXQgZXhpdCB3aXRoIG5vbi1mYXRhbCBlcnJvci4gKi8KLQkJa2ZyZWUoaWJmdF9rb2JqKTsKLQkJZ290byBvdXRfaW52YWxpZF9zdHJ1Y3Q7CisJCXJjID0gMDsKKwkJZ290byBmcmVlX2liZnRfb2JqOwogCX0KIAotCWliZnRfa29iai0+a29iai5rc2V0ID0gaWJmdF9rc2V0OwotCi0JcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmaWJmdF9rb2JqLT5rb2JqLCAmaWJmdF9rdHlwZSwKLQkJCQkgIE5VTEwsIGliZnRfaWRfbmFtZXNbaGRyLT5pZF0sIGhkci0+aW5kZXgpOwotCi0JaWYgKHJjKSB7Ci0JCWtmcmVlKGliZnRfa29iaik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWtvYmplY3RfdWV2ZW50KCZpYmZ0X2tvYmotPmtvYmosIEtPQkpfQUREKTsKLQogCWlmIChoZHItPmlkID09IGlkX25pYykgewogCQkvKgogCQkqIFdlIGRvbid0IHNlYXJjaCBmb3IgdGhlIGRldmljZSBpbiBvdGhlciBkb21haW5zIHRoYW4KQEAgLTYyOSwxOSArNjYxLDE2IEBACiAJCXBjaV9kZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgobmljLT5wY2lfYmRmICYgMHhmZjAwKSA+PiA4LAogCQkJCQkgICAgICAgKG5pYy0+cGNpX2JkZiAmIDB4ZmYpKTsKIAkJaWYgKHBjaV9kZXYpIHsKLQkJCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJmliZnRfa29iai0+a29iaiwKKwkJCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJmJvb3Rfa29iai0+a29iaiwKIAkJCQkJICAgICAgICZwY2lfZGV2LT5kZXYua29iaiwgImRldmljZSIpOwogCQkJcGNpX2Rldl9wdXQocGNpX2Rldik7CiAJCX0KIAl9Ci0KLQkvKiBOb3RoaW5nIGJyb2tlIHNvIGxldHMgYWRkIGl0IHRvIHRoZSBsaXN0LiAqLwotCWxpc3RfYWRkX3RhaWwoJmliZnRfa29iai0+bm9kZSwgbGlzdCk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotb3V0X2ludmFsaWRfc3RydWN0OgotCS8qIFVuc3VwcG9ydGVkIHN0cnVjdHMgYXJlIHNraXBwZWQuICovCiAJcmV0dXJuIDA7CisKK2ZyZWVfaWJmdF9vYmo6CisJa2ZyZWUoaWJmdF9rb2JqKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC02NDksOCArNjc4LDcgQEAKICAqIGZvdW5kIGFkZCB0aGVtIG9uIHRoZSBwYXNzZWQtaW4gbGlzdC4gV2UgZG8gbm90IHN1cHBvcnQgdGhlIG90aGVyCiAgKiBmaWVsZHMgYXQgdGhpcyBwb2ludCwgc28gdGhleSBhcmUgc2tpcHBlZC4KICAqLwotc3RhdGljIGludCBfX2luaXQgaWJmdF9yZWdpc3Rlcl9rb2JqZWN0cyhzdHJ1Y3QgaWJmdF90YWJsZV9oZWFkZXIgKmhlYWRlciwKLQkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorc3RhdGljIGludCBfX2luaXQgaWJmdF9yZWdpc3Rlcl9rb2JqZWN0cyhzdHJ1Y3QgYWNwaV90YWJsZV9pYmZ0ICpoZWFkZXIpCiB7CiAJc3RydWN0IGliZnRfY29udHJvbCAqY29udHJvbCA9IE5VTEw7CiAJdm9pZCAqcHRyLCAqZW5kOwpAQCAtNjYwLDcgKzY4OCw3IEBACiAKIAljb250cm9sID0gKHZvaWQgKiloZWFkZXIgKyBzaXplb2YoKmhlYWRlcik7CiAJZW5kID0gKHZvaWQgKiljb250cm9sICsgY29udHJvbC0+aGRyLmxlbmd0aDsKLQllb3Rfb2Zmc2V0ID0gKHZvaWQgKiloZWFkZXIgKyBoZWFkZXItPmxlbmd0aCAtICh2b2lkICopY29udHJvbDsKKwllb3Rfb2Zmc2V0ID0gKHZvaWQgKiloZWFkZXIgKyBoZWFkZXItPmhlYWRlci5sZW5ndGggLSAodm9pZCAqKWNvbnRyb2w7CiAJcmMgPSBpYmZ0X3ZlcmlmeV9oZHIoImNvbnRyb2wiLCAoc3RydWN0IGliZnRfaGRyICopY29udHJvbCwgaWRfY29udHJvbCwKIAkJCSAgICAgc2l6ZW9mKCpjb250cm9sKSk7CiAKQEAgLTY3MiwxMCArNzAwLDEwIEBACiAJfQogCWZvciAocHRyID0gJmNvbnRyb2wtPmluaXRpYXRvcl9vZmY7IHB0ciA8IGVuZDsgcHRyICs9IHNpemVvZih1MTYpKSB7CiAJCW9mZnNldCA9ICoodTE2ICopcHRyOwotCQlpZiAob2Zmc2V0ICYmIG9mZnNldCA8IGhlYWRlci0+bGVuZ3RoICYmIG9mZnNldCA8IGVvdF9vZmZzZXQpIHsKKwkJaWYgKG9mZnNldCAmJiBvZmZzZXQgPCBoZWFkZXItPmhlYWRlci5sZW5ndGggJiYKKwkJCQkJCW9mZnNldCA8IGVvdF9vZmZzZXQpIHsKIAkJCXJjID0gaWJmdF9jcmVhdGVfa29iamVjdChoZWFkZXIsCi0JCQkJCQkgKHZvaWQgKiloZWFkZXIgKyBvZmZzZXQsCi0JCQkJCQkgbGlzdCk7CisJCQkJCQkgKHZvaWQgKiloZWFkZXIgKyBvZmZzZXQpOwogCQkJaWYgKHJjKQogCQkJCWJyZWFrOwogCQl9CkBAIC02ODQsMjQwICs3MTIsMjggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGliZnRfdW5yZWdpc3RlcihzdHJ1Y3QgbGlzdF9oZWFkICphdHRyX2xpc3QsCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmtvYmpfbGlzdCkKK3N0YXRpYyB2b2lkIGliZnRfdW5yZWdpc3Rlcih2b2lkKQogewotCXN0cnVjdCBpYmZ0X2tvYmplY3QgKmRhdGEgPSBOVUxMLCAqbjsKLQlzdHJ1Y3QgaWJmdF9hdHRyaWJ1dGUgKmF0dHIgPSBOVUxMLCAqbTsKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmosICp0bXBfa29iajsKKwlzdHJ1Y3QgaWJmdF9rb2JqZWN0ICppYmZ0X2tvYmo7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXR0ciwgbSwgYXR0cl9saXN0LCBub2RlKSB7Ci0JCXN5c2ZzX3JlbW92ZV9maWxlKGF0dHItPmtvYmosICZhdHRyLT5hdHRyKTsKLQkJbGlzdF9kZWwoJmF0dHItPm5vZGUpOwotCQlrZnJlZShhdHRyKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9vdF9rb2JqLCB0bXBfa29iaiwKKwkJCQkgJmJvb3Rfa3NldC0+a29ial9saXN0LCBsaXN0KSB7CisJCWliZnRfa29iaiA9IGJvb3Rfa29iai0+ZGF0YTsKKwkJaWYgKGliZnRfa29iai0+aGRyLT5pZCA9PSBpZF9uaWMpCisJCQlzeXNmc19yZW1vdmVfbGluaygmYm9vdF9rb2JqLT5rb2JqLCAiZGV2aWNlIik7CiAJfTsKLQlsaXN0X2RlbF9pbml0KGF0dHJfbGlzdCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGF0YSwgbiwga29ial9saXN0LCBub2RlKSB7Ci0JCWxpc3RfZGVsKCZkYXRhLT5ub2RlKTsKLQkJaWYgKGRhdGEtPmhkci0+aWQgPT0gaWRfbmljKQotCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRhdGEtPmtvYmosICJkZXZpY2UiKTsKLQkJa29iamVjdF9wdXQoJmRhdGEtPmtvYmopOwotCX07Ci0JbGlzdF9kZWxfaW5pdChrb2JqX2xpc3QpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpYmZ0X2NyZWF0ZV9hdHRyaWJ1dGUoc3RydWN0IGliZnRfa29iamVjdCAqa29ial9kYXRhLAotCQkJCQkgaW50IHR5cGUsCi0JCQkJCSBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgc3NpemVfdCAoKnNob3cpKHN0cnVjdCBpYmZ0X2tvYmplY3QgKiwKLQkJCQkJCQkgc3RydWN0IGliZnRfYXR0cmlidXRlKiwKLQkJCQkJCQkgY2hhciAqYnVmKSwKLQkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCitzdGF0aWMgdm9pZCBpYmZ0X2NsZWFudXAodm9pZCkKIHsKLQlzdHJ1Y3QgaWJmdF9hdHRyaWJ1dGUgKmF0dHIgPSBOVUxMOwotCXN0cnVjdCBpYmZ0X2hkciAqaGRyID0ga29ial9kYXRhLT5oZHI7Ci0KLQlhdHRyID0ga21hbGxvYyhzaXplb2YoKmF0dHIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF0dHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXR0ci0+YXR0ci5uYW1lID0gbmFtZTsKLQlhdHRyLT5hdHRyLm1vZGUgPSBTX0lSVVNSOwotCi0JYXR0ci0+aGRyID0gaGRyOwotCWF0dHItPnNob3cgPSBzaG93OwotCWF0dHItPmtvYmogPSAma29ial9kYXRhLT5rb2JqOwotCWF0dHItPnR5cGUgPSB0eXBlOwotCi0JbGlzdF9hZGRfdGFpbCgmYXR0ci0+bm9kZSwgbGlzdCk7Ci0KLQlyZXR1cm4gMDsKKwlpYmZ0X3VucmVnaXN0ZXIoKTsKKwlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChib290X2tzZXQpOwogfQogCi0vKgotICogSGVscGVyIHJvdXRpbmVycyB0byBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGhlIGVudHJ5IGlzIHZhbGlkCi0gKiBpbiB0aGUgcHJvcGVyIGlCRlQgc3RydWN0dXJlLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpYmZ0X2NoZWNrX25pY19mb3Ioc3RydWN0IGliZnRfbmljICpuaWMsIGludCBlbnRyeSkKK3N0YXRpYyB2b2lkIF9fZXhpdCBpYmZ0X2V4aXQodm9pZCkKIHsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChlbnRyeSkgewotCWNhc2UgaWJmdF9ldGhfaW5kZXg6Ci0JY2FzZSBpYmZ0X2V0aF9mbGFnczoKLQkJcmMgPSAxOwotCQlicmVhazsKLQljYXNlIGliZnRfZXRoX2lwX2FkZHI6Ci0JCWlmIChtZW1jbXAobmljLT5pcF9hZGRyLCBudWxscywgc2l6ZW9mKG5pYy0+aXBfYWRkcikpKQotCQkJcmMgPSAxOwotCQlicmVhazsKLQljYXNlIGliZnRfZXRoX3N1Ym5ldF9tYXNrOgotCQlpZiAobmljLT5zdWJuZXRfbWFza19wcmVmaXgpCi0JCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfb3JpZ2luOgotCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfZ2F0ZXdheToKLQkJaWYgKG1lbWNtcChuaWMtPmdhdGV3YXksIG51bGxzLCBzaXplb2YobmljLT5nYXRld2F5KSkpCi0JCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfcHJpbWFyeV9kbnM6Ci0JCWlmIChtZW1jbXAobmljLT5wcmltYXJ5X2RucywgbnVsbHMsCi0JCQkgICBzaXplb2YobmljLT5wcmltYXJ5X2RucykpKQotCQkJcmMgPSAxOwotCQlicmVhazsKLQljYXNlIGliZnRfZXRoX3NlY29uZGFyeV9kbnM6Ci0JCWlmIChtZW1jbXAobmljLT5zZWNvbmRhcnlfZG5zLCBudWxscywKLQkJCSAgIHNpemVvZihuaWMtPnNlY29uZGFyeV9kbnMpKSkKLQkJCXJjID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBpYmZ0X2V0aF9kaGNwOgotCQlpZiAobWVtY21wKG5pYy0+ZGhjcCwgbnVsbHMsIHNpemVvZihuaWMtPmRoY3ApKSkKLQkJCXJjID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBpYmZ0X2V0aF92bGFuOgotCWNhc2UgaWJmdF9ldGhfbWFjOgotCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF9ldGhfaG9zdG5hbWU6Ci0JCWlmIChuaWMtPmhvc3RuYW1lX29mZikKLQkJCXJjID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpYmZ0X2NoZWNrX3RndF9mb3Ioc3RydWN0IGliZnRfdGd0ICp0Z3QsIGludCBlbnRyeSkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChlbnRyeSkgewotCWNhc2UgaWJmdF90Z3RfaW5kZXg6Ci0JY2FzZSBpYmZ0X3RndF9mbGFnczoKLQljYXNlIGliZnRfdGd0X2lwX2FkZHI6Ci0JY2FzZSBpYmZ0X3RndF9wb3J0OgotCWNhc2UgaWJmdF90Z3RfbHVuOgotCWNhc2UgaWJmdF90Z3RfbmljX2Fzc29jOgotCWNhc2UgaWJmdF90Z3RfY2hhcF90eXBlOgotCQlyYyA9IDE7Ci0JY2FzZSBpYmZ0X3RndF9uYW1lOgotCQlpZiAodGd0LT50Z3RfbmFtZV9sZW4pCi0JCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfY2hhcF9uYW1lOgotCWNhc2UgaWJmdF90Z3RfY2hhcF9zZWNyZXQ6Ci0JCWlmICh0Z3QtPmNoYXBfbmFtZV9sZW4pCi0JCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF90Z3RfcmV2X2NoYXBfbmFtZToKLQljYXNlIGliZnRfdGd0X3Jldl9jaGFwX3NlY3JldDoKLQkJaWYgKHRndC0+cmV2X2NoYXBfbmFtZV9sZW4pCi0JCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaWJmdF9jaGVja19pbml0aWF0b3JfZm9yKHN0cnVjdCBpYmZ0X2luaXRpYXRvciAqaW5pdCwKLQkJCQkJICAgIGludCBlbnRyeSkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChlbnRyeSkgewotCWNhc2UgaWJmdF9pbml0X2luZGV4OgotCWNhc2UgaWJmdF9pbml0X2ZsYWdzOgotCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF9pbml0X2lzbnNfc2VydmVyOgotCQlpZiAobWVtY21wKGluaXQtPmlzbnNfc2VydmVyLCBudWxscywKLQkJCSAgIHNpemVvZihpbml0LT5pc25zX3NlcnZlcikpKQotCQkJcmMgPSAxOwotCQlicmVhazsKLQljYXNlIGliZnRfaW5pdF9zbHBfc2VydmVyOgotCQlpZiAobWVtY21wKGluaXQtPnNscF9zZXJ2ZXIsIG51bGxzLAotCQkJICAgc2l6ZW9mKGluaXQtPnNscF9zZXJ2ZXIpKSkKLQkJCXJjID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBpYmZ0X2luaXRfcHJpX3JhZGl1c19zZXJ2ZXI6Ci0JCWlmIChtZW1jbXAoaW5pdC0+cHJpX3JhZGl1c19zZXJ2ZXIsIG51bGxzLAotCQkJICAgc2l6ZW9mKGluaXQtPnByaV9yYWRpdXNfc2VydmVyKSkpCi0JCQlyYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgaWJmdF9pbml0X3NlY19yYWRpdXNfc2VydmVyOgotCQlpZiAobWVtY21wKGluaXQtPnNlY19yYWRpdXNfc2VydmVyLCBudWxscywKLQkJCSAgIHNpemVvZihpbml0LT5zZWNfcmFkaXVzX3NlcnZlcikpKQotCQkJcmMgPSAxOwotCQlicmVhazsKLQljYXNlIGliZnRfaW5pdF9pbml0aWF0b3JfbmFtZToKLQkJaWYgKGluaXQtPmluaXRpYXRvcl9uYW1lX2xlbikKLQkJCXJjID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogIFJlZ2lzdGVyIHRoZSBhdHRyaWJ1dGVzIGZvciBhbGwgb2YgdGhlIGtvYmplY3RzLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpYmZ0X3JlZ2lzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IGxpc3RfaGVhZCAqa29iamVjdF9saXN0LAotCQkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqYXR0cl9saXN0KQotewotCWludCByYyA9IDAsIGkgPSAwOwotCXN0cnVjdCBpYmZ0X2tvYmplY3QgKmRhdGEgPSBOVUxMOwotCXN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciA9IE5VTEwsICptOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCBrb2JqZWN0X2xpc3QsIG5vZGUpIHsKLQkJc3dpdGNoIChkYXRhLT5oZHItPmlkKSB7Ci0JCWNhc2UgaWRfbmljOgotCQkJZm9yIChpID0gMDsgaSA8IGliZnRfZXRoX2VuZF9tYXJrZXIgJiYgIXJjOyBpKyspCi0JCQkJaWYgKGliZnRfY2hlY2tfbmljX2ZvcihkYXRhLT5uaWMsIGkpKQotCQkJCQlyYyA9IGliZnRfY3JlYXRlX2F0dHJpYnV0ZShkYXRhLCBpLAotCQkJCQkJaWJmdF9ldGhfcHJvcGVydGllc1tpXSwKLQkJCQkJCWliZnRfYXR0cl9zaG93X25pYywgYXR0cl9saXN0KTsKLQkJCWJyZWFrOwotCQljYXNlIGlkX3RhcmdldDoKLQkJCWZvciAoaSA9IDA7IGkgPCBpYmZ0X3RndF9lbmRfbWFya2VyICYmICFyYzsgaSsrKQotCQkJCWlmIChpYmZ0X2NoZWNrX3RndF9mb3IoZGF0YS0+dGd0LCBpKSkKLQkJCQkJcmMgPSBpYmZ0X2NyZWF0ZV9hdHRyaWJ1dGUoZGF0YSwgaSwKLQkJCQkJCWliZnRfdGd0X3Byb3BlcnRpZXNbaV0sCi0JCQkJCQlpYmZ0X2F0dHJfc2hvd190YXJnZXQsCi0JCQkJCQlhdHRyX2xpc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgaWRfaW5pdGlhdG9yOgotCQkJZm9yIChpID0gMDsgaSA8IGliZnRfaW5pdF9lbmRfbWFya2VyICYmICFyYzsgaSsrKQotCQkJCWlmIChpYmZ0X2NoZWNrX2luaXRpYXRvcl9mb3IoCi0JCQkJCWRhdGEtPmluaXRpYXRvciwgaSkpCi0JCQkJCXJjID0gaWJmdF9jcmVhdGVfYXR0cmlidXRlKGRhdGEsIGksCi0JCQkJCQlpYmZ0X2luaXRpYXRvcl9wcm9wZXJ0aWVzW2ldLAotCQkJCQkJaWJmdF9hdHRyX3Nob3dfaW5pdGlhdG9yLAotCQkJCQkJYXR0cl9saXN0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJjKQotCQkJYnJlYWs7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdHRyLCBtLCBhdHRyX2xpc3QsIG5vZGUpIHsKLQkJcmMgPSBzeXNmc19jcmVhdGVfZmlsZShhdHRyLT5rb2JqLCAmYXR0ci0+YXR0cik7Ci0JCWlmIChyYykgewotCQkJbGlzdF9kZWwoJmF0dHItPm5vZGUpOwotCQkJa2ZyZWUoYXR0cik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKKwlpYmZ0X2NsZWFudXAoKTsKIH0KIAogLyoKQEAgLTkyNywyNiArNzQzLDIwIEBACiB7CiAJaW50IHJjID0gMDsKIAotCWliZnRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImliZnQiLCBOVUxMLCBmaXJtd2FyZV9rb2JqKTsKLQlpZiAoIWliZnRfa3NldCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpZiAoaWJmdF9hZGRyKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImlCRlQgZGV0ZWN0ZWQgYXQgMHglbGx4LlxuIiwKIAkJICAgICAgICh1NjQpaXNhX3ZpcnRfdG9fYnVzKGliZnRfYWRkcikpOwogCiAJCXJjID0gaWJmdF9jaGVja19kZXZpY2UoKTsKIAkJaWYgKHJjKQotCQkJZ290byBvdXRfZmlybXdhcmVfdW5yZWdpc3RlcjsKKwkJCXJldHVybiByYzsKKworCQlib290X2tzZXQgPSBpc2NzaV9ib290X2NyZWF0ZV9rc2V0KCJpYmZ0Iik7CisJCWlmICghYm9vdF9rc2V0KQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJLyogU2NhbiB0aGUgSUJGVCBmb3IgZGF0YSBhbmQgcmVnaXN0ZXIgdGhlIGtvYmplY3RzLiAqLwotCQlyYyA9IGliZnRfcmVnaXN0ZXJfa29iamVjdHMoaWJmdF9hZGRyLCAmaWJmdF9rb2JqZWN0X2xpc3QpOwotCQlpZiAocmMpCi0JCQlnb3RvIG91dF9mcmVlOwotCi0JCS8qIFJlZ2lzdGVyIHRoZSBhdHRyaWJ1dGVzICovCi0JCXJjID0gaWJmdF9yZWdpc3Rlcl9hdHRyaWJ1dGVzKCZpYmZ0X2tvYmplY3RfbGlzdCwKLQkJCQkJICAgICAgJmliZnRfYXR0cl9saXN0KTsKKwkJcmMgPSBpYmZ0X3JlZ2lzdGVyX2tvYmplY3RzKGliZnRfYWRkcik7CiAJCWlmIChyYykKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJfSBlbHNlCkBAIC05NTUsMTcgKzc2NSw5IEBACiAJcmV0dXJuIDA7CiAKIG91dF9mcmVlOgotCWliZnRfdW5yZWdpc3RlcigmaWJmdF9hdHRyX2xpc3QsICZpYmZ0X2tvYmplY3RfbGlzdCk7Ci1vdXRfZmlybXdhcmVfdW5yZWdpc3RlcjoKLQlrc2V0X3VucmVnaXN0ZXIoaWJmdF9rc2V0KTsKKwlpYmZ0X2NsZWFudXAoKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBpYmZ0X2V4aXQodm9pZCkKLXsKLQlpYmZ0X3VucmVnaXN0ZXIoJmliZnRfYXR0cl9saXN0LCAmaWJmdF9rb2JqZWN0X2xpc3QpOwotCWtzZXRfdW5yZWdpc3RlcihpYmZ0X2tzZXQpOwotfQotCiBtb2R1bGVfaW5pdChpYmZ0X2luaXQpOwogbW9kdWxlX2V4aXQoaWJmdF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCmluZGV4IGQ2NDcwZWYuLjIxOTI0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IDIwMDcgUmVkIEhhdCwgSW5jLgorICogIENvcHlyaWdodCAyMDA3LTIwMTAgUmVkIEhhdCwgSW5jLgogICogIGJ5IFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KICAqICBDb3B5cmlnaHQgMjAwNyBJQk0sIEluYy4KICAqICBieSBLb25yYWQgUnplc3p1dGVrIDxrb25yYWRyQGxpbnV4LnZuZXQuaWJtLmNvbT4KQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KQEAgLTMwLDEzICszMSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2NzaV9pYmZ0Lmg+CiAKICNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAKIC8qCiAgKiBQaHlzaWNhbCBsb2NhdGlvbiBvZiBpU0NTSSBCb290IEZvcm1hdCBUYWJsZS4KICAqLwotc3RydWN0IGliZnRfdGFibGVfaGVhZGVyICppYmZ0X2FkZHI7CitzdHJ1Y3QgYWNwaV90YWJsZV9pYmZ0ICppYmZ0X2FkZHI7CiBFWFBPUlRfU1lNQk9MX0dQTChpYmZ0X2FkZHIpOwogCiAjZGVmaW5lIElCRlRfU0lHTiAiaUJGVCIKQEAgLTQ2LDE5ICs0OSwyMCBAQAogI2RlZmluZSBWR0FfTUVNIDB4QTAwMDAgLyogVkdBIGJ1ZmZlciAqLwogI2RlZmluZSBWR0FfU0laRSAweDIwMDAwIC8qIDEyOGtCICovCiAKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIGludCBfX2luaXQgYWNwaV9maW5kX2liZnQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIpCit7CisJaWJmdF9hZGRyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2liZnQgKiloZWFkZXI7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAotLyoKLSAqIFJvdXRpbmUgdXNlZCB0byBmaW5kIHRoZSBpU0NTSSBCb290IEZvcm1hdCBUYWJsZS4gVGhlIGxvZ2ljYWwKLSAqIGtlcm5lbCBhZGRyZXNzIGlzIHNldCBpbiB0aGUgaWJmdF9hZGRyIGdsb2JhbCB2YXJpYWJsZS4KLSAqLwotdW5zaWduZWQgbG9uZyBfX2luaXQgZmluZF9pYmZ0X3JlZ2lvbih1bnNpZ25lZCBsb25nICpzaXplcCkKK3N0YXRpYyBpbnQgX19pbml0IGZpbmRfaWJmdF9pbl9tZW0odm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBvczsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMDsKIAl2b2lkICp2aXJ0OwogCi0JaWJmdF9hZGRyID0gTlVMTDsKLQogCWZvciAocG9zID0gSUJGVF9TVEFSVDsgcG9zIDwgSUJGVF9FTkQ7IHBvcyArPSAxNikgewogCQkvKiBUaGUgdGFibGUgY2FuJ3QgYmUgaW5zaWRlIHRoZSBWR0EgQklPUyByZXNlcnZlZCBzcGFjZSwKIAkJICogc28gc2tpcCB0aGF0IGFyZWEgKi8KQEAgLTcyLDE0ICs3Niw0MiBAQAogCQkJLyogaWYgdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgZXh0ZW5kcyBwYXN0IDFNLAogCQkJICogdGhlIHRhYmxlIGNhbm5vdCBiZSB2YWxpZC4gKi8KIAkJCWlmIChwb3MgKyBsZW4gPD0gKElCRlRfRU5ELTEpKSB7Ci0JCQkJaWJmdF9hZGRyID0gKHN0cnVjdCBpYmZ0X3RhYmxlX2hlYWRlciAqKXZpcnQ7CisJCQkJaWJmdF9hZGRyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2liZnQgKil2aXJ0OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfQorCXJldHVybiBsZW47Cit9CisvKgorICogUm91dGluZSB1c2VkIHRvIGZpbmQgdGhlIGlTQ1NJIEJvb3QgRm9ybWF0IFRhYmxlLiBUaGUgbG9naWNhbAorICoga2VybmVsIGFkZHJlc3MgaXMgc2V0IGluIHRoZSBpYmZ0X2FkZHIgZ2xvYmFsIHZhcmlhYmxlLgorICovCit1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX2liZnRfcmVnaW9uKHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCisJaWJmdF9hZGRyID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19BQ1BJCisJLyoKKwkgKiBPbmUgc3BlYyBzYXlzICJJQkZUIiwgdGhlIG90aGVyIHNheXMgImlCRlQiLiBXZSBoYXZlIHRvIGNoZWNrCisJICogZm9yIGJvdGguCisJICovCisJaWYgKCFpYmZ0X2FkZHIpCisJCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfSUJGVCwgYWNwaV9maW5kX2liZnQpOworCWlmICghaWJmdF9hZGRyKQorCQlhY3BpX3RhYmxlX3BhcnNlKElCRlRfU0lHTiwgYWNwaV9maW5kX2liZnQpOworI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCisKKwkvKiBpQkZUIDEuMDMgc2VjdGlvbiAxLjQuMy4xIG1hbmRhdGVzIHRoYXQgVUVGSSBtYWNoaW5lcyB3aWxsCisJICogb25seSB1c2UgQUNQSSBmb3IgdGhpcyAqLworCisJaWYgKCFpYmZ0X2FkZHIgJiYgIWVmaV9lbmFibGVkKQorCQlmaW5kX2liZnRfaW5fbWVtKCk7CisKIAlpZiAoaWJmdF9hZGRyKSB7Ci0JCSpzaXplcCA9IFBBR0VfQUxJR04obGVuKTsKLQkJcmV0dXJuIHBvczsKKwkJKnNpemVwID0gUEFHRV9BTElHTihpYmZ0X2FkZHItPmhlYWRlci5sZW5ndGgpOworCQlyZXR1cm4gKHU2NClpc2FfdmlydF90b19idXMoaWJmdF9hZGRyKTsKIAl9CiAKIAkqc2l6ZXAgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW9saWIuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKaW5kZXggM2NhMzY1NC4uNmE2YmQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWIuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC04OTMsMTAgKzg5NCwxMiBAQAogdm9pZCBncGlvX3VuZXhwb3J0KHVuc2lnbmVkIGdwaW8pCiB7CiAJc3RydWN0IGdwaW9fZGVzYwkqZGVzYzsKLQlpbnQJCQlzdGF0dXMgPSAtRUlOVkFMOworCWludAkJCXN0YXR1cyA9IDA7CiAKLQlpZiAoIWdwaW9faXNfdmFsaWQoZ3BpbykpCisJaWYgKCFncGlvX2lzX3ZhbGlkKGdwaW8pKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKKwl9CiAKIAltdXRleF9sb2NrKCZzeXNmc19sb2NrKTsKIApAQCAtOTExLDcgKzkxNCw2IEBACiAJCQljbGVhcl9iaXQoRkxBR19FWFBPUlQsICZkZXNjLT5mbGFncyk7CiAJCQlwdXRfZGV2aWNlKGRldik7CiAJCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotCQkJc3RhdHVzID0gMDsKIAkJfSBlbHNlCiAJCQlzdGF0dXMgPSAtRU5PREVWOwogCX0KQEAgLTEwOTksMTYgKzExMDEsMjQgQEAKIAkJfQogCX0KIAorCW9mX2dwaW9jaGlwX2FkZChjaGlwKTsKKwogdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gZ3Bpb2NoaXBfZXhwb3J0KGNoaXApOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gZ3Bpb2NoaXBfZXhwb3J0KGNoaXApOworCWlmIChzdGF0dXMpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOwogZmFpbDoKIAkvKiBmYWlsdXJlcyBoZXJlIGNhbiBtZWFuIHN5c3RlbXMgd29uJ3QgYm9vdC4uLiAqLwotCWlmIChzdGF0dXMpCi0JCXByX2VycigiZ3Bpb2NoaXBfYWRkOiBncGlvcyAlZC4uJWQgKCVzKSBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIsCi0JCQljaGlwLT5iYXNlLCBjaGlwLT5iYXNlICsgY2hpcC0+bmdwaW8gLSAxLAotCQkJY2hpcC0+bGFiZWwgPyA6ICJnZW5lcmljIik7CisJcHJfZXJyKCJncGlvY2hpcF9hZGQ6IGdwaW9zICVkLi4lZCAoJXMpIGZhaWxlZCB0byByZWdpc3RlclxuIiwKKwkJY2hpcC0+YmFzZSwgY2hpcC0+YmFzZSArIGNoaXAtPm5ncGlvIC0gMSwKKwkJY2hpcC0+bGFiZWwgPyA6ICJnZW5lcmljIik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdwaW9jaGlwX2FkZCk7CkBAIC0xMTI3LDYgKzExMzcsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCisJb2ZfZ3Bpb2NoaXBfcmVtb3ZlKGNoaXApOworCiAJZm9yIChpZCA9IGNoaXAtPmJhc2U7IGlkIDwgY2hpcC0+YmFzZSArIGNoaXAtPm5ncGlvOyBpZCsrKSB7CiAJCWlmICh0ZXN0X2JpdChGTEFHX1JFUVVFU1RFRCwgJmdwaW9fZGVzY1tpZF0uZmxhZ3MpKSB7CiAJCQlzdGF0dXMgPSAtRUJVU1k7CkBAIC0xMTQ3LDYgKzExNTksMzggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdwaW9jaGlwX3JlbW92ZSk7CiAKKy8qKgorICogZ3Bpb2NoaXBfZmluZCgpIC0gaXRlcmF0b3IgZm9yIGxvY2F0aW5nIGEgc3BlY2lmaWMgZ3Bpb19jaGlwCisgKiBAZGF0YTogZGF0YSB0byBwYXNzIHRvIG1hdGNoIGZ1bmN0aW9uCisgKiBAY2FsbGJhY2s6IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNoZWNrIGdwaW9fY2hpcAorICoKKyAqIFNpbWlsYXIgdG8gYnVzX2ZpbmRfZGV2aWNlLiAgSXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGdwaW9fY2hpcCBhcworICogZGV0ZXJtaW5lZCBieSBhIHVzZXIgc3VwcGxpZWQgQG1hdGNoIGNhbGxiYWNrLiAgVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4KKyAqIDAgaWYgdGhlIGRldmljZSBkb2Vzbid0IG1hdGNoIGFuZCBub24temVybyBpZiBpdCBkb2VzLiAgSWYgdGhlIGNhbGxiYWNrIGlzCisgKiBub24temVybywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0byB0aGUgY2FsbGVyIGFuZCBub3QgaXRlcmF0ZSBvdmVyIGFueQorICogbW9yZSBncGlvX2NoaXBzLgorICovCitzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcF9maW5kKHZvaWQgKmRhdGEsCisJCQkJaW50ICgqbWF0Y2gpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHZvaWQgKmRhdGEpKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IEFSQ0hfTlJfR1BJT1M7IGkrKykgeworCQlpZiAoIWdwaW9fZGVzY1tpXS5jaGlwKQorCQkJY29udGludWU7CisKKwkJaWYgKG1hdGNoKGdwaW9fZGVzY1tpXS5jaGlwLCBkYXRhKSkgeworCQkJY2hpcCA9IGdwaW9fZGVzY1tpXS5jaGlwOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY2hpcDsKK30KIAogLyogVGhlc2UgIm9wdGlvbmFsIiBhbGxvY2F0aW9uIGNhbGxzIGhlbHAgcHJldmVudCBkcml2ZXJzIGZyb20gc3RvbXBpbmcKICAqIG9uIGVhY2ggb3RoZXIsIGFuZCBoZWxwIHByb3ZpZGUgYmV0dGVyIGRpYWdub3N0aWNzIGluIGRlYnVnZnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vcGwwNjEuYyBiL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCmluZGV4IGVlNTY4YzguLjUwMDU5OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcGwwNjFfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHN0cnVjdCBhbWJhX2lkICppZCkKK3N0YXRpYyBpbnQgcGwwNjFfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHN0cnVjdCBhbWJhX2lkICppZCkKIHsKIAlzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXA7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwNjFfaWRzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBwbDA2MV9pZHNbXSA9IHsKIAl7CiAJCS5pZAk9IDB4MDAwNDEwNjEsCiAJCS5tYXNrCT0gMHgwMDBmZmZmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby94aWxpbnhfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3hpbGlueF9ncGlvLmMKaW5kZXggYjhmYTY1Yi4uNzA5NjkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3hpbGlueF9ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL3hpbGlueF9ncGlvLmMKQEAgLTE2MSwxNCArMTYxLDEyIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCB4Z3Bpb19vZl9wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXN0cnVjdCB4Z3Bpb19pbnN0YW5jZSAqY2hpcDsKLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZmNoaXA7CiAJaW50IHN0YXR1cyA9IDA7CiAJY29uc3QgdTMyICp0cmVlX2luZm87CiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApCiAJCXJldHVybiAtRU5PTUVNOwotCW9mY2hpcCA9ICZjaGlwLT5tbWNoaXAub2ZfZ2M7CiAKIAkvKiBVcGRhdGUgR1BJTyBzdGF0ZSBzaGFkb3cgcmVnaXN0ZXIgd2l0aCBkZWZhdWx0IHZhbHVlICovCiAJdHJlZV9pbmZvID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAieGxueCxkb3V0LWRlZmF1bHQiLCBOVUxMKTsKQEAgLTE4MiwyMSArMTgwLDIwIEBACiAJCWNoaXAtPmdwaW9fZGlyID0gKnRyZWVfaW5mbzsKIAogCS8qIENoZWNrIGRldmljZSBub2RlIGFuZCBwYXJlbnQgZGV2aWNlIG5vZGUgZm9yIGRldmljZSB3aWR0aCAqLwotCW9mY2hpcC0+Z2MubmdwaW8gPSAzMjsgLyogQnkgZGVmYXVsdCBhc3N1bWUgZnVsbCBHUElPIGNvbnRyb2xsZXIgKi8KKwljaGlwLT5tbWNoaXAuZ2MubmdwaW8gPSAzMjsgLyogQnkgZGVmYXVsdCBhc3N1bWUgZnVsbCBHUElPIGNvbnRyb2xsZXIgKi8KIAl0cmVlX2luZm8gPSBvZl9nZXRfcHJvcGVydHkobnAsICJ4bG54LGdwaW8td2lkdGgiLCBOVUxMKTsKIAlpZiAoIXRyZWVfaW5mbykKIAkJdHJlZV9pbmZvID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLT5wYXJlbnQsCiAJCQkJCSAgICAieGxueCxncGlvLXdpZHRoIiwgTlVMTCk7CiAJaWYgKHRyZWVfaW5mbykKLQkJb2ZjaGlwLT5nYy5uZ3BpbyA9ICp0cmVlX2luZm87CisJCWNoaXAtPm1tY2hpcC5nYy5uZ3BpbyA9ICp0cmVlX2luZm87CiAKIAlzcGluX2xvY2tfaW5pdCgmY2hpcC0+Z3Bpb19sb2NrKTsKIAotCW9mY2hpcC0+Z3Bpb19jZWxscyA9IDI7Ci0Jb2ZjaGlwLT5nYy5kaXJlY3Rpb25faW5wdXQgPSB4Z3Bpb19kaXJfaW47Ci0Jb2ZjaGlwLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0geGdwaW9fZGlyX291dDsKLQlvZmNoaXAtPmdjLmdldCA9IHhncGlvX2dldDsKLQlvZmNoaXAtPmdjLnNldCA9IHhncGlvX3NldDsKKwljaGlwLT5tbWNoaXAuZ2MuZGlyZWN0aW9uX2lucHV0ID0geGdwaW9fZGlyX2luOworCWNoaXAtPm1tY2hpcC5nYy5kaXJlY3Rpb25fb3V0cHV0ID0geGdwaW9fZGlyX291dDsKKwljaGlwLT5tbWNoaXAuZ2MuZ2V0ID0geGdwaW9fZ2V0OworCWNoaXAtPm1tY2hpcC5nYy5zZXQgPSB4Z3Bpb19zZXQ7CiAKIAljaGlwLT5tbWNoaXAuc2F2ZV9yZWdzID0geGdwaW9fc2F2ZV9yZWdzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCmluZGV4IDg4OTEwZTUuLjRjYWIwYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCkBAIC02LDcgKzYsNyBAQAogIwogbWVudWNvbmZpZyBEUk0KIAl0cmlzdGF0ZSAiRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIChYRnJlZTg2IDQuMS4wIGFuZCBoaWdoZXIgRFJJIHN1cHBvcnQpIgotCWRlcGVuZHMgb24gKEFHUCB8fCBBR1A9bikgJiYgUENJICYmICFFTVVMQVRFRF9DTVBYQ0hHICYmIE1NVQorCWRlcGVuZHMgb24gKEFHUCB8fCBBR1A9bikgJiYgIUVNVUxBVEVEX0NNUFhDSEcgJiYgTU1VCiAJc2VsZWN0IEkyQwogCXNlbGVjdCBJMkNfQUxHT0JJVAogCXNlbGVjdCBTTE9XX1dPUksKQEAgLTE3LDcgKzE3LDcgQEAKIAkgIFRoZXNlIG1vZHVsZXMgcHJvdmlkZSBzdXBwb3J0IGZvciBzeW5jaHJvbml6YXRpb24sIHNlY3VyaXR5LCBhbmQKIAkgIERNQSB0cmFuc2ZlcnMuIFBsZWFzZSBzZWUgPGh0dHA6Ly9kcmkuc291cmNlZm9yZ2UubmV0Lz4gZm9yIG1vcmUKIAkgIGRldGFpbHMuICBZb3Ugc2hvdWxkIGFsc28gc2VsZWN0IGFuZCBjb25maWd1cmUgQUdQCi0JICAoL2Rldi9hZ3BnYXJ0KSBzdXBwb3J0LgorCSAgKC9kZXYvYWdwZ2FydCkgc3VwcG9ydCBpZiBpdCBpcyBhdmFpbGFibGUgZm9yIHlvdXIgcGxhdGZvcm0uCiAKIGNvbmZpZyBEUk1fS01TX0hFTFBFUgogCXRyaXN0YXRlCkBAIC02MSw2ICs2MSw3IEBACiAgICAgICAgIHNlbGVjdCBEUk1fS01TX0hFTFBFUgogICAgICAgICBzZWxlY3QgRFJNX1RUTQogCXNlbGVjdCBQT1dFUl9TVVBQTFkKKwlzZWxlY3QgSFdNT04KIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYW4gQVRJIFJhZGVvbiBncmFwaGljcyBjYXJkLiAgVGhlcmUKIAkgIGFyZSBib3RoIFBDSSBhbmQgQUdQIHZlcnNpb25zLiAgWW91IGRvbid0IG5lZWQgdG8gY2hvb3NlIHRoaXMgdG8KQEAgLTEzMCw3ICsxMzEsNyBAQAogCiBjb25maWcgRFJNX01HQQogCXRyaXN0YXRlICJNYXRyb3ggZzIwMC9nNDAwIgotCWRlcGVuZHMgb24gRFJNCisJZGVwZW5kcyBvbiBEUk0gJiYgUENJCiAJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIE1hdHJveCBHMjAwLCBHNDAwIG9yIEc0NTAgZ3JhcGhpY3MKQEAgLTE0OCwxNCArMTQ5LDE0IEBACiAKIGNvbmZpZyBEUk1fVklBCiAJdHJpc3RhdGUgIlZpYSB1bmljaHJvbWUgdmlkZW8gY2FyZHMiCi0JZGVwZW5kcyBvbiBEUk0KKwlkZXBlbmRzIG9uIERSTSAmJiBQQ0kKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBWaWEgdW5pY2hyb21lIG9yIGNvbXBhdGlibGUgdmlkZW8KIAkgIGNoaXBzZXQuIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2aWEuCiAKIGNvbmZpZyBEUk1fU0FWQUdFCiAJdHJpc3RhdGUgIlNhdmFnZSB2aWRlbyBjYXJkcyIKLQlkZXBlbmRzIG9uIERSTQorCWRlcGVuZHMgb24gRFJNICYmIFBDSQogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIFNhdmFnZTNELzQvU3VwZXJTYXZhZ2UvUHJvL1R3aXN0ZXIKIAkgIGNoaXBzZXQuIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYXZhZ2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKaW5kZXggYWJlM2Y0NC4uZjNhMjNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtOSw5ICs5LDEwIEBACiAJCWRybV9kcnYubyBkcm1fZm9wcy5vIGRybV9nZW0ubyBkcm1faW9jdGwubyBkcm1faXJxLm8gXAogCQlkcm1fbG9jay5vIGRybV9tZW1vcnkubyBkcm1fcHJvYy5vIGRybV9zdHViLm8gZHJtX3ZtLm8gXAogCQlkcm1fYWdwc3VwcG9ydC5vIGRybV9zY2F0dGVyLm8gYXRpX3BjaWdhcnQubyBkcm1fcGNpLm8gXAotCQlkcm1fc3lzZnMubyBkcm1faGFzaHRhYi5vIGRybV9zbWFuLm8gZHJtX21tLm8gXAorCQlkcm1fcGxhdGZvcm0ubyBkcm1fc3lzZnMubyBkcm1faGFzaHRhYi5vIGRybV9zbWFuLm8gZHJtX21tLm8gXAogCQlkcm1fY3J0Yy5vIGRybV9tb2Rlcy5vIGRybV9lZGlkLm8gXAotCQlkcm1faW5mby5vIGRybV9kZWJ1Z2ZzLm8gZHJtX2VuY29kZXJfc2xhdmUubworCQlkcm1faW5mby5vIGRybV9kZWJ1Z2ZzLm8gZHJtX2VuY29kZXJfc2xhdmUubyBcCisJCWRybV90cmFjZV9wb2ludHMubyBkcm1fZ2xvYmFsLm8KIAogZHJtLSQoQ09ORklHX0NPTVBBVCkgKz0gZHJtX2lvYzMyLm8KIApAQCAtMTksNiArMjAsOCBAQAogCiBvYmotJChDT05GSUdfRFJNX0tNU19IRUxQRVIpICs9IGRybV9rbXNfaGVscGVyLm8KIAorQ0ZMQUdTX2RybV90cmFjZV9wb2ludHMubyA6PSAtSSQoc3JjKQorCiBvYmotJChDT05GSUdfRFJNKQkrPSBkcm0ubwogb2JqLSQoQ09ORklHX0RSTV9UVE0pCSs9IHR0bS8KIG9iai0kKENPTkZJR19EUk1fVERGWCkJKz0gdGRmeC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKaW5kZXggMjA5MmU3Yi4uYTVjOWNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKQEAgLTM5LDE5ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCi1yZXNvdXJjZV9zaXplX3QgZHJtX2dldF9yZXNvdXJjZV9zdGFydChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCi17Ci0JcmV0dXJuIHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIHJlc291cmNlKTsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2dldF9yZXNvdXJjZV9zdGFydCk7Ci0KLXJlc291cmNlX3NpemVfdCBkcm1fZ2V0X3Jlc291cmNlX2xlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCi17Ci0JcmV0dXJuIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCByZXNvdXJjZSk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZHJtX2dldF9yZXNvdXJjZV9sZW4pOwotCiBzdGF0aWMgc3RydWN0IGRybV9tYXBfbGlzdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgIHN0cnVjdCBkcm1fbG9jYWxfbWFwICptYXApCiB7CkBAIC0xODksNyArMTc2LDcgQEAKIAlzd2l0Y2ggKG1hcC0+dHlwZSkgewogCWNhc2UgX0RSTV9SRUdJU1RFUlM6CiAJY2FzZSBfRFJNX0ZSQU1FX0JVRkZFUjoKLSNpZiAhZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19pYTY0X18pICYmICFkZWZpbmVkKF9fcG93ZXJwYzY0X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCisjaWYgIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9faWE2NF9fKSAmJiAhZGVmaW5lZChfX3Bvd2VycGM2NF9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKSAmJiAhZGVmaW5lZChfX2FybV9fKQogCQlpZiAobWFwLT5vZmZzZXQgKyAobWFwLT5zaXplLTEpIDwgbWFwLT5vZmZzZXQgfHwKIAkJICAgIG1hcC0+b2Zmc2V0IDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkgewogCQkJa2ZyZWUobWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKaW5kZXggNTdjZWEwMS4uNGM2OGY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKQEAgLTgwLDYgKzgwLDcgQEAKIHsKIAl7IERSTV9NT0RFX0RJVEhFUklOR19PRkYsICJPZmYiIH0sCiAJeyBEUk1fTU9ERV9ESVRIRVJJTkdfT04sICJPbiIgfSwKKwl7IERSTV9NT0RFX0RJVEhFUklOR19BVVRPLCAiQXV0b21hdGljIiB9LAogfTsKIAogLyoKQEAgLTExMjYsNyArMTEyNyw3IEBACiAJCWlmIChmaWxlX3ByaXYtPm1hc3Rlci0+bWlub3ItPnR5cGUgPT0gRFJNX01JTk9SX0NPTlRST0wpIHsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LAogCQkJCQkgICAgaGVhZCkgewotCQkJCURSTV9ERUJVR19LTVMoIkNSVEMgSUQgaXMgJWRcbiIsIGNydGMtPmJhc2UuaWQpOworCQkJCURSTV9ERUJVR19LTVMoIltDUlRDOiVkXVxuIiwgY3J0Yy0+YmFzZS5pZCk7CiAJCQkJaWYgKHB1dF91c2VyKGNydGMtPmJhc2UuaWQsIGNydGNfaWQgKyBjb3BpZWQpKSB7CiAJCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMTE1NCw4ICsxMTU1LDggQEAKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwKIAkJCQkJICAgICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwKIAkJCQkJICAgIGhlYWQpIHsKLQkJCQlEUk1fREVCVUdfS01TKCJFTkNPREVSIElEIGlzICVkXG4iLAotCQkJCQkgIGVuY29kZXItPmJhc2UuaWQpOworCQkJCURSTV9ERUJVR19LTVMoIltFTkNPREVSOiVkOiVzXVxuIiwgZW5jb2Rlci0+YmFzZS5pZCwKKwkJCQkJCWRybV9nZXRfZW5jb2Rlcl9uYW1lKGVuY29kZXIpKTsKIAkJCQlpZiAocHV0X3VzZXIoZW5jb2Rlci0+YmFzZS5pZCwgZW5jb2Rlcl9pZCArCiAJCQkJCSAgICAgY29waWVkKSkgewogCQkJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTE4NSw4ICsxMTg2LDkgQEAKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLAogCQkJCQkgICAgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsCiAJCQkJCSAgICBoZWFkKSB7Ci0JCQkJRFJNX0RFQlVHX0tNUygiQ09OTkVDVE9SIElEIGlzICVkXG4iLAotCQkJCQkgIGNvbm5lY3Rvci0+YmFzZS5pZCk7CisJCQkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc11cbiIsCisJCQkJCWNvbm5lY3Rvci0+YmFzZS5pZCwKKwkJCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKIAkJCQlpZiAocHV0X3VzZXIoY29ubmVjdG9yLT5iYXNlLmlkLAogCQkJCQkgICAgIGNvbm5lY3Rvcl9pZCArIGNvcGllZCkpIHsKIAkJCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTEyMDksNyArMTIxMSw3IEBACiAJfQogCWNhcmRfcmVzLT5jb3VudF9jb25uZWN0b3JzID0gY29ubmVjdG9yX2NvdW50OwogCi0JRFJNX0RFQlVHX0tNUygiQ291bnRlZCAlZCAlZCAlZFxuIiwgY2FyZF9yZXMtPmNvdW50X2NydGNzLAorCURSTV9ERUJVR19LTVMoIkNSVENbJWRdIENPTk5FQ1RPUlNbJWRdIEVOQ09ERVJTWyVkXVxuIiwgY2FyZF9yZXMtPmNvdW50X2NydGNzLAogCQkgIGNhcmRfcmVzLT5jb3VudF9jb25uZWN0b3JzLCBjYXJkX3Jlcy0+Y291bnRfZW5jb2RlcnMpOwogCiBvdXQ6CkBAIC0xMzEyLDcgKzEzMTQsNyBAQAogCiAJbWVtc2V0KCZ1X21vZGUsIDAsIHNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pKTsKIAotCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciBpZCAlZDpcbiIsIG91dF9yZXNwLT5jb25uZWN0b3JfaWQpOworCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6P11cbiIsIG91dF9yZXNwLT5jb25uZWN0b3JfaWQpOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAKQEAgLTE0OTMsNiArMTQ5NSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAljcnRjID0gb2JqX3RvX2NydGMob2JqKTsKKwlEUk1fREVCVUdfS01TKCJbQ1JUQzolZF1cbiIsIGNydGMtPmJhc2UuaWQpOwogCiAJaWYgKGNydGNfcmVxLT5tb2RlX3ZhbGlkKSB7CiAJCS8qIElmIHdlIGhhdmUgYSBtb2RlIHdlIG5lZWQgYSBmcmFtZWJ1ZmZlci4gKi8KQEAgLTE1NjksNiArMTU3Miw5IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQljb25uZWN0b3IgPSBvYmpfdG9fY29ubmVjdG9yKG9iaik7CisJCQlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXVxuIiwKKwkJCQkJY29ubmVjdG9yLT5iYXNlLmlkLAorCQkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOwogCiAJCQljb25uZWN0b3Jfc2V0W2ldID0gY29ubmVjdG9yOwogCQl9CkBAIC0xNjg0LDYgKzE2OTAsNyBAQAogCiAJci0+ZmJfaWQgPSBmYi0+YmFzZS5pZDsKIAlsaXN0X2FkZCgmZmItPmZpbHBfaGVhZCwgJmZpbGVfcHJpdi0+ZmJzKTsKKwlEUk1fREVCVUdfS01TKCJbRkI6JWRdXG4iLCBmYi0+YmFzZS5pZCk7CiAKIG91dDoKIAltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwpAQCAtMjYxMCw2ICsyNjE3LDE1IEBACiAJCWdvdG8gb3V0OwogCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOwogCisJaWYgKGNydGMtPmZiID09IE5VTEwpIHsKKwkJLyogVGhlIGZyYW1lYnVmZmVyIGlzIGN1cnJlbnRseSB1bmJvdW5kLCBwcmVzdW1hYmx5CisJCSAqIGR1ZSB0byBhIGhvdHBsdWcgZXZlbnQsIHRoYXQgdXNlcnNwYWNlIGhhcyBub3QKKwkJICogeWV0IGRpc2NvdmVyZWQuCisJCSAqLworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwogCWlmIChjcnRjLT5mdW5jcy0+cGFnZV9mbGlwID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKaW5kZXggOWIyYTU0MS4uMTFmZTljOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYwpAQCAtODYsNyArODYsOCBAQAogCWludCBjb3VudCA9IDA7CiAJaW50IG1vZGVfZmxhZ3MgPSAwOwogCi0JRFJNX0RFQlVHX0tNUygiJXNcbiIsIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc11cbiIsIGNvbm5lY3Rvci0+YmFzZS5pZCwKKwkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CiAJLyogc2V0IGFsbCBtb2RlcyB0byB0aGUgdW52ZXJpZmllZCBzdGF0ZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCB0LCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkKIAkJbW9kZS0+c3RhdHVzID0gTU9ERV9VTlZFUklGSUVEOwpAQCAtMTAyLDggKzEwMyw4IEBACiAJCWNvbm5lY3Rvci0+c3RhdHVzID0gY29ubmVjdG9yLT5mdW5jcy0+ZGV0ZWN0KGNvbm5lY3Rvcik7CiAKIAlpZiAoY29ubmVjdG9yLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpIHsKLQkJRFJNX0RFQlVHX0tNUygiJXMgaXMgZGlzY29ubmVjdGVkXG4iLAotCQkJICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQlEUk1fREVCVUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSBkaXNjb25uZWN0ZWRcbiIsCisJCQljb25uZWN0b3ItPmJhc2UuaWQsIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CiAJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIE5VTEwpOwogCQlnb3RvIHBydW5lOwogCX0KQEAgLTE0MSw4ICsxNDIsOCBAQAogCiAJZHJtX21vZGVfc29ydCgmY29ubmVjdG9yLT5tb2Rlcyk7CiAKLQlEUk1fREVCVUdfS01TKCJQcm9iZWQgbW9kZXMgZm9yICVzXG4iLAotCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gcHJvYmVkIG1vZGVzIDpcbiIsIGNvbm5lY3Rvci0+YmFzZS5pZCwKKwkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1vZGUsIHQsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKSB7CiAJCW1vZGUtPnZyZWZyZXNoID0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSk7CiAKQEAgLTIwMSw2ICsyMDIsMTcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9jcnRjX2luX3VzZSk7CiAKK3N0YXRpYyB2b2lkCitkcm1fZW5jb2Rlcl9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisKKwlpZiAoZW5jb2Rlcl9mdW5jcy0+ZGlzYWJsZSkKKwkJKCplbmNvZGVyX2Z1bmNzLT5kaXNhYmxlKShlbmNvZGVyKTsKKwllbHNlCisJCSgqZW5jb2Rlcl9mdW5jcy0+ZHBtcykoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworfQorCiAvKioKICAqIGRybV9oZWxwZXJfZGlzYWJsZV91bnVzZWRfZnVuY3Rpb25zIC0gZGlzYWJsZSB1bnVzZWQgb2JqZWN0cwogICogQGRldjogRFJNIGRldmljZQpAQCAtMjE1LDcgKzIyNyw2IEBACiB7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0Jc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jczsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKQEAgLTIyNiwxMiArMjM3LDggQEAKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQllbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CiAJCWlmICghZHJtX2hlbHBlcl9lbmNvZGVyX2luX3VzZShlbmNvZGVyKSkgewotCQkJaWYgKGVuY29kZXJfZnVuY3MtPmRpc2FibGUpCi0JCQkJKCplbmNvZGVyX2Z1bmNzLT5kaXNhYmxlKShlbmNvZGVyKTsKLQkJCWVsc2UKLQkJCQkoKmVuY29kZXJfZnVuY3MtPmRwbXMpKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwkJCWRybV9lbmNvZGVyX2Rpc2FibGUoZW5jb2Rlcik7CiAJCQkvKiBkaXNjb25uZWN0b3IgZW5jb2RlciBmcm9tIGFueSBjb25uZWN0b3IgKi8KIAkJCWVuY29kZXItPmNydGMgPSBOVUxMOwogCQl9CkBAIC0yNDEsNyArMjQ4LDEwIEBACiAJCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKIAkJY3J0Yy0+ZW5hYmxlZCA9IGRybV9oZWxwZXJfY3J0Y19pbl91c2UoY3J0Yyk7CiAJCWlmICghY3J0Yy0+ZW5hYmxlZCkgewotCQkJY3J0Y19mdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCQlpZiAoY3J0Y19mdW5jcy0+ZGlzYWJsZSkKKwkJCQkoKmNydGNfZnVuY3MtPmRpc2FibGUpKGNydGMpOworCQkJZWxzZQorCQkJCSgqY3J0Y19mdW5jcy0+ZHBtcykoY3J0YywgRFJNX01PREVfRFBNU19PRkYpOwogCQkJY3J0Yy0+ZmIgPSBOVUxMOwogCQl9CiAJfQpAQCAtMjkyLDExICszMDIsMTEgQEAKIAkJZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOwogCQkvKiBEaXNhYmxlIHVudXNlZCBlbmNvZGVycyAqLwogCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBOVUxMKQotCQkJKCplbmNvZGVyX2Z1bmNzLT5kcG1zKShlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCQlkcm1fZW5jb2Rlcl9kaXNhYmxlKGVuY29kZXIpOwogCQkvKiBEaXNhYmxlIGVuY29kZXJzIHdob3NlIENSVEMgaXMgYWJvdXQgdG8gY2hhbmdlICovCiAJCWlmIChlbmNvZGVyX2Z1bmNzLT5nZXRfY3J0YyAmJgogCQkgICAgZW5jb2Rlci0+Y3J0YyAhPSAoKmVuY29kZXJfZnVuY3MtPmdldF9jcnRjKShlbmNvZGVyKSkKLQkJCSgqZW5jb2Rlcl9mdW5jcy0+ZHBtcykoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCQkJZHJtX2VuY29kZXJfZGlzYWJsZShlbmNvZGVyKTsKIAl9CiB9CiAKQEAgLTM2NSw2ICszNzUsNyBAQAogCWlmICghKHJldCA9IGNydGNfZnVuY3MtPm1vZGVfZml4dXAoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSkpKSB7CiAJCWdvdG8gZG9uZTsKIAl9CisJRFJNX0RFQlVHX0tNUygiW0NSVEM6JWRdXG4iLCBjcnRjLT5iYXNlLmlkKTsKIAogCS8qIFByZXBhcmUgdGhlIGVuY29kZXJzIGFuZCBDUlRDcyBiZWZvcmUgc2V0dGluZyB0aGUgbW9kZS4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewpAQCAtMzkyLDggKzQwMyw5IEBACiAJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCiAJCQljb250aW51ZTsKIAotCQlEUk1fREVCVUcoIiVzOiBzZXQgbW9kZSAlcyAleFxuIiwgZHJtX2dldF9lbmNvZGVyX25hbWUoZW5jb2RlciksCi0JCQkgbW9kZS0+bmFtZSwgbW9kZS0+YmFzZS5pZCk7CisJCURSTV9ERUJVR19LTVMoIltFTkNPREVSOiVkOiVzXSBzZXQgW01PREU6JWQ6JXNdXG4iLAorCQkJZW5jb2Rlci0+YmFzZS5pZCwgZHJtX2dldF9lbmNvZGVyX25hbWUoZW5jb2RlciksCisJCQltb2RlLT5iYXNlLmlkLCBtb2RlLT5uYW1lKTsKIAkJZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOwogCQllbmNvZGVyX2Z1bmNzLT5tb2RlX3NldChlbmNvZGVyLCBtb2RlLCBhZGp1c3RlZF9tb2RlKTsKIAl9CkBAIC00NjksMTAgKzQ4MSwxNSBAQAogCiAJY3J0Y19mdW5jcyA9IHNldC0+Y3J0Yy0+aGVscGVyX3ByaXZhdGU7CiAKLQlEUk1fREVCVUdfS01TKCJjcnRjOiAlcCAlZCBmYjogJXAgY29ubmVjdG9yczogJXAgbnVtX2Nvbm5lY3RvcnM6IgotCQkJIiAlZCAoeCwgeSkgKCVpLCAlaSlcbiIsCi0JCSAgc2V0LT5jcnRjLCBzZXQtPmNydGMtPmJhc2UuaWQsIHNldC0+ZmIsIHNldC0+Y29ubmVjdG9ycywKLQkJICAoaW50KXNldC0+bnVtX2Nvbm5lY3RvcnMsIHNldC0+eCwgc2V0LT55KTsKKwlpZiAoc2V0LT5mYikgeworCQlEUk1fREVCVUdfS01TKCJbQ1JUQzolZF0gW0ZCOiVkXSAjY29ubmVjdG9ycz0lZCAoeCB5KSAoJWkgJWkpXG4iLAorCQkJCXNldC0+Y3J0Yy0+YmFzZS5pZCwgc2V0LT5mYi0+YmFzZS5pZCwKKwkJCQkoaW50KXNldC0+bnVtX2Nvbm5lY3RvcnMsIHNldC0+eCwgc2V0LT55KTsKKwl9IGVsc2UgeworCQlEUk1fREVCVUdfS01TKCJbQ1JUQzolZF0gW05PRkJdICNjb25uZWN0b3JzPSVkICh4IHkpICglaSAlaSlcbiIsCisJCQkJc2V0LT5jcnRjLT5iYXNlLmlkLCAoaW50KXNldC0+bnVtX2Nvbm5lY3RvcnMsCisJCQkJc2V0LT54LCBzZXQtPnkpOworCX0KIAogCWRldiA9IHNldC0+Y3J0Yy0+ZGV2OwogCkBAIC02MDEsOCArNjE4LDE0IEBACiAJCQltb2RlX2NoYW5nZWQgPSB0cnVlOwogCQkJY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID0gbmV3X2NydGM7CiAJCX0KLQkJRFJNX0RFQlVHX0tNUygic2V0dGluZyBjb25uZWN0b3IgJWQgY3J0YyB0byAlcFxuIiwKLQkJCSAgY29ubmVjdG9yLT5iYXNlLmlkLCBuZXdfY3J0Yyk7CisJCWlmIChuZXdfY3J0YykgeworCQkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10gdG8gW0NSVEM6JWRdXG4iLAorCQkJCWNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAorCQkJCW5ld19jcnRjLT5iYXNlLmlkKTsKKwkJfSBlbHNlIHsKKwkJCURSTV9ERUJVR19LTVMoIltDT05ORUNUT1I6JWQ6JXNdIHRvIFtOT0NSVENdXG4iLAorCQkJCWNvbm5lY3Rvci0+YmFzZS5pZCwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJfQogCX0KIAogCS8qIG1vZGVfc2V0X2Jhc2UgaXMgbm90IGEgcmVxdWlyZWQgZnVuY3Rpb24gKi8KQEAgLTYyMCw4ICs2NDMsOCBAQAogCQkJaWYgKCFkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoc2V0LT5jcnRjLCBzZXQtPm1vZGUsCiAJCQkJCQkgICAgICBzZXQtPngsIHNldC0+eSwKIAkJCQkJCSAgICAgIG9sZF9mYikpIHsKLQkJCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXQgbW9kZSBvbiBjcnRjICVwXG4iLAotCQkJCQkgIHNldC0+Y3J0Yyk7CisJCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0IG1vZGUgb24gW0NSVEM6JWRdXG4iLAorCQkJCQkgIHNldC0+Y3J0Yy0+YmFzZS5pZCk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwppbmRleCA0YTY2MjAxLi45MDI4OGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKQEAgLTI0Myw0NyArMjQzLDIwIEBACiAgKgogICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgb2YgZHJtX2RldmljZSBzdHJ1Y3R1cmVzLCBhbmQgYXR0ZW1wdHMgdG8KICAqIGluaXRpYWxpemUgYWxsIGF2YWlsYWJsZSBkZXZpY2VzLCB1c2luZyBjb25zZWN1dGl2ZSBtaW5vcnMsIHJlZ2lzdGVyaW5nIHRoZQotICogc3R1YnMgYW5kIGluaXRpYWxpemluZyB0aGUgQUdQIGRldmljZS4KKyAqIHN0dWJzIGFuZCBpbml0aWFsaXppbmcgdGhlIGRldmljZS4KICAqCiAgKiBFeHBhbmRzIHRoZSBcYyBEUklWRVJfUFJFSU5JVCBhbmQgXGMgRFJJVkVSX1BPU1RfSU5JVCBtYWNyb3MgYmVmb3JlIGFuZAogICogYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIGZvciBkcml2ZXIgY3VzdG9taXphdGlvbi4KICAqLwogaW50IGRybV9pbml0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwaWQ7Ci0JaW50IGk7Ci0KIAlEUk1fREVCVUcoIlxuIik7Ci0KIAlJTklUX0xJU1RfSEVBRCgmZHJpdmVyLT5kZXZpY2VfbGlzdCk7CiAKLQlpZiAoZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfTU9ERVNFVCkKLQkJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlci0+cGNpX2RyaXZlcik7Ci0KLQkvKiBJZiBub3QgdXNpbmcgS01TLCBmYWxsIGJhY2sgdG8gc3RlYWx0aCBtb2RlIG1hbnVhbCBzY2FubmluZy4gKi8KLQlmb3IgKGkgPSAwOyBkcml2ZXItPnBjaV9kcml2ZXIuaWRfdGFibGVbaV0udmVuZG9yICE9IDA7IGkrKykgewotCQlwaWQgPSAmZHJpdmVyLT5wY2lfZHJpdmVyLmlkX3RhYmxlW2ldOwotCi0JCS8qIExvb3AgYXJvdW5kIHNldHRpbmcgdXAgYSBEUk0gZGV2aWNlIGZvciBlYWNoIFBDSSBkZXZpY2UKLQkJICogbWF0Y2hpbmcgb3VyIElEIGFuZCBkZXZpY2UgY2xhc3MuICBJZiB3ZSBoYWQgdGhlIGludGVybmFsCi0JCSAqIGZ1bmN0aW9uIHRoYXQgcGNpX2dldF9zdWJzeXMgYW5kIHBjaV9nZXRfY2xhc3MgdXNlZCwgd2UnZAotCQkgKiBiZSBhYmxlIHRvIGp1c3QgcGFzcyBwaWQgaW4gaW5zdGVhZCBvZiBkb2luZyBhIHR3by1zdGFnZQotCQkgKiB0aGluZy4KLQkJICovCi0JCXBkZXYgPSBOVUxMOwotCQl3aGlsZSAoKHBkZXYgPQotCQkJcGNpX2dldF9zdWJzeXMocGlkLT52ZW5kb3IsIHBpZC0+ZGV2aWNlLCBwaWQtPnN1YnZlbmRvciwKLQkJCQkgICAgICAgcGlkLT5zdWJkZXZpY2UsIHBkZXYpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoKHBkZXYtPmNsYXNzICYgcGlkLT5jbGFzc19tYXNrKSAhPSBwaWQtPmNsYXNzKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKiBzdGVhbHRoIG1vZGUgcmVxdWlyZXMgYSBtYW51YWwgcHJvYmUgKi8KLQkJCXBjaV9kZXZfZ2V0KHBkZXYpOwotCQkJZHJtX2dldF9kZXYocGRldiwgcGlkLCBkcml2ZXIpOwotCQl9Ci0JfQotCXJldHVybiAwOworCWlmIChkcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9VU0VfUExBVEZPUk1fREVWSUNFKQorCQlyZXR1cm4gZHJtX3BsYXRmb3JtX2luaXQoZHJpdmVyKTsKKwllbHNlCisJCXJldHVybiBkcm1fcGNpX2luaXQoZHJpdmVyKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1faW5pdCk7CkBAIC0zMTUsNiArMjg4LDcgQEAKIHsKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAorCWRybV9nbG9iYWxfaW5pdCgpOwogCWlkcl9pbml0KCZkcm1fbWlub3JzX2lkcik7CiAKIAlpZiAocmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIsICZkcm1fc3R1Yl9mb3BzKSkKQEAgLTM2Miw2ICszMzYsNyBAQAogCiAJdW5yZWdpc3Rlcl9jaHJkZXYoRFJNX01BSk9SLCAiZHJtIik7CiAKKwlpZHJfcmVtb3ZlX2FsbCgmZHJtX21pbm9yc19pZHIpOwogCWlkcl9kZXN0cm95KCZkcm1fbWlub3JzX2lkcik7CiB9CiAKQEAgLTUwNiw5ICs0ODEsOSBAQAogCQlpZiAoaW9jdGwtPmZsYWdzICYgRFJNX1VOTE9DS0VEKQogCQkJcmV0Y29kZSA9IGZ1bmMoZGV2LCBrZGF0YSwgZmlsZV9wcml2KTsKIAkJZWxzZSB7Ci0JCQlsb2NrX2tlcm5lbCgpOworCQkJbXV0ZXhfbG9jaygmZHJtX2dsb2JhbF9tdXRleCk7CiAJCQlyZXRjb2RlID0gZnVuYyhkZXYsIGtkYXRhLCBmaWxlX3ByaXYpOwotCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJbXV0ZXhfdW5sb2NrKCZkcm1fZ2xvYmFsX211dGV4KTsKIAkJfQogCiAJCWlmIChjbWQgJiBJT0NfT1VUKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCmluZGV4IGMxOTgxODYuLmRjZTVjNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAlyZXR1cm4gYmxvY2s7CiAKIGNhcnA6Ci0JZGV2X3dhcm4oJmNvbm5lY3Rvci0+ZGV2LT5wZGV2LT5kZXYsICIlczogRURJRCBibG9jayAlZCBpbnZhbGlkLlxuIiwKKwlkZXZfd2Fybihjb25uZWN0b3ItPmRldi0+ZGV2LCAiJXM6IEVESUQgYmxvY2sgJWQgaW52YWxpZC5cbiIsCiAJCSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksIGopOwogCiBvdXQ6CkBAIC04NjQsOCArODY0LDggQEAKIAkJbW9kZSA9IGRybV9jdnRfbW9kZShkZXYsIDEzNjYsIDc2OCwgdnJlZnJlc2hfcmF0ZSwgMCwgMCwKIAkJCQkgICAgZmFsc2UpOwogCQltb2RlLT5oZGlzcGxheSA9IDEzNjY7Ci0JCW1vZGUtPnZzeW5jX3N0YXJ0ID0gbW9kZS0+dnN5bmNfc3RhcnQgLSAxOwotCQltb2RlLT52c3luY19lbmQgPSBtb2RlLT52c3luY19lbmQgLSAxOworCQltb2RlLT5oc3luY19zdGFydCA9IG1vZGUtPmhzeW5jX3N0YXJ0IC0gMTsKKwkJbW9kZS0+aHN5bmNfZW5kID0gbW9kZS0+aHN5bmNfZW5kIC0gMTsKIAkJcmV0dXJuIG1vZGU7CiAJfQogCkBAIC05MjksMTMgKzkyOSwxMSBAQAogCQl7IDE0NDAsICA1NzYgfSwKIAkJeyAyODgwLCAgNTc2IH0sCiAJfTsKLQlzdGF0aWMgY29uc3QgaW50IG5fc2l6ZXMgPQotCQlzaXplb2YoY2VhX2ludGVybGFjZWQpL3NpemVvZihjZWFfaW50ZXJsYWNlZFswXSk7CiAKIAlpZiAoIShwdC0+bWlzYyAmIERSTV9FRElEX1BUX0lOVEVSTEFDRUQpKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgbl9zaXplczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2VhX2ludGVybGFjZWQpOyBpKyspIHsKIAkJaWYgKChtb2RlLT5oZGlzcGxheSA9PSBjZWFfaW50ZXJsYWNlZFtpXS53KSAmJgogCQkgICAgKG1vZGUtPnZkaXNwbGF5ID09IGNlYV9pbnRlcmxhY2VkW2ldLmggLyAyKSkgewogCQkJbW9kZS0+dmRpc3BsYXkgKj0gMjsKQEAgLTEzNzUsNyArMTM3Myw2IEBACiAJeyAxOTIwLCAxNDQwLCA2MCwgMCB9LAogCXsgMTkyMCwgMTQ0MCwgNzUsIDAgfSwKIH07Ci1zdGF0aWMgY29uc3QgaW50IG51bV9lc3QzX21vZGVzID0gc2l6ZW9mKGVzdDNfbW9kZXMpIC8gc2l6ZW9mKGVzdDNfbW9kZXNbMF0pOwogCiBzdGF0aWMgaW50CiBkcm1fZXN0M19tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZGV0YWlsZWRfdGltaW5nICp0aW1pbmcpCkBAIC0xMzg3LDcgKzEzODQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJZm9yIChqID0gNzsgaiA+IDA7IGotLSkgewogCQkJbSA9IChpICogOCkgKyAoNyAtIGopOwotCQkJaWYgKG0gPj0gbnVtX2VzdDNfbW9kZXMpCisJCQlpZiAobSA+PSBBUlJBWV9TSVpFKGVzdDNfbW9kZXMpKQogCQkJCWJyZWFrOwogCQkJaWYgKGVzdFtpXSAmICgxIDw8IGopKSB7CiAJCQkJbW9kZSA9IGRybV9tb2RlX2ZpbmRfZG10KGNvbm5lY3Rvci0+ZGV2LApAQCAtMTYyNiw3ICsxNjIzLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghZHJtX2VkaWRfaXNfdmFsaWQoZWRpZCkpIHsKLQkJZGV2X3dhcm4oJmNvbm5lY3Rvci0+ZGV2LT5wZGV2LT5kZXYsICIlczogRURJRCBpbnZhbGlkLlxuIiwKKwkJZGV2X3dhcm4oY29ubmVjdG9yLT5kZXYtPmRldiwgIiVzOiBFRElEIGludmFsaWQuXG4iLAogCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZW5jb2Rlcl9zbGF2ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyX3NsYXZlLmMKaW5kZXggZjAxODQ2OS4uZDYyYzA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyX3NsYXZlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyX3NsYXZlLmMKQEAgLTQxLDYgKzQxLDkgQEAKICAqICZkcm1fZW5jb2Rlcl9zbGF2ZS4gVGhlIEBzbGF2ZV9mdW5jcyBmaWVsZCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGgKICAqIHRoZSBob29rcyBwcm92aWRlZCBieSB0aGUgc2xhdmUgZHJpdmVyLgogICoKKyAqIElmIEBpbmZvLT5wbGF0Zm9ybV9kYXRhIGlzIG5vbi1OVUxMIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5pdGlhbAorICogc2xhdmUgY29uZmlnLgorICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZSwgaW4gcGFydGljdWxhciwKICAqIC1FTk9ERVYgaXMgcmV0dXJuZWQgd2hlbiBubyBtYXRjaGluZyBkcml2ZXIgaXMgZm91bmQuCiAgKi8KQEAgLTg1LDYgKzg4LDEwIEBACiAJaWYgKGVycikKIAkJZ290byBmYWlsX3VucmVnaXN0ZXI7CiAKKwlpZiAoaW5mby0+cGxhdGZvcm1fZGF0YSkKKwkJZW5jb2Rlci0+c2xhdmVfZnVuY3MtPnNldF9jb25maWcoJmVuY29kZXItPmJhc2UsCisJCQkJCQkgaW5mby0+cGxhdGZvcm1fZGF0YSk7CisKIAlyZXR1cm4gMDsKIAogZmFpbF91bnJlZ2lzdGVyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggNzE5NjYyMC4uZGU4MmUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC0yNDEsNiArMjQxLDgwIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBkcm1fZmJfaGVscGVyX2RlYnVnX2VudGVyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqZnVuY3M7CisJaW50IGk7CisKKwlpZiAobGlzdF9lbXB0eSgma2VybmVsX2ZiX2hlbHBlcl9saXN0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShoZWxwZXIsICZrZXJuZWxfZmJfaGVscGVyX2xpc3QsIGtlcm5lbF9mYl9saXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBoZWxwZXItPmNydGNfY291bnQ7IGkrKykgeworCQkJc3RydWN0IGRybV9tb2RlX3NldCAqbW9kZV9zZXQgPQorCQkJCSZoZWxwZXItPmNydGNfaW5mb1tpXS5tb2RlX3NldDsKKworCQkJaWYgKCFtb2RlX3NldC0+Y3J0Yy0+ZW5hYmxlZCkKKwkJCQljb250aW51ZTsKKworCQkJZnVuY3MgPQltb2RlX3NldC0+Y3J0Yy0+aGVscGVyX3ByaXZhdGU7CisJCQlmdW5jcy0+bW9kZV9zZXRfYmFzZV9hdG9taWMobW9kZV9zZXQtPmNydGMsCisJCQkJCQkgICAgbW9kZV9zZXQtPmZiLAorCQkJCQkJICAgIG1vZGVfc2V0LT54LAorCQkJCQkJICAgIG1vZGVfc2V0LT55KTsKKworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfZGVidWdfZW50ZXIpOworCisvKiBGaW5kIHRoZSByZWFsIGZiIGZvciBhIGdpdmVuIGZiIGhlbHBlciBDUlRDICovCitzdGF0aWMgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZHJtX21vZGVfY29uZmlnX2ZiKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fY3J0YyAqYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCWlmIChjcnRjLT5iYXNlLmlkID09IGMtPmJhc2UuaWQpCisJCQlyZXR1cm4gYy0+ZmI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmZ1bmNzOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhlbHBlci0+Y3J0Y19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBkcm1fbW9kZV9zZXQgKm1vZGVfc2V0ID0gJmhlbHBlci0+Y3J0Y19pbmZvW2ldLm1vZGVfc2V0OworCQljcnRjID0gbW9kZV9zZXQtPmNydGM7CisJCWZ1bmNzID0gY3J0Yy0+aGVscGVyX3ByaXZhdGU7CisJCWZiID0gZHJtX21vZGVfY29uZmlnX2ZiKGNydGMpOworCisJCWlmICghY3J0Yy0+ZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmIpIHsKKwkJCURSTV9FUlJPUigibm8gZmIgdG8gcmVzdG9yZT8/XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZnVuY3MtPm1vZGVfc2V0X2Jhc2VfYXRvbWljKG1vZGVfc2V0LT5jcnRjLCBmYiwgY3J0Yy0+eCwKKwkJCQkJICAgIGNydGMtPnkpOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlKTsKKwogYm9vbCBkcm1fZmJfaGVscGVyX2ZvcmNlX2tlcm5lbF9tb2RlKHZvaWQpCiB7CiAJaW50IGkgPSAwOwpAQCAtNjExLDcgKzY4NSw3IEBACiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBmYl9oZWxwZXItPmZiOwogCWludCBkZXB0aDsKIAotCWlmICh2YXItPnBpeGNsb2NrICE9IDApCisJaWYgKHZhci0+cGl4Y2xvY2sgIT0gMCB8fCBpbl9kYmdfbWFzdGVyKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogTmVlZCB0byByZXNpemUgdGhlIGZiIG9iamVjdCAhISEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKaW5kZXggZTdhYWNlMi4uMmNhOGRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKQEAgLTM5LDYgKzM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAorLyogZnJvbSBCS0wgcHVzaGRvd246IG5vdGUgdGhhdCBub3RoaW5nIGVsc2Ugc2VyaWFsaXplcyBpZHJfZmluZCgpICovCitERUZJTkVfTVVURVgoZHJtX2dsb2JhbF9tdXRleCk7CisKIHN0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCkBAIC0xNzUsOCArMTc4LDcgQEAKIAogCURSTV9ERUJVRygiXG4iKTsKIAotCS8qIEJLTCBwdXNoZG93bjogbm90ZSB0aGF0IG5vdGhpbmcgZWxzZSBzZXJpYWxpemVzIGlkcl9maW5kKCkgKi8KLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmRybV9nbG9iYWxfbXV0ZXgpOwogCW1pbm9yID0gaWRyX2ZpbmQoJmRybV9taW5vcnNfaWRyLCBtaW5vcl9pZCk7CiAJaWYgKCFtaW5vcikKIAkJZ290byBvdXQ7CkBAIC0xOTcsNyArMTk5LDcgQEAKIAlmb3BzX3B1dChvbGRfZm9wcyk7CiAKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZkcm1fZ2xvYmFsX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00NzIsNyArNDc0LDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZmlsZV9wcml2LT5taW5vci0+ZGV2OwogCWludCByZXRjb2RlID0gMDsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmZHJtX2dsb2JhbF9tdXRleCk7CiAKIAlEUk1fREVCVUcoIm9wZW5fY291bnQgPSAlZFxuIiwgZGV2LT5vcGVuX2NvdW50KTsKIApAQCAtNTczLDE3ICs1NzUsMTQgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZkZXYtPmlvY3RsX2NvdW50KSkgewogCQkJRFJNX0VSUk9SKCJEZXZpY2UgYnVzeTogJWRcbiIsCiAJCQkJICBhdG9taWNfcmVhZCgmZGV2LT5pb2N0bF9jb3VudCkpOwotCQkJc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7Ci0JCQl1bmxvY2tfa2VybmVsKCk7Ci0JCQlyZXR1cm4gLUVCVVNZOworCQkJcmV0Y29kZSA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiBkcm1fbGFzdGNsb3NlKGRldik7CisJCXJldGNvZGUgPSBkcm1fbGFzdGNsb3NlKGRldik7CiAJfQorb3V0OgogCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOwotCi0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmZHJtX2dsb2JhbF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCmluZGV4IDMzZGFkM2YuLjRmMWI4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYwpAQCAtNjgsOCArNjgsMTggQEAKICAqIFdlIG1ha2UgdXAgb2Zmc2V0cyBmb3IgYnVmZmVyIG9iamVjdHMgc28gd2UgY2FuIHJlY29nbml6ZSB0aGVtIGF0CiAgKiBtbWFwIHRpbWUuCiAgKi8KKworLyogcGdvZmYgaW4gbW1hcCBpcyBhbiB1bnNpZ25lZCBsb25nLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0CisgKiB0aGUgZmFrZWQgdXAgb2Zmc2V0IHdpbGwgZml0CisgKi8KKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKICNkZWZpbmUgRFJNX0ZJTEVfUEFHRV9PRkZTRVRfU1RBUlQgKCgweEZGRkZGRkZGVUwgPj4gUEFHRV9TSElGVCkgKyAxKQogI2RlZmluZSBEUk1fRklMRV9QQUdFX09GRlNFVF9TSVpFICgoMHhGRkZGRkZGRlVMID4+IFBBR0VfU0hJRlQpICogMTYpCisjZWxzZQorI2RlZmluZSBEUk1fRklMRV9QQUdFX09GRlNFVF9TVEFSVCAoKDB4RkZGRkZGRlVMID4+IFBBR0VfU0hJRlQpICsgMSkKKyNkZWZpbmUgRFJNX0ZJTEVfUEFHRV9PRkZTRVRfU0laRSAoKDB4RkZGRkZGRlVMID4+IFBBR0VfU0hJRlQpICogMTYpCisjZW5kaWYKIAogLyoqCiAgKiBJbml0aWFsaXplIHRoZSBHRU0gZGV2aWNlIGZpZWxkcwpAQCAtNDE5LDYgKzQyOSw3IEBACiAJaWRyX2Zvcl9lYWNoKCZmaWxlX3ByaXZhdGUtPm9iamVjdF9pZHIsCiAJCSAgICAgJmRybV9nZW1fb2JqZWN0X3JlbGVhc2VfaGFuZGxlLCBOVUxMKTsKIAorCWlkcl9yZW1vdmVfYWxsKCZmaWxlX3ByaXZhdGUtPm9iamVjdF9pZHIpOwogCWlkcl9kZXN0cm95KCZmaWxlX3ByaXZhdGUtPm9iamVjdF9pZHIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dsb2JhbC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nbG9iYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODdkYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nbG9iYWwuYwpAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tLWF0LXZtd2FyZS1kb3QtY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJkcm1fZ2xvYmFsLmgiCisKK3N0cnVjdCBkcm1fZ2xvYmFsX2l0ZW0geworCXN0cnVjdCBtdXRleCBtdXRleDsKKwl2b2lkICpvYmplY3Q7CisJaW50IHJlZmNvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBkcm1fZ2xvYmFsX2l0ZW0gZ2xvYltEUk1fR0xPQkFMX05VTV07CisKK3ZvaWQgZHJtX2dsb2JhbF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFJNX0dMT0JBTF9OVU07ICsraSkgeworCQlzdHJ1Y3QgZHJtX2dsb2JhbF9pdGVtICppdGVtID0gJmdsb2JbaV07CisJCW11dGV4X2luaXQoJml0ZW0tPm11dGV4KTsKKwkJaXRlbS0+b2JqZWN0ID0gTlVMTDsKKwkJaXRlbS0+cmVmY291bnQgPSAwOworCX0KK30KKwordm9pZCBkcm1fZ2xvYmFsX3JlbGVhc2Uodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRFJNX0dMT0JBTF9OVU07ICsraSkgeworCQlzdHJ1Y3QgZHJtX2dsb2JhbF9pdGVtICppdGVtID0gJmdsb2JbaV07CisJCUJVR19PTihpdGVtLT5vYmplY3QgIT0gTlVMTCk7CisJCUJVR19PTihpdGVtLT5yZWZjb3VudCAhPSAwKTsKKwl9Cit9CisKK2ludCBkcm1fZ2xvYmFsX2l0ZW1fcmVmKHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQoreworCWludCByZXQ7CisJc3RydWN0IGRybV9nbG9iYWxfaXRlbSAqaXRlbSA9ICZnbG9iW3JlZi0+Z2xvYmFsX3R5cGVdOworCXZvaWQgKm9iamVjdDsKKworCW11dGV4X2xvY2soJml0ZW0tPm11dGV4KTsKKwlpZiAoaXRlbS0+cmVmY291bnQgPT0gMCkgeworCQlpdGVtLT5vYmplY3QgPSBremFsbG9jKHJlZi0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseShpdGVtLT5vYmplY3QgPT0gTlVMTCkpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlyZWYtPm9iamVjdCA9IGl0ZW0tPm9iamVjdDsKKwkJcmV0ID0gcmVmLT5pbml0KHJlZik7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlnb3RvIG91dF9lcnI7CisKKwl9CisJKytpdGVtLT5yZWZjb3VudDsKKwlyZWYtPm9iamVjdCA9IGl0ZW0tPm9iamVjdDsKKwlvYmplY3QgPSBpdGVtLT5vYmplY3Q7CisJbXV0ZXhfdW5sb2NrKCZpdGVtLT5tdXRleCk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCW11dGV4X3VubG9jaygmaXRlbS0+bXV0ZXgpOworCWl0ZW0tPm9iamVjdCA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dsb2JhbF9pdGVtX3JlZik7CisKK3ZvaWQgZHJtX2dsb2JhbF9pdGVtX3VucmVmKHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQoreworCXN0cnVjdCBkcm1fZ2xvYmFsX2l0ZW0gKml0ZW0gPSAmZ2xvYltyZWYtPmdsb2JhbF90eXBlXTsKKworCW11dGV4X2xvY2soJml0ZW0tPm11dGV4KTsKKwlCVUdfT04oaXRlbS0+cmVmY291bnQgPT0gMCk7CisJQlVHX09OKHJlZi0+b2JqZWN0ICE9IGl0ZW0tPm9iamVjdCk7CisJaWYgKC0taXRlbS0+cmVmY291bnQgPT0gMCkgeworCQlyZWYtPnJlbGVhc2UocmVmKTsKKwkJaXRlbS0+b2JqZWN0ID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpdGVtLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nbG9iYWxfaXRlbV91bnJlZik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW5mby5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pbmZvLmMKaW5kZXggZjBmNmM2Yi4uMmVmMmM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pbmZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pbmZvLmMKQEAgLTUxLDEzICs1MSwyNCBAQAogCWlmICghbWFzdGVyKQogCQlyZXR1cm4gMDsKIAotCWlmIChtYXN0ZXItPnVuaXF1ZSkgewotCQlzZXFfcHJpbnRmKG0sICIlcyAlcyAlc1xuIiwKLQkJCSAgIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsCi0JCQkgICBwY2lfbmFtZShkZXYtPnBkZXYpLCBtYXN0ZXItPnVuaXF1ZSk7CisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfVVNFX1BMQVRGT1JNX0RFVklDRSkpIHsKKwkJaWYgKG1hc3Rlci0+dW5pcXVlKSB7CisJCQlzZXFfcHJpbnRmKG0sICIlcyAlcyAlc1xuIiwKKwkJCQkJZGV2LT5kcml2ZXItPnBsYXRmb3JtX2RldmljZS0+bmFtZSwKKwkJCQkJZGV2X25hbWUoZGV2LT5kZXYpLCBtYXN0ZXItPnVuaXF1ZSk7CisJCX0gZWxzZSB7CisJCQlzZXFfcHJpbnRmKG0sICIlc1xuIiwKKwkJCQlkZXYtPmRyaXZlci0+cGxhdGZvcm1fZGV2aWNlLT5uYW1lKTsKKwkJfQogCX0gZWxzZSB7Ci0JCXNlcV9wcmludGYobSwgIiVzICVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lLAotCQkJICAgcGNpX25hbWUoZGV2LT5wZGV2KSk7CisJCWlmIChtYXN0ZXItPnVuaXF1ZSkgeworCQkJc2VxX3ByaW50ZihtLCAiJXMgJXMgJXNcbiIsCisJCQkJZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSwKKwkJCQlkZXZfbmFtZShkZXYtPmRldiksIG1hc3Rlci0+dW5pcXVlKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYobSwgIiVzICVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lLAorCQkJCWRldl9uYW1lKGRldi0+ZGV2KSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jdGwuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jdGwuYwppbmRleCA5YjlmZjQ2Li43YjAzYjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvY3RsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2N0bC5jCkBAIC02NCw2ICs2NCwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZAorZHJtX3Vuc2V0X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCit7CisJa2ZyZWUoZGV2LT5kZXZuYW1lKTsKKwlkZXYtPmRldm5hbWUgPSBOVUxMOworCisJa2ZyZWUobWFzdGVyLT51bmlxdWUpOworCW1hc3Rlci0+dW5pcXVlID0gTlVMTDsKKwltYXN0ZXItPnVuaXF1ZV9sZW4gPSAwOworCW1hc3Rlci0+dW5pcXVlX3NpemUgPSAwOworfQorCiAvKioKICAqIFNldCB0aGUgYnVzIGlkLgogICoKQEAgLTk0LDE3ICsxMDcsMjQgQEAKIAltYXN0ZXItPnVuaXF1ZV9sZW4gPSB1LT51bmlxdWVfbGVuOwogCW1hc3Rlci0+dW5pcXVlX3NpemUgPSB1LT51bmlxdWVfbGVuICsgMTsKIAltYXN0ZXItPnVuaXF1ZSA9IGttYWxsb2MobWFzdGVyLT51bmlxdWVfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXN0ZXItPnVuaXF1ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGNvcHlfZnJvbV91c2VyKG1hc3Rlci0+dW5pcXVlLCB1LT51bmlxdWUsIG1hc3Rlci0+dW5pcXVlX2xlbikpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghbWFzdGVyLT51bmlxdWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKG1hc3Rlci0+dW5pcXVlLCB1LT51bmlxdWUsIG1hc3Rlci0+dW5pcXVlX2xlbikpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnI7CisJfQogCiAJbWFzdGVyLT51bmlxdWVbbWFzdGVyLT51bmlxdWVfbGVuXSA9ICdcMCc7CiAKIAlkZXYtPmRldm5hbWUgPSBrbWFsbG9jKHN0cmxlbihkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKSArCiAJCQkgICAgICAgc3RybGVuKG1hc3Rlci0+dW5pcXVlKSArIDIsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5kZXZuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWRldi0+ZGV2bmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CiAKIAlzcHJpbnRmKGRldi0+ZGV2bmFtZSwgIiVzQCVzIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSwKIAkJbWFzdGVyLT51bmlxdWUpOwpAQCAtMTEzLDUzICsxMzMsMTAzIEBACiAJICogYnVzaWQuCiAJICovCiAJcmV0ID0gc3NjYW5mKG1hc3Rlci0+dW5pcXVlLCAiUENJOiVkOiVkOiVkIiwgJmJ1cywgJnNsb3QsICZmdW5jKTsKLQlpZiAocmV0ICE9IDMpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXQgIT0gMykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKIAlkb21haW4gPSBidXMgPj4gODsKIAlidXMgJj0gMHhmZjsKIAogCWlmICgoZG9tYWluICE9IGRybV9nZXRfcGNpX2RvbWFpbihkZXYpKSB8fAogCSAgICAoYnVzICE9IGRldi0+cGRldi0+YnVzLT5udW1iZXIpIHx8CiAJICAgIChzbG90ICE9IFBDSV9TTE9UKGRldi0+cGRldi0+ZGV2Zm4pKSB8fAotCSAgICAoZnVuYyAhPSBQQ0lfRlVOQyhkZXYtPnBkZXYtPmRldmZuKSkpCi0JCXJldHVybiAtRUlOVkFMOworCSAgICAoZnVuYyAhPSBQQ0lfRlVOQyhkZXYtPnBkZXYtPmRldmZuKSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQogCiAJcmV0dXJuIDA7CisKK2VycjoKKwlkcm1fdW5zZXRfYnVzaWQoZGV2LCBtYXN0ZXIpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZHJtX3NldF9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyID0gZmlsZV9wcml2LT5tYXN0ZXI7Ci0JaW50IGxlbjsKKwlpbnQgbGVuLCByZXQ7CiAKIAlpZiAobWFzdGVyLT51bmlxdWUgIT0gTlVMTCkKLQkJcmV0dXJuIC1FQlVTWTsKKwkJZHJtX3Vuc2V0X2J1c2lkKGRldiwgbWFzdGVyKTsKIAotCW1hc3Rlci0+dW5pcXVlX2xlbiA9IDQwOwotCW1hc3Rlci0+dW5pcXVlX3NpemUgPSBtYXN0ZXItPnVuaXF1ZV9sZW47Ci0JbWFzdGVyLT51bmlxdWUgPSBrbWFsbG9jKG1hc3Rlci0+dW5pcXVlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChtYXN0ZXItPnVuaXF1ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9VU0VfUExBVEZPUk1fREVWSUNFKSkgeworCQltYXN0ZXItPnVuaXF1ZV9sZW4gPSAxMCArIHN0cmxlbihkZXYtPnBsYXRmb3JtZGV2LT5uYW1lKTsKKwkJbWFzdGVyLT51bmlxdWUgPSBrbWFsbG9jKG1hc3Rlci0+dW5pcXVlX2xlbiArIDEsIEdGUF9LRVJORUwpOwogCi0JbGVuID0gc25wcmludGYobWFzdGVyLT51bmlxdWUsIG1hc3Rlci0+dW5pcXVlX2xlbiwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsCi0JCSAgICAgICBkcm1fZ2V0X3BjaV9kb21haW4oZGV2KSwKLQkJICAgICAgIGRldi0+cGRldi0+YnVzLT5udW1iZXIsCi0JCSAgICAgICBQQ0lfU0xPVChkZXYtPnBkZXYtPmRldmZuKSwKLQkJICAgICAgIFBDSV9GVU5DKGRldi0+cGRldi0+ZGV2Zm4pKTsKLQlpZiAobGVuID49IG1hc3Rlci0+dW5pcXVlX2xlbikKLQkJRFJNX0VSUk9SKCJidWZmZXIgb3ZlcmZsb3ciKTsKLQllbHNlCi0JCW1hc3Rlci0+dW5pcXVlX2xlbiA9IGxlbjsKKwkJaWYgKG1hc3Rlci0+dW5pcXVlID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKIAotCWRldi0+ZGV2bmFtZSA9IGttYWxsb2Moc3RybGVuKGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpICsKLQkJCSAgICAgICBtYXN0ZXItPnVuaXF1ZV9sZW4gKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2LT5kZXZuYW1lID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQlsZW4gPSBzbnByaW50ZihtYXN0ZXItPnVuaXF1ZSwgbWFzdGVyLT51bmlxdWVfbGVuLAorCQkJInBsYXRmb3JtOiVzIiwgZGV2LT5wbGF0Zm9ybWRldi0+bmFtZSk7CiAKLQlzcHJpbnRmKGRldi0+ZGV2bmFtZSwgIiVzQCVzIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSwKLQkJbWFzdGVyLT51bmlxdWUpOworCQlpZiAobGVuID4gbWFzdGVyLT51bmlxdWVfbGVuKSB7CisJCQlEUk1fRVJST1IoIlVuaXF1ZSBidWZmZXIgb3ZlcmZsb3dlZFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQlkZXYtPmRldm5hbWUgPQorCQkJa21hbGxvYyhzdHJsZW4oZGV2LT5wbGF0Zm9ybWRldi0+bmFtZSkgKworCQkJCW1hc3Rlci0+dW5pcXVlX2xlbiArIDIsIEdGUF9LRVJORUwpOworCisJCWlmIChkZXYtPmRldm5hbWUgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJc3ByaW50ZihkZXYtPmRldm5hbWUsICIlc0AlcyIsIGRldi0+cGxhdGZvcm1kZXYtPm5hbWUsCisJCQltYXN0ZXItPnVuaXF1ZSk7CisKKwl9IGVsc2UgeworCQltYXN0ZXItPnVuaXF1ZV9sZW4gPSA0MDsKKwkJbWFzdGVyLT51bmlxdWVfc2l6ZSA9IG1hc3Rlci0+dW5pcXVlX2xlbjsKKwkJbWFzdGVyLT51bmlxdWUgPSBrbWFsbG9jKG1hc3Rlci0+dW5pcXVlX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAobWFzdGVyLT51bmlxdWUgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWxlbiA9IHNucHJpbnRmKG1hc3Rlci0+dW5pcXVlLCBtYXN0ZXItPnVuaXF1ZV9sZW4sCisJCQkicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwKKwkJCWRybV9nZXRfcGNpX2RvbWFpbihkZXYpLAorCQkJZGV2LT5wZGV2LT5idXMtPm51bWJlciwKKwkJCVBDSV9TTE9UKGRldi0+cGRldi0+ZGV2Zm4pLAorCQkJUENJX0ZVTkMoZGV2LT5wZGV2LT5kZXZmbikpOworCQlpZiAobGVuID49IG1hc3Rlci0+dW5pcXVlX2xlbikgeworCQkJRFJNX0VSUk9SKCJidWZmZXIgb3ZlcmZsb3ciKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfSBlbHNlCisJCQltYXN0ZXItPnVuaXF1ZV9sZW4gPSBsZW47CisKKwkJZGV2LT5kZXZuYW1lID0KKwkJCWttYWxsb2Moc3RybGVuKGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpICsKKwkJCQltYXN0ZXItPnVuaXF1ZV9sZW4gKyAyLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoZGV2LT5kZXZuYW1lID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXNwcmludGYoZGV2LT5kZXZuYW1lLCAiJXNAJXMiLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lLAorCQkJbWFzdGVyLT51bmlxdWUpOworCX0KIAogCXJldHVybiAwOworCitlcnI6CisJZHJtX3Vuc2V0X2J1c2lkKGRldiwgbWFzdGVyKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTMyMyw3ICszOTMsOSBAQAogCQkJLyoKIAkJCSAqIFZlcnNpb24gMS4xIGluY2x1ZGVzIHR5aW5nIG9mIERSTSB0byBzcGVjaWZpYyBkZXZpY2UKIAkJCSAqLwotCQkJZHJtX3NldF9idXNpZChkZXYsIGZpbGVfcHJpdik7CisJCQlyZXRjb2RlID0gZHJtX3NldF9idXNpZChkZXYsIGZpbGVfcHJpdik7CisJCQlpZiAocmV0Y29kZSkKKwkJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCmluZGV4IGEyNjNiNzAuLjlkM2E1MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwpAQCAtMzQsNiArMzQsNyBAQAogICovCiAKICNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX3RyYWNlLmgiCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2sgcXVldWUgc3VwcG9ydCAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTU3LDYgKzU4LDkgQEAKIHsKIAlzdHJ1Y3QgZHJtX2lycV9idXNpZCAqcCA9IGRhdGE7CiAKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9VU0VfUExBVEZPUk1fREVWSUNFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjExLDcgKzIxNSw3IEBACiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZGV2LT5wZGV2LT5pcnEgPT0gMCkKKwlpZiAoZHJtX2Rldl90b19pcnEoZGV2KSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTIyOSw3ICsyMzMsNyBAQAogCWRldi0+aXJxX2VuYWJsZWQgPSAxOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JRFJNX0RFQlVHKCJpcnE9JWRcbiIsIGRldi0+cGRldi0+aXJxKTsKKwlEUk1fREVCVUcoImlycT0lZFxuIiwgZHJtX2Rldl90b19pcnEoZGV2KSk7CiAKIAkvKiBCZWZvcmUgaW5zdGFsbGluZyBoYW5kbGVyICovCiAJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsKGRldik7CkBAIC0zMDIsMTQgKzMwNiwxNCBAQAogCWlmICghaXJxX2VuYWJsZWQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JRFJNX0RFQlVHKCJpcnE9JWRcbiIsIGRldi0+cGRldi0+aXJxKTsKKwlEUk1fREVCVUcoImlycT0lZFxuIiwgZHJtX2Rldl90b19pcnEoZGV2KSk7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXZnYV9jbGllbnRfcmVnaXN0ZXIoZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKIAogCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsKGRldik7CiAKLQlmcmVlX2lycShkZXYtPnBkZXYtPmlycSwgZGV2KTsKKwlmcmVlX2lycShkcm1fZGV2X3RvX2lycShkZXYpLCBkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNDEsNyArMzQ1LDcgQEAKIAkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGRldi0+aWZfdmVyc2lvbiA8IERSTV9JRl9WRVJTSU9OKDEsIDIpICYmCi0JCSAgICBjdGwtPmlycSAhPSBkZXYtPnBkZXYtPmlycSkKKwkJICAgIGN0bC0+aXJxICE9IGRybV9kZXZfdG9faXJxKGRldikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGRybV9pcnFfaW5zdGFsbChkZXYpOwogCWNhc2UgRFJNX1VOSU5TVF9IQU5ETEVSOgpAQCAtNTg3LDYgKzU5MSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZS0+cGlwZSA9IHBpcGU7CisJZS0+YmFzZS5waWQgPSBjdXJyZW50LT5waWQ7CiAJZS0+ZXZlbnQuYmFzZS50eXBlID0gRFJNX0VWRU5UX1ZCTEFOSzsKIAllLT5ldmVudC5iYXNlLmxlbmd0aCA9IHNpemVvZiBlLT5ldmVudDsKIAllLT5ldmVudC51c2VyX2RhdGEgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNpZ25hbDsKQEAgLTYxNCw2ICs2MTksOSBAQAogCURSTV9ERUJVRygiZXZlbnQgb24gdmJsYW5rIGNvdW50ICVkLCBjdXJyZW50ICVkLCBjcnRjICVkXG4iLAogCQkgIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UsIHNlcSwgcGlwZSk7CiAKKwl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50X3F1ZXVlZChjdXJyZW50LT5waWQsIHBpcGUsCisJCQkJICAgICAgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSk7CisKIAllLT5ldmVudC5zZXF1ZW5jZSA9IHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2U7CiAJaWYgKChzZXEgLSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpIHsKIAkJZS0+ZXZlbnQudHZfc2VjID0gbm93LnR2X3NlYzsKQEAgLTYyMSw2ICs2MjksOCBAQAogCQlkcm1fdmJsYW5rX3B1dChkZXYsIGUtPnBpcGUpOwogCQlsaXN0X2FkZF90YWlsKCZlLT5iYXNlLmxpbmssICZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3dhaXQpOworCQl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50X2RlbGl2ZXJlZChjdXJyZW50LT5waWQsIHBpcGUsCisJCQkJCQkgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmZS0+YmFzZS5saW5rLCAmZGV2LT52YmxhbmtfZXZlbnRfbGlzdCk7CiAJfQpAQCAtNjUxLDcgKzY2MSw3IEBACiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50IGZsYWdzLCBzZXEsIGNydGM7CiAKLQlpZiAoKCFkZXYtPnBkZXYtPmlycSkgfHwgKCFkZXYtPmlycV9lbmFibGVkKSkKKwlpZiAoKCFkcm1fZGV2X3RvX2lycShkZXYpKSB8fCAoIWRldi0+aXJxX2VuYWJsZWQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJiBfRFJNX1ZCTEFOS19TSUdOQUwpCkBAIC03NTEsOSArNzYxLDEzIEBACiAJCWRybV92YmxhbmtfcHV0KGRldiwgZS0+cGlwZSk7CiAJCWxpc3RfbW92ZV90YWlsKCZlLT5iYXNlLmxpbmssICZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3dhaXQpOworCQl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50X2RlbGl2ZXJlZChlLT5iYXNlLnBpZCwgZS0+cGlwZSwKKwkJCQkJCSBlLT5ldmVudC5zZXF1ZW5jZSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50KGNydGMsIHNlcSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCmluZGV4IDJhYzA3NGM4Li5kYTk5ZWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCkBAIC00OCw0NCArNDgsMTQgQEAKIAogI2RlZmluZSBNTV9VTlVTRURfVEFSR0VUIDQKIAotdW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShzdHJ1Y3QgZHJtX21tICptbSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Ci0Jc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKLQotCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwotCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwotCWlmICghZW50cnktPmZyZWUpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGVudHJ5LT5zaXplOwotfQotCi1pbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Ci0Jc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKLQotCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwotCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwotCWlmICghZW50cnktPmZyZWUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGVudHJ5LT5zaXplIDw9IHNpemUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZW50cnktPnNpemUgLT0gc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX2ttYWxsb2Moc3RydWN0IGRybV9tbSAqbW0sIGludCBhdG9taWMpCiB7CiAJc3RydWN0IGRybV9tbV9ub2RlICpjaGlsZDsKIAogCWlmIChhdG9taWMpCi0JCWNoaWxkID0ga21hbGxvYyhzaXplb2YoKmNoaWxkKSwgR0ZQX0FUT01JQyk7CisJCWNoaWxkID0ga3phbGxvYyhzaXplb2YoKmNoaWxkKSwgR0ZQX0FUT01JQyk7CiAJZWxzZQotCQljaGlsZCA9IGttYWxsb2Moc2l6ZW9mKCpjaGlsZCksIEdGUF9LRVJORUwpOworCQljaGlsZCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlsZCksIEdGUF9LRVJORUwpOwogCiAJaWYgKHVubGlrZWx5KGNoaWxkID09IE5VTEwpKSB7CiAJCXNwaW5fbG9jaygmbW0tPnVudXNlZF9sb2NrKTsKQEAgLTk0LDggKzY0LDggQEAKIAkJZWxzZSB7CiAJCQljaGlsZCA9CiAJCQkgICAgbGlzdF9lbnRyeShtbS0+dW51c2VkX25vZGVzLm5leHQsCi0JCQkJICAgICAgIHN0cnVjdCBkcm1fbW1fbm9kZSwgZmxfZW50cnkpOwotCQkJbGlzdF9kZWwoJmNoaWxkLT5mbF9lbnRyeSk7CisJCQkJICAgICAgIHN0cnVjdCBkcm1fbW1fbm9kZSwgZnJlZV9zdGFjayk7CisJCQlsaXN0X2RlbCgmY2hpbGQtPmZyZWVfc3RhY2spOwogCQkJLS1tbS0+bnVtX3VudXNlZDsKIAkJfQogCQlzcGluX3VubG9jaygmbW0tPnVudXNlZF9sb2NrKTsKQEAgLTExNSw3ICs4NSw3IEBACiAJc3Bpbl9sb2NrKCZtbS0+dW51c2VkX2xvY2spOwogCXdoaWxlIChtbS0+bnVtX3VudXNlZCA8IE1NX1VOVVNFRF9UQVJHRVQpIHsKIAkJc3Bpbl91bmxvY2soJm1tLT51bnVzZWRfbG9jayk7Ci0JCW5vZGUgPSBrbWFsbG9jKHNpemVvZigqbm9kZSksIEdGUF9LRVJORUwpOworCQlub2RlID0ga3phbGxvYyhzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKIAkJc3Bpbl9sb2NrKCZtbS0+dW51c2VkX2xvY2spOwogCiAJCWlmICh1bmxpa2VseShub2RlID09IE5VTEwpKSB7CkBAIC0xMjQsNyArOTQsNyBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCQkrK21tLT5udW1fdW51c2VkOwotCQlsaXN0X2FkZF90YWlsKCZub2RlLT5mbF9lbnRyeSwgJm1tLT51bnVzZWRfbm9kZXMpOworCQlsaXN0X2FkZF90YWlsKCZub2RlLT5mcmVlX3N0YWNrLCAmbW0tPnVudXNlZF9ub2Rlcyk7CiAJfQogCXNwaW5fdW5sb2NrKCZtbS0+dW51c2VkX2xvY2spOwogCXJldHVybiAwOwpAQCAtMTQ2LDI3ICsxMTYsMTIgQEAKIAljaGlsZC0+c3RhcnQgPSBzdGFydDsKIAljaGlsZC0+bW0gPSBtbTsKIAotCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5tbF9lbnRyeSwgJm1tLT5tbF9lbnRyeSk7Ci0JbGlzdF9hZGRfdGFpbCgmY2hpbGQtPmZsX2VudHJ5LCAmbW0tPmZsX2VudHJ5KTsKKwlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bm9kZV9saXN0LCAmbW0tPm5vZGVfbGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPmZyZWVfc3RhY2ssICZtbS0+ZnJlZV9zdGFjayk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgYXRvbWljKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKLQlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwotCi0JdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7Ci0JaWYgKCFlbnRyeS0+ZnJlZSkgewotCQlyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIGVudHJ5LT5zdGFydCArIGVudHJ5LT5zaXplLAotCQkJCQkgICAgICAgc2l6ZSwgYXRvbWljKTsKLQl9Ci0JZW50cnktPnNpemUgKz0gc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NwbGl0X2F0X3N0YXJ0KHN0cnVjdCBkcm1fbW1fbm9kZSAqcGFyZW50LAogCQkJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJCSBpbnQgYXRvbWljKQpAQCAtMTc3LDE1ICsxMzIsMTQgQEAKIAlpZiAodW5saWtlbHkoY2hpbGQgPT0gTlVMTCkpCiAJCXJldHVybiBOVUxMOwogCi0JSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5mbF9lbnRyeSk7CisJSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5mcmVlX3N0YWNrKTsKIAotCWNoaWxkLT5mcmVlID0gMDsKIAljaGlsZC0+c2l6ZSA9IHNpemU7CiAJY2hpbGQtPnN0YXJ0ID0gcGFyZW50LT5zdGFydDsKIAljaGlsZC0+bW0gPSBwYXJlbnQtPm1tOwogCi0JbGlzdF9hZGRfdGFpbCgmY2hpbGQtPm1sX2VudHJ5LCAmcGFyZW50LT5tbF9lbnRyeSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5mbF9lbnRyeSk7CisJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPm5vZGVfbGlzdCwgJnBhcmVudC0+bm9kZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2hpbGQtPmZyZWVfc3RhY2spOwogCiAJcGFyZW50LT5zaXplIC09IHNpemU7CiAJcGFyZW50LT5zdGFydCArPSBzaXplOwpAQCAtMjEzLDcgKzE2Nyw3IEBACiAJfQogCiAJaWYgKG5vZGUtPnNpemUgPT0gc2l6ZSkgewotCQlsaXN0X2RlbF9pbml0KCZub2RlLT5mbF9lbnRyeSk7CisJCWxpc3RfZGVsX2luaXQoJm5vZGUtPmZyZWVfc3RhY2spOwogCQlub2RlLT5mcmVlID0gMDsKIAl9IGVsc2UgewogCQlub2RlID0gZHJtX21tX3NwbGl0X2F0X3N0YXJ0KG5vZGUsIHNpemUsIGF0b21pYyk7CkBAIC0yNTEsNyArMjA1LDcgQEAKIAl9CiAKIAlpZiAobm9kZS0+c2l6ZSA9PSBzaXplKSB7Ci0JCWxpc3RfZGVsX2luaXQoJm5vZGUtPmZsX2VudHJ5KTsKKwkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+ZnJlZV9zdGFjayk7CiAJCW5vZGUtPmZyZWUgPSAwOwogCX0gZWxzZSB7CiAJCW5vZGUgPSBkcm1fbW1fc3BsaXRfYXRfc3RhcnQobm9kZSwgc2l6ZSwgYXRvbWljKTsKQEAgLTI3MywxNiArMjI3LDE5IEBACiB7CiAKIAlzdHJ1Y3QgZHJtX21tICptbSA9IGN1ci0+bW07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY3VyX2hlYWQgPSAmY3VyLT5tbF9lbnRyeTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpyb290X2hlYWQgPSAmbW0tPm1sX2VudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cl9oZWFkID0gJmN1ci0+bm9kZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKnJvb3RfaGVhZCA9ICZtbS0+bm9kZV9saXN0OwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqcHJldl9ub2RlID0gTlVMTDsKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKm5leHRfbm9kZTsKIAogCWludCBtZXJnZWQgPSAwOwogCisJQlVHX09OKGN1ci0+c2Nhbm5lZF9ibG9jayB8fCBjdXItPnNjYW5uZWRfcHJldl9mcmVlCisJCQkJICB8fCBjdXItPnNjYW5uZWRfbmV4dF9mcmVlKTsKKwogCWlmIChjdXJfaGVhZC0+cHJldiAhPSByb290X2hlYWQpIHsKIAkJcHJldl9ub2RlID0KLQkJICAgIGxpc3RfZW50cnkoY3VyX2hlYWQtPnByZXYsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOworCQkgICAgbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgc3RydWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOwogCQlpZiAocHJldl9ub2RlLT5mcmVlKSB7CiAJCQlwcmV2X25vZGUtPnNpemUgKz0gY3VyLT5zaXplOwogCQkJbWVyZ2VkID0gMTsKQEAgLTI5MCwxNSArMjQ3LDE1IEBACiAJfQogCWlmIChjdXJfaGVhZC0+bmV4dCAhPSByb290X2hlYWQpIHsKIAkJbmV4dF9ub2RlID0KLQkJICAgIGxpc3RfZW50cnkoY3VyX2hlYWQtPm5leHQsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOworCQkgICAgbGlzdF9lbnRyeShjdXJfaGVhZC0+bmV4dCwgc3RydWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOwogCQlpZiAobmV4dF9ub2RlLT5mcmVlKSB7CiAJCQlpZiAobWVyZ2VkKSB7CiAJCQkJcHJldl9ub2RlLT5zaXplICs9IG5leHRfbm9kZS0+c2l6ZTsKLQkJCQlsaXN0X2RlbCgmbmV4dF9ub2RlLT5tbF9lbnRyeSk7Ci0JCQkJbGlzdF9kZWwoJm5leHRfbm9kZS0+ZmxfZW50cnkpOworCQkJCWxpc3RfZGVsKCZuZXh0X25vZGUtPm5vZGVfbGlzdCk7CisJCQkJbGlzdF9kZWwoJm5leHRfbm9kZS0+ZnJlZV9zdGFjayk7CiAJCQkJc3Bpbl9sb2NrKCZtbS0+dW51c2VkX2xvY2spOwogCQkJCWlmIChtbS0+bnVtX3VudXNlZCA8IE1NX1VOVVNFRF9UQVJHRVQpIHsKLQkJCQkJbGlzdF9hZGQoJm5leHRfbm9kZS0+ZmxfZW50cnksCisJCQkJCWxpc3RfYWRkKCZuZXh0X25vZGUtPmZyZWVfc3RhY2ssCiAJCQkJCQkgJm1tLT51bnVzZWRfbm9kZXMpOwogCQkJCQkrK21tLT5udW1fdW51c2VkOwogCQkJCX0gZWxzZQpAQCAtMzEzLDEyICsyNzAsMTIgQEAKIAl9CiAJaWYgKCFtZXJnZWQpIHsKIAkJY3VyLT5mcmVlID0gMTsKLQkJbGlzdF9hZGQoJmN1ci0+ZmxfZW50cnksICZtbS0+ZmxfZW50cnkpOworCQlsaXN0X2FkZCgmY3VyLT5mcmVlX3N0YWNrLCAmbW0tPmZyZWVfc3RhY2spOwogCX0gZWxzZSB7Ci0JCWxpc3RfZGVsKCZjdXItPm1sX2VudHJ5KTsKKwkJbGlzdF9kZWwoJmN1ci0+bm9kZV9saXN0KTsKIAkJc3Bpbl9sb2NrKCZtbS0+dW51c2VkX2xvY2spOwogCQlpZiAobW0tPm51bV91bnVzZWQgPCBNTV9VTlVTRURfVEFSR0VUKSB7Ci0JCQlsaXN0X2FkZCgmY3VyLT5mbF9lbnRyeSwgJm1tLT51bnVzZWRfbm9kZXMpOworCQkJbGlzdF9hZGQoJmN1ci0+ZnJlZV9zdGFjaywgJm1tLT51bnVzZWRfbm9kZXMpOwogCQkJKyttbS0+bnVtX3VudXNlZDsKIAkJfSBlbHNlCiAJCQlrZnJlZShjdXIpOwpAQCAtMzI4LDQwICsyODUsNTAgQEAKIAogRVhQT1JUX1NZTUJPTChkcm1fbW1fcHV0X2Jsb2NrKTsKIAorc3RhdGljIGludCBjaGVja19mcmVlX21tX25vZGUoc3RydWN0IGRybV9tbV9ub2RlICplbnRyeSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgICAgdW5zaWduZWQgYWxpZ25tZW50KQoreworCXVuc2lnbmVkIHdhc3RlZCA9IDA7CisKKwlpZiAoZW50cnktPnNpemUgPCBzaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChhbGlnbm1lbnQpIHsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgdG1wID0gZW50cnktPnN0YXJ0ICUgYWxpZ25tZW50OworCQlpZiAodG1wKQorCQkJd2FzdGVkID0gYWxpZ25tZW50IC0gdG1wOworCX0KKworCWlmIChlbnRyeS0+c2l6ZSA+PSBzaXplICsgd2FzdGVkKSB7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBzdHJ1Y3QgZHJtX21tICptbSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQsIGludCBiZXN0X21hdGNoKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0JY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqZnJlZV9zdGFjayA9ICZtbS0+ZmxfZW50cnk7CiAJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmJlc3Q7CiAJdW5zaWduZWQgbG9uZyBiZXN0X3NpemU7Ci0JdW5zaWduZWQgd2FzdGVkOworCisJQlVHX09OKG1tLT5zY2FubmVkX2Jsb2Nrcyk7CiAKIAliZXN0ID0gTlVMTDsKIAliZXN0X3NpemUgPSB+MFVMOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCBmcmVlX3N0YWNrKSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZsX2VudHJ5KTsKLQkJd2FzdGVkID0gMDsKLQotCQlpZiAoZW50cnktPnNpemUgPCBzaXplKQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZtbS0+ZnJlZV9zdGFjaywgZnJlZV9zdGFjaykgeworCQlpZiAoIWNoZWNrX2ZyZWVfbW1fbm9kZShlbnRyeSwgc2l6ZSwgYWxpZ25tZW50KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChhbGlnbm1lbnQpIHsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIHRtcCA9IGVudHJ5LT5zdGFydCAlIGFsaWdubWVudDsKLQkJCWlmICh0bXApCi0JCQkJd2FzdGVkICs9IGFsaWdubWVudCAtIHRtcDsKLQkJfQorCQlpZiAoIWJlc3RfbWF0Y2gpCisJCQlyZXR1cm4gZW50cnk7CiAKLQkJaWYgKGVudHJ5LT5zaXplID49IHNpemUgKyB3YXN0ZWQpIHsKLQkJCWlmICghYmVzdF9tYXRjaCkKLQkJCQlyZXR1cm4gZW50cnk7Ci0JCQlpZiAoZW50cnktPnNpemUgPCBiZXN0X3NpemUpIHsKLQkJCQliZXN0ID0gZW50cnk7Ci0JCQkJYmVzdF9zaXplID0gZW50cnktPnNpemU7Ci0JCQl9CisJCWlmIChlbnRyeS0+c2l6ZSA8IGJlc3Rfc2l6ZSkgeworCQkJYmVzdCA9IGVudHJ5OworCQkJYmVzdF9zaXplID0gZW50cnktPnNpemU7CiAJCX0KIAl9CiAKQEAgLTM3Niw0MyArMzQzLDI4IEBACiAJCQkJCQl1bnNpZ25lZCBsb25nIGVuZCwKIAkJCQkJCWludCBiZXN0X21hdGNoKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0JY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqZnJlZV9zdGFjayA9ICZtbS0+ZmxfZW50cnk7CiAJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmJlc3Q7CiAJdW5zaWduZWQgbG9uZyBiZXN0X3NpemU7Ci0JdW5zaWduZWQgd2FzdGVkOworCisJQlVHX09OKG1tLT5zY2FubmVkX2Jsb2Nrcyk7CiAKIAliZXN0ID0gTlVMTDsKIAliZXN0X3NpemUgPSB+MFVMOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCBmcmVlX3N0YWNrKSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZsX2VudHJ5KTsKLQkJd2FzdGVkID0gMDsKLQotCQlpZiAoZW50cnktPnNpemUgPCBzaXplKQotCQkJY29udGludWU7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmbW0tPmZyZWVfc3RhY2ssIGZyZWVfc3RhY2spIHsKIAkJaWYgKGVudHJ5LT5zdGFydCA+IGVuZCB8fCAoZW50cnktPnN0YXJ0K2VudHJ5LT5zaXplKSA8IHN0YXJ0KQogCQkJY29udGludWU7CiAKLQkJaWYgKGVudHJ5LT5zdGFydCA8IHN0YXJ0KQotCQkJd2FzdGVkICs9IHN0YXJ0IC0gZW50cnktPnN0YXJ0OworCQlpZiAoIWNoZWNrX2ZyZWVfbW1fbm9kZShlbnRyeSwgc2l6ZSwgYWxpZ25tZW50KSkKKwkJCWNvbnRpbnVlOwogCi0JCWlmIChhbGlnbm1lbnQpIHsKLQkJCXJlZ2lzdGVyIHVuc2lnbmVkIHRtcCA9IChlbnRyeS0+c3RhcnQgKyB3YXN0ZWQpICUgYWxpZ25tZW50OwotCQkJaWYgKHRtcCkKLQkJCQl3YXN0ZWQgKz0gYWxpZ25tZW50IC0gdG1wOwotCQl9CisJCWlmICghYmVzdF9tYXRjaCkKKwkJCXJldHVybiBlbnRyeTsKIAotCQlpZiAoZW50cnktPnNpemUgPj0gc2l6ZSArIHdhc3RlZCAmJgotCQkgICAgKGVudHJ5LT5zdGFydCArIHdhc3RlZCArIHNpemUpIDw9IGVuZCkgewotCQkJaWYgKCFiZXN0X21hdGNoKQotCQkJCXJldHVybiBlbnRyeTsKLQkJCWlmIChlbnRyeS0+c2l6ZSA8IGJlc3Rfc2l6ZSkgewotCQkJCWJlc3QgPSBlbnRyeTsKLQkJCQliZXN0X3NpemUgPSBlbnRyeS0+c2l6ZTsKLQkJCX0KKwkJaWYgKGVudHJ5LT5zaXplIDwgYmVzdF9zaXplKSB7CisJCQliZXN0ID0gZW50cnk7CisJCQliZXN0X3NpemUgPSBlbnRyeS0+c2l6ZTsKIAkJfQogCX0KIApAQCAtNDIwLDkgKzM3MiwxNjEgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21tX3NlYXJjaF9mcmVlX2luX3JhbmdlKTsKIAorLyoqCisgKiBJbml0aWFsaXphIGxydSBzY2FubmluZy4KKyAqCisgKiBUaGlzIHNpbXBseSBzZXRzIHVwIHRoZSBzY2FubmluZyByb3V0aW5lcyB3aXRoIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZGVzaXJlZAorICogaG9sZS4KKyAqCisgKiBXYXJuaW5nOiBBcyBsb25nIGFzIHRoZSBzY2FuIGxpc3QgaXMgbm9uLWVtcHR5LCBubyBvdGhlciBvcGVyYXRpb25zIHRoYW4KKyAqIGFkZGluZy9yZW1vdmluZyBub2RlcyB0by9mcm9tIHRoZSBzY2FuIGxpc3QgYXJlIGFsbG93ZWQuCisgKi8KK3ZvaWQgZHJtX21tX2luaXRfc2NhbihzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQpCit7CisJbW0tPnNjYW5fYWxpZ25tZW50ID0gYWxpZ25tZW50OworCW1tLT5zY2FuX3NpemUgPSBzaXplOworCW1tLT5zY2FubmVkX2Jsb2NrcyA9IDA7CisJbW0tPnNjYW5faGl0X3N0YXJ0ID0gMDsKKwltbS0+c2Nhbl9oaXRfc2l6ZSA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tbV9pbml0X3NjYW4pOworCisvKioKKyAqIEFkZCBhIG5vZGUgdG8gdGhlIHNjYW4gbGlzdCB0aGF0IG1pZ2h0IGJlIGZyZWVkIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBkZXNpcmVkCisgKiBob2xlLgorICoKKyAqIFJldHVybnMgbm9uLXplcm8sIGlmIGEgaG9sZSBoYXMgYmVlbiBmb3VuZCwgemVybyBvdGhlcndpc2UuCisgKi8KK2ludCBkcm1fbW1fc2Nhbl9hZGRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkcm1fbW0gKm1tID0gbm9kZS0+bW07CisJc3RydWN0IGxpc3RfaGVhZCAqcHJldl9mcmVlLCAqbmV4dF9mcmVlOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqcHJldl9ub2RlLCAqbmV4dF9ub2RlOworCisJbW0tPnNjYW5uZWRfYmxvY2tzKys7CisKKwlwcmV2X2ZyZWUgPSBuZXh0X2ZyZWUgPSBOVUxMOworCisJQlVHX09OKG5vZGUtPmZyZWUpOworCW5vZGUtPnNjYW5uZWRfYmxvY2sgPSAxOworCW5vZGUtPmZyZWUgPSAxOworCisJaWYgKG5vZGUtPm5vZGVfbGlzdC5wcmV2ICE9ICZtbS0+bm9kZV9saXN0KSB7CisJCXByZXZfbm9kZSA9IGxpc3RfZW50cnkobm9kZS0+bm9kZV9saXN0LnByZXYsIHN0cnVjdCBkcm1fbW1fbm9kZSwKKwkJCQkgICAgICAgbm9kZV9saXN0KTsKKworCQlpZiAocHJldl9ub2RlLT5mcmVlKSB7CisJCQlsaXN0X2RlbCgmcHJldl9ub2RlLT5ub2RlX2xpc3QpOworCisJCQlub2RlLT5zdGFydCA9IHByZXZfbm9kZS0+c3RhcnQ7CisJCQlub2RlLT5zaXplICs9IHByZXZfbm9kZS0+c2l6ZTsKKworCQkJcHJldl9ub2RlLT5zY2FubmVkX3ByZXZfZnJlZSA9IDE7CisKKwkJCXByZXZfZnJlZSA9ICZwcmV2X25vZGUtPmZyZWVfc3RhY2s7CisJCX0KKwl9CisKKwlpZiAobm9kZS0+bm9kZV9saXN0Lm5leHQgIT0gJm1tLT5ub2RlX2xpc3QpIHsKKwkJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShub2RlLT5ub2RlX2xpc3QubmV4dCwgc3RydWN0IGRybV9tbV9ub2RlLAorCQkJCSAgICAgICBub2RlX2xpc3QpOworCisJCWlmIChuZXh0X25vZGUtPmZyZWUpIHsKKwkJCWxpc3RfZGVsKCZuZXh0X25vZGUtPm5vZGVfbGlzdCk7CisKKwkJCW5vZGUtPnNpemUgKz0gbmV4dF9ub2RlLT5zaXplOworCisJCQluZXh0X25vZGUtPnNjYW5uZWRfbmV4dF9mcmVlID0gMTsKKworCQkJbmV4dF9mcmVlID0gJm5leHRfbm9kZS0+ZnJlZV9zdGFjazsKKwkJfQorCX0KKworCS8qIFRoZSBmcmVlX3N0YWNrIGxpc3QgaXMgbm90IHVzZWQgZm9yIGFsbG9jYXRlZCBvYmplY3RzLCBzbyB0aGVzZSB0d28KKwkgKiBwb2ludGVycyBjYW4gYmUgYWJ1c2VkIChhcyBsb25nIGFzIG5vIGFsbG9jYXRpb25zIGluIHRoaXMgbWVtb3J5CisJICogbWFuYWdlciBoYXBwZW5zKS4gKi8KKwlub2RlLT5mcmVlX3N0YWNrLnByZXYgPSBwcmV2X2ZyZWU7CisJbm9kZS0+ZnJlZV9zdGFjay5uZXh0ID0gbmV4dF9mcmVlOworCisJaWYgKGNoZWNrX2ZyZWVfbW1fbm9kZShub2RlLCBtbS0+c2Nhbl9zaXplLCBtbS0+c2Nhbl9hbGlnbm1lbnQpKSB7CisJCW1tLT5zY2FuX2hpdF9zdGFydCA9IG5vZGUtPnN0YXJ0OworCQltbS0+c2Nhbl9oaXRfc2l6ZSA9IG5vZGUtPnNpemU7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tbV9zY2FuX2FkZF9ibG9jayk7CisKKy8qKgorICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBzY2FuIGxpc3QuCisgKgorICogTm9kZXMgX211c3RfIGJlIHJlbW92ZWQgaW4gdGhlIGV4YWN0IHNhbWUgb3JkZXIgZnJvbSB0aGUgc2NhbiBsaXN0IGFzIHRoZXkKKyAqIGhhdmUgYmVlbiBhZGRlZCwgb3RoZXJ3aXNlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbWVtb3J5IG1hbmFnZXIgd2lsbCBiZQorICogY29ycnVwdGVkLgorICoKKyAqIFdoZW4gdGhlIHNjYW4gbGlzdCBpcyBlbXB0eSwgdGhlIHNlbGVjdGVkIG1lbW9yeSBub2RlcyBjYW4gYmUgZnJlZWQuIEFuCisgKiBpbW1lZGlhdGx5IGZvbGxvd2luZyBkcm1fbW1fc2VhcmNoX2ZyZWUgd2l0aCBiZXN0X21hdGNoID0gMCB3aWxsIHRoZW4gcmV0dXJuCisgKiB0aGUganVzdCBmcmVlZCBibG9jayAoYmVjYXVzZSBpdHMgYXQgdGhlIHRvcCBvZiB0aGUgZnJlZV9zdGFjayBsaXN0KS4KKyAqCisgKiBSZXR1cm5zIG9uZSBpZiB0aGlzIGJsb2NrIHNob3VsZCBiZSBldmljdGVkLCB6ZXJvIG90aGVyd2lzZS4gV2lsbCBhbHdheXMKKyAqIHJldHVybiB6ZXJvIHdoZW4gbm8gaG9sZSBoYXMgYmVlbiBmb3VuZC4KKyAqLworaW50IGRybV9tbV9zY2FuX3JlbW92ZV9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGRybV9tbSAqbW0gPSBub2RlLT5tbTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKnByZXZfbm9kZSwgKm5leHRfbm9kZTsKKworCW1tLT5zY2FubmVkX2Jsb2Nrcy0tOworCisJQlVHX09OKCFub2RlLT5zY2FubmVkX2Jsb2NrKTsKKwlub2RlLT5zY2FubmVkX2Jsb2NrID0gMDsKKwlub2RlLT5mcmVlID0gMDsKKworCXByZXZfbm9kZSA9IGxpc3RfZW50cnkobm9kZS0+ZnJlZV9zdGFjay5wcmV2LCBzdHJ1Y3QgZHJtX21tX25vZGUsCisJCQkgICAgICAgZnJlZV9zdGFjayk7CisJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShub2RlLT5mcmVlX3N0YWNrLm5leHQsIHN0cnVjdCBkcm1fbW1fbm9kZSwKKwkJCSAgICAgICBmcmVlX3N0YWNrKTsKKworCWlmIChwcmV2X25vZGUpIHsKKwkJQlVHX09OKCFwcmV2X25vZGUtPnNjYW5uZWRfcHJldl9mcmVlKTsKKwkJcHJldl9ub2RlLT5zY2FubmVkX3ByZXZfZnJlZSA9IDA7CisKKwkJbGlzdF9hZGRfdGFpbCgmcHJldl9ub2RlLT5ub2RlX2xpc3QsICZub2RlLT5ub2RlX2xpc3QpOworCisJCW5vZGUtPnN0YXJ0ID0gcHJldl9ub2RlLT5zdGFydCArIHByZXZfbm9kZS0+c2l6ZTsKKwkJbm9kZS0+c2l6ZSAtPSBwcmV2X25vZGUtPnNpemU7CisJfQorCisJaWYgKG5leHRfbm9kZSkgeworCQlCVUdfT04oIW5leHRfbm9kZS0+c2Nhbm5lZF9uZXh0X2ZyZWUpOworCQluZXh0X25vZGUtPnNjYW5uZWRfbmV4dF9mcmVlID0gMDsKKworCQlsaXN0X2FkZCgmbmV4dF9ub2RlLT5ub2RlX2xpc3QsICZub2RlLT5ub2RlX2xpc3QpOworCisJCW5vZGUtPnNpemUgLT0gbmV4dF9ub2RlLT5zaXplOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZub2RlLT5mcmVlX3N0YWNrKTsKKworCS8qIE9ubHkgbmVlZCB0byBjaGVjayBmb3IgY29udGFpbmVtZW50IGJlY2F1c2Ugc3RhcnQmc2l6ZSBmb3IgdGhlCisJICogY29tcGxldGUgcmVzdWx0aW5nIGZyZWUgYmxvY2sgKG5vdCBqdXN0IHRoZSBkZXNpcmVkIHBhcnQpIGlzCisJICogc3RvcmVkLiAqLworCWlmIChub2RlLT5zdGFydCA+PSBtbS0+c2Nhbl9oaXRfc3RhcnQgJiYKKwkgICAgbm9kZS0+c3RhcnQgKyBub2RlLT5zaXplCisJICAgIAkJPD0gbW0tPnNjYW5faGl0X3N0YXJ0ICsgbW0tPnNjYW5faGl0X3NpemUpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tbV9zY2FuX3JlbW92ZV9ibG9jayk7CisKIGludCBkcm1fbW1fY2xlYW4oc3RydWN0IGRybV9tbSAqIG1tKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbW0tPm1sX2VudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbW0tPm5vZGVfbGlzdDsKIAogCXJldHVybiAoaGVhZC0+bmV4dC0+bmV4dCA9PSBoZWFkKTsKIH0KQEAgLTQzMCwxMCArNTM0LDExIEBACiAKIGludCBkcm1fbW1faW5pdChzdHJ1Y3QgZHJtX21tICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlJTklUX0xJU1RfSEVBRCgmbW0tPm1sX2VudHJ5KTsKLQlJTklUX0xJU1RfSEVBRCgmbW0tPmZsX2VudHJ5KTsKKwlJTklUX0xJU1RfSEVBRCgmbW0tPm5vZGVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm1tLT5mcmVlX3N0YWNrKTsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPnVudXNlZF9ub2Rlcyk7CiAJbW0tPm51bV91bnVzZWQgPSAwOworCW1tLT5zY2FubmVkX2Jsb2NrcyA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJm1tLT51bnVzZWRfbG9jayk7CiAKIAlyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIHN0YXJ0LCBzaXplLCAwKTsKQEAgLTQ0MiwyNSArNTQ3LDI1IEBACiAKIHZvaWQgZHJtX21tX3Rha2Vkb3duKHN0cnVjdCBkcm1fbW0gKiBtbSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpibm9kZSA9IG1tLT5mbF9lbnRyeS5uZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKmJub2RlID0gbW0tPmZyZWVfc3RhY2submV4dDsKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqbmV4dDsKIAotCWVudHJ5ID0gbGlzdF9lbnRyeShibm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBmbF9lbnRyeSk7CisJZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZyZWVfc3RhY2spOwogCi0JaWYgKGVudHJ5LT5tbF9lbnRyeS5uZXh0ICE9ICZtbS0+bWxfZW50cnkgfHwKLQkgICAgZW50cnktPmZsX2VudHJ5Lm5leHQgIT0gJm1tLT5mbF9lbnRyeSkgeworCWlmIChlbnRyeS0+bm9kZV9saXN0Lm5leHQgIT0gJm1tLT5ub2RlX2xpc3QgfHwKKwkgICAgZW50cnktPmZyZWVfc3RhY2submV4dCAhPSAmbW0tPmZyZWVfc3RhY2spIHsKIAkJRFJNX0VSUk9SKCJNZW1vcnkgbWFuYWdlciBub3QgY2xlYW4uIERlbGF5aW5nIHRha2Vkb3duXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWxpc3RfZGVsKCZlbnRyeS0+ZmxfZW50cnkpOwotCWxpc3RfZGVsKCZlbnRyeS0+bWxfZW50cnkpOworCWxpc3RfZGVsKCZlbnRyeS0+ZnJlZV9zdGFjayk7CisJbGlzdF9kZWwoJmVudHJ5LT5ub2RlX2xpc3QpOwogCWtmcmVlKGVudHJ5KTsKIAogCXNwaW5fbG9jaygmbW0tPnVudXNlZF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZtbS0+dW51c2VkX25vZGVzLCBmbF9lbnRyeSkgewotCQlsaXN0X2RlbCgmZW50cnktPmZsX2VudHJ5KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZtbS0+dW51c2VkX25vZGVzLCBmcmVlX3N0YWNrKSB7CisJCWxpc3RfZGVsKCZlbnRyeS0+ZnJlZV9zdGFjayk7CiAJCWtmcmVlKGVudHJ5KTsKIAkJLS1tbS0+bnVtX3VudXNlZDsKIAl9CkBAIC00NzUsNyArNTgwLDcgQEAKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCWludCB0b3RhbF91c2VkID0gMCwgdG90YWxfZnJlZSA9IDAsIHRvdGFsID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZtbS0+bWxfZW50cnksIG1sX2VudHJ5KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJm1tLT5ub2RlX2xpc3QsIG5vZGVfbGlzdCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgMHglMDhseC0weCUwOGx4OiAlOGxkOiAlc1xuIiwKIAkJCXByZWZpeCwgZW50cnktPnN0YXJ0LCBlbnRyeS0+c3RhcnQgKyBlbnRyeS0+c2l6ZSwKIAkJCWVudHJ5LT5zaXplLCBlbnRyeS0+ZnJlZSA/ICJmcmVlIiA6ICJ1c2VkIik7CkBAIC00OTYsNyArNjAxLDcgQEAKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCWludCB0b3RhbF91c2VkID0gMCwgdG90YWxfZnJlZSA9IDAsIHRvdGFsID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZtbS0+bWxfZW50cnksIG1sX2VudHJ5KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJm1tLT5ub2RlX2xpc3QsIG5vZGVfbGlzdCkgewogCQlzZXFfcHJpbnRmKG0sICIweCUwOGx4LTB4JTA4bHg6IDB4JTA4bHg6ICVzXG4iLCBlbnRyeS0+c3RhcnQsIGVudHJ5LT5zdGFydCArIGVudHJ5LT5zaXplLCBlbnRyeS0+c2l6ZSwgZW50cnktPmZyZWUgPyAiZnJlZSIgOiAidXNlZCIpOwogCQl0b3RhbCArPSBlbnRyeS0+c2l6ZTsKIAkJaWYgKGVudHJ5LT5mcmVlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKaW5kZXggMmVhOWFkNC4uZTIwZjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCkBAIC0xMjQsNCArMTI0LDE0NyBAQAogCiBFWFBPUlRfU1lNQk9MKGRybV9wY2lfZnJlZSk7CiAKKyNpZmRlZiBDT05GSUdfUENJCisvKioKKyAqIFJlZ2lzdGVyLgorICoKKyAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0CisgKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCisgKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCisgKi8KK2ludCBkcm1fZ2V0X3BjaV9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCisJCSAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9nMTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZGV2LT5wZGV2ID0gcGRldjsKKwlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlkZXYtPnBjaV9kZXZpY2UgPSBwZGV2LT5kZXZpY2U7CisJZGV2LT5wY2lfdmVuZG9yID0gcGRldi0+dmVuZG9yOworCisjaWZkZWYgX19hbHBoYV9fCisJZGV2LT5ob3NlID0gcGRldi0+c3lzZGF0YTsKKyNlbmRpZgorCisJaWYgKChyZXQgPSBkcm1fZmlsbF9pbl9kZXYoZGV2LCBlbnQsIGRyaXZlcikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRFJNOiBGaWxsX2luX2RldiBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfZzI7CisJfQorCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJCXJldCA9IGRybV9nZXRfbWlub3IoZGV2LCAmZGV2LT5jb250cm9sLCBEUk1fTUlOT1JfQ09OVFJPTCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9nMjsKKwl9CisKKwlpZiAoKHJldCA9IGRybV9nZXRfbWlub3IoZGV2LCAmZGV2LT5wcmltYXJ5LCBEUk1fTUlOT1JfTEVHQUNZKSkpCisJCWdvdG8gZXJyX2czOworCisJaWYgKGRldi0+ZHJpdmVyLT5sb2FkKSB7CisJCXJldCA9IGRldi0+ZHJpdmVyLT5sb2FkKGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9nNDsKKwl9CisKKwkvKiBzZXR1cCB0aGUgZ3JvdXBpbmcgZm9yIHRoZSBsZWdhY3kgb3V0cHV0ICovCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJcmV0ID0gZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoZGV2LAorCQkJCQkJJmRldi0+cHJpbWFyeS0+bW9kZV9ncm91cCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9nNDsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRyaXZlcl9pdGVtLCAmZHJpdmVyLT5kZXZpY2VfbGlzdCk7CisKKwlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgZm9yICVzIG9uIG1pbm9yICVkXG4iLAorCQkgZHJpdmVyLT5uYW1lLCBkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yLCBkcml2ZXItPnBhdGNobGV2ZWwsCisJCSBkcml2ZXItPmRhdGUsIHBjaV9uYW1lKHBkZXYpLCBkZXYtPnByaW1hcnktPmluZGV4KTsKKworCXJldHVybiAwOworCitlcnJfZzQ6CisJZHJtX3B1dF9taW5vcigmZGV2LT5wcmltYXJ5KTsKK2Vycl9nMzoKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJZHJtX3B1dF9taW5vcigmZGV2LT5jb250cm9sKTsKK2Vycl9nMjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfZzE6CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3BjaV9kZXYpOworCisvKioKKyAqIFBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uIENhbGxlZCB2aWEgZHJtX2luaXQgYXQgbW9kdWxlIGxvYWQgdGltZSwKKyAqCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgorICoKKyAqIEluaXRpYWxpemVzIGEgZHJtX2RldmljZSBzdHJ1Y3R1cmVzLHJlZ2lzdGVyaW5nIHRoZQorICogc3R1YnMgYW5kIGluaXRpYWxpemluZyB0aGUgQUdQIGRldmljZS4KKyAqCisgKiBFeHBhbmRzIHRoZSBcYyBEUklWRVJfUFJFSU5JVCBhbmQgXGMgRFJJVkVSX1BPU1RfSU5JVCBtYWNyb3MgYmVmb3JlIGFuZAorICogYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIGZvciBkcml2ZXIgY3VzdG9taXphdGlvbi4KKyAqLworaW50IGRybV9wY2lfaW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGlkOworCWludCBpOworCisJaWYgKGRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX01PREVTRVQpCisJCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXItPnBjaV9kcml2ZXIpOworCisJLyogSWYgbm90IHVzaW5nIEtNUywgZmFsbCBiYWNrIHRvIHN0ZWFsdGggbW9kZSBtYW51YWwgc2Nhbm5pbmcuICovCisJZm9yIChpID0gMDsgZHJpdmVyLT5wY2lfZHJpdmVyLmlkX3RhYmxlW2ldLnZlbmRvciAhPSAwOyBpKyspIHsKKwkJcGlkID0gJmRyaXZlci0+cGNpX2RyaXZlci5pZF90YWJsZVtpXTsKKworCQkvKiBMb29wIGFyb3VuZCBzZXR0aW5nIHVwIGEgRFJNIGRldmljZSBmb3IgZWFjaCBQQ0kgZGV2aWNlCisJCSAqIG1hdGNoaW5nIG91ciBJRCBhbmQgZGV2aWNlIGNsYXNzLiAgSWYgd2UgaGFkIHRoZSBpbnRlcm5hbAorCQkgKiBmdW5jdGlvbiB0aGF0IHBjaV9nZXRfc3Vic3lzIGFuZCBwY2lfZ2V0X2NsYXNzIHVzZWQsIHdlJ2QKKwkJICogYmUgYWJsZSB0byBqdXN0IHBhc3MgcGlkIGluIGluc3RlYWQgb2YgZG9pbmcgYSB0d28tc3RhZ2UKKwkJICogdGhpbmcuCisJCSAqLworCQlwZGV2ID0gTlVMTDsKKwkJd2hpbGUgKChwZGV2ID0KKwkJCXBjaV9nZXRfc3Vic3lzKHBpZC0+dmVuZG9yLCBwaWQtPmRldmljZSwgcGlkLT5zdWJ2ZW5kb3IsCisJCQkJICAgICAgIHBpZC0+c3ViZGV2aWNlLCBwZGV2KSkgIT0gTlVMTCkgeworCQkJaWYgKChwZGV2LT5jbGFzcyAmIHBpZC0+Y2xhc3NfbWFzaykgIT0gcGlkLT5jbGFzcykKKwkJCQljb250aW51ZTsKKworCQkJLyogc3RlYWx0aCBtb2RlIHJlcXVpcmVzIGEgbWFudWFsIHByb2JlICovCisJCQlwY2lfZGV2X2dldChwZGV2KTsKKwkJCWRybV9nZXRfcGNpX2RldihwZGV2LCBwaWQsIGRyaXZlcik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK2ludCBkcm1fcGNpX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKyNlbmRpZgogLypAfSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwZTlhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIERlcml2ZWQgZnJvbSBkcm1fcGNpLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBKb3PDqSBGb25zZWNhLgorICogQ29weXJpZ2h0IDIwMDMgTGVpZiBEZWxnYXNzLgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBDb2RlIEF1cm9yYSBGb3J1bS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworLyoqCisgKiBSZWdpc3Rlci4KKyAqCisgKiBccGFyYW0gcGxhdGRldiAtIFBsYXRmb3JtIGRldmljZSBzdHJ1dHVyZQorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBBdHRlbXB0IHRvIGdldHMgaW50ZXIgbW9kdWxlICJkcm0iIGluZm9ybWF0aW9uLiBJZiB3ZSBhcmUgZmlyc3QKKyAqIHRoZW4gcmVnaXN0ZXIgdGhlIGNoYXJhY3RlciBkZXZpY2UgYW5kIGludGVyIG1vZHVsZSBpbmZvcm1hdGlvbi4KKyAqIFRyeSBhbmQgcmVnaXN0ZXIsIGlmIHdlIGZhaWwgdG8gcmVnaXN0ZXIsIGJhY2tvdXQgcHJldmlvdXMgd29yay4KKyAqLworCitpbnQgZHJtX2dldF9wbGF0Zm9ybV9kZXYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGRldiwKKwkJCSBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPnBsYXRmb3JtZGV2ID0gcGxhdGRldjsKKwlkZXYtPmRldiA9ICZwbGF0ZGV2LT5kZXY7CisKKwlyZXQgPSBkcm1fZmlsbF9pbl9kZXYoZGV2LCBOVUxMLCBkcml2ZXIpOworCisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkRSTTogRmlsbF9pbl9kZXYgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2cxOworCX0KKworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCWRldl9zZXRfZHJ2ZGF0YSgmcGxhdGRldi0+ZGV2LCBkZXYpOworCQlyZXQgPSBkcm1fZ2V0X21pbm9yKGRldiwgJmRldi0+Y29udHJvbCwgRFJNX01JTk9SX0NPTlRST0wpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZzE7CisJfQorCisJcmV0ID0gZHJtX2dldF9taW5vcihkZXYsICZkZXYtPnByaW1hcnksIERSTV9NSU5PUl9MRUdBQ1kpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2cyOworCisJaWYgKGRldi0+ZHJpdmVyLT5sb2FkKSB7CisJCXJldCA9IGRldi0+ZHJpdmVyLT5sb2FkKGRldiwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9nMzsKKwl9CisKKwkvKiBzZXR1cCB0aGUgZ3JvdXBpbmcgZm9yIHRoZSBsZWdhY3kgb3V0cHV0ICovCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJcmV0ID0gZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoZGV2LAorCQkJCSZkZXYtPnByaW1hcnktPm1vZGVfZ3JvdXApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZzM7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmZGV2LT5kcml2ZXJfaXRlbSwgJmRyaXZlci0+ZGV2aWNlX2xpc3QpOworCisJRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkXG4iLAorCQkgZHJpdmVyLT5uYW1lLCBkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yLCBkcml2ZXItPnBhdGNobGV2ZWwsCisJCSBkcml2ZXItPmRhdGUsIGRldi0+cHJpbWFyeS0+aW5kZXgpOworCisJcmV0dXJuIDA7CisKK2Vycl9nMzoKKwlkcm1fcHV0X21pbm9yKCZkZXYtPnByaW1hcnkpOworZXJyX2cyOgorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlkcm1fcHV0X21pbm9yKCZkZXYtPmNvbnRyb2wpOworZXJyX2cxOgorCWtmcmVlKGRldik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dldF9wbGF0Zm9ybV9kZXYpOworCisvKioKKyAqIFBsYXRmb3JtIGRldmljZSBpbml0aWFsaXphdGlvbi4gQ2FsbGVkIHZpYSBkcm1faW5pdCBhdCBtb2R1bGUgbG9hZCB0aW1lLAorICoKKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogSW5pdGlhbGl6ZXMgYSBkcm1fZGV2aWNlIHN0cnVjdHVyZXMscmVnaXN0ZXJpbmcgdGhlCisgKiBzdHVicworICoKKyAqIEV4cGFuZHMgdGhlIFxjIERSSVZFUl9QUkVJTklUIGFuZCBcYyBEUklWRVJfUE9TVF9JTklUIG1hY3JvcyBiZWZvcmUgYW5kCisgKiBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gZm9yIGRyaXZlciBjdXN0b21pemF0aW9uLgorICovCisKK2ludCBkcm1fcGxhdGZvcm1faW5pdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQoreworCXJldHVybiBkcm1fZ2V0X3BsYXRmb3JtX2Rldihkcml2ZXItPnBsYXRmb3JtX2RldmljZSwgZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKaW5kZXggYTBjMzY1Zi4uZDFhZDU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMKQEAgLTE1Niw2ICsxNTYsOSBAQAogCQltYXN0ZXItPnVuaXF1ZV9sZW4gPSAwOwogCX0KIAorCWtmcmVlKGRldi0+ZGV2bmFtZSk7CisJZGV2LT5kZXZuYW1lID0gTlVMTDsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgbmV4dCwgJm1hc3Rlci0+bWFnaWNmcmVlLCBoZWFkKSB7CiAJCWxpc3RfZGVsKCZwdC0+aGVhZCk7CiAJCWRybV9odF9yZW1vdmVfaXRlbSgmbWFzdGVyLT5tYWdpY2xpc3QsICZwdC0+aGFzaF9pdGVtKTsKQEAgLTIyNCw3ICsyMjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRybV9maWxsX2luX2RldihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCitpbnQgZHJtX2ZpbGxfaW5fZGV2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQkJICAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKIHsKQEAgLTI0NSwxNCArMjQ4LDYgQEAKIAogCWlkcl9pbml0KCZkZXYtPmRyd19pZHIpOwogCi0JZGV2LT5wZGV2ID0gcGRldjsKLQlkZXYtPnBjaV9kZXZpY2UgPSBwZGV2LT5kZXZpY2U7Ci0JZGV2LT5wY2lfdmVuZG9yID0gcGRldi0+dmVuZG9yOwotCi0jaWZkZWYgX19hbHBoYV9fCi0JZGV2LT5ob3NlID0gcGRldi0+c3lzZGF0YTsKLSNlbmRpZgotCiAJaWYgKGRybV9odF9jcmVhdGUoJmRldi0+bWFwX2hhc2gsIDEyKSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zMjEsNyArMzE2LDcgQEAKICAqIGNyZWF0ZSB0aGUgcHJvYyBpbml0IGVudHJ5IHZpYSBwcm9jX2luaXQoKS4gVGhpcyByb3V0aW5lcyBhc3NpZ25zCiAgKiBtaW5vciBudW1iZXJzIHRvIHNlY29uZGFyeSBoZWFkcyBvZiBtdWx0aS1oZWFkZWQgY2FyZHMKICAqLwotc3RhdGljIGludCBkcm1fZ2V0X21pbm9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWlub3IgKiptaW5vciwgaW50IHR5cGUpCitpbnQgZHJtX2dldF9taW5vcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21pbm9yICoqbWlub3IsIGludCB0eXBlKQogewogCXN0cnVjdCBkcm1fbWlub3IgKm5ld19taW5vcjsKIAlpbnQgcmV0OwpAQCAtMzg4LDgzICszODMsNiBAQAogfQogCiAvKioKLSAqIFJlZ2lzdGVyLgotICoKLSAqIFxwYXJhbSBwZGV2IC0gUENJIGRldmljZSBzdHJ1Y3R1cmUKLSAqIFxwYXJhbSBlbnQgZW50cnkgZnJvbSB0aGUgUENJIElEIHRhYmxlIHdpdGggZGV2aWNlIHR5cGUgZmxhZ3MKLSAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCi0gKgotICogQXR0ZW1wdCB0byBnZXRzIGludGVyIG1vZHVsZSAiZHJtIiBpbmZvcm1hdGlvbi4gSWYgd2UgYXJlIGZpcnN0Ci0gKiB0aGVuIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBpbnRlciBtb2R1bGUgaW5mb3JtYXRpb24uCi0gKiBUcnkgYW5kIHJlZ2lzdGVyLCBpZiB3ZSBmYWlsIHRvIHJlZ2lzdGVyLCBiYWNrb3V0IHByZXZpb3VzIHdvcmsuCi0gKi8KLWludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKLQkJc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwotCWludCByZXQ7Ci0KLQlEUk1fREVCVUcoIlxuIik7Ci0KLQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfZzE7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQlpZiAoKHJldCA9IGRybV9maWxsX2luX2RldihkZXYsIHBkZXYsIGVudCwgZHJpdmVyKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJEUk06IEZpbGxfaW5fZGV2IGZhaWxlZC5cbiIpOwotCQlnb3RvIGVycl9nMjsKLQl9Ci0KLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewotCQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQkJcmV0ID0gZHJtX2dldF9taW5vcihkZXYsICZkZXYtPmNvbnRyb2wsIERSTV9NSU5PUl9DT05UUk9MKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX2cyOwotCX0KLQotCWlmICgocmV0ID0gZHJtX2dldF9taW5vcihkZXYsICZkZXYtPnByaW1hcnksIERSTV9NSU5PUl9MRUdBQ1kpKSkKLQkJZ290byBlcnJfZzM7Ci0KLQlpZiAoZGV2LT5kcml2ZXItPmxvYWQpIHsKLQkJcmV0ID0gZGV2LT5kcml2ZXItPmxvYWQoZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX2c0OwotCX0KLQotICAgICAgICAvKiBzZXR1cCB0aGUgZ3JvdXBpbmcgZm9yIHRoZSBsZWdhY3kgb3V0cHV0ICovCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJcmV0ID0gZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoZGV2LCAmZGV2LT5wcmltYXJ5LT5tb2RlX2dyb3VwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX2c0OwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJmRldi0+ZHJpdmVyX2l0ZW0sICZkcml2ZXItPmRldmljZV9saXN0KTsKLQotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBmb3IgJXMgb24gbWlub3IgJWRcbiIsCi0JCSBkcml2ZXItPm5hbWUsIGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3IsIGRyaXZlci0+cGF0Y2hsZXZlbCwKLQkJIGRyaXZlci0+ZGF0ZSwgcGNpX25hbWUocGRldiksIGRldi0+cHJpbWFyeS0+aW5kZXgpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9nNDoKLQlkcm1fcHV0X21pbm9yKCZkZXYtPnByaW1hcnkpOwotZXJyX2czOgotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQotCQlkcm1fcHV0X21pbm9yKCZkZXYtPmNvbnRyb2wpOwotZXJyX2cyOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLWVycl9nMToKLQlrZnJlZShkZXYpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9nZXRfZGV2KTsKLQotLyoqCiAgKiBQdXQgYSBzZWNvbmRhcnkgbWlub3IgbnVtYmVyLgogICoKICAqIFxwYXJhbSBzZWNfbWlub3IgLSBzdHJ1Y3R1cmUgdG8gYmUgcmVsZWFzZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwppbmRleCAxMDFkMzgxLi44NjExOGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCkBAIC00ODksNyArNDg5LDggQEAKIAlpbnQgZXJyOwogCWNoYXIgKm1pbm9yX3N0cjsKIAotCW1pbm9yLT5rZGV2LnBhcmVudCA9ICZtaW5vci0+ZGV2LT5wZGV2LT5kZXY7CisJbWlub3ItPmtkZXYucGFyZW50ID0gbWlub3ItPmRldi0+ZGV2OworCiAJbWlub3ItPmtkZXYuY2xhc3MgPSBkcm1fY2xhc3M7CiAJbWlub3ItPmtkZXYucmVsZWFzZSA9IGRybV9zeXNmc19kZXZpY2VfcmVsZWFzZTsKIAltaW5vci0+a2Rldi5kZXZ0ID0gbWlub3ItPmRldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2VhOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV90cmFjZS5oCkBAIC0wLDAgKzEsNjYgQEAKKyNpZiAhZGVmaW5lZChfRFJNX1RSQUNFX0hfKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfRFJNX1RSQUNFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gZHJtCisjZGVmaW5lIFRSQUNFX1NZU1RFTV9TVFJJTkcgX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKQorI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgZHJtX3RyYWNlCisKK1RSQUNFX0VWRU5UKGRybV92YmxhbmtfZXZlbnQsCisJICAgIFRQX1BST1RPKGludCBjcnRjLCB1bnNpZ25lZCBpbnQgc2VxKSwKKwkgICAgVFBfQVJHUyhjcnRjLCBzZXEpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChpbnQsIGNydGMpCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGludCwgc2VxKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jcnRjID0gY3J0YzsKKwkJICAgIF9fZW50cnktPnNlcSA9IHNlcTsKKwkJICAgICksCisJICAgIFRQX3ByaW50aygiY3J0Yz0lZCwgc2VxPSVkIiwgX19lbnRyeS0+Y3J0YywgX19lbnRyeS0+c2VxKQorKTsKKworVFJBQ0VfRVZFTlQoZHJtX3ZibGFua19ldmVudF9xdWV1ZWQsCisJICAgIFRQX1BST1RPKHBpZF90IHBpZCwgaW50IGNydGMsIHVuc2lnbmVkIGludCBzZXEpLAorCSAgICBUUF9BUkdTKHBpZCwgY3J0Yywgc2VxKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQocGlkX3QsIHBpZCkKKwkJICAgIF9fZmllbGQoaW50LCBjcnRjKQorCQkgICAgX19maWVsZCh1bnNpZ25lZCBpbnQsIHNlcSkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+cGlkID0gcGlkOworCQkgICAgX19lbnRyeS0+Y3J0YyA9IGNydGM7CisJCSAgICBfX2VudHJ5LT5zZXEgPSBzZXE7CisJCSAgICApLAorCSAgICBUUF9wcmludGsoInBpZD0lZCwgY3J0Yz0lZCwgc2VxPSVkIiwgX19lbnRyeS0+cGlkLCBfX2VudHJ5LT5jcnRjLCBcCisJCSAgICAgIF9fZW50cnktPnNlcSkKKyk7CisKK1RSQUNFX0VWRU5UKGRybV92YmxhbmtfZXZlbnRfZGVsaXZlcmVkLAorCSAgICBUUF9QUk9UTyhwaWRfdCBwaWQsIGludCBjcnRjLCB1bnNpZ25lZCBpbnQgc2VxKSwKKwkgICAgVFBfQVJHUyhwaWQsIGNydGMsIHNlcSksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHBpZF90LCBwaWQpCisJCSAgICBfX2ZpZWxkKGludCwgY3J0YykKKwkJICAgIF9fZmllbGQodW5zaWduZWQgaW50LCBzZXEpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPnBpZCA9IHBpZDsKKwkJICAgIF9fZW50cnktPmNydGMgPSBjcnRjOworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgKSwKKwkgICAgVFBfcHJpbnRrKCJwaWQ9JWQsIGNydGM9JWQsIHNlcT0lZCIsIF9fZW50cnktPnBpZCwgX19lbnRyeS0+Y3J0YywgXAorCQkgICAgICBfX2VudHJ5LT5zZXEpCispOworCisjZW5kaWYgLyogX0RSTV9UUkFDRV9IXyAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdHJhY2VfcG9pbnRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3RyYWNlX3BvaW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMGViOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3RyYWNlX3BvaW50cy5jCkBAIC0wLDAgKzEsNCBAQAorI2luY2x1ZGUgImRybVAuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAiZHJtX3RyYWNlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKaW5kZXggYzNiMTNmYi4uMzc3ODM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV92bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwpAQCAtNjEsNyArNjEsNyBAQAogCQl0bXAgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHRtcCk7CiAJZWxzZQogCQl0bXAgPSBwZ3Byb3Rfbm9uY2FjaGVkKHRtcCk7Ci0jZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fYXJtX18pCiAJdG1wID0gcGdwcm90X25vbmNhY2hlZCh0bXApOwogI2VuZGlmCiAJcmV0dXJuIHRtcDsKQEAgLTYwMSw2ICs2MDEsNyBAQAogCX0KIAogCXN3aXRjaCAobWFwLT50eXBlKSB7CisjaWYgIWRlZmluZWQoX19hcm1fXykKIAljYXNlIF9EUk1fQUdQOgogCQlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwLT5jYW50X3VzZV9hcGVydHVyZSkgewogCQkJLyoKQEAgLTYxNSwyMCArNjE2LDMxIEBACiAJCQlicmVhazsKIAkJfQogCQkvKiBmYWxsIHRocm91Z2ggdG8gX0RSTV9GUkFNRV9CVUZGRVIuLi4gKi8KKyNlbmRpZgogCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6CiAJY2FzZSBfRFJNX1JFR0lTVEVSUzoKIAkJb2Zmc2V0ID0gZGV2LT5kcml2ZXItPmdldF9yZWdfb2ZzKGRldik7CiAJCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CS8qIG5vdCBpbiBjb3JlIGR1bXAgKi8KIAkJdm1hLT52bV9wYWdlX3Byb3QgPSBkcm1faW9fcHJvdChtYXAtPnR5cGUsIHZtYSk7CisjaWYgIWRlZmluZWQoX19hcm1fXykKIAkJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCiAJCQkJICAgICAgIChtYXAtPm9mZnNldCArIG9mZnNldCkgPj4gUEFHRV9TSElGVCwKIAkJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAogCQkJCSAgICAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKKyNlbHNlCisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCQkobWFwLT5vZmZzZXQgKyBvZmZzZXQpID4+IFBBR0VfU0hJRlQsCisJCQkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCQkJdm1hLT52bV9wYWdlX3Byb3QpKQorCQkJcmV0dXJuIC1FQUdBSU47CisjZW5kaWYKKwogCQlEUk1fREVCVUcoIiAgIFR5cGUgPSAlZDsgc3RhcnQgPSAweCVseCwgZW5kID0gMHglbHgsIgogCQkJICAiIG9mZnNldCA9IDB4JWxseFxuIiwKIAkJCSAgbWFwLT50eXBlLAogCQkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgKHVuc2lnbmVkIGxvbmcgbG9uZykobWFwLT5vZmZzZXQgKyBvZmZzZXQpKTsKKwogCQl2bWEtPnZtX29wcyA9ICZkcm1fdm1fb3BzOwogCQlicmVhazsKIAljYXNlIF9EUk1fQ09OU0lTVEVOVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL01ha2VmaWxlCmluZGV4IDZkMmFiYWYuLjkyODYyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9NYWtlZmlsZQpAQCAtMiwzICsyLDYgQEAKIAogY2g3MDA2LXkgOj0gY2g3MDA2X2Rydi5vIGNoNzAwNl9tb2RlLm8KIG9iai0kKENPTkZJR19EUk1fSTJDX0NINzAwNikgKz0gY2g3MDA2Lm8KKworc2lsMTY0LXkgOj0gc2lsMTY0X2Rydi5vCitvYmotJChDT05GSUdfRFJNX0kyQ19TSUwxNjQpICs9IHNpbDE2NC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jCmluZGV4IDgxNjgxYTAuLjgzM2IzNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jCkBAIC0zMyw3ICszMyw3IEBACiB7CiAJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CiAKLQlwcml2LT5wYXJhbXMgPSBwYXJhbXM7CisJcHJpdi0+cGFyYW1zID0gKihzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zICopcGFyYW1zOwogfQogCiBzdGF0aWMgdm9pZCBjaDcwMDZfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTExNCw3ICsxMTQsNyBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkcm1faTJjX2VuY29kZXJfZ2V0X2NsaWVudChlbmNvZGVyKTsKIAlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKLQlzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zICpwYXJhbXMgPSBwcml2LT5wYXJhbXM7CisJc3RydWN0IGNoNzAwNl9lbmNvZGVyX3BhcmFtcyAqcGFyYW1zID0gJnByaXYtPnBhcmFtczsKIAlzdHJ1Y3QgY2g3MDA2X3N0YXRlICpzdGF0ZSA9ICZwcml2LT5zdGF0ZTsKIAl1aW50OF90ICpyZWdzID0gc3RhdGUtPnJlZ3M7CiAJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlID0gcHJpdi0+bW9kZTsKQEAgLTQyOCw2ICs0MjgsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjaDcwMDZfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwljaDcwMDZfZGJnKGNsaWVudCwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaDcwMDZfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJY2g3MDA2X3dyaXRlKGNsaWVudCwgMHgzZCwgMHgwKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNoNzAwNl9lbmNvZGVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkcm1fZW5jb2Rlcl9zbGF2ZSAqZW5jb2RlcikKQEAgLTQ4Nyw2ICs1MDMsOCBAQAogCS5pMmNfZHJpdmVyID0gewogCQkucHJvYmUgPSBjaDcwMDZfcHJvYmUsCiAJCS5yZW1vdmUgPSBjaDcwMDZfcmVtb3ZlLAorCQkuc3VzcGVuZCA9IGNoNzAwNl9zdXNwZW5kLAorCQkucmVzdW1lID0gY2g3MDA2X3Jlc3VtZSwKIAogCQkuZHJpdmVyID0gewogCQkJLm5hbWUgPSAiY2g3MDA2IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X3ByaXYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X3ByaXYuaAppbmRleCBiMDZkM2Q5Li4xYzZkMmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9wcml2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfcHJpdi5oCkBAIC03Nyw3ICs3Nyw3IEBACiB9OwogCiBzdHJ1Y3QgY2g3MDA2X3ByaXYgewotCXN0cnVjdCBjaDcwMDZfZW5jb2Rlcl9wYXJhbXMgKnBhcmFtczsKKwlzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zIHBhcmFtczsKIAlzdHJ1Y3QgY2g3MDA2X21vZGUgKm1vZGU7CiAKIAlzdHJ1Y3QgY2g3MDA2X3N0YXRlIHN0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2kyYy9zaWwxNjRfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL3NpbDE2NF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjY3NzMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9zaWwxNjRfZHJ2LmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJkcm1fZW5jb2Rlcl9zbGF2ZS5oIgorI2luY2x1ZGUgImkyYy9zaWwxNjQuaCIKKworc3RydWN0IHNpbDE2NF9wcml2IHsKKwlzdHJ1Y3Qgc2lsMTY0X2VuY29kZXJfcGFyYW1zIGNvbmZpZzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqZHVhbGxpbmtfc2xhdmU7CisKKwl1aW50OF90IHNhdmVkX3N0YXRlWzB4MTBdOworCXVpbnQ4X3Qgc2F2ZWRfc2xhdmVfc3RhdGVbMHgxMF07Cit9OworCisjZGVmaW5lIHRvX3NpbDE2NF9wcml2KHgpIFwKKwkoKHN0cnVjdCBzaWwxNjRfcHJpdiAqKXRvX2VuY29kZXJfc2xhdmUoeCktPnNsYXZlX3ByaXYpCisKKyNkZWZpbmUgc2lsMTY0X2RiZyhjbGllbnQsIGZvcm1hdCwgLi4uKSBkbyB7CQkJCVwKKwkJaWYgKGRybV9kZWJ1ZyAmIERSTV9VVF9LTVMpCQkJCVwKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmNsaWVudC0+ZGV2LAkJXAorCQkJCSAgICIlczogIiBmb3JtYXQsIF9fZnVuY19fLCAjIyBfX1ZBX0FSR1NfXyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBzaWwxNjRfaW5mbyhjbGllbnQsIGZvcm1hdCwgLi4uKQkJXAorCWRldl9pbmZvKCZjbGllbnQtPmRldiwgZm9ybWF0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgc2lsMTY0X2VycihjbGllbnQsIGZvcm1hdCwgLi4uKQkJCVwKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgZm9ybWF0LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTSUwxNjRfSTJDX0FERFJfTUFTVEVSCQkJMHgzOAorI2RlZmluZSBTSUwxNjRfSTJDX0FERFJfU0xBVkUJCQkweDM5CisKKy8qIEhXIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgU0lMMTY0X1ZFTkRPUl9MTwkJCTB4MAorI2RlZmluZSBTSUwxNjRfVkVORE9SX0hJCQkJMHgxCisjZGVmaW5lIFNJTDE2NF9ERVZJQ0VfTE8JCQkweDIKKyNkZWZpbmUgU0lMMTY0X0RFVklDRV9ISQkJCTB4MworI2RlZmluZSBTSUwxNjRfUkVWSVNJT04JCQkJMHg0CisjZGVmaW5lIFNJTDE2NF9GUkVRX01JTgkJCQkweDYKKyNkZWZpbmUgU0lMMTY0X0ZSRVFfTUFYCQkJCTB4NworI2RlZmluZSBTSUwxNjRfQ09OVFJPTDAJCQkJMHg4CisjICBkZWZpbmUgU0lMMTY0X0NPTlRST0wwX1BPV0VSX09OCQkweDAxCisjICBkZWZpbmUgU0lMMTY0X0NPTlRST0wwX0VER0VfUklTSU5HCQkweDAyCisjICBkZWZpbmUgU0lMMTY0X0NPTlRST0wwX0lOUFVUXzI0QklUCQkweDA0CisjICBkZWZpbmUgU0lMMTY0X0NPTlRST0wwX0RVQUxfRURHRQkJMHgwOAorIyAgZGVmaW5lIFNJTDE2NF9DT05UUk9MMF9IU1lOQ19PTgkJMHgxMAorIyAgZGVmaW5lIFNJTDE2NF9DT05UUk9MMF9WU1lOQ19PTgkJMHgyMAorI2RlZmluZSBTSUwxNjRfREVURUNUCQkJCTB4OQorIyAgZGVmaW5lIFNJTDE2NF9ERVRFQ1RfSU5UUl9TVEFUCQkweDAxCisjICBkZWZpbmUgU0lMMTY0X0RFVEVDVF9IT1RQTFVHX1NUQVQJCTB4MDIKKyMgIGRlZmluZSBTSUwxNjRfREVURUNUX1JFQ0VJVkVSX1NUQVQJCTB4MDQKKyMgIGRlZmluZSBTSUwxNjRfREVURUNUX0lOVFJfTU9ERV9SRUNFSVZFUgkweDAwCisjICBkZWZpbmUgU0lMMTY0X0RFVEVDVF9JTlRSX01PREVfSE9UUExVRwkweDA4CisjICBkZWZpbmUgU0lMMTY0X0RFVEVDVF9PVVRfTU9ERV9ISUdICQkweDAwCisjICBkZWZpbmUgU0lMMTY0X0RFVEVDVF9PVVRfTU9ERV9JTlRSCQkweDEwCisjICBkZWZpbmUgU0lMMTY0X0RFVEVDVF9PVVRfTU9ERV9SRUNFSVZFUgkweDIwCisjICBkZWZpbmUgU0lMMTY0X0RFVEVDVF9PVVRfTU9ERV9IT1RQTFVHCTB4MzAKKyMgIGRlZmluZSBTSUwxNjRfREVURUNUX1ZTV0lOR19TVEFUCQkweDgwCisjZGVmaW5lIFNJTDE2NF9DT05UUk9MMQkJCQkweGEKKyMgIGRlZmluZSBTSUwxNjRfQ09OVFJPTDFfREVTS0VXX0VOQUJMRQkJMHgxMAorIyAgZGVmaW5lIFNJTDE2NF9DT05UUk9MMV9ERVNLRVdfSU5DUl9TSElGVAk1CisjZGVmaW5lIFNJTDE2NF9HUElPCQkJCTB4YgorI2RlZmluZSBTSUwxNjRfQ09OVFJPTDIJCQkJMHhjCisjICBkZWZpbmUgU0lMMTY0X0NPTlRST0wyX0ZJTFRFUl9FTkFCTEUJCTB4MDEKKyMgIGRlZmluZSBTSUwxNjRfQ09OVFJPTDJfRklMVEVSX1NFVFRJTkdfU0hJRlQJMQorIyAgZGVmaW5lIFNJTDE2NF9DT05UUk9MMl9EVUFMTElOS19NQVNURVIJMHg0MAorIyAgZGVmaW5lIFNJTDE2NF9DT05UUk9MMl9TWU5DX0NPTlQJCTB4ODAKKyNkZWZpbmUgU0lMMTY0X0RVQUxMSU5LCQkJCTB4ZAorIyAgZGVmaW5lIFNJTDE2NF9EVUFMTElOS19FTkFCTEUJCTB4MTAKKyMgIGRlZmluZSBTSUwxNjRfRFVBTExJTktfU0tFV19TSElGVAkJNQorI2RlZmluZSBTSUwxNjRfUExMWk9ORQkJCQkweGUKKyMgIGRlZmluZSBTSUwxNjRfUExMWk9ORV9TVEFUCQkJMHgwOAorIyAgZGVmaW5lIFNJTDE2NF9QTExaT05FX0ZPUkNFX09OCQkweDEwCisjICBkZWZpbmUgU0lMMTY0X1BMTFpPTkVfRk9SQ0VfSElHSAkJMHgyMAorCisvKiBIVyBhY2Nlc3MgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkCitzaWwxNjRfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdWludDhfdCBhZGRyLCB1aW50OF90IHZhbCkKK3sKKwl1aW50OF90IGJ1ZltdID0ge2FkZHIsIHZhbH07CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgQVJSQVlfU0laRShidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJc2lsMTY0X2VycihjbGllbnQsICJFcnJvciAlZCB3cml0aW5nIHRvIHN1YmFkZHJlc3MgMHgleFxuIiwKKwkJCSAgIHJldCwgYWRkcik7Cit9CisKK3N0YXRpYyB1aW50OF90CitzaWwxNjRfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1aW50OF90IGFkZHIpCit7CisJdWludDhfdCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCAmdmFsLCBzaXplb2YodmFsKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldHVybiB2YWw7CisKK2ZhaWw6CisJc2lsMTY0X2VycihjbGllbnQsICJFcnJvciAlZCByZWFkaW5nIGZyb20gc3ViYWRkcmVzcyAweCV4XG4iLAorCQkgICByZXQsIGFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2lsMTY0X3NhdmVfc3RhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdWludDhfdCAqc3RhdGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAweDg7IGkgPD0gMHhlOyBpKyspCisJCXN0YXRlW2ldID0gc2lsMTY0X3JlYWQoY2xpZW50LCBpKTsKK30KKworc3RhdGljIHZvaWQKK3NpbDE2NF9yZXN0b3JlX3N0YXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVpbnQ4X3QgKnN0YXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMHg4OyBpIDw9IDB4ZTsgaSsrKQorCQlzaWwxNjRfd3JpdGUoY2xpZW50LCBpLCBzdGF0ZVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkCitzaWwxNjRfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGJvb2wgb24pCit7CisJdWludDhfdCBjb250cm9sMCA9IHNpbDE2NF9yZWFkKGNsaWVudCwgU0lMMTY0X0NPTlRST0wwKTsKKworCWlmIChvbikKKwkJY29udHJvbDAgfD0gU0lMMTY0X0NPTlRST0wwX1BPV0VSX09OOworCWVsc2UKKwkJY29udHJvbDAgJj0gflNJTDE2NF9DT05UUk9MMF9QT1dFUl9PTjsKKworCXNpbDE2NF93cml0ZShjbGllbnQsIFNJTDE2NF9DT05UUk9MMCwgY29udHJvbDApOworfQorCitzdGF0aWMgdm9pZAorc2lsMTY0X2luaXRfc3RhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICBzdHJ1Y3Qgc2lsMTY0X2VuY29kZXJfcGFyYW1zICpjb25maWcsCisJCSAgYm9vbCBkdWFsbGluaykKK3sKKwlzaWwxNjRfd3JpdGUoY2xpZW50LCBTSUwxNjRfQ09OVFJPTDAsCisJCSAgICAgU0lMMTY0X0NPTlRST0wwX0hTWU5DX09OIHwKKwkJICAgICBTSUwxNjRfQ09OVFJPTDBfVlNZTkNfT04gfAorCQkgICAgIChjb25maWctPmlucHV0X2VkZ2UgPyBTSUwxNjRfQ09OVFJPTDBfRURHRV9SSVNJTkcgOiAwKSB8CisJCSAgICAgKGNvbmZpZy0+aW5wdXRfd2lkdGggPyBTSUwxNjRfQ09OVFJPTDBfSU5QVVRfMjRCSVQgOiAwKSB8CisJCSAgICAgKGNvbmZpZy0+aW5wdXRfZHVhbCA/IFNJTDE2NF9DT05UUk9MMF9EVUFMX0VER0UgOiAwKSk7CisKKwlzaWwxNjRfd3JpdGUoY2xpZW50LCBTSUwxNjRfREVURUNULAorCQkgICAgIFNJTDE2NF9ERVRFQ1RfSU5UUl9TVEFUIHwKKwkJICAgICBTSUwxNjRfREVURUNUX09VVF9NT0RFX1JFQ0VJVkVSKTsKKworCXNpbDE2NF93cml0ZShjbGllbnQsIFNJTDE2NF9DT05UUk9MMSwKKwkJICAgICAoY29uZmlnLT5pbnB1dF9za2V3ID8gU0lMMTY0X0NPTlRST0wxX0RFU0tFV19FTkFCTEUgOiAwKSB8CisJCSAgICAgKCgoY29uZmlnLT5pbnB1dF9za2V3ICsgNCkgJiAweDcpCisJCSAgICAgIDw8IFNJTDE2NF9DT05UUk9MMV9ERVNLRVdfSU5DUl9TSElGVCkpOworCisJc2lsMTY0X3dyaXRlKGNsaWVudCwgU0lMMTY0X0NPTlRST0wyLAorCQkgICAgIFNJTDE2NF9DT05UUk9MMl9TWU5DX0NPTlQgfAorCQkgICAgIChjb25maWctPnBsbF9maWx0ZXIgPyAwIDogU0lMMTY0X0NPTlRST0wyX0ZJTFRFUl9FTkFCTEUpIHwKKwkJICAgICAoNCA8PCBTSUwxNjRfQ09OVFJPTDJfRklMVEVSX1NFVFRJTkdfU0hJRlQpKTsKKworCXNpbDE2NF93cml0ZShjbGllbnQsIFNJTDE2NF9QTExaT05FLCAwKTsKKworCWlmIChkdWFsbGluaykKKwkJc2lsMTY0X3dyaXRlKGNsaWVudCwgU0lMMTY0X0RVQUxMSU5LLAorCQkJICAgICBTSUwxNjRfRFVBTExJTktfRU5BQkxFIHwKKwkJCSAgICAgKCgoY29uZmlnLT5kdWFsbGlua19za2V3ICsgNCkgJiAweDcpCisJCQkgICAgICA8PCBTSUwxNjRfRFVBTExJTktfU0tFV19TSElGVCkpOworCWVsc2UKKwkJc2lsMTY0X3dyaXRlKGNsaWVudCwgU0lMMTY0X0RVQUxMSU5LLCAwKTsKK30KKworLyogRFJNIGVuY29kZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkCitzaWwxNjRfZW5jb2Rlcl9zZXRfY29uZmlnKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgdm9pZCAqcGFyYW1zKQoreworCXN0cnVjdCBzaWwxNjRfcHJpdiAqcHJpdiA9IHRvX3NpbDE2NF9wcml2KGVuY29kZXIpOworCisJcHJpdi0+Y29uZmlnID0gKihzdHJ1Y3Qgc2lsMTY0X2VuY29kZXJfcGFyYW1zICopcGFyYW1zOworfQorCitzdGF0aWMgdm9pZAorc2lsMTY0X2VuY29kZXJfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBzaWwxNjRfcHJpdiAqcHJpdiA9IHRvX3NpbDE2NF9wcml2KGVuY29kZXIpOworCWJvb2wgb24gPSAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKTsKKwlib29sIGR1YWxsaW5rID0gKG9uICYmIGVuY29kZXItPmNydGMtPm1vZGUuY2xvY2sgPiAxNjUwMDApOworCisJc2lsMTY0X3NldF9wb3dlcl9zdGF0ZShkcm1faTJjX2VuY29kZXJfZ2V0X2NsaWVudChlbmNvZGVyKSwgb24pOworCisJaWYgKHByaXYtPmR1YWxsaW5rX3NsYXZlKQorCQlzaWwxNjRfc2V0X3Bvd2VyX3N0YXRlKHByaXYtPmR1YWxsaW5rX3NsYXZlLCBkdWFsbGluayk7Cit9CisKK3N0YXRpYyB2b2lkCitzaWwxNjRfZW5jb2Rlcl9zYXZlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnByaXYgPSB0b19zaWwxNjRfcHJpdihlbmNvZGVyKTsKKworCXNpbDE2NF9zYXZlX3N0YXRlKGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpLAorCQkJICBwcml2LT5zYXZlZF9zdGF0ZSk7CisKKwlpZiAocHJpdi0+ZHVhbGxpbmtfc2xhdmUpCisJCXNpbDE2NF9zYXZlX3N0YXRlKHByaXYtPmR1YWxsaW5rX3NsYXZlLAorCQkJCSAgcHJpdi0+c2F2ZWRfc2xhdmVfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorc2lsMTY0X2VuY29kZXJfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IHNpbDE2NF9wcml2ICpwcml2ID0gdG9fc2lsMTY0X3ByaXYoZW5jb2Rlcik7CisKKwlzaWwxNjRfcmVzdG9yZV9zdGF0ZShkcm1faTJjX2VuY29kZXJfZ2V0X2NsaWVudChlbmNvZGVyKSwKKwkJCSAgICAgcHJpdi0+c2F2ZWRfc3RhdGUpOworCisJaWYgKHByaXYtPmR1YWxsaW5rX3NsYXZlKQorCQlzaWwxNjRfcmVzdG9yZV9zdGF0ZShwcml2LT5kdWFsbGlua19zbGF2ZSwKKwkJCQkgICAgIHByaXYtPnNhdmVkX3NsYXZlX3N0YXRlKTsKK30KKworc3RhdGljIGJvb2wKK3NpbDE2NF9lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK3NpbDE2NF9lbmNvZGVyX21vZGVfdmFsaWQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnByaXYgPSB0b19zaWwxNjRfcHJpdihlbmNvZGVyKTsKKworCWlmIChtb2RlLT5jbG9jayA8IDMyMDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19MT1c7CisKKwlpZiAobW9kZS0+Y2xvY2sgPiAzMzAwMDAgfHwKKwkgICAgKG1vZGUtPmNsb2NrID4gMTY1MDAwICYmICFwcml2LT5kdWFsbGlua19zbGF2ZSkpCisJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisKKwlyZXR1cm4gTU9ERV9PSzsKK30KKworc3RhdGljIHZvaWQKK3NpbDE2NF9lbmNvZGVyX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IHNpbDE2NF9wcml2ICpwcml2ID0gdG9fc2lsMTY0X3ByaXYoZW5jb2Rlcik7CisJYm9vbCBkdWFsbGluayA9IGFkanVzdGVkX21vZGUtPmNsb2NrID4gMTY1MDAwOworCisJc2lsMTY0X2luaXRfc3RhdGUoZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2RlciksCisJCQkgICZwcml2LT5jb25maWcsIGR1YWxsaW5rKTsKKworCWlmIChwcml2LT5kdWFsbGlua19zbGF2ZSkKKwkJc2lsMTY0X2luaXRfc3RhdGUocHJpdi0+ZHVhbGxpbmtfc2xhdmUsCisJCQkJICAmcHJpdi0+Y29uZmlnLCBkdWFsbGluayk7CisKKwlzaWwxNjRfZW5jb2Rlcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworc2lsMTY0X2VuY29kZXJfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisKKwlpZiAoc2lsMTY0X3JlYWQoY2xpZW50LCBTSUwxNjRfREVURUNUKSAmIFNJTDE2NF9ERVRFQ1RfSE9UUExVR19TVEFUKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJZWxzZQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQKK3NpbDE2NF9lbmNvZGVyX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2lsMTY0X2VuY29kZXJfY3JlYXRlX3Jlc291cmNlcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2lsMTY0X2VuY29kZXJfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJICAgIHVpbnQ2NF90IHZhbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NpbDE2NF9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBzaWwxNjRfcHJpdiAqcHJpdiA9IHRvX3NpbDE2NF9wcml2KGVuY29kZXIpOworCisJaWYgKHByaXYtPmR1YWxsaW5rX3NsYXZlKQorCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UocHJpdi0+ZHVhbGxpbmtfc2xhdmUpOworCisJa2ZyZWUocHJpdik7CisJZHJtX2kyY19lbmNvZGVyX2Rlc3Ryb3koZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfc2xhdmVfZnVuY3Mgc2lsMTY0X2VuY29kZXJfZnVuY3MgPSB7CisJLnNldF9jb25maWcgPSBzaWwxNjRfZW5jb2Rlcl9zZXRfY29uZmlnLAorCS5kZXN0cm95ID0gc2lsMTY0X2VuY29kZXJfZGVzdHJveSwKKwkuZHBtcyA9IHNpbDE2NF9lbmNvZGVyX2RwbXMsCisJLnNhdmUgPSBzaWwxNjRfZW5jb2Rlcl9zYXZlLAorCS5yZXN0b3JlID0gc2lsMTY0X2VuY29kZXJfcmVzdG9yZSwKKwkubW9kZV9maXh1cCA9IHNpbDE2NF9lbmNvZGVyX21vZGVfZml4dXAsCisJLm1vZGVfdmFsaWQgPSBzaWwxNjRfZW5jb2Rlcl9tb2RlX3ZhbGlkLAorCS5tb2RlX3NldCA9IHNpbDE2NF9lbmNvZGVyX21vZGVfc2V0LAorCS5kZXRlY3QgPSBzaWwxNjRfZW5jb2Rlcl9kZXRlY3QsCisJLmdldF9tb2RlcyA9IHNpbDE2NF9lbmNvZGVyX2dldF9tb2RlcywKKwkuY3JlYXRlX3Jlc291cmNlcyA9IHNpbDE2NF9lbmNvZGVyX2NyZWF0ZV9yZXNvdXJjZXMsCisJLnNldF9wcm9wZXJ0eSA9IHNpbDE2NF9lbmNvZGVyX3NldF9wcm9wZXJ0eSwKK307CisKKy8qIEkyQyBkcml2ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQKK3NpbDE2NF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHZlbmRvciA9IHNpbDE2NF9yZWFkKGNsaWVudCwgU0lMMTY0X1ZFTkRPUl9ISSkgPDwgOCB8CisJCXNpbDE2NF9yZWFkKGNsaWVudCwgU0lMMTY0X1ZFTkRPUl9MTyk7CisJaW50IGRldmljZSA9IHNpbDE2NF9yZWFkKGNsaWVudCwgU0lMMTY0X0RFVklDRV9ISSkgPDwgOCB8CisJCXNpbDE2NF9yZWFkKGNsaWVudCwgU0lMMTY0X0RFVklDRV9MTyk7CisJaW50IHJldiA9IHNpbDE2NF9yZWFkKGNsaWVudCwgU0lMMTY0X1JFVklTSU9OKTsKKworCWlmICh2ZW5kb3IgIT0gMHgxIHx8IGRldmljZSAhPSAweDYpIHsKKwkJc2lsMTY0X2RiZyhjbGllbnQsICJVbmtub3duIGRldmljZSAleDoleC4leFxuIiwKKwkJCSAgIHZlbmRvciwgZGV2aWNlLCByZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzaWwxNjRfaW5mbyhjbGllbnQsICJEZXRlY3RlZCBkZXZpY2UgJXg6JXguJXhcbiIsCisJCSAgICB2ZW5kb3IsIGRldmljZSwgcmV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzaWwxNjRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqCitzaWwxNjRfZGV0ZWN0X3NsYXZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBTSUwxNjRfSTJDX0FERFJfU0xBVkUsCisJCS5sZW4gPSAwLAorCX07CisJY29uc3Qgc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm8gPSB7CisJCUkyQ19CT0FSRF9JTkZPKCJzaWwxNjQiLCBTSUwxNjRfSTJDX0FERFJfU0xBVkUpCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQlzaWwxNjRfZGJnKGFkYXAsICJObyBkdWFsLWxpbmsgc2xhdmUgZm91bmQuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBpMmNfbmV3X2RldmljZShhZGFwLCAmaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQKK3NpbDE2NF9lbmNvZGVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgZHJtX2VuY29kZXJfc2xhdmUgKmVuY29kZXIpCit7CisJc3RydWN0IHNpbDE2NF9wcml2ICpwcml2OworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVuY29kZXItPnNsYXZlX3ByaXYgPSBwcml2OworCWVuY29kZXItPnNsYXZlX2Z1bmNzID0gJnNpbDE2NF9lbmNvZGVyX2Z1bmNzOworCisJcHJpdi0+ZHVhbGxpbmtfc2xhdmUgPSBzaWwxNjRfZGV0ZWN0X3NsYXZlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHNpbDE2NF9pZHNbXSA9IHsKKwl7ICJzaWwxNjQiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNpbDE2NF9pZHMpOworCitzdGF0aWMgc3RydWN0IGRybV9pMmNfZW5jb2Rlcl9kcml2ZXIgc2lsMTY0X2RyaXZlciA9IHsKKwkuaTJjX2RyaXZlciA9IHsKKwkJLnByb2JlID0gc2lsMTY0X3Byb2JlLAorCQkucmVtb3ZlID0gc2lsMTY0X3JlbW92ZSwKKwkJLmRyaXZlciA9IHsKKwkJCS5uYW1lID0gInNpbDE2NCIsCisJCX0sCisJCS5pZF90YWJsZSA9IHNpbDE2NF9pZHMsCisJfSwKKwkuZW5jb2Rlcl9pbml0ID0gc2lsMTY0X2VuY29kZXJfaW5pdCwKK307CisKKy8qIE1vZHVsZSBpbml0aWFsaXphdGlvbiAqLworCitzdGF0aWMgaW50IF9faW5pdAorc2lsMTY0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJtX2kyY19lbmNvZGVyX3JlZ2lzdGVyKFRISVNfTU9EVUxFLCAmc2lsMTY0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorc2lsMTY0X2V4aXQodm9pZCkKK3sKKwlkcm1faTJjX2VuY29kZXJfdW5yZWdpc3Rlcigmc2lsMTY0X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZyYW5jaXNjbyBKZXJleiA8Y3Vycm9qZXJlekByaXNldXAubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaWxpY29uIEltYWdlIHNpbDE2NCBUTURTIHRyYW5zbWl0dGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKKworbW9kdWxlX2luaXQoc2lsMTY0X2luaXQpOworbW9kdWxlX2V4aXQoc2lsMTY0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZG1hLmMKaW5kZXggOTk3ZDkxNy4uMGU2YzEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2RtYS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrIHF1ZXVlIHN1cHBvcnQgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAogI2RlZmluZSBJODEwX0JVRl9GUkVFCQkyCkBAIC02MCw5ICs2MSw4IEBACiAJCS8qIEluIHVzZSBpcyBhbHJlYWR5IGEgcG9pbnRlciAqLwogCQl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9GUkVFLAogCQkJICAgICAgIEk4MTBfQlVGX0NMSUVOVCk7Ci0JCWlmICh1c2VkID09IEk4MTBfQlVGX0ZSRUUpIHsKKwkJaWYgKHVzZWQgPT0gSTgxMF9CVUZfRlJFRSkKIAkJCXJldHVybiBidWY7Ci0JCX0KIAl9CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03MSw3ICs3MSw3IEBACiAgKiB5ZXQsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIGluIHVzZSBmb3IgdXMgb25jZSBpdHMgb24gdGhlIHJpbmcgYnVmZmVyLgogICovCiAKLXN0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQorc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqYnVmKQogewogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgdXNlZDsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAogfTsKIAotc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKmJ1Ziwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGZpbGVfcHJpdi0+bWlub3ItPmRldjsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODEwX3VubWFwX2J1ZmZlcihzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgxMF91bm1hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKmJ1ZikKIHsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kbWFfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MTBfZG1hX3QgKiBkLAorc3RhdGljIGludCBpODEwX2RtYV9nZXRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9pODEwX2RtYV90ICpkLAogCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1fYnVmICpidWY7CkBAIC0yMDIsNyArMjAyLDcgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODEwX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIGludCBpODEwX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIApAQCAtMjE4LDkgKzIxOCw4IEBACiAJCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCQkgICAgKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCi0JCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KQogCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKLQkJfQogCQlpZiAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSB7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLAogCQkJCQkgICAgZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlLApAQCAtMjQyLDcgKzI0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuKQorc3RhdGljIGludCBpODEwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yNzEsMTEgKzI3MCwxMSBAQAogCQl1ZGVsYXkoMSk7CiAJfQogCi0gICAgICBvdXRfd2FpdF9yaW5nOgorb3V0X3dhaXRfcmluZzoKIAlyZXR1cm4gaXRlcnM7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTI4Nyw3ICsyODYsNyBAQAogCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MTBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IG15X2lkeCA9IDI0OwpAQCAtMzIyLDkgKzMyMSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKLQkJCSAgICAgICBkcm1faTgxMF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgICBkcm1faTgxMF9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCBpODEwX2RtYV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICAgZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgICBkcm1faTgxMF9pbml0X3QgKmluaXQpCiB7CiAJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pODEwX3ByaXZhdGVfdCkpOwpAQCAtNDYyLDcgKzQ2MSw3IEBACiAgKiBVc2UgJ3ZvbGF0aWxlJyAmIGxvY2FsIHZhciB0bXAgdG8gZm9yY2UgdGhlIGVtaXR0ZWQgdmFsdWVzIHRvIGJlCiAgKiBpZGVudGljYWwgdG8gdGhlIHZlcmlmaWVkIG9uZXMuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorc3RhdGljIHZvaWQgaTgxMEVtaXRDb250ZXh0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNDk1LDcgKzQ5NCw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MTBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCBqID0gMDsKQEAgLTUyOCw3ICs1MjcsNyBAQAogCiAvKiBOZWVkIHRvIGRvIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZyB3aGVuIHNldHRpbmcgdGhlIGRlc3QgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCBpODEwRW1pdERlc3RWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MTBFbWl0RGVzdFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU2Myw3ICs1NjIsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODEwRW1pdFN0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgaTgxMEVtaXRTdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTU5NCw3ICs1OTMsNyBAQAogCiAvKiBuZWVkIHRvIHZlcmlmeQogICovCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGZsYWdzLAorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZsYWdzLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3IsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl96dmFsKQogewpAQCAtNjY5LDcgKzY2OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTcxNSw4ICs3MTQsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRybV9idWYgKmJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTc5NSw3ICs3OTQsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CkBAIC04NDEsNyArODQwLDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTg1OCw3ICs4NTcsNyBAQAogCWk4MTBfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgpOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IGk4MTBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwpAQCAtODkxLDcgKzg5MCw3IEBACiB9CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCitzdGF0aWMgdm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwpAQCAtOTY5LDkgKzk2OCw4IEBACiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAogCS8qIEdIOiBTb21lb25lJ3MgZG9pbmcgbmFzdHkgdGhpbmdzLi4uICovCi0JaWYgKCFkZXYtPmRldl9wcml2YXRlKSB7CisJaWYgKCFkZXYtPmRldl9wcml2YXRlKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlpODEwX2RtYV9kaXNwYXRjaF9jbGVhcihkZXYsIGNsZWFyLT5mbGFncywKIAkJCQljbGVhci0+Y2xlYXJfY29sb3IsIGNsZWFyLT5jbGVhcl9kZXB0aCk7CkBAIC0xMDM5LDcgKzEwMzcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9tYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYsIGludCB1c2VkLAorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfbWMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKmJ1ZiwgaW50IHVzZWQsCiAJCQkJIHVuc2lnbmVkIGludCBsYXN0X3JlbmRlcikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEwNTMsOSArMTA1MSw4IEBACiAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CiAKIAl1ID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9DTElFTlQsIEk4MTBfQlVGX0hBUkRXQVJFKTsKLQlpZiAodSAhPSBJODEwX0JVRl9DTElFTlQpIHsKKwlpZiAodSAhPSBJODEwX0JVRl9DTElFTlQpCiAJCURSTV9ERUJVRygiTUMgZm91bmQgYnVmZmVyIHRoYXQgaXNuJ3QgbWluZSFcbiIpOwotCX0KIAogCWlmICh1c2VkID4gNCAqIDEwMjQpCiAJCXVzZWQgPSAwOwpAQCAtMTE2MCw3ICsxMTU3LDcgQEAKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CiAKLQkvL1RlbGwgdGhlIG92ZXJsYXkgdG8gdXBkYXRlCisJLyogVGVsbCB0aGUgb3ZlcmxheSB0byB1cGRhdGUgKi8KIAlJODEwX1dSSVRFKDB4MzAwMDAsIGRldl9wcml2LT5vdmVybGF5X3BoeXNpY2FsIHwgMHg4MDAwMDAwMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTExNjgsNyArMTE2NSw3IEBACiAKIC8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMTc4LDcgKzExNzUsNyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZG9fY2xlYW51cF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgaTgxMF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEyMTgsNDkgKzEyMTUsNjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCQlpZiAoZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIHsKKwkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKQogCQkJaTgxMF9kb19jbGVhbnVwX3BhZ2VmbGlwKGRldik7Ci0JCX0KIAl9CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKK3ZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlpODEwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbGVfcHJpdik7CiB9CiAKLWludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQoraW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpODEwX2RtYV9xdWllc2NlbnQoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIGNhbGwgdGhlIGRybV9pb2N0bCB1bmRlciB0aGUgYmlnIGtlcm5lbCBsb2NrIGJlY2F1c2UKKyAqIHRvIGxvY2sgYWdhaW5zdCB0aGUgaTgxMF9tbWFwX2J1ZmZlcnMgZnVuY3Rpb24uCisgKi8KK2xvbmcgaTgxMF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldDsKKwlsb2NrX2tlcm5lbCgpOworCXJldCA9IGRybV9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpODEwX2lvY3Rsc1tdID0gewotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfSU5JVCwgaTgxMF9kbWFfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODEwX1ZFUlRFWCwgaTgxMF9kbWFfdmVydGV4LCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9DTEVBUiwgaTgxMF9jbGVhcl9idWZzLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9GTFVTSCwgaTgxMF9mbHVzaF9pb2N0bCwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfR0VUQUdFLCBpODEwX2dldGFnZSwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfR0VUQlVGLCBpODEwX2dldGJ1ZiwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfU1dBUCwgaTgxMF9zd2FwX2J1ZnMsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODEwX0NPUFksIGk4MTBfY29weWJ1ZiwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfRE9DT1BZLCBpODEwX2RvY29weSwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfT1YwSU5GTywgaTgxMF9vdjBfaW5mbywgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfRlNUQVRVUywgaTgxMF9mc3RhdHVzLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9PVjBGTElQLCBpODEwX292MF9mbGlwLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9NQywgaTgxMF9kbWFfbWMsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9SU1RBVFVTLCBpODEwX3JzdGF0dXMsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODEwX0ZMSVAsIGk4MTBfZmxpcF9idWZzLCBEUk1fQVVUSCkKKwlEUk1fSU9DVExfREVGKERSTV9JODEwX0lOSVQsIGk4MTBfZG1hX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWXxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfVkVSVEVYLCBpODEwX2RtYV92ZXJ0ZXgsIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9DTEVBUiwgaTgxMF9jbGVhcl9idWZzLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfRkxVU0gsIGk4MTBfZmx1c2hfaW9jdGwsIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9HRVRBR0UsIGk4MTBfZ2V0YWdlLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfR0VUQlVGLCBpODEwX2dldGJ1ZiwgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODEwX1NXQVAsIGk4MTBfc3dhcF9idWZzLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfQ09QWSwgaTgxMF9jb3B5YnVmLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfRE9DT1BZLCBpODEwX2RvY29weSwgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODEwX09WMElORk8sIGk4MTBfb3YwX2luZm8sIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9GU1RBVFVTLCBpODEwX2ZzdGF0dXMsIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgxMF9PVjBGTElQLCBpODEwX292MF9mbGlwLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MTBfTUMsIGk4MTBfZG1hX21jLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODEwX1JTVEFUVVMsIGk4MTBfcnN0YXR1cywgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODEwX0ZMSVAsIGk4MTBfZmxpcF9idWZzLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAogfTsKIAogaW50IGk4MTBfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTgxMF9pb2N0bHMpOwpAQCAtMTI3Niw3ICsxMjg1LDcgQEAKICAqIFxyZXR1cm5zCiAgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk4MTAgaXMgQUdQLgogICovCi1pbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK2ludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuYwppbmRleCBjMWUwMjc1Li5iNDI1MGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZHJ2LmMKQEAgLTU5LDcgKzU5LDcgQEAKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLAogCQkgLm9wZW4gPSBkcm1fb3BlbiwKIAkJIC5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCi0JCSAudW5sb2NrZWRfaW9jdGwgPSBkcm1faW9jdGwsCisJCSAudW5sb2NrZWRfaW9jdGwgPSBpODEwX2lvY3RsLAogCQkgLm1tYXAgPSBkcm1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5oCmluZGV4IDIxZTI2OTEuLmM5MzM5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuaApAQCAtMTE1LDU2ICsxMTUsNTkgQEAKIH0gZHJtX2k4MTBfcHJpdmF0ZV90OwogCiAJCQkJLyogaTgxMF9kbWEuYyAqLwotZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IGk4MTBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwotZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAorZXh0ZXJuIGxvbmcgaTgxMF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpODEwX2lvY3Rsc1tdOwogZXh0ZXJuIGludCBpODEwX21heF9pb2N0bDsKIAogI2RlZmluZSBJODEwX0JBU0UocmVnKQkJKCh1bnNpZ25lZCBsb25nKSBcCiAJCQkJZGV2X3ByaXYtPm1taW9fbWFwLT5oYW5kbGUpCiAjZGVmaW5lIEk4MTBfQUREUihyZWcpCQkoSTgxMF9CQVNFKHJlZykgKyByZWcpCi0jZGVmaW5lIEk4MTBfREVSRUYocmVnKQkJKihfX3ZvbGF0aWxlX18gaW50ICopSTgxMF9BRERSKHJlZykKKyNkZWZpbmUgSTgxMF9ERVJFRihyZWcpCQkoKihfX3ZvbGF0aWxlX18gaW50ICopSTgxMF9BRERSKHJlZykpCiAjZGVmaW5lIEk4MTBfUkVBRChyZWcpCQlJODEwX0RFUkVGKHJlZykKLSNkZWZpbmUgSTgxMF9XUklURShyZWcsdmFsKQlkbyB7IEk4MTBfREVSRUYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgSTgxMF9ERVJFRjE2KHJlZykJKihfX3ZvbGF0aWxlX18gdTE2ICopSTgxMF9BRERSKHJlZykKKyNkZWZpbmUgSTgxMF9XUklURShyZWcsIHZhbCkJZG8geyBJODEwX0RFUkVGKHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCisjZGVmaW5lIEk4MTBfREVSRUYxNihyZWcpCSgqKF9fdm9sYXRpbGVfXyB1MTYgKilJODEwX0FERFIocmVnKSkKICNkZWZpbmUgSTgxMF9SRUFEMTYocmVnKQlJODEwX0RFUkVGMTYocmVnKQotI2RlZmluZSBJODEwX1dSSVRFMTYocmVnLHZhbCkJZG8geyBJODEwX0RFUkVGMTYocmVnKSA9IHZhbDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSTgxMF9XUklURTE2KHJlZywgdmFsKQlkbyB7IEk4MTBfREVSRUYxNihyZWcpID0gdmFsOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEk4MTBfVkVSQk9TRSAwCiAjZGVmaW5lIFJJTkdfTE9DQUxTCXVuc2lnbmVkIGludCBvdXRyaW5nLCByaW5nbWFzazsgXAotICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgY2hhciAqdmlydDsKKwkJCXZvbGF0aWxlIGNoYXIgKnZpcnQ7CiAKLSNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSBkbyB7CQkJCQkJXAotCWlmIChJODEwX1ZFUkJPU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCURSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZClcbiIsIG4pOwkJCVwKLQlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCBuKjQpCQkJCQlcCi0JCWk4MTBfd2FpdF9yaW5nKGRldiwgbio0KTsJCQkJXAotCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG4qNDsJCQkJCVwKLQlvdXRyaW5nID0gZGV2X3ByaXYtPnJpbmcudGFpbDsJCQkJCVwKLQlyaW5nbWFzayA9IGRldl9wcml2LT5yaW5nLnRhaWxfbWFzazsJCQkJXAotCXZpcnQgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OwkJCQlcCisjZGVmaW5lIEJFR0lOX0xQX1JJTkcobikgZG8gewkJCQkJXAorCWlmIChJODEwX1ZFUkJPU0UpCQkJCQlcCisJCURSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZClcbiIsIG4pOwkJXAorCWlmIChkZXZfcHJpdi0+cmluZy5zcGFjZSA8IG4qNCkJCQkJXAorCQlpODEwX3dhaXRfcmluZyhkZXYsIG4qNCk7CQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG4qNDsJCQkJXAorCW91dHJpbmcgPSBkZXZfcHJpdi0+cmluZy50YWlsOwkJCQlcCisJcmluZ21hc2sgPSBkZXZfcHJpdi0+cmluZy50YWlsX21hc2s7CQkJXAorCXZpcnQgPSBkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0OwkJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgZG8gewkJCQkgICAgICAgIFwKLQlpZiAoSTgxMF9WRVJCT1NFKSBEUk1fREVCVUcoIkFEVkFOQ0VfTFBfUklOR1xuIik7CVwKKyNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgZG8gewkJCQkJXAorCWlmIChJODEwX1ZFUkJPU0UpCQkJCQlcCisJCURSTV9ERUJVRygiQURWQU5DRV9MUF9SSU5HXG4iKTsJCQlcCiAJZGV2X3ByaXYtPnJpbmcudGFpbCA9IG91dHJpbmc7CQkJCVwKLQlJODEwX1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkgICAgICAgIFwKLX0gd2hpbGUoMCkKKwlJODEwX1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBPVVRfUklORyhuKSBkbyB7CQkJCSAgICAgICAgICAgICAgICBcCi0JaWYgKEk4MTBfVkVSQk9TRSkgRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJICAgICAgICAgICAgICAgIFwKLQlvdXRyaW5nICs9IDQ7CQkJCQkgICAgICAgICAgICAgICAgXAotCW91dHJpbmcgJj0gcmluZ21hc2s7CQkJICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBPVVRfUklORyhuKSBkbyB7CQkJCQlcCisJaWYgKEk4MTBfVkVSQk9TRSkJCQkJCVwKKwkJRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJCVwKKwlvdXRyaW5nICs9IDQ7CQkJCQkJXAorCW91dHJpbmcgJj0gcmluZ21hc2s7CQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVAkJKCgwPDwyOSl8KDI8PDIzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pODMwL2k4MzBfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTgzMC9pODMwX2RtYS5jCmluZGV4IDY1NzU5YTkuLjUxNjg4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pODMwL2k4MzBfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k4MzAvaTgzMF9kbWEuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgImk4MzBfZHJtLmgiCiAjaW5jbHVkZSAiaTgzMF9kcnYuaCIKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogRm9yIHRhc2sgcXVldWUgc3VwcG9ydCAqLworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNjIsOSArNjMsOCBAQAogCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KIAkJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfRlJFRSwKIAkJCSAgICAgICBJODMwX0JVRl9DTElFTlQpOwotCQlpZiAodXNlZCA9PSBJODMwX0JVRl9GUkVFKSB7CisJCWlmICh1c2VkID09IEk4MzBfQlVGX0ZSRUUpCiAJCQlyZXR1cm4gYnVmOwotCQl9CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtNzMsNyArNzMsNyBAQAogICogeWV0LCB0aGUgaGFyZHdhcmUgdXBkYXRlcyBpbiB1c2UgZm9yIHVzIG9uY2UgaXRzIG9uIHRoZSByaW5nIGJ1ZmZlci4KICAqLwogCi1zdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKmJ1ZikKIHsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHVzZWQ7CkBAIC0xMjMsNyArMTIzLDcgQEAKIAkuZmFzeW5jID0gZHJtX2Zhc3luYywKIH07CiAKLXN0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3N0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICpidWYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmaWxlX3ByaXYtPm1pbm9yLT5kZXY7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF91bm1hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYpCitzdGF0aWMgaW50IGk4MzBfdW5tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICpidWYpCiB7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCByZXRjb2RlID0gMDsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODMwX2RtYV90ICogZCwKK3N0YXRpYyBpbnQgaTgzMF9kbWFfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1faTgzMF9kbWFfdCAqZCwKIAkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAKQEAgLTIyMiw5ICsyMjIsOCBAQAogCQlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkJICAgIChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAotCQlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCkgeworCQlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCkKIAkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZkZXZfcHJpdi0+cmluZy5tYXAsIGRldik7Ci0JCX0KIAkJaWYgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkgewogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKIAkJCQkJICAgIGRldl9wcml2LT5od19zdGF0dXNfcGFnZSwKQEAgLTI0Niw3ICsyNDUsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCitpbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yNzYsMTEgKzI3NSwxMSBAQAogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9XQUlUOwogCX0KIAotICAgICAgb3V0X3dhaXRfcmluZzoKK291dF93YWl0X3Jpbmc6CiAJcmV0dXJuIGl0ZXJzOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yOTUsNyArMjk0LDcgQEAKIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTgzMF9CT1hfUklOR19FTVBUWTsKIH0KIAotc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBteV9pZHggPSAzNjsKQEAgLTMyOSw5ICszMjgsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkgICAgICAgZHJtX2k4MzBfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgZHJtX2k4MzBfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIGRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX2k4MzBfaW5pdF90ICppbml0KQogewogCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIApAQCAtNDgyLDcgKzQ4MSw3IEBACiAvKiBNb3N0IGVmZmljaWVudCB3YXkgdG8gdmVyaWZ5IHN0YXRlIGZvciB0aGUgaTgzMCBpcyBhcyBpdCBpcwogICogZW1pdHRlZC4gIE5vbi1jb25mb3JtYW50IHN0YXRlIGlzIHNpbGVudGx5IGRyb3BwZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODMwRW1pdENvbnRleHRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIGogPSAwOwpAQCAtNTI3LDcgKzUyNiw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCBqID0gMDsKQEAgLTU2MSw3ICs1NjAsNyBAQAogCQlwcmludGsoInJlamVjdGVkIHBhY2tldCAleFxuIiwgY29kZVswXSk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb2RlLCB1bnNpZ25lZCBpbnQgbnVtKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTg2LDcgKzU4NSw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4UGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4UGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICAgIHVuc2lnbmVkIGludCAqcGFsZXR0ZSwgaW50IG51bWJlciwgaW50IGlzX3NoYXJlZCkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYwMyw5ICs2MDIsOCBAQAogCX0gZWxzZSB7CiAJCU9VVF9SSU5HKENNRF9PUF9NQVBfUEFMRVRURV9MT0FEIHwgTUFQX1BBTEVUVEVfTlVNKG51bWJlcikpOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCiAJCU9VVF9SSU5HKHBhbGV0dGVbaV0pOwotCX0KIAlPVVRfUklORygwKTsKIAkvKiBLVzogIFdIRVJFIElTIFRIRSBBRFZBTkNFX0xQX1JJTkc/ICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgbm9vcCEKIAkgKi8KQEAgLTYxMyw3ICs2MTEsNyBAQAogCiAvKiBOZWVkIHRvIGRvIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZyB3aGVuIHNldHRpbmcgdGhlIGRlc3QgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCBpODMwRW1pdERlc3RWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXREZXN0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCB0bXA7CkBAIC02NzQsNyArNjcyLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRTdGlwcGxlVmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RpcHBsZVZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTY4NSw3ICs2ODMsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFN0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgaTgzMEVtaXRTdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTc4OCw3ICs3ODYsNyBAQAogICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCBpODMwX2ZpbGxfYm94KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorc3RhdGljIHZvaWQgaTgzMF9maWxsX2JveChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHIsIGludCBnLCBpbnQgYikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTgxNiwxNyArODE0LDE2IEBACiAJT1VUX1JJTkcoKHkgPDwgMTYpIHwgeCk7CiAJT1VUX1JJTkcoKCh5ICsgaCkgPDwgMTYpIHwgKHggKyB3KSk7CiAKLQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxKSB7CisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkKIAkJT1VUX1JJTkcoZGV2X3ByaXYtPmZyb250X29mZnNldCk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX29mZnNldCk7Ci0JfQogCiAJT1VUX1JJTkcoY29sb3IpOwogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9jcF9wZXJmb3JtYW5jZV9ib3hlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC04NzEsNyArODY4LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgZmxhZ3MsCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZmxhZ3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9jb2xvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX3p2YWwsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9kZXB0aG1hc2spCkBAIC05NjYsNyArOTYzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtMTAzNiw3ICsxMDMzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0xMDc5LDggKzEwNzYsOCBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2J1ZiAqYnVmLCBpbnQgZGlzY2FyZCwgaW50IHVzZWQpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMTEwMCw5ICsxMDk3LDggQEAKIAlpZiAoZGlzY2FyZCkgewogCQl1ID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9DTElFTlQsCiAJCQkgICAgSTgzMF9CVUZfSEFSRFdBUkUpOwotCQlpZiAodSAhPSBJODMwX0JVRl9DTElFTlQpIHsKKwkJaWYgKHUgIT0gSTgzMF9CVUZfQ0xJRU5UKQogCQkJRFJNX0RFQlVHKCJ4eHh4IDJcbiIpOwotCQl9CiAJfQogCiAJaWYgKHVzZWQgPiA0ICogMTAyMykKQEAgLTExOTEsNyArMTE4Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTEyMDgsNyArMTIwNCw3IEBACiAJaTgzMF93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19mdW5jX18pOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwpAQCAtMTI0MSw3ICsxMjM3LDcgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkICovCi1zdGF0aWMgdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCitzdGF0aWMgdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwpAQCAtMTMxNiw5ICsxMzEyLDggQEAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCiAJLyogR0g6IFNvbWVvbmUncyBkb2luZyBuYXN0eSB0aGluZ3MuLi4gKi8KLQlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpIHsKKwlpZiAoIWRldi0+ZGV2X3ByaXZhdGUpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAogCWk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKGRldiwgY2xlYXItPmZsYWdzLAogCQkJCWNsZWFyLT5jbGVhcl9jb2xvciwKQEAgLTEzMzksNyArMTMzNCw3IEBACiAKIC8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzQ5LDcgKzEzNDQsNyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTE0OTAsNDcgKzE0ODUsNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCQlpZiAoZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIHsKKwkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKQogCQkJaTgzMF9kb19jbGVhbnVwX3BhZ2VmbGlwKGRldik7Ci0JCX0KIAl9CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit2b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJaTgzMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxlX3ByaXYpOwogfQogCi1pbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK2ludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaTgzMF9kbWFfcXVpZXNjZW50KGRldik7CiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBjYWxsIHRoZSBkcm1faW9jdGwgdW5kZXIgdGhlIGJpZyBrZXJuZWwgbG9jayBiZWNhdXNlCisgKiB0byBsb2NrIGFnYWluc3QgdGhlIGk4MzBfbW1hcF9idWZmZXJzIGZ1bmN0aW9uLgorICovCitsb25nIGk4MzBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJbG9ja19rZXJuZWwoKTsKKwlyZXQgPSBkcm1faW9jdGwoZmlsZSwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgaTgzMF9pb2N0bHNbXSA9IHsKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX0lOSVQsIGk4MzBfZG1hX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9WRVJURVgsIGk4MzBfZG1hX3ZlcnRleCwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MzBfQ0xFQVIsIGk4MzBfY2xlYXJfYnVmcywgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MzBfRkxVU0gsIGk4MzBfZmx1c2hfaW9jdGwsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX0dFVEFHRSwgaTgzMF9nZXRhZ2UsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX0dFVEJVRiwgaTgzMF9nZXRidWYsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX1NXQVAsIGk4MzBfc3dhcF9idWZzLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9DT1BZLCBpODMwX2NvcHlidWYsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX0RPQ09QWSwgaTgzMF9kb2NvcHksIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX0ZMSVAsIGk4MzBfZmxpcF9idWZzLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9JUlFfRU1JVCwgaTgzMF9pcnFfZW1pdCwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUYoRFJNX0k4MzBfSVJRX1dBSVQsIGk4MzBfaXJxX3dhaXQsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGKERSTV9JODMwX0dFVFBBUkFNLCBpODMwX2dldHBhcmFtLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9TRVRQQVJBTSwgaTgzMF9zZXRwYXJhbSwgRFJNX0FVVEgpCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9JTklULCBpODMwX2RtYV9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX1ZFUlRFWCwgaTgzMF9kbWFfdmVydGV4LCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MzBfQ0xFQVIsIGk4MzBfY2xlYXJfYnVmcywgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX0ZMVVNILCBpODMwX2ZsdXNoX2lvY3RsLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MzBfR0VUQUdFLCBpODMwX2dldGFnZSwgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX0dFVEJVRiwgaTgzMF9nZXRidWYsIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9TV0FQLCBpODMwX3N3YXBfYnVmcywgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX0NPUFksIGk4MzBfY29weWJ1ZiwgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX0RPQ09QWSwgaTgzMF9kb2NvcHksIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9GTElQLCBpODMwX2ZsaXBfYnVmcywgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX0lSUV9FTUlULCBpODMwX2lycV9lbWl0LCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAorCURSTV9JT0NUTF9ERUYoRFJNX0k4MzBfSVJRX1dBSVQsIGk4MzBfaXJxX3dhaXQsIERSTV9BVVRIfERSTV9VTkxPQ0tFRCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTgzMF9HRVRQQVJBTSwgaTgzMF9nZXRwYXJhbSwgRFJNX0FVVEh8RFJNX1VOTE9DS0VEKSwKKwlEUk1fSU9DVExfREVGKERSTV9JODMwX1NFVFBBUkFNLCBpODMwX3NldHBhcmFtLCBEUk1fQVVUSHxEUk1fVU5MT0NLRUQpLAogfTsKIAogaW50IGk4MzBfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTgzMF9pb2N0bHMpOwpAQCAtMTU0Niw3ICsxNTUzLDcgQEAKICAqIFxyZXR1cm5zCiAgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk4eHggaXMgQUdQLgogICovCi1pbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK2ludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTgzMC9pODMwX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k4MzAvaTgzMF9kcnYuYwppbmRleCA0NGY5OTBiLi5hNWM2NmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTgzMC9pODMwX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pODMwL2k4MzBfZHJ2LmMKQEAgLTcwLDcgKzcwLDcgQEAKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLAogCQkgLm9wZW4gPSBkcm1fb3BlbiwKIAkJIC5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCi0JCSAudW5sb2NrZWRfaW9jdGwgPSBkcm1faW9jdGwsCisJCSAudW5sb2NrZWRfaW9jdGwgPSBpODMwX2lvY3RsLAogCQkgLm1tYXAgPSBkcm1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pODMwL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTgzMC9pODMwX2Rydi5oCmluZGV4IGRhODJhZmUuLjBkZjFjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pODMwL2k4MzBfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k4MzAvaTgzMF9kcnYuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAKIH0gZHJtX2k4MzBfcHJpdmF0ZV90OwogCitsb25nIGk4MzBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgaTgzMF9pb2N0bHNbXTsKIGV4dGVybiBpbnQgaTgzMF9tYXhfaW9jdGw7CiAKQEAgLTEzMiwzMyArMTMzLDMzIEBACiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaTgzMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotI2RlZmluZSBJODMwX1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQotI2RlZmluZSBJODMwX1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQotI2RlZmluZSBJODMwX1JFQUQxNihyZWcpICAgICAgICBEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQotI2RlZmluZSBJODMwX1dSSVRFMTYocmVnLHZhbCkgICBEUk1fV1JJVEUxNihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQorI2RlZmluZSBJODMwX1JFQUQocmVnKQkJRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZykKKyNkZWZpbmUgSTgzMF9XUklURShyZWcsIHZhbCkJRFJNX1dSSVRFMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKKyNkZWZpbmUgSTgzMF9SRUFEMTYocmVnKQlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQorI2RlZmluZSBJODMwX1dSSVRFMTYocmVnLCB2YWwpCURSTV9XUklURTE2KGRldl9wcml2LT5tbWlvX21hcCwgcmVnLCB2YWwpCiAKICNkZWZpbmUgSTgzMF9WRVJCT1NFIDAKIAogI2RlZmluZSBSSU5HX0xPQ0FMUwl1bnNpZ25lZCBpbnQgb3V0cmluZywgcmluZ21hc2ssIG91dGNvdW50OyBcCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBjaGFyICp2aXJ0OworCQkJdm9sYXRpbGUgY2hhciAqdmlydDsKIAogI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJXAogCWlmIChJODMwX1ZFUkJPU0UpCQkJCVwKIAkJcHJpbnRrKCJCRUdJTl9MUF9SSU5HKCVkKVxuIiwgKG4pKTsJXAogCWlmIChkZXZfcHJpdi0+cmluZy5zcGFjZSA8IG4qNCkJCQlcCi0JCWk4MzBfd2FpdF9yaW5nKGRldiwgbio0LCBfX2Z1bmNfXyk7CQlcCisJCWk4MzBfd2FpdF9yaW5nKGRldiwgbio0LCBfX2Z1bmNfXyk7CVwKIAlvdXRjb3VudCA9IDA7CQkJCQlcCiAJb3V0cmluZyA9IGRldl9wcml2LT5yaW5nLnRhaWw7CQkJXAogCXJpbmdtYXNrID0gZGV2X3ByaXYtPnJpbmcudGFpbF9tYXNrOwkJXApAQCAtMTY2LDIxICsxNjcsMjMgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgT1VUX1JJTkcobikgZG8gewkJCQkJXAotCWlmIChJODMwX1ZFUkJPU0UpIHByaW50aygiICAgT1VUX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJXAorCWlmIChJODMwX1ZFUkJPU0UpCQkJCQlcCisJCXByaW50aygiICAgT1VUX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJCVwKIAkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSh2aXJ0ICsgb3V0cmluZykgPSBuOwkJXAotICAgICAgICBvdXRjb3VudCsrOwkJCQkJCVwKKwlvdXRjb3VudCsrOwkJCQkJCVwKIAlvdXRyaW5nICs9IDQ7CQkJCQkJXAogCW91dHJpbmcgJj0gcmluZ21hc2s7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIEFEVkFOQ0VfTFBfUklORygpIGRvIHsJCQkJCQlcCi0JaWYgKEk4MzBfVkVSQk9TRSkgcHJpbnRrKCJBRFZBTkNFX0xQX1JJTkcgJXhcbiIsIG91dHJpbmcpOwlcCi0JZGV2X3ByaXYtPnJpbmcudGFpbCA9IG91dHJpbmc7CQkJCQlcCi0JZGV2X3ByaXYtPnJpbmcuc3BhY2UgLT0gb3V0Y291bnQgKiA0OwkJCQlcCi0JSTgzMF9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJCQlcCi19IHdoaWxlKDApCisjZGVmaW5lIEFEVkFOQ0VfTFBfUklORygpIGRvIHsJCQkJCVwKKwlpZiAoSTgzMF9WRVJCT1NFKQkJCQkJXAorCQlwcmludGsoIkFEVkFOQ0VfTFBfUklORyAleFxuIiwgb3V0cmluZyk7CVwKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gb3V0cmluZzsJCQkJXAorCWRldl9wcml2LT5yaW5nLnNwYWNlIC09IG91dGNvdW50ICogNDsJCQlcCisJSTgzMF9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJCVwKK30gd2hpbGUgKDApCiAKLWV4dGVybiBpbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOworZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKIAogI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQJCSgoMDw8MjkpfCgyPDwyMykpCiAjZGVmaW5lIEdGWF9PUF9CUkVBS1BPSU5UX0lOVEVSUlVQVAkoKDA8PDI5KXwoMTw8MjMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k4MzAvaTgzMF9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pODMwL2k4MzBfaXJxLmMKaW5kZXggOTFlYzJiYi4uZDFhNmI5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k4MzAvaTgzMF9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTgzMC9pODMwX2lycS5jCkBAIC01Myw3ICs1Myw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTcwLDcgKzcwLDcgQEAKIAlyZXR1cm4gYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfZW1pdHRlZCk7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTgzMF93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaXJxX25yKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAKIC8qIGRybV9kbWEuaCBob29rcwogKi8KLXZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTY4LDE0ICsxNjgsMTQgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlJODMwX1dSSVRFMTYoSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4Mik7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCmluZGV4IDIzMDVhMTIuLmYxOWZmZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwpAQCAtMzQsMTIgKzM0LDE1IEBACiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92Z2FhcmIuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvdmdhX3N3aXRjaGVyb28uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKK2V4dGVybiBpbnQgaW50ZWxfbWF4X3N0b2xlbjsgLyogZnJvbSBBR1AgZHJpdmVyICovCisKIC8qKgogICogU2V0cyB1cCB0aGUgaGFyZHdhcmUgc3RhdHVzIHBhZ2UgZm9yIGRldmljZXMgdGhhdCBuZWVkIGEgcGh5c2ljYWwgYWRkcmVzcwogICogaW4gdGhlIHJlZ2lzdGVyLgpAQCAtMTI1Niw3ICsxMjU5LDcgQEAKIAkJZHJtX21tX3B1dF9ibG9jayhjb21wcmVzc2VkX2ZiKTsKIAl9CiAKLQlpZiAoIUlTX0dNNDUoZGV2KSkgeworCWlmICghKElTX0dNNDUoZGV2KSB8fCBJU19JUk9OTEFLRV9NKGRldikpKSB7CiAJCWNvbXByZXNzZWRfbGxiID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+dnJhbSwgNDA5NiwKIAkJCQkJCSAgICA0MDk2LCAwKTsKIAkJaWYgKCFjb21wcmVzc2VkX2xsYikgewpAQCAtMTI4Miw4ICsxMjg1LDkgQEAKIAogCWludGVsX2Rpc2FibGVfZmJjKGRldik7CiAJZGV2X3ByaXYtPmNvbXByZXNzZWRfZmIgPSBjb21wcmVzc2VkX2ZiOwotCi0JaWYgKElTX0dNNDUoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRV9NKGRldikpCisJCUk5MTVfV1JJVEUoSUxLX0RQRkNfQ0JfQkFTRSwgY29tcHJlc3NlZF9mYi0+c3RhcnQpOworCWVsc2UgaWYgKElTX0dNNDUoZGV2KSkgewogCQlJOTE1X1dSSVRFKERQRkNfQ0JfQkFTRSwgY29tcHJlc3NlZF9mYi0+c3RhcnQpOwogCX0gZWxzZSB7CiAJCUk5MTVfV1JJVEUoRkJDX0NGQl9CQVNFLCBjZmJfYmFzZSk7CkBAIC0xMjkxLDcgKzEyOTUsNyBAQAogCQlkZXZfcHJpdi0+Y29tcHJlc3NlZF9sbGIgPSBjb21wcmVzc2VkX2xsYjsKIAl9CiAKLQlEUk1fREVCVUcoIkZCQyBiYXNlIDB4JTA4bHgsIGxsIGJhc2UgMHglMDhseCwgc2l6ZSAlZE1cbiIsIGNmYl9iYXNlLAorCURSTV9ERUJVR19LTVMoIkZCQyBiYXNlIDB4JTA4bHgsIGxsIGJhc2UgMHglMDhseCwgc2l6ZSAlZE1cbiIsIGNmYl9iYXNlLAogCQkgIGxsX2Jhc2UsIHNpemUgPj4gMjApOwogfQogCkBAIC0xMzU0LDcgKzEzNTgsNyBAQAogCWludCBmYl9iYXIgPSBJU19JOVhYKGRldikgPyAyIDogMDsKIAlpbnQgcmV0ID0gMDsKIAotCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCBmYl9iYXIpICYKKwlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCBmYl9iYXIpICYKIAkJMHhmZjAwMDAwMDsKIAogCS8qIEJhc2ljIG1lbXJhbmdlIGFsbG9jYXRvciBmb3Igc3RvbGVuIHNwYWNlIChha2EgdnJhbSkgKi8KQEAgLTIwNjMsOCArMjA2Nyw4IEBACiAKIAkvKiBBZGQgcmVnaXN0ZXIgbWFwIChuZWVkZWQgZm9yIHN1c3BlbmQvcmVzdW1lKSAqLwogCW1taW9fYmFyID0gSVNfSTlYWChkZXYpID8gMCA6IDE7Ci0JYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCBtbWlvX2Jhcik7Ci0Jc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgbW1pb19iYXIpOworCWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCBtbWlvX2Jhcik7CisJc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCBtbWlvX2Jhcik7CiAKIAlpZiAoaTkxNV9nZXRfYnJpZGdlX2RldihkZXYpKSB7CiAJCXJldCA9IC1FSU87CkBAIC0yMTA0LDYgKzIxMDgsMTIgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9pb21hcGZyZWU7CiAKKwlpZiAocHJlYWxsb2Nfc2l6ZSA+IGludGVsX21heF9zdG9sZW4pIHsKKwkJRFJNX0lORk8oImRldGVjdGVkICVkTSBzdG9sZW4gbWVtb3J5LCB0cmltbWluZyB0byAlZE1cbiIsCisJCQkgcHJlYWxsb2Nfc2l6ZSA+PiAyMCwgaW50ZWxfbWF4X3N0b2xlbiA+PiAyMCk7CisJCXByZWFsbG9jX3NpemUgPSBpbnRlbF9tYXhfc3RvbGVuOworCX0KKwogCWRldl9wcml2LT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJpOTE1Iik7CiAJaWYgKGRldl9wcml2LT53cSA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBvdXIgd29ya3F1ZXVlLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCA0MjNkYzkwLi41MDQ0ZjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTkzLDExICs5MywxMSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pOTY1Z19pbmZvID0gewotCS5pc19pOTY1ZyA9IDEsIC5pc19pOXh4ID0gMSwgLmhhc19ob3RwbHVnID0gMSwKKwkuaXNfYnJvYWR3YXRlciA9IDEsIC5pc19pOTY1ZyA9IDEsIC5pc19pOXh4ID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaTk2NWdtX2luZm8gPSB7Ci0JLmlzX2k5NjVnID0gMSwgLmlzX21vYmlsZSA9IDEsIC5pc19pOTY1Z20gPSAxLCAuaXNfaTl4eCA9IDEsCisJLmlzX2NyZXN0bGluZSA9IDEsIC5pc19pOTY1ZyA9IDEsIC5pc19pOTY1Z20gPSAxLCAuaXNfaTl4eCA9IDEsCiAJLmlzX21vYmlsZSA9IDEsIC5oYXNfZmJjID0gMSwgLmhhc19yYzYgPSAxLAogCS5oYXNfaG90cGx1ZyA9IDEsCiB9OwpAQCAtMTE0LDcgKzExNCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2dtNDVfaW5mbyA9IHsKLQkuaXNfaTk2NWcgPSAxLCAuaXNfbW9iaWxlID0gMSwgLmlzX2c0eCA9IDEsIC5pc19pOXh4ID0gMSwKKwkuaXNfaTk2NWcgPSAxLCAuaXNfZzR4ID0gMSwgLmlzX2k5eHggPSAxLAogCS5pc19tb2JpbGUgPSAxLCAubmVlZF9nZnhfaHdzID0gMSwgLmhhc19mYmMgPSAxLCAuaGFzX3JjNiA9IDEsCiAJLmhhc19waXBlX2N4c3IgPSAxLAogCS5oYXNfaG90cGx1ZyA9IDEsCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pcm9ubGFrZV9tX2luZm8gPSB7CiAJLmlzX2lyb25sYWtlID0gMSwgLmlzX21vYmlsZSA9IDEsIC5pc19pOTY1ZyA9IDEsIC5pc19pOXh4ID0gMSwKLQkubmVlZF9nZnhfaHdzID0gMSwgLmhhc19yYzYgPSAxLAorCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2ZiYyA9IDEsIC5oYXNfcmM2ID0gMSwKIAkuaGFzX2hvdHBsdWcgPSAxLAogfTsKIApAQCAtMTQ4LDMzICsxNDgsMzMgQEAKIAkuaGFzX2hvdHBsdWcgPSAxLCAuaXNfZ2VuNiA9IDEsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7Ci0JSU5URUxfVkdBX0RFVklDRSgweDM1NzcsICZpbnRlbF9pODMwX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyNTYyLCAmaW50ZWxfODQ1Z19pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MzU4MiwgJmludGVsX2k4NXhfaW5mbyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CQkvKiBha2EgKi8KKwlJTlRFTF9WR0FfREVWSUNFKDB4MzU3NywgJmludGVsX2k4MzBfaW5mbyksCQkvKiBJODMwX00gKi8KKwlJTlRFTF9WR0FfREVWSUNFKDB4MjU2MiwgJmludGVsXzg0NWdfaW5mbyksCQkvKiA4NDVfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgzNTgyLCAmaW50ZWxfaTg1eF9pbmZvKSwJCS8qIEk4NTVfR00gKi8KIAlJTlRFTF9WR0FfREVWSUNFKDB4MzU4ZSwgJmludGVsX2k4NXhfaW5mbyksCi0JSU5URUxfVkdBX0RFVklDRSgweDI1NzIsICZpbnRlbF9pODY1Z19pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MjU4MiwgJmludGVsX2k5MTVnX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyNThhLCAmaW50ZWxfaTkxNWdfaW5mbyksCi0JSU5URUxfVkdBX0RFVklDRSgweDI1OTIsICZpbnRlbF9pOTE1Z21faW5mbyksCi0JSU5URUxfVkdBX0RFVklDRSgweDI3NzIsICZpbnRlbF9pOTQ1Z19pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MjdhMiwgJmludGVsX2k5NDVnbV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MjdhZSwgJmludGVsX2k5NDVnbV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4Mjk3MiwgJmludGVsX2k5NjVnX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOTgyLCAmaW50ZWxfaTk2NWdfaW5mbyksCi0JSU5URUxfVkdBX0RFVklDRSgweDI5OTIsICZpbnRlbF9pOTY1Z19pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MjlhMiwgJmludGVsX2k5NjVnX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOWIyLCAmaW50ZWxfZzMzX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOWMyLCAmaW50ZWxfZzMzX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOWQyLCAmaW50ZWxfZzMzX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyYTAyLCAmaW50ZWxfaTk2NWdtX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyYTEyLCAmaW50ZWxfaTk2NWdtX2luZm8pLAotCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyYTQyLCAmaW50ZWxfZ200NV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MmUwMiwgJmludGVsX2c0NV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MmUxMiwgJmludGVsX2c0NV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MmUyMiwgJmludGVsX2c0NV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MmUzMiwgJmludGVsX2c0NV9pbmZvKSwKLQlJTlRFTF9WR0FfREVWSUNFKDB4MmU0MiwgJmludGVsX2c0NV9pbmZvKSwKKwlJTlRFTF9WR0FfREVWSUNFKDB4MjU3MiwgJmludGVsX2k4NjVnX2luZm8pLAkJLyogSTg2NV9HICovCisJSU5URUxfVkdBX0RFVklDRSgweDI1ODIsICZpbnRlbF9pOTE1Z19pbmZvKSwJCS8qIEk5MTVfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyNThhLCAmaW50ZWxfaTkxNWdfaW5mbyksCQkvKiBFNzIyMV9HICovCisJSU5URUxfVkdBX0RFVklDRSgweDI1OTIsICZpbnRlbF9pOTE1Z21faW5mbyksCQkvKiBJOTE1X0dNICovCisJSU5URUxfVkdBX0RFVklDRSgweDI3NzIsICZpbnRlbF9pOTQ1Z19pbmZvKSwJCS8qIEk5NDVfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyN2EyLCAmaW50ZWxfaTk0NWdtX2luZm8pLAkJLyogSTk0NV9HTSAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyN2FlLCAmaW50ZWxfaTk0NWdtX2luZm8pLAkJLyogSTk0NV9HTUUgKi8KKwlJTlRFTF9WR0FfREVWSUNFKDB4Mjk3MiwgJmludGVsX2k5NjVnX2luZm8pLAkJLyogSTk0Nl9HWiAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOTgyLCAmaW50ZWxfaTk2NWdfaW5mbyksCQkvKiBHMzVfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOTkyLCAmaW50ZWxfaTk2NWdfaW5mbyksCQkvKiBJOTY1X1EgKi8KKwlJTlRFTF9WR0FfREVWSUNFKDB4MjlhMiwgJmludGVsX2k5NjVnX2luZm8pLAkJLyogSTk2NV9HICovCisJSU5URUxfVkdBX0RFVklDRSgweDI5YjIsICZpbnRlbF9nMzNfaW5mbyksCQkvKiBRMzVfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyOWMyLCAmaW50ZWxfZzMzX2luZm8pLAkJLyogRzMzX0cgKi8KKwlJTlRFTF9WR0FfREVWSUNFKDB4MjlkMiwgJmludGVsX2czM19pbmZvKSwJCS8qIFEzM19HICovCisJSU5URUxfVkdBX0RFVklDRSgweDJhMDIsICZpbnRlbF9pOTY1Z21faW5mbyksCQkvKiBJOTY1X0dNICovCisJSU5URUxfVkdBX0RFVklDRSgweDJhMTIsICZpbnRlbF9pOTY1Z21faW5mbyksCQkvKiBJOTY1X0dNRSAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyYTQyLCAmaW50ZWxfZ200NV9pbmZvKSwJCS8qIEdNNDVfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyZTAyLCAmaW50ZWxfZzQ1X2luZm8pLAkJLyogSUdEX0VfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyZTEyLCAmaW50ZWxfZzQ1X2luZm8pLAkJLyogUTQ1X0cgKi8KKwlJTlRFTF9WR0FfREVWSUNFKDB4MmUyMiwgJmludGVsX2c0NV9pbmZvKSwJCS8qIEc0NV9HICovCisJSU5URUxfVkdBX0RFVklDRSgweDJlMzIsICZpbnRlbF9nNDVfaW5mbyksCQkvKiBHNDFfRyAqLworCUlOVEVMX1ZHQV9ERVZJQ0UoMHgyZTQyLCAmaW50ZWxfZzQ1X2luZm8pLAkJLyogQjQzX0cgKi8KIAlJTlRFTF9WR0FfREVWSUNFKDB4YTAwMSwgJmludGVsX3BpbmV2aWV3X2luZm8pLAogCUlOVEVMX1ZHQV9ERVZJQ0UoMHhhMDExLCAmaW50ZWxfcGluZXZpZXdfaW5mbyksCiAJSU5URUxfVkdBX0RFVklDRSgweDAwNDIsICZpbnRlbF9pcm9ubGFrZV9kX2luZm8pLApAQCAtMzQwLDcgKzM0MCw3IEBACiAJLyoKIAkgKiBDbGVhciByZXF1ZXN0IGxpc3QKIAkgKi8KLQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKKwlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoZGV2KTsKIAogCWlmIChuZWVkX2Rpc3BsYXkpCiAJCWk5MTVfc2F2ZV9kaXNwbGF5KGRldik7CkBAIC00MTMsNyArNDEzLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBpOTE1X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlyZXR1cm4gZHJtX2dldF9kZXYocGRldiwgZW50LCAmZHJpdmVyKTsKKwlyZXR1cm4gZHJtX2dldF9wY2lfZGV2KHBkZXYsIGVudCwgJmRyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC00ODIsNyArNDgyLDcgQEAKIAlyZXR1cm4gaTkxNV9kcm1fZnJlZXplKGRybV9kZXYpOwogfQogCi1jb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpOTE1X3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpOTE1X3BtX29wcyA9IHsKICAgICAgLnN1c3BlbmQgPSBpOTE1X3BtX3N1c3BlbmQsCiAgICAgIC5yZXN1bWUgPSBpOTE1X3BtX3Jlc3VtZSwKICAgICAgLmZyZWV6ZSA9IGk5MTVfcG1fZnJlZXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggMmUxNzQ0ZC4uOTA2NjYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0xNzYsNyArMTc2LDggQEAKIAlpbnQgKCpnZXRfZGlzcGxheV9jbG9ja19zcGVlZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAJaW50ICgqZ2V0X2ZpZm9fc2l6ZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKTsKIAl2b2lkICgqdXBkYXRlX3dtKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2NrLAotCQkJICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBwaXhlbF9zaXplKTsKKwkJCSAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5LCBpbnQgc3JfaHRvdGFsLAorCQkJICBpbnQgcGl4ZWxfc2l6ZSk7CiAJLyogY2xvY2sgdXBkYXRlcyBmb3IgbW9kZSBzZXQgKi8KIAkvKiBjdXJzb3IgdXBkYXRlcyAqLwogCS8qIHJlbmRlciBjbG9jayBpbmNyZWFzZS9kZWNyZWFzZSAqLwpAQCAtMjAwLDYgKzIwMSw4IEBACiAJdTggbmVlZF9nZnhfaHdzIDogMTsKIAl1OCBpc19nNHggOiAxOwogCXU4IGlzX3BpbmV2aWV3IDogMTsKKwl1OCBpc19icm9hZHdhdGVyIDogMTsKKwl1OCBpc19jcmVzdGxpbmUgOiAxOwogCXU4IGlzX2lyb25sYWtlIDogMTsKIAl1OCBpc19nZW42IDogMTsKIAl1OCBoYXNfZmJjIDogMTsKQEAgLTI4OCw2ICsyOTEsOCBAQAogCXN0cnVjdCB0aW1lcl9saXN0IGhhbmdjaGVja190aW1lcjsKIAlpbnQgaGFuZ2NoZWNrX2NvdW50OwogCXVpbnQzMl90IGxhc3RfYWN0aGQ7CisJdWludDMyX3QgbGFzdF9pbnN0ZG9uZTsKKwl1aW50MzJfdCBsYXN0X2luc3Rkb25lMTsKIAogCXN0cnVjdCBkcm1fbW0gdnJhbTsKIApAQCAtNTQ3LDYgKzU1MiwxNCBAQAogCQlzdHJ1Y3QgbGlzdF9oZWFkIGZlbmNlX2xpc3Q7CiAKIAkJLyoqCisJCSAqIExpc3Qgb2Ygb2JqZWN0cyBjdXJyZW50bHkgcGVuZGluZyBiZWluZyBmcmVlZC4KKwkJICoKKwkJICogVGhlc2Ugb2JqZWN0cyBhcmUgbm8gbG9uZ2VyIGluIHVzZSwgYnV0IGR1ZSB0byBhIHNpZ25hbAorCQkgKiB3ZSB3ZXJlIHByZXZlbnRlZCBmcm9tIGZyZWVpbmcgdGhlbSBhdCB0aGUgYXBwb2ludGVkIHRpbWUuCisJCSAqLworCQlzdHJ1Y3QgbGlzdF9oZWFkIGRlZmVycmVkX2ZyZWVfbGlzdDsKKworCQkvKioKIAkJICogV2UgbGVhdmUgdGhlIHVzZXIgSVJRIG9mZiBhcyBtdWNoIGFzIHBvc3NpYmxlLAogCQkgKiBidXQgdGhpcyBtZWFucyB0aGF0IHJlcXVlc3RzIHdpbGwgZmluaXNoIGFuZCBuZXZlcgogCQkgKiBiZSByZXRpcmVkIG9uY2UgdGhlIHN5c3RlbSBnb2VzIGlkbGUuIFNldCBhIHRpbWVyIHRvCkBAIC02NzcsNyArNjkwLDcgQEAKIAkgKgogCSAqIFNpemU6IDQgYml0cyBmb3IgMTYgZmVuY2VzICsgc2lnbiAoZm9yIEZFTkNFX1JFR19OT05FKQogCSAqLwotCWludCBmZW5jZV9yZWcgOiA1OworCXNpZ25lZCBpbnQgZmVuY2VfcmVnIDogNTsKIAogCS8qKgogCSAqIFVzZWQgZm9yIGNoZWNraW5nIHRoZSBvYmplY3QgZG9lc24ndCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UKQEAgLTcxMyw3ICs3MjYsNyBAQAogCSAqCiAJICogSW4gdGhlIHdvcnN0IGNhc2UgdGhpcyBpcyAxICsgMSArIDEgKyAyKjIgPSA3LiBUaGF0IHdvdWxkIGZpdCBpbnRvIDMKIAkgKiBiaXRzIHdpdGggYWJzb2x1dGVseSBubyBoZWFkcm9vbS4gU28gdXNlIDQgYml0cy4gKi8KLQlpbnQgcGluX2NvdW50IDogNDsKKwl1bnNpZ25lZCBpbnQgcGluX2NvdW50IDogNDsKICNkZWZpbmUgRFJNX0k5MTVfR0VNX09CSkVDVF9NQVhfUElOX0NPVU5UIDB4ZgogCiAJLyoqIEFHUCBtZW1vcnkgc3RydWN0dXJlIGZvciBvdXIgR1RUIGJpbmRpbmcuICovCkBAIC03NDMsNyArNzU2LDcgQEAKIAl1aW50MzJfdCBzdHJpZGU7CiAKIAkvKiogUmVjb3JkIG9mIGFkZHJlc3MgYml0IDE3IG9mIGVhY2ggcGFnZSBhdCBsYXN0IHVuYmluZC4gKi8KLQlsb25nICpiaXRfMTc7CisJdW5zaWduZWQgbG9uZyAqYml0XzE3OwogCiAJLyoqIEFHUCBtYXBwaW5nIHR5cGUgKEFHUF9VU0VSX01FTU9SWSBvciBBR1BfVVNFUl9DQUNIRURfTUVNT1JZICovCiAJdWludDMyX3QgYWdwX3R5cGU7CkBAIC05NTUsOCArOTY4LDcgQEAKIGJvb2wgaTkxNV9zZXFub19wYXNzZWQodWludDMyX3Qgc2VxMSwgdWludDMyX3Qgc2VxMik7CiBpbnQgaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogaW50IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLXZvaWQgaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGk5MTVfZ2VtX3JldGlyZV93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLApAQCAtOTg2LDcgKzk5OCw3IEBACiBpbnQgaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgZ2ZwX3QgZ2ZwbWFzayk7CiB2b2lkIGk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogdm9pZCBpOTE1X2dlbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworaW50IGk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogCiB2b2lkIGk5MTVfZ2VtX3Nocmlua2VyX2luaXQodm9pZCk7CiB2b2lkIGk5MTVfZ2VtX3Nocmlua2VyX2V4aXQodm9pZCk7CkBAIC0xMDQ2LDYgKzEwNTgsNyBAQAogZXh0ZXJuIGludCBpbnRlbF9tb2Rlc2V0X3ZnYV9zZXRfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBzdGF0ZSk7CiBleHRlcm4gdm9pZCBpOHh4X2Rpc2FibGVfZmJjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgZzR4X2Rpc2FibGVfZmJjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaXJvbmxha2VfZGlzYWJsZV9mYmMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF9kaXNhYmxlX2ZiYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2VuYWJsZV9mYmMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBsb25nIGludGVydmFsKTsKIGV4dGVybiBib29sIGludGVsX2ZiY19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTEzNSw2ICsxMTQ4LDggQEAKICNkZWZpbmUgSVNfSTk0NUdNKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2k5NDVnbSkKICNkZWZpbmUgSVNfSTk2NUcoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aXNfaTk2NWcpCiAjZGVmaW5lIElTX0k5NjVHTShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTY1Z20pCisjZGVmaW5lIElTX0JST0FEV0FURVIoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19icm9hZHdhdGVyKQorI2RlZmluZSBJU19DUkVTVExJTkUoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19jcmVzdGxpbmUpCiAjZGVmaW5lIElTX0dNNDUoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkE0MikKICNkZWZpbmUgSVNfRzRYKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2c0eCkKICNkZWZpbmUgSVNfUElORVZJRVdfRyhkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCA1YWE3NDdmLi4yYTRlZDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKK3N0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCkBAIC01Myw2ICs1Myw3IEBACiBzdGF0aWMgaW50IGk5MTVfZ2VtX3BoeXNfcHdyaXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAogCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzLAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0X3RhaWwoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogCiBzdGF0aWMgTElTVF9IRUFEKHNocmlua19saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2hyaW5rX2xpc3RfbG9jayk7CkBAIC0xMjcsOCArMTI4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBvYmosICZoYW5kbGUpOwotCWRybV9nZW1fb2JqZWN0X2hhbmRsZV91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOwotCisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC00OTYsMTAgKzQ5NiwxMCBAQAogCWNoYXIgKnZhZGRyX2F0b21pYzsKIAl1bnNpZ25lZCBsb25nIHVud3JpdHRlbjsKIAotCXZhZGRyX2F0b21pYyA9IGlvX21hcHBpbmdfbWFwX2F0b21pY193YyhtYXBwaW5nLCBwYWdlX2Jhc2UpOworCXZhZGRyX2F0b21pYyA9IGlvX21hcHBpbmdfbWFwX2F0b21pY193YyhtYXBwaW5nLCBwYWdlX2Jhc2UsIEtNX1VTRVIwKTsKIAl1bndyaXR0ZW4gPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUodmFkZHJfYXRvbWljICsgcGFnZV9vZmZzZXQsCiAJCQkJCQkgICAgICB1c2VyX2RhdGEsIGxlbmd0aCk7Ci0JaW9fbWFwcGluZ191bm1hcF9hdG9taWModmFkZHJfYXRvbWljKTsKKwlpb19tYXBwaW5nX3VubWFwX2F0b21pYyh2YWRkcl9hdG9taWMsIEtNX1VTRVIwKTsKIAlpZiAodW53cml0dGVuKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKQEAgLTE3MDksOSArMTcwOSw5IEBACiAvKioKICAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSByZXF1ZXN0IGxpc3QgYXMgc2VxdWVuY2UgbnVtYmVycyBhcmUgcGFzc2VkLgogICovCi12b2lkCi1pOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIHZvaWQKK2k5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3Qgc2Vxbm87CkBAIC0xNzUxLDYgKzE3NTEsMzAgQEAKIH0KIAogdm9pZAoraTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5kZWZlcnJlZF9mcmVlX2xpc3QpKSB7CisJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiwgKnRtcDsKKworCSAgICAvKiBXZSBtdXN0IGJlIGNhcmVmdWwgdGhhdCBkdXJpbmcgdW5iaW5kKCkgd2UgZG8gbm90CisJICAgICAqIGFjY2lkZW50YWxseSBpbmZpbml0ZWx5IHJlY3Vyc2UgaW50byByZXRpcmUgcmVxdWVzdHMuCisJICAgICAqIEN1cnJlbnRseToKKwkgICAgICogICByZXRpcmUgLT4gZnJlZSAtPiB1bmJpbmQgLT4gd2FpdCAtPiByZXRpcmVfcmluZworCSAgICAgKi8KKwkgICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCB0bXAsCisJCQkJICAgICAmZGV2X3ByaXYtPm1tLmRlZmVycmVkX2ZyZWVfbGlzdCwKKwkJCQkgICAgIGxpc3QpCisJCSAgICBpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKCZvYmpfcHJpdi0+YmFzZSk7CisJfQorCisJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzX3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKKwlpZiAoSEFTX0JTRChkZXYpKQorCQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOworfQorCit2b2lkCiBpOTE1X2dlbV9yZXRpcmVfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2OwpAQCAtMTc2MSwxMCArMTc4NSw3IEBACiAJZGV2ID0gZGV2X3ByaXYtPmRldjsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQotCWlmIChIQVNfQlNEKGRldikpCi0JCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOworCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOwogCiAJaWYgKCFkZXZfcHJpdi0+bW0uc3VzcGVuZGVkICYmCiAJCSghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnJlcXVlc3RfbGlzdCkgfHwKQEAgLTE4MzIsNyArMTg1Myw3IEBACiAJICogYSBzZXBhcmF0ZSB3YWl0IHF1ZXVlIHRvIGhhbmRsZSB0aGF0LgogCSAqLwogCWlmIChyZXQgPT0gMCkKLQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldiwgcmluZyk7CisJCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKGRldiwgcmluZyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk0NSwxMSArMTk2NiwxMiBAQAogCSAqIGJlZm9yZSB3ZSB1bmJpbmQuCiAJICovCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKG9iaiwgMSk7Ci0JaWYgKHJldCkgewotCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKLQkJCURSTV9FUlJPUigic2V0X2RvbWFpbiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQogCQlyZXR1cm4gcmV0OwotCX0KKwkvKiBDb250aW51ZSBvbiBpZiB3ZSBmYWlsIGR1ZSB0byBFSU8sIHRoZSBHUFUgaXMgaHVuZyBzbyB3ZQorCSAqIHNob3VsZCBiZSBzYWZlIGFuZCB3ZSBuZWVkIHRvIGNsZWFudXAgb3IgZWxzZSB3ZSBtaWdodAorCSAqIGNhdXNlIG1lbW9yeSBjb3JydXB0aW9uIHRocm91Z2ggdXNlLWFmdGVyLWZyZWUuCisJICovCiAKIAlCVUdfT04ob2JqX3ByaXYtPmFjdGl2ZSk7CiAKQEAgLTE5ODUsNyArMjAwNyw3IEBACiAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoKQEAgLTIxMDcsMTAgKzIxMjksNyBAQAogCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmVuZGVyX3JpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOwogCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqYnNkX3JpbmcgPSAmZGV2X3ByaXYtPmJzZF9yaW5nOwogCWZvciAoOzspIHsKLQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldiwgcmVuZGVyX3JpbmcpOwotCi0JCWlmIChIQVNfQlNEKGRldikpCi0JCQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoZGV2LCBic2RfcmluZyk7CisJCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOwogCiAJCS8qIElmIHRoZXJlJ3MgYW4gaW5hY3RpdmUgYnVmZmVyIGF2YWlsYWJsZSBub3csIGdyYWIgaXQKIAkJICogYW5kIGJlIGRvbmUuCkBAIC0yNTgzLDcgKzI2MDIsMTAgQEAKIAlpZiAoIUlTX0k5NjVHKGRldikpIHsKIAkJaW50IHJldDsKIAotCQlpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhvYmopOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtMjYzNCwxMCArMjY1Niw4IEBACiAJaWYgKGZyZWVfc3BhY2UgIT0gTlVMTCkgewogCQlvYmpfcHJpdi0+Z3R0X3NwYWNlID0gZHJtX21tX2dldF9ibG9jayhmcmVlX3NwYWNlLCBvYmotPnNpemUsCiAJCQkJCQkgICAgICAgYWxpZ25tZW50KTsKLQkJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgIT0gTlVMTCkgewotCQkJb2JqX3ByaXYtPmd0dF9zcGFjZS0+cHJpdmF0ZSA9IG9iajsKKwkJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgIT0gTlVMTCkKIAkJCW9ial9wcml2LT5ndHRfb2Zmc2V0ID0gb2JqX3ByaXYtPmd0dF9zcGFjZS0+c3RhcnQ7Ci0JCX0KIAl9CiAJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkgewogCQkvKiBJZiB0aGUgZ3R0IGlzIGVtcHR5IGFuZCB3ZSdyZSBzdGlsbCBoYXZpbmcgdHJvdWJsZQpAQCAtMjczMyw3ICsyNzUzLDcgQEAKIH0KIAogLyoqIEZsdXNoZXMgYW55IEdQVSB3cml0ZSBkb21haW4gZm9yIHRoZSBvYmplY3QgaWYgaXQncyBkaXJ0eS4gKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CkBAIC0yNzQxLDE3ICsyNzYxLDE4IEBACiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAogCWlmICgob2JqLT53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykgPT0gMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCS8qIFF1ZXVlIHRoZSBHUFUgd3JpdGUgY2FjaGUgZmx1c2hpbmcgd2UgbmVlZC4gKi8KIAlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47CiAJaTkxNV9nZW1fZmx1c2goZGV2LCAwLCBvYmotPndyaXRlX2RvbWFpbik7Ci0JKHZvaWQpIGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCBvYmotPndyaXRlX2RvbWFpbiwgb2JqX3ByaXYtPnJpbmcpOwotCUJVR19PTihvYmotPndyaXRlX2RvbWFpbik7CisJaWYgKGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCBvYmotPndyaXRlX2RvbWFpbiwgb2JqX3ByaXYtPnJpbmcpID09IDApCisJCXJldHVybiAtRU5PTUVNOwogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAogCQkJCQkgICAgb2JqLT5yZWFkX2RvbWFpbnMsCiAJCQkJCSAgICBvbGRfd3JpdGVfZG9tYWluKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqIEZsdXNoZXMgdGhlIEdUVCB3cml0ZSBkb21haW4gZm9yIHRoZSBvYmplY3QgaWYgaXQncyBkaXJ0eS4gKi8KQEAgLTI3OTUsOSArMjgxNiwxMSBAQAogCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7CiB9CiAKLXZvaWQKK2ludAogaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKKwlpbnQgcmV0ID0gMDsKKwogCXN3aXRjaCAob2JqLT53cml0ZV9kb21haW4pIHsKIAljYXNlIEk5MTVfR0VNX0RPTUFJTl9HVFQ6CiAJCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ndHRfd3JpdGVfZG9tYWluKG9iaik7CkBAIC0yODA2LDkgKzI4MjksMTEgQEAKIAkJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4ob2JqKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKIAkJYnJlYWs7CiAJfQorCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0yODI4LDcgKzI4NTMsMTAgQEAKIAlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7CisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKIAkvKiBXYWl0IG9uIGFueSBHUFUgcmVuZGVyaW5nIGFuZCBmbHVzaGluZyB0byBvY2N1ci4gKi8KIAlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqKTsKIAlpZiAocmV0ICE9IDApCkBAIC0yODc4LDcgKzI5MDYsOSBAQAogCWlmIChvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBXYWl0IG9uIGFueSBHUFUgcmVuZGVyaW5nIGFuZCBmbHVzaGluZyB0byBvY2N1ci4gKi8KIAlpZiAob2JqX3ByaXYtPmFjdGl2ZSkgewpAQCAtMjkyNiw3ICsyOTU2LDEwIEBACiAJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiwgb2xkX3JlYWRfZG9tYWluczsKIAlpbnQgcmV0OwogCi0JaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBXYWl0IG9uIGFueSBHUFUgcmVuZGVyaW5nIGFuZCBmbHVzaGluZyB0byBvY2N1ci4gKi8KIAlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqKTsKIAlpZiAocmV0ICE9IDApCkBAIC0zMjE2LDcgKzMyNDksMTAgQEAKIAlpZiAob2Zmc2V0ID09IDAgJiYgc2l6ZSA9PSBvYmotPnNpemUpCiAJCXJldHVybiBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4ob2JqLCAwKTsKIAotCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7CisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogV2FpdCBvbiBhbnkgR1BVIHJlbmRlcmluZyBhbmQgZmx1c2hpbmcgdG8gb2NjdXIuICovCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaik7CiAJaWYgKHJldCAhPSAwKQpAQCAtMzQ1MSw3ICszNDg3LDggQEAKIAkJcmVsb2Nfb2Zmc2V0ID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgKyByZWxvYy0+b2Zmc2V0OwogCQlyZWxvY19wYWdlID0gaW9fbWFwcGluZ19tYXBfYXRvbWljX3djKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZywKIAkJCQkJCSAgICAgIChyZWxvY19vZmZzZXQgJgotCQkJCQkJICAgICAgIH4oUEFHRV9TSVpFIC0gMSkpKTsKKwkJCQkJCSAgICAgICB+KFBBR0VfU0laRSAtIDEpKSwKKwkJCQkJCSAgICAgIEtNX1VTRVIwKTsKIAkJcmVsb2NfZW50cnkgPSAodWludDMyX3QgX19pb21lbSAqKShyZWxvY19wYWdlICsKIAkJCQkJCSAgIChyZWxvY19vZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSkpKTsKIAkJcmVsb2NfdmFsID0gdGFyZ2V0X29ial9wcml2LT5ndHRfb2Zmc2V0ICsgcmVsb2MtPmRlbHRhOwpAQCAtMzQ2Miw3ICszNDk5LDcgQEAKIAkJCSAgcmVhZGwocmVsb2NfZW50cnkpLCByZWxvY192YWwpOwogI2VuZGlmCiAJCXdyaXRlbChyZWxvY192YWwsIHJlbG9jX2VudHJ5KTsKLQkJaW9fbWFwcGluZ191bm1hcF9hdG9taWMocmVsb2NfcGFnZSk7CisJCWlvX21hcHBpbmdfdW5tYXBfYXRvbWljKHJlbG9jX3BhZ2UsIEtNX1VTRVIwKTsKIAogCQkvKiBUaGUgdXBkYXRlZCBwcmVzdW1lZCBvZmZzZXQgZm9yIHRoaXMgZW50cnkgd2lsbCBiZQogCQkgKiBjb3BpZWQgYmFjayBvdXQgdG8gdGhlIHVzZXIuCkBAIC00MzEzLDcgKzQzNTAsNiBAQAogCXN0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSAqYXJncyA9IGRhdGE7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOwogCWlmIChvYmogPT0gTlVMTCkgewpAQCAtNDMyOCwxMCArNDM2NCw3IEBACiAJICogYWN0dWFsbHkgdW5tYXNrZWQsIGFuZCBvdXIgd29ya2luZyBzZXQgZW5kcyB1cCBiZWluZyBsYXJnZXIgdGhhbgogCSAqIHJlcXVpcmVkLgogCSAqLwotCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOwotCi0JaWYgKEhBU19CU0QoZGV2KSkKLQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7CisJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CiAKIAlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJLyogRG9uJ3QgY291bnQgYmVpbmcgb24gdGhlIGZsdXNoaW5nIGxpc3QgYWdhaW5zdCB0aGUgb2JqZWN0IGJlaW5nCkBAIC00NDQxLDYgKzQ0NzQsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3RfdGFpbChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlpbnQgcmV0OworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOworCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCWxpc3RfbW92ZSgmb2JqX3ByaXYtPmxpc3QsCisJCQkgICZkZXZfcHJpdi0+bW0uZGVmZXJyZWRfZnJlZV9saXN0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvYmpfcHJpdi0+bW1hcF9vZmZzZXQpCisJCWk5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQob2JqKTsKKworCWRybV9nZW1fb2JqZWN0X3JlbGVhc2Uob2JqKTsKKworCWtmcmVlKG9ial9wcml2LT5wYWdlX2NwdV92YWxpZCk7CisJa2ZyZWUob2JqX3ByaXYtPmJpdF8xNyk7CisJa2ZyZWUob2JqX3ByaXYpOworfQorCiB2b2lkIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKQEAgLTQ0NTQsMTYgKzQ1MTEsNyBAQAogCWlmIChvYmpfcHJpdi0+cGh5c19vYmopCiAJCWk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChkZXYsIG9iaik7CiAKLQlpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7Ci0KLQlpZiAob2JqX3ByaXYtPm1tYXBfb2Zmc2V0KQotCQlpOTE1X2dlbV9mcmVlX21tYXBfb2Zmc2V0KG9iaik7Ci0KLQlkcm1fZ2VtX29iamVjdF9yZWxlYXNlKG9iaik7Ci0KLQlrZnJlZShvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQpOwotCWtmcmVlKG9ial9wcml2LT5iaXRfMTcpOwotCWtmcmVlKG9ial9wcml2KTsKKwlpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKG9iaik7CiB9CiAKIC8qKiBVbmJpbmRzIGFsbCBpbmFjdGl2ZSBvYmplY3RzLiAqLwpAQCAtNDY4OSw5ICs0NzM3LDE5IEBACiAJQlVHX09OKEhBU19CU0QoZGV2KSAmJiAhbGlzdF9lbXB0eSgmZGV2X3ByaXYtPmJzZF9yaW5nLnJlcXVlc3RfbGlzdCkpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JZHJtX2lycV9pbnN0YWxsKGRldik7CisJcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldik7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwX3JpbmdidWZmZXI7CiAKIAlyZXR1cm4gMDsKKworY2xlYW51cF9yaW5nYnVmZmVyOgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoZGV2KTsKKwlkZXZfcHJpdi0+bW0uc3VzcGVuZGVkID0gMTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIGludApAQCAtNDcyOSw2ICs0Nzg3LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPm1tLmdwdV93cml0ZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5tbS5kZWZlcnJlZF9mcmVlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcuYWN0aXZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0KTsKIAlpZiAoSEFTX0JTRChkZXYpKSB7CkBAIC01MDI3LDEwICs1MDg2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fdW5sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0KLQkJaWYgKEhBU19CU0QoZGV2KSkKLQkJCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOworCQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoZGV2KTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqX3ByaXYsIG5leHRfb2JqLAogCQkJCQkgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYwppbmRleCA0YjdjNDlkLi4xNTU3MTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYwpAQCAtMzMzLDggKzMzMyw2IEBACiAJCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKIAogCQlpZiAocmV0ICE9IDApIHsKLQkJCVdBUk4ocmV0ICE9IC1FUkVTVEFSVFNZUywKLQkJCSAgICAgImZhaWxlZCB0byByZXNldCBvYmplY3QgZm9yIHRpbGluZyBzd2l0Y2giKTsKIAkJCWFyZ3MtPnRpbGluZ19tb2RlID0gb2JqX3ByaXYtPnRpbGluZ19tb2RlOwogCQkJYXJncy0+c3RyaWRlID0gb2JqX3ByaXYtPnN0cmlkZTsKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKaW5kZXggZGJhNTNkNC4uODU3ODVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCkBAIC0xNzEsMTAgKzE3MSwxMCBAQAogCQlpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIERFX0dTRSk7CiAJZWxzZSB7CiAJCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCAxLAotCQkJCSAgICAgSTkxNV9MRUdBQ1lfQkxDX0VWRU5UX0VOQUJMRSk7CisJCQkJICAgICBQSVBFX0xFR0FDWV9CTENfRVZFTlRfRU5BQkxFKTsKIAkJaWYgKElTX0k5NjVHKGRldikpCiAJCQlpOTE1X2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgMCwKLQkJCQkJICAgICBJOTE1X0xFR0FDWV9CTENfRVZFTlRfRU5BQkxFKTsKKwkJCQkJICAgICBQSVBFX0xFR0FDWV9CTENfRVZFTlRfRU5BQkxFKTsKIAl9CiB9CiAKQEAgLTg0Miw3ICs4NDIsNiBAQAogCXUzMiBpaXIsIG5ld19paXI7CiAJdTMyIHBpcGVhX3N0YXRzLCBwaXBlYl9zdGF0czsKIAl1MzIgdmJsYW5rX3N0YXR1czsKLQl1MzIgdmJsYW5rX2VuYWJsZTsKIAlpbnQgdmJsYW5rID0gMDsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCWludCBpcnFfcmVjZWl2ZWQ7CkBAIC04NTYsMTMgKzg1NSwxMCBAQAogCiAJaWlyID0gSTkxNV9SRUFEKElJUik7CiAKLQlpZiAoSVNfSTk2NUcoZGV2KSkgewotCQl2Ymxhbmtfc3RhdHVzID0gSTkxNV9TVEFSVF9WQkxBTktfSU5URVJSVVBUX1NUQVRVUzsKLQkJdmJsYW5rX2VuYWJsZSA9IFBJUEVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9FTkFCTEU7Ci0JfSBlbHNlIHsKLQkJdmJsYW5rX3N0YXR1cyA9IEk5MTVfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVM7Ci0JCXZibGFua19lbmFibGUgPSBJOTE1X1ZCTEFOS19JTlRFUlJVUFRfRU5BQkxFOwotCX0KKwlpZiAoSVNfSTk2NUcoZGV2KSkKKwkJdmJsYW5rX3N0YXR1cyA9IFBJUEVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVM7CisJZWxzZQorCQl2Ymxhbmtfc3RhdHVzID0gUElQRV9WQkxBTktfSU5URVJSVVBUX1NUQVRVUzsKIAogCWZvciAoOzspIHsKIAkJaXJxX3JlY2VpdmVkID0gaWlyICE9IDA7CkBAIC05NjYsOCArOTYyLDggQEAKIAkJCQlpbnRlbF9maW5pc2hfcGFnZV9mbGlwKGRldiwgMSk7CiAJCX0KIAotCQlpZiAoKHBpcGVhX3N0YXRzICYgSTkxNV9MRUdBQ1lfQkxDX0VWRU5UX1NUQVRVUykgfHwKLQkJICAgIChwaXBlYl9zdGF0cyAmIEk5MTVfTEVHQUNZX0JMQ19FVkVOVF9TVEFUVVMpIHx8CisJCWlmICgocGlwZWFfc3RhdHMgJiBQSVBFX0xFR0FDWV9CTENfRVZFTlRfU1RBVFVTKSB8fAorCQkgICAgKHBpcGViX3N0YXRzICYgUElQRV9MRUdBQ1lfQkxDX0VWRU5UX1NUQVRVUykgfHwKIAkJICAgIChpaXIgJiBJOTE1X0FTTEVfSU5URVJSVVBUKSkKIAkJCW9wcmVnaW9uX2FzbGVfaW50cihkZXYpOwogCkBAIC0xMjMzLDE2ICsxMjI5LDIxIEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWRhdGE7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdWludDMyX3QgYWN0aGQ7CisJdWludDMyX3QgYWN0aGQsIGluc3Rkb25lLCBpbnN0ZG9uZTE7CiAKIAkvKiBObyByZXNldCBzdXBwb3J0IG9uIHRoaXMgY2hpcCB5ZXQuICovCiAJaWYgKElTX0dFTjYoZGV2KSkKIAkJcmV0dXJuOwogCi0JaWYgKCFJU19JOTY1RyhkZXYpKQorCWlmICghSVNfSTk2NUcoZGV2KSkgewogCQlhY3RoZCA9IEk5MTVfUkVBRChBQ1RIRCk7Ci0JZWxzZQorCQlpbnN0ZG9uZSA9IEk5MTVfUkVBRChJTlNURE9ORSk7CisJCWluc3Rkb25lMSA9IDA7CisJfSBlbHNlIHsKIAkJYWN0aGQgPSBJOTE1X1JFQUQoQUNUSERfSTk2NSk7CisJCWluc3Rkb25lID0gSTkxNV9SRUFEKElOU1RET05FX0k5NjUpOworCQlpbnN0ZG9uZTEgPSBJOTE1X1JFQUQoSU5TVERPTkUxKTsKKwl9CiAKIAkvKiBJZiBhbGwgd29yayBpcyBkb25lIHRoZW4gQUNUSEQgY2xlYXJseSBoYXNuJ3QgYWR2YW5jZWQuICovCiAJaWYgKGxpc3RfZW1wdHkoJmRldl9wcml2LT5yZW5kZXJfcmluZy5yZXF1ZXN0X2xpc3QpIHx8CkBAIC0xMjUzLDIxICsxMjU0LDI0IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZGV2X3ByaXYtPmxhc3RfYWN0aGQgPT0gYWN0aGQgJiYgZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCA+IDApIHsKLQkJRFJNX0VSUk9SKCJIYW5nY2hlY2sgdGltZXIgZWxhcHNlZC4uLiBHUFUgaHVuZ1xuIik7Ci0JCWk5MTVfaGFuZGxlX2Vycm9yKGRldiwgdHJ1ZSk7Ci0JCXJldHVybjsKLQl9IAorCWlmIChkZXZfcHJpdi0+bGFzdF9hY3RoZCA9PSBhY3RoZCAmJgorCSAgICBkZXZfcHJpdi0+bGFzdF9pbnN0ZG9uZSA9PSBpbnN0ZG9uZSAmJgorCSAgICBkZXZfcHJpdi0+bGFzdF9pbnN0ZG9uZTEgPT0gaW5zdGRvbmUxKSB7CisJCWlmIChkZXZfcHJpdi0+aGFuZ2NoZWNrX2NvdW50KysgPiAxKSB7CisJCQlEUk1fRVJST1IoIkhhbmdjaGVjayB0aW1lciBlbGFwc2VkLi4uIEdQVSBodW5nXG4iKTsKKwkJCWk5MTVfaGFuZGxlX2Vycm9yKGRldiwgdHJ1ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlkZXZfcHJpdi0+aGFuZ2NoZWNrX2NvdW50ID0gMDsKKworCQlkZXZfcHJpdi0+bGFzdF9hY3RoZCA9IGFjdGhkOworCQlkZXZfcHJpdi0+bGFzdF9pbnN0ZG9uZSA9IGluc3Rkb25lOworCQlkZXZfcHJpdi0+bGFzdF9pbnN0ZG9uZTEgPSBpbnN0ZG9uZTE7CisJfQogCiAJLyogUmVzZXQgdGltZXIgY2FzZSBjaGlwIGhhbmdzIHdpdGhvdXQgYW5vdGhlciByZXF1ZXN0IGJlaW5nIGFkZGVkICovCiAJbW9kX3RpbWVyKCZkZXZfcHJpdi0+aGFuZ2NoZWNrX3RpbWVyLCBqaWZmaWVzICsgRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCk7Ci0KLQlpZiAoYWN0aGQgIT0gZGV2X3ByaXYtPmxhc3RfYWN0aGQpCi0JCWRldl9wcml2LT5oYW5nY2hlY2tfY291bnQgPSAwOwotCWVsc2UKLQkJZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCsrOwotCi0JZGV2X3ByaXYtPmxhc3RfYWN0aGQgPSBhY3RoZDsKIH0KIAogLyogZHJtX2RtYS5oIGhvb2tzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBjZjQxYzY3Li4yODFkYjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTQ0Miw3ICs0NDIsNyBAQAogI2RlZmluZSBHRU42X1JFTkRFUl9JTVIJCTB4MjBhOAogI2RlZmluZSAgIEdFTjZfUkVOREVSX0NPTlRFWFRfU1dJVENIX0lOVEVSUlVQVAkJKDEgPDwgOCkKICNkZWZpbmUgICBHRU42X1JFTkRFUl9QUEdUVF9QQUdFX0ZBVUxUCQkJKDEgPDwgNykKLSNkZWZpbmUgICBHRU42X1JFTkRFUiBUSU1FT1VUX0NPVU5URVJfRVhQSVJFRAkJKDEgPDwgNikKKyNkZWZpbmUgICBHRU42X1JFTkRFUl9USU1FT1VUX0NPVU5URVJfRVhQSVJFRAkJKDEgPDwgNikKICNkZWZpbmUgICBHRU42X1JFTkRFUl9MM19QQVJJVFlfRVJST1IJCQkoMSA8PCA1KQogI2RlZmluZSAgIEdFTjZfUkVOREVSX1BJUEVfQ09OVFJPTF9OT1RJRllfSU5URVJSVVBUCSgxIDw8IDQpCiAjZGVmaW5lICAgR0VONl9SRU5ERVJfQ09NTUFORF9QQVJTRVJfTUFTVEVSX0VSUk9SCSgxIDw8IDMpCkBAIC01MzAsNiArNTMwLDIxIEBACiAjZGVmaW5lIERQRkNfQ0hJQ0tFTgkJMHgzMjI0CiAjZGVmaW5lICAgRFBGQ19IVF9NT0RJRlkJKDE8PDMxKQogCisvKiBGcmFtZWJ1ZmZlciBjb21wcmVzc2lvbiBmb3IgSXJvbmxha2UgKi8KKyNkZWZpbmUgSUxLX0RQRkNfQ0JfQkFTRQkweDQzMjAwCisjZGVmaW5lIElMS19EUEZDX0NPTlRST0wJMHg0MzIwOAorLyogVGhlIGJpdCAyOC04IGlzIHJlc2VydmVkICovCisjZGVmaW5lICAgRFBGQ19SRVNFUlZFRAkJKDB4MUZGRkZGMDApCisjZGVmaW5lIElMS19EUEZDX1JFQ09NUF9DVEwJMHg0MzIwYworI2RlZmluZSBJTEtfRFBGQ19TVEFUVVMJCTB4NDMyMTAKKyNkZWZpbmUgSUxLX0RQRkNfRkVOQ0VfWU9GRgkweDQzMjE4CisjZGVmaW5lIElMS19EUEZDX0NISUNLRU4JMHg0MzIyNAorI2RlZmluZSBJTEtfRkJDX1JUX0JBU0UJCTB4MjEyOAorI2RlZmluZSAgIElMS19GQkNfUlRfVkFMSUQJKDE8PDApCisKKyNkZWZpbmUgSUxLX0RJU1BMQVlfQ0hJQ0tFTjEJMHg0MjAwMAorI2RlZmluZSAgIElMS19GQkNRX0RJUwkJKDE8PDIyKQorCiAvKgogICogR1BJTyByZWdzCiAgKi8KQEAgLTU5NSwzMiArNjEwLDYgQEAKICNkZWZpbmUgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0sJMHgwMGZmMDAwMCAvKiBpOTE1ICovCiAjZGVmaW5lICAgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9NQVNLX1BJTkVWSUVXCTB4MDBmZjgwMDAgLyogUGluZXZpZXcgKi8KIAotI2RlZmluZSBJOTE1X0ZJRk9fVU5ERVJSVU5fU1RBVFVTCQkoMVVMPDwzMSkKLSNkZWZpbmUgSTkxNV9DUkNfRVJST1JfRU5BQkxFCQkJKDFVTDw8MjkpCi0jZGVmaW5lIEk5MTVfQ1JDX0RPTkVfRU5BQkxFCQkJKDFVTDw8MjgpCi0jZGVmaW5lIEk5MTVfR01CVVNfRVZFTlRfRU5BQkxFCQkJKDFVTDw8MjcpCi0jZGVmaW5lIEk5MTVfVlNZTkNfSU5URVJSVVBUX0VOQUJMRQkJKDFVTDw8MjUpCi0jZGVmaW5lIEk5MTVfRElTUExBWV9MSU5FX0NPTVBBUkVfRU5BQkxFCSgxVUw8PDI0KQotI2RlZmluZSBJOTE1X0RQU1RfRVZFTlRfRU5BQkxFCQkJKDFVTDw8MjMpCi0jZGVmaW5lIEk5MTVfTEVHQUNZX0JMQ19FVkVOVF9FTkFCTEUJCSgxVUw8PDIyKQotI2RlZmluZSBJOTE1X09ERF9GSUVMRF9JTlRFUlJVUFRfRU5BQkxFCQkoMVVMPDwyMSkKLSNkZWZpbmUgSTkxNV9FVkVOX0ZJRUxEX0lOVEVSUlVQVF9FTkFCTEUJKDFVTDw8MjApCi0jZGVmaW5lIEk5MTVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9FTkFCTEUJKDFVTDw8MTgpCS8qIDk2NSBvciBsYXRlciAqLwotI2RlZmluZSBJOTE1X1ZCTEFOS19JTlRFUlJVUFRfRU5BQkxFCQkoMVVMPDwxNykKLSNkZWZpbmUgSTkxNV9PVkVSTEFZX1VQREFURURfRU5BQkxFCQkoMVVMPDwxNikKLSNkZWZpbmUgSTkxNV9DUkNfRVJST1JfSU5URVJSVVBUX1NUQVRVUwkJKDFVTDw8MTMpCi0jZGVmaW5lIEk5MTVfQ1JDX0RPTkVfSU5URVJSVVBUX1NUQVRVUwkJKDFVTDw8MTIpCi0jZGVmaW5lIEk5MTVfR01CVVNfSU5URVJSVVBUX1NUQVRVUwkJKDFVTDw8MTEpCi0jZGVmaW5lIEk5MTVfVlNZTkNfSU5URVJSVVBUX1NUQVRVUwkJKDFVTDw8OSkKLSNkZWZpbmUgSTkxNV9ESVNQTEFZX0xJTkVfQ09NUEFSRV9TVEFUVVMJKDFVTDw8OCkKLSNkZWZpbmUgSTkxNV9EUFNUX0VWRU5UX1NUQVRVUwkJCSgxVUw8PDcpCi0jZGVmaW5lIEk5MTVfTEVHQUNZX0JMQ19FVkVOVF9TVEFUVVMJCSgxVUw8PDYpCi0jZGVmaW5lIEk5MTVfT0REX0ZJRUxEX0lOVEVSUlVQVF9TVEFUVVMJCSgxVUw8PDUpCi0jZGVmaW5lIEk5MTVfRVZFTl9GSUVMRF9JTlRFUlJVUFRfU1RBVFVTCSgxVUw8PDQpCi0jZGVmaW5lIEk5MTVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVMJKDFVTDw8MikJLyogOTY1IG9yIGxhdGVyICovCi0jZGVmaW5lIEk5MTVfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVMJCSgxVUw8PDEpCi0jZGVmaW5lIEk5MTVfT1ZFUkxBWV9VUERBVEVEX1NUQVRVUwkJKDFVTDw8MCkKLQogI2RlZmluZSBTUlhfSU5ERVgJCTB4M2M0CiAjZGVmaW5lIFNSWF9EQVRBCQkweDNjNQogI2RlZmluZSBTUjAxCQkJMQpAQCAtMjE2Niw3ICsyMTU1LDggQEAKICNkZWZpbmUgSTgzMF9GSUZPX0xJTkVfU0laRQkzMgogCiAjZGVmaW5lIEc0WF9GSUZPX1NJWkUJCTEyNwotI2RlZmluZSBJOTQ1X0ZJRk9fU0laRQkJMTI3IC8qIDk0NSAmIDk2NSAqLworI2RlZmluZSBJOTY1X0ZJRk9fU0laRQkJNTEyCisjZGVmaW5lIEk5NDVfRklGT19TSVpFCQkxMjcKICNkZWZpbmUgSTkxNV9GSUZPX1NJWkUJCTk1CiAjZGVmaW5lIEk4NTVHTV9GSUZPX1NJWkUJMTI3IC8qIEluIGNhY2hlbGluZXMgKi8KICNkZWZpbmUgSTgzMF9GSUZPX1NJWkUJCTk1CkBAIC0yMTg1LDYgKzIxNzUsOSBAQAogI2RlZmluZSBQSU5FVklFV19DVVJTT1JfREZUX1dNCTAKICNkZWZpbmUgUElORVZJRVdfQ1VSU09SX0dVQVJEX1dNCTUKIAorI2RlZmluZSBJOTY1X0NVUlNPUl9GSUZPCTY0CisjZGVmaW5lIEk5NjVfQ1VSU09SX01BWF9XTQkzMgorI2RlZmluZSBJOTY1X0NVUlNPUl9ERlRfV00JOAogCiAvKiBkZWZpbmUgdGhlIFdhdGVybWFyayByZWdpc3RlciBvbiBJcm9ubGFrZSAqLwogI2RlZmluZSBXTTBfUElQRUFfSUxLCQkweDQ1MTAwCkBAIC0yMjEyLDYgKzIyMDUsOSBAQAogI2RlZmluZSBJTEtfRElTUExBWV9GSUZPCTEyOAogI2RlZmluZSBJTEtfRElTUExBWV9NQVhXTQk2NAogI2RlZmluZSBJTEtfRElTUExBWV9ERlRXTQk4CisjZGVmaW5lIElMS19DVVJTT1JfRklGTwkJMzIKKyNkZWZpbmUgSUxLX0NVUlNPUl9NQVhXTQkxNgorI2RlZmluZSBJTEtfQ1VSU09SX0RGVFdNCTgKIAogI2RlZmluZSBJTEtfRElTUExBWV9TUl9GSUZPCTUxMgogI2RlZmluZSBJTEtfRElTUExBWV9NQVhfU1JXTQkweDFmZgpAQCAtMjUxMCw2ICsyNTA2LDEwIEBACiAjZGVmaW5lICBJTEtfVlNEUEZEX0ZVTEwJKDE8PDIxKQogI2RlZmluZSBJTEtfRFNQQ0xLX0dBVEUJCTB4NDIwMjAKICNkZWZpbmUgIElMS19EUEFSQl9DTEtfR0FURQkoMTw8NSkKKy8qIEFjY29yZGluZyB0byBzcGVjIHRoaXMgYml0IDcvOC85IG9mIDB4NDIwMjAgc2hvdWxkIGJlIHNldCB0byBlbmFibGUgRkJDICovCisjZGVmaW5lICAgSUxLX0NMS19GQkMJCSgxPDw3KQorI2RlZmluZSAgIElMS19EUEZDX0RJUzEJCSgxPDw4KQorI2RlZmluZSAgIElMS19EUEZDX0RJUzIJCSgxPDw5KQogCiAjZGVmaW5lIERJU1BfQVJCX0NUTAkweDQ1MDAwCiAjZGVmaW5lICBESVNQX1RJTEVfU1VSRkFDRV9TV0laWkxJTkcJKDE8PDEzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwppbmRleCA2MGE1ODAwLi42ZTIwMjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwpAQCAtNjAyLDcgKzYwMiw5IEBACiAKIAkvKiBPbmx5IHNhdmUgRkJDIHN0YXRlIG9uIHRoZSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIEZCQyAqLwogCWlmIChJOTE1X0hBU19GQkMoZGV2KSkgewotCQlpZiAoSVNfR000NShkZXYpKSB7CisJCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKKwkJCWRldl9wcml2LT5zYXZlRFBGQ19DQl9CQVNFID0gSTkxNV9SRUFEKElMS19EUEZDX0NCX0JBU0UpOworCQl9IGVsc2UgaWYgKElTX0dNNDUoZGV2KSkgewogCQkJZGV2X3ByaXYtPnNhdmVEUEZDX0NCX0JBU0UgPSBJOTE1X1JFQUQoRFBGQ19DQl9CQVNFKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9wcml2LT5zYXZlRkJDX0NGQl9CQVNFID0gSTkxNV9SRUFEKEZCQ19DRkJfQkFTRSk7CkBAIC03MDYsNyArNzA4LDEwIEBACiAKIAkvKiBvbmx5IHJlc3RvcmUgRkJDIGluZm8gb24gdGhlIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgRkJDKi8KIAlpZiAoSTkxNV9IQVNfRkJDKGRldikpIHsKLQkJaWYgKElTX0dNNDUoZGV2KSkgeworCQlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKSB7CisJCQlpcm9ubGFrZV9kaXNhYmxlX2ZiYyhkZXYpOworCQkJSTkxNV9XUklURShJTEtfRFBGQ19DQl9CQVNFLCBkZXZfcHJpdi0+c2F2ZURQRkNfQ0JfQkFTRSk7CisJCX0gZWxzZSBpZiAoSVNfR000NShkZXYpKSB7CiAJCQlnNHhfZGlzYWJsZV9mYmMoZGV2KTsKIAkJCUk5MTVfV1JJVEUoRFBGQ19DQl9CQVNFLCBkZXZfcHJpdi0+c2F2ZURQRkNfQ0JfQkFTRSk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmgKaW5kZXggZmFiMjE3Ni4uZmVhOTdhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaApAQCAtMjYyLDYgKzI2Miw0MiBAQAogCSAgICBUUF9BUkdTKGRldikKICk7CiAKK1RSQUNFX0VWRU5UKGk5MTVfZmxpcF9yZXF1ZXN0LAorCSAgICBUUF9QUk9UTyhpbnQgcGxhbmUsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKworCSAgICBUUF9BUkdTKHBsYW5lLCBvYmopLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKGludCwgcGxhbmUpCisJCSAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCSAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+cGxhbmUgPSBwbGFuZTsKKwkJICAgIF9fZW50cnktPm9iaiA9IG9iajsKKwkJICAgICksCisKKwkgICAgVFBfcHJpbnRrKCJwbGFuZT0lZCwgb2JqPSVwIiwgX19lbnRyeS0+cGxhbmUsIF9fZW50cnktPm9iaikKKyk7CisKK1RSQUNFX0VWRU5UKGk5MTVfZmxpcF9jb21wbGV0ZSwKKwkgICAgVFBfUFJPVE8oaW50IHBsYW5lLCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiksCisKKwkgICAgVFBfQVJHUyhwbGFuZSwgb2JqKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChpbnQsIHBsYW5lKQorCQkgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPnBsYW5lID0gcGxhbmU7CisJCSAgICBfX2VudHJ5LT5vYmogPSBvYmo7CisJCSAgICApLAorCisJICAgIFRQX3ByaW50aygicGxhbmU9JWQsIG9iaj0lcCIsIF9fZW50cnktPnBsYW5lLCBfX2VudHJ5LT5vYmopCispOworCiAjZW5kaWYgLyogX0k5MTVfVFJBQ0VfSF8gKi8KIAogLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKaW5kZXggNWUyMWIzMS4uMWU1ZTBkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgImludGVsX2Rydi5oIgogI2luY2x1ZGUgImk5MTVfZHJtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCiAjaW5jbHVkZSAiZHJtX2RwX2hlbHBlci5oIgogCiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCkBAIC00Miw2ICs0Myw3IEBACiBib29sIGludGVsX3BpcGVfaGFzX3R5cGUgKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHR5cGUpOwogc3RhdGljIHZvaWQgaW50ZWxfdXBkYXRlX3dhdGVybWFya3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBpbnRlbF9pbmNyZWFzZV9wbGxjbG9jayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGJvb2wgc2NoZWR1bGUpOworc3RhdGljIHZvaWQgaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICAvKiBnaXZlbiB2YWx1ZXMgKi8KQEAgLTMyMiw2ICszMjQsOSBAQAogI2RlZmluZSBJUk9OTEFLRV9EUF9QMV9NSU4JCTEKICNkZWZpbmUgSVJPTkxBS0VfRFBfUDFfTUFYCQkyCiAKKy8qIEZESSAqLworI2RlZmluZSBJUk9OTEFLRV9GRElfRlJFUQkJMjcwMDAwMCAvKiBpbiBrSHogZm9yIG1vZGUtPmNsb2NrICovCisKIHN0YXRpYyBib29sCiBpbnRlbF9maW5kX2Jlc3RfUExMKGNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCSAgICBpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKTsKQEAgLTk3NSw3ICs5ODAsMTAgQEAKIGludGVsX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCS8qIFdhaXQgZm9yIDIwbXMsIGkuZS4gb25lIGN5Y2xlIGF0IDUwaHouICovCi0JbXNsZWVwKDIwKTsKKwlpZiAoaW5fZGJnX21hc3RlcigpKQorCQltZGVsYXkoMjApOyAvKiBUaGUga2VybmVsIGRlYnVnZ2VyIGNhbm5vdCBjYWxsIG1zbGVlcCgpICovCisJZWxzZQorCQltc2xlZXAoMjApOwogfQogCiAvKiBQYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCwgdXBkYXRlIEZCQyBpbmZvICovCkBAIC0xMTIyLDYgKzExMzAsNjcgQEAKIAlyZXR1cm4gSTkxNV9SRUFEKERQRkNfQ09OVFJPTCkgJiBEUEZDX0NUTF9FTjsKIH0KIAorc3RhdGljIHZvaWQgaXJvbmxha2VfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CisJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhpbnRlbF9mYi0+b2JqKTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBsYW5lID0gKGludGVsX2NydGMtPnBsYW5lID09IDApID8gRFBGQ19DVExfUExBTkVBIDoKKwkJCQkJICAgICAgIERQRkNfQ1RMX1BMQU5FQjsKKwl1bnNpZ25lZCBsb25nIHN0YWxsX3dhdGVybWFyayA9IDIwMDsKKwl1MzIgZHBmY19jdGw7CisKKwlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gKGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOworCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCWRldl9wcml2LT5jZmJfcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKKworCWRwZmNfY3RsID0gSTkxNV9SRUFEKElMS19EUEZDX0NPTlRST0wpOworCWRwZmNfY3RsICY9IERQRkNfUkVTRVJWRUQ7CisJZHBmY19jdGwgfD0gKHBsYW5lIHwgRFBGQ19DVExfTElNSVRfMVgpOworCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgeworCQlkcGZjX2N0bCB8PSAoRFBGQ19DVExfRkVOQ0VfRU4gfCBkZXZfcHJpdi0+Y2ZiX2ZlbmNlKTsKKwkJSTkxNV9XUklURShJTEtfRFBGQ19DSElDS0VOLCBEUEZDX0hUX01PRElGWSk7CisJfSBlbHNlIHsKKwkJSTkxNV9XUklURShJTEtfRFBGQ19DSElDS0VOLCB+RFBGQ19IVF9NT0RJRlkpOworCX0KKworCUk5MTVfV1JJVEUoSUxLX0RQRkNfQ09OVFJPTCwgZHBmY19jdGwpOworCUk5MTVfV1JJVEUoSUxLX0RQRkNfUkVDT01QX0NUTCwgRFBGQ19SRUNPTVBfU1RBTExfRU4gfAorCQkgICAoc3RhbGxfd2F0ZXJtYXJrIDw8IERQRkNfUkVDT01QX1NUQUxMX1dNX1NISUZUKSB8CisJCSAgIChpbnRlcnZhbCA8PCBEUEZDX1JFQ09NUF9USU1FUl9DT1VOVF9TSElGVCkpOworCUk5MTVfV1JJVEUoSUxLX0RQRkNfRkVOQ0VfWU9GRiwgY3J0Yy0+eSk7CisJSTkxNV9XUklURShJTEtfRkJDX1JUX0JBU0UsIG9ial9wcml2LT5ndHRfb2Zmc2V0IHwgSUxLX0ZCQ19SVF9WQUxJRCk7CisJLyogZW5hYmxlIGl0Li4uICovCisJSTkxNV9XUklURShJTEtfRFBGQ19DT05UUk9MLCBJOTE1X1JFQUQoSUxLX0RQRkNfQ09OVFJPTCkgfAorCQkgICBEUEZDX0NUTF9FTik7CisKKwlEUk1fREVCVUdfS01TKCJlbmFibGVkIGZiYyBvbiBwbGFuZSAlZFxuIiwgaW50ZWxfY3J0Yy0+cGxhbmUpOworfQorCit2b2lkIGlyb25sYWtlX2Rpc2FibGVfZmJjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgZHBmY19jdGw7CisKKwkvKiBEaXNhYmxlIGNvbXByZXNzaW9uICovCisJZHBmY19jdGwgPSBJOTE1X1JFQUQoSUxLX0RQRkNfQ09OVFJPTCk7CisJZHBmY19jdGwgJj0gfkRQRkNfQ1RMX0VOOworCUk5MTVfV1JJVEUoSUxLX0RQRkNfQ09OVFJPTCwgZHBmY19jdGwpOworCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJRFJNX0RFQlVHX0tNUygiZGlzYWJsZWQgRkJDXG4iKTsKK30KKworc3RhdGljIGJvb2wgaXJvbmxha2VfZmJjX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJcmV0dXJuIEk5MTVfUkVBRChJTEtfRFBGQ19DT05UUk9MKSAmIERQRkNfQ1RMX0VOOworfQorCiBib29sIGludGVsX2ZiY19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEyNDgsNiArMTMxNywxMCBAQAogCQlnb3RvIG91dF9kaXNhYmxlOwogCX0KIAorCS8qIElmIHRoZSBrZXJuZWwgZGVidWdnZXIgaXMgYWN0aXZlLCBhbHdheXMgZGlzYWJsZSBjb21wcmVzc2lvbiAqLworCWlmIChpbl9kYmdfbWFzdGVyKCkpCisJCWdvdG8gb3V0X2Rpc2FibGU7CisKIAlpZiAoaW50ZWxfZmJjX2VuYWJsZWQoZGV2KSkgewogCQkvKiBXZSBjYW4gcmUtZW5hYmxlIGl0IGluIHRoaXMgY2FzZSwgYnV0IG5lZWQgdG8gdXBkYXRlIHBpdGNoICovCiAJCWlmICgoZmItPnBpdGNoID4gZGV2X3ByaXYtPmNmYl9waXRjaCkgfHwKQEAgLTEyNzksNyArMTM1MiwxMiBAQAogCiAJc3dpdGNoIChvYmpfcHJpdi0+dGlsaW5nX21vZGUpIHsKIAljYXNlIEk5MTVfVElMSU5HX05PTkU6Ci0JCWFsaWdubWVudCA9IDY0ICogMTAyNDsKKwkJaWYgKElTX0JST0FEV0FURVIoZGV2KSB8fCBJU19DUkVTVExJTkUoZGV2KSkKKwkJCWFsaWdubWVudCA9IDEyOCAqIDEwMjQ7CisJCWVsc2UgaWYgKElTX0k5NjVHKGRldikpCisJCQlhbGlnbm1lbnQgPSA0ICogMTAyNDsKKwkJZWxzZQorCQkJYWxpZ25tZW50ID0gNjQgKiAxMDI0OwogCQlicmVhazsKIAljYXNlIEk5MTVfVElMSU5HX1g6CiAJCS8qIHBpbigpIHdpbGwgYWxpZ24gdGhlIG9iamVjdCBhcyByZXF1aXJlZCBieSBmZW5jZSAqLwpAQCAtMTMxNCw2ICsxMzkyLDk4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIEFzc3VtZSBmYiBvYmplY3QgaXMgcGlubmVkICYgaWRsZSAmIGZlbmNlZCBhbmQganVzdCB1cGRhdGUgYmFzZSBwb2ludGVycyAqLworc3RhdGljIGludAoraW50ZWxfcGlwZV9zZXRfYmFzZV9hdG9taWMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCSAgIGludCB4LCBpbnQgeSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOworCXVuc2lnbmVkIGxvbmcgU3RhcnQsIE9mZnNldDsKKwlpbnQgZHNwYmFzZSA9IChwbGFuZSA9PSAwID8gRFNQQUFERFIgOiBEU1BCQUREUik7CisJaW50IGRzcHN1cmYgPSAocGxhbmUgPT0gMCA/IERTUEFTVVJGIDogRFNQQlNVUkYpOworCWludCBkc3BzdHJpZGUgPSAocGxhbmUgPT0gMCkgPyBEU1BBU1RSSURFIDogRFNQQlNUUklERTsKKwlpbnQgZHNwdGlsZW9mZiA9IChwbGFuZSA9PSAwID8gRFNQQVRJTEVPRkYgOiBEU1BCVElMRU9GRik7CisJaW50IGRzcGNudHJfcmVnID0gKHBsYW5lID09IDApID8gRFNQQUNOVFIgOiBEU1BCQ05UUjsKKwl1MzIgZHNwY250cjsKKworCXN3aXRjaCAocGxhbmUpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIkNhbid0IHVwZGF0ZSBwbGFuZSAlZCBpbiBTQVJFQVxuIiwgcGxhbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKKwlvYmogPSBpbnRlbF9mYi0+b2JqOworCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKworCWRzcGNudHIgPSBJOTE1X1JFQUQoZHNwY250cl9yZWcpOworCS8qIE1hc2sgb3V0IHBpeGVsIGZvcm1hdCBiaXRzIGluIGNhc2Ugd2UgY2hhbmdlIGl0ICovCisJZHNwY250ciAmPSB+RElTUFBMQU5FX1BJWEZPUk1BVF9NQVNLOworCXN3aXRjaCAoZmItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQlkc3BjbnRyIHw9IERJU1BQTEFORV84QlBQOworCQlicmVhazsKKwljYXNlIDE2OgorCQlpZiAoZmItPmRlcHRoID09IDE1KQorCQkJZHNwY250ciB8PSBESVNQUExBTkVfMTVfMTZCUFA7CisJCWVsc2UKKwkJCWRzcGNudHIgfD0gRElTUFBMQU5FXzE2QlBQOworCQlicmVhazsKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCWRzcGNudHIgfD0gRElTUFBMQU5FXzMyQlBQX05PX0FMUEhBOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVua25vd24gY29sb3IgZGVwdGhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKElTX0k5NjVHKGRldikpIHsKKwkJaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCQkJZHNwY250ciB8PSBESVNQUExBTkVfVElMRUQ7CisJCWVsc2UKKwkJCWRzcGNudHIgJj0gfkRJU1BQTEFORV9USUxFRDsKKwl9CisKKwlpZiAoSVNfSVJPTkxBS0UoZGV2KSkKKwkJLyogbXVzdCBkaXNhYmxlICovCisJCWRzcGNudHIgfD0gRElTUFBMQU5FX1RSSUNLTEVfRkVFRF9ESVNBQkxFOworCisJSTkxNV9XUklURShkc3BjbnRyX3JlZywgZHNwY250cik7CisKKwlTdGFydCA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OworCU9mZnNldCA9IHkgKiBmYi0+cGl0Y2ggKyB4ICogKGZiLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCisJRFJNX0RFQlVHKCJXcml0aW5nIGJhc2UgJTA4bFggJTA4bFggJWQgJWRcbiIsIFN0YXJ0LCBPZmZzZXQsIHgsIHkpOworCUk5MTVfV1JJVEUoZHNwc3RyaWRlLCBmYi0+cGl0Y2gpOworCWlmIChJU19JOTY1RyhkZXYpKSB7CisJCUk5MTVfV1JJVEUoZHNwYmFzZSwgT2Zmc2V0KTsKKwkJSTkxNV9SRUFEKGRzcGJhc2UpOworCQlJOTE1X1dSSVRFKGRzcHN1cmYsIFN0YXJ0KTsKKwkJSTkxNV9SRUFEKGRzcHN1cmYpOworCQlJOTE1X1dSSVRFKGRzcHRpbGVvZmYsICh5IDw8IDE2KSB8IHgpOworCX0gZWxzZSB7CisJCUk5MTVfV1JJVEUoZHNwYmFzZSwgU3RhcnQgKyBPZmZzZXQpOworCQlJOTE1X1JFQUQoZHNwYmFzZSk7CisJfQorCisJaWYgKChJU19JOTY1RyhkZXYpIHx8IHBsYW5lID09IDApKQorCQlpbnRlbF91cGRhdGVfZmJjKGNydGMsICZjcnRjLT5tb2RlKTsKKworCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCWludGVsX2luY3JlYXNlX3BsbGNsb2NrKGNydGMsIHRydWUpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIGludGVsX3BpcGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCiAJCSAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCkBAIC0xNTU0LDYgKzE3MjQsMTUgQEAKIAlpbnQgZmRpX3J4X2ltcl9yZWcgPSAocGlwZSA9PSAwKSA/IEZESV9SWEFfSU1SIDogRkRJX1JYQl9JTVI7CiAJdTMyIHRlbXAsIHRyaWVzID0gMDsKIAorCS8qIFRyYWluIDE6IHVtYXNrIEZESSBSWCBJbnRlcnJ1cHQgc3ltYm9sX2xvY2sgYW5kIGJpdF9sb2NrIGJpdAorCSAgIGZvciB0cmFpbiByZXN1bHQgKi8KKwl0ZW1wID0gSTkxNV9SRUFEKGZkaV9yeF9pbXJfcmVnKTsKKwl0ZW1wICY9IH5GRElfUlhfU1lNQk9MX0xPQ0s7CisJdGVtcCAmPSB+RkRJX1JYX0JJVF9MT0NLOworCUk5MTVfV1JJVEUoZmRpX3J4X2ltcl9yZWcsIHRlbXApOworCUk5MTVfUkVBRChmZGlfcnhfaW1yX3JlZyk7CisJdWRlbGF5KDE1MCk7CisKIAkvKiBlbmFibGUgQ1BVIEZESSBUWCBhbmQgUENIIEZESSBSWCAqLwogCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3R4X3JlZyk7CiAJdGVtcCB8PSBGRElfVFhfRU5BQkxFOwpAQCAtMTU3MSwxNiArMTc1MCw3IEBACiAJSTkxNV9SRUFEKGZkaV9yeF9yZWcpOwogCXVkZWxheSgxNTApOwogCi0JLyogVHJhaW4gMTogdW1hc2sgRkRJIFJYIEludGVycnVwdCBzeW1ib2xfbG9jayBhbmQgYml0X2xvY2sgYml0Ci0JICAgZm9yIHRyYWluIHJlc3VsdCAqLwotCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3J4X2ltcl9yZWcpOwotCXRlbXAgJj0gfkZESV9SWF9TWU1CT0xfTE9DSzsKLQl0ZW1wICY9IH5GRElfUlhfQklUX0xPQ0s7Ci0JSTkxNV9XUklURShmZGlfcnhfaW1yX3JlZywgdGVtcCk7Ci0JSTkxNV9SRUFEKGZkaV9yeF9pbXJfcmVnKTsKLQl1ZGVsYXkoMTUwKTsKLQotCWZvciAoOzspIHsKKwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCA1OyB0cmllcysrKSB7CiAJCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3J4X2lpcl9yZWcpOwogCQlEUk1fREVCVUdfS01TKCJGRElfUlhfSUlSIDB4JXhcbiIsIHRlbXApOwogCkBAIC0xNTkwLDE0ICsxNzYwLDkgQEAKIAkJCQkgICB0ZW1wIHwgRkRJX1JYX0JJVF9MT0NLKTsKIAkJCWJyZWFrOwogCQl9Ci0KLQkJdHJpZXMrKzsKLQotCQlpZiAodHJpZXMgPiA1KSB7Ci0JCQlEUk1fREVCVUdfS01TKCJGREkgdHJhaW4gMSBmYWlsIVxuIik7Ci0JCQlicmVhazsKLQkJfQogCX0KKwlpZiAodHJpZXMgPT0gNSkKKwkJRFJNX0RFQlVHX0tNUygiRkRJIHRyYWluIDEgZmFpbCFcbiIpOwogCiAJLyogVHJhaW4gMiAqLwogCXRlbXAgPSBJOTE1X1JFQUQoZmRpX3R4X3JlZyk7CkBAIC0xNjEzLDcgKzE3NzgsNyBAQAogCiAJdHJpZXMgPSAwOwogCi0JZm9yICg7OykgeworCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IDU7IHRyaWVzKyspIHsKIAkJdGVtcCA9IEk5MTVfUkVBRChmZGlfcnhfaWlyX3JlZyk7CiAJCURSTV9ERUJVR19LTVMoIkZESV9SWF9JSVIgMHgleFxuIiwgdGVtcCk7CiAKQEAgLTE2MjMsMTQgKzE3ODgsOSBAQAogCQkJRFJNX0RFQlVHX0tNUygiRkRJIHRyYWluIDIgZG9uZS5cbiIpOwogCQkJYnJlYWs7CiAJCX0KLQotCQl0cmllcysrOwotCi0JCWlmICh0cmllcyA+IDUpIHsKLQkJCURSTV9ERUJVR19LTVMoIkZESSB0cmFpbiAyIGZhaWwhXG4iKTsKLQkJCWJyZWFrOwotCQl9CiAJfQorCWlmICh0cmllcyA9PSA1KQorCQlEUk1fREVCVUdfS01TKCJGREkgdHJhaW4gMiBmYWlsIVxuIik7CiAKIAlEUk1fREVCVUdfS01TKCJGREkgdHJhaW4gZG9uZVxuIik7CiB9CkBAIC0xNjU1LDYgKzE4MTUsMTUgQEAKIAlpbnQgZmRpX3J4X2ltcl9yZWcgPSAocGlwZSA9PSAwKSA/IEZESV9SWEFfSU1SIDogRkRJX1JYQl9JTVI7CiAJdTMyIHRlbXAsIGk7CiAKKwkvKiBUcmFpbiAxOiB1bWFzayBGREkgUlggSW50ZXJydXB0IHN5bWJvbF9sb2NrIGFuZCBiaXRfbG9jayBiaXQKKwkgICBmb3IgdHJhaW4gcmVzdWx0ICovCisJdGVtcCA9IEk5MTVfUkVBRChmZGlfcnhfaW1yX3JlZyk7CisJdGVtcCAmPSB+RkRJX1JYX1NZTUJPTF9MT0NLOworCXRlbXAgJj0gfkZESV9SWF9CSVRfTE9DSzsKKwlJOTE1X1dSSVRFKGZkaV9yeF9pbXJfcmVnLCB0ZW1wKTsKKwlJOTE1X1JFQUQoZmRpX3J4X2ltcl9yZWcpOworCXVkZWxheSgxNTApOworCiAJLyogZW5hYmxlIENQVSBGREkgVFggYW5kIFBDSCBGREkgUlggKi8KIAl0ZW1wID0gSTkxNV9SRUFEKGZkaV90eF9yZWcpOwogCXRlbXAgfD0gRkRJX1RYX0VOQUJMRTsKQEAgLTE2ODAsMTUgKzE4NDksNiBAQAogCUk5MTVfUkVBRChmZGlfcnhfcmVnKTsKIAl1ZGVsYXkoMTUwKTsKIAotCS8qIFRyYWluIDE6IHVtYXNrIEZESSBSWCBJbnRlcnJ1cHQgc3ltYm9sX2xvY2sgYW5kIGJpdF9sb2NrIGJpdAotCSAgIGZvciB0cmFpbiByZXN1bHQgKi8KLQl0ZW1wID0gSTkxNV9SRUFEKGZkaV9yeF9pbXJfcmVnKTsKLQl0ZW1wICY9IH5GRElfUlhfU1lNQk9MX0xPQ0s7Ci0JdGVtcCAmPSB+RkRJX1JYX0JJVF9MT0NLOwotCUk5MTVfV1JJVEUoZmRpX3J4X2ltcl9yZWcsIHRlbXApOwotCUk5MTVfUkVBRChmZGlfcnhfaW1yX3JlZyk7Ci0JdWRlbGF5KDE1MCk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrICkgewogCQl0ZW1wID0gSTkxNV9SRUFEKGZkaV90eF9yZWcpOwogCQl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9WT0xfRU1QX01BU0s7CkBAIC0xODQzLDcgKzIwMDMsOCBAQAogCQl9CiAKIAkJLyogRW5hYmxlIHBhbmVsIGZpdHRpbmcgZm9yIExWRFMgKi8KLQkJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKSB7CisJCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9MVkRTKQorCQkgICAgfHwgSEFTX2VEUCB8fCBpbnRlbF9wY2hfaGFzX2VkcChjcnRjKSkgewogCQkJdGVtcCA9IEk5MTVfUkVBRChwZl9jdGxfcmVnKTsKIAkJCUk5MTVfV1JJVEUocGZfY3RsX3JlZywgdGVtcCB8IFBGX0VOQUJMRSB8IFBGX0ZJTFRFUl9NRURfM3gzKTsKIApAQCAtMTkzOCw5ICsyMDk5LDEyIEBACiAJCQkJcmVnID0gSTkxNV9SRUFEKHRyYW5zX2RwX2N0bCk7CiAJCQkJcmVnICY9IH5UUkFOU19EUF9QT1JUX1NFTF9NQVNLOwogCQkJCXJlZyA9IFRSQU5TX0RQX09VVFBVVF9FTkFCTEUgfAotCQkJCSAgICAgIFRSQU5TX0RQX0VOSF9GUkFNSU5HIHwKLQkJCQkgICAgICBUUkFOU19EUF9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCQkJICAgICAgVFJBTlNfRFBfSFNZTkNfQUNUSVZFX0hJR0g7CisJCQkJICAgICAgVFJBTlNfRFBfRU5IX0ZSQU1JTkc7CisKKwkJCQlpZiAoY3J0Yy0+bW9kZS5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQkJCSAgICAgIHJlZyB8PSBUUkFOU19EUF9IU1lOQ19BQ1RJVkVfSElHSDsKKwkJCQlpZiAoY3J0Yy0+bW9kZS5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUFZTWU5DKQorCQkJCSAgICAgIHJlZyB8PSBUUkFOU19EUF9WU1lOQ19BQ1RJVkVfSElHSDsKIAogCQkJCXN3aXRjaCAoaW50ZWxfdHJhbnNfZHBfcG9ydF9zZWwoY3J0YykpIHsKIAkJCQljYXNlIFBDSF9EUF9COgpAQCAtMTk4MCw2ICsyMTQ0LDggQEAKIAogCQlpbnRlbF9jcnRjX2xvYWRfbHV0KGNydGMpOwogCisJCWludGVsX3VwZGF0ZV9mYmMoY3J0YywgJmNydGMtPm1vZGUpOworCiAJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKIAkJRFJNX0RFQlVHX0tNUygiY3J0YyAlZCBkcG1zIG9mZlxuIiwgcGlwZSk7CkBAIC0xOTk0LDYgKzIxNjAsMTAgQEAKIAkJCUk5MTVfUkVBRChkc3BiYXNlX3JlZyk7CiAJCX0KIAorCQlpZiAoZGV2X3ByaXYtPmNmYl9wbGFuZSA9PSBwbGFuZSAmJgorCQkgICAgZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMpCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOworCiAJCWk5MTVfZGlzYWJsZV92Z2EoZGV2KTsKIAogCQkvKiBkaXNhYmxlIGNwdSBwaXBlLCBkaXNhYmxlIGFmdGVyIGFsbCBwbGFuZXMgZGlzYWJsZWQgKi8KQEAgLTIzNzMsOCArMjU0Myw4IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCS8qIEZESSBsaW5rIGNsb2NrIGlzIGZpeGVkIGF0IDIuN0cgKi8KLQkJaWYgKG1vZGUtPmNsb2NrICogMyA+IDI3MDAwICogNCkKLQkJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisJCWlmIChtb2RlLT5jbG9jayAqIDMgPiBJUk9OTEFLRV9GRElfRlJFUSAqIDQpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCXJldHVybiB0cnVlOwogfQpAQCAtMjU1Niw2ICsyNzI2LDIwIEBACiAJMiwKIAlHNFhfRklGT19MSU5FX1NJWkUsCiB9Oworc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGc0eF9jdXJzb3Jfd21faW5mbyA9IHsKKwlJOTY1X0NVUlNPUl9GSUZPLAorCUk5NjVfQ1VSU09SX01BWF9XTSwKKwlJOTY1X0NVUlNPUl9ERlRfV00sCisJMiwKKwlHNFhfRklGT19MSU5FX1NJWkUsCit9Oworc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGk5NjVfY3Vyc29yX3dtX2luZm8gPSB7CisJSTk2NV9DVVJTT1JfRklGTywKKwlJOTY1X0NVUlNPUl9NQVhfV00sCisJSTk2NV9DVVJTT1JfREZUX1dNLAorCTIsCisJSTkxNV9GSUZPX0xJTkVfU0laRSwKK307CiBzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaTk0NV93bV9pbmZvID0gewogCUk5NDVfRklGT19TSVpFLAogCUk5MTVfTUFYX1dNLApAQCAtMjU5Myw2ICsyNzc3LDE0IEBACiAJSUxLX0ZJRk9fTElORV9TSVpFCiB9OwogCitzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaXJvbmxha2VfY3Vyc29yX3dtX2luZm8gPSB7CisJSUxLX0NVUlNPUl9GSUZPLAorCUlMS19DVVJTT1JfTUFYV00sCisJSUxLX0NVUlNPUl9ERlRXTSwKKwkyLAorCUlMS19GSUZPX0xJTkVfU0laRQorfTsKKwogc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGlyb25sYWtlX2Rpc3BsYXlfc3J3bV9pbmZvID0gewogCUlMS19ESVNQTEFZX1NSX0ZJRk8sCiAJSUxLX0RJU1BMQVlfTUFYX1NSV00sCkBAIC0yNjQyLDcgKzI4MzQsNyBAQAogCSAqLwogCWVudHJpZXNfcmVxdWlyZWQgPSAoKGNsb2NrX2luX2toeiAvIDEwMDApICogcGl4ZWxfc2l6ZSAqIGxhdGVuY3lfbnMpIC8KIAkJMTAwMDsKLQllbnRyaWVzX3JlcXVpcmVkIC89IHdtLT5jYWNoZWxpbmVfc2l6ZTsKKwllbnRyaWVzX3JlcXVpcmVkID0gRElWX1JPVU5EX1VQKGVudHJpZXNfcmVxdWlyZWQsIHdtLT5jYWNoZWxpbmVfc2l6ZSk7CiAKIAlEUk1fREVCVUdfS01TKCJGSUZPIGVudHJpZXMgcmVxdWlyZWQgZm9yIG1vZGU6ICVkXG4iLCBlbnRyaWVzX3JlcXVpcmVkKTsKIApAQCAtMjY1Myw4ICsyODQ1LDE0IEBACiAJLyogRG9uJ3QgcHJvbW90ZSB3bV9zaXplIHRvIHVuc2lnbmVkLi4uICovCiAJaWYgKHdtX3NpemUgPiAobG9uZyl3bS0+bWF4X3dtKQogCQl3bV9zaXplID0gd20tPm1heF93bTsKLQlpZiAod21fc2l6ZSA8PSAwKQorCWlmICh3bV9zaXplIDw9IDApIHsKIAkJd21fc2l6ZSA9IHdtLT5kZWZhdWx0X3dtOworCQlEUk1fRVJST1IoIkluc3VmZmljaWVudCBGSUZPIGZvciBwbGFuZSwgZXhwZWN0IGZsaWNrZXJpbmc6IgorCQkJICAiIGVudHJpZXMgcmVxdWlyZWQgPSAlbGQsIGF2YWlsYWJsZSA9ICVsdS5cbiIsCisJCQkgIGVudHJpZXNfcmVxdWlyZWQgKyB3bS0+Z3VhcmRfc2l6ZSwKKwkJCSAgd20tPmZpZm9fc2l6ZSk7CisJfQorCiAJcmV0dXJuIHdtX3NpemU7CiB9CiAKQEAgLTI3NjMsMTEgKzI5NjEsOSBAQAogCXVpbnQzMl90IGRzcGFyYiA9IEk5MTVfUkVBRChEU1BBUkIpOwogCWludCBzaXplOwogCi0JaWYgKHBsYW5lID09IDApCi0JCXNpemUgPSBkc3BhcmIgJiAweDdmOwotCWVsc2UKLQkJc2l6ZSA9ICgoZHNwYXJiID4+IERTUEFSQl9DU1RBUlRfU0hJRlQpICYgMHg3ZikgLQotCQkJKGRzcGFyYiAmIDB4N2YpOworCXNpemUgPSBkc3BhcmIgJiAweDdmOworCWlmIChwbGFuZSkKKwkJc2l6ZSA9ICgoZHNwYXJiID4+IERTUEFSQl9DU1RBUlRfU0hJRlQpICYgMHg3ZikgLSBzaXplOwogCiAJRFJNX0RFQlVHX0tNUygiRklGTyBzaXplIC0gKDB4JTA4eCkgJXM6ICVkXG4iLCBkc3BhcmIsCiAJCQlwbGFuZSA/ICJCIiA6ICJBIiwgc2l6ZSk7CkBAIC0yNzgxLDExICsyOTc3LDkgQEAKIAl1aW50MzJfdCBkc3BhcmIgPSBJOTE1X1JFQUQoRFNQQVJCKTsKIAlpbnQgc2l6ZTsKIAotCWlmIChwbGFuZSA9PSAwKQotCQlzaXplID0gZHNwYXJiICYgMHgxZmY7Ci0JZWxzZQotCQlzaXplID0gKChkc3BhcmIgPj4gRFNQQVJCX0JFTkRfU0hJRlQpICYgMHgxZmYpIC0KLQkJCShkc3BhcmIgJiAweDFmZik7CisJc2l6ZSA9IGRzcGFyYiAmIDB4MWZmOworCWlmIChwbGFuZSkKKwkJc2l6ZSA9ICgoZHNwYXJiID4+IERTUEFSQl9CRU5EX1NISUZUKSAmIDB4MWZmKSAtIHNpemU7CiAJc2l6ZSA+Pj0gMTsgLyogQ29udmVydCB0byBjYWNoZWxpbmVzICovCiAKIAlEUk1fREVCVUdfS01TKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwKQEAgLTI4MjYsNyArMzAyMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBpbmV2aWV3X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCAgaW50IHBsYW5lYV9jbG9jaywKLQkJCSAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5LCBpbnQgcGl4ZWxfc2l6ZSkKKwkJCSAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5LCBpbnQgdW51c2VkLAorCQkJICBpbnQgcGl4ZWxfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiByZWc7CkBAIC0yODkxLDcgKzMwODYsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBnNHhfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsICBpbnQgcGxhbmVhX2Nsb2NrLAotCQkJICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBwaXhlbF9zaXplKQorCQkJICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBzcl9odG90YWwsCisJCQkgIGludCBwaXhlbF9zaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHRvdGFsX3NpemUsIGNhY2hlbGluZV9zaXplOwpAQCAtMjkxNSwxMiArMzExMSwxMiBAQAogCSAqLwogCWVudHJpZXNfcmVxdWlyZWQgPSAoKHBsYW5lYV9jbG9jayAvIDEwMDApICogcGl4ZWxfc2l6ZSAqIGxhdGVuY3lfbnMpIC8KIAkJMTAwMDsKLQllbnRyaWVzX3JlcXVpcmVkIC89IEc0WF9GSUZPX0xJTkVfU0laRTsKKwllbnRyaWVzX3JlcXVpcmVkID0gRElWX1JPVU5EX1VQKGVudHJpZXNfcmVxdWlyZWQsIEc0WF9GSUZPX0xJTkVfU0laRSk7CiAJcGxhbmVhX3dtID0gZW50cmllc19yZXF1aXJlZCArIHBsYW5lYV9wYXJhbXMuZ3VhcmRfc2l6ZTsKIAogCWVudHJpZXNfcmVxdWlyZWQgPSAoKHBsYW5lYl9jbG9jayAvIDEwMDApICogcGl4ZWxfc2l6ZSAqIGxhdGVuY3lfbnMpIC8KIAkJMTAwMDsKLQllbnRyaWVzX3JlcXVpcmVkIC89IEc0WF9GSUZPX0xJTkVfU0laRTsKKwllbnRyaWVzX3JlcXVpcmVkID0gRElWX1JPVU5EX1VQKGVudHJpZXNfcmVxdWlyZWQsIEc0WF9GSUZPX0xJTkVfU0laRSk7CiAJcGxhbmViX3dtID0gZW50cmllc19yZXF1aXJlZCArIHBsYW5lYl9wYXJhbXMuZ3VhcmRfc2l6ZTsKIAogCWN1cnNvcmFfd20gPSBjdXJzb3JiX3dtID0gMTY7CkBAIC0yOTM0LDEzICszMTMwLDI0IEBACiAJCXN0YXRpYyBjb25zdCBpbnQgc3JfbGF0ZW5jeV9ucyA9IDEyMDAwOwogCiAJCXNyX2Nsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOwotCQlsaW5lX3RpbWVfdXMgPSAoKHNyX2hkaXNwbGF5ICogMTAwMCkgLyBzcl9jbG9jayk7CisJCWxpbmVfdGltZV91cyA9ICgoc3JfaHRvdGFsICogMTAwMCkgLyBzcl9jbG9jayk7CiAKIAkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZlIHByZWNpc2lvbiAqLwotCQlzcl9lbnRyaWVzID0gKCgoc3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cykgKyAxKSAqCi0JCQkgICAgICBwaXhlbF9zaXplICogc3JfaGRpc3BsYXkpIC8gMTAwMDsKLQkJc3JfZW50cmllcyA9IHJvdW5kdXAoc3JfZW50cmllcyAvIGNhY2hlbGluZV9zaXplLCAxKTsKLQkJRFJNX0RFQlVHKCJzZWxmLXJlZnJlc2ggZW50cmllczogJWRcbiIsIHNyX2VudHJpZXMpOworCQlzcl9lbnRyaWVzID0gKCgoc3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cykgKyAxMDAwKSAvIDEwMDApICoKKwkJCSAgICAgIHBpeGVsX3NpemUgKiBzcl9oZGlzcGxheTsKKwkJc3JfZW50cmllcyA9IERJVl9ST1VORF9VUChzcl9lbnRyaWVzLCBjYWNoZWxpbmVfc2l6ZSk7CisKKwkJZW50cmllc19yZXF1aXJlZCA9ICgoKHNyX2xhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMpICsKKwkJCQkgICAgIDEwMDApIC8gMTAwMCkgKiBwaXhlbF9zaXplICogNjQ7CisJCWVudHJpZXNfcmVxdWlyZWQgPSBESVZfUk9VTkRfVVAoZW50cmllc19yZXF1aXJlZCwKKwkJCQkJICAgZzR4X2N1cnNvcl93bV9pbmZvLmNhY2hlbGluZV9zaXplKTsKKwkJY3Vyc29yX3NyID0gZW50cmllc19yZXF1aXJlZCArIGc0eF9jdXJzb3Jfd21faW5mby5ndWFyZF9zaXplOworCisJCWlmIChjdXJzb3Jfc3IgPiBnNHhfY3Vyc29yX3dtX2luZm8ubWF4X3dtKQorCQkJY3Vyc29yX3NyID0gZzR4X2N1cnNvcl93bV9pbmZvLm1heF93bTsKKwkJRFJNX0RFQlVHX0tNUygic2VsZi1yZWZyZXNoIHdhdGVybWFyazogZGlzcGxheSBwbGFuZSAlZCAiCisJCQkgICAgICAiY3Vyc29yICVkXG4iLCBzcl9lbnRyaWVzLCBjdXJzb3Jfc3IpOworCiAJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEZXX0JMQ19TRUxGX0VOKTsKIAl9IGVsc2UgewogCQkvKiBUdXJuIG9mZiBzZWxmIHJlZnJlc2ggaWYgYm90aCBwaXBlcyBhcmUgZW5hYmxlZCAqLwpAQCAtMjk2NSwxMSArMzE3MiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZCBpOTY1X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2NrLAotCQkJICAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5LCBpbnQgcGl4ZWxfc2l6ZSkKKwkJCSAgIGludCBwbGFuZWJfY2xvY2ssIGludCBzcl9oZGlzcGxheSwgaW50IHNyX2h0b3RhbCwKKwkJCSAgIGludCBwaXhlbF9zaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBsaW5lX3RpbWVfdXM7CiAJaW50IHNyX2Nsb2NrLCBzcl9lbnRyaWVzLCBzcndtID0gMTsKKwlpbnQgY3Vyc29yX3NyID0gMTY7CiAKIAkvKiBDYWxjIHNyIGVudHJpZXMgZm9yIG9uZSBwbGFuZSBjb25maWdzICovCiAJaWYgKHNyX2hkaXNwbGF5ICYmICghcGxhbmVhX2Nsb2NrIHx8ICFwbGFuZWJfY2xvY2spKSB7CkBAIC0yOTc3LDE3ICszMTg2LDMxIEBACiAJCXN0YXRpYyBjb25zdCBpbnQgc3JfbGF0ZW5jeV9ucyA9IDEyMDAwOwogCiAJCXNyX2Nsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOwotCQlsaW5lX3RpbWVfdXMgPSAoKHNyX2hkaXNwbGF5ICogMTAwMCkgLyBzcl9jbG9jayk7CisJCWxpbmVfdGltZV91cyA9ICgoc3JfaHRvdGFsICogMTAwMCkgLyBzcl9jbG9jayk7CiAKIAkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZlIHByZWNpc2lvbiAqLwotCQlzcl9lbnRyaWVzID0gKCgoc3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cykgKyAxKSAqCi0JCQkgICAgICBwaXhlbF9zaXplICogc3JfaGRpc3BsYXkpIC8gMTAwMDsKLQkJc3JfZW50cmllcyA9IHJvdW5kdXAoc3JfZW50cmllcyAvIEk5MTVfRklGT19MSU5FX1NJWkUsIDEpOworCQlzcl9lbnRyaWVzID0gKCgoc3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cykgKyAxMDAwKSAvIDEwMDApICoKKwkJCSAgICAgIHBpeGVsX3NpemUgKiBzcl9oZGlzcGxheTsKKwkJc3JfZW50cmllcyA9IERJVl9ST1VORF9VUChzcl9lbnRyaWVzLCBJOTE1X0ZJRk9fTElORV9TSVpFKTsKIAkJRFJNX0RFQlVHKCJzZWxmLXJlZnJlc2ggZW50cmllczogJWRcbiIsIHNyX2VudHJpZXMpOwotCQlzcndtID0gSTk0NV9GSUZPX1NJWkUgLSBzcl9lbnRyaWVzOworCQlzcndtID0gSTk2NV9GSUZPX1NJWkUgLSBzcl9lbnRyaWVzOwogCQlpZiAoc3J3bSA8IDApCiAJCQlzcndtID0gMTsKLQkJc3J3bSAmPSAweDNmOworCQlzcndtICY9IDB4MWZmOworCisJCXNyX2VudHJpZXMgPSAoKChzcl9sYXRlbmN5X25zIC8gbGluZV90aW1lX3VzKSArIDEwMDApIC8gMTAwMCkgKgorCQkJICAgICBwaXhlbF9zaXplICogNjQ7CisJCXNyX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoc3JfZW50cmllcywKKwkJCQkJICBpOTY1X2N1cnNvcl93bV9pbmZvLmNhY2hlbGluZV9zaXplKTsKKwkJY3Vyc29yX3NyID0gaTk2NV9jdXJzb3Jfd21faW5mby5maWZvX3NpemUgLQorCQkJICAgIChzcl9lbnRyaWVzICsgaTk2NV9jdXJzb3Jfd21faW5mby5ndWFyZF9zaXplKTsKKworCQlpZiAoY3Vyc29yX3NyID4gaTk2NV9jdXJzb3Jfd21faW5mby5tYXhfd20pCisJCQljdXJzb3Jfc3IgPSBpOTY1X2N1cnNvcl93bV9pbmZvLm1heF93bTsKKworCQlEUk1fREVCVUdfS01TKCJzZWxmLXJlZnJlc2ggd2F0ZXJtYXJrOiBkaXNwbGF5IHBsYW5lICVkICIKKwkJCSAgICAgICJjdXJzb3IgJWRcbiIsIHNyd20sIGN1cnNvcl9zcik7CisKIAkJaWYgKElTX0k5NjVHTShkZXYpKQogCQkJSTkxNV9XUklURShGV19CTENfU0VMRiwgRldfQkxDX1NFTEZfRU4pOwogCX0gZWxzZSB7CkBAIC0zMDA0LDEwICszMjI3LDEzIEBACiAJSTkxNV9XUklURShEU1BGVzEsIChzcndtIDw8IERTUEZXX1NSX1NISUZUKSB8ICg4IDw8IDE2KSB8ICg4IDw8IDgpIHwKIAkJICAgKDggPDwgMCkpOwogCUk5MTVfV1JJVEUoRFNQRlcyLCAoOCA8PCA4KSB8ICg4IDw8IDApKTsKKwkvKiB1cGRhdGUgY3Vyc29yIFNSIHdhdGVybWFyayAqLworCUk5MTVfV1JJVEUoRFNQRlczLCAoY3Vyc29yX3NyIDw8IERTUEZXX0NVUlNPUl9TUl9TSElGVCkpOwogfQogCiBzdGF0aWMgdm9pZCBpOXh4X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2NrLAotCQkJICAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5LCBpbnQgcGl4ZWxfc2l6ZSkKKwkJCSAgIGludCBwbGFuZWJfY2xvY2ssIGludCBzcl9oZGlzcGxheSwgaW50IHNyX2h0b3RhbCwKKwkJCSAgIGludCBwaXhlbF9zaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgZndhdGVyX2xvOwpAQCAtMzA1MiwxMiArMzI3OCwxMiBAQAogCQlzdGF0aWMgY29uc3QgaW50IHNyX2xhdGVuY3lfbnMgPSA2MDAwOwogCiAJCXNyX2Nsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOwotCQlsaW5lX3RpbWVfdXMgPSAoKHNyX2hkaXNwbGF5ICogMTAwMCkgLyBzcl9jbG9jayk7CisJCWxpbmVfdGltZV91cyA9ICgoc3JfaHRvdGFsICogMTAwMCkgLyBzcl9jbG9jayk7CiAKIAkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZlIHByZWNpc2lvbiAqLwotCQlzcl9lbnRyaWVzID0gKCgoc3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cykgKyAxKSAqCi0JCQkgICAgICBwaXhlbF9zaXplICogc3JfaGRpc3BsYXkpIC8gMTAwMDsKLQkJc3JfZW50cmllcyA9IHJvdW5kdXAoc3JfZW50cmllcyAvIGNhY2hlbGluZV9zaXplLCAxKTsKKwkJc3JfZW50cmllcyA9ICgoKHNyX2xhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMpICsgMTAwMCkgLyAxMDAwKSAqCisJCQkgICAgICBwaXhlbF9zaXplICogc3JfaGRpc3BsYXk7CisJCXNyX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoc3JfZW50cmllcywgY2FjaGVsaW5lX3NpemUpOwogCQlEUk1fREVCVUdfS01TKCJzZWxmLXJlZnJlc2ggZW50cmllczogJWRcbiIsIHNyX2VudHJpZXMpOwogCQlzcndtID0gdG90YWxfc2l6ZSAtIHNyX2VudHJpZXM7CiAJCWlmIChzcndtIDwgMCkKQEAgLTMwOTUsNyArMzMyMSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGk4MzBfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZWFfY2xvY2ssIGludCB1bnVzZWQsCi0JCQkgICBpbnQgdW51c2VkMiwgaW50IHBpeGVsX3NpemUpCisJCQkgICBpbnQgdW51c2VkMiwgaW50IHVudXNlZDMsIGludCBwaXhlbF9zaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgZndhdGVyX2xvID0gSTkxNV9SRUFEKEZXX0JMQykgJiB+MHhmZmY7CkBAIC0zMTEzLDkgKzMzMzksMTEgQEAKIH0KIAogI2RlZmluZSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1kJCTcwMAorI2RlZmluZSBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZCQkxMzAwCiAKIHN0YXRpYyB2b2lkIGlyb25sYWtlX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCAgaW50IHBsYW5lYV9jbG9jaywKLQkJICAgICAgIGludCBwbGFuZWJfY2xvY2ssIGludCBzcl9oZGlzcGxheSwgaW50IHBpeGVsX3NpemUpCisJCSAgICAgICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBzcl9odG90YWwsCisJCSAgICAgICBpbnQgcGl4ZWxfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBwbGFuZWFfd20sIHBsYW5lYl93bSwgY3Vyc29yYV93bSwgY3Vyc29yYl93bTsKQEAgLTMxMjMsMjAgKzMzNTEsNDggQEAKIAl1bnNpZ25lZCBsb25nIGxpbmVfdGltZV91czsKIAlpbnQgc3JfY2xvY2ssIGVudHJpZXNfcmVxdWlyZWQ7CiAJdTMyIHJlZ192YWx1ZTsKKwlpbnQgbGluZV9jb3VudDsKKwlpbnQgcGxhbmVhX2h0b3RhbCA9IDAsIHBsYW5lYl9odG90YWwgPSAwOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YzsKKworCS8qIE5lZWQgaHRvdGFsIGZvciBhbGwgYWN0aXZlIGRpc3BsYXkgcGxhbmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwkJaWYgKGNydGMtPmVuYWJsZWQpIHsKKwkJCWlmIChpbnRlbF9jcnRjLT5wbGFuZSA9PSAwKQorCQkJCXBsYW5lYV9odG90YWwgPSBjcnRjLT5tb2RlLmh0b3RhbDsKKwkJCWVsc2UKKwkJCQlwbGFuZWJfaHRvdGFsID0gY3J0Yy0+bW9kZS5odG90YWw7CisJCX0KKwl9CiAKIAkvKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgd2F0ZXJtYXJrIGZvciBwbGFuZSBBICovCiAJaWYgKHBsYW5lYV9jbG9jaykgewogCQllbnRyaWVzX3JlcXVpcmVkID0gKChwbGFuZWFfY2xvY2sgLyAxMDAwKSAqIHBpeGVsX3NpemUgKgogCQkJCSAgICAgSUxLX0xQMF9QTEFORV9MQVRFTkNZKSAvIDEwMDA7CiAJCWVudHJpZXNfcmVxdWlyZWQgPSBESVZfUk9VTkRfVVAoZW50cmllc19yZXF1aXJlZCwKLQkJCQkgICBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8uY2FjaGVsaW5lX3NpemUpOworCQkJCQkJaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLmNhY2hlbGluZV9zaXplKTsKIAkJcGxhbmVhX3dtID0gZW50cmllc19yZXF1aXJlZCArCiAJCQkgICAgaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLmd1YXJkX3NpemU7CiAKIAkJaWYgKHBsYW5lYV93bSA+IChpbnQpaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLm1heF93bSkKIAkJCXBsYW5lYV93bSA9IGlyb25sYWtlX2Rpc3BsYXlfd21faW5mby5tYXhfd207CiAKLQkJY3Vyc29yYV93bSA9IDE2OworCQkvKiBVc2UgdGhlIGxhcmdlIGJ1ZmZlciBtZXRob2QgdG8gY2FsY3VsYXRlIGN1cnNvciB3YXRlcm1hcmsgKi8KKwkJbGluZV90aW1lX3VzID0gKHBsYW5lYV9odG90YWwgKiAxMDAwKSAvIHBsYW5lYV9jbG9jazsKKworCQkvKiBVc2UgbnMvdXMgdGhlbiBkaXZpZGUgdG8gcHJlc2VydmUgcHJlY2lzaW9uICovCisJCWxpbmVfY291bnQgPSAoSUxLX0xQMF9DVVJTT1JfTEFURU5DWSAvIGxpbmVfdGltZV91cyArIDEwMDApIC8gMTAwMDsKKworCQkvKiBjYWxjdWxhdGUgdGhlIGN1cnNvciB3YXRlcm1hcmsgZm9yIGN1cnNvciBBICovCisJCWVudHJpZXNfcmVxdWlyZWQgPSBsaW5lX2NvdW50ICogNjQgKiBwaXhlbF9zaXplOworCQllbnRyaWVzX3JlcXVpcmVkID0gRElWX1JPVU5EX1VQKGVudHJpZXNfcmVxdWlyZWQsCisJCQkJCQlpcm9ubGFrZV9jdXJzb3Jfd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CisJCWN1cnNvcmFfd20gPSBlbnRyaWVzX3JlcXVpcmVkICsgaXJvbmxha2VfY3Vyc29yX3dtX2luZm8uZ3VhcmRfc2l6ZTsKKwkJaWYgKGN1cnNvcmFfd20gPiBpcm9ubGFrZV9jdXJzb3Jfd21faW5mby5tYXhfd20pCisJCQljdXJzb3JhX3dtID0gaXJvbmxha2VfY3Vyc29yX3dtX2luZm8ubWF4X3dtOworCiAJCXJlZ192YWx1ZSA9IEk5MTVfUkVBRChXTTBfUElQRUFfSUxLKTsKIAkJcmVnX3ZhbHVlICY9IH4oV00wX1BJUEVfUExBTkVfTUFTSyB8IFdNMF9QSVBFX0NVUlNPUl9NQVNLKTsKIAkJcmVnX3ZhbHVlIHw9IChwbGFuZWFfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwKQEAgLTMxNTAsMTQgKzM0MDYsMjcgQEAKIAkJZW50cmllc19yZXF1aXJlZCA9ICgocGxhbmViX2Nsb2NrIC8gMTAwMCkgKiBwaXhlbF9zaXplICoKIAkJCQkgICAgIElMS19MUDBfUExBTkVfTEFURU5DWSkgLyAxMDAwOwogCQllbnRyaWVzX3JlcXVpcmVkID0gRElWX1JPVU5EX1VQKGVudHJpZXNfcmVxdWlyZWQsCi0JCQkJICAgaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLmNhY2hlbGluZV9zaXplKTsKKwkJCQkJCWlyb25sYWtlX2Rpc3BsYXlfd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CiAJCXBsYW5lYl93bSA9IGVudHJpZXNfcmVxdWlyZWQgKwogCQkJICAgIGlyb25sYWtlX2Rpc3BsYXlfd21faW5mby5ndWFyZF9zaXplOwogCiAJCWlmIChwbGFuZWJfd20gPiAoaW50KWlyb25sYWtlX2Rpc3BsYXlfd21faW5mby5tYXhfd20pCiAJCQlwbGFuZWJfd20gPSBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8ubWF4X3dtOwogCi0JCWN1cnNvcmJfd20gPSAxNjsKKwkJLyogVXNlIHRoZSBsYXJnZSBidWZmZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBjdXJzb3Igd2F0ZXJtYXJrICovCisJCWxpbmVfdGltZV91cyA9IChwbGFuZWJfaHRvdGFsICogMTAwMCkgLyBwbGFuZWJfY2xvY2s7CisKKwkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZlIHByZWNpc2lvbiAqLworCQlsaW5lX2NvdW50ID0gKElMS19MUDBfQ1VSU09SX0xBVEVOQ1kgLyBsaW5lX3RpbWVfdXMgKyAxMDAwKSAvIDEwMDA7CisKKwkJLyogY2FsY3VsYXRlIHRoZSBjdXJzb3Igd2F0ZXJtYXJrIGZvciBjdXJzb3IgQiAqLworCQllbnRyaWVzX3JlcXVpcmVkID0gbGluZV9jb3VudCAqIDY0ICogcGl4ZWxfc2l6ZTsKKwkJZW50cmllc19yZXF1aXJlZCA9IERJVl9ST1VORF9VUChlbnRyaWVzX3JlcXVpcmVkLAorCQkJCQkJaXJvbmxha2VfY3Vyc29yX3dtX2luZm8uY2FjaGVsaW5lX3NpemUpOworCQljdXJzb3JiX3dtID0gZW50cmllc19yZXF1aXJlZCArIGlyb25sYWtlX2N1cnNvcl93bV9pbmZvLmd1YXJkX3NpemU7CisJCWlmIChjdXJzb3JiX3dtID4gaXJvbmxha2VfY3Vyc29yX3dtX2luZm8ubWF4X3dtKQorCQkJY3Vyc29yYl93bSA9IGlyb25sYWtlX2N1cnNvcl93bV9pbmZvLm1heF93bTsKKwogCQlyZWdfdmFsdWUgPSBJOTE1X1JFQUQoV00wX1BJUEVCX0lMSyk7CiAJCXJlZ192YWx1ZSAmPSB+KFdNMF9QSVBFX1BMQU5FX01BU0sgfCBXTTBfUElQRV9DVVJTT1JfTUFTSyk7CiAJCXJlZ192YWx1ZSB8PSAocGxhbmViX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8CkBAIC0zMTcyLDEyICszNDQxLDEyIEBACiAJICogZGlzcGxheSBwbGFuZSBpcyB1c2VkLgogCSAqLwogCWlmICghcGxhbmVhX2Nsb2NrIHx8ICFwbGFuZWJfY2xvY2spIHsKLQkJaW50IGxpbmVfY291bnQ7CisKIAkJLyogUmVhZCB0aGUgc2VsZi1yZWZyZXNoIGxhdGVuY3kuIFRoZSB1bml0IGlzIDAuNXVzICovCiAJCWludCBpbGtfc3JfbGF0ZW5jeSA9IEk5MTVfUkVBRChNTFRSX0lMSykgJiBJTEtfU1JMVF9NQVNLOwogCiAJCXNyX2Nsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOwotCQlsaW5lX3RpbWVfdXMgPSAoKHNyX2hkaXNwbGF5ICogMTAwMCkgLyBzcl9jbG9jayk7CisJCWxpbmVfdGltZV91cyA9ICgoc3JfaHRvdGFsICogMTAwMCkgLyBzcl9jbG9jayk7CiAKIAkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZlIHByZWNpc2lvbiAqLwogCQlsaW5lX2NvdW50ID0gKChpbGtfc3JfbGF0ZW5jeSAqIDUwMCkgLyBsaW5lX3RpbWVfdXMgKyAxMDAwKQpAQCAtMzE4NiwxNCArMzQ1NSwxNCBAQAogCQkvKiBjYWxjdWxhdGUgdGhlIHNlbGYtcmVmcmVzaCB3YXRlcm1hcmsgZm9yIGRpc3BsYXkgcGxhbmUgKi8KIAkJZW50cmllc19yZXF1aXJlZCA9IGxpbmVfY291bnQgKiBzcl9oZGlzcGxheSAqIHBpeGVsX3NpemU7CiAJCWVudHJpZXNfcmVxdWlyZWQgPSBESVZfUk9VTkRfVVAoZW50cmllc19yZXF1aXJlZCwKLQkJCQkgICBpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CisJCQkJCQlpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CiAJCXNyX3dtID0gZW50cmllc19yZXF1aXJlZCArCiAJCQlpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mby5ndWFyZF9zaXplOwogCiAJCS8qIGNhbGN1bGF0ZSB0aGUgc2VsZi1yZWZyZXNoIHdhdGVybWFyayBmb3IgZGlzcGxheSBjdXJzb3IgKi8KIAkJZW50cmllc19yZXF1aXJlZCA9IGxpbmVfY291bnQgKiBwaXhlbF9zaXplICogNjQ7CiAJCWVudHJpZXNfcmVxdWlyZWQgPSBESVZfUk9VTkRfVVAoZW50cmllc19yZXF1aXJlZCwKLQkJCQkgICBpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLmNhY2hlbGluZV9zaXplKTsKKwkJCQkJCWlyb25sYWtlX2N1cnNvcl9zcndtX2luZm8uY2FjaGVsaW5lX3NpemUpOwogCQljdXJzb3Jfd20gPSBlbnRyaWVzX3JlcXVpcmVkICsKIAkJCSAgICBpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLmd1YXJkX3NpemU7CiAKQEAgLTMyMzcsNiArMzUwNiw3IEBACiAgKiAgICAgICBieXRlcyBwZXIgcGl4ZWwKICAqICAgd2hlcmUKICAqICAgICBsaW5lIHRpbWUgPSBodG90YWwgLyBkb3RjbG9jaworICogICAgIHN1cmZhY2Ugd2lkdGggPSBoZGlzcGxheSBmb3Igbm9ybWFsIHBsYW5lIGFuZCA2NCBmb3IgY3Vyc29yCiAgKiAgIGFuZCBsYXRlbmN5IGlzIGFzc3VtZWQgdG8gYmUgaGlnaCwgYXMgYWJvdmUuCiAgKgogICogVGhlIGZpbmFsIHZhbHVlIHByb2dyYW1tZWQgdG8gdGhlIHJlZ2lzdGVyIHNob3VsZCBhbHdheXMgYmUgcm91bmRlZCB1cCwKQEAgLTMyNTMsNiArMzUyMyw3IEBACiAJaW50IHNyX2hkaXNwbGF5ID0gMDsKIAl1bnNpZ25lZCBsb25nIHBsYW5lYV9jbG9jayA9IDAsIHBsYW5lYl9jbG9jayA9IDAsIHNyX2Nsb2NrID0gMDsKIAlpbnQgZW5hYmxlZCA9IDAsIHBpeGVsX3NpemUgPSAwOworCWludCBzcl9odG90YWwgPSAwOwogCiAJaWYgKCFkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20pCiAJCXJldHVybjsKQEAgLTMyNzMsNiArMzU0NCw3IEBACiAJCQl9CiAJCQlzcl9oZGlzcGxheSA9IGNydGMtPm1vZGUuaGRpc3BsYXk7CiAJCQlzcl9jbG9jayA9IGNydGMtPm1vZGUuY2xvY2s7CisJCQlzcl9odG90YWwgPSBjcnRjLT5tb2RlLmh0b3RhbDsKIAkJCWlmIChjcnRjLT5mYikKIAkJCQlwaXhlbF9zaXplID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKIAkJCWVsc2UKQEAgLTMyODQsNyArMzU1Niw3IEBACiAJCXJldHVybjsKIAogCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bShkZXYsIHBsYW5lYV9jbG9jaywgcGxhbmViX2Nsb2NrLAotCQkJCSAgICBzcl9oZGlzcGxheSwgcGl4ZWxfc2l6ZSk7CisJCQkJICAgIHNyX2hkaXNwbGF5LCBzcl9odG90YWwsIHBpeGVsX3NpemUpOwogfQogCiBzdGF0aWMgaW50IGludGVsX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLApAQCAtMzQwMyw2ICszNjc1LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogRW5zdXJlIHRoYXQgdGhlIGN1cnNvciBpcyB2YWxpZCBmb3IgdGhlIG5ldyBtb2RlIGJlZm9yZSBjaGFuZ2luZy4uLiAqLworCWludGVsX2NydGNfdXBkYXRlX2N1cnNvcihjcnRjKTsKKwogCWlmIChpc19sdmRzICYmIGRldl9wcml2LT5sdmRzX2Rvd25jbG9ja19hdmFpbCkgewogCQloYXNfcmVkdWNlZF9jbG9jayA9IGxpbWl0LT5maW5kX3BsbChsaW1pdCwgY3J0YywKIAkJCQkJCQkgICAgZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrLApAQCAtMzQ2OSw3ICszNzQ0LDcgQEAKIAkJCQl0ZW1wIHw9IFBJUEVfOEJQQzsKIAkJCWVsc2UKIAkJCQl0ZW1wIHw9IFBJUEVfNkJQQzsKLQkJfSBlbHNlIGlmIChpc19lZHApIHsKKwkJfSBlbHNlIGlmIChpc19lZHAgfHwgKGlzX2RwICYmIGludGVsX3BjaF9oYXNfZWRwKGNydGMpKSkgewogCQkJc3dpdGNoIChkZXZfcHJpdi0+ZWRwX2JwcC8zKSB7CiAJCQljYXNlIDg6CiAJCQkJdGVtcCB8PSBQSVBFXzhCUEM7CkBAIC0zNzEyLDYgKzM5ODcsMTEgQEAKIAkJdWRlbGF5KDE1MCk7CiAJfQogCisJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgeworCQlwaXBlY29uZiAmPSB+UElQRV9FTkFCTEVfRElUSEVSOworCQlwaXBlY29uZiAmPSB+UElQRV9ESVRIRVJfVFlQRV9NQVNLOworCX0KKwogCS8qIFRoZSBMVkRTIHBpbiBwYWlyIG5lZWRzIHRvIGJlIG9uIGJlZm9yZSB0aGUgRFBMTHMgYXJlIGVuYWJsZWQuCiAJICogVGhpcyBpcyBhbiBleGNlcHRpb24gdG8gdGhlIGdlbmVyYWwgcnVsZSB0aGF0IG1vZGVfc2V0IGRvZXNuJ3QgdHVybgogCSAqIHRoaW5ncyBvbi4KQEAgLTM3NTQsMTYgKzQwMzQsMTMgQEAKIAkJCWlmIChkZXZfcHJpdi0+bHZkc19kaXRoZXIpIHsKIAkJCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCQkJCXBpcGVjb25mIHw9IFBJUEVfRU5BQkxFX0RJVEhFUjsKLQkJCQkJcGlwZWNvbmYgJj0gflBJUEVfRElUSEVSX1RZUEVfTUFTSzsKIAkJCQkJcGlwZWNvbmYgfD0gUElQRV9ESVRIRVJfVFlQRV9TVDAxOwogCQkJCX0gZWxzZQogCQkJCQlsdmRzIHw9IExWRFNfRU5BQkxFX0RJVEhFUjsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewotCQkJCQlwaXBlY29uZiAmPSB+UElQRV9FTkFCTEVfRElUSEVSOwotCQkJCQlwaXBlY29uZiAmPSB+UElQRV9ESVRIRVJfVFlQRV9NQVNLOwotCQkJCX0gZWxzZQorCQkJCWlmICghSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCQkJCWx2ZHMgJj0gfkxWRFNfRU5BQkxFX0RJVEhFUjsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJSTkxNV9XUklURShsdmRzX3JlZywgbHZkcyk7CkBAIC0zOTM5LDYgKzQyMTYsODUgQEAKIAl9CiB9CiAKKy8qIElmIG5vLXBhcnQgb2YgdGhlIGN1cnNvciBpcyB2aXNpYmxlIG9uIHRoZSBmcmFtZWJ1ZmZlciwgdGhlbiB0aGUgR1BVIG1heSBoYW5nLi4uICovCitzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX3VwZGF0ZV9jdXJzb3Ioc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCWludCB4ID0gaW50ZWxfY3J0Yy0+Y3Vyc29yX3g7CisJaW50IHkgPSBpbnRlbF9jcnRjLT5jdXJzb3JfeTsKKwl1aW50MzJfdCBiYXNlLCBwb3M7CisJYm9vbCB2aXNpYmxlOworCisJcG9zID0gMDsKKworCWlmIChjcnRjLT5mYikgeworCQliYXNlID0gaW50ZWxfY3J0Yy0+Y3Vyc29yX2FkZHI7CisJCWlmICh4ID4gKGludCkgY3J0Yy0+ZmItPndpZHRoKQorCQkJYmFzZSA9IDA7CisKKwkJaWYgKHkgPiAoaW50KSBjcnRjLT5mYi0+aGVpZ2h0KQorCQkJYmFzZSA9IDA7CisJfSBlbHNlCisJCWJhc2UgPSAwOworCisJaWYgKHggPCAwKSB7CisJCWlmICh4ICsgaW50ZWxfY3J0Yy0+Y3Vyc29yX3dpZHRoIDwgMCkKKwkJCWJhc2UgPSAwOworCisJCXBvcyB8PSBDVVJTT1JfUE9TX1NJR04gPDwgQ1VSU09SX1hfU0hJRlQ7CisJCXggPSAteDsKKwl9CisJcG9zIHw9IHggPDwgQ1VSU09SX1hfU0hJRlQ7CisKKwlpZiAoeSA8IDApIHsKKwkJaWYgKHkgKyBpbnRlbF9jcnRjLT5jdXJzb3JfaGVpZ2h0IDwgMCkKKwkJCWJhc2UgPSAwOworCisJCXBvcyB8PSBDVVJTT1JfUE9TX1NJR04gPDwgQ1VSU09SX1lfU0hJRlQ7CisJCXkgPSAteTsKKwl9CisJcG9zIHw9IHkgPDwgQ1VSU09SX1lfU0hJRlQ7CisKKwl2aXNpYmxlID0gYmFzZSAhPSAwOworCWlmICghdmlzaWJsZSAmJiAhaW50ZWxfY3J0Yy0+Y3Vyc29yX3Zpc2JsZSkKKwkJcmV0dXJuOworCisJSTkxNV9XUklURShwaXBlID09IDAgPyBDVVJBUE9TIDogQ1VSQlBPUywgcG9zKTsKKwlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX3Zpc2JsZSAhPSB2aXNpYmxlKSB7CisJCXVpbnQzMl90IGNudGwgPSBJOTE1X1JFQUQocGlwZSA9PSAwID8gQ1VSQUNOVFIgOiBDVVJCQ05UUik7CisJCWlmIChiYXNlKSB7CisJCQkvKiBIb29yYXkgZm9yIENVUipDTlRSIGRpZmZlcmVuY2VzICovCisJCQlpZiAoSVNfTU9CSUxFKGRldikgfHwgSVNfSTlYWChkZXYpKSB7CisJCQkJY250bCAmPSB+KENVUlNPUl9NT0RFIHwgTUNVUlNPUl9QSVBFX1NFTEVDVCk7CisJCQkJY250bCB8PSBDVVJTT1JfTU9ERV82NF9BUkdCX0FYIHwgTUNVUlNPUl9HQU1NQV9FTkFCTEU7CisJCQkJY250bCB8PSBwaXBlIDw8IDI4OyAvKiBDb25uZWN0IHRvIGNvcnJlY3QgcGlwZSAqLworCQkJfSBlbHNlIHsKKwkJCQljbnRsICY9IH4oQ1VSU09SX0ZPUk1BVF9NQVNLKTsKKwkJCQljbnRsIHw9IENVUlNPUl9FTkFCTEU7CisJCQkJY250bCB8PSBDVVJTT1JfRk9STUFUX0FSR0IgfCBDVVJTT1JfR0FNTUFfRU5BQkxFOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKElTX01PQklMRShkZXYpIHx8IElTX0k5WFgoZGV2KSkgeworCQkJCWNudGwgJj0gfihDVVJTT1JfTU9ERSB8IE1DVVJTT1JfR0FNTUFfRU5BQkxFKTsKKwkJCQljbnRsIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7CisJCQl9IGVsc2UgeworCQkJCWNudGwgJj0gfihDVVJTT1JfRU5BQkxFIHwgQ1VSU09SX0dBTU1BX0VOQUJMRSk7CisJCQl9CisJCX0KKwkJSTkxNV9XUklURShwaXBlID09IDAgPyBDVVJBQ05UUiA6IENVUkJDTlRSLCBjbnRsKTsKKworCQlpbnRlbF9jcnRjLT5jdXJzb3JfdmlzYmxlID0gdmlzaWJsZTsKKwl9CisJLyogYW5kIGNvbW1pdCBjaGFuZ2VzIG9uIG5leHQgdmJsYW5rICovCisJSTkxNV9XUklURShwaXBlID09IDAgPyBDVVJBQkFTRSA6IENVUkJCQVNFLCBiYXNlKTsKKworCWlmICh2aXNpYmxlKQorCQlpbnRlbF9tYXJrX2J1c3koZGV2LCB0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYiktPm9iaik7Cit9CisKIHN0YXRpYyBpbnQgaW50ZWxfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkJIHVpbnQzMl90IGhhbmRsZSwKQEAgLTM5NDksMTEgKzQzMDUsNyBAQAogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmJvOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7Ci0JdWludDMyX3QgY29udHJvbCA9IChwaXBlID09IDApID8gQ1VSQUNOVFIgOiBDVVJCQ05UUjsKLQl1aW50MzJfdCBiYXNlID0gKHBpcGUgPT0gMCkgPyBDVVJBQkFTRSA6IENVUkJCQVNFOwotCXVpbnQzMl90IHRlbXAgPSBJOTE1X1JFQUQoY29udHJvbCk7Ci0Jc2l6ZV90IGFkZHI7CisJdWludDMyX3QgYWRkcjsKIAlpbnQgcmV0OwogCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKQEAgLTM5NjEsMTIgKzQzMTMsNiBAQAogCS8qIGlmIHdlIHdhbnQgdG8gdHVybiBvZmYgdGhlIGN1cnNvciBpZ25vcmUgd2lkdGggYW5kIGhlaWdodCAqLwogCWlmICghaGFuZGxlKSB7CiAJCURSTV9ERUJVR19LTVMoImN1cnNvciBvZmZcbiIpOwotCQlpZiAoSVNfTU9CSUxFKGRldikgfHwgSVNfSTlYWChkZXYpKSB7Ci0JCQl0ZW1wICY9IH4oQ1VSU09SX01PREUgfCBNQ1VSU09SX0dBTU1BX0VOQUJMRSk7Ci0JCQl0ZW1wIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wICY9IH4oQ1VSU09SX0VOQUJMRSB8IENVUlNPUl9HQU1NQV9FTkFCTEUpOwotCQl9CiAJCWFkZHIgPSAwOwogCQlibyA9IE5VTEw7CiAJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTQwMDgsNyArNDM1NCw4IEBACiAKIAkJYWRkciA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OwogCX0gZWxzZSB7Ci0JCXJldCA9IGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChkZXYsIGJvLCAocGlwZSA9PSAwKSA/IEk5MTVfR0VNX1BIWVNfQ1VSU09SXzAgOiBJOTE1X0dFTV9QSFlTX0NVUlNPUl8xKTsKKwkJcmV0ID0gaTkxNV9nZW1fYXR0YWNoX3BoeXNfb2JqZWN0KGRldiwgYm8sCisJCQkJCQkgIChpbnRlbF9jcnRjLT5waXBlID09IDApID8gSTkxNV9HRU1fUEhZU19DVVJTT1JfMCA6IEk5MTVfR0VNX1BIWVNfQ1VSU09SXzEpOwogCQlpZiAocmV0KSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBhdHRhY2ggcGh5cyBvYmplY3RcbiIpOwogCQkJZ290byBmYWlsX2xvY2tlZDsKQEAgLTQwMTksMjEgKzQzNjYsNyBAQAogCWlmICghSVNfSTlYWChkZXYpKQogCQlJOTE1X1dSSVRFKENVUlNJWkUsIChoZWlnaHQgPDwgMTIpIHwgd2lkdGgpOwogCi0JLyogSG9vcmF5IGZvciBDVVIqQ05UUiBkaWZmZXJlbmNlcyAqLwotCWlmIChJU19NT0JJTEUoZGV2KSB8fCBJU19JOVhYKGRldikpIHsKLQkJdGVtcCAmPSB+KENVUlNPUl9NT0RFIHwgTUNVUlNPUl9QSVBFX1NFTEVDVCk7Ci0JCXRlbXAgfD0gQ1VSU09SX01PREVfNjRfQVJHQl9BWCB8IE1DVVJTT1JfR0FNTUFfRU5BQkxFOwotCQl0ZW1wIHw9IChwaXBlIDw8IDI4KTsgLyogQ29ubmVjdCB0byBjb3JyZWN0IHBpcGUgKi8KLQl9IGVsc2UgewotCQl0ZW1wICY9IH4oQ1VSU09SX0ZPUk1BVF9NQVNLKTsKLQkJdGVtcCB8PSBDVVJTT1JfRU5BQkxFOwotCQl0ZW1wIHw9IENVUlNPUl9GT1JNQVRfQVJHQiB8IENVUlNPUl9HQU1NQV9FTkFCTEU7Ci0JfQotCiAgZmluaXNoOgotCUk5MTVfV1JJVEUoY29udHJvbCwgdGVtcCk7Ci0JSTkxNV9XUklURShiYXNlLCBhZGRyKTsKLQogCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfYm8pIHsKIAkJaWYgKGRldl9wcml2LT5pbmZvLT5jdXJzb3JfbmVlZHNfcGh5c2ljYWwpIHsKIAkJCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfYm8gIT0gYm8pCkBAIC00MDQ3LDYgKzQzODAsMTAgQEAKIAogCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKIAlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBibzsKKwlpbnRlbF9jcnRjLT5jdXJzb3Jfd2lkdGggPSB3aWR0aDsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfaGVpZ2h0ID0gaGVpZ2h0OworCisJaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKGNydGMpOwogCiAJcmV0dXJuIDA7CiBmYWlsX3VucGluOgpAQCAtNDA2MCwzNCArNDM5NywxMiBAQAogCiBzdGF0aWMgaW50IGludGVsX2NydGNfY3Vyc29yX21vdmUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHkpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOwotCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQl1aW50MzJfdCB0ZW1wID0gMDsKLQl1aW50MzJfdCBhZGRlcjsKIAotCWlmIChjcnRjLT5mYikgewotCQlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKLQkJaW50ZWxfbWFya19idXN5KGRldiwgaW50ZWxfZmItPm9iaik7Ci0JfQorCWludGVsX2NydGMtPmN1cnNvcl94ID0geDsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfeSA9IHk7CiAKLQlpZiAoeCA8IDApIHsKLQkJdGVtcCB8PSBDVVJTT1JfUE9TX1NJR04gPDwgQ1VSU09SX1hfU0hJRlQ7Ci0JCXggPSAteDsKLQl9Ci0JaWYgKHkgPCAwKSB7Ci0JCXRlbXAgfD0gQ1VSU09SX1BPU19TSUdOIDw8IENVUlNPUl9ZX1NISUZUOwotCQl5ID0gLXk7Ci0JfQotCi0JdGVtcCB8PSB4IDw8IENVUlNPUl9YX1NISUZUOwotCXRlbXAgfD0geSA8PCBDVVJTT1JfWV9TSElGVDsKLQotCWFkZGVyID0gaW50ZWxfY3J0Yy0+Y3Vyc29yX2FkZHI7Ci0JSTkxNV9XUklURSgocGlwZSA9PSAwKSA/IENVUkFQT1MgOiBDVVJCUE9TLCB0ZW1wKTsKLQlJOTE1X1dSSVRFKChwaXBlID09IDApID8gQ1VSQUJBU0UgOiBDVVJCQkFTRSwgYWRkZXIpOworCWludGVsX2NydGNfdXBkYXRlX2N1cnNvcihjcnRjKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDY3MSw2ICs0OTg2LDggQEAKIAkgICAgYXRvbWljX2RlY19hbmRfdGVzdCgmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCkpCiAJCURSTV9XQUtFVVAoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUpOwogCXNjaGVkdWxlX3dvcmsoJndvcmstPndvcmspOworCisJdHJhY2VfaTkxNV9mbGlwX2NvbXBsZXRlKGludGVsX2NydGMtPnBsYW5lLCB3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqKTsKIH0KIAogdm9pZCBpbnRlbF9maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQpAQCAtNDc0OCwyNyArNTA2NSwyMiBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCQlpbnRlbF9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Ci0KLQkJa2ZyZWUod29yayk7Ci0KLQkJRFJNX0RFQlVHX0RSSVZFUigiZmxpcCBxdWV1ZTogJXAgcGluICYgZmVuY2UgZmFpbGVkXG4iLAotCQkJCSB0b19pbnRlbF9ibyhvYmopKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwX3dvcms7CiAKIAkvKiBSZWZlcmVuY2UgdGhlIG9iamVjdHMgZm9yIHRoZSBzY2hlZHVsZWQgd29yay4gKi8KIAlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uod29yay0+b2xkX2ZiX29iaik7CiAJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7CiAKIAljcnRjLT5mYiA9IGZiOwotCWk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4ob2JqKTsKLQlkcm1fdmJsYW5rX2dldChkZXYsIGludGVsX2NydGMtPnBpcGUpOworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4ob2JqKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFudXBfb2JqczsKKworCXJldCA9IGRybV92YmxhbmtfZ2V0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwX29ianM7CisKIAlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJYXRvbWljX2luYygmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCk7CiAJd29yay0+cGVuZGluZ19mbGlwX29iaiA9IG9iajsKQEAgLTQ4MDYsNyArNTExOCwyMyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKKwl0cmFjZV9pOTE1X2ZsaXBfcmVxdWVzdChpbnRlbF9jcnRjLT5wbGFuZSwgb2JqKTsKKwogCXJldHVybiAwOworCitjbGVhbnVwX29ianM6CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uod29yay0+b2xkX2ZiX29iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKK2NsZWFudXBfd29yazoKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlpbnRlbF9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWtmcmVlKHdvcmspOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgaW50ZWxfaGVscGVyX2Z1bmNzID0gewpAQCAtNDgxNCw2ICs1MTQyLDcgQEAKIAkubW9kZV9maXh1cCA9IGludGVsX2NydGNfbW9kZV9maXh1cCwKIAkubW9kZV9zZXQgPSBpbnRlbF9jcnRjX21vZGVfc2V0LAogCS5tb2RlX3NldF9iYXNlID0gaW50ZWxfcGlwZV9zZXRfYmFzZSwKKwkubW9kZV9zZXRfYmFzZV9hdG9taWMgPSBpbnRlbF9waXBlX3NldF9iYXNlX2F0b21pYywKIAkucHJlcGFyZSA9IGludGVsX2NydGNfcHJlcGFyZSwKIAkuY29tbWl0ID0gaW50ZWxfY3J0Y19jb21taXQsCiAJLmxvYWRfbHV0ID0gaW50ZWxfY3J0Y19sb2FkX2x1dCwKQEAgLTQ5MzIsMTkgKzUyNjEsMjYgQEAKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlib29sIGRwZF9pc19lZHAgPSBmYWxzZTsKIAotCWludGVsX2NydF9pbml0KGRldik7Ci0KLQkvKiBTZXQgdXAgaW50ZWdyYXRlZCBMVkRTICovCiAJaWYgKElTX01PQklMRShkZXYpICYmICFJU19JODMwKGRldikpCiAJCWludGVsX2x2ZHNfaW5pdChkZXYpOwogCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewotCQlpbnQgZm91bmQ7CisJCWRwZF9pc19lZHAgPSBpbnRlbF9kcGRfaXNfZWRwKGRldik7CiAKIAkJaWYgKElTX01PQklMRShkZXYpICYmIChJOTE1X1JFQUQoRFBfQSkgJiBEUF9ERVRFQ1RFRCkpCiAJCQlpbnRlbF9kcF9pbml0KGRldiwgRFBfQSk7CiAKKwkJaWYgKGRwZF9pc19lZHAgJiYgKEk5MTVfUkVBRChQQ0hfRFBfRCkgJiBEUF9ERVRFQ1RFRCkpCisJCQlpbnRlbF9kcF9pbml0KGRldiwgUENIX0RQX0QpOworCX0KKworCWludGVsX2NydF9pbml0KGRldik7CisKKwlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CisJCWludCBmb3VuZDsKKwogCQlpZiAoSTkxNV9SRUFEKEhETUlCKSAmIFBPUlRfREVURUNURUQpIHsKIAkJCS8qIFBDSCBTRFZPQiBtdWx0aXBsZXggd2l0aCBIRE1JQiAqLwogCQkJZm91bmQgPSBpbnRlbF9zZHZvX2luaXQoZGV2LCBQQ0hfU0RWT0IpOwpAQCAtNDk2Myw3ICs1Mjk5LDcgQEAKIAkJaWYgKEk5MTVfUkVBRChQQ0hfRFBfQykgJiBEUF9ERVRFQ1RFRCkKIAkJCWludGVsX2RwX2luaXQoZGV2LCBQQ0hfRFBfQyk7CiAKLQkJaWYgKEk5MTVfUkVBRChQQ0hfRFBfRCkgJiBEUF9ERVRFQ1RFRCkKKwkJaWYgKCFkcGRfaXNfZWRwICYmIChJOTE1X1JFQUQoUENIX0RQX0QpICYgRFBfREVURUNURUQpKQogCQkJaW50ZWxfZHBfaW5pdChkZXYsIFBDSF9EUF9EKTsKIAogCX0gZWxzZSBpZiAoU1VQUE9SVFNfRElHSVRBTF9PVVRQVVRTKGRldikpIHsKQEAgLTUzNzIsNiArNTcwOCwyNiBAQAogCQkJCQkoSTkxNV9SRUFEKERJU1BfQVJCX0NUTCkgfAogCQkJCQkJRElTUF9GQkNfV01fRElTKSk7CiAJCX0KKwkJLyoKKwkJICogQmFzZWQgb24gdGhlIGRvY3VtZW50IGZyb20gaGFyZHdhcmUgZ3V5cyB0aGUgZm9sbG93aW5nIGJpdHMKKwkJICogc2hvdWxkIGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgaW4gb3JkZXIgdG8gZW5hYmxlIEZCQy4KKwkJICogVGhlIGJpdCAyMiBvZiAweDQyMDAwCisJCSAqIFRoZSBiaXQgMjIgb2YgMHg0MjAwNAorCQkgKiBUaGUgYml0IDcsOCw5IG9mIDB4NDIwMjAuCisJCSAqLworCQlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKSB7CisJCQlJOTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4xLAorCQkJCSAgIEk5MTVfUkVBRChJTEtfRElTUExBWV9DSElDS0VOMSkgfAorCQkJCSAgIElMS19GQkNRX0RJUyk7CisJCQlJOTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4yLAorCQkJCSAgIEk5MTVfUkVBRChJTEtfRElTUExBWV9DSElDS0VOMikgfAorCQkJCSAgIElMS19EUEFSQl9HQVRFKTsKKwkJCUk5MTVfV1JJVEUoSUxLX0RTUENMS19HQVRFLAorCQkJCSAgIEk5MTVfUkVBRChJTEtfRFNQQ0xLX0dBVEUpIHwKKwkJCQkgICBJTEtfRFBGQ19ESVMxIHwKKwkJCQkgICBJTEtfRFBGQ19ESVMyIHwKKwkJCQkgICBJTEtfQ0xLX0ZCQyk7CisJCX0KIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoSVNfRzRYKGRldikpIHsKIAkJdWludDMyX3QgZHNwY2xrX2dhdGU7CkBAIC01NDUwLDcgKzU4MDYsMTEgQEAKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZHBtcyA9IGk5eHhfY3J0Y19kcG1zOwogCiAJaWYgKEk5MTVfSEFTX0ZCQyhkZXYpKSB7Ci0JCWlmIChJU19HTTQ1KGRldikpIHsKKwkJaWYgKElTX0lST05MQUtFX00oZGV2KSkgeworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQgPSBpcm9ubGFrZV9mYmNfZW5hYmxlZDsKKwkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpcm9ubGFrZV9lbmFibGVfZmJjOworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBpcm9ubGFrZV9kaXNhYmxlX2ZiYzsKKwkJfSBlbHNlIGlmIChJU19HTTQ1KGRldikpIHsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkID0gZzR4X2ZiY19lbmFibGVkOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2ZiYyA9IGc0eF9lbmFibGVfZmJjOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBnNHhfZGlzYWJsZV9mYmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwppbmRleCA1ZGRlODBmLi40MGJlMWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgRFBfTElOS19DT05GSUdVUkFUSU9OX1NJWkUJOQogCiAjZGVmaW5lIElTX2VEUChpKSAoKGkpLT50eXBlID09IElOVEVMX09VVFBVVF9FRFApCisjZGVmaW5lIElTX1BDSF9lRFAoZHBfcHJpdikgKChkcF9wcml2KS0+aXNfcGNoX2VkcCkKIAogc3RydWN0IGludGVsX2RwX3ByaXYgewogCXVpbnQzMl90IG91dHB1dF9yZWc7CkBAIC01Niw2ICs1Nyw3IEBACiAJc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXI7CiAJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CiAJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhIGFsZ287CisJYm9vbCBpc19wY2hfZWRwOwogfTsKIAogc3RhdGljIHZvaWQKQEAgLTEyOCw4ICsxMzAsOSBAQAogCQkgICAgICAgc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIsIGludCBwaXhlbF9jbG9jaykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9kcF9wcml2ICpkcF9wcml2ID0gaW50ZWxfZW5jb2Rlci0+ZGV2X3ByaXY7CiAKLQlpZiAoSVNfZURQKGludGVsX2VuY29kZXIpKQorCWlmIChJU19lRFAoaW50ZWxfZW5jb2RlcikgfHwgSVNfUENIX2VEUChkcF9wcml2KSkKIAkJcmV0dXJuIChwaXhlbF9jbG9jayAqIGRldl9wcml2LT5lZHBfYnBwKSAvIDg7CiAJZWxzZQogCQlyZXR1cm4gcGl4ZWxfY2xvY2sgKiAzOwpAQCAtMTQ3LDkgKzE1MCwyMSBAQAogewogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IGludGVsX2F0dGFjaGVkX2VuY29kZXIoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciA9IGVuY190b19pbnRlbF9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBpbnRlbF9kcF9wcml2ICpkcF9wcml2ID0gaW50ZWxfZW5jb2Rlci0+ZGV2X3ByaXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IG1heF9saW5rX2Nsb2NrID0gaW50ZWxfZHBfbGlua19jbG9jayhpbnRlbF9kcF9tYXhfbGlua19idyhpbnRlbF9lbmNvZGVyKSk7CiAJaW50IG1heF9sYW5lcyA9IGludGVsX2RwX21heF9sYW5lX2NvdW50KGludGVsX2VuY29kZXIpOwogCisJaWYgKChJU19lRFAoaW50ZWxfZW5jb2RlcikgfHwgSVNfUENIX2VEUChkcF9wcml2KSkgJiYKKwkgICAgZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ID4gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5KQorCQkJcmV0dXJuIE1PREVfUEFORUw7CisKKwkJaWYgKG1vZGUtPnZkaXNwbGF5ID4gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5KQorCQkJcmV0dXJuIE1PREVfUEFORUw7CisJfQorCiAJLyogb25seSByZWZ1c2UgdGhlIG1vZGUgb24gbm9uIGVEUCBzaW5jZSB3ZSBoYXZlIHNlZW4gc29tZSB3aWVyZCBlRFAgcGFuZWxzCiAJICAgd2hpY2ggYXJlIG91dHNpZGUgc3BlYyB0b2xlcmFuY2VzIGJ1dCBzb21laG93IHdvcmsgYnkgbWFnaWMgKi8KIAlpZiAoIUlTX2VEUChpbnRlbF9lbmNvZGVyKSAmJgpAQCAtNTA4LDExICs1MjMsMzcgQEAKIHsKIAlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciA9IGVuY190b19pbnRlbF9lbmNvZGVyKGVuY29kZXIpOwogCXN0cnVjdCBpbnRlbF9kcF9wcml2ICAgKmRwX3ByaXYgPSBpbnRlbF9lbmNvZGVyLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGxhbmVfY291bnQsIGNsb2NrOwogCWludCBtYXhfbGFuZV9jb3VudCA9IGludGVsX2RwX21heF9sYW5lX2NvdW50KGludGVsX2VuY29kZXIpOwogCWludCBtYXhfY2xvY2sgPSBpbnRlbF9kcF9tYXhfbGlua19idyhpbnRlbF9lbmNvZGVyKSA9PSBEUF9MSU5LX0JXXzJfNyA/IDEgOiAwOwogCXN0YXRpYyBpbnQgYndzWzJdID0geyBEUF9MSU5LX0JXXzFfNjIsIERQX0xJTktfQldfMl83IH07CiAKKwlpZiAoKElTX2VEUChpbnRlbF9lbmNvZGVyKSB8fCBJU19QQ0hfZURQKGRwX3ByaXYpKSAmJgorCSAgICBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSkgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlOworCisJCWFkanVzdGVkX21vZGUtPmhkaXNwbGF5ID0gZml4ZWRfbW9kZS0+aGRpc3BsYXk7CisJCWFkanVzdGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0gZml4ZWRfbW9kZS0+aHN5bmNfc3RhcnQ7CisJCWFkanVzdGVkX21vZGUtPmhzeW5jX2VuZCA9IGZpeGVkX21vZGUtPmhzeW5jX2VuZDsKKwkJYWRqdXN0ZWRfbW9kZS0+aHRvdGFsID0gZml4ZWRfbW9kZS0+aHRvdGFsOworCisJCWFkanVzdGVkX21vZGUtPnZkaXNwbGF5ID0gZml4ZWRfbW9kZS0+dmRpc3BsYXk7CisJCWFkanVzdGVkX21vZGUtPnZzeW5jX3N0YXJ0ID0gZml4ZWRfbW9kZS0+dnN5bmNfc3RhcnQ7CisJCWFkanVzdGVkX21vZGUtPnZzeW5jX2VuZCA9IGZpeGVkX21vZGUtPnZzeW5jX2VuZDsKKwkJYWRqdXN0ZWRfbW9kZS0+dnRvdGFsID0gZml4ZWRfbW9kZS0+dnRvdGFsOworCisJCWFkanVzdGVkX21vZGUtPmNsb2NrID0gZml4ZWRfbW9kZS0+Y2xvY2s7CisJCWRybV9tb2RlX3NldF9jcnRjaW5mbyhhZGp1c3RlZF9tb2RlLCBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WKTsKKworCQkvKgorCQkgKiB0aGUgbW9kZS0+Y2xvY2sgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIERhdGEmTGluayBNL04KKwkJICogb2YgdGhlIHBpcGUuIEZvciB0aGUgZURQIHRoZSBmaXhlZCBjbG9jayBzaG91bGQgYmUgdXNlZC4KKwkJICovCisJCW1vZGUtPmNsb2NrID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmNsb2NrOworCX0KKwogCWZvciAobGFuZV9jb3VudCA9IDE7IGxhbmVfY291bnQgPD0gbWF4X2xhbmVfY291bnQ7IGxhbmVfY291bnQgPDw9IDEpIHsKIAkJZm9yIChjbG9jayA9IDA7IGNsb2NrIDw9IG1heF9jbG9jazsgY2xvY2srKykgewogCQkJaW50IGxpbmtfYXZhaWwgPSBpbnRlbF9kcF9tYXhfZGF0YV9yYXRlKGludGVsX2RwX2xpbmtfY2xvY2soYndzW2Nsb2NrXSksIGxhbmVfY291bnQpOwpAQCAtNTMxLDcgKzU3Miw3IEBACiAJCX0KIAl9CiAKLQlpZiAoSVNfZURQKGludGVsX2VuY29kZXIpKSB7CisJaWYgKElTX2VEUChpbnRlbF9lbmNvZGVyKSB8fCBJU19QQ0hfZURQKGRwX3ByaXYpKSB7CiAJCS8qIG9rYXkgd2UgZmFpbGVkIGp1c3QgcGljayB0aGUgaGlnaGVzdCAqLwogCQlkcF9wcml2LT5sYW5lX2NvdW50ID0gbWF4X2xhbmVfY291bnQ7CiAJCWRwX3ByaXYtPmxpbmtfYncgPSBid3NbbWF4X2Nsb2NrXTsKQEAgLTU2MywxNCArNjA0LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pbnRlbF9kcF9jb21wdXRlX21fbihpbnQgYnl0ZXNfcGVyX3BpeGVsLAoraW50ZWxfZHBfY29tcHV0ZV9tX24oaW50IGJwcCwKIAkJICAgICBpbnQgbmxhbmVzLAogCQkgICAgIGludCBwaXhlbF9jbG9jaywKIAkJICAgICBpbnQgbGlua19jbG9jaywKIAkJICAgICBzdHJ1Y3QgaW50ZWxfZHBfbV9uICptX24pCiB7CiAJbV9uLT50dSA9IDY0OwotCW1fbi0+Z21jaF9tID0gcGl4ZWxfY2xvY2sgKiBieXRlc19wZXJfcGl4ZWw7CisJbV9uLT5nbWNoX20gPSAocGl4ZWxfY2xvY2sgKiBicHApID4+IDM7CiAJbV9uLT5nbWNoX24gPSBsaW5rX2Nsb2NrICogbmxhbmVzOwogCWludGVsX3JlZHVjZV9yYXRpbygmbV9uLT5nbWNoX20sICZtX24tPmdtY2hfbik7CiAJbV9uLT5saW5rX20gPSBwaXhlbF9jbG9jazsKQEAgLTU3OCw2ICs2MTksMjggQEAKIAlpbnRlbF9yZWR1Y2VfcmF0aW8oJm1fbi0+bGlua19tLCAmbV9uLT5saW5rX24pOwogfQogCitib29sIGludGVsX3BjaF9oYXNfZWRwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKm1vZGVfY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmbW9kZV9jb25maWctPmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlcjsKKwkJc3RydWN0IGludGVsX2RwX3ByaXYgKmRwX3ByaXY7CisKKwkJaWYgKCFlbmNvZGVyIHx8IGVuY29kZXItPmNydGMgIT0gY3J0YykKKwkJCWNvbnRpbnVlOworCisJCWludGVsX2VuY29kZXIgPSBlbmNfdG9faW50ZWxfZW5jb2RlcihlbmNvZGVyKTsKKwkJZHBfcHJpdiA9IGludGVsX2VuY29kZXItPmRldl9wcml2OworCisJCWlmIChpbnRlbF9lbmNvZGVyLT50eXBlID09IElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkKKwkJCXJldHVybiBkcF9wcml2LT5pc19wY2hfZWRwOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQKIGludGVsX2RwX3NldF9tX24oc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQpAQCAtNTg3LDcgKzY1MCw3IEBACiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwotCWludCBsYW5lX2NvdW50ID0gNDsKKwlpbnQgbGFuZV9jb3VudCA9IDQsIGJwcCA9IDI0OwogCXN0cnVjdCBpbnRlbF9kcF9tX24gbV9uOwogCiAJLyoKQEAgLTYwNSw2ICs2NjgsOCBAQAogCiAJCWlmIChpbnRlbF9lbmNvZGVyLT50eXBlID09IElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkgewogCQkJbGFuZV9jb3VudCA9IGRwX3ByaXYtPmxhbmVfY291bnQ7CisJCQlpZiAoSVNfUENIX2VEUChkcF9wcml2KSkKKwkJCQlicHAgPSBkZXZfcHJpdi0+ZWRwX2JwcDsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNjE0LDcgKzY3OSw3IEBACiAJICogdGhlIG51bWJlciBvZiBieXRlc19wZXJfcGl4ZWwgcG9zdC1MVVQsIHdoaWNoIHdlIGFsd2F5cwogCSAqIHNldCB1cCBmb3IgOC1iaXRzIG9mIFIvRy9CLCBvciAzIGJ5dGVzIHRvdGFsLgogCSAqLwotCWludGVsX2RwX2NvbXB1dGVfbV9uKDMsIGxhbmVfY291bnQsCisJaW50ZWxfZHBfY29tcHV0ZV9tX24oYnBwLCBsYW5lX2NvdW50LAogCQkJICAgICBtb2RlLT5jbG9jaywgYWRqdXN0ZWRfbW9kZS0+Y2xvY2ssICZtX24pOwogCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewpAQCAtNzk2LDcgKzg2MSw3IEBACiAJaWYgKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTikgewogCQlpZiAoZHBfcmVnICYgRFBfUE9SVF9FTikgewogCQkJaW50ZWxfZHBfbGlua19kb3duKGludGVsX2VuY29kZXIsIGRwX3ByaXYtPkRQKTsKLQkJCWlmIChJU19lRFAoaW50ZWxfZW5jb2RlcikpIHsKKwkJCWlmIChJU19lRFAoaW50ZWxfZW5jb2RlcikgfHwgSVNfUENIX2VEUChkcF9wcml2KSkgewogCQkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGRldik7CiAJCQkJaXJvbmxha2VfZWRwX3BhbmVsX29mZihkZXYpOwogCQkJfQpAQCAtODA0LDcgKzg2OSw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKCEoZHBfcmVnICYgRFBfUE9SVF9FTikpIHsKIAkJCWludGVsX2RwX2xpbmtfdHJhaW4oaW50ZWxfZW5jb2RlciwgZHBfcHJpdi0+RFAsIGRwX3ByaXYtPmxpbmtfY29uZmlndXJhdGlvbik7Ci0JCQlpZiAoSVNfZURQKGludGVsX2VuY29kZXIpKSB7CisJCQlpZiAoSVNfZURQKGludGVsX2VuY29kZXIpIHx8IElTX1BDSF9lRFAoZHBfcHJpdikpIHsKIAkJCQlpcm9ubGFrZV9lZHBfcGFuZWxfb24oZGV2KTsKIAkJCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGRldik7CiAJCQl9CkBAIC0xMzQwLDE3ICsxNDA1LDMyIEBACiAJc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIgPSBlbmNfdG9faW50ZWxfZW5jb2RlcihlbmNvZGVyKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZW5jb2Rlci0+ZW5jLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9kcF9wcml2ICpkcF9wcml2ID0gaW50ZWxfZW5jb2Rlci0+ZGV2X3ByaXY7CiAJaW50IHJldDsKIAogCS8qIFdlIHNob3VsZCBwYXJzZSB0aGUgRURJRCBkYXRhIGFuZCBmaW5kIG91dCBpZiBpdCBoYXMgYW4gYXVkaW8gc2luawogCSAqLwogCiAJcmV0ID0gaW50ZWxfZGRjX2dldF9tb2Rlcyhjb25uZWN0b3IsIGludGVsX2VuY29kZXItPmRkY19idXMpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlpZiAoKElTX2VEUChpbnRlbF9lbmNvZGVyKSB8fCBJU19QQ0hfZURQKGRwX3ByaXYpKSAmJgorCQkgICAgIWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlKSB7CisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkobmV3bW9kZSwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLAorCQkJCQkgICAgaGVhZCkgeworCQkJCWlmIChuZXdtb2RlLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpIHsKKwkJCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgPQorCQkJCQkJZHJtX21vZGVfZHVwbGljYXRlKGRldiwgbmV3bW9kZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCiAJCXJldHVybiByZXQ7CisJfQogCiAJLyogaWYgZURQIGhhcyBubyBFRElELCB0cnkgdG8gdXNlIGZpeGVkIHBhbmVsIG1vZGUgZnJvbSBWQlQgKi8KLQlpZiAoSVNfZURQKGludGVsX2VuY29kZXIpKSB7CisJaWYgKElTX2VEUChpbnRlbF9lbmNvZGVyKSB8fCBJU19QQ0hfZURQKGRwX3ByaXYpKSB7CiAJCWlmIChkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSAhPSBOVUxMKSB7CiAJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKIAkJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSk7CkBAIC0xNDM1LDYgKzE1MTUsMjYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKy8qIGNoZWNrIHRoZSBWQlQgdG8gc2VlIHdoZXRoZXIgdGhlIGVEUCBpcyBvbiBEUC1EIHBvcnQgKi8KK2Jvb2wgaW50ZWxfZHBkX2lzX2VkcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CisJaW50IGk7CisKKwlpZiAoIWRldl9wcml2LT5jaGlsZF9kZXZfbnVtKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmNoaWxkX2Rldl9udW07IGkrKykgeworCQlwX2NoaWxkID0gZGV2X3ByaXYtPmNoaWxkX2RldiArIGk7CisKKwkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ID09IFBPUlRfSURQRCAmJgorCQkgICAgcF9jaGlsZC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX1RZUEVfZURQKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogdm9pZAogaW50ZWxfZHBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X3JlZykKIHsKQEAgLTE0NDQsNiArMTU0NCw3IEBACiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yOwogCXN0cnVjdCBpbnRlbF9kcF9wcml2ICpkcF9wcml2OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWludCB0eXBlOwogCiAJaW50ZWxfZW5jb2RlciA9IGtjYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbF9lbmNvZGVyKSArCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbnRlbF9kcF9wcml2KSwgMSwgR0ZQX0tFUk5FTCk7CkBAIC0xNDU4LDE4ICsxNTU5LDI0IEBACiAKIAlkcF9wcml2ID0gKHN0cnVjdCBpbnRlbF9kcF9wcml2ICopKGludGVsX2VuY29kZXIgKyAxKTsKIAorCWlmIChIQVNfUENIX1NQTElUKGRldikgJiYgKG91dHB1dF9yZWcgPT0gUENIX0RQX0QpKQorCQlpZiAoaW50ZWxfZHBkX2lzX2VkcChkZXYpKQorCQkJZHBfcHJpdi0+aXNfcGNoX2VkcCA9IHRydWU7CisKKwlpZiAob3V0cHV0X3JlZyA9PSBEUF9BIHx8IElTX1BDSF9lRFAoZHBfcHJpdikpIHsKKwkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFA7CisJCWludGVsX2VuY29kZXItPnR5cGUgPSBJTlRFTF9PVVRQVVRfRURQOworCX0gZWxzZSB7CisJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQ7CisJCWludGVsX2VuY29kZXItPnR5cGUgPSBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQ7CisJfQorCiAJY29ubmVjdG9yID0gJmludGVsX2Nvbm5lY3Rvci0+YmFzZTsKLQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZpbnRlbF9kcF9jb25uZWN0b3JfZnVuY3MsCi0JCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQpOworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJmludGVsX2RwX2Nvbm5lY3Rvcl9mdW5jcywgdHlwZSk7CiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmludGVsX2RwX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwogCiAJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwogCi0JaWYgKG91dHB1dF9yZWcgPT0gRFBfQSkKLQkJaW50ZWxfZW5jb2Rlci0+dHlwZSA9IElOVEVMX09VVFBVVF9FRFA7Ci0JZWxzZQotCQlpbnRlbF9lbmNvZGVyLT50eXBlID0gSU5URUxfT1VUUFVUX0RJU1BMQVlQT1JUOwotCiAJaWYgKG91dHB1dF9yZWcgPT0gRFBfQiB8fCBvdXRwdXRfcmVnID09IFBDSF9EUF9CKQogCQlpbnRlbF9lbmNvZGVyLT5jbG9uZV9tYXNrID0gKDEgPDwgSU5URUxfRFBfQl9DTE9ORV9CSVQpOwogCWVsc2UgaWYgKG91dHB1dF9yZWcgPT0gRFBfQyB8fCBvdXRwdXRfcmVnID09IFBDSF9EUF9DKQpAQCAtMTUyOCw3ICsxNjM1LDcgQEAKIAlpbnRlbF9lbmNvZGVyLT5kZGNfYnVzID0gJmRwX3ByaXYtPmFkYXB0ZXI7CiAJaW50ZWxfZW5jb2Rlci0+aG90X3BsdWcgPSBpbnRlbF9kcF9ob3RfcGx1ZzsKIAotCWlmIChvdXRwdXRfcmVnID09IERQX0EpIHsKKwlpZiAob3V0cHV0X3JlZyA9PSBEUF9BIHx8IElTX1BDSF9lRFAoZHBfcHJpdikpIHsKIAkJLyogaW5pdGlhbGl6ZSBwYW5lbCBtb2RlIGZyb20gVkJUIGlmIGF2YWlsYWJsZSBmb3IgZURQICovCiAJCWlmIChkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUpIHsKIAkJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggMmY3OTcwYi4uYjIxOTAxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTE0Myw4ICsxNDMsNiBAQAogCXN0cnVjdCBkcm1fY3J0YyBiYXNlOwogCWVudW0gcGlwZSBwaXBlOwogCWVudW0gcGxhbmUgcGxhbmU7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpjdXJzb3JfYm87Ci0JdWludDMyX3QgY3Vyc29yX2FkZHI7CiAJdTggbHV0X3JbMjU2XSwgbHV0X2dbMjU2XSwgbHV0X2JbMjU2XTsKIAlpbnQgZHBtc19tb2RlOwogCWJvb2wgYnVzeTsgLyogaXMgc2Nhbm91dCBidWZmZXIgYmVpbmcgdXBkYXRlZCBmcmVxdWVudGx5PyAqLwpAQCAtMTUzLDYgKzE1MSwxMiBAQAogCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OwogCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp1bnBpbl93b3JrOwogCWludCBmZGlfbGFuZXM7CisKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN1cnNvcl9ibzsKKwl1aW50MzJfdCBjdXJzb3JfYWRkcjsKKwlpbnQxNl90IGN1cnNvcl94LCBjdXJzb3JfeTsKKwlpbnQxNl90IGN1cnNvcl93aWR0aCwgY3Vyc29yX2hlaWdodDsKKwlib29sIGN1cnNvcl92aXNibGU7CiB9OwogCiAjZGVmaW5lIHRvX2ludGVsX2NydGMoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBpbnRlbF9jcnRjLCBiYXNlKQpAQCAtMTc5LDYgKzE4Myw4IEBACiB2b2lkCiBpbnRlbF9kcF9zZXRfbV9uKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7CitleHRlcm4gYm9vbCBpbnRlbF9wY2hfaGFzX2VkcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworZXh0ZXJuIGJvb2wgaW50ZWxfZHBkX2lzX2VkcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2VkcF9saW5rX2NvbmZpZyAoc3RydWN0IGludGVsX2VuY29kZXIgKiwgaW50ICosIGludCAqKTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwppbmRleCAzZTE4YzllLi41NGFjZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMKQEAgLTYxLDYgKzYxLDggQEAKIAkuZmJfcGFuX2Rpc3BsYXkgPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAogCS5mYl9ibGFuayA9IGRybV9mYl9oZWxwZXJfYmxhbmssCiAJLmZiX3NldGNtYXAgPSBkcm1fZmJfaGVscGVyX3NldGNtYXAsCisJLmZiX2RlYnVnX2VudGVyID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19lbnRlciwKKwkuZmJfZGVidWdfbGVhdmUgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlLAogfTsKIAogc3RhdGljIGludCBpbnRlbGZiX2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZmJkZXYgKmlmYmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYwppbmRleCA4M2JkNzY0Li4xOTc4ODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCkBAIC01NCwxMCArNTQsMTEgQEAKIAlzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2ICpoZG1pX3ByaXYgPSBpbnRlbF9lbmNvZGVyLT5kZXZfcHJpdjsKIAl1MzIgc2R2b3g7CiAKLQlzZHZveCA9IFNEVk9fRU5DT0RJTkdfSERNSSB8Ci0JCVNEVk9fQk9SREVSX0VOQUJMRSB8Ci0JCVNEVk9fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTRFZPX0hTWU5DX0FDVElWRV9ISUdIOworCXNkdm94ID0gU0RWT19FTkNPRElOR19IRE1JIHwgU0RWT19CT1JERVJfRU5BQkxFOworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUFZTWU5DKQorCQlzZHZveCB8PSBTRFZPX1ZTWU5DX0FDVElWRV9ISUdIOworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQlzZHZveCB8PSBTRFZPX0hTWU5DX0FDVElWRV9ISUdIOwogCiAJaWYgKGhkbWlfcHJpdi0+aGFzX2hkbWlfc2luaykgewogCQlzZHZveCB8PSBTRFZPX0FVRElPX0VOQUJMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCAwZWFiOGRmLi4wYTJlNjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC0xNTYsMzEgKzE1Niw3MyBAQAogCXJldHVybiBNT0RFX09LOwogfQogCitzdGF0aWMgdm9pZAorY2VudHJlX2hvcml6b250YWxseShzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICAgIGludCB3aWR0aCkKK3sKKwl1MzIgYm9yZGVyLCBzeW5jX3BvcywgYmxhbmtfd2lkdGgsIHN5bmNfd2lkdGg7CisKKwkvKiBrZWVwIHRoZSBoc3luYyBhbmQgaGJsYW5rIHdpZHRocyBjb25zdGFudCAqLworCXN5bmNfd2lkdGggPSBtb2RlLT5jcnRjX2hzeW5jX2VuZCAtIG1vZGUtPmNydGNfaHN5bmNfc3RhcnQ7CisJYmxhbmtfd2lkdGggPSBtb2RlLT5jcnRjX2hibGFua19lbmQgLSBtb2RlLT5jcnRjX2hibGFua19zdGFydDsKKwlzeW5jX3BvcyA9IChibGFua193aWR0aCAtIHN5bmNfd2lkdGggKyAxKSAvIDI7CisKKwlib3JkZXIgPSAobW9kZS0+aGRpc3BsYXkgLSB3aWR0aCArIDEpIC8gMjsKKwlib3JkZXIgKz0gYm9yZGVyICYgMTsgLyogbWFrZSB0aGUgYm9yZGVyIGV2ZW4gKi8KKworCW1vZGUtPmNydGNfaGRpc3BsYXkgPSB3aWR0aDsKKwltb2RlLT5jcnRjX2hibGFua19zdGFydCA9IHdpZHRoICsgYm9yZGVyOworCW1vZGUtPmNydGNfaGJsYW5rX2VuZCA9IG1vZGUtPmNydGNfaGJsYW5rX3N0YXJ0ICsgYmxhbmtfd2lkdGg7CisKKwltb2RlLT5jcnRjX2hzeW5jX3N0YXJ0ID0gbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQgKyBzeW5jX3BvczsKKwltb2RlLT5jcnRjX2hzeW5jX2VuZCA9IG1vZGUtPmNydGNfaHN5bmNfc3RhcnQgKyBzeW5jX3dpZHRoOworfQorCitzdGF0aWMgdm9pZAorY2VudHJlX3ZlcnRpY2FsbHkoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgaW50IGhlaWdodCkKK3sKKwl1MzIgYm9yZGVyLCBzeW5jX3BvcywgYmxhbmtfd2lkdGgsIHN5bmNfd2lkdGg7CisKKwkvKiBrZWVwIHRoZSB2c3luYyBhbmQgdmJsYW5rIHdpZHRocyBjb25zdGFudCAqLworCXN5bmNfd2lkdGggPSBtb2RlLT5jcnRjX3ZzeW5jX2VuZCAtIG1vZGUtPmNydGNfdnN5bmNfc3RhcnQ7CisJYmxhbmtfd2lkdGggPSBtb2RlLT5jcnRjX3ZibGFua19lbmQgLSBtb2RlLT5jcnRjX3ZibGFua19zdGFydDsKKwlzeW5jX3BvcyA9IChibGFua193aWR0aCAtIHN5bmNfd2lkdGggKyAxKSAvIDI7CisKKwlib3JkZXIgPSAobW9kZS0+dmRpc3BsYXkgLSBoZWlnaHQgKyAxKSAvIDI7CisKKwltb2RlLT5jcnRjX3ZkaXNwbGF5ID0gaGVpZ2h0OworCW1vZGUtPmNydGNfdmJsYW5rX3N0YXJ0ID0gaGVpZ2h0ICsgYm9yZGVyOworCW1vZGUtPmNydGNfdmJsYW5rX2VuZCA9IG1vZGUtPmNydGNfdmJsYW5rX3N0YXJ0ICsgYmxhbmtfd2lkdGg7CisKKwltb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0ID0gbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQgKyBzeW5jX3BvczsKKwltb2RlLT5jcnRjX3ZzeW5jX2VuZCA9IG1vZGUtPmNydGNfdnN5bmNfc3RhcnQgKyBzeW5jX3dpZHRoOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwYW5lbF9maXR0ZXJfc2NhbGluZyh1MzIgc291cmNlLCB1MzIgdGFyZ2V0KQoreworCS8qCisJICogRmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFNvIHRoZSBGQUNUT1IKKwkgKiBpcyBkZWZpbmVkLCB3aGljaCBjYW4gYXZvaWQgdGhlIGZsb2F0aW5nIHBvaW50IGNvbXB1dGF0aW9uCisJICogd2hlbiBjYWxjdWxhdGluZyB0aGUgcGFuZWwgcmF0aW8uCisJICovCisjZGVmaW5lIEFDQ1VSQUNZIDEyCisjZGVmaW5lIEZBQ1RPUiAoMSA8PCBBQ0NVUkFDWSkKKwl1MzIgcmF0aW8gPSBzb3VyY2UgKiBGQUNUT1IgLyB0YXJnZXQ7CisJcmV0dXJuIChGQUNUT1IgKiByYXRpbyArIEZBQ1RPUi8yKSAvIEZBQ1RPUjsKK30KKwogc3RhdGljIGJvb2wgaW50ZWxfbHZkc19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKIAkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAogCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCiB7Ci0JLyoKLQkgKiBmbG9hdCBwb2ludCBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCAuIFNvIHRoZSBQQU5FTF9SQVRJT19GQUNUT1IKLQkgKiBpcyBkZWZpbmVkLCB3aGljaCBjYW4gYXZvaWQgdGhlIGZsb2F0IHBvaW50IGNvbXB1dGF0aW9uIHdoZW4KLQkgKiBjYWxjdWxhdGluZyB0aGUgcGFuZWwgcmF0aW8uCi0JICovCi0jZGVmaW5lIFBBTkVMX1JBVElPX0ZBQ1RPUiA4MTkyCiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5jcnRjKTsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKnRtcF9lbmNvZGVyOwogCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyID0gZW5jX3RvX2ludGVsX2VuY29kZXIoZW5jb2Rlcik7CiAJc3RydWN0IGludGVsX2x2ZHNfcHJpdiAqbHZkc19wcml2ID0gaW50ZWxfZW5jb2Rlci0+ZGV2X3ByaXY7Ci0JdTMyIHBmaXRfY29udHJvbCA9IDAsIHBmaXRfcGdtX3JhdGlvcyA9IDA7Ci0JaW50IGxlZnRfYm9yZGVyID0gMCwgcmlnaHRfYm9yZGVyID0gMCwgdG9wX2JvcmRlciA9IDA7Ci0JaW50IGJvdHRvbV9ib3JkZXIgPSAwOwotCWJvb2wgYm9yZGVyID0gMDsKLQlpbnQgcGFuZWxfcmF0aW8sIGRlc2lyZWRfcmF0aW8sIHZlcnRfc2NhbGUsIGhvcml6X3NjYWxlOwotCWludCBob3Jpel9yYXRpbywgdmVydF9yYXRpbzsKLQl1MzIgaHN5bmNfd2lkdGgsIHZzeW5jX3dpZHRoOwotCXUzMiBoYmxhbmtfd2lkdGgsIHZibGFua193aWR0aDsKLQl1MzIgaHN5bmNfcG9zLCB2c3luY19wb3M7CisJdTMyIHBmaXRfY29udHJvbCA9IDAsIHBmaXRfcGdtX3JhdGlvcyA9IDAsIGJvcmRlciA9IDA7CiAKIAkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuISEgKi8KIAlpZiAoIUlTX0k5NjVHKGRldikgJiYgaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSB7CkBAIC0yMDAsMjcgKzI0MiwyNSBAQAogCWlmIChkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSA9PSBOVUxMKQogCQlyZXR1cm4gdHJ1ZTsKIAkvKgotCSAqIElmIHdlIGhhdmUgdGltaW5ncyBmcm9tIHRoZSBCSU9TIGZvciB0aGUgcGFuZWwsIHB1dCB0aGVtIGluCisJICogV2UgaGF2ZSB0aW1pbmdzIGZyb20gdGhlIEJJT1MgZm9yIHRoZSBwYW5lbCwgcHV0IHRoZW0gaW4KIAkgKiB0byB0aGUgYWRqdXN0ZWQgbW9kZS4gIFRoZSBDUlRDIHdpbGwgYmUgc2V0IHVwIGZvciB0aGlzIG1vZGUsCiAJICogd2l0aCB0aGUgcGFuZWwgc2NhbGluZyBzZXQgdXAgdG8gc291cmNlIGZyb20gdGhlIEgvVkRpc3BsYXkKIAkgKiBvZiB0aGUgb3JpZ2luYWwgbW9kZS4KIAkgKi8KLQlpZiAoZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgIT0gTlVMTCkgewotCQlhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheTsKLQkJYWRqdXN0ZWRfbW9kZS0+aHN5bmNfc3RhcnQgPQotCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0OwotCQlhZGp1c3RlZF9tb2RlLT5oc3luY19lbmQgPQotCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZDsKLQkJYWRqdXN0ZWRfbW9kZS0+aHRvdGFsID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbDsKLQkJYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgPSBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXk7Ci0JCWFkanVzdGVkX21vZGUtPnZzeW5jX3N0YXJ0ID0KLQkJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydDsKLQkJYWRqdXN0ZWRfbW9kZS0+dnN5bmNfZW5kID0KLQkJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQ7Ci0JCWFkanVzdGVkX21vZGUtPnZ0b3RhbCA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52dG90YWw7Ci0JCWFkanVzdGVkX21vZGUtPmNsb2NrID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmNsb2NrOwotCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oYWRqdXN0ZWRfbW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7Ci0JfQorCWFkanVzdGVkX21vZGUtPmhkaXNwbGF5ID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5OworCWFkanVzdGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0KKwkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0OworCWFkanVzdGVkX21vZGUtPmhzeW5jX2VuZCA9CisJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQ7CisJYWRqdXN0ZWRfbW9kZS0+aHRvdGFsID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbDsKKwlhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheTsKKwlhZGp1c3RlZF9tb2RlLT52c3luY19zdGFydCA9CisJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydDsKKwlhZGp1c3RlZF9tb2RlLT52c3luY19lbmQgPQorCQlkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kOworCWFkanVzdGVkX21vZGUtPnZ0b3RhbCA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52dG90YWw7CisJYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPSBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CisJZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIENSVENfSU5URVJMQUNFX0hBTFZFX1YpOwogCiAJLyogTWFrZSBzdXJlIHByZS05NjVzIHNldCBkaXRoZXIgY29ycmVjdGx5ICovCiAJaWYgKCFJU19JOTY1RyhkZXYpKSB7CkBAIC0yMzAsMTEgKzI3MCw4IEBACiAKIAkvKiBOYXRpdmUgbW9kZXMgZG9uJ3QgbmVlZCBmaXR0aW5nICovCiAJaWYgKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5ID09IG1vZGUtPmhkaXNwbGF5ICYmCi0JCQlhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSA9PSBtb2RlLT52ZGlzcGxheSkgewotCQlwZml0X3BnbV9yYXRpb3MgPSAwOwotCQlib3JkZXIgPSAwOworCSAgICBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSA9PSBtb2RlLT52ZGlzcGxheSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogZnVsbCBzY3JlZW4gc2NhbGUgZm9yIG5vdyAqLwogCWlmIChIQVNfUENIX1NQTElUKGRldikpCkBAIC0yNDIsMjUgKzI3OSw5IEBACiAKIAkvKiA5NjUrIHdhbnRzIGZ1enp5IGZpdHRpbmcgKi8KIAlpZiAoSVNfSTk2NUcoZGV2KSkKLQkJcGZpdF9jb250cm9sIHw9IChpbnRlbF9jcnRjLT5waXBlIDw8IFBGSVRfUElQRV9TSElGVCkgfAotCQkJCQlQRklUX0ZJTFRFUl9GVVpaWTsKKwkJcGZpdF9jb250cm9sIHw9ICgoaW50ZWxfY3J0Yy0+cGlwZSA8PCBQRklUX1BJUEVfU0hJRlQpIHwKKwkJCQkgUEZJVF9GSUxURVJfRlVaWlkpOwogCi0JaHN5bmNfd2lkdGggPSBhZGp1c3RlZF9tb2RlLT5jcnRjX2hzeW5jX2VuZCAtCi0JCQkJCWFkanVzdGVkX21vZGUtPmNydGNfaHN5bmNfc3RhcnQ7Ci0JdnN5bmNfd2lkdGggPSBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX2VuZCAtCi0JCQkJCWFkanVzdGVkX21vZGUtPmNydGNfdnN5bmNfc3RhcnQ7Ci0JaGJsYW5rX3dpZHRoID0gYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfZW5kIC0KLQkJCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQ7Ci0JdmJsYW5rX3dpZHRoID0gYWRqdXN0ZWRfbW9kZS0+Y3J0Y192YmxhbmtfZW5kIC0KLQkJCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQ7Ci0JLyoKLQkgKiBEZWFsIHdpdGggcGFuZWwgZml0dGluZyBvcHRpb25zLiBGaWd1cmUgb3V0IGhvdyB0byBzdHJldGNoIHRoZQotCSAqIGltYWdlIGJhc2VkIG9uIGl0cyBhc3BlY3QgcmF0aW8gJiB0aGUgY3VycmVudCBwYW5lbCBmaXR0aW5nIG1vZGUuCi0JICovCi0JcGFuZWxfcmF0aW8gPSBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSAqIFBBTkVMX1JBVElPX0ZBQ1RPUiAvCi0JCQkJYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7Ci0JZGVzaXJlZF9yYXRpbyA9IG1vZGUtPmhkaXNwbGF5ICogUEFORUxfUkFUSU9fRkFDVE9SIC8KLQkJCQltb2RlLT52ZGlzcGxheTsKIAkvKgogCSAqIEVuYWJsZSBhdXRvbWF0aWMgcGFuZWwgc2NhbGluZyBmb3Igbm9uLW5hdGl2ZSBtb2RlcyBzbyB0aGF0IHRoZXkgZmlsbAogCSAqIHRoZSBzY3JlZW4uICBTaG91bGQgYmUgZW5hYmxlZCBiZWZvcmUgdGhlIHBpcGUgaXMgZW5hYmxlZCwgYWNjb3JkaW5nCkBAIC0yNzgsMTcwICsyOTksNjMgQEAKIAkJICogRm9yIGNlbnRlcmVkIG1vZGVzLCB3ZSBoYXZlIHRvIGNhbGN1bGF0ZSBib3JkZXIgd2lkdGhzICYKIAkJICogaGVpZ2h0cyBhbmQgbW9kaWZ5IHRoZSB2YWx1ZXMgcHJvZ3JhbW1lZCBpbnRvIHRoZSBDUlRDLgogCQkgKi8KLQkJbGVmdF9ib3JkZXIgPSAoYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgLSBtb2RlLT5oZGlzcGxheSkgLyAyOwotCQlyaWdodF9ib3JkZXIgPSBsZWZ0X2JvcmRlcjsKLQkJaWYgKG1vZGUtPmhkaXNwbGF5ICYgMSkKLQkJCXJpZ2h0X2JvcmRlcisrOwotCQl0b3BfYm9yZGVyID0gKGFkanVzdGVkX21vZGUtPnZkaXNwbGF5IC0gbW9kZS0+dmRpc3BsYXkpIC8gMjsKLQkJYm90dG9tX2JvcmRlciA9IHRvcF9ib3JkZXI7Ci0JCWlmIChtb2RlLT52ZGlzcGxheSAmIDEpCi0JCQlib3R0b21fYm9yZGVyKys7Ci0JCS8qIFNldCBhY3RpdmUgJiBib3JkZXIgdmFsdWVzICovCi0JCWFkanVzdGVkX21vZGUtPmNydGNfaGRpc3BsYXkgPSBtb2RlLT5oZGlzcGxheTsKLQkJLyogS2VlcCB0aGUgYm9kZXIgYmUgZXZlbiAqLwotCQlpZiAocmlnaHRfYm9yZGVyICYgMSkKLQkJCXJpZ2h0X2JvcmRlcisrOwotCQkvKiB1c2UgdGhlIGJvcmRlciBkaXJlY3RseSBpbnN0ZWFkIG9mIGJvcmRlciBtaW51c2Ugb25lICovCi0JCWFkanVzdGVkX21vZGUtPmNydGNfaGJsYW5rX3N0YXJ0ID0gbW9kZS0+aGRpc3BsYXkgKwotCQkJCQkJcmlnaHRfYm9yZGVyOwotCQkvKiBrZWVwIHRoZSBibGFuayB3aWR0aCBjb25zdGFudCAqLwotCQlhZGp1c3RlZF9tb2RlLT5jcnRjX2hibGFua19lbmQgPQotCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQgKyBoYmxhbmtfd2lkdGg7Ci0JCS8qIGdldCB0aGUgaHN5bmMgcG9zIHJlbGF0aXZlIHRvIGhibGFuayBzdGFydCAqLwotCQloc3luY19wb3MgPSAoaGJsYW5rX3dpZHRoIC0gaHN5bmNfd2lkdGgpIC8gMjsKLQkJLyoga2VlcCB0aGUgaHN5bmMgcG9zIGJlIGV2ZW4gKi8KLQkJaWYgKGhzeW5jX3BvcyAmIDEpCi0JCQloc3luY19wb3MrKzsKLQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oc3luY19zdGFydCA9Ci0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQgKyBoc3luY19wb3M7Ci0JCS8qIGtlZXAgdGhlIGhzeW5jIHdpZHRoIGNvbnN0YW50ICovCi0JCWFkanVzdGVkX21vZGUtPmNydGNfaHN5bmNfZW5kID0KLQkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX2hzeW5jX3N0YXJ0ICsgaHN5bmNfd2lkdGg7Ci0JCWFkanVzdGVkX21vZGUtPmNydGNfdmRpc3BsYXkgPSBtb2RlLT52ZGlzcGxheTsKLQkJLyogdXNlIHRoZSBib3JkZXIgaW5zdGVhZCBvZiBib3JkZXIgbWludXMgb25lICovCi0JCWFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX3N0YXJ0ID0gbW9kZS0+dmRpc3BsYXkgKwotCQkJCQkJYm90dG9tX2JvcmRlcjsKLQkJLyoga2VlcCB0aGUgdmJsYW5rIHdpZHRoIGNvbnN0YW50ICovCi0JCWFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX2VuZCA9Ci0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQgKyB2Ymxhbmtfd2lkdGg7Ci0JCS8qIGdldCB0aGUgdnN5bmMgc3RhcnQgcG9zdGlvbiByZWxhdGl2ZSB0byB2Ymxhbmsgc3RhcnQgKi8KLQkJdnN5bmNfcG9zID0gKHZibGFua193aWR0aCAtIHZzeW5jX3dpZHRoKSAvIDI7Ci0JCWFkanVzdGVkX21vZGUtPmNydGNfdnN5bmNfc3RhcnQgPQotCQkJCWFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX3N0YXJ0ICsgdnN5bmNfcG9zOwotCQkvKiBrZWVwIHRoZSB2c3luYyB3aWR0aCBjb25zdGFudCAqLwotCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX2VuZCA9Ci0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19zdGFydCArIHZzeW5jX3dpZHRoOwotCQlib3JkZXIgPSAxOworCQljZW50cmVfaG9yaXpvbnRhbGx5KGFkanVzdGVkX21vZGUsIG1vZGUtPmhkaXNwbGF5KTsKKwkJY2VudHJlX3ZlcnRpY2FsbHkoYWRqdXN0ZWRfbW9kZSwgbW9kZS0+dmRpc3BsYXkpOworCQlib3JkZXIgPSBMVkRTX0JPUkRFUl9FTkFCTEU7CiAJCWJyZWFrOworCiAJY2FzZSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1Q6Ci0JCS8qIFNjYWxlIGJ1dCBwcmVzZXJ2ZSB0aGUgc3BlY3QgcmF0aW8gKi8KLQkJcGZpdF9jb250cm9sIHw9IFBGSVRfRU5BQkxFOworCQkvKiBTY2FsZSBidXQgcHJlc2VydmUgdGhlIGFzcGVjdCByYXRpbyAqLwogCQlpZiAoSVNfSTk2NUcoZGV2KSkgeworCQkJdTMyIHNjYWxlZF93aWR0aCA9IGFkanVzdGVkX21vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXk7CisJCQl1MzIgc2NhbGVkX2hlaWdodCA9IG1vZGUtPmhkaXNwbGF5ICogYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CisKKwkJCXBmaXRfY29udHJvbCB8PSBQRklUX0VOQUJMRTsKIAkJCS8qIDk2NSsgaXMgZWFzeSwgaXQgZG9lcyBldmVyeXRoaW5nIGluIGh3ICovCi0JCQlpZiAocGFuZWxfcmF0aW8gPiBkZXNpcmVkX3JhdGlvKQorCQkJaWYgKHNjYWxlZF93aWR0aCA+IHNjYWxlZF9oZWlnaHQpCiAJCQkJcGZpdF9jb250cm9sIHw9IFBGSVRfU0NBTElOR19QSUxMQVI7Ci0JCQllbHNlIGlmIChwYW5lbF9yYXRpbyA8IGRlc2lyZWRfcmF0aW8pCisJCQllbHNlIGlmIChzY2FsZWRfd2lkdGggPCBzY2FsZWRfaGVpZ2h0KQogCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfTEVUVEVSOwogCQkJZWxzZQogCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfQVVUTzsKIAkJfSBlbHNlIHsKKwkJCXUzMiBzY2FsZWRfd2lkdGggPSBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSAqIG1vZGUtPnZkaXNwbGF5OworCQkJdTMyIHNjYWxlZF9oZWlnaHQgPSBtb2RlLT5oZGlzcGxheSAqIGFkanVzdGVkX21vZGUtPnZkaXNwbGF5OwogCQkJLyoKIAkJCSAqIEZvciBlYXJsaWVyIGNoaXBzIHdlIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBzY2FsaW5nCiAJCQkgKiByYXRpbyBieSBoYW5kIGFuZCBwcm9ncmFtIGl0IGludG8gdGhlCiAJCQkgKiBQRklUX1BHTV9SQVRJTyByZWdpc3RlcgogCQkJICovCi0JCQl1MzIgaG9yaXpfYml0cywgdmVydF9iaXRzLCBiaXRzID0gMTI7Ci0JCQlob3Jpel9yYXRpbyA9IG1vZGUtPmhkaXNwbGF5ICogUEFORUxfUkFUSU9fRkFDVE9SLwotCQkJCQkJYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXk7Ci0JCQl2ZXJ0X3JhdGlvID0gbW9kZS0+dmRpc3BsYXkgKiBQQU5FTF9SQVRJT19GQUNUT1IvCi0JCQkJCQlhZGp1c3RlZF9tb2RlLT52ZGlzcGxheTsKLQkJCWhvcml6X3NjYWxlID0gYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgKgotCQkJCQlQQU5FTF9SQVRJT19GQUNUT1IgLyBtb2RlLT5oZGlzcGxheTsKLQkJCXZlcnRfc2NhbGUgPSBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSAqCi0JCQkJCVBBTkVMX1JBVElPX0ZBQ1RPUiAvIG1vZGUtPnZkaXNwbGF5OworCQkJaWYgKHNjYWxlZF93aWR0aCA+IHNjYWxlZF9oZWlnaHQpIHsgLyogcGlsbGFyICovCisJCQkJY2VudHJlX2hvcml6b250YWxseShhZGp1c3RlZF9tb2RlLCBzY2FsZWRfaGVpZ2h0IC8gbW9kZS0+dmRpc3BsYXkpOwogCi0JCQkvKiByZXRhaW4gYXNwZWN0IHJhdGlvICovCi0JCQlpZiAocGFuZWxfcmF0aW8gPiBkZXNpcmVkX3JhdGlvKSB7IC8qIFBpbGxhciAqLwotCQkJCXUzMiBzY2FsZWRfd2lkdGg7Ci0JCQkJc2NhbGVkX3dpZHRoID0gbW9kZS0+aGRpc3BsYXkgKiB2ZXJ0X3NjYWxlIC8KLQkJCQkJCVBBTkVMX1JBVElPX0ZBQ1RPUjsKLQkJCQlob3Jpel9yYXRpbyA9IHZlcnRfcmF0aW87Ci0JCQkJcGZpdF9jb250cm9sIHw9IChWRVJUX0FVVE9fU0NBTEUgfAorCQkJCWJvcmRlciA9IExWRFNfQk9SREVSX0VOQUJMRTsKKwkJCQlpZiAobW9kZS0+dmRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkpIHsKKwkJCQkJdTMyIGJpdHMgPSBwYW5lbF9maXR0ZXJfc2NhbGluZyhtb2RlLT52ZGlzcGxheSwgYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkpOworCQkJCQlwZml0X3BnbV9yYXRpb3MgfD0gKGJpdHMgPDwgUEZJVF9IT1JJWl9TQ0FMRV9TSElGVCB8CisJCQkJCQkJICAgIGJpdHMgPDwgUEZJVF9WRVJUX1NDQUxFX1NISUZUKTsKKwkJCQkJcGZpdF9jb250cm9sIHw9IChQRklUX0VOQUJMRSB8CisJCQkJCQkJIFZFUlRfSU5URVJQX0JJTElORUFSIHwKKwkJCQkJCQkgSE9SSVpfSU5URVJQX0JJTElORUFSKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNjYWxlZF93aWR0aCA8IHNjYWxlZF9oZWlnaHQpIHsgLyogbGV0dGVyICovCisJCQkJY2VudHJlX3ZlcnRpY2FsbHkoYWRqdXN0ZWRfbW9kZSwgc2NhbGVkX3dpZHRoIC8gbW9kZS0+aGRpc3BsYXkpOworCisJCQkJYm9yZGVyID0gTFZEU19CT1JERVJfRU5BQkxFOworCQkJCWlmIChtb2RlLT5oZGlzcGxheSAhPSBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSkgeworCQkJCQl1MzIgYml0cyA9IHBhbmVsX2ZpdHRlcl9zY2FsaW5nKG1vZGUtPmhkaXNwbGF5LCBhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSk7CisJCQkJCXBmaXRfcGdtX3JhdGlvcyB8PSAoYml0cyA8PCBQRklUX0hPUklaX1NDQUxFX1NISUZUIHwKKwkJCQkJCQkgICAgYml0cyA8PCBQRklUX1ZFUlRfU0NBTEVfU0hJRlQpOworCQkJCQlwZml0X2NvbnRyb2wgfD0gKFBGSVRfRU5BQkxFIHwKKwkJCQkJCQkgVkVSVF9JTlRFUlBfQklMSU5FQVIgfAorCQkJCQkJCSBIT1JJWl9JTlRFUlBfQklMSU5FQVIpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCS8qIEFzcGVjdHMgbWF0Y2gsIExldCBodyBzY2FsZSBib3RoIGRpcmVjdGlvbnMgKi8KKwkJCQlwZml0X2NvbnRyb2wgfD0gKFBGSVRfRU5BQkxFIHwKKwkJCQkJCSBWRVJUX0FVVE9fU0NBTEUgfCBIT1JJWl9BVVRPX1NDQUxFIHwKIAkJCQkJCSBWRVJUX0lOVEVSUF9CSUxJTkVBUiB8CiAJCQkJCQkgSE9SSVpfSU5URVJQX0JJTElORUFSKTsKLQkJCQkvKiBQaWxsYXIgd2lsbCBoYXZlIGxlZnQvcmlnaHQgYm9yZGVycyAqLwotCQkJCWxlZnRfYm9yZGVyID0gKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IC0KLQkJCQkJCXNjYWxlZF93aWR0aCkgLyAyOwotCQkJCXJpZ2h0X2JvcmRlciA9IGxlZnRfYm9yZGVyOwotCQkJCWlmIChtb2RlLT5oZGlzcGxheSAmIDEpIC8qIG9kZCByZXNvbHV0aW9ucyAqLwotCQkJCQlyaWdodF9ib3JkZXIrKzsKLQkJCQkvKiBrZWVwIHRoZSBib3JkZXIgYmUgZXZlbiAqLwotCQkJCWlmIChyaWdodF9ib3JkZXIgJiAxKQotCQkJCQlyaWdodF9ib3JkZXIrKzsKLQkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX2hkaXNwbGF5ID0gc2NhbGVkX3dpZHRoOwotCQkJCS8qIHVzZSBib3JkZXIgaW5zdGVhZCBvZiBib3JkZXIgbWludXMgb25lICovCi0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQgPQotCQkJCQlzY2FsZWRfd2lkdGggKyByaWdodF9ib3JkZXI7Ci0JCQkJLyoga2VlcCB0aGUgaGJsYW5rIHdpZHRoIGNvbnN0YW50ICovCi0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfZW5kID0KLQkJCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQgKwotCQkJCQkJCWhibGFua193aWR0aDsKLQkJCQkvKgotCQkJCSAqIGdldCB0aGUgaHN5bmMgc3RhcnQgcG9zIHJlbGF0aXZlIHRvCi0JCQkJICogaGJsYW5rIHN0YXJ0Ci0JCQkJICovCi0JCQkJaHN5bmNfcG9zID0gKGhibGFua193aWR0aCAtIGhzeW5jX3dpZHRoKSAvIDI7Ci0JCQkJLyoga2VlcCB0aGUgaHN5bmNfcG9zIGJlIGV2ZW4gKi8KLQkJCQlpZiAoaHN5bmNfcG9zICYgMSkKLQkJCQkJaHN5bmNfcG9zKys7Ci0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oc3luY19zdGFydCA9Ci0JCQkJCWFkanVzdGVkX21vZGUtPmNydGNfaGJsYW5rX3N0YXJ0ICsKLQkJCQkJCQloc3luY19wb3M7Ci0JCQkJLyoga2VlcHQgaHN5bmMgd2lkdGggY29uc3RhbnQgKi8KLQkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX2hzeW5jX2VuZCA9Ci0JCQkJCWFkanVzdGVkX21vZGUtPmNydGNfaHN5bmNfc3RhcnQgKwotCQkJCQkJCWhzeW5jX3dpZHRoOwotCQkJCWJvcmRlciA9IDE7Ci0JCQl9IGVsc2UgaWYgKHBhbmVsX3JhdGlvIDwgZGVzaXJlZF9yYXRpbykgeyAvKiBsZXR0ZXIgKi8KLQkJCQl1MzIgc2NhbGVkX2hlaWdodCA9IG1vZGUtPnZkaXNwbGF5ICoKLQkJCQkJaG9yaXpfc2NhbGUgLyBQQU5FTF9SQVRJT19GQUNUT1I7Ci0JCQkJdmVydF9yYXRpbyA9IGhvcml6X3JhdGlvOwotCQkJCXBmaXRfY29udHJvbCB8PSAoSE9SSVpfQVVUT19TQ0FMRSB8Ci0JCQkJCQkgVkVSVF9JTlRFUlBfQklMSU5FQVIgfAotCQkJCQkJIEhPUklaX0lOVEVSUF9CSUxJTkVBUik7Ci0JCQkJLyogTGV0dGVyYm94IHdpbGwgaGF2ZSB0b3AvYm90dG9tIGJvcmRlciAqLwotCQkJCXRvcF9ib3JkZXIgPSAoYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgLQotCQkJCQlzY2FsZWRfaGVpZ2h0KSAvIDI7Ci0JCQkJYm90dG9tX2JvcmRlciA9IHRvcF9ib3JkZXI7Ci0JCQkJaWYgKG1vZGUtPnZkaXNwbGF5ICYgMSkKLQkJCQkJYm90dG9tX2JvcmRlcisrOwotCQkJCWFkanVzdGVkX21vZGUtPmNydGNfdmRpc3BsYXkgPSBzY2FsZWRfaGVpZ2h0OwotCQkJCS8qIHVzZSBib3JkZXIgaW5zdGVhZCBvZiBib3JkZXIgbWludXMgb25lICovCi0JCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQgPQotCQkJCQlzY2FsZWRfaGVpZ2h0ICsgYm90dG9tX2JvcmRlcjsKLQkJCQkvKiBrZWVwIHRoZSB2Ymxhbmsgd2lkdGggY29uc3RhbnQgKi8KLQkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZibGFua19lbmQgPQotCQkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZibGFua19zdGFydCArCi0JCQkJCQkJdmJsYW5rX3dpZHRoOwotCQkJCS8qCi0JCQkJICogZ2V0IHRoZSB2c3luYyBzdGFydCBwb3MgcmVsYXRpdmUgdG8KLQkJCQkgKiB2Ymxhbmsgc3RhcnQKLQkJCQkgKi8KLQkJCQl2c3luY19wb3MgPSAodmJsYW5rX3dpZHRoIC0gdnN5bmNfd2lkdGgpIC8gMjsKLQkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0ID0KLQkJCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQgKwotCQkJCQkJCXZzeW5jX3BvczsKLQkJCQkvKiBrZWVwIHRoZSB2c3luYyB3aWR0aCBjb25zdGFudCAqLwotCQkJCWFkanVzdGVkX21vZGUtPmNydGNfdnN5bmNfZW5kID0KLQkJCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19zdGFydCArCi0JCQkJCQkJdnN5bmNfd2lkdGg7Ci0JCQkJYm9yZGVyID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkvKiBBc3BlY3RzIG1hdGNoLCBMZXQgaHcgc2NhbGUgYm90aCBkaXJlY3Rpb25zICovCi0JCQkJcGZpdF9jb250cm9sIHw9IChWRVJUX0FVVE9fU0NBTEUgfAotCQkJCQkJIEhPUklaX0FVVE9fU0NBTEUgfAotCQkJCQkJIFZFUlRfSU5URVJQX0JJTElORUFSIHwKLQkJCQkJCSBIT1JJWl9JTlRFUlBfQklMSU5FQVIpOwotCQkJfQotCQkJaG9yaXpfYml0cyA9ICgxIDw8IGJpdHMpICogaG9yaXpfcmF0aW8gLwotCQkJCQlQQU5FTF9SQVRJT19GQUNUT1I7Ci0JCQl2ZXJ0X2JpdHMgPSAoMSA8PCBiaXRzKSAqIHZlcnRfcmF0aW8gLwotCQkJCQlQQU5FTF9SQVRJT19GQUNUT1I7Ci0JCQlwZml0X3BnbV9yYXRpb3MgPQotCQkJCSgodmVydF9iaXRzIDw8IFBGSVRfVkVSVF9TQ0FMRV9TSElGVCkgJgotCQkJCQkJUEZJVF9WRVJUX1NDQUxFX01BU0spIHwKLQkJCQkoKGhvcml6X2JpdHMgPDwgUEZJVF9IT1JJWl9TQ0FMRV9TSElGVCkgJgotCQkJCQkJUEZJVF9IT1JJWl9TQ0FMRV9NQVNLKTsKIAkJfQogCQlicmVhazsKIApAQCAtNDU4LDYgKzM3Miw3IEBACiAJCQkJCSBWRVJUX0lOVEVSUF9CSUxJTkVBUiB8CiAJCQkJCSBIT1JJWl9JTlRFUlBfQklMSU5FQVIpOwogCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTQ2NSwxNCArMzgwLDggQEAKIG91dDoKIAlsdmRzX3ByaXYtPnBmaXRfY29udHJvbCA9IHBmaXRfY29udHJvbDsKIAlsdmRzX3ByaXYtPnBmaXRfcGdtX3JhdGlvcyA9IHBmaXRfcGdtX3JhdGlvczsKLQkvKgotCSAqIFdoZW4gdGhlcmUgZXhpc3RzIHRoZSBib3JkZXIsIGl0IG1lYW5zIHRoYXQgdGhlIExWRFNfQk9SRFIKLQkgKiBzaG91bGQgYmUgZW5hYmxlZC4KLQkgKi8KLQlpZiAoYm9yZGVyKQotCQlkZXZfcHJpdi0+bHZkc19ib3JkZXJfYml0cyB8PSBMVkRTX0JPUkRFUl9FTkFCTEU7Ci0JZWxzZQotCQlkZXZfcHJpdi0+bHZkc19ib3JkZXJfYml0cyAmPSB+KExWRFNfQk9SREVSX0VOQUJMRSk7CisJZGV2X3ByaXYtPmx2ZHNfYm9yZGVyX2JpdHMgPSBib3JkZXI7CisKIAkvKgogCSAqIFhYWDogSXQgd291bGQgYmUgbmljZSB0byBzdXBwb3J0IGxvd2VyIHJlZnJlc2ggcmF0ZXMgb24gdGhlCiAJICogcGFuZWxzIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbiwgYW5kIHBlcmhhcHMgbWF0Y2ggdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKaW5kZXggZDdhZDUxMy4uZDM5YWVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYwpAQCAtNjUsNyArNjUsNyBAQAogI2RlZmluZSBPQ01EX1lVVl80MTBfUExBTkFSCSgweGU8PDEwKSAvKiBhbHNvIDQxMSAqLwogI2RlZmluZSBPQ01EX1RWU1lOQ0ZMSVBfUEFSSVRZCSgweDE8PDkpCiAjZGVmaW5lIE9DTURfVFZTWU5DRkxJUF9FTkFCTEUJKDB4MTw8NykKLSNkZWZpbmUgT0NNRF9CVUZfVFlQRV9NQVNLCShPeDE8PDUpCisjZGVmaW5lIE9DTURfQlVGX1RZUEVfTUFTSwkoMHgxPDw1KQogI2RlZmluZSBPQ01EX0JVRl9UWVBFX0ZSQU1FCSgweDA8PDUpCiAjZGVmaW5lIE9DTURfQlVGX1RZUEVfRklFTEQJKDB4MTw8NSkKICNkZWZpbmUgT0NNRF9URVNUX01PREUJCSgweDE8PDQpCkBAIC0xODUsNyArMTg1LDggQEAKIAogCWlmIChPVkVSTEFZX05PTlBIWVNJQ0FMKG92ZXJsYXktPmRldikpIHsKIAkJcmVncyA9IGlvX21hcHBpbmdfbWFwX2F0b21pY193YyhkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcsCi0JCQkJb3ZlcmxheS0+cmVnX2JvLT5ndHRfb2Zmc2V0KTsKKwkJCQkJCW92ZXJsYXktPnJlZ19iby0+Z3R0X29mZnNldCwKKwkJCQkJCUtNX1VTRVIwKTsKIAogCQlpZiAoIXJlZ3MpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1hcCBvdmVybGF5IHJlZ3MgaW4gR1RUXG4iKTsKQEAgLTIwMCw3ICsyMDEsNyBAQAogc3RhdGljIHZvaWQgaW50ZWxfb3ZlcmxheV91bm1hcF9yZWdzX2F0b21pYyhzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSkKIHsKIAlpZiAoT1ZFUkxBWV9OT05QSFlTSUNBTChvdmVybGF5LT5kZXYpKQotCQlpb19tYXBwaW5nX3VubWFwX2F0b21pYyhvdmVybGF5LT52aXJ0X2FkZHIpOworCQlpb19tYXBwaW5nX3VubWFwX2F0b21pYyhvdmVybGF5LT52aXJ0X2FkZHIsIEtNX1VTRVIwKTsKIAogCW92ZXJsYXktPnZpcnRfYWRkciA9IE5VTEw7CiAKQEAgLTk1OCw3ICs5NTksNyBAQAogCSAgICB8fCByZWMtPnNyY193aWR0aCA8IE5fSE9SSVpfWV9UQVBTKjQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogY2hlY2sgYWxpbmdtZW50IGNvbnN0cmFpbnMgKi8KKwkvKiBjaGVjayBhbGlnbm1lbnQgY29uc3RyYWludHMgKi8KIAlzd2l0Y2ggKHJlYy0+ZmxhZ3MgJiBJOTE1X09WRVJMQVlfVFlQRV9NQVNLKSB7CiAJCWNhc2UgSTkxNV9PVkVSTEFZX1JHQjoKIAkJCS8qIG5vdCBpbXBsZW1lbnRlZCAqLwpAQCAtOTkwLDcgKzk5MSwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHN0cmlkZSBjaGVja2luZyAqLwotCXN0cmlkZV9tYXNrID0gNjM7CisJaWYgKElTX0k4MzAoZGV2KSB8fCBJU184NDVHKGRldikpCisJCXN0cmlkZV9tYXNrID0gMjU1OworCWVsc2UKKwkJc3RyaWRlX21hc2sgPSA2MzsKIAogCWlmIChyZWMtPnN0cmlkZV9ZICYgc3RyaWRlX21hc2sgfHwgcmVjLT5zdHJpZGVfVVYgJiBzdHJpZGVfbWFzaykKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggNzY5OTNhYy4uZDlkNGQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMzkyLDEzICszOTIsMTMgQEAKIAkJRFJNX0xPR19LTVMoIiUwMlggIiwgKCh1OCAqKWFyZ3MpW2ldKTsKIAlmb3IgKDsgaSA8IDg7IGkrKykKIAkJRFJNX0xPR19LTVMoIiAgICIpOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2R2b19jbWRfbmFtZXMpIC8gc2l6ZW9mKHNkdm9fY21kX25hbWVzWzBdKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2R2b19jbWRfbmFtZXMpOyBpKyspIHsKIAkJaWYgKGNtZCA9PSBzZHZvX2NtZF9uYW1lc1tpXS5jbWQpIHsKIAkJCURSTV9MT0dfS01TKCIoJXMpIiwgc2R2b19jbWRfbmFtZXNbaV0ubmFtZSk7CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoaSA9PSBzaXplb2Yoc2R2b19jbWRfbmFtZXMpLyBzaXplb2Yoc2R2b19jbWRfbmFtZXNbMF0pKQorCWlmIChpID09IEFSUkFZX1NJWkUoc2R2b19jbWRfbmFtZXMpKQogCQlEUk1fTE9HX0tNUygiKCUwMlgpIiwgY21kKTsKIAlEUk1fTE9HX0tNUygiXG4iKTsKIH0KQEAgLTEyMzcsOSArMTIzNywxMSBAQAogCiAJLyogU2V0IHRoZSBTRFZPIGNvbnRyb2wgcmVncy4gKi8KIAlpZiAoSVNfSTk2NUcoZGV2KSkgewotCQlzZHZveCB8PSBTRFZPX0JPUkRFUl9FTkFCTEUgfAotCQkJU0RWT19WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCQlTRFZPX0hTWU5DX0FDVElWRV9ISUdIOworCQlzZHZveCB8PSBTRFZPX0JPUkRFUl9FTkFCTEU7CisJCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUFZTWU5DKQorCQkJc2R2b3ggfD0gU0RWT19WU1lOQ19BQ1RJVkVfSElHSDsKKwkJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCisJCQlzZHZveCB8PSBTRFZPX0hTWU5DX0FDVElWRV9ISUdIOwogCX0gZWxzZSB7CiAJCXNkdm94IHw9IEk5MTVfUkVBRChzZHZvX3ByaXYtPnNkdm9fcmVnKTsKIAkJc3dpdGNoIChzZHZvX3ByaXYtPnNkdm9fcmVnKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYwppbmRleCA2ZDU1M2MyLi5jYzM3MjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCQkudmlfZW5kX2YxCT0gMjAsCQkgICAgLnZpX2VuZF9mMgkJPSAyMSwKIAkJLm5icl9lbmQJPSAyNDAsCiAKLQkJLmJ1cnN0X2VuYQk9IDgsCisJCS5idXJzdF9lbmEJPSB0cnVlLAogCQkuaGJ1cnN0X3N0YXJ0CT0gNzIsCQkgICAgLmhidXJzdF9sZW4JCT0gMzQsCiAJCS52YnVyc3Rfc3RhcnRfZjEgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YxCT0gMjQwLAogCQkudmJ1cnN0X3N0YXJ0X2YyID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjIJPSAyNDAsCkBAIC04OTYsOCArODk2LDYgQEAKIAl9LAogfTsKIAotI2RlZmluZSBOVU1fVFZfTU9ERVMgc2l6ZW9mKHR2X21vZGVzKSAvIHNpemVvZiAodHZfbW9kZXNbMF0pCi0KIHN0YXRpYyB2b2lkCiBpbnRlbF90dl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCiB7CkBAIC0xNDI0LDcgKzE0MjIsNyBAQAogCWludCBqLCBjb3VudCA9IDA7CiAJdTY0IHRtcDsKIAotCWZvciAoaiA9IDA7IGogPCBzaXplb2YoaW5wdXRfcmVzX3RhYmxlKSAvIHNpemVvZihpbnB1dF9yZXNfdGFibGVbMF0pOworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGlucHV0X3Jlc190YWJsZSk7CiAJICAgICBqKyspIHsKIAkJc3RydWN0IGlucHV0X3JlcyAqaW5wdXQgPSAmaW5wdXRfcmVzX3RhYmxlW2pdOwogCQl1bnNpZ25lZCBpbnQgaGFjdGl2ZV9zID0gaW5wdXQtPnc7CkBAIC0xNTEyLDcgKzE1MTAsNyBAQAogCQl0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX0JPVFRPTV0gPSB2YWw7CiAJCWNoYW5nZWQgPSB0cnVlOwogCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gZGV2LT5tb2RlX2NvbmZpZy50dl9tb2RlX3Byb3BlcnR5KSB7Ci0JCWlmICh2YWwgPj0gTlVNX1RWX01PREVTKSB7CisJCWlmICh2YWwgPj0gQVJSQVlfU0laRSh0dl9tb2RlcykpIHsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTY5MywxMyArMTY5MSwxMyBAQAogCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gZmFsc2U7CiAKIAkvKiBDcmVhdGUgVFYgcHJvcGVydGllcyB0aGVuIGF0dGFjaCBjdXJyZW50IHZhbHVlcyAqLwotCXR2X2Zvcm1hdF9uYW1lcyA9IGttYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBOVU1fVFZfTU9ERVMsCisJdHZfZm9ybWF0X25hbWVzID0ga21hbGxvYyhzaXplb2YoY2hhciAqKSAqIEFSUkFZX1NJWkUodHZfbW9kZXMpLAogCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0dl9mb3JtYXRfbmFtZXMpCiAJCWdvdG8gb3V0OwotCWZvciAoaSA9IDA7IGkgPCBOVU1fVFZfTU9ERVM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dl9tb2Rlcyk7IGkrKykKIAkJdHZfZm9ybWF0X25hbWVzW2ldID0gdHZfbW9kZXNbaV0ubmFtZTsKLQlkcm1fbW9kZV9jcmVhdGVfdHZfcHJvcGVydGllcyhkZXYsIE5VTV9UVl9NT0RFUywgdHZfZm9ybWF0X25hbWVzKTsKKwlkcm1fbW9kZV9jcmVhdGVfdHZfcHJvcGVydGllcyhkZXYsIEFSUkFZX1NJWkUodHZfbW9kZXMpLCB0dl9mb3JtYXRfbmFtZXMpOwogCiAJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBkZXYtPm1vZGVfY29uZmlnLnR2X21vZGVfcHJvcGVydHksCiAJCQkJICAgaW5pdGlhbF9tb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZG1hLmMKaW5kZXggM2M5MTdmYi4uMDg4NjhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZG1hLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAqIEVuZ2luZSBjb250cm9sCiAgKi8KIAotaW50IG1nYV9kb193YWl0X2Zvcl9pZGxlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXUzMiBzdGF0dXMgPSAwOwogCWludCBpOwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAtRUJVU1k7CiB9CiAKLXN0YXRpYyBpbnQgbWdhX2RvX2RtYV9yZXNldChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBtZ2FfZG9fZG1hX3Jlc2V0KGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3QgKnByaW1hcnkgPSAmZGV2X3ByaXYtPnByaW07CkBAIC0xMDIsNyArMTAyLDcgQEAKICAqIFByaW1hcnkgRE1BIHN0cmVhbQogICovCiAKLXZvaWQgbWdhX2RvX2RtYV9mbHVzaChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQordm9pZCBtZ2FfZG9fZG1hX2ZsdXNoKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3ByaW1hcnlfYnVmZmVyX3QgKnByaW1hcnkgPSAmZGV2X3ByaXYtPnByaW07CiAJdTMyIGhlYWQsIHRhaWw7CkBAIC0xNDIsMTEgKzE0MiwxMCBAQAogCiAJaGVhZCA9IE1HQV9SRUFEKE1HQV9QUklNQUREUkVTUyk7CiAKLQlpZiAoaGVhZCA8PSB0YWlsKSB7CisJaWYgKGhlYWQgPD0gdGFpbCkKIAkJcHJpbWFyeS0+c3BhY2UgPSBwcmltYXJ5LT5zaXplIC0gcHJpbWFyeS0+dGFpbDsKLQl9IGVsc2UgeworCWVsc2UKIAkJcHJpbWFyeS0+c3BhY2UgPSBoZWFkIC0gdGFpbDsKLQl9CiAKIAlEUk1fREVCVUcoIiAgIGhlYWQgPSAweCUwNmx4XG4iLCAodW5zaWduZWQgbG9uZykoaGVhZCAtIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQpKTsKIAlEUk1fREVCVUcoIiAgIHRhaWwgPSAweCUwNmx4XG4iLCAodW5zaWduZWQgbG9uZykodGFpbCAtIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQpKTsKQEAgLTE1OCw3ICsxNTcsNyBAQAogCURSTV9ERUJVRygiZG9uZS5cbiIpOwogfQogCi12b2lkIG1nYV9kb19kbWFfd3JhcF9zdGFydChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQordm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9tZ2FfcHJpbWFyeV9idWZmZXJfdCAqcHJpbWFyeSA9ICZkZXZfcHJpdi0+cHJpbTsKIAl1MzIgaGVhZCwgdGFpbDsKQEAgLTE4MSwxMSArMTgwLDEwIEBACiAKIAloZWFkID0gTUdBX1JFQUQoTUdBX1BSSU1BRERSRVNTKTsKIAotCWlmIChoZWFkID09IGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQpIHsKKwlpZiAoaGVhZCA9PSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0KQogCQlwcmltYXJ5LT5zcGFjZSA9IHByaW1hcnktPnNpemU7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXByaW1hcnktPnNwYWNlID0gaGVhZCAtIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQ7Ci0JfQogCiAJRFJNX0RFQlVHKCIgICBoZWFkID0gMHglMDZseFxuIiwgKHVuc2lnbmVkIGxvbmcpKGhlYWQgLSBkZXZfcHJpdi0+cHJpbWFyeS0+b2Zmc2V0KSk7CiAJRFJNX0RFQlVHKCIgICB0YWlsID0gMHglMDZ4XG4iLCBwcmltYXJ5LT50YWlsKTsKQEAgLTE5OSw3ICsxOTcsNyBAQAogCURSTV9ERUJVRygiZG9uZS5cbiIpOwogfQogCi12b2lkIG1nYV9kb19kbWFfd3JhcF9lbmQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3ZvaWQgbWdhX2RvX2RtYV93cmFwX2VuZChkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJZHJtX21nYV9wcmltYXJ5X2J1ZmZlcl90ICpwcmltYXJ5ID0gJmRldl9wcml2LT5wcmltOwogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtMjIwLDExICsyMTgsMTEgQEAKICAqIEZyZWVsaXN0IG1hbmFnZW1lbnQKICAqLwogCi0jZGVmaW5lIE1HQV9CVUZGRVJfVVNFRAkJfjAKKyNkZWZpbmUgTUdBX0JVRkZFUl9VU0VECQkofjApCiAjZGVmaW5lIE1HQV9CVUZGRVJfRlJFRQkJMAogCiAjaWYgTUdBX0ZSRUVMSVNUX0RFQlVHCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcHJpbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcHJpbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CkBAIC0yNDUsNyArMjQzLDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG1nYV9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBtZ2FfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwpAQCAtMjg4LDcgKzI4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CkBAIC0zMDgsNyArMzA2LDcgQEAKICNpZiAwCiAvKiBGSVhNRTogU3RpbGwgbmVlZGVkPwogICovCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCXN0cnVjdCBkcm1fYnVmICpidWY7CkBAIC0zNTYsNyArMzU0LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotaW50IG1nYV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQoraW50IG1nYV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKmJ1ZikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMzkxLDcgKzM4OSw3IEBACiAgKiBETUEgaW5pdGlhbGl6YXRpb24sIGNsZWFudXAKICAqLwogCi1pbnQgbWdhX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IG1nYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0OwpAQCAtNDA1LDggKzQwMyw4IEBACiAJZGV2X3ByaXYtPnVzZWNfdGltZW91dCA9IE1HQV9ERUZBVUxUX1VTRUNfVElNRU9VVDsKIAlkZXZfcHJpdi0+Y2hpcHNldCA9IGZsYWdzOwogCi0JZGV2X3ByaXYtPm1taW9fYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKLQlkZXZfcHJpdi0+bW1pb19zaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKTsKKwlkZXZfcHJpdi0+bW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CisJZGV2X3ByaXYtPm1taW9fc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKIAogCWRldi0+Y291bnRlcnMgKz0gMzsKIAlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKQEAgLTQzOSw4ICs0MzcsOCBAQAogICoKICAqIFxzYSBtZ2FfZG9fZG1hX2Jvb3RzdHJhcCwgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwCiAgKi8KLXN0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKK3N0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICpkbWFfYnMpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmNvbnN0IGRldl9wcml2ID0KIAkgICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC00ODEsMTEgKzQ3OSwxMCBAQAogCSAqLwogCiAJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IE1HQV9DQVJEX1RZUEVfRzIwMCkgewotCQlpZiAobW9kZS5tb2RlICYgMHgwMikgeworCQlpZiAobW9kZS5tb2RlICYgMHgwMikKIAkJCU1HQV9XUklURShNR0FfQUdQX1BMTCwgTUdBX0FHUDJYUExMX0VOQUJMRSk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCU1HQV9XUklURShNR0FfQUdQX1BMTCwgTUdBX0FHUDJYUExMX0RJU0FCTEUpOwotCQl9CiAJfQogCiAJLyogQWxsb2NhdGUgYW5kIGJpbmQgQUdQIG1lbW9yeS4gKi8KQEAgLTU5Myw4ICs1OTAsOCBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKLXN0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKK3N0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICpkbWFfYnMpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC02MTQsOCArNjExLDggQEAKICAqCiAgKiBcc2EgbWdhX2RvX2RtYV9ib290c3RyYXAsIG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcAogICovCi1zdGF0aWMgaW50IG1nYV9kb19wY2lfZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKLQkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCitzdGF0aWMgaW50IG1nYV9kb19wY2lfZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqZG1hX2JzKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpjb25zdCBkZXZfcHJpdiA9CiAJICAgIChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjc4LDkgKzY3NSw4IEBACiAJCXJlcS5zaXplID0gZG1hX2JzLT5zZWNvbmRhcnlfYmluX3NpemU7CiAKIAkJZXJyID0gZHJtX2FkZGJ1ZnNfcGNpKGRldiwgJnJlcSk7Ci0JCWlmICghZXJyKSB7CisJCWlmICghZXJyKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAKIAlpZiAoYmluX2NvdW50ID09IDApIHsKQEAgLTcwNCw4ICs3MDAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCWRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICogZG1hX2JzKQorc3RhdGljIGludCBtZ2FfZG9fZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCWRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICpkbWFfYnMpCiB7CiAJY29uc3QgaW50IGlzX2FncCA9IChkbWFfYnMtPmFncF9tb2RlICE9IDApICYmIGRybV9kZXZpY2VfaXNfYWdwKGRldik7CiAJaW50IGVycjsKQEAgLTczNywxNyArNzMzLDE1IEBACiAJICogY2FydmUgb2ZmIHBvcnRpb25zIG9mIGl0IGZvciBpbnRlcm5hbCB1c2VzLiAgVGhlIHJlbWFpbmluZyBtZW1vcnkKIAkgKiBpcyByZXR1cm5lZCB0byB1c2VyLW1vZGUgdG8gYmUgdXNlZCBmb3IgQUdQIHRleHR1cmVzLgogCSAqLwotCWlmIChpc19hZ3ApIHsKKwlpZiAoaXNfYWdwKQogCQllcnIgPSBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAoZGV2LCBkbWFfYnMpOwotCX0KIAogCS8qIElmIHdlIGF0dGVtcHRlZCB0byBpbml0aWFsaXplIHRoZSBjYXJkIGZvciBBR1AgRE1BIGJ1dCBmYWlsZWQsCiAJICogY2xlYW4tdXAgYW55IG1lc3MgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQuCiAJICovCiAKLQlpZiAoZXJyKSB7CisJaWYgKGVycikKIAkJbWdhX2RvX2NsZWFudXBfZG1hKGRldiwgTUlOSU1BTF9DTEVBTlVQKTsKLQl9CiAKIAkvKiBOb3Qgb25seSBkbyB3ZSB3YW50IHRvIHRyeSBhbmQgaW5pdGlhbGl6ZWQgUENJIGNhcmRzIGZvciBQQ0kgRE1BLAogCSAqIGJ1dCB3ZSBhbHNvIHRyeSB0byBpbml0aWFsaXplZCBBR1AgY2FyZHMgdGhhdCBjb3VsZCBub3QgYmUKQEAgLTc1Nyw5ICs3NTEsOCBAQAogCSAqIEFHUCBtZW1vcnksIGV0Yy4KIAkgKi8KIAotCWlmICghaXNfYWdwIHx8IGVycikgeworCWlmICghaXNfYWdwIHx8IGVycikKIAkJZXJyID0gbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwKGRldiwgZG1hX2JzKTsKLQl9CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzkyLDcgKzc4NSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtZ2FfZG9faW5pdF9kbWEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgbWdhX2RvX2luaXRfZG1hKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9tZ2FfaW5pdF90ICppbml0KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0OwpAQCAtODAwLDExICs3OTMsMTAgQEAKIAogCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWlmIChpbml0LT5zZ3JhbSkgeworCWlmIChpbml0LT5zZ3JhbSkKIAkJZGV2X3ByaXYtPmNsZWFyX2NtZCA9IE1HQV9EV0dDVExfQ0xFQVIgfCBNR0FfQVRZUEVfQkxLOwotCX0gZWxzZSB7CisJZWxzZQogCQlkZXZfcHJpdi0+Y2xlYXJfY21kID0gTUdBX0RXR0NUTF9DTEVBUiB8IE1HQV9BVFlQRV9SU1RSOwotCX0KIAlkZXZfcHJpdi0+bWFjY2VzcyA9IGluaXQtPm1hY2Nlc3M7CiAKIAlkZXZfcHJpdi0+ZmJfY3BwID0gaW5pdC0+ZmJfY3BwOwpAQCAtOTc1LDkgKzk2Nyw4IEBACiAJCQkJZGV2X3ByaXYtPmFncF9oYW5kbGUgPSAwOwogCQkJfQogCi0JCQlpZiAoKGRldi0+YWdwICE9IE5VTEwpICYmIGRldi0+YWdwLT5hY3F1aXJlZCkgeworCQkJaWYgKChkZXYtPmFncCAhPSBOVUxMKSAmJiBkZXYtPmFncC0+YWNxdWlyZWQpCiAJCQkJZXJyID0gZHJtX2FncF9yZWxlYXNlKGRldik7Ci0JCQl9CiAjZW5kaWYKIAkJfQogCkBAIC05OTgsOSArOTg5LDggQEAKIAkJbWVtc2V0KGRldl9wcml2LT53YXJwX3BpcGVfcGh5cywgMCwKIAkJICAgICAgIHNpemVvZihkZXZfcHJpdi0+d2FycF9waXBlX3BoeXMpKTsKIAotCQlpZiAoZGV2X3ByaXYtPmhlYWQgIT0gTlVMTCkgeworCQlpZiAoZGV2X3ByaXYtPmhlYWQgIT0gTlVMTCkKIAkJCW1nYV9mcmVlbGlzdF9jbGVhbnVwKGRldik7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTAxNyw5ICsxMDA3LDggQEAKIAlzd2l0Y2ggKGluaXQtPmZ1bmMpIHsKIAljYXNlIE1HQV9JTklUX0RNQToKIAkJZXJyID0gbWdhX2RvX2luaXRfZG1hKGRldiwgaW5pdCk7Ci0JCWlmIChlcnIpIHsKKwkJaWYgKGVycikKIAkJCSh2b2lkKW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7Ci0JCX0KIAkJcmV0dXJuIGVycjsKIAljYXNlIE1HQV9DTEVBTlVQX0RNQToKIAkJcmV0dXJuIG1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7CkBAIC0xMDQ3LDkgKzEwMzYsOCBAQAogCiAJV1JBUF9XQUlUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKIAotCWlmIChsb2NrLT5mbGFncyAmIChfRFJNX0xPQ0tfRkxVU0ggfCBfRFJNX0xPQ0tfRkxVU0hfQUxMKSkgeworCWlmIChsb2NrLT5mbGFncyAmIChfRFJNX0xPQ0tfRkxVU0ggfCBfRFJNX0xPQ0tfRkxVU0hfQUxMKSkKIAkJbWdhX2RvX2RtYV9mbHVzaChkZXZfcHJpdik7Ci0JfQogCiAJaWYgKGxvY2stPmZsYWdzICYgX0RSTV9MT0NLX1FVSUVTQ0VOVCkgewogI2lmIE1HQV9ETUFfREVCVUcKQEAgLTEwNzksOCArMTA2Nyw4IEBACiAgKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQKICAqLwogCi1zdGF0aWMgaW50IG1nYV9kbWFfZ2V0X2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIHN0cnVjdCBkcm1fZG1hICogZCkKK3N0YXRpYyBpbnQgbWdhX2RtYV9nZXRfYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBzdHJ1Y3QgZHJtX2RtYSAqZCkKIHsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpOwpAQCAtMTEzNCw5ICsxMTIyLDggQEAKIAogCWQtPmdyYW50ZWRfY291bnQgPSAwOwogCi0JaWYgKGQtPnJlcXVlc3RfY291bnQpIHsKKwlpZiAoZC0+cmVxdWVzdF9jb3VudCkKIAkJcmV0ID0gbWdhX2RtYV9nZXRfYnVmZmVycyhkZXYsIGZpbGVfcHJpdiwgZCk7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNDQsNyArMTEzMSw3IEBACiAvKioKICAqIENhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbW9kdWxlIGlzIHVubG9hZGVkLgogICovCi1pbnQgbWdhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitpbnQgbWdhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlrZnJlZShkZXYtPmRldl9wcml2YXRlKTsKIAlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKQEAgLTExNTUsMTIgKzExNDIsMTIgQEAKIC8qKgogICogQ2FsbGVkIHdoZW4gdGhlIGxhc3Qgb3BlbmVyIG9mIHRoZSBkZXZpY2UgaXMgY2xvc2VkLgogICovCi12b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7CiB9CiAKLWludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlyZXR1cm4gbWdhX2RvX3dhaXRfZm9yX2lkbGUoZGV2X3ByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuYwppbmRleCBkZGZlMTYxLi4yNmQwZDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCW1nYV9QQ0lfSURTCkBAIC0xMTksNyArMTE5LDcgQEAKICAqIFxyZXR1cm5zCiAgKiBJZiB0aGUgZGV2aWNlIGlzIGEgUENJIEc0NTAsIHplcm8gaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgMiBpcyByZXR1cm5lZC4KICAqLwotc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBwY2lfZGV2ICpjb25zdCBwZGV2ID0gZGV2LT5wZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oCmluZGV4IGJlNmM2YjkuLjEwODRmYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oCkBAIC0xNjQsNTkgKzE2NCw1OSBAQAogZXh0ZXJuIGludCBtZ2FfZG1hX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgbWdhX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotZXh0ZXJuIGludCBtZ2FfZG9fd2FpdF9mb3JfaWRsZShkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK2V4dGVybiBpbnQgbWdhX2RvX3dhaXRfZm9yX2lkbGUoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KTsKIAotZXh0ZXJuIHZvaWQgbWdhX2RvX2RtYV9mbHVzaChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKLWV4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9zdGFydChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKLWV4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9lbmQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX2ZsdXNoKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9lbmQoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KTsKIAotZXh0ZXJuIGludCBtZ2FfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Zik7CitleHRlcm4gaW50IG1nYV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKmJ1Zik7CiAKIAkJCQkvKiBtZ2Ffd2FycC5jICovCi1leHRlcm4gaW50IG1nYV93YXJwX2luc3RhbGxfbWljcm9jb2RlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwotZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworZXh0ZXJuIGludCBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZShkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOworZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdik7CiAKIAkJCQkvKiBtZ2FfaXJxLmMgKi8KIGV4dGVybiBpbnQgbWdhX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHZvaWQgbWdhX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB1MzIgbWdhX2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiBleHRlcm4gaXJxcmV0dXJuX3QgbWdhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gbG9uZyBtZ2FfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKICNkZWZpbmUgbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKQlEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCkKIAogI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKLSNkZWZpbmUgTUdBX0JBU0UoIHJlZyApCQkoKHVuc2lnbmVkIGxvbmcpKGRldl9wcml2LT5tbWlvLT5oYW5kbGUpKQotI2RlZmluZSBNR0FfQUREUiggcmVnICkJCShNR0FfQkFTRShyZWcpICsgcmVnKQorI2RlZmluZSBNR0FfQkFTRShyZWcpCQkoKHVuc2lnbmVkIGxvbmcpKGRldl9wcml2LT5tbWlvLT5oYW5kbGUpKQorI2RlZmluZSBNR0FfQUREUihyZWcpCQkoTUdBX0JBU0UocmVnKSArIHJlZykKIAotI2RlZmluZSBNR0FfREVSRUYoIHJlZyApCSoodm9sYXRpbGUgdTMyICopTUdBX0FERFIoIHJlZyApCi0jZGVmaW5lIE1HQV9ERVJFRjgoIHJlZyApCSoodm9sYXRpbGUgdTggKilNR0FfQUREUiggcmVnICkKKyNkZWZpbmUgTUdBX0RFUkVGKHJlZykJCSgqKHZvbGF0aWxlIHUzMiAqKU1HQV9BRERSKHJlZykpCisjZGVmaW5lIE1HQV9ERVJFRjgocmVnKQkJKCoodm9sYXRpbGUgdTggKilNR0FfQUREUihyZWcpKQogCi0jZGVmaW5lIE1HQV9SRUFEKCByZWcgKQkJKF9NR0FfUkVBRCgodTMyICopTUdBX0FERFIocmVnKSkpCi0jZGVmaW5lIE1HQV9SRUFEOCggcmVnICkJKF9NR0FfUkVBRCgodTggKilNR0FfQUREUihyZWcpKSkKLSNkZWZpbmUgTUdBX1dSSVRFKCByZWcsIHZhbCApCWRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUYoIHJlZyApID0gdmFsOyB9IHdoaWxlICgwKQotI2RlZmluZSBNR0FfV1JJVEU4KCByZWcsIHZhbCApICBkbyB7IERSTV9XUklURU1FTU9SWUJBUlJJRVIoKTsgTUdBX0RFUkVGOCggcmVnICkgPSB2YWw7IH0gd2hpbGUgKDApCisjZGVmaW5lIE1HQV9SRUFEKHJlZykJCShfTUdBX1JFQUQoKHUzMiAqKU1HQV9BRERSKHJlZykpKQorI2RlZmluZSBNR0FfUkVBRDgocmVnKQkJKF9NR0FfUkVBRCgodTggKilNR0FfQUREUihyZWcpKSkKKyNkZWZpbmUgTUdBX1dSSVRFKHJlZywgdmFsKQlkbyB7IERSTV9XUklURU1FTU9SWUJBUlJJRVIoKTsgTUdBX0RFUkVGKHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCisjZGVmaW5lIE1HQV9XUklURTgocmVnLCB2YWwpCWRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUY4KHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgdTMyIF9NR0FfUkVBRCh1MzIgKiBhZGRyKQorc3RhdGljIGlubGluZSB1MzIgX01HQV9SRUFEKHUzMiAqYWRkcikKIHsKIAlEUk1fTUVNT1JZQkFSUklFUigpOwogCXJldHVybiAqKHZvbGF0aWxlIHUzMiAqKWFkZHI7CiB9CiAjZWxzZQotI2RlZmluZSBNR0FfUkVBRDgoIHJlZyApCURSTV9SRUFEOChkZXZfcHJpdi0+bW1pbywgKHJlZykpCi0jZGVmaW5lIE1HQV9SRUFEKCByZWcgKQkJRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pbywgKHJlZykpCi0jZGVmaW5lIE1HQV9XUklURTgoIHJlZywgdmFsICkgIERSTV9XUklURTgoZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSkKLSNkZWZpbmUgTUdBX1dSSVRFKCByZWcsIHZhbCApCURSTV9XUklURTMyKGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIE1HQV9SRUFEOChyZWcpCQlEUk1fUkVBRDgoZGV2X3ByaXYtPm1taW8sIChyZWcpKQorI2RlZmluZSBNR0FfUkVBRChyZWcpCQlEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvLCAocmVnKSkKKyNkZWZpbmUgTUdBX1dSSVRFOChyZWcsIHZhbCkJRFJNX1dSSVRFOChkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpKQorI2RlZmluZSBNR0FfV1JJVEUocmVnLCB2YWwpCURSTV9XUklURTMyKGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCiAjZW5kaWYKIAogI2RlZmluZSBEV0dSRUcwCQkweDFjMDAKQEAgLTIzMyw0MCArMjMzLDM5IEBACiAgKiBIZWxwZXIgbWFjcm9zcy4uLgogICovCiAKLSNkZWZpbmUgTUdBX0VNSVRfU1RBVEUoIGRldl9wcml2LCBkaXJ0eSApCQkJCVwKKyNkZWZpbmUgTUdBX0VNSVRfU1RBVEUoZGV2X3ByaXYsIGRpcnR5KQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoIChkaXJ0eSkgJiB+TUdBX1VQTE9BRF9DTElQUkVDVFMgKSB7CQkJXAotCQlpZiAoIGRldl9wcml2LT5jaGlwc2V0ID49IE1HQV9DQVJEX1RZUEVfRzQwMCApIHsJXAotCQkJbWdhX2c0MDBfZW1pdF9zdGF0ZSggZGV2X3ByaXYgKTsJCVwKLQkJfSBlbHNlIHsJCQkJCQlcCi0JCQltZ2FfZzIwMF9lbWl0X3N0YXRlKCBkZXZfcHJpdiApOwkJXAorCWlmICgoZGlydHkpICYgfk1HQV9VUExPQURfQ0xJUFJFQ1RTKSB7CQkJCVwKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IE1HQV9DQVJEX1RZUEVfRzQwMCkJCVwKKwkJCW1nYV9nNDAwX2VtaXRfc3RhdGUoZGV2X3ByaXYpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQltZ2FfZzIwMF9lbWl0X3N0YXRlKGRldl9wcml2KTsJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUkFQX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh0ZXN0X2JpdCgwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCkpIHsJCQlcCisJCWlmIChtZ2FfaXNfaWRsZShkZXZfcHJpdikpIHsJCQkJXAorCQkJbWdhX2RvX2RtYV93cmFwX2VuZChkZXZfcHJpdik7CQkJXAorCQl9IGVsc2UgaWYgKGRldl9wcml2LT5wcmltLnNwYWNlIDwJCQlcCisJCQkgICBkZXZfcHJpdi0+cHJpbS5oaWdoX21hcmspIHsJCQlcCisJCQlpZiAoTUdBX0RNQV9ERUJVRykJCQkJXAorCQkJCURSTV9JTkZPKCJ3cmFwLi4uXG4iKTsJCQlcCisJCQlyZXR1cm4gLUVCVVNZOwkJCQkJXAogCQl9CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFdSQVBfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCisjZGVmaW5lIFdSQVBfV0FJVF9XSVRIX1JFVFVSTihkZXZfcHJpdikJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JaWYgKCB0ZXN0X2JpdCggMCwgJmRldl9wcml2LT5wcmltLndyYXBwZWQgKSApIHsJCQlcCi0JCWlmICggbWdhX2lzX2lkbGUoIGRldl9wcml2ICkgKSB7CQkJXAotCQkJbWdhX2RvX2RtYV93cmFwX2VuZCggZGV2X3ByaXYgKTsJCVwKLQkJfSBlbHNlIGlmICggZGV2X3ByaXYtPnByaW0uc3BhY2UgPAkJCVwKLQkJCSAgICBkZXZfcHJpdi0+cHJpbS5oaWdoX21hcmsgKSB7CQlcCi0JCQlpZiAoIE1HQV9ETUFfREVCVUcgKQkJCQlcCi0JCQkJRFJNX0lORk8oICJ3cmFwLi4uXG4iKTsJCVwKLQkJCXJldHVybiAtRUJVU1k7CQkJXAorCWlmICh0ZXN0X2JpdCgwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCkpIHsJCQlcCisJCWlmIChtZ2FfZG9fd2FpdF9mb3JfaWRsZShkZXZfcHJpdikgPCAwKSB7CQlcCisJCQlpZiAoTUdBX0RNQV9ERUJVRykJCQkJXAorCQkJCURSTV9JTkZPKCJ3cmFwLi4uXG4iKTsJCQlcCisJCQlyZXR1cm4gLUVCVVNZOwkJCQkJXAogCQl9CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFdSQVBfV0FJVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmICggdGVzdF9iaXQoIDAsICZkZXZfcHJpdi0+cHJpbS53cmFwcGVkICkgKSB7CQkJXAotCQlpZiAoIG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApIDwgMCApIHsJCVwKLQkJCWlmICggTUdBX0RNQV9ERUJVRyApCQkJCVwKLQkJCQlEUk1fSU5GTyggIndyYXAuLi5cbiIpOwkJXAotCQkJcmV0dXJuIC1FQlVTWTsJCQlcCi0JCX0JCQkJCQkJXAotCQltZ2FfZG9fZG1hX3dyYXBfZW5kKCBkZXZfcHJpdiApOwkJCVwKKwkJbWdhX2RvX2RtYV93cmFwX2VuZChkZXZfcHJpdik7CQkJCVwKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCkBAIC0yODAsMTIgKzI3OSwxMiBAQAogCiAjZGVmaW5lIERNQV9CTE9DS19TSVpFCSg1ICogc2l6ZW9mKHUzMikpCiAKLSNkZWZpbmUgQkVHSU5fRE1BKCBuICkJCQkJCQkJXAorI2RlZmluZSBCRUdJTl9ETUEobikJCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKLQkJRFJNX0lORk8oICJCRUdJTl9ETUEoICVkIClcbiIsIChuKSApOwkJXAotCQlEUk1fSU5GTyggIiAgIHNwYWNlPTB4JXggcmVxPTB4JVp4XG4iLAkJCVwKLQkJCSAgZGV2X3ByaXYtPnByaW0uc3BhY2UsIChuKSAqIERNQV9CTE9DS19TSVpFICk7CVwKKwlpZiAoTUdBX1ZFUkJPU0UpIHsJCQkJCQlcCisJCURSTV9JTkZPKCJCRUdJTl9ETUEoJWQpXG4iLCAobikpOwkJCVwKKwkJRFJNX0lORk8oIiAgIHNwYWNlPTB4JXggcmVxPTB4JVp4XG4iLAkJCVwKKwkJCSBkZXZfcHJpdi0+cHJpbS5zcGFjZSwgKG4pICogRE1BX0JMT0NLX1NJWkUpOwlcCiAJfQkJCQkJCQkJXAogCXByaW0gPSBkZXZfcHJpdi0+cHJpbS5zdGFydDsJCQkJCVwKIAl3cml0ZSA9IGRldl9wcml2LT5wcmltLnRhaWw7CQkJCQlcCkBAIC0yOTMsOSArMjkyLDkgQEAKIAogI2RlZmluZSBCRUdJTl9ETUFfV1JBUCgpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKLQkJRFJNX0lORk8oICJCRUdJTl9ETUEoKVxuIiApOwkJCQlcCi0JCURSTV9JTkZPKCAiICAgc3BhY2U9MHgleFxuIiwgZGV2X3ByaXYtPnByaW0uc3BhY2UgKTsJXAorCWlmIChNR0FfVkVSQk9TRSkgewkJCQkJCVwKKwkJRFJNX0lORk8oIkJFR0lOX0RNQSgpXG4iKTsJCQkJXAorCQlEUk1fSU5GTygiICAgc3BhY2U9MHgleFxuIiwgZGV2X3ByaXYtPnByaW0uc3BhY2UpOwlcCiAJfQkJCQkJCQkJXAogCXByaW0gPSBkZXZfcHJpdi0+cHJpbS5zdGFydDsJCQkJCVwKIAl3cml0ZSA9IGRldl9wcml2LT5wcmltLnRhaWw7CQkJCQlcCkBAIC0zMDQsNzIgKzMwMyw2OCBAQAogI2RlZmluZSBBRFZBTkNFX0RNQSgpCQkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJZGV2X3ByaXYtPnByaW0udGFpbCA9IHdyaXRlOwkJCQkJXAotCWlmICggTUdBX1ZFUkJPU0UgKSB7CQkJCQkJXAotCQlEUk1fSU5GTyggIkFEVkFOQ0VfRE1BKCkgdGFpbD0weCUwNXggc3A9MHgleFxuIiwJXAotCQkJICB3cml0ZSwgZGV2X3ByaXYtPnByaW0uc3BhY2UgKTsJCVwKLQl9CQkJCQkJCQlcCisJaWYgKE1HQV9WRVJCT1NFKQkJCQkJCVwKKwkJRFJNX0lORk8oIkFEVkFOQ0VfRE1BKCkgdGFpbD0weCUwNXggc3A9MHgleFxuIiwJCVwKKwkJCSB3cml0ZSwgZGV2X3ByaXYtPnByaW0uc3BhY2UpOwkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgRkxVU0hfRE1BKCkJCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoIDAgKSB7CQkJCQkJCVwKLQkJRFJNX0lORk8oICJcbiIgKTsJCQkJCVwKLQkJRFJNX0lORk8oICIgICB0YWlsPTB4JTA2eCBoZWFkPTB4JTA2bHhcbiIsCQlcCi0JCQkgIGRldl9wcml2LT5wcmltLnRhaWwsCQkJCVwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpKE1HQV9SRUFEKE1HQV9QUklNQUREUkVTUykgLQlcCi0JCQkJCSAgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCkpOwlcCisJaWYgKDApIHsJCQkJCQkJXAorCQlEUk1fSU5GTygiXG4iKTsJCQkJCQlcCisJCURSTV9JTkZPKCIgICB0YWlsPTB4JTA2eCBoZWFkPTB4JTA2bHhcbiIsCQlcCisJCQkgZGV2X3ByaXYtPnByaW0udGFpbCwJCQkJXAorCQkJICh1bnNpZ25lZCBsb25nKShNR0FfUkVBRChNR0FfUFJJTUFERFJFU1MpIC0JXAorCQkJCQkgZGV2X3ByaXYtPnByaW1hcnktPm9mZnNldCkpOwlcCiAJfQkJCQkJCQkJXAotCWlmICggIXRlc3RfYml0KCAwLCAmZGV2X3ByaXYtPnByaW0ud3JhcHBlZCApICkgewkJXAotCQlpZiAoIGRldl9wcml2LT5wcmltLnNwYWNlIDwJCQkJXAotCQkgICAgIGRldl9wcml2LT5wcmltLmhpZ2hfbWFyayApIHsJCQlcCi0JCQltZ2FfZG9fZG1hX3dyYXBfc3RhcnQoIGRldl9wcml2ICk7CQlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJbWdhX2RvX2RtYV9mbHVzaCggZGV2X3ByaXYgKTsJCQlcCi0JCX0JCQkJCQkJXAorCWlmICghdGVzdF9iaXQoMCwgJmRldl9wcml2LT5wcmltLndyYXBwZWQpKSB7CQkJXAorCQlpZiAoZGV2X3ByaXYtPnByaW0uc3BhY2UgPCBkZXZfcHJpdi0+cHJpbS5oaWdoX21hcmspCVwKKwkJCW1nYV9kb19kbWFfd3JhcF9zdGFydChkZXZfcHJpdik7CQlcCisJCWVsc2UJCQkJCQkJXAorCQkJbWdhX2RvX2RtYV9mbHVzaChkZXZfcHJpdik7CQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKIC8qIE5ldmVyIHVzZSB0aGlzLCBhbHdheXMgdXNlIERNQV9CTE9DSyguLi4pIGZvciBwcmltYXJ5IERNQSBvdXRwdXQuCiAgKi8KLSNkZWZpbmUgRE1BX1dSSVRFKCBvZmZzZXQsIHZhbCApCQkJCQlcCisjZGVmaW5lIERNQV9XUklURShvZmZzZXQsIHZhbCkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCWlmICggTUdBX1ZFUkJPU0UgKSB7CQkJCQkJXAotCQlEUk1fSU5GTyggIiAgIERNQV9XUklURSggMHglMDh4ICkgYXQgMHglMDRaeFxuIiwJXAotCQkJICAodTMyKSh2YWwpLCB3cml0ZSArIChvZmZzZXQpICogc2l6ZW9mKHUzMikgKTsJXAotCX0JCQkJCQkJCVwKKwlpZiAoTUdBX1ZFUkJPU0UpCQkJCQkJXAorCQlEUk1fSU5GTygiICAgRE1BX1dSSVRFKCAweCUwOHggKSBhdCAweCUwNFp4XG4iLAkJXAorCQkJICh1MzIpKHZhbCksIHdyaXRlICsgKG9mZnNldCkgKiBzaXplb2YodTMyKSk7CVwKIAkqKHZvbGF0aWxlIHUzMiAqKShwcmltICsgd3JpdGUgKyAob2Zmc2V0KSAqIHNpemVvZih1MzIpKSA9IHZhbDsJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBETUFfQkxPQ0soIHJlZzAsIHZhbDAsIHJlZzEsIHZhbDEsIHJlZzIsIHZhbDIsIHJlZzMsIHZhbDMgKQlcCisjZGVmaW5lIERNQV9CTE9DSyhyZWcwLCB2YWwwLCByZWcxLCB2YWwxLCByZWcyLCB2YWwyLCByZWczLCB2YWwzKQlcCiBkbyB7CQkJCQkJCQkJXAotCURNQV9XUklURSggMCwgKChETUFSRUcoIHJlZzAgKSA8PCAwKSB8CQkJCVwKLQkJICAgICAgIChETUFSRUcoIHJlZzEgKSA8PCA4KSB8CQkJCVwKLQkJICAgICAgIChETUFSRUcoIHJlZzIgKSA8PCAxNikgfAkJCQlcCi0JCSAgICAgICAoRE1BUkVHKCByZWczICkgPDwgMjQpKSApOwkJCVwKLQlETUFfV1JJVEUoIDEsIHZhbDAgKTsJCQkJCQlcCi0JRE1BX1dSSVRFKCAyLCB2YWwxICk7CQkJCQkJXAotCURNQV9XUklURSggMywgdmFsMiApOwkJCQkJCVwKLQlETUFfV1JJVEUoIDQsIHZhbDMgKTsJCQkJCQlcCisJRE1BX1dSSVRFKDAsICgoRE1BUkVHKHJlZzApIDw8IDApIHwJCQkJXAorCQkgICAgICAoRE1BUkVHKHJlZzEpIDw8IDgpIHwJCQkJXAorCQkgICAgICAoRE1BUkVHKHJlZzIpIDw8IDE2KSB8CQkJCVwKKwkJICAgICAgKERNQVJFRyhyZWczKSA8PCAyNCkpKTsJCQkJXAorCURNQV9XUklURSgxLCB2YWwwKTsJCQkJCQlcCisJRE1BX1dSSVRFKDIsIHZhbDEpOwkJCQkJCVwKKwlETUFfV1JJVEUoMywgdmFsMik7CQkJCQkJXAorCURNQV9XUklURSg0LCB2YWwzKTsJCQkJCQlcCiAJd3JpdGUgKz0gRE1BX0JMT0NLX1NJWkU7CQkJCQlcCiB9IHdoaWxlICgwKQogCiAvKiBCdWZmZXIgYWdpbmcgdmlhIHByaW1hcnkgRE1BIHN0cmVhbSBoZWFkIHBvaW50ZXIuCiAgKi8KIAotI2RlZmluZSBTRVRfQUdFKCBhZ2UsIGgsIHcgKQkJCQkJCVwKKyNkZWZpbmUgU0VUX0FHRShhZ2UsIGgsIHcpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAkoYWdlKS0+aGVhZCA9IGg7CQkJCQkJXAogCShhZ2UpLT53cmFwID0gdzsJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFRFU1RfQUdFKCBhZ2UsIGgsIHcgKQkJKCAoYWdlKS0+d3JhcCA8IHcgfHwJCVwKLQkJCQkJICAoIChhZ2UpLT53cmFwID09IHcgJiYJCVwKLQkJCQkJICAgIChhZ2UpLT5oZWFkIDwgaCApICkKKyNkZWZpbmUgVEVTVF9BR0UoYWdlLCBoLCB3KQkJKChhZ2UpLT53cmFwIDwgdyB8fAkJXAorCQkJCQkgKChhZ2UpLT53cmFwID09IHcgJiYJCVwKKwkJCQkJICAoYWdlKS0+aGVhZCA8IGgpKQogCi0jZGVmaW5lIEFHRV9CVUZGRVIoIGJ1Zl9wcml2ICkJCQkJCQlcCisjZGVmaW5lIEFHRV9CVUZGRVIoYnVmX3ByaXYpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5ID0gKGJ1Zl9wcml2KS0+bGlzdF9lbnRyeTsJCVwKLQlpZiAoIChidWZfcHJpdiktPmRpc3BhdGNoZWQgKSB7CQkJCQlcCisJaWYgKChidWZfcHJpdiktPmRpc3BhdGNoZWQpIHsJCQkJCVwKIAkJZW50cnktPmFnZS5oZWFkID0gKGRldl9wcml2LT5wcmltLnRhaWwgKwkJXAogCQkJCSAgIGRldl9wcml2LT5wcmltYXJ5LT5vZmZzZXQpOwkJXAogCQllbnRyeS0+YWdlLndyYXAgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF93cmFwOwlcCkBAIC02ODEsNyArNjc2LDcgQEAKIAogLyogU2ltcGxlIGlkbGUgdGVzdC4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IG1nYV9pc19pZGxlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbWdhX2lzX2lkbGUoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXUzMiBzdGF0dXMgPSBNR0FfUkVBRChNR0FfU1RBVFVTKSAmIE1HQV9FTkdJTkVfSURMRV9NQVNLOwogCXJldHVybiAoc3RhdHVzID09IE1HQV9FTkRQUkRNQVNUUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lycS5jCmluZGV4IGRhYTYwNDEuLjI1ODEyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2lycS5jCkBAIC03Niw5ICs3Niw4IEBACiAJCS8qIEluIGFkZGl0aW9uIHRvIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQtcGVuZGluZyBiaXQsIHdlCiAJCSAqIGhhdmUgdG8gd3JpdGUgdG8gTUdBX1BSSU1FTkQgdG8gcmUtc3RhcnQgdGhlIERNQSBvcGVyYXRpb24uCiAJCSAqLwotCQlpZiAoKHByaW1fc3RhcnQgJiB+MHgwMykgIT0gKHByaW1fZW5kICYgfjB4MDMpKSB7CisJCWlmICgocHJpbV9zdGFydCAmIH4weDAzKSAhPSAocHJpbV9lbmQgJiB+MHgwMykpCiAJCQlNR0FfV1JJVEUoTUdBX1BSSU1FTkQsIHByaW1fZW5kKTsKLQkJfQogCiAJCWF0b21pY19pbmMoJmRldl9wcml2LT5sYXN0X2ZlbmNlX3JldGlyZWQpOwogCQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+ZmVuY2VfcXVldWUpOwpAQCAtMTIwLDcgKzExOSw3IEBACiAJLyogTUdBX1dSSVRFKE1HQV9JRU4sIE1HQV9WTElORUlFTiB8IE1HQV9TT0ZUUkFQRU4pOyAqLwogfQogCi1pbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjdXJfZmVuY2U7CkBAIC0xMzksNyArMTM4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTYyLDcgKzE2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoIWRldl9wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3N0YXRlLmMKaW5kZXggYTUzYjg0OC4uZmZmODIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9zdGF0ZS5jCkBAIC00MSw4ICs0MSw4IEBACiAgKiBETUEgaGFyZHdhcmUgc3RhdGUgcHJvZ3JhbW1pbmcgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIHZvaWQgbWdhX2VtaXRfY2xpcF9yZWN0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3gpCitzdGF0aWMgdm9pZCBtZ2FfZW1pdF9jbGlwX3JlY3QoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3gpCiB7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CkBAIC02Niw3ICs2Niw3IEBACiAJQURWQU5DRV9ETUEoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzIwMF9lbWl0X2NvbnRleHQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2cyMDBfZW1pdF9jb250ZXh0KGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKQEAgLTg5LDcgKzg5LDcgQEAKIAlBRFZBTkNFX0RNQSgpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nNDAwX2VtaXRfY29udGV4dChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X2NvbnRleHQoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwpAQCAtMTE2LDcgKzExNiw3IEBACiAJQURWQU5DRV9ETUEoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzIwMF9lbWl0X3RleDAoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2cyMDBfZW1pdF90ZXgwKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzBdOwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJQURWQU5DRV9ETUEoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X3RleDAoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF90ZXgwKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzBdOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJQURWQU5DRV9ETUEoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzQwMF9lbWl0X3RleDEoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF90ZXgxKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzFdOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJQURWQU5DRV9ETUEoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBtZ2FfZzIwMF9lbWl0X3BpcGUoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2cyMDBfZW1pdF9waXBlKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgcGlwZSA9IHNhcmVhX3ByaXYtPndhcnBfcGlwZTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCUFEVkFOQ0VfRE1BKCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbWdhX2c0MDBfZW1pdF9waXBlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1nYV9nNDAwX2VtaXRfcGlwZShkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJdW5zaWduZWQgaW50IHBpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CkBAIC0zMjcsNyArMzI3LDcgQEAKIAlBRFZBTkNFX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZzIwMF9lbWl0X3N0YXRlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCBtZ2FfZzIwMF9lbWl0X3N0YXRlKGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKQEAgLTM0OCw3ICszNDgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbWdhX2c0MDBfZW1pdF9zdGF0ZShkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgbWdhX2c0MDBfZW1pdF9zdGF0ZShkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CkBAIC0zODEsNyArMzgxLDcgQEAKIAogLyogRGlzYWxsb3cgYWxsIHdyaXRlIGRlc3RpbmF0aW9ucyBleGNlcHQgdGhlIGZyb250IGFuZCBiYWNrYnVmZmVyLgogICovCi1zdGF0aWMgaW50IG1nYV92ZXJpZnlfY29udGV4dChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBtZ2FfdmVyaWZ5X2NvbnRleHQoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAKIC8qIERpc2FsbG93IHRleHR1cmUgcmVhZHMgZnJvbSBQQ0kgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgbWdhX3ZlcmlmeV90ZXgoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IHVuaXQpCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfdGV4KGRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHVuaXQpCiB7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVt1bml0XTsKQEAgLTQxNyw3ICs0MTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1nYV92ZXJpZnlfc3RhdGUoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBpbnQgbWdhX3ZlcmlmeV9zdGF0ZShkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJdW5zaWduZWQgaW50IGRpcnR5ID0gc2FyZWFfcHJpdi0+ZGlydHk7CkBAIC00NDYsNyArNDQ2LDcgQEAKIAlyZXR1cm4gKHJldCA9PSAwKTsKIH0KIAotc3RhdGljIGludCBtZ2FfdmVyaWZ5X2lsb2FkKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYsCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfaWxvYWQoZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJICAgIHVuc2lnbmVkIGludCBkc3RvcmcsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJaWYgKGRzdG9yZyA8IGRldl9wcml2LT50ZXh0dXJlX29mZnNldCB8fApAQCAtNDY1LDcgKzQ2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWdhX3ZlcmlmeV9ibGl0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYsCitzdGF0aWMgaW50IG1nYV92ZXJpZnlfYmxpdChkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCQkgICB1bnNpZ25lZCBpbnQgc3Jjb3JnLCB1bnNpZ25lZCBpbnQgZHN0b3JnKQogewogCWlmICgoc3Jjb3JnICYgMHgzKSA9PSAoTUdBX1NSQ0FDQ19QQ0kgfCBNR0FfU1JDTUFQX1NZU01FTSkgfHwKQEAgLTQ4MCw3ICs0ODAsNyBAQAogICoKICAqLwogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX2NsZWFyX3QgKiBjbGVhcikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX21nYV9jbGVhcl90ICpjbGVhcikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJRkxVU0hfRE1BKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CkBAIC02MjIsNyArNjIyLDcgQEAKIAlEUk1fREVCVUcoIi4uLiBkb25lLlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICpidWYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTY2OSw3ICs2NjksNyBAQAogCUZMVVNIX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmLAorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICpidWYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTcxOCw3ICs3MTgsNyBAQAogLyogVGhpcyBjb3BpZXMgYSA2NCBieXRlIGFsaWduZWQgYWdwIHJlZ2lvbiB0byB0aGUgZnJhbWJ1ZmZlciB3aXRoIGEKICAqIHN0YW5kYXJkIGJsaXQsIHRoZSBpb2N0bCBuZWVkcyB0byBkbyBjaGVja2luZy4KICAqLwotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYsCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICpidWYsCiAJCQkJICAgdW5zaWduZWQgaW50IGRzdG9yZywgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzY2LDcgKzc2Niw3IEBACiAJRkxVU0hfRE1BKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21nYV9ibGl0X3QgKiBibGl0KQorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9ibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9tZ2FfYmxpdF90ICpibGl0KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CkBAIC04MDEsOSArODAxLDggQEAKIAkJaW50IHcgPSBwYm94W2ldLngyIC0gcGJveFtpXS54MSAtIDE7CiAJCWludCBzdGFydDsKIAotCQlpZiAoYmxpdC0+eWRpciA9PSAtMSkgeworCQlpZiAoYmxpdC0+eWRpciA9PSAtMSkKIAkJCXNyY3kgPSBibGl0LT5oZWlnaHQgLSBzcmN5IC0gMTsKLQkJfQogCiAJCXN0YXJ0ID0gc3JjeSAqIGJsaXQtPnNyY19waXRjaCArIHNyY3g7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3dhcnAuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3dhcnAuYwppbmRleCA5YWFkNDg0Li5mMTcyYmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV93YXJwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffd2FycC5jCkBAIC00Niw3ICs0Niw3IEBACiAKICNkZWZpbmUgV0FSUF9VQ09ERV9TSVpFKHNpemUpCQlBTElHTihzaXplLCBNR0FfV0FSUF9DT0RFX0FMSUdOKQogCi1pbnQgbWdhX3dhcnBfaW5zdGFsbF9taWNyb2NvZGUoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK2ludCBtZ2Ffd2FycF9pbnN0YWxsX21pY3JvY29kZShkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdW5zaWduZWQgY2hhciAqdmNiYXNlID0gZGV2X3ByaXYtPndhcnAtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHBjYmFzZSA9IGRldl9wcml2LT53YXJwLT5vZmZzZXQ7CkBAIC0xMzMsNyArMTMzLDcgQEAKIAogI2RlZmluZSBXTUlTQ19FWFBFQ1RFRAkJKE1HQV9XVUNPREVDQUNIRV9FTkFCTEUgfCBNR0FfV01BU1RFUl9FTkFCTEUpCiAKLWludCBtZ2Ffd2FycF9pbml0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitpbnQgbWdhX3dhcnBfaW5pdChkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdTMyIHdtaXNjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZwppbmRleCAxMTc1NDI5Li5kMmQyODA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgRFJNX05PVVZFQVUKIAl0cmlzdGF0ZSAiTm91dmVhdSAoblZpZGlhKSBjYXJkcyIKLQlkZXBlbmRzIG9uIERSTQorCWRlcGVuZHMgb24gRFJNICYmIFBDSQogICAgICAgICBzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IERSTV9LTVNfSEVMUEVSCiAJc2VsZWN0IERSTV9UVE0KQEAgLTQxLDQgKzQxLDEzIEBACiAKIAkgIFRoaXMgZHJpdmVyIGlzIGN1cnJlbnRseSBvbmx5IHVzZWZ1bCBpZiB5b3UncmUgYWxzbyB1c2luZwogCSAgdGhlIG5vdXZlYXUgZHJpdmVyLgorCitjb25maWcgRFJNX0kyQ19TSUwxNjQKKwl0cmlzdGF0ZSAiU2lsaWNvbiBJbWFnZSBzaWwxNjQgVE1EUyB0cmFuc21pdHRlciIKKwlkZWZhdWx0IG0gaWYgRFJNX05PVVZFQVUKKwloZWxwCisJICBTdXBwb3J0IGZvciBzaWwxNjQgYW5kIHNpbWlsYXIgc2luZ2xlLWxpbmsgKG9yIGR1YWwtbGluaworCSAgd2hlbiB1c2VkIGluIHBhaXJzKSBUTURTIHRyYW5zbWl0dGVycywgdXNlZCBpbiBzb21lIG5WaWRpYQorCSAgdmlkZW8gY2FyZHMuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKaW5kZXggYWNkMzFlZC4uMjQwNWQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKQEAgLTksMTAgKzksMTAgQEAKICAgICAgICAgICAgICBub3V2ZWF1X2JvLm8gbm91dmVhdV9mZW5jZS5vIG5vdXZlYXVfZ2VtLm8gbm91dmVhdV90dG0ubyBcCiAgICAgICAgICAgICAgbm91dmVhdV9ody5vIG5vdXZlYXVfY2FsYy5vIG5vdXZlYXVfYmlvcy5vIG5vdXZlYXVfaTJjLm8gXAogICAgICAgICAgICAgIG5vdXZlYXVfZGlzcGxheS5vIG5vdXZlYXVfY29ubmVjdG9yLm8gbm91dmVhdV9mYmNvbi5vIFwKLSAgICAgICAgICAgICBub3V2ZWF1X2RwLm8gbm91dmVhdV9ncmN0eC5vIFwKKyAgICAgICAgICAgICBub3V2ZWF1X2RwLm8gXAogICAgICAgICAgICAgIG52MDRfdGltZXIubyBcCiAgICAgICAgICAgICAgbnYwNF9tYy5vIG52NDBfbWMubyBudjUwX21jLm8gXAotICAgICAgICAgICAgIG52MDRfZmIubyBudjEwX2ZiLm8gbnY0MF9mYi5vIG52NTBfZmIubyBcCisgICAgICAgICAgICAgbnYwNF9mYi5vIG52MTBfZmIubyBudjMwX2ZiLm8gbnY0MF9mYi5vIG52NTBfZmIubyBcCiAgICAgICAgICAgICAgbnYwNF9maWZvLm8gbnYxMF9maWZvLm8gbnY0MF9maWZvLm8gbnY1MF9maWZvLm8gXAogICAgICAgICAgICAgIG52MDRfZ3JhcGgubyBudjEwX2dyYXBoLm8gbnYyMF9ncmFwaC5vIFwKICAgICAgICAgICAgICBudjQwX2dyYXBoLm8gbnY1MF9ncmFwaC5vIFwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICAgICAgICAgICBudjUwX2N1cnNvci5vIG52NTBfZGlzcGxheS5vIG52NTBfZmJjb24ubyBcCiAgICAgICAgICAgICAgbnYwNF9kYWMubyBudjA0X2RmcC5vIG52MDRfdHYubyBudjE3X3R2Lm8gbnYxN190dl9tb2Rlcy5vIFwKICAgICAgICAgICAgICBudjA0X2NydGMubyBudjA0X2Rpc3BsYXkubyBudjA0X2N1cnNvci5vIG52MDRfZmJjb24ubyBcCi0gICAgICAgICAgICAgbnYxN19ncGlvLm8gbnY1MF9ncGlvLm8gXAorICAgICAgICAgICAgIG52MTBfZ3Bpby5vIG52NTBfZ3Bpby5vIFwKIAkgICAgIG52NTBfY2FsYy5vCiAKIG5vdXZlYXUtJChDT05GSUdfRFJNX05PVVZFQVVfREVCVUcpICs9IG5vdXZlYXVfZGVidWdmcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCmluZGV4IGQ0YmNjYTguLmMxN2EwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxhY3BpL3ZpZGVvLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCkBAIC0xMSw2ICsxMiw3IEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCiAKICNpbmNsdWRlIDxsaW51eC92Z2Ffc3dpdGNoZXJvby5oPgogCkBAIC00Miw3ICs0NCw3IEBACiAJMHhCMywgMHg0RCwgMHg3RSwgMHg1RiwgMHhFQSwgMHgxMiwgMHg5RiwgMHhENCwKIH07CiAKLXN0YXRpYyBpbnQgbm91dmVhdV9kc20oYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgZnVuYywgaW50IGFyZywgaW50ICpyZXN1bHQpCitzdGF0aWMgaW50IG5vdXZlYXVfZHNtKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGZ1bmMsIGludCBhcmcsIHVpbnQzMl90ICpyZXN1bHQpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBpbnB1dDsKQEAgLTI1OSwzICsyNjEsMzcgQEAKIHsKIAlyZXR1cm4gbm91dmVhdV9yb21fY2FsbChub3V2ZWF1X2RzbV9wcml2LnJvbV9oYW5kbGUsIGJpb3MsIG9mZnNldCwgbGVuKTsKIH0KKworaW50Citub3V2ZWF1X2FjcGlfZWRpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlkZXY7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWludCB0eXBlLCByZXQ7CisJdm9pZCAqZWRpZDsKKworCXN3aXRjaCAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSkgeworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0xWRFM6CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfZURQOgorCQl0eXBlID0gQUNQSV9WSURFT19ESVNQTEFZX0xDRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKCZkZXYtPnBkZXYtPmRldik7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZhY3BpZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGFjcGlfdmlkZW9fZ2V0X2VkaWQoYWNwaWRldiwgdHlwZSwgLTEsICZlZGlkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW52X2Nvbm5lY3Rvci0+ZWRpZCA9IGVkaWQ7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jCmluZGV4IGU0OTI5MTlmLi43MzY5YjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKICNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKIAorI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4KKwogLyogdGhlc2UgZGVmaW5lcyBhcmUgbWFkZSB1cCAqLwogI2RlZmluZSBOVl9DSU9fQ1JFXzQ0X0hFQURBIDB4MAogI2RlZmluZSBOVl9DSU9fQ1JFXzQ0X0hFQURCIDB4MwpAQCAtMjA5LDIwICsyMTEsMjAgQEAKIAl7ICJQQ0lST00iLCBsb2FkX3ZiaW9zX3BjaSwgdHJ1ZSB9LAogCXsgIkFDUEkiLCBsb2FkX3ZiaW9zX2FjcGksIHRydWUgfSwKIH07CisjZGVmaW5lIE5VTV9TSEFET1dfTUVUSE9EUyBBUlJBWV9TSVpFKHNoYWRvd19tZXRob2RzKQogCiBzdGF0aWMgYm9vbCBOVlNoYWRvd1ZCSU9TKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgKmRhdGEpCiB7Ci0JY29uc3QgaW50IG5yX21ldGhvZHMgPSBBUlJBWV9TSVpFKHNoYWRvd19tZXRob2RzKTsKIAlzdHJ1Y3QgbWV0aG9kcyAqbWV0aG9kcyA9IHNoYWRvd19tZXRob2RzOwogCWludCB0ZXN0c2NvcmUgPSAzOwotCWludCBzY29yZXNbbnJfbWV0aG9kc10sIGk7CisJaW50IHNjb3Jlc1tOVU1fU0hBRE9XX01FVEhPRFNdLCBpOwogCiAJaWYgKG5vdXZlYXVfdmJpb3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5yX21ldGhvZHM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9TSEFET1dfTUVUSE9EUzsgaSsrKQogCQkJaWYgKCFzdHJjYXNlY21wKG5vdXZlYXVfdmJpb3MsIG1ldGhvZHNbaV0uZGVzYykpCiAJCQkJYnJlYWs7CiAKLQkJaWYgKGkgPCBucl9tZXRob2RzKSB7CisJCWlmIChpIDwgTlVNX1NIQURPV19NRVRIT0RTKSB7CiAJCQlOVl9JTkZPKGRldiwgIkF0dGVtcHRpbmcgdG8gdXNlIEJJT1MgaW1hZ2UgZnJvbSAlc1xuIiwKIAkJCQltZXRob2RzW2ldLmRlc2MpOwogCkBAIC0yMzQsNyArMjM2LDcgQEAKIAkJTlZfRVJST1IoZGV2LCAiVkJJT1Mgc291cmNlIFwnJXNcJyBpbnZhbGlkXG4iLCBub3V2ZWF1X3ZiaW9zKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfbWV0aG9kczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE5VTV9TSEFET1dfTUVUSE9EUzsgaSsrKSB7CiAJCU5WX1RSQUNFKGRldiwgIkF0dGVtcHRpbmcgdG8gbG9hZCBCSU9TIGltYWdlIGZyb20gJXNcbiIsCiAJCQkgbWV0aG9kc1tpXS5kZXNjKTsKIAkJZGF0YVswXSA9IGRhdGFbMV0gPSAwOwkvKiBhdm9pZCByZXVzZSBvZiBwcmV2aW91cyBpbWFnZSAqLwpAQCAtMjQ1LDcgKzI0Nyw3IEBACiAJfQogCiAJd2hpbGUgKC0tdGVzdHNjb3JlID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbnJfbWV0aG9kczsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fU0hBRE9XX01FVEhPRFM7IGkrKykgewogCQkJaWYgKHNjb3Jlc1tpXSA9PSB0ZXN0c2NvcmUpIHsKIAkJCQlOVl9UUkFDRShkZXYsICJVc2luZyBCSU9TIGltYWdlIGZyb20gJXNcbiIsCiAJCQkJCSBtZXRob2RzW2ldLmRlc2MpOwpAQCAtOTIwLDcgKzkyMiw3IEBACiAJCU5WX0VSUk9SKGJpb3MtPmRldiwKIAkJCSAiMHglMDRYOiBDb25maWcgMHglMDJYIGV4Y2VlZHMgbWF4aW1hbCBib3VuZCAweCUwMlhcbiIsCiAJCQkgb2Zmc2V0LCBjb25maWcsIGNvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBsZW47CiAJfQogCiAJY29uZmlndmFsID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMSArIGNvbmZpZyAqIDRdKTsKQEAgLTEwMjIsNyArMTAyNCw3IEBACiAJCU5WX0VSUk9SKGJpb3MtPmRldiwKIAkJCSAiMHglMDRYOiBDb25maWcgMHglMDJYIGV4Y2VlZHMgbWF4aW1hbCBib3VuZCAweCUwMlhcbiIsCiAJCQkgb2Zmc2V0LCBjb25maWcsIGNvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBsZW47CiAJfQogCiAJZnJlcSA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTIgKyBjb25maWcgKiAyXSk7CkBAIC0xMTk0LDcgKzExOTYsNyBAQAogCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIGRjYiwgJmR1bW15KTsKIAlpZiAoIWRwZSkgewogCQlOVl9FUlJPUihkZXYsICIweCUwNFg6IElOSVRfM0E6IG5vIGVuY29kZXIgdGFibGUhIVxuIiwgb2Zmc2V0KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAzOwogCX0KIAogCXN3aXRjaCAoY29uZCkgewpAQCAtMTIxOCwxMiArMTIyMCwxNiBAQAogCQlpbnQgcmV0OwogCiAJCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIGJpb3MtPmRpc3BsYXkub3V0cHV0LT5pMmNfaW5kZXgpOwotCQlpZiAoIWF1eGNoKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICghYXV4Y2gpIHsKKwkJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogY291bGRuJ3QgZ2V0IGF1eGNoXG4iLCBvZmZzZXQpOworCQkJcmV0dXJuIDM7CisJCX0KIAogCQlyZXQgPSBub3V2ZWF1X2RwX2F1eGNoKGF1eGNoLCA5LCAweGQsICZjb25kLCAxKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogYXV4Y2ggcmQgZmFpbDogJWRcbiIsIG9mZnNldCwgcmV0KTsKKwkJCXJldHVybiAzOworCQl9CiAKIAkJaWYgKGNvbmQgJiAxKQogCQkJaWV4ZWMtPmV4ZWN1dGUgPSBmYWxzZTsKQEAgLTEzOTIsNyArMTM5OCw3IEBACiAJCU5WX0VSUk9SKGJpb3MtPmRldiwKIAkJCSAiMHglMDRYOiBDb25maWcgMHglMDJYIGV4Y2VlZHMgbWF4aW1hbCBib3VuZCAweCUwMlhcbiIsCiAJCQkgb2Zmc2V0LCBjb25maWcsIGNvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBsZW47CiAJfQogCiAJZnJlcSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTEgKyBjb25maWcgKiA0XSk7CkBAIC0xNDUyLDYgKzE0NTgsNyBAQAogCSAqICJtYXNrIG4iIGFuZCBPUiBpdCB3aXRoICJkYXRhIG4iIGJlZm9yZSB3cml0aW5nIGl0IGJhY2sgdG8gdGhlIGRldmljZQogCSAqLwogCisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKIAl1aW50OF90IGkyY19pbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CiAJdWludDhfdCBpMmNfYWRkcmVzcyA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl0gPj4gMTsKIAl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKQEAgLTE0NjYsOSArMTQ3MywxMSBAQAogCQkgICAgICAiQ291bnQ6IDB4JTAyWFxuIiwKIAkJb2Zmc2V0LCBpMmNfaW5kZXgsIGkyY19hZGRyZXNzLCBjb3VudCk7CiAKLQljaGFuID0gaW5pdF9pMmNfZGV2aWNlX2ZpbmQoYmlvcy0+ZGV2LCBpMmNfaW5kZXgpOwotCWlmICghY2hhbikKLQkJcmV0dXJuIC1FTk9ERVY7CisJY2hhbiA9IGluaXRfaTJjX2RldmljZV9maW5kKGRldiwgaTJjX2luZGV4KTsKKwlpZiAoIWNoYW4pIHsKKwkJTlZfRVJST1IoZGV2LCAiMHglMDRYOiBpMmMgYnVzIG5vdCBmb3VuZFxuIiwgb2Zmc2V0KTsKKwkJcmV0dXJuIGxlbjsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQl1aW50OF90IHJlZyA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNCArIGkgKiAzXTsKQEAgLTE0NzksOCArMTQ4OCwxMCBAQAogCQlyZXQgPSBpMmNfc21idXNfeGZlcigmY2hhbi0+YWRhcHRlciwgaTJjX2FkZHJlc3MsIDAsCiAJCQkJICAgICBJMkNfU01CVVNfUkVBRCwgcmVnLAogCQkJCSAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IDApIHsKKwkJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogaTJjIHJkIGZhaWw6ICVkXG4iLCBvZmZzZXQsIHJldCk7CisJCQlyZXR1cm4gbGVuOworCQl9CiAKIAkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBJMkNSZWc6IDB4JTAyWCwgVmFsdWU6IDB4JTAyWCwgIgogCQkJICAgICAgIk1hc2s6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLApAQCAtMTQ5NCw4ICsxNTA1LDEwIEBACiAJCXJldCA9IGkyY19zbWJ1c194ZmVyKCZjaGFuLT5hZGFwdGVyLCBpMmNfYWRkcmVzcywgMCwKIAkJCQkgICAgIEkyQ19TTUJVU19XUklURSwgcmVnLAogCQkJCSAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IDApIHsKKwkJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogaTJjIHdyIGZhaWw6ICVkXG4iLCBvZmZzZXQsIHJldCk7CisJCQlyZXR1cm4gbGVuOworCQl9CiAJfQogCiAJcmV0dXJuIGxlbjsKQEAgLTE1MjAsNiArMTUzMyw3IEBACiAJICogIkRDQiBJMkMgdGFibGUgZW50cnkgaW5kZXgiLCBzZXQgdGhlIHJlZ2lzdGVyIHRvICJkYXRhIG4iCiAJICovCiAKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OwogCXVpbnQ4X3QgaTJjX2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKIAl1aW50OF90IGkyY19hZGRyZXNzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXSA+PiAxOwogCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOwpAQCAtMTUzNCw5ICsxNTQ4LDExIEBACiAJCSAgICAgICJDb3VudDogMHglMDJYXG4iLAogCQlvZmZzZXQsIGkyY19pbmRleCwgaTJjX2FkZHJlc3MsIGNvdW50KTsKIAotCWNoYW4gPSBpbml0X2kyY19kZXZpY2VfZmluZChiaW9zLT5kZXYsIGkyY19pbmRleCk7Ci0JaWYgKCFjaGFuKQotCQlyZXR1cm4gLUVOT0RFVjsKKwljaGFuID0gaW5pdF9pMmNfZGV2aWNlX2ZpbmQoZGV2LCBpMmNfaW5kZXgpOworCWlmICghY2hhbikgeworCQlOVl9FUlJPUihkZXYsICIweCUwNFg6IGkyYyBidXMgbm90IGZvdW5kXG4iLCBvZmZzZXQpOworCQlyZXR1cm4gbGVuOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXVpbnQ4X3QgcmVnID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0ICsgaSAqIDJdOwpAQCAtMTU1Myw4ICsxNTY5LDEwIEBACiAJCXJldCA9IGkyY19zbWJ1c194ZmVyKCZjaGFuLT5hZGFwdGVyLCBpMmNfYWRkcmVzcywgMCwKIAkJCQkgICAgIEkyQ19TTUJVU19XUklURSwgcmVnLAogCQkJCSAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IDApIHsKKwkJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogaTJjIHdyIGZhaWw6ICVkXG4iLCBvZmZzZXQsIHJldCk7CisJCQlyZXR1cm4gbGVuOworCQl9CiAJfQogCiAJcmV0dXJuIGxlbjsKQEAgLTE1NzcsNiArMTU5NSw3IEBACiAJICogYWRkcmVzcyIgb24gdGhlIEkyQyBidXMgZ2l2ZW4gYnkgIkRDQiBJMkMgdGFibGUgZW50cnkgaW5kZXgiCiAJICovCiAKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OwogCXVpbnQ4X3QgaTJjX2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKIAl1aW50OF90IGkyY19hZGRyZXNzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXSA+PiAxOwogCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOwpAQCAtMTU4NCw3ICsxNjAzLDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqY2hhbjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2c7CiAJdWludDhfdCBkYXRhWzI1Nl07Ci0JaW50IGk7CisJaW50IHJldCwgaTsKIAogCWlmICghaWV4ZWMtPmV4ZWN1dGUpCiAJCXJldHVybiBsZW47CkBAIC0xNTkzLDkgKzE2MTIsMTEgQEAKIAkJICAgICAgIkNvdW50OiAweCUwMlhcbiIsCiAJCW9mZnNldCwgaTJjX2luZGV4LCBpMmNfYWRkcmVzcywgY291bnQpOwogCi0JY2hhbiA9IGluaXRfaTJjX2RldmljZV9maW5kKGJpb3MtPmRldiwgaTJjX2luZGV4KTsKLQlpZiAoIWNoYW4pCi0JCXJldHVybiAtRU5PREVWOworCWNoYW4gPSBpbml0X2kyY19kZXZpY2VfZmluZChkZXYsIGkyY19pbmRleCk7CisJaWYgKCFjaGFuKSB7CisJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogaTJjIGJ1cyBub3QgZm91bmRcbiIsIG9mZnNldCk7CisJCXJldHVybiBsZW47CisJfQogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJZGF0YVtpXSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNCArIGldOwpAQCAtMTYwOCw4ICsxNjI5LDExIEBACiAJCW1zZy5mbGFncyA9IDA7CiAJCW1zZy5sZW4gPSBjb3VudDsKIAkJbXNnLmJ1ZiA9IGRhdGE7Ci0JCWlmIChpMmNfdHJhbnNmZXIoJmNoYW4tPmFkYXB0ZXIsICZtc2csIDEpICE9IDEpCi0JCQlyZXR1cm4gLUVJTzsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKCZjaGFuLT5hZGFwdGVyLCAmbXNnLCAxKTsKKwkJaWYgKHJldCAhPSAxKSB7CisJCQlOVl9FUlJPUihkZXYsICIweCUwNFg6IGkyYyB3ciBmYWlsOiAlZFxuIiwgb2Zmc2V0LCByZXQpOworCQkJcmV0dXJuIGxlbjsKKwkJfQogCX0KIAogCXJldHVybiBsZW47CkBAIC0xNjMzLDYgKzE2NTcsNyBAQAogCSAqIHVzZWQgLS0gc2VlIGdldF90bWRzX2luZGV4X3JlZygpCiAJICovCiAKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OwogCXVpbnQ4X3QgbWx2ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKIAl1aW50MzJfdCB0bWRzYWRkciA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl07CiAJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKQEAgLTE2NDcsOCArMTY3MiwxMCBAQAogCQlvZmZzZXQsIG1sdiwgdG1kc2FkZHIsIG1hc2ssIGRhdGEpOwogCiAJcmVnID0gZ2V0X3RtZHNfaW5kZXhfcmVnKGJpb3MtPmRldiwgbWx2KTsKLQlpZiAoIXJlZykKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFyZWcpIHsKKwkJTlZfRVJST1IoZGV2LCAiMHglMDRYOiBubyB0bWRzX2luZGV4X3JlZ1xuIiwgb2Zmc2V0KTsKKwkJcmV0dXJuIDU7CisJfQogCiAJYmlvc193cjMyKGJpb3MsIHJlZywKIAkJICB0bWRzYWRkciB8IE5WX1BSQU1EQUNfRlBfVE1EU19DT05UUk9MX1dSSVRFX0RJU0FCTEUpOwpAQCAtMTY3OCw2ICsxNzA1LDcgQEAKIAkgKiByZWdpc3RlciBpcyB1c2VkIC0tIHNlZSBnZXRfdG1kc19pbmRleF9yZWcoKQogCSAqLwogCisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKIAl1aW50OF90IG1sdiA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CiAJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl07CiAJaW50IGxlbiA9IDMgKyBjb3VudCAqIDI7CkBAIC0xNjkxLDggKzE3MTksMTAgQEAKIAkJb2Zmc2V0LCBtbHYsIGNvdW50KTsKIAogCXJlZyA9IGdldF90bWRzX2luZGV4X3JlZyhiaW9zLT5kZXYsIG1sdik7Ci0JaWYgKCFyZWcpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghcmVnKSB7CisJCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogbm8gdG1kc19pbmRleF9yZWdcbiIsIG9mZnNldCk7CisJCXJldHVybiBsZW47CisJfQogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJdWludDhfdCB0bWRzYWRkciA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMyArIGkgKiAyXTsKQEAgLTIwMzksNiArMjA2OSwzMjMgQEAKIAlyZXR1cm4gNTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCitiaW9zX21kMzIoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDMyX3QgcmVnLAorCSAgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQoreworCWJpb3Nfd3IzMihiaW9zLCByZWcsIChiaW9zX3JkMzIoYmlvcywgcmVnKSAmIH5tYXNrKSB8IHZhbCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdAorcGVla19mYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fbWFwcGluZyAqZmIsCisJdWludDMyX3Qgb2ZmKQoreworCXVpbnQzMl90IHZhbCA9IDA7CisKKwlpZiAob2ZmIDwgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpKSB7CisJCXVpbnQzMl90IF9faW9tZW0gKnAgPSBpb19tYXBwaW5nX21hcF9hdG9taWNfd2MoZmIsIG9mZiwgS01fVVNFUjApOworCisJCXZhbCA9IGlvcmVhZDMyKHApOworCisJCWlvX21hcHBpbmdfdW5tYXBfYXRvbWljKHAsIEtNX1VTRVIwKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAorcG9rZV9mYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW9fbWFwcGluZyAqZmIsCisJdWludDMyX3Qgb2ZmLCB1aW50MzJfdCB2YWwpCit7CisJaWYgKG9mZiA8IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSkgeworCQl1aW50MzJfdCBfX2lvbWVtICpwID0gaW9fbWFwcGluZ19tYXBfYXRvbWljX3djKGZiLCBvZmYsIEtNX1VTRVIwKTsKKworCQlpb3dyaXRlMzIodmFsLCBwKTsKKwkJd21iKCk7CisKKwkJaW9fbWFwcGluZ191bm1hcF9hdG9taWMocCwgS01fVVNFUjApOworCX0KK30KKworc3RhdGljIGlubGluZSBib29sCityZWFkX2JhY2tfZmIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGlvX21hcHBpbmcgKmZiLAorCSAgICAgdWludDMyX3Qgb2ZmLCB1aW50MzJfdCB2YWwpCit7CisJcG9rZV9mYihkZXYsIGZiLCBvZmYsIHZhbCk7CisJcmV0dXJuIHZhbCA9PSBwZWVrX2ZiKGRldiwgZmIsIG9mZik7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfaW5pdF9jb21wdXRlX21lbShzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJdWludDMyX3QgcGF0dCA9IDB4ZGVhZGJlZWY7CisJc3RydWN0IGlvX21hcHBpbmcgKmZiOworCWludCBpOworCisJLyogTWFwIHRoZSBmcmFtZWJ1ZmZlciBhcGVydHVyZSAqLworCWZiID0gaW9fbWFwcGluZ19jcmVhdGVfd2MocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSksCisJCQkJICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkpOworCWlmICghZmIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU2VxdWVuY2VyIGFuZCByZWZyZXNoIG9mZiAqLworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCAxLCBOVlJlYWRWZ2FTZXEoZGV2LCAwLCAxKSB8IDB4MjApOworCWJpb3NfbWQzMihiaW9zLCBOVjA0X1BGQl9ERUJVR18wLCAwLCBOVjA0X1BGQl9ERUJVR18wX1JFRlJFU0hfT0ZGKTsKKworCWJpb3NfbWQzMihiaW9zLCBOVjA0X1BGQl9CT09UXzAsIH4wLAorCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzE2TUIgfAorCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fV0lEVEhfMTI4IHwKKwkJICBOVjA0X1BGQl9CT09UXzBfUkFNX1RZUEVfU0dSQU1fMTZNQklUKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXBva2VfZmIoZGV2LCBmYiwgNCAqIGksIHBhdHQpOworCisJcG9rZV9mYihkZXYsIGZiLCAweDQwMDAwMCwgcGF0dCArIDEpOworCisJaWYgKHBlZWtfZmIoZGV2LCBmYiwgMCkgPT0gcGF0dCArIDEpIHsKKwkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwgTlYwNF9QRkJfQk9PVF8wX1JBTV9UWVBFLAorCQkJICBOVjA0X1BGQl9CT09UXzBfUkFNX1RZUEVfU0RSQU1fMTZNQklUKTsKKwkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0RFQlVHXzAsCisJCQkgIE5WMDRfUEZCX0RFQlVHXzBfUkVGUkVTSF9PRkYsIDApOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlwb2tlX2ZiKGRldiwgZmIsIDQgKiBpLCBwYXR0KTsKKworCQlpZiAoKHBlZWtfZmIoZGV2LCBmYiwgMHhjKSAmIDB4ZmZmZikgIT0gKHBhdHQgJiAweGZmZmYpKQorCQkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwKKwkJCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fV0lEVEhfMTI4IHwKKwkJCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5ULAorCQkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfOE1CKTsKKworCX0gZWxzZSBpZiAoKHBlZWtfZmIoZGV2LCBmYiwgMHhjKSAmIDB4ZmZmZjAwMDApICE9CisJCSAgIChwYXR0ICYgMHhmZmZmMDAwMCkpIHsKKwkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwKKwkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9XSURUSF8xMjggfAorCQkJICBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVCwKKwkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfNE1CKTsKKworCX0gZWxzZSBpZiAocGVla19mYihkZXYsIGZiLCAwKSA9PSBwYXR0KSB7CisJCWlmIChyZWFkX2JhY2tfZmIoZGV2LCBmYiwgMHg4MDAwMDAsIHBhdHQpKQorCQkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwKKwkJCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5ULAorCQkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfOE1CKTsKKwkJZWxzZQorCQkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwKKwkJCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5ULAorCQkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfNE1CKTsKKworCQliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQk9PVF8wLCBOVjA0X1BGQl9CT09UXzBfUkFNX1RZUEUsCisJCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fVFlQRV9TR1JBTV84TUJJVCk7CisKKwl9IGVsc2UgaWYgKCFyZWFkX2JhY2tfZmIoZGV2LCBmYiwgMHg4MDAwMDAsIHBhdHQpKSB7CisJCWJpb3NfbWQzMihiaW9zLCBOVjA0X1BGQl9CT09UXzAsIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5ULAorCQkJICBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVF84TUIpOworCisJfQorCisJLyogUmVmcmVzaCBvbiwgc2VxdWVuY2VyIG9uICovCisJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0RFQlVHXzAsIE5WMDRfUEZCX0RFQlVHXzBfUkVGUkVTSF9PRkYsIDApOworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCAxLCBOVlJlYWRWZ2FTZXEoZGV2LCAwLCAxKSAmIH4weDIwKTsKKworCWlvX21hcHBpbmdfZnJlZShmYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICoKK252MDVfbWVtb3J5X2NvbmZpZyhzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCS8qIERlZmF1bHRzIGZvciBCSU9TZXMgbGFja2luZyBhIG1lbW9yeSBjb25maWcgdGFibGUgKi8KKwlzdGF0aWMgY29uc3QgdWludDhfdCBkZWZhdWx0X2NvbmZpZ190YWJbXVsyXSA9IHsKKwkJeyAweDI0LCAweDAwIH0sCisJCXsgMHgyOCwgMHgwMCB9LAorCQl7IDB4MjQsIDB4MDEgfSwKKwkJeyAweDFmLCAweDAwIH0sCisJCXsgMHgwZiwgMHgwMCB9LAorCQl7IDB4MTcsIDB4MDAgfSwKKwkJeyAweDA2LCAweDAwIH0sCisJCXsgMHgwMCwgMHgwMCB9CisJfTsKKwlpbnQgaSA9IChiaW9zX3JkMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzApICYKKwkJIE5WX1BFWFRERVZfQk9PVF8wX1JBTUNGRykgPj4gMjsKKworCWlmIChiaW9zLT5sZWdhY3kubWVtX2luaXRfdGJsX3B0cikKKwkJcmV0dXJuICZiaW9zLT5kYXRhW2Jpb3MtPmxlZ2FjeS5tZW1faW5pdF90YmxfcHRyICsgMiAqIGldOworCWVsc2UKKwkJcmV0dXJuIGRlZmF1bHRfY29uZmlnX3RhYltpXTsKK30KKworc3RhdGljIGludAorbnYwNV9pbml0X2NvbXB1dGVfbWVtKHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKwljb25zdCB1aW50OF90ICpyYW1jZmcgPSBudjA1X21lbW9yeV9jb25maWcoYmlvcyk7CisJdWludDMyX3QgcGF0dCA9IDB4ZGVhZGJlZWY7CisJc3RydWN0IGlvX21hcHBpbmcgKmZiOworCWludCBpLCB2OworCisJLyogTWFwIHRoZSBmcmFtZWJ1ZmZlciBhcGVydHVyZSAqLworCWZiID0gaW9fbWFwcGluZ19jcmVhdGVfd2MocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSksCisJCQkJICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkpOworCWlmICghZmIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU2VxdWVuY2VyIG9mZiAqLworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCAxLCBOVlJlYWRWZ2FTZXEoZGV2LCAwLCAxKSB8IDB4MjApOworCisJaWYgKGJpb3NfcmQzMihiaW9zLCBOVjA0X1BGQl9CT09UXzApICYgTlYwNF9QRkJfQk9PVF8wX1VNQV9FTkFCTEUpCisJCWdvdG8gb3V0OworCisJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0RFQlVHXzAsIE5WMDRfUEZCX0RFQlVHXzBfUkVGUkVTSF9PRkYsIDApOworCisJLyogSWYgcHJlc2VudCBsb2FkIHRoZSBoYXJkY29kZWQgc2NyYW1ibGluZyB0YWJsZSAqLworCWlmIChiaW9zLT5sZWdhY3kubWVtX2luaXRfdGJsX3B0cikgeworCQl1aW50MzJfdCAqc2NyYW1ibGVfdGFiID0gKHVpbnQzMl90ICopJmJpb3MtPmRhdGFbCisJCQliaW9zLT5sZWdhY3kubWVtX2luaXRfdGJsX3B0ciArIDB4MTBdOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQliaW9zX3dyMzIoYmlvcywgTlYwNF9QRkJfU0NSQU1CTEUoaSksCisJCQkJICBST00zMihzY3JhbWJsZV90YWJbaV0pKTsKKwl9CisKKwkvKiBTZXQgbWVtb3J5IHR5cGUvd2lkdGgvbGVuZ3RoIGRlZmF1bHRzIGRlcGVuZGluZyBvbiB0aGUgc3RyYXBzICovCisJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwgMHgzZiwgcmFtY2ZnWzBdKTsKKworCWlmIChyYW1jZmdbMV0gJiAweDgwKQorCQliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQ0ZHMCwgMCwgTlYwNF9QRkJfQ0ZHMF9TQ1JBTUJMRSk7CisKKwliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQ0ZHMSwgMHg3MDAwMDEsIChyYW1jZmdbMV0gJiAxKSA8PCAyMCk7CisJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0NGRzEsIDAsIDEpOworCisJLyogUHJvYmUgbWVtb3J5IGJ1cyB3aWR0aCAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXBva2VfZmIoZGV2LCBmYiwgNCAqIGksIHBhdHQpOworCisJaWYgKHBlZWtfZmIoZGV2LCBmYiwgMHhjKSAhPSBwYXR0KQorCQliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQk9PVF8wLAorCQkJICBOVjA0X1BGQl9CT09UXzBfUkFNX1dJRFRIXzEyOCwgMCk7CisKKwkvKiBQcm9iZSBtZW1vcnkgbGVuZ3RoICovCisJdiA9IGJpb3NfcmQzMihiaW9zLCBOVjA0X1BGQl9CT09UXzApICYgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlQ7CisKKwlpZiAodiA9PSBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVF8zMk1CICYmCisJICAgICghcmVhZF9iYWNrX2ZiKGRldiwgZmIsIDB4MTAwMDAwMCwgKytwYXR0KSB8fAorCSAgICAgIXJlYWRfYmFja19mYihkZXYsIGZiLCAwLCArK3BhdHQpKSkKKwkJYmlvc19tZDMyKGJpb3MsIE5WMDRfUEZCX0JPT1RfMCwgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlQsCisJCQkgIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzE2TUIpOworCisJaWYgKHYgPT0gTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfMTZNQiAmJgorCSAgICAhcmVhZF9iYWNrX2ZiKGRldiwgZmIsIDB4ODAwMDAwLCArK3BhdHQpKQorCQliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQk9PVF8wLCBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVCwKKwkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfOE1CKTsKKworCWlmICghcmVhZF9iYWNrX2ZiKGRldiwgZmIsIDB4NDAwMDAwLCArK3BhdHQpKQorCQliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQk9PVF8wLCBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVCwKKwkJCSAgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfNE1CKTsKKworb3V0OgorCS8qIFNlcXVlbmNlciBvbiAqLworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCAxLCBOVlJlYWRWZ2FTZXEoZGV2LCAwLCAxKSAmIH4weDIwKTsKKworCWlvX21hcHBpbmdfZnJlZShmYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MTBfaW5pdF9jb21wdXRlX21lbShzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwljb25zdCBpbnQgbWVtX3dpZHRoW10gPSB7IDB4MTAsIDB4MDAsIDB4MjAgfTsKKwljb25zdCBpbnQgbWVtX3dpZHRoX2NvdW50ID0gKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTcgPyAzIDogMik7CisJdWludDMyX3QgcGF0dCA9IDB4ZGVhZGJlZWY7CisJc3RydWN0IGlvX21hcHBpbmcgKmZiOworCWludCBpLCBqLCBrOworCisJLyogTWFwIHRoZSBmcmFtZWJ1ZmZlciBhcGVydHVyZSAqLworCWZiID0gaW9fbWFwcGluZ19jcmVhdGVfd2MocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSksCisJCQkJICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkpOworCWlmICghZmIpCisJCXJldHVybiAtRU5PTUVNOworCisJYmlvc193cjMyKGJpb3MsIE5WMTBfUEZCX1JFRkNUUkwsIE5WMTBfUEZCX1JFRkNUUkxfVkFMSURfMSk7CisKKwkvKiBQcm9iZSBtZW1vcnkgYnVzIHdpZHRoICovCisJZm9yIChpID0gMDsgaSA8IG1lbV93aWR0aF9jb3VudDsgaSsrKSB7CisJCWJpb3NfbWQzMihiaW9zLCBOVjA0X1BGQl9DRkcwLCAweDMwLCBtZW1fd2lkdGhbaV0pOworCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJCQkJcG9rZV9mYihkZXYsIGZiLCAweDFjLCAwKTsKKworCQkJcG9rZV9mYihkZXYsIGZiLCAweDFjLCBwYXR0KTsKKwkJCXBva2VfZmIoZGV2LCBmYiwgMHgzYywgMCk7CisKKwkJCWlmIChwZWVrX2ZiKGRldiwgZmIsIDB4MWMpID09IHBhdHQpCisJCQkJZ290byBtZW1fd2lkdGhfZm91bmQ7CisJCX0KKwl9CisKK21lbV93aWR0aF9mb3VuZDoKKwlwYXR0IDw8PSAxOworCisJLyogUHJvYmUgYW1vdW50IG9mIGluc3RhbGxlZCBtZW1vcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWludCBvZmYgPSBiaW9zX3JkMzIoYmlvcywgTlYwNF9QRkJfRklGT19EQVRBKSAtIDB4MTAwMDAwOworCisJCXBva2VfZmIoZGV2LCBmYiwgb2ZmLCBwYXR0KTsKKwkJcG9rZV9mYihkZXYsIGZiLCAwLCAwKTsKKworCQlwZWVrX2ZiKGRldiwgZmIsIDApOworCQlwZWVrX2ZiKGRldiwgZmIsIDApOworCQlwZWVrX2ZiKGRldiwgZmIsIDApOworCQlwZWVrX2ZiKGRldiwgZmIsIDApOworCisJCWlmIChwZWVrX2ZiKGRldiwgZmIsIG9mZikgPT0gcGF0dCkKKwkJCWdvdG8gYW1vdW50X2ZvdW5kOworCX0KKworCS8qIElDIG1pc3NpbmcgLSBkaXNhYmxlIHRoZSB1cHBlciBoYWxmIG1lbW9yeSBzcGFjZS4gKi8KKwliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQ0ZHMCwgMHgxMDAwLCAwKTsKKworYW1vdW50X2ZvdW5kOgorCWlvX21hcHBpbmdfZnJlZShmYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MjBfaW5pdF9jb21wdXRlX21lbShzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBtYXNrID0gKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MjUgPyAweDMwMCA6IDB4OTAwKTsKKwl1aW50MzJfdCBhbW91bnQsIG9mZjsKKwlzdHJ1Y3QgaW9fbWFwcGluZyAqZmI7CisKKwkvKiBNYXAgdGhlIGZyYW1lYnVmZmVyIGFwZXJ0dXJlICovCisJZmIgPSBpb19tYXBwaW5nX2NyZWF0ZV93YyhwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKSwKKwkJCQkgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSk7CisJaWYgKCFmYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliaW9zX3dyMzIoYmlvcywgTlYxMF9QRkJfUkVGQ1RSTCwgTlYxMF9QRkJfUkVGQ1RSTF9WQUxJRF8xKTsKKworCS8qIEFsbG93IGZ1bGwgYWRkcmVzc2luZyAqLworCWJpb3NfbWQzMihiaW9zLCBOVjA0X1BGQl9DRkcwLCAwLCBtYXNrKTsKKworCWFtb3VudCA9IGJpb3NfcmQzMihiaW9zLCBOVjA0X1BGQl9GSUZPX0RBVEEpOworCWZvciAob2ZmID0gYW1vdW50OyBvZmYgPiAweDIwMDAwMDA7IG9mZiAtPSAweDIwMDAwMDApCisJCXBva2VfZmIoZGV2LCBmYiwgb2ZmIC0gNCwgb2ZmKTsKKworCWFtb3VudCA9IGJpb3NfcmQzMihiaW9zLCBOVjA0X1BGQl9GSUZPX0RBVEEpOworCWlmIChhbW91bnQgIT0gcGVla19mYihkZXYsIGZiLCBhbW91bnQgLSA0KSkKKwkJLyogSUMgbWlzc2luZyAtIGRpc2FibGUgdGhlIHVwcGVyIGhhbGYgbWVtb3J5IHNwYWNlLiAqLworCQliaW9zX21kMzIoYmlvcywgTlYwNF9QRkJfQ0ZHMCwgbWFzaywgMCk7CisKKwlpb19tYXBwaW5nX2ZyZWUoZmIpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBpbml0X2NvbXB1dGVfbWVtKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCiB7CkBAIC0yMDQ3LDY0ICsyMzk0LDU3IEBACiAJICoKIAkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKIAkgKgotCSAqIFRoaXMgb3Bjb2RlIGlzIG1lYW50IHRvIHNldCBOVl9QRkJfQ0ZHMCAoMHgxMDAyMDApIGFwcHJvcHJpYXRlbHkgc28KLQkgKiB0aGF0IHRoZSBoYXJkd2FyZSBjYW4gY29ycmVjdGx5IGNhbGN1bGF0ZSBob3cgbXVjaCBWUkFNIGl0IGhhcwotCSAqIChhbmQgc3Vic2VxdWVudGx5IHJlcG9ydCB0aGF0IHZhbHVlIGluIE5WX1BGQl9DU1RBVFVTICgweDEwMDIwQykpCisJICogVGhpcyBvcGNvZGUgaXMgbWVhbnQgdG8gc2V0IHRoZSBQRkIgbWVtb3J5IGNvbmZpZyByZWdpc3RlcnMKKwkgKiBhcHByb3ByaWF0ZWx5IHNvIHRoYXQgd2UgY2FuIGNvcnJlY3RseSBjYWxjdWxhdGUgaG93IG11Y2ggVlJBTSBpdAorCSAqIGhhcyAob24gbnYxMCBhbmQgYmV0dGVyIGNoaXBzZXRzIHRoZSBhbW91bnQgb2YgaW5zdGFsbGVkIFZSQU0gaXMKKwkgKiBzdWJzZXF1ZW50bHkgcmVwb3J0ZWQgaW4gTlZfUEZCX0NTVEFUVVMgKDB4MTAwMjBDKSkuCiAJICoKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBvcGNvZGUgaW4gZ2VuZXJhbCBjb25zaXN0cyBvZiB0d28gcGFydHM6Ci0JICogMSkgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgbWVtb3J5IGJ1cyB3aWR0aAotCSAqIDIpIGRldGVybWluYXRpb24gb2YgaG93IG1hbnkgb2YgdGhlIGNhcmQncyBSQU0gcGFkcyBoYXZlIElDcyBhdHRhY2hlZAorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG9wY29kZSBpbiBnZW5lcmFsIGNvbnNpc3RzIG9mIHNldmVyYWwKKwkgKiBwYXJ0czoKIAkgKgotCSAqIDEpIGlzIGRvbmUgYnkgYSBjdW5uaW5nIGNvbWJpbmF0aW9uIG9mIHdyaXRlcyB0byBvZmZzZXRzIDB4MWMgYW5kCi0JICogMHgzYyBpbiB0aGUgZnJhbWVidWZmZXIsIGFuZCBzZWVpbmcgd2hldGhlciB0aGUgd3JpdHRlbiB2YWx1ZXMgYXJlCi0JICogcmVhZCBiYWNrIGNvcnJlY3RseS4gVGhpcyB0aGVuIGFmZmVjdHMgYml0cyA0LTcgb2YgTlZfUEZCX0NGRzAKKwkgKiAxKSBEZXRlcm1pbmF0aW9uIG9mIG1lbW9yeSB0eXBlIGFuZCBkZW5zaXR5LiBPbmx5IG5lY2Vzc2FyeSBmb3IKKwkgKiAgICByZWFsbHkgb2xkIGNoaXBzZXRzLCB0aGUgbWVtb3J5IHR5cGUgcmVwb3J0ZWQgYnkgdGhlIHN0cmFwIGJpdHMKKwkgKiAgICAoMHgxMDEwMDApIGlzIGFzc3VtZWQgdG8gYmUgYWNjdXJhdGUgb24gbnYwNSBhbmQgbmV3ZXIuCiAJICoKLQkgKiAyKSBpcyBkb25lIGJ5IGEgY3VubmluZyBjb21iaW5hdGlvbiBvZiB3cml0ZXMgdG8gYW4gb2Zmc2V0IHNsaWdodGx5Ci0JICogbGVzcyB0aGFuIHRoZSBtYXhpbXVtIG1lbW9yeSByZXBvcnRlZCBieSBOVl9QRkJfQ1NUQVRVUywgdGhlbiBzZWVpbmcKLQkgKiBpZiB0aGUgdGVzdCBwYXR0ZXJuIGNhbiBiZSByZWFkIGJhY2suIFRoaXMgdGhlbiBhZmZlY3RzIGJpdHMgMTItMTUgb2YKLQkgKiBOVl9QRkJfQ0ZHMAorCSAqIDIpIERldGVybWluYXRpb24gb2YgdGhlIG1lbW9yeSBidXMgd2lkdGguIFVzdWFsbHkgZG9uZSBieSBhIGN1bm5pbmcKKwkgKiAgICBjb21iaW5hdGlvbiBvZiB3cml0ZXMgdG8gb2Zmc2V0cyAweDFjIGFuZCAweDNjIGluIHRoZSBmYiwgYW5kCisJICogICAgc2VlaW5nIHdoZXRoZXIgdGhlIHdyaXR0ZW4gdmFsdWVzIGFyZSByZWFkIGJhY2sgY29ycmVjdGx5LgogCSAqCi0JICogSW4gdGhpcyBjb250ZXh0IGEgImN1bm5pbmcgY29tYmluYXRpb24iIG1heSBpbmNsdWRlIG11bHRpcGxlIHJlYWRzCi0JICogYW5kIHdyaXRlcyB0byB2YXJ5aW5nIGxvY2F0aW9ucywgb2Z0ZW4gYWx0ZXJuYXRpbmcgdGhlIHRlc3QgcGF0dGVybgotCSAqIGFuZCAwLCBkb3VidGxlc3MgdG8gbWFrZSBzdXJlIGJ1ZmZlcnMgYXJlIGZpbGxlZCwgcmVzaWR1YWwgY2hhcmdlcwotCSAqIG9uIHRyYWNrcyBhcmUgcmVtb3ZlZCBldGMuCisJICogICAgT25seSBuZWNlc3Nhcnkgb24gbnYweC1udjF4IGFuZCBudjM0LCBvbiB0aGUgb3RoZXIgY2FyZHMgd2UgY2FuCisJICogICAgdHJ1c3QgdGhlIHN0cmFwcy4KIAkgKgotCSAqIFVuZm9ydHVuYXRlbHksIHRoZSAiY3VubmluZyBjb21iaW5hdGlvbiJzIG1lbnRpb25lZCBhYm92ZSwgYW5kIHRoZQotCSAqIGNoYW5nZXMgdG8gdGhlIGJpdHMgaW4gTlZfUEZCX0NGRzAgZGlmZmVyIHdpdGggbmVhcmx5IGV2ZXJ5IGJpb3MKLQkgKiB0cmFjZSBJIGhhdmUuCisJICogMykgRGV0ZXJtaW5hdGlvbiBvZiBob3cgbWFueSBvZiB0aGUgY2FyZCdzIFJBTSBwYWRzIGhhdmUgSUNzCisJICogICAgYXR0YWNoZWQsIHVzdWFsbHkgZG9uZSBieSBhIGN1bm5pbmcgY29tYmluYXRpb24gb2Ygd3JpdGVzIHRvIGFuCisJICogICAgb2Zmc2V0IHNsaWdodGx5IGxlc3MgdGhhbiB0aGUgbWF4aW11bSBtZW1vcnkgcmVwb3J0ZWQgYnkKKwkgKiAgICBOVl9QRkJfQ1NUQVRVUywgdGhlbiBzZWVpbmcgaWYgdGhlIHRlc3QgcGF0dGVybiBjYW4gYmUgcmVhZCBiYWNrLgogCSAqCi0JICogVGhlcmVmb3JlLCB3ZSBjaGVhdCBhbmQgYXNzdW1lIHRoZSB2YWx1ZSBvZiBOVl9QRkJfQ0ZHMCB3aXRoIHdoaWNoCi0JICogd2Ugc3RhcnRlZCB3YXMgY29ycmVjdCwgYW5kIHVzZSB0aGF0IGluc3RlYWQKKwkgKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSBOT1Agb24gSUdQcyBhbmQgTlY0eCBvciBuZXdlciBjaGlwc2V0cywgYm90aCBpbworCSAqIGxvZ3Mgb2YgdGhlIFZCSU9TIGFuZCBrbW1pbyB0cmFjZXMgb2YgdGhlIGJpbmFyeSBkcml2ZXIgUE9TVGluZyB0aGUKKwkgKiBjYXJkIHNob3cgbm90aGluZyBiZWluZyBkb25lIGZvciB0aGlzIG9wY29kZS4gV2h5IGlzIGl0IHN0aWxsIGxpc3RlZAorCSAqIGluIHRoZSB0YWJsZT8hCiAJICovCiAKIAkvKiBubyBpZXhlYy0+ZXhlY3V0ZSBjaGVjayBieSBkZXNpZ24gKi8KIAotCS8qCi0JICogVGhpcyBhcHBlYXJzIHRvIGJlIGEgTk9QIG9uIEc4eCBjaGlwc2V0cywgYm90aCBpbyBsb2dzIG9mIHRoZSBWQklPUwotCSAqIGFuZCBrbW1pbyB0cmFjZXMgb2YgdGhlIGJpbmFyeSBkcml2ZXIgUE9TVGluZyB0aGUgY2FyZCBzaG93IG5vdGhpbmcKLQkgKiBiZWluZyBkb25lIGZvciB0aGlzIG9wY29kZS4gIHdoeSBpcyBpdCBzdGlsbCBsaXN0ZWQgaW4gdGhlIHRhYmxlPyEKLQkgKi8KLQogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGJpb3MtPmRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKQotCQlyZXR1cm4gMTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg0MCB8fAorCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDFhIHx8CisJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4MWYpCisJCXJldCA9IDA7CisJZWxzZSBpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgyMCAmJgorCQkgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHgzNCkKKwkJcmV0ID0gbnYyMF9pbml0X2NvbXB1dGVfbWVtKGJpb3MpOworCWVsc2UgaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTApCisJCXJldCA9IG52MTBfaW5pdF9jb21wdXRlX21lbShiaW9zKTsKKwllbHNlIGlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDUpCisJCXJldCA9IG52MDVfaW5pdF9jb21wdXRlX21lbShiaW9zKTsKKwllbHNlCisJCXJldCA9IG52MDRfaW5pdF9jb21wdXRlX21lbShiaW9zKTsKIAotCS8qCi0JICogT24gZXZlcnkgY2FyZCBJJ3ZlIHNlZW4sIHRoaXMgc3RlcCBnZXRzIGRvbmUgZm9yIHVzIGVhcmxpZXIgaW4KLQkgKiB0aGUgaW5pdCBzY3JpcHRzCi0JdWludDhfdCBjcmRhdGEgPSBiaW9zX2lkeHBydF9yZChkZXYsIE5WX1ZJT19TUlgsIDB4MDEpOwotCWJpb3NfaWR4cHJ0X3dyKGRldiwgTlZfVklPX1NSWCwgMHgwMSwgY3JkYXRhIHwgMHgyMCk7Ci0JICovCi0KLQkvKgotCSAqIFRoaXMgYWxzbyBoYXMgcHJvYmFibHkgYmVlbiBkb25lIGluIHRoZSBzY3JpcHRzLCBidXQgYW4gbW1pbyB0cmFjZSBvZgotCSAqIHMzIHJlc3VtZSBzaG93cyBudmlkaWEgZG9pbmcgaXQgYW55d2F5ICh1bmxpa2UgdGhlIE5WX1ZJT19TUlggd3JpdGUpCi0JICovCi0JYmlvc193cjMyKGJpb3MsIE5WX1BGQl9SRUZDVFJMLCBOVl9QRkJfUkVGQ1RSTF9WQUxJRF8xKTsKLQotCS8qIHdyaXRlIGJhY2sgdGhlIHNhdmVkIGNvbmZpZ3VyYXRpb24gdmFsdWUgKi8KLQliaW9zX3dyMzIoYmlvcywgTlZfUEZCX0NGRzAsIGJpb3MtPnN0YXRlLnNhdmVkX252X3BmYl9jZmcwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIDE7CiB9CkBAIC0yMTMxLDcgKzI0NzEsOCBAQAogCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLwogCiAJcGNpX252XzE5ID0gYmlvc19yZDMyKGJpb3MsIE5WX1BCVVNfUENJX05WXzE5KTsKLQliaW9zX3dyMzIoYmlvcywgTlZfUEJVU19QQ0lfTlZfMTksIDApOworCWJpb3Nfd3IzMihiaW9zLCBOVl9QQlVTX1BDSV9OVl8xOSwgcGNpX252XzE5ICYgfjB4ZjAwKTsKKwogCWJpb3Nfd3IzMihiaW9zLCByZWcsIHZhbHVlMSk7CiAKIAl1ZGVsYXkoMTApOwpAQCAtMjE2Nyw3ICsyNTA4LDcgQEAKIAl1aW50MzJfdCByZWcsIGRhdGE7CiAKIAlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA+IDIpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gMDsKIAogCWJpb3NfaWR4cHJ0X3dyKGJpb3MsIE5WX1ZJT19TUlgsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgYmlvc19pZHhwcnRfcmQoCiAJCSAgICAgICBiaW9zLCBOVl9WSU9fU1JYLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgpIHwgMHgyMCk7CkBAIC0yMTgwLDE0ICsyNTIxLDE0IEBACiAJICAgICByZWcgPSBST00zMihiaW9zLT5kYXRhW3NlcXRibG9mZnMgKz0gNF0pKSB7CiAKIAkJc3dpdGNoIChyZWcpIHsKLQkJY2FzZSBOVl9QRkJfUFJFOgotCQkJZGF0YSA9IE5WX1BGQl9QUkVfQ01EX1BSRUNIQVJHRTsKKwkJY2FzZSBOVjA0X1BGQl9QUkU6CisJCQlkYXRhID0gTlYwNF9QRkJfUFJFX0NNRF9QUkVDSEFSR0U7CiAJCQlicmVhazsKLQkJY2FzZSBOVl9QRkJfUEFEOgotCQkJZGF0YSA9IE5WX1BGQl9QQURfQ0tFX05PUk1BTDsKKwkJY2FzZSBOVjA0X1BGQl9QQUQ6CisJCQlkYXRhID0gTlYwNF9QRkJfUEFEX0NLRV9OT1JNQUw7CiAJCQlicmVhazsKLQkJY2FzZSBOVl9QRkJfUkVGOgotCQkJZGF0YSA9IE5WX1BGQl9SRUZfQ01EX1JFRlJFU0g7CisJCWNhc2UgTlYwNF9QRkJfUkVGOgorCQkJZGF0YSA9IE5WMDRfUEZCX1JFRl9DTURfUkVGUkVTSDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGF0YSA9IFJPTTMyKGJpb3MtPmRhdGFbbWVtaW5pdGRhdGFdKTsKQEAgLTIyMjIsNyArMjU2Myw3IEBACiAJaW50IGNsb2NrOwogCiAJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPiAyKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIDA7CiAKIAljbG9jayA9IFJPTTE2KGJpb3MtPmRhdGFbbWVtaW5pdG9mZnMgKyA0XSkgKiAxMDsKIAlzZXRQTEwoYmlvcywgTlZfUFJBTURBQ19OVlBMTF9DT0VGRiwgY2xvY2spOwpAQCAtMjI1NSw3ICsyNTk2LDcgQEAKIAl1aW50OF90IGNyM2MgPSAoKHN0cmFwcyA8PCAyKSAmIDB4ZjApIHwgKHN0cmFwcyAmICgxIDw8IDYpKTsKIAogCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uID4gMikKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAwOwogCiAJYmlvc19pZHhwcnRfd3IoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsCiAJCQkgICAgIE5WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYLCBjcjNjKTsKQEAgLTIzODksNyArMjczMCw3IEBACiAJICogb2Zmc2V0ICsgMSAgKDggYml0KTogbWFzawogCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IGNtcHZhbAogCSAqCi0JICogVGVzdCBpZiAoTlZfUEZCX0JPT1RfMCAmICJtYXNrIikgZXF1YWxzICJjbXB2YWwiLgorCSAqIFRlc3QgaWYgKE5WMDRfUEZCX0JPT1RfMCAmICJtYXNrIikgZXF1YWxzICJjbXB2YWwiLgogCSAqIElmIGNvbmRpdGlvbiBub3QgbWV0IHNraXAgc3Vic2VxdWVudCBvcGNvZGVzIHVudGlsIGNvbmRpdGlvbiBpcwogCSAqIGludmVydGVkIChJTklUX05PVCksIG9yIHdlIGhpdCBJTklUX1JFU1VNRQogCSAqLwpAQCAtMjQwMSw3ICsyNzQyLDcgQEAKIAlpZiAoIWlleGVjLT5leGVjdXRlKQogCQlyZXR1cm4gMzsKIAotCWRhdGEgPSBiaW9zX3JkMzIoYmlvcywgTlZfUEZCX0JPT1RfMCkgJiBtYXNrOworCWRhdGEgPSBiaW9zX3JkMzIoYmlvcywgTlYwNF9QRkJfQk9PVF8wKSAmIG1hc2s7CiAKIAlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENoZWNraW5nIGlmIDB4JTA4WCBlcXVhbHMgMHglMDhYXG4iLAogCQlvZmZzZXQsIGRhdGEsIGNtcHZhbCk7CkBAIC0yNzk1LDEyICszMTM2LDEzIEBACiAJICovCiAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CiAJY29uc3QgdWludDMyX3QgbnY1MF9ncGlvX2N0bFsyXSA9IHsgMHhlMTAwLCAweGUyOGMgfTsKIAlpbnQgaTsKIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlICE9IE5WXzUwKSB7CiAJCU5WX0VSUk9SKGJpb3MtPmRldiwgIklOSVRfR1BJTyBvbiB1bnN1cHBvcnRlZCBjaGlwc2V0XG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAxOwogCX0KIAogCWlmICghaWV4ZWMtPmV4ZWN1dGUpCkBAIC0yODE1LDcgKzMxNTcsNyBAQAogCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IHNldCBncGlvIDB4JTAyeCwgc3RhdGUgJWRcbiIsCiAJCQlvZmZzZXQsIGdwaW8tPnRhZywgZ3Bpby0+c3RhdGVfZGVmYXVsdCk7CiAJCWlmIChiaW9zLT5leGVjdXRlKQotCQkJbnY1MF9ncGlvX3NldChiaW9zLT5kZXYsIGdwaW8tPnRhZywgZ3Bpby0+c3RhdGVfZGVmYXVsdCk7CisJCQlwZ3Bpby0+c2V0KGJpb3MtPmRldiwgZ3Bpby0+dGFnLCBncGlvLT5zdGF0ZV9kZWZhdWx0KTsKIAogCQkvKiBUaGUgTlZJRElBIGJpbmFyeSBkcml2ZXIgZG9lc24ndCBhcHBlYXIgdG8gYWN0dWFsbHkgZG8KIAkJICogYW55IG9mIHRoaXMsIG15IFZCSU9TIGRvZXMgaG93ZXZlci4KQEAgLTI4NzIsMTAgKzMyMTQsNyBAQAogCXVpbnQ4X3QgaW5kZXg7CiAJaW50IGk7CiAKLQotCWlmICghaWV4ZWMtPmV4ZWN1dGUpCi0JCXJldHVybiBsZW47Ci0KKwkvKiBjcml0aWNhbCEgdG8ga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBvcGNvZGUgKi87CiAJaWYgKCFibG9ja2xlbikgewogCQlOVl9FUlJPUihiaW9zLT5kZXYsCiAJCQkgIjB4JTA0WDogWmVybyBibG9jayBsZW5ndGggLSBoYXMgdGhlIE0gdGFibGUgIgpAQCAtMjg4Myw2ICszMjIyLDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIGxlbjsKKwogCXN0cmFwX3JhbWNmZyA9IChiaW9zX3JkMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzApID4+IDIpICYgMHhmOwogCWluZGV4ID0gYmlvcy0+ZGF0YVtiaW9zLT5yYW1fcmVzdHJpY3RfdGJsX3B0ciArIHN0cmFwX3JhbWNmZ107CiAKQEAgLTMwNjQsMTQgKzM0MDYsMTQgQEAKIAogCWlmICghYmlvcy0+ZGlzcGxheS5vdXRwdXQpIHsKIAkJTlZfRVJST1IoZGV2LCAiSU5JVF9BVVhDSDogbm8gYWN0aXZlIG91dHB1dFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gbGVuOwogCX0KIAogCWF1eGNoID0gaW5pdF9pMmNfZGV2aWNlX2ZpbmQoZGV2LCBiaW9zLT5kaXNwbGF5Lm91dHB1dC0+aTJjX2luZGV4KTsKIAlpZiAoIWF1eGNoKSB7CiAJCU5WX0VSUk9SKGRldiwgIklOSVRfQVVYQ0g6IGNvdWxkbid0IGdldCBhdXhjaCAlZFxuIiwKIAkJCSBiaW9zLT5kaXNwbGF5Lm91dHB1dC0+aTJjX2luZGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiBsZW47CiAJfQogCiAJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKQEAgLTMwODQsNyArMzQyNiw3IEBACiAJCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDksIGFkZHIsICZkYXRhLCAxKTsKIAkJaWYgKHJldCkgewogCQkJTlZfRVJST1IoZGV2LCAiSU5JVF9BVVhDSDogcmQgYXV4Y2ggZmFpbCAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gbGVuOwogCQl9CiAKIAkJZGF0YSAmPSBiaW9zLT5kYXRhW29mZnNldCArIDBdOwpAQCAtMzA5Myw3ICszNDM1LDcgQEAKIAkJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOCwgYWRkciwgJmRhdGEsIDEpOwogCQlpZiAocmV0KSB7CiAJCQlOVl9FUlJPUihkZXYsICJJTklUX0FVWENIOiB3ciBhdXhjaCBmYWlsICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybiBsZW47CiAJCX0KIAl9CiAKQEAgLTMxMjMsMTQgKzM0NjUsMTQgQEAKIAogCWlmICghYmlvcy0+ZGlzcGxheS5vdXRwdXQpIHsKIAkJTlZfRVJST1IoZGV2LCAiSU5JVF9aTV9BVVhDSDogbm8gYWN0aXZlIG91dHB1dFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gbGVuOwogCX0KIAogCWF1eGNoID0gaW5pdF9pMmNfZGV2aWNlX2ZpbmQoZGV2LCBiaW9zLT5kaXNwbGF5Lm91dHB1dC0+aTJjX2luZGV4KTsKIAlpZiAoIWF1eGNoKSB7CiAJCU5WX0VSUk9SKGRldiwgIklOSVRfWk1fQVVYQ0g6IGNvdWxkbid0IGdldCBhdXhjaCAlZFxuIiwKIAkJCSBiaW9zLT5kaXNwbGF5Lm91dHB1dC0+aTJjX2luZGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiBsZW47CiAJfQogCiAJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKQEAgLTMxNDEsNyArMzQ4Myw3IEBACiAJCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDgsIGFkZHIsICZiaW9zLT5kYXRhW29mZnNldF0sIDEpOwogCQlpZiAocmV0KSB7CiAJCQlOVl9FUlJPUihkZXYsICJJTklUX1pNX0FVWENIOiB3ciBhdXhjaCBmYWlsICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybiBsZW47CiAJCX0KIAl9CiAKQEAgLTUxNTEsMTAgKzU0OTMsMTQgQEAKIAliaW9zLT5sZWdhY3kuaTJjX2luZGljZXMuY3J0ID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldF07CiAJYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnR2ID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDFdOwogCWJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy5wYW5lbCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyAyXTsKLQliaW9zLT5kY2IuaTJjWzBdLndyaXRlID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDRdOwotCWJpb3MtPmRjYi5pMmNbMF0ucmVhZCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyA1XTsKLQliaW9zLT5kY2IuaTJjWzFdLndyaXRlID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDZdOwotCWJpb3MtPmRjYi5pMmNbMV0ucmVhZCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyA3XTsKKwlpZiAoYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDRdKQorCQliaW9zLT5kY2IuaTJjWzBdLndyaXRlID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDRdOworCWlmIChiaW9zLT5kYXRhW2xlZ2FjeV9pMmNfb2Zmc2V0ICsgNV0pCisJCWJpb3MtPmRjYi5pMmNbMF0ucmVhZCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyA1XTsKKwlpZiAoYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDZdKQorCQliaW9zLT5kY2IuaTJjWzFdLndyaXRlID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDZdOworCWlmIChiaW9zLT5kYXRhW2xlZ2FjeV9pMmNfb2Zmc2V0ICsgN10pCisJCWJpb3MtPmRjYi5pMmNbMV0ucmVhZCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyA3XTsKIAogCWlmIChibXBsZW5ndGggPiA3NCkgewogCQliaW9zLT5mbWF4dmNvID0gUk9NMzIoYm1wWzY3XSk7CkBAIC01NTg5LDkgKzU5MzUsMTIgQEAKIAkJCWlmIChjb25mICYgMHg0IHx8IGNvbmYgJiAweDgpCiAJCQkJZW50cnktPmx2ZHNjb25mLnVzZV9wb3dlcl9zY3JpcHRzID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCW1hc2sgPSB+MHg1OworCQkJbWFzayA9IH4weDc7CisJCQlpZiAoY29uZiAmIDB4MikKKwkJCQllbnRyeS0+bHZkc2NvbmYudXNlX2FjcGlfZm9yX2VkaWQgPSB0cnVlOwogCQkJaWYgKGNvbmYgJiAweDQpCiAJCQkJZW50cnktPmx2ZHNjb25mLnVzZV9wb3dlcl9zY3JpcHRzID0gdHJ1ZTsKKwkJCWVudHJ5LT5sdmRzY29uZi5zb3IubGluayA9IChjb25mICYgMHgwMDAwMDAzMCkgPj4gNDsKIAkJfQogCQlpZiAoY29uZiAmIG1hc2spIHsKIAkJCS8qCkBAIC01NzA2LDEzICs2MDU1LDYgQEAKIAljYXNlIE9VVFBVVF9UVjoKIAkJZW50cnktPnR2Y29uZi5oYXNfY29tcG9uZW50X291dHB1dCA9IGZhbHNlOwogCQlicmVhazsKLQljYXNlIE9VVFBVVF9UTURTOgotCQkvKgotCQkgKiBJbnZlbnQgYSBEVkktQSBvdXRwdXQsIGJ5IGNvcHlpbmcgdGhlIGZpZWxkcyBvZiB0aGUgRFZJLUQKLQkJICogb3V0cHV0OyByZXBvcnRlZCB0byB3b3JrIGJ5IG1hdGhfYiBvbiBhbiBOVjIwKCEpLgotCQkgKi8KLQkJZmFicmljYXRlX3ZnYV9vdXRwdXQoZGNiLCBlbnRyeS0+aTJjX2luZGV4LCBlbnRyeS0+aGVhZHMpOwotCQlicmVhazsKIAljYXNlIE9VVFBVVF9MVkRTOgogCQlpZiAoKGNvbm4gJiAweDAwMDAzZjAwKSAhPSAweDEwKQogCQkJZW50cnktPmx2ZHNjb25mLnVzZV9zdHJhcHNfZm9yX21vZGUgPSB0cnVlOwpAQCAtNTc5Myw2ICs2MTM1LDMxIEBACiAJZGNiLT5lbnRyaWVzID0gbmV3ZW50cmllczsKIH0KIAorc3RhdGljIGJvb2wKK2FwcGx5X2RjYl9lbmNvZGVyX3F1aXJrcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaWR4LCB1MzIgKmNvbm4sIHUzMiAqY29uZikKK3sKKwkvKiBEZWxsIFByZWNpc2lvbiBNNjMwMAorCSAqICAgRENCIGVudHJ5IDI6IDAyMDI1MzEyIDAwMDAwMDEwCisJICogICBEQ0IgZW50cnkgMzogMDIwMjYzMTIgMDAwMDAwMjAKKwkgKgorCSAqIElkZW50aWNhbCwgZXhjZXB0IGFwcGFyZW50bHkgYSBkaWZmZXJlbnQgY29ubmVjdG9yIG9uIGEKKwkgKiBkaWZmZXJlbnQgU09SIGxpbmsuICBOb3QgYSBjbHVlIGhvdyB3ZSdyZSBzdXBwb3NlZCB0byBrbm93CisJICogd2hpY2ggb25lIGlzIGluIHVzZSBpZiBpdCBldmVuIHNoYXJlcyBhbiBpMmMgbGluZS4uLgorCSAqCisJICogSWdub3JlIHRoZSBjb25uZWN0b3Igb24gdGhlIHNlY29uZCBTT1IgbGluayB0byBwcmV2ZW50CisJICogbmFzdHkgcHJvYmxlbXMgdW50aWwgdGhpcyBpcyBzb3J0ZWQgKGFzc3VtaW5nIGl0J3Mgbm90IGEKKwkgKiBWQklPUyBidWcpLgorCSAqLworCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHgwNDBkKSAmJgorCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyOCkgJiYKKwkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAxOWIpKSB7CisJCWlmICgqY29ubiA9PSAweDAyMDI2MzEyICYmICpjb25mID09IDB4MDAwMDAwMjApCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBpbnQKIHBhcnNlX2RjYl90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCBib29sIHR3b0hlYWRzKQogewpAQCAtNTkyNiw2ICs2MjkzLDkgQEAKIAkJaWYgKChjb25uZWN0aW9uICYgMHgwMDAwMDAwZikgPT0gMHgwMDAwMDAwZikKIAkJCWNvbnRpbnVlOwogCisJCWlmICghYXBwbHlfZGNiX2VuY29kZXJfcXVpcmtzKGRldiwgaSwgJmNvbm5lY3Rpb24sICZjb25maWcpKQorCQkJY29udGludWU7CisKIAkJTlZfVFJBQ0VXQVJOKGRldiwgIlJhdyBEQ0IgZW50cnkgJWQ6ICUwOHggJTA4eFxuIiwKIAkJCSAgICAgZGNiLT5lbnRyaWVzLCBjb25uZWN0aW9uLCBjb25maWcpOwogCkBAIC02MTgxLDkgKzY1NTEsOCBAQAogCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOwogCWludCBpLCByZXQgPSAwOwogCi0JTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7Ci0JaWYgKG52X3R3b19oZWFkcyhkZXYpKQotCQlOVlNldE93bmVyKGRldiwgYmlvcy0+c3RhdGUuY3J0Y2hlYWQpOworCS8qIFJlc2V0IHRoZSBCSU9TIGhlYWQgdG8gMC4gKi8KKwliaW9zLT5zdGF0ZS5jcnRjaGVhZCA9IDA7CiAKIAlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA8IDUpCS8qIEJNUCBvbmx5ICovCiAJCWxvYWRfbnYxN19od19zZXF1ZW5jZXJfdWNvZGUoZGV2LCBiaW9zKTsKQEAgLTYyMTYsOCArNjU4NSw2IEBACiAJCX0KIAl9CiAKLQlOVkxvY2tWZ2FDcnRjcyhkZXYsIHRydWUpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjIzOCw3ICs2NjA1LDYgQEAKIG5vdXZlYXVfYmlvc19wb3N0ZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWJvb2wgd2FzX2xvY2tlZDsKIAl1bnNpZ25lZCBodG90YWw7CiAKIAlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gTlZfNTApIHsKQEAgLTYyNDgsMTMgKzY2MTQsMTIgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0Jd2FzX2xvY2tlZCA9IE5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOwogCWh0b3RhbCAgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgMHgwNik7CiAJaHRvdGFsIHw9IChOVlJlYWRWZ2FDcnRjKGRldiwgMCwgMHgwNykgJiAweDAxKSA8PCA4OwogCWh0b3RhbCB8PSAoTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIDB4MDcpICYgMHgyMCkgPDwgNDsKIAlodG90YWwgfD0gKE5WUmVhZFZnYUNydGMoZGV2LCAwLCAweDI1KSAmIDB4MDEpIDw8IDEwOwogCWh0b3RhbCB8PSAoTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIDB4NDEpICYgMHgwMSkgPDwgMTE7Ci0JTlZMb2NrVmdhQ3J0Y3MoZGV2LCB3YXNfbG9ja2VkKTsKKwogCXJldHVybiAoaHRvdGFsICE9IDApOwogfQogCkBAIC02MjYzLDggKzY2MjgsNiBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7Ci0JdWludDMyX3Qgc2F2ZWRfbnZfcGV4dGRldl9ib290XzA7Ci0JYm9vbCB3YXNfbG9ja2VkOwogCWludCByZXQ7CiAKIAlpZiAoIU5WSW5pdFZCSU9TKGRldikpCkBAIC02Mjg0LDQwICs2NjQ3LDI3IEBACiAJaWYgKCFiaW9zLT5tYWpvcl92ZXJzaW9uKQkvKiB3ZSBkb24ndCBydW4gdmVyc2lvbiAwIGJpb3MgKi8KIAkJcmV0dXJuIDA7CiAKLQkvKiB0aGVzZSB3aWxsIG5lZWQgcmVtZW1iZXJpbmcgYWNyb3NzIGEgc3VzcGVuZCAqLwotCXNhdmVkX252X3BleHRkZXZfYm9vdF8wID0gYmlvc19yZDMyKGJpb3MsIE5WX1BFWFRERVZfQk9PVF8wKTsKLQliaW9zLT5zdGF0ZS5zYXZlZF9udl9wZmJfY2ZnMCA9IGJpb3NfcmQzMihiaW9zLCBOVl9QRkJfQ0ZHMCk7Ci0KIAkvKiBpbml0IHNjcmlwdCBleGVjdXRpb24gZGlzYWJsZWQgKi8KIAliaW9zLT5leGVjdXRlID0gZmFsc2U7CiAKIAkvKiAuLi4gdW5sZXNzIGNhcmQgaXNuJ3QgUE9TVGVkIGFscmVhZHkgKi8KIAlpZiAoIW5vdXZlYXVfYmlvc19wb3N0ZWQoZGV2KSkgewotCQlOVl9JTkZPKGRldiwgIkFkYXB0b3Igbm90IGluaXRpYWxpc2VkXG4iKTsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkgewotCQkJTlZfRVJST1IoZGV2LCAiVW5hYmxlIHRvIFBPU1QgdGhpcyBjaGlwc2V0XG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJTlZfSU5GTyhkZXYsICJSdW5uaW5nIFZCSU9TIGluaXQgdGFibGVzXG4iKTsKKwkJTlZfSU5GTyhkZXYsICJBZGFwdG9yIG5vdCBpbml0aWFsaXNlZCwgIgorCQkJInJ1bm5pbmcgVkJJT1MgaW5pdCB0YWJsZXMuXG4iKTsKIAkJYmlvcy0+ZXhlY3V0ZSA9IHRydWU7CiAJfQogCi0JYmlvc193cjMyKGJpb3MsIE5WX1BFWFRERVZfQk9PVF8wLCBzYXZlZF9udl9wZXh0ZGV2X2Jvb3RfMCk7Ci0KIAlyZXQgPSBub3V2ZWF1X3J1bl92Ymlvc19pbml0KGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIGZlYXR1cmVfYnl0ZSBvbiBCTVAgaXMgcG9vciwgYnV0IGluaXQgYWx3YXlzIHNldHMgQ1I0QiAqLwotCXdhc19sb2NrZWQgPSBOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKIAlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA8IDUpCiAJCWJpb3MtPmlzX21vYmlsZSA9IE5WUmVhZFZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFXzRCKSAmIDB4NDA7CiAKIAkvKiBhbGwgQklUIHN5c3RlbXMgbmVlZCBwX2ZfbV90IGZvciBkaWdpdGFsX21pbl9mcm9udF9wb3JjaCAqLwogCWlmIChiaW9zLT5pc19tb2JpbGUgfHwgYmlvcy0+bWFqb3JfdmVyc2lvbiA+PSA1KQogCQlyZXQgPSBwYXJzZV9mcF9tb2RlX3RhYmxlKGRldiwgYmlvcyk7Ci0JTlZMb2NrVmdhQ3J0Y3MoZGV2LCB3YXNfbG9ja2VkKTsKIAogCS8qIGFsbG93IHN1YnNlcXVlbnQgc2NyaXB0cyB0byBleGVjdXRlICovCiAJYmlvcy0+ZXhlY3V0ZSA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCmluZGV4IGFkZjRlYzIuLjAyNDQ1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCkBAIC04MSw2ICs4MSw3IEBACiAJZW51bSBkY2JfY29ubmVjdG9yX3R5cGUgdHlwZTsKIAl1aW50OF90IGluZGV4MjsKIAl1aW50OF90IGdwaW9fdGFnOworCXZvaWQgKmRybTsKIH07CiAKIHN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlIHsKQEAgLTExNyw2ICsxMTgsNyBAQAogCQlzdHJ1Y3QgewogCQkJc3RydWN0IHNvcl9jb25mIHNvcjsKIAkJCWJvb2wgdXNlX3N0cmFwc19mb3JfbW9kZTsKKwkJCWJvb2wgdXNlX2FjcGlfZm9yX2VkaWQ7CiAJCQlib29sIHVzZV9wb3dlcl9zY3JpcHRzOwogCQl9IGx2ZHNjb25mOwogCQlzdHJ1Y3QgewpAQCAtMjQ5LDggKzI1MSw2IEBACiAKIAlzdHJ1Y3QgewogCQlpbnQgY3J0Y2hlYWQ7Ci0JCS8qIHRoZXNlIG5lZWQgcmVtZW1iZXJpbmcgYWNyb3NzIHN1c3BlbmQgKi8KLQkJdWludDMyX3Qgc2F2ZWRfbnZfcGZiX2NmZzA7CiAJfSBzdGF0ZTsKIAogCXN0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKaW5kZXggNmYzYzE5NS4uM2NhODM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwpAQCAtNDYxLDkgKzQ2MSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKCZudmJvLT5ibywgZmVuY2UsIE5VTEwsCi0JCQkJCWV2aWN0LCBub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKLQlpZiAobnZiby0+Y2hhbm5lbCAmJiBudmJvLT5jaGFubmVsICE9IGNoYW4pCi0JCXJldCA9IG5vdXZlYXVfZmVuY2Vfd2FpdChmZW5jZSwgTlVMTCwgZmFsc2UsIGZhbHNlKTsKKwkJCQkJZXZpY3QgfHwgKG52Ym8tPmNoYW5uZWwgJiYKKwkJCQkJCSAgbnZiby0+Y2hhbm5lbCAhPSBjaGFuKSwKKwkJCQkJbm9fd2FpdF9yZXNlcnZlLCBub193YWl0X2dwdSwgbmV3X21lbSk7CiAJbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKSZmZW5jZSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTcxMSw4ICs3MTEsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogU29mdHdhcmUgY29weSBpZiB0aGUgY2FyZCBpc24ndCB1cCBhbmQgcnVubmluZyB5ZXQuICovCi0JaWYgKGRldl9wcml2LT5pbml0X3N0YXRlICE9IE5PVVZFQVVfQ0FSRF9JTklUX0RPTkUgfHwKLQkgICAgIWRldl9wcml2LT5jaGFubmVsKSB7CisJaWYgKCFkZXZfcHJpdi0+Y2hhbm5lbCkgewogCQlyZXQgPSB0dG1fYm9fbW92ZV9tZW1jcHkoYm8sIGV2aWN0LCBub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNzgzLDcgKzc4Miw3IEBACiAJCWJyZWFrOwogCWNhc2UgVFRNX1BMX1ZSQU06CiAJCW1lbS0+YnVzLm9mZnNldCA9IG1lbS0+bW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKLQkJbWVtLT5idXMuYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKKwkJbWVtLT5idXMuYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOwogCQltZW0tPmJ1cy5pc19pb21lbSA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NhbGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2FsYy5jCmluZGV4IDg4ZjliYzAuLmNhODVkYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2FsYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2FsYy5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAlzdHJ1Y3QgbnZfc2ltX3N0YXRlIHNpbV9kYXRhOwogCWludCBNQ2xrID0gbm91dmVhdV9od19nZXRfY2xvY2soZGV2LCBNUExMKTsKIAlpbnQgTlZDbGsgPSBub3V2ZWF1X2h3X2dldF9jbG9jayhkZXYsIE5WUExMKTsKLQl1aW50MzJfdCBjZmcxID0gbnZSZWFkRkIoZGV2LCBOVl9QRkJfQ0ZHMSk7CisJdWludDMyX3QgY2ZnMSA9IG52UmVhZEZCKGRldiwgTlYwNF9QRkJfQ0ZHMSk7CiAKIAlzaW1fZGF0YS5wY2xrX2toeiA9IFZDbGs7CiAJc2ltX2RhdGEubWNsa19raHogPSBNQ2xrOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCXNpbV9kYXRhLm1lbV9sYXRlbmN5ID0gMzsKIAkJc2ltX2RhdGEubWVtX3BhZ2VfbWlzcyA9IDEwOwogCX0gZWxzZSB7Ci0JCXNpbV9kYXRhLm1lbW9yeV90eXBlID0gbnZSZWFkRkIoZGV2LCBOVl9QRkJfQ0ZHMCkgJiAweDE7CisJCXNpbV9kYXRhLm1lbW9yeV90eXBlID0gbnZSZWFkRkIoZGV2LCBOVjA0X1BGQl9DRkcwKSAmIDB4MTsKIAkJc2ltX2RhdGEubWVtb3J5X3dpZHRoID0gKG52UmVhZEVYVERFVihkZXYsIE5WX1BFWFRERVZfQk9PVF8wKSAmIDB4MTApID8gMTI4IDogNjQ7CiAJCXNpbV9kYXRhLm1lbV9sYXRlbmN5ID0gY2ZnMSAmIDB4ZjsKIAkJc2ltX2RhdGEubWVtX3BhZ2VfbWlzcyA9ICgoY2ZnMSA+PiA0KSAmIDB4ZikgKyAoKGNmZzEgPj4gMzEpICYgMHgxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2hhbm5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMKaW5kZXggMWZjNTdlZi4uOTBmZGNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMKQEAgLTYyLDcgKzYyLDggQEAKIAkJICogVlJBTS4KIAkJICovCiAJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKLQkJCQkJICAgICBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCisJCQkJCSAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwKKwkJCQkJICAgICAxKSwKIAkJCQkJICAgICBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCiAJCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19STywKIAkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1BDSSwgJnB1c2hidWYpOwpAQCAtMjU3LDkgKzI1OCw3IEBACiAJbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfZmluaShjaGFuKTsKIAogCS8qIEdpdmUgb3V0c3RhbmRpbmcgcHVzaCBidWZmZXJzIGEgY2hhbmNlIHRvIGNvbXBsZXRlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKIAlub3V2ZWF1X2ZlbmNlX3VwZGF0ZShjaGFuKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CiAJaWYgKGNoYW4tPmZlbmNlLnNlcXVlbmNlICE9IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjaykgewogCQlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBOVUxMOwogCkBAIC0zNjgsOCArMzY3LDYgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCWludCByZXQ7CiAKLQlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOwotCiAJaWYgKGRldl9wcml2LT5lbmdpbmUuZ3JhcGguYWNjZWxfYmxvY2tlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTQxOCw3ICs0MTUsNiBAQAogCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgKmNmcmVlID0gZGF0YTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCi0JTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKIAlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4oY2ZyZWUtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CiAKIAlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCmluZGV4IDE0OWVkMjIuLjczNGU5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYwpAQCAtMTAyLDYzICsxMDIsMTUgQEAKIAlrZnJlZShkcm1fY29ubmVjdG9yKTsKIH0KIAotc3RhdGljIHZvaWQKLW5vdXZlYXVfY29ubmVjdG9yX2RkY19wcmVwYXJlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCAqZmxhZ3MpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCXJldHVybjsKLQotCSpmbGFncyA9IDA7Ci0JaWYgKE5WTG9ja1ZnYUNydGNzKGRldl9wcml2LT5kZXYsIGZhbHNlKSkKLQkJKmZsYWdzIHw9IDE7Ci0JaWYgKG52X2hlYWRzX3RpZWQoZGV2X3ByaXYtPmRldikpCi0JCSpmbGFncyB8PSAyOwotCi0JaWYgKCpmbGFncyAmIDIpCi0JCU5WU2V0T3duZXIoZGV2X3ByaXYtPmRldiwgMCk7IC8qIG5lY2Vzc2FyeT8gKi8KLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfY29ubmVjdG9yX2RkY19maW5pc2goc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IGZsYWdzKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQotCQlyZXR1cm47Ci0KLQlpZiAoZmxhZ3MgJiAyKQotCQlOVlNldE93bmVyKGRldl9wcml2LT5kZXYsIDQpOwotCWlmIChmbGFncyAmIDEpCi0JCU5WTG9ja1ZnYUNydGNzKGRldl9wcml2LT5kZXYsIHRydWUpOwotfQotCiBzdGF0aWMgc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKgogbm91dmVhdV9jb25uZWN0b3JfZGRjX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAogCQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoqcG52X2VuY29kZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwotCXVpbnQ4X3Qgb3V0X2J1ZltdID0geyAweDAsIDB4MH0sIGJ1ZlsyXTsKLQlpbnQgcmV0LCBmbGFncywgaTsKLQotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgPSAweDUwLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSAxLAotCQkJLmJ1ZiA9IG91dF9idWYsCi0JCX0sCi0JCXsKLQkJCS5hZGRyID0gMHg1MCwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiA9IDEsCi0JCQkuYnVmID0gYnVmLAotCQl9Ci0JfTsKKwlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKLQkJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IE5VTEw7CisJCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmM7CiAJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CiAJCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKIAkJaW50IGlkOwpAQCAtMTcxLDE3ICsxMjMsOSBAQAogCQlpZiAoIW9iaikKIAkJCWNvbnRpbnVlOwogCQludl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKG9ial90b19lbmNvZGVyKG9iaikpOworCQlpMmMgPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOwogCi0JCWlmIChudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCA8IDB4ZikKLQkJCWkyYyA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCk7Ci0JCWlmICghaTJjKQotCQkJY29udGludWU7Ci0KLQkJbm91dmVhdV9jb25uZWN0b3JfZGRjX3ByZXBhcmUoY29ubmVjdG9yLCAmZmxhZ3MpOwotCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmkyYy0+YWRhcHRlciwgbXNncywgMik7Ci0JCW5vdXZlYXVfY29ubmVjdG9yX2RkY19maW5pc2goY29ubmVjdG9yLCBmbGFncyk7Ci0KLQkJaWYgKHJldCA9PSAyKSB7CisJCWlmIChpMmMgJiYgbm91dmVhdV9wcm9iZV9pMmNfYWRkcihpMmMsIDB4NTApKSB7CiAJCQkqcG52X2VuY29kZXIgPSBudl9lbmNvZGVyOwogCQkJcmV0dXJuIGkyYzsKIAkJfQpAQCAtMjM0LDIxICsxNzgsNyBAQAogCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gTlVMTDsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjOwotCWludCB0eXBlLCBmbGFnczsKLQotCWlmIChudl9jb25uZWN0b3ItPmRjYi0+dHlwZSA9PSBEQ0JfQ09OTkVDVE9SX0xWRFMpCi0JCW52X2VuY29kZXIgPSBmaW5kX2VuY29kZXJfYnlfdHlwZShjb25uZWN0b3IsIE9VVFBVVF9MVkRTKTsKLQlpZiAobnZfZW5jb2RlciAmJiBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7Ci0JCXVuc2lnbmVkIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQUNQSV9CVVRUT04pIHx8IFwKLQkoZGVmaW5lZChDT05GSUdfQUNQSV9CVVRUT05fTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi0JCWlmICghbm91dmVhdV9pZ25vcmVsaWQgJiYgIWFjcGlfbGlkX29wZW4oKSkKLQkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKLSNlbmRpZgotCQlub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfZW5jb2Rlcihjb25uZWN0b3IsIG52X2VuY29kZXIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KKwlpbnQgdHlwZTsKIAogCS8qIENsZWFudXAgdGhlIHByZXZpb3VzIEVESUQgYmxvY2suICovCiAJaWYgKG52X2Nvbm5lY3Rvci0+ZWRpZCkgewpAQCAtMjU5LDkgKzE4OSw3IEBACiAKIAlpMmMgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfZGV0ZWN0KGNvbm5lY3RvciwgJm52X2VuY29kZXIpOwogCWlmIChpMmMpIHsKLQkJbm91dmVhdV9jb25uZWN0b3JfZGRjX3ByZXBhcmUoY29ubmVjdG9yLCAmZmxhZ3MpOwogCQludl9jb25uZWN0b3ItPmVkaWQgPSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCAmaTJjLT5hZGFwdGVyKTsKLQkJbm91dmVhdV9jb25uZWN0b3JfZGRjX2ZpbmlzaChjb25uZWN0b3IsIGZsYWdzKTsKIAkJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwKIAkJCQkJCQludl9jb25uZWN0b3ItPmVkaWQpOwogCQlpZiAoIW52X2Nvbm5lY3Rvci0+ZWRpZCkgewpAQCAtMzIxLDYgKzI0OSw4NSBAQAogCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIH0KIAorc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK25vdXZlYXVfY29ubmVjdG9yX2RldGVjdF9sdmRzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBOVUxMOworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisKKwkvKiBDbGVhbnVwIHRoZSBwcmV2aW91cyBFRElEIGJsb2NrLiAqLworCWlmIChudl9jb25uZWN0b3ItPmVkaWQpIHsKKwkJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgTlVMTCk7CisJCWtmcmVlKG52X2Nvbm5lY3Rvci0+ZWRpZCk7CisJCW52X2Nvbm5lY3Rvci0+ZWRpZCA9IE5VTEw7CisJfQorCisJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcl9ieV90eXBlKGNvbm5lY3RvciwgT1VUUFVUX0xWRFMpOworCWlmICghbnZfZW5jb2RlcikKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCisJLyogVHJ5IHJldHJpZXZpbmcgRURJRCB2aWEgRERDICovCisJaWYgKCFkZXZfcHJpdi0+dmJpb3MuZnBfbm9fZGRjKSB7CisJCXN0YXR1cyA9IG5vdXZlYXVfY29ubmVjdG9yX2RldGVjdChjb25uZWN0b3IpOworCQlpZiAoc3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogT24gc29tZSBsYXB0b3BzIChTb255LCBpJ20gbG9va2luZyBhdCB5b3UpIHRoZXJlIGFwcGVhcnMgdG8KKwkgKiBiZSBubyBkaXJlY3Qgd2F5IG9mIGFjY2Vzc2luZyB0aGUgcGFuZWwncyBFRElELiAgVGhlIG9ubHkKKwkgKiBvcHRpb24gYXZhaWxhYmxlIHRvIHVzIGFwcGVhcnMgdG8gYmUgdG8gYXNrIEFDUEkgZm9yIGhlbHAuLgorCSAqCisJICogSXQncyBpbXBvcnRhbnQgdGhpcyBjaGVjaydzIGJlZm9yZSB0cnlpbmcgc3RyYXBzLCBvbmUgb2YgdGhlCisJICogc2FpZCBtYW51ZmFjdHVyZXIncyBsYXB0b3BzIGFyZSBjb25maWd1cmVkIGluIHN1Y2ggYSB3YXkKKwkgKiB0aGUgbm91dmVhdSBkZWNpZGVzIGFuIGVudHJ5IGluIHRoZSBWQklPUyBGUCBtb2RlIHRhYmxlIGlzCisJICogdmFsaWQgLSBpdCdzIG5vdCAocmgjNjEzMjg0KQorCSAqLworCWlmIChudl9lbmNvZGVyLT5kY2ItPmx2ZHNjb25mLnVzZV9hY3BpX2Zvcl9lZGlkKSB7CisJCWlmICghbm91dmVhdV9hY3BpX2VkaWQoZGV2LCBjb25uZWN0b3IpKSB7CisJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogSWYgbm8gRURJRCBmb3VuZCBhYm92ZSwgYW5kIHRoZSBWQklPUyBpbmRpY2F0ZXMgYSBoYXJkY29kZWQKKwkgKiBtb2RlbGluZSBpcyBhdmFsaWxhYmxlIGZvciB0aGUgcGFuZWwsIHNldCBpdCBhcyB0aGUgcGFuZWwncworCSAqIG5hdGl2ZSBtb2RlIGFuZCBleGl0LgorCSAqLworCWlmIChub3V2ZWF1X2Jpb3NfZnBfbW9kZShkZXYsIE5VTEwpICYmIChkZXZfcHJpdi0+dmJpb3MuZnBfbm9fZGRjIHx8CisJICAgIG52X2VuY29kZXItPmRjYi0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSkpIHsKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFN0aWxsIG5vdGhpbmcsIHNvbWUgVkJJT1MgaW1hZ2VzIGhhdmUgYSBoYXJkY29kZWQgRURJRCBibG9jaworCSAqIHN0b3JlZCBmb3IgdGhlIHBhbmVsIHN0b3JlZCBpbiB0aGVtLgorCSAqLworCWlmICghZGV2X3ByaXYtPnZiaW9zLmZwX25vX2RkYykgeworCQlzdHJ1Y3QgZWRpZCAqZWRpZCA9CisJCQkoc3RydWN0IGVkaWQgKilub3V2ZWF1X2Jpb3NfZW1iZWRkZWRfZWRpZChkZXYpOworCQlpZiAoZWRpZCkgeworCQkJbnZfY29ubmVjdG9yLT5lZGlkID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJCQkqKG52X2Nvbm5lY3Rvci0+ZWRpZCkgPSAqZWRpZDsKKwkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQl9CisJfQorCitvdXQ6CisjaWYgZGVmaW5lZChDT05GSUdfQUNQSV9CVVRUT04pIHx8IFwKKwkoZGVmaW5lZChDT05GSUdfQUNQSV9CVVRUT05fTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCisJaWYgKHN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCAmJgorCSAgICAhbm91dmVhdV9pZ25vcmVsaWQgJiYgIWFjcGlfbGlkX29wZW4oKSkKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworI2VuZGlmCisKKwlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBudl9jb25uZWN0b3ItPmVkaWQpOworCW5vdXZlYXVfY29ubmVjdG9yX3NldF9lbmNvZGVyKGNvbm5lY3RvciwgbnZfZW5jb2Rlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIHZvaWQKIG5vdXZlYXVfY29ubmVjdG9yX2ZvcmNlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CkBAIC00NDEsNyArNDQ4LDggQEAKIAlpbnQgaGlnaF93ID0gMCwgaGlnaF9oID0gMCwgaGlnaF92ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJm52X2Nvbm5lY3Rvci0+YmFzZS5wcm9iZWRfbW9kZXMsIGhlYWQpIHsKLQkJaWYgKGhlbHBlci0+bW9kZV92YWxpZChjb25uZWN0b3IsIG1vZGUpICE9IE1PREVfT0spCisJCWlmIChoZWxwZXItPm1vZGVfdmFsaWQoY29ubmVjdG9yLCBtb2RlKSAhPSBNT0RFX09LIHx8CisJCSAgICAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkpCiAJCQljb250aW51ZTsKIAogCQkvKiBVc2UgcHJlZmVycmVkIG1vZGUgaWYgdGhlcmUgaXMgb25lLi4gKi8KQEAgLTUzNCwyMSArNTQyLDI3IEBACiBub3V2ZWF1X2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG52X2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfZW5jb2RlcjsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIElmIHdlJ3JlIG5vdCBMVkRTLCBkZXN0cm95IHRoZSBwcmV2aW91cyBuYXRpdmUgbW9kZSwgdGhlIGF0dGFjaGVkCi0JICogbW9uaXRvciBjb3VsZCBoYXZlIGNoYW5nZWQuCisJLyogZGVzdHJveSB0aGUgbmF0aXZlIG1vZGUsIHRoZSBhdHRhY2hlZCBtb25pdG9yIGNvdWxkIGhhdmUgY2hhbmdlZC4KIAkgKi8KLQlpZiAobnZfY29ubmVjdG9yLT5kY2ItPnR5cGUgIT0gRENCX0NPTk5FQ1RPUl9MVkRTICYmCi0JICAgIG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwlpZiAobnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgewogCQlkcm1fbW9kZV9kZXN0cm95KGRldiwgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSk7CiAJCW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUgPSBOVUxMOwogCX0KIAogCWlmIChudl9jb25uZWN0b3ItPmVkaWQpCiAJCXJldCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIG52X2Nvbm5lY3Rvci0+ZWRpZCk7CisJZWxzZQorCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMgJiYKKwkgICAgKG52X2VuY29kZXItPmRjYi0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSB8fAorCSAgICAgZGV2X3ByaXYtPnZiaW9zLmZwX25vX2RkYykgJiYgbm91dmVhdV9iaW9zX2ZwX21vZGUoZGV2LCBOVUxMKSkgeworCQludl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlID0gZHJtX21vZGVfY3JlYXRlKGRldik7CisJCW5vdXZlYXVfYmlvc19mcF9tb2RlKGRldiwgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSk7CisJfQogCiAJLyogRmluZCB0aGUgbmF0aXZlIG1vZGUgaWYgdGhpcyBpcyBhIGRpZ2l0YWwgcGFuZWwsIGlmIHdlIGRpZG4ndAogCSAqIGZpbmQgYW55IG1vZGVzIHRocm91Z2ggRERDIHByZXZpb3VzbHkgYWRkIHRoZSBuYXRpdmUgbW9kZSB0bwpAQCAtNTY5LDcgKzU4Myw4IEBACiAJCXJldCA9IGdldF9zbGF2ZV9mdW5jcyhudl9lbmNvZGVyKS0+CiAJCQlnZXRfbW9kZXModG9fZHJtX2VuY29kZXIobnZfZW5jb2RlciksIGNvbm5lY3Rvcik7CiAKLQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9MVkRTKQorCWlmIChudl9jb25uZWN0b3ItPmRjYi0+dHlwZSA9PSBEQ0JfQ09OTkVDVE9SX0xWRFMgfHwKKwkgICAgbnZfY29ubmVjdG9yLT5kY2ItPnR5cGUgPT0gRENCX0NPTk5FQ1RPUl9lRFApCiAJCXJldCArPSBub3V2ZWF1X2Nvbm5lY3Rvcl9zY2FsZXJfbW9kZXNfYWRkKGNvbm5lY3Rvcik7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjQzLDYgKzY1OCw0NCBAQAogCXJldHVybiBOVUxMOwogfQogCit2b2lkCitub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfcG9sbGluZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlib29sIHNwYXJlX2NydGMgPSBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQorCQlzcGFyZV9jcnRjIHw9ICFjcnRjLT5lbmFibGVkOworCisJY29ubmVjdG9yLT5wb2xsZWQgPSAwOworCisJc3dpdGNoIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1RWOgorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCB8fAorCQkgICAgKG52X2dmNF9kaXNwX2FyY2goZGV2KSAmJiBzcGFyZV9jcnRjKSkKKwkJCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0NPTk5FQ1Q7CisJCWJyZWFrOworCisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0OgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX2VEUDoKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7CisJCWVsc2UgaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQgfHwKKwkJCSBzcGFyZV9jcnRjKQorCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MKIG5vdXZlYXVfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gbm91dmVhdV9jb25uZWN0b3JfZ2V0X21vZGVzLApAQCAtNjYyLDE0OCArNzE1LDc0IEBACiAJLmZvcmNlID0gbm91dmVhdV9jb25uZWN0b3JfZm9yY2UKIH07CiAKLXN0YXRpYyBpbnQKLW5vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZV9sdmRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQorc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzCitub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jc19sdmRzID0geworCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKKwkuc2F2ZSA9IE5VTEwsCisJLnJlc3RvcmUgPSBOVUxMLAorCS5kZXRlY3QgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9kZXRlY3RfbHZkcywKKwkuZGVzdHJveSA9IG5vdXZlYXVfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLnNldF9wcm9wZXJ0eSA9IG5vdXZlYXVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSwKKwkuZm9yY2UgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9mb3JjZQorfTsKKworc3RydWN0IGRybV9jb25uZWN0b3IgKgorbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbmRleCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gTlVMTDsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOwotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG5hdGl2ZSwgKm1vZGUsICp0ZW1wOwotCWJvb2wgZHVtbXksIGlmX2lzXzI0Yml0ID0gZmFsc2U7Ci0JaW50IHJldCwgZmxhZ3M7Ci0KLQludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyX2J5X3R5cGUoY29ubmVjdG9yLCBPVVRQVVRfTFZEUyk7Ci0JaWYgKCFudl9lbmNvZGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldCA9IG5vdXZlYXVfYmlvc19wYXJzZV9sdmRzX3RhYmxlKGRldiwgMCwgJmR1bW15LCAmaWZfaXNfMjRiaXQpOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcGFyc2luZyBMVkRTIHRhYmxlLCBkaXNhYmxpbmcgTFZEU1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCW52X2Nvbm5lY3Rvci0+dXNlX2RpdGhlcmluZyA9ICFpZl9pc18yNGJpdDsKLQotCS8qIEZpcnN0bHkgdHJ5IGdldHRpbmcgRURJRCBvdmVyIEREQywgaWYgYWxsb3dlZCBhbmQgSTJDIGNoYW5uZWwKLQkgKiBpcyBhdmFpbGFibGUuCi0JICovCi0JaWYgKCFkZXZfcHJpdi0+dmJpb3MuZnBfbm9fZGRjICYmIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4IDwgMHhmKQotCQlpMmMgPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOwotCi0JaWYgKGkyYykgewotCQlub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfcHJlcGFyZShjb25uZWN0b3IsICZmbGFncyk7Ci0JCW52X2Nvbm5lY3Rvci0+ZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZpMmMtPmFkYXB0ZXIpOwotCQlub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfZmluaXNoKGNvbm5lY3RvciwgZmxhZ3MpOwotCX0KLQotCS8qIElmIG5vIEVESUQgZm91bmQgYWJvdmUsIGFuZCB0aGUgVkJJT1MgaW5kaWNhdGVzIGEgaGFyZGNvZGVkCi0JICogbW9kZWxpbmUgaXMgYXZhbGlsYWJsZSBmb3IgdGhlIHBhbmVsLCBzZXQgaXQgYXMgdGhlIHBhbmVsJ3MKLQkgKiBuYXRpdmUgbW9kZSBhbmQgZXhpdC4KLQkgKi8KLQlpZiAoIW52X2Nvbm5lY3Rvci0+ZWRpZCAmJiBub3V2ZWF1X2Jpb3NfZnBfbW9kZShkZXYsICZuYXRpdmUpICYmCi0JICAgICAobnZfZW5jb2Rlci0+ZGNiLT5sdmRzY29uZi51c2Vfc3RyYXBzX2Zvcl9tb2RlIHx8Ci0JICAgICAgZGV2X3ByaXYtPnZiaW9zLmZwX25vX2RkYykpIHsKLQkJbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsICZuYXRpdmUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBTdGlsbCBub3RoaW5nLCBzb21lIFZCSU9TIGltYWdlcyBoYXZlIGEgaGFyZGNvZGVkIEVESUQgYmxvY2sKLQkgKiBzdG9yZWQgZm9yIHRoZSBwYW5lbCBzdG9yZWQgaW4gdGhlbS4KLQkgKi8KLQlpZiAoIW52X2Nvbm5lY3Rvci0+ZWRpZCAmJiAhbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSAmJgotCSAgICAhZGV2X3ByaXYtPnZiaW9zLmZwX25vX2RkYykgewotCQlzdHJ1Y3QgZWRpZCAqZWRpZCA9Ci0JCQkoc3RydWN0IGVkaWQgKilub3V2ZWF1X2Jpb3NfZW1iZWRkZWRfZWRpZChkZXYpOwotCQlpZiAoZWRpZCkgewotCQkJbnZfY29ubmVjdG9yLT5lZGlkID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7Ci0JCQkqKG52X2Nvbm5lY3Rvci0+ZWRpZCkgPSAqZWRpZDsKLQkJfQotCX0KLQotCWlmICghbnZfY29ubmVjdG9yLT5lZGlkKQotCQlnb3RvIG91dDsKLQotCS8qIFdlIGRpZG4ndCBmaW5kL3VzZSBhIHBhbmVsIG1vZGUgZnJvbSB0aGUgVkJJT1MsIHNvIHBhcnNlIHRoZSBFRElECi0JICogYmxvY2sgYW5kIGxvb2sgZm9yIHRoZSBwcmVmZXJyZWQgbW9kZSB0aGVyZS4KLQkgKi8KLQlyZXQgPSBkcm1fYWRkX2VkaWRfbW9kZXMoY29ubmVjdG9yLCBudl9jb25uZWN0b3ItPmVkaWQpOwotCWlmIChyZXQgPT0gMCkKLQkJZ290byBvdXQ7Ci0JbnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyID0gbnZfZW5jb2RlcjsKLQludl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlID0gbm91dmVhdV9jb25uZWN0b3JfbmF0aXZlX21vZGUoY29ubmVjdG9yKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kZSwgdGVtcCwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKQotCQlkcm1fbW9kZV9yZW1vdmUoY29ubmVjdG9yLCBtb2RlKTsKLQotb3V0OgotCWlmICghbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgewotCQlOVl9FUlJPUihkZXYsICJMVkRTIHByZXNlbnQgaW4gRENCIHRhYmxlLCBidXQgY291bGRuJ3QgIgotCQkJICAgICAgImRldGVybWluZSBpdHMgbmF0aXZlIG1vZGUuICBEaXNhYmxpbmcuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgbnZfY29ubmVjdG9yLT5lZGlkKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1ub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZV9lbnRyeSAqZGNiKQoteworCWNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzICpmdW5jcyA9ICZub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jczsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gTlVMTDsKKwlzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZV9lbnRyeSAqZGNiID0gTlVMTDsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKLQlpbnQgcmV0LCB0eXBlOworCWludCB0eXBlLCByZXQgPSAwOwogCiAJTlZfREVCVUdfS01TKGRldiwgIlxuIik7CiAKKwlpZiAoaW5kZXggPj0gZGV2X3ByaXYtPnZiaW9zLmRjYi5jb25uZWN0b3IuZW50cmllcykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlkY2IgPSAmZGV2X3ByaXYtPnZiaW9zLmRjYi5jb25uZWN0b3IuZW50cnlbaW5kZXhdOworCWlmIChkY2ItPmRybSkKKwkJcmV0dXJuIGRjYi0+ZHJtOworCiAJc3dpdGNoIChkY2ItPnR5cGUpIHsKLQljYXNlIERDQl9DT05ORUNUT1JfTk9ORToKLQkJcmV0dXJuIDA7CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1ZHQToKLQkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIFZHQSBjb25uZWN0b3JcbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1RWXzA6CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1RWXzE6CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1RWXzM6Ci0JCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBUViBjb25uZWN0b3JcbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1RWOwogCQlicmVhazsKIAljYXNlIERDQl9DT05ORUNUT1JfRFZJX0k6Ci0JCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBEVkktSSBjb25uZWN0b3JcbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUk7CiAJCWJyZWFrOwogCWNhc2UgRENCX0NPTk5FQ1RPUl9EVklfRDoKLQkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIERWSS1EIGNvbm5lY3RvclxuIik7CiAJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX0hETUlfMDoKIAljYXNlIERDQl9DT05ORUNUT1JfSERNSV8xOgotCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgSERNSSBjb25uZWN0b3JcbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOwogCQlicmVhazsKIAljYXNlIERDQl9DT05ORUNUT1JfTFZEUzoKLQkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIExWRFMgY29ubmVjdG9yXG4iKTsKIAkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOworCQlmdW5jcyA9ICZub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jc19sdmRzOwogCQlicmVhazsKIAljYXNlIERDQl9DT05ORUNUT1JfRFA6Ci0JCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBEaXNwbGF5UG9ydCBjb25uZWN0b3JcbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0OwogCQlicmVhazsKIAljYXNlIERDQl9DT05ORUNUT1JfZURQOgotCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGFuIGVEUCBjb25uZWN0b3JcbiIpOwogCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX2VEUDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJTlZfRVJST1IoZGV2LCAidW5rbm93biBjb25uZWN0b3IgdHlwZTogMHglMDJ4ISFcbiIsIGRjYi0+dHlwZSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKIAludl9jb25uZWN0b3IgPSBremFsbG9jKHNpemVvZigqbnZfY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudl9jb25uZWN0b3IpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAludl9jb25uZWN0b3ItPmRjYiA9IGRjYjsKIAljb25uZWN0b3IgPSAmbnZfY29ubmVjdG9yLT5iYXNlOwogCkBAIC04MTEsMjcgKzc5MCwyMSBAQAogCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKIAljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IGZhbHNlOwogCi0JZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLCAmbm91dmVhdV9jb25uZWN0b3JfZnVuY3MsIHR5cGUpOworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgZnVuY3MsIHR5cGUpOwogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZub3V2ZWF1X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwogCi0JLyogYXR0YWNoIGVuY29kZXJzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKLQkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIGRpdGhlcmluZyBlbmFibGVkICovCisJaWYgKGRjYi0+dHlwZSA9PSBEQ0JfQ09OTkVDVE9SX0xWRFMpIHsKKwkJYm9vbCBkdW1teSwgaXNfMjRiaXQgPSBmYWxzZTsKIAotCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5jb25uZWN0b3IgIT0gZGNiLT5pbmRleCkKLQkJCWNvbnRpbnVlOworCQlyZXQgPSBub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShkZXYsIDAsICZkdW1teSwgJmlzXzI0Yml0KTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcGFyc2luZyBMVkRTIHRhYmxlLCBkaXNhYmxpbmcgIgorCQkJCSAiTFZEU1xuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KIAotCQlpZiAoZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpKQotCQkJZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpLT5jcmVhdGVfcmVzb3VyY2VzKGVuY29kZXIsIGNvbm5lY3Rvcik7Ci0KLQkJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7Ci0JfQotCi0JaWYgKCFjb25uZWN0b3ItPmVuY29kZXJfaWRzWzBdKSB7Ci0JCU5WX1dBUk4oZGV2LCAiICBubyBlbmNvZGVycywgaWdub3JpbmdcbiIpOwotCQlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKLQkJa2ZyZWUoY29ubmVjdG9yKTsKLQkJcmV0dXJuIDA7CisJCW52X2Nvbm5lY3Rvci0+dXNlX2RpdGhlcmluZyA9ICFpc18yNGJpdDsKIAl9CiAKIAkvKiBJbml0IERWSS1JIHNwZWNpZmljIHByb3BlcnRpZXMgKi8KQEAgLTg0MSwxMiArODE0LDggQEAKIAkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBkZXYtPm1vZGVfY29uZmlnLmR2aV9pX3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHksIDApOwogCX0KIAotCWlmIChkY2ItPnR5cGUgIT0gRENCX0NPTk5FQ1RPUl9MVkRTKQotCQludl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPSBmYWxzZTsKLQogCXN3aXRjaCAoZGNiLT50eXBlKSB7CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1ZHQToKLQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKIAkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKIAkJCQkJZGV2LT5tb2RlX2NvbmZpZy5zY2FsaW5nX21vZGVfcHJvcGVydHksCkBAIC04NTgsMTcgKzgyNyw2IEBACiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1RWXzM6CiAJCW52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlID0gRFJNX01PREVfU0NBTEVfTk9ORTsKIAkJYnJlYWs7Ci0JY2FzZSBEQ0JfQ09OTkVDVE9SX0RQOgotCWNhc2UgRENCX0NPTk5FQ1RPUl9lRFA6Ci0JY2FzZSBEQ0JfQ09OTkVDVE9SX0hETUlfMDoKLQljYXNlIERDQl9DT05ORUNUT1JfSERNSV8xOgotCWNhc2UgRENCX0NPTk5FQ1RPUl9EVklfSToKLQljYXNlIERDQl9DT05ORUNUT1JfRFZJX0Q6Ci0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQotCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwotCQllbHNlCi0JCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9DT05ORUNUOwotCQkvKiBmYWxsLXRocm91Z2ggKi8KIAlkZWZhdWx0OgogCQludl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSA9IERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU47CiAKQEAgLTg4MiwxNSArODQwLDE1IEBACiAJCWJyZWFrOwogCX0KIAorCW5vdXZlYXVfY29ubmVjdG9yX3NldF9wb2xsaW5nKGNvbm5lY3Rvcik7CisKIAlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCWRjYi0+ZHJtID0gY29ubmVjdG9yOworCXJldHVybiBkY2ItPmRybTsKIAotCWlmIChkY2ItPnR5cGUgPT0gRENCX0NPTk5FQ1RPUl9MVkRTKSB7Ci0JCXJldCA9IG5vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZV9sdmRzKGRldiwgY29ubmVjdG9yKTsKLQkJaWYgKHJldCkgewotCQkJY29ubmVjdG9yLT5mdW5jcy0+ZGVzdHJveShjb25uZWN0b3IpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KK2ZhaWw6CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogCi0JcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuaAppbmRleCA0ZWYzOGFiLi4wZDJlNjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmgKQEAgLTQ5LDcgKzQ5LDEwIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihjb24sIHN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciwgYmFzZSk7CiB9CiAKLWludCBub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwKLQkJCSAgICAgc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgKik7CitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqCitub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGluZGV4KTsKKwordm9pZAorbm91dmVhdV9jb25uZWN0b3Jfc2V0X3BvbGxpbmcoc3RydWN0IGRybV9jb25uZWN0b3IgKik7CiAKICNlbmRpZiAvKiBfX05PVVZFQVVfQ09OTkVDVE9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmMKaW5kZXggNjVjNDQxYS4uMmUzYzZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jCkBAIC05MiwxMSArOTIsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogTWFwIE0yTUYgbm90aWZpZXIgb2JqZWN0IC0gZmJjb24uICovCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJcmV0ID0gbm91dmVhdV9ib19tYXAoY2hhbi0+bm90aWZpZXJfYm8pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9CisJcmV0ID0gbm91dmVhdV9ib19tYXAoY2hhbi0+bm90aWZpZXJfYm8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBJbnNlcnQgTk9QUyBmb3IgTk9VVkVBVV9ETUFfU0tJUFMgKi8KIAlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIE5PVVZFQVVfRE1BX1NLSVBTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwppbmRleCBkZWViMjFjLi4zMzc0MmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCkBAIC0yMyw4ICsyMywxMCBAQAogICovCiAKICNpbmNsdWRlICJkcm1QLmgiCisKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfaTJjLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKICNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKIAogc3RhdGljIGludApAQCAtMjcwLDEzICsyNzIsMzkgQEAKIG5vdXZlYXVfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CiAJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQl1aW50OF90IGNvbmZpZ1s0XTsKLQl1aW50OF90IHN0YXR1c1szXTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvcjsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKKwlpbnQgZHBlX2hlYWRlcmxlbjsKKwl1aW50OF90IGNvbmZpZ1s0XSwgc3RhdHVzWzNdOwogCWJvb2wgY3JfZG9uZSwgY3JfbWF4X3ZzLCBlcV9kb25lOwogCWludCByZXQgPSAwLCBpLCB0cmllcywgdm9sdGFnZTsKIAogCU5WX0RFQlVHX0tNUyhkZXYsICJsaW5rIHRyYWluaW5nISFcbiIpOworCisJbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJaWYgKCFudl9jb25uZWN0b3IpCisJCXJldHVybiBmYWxzZTsKKworCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOworCWlmICghZHBlKSB7CisJCU5WX0VSUk9SKGRldiwgIlNPUi0lZDogbm8gRFAgZW5jb2RlciB0YWJsZSFcbiIsIG52X2VuY29kZXItPm9yKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIGRpc2FibGUgaG90cGx1ZyBkZXRlY3QsIHRoaXMgZmxpcHMgYXJvdW5kIG9uIHNvbWUgcGFuZWxzIGR1cmluZworCSAqIGxpbmsgdHJhaW5pbmcuCisJICovCisJcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIGZhbHNlKTsKKworCWlmIChkcGUtPnNjcmlwdDApIHsKKwkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMFxuIiwgbnZfZW5jb2Rlci0+b3IpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBsZTE2X3RvX2NwdShkcGUtPnNjcmlwdDApLAorCQkJCQkgICAgbnZfZW5jb2Rlci0+ZGNiKTsKKwl9CisKIHRyYWluOgogCWNyX2RvbmUgPSBlcV9kb25lID0gZmFsc2U7CiAKQEAgLTQwMyw2ICs0MzEsMTUgQEAKIAkJfQogCX0KIAorCWlmIChkcGUtPnNjcmlwdDEpIHsKKwkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMVxuIiwgbnZfZW5jb2Rlci0+b3IpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBsZTE2X3RvX2NwdShkcGUtPnNjcmlwdDEpLAorCQkJCQkgICAgbnZfZW5jb2Rlci0+ZGNiKTsKKwl9CisKKwkvKiByZS1lbmFibGUgaG90cGx1ZyBkZXRlY3QgKi8KKwlwZ3Bpby0+aXJxX2VuYWJsZShkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZywgdHJ1ZSk7CisKIAlyZXR1cm4gZXFfZG9uZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKaW5kZXggMjczNzcwNC4uMWRlNWViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jCkBAIC0zNSwxMCArMzUsNiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1NT0RVTEVfUEFSTV9ERVNDKGN0eGZ3LCAiVXNlIGV4dGVybmFsIGZpcm13YXJlIGJsb2IgZm9yIGdyY3R4IGluaXQgKE5WNDApIik7Ci1pbnQgbm91dmVhdV9jdHhmdyA9IDA7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoY3R4ZncsIG5vdXZlYXVfY3R4ZncsIGludCwgMDQwMCk7Ci0KIE1PRFVMRV9QQVJNX0RFU0Mobm9hZ3AsICJEaXNhYmxlIEFHUCIpOwogaW50IG5vdXZlYXVfbm9hZ3A7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9hZ3AsIG5vdXZlYXVfbm9hZ3AsIGludCwgMDQwMCk7CkBAIC01Niw3ICs1Miw3IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQodnJhbV9wdXNoYnVmLCBub3V2ZWF1X3ZyYW1fcHVzaGJ1ZiwgaW50LCAwNDAwKTsKIAogTU9EVUxFX1BBUk1fREVTQyh2cmFtX25vdGlmeSwgIkZvcmNlIERNQSBub3RpZmllcnMgdG8gYmUgaW4gVlJBTSIpOwotaW50IG5vdXZlYXVfdnJhbV9ub3RpZnkgPSAxOworaW50IG5vdXZlYXVfdnJhbV9ub3RpZnkgPSAwOwogbW9kdWxlX3BhcmFtX25hbWVkKHZyYW1fbm90aWZ5LCBub3V2ZWF1X3ZyYW1fbm90aWZ5LCBpbnQsIDA0MDApOwogCiBNT0RVTEVfUEFSTV9ERVNDKGR1YWxsaW5rLCAiQWxsb3cgZHVhbC1saW5rIFRNRFMgKD49R2VGb3JjZSA4KSIpOwpAQCAtMTMyLDcgKzEyOCw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdAogbm91dmVhdV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JcmV0dXJuIGRybV9nZXRfZGV2KHBkZXYsIGVudCwgJmRyaXZlcik7CisJcmV0dXJuIGRybV9nZXRfcGNpX2RldihwZGV2LCBlbnQsICZkcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTU1LDkgKzE1MSw2IEBACiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCWludCByZXQsIGk7CiAKLQlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCi0JCXJldHVybiAtRU5PREVWOwotCiAJaWYgKHBtX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpCiAJCXJldHVybiAwOwogCkBAIC0yNTcsOSArMjUwLDYgQEAKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJaW50IHJldCwgaTsKIAotCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlub3V2ZWF1X2ZiY29uX3NhdmVfZGlzYWJsZV9hY2NlbChkZXYpOwogCiAJTlZfSU5GTyhkZXYsICJXZSdyZSBiYWNrLCBlbmFibGluZyBkZXZpY2UuLi5cbiIpOwpAQCAtMjY5LDYgKzI1OSwxMyBAQAogCQlyZXR1cm4gLTE7CiAJcGNpX3NldF9tYXN0ZXIoZGV2LT5wZGV2KTsKIAorCS8qIE1ha2Ugc3VyZSB0aGUgQUdQIGNvbnRyb2xsZXIgaXMgaW4gYSBjb25zaXN0ZW50IHN0YXRlICovCisJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfQUdQKQorCQlub3V2ZWF1X21lbV9yZXNldF9hZ3AoZGV2KTsKKworCS8qIE1ha2UgdGhlIENSVENzIGFjY2Vzc2libGUgKi8KKwllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdChkZXYpOworCiAJTlZfSU5GTyhkZXYsICJQT1NUaW5nIGRldmljZS4uLlxuIik7CiAJcmV0ID0gbm91dmVhdV9ydW5fdmJpb3NfaW5pdChkZXYpOwogCWlmIChyZXQpCkBAIC0zMjMsNyArMzIwLDYgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7Ci0JCWludCByZXQ7CiAKIAkJcmV0ID0gbm91dmVhdV9ib19waW4obnZfY3J0Yy0+Y3Vyc29yLm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOwogCQlpZiAoIXJldCkKQEAgLTMzMiwxMSArMzI4LDcgQEAKIAkJCU5WX0VSUk9SKGRldiwgIkNvdWxkIG5vdCBwaW4vbWFwIGN1cnNvci5cbiIpOwogCX0KIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJbnYwNF9kaXNwbGF5X3Jlc3RvcmUoZGV2KTsKLQkJTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7Ci0JfSBlbHNlCi0JCW52NTBfZGlzcGxheV9pbml0KGRldik7CisJZW5naW5lLT5kaXNwbGF5LmluaXQoZGV2KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CkBAIC0zNzEsNyArMzYzLDggQEAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRyaXZlcl9mZWF0dXJlcyA9CiAJCURSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1BDSV9ETUEgfCBEUklWRVJfU0cgfAotCQlEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9HRU0sCisJCURSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0dFTSB8CisJCURSSVZFUl9NT0RFU0VULAogCS5sb2FkID0gbm91dmVhdV9sb2FkLAogCS5maXJzdG9wZW4gPSBub3V2ZWF1X2ZpcnN0b3BlbiwKIAkubGFzdGNsb3NlID0gbm91dmVhdV9sYXN0Y2xvc2UsCkBAIC00MzgsMTYgKzQzMSwxOCBAQAogCQkJbm91dmVhdV9tb2Rlc2V0ID0gMTsKIAl9CiAKLQlpZiAobm91dmVhdV9tb2Rlc2V0ID09IDEpIHsKLQkJZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyB8PSBEUklWRVJfTU9ERVNFVDsKLQkJbm91dmVhdV9yZWdpc3Rlcl9kc21faGFuZGxlcigpOwotCX0KKwlpZiAoIW5vdXZlYXVfbW9kZXNldCkKKwkJcmV0dXJuIDA7CiAKKwlub3V2ZWF1X3JlZ2lzdGVyX2RzbV9oYW5kbGVyKCk7CiAJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbm91dmVhdV9leGl0KHZvaWQpCiB7CisJaWYgKCFub3V2ZWF1X21vZGVzZXQpCisJCXJldHVybjsKKwogCWRybV9leGl0KCZkcml2ZXIpOwogCW5vdXZlYXVfdW5yZWdpc3Rlcl9kc21faGFuZGxlcigpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKaW5kZXggYzY5NzE5MS4uZTE1ZGIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oCkBAIC0xMjMsMTQgKzEyMyw2IEBACiAJcmV0dXJuIGlvcHRyOwogfQogCi1zdHJ1Y3QgbWVtX2Jsb2NrIHsKLQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0OwotCXN0cnVjdCBtZW1fYmxvY2sgKnByZXY7Ci0JdWludDY0X3Qgc3RhcnQ7Ci0JdWludDY0X3Qgc2l6ZTsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdjsgLyogTlVMTDogZnJlZSwgLTE6IGhlYXAsIG90aGVyOiByZWFsIGZpbGVzICovCi19OwotCiBlbnVtIG5vdXZlYXVfZmxhZ3MgewogCU5WX05GT1JDRSAgID0gMHgxMDAwMDAwMCwKIAlOVl9ORk9SQ0UyICA9IDB4MjAwMDAwMDAKQEAgLTE0OSw3ICsxNDEsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmltX2NoYW5uZWw7Ci0Jc3RydWN0IG1lbV9ibG9jayAqaW1fcHJhbWluOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqaW1fcHJhbWluOwogCXN0cnVjdCBub3V2ZWF1X2JvICppbV9iYWNraW5nOwogCXVpbnQzMl90IGltX2JhY2tpbmdfc3RhcnQ7CiAJdWludDMyX3QgKmltX2JhY2tpbmdfc3VzcGVuZDsKQEAgLTE5Niw3ICsxODgsNyBAQAogCQlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CiAJCXVpbnQzMl90IHNlcXVlbmNlOwogCQl1aW50MzJfdCBzZXF1ZW5jZV9hY2s7Ci0JCXVpbnQzMl90IGxhc3Rfc2VxdWVuY2VfaXJxOworCQlhdG9taWNfdCBsYXN0X3NlcXVlbmNlX2lycTsKIAl9IGZlbmNlOwogCiAJLyogRE1BIHB1c2ggYnVmZmVyICovCkBAIC0yMDYsNyArMTk4LDcgQEAKIAogCS8qIE5vdGlmaWVyIG1lbW9yeSAqLwogCXN0cnVjdCBub3V2ZWF1X2JvICpub3RpZmllcl9ibzsKLQlzdHJ1Y3QgbWVtX2Jsb2NrICpub3RpZmllcl9oZWFwOworCXN0cnVjdCBkcm1fbW0gbm90aWZpZXJfaGVhcDsKIAogCS8qIFBGSUZPIGNvbnRleHQgKi8KIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyYW1mYzsKQEAgLTIyNCw3ICsyMTYsNyBAQAogCiAJLyogT2JqZWN0cyAqLwogCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJhbWluOyAvKiBQcml2YXRlIGluc3RtZW0gKi8KLQlzdHJ1Y3QgbWVtX2Jsb2NrICAgICAgICAgICpyYW1pbl9oZWFwOyAvKiBQcml2YXRlIFBSQU1JTiBoZWFwICovCisJc3RydWN0IGRybV9tbSAgICAgICAgICAgICAgcmFtaW5faGVhcDsgLyogUHJpdmF0ZSBQUkFNSU4gaGVhcCAqLwogCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJhbWh0OyAvKiBIYXNoIHRhYmxlICovCiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgcmFtaHRfcmVmczsgLyogT2JqZWN0cyByZWZlcmVuY2VkIGJ5IFJBTUhUICovCiAKQEAgLTI3Nyw4ICsyNjksNyBAQAogCXZvaWQJKCpjbGVhcikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwogCWludAkoKmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKIAlpbnQJKCp1bmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLQl2b2lkCSgqcHJlcGFyZV9hY2Nlc3MpKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wgd3JpdGUpOwotCXZvaWQJKCpmaW5pc2hfYWNjZXNzKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwl2b2lkCSgqZmx1c2gpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogfTsKIAogc3RydWN0IG5vdXZlYXVfbWNfZW5naW5lIHsKQEAgLTMwMywxMCArMjk0LDExIEBACiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSB7Ci0Jdm9pZCAqcHJpdjsKLQogCWludCAgY2hhbm5lbHM7CiAKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpwbGF5bGlzdFsyXTsKKwlpbnQgY3VyX3BsYXlsaXN0OworCiAJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKQEAgLTMzOSwxMCArMzMxLDExIEBACiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lIHsKIAlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzICpncmNsYXNzOwogCWJvb2wgYWNjZWxfYmxvY2tlZDsKLQl2b2lkICpjdHhwcm9nOwotCXZvaWQgKmN0eHZhbHM7CiAJaW50IGdyY3R4X3NpemU7CiAKKwkvKiBOVjJ4L05WM3ggY29udGV4dCB0YWJsZSAoMHg0MDA3ODApICovCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqY3R4X3RhYmxlOworCiAJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKQEAgLTM1OCw2ICszNTEsMjQgQEAKIAkJCQkgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKTsKIH07CiAKK3N0cnVjdCBub3V2ZWF1X2Rpc3BsYXlfZW5naW5lIHsKKwlpbnQgKCplYXJseV9pbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwl2b2lkICgqbGF0ZV90YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKik7CisJaW50ICgqY3JlYXRlKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGRybV9kZXZpY2UgKik7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSB7CisJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOworCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKwlpbnQgICgqZ2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZyk7CisJaW50ICAoKnNldCkoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsIGludCBzdGF0ZSk7CisKKwl2b2lkICgqaXJxX2VuYWJsZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsIGJvb2wgb24pOworfTsKKwogc3RydWN0IG5vdXZlYXVfZW5naW5lIHsKIAlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSBpbnN0bWVtOwogCXN0cnVjdCBub3V2ZWF1X21jX2VuZ2luZSAgICAgIG1jOwpAQCAtMzY1LDYgKzM3Niw4IEBACiAJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICAgICAgZmI7CiAJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAgZ3JhcGg7CiAJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgICAgZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5X2VuZ2luZSBkaXNwbGF5OworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICAgIGdwaW87CiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyB7CkBAIC01MDAsMTEgKzUxMyw2IEBACiAKIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwotCWVudW0gewotCQlOT1VWRUFVX0NBUkRfSU5JVF9ET1dOLAotCQlOT1VWRUFVX0NBUkRfSU5JVF9ET05FLAotCQlOT1VWRUFVX0NBUkRfSU5JVF9GQUlMRUQKLQl9IGluaXRfc3RhdGU7CiAKIAkvKiB0aGUgY2FyZCB0eXBlLCB0YWtlcyBOVl8qIGFzIHZhbHVlcyAqLwogCWVudW0gbm91dmVhdV9jYXJkX3R5cGUgY2FyZF90eXBlOwpAQCAtNTI1LDcgKzUzMyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCB2Ymxfd2FpdGluZzsKIAogCXN0cnVjdCB7Ci0JCXN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSBtZW1fZ2xvYmFsX3JlZjsKKwkJc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlIG1lbV9nbG9iYWxfcmVmOwogCQlzdHJ1Y3QgdHRtX2JvX2dsb2JhbF9yZWYgYm9fZ2xvYmFsX3JlZjsKIAkJc3RydWN0IHR0bV9ib19kZXZpY2UgYmRldjsKIAkJc3BpbmxvY2tfdCBib19saXN0X2xvY2s7CkBAIC01MzMsOCArNTQxLDYgQEAKIAkJYXRvbWljX3QgdmFsaWRhdGVfc2VxdWVuY2U7CiAJfSB0dG07CiAKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJkZXZfaW5mbzsKLQogCWludCBmaWZvX2FsbG9jX2NvdW50OwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmZpZm9zW05PVVZFQVVfTUFYX0NIQU5ORUxfTlJdOwogCkBAIC01OTUsMTEgKzYwMSw3IEBACiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2bV92cmFtX3B0W05WNTBfVk1fVlJBTV9OUl07CiAJaW50IHZtX3ZyYW1fcHRfbnI7CiAKLQlzdHJ1Y3QgbWVtX2Jsb2NrICpyYW1pbl9oZWFwOwotCi0JLyogY29udGV4dCB0YWJsZSBwb2ludGVkIHRvIGJlIE5WX1BHUkFQSF9DSEFOTkVMX0NUWF9UQUJMRSAoMHg0MDA3ODApICovCi0JdWludDMyX3QgY3R4X3RhYmxlX3NpemU7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqY3R4X3RhYmxlOworCXN0cnVjdCBkcm1fbW0gcmFtaW5faGVhcDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgZ3B1b2JqX2xpc3Q7CiAKQEAgLTYxOCw2ICs2MjAsMTEgQEAKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0OwogCiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvOworCXN0cnVjdCB7CisJCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKKwkJdTE2IHNjcmlwdDsKKwkJdTMyIHBjbGs7CisJfSBldm9faXJxOwogCiAJc3RydWN0IHsKIAkJc3RydWN0IGRlbnRyeSAqY2hhbm5lbF9yb290OwpAQCAtNjUyLDE0ICs2NTksNiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIE5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk4gZG8geyAgICAgICAgICAgIFwKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqbnYgPSBkZXYtPmRldl9wcml2YXRlOyAgICBcCi0JaWYgKG52LT5pbml0X3N0YXRlICE9IE5PVVZFQVVfQ0FSRF9JTklUX0RPTkUpIHsgICAgICAgXAotCQlOVl9FUlJPUihkZXYsICJjYWxsZWQgd2l0aG91dCBpbml0XG4iKTsgICAgICAgXAotCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KICNkZWZpbmUgTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKGlkLCBjbCwgY2gpIGRvIHsgICAgXAogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpudiA9IGRldi0+ZGV2X3ByaXZhdGU7ICAgICAgIFwKIAlpZiAoIW5vdXZlYXVfY2hhbm5lbF9vd25lcihkZXYsIChjbCksIChpZCkpKSB7ICAgICAgICAgICBcCkBAIC02ODIsNyArNjgxLDYgQEAKIGV4dGVybiBjaGFyICpub3V2ZWF1X3R2X25vcm07CiBleHRlcm4gaW50IG5vdXZlYXVfcmVnX2RlYnVnOwogZXh0ZXJuIGNoYXIgKm5vdXZlYXVfdmJpb3M7Ci1leHRlcm4gaW50IG5vdXZlYXVfY3R4Znc7CiBleHRlcm4gaW50IG5vdXZlYXVfaWdub3JlbGlkOwogZXh0ZXJuIGludCBub3V2ZWF1X25vZmJhY2NlbDsKIGV4dGVybiBpbnQgbm91dmVhdV9ub2FjY2VsOwpAQCAtNzA3LDE3ICs3MDUsMTAgQEAKIGV4dGVybiBpbnQgIG5vdXZlYXVfY2FyZF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAvKiBub3V2ZWF1X21lbS5jICovCi1leHRlcm4gaW50ICBub3V2ZWF1X21lbV9pbml0X2hlYXAoc3RydWN0IG1lbV9ibG9jayAqKiwgdWludDY0X3Qgc3RhcnQsCi0JCQkJIHVpbnQ2NF90IHNpemUpOwotZXh0ZXJuIHN0cnVjdCBtZW1fYmxvY2sgKm5vdXZlYXVfbWVtX2FsbG9jX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKiwKLQkJCQkJCSB1aW50NjRfdCBzaXplLCBpbnQgYWxpZ24yLAotCQkJCQkJIHN0cnVjdCBkcm1fZmlsZSAqLCBpbnQgdGFpbCk7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCk7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X21lbV9mcmVlX2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X21lbV9kZXRlY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X21lbV9yZWxlYXNlKHN0cnVjdCBkcm1fZmlsZSAqLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKTsKIGV4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X21lbV9pbml0X2FncChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbWVtX3Jlc2V0X2FncChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG5vdXZlYXVfbWVtX2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICpudjEwX21lbV9zZXRfdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgdWludDMyX3QgYWRkciwKQEAgLTg1NywxMSArODQ4LDEzIEBACiB2b2lkIG5vdXZlYXVfdW5yZWdpc3Rlcl9kc21faGFuZGxlcih2b2lkKTsKIGludCBub3V2ZWF1X2FjcGlfZ2V0X2Jpb3NfY2h1bmsodWludDhfdCAqYmlvcywgaW50IG9mZnNldCwgaW50IGxlbik7CiBib29sIG5vdXZlYXVfYWNwaV9yb21fc3VwcG9ydGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2ludCBub3V2ZWF1X2FjcGlfZWRpZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9yZWdpc3Rlcl9kc21faGFuZGxlcih2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIG5vdXZlYXVfdW5yZWdpc3Rlcl9kc21faGFuZGxlcih2b2lkKSB7fQogc3RhdGljIGlubGluZSBib29sIG5vdXZlYXVfYWNwaV9yb21fc3VwcG9ydGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KSB7IHJldHVybiBmYWxzZTsgfQogc3RhdGljIGlubGluZSBpbnQgbm91dmVhdV9hY3BpX2dldF9iaW9zX2NodW5rKHVpbnQ4X3QgKmJpb3MsIGludCBvZmZzZXQsIGludCBsZW4pIHsgcmV0dXJuIC1FSU5WQUw7IH0KK3N0YXRpYyBpbmxpbmUgaW50IG5vdXZlYXVfYWNwaV9lZGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpIHsgcmV0dXJuIC1FSU5WQUw7IH0KICNlbmRpZgogCiAvKiBub3V2ZWF1X2JhY2tsaWdodC5jICovCkBAIC05MjQsNiArOTE3LDEwIEBACiBleHRlcm4gdm9pZCBudjEwX2ZiX3NldF9yZWdpb25fdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCwgdWludDMyX3QsCiAJCQkJICAgICAgdWludDMyX3QsIHVpbnQzMl90KTsKIAorLyogbnYzMF9mYi5jICovCitleHRlcm4gaW50ICBudjMwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjMwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworCiAvKiBudjQwX2ZiLmMgKi8KIGV4dGVybiBpbnQgIG52NDBfZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52NDBfZmJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC0xMDM1LDEyICsxMDMyLDYgQEAKIGV4dGVybiB2b2lkIG52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBudjUwX2dyY3R4X2luaXQoc3RydWN0IG5vdXZlYXVfZ3JjdHggKik7CiAKLS8qIG5vdXZlYXVfZ3JjdHguYyAqLwotZXh0ZXJuIGludCAgbm91dmVhdV9ncmN0eF9wcm9nX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X2dyY3R4X3ZhbHNfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLAotCQkJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X2dyY3R4X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKik7Ci0KIC8qIG52MDRfaW5zdG1lbS5jICovCiBleHRlcm4gaW50ICBudjA0X2luc3RtZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfaW5zdG1lbV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKQEAgLTEwNTEsOCArMTA0Miw3IEBACiBleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwogZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwogZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7Ci1leHRlcm4gdm9pZCBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCB3cml0ZSk7Ci1leHRlcm4gdm9pZCBudjA0X2luc3RtZW1fZmluaXNoX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogLyogbnY1MF9pbnN0bWVtLmMgKi8KIGV4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTA2NCw4ICsxMDU0LDkgQEAKIGV4dGVybiB2b2lkIG52NTBfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CiBleHRlcm4gaW50ICBudjUwX2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CiBleHRlcm4gaW50ICBudjUwX2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiB2b2lkIG52NTBfaW5zdG1lbV9wcmVwYXJlX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBib29sIHdyaXRlKTsKLWV4dGVybiB2b2lkIG52NTBfaW5zdG1lbV9maW5pc2hfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY4NF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY1MF92bV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgZW5naW5lKTsKIAogLyogbnYwNF9tYy5jICovCiBleHRlcm4gaW50ICBudjA0X21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC0xMDg4LDEzICsxMDc5LDE0IEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogLyogbnYwNF9kYWMuYyAqLwotZXh0ZXJuIGludCBudjA0X2RhY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOworZXh0ZXJuIGludCBudjA0X2RhY19jcmVhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKiwgc3RydWN0IGRjYl9lbnRyeSAqKTsKIGV4dGVybiB1aW50MzJfdCBudjE3X2RhY19zYW1wbGVfbG9hZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIGludCBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiBleHRlcm4gdm9pZCBudjA0X2RhY191cGRhdGVfZGFjY2xrKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgYm9vbCBlbmFibGUpOworZXh0ZXJuIGJvb2wgbnYwNF9kYWNfaW5fdXNlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiAKIC8qIG52MDRfZGZwLmMgKi8KLWV4dGVybiBpbnQgbnYwNF9kZnBfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKK2V4dGVybiBpbnQgbnYwNF9kZnBfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICosIHN0cnVjdCBkY2JfZW50cnkgKik7CiBleHRlcm4gaW50IG52MDRfZGZwX2dldF9ib3VuZF9oZWFkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCk7CiBleHRlcm4gdm9pZCBudjA0X2RmcF9iaW5kX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LAogCQkJICAgICAgIGludCBoZWFkLCBib29sIGRsKTsKQEAgLTExMDMsMTUgKzEwOTUsMTcgQEAKIAogLyogbnYwNF90di5jICovCiBleHRlcm4gaW50IG52MDRfdHZfaWRlbnRpZnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkyY19pbmRleCk7Ci1leHRlcm4gaW50IG52MDRfdHZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKK2V4dGVybiBpbnQgbnYwNF90dl9jcmVhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKiwgc3RydWN0IGRjYl9lbnRyeSAqKTsKIAogLyogbnYxN190di5jICovCi1leHRlcm4gaW50IG52MTdfdHZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKK2V4dGVybiBpbnQgbnYxN190dl9jcmVhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKiwgc3RydWN0IGRjYl9lbnRyeSAqKTsKIAogLyogbnYwNF9kaXNwbGF5LmMgKi8KK2V4dGVybiBpbnQgbnYwNF9kaXNwbGF5X2Vhcmx5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2Rpc3BsYXlfbGF0ZV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgbnYwNF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgbnYwNF9kaXNwbGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjA0X2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52MDRfZGlzcGxheV9yZXN0b3JlKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAvKiBudjA0X2NydGMuYyAqLwogZXh0ZXJuIGludCBudjA0X2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBpbmRleCk7CkBAIC0xMTQ3LDcgKzExNDEsNiBAQAogZXh0ZXJuIGludCBub3V2ZWF1X2ZlbmNlX2ZsdXNoKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKIGV4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfdW5yZWYodm9pZCAqKm9iaik7CiBleHRlcm4gdm9pZCAqbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqb2JqKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CiAKIC8qIG5vdXZlYXVfZ2VtLmMgKi8KIGV4dGVybiBpbnQgbm91dmVhdV9nZW1fbmV3KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKQEAgLTExNjcsMTMgKzExNjAsMTUgQEAKIGV4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCiAJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAKLS8qIG52MTdfZ3Bpby5jICovCi1pbnQgbnYxN19ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOwotaW50IG52MTdfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOworLyogbnYxMF9ncGlvLmMgKi8KK2ludCBudjEwX2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZyk7CitpbnQgbnYxMF9ncGlvX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsIGludCBzdGF0ZSk7CiAKIC8qIG52NTBfZ3Bpby5jICovCitpbnQgbnY1MF9ncGlvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgbnY1MF9ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOwogaW50IG52NTBfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOwordm9pZCBudjUwX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgYm9vbCBvbik7CiAKIC8qIG52NTBfY2FsYy4gKi8KIGludCBudjUwX2NhbGNfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBwbGxfbGltcyAqLCBpbnQgY2xrLApAQCAtMTIyMCw2ICsxMjE1LDE0IEBACiAJaW93cml0ZTMyX25hdGl2ZSh2YWwsIGRldl9wcml2LT5tbWlvICsgcmVnKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG52X21hc2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJdTMyIHRtcCA9IG52X3JkMzIoZGV2LCByZWcpOworCXRtcCAmPSB+bWFzazsKKwl0bXAgfD0gdmFsOworCW52X3dyMzIoZGV2LCByZWcsIHRtcCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTggbnZfcmQwOChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCByZWcpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZW5jb2Rlci5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKaW5kZXggZTFkZjgyMC4uYTFhMGQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKQEAgLTM4LDEzICszOCwxNSBAQAogCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKIAlpbnQgb3I7CiAKKwkvKiBkaWZmZXJlbnQgdG8gZHJtX2VuY29kZXIuY3J0YywgdGhpcyByZWZsZWN0cyB3aGF0J3MKKwkgKiBhY3R1YWxseSBwcm9ncmFtbWVkIG9uIHRoZSBodywgbm90IHRoZSBwcm9wb3NlZCBjcnRjICovCisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbW9kZTsKIAlpbnQgbGFzdF9kcG1zOwogCiAJc3RydWN0IG52MDRfb3V0cHV0X3JlZyByZXN0b3JlOwogCi0Jdm9pZCAoKmRpc2Nvbm5lY3QpKHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKmVuY29kZXIpOwotCiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJaW50IG1jX3Vua25vd247CkBAIC03MSw4ICs3Myw4IEBACiAKIHN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqCiBub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICplbmNvZGVyKTsKLWludCBudjUwX3Nvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOwotaW50IG52NTBfZGFjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSk7CitpbnQgbnY1MF9zb3JfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICosIHN0cnVjdCBkY2JfZW50cnkgKik7CitpbnQgbnY1MF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICosIHN0cnVjdCBkY2JfZW50cnkgKik7CiAKIHN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSB7CiAJdWludDMyX3QgbWF0Y2g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKaW5kZXggMjU3ZWExMy4uMmZiMjQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KCZkZXZfcHJpdi0+bmZiZGV2LT5oZWxwZXIpOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIG5vdXZlYXVfZmJjb25fZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2KQogewogCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpub3V2ZWF1X2ZiID0gJm5mYmRldi0+bm91dmVhdV9mYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYwppbmRleCBmYWRkZjUzLi42YjIwOGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCkBAIC02NywxMiArNjcsMTMgQEAKIAlpZiAoVVNFX1JFRkNOVCkKIAkJc2VxdWVuY2UgPSBudmNoYW5fcmQzMihjaGFuLCAweDQ4KTsKIAllbHNlCi0JCXNlcXVlbmNlID0gY2hhbi0+ZmVuY2UubGFzdF9zZXF1ZW5jZV9pcnE7CisJCXNlcXVlbmNlID0gYXRvbWljX3JlYWQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxKTsKIAogCWlmIChjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgPT0gc2VxdWVuY2UpCiAJCXJldHVybjsKIAljaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgPSBzZXF1ZW5jZTsKIAorCXNwaW5fbG9jaygmY2hhbi0+ZmVuY2UubG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZjaGFuLT5mZW5jZS5wZW5kaW5nKSB7CiAJCWZlbmNlID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfZmVuY2UsIGVudHJ5KTsKIApAQCAtODQsNiArODUsNyBAQAogCQlpZiAoc2VxdWVuY2UgPT0gY2hhbi0+ZmVuY2Uuc2VxdWVuY2VfYWNrKQogCQkJYnJlYWs7CiAJfQorCXNwaW5fdW5sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIH0KIAogaW50CkBAIC0xMTksNyArMTIxLDYgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+Y2hhbm5lbC0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZmVuY2UtPmNoYW5uZWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKQEAgLTEyNyw5ICsxMjgsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHVubGlrZWx5KGNoYW4tPmZlbmNlLnNlcXVlbmNlID09IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayAtIDEpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CiAJCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CiAKIAkJQlVHX09OKGNoYW4tPmZlbmNlLnNlcXVlbmNlID09CiAJCSAgICAgICBjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgLSAxKTsKQEAgLTEzOCw5ICsxMzcsOSBAQAogCWZlbmNlLT5zZXF1ZW5jZSA9ICsrY2hhbi0+ZmVuY2Uuc2VxdWVuY2U7CiAKIAlrcmVmX2dldCgmZmVuY2UtPnJlZmNvdW50KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmY2hhbi0+ZmVuY2UubG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZmVuY2UtPmVudHJ5LCAmY2hhbi0+ZmVuY2UucGVuZGluZyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIAogCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgVVNFX1JFRkNOVCA/IDB4MDA1MCA6IDB4MDE1MCwgMSk7CiAJT1VUX1JJTkcoY2hhbiwgZmVuY2UtPnNlcXVlbmNlKTsKQEAgLTE3MywxNCArMTcyLDExIEBACiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZShzeW5jX29iaik7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGZlbmNlLT5jaGFubmVsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoZmVuY2UtPnNpZ25hbGxlZCkKIAkJcmV0dXJuIHRydWU7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOwogCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZmVuY2UtPnNpZ25hbGxlZDsKIH0KIApAQCAtMTkwLDggKzE4Niw2IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArICgzICogRFJNX0haKTsKIAlpbnQgcmV0ID0gMDsKIAotCV9fc2V0X2N1cnJlbnRfc3RhdGUoaW50ciA/IFRBU0tfSU5URVJSVVBUSUJMRSA6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQogCXdoaWxlICgxKSB7CiAJCWlmIChub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZChzeW5jX29iaiwgc3luY19hcmcpKQogCQkJYnJlYWs7CkBAIC0yMDEsNiArMTk1LDggQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJX19zZXRfY3VycmVudF9zdGF0ZShpbnRyID8gVEFTS19JTlRFUlJVUFRJQkxFCisJCQk6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKGxhenkpCiAJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCkBAIC0yMjEsMjcgKzIxNywxMiBAQAogCXJldHVybiAwOwogfQogCi12b2lkCi1ub3V2ZWF1X2ZlbmNlX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKLQotCWlmIChjaGFubmVsID49IDAgJiYgY2hhbm5lbCA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKLQkJY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGFubmVsXTsKLQotCWlmIChjaGFuKSB7Ci0JCXNwaW5fbG9ja19pcnEoJmNoYW4tPmZlbmNlLmxvY2spOwotCQlub3V2ZWF1X2ZlbmNlX3VwZGF0ZShjaGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjaGFuLT5mZW5jZS5sb2NrKTsKLQl9Ci19Ci0KIGludAogbm91dmVhdV9mZW5jZV9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPmZlbmNlLnBlbmRpbmcpOwogCXNwaW5fbG9ja19pbml0KCZjaGFuLT5mZW5jZS5sb2NrKTsKKwlhdG9taWNfc2V0KCZjaGFuLT5mZW5jZS5sYXN0X3NlcXVlbmNlX2lycSwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jCmluZGV4IDY5Yzc2Y2YuLjU0N2YyYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYwpAQCAtMTM3LDggKzEzNyw2IEBACiAJdWludDMyX3QgZmxhZ3MgPSAwOwogCWludCByZXQgPSAwOwogCi0JTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKLQogCWlmICh1bmxpa2VseShkZXZfcHJpdi0+dHRtLmJkZXYuZGV2X21hcHBpbmcgPT0gTlVMTCkpCiAJCWRldl9wcml2LT50dG0uYmRldi5kZXZfbWFwcGluZyA9IGRldl9wcml2LT5kZXYtPmRldl9tYXBwaW5nOwogCkBAIC01NzcsMTAgKzU3NSw5IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpibzsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCXN0cnVjdCB2YWxpZGF0ZV9vcCBvcDsKLQlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSAwOworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CiAJaW50IGksIGosIHJldCA9IDAsIGRvX3JlbG9jID0gMDsKIAotCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CiAJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKHJlcS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKIAogCXJlcS0+dnJhbV9hdmFpbGFibGUgPSBkZXZfcHJpdi0+ZmJfYXBlcl9mcmVlOwpAQCAtNzYwLDggKzc1Nyw2IEBACiAJYm9vbCBub193YWl0ID0gISEocmVxLT5mbGFncyAmIE5PVVZFQVVfR0VNX0NQVV9QUkVQX05PV0FJVCk7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKLQlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOwotCiAJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CiAJaWYgKCFnZW0pCiAJCXJldHVybiByZXQ7CkBAIC04MDAsOCArNzk1LDYgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAotCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47Ci0KIAlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIHJlcS0+aGFuZGxlKTsKIAlpZiAoIWdlbSkKIAkJcmV0dXJuIHJldDsKQEAgLTgyNyw4ICs4MjAsNiBAQAogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOwogCWludCByZXQ7CiAKLQlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOwotCiAJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CiAJaWYgKCFnZW0pCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ncmN0eC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ncmN0eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzMxYzVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ3JjdHguYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDkgUmVkIEhhdCBJbmMuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczogQmVuIFNrZWdncwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgImRybVAuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgotCi1zdHJ1Y3Qgbm91dmVhdV9jdHhwcm9nIHsKLQl1aW50MzJfdCBzaWduYXR1cmU7Ci0JdWludDhfdCAgdmVyc2lvbjsKLQl1aW50MTZfdCBsZW5ndGg7Ci0JdWludDMyX3QgZGF0YVtdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBub3V2ZWF1X2N0eHZhbHMgewotCXVpbnQzMl90IHNpZ25hdHVyZTsKLQl1aW50OF90ICB2ZXJzaW9uOwotCXVpbnQzMl90IGxlbmd0aDsKLQlzdHJ1Y3QgewotCQl1aW50MzJfdCBvZmZzZXQ7Ci0JCXVpbnQzMl90IHZhbHVlOwotCX0gZGF0YVtdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLWludAotbm91dmVhdV9ncmN0eF9wcm9nX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOwotCWNvbnN0IGludCBjaGlwc2V0ID0gZGV2X3ByaXYtPmNoaXBzZXQ7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQljb25zdCBzdHJ1Y3Qgbm91dmVhdV9jdHhwcm9nICpjcDsKLQljb25zdCBzdHJ1Y3Qgbm91dmVhdV9jdHh2YWxzICpjdjsKLQljaGFyIG5hbWVbMzJdOwotCWludCByZXQsIGk7Ci0KLQlpZiAocGdyYXBoLT5hY2NlbF9ibG9ja2VkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghcGdyYXBoLT5jdHhwcm9nKSB7Ci0JCXNwcmludGYobmFtZSwgIm5vdXZlYXUvbnYlMDJ4LmN0eHByb2ciLCBjaGlwc2V0KTsKLQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZkZXYtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpIHsKLQkJCU5WX0VSUk9SKGRldiwgIk5vIGN0eHByb2cgZm9yIE5WJTAyeFxuIiwgY2hpcHNldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcGdyYXBoLT5jdHhwcm9nID0ga21lbWR1cChmdy0+ZGF0YSwgZnctPnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBncmFwaC0+Y3R4cHJvZykgewotCQkJTlZfRVJST1IoZGV2LCAiT09NIGNvcHlpbmcgY3R4cHJvZ1xuIik7Ci0JCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJY3AgPSBwZ3JhcGgtPmN0eHByb2c7Ci0JCWlmIChsZTMyX3RvX2NwdShjcC0+c2lnbmF0dXJlKSAhPSAweDUwNDM1NjRlIHx8Ci0JCSAgICBjcC0+dmVyc2lvbiAhPSAwIHx8Ci0JCSAgICBsZTE2X3RvX2NwdShjcC0+bGVuZ3RoKSAhPSAoKGZ3LT5zaXplIC0gNykgLyA0KSkgewotCQkJTlZfRVJST1IoZGV2LCAiY3R4cHJvZyBpbnZhbGlkXG4iKTsKLQkJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQkJbm91dmVhdV9ncmN0eF9maW5pKGRldik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQl9Ci0KLQlpZiAoIXBncmFwaC0+Y3R4dmFscykgewotCQlzcHJpbnRmKG5hbWUsICJub3V2ZWF1L252JTAyeC5jdHh2YWxzIiwgY2hpcHNldCk7Ci0JCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmZGV2LT5wZGV2LT5kZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlOVl9FUlJPUihkZXYsICJObyBjdHh2YWxzIGZvciBOViUwMnhcbiIsIGNoaXBzZXQpOwotCQkJbm91dmVhdV9ncmN0eF9maW5pKGRldik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcGdyYXBoLT5jdHh2YWxzID0ga21lbWR1cChmdy0+ZGF0YSwgZnctPnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBncmFwaC0+Y3R4dmFscykgewotCQkJTlZfRVJST1IoZGV2LCAiT09NIGNvcHlpbmcgY3R4dmFsc1xuIik7Ci0JCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJCW5vdXZlYXVfZ3JjdHhfZmluaShkZXYpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQljdiA9ICh2b2lkICopcGdyYXBoLT5jdHh2YWxzOwotCQlpZiAobGUzMl90b19jcHUoY3YtPnNpZ25hdHVyZSkgIT0gMHg1NjQzNTY0ZSB8fAotCQkgICAgY3YtPnZlcnNpb24gIT0gMCB8fAotCQkgICAgbGUzMl90b19jcHUoY3YtPmxlbmd0aCkgIT0gKChmdy0+c2l6ZSAtIDkpIC8gOCkpIHsKLQkJCU5WX0VSUk9SKGRldiwgImN0eHZhbHMgaW52YWxpZFxuIik7Ci0JCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJCW5vdXZlYXVfZ3JjdHhfZmluaShkZXYpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JfQotCi0JY3AgPSBwZ3JhcGgtPmN0eHByb2c7Ci0KLQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX0lOREVYLCAwKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoY3AtPmxlbmd0aCk7IGkrKykKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9EQVRBLAotCQkJbGUzMl90b19jcHUoY3AtPmRhdGFbaV0pKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkCi1ub3V2ZWF1X2dyY3R4X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOwotCi0JaWYgKHBncmFwaC0+Y3R4cHJvZykgewotCQlrZnJlZShwZ3JhcGgtPmN0eHByb2cpOwotCQlwZ3JhcGgtPmN0eHByb2cgPSBOVUxMOwotCX0KLQotCWlmIChwZ3JhcGgtPmN0eHZhbHMpIHsKLQkJa2ZyZWUocGdyYXBoLT5jdHhwcm9nKTsKLQkJcGdyYXBoLT5jdHh2YWxzID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQKLW5vdXZlYXVfZ3JjdHhfdmFsc19sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7Ci0Jc3RydWN0IG5vdXZlYXVfY3R4dmFscyAqY3YgPSBwZ3JhcGgtPmN0eHZhbHM7Ci0JaW50IGk7Ci0KLQlpZiAoIWN2KQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGUzMl90b19jcHUoY3YtPmxlbmd0aCk7IGkrKykKLQkJbnZfd28zMihkZXYsIGN0eCwgbGUzMl90b19jcHUoY3YtPmRhdGFbaV0ub2Zmc2V0KSwKLQkJCWxlMzJfdG9fY3B1KGN2LT5kYXRhW2ldLnZhbHVlKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuYwppbmRleCAzMTZhM2M3Li5jYjBjYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMKQEAgLTI3OCwzICsyNzgsNDUgQEAKIAlyZXR1cm4gaTJjLT5jaGFuOwogfQogCitib29sCitub3V2ZWF1X3Byb2JlX2kyY19hZGRyKHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMsIGludCBhZGRyKQoreworCXVpbnQ4X3QgYnVmW10gPSB7IDAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gYWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBidWYsCisJCX0sCisJCXsKKwkJCS5hZGRyID0gYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYnVmLAorCQl9CisJfTsKKworCXJldHVybiBpMmNfdHJhbnNmZXIoJmkyYy0+YWRhcHRlciwgbXNncywgMikgPT0gMjsKK30KKworaW50Citub3V2ZWF1X2kyY19pZGVudGlmeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICp3aGF0LAorCQkgICAgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbywgaW50IGluZGV4KQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBub3V2ZWF1X2kyY19maW5kKGRldiwgaW5kZXgpOworCWludCBpOworCisJTlZfREVCVUcoZGV2LCAiUHJvYmluZyAlc3Mgb24gSTJDIGJ1czogJWRcbiIsIHdoYXQsIGluZGV4KTsKKworCWZvciAoaSA9IDA7IGluZm9baV0uYWRkcjsgaSsrKSB7CisJCWlmIChub3V2ZWF1X3Byb2JlX2kyY19hZGRyKGkyYywgaW5mb1tpXS5hZGRyKSkgeworCQkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCAlczogJXNcbiIsIHdoYXQsIGluZm9baV0udHlwZSk7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKworCU5WX0RFQlVHKGRldiwgIk5vIGRldmljZXMgZm91bmQuXG4iKTsKKworCXJldHVybiAtRU5PREVWOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmgKaW5kZXggYzhlYWY3YS4uNmRkMmY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5oCkBAIC00NSw2ICs0NSw5IEBACiBpbnQgbm91dmVhdV9pMmNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqLCBpbnQgaW5kZXgpOwogdm9pZCBub3V2ZWF1X2kyY19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkY2JfaTJjX2VudHJ5ICopOwogc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKm5vdXZlYXVfaTJjX2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGluZGV4KTsKK2Jvb2wgbm91dmVhdV9wcm9iZV9pMmNfYWRkcihzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjLCBpbnQgYWRkcik7CitpbnQgbm91dmVhdV9pMmNfaWRlbnRpZnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqd2hhdCwKKwkJCSBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8sIGludCBpbmRleCk7CiAKIGludCBub3V2ZWF1X2RwX2kyY19hdXhfY2goc3RydWN0IGkyY19hZGFwdGVyICosIGludCBtb2RlLCB1aW50OF90IHdyaXRlX2J5dGUsCiAJCQkgIHVpbnQ4X3QgKnJlYWRfYnl0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwppbmRleCBjMWZkNDJiLi5hOWYzNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKQEAgLTM1LDE2MiArMzUsNiBAQAogI2luY2x1ZGUgImRybV9zYXJlYS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWVtX2Jsb2NrICoKLXNwbGl0X2Jsb2NrKHN0cnVjdCBtZW1fYmxvY2sgKnAsIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplLAotCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKLXsKLQkvKiBNYXliZSBjdXQgb2ZmIHRoZSBzdGFydCBvZiBhbiBleGlzdGluZyBibG9jayAqLwotCWlmIChzdGFydCA+IHAtPnN0YXJ0KSB7Ci0JCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrID0KLQkJCWttYWxsb2Moc2l6ZW9mKCpuZXdibG9jayksIEdGUF9LRVJORUwpOwotCQlpZiAoIW5ld2Jsb2NrKQotCQkJZ290byBvdXQ7Ci0JCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0OwotCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSAoc3RhcnQgLSBwLT5zdGFydCk7Ci0JCW5ld2Jsb2NrLT5maWxlX3ByaXYgPSBOVUxMOwotCQluZXdibG9jay0+bmV4dCA9IHAtPm5leHQ7Ci0JCW5ld2Jsb2NrLT5wcmV2ID0gcDsKLQkJcC0+bmV4dC0+cHJldiA9IG5ld2Jsb2NrOwotCQlwLT5uZXh0ID0gbmV3YmxvY2s7Ci0JCXAtPnNpemUgLT0gbmV3YmxvY2stPnNpemU7Ci0JCXAgPSBuZXdibG9jazsKLQl9Ci0KLQkvKiBNYXliZSBjdXQgb2ZmIHRoZSBlbmQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KLQlpZiAoc2l6ZSA8IHAtPnNpemUpIHsKLQkJc3RydWN0IG1lbV9ibG9jayAqbmV3YmxvY2sgPQotCQkJa21hbGxvYyhzaXplb2YoKm5ld2Jsb2NrKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3YmxvY2spCi0JCQlnb3RvIG91dDsKLQkJbmV3YmxvY2stPnN0YXJ0ID0gc3RhcnQgKyBzaXplOwotCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSBzaXplOwotCQluZXdibG9jay0+ZmlsZV9wcml2ID0gTlVMTDsKLQkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OwotCQluZXdibG9jay0+cHJldiA9IHA7Ci0JCXAtPm5leHQtPnByZXYgPSBuZXdibG9jazsKLQkJcC0+bmV4dCA9IG5ld2Jsb2NrOwotCQlwLT5zaXplID0gc2l6ZTsKLQl9Ci0KLW91dDoKLQkvKiBPdXIgYmxvY2sgaXMgaW4gdGhlIG1pZGRsZSAqLwotCXAtPmZpbGVfcHJpdiA9IGZpbGVfcHJpdjsKLQlyZXR1cm4gcDsKLX0KLQotc3RydWN0IG1lbV9ibG9jayAqCi1ub3V2ZWF1X21lbV9hbGxvY19ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwLCB1aW50NjRfdCBzaXplLAotCQkJaW50IGFsaWduMiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIGludCB0YWlsKQotewotCXN0cnVjdCBtZW1fYmxvY2sgKnA7Ci0JdWludDY0X3QgbWFzayA9ICgxIDw8IGFsaWduMikgLSAxOwotCi0JaWYgKCFoZWFwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICh0YWlsKSB7Ci0JCWxpc3RfZm9yX2VhY2hfcHJldihwLCBoZWFwKSB7Ci0JCQl1aW50NjRfdCBzdGFydCA9ICgocC0+c3RhcnQgKyBwLT5zaXplKSAtIHNpemUpICYgfm1hc2s7Ci0KLQkJCWlmIChwLT5maWxlX3ByaXYgPT0gTlVMTCAmJiBzdGFydCA+PSBwLT5zdGFydCAmJgotCQkJICAgIHN0YXJ0ICsgc2l6ZSA8PSBwLT5zdGFydCArIHAtPnNpemUpCi0JCQkJcmV0dXJuIHNwbGl0X2Jsb2NrKHAsIHN0YXJ0LCBzaXplLCBmaWxlX3ByaXYpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbGlzdF9mb3JfZWFjaChwLCBoZWFwKSB7Ci0JCQl1aW50NjRfdCBzdGFydCA9IChwLT5zdGFydCArIG1hc2spICYgfm1hc2s7Ci0KLQkJCWlmIChwLT5maWxlX3ByaXYgPT0gTlVMTCAmJgotCQkJICAgIHN0YXJ0ICsgc2l6ZSA8PSBwLT5zdGFydCArIHAtPnNpemUpCi0JCQkJcmV0dXJuIHNwbGl0X2Jsb2NrKHAsIHN0YXJ0LCBzaXplLCBmaWxlX3ByaXYpOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgbm91dmVhdV9tZW1fZnJlZV9ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpwKQotewotCXAtPmZpbGVfcHJpdiA9IE5VTEw7Ci0KLQkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlsZV9wcml2IGluCi0JICogJ2hlYXAnIHRvIHN0b3AgaXQgYmVpbmcgc3Vic3VtZWQuCi0JICovCi0JaWYgKHAtPm5leHQtPmZpbGVfcHJpdiA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OwotCQlwLT5zaXplICs9IHEtPnNpemU7Ci0JCXAtPm5leHQgPSBxLT5uZXh0OwotCQlwLT5uZXh0LT5wcmV2ID0gcDsKLQkJa2ZyZWUocSk7Ci0JfQotCi0JaWYgKHAtPnByZXYtPmZpbGVfcHJpdiA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5wcmV2OwotCQlxLT5zaXplICs9IHAtPnNpemU7Ci0JCXEtPm5leHQgPSBwLT5uZXh0OwotCQlxLT5uZXh0LT5wcmV2ID0gcTsKLQkJa2ZyZWUocCk7Ci0JfQotfQotCi0vKiBJbml0aWFsaXplLiAgSG93IHRvIGNoZWNrIGZvciBhbiB1bmluaXRpYWxpemVkIGhlYXA/Ci0gKi8KLWludCBub3V2ZWF1X21lbV9pbml0X2hlYXAoc3RydWN0IG1lbV9ibG9jayAqKmhlYXAsIHVpbnQ2NF90IHN0YXJ0LAotCQkJICB1aW50NjRfdCBzaXplKQotewotCXN0cnVjdCBtZW1fYmxvY2sgKmJsb2NrcyA9IGttYWxsb2Moc2l6ZW9mKCpibG9ja3MpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghYmxvY2tzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCSpoZWFwID0ga21hbGxvYyhzaXplb2YoKipoZWFwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEqaGVhcCkgewotCQlrZnJlZShibG9ja3MpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlibG9ja3MtPnN0YXJ0ID0gc3RhcnQ7Ci0JYmxvY2tzLT5zaXplID0gc2l6ZTsKLQlibG9ja3MtPmZpbGVfcHJpdiA9IE5VTEw7Ci0JYmxvY2tzLT5uZXh0ID0gYmxvY2tzLT5wcmV2ID0gKmhlYXA7Ci0KLQltZW1zZXQoKmhlYXAsIDAsIHNpemVvZigqKmhlYXApKTsKLQkoKmhlYXApLT5maWxlX3ByaXYgPSAoc3RydWN0IGRybV9maWxlICopIC0xOwotCSgqaGVhcCktPm5leHQgPSAoKmhlYXApLT5wcmV2ID0gYmxvY2tzOwotCXJldHVybiAwOwotfQotCi0vKgotICogRnJlZSBhbGwgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzaW5nIGZpbGVfcHJpdgotICovCi12b2lkIG5vdXZlYXVfbWVtX3JlbGVhc2Uoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApCi17Ci0Jc3RydWN0IG1lbV9ibG9jayAqcDsKLQotCWlmICghaGVhcCB8fCAhaGVhcC0+bmV4dCkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaChwLCBoZWFwKSB7Ci0JCWlmIChwLT5maWxlX3ByaXYgPT0gZmlsZV9wcml2KQotCQkJcC0+ZmlsZV9wcml2ID0gTlVMTDsKLQl9Ci0KLQkvKiBBc3N1bWVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmFuZ2UuICBOZWVkcyBhIHNwZWNpYWwgZmlsZV9wcml2IGluCi0JICogJ2hlYXAnIHRvIHN0b3AgaXQgYmVpbmcgc3Vic3VtZWQuCi0JICovCi0JbGlzdF9mb3JfZWFjaChwLCBoZWFwKSB7Ci0JCXdoaWxlICgocC0+ZmlsZV9wcml2ID09IE5VTEwpICYmCi0JCQkJCShwLT5uZXh0LT5maWxlX3ByaXYgPT0gTlVMTCkgJiYKLQkJCQkJKHAtPm5leHQgIT0gaGVhcCkpIHsKLQkJCXN0cnVjdCBtZW1fYmxvY2sgKnEgPSBwLT5uZXh0OwotCQkJcC0+c2l6ZSArPSBxLT5zaXplOwotCQkJcC0+bmV4dCA9IHEtPm5leHQ7Ci0JCQlwLT5uZXh0LT5wcmV2ID0gcDsKLQkJCWtmcmVlKHEpOwotCQl9Ci0JfQotfQotCiAvKgogICogTlYxMC1OVjQwIHRpbGluZyBoZWxwZXJzCiAgKi8KQEAgLTI5OSw3ICsxNDMsNiBAQAogCQlwaHlzIHw9IDB4MzA7CiAJfQogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJd2hpbGUgKHNpemUpIHsKIAkJdW5zaWduZWQgb2Zmc2V0X2ggPSB1cHBlcl8zMl9iaXRzKHBoeXMpOwogCQl1bnNpZ25lZCBvZmZzZXRfbCA9IGxvd2VyXzMyX2JpdHMocGh5cyk7CkBAIC0zMzEsMzYgKzE3NCwxMiBAQAogCQkJfQogCQl9CiAJfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CiAKLQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNTAwMDEpOwotCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDAwMDAxKTsKLQlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDIpXG4iKTsKLQkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDEwMGM4MCkpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDA0MDAwMSk7Ci0JaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7Ci0JCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgxMDBjODApKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNjAwMDEpOwotCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCisJbnY1MF92bV9mbHVzaChkZXYsIDUpOworCW52NTBfdm1fZmx1c2goZGV2LCAwKTsKKwludjUwX3ZtX2ZsdXNoKGRldiwgNCk7CisJbnY1MF92bV9mbHVzaChkZXYsIDYpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzQsNyArMTkzLDYgQEAKIAl2aXJ0IC09IGRldl9wcml2LT52bV92cmFtX2Jhc2U7CiAJcGFnZXMgPSAoc2l6ZSA+PiAxNikgPDwgMTsKIAotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwogCXdoaWxlIChwYWdlcykgewogCQlwZ3QgPSBkZXZfcHJpdi0+dm1fdnJhbV9wdFt2aXJ0ID4+IDI5XTsKIAkJcHRlID0gKHZpcnQgJiAweDFmZmUwMDAwVUxMKSA+PiAxNTsKQEAgLTM4OCw1NyArMjA2LDE5IEBACiAJCXdoaWxlIChwdGUgPCBlbmQpCiAJCQludl93bzMyKGRldiwgcGd0LCBwdGUrKywgMCk7CiAJfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CiAKLQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNTAwMDEpOwotCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEpOwotCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNDAwMDEpOwotCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNjAwMDEpOwotCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JfQorCW52NTBfdm1fZmx1c2goZGV2LCA1KTsKKwludjUwX3ZtX2ZsdXNoKGRldiwgMCk7CisJbnY1MF92bV9mbHVzaChkZXYsIDQpOworCW52NTBfdm1fZmx1c2goZGV2LCA2KTsKIH0KIAogLyoKICAqIENsZWFudXAgZXZlcnl0aGluZwogICovCi12b2lkIG5vdXZlYXVfbWVtX3Rha2Vkb3duKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwKQotewotCXN0cnVjdCBtZW1fYmxvY2sgKnA7Ci0KLQlpZiAoISpoZWFwKQotCQlyZXR1cm47Ci0KLQlmb3IgKHAgPSAoKmhlYXApLT5uZXh0OyBwICE9ICpoZWFwOykgewotCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcDsKLQkJcCA9IHAtPm5leHQ7Ci0JCWtmcmVlKHEpOwotCX0KLQotCWtmcmVlKCpoZWFwKTsKLQkqaGVhcCA9IE5VTEw7Ci19Ci0KLXZvaWQgbm91dmVhdV9tZW1fY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3ZvaWQKK25vdXZlYXVfbWVtX2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNDQ5LDggKzIyOSw3IEBACiAKIAlub3V2ZWF1X3R0bV9nbG9iYWxfcmVsZWFzZShkZXZfcHJpdik7CiAKLQlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwICYmCi0JICAgIGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7CiAJCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnksICp0ZW1wZTsKIAogCQkvKiBSZW1vdmUgQUdQIHJlc291cmNlcywgYnV0IGxlYXZlIGRldi0+YWdwCkBAIC00NzEsMjggKzI1MCwyOSBAQAogCX0KIAogCWlmIChkZXZfcHJpdi0+ZmJfbXRycikgewotCQlkcm1fbXRycl9kZWwoZGV2X3ByaXYtPmZiX210cnIsIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKLQkJCSAgICAgZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSwgRFJNX01UUlJfV0MpOwotCQlkZXZfcHJpdi0+ZmJfbXRyciA9IDA7CisJCWRybV9tdHJyX2RlbChkZXZfcHJpdi0+ZmJfbXRyciwKKwkJCSAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSksCisJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSwgRFJNX01UUlJfV0MpOworCQlkZXZfcHJpdi0+ZmJfbXRyciA9IC0xOwogCX0KIH0KIAogc3RhdGljIHVpbnQzMl90CiBub3V2ZWF1X21lbV9kZXRlY3RfbnYwNChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXVpbnQzMl90IGJvb3QwID0gbnZfcmQzMihkZXYsIE5WMDNfQk9PVF8wKTsKKwl1aW50MzJfdCBib290MCA9IG52X3JkMzIoZGV2LCBOVjA0X1BGQl9CT09UXzApOwogCiAJaWYgKGJvb3QwICYgMHgwMDAwMDEwMCkKIAkJcmV0dXJuICgoKGJvb3QwID4+IDEyKSAmIDB4ZikgKiAyICsgMikgKiAxMDI0ICogMTAyNDsKIAotCXN3aXRjaCAoYm9vdDAgJiBOVjAzX0JPT1RfMF9SQU1fQU1PVU5UKSB7Ci0JY2FzZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzMyTUI6CisJc3dpdGNoIChib290MCAmIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UKSB7CisJY2FzZSBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVF8zMk1COgogCQlyZXR1cm4gMzIgKiAxMDI0ICogMTAyNDsKLQljYXNlIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfMTZNQjoKKwljYXNlIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzE2TUI6CiAJCXJldHVybiAxNiAqIDEwMjQgKiAxMDI0OwotCWNhc2UgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF84TUI6CisJY2FzZSBOVjA0X1BGQl9CT09UXzBfUkFNX0FNT1VOVF84TUI6CiAJCXJldHVybiA4ICogMTAyNCAqIDEwMjQ7Ci0JY2FzZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzRNQjoKKwljYXNlIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzRNQjoKIAkJcmV0dXJuIDQgKiAxMDI0ICogMTAyNDsKIAl9CiAKQEAgLTUzNiwxMiArMzE2LDE4IEBACiAJfSBlbHNlCiAJaWYgKGRldl9wcml2LT5mbGFncyAmIChOVl9ORk9SQ0UgfCBOVl9ORk9SQ0UyKSkgewogCQlkZXZfcHJpdi0+dnJhbV9zaXplID0gbm91dmVhdV9tZW1fZGV0ZWN0X25mb3JjZShkZXYpOworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJZGV2X3ByaXYtPnZyYW1fc2l6ZSAgPSBudl9yZDMyKGRldiwgTlYwNF9QRkJfRklGT19EQVRBKTsKKwkJZGV2X3ByaXYtPnZyYW1fc2l6ZSAmPSBOVjEwX1BGQl9GSUZPX0RBVEFfUkFNX0FNT1VOVF9NQl9NQVNLOwogCX0gZWxzZSB7Ci0JCWRldl9wcml2LT52cmFtX3NpemUgID0gbnZfcmQzMihkZXYsIE5WMDRfRklGT19EQVRBKTsKLQkJZGV2X3ByaXYtPnZyYW1fc2l6ZSAmPSBOVjEwX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX01BU0s7Ci0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGFhIHx8IGRldl9wcml2LT5jaGlwc2V0ID09IDB4YWMpCisJCWRldl9wcml2LT52cmFtX3NpemUgPSBudl9yZDMyKGRldiwgTlYwNF9QRkJfRklGT19EQVRBKTsKKwkJZGV2X3ByaXYtPnZyYW1fc2l6ZSB8PSAoZGV2X3ByaXYtPnZyYW1fc2l6ZSAmIDB4ZmYpIDw8IDMyOworCQlkZXZfcHJpdi0+dnJhbV9zaXplICY9IDB4ZmZmZmZmZmYwMGxsOworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhYSB8fCBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGFjKSB7CiAJCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA9IG52X3JkMzIoZGV2LCAweDEwMGUxMCk7CiAJCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA8PD0gMTI7CisJCX0KIAl9CiAKIAlOVl9JTkZPKGRldiwgIkRldGVjdGVkICVkTWlCIFZSQU1cbiIsIChpbnQpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKQEAgLTU1NSwxOCArMzQxLDM2IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLSNpZiBfX09TX0hBU19BR1AKLXN0YXRpYyB2b2lkIG5vdXZlYXVfbWVtX3Jlc2V0X2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoraW50Citub3V2ZWF1X21lbV9yZXNldF9hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQl1aW50MzJfdCBzYXZlZF9wY2lfbnZfMSwgc2F2ZWRfcGNpX252XzE5LCBwbWNfZW5hYmxlOworI2lmIF9fT1NfSEFTX0FHUAorCXVpbnQzMl90IHNhdmVkX3BjaV9udl8xLCBwbWNfZW5hYmxlOworCWludCByZXQ7CisKKwkvKiBGaXJzdCBvZiBhbGwsIGRpc2FibGUgZmFzdCB3cml0ZXMsIG90aGVyd2lzZSBpZiBpdCdzCisJICogYWxyZWFkeSBlbmFibGVkIGluIHRoZSBBR1AgYnJpZGdlIGFuZCB3ZSBkaXNhYmxlIHRoZSBjYXJkJ3MKKwkgKiBBR1AgY29udHJvbGxlciB3ZSBtaWdodCBiZSBsb2NraW5nIG91cnNlbHZlcyBvdXQgb2YgaXQuICovCisJaWYgKGRldi0+YWdwLT5hY3F1aXJlZCkgeworCQlzdHJ1Y3QgZHJtX2FncF9pbmZvIGluZm87CisJCXN0cnVjdCBkcm1fYWdwX21vZGUgbW9kZTsKKworCQlyZXQgPSBkcm1fYWdwX2luZm8oZGV2LCAmaW5mbyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCW1vZGUubW9kZSA9IGluZm8ubW9kZSAmIH4weDEwOworCQlyZXQgPSBkcm1fYWdwX2VuYWJsZShkZXYsIG1vZGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlzYXZlZF9wY2lfbnZfMSA9IG52X3JkMzIoZGV2LCBOVjA0X1BCVVNfUENJX05WXzEpOwotCXNhdmVkX3BjaV9udl8xOSA9IG52X3JkMzIoZGV2LCBOVjA0X1BCVVNfUENJX05WXzE5KTsKIAogCS8qIGNsZWFyIGJ1c21hc3RlciBiaXQgKi8KIAludl93cjMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xLCBzYXZlZF9wY2lfbnZfMSAmIH4weDQpOwotCS8qIGNsZWFyIFNCQSBhbmQgQUdQIGJpdHMgKi8KLQludl93cjMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xOSwgc2F2ZWRfcGNpX252XzE5ICYgMHhmZmZmZjBmZik7CisJLyogZGlzYWJsZSBBR1AgKi8KKwludl93cjMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xOSwgMCk7CiAKIAkvKiBwb3dlciBjeWNsZSBwZ3JhcGgsIGlmIGVuYWJsZWQgKi8KIAlwbWNfZW5hYmxlID0gbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSk7CkBAIC01NzgsMTEgKzM4MiwxMiBAQAogCX0KIAogCS8qIGFuZCByZXN0b3JlIChnaXZlcyBlZmZlY3Qgb2YgcmVzZXR0aW5nIEFHUCkgKi8KLQludl93cjMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xOSwgc2F2ZWRfcGNpX252XzE5KTsKIAludl93cjMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xLCBzYXZlZF9wY2lfbnZfMSk7Ci19CiAjZW5kaWYKIAorCXJldHVybiAwOworfQorCiBpbnQKIG5vdXZlYXVfbWVtX2luaXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC01OTIsMTEgKzM5Nyw2IEBACiAJc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlOwogCWludCByZXQ7CiAKLQlpZiAobm91dmVhdV9ub2FncCkKLQkJcmV0dXJuIDA7Ci0KLQlub3V2ZWF1X21lbV9yZXNldF9hZ3AoZGV2KTsKLQogCWlmICghZGV2LT5hZ3AtPmFjcXVpcmVkKSB7CiAJCXJldCA9IGRybV9hZ3BfYWNxdWlyZShkZXYpOwogCQlpZiAocmV0KSB7CkBAIC02MzMsNyArNDMzLDcgQEAKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZkZXZfcHJpdi0+dHRtLmJkZXY7CiAJaW50IHJldCwgZG1hX2JpdHMgPSAzMjsKIAotCWRldl9wcml2LT5mYl9waHlzID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpOworCWRldl9wcml2LT5mYl9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CiAJZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID0gTk9VVkVBVV9HQVJUX05PTkU7CiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJgpAQCAtNjY1LDggKzQ2NSw5IEBACiAKIAlkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgPSBkZXZfcHJpdi0+dnJhbV9zaXplOwogCWRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA9IGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZTsKLQlpZiAoZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID4gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSkKLQkJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKTsKKwlpZiAoZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID4gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpKQorCQlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPQorCQkJcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpOwogCWRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA+Pj0gUEFHRV9TSElGVDsKIAogCS8qIHJlbW92ZSByZXNlcnZlZCBzcGFjZSBhdCBlbmQgb2YgdnJhbSBmcm9tIGF2YWlsYWJsZSBhbW91bnQgKi8KQEAgLTY5Miw3ICs0OTMsOCBAQAogCiAJLyogR0FSVCAqLwogI2lmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX2lhNjRfXykKLQlpZiAoZHJtX2RldmljZV9pc19hZ3AoZGV2KSAmJiBkZXYtPmFncCkgeworCWlmIChkcm1fZGV2aWNlX2lzX2FncChkZXYpICYmIGRldi0+YWdwICYmICFub3V2ZWF1X25vYWdwKSB7CisJCW5vdXZlYXVfbWVtX3Jlc2V0X2FncChkZXYpOwogCQlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2FncChkZXYpOwogCQlpZiAocmV0KQogCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgaW5pdGlhbGlzaW5nIEFHUDogJWRcbiIsIHJldCk7CkBAIC03MTgsOCArNTIwLDggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlkZXZfcHJpdi0+ZmJfbXRyciA9IGRybV9tdHJyX2FkZChkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCi0JCQkJCSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpLAorCWRldl9wcml2LT5mYl9tdHJyID0gZHJtX210cnJfYWRkKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpLAorCQkJCQkgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpLAogCQkJCQkgRFJNX01UUlJfV0MpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X25vdGlmaWVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X25vdGlmaWVyLmMKaW5kZXggOTUzN2YzZS4uM2VjMTgxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ub3RpZmllci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYwpAQCAtNTUsNyArNTUsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2VycjsKIAotCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfaGVhcCgmY2hhbi0+bm90aWZpZXJfaGVhcCwgMCwgbnRmeS0+Ym8ubWVtLnNpemUpOworCXJldCA9IGRybV9tbV9pbml0KCZjaGFuLT5ub3RpZmllcl9oZWFwLCAwLCBudGZ5LT5iby5tZW0uc2l6ZSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZXJyOwogCkBAIC04MCw3ICs4MCw3IEBACiAJbm91dmVhdV9ib191bnBpbihjaGFuLT5ub3RpZmllcl9ibyk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoY2hhbi0+bm90aWZpZXJfYm8tPmdlbSk7Ci0Jbm91dmVhdV9tZW1fdGFrZWRvd24oJmNoYW4tPm5vdGlmaWVyX2hlYXApOworCWRybV9tbV90YWtlZG93bigmY2hhbi0+bm90aWZpZXJfaGVhcCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05MCw3ICs5MCw3IEBACiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAogCWlmIChncHVvYmotPnByaXYpCi0JCW5vdXZlYXVfbWVtX2ZyZWVfYmxvY2soZ3B1b2JqLT5wcml2KTsKKwkJZHJtX21tX3B1dF9ibG9jayhncHVvYmotPnByaXYpOwogfQogCiBpbnQKQEAgLTEwMCwxOCArMTAwLDEzIEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqbm9iaiA9IE5VTEw7Ci0Jc3RydWN0IG1lbV9ibG9jayAqbWVtOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbWVtOwogCXVpbnQzMl90IG9mZnNldDsKIAlpbnQgdGFyZ2V0LCByZXQ7CiAKLQlpZiAoIWNoYW4tPm5vdGlmaWVyX2hlYXApIHsKLQkJTlZfRVJST1IoZGV2LCAiQ2hhbm5lbCAlZCBkb2Vzbid0IGhhdmUgYSBub3RpZmllciBoZWFwIVxuIiwKLQkJCSBjaGFuLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1lbSA9IG5vdXZlYXVfbWVtX2FsbG9jX2Jsb2NrKGNoYW4tPm5vdGlmaWVyX2hlYXAsIHNpemUsIDAsCi0JCQkJICAgICAgKHN0cnVjdCBkcm1fZmlsZSAqKS0yLCAwKTsKKwltZW0gPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmNoYW4tPm5vdGlmaWVyX2hlYXAsIHNpemUsIDAsIDApOworCWlmIChtZW0pCisJCW1lbSA9IGRybV9tbV9nZXRfYmxvY2sobWVtLCBzaXplLCAwKTsKIAlpZiAoIW1lbSkgewogCQlOVl9FUlJPUihkZXYsICJDaGFubmVsICVkIG5vdGlmaWVyIGJsb2NrIGZ1bGxcbiIsIGNoYW4tPmlkKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNDQsMTcgKzEzOSwxNyBAQAogCQkJCSAgICAgbWVtLT5zaXplLCBOVl9ETUFfQUNDRVNTX1JXLCB0YXJnZXQsCiAJCQkJICAgICAmbm9iaik7CiAJaWYgKHJldCkgewotCQlub3V2ZWF1X21lbV9mcmVlX2Jsb2NrKG1lbSk7CisJCWRybV9tbV9wdXRfYmxvY2sobWVtKTsKIAkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgbm90aWZpZXIgY3R4ZG1hOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0Jbm9iai0+ZHRvciAgID0gbm91dmVhdV9ub3RpZmllcl9ncHVvYmpfZHRvcjsKLQlub2JqLT5wcml2ICAgPSBtZW07CisJbm9iai0+ZHRvciA9IG5vdXZlYXVfbm90aWZpZXJfZ3B1b2JqX2R0b3I7CisJbm9iai0+cHJpdiA9IG1lbTsKIAogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBjaGFuLCBoYW5kbGUsIG5vYmosIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJm5vYmopOwotCQlub3V2ZWF1X21lbV9mcmVlX2Jsb2NrKG1lbSk7CisJCWRybV9tbV9wdXRfYmxvY2sobWVtKTsKIAkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVmZXJlbmNpbmcgbm90aWZpZXIgY3R4ZG1hOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNzAsNyArMTY1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAocG9mZnNldCkgewotCQlzdHJ1Y3QgbWVtX2Jsb2NrICptZW0gPSBub2JqLT5wcml2OworCQlzdHJ1Y3QgZHJtX21tX25vZGUgKm1lbSA9IG5vYmotPnByaXY7CiAKIAkJaWYgKCpwb2Zmc2V0ID49IG1lbS0+c2l6ZSkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE4OSw3ICsxODQsNiBAQAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAJaW50IHJldDsKIAotCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CiAJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKG5hLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOwogCiAJcmV0ID0gbm91dmVhdV9ub3RpZmllcl9hbGxvYyhjaGFuLCBuYS0+aGFuZGxlLCBuYS0+c2l6ZSwgJm5hLT5vZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKaW5kZXggZTdjMTAwYi4uYjZiY2IyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCkBAIC0xMzIsNyArMTMyLDYgQEAKIAkJfQogCX0KIAotCWluc3RtZW0tPnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJY28gPSBobyA9IG5vdXZlYXVfcmFtaHRfaGFzaF9oYW5kbGUoZGV2LCBjaGFuLT5pZCwgcmVmLT5oYW5kbGUpOwogCWRvIHsKIAkJaWYgKCFub3V2ZWF1X3JhbWh0X2VudHJ5X3ZhbGlkKGRldiwgcmFtaHQsIGNvKSkgewpAQCAtMTQzLDcgKzE0Miw3IEBACiAJCQludl93bzMyKGRldiwgcmFtaHQsIChjbyArIDQpLzQsIGN0eCk7CiAKIAkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+bGlzdCwgJmNoYW4tPnJhbWh0X3JlZnMpOwotCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQkJaW5zdG1lbS0+Zmx1c2goZGV2KTsKIAkJCXJldHVybiAwOwogCQl9CiAJCU5WX0RFQlVHKGRldiwgImNvbGxpc2lvbiBjaCVkIDB4JTA4eDogaD0weCUwOHhcbiIsCkBAIC0xNTMsNyArMTUyLDYgQEAKIAkJaWYgKGNvID49IGRldl9wcml2LT5yYW1odF9zaXplKQogCQkJY28gPSAwOwogCX0gd2hpbGUgKGNvICE9IGhvKTsKLQlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CiAKIAlOVl9FUlJPUihkZXYsICJSQU1IVCBzcGFjZSBleGhhdXN0ZWQuIGNoPSVkXG4iLCBjaGFuLT5pZCk7CiAJcmV0dXJuIC1FTk9NRU07CkBAIC0xNzMsNyArMTcxLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWluc3RtZW0tPnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJY28gPSBobyA9IG5vdXZlYXVfcmFtaHRfaGFzaF9oYW5kbGUoZGV2LCBjaGFuLT5pZCwgcmVmLT5oYW5kbGUpOwogCWRvIHsKIAkJaWYgKG5vdXZlYXVfcmFtaHRfZW50cnlfdmFsaWQoZGV2LCByYW1odCwgY28pICYmCkBAIC0xODYsNyArMTgzLDcgQEAKIAkJCW52X3dvMzIoZGV2LCByYW1odCwgKGNvICsgNCkvNCwgMHgwMDAwMDAwMCk7CiAKIAkJCWxpc3RfZGVsKCZyZWYtPmxpc3QpOwotCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQkJaW5zdG1lbS0+Zmx1c2goZGV2KTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0xOTUsNyArMTkyLDYgQEAKIAkJCWNvID0gMDsKIAl9IHdoaWxlIChjbyAhPSBobyk7CiAJbGlzdF9kZWwoJnJlZi0+bGlzdCk7Ci0JaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOwogCiAJTlZfRVJST1IoZGV2LCAiUkFNSFQgZW50cnkgbm90IGZvdW5kLiBjaD0lZCwgaGFuZGxlPTB4JTA4eFxuIiwKIAkJIGNoYW4tPmlkLCByZWYtPmhhbmRsZSk7CkBAIC0yMDksNyArMjA1LDcgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7Ci0Jc3RydWN0IG1lbV9ibG9jayAqcHJhbWluID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21tICpwcmFtaW4gPSBOVUxMOwogCWludCByZXQ7CiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkIHNpemU9JXUgYWxpZ249JWQgZmxhZ3M9MHglMDh4XG4iLApAQCAtMjMzLDI1ICsyMjksMTIgQEAKIAkgKiBhdmFpbGFibGUuCiAJICovCiAJaWYgKGNoYW4pIHsKLQkJaWYgKGNoYW4tPnJhbWluX2hlYXApIHsKLQkJCU5WX0RFQlVHKGRldiwgInByaXZhdGUgaGVhcFxuIik7Ci0JCQlwcmFtaW4gPSBjaGFuLT5yYW1pbl9oZWFwOwotCQl9IGVsc2UKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJTlZfREVCVUcoZGV2LCAiZ2xvYmFsIGhlYXAgZmFsbGJhY2tcbiIpOwotCQkJcHJhbWluID0gZGV2X3ByaXYtPnJhbWluX2hlYXA7Ci0JCX0KKwkJTlZfREVCVUcoZGV2LCAiY2hhbm5lbCBoZWFwXG4iKTsKKwkJcHJhbWluID0gJmNoYW4tPnJhbWluX2hlYXA7CiAJfSBlbHNlIHsKIAkJTlZfREVCVUcoZGV2LCAiZ2xvYmFsIGhlYXBcbiIpOwotCQlwcmFtaW4gPSBkZXZfcHJpdi0+cmFtaW5faGVhcDsKLQl9CisJCXByYW1pbiA9ICZkZXZfcHJpdi0+cmFtaW5faGVhcDsKIAotCWlmICghcHJhbWluKSB7Ci0JCU5WX0VSUk9SKGRldiwgIk5vIFBSQU1JTiBoZWFwIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghY2hhbikgewogCQlyZXQgPSBlbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUoZGV2LCBncHVvYmosICZzaXplKTsKIAkJaWYgKHJldCkgewogCQkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CkBAIC0yNjAsOSArMjQzLDEwIEBACiAJfQogCiAJLyogQWxsb2NhdGUgYSBjaHVuayBvZiB0aGUgUFJBTUlOIGFwZXJ0dXJlICovCi0JZ3B1b2JqLT5pbV9wcmFtaW4gPSBub3V2ZWF1X21lbV9hbGxvY19ibG9jayhwcmFtaW4sIHNpemUsCi0JCQkJCQkgICAgZHJtX29yZGVyKGFsaWduKSwKLQkJCQkJCSAgICAoc3RydWN0IGRybV9maWxlICopLTIsIDApOworCWdwdW9iai0+aW1fcHJhbWluID0gZHJtX21tX3NlYXJjaF9mcmVlKHByYW1pbiwgc2l6ZSwgYWxpZ24sIDApOworCWlmIChncHVvYmotPmltX3ByYW1pbikKKwkJZ3B1b2JqLT5pbV9wcmFtaW4gPSBkcm1fbW1fZ2V0X2Jsb2NrKGdwdW9iai0+aW1fcHJhbWluLCBzaXplLCBhbGlnbik7CisKIAlpZiAoIWdwdW9iai0+aW1fcHJhbWluKSB7CiAJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI3OSwxMCArMjYzLDkgQEAKIAlpZiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfWkVST19BTExPQykgewogCQlpbnQgaTsKIAotCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+aW1fcHJhbWluLT5zaXplOyBpICs9IDQpCiAJCQludl93bzMyKGRldiwgZ3B1b2JqLCBpLzQsIDApOwotCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCQllbmdpbmUtPmluc3RtZW0uZmx1c2goZGV2KTsKIAl9CiAKIAkqZ3B1b2JqX3JldCA9IGdwdW9iajsKQEAgLTM3MCwxMCArMzUzLDkgQEAKIAl9CiAKIAlpZiAoZ3B1b2JqLT5pbV9wcmFtaW4gJiYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fRlJFRSkpIHsKLQkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPmltX3ByYW1pbi0+c2l6ZTsgaSArPSA0KQogCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgaS80LCAwKTsKLQkJZW5naW5lLT5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJZW5naW5lLT5pbnN0bWVtLmZsdXNoKGRldik7CiAJfQogCiAJaWYgKGdwdW9iai0+ZHRvcikKQEAgLTM4Niw3ICszNjgsNyBAQAogCQlpZiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfRkFLRSkKIAkJCWtmcmVlKGdwdW9iai0+aW1fcHJhbWluKTsKIAkJZWxzZQotCQkJbm91dmVhdV9tZW1fZnJlZV9ibG9jayhncHVvYmotPmltX3ByYW1pbik7CisJCQlkcm1fbW1fcHV0X2Jsb2NrKGdwdW9iai0+aW1fcHJhbWluKTsKIAl9CiAKIAlsaXN0X2RlbCgmZ3B1b2JqLT5saXN0KTsKQEAgLTU4OSw3ICs1NzEsNyBAQAogCWxpc3RfYWRkX3RhaWwoJmdwdW9iai0+bGlzdCwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCk7CiAKIAlpZiAocF9vZmZzZXQgIT0gfjApIHsKLQkJZ3B1b2JqLT5pbV9wcmFtaW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtX2Jsb2NrKSwKKwkJZ3B1b2JqLT5pbV9wcmFtaW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX21tX25vZGUpLAogCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghZ3B1b2JqLT5pbV9wcmFtaW4pIHsKIAkJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOwpAQCAtNjA1LDEwICs1ODcsOSBAQAogCX0KIAogCWlmIChncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19aRVJPX0FMTE9DKSB7Ci0JCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwogCQlmb3IgKGkgPSAwOyBpIDwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemU7IGkgKz0gNCkKIAkJCW52X3dvMzIoZGV2LCBncHVvYmosIGkvNCwgMCk7Ci0JCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCX0KIAogCWlmIChwcmVmKSB7CkBAIC02OTYsOCArNjc3LDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpbnN0bWVtLT5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwotCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewogCQl1aW50MzJfdCBmcmFtZSwgYWRqdXN0LCBwdGVfZmxhZ3MgPSAwOwogCkBAIC03MzQsNyArNzEzLDcgQEAKIAkJbnZfd28zMihkZXYsICpncHVvYmosIDUsIGZsYWdzNSk7CiAJfQogCi0JaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCWluc3RtZW0tPmZsdXNoKGRldik7CiAKIAkoKmdwdW9iaiktPmVuZ2luZSA9IE5WT0JKX0VOR0lORV9TVzsKIAkoKmdwdW9iaiktPmNsYXNzICA9IGNsYXNzOwpAQCAtODQ5LDcgKzgyOCw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKIAkJbnZfd28zMihkZXYsICpncHVvYmosIDAsIGNsYXNzKTsKIAkJbnZfd28zMihkZXYsICpncHVvYmosIDUsIDB4MDAwMTAwMDApOwpAQCAtODc0LDcgKzg1Miw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKIAogCSgqZ3B1b2JqKS0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX0dSOwogCSgqZ3B1b2JqKS0+Y2xhc3MgID0gY2xhc3M7CkBAIC05MjAsNiArODk4LDcgQEAKIAliYXNlID0gMDsKIAogCS8qIFBHUkFQSCBjb250ZXh0ICovCisJc2l6ZSArPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmdyY3R4X3NpemU7CiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewogCQkvKiBWYXJpb3VzIGZpeGVkIHRhYmxlIHRoaW5nb3MgKi8KQEAgLTkzMCwxMiArOTA5LDggQEAKIAkJc2l6ZSArPSAweDgwMDA7CiAJCS8qIFJBTUZDICovCiAJCXNpemUgKz0gMHgxMDAwOwotCQkvKiBQR1JBUEggY29udGV4dCAqLwotCQlzaXplICs9IDB4NzAwMDA7CiAJfQogCi0JTlZfREVCVUcoZGV2LCAiY2glZCBQUkFNSU4gc2l6ZTogMHglMDh4IGJ5dGVzLCBiYXNlIGFsbG9jPTB4JTA4eFxuIiwKLQkJIGNoYW4tPmlkLCBzaXplLCBiYXNlKTsKIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgc2l6ZSwgMHgxMDAwLCAwLAogCQkJCSAgICAgJmNoYW4tPnJhbWluKTsKIAlpZiAocmV0KSB7CkBAIC05NDQsOCArOTE5LDcgQEAKIAl9CiAJcHJhbWluID0gY2hhbi0+cmFtaW4tPmdwdW9iajsKIAotCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfaGVhcCgmY2hhbi0+cmFtaW5faGVhcCwKLQkJCQkgICAgcHJhbWluLT5pbV9wcmFtaW4tPnN0YXJ0ICsgYmFzZSwgc2l6ZSk7CisJcmV0ID0gZHJtX21tX2luaXQoJmNoYW4tPnJhbWluX2hlYXAsIHByYW1pbi0+aW1fcHJhbWluLT5zdGFydCArIGJhc2UsIHNpemUpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgUFJBTUlOIGhlYXA6ICVkXG4iLCByZXQpOwogCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWluKTsKQEAgLTk2OSwxNSArOTQzLDExIEBACiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkIHZyYW09MHglMDh4IHR0PTB4JTA4eFxuIiwgY2hhbi0+aWQsIHZyYW1faCwgdHRfaCk7CiAKLQkvKiBSZXNlcnZlIGEgYmxvY2sgb2YgUFJBTUlOIGZvciB0aGUgY2hhbm5lbAotCSAqWFhYOiBtYXliZSBvbiA8TlY1MCB0b28gYXQgc29tZSBwb2ludAotCSAqLwotCWlmICgwIHx8IGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfY2hhbm5lbF9pbml0X3ByYW1pbihjaGFuKTsKLQkJaWYgKHJldCkgewotCQkJTlZfRVJST1IoZGV2LCAiaW5pdCBwcmFtaW5cbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQorCS8qIEFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5IGZvciBwZXItY2hhbm5lbCBvYmplY3Qgc3RvcmFnZSAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdF9wcmFtaW4oY2hhbik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJpbml0IHByYW1pblxuIik7CisJCXJldHVybiByZXQ7CiAJfQogCiAJLyogTlY1MCBWTQpAQCAtOTg4LDE3ICs5NTgsMTMgQEAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQl1aW50MzJfdCB2bV9vZmZzZXQsIHBkZTsKIAotCQlpbnN0bWVtLT5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwotCiAJCXZtX29mZnNldCA9IChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApID09IDB4NTAgPyAweDE0MDAgOiAweDIwMDsKIAkJdm1fb2Zmc2V0ICs9IGNoYW4tPnJhbWluLT5ncHVvYmotPmltX3ByYW1pbi0+c3RhcnQ7CiAKIAkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X2Zha2UoZGV2LCB2bV9vZmZzZXQsIH4wLCAweDQwMDAsCiAJCQkJCQkJMCwgJmNoYW4tPnZtX3BkLCBOVUxMKTsKLQkJaWYgKHJldCkgewotCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQkJfQogCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDAwOyBpICs9IDgpIHsKIAkJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgKGkrMCkvNCwgMHgwMDAwMDAwMCk7CiAJCQludl93bzMyKGRldiwgY2hhbi0+dm1fcGQsIChpKzQpLzQsIDB4ZGVhZGNhZmUpOwpAQCAtMTAwOCwxMCArOTc0LDggQEAKIAkJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIE5VTEwsIDAsCiAJCQkJCSAgICAgZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEsCiAJCQkJCSAgICAgJmNoYW4tPnZtX2dhcnRfcHQpOwotCQlpZiAocmV0KSB7Ci0JCQlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgcGRlKyssCiAJCQkgICAgY2hhbi0+dm1fZ2FydF9wdC0+aW5zdGFuY2UgfCAweDAzKTsKIAkJbnZfd28zMihkZXYsIGNoYW4tPnZtX3BkLCBwZGUrKywgMHgwMDAwMDAwMCk7CkBAIC0xMDIxLDE3ICs5ODUsMTUgQEAKIAkJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBOVUxMLCAwLAogCQkJCQkJICAgICBkZXZfcHJpdi0+dm1fdnJhbV9wdFtpXSwKIAkJCQkJCSAgICAgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOwotCQkJaWYgKHJldCkgewotCQkJCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKLQkJCX0KIAogCQkJbnZfd28zMihkZXYsIGNoYW4tPnZtX3BkLCBwZGUrKywKIAkJCQkgICAgY2hhbi0+dm1fdnJhbV9wdFtpXS0+aW5zdGFuY2UgfCAweDYxKTsKIAkJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgcGRlKyssIDB4MDAwMDAwMDApOwogCQl9CiAKLQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQlpbnN0bWVtLT5mbHVzaChkZXYpOwogCX0KIAogCS8qIFJBTUhUICovCkBAIC0xMTMwLDggKzEwOTIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKQogCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOwogCi0JaWYgKGNoYW4tPnJhbWluX2hlYXApCi0JCW5vdXZlYXVfbWVtX3Rha2Vkb3duKCZjaGFuLT5yYW1pbl9oZWFwKTsKKwlpZiAoY2hhbi0+cmFtaW5faGVhcC5mcmVlX3N0YWNrLm5leHQpCisJCWRybV9tbV90YWtlZG93bigmY2hhbi0+cmFtaW5faGVhcCk7CiAJaWYgKGNoYW4tPnJhbWluKQogCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWluKTsKIApAQCAtMTE2NCwxMCArMTEyNiw4IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKIAkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+aW1fcHJhbWluLT5zaXplIC8gNDsgaSsrKQogCQkJZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmRbaV0gPSBudl9ybzMyKGRldiwgZ3B1b2JqLCBpKTsKLQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEyMTIsMTAgKzExNzIsOSBAQAogCQlpZiAoIWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kKQogCQkJY29udGludWU7CiAKLQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPmltX3ByYW1pbi0+c2l6ZSAvIDQ7IGkrKykKIAkJCW52X3dvMzIoZGV2LCBncHVvYmosIGksIGdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kW2ldKTsKLQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CiAJfQogCiAJbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKGRldik7CkBAIC0xMjMyLDcgKzExOTEsNiBAQAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAJaW50IHJldDsKIAotCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CiAJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKGluaXQtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CiAKIAlpZiAoaW5pdC0+aGFuZGxlID09IH4wKQpAQCAtMTI4Myw3ICsxMjQxLDYgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCWludCByZXQ7CiAKLQlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOwogCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihvYmpmcmVlLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOwogCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2ZpbmQoY2hhbiwgb2JqZnJlZS0+aGFuZGxlLCAmcmVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCmluZGV4IDZjYTgwYTMuLjljMTA1NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yZWcuaApAQCAtMSwxOSArMSw2NCBAQAogCisjZGVmaW5lIE5WMDRfUEZCX0JPT1RfMAkJCQkJCTB4MDAxMDAwMDAKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UCQkJMHgwMDAwMDAwMworIwlkZWZpbmUgTlYwNF9QRkJfQk9PVF8wX1JBTV9BTU9VTlRfMzJNQgkJCTB4MDAwMDAwMDAKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzRNQgkJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzhNQgkJCTB4MDAwMDAwMDIKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fQU1PVU5UXzE2TUIJCQkweDAwMDAwMDAzCisjCWRlZmluZSBOVjA0X1BGQl9CT09UXzBfUkFNX1dJRFRIXzEyOAkJCTB4MDAwMDAwMDQKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fVFlQRQkJCQkweDAwMDAwMDI4CisjCWRlZmluZSBOVjA0X1BGQl9CT09UXzBfUkFNX1RZUEVfU0dSQU1fOE1CSVQJCTB4MDAwMDAwMDAKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fVFlQRV9TR1JBTV8xNk1CSVQJCTB4MDAwMDAwMDgKKyMJZGVmaW5lIE5WMDRfUEZCX0JPT1RfMF9SQU1fVFlQRV9TR1JBTV8xNk1CSVRfNEJBTksJMHgwMDAwMDAxMAorIwlkZWZpbmUgTlYwNF9QRkJfQk9PVF8wX1JBTV9UWVBFX1NEUkFNXzE2TUJJVAkJMHgwMDAwMDAxOAorIwlkZWZpbmUgTlYwNF9QRkJfQk9PVF8wX1JBTV9UWVBFX1NEUkFNXzY0TUJJVAkJMHgwMDAwMDAyMAorIwlkZWZpbmUgTlYwNF9QRkJfQk9PVF8wX1JBTV9UWVBFX1NEUkFNXzY0TUJJVFgxNgkJMHgwMDAwMDAyOAorIwlkZWZpbmUgTlYwNF9QRkJfQk9PVF8wX1VNQV9FTkFCTEUJCQkweDAwMDAwMTAwCisjCWRlZmluZSBOVjA0X1BGQl9CT09UXzBfVU1BX1NJWkUJCQkJMHgwMDAwZjAwMAorI2RlZmluZSBOVjA0X1BGQl9ERUJVR18wCQkJCQkweDAwMTAwMDgwCisjCWRlZmluZSBOVjA0X1BGQl9ERUJVR18wX1BBR0VfTU9ERQkJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIE5WMDRfUEZCX0RFQlVHXzBfUkVGUkVTSF9PRkYJCQkweDAwMDAwMDEwCisjCWRlZmluZSBOVjA0X1BGQl9ERUJVR18wX1JFRlJFU0hfQ09VTlRYNjQJCTB4MDAwMDNmMDAKKyMJZGVmaW5lIE5WMDRfUEZCX0RFQlVHXzBfUkVGUkVTSF9TTE9XX0NMSwkJMHgwMDAwNDAwMAorIwlkZWZpbmUgTlYwNF9QRkJfREVCVUdfMF9TQUZFX01PREUJCQkweDAwMDA4MDAwCisjCWRlZmluZSBOVjA0X1BGQl9ERUJVR18wX0FMT01fRU5BQkxFCQkJMHgwMDAxMDAwMAorIwlkZWZpbmUgTlYwNF9QRkJfREVCVUdfMF9DQVNPRQkJCQkweDAwMTAwMDAwCisjCWRlZmluZSBOVjA0X1BGQl9ERUJVR18wX0NLRV9JTlZFUlQJCQkweDEwMDAwMDAwCisjCWRlZmluZSBOVjA0X1BGQl9ERUJVR18wX1JFRklOQwkJCQkweDIwMDAwMDAwCisjCWRlZmluZSBOVjA0X1BGQl9ERUJVR18wX1NBVkVfUE9XRVJfT0ZGCQkJMHg0MDAwMDAwMAorI2RlZmluZSBOVjA0X1BGQl9DRkcwCQkJCQkJMHgwMDEwMDIwMAorIwlkZWZpbmUgTlYwNF9QRkJfQ0ZHMF9TQ1JBTUJMRQkJCQkweDIwMDAwMDAwCisjZGVmaW5lIE5WMDRfUEZCX0NGRzEJCQkJCQkweDAwMTAwMjA0CisjZGVmaW5lIE5WMDRfUEZCX0ZJRk9fREFUQQkJCQkJMHgwMDEwMDIwYworIwlkZWZpbmUgTlYxMF9QRkJfRklGT19EQVRBX1JBTV9BTU9VTlRfTUJfTUFTSwkJMHhmZmYwMDAwMAorIwlkZWZpbmUgTlYxMF9QRkJfRklGT19EQVRBX1JBTV9BTU9VTlRfTUJfU0hJRlQJCTIwCisjZGVmaW5lIE5WMTBfUEZCX1JFRkNUUkwJCQkJCTB4MDAxMDAyMTAKKyMJZGVmaW5lIE5WMTBfUEZCX1JFRkNUUkxfVkFMSURfMQkJCQkoMSA8PCAzMSkKKyNkZWZpbmUgTlYwNF9QRkJfUEFECQkJCQkJMHgwMDEwMDIxYworIwlkZWZpbmUgTlYwNF9QRkJfUEFEX0NLRV9OT1JNQUwJCQkJKDEgPDwgMCkKKyNkZWZpbmUgTlYxMF9QRkJfVElMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwMjQwICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BGQl9USUxFX19TSVpFCQkJCQk4CisjZGVmaW5lIE5WMTBfUEZCX1RMSU1JVChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDI0NCArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QRkJfVFNJWkUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwMjQ4ICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BGQl9UU1RBVFVTKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAyNGMgKyAoaSoxNikpCisjZGVmaW5lIE5WMDRfUEZCX1JFRgkJCQkJCTB4MDAxMDAyZDAKKyMJZGVmaW5lIE5WMDRfUEZCX1JFRl9DTURfUkVGUkVTSAkJCQkoMSA8PCAwKQorI2RlZmluZSBOVjA0X1BGQl9QUkUJCQkJCQkweDAwMTAwMmQ0CisjCWRlZmluZSBOVjA0X1BGQl9QUkVfQ01EX1BSRUNIQVJHRQkJCSgxIDw8IDApCisjZGVmaW5lIE5WMTBfUEZCX0NMT1NFX1BBR0UyCQkJCQkweDAwMTAwMzNjCisjZGVmaW5lIE5WMDRfUEZCX1NDUkFNQkxFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNDAwICsgNCAqIChpKSkKKyNkZWZpbmUgTlY0MF9QRkJfVElMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNjAwICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BGQl9USUxFX19TSVpFXzAJCQkJCTEyCisjZGVmaW5lIE5WNDBfUEZCX1RJTEVfX1NJWkVfMQkJCQkJMTUKKyNkZWZpbmUgTlY0MF9QRkJfVExJTUlUKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNjA0ICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BGQl9UU0laRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDA2MDggKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEZCX1RTVEFUVVMoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwYyArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QRkJfVU5LXzgwMAkJCQkJMHgwMDEwMDgwMAogCi0jZGVmaW5lIE5WMDNfQk9PVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSMgICAgZGVmaW5lIE5WMDNfQk9PVF8wX1JBTV9BTU9VTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotIyAgICBkZWZpbmUgTlYwM19CT09UXzBfUkFNX0FNT1VOVF84TUIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jICAgIGRlZmluZSBOVjAzX0JPT1RfMF9SQU1fQU1PVU5UXzJNQiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSMgICAgZGVmaW5lIE5WMDNfQk9PVF8wX1JBTV9BTU9VTlRfNE1CICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotIyAgICBkZWZpbmUgTlYwM19CT09UXzBfUkFNX0FNT1VOVF84TUJfU0RSQU0gICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jICAgIGRlZmluZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzMyTUIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSMgICAgZGVmaW5lIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfNE1CICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotIyAgICBkZWZpbmUgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF84TUIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jICAgIGRlZmluZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzE2TUIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLQotI2RlZmluZSBOVjA0X0ZJRk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMjBjCi0jICAgIGRlZmluZSBOVjEwX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX01BU0sgICAgICAgICAgICAgIDB4ZmZmMDAwMDAKLSMgICAgZGVmaW5lIE5WMTBfRklGT19EQVRBX1JBTV9BTU9VTlRfTUJfU0hJRlQgICAgICAgICAgICAgMjAKKyNkZWZpbmUgTlZfUEVYVERFVl9CT09UXzAJCQkJCTB4MDAxMDEwMDAKKyNkZWZpbmUgTlZfUEVYVERFVl9CT09UXzBfUkFNQ0ZHCQkJCTB4MDAwMDAwM2MKKyMJZGVmaW5lIE5WX1BFWFRERVZfQk9PVF8wX1NUUkFQX0ZQX0lGQUNFXzEyQklUCQkoOCA8PCAxMikKKyNkZWZpbmUgTlZfUEVYVERFVl9CT09UXzMJCQkJCTB4MDAxMDEwMGMKIAogI2RlZmluZSBOVl9SQU1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAwMDAwCiAKQEAgLTEzMSwyMyArMTc2LDYgQEAKICNkZWZpbmUgTlYwNF9QVElNRVJfVElNRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTQxMAogI2RlZmluZSBOVjA0X1BUSU1FUl9BTEFSTV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5NDIwCiAKLSNkZWZpbmUgTlYwNF9QRkJfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDIwMAotI2RlZmluZSBOVjA0X1BGQl9DRkcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMjA0Ci0jZGVmaW5lIE5WNDBfUEZCXzAyMEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAyMEMKLSNkZWZpbmUgTlYxMF9QRkJfVElMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAyNDAgKyAoaSoxNikpCi0jZGVmaW5lIE5WMTBfUEZCX1RJTEVfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTlYxMF9QRkJfVExJTUlUKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAyNDQgKyAoaSoxNikpCi0jZGVmaW5lIE5WMTBfUEZCX1RTSVpFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwMjQ4ICsgKGkqMTYpKQotI2RlZmluZSBOVjEwX1BGQl9UU1RBVFVTKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDI0QyArIChpKjE2KSkKLSNkZWZpbmUgTlYxMF9QRkJfQ0xPU0VfUEFHRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDMzQwotI2RlZmluZSBOVjQwX1BGQl9USUxFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwMCArIChpKjE2KSkKLSNkZWZpbmUgTlY0MF9QRkJfVElMRV9fU0laRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTlY0MF9QRkJfVElMRV9fU0laRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgTlY0MF9QRkJfVExJTUlUKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDA2MDQgKyAoaSoxNikpCi0jZGVmaW5lIE5WNDBfUEZCX1RTSVpFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNjA4ICsgKGkqMTYpKQotI2RlZmluZSBOVjQwX1BGQl9UU1RBVFVTKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwQyArIChpKjE2KSkKLSNkZWZpbmUgTlY0MF9QRkJfVU5LXzgwMAkJCQkJMHgwMDEwMDgwMAotCiAjZGVmaW5lIE5WMDRfUEdSQVBIX0RFQlVHXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwODAKICNkZWZpbmUgTlYwNF9QR1JBUEhfREVCVUdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDA4NAogI2RlZmluZSBOVjA0X1BHUkFQSF9ERUJVR18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDg4CkBAIC04MTQsNiArODQyLDcgQEAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBmZmYKICNkZWZpbmUgTlY1MF9TT1JfRFBfQ1RSTChpLGwpICAgICAgICAgICAgKDB4MDA2MWMxMGMgKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfRU5IQU5DRURfRlJBTUVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCiAjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWYwMDAwCiAjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV8wX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKaW5kZXggMWQ2ZWU4Yi4uNDkxNzY3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwpAQCAtOTcsNyArOTcsNiBAQAogCiAJTlZfREVCVUcoZGV2LCAicGc9MHglbHhcbiIsIG1lbS0+bW1fbm9kZS0+c3RhcnQpOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKG52YmUtPmRldiwgdHJ1ZSk7CiAJcHRlID0gbm91dmVhdV9zZ2RtYV9wdGUobnZiZS0+ZGV2LCBtZW0tPm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQpOwogCW52YmUtPnB0ZV9zdGFydCA9IHB0ZTsKIAlmb3IgKGkgPSAwOyBpIDwgbnZiZS0+bnJfcGFnZXM7IGkrKykgewpAQCAtMTE2LDI0ICsxMTUsMTEgQEAKIAkJCWRtYV9vZmZzZXQgKz0gTlZfQ1RYRE1BX1BBR0VfU0laRTsKIAkJfQogCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhudmJlLT5kZXYpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChudmJlLT5kZXYpOwogCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDUwMDAxKTsKLQkJaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgewotCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOwotCQkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsCi0JCQkJCQludl9yZDMyKGRldiwgMHgxMDBjODApKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEpOwotCQlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7Ci0JCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwKLQkJCQkJCW52X3JkMzIoZGV2LCAweDEwMGM4MCkpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQorCQludjUwX3ZtX2ZsdXNoKGRldiwgNSk7IC8qIFBHUkFQSCAqLworCQludjUwX3ZtX2ZsdXNoKGRldiwgMCk7IC8qIFBGSUZPICovCiAJfQogCiAJbnZiZS0+Ym91bmQgPSB0cnVlOwpAQCAtMTU0LDcgKzE0MCw2IEBACiAJaWYgKCFudmJlLT5ib3VuZCkKIAkJcmV0dXJuIDA7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MobnZiZS0+ZGV2LCB0cnVlKTsKIAlwdGUgPSBudmJlLT5wdGVfc3RhcnQ7CiAJZm9yIChpID0gMDsgaSA8IG52YmUtPm5yX3BhZ2VzOyBpKyspIHsKIAkJZG1hX2FkZHJfdCBkbWFfb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXM7CkBAIC0xNzAsMjQgKzE1NSwxMSBAQAogCQkJZG1hX29mZnNldCArPSBOVl9DVFhETUFfUEFHRV9TSVpFOwogCQl9CiAJfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKG52YmUtPmRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKG52YmUtPmRldik7CiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewotCQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNTAwMDEpOwotCQlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7Ci0JCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwKLQkJCQkJCW52X3JkMzIoZGV2LCAweDEwMGM4MCkpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDAwMDAwMSk7Ci0JCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDIpXG4iKTsKLQkJCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLAotCQkJCQkJbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9CisJCW52NTBfdm1fZmx1c2goZGV2LCA1KTsKKwkJbnY1MF92bV9mbHVzaChkZXYsIDApOwogCX0KIAogCW52YmUtPmJvdW5kID0gZmFsc2U7CkBAIC0yNzIsNyArMjQ0LDYgQEAKIAkJcGNpX21hcF9wYWdlKGRldi0+cGRldiwgZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9wYWdlLCAwLAogCQkJICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CiAJCS8qIE1heWJlIHVzZSBOVl9ETUFfVEFSR0VUX0FHUCBmb3IgUENJRT8gTlZJRElBIGRvIHRoaXMsIGFuZAogCQkgKiBjb25maXJtZWQgdG8gd29yayBvbiBjNTEuICBQZXJoYXBzIG1lYW5zIE5WX0RNQV9UQVJHRVRfUENJRQpAQCAtMjk0LDcgKzI2NSw3IEBACiAJCQludl93bzMyKGRldiwgZ3B1b2JqLCAoaSs0KS80LCAwKTsKIAkJfQogCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCiAJZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlICAgICAgPSBOT1VWRUFVX0dBUlRfU0dETUE7CiAJZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2UgPSAwOwpAQCAtMzI1LDE0ICsyOTYsMTEgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWE7Ci0Jc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOwogCWludCBwdGU7CiAKIAlwdGUgPSAob2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKTsKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWluc3RtZW0tPnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOwogCQkqcGFnZSA9IG52X3JvMzIoZGV2LCBncHVvYmosIChwdGUgKyAyKSkgJiB+TlZfQ1RYRE1BX1BBR0VfTUFTSzsKLQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYwppbmRleCBiMDJhMjMxLi5lZTM3MjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSAibnY1MF9kaXNwbGF5LmgiCiAKIHN0YXRpYyB2b2lkIG5vdXZlYXVfc3R1Yl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSB7fQorc3RhdGljIGludCBub3V2ZWF1X3N0dWJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CiAKIHN0YXRpYyBpbnQgbm91dmVhdV9pbml0X2VuZ2luZV9wdHJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC01NCw4ICs1NSw3IEBACiAJCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudjA0X2luc3RtZW1fY2xlYXI7CiAJCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52MDRfaW5zdG1lbV9iaW5kOwogCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52MDRfaW5zdG1lbV91bmJpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS5wcmVwYXJlX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9wcmVwYXJlX2FjY2VzczsKLQkJZW5naW5lLT5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MJPSBudjA0X2luc3RtZW1fZmluaXNoX2FjY2VzczsKKwkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCQk9IG52MDRfaW5zdG1lbV9mbHVzaDsKIAkJZW5naW5lLT5tYy5pbml0CQkJPSBudjA0X21jX2luaXQ7CiAJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnYwNF9tY190YWtlZG93bjsKIAkJZW5naW5lLT50aW1lci5pbml0CQk9IG52MDRfdGltZXJfaW5pdDsKQEAgLTg1LDYgKzg1LDE2IEBACiAJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjA0X2ZpZm9fZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnYwNF9maWZvX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnYwNF9maWZvX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG52MDRfZGlzcGxheV9lYXJseV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkubGF0ZV90YWtlZG93bgk9IG52MDRfZGlzcGxheV9sYXRlX3Rha2Vkb3duOworCQllbmdpbmUtPmRpc3BsYXkuY3JlYXRlCQk9IG52MDRfZGlzcGxheV9jcmVhdGU7CisJCWVuZ2luZS0+ZGlzcGxheS5pbml0CQk9IG52MDRfZGlzcGxheV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveQkJPSBudjA0X2Rpc3BsYXlfZGVzdHJveTsKKwkJZW5naW5lLT5ncGlvLmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Z3Bpby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3Bpby5nZXQJCT0gTlVMTDsKKwkJZW5naW5lLT5ncGlvLnNldAkJPSBOVUxMOworCQllbmdpbmUtPmdwaW8uaXJxX2VuYWJsZQkJPSBOVUxMOwogCQlicmVhazsKIAljYXNlIDB4MTA6CiAJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OwpAQCAtOTUsOCArMTA1LDcgQEAKIAkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKIAkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOwotCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnYwNF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOwogCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OwpAQCAtMTI4LDYgKzEzNywxNiBAQAogCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MTBfZmlmb19sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MTBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5kaXNwbGF5LmVhcmx5X2luaXQJPSBudjA0X2Rpc3BsYXlfZWFybHlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmxhdGVfdGFrZWRvd24JPSBudjA0X2Rpc3BsYXlfbGF0ZV90YWtlZG93bjsKKwkJZW5naW5lLT5kaXNwbGF5LmNyZWF0ZQkJPSBudjA0X2Rpc3BsYXlfY3JlYXRlOworCQllbmdpbmUtPmRpc3BsYXkuaW5pdAkJPSBudjA0X2Rpc3BsYXlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3kJCT0gbnYwNF9kaXNwbGF5X2Rlc3Ryb3k7CisJCWVuZ2luZS0+Z3Bpby5pbml0CQk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmdwaW8uZ2V0CQk9IG52MTBfZ3Bpb19nZXQ7CisJCWVuZ2luZS0+Z3Bpby5zZXQJCT0gbnYxMF9ncGlvX3NldDsKKwkJZW5naW5lLT5ncGlvLmlycV9lbmFibGUJCT0gTlVMTDsKIAkJYnJlYWs7CiAJY2FzZSAweDIwOgogCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudjA0X2luc3RtZW1faW5pdDsKQEAgLTEzOCw4ICsxNTcsNyBAQAogCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOwogCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKIAkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOwotCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7Ci0JCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjA0X2luc3RtZW1fZmx1c2g7CiAJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OwogCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CiAJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CkBAIC0xNzEsNiArMTg5LDE2IEBACiAJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG52MDRfZGlzcGxheV9lYXJseV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkubGF0ZV90YWtlZG93bgk9IG52MDRfZGlzcGxheV9sYXRlX3Rha2Vkb3duOworCQllbmdpbmUtPmRpc3BsYXkuY3JlYXRlCQk9IG52MDRfZGlzcGxheV9jcmVhdGU7CisJCWVuZ2luZS0+ZGlzcGxheS5pbml0CQk9IG52MDRfZGlzcGxheV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveQkJPSBudjA0X2Rpc3BsYXlfZGVzdHJveTsKKwkJZW5naW5lLT5ncGlvLmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Z3Bpby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3Bpby5nZXQJCT0gbnYxMF9ncGlvX2dldDsKKwkJZW5naW5lLT5ncGlvLnNldAkJPSBudjEwX2dwaW9fc2V0OworCQllbmdpbmUtPmdwaW8uaXJxX2VuYWJsZQkJPSBOVUxMOwogCQlicmVhazsKIAljYXNlIDB4MzA6CiAJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OwpAQCAtMTgxLDE1ICsyMDksMTQgQEAKIAkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKIAkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOwotCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnYwNF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOwogCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OwogCQllbmdpbmUtPnRpbWVyLnJlYWQJCT0gbnYwNF90aW1lcl9yZWFkOwogCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247Ci0JCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYxMF9mYl9pbml0OwotCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MTBfZmJfdGFrZWRvd247CisJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYzMF9mYl9pbml0OworCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MzBfZmJfdGFrZWRvd247CiAJCWVuZ2luZS0+ZmIuc2V0X3JlZ2lvbl90aWxpbmcJPSBudjEwX2ZiX3NldF9yZWdpb25fdGlsaW5nOwogCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnYzMF9ncmFwaF9ncmNsYXNzOwogCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnYzMF9ncmFwaF9pbml0OwpAQCAtMjE0LDYgKzI0MSwxNiBAQAogCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MTBfZmlmb19sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MTBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5kaXNwbGF5LmVhcmx5X2luaXQJPSBudjA0X2Rpc3BsYXlfZWFybHlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmxhdGVfdGFrZWRvd24JPSBudjA0X2Rpc3BsYXlfbGF0ZV90YWtlZG93bjsKKwkJZW5naW5lLT5kaXNwbGF5LmNyZWF0ZQkJPSBudjA0X2Rpc3BsYXlfY3JlYXRlOworCQllbmdpbmUtPmRpc3BsYXkuaW5pdAkJPSBudjA0X2Rpc3BsYXlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3kJCT0gbnYwNF9kaXNwbGF5X2Rlc3Ryb3k7CisJCWVuZ2luZS0+Z3Bpby5pbml0CQk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmdwaW8uZ2V0CQk9IG52MTBfZ3Bpb19nZXQ7CisJCWVuZ2luZS0+Z3Bpby5zZXQJCT0gbnYxMF9ncGlvX3NldDsKKwkJZW5naW5lLT5ncGlvLmlycV9lbmFibGUJCT0gTlVMTDsKIAkJYnJlYWs7CiAJY2FzZSAweDQwOgogCWNhc2UgMHg2MDoKQEAgLTIyNSw4ICsyNjIsNyBAQAogCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOwogCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKIAkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOwotCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7Ci0JCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjA0X2luc3RtZW1fZmx1c2g7CiAJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnY0MF9tY19pbml0OwogCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52NDBfbWNfdGFrZWRvd247CiAJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CkBAIC0yNTgsNiArMjk0LDE2IEBACiAJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjQwX2ZpZm9fZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnY0MF9maWZvX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnY0MF9maWZvX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG52MDRfZGlzcGxheV9lYXJseV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkubGF0ZV90YWtlZG93bgk9IG52MDRfZGlzcGxheV9sYXRlX3Rha2Vkb3duOworCQllbmdpbmUtPmRpc3BsYXkuY3JlYXRlCQk9IG52MDRfZGlzcGxheV9jcmVhdGU7CisJCWVuZ2luZS0+ZGlzcGxheS5pbml0CQk9IG52MDRfZGlzcGxheV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveQkJPSBudjA0X2Rpc3BsYXlfZGVzdHJveTsKKwkJZW5naW5lLT5ncGlvLmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Z3Bpby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3Bpby5nZXQJCT0gbnYxMF9ncGlvX2dldDsKKwkJZW5naW5lLT5ncGlvLnNldAkJPSBudjEwX2dwaW9fc2V0OworCQllbmdpbmUtPmdwaW8uaXJxX2VuYWJsZQkJPSBOVUxMOwogCQlicmVhazsKIAljYXNlIDB4NTA6CiAJY2FzZSAweDgwOiAvKiBnb3R0YSBsb3ZlIE5WSURJQSdzIGNvbnNpc3RlbmN5Li4gKi8KQEAgLTI3MSw4ICszMTcsMTAgQEAKIAkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52NTBfaW5zdG1lbV9jbGVhcjsKIAkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnY1MF9pbnN0bWVtX2JpbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnY1MF9pbnN0bWVtX3VuYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnY1MF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOwotCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52NTBfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKKwkJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAk9IG52NTBfaW5zdG1lbV9mbHVzaDsKKwkJZWxzZQorCQkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCT0gbnY4NF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52NTBfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjUwX21jX3Rha2Vkb3duOwogCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OwpAQCAtMzAwLDYgKzM0OCwxNiBAQAogCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnY1MF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52NTBfZmlmb19sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52NTBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5kaXNwbGF5LmVhcmx5X2luaXQJPSBudjUwX2Rpc3BsYXlfZWFybHlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmxhdGVfdGFrZWRvd24JPSBudjUwX2Rpc3BsYXlfbGF0ZV90YWtlZG93bjsKKwkJZW5naW5lLT5kaXNwbGF5LmNyZWF0ZQkJPSBudjUwX2Rpc3BsYXlfY3JlYXRlOworCQllbmdpbmUtPmRpc3BsYXkuaW5pdAkJPSBudjUwX2Rpc3BsYXlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3kJCT0gbnY1MF9kaXNwbGF5X2Rlc3Ryb3k7CisJCWVuZ2luZS0+Z3Bpby5pbml0CQk9IG52NTBfZ3Bpb19pbml0OworCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmdwaW8uZ2V0CQk9IG52NTBfZ3Bpb19nZXQ7CisJCWVuZ2luZS0+Z3Bpby5zZXQJCT0gbnY1MF9ncGlvX3NldDsKKwkJZW5naW5lLT5ncGlvLmlycV9lbmFibGUJCT0gbnY1MF9ncGlvX2lycV9lbmFibGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCU5WX0VSUk9SKGRldiwgIk5WJTAyeCB1bnN1cHBvcnRlZFxuIiwgZGV2X3ByaXYtPmNoaXBzZXQpOwpAQCAtNDA3LDExICs0NjUsNiBAQAogCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lOwogCWludCByZXQ7CiAKLQlOVl9ERUJVRyhkZXYsICJwcmV2IHN0YXRlID0gJWRcbiIsIGRldl9wcml2LT5pbml0X3N0YXRlKTsKLQotCWlmIChkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9PSBOT1VWRUFVX0NBUkRfSU5JVF9ET05FKQotCQlyZXR1cm4gMDsKLQogCXZnYV9jbGllbnRfcmVnaXN0ZXIoZGV2LT5wZGV2LCBkZXYsIE5VTEwsIG5vdXZlYXVfdmdhX3NldF9kZWNvZGUpOwogCXZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyX2NsaWVudChkZXYtPnBkZXYsIG5vdXZlYXVfc3dpdGNoZXJvb19zZXRfc3RhdGUsCiAJCQkJICAgICAgIG5vdXZlYXVfc3dpdGNoZXJvb19jYW5fc3dpdGNoKTsKQEAgLTQyMSwxNSArNDc0LDE3IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAJZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7Ci0JZGV2X3ByaXYtPmluaXRfc3RhdGUgPSBOT1VWRUFVX0NBUkRfSU5JVF9GQUlMRUQ7CiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrKTsKIAorCS8qIE1ha2UgdGhlIENSVENzIGFuZCBJMkMgYnVzZXMgYWNjZXNzaWJsZSAqLworCXJldCA9IGVuZ2luZS0+ZGlzcGxheS5lYXJseV9pbml0KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKIAkvKiBQYXJzZSBCSU9TIHRhYmxlcyAvIFJ1biBpbml0IHRhYmxlcyBpZiBjYXJkIG5vdCBQT1NUZWQgKi8KLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewotCQlyZXQgPSBub3V2ZWF1X2Jpb3NfaW5pdChkZXYpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQorCXJldCA9IG5vdXZlYXVfYmlvc19pbml0KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZGlzcGxheV9lYXJseTsKIAogCXJldCA9IG5vdXZlYXVfbWVtX2RldGVjdChkZXYpOwogCWlmIChyZXQpCkBAIC00NjEsMTAgKzUxNiwxNSBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2dwdW9iajsKIAorCS8qIFBHUElPICovCisJcmV0ID0gZW5naW5lLT5ncGlvLmluaXQoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9tYzsKKwogCS8qIFBUSU1FUiAqLwogCXJldCA9IGVuZ2luZS0+dGltZXIuaW5pdChkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X21jOworCQlnb3RvIG91dF9ncGlvOwogCiAJLyogUEZCICovCiAJcmV0ID0gZW5naW5lLT5mYi5pbml0KGRldik7CkBAIC00ODUsMTIgKzU0NSwxNiBAQAogCQkJZ290byBvdXRfZ3JhcGg7CiAJfQogCisJcmV0ID0gZW5naW5lLT5kaXNwbGF5LmNyZWF0ZShkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZpZm87CisKIAkvKiB0aGlzIGNhbGwgaXJxX3ByZWluc3RhbGwsIHJlZ2lzdGVyIGlycSBoYW5kbGVyIGFuZAogCSAqIGNhbGwgaXJxX3Bvc3RpbnN0YWxsCiAJICovCiAJcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldik7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfZmlmbzsKKwkJZ290byBvdXRfZGlzcGxheTsKIAogCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIDApOwogCWlmIChyZXQpCkBAIC01MDQsMzUgKzU2OCwxOCBAQAogCQkJZ290byBvdXRfaXJxOwogCX0KIAotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7Ci0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQotCQkJcmV0ID0gbnY1MF9kaXNwbGF5X2NyZWF0ZShkZXYpOwotCQllbHNlCi0JCQlyZXQgPSBudjA0X2Rpc3BsYXlfY3JlYXRlKGRldik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF9jaGFubmVsOwotCX0KLQogCXJldCA9IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoZGV2KTsKIAlpZiAocmV0KQogCQlOVl9FUlJPUihkZXYsICJFcnJvciAlZCByZWdpc3RlcmluZyBiYWNrbGlnaHRcbiIsIHJldCk7CiAKLQlkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9IE5PVVZFQVVfQ0FSRF9JTklUX0RPTkU7Ci0KLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewotCQlub3V2ZWF1X2ZiY29uX2luaXQoZGV2KTsKLQkJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRldik7Ci0JfQotCisJbm91dmVhdV9mYmNvbl9pbml0KGRldik7CisJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRldik7CiAJcmV0dXJuIDA7CiAKLW91dF9jaGFubmVsOgotCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCkgewotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShkZXZfcHJpdi0+Y2hhbm5lbCk7Ci0JCWRldl9wcml2LT5jaGFubmVsID0gTlVMTDsKLQl9CiBvdXRfaXJxOgogCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CitvdXRfZGlzcGxheToKKwllbmdpbmUtPmRpc3BsYXkuZGVzdHJveShkZXYpOwogb3V0X2ZpZm86CiAJaWYgKCFub3V2ZWF1X25vYWNjZWwpCiAJCWVuZ2luZS0+Zmlmby50YWtlZG93bihkZXYpOwpAQCAtNTQzLDYgKzU5MCw4IEBACiAJZW5naW5lLT5mYi50YWtlZG93bihkZXYpOwogb3V0X3RpbWVyOgogCWVuZ2luZS0+dGltZXIudGFrZWRvd24oZGV2KTsKK291dF9ncGlvOgorCWVuZ2luZS0+Z3Bpby50YWtlZG93bihkZXYpOwogb3V0X21jOgogCWVuZ2luZS0+bWMudGFrZWRvd24oZGV2KTsKIG91dF9ncHVvYmo6CkBAIC01NTYsNiArNjA1LDggQEAKIAlub3V2ZWF1X2dwdW9ial9sYXRlX3Rha2Vkb3duKGRldik7CiBvdXRfYmlvczoKIAlub3V2ZWF1X2Jpb3NfdGFrZWRvd24oZGV2KTsKK291dF9kaXNwbGF5X2Vhcmx5OgorCWVuZ2luZS0+ZGlzcGxheS5sYXRlX3Rha2Vkb3duKGRldik7CiBvdXQ6CiAJdmdhX2NsaWVudF9yZWdpc3RlcihkZXYtPnBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOwogCXJldHVybiByZXQ7CkBAIC01NjYsNDUgKzYxNywzOSBAQAogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKIAotCU5WX0RFQlVHKGRldiwgInByZXYgc3RhdGUgPSAlZFxuIiwgZGV2X3ByaXYtPmluaXRfc3RhdGUpOworCW5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoZGV2KTsKIAotCWlmIChkZXZfcHJpdi0+aW5pdF9zdGF0ZSAhPSBOT1VWRUFVX0NBUkRfSU5JVF9ET1dOKSB7Ci0KLQkJbm91dmVhdV9iYWNrbGlnaHRfZXhpdChkZXYpOwotCi0JCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCkgewotCQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoZGV2X3ByaXYtPmNoYW5uZWwpOwotCQkJZGV2X3ByaXYtPmNoYW5uZWwgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKCFub3V2ZWF1X25vYWNjZWwpIHsKLQkJCWVuZ2luZS0+Zmlmby50YWtlZG93bihkZXYpOwotCQkJZW5naW5lLT5ncmFwaC50YWtlZG93bihkZXYpOwotCQl9Ci0JCWVuZ2luZS0+ZmIudGFrZWRvd24oZGV2KTsKLQkJZW5naW5lLT50aW1lci50YWtlZG93bihkZXYpOwotCQllbmdpbmUtPm1jLnRha2Vkb3duKGRldik7Ci0KLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQl0dG1fYm9fY2xlYW5fbW0oJmRldl9wcml2LT50dG0uYmRldiwgVFRNX1BMX1ZSQU0pOwotCQl0dG1fYm9fY2xlYW5fbW0oJmRldl9wcml2LT50dG0uYmRldiwgVFRNX1BMX1RUKTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCW5vdXZlYXVfc2dkbWFfdGFrZWRvd24oZGV2KTsKLQotCQlub3V2ZWF1X2dwdW9ial90YWtlZG93bihkZXYpOwotCQlub3V2ZWF1X21lbV9jbG9zZShkZXYpOwotCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24oZGV2KTsKLQotCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKLQkJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7Ci0KLQkJbm91dmVhdV9ncHVvYmpfbGF0ZV90YWtlZG93bihkZXYpOwotCQlub3V2ZWF1X2Jpb3NfdGFrZWRvd24oZGV2KTsKLQotCQl2Z2FfY2xpZW50X3JlZ2lzdGVyKGRldi0+cGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLQkJZGV2X3ByaXYtPmluaXRfc3RhdGUgPSBOT1VWRUFVX0NBUkRfSU5JVF9ET1dOOworCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCkgeworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShkZXZfcHJpdi0+Y2hhbm5lbCk7CisJCWRldl9wcml2LT5jaGFubmVsID0gTlVMTDsKIAl9CisKKwlpZiAoIW5vdXZlYXVfbm9hY2NlbCkgeworCQllbmdpbmUtPmZpZm8udGFrZWRvd24oZGV2KTsKKwkJZW5naW5lLT5ncmFwaC50YWtlZG93bihkZXYpOworCX0KKwllbmdpbmUtPmZiLnRha2Vkb3duKGRldik7CisJZW5naW5lLT50aW1lci50YWtlZG93bihkZXYpOworCWVuZ2luZS0+Z3Bpby50YWtlZG93bihkZXYpOworCWVuZ2luZS0+bWMudGFrZWRvd24oZGV2KTsKKwllbmdpbmUtPmRpc3BsYXkubGF0ZV90YWtlZG93bihkZXYpOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXR0bV9ib19jbGVhbl9tbSgmZGV2X3ByaXYtPnR0bS5iZGV2LCBUVE1fUExfVlJBTSk7CisJdHRtX2JvX2NsZWFuX21tKCZkZXZfcHJpdi0+dHRtLmJkZXYsIFRUTV9QTF9UVCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJbm91dmVhdV9zZ2RtYV90YWtlZG93bihkZXYpOworCisJbm91dmVhdV9ncHVvYmpfdGFrZWRvd24oZGV2KTsKKwlub3V2ZWF1X21lbV9jbG9zZShkZXYpOworCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bihkZXYpOworCisJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKworCW5vdXZlYXVfZ3B1b2JqX2xhdGVfdGFrZWRvd24oZGV2KTsKKwlub3V2ZWF1X2Jpb3NfdGFrZWRvd24oZGV2KTsKKworCXZnYV9jbGllbnRfcmVnaXN0ZXIoZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogLyogaGVyZSBhIGNsaWVudCBkaWVzLCByZWxlYXNlIHRoZSBzdHVmZiB0aGF0IHdhcyBhbGxvY2F0ZWQgZm9yIGl0cwpAQCAtNjkxLDYgKzczNiw3IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2OwogCXVpbnQzMl90IHJlZzA7CiAJcmVzb3VyY2Vfc2l6ZV90IG1taW9fc3RhcnRfb2ZmczsKKwlpbnQgcmV0OwogCiAJZGV2X3ByaXYgPSBremFsbG9jKHNpemVvZigqZGV2X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldl9wcml2KQpAQCAtNjk5LDcgKzc0NSw2IEBACiAJZGV2X3ByaXYtPmRldiA9IGRldjsKIAogCWRldl9wcml2LT5mbGFncyA9IGZsYWdzICYgTk9VVkVBVV9GTEFHUzsKLQlkZXZfcHJpdi0+aW5pdF9zdGF0ZSA9IE5PVVZFQVVfQ0FSRF9JTklUX0RPV047CiAKIAlOVl9ERUJVRyhkZXYsICJ2ZW5kb3I6IDB4JVggZGV2aWNlOiAweCVYIGNsYXNzOiAweCVYXG4iLAogCQkgZGV2LT5wY2lfdmVuZG9yLCBkZXYtPnBjaV9kZXZpY2UsIGRldi0+cGRldi0+Y2xhc3MpOwpAQCAtNzczLDExICs4MTgsOSBAQAogCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYW4gTlYlMnggZ2VuZXJhdGlvbiBjYXJkICgweCUwOHgpXG4iLAogCQlkZXZfcHJpdi0+Y2FyZF90eXBlLCByZWcwKTsKIAotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7Ci0JCWludCByZXQgPSBub3V2ZWF1X3JlbW92ZV9jb25mbGljdGluZ19kcml2ZXJzKGRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KKwlyZXQgPSBub3V2ZWF1X3JlbW92ZV9jb25mbGljdGluZ19kcml2ZXJzKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIE1hcCBQUkFNSU4gQkFSLCBvciBvbiBvbGRlciBjYXJkcywgdGhlIGFwZXJ0dXJlIHdpdGhpbmcgQkFSMCAqLwogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKSB7CkBAIC04MTIsNDYgKzg1NSwyNiBAQAogCQlkZXZfcHJpdi0+ZmxhZ3MgfD0gTlZfTkZPUkNFMjsKIAogCS8qIEZvciBrZXJuZWwgbW9kZXNldHRpbmcsIGluaXQgY2FyZCBub3cgYW5kIGJyaW5nIHVwIGZiY29uICovCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJaW50IHJldCA9IG5vdXZlYXVfY2FyZF9pbml0KGRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KKwlyZXQgPSBub3V2ZWF1X2NhcmRfaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbm91dmVhdV9jbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQkvKiBJbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBkZXZfcHJpdiBtYXkgbm90IGJlIGFsbG9jYXRlZCB5ZXQgKi8KLQlpZiAoZGV2X3ByaXYpCi0JCW5vdXZlYXVfY2FyZF90YWtlZG93bihkZXYpOwotfQotCi0vKiBLTVM6IHdlIG5lZWQgbW1pbyBhdCBsb2FkIHRpbWUsIG5vdCB3aGVuIHRoZSBmaXJzdCBkcm0gY2xpZW50IG9wZW5zLiAqLwogdm9pZCBub3V2ZWF1X2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQotCQlyZXR1cm47Ci0KLQlub3V2ZWF1X2Nsb3NlKGRldik7CiB9CiAKIGludCBub3V2ZWF1X3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKIAotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7Ci0JCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkZXYpOwotCQlub3V2ZWF1X2ZiY29uX2ZpbmkoZGV2KTsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCQludjUwX2Rpc3BsYXlfZGVzdHJveShkZXYpOwotCQllbHNlCi0JCQludjA0X2Rpc3BsYXlfZGVzdHJveShkZXYpOwotCQlub3V2ZWF1X2Nsb3NlKGRldik7Ci0JfQorCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkZXYpOworCW5vdXZlYXVfZmJjb25fZmluaShkZXYpOworCWVuZ2luZS0+ZGlzcGxheS5kZXN0cm95KGRldik7CisJbm91dmVhdV9jYXJkX3Rha2Vkb3duKGRldik7CiAKIAlpb3VubWFwKGRldl9wcml2LT5tbWlvKTsKIAlpb3VubWFwKGRldl9wcml2LT5yYW1pbik7CkBAIC04NjcsOCArODkwLDYgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSAqZ2V0cGFyYW0gPSBkYXRhOwogCi0JTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKLQogCXN3aXRjaCAoZ2V0cGFyYW0tPnBhcmFtKSB7CiAJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0NISVBTRVRfSUQ6CiAJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5jaGlwc2V0OwpAQCAtOTM3LDggKzk1OCw2IEBACiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3NldHBhcmFtICpzZXRwYXJhbSA9IGRhdGE7CiAKLQlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOwotCiAJc3dpdGNoIChzZXRwYXJhbS0+cGFyYW0pIHsKIAlkZWZhdWx0OgogCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIHBhcmFtZXRlciAlbGxkXG4iLCBzZXRwYXJhbS0+cGFyYW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdHRtLmMKaW5kZXggYzM4NWQ1MC4uYmQzNWY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90dG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3R0bS5jCkBAIC00MiwxMyArNDIsMTMgQEAKIH0KIAogc3RhdGljIGludAotbm91dmVhdV90dG1fbWVtX2dsb2JhbF9pbml0KHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQorbm91dmVhdV90dG1fbWVtX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQogewogCXJldHVybiB0dG1fbWVtX2dsb2JhbF9pbml0KHJlZi0+b2JqZWN0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5vdXZlYXVfdHRtX21lbV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKK25vdXZlYXVfdHRtX21lbV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKIHsKIAl0dG1fbWVtX2dsb2JhbF9yZWxlYXNlKHJlZi0+b2JqZWN0KTsKIH0KQEAgLTU2LDE2ICs1NiwxNiBAQAogaW50CiBub3V2ZWF1X3R0bV9nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7Ci0Jc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpnbG9iYWxfcmVmOworCXN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqZ2xvYmFsX3JlZjsKIAlpbnQgcmV0OwogCiAJZ2xvYmFsX3JlZiA9ICZkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmOwotCWdsb2JhbF9yZWYtPmdsb2JhbF90eXBlID0gVFRNX0dMT0JBTF9UVE1fTUVNOworCWdsb2JhbF9yZWYtPmdsb2JhbF90eXBlID0gRFJNX0dMT0JBTF9UVE1fTUVNOwogCWdsb2JhbF9yZWYtPnNpemUgPSBzaXplb2Yoc3RydWN0IHR0bV9tZW1fZ2xvYmFsKTsKIAlnbG9iYWxfcmVmLT5pbml0ID0gJm5vdXZlYXVfdHRtX21lbV9nbG9iYWxfaW5pdDsKIAlnbG9iYWxfcmVmLT5yZWxlYXNlID0gJm5vdXZlYXVfdHRtX21lbV9nbG9iYWxfcmVsZWFzZTsKIAotCXJldCA9IHR0bV9nbG9iYWxfaXRlbV9yZWYoZ2xvYmFsX3JlZik7CisJcmV0ID0gZHJtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIG1lbW9yeSBhY2NvdW50aW5nXG4iKTsKIAkJZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID0gTlVMTDsKQEAgLTc0LDE1ICs3NCwxNSBAQAogCiAJZGV2X3ByaXYtPnR0bS5ib19nbG9iYWxfcmVmLm1lbV9nbG9iID0gZ2xvYmFsX3JlZi0+b2JqZWN0OwogCWdsb2JhbF9yZWYgPSAmZGV2X3ByaXYtPnR0bS5ib19nbG9iYWxfcmVmLnJlZjsKLQlnbG9iYWxfcmVmLT5nbG9iYWxfdHlwZSA9IFRUTV9HTE9CQUxfVFRNX0JPOworCWdsb2JhbF9yZWYtPmdsb2JhbF90eXBlID0gRFJNX0dMT0JBTF9UVE1fQk87CiAJZ2xvYmFsX3JlZi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHRtX2JvX2dsb2JhbCk7CiAJZ2xvYmFsX3JlZi0+aW5pdCA9ICZ0dG1fYm9fZ2xvYmFsX2luaXQ7CiAJZ2xvYmFsX3JlZi0+cmVsZWFzZSA9ICZ0dG1fYm9fZ2xvYmFsX3JlbGVhc2U7CiAKLQlyZXQgPSB0dG1fZ2xvYmFsX2l0ZW1fcmVmKGdsb2JhbF9yZWYpOworCXJldCA9IGRybV9nbG9iYWxfaXRlbV9yZWYoZ2xvYmFsX3JlZik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQlEUk1fRVJST1IoIkZhaWxlZCBzZXR0aW5nIHVwIFRUTSBCTyBzdWJzeXN0ZW1cbiIpOwotCQl0dG1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWYpOworCQlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWYpOwogCQlkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmLnJlbGVhc2UgPSBOVUxMOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTk2LDggKzk2LDggQEAKIAlpZiAoZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID09IE5VTEwpCiAJCXJldHVybjsKIAotCXR0bV9nbG9iYWxfaXRlbV91bnJlZigmZGV2X3ByaXYtPnR0bS5ib19nbG9iYWxfcmVmLnJlZik7Ci0JdHRtX2dsb2JhbF9pdGVtX3VucmVmKCZkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmKTsKKwlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT50dG0uYm9fZ2xvYmFsX3JlZi5yZWYpOworCWRybV9nbG9iYWxfaXRlbV91bnJlZigmZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZik7CiAJZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2NydGMuYwppbmRleCBlYmE2ODdmMS4uMWMyMGMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKQEAgLTE1Nyw2ICsxNTcsNyBAQAogewogCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCXVuc2lnbmVkIGNoYXIgc2VxMSA9IDAsIGNydGMxNyA9IDA7CiAJdW5zaWduZWQgY2hhciBjcnRjMUE7CiAKQEAgLTIxMSw2ICsyMTIsMTAgQEAKIAlOVlZnYVNlcVJlc2V0KGRldiwgbnZfY3J0Yy0+aW5kZXgsIGZhbHNlKTsKIAogCU5WV3JpdGVWZ2FDcnRjKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCwgY3J0YzFBKTsKKworCS8qIFVwZGF0ZSBjb25uZWN0b3IgcG9sbGluZyBtb2RlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkKKwkJbm91dmVhdV9jb25uZWN0b3Jfc2V0X3BvbGxpbmcoY29ubmVjdG9yKTsKIH0KIAogc3RhdGljIGJvb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RhYy5jCmluZGV4IDFjYjE5ZTMuLmVhMzYyNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYwpAQCAtMjIwLDYgKzIyMCw3IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKIAlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYjsKIAl1aW50MzJfdCBzYW1wbGUsIHRlc3R2YWwsIHJlZ29mZnNldCA9IG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2Rlcik7CiAJdWludDMyX3Qgc2F2ZWRfcG93ZXJjdHJsXzIgPSAwLCBzYXZlZF9wb3dlcmN0cmxfNCA9IDAsIHNhdmVkX3JvdXRwdXQsCkBAIC0yNTEsMjIgKzI1MiwyMSBAQAogCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF80LCBzYXZlZF9wb3dlcmN0cmxfNCAmIDB4ZmZmZmZmY2YpOwogCX0KIAotCXNhdmVkX2dwaW8xID0gbnYxN19ncGlvX2dldChkZXYsIERDQl9HUElPX1RWREFDMSk7Ci0Jc2F2ZWRfZ3BpbzAgPSBudjE3X2dwaW9fZ2V0KGRldiwgRENCX0dQSU9fVFZEQUMwKTsKKwlzYXZlZF9ncGlvMSA9IGdwaW8tPmdldChkZXYsIERDQl9HUElPX1RWREFDMSk7CisJc2F2ZWRfZ3BpbzAgPSBncGlvLT5nZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzApOwogCi0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMSwgZGNiLT50eXBlID09IE9VVFBVVF9UVik7Ci0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMCwgZGNiLT50eXBlID09IE9VVFBVVF9UVik7CisJZ3Bpby0+c2V0KGRldiwgRENCX0dQSU9fVFZEQUMxLCBkY2ItPnR5cGUgPT0gT1VUUFVUX1RWKTsKKwlncGlvLT5zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIGRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpOwogCiAJbXNsZWVwKDQpOwogCiAJc2F2ZWRfcm91dHB1dCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgcmVnb2Zmc2V0KTsKIAloZWFkID0gKHNhdmVkX3JvdXRwdXQgJiAweDEwMCkgPj4gODsKLSNpZiAwCi0JLyogaWYgdGhlcmUncyBhIHNwYXJlIGNydGMsIHVzaW5nIGl0IHdpbGwgbWluaW1pc2UgZmxpY2tlciBmb3IgdGhlIGNhc2UKLQkgKiB3aGVyZSB0aGUgaW4tdXNlIGNydGMgaXMgaW4gdXNlIGJ5IGFuIG9mZi1jaGlwIHRtZHMgZW5jb2RlciAqLwotCWlmICh4Zjg2X2NvbmZpZy0+Y3J0Y1toZWFkXS0+ZW5hYmxlZCAmJiAheGY4Nl9jb25maWctPmNydGNbaGVhZCBeIDFdLT5lbmFibGVkKQorCisJLyogaWYgdGhlcmUncyBhIHNwYXJlIGNydGMsIHVzaW5nIGl0IHdpbGwgbWluaW1pc2UgZmxpY2tlciAqLworCWlmICghKE5WUmVhZFZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFX1JQQzFfSU5ERVgpICYgMHhDMCkpCiAJCWhlYWQgXj0gMTsKLSNlbmRpZgorCiAJLyogbnYgZHJpdmVyIGFuZCBudjMxIHVzZSAweGZmZmZmZWVlLCBudjM0IGFuZCA2NjAwIHVzZSAweGZmZmZmZWNlICovCiAJcm91dHB1dCA9IChzYXZlZF9yb3V0cHV0ICYgMHhmZmZmZmVjZSkgfCBoZWFkIDw8IDg7CiAKQEAgLTMwNCw4ICszMDQsOCBAQAogCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF80LCBzYXZlZF9wb3dlcmN0cmxfNCk7CiAJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMiwgc2F2ZWRfcG93ZXJjdHJsXzIpOwogCi0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMSwgc2F2ZWRfZ3BpbzEpOwotCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIHNhdmVkX2dwaW8wKTsKKwlncGlvLT5zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEsIHNhdmVkX2dwaW8xKTsKKwlncGlvLT5zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIHNhdmVkX2dwaW8wKTsKIAogCXJldHVybiBzYW1wbGU7CiB9CkBAIC0zMTUsOSArMzE1LDEyIEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYjsKLQl1aW50MzJfdCBzYW1wbGUgPSBudjE3X2RhY19zYW1wbGVfbG9hZChlbmNvZGVyKTsKIAotCWlmIChzYW1wbGUgJiBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9TRU5TRUJfQUxMSEkpIHsKKwlpZiAobnYwNF9kYWNfaW5fdXNlKGVuY29kZXIpKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisKKwlpZiAobnYxN19kYWNfc2FtcGxlX2xvYWQoZW5jb2RlcikgJgorCSAgICBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9TRU5TRUJfQUxMSEkpIHsKIAkJTlZfSU5GTyhkZXYsICJMb2FkIGRldGVjdGVkIG9uIG91dHB1dCAlY1xuIiwKIAkJCSdAJyArIGZmcyhkY2ItPm9yKSk7CiAJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKQEAgLTMzMCw2ICszMzMsOSBAQAogCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAogCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogeworCWlmIChudjA0X2RhY19pbl91c2UoZW5jb2RlcikpCisJCXJldHVybiBmYWxzZTsKKwogCXJldHVybiB0cnVlOwogfQogCkBAIC00MjgsNiArNDM0LDE3IEBACiAJfQogfQogCisvKiBDaGVjayBpZiB0aGUgREFDIGNvcnJlc3BvbmRpbmcgdG8gJ2VuY29kZXInIGlzIGJlaW5nIHVzZWQgYnkKKyAqIHNvbWVvbmUgZWxzZS4gKi8KK2Jvb2wgbnYwNF9kYWNfaW5fdXNlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkY2JfZW50cnkgKmRjYiA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+ZGNiOworCisJcmV0dXJuIG52X2dmNF9kaXNwX2FyY2goZW5jb2Rlci0+ZGV2KSAmJgorCQkoZGV2X3ByaXYtPmRhY191c2Vyc1tmZnMoZGNiLT5vcikgLSAxXSAmIH4oMSA8PCBkY2ItPmluZGV4KSk7Cit9CisKIHN0YXRpYyB2b2lkIG52MDRfZGFjX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwpAQCAtNTAxLDExICs1MTgsMTMgQEAKIAkuZGVzdHJveSA9IG52MDRfZGFjX2Rlc3Ryb3ksCiB9OwogCi1pbnQgbnYwNF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQoraW50CitudjA0X2RhY19jcmVhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCiB7CiAJY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKIAlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCiAJbnZfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpudl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudl9lbmNvZGVyKQpAQCAtNTI3LDUgKzU0Niw2IEBACiAJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CiAJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKIAorCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kZnAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGZwLmMKaW5kZXggNDE2MzRkNC4uMzMxMWYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kZnAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RmcC5jCkBAIC00MTMsMTAgKzQxMyw2IEBACiAJc3RydWN0IGRjYl9lbnRyeSAqZGNiZSA9IG52X2VuY29kZXItPmRjYjsKIAlpbnQgaGVhZCA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKS0+aW5kZXg7CiAKLQlOVl9JTkZPKGRldiwgIk91dHB1dCAlcyBpcyBydW5uaW5nIG9uIENSVEMgJWQgdXNpbmcgb3V0cHV0ICVjXG4iLAotCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKCZub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZSksCi0JCW52X2NydGMtPmluZGV4LCAnQCcgKyBmZnMobnZfZW5jb2Rlci0+ZGNiLT5vcikpOwotCiAJaWYgKGRjYmUtPnR5cGUgPT0gT1VUUFVUX1RNRFMpCiAJCXJ1bl90bWRzX3RhYmxlKGRldiwgZGNiZSwgaGVhZCwgbnZfZW5jb2Rlci0+bW9kZS5jbG9jayk7CiAJZWxzZSBpZiAoZGNiZS0+dHlwZSA9PSBPVVRQVVRfTFZEUykKQEAgLTU4NCwxMSArNTgwLDEyIEBACiAJLmRlc3Ryb3kgPSBudjA0X2RmcF9kZXN0cm95LAogfTsKIAotaW50IG52MDRfZGZwX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK2ludAorbnYwNF9kZnBfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQogewogCWNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlcjsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CiAJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IE5VTEw7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCWludCB0eXBlOwogCiAJc3dpdGNoIChlbnRyeS0+dHlwZSkgewpAQCAtNjEzLDExICs2MTAsMTIgQEAKIAludl9lbmNvZGVyLT5kY2IgPSBlbnRyeTsKIAludl9lbmNvZGVyLT5vciA9IGZmcyhlbnRyeS0+b3IpIC0gMTsKIAotCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmbnYwNF9kZnBfZnVuY3MsIHR5cGUpOworCWRybV9lbmNvZGVyX2luaXQoY29ubmVjdG9yLT5kZXYsIGVuY29kZXIsICZudjA0X2RmcF9mdW5jcywgdHlwZSk7CiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCBoZWxwZXIpOwogCiAJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CiAJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKIAorCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYwppbmRleCBjNzg5OGI0Li45ZTI4Y2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYwpAQCAtMzIsOCArMzIsNiBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgogI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCiAKLSNkZWZpbmUgTVVMVElQTEVfRU5DT0RFUlMoZSkgKGUgJiAoZSAtIDEpKQotCiBzdGF0aWMgdm9pZAogbnYwNF9kaXNwbGF5X3N0b3JlX2luaXRpYWxfaGVhZF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtNDEsNyArMzksNyBAQAogCiAJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4MTEpIHsKIAkJZGV2X3ByaXYtPmNydGNfb3duZXIgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV80NCk7Ci0JCWdvdG8gb3duZXJrbm93bjsKKwkJcmV0dXJuOwogCX0KIAogCS8qIHJlYWRpbmcgQ1I0NCBpcyBicm9rZW4gb24gbnYxMSwgc28gd2UgYXR0ZW1wdCB0byBpbmZlciBpdCAqLwpAQCAtNTIsOCArNTAsNiBAQAogCQlib29sIHR2QSA9IGZhbHNlOwogCQlib29sIHR2QiA9IGZhbHNlOwogCi0JCU5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOwotCiAJCXNsYXZlZF9vbl9CID0gTlZSZWFkVmdhQ3J0YyhkZXYsIDEsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgpICYKIAkJCQkJCQkJCTB4ODA7CiAJCWlmIChzbGF2ZWRfb25fQikKQEAgLTY2LDggKzYyLDYgQEAKIAkJCXR2QSA9ICEoTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfTENEX19JTkRFWCkgJgogCQkJCQlNQVNLKE5WX0NJT19DUkVfTENEX0xDRF9TRUxFQ1QpKTsKIAotCQlOVkxvY2tWZ2FDcnRjcyhkZXYsIHRydWUpOwotCiAJCWlmIChzbGF2ZWRfb25fQSAmJiAhdHZBKQogCQkJZGV2X3ByaXYtPmNydGNfb3duZXIgPSAweDA7CiAJCWVsc2UgaWYgKHNsYXZlZF9vbl9CICYmICF0dkIpCkBAIC03OSwxNCArNzMsNDAgQEAKIAkJZWxzZQogCQkJZGV2X3ByaXYtPmNydGNfb3duZXIgPSAweDA7CiAJfQorfQogCi1vd25lcmtub3duOgotCU5WX0lORk8oZGV2LCAiSW5pdGlhbCBDUlRDX09XTkVSIGlzICVkXG4iLCBkZXZfcHJpdi0+Y3J0Y19vd25lcik7CitpbnQKK252MDRfZGlzcGxheV9lYXJseV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJLyogTWFrZSB0aGUgSTJDIGJ1c2VzIGFjY2Vzc2libGUuICovCisJaWYgKCFudl9nZjRfZGlzcF9hcmNoKGRldikpIHsKKwkJdWludDMyX3QgcG1jX2VuYWJsZSA9IG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpOwogCi0JLyogd2UgbmVlZCB0byBlbnN1cmUgdGhlIGhlYWRzIGFyZSBub3QgdGllZCBoZW5jZWZvcnRoLCBvciByZWFkaW5nIGFueQotCSAqIDggYml0IHJlZyBvbiBoZWFkIEIgd2lsbCBmYWlsCi0JICogc2V0dGluZyBhIHNpbmdsZSBhcmJpdHJhcnkgaGVhZCBzb2x2ZXMgdGhhdCAqLwotCU5WU2V0T3duZXIoZGV2LCAwKTsKKwkJaWYgKCEocG1jX2VuYWJsZSAmIDEpKQorCQkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgcG1jX2VuYWJsZSB8IDEpOworCX0KKworCS8qIFVubG9jayB0aGUgVkdBIENSVENzLiAqLworCU5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCisJLyogTWFrZSBzdXJlIHRoZSBDUlRDcyBhcmVuJ3QgaW4gc2xhdmVkIG1vZGUuICovCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKSB7CisJCW52MDRfZGlzcGxheV9zdG9yZV9pbml0aWFsX2hlYWRfb3duZXIoZGV2KTsKKwkJTlZTZXRPd25lcihkZXYsIDApOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2Rpc3BsYXlfbGF0ZV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WU2V0T3duZXIoZGV2LCBkZXZfcHJpdi0+Y3J0Y19vd25lcik7CisKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIHRydWUpOwogfQogCiBpbnQKQEAgLTk0LDE0ICsxMTQsMTMgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkY2JfdGFibGUgKmRjYiA9ICZkZXZfcHJpdi0+dmJpb3MuZGNiOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsICpjdDsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCWludCBpLCByZXQ7CiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAotCWlmIChudl90d29faGVhZHMoZGV2KSkKLQkJbnYwNF9kaXNwbGF5X3N0b3JlX2luaXRpYWxfaGVhZF9vd25lcihkZXYpOwogCW5vdXZlYXVfaHdfc2F2ZV92Z2FfZm9udHMoZGV2LCAxKTsKIAogCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7CkBAIC0xMzIsMTkgKzE1MSwyMyBAQAogCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgewogCQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQgPSAmZGNiLT5lbnRyeVtpXTsKIAorCQljb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoZGV2LCBkY2JlbnQtPmNvbm5lY3Rvcik7CisJCWlmIChJU19FUlIoY29ubmVjdG9yKSkKKwkJCWNvbnRpbnVlOworCiAJCXN3aXRjaCAoZGNiZW50LT50eXBlKSB7CiAJCWNhc2UgT1VUUFVUX0FOQUxPRzoKLQkJCXJldCA9IG52MDRfZGFjX2NyZWF0ZShkZXYsIGRjYmVudCk7CisJCQlyZXQgPSBudjA0X2RhY19jcmVhdGUoY29ubmVjdG9yLCBkY2JlbnQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1VUUFVUX0xWRFM6CiAJCWNhc2UgT1VUUFVUX1RNRFM6Ci0JCQlyZXQgPSBudjA0X2RmcF9jcmVhdGUoZGV2LCBkY2JlbnQpOworCQkJcmV0ID0gbnYwNF9kZnBfY3JlYXRlKGNvbm5lY3RvciwgZGNiZW50KTsKIAkJCWJyZWFrOwogCQljYXNlIE9VVFBVVF9UVjoKIAkJCWlmIChkY2JlbnQtPmxvY2F0aW9uID09IERDQl9MT0NfT05fQ0hJUCkKLQkJCQlyZXQgPSBudjE3X3R2X2NyZWF0ZShkZXYsIGRjYmVudCk7CisJCQkJcmV0ID0gbnYxN190dl9jcmVhdGUoY29ubmVjdG9yLCBkY2JlbnQpOwogCQkJZWxzZQotCQkJCXJldCA9IG52MDRfdHZfY3JlYXRlKGRldiwgZGNiZW50KTsKKwkJCQlyZXQgPSBudjA0X3R2X2NyZWF0ZShjb25uZWN0b3IsIGRjYmVudCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCU5WX1dBUk4oZGV2LCAiRENCIHR5cGUgJWQgbm90IGtub3duXG4iLCBkY2JlbnQtPnR5cGUpOwpAQCAtMTU1LDEyICsxNzgsMTYgQEAKIAkJCWNvbnRpbnVlOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBkY2ItPmNvbm5lY3Rvci5lbnRyaWVzOyBpKyspCi0JCW5vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZShkZXYsICZkY2ItPmNvbm5lY3Rvci5lbnRyeVtpXSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5lY3RvciwgY3QsCisJCQkJICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmICghY29ubmVjdG9yLT5lbmNvZGVyX2lkc1swXSkgeworCQkJTlZfV0FSTihkZXYsICIlcyBoYXMgbm8gZW5jb2RlcnMsIHJlbW92aW5nXG4iLAorCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCQljb25uZWN0b3ItPmZ1bmNzLT5kZXN0cm95KGNvbm5lY3Rvcik7CisJCX0KKwl9CiAKIAkvKiBTYXZlIHByZXZpb3VzIHN0YXRlICovCi0JTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkKIAkJY3J0Yy0+ZnVuY3MtPnNhdmUoY3J0Yyk7CiAKQEAgLTE5MSw4ICsyMTgsNiBAQAogCX0KIAogCS8qIFJlc3RvcmUgc3RhdGUgKi8KLQlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmZ1bmMgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKIApAQCAtMjA3LDE1ICsyMzIsMTIgQEAKIAlub3V2ZWF1X2h3X3NhdmVfdmdhX2ZvbnRzKGRldiwgMCk7CiB9CiAKLXZvaWQKLW52MDRfZGlzcGxheV9yZXN0b3JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpbnQKK252MDRfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCi0JTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7Ci0KIAkvKiBtZWguLiBtb2Rlc2V0IGFwcGFyZW50bHkgZG9lc24ndCBzZXR1cCBhbGwgdGhlIHJlZ3MgYW5kIGRlcGVuZHMKIAkgKiBvbiBwcmUtZXhpc3Rpbmcgc3RhdGUsIGZvciBub3cgbG9hZCB0aGUgc3RhdGUgb2YgdGhlIGNhcmQgKmJlZm9yZSoKIAkgKiBub3V2ZWF1IHdhcyBsb2FkZWQsIGFuZCB0aGVuIGRvIGEgbW9kZXNldC4KQEAgLTIzMywxMiArMjU1LDYgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkKIAkJY3J0Yy0+ZnVuY3MtPnJlc3RvcmUoY3J0Yyk7CiAKLQlpZiAobnZfdHdvX2hlYWRzKGRldikpIHsKLQkJTlZfSU5GTyhkZXYsICJSZXN0b3JpbmcgQ1JUQ19PV05FUiB0byAlZC5cbiIsCi0JCQlkZXZfcHJpdi0+Y3J0Y19vd25lcik7Ci0JCU5WU2V0T3duZXIoZGV2LCBkZXZfcHJpdi0+Y3J0Y19vd25lcik7Ci0JfQotCi0JTlZMb2NrVmdhQ3J0Y3MoZGV2LCB0cnVlKTsKKwlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYwppbmRleCA2NmZlNTU5Li4wNmNlZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYwpAQCAtMTEyLDYgKzExMiwxMiBAQAogCQkJTlYwM19QRklGT19DQUNIRTFfUFVTSDFfQ0hJRF9NQVNLOwogfQogCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIERNQV9GRVRDSF9FTkRJQU5ORVNTIE5WX1BGSUZPX0NBQ0hFMV9CSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBETUFfRkVUQ0hfRU5ESUFOTkVTUyAwCisjZW5kaWYKKwogaW50CiBudjA0X2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKQEAgLTEzMSwxOCArMTM3LDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKIAkvKiBTZXR1cCBpbml0aWFsIHN0YXRlICovCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJUkFNRkNfV1IoRE1BX1BVVCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKIAlSQU1GQ19XUihETUFfR0VULCBjaGFuLT5wdXNoYnVmX2Jhc2UpOwogCVJBTUZDX1dSKERNQV9JTlNUQU5DRSwgY2hhbi0+cHVzaGJ1Zi0+aW5zdGFuY2UgPj4gNCk7CiAJUkFNRkNfV1IoRE1BX0ZFVENILCAoTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzEyOF9CWVRFUyB8CiAJCQkgICAgIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV8xMjhfQllURVMgfAogCQkJICAgICBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzggfAotI2lmZGVmIF9fQklHX0VORElBTgotCQkJICAgICBOVl9QRklGT19DQUNIRTFfQklHX0VORElBTiB8Ci0jZW5kaWYKLQkJCSAgICAgMCkpOwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJCQkgICAgIERNQV9GRVRDSF9FTkRJQU5ORVNTKSk7CiAKIAkvKiBlbmFibGUgdGhlIGZpZm8gZG1hIG9wZXJhdGlvbiAqLwogCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCkBAIC0xNjksOCArMTcwLDYgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGZjID0gTlYwNF9SQU1GQyhjaGlkKSwgdG1wOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOwotCiAJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQsIG52X3JpMzIoZGV2LCBmYyArIDApKTsKIAludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCwgbnZfcmkzMihkZXYsIGZjICsgNCkpOwogCXRtcCA9IG52X3JpMzIoZGV2LCBmYyArIDgpOwpAQCAtMTgxLDggKzE4MCw2IEBACiAJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSwgbnZfcmkzMihkZXYsIGZjICsgMjApKTsKIAludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDEsIG52X3JpMzIoZGV2LCBmYyArIDI0KSk7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOwotCiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgMCk7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCwgMCk7CiB9CkBAIC0yMjMsNyArMjIwLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJUkFNRkNfV1IoRE1BX1BVVCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQpKTsKIAlSQU1GQ19XUihETUFfR0VULCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCkpOwogCXRtcCAgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0RDT1VOVCkgPDwgMTY7CkBAIC0yMzMsNyArMjI5LDYgQEAKIAlSQU1GQ19XUihETUFfRkVUQ0gsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0gpKTsKIAlSQU1GQ19XUihFTkdJTkUsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpKTsKIAlSQU1GQ19XUihQVUxMMV9FTkdJTkUsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMSkpOwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CiAKIAludjA0X2ZpZm9fZG9fbG9hZF9jb250ZXh0KGRldiwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKQEAgLTI5Nyw2ICsyOTIsNyBAQAogCiAJbnYwNF9maWZvX2luaXRfaW50cihkZXYpOwogCXBmaWZvLT5lbmFibGUoZGV2KTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgewogCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2ldKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2dyYXBoLmMKaW5kZXggNjE4MzU1ZS4uYzg5NzM0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9ncmFwaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYwpAQCAtMzQyLDcgKzM0Miw3IEBACiB9OwogCiBzdHJ1Y3QgZ3JhcGhfc3RhdGUgewotCWludCBudjA0W0FSUkFZX1NJWkUobnYwNF9ncmFwaF9jdHhfcmVncyldOworCXVpbnQzMl90IG52MDRbQVJSQVlfU0laRShudjA0X2dyYXBoX2N0eF9yZWdzKV07CiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKQEAgLTUyNyw4ICs1MjcsNyBAQAogbnYwNF9ncmFwaF9tdGhkX3NldF9yZWYoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCiAJCQlpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKIHsKLQljaGFuLT5mZW5jZS5sYXN0X3NlcXVlbmNlX2lycSA9IGRhdGE7Ci0Jbm91dmVhdV9mZW5jZV9oYW5kbGVyKGNoYW4tPmRldiwgY2hhbi0+aWQpOworCWF0b21pY19zZXQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxLCBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2luc3RtZW0uYwppbmRleCBhM2I5NTYzLi40NDA4MjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2luc3RtZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2luc3RtZW0uYwpAQCAtNDksMTAgKzQ5LDggQEAKIAlOVl9ERUJVRyhkZXYsICJSQU1JTiBzaXplOiAlZEtpQlxuIiwgZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSA+PiAxMCk7CiAKIAkvKiBDbGVhciBhbGwgb2YgaXQsIGV4Y2VwdCB0aGUgQklPUyBpbWFnZSB0aGF0J3MgaW4gdGhlIGZpcnN0IDY0S2lCICovCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJZm9yIChpID0gNjQgKiAxMDI0OyBpIDwgZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsgaSArPSA0KQogCQludl93aTMyKGRldiwgaSwgMHgwMDAwMDAwMCk7Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwNiw3ICsxMDQsNyBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3Qgb2Zmc2V0OwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAludjA0X2luc3RtZW1fZGV0ZXJtaW5lX2Ftb3VudChkZXYpOwogCW52MDRfaW5zdG1lbV9jb25maWd1cmVfZml4ZWRfdGFibGVzKGRldik7CkBAIC0xMjksMTQgKzEyNywxNCBAQAogCQkJb2Zmc2V0ID0gMHg0MDAwMDsKIAl9CiAKLQlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2hlYXAoJmRldl9wcml2LT5yYW1pbl9oZWFwLAotCQkJCSAgICBvZmZzZXQsIGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0gLSBvZmZzZXQpOworCXJldCA9IGRybV9tbV9pbml0KCZkZXZfcHJpdi0+cmFtaW5faGVhcCwgb2Zmc2V0LAorCQkJICBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtIC0gb2Zmc2V0KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9wcml2LT5yYW1pbl9oZWFwID0gTlVMTDsKLQkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGluaXQgUkFNSU4gaGVhcFxuIik7CisJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpbml0IFJBTUlOIGhlYXA6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQKQEAgLTE4NiwxMiArMTg0LDcgQEAKIH0KIAogdm9pZAotbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgd3JpdGUpCi17Ci19Ci0KLXZvaWQKLW52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitudjA0X2luc3RtZW1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9tYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9tYy5jCmluZGV4IDYxN2VkMWUuLjJhZjQzYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X21jLmMKQEAgLTExLDYgKzExLDEwIEBACiAJICovCiAKIAludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCAweEZGRkZGRkZGKTsKKworCS8qIERpc2FibGUgUFJPTSBhY2Nlc3MuICovCisJbnZfd3IzMihkZXYsIE5WX1BCVVNfUENJX05WXzIwLCBOVl9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0VOQUJMRUQpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdHYuYwppbmRleCBjNGUzNDA0Li45NGUyOTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3R2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90di5jCkBAIC0zNCw2OSArMzQsMjYgQEAKIAogI2luY2x1ZGUgImkyYy9jaDcwMDYuaCIKIAotc3RhdGljIHN0cnVjdCB7Ci0Jc3RydWN0IGkyY19ib2FyZF9pbmZvIGJvYXJkX2luZm87Ci0Jc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGZ1bmNzOwotCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaGZ1bmNzOwotCXZvaWQgKnBhcmFtczsKLQotfSBudjA0X3R2X2VuY29kZXJfaW5mb1tdID0geworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBudjA0X3R2X2VuY29kZXJfaW5mb1tdID0gewogCXsKLQkJLmJvYXJkX2luZm8gPSB7IEkyQ19CT0FSRF9JTkZPKCJjaDcwMDYiLCAweDc1KSB9LAotCQkucGFyYW1zID0gJihzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zKSB7CisJCUkyQ19CT0FSRF9JTkZPKCJjaDcwMDYiLCAweDc1KSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmKHN0cnVjdCBjaDcwMDZfZW5jb2Rlcl9wYXJhbXMpIHsKIAkJCUNINzAwNl9GT1JNQVRfUkdCMjRtMTJJLCBDSDcwMDZfQ0xPQ0tfTUFTVEVSLAogCQkJMCwgMCwgMCwKIAkJCUNINzAwNl9TWU5DX1NMQVZFLCBDSDcwMDZfU1lOQ19TRVBBUkFURUQsCiAJCQlDSDcwMDZfUE9VVF8zXzNWLCBDSDcwMDZfQUNUSVZFX0hTWU5DCi0JCX0sCisJCX0KIAl9LAorCXsgfQogfTsKIAotc3RhdGljIGJvb2wgcHJvYmVfaTJjX2FkZHIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcikKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7Ci0JCS5hZGRyID0gYWRkciwKLQkJLmxlbiA9IDAsCi0JfTsKLQotCXJldHVybiBpMmNfdHJhbnNmZXIoYWRhcHRlciwgJm1zZywgMSkgPT0gMTsKLX0KLQogaW50IG52MDRfdHZfaWRlbnRpZnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkyY19pbmRleCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjOwotCWJvb2wgd2FzX2xvY2tlZDsKLQlpbnQgaSwgcmV0OwotCi0JTlZfVFJBQ0UoZGV2LCAiUHJvYmluZyBUViBlbmNvZGVycyBvbiBJMkMgYnVzOiAlZFxuIiwgaTJjX2luZGV4KTsKLQotCWkyYyA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBpMmNfaW5kZXgpOwotCWlmICghaTJjKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdhc19sb2NrZWQgPSBOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52MDRfdHZfZW5jb2Rlcl9pbmZvKTsgaSsrKSB7Ci0JCWlmIChwcm9iZV9pMmNfYWRkcigmaTJjLT5hZGFwdGVyLAotCQkJCSAgIG52MDRfdHZfZW5jb2Rlcl9pbmZvW2ldLmJvYXJkX2luZm8uYWRkcikpIHsKLQkJCXJldCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpIDwgQVJSQVlfU0laRShudjA0X3R2X2VuY29kZXJfaW5mbykpIHsKLQkJTlZfVFJBQ0UoZGV2LCAiRGV0ZWN0ZWQgVFYgZW5jb2RlcjogJXNcbiIsCi0JCQkgbnYwNF90dl9lbmNvZGVyX2luZm9baV0uYm9hcmRfaW5mby50eXBlKTsKLQotCX0gZWxzZSB7Ci0JCU5WX1RSQUNFKGRldiwgIk5vIFRWIGVuY29kZXJzIGZvdW5kLlxuIik7Ci0JCWkgPSAtRU5PREVWOwotCX0KLQotCU5WTG9ja1ZnYUNydGNzKGRldiwgd2FzX2xvY2tlZCk7Ci0JcmV0dXJuIGk7CisJcmV0dXJuIG5vdXZlYXVfaTJjX2lkZW50aWZ5KGRldiwgIlRWIGVuY29kZXIiLAorCQkJCSAgICBudjA0X3R2X2VuY29kZXJfaW5mbywgaTJjX2luZGV4KTsKIH0KIAorCiAjZGVmaW5lIFBMTFNFTF9UVl9DUlRDMV9NQVNLCQkJCVwKIAkoTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1ZTQ0xLMQkJXAogCSB8IE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9QQ0xLMSkKQEAgLTIxNCwzMCArMTcxLDMyIEBACiAKIHN0YXRpYyB2b2lkIG52MDRfdHZfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQogCXRvX2VuY29kZXJfc2xhdmUoZW5jb2RlciktPnNsYXZlX2Z1bmNzLT5kZXN0cm95KGVuY29kZXIpOwogCiAJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKIAotCWtmcmVlKG52X2VuY29kZXIpOworCWtmcmVlKGVuY29kZXItPmhlbHBlcl9wcml2YXRlKTsKKwlrZnJlZShub3V2ZWF1X2VuY29kZXIoZW5jb2RlcikpOwogfQogCi1pbnQgbnYwNF90dl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG52MDRfdHZfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBudjA0X3R2X2Rlc3Ryb3ksCit9OworCitpbnQKK252MDRfdHZfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwOwotCXN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyAqZnVuY3MgPSBOVUxMOwotCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhmdW5jcyA9IE5VTEw7Ci0Jc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzICpzZnVuY3MgPSBOVUxMOwotCWludCBpMmNfaW5kZXggPSBlbnRyeS0+aTJjX2luZGV4OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZnVuY3M7CisJc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzICpzZnVuY3M7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9CisJCW5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBlbnRyeS0+aTJjX2luZGV4KTsKIAlpbnQgdHlwZSwgcmV0OwotCWJvb2wgd2FzX2xvY2tlZDsKIAogCS8qIEVuc3VyZSB0aGF0IHdlIGNhbiB0YWxrIHRvIHRoaXMgZW5jb2RlciAqLwotCXR5cGUgPSBudjA0X3R2X2lkZW50aWZ5KGRldiwgaTJjX2luZGV4KTsKKwl0eXBlID0gbnYwNF90dl9pZGVudGlmeShkZXYsIGVudHJ5LT5pMmNfaW5kZXgpOwogCWlmICh0eXBlIDwgMCkKIAkJcmV0dXJuIHR5cGU7CiAKQEAgLTI0Niw0MSArMjA1LDMyIEBACiAJaWYgKCFudl9lbmNvZGVyKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWhmdW5jcyA9IGt6YWxsb2Moc2l6ZW9mKCpoZnVuY3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhmdW5jcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfZnJlZTsKKwl9CisKIAkvKiBJbml0aWFsaXplIHRoZSBjb21tb24gbWVtYmVycyAqLwogCWVuY29kZXIgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKTsKIAotCWZ1bmNzID0gJm52MDRfdHZfZW5jb2Rlcl9pbmZvW3R5cGVdLmZ1bmNzOwotCWhmdW5jcyA9ICZudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5oZnVuY3M7Ci0KLQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVFZEQUMpOworCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmbnYwNF90dl9mdW5jcywgRFJNX01PREVfRU5DT0RFUl9UVkRBQyk7CiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCBoZnVuY3MpOwogCiAJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CiAJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKLQogCW52X2VuY29kZXItPmRjYiA9IGVudHJ5OwogCW52X2VuY29kZXItPm9yID0gZmZzKGVudHJ5LT5vcikgLSAxOwogCiAJLyogUnVuIHRoZSBzbGF2ZS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLwotCWFkYXAgPSAmZGV2X3ByaXYtPnZiaW9zLmRjYi5pMmNbaTJjX2luZGV4XS5jaGFuLT5hZGFwdGVyOwotCi0Jd2FzX2xvY2tlZCA9IE5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOwotCi0JcmV0ID0gZHJtX2kyY19lbmNvZGVyX2luaXQoZW5jb2Rlci0+ZGV2LCB0b19lbmNvZGVyX3NsYXZlKGVuY29kZXIpLCBhZGFwLAotCQkJCSAgICZudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5ib2FyZF9pbmZvKTsKLQotCU5WTG9ja1ZnYUNydGNzKGRldiwgd2FzX2xvY2tlZCk7Ci0KKwlyZXQgPSBkcm1faTJjX2VuY29kZXJfaW5pdChkZXYsIHRvX2VuY29kZXJfc2xhdmUoZW5jb2RlciksCisJCQkJICAgJmkyYy0+YWRhcHRlciwgJm52MDRfdHZfZW5jb2Rlcl9pbmZvW3R5cGVdKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWxfY2xlYW51cDsKIAogCS8qIEZpbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCiAJc2Z1bmNzID0gdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfZnVuY3M7CiAKLQkqZnVuY3MgPSAoc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzKSB7Ci0JCS5kZXN0cm95ID0gbnYwNF90dl9kZXN0cm95LAotCX07Ci0KIAkqaGZ1bmNzID0gKHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MpIHsKIAkJLmRwbXMgPSBudjA0X3R2X2RwbXMsCiAJCS5zYXZlID0gc2Z1bmNzLT5zYXZlLApAQCAtMjkyLDE0ICsyNDIsMTcgQEAKIAkJLmRldGVjdCA9IHNmdW5jcy0+ZGV0ZWN0LAogCX07CiAKLQkvKiBTZXQgdGhlIHNsYXZlIGVuY29kZXIgY29uZmlndXJhdGlvbiAqLwotCXNmdW5jcy0+c2V0X2NvbmZpZyhlbmNvZGVyLCBudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5wYXJhbXMpOworCS8qIEF0dGFjaCBpdCB0byB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rvci4gKi8KKwlzZnVuY3MtPnNldF9jb25maWcoZW5jb2RlciwgbnYwNF90dl9lbmNvZGVyX2luZm9bdHlwZV0ucGxhdGZvcm1fZGF0YSk7CisJc2Z1bmNzLT5jcmVhdGVfcmVzb3VyY2VzKGVuY29kZXIsIGNvbm5lY3Rvcik7CisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CiAKIAlyZXR1cm4gMDsKIAotZmFpbDoKK2ZhaWxfY2xlYW51cDoKIAlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOwotCisJa2ZyZWUoaGZ1bmNzKTsKK2ZhaWxfZnJlZToKIAlrZnJlZShudl9lbmNvZGVyKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYwppbmRleCA3YWVhYmYyLi43YTQwNjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYwpAQCAtNTUsNyArNTUsNiBAQAogCS8qIEZpbGwgZW50cmllcyB0aGF0IGFyZSBzZWVuIGZpbGxlZCBpbiBkdW1wcyBvZiBudmlkaWEgZHJpdmVyIGp1c3QKIAkgKiBhZnRlciBjaGFubmVsJ3MgaXMgcHV0IGludG8gRE1BIG1vZGUKIAkgKi8KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAludl93aTMyKGRldiwgZmMgKyAgMCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKIAludl93aTMyKGRldiwgZmMgKyAgNCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKIAludl93aTMyKGRldiwgZmMgKyAxMiwgY2hhbi0+cHVzaGJ1Zi0+aW5zdGFuY2UgPj4gNCk7CkBAIC02Niw3ICs2NSw2IEBACiAJCQkgICAgICBOVl9QRklGT19DQUNIRTFfQklHX0VORElBTiB8CiAjZW5kaWYKIAkJCSAgICAgIDApOwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CiAKIAkvKiBlbmFibGUgdGhlIGZpZm8gZG1hIG9wZXJhdGlvbiAqLwogCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCkBAIC05MSw4ICs4OSw2IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBmYyA9IE5WMTBfUkFNRkMoY2hpZCksIHRtcDsKIAotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIGZhbHNlKTsKLQogCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVULCBudl9yaTMyKGRldiwgZmMgKyAwKSk7CiAJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQsIG52X3JpMzIoZGV2LCBmYyArIDQpKTsKIAludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfUkVGX0NOVCwgbnZfcmkzMihkZXYsIGZjICsgOCkpOwpAQCAtMTE3LDggKzExMyw2IEBACiAJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0RNQV9TVUJST1VUSU5FLCBudl9yaTMyKGRldiwgZmMgKyA0OCkpOwogCiBvdXQ6Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKLQogCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQsIDApOwogCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVQsIDApOwogfQpAQCAtMTU1LDggKzE0OSw2IEBACiAJCXJldHVybiAwOwogCWZjID0gTlYxMF9SQU1GQyhjaGlkKTsKIAotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwotCiAJbnZfd2kzMihkZXYsIGZjICsgIDAsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVUKSk7CiAJbnZfd2kzMihkZXYsIGZjICsgIDQsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUKSk7CiAJbnZfd2kzMihkZXYsIGZjICsgIDgsIG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9SRUZfQ05UKSk7CkBAIC0xNzksOCArMTcxLDYgQEAKIAludl93aTMyKGRldiwgZmMgKyA0OCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpKTsKIAogb3V0OgotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7Ci0KIAludjEwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KGRldiwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3Bpby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3ZmMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3Bpby5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKworc3RhdGljIGJvb2wKK2dldF9ncGlvX2xvY2F0aW9uKHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZW50LCB1aW50MzJfdCAqcmVnLCB1aW50MzJfdCAqc2hpZnQsCisJCSAgdWludDMyX3QgKm1hc2spCit7CisJaWYgKGVudC0+bGluZSA8IDIpIHsKKwkJKnJlZyA9IE5WX1BDUlRDX0dQSU87CisJCSpzaGlmdCA9IGVudC0+bGluZSAqIDE2OworCQkqbWFzayA9IDB4MTE7CisKKwl9IGVsc2UgaWYgKGVudC0+bGluZSA8IDEwKSB7CisJCSpyZWcgPSBOVl9QQ1JUQ19HUElPX0VYVDsKKwkJKnNoaWZ0ID0gKGVudC0+bGluZSAtIDIpICogNDsKKwkJKm1hc2sgPSAweDM7CisKKwl9IGVsc2UgaWYgKGVudC0+bGluZSA8IDE0KSB7CisJCSpyZWcgPSBOVl9QQ1JUQ184NTA7CisJCSpzaGlmdCA9IChlbnQtPmxpbmUgLSAxMCkgKiA0OworCQkqbWFzayA9IDB4MzsKKworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50CitudjEwX2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZykKK3sKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmVudCA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgdGFnKTsKKwl1aW50MzJfdCByZWcsIHNoaWZ0LCBtYXNrLCB2YWx1ZTsKKworCWlmICghZW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZ2V0X2dwaW9fbG9jYXRpb24oZW50LCAmcmVnLCAmc2hpZnQsICZtYXNrKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWx1ZSA9IE5WUmVhZENSVEMoZGV2LCAwLCByZWcpID4+IHNoaWZ0OworCisJcmV0dXJuIChlbnQtPmludmVydCA/IDEgOiAwKSBeICh2YWx1ZSAmIDEpOworfQorCitpbnQKK252MTBfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICplbnQgPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJdWludDMyX3QgcmVnLCBzaGlmdCwgbWFzaywgdmFsdWU7CisKKwlpZiAoIWVudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWdldF9ncGlvX2xvY2F0aW9uKGVudCwgJnJlZywgJnNoaWZ0LCAmbWFzaykpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsdWUgPSAoKGVudC0+aW52ZXJ0ID8gMSA6IDApIF4gKHN0YXRlID8gMSA6IDApKSA8PCBzaGlmdDsKKwltYXNrID0gfihtYXNrIDw8IHNoaWZ0KTsKKworCU5WV3JpdGVDUlRDKGRldiwgMCwgcmVnLCB2YWx1ZSB8IChOVlJlYWRDUlRDKGRldiwgMCwgcmVnKSAmIG1hc2spKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN19ncGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1OGMzMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKLSAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQotICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImRybVAuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgotI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKLQotc3RhdGljIGJvb2wKLWdldF9ncGlvX2xvY2F0aW9uKHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZW50LCB1aW50MzJfdCAqcmVnLCB1aW50MzJfdCAqc2hpZnQsCi0JCSAgdWludDMyX3QgKm1hc2spCi17Ci0JaWYgKGVudC0+bGluZSA8IDIpIHsKLQkJKnJlZyA9IE5WX1BDUlRDX0dQSU87Ci0JCSpzaGlmdCA9IGVudC0+bGluZSAqIDE2OwotCQkqbWFzayA9IDB4MTE7Ci0KLQl9IGVsc2UgaWYgKGVudC0+bGluZSA8IDEwKSB7Ci0JCSpyZWcgPSBOVl9QQ1JUQ19HUElPX0VYVDsKLQkJKnNoaWZ0ID0gKGVudC0+bGluZSAtIDIpICogNDsKLQkJKm1hc2sgPSAweDM7Ci0KLQl9IGVsc2UgaWYgKGVudC0+bGluZSA8IDE0KSB7Ci0JCSpyZWcgPSBOVl9QQ1JUQ184NTA7Ci0JCSpzaGlmdCA9IChlbnQtPmxpbmUgLSAxMCkgKiA0OwotCQkqbWFzayA9IDB4MzsKLQotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50Ci1udjE3X2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZykKLXsKLQlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmVudCA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgdGFnKTsKLQl1aW50MzJfdCByZWcsIHNoaWZ0LCBtYXNrLCB2YWx1ZTsKLQotCWlmICghZW50KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghZ2V0X2dwaW9fbG9jYXRpb24oZW50LCAmcmVnLCAmc2hpZnQsICZtYXNrKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl2YWx1ZSA9IE5WUmVhZENSVEMoZGV2LCAwLCByZWcpID4+IHNoaWZ0OwotCi0JcmV0dXJuIChlbnQtPmludmVydCA/IDEgOiAwKSBeICh2YWx1ZSAmIDEpOwotfQotCi1pbnQKLW52MTdfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpCi17Ci0Jc3RydWN0IGRjYl9ncGlvX2VudHJ5ICplbnQgPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7Ci0JdWludDMyX3QgcmVnLCBzaGlmdCwgbWFzaywgdmFsdWU7Ci0KLQlpZiAoIWVudCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIWdldF9ncGlvX2xvY2F0aW9uKGVudCwgJnJlZywgJnNoaWZ0LCAmbWFzaykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JdmFsdWUgPSAoKGVudC0+aW52ZXJ0ID8gMSA6IDApIF4gKHN0YXRlID8gMSA6IDApKSA8PCBzaGlmdDsKLQltYXNrID0gfihtYXNrIDw8IHNoaWZ0KTsKLQotCU5WV3JpdGVDUlRDKGRldiwgMCwgcmVnLCB2YWx1ZSB8IChOVlJlYWRDUlRDKGRldiwgMCwgcmVnKSAmIG1hc2spKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5jCmluZGV4IDc0Yzg4MDMuLjQ0ZmVmYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfdHYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X3R2LmMKQEAgLTM3LDYgKzM3LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKmdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOwogCXVpbnQzMl90IHRlc3R2YWwsIHJlZ29mZnNldCA9IG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2Rlcik7CiAJdWludDMyX3QgZ3BpbzAsIGdwaW8xLCBmcF9odG90YWwsIGZwX2hzeW5jX3N0YXJ0LCBmcF9oc3luY19lbmQsCiAJCWZwX2NvbnRyb2wsIHRlc3RfY3RybCwgZGFjY2xrLCBjdHZfMTQsIGN0dl8xYywgY3R2XzZjOwpAQCAtNTIsOCArNTMsOCBAQAogCWhlYWQgPSAoZGFjY2xrICYgMHgxMDApID4+IDg7CiAKIAkvKiBTYXZlIHRoZSBwcmV2aW91cyBzdGF0ZS4gKi8KLQlncGlvMSA9IG52MTdfZ3Bpb19nZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEpOwotCWdwaW8wID0gbnYxN19ncGlvX2dldChkZXYsIERDQl9HUElPX1RWREFDMCk7CisJZ3BpbzEgPSBncGlvLT5nZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEpOworCWdwaW8wID0gZ3Bpby0+Z2V0KGRldiwgRENCX0dQSU9fVFZEQUMwKTsKIAlmcF9odG90YWwgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0hUT1RBTCk7CiAJZnBfaHN5bmNfc3RhcnQgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0hTWU5DX1NUQVJUKTsKIAlmcF9oc3luY19lbmQgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0hTWU5DX0VORCk7CkBAIC02NCw4ICs2NSw4IEBACiAJY3R2XzZjID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgMHg2ODBjNmMpOwogCiAJLyogUHJlcGFyZSB0aGUgREFDIGZvciBsb2FkIGRldGVjdGlvbi4gICovCi0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMSwgdHJ1ZSk7Ci0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMCwgdHJ1ZSk7CisJZ3Bpby0+c2V0KGRldiwgRENCX0dQSU9fVFZEQUMxLCB0cnVlKTsKKwlncGlvLT5zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIHRydWUpOwogCiAJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfSFRPVEFMLCAxMzQzKTsKIAlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9IU1lOQ19TVEFSVCwgMTA0Nyk7CkBAIC0xMTAsMTIgKzExMSwyNyBAQAogCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0hTWU5DX0VORCwgZnBfaHN5bmNfZW5kKTsKIAlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9IU1lOQ19TVEFSVCwgZnBfaHN5bmNfc3RhcnQpOwogCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0hUT1RBTCwgZnBfaHRvdGFsKTsKLQludjE3X2dwaW9fc2V0KGRldiwgRENCX0dQSU9fVFZEQUMxLCBncGlvMSk7Ci0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMCwgZ3BpbzApOworCWdwaW8tPnNldChkZXYsIERDQl9HUElPX1RWREFDMSwgZ3BpbzEpOworCWdwaW8tPnNldChkZXYsIERDQl9HUElPX1RWREFDMCwgZ3BpbzApOwogCiAJcmV0dXJuIHNhbXBsZTsKIH0KIAorc3RhdGljIGJvb2wKK2dldF90dl9kZXRlY3RfcXVpcmtzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90ICpwaW5fbWFzaykKK3sKKwkvKiBab3RhYyBGWDUyMDAgKi8KKwlpZiAoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHgwMzIyICYmCisJICAgIGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDE5ZGEgJiYKKwkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDEwMzUgfHwKKwkgICAgIGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDIwMzUpKSB7CisJCSpwaW5fbWFzayA9IDB4YzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwogbnYxN190dl9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewpAQCAtMTI0LDEyICsxNDAsMjAgQEAKIAlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICpjb25mID0gJmRldi0+bW9kZV9jb25maWc7CiAJc3RydWN0IG52MTdfdHZfZW5jb2RlciAqdHZfZW5jID0gdG9fdHZfZW5jKGVuY29kZXIpOwogCXN0cnVjdCBkY2JfZW50cnkgKmRjYiA9IHR2X2VuYy0+YmFzZS5kY2I7CisJYm9vbCByZWxpYWJsZSA9IGdldF90dl9kZXRlY3RfcXVpcmtzKGRldiwgJnR2X2VuYy0+cGluX21hc2spOwogCi0JaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NDIgfHwKLQkgICAgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0MykKLQkJdHZfZW5jLT5waW5fbWFzayA9IG52NDJfdHZfc2FtcGxlX2xvYWQoZW5jb2RlcikgPj4gMjggJiAweGU7Ci0JZWxzZQotCQl0dl9lbmMtPnBpbl9tYXNrID0gbnYxN19kYWNfc2FtcGxlX2xvYWQoZW5jb2RlcikgPj4gMjggJiAweGU7CisJaWYgKG52MDRfZGFjX2luX3VzZShlbmNvZGVyKSkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCisJaWYgKHJlbGlhYmxlKSB7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDQyIHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDQzKQorCQkJdHZfZW5jLT5waW5fbWFzayA9CisJCQkJbnY0Ml90dl9zYW1wbGVfbG9hZChlbmNvZGVyKSA+PiAyOCAmIDB4ZTsKKwkJZWxzZQorCQkJdHZfZW5jLT5waW5fbWFzayA9CisJCQkJbnYxN19kYWNfc2FtcGxlX2xvYWQoZW5jb2RlcikgPj4gMjggJiAweGU7CisJfQogCiAJc3dpdGNoICh0dl9lbmMtPnBpbl9tYXNrKSB7CiAJY2FzZSAweDI6CkBAIC0xNTQsNyArMTc4LDkgQEAKIAkJCQkJIGNvbmYtPnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKIAkJCQkJIHR2X2VuYy0+c3ViY29ubmVjdG9yKTsKIAotCWlmICh0dl9lbmMtPnN1YmNvbm5lY3RvcikgeworCWlmICghcmVsaWFibGUpIHsKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKwl9IGVsc2UgaWYgKHR2X2VuYy0+c3ViY29ubmVjdG9yKSB7CiAJCU5WX0lORk8oZGV2LCAiTG9hZCBkZXRlY3RlZCBvbiBvdXRwdXQgJWNcbiIsCiAJCQknQCcgKyBmZnMoZGNiLT5vcikpOwogCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CkBAIC0yOTYsNiArMzIyLDkgQEAKIHsKIAlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOwogCisJaWYgKG52MDRfZGFjX2luX3VzZShlbmNvZGVyKSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFKQogCQlhZGp1c3RlZF9tb2RlLT5jbG9jayA9IHR2X25vcm0tPmN0dl9lbmNfbW9kZS5tb2RlLmNsb2NrOwogCWVsc2UKQEAgLTMwNyw2ICszMzYsOCBAQAogc3RhdGljIHZvaWQgIG52MTdfdHZfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CiAJc3RydWN0IG52MTdfdHZfc3RhdGUgKnJlZ3MgPSAmdG9fdHZfZW5jKGVuY29kZXIpLT5zdGF0ZTsKIAlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOwogCkBAIC0zMzEsOCArMzYyLDggQEAKIAogCW52X2xvYWRfcHR2KGRldiwgcmVncywgMjAwKTsKIAotCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEsIG1vZGUgPT0gRFJNX01PREVfRFBNU19PTik7Ci0JbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMCwgbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKTsKKwlncGlvLT5zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzEsIG1vZGUgPT0gRFJNX01PREVfRFBNU19PTik7CisJZ3Bpby0+c2V0KGRldiwgRENCX0dQSU9fVFZEQUMwLCBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOwogCiAJbnYwNF9kYWNfdXBkYXRlX2RhY2NsayhlbmNvZGVyLCBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOwogfQpAQCAtNzQ0LDggKzc3NSwxMCBAQAogCS5kZXN0cm95ID0gbnYxN190dl9kZXN0cm95LAogfTsKIAotaW50IG52MTdfdHZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQoraW50CitudjE3X3R2X2NyZWF0ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IE5VTEw7CiAKQEAgLTc3NCw1ICs4MDcsNyBAQAogCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOwogCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CiAKKwludjE3X3R2X2NyZWF0ZV9yZXNvdXJjZXMoZW5jb2RlciwgY29ubmVjdG9yKTsKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MjBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MjBfZ3JhcGguYwppbmRleCBkNmZjMGE4Li4xN2YzMDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjIwX2dyYXBoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jCkBAIC0zNzAsNjggKzM3MCw1NCBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAl2b2lkICgqY3R4X2luaXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLQl1bnNpZ25lZCBpbnQgY3R4X3NpemU7CiAJdW5zaWduZWQgaW50IGlkb2ZmcyA9IDB4MjgvNDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewogCWNhc2UgMHgyMDoKLQkJY3R4X3NpemUgPSBOVjIwX0dSQ1RYX1NJWkU7CiAJCWN0eF9pbml0ID0gbnYyMF9ncmFwaF9jb250ZXh0X2luaXQ7CiAJCWlkb2ZmcyA9IDA7CiAJCWJyZWFrOwogCWNhc2UgMHgyNToKIAljYXNlIDB4Mjg6Ci0JCWN0eF9zaXplID0gTlYyNV9HUkNUWF9TSVpFOwogCQljdHhfaW5pdCA9IG52MjVfZ3JhcGhfY29udGV4dF9pbml0OwogCQlicmVhazsKIAljYXNlIDB4MmE6Ci0JCWN0eF9zaXplID0gTlYyQV9HUkNUWF9TSVpFOwogCQljdHhfaW5pdCA9IG52MmFfZ3JhcGhfY29udGV4dF9pbml0OwogCQlpZG9mZnMgPSAwOwogCQlicmVhazsKIAljYXNlIDB4MzA6CiAJY2FzZSAweDMxOgotCQljdHhfc2l6ZSA9IE5WMzBfMzFfR1JDVFhfU0laRTsKIAkJY3R4X2luaXQgPSBudjMwXzMxX2dyYXBoX2NvbnRleHRfaW5pdDsKIAkJYnJlYWs7CiAJY2FzZSAweDM0OgotCQljdHhfc2l6ZSA9IE5WMzRfR1JDVFhfU0laRTsKIAkJY3R4X2luaXQgPSBudjM0X2dyYXBoX2NvbnRleHRfaW5pdDsKIAkJYnJlYWs7CiAJY2FzZSAweDM1OgogCWNhc2UgMHgzNjoKLQkJY3R4X3NpemUgPSBOVjM1XzM2X0dSQ1RYX1NJWkU7CiAJCWN0eF9pbml0ID0gbnYzNV8zNl9ncmFwaF9jb250ZXh0X2luaXQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWN0eF9zaXplID0gMDsKLQkJY3R4X2luaXQgPSBudjM1XzM2X2dyYXBoX2NvbnRleHRfaW5pdDsKLQkJTlZfRVJST1IoZGV2LCAiUGxlYXNlIGNvbnRhY3QgdGhlIGRldnMgaWYgeW91IHdhbnQgeW91ciBOViV4IgotCQkJICAgICAgIiBjYXJkIHRvIHdvcmtcbiIsIGRldl9wcml2LT5jaGlwc2V0KTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JCWJyZWFrOworCQlCVUdfT04oMSk7CiAJfQogCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIE5VTEwsIDAsIGN0eF9zaXplLCAxNiwKLQkJCQkJICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCi0JCQkJCSAgJmNoYW4tPnJhbWluX2dyY3R4KTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgTlVMTCwgMCwgcGdyYXBoLT5ncmN0eF9zaXplLAorCQkJCSAgICAgMTYsIE5WT0JKX0ZMQUdfWkVST19BTExPQywKKwkJCQkgICAgICZjaGFuLT5yYW1pbl9ncmN0eCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIEluaXRpYWxpc2UgZGVmYXVsdCBjb250ZXh0IHZhbHVlcyAqLwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwogCWN0eF9pbml0KGRldiwgY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iaik7CiAKIAkvKiBudjIwOiBudl93bzMyKGRldiwgY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iaiwgMTAsIGNoYW4tPmlkPDwyNCk7ICovCiAJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluX2dyY3R4LT5ncHVvYmosIGlkb2ZmcywKIAkJCQkJKGNoYW4tPmlkIDw8IDI0KSB8IDB4MSk7IC8qIENUWF9VU0VSICovCiAKLQludl93bzMyKGRldiwgZGV2X3ByaXYtPmN0eF90YWJsZS0+Z3B1b2JqLCBjaGFuLT5pZCwKLQkJCWNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0KTsKLQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJbnZfd28zMihkZXYsIHBncmFwaC0+Y3R4X3RhYmxlLT5ncHVvYmosIGNoYW4tPmlkLAorCQkgICAgIGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQwLDEzICs0MjYsMTIgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAKIAlpZiAoY2hhbi0+cmFtaW5fZ3JjdHgpCiAJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtaW5fZ3JjdHgpOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7Ci0JbnZfd28zMihkZXYsIGRldl9wcml2LT5jdHhfdGFibGUtPmdwdW9iaiwgY2hhbi0+aWQsIDApOwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJbnZfd28zMihkZXYsIHBncmFwaC0+Y3R4X3RhYmxlLT5ncHVvYmosIGNoYW4tPmlkLCAwKTsKIH0KIAogaW50CkBAIC01MzgsMjkgKzUyMyw0NCBAQAogaW50CiBudjIwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPQotCQkoc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKilkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAJdWludDMyX3QgdG1wLCB2cmFtc3o7CiAJaW50IHJldCwgaTsKIAorCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4MjA6CisJCXBncmFwaC0+Z3JjdHhfc2l6ZSA9IE5WMjBfR1JDVFhfU0laRTsKKwkJYnJlYWs7CisJY2FzZSAweDI1OgorCWNhc2UgMHgyODoKKwkJcGdyYXBoLT5ncmN0eF9zaXplID0gTlYyNV9HUkNUWF9TSVpFOworCQlicmVhazsKKwljYXNlIDB4MmE6CisJCXBncmFwaC0+Z3JjdHhfc2l6ZSA9IE5WMkFfR1JDVFhfU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAidW5rbm93biBjaGlwc2V0LCBkaXNhYmxpbmcgYWNjZWxlcmF0aW9uXG4iKTsKKwkJcGdyYXBoLT5hY2NlbF9ibG9ja2VkID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKIAkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCiAJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKIAotCWlmICghZGV2X3ByaXYtPmN0eF90YWJsZSkgeworCWlmICghcGdyYXBoLT5jdHhfdGFibGUpIHsKIAkJLyogQ3JlYXRlIENvbnRleHQgUG9pbnRlciBUYWJsZSAqLwotCQlkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUgPSAzMiAqIDQ7Ci0JCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBOVUxMLCBOVUxMLCAwLAotCQkJCQkJICBkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUsIDE2LAorCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgMzIgKiA0LCAxNiwKIAkJCQkJCSAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAotCQkJCQkJICAmZGV2X3ByaXYtPmN0eF90YWJsZSk7CisJCQkJCQkgICZwZ3JhcGgtPmN0eF90YWJsZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAogCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9UQUJMRSwKLQkJIGRldl9wcml2LT5jdHhfdGFibGUtPmluc3RhbmNlID4+IDQpOworCQkgICAgIHBncmFwaC0+Y3R4X3RhYmxlLT5pbnN0YW5jZSA+PiA0KTsKIAogCW52MjBfZ3JhcGhfcmRpKGRldik7CiAKQEAgLTYxNiw3ICs2MTYsNyBAQAogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVVJGQUNFLCB0bXApOwogCiAJLyogYmVnaW4gUkFNIGNvbmZpZyAqLwotCXZyYW1zeiA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkgLSAxOworCXZyYW1zeiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDE7CiAJbnZfd3IzMihkZXYsIDB4NDAwOUE0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOwogCW52X3dyMzIoZGV2LCAweDQwMDlBOCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDAwKTsKQEAgLTY0NCwzNCArNjQ0LDUyIEBACiBudjIwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAotCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmZGV2X3ByaXYtPmN0eF90YWJsZSk7CisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZwZ3JhcGgtPmN0eF90YWJsZSk7CiB9CiAKIGludAogbnYzMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAlpbnQgcmV0LCBpOwogCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHgzMDoKKwljYXNlIDB4MzE6CisJCXBncmFwaC0+Z3JjdHhfc2l6ZSA9IE5WMzBfMzFfR1JDVFhfU0laRTsKKwkJYnJlYWs7CisJY2FzZSAweDM0OgorCQlwZ3JhcGgtPmdyY3R4X3NpemUgPSBOVjM0X0dSQ1RYX1NJWkU7CisJCWJyZWFrOworCWNhc2UgMHgzNToKKwljYXNlIDB4MzY6CisJCXBncmFwaC0+Z3JjdHhfc2l6ZSA9IE5WMzVfMzZfR1JDVFhfU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAidW5rbm93biBjaGlwc2V0LCBkaXNhYmxpbmcgYWNjZWxlcmF0aW9uXG4iKTsKKwkJcGdyYXBoLT5hY2NlbF9ibG9ja2VkID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKIAkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCiAJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKIAotCWlmICghZGV2X3ByaXYtPmN0eF90YWJsZSkgeworCWlmICghcGdyYXBoLT5jdHhfdGFibGUpIHsKIAkJLyogQ3JlYXRlIENvbnRleHQgUG9pbnRlciBUYWJsZSAqLwotCQlkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUgPSAzMiAqIDQ7Ci0JCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBOVUxMLCBOVUxMLCAwLAotCQkJCQkJICBkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUsIDE2LAorCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgMzIgKiA0LCAxNiwKIAkJCQkJCSAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAotCQkJCQkJICAmZGV2X3ByaXYtPmN0eF90YWJsZSk7CisJCQkJCQkgICZwZ3JhcGgtPmN0eF90YWJsZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAogCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9UQUJMRSwKLQkJCWRldl9wcml2LT5jdHhfdGFibGUtPmluc3RhbmNlID4+IDQpOworCQkgICAgIHBncmFwaC0+Y3R4X3RhYmxlLT5pbnN0YW5jZSA+PiA0KTsKIAogCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CkBAIC03MTcsNyArNzM1LDcgQEAKIAludl93cjMyKGRldiwgMHgwMDQwMDc1YyAgICAgICAgICAgICAsIDB4MDAwMDAwMDEpOwogCiAJLyogYmVnaW4gUkFNIGNvbmZpZyAqLwotCS8qIHZyYW1zeiA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkgLSAxOyAqLworCS8qIHZyYW1zeiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDE7ICovCiAJbnZfd3IzMihkZXYsIDB4NDAwOUE0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOwogCW52X3dyMzIoZGV2LCAweDQwMDlBOCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKIAlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHgzNCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYzMF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYzMF9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzVjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjMwX2ZiLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBGcmFuY2lzY28gSmVyZXouCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworc3RhdGljIGludAorY2FsY19yZWYoaW50IGIsIGludCBsLCBpbnQgaSkKK3sKKwlpbnQgaiwgeCA9IDA7CisKKwlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCWludCBuID0gKGIgPj4gKDggKiBqKSAmIDB4Zik7CisJCWludCBtID0gKGwgPj4gKDggKiBpKSAmIDB4ZmYpICsgMiAqIChuICYgMHg4ID8gbiAtIDB4MTAgOiBuKTsKKworCQl4IHw9ICgweDgwIHwgKG0gJiAweDFmKSkgPDwgKDggKiBqKTsKKwl9CisKKwlyZXR1cm4geDsKK30KKworaW50CitudjMwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZiX2VuZ2luZSAqcGZiID0gJmRldl9wcml2LT5lbmdpbmUuZmI7CisJaW50IGksIGo7CisKKwlwZmItPm51bV90aWxlcyA9IE5WMTBfUEZCX1RJTEVfX1NJWkU7CisKKwkvKiBUdXJuIGFsbCB0aGUgdGlsaW5nIHJlZ2lvbnMgb2ZmLiAqLworCWZvciAoaSA9IDA7IGkgPCBwZmItPm51bV90aWxlczsgaSsrKQorCQlwZmItPnNldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgMCwgMCwgMCk7CisKKwkvKiBJbml0IHRoZSBtZW1vcnkgdGltaW5nIHJlZ3MgYXQgMHgxMDAzN2MvMHgxMDAzYWMgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgzMCB8fAorCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDMxIHx8CisJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzUpIHsKKwkJLyogUmVsYXRlZCB0byBST1AgY291bnQgKi8KKwkJaW50IG4gPSAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgzMSA/IDIgOiA0KTsKKwkJaW50IGIgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPiAweDMwID8KKwkJCSBudl9yZDMyKGRldiwgMHgxMjJjKSAmIDB4ZiA6IDApOworCQlpbnQgbCA9IG52X3JkMzIoZGV2LCAweDEwMDNkMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IDM7IGorKykKKwkJCQludl93cjMyKGRldiwgMHgxMDAzN2MgKyAweGMgKiBpICsgMHg0ICogaiwKKwkJCQkJY2FsY19yZWYoYiwgbCwgaikpOworCisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJCW52X3dyMzIoZGV2LCAweDEwMDNhYyArIDB4OCAqIGkgKyAweDQgKiBqLAorCQkJCQljYWxjX3JlZihiLCBsLCBqKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYzMF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYwppbmRleCA1MDBjY2ZkLi4yYjY3ZjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYwpAQCAtNDgsNyArNDgsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAludl93aTMyKGRldiwgZmMgKyAgMCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKIAludl93aTMyKGRldiwgZmMgKyAgNCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKIAludl93aTMyKGRldiwgZmMgKyAxMiwgY2hhbi0+cHVzaGJ1Zi0+aW5zdGFuY2UgPj4gNCk7CkBAIC02MSw3ICs2MCw2IEBACiAJCQkgICAgICAweDMwMDAwMDAwIC8qIG5vIGlkZWEuLiAqLyk7CiAJbnZfd2kzMihkZXYsIGZjICsgNTYsIGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0KTsKIAludl93aTMyKGRldiwgZmMgKyA2MCwgMHgwMDAxRkZGRik7Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKIAogCS8qIGVuYWJsZSB0aGUgZmlmbyBkbWEgb3BlcmF0aW9uICovCiAJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKQEAgLTg5LDggKzg3LDYgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGZjID0gTlY0MF9SQU1GQyhjaGlkKSwgdG1wLCB0bXAyOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOwotCiAJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQsIG52X3JpMzIoZGV2LCBmYyArIDApKTsKIAludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCwgbnZfcmkzMihkZXYsIGZjICsgNCkpOwogCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9SRUZfQ05ULCBudl9yaTMyKGRldiwgZmMgKyA4KSk7CkBAIC0xMjcsOCArMTIzLDYgQEAKIAludl93cjMyKGRldiwgMHgyMDg4LCBudl9yaTMyKGRldiwgZmMgKyA3NikpOwogCW52X3dyMzIoZGV2LCAweDMzMDAsIG52X3JpMzIoZGV2LCBmYyArIDgwKSk7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOwotCiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgMCk7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCwgMCk7CiB9CkBAIC0xNjYsNyArMTYwLDYgQEAKIAkJcmV0dXJuIDA7CiAJZmMgPSBOVjQwX1JBTUZDKGNoaWQpOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJbnZfd2kzMihkZXYsIGZjICsgMCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQpKTsKIAludl93aTMyKGRldiwgZmMgKyA0LCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCkpOwogCW52X3dpMzIoZGV2LCBmYyArIDgsIG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9SRUZfQ05UKSk7CkBAIC0yMDAsNyArMTkzLDYgQEAKIAl0bXAgfD0gKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVVQpIDw8IDE2KTsKIAludl93aTMyKGRldiwgZmMgKyA3MiwgdG1wKTsKICNlbmRpZgotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CiAKIAludjQwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KGRldiwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9ncmFwaC5jCmluZGV4IDcwNGEyNWQuLmZkN2QyYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2dyYXBoLmMKQEAgLTU4LDYgKzU4LDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfZ3JjdHggY3R4ID0ge307CiAJaW50IHJldDsKIAogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCBwZ3JhcGgtPmdyY3R4X3NpemUsCkBAIC02NywyMCArNjgsMTMgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIEluaXRpYWxpc2UgZGVmYXVsdCBjb250ZXh0IHZhbHVlcyAqLwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwotCWlmICghcGdyYXBoLT5jdHhwcm9nKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2dyY3R4IGN0eCA9IHt9OworCWN0eC5kZXYgPSBjaGFuLT5kZXY7CisJY3R4Lm1vZGUgPSBOT1VWRUFVX0dSQ1RYX1ZBTFM7CisJY3R4LmRhdGEgPSBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqOworCW52NDBfZ3JjdHhfaW5pdCgmY3R4KTsKIAotCQljdHguZGV2ID0gY2hhbi0+ZGV2OwotCQljdHgubW9kZSA9IE5PVVZFQVVfR1JDVFhfVkFMUzsKLQkJY3R4LmRhdGEgPSBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqOwotCQludjQwX2dyY3R4X2luaXQoJmN0eCk7Ci0JfSBlbHNlIHsKLQkJbm91dmVhdV9ncmN0eF92YWxzX2xvYWQoZGV2LCBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqKTsKLQl9CiAJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluX2dyY3R4LT5ncHVvYmosIDAsCiAJCSAgICAgY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iai0+aW1fcHJhbWluLT5zdGFydCk7Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM4LDcgKzIzMiw4IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0KIAkJKHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICopZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgKnBmYiA9ICZkZXZfcHJpdi0+ZW5naW5lLmZiOwotCXVpbnQzMl90IHZyYW1zejsKKwlzdHJ1Y3Qgbm91dmVhdV9ncmN0eCBjdHggPSB7fTsKKwl1aW50MzJfdCB2cmFtc3osICpjcDsKIAlpbnQgaSwgajsKIAogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYKQEAgLTI0NiwzMiArMjQxLDIyIEBACiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfAogCQkJIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKIAotCWlmIChub3V2ZWF1X2N0eGZ3KSB7Ci0JCW5vdXZlYXVfZ3JjdHhfcHJvZ19sb2FkKGRldik7Ci0JCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguZ3JjdHhfc2l6ZSA9IDE3NSAqIDEwMjQ7Ci0JfQorCWNwID0ga21hbGxvYyhzaXplb2YoKmNwKSAqIDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIWRldl9wcml2LT5lbmdpbmUuZ3JhcGguY3R4cHJvZykgewotCQlzdHJ1Y3Qgbm91dmVhdV9ncmN0eCBjdHggPSB7fTsKLQkJdWludDMyX3QgKmNwOworCWN0eC5kZXYgPSBkZXY7CisJY3R4Lm1vZGUgPSBOT1VWRUFVX0dSQ1RYX1BST0c7CisJY3R4LmRhdGEgPSBjcDsKKwljdHguY3R4cHJvZ19tYXggPSAyNTY7CisJbnY0MF9ncmN0eF9pbml0KCZjdHgpOworCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguZ3JjdHhfc2l6ZSA9IGN0eC5jdHh2YWxzX3BvcyAqIDQ7CiAKLQkJY3AgPSBrbWFsbG9jKHNpemVvZigqY3ApICogMjU2LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjcCkKLQkJCXJldHVybiAtRU5PTUVNOworCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfSU5ERVgsIDApOworCWZvciAoaSA9IDA7IGkgPCBjdHguY3R4cHJvZ19sZW47IGkrKykKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9EQVRBLCBjcFtpXSk7CiAKLQkJY3R4LmRldiA9IGRldjsKLQkJY3R4Lm1vZGUgPSBOT1VWRUFVX0dSQ1RYX1BST0c7Ci0JCWN0eC5kYXRhID0gY3A7Ci0JCWN0eC5jdHhwcm9nX21heCA9IDI1NjsKLQkJbnY0MF9ncmN0eF9pbml0KCZjdHgpOwotCQlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmdyY3R4X3NpemUgPSBjdHguY3R4dmFsc19wb3MgKiA0OwotCi0JCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfSU5ERVgsIDApOwotCQlmb3IgKGkgPSAwOyBpIDwgY3R4LmN0eHByb2dfbGVuOyBpKyspCi0JCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX0RBVEEsIGNwW2ldKTsKLQotCQlrZnJlZShjcCk7Ci0JfQorCWtmcmVlKGNwKTsKIAogCS8qIE5vIGNvbnRleHQgcHJlc2VudCBjdXJyZW50bHkgKi8KIAludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgMHgwMDAwMDAwMCk7CkBAIC0zNjcsNyArMzUyLDcgQEAKIAkJbnY0MF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOwogCiAJLyogYmVnaW4gUkFNIGNvbmZpZyAqLwotCXZyYW1zeiA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkgLSAxOworCXZyYW1zeiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDE7CiAJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewogCWNhc2UgMHg0MDoKIAkJbnZfd3IzMihkZXYsIDB4NDAwOUE0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOwpAQCAtNDA3LDcgKzM5Miw2IEBACiAKIHZvaWQgbnY0MF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCW5vdXZlYXVfZ3JjdHhfZmluaShkZXYpOwogfQogCiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52NDBfZ3JhcGhfZ3JjbGFzc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9tYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9tYy5jCmluZGV4IDJhMzQ5NWUuLmU0ZTcyYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX21jLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAljYXNlIDB4NDY6IC8qIEc3MiAqLwogCWNhc2UgMHg0ZToKIAljYXNlIDB4NGM6IC8qIEM1MV9HN1ggKi8KLQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCXzAyMEMpOworCQl0bXAgPSBudl9yZDMyKGRldiwgTlYwNF9QRkJfRklGT19EQVRBKTsKIAkJbnZfd3IzMihkZXYsIE5WNDBfUE1DXzE3MDAsIHRtcCk7CiAJCW52X3dyMzIoZGV2LCBOVjQwX1BNQ18xNzA0LCAwKTsKIAkJbnZfd3IzMihkZXYsIE5WNDBfUE1DXzE3MDgsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYwppbmRleCBiNGU0YTNiLi41ZDExZWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYwpAQCAtNDQwLDQ3ICs0NDAsMTUgQEAKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwotCXVpbnQzMl90IGRhYyA9IDAsIHNvciA9IDA7CiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiaW5kZXggJWRcbiIsIG52X2NydGMtPmluZGV4KTsKIAotCS8qIERpc2Nvbm5lY3QgYWxsIHVudXNlZCBlbmNvZGVycy4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCi0JCWlmICghZHJtX2hlbHBlcl9lbmNvZGVyX2luX3VzZShlbmNvZGVyKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0FOQUxPRyB8fAotCQkgICAgbnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UVikKLQkJCWRhYyB8PSAoMSA8PCBudl9lbmNvZGVyLT5vcik7Ci0JCWVsc2UKLQkJCXNvciB8PSAoMSA8PCBudl9lbmNvZGVyLT5vcik7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKLQkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQotCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9BTkFMT0cgfHwKLQkJICAgIG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpIHsKLQkJCWlmIChkYWMgJiAoMSA8PCBudl9lbmNvZGVyLT5vcikpCi0JCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc29yICYgKDEgPDwgbnZfZW5jb2Rlci0+b3IpKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJbnZfZW5jb2Rlci0+ZGlzY29ubmVjdChudl9lbmNvZGVyKTsKLQl9Ci0KIAludjUwX2NydGNfYmxhbmsobnZfY3J0YywgdHJ1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBudjUwX2NydGNfY29tbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMyOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOwpAQCAtNDkxLDIwICs0NTksMTQgQEAKIAogCW52NTBfY3J0Y19ibGFuayhudl9jcnRjLCBmYWxzZSk7CiAKLQkvKiBFeHBsaWNpdGx5IGJsYW5rIGFsbCB1bnVzZWQgY3J0YydzLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YzIsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgewotCQlpZiAoIWRybV9oZWxwZXJfY3J0Y19pbl91c2UoY3J0YzIpKQotCQkJbnY1MF9jcnRjX2JsYW5rKG5vdXZlYXVfY3J0YyhjcnRjMiksIHRydWUpOwotCX0KLQogCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGNvbW1pdHRpbmcgY3J0Y1xuIik7CiAJCXJldHVybjsKIAl9CiAJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1VQREFURSwgMSk7Ci0JT1VUX1JJTkcoZXZvLCAwKTsKLQlGSVJFX1JJTkcoZXZvKTsKKwlPVVRfUklORyAgKGV2bywgMCk7CisJRklSRV9SSU5HIChldm8pOwogfQogCiBzdGF0aWMgYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kYWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGFjLmMKaW5kZXggMWZkOTUzNy4uMWJjMDg1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kYWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2RhYy5jCkBAIC0zNywyMiArMzcsMzEgQEAKICNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKIAogc3RhdGljIHZvaWQKLW52NTBfZGFjX2Rpc2Nvbm5lY3Qoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcikKK252NTBfZGFjX2Rpc2Nvbm5lY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKS0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CiAJaW50IHJldDsKIAorCWlmICghbnZfZW5jb2Rlci0+Y3J0YykKKwkJcmV0dXJuOworCW52NTBfY3J0Y19ibGFuayhub3V2ZWF1X2NydGMobnZfZW5jb2Rlci0+Y3J0YyksIHRydWUpOworCiAJTlZfREVCVUdfS01TKGRldiwgIkRpc2Nvbm5lY3RpbmcgREFDICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CiAKLQlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJcmV0ID0gUklOR19TUEFDRShldm8sIDQpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgZGlzY29ubmVjdGluZyBEQUNcbiIpOwogCQlyZXR1cm47CiAJfQogCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19EQUMobnZfZW5jb2Rlci0+b3IsIE1PREVfQ1RSTCksIDEpOwotCU9VVF9SSU5HKGV2bywgMCk7CisJT1VUX1JJTkcgIChldm8sIDApOworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCU9VVF9SSU5HICAoZXZvLCAwKTsKKworCW52X2VuY29kZXItPmNydGMgPSBOVUxMOwogfQogCiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwpAQCAtMjEzLDcgKzIyMiw4IEBACiAJdWludDMyX3QgbW9kZV9jdGwgPSAwLCBtb2RlX2N0bDIgPSAwOwogCWludCByZXQ7CiAKLQlOVl9ERUJVR19LTVMoZGV2LCAib3IgJWRcbiIsIG52X2VuY29kZXItPm9yKTsKKwlOVl9ERUJVR19LTVMoZGV2LCAib3IgJWQgdHlwZSAlZCBjcnRjICVkXG4iLAorCQkgICAgIG52X2VuY29kZXItPm9yLCBudl9lbmNvZGVyLT5kY2ItPnR5cGUsIGNydGMtPmluZGV4KTsKIAogCW52NTBfZGFjX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CiAKQEAgLTI0Myw2ICsyNTMsMTQgQEAKIAlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fREFDKG52X2VuY29kZXItPm9yLCBNT0RFX0NUUkwpLCAyKTsKIAlPVVRfUklORyhldm8sIG1vZGVfY3RsKTsKIAlPVVRfUklORyhldm8sIG1vZGVfY3RsMik7CisKKwludl9lbmNvZGVyLT5jcnRjID0gZW5jb2Rlci0+Y3J0YzsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY3J0YyAqCitudjUwX2RhY19jcnRjX2dldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJcmV0dXJuIG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+Y3J0YzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnY1MF9kYWNfaGVscGVyX2Z1bmNzID0gewpAQCAtMjUzLDcgKzI3MSw5IEBACiAJLnByZXBhcmUgPSBudjUwX2RhY19wcmVwYXJlLAogCS5jb21taXQgPSBudjUwX2RhY19jb21taXQsCiAJLm1vZGVfc2V0ID0gbnY1MF9kYWNfbW9kZV9zZXQsCi0JLmRldGVjdCA9IG52NTBfZGFjX2RldGVjdAorCS5nZXRfY3J0YyA9IG52NTBfZGFjX2NydGNfZ2V0LAorCS5kZXRlY3QgPSBudjUwX2RhY19kZXRlY3QsCisJLmRpc2FibGUgPSBudjUwX2RhY19kaXNjb25uZWN0CiB9OwogCiBzdGF0aWMgdm9pZApAQCAtMjc1LDE0ICsyOTUsMTEgQEAKIH07CiAKIGludAotbnY1MF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQorbnY1MF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCi0JTlZfREVCVUdfS01TKGRldiwgIlxuIik7Ci0JTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIERBQyBvdXRwdXRcbiIpOwotCiAJbnZfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpudl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudl9lbmNvZGVyKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI5MSwxNCArMzA4LDE0IEBACiAJbnZfZW5jb2Rlci0+ZGNiID0gZW50cnk7CiAJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZW50cnktPm9yKSAtIDE7CiAKLQludl9lbmNvZGVyLT5kaXNjb25uZWN0ID0gbnY1MF9kYWNfZGlzY29ubmVjdDsKLQotCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmbnY1MF9kYWNfZW5jb2Rlcl9mdW5jcywKKwlkcm1fZW5jb2Rlcl9pbml0KGNvbm5lY3Rvci0+ZGV2LCBlbmNvZGVyLCAmbnY1MF9kYWNfZW5jb2Rlcl9mdW5jcywKIAkJCSBEUk1fTU9ERV9FTkNPREVSX0RBQyk7CiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmbnY1MF9kYWNfaGVscGVyX2Z1bmNzKTsKIAogCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOwogCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwppbmRleCA1ODBhNWQxLi5mMTNhZDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwpAQCAtNzEsMTQgKzcxLDEzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CiAJbnZfd28zMihkZXYsIG9iaiwgMCwgKHRpbGVfZmxhZ3MgPDwgMjIpIHwgKG1hZ2ljX2ZsYWdzIDw8IDE2KSB8IGNsYXNzKTsKIAludl93bzMyKGRldiwgb2JqLCAxLCBsaW1pdCk7CiAJbnZfd28zMihkZXYsIG9iaiwgMiwgb2Zmc2V0KTsKIAludl93bzMyKGRldiwgb2JqLCAzLCAweDAwMDAwMDAwKTsKIAludl93bzMyKGRldiwgb2JqLCA0LCAweDAwMDAwMDAwKTsKIAludl93bzMyKGRldiwgb2JqLCA1LCAweDAwMDEwMDAwKTsKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTAsOCArMTA5LDggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2hlYXAoJmNoYW4tPnJhbWluX2hlYXAsIGNoYW4tPnJhbWluLT5ncHVvYmotPgotCQkJCSAgICBpbV9wcmFtaW4tPnN0YXJ0LCAzMjc2OCk7CisJcmV0ID0gZHJtX21tX2luaXQoJmNoYW4tPnJhbWluX2hlYXAsCisJCQkgIGNoYW4tPnJhbWluLT5ncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIDMyNzY4KTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgIkVycm9yIGluaXRpYWxpc2luZyBFVk8gUFJBTUlOIGhlYXA6ICVkXG4iLCByZXQpOwogCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CkBAIC0xNzksMTMgKzE3OCwyNSBAQAogfQogCiBpbnQKK252NTBfZGlzcGxheV9lYXJseV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfZGlzcGxheV9sYXRlX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CisKK2ludAogbnY1MF9kaXNwbGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X3RpbWVyX2VuZ2luZSAqcHRpbWVyID0gJmRldl9wcml2LT5lbmdpbmUudGltZXI7CisJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JdWludDMyX3QgdmFsLCByYW1fYW1vdW50LCBocGRfZW5bMl07CisJdWludDMyX3QgdmFsLCByYW1fYW1vdW50OwogCXVpbnQ2NF90IHN0YXJ0OwogCWludCByZXQsIGk7CiAKQEAgLTM2NiwyNiArMzc3LDEzIEBACiAJCQkJCSAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTks0MCkpOwogCiAJLyogZW5hYmxlIGhvdHBsdWcgaW50ZXJydXB0cyAqLwotCWhwZF9lblswXSA9IGhwZF9lblsxXSA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqY29ubiA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKIAogCQlpZiAoY29ubi0+ZGNiLT5ncGlvX3RhZyA9PSAweGZmKQogCQkJY29udGludWU7CiAKLQkJZ3BpbyA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgY29ubi0+ZGNiLT5ncGlvX3RhZyk7Ci0JCWlmICghZ3BpbykKLQkJCWNvbnRpbnVlOwotCi0JCWhwZF9lbltncGlvLT5saW5lID4+IDRdIHw9ICgweDAwMDEwMDAxIDw8IChncGlvLT5saW5lICYgMHhmKSk7Ci0JfQotCi0JbnZfd3IzMihkZXYsIDB4ZTA1NCwgMHhmZmZmZmZmZik7Ci0JbnZfd3IzMihkZXYsIDB4ZTA1MCwgaHBkX2VuWzBdKTsKLQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkgewotCQludl93cjMyKGRldiwgMHhlMDc0LCAweGZmZmZmZmZmKTsKLQkJbnZfd3IzMihkZXYsIDB4ZTA3MCwgaHBkX2VuWzFdKTsKKwkJcGdwaW8tPmlycV9lbmFibGUoZGV2LCBjb25uLT5kY2ItPmdwaW9fdGFnLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQ2NSw2ICs0NjMsNyBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRjYl90YWJsZSAqZGNiID0gJmRldl9wcml2LT52Ymlvcy5kY2I7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgKmN0OwogCWludCByZXQsIGk7CiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKQEAgLTUwNywxNCArNTA2LDE4IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCWNvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZShkZXYsIGVudHJ5LT5jb25uZWN0b3IpOworCQlpZiAoSVNfRVJSKGNvbm5lY3RvcikpCisJCQljb250aW51ZTsKKwogCQlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CiAJCWNhc2UgT1VUUFVUX1RNRFM6CiAJCWNhc2UgT1VUUFVUX0xWRFM6CiAJCWNhc2UgT1VUUFVUX0RQOgotCQkJbnY1MF9zb3JfY3JlYXRlKGRldiwgZW50cnkpOworCQkJbnY1MF9zb3JfY3JlYXRlKGNvbm5lY3RvciwgZW50cnkpOwogCQkJYnJlYWs7CiAJCWNhc2UgT1VUUFVUX0FOQUxPRzoKLQkJCW52NTBfZGFjX2NyZWF0ZShkZXYsIGVudHJ5KTsKKwkJCW52NTBfZGFjX2NyZWF0ZShjb25uZWN0b3IsIGVudHJ5KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJTlZfV0FSTihkZXYsICJEQ0IgZW5jb2RlciAlZCB1bmtub3duXG4iLCBlbnRyeS0+dHlwZSk7CkBAIC01MjIsMTEgKzUyNSwxMyBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMCA7IGkgPCBkY2ItPmNvbm5lY3Rvci5lbnRyaWVzOyBpKyspIHsKLQkJaWYgKGkgIT0gMCAmJiBkY2ItPmNvbm5lY3Rvci5lbnRyeVtpXS5pbmRleDIgPT0KLQkJCSAgICAgIGRjYi0+Y29ubmVjdG9yLmVudHJ5W2kgLSAxXS5pbmRleDIpCi0JCQljb250aW51ZTsKLQkJbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKGRldiwgJmRjYi0+Y29ubmVjdG9yLmVudHJ5W2ldKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29ubmVjdG9yLCBjdCwKKwkJCQkgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKCFjb25uZWN0b3ItPmVuY29kZXJfaWRzWzBdKSB7CisJCQlOVl9XQVJOKGRldiwgIiVzIGhhcyBubyBlbmNvZGVycywgcmVtb3ZpbmdcbiIsCisJCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKKwkJfQogCX0KIAogCXJldCA9IG52NTBfZGlzcGxheV9pbml0KGRldik7CkBAIC01MzgsNyArNTQzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG52NTBfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit2b2lkCitudjUwX2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTU0OCwxMzUgKzU1NCwzMCBAQAogCiAJbnY1MF9kaXNwbGF5X2Rpc2FibGUoZGV2KTsKIAludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdAotbnY1MF9kaXNwbGF5X21vZGVfY3RybChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHNvciwgaW50IG9yKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdWludDMyX3QgbWM7Ci0KLQlpZiAoc29yKSB7Ci0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4OTAgfHwKLQkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4OTIgfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhMCkKLQkJCW1jID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9QKG9yKSk7Ci0JCWVsc2UKLQkJCW1jID0gbnZfcmQzMihkZXYsIE5WOTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9QKG9yKSk7Ci0JfSBlbHNlIHsKLQkJbWMgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMX1Aob3IpKTsKLQl9Ci0KLQlyZXR1cm4gbWM7Ci19Ci0KLXN0YXRpYyBpbnQKLW52NTBfZGlzcGxheV9pcnFfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgKnBoZWFkLAotCQkgICAgICBzdHJ1Y3QgZGNiX2VudHJ5ICoqcGRjYmVudCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHVuazMwID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVU5LMzBfQ1RSTCk7Ci0JdWludDMyX3QgZGFjID0gMCwgc29yID0gMDsKLQlpbnQgaGVhZCwgaSwgb3IgPSAwLCB0eXBlID0gT1VUUFVUX0FOWTsKLQotCS8qIFdlJ3JlIGFzc3VtaW5nIHRoYXQgaGVhZCAwICpvciogaGVhZCAxIHdpbGwgYmUgYWN0aXZlIGhlcmUsCi0JICogYW5kIG5vdCBib3RoLiAgSSdtIG5vdCBzdXJlIGlmIHRoZSBodyB3aWxsIGV2ZW4gc2lnbmFsIGJvdGgKLQkgKiBldmVyLCBidXQgaXQgZGVmaW5pdGVseSBzaG91bGRuJ3QgZm9yIHVzIGFzIHdlIGNvbW1pdCBlYWNoCi0JICogQ1JUQyBzZXBhcmF0ZWx5LCBhbmQgc3VibWlzc2lvbiB3aWxsIGJlIGJsb2NrZWQgYnkgdGhlIEdQVQotCSAqIHVudGlsIHdlIGhhbmRsZSBlYWNoIGluIHR1cm4uCi0JICovCi0JTlZfREVCVUdfS01TKGRldiwgIjB4NjEwMDMwOiAweCUwOHhcbiIsIHVuazMwKTsKLQloZWFkID0gZmZzKCh1bmszMCA+PiA5KSAmIDMpIC0gMTsKLQlpZiAoaGVhZCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGhpcyBhc3N1bWVzIENSVENzIGFyZSBuZXZlciBib3VuZCB0byBtdWx0aXBsZSBlbmNvZGVycywgd2hpY2gKLQkgKiBzaG91bGQgYmUgdGhlIGNhc2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IDMgJiYgdHlwZSA9PSBPVVRQVVRfQU5ZOyBpKyspIHsKLQkJdWludDMyX3QgbWMgPSBudjUwX2Rpc3BsYXlfbW9kZV9jdHJsKGRldiwgZmFsc2UsIGkpOwotCQlpZiAoIShtYyAmICgxIDw8IGhlYWQpKSkKLQkJCWNvbnRpbnVlOwotCi0JCXN3aXRjaCAoKG1jID4+IDgpICYgMHhmKSB7Ci0JCWNhc2UgMDogdHlwZSA9IE9VVFBVVF9BTkFMT0c7IGJyZWFrOwotCQljYXNlIDE6IHR5cGUgPSBPVVRQVVRfVFY7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJTlZfRVJST1IoZGV2LCAidW5rbm93biBkYWMgbW9kZV9jdHJsOiAweCUwOHhcbiIsIGRhYyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlvciA9IGk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDQgJiYgdHlwZSA9PSBPVVRQVVRfQU5ZOyBpKyspIHsKLQkJdWludDMyX3QgbWMgPSBudjUwX2Rpc3BsYXlfbW9kZV9jdHJsKGRldiwgdHJ1ZSwgaSk7Ci0JCWlmICghKG1jICYgKDEgPDwgaGVhZCkpKQotCQkJY29udGludWU7Ci0KLQkJc3dpdGNoICgobWMgPj4gOCkgJiAweGYpIHsKLQkJY2FzZSAwOiB0eXBlID0gT1VUUFVUX0xWRFM7IGJyZWFrOwotCQljYXNlIDE6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7Ci0JCWNhc2UgMjogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKLQkJY2FzZSA1OiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOwotCQljYXNlIDg6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOwotCQljYXNlIDk6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJTlZfRVJST1IoZGV2LCAidW5rbm93biBzb3IgbW9kZV9jdHJsOiAweCUwOHhcbiIsIHNvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlvciA9IGk7Ci0JfQotCi0JTlZfREVCVUdfS01TKGRldiwgInR5cGUgJWQsIG9yICVkXG4iLCB0eXBlLCBvcik7Ci0JaWYgKHR5cGUgPT0gT1VUUFVUX0FOWSkgewotCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIGVuY29kZXIhIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnZiaW9zLmRjYi5lbnRyaWVzOyBpKyspIHsKLQkJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50ID0gJmRldl9wcml2LT52Ymlvcy5kY2IuZW50cnlbaV07Ci0KLQkJaWYgKGRjYmVudC0+dHlwZSAhPSB0eXBlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCEoZGNiZW50LT5vciAmICgxIDw8IG9yKSkpCi0JCQljb250aW51ZTsKLQotCQkqcGhlYWQgPSBoZWFkOwotCQkqcGRjYmVudCA9IGRjYmVudDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JTlZfRVJST1IoZGV2LCAibm8gRENCIGVudHJ5IGZvciAlZCAlZFxuIiwgZGFjICE9IDAsIG9yKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90Ci1udjUwX2Rpc3BsYXlfc2NyaXB0X3NlbGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCi0JCQkgICBpbnQgcHhjbGspCitzdGF0aWMgdTE2CitudjUwX2Rpc3BsYXlfc2NyaXB0X3NlbGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IsCisJCQkgICB1MzIgbWMsIGludCBweGNsaykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gTlVMTDsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CiAJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7Ci0JdWludDMyX3QgbWMsIHNjcmlwdCA9IDAsIG9yOworCXUzMiBzY3JpcHQgPSAwLCBvcjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CiAKLQkJaWYgKG52X2VuY29kZXItPmRjYiAhPSBkY2JlbnQpCisJCWlmIChudl9lbmNvZGVyLT5kY2IgIT0gZGNiKQogCQkJY29udGludWU7CiAKIAkJbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CiAJCWJyZWFrOwogCX0KIAotCW9yID0gZmZzKGRjYmVudC0+b3IpIC0gMTsKLQltYyA9IG52NTBfZGlzcGxheV9tb2RlX2N0cmwoZGV2LCBkY2JlbnQtPnR5cGUgIT0gT1VUUFVUX0FOQUxPRywgb3IpOwotCXN3aXRjaCAoZGNiZW50LT50eXBlKSB7CisJb3IgPSBmZnMoZGNiLT5vcikgLSAxOworCXN3aXRjaCAoZGNiLT50eXBlKSB7CiAJY2FzZSBPVVRQVVRfTFZEUzoKIAkJc2NyaXB0ID0gKG1jID4+IDgpICYgMHhmOwogCQlpZiAoYmlvcy0+ZnBfbm9fZGRjKSB7CkBAIC03NjcsMTcgKzY2OCw4OCBAQAogc3RhdGljIHZvaWQKIG52NTBfZGlzcGxheV91bmsxMF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50OwotCWludCBoZWFkLCByZXQ7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgdW5rMzAgPSBudl9yZDMyKGRldiwgMHg2MTAwMzApLCBtYzsKKwlpbnQgaSwgY3J0Yywgb3IsIHR5cGUgPSBPVVRQVVRfQU5ZOwogCi0JcmV0ID0gbnY1MF9kaXNwbGF5X2lycV9oZWFkKGRldiwgJmhlYWQsICZkY2JlbnQpOwotCWlmIChyZXQpCi0JCWdvdG8gYWNrOworCU5WX0RFQlVHX0tNUyhkZXYsICIweDYxMDAzMDogMHglMDh4XG4iLCB1bmszMCk7CisJZGV2X3ByaXYtPmV2b19pcnEuZGNiID0gTlVMTDsKIAogCW52X3dyMzIoZGV2LCAweDYxOTQ5NCwgbnZfcmQzMihkZXYsIDB4NjE5NDk0KSAmIH44KTsKIAotCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYmVudCwgMCwgLTEpOworCS8qIERldGVybWluZSB3aGljaCBDUlRDIHdlJ3JlIGRlYWxpbmcgd2l0aCwgb25seSAxIGV2ZXIgd2lsbCBiZQorCSAqIHNpZ25hbGxlZCBhdCB0aGUgc2FtZSB0aW1lIHdpdGggdGhlIGN1cnJlbnQgbm91dmVhdSBjb2RlLgorCSAqLworCWNydGMgPSBmZnMoKHVuazMwICYgMHgwMDAwMDA2MCkgPj4gNSkgLSAxOworCWlmIChjcnRjIDwgMCkKKwkJZ290byBhY2s7CiAKKwkvKiBOb3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgZm9yIHRoZSBlbmNvZGVyICovCisJY3J0YyA9IGZmcygodW5rMzAgJiAweDAwMDAwMTgwKSA+PiA3KSAtIDE7CisJaWYgKGNydGMgPCAwKQorCQlnb3RvIGFjazsKKworCS8qIEZpbmQgd2hpY2ggZW5jb2RlciB3YXMgY29ubmVjdGVkIHRvIHRoZSBDUlRDICovCisJZm9yIChpID0gMDsgdHlwZSA9PSBPVVRQVVRfQU5ZICYmIGkgPCAzOyBpKyspIHsKKwkJbWMgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMX0MoaSkpOworCQlOVl9ERUJVR19LTVMoZGV2LCAiREFDLSVkIG1jOiAweCUwOHhcbiIsIGksIG1jKTsKKwkJaWYgKCEobWMgJiAoMSA8PCBjcnRjKSkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKChtYyAmIDB4MDAwMDBmMDApID4+IDgpIHsKKwkJY2FzZSAwOiB0eXBlID0gT1VUUFVUX0FOQUxPRzsgYnJlYWs7CisJCWNhc2UgMTogdHlwZSA9IE9VVFBVVF9UVjsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOVl9FUlJPUihkZXYsICJpbnZhbGlkIG1jLCBEQUMtJWQ6IDB4JTA4eFxuIiwgaSwgbWMpOworCQkJZ290byBhY2s7CisJCX0KKworCQlvciA9IGk7CisJfQorCisJZm9yIChpID0gMDsgdHlwZSA9PSBPVVRQVVRfQU5ZICYmIGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0ICA8IDB4OTAgfHwKKwkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4OTIgfHwKKwkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4YTApCisJCQltYyA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9NT0RFX0NUUkxfQyhpKSk7CisJCWVsc2UKKwkJCW1jID0gbnZfcmQzMihkZXYsIE5WOTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9DKGkpKTsKKworCQlOVl9ERUJVR19LTVMoZGV2LCAiU09SLSVkIG1jOiAweCUwOHhcbiIsIGksIG1jKTsKKwkJaWYgKCEobWMgJiAoMSA8PCBjcnRjKSkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKChtYyAmIDB4MDAwMDBmMDApID4+IDgpIHsKKwkJY2FzZSAwOiB0eXBlID0gT1VUUFVUX0xWRFM7IGJyZWFrOworCQljYXNlIDE6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7CisJCWNhc2UgMjogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKKwkJY2FzZSA1OiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOworCQljYXNlIDg6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOworCQljYXNlIDk6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAiaW52YWxpZCBtYywgU09SLSVkOiAweCUwOHhcbiIsIGksIG1jKTsKKwkJCWdvdG8gYWNrOworCQl9CisKKwkJb3IgPSBpOworCX0KKworCS8qIFRoZXJlIHdhcyBubyBlbmNvZGVyIHRvIGRpc2FibGUgKi8KKwlpZiAodHlwZSA9PSBPVVRQVVRfQU5ZKQorCQlnb3RvIGFjazsKKworCS8qIERpc2FibGUgdGhlIGVuY29kZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnZiaW9zLmRjYi5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGRjYl9lbnRyeSAqZGNiID0gJmRldl9wcml2LT52Ymlvcy5kY2IuZW50cnlbaV07CisKKwkJaWYgKGRjYi0+dHlwZSA9PSB0eXBlICYmIChkY2ItPm9yICYgKDEgPDwgb3IpKSkgeworCQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiLCAwLCAtMSk7CisJCQlkZXZfcHJpdi0+ZXZvX2lycS5kY2IgPSBkY2I7CisJCQlnb3RvIGFjazsKKwkJfQorCX0KKworCU5WX0VSUk9SKGRldiwgIm5vIGRjYiBmb3IgJWQgJWQgMHglMDh4XG4iLCBvciwgdHlwZSwgbWMpOwogYWNrOgogCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwKTsKIAludl93cjMyKGRldiwgMHg2MTAwMzAsIDB4ODAwMDAwMDApOwpAQCAtODE3LDMzICs3ODksMTAzIEBACiBzdGF0aWMgdm9pZAogbnY1MF9kaXNwbGF5X3VuazIwX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQ7Ci0JdWludDMyX3QgdG1wLCBwY2xrLCBzY3JpcHQ7Ci0JaW50IGhlYWQsIG9yLCByZXQ7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgdW5rMzAgPSBudl9yZDMyKGRldiwgMHg2MTAwMzApLCB0bXAsIHBjbGssIHNjcmlwdCwgbWM7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiOworCWludCBpLCBjcnRjLCBvciwgdHlwZSA9IE9VVFBVVF9BTlk7CiAKLQlyZXQgPSBudjUwX2Rpc3BsYXlfaXJxX2hlYWQoZGV2LCAmaGVhZCwgJmRjYmVudCk7Ci0JaWYgKHJldCkKKwlOVl9ERUJVR19LTVMoZGV2LCAiMHg2MTAwMzA6IDB4JTA4eFxuIiwgdW5rMzApOworCWRjYiA9IGRldl9wcml2LT5ldm9faXJxLmRjYjsKKwlpZiAoZGNiKSB7CisJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYiwgMCwgLTIpOworCQlkZXZfcHJpdi0+ZXZvX2lycS5kY2IgPSBOVUxMOworCX0KKworCS8qIENSVEMgY2xvY2sgY2hhbmdlIHJlcXVlc3RlZD8gKi8KKwljcnRjID0gZmZzKCh1bmszMCAmIDB4MDAwMDA2MDApID4+IDkpIC0gMTsKKwlpZiAoY3J0YyA+PSAwKSB7CisJCXBjbGsgID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1JUQ19QKGNydGMsIENMT0NLKSk7CisJCXBjbGsgJj0gMHgwMDNmZmZmZjsKKworCQludjUwX2NydGNfc2V0X2Nsb2NrKGRldiwgY3J0YywgcGNsayk7CisKKwkJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDIoY3J0YykpOworCQl0bXAgJj0gfjB4MDAwMDAwZjsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDIoY3J0YyksIHRtcCk7CisJfQorCisJLyogTm90aGluZyBuZWVkcyB0byBiZSBkb25lIGZvciB0aGUgZW5jb2RlciAqLworCWNydGMgPSBmZnMoKHVuazMwICYgMHgwMDAwMDE4MCkgPj4gNykgLSAxOworCWlmIChjcnRjIDwgMCkKIAkJZ290byBhY2s7Ci0Jb3IgPSBmZnMoZGNiZW50LT5vcikgLSAxOwotCXBjbGsgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DUlRDX1AoaGVhZCwgQ0xPQ0spKSAmIDB4M2ZmZmZmOwotCXNjcmlwdCA9IG52NTBfZGlzcGxheV9zY3JpcHRfc2VsZWN0KGRldiwgZGNiZW50LCBwY2xrKTsKKwlwY2xrICA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NSVENfUChjcnRjLCBDTE9DSykpICYgMHgwMDNmZmZmZjsKIAotCU5WX0RFQlVHX0tNUyhkZXYsICJoZWFkICVkIHB4Y2xrOiAlZEtIelxuIiwgaGVhZCwgcGNsayk7CisJLyogRmluZCB3aGljaCBlbmNvZGVyIGlzIGNvbm5lY3RlZCB0byB0aGUgQ1JUQyAqLworCWZvciAoaSA9IDA7IHR5cGUgPT0gT1VUUFVUX0FOWSAmJiBpIDwgMzsgaSsrKSB7CisJCW1jID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX01PREVfQ1RSTF9QKGkpKTsKKwkJTlZfREVCVUdfS01TKGRldiwgIkRBQy0lZCBtYzogMHglMDh4XG4iLCBpLCBtYyk7CisJCWlmICghKG1jICYgKDEgPDwgY3J0YykpKQorCQkJY29udGludWU7CiAKLQlpZiAoZGNiZW50LT50eXBlICE9IE9VVFBVVF9EUCkKLQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiZW50LCAwLCAtMik7CisJCXN3aXRjaCAoKG1jICYgMHgwMDAwMGYwMCkgPj4gOCkgeworCQljYXNlIDA6IHR5cGUgPSBPVVRQVVRfQU5BTE9HOyBicmVhazsKKwkJY2FzZSAxOiB0eXBlID0gT1VUUFVUX1RWOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCU5WX0VSUk9SKGRldiwgImludmFsaWQgbWMsIERBQy0lZDogMHglMDh4XG4iLCBpLCBtYyk7CisJCQlnb3RvIGFjazsKKwkJfQogCi0JbnY1MF9jcnRjX3NldF9jbG9jayhkZXYsIGhlYWQsIHBjbGspOworCQlvciA9IGk7CisJfQogCi0Jbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiZW50LCBzY3JpcHQsIHBjbGspOworCWZvciAoaSA9IDA7IHR5cGUgPT0gT1VUUFVUX0FOWSAmJiBpIDwgNDsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAgPCAweDkwIHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDkyIHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGEwKQorCQkJbWMgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfTU9ERV9DVFJMX1AoaSkpOworCQllbHNlCisJCQltYyA9IG52X3JkMzIoZGV2LCBOVjkwX1BESVNQTEFZX1NPUl9NT0RFX0NUUkxfUChpKSk7CiAKLQludjUwX2Rpc3BsYXlfdW5rMjBfZHBfaGFjayhkZXYsIGRjYmVudCk7CisJCU5WX0RFQlVHX0tNUyhkZXYsICJTT1ItJWQgbWM6IDB4JTA4eFxuIiwgaSwgbWMpOworCQlpZiAoIShtYyAmICgxIDw8IGNydGMpKSkKKwkJCWNvbnRpbnVlOwogCi0JdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDIoaGVhZCkpOwotCXRtcCAmPSB+MHgwMDAwMDBmOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NSVENfQ0xLX0NUUkwyKGhlYWQpLCB0bXApOworCQlzd2l0Y2ggKChtYyAmIDB4MDAwMDBmMDApID4+IDgpIHsKKwkJY2FzZSAwOiB0eXBlID0gT1VUUFVUX0xWRFM7IGJyZWFrOworCQljYXNlIDE6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7CisJCWNhc2UgMjogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKKwkJY2FzZSA1OiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOworCQljYXNlIDg6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOworCQljYXNlIDk6IHR5cGUgPSBPVVRQVVRfRFA7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAiaW52YWxpZCBtYywgU09SLSVkOiAweCUwOHhcbiIsIGksIG1jKTsKKwkJCWdvdG8gYWNrOworCQl9CiAKLQlpZiAoZGNiZW50LT50eXBlICE9IE9VVFBVVF9BTkFMT0cpIHsKKwkJb3IgPSBpOworCX0KKworCWlmICh0eXBlID09IE9VVFBVVF9BTlkpCisJCWdvdG8gYWNrOworCisJLyogRW5hYmxlIHRoZSBlbmNvZGVyICovCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT52Ymlvcy5kY2IuZW50cmllczsgaSsrKSB7CisJCWRjYiA9ICZkZXZfcHJpdi0+dmJpb3MuZGNiLmVudHJ5W2ldOworCQlpZiAoZGNiLT50eXBlID09IHR5cGUgJiYgKGRjYi0+b3IgJiAoMSA8PCBvcikpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gZGV2X3ByaXYtPnZiaW9zLmRjYi5lbnRyaWVzKSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIGRjYiBmb3IgJWQgJWQgMHglMDh4XG4iLCBvciwgdHlwZSwgbWMpOworCQlnb3RvIGFjazsKKwl9CisKKwlzY3JpcHQgPSBudjUwX2Rpc3BsYXlfc2NyaXB0X3NlbGVjdChkZXYsIGRjYiwgbWMsIHBjbGspOworCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYiwgc2NyaXB0LCBwY2xrKTsKKworCW52NTBfZGlzcGxheV91bmsyMF9kcF9oYWNrKGRldiwgZGNiKTsKKworCWlmIChkY2ItPnR5cGUgIT0gT1VUUFVUX0FOQUxPRykgewogCQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQ0xLX0NUUkwyKG9yKSk7CiAJCXRtcCAmPSB+MHgwMDAwMGYwZjsKIAkJaWYgKHNjcmlwdCAmIDB4MDEwMCkKQEAgLTg1MywyNCArODk1LDYxIEBACiAJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19DTEtfQ1RSTDIob3IpLCAwKTsKIAl9CiAKKwlkZXZfcHJpdi0+ZXZvX2lycS5kY2IgPSBkY2I7CisJZGV2X3ByaXYtPmV2b19pcnEucGNsayA9IHBjbGs7CisJZGV2X3ByaXYtPmV2b19pcnEuc2NyaXB0ID0gc2NyaXB0OworCiBhY2s6CiAJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LMjApOwogCW52X3dyMzIoZGV2LCAweDYxMDAzMCwgMHg4MDAwMDAwMCk7CiB9CiAKKy8qIElmIHByb2dyYW1taW5nIGEgVE1EUyBvdXRwdXQgb24gYSBTT1IgdGhhdCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIGZvcgorICogRGlzcGxheVBvcnQsIG1ha2Ugc3VyZSBOVjUwX1NPUl9EUF9DVFJMX0VOQUJMRSBpcyBmb3JjZWQgb2ZmLgorICoKKyAqIEl0IGxvb2tzIGxpa2UgdGhlIFZCSU9TIFRNRFMgc2NyaXB0cyBtYWtlIGFuIGF0dGVtcHQgYXQgdGhpcywgaG93ZXZlciwKKyAqIHRoZSBWQklPUyBzY3JpcHRzIG9uIGF0IGxlYXN0IG9uZSBib2FyZCBJIGhhdmUgb25seSBzd2l0Y2ggaXQgb2ZmIG9uCisgKiBsaW5rIDAsIGNhdXNpbmcgYSBibGFuayBkaXNwbGF5IGlmIHRoZSBvdXRwdXQgaGFzIHByZXZpb3VzbHkgYmVlbgorICogcHJvZ3JhbW1lZCBmb3IgRGlzcGxheVBvcnQuCisgKi8KK3N0YXRpYyB2b2lkCitudjUwX2Rpc3BsYXlfdW5rNDBfZHBfc2V0X3RtZHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiKQoreworCWludCBvciA9IGZmcyhkY2ItPm9yKSAtIDEsIGxpbmsgPSAhKGRjYi0+ZHBjb25mLnNvci5saW5rICYgMSk7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXUzMiB0bXA7CisKKwlpZiAoZGNiLT50eXBlICE9IE9VVFBVVF9UTURTKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0RQICYmCisJCSAgICBudl9lbmNvZGVyLT5kY2ItPm9yICYgKDEgPDwgb3IpKSB7CisJCQl0bXAgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKKwkJCXRtcCAmPSB+TlY1MF9TT1JfRFBfQ1RSTF9FTkFCTEVEOworCQkJbnZfd3IzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspLCB0bXApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKIHN0YXRpYyB2b2lkCiBudjUwX2Rpc3BsYXlfdW5rNDBfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkY2JfZW50cnkgKmRjYmVudDsKLQlpbnQgaGVhZCwgcGNsaywgc2NyaXB0LCByZXQ7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBkZXZfcHJpdi0+ZXZvX2lycS5kY2I7CisJdTE2IHNjcmlwdCA9IGRldl9wcml2LT5ldm9faXJxLnNjcmlwdDsKKwl1MzIgdW5rMzAgPSBudl9yZDMyKGRldiwgMHg2MTAwMzApLCBwY2xrID0gZGV2X3ByaXYtPmV2b19pcnEucGNsazsKIAotCXJldCA9IG52NTBfZGlzcGxheV9pcnFfaGVhZChkZXYsICZoZWFkLCAmZGNiZW50KTsKLQlpZiAocmV0KQorCU5WX0RFQlVHX0tNUyhkZXYsICIweDYxMDAzMDogMHglMDh4XG4iLCB1bmszMCk7CisJZGV2X3ByaXYtPmV2b19pcnEuZGNiID0gTlVMTDsKKwlpZiAoIWRjYikKIAkJZ290byBhY2s7Ci0JcGNsayA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NSVENfUChoZWFkLCBDTE9DSykpICYgMHgzZmZmZmY7Ci0Jc2NyaXB0ID0gbnY1MF9kaXNwbGF5X3NjcmlwdF9zZWxlY3QoZGV2LCBkY2JlbnQsIHBjbGspOwogCi0Jbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiZW50LCBzY3JpcHQsIC1wY2xrKTsKKwlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2IsIHNjcmlwdCwgLXBjbGspOworCW52NTBfZGlzcGxheV91bms0MF9kcF9zZXRfdG1kcyhkZXYsIGRjYik7CiAKIGFjazoKIAludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTks0MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5oCmluZGV4IDU4MWQ0MDUuLmM1NTFmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5oCkBAIC0zOCw5ICszOCwxMSBAQAogdm9pZCBudjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIG52NTBfZGlzcGxheV9pcnFfaGFuZGxlcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBudjUwX2Rpc3BsYXlfaXJxX2hvdHBsdWdfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWludCBudjUwX2Rpc3BsYXlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBudjUwX2Rpc3BsYXlfZWFybHlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgbnY1MF9kaXNwbGF5X2xhdGVfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgbnY1MF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWludCBudjUwX2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBudjUwX2Rpc3BsYXlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgbnY1MF9kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgbnY1MF9jcnRjX2JsYW5rKHN0cnVjdCBub3V2ZWF1X2NydGMgKiwgYm9vbCBibGFuayk7CiBpbnQgbnY1MF9jcnRjX3NldF9jbG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwgaW50IHBjbGspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmlmby5jCmluZGV4IGUyMGMwZTIuLmZiMDI4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmlmby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmlmby5jCkBAIC0yOCw0MSArMjgsMzMgQEAKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogCi1zdHJ1Y3QgbnY1MF9maWZvX3ByaXYgewotCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnRoaW5nb1syXTsKLQlpbnQgY3VyX3RoaW5nbzsKLX07Ci0KLSNkZWZpbmUgSVNfRzgwICgoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweDUwKQotCiBzdGF0aWMgdm9pZAotbnY1MF9maWZvX2luaXRfdGhpbmdvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitudjUwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgbnY1MF9maWZvX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8ucHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKmN1cjsKIAlpbnQgaSwgbnI7CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCi0JY3VyID0gcHJpdi0+dGhpbmdvW3ByaXYtPmN1cl90aGluZ29dOwotCXByaXYtPmN1cl90aGluZ28gPSAhcHJpdi0+Y3VyX3RoaW5nbzsKKwljdXIgPSBwZmlmby0+cGxheWxpc3RbcGZpZm8tPmN1cl9wbGF5bGlzdF07CisJcGZpZm8tPmN1cl9wbGF5bGlzdCA9ICFwZmlmby0+Y3VyX3BsYXlsaXN0OwogCiAJLyogV2UgbmV2ZXIgc2NoZWR1bGUgY2hhbm5lbCAwIG9yIDEyNyAqLwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwogCWZvciAoaSA9IDEsIG5yID0gMDsgaSA8IDEyNzsgaSsrKSB7CiAJCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0gJiYgZGV2X3ByaXYtPmZpZm9zW2ldLT5yYW1mYykKIAkJCW52X3dvMzIoZGV2LCBjdXItPmdwdW9iaiwgbnIrKywgaSk7CiAJfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CiAKIAludl93cjMyKGRldiwgMHgzMmY0LCBjdXItPmluc3RhbmNlID4+IDEyKTsKIAludl93cjMyKGRldiwgMHgzMmVjLCBucik7CiAJbnZfd3IzMihkZXYsIDB4MjUwMCwgMHgxMDEpOwogfQogCi1zdGF0aWMgaW50Ci1udjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoYW5uZWwsIGJvb2wgbnQpCitzdGF0aWMgdm9pZAorbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGFubmVsKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGFubmVsXTsKQEAgLTcwLDM3ICs2MiwyOCBAQAogCiAJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbm5lbCk7CiAKLQlpZiAoIWNoYW4tPnJhbWZjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChJU19HODApCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NTApCiAJCWluc3QgPSBjaGFuLT5yYW1mYy0+aW5zdGFuY2UgPj4gMTI7CiAJZWxzZQogCQlpbnN0ID0gY2hhbi0+cmFtZmMtPmluc3RhbmNlID4+IDg7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUEZJRk9fQ1RYX1RBQkxFKGNoYW5uZWwpLAotCQkgaW5zdCB8IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0NIQU5ORUxfRU5BQkxFRCk7CiAKLQlpZiAoIW50KQotCQludjUwX2ZpZm9faW5pdF90aGluZ28oZGV2KTsKLQlyZXR1cm4gMDsKKwludl93cjMyKGRldiwgTlY1MF9QRklGT19DVFhfVEFCTEUoY2hhbm5lbCksIGluc3QgfAorCQkgICAgIE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0NIQU5ORUxfRU5BQkxFRCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1udjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGFubmVsLCBib29sIG50KQorbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGluc3Q7CiAKLQlOVl9ERUJVRyhkZXYsICJjaCVkLCBudD0lZFxuIiwgY2hhbm5lbCwgbnQpOworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW5uZWwpOwogCi0JaWYgKElTX0c4MCkKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKIAkJaW5zdCA9IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0lOU1RBTkNFX01BU0tfRzgwOwogCWVsc2UKIAkJaW5zdCA9IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0lOU1RBTkNFX01BU0tfRzg0OwogCW52X3dyMzIoZGV2LCBOVjUwX1BGSUZPX0NUWF9UQUJMRShjaGFubmVsKSwgaW5zdCk7Ci0KLQlpZiAoIW50KQotCQludjUwX2ZpZm9faW5pdF90aGluZ28oZGV2KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEzMywxMiArMTE2LDEyIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTlY1MF9QRklGT19DVFhfVEFCTEVfX1NJWkU7IGkrKykgewogCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2ldKQotCQkJbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgaSwgdHJ1ZSk7CisJCQludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCBpKTsKIAkJZWxzZQotCQkJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIGksIHRydWUpOworCQkJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIGkpOwogCX0KIAotCW52NTBfZmlmb19pbml0X3RoaW5nbyhkZXYpOworCW52NTBfZmlmb19wbGF5bGlzdF91cGRhdGUoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2Miw0MSArMTQ1LDM4IEBACiAJbnZfd3IzMihkZXYsIDB4MzI3MCwgMCk7CiAKIAkvKiBFbmFibGUgZHVtbXkgY2hhbm5lbHMgc2V0dXAgYnkgbnY1MF9pbnN0bWVtLmMgKi8KLQludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCAwLCB0cnVlKTsKLQludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCAxMjcsIHRydWUpOworCW52NTBfZmlmb19jaGFubmVsX2VuYWJsZShkZXYsIDApOworCW52NTBfZmlmb19jaGFubmVsX2VuYWJsZShkZXYsIDEyNyk7CiB9CiAKIGludAogbnY1MF9maWZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudjUwX2ZpZm9fcHJpdiAqcHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOwogCWludCByZXQ7CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCi0JcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZmlmby5wcml2OwotCWlmIChwcml2KSB7Ci0JCXByaXYtPmN1cl90aGluZ28gPSAhcHJpdi0+Y3VyX3RoaW5nbzsKKwlpZiAocGZpZm8tPnBsYXlsaXN0WzBdKSB7CisJCXBmaWZvLT5jdXJfcGxheWxpc3QgPSAhcGZpZm8tPmN1cl9wbGF5bGlzdDsKIAkJZ290byBqdXN0X3Jlc2V0OwogCX0KIAotCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZGV2X3ByaXYtPmVuZ2luZS5maWZvLnByaXYgPSBwcml2OwotCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIE5VTEwsIE5VTEwsIDAsIDEyOCo0LCAweDEwMDAsCi0JCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwcml2LT50aGluZ29bMF0pOworCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCSAgICAgJnBmaWZvLT5wbGF5bGlzdFswXSk7CiAJaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJlcnJvciBjcmVhdGluZyB0aGluZ28wOiAlZFxuIiwgcmV0KTsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgY3JlYXRpbmcgcGxheWxpc3QgMDogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIE5VTEwsIE5VTEwsIDAsIDEyOCo0LCAweDEwMDAsCi0JCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwcml2LT50aGluZ29bMV0pOworCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCSAgICAgJnBmaWZvLT5wbGF5bGlzdFsxXSk7CiAJaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJlcnJvciBjcmVhdGluZyB0aGluZ28xOiAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZwZmlmby0+cGxheWxpc3RbMF0pOworCQlOVl9FUlJPUihkZXYsICJlcnJvciBjcmVhdGluZyBwbGF5bGlzdCAxOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIxNiwxOCArMTk2LDE1IEBACiBudjUwX2ZpZm9fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudjUwX2ZpZm9fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZmlmby5wcml2OworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCi0JaWYgKCFwcml2KQorCWlmICghcGZpZm8tPnBsYXlsaXN0WzBdKQogCQlyZXR1cm47CiAKLQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnByaXYtPnRoaW5nb1swXSk7Ci0Jbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZwcml2LT50aGluZ29bMV0pOwotCi0JZGV2X3ByaXYtPmVuZ2luZS5maWZvLnByaXYgPSBOVUxMOwotCWtmcmVlKHByaXYpOworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcGZpZm8tPnBsYXlsaXN0WzBdKTsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnBmaWZvLT5wbGF5bGlzdFsxXSk7CiB9CiAKIGludApAQCAtMjQ4LDcgKzIyNSw3IEBACiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKLQlpZiAoSVNfRzgwKSB7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NTApIHsKIAkJdWludDMyX3QgcmFtaW5fcG9mZnNldCA9IGNoYW4tPnJhbWluLT5ncHVvYmotPmltX3ByYW1pbi0+c3RhcnQ7CiAJCXVpbnQzMl90IHJhbWluX3ZvZmZzZXQgPSBjaGFuLT5yYW1pbi0+Z3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0OwogCkBAIC0yODEsMTAgKzI1OCwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKLQogCW52X3dvMzIoZGV2LCByYW1mYywgMHg0OC80LCBjaGFuLT5wdXNoYnVmLT5pbnN0YW5jZSA+PiA0KTsKLQludl93bzMyKGRldiwgcmFtZmMsIDB4ODAvNCwgKDB4YyA8PCAyNCkgfCAoY2hhbi0+cmFtaHQtPmluc3RhbmNlID4+IDQpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4ODAvNCwgKDAgPDwgMjcpIC8qIDRLaUIgKi8gfAorCQkJCSAgICAoNCA8PCAyNCkgLyogU0VBUkNIX0ZVTEwgKi8gfAorCQkJCSAgICAoY2hhbi0+cmFtaHQtPmluc3RhbmNlID4+IDQpKTsKIAludl93bzMyKGRldiwgcmFtZmMsIDB4NDQvNCwgMHgyMTAxZmZmZik7CiAJbnZfd28zMihkZXYsIHJhbWZjLCAweDYwLzQsIDB4N2ZmZmZmZmYpOwogCW52X3dvMzIoZGV2LCByYW1mYywgMHg0MC80LCAweDAwMDAwMDAwKTsKQEAgLTI5NSw3ICsyNzIsNyBAQAogCQkJCSAgICBjaGFuLT5kbWEuaWJfYmFzZSAqIDQpOwogCW52X3dvMzIoZGV2LCByYW1mYywgMHg1NC80LCBkcm1fb3JkZXIoY2hhbi0+ZG1hLmliX21heCArIDEpIDw8IDE2KTsKIAotCWlmICghSVNfRzgwKSB7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKIAkJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluLT5ncHVvYmosIDAsIGNoYW4tPmlkKTsKIAkJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluLT5ncHVvYmosIDEsCiAJCQkJCQljaGFuLT5yYW1mYy0+aW5zdGFuY2UgPj4gOCk7CkBAIC0zMDQsMTYgKzI4MSwxMCBAQAogCQludl93bzMyKGRldiwgcmFtZmMsIDB4OTgvNCwgY2hhbi0+cmFtaW4tPmluc3RhbmNlID4+IDEyKTsKIAl9CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCi0JcmV0ID0gbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgY2hhbi0+aWQsIGZhbHNlKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgImVycm9yIGVuYWJsaW5nIGNoJWQ6ICVkXG4iLCBjaGFuLT5pZCwgcmV0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKLQkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1mYyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCisJbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgY2hhbi0+aWQpOworCW52NTBfZmlmb19wbGF5bGlzdF91cGRhdGUoZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMzI4LDExICsyOTksMTIgQEAKIAogCS8qIFRoaXMgd2lsbCBlbnN1cmUgdGhlIGNoYW5uZWwgaXMgc2VlbiBhcyBkaXNhYmxlZC4gKi8KIAljaGFuLT5yYW1mYyA9IE5VTEw7Ci0JbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIGNoYW4tPmlkLCBmYWxzZSk7CisJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIGNoYW4tPmlkKTsKIAogCS8qIER1bW15IGNoYW5uZWwsIGFsc28gdXNlZCBvbiBjaCAxMjcgKi8KIAlpZiAoY2hhbi0+aWQgPT0gMCkKLQkJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIDEyNywgZmFsc2UpOworCQludjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKGRldiwgMTI3KTsKKwludjUwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKGRldik7CiAKIAlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnJhbWZjKTsKIAlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPmNhY2hlKTsKQEAgLTM0OSw4ICszMjEsNiBAQAogCiAJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOwotCiAJbnZfd3IzMihkZXYsIDB4MzMzMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDAwLzQpKTsKIAludl93cjMyKGRldiwgMHgzMzM0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MDQvNCkpOwogCW52X3dyMzIoZGV2LCAweDMyNDAsIG52X3JvMzIoZGV2LCByYW1mYywgMHgwOC80KSk7CkBAIC0zOTYsNyArMzY2LDcgQEAKIAludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VULCAwKTsKIAogCS8qIGd1ZXNzaW5nIHRoYXQgYWxsIHRoZSAweDM0eHggcmVncyBhcmVuJ3Qgb24gTlY1MCAqLwotCWlmICghSVNfRzgwKSB7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKIAkJbnZfd3IzMihkZXYsIDB4MzQwYywgbnZfcm8zMihkZXYsIHJhbWZjLCAweDg4LzQpKTsKIAkJbnZfd3IzMihkZXYsIDB4MzQwMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDhjLzQpKTsKIAkJbnZfd3IzMihkZXYsIDB4MzQwNCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDkwLzQpKTsKQEAgLTQwNCw4ICszNzQsNiBAQAogCQludl93cjMyKGRldiwgMHgzNDEwLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4OTgvNCkpOwogCX0KIAotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7Ci0KIAludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsIGNoYW4tPmlkIHwgKDE8PDE2KSk7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzQsOCArNDAyLDYgQEAKIAlyYW1mYyA9IGNoYW4tPnJhbWZjLT5ncHVvYmo7CiAJY2FjaGUgPSBjaGFuLT5jYWNoZS0+Z3B1b2JqOwogCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7Ci0KIAludl93bzMyKGRldiwgcmFtZmMsIDB4MDAvNCwgbnZfcmQzMihkZXYsIDB4MzMzMCkpOwogCW52X3dvMzIoZGV2LCByYW1mYywgMHgwNC80LCBudl9yZDMyKGRldiwgMHgzMzM0KSk7CiAJbnZfd28zMihkZXYsIHJhbWZjLCAweDA4LzQsIG52X3JkMzIoZGV2LCAweDMyNDApKTsKQEAgLTQ4Miw3ICs0NDgsNyBAQAogCX0KIAogCS8qIGd1ZXNzaW5nIHRoYXQgYWxsIHRoZSAweDM0eHggcmVncyBhcmVuJ3Qgb24gTlY1MCAqLwotCWlmICghSVNfRzgwKSB7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApIHsKIAkJbnZfd28zMihkZXYsIHJhbWZjLCAweDg0LzQsIHB0ciA+PiAxKTsKIAkJbnZfd28zMihkZXYsIHJhbWZjLCAweDg4LzQsIG52X3JkMzIoZGV2LCAweDM0MGMpKTsKIAkJbnZfd28zMihkZXYsIHJhbWZjLCAweDhjLzQsIG52X3JkMzIoZGV2LCAweDM0MDApKTsKQEAgLTQ5MSw3ICs0NTcsNyBAQAogCQludl93bzMyKGRldiwgcmFtZmMsIDB4OTgvNCwgbnZfcmQzMihkZXYsIDB4MzQxMCkpOwogCX0KIAotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CiAKIAkvKlhYWDogcHJvYmFibHkgcmVsb2FkIGNoMTI3IChOVUxMKSBzdGF0ZSBiYWNrIHRvbyAqLwogCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgMTI3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3Bpby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMKaW5kZXggYmI0N2FkNy4uYjJmYWIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMKQEAgLTc0LDMgKzc0LDM4IEBACiAJbnZfd3IzMihkZXYsIHIsIHYpOwogCXJldHVybiAwOwogfQorCit2b2lkCitudjUwX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsIGJvb2wgb24pCit7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvOworCXUzMiByZWcsIG1hc2s7CisKKwlncGlvID0gbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoZGV2LCB0YWcpOworCWlmICghZ3BpbykgeworCQlOVl9FUlJPUihkZXYsICJncGlvIHRhZyAweCUwMnggbm90IGZvdW5kXG4iLCB0YWcpOworCQlyZXR1cm47CisJfQorCisJcmVnICA9IGdwaW8tPmxpbmUgPCAxNiA/IDB4ZTA1MCA6IDB4ZTA3MDsKKwltYXNrID0gMHgwMDAxMDAwMSA8PCAoZ3Bpby0+bGluZSAmIDB4Zik7CisKKwludl93cjMyKGRldiwgcmVnICsgNCwgbWFzayk7CisJbnZfbWFzayhkZXYsIHJlZyArIDAsIG1hc2ssIG9uID8gbWFzayA6IDApOworfQorCitpbnQKK252NTBfZ3Bpb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIGRpc2FibGUsIGFuZCBhY2sgYW55IHBlbmRpbmcgZ3BpbyBpbnRlcnJ1cHRzICovCisJbnZfd3IzMihkZXYsIDB4ZTA1MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4ZTA1NCwgMHhmZmZmZmZmZik7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApIHsKKwkJbnZfd3IzMihkZXYsIDB4ZTA3MCwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweGUwNzQsIDB4ZmZmZmZmZmYpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCmluZGV4IGIyMDNkMDYuLjE0MTMwMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKQEAgLTMwLDggKzMwLDYgQEAKIAogI2luY2x1ZGUgIm5vdXZlYXVfZ3JjdHguaCIKIAotI2RlZmluZSBJU19HODAgKChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApID09IDB4NTApCi0KIHN0YXRpYyB2b2lkCiBudjUwX2dyYXBoX2luaXRfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTEwMywzNyArMTAxLDMzIEBACiBudjUwX2dyYXBoX2luaXRfY3R4Y3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncmN0eCBjdHggPSB7fTsKKwl1aW50MzJfdCAqY3A7CisJaW50IGk7CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCi0JaWYgKG5vdXZlYXVfY3R4ZncpIHsKLQkJbm91dmVhdV9ncmN0eF9wcm9nX2xvYWQoZGV2KTsKLQkJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5ncmN0eF9zaXplID0gMHg3MDAwMDsKKwljcCA9IGttYWxsb2MoNTEyICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcCkgeworCQlOVl9FUlJPUihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgY3R4cHJvZ1xuIik7CisJCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguYWNjZWxfYmxvY2tlZCA9IHRydWU7CisJCXJldHVybiAwOwogCX0KLQlpZiAoIWRldl9wcml2LT5lbmdpbmUuZ3JhcGguY3R4cHJvZykgewotCQlzdHJ1Y3Qgbm91dmVhdV9ncmN0eCBjdHggPSB7fTsKLQkJdWludDMyX3QgKmNwID0ga21hbGxvYyg1MTIgKiA0LCBHRlBfS0VSTkVMKTsKLQkJaW50IGk7Ci0JCWlmICghY3ApIHsKLQkJCU5WX0VSUk9SKGRldiwgIkNvdWxkbid0IGFsbG9jIGN0eHByb2chIERpc2FibGluZyBhY2NlbGVyYXRpb24uXG4iKTsKLQkJCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguYWNjZWxfYmxvY2tlZCA9IHRydWU7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljdHguZGV2ID0gZGV2OwotCQljdHgubW9kZSA9IE5PVVZFQVVfR1JDVFhfUFJPRzsKLQkJY3R4LmRhdGEgPSBjcDsKLQkJY3R4LmN0eHByb2dfbWF4ID0gNTEyOwotCQlpZiAoIW52NTBfZ3JjdHhfaW5pdCgmY3R4KSkgewotCQkJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5ncmN0eF9zaXplID0gY3R4LmN0eHZhbHNfcG9zICogNDsKIAotCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9JTkRFWCwgMCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgY3R4LmN0eHByb2dfbGVuOyBpKyspCi0JCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9EQVRBLCBjcFtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmFjY2VsX2Jsb2NrZWQgPSB0cnVlOwotCQl9Ci0JCWtmcmVlKGNwKTsKKwljdHguZGV2ID0gZGV2OworCWN0eC5tb2RlID0gTk9VVkVBVV9HUkNUWF9QUk9HOworCWN0eC5kYXRhID0gY3A7CisJY3R4LmN0eHByb2dfbWF4ID0gNTEyOworCWlmICghbnY1MF9ncmN0eF9pbml0KCZjdHgpKSB7CisJCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguZ3JjdHhfc2l6ZSA9IGN0eC5jdHh2YWxzX3BvcyAqIDQ7CisKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9JTkRFWCwgMCk7CisJCWZvciAoaSA9IDA7IGkgPCBjdHguY3R4cHJvZ19sZW47IGkrKykKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfREFUQSwgY3BbaV0pOworCX0gZWxzZSB7CisJCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguYWNjZWxfYmxvY2tlZCA9IHRydWU7CiAJfQorCWtmcmVlKGNwKTsKIAogCW52X3dyMzIoZGV2LCAweDQwMDMyMCwgNCk7CiAJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIsIDApOwpAQCAtMTY0LDcgKzE1OCw2IEBACiBudjUwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKLQlub3V2ZWF1X2dyY3R4X2ZpbmkoZGV2KTsKIH0KIAogdm9pZApAQCAtMjEyLDggKzIwNSw5IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaW4gPSBjaGFuLT5yYW1pbi0+Z3B1b2JqOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqOwogCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBub3V2ZWF1X2dyY3R4IGN0eCA9IHt9OwogCWludCBoZHIsIHJldDsKIAogCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKQEAgLTIyMywxMCArMjE3LDkgQEAKIAkJCQkgICAgIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmY2hhbi0+cmFtaW5fZ3JjdHgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JY3R4ID0gY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iajsKKwlvYmogPSBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqOwogCi0JaGRyID0gSVNfRzgwID8gMHgyMDAgOiAweDIwOwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWhkciA9IChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDUwKSA/IDB4MjAwIDogMHgyMDsKIAludl93bzMyKGRldiwgcmFtaW4sIChoZHIgKyAweDAwKS80LCAweDAwMTkwMDAyKTsKIAludl93bzMyKGRldiwgcmFtaW4sIChoZHIgKyAweDA0KS80LCBjaGFuLT5yYW1pbl9ncmN0eC0+aW5zdGFuY2UgKwogCQkJCQkgICBwZ3JhcGgtPmdyY3R4X3NpemUgLSAxKTsKQEAgLTIzNCwyMSArMjI3LDE1IEBACiAJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgwYykvNCwgMCk7CiAJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgxMCkvNCwgMCk7CiAJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgxNCkvNCwgMHgwMDAxMDAwMCk7Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKIAotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOwotCWlmICghcGdyYXBoLT5jdHhwcm9nKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2dyY3R4IGN0eCA9IHt9OwotCQljdHguZGV2ID0gY2hhbi0+ZGV2OwotCQljdHgubW9kZSA9IE5PVVZFQVVfR1JDVFhfVkFMUzsKLQkJY3R4LmRhdGEgPSBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqOwotCQludjUwX2dyY3R4X2luaXQoJmN0eCk7Ci0JfSBlbHNlIHsKLQkJbm91dmVhdV9ncmN0eF92YWxzX2xvYWQoZGV2LCBjdHgpOwotCX0KLQludl93bzMyKGRldiwgY3R4LCAweDAwMDAwLzQsIGNoYW4tPnJhbWluLT5pbnN0YW5jZSA+PiAxMik7Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwljdHguZGV2ID0gY2hhbi0+ZGV2OworCWN0eC5tb2RlID0gTk9VVkVBVV9HUkNUWF9WQUxTOworCWN0eC5kYXRhID0gb2JqOworCW52NTBfZ3JjdHhfaW5pdCgmY3R4KTsKIAorCW52X3dvMzIoZGV2LCBvYmosIDB4MDAwMDAvNCwgY2hhbi0+cmFtaW4tPmluc3RhbmNlID4+IDEyKTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTcsMTcgKzI0NCwxNiBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgaSwgaGRyID0gSVNfRzgwID8gMHgyMDAgOiAweDIwOworCWludCBpLCBoZHIgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkgPyAweDIwMCA6IDB4MjA7CiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKIAlpZiAoIWNoYW4tPnJhbWluIHx8ICFjaGFuLT5yYW1pbi0+Z3B1b2JqKQogCQlyZXR1cm47CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAlmb3IgKGkgPSBoZHI7IGkgPCBoZHIgKyAyNDsgaSArPSA0KQogCQludl93bzMyKGRldiwgY2hhbi0+cmFtaW4tPmdwdW9iaiwgaS80LCAwKTsKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCiAJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1pbl9ncmN0eCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2luc3RtZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCmluZGV4IDVmMjFkZjMuLjM3YzdiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCkBAIC0zNSw4ICszNSw2IEBACiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcHJhbWluX3B0OwogCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnByYW1pbl9iYXI7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqZmJfYmFyOwotCi0JYm9vbCBsYXN0X2FjY2Vzc193cjsKIH07CiAKICNkZWZpbmUgTlY1MF9JTlNUTUVNX1BBR0VfU0hJRlQgMTIKQEAgLTE0Nyw3ICsxNDUsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAobm91dmVhdV9tZW1faW5pdF9oZWFwKCZjaGFuLT5yYW1pbl9oZWFwLCBjX2Jhc2UsIGNfc2l6ZSAtIGNfYmFzZSkpCisJaWYgKGRybV9tbV9pbml0KCZjaGFuLT5yYW1pbl9oZWFwLCBjX2Jhc2UsIGNfc2l6ZSAtIGNfYmFzZSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogUkFNRkMgKyB6ZXJvIGNoYW5uZWwncyBQUkFNSU4gdXAgdG8gc3RhcnQgb2YgVk0gcGFnZWRpciAqLwpAQCAtMjQxLDcgKzIzOSw3IEBACiAJCXJldHVybiByZXQ7CiAJQkFSMF9XSTMyKHByaXYtPmZiX2Jhci0+Z3B1b2JqLCAweDAwLCAweDdmYzAwMDAwKTsKIAlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MDQsIDB4NDAwMDAwMDAgKwotCQkJCQkgICAgICBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpIC0gMSk7CisJCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSAtIDEpOwogCUJBUjBfV0kzMihwcml2LT5mYl9iYXItPmdwdW9iaiwgMHgwOCwgMHg0MDAwMDAwMCk7CiAJQkFSMF9XSTMyKHByaXYtPmZiX2Jhci0+Z3B1b2JqLCAweDBjLCAweDAwMDAwMDAwKTsKIAlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MTAsIDB4MDAwMDAwMDApOwpAQCAtMjYyLDIzICsyNjAsMTggQEAKIAogCS8qIEFzc3VtZSB0aGF0IHByYXlpbmcgaXNuJ3QgZW5vdWdoLCBjaGVjayB0aGF0IHdlIGNhbiByZS1yZWFkIHRoZQogCSAqIGVudGlyZSBmYWtlIGNoYW5uZWwgYmFjayBmcm9tIHRoZSBQUkFNSU4gQkFSICovCi0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOwogCWZvciAoaSA9IDA7IGkgPCBjX3NpemU7IGkgKz0gNCkgewogCQlpZiAobnZfcmQzMihkZXYsIE5WX1JBTUlOICsgaSkgIT0gbnZfcmkzMihkZXYsIGkpKSB7CiAJCQlOVl9FUlJPUihkZXYsICJFcnJvciByZWFkaW5nIGJhY2sgUFJBTUlOIGF0IDB4JTA4eFxuIiwKIAkJCQkJCQkJCWkpOwotCQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CiAKIAludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjBfUFJBTUlOLCBzYXZlX252MDAxNzAwKTsKIAogCS8qIEdsb2JhbCBQUkFNSU4gaGVhcCAqLwotCWlmIChub3V2ZWF1X21lbV9pbml0X2hlYXAoJmRldl9wcml2LT5yYW1pbl9oZWFwLAotCQkJCSAgY19zaXplLCBkZXZfcHJpdi0+cmFtaW5fc2l6ZSAtIGNfc2l6ZSkpIHsKLQkJZGV2X3ByaXYtPnJhbWluX2hlYXAgPSBOVUxMOworCWlmIChkcm1fbW1faW5pdCgmZGV2X3ByaXYtPnJhbWluX2hlYXAsIGNfc2l6ZSwgZGV2X3ByaXYtPnJhbWluX3NpemUgLSBjX3NpemUpKSB7CiAJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpbml0IFJBTUlOIGhlYXBcbiIpOwogCX0KIApAQCAtMzIxLDcgKzMxNCw3IEBACiAJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZjaGFuLT52bV9wZCk7CiAJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtZmMpOwogCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWluKTsKLQkJbm91dmVhdV9tZW1fdGFrZWRvd24oJmNoYW4tPnJhbWluX2hlYXApOworCQlkcm1fbW1fdGFrZWRvd24oJmNoYW4tPnJhbWluX2hlYXApOwogCiAJCWRldl9wcml2LT5maWZvc1swXSA9IGRldl9wcml2LT5maWZvc1sxMjddID0gTlVMTDsKIAkJa2ZyZWUoY2hhbik7CkBAIC00MzYsMTQgKzQyOSwxNCBAQAogCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nIHx8ICFncHVvYmotPmltX3ByYW1pbiB8fCBncHVvYmotPmltX2JvdW5kKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCU5WX0RFQlVHKGRldiwgInN0PTB4JTBsbHggc3o9MHglMGxseFxuIiwKKwlOVl9ERUJVRyhkZXYsICJzdD0weCVseCBzej0weCVseFxuIiwKIAkJIGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUpOwogCiAJcHRlICAgICA9IChncHVvYmotPmltX3ByYW1pbi0+c3RhcnQgPj4gMTIpIDw8IDE7CiAJcHRlX2VuZCA9ICgoZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUgPj4gMTIpIDw8IDEpICsgcHRlOwogCXZyYW0gICAgPSBncHVvYmotPmltX2JhY2tpbmdfc3RhcnQ7CiAKLQlOVl9ERUJVRyhkZXYsICJwcmFtaW49MHglbGx4LCBwdGU9JWQsIHB0ZV9lbmQ9JWRcbiIsCisJTlZfREVCVUcoZGV2LCAicHJhbWluPTB4JWx4LCBwdGU9JWQsIHB0ZV9lbmQ9JWRcbiIsCiAJCSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIHB0ZSwgcHRlX2VuZCk7CiAJTlZfREVCVUcoZGV2LCAiZmlyc3QgdnJhbSBwYWdlOiAweCUwOHhcbiIsIGdwdW9iai0+aW1fYmFja2luZ19zdGFydCk7CiAKQEAgLTQ1MywyNyArNDQ2LDE1IEBACiAJCXZyYW0gfD0gMHgzMDsKIAl9CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAl3aGlsZSAocHRlIDwgcHRlX2VuZCkgewogCQludl93bzMyKGRldiwgcHJhbWluX3B0LCBwdGUrKywgbG93ZXJfMzJfYml0cyh2cmFtKSk7CiAJCW52X3dvMzIoZGV2LCBwcmFtaW5fcHQsIHB0ZSsrLCB1cHBlcl8zMl9iaXRzKHZyYW0pKTsKIAkJdnJhbSArPSBOVjUwX0lOU1RNRU1fUEFHRV9TSVpFOwogCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCi0JbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDQwMDAxKTsKLQlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDEpXG4iKTsKLQkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDEwMGM4MCkpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDA2MDAwMSk7Ci0JaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7Ci0JCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgxMDBjODApKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJbnY1MF92bV9mbHVzaChkZXYsIDQpOworCW52NTBfdm1fZmx1c2goZGV2LCA2KTsKIAogCWdwdW9iai0+aW1fYm91bmQgPSAxOwogCXJldHVybiAwOwpAQCAtNDkyLDM2ICs0NzMsMzcgQEAKIAlwdGUgICAgID0gKGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCA+PiAxMikgPDwgMTsKIAlwdGVfZW5kID0gKChncHVvYmotPmltX3ByYW1pbi0+c2l6ZSA+PiAxMikgPDwgMSkgKyBwdGU7CiAKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKIAl3aGlsZSAocHRlIDwgcHRlX2VuZCkgewogCQludl93bzMyKGRldiwgcHJpdi0+cHJhbWluX3B0LT5ncHVvYmosIHB0ZSsrLCAweDAwMDAwMDAwKTsKIAkJbnZfd28zMihkZXYsIHByaXYtPnByYW1pbl9wdC0+Z3B1b2JqLCBwdGUrKywgMHgwMDAwMDAwMCk7CiAJfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CiAKIAlncHVvYmotPmltX2JvdW5kID0gMDsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZAotbnY1MF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgd3JpdGUpCitudjUwX2luc3RtZW1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OwotCi0JcHJpdi0+bGFzdF9hY2Nlc3Nfd3IgPSB3cml0ZTsKKwludl93cjMyKGRldiwgMHgwMDMzMGMsIDB4MDAwMDAwMDEpOworCWlmICghbnZfd2FpdCgweDAwMzMwYywgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCkpCisJCU5WX0VSUk9SKGRldiwgIlBSQU1JTiBmbHVzaCB0aW1lb3V0XG4iKTsKIH0KIAogdm9pZAotbnY1MF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK252ODRfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CisJbnZfd3IzMihkZXYsIDB4MDcwMDAwLCAweDAwMDAwMDAxKTsKKwlpZiAoIW52X3dhaXQoMHgwNzAwMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDApKQorCQlOVl9FUlJPUihkZXYsICJQUkFNSU4gZmx1c2ggdGltZW91dFxuIik7Cit9CiAKLQlpZiAocHJpdi0+bGFzdF9hY2Nlc3Nfd3IpIHsKLQkJbnZfd3IzMihkZXYsIDB4MDcwMDAwLCAweDAwMDAwMDAxKTsKLQkJaWYgKCFudl93YWl0KDB4MDcwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkKLQkJCU5WX0VSUk9SKGRldiwgIlBSQU1JTiBmbHVzaCB0aW1lb3V0XG4iKTsKLQl9Cit2b2lkCitudjUwX3ZtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCit7CisJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAoZW5naW5lIDw8IDE2KSB8IDEpOworCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCisJCU5WX0VSUk9SKGRldiwgInZtIGZsdXNoIHRpbWVvdXQ6IGVuZ2luZSAlZFxuIiwgZW5naW5lKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfc29yLmMKaW5kZXggODEyNzc4ZC4uYmNkNGNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jCkBAIC0zNyw1MiArMzcsMzIgQEAKICNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKIAogc3RhdGljIHZvaWQKLW52NTBfc29yX2Rpc2Nvbm5lY3Qoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcikKK252NTBfc29yX2Rpc2Nvbm5lY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKS0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CiAJaW50IHJldDsKIAorCWlmICghbnZfZW5jb2Rlci0+Y3J0YykKKwkJcmV0dXJuOworCW52NTBfY3J0Y19ibGFuayhub3V2ZWF1X2NydGMobnZfZW5jb2Rlci0+Y3J0YyksIHRydWUpOworCiAJTlZfREVCVUdfS01TKGRldiwgIkRpc2Nvbm5lY3RpbmcgU09SICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CiAKLQlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJcmV0ID0gUklOR19TUEFDRShldm8sIDQpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgZGlzY29ubmVjdGluZyBTT1JcbiIpOwogCQlyZXR1cm47CiAJfQogCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19TT1IobnZfZW5jb2Rlci0+b3IsIE1PREVfQ1RSTCksIDEpOwotCU9VVF9SSU5HKGV2bywgMCk7Ci19CisJT1VUX1JJTkcgIChldm8sIDApOworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCU9VVF9SSU5HICAoZXZvLCAwKTsKIAotc3RhdGljIHZvaWQKLW52NTBfc29yX2RwX2xpbmtfdHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKLQlpbnQgZHBlX2hlYWRlcmxlbjsKLQotCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOwotCWlmICghZHBlKSB7Ci0JCU5WX0VSUk9SKGRldiwgIlNPUi0lZDogbm8gRFAgZW5jb2RlciB0YWJsZSFcbiIsIG52X2VuY29kZXItPm9yKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChkcGUtPnNjcmlwdDApIHsKLQkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMFxuIiwgbnZfZW5jb2Rlci0+b3IpOwotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBsZTE2X3RvX2NwdShkcGUtPnNjcmlwdDApLAotCQkJCQkgICAgbnZfZW5jb2Rlci0+ZGNiKTsKLQl9Ci0KLQlpZiAoIW5vdXZlYXVfZHBfbGlua190cmFpbihlbmNvZGVyKSkKLQkJTlZfRVJST1IoZGV2LCAiU09SLSVkOiBsaW5rIHRyYWluaW5nIGZhaWxlZFxuIiwgbnZfZW5jb2Rlci0+b3IpOwotCi0JaWYgKGRwZS0+c2NyaXB0MSkgewotCQlOVl9ERUJVR19LTVMoZGV2LCAiU09SLSVkOiBydW5uaW5nIERQIHNjcmlwdCAxXG4iLCBudl9lbmNvZGVyLT5vcik7Ci0JCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIGxlMTZfdG9fY3B1KGRwZS0+c2NyaXB0MSksCi0JCQkJCSAgICBudl9lbmNvZGVyLT5kY2IpOwotCX0KKwludl9lbmNvZGVyLT5jcnRjID0gTlVMTDsKKwludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBEUk1fTU9ERV9EUE1TX09GRjsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTk0LDE0ICs3NCwxNiBAQAogCXVpbnQzMl90IHZhbDsKIAlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKIAotCU5WX0RFQlVHX0tNUyhkZXYsICJvciAlZCBtb2RlICVkXG4iLCBvciwgbW9kZSk7CisJTlZfREVCVUdfS01TKGRldiwgIm9yICVkIHR5cGUgJWQgbW9kZSAlZFxuIiwgb3IsIG52X2VuY29kZXItPmRjYi0+dHlwZSwgbW9kZSk7CiAKIAludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBtb2RlOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKIAkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZlbmMgPSBub3V2ZWF1X2VuY29kZXIoZW5jKTsKIAogCQlpZiAobnZlbmMgPT0gbnZfZW5jb2RlciB8fAotCQkgICAgbnZlbmMtPmRpc2Nvbm5lY3QgIT0gbnY1MF9zb3JfZGlzY29ubmVjdCB8fAorCQkgICAgKG52ZW5jLT5kY2ItPnR5cGUgIT0gT1VUUFVUX1RNRFMgJiYKKwkJICAgICBudmVuYy0+ZGNiLT50eXBlICE9IE9VVFBVVF9MVkRTICYmCisJCSAgICAgbnZlbmMtPmRjYi0+dHlwZSAhPSBPVVRQVVRfRFApIHx8CiAJCSAgICBudmVuYy0+ZGNiLT5vciAhPSBudl9lbmNvZGVyLT5kY2ItPm9yKQogCQkJY29udGludWU7CiAKQEAgLTEzMyw4ICsxMTUsMjIgQEAKIAkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURShvcikpKTsKIAl9CiAKLQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9EUCAmJiBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pCi0JCW52NTBfc29yX2RwX2xpbmtfdHJhaW4oZW5jb2Rlcik7CisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfRFApIHsKKwkJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoOworCisJCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKKwkJaWYgKCFhdXhjaCkKKwkJCXJldHVybjsKKworCQlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCQl1OCBzdGF0dXMgPSBEUF9TRVRfUE9XRVJfRDA7CisJCQlub3V2ZWF1X2RwX2F1eGNoKGF1eGNoLCA4LCBEUF9TRVRfUE9XRVIsICZzdGF0dXMsIDEpOworCQkJbm91dmVhdV9kcF9saW5rX3RyYWluKGVuY29kZXIpOworCQl9IGVsc2UgeworCQkJdTggc3RhdHVzID0gRFBfU0VUX1BPV0VSX0QzOworCQkJbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOCwgRFBfU0VUX1BPV0VSLCAmc3RhdHVzLCAxKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTE5Niw3ICsxOTIsOCBAQAogCXVpbnQzMl90IG1vZGVfY3RsID0gMDsKIAlpbnQgcmV0OwogCi0JTlZfREVCVUdfS01TKGRldiwgIm9yICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CisJTlZfREVCVUdfS01TKGRldiwgIm9yICVkIHR5cGUgJWQgLT4gY3J0YyAlZFxuIiwKKwkJICAgICBudl9lbmNvZGVyLT5vciwgbnZfZW5jb2Rlci0+ZGNiLT50eXBlLCBjcnRjLT5pbmRleCk7CiAKIAludjUwX3Nvcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOwogCkBAIC0yMzksNiArMjM2LDE0IEBACiAJfQogCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19TT1IobnZfZW5jb2Rlci0+b3IsIE1PREVfQ1RSTCksIDEpOwogCU9VVF9SSU5HKGV2bywgbW9kZV9jdGwpOworCisJbnZfZW5jb2Rlci0+Y3J0YyA9IGVuY29kZXItPmNydGM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2NydGMgKgorbnY1MF9zb3JfY3J0Y19nZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXJldHVybiBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmNydGM7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52NTBfc29yX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTI0OSw3ICsyNTQsOSBAQAogCS5wcmVwYXJlID0gbnY1MF9zb3JfcHJlcGFyZSwKIAkuY29tbWl0ID0gbnY1MF9zb3JfY29tbWl0LAogCS5tb2RlX3NldCA9IG52NTBfc29yX21vZGVfc2V0LAotCS5kZXRlY3QgPSBOVUxMCisJLmdldF9jcnRjID0gbnY1MF9zb3JfY3J0Y19nZXQsCisJLmRldGVjdCA9IE5VTEwsCisJLmRpc2FibGUgPSBudjUwX3Nvcl9kaXNjb25uZWN0CiB9OwogCiBzdGF0aWMgdm9pZApAQCAtMjcyLDMyICsyNzksMjIgQEAKIH07CiAKIGludAotbnY1MF9zb3JfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQorbnY1MF9zb3JfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBOVUxMOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0JYm9vbCBkdW07CiAJaW50IHR5cGU7CiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAogCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKIAljYXNlIE9VVFBVVF9UTURTOgotCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgVE1EUyBvdXRwdXRcbiIpOworCWNhc2UgT1VUUFVUX0RQOgogCQl0eXBlID0gRFJNX01PREVfRU5DT0RFUl9UTURTOwogCQlicmVhazsKIAljYXNlIE9VVFBVVF9MVkRTOgotCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgTFZEUyBvdXRwdXRcbiIpOwogCQl0eXBlID0gRFJNX01PREVfRU5DT0RFUl9MVkRTOwotCi0JCWlmIChub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShkZXYsIDAsICZkdW0sICZkdW0pKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgcGFyc2luZyBMVkRTIHRhYmxlXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgT1VUUFVUX0RQOgotCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgRFAgb3V0cHV0XG4iKTsKLQkJdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTAsOCArMzA3LDcgQEAKIAogCW52X2VuY29kZXItPmRjYiA9IGVudHJ5OwogCW52X2VuY29kZXItPm9yID0gZmZzKGVudHJ5LT5vcikgLSAxOwotCi0JbnZfZW5jb2Rlci0+ZGlzY29ubmVjdCA9IG52NTBfc29yX2Rpc2Nvbm5lY3Q7CisJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gRFJNX01PREVfRFBNU19PRkY7CiAKIAlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJm52NTBfc29yX2VuY29kZXJfZnVuY3MsIHR5cGUpOwogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJm52NTBfc29yX2hlbHBlcl9mdW5jcyk7CkBAIC0zNDIsNSArMzM4LDYgQEAKIAkJCW52X2VuY29kZXItPmRwLm1jX3Vua25vd24gPSA1OwogCX0KIAorCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKaW5kZXggNTk5OGMzNS4uYWQ2NDY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oCkBAIC0xNDcsMjggKzE0Nyw2IEBACiAjCWRlZmluZSBOVl9WSU9fR1hfRE9OVF9DQVJFX0lOREVYCTB4MDcKICMJZGVmaW5lIE5WX1ZJT19HWF9CSVRfTUFTS19JTkRFWAkJMHgwOAogCi0jZGVmaW5lIE5WX1BGQl9CT09UXzAJCQkweDAwMTAwMDAwCi0jZGVmaW5lIE5WX1BGQl9DRkcwCQkJMHgwMDEwMDIwMAotI2RlZmluZSBOVl9QRkJfQ0ZHMQkJCTB4MDAxMDAyMDQKLSNkZWZpbmUgTlZfUEZCX0NTVEFUVVMJCQkweDAwMTAwMjBDCi0jZGVmaW5lIE5WX1BGQl9SRUZDVFJMCQkJMHgwMDEwMDIxMAotIwlkZWZpbmUgTlZfUEZCX1JFRkNUUkxfVkFMSURfMQkJCSgxIDw8IDMxKQotI2RlZmluZSBOVl9QRkJfUEFECQkJMHgwMDEwMDIxQwotIwlkZWZpbmUgTlZfUEZCX1BBRF9DS0VfTk9STUFMCQkJKDEgPDwgMCkKLSNkZWZpbmUgTlZfUEZCX1RJTEVfTlYxMAkJMHgwMDEwMDI0MAotI2RlZmluZSBOVl9QRkJfVElMRV9TSVpFX05WMTAJCTB4MDAxMDAyNDQKLSNkZWZpbmUgTlZfUEZCX1JFRgkJCTB4MDAxMDAyRDAKLSMJZGVmaW5lIE5WX1BGQl9SRUZfQ01EX1JFRlJFU0gJCQkoMSA8PCAwKQotI2RlZmluZSBOVl9QRkJfUFJFCQkJMHgwMDEwMDJENAotIwlkZWZpbmUgTlZfUEZCX1BSRV9DTURfUFJFQ0hBUkdFCQkJKDEgPDwgMCkKLSNkZWZpbmUgTlZfUEZCX0NMT1NFX1BBR0UyCQkweDAwMTAwMzNDCi0jZGVmaW5lIE5WX1BGQl9USUxFX05WNDAJCTB4MDAxMDA2MDAKLSNkZWZpbmUgTlZfUEZCX1RJTEVfU0laRV9OVjQwCQkweDAwMTAwNjA0Ci0KLSNkZWZpbmUgTlZfUEVYVERFVl9CT09UXzAJCTB4MDAxMDEwMDAKLSMJZGVmaW5lIE5WX1BFWFRERVZfQk9PVF8wX1NUUkFQX0ZQX0lGQUNFXzEyQklUCSg4IDw8IDEyKQotI2RlZmluZSBOVl9QRVhUREVWX0JPT1RfMwkJMHgwMDEwMTAwYwotCiAjZGVmaW5lIE5WX1BDUlRDX0lOVFJfMAkJCQkJMHgwMDYwMDEwMAogIwlkZWZpbmUgTlZfUENSVENfSU5UUl8wX1ZCTEFOSwkJCQkoMSA8PCAwKQogI2RlZmluZSBOVl9QQ1JUQ19JTlRSX0VOXzAJCQkJMHgwMDYwMDE0MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfY2NlLmMKaW5kZXggZTY3MWQwZS4uNTcwZTE5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2NjZS5jCkBAIC00NCw3ICs0NCw3IEBACiAKIE1PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9OQU1FKTsKIAotc3RhdGljIGludCBSMTI4X1JFQURfUExMKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWRkcikKK3N0YXRpYyBpbnQgUjEyOF9SRUFEX1BMTChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgYWRkcikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNTMsNyArNTMsNyBAQAogfQogCiAjaWYgUjEyOF9GSUZPX0RFQlVHCi1zdGF0aWMgdm9pZCByMTI4X3N0YXR1cyhkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyB2b2lkIHIxMjhfc3RhdHVzKGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJcHJpbnRrKCJHVUlfU1RBVCAgICAgICAgICAgPSAweCUwOHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBpbnQpUjEyOF9SRUFEKFIxMjhfR1VJX1NUQVQpKTsKQEAgLTc0LDcgKzc0LDcgQEAKICAqIEVuZ2luZSwgRklGTyBjb250cm9sCiAgKi8KIAotc3RhdGljIGludCByMTI4X2RvX3BpeGNhY2hlX2ZsdXNoKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCByMTI4X2RvX3BpeGNhY2hlX2ZsdXNoKGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdTMyIHRtcDsKIAlpbnQgaTsKQEAgLTgzLDkgKzgzLDggQEAKIAlSMTI4X1dSSVRFKFIxMjhfUENfTkdVSV9DVExTVEFULCB0bXApOwogCiAJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQ7IGkrKykgewotCQlpZiAoIShSMTI4X1JFQUQoUjEyOF9QQ19OR1VJX0NUTFNUQVQpICYgUjEyOF9QQ19CVVNZKSkgeworCQlpZiAoIShSMTI4X1JFQUQoUjEyOF9QQ19OR1VJX0NUTFNUQVQpICYgUjEyOF9QQ19CVVNZKSkKIAkJCXJldHVybiAwOwotCQl9CiAJCURSTV9VREVMQVkoMSk7CiAJfQogCkBAIC05NSw3ICs5NCw3IEBACiAJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RhdGljIGludCByMTI4X2RvX3dhaXRfZm9yX2ZpZm8oZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBlbnRyaWVzKQorc3RhdGljIGludCByMTI4X2RvX3dhaXRfZm9yX2ZpZm8oZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGVudHJpZXMpCiB7CiAJaW50IGk7CiAKQEAgLTExMiw3ICsxMTEsNyBAQAogCXJldHVybiAtRUJVU1k7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb193YWl0X2Zvcl9pZGxlKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCByMTI4X2RvX3dhaXRfZm9yX2lkbGUoZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlpbnQgaSwgcmV0OwogCkBAIC0xODksNyArMTg4LDcgQEAKICAqIHByaW9yIHRvIGEgd2FpdCBmb3IgaWRsZSwgYXMgaXQgaW5mb3JtcyB0aGUgZW5naW5lIHRoYXQgdGhlIGNvbW1hbmQKICAqIHN0cmVhbSBpcyBlbmRpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX2ZsdXNoKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgcjEyOF9kb19jY2VfZmx1c2goZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAl1MzIgdG1wOwogCkBAIC0xOTksNyArMTk4LDcgQEAKIAogLyogV2FpdCBmb3IgdGhlIENDRSB0byBnbyBpZGxlLgogICovCi1pbnQgcjEyOF9kb19jY2VfaWRsZShkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK2ludCByMTI4X2RvX2NjZV9pZGxlKGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJaW50IGk7CiAKQEAgLTIyNSw3ICsyMjQsNyBAQAogCiAvKiBTdGFydCB0aGUgQ29uY3VycmVudCBDb21tYW5kIEVuZ2luZS4KICAqLwotc3RhdGljIHZvaWQgcjEyOF9kb19jY2Vfc3RhcnQoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCByMTI4X2RvX2NjZV9zdGFydChkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXIxMjhfZG9fd2FpdF9mb3JfaWRsZShkZXZfcHJpdik7CiAKQEAgLTI0Miw3ICsyNDEsNyBAQAogICogY29tbWFuZHMsIHNvIHlvdSBtdXN0IHdhaXQgZm9yIHRoZSBDQ0UgY29tbWFuZCBzdHJlYW0gdG8gY29tcGxldGUKICAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KICAqLwotc3RhdGljIHZvaWQgcjEyOF9kb19jY2VfcmVzZXQoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCByMTI4X2RvX2NjZV9yZXNldChkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCVIxMjhfV1JJVEUoUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIDApOwogCVIxMjhfV1JJVEUoUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIsIDApOwpAQCAtMjUzLDcgKzI1Miw3IEBACiAgKiBjb21tYW5kcywgc28geW91IG11c3QgZmx1c2ggdGhlIGNvbW1hbmQgc3RyZWFtIGFuZCB3YWl0IGZvciB0aGUgQ0NFCiAgKiB0byBnbyBpZGxlIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KICAqLwotc3RhdGljIHZvaWQgcjEyOF9kb19jY2Vfc3RvcChkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyB2b2lkIHIxMjhfZG9fY2NlX3N0b3AoZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlSMTI4X1dSSVRFKFIxMjhfUE00X01JQ1JPX0NOVEwsIDApOwogCVIxMjhfV1JJVEUoUjEyOF9QTTRfQlVGRkVSX0NOVEwsCkBAIC0yNjQsNyArMjYzLDcgQEAKIAogLyogUmVzZXQgdGhlIGVuZ2luZS4gIFRoaXMgd2lsbCBzdG9wIHRoZSBDQ0UgaWYgaXQgaXMgcnVubmluZy4KICAqLwotc3RhdGljIGludCByMTI4X2RvX2VuZ2luZV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9kb19lbmdpbmVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCBnZW5fcmVzZXRfY250bDsKQEAgLTMwMSw4ICszMDAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICAgIGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgcjEyOF9jY2VfaW5pdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdTMyIHJpbmdfc3RhcnQ7CiAJdTMyIHRtcDsKQEAgLTM0MCw3ICszMzksNyBAQAogCVIxMjhfV1JJVEUoUjEyOF9CVVNfQ05UTCwgdG1wKTsKIH0KIAotc3RhdGljIGludCByMTI4X2RvX2luaXRfY2NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fcjEyOF9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCByMTI4X2RvX2luaXRfY2NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9yMTI4X2luaXRfdCAqaW5pdCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByYzsKQEAgLTU4OCw3ICs1ODcsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHIxMjhfZG9fY2xlYW51cF9jY2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitpbnQgcjEyOF9kb19jbGVhbnVwX2NjZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCkBAIC02ODIsOSArNjgxLDggQEAKIAkvKiBGbHVzaCBhbnkgcGVuZGluZyBDQ0UgY29tbWFuZHMuICBUaGlzIGVuc3VyZXMgYW55IG91dHN0YW5kaW5nCiAJICogY29tbWFuZHMgYXJlIGV4ZWN0dXRlZCBieSB0aGUgZW5naW5lIGJlZm9yZSB3ZSB0dXJuIGl0IG9mZi4KIAkgKi8KLQlpZiAoc3RvcC0+Zmx1c2gpIHsKKwlpZiAoc3RvcC0+Zmx1c2gpCiAJCXIxMjhfZG9fY2NlX2ZsdXNoKGRldl9wcml2KTsKLQl9CiAKIAkvKiBJZiB3ZSBmYWlsIHRvIG1ha2UgdGhlIGVuZ2luZSBnbyBpZGxlLCB3ZSByZXR1cm4gYW4gZXJyb3IKIAkgKiBjb2RlIHNvIHRoYXQgdGhlIERSTSBpb2N0bCB3cmFwcGVyIGNhbiB0cnkgYWdhaW4uCkBAIC03MzUsOSArNzMzLDggQEAKIAogCURFVl9JTklUX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwogCi0JaWYgKGRldl9wcml2LT5jY2VfcnVubmluZykgeworCWlmIChkZXZfcHJpdi0+Y2NlX3J1bm5pbmcpCiAJCXIxMjhfZG9fY2NlX2ZsdXNoKGRldl9wcml2KTsKLQl9CiAKIAlyZXR1cm4gcjEyOF9kb19jY2VfaWRsZShkZXZfcHJpdik7CiB9CkBAIC03NjUsNyArNzYyLDcgQEAKICNkZWZpbmUgUjEyOF9CVUZGRVJfRlJFRQkwCiAKICNpZiAwCi1zdGF0aWMgaW50IHIxMjhfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTg0OCw3ICs4NDUsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwpAQCAtODY0LDcgKzg2MSw3IEBACiAgKiBDQ0UgY29tbWFuZCBzdWJtaXNzaW9uCiAgKi8KIAotaW50IHIxMjhfd2FpdF9yaW5nKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgbikKK2ludCByMTI4X3dhaXRfcmluZyhkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbikKIHsKIAlkcm1fcjEyOF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJmRldl9wcml2LT5yaW5nOwogCWludCBpOwpAQCAtODgxLDkgKzg3OCw5IEBACiAJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9nZXRfYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZ2V0X2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCQlzdHJ1Y3QgZHJtX2RtYSAqIGQpCisJCQkJc3RydWN0IGRybV9kbWEgKmQpCiB7CiAJaW50IGk7CiAJc3RydWN0IGRybV9idWYgKmJ1ZjsKQEAgLTkzMyw5ICs5MzAsOCBAQAogCiAJZC0+Z3JhbnRlZF9jb3VudCA9IDA7CiAKLQlpZiAoZC0+cmVxdWVzdF9jb3VudCkgeworCWlmIChkLT5yZXF1ZXN0X2NvdW50KQogCQlyZXQgPSByMTI4X2NjZV9nZXRfYnVmZmVycyhkZXYsIGZpbGVfcHJpdiwgZCk7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5jCmluZGV4IGI4MDZmZGMuLjFlMjk3MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9kcnYuYwpAQCAtODUsNyArODUsNyBAQAogCS5wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUwsCiB9OwogCi1pbnQgcjEyOF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCByMTI4X2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJcmV0dXJuIGRybV92YmxhbmtfaW5pdChkZXYsIDEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmgKaW5kZXggM2M2MDgyOS4uOTMwYzcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5oCkBAIC01Myw3ICs1Myw3IEBACiAjZGVmaW5lIERSSVZFUl9NSU5PUgkJNQogI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCiAKLSNkZWZpbmUgR0VUX1JJTkdfSEVBRChkZXZfcHJpdikJCVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0RMX1JQVFIgKQorI2RlZmluZSBHRVRfUklOR19IRUFEKGRldl9wcml2KQkJUjEyOF9SRUFEKFIxMjhfUE00X0JVRkZFUl9ETF9SUFRSKQogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCB7CiAJdW5zaWduZWQgaW50IGFnZTsKQEAgLTE0NCwyMyArMTQ0LDIzIEBACiBleHRlcm4gaW50IHIxMjhfZnVsbHNjcmVlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IHIxMjhfY2NlX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCi1leHRlcm4gdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLWV4dGVybiBpbnQgcjEyOF93YWl0X3JpbmcoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBuKTsKK2V4dGVybiBpbnQgcjEyOF93YWl0X3JpbmcoZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IG4pOwogCi1leHRlcm4gaW50IHIxMjhfZG9fY2NlX2lkbGUoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwotZXh0ZXJuIGludCByMTI4X2RvX2NsZWFudXBfY2NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgcjEyOF9kb19jY2VfaWRsZShkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KTsKK2V4dGVybiBpbnQgcjEyOF9kb19jbGVhbnVwX2NjZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCByMTI4X2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHZvaWQgcjEyOF9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdTMyIHIxMjhfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiBpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLWV4dGVybiBpbnQgcjEyOF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHIxMjhfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiAKIGV4dGVybiBsb25nIHIxMjhfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLApAQCAtMzkwLDI3ICszOTAsMjcgQEAKIAogI2RlZmluZSBSMTI4X1BDSUdBUlRfVEFCTEVfU0laRSAgICAgICAgIDMyNzY4CiAKLSNkZWZpbmUgUjEyOF9SRUFEKHJlZykJCURSTV9SRUFEMzIoICBkZXZfcHJpdi0+bW1pbywgKHJlZykgKQotI2RlZmluZSBSMTI4X1dSSVRFKHJlZyx2YWwpCURSTV9XUklURTMyKCBkZXZfcHJpdi0+bW1pbywgKHJlZyksICh2YWwpICkKLSNkZWZpbmUgUjEyOF9SRUFEOChyZWcpCQlEUk1fUkVBRDgoICAgZGV2X3ByaXYtPm1taW8sIChyZWcpICkKLSNkZWZpbmUgUjEyOF9XUklURTgocmVnLHZhbCkJRFJNX1dSSVRFOCggIGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkgKQorI2RlZmluZSBSMTI4X1JFQUQocmVnKQkJRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pbywgKHJlZykpCisjZGVmaW5lIFIxMjhfV1JJVEUocmVnLCB2YWwpCURSTV9XUklURTMyKGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIFIxMjhfUkVBRDgocmVnKQkJRFJNX1JFQUQ4KGRldl9wcml2LT5tbWlvLCAocmVnKSkKKyNkZWZpbmUgUjEyOF9XUklURTgocmVnLCB2YWwpCURSTV9XUklURTgoZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSkKIAotI2RlZmluZSBSMTI4X1dSSVRFX1BMTChhZGRyLHZhbCkJCQkJCVwKKyNkZWZpbmUgUjEyOF9XUklURV9QTEwoYWRkciwgdmFsKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlSMTI4X1dSSVRFOChSMTI4X0NMT0NLX0NOVExfSU5ERVgsCQkJCVwKIAkJICAgICgoYWRkcikgJiAweDFmKSB8IFIxMjhfUExMX1dSX0VOKTsJCQlcCiAJUjEyOF9XUklURShSMTI4X0NMT0NLX0NOVExfREFUQSwgKHZhbCkpOwkJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgQ0NFX1BBQ0tFVDAoIHJlZywgbiApCQkoUjEyOF9DQ0VfUEFDS0VUMCB8CQlcCisjZGVmaW5lIENDRV9QQUNLRVQwKHJlZywgbikJCShSMTI4X0NDRV9QQUNLRVQwIHwJCVwKIAkJCQkJICgobikgPDwgMTYpIHwgKChyZWcpID4+IDIpKQotI2RlZmluZSBDQ0VfUEFDS0VUMSggcmVnMCwgcmVnMSApCShSMTI4X0NDRV9QQUNLRVQxIHwJCVwKKyNkZWZpbmUgQ0NFX1BBQ0tFVDEocmVnMCwgcmVnMSkJCShSMTI4X0NDRV9QQUNLRVQxIHwJCVwKIAkJCQkJICgoKHJlZzEpID4+IDIpIDw8IDExKSB8ICgocmVnMCkgPj4gMikpCiAjZGVmaW5lIENDRV9QQUNLRVQyKCkJCQkoUjEyOF9DQ0VfUEFDS0VUMikKLSNkZWZpbmUgQ0NFX1BBQ0tFVDMoIHBrdCwgbiApCQkoUjEyOF9DQ0VfUEFDS0VUMyB8CQlcCisjZGVmaW5lIENDRV9QQUNLRVQzKHBrdCwgbikJCShSMTI4X0NDRV9QQUNLRVQzIHwJCVwKIAkJCQkJIChwa3QpIHwgKChuKSA8PCAxNikpCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF91cGRhdGVfcmluZ19zbmFwc2hvdChkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF91cGRhdGVfcmluZ19zbmFwc2hvdChkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9yMTI4X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7CiAJcmluZy0+c3BhY2UgPSAoR0VUX1JJTkdfSEVBRChkZXZfcHJpdikgLSByaW5nLT50YWlsKSAqIHNpemVvZih1MzIpOwpAQCAtNDMwLDM3ICs0MzAsMzggQEAKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKQkJCQlcCisjZGVmaW5lIFJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdikJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlkcm1fcjEyOF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJmRldl9wcml2LT5yaW5nOyBpbnQgaTsJCVwKLQlpZiAoIHJpbmctPnNwYWNlIDwgcmluZy0+aGlnaF9tYXJrICkgewkJCQlcCi0JCWZvciAoIGkgPSAwIDsgaSA8IGRldl9wcml2LT51c2VjX3RpbWVvdXQgOyBpKysgKSB7CVwKLQkJCXIxMjhfdXBkYXRlX3Jpbmdfc25hcHNob3QoIGRldl9wcml2ICk7CQlcCi0JCQlpZiAoIHJpbmctPnNwYWNlID49IHJpbmctPmhpZ2hfbWFyayApCQlcCisJaWYgKHJpbmctPnNwYWNlIDwgcmluZy0+aGlnaF9tYXJrKSB7CQkJCVwKKwkJZm9yIChpID0gMCA7IGkgPCBkZXZfcHJpdi0+dXNlY190aW1lb3V0IDsgaSsrKSB7CVwKKwkJCXIxMjhfdXBkYXRlX3Jpbmdfc25hcHNob3QoZGV2X3ByaXYpOwkJXAorCQkJaWYgKHJpbmctPnNwYWNlID49IHJpbmctPmhpZ2hfbWFyaykJCVwKIAkJCQlnb3RvIF9fcmluZ19zcGFjZV9kb25lOwkJCVwKLQkJCURSTV9VREVMQVkoMSk7CQkJCVwKKwkJCURSTV9VREVMQVkoMSk7CQkJCQlcCiAJCX0JCQkJCQkJXAotCQlEUk1fRVJST1IoICJyaW5nIHNwYWNlIGNoZWNrIGZhaWxlZCFcbiIgKTsJCVwKLQkJcmV0dXJuIC1FQlVTWTsJCQkJXAorCQlEUk1fRVJST1IoInJpbmcgc3BhY2UgY2hlY2sgZmFpbGVkIVxuIik7CQlcCisJCXJldHVybiAtRUJVU1k7CQkJCQkJXAogCX0JCQkJCQkJCVwKICBfX3Jpbmdfc3BhY2VfZG9uZToJCQkJCQkJXAogCTsJCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICkJCQkJXAorI2RlZmluZSBWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdikJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CQlcCi0JaWYgKCBzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID49IFIxMjhfTUFYX1ZCX0FHRSApIHsJCVwKLQkJaW50IF9fcmV0ID0gcjEyOF9kb19jY2VfaWRsZSggZGV2X3ByaXYgKTsJCVwKLQkJaWYgKCBfX3JldCApIHJldHVybiBfX3JldDsJCQkJXAorCWlmIChzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID49IFIxMjhfTUFYX1ZCX0FHRSkgewkJXAorCQlpbnQgX19yZXQgPSByMTI4X2RvX2NjZV9pZGxlKGRldl9wcml2KTsJCQlcCisJCWlmIChfX3JldCkJCQkJCQlcCisJCQlyZXR1cm4gX19yZXQ7CQkJCQlcCiAJCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAwOwkJCQlcCi0JCXIxMjhfZnJlZWxpc3RfcmVzZXQoIGRldiApOwkJCQlcCisJCXIxMjhfZnJlZWxpc3RfcmVzZXQoZGV2KTsJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgUjEyOF9XQUlUX1VOVElMX1BBR0VfRkxJUFBFRCgpIGRvIHsJCQkJXAotCU9VVF9SSU5HKCBDQ0VfUEFDS0VUMCggUjEyOF9XQUlUX1VOVElMLCAwICkgKTsJCQlcCi0JT1VUX1JJTkcoIFIxMjhfRVZFTlRfQ1JUQ19PRkZTRVQgKTsJCQkJXAorCU9VVF9SSU5HKENDRV9QQUNLRVQwKFIxMjhfV0FJVF9VTlRJTCwgMCkpOwkJCVwKKwlPVVRfUklORyhSMTI4X0VWRU5UX0NSVENfT0ZGU0VUKTsJCQkJXAogfSB3aGlsZSAoMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDcyLDEzICs0NzMsMTIgQEAKICNkZWZpbmUgUklOR19MT0NBTFMJCQkJCQkJXAogCWludCB3cml0ZSwgX25yOyB1bnNpZ25lZCBpbnQgdGFpbF9tYXNrOyB2b2xhdGlsZSB1MzIgKnJpbmc7CiAKLSNkZWZpbmUgQkVHSU5fUklORyggbiApIGRvIHsJCQkJCQlcCi0JaWYgKCBSMTI4X1ZFUkJPU0UgKSB7CQkJCQkJXAotCQlEUk1fSU5GTyggIkJFR0lOX1JJTkcoICVkIClcbiIsIChuKSk7CQkJXAotCX0JCQkJCQkJCVwKLQlpZiAoIGRldl9wcml2LT5yaW5nLnNwYWNlIDw9IChuKSAqIHNpemVvZih1MzIpICkgewkJXAorI2RlZmluZSBCRUdJTl9SSU5HKG4pIGRvIHsJCQkJCQlcCisJaWYgKFIxMjhfVkVSQk9TRSkJCQkJCQlcCisJCURSTV9JTkZPKCJCRUdJTl9SSU5HKCVkKVxuIiwgKG4pKTsJCQlcCisJaWYgKGRldl9wcml2LT5yaW5nLnNwYWNlIDw9IChuKSAqIHNpemVvZih1MzIpKSB7CQlcCiAJCUNPTU1JVF9SSU5HKCk7CQkJCQkJXAotCQlyMTI4X3dhaXRfcmluZyggZGV2X3ByaXYsIChuKSAqIHNpemVvZih1MzIpICk7CQlcCisJCXIxMjhfd2FpdF9yaW5nKGRldl9wcml2LCAobikgKiBzaXplb2YodTMyKSk7CQlcCiAJfQkJCQkJCQkJXAogCV9uciA9IG47IGRldl9wcml2LT5yaW5nLnNwYWNlIC09IChuKSAqIHNpemVvZih1MzIpOwkJXAogCXJpbmcgPSBkZXZfcHJpdi0+cmluZy5zdGFydDsJCQkJCVwKQEAgLTQ5NCw0MCArNDk0LDM2IEBACiAjZGVmaW5lIFIxMjhfQlJPS0VOX0NDRQkxCiAKICNkZWZpbmUgQURWQU5DRV9SSU5HKCkgZG8gewkJCQkJCVwKLQlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCi0JCURSTV9JTkZPKCAiQURWQU5DRV9SSU5HKCkgd3I9MHglMDZ4IHRhaWw9MHglMDZ4XG4iLAlcCi0JCQkgIHdyaXRlLCBkZXZfcHJpdi0+cmluZy50YWlsICk7CQkJXAotCX0JCQkJCQkJCVwKLQlpZiAoIFIxMjhfQlJPS0VOX0NDRSAmJiB3cml0ZSA8IDMyICkgewkJCQlcCi0JCW1lbWNweSggZGV2X3ByaXYtPnJpbmcuZW5kLAkJCQlcCi0JCQlkZXZfcHJpdi0+cmluZy5zdGFydCwJCQkJXAotCQkJd3JpdGUgKiBzaXplb2YodTMyKSApOwkJCQlcCi0JfQkJCQkJCQkJXAotCWlmICgoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgdGFpbF9tYXNrKSAhPSB3cml0ZSkgewlcCisJaWYgKFIxMjhfVkVSQk9TRSkJCQkJCQlcCisJCURSTV9JTkZPKCJBRFZBTkNFX1JJTkcoKSB3cj0weCUwNnggdGFpbD0weCUwNnhcbiIsCVwKKwkJCSB3cml0ZSwgZGV2X3ByaXYtPnJpbmcudGFpbCk7CQkJXAorCWlmIChSMTI4X0JST0tFTl9DQ0UgJiYgd3JpdGUgPCAzMikJCQkJXAorCQltZW1jcHkoZGV2X3ByaXYtPnJpbmcuZW5kLAkJCQlcCisJCSAgICAgICBkZXZfcHJpdi0+cmluZy5zdGFydCwJCQkJXAorCQkgICAgICAgd3JpdGUgKiBzaXplb2YodTMyKSk7CQkJCVwKKwlpZiAoKChkZXZfcHJpdi0+cmluZy50YWlsICsgX25yKSAmIHRhaWxfbWFzaykgIT0gd3JpdGUpCQlcCiAJCURSTV9FUlJPUigJCQkJCQlcCiAJCQkiQURWQU5DRV9SSU5HKCk6IG1pc21hdGNoOiBucjogJXggd3JpdGU6ICV4IGxpbmU6ICVkXG4iLAlcCiAJCQkoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgdGFpbF9tYXNrKSwJXAogCQkJd3JpdGUsIF9fTElORV9fKTsJCQkJXAotCX0gZWxzZQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCVwKIAkJZGV2X3ByaXYtPnJpbmcudGFpbCA9IHdyaXRlOwkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIENPTU1JVF9SSU5HKCkgZG8gewkJCQkJCVwKLQlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCi0JCURSTV9JTkZPKCAiQ09NTUlUX1JJTkcoKSB0YWlsPTB4JTA2eFxuIiwJCVwKLQkJCWRldl9wcml2LT5yaW5nLnRhaWwgKTsJCQkJXAotCX0JCQkJCQkJCVwKKwlpZiAoUjEyOF9WRVJCT1NFKQkJCQkJCVwKKwkJRFJNX0lORk8oIkNPTU1JVF9SSU5HKCkgdGFpbD0weCUwNnhcbiIsCQkJXAorCQkJIGRldl9wcml2LT5yaW5nLnRhaWwpOwkJCQlcCiAJRFJNX01FTU9SWUJBUlJJRVIoKTsJCQkJCQlcCi0JUjEyOF9XUklURSggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIGRldl9wcml2LT5yaW5nLnRhaWwgKTsJXAotCVIxMjhfUkVBRCggUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIgKTsJCQkJXAorCVIxMjhfV1JJVEUoUjEyOF9QTTRfQlVGRkVSX0RMX1dQVFIsIGRldl9wcml2LT5yaW5nLnRhaWwpOwlcCisJUjEyOF9SRUFEKFIxMjhfUE00X0JVRkZFUl9ETF9XUFRSKTsJCQkJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBPVVRfUklORyggeCApIGRvIHsJCQkJCQlcCi0JaWYgKCBSMTI4X1ZFUkJPU0UgKSB7CQkJCQkJXAotCQlEUk1fSU5GTyggIiAgIE9VVF9SSU5HKCAweCUwOHggKSBhdCAweCV4XG4iLAkJXAotCQkJICAgKHVuc2lnbmVkIGludCkoeCksIHdyaXRlICk7CQkJXAotCX0JCQkJCQkJCVwKLQlyaW5nW3dyaXRlKytdID0gY3B1X3RvX2xlMzIoIHggKTsJCQkJXAorI2RlZmluZSBPVVRfUklORyh4KSBkbyB7CQkJCQkJXAorCWlmIChSMTI4X1ZFUkJPU0UpCQkJCQkJXAorCQlEUk1fSU5GTygiICAgT1VUX1JJTkcoIDB4JTA4eCApIGF0IDB4JXhcbiIsCQlcCisJCQkgKHVuc2lnbmVkIGludCkoeCksIHdyaXRlKTsJCQlcCisJcmluZ1t3cml0ZSsrXSA9IGNwdV90b19sZTMyKHgpOwkJCQkJXAogCXdyaXRlICY9IHRhaWxfbWFzazsJCQkJCQlcCiB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9pcnEuYwppbmRleCA2OTgxMGZiLi40MjlkNWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfaXJxLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAkgKi8KIH0KIAotdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yMTI4X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQordm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcjEyOF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoIWRldl9wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9zdGF0ZS5jCmluZGV4IGFmMjY2NWMuLjA3N2FmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X3N0YXRlLmMKQEAgLTM3LDggKzM3LDggQEAKICAqIENDRSBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCByMTI4X2VtaXRfY2xpcF9yZWN0cyhkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3hlcywgaW50IGNvdW50KQorc3RhdGljIHZvaWQgcjEyOF9lbWl0X2NsaXBfcmVjdHMoZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzLCBpbnQgY291bnQpCiB7CiAJdTMyIGF1eF9zY19jbnRsID0gMHgwMDAwMDAwMDsKIAlSSU5HX0xPQ0FMUzsKQEAgLTgwLDcgKzgwLDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfY29yZShkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X2NvcmUoZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwpAQCAtOTUsNyArOTUsNyBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9jb250ZXh0KGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfY29udGV4dChkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfc2V0dXAoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9zZXR1cChkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CkBAIC0xMzcsNyArMTM3LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfbWFza3MoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF9tYXNrcyhkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CkBAIC0xNTYsNyArMTU2LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfd2luZG93KGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfd2luZG93KGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKQEAgLTE3MSw3ICsxNzEsNyBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF90ZXgwKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIF9faW5saW5lX18gdm9pZCByMTI4X2VtaXRfdGV4MChkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CkBAIC0xODcsOSArMTg3LDggQEAKIAlPVVRfUklORyh0ZXgtPnRleF9jbnRsKTsKIAlPVVRfUklORyh0ZXgtPnRleF9jb21iaW5lX2NudGwpOwogCU9VVF9SSU5HKGN0eC0+dGV4X3NpemVfcGl0Y2hfYyk7Ci0JZm9yIChpID0gMDsgaSA8IFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFM7IGkrKykKIAkJT1VUX1JJTkcodGV4LT50ZXhfb2Zmc2V0W2ldKTsKLQl9CiAKIAlPVVRfUklORyhDQ0VfUEFDS0VUMChSMTI4X0NPTlNUQU5UX0NPTE9SX0MsIDEpKTsKIAlPVVRfUklORyhjdHgtPmNvbnN0YW50X2NvbG9yX2MpOwpAQCAtMTk4LDcgKzE5Nyw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3RleDEoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIxMjhfZW1pdF90ZXgxKGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9yMTI4X3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzFdOwpAQCAtMjExLDkgKzIxMCw4IEBACiAJT1VUX1JJTkcoQ0NFX1BBQ0tFVDAoUjEyOF9TRUNfVEVYX0NOVExfQywgMSArIFIxMjhfTUFYX1RFWFRVUkVfTEVWRUxTKSk7CiAJT1VUX1JJTkcodGV4LT50ZXhfY250bCk7CiAJT1VUX1JJTkcodGV4LT50ZXhfY29tYmluZV9jbnRsKTsKLQlmb3IgKGkgPSAwOyBpIDwgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBSMTI4X01BWF9URVhUVVJFX0xFVkVMUzsgaSsrKQogCQlPVVRfUklORyh0ZXgtPnRleF9vZmZzZXRbaV0pOwotCX0KIAogCU9VVF9SSU5HKENDRV9QQUNLRVQwKFIxMjhfU0VDX1RFWFRVUkVfQk9SREVSX0NPTE9SX0MsIDApKTsKIAlPVVRfUklORyh0ZXgtPnRleF9ib3JkZXJfY29sb3IpOwpAQCAtMjIxLDcgKzIxOSw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfZW1pdF9zdGF0ZShkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyB2b2lkIHIxMjhfZW1pdF9zdGF0ZShkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKQEAgLTI3NCw3ICsyNzIsNyBAQAogICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCByMTI4X2NsZWFyX2JveChkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKK3N0YXRpYyB2b2lkIHIxMjhfY2xlYXJfYm94KGRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCQkgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHIsIGludCBnLCBpbnQgYikKIHsKIAl1MzIgcGl0Y2gsIG9mZnNldDsKQEAgLTMyMSwxMyArMzE5LDEyIEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX3BlcmZvcm1hbmNlX2JveGVzKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgcjEyOF9jY2VfcGVyZm9ybWFuY2VfYm94ZXMoZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKLQlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5pZGxlX2NvdW50KSA9PSAwKSB7CisJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+aWRsZV9jb3VudCkgPT0gMCkKIAkJcjEyOF9jbGVhcl9ib3goZGV2X3ByaXYsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDApOwotCX0gZWxzZSB7CisJZWxzZQogCQlhdG9taWNfc2V0KCZkZXZfcHJpdi0+aWRsZV9jb3VudCwgMCk7Ci0JfQogfQogCiAjZW5kaWYKQEAgLTM1Miw4ICszNDksOCBAQAogCQkgKGZsYWdzICYgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UpID8gInF1aWVzY2VuY2UsICIgOiAiIik7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICBkcm1fcjEyOF9jbGVhcl90ICogY2xlYXIpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICBkcm1fcjEyOF9jbGVhcl90ICpjbGVhcikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CkBAIC00NTgsNyArNDU1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNTI0LDcgKzUyMSw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC01NDIsMTEgKzUzOSwxMCBAQAogCVIxMjhfV0FJVF9VTlRJTF9QQUdFX0ZMSVBQRUQoKTsKIAlPVVRfUklORyhDQ0VfUEFDS0VUMChSMTI4X0NSVENfT0ZGU0VULCAwKSk7CiAKLQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7CisJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkKIAkJT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0KTsKLQl9IGVsc2UgeworCWVsc2UKIAkJT1VUX1JJTkcoZGV2X3ByaXYtPmZyb250X29mZnNldCk7Ci0JfQogCiAJQURWQU5DRV9SSU5HKCk7CiAKQEAgLTU2Niw3ICs1NjIsNyBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICpidWYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtNTg1LDkgKzU4MSw4IEBACiAJaWYgKGJ1Zi0+dXNlZCkgewogCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CiAKLQkJaWYgKHNhcmVhX3ByaXYtPmRpcnR5ICYgflIxMjhfVVBMT0FEX0NMSVBSRUNUUykgeworCQlpZiAoc2FyZWFfcHJpdi0+ZGlydHkgJiB+UjEyOF9VUExPQURfQ0xJUFJFQ1RTKQogCQkJcjEyOF9lbWl0X3N0YXRlKGRldl9wcml2KTsKLQkJfQogCiAJCWRvIHsKIAkJCS8qIEVtaXQgdGhlIG5leHQgc2V0IG9mIHVwIHRvIHRocmVlIGNsaXByZWN0cyAqLwpAQCAtNjM2LDggKzYzMSw4IEBACiAJc2FyZWFfcHJpdi0+bmJveCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaXJlY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9idWYgKmJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTY5MSw4ICs2ODYsOCBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKys7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkJICAgICAgc3RydWN0IGRybV9idWYgKiBidWYsCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRybV9idWYgKmJ1ZiwKIAkJCQkgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb3VudCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTcxMyw5ICs3MDgsOCBAQAogCWlmIChzdGFydCAhPSBlbmQpIHsKIAkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAxOwogCi0JCWlmIChzYXJlYV9wcml2LT5kaXJ0eSAmIH5SMTI4X1VQTE9BRF9DTElQUkVDVFMpIHsKKwkJaWYgKHNhcmVhX3ByaXYtPmRpcnR5ICYgflIxMjhfVVBMT0FEX0NMSVBSRUNUUykKIAkJCXIxMjhfZW1pdF9zdGF0ZShkZXZfcHJpdik7Ci0JCX0KIAogCQlkd29yZHMgPSAoZW5kIC0gc3RhcnQgKyAzKSAvIHNpemVvZih1MzIpOwogCkBAIC03NzUsOSArNzY5LDkgQEAKIAlzYXJlYV9wcml2LT5uYm94ID0gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9ibGl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9ibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCQkgIGRybV9yMTI4X2JsaXRfdCAqIGJsaXQpCisJCQkJICBkcm1fcjEyOF9ibGl0X3QgKmJsaXQpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKQEAgLTg4Nyw4ICs4ODEsOCBAQAogICogaGF2ZSBoYXJkd2FyZSBzdGVuY2lsIHN1cHBvcnQuCiAgKi8KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9zcGFuKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCQlkcm1fcjEyOF9kZXB0aF90ICogZGVwdGgpCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGNvdW50LCB4LCB5OwpAQCAtOTAyLDEyICs4OTYsMTAgQEAKIAlpZiAoY291bnQgPiA0MDk2IHx8IGNvdW50IDw9IDApCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKLQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZ4LCBkZXB0aC0+eCwgc2l6ZW9mKHgpKSkgeworCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJngsIGRlcHRoLT54LCBzaXplb2YoeCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmeSwgZGVwdGgtPnksIHNpemVvZih5KSkpIHsKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQogCiAJYnVmZmVyX3NpemUgPSBkZXB0aC0+biAqIHNpemVvZih1MzIpOwogCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwpAQCAtOTgzLDggKzk3NSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCQkgIGRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfcGl4ZWxzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgZHJtX3IxMjhfZGVwdGhfdCAqZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGNvdW50LCAqeCwgKnk7CkBAIC0xMDAxLDkgKzk5Myw4IEBACiAJeGJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKngpOwogCXlidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCp5KTsKIAl4ID0ga21hbGxvYyh4YnVmX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh4ID09IE5VTEwpIHsKKwlpZiAoeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJeSA9IGttYWxsb2MoeWJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoeSA9PSBOVUxMKSB7CiAJCWtmcmVlKHgpOwpAQCAtMTEwNSw4ICsxMDk2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3NwYW4oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkJICAgICAgIGRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9zcGFuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGRybV9yMTI4X2RlcHRoX3QgKmRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBjb3VudCwgeCwgeTsKQEAgLTExMTcsMTIgKzExMDgsMTAgQEAKIAlpZiAoY291bnQgPiA0MDk2IHx8IGNvdW50IDw9IDApCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKLQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZ4LCBkZXB0aC0+eCwgc2l6ZW9mKHgpKSkgeworCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJngsIGRlcHRoLT54LCBzaXplb2YoeCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKERSTV9DT1BZX0ZST01fVVNFUigmeSwgZGVwdGgtPnksIHNpemVvZih5KSkpIHsKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZ5LCBkZXB0aC0+eSwgc2l6ZW9mKHkpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQogCiAJQkVHSU5fUklORyg3KTsKIApAQCAtMTE0OCw4ICsxMTM3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKLQkJCQkJIGRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKK3N0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9waXhlbHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJIGRybV9yMTI4X2RlcHRoX3QgKmRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBjb3VudCwgKngsICp5OwpAQCAtMTE2MSwxNiArMTE1MCwxNCBAQAogCWlmIChjb3VudCA+IDQwOTYgfHwgY291bnQgPD0gMCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCWlmIChjb3VudCA+IGRldl9wcml2LT5kZXB0aF9waXRjaCkgeworCWlmIChjb3VudCA+IGRldl9wcml2LT5kZXB0aF9waXRjaCkKIAkJY291bnQgPSBkZXZfcHJpdi0+ZGVwdGhfcGl0Y2g7Ci0JfQogCiAJeGJ1Zl9zaXplID0gY291bnQgKiBzaXplb2YoKngpOwogCXlidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCp5KTsKIAl4ID0ga21hbGxvYyh4YnVmX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh4ID09IE5VTEwpIHsKKwlpZiAoeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJeSA9IGttYWxsb2MoeWJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoeSA9PSBOVUxMKSB7CiAJCWtmcmVlKHgpOwpAQCAtMTIyMCw3ICsxMjA3LDcgQEAKICAqIFBvbHlnb24gc3RpcHBsZQogICovCiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N0aXBwbGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHUzMiAqIHN0aXBwbGUpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zdGlwcGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiAqc3RpcHBsZSkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTEyMzAsOSArMTIxNyw4IEBACiAJQkVHSU5fUklORygzMyk7CiAKIAlPVVRfUklORyhDQ0VfUEFDS0VUMChSMTI4X0JSVVNIX0RBVEEwLCAzMSkpOwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCiAJCU9VVF9SSU5HKHN0aXBwbGVbaV0pOwotCX0KIAogCUFEVkFOQ0VfUklORygpOwogfQpAQCAtMTI2OSw3ICsxMjU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2RvX2luaXRfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IHIxMjhfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTEyODgsNyArMTI3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIGludCByMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xNjQ1LDE3ICsxNjMxLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQordm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQkJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSB7CisJCWlmIChkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykKIAkJCXIxMjhfZG9fY2xlYW51cF9wYWdlZmxpcChkZXYpOwotCQl9CiAJfQogfQogCi12b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJcjEyOF9kb19jbGVhbnVwX2NjZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKaW5kZXggODRiMWYyNy4uYWViZTAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCkBAIC02OSw1ICs2OSw2IEBACiAKIHJhZGVvbi0kKENPTkZJR19DT01QQVQpICs9IHJhZGVvbl9pb2MzMi5vCiByYWRlb24tJChDT05GSUdfVkdBX1NXSVRDSEVST08pICs9IHJhZGVvbl9hdHB4X2hhbmRsZXIubworcmFkZW9uLSQoQ09ORklHX0FDUEkpICs9IHJhZGVvbl9hY3BpLm8KIAogb2JqLSQoQ09ORklHX0RSTV9SQURFT04pKz0gcmFkZW9uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKaW5kZXggMWQ1Njk4My4uOGU0MjFmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKQEAgLTEwOCwxMiArMTA4LDExIEBACiAJCQliYXNlKys7CiAJCQlicmVhazsKIAkJY2FzZSBBVE9NX0lJT19SRUFEOgotCQkJdGVtcCA9IGN0eC0+Y2FyZC0+cmVnX3JlYWQoY3R4LT5jYXJkLCBDVTE2KGJhc2UgKyAxKSk7CisJCQl0ZW1wID0gY3R4LT5jYXJkLT5pb3JlZ19yZWFkKGN0eC0+Y2FyZCwgQ1UxNihiYXNlICsgMSkpOwogCQkJYmFzZSArPSAzOwogCQkJYnJlYWs7CiAJCWNhc2UgQVRPTV9JSU9fV1JJVEU6Ci0JCQkodm9pZCljdHgtPmNhcmQtPnJlZ19yZWFkKGN0eC0+Y2FyZCwgQ1UxNihiYXNlICsgMSkpOwotCQkJY3R4LT5jYXJkLT5yZWdfd3JpdGUoY3R4LT5jYXJkLCBDVTE2KGJhc2UgKyAxKSwgdGVtcCk7CisJCQljdHgtPmNhcmQtPmlvcmVnX3dyaXRlKGN0eC0+Y2FyZCwgQ1UxNihiYXNlICsgMSksIHRlbXApOwogCQkJYmFzZSArPSAzOwogCQkJYnJlYWs7CiAJCWNhc2UgQVRPTV9JSU9fQ0xFQVI6CkBAIC03MTUsOCArNzE0LDggQEAKIAkJCWNqaWZmaWVzID0gamlmZmllczsKIAkJCWlmICh0aW1lX2FmdGVyKGNqaWZmaWVzLCBjdHgtPmxhc3RfanVtcF9qaWZmaWVzKSkgewogCQkJCWNqaWZmaWVzIC09IGN0eC0+bGFzdF9qdW1wX2ppZmZpZXM7Ci0JCQkJaWYgKChqaWZmaWVzX3RvX21zZWNzKGNqaWZmaWVzKSA+IDEwMDApKSB7Ci0JCQkJCURSTV9FUlJPUigiYXRvbWJpb3Mgc3R1Y2sgaW4gbG9vcCBmb3IgbW9yZSB0aGFuIDFzZWMgYWJvcnRpbmdcbiIpOworCQkJCWlmICgoamlmZmllc190b19tc2VjcyhjamlmZmllcykgPiA1MDAwKSkgeworCQkJCQlEUk1fRVJST1IoImF0b21iaW9zIHN0dWNrIGluIGxvb3AgZm9yIG1vcmUgdGhhbiA1c2VjcyBhYm9ydGluZ1xuIik7CiAJCQkJCWN0eC0+YWJvcnQgPSB0cnVlOwogCQkJCX0KIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b20uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5oCmluZGV4IGNkMWI2NGEuLmE1ODlhNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5oCkBAIC0xMTMsNiArMTEzLDggQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCXZvaWQgKCogcmVnX3dyaXRlKShzdHJ1Y3QgY2FyZF9pbmZvICosIHVpbnQzMl90LCB1aW50MzJfdCk7ICAgLyogIGZpbGxlZCBieSBkcml2ZXIgKi8KICAgICAgICAgdWludDMyX3QgKCogcmVnX3JlYWQpKHN0cnVjdCBjYXJkX2luZm8gKiwgdWludDMyX3QpOyAgICAgICAgICAvKiAgZmlsbGVkIGJ5IGRyaXZlciAqLworCXZvaWQgKCogaW9yZWdfd3JpdGUpKHN0cnVjdCBjYXJkX2luZm8gKiwgdWludDMyX3QsIHVpbnQzMl90KTsgICAvKiAgZmlsbGVkIGJ5IGRyaXZlciAqLworICAgICAgICB1aW50MzJfdCAoKiBpb3JlZ19yZWFkKShzdHJ1Y3QgY2FyZF9pbmZvICosIHVpbnQzMl90KTsgICAgICAgICAgLyogIGZpbGxlZCBieSBkcml2ZXIgKi8KIAl2b2lkICgqIG1jX3dyaXRlKShzdHJ1Y3QgY2FyZF9pbmZvICosIHVpbnQzMl90LCB1aW50MzJfdCk7ICAgLyogIGZpbGxlZCBieSBkcml2ZXIgKi8KICAgICAgICAgdWludDMyX3QgKCogbWNfcmVhZCkoc3RydWN0IGNhcmRfaW5mbyAqLCB1aW50MzJfdCk7ICAgICAgICAgIC8qICBmaWxsZWQgYnkgZHJpdmVyICovCiAJdm9pZCAoKiBwbGxfd3JpdGUpKHN0cnVjdCBjYXJkX2luZm8gKiwgdWludDMyX3QsIHVpbnQzMl90KTsgICAvKiAgZmlsbGVkIGJ5IGRyaXZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwppbmRleCA4YzJkNjQ3Li4xMmFkNTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwpAQCAtNDQsMTAgKzQ0LDYgQEAKIAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAotCWFyZ3MudXNPdmVyc2NhblJpZ2h0ID0gMDsKLQlhcmdzLnVzT3ZlcnNjYW5MZWZ0ID0gMDsKLQlhcmdzLnVzT3ZlcnNjYW5Cb3R0b20gPSAwOwotCWFyZ3MudXNPdmVyc2NhblRvcCA9IDA7CiAJYXJncy51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKIAogCXN3aXRjaCAocmFkZW9uX2NydGMtPnJteF90eXBlKSB7CkBAIC01Niw3ICs1Miw2IEBACiAJCWFyZ3MudXNPdmVyc2NhbkJvdHRvbSA9IChhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5IC0gbW9kZS0+Y3J0Y192ZGlzcGxheSkgLyAyOwogCQlhcmdzLnVzT3ZlcnNjYW5MZWZ0ID0gKGFkanVzdGVkX21vZGUtPmNydGNfaGRpc3BsYXkgLSBtb2RlLT5jcnRjX2hkaXNwbGF5KSAvIDI7CiAJCWFyZ3MudXNPdmVyc2NhblJpZ2h0ID0gKGFkanVzdGVkX21vZGUtPmNydGNfaGRpc3BsYXkgLSBtb2RlLT5jcnRjX2hkaXNwbGF5KSAvIDI7Ci0JCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwogCQlicmVhazsKIAljYXNlIFJNWF9BU1BFQ1Q6CiAJCWExID0gbW9kZS0+Y3J0Y192ZGlzcGxheSAqIGFkanVzdGVkX21vZGUtPmNydGNfaGRpc3BsYXk7CkBAIC02OSwxNyArNjQsMTYgQEAKIAkJCWFyZ3MudXNPdmVyc2NhbkxlZnQgPSAoYWRqdXN0ZWRfbW9kZS0+Y3J0Y192ZGlzcGxheSAtIChhMSAvIG1vZGUtPmNydGNfaGRpc3BsYXkpKSAvIDI7CiAJCQlhcmdzLnVzT3ZlcnNjYW5SaWdodCA9IChhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5IC0gKGExIC8gbW9kZS0+Y3J0Y19oZGlzcGxheSkpIC8gMjsKIAkJfQotCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKIAkJYnJlYWs7CiAJY2FzZSBSTVhfRlVMTDoKIAlkZWZhdWx0OgotCQlhcmdzLnVzT3ZlcnNjYW5SaWdodCA9IDA7Ci0JCWFyZ3MudXNPdmVyc2NhbkxlZnQgPSAwOwotCQlhcmdzLnVzT3ZlcnNjYW5Cb3R0b20gPSAwOwotCQlhcmdzLnVzT3ZlcnNjYW5Ub3AgPSAwOwotCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKwkJYXJncy51c092ZXJzY2FuUmlnaHQgPSByYWRlb25fY3J0Yy0+aF9ib3JkZXI7CisJCWFyZ3MudXNPdmVyc2NhbkxlZnQgPSByYWRlb25fY3J0Yy0+aF9ib3JkZXI7CisJCWFyZ3MudXNPdmVyc2NhbkJvdHRvbSA9IHJhZGVvbl9jcnRjLT52X2JvcmRlcjsKKwkJYXJncy51c092ZXJzY2FuVG9wID0gcmFkZW9uX2NydGMtPnZfYm9yZGVyOwogCQlicmVhazsKIAl9CisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0b21iaW9zX3NjYWxlcl9zZXR1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0yODIsMjIgKzI3NiwyMiBAQAogCXUxNiBtaXNjID0gMDsKIAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQlhcmdzLnVzSF9TaXplID0gY3B1X3RvX2xlMTYobW9kZS0+Y3J0Y19oZGlzcGxheSk7CisJYXJncy51c0hfU2l6ZSA9IGNwdV90b19sZTE2KG1vZGUtPmNydGNfaGRpc3BsYXkgLSAocmFkZW9uX2NydGMtPmhfYm9yZGVyICogMikpOwogCWFyZ3MudXNIX0JsYW5raW5nX1RpbWUgPQotCQljcHVfdG9fbGUxNihtb2RlLT5jcnRjX2hibGFua19lbmQgLSBtb2RlLT5jcnRjX2hkaXNwbGF5KTsKLQlhcmdzLnVzVl9TaXplID0gY3B1X3RvX2xlMTYobW9kZS0+Y3J0Y192ZGlzcGxheSk7CisJCWNwdV90b19sZTE2KG1vZGUtPmNydGNfaGJsYW5rX2VuZCAtIG1vZGUtPmNydGNfaGRpc3BsYXkgKyAocmFkZW9uX2NydGMtPmhfYm9yZGVyICogMikpOworCWFyZ3MudXNWX1NpemUgPSBjcHVfdG9fbGUxNihtb2RlLT5jcnRjX3ZkaXNwbGF5IC0gKHJhZGVvbl9jcnRjLT52X2JvcmRlciAqIDIpKTsKIAlhcmdzLnVzVl9CbGFua2luZ19UaW1lID0KLQkgICAgY3B1X3RvX2xlMTYobW9kZS0+Y3J0Y192YmxhbmtfZW5kIC0gbW9kZS0+Y3J0Y192ZGlzcGxheSk7CisJCWNwdV90b19sZTE2KG1vZGUtPmNydGNfdmJsYW5rX2VuZCAtIG1vZGUtPmNydGNfdmRpc3BsYXkgKyAocmFkZW9uX2NydGMtPnZfYm9yZGVyICogMikpOwogCWFyZ3MudXNIX1N5bmNPZmZzZXQgPQotCQljcHVfdG9fbGUxNihtb2RlLT5jcnRjX2hzeW5jX3N0YXJ0IC0gbW9kZS0+Y3J0Y19oZGlzcGxheSk7CisJCWNwdV90b19sZTE2KG1vZGUtPmNydGNfaHN5bmNfc3RhcnQgLSBtb2RlLT5jcnRjX2hkaXNwbGF5ICsgcmFkZW9uX2NydGMtPmhfYm9yZGVyKTsKIAlhcmdzLnVzSF9TeW5jV2lkdGggPQogCQljcHVfdG9fbGUxNihtb2RlLT5jcnRjX2hzeW5jX2VuZCAtIG1vZGUtPmNydGNfaHN5bmNfc3RhcnQpOwogCWFyZ3MudXNWX1N5bmNPZmZzZXQgPQotCQljcHVfdG9fbGUxNihtb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0IC0gbW9kZS0+Y3J0Y192ZGlzcGxheSk7CisJCWNwdV90b19sZTE2KG1vZGUtPmNydGNfdnN5bmNfc3RhcnQgLSBtb2RlLT5jcnRjX3ZkaXNwbGF5ICsgcmFkZW9uX2NydGMtPnZfYm9yZGVyKTsKIAlhcmdzLnVzVl9TeW5jV2lkdGggPQogCQljcHVfdG9fbGUxNihtb2RlLT5jcnRjX3ZzeW5jX2VuZCAtIG1vZGUtPmNydGNfdnN5bmNfc3RhcnQpOwotCS8qYXJncy51Y0hfQm9yZGVyID0gbW9kZS0+aGJvcmRlcjsqLwotCS8qYXJncy51Y1ZfQm9yZGVyID0gbW9kZS0+dmJvcmRlcjsqLworCWFyZ3MudWNIX0JvcmRlciA9IHJhZGVvbl9jcnRjLT5oX2JvcmRlcjsKKwlhcmdzLnVjVl9Cb3JkZXIgPSByYWRlb25fY3J0Yy0+dl9ib3JkZXI7CiAKIAlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKIAkJbWlzYyB8PSBBVE9NX1ZTWU5DX1BPTEFSSVRZOwpAQCAtNjY5LDYgKzY2Myw5MCBAQAogCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwogfQogCitzdGF0aWMgdm9pZCBhdG9tYmlvc19jcnRjX3Byb2dyYW1fcGxsKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgICBpbnQgY3J0Y19pZCwKKwkJCQkgICAgICBpbnQgcGxsX2lkLAorCQkJCSAgICAgIHUzMiBlbmNvZGVyX21vZGUsCisJCQkJICAgICAgdTMyIGVuY29kZXJfaWQsCisJCQkJICAgICAgdTMyIGNsb2NrLAorCQkJCSAgICAgIHUzMiByZWZfZGl2LAorCQkJCSAgICAgIHUzMiBmYl9kaXYsCisJCQkJICAgICAgdTMyIGZyYWNfZmJfZGl2LAorCQkJCSAgICAgIHUzMiBwb3N0X2RpdikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1OCBmcmV2LCBjcmV2OworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFNldFBpeGVsQ2xvY2spOworCXVuaW9uIHNldF9waXhlbF9jbG9jayBhcmdzOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LAorCQkJCSAgICZjcmV2KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChmcmV2KSB7CisJY2FzZSAxOgorCQlzd2l0Y2ggKGNyZXYpIHsKKwkJY2FzZSAxOgorCQkJaWYgKGNsb2NrID09IEFUT01fRElTQUJMRSkKKwkJCQlyZXR1cm47CisJCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KGNsb2NrIC8gMTApOworCQkJYXJncy52MS51c1JlZkRpdiA9IGNwdV90b19sZTE2KHJlZl9kaXYpOworCQkJYXJncy52MS51c0ZiRGl2ID0gY3B1X3RvX2xlMTYoZmJfZGl2KTsKKwkJCWFyZ3MudjEudWNGcmFjRmJEaXYgPSBmcmFjX2ZiX2RpdjsKKwkJCWFyZ3MudjEudWNQb3N0RGl2ID0gcG9zdF9kaXY7CisJCQlhcmdzLnYxLnVjUHBsbCA9IHBsbF9pZDsKKwkJCWFyZ3MudjEudWNDUlRDID0gY3J0Y19pZDsKKwkJCWFyZ3MudjEudWNSZWZEaXZTcmMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFyZ3MudjIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoY2xvY2sgLyAxMCk7CisJCQlhcmdzLnYyLnVzUmVmRGl2ID0gY3B1X3RvX2xlMTYocmVmX2Rpdik7CisJCQlhcmdzLnYyLnVzRmJEaXYgPSBjcHVfdG9fbGUxNihmYl9kaXYpOworCQkJYXJncy52Mi51Y0ZyYWNGYkRpdiA9IGZyYWNfZmJfZGl2OworCQkJYXJncy52Mi51Y1Bvc3REaXYgPSBwb3N0X2RpdjsKKwkJCWFyZ3MudjIudWNQcGxsID0gcGxsX2lkOworCQkJYXJncy52Mi51Y0NSVEMgPSBjcnRjX2lkOworCQkJYXJncy52Mi51Y1JlZkRpdlNyYyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYXJncy52My51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihjbG9jayAvIDEwKTsKKwkJCWFyZ3MudjMudXNSZWZEaXYgPSBjcHVfdG9fbGUxNihyZWZfZGl2KTsKKwkJCWFyZ3MudjMudXNGYkRpdiA9IGNwdV90b19sZTE2KGZiX2Rpdik7CisJCQlhcmdzLnYzLnVjRnJhY0ZiRGl2ID0gZnJhY19mYl9kaXY7CisJCQlhcmdzLnYzLnVjUG9zdERpdiA9IHBvc3RfZGl2OworCQkJYXJncy52My51Y1BwbGwgPSBwbGxfaWQ7CisJCQlhcmdzLnYzLnVjTWlzY0luZm8gPSAocGxsX2lkIDw8IDIpOworCQkJYXJncy52My51Y1RyYW5zbWl0dGVySWQgPSBlbmNvZGVyX2lkOworCQkJYXJncy52My51Y0VuY29kZXJNb2RlID0gZW5jb2Rlcl9tb2RlOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWFyZ3MudjUudWNDUlRDID0gY3J0Y19pZDsKKwkJCWFyZ3MudjUudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoY2xvY2sgLyAxMCk7CisJCQlhcmdzLnY1LnVjUmVmRGl2ID0gcmVmX2RpdjsKKwkJCWFyZ3MudjUudXNGYkRpdiA9IGNwdV90b19sZTE2KGZiX2Rpdik7CisJCQlhcmdzLnY1LnVsRmJEaXZEZWNGcmFjID0gY3B1X3RvX2xlMzIoZnJhY19mYl9kaXYgKiAxMDAwMDApOworCQkJYXJncy52NS51Y1Bvc3REaXYgPSBwb3N0X2RpdjsKKwkJCWFyZ3MudjUudWNNaXNjSW5mbyA9IDA7IC8qIEhETUkgZGVwdGgsIGV0Yy4gKi8KKwkJCWFyZ3MudjUudWNUcmFuc21pdHRlcklEID0gZW5jb2Rlcl9pZDsKKwkJCWFyZ3MudjUudWNFbmNvZGVyTW9kZSA9IGVuY29kZXJfbW9kZTsKKwkJCWFyZ3MudjUudWNQcGxsID0gcGxsX2lkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbiAlZCAlZFxuIiwgZnJldiwgY3Jldik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQgJWRcbiIsIGZyZXYsIGNyZXYpOworCQlyZXR1cm47CisJfQorCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Cit9CisKIHN0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfc2V0X3BsbChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKQEAgLTY3NiwxNyArNzU0LDEyIEBACiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IE5VTEw7CiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IE5VTEw7Ci0JdTggZnJldiwgY3JldjsKLQlpbnQgaW5kZXg7Ci0JdW5pb24gc2V0X3BpeGVsX2Nsb2NrIGFyZ3M7CiAJdTMyIHBsbF9jbG9jayA9IG1vZGUtPmNsb2NrOwogCXUzMiByZWZfZGl2ID0gMCwgZmJfZGl2ID0gMCwgZnJhY19mYl9kaXYgPSAwLCBwb3N0X2RpdiA9IDA7CiAJc3RydWN0IHJhZGVvbl9wbGwgKnBsbDsKIAl1MzIgYWRqdXN0ZWRfY2xvY2s7CiAJaW50IGVuY29kZXJfbW9kZSA9IDA7CiAKLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewogCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKSB7CiAJCQlyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwpAQCAtNzE4LDY4ICs3OTEsMTAgQEAKIAlyYWRlb25fY29tcHV0ZV9wbGwocGxsLCBhZGp1c3RlZF9jbG9jaywgJnBsbF9jbG9jaywgJmZiX2RpdiwgJmZyYWNfZmJfZGl2LAogCQkJICAgJnJlZl9kaXYsICZwb3N0X2Rpdik7CiAKLQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFNldFBpeGVsQ2xvY2spOwotCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwKLQkJCQkgICAmY3JldikpCi0JCXJldHVybjsKKwlhdG9tYmlvc19jcnRjX3Byb2dyYW1fcGxsKGNydGMsIHJhZGVvbl9jcnRjLT5jcnRjX2lkLCByYWRlb25fY3J0Yy0+cGxsX2lkLAorCQkJCSAgZW5jb2Rlcl9tb2RlLCByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCwgbW9kZS0+Y2xvY2ssCisJCQkJICByZWZfZGl2LCBmYl9kaXYsIGZyYWNfZmJfZGl2LCBwb3N0X2Rpdik7CiAKLQlzd2l0Y2ggKGZyZXYpIHsKLQljYXNlIDE6Ci0JCXN3aXRjaCAoY3JldikgewotCQljYXNlIDE6Ci0JCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KG1vZGUtPmNsb2NrIC8gMTApOwotCQkJYXJncy52MS51c1JlZkRpdiA9IGNwdV90b19sZTE2KHJlZl9kaXYpOwotCQkJYXJncy52MS51c0ZiRGl2ID0gY3B1X3RvX2xlMTYoZmJfZGl2KTsKLQkJCWFyZ3MudjEudWNGcmFjRmJEaXYgPSBmcmFjX2ZiX2RpdjsKLQkJCWFyZ3MudjEudWNQb3N0RGl2ID0gcG9zdF9kaXY7Ci0JCQlhcmdzLnYxLnVjUHBsbCA9IHJhZGVvbl9jcnRjLT5wbGxfaWQ7Ci0JCQlhcmdzLnYxLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCQkJYXJncy52MS51Y1JlZkRpdlNyYyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJYXJncy52Mi51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihtb2RlLT5jbG9jayAvIDEwKTsKLQkJCWFyZ3MudjIudXNSZWZEaXYgPSBjcHVfdG9fbGUxNihyZWZfZGl2KTsKLQkJCWFyZ3MudjIudXNGYkRpdiA9IGNwdV90b19sZTE2KGZiX2Rpdik7Ci0JCQlhcmdzLnYyLnVjRnJhY0ZiRGl2ID0gZnJhY19mYl9kaXY7Ci0JCQlhcmdzLnYyLnVjUG9zdERpdiA9IHBvc3RfZGl2OwotCQkJYXJncy52Mi51Y1BwbGwgPSByYWRlb25fY3J0Yy0+cGxsX2lkOwotCQkJYXJncy52Mi51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKLQkJCWFyZ3MudjIudWNSZWZEaXZTcmMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWFyZ3MudjMudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYobW9kZS0+Y2xvY2sgLyAxMCk7Ci0JCQlhcmdzLnYzLnVzUmVmRGl2ID0gY3B1X3RvX2xlMTYocmVmX2Rpdik7Ci0JCQlhcmdzLnYzLnVzRmJEaXYgPSBjcHVfdG9fbGUxNihmYl9kaXYpOwotCQkJYXJncy52My51Y0ZyYWNGYkRpdiA9IGZyYWNfZmJfZGl2OwotCQkJYXJncy52My51Y1Bvc3REaXYgPSBwb3N0X2RpdjsKLQkJCWFyZ3MudjMudWNQcGxsID0gcmFkZW9uX2NydGMtPnBsbF9pZDsKLQkJCWFyZ3MudjMudWNNaXNjSW5mbyA9IChyYWRlb25fY3J0Yy0+cGxsX2lkIDw8IDIpOwotCQkJYXJncy52My51Y1RyYW5zbWl0dGVySWQgPSByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZDsKLQkJCWFyZ3MudjMudWNFbmNvZGVyTW9kZSA9IGVuY29kZXJfbW9kZTsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlhcmdzLnY1LnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCQkJYXJncy52NS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihtb2RlLT5jbG9jayAvIDEwKTsKLQkJCWFyZ3MudjUudWNSZWZEaXYgPSByZWZfZGl2OwotCQkJYXJncy52NS51c0ZiRGl2ID0gY3B1X3RvX2xlMTYoZmJfZGl2KTsKLQkJCWFyZ3MudjUudWxGYkRpdkRlY0ZyYWMgPSBjcHVfdG9fbGUzMihmcmFjX2ZiX2RpdiAqIDEwMDAwMCk7Ci0JCQlhcmdzLnY1LnVjUG9zdERpdiA9IHBvc3RfZGl2OwotCQkJYXJncy52NS51Y01pc2NJbmZvID0gMDsgLyogSERNSSBkZXB0aCwgZXRjLiAqLwotCQkJYXJncy52NS51Y1RyYW5zbWl0dGVySUQgPSByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZDsKLQkJCWFyZ3MudjUudWNFbmNvZGVyTW9kZSA9IGVuY29kZXJfbW9kZTsKLQkJCWFyZ3MudjUudWNQcGxsID0gcmFkZW9uX2NydGMtPnBsbF9pZDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQgJWRcbiIsIGZyZXYsIGNyZXYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkICVkXG4iLCBmcmV2LCBjcmV2KTsKLQkJcmV0dXJuOwotCX0KLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwogfQogCiBzdGF0aWMgaW50IGV2ZXJncmVlbl9jcnRjX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LApAQCAtNzk3LDcgKzgxMiw3IEBACiAKIAkvKiBubyBmYiBib3VuZCAqLwogCWlmICghY3J0Yy0+ZmIpIHsKLQkJRFJNX0RFQlVHKCJObyBGQiBib3VuZFxuIik7CisJCURSTV9ERUJVR19LTVMoIk5vIEZCIGJvdW5kXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC04NDEsNiArODU2LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmICh0aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKQorCQlmYl9mb3JtYXQgfD0gRVZFUkdSRUVOX0dSUEhfQVJSQVlfTU9ERShFVkVSR1JFRU5fR1JQSF9BUlJBWV8yRF9USUxFRF9USElOMSk7CisJZWxzZSBpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKKwkJZmJfZm9ybWF0IHw9IEVWRVJHUkVFTl9HUlBIX0FSUkFZX01PREUoRVZFUkdSRUVOX0dSUEhfQVJSQVlfMURfVElMRURfVEhJTjEpOworCiAJc3dpdGNoIChyYWRlb25fY3J0Yy0+Y3J0Y19pZCkgewogCWNhc2UgMDoKIAkJV1JFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wsIDApOwpAQCAtOTMxLDcgKzk1MSw3IEBACiAKIAkvKiBubyBmYiBib3VuZCAqLwogCWlmICghY3J0Yy0+ZmIpIHsKLQkJRFJNX0RFQlVHKCJObyBGQiBib3VuZFxuIik7CisJCURSTV9ERUJVR19LTVMoIk5vIEZCIGJvdW5kXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC05NzksMTEgKzk5OSwxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NQUNSTykKLQkJZmJfZm9ybWF0IHw9IEFWSVZPX0QxR1JQSF9NQUNST19BRERSRVNTX01PREU7CisJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApIHsKKwkJaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pCisJCQlmYl9mb3JtYXQgfD0gUjYwMF9EMUdSUEhfQVJSQVlfTU9ERV8yRF9USUxFRF9USElOMTsKKwkJZWxzZSBpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKKwkJCWZiX2Zvcm1hdCB8PSBSNjAwX0QxR1JQSF9BUlJBWV9NT0RFXzFEX1RJTEVEX1RISU4xOworCX0gZWxzZSB7CisJCWlmICh0aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKQorCQkJZmJfZm9ybWF0IHw9IEFWSVZPX0QxR1JQSF9NQUNST19BRERSRVNTX01PREU7CiAKLQlpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKLQkJZmJfZm9ybWF0IHw9IEFWSVZPX0QxR1JQSF9USUxFRDsKKwkJaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUlDUk8pCisJCQlmYl9mb3JtYXQgfD0gQVZJVk9fRDFHUlBIX1RJTEVEOworCX0KIAogCWlmIChyYWRlb25fY3J0Yy0+Y3J0Y19pZCA9PSAwKQogCQlXUkVHMzIoQVZJVk9fRDFWR0FfQ09OVFJPTCwgMCk7CkBAIC0xMTQzLDEwICsxMTcwLDggQEAKIAlhdG9tYmlvc19jcnRjX3NldF9wbGwoY3J0YywgYWRqdXN0ZWRfbW9kZSk7CiAJYXRvbWJpb3NfZW5hYmxlX3NzKGNydGMpOwogCi0JaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKIAkJYXRvbWJpb3Nfc2V0X2NydGNfZHRkX3RpbWluZyhjcnRjLCBhZGp1c3RlZF9tb2RlKTsKLQllbHNlIGlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQotCQlhdG9tYmlvc19jcnRjX3NldF90aW1pbmcoY3J0YywgYWRqdXN0ZWRfbW9kZSk7CiAJZWxzZSB7CiAJCWF0b21iaW9zX2NydGNfc2V0X3RpbWluZyhjcnRjLCBhZGp1c3RlZF9tb2RlKTsKIAkJaWYgKHJhZGVvbl9jcnRjLT5jcnRjX2lkID09IDApCkBAIC0xMTkxLDYgKzEyMTYsMjQgQEAKIAlhdG9tYmlvc19sb2NrX2NydGMoY3J0YywgQVRPTV9ESVNBQkxFKTsKIH0KIAorc3RhdGljIHZvaWQgYXRvbWJpb3NfY3J0Y19kaXNhYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CisJYXRvbWJpb3NfY3J0Y19kcG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCXN3aXRjaCAocmFkZW9uX2NydGMtPnBsbF9pZCkgeworCWNhc2UgQVRPTV9QUExMMToKKwljYXNlIEFUT01fUFBMTDI6CisJCS8qIGRpc2FibGUgdGhlIHBwbGwgKi8KKwkJYXRvbWJpb3NfY3J0Y19wcm9ncmFtX3BsbChjcnRjLCByYWRlb25fY3J0Yy0+Y3J0Y19pZCwgcmFkZW9uX2NydGMtPnBsbF9pZCwKKwkJCQkJICAwLCAwLCBBVE9NX0RJU0FCTEUsIDAsIDAsIDAsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmFkZW9uX2NydGMtPnBsbF9pZCA9IC0xOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyBhdG9tYmlvc19oZWxwZXJfZnVuY3MgPSB7CiAJLmRwbXMgPSBhdG9tYmlvc19jcnRjX2RwbXMsCiAJLm1vZGVfZml4dXAgPSBhdG9tYmlvc19jcnRjX21vZGVfZml4dXAsCkBAIC0xMTk5LDYgKzEyNDIsNyBAQAogCS5wcmVwYXJlID0gYXRvbWJpb3NfY3J0Y19wcmVwYXJlLAogCS5jb21taXQgPSBhdG9tYmlvc19jcnRjX2NvbW1pdCwKIAkubG9hZF9sdXQgPSByYWRlb25fY3J0Y19sb2FkX2x1dCwKKwkuZGlzYWJsZSA9IGF0b21iaW9zX2NydGNfZGlzYWJsZSwKIH07CiAKIHZvaWQgcmFkZW9uX2F0b21iaW9zX2luaXRfY3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jCmluZGV4IGFiZmZiMTQuLjM2ZTBkNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2RwLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogCQl1OCB0aGlzX3YgPSBkcF9nZXRfYWRqdXN0X3JlcXVlc3Rfdm9sdGFnZShsaW5rX3N0YXR1cywgbGFuZSk7CiAJCXU4IHRoaXNfcCA9IGRwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVfZW1waGFzaXMobGlua19zdGF0dXMsIGxhbmUpOwogCi0JCURSTV9ERUJVRygicmVxdWVzdGVkIHNpZ25hbCBwYXJhbWV0ZXJzOiBsYW5lICVkIHZvbHRhZ2UgJXMgcHJlX2VtcGggJXNcbiIsCisJCURSTV9ERUJVR19LTVMoInJlcXVlc3RlZCBzaWduYWwgcGFyYW1ldGVyczogbGFuZSAlZCB2b2x0YWdlICVzIHByZV9lbXBoICVzXG4iLAogCQkJICBsYW5lLAogCQkJICB2b2x0YWdlX25hbWVzW3RoaXNfdiA+PiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUXSwKIAkJCSAgcHJlX2VtcGhfbmFtZXNbdGhpc19wID4+IERQX1RSQUlOX1BSRV9FTVBIQVNJU19TSElGVF0pOwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJaWYgKHAgPj0gZHBfcHJlX2VtcGhhc2lzX21heCh2KSkKIAkJcCA9IGRwX3ByZV9lbXBoYXNpc19tYXgodikgfCBEUF9UUkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQ7CiAKLQlEUk1fREVCVUcoInVzaW5nIHNpZ25hbCBwYXJhbWV0ZXJzOiB2b2x0YWdlICVzIHByZV9lbXBoICVzXG4iLAorCURSTV9ERUJVR19LTVMoInVzaW5nIHNpZ25hbCBwYXJhbWV0ZXJzOiB2b2x0YWdlICVzIHByZV9lbXBoICVzXG4iLAogCQkgIHZvbHRhZ2VfbmFtZXNbKHYgJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0spID4+IERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfU0hJRlRdLAogCQkgIHByZV9lbXBoX25hbWVzWyhwICYgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spID4+IERQX1RSQUlOX1BSRV9FTVBIQVNJU19TSElGVF0pOwogCkBAIC0zNTgsNyArMzU4LDcgQEAKIAlpZiAoYXJncy52MS51Y1JlcGx5U3RhdHVzICYmICFhcmdzLnYxLnVjRGF0YU91dExlbikgewogCQlpZiAoYXJncy52MS51Y1JlcGx5U3RhdHVzID09IDB4MjAgJiYgcmV0cnlfY291bnQrKyA8IDEwKQogCQkJZ290byByZXRyeTsKLQkJRFJNX0RFQlVHKCJmYWlsZWQgdG8gZ2V0IGF1eGNoICUwMnglMDJ4ICUwMnggJTAyeCAweCUwMnggJTAyeCBhZnRlciAlZCByZXRyaWVzXG4iLAorCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gZ2V0IGF1eGNoICUwMnglMDJ4ICUwMnggJTAyeCAweCUwMnggJTAyeCBhZnRlciAlZCByZXRyaWVzXG4iLAogCQkJICByZXFfYnl0ZXNbMV0sIHJlcV9ieXRlc1swXSwgcmVxX2J5dGVzWzJdLCByZXFfYnl0ZXNbM10sCiAJCQkgIGNoYW4tPnJlYy5pMmNfaWQsIGFyZ3MudjEudWNSZXBseVN0YXR1cywgcmV0cnlfY291bnQpOwogCQlyZXR1cm4gZmFsc2U7CkBAIC00NjEsMTAgKzQ2MSwxMCBAQAogCQltZW1jcHkoZGlnX2Nvbm5lY3Rvci0+ZHBjZCwgbXNnLCA4KTsKIAkJewogCQkJaW50IGk7Ci0JCQlEUk1fREVCVUcoIkRQQ0Q6ICIpOworCQkJRFJNX0RFQlVHX0tNUygiRFBDRDogIik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJCURSTV9ERUJVRygiJTAyeCAiLCBtc2dbaV0pOwotCQkJRFJNX0RFQlVHKCJcbiIpOworCQkJCURSTV9ERUJVR19LTVMoIiUwMnggIiwgbXNnW2ldKTsKKwkJCURSTV9ERUJVR19LTVMoIlxuIik7CiAJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlEUk1fREVCVUcoImxpbmsgc3RhdHVzICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCURSTV9ERUJVR19LTVMoImxpbmsgc3RhdHVzICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQkgIGxpbmtfc3RhdHVzWzBdLCBsaW5rX3N0YXR1c1sxXSwgbGlua19zdGF0dXNbMl0sCiAJCSAgbGlua19zdGF0dXNbM10sIGxpbmtfc3RhdHVzWzRdLCBsaW5rX3N0YXR1c1s1XSk7CiAJcmV0dXJuIHRydWU7CkBAIC02OTUsNyArNjk1LDcgQEAKIAlpZiAoIWNsb2NrX3JlY292ZXJ5KQogCQlEUk1fRVJST1IoImNsb2NrIHJlY292ZXJ5IGZhaWxlZFxuIik7CiAJZWxzZQotCQlEUk1fREVCVUcoImNsb2NrIHJlY292ZXJ5IGF0IHZvbHRhZ2UgJWQgcHJlLWVtcGhhc2lzICVkXG4iLAorCQlEUk1fREVCVUdfS01TKCJjbG9jayByZWNvdmVyeSBhdCB2b2x0YWdlICVkIHByZS1lbXBoYXNpcyAlZFxuIiwKIAkJCSAgdHJhaW5fc2V0WzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLLAogCQkJICAodHJhaW5fc2V0WzBdICYgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spID4+CiAJCQkgIERQX1RSQUlOX1BSRV9FTVBIQVNJU19TSElGVCk7CkBAIC03MzksNyArNzM5LDcgQEAKIAlpZiAoIWNoYW5uZWxfZXEpCiAJCURSTV9FUlJPUigiY2hhbm5lbCBlcSBmYWlsZWRcbiIpOwogCWVsc2UKLQkJRFJNX0RFQlVHKCJjaGFubmVsIGVxIGF0IHZvbHRhZ2UgJWQgcHJlLWVtcGhhc2lzICVkXG4iLAorCQlEUk1fREVCVUdfS01TKCJjaGFubmVsIGVxIGF0IHZvbHRhZ2UgJWQgcHJlLWVtcGhhc2lzICVkXG4iLAogCQkJICB0cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0ssCiAJCQkgICh0cmFpbl9zZXRbMF0gJiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfTUFTSykKIAkJCSAgPj4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTX1NISUZUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCmluZGV4IDFjYWY2MjUuLjk1N2Q1MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwpAQCAtMzksNiArMzksMjMgQEAKIHN0YXRpYyB2b2lkIGV2ZXJncmVlbl9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIGV2ZXJncmVlbl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAorLyogZ2V0IHRlbXBlcmF0dXJlIGluIG1pbGxpZGVncmVlcyAqLwordTMyIGV2ZXJncmVlbl9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdGVtcCA9IChSUkVHMzIoQ0dfTVVMVF9USEVSTUFMX1NUQVRVUykgJiBBU0lDX1RfTUFTSykgPj4KKwkJQVNJQ19UX1NISUZUOworCXUzMiBhY3R1YWxfdGVtcCA9IDA7CisKKwlpZiAoKHRlbXAgPj4gMTApICYgMSkKKwkJYWN0dWFsX3RlbXAgPSAwOworCWVsc2UgaWYgKCh0ZW1wID4+IDkpICYgMSkKKwkJYWN0dWFsX3RlbXAgPSAyNTU7CisJZWxzZQorCQlhY3R1YWxfdGVtcCA9ICh0ZW1wID4+IDEpICYgMHhmZjsKKworCXJldHVybiBhY3R1YWxfdGVtcCAqIDEwMDA7Cit9CisKIHZvaWQgZXZlcmdyZWVuX3BtX21pc2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHJlcV9wc19pZHggPSByZGV2LT5wbS5yZXF1ZXN0ZWRfcG93ZXJfc3RhdGVfaW5kZXg7CkBAIC0xMTE1LDYgKzExMzIsNyBAQAogCQkJCQkJCQkgcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfYmFja2VuZHMpICYKIAkJCQkJCQkJRVZFUkdSRUVOX01BWF9CQUNLRU5EU19NQVNLKSk7CiAKKwlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnRpbGVfY29uZmlnID0gZ2JfYWRkcl9jb25maWc7CiAJV1JFRzMyKEdCX0JBQ0tFTkRfTUFQLCBnYl9iYWNrZW5kX21hcCk7CiAJV1JFRzMyKEdCX0FERFJfQ09ORklHLCBnYl9hZGRyX2NvbmZpZyk7CiAJV1JFRzMyKERNSUZfQUREUl9DT05GSUcsIGdiX2FkZHJfY29uZmlnKTsKQEAgLTEzMzQsOCArMTM1Miw4IEBACiAJfQogCXJkZXYtPm1jLnZyYW1fd2lkdGggPSBudW1jaGFuICogY2hhbnNpemU7CiAJLyogQ291bGQgYXBlciBzaXplIHJlcG9ydCAwID8gKi8KLQlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHJkZXYtPmRkZXYsIDApOwotCXJkZXYtPm1jLmFwZXJfc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKHJkZXYtPmRkZXYsIDApOworCXJkZXYtPm1jLmFwZXJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChyZGV2LT5wZGV2LCAwKTsKKwlyZGV2LT5tYy5hcGVyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHJkZXYtPnBkZXYsIDApOwogCS8qIFNldHVwIEdQVSBtZW1vcnkgc3BhY2UgKi8KIAkvKiBzaXplIGluIE1CIG9uIGV2ZXJncmVlbiAqLwogCXJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSkgKiAxMDI0ICogMTAyNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKaW5kZXggZTAyOGMxYy4uMjMzMGYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKQEAgLTYxLDYgKzYxLDExIEBACiAjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9GT1JNQVRfOEJfQkdSQTEwMTAxMDIgICAgIDUKICMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0ZPUk1BVF9SR0IxMTExMTAgICAgICAgICAgNgogIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfRk9STUFUX0JHUjEwMTExMSAgICAgICAgICA3CisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9BUlJBWV9NT0RFKHgpICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAyMCkKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0FSUkFZX0xJTkVBUl9HRU5FUkFMICAgICAgMAorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfQVJSQVlfTElORUFSX0FMSUdORUQgICAgICAxCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9BUlJBWV8xRF9USUxFRF9USElOMSAgICAgIDIKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0FSUkFZXzJEX1RJTEVEX1RISU4xICAgICAgNAogI2RlZmluZSBFVkVSR1JFRU5fR1JQSF9TV0FQX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDY4MGMKICMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0VORElBTl9TV0FQKHgpICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDApCiAjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9FTkRJQU5fTk9ORSAgICAgICAgICAgICAgIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKaW5kZXggYTFjZDYyMS4uOWI3NTMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKQEAgLTE2NSw2ICsxNjUsMTEgQEAKICNkZWZpbmUJCVNFX0RCX0JVU1kJCQkJCSgxIDw8IDMwKQogI2RlZmluZQkJU0VfQ0JfQlVTWQkJCQkJKDEgPDwgMzEpCiAKKyNkZWZpbmUJQ0dfTVVMVF9USEVSTUFMX1NUQVRVUwkJCQkweDc0MAorI2RlZmluZQkJQVNJQ19UKHgpCQkJICAgICAgICAoKHgpIDw8IDE2KQorI2RlZmluZQkJQVNJQ19UX01BU0sJCQkgICAgICAgIDB4N0ZGMDAwMAorI2RlZmluZQkJQVNJQ19UX1NISUZUCQkJICAgICAgICAxNgorCiAjZGVmaW5lCUhEUF9IT1NUX1BBVEhfQ05UTAkJCQkweDJDMDAKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfQkFTRQkJCQkweDJDMDQKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfSU5GTwkJCQkweDJDMDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKaW5kZXggYTg5YTE1YS4uZTgxN2EwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogCS8qIG9ubHkgb25lIGNsb2NrIG1vZGUgcGVyIHBvd2VyIHN0YXRlICovCiAJcmRldi0+cG0ucmVxdWVzdGVkX2Nsb2NrX21vZGVfaW5kZXggPSAwOwogCi0JRFJNX0RFQlVHKCJSZXF1ZXN0ZWQ6IGU6ICVkIG06ICVkIHA6ICVkXG4iLAorCURSTV9ERUJVR19EUklWRVIoIlJlcXVlc3RlZDogZTogJWQgbTogJWQgcDogJWRcbiIsCiAJCSAgcmRldi0+cG0ucG93ZXJfc3RhdGVbcmRldi0+cG0ucmVxdWVzdGVkX3Bvd2VyX3N0YXRlX2luZGV4XS4KIAkJICBjbG9ja19pbmZvW3JkZXYtPnBtLnJlcXVlc3RlZF9jbG9ja19tb2RlX2luZGV4XS5zY2xrLAogCQkgIHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleF0uCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkgICAgIHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLmN1cnJlbnRfcG93ZXJfc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMpKSB7CiAJCXJhZGVvbl9zZXRfcGNpZV9sYW5lcyhyZGV2LAogCQkJCSAgICAgIHBzLT5wY2llX2xhbmVzKTsKLQkJRFJNX0RFQlVHKCJTZXR0aW5nOiBwOiAlZFxuIiwgcHMtPnBjaWVfbGFuZXMpOworCQlEUk1fREVCVUdfRFJJVkVSKCJTZXR0aW5nOiBwOiAlZFxuIiwgcHMtPnBjaWVfbGFuZXMpOwogCX0KIH0KIApAQCAtODQ5LDcgKzg0OSw3IEBACiAJY29uc3QgY2hhciAqZndfbmFtZSA9IE5VTEw7CiAJaW50IGVycjsKIAotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJhZGVvbl9jcCIsIDAsIE5VTEwsIDApOwogCWVyciA9IElTX0VSUihwZGV2KTsKQEAgLTE4MDMsNiArMTgwMywxMSBAQAogCQkJcmV0dXJuIHI7CiAJCWJyZWFrOwogCQkvKiB0cmlnZ2VycyBkcmF3aW5nIHVzaW5nIGluZGljZXMgdG8gdmVydGV4IGJ1ZmZlciAqLworCWNhc2UgUEFDS0VUM18zRF9DTEVBUl9ISVo6CisJY2FzZSBQQUNLRVQzXzNEX0NMRUFSX1pNQVNLOgorCQlpZiAocC0+cmRldi0+aHlwZXJ6X2ZpbHAgIT0gcC0+ZmlscCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKIAljYXNlIFBBQ0tFVDNfTk9QOgogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjI5NSw4ICsyMzAwLDggQEAKIAl1NjQgY29uZmlnX2FwZXJfc2l6ZTsKIAogCS8qIHdvcmsgb3V0IGFjY2Vzc2libGUgVlJBTSAqLwotCXJkZXYtPm1jLmFwZXJfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQocmRldi0+ZGRldiwgMCk7Ci0JcmRldi0+bWMuYXBlcl9zaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4ocmRldi0+ZGRldiwgMCk7CisJcmRldi0+bWMuYXBlcl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHJkZXYtPnBkZXYsIDApOworCXJkZXYtPm1jLmFwZXJfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocmRldi0+cGRldiwgMCk7CiAJcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUgPSByMTAwX2dldF9hY2Nlc3NpYmxlX3ZyYW0ocmRldik7CiAJLyogRklYTUUgd2UgZG9uJ3QgdXNlIHRoZSBzZWNvbmQgYXBlcnR1cmUgeWV0IHdoZW4gd2UgY291bGQgdXNlIGl0ICovCiAJaWYgKHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplID4gcmRldi0+bWMuYXBlcl9zaXplKQpAQCAtMjM2NCwxMSArMjM2OSwxMCBAQAogICovCiB2b2lkIHIxMDBfcGxsX2VycmF0YV9hZnRlcl9pbmRleChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpZiAoIShyZGV2LT5wbGxfZXJyYXRhICYgQ0hJUF9FUlJBVEFfUExMX0RVTU1ZUkVBRFMpKSB7Ci0JCXJldHVybjsKKwlpZiAocmRldi0+cGxsX2VycmF0YSAmIENISVBfRVJSQVRBX1BMTF9EVU1NWVJFQURTKSB7CisJCSh2b2lkKVJSRUczMihSQURFT05fQ0xPQ0tfQ05UTF9EQVRBKTsKKwkJKHZvaWQpUlJFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMKTsKIAl9Ci0JKHZvaWQpUlJFRzMyKFJBREVPTl9DTE9DS19DTlRMX0RBVEEpOwotCSh2b2lkKVJSRUczMihSQURFT05fQ1JUQ19HRU5fQ05UTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHIxMDBfcGxsX2VycmF0YV9hZnRlcl9kYXRhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMjY0Myw3ICsyNjQ3LDcgQEAKIAkJZmxhZ3MgfD0gcGl0Y2ggLyA4OwogCiAKLQlEUk1fREVCVUcoIndyaXRpbmcgc3VyZmFjZSAlZCAlZCAleCAleFxuIiwgcmVnLCBmbGFncywgb2Zmc2V0LCBvZmZzZXQrb2JqX3NpemUtMSk7CisJRFJNX0RFQlVHX0tNUygid3JpdGluZyBzdXJmYWNlICVkICVkICV4ICV4XG4iLCByZWcsIGZsYWdzLCBvZmZzZXQsIG9mZnNldCtvYmpfc2l6ZS0xKTsKIAlXUkVHMzIoUkFERU9OX1NVUkZBQ0UwX0lORk8gKyBzdXJmX2luZGV4LCBmbGFncyk7CiAJV1JFRzMyKFJBREVPTl9TVVJGQUNFMF9MT1dFUl9CT1VORCArIHN1cmZfaW5kZXgsIG9mZnNldCk7CiAJV1JFRzMyKFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORCArIHN1cmZfaW5kZXgsIG9mZnNldCArIG9ial9zaXplIC0gMSk7CkBAIC0zMDM5LDcgKzMwNDMsNyBAQAogCQl9CiAjZW5kaWYKIAotCQlEUk1fREVCVUcoIkdSUEhfQlVGRkVSX0NOVEwgZnJvbSB0byAleFxuIiwKKwkJRFJNX0RFQlVHX0tNUygiR1JQSF9CVUZGRVJfQ05UTCBmcm9tIHRvICV4XG4iLAogCQkJICAvKiAJICAodW5zaWduZWQgaW50KWluZm8tPlNhdmVkUmVnLT5ncnBoX2J1ZmZlcl9jbnRsLCAqLwogCQkJICAodW5zaWduZWQgaW50KVJSRUczMihSQURFT05fR1JQSF9CVUZGRVJfQ05UTCkpOwogCX0KQEAgLTMxMzUsNyArMzEzOSw3IEBACiAJCQlXUkVHMzIoUlM0MDBfRElTUDFfUkVRX0NOVEwxLCAweDI4RkJDM0FDKTsKIAkJfQogCi0JCURSTV9ERUJVRygiR1JQSDJfQlVGRkVSX0NOVEwgZnJvbSB0byAleFxuIiwKKwkJRFJNX0RFQlVHX0tNUygiR1JQSDJfQlVGRkVSX0NOVEwgZnJvbSB0byAleFxuIiwKIAkJCSAgKHVuc2lnbmVkIGludClSUkVHMzIoUkFERU9OX0dSUEgyX0JVRkZFUl9DTlRMKSk7CiAJfQogfQpAQCAtMzgwOSw2ICszODEzLDMxIEBACiAJcmRldi0+YmlvcyA9IE5VTEw7CiB9CiAKKy8qCisgKiBEdWUgdG8gaG93IGtleGVjIHdvcmtzLCBpdCBjYW4gbGVhdmUgdGhlIGh3IGZ1bGx5IGluaXRpYWxpc2VkIHdoZW4gaXQKKyAqIGJvb3RzIHRoZSBuZXcga2VybmVsLiBIb3dldmVyIGRvaW5nIG91ciBpbml0IHNlcXVlbmNlIHdpdGggdGhlIENQIGFuZAorICogV0Igc3R1ZmYgc2V0dXAgY2F1c2VzIEdQVSBoYW5ncyBvbiB0aGUgUk41MCBhdCBsZWFzdC4gU28gYXQgc3RhcnR1cAorICogZG8gc29tZSBxdWljayBzYW5pdHkgY2hlY2tzIGFuZCByZXN0b3JlIHNhbmUgdmFsdWVzIHRvIGF2b2lkIHRoaXMKKyAqIHByb2JsZW0uCisgKi8KK3ZvaWQgcjEwMF9yZXN0b3JlX3Nhbml0eShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdG1wOworCisJdG1wID0gUlJFRzMyKFJBREVPTl9DUF9DU1FfQ05UTCk7CisJaWYgKHRtcCkgeworCQlXUkVHMzIoUkFERU9OX0NQX0NTUV9DTlRMLCAwKTsKKwl9CisJdG1wID0gUlJFRzMyKFJBREVPTl9DUF9SQl9DTlRMKTsKKwlpZiAodG1wKSB7CisJCVdSRUczMihSQURFT05fQ1BfUkJfQ05UTCwgMCk7CisJfQorCXRtcCA9IFJSRUczMihSQURFT05fU0NSQVRDSF9VTVNLKTsKKwlpZiAodG1wKSB7CisJCVdSRUczMihSQURFT05fU0NSQVRDSF9VTVNLLCAwKTsKKwl9Cit9CisKIGludCByMTAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHI7CkBAIC0zODIxLDYgKzM4NTAsOCBAQAogCXJhZGVvbl9zY3JhdGNoX2luaXQocmRldik7CiAJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLwogCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CisJLyogc2FuaXR5IGNoZWNrIHNvbWUgcmVnaXN0ZXIgdG8gYXZvaWQgaGFuZ3MgbGlrZSBhZnRlciBrZXhlYyAqLworCXIxMDBfcmVzdG9yZV9zYW5pdHkocmRldik7CiAJLyogVE9ETzogZGlzYWJsZSBWR0EgbmVlZCB0byB1c2UgVkdBIHJlcXVlc3QgKi8KIAkvKiBCSU9TKi8KIAlpZiAoIXJhZGVvbl9nZXRfYmlvcyhyZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oCmluZGV4IGQwMTZiMTYuLmIxMjFiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBkLmgKQEAgLTQ4LDEwICs0OCwxMiBAQAogI2RlZmluZQkJUEFDS0VUM18zRF9EUkFXX0lNTUQJCTB4MjkKICNkZWZpbmUJCVBBQ0tFVDNfM0RfRFJBV19JTkRYCQkweDJBCiAjZGVmaW5lCQlQQUNLRVQzXzNEX0xPQURfVkJQTlRSCQkweDJGCisjZGVmaW5lCQlQQUNLRVQzXzNEX0NMRUFSX1pNQVNLCQkweDMyCiAjZGVmaW5lCQlQQUNLRVQzX0lORFhfQlVGRkVSCQkweDMzCiAjZGVmaW5lCQlQQUNLRVQzXzNEX0RSQVdfVkJVRl8yCQkweDM0CiAjZGVmaW5lCQlQQUNLRVQzXzNEX0RSQVdfSU1NRF8yCQkweDM1CiAjZGVmaW5lCQlQQUNLRVQzXzNEX0RSQVdfSU5EWF8yCQkweDM2CisjZGVmaW5lCQlQQUNLRVQzXzNEX0NMRUFSX0hJWgkJMHgzNwogI2RlZmluZQkJUEFDS0VUM19CSVRCTFRfTVVMVEkJCTB4OUIKIAogI2RlZmluZSBQQUNLRVQwKHJlZywgbikJKENQX1BBQ0tFVDAgfAkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwppbmRleCAxOWE3ZWY3Li5jODI3NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwpAQCAtMTA0OCwxNCArMTA0OCw0NyBAQAogCQkvKiBSQjNEX0NPTE9SX0NIQU5ORUxfTUFTSyAqLwogCQl0cmFjay0+Y29sb3JfY2hhbm5lbF9tYXNrID0gaWR4X3ZhbHVlOwogCQlicmVhazsKLQljYXNlIDB4NGQxYzoKKwljYXNlIDB4NDNhNDoKKwkJLyogU0NfSFlQRVJaX0VOICovCisJCS8qIHIzMDBjIGVtaXRzIHRoaXMgcmVnaXN0ZXIgLSB3ZSBuZWVkIHRvIGRpc2FibGUgaHlwZXJ6IGZvciBpdAorCQkgKiB3aXRob3V0IGNvbXBsYWluaW5nICovCisJCWlmIChwLT5yZGV2LT5oeXBlcnpfZmlscCAhPSBwLT5maWxwKSB7CisJCQlpZiAoaWR4X3ZhbHVlICYgMHgxKQorCQkJCWliW2lkeF0gPSBpZHhfdmFsdWUgJiB+MTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4NGYxYzoKIAkJLyogWkJfQldfQ05UTCAqLwogCQl0cmFjay0+emJfY2JfY2xlYXIgPSAhIShpZHhfdmFsdWUgJiAoMSA8PCA1KSk7CisJCWlmIChwLT5yZGV2LT5oeXBlcnpfZmlscCAhPSBwLT5maWxwKSB7CisJCQlpZiAoaWR4X3ZhbHVlICYgKFIzMDBfSElaX0VOQUJMRSB8CisJCQkJCSBSMzAwX1JEX0NPTVBfRU5BQkxFIHwKKwkJCQkJIFIzMDBfV1JfQ09NUF9FTkFCTEUgfAorCQkJCQkgUjMwMF9GQVNUX0ZJTExfRU5BQkxFKSkKKwkJCQlnb3RvIGZhaWw7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSAweDRlMDQ6CiAJCS8qIFJCM0RfQkxFTkRDTlRMICovCiAJCXRyYWNrLT5ibGVuZF9yZWFkX2VuYWJsZSA9ICEhKGlkeF92YWx1ZSAmICgxIDw8IDIpKTsKIAkJYnJlYWs7CisJY2FzZSAweDRmMjg6IC8qIFpCX0RFUFRIQ0xFQVJWQUxVRSAqLworCQlicmVhazsKKwljYXNlIDB4NGYzMDogLyogWkJfTUFTS19PRkZTRVQgKi8KKwljYXNlIDB4NGYzNDogLyogWkJfWk1BU0tfUElUQ0ggKi8KKwljYXNlIDB4NGY0NDogLyogWkJfSElaX09GRlNFVCAqLworCWNhc2UgMHg0ZjU0OiAvKiBaQl9ISVpfUElUQ0ggKi8KKwkJaWYgKGlkeF92YWx1ZSAmJiAocC0+cmRldi0+aHlwZXJ6X2ZpbHAgIT0gcC0+ZmlscCkpCisJCQlnb3RvIGZhaWw7CisJCWJyZWFrOworCWNhc2UgMHg0MDI4OgorCQlpZiAoaWR4X3ZhbHVlICYmIChwLT5yZGV2LT5oeXBlcnpfZmlscCAhPSBwLT5maWxwKSkKKwkJCWdvdG8gZmFpbDsKKwkJLyogR0JfWl9QRVFfQ09ORklHICovCisJCWlmIChwLT5yZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjM1MCkKKwkJCWJyZWFrOworCQlnb3RvIGZhaWw7CisJCWJyZWFrOwogCWNhc2UgMHg0YmU4OgogCQkvKiB2YWxpZCByZWdpc3RlciBvbmx5IG9uIFJWNTMwICovCiAJCWlmIChwLT5yZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjUzMCkKQEAgLTEwNjYsOCArMTA5OSw4IEBACiAJfQogCXJldHVybiAwOwogZmFpbDoKLQlwcmludGsoS0VSTl9FUlIgIkZvcmJpZGRlbiByZWdpc3RlciAweCUwNFggaW4gY3MgYXQgJWRcbiIsCi0JICAgICAgIHJlZywgaWR4KTsKKwlwcmludGsoS0VSTl9FUlIgIkZvcmJpZGRlbiByZWdpc3RlciAweCUwNFggaW4gY3MgYXQgJWQgKHZhbD0lMDh4KVxuIiwKKwkgICAgICAgcmVnLCBpZHgsIGlkeF92YWx1ZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTExNjEsNiArMTE5NCwxMSBAQAogCQkJcmV0dXJuIHI7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBQQUNLRVQzXzNEX0NMRUFSX0hJWjoKKwljYXNlIFBBQ0tFVDNfM0RfQ0xFQVJfWk1BU0s6CisJCWlmIChwLT5yZGV2LT5oeXBlcnpfZmlscCAhPSBwLT5maWxwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCWNhc2UgUEFDS0VUM19OT1A6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMzgwLDYgKzE0MTgsOCBAQAogCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KIAlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOwogCS8qIFRPRE86IGRpc2FibGUgVkdBIG5lZWQgdG8gdXNlIFZHQSByZXF1ZXN0ICovCisJLyogcmVzdG9yZSBzb21lIHJlZ2lzdGVyIHRvIHNhbmUgZGVmYXVsdHMgKi8KKwlyMTAwX3Jlc3RvcmVfc2FuaXR5KHJkZXYpOwogCS8qIEJJT1MqLwogCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7CiAJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwZC5oCmluZGV4IDk2OGEzMzMuLjBjMDM2YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBkLmgKQEAgLTQ4LDEwICs0OCwxMiBAQAogI2RlZmluZQkJUEFDS0VUM18zRF9EUkFXX0lNTUQJCTB4MjkKICNkZWZpbmUJCVBBQ0tFVDNfM0RfRFJBV19JTkRYCQkweDJBCiAjZGVmaW5lCQlQQUNLRVQzXzNEX0xPQURfVkJQTlRSCQkweDJGCisjZGVmaW5lCQlQQUNLRVQzXzNEX0NMRUFSX1pNQVNLCQkweDMyCiAjZGVmaW5lCQlQQUNLRVQzX0lORFhfQlVGRkVSCQkweDMzCiAjZGVmaW5lCQlQQUNLRVQzXzNEX0RSQVdfVkJVRl8yCQkweDM0CiAjZGVmaW5lCQlQQUNLRVQzXzNEX0RSQVdfSU1NRF8yCQkweDM1CiAjZGVmaW5lCQlQQUNLRVQzXzNEX0RSQVdfSU5EWF8yCQkweDM2CisjZGVmaW5lCQlQQUNLRVQzXzNEX0NMRUFSX0hJWgkJMHgzNwogI2RlZmluZQkJUEFDS0VUM19CSVRCTFRfTVVMVEkJCTB4OUIKIAogI2RlZmluZSBQQUNLRVQwKHJlZywgbikJKENQX1BBQ0tFVDAgfAkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjAuYwppbmRleCBlNmM4OTE0Li41OWY3YmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjAuYwpAQCAtMzQzLDYgKzM0Myw4IEBACiAJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLwogCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CiAJLyogVE9ETzogZGlzYWJsZSBWR0EgbmVlZCB0byB1c2UgVkdBIHJlcXVlc3QgKi8KKwkvKiByZXN0b3JlIHNvbWUgcmVnaXN0ZXIgdG8gc2FuZSBkZWZhdWx0cyAqLworCXIxMDBfcmVzdG9yZV9zYW5pdHkocmRldik7CiAJLyogQklPUyovCiAJaWYgKCFyYWRlb25fZ2V0X2Jpb3MocmRldikpIHsKIAkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmgKaW5kZXggOTNjOWEyYi4uNmFjMWY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTAwX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUwMF9yZWcuaApAQCAtMzg2LDYgKzM4NiwxMSBAQAogIyAgICAgICBkZWZpbmUgQVZJVk9fRDFHUlBIX1RJTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIwKQogIyAgICAgICBkZWZpbmUgQVZJVk9fRDFHUlBIX01BQ1JPX0FERFJFU1NfTU9ERSAgICAgICAgICAgICAgICAgICgxIDw8IDIxKQogCisjICAgICAgIGRlZmluZSBSNjAwX0QxR1JQSF9BUlJBWV9NT0RFX0xJTkVBUl9HRU5FUkFMICAgICAgICAgICAgKDAgPDwgMjApCisjICAgICAgIGRlZmluZSBSNjAwX0QxR1JQSF9BUlJBWV9NT0RFX0xJTkVBUl9BTElHTkVEICAgICAgICAgICAgKDEgPDwgMjApCisjICAgICAgIGRlZmluZSBSNjAwX0QxR1JQSF9BUlJBWV9NT0RFXzFEX1RJTEVEX1RISU4xICAgICAgICAgICAgKDIgPDwgMjApCisjICAgICAgIGRlZmluZSBSNjAwX0QxR1JQSF9BUlJBWV9NT0RFXzJEX1RJTEVEX1RISU4xICAgICAgICAgICAgKDQgPDwgMjApCisKIC8qIFRoZSBSN3h4ICpfSElHSCBzdXJmYWNlIHJlZ3MgYXJlIGJhY2t3YXJkczsgdGhlIEQxIHJlZ3MgYXJlIGluIHRoZSBEMgogICogYmxvY2sgYW5kIHZpY2UgdmVyc2EuICBUaGlzIGFwcGxpZXMgdG8gR1JQSCwgQ1VSLCBldGMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTIwLmMKaW5kZXggNjk0YWY3Yy4uMTQ1OGRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTIwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTIwLmMKQEAgLTIzMSw2ICsyMzEsOCBAQAogCXJhZGVvbl9zY3JhdGNoX2luaXQocmRldik7CiAJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLwogCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CisJLyogcmVzdG9yZSBzb21lIHJlZ2lzdGVyIHRvIHNhbmUgZGVmYXVsdHMgKi8KKwlyMTAwX3Jlc3RvcmVfc2FuaXR5KHJkZXYpOwogCS8qIFRPRE86IGRpc2FibGUgVkdBIG5lZWQgdG8gdXNlIFZHQSByZXF1ZXN0ICovCiAJLyogQklPUyovCiAJaWYgKCFyYWRlb25fZ2V0X2Jpb3MocmRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKaW5kZXggZTEwMGY2OS4uZDBlYmFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKQEAgLTkyLDYgKzkyLDIxIEBACiB2b2lkIHI2MDBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHI2MDBfaXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCisvKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICovCit1MzIgcnY2eHhfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHRlbXAgPSAoUlJFRzMyKENHX1RIRVJNQUxfU1RBVFVTKSAmIEFTSUNfVF9NQVNLKSA+PgorCQlBU0lDX1RfU0hJRlQ7CisJdTMyIGFjdHVhbF90ZW1wID0gMDsKKworCWlmICgodGVtcCA+PiA3KSAmIDEpCisJCWFjdHVhbF90ZW1wID0gMDsKKwllbHNlCisJCWFjdHVhbF90ZW1wID0gKHRlbXAgPj4gMSkgJiAweGZmOworCisJcmV0dXJuIGFjdHVhbF90ZW1wICogMTAwMDsKK30KKwogdm9pZCByNjAwX3BtX2dldF9keW5wbV9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgaTsKQEAgLTI1Niw3ICsyNzEsNyBAQAogCQl9CiAJfQogCi0JRFJNX0RFQlVHKCJSZXF1ZXN0ZWQ6IGU6ICVkIG06ICVkIHA6ICVkXG4iLAorCURSTV9ERUJVR19EUklWRVIoIlJlcXVlc3RlZDogZTogJWQgbTogJWQgcDogJWRcbiIsCiAJCSAgcmRldi0+cG0ucG93ZXJfc3RhdGVbcmRldi0+cG0ucmVxdWVzdGVkX3Bvd2VyX3N0YXRlX2luZGV4XS4KIAkJICBjbG9ja19pbmZvW3JkZXYtPnBtLnJlcXVlc3RlZF9jbG9ja19tb2RlX2luZGV4XS5zY2xrLAogCQkgIHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleF0uCkBAIC01NzEsNyArNTg2LDcgQEAKIAkJaWYgKHZvbHRhZ2UtPnZvbHRhZ2UgIT0gcmRldi0+cG0uY3VycmVudF92ZGRjKSB7CiAJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCB2b2x0YWdlLT52b2x0YWdlKTsKIAkJCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHZvbHRhZ2UtPnZvbHRhZ2U7Ci0JCQlEUk1fREVCVUcoIlNldHRpbmc6IHY6ICVkXG4iLCB2b2x0YWdlLT52b2x0YWdlKTsKKwkJCURSTV9ERUJVR19EUklWRVIoIlNldHRpbmc6IHY6ICVkXG4iLCB2b2x0YWdlLT52b2x0YWdlKTsKIAkJfQogCX0KIH0KQEAgLTg2OSw3ICs4ODQsMTcgQEAKIAl1MzIgdG1wOwogCiAJLyogZmx1c2ggaGRwIGNhY2hlIHNvIHVwZGF0ZXMgaGl0IHZyYW0gKi8KLQlXUkVHMzIoUl8wMDU0ODBfSERQX01FTV9DT0hFUkVOQ1lfRkxVU0hfQ05UTCwgMHgxKTsKKwlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzcwKSAmJiAocmRldi0+ZmFtaWx5IDw9IENISVBfUlY3NDApKSB7CisJCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucHRyOworCQl1MzIgdG1wOworCisJCS8qIHI3eHggaHcgYnVnLiAgd3JpdGUgdG8gSERQX0RFQlVHMSBmb2xsb3dlZCBieSBmYiByZWFkCisJCSAqIHJhdGhlciB0aGFuIHdyaXRlIHRvIEhEUF9SRUdfQ09IRVJFTkNZX0ZMVVNIX0NOVEwKKwkJICovCisJCVdSRUczMihIRFBfREVCVUcxLCAwKTsKKwkJdG1wID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKXB0cik7CisJfSBlbHNlCisJCVdSRUczMihSXzAwNTQ4MF9IRFBfTUVNX0NPSEVSRU5DWV9GTFVTSF9DTlRMLCAweDEpOwogCiAJV1JFRzMyKFZNX0NPTlRFWFQwX0lOVkFMSURBVElPTl9MT1dfQUREUiwgcmRldi0+bWMuZ3R0X3N0YXJ0ID4+IDEyKTsKIAlXUkVHMzIoVk1fQ09OVEVYVDBfSU5WQUxJREFUSU9OX0hJR0hfQUREUiwgKHJkZXYtPm1jLmd0dF9lbmQgLSAxKSA+PiAxMik7CkBAIC0xMjE3LDggKzEyNDIsOCBAQAogCX0KIAlyZGV2LT5tYy52cmFtX3dpZHRoID0gbnVtY2hhbiAqIGNoYW5zaXplOwogCS8qIENvdWxkIGFwZXIgc2l6ZSByZXBvcnQgMCA/ICovCi0JcmRldi0+bWMuYXBlcl9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChyZGV2LT5kZGV2LCAwKTsKLQlyZGV2LT5tYy5hcGVyX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihyZGV2LT5kZGV2LCAwKTsKKwlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocmRldi0+cGRldiwgMCk7CisJcmRldi0+bWMuYXBlcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCAwKTsKIAkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCiAJcmRldi0+bWMubWNfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKTsKIAlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSk7CkBAIC0xNjA5LDcgKzE2MzQsNyBAQAogCQkJCQkJCSByNjAwX2NvdW50X3BpcGVfYml0cygoY2NfcmJfYmFja2VuZF9kaXNhYmxlICYKIAkJCQkJCQkJCSAgICAgICBSNlhYX01BWF9CQUNLRU5EU19NQVNLKSA+PiAxNikpLAogCQkJCQkJCShjY19yYl9iYWNrZW5kX2Rpc2FibGUgPj4gMTYpKTsKLQorCXJkZXYtPmNvbmZpZy5yNjAwLnRpbGVfY29uZmlnID0gdGlsaW5nX2NvbmZpZzsKIAl0aWxpbmdfY29uZmlnIHw9IEJBQ0tFTkRfTUFQKGJhY2tlbmRfbWFwKTsKIAlXUkVHMzIoR0JfVElMSU5HX0NPTkZJRywgdGlsaW5nX2NvbmZpZyk7CiAJV1JFRzMyKERDUF9USUxJTkdfQ09ORklHLCB0aWxpbmdfY29uZmlnICYgMHhmZmZmKTsKQEAgLTM1MTIsNSArMzUzNywxNSBAQAogICovCiB2b2lkIHI2MDBfaW9jdGxfd2FpdF9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2JvICpibykKIHsKLQlXUkVHMzIoUl8wMDU0ODBfSERQX01FTV9DT0hFUkVOQ1lfRkxVU0hfQ05UTCwgMHgxKTsKKwkvKiByN3h4IGh3IGJ1Zy4gIHdyaXRlIHRvIEhEUF9ERUJVRzEgZm9sbG93ZWQgYnkgZmIgcmVhZAorCSAqIHJhdGhlciB0aGFuIHdyaXRlIHRvIEhEUF9SRUdfQ09IRVJFTkNZX0ZMVVNIX0NOVEwKKwkgKi8KKwlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzcwKSAmJiAocmRldi0+ZmFtaWx5IDw9IENISVBfUlY3NDApKSB7CisJCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucHRyOworCQl1MzIgdG1wOworCisJCVdSRUczMihIRFBfREVCVUcxLCAwKTsKKwkJdG1wID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKXB0cik7CisJfSBlbHNlCisJCVdSRUczMihSXzAwNTQ4MF9IRFBfTUVNX0NPSEVSRU5DWV9GTFVTSF9DTlRMLCAweDEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2F1ZGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYXVkaW8uYwppbmRleCAyYjI2NTUzLi5iNTQ0M2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYXVkaW8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYXVkaW8uYwpAQCAtNjMsNyArNjMsOCBAQAogCWNhc2UgMHg0OiByZXR1cm4gMzI7CiAJfQogCi0JRFJNX0VSUk9SKCJVbmtub3duIGJpdHMgcGVyIHNhbXBsZSAweCV4IHVzaW5nIDE2IGluc3RlYWQuXG4iLCAoaW50KXZhbHVlKTsKKwlkZXZfZXJyKHJkZXYtPmRldiwgIlVua25vd24gYml0cyBwZXIgc2FtcGxlIDB4JXggdXNpbmcgMTYgaW5zdGVhZFxuIiwKKwkJKGludCl2YWx1ZSk7CiAKIAlyZXR1cm4gMTY7CiB9CkBAIC0xNTAsNyArMTUxLDggQEAKIAkJCXI2MDBfaGRtaV91cGRhdGVfYXVkaW9fc2V0dGluZ3MoZW5jb2Rlcik7CiAJfQogCi0JaWYoc3RpbGxfZ29pbmcpIHI2MDBfYXVkaW9fc2NoZWR1bGVfcG9sbGluZyhyZGV2KTsKKwlpZiAoc3RpbGxfZ29pbmcpCisJCXI2MDBfYXVkaW9fc2NoZWR1bGVfcG9sbGluZyhyZGV2KTsKIH0KIAogLyoKQEAgLTE1OCw4ICsxNjAsOSBAQAogICovCiBzdGF0aWMgdm9pZCByNjAwX2F1ZGlvX2VuZ2luZV9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGJvb2wgZW5hYmxlKQogewotCURSTV9JTkZPKCIlcyBhdWRpbyBzdXBwb3J0IiwgZW5hYmxlID8gIkVuYWJsaW5nIiA6ICJEaXNhYmxpbmciKTsKKwlEUk1fSU5GTygiJXMgYXVkaW8gc3VwcG9ydFxuIiwgZW5hYmxlID8gIkVuYWJsaW5nIiA6ICJEaXNhYmxpbmciKTsKIAlXUkVHMzJfUChSNjAwX0FVRElPX0VOQUJMRSwgZW5hYmxlID8gMHg4MTAwMDAwMCA6IDB4MCwgfjB4ODEwMDAwMDApOworCXJkZXYtPmF1ZGlvX2VuYWJsZWQgPSBlbmFibGU7CiB9CiAKIC8qCkBAIC0xOTUsMTIgKzE5OCwxNCBAQAogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CiAKLQlEUk1fREVCVUcoInI2MDBfYXVkaW9fZW5hYmxlX3BvbGxpbmc6ICVkIiwgcmFkZW9uX2VuY29kZXItPmF1ZGlvX3BvbGxpbmdfYWN0aXZlKTsKKwlEUk1fREVCVUcoInI2MDBfYXVkaW9fZW5hYmxlX3BvbGxpbmc6ICVkXG4iLAorCQlyYWRlb25fZW5jb2Rlci0+YXVkaW9fcG9sbGluZ19hY3RpdmUpOwogCWlmIChyYWRlb25fZW5jb2Rlci0+YXVkaW9fcG9sbGluZ19hY3RpdmUpCiAJCXJldHVybjsKIAogCXJhZGVvbl9lbmNvZGVyLT5hdWRpb19wb2xsaW5nX2FjdGl2ZSA9IDE7Ci0JbW9kX3RpbWVyKCZyZGV2LT5hdWRpb190aW1lciwgamlmZmllcyArIDEpOworCWlmIChyZGV2LT5hdWRpb19lbmFibGVkKQorCQltb2RfdGltZXIoJnJkZXYtPmF1ZGlvX3RpbWVyLCBqaWZmaWVzICsgMSk7CiB9CiAKIC8qCkBAIC0yMDksNyArMjE0LDggQEAKIHZvaWQgcjYwMF9hdWRpb19kaXNhYmxlX3BvbGxpbmcoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlEUk1fREVCVUcoInI2MDBfYXVkaW9fZGlzYWJsZV9wb2xsaW5nOiAlZCIsIHJhZGVvbl9lbmNvZGVyLT5hdWRpb19wb2xsaW5nX2FjdGl2ZSk7CisJRFJNX0RFQlVHKCJyNjAwX2F1ZGlvX2Rpc2FibGVfcG9sbGluZzogJWRcbiIsCisJCXJhZGVvbl9lbmNvZGVyLT5hdWRpb19wb2xsaW5nX2FjdGl2ZSk7CiAJcmFkZW9uX2VuY29kZXItPmF1ZGlvX3BvbGxpbmdfYWN0aXZlID0gMDsKIH0KIApAQCAtMjM2LDcgKzI0Miw3IEBACiAJCVdSRUczMl9QKFI2MDBfQVVESU9fVElNSU5HLCAweDEwMCwgfjB4MzAxKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJRFJNX0VSUk9SKCJVbnN1cHBvcnRlZCBlbmNvZGVyIHR5cGUgMHglMDJYXG4iLAorCQlkZXZfZXJyKHJkZXYtPmRldiwgIlVuc3VwcG9ydGVkIGVuY29kZXIgdHlwZSAweCUwMlhcbiIsCiAJCQkgIHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI2Niw3ICsyNzIsNyBAQAogICovCiB2b2lkIHI2MDBfYXVkaW9fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpZiAoIXJhZGVvbl9hdWRpbyB8fCAhcjYwMF9hdWRpb19jaGlwc2V0X3N1cHBvcnRlZChyZGV2KSkKKwlpZiAoIXJkZXYtPmF1ZGlvX2VuYWJsZWQpCiAJCXJldHVybjsKIAogCWRlbF90aW1lcigmcmRldi0+YXVkaW9fdGltZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXRfc2hhZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXRfc2hhZGVycy5jCmluZGV4IDAyNzFiNTMuLmU4MTUxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X3NoYWRlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdF9zaGFkZXJzLmMKQEAgLTM5LDM3ICszOSw0NSBAQAogCiBjb25zdCB1MzIgcjZ4eF9kZWZhdWx0X3N0YXRlW10gPQogewotCTB4YzAwMDI0MDAsCisJMHhjMDAwMjQwMCwgLyogU1RBUlRfM0RfQ01EQlVGICovCiAJMHgwMDAwMDAwMCwKLQkweGMwMDEyODAwLAorCisJMHhjMDAxMjgwMCwgLyogQ09OVEVYVF9DT05UUk9MICovCiAJMHg4MDAwMDAwMCwKIAkweDgwMDAwMDAwLAorCiAJMHhjMDAxNjgwMCwKIAkweDAwMDAwMDEwLAotCTB4MDAwMDgwMDAsCisJMHgwMDAwODAwMCwgLyogV0FJVF9VTlRJTCAqLworCiAJMHhjMDAxNjgwMCwKIAkweDAwMDAwNTQyLAotCTB4MDcwMDAwMDMsCisJMHgwNzAwMDAwMywgLyogVEFfQ05UTF9BVVggKi8KKwogCTB4YzAwMTY4MDAsCiAJMHgwMDAwMDVjNSwKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFZDX0VOSEFOQ0UgKi8KKwogCTB4YzAwMTY4MDAsCiAJMHgwMDAwMDM2MywKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFNRX0RZTl9HUFJfQ05UTF9QU19GTFVTSF9SRVEgKi8KKwogCTB4YzAwMTY4MDAsCiAJMHgwMDAwMDYwYywKLQkweDgyMDAwMDAwLAorCTB4ODIwMDAwMDAsIC8qIERCX0RFQlVHICovCisKIAkweGMwMDE2ODAwLAogCTB4MDAwMDA2MGUsCi0JMHgwMTAyMDIwNCwKLQkweGMwMDE2ZjAwLAorCTB4MDEwMjAyMDQsIC8qIERCX1dBVEVSTUFSS1MgKi8KKworCTB4YzAwMjZmMDAsCiAJMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTZmMDAsCi0JMHgwMDAwMDAwMSwKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFNRX1ZUWF9CQVNFX1ZUWF9MT0MgKi8KKwkweDAwMDAwMDAwLCAvKiBTUV9WVFhfU1RBUlRfSU5TVF9MT0MgKi8KKwogCTB4YzAwOTY5MDAsCiAJMHgwMDAwMDIyYSwKKwkweDAwMDAwMDAwLCAvKiBTUV9FU0dTX1JJTkdfSVRFTVNJWkUgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTc4LDUxNSArODYsMzE3IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKKwogCTB4YzAwMTY5MDAsCiAJMHgwMDAwMDAwNCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCisJMHgwMDAwMDAwMCwgLyogREJfREVQVEhfSU5GTyAqLworCisJMHhjMDAyNjkwMCwKIAkweDAwMDAwMDBhLAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDBiLAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMTBjLAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMTBkLAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogREJfU1RFTkNJTF9DTEVBUiAqLworCTB4MDAwMDAwMDAsIC8qIERCX0RFUFRIX0NMRUFSICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyMDAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIERCX0RFUFRIX0NPTlRST0wgKi8KKworCTB4YzAwMjY5MDAsCiAJMHgwMDAwMDM0MywKLQkweDAwMDAwMDYwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDM0NCwKLQkweDAwMDAwMDQwLAorCTB4MDAwMDAwNjAsIC8qIERCX1JFTkRFUl9DT05UUk9MICovCisJMHgwMDAwMDA0MCwgLyogREJfUkVOREVSX09WRVJSSURFICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAzNTEsCi0JMHgwMDAwYWEwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDQsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMGUsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDQ2OTAwLAotCTB4MDAwMDAxMDUsCisJMHgwMDAwYWEwMCwgLyogREJfQUxQSEFfVE9fTUFTSyAqLworCisJMHhjMDBmNjkwMCwKKwkweDAwMDAwMTAwLAorCTB4MDAwMDA4MDAsIC8qIFZHVF9NQVhfVlRYX0lORFggKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfTUlOX1ZUWF9JTkRYICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0lORFhfT0ZGU0VUICovCisJMHgwMDAwMDAwMCwgLyogVkdUX01VTFRJX1BSSU1fSUJfUkVTRVRfSU5EWCAqLworCTB4MDAwMDAwMDAsIC8qIFNYX0FMUEhBX1RFU1RfQ09OVFJPTCAqLworCTB4MDAwMDAwMDAsIC8qIENCX0JMRU5EX1JFRCAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHhjMDAzNjkwMCwKLQkweDAwMDAwMTA5LAorCTB4MDAwMDAwMDAsIC8qIENCX0ZPR19SRUQgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBEQl9TVEVOQ0lMUkVGTUFTSyAqLworCTB4MDAwMDAwMDAsIC8qIERCX1NURU5DSUxSRUZNQVNLX0JGICovCisJMHgwMDAwMDAwMCwgLyogU1hfQUxQSEFfUkVGICovCisKIAkweGMwMDQ2OTAwLAogCTB4MDAwMDAzMGMsCi0JMHgwMTAwMDAwMCwKKwkweDAxMDAwMDAwLCAvKiBDQl9DTFJDTVBfQ05UTCAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAorCiAJMHhjMDA0NjkwMCwKIAkweDAwMDAwMDQ4LAotCTB4M2Y4MDAwMDAsCisJMHgzZjgwMDAwMCwgLyogQ0JfQ0xFQVJfUkVEICovCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDhlLAotCTB4MDAwMDAwMGYsCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAwODAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX1dJTkRPV19PRkZTRVQgKi8KKworCTB4YzAwYTY5MDAsCiAJMHgwMDAwMDA4MywKLQkweDAwMDBmZmZmLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NSwKKwkweDAwMDBmZmZmLCAvKiBQQV9TQ19DTElQX1JFQ1RfUlVMRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX0NMSVBSRUNUXzBfVEwgKi8KIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NiwKIAkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NywKIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4OCwKIAkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4OSwKIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4YSwKIAkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4YiwKIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4YywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCisJMHgwMDAwMDAwMCwgLyogUEFfU0NfRURHRVJVTEUgKi8KKworCTB4YzA0MDY5MDAsCiAJMHgwMDAwMDA5NCwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5NSwKKwkweDgwMDAwMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzBfVEwgKi8KKwkweDIwMDAyMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzBfQlIgKi8KKwkweDgwMDAwMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzFfVEwgKi8KIAkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBiNCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX1ZQT1JUX1pNSU5fMCAqLworCTB4M2Y4MDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5NiwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5NywKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBiNiwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDk4LAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDk5LAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGI4LAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwOWEsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwOWIsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwYmEsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5YywKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5ZCwKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBiYywKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDllLAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDlmLAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGJlLAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTAsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTEsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwYzAsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhMiwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhMywKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBjMiwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGE0LAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGE1LAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGM0LAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTYsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTcsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwYzYsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhOCwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhOSwKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBjOCwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGFhLAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGFiLAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGNhLAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYWMsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYWQsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwY2MsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhZSwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhZiwKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBjZSwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGIwLAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGIxLAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGQwLAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYjIsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYjMsCi0JMHgyMDAwMjAwMCwKKwogCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBkMiwKLQkweDAwMDAwMDAwLAotCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjkzLAotCTB4MDAwMDQwMTAsCi0JMHhjMDAxNjkwMCwKKwkweDAwMDAwMjkyLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX01QQVNTX1BTX0NOVEwgKi8KKwkweDAwMDA0MDEwLCAvKiBQQV9TQ19NT0RFX0NOVEwgKi8KKworCTB4YzAwOTY5MDAsCiAJMHgwMDAwMDMwMCwKKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19MSU5FX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19BQV9DT05GSUcgKi8KKwkweDAwMDAwMDJkLCAvKiBQQV9TVV9WVFhfQ05UTCAqLworCTB4M2Y4MDAwMDAsIC8qIFBBX0NMX0dCX1ZFUlRfQ0xJUF9BREogKi8KKwkweDNmODAwMDAwLAorCTB4M2Y4MDAwMDAsCisJMHgzZjgwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19TQU1QTEVfTE9DU19NQ1RYICovCiAJMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzMDEsCi0JMHgwMDAwMDAwMCwKKwogCTB4YzAwMTY5MDAsCiAJMHgwMDAwMDMxMiwKLQkweGZmZmZmZmZmLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDMwNywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDMwOCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4MywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI5MiwKLQkweDAwMDAwMDAwLAorCTB4ZmZmZmZmZmYsIC8qIFBBX1NDX0FBX01BU0sgKi8KKwogCTB4YzAwNjY5MDAsCi0JMHgwMDAwMDEwZiwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDYsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDcsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDgsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDQ2OTAwLAotCTB4MDAwMDAzMDMsCi0JMHgzZjgwMDAwMCwKLQkweDNmODAwMDAwLAotCTB4M2Y4MDAwMDAsCi0JMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDUsCi0JMHgwMDAwMDAwNCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyODAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyODEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAogCTB4MDAwMDAzN2UsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODIsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODMsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyODIsCi0JMHgwMDAwMDAwOCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzMDIsCi0JMHgwMDAwMDAyZCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzN2YsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxYjIsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0RCX0ZNVF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogUEFfU1VfUE9MWV9PRkZTRVRfQ0xBTVAgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0xZX09GRlNFVF9GUk9OVF9TQ0FMRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0ZST05UX09GRlNFVCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0JBQ0tfU0NBTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0xZX09GRlNFVF9CQUNLX09GRlNFVCAqLworCisJMHhjMDA0NjkwMCwKIAkweDAwMDAwMWI2LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI3LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI4LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI5LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogU1BJX0lOUFVUX1ogKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0ZVTkNfU0NBTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0ZVTkNfQklBUyAqLworCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMjI1LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogU1FfUEdNX1NUQVJUX0ZTICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyMjksCi0JMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBTUV9QR01fUkVTT1VSQ0VTX0ZTICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyMzcsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDAsCi0JMHgwMDAwMDgwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDIsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFNRX1BHTV9DRl9PRkZTRVRfRlMgKi8KKworCTB4YzAwMjY5MDAsCiAJMHgwMDAwMDJhOCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDJhOSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDEwMywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI5MCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NiwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4OCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4OSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4YSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4YiwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4YywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4ZCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4ZSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4ZiwKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFZHVF9JTlNUQU5DRV9TVEVQX1JBVEVfMCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9JTlNUQU5DRV9TVEVQX1JBVEVfMSAqLworCisJMHhjMDExNjkwMCwKKwkweDAwMDAwMjgwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPSU5UX1NJWkUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0lOVF9NSU5NQVggKi8KKwkweDAwMDAwMDA4LCAvKiBQQV9TVV9MSU5FX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19MSU5FX1NUSVBQTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfT1VUUFVUX1BBVEhfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9IT1NfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9IT1NfTUFYX1RFU1NfTEVWRUwgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfSE9TX01JTl9URVNTX0xFVkVMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0hPU19SRVVTRV9ERVBUSCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9HUk9VUF9QUklNX1RZUEUgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfR1JPVVBfRklSU1RfREVDUiAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9HUk9VUF9ERUNSICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0dST1VQX1ZFQ1RfMF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0dST1VQX1ZFQ1RfMV9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0dST1VQX1ZFQ1RfMF9GTVRfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9HUk9VUF9WRUNUXzFfRk1UX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfR1NfTU9ERSAqLworCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMmExLAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogVkdUX1BSSU1JVElWRUlEX0VOICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyYTUsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFZHVF9NVUxUSV9QUklNX0lEX1JFU0VUX0VOICovCisKKwkweGMwMDM2OTAwLAogCTB4MDAwMDAyYWMsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyYWQsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyYWUsCi0JMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBWR1RfU1RSTU9VVF9FTiAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9SRVVTRV9PRkYgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfVlRYX0NOVF9FTiAqLworCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMmM4LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogVkdUX1NUUk1PVVRfQlVGRkVSX0VOICovCisKKwkweGMwMDc2OTAwLAorCTB4MDAwMDAyMDIsCisJMHgwMGNjMDAwMCwgLyogQ0JfQ09MT1JfQ09OVFJPTCAqLworCTB4MDAwMDAyMTAsIC8qIERCX1NIQURFUl9DTlRMICovCisJMHgwMDAxMDAwMCwgLyogUEFfQ0xfQ0xJUF9DTlRMICovCisJMHgwMDAwMDI0NCwgLyogUEFfU1VfU0NfTU9ERV9DTlRMICovCisJMHgwMDAwMDEwMCwgLyogUEFfQ0xfVlRFX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9DTF9WU19PVVRfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX0NMX05BTklORl9DTlRMICovCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAwOGUsCisJMHgwMDAwMDAwZiwgLyogQ0JfVEFSR0VUX01BU0sgKi8KKwkweDAwMDAwMDBmLCAvKiBDQl9TSEFERVJfTUFTSyAqLworCiAJMHhjMDAxNjkwMCwKLQkweDAwMDAwMjA2LAotCTB4MDAwMDAxMDAsCisJMHgwMDAwMDFlOCwKKwkweDAwMDAwMDAxLCAvKiBDQl9TSEFERVJfQ09OVFJPTCAqLworCiAJMHhjMDAxNjkwMCwKLQkweDAwMDAwMjA0LAotCTB4MDAwMTAwMDAsCi0JMHhjMDAzNmUwMCwKKwkweDAwMDAwMTg1LAorCTB4MDAwMDAwMDAsIC8qIFNQSV9WU19PVVRfSURfMCAqLworCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMTkxLAorCTB4MDAwMDBiMDAsIC8qIFNQSV9QU19JTlBVVF9DTlRMXzAgKi8KKworCTB4YzAwNTY5MDAsCisJMHgwMDAwMDFiMSwKKwkweDAwMDAwMDAwLCAvKiBTUElfVlNfT1VUX0NPTkZJRyAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9USFJFQURfR1JPVVBJTkcgKi8KKwkweDAwMDAwMDAxLCAvKiBTUElfUFNfSU5fQ09OVFJPTF8wICovCisJMHgwMDAwMDAwMCwgLyogU1BJX1BTX0lOX0NPTlRST0xfMSAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9JTlRFUlBfQ09OVFJPTF8wICovCisKKwkweGMwMDM2ZTAwLCAvKiBTRVRfU0FNUExFUiAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAxMiwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDhmLAotCTB4MDAwMDAwMGYsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWU4LAotCTB4MDAwMDAwMDEsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjAyLAotCTB4MDBjYzAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjA1LAotCTB4MDAwMDAyNDQsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjAzLAotCTB4MDAwMDAyMTAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWIxLAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMTg1LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWIzLAotCTB4MDAwMDAwMDEsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI0LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMTkxLAotCTB4MDAwMDBiMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI1LAotCTB4MDAwMDAwMDAsCiB9OwogCiBjb25zdCB1MzIgcjd4eF9kZWZhdWx0X3N0YXRlW10gPQogewotCTB4YzAwMTI4MDAsCisJMHhjMDAxMjgwMCwgLyogQ09OVEVYVF9DT05UUk9MICovCiAJMHg4MDAwMDAwMCwKIAkweDgwMDAwMDAwLAorCiAJMHhjMDAxNjgwMCwKIAkweDAwMDAwMDEwLAotCTB4MDAwMDgwMDAsCisJMHgwMDAwODAwMCwgLyogV0FJVF9VTlRJTCAqLworCiAJMHhjMDAxNjgwMCwKIAkweDAwMDAwNTQyLAotCTB4MDcwMDAwMDIsCisJMHgwNzAwMDAwMiwgLyogVEFfQ05UTF9BVVggKi8KKwogCTB4YzAwMTY4MDAsCiAJMHgwMDAwMDVjNSwKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFZDX0VOSEFOQ0UgKi8KKwogCTB4YzAwMTY4MDAsCiAJMHgwMDAwMDM2MywKLQkweDAwMDA0MDAwLAorCTB4MDAwMDQwMDAsIC8qIFNRX0RZTl9HUFJfQ05UTF9QU19GTFVTSF9SRVEgKi8KKwogCTB4YzAwMTY4MDAsCiAJMHgwMDAwMDYwYywKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIERCX0RFQlVHICovCisKIAkweGMwMDE2ODAwLAogCTB4MDAwMDA2MGUsCi0JMHgwMDQyMDIwNCwKLQkweGMwMDE2ZjAwLAorCTB4MDA0MjAyMDQsIC8qIERCX1dBVEVSTUFSS1MgKi8KKworCTB4YzAwMjZmMDAsCiAJMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTZmMDAsCi0JMHgwMDAwMDAwMSwKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFNRX1ZUWF9CQVNFX1ZUWF9MT0MgKi8KKwkweDAwMDAwMDAwLCAvKiBTUV9WVFhfU1RBUlRfSU5TVF9MT0MgKi8KKwogCTB4YzAwOTY5MDAsCiAJMHgwMDAwMDIyYSwKKwkweDAwMDAwMDAwLCAvKiBTUV9FU0dTX1JJTkdfSVRFTVNJWkUgKi8KIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKQEAgLTU5NSw0NzEgKzQwNSwyNzAgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAorCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMDA0LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKKwkweDAwMDAwMDAwLCAvKiBEQl9ERVBUSF9JTkZPICovCisKKwkweGMwMDI2OTAwLAogCTB4MDAwMDAwMGEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwMGIsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMGMsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMGQsCi0JMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBEQl9TVEVOQ0lMX0NMRUFSICovCisJMHgwMDAwMDAwMCwgLyogREJfREVQVEhfQ0xFQVIgKi8KKwogCTB4YzAwMTY5MDAsCiAJMHgwMDAwMDIwMCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCisJMHgwMDAwMDAwMCwgLyogREJfREVQVEhfQ09OVFJPTCAqLworCisJMHhjMDAyNjkwMCwKIAkweDAwMDAwMzQzLAotCTB4MDAwMDAwNjAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMzQ0LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDA2MCwgLyogREJfUkVOREVSX0NPTlRST0wgKi8KKwkweDAwMDAwMDAwLCAvKiBEQl9SRU5ERVJfT1ZFUlJJREUgKi8KKwogCTB4YzAwMTY5MDAsCiAJMHgwMDAwMDM1MSwKLQkweDAwMDBhYTAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDEwNCwKKwkweDAwMDBhYTAwLCAvKiBEQl9BTFBIQV9UT19NQVNLICovCisKKwkweGMwMDk2OTAwLAorCTB4MDAwMDAxMDAsCisJMHgwMDAwMDgwMCwgLyogVkdUX01BWF9WVFhfSU5EWCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9NSU5fVlRYX0lORFggKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfSU5EWF9PRkZTRVQgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfTVVMVElfUFJJTV9JQl9SRVNFVF9JTkRYICovCisJMHgwMDAwMDAwMCwgLyogU1hfQUxQSEFfVEVTVF9DT05UUk9MICovCisJMHgwMDAwMDAwMCwgLyogQ0JfQkxFTkRfUkVEICovCiAJMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMGUsCiAJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCisJMHhjMDAzNjkwMCwKKwkweDAwMDAwMTBjLAorCTB4MDAwMDAwMDAsIC8qIERCX1NURU5DSUxSRUZNQVNLICovCisJMHgwMDAwMDAwMCwgLyogREJfU1RFTkNJTFJFRk1BU0tfQkYgKi8KKwkweDAwMDAwMDAwLCAvKiBTWF9BTFBIQV9SRUYgKi8KKwogCTB4YzAwNDY5MDAsCi0JMHgwMDAwMDEwNSwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4YzAwNDY5MDAsCi0JMHgwMDAwMDMwYywKKwkweDAwMDAwMzBjLCAvKiBDQl9DTFJDTVBfQ05UTCAqLwogCTB4MDEwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDhlLAotCTB4MDAwMDAwMGYsCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAwODAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX1dJTkRPV19PRkZTRVQgKi8KKworCTB4YzAwYTY5MDAsCiAJMHgwMDAwMDA4MywKLQkweDAwMDBmZmZmLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NSwKKwkweDAwMDBmZmZmLCAvKiBQQV9TQ19DTElQX1JFQ1RfUlVMRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX0NMSVBSRUNUXzBfVEwgKi8KIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NiwKIAkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4NywKIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4OCwKIAkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4OSwKIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4YSwKIAkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4YiwKIAkweDIwMDAyMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA4YywKLQkweGFhYWFhYWFhLAotCTB4YzAwMTY5MDAsCisJMHhhYWFhYWFhYSwgLyogUEFfU0NfRURHRVJVTEUgKi8KKworCTB4YzA0MDY5MDAsCiAJMHgwMDAwMDA5NCwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5NSwKKwkweDgwMDAwMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzBfVEwgKi8KKwkweDIwMDAyMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzBfQlIgKi8KKwkweDgwMDAwMDAwLCAvKiBQQV9TQ19WUE9SVF9TQ0lTU09SXzFfVEwgKi8KIAkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBiNCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX1ZQT1JUX1pNSU5fMCAqLworCTB4M2Y4MDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5NiwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5NywKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBiNiwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDk4LAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDk5LAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGI4LAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwOWEsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwOWIsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwYmEsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5YywKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDA5ZCwKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBiYywKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDllLAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDlmLAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGJlLAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTAsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTEsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwYzAsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhMiwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhMywKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBjMiwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGE0LAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGE1LAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGM0LAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTYsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYTcsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwYzYsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhOCwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhOSwKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBjOCwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGFhLAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGFiLAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGNhLAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYWMsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYWQsCi0JMHgyMDAwMjAwMCwKLQkweGMwMDI2OTAwLAotCTB4MDAwMDAwY2MsCiAJMHgwMDAwMDAwMCwKIAkweDNmODAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhZSwKLQkweDgwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDBhZiwKLQkweDIwMDAyMDAwLAotCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBjZSwKIAkweDAwMDAwMDAwLAogCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGIwLAotCTB4ODAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMGIxLAotCTB4MjAwMDIwMDAsCi0JMHhjMDAyNjkwMCwKLQkweDAwMDAwMGQwLAogCTB4MDAwMDAwMDAsCiAJMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYjIsCi0JMHg4MDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAwYjMsCi0JMHgyMDAwMjAwMCwKKwogCTB4YzAwMjY5MDAsCi0JMHgwMDAwMDBkMiwKLQkweDAwMDAwMDAwLAotCTB4M2Y4MDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjkzLAotCTB4MDA1MTQwMDAsCi0JMHhjMDAxNjkwMCwKKwkweDAwMDAwMjkyLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX01QQVNTX1BTX0NOVEwgKi8KKwkweDAwNTE0MDAwLCAvKiBQQV9TQ19NT0RFX0NOVEwgKi8KKworCTB4YzAwOTY5MDAsCiAJMHgwMDAwMDMwMCwKKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19MSU5FX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19BQV9DT05GSUcgKi8KKwkweDAwMDAwMDJkLCAvKiBQQV9TVV9WVFhfQ05UTCAqLworCTB4M2Y4MDAwMDAsIC8qIFBBX0NMX0dCX1ZFUlRfQ0xJUF9BREogKi8KKwkweDNmODAwMDAwLAorCTB4M2Y4MDAwMDAsCisJMHgzZjgwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19TQU1QTEVfTE9DU19NQ1RYICovCiAJMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzMDEsCi0JMHgwMDAwMDAwMCwKKwogCTB4YzAwMTY5MDAsCiAJMHgwMDAwMDMxMiwKLQkweGZmZmZmZmZmLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDMwNywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDMwOCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4MywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI5MiwKLQkweDAwMDAwMDAwLAorCTB4ZmZmZmZmZmYsIC8qIFBBX1NDX0FBX01BU0sgKi8KKwogCTB4YzAwNjY5MDAsCi0JMHgwMDAwMDEwZiwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDYsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDcsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDgsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDQ2OTAwLAotCTB4MDAwMDAzMDMsCi0JMHgzZjgwMDAwMCwKLQkweDNmODAwMDAwLAotCTB4M2Y4MDAwMDAsCi0JMHgzZjgwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyMDUsCi0JMHgwMDAwMDAwNCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyODAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyODEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAogCTB4MDAwMDAzN2UsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODIsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODAsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODMsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzODEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyODIsCi0JMHgwMDAwMDAwOCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzMDIsCi0JMHgwMDAwMDAyZCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAzN2YsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxYjIsCi0JMHgwMDAwMDAwMSwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0RCX0ZNVF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogUEFfU1VfUE9MWV9PRkZTRVRfQ0xBTVAgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0xZX09GRlNFVF9GUk9OVF9TQ0FMRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0ZST05UX09GRlNFVCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0JBQ0tfU0NBTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0xZX09GRlNFVF9CQUNLX09GRlNFVCAqLworCisJMHhjMDA0NjkwMCwKIAkweDAwMDAwMWI2LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI3LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI4LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI5LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogU1BJX0lOUFVUX1ogKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0ZVTkNfU0NBTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0ZVTkNfQklBUyAqLworCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMjI1LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogU1FfUEdNX1NUQVJUX0ZTICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyMjksCi0JMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBTUV9QR01fUkVTT1VSQ0VTX0ZTICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyMzcsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDAsCi0JMHgwMDAwMDgwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDEsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAxMDIsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFNRX1BHTV9DRl9PRkZTRVRfRlMgKi8KKworCTB4YzAwMjY5MDAsCiAJMHgwMDAwMDJhOCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDJhOSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDEwMywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI5MCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NiwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4NywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4OCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4OSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4YSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4YiwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4YywKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4ZCwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4ZSwKLQkweDAwMDAwMDAwLAotCTB4YzAwMTY5MDAsCi0JMHgwMDAwMDI4ZiwKLQkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIC8qIFZHVF9JTlNUQU5DRV9TVEVQX1JBVEVfMCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9JTlNUQU5DRV9TVEVQX1JBVEVfMSAqLworCisJMHhjMDExNjkwMCwKKwkweDAwMDAwMjgwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPSU5UX1NJWkUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0lOVF9NSU5NQVggKi8KKwkweDAwMDAwMDA4LCAvKiBQQV9TVV9MSU5FX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19MSU5FX1NUSVBQTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfT1VUUFVUX1BBVEhfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9IT1NfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9IT1NfTUFYX1RFU1NfTEVWRUwgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfSE9TX01JTl9URVNTX0xFVkVMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0hPU19SRVVTRV9ERVBUSCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9HUk9VUF9QUklNX1RZUEUgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfR1JPVVBfRklSU1RfREVDUiAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9HUk9VUF9ERUNSICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0dST1VQX1ZFQ1RfMF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0dST1VQX1ZFQ1RfMV9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogVkdUX0dST1VQX1ZFQ1RfMF9GTVRfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9HUk9VUF9WRUNUXzFfRk1UX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfR1NfTU9ERSAqLworCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMmExLAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogVkdUX1BSSU1JVElWRUlEX0VOICovCisKIAkweGMwMDE2OTAwLAogCTB4MDAwMDAyYTUsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAorCTB4MDAwMDAwMDAsIC8qIFZHVF9NVUxUSV9QUklNX0lEX1JFU0VUX0VOICovCisKKwkweGMwMDM2OTAwLAogCTB4MDAwMDAyYWMsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyYWQsCi0JMHgwMDAwMDAwMCwKLQkweGMwMDE2OTAwLAotCTB4MDAwMDAyYWUsCi0JMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAvKiBWR1RfU1RSTU9VVF9FTiAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9SRVVTRV9PRkYgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfVlRYX0NOVF9FTiAqLworCiAJMHhjMDAxNjkwMCwKIAkweDAwMDAwMmM4LAotCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogVkdUX1NUUk1PVVRfQlVGRkVSX0VOICovCisKKwkweGMwMDc2OTAwLAorCTB4MDAwMDAyMDIsCisJMHgwMGNjMDAwMCwgLyogQ0JfQ09MT1JfQ09OVFJPTCAqLworCTB4MDAwMDAyMTAsIC8qIERCX1NIQURFUl9DTlRMICovCisJMHgwMDAxMDAwMCwgLyogUEFfQ0xfQ0xJUF9DTlRMICovCisJMHgwMDAwMDI0NCwgLyogUEFfU1VfU0NfTU9ERV9DTlRMICovCisJMHgwMDAwMDEwMCwgLyogUEFfQ0xfVlRFX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9DTF9WU19PVVRfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX0NMX05BTklORl9DTlRMICovCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAwOGUsCisJMHgwMDAwMDAwZiwgLyogQ0JfVEFSR0VUX01BU0sgKi8KKwkweDAwMDAwMDBmLCAvKiBDQl9TSEFERVJfTUFTSyAqLworCiAJMHhjMDAxNjkwMCwKLQkweDAwMDAwMjA2LAotCTB4MDAwMDAxMDAsCisJMHgwMDAwMDFlOCwKKwkweDAwMDAwMDAxLCAvKiBDQl9TSEFERVJfQ09OVFJPTCAqLworCiAJMHhjMDAxNjkwMCwKLQkweDAwMDAwMjA0LAotCTB4MDAwMTAwMDAsCi0JMHhjMDAzNmUwMCwKKwkweDAwMDAwMTg1LAorCTB4MDAwMDAwMDAsIC8qIFNQSV9WU19PVVRfSURfMCAqLworCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMTkxLAorCTB4MDAwMDBiMDAsIC8qIFNQSV9QU19JTlBVVF9DTlRMXzAgKi8KKworCTB4YzAwNTY5MDAsCisJMHgwMDAwMDFiMSwKKwkweDAwMDAwMDAwLCAvKiBTUElfVlNfT1VUX0NPTkZJRyAqLworCTB4MDAwMDAwMDEsIC8qIFNQSV9USFJFQURfR1JPVVBJTkcgKi8KKwkweDAwMDAwMDAxLCAvKiBTUElfUFNfSU5fQ09OVFJPTF8wICovCisJMHgwMDAwMDAwMCwgLyogU1BJX1BTX0lOX0NPTlRST0xfMSAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9JTlRFUlBfQ09OVFJPTF8wICovCisKKwkweGMwMDM2ZTAwLCAvKiBTRVRfU0FNUExFUiAqLwogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAxMiwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMDhmLAotCTB4MDAwMDAwMGYsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWU4LAotCTB4MDAwMDAwMDEsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjAyLAotCTB4MDBjYzAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjA1LAotCTB4MDAwMDAyNDQsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMjAzLAotCTB4MDAwMDAyMTAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWIxLAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMTg1LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWIzLAotCTB4MDAwMDAwMDEsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI0LAotCTB4MDAwMDAwMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMTkxLAotCTB4MDAwMDBiMDAsCi0JMHhjMDAxNjkwMCwKLQkweDAwMDAwMWI1LAotCTB4MDAwMDAwMDAsCiB9OwogCiAvKiBzYW1lIGZvciByNnh4L3I3eHggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKaW5kZXggMTQ0YzMyZC4uYzNlYTIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqICAgICAgICAgIEFsZXggRGV1Y2hlcgogICogICAgICAgICAgSmVyb21lIEdsaXNzZQogICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInI2MDBkLmgiCkBAIC0xNjYsNyArMTY3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHI2MDBfY3NfdHJhY2tfdmFsaWRhdGVfY2Ioc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBpKQogewogCXN0cnVjdCByNjAwX2NzX3RyYWNrICp0cmFjayA9IHAtPnRyYWNrOwotCXUzMiBicGUgPSAwLCBwaXRjaCwgc2xpY2VfdGlsZV9tYXgsIHNpemUsIHRtcCwgaGVpZ2h0OworCXUzMiBicGUgPSAwLCBwaXRjaCwgc2xpY2VfdGlsZV9tYXgsIHNpemUsIHRtcCwgaGVpZ2h0LCBwaXRjaF9hbGlnbjsKIAl2b2xhdGlsZSB1MzIgKmliID0gcC0+aWItPnB0cjsKIAogCWlmIChHXzAyODBBMF9USUxFX01PREUodHJhY2stPmNiX2NvbG9yX2luZm9baV0pKSB7CkBAIC0xODAsNTYgKzE4MSw1NyBAQAogCQkJaSwgdHJhY2stPmNiX2NvbG9yX2luZm9baV0pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcGl0Y2ggPSAoR18wMjgwNjBfUElUQ0hfVElMRV9NQVgodHJhY2stPmNiX2NvbG9yX3NpemVbaV0pICsgMSkgPDwgMzsKKwkvKiBwaXRjaCBpcyB0aGUgbnVtYmVyIG9mIDh4OCB0aWxlcyBwZXIgcm93ICovCisJcGl0Y2ggPSBHXzAyODA2MF9QSVRDSF9USUxFX01BWCh0cmFjay0+Y2JfY29sb3Jfc2l6ZVtpXSkgKyAxOwogCXNsaWNlX3RpbGVfbWF4ID0gR18wMjgwNjBfU0xJQ0VfVElMRV9NQVgodHJhY2stPmNiX2NvbG9yX3NpemVbaV0pICsgMTsKLQlpZiAoIXBpdGNoKSB7Ci0JCWRldl93YXJuKHAtPmRldiwgIiVzOiVkIGNiIHBpdGNoICglZCkgZm9yICVkIGludmFsaWQgKDB4JTA4WClcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIHBpdGNoLCBpLCB0cmFjay0+Y2JfY29sb3Jfc2l6ZVtpXSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQloZWlnaHQgPSBzaXplIC8gKHBpdGNoICogYnBlKTsKKwloZWlnaHQgPSBzaXplIC8gKHBpdGNoICogOCAqIGJwZSk7CiAJaWYgKGhlaWdodCA+IDgxOTIpCiAJCWhlaWdodCA9IDgxOTI7CisJaWYgKGhlaWdodCA+IDcpCisJCWhlaWdodCAmPSB+MHg3OwogCXN3aXRjaCAoR18wMjgwQTBfQVJSQVlfTU9ERSh0cmFjay0+Y2JfY29sb3JfaW5mb1tpXSkpIHsKIAljYXNlIFZfMDI4MEEwX0FSUkFZX0xJTkVBUl9HRU5FUkFMOgorCQkvKiB0ZWNobmljYWxseSBoZWlnaHQgJiAweDcgKi8KKwkJYnJlYWs7CiAJY2FzZSBWXzAyODBBMF9BUlJBWV9MSU5FQVJfQUxJR05FRDoKLQkJaWYgKHBpdGNoICYgMHgzZikgewotCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgY2IgcGl0Y2ggKCVkIHggJWQgPSAlZCkgaW52YWxpZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBpdGNoLCBicGUsIHBpdGNoICogYnBlKTsKKwkJcGl0Y2hfYWxpZ24gPSBtYXgoKHUzMik2NCwgKHUzMikodHJhY2stPmdyb3VwX3NpemUgLyBicGUpKSAvIDg7CisJCWlmICghSVNfQUxJR05FRChwaXRjaCwgcGl0Y2hfYWxpZ24pKSB7CisJCQlkZXZfd2FybihwLT5kZXYsICIlczolZCBjYiBwaXRjaCAoJWQpIGludmFsaWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgcGl0Y2gpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKChwaXRjaCAqIGJwZSkgJiAodHJhY2stPmdyb3VwX3NpemUgLSAxKSkgewotCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgY2IgcGl0Y2ggKCVkKSBpbnZhbGlkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcGl0Y2gpOworCQlpZiAoIUlTX0FMSUdORUQoaGVpZ2h0LCA4KSkgeworCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgY2IgaGVpZ2h0ICglZCkgaW52YWxpZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBoZWlnaHQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBWXzAyODBBMF9BUlJBWV8xRF9USUxFRF9USElOMToKLQkJaWYgKChwaXRjaCAqIDggKiBicGUgKiB0cmFjay0+bnNhbXBsZXMpICYgKHRyYWNrLT5ncm91cF9zaXplIC0gMSkpIHsKKwkJcGl0Y2hfYWxpZ24gPSBtYXgoKHUzMik4LCAodTMyKSh0cmFjay0+Z3JvdXBfc2l6ZSAvICg4ICogYnBlICogdHJhY2stPm5zYW1wbGVzKSkpIC8gODsKKwkJaWYgKCFJU19BTElHTkVEKHBpdGNoLCBwaXRjaF9hbGlnbikpIHsKIAkJCWRldl93YXJuKHAtPmRldiwgIiVzOiVkIGNiIHBpdGNoICglZCkgaW52YWxpZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBpdGNoKTsKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBwaXRjaCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQloZWlnaHQgJj0gfjB4NzsKLQkJaWYgKCFoZWlnaHQpCi0JCQloZWlnaHQgPSA4OworCQlpZiAoIUlTX0FMSUdORUQoaGVpZ2h0LCA4KSkgeworCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgY2IgaGVpZ2h0ICglZCkgaW52YWxpZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBoZWlnaHQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBWXzAyODBBMF9BUlJBWV8yRF9USUxFRF9USElOMToKLQkJaWYgKHBpdGNoICYgKCg4ICogdHJhY2stPm5iYW5rcykgLSAxKSkgeworCQlwaXRjaF9hbGlnbiA9IG1heCgodTMyKXRyYWNrLT5uYmFua3MsCisJCQkJICAodTMyKSgoKHRyYWNrLT5ncm91cF9zaXplIC8gOCkgLyAoYnBlICogdHJhY2stPm5zYW1wbGVzKSkgKiB0cmFjay0+bmJhbmtzKSk7CisJCWlmICghSVNfQUxJR05FRChwaXRjaCwgcGl0Y2hfYWxpZ24pKSB7CiAJCQlkZXZfd2FybihwLT5kZXYsICIlczolZCBjYiBwaXRjaCAoJWQpIGludmFsaWRcbiIsCiAJCQkJX19mdW5jX18sIF9fTElORV9fLCBwaXRjaCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQl0bXAgPSBwaXRjaCAqIDggKiBicGUgKiB0cmFjay0+bnNhbXBsZXM7Ci0JCXRtcCA9IHRtcCAvIHRyYWNrLT5uYmFua3M7Ci0JCWlmICh0bXAgJiAodHJhY2stPmdyb3VwX3NpemUgLSAxKSkgewotCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgY2IgcGl0Y2ggKCVkKSBpbnZhbGlkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcGl0Y2gpOworCQlpZiAoIUlTX0FMSUdORUQoKGhlaWdodCAvIDgpLCB0cmFjay0+bmJhbmtzKSkgeworCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgY2IgaGVpZ2h0ICglZCkgaW52YWxpZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBoZWlnaHQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaGVpZ2h0ICY9IH4oKDE2ICogdHJhY2stPm5waXBlcykgLSAxKTsKLQkJaWYgKCFoZWlnaHQpCi0JCQloZWlnaHQgPSAxNiAqIHRyYWNrLT5ucGlwZXM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl93YXJuKHAtPmRldiwgIiVzIGludmFsaWQgdGlsaW5nICVkIGZvciAlZCAoMHglMDhYKVxuIiwgX19mdW5jX18sCkBAIC0yMzgsMTYgKzI0MCwyMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogY2hlY2sgb2Zmc2V0ICovCi0JdG1wID0gaGVpZ2h0ICogcGl0Y2g7CisJdG1wID0gaGVpZ2h0ICogcGl0Y2ggKiA4ICogYnBlOwogCWlmICgodG1wICsgdHJhY2stPmNiX2NvbG9yX2JvX29mZnNldFtpXSkgPiByYWRlb25fYm9fc2l6ZSh0cmFjay0+Y2JfY29sb3JfYm9baV0pKSB7Ci0JCWRldl93YXJuKHAtPmRldiwgIiVzIG9mZnNldFslZF0gJWQgdG8gYmlnXG4iLCBfX2Z1bmNfXywgaSwgdHJhY2stPmNiX2NvbG9yX2JvX29mZnNldFtpXSk7CisJCWRldl93YXJuKHAtPmRldiwgIiVzIG9mZnNldFslZF0gJWQgdG9vIGJpZ1xuIiwgX19mdW5jX18sIGksIHRyYWNrLT5jYl9jb2xvcl9ib19vZmZzZXRbaV0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFJU19BTElHTkVEKHRyYWNrLT5jYl9jb2xvcl9ib19vZmZzZXRbaV0sIHRyYWNrLT5ncm91cF9zaXplKSkgeworCQlkZXZfd2FybihwLT5kZXYsICIlcyBvZmZzZXRbJWRdICVkIG5vdCBhbGlnbmVkXG4iLCBfX2Z1bmNfXywgaSwgdHJhY2stPmNiX2NvbG9yX2JvX29mZnNldFtpXSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBsaW1pdCBtYXggdGlsZSAqLwotCXRtcCA9IChoZWlnaHQgKiBwaXRjaCkgPj4gNjsKKwl0bXAgPSAoaGVpZ2h0ICogcGl0Y2ggKiA4KSA+PiA2OwogCWlmICh0bXAgPCBzbGljZV90aWxlX21heCkKIAkJc2xpY2VfdGlsZV9tYXggPSB0bXA7Ci0JdG1wID0gU18wMjgwNjBfUElUQ0hfVElMRV9NQVgoKHBpdGNoID4+IDMpIC0gMSkgfAorCXRtcCA9IFNfMDI4MDYwX1BJVENIX1RJTEVfTUFYKHBpdGNoIC0gMSkgfAogCQlTXzAyODA2MF9TTElDRV9USUxFX01BWChzbGljZV90aWxlX21heCAtIDEpOwogCWliW3RyYWNrLT5jYl9jb2xvcl9zaXplX2lkeFtpXV0gPSB0bXA7CiAJcmV0dXJuIDA7CkBAIC0yODksNyArMjk1LDcgQEAKIAkvKiBDaGVjayBkZXB0aCBidWZmZXIgKi8KIAlpZiAoR18wMjg4MDBfU1RFTkNJTF9FTkFCTEUodHJhY2stPmRiX2RlcHRoX2NvbnRyb2wpIHx8CiAJCUdfMDI4ODAwX1pfRU5BQkxFKHRyYWNrLT5kYl9kZXB0aF9jb250cm9sKSkgewotCQl1MzIgbnZpZXdzLCBicGUsIG50aWxlczsKKwkJdTMyIG52aWV3cywgYnBlLCBudGlsZXMsIHBpdGNoLCBwaXRjaF9hbGlnbiwgaGVpZ2h0LCBzaXplOwogCQlpZiAodHJhY2stPmRiX2JvID09IE5VTEwpIHsKIAkJCWRldl93YXJuKHAtPmRldiwgInovc3RlbmNpbCB3aXRoIG5vIGRlcHRoIGJ1ZmZlclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMzMiw2ICszMzgsNTEgQEAKIAkJCX0KIAkJCWliW3RyYWNrLT5kYl9kZXB0aF9zaXplX2lkeF0gPSBTXzAyODAwMF9TTElDRV9USUxFX01BWCh0bXAgLSAxKSB8ICh0cmFjay0+ZGJfZGVwdGhfc2l6ZSAmIDB4M0ZGKTsKIAkJfSBlbHNlIHsKKwkJCXNpemUgPSByYWRlb25fYm9fc2l6ZSh0cmFjay0+ZGJfYm8pOworCQkJcGl0Y2ggPSBHXzAyODAwMF9QSVRDSF9USUxFX01BWCh0cmFjay0+ZGJfZGVwdGhfc2l6ZSkgKyAxOworCQkJaGVpZ2h0ID0gc2l6ZSAvIChwaXRjaCAqIDggKiBicGUpOworCQkJaGVpZ2h0ICY9IH4weDc7CisJCQlpZiAoIWhlaWdodCkKKwkJCQloZWlnaHQgPSA4OworCisJCQlzd2l0Y2ggKEdfMDI4MDEwX0FSUkFZX01PREUodHJhY2stPmRiX2RlcHRoX2luZm8pKSB7CisJCQljYXNlIFZfMDI4MDEwX0FSUkFZXzFEX1RJTEVEX1RISU4xOgorCQkJCXBpdGNoX2FsaWduID0gKG1heCgodTMyKTgsICh1MzIpKHRyYWNrLT5ncm91cF9zaXplIC8gKDggKiBicGUpKSkgLyA4KTsKKwkJCQlpZiAoIUlTX0FMSUdORUQocGl0Y2gsIHBpdGNoX2FsaWduKSkgeworCQkJCQlkZXZfd2FybihwLT5kZXYsICIlczolZCBkYiBwaXRjaCAoJWQpIGludmFsaWRcbiIsCisJCQkJCQkgX19mdW5jX18sIF9fTElORV9fLCBwaXRjaCk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlpZiAoIUlTX0FMSUdORUQoaGVpZ2h0LCA4KSkgeworCQkJCQlkZXZfd2FybihwLT5kZXYsICIlczolZCBkYiBoZWlnaHQgKCVkKSBpbnZhbGlkXG4iLAorCQkJCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgaGVpZ2h0KTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBWXzAyODAxMF9BUlJBWV8yRF9USUxFRF9USElOMToKKwkJCQlwaXRjaF9hbGlnbiA9IG1heCgodTMyKXRyYWNrLT5uYmFua3MsCisJCQkJCQkgICh1MzIpKCgodHJhY2stPmdyb3VwX3NpemUgLyA4KSAvIGJwZSkgKiB0cmFjay0+bmJhbmtzKSk7CisJCQkJaWYgKCFJU19BTElHTkVEKHBpdGNoLCBwaXRjaF9hbGlnbikpIHsKKwkJCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgZGIgcGl0Y2ggKCVkKSBpbnZhbGlkXG4iLAorCQkJCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgcGl0Y2gpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJaWYgKChoZWlnaHQgLyA4KSAmICh0cmFjay0+bmJhbmtzIC0gMSkpIHsKKwkJCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgZGIgaGVpZ2h0ICglZCkgaW52YWxpZFxuIiwKKwkJCQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGhlaWdodCk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXMgaW52YWxpZCB0aWxpbmcgJWQgKDB4JTA4WClcbiIsIF9fZnVuY19fLAorCQkJCQkgR18wMjgwMTBfQVJSQVlfTU9ERSh0cmFjay0+ZGJfZGVwdGhfaW5mbyksCisJCQkJCSB0cmFjay0+ZGJfZGVwdGhfaW5mbyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoIUlTX0FMSUdORUQodHJhY2stPmRiX29mZnNldCwgdHJhY2stPmdyb3VwX3NpemUpKSB7CisJCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXMgb2Zmc2V0WyVkXSAlZCBub3QgYWxpZ25lZFxuIiwgX19mdW5jX18sIGksIHRyYWNrLT5kYl9vZmZzZXQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCQkJbnRpbGVzID0gR18wMjgwMDBfU0xJQ0VfVElMRV9NQVgodHJhY2stPmRiX2RlcHRoX3NpemUpICsgMTsKIAkJCW52aWV3cyA9IEdfMDI4MDA0X1NMSUNFX01BWCh0cmFjay0+ZGJfZGVwdGhfdmlldykgKyAxOwogCQkJdG1wID0gbnRpbGVzICogYnBlICogNjQgKiBudmlld3M7CkBAIC03MjQsNyArNzc1LDI1IEBACiAJCXRyYWNrLT5kYl9kZXB0aF9jb250cm9sID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCQlicmVhazsKIAljYXNlIFJfMDI4MDEwX0RCX0RFUFRIX0lORk86Ci0JCXRyYWNrLT5kYl9kZXB0aF9pbmZvID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOworCQlpZiAocjYwMF9jc19wYWNrZXRfbmV4dF9pc19wa3QzX25vcChwKSkgeworCQkJciA9IHI2MDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKKwkJCWlmIChyKSB7CisJCQkJZGV2X3dhcm4ocC0+ZGV2LCAiYmFkIFNFVF9DT05URVhUX1JFRyAiCisJCQkJCSAiMHglMDRYXG4iLCByZWcpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJdHJhY2stPmRiX2RlcHRoX2luZm8gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisJCQlpYltpZHhdICY9IENfMDI4MDEwX0FSUkFZX01PREU7CisJCQl0cmFjay0+ZGJfZGVwdGhfaW5mbyAmPSBDXzAyODAxMF9BUlJBWV9NT0RFOworCQkJaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pIHsKKwkJCQlpYltpZHhdIHw9IFNfMDI4MDEwX0FSUkFZX01PREUoVl8wMjgwMTBfQVJSQVlfMkRfVElMRURfVEhJTjEpOworCQkJCXRyYWNrLT5kYl9kZXB0aF9pbmZvIHw9IFNfMDI4MDEwX0FSUkFZX01PREUoVl8wMjgwMTBfQVJSQVlfMkRfVElMRURfVEhJTjEpOworCQkJfSBlbHNlIHsKKwkJCQlpYltpZHhdIHw9IFNfMDI4MDEwX0FSUkFZX01PREUoVl8wMjgwMTBfQVJSQVlfMURfVElMRURfVEhJTjEpOworCQkJCXRyYWNrLT5kYl9kZXB0aF9pbmZvIHw9IFNfMDI4MDEwX0FSUkFZX01PREUoVl8wMjgwMTBfQVJSQVlfMURfVElMRURfVEhJTjEpOworCQkJfQorCQl9IGVsc2UKKwkJCXRyYWNrLT5kYl9kZXB0aF9pbmZvID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCQlicmVhazsKIAljYXNlIFJfMDI4MDA0X0RCX0RFUFRIX1ZJRVc6CiAJCXRyYWNrLT5kYl9kZXB0aF92aWV3ID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwpAQCAtNzU3LDggKzgyNiwyNSBAQAogCWNhc2UgUl8wMjgwQjRfQ0JfQ09MT1I1X0lORk86CiAJY2FzZSBSXzAyODBCOF9DQl9DT0xPUjZfSU5GTzoKIAljYXNlIFJfMDI4MEJDX0NCX0NPTE9SN19JTkZPOgotCQl0bXAgPSAocmVnIC0gUl8wMjgwQTBfQ0JfQ09MT1IwX0lORk8pIC8gNDsKLQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKKwkJaWYgKHI2MDBfY3NfcGFja2V0X25leHRfaXNfcGt0M19ub3AocCkpIHsKKwkJCXIgPSByNjAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CisJCQlpZiAocikgeworCQkJCWRldl9lcnIocC0+ZGV2LCAiYmFkIFNFVF9DT05URVhUX1JFRyAweCUwNFhcbiIsIHJlZyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQl0bXAgPSAocmVnIC0gUl8wMjgwQTBfQ0JfQ09MT1IwX0lORk8pIC8gNDsKKwkJCXRyYWNrLT5jYl9jb2xvcl9pbmZvW3RtcF0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisJCQlpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NQUNSTykgeworCQkJCWliW2lkeF0gfD0gU18wMjgwQTBfQVJSQVlfTU9ERShWXzAyODBBMF9BUlJBWV8yRF9USUxFRF9USElOMSk7CisJCQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSB8PSBTXzAyODBBMF9BUlJBWV9NT0RFKFZfMDI4MEEwX0FSUkFZXzJEX1RJTEVEX1RISU4xKTsKKwkJCX0gZWxzZSBpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykgeworCQkJCWliW2lkeF0gfD0gU18wMjgwQTBfQVJSQVlfTU9ERShWXzAyODBBMF9BUlJBWV8xRF9USUxFRF9USElOMSk7CisJCQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSB8PSBTXzAyODBBMF9BUlJBWV9NT0RFKFZfMDI4MEEwX0FSUkFZXzFEX1RJTEVEX1RISU4xKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRtcCA9IChyZWcgLSBSXzAyODBBMF9DQl9DT0xPUjBfSU5GTykgLyA0OworCQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKKwkJfQogCQlicmVhazsKIAljYXNlIFJfMDI4MDYwX0NCX0NPTE9SMF9TSVpFOgogCWNhc2UgUl8wMjgwNjRfQ0JfQ09MT1IxX1NJWkU6CkBAIC05NDYsOCArMTAzMiw5IEBACiB9CiAKIHN0YXRpYyB2b2lkIHI2MDBfdGV4dHVyZV9zaXplKHVuc2lnbmVkIG5mYWNlcywgdW5zaWduZWQgYmxldmVsLCB1bnNpZ25lZCBubGV2ZWxzLAotCQkJCXVuc2lnbmVkIHcwLCB1bnNpZ25lZCBoMCwgdW5zaWduZWQgZDAsIHVuc2lnbmVkIGJwZSwKLQkJCQl1bnNpZ25lZCAqbDBfc2l6ZSwgdW5zaWduZWQgKm1pcG1hcF9zaXplKQorCQkJICAgICAgdW5zaWduZWQgdzAsIHVuc2lnbmVkIGgwLCB1bnNpZ25lZCBkMCwgdW5zaWduZWQgYnBlLAorCQkJICAgICAgdW5zaWduZWQgcGl0Y2hfYWxpZ24sCisJCQkgICAgICB1bnNpZ25lZCAqbDBfc2l6ZSwgdW5zaWduZWQgKm1pcG1hcF9zaXplKQogewogCXVuc2lnbmVkIG9mZnNldCwgaSwgbGV2ZWwsIGZhY2U7CiAJdW5zaWduZWQgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHJvd3N0cmlkZSwgc2l6ZTsKQEAgLTk2MCwxMyArMTA0NywxMyBAQAogCQloZWlnaHQgPSBtaW5pZnkoaDAsIGkpOwogCQlkZXB0aCA9IG1pbmlmeShkMCwgaSk7CiAJCWZvcihmYWNlID0gMDsgZmFjZSA8IG5mYWNlczsgZmFjZSsrKSB7Ci0JCQlyb3dzdHJpZGUgPSAoKHdpZHRoICogYnBlKSArIDI1NSkgJiB+MjU1OworCQkJcm93c3RyaWRlID0gQUxJR04oKHdpZHRoICogYnBlKSwgcGl0Y2hfYWxpZ24pOwogCQkJc2l6ZSA9IGhlaWdodCAqIHJvd3N0cmlkZSAqIGRlcHRoOwogCQkJb2Zmc2V0ICs9IHNpemU7CiAJCQlvZmZzZXQgPSAob2Zmc2V0ICsgMHgxZikgJiB+MHgxZjsKIAkJfQogCX0KLQkqbDBfc2l6ZSA9ICgoKHcwICogYnBlKSArIDI1NSkgJiB+MjU1KSAqIGgwICogZDA7CisJKmwwX3NpemUgPSBBTElHTigodzAgKiBicGUpLCBwaXRjaF9hbGlnbikgKiBoMCAqIGQwOwogCSptaXBtYXBfc2l6ZSA9IG9mZnNldDsKIAlpZiAoIWJsZXZlbCkKIAkJKm1pcG1hcF9zaXplIC09ICpsMF9zaXplOwpAQCAtOTg1LDE2ICsxMDcyLDIzIEBACiAgKiB0aGUgdGV4dHVyZSBhbmQgbWlwbWFwIGJvIG9iamVjdCBhcmUgYmlnIGVub3VnaCB0byBjb3ZlciB0aGlzIHJlc291cmNlLgogICovCiBzdGF0aWMgaW5saW5lIGludCByNjAwX2NoZWNrX3RleHR1cmVfcmVzb3VyY2Uoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsICB1MzIgaWR4LAotCQkJCQkJc3RydWN0IHJhZGVvbl9ibyAqdGV4dHVyZSwKLQkJCQkJCXN0cnVjdCByYWRlb25fYm8gKm1pcG1hcCkKKwkJCQkJICAgICAgc3RydWN0IHJhZGVvbl9ibyAqdGV4dHVyZSwKKwkJCQkJICAgICAgc3RydWN0IHJhZGVvbl9ibyAqbWlwbWFwLAorCQkJCQkgICAgICB1MzIgdGlsaW5nX2ZsYWdzKQogeworCXN0cnVjdCByNjAwX2NzX3RyYWNrICp0cmFjayA9IHAtPnRyYWNrOwogCXUzMiBuZmFjZXMsIG5sZXZlbHMsIGJsZXZlbCwgdzAsIGgwLCBkMCwgYnBlID0gMDsKLQl1MzIgd29yZDAsIHdvcmQxLCBsMF9zaXplLCBtaXBtYXBfc2l6ZTsKKwl1MzIgd29yZDAsIHdvcmQxLCBsMF9zaXplLCBtaXBtYXBfc2l6ZSwgcGl0Y2gsIHBpdGNoX2FsaWduOwogCiAJLyogb24gbGVnYWN5IGtlcm5lbCB3ZSBkb24ndCBwZXJmb3JtIGFkdmFuY2VkIGNoZWNrICovCiAJaWYgKHAtPnJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CisKIAl3b3JkMCA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMCk7CisJaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pCisJCXdvcmQwIHw9IFNfMDM4MDAwX1RJTEVfTU9ERShWXzAzODAwMF9BUlJBWV8yRF9USUxFRF9USElOMSk7CisJZWxzZSBpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKKwkJd29yZDAgfD0gU18wMzgwMDBfVElMRV9NT0RFKFZfMDM4MDAwX0FSUkFZXzFEX1RJTEVEX1RISU4xKTsKIAl3b3JkMSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMSk7CiAJdzAgPSBHXzAzODAwMF9URVhfV0lEVEgod29yZDApICsgMTsKIAloMCA9IEdfMDM4MDA0X1RFWF9IRUlHSFQod29yZDEpICsgMTsKQEAgLTEwMjEsMTEgKzExMTUsNTUgQEAKIAkJCSBfX2Z1bmNfXywgX19MSU5FX18sIEdfMDM4MDA0X0RBVEFfRk9STUFUKHdvcmQxKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCXBpdGNoID0gR18wMzgwMDBfUElUQ0god29yZDApICsgMTsKKwlzd2l0Y2ggKEdfMDM4MDAwX1RJTEVfTU9ERSh3b3JkMCkpIHsKKwljYXNlIFZfMDM4MDAwX0FSUkFZX0xJTkVBUl9HRU5FUkFMOgorCQlwaXRjaF9hbGlnbiA9IDE7CisJCS8qIFhYWCBjaGVjayBoZWlnaHQgYWxpZ24gKi8KKwkJYnJlYWs7CisJY2FzZSBWXzAzODAwMF9BUlJBWV9MSU5FQVJfQUxJR05FRDoKKwkJcGl0Y2hfYWxpZ24gPSBtYXgoKHUzMik2NCwgKHUzMikodHJhY2stPmdyb3VwX3NpemUgLyBicGUpKSAvIDg7CisJCWlmICghSVNfQUxJR05FRChwaXRjaCwgcGl0Y2hfYWxpZ24pKSB7CisJCQlkZXZfd2FybihwLT5kZXYsICIlczolZCB0ZXggcGl0Y2ggKCVkKSBpbnZhbGlkXG4iLAorCQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIHBpdGNoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIFhYWCBjaGVjayBoZWlnaHQgYWxpZ24gKi8KKwkJYnJlYWs7CisJY2FzZSBWXzAzODAwMF9BUlJBWV8xRF9USUxFRF9USElOMToKKwkJcGl0Y2hfYWxpZ24gPSBtYXgoKHUzMik4LCAodTMyKSh0cmFjay0+Z3JvdXBfc2l6ZSAvICg4ICogYnBlKSkpIC8gODsKKwkJaWYgKCFJU19BTElHTkVEKHBpdGNoLCBwaXRjaF9hbGlnbikpIHsKKwkJCWRldl93YXJuKHAtPmRldiwgIiVzOiVkIHRleCBwaXRjaCAoJWQpIGludmFsaWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgcGl0Y2gpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogWFhYIGNoZWNrIGhlaWdodCBhbGlnbiAqLworCQlicmVhazsKKwljYXNlIFZfMDM4MDAwX0FSUkFZXzJEX1RJTEVEX1RISU4xOgorCQlwaXRjaF9hbGlnbiA9IG1heCgodTMyKXRyYWNrLT5uYmFua3MsCisJCQkJICAodTMyKSgoKHRyYWNrLT5ncm91cF9zaXplIC8gOCkgLyBicGUpICogdHJhY2stPm5iYW5rcykpOworCQlpZiAoIUlTX0FMSUdORUQocGl0Y2gsIHBpdGNoX2FsaWduKSkgeworCQkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgdGV4IHBpdGNoICglZCkgaW52YWxpZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBpdGNoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIFhYWCBjaGVjayBoZWlnaHQgYWxpZ24gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4ocC0+ZGV2LCAiJXMgaW52YWxpZCB0aWxpbmcgJWQgKDB4JTA4WClcbiIsIF9fZnVuY19fLAorCQkJIEdfMDM4MDAwX1RJTEVfTU9ERSh3b3JkMCksIHdvcmQwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFhYWCBjaGVjayBvZmZzZXQgYWxpZ24gKi8KKwogCXdvcmQwID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyA0KTsKIAl3b3JkMSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgNSk7CiAJYmxldmVsID0gR18wMzgwMTBfQkFTRV9MRVZFTCh3b3JkMCk7CiAJbmxldmVscyA9IEdfMDM4MDE0X0xBU1RfTEVWRUwod29yZDEpOwotCXI2MDBfdGV4dHVyZV9zaXplKG5mYWNlcywgYmxldmVsLCBubGV2ZWxzLCB3MCwgaDAsIGQwLCBicGUsICZsMF9zaXplLCAmbWlwbWFwX3NpemUpOworCXI2MDBfdGV4dHVyZV9zaXplKG5mYWNlcywgYmxldmVsLCBubGV2ZWxzLCB3MCwgaDAsIGQwLCBicGUsCisJCQkgIChwaXRjaF9hbGlnbiAqIGJwZSksCisJCQkgICZsMF9zaXplLCAmbWlwbWFwX3NpemUpOwogCS8qIHVzaW5nIGdldCBpYiB3aWxsIGdpdmUgdXMgdGhlIG9mZnNldCBpbnRvIHRoZSB0ZXh0dXJlIGJvICovCiAJd29yZDAgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDIpOwogCWlmICgobDBfc2l6ZSArIHdvcmQwKSA+IHJhZGVvbl9ib19zaXplKHRleHR1cmUpKSB7CkBAIC0xMjM5LDYgKzEzNzcsMTAgQEAKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWliW2lkeCsxKyhpKjcpKzJdICs9ICh1MzIpKChyZWxvYy0+bG9iai5ncHVfb2Zmc2V0ID4+IDgpICYgMHhmZmZmZmZmZik7CisJCQkJaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pCisJCQkJCWliW2lkeCsxKyhpKjcpKzBdIHw9IFNfMDM4MDAwX1RJTEVfTU9ERShWXzAzODAwMF9BUlJBWV8yRF9USUxFRF9USElOMSk7CisJCQkJZWxzZSBpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKKwkJCQkJaWJbaWR4KzErKGkqNykrMF0gfD0gU18wMzgwMDBfVElMRV9NT0RFKFZfMDM4MDAwX0FSUkFZXzFEX1RJTEVEX1RISU4xKTsKIAkJCQl0ZXh0dXJlID0gcmVsb2MtPnJvYmo7CiAJCQkJLyogdGV4IG1pcCBiYXNlICovCiAJCQkJciA9IHI2MDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKQEAgLTEyNDksNyArMTM5MSw3IEBACiAJCQkJaWJbaWR4KzErKGkqNykrM10gKz0gKHUzMikoKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQgPj4gOCkgJiAweGZmZmZmZmZmKTsKIAkJCQltaXBtYXAgPSByZWxvYy0+cm9iajsKIAkJCQlyID0gcjYwMF9jaGVja190ZXh0dXJlX3Jlc291cmNlKHAsICBpZHgrKGkqNykrMSwKLQkJCQkJCXRleHR1cmUsIG1pcG1hcCk7CisJCQkJCQkJCXRleHR1cmUsIG1pcG1hcCwgcmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzKTsKIAkJCQlpZiAocikKIAkJCQkJcmV0dXJuIHI7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2hkbWkuYwppbmRleCAyNmI0YmM5Li5lNmE1OGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfaGRtaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9oZG1pLmMKQEAgLTQzNSw3ICs0MzUsOCBAQAogCQl9CiAJfQogCi0JaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjAwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwKSB7CisJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjAwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwIHx8CisJICAgIHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNzQwKSB7CiAJCXJldHVybiBmcmVlX2Jsb2Nrc1swXSA/IFI2MDBfSERNSV9CTE9DSzEgOiAwOwogCX0gZWxzZSBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkgewogCQlpZiAoZnJlZV9ibG9ja3NbMF0pCkBAIC00NjYsNyArNDY3LDggQEAKIAkJaWYgKEFTSUNfSVNfRENFMzIocmRldikpCiAJCQlyYWRlb25fZW5jb2Rlci0+aGRtaV9jb25maWdfb2Zmc2V0ID0gZGlnLT5kaWdfZW5jb2RlciA/CiAJCQkJUjYwMF9IRE1JX0NPTkZJRzIgOiBSNjAwX0hETUlfQ09ORklHMTsKLQl9IGVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApIHsKKwl9IGVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDAgfHwgcmRldi0+ZmFtaWx5ID09IENISVBfUlM2MDAgfHwKKwkJICAgcmRldi0+ZmFtaWx5ID09IENISVBfUlM2OTAgfHwgcmRldi0+ZmFtaWx5ID09IENISVBfUlM3NDApIHsKIAkJcmFkZW9uX2VuY29kZXItPmhkbWlfb2Zmc2V0ID0gcjYwMF9oZG1pX2ZpbmRfZnJlZV9ibG9jayhkZXYpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAppbmRleCA1OWMxZjg3Li44NThhMTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCkBAIC0yMzksMTIgKzIzOSwxOCBAQAogI2RlZmluZQlHUkJNX1NPRlRfUkVTRVQJCQkJCTB4ODAyMAogI2RlZmluZQkJU09GVF9SRVNFVF9DUAkJCQkJKDE8PDApCiAKKyNkZWZpbmUJQ0dfVEhFUk1BTF9TVEFUVVMJCQkJMHg3RjQKKyNkZWZpbmUJCUFTSUNfVCh4KQkJCSAgICAgICAgKCh4KSA8PCAwKQorI2RlZmluZQkJQVNJQ19UX01BU0sJCQkgICAgICAgIDB4MUZGCisjZGVmaW5lCQlBU0lDX1RfU0hJRlQJCQkgICAgICAgIDAKKwogI2RlZmluZQlIRFBfSE9TVF9QQVRIX0NOVEwJCQkJMHgyQzAwCiAjZGVmaW5lCUhEUF9OT05TVVJGQUNFX0JBU0UJCQkJMHgyQzA0CiAjZGVmaW5lCUhEUF9OT05TVVJGQUNFX0lORk8JCQkJMHgyQzA4CiAjZGVmaW5lCUhEUF9OT05TVVJGQUNFX1NJWkUJCQkJMHgyQzBDCiAjZGVmaW5lIEhEUF9SRUdfQ09IRVJFTkNZX0ZMVVNIX0NOVEwJCQkweDU0QTAKICNkZWZpbmUJSERQX1RJTElOR19DT05GSUcJCQkJMHgyRjNDCisjZGVmaW5lIEhEUF9ERUJVRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkYzNAogCiAjZGVmaW5lIE1DX1ZNX0FHUF9UT1AJCQkJCTB4MjE4NAogI2RlZmluZSBNQ19WTV9BR1BfQk9UCQkJCQkweDIxODgKQEAgLTExNTQsNiArMTE2MCwxMCBAQAogI2RlZmluZSAgIFNfMDM4MDAwX1RJTEVfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGKSA8PCAzKQogI2RlZmluZSAgIEdfMDM4MDAwX1RJTEVfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHhGKQogI2RlZmluZSAgIENfMDM4MDAwX1RJTEVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGODcKKyNkZWZpbmUgICAgIFZfMDM4MDAwX0FSUkFZX0xJTkVBUl9HRU5FUkFMICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lICAgICBWXzAzODAwMF9BUlJBWV9MSU5FQVJfQUxJR05FRCAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSAgICAgVl8wMzgwMDBfQVJSQVlfMURfVElMRURfVEhJTjEgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgICAgIFZfMDM4MDAwX0FSUkFZXzJEX1RJTEVEX1RISU4xICAgICAgICAgICAgICAweDAwMDAwMDA0CiAjZGVmaW5lICAgU18wMzgwMDBfVElMRV9UWVBFKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDcpCiAjZGVmaW5lICAgR18wMzgwMDBfVElMRV9UWVBFKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gNykgJiAweDEpCiAjZGVmaW5lICAgQ18wMzgwMDBfVElMRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkY3RgpAQCAtMTM1Nyw2ICsxMzY3LDggQEAKICNkZWZpbmUgICBTXzAyODAxMF9BUlJBWV9NT0RFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMTUpCiAjZGVmaW5lICAgR18wMjgwMTBfQVJSQVlfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHhGKQogI2RlZmluZSAgIENfMDI4MDEwX0FSUkFZX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGODdGRkYKKyNkZWZpbmUgICAgIFZfMDI4MDEwX0FSUkFZXzFEX1RJTEVEX1RISU4xICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lICAgICBWXzAyODAxMF9BUlJBWV8yRF9USUxFRF9USElOMSAgICAgICAgICAgICAgMHgwMDAwMDAwNAogI2RlZmluZSAgIFNfMDI4MDEwX1RJTEVfU1VSRkFDRV9FTkFCTEUoeCkgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNSkKICNkZWZpbmUgICBHXzAyODAxMF9USUxFX1NVUkZBQ0VfRU5BQkxFKHgpICAgICAgICAgICAgICAoKCh4KSA+PiAyNSkgJiAweDEpCiAjZGVmaW5lICAgQ18wMjgwMTBfVElMRV9TVVJGQUNFX0VOQUJMRSAgICAgICAgICAgICAgICAgMHhGREZGRkZGRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKaW5kZXggMmY5NGRjNi4uM2NkMWM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCkBAIC0xNzgsNiArMTc4LDkgQEAKIHZvaWQgcmFkZW9uX2F0b21iaW9zX2dldF9wb3dlcl9tb2RlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MTYgbGV2ZWwpOwogdm9pZCByczY5MF9wbV9pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB1MzIgcnY2eHhfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHUzMiBydjc3MF9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdTMyIGV2ZXJncmVlbl9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qCiAgKiBGZW5jZXMuCkBAIC0yMzIsNyArMjM1LDcgQEAKICAqLwogc3RydWN0IHJhZGVvbl9tbWFuIHsKIAlzdHJ1Y3QgdHRtX2JvX2dsb2JhbF9yZWYgICAgICAgIGJvX2dsb2JhbF9yZWY7Ci0Jc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlCW1lbV9nbG9iYWxfcmVmOworCXN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZQltZW1fZ2xvYmFsX3JlZjsKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZQkJYmRldjsKIAlib29sCQkJCW1lbV9nbG9iYWxfcmVmZXJlbmNlZDsKIAlib29sCQkJCWluaXRpYWxpemVkOwpAQCAtNjcxLDYgKzY3NCwxMyBAQAogCWludCBkcG1zX29uX2NtX2lkeDsKIH07CiAKK2VudW0gcmFkZW9uX2ludF90aGVybWFsX3R5cGUgeworCVRIRVJNQUxfVFlQRV9OT05FLAorCVRIRVJNQUxfVFlQRV9SVjZYWCwKKwlUSEVSTUFMX1RZUEVfUlY3NzAsCisJVEhFUk1BTF9UWVBFX0VWRVJHUkVFTiwKK307CisKIHN0cnVjdCByYWRlb25fdm9sdGFnZSB7CiAJZW51bSByYWRlb25fdm9sdGFnZV90eXBlIHR5cGU7CiAJLyogZ3BpbyB2b2x0YWdlICovCkBAIC03NjYsNiArNzc2LDkgQEAKIAllbnVtIHJhZGVvbl9wbV9wcm9maWxlX3R5cGUgcHJvZmlsZTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4OwogCXN0cnVjdCByYWRlb25fcG1fcHJvZmlsZSBwcm9maWxlc1tQTV9QUk9GSUxFX01BWF07CisJLyogaW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyIG9uIHJ2Nnh4KyAqLworCWVudW0gcmFkZW9uX2ludF90aGVybWFsX3R5cGUgaW50X3RoZXJtYWxfdHlwZTsKKwlzdHJ1Y3QgZGV2aWNlCSAgICAgICAgKmludF9od21vbl9kZXY7CiB9OwogCiAKQEAgLTkwMiw2ICs5MTUsNyBAQAogCXVuc2lnbmVkCQl0aWxpbmdfbmJhbmtzOwogCXVuc2lnbmVkCQl0aWxpbmdfbnBpcGVzOwogCXVuc2lnbmVkCQl0aWxpbmdfZ3JvdXBfc2l6ZTsKKwl1bnNpZ25lZAkJdGlsZV9jb25maWc7CiAJc3RydWN0IHIxMDBfZ3B1X2xvY2t1cAlsb2NrdXA7CiB9OwogCkBAIC05MjYsNiArOTQwLDcgQEAKIAl1bnNpZ25lZAkJdGlsaW5nX25iYW5rczsKIAl1bnNpZ25lZAkJdGlsaW5nX25waXBlczsKIAl1bnNpZ25lZAkJdGlsaW5nX2dyb3VwX3NpemU7CisJdW5zaWduZWQJCXRpbGVfY29uZmlnOwogCXN0cnVjdCByMTAwX2dwdV9sb2NrdXAJbG9ja3VwOwogfTsKIApAQCAtOTUxLDYgKzk2Niw3IEBACiAJdW5zaWduZWQgdGlsaW5nX25iYW5rczsKIAl1bnNpZ25lZCB0aWxpbmdfbnBpcGVzOwogCXVuc2lnbmVkIHRpbGluZ19ncm91cF9zaXplOworCXVuc2lnbmVkIHRpbGVfY29uZmlnOwogfTsKIAogdW5pb24gcmFkZW9uX2FzaWNfY29uZmlnIHsKQEAgLTEwMzMsNiArMTA0OSw5IEBACiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBwY2llX3JlZ19tYXNrOwogCXJhZGVvbl9ycmVnX3QJCQlwY2llcF9ycmVnOwogCXJhZGVvbl93cmVnX3QJCQlwY2llcF93cmVnOworCS8qIGlvIHBvcnQgKi8KKwl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgICAgICpyaW9fbWVtOworCXJlc291cmNlX3NpemVfdAkJCXJpb19tZW1fc2l6ZTsKIAlzdHJ1Y3QgcmFkZW9uX2Nsb2NrICAgICAgICAgICAgIGNsb2NrOwogCXN0cnVjdCByYWRlb25fbWMJCW1jOwogCXN0cnVjdCByYWRlb25fZ2FydAkJZ2FydDsKQEAgLTEwNjksNiArMTA4OCw3IEBACiAJc3RydWN0IG11dGV4IHZyYW1fbXV0ZXg7CiAKIAkvKiBhdWRpbyBzdHVmZiAqLworCWJvb2wJCQlhdWRpb19lbmFibGVkOwogCXN0cnVjdCB0aW1lcl9saXN0CWF1ZGlvX3RpbWVyOwogCWludAkJCWF1ZGlvX2NoYW5uZWxzOwogCWludAkJCWF1ZGlvX3JhdGU7CkBAIC0xMDc4LDYgKzEwOTgsOCBAQAogCiAJYm9vbCBwb3dlcmVkX2Rvd247CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfbmI7CisJLyogb25seSBvbmUgdXNlcnNwYWNlIGNhbiB1c2UgSHlwZXJ6IGZlYXR1cmVzIGF0IGEgdGltZSAqLworCXN0cnVjdCBkcm1fZmlsZSAqaHlwZXJ6X2ZpbHA7CiB9OwogCiBpbnQgcmFkZW9uX2RldmljZV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LApAQCAtMTExNCw2ICsxMTM2LDI2IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHUzMiByMTAwX2lvX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcpCit7CisJaWYgKHJlZyA8IHJkZXYtPnJpb19tZW1fc2l6ZSkKKwkJcmV0dXJuIGlvcmVhZDMyKHJkZXYtPnJpb19tZW0gKyByZWcpOworCWVsc2UgeworCQlpb3dyaXRlMzIocmVnLCByZGV2LT5yaW9fbWVtICsgUkFERU9OX01NX0lOREVYKTsKKwkJcmV0dXJuIGlvcmVhZDMyKHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fREFUQSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcjEwMF9pb193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnLCB1MzIgdikKK3sKKwlpZiAocmVnIDwgcmRldi0+cmlvX21lbV9zaXplKQorCQlpb3dyaXRlMzIodiwgcmRldi0+cmlvX21lbSArIHJlZyk7CisJZWxzZSB7CisJCWlvd3JpdGUzMihyZWcsIHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fSU5ERVgpOworCQlpb3dyaXRlMzIodiwgcmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9EQVRBKTsKKwl9Cit9CisKIC8qCiAgKiBDYXN0IGhlbHBlcgogICovCkBAIC0xMTUyLDYgKzExOTQsOCBAQAogCQlXUkVHMzJfUExMKHJlZywgdG1wXyk7CQkJCVwKIAl9IHdoaWxlICgwKQogI2RlZmluZSBEUkVHMzJfU1lTKHNxZiwgcmRldiwgcmVnKSBzZXFfcHJpbnRmKChzcWYpLCAjcmVnICIgOiAweCUwOFhcbiIsIHIxMDBfbW1fcnJlZygocmRldiksIChyZWcpKSkKKyNkZWZpbmUgUlJFRzMyX0lPKHJlZykgcjEwMF9pb19ycmVnKHJkZXYsIChyZWcpKQorI2RlZmluZSBXUkVHMzJfSU8ocmVnLCB2KSByMTAwX2lvX3dyZWcocmRldiwgKHJlZyksICh2KSkKIAogLyoKICAqIEluZGlyZWN0IHJlZ2lzdGVycyBhY2Nlc3NvcgpAQCAtMTQxNSw2ICsxNDU5LDEzIEBACiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCBldmVyZ3JlZW5faXJxX3NldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKKy8qIHJhZGVvbl9hY3BpLmMgKi8gCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgCitleHRlcm4gaW50IHJhZGVvbl9hY3BpX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOyAKKyNlbHNlIAorc3RhdGljIGlubGluZSBpbnQgcmFkZW9uX2FjcGlfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikgeyByZXR1cm4gMDsgfSAKKyNlbmRpZiAKKwogLyogZXZlcmdyZWVuICovCiBzdHJ1Y3QgZXZlcmdyZWVuX21jX3NhdmUgewogCXUzMiB2Z2FfY29udHJvbFs2XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FjcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY2MzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYWNwaS5jCkBAIC0wLDAgKzEsNjcgQEAKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9zYXJlYS5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorI2luY2x1ZGUgInJhZGVvbi5oIgorCisjaW5jbHVkZSA8bGludXgvdmdhX3N3aXRjaGVyb28uaD4KKworLyogQ2FsbCB0aGUgQVRJRiBtZXRob2QKKyAqCisgKiBOb3RlOiBjdXJyZW50bHkgd2UgZGlzY2FyZCB0aGUgb3V0cHV0CisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2F0aWZfY2FsbChhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0IGF0aWZfYXJnX2VsZW1lbnRzWzJdOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGF0aWZfYXJnOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKworCWF0aWZfYXJnLmNvdW50ID0gMjsKKwlhdGlmX2FyZy5wb2ludGVyID0gJmF0aWZfYXJnX2VsZW1lbnRzWzBdOworCisJYXRpZl9hcmdfZWxlbWVudHNbMF0udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWF0aWZfYXJnX2VsZW1lbnRzWzBdLmludGVnZXIudmFsdWUgPSAwOworCWF0aWZfYXJnX2VsZW1lbnRzWzFdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlhdGlmX2FyZ19lbGVtZW50c1sxXS5pbnRlZ2VyLnZhbHVlID0gMDsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIkFUSUYiLCAmYXRpZl9hcmcsICZidWZmZXIpOworCisJLyogRmFpbCBvbmx5IGlmIGNhbGxpbmcgdGhlIG1ldGhvZCBmYWlscyBhbmQgQVRJRiBpcyBzdXBwb3J0ZWQgKi8KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmFpbGVkIHRvIGV2YWx1YXRlIEFUSUYgZ290ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiAwOworfQorCisvKiBDYWxsIGFsbCBBQ1BJIG1ldGhvZHMgaGVyZSAqLworaW50IHJhZGVvbl9hY3BpX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWludCByZXQ7CisKKwkvKiBObyBuZWVkIHRvIHByb2NlZWQgaWYgd2UncmUgc3VyZSB0aGF0IEFUSUYgaXMgbm90IHN1cHBvcnRlZCAqLworCWlmICghQVNJQ19JU19BVklWTyhyZGV2KSB8fCAhcmRldi0+YmlvcykKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgdGhlIGRldmljZSBoYW5kbGUgKi8KKwloYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJnJkZXYtPnBkZXYtPmRldik7CisKKwkvKiBDYWxsIHRoZSBBVElGIG1ldGhvZCAqLworCXJldCA9IHJhZGVvbl9hdGlmX2NhbGwoaGFuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAppbmRleCBjMGJiYWE2Li5hNWFmZjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCkBAIC0xMTMsNiArMTEzLDcgQEAKIGludCByMTAwX3diX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHIxMDBfY3BfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByMTAwX3ZnYV9yZW5kZXJfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHIxMDBfcmVzdG9yZV9zYW5pdHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHIxMDBfY3NfdHJhY2tfY2hlY2tfcGt0M19pbmR4X2J1ZmZlcihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQkJIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCiAJCQkJCSBzdHJ1Y3QgcmFkZW9uX2JvICpyb2JqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCmluZGV4IDEwNjczYWUuLjNiYzJiY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwpAQCAtNzIzLDcgKzcyMyw3IEBACiAJCX0KIAogCQlpZiAoaSA9PSBBVE9NX0RFVklDRV9DVl9JTkRFWCkgewotCQkJRFJNX0RFQlVHKCJTa2lwcGluZyBDb21wb25lbnQgVmlkZW9cbiIpOworCQkJRFJNX0RFQlVHX0tNUygiU2tpcHBpbmcgQ29tcG9uZW50IFZpZGVvXG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTEwMzIsMjEgKzEwMzIsMTggQEAKIAl1OCBmcmV2LCBjcmV2OwogCXUxNiBkYXRhX29mZnNldDsKIAorCS8qIHNpZGVwb3J0IGlzIEFNRCBvbmx5ICovCisJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjAwKQorCQlyZXR1cm4gZmFsc2U7CisKIAlpZiAoYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCiAJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKSB7CiAJCWlncF9pbmZvID0gKHVuaW9uIGlncF9pbmZvICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKIAkJCQkgICAgICBkYXRhX29mZnNldCk7CiAJCXN3aXRjaCAoY3JldikgewogCQljYXNlIDE6Ci0JCQkvKiBBTUQgSUdQUyAqLwotCQkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzY5MCkgfHwKLQkJCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfUlM3NDApKSB7Ci0JCQkJaWYgKGlncF9pbmZvLT5pbmZvLnVsQm9vdFVwTWVtb3J5Q2xvY2spCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaWdwX2luZm8tPmluZm8udWNNZW1vcnlUeXBlICYgMHhmMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9CisJCQlpZiAoaWdwX2luZm8tPmluZm8udWxCb290VXBNZW1vcnlDbG9jaykKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIDI6CiAJCQlpZiAoaWdwX2luZm8tPmluZm9fMi51Y01lbW9yeVR5cGUgJiAweDBmKQpAQCAtMTA5NSw3ICsxMDkyLDcgQEAKIAkJCSAgICAodG1kc19pbmZvLT5hc01pc2NJbmZvW2ldLgogCQkJICAgICB1Y1BMTF9Wb2x0YWdlU3dpbmcgJiAweGYpIDw8IDE2OwogCi0JCQlEUk1fREVCVUcoIlRNRFMgUExMIEZyb20gQVRPTUJJT1MgJXUgJXhcbiIsCisJCQlEUk1fREVCVUdfS01TKCJUTURTIFBMTCBGcm9tIEFUT01CSU9TICV1ICV4XG4iLAogCQkJCSAgdG1kcy0+dG1kc19wbGxbaV0uZnJlcSwKIAkJCQkgIHRtZHMtPnRtZHNfcGxsW2ldLnZhbHVlKTsKIApAQCAtMTc4OSwxNCArMTc4NiwyMiBAQAogCQkJfQogCiAJCQkvKiBhZGQgdGhlIGkyYyBidXMgZm9yIHRoZXJtYWwvZmFuIGNoaXAgKi8KLQkJCS8qIG5vIHN1cHBvcnQgZm9yIGludGVybmFsIGNvbnRyb2xsZXIgeWV0ICovCiAJCQlpZiAoY29udHJvbGxlci0+dWNUeXBlID4gMCkgewotCQkJCWlmICgoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfUlY2eHgpIHx8Ci0JCQkJICAgIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9SVjc3MCkgfHwKLQkJCQkgICAgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VWRVJHUkVFTikpIHsKKwkJCQlpZiAoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfUlY2eHgpIHsKIAkJCQkJRFJNX0lORk8oIkludGVybmFsIHRoZXJtYWwgY29udHJvbGxlciAlcyBmYW4gY29udHJvbFxuIiwKIAkJCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKIAkJCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7CisJCQkJCXJkZXYtPnBtLmludF90aGVybWFsX3R5cGUgPSBUSEVSTUFMX1RZUEVfUlY2WFg7CisJCQkJfSBlbHNlIGlmIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9SVjc3MCkgeworCQkJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAorCQkJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKKwkJCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9SVjc3MDsKKwkJCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VWRVJHUkVFTikgeworCQkJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAorCQkJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKKwkJCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9FVkVSR1JFRU47CiAJCQkJfSBlbHNlIGlmICgoY29udHJvbGxlci0+dWNUeXBlID09CiAJCQkJCSAgICBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VYVEVSTkFMX0dQSU8pIHx8CiAJCQkJCSAgIChjb250cm9sbGVyLT51Y1R5cGUgPT0KQEAgLTIxNzksMTEgKzIxODQsMTEgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpKSB7CiAJCWlmIChjb25uZWN0ZWQpIHsKLQkJCURSTV9ERUJVRygiVFYxIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJUVjEgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfM19zY3JhdGNoIHw9IEFUT01fUzNfVFYxX0FDVElWRTsKIAkJCWJpb3NfNl9zY3JhdGNoIHw9IEFUT01fUzZfQUNDX1JFUV9UVjE7CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIlRWMSBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiVFYxIGRpc2Nvbm5lY3RlZFxuIik7CiAJCQliaW9zXzBfc2NyYXRjaCAmPSB+QVRPTV9TMF9UVjFfTUFTSzsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX1RWMV9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCAmPSB+QVRPTV9TNl9BQ0NfUkVRX1RWMTsKQEAgLTIxOTIsMTEgKzIxOTcsMTEgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkgJiYKIAkgICAgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkNWIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJDViBjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18zX3NjcmF0Y2ggfD0gQVRPTV9TM19DVl9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCB8PSBBVE9NX1M2X0FDQ19SRVFfQ1Y7CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIkNWIGRpc2Nvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJDViBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggJj0gfkFUT01fUzBfQ1ZfTUFTSzsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0NWX0FDVElWRTsKIAkJCWJpb3NfNl9zY3JhdGNoICY9IH5BVE9NX1M2X0FDQ19SRVFfQ1Y7CkBAIC0yMjA1LDEyICsyMjEwLDEyIEBACiAJaWYgKChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCkgJiYKIAkgICAgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQpKSB7CiAJCWlmIChjb25uZWN0ZWQpIHsKLQkJCURSTV9ERUJVRygiTENEMSBjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiTENEMSBjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggfD0gQVRPTV9TMF9MQ0QxOwogCQkJYmlvc18zX3NjcmF0Y2ggfD0gQVRPTV9TM19MQ0QxX0FDVElWRTsKIAkJCWJpb3NfNl9zY3JhdGNoIHw9IEFUT01fUzZfQUNDX1JFUV9MQ0QxOwogCQl9IGVsc2UgewotCQkJRFJNX0RFQlVHKCJMQ0QxIGRpc2Nvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJMQ0QxIGRpc2Nvbm5lY3RlZFxuIik7CiAJCQliaW9zXzBfc2NyYXRjaCAmPSB+QVRPTV9TMF9MQ0QxOwogCQkJYmlvc18zX3NjcmF0Y2ggJj0gfkFUT01fUzNfTENEMV9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCAmPSB+QVRPTV9TNl9BQ0NfUkVRX0xDRDE7CkBAIC0yMjE5LDEyICsyMjI0LDEyIEBACiAJaWYgKChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkgJiYKIAkgICAgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpKSB7CiAJCWlmIChjb25uZWN0ZWQpIHsKLQkJCURSTV9ERUJVRygiQ1JUMSBjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiQ1JUMSBjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggfD0gQVRPTV9TMF9DUlQxX0NPTE9SOwogCQkJYmlvc18zX3NjcmF0Y2ggfD0gQVRPTV9TM19DUlQxX0FDVElWRTsKIAkJCWJpb3NfNl9zY3JhdGNoIHw9IEFUT01fUzZfQUNDX1JFUV9DUlQxOwogCQl9IGVsc2UgewotCQkJRFJNX0RFQlVHKCJDUlQxIGRpc2Nvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJDUlQxIGRpc2Nvbm5lY3RlZFxuIik7CiAJCQliaW9zXzBfc2NyYXRjaCAmPSB+QVRPTV9TMF9DUlQxX01BU0s7CiAJCQliaW9zXzNfc2NyYXRjaCAmPSB+QVRPTV9TM19DUlQxX0FDVElWRTsKIAkJCWJpb3NfNl9zY3JhdGNoICY9IH5BVE9NX1M2X0FDQ19SRVFfQ1JUMTsKQEAgLTIyMzMsMTIgKzIyMzgsMTIgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKSAmJgogCSAgICAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkpIHsKIAkJaWYgKGNvbm5lY3RlZCkgewotCQkJRFJNX0RFQlVHKCJDUlQyIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJDUlQyIGNvbm5lY3RlZFxuIik7CiAJCQliaW9zXzBfc2NyYXRjaCB8PSBBVE9NX1MwX0NSVDJfQ09MT1I7CiAJCQliaW9zXzNfc2NyYXRjaCB8PSBBVE9NX1MzX0NSVDJfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggfD0gQVRPTV9TNl9BQ0NfUkVRX0NSVDI7CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIkNSVDIgZGlzY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkNSVDIgZGlzY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfMF9zY3JhdGNoICY9IH5BVE9NX1MwX0NSVDJfTUFTSzsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0NSVDJfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggJj0gfkFUT01fUzZfQUNDX1JFUV9DUlQyOwpAQCAtMjI0NywxMiArMjI1MiwxMiBAQAogCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkRGUDEgY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkRGUDEgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfMF9zY3JhdGNoIHw9IEFUT01fUzBfREZQMTsKIAkJCWJpb3NfM19zY3JhdGNoIHw9IEFUT01fUzNfREZQMV9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCB8PSBBVE9NX1M2X0FDQ19SRVFfREZQMTsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiREZQMSBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQMSBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggJj0gfkFUT01fUzBfREZQMTsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0RGUDFfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggJj0gfkFUT01fUzZfQUNDX1JFUV9ERlAxOwpAQCAtMjI2MSwxMiArMjI2NiwxMiBAQAogCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9ERlAyX1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkRGUDIgY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkRGUDIgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfMF9zY3JhdGNoIHw9IEFUT01fUzBfREZQMjsKIAkJCWJpb3NfM19zY3JhdGNoIHw9IEFUT01fUzNfREZQMl9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCB8PSBBVE9NX1M2X0FDQ19SRVFfREZQMjsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiREZQMiBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQMiBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggJj0gfkFUT01fUzBfREZQMjsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0RGUDJfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggJj0gfkFUT01fUzZfQUNDX1JFUV9ERlAyOwpAQCAtMjI3NSwxMiArMjI4MCwxMiBAQAogCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9ERlAzX1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQM19TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkRGUDMgY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkRGUDMgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfMF9zY3JhdGNoIHw9IEFUT01fUzBfREZQMzsKIAkJCWJpb3NfM19zY3JhdGNoIHw9IEFUT01fUzNfREZQM19BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCB8PSBBVE9NX1M2X0FDQ19SRVFfREZQMzsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiREZQMyBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQMyBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggJj0gfkFUT01fUzBfREZQMzsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0RGUDNfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggJj0gfkFUT01fUzZfQUNDX1JFUV9ERlAzOwpAQCAtMjI4OSwxMiArMjI5NCwxMiBAQAogCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9ERlA0X1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQNF9TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkRGUDQgY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkRGUDQgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfMF9zY3JhdGNoIHw9IEFUT01fUzBfREZQNDsKIAkJCWJpb3NfM19zY3JhdGNoIHw9IEFUT01fUzNfREZQNF9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCB8PSBBVE9NX1M2X0FDQ19SRVFfREZQNDsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiREZQNCBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQNCBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggJj0gfkFUT01fUzBfREZQNDsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0RGUDRfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggJj0gfkFUT01fUzZfQUNDX1JFUV9ERlA0OwpAQCAtMjMwMywxMiArMjMwOCwxMiBAQAogCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9ERlA1X1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQNV9TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkRGUDUgY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkRGUDUgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfMF9zY3JhdGNoIHw9IEFUT01fUzBfREZQNTsKIAkJCWJpb3NfM19zY3JhdGNoIHw9IEFUT01fUzNfREZQNV9BQ1RJVkU7CiAJCQliaW9zXzZfc2NyYXRjaCB8PSBBVE9NX1M2X0FDQ19SRVFfREZQNTsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiREZQNSBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQNSBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc18wX3NjcmF0Y2ggJj0gfkFUT01fUzBfREZQNTsKIAkJCWJpb3NfM19zY3JhdGNoICY9IH5BVE9NX1MzX0RGUDVfQUNUSVZFOwogCQkJYmlvc182X3NjcmF0Y2ggJj0gfkFUT01fUzZfQUNDX1JFUV9ERlA1OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCmluZGV4IDJjOTIxMzcuLjY1NDc4N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJCXJldHVybiBmYWxzZTsKIAogCXJkZXYtPmJpb3MgPSBOVUxMOwotCXZyYW1fYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQocmRldi0+ZGRldiwgMCk7CisJdnJhbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHJkZXYtPnBkZXYsIDApOwogCWJpb3MgPSBpb3JlbWFwKHZyYW1fYmFzZSwgc2l6ZSk7CiAJaWYgKCFiaW9zKSB7CiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwppbmRleCAyNDE3ZDdiLi41ZTE0NzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCkBAIC02OTMsNiArNjkzLDEwIEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7CiAJdTE2IGlncF9pbmZvOwogCisJLyogc2lkZXBvcnQgaXMgQU1EIG9ubHkgKi8KKwlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUlM0MDApCisJCXJldHVybiBmYWxzZTsKKwogCWlncF9pbmZvID0gY29tYmlvc19nZXRfdGFibGVfb2Zmc2V0KGRldiwgQ09NQklPU19JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1RBQkxFKTsKIAogCWlmIChpZ3BfaW5mbykgewpAQCAtMTIwNSw3ICsxMjA5LDcgQEAKIAkJCQkgICAgUkJJT1MzMih0bWRzX2luZm8gKyBpICogMTAgKyAweDA4KTsKIAkJCQl0bWRzLT50bWRzX3BsbFtpXS5mcmVxID0KIAkJCQkgICAgUkJJT1MxNih0bWRzX2luZm8gKyBpICogMTAgKyAweDEwKTsKLQkJCQlEUk1fREVCVUcoIlRNRFMgUExMIEZyb20gQ09NQklPUyAldSAleFxuIiwKKwkJCQlEUk1fREVCVUdfS01TKCJUTURTIFBMTCBGcm9tIENPTUJJT1MgJXUgJXhcbiIsCiAJCQkJCSAgdG1kcy0+dG1kc19wbGxbaV0uZnJlcSwKIAkJCQkJICB0bWRzLT50bWRzX3BsbFtpXS52YWx1ZSk7CiAJCQl9CkBAIC0xMjIzLDcgKzEyMjcsNyBAQAogCQkJCQlzdHJpZGUgKz0gMTA7CiAJCQkJZWxzZQogCQkJCQlzdHJpZGUgKz0gNjsKLQkJCQlEUk1fREVCVUcoIlRNRFMgUExMIEZyb20gQ09NQklPUyAldSAleFxuIiwKKwkJCQlEUk1fREVCVUdfS01TKCJUTURTIFBMTCBGcm9tIENPTUJJT1MgJXUgJXhcbiIsCiAJCQkJCSAgdG1kcy0+dG1kc19wbGxbaV0uZnJlcSwKIAkJCQkJICB0bWRzLT50bWRzX3BsbFtpXS52YWx1ZSk7CiAJCQl9CkBAIC0yMjA4LDcgKzIyMTIsNyBAQAogCQl1aW50MTZfdCB0bWRzX2luZm8gPQogCQkgICAgY29tYmlvc19nZXRfdGFibGVfb2Zmc2V0KGRldiwgQ09NQklPU19ERlBfSU5GT19UQUJMRSk7CiAJCWlmICh0bWRzX2luZm8pIHsKLQkJCURSTV9ERUJVRygiRm91bmQgREZQIHRhYmxlLCBhc3N1bWluZyBEVkkgY29ubmVjdG9yXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkZvdW5kIERGUCB0YWJsZSwgYXNzdW1pbmcgRFZJIGNvbm5lY3RvclxuIik7CiAKIAkJCXJhZGVvbl9hZGRfbGVnYWN5X2VuY29kZXIoZGV2LAogCQkJCQkJICByYWRlb25fZ2V0X2VuY29kZXJfaWQoZGV2LApAQCAtMjIzNCw3ICsyMjM4LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXVpbnQxNl90IGNydF9pbmZvID0KIAkJCQljb21iaW9zX2dldF90YWJsZV9vZmZzZXQoZGV2LCBDT01CSU9TX0NSVF9JTkZPX1RBQkxFKTsKLQkJCURSTV9ERUJVRygiRm91bmQgQ1JUIHRhYmxlLCBhc3N1bWluZyBWR0EgY29ubmVjdG9yXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkZvdW5kIENSVCB0YWJsZSwgYXNzdW1pbmcgVkdBIGNvbm5lY3RvclxuIik7CiAJCQlpZiAoY3J0X2luZm8pIHsKIAkJCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9pZChkZXYsCkBAIC0yMjUxLDcgKzIyNTUsNyBAQAogCQkJCQkJCSAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1ZHQSwKIAkJCQkJCQkgICAgJmhwZCk7CiAJCQl9IGVsc2UgewotCQkJCURSTV9ERUJVRygiTm8gY29ubmVjdG9yIGluZm8gZm91bmRcbiIpOworCQkJCURSTV9ERUJVR19LTVMoIk5vIGNvbm5lY3RvciBpbmZvIGZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KQEAgLTIzNDAsNyArMjM0NCw3IEBACiAJCQkJCWRkY19pMmMudmFsaWQgPSBmYWxzZTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCURSTV9ERUJVRygiTENEIEREQyBJbmZvIFRhYmxlIGZvdW5kIVxuIik7CisJCQkJRFJNX0RFQlVHX0tNUygiTENEIEREQyBJbmZvIFRhYmxlIGZvdW5kIVxuIik7CiAJCQl9IGVsc2UKIAkJCQlkZGNfaTJjLnZhbGlkID0gZmFsc2U7CiAKQEAgLTI5NDEsOSArMjk0NSw4IEBACiAJCWlmIChyZXYgPCAzKSB7CiAJCQltZW1fY250bCA9IFJCSU9TMzIob2Zmc2V0ICsgMSk7CiAJCQltZW1fc2l6ZSA9IFJCSU9TMTYob2Zmc2V0ICsgNSk7Ci0JCQlpZiAoKChyZGV2LT5mbGFncyAmIFJBREVPTl9GQU1JTFlfTUFTSykgPCBDSElQX1IyMDApICYmCi0JCQkgICAgKChkZXYtPnBkZXYtPmRldmljZSAhPSAweDUxNWUpCi0JCQkgICAgICYmIChkZXYtPnBkZXYtPmRldmljZSAhPSAweDU5NjkpKSkKKwkJCWlmICgocmRldi0+ZmFtaWx5IDwgQ0hJUF9SMjAwKSAmJgorCQkJICAgICFBU0lDX0lTX1JONTAocmRldikpCiAJCQkJV1JFRzMyKFJBREVPTl9NRU1fQ05UTCwgbWVtX2NudGwpOwogCQl9CiAJfQpAQCAtMjk1NCwxMCArMjk1Nyw4IEBACiAJCWlmIChvZmZzZXQpIHsKIAkJCXJldiA9IFJCSU9TOChvZmZzZXQgLSAxKTsKIAkJCWlmIChyZXYgPCAxKSB7Ci0JCQkJaWYgKCgocmRldi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spIDwKLQkJCQkgICAgIENISVBfUjIwMCkKLQkJCQkgICAgJiYgKChkZXYtPnBkZXYtPmRldmljZSAhPSAweDUxNWUpCi0JCQkJCSYmIChkZXYtPnBkZXYtPmRldmljZSAhPSAweDU5NjkpKSkgeworCQkJCWlmICgocmRldi0+ZmFtaWx5IDwgQ0hJUF9SMjAwKQorCQkJCSAgICAmJiAhQVNJQ19JU19STjUwKHJkZXYpKSB7CiAJCQkJCWludCByYW0gPSAwOwogCQkJCQlpbnQgbWVtX2FkZHJfbWFwcGluZyA9IDA7CiAKQEAgLTMxMjEsMTQgKzMxMjIsMTQgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpKSB7CiAJCWlmIChjb25uZWN0ZWQpIHsKLQkJCURSTV9ERUJVRygiVFYxIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJUVjEgY29ubmVjdGVkXG4iKTsKIAkJCS8qIGZpeCBtZSAqLwogCQkJYmlvc180X3NjcmF0Y2ggfD0gUkFERU9OX1RWMV9BVFRBQ0hFRF9TVklERU87CiAJCQkvKnNhdmUtPmJpb3NfNF9zY3JhdGNoIHw9IFJBREVPTl9UVjFfQVRUQUNIRURfQ09NUDsgKi8KIAkJCWJpb3NfNV9zY3JhdGNoIHw9IFJBREVPTl9UVjFfT047CiAJCQliaW9zXzVfc2NyYXRjaCB8PSBSQURFT05fQUNDX1JFUV9UVjE7CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIlRWMSBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiVFYxIGRpc2Nvbm5lY3RlZFxuIik7CiAJCQliaW9zXzRfc2NyYXRjaCAmPSB+UkFERU9OX1RWMV9BVFRBQ0hFRF9NQVNLOwogCQkJYmlvc181X3NjcmF0Y2ggJj0gflJBREVPTl9UVjFfT047CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0FDQ19SRVFfVFYxOwpAQCAtMzEzNywxMiArMzEzOCwxMiBAQAogCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQpICYmCiAJICAgIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfTENEMV9TVVBQT1JUKSkgewogCQlpZiAoY29ubmVjdGVkKSB7Ci0JCQlEUk1fREVCVUcoIkxDRDEgY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkxDRDEgY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfNF9zY3JhdGNoIHw9IFJBREVPTl9MQ0QxX0FUVEFDSEVEOwogCQkJYmlvc181X3NjcmF0Y2ggfD0gUkFERU9OX0xDRDFfT047CiAJCQliaW9zXzVfc2NyYXRjaCB8PSBSQURFT05fQUNDX1JFUV9MQ0QxOwogCQl9IGVsc2UgewotCQkJRFJNX0RFQlVHKCJMQ0QxIGRpc2Nvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJMQ0QxIGRpc2Nvbm5lY3RlZFxuIik7CiAJCQliaW9zXzRfc2NyYXRjaCAmPSB+UkFERU9OX0xDRDFfQVRUQUNIRUQ7CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0xDRDFfT047CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0FDQ19SRVFfTENEMTsKQEAgLTMxNTEsMTIgKzMxNTIsMTIgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKSAmJgogCSAgICAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkpIHsKIAkJaWYgKGNvbm5lY3RlZCkgewotCQkJRFJNX0RFQlVHKCJDUlQxIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJDUlQxIGNvbm5lY3RlZFxuIik7CiAJCQliaW9zXzRfc2NyYXRjaCB8PSBSQURFT05fQ1JUMV9BVFRBQ0hFRF9DT0xPUjsKIAkJCWJpb3NfNV9zY3JhdGNoIHw9IFJBREVPTl9DUlQxX09OOwogCQkJYmlvc181X3NjcmF0Y2ggfD0gUkFERU9OX0FDQ19SRVFfQ1JUMTsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiQ1JUMSBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiQ1JUMSBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc180X3NjcmF0Y2ggJj0gflJBREVPTl9DUlQxX0FUVEFDSEVEX01BU0s7CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0NSVDFfT047CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0FDQ19SRVFfQ1JUMTsKQEAgLTMxNjUsMTIgKzMxNjYsMTIgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKSAmJgogCSAgICAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkpIHsKIAkJaWYgKGNvbm5lY3RlZCkgewotCQkJRFJNX0RFQlVHKCJDUlQyIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJDUlQyIGNvbm5lY3RlZFxuIik7CiAJCQliaW9zXzRfc2NyYXRjaCB8PSBSQURFT05fQ1JUMl9BVFRBQ0hFRF9DT0xPUjsKIAkJCWJpb3NfNV9zY3JhdGNoIHw9IFJBREVPTl9DUlQyX09OOwogCQkJYmlvc181X3NjcmF0Y2ggfD0gUkFERU9OX0FDQ19SRVFfQ1JUMjsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiQ1JUMiBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiQ1JUMiBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc180X3NjcmF0Y2ggJj0gflJBREVPTl9DUlQyX0FUVEFDSEVEX01BU0s7CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0NSVDJfT047CiAJCQliaW9zXzVfc2NyYXRjaCAmPSB+UkFERU9OX0FDQ19SRVFfQ1JUMjsKQEAgLTMxNzksMTIgKzMxODAsMTIgQEAKIAlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUKSAmJgogCSAgICAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCkpIHsKIAkJaWYgKGNvbm5lY3RlZCkgewotCQkJRFJNX0RFQlVHKCJERlAxIGNvbm5lY3RlZFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJERlAxIGNvbm5lY3RlZFxuIik7CiAJCQliaW9zXzRfc2NyYXRjaCB8PSBSQURFT05fREZQMV9BVFRBQ0hFRDsKIAkJCWJpb3NfNV9zY3JhdGNoIHw9IFJBREVPTl9ERlAxX09OOwogCQkJYmlvc181X3NjcmF0Y2ggfD0gUkFERU9OX0FDQ19SRVFfREZQMTsKIAkJfSBlbHNlIHsKLQkJCURSTV9ERUJVRygiREZQMSBkaXNjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQMSBkaXNjb25uZWN0ZWRcbiIpOwogCQkJYmlvc180X3NjcmF0Y2ggJj0gflJBREVPTl9ERlAxX0FUVEFDSEVEOwogCQkJYmlvc181X3NjcmF0Y2ggJj0gflJBREVPTl9ERlAxX09OOwogCQkJYmlvc181X3NjcmF0Y2ggJj0gflJBREVPTl9BQ0NfUkVRX0RGUDE7CkBAIC0zMTkzLDEyICszMTk0LDEyIEBACiAJaWYgKChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0RGUDJfU1VQUE9SVCkgJiYKIAkgICAgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9ERlAyX1NVUFBPUlQpKSB7CiAJCWlmIChjb25uZWN0ZWQpIHsKLQkJCURSTV9ERUJVRygiREZQMiBjb25uZWN0ZWRcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiREZQMiBjb25uZWN0ZWRcbiIpOwogCQkJYmlvc180X3NjcmF0Y2ggfD0gUkFERU9OX0RGUDJfQVRUQUNIRUQ7CiAJCQliaW9zXzVfc2NyYXRjaCB8PSBSQURFT05fREZQMl9PTjsKIAkJCWJpb3NfNV9zY3JhdGNoIHw9IFJBREVPTl9BQ0NfUkVRX0RGUDI7CiAJCX0gZWxzZSB7Ci0JCQlEUk1fREVCVUcoIkRGUDIgZGlzY29ubmVjdGVkXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkRGUDIgZGlzY29ubmVjdGVkXG4iKTsKIAkJCWJpb3NfNF9zY3JhdGNoICY9IH5SQURFT05fREZQMl9BVFRBQ0hFRDsKIAkJCWJpb3NfNV9zY3JhdGNoICY9IH5SQURFT05fREZQMl9PTjsKIAkJCWJpb3NfNV9zY3JhdGNoICY9IH5SQURFT05fQUNDX1JFUV9ERlAyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCmluZGV4IGFkY2NiYzIuLjIzOTVjODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCQltb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9QUkVGRVJSRUQgfCBEUk1fTU9ERV9UWVBFX0RSSVZFUjsKIAkJZHJtX21vZGVfc2V0X25hbWUobW9kZSk7CiAKLQkJRFJNX0RFQlVHKCJBZGRpbmcgbmF0aXZlIHBhbmVsIG1vZGUgJXNcbiIsIG1vZGUtPm5hbWUpOworCQlEUk1fREVCVUdfS01TKCJBZGRpbmcgbmF0aXZlIHBhbmVsIG1vZGUgJXNcbiIsIG1vZGUtPm5hbWUpOwogCX0gZWxzZSBpZiAobmF0aXZlX21vZGUtPmhkaXNwbGF5ICE9IDAgJiYKIAkJICAgbmF0aXZlX21vZGUtPnZkaXNwbGF5ICE9IDApIHsKIAkJLyogbWFjIGxhcHRvcHMgd2l0aG91dCBhbiBlZGlkICovCkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJICovCiAJCW1vZGUgPSBkcm1fY3Z0X21vZGUoZGV2LCBuYXRpdmVfbW9kZS0+aGRpc3BsYXksIG5hdGl2ZV9tb2RlLT52ZGlzcGxheSwgNjAsIHRydWUsIGZhbHNlLCBmYWxzZSk7CiAJCW1vZGUtPnR5cGUgPSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCB8IERSTV9NT0RFX1RZUEVfRFJJVkVSOwotCQlEUk1fREVCVUcoIkFkZGluZyBjdnQgYXBwcm94aW1hdGlvbiBvZiBuYXRpdmUgcGFuZWwgbW9kZSAlc1xuIiwgbW9kZS0+bmFtZSk7CisJCURSTV9ERUJVR19LTVMoIkFkZGluZyBjdnQgYXBwcm94aW1hdGlvbiBvZiBuYXRpdmUgcGFuZWwgbW9kZSAlc1xuIiwgbW9kZS0+bmFtZSk7CiAJfQogCXJldHVybiBtb2RlOwogfQpAQCAtMzEyLDYgKzMxMiwyMCBAQAogCQl9CiAJfQogCisJaWYgKHByb3BlcnR5ID09IHJkZXYtPm1vZGVfaW5mby51bmRlcnNjYW5fcHJvcGVydHkpIHsKKwkJLyogbmVlZCB0byBmaW5kIGRpZ2l0YWwgZW5jb2RlciBvbiBjb25uZWN0b3IgKi8KKwkJZW5jb2RlciA9IHJhZGVvbl9maW5kX2VuY29kZXIoY29ubmVjdG9yLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCQlpZiAoIWVuY29kZXIpCisJCQlyZXR1cm4gMDsKKworCQlyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCisJCWlmIChyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgIT0gdmFsKSB7CisJCQlyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgPSB2YWw7CisJCQlyYWRlb25fcHJvcGVydHlfY2hhbmdlX21vZGUoJnJhZGVvbl9lbmNvZGVyLT5iYXNlKTsKKwkJfQorCX0KKwogCWlmIChwcm9wZXJ0eSA9PSByZGV2LT5tb2RlX2luZm8udHZfc3RkX3Byb3BlcnR5KSB7CiAJCWVuY29kZXIgPSByYWRlb25fZmluZF9lbmNvZGVyKGNvbm5lY3RvciwgRFJNX01PREVfRU5DT0RFUl9UVkRBQyk7CiAJCWlmICghZW5jb2RlcikgewpAQCAtNTIyLDcgKzUzNiw3IEBACiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcjsKIAllbnVtIHJhZGVvbl9ybXhfdHlwZSBybXhfdHlwZTsKIAotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCWlmIChwcm9wZXJ0eSAhPSBkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSkKIAkJcmV0dXJuIDA7CiAKQEAgLTEwODIsNiArMTA5Niw4IEBACiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOworCQkvKiBubyBIUEQgb24gYW5hbG9nIGNvbm5lY3RvcnMgKi8KKwkJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQToKQEAgLTEwOTYsNiArMTExMiw4IEBACiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOworCQkvKiBubyBIUEQgb24gYW5hbG9nIGNvbm5lY3RvcnMgKi8KKwkJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgpAQCAtMTExNiw2ICsxMTM0LDEwIEBACiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8uY29oZXJlbnRfbW9kZV9wcm9wZXJ0eSwKIAkJCQkJICAgICAgMSk7CisJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCisJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX3Byb3BlcnR5LAorCQkJCQkJICAgICAgVU5ERVJTQ0FOX0FVVE8pOwogCQlpZiAoY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmRhY19sb2FkX2RldGVjdCA9IHRydWU7CiAJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKQEAgLTExNDEsNiArMTE2MywxMCBAQAogCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmNvaGVyZW50X21vZGVfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOworCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAorCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnVuZGVyc2Nhbl9wcm9wZXJ0eSwKKwkJCQkJCSAgICAgIFVOREVSU0NBTl9BVVRPKTsKIAkJc3VicGl4ZWxfb3JkZXIgPSBTdWJQaXhlbEhvcml6b250YWxSR0I7CiAJCWJyZWFrOwogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0OgpAQCAtMTE3Miw2ICsxMTk4LDEwIEBACiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8uY29oZXJlbnRfbW9kZV9wcm9wZXJ0eSwKIAkJCQkJICAgICAgMSk7CisJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCisJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX3Byb3BlcnR5LAorCQkJCQkJICAgICAgVU5ERVJTQ0FOX0FVVE8pOwogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU86CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlOgpAQCAtMTE4Niw2ICsxMjE2LDggQEAKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnR2X3N0ZF9wcm9wZXJ0eSwKIAkJCQkJCSAgICAgIHJhZGVvbl9hdG9tYmlvc19nZXRfdHZfaW5mbyhyZGV2KSk7CisJCQkvKiBubyBIUEQgb24gYW5hbG9nIGNvbm5lY3RvcnMgKi8KKwkJCXJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQgPSBSQURFT05fSFBEX05PTkU7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKQEAgLTEyMDksNyArMTI0MSw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChocGQtPmhwZCA9PSBSQURFT05fSFBEX05PTkUpIHsKKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCA9PSBSQURFT05fSFBEX05PTkUpIHsKIAkJaWYgKGkyY19idXMtPnZhbGlkKQogCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKIAl9IGVsc2UKQEAgLTEyNzYsNiArMTMwOCw4IEBACiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOworCQkvKiBubyBIUEQgb24gYW5hbG9nIGNvbm5lY3RvcnMgKi8KKwkJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQToKQEAgLTEyOTAsNiArMTMyNCw4IEBACiAJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOworCQkvKiBubyBIUEQgb24gYW5hbG9nIGNvbm5lY3RvcnMgKi8KKwkJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgpAQCAtMTMyOCw2ICsxMzY0LDggQEAKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnR2X3N0ZF9wcm9wZXJ0eSwKIAkJCQkJCSAgICAgIHJhZGVvbl9jb21iaW9zX2dldF90dl9pbmZvKHJkZXYpKTsKKwkJCS8qIG5vIEhQRCBvbiBhbmFsb2cgY29ubmVjdG9ycyAqLworCQkJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCA9IFJBREVPTl9IUERfTk9ORTsKIAkJfQogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgpAQCAtMTM0NSw3ICsxMzgzLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGhwZC0+aHBkID09IFJBREVPTl9IUERfTk9ORSkgeworCWlmIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkID09IFJBREVPTl9IUERfTk9ORSkgewogCQlpZiAoaTJjX2J1cy0+dmFsaWQpCiAJCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9DT05ORUNUOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMKaW5kZXggMmYwNDJhMy4uZWI2YjllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jCkBAIC0yMTIwLDggKzIxMjAsOCBAQAogCWVsc2UKIAkJZGV2X3ByaXYtPmZsYWdzIHw9IFJBREVPTl9JU19QQ0k7CiAKLQlyZXQgPSBkcm1fYWRkbWFwKGRldiwgZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDIpLAotCQkJIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMiksIF9EUk1fUkVHSVNURVJTLAorCXJldCA9IGRybV9hZGRtYXAoZGV2LCBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAyKSwKKwkJCSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMiksIF9EUk1fUkVHSVNURVJTLAogCQkJIF9EUk1fUkVBRF9PTkxZIHwgX0RSTV9EUklWRVIsICZkZXZfcHJpdi0+bW1pbyk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMjE5NCw5ICsyMTk0LDkgQEAKIAogCWRldl9wcml2LT5nYXJ0X2luZm8udGFibGVfc2l6ZSA9IFJBREVPTl9QQ0lHQVJUX1RBQkxFX1NJWkU7CiAKLQlkZXZfcHJpdi0+ZmJfYXBlcl9vZmZzZXQgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CisJZGV2X3ByaXYtPmZiX2FwZXJfb2Zmc2V0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCk7CiAJcmV0ID0gZHJtX2FkZG1hcChkZXYsIGRldl9wcml2LT5mYl9hcGVyX29mZnNldCwKLQkJCSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApLCBfRFJNX0ZSQU1FX0JVRkZFUiwKKwkJCSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCksIF9EUk1fRlJBTUVfQlVGRkVSLAogCQkJIF9EUk1fV1JJVEVfQ09NQklOSU5HLCAmbWFwKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCmluZGV4IGRkMjc5ZGEuLmE2NDgxMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCkBAIC00MTUsNiArNDE1LDIyIEBACiAJcmV0dXJuIHI7CiB9CiAKK3N0YXRpYyB2b2lkIGNhaWxfaW9yZWdfd3JpdGUoc3RydWN0IGNhcmRfaW5mbyAqaW5mbywgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBpbmZvLT5kZXYtPmRldl9wcml2YXRlOworCisJV1JFRzMyX0lPKHJlZyo0LCB2YWwpOworfQorCitzdGF0aWMgdWludDMyX3QgY2FpbF9pb3JlZ19yZWFkKHN0cnVjdCBjYXJkX2luZm8gKmluZm8sIHVpbnQzMl90IHJlZykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGluZm8tPmRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgcjsKKworCXIgPSBSUkVHMzJfSU8ocmVnKjQpOworCXJldHVybiByOworfQorCiBpbnQgcmFkZW9uX2F0b21iaW9zX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IGNhcmRfaW5mbyAqYXRvbV9jYXJkX2luZm8gPQpAQCAtNDI3LDYgKzQ0MywxNSBAQAogCWF0b21fY2FyZF9pbmZvLT5kZXYgPSByZGV2LT5kZGV2OwogCWF0b21fY2FyZF9pbmZvLT5yZWdfcmVhZCA9IGNhaWxfcmVnX3JlYWQ7CiAJYXRvbV9jYXJkX2luZm8tPnJlZ193cml0ZSA9IGNhaWxfcmVnX3dyaXRlOworCS8qIG5lZWRlZCBmb3IgaWlvIG9wcyAqLworCWlmIChyZGV2LT5yaW9fbWVtKSB7CisJCWF0b21fY2FyZF9pbmZvLT5pb3JlZ19yZWFkID0gY2FpbF9pb3JlZ19yZWFkOworCQlhdG9tX2NhcmRfaW5mby0+aW9yZWdfd3JpdGUgPSBjYWlsX2lvcmVnX3dyaXRlOworCX0gZWxzZSB7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGZpbmQgUENJIEkvTyBCQVI7IHVzaW5nIE1NSU8gZm9yIEFUT00gSUlPXG4iKTsKKwkJYXRvbV9jYXJkX2luZm8tPmlvcmVnX3JlYWQgPSBjYWlsX3JlZ19yZWFkOworCQlhdG9tX2NhcmRfaW5mby0+aW9yZWdfd3JpdGUgPSBjYWlsX3JlZ193cml0ZTsKKwl9CiAJYXRvbV9jYXJkX2luZm8tPm1jX3JlYWQgPSBjYWlsX21jX3JlYWQ7CiAJYXRvbV9jYXJkX2luZm8tPm1jX3dyaXRlID0gY2FpbF9tY193cml0ZTsKIAlhdG9tX2NhcmRfaW5mby0+cGxsX3JlYWQgPSBjYWlsX3BsbF9yZWFkOwpAQCAtNTczLDcgKzU5OCw3IEBACiAJCSAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJICAgICAgIHVpbnQzMl90IGZsYWdzKQogewotCWludCByOworCWludCByLCBpOwogCWludCBkbWFfYml0czsKIAogCXJkZXYtPnNodXRkb3duID0gZmFsc2U7CkBAIC02NTAsOCArNjc1LDggQEAKIAogCS8qIFJlZ2lzdGVycyBtYXBwaW5nICovCiAJLyogVE9ETzogYmxvY2sgdXNlcnNwYWNlIG1hcHBpbmcgb2YgaW8gcmVnaXN0ZXIgKi8KLQlyZGV2LT5ybW1pb19iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChyZGV2LT5kZGV2LCAyKTsKLQlyZGV2LT5ybW1pb19zaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4ocmRldi0+ZGRldiwgMik7CisJcmRldi0+cm1taW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChyZGV2LT5wZGV2LCAyKTsKKwlyZGV2LT5ybW1pb19zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCAyKTsKIAlyZGV2LT5ybW1pbyA9IGlvcmVtYXAocmRldi0+cm1taW9fYmFzZSwgcmRldi0+cm1taW9fc2l6ZSk7CiAJaWYgKHJkZXYtPnJtbWlvID09IE5VTEwpIHsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02NTksNiArNjg0LDE3IEBACiAJRFJNX0lORk8oInJlZ2lzdGVyIG1taW8gYmFzZTogMHglMDhYXG4iLCAodWludDMyX3QpcmRldi0+cm1taW9fYmFzZSk7CiAJRFJNX0lORk8oInJlZ2lzdGVyIG1taW8gc2l6ZTogJXVcbiIsICh1bnNpZ25lZClyZGV2LT5ybW1pb19zaXplKTsKIAorCS8qIGlvIHBvcnQgbWFwcGluZyAqLworCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgeworCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHJkZXYtPnBkZXYsIGkpICYgSU9SRVNPVVJDRV9JTykgeworCQkJcmRldi0+cmlvX21lbV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCBpKTsKKwkJCXJkZXYtPnJpb19tZW0gPSBwY2lfaW9tYXAocmRldi0+cGRldiwgaSwgcmRldi0+cmlvX21lbV9zaXplKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZGV2LT5yaW9fbWVtID09IE5VTEwpCisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGZpbmQgUENJIEkvTyBCQVJcbiIpOworCiAJLyogaWYgd2UgaGF2ZSA+IDEgVkdBIGNhcmRzLCB0aGVuIGRpc2FibGUgdGhlIHJhZGVvbiBWR0EgcmVzb3VyY2VzICovCiAJLyogdGhpcyB3aWxsIGZhaWwgZm9yIGNhcmRzIHRoYXQgYXJlbid0IFZHQSBjbGFzcyBkZXZpY2VzLCBqdXN0CiAJICogaWdub3JlIGl0ICovCkBAIC03MDEsNiArNzM3LDkgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZShyZGV2LT53cSk7CiAJdmdhX3N3aXRjaGVyb29fdW5yZWdpc3Rlcl9jbGllbnQocmRldi0+cGRldik7CiAJdmdhX2NsaWVudF9yZWdpc3RlcihyZGV2LT5wZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAocmRldi0+cmlvX21lbSkKKwkJcGNpX2lvdW5tYXAocmRldi0+cGRldiwgcmRldi0+cmlvX21lbSk7CisJcmRldi0+cmlvX21lbSA9IE5VTEw7CiAJaW91bm1hcChyZGV2LT5ybW1pbyk7CiAJcmRldi0+cm1taW8gPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCmluZGV4IDgxNTRjZGYuLjc0ZGFjOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKQEAgLTQyLDcgKzQyLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CiAKLQlEUk1fREVCVUcoIiVkXG4iLCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7CisJRFJNX0RFQlVHX0tNUygiJWRcbiIsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKIAlXUkVHMzIoQVZJVk9fRENfTFVUQV9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKIAogCVdSRUczMihBVklWT19EQ19MVVRBX0JMQUNLX09GRlNFVF9CTFVFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKQEAgLTc1LDcgKzc1LDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CiAKLQlEUk1fREVCVUcoIiVkXG4iLCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7CisJRFJNX0RFQlVHX0tNUygiJWRcbiIsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKIAogCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX0JMQUNLX09GRlNFVF9CTFVFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKQEAgLTQ2OSw3ICs0NjksNyBAQAogCXVpbnQzMl90IHBvc3RfZGl2OwogCXUzMiBwbGxfb3V0X21pbiwgcGxsX291dF9tYXg7CiAKLQlEUk1fREVCVUcoIlBMTCBmcmVxICVsbHUgJXUgJXVcbiIsIGZyZXEsIHBsbC0+bWluX3JlZl9kaXYsIHBsbC0+bWF4X3JlZl9kaXYpOworCURSTV9ERUJVR19LTVMoIlBMTCBmcmVxICVsbHUgJXUgJXVcbiIsIGZyZXEsIHBsbC0+bWluX3JlZl9kaXYsIHBsbC0+bWF4X3JlZl9kaXYpOwogCWZyZXEgPSBmcmVxICogMTAwMDsKIAogCWlmIChwbGwtPmZsYWdzICYgUkFERU9OX1BMTF9JU19MQ0QpIHsKQEAgLTU1OCwxNSArNTU4LDE3IEBACiAJCQkJCWN1cnJlbnRfZnJlcSA9IHJhZGVvbl9kaXYodG1wLCByZWZfZGl2ICogcG9zdF9kaXYpOwogCiAJCQkJCWlmIChwbGwtPmZsYWdzICYgUkFERU9OX1BMTF9QUkVGRVJfQ0xPU0VTVF9MT1dFUikgewotCQkJCQkJZXJyb3IgPSBmcmVxIC0gY3VycmVudF9mcmVxOwotCQkJCQkJZXJyb3IgPSBlcnJvciA8IDAgPyAweGZmZmZmZmZmIDogZXJyb3I7CisJCQkJCQlpZiAoZnJlcSA8IGN1cnJlbnRfZnJlcSkKKwkJCQkJCQllcnJvciA9IDB4ZmZmZmZmZmY7CisJCQkJCQllbHNlCisJCQkJCQkJZXJyb3IgPSBmcmVxIC0gY3VycmVudF9mcmVxOwogCQkJCQl9IGVsc2UKIAkJCQkJCWVycm9yID0gYWJzKGN1cnJlbnRfZnJlcSAtIGZyZXEpOwogCQkJCQl2Y29fZGlmZiA9IGFicyh2Y28gLSBiZXN0X3Zjbyk7CiAKIAkJCQkJaWYgKChiZXN0X3ZjbyA9PSAwICYmIGVycm9yIDwgYmVzdF9lcnJvcikgfHwKIAkJCQkJICAgIChiZXN0X3ZjbyAhPSAwICYmCi0JCQkJCSAgICAgKGVycm9yIDwgYmVzdF9lcnJvciAtIDEwMCB8fAorCQkJCQkgICAgICgoYmVzdF9lcnJvciA+IDEwMCAmJiBlcnJvciA8IGJlc3RfZXJyb3IgLSAxMDApIHx8CiAJCQkJCSAgICAgIChhYnMoZXJyb3IgLSBiZXN0X2Vycm9yKSA8IDEwMCAmJiB2Y29fZGlmZiA8IGJlc3RfdmNvX2RpZmYpKSkpIHsKIAkJCQkJCWJlc3RfcG9zdF9kaXYgPSBwb3N0X2RpdjsKIAkJCQkJCWJlc3RfcmVmX2RpdiA9IHJlZl9kaXY7CkBAIC04MDMsNyArODA1LDcgQEAKIAkqcmVmX2Rpdl9wID0gcmVmX2RpdjsKIAkqcG9zdF9kaXZfcCA9IHBvc3RfZGl2OwogCi0JRFJNX0RFQlVHKCIldSAlZC4lZCwgJWQsICVkXG4iLCAqZG90X2Nsb2NrX3AsICpmYl9kaXZfcCwgKmZyYWNfZmJfZGl2X3AsICpyZWZfZGl2X3AsICpwb3N0X2Rpdl9wKTsKKwlEUk1fREVCVUdfS01TKCIldSAlZC4lZCwgJWQsICVkXG4iLCAqZG90X2Nsb2NrX3AsICpmYl9kaXZfcCwgKmZyYWNfZmJfZGl2X3AsICpyZWZfZGl2X3AsICpwb3N0X2Rpdl9wKTsKIH0KIAogdm9pZCByYWRlb25fY29tcHV0ZV9wbGwoc3RydWN0IHJhZGVvbl9wbGwgKnBsbCwKQEAgLTkxOSw2ICs5MjEsMTIgQEAKIAl7IFRWX1NURF9TRUNBTSwgInNlY2FtIiB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgcmFkZW9uX3VuZGVyc2Nhbl9lbnVtX2xpc3RbXSA9Cit7CXsgVU5ERVJTQ0FOX09GRiwgIm9mZiIgfSwKKwl7IFVOREVSU0NBTl9PTiwgIm9uIiB9LAorCXsgVU5ERVJTQ0FOX0FVVE8sICJhdXRvIiB9LAorfTsKKwogc3RhdGljIGludCByYWRlb25fbW9kZXNldF9jcmVhdGVfcHJvcHMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IGksIHN6OwpAQCAtOTcyLDYgKzk4MCwxOCBAQAogCQkJCSAgICAgIHJhZGVvbl90dl9zdGRfZW51bV9saXN0W2ldLm5hbWUpOwogCX0KIAorCXN6ID0gQVJSQVlfU0laRShyYWRlb25fdW5kZXJzY2FuX2VudW1fbGlzdCk7CisJcmRldi0+bW9kZV9pbmZvLnVuZGVyc2Nhbl9wcm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGUocmRldi0+ZGRldiwKKwkJCQkgICAgRFJNX01PREVfUFJPUF9FTlVNLAorCQkJCSAgICAidW5kZXJzY2FuIiwgc3opOworCWZvciAoaSA9IDA7IGkgPCBzejsgaSsrKSB7CisJCWRybV9wcm9wZXJ0eV9hZGRfZW51bShyZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX3Byb3BlcnR5LAorCQkJCSAgICAgIGksCisJCQkJICAgICAgcmFkZW9uX3VuZGVyc2Nhbl9lbnVtX2xpc3RbaV0udHlwZSwKKwkJCQkgICAgICByYWRlb25fdW5kZXJzY2FuX2VudW1fbGlzdFtpXS5uYW1lKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA2NywxNSArMTA4NywyNiBAQAogCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yOwogCWJvb2wgZmlyc3QgPSB0cnVlOworCXUzMiBzcmNfdiA9IDEsIGRzdF92ID0gMTsKKwl1MzIgc3JjX2ggPSAxLCBkc3RfaCA9IDE7CisKKwlyYWRlb25fY3J0Yy0+aF9ib3JkZXIgPSAwOworCXJhZGVvbl9jcnRjLT52X2JvcmRlciA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQlyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwogCQlpZiAoZW5jb2Rlci0+Y3J0YyAhPSBjcnRjKQogCQkJY29udGludWU7CisJCXJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCQlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCiAJCWlmIChmaXJzdCkgewogCQkJLyogc2V0IHNjYWxpbmcgKi8KIAkJCWlmIChyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPT0gUk1YX09GRikKQEAgLTEwODUsMzEgKzExMTYsNDkgQEAKIAkJCQlyYWRlb25fY3J0Yy0+cm14X3R5cGUgPSByYWRlb25fZW5jb2Rlci0+cm14X3R5cGU7CiAJCQllbHNlCiAJCQkJcmFkZW9uX2NydGMtPnJteF90eXBlID0gUk1YX09GRjsKKwkJCXNyY192ID0gY3J0Yy0+bW9kZS52ZGlzcGxheTsKKwkJCWRzdF92ID0gcmFkZW9uX2NydGMtPm5hdGl2ZV9tb2RlLnZkaXNwbGF5OworCQkJc3JjX2ggPSBjcnRjLT5tb2RlLmhkaXNwbGF5OworCQkJZHN0X2ggPSByYWRlb25fY3J0Yy0+bmF0aXZlX21vZGUudmRpc3BsYXk7CiAJCQkvKiBjb3B5IG5hdGl2ZSBtb2RlICovCiAJCQltZW1jcHkoJnJhZGVvbl9jcnRjLT5uYXRpdmVfbW9kZSwKIAkJCSAgICAgICAmcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlLAogCQkJCXNpemVvZihzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSkpOworCisJCQkvKiBmaXggdXAgZm9yIG92ZXJzY2FuIG9uIGhkbWkgKi8KKwkJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpICYmCisJCQkgICAgKChyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgPT0gVU5ERVJTQ0FOX09OKSB8fAorCQkJICAgICAoKHJhZGVvbl9lbmNvZGVyLT51bmRlcnNjYW5fdHlwZSA9PSBVTkRFUlNDQU5fQVVUTykgJiYKKwkJCSAgICAgIGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpKSkpIHsKKwkJCQlyYWRlb25fY3J0Yy0+aF9ib3JkZXIgPSAobW9kZS0+aGRpc3BsYXkgPj4gNSkgKyAxNjsKKwkJCQlyYWRlb25fY3J0Yy0+dl9ib3JkZXIgPSAobW9kZS0+dmRpc3BsYXkgPj4gNSkgKyAxNjsKKwkJCQlyYWRlb25fY3J0Yy0+cm14X3R5cGUgPSBSTVhfRlVMTDsKKwkJCQlzcmNfdiA9IGNydGMtPm1vZGUudmRpc3BsYXk7CisJCQkJZHN0X3YgPSBjcnRjLT5tb2RlLnZkaXNwbGF5IC0gKHJhZGVvbl9jcnRjLT52X2JvcmRlciAqIDIpOworCQkJCXNyY19oID0gY3J0Yy0+bW9kZS5oZGlzcGxheTsKKwkJCQlkc3RfaCA9IGNydGMtPm1vZGUuaGRpc3BsYXkgLSAocmFkZW9uX2NydGMtPmhfYm9yZGVyICogMik7CisJCQl9CiAJCQlmaXJzdCA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJaWYgKHJhZGVvbl9jcnRjLT5ybXhfdHlwZSAhPSByYWRlb25fZW5jb2Rlci0+cm14X3R5cGUpIHsKIAkJCQkvKiBXQVJOSU5HOiBSaWdodCBub3cgdGhpcyBjYW4ndCBoYXBwZW4gYnV0CiAJCQkJICogaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgc2NhbGluZwotCQkJCSAqIGFyZSBjb25zaXN0ZW50IGFjY3Jvc3MgZGlmZmVyZW50IGVuY29kZXIKKwkJCQkgKiBhcmUgY29uc2lzdGVudCBhY3Jvc3MgZGlmZmVyZW50IGVuY29kZXIKIAkJCQkgKiAoaWUgYWxsIGVuY29kZXIgY2FuIHdvcmsgd2l0aCB0aGUgc2FtZQogCQkJCSAqICBzY2FsaW5nKS4KIAkJCQkgKi8KLQkJCQlEUk1fRVJST1IoIlNjYWxpbmcgbm90IGNvbnNpc3RlbnQgYWNjcm9zcyBlbmNvZGVyLlxuIik7CisJCQkJRFJNX0VSUk9SKCJTY2FsaW5nIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBlbmNvZGVyLlxuIik7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQl9CiAJfQogCWlmIChyYWRlb25fY3J0Yy0+cm14X3R5cGUgIT0gUk1YX09GRikgewogCQlmaXhlZDIwXzEyIGEsIGI7Ci0JCWEuZnVsbCA9IGRmaXhlZF9jb25zdChjcnRjLT5tb2RlLnZkaXNwbGF5KTsKLQkJYi5mdWxsID0gZGZpeGVkX2NvbnN0KHJhZGVvbl9jcnRjLT5uYXRpdmVfbW9kZS5oZGlzcGxheSk7CisJCWEuZnVsbCA9IGRmaXhlZF9jb25zdChzcmNfdik7CisJCWIuZnVsbCA9IGRmaXhlZF9jb25zdChkc3Rfdik7CiAJCXJhZGVvbl9jcnRjLT52c2MuZnVsbCA9IGRmaXhlZF9kaXYoYSwgYik7Ci0JCWEuZnVsbCA9IGRmaXhlZF9jb25zdChjcnRjLT5tb2RlLmhkaXNwbGF5KTsKLQkJYi5mdWxsID0gZGZpeGVkX2NvbnN0KHJhZGVvbl9jcnRjLT5uYXRpdmVfbW9kZS52ZGlzcGxheSk7CisJCWEuZnVsbCA9IGRmaXhlZF9jb25zdChzcmNfaCk7CisJCWIuZnVsbCA9IGRmaXhlZF9jb25zdChkc3RfaCk7CiAJCXJhZGVvbl9jcnRjLT5oc2MuZnVsbCA9IGRmaXhlZF9kaXYoYSwgYik7CiAJfSBlbHNlIHsKIAkJcmFkZW9uX2NydGMtPnZzYy5mdWxsID0gZGZpeGVkX2NvbnN0KDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwppbmRleCBlMTY2ZmU0Li43OTU0MDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwpAQCAtNDYsOSArNDYsMTAgQEAKICAqIC0gMi4zLjAgLSBhZGQgTVNQT1MgKyAzRCB0ZXh0dXJlICsgcjUwMCBWQVAgcmVncwogICogLSAyLjQuMCAtIGFkZCBjcnRjIGlkIHF1ZXJ5CiAgKiAtIDIuNS4wIC0gYWRkIGdldCBhY2NlbCAyIHRvIHdvcmsgYXJvdW5kIGRkeCBicmVha2FnZSBmb3IgZXZlcmdyZWVuCisgKiAtIDIuNi4wIC0gYWRkIHRpbGluZyBjb25maWcgcXVlcnkgKHI2eHgrKSwgYWRkIGluaXRpYWwgSGlaIHN1cHBvcnQgKHIzMDAtPnI1MDApCiAgKi8KICNkZWZpbmUgS01TX0RSSVZFUl9NQUpPUgkyCi0jZGVmaW5lIEtNU19EUklWRVJfTUlOT1IJNQorI2RlZmluZSBLTVNfRFJJVkVSX01JTk9SCTYKICNkZWZpbmUgS01TX0RSSVZFUl9QQVRDSExFVkVMCTAKIGludCByYWRlb25fZHJpdmVyX2xvYWRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogaW50IHJhZGVvbl9kcml2ZXJfdW5sb2FkX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTIzOCw3ICsyMzksNyBAQAogc3RhdGljIGludCBfX2RldmluaXQKIHJhZGVvbl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JcmV0dXJuIGRybV9nZXRfZGV2KHBkZXYsIGVudCwgJmttc19kcml2ZXIpOworCXJldHVybiBkcm1fZ2V0X3BjaV9kZXYocGRldiwgZW50LCAma21zX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYwppbmRleCBlMGIzMGIyLi4yNjNjODA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKQEAgLTIwNSwxNCArMjA1LDE0IEBACiAJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgPT0gZW5jb2RlcikgewogCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJCQlyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSA9IHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgcmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlczsKLQkJCURSTV9ERUJVRygic2V0dGluZyBhY3RpdmUgZGV2aWNlIHRvICUwOHggZnJvbSAlMDh4ICUwOHggZm9yIGVuY29kZXIgJWRcbiIsCisJCQlEUk1fREVCVUdfS01TKCJzZXR0aW5nIGFjdGl2ZSBkZXZpY2UgdG8gJTA4eCBmcm9tICUwOHggJTA4eCBmb3IgZW5jb2RlciAlZFxuIiwKIAkJCQkgIHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcywKIAkJCQkgIHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMsIGVuY29kZXItPmVuY29kZXJfdHlwZSk7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqCiByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAKIAltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CiAKLQlEUk1fREVCVUcoImVuY29kZXIgZHBtcyAlZCB0byBtb2RlICVkLCBkZXZpY2VzICUwOHgsIGFjdGl2ZV9kZXZpY2VzICUwOHhcbiIsCisJRFJNX0RFQlVHX0tNUygiZW5jb2RlciBkcG1zICVkIHRvIG1vZGUgJWQsIGRldmljZXMgJTA4eCwgYWN0aXZlX2RldmljZXMgJTA4eFxuIiwKIAkJICByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCwgbW9kZSwgcmFkZW9uX2VuY29kZXItPmRldmljZXMsCiAJCSAgcmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UpOwogCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKQEAgLTE0ODQsNyArMTQ4NCw3IEBACiAJdWludDMyX3QgYmlvc18wX3NjcmF0Y2g7CiAKIAlpZiAoIWF0b21iaW9zX2RhY19sb2FkX2RldGVjdChlbmNvZGVyLCBjb25uZWN0b3IpKSB7Ci0JCURSTV9ERUJVRygiZGV0ZWN0IHJldHVybmVkIGZhbHNlIFxuIik7CisJCURSTV9ERUJVR19LTVMoImRldGVjdCByZXR1cm5lZCBmYWxzZSBcbiIpOwogCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOwogCX0KIApAQCAtMTQ5Myw3ICsxNDkzLDcgQEAKIAllbHNlCiAJCWJpb3NfMF9zY3JhdGNoID0gUlJFRzMyKFJBREVPTl9CSU9TXzBfU0NSQVRDSCk7CiAKLQlEUk1fREVCVUcoIkJpb3MgMCBzY3JhdGNoICV4ICUwOHhcbiIsIGJpb3NfMF9zY3JhdGNoLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyk7CisJRFJNX0RFQlVHX0tNUygiQmlvcyAwIHNjcmF0Y2ggJXggJTA4eFxuIiwgYmlvc18wX3NjcmF0Y2gsIHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzKTsKIAlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkgewogCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDFfTUFTSykKIAkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKQEAgLTE2OTQsNiArMTY5NCw3IEBACiAJcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPSBlbmNvZGVyX2lkOwogCXJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzID0gc3VwcG9ydGVkX2RldmljZTsKIAlyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfT0ZGOworCXJhZGVvbl9lbmNvZGVyLT51bmRlcnNjYW5fdHlwZSA9IFVOREVSU0NBTl9PRkY7CiAKIAlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgpAQCAtMTcwNyw2ICsxNzA4LDggQEAKIAkJfSBlbHNlIHsKIAkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOwogCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhyYWRlb25fZW5jb2Rlcik7CisJCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKKwkJCQlyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgPSBVTkRFUlNDQU5fQVVUTzsKIAkJfQogCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kaWdfaGVscGVyX2Z1bmNzKTsKIAkJYnJlYWs7CkBAIC0xNzM2LDYgKzE3MzksOCBAQAogCQl9IGVsc2UgewogCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CiAJCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJCXJhZGVvbl9lbmNvZGVyLT51bmRlcnNjYW5fdHlwZSA9IFVOREVSU0NBTl9BVVRPOwogCQl9CiAJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2RpZ19oZWxwZXJfZnVuY3MpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKaW5kZXggYWIzODlmOC4uZGRjZDNiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIGludCByYWRlb25fZHJpdmVyX2xvYWRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXY7Ci0JaW50IHI7CisJaW50IHIsIGFjcGlfc3RhdHVzOwogCiAJcmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJkZXYgPT0gTlVMTCkgewpAQCAtNzcsNiArNzcsMTIgQEAKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJGYXRhbCBlcnJvciBkdXJpbmcgR1BVIGluaXRcbiIpOwogCQlnb3RvIG91dDsKIAl9CisKKwkvKiBDYWxsIEFDUEkgbWV0aG9kcyAqLworCWFjcGlfc3RhdHVzID0gcmFkZW9uX2FjcGlfaW5pdChyZGV2KTsKKwlpZiAoYWNwaV9zdGF0dXMpCisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiRXJyb3IgZHVyaW5nIEFDUEkgbWV0aG9kcyBjYWxsXG4iKTsKKwogCS8qIEFnYWluIG1vZGVzZXRfaW5pdCBzaG91bGQgZmFpbCBvbmx5IG9uIGZhdGFsIGVycm9yCiAJICogb3RoZXJ3aXNlIGl0IHNob3VsZCBwcm92aWRlIGVub3VnaCBmdW5jdGlvbmFsaXRpZXMKIAkgKiBmb3Igc2hhZG93ZmIgdG8gcnVuCkBAIC0xMzUsMTUgKzE0MSwzNiBAQAogCQkJfQogCQl9CiAJCWlmICghZm91bmQpIHsKLQkJCURSTV9ERUJVRygidW5rbm93biBjcnRjIGlkICVkXG4iLCB2YWx1ZSk7CisJCQlEUk1fREVCVUdfS01TKCJ1bmtub3duIGNydGMgaWQgJWRcbiIsIHZhbHVlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX0lORk9fQUNDRUxfV09SS0lORzI6CiAJCXZhbHVlID0gcmRldi0+YWNjZWxfd29ya2luZzsKIAkJYnJlYWs7CisJY2FzZSBSQURFT05fSU5GT19USUxJTkdfQ09ORklHOgorCQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfQ0VEQVIpCisJCQl2YWx1ZSA9IHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4udGlsZV9jb25maWc7CisJCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzcwKQorCQkJdmFsdWUgPSByZGV2LT5jb25maWcucnY3NzAudGlsZV9jb25maWc7CisJCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApCisJCQl2YWx1ZSA9IHJkZXYtPmNvbmZpZy5yNjAwLnRpbGVfY29uZmlnOworCQllbHNlIHsKKwkJCURSTV9ERUJVR19LTVMoInRpbGluZyBjb25maWcgaXMgcjZ4eCsgb25seSFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwljYXNlIFJBREVPTl9JTkZPX1dBTlRfSFlQRVJaOgorCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWlmIChyZGV2LT5oeXBlcnpfZmlscCkKKwkJCXZhbHVlID0gMDsKKwkJZWxzZSB7CisJCQlyZGV2LT5oeXBlcnpfZmlscCA9IGZpbHA7CisJCQl2YWx1ZSA9IDE7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCURSTV9ERUJVRygiSW52YWxpZCByZXF1ZXN0ICVkXG4iLCBpbmZvLT5yZXF1ZXN0KTsKKwkJRFJNX0RFQlVHX0tNUygiSW52YWxpZCByZXF1ZXN0ICVkXG4iLCBpbmZvLT5yZXF1ZXN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChEUk1fQ09QWV9UT19VU0VSKHZhbHVlX3B0ciwgJnZhbHVlLCBzaXplb2YodWludDMyX3QpKSkgewpAQCAtMTgxLDkgKzIwOCwxMSBAQAogdm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogeworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAocmRldi0+aHlwZXJ6X2ZpbHAgPT0gZmlsZV9wcml2KQorCQlyZGV2LT5oeXBlcnpfZmlscCA9IE5VTEw7CiB9CiAKLQogLyoKICAqIFZCbGFuayByZWxhdGVkIGZ1bmN0aW9ucy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMKaW5kZXggZTFlNTI1NS4uOTg5ZGY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfY3J0Yy5jCkBAIC0zNjIsMTAgKzM2MiwxMCBAQAogCXVpbnQzMl90IGdlbl9jbnRsX3JlZywgZ2VuX2NudGxfdmFsOwogCWludCByOwogCi0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAJLyogbm8gZmIgYm91bmQgKi8KIAlpZiAoIWNydGMtPmZiKSB7Ci0JCURSTV9ERUJVRygiTm8gRkIgYm91bmRcbiIpOworCQlEUk1fREVCVUdfS01TKCJObyBGQiBib3VuZFxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNTI4LDcgKzUyOCw3IEBACiAJdWludDMyX3QgY3J0Y192X3N5bmNfc3RydF93aWQ7CiAJYm9vbCBpc190diA9IGZhbHNlOwogCi0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKIAkJaWYgKGVuY29kZXItPmNydGMgPT0gY3J0YykgewogCQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwpAQCAtNzU3LDcgKzc1Nyw3IEBACiAJCX0KIAl9CiAKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCWlmICghdXNlX2Jpb3NfZGl2cykgewogCQlyYWRlb25fY29tcHV0ZV9wbGwocGxsLCBtb2RlLT5jbG9jaywKQEAgLTc3Miw3ICs3NzIsNyBAQAogCQlpZiAoIXBvc3RfZGl2LT5kaXZpZGVyKQogCQkJcG9zdF9kaXYgPSAmcG9zdF9kaXZzWzBdOwogCi0JCURSTV9ERUJVRygiZGM9JXUsIGZkPSVkLCByZD0lZCwgcGQ9JWRcbiIsCisJCURSTV9ERUJVR19LTVMoImRjPSV1LCBmZD0lZCwgcmQ9JWQsIHBkPSVkXG4iLAogCQkJICAodW5zaWduZWQpZnJlcSwKIAkJCSAgZmVlZGJhY2tfZGl2LAogCQkJICByZWZlcmVuY2VfZGl2LApAQCAtODQxLDEyICs4NDEsMTIgQEAKIAkJCSAgICAgICB8IFJBREVPTl9QMlBMTF9TTEVFUAogCQkJICAgICAgIHwgUkFERU9OX1AyUExMX0FUT01JQ19VUERBVEVfRU4pKTsKIAotCQlEUk1fREVCVUcoIldyb3RlMjogMHglMDh4IDB4JTA4eCAweCUwOHggKDB4JTA4eClcbiIsCisJCURSTV9ERUJVR19LTVMoIldyb3RlMjogMHglMDh4IDB4JTA4eCAweCUwOHggKDB4JTA4eClcbiIsCiAJCQkgICh1bnNpZ25lZClwbGxfcmVmX2RpdiwKIAkJCSAgKHVuc2lnbmVkKXBsbF9mYl9wb3N0X2RpdiwKIAkJCSAgKHVuc2lnbmVkKWh0b3RhbF9jbnRsLAogCQkJICBSUkVHMzJfUExMKFJBREVPTl9QMlBMTF9DTlRMKSk7Ci0JCURSTV9ERUJVRygiV3JvdGUyOiByZD0ldSwgZmQ9JXUsIHBkPSV1XG4iLAorCQlEUk1fREVCVUdfS01TKCJXcm90ZTI6IHJkPSV1LCBmZD0ldSwgcGQ9JXVcbiIsCiAJCQkgICh1bnNpZ25lZClwbGxfcmVmX2RpdiAmIFJBREVPTl9QMlBMTF9SRUZfRElWX01BU0ssCiAJCQkgICh1bnNpZ25lZClwbGxfZmJfcG9zdF9kaXYgJiBSQURFT05fUDJQTExfRkIwX0RJVl9NQVNLLAogCQkJICAodW5zaWduZWQpKChwbGxfZmJfcG9zdF9kaXYgJgpAQCAtOTQ3LDEyICs5NDcsMTIgQEAKIAkJCSAgICAgICB8IFJBREVPTl9QUExMX0FUT01JQ19VUERBVEVfRU4KIAkJCSAgICAgICB8IFJBREVPTl9QUExMX1ZHQV9BVE9NSUNfVVBEQVRFX0VOKSk7CiAKLQkJRFJNX0RFQlVHKCJXcm90ZTogMHglMDh4IDB4JTA4eCAweCUwOHggKDB4JTA4eClcbiIsCisJCURSTV9ERUJVR19LTVMoIldyb3RlOiAweCUwOHggMHglMDh4IDB4JTA4eCAoMHglMDh4KVxuIiwKIAkJCSAgcGxsX3JlZl9kaXYsCiAJCQkgIHBsbF9mYl9wb3N0X2RpdiwKIAkJCSAgKHVuc2lnbmVkKWh0b3RhbF9jbnRsLAogCQkJICBSUkVHMzJfUExMKFJBREVPTl9QUExMX0NOVEwpKTsKLQkJRFJNX0RFQlVHKCJXcm90ZTogcmQ9JWQsIGZkPSVkLCBwZD0lZFxuIiwKKwkJRFJNX0RFQlVHX0tNUygiV3JvdGU6IHJkPSVkLCBmZD0lZCwgcGQ9JWRcbiIsCiAJCQkgIHBsbF9yZWZfZGl2ICYgUkFERU9OX1BQTExfUkVGX0RJVl9NQVNLLAogCQkJICBwbGxfZmJfcG9zdF9kaXYgJiBSQURFT05fUFBMTF9GQjNfRElWX01BU0ssCiAJCQkgIChwbGxfZmJfcG9zdF9kaXYgJiBSQURFT05fUFBMTF9QT1NUM19ESVZfTUFTSykgPj4gMTYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2VuY29kZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfZW5jb2RlcnMuYwppbmRleCA1Njg4YTBjLi5iODE0OWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfZW5jb2RlcnMuYwpAQCAtNDcsNyArNDcsNyBAQAogCXVpbnQzMl90IGx2ZHNfZ2VuX2NudGwsIGx2ZHNfcGxsX2NudGwsIHBpeGNsa3NfY250bCwgZGlzcF9wd3JfbWFuOwogCWludCBwYW5lbF9wd3JfZGVsYXkgPSAyMDAwOwogCWJvb2wgaXNfbWFjID0gZmFsc2U7Ci0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAKIAlpZiAocmFkZW9uX2VuY29kZXItPmVuY19wcml2KSB7CiAJCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKIAl1aW50MzJfdCBsdmRzX3BsbF9jbnRsLCBsdmRzX2dlbl9jbnRsLCBsdmRzX3NzX2dlbl9jbnRsOwogCi0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAKIAlsdmRzX3BsbF9jbnRsID0gUlJFRzMyKFJBREVPTl9MVkRTX1BMTF9DTlRMKTsKIAlsdmRzX3BsbF9jbnRsICY9IH5SQURFT05fTFZEU19QTExfRU47CkBAIC0xNjcsNyArMTY3LDcgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfbHZkcyAqbHZkcyA9IChzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfbHZkcyAqKXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKIAkJaWYgKGx2ZHMpIHsKLQkJCURSTV9ERUJVRygiYmlvcyBMVkRTX0dFTl9DTlRMOiAweCV4XG4iLCBsdmRzLT5sdmRzX2dlbl9jbnRsKTsKKwkJCURSTV9ERUJVR19LTVMoImJpb3MgTFZEU19HRU5fQ05UTDogMHgleFxuIiwgbHZkcy0+bHZkc19nZW5fY250bCk7CiAJCQlsdmRzX2dlbl9jbnRsID0gbHZkcy0+bHZkc19nZW5fY250bDsKIAkJCWx2ZHNfc3NfZ2VuX2NudGwgJj0gfigoMHhmIDw8IFJBREVPTl9MVkRTX1BXUlNFUV9ERUxBWTFfU0hJRlQpIHwKIAkJCQkJICAgICAgKDB4ZiA8PCBSQURFT05fTFZEU19QV1JTRVFfREVMQVkyX1NISUZUKSk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAl1aW50MzJfdCBkYWNfY250bCA9IFJSRUczMihSQURFT05fREFDX0NOVEwpOwogCXVpbnQzMl90IGRhY19tYWNyb19jbnRsID0gUlJFRzMyKFJBREVPTl9EQUNfTUFDUk9fQ05UTCk7CiAKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgRFJNX01PREVfRFBNU19PTjoKQEAgLTMxNSw3ICszMTUsNyBAQAogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKIAl1aW50MzJfdCBkaXNwX291dHB1dF9jbnRsLCBkYWNfY250bCwgZGFjMl9jbnRsLCBkYWNfbWFjcm9fY250bDsKIAotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCiAJaWYgKHJhZGVvbl9jcnRjLT5jcnRjX2lkID09IDApIHsKIAkJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1IyMDAgfHwgQVNJQ19JU19SMzAwKHJkZXYpKSB7CkBAIC00NDYsNyArNDQ2LDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBmcF9nZW5fY250bCA9IFJSRUczMihSQURFT05fRlBfR0VOX0NOVEwpOwotCURSTV9ERUJVRygiXG4iKTsKKwlEUk1fREVCVUdfS01TKCJcbiIpOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgpAQCAtNTAyLDcgKzUwMiw3IEBACiAJdWludDMyX3QgdG1wLCB0bWRzX3BsbF9jbnRsLCB0bWRzX3RyYW5zbWl0dGVyX2NudGwsIGZwX2dlbl9jbnRsOwogCWludCBpOwogCi0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAKIAl0bXAgPSB0bWRzX3BsbF9jbnRsID0gUlJFRzMyKFJBREVPTl9UTURTX1BMTF9DTlRMKTsKIAl0bXAgJj0gMHhmZmZmZjsKQEAgLTYxMCw3ICs2MTAsNyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGZwMl9nZW5fY250bCA9IFJSRUczMihSQURFT05fRlAyX0dFTl9DTlRMKTsKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgRFJNX01PREVfRFBNU19PTjoKQEAgLTY2Niw3ICs2NjYsNyBAQAogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKIAl1aW50MzJfdCBmcDJfZ2VuX2NudGw7CiAKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKIAkJcmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID0gYWRqdXN0ZWRfbW9kZS0+Y2xvY2s7CkBAIC03NjAsNyArNzYwLDcgQEAKIAl1aW50MzJfdCBmcDJfZ2VuX2NudGwgPSAwLCBjcnRjMl9nZW5fY250bCA9IDAsIHR2X2RhY19jbnRsID0gMDsKIAl1aW50MzJfdCB0dl9tYXN0ZXJfY250bCA9IDA7CiAJYm9vbCBpc190djsKLQlEUk1fREVCVUcoIlxuIik7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAogCWlzX3R2ID0gcmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiBBVE9NX0RFVklDRV9UVl9TVVBQT1JUID8gdHJ1ZSA6IGZhbHNlOwogCkBAIC04NzgsNyArODc4LDcgQEAKIAl1aW50MzJfdCBkaXNwX2h3X2RlYnVnID0gMCwgZnAyX2dlbl9jbnRsID0gMCwgZGlzcF90dl9vdXRfY250bCA9IDA7CiAJYm9vbCBpc190diA9IGZhbHNlOwogCi0JRFJNX0RFQlVHKCJcbiIpOworCURSTV9ERUJVR19LTVMoIlxuIik7CiAKIAlpc190diA9IHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCA/IHRydWUgOiBmYWxzZTsKIApAQCAtMTA3NSwxMCArMTA3NSwxMCBAQAogCXRtcCA9IFJSRUczMihSQURFT05fVFZfREFDX0NOVEwpOwogCWlmICgodG1wICYgUkFERU9OX1RWX0RBQ19HREFDREVUKSAhPSAwKSB7CiAJCWZvdW5kID0gdHJ1ZTsKLQkJRFJNX0RFQlVHKCJTLXZpZGVvIFRWIGNvbm5lY3Rpb24gZGV0ZWN0ZWRcbiIpOworCQlEUk1fREVCVUdfS01TKCJTLXZpZGVvIFRWIGNvbm5lY3Rpb24gZGV0ZWN0ZWRcbiIpOwogCX0gZWxzZSBpZiAoKHRtcCAmIFJBREVPTl9UVl9EQUNfQkRBQ0RFVCkgIT0gMCkgewogCQlmb3VuZCA9IHRydWU7Ci0JCURSTV9ERUJVRygiQ29tcG9zaXRlIFRWIGNvbm5lY3Rpb24gZGV0ZWN0ZWRcbiIpOworCQlEUk1fREVCVUdfS01TKCJDb21wb3NpdGUgVFYgY29ubmVjdGlvbiBkZXRlY3RlZFxuIik7CiAJfQogCiAJV1JFRzMyKFJBREVPTl9UVl9EQUNfQ05UTCwgdHZfZGFjX2NudGwpOwpAQCAtMTE0MSwxMCArMTE0MSwxMCBAQAogCXRtcCA9IFJSRUczMihSQURFT05fVFZfREFDX0NOVEwpOwogCWlmICh0bXAgJiBSQURFT05fVFZfREFDX0dEQUNERVQpIHsKIAkJZm91bmQgPSB0cnVlOwotCQlEUk1fREVCVUcoIlMtdmlkZW8gVFYgY29ubmVjdGlvbiBkZXRlY3RlZFxuIik7CisJCURSTV9ERUJVR19LTVMoIlMtdmlkZW8gVFYgY29ubmVjdGlvbiBkZXRlY3RlZFxuIik7CiAJfSBlbHNlIGlmICgodG1wICYgUkFERU9OX1RWX0RBQ19CREFDREVUKSAhPSAwKSB7CiAJCWZvdW5kID0gdHJ1ZTsKLQkJRFJNX0RFQlVHKCJDb21wb3NpdGUgVFYgY29ubmVjdGlvbiBkZXRlY3RlZFxuIik7CisJCURSTV9ERUJVR19LTVMoIkNvbXBvc2l0ZSBUViBjb25uZWN0aW9uIGRldGVjdGVkXG4iKTsKIAl9CiAKIAlXUkVHMzIoUkFERU9OX1RWX1BSRV9EQUNfTVVYX0NOVEwsIHR2X3ByZV9kYWNfbXV4X2NudGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X3R2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfdHYuYwppbmRleCAwMzIwNDAzLi5jN2I2Y2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfdHYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfdHYuYwpAQCAtNDk2LDcgKzQ5Niw3IEBACiAKIAlyZXN0YXJ0IC09IHZfb2Zmc2V0ICsgaF9vZmZzZXQ7CiAKLQlEUk1fREVCVUcoImNvbXB1dGVfcmVzdGFydHM6IGRlZiA9ICV1IGggPSAlZCB2ID0gJWQsIHAxID0gJTA0eCwgcDIgPSAlMDR4LCByZXN0YXJ0ID0gJWRcbiIsCisJRFJNX0RFQlVHX0tNUygiY29tcHV0ZV9yZXN0YXJ0czogZGVmID0gJXUgaCA9ICVkIHYgPSAlZCwgcDEgPSAlMDR4LCBwMiA9ICUwNHgsIHJlc3RhcnQgPSAlZFxuIiwKIAkJICBjb25zdF9wdHItPmRlZl9yZXN0YXJ0LCB0dl9kYWMtPmhfcG9zLCB0dl9kYWMtPnZfcG9zLCBwMSwgcDIsIHJlc3RhcnQpOwogCiAJdHZfZGFjLT50di5ocmVzdGFydCA9IHJlc3RhcnQgJSBoX3RvdGFsOwpAQCAtNTA1LDcgKzUwNSw3IEBACiAJcmVzdGFydCAvPSB2X3RvdGFsOwogCXR2X2RhYy0+dHYuZnJlc3RhcnQgPSByZXN0YXJ0ICUgZl90b3RhbDsKIAotCURSTV9ERUJVRygiY29tcHV0ZV9yZXN0YXJ0OiBGL0gvVj0ldSwldSwldVxuIiwKKwlEUk1fREVCVUdfS01TKCJjb21wdXRlX3Jlc3RhcnQ6IEYvSC9WPSV1LCV1LCV1XG4iLAogCQkgICh1bnNpZ25lZCl0dl9kYWMtPnR2LmZyZXN0YXJ0LAogCQkgICh1bnNpZ25lZCl0dl9kYWMtPnR2LnZyZXN0YXJ0LAogCQkgICh1bnNpZ25lZCl0dl9kYWMtPnR2LmhyZXN0YXJ0KTsKQEAgLTUyMyw3ICs1MjMsNyBAQAogCXR2X2RhYy0+dHYudGltaW5nX2NudGwgPSAodHZfZGFjLT50di50aW1pbmdfY250bCAmIH5SQURFT05fSF9JTkNfTUFTSykgfAogCQkoKHUzMiloX2luYyA8PCBSQURFT05fSF9JTkNfU0hJRlQpOwogCi0JRFJNX0RFQlVHKCJjb21wdXRlX3Jlc3RhcnQ6IGhfc2l6ZSA9ICVkIGhfaW5jID0gJWRcbiIsIHR2X2RhYy0+aF9zaXplLCBoX2luYyk7CisJRFJNX0RFQlVHX0tNUygiY29tcHV0ZV9yZXN0YXJ0OiBoX3NpemUgPSAlZCBoX2luYyA9ICVkXG4iLCB0dl9kYWMtPmhfc2l6ZSwgaF9pbmMpOwogCiAJcmV0dXJuIGhfY2hhbmdlZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAppbmRleCA5NTY5NmFhLi43MWFlYTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCkBAIC02Niw2ICs2NiwxMiBAQAogCVRWX1NURF9QQUxfTiwKIH07CiAKK2VudW0gcmFkZW9uX3VuZGVyc2Nhbl90eXBlIHsKKwlVTkRFUlNDQU5fT0ZGLAorCVVOREVSU0NBTl9PTiwKKwlVTkRFUlNDQU5fQVVUTywKK307CisKIGVudW0gcmFkZW9uX2hwZF9pZCB7CiAJUkFERU9OX0hQRF8xID0gMCwKIAlSQURFT05fSFBEXzIsCkBAIC0yMjYsMTAgKzIzMiwxMiBAQAogCXN0cnVjdCBkcm1fcHJvcGVydHkgKmNvaGVyZW50X21vZGVfcHJvcGVydHk7CiAJLyogREFDIGVuYWJsZSBsb2FkIGRldGVjdCAqLwogCXN0cnVjdCBkcm1fcHJvcGVydHkgKmxvYWRfZGV0ZWN0X3Byb3BlcnR5OwotCS8qIFRWIHN0YW5kYXJkIGxvYWQgZGV0ZWN0ICovCisJLyogVFYgc3RhbmRhcmQgKi8KIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICp0dl9zdGRfcHJvcGVydHk7CiAJLyogbGVnYWN5IFRNRFMgUExMIGRldGVjdCAqLwogCXN0cnVjdCBkcm1fcHJvcGVydHkgKnRtZHNfcGxsX3Byb3BlcnR5OworCS8qIHVuZGVyc2NhbiAqLworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnVuZGVyc2Nhbl9wcm9wZXJ0eTsKIAkvKiBoYXJkY29kZWQgREZQIGVkaWQgZnJvbSBCSU9TICovCiAJc3RydWN0IGVkaWQgKmJpb3NfaGFyZGNvZGVkX2VkaWQ7CiAKQEAgLTI2Niw2ICsyNzQsOCBAQAogCXVpbnQzMl90IGxlZ2FjeV9kaXNwbGF5X2Jhc2VfYWRkcjsKIAl1aW50MzJfdCBsZWdhY3lfY3Vyc29yX29mZnNldDsKIAllbnVtIHJhZGVvbl9ybXhfdHlwZSBybXhfdHlwZTsKKwl1OCBoX2JvcmRlcjsKKwl1OCB2X2JvcmRlcjsKIAlmaXhlZDIwXzEyIHZzYzsKIAlmaXhlZDIwXzEyIGhzYzsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBuYXRpdmVfbW9kZTsKQEAgLTM1NCw2ICszNjQsNyBAQAogCXVpbnQzMl90IGZsYWdzOwogCXVpbnQzMl90IHBpeGVsX2Nsb2NrOwogCWVudW0gcmFkZW9uX3JteF90eXBlIHJteF90eXBlOworCWVudW0gcmFkZW9uX3VuZGVyc2Nhbl90eXBlIHVuZGVyc2Nhbl90eXBlOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG5hdGl2ZV9tb2RlOwogCXZvaWQgKmVuY19wcml2OwogCWludCBhdWRpb19wb2xsaW5nX2FjdGl2ZTsKQEAgLTM5Miw3ICs0MDMsNyBAQAogCXVpbnQzMl90IGNvbm5lY3Rvcl9pZDsKIAl1aW50MzJfdCBkZXZpY2VzOwogCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmRkY19idXM7Ci0JLyogc29tZSBzeXN0ZW1zIGhhdmUgYSBhbiBoZG1pIGFuZCB2Z2EgcG9ydCB3aXRoIGEgc2hhcmVkIGRkYyBsaW5lICovCisJLyogc29tZSBzeXN0ZW1zIGhhdmUgYW4gaGRtaSBhbmQgdmdhIHBvcnQgd2l0aCBhIHNoYXJlZCBkZGMgbGluZSAqLwogCWJvb2wgc2hhcmVkX2RkYzsKIAlib29sIHVzZV9kaWdpdGFsOwogCS8qIHdlIG5lZWQgdG8gbWluZCB0aGUgRURJRCBiZXR3ZWVuIGRldGVjdApAQCAtNDE0LDYgKzQyNSw5IEBACiBleHRlcm4gZW51bSByYWRlb25fdHZfc3RkCiByYWRlb25fYXRvbWJpb3NfZ2V0X3R2X2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCitleHRlcm4gc3RydWN0IGRybV9jb25uZWN0b3IgKgorcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKwogZXh0ZXJuIHZvaWQgcmFkZW9uX2Nvbm5lY3Rvcl9ob3RwbHVnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogZXh0ZXJuIGJvb2wgcmFkZW9uX2RwX25lZWRzX2xpbmtfdHJhaW4oc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOwogZXh0ZXJuIGludCByYWRlb25fZHBfbW9kZV92YWxpZF9oZWxwZXIoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCmluZGV4IGQ1YjkzNzMuLjBhZmQxZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCkBAIC0xMTAsNiArMTEwLDcgQEAKIAliby0+c3VyZmFjZV9yZWcgPSAtMTsKIAlJTklUX0xJU1RfSEVBRCgmYm8tPmxpc3QpOwogCityZXRyeToKIAlyYWRlb25fdHRtX3BsYWNlbWVudF9mcm9tX2RvbWFpbihibywgZG9tYWluKTsKIAkvKiBLZXJuZWwgYWxsb2NhdGlvbiBhcmUgdW5pbnRlcnJ1cHRpYmxlICovCiAJbXV0ZXhfbG9jaygmcmRldi0+dnJhbV9tdXRleCk7CkBAIC0xMTgsMTAgKzExOSwxNSBAQAogCQkJJnJhZGVvbl90dG1fYm9fZGVzdHJveSk7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT52cmFtX211dGV4KTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQlpZiAociAhPSAtRVJFU1RBUlRTWVMpCisJCWlmIChyICE9IC1FUkVTVEFSVFNZUykgeworCQkJaWYgKGRvbWFpbiA9PSBSQURFT05fR0VNX0RPTUFJTl9WUkFNKSB7CisJCQkJZG9tYWluIHw9IFJBREVPTl9HRU1fRE9NQUlOX0dUVDsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQogCQkJZGV2X2VycihyZGV2LT5kZXYsCiAJCQkJIm9iamVjdF9pbml0IGZhaWxlZCBmb3IgKCVsdSwgMHglMDhYKVxuIiwKIAkJCQlzaXplLCBkb21haW4pOworCQl9CiAJCXJldHVybiByOwogCX0KIAkqYm9fcHRyID0gYm87CkBAIC0zMjEsNiArMzI3LDcgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmo7CiAJc3RydWN0IHJhZGVvbl9ibyAqYm87CisJdTMyIGRvbWFpbjsKIAlpbnQgcjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgbGlzdCkgewpAQCAtMzMzLDE3ICszNDAsMTkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpIHsKIAkJYm8gPSBsb2JqLT5ibzsKIAkJaWYgKCFiby0+cGluX2NvdW50KSB7Ci0JCQlpZiAobG9iai0+d2RvbWFpbikgewotCQkJCXJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKGJvLAotCQkJCQkJCQlsb2JqLT53ZG9tYWluKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4oYm8sCi0JCQkJCQkJCWxvYmotPnJkb21haW4pOwotCQkJfQorCQkJZG9tYWluID0gbG9iai0+d2RvbWFpbiA/IGxvYmotPndkb21haW4gOiBsb2JqLT5yZG9tYWluOworCQkJCisJCXJldHJ5OgorCQkJcmFkZW9uX3R0bV9wbGFjZW1lbnRfZnJvbV9kb21haW4oYm8sIGRvbWFpbik7CiAJCQlyID0gdHRtX2JvX3ZhbGlkYXRlKCZiby0+dGJvLCAmYm8tPnBsYWNlbWVudCwKIAkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCQlpZiAodW5saWtlbHkocikpCisJCQlpZiAodW5saWtlbHkocikpIHsKKwkJCQlpZiAociAhPSAtRVJFU1RBUlRTWVMgJiYgZG9tYWluID09IFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pIHsKKwkJCQkJZG9tYWluIHw9IFJBREVPTl9HRU1fRE9NQUlOX0dUVDsKKwkJCQkJZ290byByZXRyeTsKKwkJCQl9CiAJCQkJcmV0dXJuIHI7CisJCQl9CiAJCX0KIAkJbG9iai0+Z3B1X29mZnNldCA9IHJhZGVvbl9ib19ncHVfb2Zmc2V0KGJvKTsKIAkJbG9iai0+dGlsaW5nX2ZsYWdzID0gYm8tPnRpbGluZ19mbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCmluZGV4IDExNWQyNmIuLjk1ZjhiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KIAogI2RlZmluZSBSQURFT05fSURMRV9MT09QX01TIDEwMAogI2RlZmluZSBSQURFT05fUkVDTE9DS19ERUxBWV9NUyAyMDAKQEAgLTYwLDkgKzYyLDkgQEAKIAogCWlmIChzdHJjbXAoZW50cnktPmRldmljZV9jbGFzcywgQUNQSV9BQ19DTEFTUykgPT0gMCkgewogCQlpZiAocG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCgpID4gMCkKLQkJCURSTV9ERUJVRygicG06IEFDXG4iKTsKKwkJCURSTV9ERUJVR19EUklWRVIoInBtOiBBQ1xuIik7CiAJCWVsc2UKLQkJCURSTV9ERUJVRygicG06IERDXG4iKTsKKwkJCURSTV9ERUJVR19EUklWRVIoInBtOiBEQ1xuIik7CiAKIAkJaWYgKHJkZXYtPnBtLnBtX21ldGhvZCA9PSBQTV9NRVRIT0RfUFJPRklMRSkgewogCQkJaWYgKHJkZXYtPnBtLnByb2ZpbGUgPT0gUE1fUFJPRklMRV9BVVRPKSB7CkBAIC0xOTYsNyArMTk4LDcgQEAKIAkJCXJhZGVvbl9zZXRfZW5naW5lX2Nsb2NrKHJkZXYsIHNjbGspOwogCQkJcmFkZW9uX3BtX2RlYnVnX2NoZWNrX2luX3ZibChyZGV2LCB0cnVlKTsKIAkJCXJkZXYtPnBtLmN1cnJlbnRfc2NsayA9IHNjbGs7Ci0JCQlEUk1fREVCVUcoIlNldHRpbmc6IGU6ICVkXG4iLCBzY2xrKTsKKwkJCURSTV9ERUJVR19EUklWRVIoIlNldHRpbmc6IGU6ICVkXG4iLCBzY2xrKTsKIAkJfQogCiAJCS8qIHNldCBtZW1vcnkgY2xvY2sgKi8KQEAgLTIwNSw3ICsyMDcsNyBAQAogCQkJcmFkZW9uX3NldF9tZW1vcnlfY2xvY2socmRldiwgbWNsayk7CiAJCQlyYWRlb25fcG1fZGVidWdfY2hlY2tfaW5fdmJsKHJkZXYsIHRydWUpOwogCQkJcmRldi0+cG0uY3VycmVudF9tY2xrID0gbWNsazsKLQkJCURSTV9ERUJVRygiU2V0dGluZzogbTogJWRcbiIsIG1jbGspOworCQkJRFJNX0RFQlVHX0RSSVZFUigiU2V0dGluZzogbTogJWRcbiIsIG1jbGspOwogCQl9CiAKIAkJaWYgKG1pc2NfYWZ0ZXIpCkBAIC0yMTcsNyArMjE5LDcgQEAKIAkJcmRldi0+cG0uY3VycmVudF9wb3dlcl9zdGF0ZV9pbmRleCA9IHJkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleDsKIAkJcmRldi0+cG0uY3VycmVudF9jbG9ja19tb2RlX2luZGV4ID0gcmRldi0+cG0ucmVxdWVzdGVkX2Nsb2NrX21vZGVfaW5kZXg7CiAJfSBlbHNlCi0JCURSTV9ERUJVRygicG06IEdVSSBub3QgaWRsZSEhIVxuIik7CisJCURSTV9ERUJVR19EUklWRVIoInBtOiBHVUkgbm90IGlkbGUhISFcbiIpOwogfQogCiBzdGF0aWMgdm9pZCByYWRlb25fcG1fc2V0X2Nsb2NrcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTI5MiwyNyArMjk0LDI3IEBACiAJc3RydWN0IHJhZGVvbl9wb3dlcl9zdGF0ZSAqcG93ZXJfc3RhdGU7CiAJc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvICpjbG9ja19pbmZvOwogCi0JRFJNX0RFQlVHKCIlZCBQb3dlciBTdGF0ZShzKVxuIiwgcmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyk7CisJRFJNX0RFQlVHX0RSSVZFUigiJWQgUG93ZXIgU3RhdGUocylcbiIsIHJkZXYtPnBtLm51bV9wb3dlcl9zdGF0ZXMpOwogCWZvciAoaSA9IDA7IGkgPCByZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzOyBpKyspIHsKIAkJcG93ZXJfc3RhdGUgPSAmcmRldi0+cG0ucG93ZXJfc3RhdGVbaV07Ci0JCURSTV9ERUJVRygiU3RhdGUgJWQ6ICVzXG4iLCBpLAorCQlEUk1fREVCVUdfRFJJVkVSKCJTdGF0ZSAlZDogJXNcbiIsIGksCiAJCQlyYWRlb25fcG1fc3RhdGVfdHlwZV9uYW1lW3Bvd2VyX3N0YXRlLT50eXBlXSk7CiAJCWlmIChpID09IHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXgpCi0JCQlEUk1fREVCVUcoIlx0RGVmYXVsdCIpOworCQkJRFJNX0RFQlVHX0RSSVZFUigiXHREZWZhdWx0Iik7CiAJCWlmICgocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkgJiYgIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKQotCQkJRFJNX0RFQlVHKCJcdCVkIFBDSUUgTGFuZXNcbiIsIHBvd2VyX3N0YXRlLT5wY2llX2xhbmVzKTsKKwkJCURSTV9ERUJVR19EUklWRVIoIlx0JWQgUENJRSBMYW5lc1xuIiwgcG93ZXJfc3RhdGUtPnBjaWVfbGFuZXMpOwogCQlpZiAocG93ZXJfc3RhdGUtPmZsYWdzICYgUkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFkpCi0JCQlEUk1fREVCVUcoIlx0U2luZ2xlIGRpc3BsYXkgb25seVxuIik7Ci0JCURSTV9ERUJVRygiXHQlZCBDbG9jayBNb2RlKHMpXG4iLCBwb3dlcl9zdGF0ZS0+bnVtX2Nsb2NrX21vZGVzKTsKKwkJCURSTV9ERUJVR19EUklWRVIoIlx0U2luZ2xlIGRpc3BsYXkgb25seVxuIik7CisJCURSTV9ERUJVR19EUklWRVIoIlx0JWQgQ2xvY2sgTW9kZShzKVxuIiwgcG93ZXJfc3RhdGUtPm51bV9jbG9ja19tb2Rlcyk7CiAJCWZvciAoaiA9IDA7IGogPCBwb3dlcl9zdGF0ZS0+bnVtX2Nsb2NrX21vZGVzOyBqKyspIHsKIAkJCWNsb2NrX2luZm8gPSAmKHBvd2VyX3N0YXRlLT5jbG9ja19pbmZvW2pdKTsKIAkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCi0JCQkJRFJNX0RFQlVHKCJcdFx0JWQgZTogJWQlc1xuIiwKKwkJCQlEUk1fREVCVUdfRFJJVkVSKCJcdFx0JWQgZTogJWQlc1xuIiwKIAkJCQkJaiwKIAkJCQkJY2xvY2tfaW5mby0+c2NsayAqIDEwLAogCQkJCQljbG9ja19pbmZvLT5mbGFncyAmIFJBREVPTl9QTV9NT0RFX05PX0RJU1BMQVkgPyAiXHRObyBkaXNwbGF5IG9ubHkiIDogIiIpOwogCQkJZWxzZQotCQkJCURSTV9ERUJVRygiXHRcdCVkIGU6ICVkXHRtOiAlZFx0djogJWQlc1xuIiwKKwkJCQlEUk1fREVCVUdfRFJJVkVSKCJcdFx0JWQgZTogJWRcdG06ICVkXHR2OiAlZCVzXG4iLAogCQkJCQlqLAogCQkJCQljbG9ja19pbmZvLT5zY2xrICogMTAsCiAJCQkJCWNsb2NrX2luZm8tPm1jbGsgKiAxMCwKQEAgLTMzMyw2ICszMzUsNyBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAogCQkJKGNwID09IFBNX1BST0ZJTEVfQVVUTykgPyAiYXV0byIgOgogCQkJKGNwID09IFBNX1BST0ZJTEVfTE9XKSA/ICJsb3ciIDoKKwkJCShjcCA9PSBQTV9QUk9GSUxFX01JRCkgPyAibWlkIiA6CiAJCQkoY3AgPT0gUE1fUFJPRklMRV9ISUdIKSA/ICJoaWdoIiA6ICJkZWZhdWx0Iik7CiB9CiAKQEAgLTQyMyw2ICs0MjYsODIgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihwb3dlcl9wcm9maWxlLCBTX0lSVUdPIHwgU19JV1VTUiwgcmFkZW9uX2dldF9wbV9wcm9maWxlLCByYWRlb25fc2V0X3BtX3Byb2ZpbGUpOwogc3RhdGljIERFVklDRV9BVFRSKHBvd2VyX21ldGhvZCwgU19JUlVHTyB8IFNfSVdVU1IsIHJhZGVvbl9nZXRfcG1fbWV0aG9kLCByYWRlb25fc2V0X3BtX21ldGhvZCk7CiAKK3N0YXRpYyBzc2l6ZV90IHJhZGVvbl9od21vbl9zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGRldiA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHRlbXA7CisKKwlzd2l0Y2ggKHJkZXYtPnBtLmludF90aGVybWFsX3R5cGUpIHsKKwljYXNlIFRIRVJNQUxfVFlQRV9SVjZYWDoKKwkJdGVtcCA9IHJ2Nnh4X2dldF90ZW1wKHJkZXYpOworCQlicmVhazsKKwljYXNlIFRIRVJNQUxfVFlQRV9SVjc3MDoKKwkJdGVtcCA9IHJ2NzcwX2dldF90ZW1wKHJkZXYpOworCQlicmVhazsKKwljYXNlIFRIRVJNQUxfVFlQRV9FVkVSR1JFRU46CisJCXRlbXAgPSBldmVyZ3JlZW5fZ2V0X3RlbXAocmRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRlbXAgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdGVtcCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJhZGVvbl9od21vbl9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJyYWRlb25cbiIpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCByYWRlb25faHdtb25fc2hvd190ZW1wLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgcmFkZW9uX2h3bW9uX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpod21vbl9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGh3bW9uX2F0dHJncm91cCA9IHsKKwkuYXR0cnMgPSBod21vbl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHZvaWQgcmFkZW9uX2h3bW9uX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IGVycjsKKworCXJkZXYtPnBtLmludF9od21vbl9kZXYgPSBOVUxMOworCisJc3dpdGNoIChyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlKSB7CisJY2FzZSBUSEVSTUFMX1RZUEVfUlY2WFg6CisJY2FzZSBUSEVSTUFMX1RZUEVfUlY3NzA6CisJY2FzZSBUSEVSTUFMX1RZUEVfRVZFUkdSRUVOOgorCQlyZGV2LT5wbS5pbnRfaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKHJkZXYtPmRldik7CisJCWRldl9zZXRfZHJ2ZGF0YShyZGV2LT5wbS5pbnRfaHdtb25fZGV2LCByZGV2LT5kZGV2KTsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZyZGV2LT5wbS5pbnRfaHdtb25fZGV2LT5rb2JqLAorCQkJCQkgJmh3bW9uX2F0dHJncm91cCk7CisJCWlmIChlcnIpCisJCQlEUk1fRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgaHdtb24gc3lzZnMgZmlsZTogJWRcbiIsIGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2h3bW9uX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaWYgKHJkZXYtPnBtLmludF9od21vbl9kZXYpIHsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZyZGV2LT5wbS5pbnRfaHdtb25fZGV2LT5rb2JqLCAmaHdtb25fYXR0cmdyb3VwKTsKKwkJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIocmRldi0+cG0uaW50X2h3bW9uX2Rldik7CisJfQorfQorCiB2b2lkIHJhZGVvbl9wbV9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWJvb2wgZmx1c2hfd3EgPSBmYWxzZTsKQEAgLTQ3MCw2ICs1NDksNyBAQAogCXJkZXYtPnBtLmR5bnBtX2Nhbl9kb3duY2xvY2sgPSB0cnVlOwogCXJkZXYtPnBtLmN1cnJlbnRfc2NsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKIAlyZGV2LT5wbS5jdXJyZW50X21jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9OT05FOwogCiAJaWYgKHJkZXYtPmJpb3MpIHsKIAkJaWYgKHJkZXYtPmlzX2F0b21fYmlvcykKQEAgLTQ4MCw2ICs1NjAsOCBAQAogCQlyYWRlb25fcG1faW5pdF9wcm9maWxlKHJkZXYpOwogCX0KIAorCS8qIHNldCB1cCB0aGUgaW50ZXJuYWwgdGhlcm1hbCBzZW5zb3IgaWYgYXBwbGljYWJsZSAqLworCXJhZGVvbl9od21vbl9pbml0KHJkZXYpOwogCWlmIChyZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzID4gMSkgewogCQkvKiB3aGVyZSdzIHRoZSBiZXN0IHBsYWNlIHRvIHB1dCB0aGVzZT8gKi8KIAkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKHJkZXYtPmRldiwgJmRldl9hdHRyX3Bvd2VyX3Byb2ZpbGUpOwpAQCAtNTM1LDYgKzYxNyw3IEBACiAjZW5kaWYKIAl9CiAKKwlyYWRlb25faHdtb25fZmluaShyZGV2KTsKIAlpZiAocmRldi0+cG0uaTJjX2J1cykKIAkJcmFkZW9uX2kyY19kZXN0cm95KHJkZXYtPnBtLmkyY19idXMpOwogfQpAQCAtNTc1LDcgKzY1OCw3IEBACiAJCQkJCXJhZGVvbl9wbV9nZXRfZHlucG1fc3RhdGUocmRldik7CiAJCQkJCXJhZGVvbl9wbV9zZXRfY2xvY2tzKHJkZXYpOwogCi0JCQkJCURSTV9ERUJVRygicmFkZW9uOiBkeW5hbWljIHBvd2VyIG1hbmFnZW1lbnQgZGVhY3RpdmF0ZWRcbiIpOworCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJyYWRlb246IGR5bmFtaWMgcG93ZXIgbWFuYWdlbWVudCBkZWFjdGl2YXRlZFxuIik7CiAJCQkJfQogCQkJfSBlbHNlIGlmIChyZGV2LT5wbS5hY3RpdmVfY3J0Y19jb3VudCA9PSAxKSB7CiAJCQkJLyogVE9ETzogSW5jcmVhc2UgY2xvY2tzIGlmIG5lZWRlZCBmb3IgY3VycmVudCBtb2RlICovCkBAIC01OTIsNyArNjc1LDcgQEAKIAkJCQkJcmRldi0+cG0uZHlucG1fc3RhdGUgPSBEWU5QTV9TVEFURV9BQ1RJVkU7CiAJCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhyZGV2LT53cSwgJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yaywKIAkJCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKFJBREVPTl9JRExFX0xPT1BfTVMpKTsKLQkJCQkJRFJNX0RFQlVHKCJyYWRlb246IGR5bmFtaWMgcG93ZXIgbWFuYWdlbWVudCBhY3RpdmF0ZWRcbiIpOworCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJyYWRlb246IGR5bmFtaWMgcG93ZXIgbWFuYWdlbWVudCBhY3RpdmF0ZWRcbiIpOwogCQkJCX0KIAkJCX0gZWxzZSB7IC8qIGNvdW50ID09IDAgKi8KIAkJCQlpZiAocmRldi0+cG0uZHlucG1fc3RhdGUgIT0gRFlOUE1fU1RBVEVfTUlOSU1VTSkgewpAQCAtNjg4LDcgKzc3MSw3IEBACiAJYm9vbCBpbl92YmwgPSByYWRlb25fcG1faW5fdmJsKHJkZXYpOwogCiAJaWYgKGluX3ZibCA9PSBmYWxzZSkKLQkJRFJNX0RFQlVHKCJub3QgaW4gdmJsIGZvciBwbSBjaGFuZ2UgJTA4eCBhdCAlc1xuIiwgc3RhdF9jcnRjLAorCQlEUk1fREVCVUdfRFJJVkVSKCJub3QgaW4gdmJsIGZvciBwbSBjaGFuZ2UgJTA4eCBhdCAlc1xuIiwgc3RhdF9jcnRjLAogCQkJIGZpbmlzaCA/ICJleGl0IiA6ICJlbnRyeSIpOwogCXJldHVybiBpbl92Ymw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jCmluZGV4IGU5OTE4ZDguLjg0YzUzZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jCkBAIC01OSwyOCArNTksMjggQEAKIC8qCiAgKiBHbG9iYWwgbWVtb3J5LgogICovCi1zdGF0aWMgaW50IHJhZGVvbl90dG1fbWVtX2dsb2JhbF9pbml0KHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQorc3RhdGljIGludCByYWRlb25fdHRtX21lbV9nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKIHsKIAlyZXR1cm4gdHRtX21lbV9nbG9iYWxfaW5pdChyZWYtPm9iamVjdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl90dG1fbWVtX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQorc3RhdGljIHZvaWQgcmFkZW9uX3R0bV9tZW1fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpCiB7CiAJdHRtX21lbV9nbG9iYWxfcmVsZWFzZShyZWYtPm9iamVjdCk7CiB9CiAKIHN0YXRpYyBpbnQgcmFkZW9uX3R0bV9nbG9iYWxfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKmdsb2JhbF9yZWY7CisJc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlICpnbG9iYWxfcmVmOwogCWludCByOwogCiAJcmRldi0+bW1hbi5tZW1fZ2xvYmFsX3JlZmVyZW5jZWQgPSBmYWxzZTsKIAlnbG9iYWxfcmVmID0gJnJkZXYtPm1tYW4ubWVtX2dsb2JhbF9yZWY7Ci0JZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBUVE1fR0xPQkFMX1RUTV9NRU07CisJZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBEUk1fR0xPQkFMX1RUTV9NRU07CiAJZ2xvYmFsX3JlZi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHRtX21lbV9nbG9iYWwpOwogCWdsb2JhbF9yZWYtPmluaXQgPSAmcmFkZW9uX3R0bV9tZW1fZ2xvYmFsX2luaXQ7CiAJZ2xvYmFsX3JlZi0+cmVsZWFzZSA9ICZyYWRlb25fdHRtX21lbV9nbG9iYWxfcmVsZWFzZTsKLQlyID0gdHRtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKKwlyID0gZHJtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKIAlpZiAociAhPSAwKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIG1lbW9yeSBhY2NvdW50aW5nICIKIAkJCSAgInN1YnN5c3RlbS5cbiIpOwpAQCAtOTAsMTQgKzkwLDE0IEBACiAJcmRldi0+bW1hbi5ib19nbG9iYWxfcmVmLm1lbV9nbG9iID0KIAkJcmRldi0+bW1hbi5tZW1fZ2xvYmFsX3JlZi5vYmplY3Q7CiAJZ2xvYmFsX3JlZiA9ICZyZGV2LT5tbWFuLmJvX2dsb2JhbF9yZWYucmVmOwotCWdsb2JhbF9yZWYtPmdsb2JhbF90eXBlID0gVFRNX0dMT0JBTF9UVE1fQk87CisJZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBEUk1fR0xPQkFMX1RUTV9CTzsKIAlnbG9iYWxfcmVmLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0dG1fYm9fZ2xvYmFsKTsKIAlnbG9iYWxfcmVmLT5pbml0ID0gJnR0bV9ib19nbG9iYWxfaW5pdDsKIAlnbG9iYWxfcmVmLT5yZWxlYXNlID0gJnR0bV9ib19nbG9iYWxfcmVsZWFzZTsKLQlyID0gdHRtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKKwlyID0gZHJtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKIAlpZiAociAhPSAwKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIEJPIHN1YnN5c3RlbS5cbiIpOwotCQl0dG1fZ2xvYmFsX2l0ZW1fdW5yZWYoJnJkZXYtPm1tYW4ubWVtX2dsb2JhbF9yZWYpOworCQlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJnJkZXYtPm1tYW4ubWVtX2dsb2JhbF9yZWYpOwogCQlyZXR1cm4gcjsKIAl9CiAKQEAgLTEwOCw4ICsxMDgsOCBAQAogc3RhdGljIHZvaWQgcmFkZW9uX3R0bV9nbG9iYWxfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpZiAocmRldi0+bW1hbi5tZW1fZ2xvYmFsX3JlZmVyZW5jZWQpIHsKLQkJdHRtX2dsb2JhbF9pdGVtX3VucmVmKCZyZGV2LT5tbWFuLmJvX2dsb2JhbF9yZWYucmVmKTsKLQkJdHRtX2dsb2JhbF9pdGVtX3VucmVmKCZyZGV2LT5tbWFuLm1lbV9nbG9iYWxfcmVmKTsKKwkJZHJtX2dsb2JhbF9pdGVtX3VucmVmKCZyZGV2LT5tbWFuLmJvX2dsb2JhbF9yZWYucmVmKTsKKwkJZHJtX2dsb2JhbF9pdGVtX3VucmVmKCZyZGV2LT5tbWFuLm1lbV9nbG9iYWxfcmVmKTsKIAkJcmRldi0+bW1hbi5tZW1fZ2xvYmFsX3JlZmVyZW5jZWQgPSBmYWxzZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3IzMDAgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3IzMDAKaW5kZXggMWU5N2IyZC4uYjUwNmVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yMzAwCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjMwMApAQCAtMTg3LDcgKzE4Nyw2IEBACiAweDQzNjQgUlNfSU5TVF8xMwogMHg0MzY4IFJTX0lOU1RfMTQKIDB4NDM2QyBSU19JTlNUXzE1Ci0weDQzQTQgU0NfSFlQRVJaX0VOCiAweDQzQTggU0NfRURHRVJVTEUKIDB4NDNCMCBTQ19DTElQXzBfQQogMHg0M0I0IFNDX0NMSVBfMF9CCkBAIC03MTYsMTYgKzcxNSw0IEBACiAweDRGMDggWkJfU1RFTkNJTFJFRk1BU0sKIDB4NEYxNCBaQl9aVE9QCiAweDRGMTggWkJfWkNBQ0hFX0NUTFNUQVQKLTB4NEYxQyBaQl9CV19DTlRMCi0weDRGMjggWkJfREVQVEhDTEVBUlZBTFVFCi0weDRGMzAgWkJfWk1BU0tfT0ZGU0VUCi0weDRGMzQgWkJfWk1BU0tfUElUQ0gKLTB4NEYzOCBaQl9aTUFTS19XUklOREVYCi0weDRGM0MgWkJfWk1BU0tfRFdPUkQKLTB4NEY0MCBaQl9aTUFTS19SRElOREVYCi0weDRGNDQgWkJfSElaX09GRlNFVAotMHg0RjQ4IFpCX0hJWl9XUklOREVYCi0weDRGNEMgWkJfSElaX0RXT1JECi0weDRGNTAgWkJfSElaX1JESU5ERVgKLTB4NEY1NCBaQl9ISVpfUElUQ0gKIDB4NEY1OCBaQl9aUEFTU19EQVRBCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I0MjAgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I0MjAKaW5kZXggZTk1ODk4MC4uOGMxMjE0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNDIwCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjQyMApAQCAtMTMwLDYgKzEzMCw3IEBACiAweDQwMUMgR0JfU0VMRUNUCiAweDQwMjAgR0JfQUFfQ09ORklHCiAweDQwMjQgR0JfRklGT19TSVpFCisweDQwMjggR0JfWl9QRVFfQ09ORklHCiAweDQxMDAgVFhfSU5WQUxUQUdTCiAweDQyMDAgR0FfUE9JTlRfUzAKIDB4NDIwNCBHQV9QT0lOVF9UMApAQCAtMTg3LDcgKzE4OCw2IEBACiAweDQzNjQgUlNfSU5TVF8xMwogMHg0MzY4IFJTX0lOU1RfMTQKIDB4NDM2QyBSU19JTlNUXzE1Ci0weDQzQTQgU0NfSFlQRVJaX0VOCiAweDQzQTggU0NfRURHRVJVTEUKIDB4NDNCMCBTQ19DTElQXzBfQQogMHg0M0I0IFNDX0NMSVBfMF9CCkBAIC03ODIsMTYgKzc4Miw0IEBACiAweDRGMDggWkJfU1RFTkNJTFJFRk1BU0sKIDB4NEYxNCBaQl9aVE9QCiAweDRGMTggWkJfWkNBQ0hFX0NUTFNUQVQKLTB4NEYxQyBaQl9CV19DTlRMCi0weDRGMjggWkJfREVQVEhDTEVBUlZBTFVFCi0weDRGMzAgWkJfWk1BU0tfT0ZGU0VUCi0weDRGMzQgWkJfWk1BU0tfUElUQ0gKLTB4NEYzOCBaQl9aTUFTS19XUklOREVYCi0weDRGM0MgWkJfWk1BU0tfRFdPUkQKLTB4NEY0MCBaQl9aTUFTS19SRElOREVYCi0weDRGNDQgWkJfSElaX09GRlNFVAotMHg0RjQ4IFpCX0hJWl9XUklOREVYCi0weDRGNEMgWkJfSElaX0RXT1JECi0weDRGNTAgWkJfSElaX1JESU5ERVgKLTB4NEY1NCBaQl9ISVpfUElUQ0gKIDB4NEY1OCBaQl9aUEFTU19EQVRBCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3JzNjAwIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yczYwMAppbmRleCA4M2U4YmMwLi4wODI4ZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3JzNjAwCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcnM2MDAKQEAgLTE4Nyw3ICsxODcsNiBAQAogMHg0MzY0IFJTX0lOU1RfMTMKIDB4NDM2OCBSU19JTlNUXzE0CiAweDQzNkMgUlNfSU5TVF8xNQotMHg0M0E0IFNDX0hZUEVSWl9FTgogMHg0M0E4IFNDX0VER0VSVUxFCiAweDQzQjAgU0NfQ0xJUF8wX0EKIDB4NDNCNCBTQ19DTElQXzBfQgpAQCAtNzgyLDE2ICs3ODEsNCBAQAogMHg0RjA4IFpCX1NURU5DSUxSRUZNQVNLCiAweDRGMTQgWkJfWlRPUAogMHg0RjE4IFpCX1pDQUNIRV9DVExTVEFUCi0weDRGMUMgWkJfQldfQ05UTAotMHg0RjI4IFpCX0RFUFRIQ0xFQVJWQUxVRQotMHg0RjMwIFpCX1pNQVNLX09GRlNFVAotMHg0RjM0IFpCX1pNQVNLX1BJVENICi0weDRGMzggWkJfWk1BU0tfV1JJTkRFWAotMHg0RjNDIFpCX1pNQVNLX0RXT1JECi0weDRGNDAgWkJfWk1BU0tfUkRJTkRFWAotMHg0RjQ0IFpCX0hJWl9PRkZTRVQKLTB4NEY0OCBaQl9ISVpfV1JJTkRFWAotMHg0RjRDIFpCX0hJWl9EV09SRAotMHg0RjUwIFpCX0hJWl9SRElOREVYCi0weDRGNTQgWkJfSElaX1BJVENICiAweDRGNTggWkJfWlBBU1NfREFUQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9ydjUxNSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcnY1MTUKaW5kZXggMWU0NjIzMy4uODI5Mzg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9ydjUxNQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3J2NTE1CkBAIC0yMzUsNyArMjM1LDYgQEAKIDB4NDM1NCBSU19JTlNUXzEzCiAweDQzNTggUlNfSU5TVF8xNAogMHg0MzVDIFJTX0lOU1RfMTUKLTB4NDNBNCBTQ19IWVBFUlpfRU4KIDB4NDNBOCBTQ19FREdFUlVMRQogMHg0M0IwIFNDX0NMSVBfMF9BCiAweDQzQjQgU0NfQ0xJUF8wX0IKQEAgLTQ3OSwxNyArNDc4LDUgQEAKIDB4NEYwOCBaQl9TVEVOQ0lMUkVGTUFTSwogMHg0RjE0IFpCX1pUT1AKIDB4NEYxOCBaQl9aQ0FDSEVfQ1RMU1RBVAotMHg0RjFDIFpCX0JXX0NOVEwKLTB4NEYyOCBaQl9ERVBUSENMRUFSVkFMVUUKLTB4NEYzMCBaQl9aTUFTS19PRkZTRVQKLTB4NEYzNCBaQl9aTUFTS19QSVRDSAotMHg0RjM4IFpCX1pNQVNLX1dSSU5ERVgKLTB4NEYzQyBaQl9aTUFTS19EV09SRAotMHg0RjQwIFpCX1pNQVNLX1JESU5ERVgKLTB4NEY0NCBaQl9ISVpfT0ZGU0VUCi0weDRGNDggWkJfSElaX1dSSU5ERVgKLTB4NEY0QyBaQl9ISVpfRFdPUkQKLTB4NEY1MCBaQl9ISVpfUkRJTkRFWAotMHg0RjU0IFpCX0hJWl9QSVRDSAogMHg0RjU4IFpCX1pQQVNTX0RBVEEKIDB4NEZENCBaQl9TVEVOQ0lMUkVGTUFTS19CRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCmluZGV4IGY0NTRjOWEuLmFlMmI3NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKQEAgLTU1LDE0ICs1NSw2IEBACiAJCXJkZXYtPm1jLmd0dF9zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKIAkJcmV0dXJuOwogCX0KLQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUlM0MDAgfHwgcmRldi0+ZmFtaWx5ID09IENISVBfUlM0ODApIHsKLQkJLyogRklYTUU6IFJTNDAwICYgUlM0ODAgc2VlbXMgdG8gaGF2ZSBpc3N1ZSB3aXRoIEdBUlQgc2l6ZQotCQkgKiBpZiA0RyBvZiBzeXN0ZW0gbWVtb3J5IChuZWVkcyBtb3JlIHRlc3RpbmcpCi0JCSAqLwotCQkvKiBYWFggaXMgdGhpcyBzdGlsbCBhbiBpc3N1ZSB3aXRoIHByb3BlciBhbGlnbm1lbnQ/ICovCi0JCXJkZXYtPm1jLmd0dF9zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKLQkJRFJNX0VSUk9SKCJGb3JjaW5nIHRvIDMyTSBHQVJUIHNpemUgKGJlY2F1c2Ugb2YgQVNJQyBidWcgPylcbiIpOwotCX0KIH0KIAogdm9pZCByczQwMF9nYXJ0X3RsYl9mbHVzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTQ4Myw2ICs0NzUsOCBAQAogCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KIAlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOwogCS8qIFRPRE86IGRpc2FibGUgVkdBIG5lZWQgdG8gdXNlIFZHQSByZXF1ZXN0ICovCisJLyogcmVzdG9yZSBzb21lIHJlZ2lzdGVyIHRvIHNhbmUgZGVmYXVsdHMgKi8KKwlyMTAwX3Jlc3RvcmVfc2FuaXR5KHJkZXYpOwogCS8qIEJJT1MqLwogCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7CiAJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCmluZGV4IDZkYzE1ZWEuLmNjMDViMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTY4Niw4ICs2ODYsOCBAQAogewogCXU2NCBiYXNlOwogCi0JcmRldi0+bWMuYXBlcl9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChyZGV2LT5kZGV2LCAwKTsKLQlyZGV2LT5tYy5hcGVyX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihyZGV2LT5kZGV2LCAwKTsKKwlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocmRldi0+cGRldiwgMCk7CisJcmRldi0+bWMuYXBlcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCAwKTsKIAlyZGV2LT5tYy52cmFtX2lzX2RkciA9IHRydWU7CiAJcmRldi0+bWMudnJhbV93aWR0aCA9IDEyODsKIAlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihSQURFT05fQ09ORklHX01FTVNJWkUpOwpAQCAtNjk2LDcgKzY5Niw2IEBACiAJcmRldi0+bWMuaWdwX3NpZGVwb3J0X2VuYWJsZWQgPSByYWRlb25fYXRvbWJpb3Nfc2lkZXBvcnRfcHJlc2VudChyZGV2KTsKIAliYXNlID0gUlJFRzMyX01DKFJfMDAwMDA0X01DX0ZCX0xPQ0FUSU9OKTsKIAliYXNlID0gR18wMDAwMDRfTUNfRkJfU1RBUlQoYmFzZSkgPDwgMTY7Ci0JcmRldi0+bWMuaWdwX3NpZGVwb3J0X2VuYWJsZWQgPSByYWRlb25fYXRvbWJpb3Nfc2lkZXBvcnRfcHJlc2VudChyZGV2KTsKIAlyYWRlb25fdnJhbV9sb2NhdGlvbihyZGV2LCAmcmRldi0+bWMsIGJhc2UpOwogCXJkZXYtPm1jLmd0dF9iYXNlX2FsaWduID0gMDsKIAlyYWRlb25fZ3R0X2xvY2F0aW9uKHJkZXYsICZyZGV2LT5tYyk7CkBAIC04MTMsNiArODEyLDEzIEBACiAJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgKCVkKS5cbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9CisKKwlyID0gcjYwMF9hdWRpb19pbml0KHJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGVkIGluaXRpYWxpemluZyBhdWRpb1xuIik7CisJCXJldHVybiByOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC04MzksNiArODQ1LDcgQEAKIAogaW50IHJzNjAwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcjYwMF9hdWRpb19maW5pKHJkZXYpOwogCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKIAlyMTAwX3diX2Rpc2FibGUocmRldik7CiAJcnM2MDBfaXJxX2Rpc2FibGUocmRldik7CkBAIC04NDgsNiArODU1LDcgQEAKIAogdm9pZCByczYwMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXI2MDBfYXVkaW9fZmluaShyZGV2KTsKIAlyMTAwX2NwX2ZpbmkocmRldik7CiAJcjEwMF93Yl9maW5pKHJkZXYpOwogCXIxMDBfaWJfZmluaShyZGV2KTsKQEAgLTg3MSw2ICs4NzksOCBAQAogCXJhZGVvbl9zY3JhdGNoX2luaXQocmRldik7CiAJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLwogCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CisJLyogcmVzdG9yZSBzb21lIHJlZ2lzdGVyIHRvIHNhbmUgZGVmYXVsdHMgKi8KKwlyMTAwX3Jlc3RvcmVfc2FuaXR5KHJkZXYpOwogCS8qIEJJT1MgKi8KIAlpZiAoIXJhZGVvbl9nZXRfYmlvcyhyZGV2KSkgewogCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2OTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2OTAuYwppbmRleCBjZTRlY2JlLi4zZTNmNzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MC5jCkBAIC0xNTQsMTMgKzE1NCwxMyBAQAogCXJkZXYtPm1jLnZyYW1fd2lkdGggPSAxMjg7CiAJcmRldi0+bWMucmVhbF92cmFtX3NpemUgPSBSUkVHMzIoUkFERU9OX0NPTkZJR19NRU1TSVpFKTsKIAlyZGV2LT5tYy5tY192cmFtX3NpemUgPSByZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZTsKLQlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHJkZXYtPmRkZXYsIDApOwotCXJkZXYtPm1jLmFwZXJfc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKHJkZXYtPmRkZXYsIDApOworCXJkZXYtPm1jLmFwZXJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChyZGV2LT5wZGV2LCAwKTsKKwlyZGV2LT5tYy5hcGVyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHJkZXYtPnBkZXYsIDApOwogCXJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplID0gcmRldi0+bWMuYXBlcl9zaXplOwogCWJhc2UgPSBSUkVHMzJfTUMoUl8wMDAxMDBfTUNDRkdfRkJfTE9DQVRJT04pOwogCWJhc2UgPSBHXzAwMDEwMF9NQ19GQl9TVEFSVChiYXNlKSA8PCAxNjsKLQlyczY5MF9wbV9pbmZvKHJkZXYpOwogCXJkZXYtPm1jLmlncF9zaWRlcG9ydF9lbmFibGVkID0gcmFkZW9uX2F0b21iaW9zX3NpZGVwb3J0X3ByZXNlbnQocmRldik7CisJcnM2OTBfcG1faW5mbyhyZGV2KTsKIAlyYWRlb25fdnJhbV9sb2NhdGlvbihyZGV2LCAmcmRldi0+bWMsIGJhc2UpOwogCXJkZXYtPm1jLmd0dF9iYXNlX2FsaWduID0gcmRldi0+bWMuZ3R0X3NpemUgLSAxOwogCXJhZGVvbl9ndHRfbG9jYXRpb24ocmRldiwgJnJkZXYtPm1jKTsKQEAgLTM5OCw3ICszOTgsOSBAQAogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlMSA9IE5VTEw7CiAJc3RydWN0IHJzNjkwX3dhdGVybWFyayB3bTA7CiAJc3RydWN0IHJzNjkwX3dhdGVybWFyayB3bTE7Ci0JdTMyIHRtcCwgZDFtb2RlX3ByaW9yaXR5X2FfY250LCBkMm1vZGVfcHJpb3JpdHlfYV9jbnQ7CisJdTMyIHRtcDsKKwl1MzIgZDFtb2RlX3ByaW9yaXR5X2FfY250ID0gU18wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX0FfT0ZGKDEpOworCXUzMiBkMm1vZGVfcHJpb3JpdHlfYV9jbnQgPSBTXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9PRkYoMSk7CiAJZml4ZWQyMF8xMiBwcmlvcml0eV9tYXJrMDIsIHByaW9yaXR5X21hcmsxMiwgZmlsbF9yYXRlOwogCWZpeGVkMjBfMTIgYSwgYjsKIApAQCAtNDk1LDEwICs0OTcsNiBAQAogCQkJZDFtb2RlX3ByaW9yaXR5X2FfY250IHw9IFNfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0FMV0FZU19PTigxKTsKIAkJCWQybW9kZV9wcmlvcml0eV9hX2NudCB8PSBTXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfQV9BTFdBWVNfT04oMSk7CiAJCX0KLQkJV1JFRzMyKFJfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0NOVCwgZDFtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKFJfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9CX0NOVCwgZDFtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKFJfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKFJfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKIAl9IGVsc2UgaWYgKG1vZGUwKSB7CiAJCWlmIChkZml4ZWRfdHJ1bmMod20wLmRicHApID4gNjQpCiAJCQlhLmZ1bGwgPSBkZml4ZWRfbXVsKHdtMC5kYnBwLCB3bTAubnVtX2xpbmVfcGFpcik7CkBAIC01MjgsMTMgKzUyNiw3IEBACiAJCWQxbW9kZV9wcmlvcml0eV9hX2NudCA9IGRmaXhlZF90cnVuYyhwcmlvcml0eV9tYXJrMDIpOwogCQlpZiAocmRldi0+ZGlzcF9wcmlvcml0eSA9PSAyKQogCQkJZDFtb2RlX3ByaW9yaXR5X2FfY250IHw9IFNfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0FMV0FZU19PTigxKTsKLQkJV1JFRzMyKFJfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0NOVCwgZDFtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKFJfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9CX0NOVCwgZDFtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKFJfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0NOVCwKLQkJCVNfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX09GRigxKSk7Ci0JCVdSRUczMihSXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9DTlQsCi0JCQlTXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9PRkYoMSkpOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtb2RlMSkgewogCQlpZiAoZGZpeGVkX3RydW5jKHdtMS5kYnBwKSA+IDY0KQogCQkJYS5mdWxsID0gZGZpeGVkX211bCh3bTEuZGJwcCwgd20xLm51bV9saW5lX3BhaXIpOwogCQllbHNlCkBAIC01NjMsMTMgKzU1NSwxMiBAQAogCQlkMm1vZGVfcHJpb3JpdHlfYV9jbnQgPSBkZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazEyKTsKIAkJaWYgKHJkZXYtPmRpc3BfcHJpb3JpdHkgPT0gMikKIAkJCWQybW9kZV9wcmlvcml0eV9hX2NudCB8PSBTXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfQV9BTFdBWVNfT04oMSk7Ci0JCVdSRUczMihSXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9DTlQsCi0JCQlTXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9PRkYoMSkpOwotCQlXUkVHMzIoUl8wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfQ05ULAotCQkJU18wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfT0ZGKDEpKTsKLQkJV1JFRzMyKFJfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKFJfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKIAl9CisKKwlXUkVHMzIoUl8wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX0FfQ05ULCBkMW1vZGVfcHJpb3JpdHlfYV9jbnQpOworCVdSRUczMihSXzAwNjU0Q19EMU1PREVfUFJJT1JJVFlfQl9DTlQsIGQxbW9kZV9wcmlvcml0eV9hX2NudCk7CisJV1JFRzMyKFJfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKKwlXUkVHMzIoUl8wMDZENENfRDJNT0RFX1BSSU9SSVRZX0JfQ05ULCBkMm1vZGVfcHJpb3JpdHlfYV9jbnQpOwogfQogCiB1aW50MzJfdCByczY5MF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpCkBAIC02NDEsNiArNjMyLDEzIEBACiAJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgKCVkKS5cbiIsIHIpOwogCQlyZXR1cm4gcjsKIAl9CisKKwlyID0gcjYwMF9hdWRpb19pbml0KHJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGVkIGluaXRpYWxpemluZyBhdWRpb1xuIik7CisJCXJldHVybiByOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC02NjcsNiArNjY1LDcgQEAKIAogaW50IHJzNjkwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CisJcjYwMF9hdWRpb19maW5pKHJkZXYpOwogCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKIAlyMTAwX3diX2Rpc2FibGUocmRldik7CiAJcnM2MDBfaXJxX2Rpc2FibGUocmRldik7CkBAIC02NzYsNiArNjc1LDcgQEAKIAogdm9pZCByczY5MF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCXI2MDBfYXVkaW9fZmluaShyZGV2KTsKIAlyMTAwX2NwX2ZpbmkocmRldik7CiAJcjEwMF93Yl9maW5pKHJkZXYpOwogCXIxMDBfaWJfZmluaShyZGV2KTsKQEAgLTY5OSw2ICs2OTksOCBAQAogCXJhZGVvbl9zY3JhdGNoX2luaXQocmRldik7CiAJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLwogCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CisJLyogcmVzdG9yZSBzb21lIHJlZ2lzdGVyIHRvIHNhbmUgZGVmYXVsdHMgKi8KKwlyMTAwX3Jlc3RvcmVfc2FuaXR5KHJkZXYpOwogCS8qIFRPRE86IGRpc2FibGUgVkdBIG5lZWQgdG8gdXNlIFZHQSByZXF1ZXN0ICovCiAJLyogQklPUyovCiAJaWYgKCFyYWRlb25fZ2V0X2Jpb3MocmRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTUuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTUuYwppbmRleCAwYzljMTY5Li40ZDZlODYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjUxNS5jCkBAIC00NjksNiArNDY5LDggQEAKIAkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCiAJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKIAkvKiBUT0RPOiBkaXNhYmxlIFZHQSBuZWVkIHRvIHVzZSBWR0EgcmVxdWVzdCAqLworCS8qIHJlc3RvcmUgc29tZSByZWdpc3RlciB0byBzYW5lIGRlZmF1bHRzICovCisJcjEwMF9yZXN0b3JlX3Nhbml0eShyZGV2KTsKIAkvKiBCSU9TKi8KIAlpZiAoIXJhZGVvbl9nZXRfYmlvcyhyZGV2KSkgewogCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKQEAgLTkyNSw3ICs5MjcsOSBAQAogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlMSA9IE5VTEw7CiAJc3RydWN0IHJ2NTE1X3dhdGVybWFyayB3bTA7CiAJc3RydWN0IHJ2NTE1X3dhdGVybWFyayB3bTE7Ci0JdTMyIHRtcCwgZDFtb2RlX3ByaW9yaXR5X2FfY250LCBkMm1vZGVfcHJpb3JpdHlfYV9jbnQ7CisJdTMyIHRtcDsKKwl1MzIgZDFtb2RlX3ByaW9yaXR5X2FfY250ID0gTU9ERV9QUklPUklUWV9PRkY7CisJdTMyIGQybW9kZV9wcmlvcml0eV9hX2NudCA9IE1PREVfUFJJT1JJVFlfT0ZGOwogCWZpeGVkMjBfMTIgcHJpb3JpdHlfbWFyazAyLCBwcmlvcml0eV9tYXJrMTIsIGZpbGxfcmF0ZTsKIAlmaXhlZDIwXzEyIGEsIGI7CiAKQEAgLTk5OSwxMCArMTAwMyw2IEBACiAJCQlkMW1vZGVfcHJpb3JpdHlfYV9jbnQgfD0gTU9ERV9QUklPUklUWV9BTFdBWVNfT047CiAJCQlkMm1vZGVfcHJpb3JpdHlfYV9jbnQgfD0gTU9ERV9QUklPUklUWV9BTFdBWVNfT047CiAJCX0KLQkJV1JFRzMyKEQxTU9ERV9QUklPUklUWV9BX0NOVCwgZDFtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKEQxTU9ERV9QUklPUklUWV9CX0NOVCwgZDFtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9BX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9CX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKIAl9IGVsc2UgaWYgKG1vZGUwKSB7CiAJCWlmIChkZml4ZWRfdHJ1bmMod20wLmRicHApID4gNjQpCiAJCQlhLmZ1bGwgPSBkZml4ZWRfZGl2KHdtMC5kYnBwLCB3bTAubnVtX2xpbmVfcGFpcik7CkBAIC0xMDMyLDExICsxMDMyLDcgQEAKIAkJZDFtb2RlX3ByaW9yaXR5X2FfY250ID0gZGZpeGVkX3RydW5jKHByaW9yaXR5X21hcmswMik7CiAJCWlmIChyZGV2LT5kaXNwX3ByaW9yaXR5ID09IDIpCiAJCQlkMW1vZGVfcHJpb3JpdHlfYV9jbnQgfD0gTU9ERV9QUklPUklUWV9BTFdBWVNfT047Ci0JCVdSRUczMihEMU1PREVfUFJJT1JJVFlfQV9DTlQsIGQxbW9kZV9wcmlvcml0eV9hX2NudCk7Ci0JCVdSRUczMihEMU1PREVfUFJJT1JJVFlfQl9DTlQsIGQxbW9kZV9wcmlvcml0eV9hX2NudCk7Ci0JCVdSRUczMihEMk1PREVfUFJJT1JJVFlfQV9DTlQsIE1PREVfUFJJT1JJVFlfT0ZGKTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9CX0NOVCwgTU9ERV9QUklPUklUWV9PRkYpOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtb2RlMSkgewogCQlpZiAoZGZpeGVkX3RydW5jKHdtMS5kYnBwKSA+IDY0KQogCQkJYS5mdWxsID0gZGZpeGVkX2Rpdih3bTEuZGJwcCwgd20xLm51bV9saW5lX3BhaXIpOwogCQllbHNlCkBAIC0xMDY1LDExICsxMDYxLDEyIEBACiAJCWQybW9kZV9wcmlvcml0eV9hX2NudCA9IGRmaXhlZF90cnVuYyhwcmlvcml0eV9tYXJrMTIpOwogCQlpZiAocmRldi0+ZGlzcF9wcmlvcml0eSA9PSAyKQogCQkJZDJtb2RlX3ByaW9yaXR5X2FfY250IHw9IE1PREVfUFJJT1JJVFlfQUxXQVlTX09OOwotCQlXUkVHMzIoRDFNT0RFX1BSSU9SSVRZX0FfQ05ULCBNT0RFX1BSSU9SSVRZX09GRik7Ci0JCVdSRUczMihEMU1PREVfUFJJT1JJVFlfQl9DTlQsIE1PREVfUFJJT1JJVFlfT0ZGKTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9BX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9CX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKIAl9CisKKwlXUkVHMzIoRDFNT0RFX1BSSU9SSVRZX0FfQ05ULCBkMW1vZGVfcHJpb3JpdHlfYV9jbnQpOworCVdSRUczMihEMU1PREVfUFJJT1JJVFlfQl9DTlQsIGQxbW9kZV9wcmlvcml0eV9hX2NudCk7CisJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9BX0NOVCwgZDJtb2RlX3ByaW9yaXR5X2FfY250KTsKKwlXUkVHMzIoRDJNT0RFX1BSSU9SSVRZX0JfQ05ULCBkMm1vZGVfcHJpb3JpdHlfYV9jbnQpOwogfQogCiB2b2lkIHJ2NTE1X2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKaW5kZXggYjdmZDgyMC4uZjFjNzk2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKQEAgLTQyLDYgKzQyLDIxIEBACiBzdGF0aWMgdm9pZCBydjc3MF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJ2NzcwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCisvKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICovCit1MzIgcnY3NzBfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHRlbXAgPSAoUlJFRzMyKENHX01VTFRfVEhFUk1BTF9TVEFUVVMpICYgQVNJQ19UX01BU0spID4+CisJCUFTSUNfVF9TSElGVDsKKwl1MzIgYWN0dWFsX3RlbXAgPSAwOworCisJaWYgKCh0ZW1wID4+IDkpICYgMSkKKwkJYWN0dWFsX3RlbXAgPSAwOworCWVsc2UKKwkJYWN0dWFsX3RlbXAgPSAodGVtcCA+PiAxKSAmIDB4ZmY7CisKKwlyZXR1cm4gYWN0dWFsX3RlbXAgKiAxMDAwOworfQorCiB2b2lkIHJ2NzcwX3BtX21pc2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHJlcV9wc19pZHggPSByZGV2LT5wbS5yZXF1ZXN0ZWRfcG93ZXJfc3RhdGVfaW5kZXg7CkBAIC0xODksNyArMjA0LDEwIEBACiAJCVdSRUczMigoMHgyYzIwICsgaiksIDB4MDAwMDAwMDApOwogCQlXUkVHMzIoKDB4MmMyNCArIGopLCAweDAwMDAwMDAwKTsKIAl9Ci0JV1JFRzMyKEhEUF9SRUdfQ09IRVJFTkNZX0ZMVVNIX0NOVEwsIDApOworCS8qIHI3eHggaHcgYnVnLiAgUmVhZCBmcm9tIEhEUF9ERUJVRzEgcmF0aGVyCisJICogdGhhbiB3cml0aW5nIHRvIEhEUF9SRUdfQ09IRVJFTkNZX0ZMVVNIX0NOVEwKKwkgKi8KKwl0bXAgPSBSUkVHMzIoSERQX0RFQlVHMSk7CiAKIAlydjUxNV9tY19zdG9wKHJkZXYsICZzYXZlKTsKIAlpZiAocjYwMF9tY193YWl0X2Zvcl9pZGxlKHJkZXYpKSB7CkBAIC02NTksOCArNjc3LDkgQEAKIAkJCQkJCQkJIHI2MDBfY291bnRfcGlwZV9iaXRzKChjY19yYl9iYWNrZW5kX2Rpc2FibGUgJgogCQkJCQkJCQkJCSAgICAgICBSN1hYX01BWF9CQUNLRU5EU19NQVNLKSA+PiAxNikpLAogCQkJCQkJCQkoY2NfcmJfYmFja2VuZF9kaXNhYmxlID4+IDE2KSk7Ci0JZ2JfdGlsaW5nX2NvbmZpZyB8PSBCQUNLRU5EX01BUChiYWNrZW5kX21hcCk7CiAKKwlyZGV2LT5jb25maWcucnY3NzAudGlsZV9jb25maWcgPSBnYl90aWxpbmdfY29uZmlnOworCWdiX3RpbGluZ19jb25maWcgfD0gQkFDS0VORF9NQVAoYmFja2VuZF9tYXApOwogCiAJV1JFRzMyKEdCX1RJTElOR19DT05GSUcsIGdiX3RpbGluZ19jb25maWcpOwogCVdSRUczMihEQ1BfVElMSU5HX0NPTkZJRywgKGdiX3RpbGluZ19jb25maWcgJiAweGZmZmYpKTsKQEAgLTkxOSw4ICs5MzgsOCBAQAogCX0KIAlyZGV2LT5tYy52cmFtX3dpZHRoID0gbnVtY2hhbiAqIGNoYW5zaXplOwogCS8qIENvdWxkIGFwZXIgc2l6ZSByZXBvcnQgMCA/ICovCi0JcmRldi0+bWMuYXBlcl9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChyZGV2LT5kZGV2LCAwKTsKLQlyZGV2LT5tYy5hcGVyX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihyZGV2LT5kZGV2LCAwKTsKKwlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocmRldi0+cGRldiwgMCk7CisJcmRldi0+bWMuYXBlcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCAwKTsKIAkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCiAJcmRldi0+bWMubWNfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKTsKIAlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MGQuaAppbmRleCA5NTA2ZjhjLi5iN2E1YTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBkLmgKQEAgLTEyMiwxMiArMTIyLDE4IEBACiAjZGVmaW5lCQlHVUlfQUNUSVZFCQkJCQkoMTw8MzEpCiAjZGVmaW5lCUdSQk1fU1RBVFVTMgkJCQkJMHg4MDE0CiAKKyNkZWZpbmUJQ0dfTVVMVF9USEVSTUFMX1NUQVRVUwkJCQkweDc0MAorI2RlZmluZQkJQVNJQ19UKHgpCQkJICAgICAgICAoKHgpIDw8IDE2KQorI2RlZmluZQkJQVNJQ19UX01BU0sJCQkgICAgICAgIDB4M0ZGMDAwMAorI2RlZmluZQkJQVNJQ19UX1NISUZUCQkJICAgICAgICAxNgorCiAjZGVmaW5lCUhEUF9IT1NUX1BBVEhfQ05UTAkJCQkweDJDMDAKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfQkFTRQkJCQkweDJDMDQKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfSU5GTwkJCQkweDJDMDgKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfU0laRQkJCQkweDJDMEMKICNkZWZpbmUgSERQX1JFR19DT0hFUkVOQ1lfRkxVU0hfQ05UTAkJCTB4NTRBMAogI2RlZmluZQlIRFBfVElMSU5HX0NPTkZJRwkJCQkweDJGM0MKKyNkZWZpbmUgSERQX0RFQlVHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyRjM0CiAKICNkZWZpbmUgTUNfU0hBUkVEX0NITUFQCQkJCQkJMHgyMDA0CiAjZGVmaW5lCQlOT09GQ0hBTl9TSElGVAkJCQkJMTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2JjaS5jIGIvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMKaW5kZXggMmQwYzljYS4uOTc2ZGM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogCiAKIC8qCi0gKiBJbml0YWxpemUgbWFwcGluZ3MuIE9uIFNhdmFnZTQgYW5kIFNhdmFnZUlYIHRoZSBhbGlnbm1lbnQKKyAqIEluaXRpYWxpemUgbWFwcGluZ3MuIE9uIFNhdmFnZTQgYW5kIFNhdmFnZUlYIHRoZSBhbGlnbm1lbnQKICAqIGFuZCBzaXplIG9mIHRoZSBhcGVydHVyZSBpcyBub3Qgc3VpdGFibGUgZm9yIGF1dG9tYXRpYyBNVFJSIHNldHVwCiAgKiBpbiBkcm1fYWRkbWFwLiBUaGVyZWZvcmUgd2UgYWRkIHRoZW0gbWFudWFsbHkgYmVmb3JlIHRoZSBtYXBzIGFyZQogICogaW5pdGlhbGl6ZWQsIGFuZCB0ZWFyIHRoZW0gZG93biBvbiBsYXN0IGNsb3NlLgpAQCAtNTczLDEzICs1NzMsMTMgQEAKIAlkZXZfcHJpdi0+bXRyclsyXS5oYW5kbGUgPSAtMTsKIAlpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgewogCQlmYl9yc3JjID0gMDsKLQkJZmJfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwkJZmJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApOwogCQlmYl9zaXplID0gU0FWQUdFX0ZCX1NJWkVfUzM7CiAJCW1taW9fYmFzZSA9IGZiX2Jhc2UgKyBTQVZBR0VfRkJfU0laRV9TMzsKIAkJYXBlcl9yc3JjID0gMDsKIAkJYXBlcnR1cmVfYmFzZSA9IGZiX2Jhc2UgKyBTQVZBR0VfQVBFUlRVUkVfT0ZGU0VUOwogCQkvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSAqLwotCQlpZiAoZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAwKSA9PSAweDA4MDAwMDAwKSB7CisJCWlmIChwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkgPT0gMHgwODAwMDAwMCkgewogCQkJLyogRG9uJ3QgbWFrZSBNTUlPIHdyaXRlLWNvYmluaW5nISBXZSBuZWVkIDMKIAkJCSAqIE1UUlJzLiAqLwogCQkJZGV2X3ByaXYtPm10cnJbMF0uYmFzZSA9IGZiX2Jhc2U7CkBAIC01OTksMTggKzU5OSwxOSBAQAogCQkJCQkgZGV2X3ByaXYtPm10cnJbMl0uc2l6ZSwgRFJNX01UUlJfV0MpOwogCQl9IGVsc2UgewogCQkJRFJNX0VSUk9SKCJzdHJhbmdlIHBjaV9yZXNvdXJjZV9sZW4gJTA4bGx4XG4iLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkpOwogCQl9CiAJfSBlbHNlIGlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSBTM19TVVBFUlNBVkFHRSAmJgogCQkgICBkZXZfcHJpdi0+Y2hpcHNldCAhPSBTM19TQVZBR0UyMDAwKSB7Ci0JCW1taW9fYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwkJbW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCk7CiAJCWZiX3JzcmMgPSAxOwotCQlmYl9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpOworCQlmYl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CiAJCWZiX3NpemUgPSBTQVZBR0VfRkJfU0laRV9TNDsKIAkJYXBlcl9yc3JjID0gMTsKIAkJYXBlcnR1cmVfYmFzZSA9IGZiX2Jhc2UgKyBTQVZBR0VfQVBFUlRVUkVfT0ZGU0VUOwogCQkvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSAqLwotCQlpZiAoZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSA9PSAweDA4MDAwMDAwKSB7CisJCWlmIChwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkgPT0gMHgwODAwMDAwMCkgewogCQkJLyogQ2FuIHVzZSBvbmUgTVRSUiB0byBjb3ZlciBib3RoIGZiIGFuZAogCQkJICogYXBlcnR1cmUuICovCiAJCQlkZXZfcHJpdi0+bXRyclswXS5iYXNlID0gZmJfYmFzZTsKQEAgLTYyMCwxNSArNjIxLDE2IEBACiAJCQkJCSBkZXZfcHJpdi0+bXRyclswXS5zaXplLCBEUk1fTVRSUl9XQyk7CiAJCX0gZWxzZSB7CiAJCQlEUk1fRVJST1IoInN0cmFuZ2UgcGNpX3Jlc291cmNlX2xlbiAlMDhsbHhcbiIsCi0JCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSkpOworCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSk7CiAJCX0KIAl9IGVsc2UgewotCQltbWlvX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CisJCW1taW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApOwogCQlmYl9yc3JjID0gMTsKLQkJZmJfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKLQkJZmJfc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSk7CisJCWZiX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKTsKKwkJZmJfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKIAkJYXBlcl9yc3JjID0gMjsKLQkJYXBlcnR1cmVfYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKTsKKwkJYXBlcnR1cmVfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDIpOwogCQkvKiBBdXRvbWF0aWMgTVRSUiBzZXR1cCB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4gKi8KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMKaW5kZXggNGZkMWYwNi4uNzc2YmY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMKQEAgLTQ3LDkgKzQ3LDggQEAKIAlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAlkZXZfcHJpdi0+Y2hpcHNldCA9IGNoaXBzZXQ7CiAJcmV0ID0gZHJtX3NtYW5faW5pdCgmZGV2X3ByaXYtPnNtYW4sIDIsIDEyLCA4KTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCkKIAkJa2ZyZWUoZGV2X3ByaXYpOwotCX0KIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19tbS5jIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfbW0uYwppbmRleCBhZjIyMTExLi4wN2QwZjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX21tLmMKQEAgLTc4LDcgKzc4LDcgQEAKICNlbHNlIC8qIENPTkZJR19GQl9TSVNbX01PRFVMRV0gKi8KIAogI2RlZmluZSBTSVNfTU1fQUxJR05fU0hJRlQgNAotI2RlZmluZSBTSVNfTU1fQUxJR05fTUFTSyAoICgxIDw8IFNJU19NTV9BTElHTl9TSElGVCkgLSAxKQorI2RlZmluZSBTSVNfTU1fQUxJR05fTUFTSyAoKDEgPDwgU0lTX01NX0FMSUdOX1NISUZUKSAtIDEpCiAKICNlbmRpZiAvKiBDT05GSUdfRkJfU0lTW19NT0RVTEVdICovCiAKQEAgLTIyNSw5ICsyMjUsOCBAQAogCQltYXAgPSBlbnRyeS0+bWFwOwogCQlpZiAoIW1hcCkKIAkJCWNvbnRpbnVlOwotCQlpZiAobWFwLT50eXBlID09IF9EUk1fUkVHSVNURVJTKSB7CisJCWlmIChtYXAtPnR5cGUgPT0gX0RSTV9SRUdJU1RFUlMpCiAJCQlyZXR1cm4gbWFwOwotCQl9CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtMjY0LDEwICsyNjMsMTAgQEAKIAogCWVuZCA9IGppZmZpZXMgKyAoRFJNX0haICogMyk7CiAKLQlmb3IgKGk9MDsgaTw0OyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAJCWRvIHsKIAkJCWlkbGVfcmVnID0gU0lTX1JFQUQoMHg4NWNjKTsKLQkJfSB3aGlsZSAoICF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZCkgJiYKKwkJfSB3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSAmJgogCQkJICAoKGlkbGVfcmVnICYgMHg4MDAwMDAwMCkgIT0gMHg4MDAwMDAwMCkpOwogCX0KIApAQCAtMzAxLDcgKzMwMCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKLXZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCit2b2lkIHNpc19yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMxMiw5ICszMTEsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KSB7CisJaWYgKGRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KQogCQlkZXYtPmRyaXZlci0+ZG1hX3F1aWVzY2VudChkZXYpOwotCX0KIAogCWRybV9zbWFuX293bmVyX2NsZWFudXAoJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylmaWxlX3ByaXYpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS90dG0vTWFrZWZpbGUKaW5kZXggNDI1NmUyMC4uYjI1NmQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogCiBjY2ZsYWdzLXkgOj0gLUlpbmNsdWRlL2RybQogdHRtLXkgOj0gdHRtX2FncF9iYWNrZW5kLm8gdHRtX21lbW9yeS5vIHR0bV90dC5vIHR0bV9iby5vIFwKLQl0dG1fYm9fdXRpbC5vIHR0bV9ib192bS5vIHR0bV9tb2R1bGUubyB0dG1fZ2xvYmFsLm8gXAorCXR0bV9ib191dGlsLm8gdHRtX2JvX3ZtLm8gdHRtX21vZHVsZS5vIFwKIAl0dG1fb2JqZWN0Lm8gdHRtX2xvY2subyB0dG1fZXhlY2J1Zl91dGlsLm8gdHRtX3BhZ2VfYWxsb2MubwogCiBvYmotJChDT05GSUdfRFJNX1RUTSkgKz0gdHRtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCmluZGV4IDU1NWViYjEuLmNiNGNmN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwpAQCAtNDc2LDcgKzQ3Niw2IEBACiAJCQkrK3B1dF9jb3VudDsKIAkJfQogCQlpZiAoYm8tPm1lbS5tbV9ub2RlKSB7Ci0JCQliby0+bWVtLm1tX25vZGUtPnByaXZhdGUgPSBOVUxMOwogCQkJZHJtX21tX3B1dF9ibG9jayhiby0+bWVtLm1tX25vZGUpOwogCQkJYm8tPm1lbS5tbV9ub2RlID0gTlVMTDsKIAkJfQpAQCAtNjcwLDcgKzY2OSw2IEBACiAJCQlwcmludGsoS0VSTl9FUlIgVFRNX1BGWCAiQnVmZmVyIGV2aWN0aW9uIGZhaWxlZFxuIik7CiAJCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogCQlpZiAoZXZpY3RfbWVtLm1tX25vZGUpIHsKLQkJCWV2aWN0X21lbS5tbV9ub2RlLT5wcml2YXRlID0gTlVMTDsKIAkJCWRybV9tbV9wdXRfYmxvY2soZXZpY3RfbWVtLm1tX25vZGUpOwogCQkJZXZpY3RfbWVtLm1tX25vZGUgPSBOVUxMOwogCQl9CkBAIC05MjksOCArOTI3LDYgQEAKIAkJbWVtLT5tbV9ub2RlID0gbm9kZTsKIAkJbWVtLT5tZW1fdHlwZSA9IG1lbV90eXBlOwogCQltZW0tPnBsYWNlbWVudCA9IGN1cl9mbGFnczsKLQkJaWYgKG5vZGUpCi0JCQlub2RlLT5wcml2YXRlID0gYm87CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTczLDcgKzk2OSw2IEBACiAJCQkJCQlpbnRlcnJ1cHRpYmxlLCBub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1KTsKIAkJaWYgKHJldCA9PSAwICYmIG1lbS0+bW1fbm9kZSkgewogCQkJbWVtLT5wbGFjZW1lbnQgPSBjdXJfZmxhZ3M7Ci0JCQltZW0tPm1tX25vZGUtPnByaXZhdGUgPSBibzsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQpAQCAtMTAyOSw3ICsxMDI0LDYgQEAKIG91dF91bmxvY2s6CiAJaWYgKHJldCAmJiBtZW0ubW1fbm9kZSkgewogCQlzcGluX2xvY2soJmdsb2ItPmxydV9sb2NrKTsKLQkJbWVtLm1tX25vZGUtPnByaXZhdGUgPSBOVUxMOwogCQlkcm1fbW1fcHV0X2Jsb2NrKG1lbS5tbV9ub2RlKTsKIAkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKIAl9CkBAIC0xNDAxLDcgKzEzOTUsNyBAQAogCWtmcmVlKGdsb2IpOwogfQogCi12b2lkIHR0bV9ib19nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKK3ZvaWQgdHRtX2JvX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQogewogCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iID0gcmVmLT5vYmplY3Q7CiAKQEAgLTE0MTAsNyArMTQwNCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ib19nbG9iYWxfcmVsZWFzZSk7CiAKLWludCB0dG1fYm9fZ2xvYmFsX2luaXQoc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpCitpbnQgdHRtX2JvX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQogewogCXN0cnVjdCB0dG1fYm9fZ2xvYmFsX3JlZiAqYm9fcmVmID0KIAkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IHR0bV9ib19nbG9iYWxfcmVmLCByZWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCmluZGV4IDEzMDEyYTEuLjdjZmZiM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKQEAgLTM1Myw4ICszNTMsNiBAQAogCWZiby0+dm1fbm9kZSA9IE5VTEw7CiAKIAlmYm8tPnN5bmNfb2JqID0gZHJpdmVyLT5zeW5jX29ial9yZWYoYm8tPnN5bmNfb2JqKTsKLQlpZiAoZmJvLT5tZW0ubW1fbm9kZSkKLQkJZmJvLT5tZW0ubW1fbm9kZS0+cHJpdmF0ZSA9ICh2b2lkICopZmJvOwogCWtyZWZfaW5pdCgmZmJvLT5saXN0X2tyZWYpOwogCWtyZWZfaW5pdCgmZmJvLT5rcmVmKTsKIAlmYm8tPmRlc3Ryb3kgPSAmdHRtX3RyYW5zZmVyZWRfZGVzdHJveTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2dsb2JhbC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZ2xvYmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNzAwNzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZ2xvYmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAotICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi0gKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCi0gKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tLWF0LXZtd2FyZS1kb3QtY29tPgotICovCi0KLSNpbmNsdWRlICJ0dG0vdHRtX21vZHVsZS5oIgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi1zdHJ1Y3QgdHRtX2dsb2JhbF9pdGVtIHsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0Jdm9pZCAqb2JqZWN0OwotCWludCByZWZjb3VudDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHRtX2dsb2JhbF9pdGVtIGdsb2JbVFRNX0dMT0JBTF9OVU1dOwotCi12b2lkIHR0bV9nbG9iYWxfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFRUTV9HTE9CQUxfTlVNOyArK2kpIHsKLQkJc3RydWN0IHR0bV9nbG9iYWxfaXRlbSAqaXRlbSA9ICZnbG9iW2ldOwotCQltdXRleF9pbml0KCZpdGVtLT5tdXRleCk7Ci0JCWl0ZW0tPm9iamVjdCA9IE5VTEw7Ci0JCWl0ZW0tPnJlZmNvdW50ID0gMDsKLQl9Ci19Ci0KLXZvaWQgdHRtX2dsb2JhbF9yZWxlYXNlKHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IFRUTV9HTE9CQUxfTlVNOyArK2kpIHsKLQkJc3RydWN0IHR0bV9nbG9iYWxfaXRlbSAqaXRlbSA9ICZnbG9iW2ldOwotCQlCVUdfT04oaXRlbS0+b2JqZWN0ICE9IE5VTEwpOwotCQlCVUdfT04oaXRlbS0+cmVmY291bnQgIT0gMCk7Ci0JfQotfQotCi1pbnQgdHRtX2dsb2JhbF9pdGVtX3JlZihzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCB0dG1fZ2xvYmFsX2l0ZW0gKml0ZW0gPSAmZ2xvYltyZWYtPmdsb2JhbF90eXBlXTsKLQl2b2lkICpvYmplY3Q7Ci0KLQltdXRleF9sb2NrKCZpdGVtLT5tdXRleCk7Ci0JaWYgKGl0ZW0tPnJlZmNvdW50ID09IDApIHsKLQkJaXRlbS0+b2JqZWN0ID0ga3phbGxvYyhyZWYtPnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAodW5saWtlbHkoaXRlbS0+b2JqZWN0ID09IE5VTEwpKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfZXJyOwotCQl9Ci0KLQkJcmVmLT5vYmplY3QgPSBpdGVtLT5vYmplY3Q7Ci0JCXJldCA9IHJlZi0+aW5pdChyZWYpOwotCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQkJZ290byBvdXRfZXJyOwotCi0JfQotCSsraXRlbS0+cmVmY291bnQ7Ci0JcmVmLT5vYmplY3QgPSBpdGVtLT5vYmplY3Q7Ci0Jb2JqZWN0ID0gaXRlbS0+b2JqZWN0OwotCW11dGV4X3VubG9jaygmaXRlbS0+bXV0ZXgpOwotCXJldHVybiAwOwotb3V0X2VycjoKLQltdXRleF91bmxvY2soJml0ZW0tPm11dGV4KTsKLQlpdGVtLT5vYmplY3QgPSBOVUxMOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHR0bV9nbG9iYWxfaXRlbV9yZWYpOwotCi12b2lkIHR0bV9nbG9iYWxfaXRlbV91bnJlZihzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKLXsKLQlzdHJ1Y3QgdHRtX2dsb2JhbF9pdGVtICppdGVtID0gJmdsb2JbcmVmLT5nbG9iYWxfdHlwZV07Ci0KLQltdXRleF9sb2NrKCZpdGVtLT5tdXRleCk7Ci0JQlVHX09OKGl0ZW0tPnJlZmNvdW50ID09IDApOwotCUJVR19PTihyZWYtPm9iamVjdCAhPSBpdGVtLT5vYmplY3QpOwotCWlmICgtLWl0ZW0tPnJlZmNvdW50ID09IDApIHsKLQkJcmVmLT5yZWxlYXNlKHJlZik7Ci0JCWl0ZW0tPm9iamVjdCA9IE5VTEw7Ci0JfQotCW11dGV4X3VubG9jaygmaXRlbS0+bXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTCh0dG1fZ2xvYmFsX2l0ZW1fdW5yZWYpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9tb2R1bGUuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21vZHVsZS5jCmluZGV4IDlhNmVkYmYuLjkwMmQ3Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21vZHVsZS5jCkBAIC03MCw4ICs3MCw2IEBACiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKIAotCXR0bV9nbG9iYWxfaW5pdCgpOwotCiAJYXRvbWljX3NldCgmZGV2aWNlX3JlbGVhc2VkLCAwKTsKIAlyZXQgPSBkcm1fY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZ0dG1fZHJtX2NsYXNzX2RldmljZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTgxLDcgKzc5LDYgQEAKIG91dF9ub19kZXZfcmVnOgogCWF0b21pY19zZXQoJmRldmljZV9yZWxlYXNlZCwgMSk7CiAJd2FrZV91cF9hbGwoJmV4aXRfcSk7Ci0JdHRtX2dsb2JhbF9yZWxlYXNlKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTUsNyArOTIsNiBAQAogCSAqLwogCiAJd2FpdF9ldmVudChleGl0X3EsIGF0b21pY19yZWFkKCZkZXZpY2VfcmVsZWFzZWQpID09IDEpOwotCXR0bV9nbG9iYWxfcmVsZWFzZSgpOwogfQogCiBtb2R1bGVfaW5pdCh0dG1faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYS5jCmluZGV4IGJmYjkyZDIuLjY4ZGRhNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYS5jCkBAIC01OCwyOCArNTgsMjkgQEAKIAkqKCh1aW50MzJfdCAqKSh2YikpID0gKChuUmVnKSA+PiAyKSB8IEhBTENZT05fSEVBREVSMTsJXAogCSooKHVpbnQzMl90ICopKHZiKSArIDEpID0gKG5EYXRhKTsJCQlcCiAJdmIgPSAoKHVpbnQzMl90ICopdmIpICsgMjsJCQkJXAotCWRldl9wcml2LT5kbWFfbG93ICs9ODsJCQkJCVwKKwlkZXZfcHJpdi0+ZG1hX2xvdyArPSA4OwkJCQkJXAogfQogCiAjZGVmaW5lIHZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCkgRFJNX01FTU9SWUJBUlJJRVIoKQogCi0jZGVmaW5lIFZJQV9PVVRfUklOR19RVyh3MSx3MikJCQlcCisjZGVmaW5lIFZJQV9PVVRfUklOR19RVyh3MSwgdzIpCWRvIHsJCVwKIAkqdmIrKyA9ICh3MSk7CQkJCVwKIAkqdmIrKyA9ICh3Mik7CQkJCVwKLQlkZXZfcHJpdi0+ZG1hX2xvdyArPSA4OworCWRldl9wcml2LT5kbWFfbG93ICs9IDg7CQkJXAorfSB3aGlsZSAoMCkKIAotc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9zdGFydChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKLXN0YXRpYyB2b2lkIHZpYV9jbWRidWZfcGF1c2UoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7Ci1zdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jlc2V0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwotc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXdpbmQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7Ci1zdGF0aWMgaW50IHZpYV93YWl0X2lkbGUoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7Ci1zdGF0aWMgdm9pZCB2aWFfcGFkX2NhY2hlKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBxd29yZHMpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9zdGFydChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9wYXVzZShkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXNldChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXdpbmQoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KTsKK3N0YXRpYyBpbnQgdmlhX3dhaXRfaWRsZShkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX3BhZF9jYWNoZShkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBxd29yZHMpOwogCiAvKgogICogRnJlZSBzcGFjZSBpbiBjb21tYW5kIGJ1ZmZlci4KICAqLwogCi1zdGF0aWMgdWludDMyX3QgdmlhX2NtZGJ1Zl9zcGFjZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHVpbnQzMl90IHZpYV9jbWRidWZfc3BhY2UoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXVpbnQzMl90IGFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOwogCXVpbnQzMl90IGh3X2FkZHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cikgLSBhZ3BfYmFzZTsKQEAgLTkzLDcgKzk0LDcgQEAKICAqIEhvdyBtdWNoIGRvZXMgdGhlIGNvbW1hbmQgcmVndWxhdG9yIGxhZyBiZWhpbmQ/CiAgKi8KIAotc3RhdGljIHVpbnQzMl90IHZpYV9jbWRidWZfbGFnKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdWludDMyX3QgdmlhX2NtZGJ1Zl9sYWcoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXVpbnQzMl90IGFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOwogCXVpbnQzMl90IGh3X2FkZHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cikgLSBhZ3BfYmFzZTsKQEAgLTEwOCw3ICsxMDksNyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci12aWFfY21kYnVmX3dhaXQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdW5zaWduZWQgaW50IHNpemUpCit2aWFfY21kYnVmX3dhaXQoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAl1aW50MzJfdCBhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKIAl1aW50MzJfdCBjdXJfYWRkciwgaHdfYWRkciwgbmV4dF9hZGRyOwpAQCAtMTQ2LDE0ICsxNDcsMTMgQEAKIAkgICAgZGV2X3ByaXYtPmRtYV9oaWdoKSB7CiAJCXZpYV9jbWRidWZfcmV3aW5kKGRldl9wcml2KTsKIAl9Ci0JaWYgKHZpYV9jbWRidWZfd2FpdChkZXZfcHJpdiwgc2l6ZSkgIT0gMCkgeworCWlmICh2aWFfY21kYnVmX3dhaXQoZGV2X3ByaXYsIHNpemUpICE9IDApCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiAodWludDMyX3QgKikgKGRldl9wcml2LT5kbWFfcHRyICsgZGV2X3ByaXYtPmRtYV9sb3cpOwogfQogCi1pbnQgdmlhX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQoraW50IHZpYV9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9CkBAIC0xNzEsOSArMTcxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKLQkJCSAgZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgZHJtX3ZpYV9kbWFfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgdmlhX2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJICBkcm1fdmlhX2RtYV9pbml0X3QgKmluaXQpCiB7CiAJaWYgKCFkZXZfcHJpdiB8fCAhZGV2X3ByaXYtPm1taW8pIHsKIAkJRFJNX0VSUk9SKCJ2aWFfZG1hX2luaXQgY2FsbGVkIGJlZm9yZSB2aWFfbWFwX2luaXRcbiIpOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX2NtZGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKK3N0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX2NtZGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICpjbWQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OwogCXVpbnQzMl90ICp2YjsKQEAgLTI3MSw5ICsyNzEsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAoY21kLT5zaXplID4gVklBX1BDSV9CVUZfU0laRSkgeworCWlmIChjbWQtPnNpemUgPiBWSUFfUENJX0JVRl9TSVpFKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGRldl9wcml2LT5wY2lfYnVmLCBjbWQtPmJ1ZiwgY21kLT5zaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yOTEsOSArMjkwLDggQEAKIAl9CiAKIAl2YiA9IHZpYV9jaGVja19kbWEoZGV2X3ByaXYsIChjbWQtPnNpemUgPCAweDEwMCkgPyAweDEwMiA6IGNtZC0+c2l6ZSk7Ci0JaWYgKHZiID09IE5VTEwpIHsKKwlpZiAodmIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQUdBSU47Ci0JfQogCiAJbWVtY3B5KHZiLCBkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5zaXplKTsKIApAQCAtMzExLDEzICszMDksMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK2ludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKCF2aWFfd2FpdF9pZGxlKGRldl9wcml2KSkgeworCWlmICghdmlhX3dhaXRfaWRsZShkZXZfcHJpdikpCiAJCXJldHVybiAtRUJVU1k7Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC0zMzksMjIgKzMzNiwxNyBAQAogCURSTV9ERUJVRygiYnVmICVwIHNpemUgJWx1XG4iLCBjbWRidWYtPmJ1ZiwgY21kYnVmLT5zaXplKTsKIAogCXJldCA9IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZGV2LCBjbWRidWYpOwotCWlmIChyZXQpIHsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAotCQkJCSAgICAgIGRybV92aWFfY21kYnVmZmVyX3QgKiBjbWQpCitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgZHJtX3ZpYV9jbWRidWZmZXJfdCAqY21kKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldDsKIAotCWlmIChjbWQtPnNpemUgPiBWSUFfUENJX0JVRl9TSVpFKSB7CisJaWYgKGNtZC0+c2l6ZSA+IFZJQV9QQ0lfQlVGX1NJWkUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGRldl9wcml2LT5wY2lfYnVmLCBjbWQtPmJ1ZiwgY21kLT5zaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTM4MCwxOSArMzcyLDE0IEBACiAJRFJNX0RFQlVHKCJidWYgJXAgc2l6ZSAlbHVcbiIsIGNtZGJ1Zi0+YnVmLCBjbWRidWYtPnNpemUpOwogCiAJcmV0ID0gdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoZGV2LCBjbWRidWYpOwotCWlmIChyZXQpIHsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfYWxpZ25fYnVmZmVyKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsCitzdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfYWxpZ25fYnVmZmVyKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCQkJIHVpbnQzMl90ICogdmIsIGludCBxd19jb3VudCkKIHsKLQlmb3IgKDsgcXdfY291bnQgPiAwOyAtLXF3X2NvdW50KSB7CisJZm9yICg7IHF3X2NvdW50ID4gMDsgLS1xd19jb3VudCkKIAkJVklBX09VVF9SSU5HX1FXKEhDX0RVTU1ZLCBIQ19EVU1NWSk7Ci0JfQogCXJldHVybiB2YjsKIH0KIApAQCAtNDAxLDcgKzM4OCw3IEBACiAgKgogICogUmV0dXJucyB2aXJ0dWFsIHBvaW50ZXIgdG8gcmluZyBidWZmZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgKnZpYV9nZXRfZG1hKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW5saW5lIHVpbnQzMl90ICp2aWFfZ2V0X2RtYShkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJcmV0dXJuICh1aW50MzJfdCAqKSAoZGV2X3ByaXYtPmRtYV9wdHIgKyBkZXZfcHJpdi0+ZG1hX2xvdyk7CiB9CkBAIC00MTEsMTggKzM5OCwxOCBAQAogICogbW9kaWZ5aW5nIHRoZSBwYXVzZSBhZGRyZXNzIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGl0c2VsZi4gSWYKICAqIHRoZSByZWd1bGF0b3IgaGFzIGFscmVhZHkgcGF1c2VkLCByZXN0YXJ0IGl0LgogICovCi1zdGF0aWMgaW50IHZpYV9ob29rX3NlZ21lbnQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKK3N0YXRpYyBpbnQgdmlhX2hvb2tfc2VnbWVudChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCQkgICAgdWludDMyX3QgcGF1c2VfYWRkcl9oaSwgdWludDMyX3QgcGF1c2VfYWRkcl9sbywKIAkJCSAgICBpbnQgbm9fcGNpX2ZpcmUpCiB7CiAJaW50IHBhdXNlZCwgY291bnQ7CiAJdm9sYXRpbGUgdWludDMyX3QgKnBhdXNlZF9hdCA9IGRldl9wcml2LT5sYXN0X3BhdXNlX3B0cjsKLQl1aW50MzJfdCByZWFkZXIscHRyOworCXVpbnQzMl90IHJlYWRlciwgcHRyOwogCXVpbnQzMl90IGRpZmY7CiAKIAlwYXVzZWQgPSAwOwogCXZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCk7Ci0JKHZvaWQpICoodm9sYXRpbGUgdWludDMyX3QgKikodmlhX2dldF9kbWEoZGV2X3ByaXYpIC0xKTsKKwkodm9pZCkgKih2b2xhdGlsZSB1aW50MzJfdCAqKSh2aWFfZ2V0X2RtYShkZXZfcHJpdikgLSAxKTsKIAogCSpwYXVzZWRfYXQgPSBwYXVzZV9hZGRyX2xvOwogCXZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCk7CkBAIC00MzUsNyArNDIyLDcgQEAKIAlkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdikgLSAxOwogCiAJLyoKLQkgKiBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGNvbW1hbmQgcmVhZGVyIHdpbGwgCisJICogSWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjb21tYW5kIHJlYWRlciB3aWxsCiAJICogbWlzcyB0aGUgbmV3IHBhdXNlIGFkZHJlc3MgYW5kIHBhdXNlIG9uIHRoZSBvbGQgb25lLAogCSAqIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHByb2dyYW0gdGhlIG5ldyBzdGFydCBhZGRyZXNzCiAJICogdXNpbmcgUENJLgpAQCAtNDQzLDkgKzQzMCw5IEBACiAKIAlkaWZmID0gKHVpbnQzMl90KSAocHRyIC0gcmVhZGVyKSAtIGRldl9wcml2LT5kbWFfZGlmZjsKIAljb3VudCA9IDEwMDAwMDAwOwotCXdoaWxlKGRpZmYgPT0gMCAmJiBjb3VudC0tKSB7CisJd2hpbGUgKGRpZmYgPT0gMCAmJiBjb3VudC0tKSB7CiAJCXBhdXNlZCA9IChWSUFfUkVBRCgweDQxYykgJiAweDgwMDAwMDAwKTsKLQkJaWYgKHBhdXNlZCkgCisJCWlmIChwYXVzZWQpCiAJCQlicmVhazsKIAkJcmVhZGVyID0gKihkZXZfcHJpdi0+aHdfYWRkcl9wdHIpOwogCQlkaWZmID0gKHVpbnQzMl90KSAocHRyIC0gcmVhZGVyKSAtIGRldl9wcml2LT5kbWFfZGlmZjsKQEAgLTQ3Nyw3ICs0NjQsNyBAQAogCXJldHVybiBwYXVzZWQ7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX3dhaXRfaWRsZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCB2aWFfd2FpdF9pZGxlKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlpbnQgY291bnQgPSAxMDAwMDAwMDsKIApAQCAtNDkxLDkgKzQ3OCw5IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgdWludDMyX3QgKnZpYV9hbGlnbl9jbWQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdWludDMyX3QgY21kX3R5cGUsCi0JCQkgICAgICAgdWludDMyX3QgYWRkciwgdWludDMyX3QgKiBjbWRfYWRkcl9oaSwKLQkJCSAgICAgICB1aW50MzJfdCAqIGNtZF9hZGRyX2xvLCBpbnQgc2tpcF93YWl0KQorc3RhdGljIHVpbnQzMl90ICp2aWFfYWxpZ25fY21kKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdWludDMyX3QgY21kX3R5cGUsCisJCQkgICAgICAgdWludDMyX3QgYWRkciwgdWludDMyX3QgKmNtZF9hZGRyX2hpLAorCQkJICAgICAgIHVpbnQzMl90ICpjbWRfYWRkcl9sbywgaW50IHNraXBfd2FpdCkKIHsKIAl1aW50MzJfdCBhZ3BfYmFzZTsKIAl1aW50MzJfdCBjbWRfYWRkciwgYWRkcl9sbywgYWRkcl9oaTsKQEAgLTUyMSw3ICs1MDgsNyBAQAogCXJldHVybiB2YjsKIH0KIAotc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9zdGFydChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9zdGFydChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdWludDMyX3QgcGF1c2VfYWRkcl9sbywgcGF1c2VfYWRkcl9oaTsKIAl1aW50MzJfdCBzdGFydF9hZGRyLCBzdGFydF9hZGRyX2xvOwpAQCAtNTgwLDcgKzU2Nyw3IEBACiAJZGV2X3ByaXYtPmRtYV9kaWZmID0gcHRyIC0gcmVhZGVyOwogfQogCi1zdGF0aWMgdm9pZCB2aWFfcGFkX2NhY2hlKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBxd29yZHMpCitzdGF0aWMgdm9pZCB2aWFfcGFkX2NhY2hlKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHF3b3JkcykKIHsKIAl1aW50MzJfdCAqdmI7CiAKQEAgLTU5MCw3ICs1NzcsNyBAQAogCXZpYV9hbGlnbl9idWZmZXIoZGV2X3ByaXYsIHZiLCBxd29yZHMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdmlhX2R1bW15X2JpdGJsdChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGlubGluZSB2b2lkIHZpYV9kdW1teV9iaXRibHQoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXVpbnQzMl90ICp2YiA9IHZpYV9nZXRfZG1hKGRldl9wcml2KTsKIAlTZXRSZWcyREFHUCgweDBDLCAoMCB8ICgwIDw8IDE2KSkpOwpAQCAtNTk4LDcgKzU4NSw3IEBACiAJU2V0UmVnMkRBR1AoMHgwLCAweDEgfCAweDIwMDAgfCAweEFBMDAwMDAwKTsKIH0KIAotc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9qdW1wKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX2p1bXAoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXVpbnQzMl90IGFncF9iYXNlOwogCXVpbnQzMl90IHBhdXNlX2FkZHJfbG8sIHBhdXNlX2FkZHJfaGk7CkBAIC02MTcsOSArNjA0LDggQEAKIAkgKi8KIAogCWRldl9wcml2LT5kbWFfbG93ID0gMDsKLQlpZiAodmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBDTURCVUZfQUxJR05NRU5UX1NJWkUpICE9IDApIHsKKwlpZiAodmlhX2NtZGJ1Zl93YWl0KGRldl9wcml2LCBDTURCVUZfQUxJR05NRU5UX1NJWkUpICE9IDApCiAJCURSTV9FUlJPUigidmlhX2NtZGJ1Zl9qdW1wIGZhaWxlZFxuIik7Ci0JfQogCiAJdmlhX2R1bW15X2JpdGJsdChkZXZfcHJpdik7CiAJdmlhX2R1bW15X2JpdGJsdChkZXZfcHJpdik7CkBAIC02NTcsMTIgKzY0MywxMiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHZpYV9jbWRidWZfcmV3aW5kKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jld2luZChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdmlhX2NtZGJ1Zl9qdW1wKGRldl9wcml2KTsKIH0KIAotc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9mbHVzaChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1aW50MzJfdCBjbWRfdHlwZSkKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfZmx1c2goZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjbWRfdHlwZSkKIHsKIAl1aW50MzJfdCBwYXVzZV9hZGRyX2xvLCBwYXVzZV9hZGRyX2hpOwogCkBAIC02NzAsMTIgKzY1NiwxMiBAQAogCXZpYV9ob29rX3NlZ21lbnQoZGV2X3ByaXYsIHBhdXNlX2FkZHJfaGksIHBhdXNlX2FkZHJfbG8sIDApOwogfQogCi1zdGF0aWMgdm9pZCB2aWFfY21kYnVmX3BhdXNlKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3BhdXNlKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAl2aWFfY21kYnVmX2ZsdXNoKGRldl9wcml2LCBIQ19IQUdQQnBJRF9QQVVTRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHZpYV9jbWRidWZfcmVzZXQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfcmVzZXQoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXZpYV9jbWRidWZfZmx1c2goZGV2X3ByaXYsIEhDX0hBR1BCcElEX1NUT1ApOwogCXZpYV93YWl0X2lkbGUoZGV2X3ByaXYpOwpAQCAtNzA4LDkgKzY5NCw4IEBACiAJY2FzZSBWSUFfQ01EQlVGX1NQQUNFOgogCQl3aGlsZSAoKCh0bXBfc2l6ZSA9IHZpYV9jbWRidWZfc3BhY2UoZGV2X3ByaXYpKSA8IGRfc2l6LT5zaXplKQogCQkgICAgICAgJiYgLS1jb3VudCkgewotCQkJaWYgKCFkX3Npei0+d2FpdCkgeworCQkJaWYgKCFkX3Npei0+d2FpdCkKIAkJCQlicmVhazsKLQkJCX0KIAkJfQogCQlpZiAoIWNvdW50KSB7CiAJCQlEUk1fRVJST1IoIlZJQV9DTURCVUZfU1BBQ0UgdGltZWQgb3V0LlxuIik7CkBAIC03MjAsOSArNzA1LDggQEAKIAljYXNlIFZJQV9DTURCVUZfTEFHOgogCQl3aGlsZSAoKCh0bXBfc2l6ZSA9IHZpYV9jbWRidWZfbGFnKGRldl9wcml2KSkgPiBkX3Npei0+c2l6ZSkKIAkJICAgICAgICYmIC0tY291bnQpIHsKLQkJCWlmICghZF9zaXotPndhaXQpIHsKKwkJCWlmICghZF9zaXotPndhaXQpCiAJCQkJYnJlYWs7Ci0JCQl9CiAJCX0KIAkJaWYgKCFjb3VudCkgewogCQkJRFJNX0VSUk9SKCJWSUFfQ01EQlVGX0xBRyB0aW1lZCBvdXQuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYWJsaXQuYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYWJsaXQuYwppbmRleCA0YzU0ZjA0Li45YjViNGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWFibGl0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZG1hYmxpdC5jCkBAIC03MCw3ICs3MCw3IEBACiAJCWRlc2NyaXB0b3JfdGhpc19wYWdlOwogCWRtYV9hZGRyX3QgbmV4dCA9IHZzZy0+Y2hhaW5fc3RhcnQ7CiAKLQl3aGlsZShudW1fZGVzYy0tKSB7CisJd2hpbGUgKG51bV9kZXNjLS0pIHsKIAkJaWYgKGRlc2NyaXB0b3JfdGhpc19wYWdlLS0gPT0gMCkgewogCQkJY3VyX2Rlc2NyaXB0b3JfcGFnZS0tOwogCQkJZGVzY3JpcHRvcl90aGlzX3BhZ2UgPSB2c2ctPmRlc2NyaXB0b3JzX3Blcl9wYWdlIC0gMTsKQEAgLTE3NCwxOSArMTc0LDE5IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGk7CiAKLQlzd2l0Y2godnNnLT5zdGF0ZSkgeworCXN3aXRjaCAodnNnLT5zdGF0ZSkgewogCWNhc2UgZHJfdmlhX2RldmljZV9tYXBwZWQ6CiAJCXZpYV91bm1hcF9ibGl0X2Zyb21fZGV2aWNlKHBkZXYsIHZzZyk7CiAJY2FzZSBkcl92aWFfZGVzY19wYWdlc19hbGxvYzoKLQkJZm9yIChpPTA7IGk8dnNnLT5udW1fZGVzY19wYWdlczsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2c2ctPm51bV9kZXNjX3BhZ2VzOyArK2kpIHsKIAkJCWlmICh2c2ctPmRlc2NfcGFnZXNbaV0gIT0gTlVMTCkKLQkJCSAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZzZy0+ZGVzY19wYWdlc1tpXSk7CisJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZzZy0+ZGVzY19wYWdlc1tpXSk7CiAJCX0KIAkJa2ZyZWUodnNnLT5kZXNjX3BhZ2VzKTsKIAljYXNlIGRyX3ZpYV9wYWdlc19sb2NrZWQ6Ci0JCWZvciAoaT0wOyBpPHZzZy0+bnVtX3BhZ2VzOyArK2kpIHsKLQkJCWlmICggTlVMTCAhPSAocGFnZSA9IHZzZy0+cGFnZXNbaV0pKSB7Ci0JCQkJaWYgKCEgUGFnZVJlc2VydmVkKHBhZ2UpICYmIChETUFfRlJPTV9ERVZJQ0UgPT0gdnNnLT5kaXJlY3Rpb24pKQorCQlmb3IgKGkgPSAwOyBpIDwgdnNnLT5udW1fcGFnZXM7ICsraSkgeworCQkJaWYgKE5VTEwgIT0gKHBhZ2UgPSB2c2ctPnBhZ2VzW2ldKSkgeworCQkJCWlmICghUGFnZVJlc2VydmVkKHBhZ2UpICYmIChETUFfRlJPTV9ERVZJQ0UgPT0gdnNnLT5kaXJlY3Rpb24pKQogCQkJCQlTZXRQYWdlRGlydHkocGFnZSk7CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJfQpAQCAtMjMyLDcgKzIzMiw3IEBACiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X3BmbiA9IFZJQV9QRk4oeGZlci0+bWVtX2FkZHIpOwotCXZzZy0+bnVtX3BhZ2VzID0gVklBX1BGTih4ZmVyLT5tZW1fYWRkciArICh4ZmVyLT5udW1fbGluZXMgKiB4ZmVyLT5tZW1fc3RyaWRlIC0xKSkgLQorCXZzZy0+bnVtX3BhZ2VzID0gVklBX1BGTih4ZmVyLT5tZW1fYWRkciArICh4ZmVyLT5udW1fbGluZXMgKiB4ZmVyLT5tZW1fc3RyaWRlIC0gMSkpIC0KIAkJZmlyc3RfcGZuICsgMTsKIAogCWlmIChOVUxMID09ICh2c2ctPnBhZ2VzID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiB2c2ctPm51bV9wYWdlcykpKQpAQCAtMjY4LDcgKzI2OCw3IEBACiB7CiAJaW50IGk7CiAKLQl2c2ctPmRlc2NyaXB0b3JzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCBkcm1fdmlhX2Rlc2NyaXB0b3JfdCk7CisJdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZihkcm1fdmlhX2Rlc2NyaXB0b3JfdCk7CiAJdnNnLT5udW1fZGVzY19wYWdlcyA9ICh2c2ctPm51bV9kZXNjICsgdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSAtIDEpIC8KIAkJdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZTsKIApAQCAtMjc2LDcgKzI3Niw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdnNnLT5zdGF0ZSA9IGRyX3ZpYV9kZXNjX3BhZ2VzX2FsbG9jOwotCWZvciAoaT0wOyBpPHZzZy0+bnVtX2Rlc2NfcGFnZXM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCB2c2ctPm51bV9kZXNjX3BhZ2VzOyArK2kpIHsKIAkJaWYgKE5VTEwgPT0gKHZzZy0+ZGVzY19wYWdlc1tpXSA9CiAJCQkgICAgIChkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0zMTgsMjEgKzMxOCwyMCBAQAogCWRybV92aWFfYmxpdHFfdCAqYmxpdHEgPSBkZXZfcHJpdi0+YmxpdF9xdWV1ZXMgKyBlbmdpbmU7CiAJaW50IGN1cjsKIAlpbnQgZG9uZV90cmFuc2ZlcjsKLQl1bnNpZ25lZCBsb25nIGlycXNhdmU9MDsKKwl1bnNpZ25lZCBsb25nIGlycXNhdmUgPSAwOwogCXVpbnQzMl90IHN0YXR1cyA9IDA7CiAKIAlEUk1fREVCVUcoIkRNQSBibGl0IGhhbmRsZXIgY2FsbGVkLiBlbmdpbmUgPSAlZCwgZnJvbV9pcnEgPSAlZCwgYmxpdHEgPSAweCVseFxuIiwKIAkJICBlbmdpbmUsIGZyb21faXJxLCAodW5zaWduZWQgbG9uZykgYmxpdHEpOwogCi0JaWYgKGZyb21faXJxKSB7CisJaWYgKGZyb21faXJxKQogCQlzcGluX2xvY2soJmJsaXRxLT5ibGl0X2xvY2spOwotCX0gZWxzZSB7CisJZWxzZQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7Ci0JfQogCiAJZG9uZV90cmFuc2ZlciA9IGJsaXRxLT5pc19hY3RpdmUgJiYKLQkgICgoIHN0YXR1cyA9IFZJQV9SRUFEKFZJQV9QQ0lfRE1BX0NTUjAgKyBlbmdpbmUqMHgwNCkpICYgVklBX0RNQV9DU1JfVEQpOwotCWRvbmVfdHJhbnNmZXIgPSBkb25lX3RyYW5zZmVyIHx8ICggYmxpdHEtPmFib3J0aW5nICYmICEoc3RhdHVzICYgVklBX0RNQV9DU1JfREUpKTsKKwkgICgoc3RhdHVzID0gVklBX1JFQUQoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0KSkgJiBWSUFfRE1BX0NTUl9URCk7CisJZG9uZV90cmFuc2ZlciA9IGRvbmVfdHJhbnNmZXIgfHwgKGJsaXRxLT5hYm9ydGluZyAmJiAhKHN0YXR1cyAmIFZJQV9ETUFfQ1NSX0RFKSk7CiAKIAljdXIgPSBibGl0cS0+Y3VyOwogCWlmIChkb25lX3RyYW5zZmVyKSB7CkBAIC0zNzcsMTggKzM3NiwxNiBAQAogCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZibGl0cS0+cG9sbF90aW1lcikpCiAJCQkJbW9kX3RpbWVyKCZibGl0cS0+cG9sbF90aW1lciwgamlmZmllcyArIDEpOwogCQl9IGVsc2UgewotCQkJaWYgKHRpbWVyX3BlbmRpbmcoJmJsaXRxLT5wb2xsX3RpbWVyKSkgeworCQkJaWYgKHRpbWVyX3BlbmRpbmcoJmJsaXRxLT5wb2xsX3RpbWVyKSkKIAkJCQlkZWxfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyKTsKLQkJCX0KIAkJCXZpYV9kbWFibGl0X2VuZ2luZV9vZmYoZGV2LCBlbmdpbmUpOwogCQl9CiAJfQogCi0JaWYgKGZyb21faXJxKSB7CisJaWYgKGZyb21faXJxKQogCQlzcGluX3VubG9jaygmYmxpdHEtPmJsaXRfbG9jayk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwotCX0KIH0KIAogCkBAIC00MTQsMTAgKzQxMSw5IEBACiAJCSgoYmxpdHEtPmN1cl9ibGl0X2hhbmRsZSAtIGhhbmRsZSkgPD0gKDEgPDwgMjMpKTsKIAogCWlmIChxdWV1ZSAmJiBhY3RpdmUpIHsKLQkJc2xvdCA9IGhhbmRsZSAtIGJsaXRxLT5kb25lX2JsaXRfaGFuZGxlICsgYmxpdHEtPmN1ciAtMTsKLQkJaWYgKHNsb3QgPj0gVklBX05VTV9CTElUX1NMT1RTKSB7CisJCXNsb3QgPSBoYW5kbGUgLSBibGl0cS0+ZG9uZV9ibGl0X2hhbmRsZSArIGJsaXRxLT5jdXIgLSAxOworCQlpZiAoc2xvdCA+PSBWSUFfTlVNX0JMSVRfU0xPVFMpCiAJCQlzbG90IC09IFZJQV9OVU1fQkxJVF9TTE9UUzsKLQkJfQogCQkqcXVldWUgPSBibGl0cS0+YmxpdF9xdWV1ZSArIHNsb3Q7CiAJfQogCkBAIC01MDYsMTIgKzUwMiwxMiBAQAogCWludCBjdXJfcmVsZWFzZWQ7CiAKIAotCURSTV9ERUJVRygiV29ya3F1ZXVlIHRhc2sgY2FsbGVkIGZvciBibGl0IGVuZ2luZSAlbGRcbiIsKHVuc2lnbmVkIGxvbmcpCisJRFJNX0RFQlVHKCJXb3JrcXVldWUgdGFzayBjYWxsZWQgZm9yIGJsaXQgZW5naW5lICVsZFxuIiwgKHVuc2lnbmVkIGxvbmcpCiAJCSAgKGJsaXRxIC0gKChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGUpLT5ibGl0X3F1ZXVlcykpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwogCi0Jd2hpbGUoYmxpdHEtPnNlcnZpY2VkICE9IGJsaXRxLT5jdXIpIHsKKwl3aGlsZSAoYmxpdHEtPnNlcnZpY2VkICE9IGJsaXRxLT5jdXIpIHsKIAogCQljdXJfcmVsZWFzZWQgPSBibGl0cS0+c2VydmljZWQrKzsKIApAQCAtNTQ1LDEzICs1NDEsMTMgQEAKIHZvaWQKIHZpYV9pbml0X2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlpbnQgaSxqOworCWludCBpLCBqOwogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3ZpYV9ibGl0cV90ICpibGl0cTsKIAogCXBjaV9zZXRfbWFzdGVyKGRldi0+cGRldik7CiAKLQlmb3IgKGk9MDsgaTwgVklBX05VTV9CTElUX0VOR0lORVM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBWSUFfTlVNX0JMSVRfRU5HSU5FUzsgKytpKSB7CiAJCWJsaXRxID0gZGV2X3ByaXYtPmJsaXRfcXVldWVzICsgaTsKIAkJYmxpdHEtPmRldiA9IGRldjsKIAkJYmxpdHEtPmN1cl9ibGl0X2hhbmRsZSA9IDA7CkBAIC01NjQsOSArNTYwLDggQEAKIAkJYmxpdHEtPmlzX2FjdGl2ZSA9IDA7CiAJCWJsaXRxLT5hYm9ydGluZyA9IDA7CiAJCXNwaW5fbG9ja19pbml0KCZibGl0cS0+YmxpdF9sb2NrKTsKLQkJZm9yIChqPTA7IGo8VklBX05VTV9CTElUX1NMT1RTOyArK2opIHsKKwkJZm9yIChqID0gMDsgaiA8IFZJQV9OVU1fQkxJVF9TTE9UUzsgKytqKQogCQkJRFJNX0lOSVRfV0FJVFFVRVVFKGJsaXRxLT5ibGl0X3F1ZXVlICsgaik7Ci0JCX0KIAkJRFJNX0lOSVRfV0FJVFFVRVVFKCZibGl0cS0+YnVzeV9xdWV1ZSk7CiAJCUlOSVRfV09SSygmYmxpdHEtPndxLCB2aWFfZG1hYmxpdF93b3JrcXVldWUpOwogCQlzZXR1cF90aW1lcigmYmxpdHEtPnBvbGxfdGltZXIsIHZpYV9kbWFibGl0X3RpbWVyLApAQCAtNjg1LDE4ICs2ODAsMTcgQEAKIHN0YXRpYyBpbnQKIHZpYV9kbWFibGl0X2dyYWJfc2xvdChkcm1fdmlhX2JsaXRxX3QgKmJsaXRxLCBpbnQgZW5naW5lKQogewotCWludCByZXQ9MDsKKwlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGlycXNhdmU7CiAKIAlEUk1fREVCVUcoIk51bSBmcmVlIGlzICVkXG4iLCBibGl0cS0+bnVtX2ZyZWUpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKLQl3aGlsZShibGl0cS0+bnVtX2ZyZWUgPT0gMCkgeworCXdoaWxlIChibGl0cS0+bnVtX2ZyZWUgPT0gMCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAogCQlEUk1fV0FJVF9PTihyZXQsIGJsaXRxLT5idXN5X3F1ZXVlLCBEUk1fSFosIGJsaXRxLT5udW1fZnJlZSA+IDApOwotCQlpZiAocmV0KSB7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gKC1FSU5UUiA9PSByZXQpID8gLUVBR0FJTiA6IHJldDsKLQkJfQogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAl9CkBAIC03MTksNyArNzEzLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CiAJYmxpdHEtPm51bV9mcmVlKys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7Ci0JRFJNX1dBS0VVUCggJmJsaXRxLT5idXN5X3F1ZXVlICk7CisJRFJNX1dBS0VVUCgmYmxpdHEtPmJ1c3lfcXVldWUpOwogfQogCiAvKgpAQCAtNzQ0LDkgKzczOCw4IEBACiAKIAllbmdpbmUgPSAoeGZlci0+dG9fZmIpID8gMCA6IDE7CiAJYmxpdHEgPSBkZXZfcHJpdi0+YmxpdF9xdWV1ZXMgKyBlbmdpbmU7Ci0JaWYgKDAgIT0gKHJldCA9IHZpYV9kbWFibGl0X2dyYWJfc2xvdChibGl0cSwgZW5naW5lKSkpIHsKKwlpZiAoMCAhPSAocmV0ID0gdmlhX2RtYWJsaXRfZ3JhYl9zbG90KGJsaXRxLCBlbmdpbmUpKSkKIAkJcmV0dXJuIHJldDsKLQl9CiAJaWYgKE5VTEwgPT0gKHZzZyA9IGttYWxsb2Moc2l6ZW9mKCp2c2cpLCBHRlBfS0VSTkVMKSkpIHsKIAkJdmlhX2RtYWJsaXRfcmVsZWFzZV9zbG90KGJsaXRxKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODAsNyArNzczLDcgQEAKICAqLwogCiBpbnQKLXZpYV9kbWFfYmxpdF9zeW5jKCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiApCit2aWFfZG1hX2JsaXRfc3luYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fdmlhX2JsaXRzeW5jX3QgKnN5bmMgPSBkYXRhOwogCWludCBlcnI7CkBAIC04MDQsNyArNzk3LDcgQEAKICAqLwogCiBpbnQKLXZpYV9kbWFfYmxpdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgKQordmlhX2RtYV9ibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWRybV92aWFfZG1hYmxpdF90ICp4ZmVyID0gZGF0YTsKIAlpbnQgZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZG1hYmxpdC5oIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZG1hYmxpdC5oCmluZGV4IDc0MDhhNTQuLjliNjYyYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2RtYWJsaXQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kbWFibGl0LmgKQEAgLTQ1LDEyICs0NSwxMiBAQAogCWludCBudW1fZGVzYzsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247CiAJdW5zaWduZWQgY2hhciAqYm91bmNlX2J1ZmZlcjsKLSAgICAgICAgZG1hX2FkZHJfdCBjaGFpbl9zdGFydDsKKwlkbWFfYWRkcl90IGNoYWluX3N0YXJ0OwogCXVpbnQzMl90IGZyZWVfb25fc2VxdWVuY2U7Ci0gICAgICAgIHVuc2lnbmVkIGludCBkZXNjcmlwdG9yc19wZXJfcGFnZTsKKwl1bnNpZ25lZCBpbnQgZGVzY3JpcHRvcnNfcGVyX3BhZ2U7CiAJaW50IGFib3J0ZWQ7CiAJZW51bSB7Ci0JICAgICAgICBkcl92aWFfZGV2aWNlX21hcHBlZCwKKwkJZHJfdmlhX2RldmljZV9tYXBwZWQsCiAJCWRyX3ZpYV9kZXNjX3BhZ2VzX2FsbG9jLAogCQlkcl92aWFfcGFnZXNfbG9ja2VkLAogCQlkcl92aWFfcGFnZXNfYWxsb2MsCkBAIC02OCw3ICs2OCw3IEBACiAJdW5zaWduZWQgbnVtX2ZyZWU7CiAJdW5zaWduZWQgbnVtX291dHN0YW5kaW5nOwogCXVuc2lnbmVkIGxvbmcgZW5kOwotICAgICAgICBpbnQgYWJvcnRpbmc7CisJaW50IGFib3J0aW5nOwogCWludCBpc19hY3RpdmU7CiAJZHJtX3ZpYV9zZ19pbmZvX3QgKmJsaXRzW1ZJQV9OVU1fQkxJVF9TTE9UU107CiAJc3BpbmxvY2tfdCBibGl0X2xvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5oCmluZGV4IGNhZmNiODQuLjljZjg3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5oCkBAIC0xMDcsOSArMTA3LDkgQEAKICNkZWZpbmUgVklBX0JBU0UgKChkZXZfcHJpdi0+bW1pbykpCiAKICNkZWZpbmUgVklBX1JFQUQocmVnKQkJRFJNX1JFQUQzMihWSUFfQkFTRSwgcmVnKQotI2RlZmluZSBWSUFfV1JJVEUocmVnLHZhbCkJRFJNX1dSSVRFMzIoVklBX0JBU0UsIHJlZywgdmFsKQorI2RlZmluZSBWSUFfV1JJVEUocmVnLCB2YWwpCURSTV9XUklURTMyKFZJQV9CQVNFLCByZWcsIHZhbCkKICNkZWZpbmUgVklBX1JFQUQ4KHJlZykJCURSTV9SRUFEOChWSUFfQkFTRSwgcmVnKQotI2RlZmluZSBWSUFfV1JJVEU4KHJlZyx2YWwpCURSTV9XUklURTgoVklBX0JBU0UsIHJlZywgdmFsKQorI2RlZmluZSBWSUFfV1JJVEU4KHJlZywgdmFsKQlEUk1fV1JJVEU4KFZJQV9CQVNFLCByZWcsIHZhbCkKIAogZXh0ZXJuIHN0cnVjdCBkcm1faW9jdGxfZGVzYyB2aWFfaW9jdGxzW107CiBleHRlcm4gaW50IHZpYV9tYXhfaW9jdGw7CkBAIC0xMjEsMjggKzEyMSwyOCBAQAogZXh0ZXJuIGludCB2aWFfbWFwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCB2aWFfZGVjb2Rlcl9mdXRleChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IHZpYV93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gaW50IHZpYV9kbWFfYmxpdF9zeW5jKCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiApOwotZXh0ZXJuIGludCB2aWFfZG1hX2JsaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2ICk7CitleHRlcm4gaW50IHZpYV9kbWFfYmxpdF9zeW5jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdmlhX2RtYV9ibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIAogZXh0ZXJuIGludCB2aWFfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKIGV4dGVybiBpbnQgdmlhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLWV4dGVybiBpbnQgdmlhX2luaXRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCB2aWFfaW5pdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgdmlhX2ZpbmFsX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpOwogCi1leHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB1MzIgdmlhX2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IHZpYV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIHZpYV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCB2aWFfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCB2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKHZvaWQpOwotZXh0ZXJuIGludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCB2aWFfaW5pdF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgdmlhX2NsZWFudXBfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KTsKIGV4dGVybiB2b2lkIHZpYV9yZWxlYXNlX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9pcnEuYwppbmRleCAzNDA3OWYyLi5kMzkxZjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9pcnEuYwpAQCAtMTQxLDExICsxNDEsMTAgQEAKIAkJCWF0b21pY19pbmMoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCk7CiAJCQlEUk1fV0FLRVVQKCZjdXJfaXJxLT5pcnFfcXVldWUpOwogCQkJaGFuZGxlZCA9IDE7Ci0JCQlpZiAoZGV2X3ByaXYtPmlycV9tYXBbZHJtX3ZpYV9pcnFfZG1hMF90ZF0gPT0gaSkgeworCQkJaWYgKGRldl9wcml2LT5pcnFfbWFwW2RybV92aWFfaXJxX2RtYTBfdGRdID09IGkpCiAJCQkJdmlhX2RtYWJsaXRfaGFuZGxlcihkZXYsIDAsIDEpOwotCQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+aXJxX21hcFtkcm1fdmlhX2lycV9kbWExX3RkXSA9PSBpKSB7CisJCQllbHNlIGlmIChkZXZfcHJpdi0+aXJxX21hcFtkcm1fdmlhX2lycV9kbWExX3RkXSA9PSBpKQogCQkJCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCAxLCAxKTsKLQkJCX0KIAkJfQogCQljdXJfaXJxKys7CiAJfQpAQCAtMTYwLDcgKzE1OSw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCB2aWFkcnZfYWNrbm93bGVkZ2VfaXJxcyhkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIF9faW5saW5lX18gdm9pZCB2aWFkcnZfYWNrbm93bGVkZ2VfaXJxcyhkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJdTMyIHN0YXR1czsKIApAQCAtMjA3LDcgKzIwNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXZpYV9kcml2ZXJfaXJxX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBpcnEsIGludCBmb3JjZV9zZXF1ZW5jZSwKK3ZpYV9kcml2ZXJfaXJxX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycSwgaW50IGZvcmNlX3NlcXVlbmNlLAogCQkgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI2MCw3ICsyNTksNyBAQAogICogZHJtX2RtYS5oIGhvb2tzCiAgKi8KIAotdm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQordm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKQEAgLTMyOSw3ICszMjgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX21hcC5jIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfbWFwLmMKaW5kZXggNmU2ZjkxNS4uNmNjYTlhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfbWFwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfbWFwLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJ2aWFfZHJtLmgiCiAjaW5jbHVkZSAidmlhX2Rydi5oIgogCi1zdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3ZpYV9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCB2aWFfZG9faW5pdF9tYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX3ZpYV9pbml0X3QgKmluaXQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNjgsNyArNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdmlhX2RvX2NsZWFudXBfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQoraW50IHZpYV9kb19jbGVhbnVwX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXZpYV9kbWFfY2xlYW51cChkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9tbS5jIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfbW0uYwppbmRleCBmNjk0Y2I1Li42Y2MyZGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX21tLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJkcm1fc21hbi5oIgogCiAjZGVmaW5lIFZJQV9NTV9BTElHTl9TSElGVCA0Ci0jZGVmaW5lIFZJQV9NTV9BTElHTl9NQVNLICggKDEgPDwgVklBX01NX0FMSUdOX1NISUZUKSAtIDEpCisjZGVmaW5lIFZJQV9NTV9BTElHTl9NQVNLICgoMSA8PCBWSUFfTU1fQUxJR05fU0hJRlQpIC0gMSkKIAogaW50IHZpYV9hZ3BfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKQEAgLTE3Miw3ICsxNzIsNyBAQAogfQogCiAKLXZvaWQgdmlhX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCit2b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE4Myw5ICsxODMsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KSB7CisJaWYgKGRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KQogCQlkZXYtPmRyaXZlci0+ZG1hX3F1aWVzY2VudChkZXYpOwotCX0KIAogCWRybV9zbWFuX293bmVyX2NsZWFudXAoJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylmaWxlX3ByaXYpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmVyaWZpZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX3ZlcmlmaWVyLmMKaW5kZXggNDZhNTc5MS4uNDg5NTdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmVyaWZpZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV92ZXJpZmllci5jCkBAIC0yMzUsNyArMjM1LDcgQEAKIHN0YXRpYyBoYXphcmRfdCB0YWJsZTNbMjU2XTsKIAogc3RhdGljIF9faW5saW5lX18gaW50Ci1lYXRfd29yZHMoY29uc3QgdWludDMyX3QgKiogYnVmLCBjb25zdCB1aW50MzJfdCAqIGJ1Zl9lbmQsIHVuc2lnbmVkIG51bV93b3JkcykKK2VhdF93b3Jkcyhjb25zdCB1aW50MzJfdCAqKmJ1ZiwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQsIHVuc2lnbmVkIG51bV93b3JkcykKIHsKIAlpZiAoKGJ1Zl9lbmQgLSAqYnVmKSA+PSBudW1fd29yZHMpIHsKIAkJKmJ1ZiArPSBudW1fd29yZHM7CkBAIC0yNTIsNyArMjUyLDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIGRybV9sb2NhbF9tYXBfdCAqdmlhX2RybV9sb29rdXBfYWdwX21hcChkcm1fdmlhX3N0YXRlX3QgKnNlcSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCQkgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCisJCQkJCQkgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAJZHJtX2xvY2FsX21hcF90ICptYXAgPSBzZXEtPm1hcF9jYWNoZTsKQEAgLTM0NCw3ICszNDQsNyBAQAogfQogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKLWludmVzdGlnYXRlX2hhemFyZCh1aW50MzJfdCBjbWQsIGhhemFyZF90IGh6LCBkcm1fdmlhX3N0YXRlX3QgKiBjdXJfc2VxKQoraW52ZXN0aWdhdGVfaGF6YXJkKHVpbnQzMl90IGNtZCwgaGF6YXJkX3QgaHosIGRybV92aWFfc3RhdGVfdCAqY3VyX3NlcSkKIHsKIAlyZWdpc3RlciB1aW50MzJfdCB0bXAsICp0bXBfYWRkcjsKIApAQCAtNTE4LDcgKzUxOCw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludAogdmlhX2NoZWNrX3ByaW1fbGlzdCh1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKiBidWZfZW5kLAotCQkgICAgZHJtX3ZpYV9zdGF0ZV90ICogY3VyX3NlcSkKKwkJICAgIGRybV92aWFfc3RhdGVfdCAqY3VyX3NlcSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3ZpYV9wcml2YXRlX3QgKikgY3VyX3NlcS0+ZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYyMSw4ICs2MjEsOCBAQAogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Ci12aWFfY2hlY2tfaGVhZGVyMih1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKiBidWZfZW5kLAotCQkgIGRybV92aWFfc3RhdGVfdCAqIGhjX3N0YXRlKQordmlhX2NoZWNrX2hlYWRlcjIodWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kLAorCQkgIGRybV92aWFfc3RhdGVfdCAqaGNfc3RhdGUpCiB7CiAJdWludDMyX3QgY21kOwogCWludCBoel9tb2RlOwpAQCAtNzA2LDE2ICs3MDYsMTUgQEAKIAkJCXJldHVybiBzdGF0ZV9lcnJvcjsKIAkJfQogCX0KLQlpZiAoaGNfc3RhdGUtPnVuZmluaXNoZWQgJiYgZmluaXNoX2N1cnJlbnRfc2VxdWVuY2UoaGNfc3RhdGUpKSB7CisJaWYgKGhjX3N0YXRlLT51bmZpbmlzaGVkICYmIGZpbmlzaF9jdXJyZW50X3NlcXVlbmNlKGhjX3N0YXRlKSkKIAkJcmV0dXJuIHN0YXRlX2Vycm9yOwotCX0KIAkqYnVmZmVyID0gYnVmOwogCXJldHVybiBzdGF0ZV9jb21tYW5kOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Ci12aWFfcGFyc2VfaGVhZGVyMihkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwKLQkJICBjb25zdCB1aW50MzJfdCAqIGJ1Zl9lbmQsIGludCAqZmlyZV9jb3VudCkKK3ZpYV9wYXJzZV9oZWFkZXIyKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdWludDMyX3QgY29uc3QgKipidWZmZXIsCisJCSAgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQsIGludCAqZmlyZV9jb3VudCkKIHsKIAl1aW50MzJfdCBjbWQ7CiAJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CkBAIC04MzMsOCArODMyLDggQEAKIH0KIAogc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAotdmlhX3BhcnNlX2hlYWRlcjEoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdWludDMyX3QgY29uc3QgKipidWZmZXIsCi0JCSAgY29uc3QgdWludDMyX3QgKiBidWZfZW5kKQordmlhX3BhcnNlX2hlYWRlcjEoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwKKwkJICBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCkKIHsKIAlyZWdpc3RlciB1aW50MzJfdCBjbWQ7CiAJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CkBAIC04NTEsNyArODUwLDcgQEAKIH0KIAogc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAotdmlhX2NoZWNrX3ZoZWFkZXI1KHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqIGJ1Zl9lbmQpCit2aWFfY2hlY2tfdmhlYWRlcjUodWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kKQogewogCXVpbnQzMl90IGRhdGE7CiAJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CkBAIC04ODQsOCArODgzLDggQEAKIH0KIAogc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAotdmlhX3BhcnNlX3ZoZWFkZXI1KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLAotCQkgICBjb25zdCB1aW50MzJfdCAqIGJ1Zl9lbmQpCit2aWFfcGFyc2VfdmhlYWRlcjUoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwKKwkJICAgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQpCiB7CiAJdWludDMyX3QgYWRkciwgY291bnQsIGk7CiAJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CkBAIC04OTMsOSArODkyLDggQEAKIAlhZGRyID0gKmJ1ZisrICYgflZJQV9WSURFT01BU0s7CiAJaSA9IGNvdW50ID0gKmJ1ZjsKIAlidWYgKz0gMzsKLQl3aGlsZSAoaS0tKSB7CisJd2hpbGUgKGktLSkKIAkJVklBX1dSSVRFKGFkZHIsICpidWYrKyk7Ci0JfQogCWlmIChjb3VudCAmIDMpCiAJCWJ1ZiArPSA0IC0gKGNvdW50ICYgMyk7CiAJKmJ1ZmZlciA9IGJ1ZjsKQEAgLTk0MCw4ICs5MzgsOCBAQAogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Ci12aWFfcGFyc2VfdmhlYWRlcjYoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdWludDMyX3QgY29uc3QgKipidWZmZXIsCi0JCSAgIGNvbnN0IHVpbnQzMl90ICogYnVmX2VuZCkKK3ZpYV9wYXJzZV92aGVhZGVyNihkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLAorCQkgICBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCkKIHsKIAogCXVpbnQzMl90IGFkZHIsIGNvdW50LCBpOwpAQCAtMTAzNyw3ICsxMDM1LDcgQEAKIH0KIAogaW50Ci12aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLAordmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNvbnN0IHVpbnQzMl90ICpidWYsCiAJCQkgdW5zaWduZWQgaW50IHNpemUpCiB7CiAKQEAgLTEwODUsOSArMTA4Myw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KLQlpZiAoc3RhdGUgPT0gc3RhdGVfZXJyb3IpIHsKKwlpZiAoc3RhdGUgPT0gc3RhdGVfZXJyb3IpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5NiwxMyArMTA5MywxMSBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQogCQl0YWJsZVtpXSA9IGZvcmJpZGRlbl9jb21tYW5kOwotCX0KIAotCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKQogCQl0YWJsZVtpbml0X3RhYmxlW2ldLmNvZGVdID0gaW5pdF90YWJsZVtpXS5oejsKLQl9CiB9CiAKIHZvaWQgdmlhX2luaXRfY29tbWFuZF92ZXJpZmllcih2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmVyaWZpZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX3ZlcmlmaWVyLmgKaW5kZXggZDZmODIxNC4uMjZiNmQzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmVyaWZpZXIuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV92ZXJpZmllci5oCkBAIC01NCw4ICs1NCw4IEBACiAJY29uc3QgdWludDMyX3QgKmJ1Zl9zdGFydDsKIH0gZHJtX3ZpYV9zdGF0ZV90OwogCi1leHRlcm4gaW50IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLAotCQkJCSAgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBhZ3ApOworZXh0ZXJuIGludCB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKGNvbnN0IHVpbnQzMl90ICpidWYsIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGFncCk7CiBleHRlcm4gaW50IHZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCB1aW50MzJfdCAqYnVmLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX3ZpZGVvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV92aWRlby5jCmluZGV4IDZlZmFjODEuLjY3NWQzMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfdmlkZW8uYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgInZpYV9kcm0uaCIKICNpbmNsdWRlICJ2aWFfZHJ2LmgiCiAKLXZvaWQgdmlhX2luaXRfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3ZvaWQgdmlhX2luaXRfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC00MSwxMSArNDEsMTEgQEAKIAl9CiB9CiAKLXZvaWQgdmlhX2NsZWFudXBfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3ZvaWQgdmlhX2NsZWFudXBfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2KQogewogfQogCi12b2lkIHZpYV9yZWxlYXNlX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBjb250ZXh0KQordm9pZCB2aWFfcmVsZWFzZV9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBpOwogCXZvbGF0aWxlIGludCAqbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmMKaW5kZXggYjc5M2M4Yy4uOWRkMzk1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmMKQEAgLTc2NCw3ICs3NjQsNyBAQAogCiBzdGF0aWMgaW50IHZtd19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlyZXR1cm4gZHJtX2dldF9kZXYocGRldiwgZW50LCAmZHJpdmVyKTsKKwlyZXR1cm4gZHJtX2dldF9wY2lfZGV2KHBkZXYsIGVudCwgJmRyaXZlcik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHZtd2dmeF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCmluZGV4IGVhYWQ1MjAuLjQyOWY5MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCkBAIC0xNjQsNyArMTY0LDcgQEAKIHN0cnVjdCB2bXdfcHJpdmF0ZSB7CiAJc3RydWN0IHR0bV9ib19kZXZpY2UgYmRldjsKIAlzdHJ1Y3QgdHRtX2JvX2dsb2JhbF9yZWYgYm9fZ2xvYmFsX3JlZjsKLQlzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgbWVtX2dsb2JhbF9yZWY7CisJc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlIG1lbV9nbG9iYWxfcmVmOwogCiAJc3RydWN0IHZtd19maWZvX3N0YXRlIGZpZm87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jCmluZGV4IGIwODY2ZjA0ZS4uODcwOTY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jCkBAIC01MjgsNyArNTI4LDcgQEAKIAkgKiBEaXJ0eSAmIERlZmVycmVkIElPCiAJICovCiAJcGFyLT5kaXJ0eS54MSA9IHBhci0+ZGlydHkueDIgPSAwOwotCXBhci0+ZGlydHkueTEgPSBwYXItPmRpcnR5LnkxID0gMDsKKwlwYXItPmRpcnR5LnkxID0gcGFyLT5kaXJ0eS55MiA9IDA7CiAJcGFyLT5kaXJ0eS5hY3RpdmUgPSB0cnVlOwogCXNwaW5fbG9ja19pbml0KCZwYXItPmRpcnR5LmxvY2spOwogCWluZm8tPmZiZGVmaW8gPSAmdm13X2RlZmlvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Jlc291cmNlLmMKaW5kZXggODYxMjM3OC4uNWYyZDVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jCkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogfQogCiAvKgotICogU3RyZWFtIG1hbmFnbWVudAorICogU3RyZWFtIG1hbmFnZW1lbnQKICAqLwogCiBzdGF0aWMgdm9pZCB2bXdfc3RyZWFtX2Rlc3Ryb3koc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfdHRtX2dsdWUuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3R0bV9nbHVlLmMKaW5kZXggZTNkZjRhZC4uODMxMjMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfdHRtX2dsdWUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF90dG1fZ2x1ZS5jCkBAIC00NCwyOSArNDQsMjkgQEAKIAlyZXR1cm4gdHRtX2JvX21tYXAoZmlscCwgdm1hLCAmZGV2X3ByaXYtPmJkZXYpOwogfQogCi1zdGF0aWMgaW50IHZtd190dG1fbWVtX2dsb2JhbF9pbml0KHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQorc3RhdGljIGludCB2bXdfdHRtX21lbV9nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZikKIHsKIAlEUk1fSU5GTygiZ2xvYmFsIGluaXQuXG4iKTsKIAlyZXR1cm4gdHRtX21lbV9nbG9iYWxfaW5pdChyZWYtPm9iamVjdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZtd190dG1fbWVtX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQorc3RhdGljIHZvaWQgdm13X3R0bV9tZW1fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpCiB7CiAJdHRtX21lbV9nbG9iYWxfcmVsZWFzZShyZWYtPm9iamVjdCk7CiB9CiAKIGludCB2bXdfdHRtX2dsb2JhbF9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7Ci0Jc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpnbG9iYWxfcmVmOworCXN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqZ2xvYmFsX3JlZjsKIAlpbnQgcmV0OwogCiAJZ2xvYmFsX3JlZiA9ICZkZXZfcHJpdi0+bWVtX2dsb2JhbF9yZWY7Ci0JZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBUVE1fR0xPQkFMX1RUTV9NRU07CisJZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBEUk1fR0xPQkFMX1RUTV9NRU07CiAJZ2xvYmFsX3JlZi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHRtX21lbV9nbG9iYWwpOwogCWdsb2JhbF9yZWYtPmluaXQgPSAmdm13X3R0bV9tZW1fZ2xvYmFsX2luaXQ7CiAJZ2xvYmFsX3JlZi0+cmVsZWFzZSA9ICZ2bXdfdHRtX21lbV9nbG9iYWxfcmVsZWFzZTsKIAotCXJldCA9IHR0bV9nbG9iYWxfaXRlbV9yZWYoZ2xvYmFsX3JlZik7CisJcmV0ID0gZHJtX2dsb2JhbF9pdGVtX3JlZihnbG9iYWxfcmVmKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIG1lbW9yeSBhY2NvdW50aW5nLlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC03NSwxMSArNzUsMTEgQEAKIAlkZXZfcHJpdi0+Ym9fZ2xvYmFsX3JlZi5tZW1fZ2xvYiA9CiAJCWRldl9wcml2LT5tZW1fZ2xvYmFsX3JlZi5vYmplY3Q7CiAJZ2xvYmFsX3JlZiA9ICZkZXZfcHJpdi0+Ym9fZ2xvYmFsX3JlZi5yZWY7Ci0JZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBUVE1fR0xPQkFMX1RUTV9CTzsKKwlnbG9iYWxfcmVmLT5nbG9iYWxfdHlwZSA9IERSTV9HTE9CQUxfVFRNX0JPOwogCWdsb2JhbF9yZWYtPnNpemUgPSBzaXplb2Yoc3RydWN0IHR0bV9ib19nbG9iYWwpOwogCWdsb2JhbF9yZWYtPmluaXQgPSAmdHRtX2JvX2dsb2JhbF9pbml0OwogCWdsb2JhbF9yZWYtPnJlbGVhc2UgPSAmdHRtX2JvX2dsb2JhbF9yZWxlYXNlOwotCQlyZXQgPSB0dG1fZ2xvYmFsX2l0ZW1fcmVmKGdsb2JhbF9yZWYpOworCXJldCA9IGRybV9nbG9iYWxfaXRlbV9yZWYoZ2xvYmFsX3JlZik7CiAKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHNldHRpbmcgdXAgVFRNIGJ1ZmZlciBvYmplY3RzLlxuIik7CkBAIC04OCwxMiArODgsMTIgQEAKIAogCXJldHVybiAwOwogb3V0X25vX2JvOgotCXR0bV9nbG9iYWxfaXRlbV91bnJlZigmZGV2X3ByaXYtPm1lbV9nbG9iYWxfcmVmKTsKKwlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT5tZW1fZ2xvYmFsX3JlZik7CiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZCB2bXdfdHRtX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7Ci0JdHRtX2dsb2JhbF9pdGVtX3VucmVmKCZkZXZfcHJpdi0+Ym9fZ2xvYmFsX3JlZi5yZWYpOwotCXR0bV9nbG9iYWxfaXRlbV91bnJlZigmZGV2X3ByaXYtPm1lbV9nbG9iYWxfcmVmKTsKKwlkcm1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT5ib19nbG9iYWxfcmVmLnJlZik7CisJZHJtX2dsb2JhbF9pdGVtX3VucmVmKCZkZXZfcHJpdi0+bWVtX2dsb2JhbF9yZWYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvS2NvbmZpZyBiL2RyaXZlcnMvaGlkL0tjb25maWcKaW5kZXggNDM0MDk5My4uNjM2OWJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC9LY29uZmlnCkBAIC02OCw2ICs2OCwxNCBAQAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBBNCB0ZWNoIFg1IGFuZCBXT1AtMzUgLyBUcnVzdCA0NTBMIG1pY2UuCiAKK2NvbmZpZyBISURfQUNSVVhfRkYKKwl0cmlzdGF0ZSAiQUNSVVggZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUworCS0tLWhlbHAtLS0KKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBBQ1JVWAorCWdhbWUgY29udHJvbGxlcnMuCisKIGNvbmZpZyBISURfQVBQTEUKIAl0cmlzdGF0ZSAiQXBwbGUiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiAoVVNCX0hJRCB8fCBCVF9ISURQKQpAQCAtMTQ4LDYgKzE1NiwxMiBAQAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciB0aGUgZUdhbGF4IGR1YWwtdG91Y2ggcGFuZWwuCiAKK2NvbmZpZyBISURfRUxFQ09NCisJdHJpc3RhdGUgIkVMRUNPTSIKKwlkZXBlbmRzIG9uIEJUX0hJRFAKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgdGhlIEVMRUNPTSBCTTA4NCAoYmx1ZXRvb3RoIG1vdXNlKS4KKwogY29uZmlnIEhJRF9FWktFWQogCXRyaXN0YXRlICJFemtleSIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKQEAgLTQxNywxMCArNDMxLDExIEBACiAJZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGl0LgogCiBjb25maWcgSElEX1RPUFNFRUQKLQl0cmlzdGF0ZSAiVG9wU2VlZCBDeWJlcmxpbmsgcmVtb3RlIGNvbnRyb2wgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiVG9wU2VlZCBDeWJlcmxpbmssIEJUQyBFbXByZXgsIENvbmNlcHRyb25pYyByZW1vdGUgY29udHJvbCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX0hJRAogCS0tLWhlbHAtLS0KLQlTYXkgWSBpZiB5b3UgaGF2ZSBhIFRvcFNlZWQgQ3liZXJsaW5rIG9yIEJUQyBFbXByZXggcmVtb3RlIGNvbnRyb2wuCisJU2F5IFkgaWYgeW91IGhhdmUgYSBUb3BTZWVkIEN5YmVybGluayBvciBCVEMgRW1wcmV4IG9yIENvbmNlcHRyb25pYworCUNMTFJDTUNFIHJlbW90ZSBjb250cm9sLgogCiBjb25maWcgSElEX1RIUlVTVE1BU1RFUgogCXRyaXN0YXRlICJUaHJ1c3RNYXN0ZXIgZGV2aWNlcyBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQppbmRleCA5ODdmYTA2Li40NmYwMzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQpAQCAtMjQsNiArMjQsNyBAQAogCiBvYmotJChDT05GSUdfSElEXzNNX1BDVCkJKz0gaGlkLTNtLXBjdC5vCiBvYmotJChDT05GSUdfSElEX0E0VEVDSCkJKz0gaGlkLWE0dGVjaC5vCitvYmotJChDT05GSUdfSElEX0FDUlVYX0ZGKQkrPSBoaWQtYXhmZi5vCiBvYmotJChDT05GSUdfSElEX0FQUExFKQkJKz0gaGlkLWFwcGxlLm8KIG9iai0kKENPTkZJR19ISURfQkVMS0lOKQkrPSBoaWQtYmVsa2luLm8KIG9iai0kKENPTkZJR19ISURfQ0FORE8pCQkrPSBoaWQtY2FuZG8ubwpAQCAtMzIsNiArMzMsNyBAQAogb2JqLSQoQ09ORklHX0hJRF9DWVBSRVNTKQkrPSBoaWQtY3lwcmVzcy5vCiBvYmotJChDT05GSUdfSElEX0RSQUdPTlJJU0UpCSs9IGhpZC1kcmZmLm8KIG9iai0kKENPTkZJR19ISURfRUdBTEFYKQkrPSBoaWQtZWdhbGF4Lm8KK29iai0kKENPTkZJR19ISURfRUxFQ09NKQkrPSBoaWQtZWxlY29tLm8KIG9iai0kKENPTkZJR19ISURfRVpLRVkpCQkrPSBoaWQtZXprZXkubwogb2JqLSQoQ09ORklHX0hJRF9HWVJBVElPTikJKz0gaGlkLWd5cmF0aW9uLm8KIG9iai0kKENPTkZJR19ISURfS0VOU0lOR1RPTikJKz0gaGlkLWtlbnNpbmd0b24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyZWUxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBBQ1JVWCBnYW1lIGNvbnRyb2xsZXJzCisgKgorICogRnJvbSB3aGF0IEkgaGF2ZSBnYXRoZXJlZCwgdGhlc2UgZGV2aWNlcyBhcmUgbWFzcyBwcm9kdWNlZCBpbiBDaGluYQorICogYnkgc2V2ZXJhbCB2ZW5kb3JzLiBUaGV5IG9mdGVuIHNoYXJlIHRoZSBzYW1lIGRlc2lnbiBhcyB0aGUgb3JpZ2luYWwKKyAqIFhib3ggMzYwIGNvbnRyb2xsZXIuCisgKgorICogMWEzNDowODAyICJBQ1JVWCBVU0IgR0FNRVBBRCA4MTE2IgorICogIC0gdGVzdGVkIHdpdGggYSBFWEVRIEVRLVBDVS0wMjA5MCBnYW1lIGNvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNlcmdlaSBLb2x6dW4gPHgwckBkdi1saWZlLnJ1PgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKyNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCisKK3N0cnVjdCBheGZmX2RldmljZSB7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKK307CisKK3N0YXRpYyBpbnQgYXhmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBheGZmX2RldmljZSAqYXhmZiA9IGRhdGE7CisJaW50IGxlZnQsIHJpZ2h0OworCisJbGVmdCA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsKKwlyaWdodCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CisKKwlkYmdfaGlkKCJjYWxsZWQgd2l0aCAweCUwNHggMHglMDR4IiwgbGVmdCwgcmlnaHQpOworCisJbGVmdCA9IGxlZnQgKiAweGZmIC8gMHhmZmZmOworCXJpZ2h0ID0gcmlnaHQgKiAweGZmIC8gMHhmZmZmOworCisJYXhmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSBsZWZ0OworCWF4ZmYtPnJlcG9ydC0+ZmllbGRbMV0tPnZhbHVlWzBdID0gcmlnaHQ7CisJYXhmZi0+cmVwb3J0LT5maWVsZFsyXS0+dmFsdWVbMF0gPSBsZWZ0OworCWF4ZmYtPnJlcG9ydC0+ZmllbGRbM10tPnZhbHVlWzBdID0gcmlnaHQ7CisJZGJnX2hpZCgicnVubmluZyB3aXRoIDB4JTAyeCAweCUwMngiLCBsZWZ0LCByaWdodCk7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBheGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF4ZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBheGZmX2RldmljZSAqYXhmZjsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9maXJzdF9lbnRyeSgmaGlkLT5pbnB1dHMsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0maGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OworCWludCBlcnJvcjsKKworCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgeworCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVwb3J0ID0gbGlzdF9maXJzdF9lbnRyeShyZXBvcnRfbGlzdCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOworCisJaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCA0KSB7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnQ6ICVkXG4iLCByZXBvcnQtPm1heGZpZWxkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYXhmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBheGZmX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghYXhmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZXRfYml0KEZGX1JVTUJMRSwgZGV2LT5mZmJpdCk7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgYXhmZiwgYXhmZl9wbGF5KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCisJYXhmZi0+cmVwb3J0ID0gcmVwb3J0OworCWF4ZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMDsKKwlheGZmLT5yZXBvcnQtPmZpZWxkWzFdLT52YWx1ZVswXSA9IDB4MDA7CisJYXhmZi0+cmVwb3J0LT5maWVsZFsyXS0+dmFsdWVbMF0gPSAweDAwOworCWF4ZmYtPnJlcG9ydC0+ZmllbGRbM10tPnZhbHVlWzBdID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGF4ZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgRmVlZGJhY2sgZm9yIEFDUlVYIGdhbWUgY29udHJvbGxlcnMgYnkgU2VyZ2VpIEtvbHp1bjx4MHJAZHYtbGlmZS5ydT5cbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX21lbToKKwlrZnJlZShheGZmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgYXhfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlkZXZfZGJnKCZoZGV2LT5kZXYsICJBQ1JVWCBISUQgaGFyZHdhcmUgcHJvYmUuLi4iKTsKKworCWVycm9yID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGF4ZmZfaW5pdChoZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJLyoKKwkJICogRG8gbm90IGZhaWwgZGV2aWNlIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlbHkgYXMgZGV2aWNlCisJCSAqIG1heSBzdGlsbCBiZSBwYXJ0aWFsbHkgb3BlcmFibGUsIGp1c3Qgd2Fybi4KKwkJICovCisJCWRldl93YXJuKCZoZGV2LT5kZXYsCisJCQkgIkZhaWxlZCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCwgZXJyb3I6ICVkXG4iLAorCQkJIGVycm9yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGF4X2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQUNSVVgsIDB4MDgwMiksIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGF4X2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgYXhfZHJpdmVyID0geworCS5uYW1lID0gImFjcnV4IiwKKwkuaWRfdGFibGUgPSBheF9kZXZpY2VzLAorCS5wcm9iZSA9IGF4X3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXhfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZheF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXhfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmYXhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXhfaW5pdCk7Cittb2R1bGVfZXhpdChheF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2VyZ2VpIEtvbHp1biIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBBQ1JVWCBnYW1lIGNvbnRyb2xsZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwppbmRleCA4NjZlNTRlLi5lNjM1MTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKQEAgLTExNTcsNiArMTE1Nyw4IEBACiAKIAlpZiAoaGRldi0+cXVpcmtzICYgSElEX1FVSVJLX0hJRERFVl9GT1JDRSkKIAkJY29ubmVjdF9tYXNrIHw9IChISURfQ09OTkVDVF9ISURERVZfRk9SQ0UgfCBISURfQ09OTkVDVF9ISURERVYpOworCWlmIChoZGV2LT5xdWlya3MgJiBISURfUVVJUktfSElESU5QVVRfRk9SQ0UpCisJCWNvbm5lY3RfbWFzayB8PSBISURfQ09OTkVDVF9ISURJTlBVVF9GT1JDRTsKIAlpZiAoaGRldi0+YnVzICE9IEJVU19VU0IpCiAJCWNvbm5lY3RfbWFzayAmPSB+SElEX0NPTk5FQ1RfSElEREVWOwogCWlmIChoaWRfaGlkZGV2KGhkZXYpKQpAQCAtMTIzOSw2ICsxMjQxLDkgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfM00sIFVTQl9ERVZJQ0VfSURfM00yMjU2KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BNFRFQ0gsIFVTQl9ERVZJQ0VfSURfQTRURUNIX1dDUDMyUFUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfWDVfMDA1RCkgfSwKKyNpZiBkZWZpbmVkKENPTkZJR19ISURfQUNSVVhfRkYpIHx8IGRlZmluZWQoQ09ORklHX0hJRF9BQ1JVWF9GRl9NT0RVTEUpCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FDUlVYLCAweDA4MDIpIH0sCisjZW5kaWYKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQVRWX0lSQ09OVFJPTCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfSVJDT05UUk9MNCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfTUlHSFRZTU9VU0UpIH0sCkBAIC0xMjk0LDYgKzEyOTksNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RSQUdPTlJJU0UsIDB4MDAwNikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRFdBViwgVVNCX0RFVklDRV9JRF9EV0FWX0VHQUxBWF9NVUxUSVRPVUNIKSB9LAorCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FTEVDT00sIFVTQl9ERVZJQ0VfSURfRUxFQ09NX0JNMDg0KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FWktFWSwgVVNCX0RFVklDRV9JRF9CVENfODE5MykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0FNRVJPTiwgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUFNYX0FEQVBUT1IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BDU19BREFQVE9SKSB9LApAQCAtMTM3NSwxMCArMTM4MSwxMCBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjY1MykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSLCAweGI2NTQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQsIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTkspIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQyLCBVU0JfREVWSUNFX0lEX1RPUFNFRUQyX1JGX0NPTUJPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UV0lOSEFOLCBVU0JfREVWSUNFX0lEX1RXSU5IQU5fSVJfUkVNT1RFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfUExVUykgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIFVTQl9ERVZJQ0VfSURfV0FDT01fR1JBUEhJUkVfQkxVRVRPT1RIKSB9LAotCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgVVNCX0RFVklDRV9JRF9XQUNPTV9JTlRVT1M0X0JMVUVUT09USCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWkVST1BMVVMsIDB4MDAwNSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWkVST1BMVVMsIDB4MDAzMCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWllEQUNST04sIFVTQl9ERVZJQ0VfSURfWllEQUNST05fUkVNT1RFX0NPTlRST0wpIH0sCkBAIC0xNTg2LDYgKzE1OTIsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRU1fTFQyMCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFksIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VUVCwgVVNCX0RFVklDRV9JRF9UQzVVSCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVRULCBVU0JfREVWSUNFX0lEX1RDNFVNKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDEpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAzKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWVsZWNvbS5jIGIvZHJpdmVycy9oaWQvaGlkLWVsZWNvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDA4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtZWxlY29tLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBFbGVjb20gQk0wODQgKGJsdWV0b290aCBtb3VzZSkuCisgKiAgUmVtb3ZlcyBhIG5vbi1leGlzdGluZyBob3Jpem9udGFsIHdoZWVsIGZyb20KKyAqICB0aGUgSElEIGRlc2NyaXB0b3IuCisgKiAgKFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9uICJoaWQtb3J0ZWsiLikKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFJpY2hhcmQgTmF1YmVyIDxSaWNoYXJkLk5hdWJlckBnbWFpbC5jb20+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCitzdGF0aWMgdm9pZCBlbGVjb21fcmVwb3J0X2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKKwkJdW5zaWduZWQgaW50IHJzaXplKQoreworCWlmIChyc2l6ZSA+PSA0OCAmJiByZGVzY1s0Nl0gPT0gMHgwNSAmJiByZGVzY1s0N10gPT0gMHgwYykgeworCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiRml4aW5nIHVwIEVsZWNvbSBCTTA4NCAiCisJCQkJInJlcG9ydCBkZXNjcmlwdG9yLlxuIik7CisJCXJkZXNjWzQ3XSA9IDB4MDA7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgZWxlY29tX2RldmljZXNbXSA9IHsKKwl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfRUxFQ09NLCBVU0JfREVWSUNFX0lEX0VMRUNPTV9CTTA4NCl9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBlbGVjb21fZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBlbGVjb21fZHJpdmVyID0geworCS5uYW1lID0gImVsZWNvbSIsCisJLmlkX3RhYmxlID0gZWxlY29tX2RldmljZXMsCisJLnJlcG9ydF9maXh1cCA9IGVsZWNvbV9yZXBvcnRfZml4dXAKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVsZWNvbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmVsZWNvbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZWxlY29tX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmVsZWNvbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlbGVjb21faW5pdCk7Cittb2R1bGVfZXhpdChlbGVjb21fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMzE2MDFlZS4uZDNmYzEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtMzQsNiArMzQsOCBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUgkweDAwMDQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQ0VDQURfMzAyCTB4MDAwOAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUNSVVgJCTB4MWEzNAorCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQURTX1RFQ0ggCQkweDA2ZTEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BRFNfVEVDSF9SQURJT19TSTQ3MFgJMHhhMTU1CiAKQEAgLTgxLDEyICs4MywxMiBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfQU5TSQkweDAyMjMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0lTTwkweDAyMjQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0pJUwkweDAyMjUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0kgICAgMHgwMjI5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9JU08gICAgIDB4MDIyYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfSklTICAgICAweDAyMmIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfQU5TSSAgMHgwMjJjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0lTTyAgIDB4MDIyZAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19KSVMgICAweDAyMmUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0kJMHgwMjI5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9JU08JMHgwMjJhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9KSVMJMHgwMjJiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0FOU0kJMHgwMjJjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0lTTwkweDAyMmQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSklTCTB4MDIyZQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0FOU0kJMHgwMjMwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPCTB4MDIzMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUwkweDAyMzIKQEAgLTExOCw4ICsxMjAsOCBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0FWRVJNRURJQQkJMHgwN2NhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVZFUl9GTV9NUjgwMAkweGI4MDAKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFTEtJTiAgICAgICAgICAgMHgwNTBkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0gICAgICAgICAweDMyMDEKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9CRUxLSU4JCTB4MDUwZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0ZMSVBfS1ZNCQkweDMyMDEKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFUktTSElSRQkJMHgwYzk4CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QJMHgxMTQwCkBAIC0xMjgsNyArMTMwLDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9CVENfRU1QUkVYX1JFTU9URQkweDU1NzgKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NBTkRPCQkweDIwODcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSCAweDBhMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSAkweDBhMDEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xMV82IDB4MGIwMwogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0gJCTB4MDY4ZQpAQCAtMTc1LDcgKzE3Nyw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVBTEVYVFJFQU1FX1JBRElPX1NJNDcwMQkweDgxOWEKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFTE9STUUJCTB4MTE2MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFIDB4MDEwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFCTB4MDEwMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRU1fTFQyMAkweDAyMDAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0RNSQkJMHgwYzBiCkBAIC0xODcsMTkgKzE4OSwyMyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0VHQUxBWF9UT1VDSENPTlRST0xMRVIJMHgwMDAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRFdBVl9FR0FMQVhfTVVMVElUT1VDSAkweDQ4MGQKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0VMRUNPTQkJMHgwNTZlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRUxFQ09NX0JNMDg0CTB4MDA2MQorCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfRUxPCQkweDA0RTcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9FTE9fVFMyNzAwCTB4MDAyMAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFkJMHgwZDdmCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUgMHgwMTAwCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FVFQJCTB4MDY2NAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RDNVVICQkweDAzMDkKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9UQzRVTQkJMHgwMzA2CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FVFVSQk9UT1VDSAkweDIyYjkKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9FVFVSQk9UT1VDSAkweDAwMDYKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0VUVAkJMHgwNjY0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVEM1VUgJCTB4MDMwOQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfRVpLRVkgCQkweDA1MTgKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FWktFWQkJMHgwNTE4CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMJCTB4MDAwMgogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfR0FNRVJPTgkJMHgwODEwCkBAIC0yOTYsOSArMzAyLDE2IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfS0JHRUFSCQkweDA4NGUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9LQkdFQVJfSkFNU1RVRElPCTB4MTAwMQogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfS0VOU0lOR1RPTgkweDA0N2QKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9LU19TTElNQkxBREUJMHgyMDQxCisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9LV09STEQJCTB4MWI4MAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0tXT1JMRF9SQURJT19GTTcwMAkweGQ3MDAKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0tZRQkJMHgwNDU4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX0VSR09fNTI1VgkweDAwODcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfR1BFTl81NjAJMHg1MDAzCisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MQUJURUMJCTB4MTAyMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xBQlRFQ19XSVJFTEVTU19LRVlCT0FSRAkweDAwMDYKIApAQCAtMzE4LDkgKzMzMSw2IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfUE9XRVJDT05UUk9MCTB4MjAzMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX01BQ0hJTkVURVNUCTB4MjA0MAogCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfS0VOU0lOR1RPTgkweDA0N2QKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9LU19TTElNQkxBREUJMHgyMDQxCi0KICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSAkJMHgwNDZkCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIJMHhjMTAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9GSVJTVCAgMHhjMTEwCkBAIC0zNzYsMjMgKzM4NiwyMyBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX01PTlRFUkVZCQkweDA1NjYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUJMHgzMDA0CiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OQVRJT05BTF9TRU1JQ09ORFVDVE9SIDB4MDQwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX05fU19IQVJNT05ZCTB4YzM1OQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkFUU1UJCTB4MDhiNworI2RlZmluZSBVU0JfREVWSUNFX0lEX05BVFNVX0dBTUVQQUQJMHgwMDAxCisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OQ1IJCTB4MDQwNAogI2RlZmluZSBVU0JfREVWSUNFX0lEX05DUl9GSVJTVAkJMHgwMzAwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkNSX0xBU1QJCTB4MDNmZgogCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTkFUSU9OQUxfU0VNSUNPTkRVQ1RPUiAweDA0MDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9OX1NfSEFSTU9OWSAgICAgICAweGMzNTkKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX05BVFNVICAgICAgICAgICAgIDB4MDhiNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX05BVFNVX0dBTUVQQUQgICAgIDB4MDAwMQotCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVDCQkweDA3M2UKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORUNfVVNCX0dBTUVfUEFECTB4MDMwMQogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVYVFdJTkRPVwkweDE5MjYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORVhUV0lORE9XX1RPVUNIU0NSRUVOCTB4MDAwMwogCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTlRSSUcgICAgICAgICAgICAgICAgMHgxYjk2CisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTlRSSUcJCTB4MWI5NgogI2RlZmluZSBVU0JfREVWSUNFX0lEX05UUklHX1RPVUNIX1NDUkVFTiAgIDB4MDAwMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX05UUklHX1RPVUNIX1NDUkVFTl8xICAgMHgwMDAzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTlRSSUdfVE9VQ0hfU0NSRUVOXzIgICAweDAwMDQKQEAgLTQyNyw5ICs0MzcsMTIgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QRVRBTFlOWAkJMHgxOGIxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URQkweDAwMzcKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX1BISUxJUFMgICAgICAgMHgwNDcxCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfUEhJTElQUwkJMHgwNDcxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEhJTElQU19JRUVFODAyMTU0X0RPTkdMRSAweDA2MTcKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1BJX0VOR0lORUVSSU5HCTB4MDVmMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1BJX0VOR0lORUVSSU5HX1ZFQ19VU0JfRk9PVFBFREFMCTB4ZmYKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX1BMQVlET1RDT00JMHgwYjQzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUExBWURPVENPTV9FTVNfVVNCSUkJMHgwMDAzCiAKQEAgLTQzOSwxNiArNDUyLDE2IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUFJPRElHRQkJMHgwNWFmCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUFJPRElHRV9DT1JETEVTUwkweDMwNjIKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1FVQU5UQQkJMHgwNDA4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUVVBTlRBX09QVElDQUxfVE9VQ0gJMHgzMDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElYQVJUX0lNQUdJTkdfSU5DX09QVElDQUxfVE9VQ0hfU0NSRUVOCTB4MzAwMQorCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUk9DQ0FUCQkweDFlN2QKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORQkweDJjZWQKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1NBSVRFSwkJMHgwNmEzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JVTUJMRVBBRAkweGZmMTcKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX1FVQU5UQQkJMHgwNDA4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUVVBTlRBX09QVElDQUxfVE9VQ0gJMHgzMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElYQVJUX0lNQUdJTkdfSU5DX09QVElDQUxfVE9VQ0hfU0NSRUVOCTB4MzAwMQotCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FNU1VORwkJMHgwNDE5CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19JUl9SRU1PVEUJMHgwMDAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19XSVJFTEVTU19LQkRfTU9VU0UJMHgwNjAwCkBAIC00NzIsMjAgKzQ4NSwyMyBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSCTB4MDQ0ZgogCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9VQ0hQQUNLCQkweDFiZmQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9UT1VDSFBBQ0tfUlRTCTB4MTY4OAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1RPUFNFRUQJCTB4MDc2NgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RPUFNFRURfQ1lCRVJMSU5LCTB4MDIwNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9QU0VFRDIJCTB4MTc4NAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RPUFNFRUQyX1JGX0NPTUJPCTB4MDAwNAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9QTUFYCQkweDA2NjMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQJMHgwMTAzCiAKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UT1BTRUVECQkweDA3NjYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9UT1BTRUVEX0NZQkVSTElOSwkweDAyMDQKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UT1VDSFBBQ0sJCTB4MWJmZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RPVUNIUEFDS19SVFMJMHgxNjg4CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UVVJCT1gJCTB4MDYyYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRAkweDAyMDEKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX1RXSU5IQU4gICAgICAgICAgIDB4NjI1MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1RXSU5IQU5fSVJfUkVNT1RFIDB4MDEwMAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1RXSU5IQU4JCTB4NjI1MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1RXSU5IQU5fSVJfUkVNT1RFCTB4MDEwMAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfVUNMT0dJQwkJMHg1NTQzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfUEYxMjA5CTB4MDA0MgpAQCAtNTAwLDcgKzUxNiw2IEBACiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XQUNPTQkJMHgwNTZhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfV0FDT01fR1JBUEhJUkVfQkxVRVRPT1RICTB4ODEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9XQUNPTV9JTlRVT1M0X0JMVUVUT09USAkweGJkCiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAJCTB4MDkyNQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1NNQVJUSk9ZX1BMVVMJMHgwMDA1CkBAIC01MjIsOSArNTM3LDQgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9aWURBQ1JPTgkweDEzRUMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9aWURBQ1JPTl9SRU1PVEVfQ09OVFJPTAkweDAwMDYKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0tZRQkJMHgwNDU4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX0VSR09fNTI1VgkweDAwODcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfR1BFTl81NjAJMHg1MDAzCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCmluZGV4IDdhMGQyZTQuLjZjMDNkY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCkBAIC0xOTksMTEgKzE5OSwxMSBAQAogCQljYXNlIEhJRF9HRF9NT1VTRToKIAkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gMHgxMTA7IGJyZWFrOwogCQljYXNlIEhJRF9HRF9KT1lTVElDSzoKLQkJCQkgICAgICBpZiAoY29kZSA8PSAweGYpCi0JCQkJCSAgICAgIGNvZGUgKz0gQlROX0pPWVNUSUNLOwotCQkJCSAgICAgIGVsc2UKLQkJCQkJICAgICAgY29kZSArPSBCVE5fVFJJR0dFUl9IQVBQWTsKLQkJCQkgICAgICBicmVhazsKKwkJCQlpZiAoY29kZSA8PSAweGYpCisJCQkJCWNvZGUgKz0gQlROX0pPWVNUSUNLOworCQkJCWVsc2UKKwkJCQkJY29kZSArPSBCVE5fVFJJR0dFUl9IQVBQWTsKKwkJCQlicmVhazsKIAkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOwogCQlkZWZhdWx0OgogCQkJc3dpdGNoIChmaWVsZC0+cGh5c2ljYWwpIHsKQEAgLTMwMSw2ICszMDEsOSBAQAogCiAJY2FzZSBISURfVVBfRElHSVRJWkVSOgogCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmKSB7CisJCWNhc2UgMHgwMDogLyogVW5kZWZpbmVkICovCisJCQlnb3RvIGlnbm9yZTsKKwogCQljYXNlIDB4MzA6IC8qIFRpcFByZXNzdXJlICovCiAJCQlpZiAoIXRlc3RfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCkpIHsKIAkJCQlkZXZpY2UtPnF1aXJrcyB8PSBISURfUVVJUktfTk9UT1VDSDsKQEAgLTQ4MCw3ICs0ODMsNyBAQAogCiAJY2FzZSBISURfVVBfTE9HSVZFTkRPUjoKIAkJZ290byBpZ25vcmU7Ci0JCisKIAljYXNlIEhJRF9VUF9QSUQ6CiAJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewogCQljYXNlIDB4YTQ6IG1hcF9rZXlfY2xlYXIoQlROX0RFQUQpOwlicmVhazsKQEAgLTUzNCw2ICs1MzcsOSBAQAogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAoYiAtIGEpID4+IDgsIChiIC0gYSkgPj4gNCk7CiAJCWVsc2UJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAwLCAwKTsKIAorCQkvKiB1c2UgYSBsYXJnZXIgZGVmYXVsdCBpbnB1dCBidWZmZXIgZm9yIE1UIGRldmljZXMgKi8KKwkJaWYgKHVzYWdlLT5jb2RlID09IEFCU19NVF9QT1NJVElPTl9YICYmIGlucHV0LT5oaW50X2V2ZW50c19wZXJfcGFja2V0ID09IDApCisJCQlpbnB1dF9zZXRfZXZlbnRzX3Blcl9wYWNrZXQoaW5wdXQsIDYwKTsKIAl9CiAKIAlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfQUJTICYmCkBAIC01ODYsOSArNTkyLDkgQEAKIAkJCWhhdF9kaXIgPSAodmFsdWUgLSB1c2FnZS0+aGF0X21pbikgKiA4IC8gKHVzYWdlLT5oYXRfbWF4IC0gdXNhZ2UtPmhhdF9taW4gKyAxKSArIDE7CiAJCWlmIChoYXRfZGlyIDwgMCB8fCBoYXRfZGlyID4gOCkgaGF0X2RpciA9IDA7CiAJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUgICAgLCBoaWRfaGF0X3RvX2F4aXNbaGF0X2Rpcl0ueCk7Ci0gICAgICAgICAgICAgICAgaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSArIDEsIGhpZF9oYXRfdG9fYXhpc1toYXRfZGlyXS55KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSArIDEsIGhpZF9oYXRfdG9fYXhpc1toYXRfZGlyXS55KTsKKwkJcmV0dXJuOworCX0KIAogCWlmICh1c2FnZS0+aGlkID09IChISURfVVBfRElHSVRJWkVSIHwgMHgwMDNjKSkgeyAvKiBJbnZlcnQgKi8KIAkJKnF1aXJrcyA9IHZhbHVlID8gKCpxdWlya3MgfCBISURfUVVJUktfSU5WRVJUKSA6ICgqcXVpcmtzICYgfkhJRF9RVUlSS19JTlZFUlQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYyBiL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKaW5kZXggZjEwZDU2YS4uMzE5YjBlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCkBAIC0zMCw2ICszMCwyMSBAQAogbW9kdWxlX3BhcmFtKGVtdWxhdGVfc2Nyb2xsX3doZWVsLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZW11bGF0ZV9zY3JvbGxfd2hlZWwsICJFbXVsYXRlIGEgc2Nyb2xsIHdoZWVsIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Nyb2xsX3NwZWVkID0gMzI7CitzdGF0aWMgaW50IHBhcmFtX3NldF9zY3JvbGxfc3BlZWQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkgeworCXVuc2lnbmVkIGxvbmcgc3BlZWQ7CisJaWYgKCF2YWwgfHwgc3RyaWN0X3N0cnRvdWwodmFsLCAwLCAmc3BlZWQpIHx8IHNwZWVkID4gNjMpCisJCXJldHVybiAtRUlOVkFMOworCXNjcm9sbF9zcGVlZCA9IHNwZWVkOworCXJldHVybiAwOworfQorbW9kdWxlX3BhcmFtX2NhbGwoc2Nyb2xsX3NwZWVkLCBwYXJhbV9zZXRfc2Nyb2xsX3NwZWVkLCBwYXJhbV9nZXRfdWludCwgJnNjcm9sbF9zcGVlZCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNjcm9sbF9zcGVlZCwgIlNjcm9sbCBzcGVlZCwgdmFsdWUgZnJvbSAwIChzbG93KSB0byA2MyAoZmFzdCkiKTsKKworc3RhdGljIGJvb2wgc2Nyb2xsX2FjY2VsZXJhdGlvbiA9IGZhbHNlOworbW9kdWxlX3BhcmFtKHNjcm9sbF9hY2NlbGVyYXRpb24sIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhzY3JvbGxfYWNjZWxlcmF0aW9uLCAiQWNjZWxlcmF0ZSBzZXF1ZW50aWFsIHNjcm9sbCBldmVudHMiKTsKKwogc3RhdGljIGJvb2wgcmVwb3J0X3RvdWNoZXMgPSB0cnVlOwogbW9kdWxlX3BhcmFtKHJlcG9ydF90b3VjaGVzLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVwb3J0X3RvdWNoZXMsICJFbWl0IHRvdWNoIHJlY29yZHMgKG90aGVyd2lzZSwgb25seSB1c2UgdGhlbSBmb3IgZW11bGF0aW9uKSIpOwpAQCAtNTAsNiArNjUsOCBAQAogI2RlZmluZSBUT1VDSF9TVEFURV9TVEFSVCAweDMwCiAjZGVmaW5lIFRPVUNIX1NUQVRFX0RSQUcgIDB4NDAKIAorI2RlZmluZSBTQ1JPTExfQUNDRUxfREVGQVVMVCA3CisKIC8qKgogICogc3RydWN0IG1hZ2ljbW91c2Vfc2MgLSBUcmFja3MgTWFnaWMgTW91c2Utc3BlY2lmaWMgZGF0YS4KICAqIEBpbnB1dDogSW5wdXQgZGV2aWNlIHRocm91Z2ggd2hpY2ggd2UgcmVwb3J0IGV2ZW50cy4KQEAgLTc4LDggKzk1LDEwIEBACiAJc3RydWN0IHsKIAkJc2hvcnQgeDsKIAkJc2hvcnQgeTsKKwkJc2hvcnQgc2Nyb2xsX3g7CiAJCXNob3J0IHNjcm9sbF95OwogCQl1OCBzaXplOworCQl1OCBkb3duOwogCX0gdG91Y2hlc1sxNl07CiAJaW50IHRyYWNraW5nX2lkc1sxNl07CiB9OwpAQCAtMTQxLDcgKzE2MCw3IEBACiAJaW5wdXRfcmVwb3J0X2tleShtc2MtPmlucHV0LCBCVE5fUklHSFQsIHN0YXRlICYgMik7CiAKIAlpZiAoc3RhdGUgIT0gbGFzdF9zdGF0ZSkKLQkJbXNjLT5zY3JvbGxfYWNjZWwgPSAwOworCQltc2MtPnNjcm9sbF9hY2NlbCA9IFNDUk9MTF9BQ0NFTF9ERUZBVUxUOwogfQogCiBzdGF0aWMgdm9pZCBtYWdpY21vdXNlX2VtaXRfdG91Y2goc3RydWN0IG1hZ2ljbW91c2Vfc2MgKm1zYywgaW50IHJhd19pZCwgdTggKnRkYXRhKQpAQCAtMTUyLDYgKzE3MSw3IEBACiAJaW50IGlkID0gKG1pc2MgPj4gNikgJiAxNTsKIAlpbnQgeCA9IHhfeSA8PCAxMiA+PiAyMDsKIAlpbnQgeSA9IC0oeF95ID4+IDIwKTsKKwlpbnQgZG93biA9ICh0ZGF0YVs3XSAmIFRPVUNIX1NUQVRFX01BU0spICE9IFRPVUNIX1NUQVRFX05PTkU7CiAKIAkvKiBTdG9yZSB0cmFja2luZyBJRCBhbmQgb3RoZXIgZmllbGRzLiAqLwogCW1zYy0+dHJhY2tpbmdfaWRzW3Jhd19pZF0gPSBpZDsKQEAgLTE2MCw0MiArMTgwLDU0IEBACiAJbXNjLT50b3VjaGVzW2lkXS5zaXplID0gbWlzYyAmIDYzOwogCiAJLyogSWYgcmVxdWVzdGVkLCBlbXVsYXRlIGEgc2Nyb2xsIHdoZWVsIGJ5IGRldGVjdGluZyBzbWFsbAotCSAqIHZlcnRpY2FsIHRvdWNoIG1vdGlvbnMgYWxvbmcgdGhlIG1pZGRsZSBvZiB0aGUgbW91c2UuCisJICogdmVydGljYWwgdG91Y2ggbW90aW9ucy4KIAkgKi8KLQlpZiAoZW11bGF0ZV9zY3JvbGxfd2hlZWwgJiYKLQkgICAgbWlkZGxlX2J1dHRvbl9zdGFydCA8IHggJiYgeCA8IG1pZGRsZV9idXR0b25fc3RvcCkgewotCQlzdGF0aWMgY29uc3QgaW50IGFjY2VsX3Byb2ZpbGVbXSA9IHsKLQkJCTI1NiwgMjI4LCAxOTIsIDE2MCwgMTI4LCA5NiwgNjQsIDMyLAotCQl9OworCWlmIChlbXVsYXRlX3Njcm9sbF93aGVlbCkgewogCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0JCWludCBzdGVwID0gbXNjLT50b3VjaGVzW2lkXS5zY3JvbGxfeSAtIHk7Ci0KLQkJLyogUmVzZXQgYWNjZWxlcmF0aW9uIGFmdGVyIGhhbGYgYSBzZWNvbmQuICovCi0JCWlmICh0aW1lX2FmdGVyKG5vdywgbXNjLT5zY3JvbGxfamlmZmllcyArIEhaIC8gMikpCi0JCQltc2MtPnNjcm9sbF9hY2NlbCA9IDA7CisJCWludCBzdGVwX3ggPSBtc2MtPnRvdWNoZXNbaWRdLnNjcm9sbF94IC0geDsKKwkJaW50IHN0ZXBfeSA9IG1zYy0+dG91Y2hlc1tpZF0uc2Nyb2xsX3kgLSB5OwogCiAJCS8qIENhbGN1bGF0ZSBhbmQgYXBwbHkgdGhlIHNjcm9sbCBtb3Rpb24uICovCiAJCXN3aXRjaCAodGRhdGFbN10gJiBUT1VDSF9TVEFURV9NQVNLKSB7CiAJCWNhc2UgVE9VQ0hfU1RBVEVfU1RBUlQ6CisJCQltc2MtPnRvdWNoZXNbaWRdLnNjcm9sbF94ID0geDsKIAkJCW1zYy0+dG91Y2hlc1tpZF0uc2Nyb2xsX3kgPSB5OwotCQkJbXNjLT5zY3JvbGxfYWNjZWwgPSBtaW5fdChpbnQsIG1zYy0+c2Nyb2xsX2FjY2VsICsgMSwKLQkJCQkJCUFSUkFZX1NJWkUoYWNjZWxfcHJvZmlsZSkgLSAxKTsKKworCQkJLyogUmVzZXQgYWNjZWxlcmF0aW9uIGFmdGVyIGhhbGYgYSBzZWNvbmQuICovCisJCQlpZiAoc2Nyb2xsX2FjY2VsZXJhdGlvbiAmJiB0aW1lX2JlZm9yZShub3csCisJCQkJCQltc2MtPnNjcm9sbF9qaWZmaWVzICsgSFogLyAyKSkKKwkJCQltc2MtPnNjcm9sbF9hY2NlbCA9IG1heF90KGludCwKKwkJCQkJCW1zYy0+c2Nyb2xsX2FjY2VsIC0gMSwgMSk7CisJCQllbHNlCisJCQkJbXNjLT5zY3JvbGxfYWNjZWwgPSBTQ1JPTExfQUNDRUxfREVGQVVMVDsKKwogCQkJYnJlYWs7CiAJCWNhc2UgVE9VQ0hfU1RBVEVfRFJBRzoKLQkJCXN0ZXAgPSBzdGVwIC8gYWNjZWxfcHJvZmlsZVttc2MtPnNjcm9sbF9hY2NlbF07Ci0JCQlpZiAoc3RlcCAhPSAwKSB7Ci0JCQkJbXNjLT50b3VjaGVzW2lkXS5zY3JvbGxfeSA9IHk7CisJCQlzdGVwX3ggLz0gKDY0IC0gKGludClzY3JvbGxfc3BlZWQpICogbXNjLT5zY3JvbGxfYWNjZWw7CisJCQlpZiAoc3RlcF94ICE9IDApIHsKKwkJCQltc2MtPnRvdWNoZXNbaWRdLnNjcm9sbF94IC09IHN0ZXBfeCAqCisJCQkJCSg2NCAtIHNjcm9sbF9zcGVlZCkgKiBtc2MtPnNjcm9sbF9hY2NlbDsKIAkJCQltc2MtPnNjcm9sbF9qaWZmaWVzID0gbm93OwotCQkJCWlucHV0X3JlcG9ydF9yZWwoaW5wdXQsIFJFTF9XSEVFTCwgc3RlcCk7CisJCQkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dCwgUkVMX0hXSEVFTCwgLXN0ZXBfeCk7CisJCQl9CisKKwkJCXN0ZXBfeSAvPSAoNjQgLSAoaW50KXNjcm9sbF9zcGVlZCkgKiBtc2MtPnNjcm9sbF9hY2NlbDsKKwkJCWlmIChzdGVwX3kgIT0gMCkgeworCQkJCW1zYy0+dG91Y2hlc1tpZF0uc2Nyb2xsX3kgLT0gc3RlcF95ICoKKwkJCQkJKDY0IC0gc2Nyb2xsX3NwZWVkKSAqIG1zYy0+c2Nyb2xsX2FjY2VsOworCQkJCW1zYy0+c2Nyb2xsX2ppZmZpZXMgPSBub3c7CisJCQkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dCwgUkVMX1dIRUVMLCBzdGVwX3kpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAl9CiAKIAkvKiBHZW5lcmF0ZSB0aGUgaW5wdXQgZXZlbnRzIGZvciB0aGlzIHRvdWNoLiAqLwotCWlmIChyZXBvcnRfdG91Y2hlcykgeworCWlmIChyZXBvcnRfdG91Y2hlcyAmJiBkb3duKSB7CiAJCWludCBvcmllbnRhdGlvbiA9IChtaXNjID4+IDEwKSAtIDMyOwogCisJCW1zYy0+dG91Y2hlc1tpZF0uZG93biA9IDE7CisKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX01UX1RSQUNLSU5HX0lELCBpZCk7CiAJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19NVF9UT1VDSF9NQUpPUiwgdGRhdGFbM10pOwogCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfVE9VQ0hfTUlOT1IsIHRkYXRhWzRdKTsKQEAgLTIxNSw3ICsyNDcsNyBAQAogewogCXN0cnVjdCBtYWdpY21vdXNlX3NjICptc2MgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBtc2MtPmlucHV0OwotCWludCB4LCB5LCB0cywgaWksIGNsaWNrczsKKwlpbnQgeCwgeSwgdHMsIGlpLCBjbGlja3MsIGxhc3RfdXA7CiAKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIDB4MTA6CkBAIC0yMzUsMTIgKzI2NywyNiBAQAogCQltc2MtPm50b3VjaGVzID0gKHNpemUgLSA2KSAvIDg7CiAJCWZvciAoaWkgPSAwOyBpaSA8IG1zYy0+bnRvdWNoZXM7IGlpKyspCiAJCQltYWdpY21vdXNlX2VtaXRfdG91Y2gobXNjLCBpaSwgZGF0YSArIGlpICogOCArIDYpOworCisJCWlmIChyZXBvcnRfdG91Y2hlcykgeworCQkJbGFzdF91cCA9IDE7CisJCQlmb3IgKGlpID0gMDsgaWkgPCBBUlJBWV9TSVpFKG1zYy0+dG91Y2hlcyk7IGlpKyspIHsKKwkJCQlpZiAobXNjLT50b3VjaGVzW2lpXS5kb3duKSB7CisJCQkJCWxhc3RfdXAgPSAwOworCQkJCQltc2MtPnRvdWNoZXNbaWldLmRvd24gPSAwOworCQkJCX0KKwkJCX0KKwkJCWlmIChsYXN0X3VwKSB7CisJCQkJaW5wdXRfbXRfc3luYyhpbnB1dCk7CisJCQl9CisJCX0KKwogCQkvKiBXaGVuIGVtdWxhdGluZyB0aHJlZS1idXR0b24gbW9kZSwgaXQgaXMgaW1wb3J0YW50CiAJCSAqIHRvIGhhdmUgdGhlIGN1cnJlbnQgdG91Y2ggaW5mb3JtYXRpb24gYmVmb3JlCiAJCSAqIGdlbmVyYXRpbmcgYSBjbGljayBldmVudC4KIAkJICovCi0JCXggPSAoc2lnbmVkIGNoYXIpZGF0YVsxXTsKLQkJeSA9IChzaWduZWQgY2hhcilkYXRhWzJdOworCQl4ID0gKGludCkoKChkYXRhWzNdICYgMHgwYykgPDwgMjgpIHwgKGRhdGFbMV0gPDwgMjIpKSA+PiAyMjsKKwkJeSA9IChpbnQpKCgoZGF0YVszXSAmIDB4MzApIDw8IDI2KSB8IChkYXRhWzJdIDw8IDIyKSkgPj4gMjI7CiAJCWNsaWNrcyA9IGRhdGFbM107CiAJCWJyZWFrOwogCWNhc2UgMHgyMDogLyogVGhlb3JldGljYWxseSBiYXR0ZXJ5IHN0YXR1cyAoMC0xMDApLCBidXQgSSBoYXZlCkBAIC0zMDEsOCArMzQ3LDEwIEBACiAJX19zZXRfYml0KEVWX1JFTCwgaW5wdXQtPmV2Yml0KTsKIAlfX3NldF9iaXQoUkVMX1gsIGlucHV0LT5yZWxiaXQpOwogCV9fc2V0X2JpdChSRUxfWSwgaW5wdXQtPnJlbGJpdCk7Ci0JaWYgKGVtdWxhdGVfc2Nyb2xsX3doZWVsKQorCWlmIChlbXVsYXRlX3Njcm9sbF93aGVlbCkgewogCQlfX3NldF9iaXQoUkVMX1dIRUVMLCBpbnB1dC0+cmVsYml0KTsKKwkJX19zZXRfYml0KFJFTF9IV0hFRUwsIGlucHV0LT5yZWxiaXQpOworCX0KIAogCWlmIChyZXBvcnRfdG91Y2hlcykgewogCQlfX3NldF9iaXQoRVZfQUJTLCBpbnB1dC0+ZXZiaXQpOwpAQCAtMzQ1LDYgKzM5Myw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCW1zYy0+c2Nyb2xsX2FjY2VsID0gU0NST0xMX0FDQ0VMX0RFRkFVTFQ7CisKIAltc2MtPnF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKIAloaWRfc2V0X2RydmRhdGEoaGRldiwgbXNjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYyBiL2RyaXZlcnMvaGlkL2hpZC1waWNvbGNkLmMKaW5kZXggN2FhYmY2NS4uMzQ2ZjBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCkBAIC0xMjcsNiArMTI3LDI2IEBACiAJLmhlaWdodCAgICAgICAgID0gMjYsCiAJLmJpdHNfcGVyX3BpeGVsID0gMSwKIAkuZ3JheXNjYWxlICAgICAgPSAxLAorCS5yZWQgICAgICAgICAgICA9IHsKKwkJLm9mZnNldCA9IDAsCisJCS5sZW5ndGggPSAxLAorCQkubXNiX3JpZ2h0ID0gMCwKKwl9LAorCS5ncmVlbiAgICAgICAgICA9IHsKKwkJLm9mZnNldCA9IDAsCisJCS5sZW5ndGggPSAxLAorCQkubXNiX3JpZ2h0ID0gMCwKKwl9LAorCS5ibHVlICAgICAgICAgICA9IHsKKwkJLm9mZnNldCA9IDAsCisJCS5sZW5ndGggPSAxLAorCQkubXNiX3JpZ2h0ID0gMCwKKwl9LAorCS50cmFuc3AgICAgICAgICA9IHsKKwkJLm9mZnNldCA9IDAsCisJCS5sZW5ndGggPSAwLAorCQkubXNiX3JpZ2h0ID0gMCwKKwl9LAogfTsKICNlbmRpZiAvKiBDT05GSUdfSElEX1BJQ09MQ0RfRkIgKi8KIApAQCAtMTg4LDYgKzIwOCw3IEBACiAJLyogRnJhbWVidWZmZXIgc3R1ZmYgKi8KIAl1OCBmYl91cGRhdGVfcmF0ZTsKIAl1OCBmYl9icHA7CisJdTggZmJfZm9yY2U7CiAJdTggKmZiX3ZiaXRtYXA7CQkvKiBsb2NhbCBjb3B5IG9mIHdoYXQgd2FzIHNlbnQgdG8gUGljb0xDRCAqLwogCXU4ICpmYl9iaXRtYXA7CQkvKiBmcmFtZWJ1ZmZlciAqLwogCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvOwpAQCAtMzQ2LDcgKzM2Nyw3IEBACiAJCQljb25zdCB1OCAqYmRhdGEgPSBiaXRtYXAgKyB0aWxlICogMjU2ICsgY2hpcCAqIDggKyBiICogMzI7CiAJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogCQkJCXRkYXRhW2ldIDw8PSAxOwotCQkJCXRkYXRhW2ldIHw9IChiZGF0YVtpLzhdID4+ICg3IC0gaSAlIDgpKSAmIDB4MDE7CisJCQkJdGRhdGFbaV0gfD0gKGJkYXRhW2kvOF0gPj4gKGkgJSA4KSkgJiAweDAxOwogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChicHAgPT0gOCkgewpAQCAtMzk5LDEzICs0MjAsMTAgQEAKIAogCWlmIChkYXRhLT5mYl9iaXRtYXApIHsKIAkJaWYgKGNsZWFyKSB7Ci0JCQltZW1zZXQoZGF0YS0+ZmJfdmJpdG1hcCwgMHhmZiwgUElDT0xDREZCX1NJWkUpOworCQkJbWVtc2V0KGRhdGEtPmZiX3ZiaXRtYXAsIDAsIFBJQ09MQ0RGQl9TSVpFKTsKIAkJCW1lbXNldChkYXRhLT5mYl9iaXRtYXAsIDAsIFBJQ09MQ0RGQl9TSVpFKmRhdGEtPmZiX2JwcCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBpbnZlcnQgMSBieXRlIGluIGVhY2ggdGlsZSB0byBmb3JjZSByZXNlbmQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBQSUNPTENERkJfU0laRTsgaSArPSA2NCkKLQkJCQlkYXRhLT5mYl92Yml0bWFwW2ldID0gfmRhdGEtPmZiX3ZiaXRtYXBbaV07CiAJCX0KKwkJZGF0YS0+ZmJfZm9yY2UgPSAxOwogCX0KIAogCS8qIHNjaGVkdWxlIGZpcnN0IG91dHB1dCBvZiBmcmFtZWJ1ZmZlciAqLwpAQCAtNDIxLDYgKzQzOSw5IEBACiAJaW50IGNoaXAsIHRpbGUsIG47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICghZGF0YSkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKIAlpZiAoIShkYXRhLT5zdGF0dXMgJiBQSUNPTENEX1JFQURZX0ZCKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CkBAIC00NDAsMTQgKzQ2MSwxOCBAQAogCWZvciAoY2hpcCA9IDA7IGNoaXAgPCA0OyBjaGlwKyspCiAJCWZvciAodGlsZSA9IDA7IHRpbGUgPCA4OyB0aWxlKyspCiAJCQlpZiAocGljb2xjZF9mYl91cGRhdGVfdGlsZShkYXRhLT5mYl92Yml0bWFwLAotCQkJCQlkYXRhLT5mYl9iaXRtYXAsIGRhdGEtPmZiX2JwcCwgY2hpcCwgdGlsZSkpIHsKKwkJCQkJZGF0YS0+ZmJfYml0bWFwLCBkYXRhLT5mYl9icHAsIGNoaXAsIHRpbGUpIHx8CisJCQkJZGF0YS0+ZmJfZm9yY2UpIHsKIAkJCQluICs9IDI7CisJCQkJaWYgKCFkYXRhLT5mYl9pbmZvLT5wYXIpCisJCQkJCXJldHVybjsgLyogZGV2aWNlIGxvc3QhICovCiAJCQkJaWYgKG4gPj0gSElEX09VVFBVVF9GSUZPX1NJWkUgLyAyKSB7CiAJCQkJCXVzYmhpZF93YWl0X2lvKGRhdGEtPmhkZXYpOwogCQkJCQluID0gMDsKIAkJCQl9CiAJCQkJcGljb2xjZF9mYl9zZW5kX3RpbGUoZGF0YS0+aGRldiwgY2hpcCwgdGlsZSk7CiAJCQl9CisJZGF0YS0+ZmJfZm9yY2UgPSBmYWxzZTsKIAlpZiAobikKIAkJdXNiaGlkX3dhaXRfaW8oZGF0YS0+aGRldik7CiB9CkBAIC01MTEsMTEgKzUzNiwyMyBAQAogc3RhdGljIHZvaWQgcGljb2xjZF9mYl9kZXN0cm95KHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBwaWNvbGNkX2RhdGEgKmRhdGEgPSBpbmZvLT5wYXI7CisJdTMyICpyZWZfY250ID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CisJaW50IG1heV9yZWxlYXNlOworCiAJaW5mby0+cGFyID0gTlVMTDsKIAlpZiAoZGF0YSkKIAkJZGF0YS0+ZmJfaW5mbyA9IE5VTEw7CiAJZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvKTsKLQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCisJcmVmX2NudC0tOworCW11dGV4X2xvY2soJmluZm8tPmxvY2spOworCSgqcmVmX2NudCktLTsKKwltYXlfcmVsZWFzZSA9ICFyZWZfY250OworCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CisJaWYgKG1heV9yZWxlYXNlKSB7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJCXZmcmVlKCh1OCAqKWluZm8tPmZpeC5zbWVtX3N0YXJ0KTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgcGljb2xjZF9mYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQpAQCAtNTI2LDI5ICs1NjMsMzcgQEAKIAkvKiBvbmx5IGFsbG93IDEvOCBiaXQgZGVwdGggKDgtYml0IGlzIGdyYXlzY2FsZSkgKi8KIAkqdmFyID0gcGljb2xjZGZiX3ZhcjsKIAl2YXItPmFjdGl2YXRlID0gYWN0aXZhdGU7Ci0JaWYgKGJwcCA+PSA4KQorCWlmIChicHAgPj0gOCkgewogCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gODsKLQllbHNlCisJCXZhci0+cmVkLmxlbmd0aCAgICAgPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCAgID0gODsKKwkJdmFyLT5ibHVlLmxlbmd0aCAgICA9IDg7CisJfSBlbHNlIHsKIAkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDE7CisJCXZhci0+cmVkLmxlbmd0aCAgICAgPSAxOworCQl2YXItPmdyZWVuLmxlbmd0aCAgID0gMTsKKwkJdmFyLT5ibHVlLmxlbmd0aCAgICA9IDE7CisJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBpY29sY2Rfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgcGljb2xjZF9kYXRhICpkYXRhID0gaW5mby0+cGFyOwotCXU4ICpvX2ZiLCAqbl9mYjsKKwl1OCAqdG1wX2ZiLCAqb19mYjsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PREVWOwogCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gZGF0YS0+ZmJfYnBwKQogCQlyZXR1cm4gMDsKIAkvKiBzd2l0Y2ggYmV0d2VlbiAxLzggYml0IGRlcHRocyAqLwogCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgIT0gMSAmJiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgIT0gOCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlvX2ZiID0gZGF0YS0+ZmJfYml0bWFwOwotCW5fZmIgPSB2bWFsbG9jKFBJQ09MQ0RGQl9TSVpFKmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7Ci0JaWYgKCFuX2ZiKQorCW9fZmIgICA9IGRhdGEtPmZiX2JpdG1hcDsKKwl0bXBfZmIgPSBrbWFsbG9jKFBJQ09MQ0RGQl9TSVpFKmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXBfZmIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvKTsKIAkvKiB0cmFuc2xhdGUgRkIgY29udGVudCB0byBuZXcgYml0cy1wZXItcGl4ZWwgKi8KIAlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDEpIHsKIAkJaW50IGksIGI7CkBAIC01NTgsMjQgKzYwMyw4NyBAQAogCQkJCXAgPDw9IDE7CiAJCQkJcCB8PSBvX2ZiW2kqOCtiXSA/IDB4MDEgOiAweDAwOwogCQkJfQorCQkJdG1wX2ZiW2ldID0gcDsKIAkJfQorCQltZW1jcHkob19mYiwgdG1wX2ZiLCBQSUNPTENERkJfU0laRSk7CiAJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfTU9OTzAxOwogCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBQSUNPTENERkJfV0lEVEggLyA4OwogCX0gZWxzZSB7CiAJCWludCBpOworCQltZW1jcHkodG1wX2ZiLCBvX2ZiLCBQSUNPTENERkJfU0laRSk7CiAJCWZvciAoaSA9IDA7IGkgPCBQSUNPTENERkJfU0laRSAqIDg7IGkrKykKLQkJCW5fZmJbaV0gPSBvX2ZiW2kvOF0gJiAoMHgwMSA8PCAoNyAtIGkgJSA4KSkgPyAweGZmIDogMHgwMDsKLQkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCQlvX2ZiW2ldID0gdG1wX2ZiW2kvOF0gJiAoMHgwMSA8PCAoNyAtIGkgJSA4KSkgPyAweGZmIDogMHgwMDsKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjsKIAkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gUElDT0xDREZCX1dJRFRIOwogCX0KIAotCWRhdGEtPmZiX2JpdG1hcCAgID0gbl9mYjsKKwlrZnJlZSh0bXBfZmIpOwogCWRhdGEtPmZiX2JwcCAgICAgID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwotCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIgX19mb3JjZSBfX2lvbWVtICopbl9mYjsKLQlpbmZvLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKW5fZmI7Ci0JaW5mby0+Zml4LnNtZW1fbGVuICAgPSBQSUNPTENERkJfU0laRSpkYXRhLT5mYl9icHA7Ci0JZmJfZGVmZXJyZWRfaW9faW5pdChpbmZvKTsKLQl2ZnJlZShvX2ZiKTsKKwlyZXR1cm4gMDsKK30KKworLyogRG8gcmVmY291bnRpbmcgb24gb3VyIEZCIGFuZCBjbGVhbnVwIHBlciB3b3JrZXIgaWYgRkIgaXMKKyAqIGNsb3NlZCBhZnRlciB1bnBsdWcgb2Ygb3VyIGRldmljZQorICogKGZiX3JlbGVhc2UgaG9sZHMgaW5mby0+bG9jayBhbmQgc3RpbGwgdG91Y2hlcyBpbmZvIGFmdGVyCisgKiAgd2UgcmV0dXJuIHNvIHdlIGNhbid0IHJlbGVhc2UgaXQgaW1tZWRpYXRlbHkuCisgKi8KK3N0cnVjdCBwaWNvbGNkX2ZiX2NsZWFudXBfaXRlbSB7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IHBpY29sY2RfZmJfY2xlYW51cF9pdGVtICpuZXh0OworfTsKK3N0YXRpYyBzdHJ1Y3QgcGljb2xjZF9mYl9jbGVhbnVwX2l0ZW0gKmZiX3BlbmRpbmc7CitERUZJTkVfU1BJTkxPQ0soZmJfcGVuZGluZ19sb2NrKTsKKworc3RhdGljIHZvaWQgcGljb2xjZF9mYl9kb19jbGVhbnVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGljb2xjZF9mYl9jbGVhbnVwX2l0ZW0gKml0ZW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRvIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmZiX3BlbmRpbmdfbG9jaywgZmxhZ3MpOworCQlpdGVtID0gZmJfcGVuZGluZzsKKwkJZmJfcGVuZGluZyA9IGl0ZW0gPyBpdGVtLT5uZXh0IDogTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmJfcGVuZGluZ19sb2NrLCBmbGFncyk7CisKKwkJaWYgKGl0ZW0pIHsKKwkJCXU4ICpmYiA9ICh1OCAqKWl0ZW0tPmluZm8tPmZpeC5zbWVtX3N0YXJ0OworCQkJLyogbWFrZSBzdXJlIHdlIGRvIG5vdCByYWNlIGFnYWluc3QgZmIgY29yZSB3aGVuCisJCQkgKiByZWxlYXNpbmcgKi8KKwkJCW11dGV4X2xvY2soJml0ZW0tPmluZm8tPmxvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZpdGVtLT5pbmZvLT5sb2NrKTsKKwkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaXRlbS0+aW5mbyk7CisJCQl2ZnJlZShmYik7CisJCX0KKwl9IHdoaWxlIChpdGVtKTsKK30KKworREVDTEFSRV9XT1JLKHBpY29sY2RfZmJfY2xlYW51cCwgcGljb2xjZF9mYl9kb19jbGVhbnVwKTsKKworc3RhdGljIGludCBwaWNvbGNkX2ZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1KQoreworCXUzMiAqcmVmX2NudCA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCXJlZl9jbnQtLTsKKworCSgqcmVmX2NudCkrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWNvbGNkX2ZiX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1KQoreworCXUzMiAqcmVmX2NudCA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCXJlZl9jbnQtLTsKKworCSgqcmVmX2NudCkrKzsKKwlpZiAoISpyZWZfY250KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBwaWNvbGNkX2ZiX2NsZWFudXBfaXRlbSAqaXRlbSA9IChzdHJ1Y3QgcGljb2xjZF9mYl9jbGVhbnVwX2l0ZW0gKilyZWZfY250OworCQlpdGVtLS07CisJCXNwaW5fbG9ja19pcnFzYXZlKCZmYl9wZW5kaW5nX2xvY2ssIGZsYWdzKTsKKwkJaXRlbS0+bmV4dCA9IGZiX3BlbmRpbmc7CisJCWZiX3BlbmRpbmcgPSBpdGVtOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYl9wZW5kaW5nX2xvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGVfd29yaygmcGljb2xjZF9mYl9jbGVhbnVwKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4Myw2ICs2OTEsOCBAQAogc3RhdGljIHN0cnVjdCBmYl9vcHMgcGljb2xjZGZiX29wcyA9IHsKIAkub3duZXIgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLmZiX2Rlc3Ryb3kgICA9IHBpY29sY2RfZmJfZGVzdHJveSwKKwkuZmJfb3BlbiAgICAgID0gcGljb2xjZF9mYl9vcGVuLAorCS5mYl9yZWxlYXNlICAgPSBwaWNvbGNkX2ZiX3JlbGVhc2UsCiAJLmZiX3JlYWQgICAgICA9IGZiX3N5c19yZWFkLAogCS5mYl93cml0ZSAgICAgPSBwaWNvbGNkX2ZiX3dyaXRlLAogCS5mYl9ibGFuayAgICAgPSBwaWNvbGNkX2ZiX2JsYW5rLApAQCAtNjYwLDExICs3NzAsMTIgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+aGRldi0+ZGV2OwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gTlVMTDsKLQlpbnQgZXJyb3IgPSAtRU5PTUVNOworCWludCBpLCBlcnJvciA9IC1FTk9NRU07CiAJdTggKmZiX3ZiaXRtYXAgPSBOVUxMOwogCXU4ICpmYl9iaXRtYXAgID0gTlVMTDsKKwl1MzIgKnBhbGV0dGU7CiAKLQlmYl9iaXRtYXAgPSB2bWFsbG9jKFBJQ09MQ0RGQl9TSVpFKnBpY29sY2RmYl92YXIuYml0c19wZXJfcGl4ZWwpOworCWZiX2JpdG1hcCA9IHZtYWxsb2MoUElDT0xDREZCX1NJWkUqOCk7CiAJaWYgKGZiX2JpdG1hcCA9PSBOVUxMKSB7CiAJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IGEgZnJlZSBwYWdlIGZvciBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX25vbWVtOwpAQCAtNjc4LDE4ICs3ODksMjkgQEAKIAogCWRhdGEtPmZiX3VwZGF0ZV9yYXRlID0gUElDT0xDREZCX1VQREFURV9SQVRFX0RFRkFVTFQ7CiAJZGF0YS0+ZmJfZGVmaW8gPSBwaWNvbGNkX2ZiX2RlZmlvOwotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCBkZXYpOworCS8qIFRoZSBleHRyYSBtZW1vcnkgaXM6CisJICogLSBzdHJ1Y3QgcGljb2xjZF9mYl9jbGVhbnVwX2l0ZW0KKwkgKiAtIHUzMiBmb3IgcmVmX2NvdW50CisJICogLSAyNTYqdTMyIGZvciBwc2V1ZG9fcGFsZXR0ZQorCSAqLworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygyNTcgKiBzaXplb2YodTMyKSArIHNpemVvZihzdHJ1Y3QgcGljb2xjZF9mYl9jbGVhbnVwX2l0ZW0pLCBkZXYpOwogCWlmIChpbmZvID09IE5VTEwpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgYSBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX25vbWVtOwogCX0KIAorCXBhbGV0dGUgID0gaW5mby0+cGFyICsgc2l6ZW9mKHN0cnVjdCBwaWNvbGNkX2ZiX2NsZWFudXBfaXRlbSk7CisJKnBhbGV0dGUgPSAxOworCXBhbGV0dGUrKzsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXBhbGV0dGVbaV0gPSBpID4gMCAmJiBpIDwgMTYgPyAweGZmIDogMDsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhbGV0dGU7CiAJaW5mby0+ZmJkZWZpbyA9ICZkYXRhLT5mYl9kZWZpbzsKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyIF9fZm9yY2UgX19pb21lbSAqKWZiX2JpdG1hcDsKIAlpbmZvLT5mYm9wcyA9ICZwaWNvbGNkZmJfb3BzOwogCWluZm8tPnZhciA9IHBpY29sY2RmYl92YXI7CiAJaW5mby0+Zml4ID0gcGljb2xjZGZiX2ZpeDsKLQlpbmZvLT5maXguc21lbV9sZW4gICA9IFBJQ09MQ0RGQl9TSVpFOworCWluZm8tPmZpeC5zbWVtX2xlbiAgID0gUElDT0xDREZCX1NJWkUqODsKIAlpbmZvLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWZiX2JpdG1hcDsKIAlpbmZvLT5wYXIgPSBkYXRhOwogCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKQEAgLTcwNywxOCArODI5LDIwIEBACiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBhdHRyaWJ1dGVzXG4iKTsKIAkJZ290byBlcnJfY2xlYW51cDsKIAl9CisJZmJfZGVmZXJyZWRfaW9faW5pdChpbmZvKTsKIAlkYXRhLT5mYl9pbmZvICAgID0gaW5mbzsKIAllcnJvciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCWlmIChlcnJvcikgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX3N5c2ZzOwogCX0KLQlmYl9kZWZlcnJlZF9pb19pbml0KGluZm8pOwogCS8qIHNjaGVkdWxlIGZpcnN0IG91dHB1dCBvZiBmcmFtZWJ1ZmZlciAqLworCWRhdGEtPmZiX2ZvcmNlID0gMTsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluZm8tPmRlZmVycmVkX3dvcmssIDApOwogCXJldHVybiAwOwogCiBlcnJfc3lzZnM6CisJZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZmJfdXBkYXRlX3JhdGUpOwogZXJyX2NsZWFudXA6CiAJZGF0YS0+ZmJfdmJpdG1hcCA9IE5VTEw7CkBAIC03MzcsMTkgKzg2MSwxNyBAQAogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGF0YS0+ZmJfaW5mbzsKIAl1OCAqZmJfdmJpdG1hcCA9IGRhdGEtPmZiX3ZiaXRtYXA7Ci0JdTggKmZiX2JpdG1hcCAgPSBkYXRhLT5mYl9iaXRtYXA7CiAKIAlpZiAoIWluZm8pCiAJCXJldHVybjsKIAorCWluZm8tPnBhciA9IE5VTEw7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkYXRhLT5oZGV2LT5kZXYsICZkZXZfYXR0cl9mYl91cGRhdGVfcmF0ZSk7CisJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAlkYXRhLT5mYl92Yml0bWFwID0gTlVMTDsKIAlkYXRhLT5mYl9iaXRtYXAgID0gTlVMTDsKIAlkYXRhLT5mYl9icHAgICAgID0gMDsKIAlkYXRhLT5mYl9pbmZvICAgID0gTlVMTDsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRhdGEtPmhkZXYtPmRldiwgJmRldl9hdHRyX2ZiX3VwZGF0ZV9yYXRlKTsKLQlmYl9kZWZlcnJlZF9pb19jbGVhbnVwKGluZm8pOwotCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7Ci0JdmZyZWUoZmJfYml0bWFwKTsKIAlrZnJlZShmYl92Yml0bWFwKTsKIH0KIApAQCAtMjU2Niw2ICsyNjg4LDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKIAlkYXRhLT5zdGF0dXMgfD0gUElDT0xDRF9GQUlMRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOworI2lmZGVmIENPTkZJR19ISURfUElDT0xDRF9GQgorCS8qIHNob3J0LWNpcmN1aXQgRkIgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gb3JkZXIgdG8KKwkgKiBhdm9pZCBsb25nIGRlbGF5cyBpZiB3ZSBob3N0IGNvbnNvbGUuCisJICovCisJaWYgKGRhdGEtPmZiX2luZm8pCisJCWRhdGEtPmZiX2luZm8tPnBhciA9IE5VTEw7CisjZW5kaWYKIAogCXBpY29sY2RfZXhpdF9kZXZmcyhkYXRhKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX29wZXJhdGlvbl9tb2RlKTsKQEAgLTI2MjMsNiArMjc1MiwxMCBAQAogc3RhdGljIHZvaWQgX19leGl0IHBpY29sY2RfZXhpdCh2b2lkKQogewogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmcGljb2xjZF9kcml2ZXIpOworI2lmZGVmIENPTkZJR19ISURfUElDT0xDRF9GQgorCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJV0FSTl9PTihmYl9wZW5kaW5nKTsKKyNlbmRpZgogfQogCiBtb2R1bGVfaW5pdChwaWNvbGNkX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuYwppbmRleCAxN2YyZGMwLi5mNzc2OTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuYwpAQCAtMjIsMTEgKzIyLDYgQEAKICAqICAgICAgSXMgaXQgcG9zc2libGUgdG8gcmVtb3ZlIGFuZCByZWluc3RhbGwgdGhlIHVyYiBpbiByYXctZXZlbnQtIG9yIGFueQogICogICAgICBvdGhlciBoYW5kbGVyLCBvciB0byBkZWZlciB0aGlzIGFjdGlvbiB0byBiZSBleGVjdXRlZCBzb21ld2hlcmUgZWxzZT8KICAqCi0gKiBUT0RPIGltcGxlbWVudCBub3RpZmljYXRpb24gbWVjaGFuaXNtIGZvciBvdmVybG9uZyBtYWNybyBleGVjdXRpb24KLSAqICAgICAgSWYgdXNlciB3YW50cyB0byBleGVjdXRlIGFuIG92ZXJsb25nIG1hY3JvIG9ubHkgdGhlIG5hbWVzIG9mIG1hY3Jvc2V0Ci0gKiAgICAgIGFuZCBtYWNybyBhcmUgZ2l2ZW4uIFNob3VsZCB1c2VybGFuZCB0YXAgaGlkcmF3IG9yIGlzIHRoZXJlIGFuCi0gKiAgICAgIGFkZGl0aW9uYWwgc3RyZWFtaW5nIG1lY2hhbmlzbT8KLSAqCiAgKiBUT0RPIGlzIGl0IHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSBncm91cCBmb3Igc3lzZnMgYXR0cmlidXRlcyB2aWEgdWRldj8KICAqLwogCkBAIC0yNzcsNyArMjcyLDcgQEAKIAkJY291bnQgPSBzaXplb2Yoc3RydWN0IGtvbmVfc2V0dGluZ3MpIC0gb2ZmOwogCiAJbXV0ZXhfbG9jaygma29uZS0+a29uZV9sb2NrKTsKLQltZW1jcHkoYnVmLCAma29uZS0+c2V0dGluZ3MgKyBvZmYsIGNvdW50KTsKKwltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikma29uZS0+c2V0dGluZ3MpICsgb2ZmLCBjb3VudCk7CiAJbXV0ZXhfdW5sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMzM3LDcgKzMzMiw3IEBACiAJCWNvdW50ID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpIC0gb2ZmOwogCiAJbXV0ZXhfbG9jaygma29uZS0+a29uZV9sb2NrKTsKLQltZW1jcHkoYnVmLCAma29uZS0+cHJvZmlsZXNbbnVtYmVyIC0gMV0sIHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSk7CisJbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJmtvbmUtPnByb2ZpbGVzW251bWJlciAtIDFdKSArIG9mZiwgY291bnQpOwogCW11dGV4X3VubG9jaygma29uZS0+a29uZV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKQEAgLTYyMywxOCArNjE4LDYgQEAKIH0KIAogLyoKLSAqIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IHVzZXJsYW5kIHNvZnR3YXJlIHRvIGZpbmQgZGV2aWNlcyB0aGF0IGFyZSBoYW5kbGVkIGJ5Ci0gKiB0aGlzIGRyaXZlci4gVGhpcyBwcm92aWRlcyBhIGNvbnNpc3RlbnQgd2F5IGZvciBhY3R1YWwgYW5kIG9sZGVyIGtlcm5lbHMKLSAqIHdoZXJlIHRoaXMgZHJpdmVyIHJlcGxhY2VkIHVzYmhpZCBpbnN0ZWFkIG9mIGdlbmVyaWMtdXNiLgotICogRHJpdmVyIGNhcGFiaWxpdGllcyBhcmUgZGV0ZXJtaW5lZCBieSB2ZXJzaW9uIG51bWJlci4KLSAqLwotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X2RyaXZlcl92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIFJPQ0NBVF9LT05FX0RSSVZFUl9WRVJTSU9OICJcbiIpOwotfQotCi0vKgogICogUmVhZCBhY3R1YWwgZHBpIHNldHRpbmdzLgogICogUmV0dXJucyByYXcgdmFsdWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gUmVmZXIgdG8gZW51bSBrb25lX3BvbGxpbmdfcmF0ZXMgdG8KICAqIGdldCByZWFsIHZhbHVlLgpAQCAtNjcxLDkgKzY1NCw2IEBACiAJCWtvbmVfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUsCiAJCWtvbmVfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZSk7CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihrb25lX2RyaXZlcl92ZXJzaW9uLCAwNDQwLAotCQlrb25lX3N5c2ZzX3Nob3dfZHJpdmVyX3ZlcnNpb24sIE5VTEwpOwotCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqa29uZV9hdHRyaWJ1dGVzW10gPSB7CiAJCSZkZXZfYXR0cl9hY3R1YWxfZHBpLmF0dHIsCiAJCSZkZXZfYXR0cl9hY3R1YWxfcHJvZmlsZS5hdHRyLApAQCAtNjgxLDcgKzY2MSw2IEBACiAJCSZkZXZfYXR0cl9maXJtd2FyZV92ZXJzaW9uLmF0dHIsCiAJCSZkZXZfYXR0cl90Y3UuYXR0ciwKIAkJJmRldl9hdHRyX3N0YXJ0dXBfcHJvZmlsZS5hdHRyLAotCQkmZGV2X2F0dHJfa29uZV9kcml2ZXJfdmVyc2lvbi5hdHRyLAogCQlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCmluZGV4IDAwM2U2ZjguLjEzMGQ2NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCkBAIC0xNCw4ICsxNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jZGVmaW5lIFJPQ0NBVF9LT05FX0RSSVZFUl9WRVJTSU9OICJ2MC4zLjEiCi0KICNwcmFnbWEgcGFjayhwdXNoKQogI3ByYWdtYSBwYWNrKDEpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYwppbmRleCBlMDVkNDhlLi5mNmU4MGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJcHJpbnRrKEtFUk5fRU1FUkcgInJvY2NhdCBkZXZpY2Ugd2l0aCBtaW5vciAlZCBkb2Vzbid0IGV4aXN0XG4iLAogCQkJCW1pbm9yKTsKIAkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGV4aXRfdW5sb2NrOworCQlnb3RvIGV4aXRfZXJyOwogCX0KIAogCWlmICghZGV2aWNlLT5vcGVuKyspIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQkJCQlQTV9ISU5UX0ZVTExPTik7CiAJCQlpZiAoZXJyb3IgPCAwKSB7CiAJCQkJLS1kZXZpY2UtPm9wZW47Ci0JCQkJZ290byBleGl0X3VubG9jazsKKwkJCQlnb3RvIGV4aXRfZXJyOwogCQkJfQogCQl9CiAJCWVycm9yID0gZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+b3BlbihkZXZpY2UtPmhpZCk7CkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCQlkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXZpY2UtPmhpZCwKIAkJCQkJCVBNX0hJTlRfTk9STUFMKTsKIAkJCS0tZGV2aWNlLT5vcGVuOwotCQkJZ290byBleGl0X3VubG9jazsKKwkJCWdvdG8gZXhpdF9lcnI7CiAJCX0KIAl9CiAKQEAgLTIwMiw2ICsyMDIsOSBAQAogCW11dGV4X3VubG9jaygmZGV2aWNlLT5yZWFkZXJzX2xvY2spOwogCW11dGV4X3VubG9jaygmZGV2aWNlc19sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CitleGl0X2VycjoKKwlrZnJlZShyZWFkZXIpOworCWdvdG8gZXhpdF91bmxvY2s7CiB9CiAKIHN0YXRpYyBpbnQgcm9jY2F0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmggYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmgKaW5kZXggZDhhYWUwYy4uMDllODY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuaApAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ISURfUk9DQ0FUKSB8fCBkZWZpbmVkIChDT05GSUdfSElEX1JPQ0NBVF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfSElEX1JPQ0NBVCkgfHwgZGVmaW5lZChDT05GSUdfSElEX1JPQ0NBVF9NT0RVTEUpCiBpbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CiB2b2lkIHJvY2NhdF9kaXNjb25uZWN0KGludCBtaW5vcik7CiBpbnQgcm9jY2F0X3JlcG9ydF9ldmVudChpbnQgbWlub3IsIHU4IGNvbnN0ICpkYXRhLCBpbnQgbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMgYi9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jCmluZGV4IDJlZWJkY2MuLjU3NzFmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpAQCAtNiw2ICs2LDkgQEAKICAqCiAgKiAgTW9kaWZpZWQgdG8gYWxzbyBzdXBwb3J0IEJUQyAiRW1wcmV4IDMwMDlVUkYgSUlJIFZpc3RhIE1DRSBSZW1vdGUiIGJ5CiAgKiAgV2F5bmUgVGhvbWFzIDIwMTAuCisgKgorICogIE1vZGlmaWVkIHRvIHN1cHBvcnQgQ29uY2VwdHJvbmljIENMTFJDTUNFIGJ5CisgKiAgS2VlcyBCYWtrZXIgMjAxMC4KICAqLwogCiAvKgpAQCAtMzQsNiArMzcsNyBAQAogCWNhc2UgMHgwMGQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX01FRElBKTsJYnJlYWs7CiAJY2FzZSAweDAyNDogdHNfbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7CQlicmVhazsKIAljYXNlIDB4MDI1OiB0c19tYXBfa2V5X2NsZWFyKEtFWV9UVik7CQlicmVhazsKKwljYXNlIDB4MDI3OiB0c19tYXBfa2V5X2NsZWFyKEtFWV9NT0RFKTsJCWJyZWFrOwogCWNhc2UgMHgwMzE6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0FVRElPKTsJYnJlYWs7CiAJY2FzZSAweDAzMjogdHNfbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7CQlicmVhazsKIAljYXNlIDB4MDMzOiB0c19tYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMKTsJYnJlYWs7CkBAIC02MCw2ICs2NCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgdHNfZGV2aWNlc1tdID0gewogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UT1BTRUVELCBVU0JfREVWSUNFX0lEX1RPUFNFRURfQ1lCRVJMSU5LKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CVEMsIFVTQl9ERVZJQ0VfSURfQlRDX0VNUFJFWF9SRU1PVEUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQyLCBVU0JfREVWSUNFX0lEX1RPUFNFRUQyX1JGX0NPTUJPKSB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCB0c19kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC13YWNvbS5jIGIvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKaW5kZXggMWUwNTFmMS4uODA3ZGNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKQEAgLTQzNiw3ICs0MzYsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgd2Fjb21fZGV2aWNlc1tdID0gewogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgVVNCX0RFVklDRV9JRF9XQUNPTV9HUkFQSElSRV9CTFVFVE9PVEgpIH0sCi0JeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCBVU0JfREVWSUNFX0lEX1dBQ09NX0lOVFVPUzRfQkxVRVRPT1RIKSB9LAorCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHdhY29tX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkcmF3LmMgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwppbmRleCAzY2NkNDc4Li40N2Q3MGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWRyYXcuYworKysgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwpAQCAtNDYsNyArNDYsNiBAQAogewogCXN0cnVjdCBoaWRyYXdfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmV0ID0gMCwgbGVuOwotCWNoYXIgKnJlcG9ydDsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCW11dGV4X2xvY2soJmxpc3QtPnJlYWRfbXV0ZXgpOwpAQCAtODQsNyArODMsNiBAQAogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAKLQkJcmVwb3J0ID0gbGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLnZhbHVlOwogCQlsZW4gPSBsaXN0LT5idWZmZXJbbGlzdC0+dGFpbF0ubGVuID4gY291bnQgPwogCQkJY291bnQgOiBsaXN0LT5idWZmZXJbbGlzdC0+dGFpbF0ubGVuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCA1ZjVhYTM5Li4yNjQzZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTc1LDYgKzc1LDggQEAKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQX0xURCwgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVBfTFREMiwgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCisJeyBVU0JfVkVORE9SX0lEX1BJX0VOR0lORUVSSU5HLCBVU0JfREVWSUNFX0lEX1BJX0VOR0lORUVSSU5HX1ZFQ19VU0JfRk9PVFBFREFMLCBISURfUVVJUktfSElESU5QVVRfRk9SQ0UgfSwKKwogCXsgMCwgMCB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggYzI0ZDJmYS4uMjU0YTAwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtNjcsNyArNjcsNyBAQAogCXN0cnVjdCBtdXRleCB0aHJlYWRfbG9jazsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGlkZGV2ICpoaWRkZXZfdGFibGVbSElEREVWX01JTk9SU107CitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaGlkZGV2X2RyaXZlcjsKIAogLyoKICAqIEZpbmQgYSByZXBvcnQsIGdpdmVuIHRoZSByZXBvcnQncyB0eXBlIGFuZCBJRC4gIFRoZSBJRCBjYW4gYmUgc3BlY2lmaWVkCkBAIC0yNjUsMjIgKzI2NSwxOSBAQAogc3RhdGljIGludCBoaWRkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3Q7Ci0JaW50IHJlcywgaTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgaGlkZGV2ICpoaWRkZXY7CisJaW50IHJlczsKIAotCS8qIFNlZSBjb21tZW50IGluIGhpZGRldl9jb25uZWN0KCkgZm9yIEJLTCBleHBsYW5hdGlvbiAqLwotCWxvY2tfa2VybmVsKCk7Ci0JaSA9IGltaW5vcihpbm9kZSkgLSBISURERVZfTUlOT1JfQkFTRTsKLQotCWlmIChpID49IEhJRERFVl9NSU5PUlMgfHwgaSA8IDAgfHwgIWhpZGRldl90YWJsZVtpXSkKKwlpbnRmID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZoaWRkZXZfZHJpdmVyLCBpbWlub3IoaW5vZGUpKTsKKwlpZiAoIWludGYpCiAJCXJldHVybiAtRU5PREVWOworCWhpZGRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKIAlpZiAoIShsaXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZGRldl9saXN0KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAltdXRleF9pbml0KCZsaXN0LT50aHJlYWRfbG9jayk7Ci0KLQlsaXN0LT5oaWRkZXYgPSBoaWRkZXZfdGFibGVbaV07Ci0KLQorCWxpc3QtPmhpZGRldiA9IGhpZGRldjsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBsaXN0OwogCiAJLyoKQEAgLTI4OSw3ICsyODYsNyBAQAogCSAqLwogCWlmIChsaXN0LT5oaWRkZXYtPmV4aXN0KSB7CiAJCWlmICghbGlzdC0+aGlkZGV2LT5vcGVuKyspIHsKLQkJCXJlcyA9IHVzYmhpZF9vcGVuKGhpZGRldl90YWJsZVtpXS0+aGlkKTsKKwkJCXJlcyA9IHVzYmhpZF9vcGVuKGhpZGRldi0+aGlkKTsKIAkJCWlmIChyZXMgPCAwKSB7CiAJCQkJcmVzID0gLUVJTzsKIAkJCQlnb3RvIGJhaWw7CkBAIC0zMDEsMTIgKzI5OCwxMiBAQAogCX0KIAogCXNwaW5fbG9ja19pcnEoJmxpc3QtPmhpZGRldi0+bGlzdF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZsaXN0LT5ub2RlLCAmaGlkZGV2X3RhYmxlW2ldLT5saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZsaXN0LT5ub2RlLCAmaGlkZGV2LT5saXN0KTsKIAlzcGluX3VubG9ja19pcnEoJmxpc3QtPmhpZGRldi0+bGlzdF9sb2NrKTsKIAogCWlmICghbGlzdC0+aGlkZGV2LT5vcGVuKyspCiAJCWlmIChsaXN0LT5oaWRkZXYtPmV4aXN0KSB7Ci0JCQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaGlkZGV2X3RhYmxlW2ldLT5oaWQ7CisJCQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaGlkZGV2LT5oaWQ7CiAJCQlyZXMgPSB1c2JoaWRfZ2V0X3Bvd2VyKGhpZCk7CiAJCQlpZiAocmVzIDwgMCkgewogCQkJCXJlcyA9IC1FSU87CkBAIC0zMTQsMTMgKzMxMSwxMCBAQAogCQkJfQogCQkJdXNiaGlkX29wZW4oaGlkKTsKIAkJfQotCi0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogYmFpbDoKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCWtmcmVlKGxpc3QpOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC04OTQsMzcgKzg4OCwxNCBAQAogCWhpZC0+aGlkZGV2ID0gaGlkZGV2OwogCWhpZGRldi0+aGlkID0gaGlkOwogCWhpZGRldi0+ZXhpc3QgPSAxOwotCi0JLyoKLQkgKiBCS0wgaGVyZSBpcyB1c2VkIHRvIGF2b2lkIHJhY2UgYWZ0ZXIgdXNiX3JlZ2lzdGVyX2RldigpLgotCSAqIE9uY2UgdGhlIGRldmljZSBub2RlIGhhcyBiZWVuIGNyZWF0ZWQsIG9wZW4oKSBjb3VsZCBoYXBwZW4gb24gaXQuCi0JICogVGhlIGNvZGUgYmVsb3cgd2lsbCB0aGVuIGZhaWwsIGFzIGhpZGRldl90YWJsZSBoYXNuJ3QgYmVlbgotCSAqIHVwZGF0ZWQuCi0JICoKLQkgKiBUaGUgb2J2aW91cyBmaXggLS0gaW50cm9kdWNpbmcgbXV0ZXggdG8gZ3VhcmQgaGlkZGV2X3RhYmxlW10KLQkgKiBkb2Vzbid0IHdvcmssIGFzIHVzYl9vcGVuKCkgYW5kIHVzYl9yZWdpc3Rlcl9kZXYoKSBib3RoIHRha2UKLQkgKiBtaW5vcl9yd3NlbSwgdGh1cyB3ZSdsbCBoYXZlIEFCQkEgZGVhZGxvY2suCi0JICoKLQkgKiBCZWZvcmUgQktMIHB1c2hkb3duLCB1c2Jfb3BlbigpIGhhZCBiZWVuIGFjcXVpcmluZyBpdCBpbiByaWdodAotCSAqIG9yZGVyLCBzbyBfb3BlbigpIHdhcyBzYWZlIHRvIHVzZSBpdCB0byBwcm90ZWN0IGZyb20gdGhpcyByYWNlLgotCSAqIE5vdyB0aGUgb3JkZXIgaXMgZGlmZmVyZW50LCBidXQgQUItQkEgZGVhZGxvY2sgc3RpbGwgZG9lc24ndCBvY2N1cgotCSAqIGFzIEJLTCBpcyBkcm9wcGVkIG9uIHNjaGVkdWxlKCkgKGkuZS4gd2hpbGUgc2xlZXBpbmcgb24KLQkgKiBtaW5vcl9yd3NlbSkuIEZ1Z2x5LgotCSAqLwotCWxvY2tfa2VybmVsKCk7CisJdXNiX3NldF9pbnRmZGF0YSh1c2JoaWQtPmludGYsIHVzYmhpZCk7CiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2Rldih1c2JoaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOwogCWlmIChyZXR2YWwpIHsKIAkJZXJyX2hpZCgiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLiIpOwogCQloaWQtPmhpZGRldiA9IE5VTEw7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAkJa2ZyZWUoaGlkZGV2KTsKIAkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCWhpZC0+bWlub3IgPSB1c2JoaWQtPmludGYtPm1pbm9yOwotCQloaWRkZXZfdGFibGVbdXNiaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk0Miw3ICs5MTMsNiBAQAogCWhpZGRldi0+ZXhpc3QgPSAwOwogCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAotCWhpZGRldl90YWJsZVtoaWRkZXYtPmhpZC0+bWlub3IgLSBISURERVZfTUlOT1JfQkFTRV0gPSBOVUxMOwogCXVzYl9kZXJlZ2lzdGVyX2Rldih1c2JoaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOwogCiAJaWYgKGhpZGRldi0+b3BlbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IGUxOWNmOGUuLjRkMzgyYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTQwNyw2ICs0MDcsMTMgQEAKIAkgIHNlbnNvciBpbnNpZGUgeW91ciBDUFUuIE1vc3Qgb2YgdGhlIGZhbWlseSA2IENQVXMKIAkgIGFyZSBzdXBwb3J0ZWQuIENoZWNrIGRvY3VtZW50YXRpb24vZHJpdmVyIGZvciBkZXRhaWxzLgogCitjb25maWcgU0VOU09SU19QS0dURU1QCisJdHJpc3RhdGUgIkludGVsIHByb2Nlc3NvciBwYWNrYWdlIHRlbXBlcmF0dXJlIHNlbnNvciIKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBwYWNrYWdlIGxldmVsIHRlbXBlcmF0dXJlCisJICBzZW5zb3IgaW5zaWRlIHlvdXIgQ1BVLiBDaGVjayBkb2N1bWVudGF0aW9uL2RyaXZlciBmb3IgZGV0YWlscy4KKwogY29uZmlnIFNFTlNPUlNfSUJNQUVNCiAJdHJpc3RhdGUgIklCTSBBY3RpdmUgRW5lcmd5IE1hbmFnZXIgdGVtcGVyYXR1cmUvcG93ZXIgc2Vuc29ycyBhbmQgY29udHJvbCIKIAlzZWxlY3QgSVBNSV9TSQpAQCAtNDQ2LDYgKzQ1MywxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KIAorY29uZmlnIFNFTlNPUlNfSlo0NzQwCisJdHJpc3RhdGUgIkluZ2VuaWMgSlo0NzQwIFNvQyBBREMgZHJpdmVyIgorCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAgJiYgTUZEX0paNDc0MF9BREMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgcmVhZGluZyBhZGMgdmFsdWVzIGZyb20gdGhlIEFEQ0lOCisJICBwaW4gb24gSW5nZW5pYyBKWjQ3NDAgU29DIGJhc2VkIGJvYXJkcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBqejQ3NDAtaHdtb24uCisKIGNvbmZpZyBTRU5TT1JTX0xNNjMKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTYzIGFuZCBMTTY0IgogCWRlcGVuZHMgb24gSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCAyMTM4Y2ViLi45MTAzYmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTM5LDYgKzM5LDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0FTQzc2MjEpCSs9IGFzYzc2MjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVRYUDEpCSs9IGF0eHAxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0NPUkVURU1QKQkrPSBjb3JldGVtcC5vCitvYmotJChDT05GSUdfU0VOU09SU19QS0dURU1QKQkrPSBwa2d0ZW1wLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RNRTE3MzcpCSs9IGRtZTE3Mzcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRFMxNjIxKQkrPSBkczE2MjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRU1DMTQwMykJKz0gZW1jMTQwMy5vCkBAIC01NSw2ICs1Niw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19JQk1BRU0pCSs9IGlibWFlbS5vCiBvYmotJChDT05GSUdfU0VOU09SU19JQk1QRVgpCSs9IGlibXBleC5vCiBvYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0paNDc0MCkJKz0gano0NzQwLWh3bW9uLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0s4VEVNUCkJKz0gazh0ZW1wLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0sxMFRFTVApCSs9IGsxMHRlbXAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEKSArPSBsaXMzbHYwMmQubyBocF9hY2NlbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2p6NDc0MC1od21vbi5jIGIvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhiM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqIEpaNDc0MCBTb0MgSFdNT04gZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisKK3N0cnVjdCBqejQ3NDBfaHdtb24geworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXZvaWQgX19pb21lbSAqYmFzZTsKKworCWludCBpcnE7CisKKwlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGw7CisJc3RydWN0IGRldmljZSAqaHdtb247CisKKwlzdHJ1Y3QgY29tcGxldGlvbiByZWFkX2NvbXBsZXRpb247CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKK3N0YXRpYyBzc2l6ZV90IGp6NDc0MF9od21vbl9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImp6NDc0MFxuIik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBqejQ3NDBfaHdtb25faXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGp6NDc0MF9od21vbiAqaHdtb24gPSBkYXRhOworCisJY29tcGxldGUoJmh3bW9uLT5yZWFkX2NvbXBsZXRpb24pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHNzaXplX3Qgano0NzQwX2h3bW9uX3JlYWRfYWRjaW4oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBqejQ3NDBfaHdtb24gKmh3bW9uID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb24gPSAmaHdtb24tPnJlYWRfY29tcGxldGlvbjsKKwl1bnNpZ25lZCBsb25nIHQ7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmh3bW9uLT5sb2NrKTsKKworCUlOSVRfQ09NUExFVElPTigqY29tcGxldGlvbik7CisKKwllbmFibGVfaXJxKGh3bW9uLT5pcnEpOworCWh3bW9uLT5jZWxsLT5lbmFibGUodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworCisJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KGNvbXBsZXRpb24sIEhaKTsKKworCWlmICh0ID4gMCkgeworCQl2YWwgPSByZWFkdyhod21vbi0+YmFzZSkgJiAweGZmZjsKKwkJdmFsID0gKHZhbCAqIDMzMDApID4+IDEyOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgdmFsKTsKKwl9IGVsc2UgeworCQlyZXQgPSB0ID8gdCA6IC1FVElNRURPVVQ7CisJfQorCisJaHdtb24tPmNlbGwtPmRpc2FibGUodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworCWRpc2FibGVfaXJxKGh3bW9uLT5pcnEpOworCisJbXV0ZXhfdW5sb2NrKCZod21vbi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgano0NzQwX2h3bW9uX3Nob3dfbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaW4wX2lucHV0LCBTX0lSVUdPLCBqejQ3NDBfaHdtb25fcmVhZF9hZGNpbiwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpqejQ3NDBfaHdtb25fYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9uYW1lLmF0dHIsCisJJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGp6NDc0MF9od21vbl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGp6NDc0MF9od21vbl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgano0NzQwX2h3bW9uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgano0NzQwX2h3bW9uICpod21vbjsKKworCWh3bW9uID0ga21hbGxvYyhzaXplb2YoKmh3bW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFod21vbikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWh3bW9uLT5jZWxsID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlod21vbi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaHdtb24tPmlycSA8IDApIHsKKwkJcmV0ID0gaHdtb24tPmlycTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBpcnE6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWh3bW9uLT5tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaHdtb24tPm1lbSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIG1taW8gcmVzb3VyY2VcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWh3bW9uLT5tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24oaHdtb24tPm1lbS0+c3RhcnQsCisJCQlyZXNvdXJjZV9zaXplKGh3bW9uLT5tZW0pLCBwZGV2LT5uYW1lKTsKKwlpZiAoIWh3bW9uLT5tZW0pIHsKKwkJcmV0ID0gLUVCVVNZOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBtbWlvIG1lbW9yeSByZWdpb25cbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWh3bW9uLT5iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGh3bW9uLT5tZW0tPnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZShod21vbi0+bWVtKSk7CisJaWYgKCFod21vbi0+YmFzZSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIG1taW8gbWVtb3J5XG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKworCWluaXRfY29tcGxldGlvbigmaHdtb24tPnJlYWRfY29tcGxldGlvbik7CisJbXV0ZXhfaW5pdCgmaHdtb24tPmxvY2spOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHdtb24pOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaHdtb24tPmlycSwgano0NzQwX2h3bW9uX2lycSwgMCwgcGRldi0+bmFtZSwgaHdtb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisJZGlzYWJsZV9pcnEoaHdtb24tPmlycSk7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmano0NzQwX2h3bW9uX2F0dHJfZ3JvdXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBncm91cDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCWh3bW9uLT5od21vbiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKGh3bW9uLT5od21vbikpIHsKKwkJcmV0ID0gUFRSX0VSUihod21vbi0+aHdtb24pOworCQlnb3RvIGVycl9yZW1vdmVfZmlsZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbW92ZV9maWxlOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZqejQ3NDBfaHdtb25fYXR0cl9ncm91cCk7CitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoaHdtb24tPmlycSwgaHdtb24pOworZXJyX2lvdW5tYXA6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW91bm1hcChod21vbi0+YmFzZSk7CitlcnJfcmVsZWFzZV9tZW1fcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihod21vbi0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShod21vbi0+bWVtKSk7CitlcnJfZnJlZToKKwlrZnJlZShod21vbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBqejQ3NDBfaHdtb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGp6NDc0MF9od21vbiAqaHdtb24gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGh3bW9uLT5od21vbik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmp6NDc0MF9od21vbl9hdHRyX2dyb3VwKTsKKworCWZyZWVfaXJxKGh3bW9uLT5pcnEsIGh3bW9uKTsKKworCWlvdW5tYXAoaHdtb24tPmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihod21vbi0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShod21vbi0+bWVtKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShod21vbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqejQ3NDBfaHdtb25fZHJpdmVyID0geworCS5wcm9iZQk9IGp6NDc0MF9od21vbl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoano0NzQwX2h3bW9uX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiano0NzQwLWh3bW9uIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGp6NDc0MF9od21vbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmano0NzQwX2h3bW9uX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChqejQ3NDBfaHdtb25faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqejQ3NDBfaHdtb25fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZqejQ3NDBfaHdtb25fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGp6NDc0MF9od21vbl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJKWjQ3NDAgU29DIEhXTU9OIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmp6NDc0MC1od21vbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wa2d0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL3BrZ3RlbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDE1N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9wa2d0ZW1wLmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiBwa2d0ZW1wLmMgLSBMaW51eCBrZXJuZWwgbW9kdWxlIGZvciBwcm9jZXNzb3IgcGFja2FnZSBoYXJkd2FyZSBtb25pdG9yaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEZlbmdodWEgWXUgPGZlbmdodWEueXVAaW50ZWwuY29tPgorICoKKyAqIEluc3BpcmVkIGZyb20gbWFueSBod21vbiBkcml2ZXJzIGVzcGVjaWFsbHkgY29yZXRlbXAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNkZWZpbmUgRFJWTkFNRQkicGtndGVtcCIKKworZW51bSB7IFNIT1dfVEVNUCwgU0hPV19USk1BWCwgU0hPV19UVEFSR0VULCBTSE9XX0xBQkVMLCBTSE9XX05BTUUgfTsKKworLyoKKyAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGtndGVtcF9kYXRhICpwa2d0ZW1wX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RydWN0IHBrZ3RlbXBfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBpZDsKKwl1MTYgcGh5c19wcm9jX2lkOworCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KKwlpbnQgdGVtcDsKKwlpbnQgdGptYXg7CisJaW50IHR0YXJnZXQ7CisJdTggYWxhcm07Cit9OworCisvKgorICogU3lzZnMgc3R1ZmYKKyAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJICAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwa2d0ZW1wX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChhdHRyLT5pbmRleCA9PSBTSE9XX05BTUUpCisJCXJldCA9IHNwcmludGYoYnVmLCAiJXNcbiIsIGRhdGEtPm5hbWUpOworCWVsc2UJLyogc2hvdyBsYWJlbCAqLworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgInBoeXNpY2FsIGlkICVkXG4iLAorCQkJICAgICAgZGF0YS0+cGh5c19wcm9jX2lkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGtndGVtcF9kYXRhICpkYXRhID0gcGtndGVtcF91cGRhdGVfZGV2aWNlKGRldik7CisJLyogcmVhZCB0aGUgT3V0LW9mLXNwZWMgbG9nLCBuZXZlciBjbGVhciAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBrZ3RlbXBfZGF0YSAqZGF0YSA9IHBrZ3RlbXBfdXBkYXRlX2RldmljZShkZXYpOworCWludCBlcnIgPSAwOworCisJaWYgKGF0dHItPmluZGV4ID09IFNIT1dfVEVNUCkKKwkJZXJyID0gZGF0YS0+dmFsaWQgPyBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wKSA6IC1FQUdBSU47CisJZWxzZSBpZiAoYXR0ci0+aW5kZXggPT0gU0hPV19USk1BWCkKKwkJZXJyID0gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGptYXgpOworCWVsc2UKKwkJZXJyID0gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dHRhcmdldCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCBTSE9XX1RFTVApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIFNIT1dfVEpNQVgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgU0hPV19UVEFSR0VUKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbGFiZWwsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCwgU0hPV19MQUJFTCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCwgU0hPV19OQU1FKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBrZ3RlbXBfYXR0cmlidXRlc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbGFiZWwuZGV2X2F0dHIuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwa2d0ZW1wX2dyb3VwID0geworCS5hdHRycyA9IHBrZ3RlbXBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGtndGVtcF9kYXRhICpwa2d0ZW1wX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwa2d0ZW1wX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoIWRhdGEtPnZhbGlkIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopKSB7CisJCXUzMiBlYXgsIGVkeDsKKworCQlkYXRhLT52YWxpZCA9IDA7CisJCWNwdSA9IGRhdGEtPmlkOworCQllcnIgPSByZG1zcl9vbl9jcHUoY3B1LCBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX1NUQVRVUywKKwkJCQkgICAmZWF4LCAmZWR4KTsKKwkJaWYgKCFlcnIpIHsKKwkJCWRhdGEtPmFsYXJtID0gKGVheCA+PiA1KSAmIDE7CisJCQlkYXRhLT50ZW1wID0gZGF0YS0+dGptYXggLSAoKChlYXggPj4gMTYpCisJCQkJCQkJJiAweDdmKSAqIDEwMDApOworCQkJZGF0YS0+dmFsaWQgPSAxOworCQl9IGVsc2UKKwkJCWRldl9kYmcoZGV2LCAiVGVtcGVyYXR1cmUgZGF0YSBpbnZhbGlkICgweCV4KVxuIiwgZWF4KTsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGdldF90am1heChpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGRlZmF1bHRfdGptYXggPSAxMDAwMDA7CisJaW50IGVycjsKKwl1MzIgZWF4LCBlZHg7CisJdTMyIHZhbDsKKworCS8qIElBMzJfVEVNUEVSQVRVUkVfVEFSR0VUIGNvbnRhaW5zIHRoZSBUak1heCB2YWx1ZSAqLworCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KGNwdSwgTVNSX0lBMzJfVEVNUEVSQVRVUkVfVEFSR0VULCAmZWF4LCAmZWR4KTsKKwlpZiAoIWVycikgeworCQl2YWwgPSAoZWF4ID4+IDE2KSAmIDB4ZmY7CisJCWlmICgodmFsID4gODApICYmICh2YWwgPCAxMjApKSB7CisJCQlkZXZfaW5mbyhkZXYsICJUak1heCBpcyAlZCBDLlxuIiwgdmFsKTsKKwkJCXJldHVybiB2YWwgKiAxMDAwOworCQl9CisJfQorCWRldl93YXJuKGRldiwgIlVuYWJsZSB0byByZWFkIFRqTWF4IGZyb20gQ1BVLlxuIik7CisJcmV0dXJuIGRlZmF1bHRfdGptYXg7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBrZ3RlbXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGtndGVtcF9kYXRhICpkYXRhOworCWludCBlcnI7CisJdTMyIGVheCwgZWR4OworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEocGRldi0+aWQpOworI2VuZGlmCisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBrZ3RlbXBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWRhdGEtPmlkID0gcGRldi0+aWQ7CisjaWZkZWYgQ09ORklHX1NNUAorCWRhdGEtPnBoeXNfcHJvY19pZCA9IGMtPnBoeXNfcHJvY19pZDsKKyNlbmRpZgorCWRhdGEtPm5hbWUgPSAicGtndGVtcCI7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogdGVzdCBpZiB3ZSBjYW4gYWNjZXNzIHRoZSBUSEVSTV9TVEFUVVMgTVNSICovCisJZXJyID0gcmRtc3Jfc2FmZV9vbl9jcHUoZGF0YS0+aWQsIE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fU1RBVFVTLAorCQkJCSZlYXgsICZlZHgpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBhY2Nlc3MgVEhFUk1fU1RBVFVTIE1TUiwgZ2l2aW5nIHVwXG4iKTsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJZGF0YS0+dGptYXggPSBnZXRfdGptYXgoZGF0YS0+aWQsICZwZGV2LT5kZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOworCisJZXJyID0gcmRtc3Jfc2FmZV9vbl9jcHUoZGF0YS0+aWQsIE1TUl9JQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCwKKwkJCQkmZWF4LCAmZWR4KTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVhZCIKKwkJCQkiIElBMzJfVEVNUEVSQVRVUkVfVEFSR0VUIE1TUlxuIik7CisJfSBlbHNlIHsKKwkJZGF0YS0+dHRhcmdldCA9IGRhdGEtPnRqbWF4IC0gKCgoZWF4ID4+IDgpICYgMHhmZikgKiAxMDAwKTsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0X2ZyZWU7CisJfQorCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnBrZ3RlbXBfZ3JvdXApOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9mcmVlOworCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNsYXNzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJCWVycik7CisJCWdvdG8gZXhpdF9jbGFzczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9jbGFzczoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmcGtndGVtcF9ncm91cCk7CitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBrZ3RlbXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBrZ3RlbXBfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmcGtndGVtcF9ncm91cCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBrZ3RlbXBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9IERSVk5BTUUsCisJfSwKKwkucHJvYmUgPSBwa2d0ZW1wX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwa2d0ZW1wX3JlbW92ZSksCit9OworCitzdHJ1Y3QgcGRldl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdW5zaWduZWQgaW50IGNwdTsKKyNpZmRlZiBDT05GSUdfU01QCisJdTE2IHBoeXNfcHJvY19pZDsKKyNlbmRpZgorfTsKKworc3RhdGljIExJU1RfSEVBRChwZGV2X2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChwZGV2X2xpc3RfbXV0ZXgpOworCitzdGF0aWMgaW50IF9fY3B1aW5pdCBwa2d0ZW1wX2RldmljZV9hZGQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHBkZXZfZW50cnkgKnBkZXZfZW50cnk7CisjaWZkZWYgQ09ORklHX1NNUAorCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOworI2VuZGlmCisKKwltdXRleF9sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1NNUAorCS8qIE9ubHkga2VlcCB0aGUgZmlyc3QgZW50cnkgaW4gZWFjaCBwYWNrYWdlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwZGV2X2VudHJ5LCAmcGRldl9saXN0LCBsaXN0KSB7CisJCWlmIChjLT5waHlzX3Byb2NfaWQgPT0gcGRldl9lbnRyeS0+cGh5c19wcm9jX2lkKSB7CisJCQllcnIgPSAwOyAgICAgICAgLyogTm90IGFuIGVycm9yICovCisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisjZW5kaWYKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgY3B1KTsKKwlpZiAoIXBkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXBkZXZfZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGRldl9lbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghcGRldl9lbnRyeSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAorCQkgICAgICAgZXJyKTsKKwkJZ290byBleGl0X2RldmljZV9mcmVlOworCX0KKworI2lmZGVmIENPTkZJR19TTVAKKwlwZGV2X2VudHJ5LT5waHlzX3Byb2NfaWQgPSBjLT5waHlzX3Byb2NfaWQ7CisjZW5kaWYKKwlwZGV2X2VudHJ5LT5wZGV2ID0gcGRldjsKKwlwZGV2X2VudHJ5LT5jcHUgPSBjcHU7CisJbGlzdF9hZGRfdGFpbCgmcGRldl9lbnRyeS0+bGlzdCwgJnBkZXZfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZGV2aWNlX2ZyZWU6CisJa2ZyZWUocGRldl9lbnRyeSk7CitleGl0X2RldmljZV9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyB2b2lkIHBrZ3RlbXBfZGV2aWNlX3JlbW92ZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgeworCQlpZiAocC0+Y3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHAtPnBkZXYpOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCWtmcmVlKHApOworCQlmb3JfZWFjaF9jcHUoaSwgY3B1X2NvcmVfbWFzayhjcHUpKSB7CisJCQlpZiAoaSAhPSBjcHUpIHsKKwkJCQllcnIgPSBwa2d0ZW1wX2RldmljZV9hZGQoaSk7CisJCQkJaWYgKCFlcnIpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgX19jcHVpbml0IHBrZ3RlbXBfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpIGhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJcGtndGVtcF9kZXZpY2VfYWRkKGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKKwkJcGtndGVtcF9kZXZpY2VfcmVtb3ZlKGNwdSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBrZ3RlbXBfY3B1X25vdGlmaWVyIF9fcmVmZGF0YSA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHBrZ3RlbXBfY3B1X2NhbGxiYWNrLAorfTsKKyNlbmRpZgkJCQkvKiAhQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBrZ3RlbXBfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAtRU5PREVWOworCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKKworCS8qIHF1aWNrIGNoZWNrIGlmIHdlIHJ1biBJbnRlbCAqLworCWlmIChjcHVfZGF0YSgwKS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpCisJCWdvdG8gZXhpdDsKKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGtndGVtcF9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoaSk7CisKKwkJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BUUykpCisJCQljb250aW51ZTsKKworCQllcnIgPSBwa2d0ZW1wX2RldmljZV9hZGQoaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfZGV2aWNlc191bnJlZzsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJnBkZXZfbGlzdCkpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBleGl0X2RyaXZlcl91bnJlZzsKKwl9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnBrZ3RlbXBfY3B1X25vdGlmaWVyKTsKKyNlbmRpZgorCXJldHVybiAwOworCitleGl0X2RldmljZXNfdW5yZWc6CisJbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwLT5wZGV2KTsKKwkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQlrZnJlZShwKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworZXhpdF9kcml2ZXJfdW5yZWc6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBrZ3RlbXBfZHJpdmVyKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBrZ3RlbXBfZXhpdCh2b2lkKQoreworCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmcGtndGVtcF9jcHVfbm90aWZpZXIpOworI2VuZGlmCisJbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwLT5wZGV2KTsKKwkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQlrZnJlZShwKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwa2d0ZW1wX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZlbmdodWEgWXUgPGZlbmdodWEueXVAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBwcm9jZXNzb3IgcGFja2FnZSB0ZW1wZXJhdHVyZSBtb25pdG9yIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHBrZ3RlbXBfaW5pdCkKK21vZHVsZV9leGl0KHBrZ3RlbXBfZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdWx0cmE0NV9lbnYuYyBiL2RyaXZlcnMvaHdtb24vdWx0cmE0NV9lbnYuYwppbmRleCA1ZGE1OTQyLi44OTY0MzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3VsdHJhNDVfZW52LmMKKysrIGIvZHJpdmVycy9od21vbi91bHRyYTQ1X2Vudi5jCkBAIC0zMTEsMTIgKzMxMSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBlbnZfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmVudl9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZW52X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlbnZfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZlbnZfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZW52X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGVudl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCmluZGV4IGIwMmI0NTMuLmU1OTFkZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYwpAQCAtNjUyLDYgKzY1Miw3IEBACiAJY3BtLT5hZGFwID0gY3BtX29wczsKIAlpMmNfc2V0X2FkYXBkYXRhKCZjcG0tPmFkYXAsIGNwbSk7CiAJY3BtLT5hZGFwLmRldi5wYXJlbnQgPSAmb2ZkZXYtPmRldjsKKwljcG0tPmFkYXAuZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChvZmRldi0+ZGV2Lm9mX25vZGUpOwogCiAJcmVzdWx0ID0gY3BtX2kyY19zZXR1cChjcG0pOwogCWlmIChyZXN1bHQpIHsKQEAgLTY3NiwxMSArNjc3LDYgQEAKIAlkZXZfZGJnKCZvZmRldi0+ZGV2LCAiaHcgcm91dGluZXMgZm9yICVzIHJlZ2lzdGVyZWQuXG4iLAogCQljcG0tPmFkYXAubmFtZSk7CiAKLQkvKgotCSAqIHJlZ2lzdGVyIE9GIEkyQyBkZXZpY2VzCi0JICovCi0Jb2ZfcmVnaXN0ZXJfaTJjX2RldmljZXMoJmNwbS0+YWRhcCwgb2ZkZXYtPmRldi5vZl9ub2RlKTsKLQogCXJldHVybiAwOwogb3V0X3NodXQ6CiAJY3BtX2kyY19zaHV0ZG93bihjcG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pYm1faWljLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwppbmRleCBiZjM0NDEzLi4xMTY4ZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwpAQCAtNzQ1LDYgKzc0NSw3IEBACiAJLyogUmVnaXN0ZXIgaXQgd2l0aCBpMmMgbGF5ZXIgKi8KIAlhZGFwID0gJmRldi0+YWRhcDsKIAlhZGFwLT5kZXYucGFyZW50ID0gJm9mZGV2LT5kZXY7CisJYWRhcC0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChucCk7CiAJc3RybGNweShhZGFwLT5uYW1lLCAiSUJNIElJQyIsIHNpemVvZihhZGFwLT5uYW1lKSk7CiAJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBkZXYpOwogCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRDsKQEAgLTc2MCw5ICs3NjEsNiBAQAogCWRldl9pbmZvKCZvZmRldi0+ZGV2LCAidXNpbmcgJXMgbW9kZVxuIiwKIAkJIGRldi0+ZmFzdF9tb2RlID8gImZhc3QgKDQwMCBrSHopIiA6ICJzdGFuZGFyZCAoMTAwIGtIeikiKTsKIAotCS8qIE5vdyByZWdpc3RlciBhbGwgdGhlIGNoaWxkIG5vZGVzICovCi0Jb2ZfcmVnaXN0ZXJfaTJjX2RldmljZXMoYWRhcCwgbnApOwotCiAJcmV0dXJuIDA7CiAKIGVycm9yX2NsZWFudXA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYwppbmRleCBkZjAwZWIxLi42NTQ1ZDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKQEAgLTYzLDYgKzYzLDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcDsKIAlpbnQgaXJxOworCXUzMiByZWFsX2NsazsKIH07CiAKIHN0cnVjdCBtcGNfaTJjX2RpdmlkZXIgewpAQCAtOTYsMjAgKzk3LDIzIEBACiAvKiBTb21ldGltZXMgOXRoIGNsb2NrIHB1bHNlIGlzbid0IGdlbmVyYXRlZCwgYW5kIHNsYXZlIGRvZXNuJ3QgcmVsZWFzZQogICogdGhlIGJ1cywgYmVjYXVzZSBpdCB3YW50cyB0byBzZW5kIEFDSy4KICAqIEZvbGxvd2luZyBzZXF1ZW5jZSBvZiBlbmFibGluZy9kaXNhYmxpbmcgYW5kIHNlbmRpbmcgc3RhcnQvc3RvcCBnZW5lcmF0ZXMKLSAqIHRoZSBwdWxzZSwgc28gaXQncyBhbGwgT0suCisgKiB0aGUgOSBwdWxzZXMsIHNvIGl0J3MgYWxsIE9LLgogICovCiBzdGF0aWMgdm9pZCBtcGNfaTJjX2ZpeHVwKHN0cnVjdCBtcGNfaTJjICppMmMpCiB7Ci0Jd3JpdGVjY3IoaTJjLCAwKTsKLQl1ZGVsYXkoMzApOwotCXdyaXRlY2NyKGkyYywgQ0NSX01FTik7Ci0JdWRlbGF5KDMwKTsKLQl3cml0ZWNjcihpMmMsIENDUl9NU1RBIHwgQ0NSX01UWCk7Ci0JdWRlbGF5KDMwKTsKLQl3cml0ZWNjcihpMmMsIENDUl9NU1RBIHwgQ0NSX01UWCB8IENDUl9NRU4pOwotCXVkZWxheSgzMCk7Ci0Jd3JpdGVjY3IoaTJjLCBDQ1JfTUVOKTsKLQl1ZGVsYXkoMzApOworCWludCBrOworCXUzMiBkZWxheV92YWwgPSAxMDAwMDAwIC8gaTJjLT5yZWFsX2NsayArIDE7CisKKwlpZiAoZGVsYXlfdmFsIDwgMikKKwkJZGVsYXlfdmFsID0gMjsKKworCWZvciAoayA9IDk7IGs7IGstLSkgeworCQl3cml0ZWNjcihpMmMsIDApOworCQl3cml0ZWNjcihpMmMsIENDUl9NU1RBIHwgQ0NSX01UWCB8IENDUl9NRU4pOworCQl1ZGVsYXkoZGVsYXlfdmFsKTsKKwkJd3JpdGVjY3IoaTJjLCBDQ1JfTUVOKTsKKwkJdWRlbGF5KGRlbGF5X3ZhbCA8PCAxKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgaTJjX3dhaXQoc3RydWN0IG1wY19pMmMgKmkyYywgdW5zaWduZWQgdGltZW91dCwgaW50IHdyaXRpbmcpCkBAIC0xOTAsMTUgKzE5NCwxOCBAQAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgbXBjX2kyY19nZXRfZmRyXzUyeHgoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCB1MzIgY2xvY2ssCi0JCQkJCSAgaW50IHByZXNjYWxlcikKKwkJCQkJICBpbnQgcHJlc2NhbGVyLCB1MzIgKnJlYWxfY2xrKQogewogCWNvbnN0IHN0cnVjdCBtcGNfaTJjX2RpdmlkZXIgKmRpdiA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHB2ciA9IG1mc3ByKFNQUk5fUFZSKTsKIAl1MzIgZGl2aWRlcjsKIAlpbnQgaTsKIAotCWlmIChjbG9jayA9PSBNUENfSTJDX0NMT0NLX0xFR0FDWSkKKwlpZiAoY2xvY2sgPT0gTVBDX0kyQ19DTE9DS19MRUdBQ1kpIHsKKwkJLyogc2VlIGJlbG93IC0gZGVmYXVsdCBmZHIgPSAweDNmIC0+IGRpdiA9IDIwNDggKi8KKwkJKnJlYWxfY2xrID0gbXBjNXh4eF9nZXRfYnVzX2ZyZXF1ZW5jeShub2RlKSAvIDIwNDg7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qIERldGVybWluZSBkaXZpZGVyIHZhbHVlICovCiAJZGl2aWRlciA9IG1wYzV4eHhfZ2V0X2J1c19mcmVxdWVuY3kobm9kZSkgLyBjbG9jazsKQEAgLTIxNiw3ICsyMjMsOCBAQAogCQkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIGRpdiA/IChpbnQpZGl2LT5mZHIgOiAtRUlOVkFMOworCSpyZWFsX2NsayA9IG1wYzV4eHhfZ2V0X2J1c19mcmVxdWVuY3kobm9kZSkgLyBkaXYtPmRpdmlkZXI7CisJcmV0dXJuIChpbnQpZGl2LT5mZHI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBtcGNfaTJjX3NldHVwXzUyeHgoc3RydWN0IGRldmljZV9ub2RlICpub2RlLApAQCAtMjMxLDEzICsyMzksMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJldCA9IG1wY19pMmNfZ2V0X2Zkcl81Mnh4KG5vZGUsIGNsb2NrLCBwcmVzY2FsZXIpOworCXJldCA9IG1wY19pMmNfZ2V0X2Zkcl81Mnh4KG5vZGUsIGNsb2NrLCBwcmVzY2FsZXIsICZpMmMtPnJlYWxfY2xrKTsKIAlmZHIgPSAocmV0ID49IDApID8gcmV0IDogMHgzZjsgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwogCiAJd3JpdGViKGZkciAmIDB4ZmYsIGkyYy0+YmFzZSArIE1QQ19JMkNfRkRSKTsKIAogCWlmIChyZXQgPj0gMCkKLQkJZGV2X2luZm8oaTJjLT5kZXYsICJjbG9jayAlZCBIeiAoZmRyPSVkKVxuIiwgY2xvY2ssIGZkcik7CisJCWRldl9pbmZvKGkyYy0+ZGV2LCAiY2xvY2sgJXUgSHogKGZkcj0lZClcbiIsIGkyYy0+cmVhbF9jbGssCisJCQkgZmRyKTsKIH0KICNlbHNlIC8qICEoQ09ORklHX1BQQ19NUEM1Mnh4IHx8IENPTkZJR19QUENfTVBDNTEyeCkgKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBtcGNfaTJjX3NldHVwXzUyeHgoc3RydWN0IGRldmljZV9ub2RlICpub2RlLApAQCAtMzM0LDE0ICszNDMsMTcgQEAKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgbXBjX2kyY19nZXRfZmRyXzh4eHgoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCB1MzIgY2xvY2ssCi0JCQkJCSAgdTMyIHByZXNjYWxlcikKKwkJCQkJICB1MzIgcHJlc2NhbGVyLCB1MzIgKnJlYWxfY2xrKQogewogCWNvbnN0IHN0cnVjdCBtcGNfaTJjX2RpdmlkZXIgKmRpdiA9IE5VTEw7CiAJdTMyIGRpdmlkZXI7CiAJaW50IGk7CiAKLQlpZiAoY2xvY2sgPT0gTVBDX0kyQ19DTE9DS19MRUdBQ1kpCisJaWYgKGNsb2NrID09IE1QQ19JMkNfQ0xPQ0tfTEVHQUNZKSB7CisJCS8qIHNlZSBiZWxvdyAtIGRlZmF1bHQgZmRyID0gMHgxMDMxIC0+IGRpdiA9IDE2ICogMzA3MiAqLworCQkqcmVhbF9jbGsgPSBmc2xfZ2V0X3N5c19mcmVxKCkgLyBwcmVzY2FsZXIgLyAoMTYgKiAzMDcyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogRGV0ZXJtaW5lIHByb3BlciBkaXZpZGVyIHZhbHVlICovCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJmc2wsbXBjODU0NC1pMmMiKSkKQEAgLTM2NCw2ICszNzYsNyBAQAogCQkJYnJlYWs7CiAJfQogCisJKnJlYWxfY2xrID0gZnNsX2dldF9zeXNfZnJlcSgpIC8gcHJlc2NhbGVyIC8gZGl2LT5kaXZpZGVyOwogCXJldHVybiBkaXYgPyAoaW50KWRpdi0+ZmRyIDogLUVJTlZBTDsKIH0KIApAQCAtMzgwLDcgKzM5Myw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlyZXQgPSBtcGNfaTJjX2dldF9mZHJfOHh4eChub2RlLCBjbG9jaywgcHJlc2NhbGVyKTsKKwlyZXQgPSBtcGNfaTJjX2dldF9mZHJfOHh4eChub2RlLCBjbG9jaywgcHJlc2NhbGVyLCAmaTJjLT5yZWFsX2Nsayk7CiAJZmRyID0gKHJldCA+PSAwKSA/IHJldCA6IDB4MTAzMTsgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwogCiAJd3JpdGViKGZkciAmIDB4ZmYsIGkyYy0+YmFzZSArIE1QQ19JMkNfRkRSKTsKQEAgLTM4OCw3ICs0MDEsNyBAQAogCiAJaWYgKHJldCA+PSAwKQogCQlkZXZfaW5mbyhpMmMtPmRldiwgImNsb2NrICVkIEh6IChkZnNycj0lZCBmZHI9JWQpXG4iLAotCQkJIGNsb2NrLCBmZHIgPj4gOCwgZmRyICYgMHhmZik7CisJCQkgaTJjLT5yZWFsX2NsaywgZmRyID4+IDgsIGZkciAmIDB4ZmYpOwogfQogCiAjZWxzZSAvKiAhQ09ORklHX0ZTTF9TT0MgKi8KQEAgLTUwMCwxMCArNTEzLDE0IEBACiAJCQlyZXR1cm4gLUVJTlRSOwogCQl9CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIEhaKSkgeworCQkJdTggc3RhdHVzID0gcmVhZGIoaTJjLT5iYXNlICsgTVBDX0kyQ19TUik7CisKIAkJCWRldl9kYmcoaTJjLT5kZXYsICJ0aW1lb3V0XG4iKTsKLQkJCWlmIChyZWFkYihpMmMtPmJhc2UgKyBNUENfSTJDX1NSKSA9PQotCQkJICAgIChDU1JfTUNGIHwgQ1NSX01CQiB8IENTUl9SWEFLKSkKKwkJCWlmICgoc3RhdHVzICYgKENTUl9NQ0YgfCBDU1JfTUJCIHwgQ1NSX1JYQUspKSAhPSAwKSB7CisJCQkJd3JpdGViKHN0YXR1cyAmIH5DU1JfTUFMLAorCQkJCSAgICAgICBpMmMtPmJhc2UgKyBNUENfSTJDX1NSKTsKIAkJCQltcGNfaTJjX2ZpeHVwKGkyYyk7CisJCQl9CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlzY2hlZHVsZSgpOwpAQCAtNTk1LDE4ICs2MTIsMjYgQEAKIAkJCW1wY19pMmNfc2V0dXBfOHh4eChvcC0+ZGV2Lm9mX25vZGUsIGkyYywgY2xvY2ssIDApOwogCX0KIAorCXByb3AgPSBvZl9nZXRfcHJvcGVydHkob3AtPmRldi5vZl9ub2RlLCAiZnNsLHRpbWVvdXQiLCAmcGxlbik7CisJaWYgKHByb3AgJiYgcGxlbiA9PSBzaXplb2YodTMyKSkgeworCQltcGNfb3BzLnRpbWVvdXQgPSAqcHJvcCAqIEhaIC8gMTAwMDAwMDsKKwkJaWYgKG1wY19vcHMudGltZW91dCA8IDUpCisJCQltcGNfb3BzLnRpbWVvdXQgPSA1OworCX0KKwlkZXZfaW5mbyhpMmMtPmRldiwgInRpbWVvdXQgJXUgdXNcbiIsIG1wY19vcHMudGltZW91dCAqIDEwMDAwMDAgLyBIWik7CisKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGkyYyk7CiAKIAlpMmMtPmFkYXAgPSBtcGNfb3BzOwogCWkyY19zZXRfYWRhcGRhdGEoJmkyYy0+YWRhcCwgaTJjKTsKIAlpMmMtPmFkYXAuZGV2LnBhcmVudCA9ICZvcC0+ZGV2OworCWkyYy0+YWRhcC5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG9wLT5kZXYub2Zfbm9kZSk7CiAKIAlyZXN1bHQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJZGV2X2VycihpMmMtPmRldiwgImZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7CiAJCWdvdG8gZmFpbF9hZGQ7CiAJfQotCW9mX3JlZ2lzdGVyX2kyY19kZXZpY2VzKCZpMmMtPmFkYXAsIG9wLT5kZXYub2Zfbm9kZSk7CiAKIAlyZXR1cm4gcmVzdWx0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwppbmRleCAwODE1ZTEwLi5kZjkzN2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CkBAIC03MCw2ICs3MiwxMCBAQAogCWlmICghY2xpZW50KQogCQlyZXR1cm4gMDsKIAorCS8qIEF0dGVtcHQgYW4gT0Ygc3R5bGUgbWF0Y2ggKi8KKwlpZiAob2ZfZHJpdmVyX21hdGNoX2RldmljZShkZXYsIGRydikpCisJCXJldHVybiAxOworCiAJZHJpdmVyID0gdG9faTJjX2RyaXZlcihkcnYpOwogCS8qIG1hdGNoIG9uIGFuIGlkIHRhYmxlIGlmIHRoZXJlIGlzIG9uZSAqLwogCWlmIChkcml2ZXItPmlkX3RhYmxlKQpAQCAtNzkwLDYgKzc5Niw5IEBACiAJaWYgKGFkYXAtPm5yIDwgX19pMmNfZmlyc3RfZHluYW1pY19idXNfbnVtKQogCQlpMmNfc2Nhbl9zdGF0aWNfYm9hcmRfaW5mbyhhZGFwKTsKIAorCS8qIFJlZ2lzdGVyIGRldmljZXMgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KKwlvZl9pMmNfcmVnaXN0ZXJfZGV2aWNlcyhhZGFwKTsKKwogCS8qIE5vdGlmeSBkcml2ZXJzICovCiAJbXV0ZXhfbG9jaygmY29yZV9sb2NrKTsKIAlkdW1teSA9IGJ1c19mb3JfZWFjaF9kcnYoJmkyY19idXNfdHlwZSwgTlVMTCwgYWRhcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jcy5jIGIvZHJpdmVycy9pZGUvaWRlLWNzLmMKaW5kZXggMGI3ODE1ZC4uMmE0Y2I5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNzLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CkBAIC05OCw5ICs5Nyw4IEBACiAgICAgaW5mby0+cF9kZXYgPSBsaW5rOwogICAgIGxpbmstPnByaXYgPSBpbmZvOwogCi0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMzsKKyAgICBsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKIApAQCAtMjI5LDI0ICsyMjcsMjcgQEAKIAogCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgewogCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOworCQlwZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCiAJCXBkZXYtPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCQlwZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCXBkZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQlwZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQlwZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBpby0+d2luWzBdLmJhc2U7CisJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpIHsKKwkJCXBkZXYtPnJlc291cmNlWzBdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworCQkJcGRldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQl9CiAJCWlmIChpby0+bndpbiA9PSAyKSB7Ci0JCQlwZGV2LT5pby5OdW1Qb3J0czEgPSA4OwotCQkJcGRldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJcGRldi0+aW8uTnVtUG9ydHMyID0gKHN0ay0+aXNfa21lKSA/IDIgOiAxOwotCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBkZXYsICZwZGV2LT5pbykgIT0gMCkKKwkJCXBkZXYtPnJlc291cmNlWzBdLT5lbmQgPSA4OworCQkJcGRldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxXS5iYXNlOworCQkJcGRldi0+cmVzb3VyY2VbMV0tPmVuZCA9IChzdGstPmlzX2ttZSkgPyAyIDogMTsKKwkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwZGV2KSAhPSAwKQogCQkJCXJldHVybiAtRU5PREVWOwotCQkJc3RrLT5jdGxfYmFzZSA9IHBkZXYtPmlvLkJhc2VQb3J0MjsKKwkJCXN0ay0+Y3RsX2Jhc2UgPSBwZGV2LT5yZXNvdXJjZVsxXS0+c3RhcnQ7CiAJCX0gZWxzZSBpZiAoKGlvLT5ud2luID09IDEpICYmIChpby0+d2luWzBdLmxlbiA+PSAxNikpIHsKLQkJCXBkZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOwotCQkJcGRldi0+aW8uTnVtUG9ydHMyID0gMDsKLQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwZGV2LCAmcGRldi0+aW8pICE9IDApCisJCQlwZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gaW8tPndpblswXS5sZW47CisJCQlwZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKKwkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwZGV2KSAhPSAwKQogCQkJCXJldHVybiAtRU5PREVWOwotCQkJc3RrLT5jdGxfYmFzZSA9IHBkZXYtPmlvLkJhc2VQb3J0MSArIDB4MGU7CisJCQlzdGstPmN0bF9iYXNlID0gcGRldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgMHgwZTsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJLyogSWYgd2UndmUgZ290IHRoaXMgZmFyLCB3ZSdyZSBkb25lICovCkBAIC0yODAsNyArMjgxLDcgQEAKIAkgICAgaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBwY21jaWFfY2hlY2tfb25lX2NvbmZpZywgc3RrKSkKIAkJICAgIGdvdG8gZmFpbGVkOyAvKiBObyBzdWl0YWJsZSBjb25maWcgZm91bmQgKi8KICAgICB9Ci0gICAgaW9fYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpb19iYXNlID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogICAgIGN0bF9iYXNlID0gc3RrLT5jdGxfYmFzZTsKIAogICAgIGlmICghbGluay0+aXJxKQpAQCAtMjk3LDcgKzI5OCw3IEBACiAJb3V0YigweDgxLCBjdGxfYmFzZSsxKTsKIAogICAgICBob3N0ID0gaWRlY3NfcmVnaXN0ZXIoaW9fYmFzZSwgY3RsX2Jhc2UsIGxpbmstPmlycSwgbGluayk7Ci0gICAgIGlmIChob3N0ID09IE5VTEwgJiYgbGluay0+aW8uTnVtUG9ydHMxID09IDB4MjApIHsKKyAgICAgaWYgKGhvc3QgPT0gTlVMTCAmJiByZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzBdKSA9PSAweDIwKSB7CiAJICAgIG91dGIoMHgwMiwgY3RsX2Jhc2UgKyAweDEwKTsKIAkgICAgaG9zdCA9IGlkZWNzX3JlZ2lzdGVyKGlvX2Jhc2UgKyAweDEwLCBjdGxfYmFzZSArIDB4MTAsCiAJCQkJICBsaW5rLT5pcnEsIGxpbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWdkLmMgYi9kcml2ZXJzL2lkZS9pZGUtZ2QuYwppbmRleCBjMTAyZDIzLi43OTM5OTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZ2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZ2QuYwpAQCAtOTIsNyArOTIsNyBAQAogCiAvKgogICogT24gSFBBIGRyaXZlcyB0aGUgY2FwYWNpdHkgbmVlZHMgdG8gYmUKLSAqIHJlaW5pdGlsaXplZCBvbiByZXN1bWUgb3RoZXJ3aXNlIHRoZSBkaXNrCisgKiByZWluaXRpYWxpemVkIG9uIHJlc3VtZSBvdGhlcndpc2UgdGhlIGRpc2sKICAqIGNhbiBub3QgYmUgdXNlZCBhbmQgYSBoYXJkIHJlc2V0IGlzIHJlcXVpcmVkCiAgKi8KIHN0YXRpYyB2b2lkIGlkZV9nZF9yZXN1bWUoaWRlX2RyaXZlX3QgKmRyaXZlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYyBiL2RyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMKaW5kZXggNTRmMGZiNC4uMDNkMjAyYiAxMDA3NTUKLS0tIGEvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYworKysgYi9kcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jCkBAIC0yMzEsNyArMjMxLDcgQEAKIAogCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwogI2lmbmRlZiBNT0RVTEUKLQl0cmFjZV9wb3dlcl9zdGFydChQT1dFUl9DU1RBVEUsIChlYXggPj4gNCkgKyAxKTsKKwl0cmFjZV9wb3dlcl9zdGFydChQT1dFUl9DU1RBVEUsIChlYXggPj4gNCkgKyAxLCBjcHUpOwogI2VuZGlmCiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKaW5kZXggMGI5MjZlNC4uYTVlYTFiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAKIAluZWlnaCA9IG5laWdoX2xvb2t1cCgmYXJwX3RibCwgJnJ0LT5ydF9nYXRld2F5LCBydC0+aWRldi0+ZGV2KTsKIAlpZiAoIW5laWdoIHx8ICEobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKLQkJbmVpZ2hfZXZlbnRfc2VuZChydC0+dS5kc3QubmVpZ2hib3VyLCBOVUxMKTsKKwkJbmVpZ2hfZXZlbnRfc2VuZChydC0+ZHN0Lm5laWdoYm91ciwgTlVMTCk7CiAJCXJldCA9IC1FTk9EQVRBOwogCQlpZiAobmVpZ2gpCiAJCQlnb3RvIHJlbGVhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYwppbmRleCBlYmZiMTE3Li5hYmQ2ODNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKQEAgLTEzNjQsNyArMTM2NCw3IEBACiAJCSAgICAgICBfX2Z1bmNfXyk7CiAJCWdvdG8gcmVqZWN0OwogCX0KLQlkc3QgPSAmcnQtPnUuZHN0OworCWRzdCA9ICZydC0+ZHN0OwogCWwydCA9IHQzX2wydF9nZXQodGRldiwgZHN0LT5uZWlnaGJvdXIsIGRzdC0+bmVpZ2hib3VyLT5kZXYpOwogCWlmICghbDJ0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gZmFpbGVkIHRvIGFsbG9jYXRlIGwydCBlbnRyeSFcbiIsCkBAIC0xOTMyLDcgKzE5MzIsNyBAQAogCQllcnIgPSAtRUhPU1RVTlJFQUNIOwogCQlnb3RvIGZhaWwzOwogCX0KLQllcC0+ZHN0ID0gJnJ0LT51LmRzdDsKKwllcC0+ZHN0ID0gJnJ0LT5kc3Q7CiAKIAkvKiBnZXQgYSBsMnQgZW50cnkgKi8KIAllcC0+bDJ0ID0gdDNfbDJ0X2dldChlcC0+Y29tLnRkZXYsIGVwLT5kc3QtPm5laWdoYm91ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jCmluZGV4IGFlNDdiZmQuLjliYmI2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYwpAQCAtODE2LDcgKzgxNiw3IEBACiAJYXRvbWljX2luYygmcWhwLT5yZWZjbnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFocC0+bG9jaywgKmZsYWcpOwogCi0JLyogbG9ja2luZyBoZWlyYXJjaHk6IGNxIGxvY2sgZmlyc3QsIHRoZW4gcXAgbG9jay4gKi8KKwkvKiBsb2NraW5nIGhpZXJhcmNoeTogY3EgbG9jayBmaXJzdCwgdGhlbiBxcCBsb2NrLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZyY2hwLT5sb2NrLCAqZmxhZyk7CiAJc3Bpbl9sb2NrKCZxaHAtPmxvY2spOwogCWN4aW9fZmx1c2hfaHdfY3EoJnJjaHAtPmNxKTsKQEAgLTgyNyw3ICs4MjcsNyBAQAogCWlmIChmbHVzaGVkKQogCQkoKnJjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmcmNocC0+aWJjcSwgcmNocC0+aWJjcS5jcV9jb250ZXh0KTsKIAotCS8qIGxvY2tpbmcgaGVpcmFyY2h5OiBjcSBsb2NrIGZpcnN0LCB0aGVuIHFwIGxvY2suICovCisJLyogbG9ja2luZyBoaWVyYXJjaHk6IGNxIGxvY2sgZmlyc3QsIHRoZW4gcXAgbG9jay4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2NocC0+bG9jaywgKmZsYWcpOwogCXNwaW5fbG9jaygmcWhwLT5sb2NrKTsKIAljeGlvX2ZsdXNoX2h3X2NxKCZzY2hwLT5jcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCmluZGV4IDg1NWVlNDQuLjhjOWI0ODNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwpAQCAtMTM2NSw3ICsxMzY1LDcgQEAKIAkJICAgICAgIF9fZnVuY19fKTsKIAkJZ290byByZWplY3Q7CiAJfQotCWRzdCA9ICZydC0+dS5kc3Q7CisJZHN0ID0gJnJ0LT5kc3Q7CiAJaWYgKGRzdC0+bmVpZ2hib3VyLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CiAJCXBkZXYgPSBpcF9kZXZfZmluZCgmaW5pdF9uZXQsIHBlZXJfaXApOwogCQlCVUdfT04oIXBkZXYpOwpAQCAtMTkzOSw3ICsxOTM5LDcgQEAKIAkJZXJyID0gLUVIT1NUVU5SRUFDSDsKIAkJZ290byBmYWlsMzsKIAl9Ci0JZXAtPmRzdCA9ICZydC0+dS5kc3Q7CisJZXAtPmRzdCA9ICZydC0+ZHN0OwogCiAJLyogZ2V0IGEgbDJ0IGVudHJ5ICovCiAJaWYgKGVwLT5kc3QtPm5laWdoYm91ci0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYwppbmRleCA3MDY1Y2IzLi44NmI5M2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYwpAQCAtOTA1LDcgKzkwNSw3IEBACiAJYXRvbWljX2luYygmcWhwLT5yZWZjbnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFocC0+bG9jaywgKmZsYWcpOwogCi0JLyogbG9ja2luZyBoZWlyYXJjaHk6IGNxIGxvY2sgZmlyc3QsIHRoZW4gcXAgbG9jay4gKi8KKwkvKiBsb2NraW5nIGhpZXJhcmNoeTogY3EgbG9jayBmaXJzdCwgdGhlbiBxcCBsb2NrLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZyY2hwLT5sb2NrLCAqZmxhZyk7CiAJc3Bpbl9sb2NrKCZxaHAtPmxvY2spOwogCWM0aXdfZmx1c2hfaHdfY3EoJnJjaHAtPmNxKTsKQEAgLTkxNiw3ICs5MTYsNyBAQAogCWlmIChmbHVzaGVkKQogCQkoKnJjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmcmNocC0+aWJjcSwgcmNocC0+aWJjcS5jcV9jb250ZXh0KTsKIAotCS8qIGxvY2tpbmcgaGVpcmFyY2h5OiBjcSBsb2NrIGZpcnN0LCB0aGVuIHFwIGxvY2suICovCisJLyogbG9ja2luZyBoaWVyYXJjaHk6IGNxIGxvY2sgZmlyc3QsIHRoZW4gcXAgbG9jay4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2NocC0+bG9jaywgKmZsYWcpOwogCXNwaW5fbG9jaygmcWhwLT5sb2NrKTsKIAljNGl3X2ZsdXNoX2h3X2NxKCZzY2hwLT5jcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oY3BfaWYuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5oCmluZGV4IDM5YzFjMzYuLmE0NmU1MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5oCkBAIC00OSw3ICs0OSw3IEBACiAjaW5jbHVkZSAiaGlwel9ody5oIgogCiAvKgotICogaGlwel9oX2FsbG9jX3Jlc291cmNlX2VxIGFsbG9jYXRlcyBFUSByZXNvdXJjZXMgaW4gSFcgYW5kIEZXLCBpbml0YWxpemUKKyAqIGhpcHpfaF9hbGxvY19yZXNvdXJjZV9lcSBhbGxvY2F0ZXMgRVEgcmVzb3VyY2VzIGluIEhXIGFuZCBGVywgaW5pdGlhbGl6ZQogICogcmVzb3VyY2VzLCBjcmVhdGUgdGhlIGVtcHR5IEVRUFQgKHJpbmcpLgogICovCiB1NjQgaGlwel9oX2FsbG9jX3Jlc291cmNlX2VxKGNvbnN0IHN0cnVjdCBpcHpfYWRhcHRlcl9oYW5kbGUgYWRhcHRlcl9oYW5kbGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCmluZGV4IDljNWM2NmQuLjY1ZWI4OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCkBAIC0yMDU1LDcgKzIwNTUsNyBAQAogCiAJbXV0ZXhfbG9jaygmaXBhdGhfbXV0ZXgpOwogCi0JZmQgPSAoc3RydWN0IGlwYXRoX2ZpbGVkYXRhICopIGZwLT5wcml2YXRlX2RhdGE7CisJZmQgPSBmcC0+cHJpdmF0ZV9kYXRhOwogCWZwLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCXBkID0gZmQtPnBkOwogCWlmICghcGQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCmluZGV4IDk4NmQ2ZjMuLmQ4NzZkMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYwpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIAl9CiAKIAlpZiAoKG5laWdoID09IE5VTEwpIHx8ICghKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSkKLQkJbmVpZ2hfZXZlbnRfc2VuZChydC0+dS5kc3QubmVpZ2hib3VyLCBOVUxMKTsKKwkJbmVpZ2hfZXZlbnRfc2VuZChydC0+ZHN0Lm5laWdoYm91ciwgTlVMTCk7CiAKIAlpcF9ydF9wdXQocnQpOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKaW5kZXggNWNjMGE5YS4uNDJlN2FhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKQEAgLTE1NjcsNiArMTU2NywxMiBAQAogfQogCiAKK3N0YXRpYyBpbnQgbmVzX25ldGRldl9zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZsYWdzKQoreworCXJldHVybiBldGh0b29sX29wX3NldF9mbGFncyhuZXRkZXYsIGZsYWdzLCBFVEhfRkxBR19MUk8pOworfQorCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmVzX2V0aHRvb2xfb3BzID0gewogCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9zZXR0aW5ncyA9IG5lc19uZXRkZXZfZ2V0X3NldHRpbmdzLApAQCAtMTU4OCw3ICsxNTk0LDcgQEAKIAkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKIAkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKIAkuZ2V0X2ZsYWdzID0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncyA9IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzLAorCS5zZXRfZmxhZ3MgPSBuZXNfbmV0ZGV2X3NldF9mbGFncywKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9ldGh0b29sLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2V0aHRvb2wuYwppbmRleCA0MGU4NTg0Li4xYTE2NTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2V0aHRvb2wuYwpAQCAtMTQ3LDYgKzE0NywxMSBAQAogCWRhdGFbaW5kZXgrK10gPSBwcml2LT5scm8ubHJvX21nci5zdGF0cy5ub19kZXNjOwogfQogCitzdGF0aWMgaW50IGlwb2liX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmxhZ3MpCit7CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKGRldiwgZmxhZ3MsIEVUSF9GTEFHX0xSTyk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaXBvaWJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGlwb2liX2dldF9kcnZpbmZvLAogCS5nZXRfcnhfY3N1bQkJPSBpcG9pYl9nZXRfcnhfY3N1bSwKQEAgLTE1NCw3ICsxNTksNyBAQAogCS5nZXRfY29hbGVzY2UJCT0gaXBvaWJfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gaXBvaWJfc2V0X2NvYWxlc2NlLAogCS5nZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncwkJPSBldGh0b29sX29wX3NldF9mbGFncywKKwkuc2V0X2ZsYWdzCQk9IGlwb2liX3NldF9mbGFncywKIAkuZ2V0X3N0cmluZ3MJCT0gaXBvaWJfZ2V0X3N0cmluZ3MsCiAJLmdldF9zc2V0X2NvdW50CQk9IGlwb2liX2dldF9zc2V0X2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGlwb2liX2dldF9ldGh0b29sX3N0YXRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IDJlZTZjN2EuLjA1NGVkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTEwLDcgKzEwLDggQEAKIAogI2RlZmluZSBFVkRFVl9NSU5PUl9CQVNFCTY0CiAjZGVmaW5lIEVWREVWX01JTk9SUwkJMzIKLSNkZWZpbmUgRVZERVZfQlVGRkVSX1NJWkUJNjQKKyNkZWZpbmUgRVZERVZfTUlOX0JVRkZFUl9TSVpFCTY0VQorI2RlZmluZSBFVkRFVl9CVUZfUEFDS0VUUwk4CiAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTIzLDcgKzI0LDYgQEAKICNpbmNsdWRlICJpbnB1dC1jb21wYXQuaCIKIAogc3RydWN0IGV2ZGV2IHsKLQlpbnQgZXhpc3Q7CiAJaW50IG9wZW47CiAJaW50IG1pbm9yOwogCXN0cnVjdCBpbnB1dF9oYW5kbGUgaGFuZGxlOwpAQCAtMzMsMTYgKzMzLDE4IEBACiAJc3BpbmxvY2tfdCBjbGllbnRfbG9jazsgLyogcHJvdGVjdHMgY2xpZW50X2xpc3QgKi8KIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IGRldmljZSBkZXY7CisJYm9vbCBleGlzdDsKIH07CiAKIHN0cnVjdCBldmRldl9jbGllbnQgewotCXN0cnVjdCBpbnB1dF9ldmVudCBidWZmZXJbRVZERVZfQlVGRkVSX1NJWkVdOwogCWludCBoZWFkOwogCWludCB0YWlsOwogCXNwaW5sb2NrX3QgYnVmZmVyX2xvY2s7IC8qIHByb3RlY3RzIGFjY2VzcyB0byBidWZmZXIsIGhlYWQgYW5kIHRhaWwgKi8KIAlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmFzeW5jOwogCXN0cnVjdCBldmRldiAqZXZkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWludCBidWZzaXplOworCXN0cnVjdCBpbnB1dF9ldmVudCBidWZmZXJbXTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXZkZXYgKmV2ZGV2X3RhYmxlW0VWREVWX01JTk9SU107CkBAIC01MiwxMSArNTQsMTUgQEAKIAkJCSAgICAgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKIHsKIAkvKgotCSAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkLCBqdXN0IGFjcXVpcmUgdGhlIGxvY2sKKwkgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwganVzdCBhY3F1aXJlIHRoZSBsb2NrLgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBsZWF2ZSB3aXRoIHRoZSBjbGllbnQgYnVmZmVyCisJICogImVtcHR5IiBieSBoYXZpbmcgY2xpZW50LT5oZWFkID09IGNsaWVudC0+dGFpbC4KIAkgKi8KIAlzcGluX2xvY2soJmNsaWVudC0+YnVmZmVyX2xvY2spOwotCWNsaWVudC0+YnVmZmVyW2NsaWVudC0+aGVhZCsrXSA9ICpldmVudDsKLQljbGllbnQtPmhlYWQgJj0gRVZERVZfQlVGRkVSX1NJWkUgLSAxOworCWRvIHsKKwkJY2xpZW50LT5idWZmZXJbY2xpZW50LT5oZWFkKytdID0gKmV2ZW50OworCQljbGllbnQtPmhlYWQgJj0gY2xpZW50LT5idWZzaXplIC0gMTsKKwl9IHdoaWxlIChjbGllbnQtPmhlYWQgPT0gY2xpZW50LT50YWlsKTsKIAlzcGluX3VubG9jaygmY2xpZW50LT5idWZmZXJfbG9jayk7CiAKIAlpZiAoZXZlbnQtPnR5cGUgPT0gRVZfU1lOKQpAQCAtMjQyLDExICsyNDgsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBldmRldl9jb21wdXRlX2J1ZmZlcl9zaXplKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbl9ldmVudHMgPQorCQltYXgoZGV2LT5oaW50X2V2ZW50c19wZXJfcGFja2V0ICogRVZERVZfQlVGX1BBQ0tFVFMsCisJCSAgICBFVkRFVl9NSU5fQlVGRkVSX1NJWkUpOworCisJcmV0dXJuIHJvdW5kdXBfcG93X29mX3R3byhuX2V2ZW50cyk7Cit9CisKIHN0YXRpYyBpbnQgZXZkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZXZkZXYgKmV2ZGV2OwogCXN0cnVjdCBldmRldl9jbGllbnQgKmNsaWVudDsKIAlpbnQgaSA9IGltaW5vcihpbm9kZSkgLSBFVkRFVl9NSU5PUl9CQVNFOworCXVuc2lnbmVkIGludCBidWZzaXplOwogCWludCBlcnJvcjsKIAogCWlmIChpID49IEVWREVWX01JTk9SUykKQEAgLTI2MywxMiArMjc5LDE3IEBACiAJaWYgKCFldmRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZXZkZXZfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJYnVmc2l6ZSA9IGV2ZGV2X2NvbXB1dGVfYnVmZmVyX3NpemUoZXZkZXYtPmhhbmRsZS5kZXYpOworCisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGV2ZGV2X2NsaWVudCkgKworCQkJCWJ1ZnNpemUgKiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSwKKwkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsaWVudCkgewogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3B1dF9ldmRldjsKIAl9CiAKKwljbGllbnQtPmJ1ZnNpemUgPSBidWZzaXplOwogCXNwaW5fbG9ja19pbml0KCZjbGllbnQtPmJ1ZmZlcl9sb2NrKTsKIAljbGllbnQtPmV2ZGV2ID0gZXZkZXY7CiAJZXZkZXZfYXR0YWNoX2NsaWVudChldmRldiwgY2xpZW50KTsKQEAgLTMzNCw3ICszNTUsNyBAQAogCWhhdmVfZXZlbnQgPSBjbGllbnQtPmhlYWQgIT0gY2xpZW50LT50YWlsOwogCWlmIChoYXZlX2V2ZW50KSB7CiAJCSpldmVudCA9IGNsaWVudC0+YnVmZmVyW2NsaWVudC0+dGFpbCsrXTsKLQkJY2xpZW50LT50YWlsICY9IEVWREVWX0JVRkZFUl9TSVpFIC0gMTsKKwkJY2xpZW50LT50YWlsICY9IGNsaWVudC0+YnVmc2l6ZSAtIDE7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZjbGllbnQtPmJ1ZmZlcl9sb2NrKTsKQEAgLTM4MiwxMCArNDAzLDE1IEBACiB7CiAJc3RydWN0IGV2ZGV2X2NsaWVudCAqY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBldmRldiAqZXZkZXYgPSBjbGllbnQtPmV2ZGV2OworCXVuc2lnbmVkIGludCBtYXNrOwogCiAJcG9sbF93YWl0KGZpbGUsICZldmRldi0+d2FpdCwgd2FpdCk7Ci0JcmV0dXJuICgoY2xpZW50LT5oZWFkID09IGNsaWVudC0+dGFpbCkgPyAwIDogKFBPTExJTiB8IFBPTExSRE5PUk0pKSB8Ci0JCShldmRldi0+ZXhpc3QgPyAwIDogKFBPTExIVVAgfCBQT0xMRVJSKSk7CisKKwltYXNrID0gZXZkZXYtPmV4aXN0ID8gUE9MTE9VVCB8IFBPTExXUk5PUk0gOiBQT0xMSFVQIHwgUE9MTEVSUjsKKwlpZiAoY2xpZW50LT5oZWFkICE9IGNsaWVudC0+dGFpbCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIG1hc2s7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC02NjUsNiArNjkxLDEwIEBACiAJCQkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAorCQkJCS8qIFdlIGNhbid0IGNoYW5nZSBudW1iZXIgb2YgcmVzZXJ2ZWQgTVQgc2xvdHMgKi8KKwkJCQlpZiAodCA9PSBBQlNfTVRfU0xPVCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCQkvKgogCQkJCSAqIFRha2UgZXZlbnQgbG9jayB0byBlbnN1cmUgdGhhdCB3ZSBhcmUgbm90CiAJCQkJICogY2hhbmdpbmcgZGV2aWNlIHBhcmFtZXRlcnMgaW4gdGhlIG1pZGRsZQpAQCAtNzY4LDcgKzc5OCw3IEBACiBzdGF0aWMgdm9pZCBldmRldl9tYXJrX2RlYWQoc3RydWN0IGV2ZGV2ICpldmRldikKIHsKIAltdXRleF9sb2NrKCZldmRldi0+bXV0ZXgpOwotCWV2ZGV2LT5leGlzdCA9IDA7CisJZXZkZXYtPmV4aXN0ID0gZmFsc2U7CiAJbXV0ZXhfdW5sb2NrKCZldmRldi0+bXV0ZXgpOwogfQogCkBAIC04MTcsNyArODQ3LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZldmRldi0+d2FpdCk7CiAKIAlkZXZfc2V0X25hbWUoJmV2ZGV2LT5kZXYsICJldmVudCVkIiwgbWlub3IpOwotCWV2ZGV2LT5leGlzdCA9IDE7CisJZXZkZXYtPmV4aXN0ID0gdHJ1ZTsKIAlldmRldi0+bWlub3IgPSBtaW5vcjsKIAogCWV2ZGV2LT5oYW5kbGUuZGV2ID0gaW5wdXRfZ2V0X2RldmljZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IDljNzliZDUuLmUxMjQzYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTMzLDI1ICszMyw2IEBACiAKICNkZWZpbmUgSU5QVVRfREVWSUNFUwkyNTYKIAotLyoKLSAqIEVWX0FCUyBldmVudHMgd2hpY2ggc2hvdWxkIG5vdCBiZSBjYWNoZWQgYXJlIGxpc3RlZCBoZXJlLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X2Fic19ieXBhc3NfaW5pdF9kYXRhW10gX19pbml0ZGF0YSA9IHsKLQlBQlNfTVRfVE9VQ0hfTUFKT1IsCi0JQUJTX01UX1RPVUNIX01JTk9SLAotCUFCU19NVF9XSURUSF9NQUpPUiwKLQlBQlNfTVRfV0lEVEhfTUlOT1IsCi0JQUJTX01UX09SSUVOVEFUSU9OLAotCUFCU19NVF9QT1NJVElPTl9YLAotCUFCU19NVF9QT1NJVElPTl9ZLAotCUFCU19NVF9UT09MX1RZUEUsCi0JQUJTX01UX0JMT0JfSUQsCi0JQUJTX01UX1RSQUNLSU5HX0lELAotCUFCU19NVF9QUkVTU1VSRSwKLQkwCi19Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5wdXRfYWJzX2J5cGFzc1tCSVRTX1RPX0xPTkdTKEFCU19DTlQpXTsKLQogc3RhdGljIExJU1RfSEVBRChpbnB1dF9kZXZfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKGlucHV0X2hhbmRsZXJfbGlzdCk7CiAKQEAgLTE4MSw2ICsxNjIsNTYgQEAKICNkZWZpbmUgSU5QVVRfUEFTU19UT19ERVZJQ0UJMgogI2RlZmluZSBJTlBVVF9QQVNTX1RPX0FMTAkoSU5QVVRfUEFTU19UT19IQU5ETEVSUyB8IElOUFVUX1BBU1NfVE9fREVWSUNFKQogCitzdGF0aWMgaW50IGlucHV0X2hhbmRsZV9hYnNfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGNvZGUsIGludCAqcHZhbCkKK3sKKwlib29sIGlzX210X2V2ZW50OworCWludCAqcG9sZDsKKworCWlmIChjb2RlID09IEFCU19NVF9TTE9UKSB7CisJCS8qCisJCSAqICJTdGFnZSIgdGhlIGV2ZW50OyB3ZSdsbCBmbHVzaCBpdCBsYXRlciwgd2hlbiB3ZQorCQkgKiBnZXQgYWN0aXVhbCB0b3VjaCBkYXRhLgorCQkgKi8KKwkJaWYgKCpwdmFsID49IDAgJiYgKnB2YWwgPCBkZXYtPm10c2l6ZSkKKwkJCWRldi0+c2xvdCA9ICpwdmFsOworCisJCXJldHVybiBJTlBVVF9JR05PUkVfRVZFTlQ7CisJfQorCisJaXNfbXRfZXZlbnQgPSBjb2RlID49IEFCU19NVF9GSVJTVCAmJiBjb2RlIDw9IEFCU19NVF9MQVNUOworCisJaWYgKCFpc19tdF9ldmVudCkgeworCQlwb2xkID0gJmRldi0+YWJzW2NvZGVdOworCX0gZWxzZSBpZiAoZGV2LT5tdCkgeworCQlzdHJ1Y3QgaW5wdXRfbXRfc2xvdCAqbXRzbG90ID0gJmRldi0+bXRbZGV2LT5zbG90XTsKKwkJcG9sZCA9ICZtdHNsb3QtPmFic1tjb2RlIC0gQUJTX01UX0ZJUlNUXTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBCeXBhc3MgZmlsdGVyaW5nIGZvciBtdWx0aXRvdWNoIGV2ZW50cyB3aGVuCisJCSAqIG5vdCBlbXBsb3lpbmcgc2xvdHMuCisJCSAqLworCQlwb2xkID0gTlVMTDsKKwl9CisKKwlpZiAocG9sZCkgeworCQkqcHZhbCA9IGlucHV0X2RlZnV6el9hYnNfZXZlbnQoKnB2YWwsICpwb2xkLAorCQkJCQkJZGV2LT5hYnNmdXp6W2NvZGVdKTsKKwkJaWYgKCpwb2xkID09ICpwdmFsKQorCQkJcmV0dXJuIElOUFVUX0lHTk9SRV9FVkVOVDsKKworCQkqcG9sZCA9ICpwdmFsOworCX0KKworCS8qIEZsdXNoIHBlbmRpbmcgInNsb3QiIGV2ZW50ICovCisJaWYgKGlzX210X2V2ZW50ICYmIGRldi0+c2xvdCAhPSBkZXYtPmFic1tBQlNfTVRfU0xPVF0pIHsKKwkJZGV2LT5hYnNbQUJTX01UX1NMT1RdID0gZGV2LT5zbG90OworCQlpbnB1dF9wYXNzX2V2ZW50KGRldiwgRVZfQUJTLCBBQlNfTVRfU0xPVCwgZGV2LT5zbG90KTsKKwl9CisKKwlyZXR1cm4gSU5QVVRfUEFTU19UT19IQU5ETEVSUzsKK30KKwogc3RhdGljIHZvaWQgaW5wdXRfaGFuZGxlX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKQEAgLTE5NiwxMiArMjI3LDEyIEBACiAKIAkJY2FzZSBTWU5fUkVQT1JUOgogCQkJaWYgKCFkZXYtPnN5bmMpIHsKLQkJCQlkZXYtPnN5bmMgPSAxOworCQkJCWRldi0+c3luYyA9IHRydWU7CiAJCQkJZGlzcG9zaXRpb24gPSBJTlBVVF9QQVNTX1RPX0hBTkRMRVJTOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgU1lOX01UX1JFUE9SVDoKLQkJCWRldi0+c3luYyA9IDA7CisJCQlkZXYtPnN5bmMgPSBmYWxzZTsKIAkJCWRpc3Bvc2l0aW9uID0gSU5QVVRfUEFTU19UT19IQU5ETEVSUzsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMzMsMjEgKzI2NCw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBFVl9BQlM6Ci0JCWlmIChpc19ldmVudF9zdXBwb3J0ZWQoY29kZSwgZGV2LT5hYnNiaXQsIEFCU19NQVgpKSB7CisJCWlmIChpc19ldmVudF9zdXBwb3J0ZWQoY29kZSwgZGV2LT5hYnNiaXQsIEFCU19NQVgpKQorCQkJZGlzcG9zaXRpb24gPSBpbnB1dF9oYW5kbGVfYWJzX2V2ZW50KGRldiwgY29kZSwgJnZhbHVlKTsKIAotCQkJaWYgKHRlc3RfYml0KGNvZGUsIGlucHV0X2Fic19ieXBhc3MpKSB7Ci0JCQkJZGlzcG9zaXRpb24gPSBJTlBVVF9QQVNTX1RPX0hBTkRMRVJTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQl2YWx1ZSA9IGlucHV0X2RlZnV6el9hYnNfZXZlbnQodmFsdWUsCi0JCQkJCWRldi0+YWJzW2NvZGVdLCBkZXYtPmFic2Z1enpbY29kZV0pOwotCi0JCQlpZiAoZGV2LT5hYnNbY29kZV0gIT0gdmFsdWUpIHsKLQkJCQlkZXYtPmFic1tjb2RlXSA9IHZhbHVlOwotCQkJCWRpc3Bvc2l0aW9uID0gSU5QVVRfUEFTU19UT19IQU5ETEVSUzsKLQkJCX0KLQkJfQogCQlicmVhazsKIAogCWNhc2UgRVZfUkVMOgpAQCAtMjk4LDcgKzMxNyw3IEBACiAJfQogCiAJaWYgKGRpc3Bvc2l0aW9uICE9IElOUFVUX0lHTk9SRV9FVkVOVCAmJiB0eXBlICE9IEVWX1NZTikKLQkJZGV2LT5zeW5jID0gMDsKKwkJZGV2LT5zeW5jID0gZmFsc2U7CiAKIAlpZiAoKGRpc3Bvc2l0aW9uICYgSU5QVVRfUEFTU19UT19ERVZJQ0UpICYmIGRldi0+ZXZlbnQpCiAJCWRldi0+ZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CkBAIC01MjgsMTIgKzU0NywzMCBAQAogRVhQT1JUX1NZTUJPTChpbnB1dF9jbG9zZV9kZXZpY2UpOwogCiAvKgorICogU2ltdWxhdGUga2V5dXAgZXZlbnRzIGZvciBhbGwga2V5cyB0aGF0IGFyZSBtYXJrZWQgYXMgcHJlc3NlZC4KKyAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGRldi0+ZXZlbnRfbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBpbnB1dF9kZXZfcmVsZWFzZV9rZXlzKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlpbnQgY29kZTsKKworCWlmIChpc19ldmVudF9zdXBwb3J0ZWQoRVZfS0VZLCBkZXYtPmV2Yml0LCBFVl9NQVgpKSB7CisJCWZvciAoY29kZSA9IDA7IGNvZGUgPD0gS0VZX01BWDsgY29kZSsrKSB7CisJCQlpZiAoaXNfZXZlbnRfc3VwcG9ydGVkKGNvZGUsIGRldi0+a2V5Yml0LCBLRVlfTUFYKSAmJgorCQkJICAgIF9fdGVzdF9hbmRfY2xlYXJfYml0KGNvZGUsIGRldi0+a2V5KSkgeworCQkJCWlucHV0X3Bhc3NfZXZlbnQoZGV2LCBFVl9LRVksIGNvZGUsIDApOworCQkJfQorCQl9CisJCWlucHV0X3Bhc3NfZXZlbnQoZGV2LCBFVl9TWU4sIFNZTl9SRVBPUlQsIDEpOworCX0KK30KKworLyoKICAqIFByZXBhcmUgZGV2aWNlIGZvciB1bnJlZ2lzdGVyaW5nCiAgKi8KIHN0YXRpYyB2b2lkIGlucHV0X2Rpc2Nvbm5lY3RfZGV2aWNlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGU7Ci0JaW50IGNvZGU7CiAKIAkvKgogCSAqIE1hcmsgZGV2aWNlIGFzIGdvaW5nIGF3YXkuIE5vdGUgdGhhdCB3ZSB0YWtlIGRldi0+bXV0ZXggaGVyZQpAQCAtNTUyLDE1ICs1ODksNyBAQAogCSAqIGdlbmVyYXRlIGV2ZW50cyBldmVuIGFmdGVyIHdlIGRvbmUgaGVyZSBidXQgdGhleSB3aWxsIG5vdAogCSAqIHJlYWNoIGFueSBoYW5kbGVycy4KIAkgKi8KLQlpZiAoaXNfZXZlbnRfc3VwcG9ydGVkKEVWX0tFWSwgZGV2LT5ldmJpdCwgRVZfTUFYKSkgewotCQlmb3IgKGNvZGUgPSAwOyBjb2RlIDw9IEtFWV9NQVg7IGNvZGUrKykgewotCQkJaWYgKGlzX2V2ZW50X3N1cHBvcnRlZChjb2RlLCBkZXYtPmtleWJpdCwgS0VZX01BWCkgJiYKLQkJCSAgICBfX3Rlc3RfYW5kX2NsZWFyX2JpdChjb2RlLCBkZXYtPmtleSkpIHsKLQkJCQlpbnB1dF9wYXNzX2V2ZW50KGRldiwgRVZfS0VZLCBjb2RlLCAwKTsKLQkJCX0KLQkJfQotCQlpbnB1dF9wYXNzX2V2ZW50KGRldiwgRVZfU1lOLCBTWU5fUkVQT1JULCAxKTsKLQl9CisJaW5wdXRfZGV2X3JlbGVhc2Vfa2V5cyhkZXYpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShoYW5kbGUsICZkZXYtPmhfbGlzdCwgZF9ub2RlKQogCQloYW5kbGUtPm9wZW4gPSAwOwpAQCAtNjg0LDcgKzcxMyw3IEBACiAJCSAgICAgIHVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgb2xkX2tleWNvZGU7CisJdW5zaWduZWQgaW50IG9sZF9rZXljb2RlOwogCWludCByZXR2YWw7CiAKIAlpZiAoa2V5Y29kZSA+IEtFWV9NQVgpCkBAIC0xMjc4LDYgKzEzMDcsNyBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHRvX2lucHV0X2RldihkZXZpY2UpOwogCiAJaW5wdXRfZmZfZGVzdHJveShkZXYpOworCWlucHV0X210X2Rlc3Ryb3lfc2xvdHMoZGV2KTsKIAlrZnJlZShkZXYpOwogCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CkBAIC0xNDMzLDYgKzE0NjMsMTUgQEAKIAogCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOwogCWlucHV0X2Rldl9yZXNldChpbnB1dF9kZXYsIHRydWUpOworCisJLyoKKwkgKiBLZXlzIHRoYXQgaGF2ZSBiZWVuIHByZXNzZWQgYXQgc3VzcGVuZCB0aW1lIGFyZSB1bmxpa2VseQorCSAqIHRvIGJlIHN0aWxsIHByZXNzZWQgd2hlbiB3ZSByZXN1bWUuCisJICovCisJc3Bpbl9sb2NrX2lycSgmaW5wdXRfZGV2LT5ldmVudF9sb2NrKTsKKwlpbnB1dF9kZXZfcmVsZWFzZV9rZXlzKGlucHV0X2Rldik7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnB1dF9kZXYtPmV2ZW50X2xvY2spOworCiAJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKIAogCXJldHVybiAwOwpAQCAtMTUxOCw2ICsxNTU3LDQ1IEBACiBFWFBPUlRfU1lNQk9MKGlucHV0X2ZyZWVfZGV2aWNlKTsKIAogLyoqCisgKiBpbnB1dF9tdF9jcmVhdGVfc2xvdHMoKSAtIGNyZWF0ZSBNVCBpbnB1dCBzbG90cworICogQGRldjogaW5wdXQgZGV2aWNlIHN1cHBvcnRpbmcgTVQgZXZlbnRzIGFuZCBmaW5nZXIgdHJhY2tpbmcKKyAqIEBudW1fc2xvdHM6IG51bWJlciBvZiBzbG90cyB1c2VkIGJ5IHRoZSBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbGwgbmVjZXNzYXJ5IG1lbW9yeSBmb3IgTVQgc2xvdCBoYW5kbGluZworICogaW4gdGhlIGlucHV0IGRldmljZSwgYW5kIGFkZHMgQUJTX01UX1NMT1QgdG8gdGhlIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK2ludCBpbnB1dF9tdF9jcmVhdGVfc2xvdHMoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgbnVtX3Nsb3RzKQoreworCWlmICghbnVtX3Nsb3RzKQorCQlyZXR1cm4gMDsKKworCWRldi0+bXQgPSBrY2FsbG9jKG51bV9zbG90cywgc2l6ZW9mKHN0cnVjdCBpbnB1dF9tdF9zbG90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPm10KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+bXRzaXplID0gbnVtX3Nsb3RzOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1NMT1QsIDAsIG51bV9zbG90cyAtIDEsIDAsIDApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlucHV0X210X2NyZWF0ZV9zbG90cyk7CisKKy8qKgorICogaW5wdXRfbXRfZGVzdHJveV9zbG90cygpIC0gZnJlZXMgdGhlIE1UIHNsb3RzIG9mIHRoZSBpbnB1dCBkZXZpY2UKKyAqIEBkZXY6IGlucHV0IGRldmljZSB3aXRoIGFsbG9jYXRlZCBNVCBzbG90cworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBuZWVkZWQgaW4gZXJyb3IgcGF0aCBhcyB0aGUgaW5wdXQgY29yZSB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGZyZWUgdGhlIE1UIHNsb3RzIHdoZW4gdGhlIGRldmljZSBpcyBkZXN0cm95ZWQuCisgKi8KK3ZvaWQgaW5wdXRfbXRfZGVzdHJveV9zbG90cyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJa2ZyZWUoZGV2LT5tdCk7CisJZGV2LT5tdCA9IE5VTEw7CisJZGV2LT5tdHNpemUgPSAwOworfQorRVhQT1JUX1NZTUJPTChpbnB1dF9tdF9kZXN0cm95X3Nsb3RzKTsKKworLyoqCiAgKiBpbnB1dF9zZXRfY2FwYWJpbGl0eSAtIG1hcmsgZGV2aWNlIGFzIGNhcGFibGUgb2YgYSBjZXJ0YWluIGV2ZW50CiAgKiBAZGV2OiBkZXZpY2UgdGhhdCBpcyBjYXBhYmxlIG9mIGVtaXR0aW5nIG9yIGFjY2VwdGluZyBldmVudAogICogQHR5cGU6IHR5cGUgb2YgdGhlIGV2ZW50IChFVl9LRVksIEVWX1JFTCwgZXRjLi4uKQpAQCAtMTkyNiwyMCArMjAwNCwxMCBAQAogCS5vcGVuID0gaW5wdXRfb3Blbl9maWxlLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGlucHV0X2luaXRfYWJzX2J5cGFzcyh2b2lkKQotewotCWNvbnN0IHVuc2lnbmVkIGludCAqcDsKLQotCWZvciAocCA9IGlucHV0X2Fic19ieXBhc3NfaW5pdF9kYXRhOyAqcDsgcCsrKQotCQlpbnB1dF9hYnNfYnlwYXNzW0JJVF9XT1JEKCpwKV0gfD0gQklUX01BU0soKnApOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpbnB1dF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAotCWlucHV0X2luaXRfYWJzX2J5cGFzcygpOwotCiAJZXJyID0gY2xhc3NfcmVnaXN0ZXIoJmlucHV0X2NsYXNzKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaW5wdXQ6IHVuYWJsZSB0byByZWdpc3RlciBpbnB1dF9kZXYgY2xhc3NcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lkZXYuYyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKaW5kZXggMzQxNTdiYi4uNjM4MzQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2pveWRldi5jCkBAIC0zNyw3ICszNyw2IEBACiAjZGVmaW5lIEpPWURFVl9CVUZGRVJfU0laRQk2NAogCiBzdHJ1Y3Qgam95ZGV2IHsKLQlpbnQgZXhpc3Q7CiAJaW50IG9wZW47CiAJaW50IG1pbm9yOwogCXN0cnVjdCBpbnB1dF9oYW5kbGUgaGFuZGxlOwpAQCAtNDYsNiArNDUsNyBAQAogCXNwaW5sb2NrX3QgY2xpZW50X2xvY2s7IC8qIHByb3RlY3RzIGNsaWVudF9saXN0ICovCiAJc3RydWN0IG11dGV4IG11dGV4OwogCXN0cnVjdCBkZXZpY2UgZGV2OworCWJvb2wgZXhpc3Q7CiAKIAlzdHJ1Y3QganNfY29yciBjb3JyW0FCU19DTlRdOwogCXN0cnVjdCBKU19EQVRBX1NBVkVfVFlQRSBnbHVlOwpAQCAtNzYwLDcgKzc2MCw3IEBACiBzdGF0aWMgdm9pZCBqb3lkZXZfbWFya19kZWFkKHN0cnVjdCBqb3lkZXYgKmpveWRldikKIHsKIAltdXRleF9sb2NrKCZqb3lkZXYtPm11dGV4KTsKLQlqb3lkZXYtPmV4aXN0ID0gMDsKKwlqb3lkZXYtPmV4aXN0ID0gZmFsc2U7CiAJbXV0ZXhfdW5sb2NrKCZqb3lkZXYtPm11dGV4KTsKIH0KIApAQCAtODE3LDEwICs4MTcsOSBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpveWRldi0+d2FpdCk7CiAKIAlkZXZfc2V0X25hbWUoJmpveWRldi0+ZGV2LCAianMlZCIsIG1pbm9yKTsKLQlqb3lkZXYtPmV4aXN0ID0gMTsKKwlqb3lkZXYtPmV4aXN0ID0gdHJ1ZTsKIAlqb3lkZXYtPm1pbm9yID0gbWlub3I7CiAKLQlqb3lkZXYtPmV4aXN0ID0gMTsKIAlqb3lkZXYtPmhhbmRsZS5kZXYgPSBpbnB1dF9nZXRfZGV2aWNlKGRldik7CiAJam95ZGV2LT5oYW5kbGUubmFtZSA9IGRldl9uYW1lKCZqb3lkZXYtPmRldik7CiAJam95ZGV2LT5oYW5kbGUuaGFuZGxlciA9IGhhbmRsZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCmluZGV4IGMxMDg3Y2UuLjI2OWE4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCkBAIC05LDYgKzksNyBAQAogICogICAgICAgICAgICAgICAyMDA1IERvbWluaWMgQ2VycXVldHRpIDxiaW5hcnkxMjMwQHlhaG9vLmNvbT4KICAqICAgICAgICAgICAgICAgMjAwNiBBZGFtIEJ1Y2hiaW5kZXIgPGFkYW0uYnVjaGJpbmRlckBnbWFpbC5jb20+CiAgKiAgICAgICAgICAgICAgIDIwMDcgSmFuIEtyYXRvY2h2aWwgPGhvbnphQGppa29zLmN6PgorICogICAgICAgICAgICAgICAyMDEwIENocmlzdG9waCBGcml0eiA8Y2hmLmZyaXR6QGdvb2dsZW1haWwuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC04OCw2ICs4OSw5IEBACiAgICBidXQgd2UgbWFwIHRoZW0gdG8gYXhlcyB3aGVuIHBvc3NpYmxlIHRvIHNpbXBsaWZ5IHRoaW5ncyAqLwogI2RlZmluZSBNQVBfRFBBRF9UT19CVVRUT05TCQkoMSA8PCAwKQogI2RlZmluZSBNQVBfVFJJR0dFUlNfVE9fQlVUVE9OUwkJKDEgPDwgMSkKKyNkZWZpbmUgTUFQX1NUSUNLU19UT19OVUxMCQkoMSA8PCAyKQorI2RlZmluZSBEQU5DRVBBRF9NQVBfQ09ORklHCShNQVBfRFBBRF9UT19CVVRUT05TIHwJCQlcCisJCQkJTUFQX1RSSUdHRVJTX1RPX0JVVFRPTlMgfCBNQVBfU1RJQ0tTX1RPX05VTEwpCiAKICNkZWZpbmUgWFRZUEVfWEJPWCAgICAgICAgMAogI2RlZmluZSBYVFlQRV9YQk9YMzYwICAgICAxCkBAIC0xMDIsNiArMTA2LDEwIEBACiBtb2R1bGVfcGFyYW0odHJpZ2dlcnNfdG9fYnV0dG9ucywgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHRyaWdnZXJzX3RvX2J1dHRvbnMsICJNYXAgdHJpZ2dlcnMgdG8gYnV0dG9ucyByYXRoZXIgdGhhbiBheGVzIGZvciB1bmtub3duIHBhZHMiKTsKIAorc3RhdGljIGludCBzdGlja3NfdG9fbnVsbDsKK21vZHVsZV9wYXJhbShzdGlja3NfdG9fbnVsbCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHN0aWNrc190b19udWxsLCAiRG8gbm90IG1hcCBzdGlja3MgYXQgYWxsIGZvciB1bmtub3duIHBhZHMiKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB4cGFkX2RldmljZSB7CiAJdTE2IGlkVmVuZG9yOwogCXUxNiBpZFByb2R1Y3Q7CkBAIC0xMTQsNyArMTIyLDcgQEAKIAl7IDB4MDQ1ZSwgMHgwMjg1LCAiTWljcm9zb2Z0IFgtQm94IHBhZCAoSmFwYW4pIiwgMCwgWFRZUEVfWEJPWCB9LAogCXsgMHgwNDVlLCAweDAyODcsICJNaWNyb3NvZnQgWGJveCBDb250cm9sbGVyIFMiLCAwLCBYVFlQRV9YQk9YIH0sCiAJeyAweDA0NWUsIDB4MDcxOSwgIlhib3ggMzYwIFdpcmVsZXNzIFJlY2VpdmVyIiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWDM2MFcgfSwKLQl7IDB4MGMxMiwgMHg4ODA5LCAiUmVkT2N0YW5lIFhib3ggRGFuY2UgUGFkIiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWCB9LAorCXsgMHgwYzEyLCAweDg4MDksICJSZWRPY3RhbmUgWGJveCBEYW5jZSBQYWQiLCBEQU5DRVBBRF9NQVBfQ09ORklHLCBYVFlQRV9YQk9YIH0sCiAJeyAweDA0NGYsIDB4MGYwNywgIlRocnVzdG1hc3RlciwgSW5jLiBDb250cm9sbGVyIiwgMCwgWFRZUEVfWEJPWCB9LAogCXsgMHgwNDZkLCAweGMyNDIsICJMb2dpdGVjaCBDaGlsbHN0cmVhbSBDb250cm9sbGVyIiwgMCwgWFRZUEVfWEJPWDM2MCB9LAogCXsgMHgwNDZkLCAweGNhODQsICJMb2dpdGVjaCBYYm94IENvcmRsZXNzIENvbnRyb2xsZXIiLCAwLCBYVFlQRV9YQk9YIH0sCkBAIC0xNTEsNiArMTU5LDcgQEAKIAl7IDB4MDQ1ZSwgMHgwMjhlLCAiTWljcm9zb2Z0IFgtQm94IDM2MCBwYWQiLCAwLCBYVFlQRV9YQk9YMzYwIH0sCiAJeyAweDFiYWQsIDB4MDAwMywgIkhhcm1vbml4IFJvY2sgQmFuZCBEcnVta2l0IiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWDM2MCB9LAogCXsgMHgwZjBkLCAweDAwMTYsICJIb3JpIFJlYWwgQXJjYWRlIFByby5FWCIsIE1BUF9UUklHR0VSU19UT19CVVRUT05TLCBYVFlQRV9YQk9YMzYwIH0sCisJeyAweDBmMGQsIDB4MDAwZCwgIkhvcmkgRmlnaHRpbmcgU3RpY2sgRVgyIiwgTUFQX1RSSUdHRVJTX1RPX0JVVFRPTlMsIFhUWVBFX1hCT1gzNjAgfSwKIAl7IDB4ZmZmZiwgMHhmZmZmLCAiQ2hpbmVzZS1tYWRlIFhib3ggQ29udHJvbGxlciIsIDAsIFhUWVBFX1hCT1ggfSwKIAl7IDB4MDAwMCwgMHgwMDAwLCAiR2VuZXJpYyBYLUJveCBwYWQiLCAwLCBYVFlQRV9VTktOT1dOIH0KIH07CkBAIC0xNTgsNyArMTY3LDcgQEAKIC8qIGJ1dHRvbnMgc2hhcmVkIHdpdGggeGJveCBhbmQgeGJveDM2MCAqLwogc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCB4cGFkX2NvbW1vbl9idG5bXSA9IHsKIAlCVE5fQSwgQlROX0IsIEJUTl9YLCBCVE5fWSwJCQkvKiAiYW5hbG9nIiBidXR0b25zICovCi0JQlROX1NUQVJULCBCVE5fQkFDSywgQlROX1RIVU1CTCwgQlROX1RIVU1CUiwJLyogc3RhcnQvYmFjay9zdGlja3MgKi8KKwlCVE5fU1RBUlQsIEJUTl9TRUxFQ1QsIEJUTl9USFVNQkwsIEJUTl9USFVNQlIsCS8qIHN0YXJ0L2JhY2svc3RpY2tzICovCiAJLTEJCQkJCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtMTY4LDEwICsxNzcsMTAgQEAKIAktMQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCi0vKiB1c2VkIHdoZW4gZHBhZCBpcyBtYXBwZWQgdG8gbnV0dG9ucyAqLworLyogdXNlZCB3aGVuIGRwYWQgaXMgbWFwcGVkIHRvIGJ1dHRvbnMgKi8KIHN0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgeHBhZF9idG5fcGFkW10gPSB7Ci0JQlROX0xFRlQsIEJUTl9SSUdIVCwJCS8qIGQtcGFkIGxlZnQsIHJpZ2h0ICovCi0JQlROXzAsIEJUTl8xLAkJCS8qIGQtcGFkIHVwLCBkb3duIChYWFggbmFtZXM/PykgKi8KKwlCVE5fVFJJR0dFUl9IQVBQWTEsIEJUTl9UUklHR0VSX0hBUFBZMiwJCS8qIGQtcGFkIGxlZnQsIHJpZ2h0ICovCisJQlROX1RSSUdHRVJfSEFQUFkzLCBCVE5fVFJJR0dFUl9IQVBQWTQsCQkvKiBkLXBhZCB1cCwgZG93biAqLwogCS0xCQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCkBAIC0yNzksMTcgKzI4OCwxOSBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHhwYWQtPmRldjsKIAotCS8qIGxlZnQgc3RpY2sgKi8KLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTIpKSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAotCQkJIH4oX19zMTYpIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopKGRhdGEgKyAxNCkpKTsKKwlpZiAoISh4cGFkLT5tYXBwaW5nICYgTUFQX1NUSUNLU19UT19OVUxMKSkgeworCQkvKiBsZWZ0IHN0aWNrICovCisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwKKwkJCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTIpKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwKKwkJCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE0KSkpOwogCi0JLyogcmlnaHQgc3RpY2sgKi8KLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLAotCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE2KSkpOwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlksCi0JCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE4KSkpOworCQkvKiByaWdodCBzdGljayAqLworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLAorCQkJCSAoX19zMTYpIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopKGRhdGEgKyAxNikpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwKKwkJCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDE4KSkpOworCX0KIAogCS8qIHRyaWdnZXJzIGxlZnQvcmlnaHQgKi8KIAlpZiAoeHBhZC0+bWFwcGluZyAmIE1BUF9UUklHR0VSU19UT19CVVRUT05TKSB7CkBAIC0zMDIsMTAgKzMxMywxMSBAQAogCiAJLyogZGlnaXRhbCBwYWQgKi8KIAlpZiAoeHBhZC0+bWFwcGluZyAmIE1BUF9EUEFEX1RPX0JVVFRPTlMpIHsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAgZGF0YVsyXSAmIDB4MDQpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCBkYXRhWzJdICYgMHgwOCk7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fMCwgICAgIGRhdGFbMl0gJiAweDAxKTsgLyogdXAgKi8KLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8xLCAgICAgZGF0YVsyXSAmIDB4MDIpOyAvKiBkb3duICovCisJCS8qIGRwYWQgYXMgYnV0dG9ucyAobGVmdCwgcmlnaHQsIHVwLCBkb3duKSAqLworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RSSUdHRVJfSEFQUFkxLCBkYXRhWzJdICYgMHgwNCk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVFJJR0dFUl9IQVBQWTIsIGRhdGFbMl0gJiAweDA4KTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UUklHR0VSX0hBUFBZMywgZGF0YVsyXSAmIDB4MDEpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RSSUdHRVJfSEFQUFk0LCBkYXRhWzJdICYgMHgwMik7CiAJfSBlbHNlIHsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWCwKIAkJCQkgISEoZGF0YVsyXSAmIDB4MDgpIC0gISEoZGF0YVsyXSAmIDB4MDQpKTsKQEAgLTMxNSw3ICszMjcsNyBAQAogCiAJLyogc3RhcnQvYmFjayBidXR0b25zIGFuZCBzdGljayBwcmVzcyBsZWZ0L3JpZ2h0ICovCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVEFSVCwgIGRhdGFbMl0gJiAweDEwKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssICAgZGF0YVsyXSAmIDB4MjApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0VMRUNULCBkYXRhWzJdICYgMHgyMCk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9USFVNQkwsIGRhdGFbMl0gJiAweDQwKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CUiwgZGF0YVsyXSAmIDB4ODApOwogCkBAIC0zNDksMTEgKzM2MSwxMSBAQAogCiAJLyogZGlnaXRhbCBwYWQgKi8KIAlpZiAoeHBhZC0+bWFwcGluZyAmIE1BUF9EUEFEX1RPX0JVVFRPTlMpIHsKLQkJLyogZHBhZCBhcyBidXR0b25zIChyaWdodCwgbGVmdCwgZG93biwgdXApICovCi0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgZGF0YVsyXSAmIDB4MDQpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCBkYXRhWzJdICYgMHgwOCk7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fMCwgZGF0YVsyXSAmIDB4MDEpOwkvKiB1cCAqLwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROXzEsIGRhdGFbMl0gJiAweDAyKTsJLyogZG93biAqLworCQkvKiBkcGFkIGFzIGJ1dHRvbnMgKGxlZnQsIHJpZ2h0LCB1cCwgZG93bikgKi8KKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UUklHR0VSX0hBUFBZMSwgZGF0YVsyXSAmIDB4MDQpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RSSUdHRVJfSEFQUFkyLCBkYXRhWzJdICYgMHgwOCk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVFJJR0dFUl9IQVBQWTMsIGRhdGFbMl0gJiAweDAxKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UUklHR0VSX0hBUFBZNCwgZGF0YVsyXSAmIDB4MDIpOwogCX0gZWxzZSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMFgsCiAJCQkJICEhKGRhdGFbMl0gJiAweDA4KSAtICEhKGRhdGFbMl0gJiAweDA0KSk7CkBAIC0zNjMsNyArMzc1LDcgQEAKIAogCS8qIHN0YXJ0L2JhY2sgYnV0dG9ucyAqLwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RBUlQsICBkYXRhWzJdICYgMHgxMCk7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCAgIGRhdGFbMl0gJiAweDIwKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NFTEVDVCwgZGF0YVsyXSAmIDB4MjApOwogCiAJLyogc3RpY2sgcHJlc3MgbGVmdC9yaWdodCAqLwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVEhVTUJMLCBkYXRhWzJdICYgMHg0MCk7CkBAIC0zNzgsMTcgKzM5MCwxOSBAQAogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVFIsCWRhdGFbM10gJiAweDAyKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01PREUsCWRhdGFbM10gJiAweDA0KTsKIAotCS8qIGxlZnQgc3RpY2sgKi8KLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgNikpKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksCi0JCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDgpKSk7CisJaWYgKCEoeHBhZC0+bWFwcGluZyAmIE1BUF9TVElDS1NfVE9fTlVMTCkpIHsKKwkJLyogbGVmdCBzdGljayAqLworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCisJCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDYpKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwKKwkJCQkgfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDgpKSk7CiAKLQkvKiByaWdodCBzdGljayAqLwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlgsCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTApKSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwKLQkJCSB+KF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTIpKSk7CisJCS8qIHJpZ2h0IHN0aWNrICovCisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlgsCisJCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDEwKSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JZLAorCQkJCSB+KF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTIpKSk7CisJfQogCiAJLyogdHJpZ2dlcnMgbGVmdC9yaWdodCAqLwogCWlmICh4cGFkLT5tYXBwaW5nICYgTUFQX1RSSUdHRVJTX1RPX0JVVFRPTlMpIHsKQEAgLTgxNCw2ICs4MjgsOCBAQAogCQkJeHBhZC0+bWFwcGluZyB8PSBNQVBfRFBBRF9UT19CVVRUT05TOwogCQlpZiAodHJpZ2dlcnNfdG9fYnV0dG9ucykKIAkJCXhwYWQtPm1hcHBpbmcgfD0gTUFQX1RSSUdHRVJTX1RPX0JVVFRPTlM7CisJCWlmIChzdGlja3NfdG9fbnVsbCkKKwkJCXhwYWQtPm1hcHBpbmcgfD0gTUFQX1NUSUNLU19UT19OVUxMOwogCX0KIAogCXhwYWQtPmRldiA9IGlucHV0X2RldjsKQEAgLTgzMCwxNiArODQ2LDIwIEBACiAJaW5wdXRfZGV2LT5vcGVuID0geHBhZF9vcGVuOwogCWlucHV0X2Rldi0+Y2xvc2UgPSB4cGFkX2Nsb3NlOwogCi0JaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpOwogCi0JLyogc2V0IHVwIHN0YW5kYXJkIGJ1dHRvbnMgYW5kIGF4ZXMgKi8KKwlpZiAoISh4cGFkLT5tYXBwaW5nICYgTUFQX1NUSUNLU19UT19OVUxMKSkgeworCQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX0FCUyk7CisJCS8qIHNldCB1cCBheGVzICovCisJCWZvciAoaSA9IDA7IHhwYWRfYWJzW2ldID49IDA7IGkrKykKKwkJCXhwYWRfc2V0X3VwX2FicyhpbnB1dF9kZXYsIHhwYWRfYWJzW2ldKTsKKwl9CisKKwkvKiBzZXQgdXAgc3RhbmRhcmQgYnV0dG9ucyAqLwogCWZvciAoaSA9IDA7IHhwYWRfY29tbW9uX2J0bltpXSA+PSAwOyBpKyspCiAJCV9fc2V0X2JpdCh4cGFkX2NvbW1vbl9idG5baV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKIAotCWZvciAoaSA9IDA7IHhwYWRfYWJzW2ldID49IDA7IGkrKykKLQkJeHBhZF9zZXRfdXBfYWJzKGlucHV0X2RldiwgeHBhZF9hYnNbaV0pOwotCi0JLyogTm93IHNldCB1cCBtb2RlbC1zcGVjaWZpYyBvbmVzICovCisJLyogc2V0IHVwIG1vZGVsLXNwZWNpZmljIG9uZXMgKi8KIAlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MCB8fCB4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwVykgewogCQlmb3IgKGkgPSAwOyB4cGFkMzYwX2J0bltpXSA+PSAwOyBpKyspCiAJCQlfX3NldF9iaXQoeHBhZDM2MF9idG5baV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwppbmRleCAxYmEyNTE0Li5iMTcxZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCkBAIC0yOTcsNiArMjk3LDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYXg3MzU5X2tleXBhZC4KIAorY29uZmlnIEtFWUJPQVJEX01DUworCXRyaXN0YXRlICJNRUxGQVMgTUNTIFRvdWNoa2V5IgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGUgTUVMRkFTIE1DUzUwMDAvNTA4MCB0b3VjaGtleSBjb250cm9sbGVyCisJICBjaGlwIGluIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtY3NfdG91Y2hrZXkuCisKIGNvbmZpZyBLRVlCT0FSRF9JTVgKIAl0cmlzdGF0ZSAiSU1YIGtleXBhZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9NWEMKQEAgLTM0Miw2ICszNTQsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHB4YTkzMF9yb3RhcnkuCiAKK2NvbmZpZyBLRVlCT0FSRF9TQU1TVU5HCisJdHJpc3RhdGUgIlNhbXN1bmcga2V5cGFkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQU1TVU5HX0RFVl9LRVlQQUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU2Ftc3VuZyBrZXlwYWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhbXN1bmcta2V5cGFkLgorCiBjb25maWcgS0VZQk9BUkRfU1RPV0FXQVkKIAl0cmlzdGF0ZSAiU3Rvd2F3YXkga2V5Ym9hcmQiCiAJc2VsZWN0IFNFUklPCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCA0NTk2ZDBjLi4xYTY2ZDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTI2LDEyICsyNiwxNCBAQAogb2JqLSQoQ09ORklHX0tFWUJPQVJEX01BUExFKQkJKz0gbWFwbGVfa2V5Yi5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfTUFUUklYKQkJKz0gbWF0cml4X2tleXBhZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfTUFYNzM1OSkJCSs9IG1heDczNTlfa2V5cGFkLm8KK29iai0kKENPTkZJR19LRVlCT0FSRF9NQ1MpCQkrPSBtY3NfdG91Y2hrZXkubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX05FV1RPTikJCSs9IG5ld3RvbmtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfT01BUCkJCSs9IG9tYXAta2V5cGFkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMpCSs9IG9wZW5jb3Jlcy1rYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTI3eCkJCSs9IHB4YTI3eF9rZXlwYWQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTkzMF9ST1RBUlkpCSs9IHB4YTkzMF9yb3Rhcnkubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1FUMjE2MCkJCSs9IHF0MjE2MC5vCitvYmotJChDT05GSUdfS0VZQk9BUkRfU0FNU1VORykJCSs9IHNhbXN1bmcta2V5cGFkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9TSF9LRVlTQykJCSs9IHNoX2tleXNjLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSkJCSs9IHN0b3dhd2F5Lm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9TVU5LQkQpCQkrPSBzdW5rYmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OC1rZXlzLmMKaW5kZXggNzQ0NjAwZS4uZDY5MThjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvaTJjL2FkcDU1ODguaD4KQEAgLTU0LDYgKzU1LDEwIEBACiAKICNkZWZpbmUgS0VZUF9NQVhfRVZFTlQJCTEwCiAKKyNkZWZpbmUgTUFYR1BJTwkJCTE4CisjZGVmaW5lIEFEUF9CQU5LKG9mZnMpCQkoKG9mZnMpID4+IDMpCisjZGVmaW5lIEFEUF9CSVQob2ZmcykJCSgxdSA8PCAoKG9mZnMpICYgMHg3KSkKKwogLyoKICAqIEVhcmx5IHByZSA0LjAgU2lsaWNvbiByZXF1aXJlZCB0byBkZWxheSByZWFkb3V0IGJ5IGF0IGxlYXN0IDI1bXMsCiAgKiBzaW5jZSB0aGUgRXZlbnQgQ291bnRlciBSZWdpc3RlciB1cGRhdGVkIDI1bXMgYWZ0ZXIgdGhlIGludGVycnVwdApAQCAtNjcsNiArNzIsMTYgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJdW5zaWduZWQgbG9uZyBkZWxheTsKIAl1bnNpZ25lZCBzaG9ydCBrZXljb2RlW0FEUDU1ODhfS0VZTUFQU0laRV07CisJY29uc3Qgc3RydWN0IGFkcDU1ODhfZ3BpX21hcCAqZ3BpbWFwOworCXVuc2lnbmVkIHNob3J0IGdwaW1hcHNpemU7CisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwl1bnNpZ25lZCBjaGFyIGdwaW9tYXBbTUFYR1BJT107CisJYm9vbCBleHBvcnRfZ3BpbzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdjOworCXN0cnVjdCBtdXRleCBncGlvX2xvY2s7CS8qIFByb3RlY3QgY2FjaGVkIGRpciwgZGF0X291dCAqLworCXU4IGRhdF9vdXRbM107CisJdTggZGlyWzNdOworI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IGFkcDU1ODhfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCkBAIC04NCwxMiArOTksMjIyIEBACiAJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorc3RhdGljIGludCBhZHA1NTg4X2dwaW9fZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZikKK3sKKwlzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhZHA1NTg4X2twYWQsIGdjKTsKKwl1bnNpZ25lZCBpbnQgYmFuayA9IEFEUF9CQU5LKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJpdCA9IEFEUF9CSVQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKworCXJldHVybiAhIShhZHA1NTg4X3JlYWQoa3BhZC0+Y2xpZW50LCBHUElPX0RBVF9TVEFUMSArIGJhbmspICYgYml0KTsKK30KKworc3RhdGljIHZvaWQgYWRwNTU4OF9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgIHVuc2lnbmVkIG9mZiwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhZHA1NTg4X2twYWQsIGdjKTsKKwl1bnNpZ25lZCBpbnQgYmFuayA9IEFEUF9CQU5LKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJpdCA9IEFEUF9CSVQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKworCW11dGV4X2xvY2soJmtwYWQtPmdwaW9fbG9jayk7CisKKwlpZiAodmFsKQorCQlrcGFkLT5kYXRfb3V0W2JhbmtdIHw9IGJpdDsKKwllbHNlCisJCWtwYWQtPmRhdF9vdXRbYmFua10gJj0gfmJpdDsKKworCWFkcDU1ODhfd3JpdGUoa3BhZC0+Y2xpZW50LCBHUElPX0RBVF9PVVQxICsgYmFuaywKKwkJCSAgIGtwYWQtPmRhdF9vdXRbYmFua10pOworCisJbXV0ZXhfdW5sb2NrKCZrcGFkLT5ncGlvX2xvY2spOworfQorCitzdGF0aWMgaW50IGFkcDU1ODhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmKQoreworCXN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGFkcDU1ODhfa3BhZCwgZ2MpOworCXVuc2lnbmVkIGludCBiYW5rID0gQURQX0JBTksoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0gQURQX0JJVChrcGFkLT5ncGlvbWFwW29mZl0pOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZrcGFkLT5ncGlvX2xvY2spOworCisJa3BhZC0+ZGlyW2JhbmtdICY9IH5iaXQ7CisJcmV0ID0gYWRwNTU4OF93cml0ZShrcGFkLT5jbGllbnQsIEdQSU9fRElSMSArIGJhbmssIGtwYWQtPmRpcltiYW5rXSk7CisKKwltdXRleF91bmxvY2soJmtwYWQtPmdwaW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkcDU1ODhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCSB1bnNpZ25lZCBvZmYsIGludCB2YWwpCit7CisJc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWRwNTU4OF9rcGFkLCBnYyk7CisJdW5zaWduZWQgaW50IGJhbmsgPSBBRFBfQkFOSyhrcGFkLT5ncGlvbWFwW29mZl0pOworCXVuc2lnbmVkIGludCBiaXQgPSBBRFBfQklUKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmtwYWQtPmdwaW9fbG9jayk7CisKKwlrcGFkLT5kaXJbYmFua10gfD0gYml0OworCisJaWYgKHZhbCkKKwkJa3BhZC0+ZGF0X291dFtiYW5rXSB8PSBiaXQ7CisJZWxzZQorCQlrcGFkLT5kYXRfb3V0W2JhbmtdICY9IH5iaXQ7CisKKwlyZXQgPSBhZHA1NTg4X3dyaXRlKGtwYWQtPmNsaWVudCwgR1BJT19EQVRfT1VUMSArIGJhbmssCisJCQkJIGtwYWQtPmRhdF9vdXRbYmFua10pOworCXJldCB8PSBhZHA1NTg4X3dyaXRlKGtwYWQtPmNsaWVudCwgR1BJT19ESVIxICsgYmFuaywKKwkJCQkga3BhZC0+ZGlyW2JhbmtdKTsKKworCW11dGV4X3VubG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1ODhfYnVpbGRfZ3Bpb21hcChzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkLAorCQkJCWNvbnN0IHN0cnVjdCBhZHA1NTg4X2twYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJYm9vbCBwaW5fdXNlZFtNQVhHUElPXTsKKwlpbnQgbl91bnVzZWQgPSAwOworCWludCBpOworCisJbWVtc2V0KHBpbl91c2VkLCAwLCBzaXplb2YocGluX3VzZWQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+cm93czsgaSsrKQorCQlwaW5fdXNlZFtpXSA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmNvbHM7IGkrKykKKwkJcGluX3VzZWRbaSArIEdQSV9QSU5fQ09MX0JBU0UgLSBHUElfUElOX0JBU0VdID0gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBrcGFkLT5ncGltYXBzaXplOyBpKyspCisJCXBpbl91c2VkW2twYWQtPmdwaW1hcFtpXS5waW4gLSBHUElfUElOX0JBU0VdID0gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhHUElPOyBpKyspCisJCWlmICghcGluX3VzZWRbaV0pCisJCQlrcGFkLT5ncGlvbWFwW25fdW51c2VkKytdID0gaTsKKworCXJldHVybiBuX3VudXNlZDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRwNTU4OF9ncGlvX2FkZChzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZrcGFkLT5jbGllbnQtPmRldjsKKwljb25zdCBzdHJ1Y3QgYWRwNTU4OF9rcGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWNvbnN0IHN0cnVjdCBhZHA1NTg4X2dwaW9fcGxhdGZvcm1fZGF0YSAqZ3Bpb19kYXRhID0gcGRhdGEtPmdwaW9fZGF0YTsKKwlpbnQgaSwgZXJyb3I7CisKKwlpZiAoIWdwaW9fZGF0YSkKKwkJcmV0dXJuIDA7CisKKwlrcGFkLT5nYy5uZ3BpbyA9IGFkcDU1ODhfYnVpbGRfZ3Bpb21hcChrcGFkLCBwZGF0YSk7CisJaWYgKGtwYWQtPmdjLm5ncGlvID09IDApIHsKKwkJZGV2X2luZm8oZGV2LCAiTm8gdW51c2VkIGdwaW9zIGxlZnQgdG8gZXhwb3J0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJa3BhZC0+ZXhwb3J0X2dwaW8gPSB0cnVlOworCisJa3BhZC0+Z2MuZGlyZWN0aW9uX2lucHV0ID0gYWRwNTU4OF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlrcGFkLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gYWRwNTU4OF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJa3BhZC0+Z2MuZ2V0ID0gYWRwNTU4OF9ncGlvX2dldF92YWx1ZTsKKwlrcGFkLT5nYy5zZXQgPSBhZHA1NTg4X2dwaW9fc2V0X3ZhbHVlOworCWtwYWQtPmdjLmNhbl9zbGVlcCA9IDE7CisKKwlrcGFkLT5nYy5iYXNlID0gZ3Bpb19kYXRhLT5ncGlvX3N0YXJ0OworCWtwYWQtPmdjLmxhYmVsID0ga3BhZC0+Y2xpZW50LT5uYW1lOworCWtwYWQtPmdjLm93bmVyID0gVEhJU19NT0RVTEU7CisKKwltdXRleF9pbml0KCZrcGFkLT5ncGlvX2xvY2spOworCisJZXJyb3IgPSBncGlvY2hpcF9hZGQoJmtwYWQtPmdjKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJncGlvY2hpcF9hZGQgZmFpbGVkLCBlcnI6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IEFEUF9CQU5LKE1BWEdQSU8pOyBpKyspIHsKKwkJa3BhZC0+ZGF0X291dFtpXSA9IGFkcDU1ODhfcmVhZChrcGFkLT5jbGllbnQsCisJCQkJCQlHUElPX0RBVF9PVVQxICsgaSk7CisJCWtwYWQtPmRpcltpXSA9IGFkcDU1ODhfcmVhZChrcGFkLT5jbGllbnQsIEdQSU9fRElSMSArIGkpOworCX0KKworCWlmIChncGlvX2RhdGEtPnNldHVwKSB7CisJCWVycm9yID0gZ3Bpb19kYXRhLT5zZXR1cChrcGFkLT5jbGllbnQsCisJCQkJCSBrcGFkLT5nYy5iYXNlLCBrcGFkLT5nYy5uZ3BpbywKKwkJCQkJIGdwaW9fZGF0YS0+Y29udGV4dCk7CisJCWlmIChlcnJvcikKKwkJCWRldl93YXJuKGRldiwgInNldHVwIGZhaWxlZCwgJWRcbiIsIGVycm9yKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFkcDU1ODhfZ3Bpb19yZW1vdmUoc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAma3BhZC0+Y2xpZW50LT5kZXY7CisJY29uc3Qgc3RydWN0IGFkcDU1ODhfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwljb25zdCBzdHJ1Y3QgYWRwNTU4OF9ncGlvX3BsYXRmb3JtX2RhdGEgKmdwaW9fZGF0YSA9IHBkYXRhLT5ncGlvX2RhdGE7CisJaW50IGVycm9yOworCisJaWYgKCFrcGFkLT5leHBvcnRfZ3BpbykKKwkJcmV0dXJuOworCisJaWYgKGdwaW9fZGF0YS0+dGVhcmRvd24pIHsKKwkJZXJyb3IgPSBncGlvX2RhdGEtPnRlYXJkb3duKGtwYWQtPmNsaWVudCwKKwkJCQkJICAgIGtwYWQtPmdjLmJhc2UsIGtwYWQtPmdjLm5ncGlvLAorCQkJCQkgICAgZ3Bpb19kYXRhLT5jb250ZXh0KTsKKwkJaWYgKGVycm9yKQorCQkJZGV2X3dhcm4oZGV2LCAidGVhcmRvd24gZmFpbGVkICVkXG4iLCBlcnJvcik7CisJfQorCisJZXJyb3IgPSBncGlvY2hpcF9yZW1vdmUoJmtwYWQtPmdjKTsKKwlpZiAoZXJyb3IpCisJCWRldl93YXJuKGRldiwgImdwaW9jaGlwX3JlbW92ZSBmYWlsZWQgJWRcbiIsIGVycm9yKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhZHA1NTg4X2dwaW9fYWRkKHN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHA1NTg4X2dwaW9fcmVtb3ZlKHN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQpCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYWRwNTU4OF9yZXBvcnRfZXZlbnRzKHN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQsIGludCBldl9jbnQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXZfY250OyBpKyspIHsKKwkJaW50IGtleSA9IGFkcDU1ODhfcmVhZChrcGFkLT5jbGllbnQsIEtleV9FVkVOVEEgKyBpKTsKKwkJaW50IGtleV92YWwgPSBrZXkgJiBLRVlfRVZfTUFTSzsKKworCQlpZiAoa2V5X3ZhbCA+PSBHUElfUElOX0JBU0UgJiYga2V5X3ZhbCA8PSBHUElfUElOX0VORCkgeworCQkJZm9yIChqID0gMDsgaiA8IGtwYWQtPmdwaW1hcHNpemU7IGorKykgeworCQkJCWlmIChrZXlfdmFsID09IGtwYWQtPmdwaW1hcFtqXS5waW4pIHsKKwkJCQkJaW5wdXRfcmVwb3J0X3N3aXRjaChrcGFkLT5pbnB1dCwKKwkJCQkJCQlrcGFkLT5ncGltYXBbal0uc3dfZXZ0LAorCQkJCQkJCWtleSAmIEtFWV9FVl9QUkVTU0VEKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaW5wdXRfcmVwb3J0X2tleShrcGFkLT5pbnB1dCwKKwkJCQkJIGtwYWQtPmtleWNvZGVba2V5X3ZhbCAtIDFdLAorCQkJCQkga2V5ICYgS0VZX0VWX1BSRVNTRUQpOworCQl9CisJfQorfQorCiBzdGF0aWMgdm9pZCBhZHA1NTg4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQgPSBjb250YWluZXJfb2Yod29yaywKIAkJCQkJCXN0cnVjdCBhZHA1NTg4X2twYWQsIHdvcmsud29yayk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGtwYWQtPmNsaWVudDsKLQlpbnQgaSwga2V5LCBzdGF0dXMsIGV2X2NudDsKKwlpbnQgc3RhdHVzLCBldl9jbnQ7CiAKIAlzdGF0dXMgPSBhZHA1NTg4X3JlYWQoY2xpZW50LCBJTlRfU1RBVCk7CiAKQEAgLTk5LDEyICszMjQsNyBAQAogCWlmIChzdGF0dXMgJiBLRV9JTlQpIHsKIAkJZXZfY250ID0gYWRwNTU4OF9yZWFkKGNsaWVudCwgS0VZX0xDS19FQ19TVEFUKSAmIEtFQzsKIAkJaWYgKGV2X2NudCkgewotCQkJZm9yIChpID0gMDsgaSA8IGV2X2NudDsgaSsrKSB7Ci0JCQkJa2V5ID0gYWRwNTU4OF9yZWFkKGNsaWVudCwgS2V5X0VWRU5UQSArIGkpOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoa3BhZC0+aW5wdXQsCi0JCQkJCWtwYWQtPmtleWNvZGVbKGtleSAmIEtFWV9FVl9NQVNLKSAtIDFdLAotCQkJCQlrZXkgJiBLRVlfRVZfUFJFU1NFRCk7Ci0JCQl9CisJCQlhZHA1NTg4X3JlcG9ydF9ldmVudHMoa3BhZCwgZXZfY250KTsKIAkJCWlucHV0X3N5bmMoa3BhZC0+aW5wdXQpOwogCQl9CiAJfQpAQCAtMTI4LDggKzM0OCwxMCBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHA1NTg4X3NldHVwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGFkcDU1ODhfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJY29uc3Qgc3RydWN0IGFkcDU1ODhfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJY29uc3Qgc3RydWN0IGFkcDU1ODhfZ3Bpb19wbGF0Zm9ybV9kYXRhICpncGlvX2RhdGEgPSBwZGF0YS0+Z3Bpb19kYXRhOwogCWludCBpLCByZXQ7CisJdW5zaWduZWQgY2hhciBldnRfbW9kZTEgPSAwLCBldnRfbW9kZTIgPSAwLCBldnRfbW9kZTMgPSAwOwogCiAJcmV0ID0gYWRwNTU4OF93cml0ZShjbGllbnQsIEtQX0dQSU8xLCBLUF9TRUwocGRhdGEtPnJvd3MpKTsKIAlyZXQgfD0gYWRwNTU4OF93cml0ZShjbGllbnQsIEtQX0dQSU8yLCBLUF9TRUwocGRhdGEtPmNvbHMpICYgMHhGRik7CkBAIC0xNDQsNiArMzY2LDMyIEBACiAJZm9yIChpID0gMDsgaSA8IEtFWVBfTUFYX0VWRU5UOyBpKyspCiAJCXJldCB8PSBhZHA1NTg4X3JlYWQoY2xpZW50LCBLZXlfRVZFTlRBKTsKIAorCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Z3BpbWFwc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIHNob3J0IHBpbiA9IHBkYXRhLT5ncGltYXBbaV0ucGluOworCisJCWlmIChwaW4gPD0gR1BJX1BJTl9ST1dfRU5EKSB7CisJCQlldnRfbW9kZTEgfD0gKDEgPDwgKHBpbiAtIEdQSV9QSU5fUk9XX0JBU0UpKTsKKwkJfSBlbHNlIHsKKwkJCWV2dF9tb2RlMiB8PSAoKDEgPDwgKHBpbiAtIEdQSV9QSU5fQ09MX0JBU0UpKSAmIDB4RkYpOworCQkJZXZ0X21vZGUzIHw9ICgoMSA8PCAocGluIC0gR1BJX1BJTl9DT0xfQkFTRSkpID4+IDgpOworCQl9CisJfQorCisJaWYgKHBkYXRhLT5ncGltYXBzaXplKSB7CisJCXJldCB8PSBhZHA1NTg4X3dyaXRlKGNsaWVudCwgR1BJX0VNMSwgZXZ0X21vZGUxKTsKKwkJcmV0IHw9IGFkcDU1ODhfd3JpdGUoY2xpZW50LCBHUElfRU0yLCBldnRfbW9kZTIpOworCQlyZXQgfD0gYWRwNTU4OF93cml0ZShjbGllbnQsIEdQSV9FTTMsIGV2dF9tb2RlMyk7CisJfQorCisJaWYgKGdwaW9fZGF0YSkgeworCQlmb3IgKGkgPSAwOyBpIDw9IEFEUF9CQU5LKE1BWEdQSU8pOyBpKyspIHsKKwkJCWludCBwdWxsX21hc2sgPSBncGlvX2RhdGEtPnB1bGx1cF9kaXNfbWFzazsKKworCQkJcmV0IHw9IGFkcDU1ODhfd3JpdGUoY2xpZW50LCBHUElPX1BVTEwxICsgaSwKKwkJCQkocHVsbF9tYXNrID4+ICg4ICogaSkpICYgMHhGRik7CisJCX0KKwl9CisKIAlyZXQgfD0gYWRwNTU4OF93cml0ZShjbGllbnQsIElOVF9TVEFULCBDTVAyX0lOVCB8IENNUDFfSU5UIHwKIAkJCQkJT1ZSX0ZMT1dfSU5UIHwgS19MQ0tfSU5UIHwKIAkJCQkJR1BJX0lOVCB8IEtFX0lOVCk7IC8qIFN0YXR1cyBpcyBXMUMgKi8KQEAgLTE1OCwxMSArNDA2LDQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhZHA1NTg4X3JlcG9ydF9zd2l0Y2hfc3RhdGUoc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZCkKK3sKKwlpbnQgZ3BpX3N0YXQxID0gYWRwNTU4OF9yZWFkKGtwYWQtPmNsaWVudCwgR1BJT19EQVRfU1RBVDEpOworCWludCBncGlfc3RhdDIgPSBhZHA1NTg4X3JlYWQoa3BhZC0+Y2xpZW50LCBHUElPX0RBVF9TVEFUMik7CisJaW50IGdwaV9zdGF0MyA9IGFkcDU1ODhfcmVhZChrcGFkLT5jbGllbnQsIEdQSU9fREFUX1NUQVQzKTsKKwlpbnQgZ3BpX3N0YXRfdG1wLCBwaW5fbG9jOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGtwYWQtPmdwaW1hcHNpemU7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCBwaW4gPSBrcGFkLT5ncGltYXBbaV0ucGluOworCisJCWlmIChwaW4gPD0gR1BJX1BJTl9ST1dfRU5EKSB7CisJCQlncGlfc3RhdF90bXAgPSBncGlfc3RhdDE7CisJCQlwaW5fbG9jID0gcGluIC0gR1BJX1BJTl9ST1dfQkFTRTsKKwkJfSBlbHNlIGlmICgocGluIC0gR1BJX1BJTl9DT0xfQkFTRSkgPCA4KSB7CisJCQlncGlfc3RhdF90bXAgPSBncGlfc3RhdDI7CisJCQlwaW5fbG9jID0gcGluIC0gR1BJX1BJTl9DT0xfQkFTRTsKKwkJfSBlbHNlIHsKKwkJCWdwaV9zdGF0X3RtcCA9IGdwaV9zdGF0MzsKKwkJCXBpbl9sb2MgPSBwaW4gLSBHUElfUElOX0NPTF9CQVNFIC0gODsKKwkJfQorCisJCWlmIChncGlfc3RhdF90bXAgPCAwKSB7CisJCQlkZXZfZXJyKCZrcGFkLT5jbGllbnQtPmRldiwKKwkJCQkiQ2FuJ3QgcmVhZCBHUElPX0RBVF9TVEFUIHN3aXRjaCAlZCBkZWZhdWx0IHRvIE9GRlxuIiwKKwkJCQlwaW4pOworCQkJZ3BpX3N0YXRfdG1wID0gMDsKKwkJfQorCisJCWlucHV0X3JlcG9ydF9zd2l0Y2goa3BhZC0+aW5wdXQsCisJCQkJICAgIGtwYWQtPmdwaW1hcFtpXS5zd19ldnQsCisJCQkJICAgICEoZ3BpX3N0YXRfdG1wICYgKDEgPDwgcGluX2xvYykpKTsKKwl9CisKKwlpbnB1dF9zeW5jKGtwYWQtPmlucHV0KTsKK30KKworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHA1NTg4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkOwotCXN0cnVjdCBhZHA1NTg4X2twYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWNvbnN0IHN0cnVjdCBhZHA1NTg4X2twYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCXVuc2lnbmVkIGludCByZXZpZDsKIAlpbnQgcmV0LCBpOwpAQCAtMTg5LDYgKzQ3NSwzNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoIXBkYXRhLT5ncGltYXAgJiYgcGRhdGEtPmdwaW1hcHNpemUpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbnZhbGlkIGdwaW1hcCBmcm9tIHBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhLT5ncGltYXBzaXplID4gQURQNTU4OF9HUElNQVBTSVpFX01BWCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ3BpbWFwc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Z3BpbWFwc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIHNob3J0IHBpbiA9IHBkYXRhLT5ncGltYXBbaV0ucGluOworCisJCWlmIChwaW4gPCBHUElfUElOX0JBU0UgfHwgcGluID4gR1BJX1BJTl9FTkQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW52YWxpZCBncGkgcGluIGRhdGFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAocGluIDw9IEdQSV9QSU5fUk9XX0VORCkgeworCQkJaWYgKHBpbiAtIEdQSV9QSU5fUk9XX0JBU0UgKyAxIDw9IHBkYXRhLT5yb3dzKSB7CisJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbnZhbGlkIGdwaSByb3cgZGF0YVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocGluIC0gR1BJX1BJTl9DT0xfQkFTRSArIDEgPD0gcGRhdGEtPmNvbHMpIHsKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ3BpIGNvbCBkYXRhXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwogCWlmICghY2xpZW50LT5pcnEpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJubyBJUlE/XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzMsNiArNTUwLDkgQEAKIAltZW1jcHkoa3BhZC0+a2V5Y29kZSwgcGRhdGEtPmtleW1hcCwKIAkJcGRhdGEtPmtleW1hcHNpemUgKiBpbnB1dC0+a2V5Y29kZXNpemUpOwogCisJa3BhZC0+Z3BpbWFwID0gcGRhdGEtPmdwaW1hcDsKKwlrcGFkLT5ncGltYXBzaXplID0gcGRhdGEtPmdwaW1hcHNpemU7CisKIAkvKiBzZXR1cCBpbnB1dCBkZXZpY2UgKi8KIAlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOwogCkBAIC0yNDMsNiArNTYzLDExIEBACiAJCV9fc2V0X2JpdChrcGFkLT5rZXljb2RlW2ldICYgS0VZX01BWCwgaW5wdXQtPmtleWJpdCk7CiAJX19jbGVhcl9iaXQoS0VZX1JFU0VSVkVELCBpbnB1dC0+a2V5Yml0KTsKIAorCWlmIChrcGFkLT5ncGltYXBzaXplKQorCQlfX3NldF9iaXQoRVZfU1csIGlucHV0LT5ldmJpdCk7CisJZm9yIChpID0gMDsgaSA8IGtwYWQtPmdwaW1hcHNpemU7IGkrKykKKwkJX19zZXRfYml0KGtwYWQtPmdwaW1hcFtpXS5zd19ldnQsIGlucHV0LT5zd2JpdCk7CisKIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CkBAIC0yNjEsNiArNTg2LDEzIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9mcmVlX2lycTsKIAorCWlmIChrcGFkLT5ncGltYXBzaXplKQorCQlhZHA1NTg4X3JlcG9ydF9zd2l0Y2hfc3RhdGUoa3BhZCk7CisKKwllcnJvciA9IGFkcDU1ODhfZ3Bpb19hZGQoa3BhZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2lycTsKKwogCWRldmljZV9pbml0X3dha2V1cCgmY2xpZW50LT5kZXYsIDEpOwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGtwYWQpOwogCkBAIC0yODcsNiArNjE5LDcgQEAKIAlmcmVlX2lycShjbGllbnQtPmlycSwga3BhZCk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZrcGFkLT53b3JrKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShrcGFkLT5pbnB1dCk7CisJYWRwNTU4OF9ncGlvX3JlbW92ZShrcGFkKTsKIAlrZnJlZShrcGFkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKaW5kZXggYjgyMTNmZC4uYTlmZDE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCkBAIC0zMSw2ICszMSw3IEBACiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJaW50IHRpbWVyX2RlYm91bmNlOwkvKiBpbiBtc2VjcyAqLwogCWJvb2wgZGlzYWJsZWQ7CiB9OwogCkBAIC0xMDksNyArMTEwLDcgQEAKIAkJICogRGlzYWJsZSBJUlEgYW5kIHBvc3NpYmxlIGRlYm91bmNpbmcgdGltZXIuCiAJCSAqLwogCQlkaXNhYmxlX2lycShncGlvX3RvX2lycShiZGF0YS0+YnV0dG9uLT5ncGlvKSk7Ci0JCWlmIChiZGF0YS0+YnV0dG9uLT5kZWJvdW5jZV9pbnRlcnZhbCkKKwkJaWYgKGJkYXRhLT50aW1lcl9kZWJvdW5jZSkKIAkJCWRlbF90aW1lcl9zeW5jKCZiZGF0YS0+dGltZXIpOwogCiAJCWJkYXRhLT5kaXNhYmxlZCA9IHRydWU7CkBAIC0zNDcsOSArMzQ4LDkgQEAKIAogCUJVR19PTihpcnEgIT0gZ3Bpb190b19pcnEoYnV0dG9uLT5ncGlvKSk7CiAKLQlpZiAoYnV0dG9uLT5kZWJvdW5jZV9pbnRlcnZhbCkKKwlpZiAoYmRhdGEtPnRpbWVyX2RlYm91bmNlKQogCQltb2RfdGltZXIoJmJkYXRhLT50aW1lciwKLQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGJ1dHRvbi0+ZGVib3VuY2VfaW50ZXJ2YWwpKTsKKwkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGJkYXRhLT50aW1lcl9kZWJvdW5jZSkpOwogCWVsc2UKIAkJc2NoZWR1bGVfd29yaygmYmRhdGEtPndvcmspOwogCkBAIC0zODMsNiArMzg0LDE0IEBACiAJCWdvdG8gZmFpbDM7CiAJfQogCisJaWYgKGJ1dHRvbi0+ZGVib3VuY2VfaW50ZXJ2YWwpIHsKKwkJZXJyb3IgPSBncGlvX3NldF9kZWJvdW5jZShidXR0b24tPmdwaW8sCisJCQkJCSAgYnV0dG9uLT5kZWJvdW5jZV9pbnRlcnZhbCAqIDEwMDApOworCQkvKiB1c2UgdGltZXIgaWYgZ3Bpb2xpYiBkb2Vzbid0IHByb3ZpZGUgZGVib3VuY2UgKi8KKwkJaWYgKGVycm9yIDwgMCkKKwkJCWJkYXRhLT50aW1lcl9kZWJvdW5jZSA9IGJ1dHRvbi0+ZGVib3VuY2VfaW50ZXJ2YWw7CisJfQorCiAJaXJxID0gZ3Bpb190b19pcnEoYnV0dG9uLT5ncGlvKTsKIAlpZiAoaXJxIDwgMCkgewogCQllcnJvciA9IGlycTsKQEAgLTQ5OCw3ICs1MDcsNyBAQAogIGZhaWwyOgogCXdoaWxlICgtLWkgPj0gMCkgewogCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+YnV0dG9uc1tpXS5ncGlvKSwgJmRkYXRhLT5kYXRhW2ldKTsKLQkJaWYgKHBkYXRhLT5idXR0b25zW2ldLmRlYm91bmNlX2ludGVydmFsKQorCQlpZiAoZGRhdGEtPmRhdGFbaV0udGltZXJfZGVib3VuY2UpCiAJCQlkZWxfdGltZXJfc3luYygmZGRhdGEtPmRhdGFbaV0udGltZXIpOwogCQljYW5jZWxfd29ya19zeW5jKCZkZGF0YS0+ZGF0YVtpXS53b3JrKTsKIAkJZ3Bpb19mcmVlKHBkYXRhLT5idXR0b25zW2ldLmdwaW8pOwpAQCAtNTI2LDcgKzUzNSw3IEBACiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5uYnV0dG9uczsgaSsrKSB7CiAJCWludCBpcnEgPSBncGlvX3RvX2lycShwZGF0YS0+YnV0dG9uc1tpXS5ncGlvKTsKIAkJZnJlZV9pcnEoaXJxLCAmZGRhdGEtPmRhdGFbaV0pOwotCQlpZiAocGRhdGEtPmJ1dHRvbnNbaV0uZGVib3VuY2VfaW50ZXJ2YWwpCisJCWlmIChkZGF0YS0+ZGF0YVtpXS50aW1lcl9kZWJvdW5jZSkKIAkJCWRlbF90aW1lcl9zeW5jKCZkZGF0YS0+ZGF0YVtpXS50aW1lcik7CiAJCWNhbmNlbF93b3JrX3N5bmMoJmRkYXRhLT5kYXRhW2ldLndvcmspOwogCQlncGlvX2ZyZWUocGRhdGEtPmJ1dHRvbnNbaV0uZ3Bpbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYwppbmRleCA0MGIwMzJmLi5mN2MyYTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMKQEAgLTY0Miw2ICs2NDIsNyBAQAogCXN0cnVjdCBsbTgzMjNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CiAJc3RydWN0IGxtODMyM19jaGlwICpsbTsKKwlpbnQgcHdtOwogCWludCBpLCBlcnI7CiAJdW5zaWduZWQgbG9uZyB0bW87CiAJdTggZGF0YVsyXTsKQEAgLTcxMCw4ICs3MTEsOSBAQAogCQlnb3RvIGZhaWwxOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBMTTgzMjNfTlVNX1BXTVM7IGkrKykgewotCQllcnIgPSBpbml0X3B3bShsbSwgaSArIDEsICZjbGllbnQtPmRldiwgcGRhdGEtPnB3bV9uYW1lc1tpXSk7CisJZm9yIChwd20gPSAwOyBwd20gPCBMTTgzMjNfTlVNX1BXTVM7IHB3bSsrKSB7CisJCWVyciA9IGluaXRfcHdtKGxtLCBwd20gKyAxLCAmY2xpZW50LT5kZXYsCisJCQkgICAgICAgcGRhdGEtPnB3bV9uYW1lc1twd21dKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGZhaWwyOwogCX0KQEAgLTc2NCw5ICs3NjYsOSBAQAogZmFpbDM6CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2Rpc2FibGVfa3ApOwogZmFpbDI6Ci0Jd2hpbGUgKC0taSA+PSAwKQotCQlpZiAobG0tPnB3bVtpXS5lbmFibGVkKQotCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmxtLT5wd21baV0uY2Rldik7CisJd2hpbGUgKC0tcHdtID49IDApCisJCWlmIChsbS0+cHdtW3B3bV0uZW5hYmxlZCkKKwkJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsbS0+cHdtW3B3bV0uY2Rldik7CiBmYWlsMToKIAlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKIAlrZnJlZShsbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL21hdHJpeF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCmluZGV4IGI0NDNlMDguLmIwMmU0MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCkBAIC0zNyw2ICszNyw3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCWJvb2wgc2Nhbl9wZW5kaW5nOwogCWJvb2wgc3RvcHBlZDsKKwlib29sIGdwaW9fYWxsX2Rpc2FibGVkOwogfTsKIAogLyoKQEAgLTg3LDggKzg4LDEyIEBACiAJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspCi0JCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPnJvd19ncGlvc1tpXSkpOworCWlmIChwZGF0YS0+Y2x1c3RlcmVkX2lycSA+IDApCisJCWVuYWJsZV9pcnEocGRhdGEtPmNsdXN0ZXJlZF9pcnEpOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yb3dfZ3Bpb3M7IGkrKykKKwkJCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPnJvd19ncGlvc1tpXSkpOworCX0KIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9yb3dfaXJxcyhzdHJ1Y3QgbWF0cml4X2tleXBhZCAqa2V5cGFkKQpAQCAtOTYsOCArMTAxLDEyIEBACiAJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspCi0JCWRpc2FibGVfaXJxX25vc3luYyhncGlvX3RvX2lycShwZGF0YS0+cm93X2dwaW9zW2ldKSk7CisJaWYgKHBkYXRhLT5jbHVzdGVyZWRfaXJxID4gMCkKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKHBkYXRhLT5jbHVzdGVyZWRfaXJxKTsKKwllbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspCisJCQlkaXNhYmxlX2lycV9ub3N5bmMoZ3Bpb190b19pcnEocGRhdGEtPnJvd19ncGlvc1tpXSkpOworCX0KIH0KIAogLyoKQEAgLTIxNiwyNSArMjI1LDU4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbWF0cml4X2tleXBhZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG1hdHJpeF9rZXlwYWRfZW5hYmxlX3dha2V1cChzdHJ1Y3QgbWF0cml4X2tleXBhZCAqa2V5cGFkKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgbWF0cml4X2tleXBhZCAqa2V5cGFkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOworCXVuc2lnbmVkIGludCBncGlvOwogCWludCBpOwogCi0JbWF0cml4X2tleXBhZF9zdG9wKGtleXBhZC0+aW5wdXRfZGV2KTsKKwlpZiAocGRhdGEtPmNsdXN0ZXJlZF9pcnEgPiAwKSB7CisJCWlmIChlbmFibGVfaXJxX3dha2UocGRhdGEtPmNsdXN0ZXJlZF9pcnEpID09IDApCisJCQlrZXlwYWQtPmdwaW9fYWxsX2Rpc2FibGVkID0gdHJ1ZTsKKwl9IGVsc2UgewogCi0JaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3Jvd19ncGlvczsgaSsrKSB7CiAJCQlpZiAoIXRlc3RfYml0KGksIGtleXBhZC0+ZGlzYWJsZWRfZ3Bpb3MpKSB7Ci0JCQkJdW5zaWduZWQgaW50IGdwaW8gPSBwZGF0YS0+cm93X2dwaW9zW2ldOworCQkJCWdwaW8gPSBwZGF0YS0+cm93X2dwaW9zW2ldOwogCiAJCQkJaWYgKGVuYWJsZV9pcnFfd2FrZShncGlvX3RvX2lycShncGlvKSkgPT0gMCkKIAkJCQkJX19zZXRfYml0KGksIGtleXBhZC0+ZGlzYWJsZWRfZ3Bpb3MpOwogCQkJfQogCQl9CiAJfQorfQorCitzdGF0aWMgdm9pZCBtYXRyaXhfa2V5cGFkX2Rpc2FibGVfd2FrZXVwKHN0cnVjdCBtYXRyaXhfa2V5cGFkICprZXlwYWQpCit7CisJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOworCXVuc2lnbmVkIGludCBncGlvOworCWludCBpOworCisJaWYgKHBkYXRhLT5jbHVzdGVyZWRfaXJxID4gMCkgeworCQlpZiAoa2V5cGFkLT5ncGlvX2FsbF9kaXNhYmxlZCkgeworCQkJZGlzYWJsZV9pcnFfd2FrZShwZGF0YS0+Y2x1c3RlcmVkX2lycSk7CisJCQlrZXlwYWQtPmdwaW9fYWxsX2Rpc2FibGVkID0gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yb3dfZ3Bpb3M7IGkrKykgeworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChpLCBrZXlwYWQtPmRpc2FibGVkX2dwaW9zKSkgeworCQkJCWdwaW8gPSBwZGF0YS0+cm93X2dwaW9zW2ldOworCQkJCWRpc2FibGVfaXJxX3dha2UoZ3Bpb190b19pcnEoZ3BpbykpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1hdHJpeF9rZXlwYWRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtYXRyaXhfa2V5cGFkICprZXlwYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW1hdHJpeF9rZXlwYWRfc3RvcChrZXlwYWQtPmlucHV0X2Rldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCW1hdHJpeF9rZXlwYWRfZW5hYmxlX3dha2V1cChrZXlwYWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDMsMTggKzI4NSw5IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBtYXRyaXhfa2V5cGFkICprZXlwYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQljb25zdCBzdHJ1Y3QgbWF0cml4X2tleXBhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGtleXBhZC0+cGRhdGE7Ci0JaW50IGk7CiAKLQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspIHsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaSwga2V5cGFkLT5kaXNhYmxlZF9ncGlvcykpIHsKLQkJCQl1bnNpZ25lZCBpbnQgZ3BpbyA9IHBkYXRhLT5yb3dfZ3Bpb3NbaV07Ci0KLQkJCQlkaXNhYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKGdwaW8pKTsKLQkJCX0KLQkJfQotCX0KKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCW1hdHJpeF9rZXlwYWRfZGlzYWJsZV93YWtldXAoa2V5cGFkKTsKIAogCW1hdHJpeF9rZXlwYWRfc3RhcnQoa2V5cGFkLT5pbnB1dF9kZXYpOwogCkBAIC0yOTYsMTcgKzMyOSwzMSBAQAogCQlncGlvX2RpcmVjdGlvbl9pbnB1dChwZGF0YS0+cm93X2dwaW9zW2ldKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yb3dfZ3Bpb3M7IGkrKykgewotCQllcnIgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShwZGF0YS0+cm93X2dwaW9zW2ldKSwKKwlpZiAocGRhdGEtPmNsdXN0ZXJlZF9pcnEgPiAwKSB7CisJCWVyciA9IHJlcXVlc3RfaXJxKHBkYXRhLT5jbHVzdGVyZWRfaXJxLAogCQkJCW1hdHJpeF9rZXlwYWRfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUQgfAotCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQlwZGF0YS0+Y2x1c3RlcmVkX2lycV9mbGFncywKIAkJCQkibWF0cml4LWtleXBhZCIsIGtleXBhZCk7CiAJCWlmIChlcnIpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiVW5hYmxlIHRvIGFjcXVpcmUgaW50ZXJydXB0IGZvciBHUElPIGxpbmUgJWlcbiIsCi0JCQkJcGRhdGEtPnJvd19ncGlvc1tpXSk7Ci0JCQlnb3RvIGVycl9mcmVlX2lycXM7CisJCQkJIlVuYWJsZSB0byBhY3F1aXJlIGNsdXN0ZXJlZCBpbnRlcnJ1cHRcbiIpOworCQkJZ290byBlcnJfZnJlZV9yb3dzOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspIHsKKwkJCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5yb3dfZ3Bpb3NbaV0pLAorCQkJCQltYXRyaXhfa2V5cGFkX2ludGVycnVwdCwKKwkJCQkJSVJRRl9ESVNBQkxFRCB8CisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfAorCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkJIm1hdHJpeC1rZXlwYWQiLCBrZXlwYWQpOworCQkJaWYgKGVycikgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIlVuYWJsZSB0byBhY3F1aXJlIGludGVycnVwdCAiCisJCQkJCSJmb3IgR1BJTyBsaW5lICVpXG4iLAorCQkJCQlwZGF0YS0+cm93X2dwaW9zW2ldKTsKKwkJCQlnb3RvIGVycl9mcmVlX2lycXM7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTQxOCwxMSArNDY1LDE2IEBACiAKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yb3dfZ3Bpb3M7IGkrKykgewotCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+cm93X2dwaW9zW2ldKSwga2V5cGFkKTsKLQkJZ3Bpb19mcmVlKHBkYXRhLT5yb3dfZ3Bpb3NbaV0pOworCWlmIChwZGF0YS0+Y2x1c3RlcmVkX2lycSA+IDApIHsKKwkJZnJlZV9pcnEocGRhdGEtPmNsdXN0ZXJlZF9pcnEsIGtleXBhZCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspCisJCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+cm93X2dwaW9zW2ldKSwga2V5cGFkKTsKIAl9CiAKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yb3dfZ3Bpb3M7IGkrKykKKwkJZ3Bpb19mcmVlKHBkYXRhLT5yb3dfZ3Bpb3NbaV0pOworCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fY29sX2dwaW9zOyBpKyspCiAJCWdwaW9fZnJlZShwZGF0YS0+Y29sX2dwaW9zW2ldKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tY3NfdG91Y2hrZXkuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWNzX3RvdWNoa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiODQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWNzX3RvdWNoa2V5LmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBtY3NfdG91Y2hrZXkuYyAtIFRvdWNoa2V5IGRyaXZlciBmb3IgTUVMRkFTIE1DUzUwMDAvNTA4MCBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IEhldW5nSnVuIEtpbSA8cml2ZXJmdWwua2ltQHNhbXN1bmcuY29tPgorICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9tY3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyogTUNTNTAwMCBUb3VjaGtleSAqLworI2RlZmluZSBNQ1M1MDAwX1RPVUNIS0VZX1NUQVRVUwkJMHgwNAorI2RlZmluZSBNQ1M1MDAwX1RPVUNIS0VZX1NUQVRVU19QUkVTUwk3CisjZGVmaW5lIE1DUzUwMDBfVE9VQ0hLRVlfRlcJCTB4MGEKKyNkZWZpbmUgTUNTNTAwMF9UT1VDSEtFWV9CQVNFX1ZBTAkweDYxCisKKy8qIE1DUzUwODAgVG91Y2hrZXkgKi8KKyNkZWZpbmUgTUNTNTA4MF9UT1VDSEtFWV9TVEFUVVMJCTB4MDAKKyNkZWZpbmUgTUNTNTA4MF9UT1VDSEtFWV9TVEFUVVNfUFJFU1MJMworI2RlZmluZSBNQ1M1MDgwX1RPVUNIS0VZX0ZXCQkweDAxCisjZGVmaW5lIE1DUzUwODBfVE9VQ0hLRVlfQkFTRV9WQUwJMHgxCisKK2VudW0gbWNzX3RvdWNoa2V5X3R5cGUgeworCU1DUzUwMDBfVE9VQ0hLRVksCisJTUNTNTA4MF9UT1VDSEtFWSwKK307CisKK3N0cnVjdCBtY3NfdG91Y2hrZXlfY2hpcCB7CisJdW5zaWduZWQgaW50IHN0YXR1c19yZWc7CisJdW5zaWduZWQgaW50IHByZXNzYml0OworCXVuc2lnbmVkIGludCBwcmVzc19pbnZlcnQ7CisJdW5zaWduZWQgaW50IGJhc2V2YWw7Cit9OworCitzdHJ1Y3QgbWNzX3RvdWNoa2V5X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCBtY3NfdG91Y2hrZXlfY2hpcCBjaGlwOworCXVuc2lnbmVkIGludCBrZXlfY29kZTsKKwl1bnNpZ25lZCBpbnQga2V5X3ZhbDsKKwl1bnNpZ25lZCBzaG9ydCBrZXljb2Rlc1tdOworfTsKKworc3RhdGljIGlycXJldHVybl90IG1jc190b3VjaGtleV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtY3NfdG91Y2hrZXlfZGF0YSAqZGF0YSA9IGRldl9pZDsKKwlzdHJ1Y3QgbWNzX3RvdWNoa2V5X2NoaXAgKmNoaXAgPSAmZGF0YS0+Y2hpcDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gZGF0YS0+aW5wdXRfZGV2OworCXVuc2lnbmVkIGludCBrZXlfdmFsOworCXVuc2lnbmVkIGludCBwcmVzc2VkOworCWludCB2YWw7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBjaGlwLT5zdGF0dXNfcmVnKTsKKwlpZiAodmFsIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImkyYyByZWFkIGVycm9yIFslZF1cbiIsIHZhbCk7CisJCWdvdG8gb3V0OworCX0KKworCXByZXNzZWQgPSAodmFsICYgKDEgPDwgY2hpcC0+cHJlc3NiaXQpKSA+PiBjaGlwLT5wcmVzc2JpdDsKKwlpZiAoY2hpcC0+cHJlc3NfaW52ZXJ0KQorCQlwcmVzc2VkIF49IGNoaXAtPnByZXNzX2ludmVydDsKKworCS8qIGtleV92YWwgaXMgMCB3aGVuIHJlbGVhc2VkLCBzbyB3ZSBzaG91bGQgdXNlIGtleV92YWwgb2YgcHJlc3MuICovCisJaWYgKHByZXNzZWQpIHsKKwkJa2V5X3ZhbCA9IHZhbCAmICgweGZmID4+ICg4IC0gY2hpcC0+cHJlc3NiaXQpKTsKKwkJaWYgKCFrZXlfdmFsKQorCQkJZ290byBvdXQ7CisJCWtleV92YWwgLT0gY2hpcC0+YmFzZXZhbDsKKwkJZGF0YS0+a2V5X2NvZGUgPSBkYXRhLT5rZXljb2Rlc1trZXlfdmFsXTsKKwkJZGF0YS0+a2V5X3ZhbCA9IGtleV92YWw7CisJfQorCisJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX01TQywgTVNDX1NDQU4sIGRhdGEtPmtleV92YWwpOworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGRhdGEtPmtleV9jb2RlLCBwcmVzc2VkKTsKKwlpbnB1dF9zeW5jKGlucHV0KTsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAia2V5ICVkICVkICVzXG4iLCBkYXRhLT5rZXlfdmFsLCBkYXRhLT5rZXlfY29kZSwKKwkJcHJlc3NlZCA/ICJwcmVzc2VkIiA6ICJyZWxlYXNlZCIpOworCisgb3V0OgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbWNzX3RvdWNoa2V5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgbWNzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBtY3NfdG91Y2hrZXlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJdW5zaWduZWQgaW50IGZ3X3JlZzsKKwlpbnQgZndfdmVyOworCWludCBlcnJvcjsKKwlpbnQgaTsKKworCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YSBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtY3NfdG91Y2hrZXlfZGF0YSkgKworCQkJc2l6ZW9mKGRhdGEtPmtleWNvZGVzWzBdKSAqIChwZGF0YS0+a2V5X21heHZhbCArIDEpLAorCQkJR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFkYXRhIHx8ICFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCisJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSBNQ1M1MDAwX1RPVUNIS0VZKSB7CisJCWRhdGEtPmNoaXAuc3RhdHVzX3JlZyA9IE1DUzUwMDBfVE9VQ0hLRVlfU1RBVFVTOworCQlkYXRhLT5jaGlwLnByZXNzYml0ID0gTUNTNTAwMF9UT1VDSEtFWV9TVEFUVVNfUFJFU1M7CisJCWRhdGEtPmNoaXAuYmFzZXZhbCA9IE1DUzUwMDBfVE9VQ0hLRVlfQkFTRV9WQUw7CisJCWZ3X3JlZyA9IE1DUzUwMDBfVE9VQ0hLRVlfRlc7CisJfSBlbHNlIHsKKwkJZGF0YS0+Y2hpcC5zdGF0dXNfcmVnID0gTUNTNTA4MF9UT1VDSEtFWV9TVEFUVVM7CisJCWRhdGEtPmNoaXAucHJlc3NiaXQgPSBNQ1M1MDgwX1RPVUNIS0VZX1NUQVRVU19QUkVTUzsKKwkJZGF0YS0+Y2hpcC5wcmVzc19pbnZlcnQgPSAxOworCQlkYXRhLT5jaGlwLmJhc2V2YWwgPSBNQ1M1MDgwX1RPVUNIS0VZX0JBU0VfVkFMOworCQlmd19yZWcgPSBNQ1M1MDgwX1RPVUNIS0VZX0ZXOworCX0KKworCWZ3X3ZlciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGZ3X3JlZyk7CisJaWYgKGZ3X3ZlciA8IDApIHsKKwkJZXJyb3IgPSBmd192ZXI7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjIHJlYWQgZXJyb3JbJWRdXG4iLCBlcnJvcik7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJGaXJtd2FyZSB2ZXJzaW9uOiAlZFxuIiwgZndfdmVyKTsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJNRUxQQVMgTUNTIFRvdWNoa2V5IjsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKTsKKwlpZiAoIXBkYXRhLT5ub19hdXRvcmVwZWF0KQorCQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX1JFUCk7CisJaW5wdXRfZGV2LT5rZXljb2RlID0gZGF0YS0+a2V5Y29kZXM7CisJaW5wdXRfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihkYXRhLT5rZXljb2Rlc1swXSk7CisJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gcGRhdGEtPmtleV9tYXh2YWwgKyAxOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5rZXltYXBfc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSBNQ1NfS0VZX1ZBTChwZGF0YS0+a2V5bWFwW2ldKTsKKwkJdW5zaWduZWQgaW50IGNvZGUgPSBNQ1NfS0VZX0NPREUocGRhdGEtPmtleW1hcFtpXSk7CisKKwkJZGF0YS0+a2V5Y29kZXNbdmFsXSA9IGNvZGU7CisJCV9fc2V0X2JpdChjb2RlLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJfQorCisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOKTsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIGRhdGEpOworCisJaWYgKHBkYXRhLT5jZmdfcGluKQorCQlwZGF0YS0+Y2ZnX3BpbigpOworCisJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwgbWNzX3RvdWNoa2V5X2ludGVycnVwdCwKKwkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCBjbGllbnQtPmRldi5kcml2ZXItPm5hbWUsIGRhdGEpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBkYXRhKTsKK2Vycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGRhdGEpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWNzX3RvdWNoa2V5X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtY3NfdG91Y2hrZXlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGRhdGEpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmlucHV0X2Rldik7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1jc190b3VjaGtleV9pZFtdID0geworCXsgIm1jczUwMDBfdG91Y2hrZXkiLCBNQ1M1MDAwX1RPVUNIS0VZIH0sCisJeyAibWNzNTA4MF90b3VjaGtleSIsIE1DUzUwODBfVE9VQ0hLRVkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWNzX3RvdWNoa2V5X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1jc190b3VjaGtleV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibWNzX3RvdWNoa2V5IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbWNzX3RvdWNoa2V5X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWNzX3RvdWNoa2V5X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gbWNzX3RvdWNoa2V5X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWNzX3RvdWNoa2V5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1jc190b3VjaGtleV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWNzX3RvdWNoa2V5X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWNzX3RvdWNoa2V5X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1jc190b3VjaGtleV9pbml0KTsKK21vZHVsZV9leGl0KG1jc190b3VjaGtleV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJIZXVuZ0p1biBLaW0gPHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVG91Y2hrZXkgZHJpdmVyIGZvciBNRUxGQVMgTUNTNTAwMC81MDgwIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc2Ftc3VuZy1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc2Ftc3VuZy1rZXlwYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg5ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zYW1zdW5nLWtleXBhZC5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogU2Ftc3VuZyBrZXlwYWQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqIEF1dGhvcjogRG9uZ2h3YSBMZWUgPGRoMDkubGVlQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgorCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZDT04JCQkweDAwCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZTVFNDTFIJCQkweDA0CisjZGVmaW5lIFNBTVNVTkdfS0VZSUZDT0wJCQkweDA4CisjZGVmaW5lIFNBTVNVTkdfS0VZSUZST1cJCQkweDBjCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZGQwkJCQkweDEwCisKKy8qIFNBTVNVTkdfS0VZSUZDT04gKi8KKyNkZWZpbmUgU0FNU1VOR19LRVlJRkNPTl9JTlRfRl9FTgkJKDEgPDwgMCkKKyNkZWZpbmUgU0FNU1VOR19LRVlJRkNPTl9JTlRfUl9FTgkJKDEgPDwgMSkKKyNkZWZpbmUgU0FNU1VOR19LRVlJRkNPTl9ERl9FTgkJCSgxIDw8IDIpCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZDT05fRkNfRU4JCQkoMSA8PCAzKQorI2RlZmluZSBTQU1TVU5HX0tFWUlGQ09OX1dBS0VVUEVOCQkoMSA8PCA0KQorCisvKiBTQU1TVU5HX0tFWUlGU1RTQ0xSICovCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZTVFNDTFJfUF9JTlRfTUFTSwkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU0FNU1VOR19LRVlJRlNUU0NMUl9SX0lOVF9NQVNLCQkoMHhmZiA8PCA4KQorI2RlZmluZSBTQU1TVU5HX0tFWUlGU1RTQ0xSX1JfSU5UX09GRlNFVAk4CisjZGVmaW5lIFM1UFYyMTBfS0VZSUZTVFNDTFJfUF9JTlRfTUFTSwkJKDB4M2ZmZiA8PCAwKQorI2RlZmluZSBTNVBWMjEwX0tFWUlGU1RTQ0xSX1JfSU5UX01BU0sJCSgweDNmZmYgPDwgMTYpCisjZGVmaW5lIFM1UFYyMTBfS0VZSUZTVFNDTFJfUl9JTlRfT0ZGU0VUCTE2CisKKy8qIFNBTVNVTkdfS0VZSUZDT0wgKi8KKyNkZWZpbmUgU0FNU1VOR19LRVlJRkNPTF9NQVNLCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgUzVQVjIxMF9LRVlJRkNPTEVOX01BU0sJCQkoMHhmZiA8PCA4KQorCisvKiBTQU1TVU5HX0tFWUlGUk9XICovCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZST1dfTUFTSwkJCSgweGZmIDw8IDApCisjZGVmaW5lIFM1UFYyMTBfS0VZSUZST1dfTUFTSwkJCSgweDNmZmYgPDwgMCkKKworLyogU0FNU1VOR19LRVlJRkZDICovCisjZGVmaW5lIFNBTVNVTkdfS0VZSUZGQ19NQVNLCQkJKDB4M2ZmIDw8IDApCisKK2VudW0gc2Ftc3VuZ19rZXlwYWRfdHlwZSB7CisJS0VZUEFEX1RZUEVfU0FNU1VORywKKwlLRVlQQURfVFlQRV9TNVBWMjEwLAorfTsKKworc3RydWN0IHNhbXN1bmdfa2V5cGFkIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWJvb2wgc3RvcHBlZDsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGludCByb3dfc2hpZnQ7CisJdW5zaWduZWQgaW50IHJvd3M7CisJdW5zaWduZWQgaW50IGNvbHM7CisJdW5zaWduZWQgaW50IHJvd19zdGF0ZVtTQU1TVU5HX01BWF9DT0xTXTsKKwl1bnNpZ25lZCBzaG9ydCBrZXljb2Rlc1tdOworfTsKKworc3RhdGljIGludCBzYW1zdW5nX2tleXBhZF9pc19zNXB2MjEwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJZW51bSBzYW1zdW5nX2tleXBhZF90eXBlIHR5cGUgPQorCQlwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YTsKKworCXJldHVybiB0eXBlID09IEtFWVBBRF9UWVBFX1M1UFYyMTA7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXN1bmdfa2V5cGFkX3NjYW4oc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQsCisJCQkJdW5zaWduZWQgaW50ICpyb3dfc3RhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0ga2V5cGFkLT5pbnB1dF9kZXYtPmRldi5wYXJlbnQ7CisJdW5zaWduZWQgaW50IGNvbDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJZm9yIChjb2wgPSAwOyBjb2wgPCBrZXlwYWQtPmNvbHM7IGNvbCsrKSB7CisJCWlmIChzYW1zdW5nX2tleXBhZF9pc19zNXB2MjEwKGRldikpIHsKKwkJCXZhbCA9IFM1UFYyMTBfS0VZSUZDT0xFTl9NQVNLOworCQkJdmFsICY9IH4oMSA8PCBjb2wpIDw8IDg7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBTQU1TVU5HX0tFWUlGQ09MX01BU0s7CisJCQl2YWwgJj0gfigxIDw8IGNvbCk7CisJCX0KKworCQl3cml0ZWwodmFsLCBrZXlwYWQtPmJhc2UgKyBTQU1TVU5HX0tFWUlGQ09MKTsKKwkJbWRlbGF5KDEpOworCisJCXZhbCA9IHJlYWRsKGtleXBhZC0+YmFzZSArIFNBTVNVTkdfS0VZSUZST1cpOworCQlyb3dfc3RhdGVbY29sXSA9IH52YWwgJiAoKDEgPDwga2V5cGFkLT5yb3dzKSAtIDEpOworCX0KKworCS8qIEtFWUlGQ09MIHJlZyBjbGVhciAqLworCXdyaXRlbCgwLCBrZXlwYWQtPmJhc2UgKyBTQU1TVU5HX0tFWUlGQ09MKTsKK30KKworc3RhdGljIGJvb2wgc2Ftc3VuZ19rZXlwYWRfcmVwb3J0KHN0cnVjdCBzYW1zdW5nX2tleXBhZCAqa2V5cGFkLAorCQkJCSAgdW5zaWduZWQgaW50ICpyb3dfc3RhdGUpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0ga2V5cGFkLT5pbnB1dF9kZXY7CisJdW5zaWduZWQgaW50IGNoYW5nZWQ7CisJdW5zaWduZWQgaW50IHByZXNzZWQ7CisJdW5zaWduZWQgaW50IGtleV9kb3duID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCBjb2wsIHJvdzsKKworCWZvciAoY29sID0gMDsgY29sIDwga2V5cGFkLT5jb2xzOyBjb2wrKykgeworCQljaGFuZ2VkID0gcm93X3N0YXRlW2NvbF0gXiBrZXlwYWQtPnJvd19zdGF0ZVtjb2xdOworCQlrZXlfZG93biB8PSByb3dfc3RhdGVbY29sXTsKKwkJaWYgKCFjaGFuZ2VkKQorCQkJY29udGludWU7CisKKwkJZm9yIChyb3cgPSAwOyByb3cgPCBrZXlwYWQtPnJvd3M7IHJvdysrKSB7CisJCQlpZiAoIShjaGFuZ2VkICYgKDEgPDwgcm93KSkpCisJCQkJY29udGludWU7CisKKwkJCXByZXNzZWQgPSByb3dfc3RhdGVbY29sXSAmICgxIDw8IHJvdyk7CisKKwkJCWRldl9kYmcoJmtleXBhZC0+aW5wdXRfZGV2LT5kZXYsCisJCQkJImtleSAlcywgcm93OiAlZCwgY29sOiAlZFxuIiwKKwkJCQlwcmVzc2VkID8gInByZXNzZWQiIDogInJlbGVhc2VkIiwgcm93LCBjb2wpOworCisJCQl2YWwgPSBNQVRSSVhfU0NBTl9DT0RFKHJvdywgY29sLCBrZXlwYWQtPnJvd19zaGlmdCk7CisKKwkJCWlucHV0X2V2ZW50KGlucHV0X2RldiwgRVZfTVNDLCBNU0NfU0NBTiwgdmFsKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfZGV2LAorCQkJCQlrZXlwYWQtPmtleWNvZGVzW3ZhbF0sIHByZXNzZWQpOworCQl9CisJCWlucHV0X3N5bmMoa2V5cGFkLT5pbnB1dF9kZXYpOworCX0KKworCW1lbWNweShrZXlwYWQtPnJvd19zdGF0ZSwgcm93X3N0YXRlLCBzaXplb2Yoa2V5cGFkLT5yb3dfc3RhdGUpKTsKKworCXJldHVybiBrZXlfZG93bjsKK30KKworc3RhdGljIGlycXJldHVybl90IHNhbXN1bmdfa2V5cGFkX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQgPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IHJvd19zdGF0ZVtTQU1TVU5HX01BWF9DT0xTXTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWJvb2wga2V5X2Rvd247CisKKwlkbyB7CisJCXZhbCA9IHJlYWRsKGtleXBhZC0+YmFzZSArIFNBTVNVTkdfS0VZSUZTVFNDTFIpOworCQkvKiBDbGVhciBpbnRlcnJ1cHQuICovCisJCXdyaXRlbCh+MHgwLCBrZXlwYWQtPmJhc2UgKyBTQU1TVU5HX0tFWUlGU1RTQ0xSKTsKKworCQlzYW1zdW5nX2tleXBhZF9zY2FuKGtleXBhZCwgcm93X3N0YXRlKTsKKworCQlrZXlfZG93biA9IHNhbXN1bmdfa2V5cGFkX3JlcG9ydChrZXlwYWQsIHJvd19zdGF0ZSk7CisJCWlmIChrZXlfZG93bikKKwkJCXdhaXRfZXZlbnRfdGltZW91dChrZXlwYWQtPndhaXQsIGtleXBhZC0+c3RvcHBlZCwKKwkJCQkJICAgbXNlY3NfdG9famlmZmllcyg1MCkpOworCisJfSB3aGlsZSAoa2V5X2Rvd24gJiYgIWtleXBhZC0+c3RvcHBlZCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXN1bmdfa2V5cGFkX3N0YXJ0KHN0cnVjdCBzYW1zdW5nX2tleXBhZCAqa2V5cGFkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBUZWxsIElSUSB0aHJlYWQgdGhhdCBpdCBtYXkgcG9sbCB0aGUgZGV2aWNlLiAqLworCWtleXBhZC0+c3RvcHBlZCA9IGZhbHNlOworCisJY2xrX2VuYWJsZShrZXlwYWQtPmNsayk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0IGJpdHMuICovCisJdmFsID0gcmVhZGwoa2V5cGFkLT5iYXNlICsgU0FNU1VOR19LRVlJRkNPTik7CisJdmFsIHw9IFNBTVNVTkdfS0VZSUZDT05fSU5UX0ZfRU4gfCBTQU1TVU5HX0tFWUlGQ09OX0lOVF9SX0VOOworCXdyaXRlbCh2YWwsIGtleXBhZC0+YmFzZSArIFNBTVNVTkdfS0VZSUZDT04pOworCisJLyogS0VZSUZDT0wgcmVnIGNsZWFyLiAqLworCXdyaXRlbCgwLCBrZXlwYWQtPmJhc2UgKyBTQU1TVU5HX0tFWUlGQ09MKTsKK30KKworc3RhdGljIHZvaWQgc2Ftc3VuZ19rZXlwYWRfc3RvcChzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWQgKmtleXBhZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJLyogU2lnbmFsIElSUSB0aHJlYWQgdG8gc3RvcCBwb2xsaW5nIGFuZCBkaXNhYmxlIHRoZSBoYW5kbGVyLiAqLworCWtleXBhZC0+c3RvcHBlZCA9IHRydWU7CisJd2FrZV91cCgma2V5cGFkLT53YWl0KTsKKwlkaXNhYmxlX2lycShrZXlwYWQtPmlycSk7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQuICovCisJd3JpdGVsKH4weDAsIGtleXBhZC0+YmFzZSArIFNBTVNVTkdfS0VZSUZTVFNDTFIpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgYml0cy4gKi8KKwl2YWwgPSByZWFkbChrZXlwYWQtPmJhc2UgKyBTQU1TVU5HX0tFWUlGQ09OKTsKKwl2YWwgJj0gfihTQU1TVU5HX0tFWUlGQ09OX0lOVF9GX0VOIHwgU0FNU1VOR19LRVlJRkNPTl9JTlRfUl9FTik7CisJd3JpdGVsKHZhbCwga2V5cGFkLT5iYXNlICsgU0FNU1VOR19LRVlJRkNPTik7CisKKwljbGtfZGlzYWJsZShrZXlwYWQtPmNsayk7CisKKwkvKgorCSAqIE5vdyB0aGF0IGNoaXAgc2hvdWxkIG5vdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIHdlIGNhbiBzYWZlbHkKKwkgKiByZS1lbmFibGUgdGhlIGhhbmRsZXIuCisJICovCisJZW5hYmxlX2lycShrZXlwYWQtPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19rZXlwYWRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCit7CisJc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCisJc2Ftc3VuZ19rZXlwYWRfc3RhcnQoa2V5cGFkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYW1zdW5nX2tleXBhZF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCit7CisJc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCisJc2Ftc3VuZ19rZXlwYWRfc3RvcChrZXlwYWQpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYW1zdW5nX2tleXBhZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSAqcGRhdGE7CisJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSAqa2V5bWFwX2RhdGE7CisJc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXVuc2lnbmVkIGludCByb3dfc2hpZnQ7CisJdW5zaWduZWQgaW50IGtleW1hcF9zaXplOworCWludCBlcnJvcjsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZXltYXBfZGF0YSA9IHBkYXRhLT5rZXltYXBfZGF0YTsKKwlpZiAoIWtleW1hcF9kYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGtleW1hcCBkYXRhIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBkYXRhLT5yb3dzIHx8IHBkYXRhLT5yb3dzID4gU0FNU1VOR19NQVhfUk9XUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXBkYXRhLT5jb2xzIHx8IHBkYXRhLT5jb2xzID4gU0FNU1VOR19NQVhfQ09MUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpbml0aWFsaXplIHRoZSBncGlvICovCisJaWYgKHBkYXRhLT5jZmdfZ3BpbykKKwkJcGRhdGEtPmNmZ19ncGlvKHBkYXRhLT5yb3dzLCBwZGF0YS0+Y29scyk7CisKKwlyb3dfc2hpZnQgPSBnZXRfY291bnRfb3JkZXIocGRhdGEtPmNvbHMpOworCWtleW1hcF9zaXplID0gKHBkYXRhLT5yb3dzIDw8IHJvd19zaGlmdCkgKiBzaXplb2Yoa2V5cGFkLT5rZXljb2Rlc1swXSk7CisKKwlrZXlwYWQgPSBremFsbG9jKHNpemVvZigqa2V5cGFkKSArIGtleW1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWtleXBhZCB8fCAhaW5wdXRfZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWtleXBhZC0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWtleXBhZC0+YmFzZSkgeworCQllcnJvciA9IC1FQlVTWTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJa2V5cGFkLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJrZXlwYWQiKTsKKwlpZiAoSVNfRVJSKGtleXBhZC0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGtleXBhZCBjbGtcbiIpOworCQllcnJvciA9IFBUUl9FUlIoa2V5cGFkLT5jbGspOworCQlnb3RvIGVycl91bm1hcF9iYXNlOworCX0KKworCWtleXBhZC0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCWtleXBhZC0+cm93X3NoaWZ0ID0gcm93X3NoaWZ0OworCWtleXBhZC0+cm93cyA9IHBkYXRhLT5yb3dzOworCWtleXBhZC0+Y29scyA9IHBkYXRhLT5jb2xzOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtleXBhZC0+d2FpdCk7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSBwZGV2LT5uYW1lOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBrZXlwYWQpOworCisJaW5wdXRfZGV2LT5vcGVuID0gc2Ftc3VuZ19rZXlwYWRfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gc2Ftc3VuZ19rZXlwYWRfY2xvc2U7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKTsKKwlpZiAoIXBkYXRhLT5ub19hdXRvcmVwZWF0KQorCQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX1JFUCk7CisKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4pOworCisJaW5wdXRfZGV2LT5rZXljb2RlID0ga2V5cGFkLT5rZXljb2RlczsKKwlpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKGtleXBhZC0+a2V5Y29kZXNbMF0pOworCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IHBkYXRhLT5yb3dzIDw8IHJvd19zaGlmdDsKKworCW1hdHJpeF9rZXlwYWRfYnVpbGRfa2V5bWFwKGtleW1hcF9kYXRhLCByb3dfc2hpZnQsCisJCQlpbnB1dF9kZXYtPmtleWNvZGUsIGlucHV0X2Rldi0+a2V5Yml0KTsKKworCWtleXBhZC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoa2V5cGFkLT5pcnEgPCAwKSB7CisJCWVycm9yID0ga2V5cGFkLT5pcnE7CisJCWdvdG8gZXJyX3B1dF9jbGs7CisJfQorCisJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShrZXlwYWQtPmlycSwgTlVMTCwgc2Ftc3VuZ19rZXlwYWRfaXJxLAorCQkJSVJRRl9PTkVTSE9ULCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwga2V5cGFkKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGtleXBhZCBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGVycl9wdXRfY2xrOworCX0KKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGtleXBhZC0+aW5wdXRfZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIHBkYXRhLT53YWtldXApOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGtleXBhZCk7CisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShrZXlwYWQtPmlycSwga2V5cGFkKTsKK2Vycl9wdXRfY2xrOgorCWNsa19wdXQoa2V5cGFkLT5jbGspOworZXJyX3VubWFwX2Jhc2U6CisJaW91bm1hcChrZXlwYWQtPmJhc2UpOworZXJyX2ZyZWVfbWVtOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoa2V5cGFkKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2Ftc3VuZ19rZXlwYWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtleXBhZC0+aW5wdXRfZGV2KTsKKworCS8qCisJICogSXQgaXMgc2FmZSB0byBmcmVlIElSUSBhZnRlciB1bnJlZ2lzdGVyaW5nIGRldmljZSBiZWNhdXNlCisJICogc2Ftc3VuZ19rZXlwYWRfY2xvc2Ugd2lsbCBzaHV0IG9mZiBpbnRlcnJ1cHRzLgorCSAqLworCWZyZWVfaXJxKGtleXBhZC0+aXJxLCBrZXlwYWQpOworCisJY2xrX3B1dChrZXlwYWQtPmNsayk7CisKKwlpb3VubWFwKGtleXBhZC0+YmFzZSk7CisJa2ZyZWUoa2V5cGFkKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBzYW1zdW5nX2tleXBhZF90b2dnbGVfd2FrZXVwKHN0cnVjdCBzYW1zdW5nX2tleXBhZCAqa2V5cGFkLAorCQkJCQkgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0ga2V5cGFkLT5pbnB1dF9kZXYtPmRldi5wYXJlbnQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWNsa19lbmFibGUoa2V5cGFkLT5jbGspOworCisJdmFsID0gcmVhZGwoa2V5cGFkLT5iYXNlICsgU0FNU1VOR19LRVlJRkNPTik7CisJaWYgKGVuYWJsZSkgeworCQl2YWwgfD0gU0FNU1VOR19LRVlJRkNPTl9XQUtFVVBFTjsKKwkJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCQllbmFibGVfaXJxX3dha2Uoa2V5cGFkLT5pcnEpOworCX0gZWxzZSB7CisJCXZhbCAmPSB+U0FNU1VOR19LRVlJRkNPTl9XQUtFVVBFTjsKKwkJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCQlkaXNhYmxlX2lycV93YWtlKGtleXBhZC0+aXJxKTsKKwl9CisJd3JpdGVsKHZhbCwga2V5cGFkLT5iYXNlICsgU0FNU1VOR19LRVlJRkNPTik7CisKKwljbGtfZGlzYWJsZShrZXlwYWQtPmNsayk7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19rZXlwYWRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzYW1zdW5nX2tleXBhZCAqa2V5cGFkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0ga2V5cGFkLT5pbnB1dF9kZXY7CisKKwltdXRleF9sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCWlmIChpbnB1dF9kZXYtPnVzZXJzKQorCQlzYW1zdW5nX2tleXBhZF9zdG9wKGtleXBhZCk7CisKKwlzYW1zdW5nX2tleXBhZF90b2dnbGVfd2FrZXVwKGtleXBhZCwgdHJ1ZSk7CisKKwltdXRleF91bmxvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19rZXlwYWRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHNhbXN1bmdfa2V5cGFkICprZXlwYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBrZXlwYWQtPmlucHV0X2RldjsKKworCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJc2Ftc3VuZ19rZXlwYWRfdG9nZ2xlX3dha2V1cChrZXlwYWQsIGZhbHNlKTsKKworCWlmIChpbnB1dF9kZXYtPnVzZXJzKQorCQlzYW1zdW5nX2tleXBhZF9zdGFydChrZXlwYWQpOworCisJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc2Ftc3VuZ19rZXlwYWRfcG1fb3BzID0geworCS5zdXNwZW5kCT0gc2Ftc3VuZ19rZXlwYWRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNhbXN1bmdfa2V5cGFkX3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgc2Ftc3VuZ19rZXlwYWRfZHJpdmVyX2lkc1tdID0geworCXsKKwkJLm5hbWUJCT0gInNhbXN1bmcta2V5cGFkIiwKKwkJLmRyaXZlcl9kYXRhCT0gS0VZUEFEX1RZUEVfU0FNU1VORywKKwl9LCB7CisJCS5uYW1lCQk9ICJzNXB2MjEwLWtleXBhZCIsCisJCS5kcml2ZXJfZGF0YQk9IEtFWVBBRF9UWVBFX1M1UFYyMTAsCisJfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgc2Ftc3VuZ19rZXlwYWRfZHJpdmVyX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfa2V5cGFkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc2Ftc3VuZ19rZXlwYWRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzYW1zdW5nX2tleXBhZF9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzYW1zdW5nLWtleXBhZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmc2Ftc3VuZ19rZXlwYWRfcG1fb3BzLAorI2VuZGlmCisJfSwKKwkuaWRfdGFibGUJPSBzYW1zdW5nX2tleXBhZF9kcml2ZXJfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2Ftc3VuZ19rZXlwYWRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNhbXN1bmdfa2V5cGFkX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzYW1zdW5nX2tleXBhZF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNhbXN1bmdfa2V5cGFkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2Ftc3VuZ19rZXlwYWRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNhbXN1bmdfa2V5cGFkX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcga2V5cGFkIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiRG9uZ2h3YSBMZWUgPGRoMDkubGVlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzYW1zdW5nLWtleXBhZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZwppbmRleCBjNDRiOWVhLi5iNDllMjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZwpAQCAtMzI3LDYgKzMyNywxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNmODU3NF9rZXlwYWQuCiAKK2NvbmZpZyBJTlBVVF9QV01fQkVFUEVSCisJdHJpc3RhdGUgIlBXTSBiZWVwZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhBVkVfUFdNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBnZXQgc3VwcG9ydCBmb3IgUFdNIGJhc2VkIGJlZXBlciBkZXZpY2VzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBwd20tYmVlcGVyLgorCiBjb25maWcgSU5QVVRfR1BJT19ST1RBUllfRU5DT0RFUgogCXRyaXN0YXRlICJSb3RhcnkgZW5jb2RlcnMgY29ubmVjdGVkIHRvIEdQSU8gcGlucyIKIAlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgR0VORVJJQ19HUElPCkBAIC0zOTAsNCArNDAxLDQxIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwY2FwX2tleXMuCiAKK2NvbmZpZyBJTlBVVF9BRFhMMzRYCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEWEwzNHggVGhyZWUtQXhpcyBEaWdpdGFsIEFjY2VsZXJvbWV0ZXIiCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIEFjY2VsZXJvbWV0ZXIgaW50ZXJmYWNlIHVzaW5nIHRoZQorCSAgQURYTDM0NS82IGNvbnRyb2xsZXIsIGFuZCB5b3VyIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisJICBjb2RlIGluY2x1ZGVzIHRoYXQgaW4gaXRzIHRhYmxlIG9mIGRldmljZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiB1c2UgZWl0aGVyIEkyQyBvciBTUEkgY29tbXVuaWNhdGlvbiB0byB0aGUKKwkgIEFEWEwzNDUvNiBjb250cm9sbGVyLiAgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgZm9yCisJICB5b3VyIHN5c3RlbS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTiAoYnV0IGl0J3Mgc2FmZSB0byBzYXkgIlkiKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWR4bDM0eC4KKworY29uZmlnIElOUFVUX0FEWEwzNFhfSTJDCisJdHJpc3RhdGUgInN1cHBvcnQgSTJDIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gSU5QVVRfQURYTDM0WCAmJiBJMkMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEFEWEwzNDUvNiBob29rZWQgdG8gYW4gSTJDIGJ1cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWR4bDM0eC1pMmMuCisKK2NvbmZpZyBJTlBVVF9BRFhMMzRYX1NQSQorCXRyaXN0YXRlICJzdXBwb3J0IFNQSSBidXMgY29ubmVjdGlvbiIKKwlkZXBlbmRzIG9uIElOUFVUX0FEWEwzNFggJiYgU1BJCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBBRFhMMzQ1LzYgaG9va2VkIHRvIGEgU1BJIGJ1cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWR4bDM0eC1zcGkuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKaW5kZXggNzFmZTU3ZC4uMTljY2NhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQpAQCAtOCw2ICs4LDkgQEAKIG9iai0kKENPTkZJR19JTlBVVF9BRDcxNFgpCQkrPSBhZDcxNHgubwogb2JqLSQoQ09ORklHX0lOUFVUX0FENzE0WF9JMkMpCQkrPSBhZDcxNHgtaTJjLm8KIG9iai0kKENPTkZJR19JTlBVVF9BRDcxNFhfU1BJKQkJKz0gYWQ3MTR4LXNwaS5vCitvYmotJChDT05GSUdfSU5QVVRfQURYTDM0WCkJCSs9IGFkeGwzNHgubworb2JqLSQoQ09ORklHX0lOUFVUX0FEWEwzNFhfSTJDKQkJKz0gYWR4bDM0eC1pMmMubworb2JqLSQoQ09ORklHX0lOUFVUX0FEWEwzNFhfU1BJKQkJKz0gYWR4bDM0eC1zcGkubwogb2JqLSQoQ09ORklHX0lOUFVUX0FQQU5FTCkJCSs9IGFwYW5lbC5vCiBvYmotJChDT05GSUdfSU5QVVRfQVRJX1JFTU9URSkJCSs9IGF0aV9yZW1vdGUubwogb2JqLSQoQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyKQkJKz0gYXRpX3JlbW90ZTIubwpAQCAtMjYsNiArMjksNyBAQAogb2JqLSQoQ09ORklHX0lOUFVUX1BDRjg1NzQpCQkrPSBwY2Y4NTc0X2tleXBhZC5vCiBvYmotJChDT05GSUdfSU5QVVRfUENTUEtSKQkJKz0gcGNzcGtyLm8KIG9iai0kKENPTkZJR19JTlBVVF9QT1dFUk1BVEUpCQkrPSBwb3dlcm1hdGUubworb2JqLSQoQ09ORklHX0lOUFVUX1BXTV9CRUVQRVIpCQkrPSBwd20tYmVlcGVyLm8KIG9iai0kKENPTkZJR19JTlBVVF9SQjUzMl9CVVRUT04pCSs9IHJiNTMyX2J1dHRvbi5vCiBvYmotJChDT05GSUdfSU5QVVRfR1BJT19ST1RBUllfRU5DT0RFUikJKz0gcm90YXJ5X2VuY29kZXIubwogb2JqLSQoQ09ORklHX0lOUFVUX1NHSV9CVE5TKQkJKz0gc2dpX2J0bnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2FkNzE0eC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkNzE0eC5jCmluZGV4IDBmZTI3YmEuLmM0MzFkMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHguYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LmMKQEAgLTExMTgsNyArMTExOCw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9mcmVlX21lbTsKIAotCS8qIGluaXRpbGl6ZSBhbmQgcmVxdWVzdCBzdy9odyByZXNvdXJjZXMgKi8KKwkvKiBpbml0aWFsaXplIGFuZCByZXF1ZXN0IHN3L2h3IHJlc291cmNlcyAqLwogCiAJYWQ3MTR4X2h3X2luaXQoYWQ3MTR4KTsKIAltdXRleF9pbml0KCZhZDcxNHgtPm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LWkyYy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHgtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3OTcyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LWkyYy5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQURMWDM0NS8zNDYgVGhyZWUtQXhpcyBEaWdpdGFsIEFjY2VsZXJvbWV0ZXJzIChJMkMgSW50ZXJmYWNlKQorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgkvKiBCVVNfSTJDICovCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJhZHhsMzR4LmgiCisKK3N0YXRpYyBpbnQgYWR4bDM0eF9zbWJ1c19yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciByZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworfQorCitzdGF0aWMgaW50IGFkeGwzNHhfc21idXNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYWR4bDM0eF9zbWJ1c19yZWFkX2Jsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgY2hhciByZWcsIGludCBjb3VudCwKKwkJCQkgICAgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCByZWcsIGNvdW50LCBidWYpOworfQorCitzdGF0aWMgaW50IGFkeGwzNHhfaTJjX3JlYWRfYmxvY2soc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgdW5zaWduZWQgY2hhciByZWcsIGludCBjb3VudCwKKwkJCQkgIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAmcmVnLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgY291bnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCAhPSBjb3VudCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZHhsMzR4X2J1c19vcHMgYWR4bDM0eF9zbWJ1c19ib3BzID0geworCS5idXN0eXBlCT0gQlVTX0kyQywKKwkud3JpdGUJCT0gYWR4bDM0eF9zbWJ1c193cml0ZSwKKwkucmVhZAkJPSBhZHhsMzR4X3NtYnVzX3JlYWQsCisJLnJlYWRfYmxvY2sJPSBhZHhsMzR4X3NtYnVzX3JlYWRfYmxvY2ssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkeGwzNHhfYnVzX29wcyBhZHhsMzR4X2kyY19ib3BzID0geworCS5idXN0eXBlCT0gQlVTX0kyQywKKwkud3JpdGUJCT0gYWR4bDM0eF9zbWJ1c193cml0ZSwKKwkucmVhZAkJPSBhZHhsMzR4X3NtYnVzX3JlYWQsCisJLnJlYWRfYmxvY2sJPSBhZHhsMzR4X2kyY19yZWFkX2Jsb2NrLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWR4bDM0eF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZHhsMzR4ICphYzsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSk7CisJaWYgKCFlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlNNQlVTIEJ5dGUgRGF0YSBub3QgU3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYWMgPSBhZHhsMzR4X3Byb2JlKCZjbGllbnQtPmRldiwgY2xpZW50LT5pcnEsIGZhbHNlLAorCQkJICAgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCQkJICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spID8KKwkJCQkmYWR4bDM0eF9zbWJ1c19ib3BzIDogJmFkeGwzNHhfaTJjX2JvcHMpOworCWlmIChJU19FUlIoYWMpKQorCQlyZXR1cm4gUFRSX0VSUihhYyk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWR4bDM0eF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZXR1cm4gYWR4bDM0eF9yZW1vdmUoYWMpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFkeGwzNHhfaTJjX3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlhZHhsMzR4X3N1c3BlbmQoYWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR4bDM0eF9pMmNfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlhZHhsMzR4X3Jlc3VtZShhYyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjIGRlZmluZSBhZHhsMzR4X2kyY19zdXNwZW5kIE5VTEwKKyMgZGVmaW5lIGFkeGwzNHhfaTJjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHhsMzR4X2lkW10gPSB7CisJeyAiYWR4bDM0eCIsIDAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHhsMzR4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkeGwzNHhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkeGwzNHgiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSAgICA9IGFkeGwzNHhfaTJjX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGFkeGwzNHhfaTJjX3JlbW92ZSksCisJLnN1c3BlbmQgID0gYWR4bDM0eF9pMmNfc3VzcGVuZCwKKwkucmVzdW1lICAgPSBhZHhsMzR4X2kyY19yZXN1bWUsCisJLmlkX3RhYmxlID0gYWR4bDM0eF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkeGwzNHhfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkeGwzNHhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkeGwzNHhfaTJjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWR4bDM0eF9pMmNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHhsMzR4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHhsMzR4X2kyY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURYTDM0NS8zNDYgVGhyZWUtQXhpcyBEaWdpdGFsIEFjY2VsZXJvbWV0ZXIgSTJDIEJ1cyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LXNwaS5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHgtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyZGU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LXNwaS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQURMWDM0NS8zNDYgVGhyZWUtQXhpcyBEaWdpdGFsIEFjY2VsZXJvbWV0ZXJzIChTUEkgSW50ZXJmYWNlKQorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgkvKiBCVVNfU1BJICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiYWR4bDM0eC5oIgorCisjZGVmaW5lIE1BWF9TUElfRlJFUV9IWgkJNTAwMDAwMAorI2RlZmluZSBNQVhfRlJFUV9OT19GSUZPREVMQVkJMTUwMDAwMAorI2RlZmluZSBBRFhMMzRYX0NNRF9NVUxUQgkoMSA8PCA2KQorI2RlZmluZSBBRFhMMzRYX0NNRF9SRUFECSgxIDw8IDcpCisjZGVmaW5lIEFEWEwzNFhfV1JJVEVDTUQocmVnKQkocmVnICYgMHgzRikKKyNkZWZpbmUgQURYTDM0WF9SRUFEQ01EKHJlZykJKEFEWEwzNFhfQ01EX1JFQUQgfCAocmVnICYgMHgzRikpCisjZGVmaW5lIEFEWEwzNFhfUkVBRE1CX0NNRChyZWcpIChBRFhMMzRYX0NNRF9SRUFEIHwgQURYTDM0WF9DTURfTVVMVEIgXAorCQkJCQl8IChyZWcgJiAweDNGKSkKKworc3RhdGljIGludCBhZHhsMzR4X3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciByZWcpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGNtZDsKKworCWNtZCA9IEFEWEwzNFhfUkVBRENNRChyZWcpOworCisJcmV0dXJuIHNwaV93OHI4KHNwaSwgY21kKTsKK30KKworc3RhdGljIGludCBhZHhsMzR4X3NwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCisJYnVmWzBdID0gQURYTDM0WF9XUklURUNNRChyZWcpOworCWJ1ZlsxXSA9IHZhbDsKKworCXJldHVybiBzcGlfd3JpdGUoc3BpLCBidWYsIHNpemVvZihidWYpKTsKK30KKworc3RhdGljIGludCBhZHhsMzR4X3NwaV9yZWFkX2Jsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgcmVnLCBpbnQgY291bnQsCisJCQkJICB2b2lkICpidWYpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzc2l6ZV90IHN0YXR1czsKKworCXJlZyA9IEFEWEwzNFhfUkVBRE1CX0NNRChyZWcpOworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmcmVnLCAxLCBidWYsIGNvdW50KTsKKworCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkeGwzNHhfYnVzX29wcyBhZHgxMzR4X3NwaV9ib3BzID0geworCS5idXN0eXBlCT0gQlVTX1NQSSwKKwkud3JpdGUJCT0gYWR4bDM0eF9zcGlfd3JpdGUsCisJLnJlYWQJCT0gYWR4bDM0eF9zcGlfcmVhZCwKKwkucmVhZF9ibG9jawk9IGFkeGwzNHhfc3BpX3JlYWRfYmxvY2ssCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHhsMzR4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZHhsMzR4ICphYzsKKworCS8qIGRvbid0IGV4Y2VlZCBtYXggc3BlY2lmaWVkIFNQSSBDTEsgZnJlcXVlbmN5ICovCisJaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID4gTUFYX1NQSV9GUkVRX0haKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiU1BJIENMSyAlZCBIeiB0b28gZmFzdFxuIiwgc3BpLT5tYXhfc3BlZWRfaHopOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhYyA9IGFkeGwzNHhfcHJvYmUoJnNwaS0+ZGV2LCBzcGktPmlycSwKKwkJCSAgIHNwaS0+bWF4X3NwZWVkX2h6ID4gTUFYX0ZSRVFfTk9fRklGT0RFTEFZLAorCQkJICAgJmFkeDEzNHhfc3BpX2JvcHMpOworCisJaWYgKElTX0VSUihhYykpCisJCXJldHVybiBQVFJfRVJSKGFjKTsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGFjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHhsMzR4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCXJldHVybiBhZHhsMzR4X3JlbW92ZShhYyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWR4bDM0eF9zcGlfc3VzcGVuZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWFkeGwzNHhfc3VzcGVuZChhYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHhsMzR4X3NwaV9yZXN1bWUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWFkeGwzNHhfcmVzdW1lKGFjKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyMgZGVmaW5lIGFkeGwzNHhfc3BpX3N1c3BlbmQgTlVMTAorIyBkZWZpbmUgYWR4bDM0eF9zcGlfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkeGwzNHhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkeGwzNHgiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgICA9IGFkeGwzNHhfc3BpX3Byb2JlLAorCS5yZW1vdmUgID0gX19kZXZleGl0X3AoYWR4bDM0eF9zcGlfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkeGwzNHhfc3BpX3N1c3BlbmQsCisJLnJlc3VtZSAgPSBhZHhsMzR4X3NwaV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZHhsMzR4X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkeGwzNHhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkeGwzNHhfc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWR4bDM0eF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWR4bDM0eF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWR4bDM0eF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFEWEwzNDUvMzQ2IFRocmVlLUF4aXMgRGlnaXRhbCBBY2NlbGVyb21ldGVyIFNQSSBCdXMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYWR4bDM0eC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNhMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYwpAQCAtMCwwICsxLDkxNSBAQAorLyoKKyAqIEFEWEwzNDUvMzQ2IFRocmVlLUF4aXMgRGlnaXRhbCBBY2NlbGVyb21ldGVycworICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9hZHhsMzR4Lmg+CisKKyNpbmNsdWRlICJhZHhsMzR4LmgiCisKKy8qIEFEWEwzNDUvNiBSZWdpc3RlciBNYXAgKi8KKyNkZWZpbmUgREVWSUQJCTB4MDAJLyogUiAgIERldmljZSBJRCAqLworI2RlZmluZSBUSFJFU0hfVEFQCTB4MUQJLyogUi9XIFRhcCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgT0ZTWAkJMHgxRQkvKiBSL1cgWC1heGlzIG9mZnNldCAqLworI2RlZmluZSBPRlNZCQkweDFGCS8qIFIvVyBZLWF4aXMgb2Zmc2V0ICovCisjZGVmaW5lIE9GU1oJCTB4MjAJLyogUi9XIFotYXhpcyBvZmZzZXQgKi8KKyNkZWZpbmUgRFVSCQkweDIxCS8qIFIvVyBUYXAgZHVyYXRpb24gKi8KKyNkZWZpbmUgTEFURU5UCQkweDIyCS8qIFIvVyBUYXAgbGF0ZW5jeSAqLworI2RlZmluZSBXSU5ET1cJCTB4MjMJLyogUi9XIFRhcCB3aW5kb3cgKi8KKyNkZWZpbmUgVEhSRVNIX0FDVAkweDI0CS8qIFIvVyBBY3Rpdml0eSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgVEhSRVNIX0lOQUNUCTB4MjUJLyogUi9XIEluYWN0aXZpdHkgdGhyZXNob2xkICovCisjZGVmaW5lIFRJTUVfSU5BQ1QJMHgyNgkvKiBSL1cgSW5hY3Rpdml0eSB0aW1lICovCisjZGVmaW5lIEFDVF9JTkFDVF9DVEwJMHgyNwkvKiBSL1cgQXhpcyBlbmFibGUgY29udHJvbCBmb3IgYWN0aXZpdHkgYW5kICovCisJCQkJLyogaW5hY3Rpdml0eSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgVEhSRVNIX0ZGCTB4MjgJLyogUi9XIEZyZWUtZmFsbCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgVElNRV9GRgkJMHgyOQkvKiBSL1cgRnJlZS1mYWxsIHRpbWUgKi8KKyNkZWZpbmUgVEFQX0FYRVMJMHgyQQkvKiBSL1cgQXhpcyBjb250cm9sIGZvciB0YXAvZG91YmxlIHRhcCAqLworI2RlZmluZSBBQ1RfVEFQX1NUQVRVUwkweDJCCS8qIFIgICBTb3VyY2Ugb2YgdGFwL2RvdWJsZSB0YXAgKi8KKyNkZWZpbmUgQldfUkFURQkJMHgyQwkvKiBSL1cgRGF0YSByYXRlIGFuZCBwb3dlciBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9XRVJfQ1RMCTB4MkQJLyogUi9XIFBvd2VyIHNhdmluZyBmZWF0dXJlcyBjb250cm9sICovCisjZGVmaW5lIElOVF9FTkFCTEUJMHgyRQkvKiBSL1cgSW50ZXJydXB0IGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIElOVF9NQVAJCTB4MkYJLyogUi9XIEludGVycnVwdCBtYXBwaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgSU5UX1NPVVJDRQkweDMwCS8qIFIgICBTb3VyY2Ugb2YgaW50ZXJydXB0cyAqLworI2RlZmluZSBEQVRBX0ZPUk1BVAkweDMxCS8qIFIvVyBEYXRhIGZvcm1hdCBjb250cm9sICovCisjZGVmaW5lIERBVEFYMAkJMHgzMgkvKiBSICAgWC1BeGlzIERhdGEgMCAqLworI2RlZmluZSBEQVRBWDEJCTB4MzMJLyogUiAgIFgtQXhpcyBEYXRhIDEgKi8KKyNkZWZpbmUgREFUQVkwCQkweDM0CS8qIFIgICBZLUF4aXMgRGF0YSAwICovCisjZGVmaW5lIERBVEFZMQkJMHgzNQkvKiBSICAgWS1BeGlzIERhdGEgMSAqLworI2RlZmluZSBEQVRBWjAJCTB4MzYJLyogUiAgIFotQXhpcyBEYXRhIDAgKi8KKyNkZWZpbmUgREFUQVoxCQkweDM3CS8qIFIgICBaLUF4aXMgRGF0YSAxICovCisjZGVmaW5lIEZJRk9fQ1RMCTB4MzgJLyogUi9XIEZJRk8gY29udHJvbCAqLworI2RlZmluZSBGSUZPX1NUQVRVUwkweDM5CS8qIFIgICBGSUZPIHN0YXR1cyAqLworI2RlZmluZSBUQVBfU0lHTgkweDNBCS8qIFIgICBTaWduIGFuZCBzb3VyY2UgZm9yIHRhcC9kb3VibGUgdGFwICovCisvKiBPcmllbnRhdGlvbiBBRFhMMzQ2IG9ubHkgKi8KKyNkZWZpbmUgT1JJRU5UX0NPTkYJMHgzQgkvKiBSL1cgT3JpZW50YXRpb24gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPUklFTlQJCTB4M0MJLyogUiAgIE9yaWVudGF0aW9uIHN0YXR1cyAqLworCisvKiBERVZJRHMgKi8KKyNkZWZpbmUgSURfQURYTDM0NQkweEU1CisjZGVmaW5lIElEX0FEWEwzNDYJMHhFNgorCisvKiBJTlRfRU5BQkxFL0lOVF9NQVAvSU5UX1NPVVJDRSBCaXRzICovCisjZGVmaW5lIERBVEFfUkVBRFkJKDEgPDwgNykKKyNkZWZpbmUgU0lOR0xFX1RBUAkoMSA8PCA2KQorI2RlZmluZSBET1VCTEVfVEFQCSgxIDw8IDUpCisjZGVmaW5lIEFDVElWSVRZCSgxIDw8IDQpCisjZGVmaW5lIElOQUNUSVZJVFkJKDEgPDwgMykKKyNkZWZpbmUgRlJFRV9GQUxMCSgxIDw8IDIpCisjZGVmaW5lIFdBVEVSTUFSSwkoMSA8PCAxKQorI2RlZmluZSBPVkVSUlVOCQkoMSA8PCAwKQorCisvKiBBQ1RfSU5BQ1RfQ09OVFJPTCBCaXRzICovCisjZGVmaW5lIEFDVF9BQ0RDCSgxIDw8IDcpCisjZGVmaW5lIEFDVF9YX0VOCSgxIDw8IDYpCisjZGVmaW5lIEFDVF9ZX0VOCSgxIDw8IDUpCisjZGVmaW5lIEFDVF9aX0VOCSgxIDw8IDQpCisjZGVmaW5lIElOQUNUX0FDREMJKDEgPDwgMykKKyNkZWZpbmUgSU5BQ1RfWF9FTgkoMSA8PCAyKQorI2RlZmluZSBJTkFDVF9ZX0VOCSgxIDw8IDEpCisjZGVmaW5lIElOQUNUX1pfRU4JKDEgPDwgMCkKKworLyogVEFQX0FYRVMgQml0cyAqLworI2RlZmluZSBTVVBQUkVTUwkoMSA8PCAzKQorI2RlZmluZSBUQVBfWF9FTgkoMSA8PCAyKQorI2RlZmluZSBUQVBfWV9FTgkoMSA8PCAxKQorI2RlZmluZSBUQVBfWl9FTgkoMSA8PCAwKQorCisvKiBBQ1RfVEFQX1NUQVRVUyBCaXRzICovCisjZGVmaW5lIEFDVF9YX1NSQwkoMSA8PCA2KQorI2RlZmluZSBBQ1RfWV9TUkMJKDEgPDwgNSkKKyNkZWZpbmUgQUNUX1pfU1JDCSgxIDw8IDQpCisjZGVmaW5lIEFTTEVFUAkJKDEgPDwgMykKKyNkZWZpbmUgVEFQX1hfU1JDCSgxIDw8IDIpCisjZGVmaW5lIFRBUF9ZX1NSQwkoMSA8PCAxKQorI2RlZmluZSBUQVBfWl9TUkMJKDEgPDwgMCkKKworLyogQldfUkFURSBCaXRzICovCisjZGVmaW5lIExPV19QT1dFUgkoMSA8PCA0KQorI2RlZmluZSBSQVRFKHgpCQkoKHgpICYgMHhGKQorCisvKiBQT1dFUl9DVEwgQml0cyAqLworI2RlZmluZSBQQ1RMX0xJTksJKDEgPDwgNSkKKyNkZWZpbmUgUENUTF9BVVRPX1NMRUVQICgxIDw8IDQpCisjZGVmaW5lIFBDVExfTUVBU1VSRQkoMSA8PCAzKQorI2RlZmluZSBQQ1RMX1NMRUVQCSgxIDw8IDIpCisjZGVmaW5lIFBDVExfV0FLRVVQKHgpCSgoeCkgJiAweDMpCisKKy8qIERBVEFfRk9STUFUIEJpdHMgKi8KKyNkZWZpbmUgU0VMRl9URVNUCSgxIDw8IDcpCisjZGVmaW5lIFNQSQkJKDEgPDwgNikKKyNkZWZpbmUgSU5UX0lOVkVSVAkoMSA8PCA1KQorI2RlZmluZSBGVUxMX1JFUwkoMSA8PCAzKQorI2RlZmluZSBKVVNUSUZZCQkoMSA8PCAyKQorI2RlZmluZSBSQU5HRSh4KQkoKHgpICYgMHgzKQorI2RlZmluZSBSQU5HRV9QTV8yZwkwCisjZGVmaW5lIFJBTkdFX1BNXzRnCTEKKyNkZWZpbmUgUkFOR0VfUE1fOGcJMgorI2RlZmluZSBSQU5HRV9QTV8xNmcJMworCisvKgorICogTWF4aW11bSB2YWx1ZSBvdXIgYXhpcyBtYXkgZ2V0IGluIGZ1bGwgcmVzIG1vZGUgZm9yIHRoZSBpbnB1dCBkZXZpY2UKKyAqIChzaWduZWQgMTMgYml0cykKKyAqLworI2RlZmluZSBBRFhMX0ZVTExSRVNfTUFYX1ZBTCA0MDk2CisKKy8qCisgKiBNYXhpbXVtIHZhbHVlIG91ciBheGlzIG1heSBnZXQgaW4gZml4ZWQgcmVzIG1vZGUgZm9yIHRoZSBpbnB1dCBkZXZpY2UKKyAqIChzaWduZWQgMTAgYml0cykKKyAqLworI2RlZmluZSBBRFhMX0ZJWEVEUkVTX01BWF9WQUwgNTEyCisKKy8qIEZJRk9fQ1RMIEJpdHMgKi8KKyNkZWZpbmUgRklGT19NT0RFKHgpCSgoKHgpICYgMHgzKSA8PCA2KQorI2RlZmluZSBGSUZPX0JZUEFTUwkwCisjZGVmaW5lIEZJRk9fRklGTwkxCisjZGVmaW5lIEZJRk9fU1RSRUFNCTIKKyNkZWZpbmUgRklGT19UUklHR0VSCTMKKyNkZWZpbmUgVFJJR0dFUgkJKDEgPDwgNSkKKyNkZWZpbmUgU0FNUExFUyh4KQkoKHgpICYgMHgxRikKKworLyogRklGT19TVEFUVVMgQml0cyAqLworI2RlZmluZSBGSUZPX1RSSUcJKDEgPDwgNykKKyNkZWZpbmUgRU5UUklFUyh4KQkoKHgpICYgMHgzRikKKworLyogVEFQX1NJR04gQml0cyBBRFhMMzQ2IG9ubHkgKi8KKyNkZWZpbmUgWFNJR04JCSgxIDw8IDYpCisjZGVmaW5lIFlTSUdOCQkoMSA8PCA1KQorI2RlZmluZSBaU0lHTgkJKDEgPDwgNCkKKyNkZWZpbmUgWFRBUAkJKDEgPDwgMykKKyNkZWZpbmUgWVRBUAkJKDEgPDwgMikKKyNkZWZpbmUgWlRBUAkJKDEgPDwgMSkKKworLyogT1JJRU5UX0NPTkYgQURYTDM0NiBvbmx5ICovCisjZGVmaW5lIE9SSUVOVF9ERUFEWk9ORSh4KQkoKCh4KSAmIDB4NykgPDwgNCkKKyNkZWZpbmUgT1JJRU5UX0RJVklTT1IoeCkJKCh4KSAmIDB4NykKKworLyogT1JJRU5UIEFEWEwzNDYgb25seSAqLworI2RlZmluZSBBRFhMMzQ2XzJEX1ZBTElECQkoMSA8PCA2KQorI2RlZmluZSBBRFhMMzQ2XzJEX09SSUVOVCh4KQkJKCgoeCkgJiAweDMpID4+IDQpCisjZGVmaW5lIEFEWEwzNDZfM0RfVkFMSUQJCSgxIDw8IDMpCisjZGVmaW5lIEFEWEwzNDZfM0RfT1JJRU5UKHgpCQkoKHgpICYgMHg3KQorI2RlZmluZSBBRFhMMzQ2XzJEX1BPUlRSQUlUX1BPUwkJMAkvKiArWCAqLworI2RlZmluZSBBRFhMMzQ2XzJEX1BPUlRSQUlUX05FRwkJMQkvKiAtWCAqLworI2RlZmluZSBBRFhMMzQ2XzJEX0xBTkRTQ0FQRV9QT1MJMgkvKiArWSAqLworI2RlZmluZSBBRFhMMzQ2XzJEX0xBTkRTQ0FQRV9ORUcJMwkvKiAtWSAqLworCisjZGVmaW5lIEFEWEwzNDZfM0RfRlJPTlQJCTMJLyogK1ggKi8KKyNkZWZpbmUgQURYTDM0Nl8zRF9CQUNLCQkJNAkvKiAtWCAqLworI2RlZmluZSBBRFhMMzQ2XzNEX1JJR0hUCQkyCS8qICtZICovCisjZGVmaW5lIEFEWEwzNDZfM0RfTEVGVAkJCTUJLyogLVkgKi8KKyNkZWZpbmUgQURYTDM0Nl8zRF9UT1AJCQkxCS8qICtaICovCisjZGVmaW5lIEFEWEwzNDZfM0RfQk9UVE9NCQk2CS8qIC1aICovCisKKyN1bmRlZiBBRFhMX0RFQlVHCisKKyNkZWZpbmUgQURYTF9YX0FYSVMJCQkwCisjZGVmaW5lIEFEWExfWV9BWElTCQkJMQorI2RlZmluZSBBRFhMX1pfQVhJUwkJCTIKKworI2RlZmluZSBBQ19SRUFEKGFjLCByZWcpCSgoYWMpLT5ib3BzLT5yZWFkKChhYyktPmRldiwgcmVnKSkKKyNkZWZpbmUgQUNfV1JJVEUoYWMsIHJlZywgdmFsKQkoKGFjKS0+Ym9wcy0+d3JpdGUoKGFjKS0+ZGV2LCByZWcsIHZhbCkpCisKK3N0cnVjdCBheGlzX3RyaXBsZSB7CisJaW50IHg7CisJaW50IHk7CisJaW50IHo7Cit9OworCitzdHJ1Y3QgYWR4bDM0eCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCXN0cnVjdCBtdXRleCBtdXRleDsJLyogcmVlbnRyYW50IHByb3RlY3Rpb24gZm9yIHN0cnVjdCAqLworCXN0cnVjdCBhZHhsMzR4X3BsYXRmb3JtX2RhdGEgcGRhdGE7CisJc3RydWN0IGF4aXNfdHJpcGxlIHN3Y2FsOworCXN0cnVjdCBheGlzX3RyaXBsZSBod2NhbDsKKwlzdHJ1Y3QgYXhpc190cmlwbGUgc2F2ZWQ7CisJY2hhciBwaHlzWzMyXTsKKwl1bnNpZ25lZCBvcmllbnQyZF9zYXZlZDsKKwl1bnNpZ25lZCBvcmllbnQzZF9zYXZlZDsKKwlib29sIGRpc2FibGVkOwkvKiBQOiBtdXRleCAqLworCWJvb2wgb3BlbmVkOwkvKiBQOiBtdXRleCAqLworCWJvb2wgc3VzcGVuZGVkOwkvKiBQOiBtdXRleCAqLworCWJvb2wgZmlmb19kZWxheTsKKwlpbnQgaXJxOworCXVuc2lnbmVkIG1vZGVsOworCXVuc2lnbmVkIGludF9tYXNrOworCisJY29uc3Qgc3RydWN0IGFkeGwzNHhfYnVzX29wcyAqYm9wczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWR4bDM0eF9wbGF0Zm9ybV9kYXRhIGFkeGwzNHhfZGVmYXVsdF9pbml0ID0geworCS50YXBfdGhyZXNob2xkID0gMzUsCisJLnRhcF9kdXJhdGlvbiA9IDMsCisJLnRhcF9sYXRlbmN5ID0gMjAsCisJLnRhcF93aW5kb3cgPSAyMCwKKwkudGFwX2F4aXNfY29udHJvbCA9IEFEWExfVEFQX1hfRU4gfCBBRFhMX1RBUF9ZX0VOIHwgQURYTF9UQVBfWl9FTiwKKwkuYWN0X2F4aXNfY29udHJvbCA9IDB4RkYsCisJLmFjdGl2aXR5X3RocmVzaG9sZCA9IDYsCisJLmluYWN0aXZpdHlfdGhyZXNob2xkID0gNCwKKwkuaW5hY3Rpdml0eV90aW1lID0gMywKKwkuZnJlZV9mYWxsX3RocmVzaG9sZCA9IDgsCisJLmZyZWVfZmFsbF90aW1lID0gMHgyMCwKKwkuZGF0YV9yYXRlID0gOCwKKwkuZGF0YV9yYW5nZSA9IEFEWExfRlVMTF9SRVMsCisKKwkuZXZfdHlwZSA9IEVWX0FCUywKKwkuZXZfY29kZV94ID0gQUJTX1gsCS8qIEVWX1JFTCAqLworCS5ldl9jb2RlX3kgPSBBQlNfWSwJLyogRVZfUkVMICovCisJLmV2X2NvZGVfeiA9IEFCU19aLAkvKiBFVl9SRUwgKi8KKworCS5ldl9jb2RlX3RhcCA9IHtCVE5fVE9VQ0gsIEJUTl9UT1VDSCwgQlROX1RPVUNIfSwgLyogRVZfS0VZIHt4LHksen0gKi8KKwkucG93ZXJfbW9kZSA9IEFEWExfQVVUT19TTEVFUCB8IEFEWExfTElOSywKKwkuZmlmb19tb2RlID0gRklGT19TVFJFQU0sCisJLndhdGVybWFyayA9IDAsCit9OworCitzdGF0aWMgdm9pZCBhZHhsMzR4X2dldF90cmlwbGUoc3RydWN0IGFkeGwzNHggKmFjLCBzdHJ1Y3QgYXhpc190cmlwbGUgKmF4aXMpCit7CisJc2hvcnQgYnVmWzNdOworCisJYWMtPmJvcHMtPnJlYWRfYmxvY2soYWMtPmRldiwgREFUQVgwLCBEQVRBWjEgLSBEQVRBWDAgKyAxLCBidWYpOworCisJbXV0ZXhfbG9jaygmYWMtPm11dGV4KTsKKwlhYy0+c2F2ZWQueCA9IChzMTYpIGxlMTZfdG9fY3B1KGJ1ZlswXSk7CisJYXhpcy0+eCA9IGFjLT5zYXZlZC54OworCisJYWMtPnNhdmVkLnkgPSAoczE2KSBsZTE2X3RvX2NwdShidWZbMV0pOworCWF4aXMtPnkgPSBhYy0+c2F2ZWQueTsKKworCWFjLT5zYXZlZC56ID0gKHMxNikgbGUxNl90b19jcHUoYnVmWzJdKTsKKwlheGlzLT56ID0gYWMtPnNhdmVkLno7CisJbXV0ZXhfdW5sb2NrKCZhYy0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBhZHhsMzR4X3NlcnZpY2VfZXZfZmlmbyhzdHJ1Y3QgYWR4bDM0eCAqYWMpCit7CisJc3RydWN0IGFkeGwzNHhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSAmYWMtPnBkYXRhOworCXN0cnVjdCBheGlzX3RyaXBsZSBheGlzOworCisJYWR4bDM0eF9nZXRfdHJpcGxlKGFjLCAmYXhpcyk7CisKKwlpbnB1dF9ldmVudChhYy0+aW5wdXQsIHBkYXRhLT5ldl90eXBlLCBwZGF0YS0+ZXZfY29kZV94LAorCQkgICAgYXhpcy54IC0gYWMtPnN3Y2FsLngpOworCWlucHV0X2V2ZW50KGFjLT5pbnB1dCwgcGRhdGEtPmV2X3R5cGUsIHBkYXRhLT5ldl9jb2RlX3ksCisJCSAgICBheGlzLnkgLSBhYy0+c3djYWwueSk7CisJaW5wdXRfZXZlbnQoYWMtPmlucHV0LCBwZGF0YS0+ZXZfdHlwZSwgcGRhdGEtPmV2X2NvZGVfeiwKKwkJICAgIGF4aXMueiAtIGFjLT5zd2NhbC56KTsKK30KKworc3RhdGljIHZvaWQgYWR4bDM0eF9yZXBvcnRfa2V5X3NpbmdsZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwgaW50IGtleSkKK3sKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBrZXksIHRydWUpOworCWlucHV0X3N5bmMoaW5wdXQpOworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhZHhsMzR4X3NlbmRfa2V5X2V2ZW50cyhzdHJ1Y3QgYWR4bDM0eCAqYWMsCisJCXN0cnVjdCBhZHhsMzR4X3BsYXRmb3JtX2RhdGEgKnBkYXRhLCBpbnQgc3RhdHVzLCBpbnQgcHJlc3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBBRFhMX1hfQVhJUzsgaSA8PSBBRFhMX1pfQVhJUzsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiAoMSA8PCAoQURYTF9aX0FYSVMgLSBpKSkpCisJCQlpbnB1dF9yZXBvcnRfa2V5KGFjLT5pbnB1dCwKKwkJCQkJIHBkYXRhLT5ldl9jb2RlX3RhcFtpXSwgcHJlc3MpOworCX0KK30KKworc3RhdGljIHZvaWQgYWR4bDM0eF9kb190YXAoc3RydWN0IGFkeGwzNHggKmFjLAorCQlzdHJ1Y3QgYWR4bDM0eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSwgaW50IHN0YXR1cykKK3sKKwlhZHhsMzR4X3NlbmRfa2V5X2V2ZW50cyhhYywgcGRhdGEsIHN0YXR1cywgdHJ1ZSk7CisJaW5wdXRfc3luYyhhYy0+aW5wdXQpOworCWFkeGwzNHhfc2VuZF9rZXlfZXZlbnRzKGFjLCBwZGF0YSwgc3RhdHVzLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZHhsMzR4X2lycShpbnQgaXJxLCB2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gaGFuZGxlOworCXN0cnVjdCBhZHhsMzR4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gJmFjLT5wZGF0YTsKKwlpbnQgaW50X3N0YXQsIHRhcF9zdGF0LCBzYW1wbGVzLCBvcmllbnQsIG9yaWVudF9jb2RlOworCisJLyoKKwkgKiBBQ1RfVEFQX1NUQVRVUyBzaG91bGQgYmUgcmVhZCBiZWZvcmUgY2xlYXJpbmcgdGhlIGludGVycnVwdAorCSAqIEF2b2lkIHJlYWRpbmcgQUNUX1RBUF9TVEFUVVMgaW4gY2FzZSBUQVAgZGV0ZWN0aW9uIGlzIGRpc2FibGVkCisJICovCisKKwlpZiAocGRhdGEtPnRhcF9heGlzX2NvbnRyb2wgJiAoVEFQX1hfRU4gfCBUQVBfWV9FTiB8IFRBUF9aX0VOKSkKKwkJdGFwX3N0YXQgPSBBQ19SRUFEKGFjLCBBQ1RfVEFQX1NUQVRVUyk7CisJZWxzZQorCQl0YXBfc3RhdCA9IDA7CisKKwlpbnRfc3RhdCA9IEFDX1JFQUQoYWMsIElOVF9TT1VSQ0UpOworCisJaWYgKGludF9zdGF0ICYgRlJFRV9GQUxMKQorCQlhZHhsMzR4X3JlcG9ydF9rZXlfc2luZ2xlKGFjLT5pbnB1dCwgcGRhdGEtPmV2X2NvZGVfZmYpOworCisJaWYgKGludF9zdGF0ICYgT1ZFUlJVTikKKwkJZGV2X2RiZyhhYy0+ZGV2LCAiT1ZFUlJVTlxuIik7CisKKwlpZiAoaW50X3N0YXQgJiAoU0lOR0xFX1RBUCB8IERPVUJMRV9UQVApKSB7CisJCWFkeGwzNHhfZG9fdGFwKGFjLCBwZGF0YSwgdGFwX3N0YXQpOworCisJCWlmIChpbnRfc3RhdCAmIERPVUJMRV9UQVApCisJCQlhZHhsMzR4X2RvX3RhcChhYywgcGRhdGEsIHRhcF9zdGF0KTsKKwl9CisKKwlpZiAocGRhdGEtPmV2X2NvZGVfYWN0X2luYWN0aXZpdHkpIHsKKwkJaWYgKGludF9zdGF0ICYgQUNUSVZJVFkpCisJCQlpbnB1dF9yZXBvcnRfa2V5KGFjLT5pbnB1dCwKKwkJCQkJIHBkYXRhLT5ldl9jb2RlX2FjdF9pbmFjdGl2aXR5LCAxKTsKKwkJaWYgKGludF9zdGF0ICYgSU5BQ1RJVklUWSkKKwkJCWlucHV0X3JlcG9ydF9rZXkoYWMtPmlucHV0LAorCQkJCQkgcGRhdGEtPmV2X2NvZGVfYWN0X2luYWN0aXZpdHksIDApOworCX0KKworCS8qCisJICogT1JJRU5UQVRJT04gU0VOU0lORyBBRFhMMzQ2IG9ubHkKKwkgKi8KKwlpZiAocGRhdGEtPm9yaWVudGF0aW9uX2VuYWJsZSkgeworCQlvcmllbnQgPSBBQ19SRUFEKGFjLCBPUklFTlQpOworCQlpZiAoKHBkYXRhLT5vcmllbnRhdGlvbl9lbmFibGUgJiBBRFhMX0VOX09SSUVOVEFUSU9OXzJEKSAmJgorCQkgICAgKG9yaWVudCAmIEFEWEwzNDZfMkRfVkFMSUQpKSB7CisKKwkJCW9yaWVudF9jb2RlID0gQURYTDM0Nl8yRF9PUklFTlQob3JpZW50KTsKKwkJCS8qIFJlcG9ydCBvcmllbnRhdGlvbiBvbmx5IHdoZW4gaXQgY2hhbmdlcyAqLworCQkJaWYgKGFjLT5vcmllbnQyZF9zYXZlZCAhPSBvcmllbnRfY29kZSkgeworCQkJCWFjLT5vcmllbnQyZF9zYXZlZCA9IG9yaWVudF9jb2RlOworCQkJCWFkeGwzNHhfcmVwb3J0X2tleV9zaW5nbGUoYWMtPmlucHV0LAorCQkJCQlwZGF0YS0+ZXZfY29kZXNfb3JpZW50XzJkW29yaWVudF9jb2RlXSk7CisJCQl9CisJCX0KKworCQlpZiAoKHBkYXRhLT5vcmllbnRhdGlvbl9lbmFibGUgJiBBRFhMX0VOX09SSUVOVEFUSU9OXzNEKSAmJgorCQkgICAgKG9yaWVudCAmIEFEWEwzNDZfM0RfVkFMSUQpKSB7CisKKwkJCW9yaWVudF9jb2RlID0gQURYTDM0Nl8zRF9PUklFTlQob3JpZW50KSAtIDE7CisJCQkvKiBSZXBvcnQgb3JpZW50YXRpb24gb25seSB3aGVuIGl0IGNoYW5nZXMgKi8KKwkJCWlmIChhYy0+b3JpZW50M2Rfc2F2ZWQgIT0gb3JpZW50X2NvZGUpIHsKKwkJCQlhYy0+b3JpZW50M2Rfc2F2ZWQgPSBvcmllbnRfY29kZTsKKwkJCQlhZHhsMzR4X3JlcG9ydF9rZXlfc2luZ2xlKGFjLT5pbnB1dCwKKwkJCQkJcGRhdGEtPmV2X2NvZGVzX29yaWVudF8zZFtvcmllbnRfY29kZV0pOworCQkJfQorCQl9CisJfQorCisJaWYgKGludF9zdGF0ICYgKERBVEFfUkVBRFkgfCBXQVRFUk1BUkspKSB7CisKKwkJaWYgKHBkYXRhLT5maWZvX21vZGUpCisJCQlzYW1wbGVzID0gRU5UUklFUyhBQ19SRUFEKGFjLCBGSUZPX1NUQVRVUykpICsgMTsKKwkJZWxzZQorCQkJc2FtcGxlcyA9IDE7CisKKwkJZm9yICg7IHNhbXBsZXMgPiAwOyBzYW1wbGVzLS0pIHsKKwkJCWFkeGwzNHhfc2VydmljZV9ldl9maWZvKGFjKTsKKwkJCS8qCisJCQkgKiBUbyBlbnN1cmUgdGhhdCB0aGUgRklGTyBoYXMKKwkJCSAqIGNvbXBsZXRlbHkgcG9wcGVkLCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDUgdXMgYmV0d2VlbgorCQkJICogdGhlIGVuZCBvZiByZWFkaW5nIHRoZSBkYXRhIHJlZ2lzdGVycywgc2lnbmlmaWVkIGJ5IHRoZQorCQkJICogdHJhbnNpdGlvbiB0byByZWdpc3RlciAweDM4IGZyb20gMHgzNyBvciB0aGUgQ1MgcGluCisJCQkgKiBnb2luZyBoaWdoLCBhbmQgdGhlIHN0YXJ0IG9mIG5ldyByZWFkcyBvZiB0aGUgRklGTyBvcgorCQkJICogcmVhZGluZyB0aGUgRklGT19TVEFUVVMgcmVnaXN0ZXIuIEZvciBTUEkgb3BlcmF0aW9uIGF0CisJCQkgKiAxLjUgTUh6IG9yIGxvd2VyLCB0aGUgcmVnaXN0ZXIgYWRkcmVzc2luZyBwb3J0aW9uIG9mIHRoZQorCQkJICogdHJhbnNtaXNzaW9uIGlzIHN1ZmZpY2llbnQgZGVsYXkgdG8gZW5zdXJlIHRoZSBGSUZPIGhhcworCQkJICogY29tcGxldGVseSBwb3BwZWQuIEl0IGlzIG5lY2Vzc2FyeSBmb3IgU1BJIG9wZXJhdGlvbgorCQkJICogZ3JlYXRlciB0aGFuIDEuNSBNSHogdG8gZGUtYXNzZXJ0IHRoZSBDUyBwaW4gdG8gZW5zdXJlIGEKKwkJCSAqIHRvdGFsIG9mIDUgdXMsIHdoaWNoIGlzIGF0IG1vc3QgMy40IHVzIGF0IDUgTUh6CisJCQkgKiBvcGVyYXRpb24uCisJCQkgKi8KKwkJCWlmIChhYy0+Zmlmb19kZWxheSAmJiAoc2FtcGxlcyA+IDEpKQorCQkJCXVkZWxheSgzKTsKKwkJfQorCX0KKworCWlucHV0X3N5bmMoYWMtPmlucHV0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgX19hZHhsMzR4X2Rpc2FibGUoc3RydWN0IGFkeGwzNHggKmFjKQoreworCS8qCisJICogQSAnMCcgcGxhY2VzIHRoZSBBRFhMMzR4IGludG8gc3RhbmRieSBtb2RlCisJICogd2l0aCBtaW5pbXVtIHBvd2VyIGNvbnN1bXB0aW9uLgorCSAqLworCUFDX1dSSVRFKGFjLCBQT1dFUl9DVEwsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2FkeGwzNHhfZW5hYmxlKHN0cnVjdCBhZHhsMzR4ICphYykKK3sKKwlBQ19XUklURShhYywgUE9XRVJfQ1RMLCBhYy0+cGRhdGEucG93ZXJfbW9kZSB8IFBDVExfTUVBU1VSRSk7Cit9CisKK3ZvaWQgYWR4bDM0eF9zdXNwZW5kKHN0cnVjdCBhZHhsMzR4ICphYykKK3sKKwltdXRleF9sb2NrKCZhYy0+bXV0ZXgpOworCisJaWYgKCFhYy0+c3VzcGVuZGVkICYmICFhYy0+ZGlzYWJsZWQgJiYgYWMtPm9wZW5lZCkKKwkJX19hZHhsMzR4X2Rpc2FibGUoYWMpOworCisJYWMtPnN1c3BlbmRlZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJmFjLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZHhsMzR4X3N1c3BlbmQpOworCit2b2lkIGFkeGwzNHhfcmVzdW1lKHN0cnVjdCBhZHhsMzR4ICphYykKK3sKKwltdXRleF9sb2NrKCZhYy0+bXV0ZXgpOworCisJaWYgKGFjLT5zdXNwZW5kZWQgJiYgIWFjLT5kaXNhYmxlZCAmJiBhYy0+b3BlbmVkKQorCQlfX2FkeGwzNHhfZW5hYmxlKGFjKTsKKworCWFjLT5zdXNwZW5kZWQgPSBmYWxzZTsKKworCW11dGV4X3VubG9jaygmYWMtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFkeGwzNHhfcmVzdW1lKTsKKworc3RhdGljIHNzaXplX3QgYWR4bDM0eF9kaXNhYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHhsMzR4ICphYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGFjLT5kaXNhYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkeGwzNHhfZGlzYWJsZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHhsMzR4ICphYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnJvcjsKKworCWVycm9yID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwltdXRleF9sb2NrKCZhYy0+bXV0ZXgpOworCisJaWYgKCFhYy0+c3VzcGVuZGVkICYmIGFjLT5vcGVuZWQpIHsKKwkJaWYgKHZhbCkgeworCQkJaWYgKCFhYy0+ZGlzYWJsZWQpCisJCQkJX19hZHhsMzR4X2Rpc2FibGUoYWMpOworCQl9IGVsc2UgeworCQkJaWYgKGFjLT5kaXNhYmxlZCkKKwkJCQlfX2FkeGwzNHhfZW5hYmxlKGFjKTsKKwkJfQorCX0KKworCWFjLT5kaXNhYmxlZCA9ICEhdmFsOworCisJbXV0ZXhfdW5sb2NrKCZhYy0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZGlzYWJsZSwgMDY2NCwgYWR4bDM0eF9kaXNhYmxlX3Nob3csIGFkeGwzNHhfZGlzYWJsZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkeGwzNHhfY2FsaWJyYXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCBjb3VudDsKKworCW11dGV4X2xvY2soJmFjLT5tdXRleCk7CisJY291bnQgPSBzcHJpbnRmKGJ1ZiwgIiVkLCVkLCVkXG4iLAorCQkJYWMtPmh3Y2FsLnggKiA0ICsgYWMtPnN3Y2FsLngsCisJCQlhYy0+aHdjYWwueSAqIDQgKyBhYy0+c3djYWwueSwKKwkJCWFjLT5od2NhbC56ICogNCArIGFjLT5zd2NhbC56KTsKKwltdXRleF91bmxvY2soJmFjLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkeGwzNHhfY2FsaWJyYXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHhsMzR4ICphYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyoKKwkgKiBIYXJkd2FyZSBvZmZzZXQgY2FsaWJyYXRpb24gaGFzIGEgcmVzb2x1dGlvbiBvZiAxNS42IG1nL0xTQi4KKwkgKiBXZSB1c2UgSFcgY2FsaWJyYXRpb24gYW5kIGhhbmRsZSB0aGUgcmVtYWluaW5nIGJpdHMgaW4gU1cuICg0bWcvTFNCKQorCSAqLworCisJbXV0ZXhfbG9jaygmYWMtPm11dGV4KTsKKwlhYy0+aHdjYWwueCAtPSAoYWMtPnNhdmVkLnggLyA0KTsKKwlhYy0+c3djYWwueCA9IGFjLT5zYXZlZC54ICUgNDsKKworCWFjLT5od2NhbC55IC09IChhYy0+c2F2ZWQueSAvIDQpOworCWFjLT5zd2NhbC55ID0gYWMtPnNhdmVkLnkgJSA0OworCisJYWMtPmh3Y2FsLnogLT0gKGFjLT5zYXZlZC56IC8gNCk7CisJYWMtPnN3Y2FsLnogPSBhYy0+c2F2ZWQueiAlIDQ7CisKKwlBQ19XUklURShhYywgT0ZTWCwgKHM4KSBhYy0+aHdjYWwueCk7CisJQUNfV1JJVEUoYWMsIE9GU1ksIChzOCkgYWMtPmh3Y2FsLnkpOworCUFDX1dSSVRFKGFjLCBPRlNaLCAoczgpIGFjLT5od2NhbC56KTsKKwltdXRleF91bmxvY2soJmFjLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjYWxpYnJhdGUsIDA2NjQsCisJCSAgIGFkeGwzNHhfY2FsaWJyYXRlX3Nob3csIGFkeGwzNHhfY2FsaWJyYXRlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWR4bDM0eF9yYXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHhsMzR4ICphYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFJBVEUoYWMtPnBkYXRhLmRhdGFfcmF0ZSkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHhsMzR4X3JhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbXV0ZXhfbG9jaygmYWMtPm11dGV4KTsKKworCWFjLT5wZGF0YS5kYXRhX3JhdGUgPSBSQVRFKHZhbCk7CisJQUNfV1JJVEUoYWMsIEJXX1JBVEUsCisJCSBhYy0+cGRhdGEuZGF0YV9yYXRlIHwKKwkJCShhYy0+cGRhdGEubG93X3Bvd2VyX21vZGUgPyBMT1dfUE9XRVIgOiAwKSk7CisKKwltdXRleF91bmxvY2soJmFjLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihyYXRlLCAwNjY0LCBhZHhsMzR4X3JhdGVfc2hvdywgYWR4bDM0eF9yYXRlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWR4bDM0eF9hdXRvc2xlZXBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwKKwkJYWMtPnBkYXRhLnBvd2VyX21vZGUgJiAoUENUTF9BVVRPX1NMRUVQIHwgUENUTF9MSU5LKSA/IDEgOiAwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR4bDM0eF9hdXRvc2xlZXBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbXV0ZXhfbG9jaygmYWMtPm11dGV4KTsKKworCWlmICh2YWwpCisJCWFjLT5wZGF0YS5wb3dlcl9tb2RlIHw9IChQQ1RMX0FVVE9fU0xFRVAgfCBQQ1RMX0xJTkspOworCWVsc2UKKwkJYWMtPnBkYXRhLnBvd2VyX21vZGUgJj0gfihQQ1RMX0FVVE9fU0xFRVAgfCBQQ1RMX0xJTkspOworCisJaWYgKCFhYy0+ZGlzYWJsZWQgJiYgIWFjLT5zdXNwZW5kZWQgJiYgYWMtPm9wZW5lZCkKKwkJQUNfV1JJVEUoYWMsIFBPV0VSX0NUTCwgYWMtPnBkYXRhLnBvd2VyX21vZGUgfCBQQ1RMX01FQVNVUkUpOworCisJbXV0ZXhfdW5sb2NrKCZhYy0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYXV0b3NsZWVwLCAwNjY0LAorCQkgICBhZHhsMzR4X2F1dG9zbGVlcF9zaG93LCBhZHhsMzR4X2F1dG9zbGVlcF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkeGwzNHhfcG9zaXRpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCBjb3VudDsKKworCW11dGV4X2xvY2soJmFjLT5tdXRleCk7CisJY291bnQgPSBzcHJpbnRmKGJ1ZiwgIiglZCwgJWQsICVkKVxuIiwKKwkJCWFjLT5zYXZlZC54LCBhYy0+c2F2ZWQueSwgYWMtPnNhdmVkLnopOworCW11dGV4X3VubG9jaygmYWMtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHBvc2l0aW9uLCBTX0lSVUdPLCBhZHhsMzR4X3Bvc2l0aW9uX3Nob3csIE5VTEwpOworCisjaWZkZWYgQURYTF9ERUJVRworc3RhdGljIHNzaXplX3QgYWR4bDM0eF93cml0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkeGwzNHggKmFjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGVycm9yOworCisJLyoKKwkgKiBUaGlzIGFsbG93cyBiYXNpYyBBRFhMIHJlZ2lzdGVyIHdyaXRlIGFjY2VzcyBmb3IgZGVidWcgcHVycG9zZXMuCisJICovCisJZXJyb3IgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmdmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCW11dGV4X2xvY2soJmFjLT5tdXRleCk7CisJQUNfV1JJVEUoYWMsIHZhbCA+PiA4LCB2YWwgJiAweEZGKTsKKwltdXRleF91bmxvY2soJmFjLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih3cml0ZSwgMDY2NCwgTlVMTCwgYWR4bDM0eF93cml0ZV9zdG9yZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkeGwzNHhfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9kaXNhYmxlLmF0dHIsCisJJmRldl9hdHRyX2NhbGlicmF0ZS5hdHRyLAorCSZkZXZfYXR0cl9yYXRlLmF0dHIsCisJJmRldl9hdHRyX2F1dG9zbGVlcC5hdHRyLAorCSZkZXZfYXR0cl9wb3NpdGlvbi5hdHRyLAorI2lmZGVmIEFEWExfREVCVUcKKwkmZGV2X2F0dHJfd3JpdGUuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkeGwzNHhfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHhsMzR4X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGFkeGwzNHhfaW5wdXRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7CisKKwltdXRleF9sb2NrKCZhYy0+bXV0ZXgpOworCisJaWYgKCFhYy0+c3VzcGVuZGVkICYmICFhYy0+ZGlzYWJsZWQpCisJCV9fYWR4bDM0eF9lbmFibGUoYWMpOworCisJYWMtPm9wZW5lZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJmFjLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWR4bDM0eF9pbnB1dF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgYWR4bDM0eCAqYWMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7CisKKwltdXRleF9sb2NrKCZhYy0+bXV0ZXgpOworCisJaWYgKCFhYy0+c3VzcGVuZGVkICYmICFhYy0+ZGlzYWJsZWQpCisJCV9fYWR4bDM0eF9kaXNhYmxlKGFjKTsKKworCWFjLT5vcGVuZWQgPSBmYWxzZTsKKworCW11dGV4X3VubG9jaygmYWMtPm11dGV4KTsKK30KKworc3RydWN0IGFkeGwzNHggKmFkeGwzNHhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaXJxLAorCQkJICAgICAgYm9vbCBmaWZvX2RlbGF5X2RlZmF1bHQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWR4bDM0eF9idXNfb3BzICpib3BzKQoreworCXN0cnVjdCBhZHhsMzR4ICphYzsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJY29uc3Qgc3RydWN0IGFkeGwzNHhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IGVyciwgcmFuZ2UsIGk7CisJdW5zaWduZWQgY2hhciByZXZpZDsKKworCWlmICghaXJxKSB7CisJCWRldl9lcnIoZGV2LCAibm8gSVJRP1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlhYyA9IGt6YWxsb2Moc2l6ZW9mKCphYyksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghYWMgfHwgIWlucHV0X2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlhYy0+Zmlmb19kZWxheSA9IGZpZm9fZGVsYXlfZGVmYXVsdDsKKworCXBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpIHsKKwkJZGV2X2RiZyhkZXYsCisJCQkiTm8gcGxhdGZyb20gZGF0YTogVXNpbmcgZGVmYXVsdCBpbml0aWFsaXphdGlvblxuIik7CisJCXBkYXRhID0gJmFkeGwzNHhfZGVmYXVsdF9pbml0OworCX0KKworCWFjLT5wZGF0YSA9ICpwZGF0YTsKKwlwZGF0YSA9ICZhYy0+cGRhdGE7CisKKwlhYy0+aW5wdXQgPSBpbnB1dF9kZXY7CisJYWMtPmRpc2FibGVkID0gdHJ1ZTsKKwlhYy0+ZGV2ID0gZGV2OworCWFjLT5pcnEgPSBpcnE7CisJYWMtPmJvcHMgPSBib3BzOworCisJbXV0ZXhfaW5pdCgmYWMtPm11dGV4KTsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJBRFhMMzR4IGFjY2VsZXJvbWV0ZXIiOworCXJldmlkID0gYWMtPmJvcHMtPnJlYWQoZGV2LCBERVZJRCk7CisKKwlzd2l0Y2ggKHJldmlkKSB7CisJY2FzZSBJRF9BRFhMMzQ1OgorCQlhYy0+bW9kZWwgPSAzNDU7CisJCWJyZWFrOworCWNhc2UgSURfQURYTDM0NjoKKwkJYWMtPm1vZGVsID0gMzQ2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBwcm9iZSAlc1xuIiwgaW5wdXRfZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJc25wcmludGYoYWMtPnBoeXMsIHNpemVvZihhYy0+cGh5cyksICIlcy9pbnB1dDAiLCBkZXZfbmFtZShkZXYpKTsKKworCWlucHV0X2Rldi0+cGh5cyA9IGFjLT5waHlzOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBhYy0+bW9kZWw7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gYm9wcy0+YnVzdHlwZTsKKwlpbnB1dF9kZXYtPm9wZW4gPSBhZHhsMzR4X2lucHV0X29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IGFkeGwzNHhfaW5wdXRfY2xvc2U7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIGFjKTsKKworCV9fc2V0X2JpdChhYy0+cGRhdGEuZXZfdHlwZSwgaW5wdXRfZGV2LT5ldmJpdCk7CisKKwlpZiAoYWMtPnBkYXRhLmV2X3R5cGUgPT0gRVZfUkVMKSB7CisJCV9fc2V0X2JpdChSRUxfWCwgaW5wdXRfZGV2LT5yZWxiaXQpOworCQlfX3NldF9iaXQoUkVMX1ksIGlucHV0X2Rldi0+cmVsYml0KTsKKwkJX19zZXRfYml0KFJFTF9aLCBpbnB1dF9kZXYtPnJlbGJpdCk7CisJfSBlbHNlIHsKKwkJLyogRVZfQUJTICovCisJCV9fc2V0X2JpdChBQlNfWCwgaW5wdXRfZGV2LT5hYnNiaXQpOworCQlfX3NldF9iaXQoQUJTX1ksIGlucHV0X2Rldi0+YWJzYml0KTsKKwkJX19zZXRfYml0KEFCU19aLCBpbnB1dF9kZXYtPmFic2JpdCk7CisKKwkJaWYgKHBkYXRhLT5kYXRhX3JhbmdlICYgRlVMTF9SRVMpCisJCQlyYW5nZSA9IEFEWExfRlVMTFJFU19NQVhfVkFMOwkvKiBTaWduZWQgMTMtYml0ICovCisJCWVsc2UKKwkJCXJhbmdlID0gQURYTF9GSVhFRFJFU19NQVhfVkFMOwkvKiBTaWduZWQgMTAtYml0ICovCisKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgLXJhbmdlLCByYW5nZSwgMywgMyk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIC1yYW5nZSwgcmFuZ2UsIDMsIDMpOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19aLCAtcmFuZ2UsIHJhbmdlLCAzLCAzKTsKKwl9CisKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKKwlfX3NldF9iaXQocGRhdGEtPmV2X2NvZGVfdGFwW0FEWExfWF9BWElTXSwgaW5wdXRfZGV2LT5rZXliaXQpOworCV9fc2V0X2JpdChwZGF0YS0+ZXZfY29kZV90YXBbQURYTF9ZX0FYSVNdLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJX19zZXRfYml0KHBkYXRhLT5ldl9jb2RlX3RhcFtBRFhMX1pfQVhJU10sIGlucHV0X2Rldi0+a2V5Yml0KTsKKworCWlmIChwZGF0YS0+ZXZfY29kZV9mZikgeworCQlhYy0+aW50X21hc2sgPSBGUkVFX0ZBTEw7CisJCV9fc2V0X2JpdChwZGF0YS0+ZXZfY29kZV9mZiwgaW5wdXRfZGV2LT5rZXliaXQpOworCX0KKworCWlmIChwZGF0YS0+ZXZfY29kZV9hY3RfaW5hY3Rpdml0eSkKKwkJX19zZXRfYml0KHBkYXRhLT5ldl9jb2RlX2FjdF9pbmFjdGl2aXR5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisKKwlhYy0+aW50X21hc2sgfD0gQUNUSVZJVFkgfCBJTkFDVElWSVRZOworCisJaWYgKHBkYXRhLT53YXRlcm1hcmspIHsKKwkJYWMtPmludF9tYXNrIHw9IFdBVEVSTUFSSzsKKwkJaWYgKCFGSUZPX01PREUocGRhdGEtPmZpZm9fbW9kZSkpCisJCQlhYy0+cGRhdGEuZmlmb19tb2RlIHw9IEZJRk9fU1RSRUFNOworCX0gZWxzZSB7CisJCWFjLT5pbnRfbWFzayB8PSBEQVRBX1JFQURZOworCX0KKworCWlmIChwZGF0YS0+dGFwX2F4aXNfY29udHJvbCAmIChUQVBfWF9FTiB8IFRBUF9ZX0VOIHwgVEFQX1pfRU4pKQorCQlhYy0+aW50X21hc2sgfD0gU0lOR0xFX1RBUCB8IERPVUJMRV9UQVA7CisKKwlpZiAoRklGT19NT0RFKHBkYXRhLT5maWZvX21vZGUpID09IEZJRk9fQllQQVNTKQorCQlhYy0+Zmlmb19kZWxheSA9IGZhbHNlOworCisJYWMtPmJvcHMtPndyaXRlKGRldiwgUE9XRVJfQ1RMLCAwKTsKKworCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGFjLT5pcnEsIE5VTEwsIGFkeGwzNHhfaXJxLAorCQkJCSAgIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAorCQkJCSAgIGRldl9uYW1lKGRldiksIGFjKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiaXJxICVkIGJ1c3k/XG4iLCBhYy0+aXJxKTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZhZHhsMzR4X2F0dHJfZ3JvdXApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVtb3ZlX2F0dHI7CisKKwlBQ19XUklURShhYywgVEhSRVNIX1RBUCwgcGRhdGEtPnRhcF90aHJlc2hvbGQpOworCUFDX1dSSVRFKGFjLCBPRlNYLCBwZGF0YS0+eF9heGlzX29mZnNldCk7CisJYWMtPmh3Y2FsLnggPSBwZGF0YS0+eF9heGlzX29mZnNldDsKKwlBQ19XUklURShhYywgT0ZTWSwgcGRhdGEtPnlfYXhpc19vZmZzZXQpOworCWFjLT5od2NhbC55ID0gcGRhdGEtPnlfYXhpc19vZmZzZXQ7CisJQUNfV1JJVEUoYWMsIE9GU1osIHBkYXRhLT56X2F4aXNfb2Zmc2V0KTsKKwlhYy0+aHdjYWwueiA9IHBkYXRhLT56X2F4aXNfb2Zmc2V0OworCUFDX1dSSVRFKGFjLCBUSFJFU0hfVEFQLCBwZGF0YS0+dGFwX3RocmVzaG9sZCk7CisJQUNfV1JJVEUoYWMsIERVUiwgcGRhdGEtPnRhcF9kdXJhdGlvbik7CisJQUNfV1JJVEUoYWMsIExBVEVOVCwgcGRhdGEtPnRhcF9sYXRlbmN5KTsKKwlBQ19XUklURShhYywgV0lORE9XLCBwZGF0YS0+dGFwX3dpbmRvdyk7CisJQUNfV1JJVEUoYWMsIFRIUkVTSF9BQ1QsIHBkYXRhLT5hY3Rpdml0eV90aHJlc2hvbGQpOworCUFDX1dSSVRFKGFjLCBUSFJFU0hfSU5BQ1QsIHBkYXRhLT5pbmFjdGl2aXR5X3RocmVzaG9sZCk7CisJQUNfV1JJVEUoYWMsIFRJTUVfSU5BQ1QsIHBkYXRhLT5pbmFjdGl2aXR5X3RpbWUpOworCUFDX1dSSVRFKGFjLCBUSFJFU0hfRkYsIHBkYXRhLT5mcmVlX2ZhbGxfdGhyZXNob2xkKTsKKwlBQ19XUklURShhYywgVElNRV9GRiwgcGRhdGEtPmZyZWVfZmFsbF90aW1lKTsKKwlBQ19XUklURShhYywgVEFQX0FYRVMsIHBkYXRhLT50YXBfYXhpc19jb250cm9sKTsKKwlBQ19XUklURShhYywgQUNUX0lOQUNUX0NUTCwgcGRhdGEtPmFjdF9heGlzX2NvbnRyb2wpOworCUFDX1dSSVRFKGFjLCBCV19SQVRFLCBSQVRFKGFjLT5wZGF0YS5kYXRhX3JhdGUpIHwKKwkJIChwZGF0YS0+bG93X3Bvd2VyX21vZGUgPyBMT1dfUE9XRVIgOiAwKSk7CisJQUNfV1JJVEUoYWMsIERBVEFfRk9STUFULCBwZGF0YS0+ZGF0YV9yYW5nZSk7CisJQUNfV1JJVEUoYWMsIEZJRk9fQ1RMLCBGSUZPX01PREUocGRhdGEtPmZpZm9fbW9kZSkgfAorCQkJU0FNUExFUyhwZGF0YS0+d2F0ZXJtYXJrKSk7CisKKwlpZiAocGRhdGEtPnVzZV9pbnQyKSB7CisJCS8qIE1hcCBhbGwgSU5UcyB0byBJTlQyICovCisJCUFDX1dSSVRFKGFjLCBJTlRfTUFQLCBhYy0+aW50X21hc2sgfCBPVkVSUlVOKTsKKwl9IGVsc2UgeworCQkvKiBNYXAgYWxsIElOVHMgdG8gSU5UMSAqLworCQlBQ19XUklURShhYywgSU5UX01BUCwgMCk7CisJfQorCisJaWYgKGFjLT5tb2RlbCA9PSAzNDYgJiYgYWMtPnBkYXRhLm9yaWVudGF0aW9uX2VuYWJsZSkgeworCQlBQ19XUklURShhYywgT1JJRU5UX0NPTkYsCisJCQlPUklFTlRfREVBRFpPTkUoYWMtPnBkYXRhLmRlYWR6b25lX2FuZ2xlKSB8CisJCQlPUklFTlRfRElWSVNPUihhYy0+cGRhdGEuZGl2aXNvcl9sZW5ndGgpKTsKKworCQlhYy0+b3JpZW50MmRfc2F2ZWQgPSAxMjM0OworCQlhYy0+b3JpZW50M2Rfc2F2ZWQgPSAxMjM0OworCisJCWlmIChwZGF0YS0+b3JpZW50YXRpb25fZW5hYmxlICYgQURYTF9FTl9PUklFTlRBVElPTl8zRCkKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5ldl9jb2Rlc19vcmllbnRfM2QpOyBpKyspCisJCQkJX19zZXRfYml0KHBkYXRhLT5ldl9jb2Rlc19vcmllbnRfM2RbaV0sCisJCQkJCSAgaW5wdXRfZGV2LT5rZXliaXQpOworCisJCWlmIChwZGF0YS0+b3JpZW50YXRpb25fZW5hYmxlICYgQURYTF9FTl9PUklFTlRBVElPTl8yRCkKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5ldl9jb2Rlc19vcmllbnRfMmQpOyBpKyspCisJCQkJX19zZXRfYml0KHBkYXRhLT5ldl9jb2Rlc19vcmllbnRfMmRbaV0sCisJCQkJCSAgaW5wdXRfZGV2LT5rZXliaXQpOworCX0gZWxzZSB7CisJCWFjLT5wZGF0YS5vcmllbnRhdGlvbl9lbmFibGUgPSAwOworCX0KKworCUFDX1dSSVRFKGFjLCBJTlRfRU5BQkxFLCBhYy0+aW50X21hc2sgfCBPVkVSUlVOKTsKKworCWFjLT5wZGF0YS5wb3dlcl9tb2RlICY9IChQQ1RMX0FVVE9fU0xFRVAgfCBQQ1RMX0xJTkspOworCisJcmV0dXJuIGFjOworCisgZXJyX3JlbW92ZV9hdHRyOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmYWR4bDM0eF9hdHRyX2dyb3VwKTsKKyBlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoYWMtPmlycSwgYWMpOworIGVycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGFjKTsKKyBlcnJfb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZHhsMzR4X3Byb2JlKTsKKworaW50IGFkeGwzNHhfcmVtb3ZlKHN0cnVjdCBhZHhsMzR4ICphYykKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmFjLT5kZXYtPmtvYmosICZhZHhsMzR4X2F0dHJfZ3JvdXApOworCWZyZWVfaXJxKGFjLT5pcnEsIGFjKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhYy0+aW5wdXQpOworCWRldl9kYmcoYWMtPmRldiwgInVucmVnaXN0ZXJlZCBhY2NlbGVyb21ldGVyXG4iKTsKKwlrZnJlZShhYyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFkeGwzNHhfcmVtb3ZlKTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURYTDM0NS8zNDYgVGhyZWUtQXhpcyBEaWdpdGFsIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYWR4bDM0eC5oIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmJjODBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQURYTDM0NS8zNDYgVGhyZWUtQXhpcyBEaWdpdGFsIEFjY2VsZXJvbWV0ZXJzIChJMkMvU1BJIEludGVyZmFjZSkKKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9BRFhMMzRYX0hfCisjZGVmaW5lIF9BRFhMMzRYX0hfCisKK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgYWR4bDM0eDsKKworc3RydWN0IGFkeGwzNHhfYnVzX29wcyB7CisJdTE2IGJ1c3R5cGU7CisJaW50ICgqcmVhZCkoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBjaGFyKTsKKwlpbnQgKCpyZWFkX2Jsb2NrKShzdHJ1Y3QgZGV2aWNlICosIHVuc2lnbmVkIGNoYXIsIGludCwgdm9pZCAqKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKK307CisKK3ZvaWQgYWR4bDM0eF9zdXNwZW5kKHN0cnVjdCBhZHhsMzR4ICphYyk7Cit2b2lkIGFkeGwzNHhfcmVzdW1lKHN0cnVjdCBhZHhsMzR4ICphYyk7CitzdHJ1Y3QgYWR4bDM0eCAqYWR4bDM0eF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCisJCQkgICAgICBib29sIGZpZm9fZGVsYXlfZGVmYXVsdCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBhZHhsMzR4X2J1c19vcHMgKmJvcHMpOworaW50IGFkeGwzNHhfcmVtb3ZlKHN0cnVjdCBhZHhsMzR4ICphYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2F0bGFzX2J0bnMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGxhc19idG5zLmMKaW5kZXggZGZhYTlhMC4uNjAxZjczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2F0bGFzX2J0bnMuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYXRsYXNfYnRucy5jCkBAIC0yMSw2ICsyMSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTYwLDEyICs2MiwxMSBAQAogCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2RldiwgYXRsYXNfa2V5bWFwW2NvZGVdLCBrZXlfZG93bik7CiAJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKIAotCQlzdGF0dXMgPSAwOworCQlzdGF0dXMgPSBBRV9PSzsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGxhczogc2hydWdnZWQgb24gdW5leHBlY3RlZCBmdW5jdGlvbiIKLQkJCSI6ZnVuY3Rpb249JXgsYWRkcmVzcz0lbHgsdmFsdWU9JXhcbiIsCisJCXByX3dhcm4oInNocnVnZ2VkIG9uIHVuZXhwZWN0ZWQgZnVuY3Rpb246IGZ1bmN0aW9uPSV4LGFkZHJlc3M9JWx4LHZhbHVlPSV4XG4iLAogCQkJZnVuY3Rpb24sICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsICh1MzIpKnZhbHVlKTsKLQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNzksNyArODAsNyBAQAogCiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dF9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdGxhczogdW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCXByX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTAyLDcgKzEwMyw3IEBACiAKIAllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRsYXM6IGNvdWxkbid0IHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCXByX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKIAkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0xMTIsMTIgKzExMywxMiBAQAogCQkJCTB4ODEsICZhY3BpX2F0bGFzX2J1dHRvbl9oYW5kbGVyLAogCQkJCSZhY3BpX2F0bGFzX2J1dHRvbl9zZXR1cCwgZGV2aWNlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBdGxhczogRXJyb3IgaW5zdGFsbGluZyBhZGRyIHNwYyBoYW5kbGVyXG4iKTsKKwkJcHJfZXJyKCJlcnJvciBpbnN0YWxsaW5nIGFkZHIgc3BjIGhhbmRsZXJcbiIpOwogCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwotCQlzdGF0dXMgPSAtRUlOVkFMOworCQllcnIgPSAtRUlOVkFMOwogCX0KIAotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBhdGxhc19hY3BpX2J1dHRvbl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQpAQCAtMTI2LDE0ICsxMjcsMTIgQEAKIAogCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwKIAkJCQkweDgxLCAmYWNwaV9hdGxhc19idXR0b25faGFuZGxlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXRsYXM6IEVycm9yIHJlbW92aW5nIGFkZHIgc3BjIGhhbmRsZXJcbiIpOwotCQlzdGF0dXMgPSAtRUlOVkFMOwotCX0KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXByX2VycigiZXJyb3IgcmVtb3ZpbmcgYWRkciBzcGMgaGFuZGxlclxuIik7CiAKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwogCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBhdGxhc19kZXZpY2VfaWRzW10gPSB7CkBAIC0xNDUsNiArMTQ0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYXRsYXNfYWNwaV9kcml2ZXIgPSB7CiAJLm5hbWUJPSBBQ1BJX0FUTEFTX05BTUUsCiAJLmNsYXNzCT0gQUNQSV9BVExBU19DTEFTUywKKwkub3duZXIJPSBUSElTX01PRFVMRSwKIAkuaWRzCT0gYXRsYXNfZGV2aWNlX2lkcywKIAkub3BzCT0gewogCQkuYWRkCT0gYXRsYXNfYWNwaV9idXR0b25fYWRkLApAQCAtMTU0LDE4ICsxNTQsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXRsYXNfYWNwaV9pbml0KHZvaWQpCiB7Ci0JaW50IHJlc3VsdDsKLQogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYXRsYXNfYWNwaV9kcml2ZXIpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXRsYXMgQUNQSTogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmF0bGFzX2FjcGlfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGF0bGFzX2FjcGlfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3B3bS1iZWVwZXIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wd20tYmVlcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMjk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wd20tYmVlcGVyLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqICBQV00gYmVlcGVyIGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RydWN0IHB3bV9iZWVwZXIgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCXN0cnVjdCBwd21fZGV2aWNlICpwd207CisJdW5zaWduZWQgbG9uZyBwZXJpb2Q7Cit9OworCisjZGVmaW5lIEhaX1RPX05BTk9TRUNPTkRTKHgpICgxMDAwMDAwMDAwVUwvKHgpKQorCitzdGF0aWMgaW50IHB3bV9iZWVwZXJfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCisJCQkgICAgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHB3bV9iZWVwZXIgKmJlZXBlciA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKKwl1bnNpZ25lZCBsb25nIHBlcmlvZDsKKworCWlmICh0eXBlICE9IEVWX1NORCB8fCB2YWx1ZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBTTkRfQkVMTDoKKwkJdmFsdWUgPSB2YWx1ZSA/IDEwMDAgOiAwOworCQlicmVhazsKKwljYXNlIFNORF9UT05FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodmFsdWUgPT0gMCkgeworCQlwd21fY29uZmlnKGJlZXBlci0+cHdtLCAwLCAwKTsKKwkJcHdtX2Rpc2FibGUoYmVlcGVyLT5wd20pOworCX0gZWxzZSB7CisJCXBlcmlvZCA9IEhaX1RPX05BTk9TRUNPTkRTKHZhbHVlKTsKKwkJcmV0ID0gcHdtX2NvbmZpZyhiZWVwZXItPnB3bSwgcGVyaW9kIC8gMiwgcGVyaW9kKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHB3bV9lbmFibGUoYmVlcGVyLT5wd20pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYmVlcGVyLT5wZXJpb2QgPSBwZXJpb2Q7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB3bV9iZWVwZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1bnNpZ25lZCBsb25nIHB3bV9pZCA9ICh1bnNpZ25lZCBsb25nKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwd21fYmVlcGVyICpiZWVwZXI7CisJaW50IGVycm9yOworCisJYmVlcGVyID0ga3phbGxvYyhzaXplb2YoKmJlZXBlciksIEdGUF9LRVJORUwpOworCWlmICghYmVlcGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJlZXBlci0+cHdtID0gcHdtX3JlcXVlc3QocHdtX2lkLCAicHdtIGJlZXBlciIpOworCisJaWYgKElTX0VSUihiZWVwZXItPnB3bSkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKGJlZXBlci0+cHdtKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgcHdtIGRldmljZTogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwliZWVwZXItPmlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFiZWVwZXItPmlucHV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3B3bV9mcmVlOworCX0KKwliZWVwZXItPmlucHV0LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCWJlZXBlci0+aW5wdXQtPm5hbWUgPSAicHdtLWJlZXBlciI7CisJYmVlcGVyLT5pbnB1dC0+cGh5cyA9ICJwd20vaW5wdXQwIjsKKwliZWVwZXItPmlucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJYmVlcGVyLT5pbnB1dC0+aWQudmVuZG9yID0gMHgwMDFmOworCWJlZXBlci0+aW5wdXQtPmlkLnByb2R1Y3QgPSAweDAwMDE7CisJYmVlcGVyLT5pbnB1dC0+aWQudmVyc2lvbiA9IDB4MDEwMDsKKworCWJlZXBlci0+aW5wdXQtPmV2Yml0WzBdID0gQklUKEVWX1NORCk7CisJYmVlcGVyLT5pbnB1dC0+c25kYml0WzBdID0gQklUKFNORF9UT05FKSB8IEJJVChTTkRfQkVMTCk7CisKKwliZWVwZXItPmlucHV0LT5ldmVudCA9IHB3bV9iZWVwZXJfZXZlbnQ7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShiZWVwZXItPmlucHV0LCBiZWVwZXIpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYmVlcGVyLT5pbnB1dCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBkZXZpY2U6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZXJyX2lucHV0X2ZyZWU7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYmVlcGVyKTsKKworCXJldHVybiAwOworCitlcnJfaW5wdXRfZnJlZToKKwlpbnB1dF9mcmVlX2RldmljZShiZWVwZXItPmlucHV0KTsKK2Vycl9wd21fZnJlZToKKwlwd21fZnJlZShiZWVwZXItPnB3bSk7CitlcnJfZnJlZToKKwlrZnJlZShiZWVwZXIpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwd21fYmVlcGVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwd21fYmVlcGVyICpiZWVwZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJlZXBlci0+aW5wdXQpOworCisJcHdtX2Rpc2FibGUoYmVlcGVyLT5wd20pOworCXB3bV9mcmVlKGJlZXBlci0+cHdtKTsKKworCWtmcmVlKGJlZXBlcik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwd21fYmVlcGVyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwd21fYmVlcGVyICpiZWVwZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChiZWVwZXItPnBlcmlvZCkKKwkJcHdtX2Rpc2FibGUoYmVlcGVyLT5wd20pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHdtX2JlZXBlcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwd21fYmVlcGVyICpiZWVwZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChiZWVwZXItPnBlcmlvZCkgeworCQlwd21fY29uZmlnKGJlZXBlci0+cHdtLCBiZWVwZXItPnBlcmlvZCAvIDIsIGJlZXBlci0+cGVyaW9kKTsKKwkJcHdtX2VuYWJsZShiZWVwZXItPnB3bSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwd21fYmVlcGVyX3BtX29wcywKKwkJCSBwd21fYmVlcGVyX3N1c3BlbmQsIHB3bV9iZWVwZXJfcmVzdW1lKTsKKworI2RlZmluZSBQV01fQkVFUEVSX1BNX09QUyAoJnB3bV9iZWVwZXJfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgUFdNX0JFRVBFUl9QTV9PUFMgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB3bV9iZWVwZXJfZHJpdmVyID0geworCS5wcm9iZQk9IHB3bV9iZWVwZXJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHB3bV9iZWVwZXJfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJwd20tYmVlcGVyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9IFBXTV9CRUVQRVJfUE1fT1BTLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwd21fYmVlcGVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwd21fYmVlcGVyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwd21fYmVlcGVyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcHdtX2JlZXBlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB3bV9iZWVwZXJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHB3bV9iZWVwZXJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQV00gYmVlcGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwd20tYmVlcGVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMgYi9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMKaW5kZXggMWRhY2FlNC4uZjNiYjkyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3NwYXJjc3Brci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYwpAQCAtMzUzLDE0ICszNTMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3BhcmNzcGtyX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyID0gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZiYmNfYmVlcF9kcml2ZXIsCi0JCQkJICAgICAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOworCWludCBlcnIgPSBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmJiY19iZWVwX2RyaXZlcik7CiAKIAlpZiAoIWVycikgewotCQllcnIgPSBvZl9yZWdpc3Rlcl9kcml2ZXIoJmdyb3Zlcl9iZWVwX2RyaXZlciwKLQkJCQkJICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisJCWVyciA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZ3JvdmVyX2JlZXBfZHJpdmVyKTsKIAkJaWYgKGVycikKLQkJCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZiYmNfYmVlcF9kcml2ZXIpOworCQkJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmJiY19iZWVwX2RyaXZlcik7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTM2OCw4ICszNjYsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3BhcmNzcGtyX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmYmJjX2JlZXBfZHJpdmVyKTsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZ3JvdmVyX2JlZXBfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYmJjX2JlZXBfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZ3JvdmVyX2JlZXBfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc3BhcmNzcGtyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3R3bDQwMzAtcHdyYnV0dG9uLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdHdsNDAzMC1wd3JidXR0b24uYwppbmRleCBlOTA2OWI4Li5mMTY5NzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvdHdsNDAzMC1wd3JidXR0b24uYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvdHdsNDAzMC1wd3JidXR0b24uYwpAQCAtNTIsNyArNTIsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgdHdsNDAzMF9wd3JidXR0b25fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19pbml0IHR3bDQwMzBfcHdyYnV0dG9uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqcHdyOwogCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpAQCAtOTUsNyArOTUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHR3bDQwMzBfcHdyYnV0dG9uX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2V4aXQgdHdsNDAzMF9wd3JidXR0b25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqcHdyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CkBAIC0xMDYsOSArMTA2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0d2w0MDMwX3B3cmJ1dHRvbl9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHR3bDQwMzBfcHdyYnV0dG9uX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHdsNDAzMF9wd3JidXR0b25fcmVtb3ZlKSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDQwMzBfcHdyYnV0dG9uX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHR3bDQwMzBfcHdyYnV0dG9uX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInR3bDQwMzBfcHdyYnV0dG9uIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCkBAIC0xMTcsNyArMTE2LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgdHdsNDAzMF9wd3JidXR0b25faW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnR3bDQwMzBfcHdyYnV0dG9uX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdHdsNDAzMF9wd3JidXR0b25fZHJpdmVyLAorCQkJdHdsNDAzMF9wd3JidXR0b25fcHJvYmUpOwogfQogbW9kdWxlX2luaXQodHdsNDAzMF9wd3JidXR0b25faW5pdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYwppbmRleCA0ZGFjOGI3Li4xMjUwMWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvd2lzdHJvbl9idG5zLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCkBAIC0xMzQ3LDcgKzEzNDcsNyBAQAogCiAJZXJyID0gbWFwX2Jpb3MoKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKIAogCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd2lzdHJvbl9kcml2ZXIpOwogCWlmIChlcnIpCkBAIC0xMzcxLDYgKzEzNzEsOCBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ3aXN0cm9uX2RyaXZlcik7CiAgZXJyX3VubWFwX2Jpb3M6CiAJdW5tYXBfYmlvcygpOworIGVycl9mcmVlX2tleW1hcDoKKwlrZnJlZShrZXltYXApOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYmNtNTk3NC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKaW5kZXggNmRlZGRlZC4uZWE2N2M0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKQEAgLTMxMiw2ICszMTIsOCBAQAogCV9fc2V0X2JpdChCVE5fVE9PTF9UUklQTEVUQVAsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAlfX3NldF9iaXQoQlROX1RPT0xfUVVBRFRBUCwgaW5wdXRfZGV2LT5rZXliaXQpOwogCV9fc2V0X2JpdChCVE5fTEVGVCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJaW5wdXRfc2V0X2V2ZW50c19wZXJfcGFja2V0KGlucHV0X2RldiwgNjApOwogfQogCiAvKiByZXBvcnQgYnV0dG9uIGRhdGEgYXMgbG9naWNhbCBidXR0b24gc3RhdGUgKi8KQEAgLTU4MCwyMyArNTgyLDMwIEBACiAgKi8KIHN0YXRpYyBpbnQgYmNtNTk3NF9zdGFydF90cmFmZmljKHN0cnVjdCBiY201OTc0ICpkZXYpCiB7Ci0JaWYgKGJjbTU5NzRfd2VsbHNwcmluZ19tb2RlKGRldiwgdHJ1ZSkpIHsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGJjbTU5NzRfd2VsbHNwcmluZ19tb2RlKGRldiwgdHJ1ZSk7CisJaWYgKGVycm9yKSB7CiAJCWRwcmludGsoMSwgImJjbTU5NzQ6IG1vZGUgc3dpdGNoIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlpZiAodXNiX3N1Ym1pdF91cmIoZGV2LT5idF91cmIsIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycm9yOworCWVycm9yID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5idF91cmIsIEdGUF9LRVJORUwpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfcmVzZXRfbW9kZTsKIAotCWlmICh1c2Jfc3VibWl0X3VyYihkZXYtPnRwX3VyYiwgR0ZQX0tFUk5FTCkpCisJZXJyb3IgPSB1c2Jfc3VibWl0X3VyYihkZXYtPnRwX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycm9yKQogCQlnb3RvIGVycl9raWxsX2J0OwogCiAJcmV0dXJuIDA7CiAKIGVycl9raWxsX2J0OgogCXVzYl9raWxsX3VyYihkZXYtPmJ0X3VyYik7Ci1lcnJvcjoKLQlyZXR1cm4gLUVJTzsKK2Vycl9yZXNldF9tb2RlOgorCWJjbTU5NzRfd2VsbHNwcmluZ19tb2RlKGRldiwgZmFsc2UpOworZXJyX291dDoKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbTU5NzRfcGF1c2VfdHJhZmZpYyhzdHJ1Y3QgYmNtNTk3NCAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKaW5kZXggNzA1NTg5ZC4uOGMzMjQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCkBAIC01MDIsNyArNTAyLDkgQEAKIAl9CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgaHcueik7CiAKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIGZpbmdlcl93aWR0aCk7CisJaWYgKFNZTl9DQVBfUEFMTURFVEVDVChwcml2LT5jYXBhYmlsaXRpZXMpKQorCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIGZpbmdlcl93aWR0aCk7CisKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBudW1fZmluZ2VycyA9PSAxKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGh3LmxlZnQpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGh3LnJpZ2h0KTsKQEAgLTYwMiw3ICs2MDQsOSBAQAogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1ksCiAJCQkgICAgIFlNSU5fTk9NSU5BTCwgcHJpdi0+eV9tYXggPzogWU1BWF9OT01JTkFMLCAwLCAwKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19QUkVTU1VSRSwgMCwgMjU1LCAwLCAwKTsKLQlfX3NldF9iaXQoQUJTX1RPT0xfV0lEVEgsIGRldi0+YWJzYml0KTsKKworCWlmIChTWU5fQ0FQX1BBTE1ERVRFQ1QocHJpdi0+Y2FwYWJpbGl0aWVzKSkKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVE9PTF9XSURUSCwgMCwgMTUsIDAsIDApOwogCiAJX19zZXRfYml0KEVWX0tFWSwgZGV2LT5ldmJpdCk7CiAJX19zZXRfYml0KEJUTl9UT1VDSCwgZGV2LT5rZXliaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCmluZGV4IGYzNGIyMmIuLmQ4ZjY4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTU3LDcgKzU3LDYgQEAKIH07CiAKIHN0cnVjdCBtb3VzZWRldiB7Ci0JaW50IGV4aXN0OwogCWludCBvcGVuOwogCWludCBtaW5vcjsKIAlzdHJ1Y3QgaW5wdXRfaGFuZGxlIGhhbmRsZTsKQEAgLTY2LDYgKzY1LDcgQEAKIAlzcGlubG9ja190IGNsaWVudF9sb2NrOyAvKiBwcm90ZWN0cyBjbGllbnRfbGlzdCAqLwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlib29sIGV4aXN0OwogCiAJc3RydWN0IGxpc3RfaGVhZCBtaXhkZXZfbm9kZTsKIAlpbnQgbWl4ZGV2X29wZW47CkBAIC03NjUsMTAgKzc2NSwxNSBAQAogewogCXN0cnVjdCBtb3VzZWRldl9jbGllbnQgKmNsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbW91c2VkZXYgKm1vdXNlZGV2ID0gY2xpZW50LT5tb3VzZWRldjsKKwl1bnNpZ25lZCBpbnQgbWFzazsKIAogCXBvbGxfd2FpdChmaWxlLCAmbW91c2VkZXYtPndhaXQsIHdhaXQpOwotCXJldHVybiAoKGNsaWVudC0+cmVhZHkgfHwgY2xpZW50LT5idWZmZXIpID8gKFBPTExJTiB8IFBPTExSRE5PUk0pIDogMCkgfAotCQkobW91c2VkZXYtPmV4aXN0ID8gMCA6IChQT0xMSFVQIHwgUE9MTEVSUikpOworCisJbWFzayA9IG1vdXNlZGV2LT5leGlzdCA/IFBPTExPVVQgfCBQT0xMV1JOT1JNIDogUE9MTEhVUCB8IFBPTExFUlI7CisJaWYgKGNsaWVudC0+cmVhZHkgfHwgY2xpZW50LT5idWZmZXIpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiBtYXNrOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb3VzZWRldl9mb3BzID0gewpAQCAtODAyLDcgKzgwNyw3IEBACiBzdGF0aWMgdm9pZCBtb3VzZWRldl9tYXJrX2RlYWQoc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldikKIHsKIAltdXRleF9sb2NrKCZtb3VzZWRldi0+bXV0ZXgpOwotCW1vdXNlZGV2LT5leGlzdCA9IDA7CisJbW91c2VkZXYtPmV4aXN0ID0gZmFsc2U7CiAJbXV0ZXhfdW5sb2NrKCZtb3VzZWRldi0+bXV0ZXgpOwogfQogCkBAIC04NjIsNyArODY3LDcgQEAKIAkJZGV2X3NldF9uYW1lKCZtb3VzZWRldi0+ZGV2LCAibW91c2UlZCIsIG1pbm9yKTsKIAogCW1vdXNlZGV2LT5taW5vciA9IG1pbm9yOwotCW1vdXNlZGV2LT5leGlzdCA9IDE7CisJbW91c2VkZXYtPmV4aXN0ID0gdHJ1ZTsKIAltb3VzZWRldi0+aGFuZGxlLmRldiA9IGlucHV0X2dldF9kZXZpY2UoZGV2KTsKIAltb3VzZWRldi0+aGFuZGxlLm5hbWUgPSBkZXZfbmFtZSgmbW91c2VkZXYtPmRldik7CiAJbW91c2VkZXYtPmhhbmRsZS5oYW5kbGVyID0gaGFuZGxlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaAppbmRleCA4NDdmNGFhLi41ZDQ4YmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1pby5oCkBAIC0yNyw2ICsyNywxMSBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX1NIX0NBWU1BTikKICNpbmNsdWRlIDxhc20vaXJxLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19QUEMpCitleHRlcm4gaW50IG9mX2k4MDQyX2tiZF9pcnE7CitleHRlcm4gaW50IG9mX2k4MDQyX2F1eF9pcnE7CisjIGRlZmluZSBJODA0Ml9LQkRfSVJRICBvZl9pODA0Ml9rYmRfaXJxCisjIGRlZmluZSBJODA0Ml9BVVhfSVJRICBvZl9pODA0Ml9hdXhfaXJxCiAjZWxzZQogIyBkZWZpbmUgSTgwNDJfS0JEX0lSUQkxCiAjIGRlZmluZSBJODA0Ml9BVVhfSVJRCTEyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXBwY2lvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXBwY2lvLmgKaW5kZXggMjkwNmUxYi4uZjcwOGM3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1wcGNpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItcHBjaW8uaApAQCAtNTIsODEgKzUyLDYgQEAKIHsKIH0KIAotI2VsaWYgZGVmaW5lZChDT05GSUdfU1BSVUNFKQotCi0jZGVmaW5lIEk4MDQyX0tCRF9JUlEgMjIKLSNkZWZpbmUgSTgwNDJfQVVYX0lSUSAyMQotCi0jZGVmaW5lIEk4MDQyX0tCRF9QSFlTX0RFU0MgInNwcnVjZXBzMi9zZXJpbzAiCi0jZGVmaW5lIEk4MDQyX0FVWF9QSFlTX0RFU0MgInNwcnVjZXBzMi9zZXJpbzEiCi0jZGVmaW5lIEk4MDQyX01VWF9QSFlTX0RFU0MgInNwcnVjZXBzMi9zZXJpbyVkIgotCi0jZGVmaW5lIEk4MDQyX0NPTU1BTkRfUkVHIDB4ZmY4MTAwMDAKLSNkZWZpbmUgSTgwNDJfREFUQV9SRUcgMHhmZjgxMDAwMQotCi1zdGF0aWMgaW5saW5lIGludCBpODA0Ml9yZWFkX2RhdGEodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGtiZF9kYXRhOwotCi0JX19yYXdfd3JpdGVsKDB4MDAwMDAwODgsIDB4ZmY1MDAwMDgpOwotCWVpZWlvKCk7Ci0KLQlfX3Jhd193cml0ZWwoMHgwMzAwMDAwMCwgMHhmZjUwMDAwYyk7Ci0JZWllaW8oKTsKLQotCWFzbSB2b2xhdGlsZSgibGlzICAgICA3LDB4ZmY4OCAgICAgICAgXG5cCi0JCSAgICAgIGxzd2kgICAgNiw3LDB4OCAgICAgICAgIFxuXAotCQkgICAgICBtciAgICAgICUwLDYiCi0JICAgICAgICAgICAgICA6ICI9ciIgKGtiZF9kYXRhKSA6OiAiNiIsICI3Iik7Ci0KLQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgMHhmZjUwMDAwYyk7Ci0JZWllaW8oKTsKLQotCXJldHVybiAodW5zaWduZWQgY2hhcikoa2JkX2RhdGEgPj4gMjQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpODA0Ml9yZWFkX3N0YXR1cyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcga2JkX3N0YXR1czsKLQotCV9fcmF3X3dyaXRlbCgweDAwMDAwMDg4LCAweGZmNTAwMDA4KTsKLQllaWVpbygpOwotCi0JX19yYXdfd3JpdGVsKDB4MDMwMDAwMDAsIDB4ZmY1MDAwMGMpOwotCWVpZWlvKCk7Ci0KLQlhc20gdm9sYXRpbGUoImxpcyAgICAgNywweGZmODggICAgICAgIFxuXAotCQkgICAgICBvcmkgICAgIDcsNywweDggICAgICAgICBcblwKLQkJICAgICAgbHN3aSAgICA2LDcsMHg4ICAgICAgICAgXG5cCi0JCSAgICAgIG1yICAgICAgJTAsNiIKLQkJICAgICAgOiAiPXIiIChrYmRfc3RhdHVzKSA6OiAiNiIsICI3Iik7Ci0KLQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgMHhmZjUwMDAwYyk7Ci0JZWllaW8oKTsKLQotCXJldHVybiAodW5zaWduZWQgY2hhcikoa2JkX3N0YXR1cyA+PiAyNCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpODA0Ml93cml0ZV9kYXRhKGludCB2YWwpCi17Ci0JKigodW5zaWduZWQgY2hhciAqKTB4ZmY4MTAwMDApID0gKGNoYXIpdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaTgwNDJfd3JpdGVfY29tbWFuZChpbnQgdmFsKQotewotCSooKHVuc2lnbmVkIGNoYXIgKikweGZmODEwMDAxKSA9IChjaGFyKXZhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaTgwNDJfcGxhdGZvcm1faW5pdCh2b2lkKQotewotCWk4MDQyX3Jlc2V0ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGk4MDQyX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLX0KLQogI2Vsc2UKIAogI2luY2x1ZGUgImk4MDQyLWlvLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXNwYXJjaW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oCmluZGV4IDA0ZTMyZjIuLmNiMmEyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oCkBAIC01OCw5ICs1OCw5IEBACiAJCWlmICghc3RyY21wKGRwLT5uYW1lLCBPQlBfUFMyS0JEX05BTUUxKSB8fAogCQkgICAgIXN0cmNtcChkcC0+bmFtZSwgT0JQX1BTMktCRF9OQU1FMikpIHsKIAkJCXN0cnVjdCBvZl9kZXZpY2UgKmtiZCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoZHApOwotCQkJdW5zaWduZWQgaW50IGlycSA9IGtiZC0+aXJxc1swXTsKKwkJCXVuc2lnbmVkIGludCBpcnEgPSBrYmQtPmFyY2hkYXRhLmlycXNbMF07CiAJCQlpZiAoaXJxID09IDB4ZmZmZmZmZmYpCi0JCQkJaXJxID0gb3AtPmlycXNbMF07CisJCQkJaXJxID0gb3AtPmFyY2hkYXRhLmlycXNbMF07CiAJCQlpODA0Ml9rYmRfaXJxID0gaXJxOwogCQkJa2JkX2lvYmFzZSA9IG9mX2lvcmVtYXAoJmtiZC0+cmVzb3VyY2VbMF0sCiAJCQkJCQkwLCA4LCAia2JkIik7CkBAIC02OCw5ICs2OCw5IEBACiAJCX0gZWxzZSBpZiAoIXN0cmNtcChkcC0+bmFtZSwgT0JQX1BTMk1TX05BTUUxKSB8fAogCQkJICAgIXN0cmNtcChkcC0+bmFtZSwgT0JQX1BTMk1TX05BTUUyKSkgewogCQkJc3RydWN0IG9mX2RldmljZSAqbXMgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKLQkJCXVuc2lnbmVkIGludCBpcnEgPSBtcy0+aXJxc1swXTsKKwkJCXVuc2lnbmVkIGludCBpcnEgPSBtcy0+YXJjaGRhdGEuaXJxc1swXTsKIAkJCWlmIChpcnEgPT0gMHhmZmZmZmZmZikKLQkJCQlpcnEgPSBvcC0+aXJxc1swXTsKKwkJCQlpcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAkJCWk4MDQyX2F1eF9pcnEgPSBpcnE7CiAJCX0KIApAQCAtMTE2LDggKzExNiw3IEBACiAJCWlmICgha2JkX2lvYmFzZSkKIAkJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7Ci0JCWludCBlcnIgPSBvZl9yZWdpc3Rlcl9kcml2ZXIoJnNwYXJjX2k4MDQyX2RyaXZlciwKLQkJCQkJICAgICAmb2ZfYnVzX3R5cGUpOworCQlpbnQgZXJyID0gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZzcGFyY19pODA0Ml9kcml2ZXIpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIApAQCAtMTQxLDcgKzE0MCw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAogCWlmIChzdHJjbXAocm9vdC0+bmFtZSwgIlNVTlcsSmF2YVN0YXRpb24tMSIpKQotCQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmc3BhcmNfaTgwNDJfZHJpdmVyKTsKKwkJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnNwYXJjX2k4MDQyX2RyaXZlcik7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKaW5kZXggNjQ0MGE4Zi4uMjU4Yjk4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwpAQCAtODYxLDkgKzg2MSw2IEBACiAJdW5zaWduZWQgY2hhciBwYXJhbTsKIAlpbnQgaSA9IDA7CiAKLQlpZiAoIWk4MDQyX3Jlc2V0KQotCQlyZXR1cm4gMDsKLQogCS8qCiAJICogV2UgdHJ5IHRoaXMgNSB0aW1lczsgb24gc29tZSByZWFsbHkgZnJhZ2lsZSBzeXN0ZW1zIHRoaXMgZG9lcyBub3QKIAkgKiB0YWtlIHRoZSBmaXJzdCB0aW1lLi4uCkBAIC0xMDIwLDcgKzEwMTcsOCBAQAogICogUmVzZXQgdGhlIGNvbnRyb2xsZXIgaWYgcmVxdWVzdGVkLgogICovCiAKLQlpODA0Ml9jb250cm9sbGVyX3NlbGZ0ZXN0KCk7CisJaWYgKGk4MDQyX3Jlc2V0KQorCQlpODA0Ml9jb250cm9sbGVyX3NlbGZ0ZXN0KCk7CiAKIC8qCiAgKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjb250cm9sIHJlZ2lzdGVyIHNldHRpbmcuCkBAIC0xMDk0LDIzICsxMDkyLDExIEBACiAjaWZkZWYgQ09ORklHX1BNCiAKIC8qCi0gKiBIZXJlIHdlIHRyeSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBCSU9TIHNldHRpbmdzIHRvIGF2b2lkCi0gKiB1cHNldHRpbmcgaXQuCi0gKi8KLQotc3RhdGljIGludCBpODA0Ml9wbV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaTgwNDJfY29udHJvbGxlcl9yZXNldCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCiAgKiBIZXJlIHdlIHRyeSB0byByZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gYSBzdGF0ZSB3ZSBoYWQKICAqIGJlZm9yZSBzdXNwZW5kaW5nLgogICovCiAKLXN0YXRpYyBpbnQgaTgwNDJfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGk4MDQyX2NvbnRyb2xsZXJfcmVzdW1lKGJvb2wgZm9yY2VfcmVzZXQpCiB7CiAJaW50IGVycm9yOwogCkBAIC0xMTE4LDkgKzExMDQsMTEgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWVycm9yID0gaTgwNDJfY29udHJvbGxlcl9zZWxmdGVzdCgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCWlmIChpODA0Ml9yZXNldCB8fCBmb3JjZV9yZXNldCkgeworCQllcnJvciA9IGk4MDQyX2NvbnRyb2xsZXJfc2VsZnRlc3QoKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KIAogLyoKICAqIFJlc3RvcmUgb3JpZ2luYWwgQ1RSIHZhbHVlIGFuZCBkaXNhYmxlIGFsbCBwb3J0cwpAQCAtMTE2Miw2ICsxMTUwLDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBIZXJlIHdlIHRyeSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBCSU9TIHNldHRpbmdzIHRvIGF2b2lkCisgKiB1cHNldHRpbmcgaXQuCisgKi8KKworc3RhdGljIGludCBpODA0Ml9wbV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaTgwNDJfY29udHJvbGxlcl9yZXNldCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgwNDJfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIE9uIHJlc3VtZSBmcm9tIFMyUiB3ZSBhbHdheXMgdHJ5IHRvIHJlc2V0IHRoZSBjb250cm9sbGVyCisJICogdG8gYnJpbmcgaXQgaW4gYSBzYW5lIHN0YXRlLiAoSW4gY2FzZSBvZiBTMkQgd2UgZXhwZWN0CisJICogQklPUyB0byByZXNldCB0aGUgY29udHJvbGxlciBmb3IgdXMuKQorCSAqLworCXJldHVybiBpODA0Ml9jb250cm9sbGVyX3Jlc3VtZSh0cnVlKTsKK30KKwogc3RhdGljIGludCBpODA0Ml9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpODA0Ml9pbnRlcnJ1cHQoMCwgTlVMTCk7CkBAIC0xMTY5LDkgKzExNzksMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpODA0Ml9wbV9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaTgwNDJfY29udHJvbGxlcl9yZXN1bWUoZmFsc2UpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaTgwNDJfcG1fb3BzID0gewogCS5zdXNwZW5kCT0gaTgwNDJfcG1fcmVzZXQsCi0JLnJlc3VtZQkJPSBpODA0Ml9wbV9yZXN0b3JlLAorCS5yZXN1bWUJCT0gaTgwNDJfcG1fcmVzdW1lLAogCS50aGF3CQk9IGk4MDQyX3BtX3RoYXcsCiAJLnBvd2Vyb2ZmCT0gaTgwNDJfcG1fcmVzZXQsCiAJLnJlc3RvcmUJPSBpODA0Ml9wbV9yZXN0b3JlLApAQCAtMTM4OSw5ICsxNDA0LDExIEBACiAKIAlpODA0Ml9wbGF0Zm9ybV9kZXZpY2UgPSBkZXY7CiAKLQllcnJvciA9IGk4MDQyX2NvbnRyb2xsZXJfc2VsZnRlc3QoKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwlpZiAoaTgwNDJfcmVzZXQpIHsKKwkJZXJyb3IgPSBpODA0Ml9jb250cm9sbGVyX3NlbGZ0ZXN0KCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CiAKIAllcnJvciA9IGk4MDQyX2NvbnRyb2xsZXJfaW5pdCgpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKaW5kZXggNDE1ZjYzMC4uY2UwYjQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKQEAgLTE1OCw2ICsxNTgsMzkgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCB3YWNvbV9kdHVfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tKQoreworCXN0cnVjdCB3YWNvbV9mZWF0dXJlcyAqZmVhdHVyZXMgPSAmd2Fjb20tPmZlYXR1cmVzOworCWNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHdhY29tLT5pbnB1dDsKKwlpbnQgcHJveCA9IGRhdGFbMV0gJiAweDIwLCBwcmVzc3VyZTsKKworCWRiZygid2Fjb21fZHR1X2lycTogcmVjZWl2ZWQgcmVwb3J0ICMlZCIsIGRhdGFbMF0pOworCisJaWYgKHByb3gpIHsKKwkJLyogR29pbmcgaW50byBwcm94aW1pdHkgc2VsZWN0IHRvb2wgKi8KKwkJd2Fjb20tPnRvb2xbMF0gPSAoZGF0YVsxXSAmIDB4MGMpID8gQlROX1RPT0xfUlVCQkVSIDogQlROX1RPT0xfUEVOOworCQlpZiAod2Fjb20tPnRvb2xbMF0gPT0gQlROX1RPT0xfUEVOKQorCQkJd2Fjb20tPmlkWzBdID0gU1RZTFVTX0RFVklDRV9JRDsKKwkJZWxzZQorCQkJd2Fjb20tPmlkWzBdID0gRVJBU0VSX0RFVklDRV9JRDsKKwl9CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1NUWUxVUywgZGF0YVsxXSAmIDB4MDIpOworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9TVFlMVVMyLCBkYXRhWzFdICYgMHgxMCk7CisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbMl0pKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfWSwgbGUxNl90b19jcHVwKChfX2xlMTYgKikmZGF0YVs0XSkpOworCXByZXNzdXJlID0gKChkYXRhWzddICYgMHgwMSkgPDwgOCkgfCBkYXRhWzZdOworCWlmIChwcmVzc3VyZSA8IDApCisJCXByZXNzdXJlID0gZmVhdHVyZXMtPnByZXNzdXJlX21heCArIHByZXNzdXJlICsgMTsKKwlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfUFJFU1NVUkUsIHByZXNzdXJlKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDA1KTsKKwlpZiAoIXByb3gpIC8qIG91dC1wcm94ICovCisJCXdhY29tLT5pZFswXSA9IDA7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgd2Fjb20tPnRvb2xbMF0sIHByb3gpOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19NSVNDLCB3YWNvbS0+aWRbMF0pOworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IHdhY29tX2dyYXBoaXJlX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKIHsKIAlzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKmZlYXR1cmVzID0gJndhY29tLT5mZWF0dXJlczsKQEAgLTg0NSw2ICs4NzgsMTAgQEAKIAkJc3luYyA9IHdhY29tX3B0dV9pcnEod2Fjb21fd2FjKTsKIAkJYnJlYWs7CiAKKwljYXNlIERUVToKKwkJc3luYyA9IHdhY29tX2R0dV9pcnEod2Fjb21fd2FjKTsKKwkJYnJlYWs7CisKIAljYXNlIElOVFVPUzoKIAljYXNlIElOVFVPUzNTOgogCWNhc2UgSU5UVU9TMzoKQEAgLTEwMzAsNiArMTA2Nyw3IEBACiAKIAljYXNlIFBMOgogCWNhc2UgUFRVOgorCWNhc2UgRFRVOgogCQlfX3NldF9iaXQoQlROX1RPT0xfUEVOLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fU1RZTFVTLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fU1RZTFVTMiwgaW5wdXRfZGV2LT5rZXliaXQpOwpAQCAtMTE1NSw2ICsxMTkzLDEwIEBACiAJeyAiV2Fjb20gQ2ludGlxIDEyV1giLCAgICBXQUNPTV9QS0dMRU5fSU5UVU9TLCAgICA1MzAyMCwgMzM0NDAsIDEwMjMsIDYzLCBXQUNPTV9CRUUgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhDNyA9CiAJeyAiV2Fjb20gRFRVMTkzMSIsICAgICAgICBXQUNPTV9QS0dMRU5fR1JBUEhJUkUsICAzNzgzMiwgMzAzMDUsICA1MTEsICAwLCBQTCB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weENFID0KKwl7ICJXYWNvbSBEVFUyMjMxIiwgICAgICAgIFdBQ09NX1BLR0xFTl9HUkFQSElSRSwgIDQ3ODY0LCAyNzAxMSwgIDUxMSwgIDAsIERUVSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEYwID0KKwl7ICJXYWNvbSBEVFUxNjMxIiwgICAgICAgIFdBQ09NX1BLR0xFTl9HUkFQSElSRSwgIDM0NjIzLCAxOTU1MywgIDUxMSwgIDAsIERUVSB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weENDID0KIAl7ICJXYWNvbSBDaW50aXEgMjFVWDIiLCAgIFdBQ09NX1BLR0xFTl9JTlRVT1MsICAgIDg3MjAwLCA2NTYwMCwgMjA0NywgNjMsIFdBQ09NXzIxVVgyIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4OTAgPQpAQCAtMTIzNCw2ICsxMjc2LDggQEAKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHhDNSkgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHhDNikgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHhDNykgfSwKKwl7IFVTQl9ERVZJQ0VfV0FDT00oMHhDRSkgfSwKKwl7IFVTQl9ERVZJQ0VfV0FDT00oMHhGMCkgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHhDQykgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHg5MCkgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHg5MykgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5oIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmgKaW5kZXggODU0YjkyMC4uOTllMWE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmgKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmgKQEAgLTQzLDYgKzQzLDcgQEAKIAlXQUNPTV9HNCwKIAlQVFUsCiAJUEwsCisJRFRVLAogCUlOVFVPUywKIAlJTlRVT1MzUywKIAlJTlRVT1MzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCmluZGV4IDNiOWQ1ZTIuLjYxZjM1MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKQEAgLTU1LDM3ICs1NSwzNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ3ODc3LgogCi1jb25maWcgVE9VQ0hTQ1JFRU5fQUQ3ODc5X0kyQwotCXRyaXN0YXRlICJBRDc4NzkgYmFzZWQgdG91Y2hzY3JlZW5zOiBBRDc4NzktMSBJMkMgSW50ZXJmYWNlIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IFRPVUNIU0NSRUVOX0FENzg3OQorY29uZmlnIFRPVUNIU0NSRUVOX0FENzg3OQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc4NzktMS9BRDc4ODktMSB0b3VjaHNjcmVlbiBpbnRlcmZhY2UiCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIHRvdWNoc2NyZWVuIGludGVyZmFjZSB1c2luZyB0aGUKLQkgIEFENzg3OS0xL0FENzg4OS0xIGNvbnRyb2xsZXIsIGFuZCB5b3VyIGJvYXJkLXNwZWNpZmljCi0JICBpbml0aWFsaXphdGlvbiBjb2RlIGluY2x1ZGVzIHRoYXQgaW4gaXRzIHRhYmxlIG9mIEkyQyBkZXZpY2VzLgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IGEgdG91Y2hzY3JlZW4gaW50ZXJmYWNlIHVzaW5nCisJICB0aGUgQUQ3ODc5LTEvQUQ3ODg5LTEgY29udHJvbGxlci4KIAotCSAgSWYgdW5zdXJlLCBzYXkgTiAoYnV0IGl0J3Mgc2FmZSB0byBzYXkgIlkiKS4KKwkgIFlvdSBzaG91bGQgc2VsZWN0IGEgYnVzIGNvbm5lY3Rpb24gdG9vLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDc4NzkuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9BRDc4NzlfSTJDCisJdHJpc3RhdGUgInN1cHBvcnQgSTJDIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fQUQ3ODc5ICYmIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgQUQ3ODc5LTEvQUQ3ODg5LTEgaG9va2VkIHRvIGFuIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzg3OS1pMmMuCisKIGNvbmZpZyBUT1VDSFNDUkVFTl9BRDc4NzlfU1BJCi0JdHJpc3RhdGUgIkFENzg3OSBiYXNlZCB0b3VjaHNjcmVlbnM6IEFENzg3OSBTUEkgSW50ZXJmYWNlIgotCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBUT1VDSFNDUkVFTl9BRDc4NzlfSTJDID0gbgotCXNlbGVjdCBUT1VDSFNDUkVFTl9BRDc4NzkKKwl0cmlzdGF0ZSAic3VwcG9ydCBTUEkgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBUT1VDSFNDUkVFTl9BRDc4NzkgJiYgU1BJX01BU1RFUgogCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSB0b3VjaHNjcmVlbiBpbnRlcmZhY2UgdXNpbmcgdGhlCi0JICBBRDc4NzkvQUQ3ODg5IGNvbnRyb2xsZXIsIGFuZCB5b3VyIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCi0JICBjb2RlIGluY2x1ZGVzIHRoYXQgaW4gaXRzIHRhYmxlIG9mIFNQSSBkZXZpY2VzLgorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBBRDc4NzktMS9BRDc4ODktMSBob29rZWQgdG8gYSBTUEkgYnVzLgogCiAJICBJZiB1bnN1cmUsIHNheSBOIChidXQgaXQncyBzYWZlIHRvIHNheSAiWSIpLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDc4NzkuCi0KLWNvbmZpZyBUT1VDSFNDUkVFTl9BRDc4NzkKLQl0cmlzdGF0ZQotCWRlZmF1bHQgbgorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzg3OS1zcGkuCiAKIGNvbmZpZyBUT1VDSFNDUkVFTl9CSVRTWQogCXRyaXN0YXRlICJDb21wYXEgaVBBUSBIMzYwMCAoQml0c3kpIHRvdWNoc2NyZWVuIgpAQCAtOTksNiArOTgsMjAgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGgzNjAwX3RzX2lucHV0LgogCitjb25maWcgVE9VQ0hTQ1JFRU5fQ1k4Q1RNRzExMAorCXRyaXN0YXRlICJjeThjdG1nMTEwIHRvdWNoc2NyZWVuIgorCWRlcGVuZHMgb24gSTJDCisJZGVwZW5kcyBvbiBHUElPTElCCisKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgY3k4Y3RtZzExMCBjYXBhY2l0aXZlIHRvdWNoc2NyZWVuIG9uCisJICBhbiBBQVZBIGRldmljZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3k4Y3RtZzExMF90cy4KKwogY29uZmlnIFRPVUNIU0NSRUVOX0RBOTAzNAogCXRyaXN0YXRlICJUb3VjaHNjcmVlbiBzdXBwb3J0IGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzQiCiAJZGVwZW5kcyBvbiBQTUlDX0RBOTAzWApAQCAtMjkyLDYgKzMwNSwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGVubW91bnQuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9RVDYwMjI0MAorCXRyaXN0YXRlICJRVDYwMjI0MCBJMkMgVG91Y2hzY3JlZW4iCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHRoZSBBVDQyUVQ2MDIyNDAvQVRNWFQyMjQgSTJDIHRvdWNoc2NyZWVuCisJICBjb25uZWN0ZWQgdG8geW91ciBzeXN0ZW0uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHF0NjAyMjQwX3RzLgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fTUlHT1IKIAl0cmlzdGF0ZSAiUmVuZXNhcyBNSUdPLVIgdG91Y2hzY3JlZW4iCiAJZGVwZW5kcyBvbiBTSF9NSUdPUiAmJiBJMkMKQEAgLTU0MCw5ICs1NjUsOSBAQAogCWJvb2wgIlp5dHJvbmljIGNvbnRyb2xsZXIiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBUT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFCiAKLWNvbmZpZyBUT1VDSFNDUkVFTl9VU0JfRVRUX1RDNVVICitjb25maWcgVE9VQ0hTQ1JFRU5fVVNCX0VUVF9UQzQ1VVNCCiAJZGVmYXVsdCB5Ci0JYm9vbCAiRVQmVCBUQzVVSCB0b3VjaHNjcmVlbiBjb250cm9sZXIgc3VwcG9ydCIgaWYgRU1CRURERUQKKwlib29sICJFVCZUIFVTQiBzZXJpZXMgVEM0VU0vVEM1VUggdG91Y2hzY3JlZW4gY29udHJvbGVyIHN1cHBvcnQiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBUT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFCiAKIGNvbmZpZyBUT1VDSFNDUkVFTl9VU0JfTkVYSU8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCmluZGV4IDQ5Nzk2NGEuLmJkNmYzMGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKQEAgLTksOSArOSwxMyBAQAogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOXzg4UE04NjBYKQkrPSA4OHBtODYweC10cy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3KQkrPSBhZDc4Nzcubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSkJKz0gYWQ3ODc5Lm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDKQkrPSBhZDc4NzktaTJjLm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKQkrPSBhZDc4Nzktc3BpLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KQkrPSBhZHM3ODQ2Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9BVE1FTF9UU0FEQ0MpCSs9IGF0bWVsX3RzYWRjYy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQklUU1kpCQkrPSBoMzYwMF90c19pbnB1dC5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQ1k4Q1RNRzExMCkJKz0gY3k4Y3RtZzExMF90cy5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fREE5MDM0KQkrPSBkYTkwMzQtdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0RZTkFQUk8pCSs9IGR5bmFwcm8ubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0hBTVBTSElSRSkJKz0gaGFtcHNoaXJlLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSkJCSs9IGd1bnplLm8KQEAgLTMwLDYgKzM0LDcgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFKQkrPSB1c2J0b3VjaHNjcmVlbi5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fUENBUCkJCSs9IHBjYXBfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UKQkrPSBwZW5tb3VudC5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fUVQ2MDIyNDApCSs9IHF0NjAyMjQwX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9TM0MyNDEwKQkrPSBzM2MyNDEwX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzKQkrPSB0b3VjaGl0MjEzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUKQkrPSB0b3VjaHJpZ2h0Lm8KQEAgLTM4LDcgKzQzLDYgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwKQkrPSB1Y2IxNDAwX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9XQUNPTV9XODAwMSkJKz0gd2Fjb21fdzgwMDEubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWCkJKz0gd205N3h4LXRzLm8KLW9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9EQTkwMzQpCSs9IGRhOTAzNC10cy5vCiB3bTk3eHgtdHMtJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzA1KQkrPSB3bTk3MDUubwogd205N3h4LXRzLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcxMikJKz0gd205NzEyLm8KIHdtOTd4eC10cy0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTMpCSs9IHdtOTcxMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1pMmMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmEzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1pMmMuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIEFENzg3OS0xL0FENzg4OS0xIHRvdWNoc2NyZWVuIChJMkMgYnVzKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIE1pY2hhZWwgSGVubmVyaWNoLCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgkvKiBCVVNfSTJDICovCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImFkNzg3OS5oIgorCisjZGVmaW5lIEFENzg3OV9ERVZJRAkJMHg3OQkvKiBBRDc4NzktMS9BRDc4ODktMSAqLworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFkNzg3OV9pMmNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgYWQ3ODc5ICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWQ3ODc5X3N1c3BlbmQodHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ3ODc5X2kyY19yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3ODc5ICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWQ3ODc5X3Jlc3VtZSh0cyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjIGRlZmluZSBhZDc4NzlfaTJjX3N1c3BlbmQgTlVMTAorIyBkZWZpbmUgYWQ3ODc5X2kyY19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCisvKiBBbGwgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLgorICogQUQ3ODc5IHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbi4KKyAqLworc3RhdGljIGludCBhZDc4NzlfaTJjX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKworCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3ODc5X2kyY19tdWx0aV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgdTggZmlyc3RfcmVnLCB1OCBjb3VudCwgdTE2ICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCBpZHg7CisKKwlpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIGZpcnN0X3JlZywgY291bnQgKiAyLCAodTggKilidWYpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgKytpZHgpCisJCWJ1ZltpZHhdID0gc3dhYjE2KGJ1ZltpZHhdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzg3OV9pMmNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWcsIHUxNiB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc5X2J1c19vcHMgYWQ3ODc5X2kyY19idXNfb3BzID0geworCS5idXN0eXBlCT0gQlVTX0kyQywKKwkucmVhZAkJPSBhZDc4NzlfaTJjX3JlYWQsCisJLm11bHRpX3JlYWQJPSBhZDc4NzlfaTJjX211bHRpX3JlYWQsCisJLndyaXRlCQk9IGFkNzg3OV9pMmNfd3JpdGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDc4NzlfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZDc4NzkgKnRzOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiU01CVVMgV29yZCBEYXRhIG5vdCBTdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0cyA9IGFkNzg3OV9wcm9iZSgmY2xpZW50LT5kZXYsIEFENzg3OV9ERVZJRCwgY2xpZW50LT5pcnEsCisJCQkgICZhZDc4NzlfaTJjX2J1c19vcHMpOworCWlmIChJU19FUlIodHMpKQorCQlyZXR1cm4gUFRSX0VSUih0cyk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ3ODc5X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3ODc5ICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWQ3ODc5X3JlbW92ZSh0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzg3OV9pZFtdID0geworCXsgImFkNzg3OSIsIDAgfSwKKwl7ICJhZDc4ODkiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkNzg3OV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZDc4NzlfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDc4NzkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZDc4NzlfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ3ODc5X2kyY19yZW1vdmUpLAorCS5zdXNwZW5kCT0gYWQ3ODc5X2kyY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWQ3ODc5X2kyY19yZXN1bWUsCisJLmlkX3RhYmxlCT0gYWQ3ODc5X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWQ3ODc5X2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZDc4NzlfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDc4NzlfaTJjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWQ3ODc5X2kyY19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkNzg3OV9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNzg3OV9pMmNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFENzg3OSgtMSkgdG91Y2hzY3JlZW4gSTJDIGJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaTJjOmFkNzg3OSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4Nzktc3BpLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM2ZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LXNwaS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQUQ3ODc5L0FENzg4OSB0b3VjaHNjcmVlbiAoU1BJIGJ1cykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4JLyogQlVTX1NQSSAqLworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgImFkNzg3OS5oIgorCisjZGVmaW5lIEFENzg3OV9ERVZJRAkJMHg3QQkvKiBBRDc4NzkvQUQ3ODg5ICovCisKKyNkZWZpbmUgTUFYX1NQSV9GUkVRX0haICAgICAgNTAwMDAwMAorI2RlZmluZSBBRDc4NzlfQ01EX01BR0lDICAgICAweEUwMDAKKyNkZWZpbmUgQUQ3ODc5X0NNRF9SRUFEICAgICAgKDEgPDwgMTApCisjZGVmaW5lIEFENzg3OV9DTUQocmVnKSAgICAgIChBRDc4NzlfQ01EX01BR0lDIHwgKChyZWcpICYgMHhGKSkKKyNkZWZpbmUgQUQ3ODc5X1dSSVRFQ01EKHJlZykgKEFENzg3OV9DTUQocmVnKSkKKyNkZWZpbmUgQUQ3ODc5X1JFQURDTUQocmVnKSAgKEFENzg3OV9DTUQocmVnKSB8IEFENzg3OV9DTURfUkVBRCkKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZDc4Nzlfc3BpX3N1c3BlbmQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IGFkNzg3OSAqdHMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWFkNzg3OV9zdXNwZW5kKHRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzg3OV9zcGlfcmVzdW1lKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkNzg3OSAqdHMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWFkNzg3OV9yZXN1bWUodHMpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorIyBkZWZpbmUgYWQ3ODc5X3NwaV9zdXNwZW5kIE5VTEwKKyMgZGVmaW5lIGFkNzg3OV9zcGlfcmVzdW1lICBOVUxMCisjZW5kaWYKKworLyoKKyAqIGFkNzg3OV9yZWFkL3dyaXRlIGFyZSBvbmx5IHVzZWQgZm9yIGluaXRpYWwgc2V0dXAgYW5kIGZvciBzeXNmcyBjb250cm9scy4KKyAqIFRoZSBtYWluIHRyYWZmaWMgaXMgZG9uZSBpbiBhZDc4NzlfY29sbGVjdCgpLgorICovCisKK3N0YXRpYyBpbnQgYWQ3ODc5X3NwaV94ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICB1MTYgY21kLCB1OCBjb3VudCwgdTE2ICp0eF9idWYsIHUxNiAqcnhfYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcnM7CisJdm9pZCAqc3BpX2RhdGE7CisJdTE2ICpjb21tYW5kOworCXUxNiAqX3J4X2J1ZiA9IF9yeF9idWY7IC8qIHNodXQgZ2NjIHVwICovCisJdTggaWR4OworCWludCByZXQ7CisKKwl4ZmVycyA9IHNwaV9kYXRhID0ga3phbGxvYyhzaXplb2YoKnhmZXJzKSAqIChjb3VudCArIDIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwaV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwljb21tYW5kID0gc3BpX2RhdGE7CisJY29tbWFuZFswXSA9IGNtZDsKKwlpZiAoY291bnQgPT0gMSkgeworCQkvKiBhZDc4Nzlfc3BpX3tyZWFkLHdyaXRlfSBnYXZlIHVzIGJ1ZiBvbiBzdGFjayAqLworCQljb21tYW5kWzFdID0gKnR4X2J1ZjsKKwkJdHhfYnVmID0gJmNvbW1hbmRbMV07CisJCV9yeF9idWYgPSByeF9idWY7CisJCXJ4X2J1ZiA9ICZjb21tYW5kWzJdOworCX0KKworCSsreGZlcnM7CisJeGZlcnNbMF0udHhfYnVmID0gY29tbWFuZDsKKwl4ZmVyc1swXS5sZW4gPSAyOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJKyt4ZmVyczsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7ICsraWR4KSB7CisJCWlmIChyeF9idWYpCisJCQl4ZmVyc1tpZHhdLnJ4X2J1ZiA9ICZyeF9idWZbaWR4XTsKKwkJaWYgKHR4X2J1ZikKKwkJCXhmZXJzW2lkeF0udHhfYnVmID0gJnR4X2J1ZltpZHhdOworCQl4ZmVyc1tpZHhdLmxlbiA9IDI7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1tpZHhdLCAmbXNnKTsKKwl9CisKKwlyZXQgPSBzcGlfc3luYyhzcGksICZtc2cpOworCisJaWYgKGNvdW50ID09IDEpCisJCV9yeF9idWZbMF0gPSBjb21tYW5kWzJdOworCisJa2ZyZWUoc3BpX2RhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc4Nzlfc3BpX211bHRpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1MTYgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJcmV0dXJuIGFkNzg3OV9zcGlfeGZlcihzcGksIEFENzg3OV9SRUFEQ01EKGZpcnN0X3JlZyksIGNvdW50LCBOVUxMLCBidWYpOworfQorCitzdGF0aWMgaW50IGFkNzg3OV9zcGlfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXUxNiByZXQsIGR1bW15OworCisJcmV0dXJuIGFkNzg3OV9zcGlfeGZlcihzcGksIEFENzg3OV9SRUFEQ01EKHJlZyksIDEsICZkdW1teSwgJnJldCkgPyA6IHJldDsKK30KKworc3RhdGljIGludCBhZDc4Nzlfc3BpX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJdTE2IGR1bW15OworCisJcmV0dXJuIGFkNzg3OV9zcGlfeGZlcihzcGksIEFENzg3OV9XUklURUNNRChyZWcpLCAxLCAmdmFsLCAmZHVtbXkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3OV9idXNfb3BzIGFkNzg3OV9zcGlfYnVzX29wcyA9IHsKKwkuYnVzdHlwZQk9IEJVU19TUEksCisJLnJlYWQJCT0gYWQ3ODc5X3NwaV9yZWFkLAorCS5tdWx0aV9yZWFkCT0gYWQ3ODc5X3NwaV9tdWx0aV9yZWFkLAorCS53cml0ZQkJPSBhZDc4Nzlfc3BpX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3ODc5X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDc4NzkgKnRzOworCWludCBlcnI7CisKKwkvKiBkb24ndCBleGNlZWQgbWF4IHNwZWNpZmllZCBTUEkgQ0xLIGZyZXF1ZW5jeSAqLworCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IE1BWF9TUElfRlJFUV9IWikgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIlNQSSBDTEsgJWQgSHo/XG4iLCBzcGktPm1heF9zcGVlZF9oeik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaS0+Yml0c19wZXJfd29yZCA9IDE2OworCWVyciA9IHNwaV9zZXR1cChzcGkpOworCWlmIChlcnIpIHsKKwkgICAgICAgIGRldl9kYmcoJnNwaS0+ZGV2LCAic3BpIG1hc3RlciBkb2Vzbid0IHN1cHBvcnQgMTYgYml0cy93b3JkXG4iKTsKKwkgICAgICAgIHJldHVybiBlcnI7CisJfQorCisJdHMgPSBhZDc4NzlfcHJvYmUoJnNwaS0+ZGV2LCBBRDc4NzlfREVWSUQsIHNwaS0+aXJxLCAmYWQ3ODc5X3NwaV9idXNfb3BzKTsKKwlpZiAoSVNfRVJSKHRzKSkKKwkJcmV0dXJuIFBUUl9FUlIodHMpOworCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzg3OV9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkNzg3OSAqdHMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWFkNzg3OV9yZW1vdmUodHMpOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDc4Nzlfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDc4NzkiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQ3ODc5X3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkNzg3OV9zcGlfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGFkNzg3OV9zcGlfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFkNzg3OV9zcGlfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWQ3ODc5X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzg3OV9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkNzg3OV9zcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZDc4Nzlfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzg3OV9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNzg3OV9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFENzg3OSgtMSkgdG91Y2hzY3JlZW4gU1BJIGJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygic3BpOmFkNzg3OSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKaW5kZXggNGIzMmZiNC4uYmE2ZjBiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5jCkBAIC0xLDI1ICsxLDkgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICogQUQ3ODc5L0FENzg4OSBiYXNlZCB0b3VjaHNjcmVlbiBhbmQgR1BJTyBkcml2ZXIKICAqCi0gKiBEZXNjcmlwdGlvbjoJQUQ3ODc5L0FENzg4OSBiYXNlZCB0b3VjaHNjcmVlbiwgYW5kIEdQSU8gZHJpdmVyCi0gKgkJKEkyQy9TUEkgSW50ZXJmYWNlKQorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBCdWdzOiAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICoKICAqIEhpc3Rvcnk6CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgQnJvd25lbGwKQEAgLTQ0LDEyICsyOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3OS5oPgorI2luY2x1ZGUgImFkNzg3OS5oIgogCiAjZGVmaW5lIEFENzg3OV9SRUdfWkVST1MJCTAKICNkZWZpbmUgQUQ3ODc5X1JFR19DVFJMMQkJMQpAQCAtMTIwLDMwICsxMDQsMTkgQEAKICNkZWZpbmUJTUFYXzEyQklUCQkJKCgxPDwxMiktMSkKICNkZWZpbmUJVFNfUEVOX1VQX1RJTUVPVVQJCW1zZWNzX3RvX2ppZmZpZXMoNTApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKLSNkZWZpbmUgQUQ3ODc5X0RFVklECQkweDdBCi10eXBlZGVmIHN0cnVjdCBzcGlfZGV2aWNlCWJ1c19kZXZpY2U7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDX01PRFVMRSkKLSNkZWZpbmUgQUQ3ODc5X0RFVklECQkweDc5Ci10eXBlZGVmIHN0cnVjdCBpMmNfY2xpZW50CWJ1c19kZXZpY2U7Ci0jZW5kaWYKLQogc3RydWN0IGFkNzg3OSB7Ci0JYnVzX2RldmljZQkJKmJ1czsKKwljb25zdCBzdHJ1Y3QgYWQ3ODc5X2J1c19vcHMgKmJvcHM7CisKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwogI2lmZGVmIENPTkZJR19HUElPTElCCiAJc3RydWN0IGdwaW9fY2hpcAlnYzsKLSNlbmRpZgogCXN0cnVjdCBtdXRleAkJbXV0ZXg7Ci0JdW5zaWduZWQJCWRpc2FibGVkOjE7CS8qIFA6IG11dGV4ICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlcltBRDc4NzlfTlJfU0VOU0UgKyAxXTsKLQl1MTYJCQljbWQ7CiAjZW5kaWYKKwl1bnNpZ25lZCBpbnQJCWlycTsKKwlib29sCQkJZGlzYWJsZWQ7CS8qIFA6IGlucHV0LT5tdXRleCAqLworCWJvb2wJCQlzdXNwZW5kZWQ7CS8qIFA6IGlucHV0LT5tdXRleCAqLwogCXUxNgkJCWNvbnZlcnNpb25fZGF0YVtBRDc4NzlfTlJfU0VOU0VdOwogCWNoYXIJCQlwaHlzWzMyXTsKIAl1OAkJCWZpcnN0X2NvbnZlcnNpb25fZGVsYXk7CkBAIC0xNTgsMTEgKzEzMSwyMiBAQAogCXUxNgkJCWNtZF9jcnRsMzsKIH07CiAKLXN0YXRpYyBpbnQgYWQ3ODc5X3JlYWQoYnVzX2RldmljZSAqLCB1OCk7Ci1zdGF0aWMgaW50IGFkNzg3OV93cml0ZShidXNfZGV2aWNlICosIHU4LCB1MTYpOwotc3RhdGljIHZvaWQgYWQ3ODc5X2NvbGxlY3Qoc3RydWN0IGFkNzg3OSAqKTsKK3N0YXRpYyBpbnQgYWQ3ODc5X3JlYWQoc3RydWN0IGFkNzg3OSAqdHMsIHU4IHJlZykKK3sKKwlyZXR1cm4gdHMtPmJvcHMtPnJlYWQodHMtPmRldiwgcmVnKTsKK30KIAotc3RhdGljIHZvaWQgYWQ3ODc5X3JlcG9ydChzdHJ1Y3QgYWQ3ODc5ICp0cykKK3N0YXRpYyBpbnQgYWQ3ODc5X211bHRpX3JlYWQoc3RydWN0IGFkNzg3OSAqdHMsIHU4IGZpcnN0X3JlZywgdTggY291bnQsIHUxNiAqYnVmKQoreworCXJldHVybiB0cy0+Ym9wcy0+bXVsdGlfcmVhZCh0cy0+ZGV2LCBmaXJzdF9yZWcsIGNvdW50LCBidWYpOworfQorCitzdGF0aWMgaW50IGFkNzg3OV93cml0ZShzdHJ1Y3QgYWQ3ODc5ICp0cywgdTggcmVnLCB1MTYgdmFsKQoreworCXJldHVybiB0cy0+Ym9wcy0+d3JpdGUodHMtPmRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IGFkNzg3OV9yZXBvcnQoc3RydWN0IGFkNzg3OSAqdHMpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gdHMtPmlucHV0OwogCXVuc2lnbmVkIFJ0OwpAQCAtMTc1LDEyICsxNTksMTQgQEAKIAogCS8qCiAJICogVGhlIHNhbXBsZXMgcHJvY2Vzc2VkIGhlcmUgYXJlIGFscmVhZHkgcHJlcHJvY2Vzc2VkIGJ5IHRoZSBBRDc4NzkuCi0JICogVGhlIHByZXByb2Nlc3NpbmcgZnVuY3Rpb24gY29uc2lzdHMgb2YgYSBtZWRpYW4gYW5kIGFuIGF2ZXJhZ2luZyBmaWx0ZXIuCi0JICogVGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHR3byB0ZWNobmlxdWVzIHByb3ZpZGVzIGEgcm9idXN0IHNvbHV0aW9uLAotCSAqIGRpc2NhcmRpbmcgdGhlIHNwdXJpb3VzIG5vaXNlIGluIHRoZSBzaWduYWwgYW5kIGtlZXBpbmcgb25seSB0aGUgZGF0YSBvZiBpbnRlcmVzdC4KLQkgKiBUaGUgc2l6ZSBvZiBib3RoIGZpbHRlcnMgaXMgcHJvZ3JhbW1hYmxlLiAoZGV2LnBsYXRmb3JtX2RhdGEsIHNlZSBsaW51eC9zcGkvYWQ3ODc5LmgpCi0JICogT3RoZXIgdXNlci1wcm9ncmFtbWFibGUgY29udmVyc2lvbiBjb250cm9scyBpbmNsdWRlIHZhcmlhYmxlIGFjcXVpc2l0aW9uIHRpbWUsCi0JICogYW5kIGZpcnN0IGNvbnZlcnNpb24gZGVsYXkuIFVwIHRvIDE2IGF2ZXJhZ2VzIGNhbiBiZSB0YWtlbiBwZXIgY29udmVyc2lvbi4KKwkgKiBUaGUgcHJlcHJvY2Vzc2luZyBmdW5jdGlvbiBjb25zaXN0cyBvZiBhIG1lZGlhbiBhbmQgYW4gYXZlcmFnaW5nCisJICogZmlsdGVyLiAgVGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHR3byB0ZWNobmlxdWVzIHByb3ZpZGVzIGEgcm9idXN0CisJICogc29sdXRpb24sIGRpc2NhcmRpbmcgdGhlIHNwdXJpb3VzIG5vaXNlIGluIHRoZSBzaWduYWwgYW5kIGtlZXBpbmcKKwkgKiBvbmx5IHRoZSBkYXRhIG9mIGludGVyZXN0LiAgVGhlIHNpemUgb2YgYm90aCBmaWx0ZXJzIGlzCisJICogcHJvZ3JhbW1hYmxlLiAoZGV2LnBsYXRmb3JtX2RhdGEsIHNlZSBsaW51eC9zcGkvYWQ3ODc5LmgpIE90aGVyCisJICogdXNlci1wcm9ncmFtbWFibGUgY29udmVyc2lvbiBjb250cm9scyBpbmNsdWRlIHZhcmlhYmxlIGFjcXVpc2l0aW9uCisJICogdGltZSwgYW5kIGZpcnN0IGNvbnZlcnNpb24gZGVsYXkuIFVwIHRvIDE2IGF2ZXJhZ2VzIGNhbiBiZSB0YWtlbgorCSAqIHBlciBjb252ZXJzaW9uLgogCSAqLwogCiAJaWYgKGxpa2VseSh4ICYmIHoxKSkgewpAQCAtMTg5LDIxICsxNzUsMTcgQEAKIAkJUnQgLz0gejE7CiAJCVJ0ID0gKFJ0ICsgMjA0NykgPj4gMTI7CiAKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZ0cy0+dGltZXIpKQorCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIEJUTl9UT1VDSCwgMSk7CisKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19YLCB4KTsKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19ZLCB5KTsKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgUnQpOwogCQlpbnB1dF9zeW5jKGlucHV0X2Rldik7CisJCXJldHVybiAwOwogCX0KLX0KIAotc3RhdGljIHZvaWQgYWQ3ODc5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZDc4NzkgKnRzID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZDc4NzksIHdvcmspOwotCi0JLyogdXNlIGtldmVudGQgY29udGV4dCB0byByZWFkIHRoZSByZXN1bHQgcmVnaXN0ZXJzICovCi0JYWQ3ODc5X2NvbGxlY3QodHMpOwotCWFkNzg3OV9yZXBvcnQodHMpOwotCW1vZF90aW1lcigmdHMtPnRpbWVyLCBqaWZmaWVzICsgVFNfUEVOX1VQX1RJTUVPVVQpOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgdm9pZCBhZDc4NzlfdHNfZXZlbnRfcmVsZWFzZShzdHJ1Y3QgYWQ3ODc5ICp0cykKQEAgLTIxMSw2ICsxOTMsNyBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IHRzLT5pbnB1dDsKIAogCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDApOworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfZGV2LCBCVE5fVE9VQ0gsIDApOwogCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKIH0KIApAQCAtMjI1LDU2ICsyMDgsOTggQEAKIHsKIAlzdHJ1Y3QgYWQ3ODc5ICp0cyA9IGhhbmRsZTsKIAotCS8qIFRoZSByZXBlYXRlZCBjb252ZXJzaW9uIHNlcXVlbmNlciBjb250cm9sbGVkIGJ5IFRNUiBraWNrZWQgb2ZmIHRvbyBmYXN0LgotCSAqIFdlIGlnbm9yZSB0aGUgbGFzdCBhbmQgcHJvY2VzcyB0aGUgc2FtcGxlIHNlcXVlbmNlIGN1cnJlbnRseSBpbiB0aGUgcXVldWUuCi0JICogSXQgY2FuJ3QgYmUgb2xkZXIgdGhhbiA5LjRtcwotCSAqLworCWFkNzg3OV9tdWx0aV9yZWFkKHRzLCBBRDc4NzlfUkVHX1hQTFVTLCBBRDc4NzlfTlJfU0VOU0UsIHRzLT5jb252ZXJzaW9uX2RhdGEpOwogCi0JaWYgKCF3b3JrX3BlbmRpbmcoJnRzLT53b3JrKSkKLQkJc2NoZWR1bGVfd29yaygmdHMtPndvcmspOworCWlmICghYWQ3ODc5X3JlcG9ydCh0cykpCisJCW1vZF90aW1lcigmdHMtPnRpbWVyLCBqaWZmaWVzICsgVFNfUEVOX1VQX1RJTUVPVVQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBhZDc4Nzlfc2V0dXAoc3RydWN0IGFkNzg3OSAqdHMpCitzdGF0aWMgdm9pZCBfX2FkNzg3OV9lbmFibGUoc3RydWN0IGFkNzg3OSAqdHMpCiB7Ci0JYWQ3ODc5X3dyaXRlKHRzLT5idXMsIEFENzg3OV9SRUdfQ1RSTDIsIHRzLT5jbWRfY3J0bDIpOwotCWFkNzg3OV93cml0ZSh0cy0+YnVzLCBBRDc4NzlfUkVHX0NUUkwzLCB0cy0+Y21kX2NydGwzKTsKLQlhZDc4Nzlfd3JpdGUodHMtPmJ1cywgQUQ3ODc5X1JFR19DVFJMMSwgdHMtPmNtZF9jcnRsMSk7CisJYWQ3ODc5X3dyaXRlKHRzLCBBRDc4NzlfUkVHX0NUUkwyLCB0cy0+Y21kX2NydGwyKTsKKwlhZDc4Nzlfd3JpdGUodHMsIEFENzg3OV9SRUdfQ1RSTDMsIHRzLT5jbWRfY3J0bDMpOworCWFkNzg3OV93cml0ZSh0cywgQUQ3ODc5X1JFR19DVFJMMSwgdHMtPmNtZF9jcnRsMSk7CisKKwllbmFibGVfaXJxKHRzLT5pcnEpOwogfQogCi1zdGF0aWMgdm9pZCBhZDc4NzlfZGlzYWJsZShzdHJ1Y3QgYWQ3ODc5ICp0cykKK3N0YXRpYyB2b2lkIF9fYWQ3ODc5X2Rpc2FibGUoc3RydWN0IGFkNzg3OSAqdHMpCiB7Ci0JbXV0ZXhfbG9jaygmdHMtPm11dGV4KTsKKwlkaXNhYmxlX2lycSh0cy0+aXJxKTsKIAotCWlmICghdHMtPmRpc2FibGVkKSB7CisJaWYgKGRlbF90aW1lcl9zeW5jKCZ0cy0+dGltZXIpKQorCQlhZDc4NzlfdHNfZXZlbnRfcmVsZWFzZSh0cyk7CiAKLQkJdHMtPmRpc2FibGVkID0gMTsKLQkJZGlzYWJsZV9pcnEodHMtPmJ1cy0+aXJxKTsKLQotCQljYW5jZWxfd29ya19zeW5jKCZ0cy0+d29yayk7Ci0KLQkJaWYgKGRlbF90aW1lcl9zeW5jKCZ0cy0+dGltZXIpKQotCQkJYWQ3ODc5X3RzX2V2ZW50X3JlbGVhc2UodHMpOwotCi0JCWFkNzg3OV93cml0ZSh0cy0+YnVzLCBBRDc4NzlfUkVHX0NUUkwyLAotCQkJICAgICBBRDc4NzlfUE0oQUQ3ODc5X1BNX1NIVVRET1dOKSk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ0cy0+bXV0ZXgpOworCWFkNzg3OV93cml0ZSh0cywgQUQ3ODc5X1JFR19DVFJMMiwgQUQ3ODc5X1BNKEFENzg3OV9QTV9TSFVURE9XTikpOwogfQogCi1zdGF0aWMgdm9pZCBhZDc4NzlfZW5hYmxlKHN0cnVjdCBhZDc4NzkgKnRzKQotewotCW11dGV4X2xvY2soJnRzLT5tdXRleCk7CiAKLQlpZiAodHMtPmRpc2FibGVkKSB7Ci0JCWFkNzg3OV9zZXR1cCh0cyk7Ci0JCXRzLT5kaXNhYmxlZCA9IDA7Ci0JCWVuYWJsZV9pcnEodHMtPmJ1cy0+aXJxKTsKK3N0YXRpYyBpbnQgYWQ3ODc5X29wZW4oc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCit7CisJc3RydWN0IGFkNzg3OSAqdHMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7CisKKwkvKiBwcm90ZWN0ZWQgYnkgaW5wdXQtPm11dGV4ICovCisJaWYgKCF0cy0+ZGlzYWJsZWQgJiYgIXRzLT5zdXNwZW5kZWQpCisJCV9fYWQ3ODc5X2VuYWJsZSh0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWQ3ODc5X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYqIGlucHV0KQoreworCXN0cnVjdCBhZDc4NzkgKnRzID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOworCisJLyogcHJvdGVjdGVkIGJ5IGlucHV0LT5tdXRleCAqLworCWlmICghdHMtPmRpc2FibGVkICYmICF0cy0+c3VzcGVuZGVkKQorCQlfX2FkNzg3OV9kaXNhYmxlKHRzKTsKK30KKwordm9pZCBhZDc4Nzlfc3VzcGVuZChzdHJ1Y3QgYWQ3ODc5ICp0cykKK3sKKwltdXRleF9sb2NrKCZ0cy0+aW5wdXQtPm11dGV4KTsKKworCWlmICghdHMtPnN1c3BlbmRlZCAmJiAhdHMtPmRpc2FibGVkICYmIHRzLT5pbnB1dC0+dXNlcnMpCisJCV9fYWQ3ODc5X2Rpc2FibGUodHMpOworCisJdHMtPnN1c3BlbmRlZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJnRzLT5pbnB1dC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChhZDc4Nzlfc3VzcGVuZCk7CisKK3ZvaWQgYWQ3ODc5X3Jlc3VtZShzdHJ1Y3QgYWQ3ODc5ICp0cykKK3sKKwltdXRleF9sb2NrKCZ0cy0+aW5wdXQtPm11dGV4KTsKKworCWlmICh0cy0+c3VzcGVuZGVkICYmICF0cy0+ZGlzYWJsZWQgJiYgdHMtPmlucHV0LT51c2VycykKKwkJX19hZDc4NzlfZW5hYmxlKHRzKTsKKworCXRzLT5zdXNwZW5kZWQgPSBmYWxzZTsKKworCW11dGV4X3VubG9jaygmdHMtPmlucHV0LT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGFkNzg3OV9yZXN1bWUpOworCitzdGF0aWMgdm9pZCBhZDc4NzlfdG9nZ2xlKHN0cnVjdCBhZDc4NzkgKnRzLCBib29sIGRpc2FibGUpCit7CisJbXV0ZXhfbG9jaygmdHMtPmlucHV0LT5tdXRleCk7CisKKwlpZiAoIXRzLT5zdXNwZW5kZWQgJiYgdHMtPmlucHV0LT51c2VycyAhPSAwKSB7CisKKwkJaWYgKGRpc2FibGUpIHsKKwkJCWlmICh0cy0+ZGlzYWJsZWQpCisJCQkJX19hZDc4NzlfZW5hYmxlKHRzKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghdHMtPmRpc2FibGVkKQorCQkJCV9fYWQ3ODc5X2Rpc2FibGUodHMpOworCQl9CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZ0cy0+bXV0ZXgpOworCXRzLT5kaXNhYmxlZCA9IGRpc2FibGU7CisKKwltdXRleF91bmxvY2soJnRzLT5pbnB1dC0+bXV0ZXgpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZDc4NzlfZGlzYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTI5NywxMCArMzIyLDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICh2YWwpCi0JCWFkNzg3OV9kaXNhYmxlKHRzKTsKLQllbHNlCi0JCWFkNzg3OV9lbmFibGUodHMpOworCWFkNzg3OV90b2dnbGUodHMsIHZhbCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zMjUsNyArMzQ3LDcgQEAKIAogCW11dGV4X2xvY2soJnRzLT5tdXRleCk7CiAJdHMtPmNtZF9jcnRsMiB8PSBBRDc4NzlfR1BJT19FTiB8IEFENzg3OV9HUElPRElSIHwgQUQ3ODc5X0dQSU9QT0w7Ci0JZXJyID0gYWQ3ODc5X3dyaXRlKHRzLT5idXMsIEFENzg3OV9SRUdfQ1RSTDIsIHRzLT5jbWRfY3J0bDIpOworCWVyciA9IGFkNzg3OV93cml0ZSh0cywgQUQ3ODc5X1JFR19DVFJMMiwgdHMtPmNtZF9jcnRsMik7CiAJbXV0ZXhfdW5sb2NrKCZ0cy0+bXV0ZXgpOwogCiAJcmV0dXJuIGVycjsKQEAgLTM0NSw3ICszNjcsNyBAQAogCWVsc2UKIAkJdHMtPmNtZF9jcnRsMiAmPSB+QUQ3ODc5X0dQSU9fREFUQTsKIAotCWVyciA9IGFkNzg3OV93cml0ZSh0cy0+YnVzLCBBRDc4NzlfUkVHX0NUUkwyLCB0cy0+Y21kX2NydGwyKTsKKwllcnIgPSBhZDc4Nzlfd3JpdGUodHMsIEFENzg3OV9SRUdfQ1RSTDIsIHRzLT5jbWRfY3J0bDIpOwogCW11dGV4X3VubG9jaygmdHMtPm11dGV4KTsKIAogCXJldHVybiBlcnI7CkBAIC0zNTcsNyArMzc5LDcgQEAKIAl1MTYgdmFsOwogCiAJbXV0ZXhfbG9jaygmdHMtPm11dGV4KTsKLQl2YWwgPSBhZDc4NzlfcmVhZCh0cy0+YnVzLCBBRDc4NzlfUkVHX0NUUkwyKTsKKwl2YWwgPSBhZDc4NzlfcmVhZCh0cywgQUQ3ODc5X1JFR19DVFJMMik7CiAJbXV0ZXhfdW5sb2NrKCZ0cy0+bXV0ZXgpOwogCiAJcmV0dXJuICEhKHZhbCAmIEFENzg3OV9HUElPX0RBVEEpOwpAQCAtMzc0LDE2ICszOTYsMTcgQEAKIAllbHNlCiAJCXRzLT5jbWRfY3J0bDIgJj0gfkFENzg3OV9HUElPX0RBVEE7CiAKLQlhZDc4Nzlfd3JpdGUodHMtPmJ1cywgQUQ3ODc5X1JFR19DVFJMMiwgdHMtPmNtZF9jcnRsMik7CisJYWQ3ODc5X3dyaXRlKHRzLCBBRDc4NzlfUkVHX0NUUkwyLCB0cy0+Y21kX2NydGwyKTsKIAltdXRleF91bmxvY2soJnRzLT5tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGFkNzg3OV9ncGlvX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFkNzg3OV9ncGlvX2FkZChzdHJ1Y3QgYWQ3ODc5ICp0cywKKwkJCSAgIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7Ci0Jc3RydWN0IGFkNzg3OSAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3ODc5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCWludCByZXQgPSAwOwogCisJbXV0ZXhfaW5pdCgmdHMtPm11dGV4KTsKKwogCWlmIChwZGF0YS0+Z3Bpb19leHBvcnQpIHsKIAkJdHMtPmdjLmRpcmVjdGlvbl9pbnB1dCA9IGFkNzg3OV9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKIAkJdHMtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBhZDc4NzlfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwpAQCAtMzk0LDcyICs0MTcsNzUgQEAKIAkJdHMtPmdjLm5ncGlvID0gMTsKIAkJdHMtPmdjLmxhYmVsID0gIkFENzg3OS1HUElPIjsKIAkJdHMtPmdjLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCXRzLT5nYy5kZXYgPSBkZXY7CisJCXRzLT5nYy5kZXYgPSB0cy0+ZGV2OwogCiAJCXJldCA9IGdwaW9jaGlwX2FkZCgmdHMtPmdjKTsKIAkJaWYgKHJldCkKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGdwaW8gJWRcbiIsCisJCQlkZXZfZXJyKHRzLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZ3BpbyAlZFxuIiwKIAkJCQl0cy0+Z2MuYmFzZSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFdlIG1hcmsgYWQ3ODc5X2dwaW9fcmVtb3ZlIGlubGluZSBzbyB0aGVyZSBpcyBhIGNoYW5jZSB0aGUgY29kZQotICogZ2V0cyBkaXNjYXJkZWQgd2hlbiBub3QgbmVlZGVkLiBXZSBjYW4ndCBkbyBfX2RldmluaXQvX19kZXZleGl0Ci0gKiBtYXJrdXAgc2luY2UgaXQgaXMgdXNlZCBpbiBib3RoIHByb2JlIGFuZCByZW1vdmUgbWV0aG9kcy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGFkNzg3OV9ncGlvX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBhZDc4NzlfZ3Bpb19yZW1vdmUoc3RydWN0IGFkNzg3OSAqdHMpCiB7Ci0Jc3RydWN0IGFkNzg3OSAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3ODc5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB0cy0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCWludCByZXQ7CiAKIAlpZiAocGRhdGEtPmdwaW9fZXhwb3J0KSB7CiAJCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmdHMtPmdjKTsKIAkJaWYgKHJldCkKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlbW92ZSBncGlvICVkXG4iLAorCQkJZGV2X2Vycih0cy0+ZGV2LCAiZmFpbGVkIHRvIHJlbW92ZSBncGlvICVkXG4iLAogCQkJCXRzLT5nYy5iYXNlKTsKIAl9CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgYWQ3ODc5X2dwaW9fYWRkKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgaW50IGFkNzg3OV9ncGlvX2FkZChzdHJ1Y3QgYWQ3ODc5ICp0cywKKwkJCQkgIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDc4NzlfZ3Bpb19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGFkNzg3OV9ncGlvX3JlbW92ZShzdHJ1Y3QgYWQ3ODc5ICp0cykKIHsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhZDc4NzlfY29uc3RydWN0KGJ1c19kZXZpY2UgKmJ1cywgc3RydWN0IGFkNzg3OSAqdHMpCitzdHJ1Y3QgYWQ3ODc5ICphZDc4NzlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBkZXZpZCwgdW5zaWduZWQgaW50IGlycSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgYWQ3ODc5X2J1c19vcHMgKmJvcHMpCiB7CisJc3RydWN0IGFkNzg3OV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWQ3ODc5ICp0czsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0Jc3RydWN0IGFkNzg3OV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGJ1cy0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IGVycjsKIAl1MTYgcmV2aWQ7CiAKLQlpZiAoIWJ1cy0+aXJxKSB7Ci0JCWRldl9lcnIoJmJ1cy0+ZGV2LCAibm8gSVJRP1xuIik7Ci0JCXJldHVybiAtRU5PREVWOworCWlmICghaXJxKSB7CisJCWRldl9lcnIoZGV2LCAibm8gSVJRP1xuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKIAl9CiAKIAlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoJmJ1cy0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJubyBwbGF0Zm9ybSBkYXRhP1xuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKIAl9CiAKKwl0cyA9IGt6YWxsb2Moc2l6ZW9mKCp0cyksIEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaW5wdXRfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXRzIHx8ICFpbnB1dF9kZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQogCisJdHMtPmJvcHMgPSBib3BzOworCXRzLT5kZXYgPSBkZXY7CiAJdHMtPmlucHV0ID0gaW5wdXRfZGV2OworCXRzLT5pcnEgPSBpcnE7CiAKIAlzZXR1cF90aW1lcigmdHMtPnRpbWVyLCBhZDc4NzlfdGltZXIsICh1bnNpZ25lZCBsb25nKSB0cyk7Ci0JSU5JVF9XT1JLKCZ0cy0+d29yaywgYWQ3ODc5X3dvcmspOwotCW11dGV4X2luaXQoJnRzLT5tdXRleCk7CiAKIAl0cy0+eF9wbGF0ZV9vaG1zID0gcGRhdGEtPnhfcGxhdGVfb2htcyA/IDogNDAwOwogCXRzLT5wcmVzc3VyZV9tYXggPSBwZGF0YS0+cHJlc3N1cmVfbWF4ID8gOiB+MDsKQEAgLTQ3MCwxNyArNDk2LDI2IEBACiAJdHMtPnBlbl9kb3duX2FjY19pbnRlcnZhbCA9IHBkYXRhLT5wZW5fZG93bl9hY2NfaW50ZXJ2YWw7CiAJdHMtPm1lZGlhbiA9IHBkYXRhLT5tZWRpYW47CiAKLQlzbnByaW50Zih0cy0+cGh5cywgc2l6ZW9mKHRzLT5waHlzKSwgIiVzL2lucHV0MCIsIGRldl9uYW1lKCZidXMtPmRldikpOworCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLCAiJXMvaW5wdXQwIiwgZGV2X25hbWUoZGV2KSk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSAiQUQ3ODc5IFRvdWNoc2NyZWVuIjsKIAlpbnB1dF9kZXYtPnBoeXMgPSB0cy0+cGh5czsKLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmYnVzLT5kZXY7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gZGV2OworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IGJvcHMtPmJ1c3R5cGU7CisKKwlpbnB1dF9kZXYtPm9wZW4gPSBhZDc4Nzlfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gYWQ3ODc5X2Nsb3NlOworCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCB0cyk7CiAKIAlfX3NldF9iaXQoRVZfQUJTLCBpbnB1dF9kZXYtPmV2Yml0KTsKIAlfX3NldF9iaXQoQUJTX1gsIGlucHV0X2Rldi0+YWJzYml0KTsKIAlfX3NldF9iaXQoQUJTX1ksIGlucHV0X2Rldi0+YWJzYml0KTsKIAlfX3NldF9iaXQoQUJTX1BSRVNTVVJFLCBpbnB1dF9kZXYtPmFic2JpdCk7CiAKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKKwlfX3NldF9iaXQoQlROX1RPVUNILCBpbnB1dF9kZXYtPmtleWJpdCk7CisKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLAogCQkJcGRhdGEtPnhfbWluID8gOiAwLAogCQkJcGRhdGEtPnhfbWF4ID8gOiBNQVhfMTJCSVQsCkBAIC00OTIsMTcgKzUyNywxOCBAQAogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1BSRVNTVVJFLAogCQkJcGRhdGEtPnByZXNzdXJlX21pbiwgcGRhdGEtPnByZXNzdXJlX21heCwgMCwgMCk7CiAKLQllcnIgPSBhZDc4Nzlfd3JpdGUoYnVzLCBBRDc4NzlfUkVHX0NUUkwyLCBBRDc4NzlfUkVTRVQpOwotCisJZXJyID0gYWQ3ODc5X3dyaXRlKHRzLCBBRDc4NzlfUkVHX0NUUkwyLCBBRDc4NzlfUkVTRVQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoJmJ1cy0+ZGV2LCAiRmFpbGVkIHRvIHdyaXRlICVzXG4iLCBpbnB1dF9kZXYtPm5hbWUpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byB3cml0ZSAlc1xuIiwgaW5wdXRfZGV2LT5uYW1lKTsKIAkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCi0JcmV2aWQgPSBhZDc4NzlfcmVhZChidXMsIEFENzg3OV9SRUdfUkVWSUQpOwotCi0JaWYgKChyZXZpZCAmIDB4RkYpICE9IEFENzg3OV9ERVZJRCkgewotCQlkZXZfZXJyKCZidXMtPmRldiwgIkZhaWxlZCB0byBwcm9iZSAlc1xuIiwgaW5wdXRfZGV2LT5uYW1lKTsKKwlyZXZpZCA9IGFkNzg3OV9yZWFkKHRzLCBBRDc4NzlfUkVHX1JFVklEKTsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAocmV2aWQgJiAweGZmKTsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSByZXZpZCA+PiA4OworCWlmIChpbnB1dF9kZXYtPmlkLnByb2R1Y3QgIT0gZGV2aWQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcHJvYmUgJXMgKCV4IHZzICV4KVxuIiwKKwkJCWlucHV0X2Rldi0+bmFtZSwgZGV2aWQsIHJldmlkKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfZnJlZV9tZW07CiAJfQpAQCAtNTI0LDIxICs1NjAsMjEgQEAKIAkJCUFENzg3OV9BQ1EodHMtPmFjcXVpc2l0aW9uX3RpbWUpIHwKIAkJCUFENzg3OV9UTVIodHMtPnBlbl9kb3duX2FjY19pbnRlcnZhbCk7CiAKLQlhZDc4Nzlfc2V0dXAodHMpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoYnVzLT5pcnEsIGFkNzg3OV9pcnEsCi0JCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HLCBidXMtPmRldi5kcml2ZXItPm5hbWUsIHRzKTsKLQorCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHRzLT5pcnEsIE5VTEwsIGFkNzg3OV9pcnEsCisJCQkJICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJICAgZGV2X25hbWUoZGV2KSwgdHMpOwogCWlmIChlcnIpIHsKLQkJZGV2X2VycigmYnVzLT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIGJ1cy0+aXJxKTsKKwkJZGV2X2VycihkZXYsICJpcnEgJWQgYnVzeT9cbiIsIHRzLT5pcnEpOwogCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmJ1cy0+ZGV2LmtvYmosICZhZDc4NzlfYXR0cl9ncm91cCk7CisJX19hZDc4NzlfZGlzYWJsZSh0cyk7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmFkNzg3OV9hdHRyX2dyb3VwKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9mcmVlX2lycTsKIAotCWVyciA9IGFkNzg3OV9ncGlvX2FkZCgmYnVzLT5kZXYpOworCWVyciA9IGFkNzg3OV9ncGlvX2FkZCh0cywgcGRhdGEpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JlbW92ZV9hdHRyOwogCkBAIC01NDYsMzIxICs1ODIsMzIgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9yZW1vdmVfZ3BpbzsKIAotCWRldl9pbmZvKCZidXMtPmRldiwgIlJldi4lZCB0b3VjaHNjcmVlbiwgaXJxICVkXG4iLAotCQkgcmV2aWQgPj4gOCwgYnVzLT5pcnEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHRzOwogCiBlcnJfcmVtb3ZlX2dwaW86Ci0JYWQ3ODc5X2dwaW9fcmVtb3ZlKCZidXMtPmRldik7CisJYWQ3ODc5X2dwaW9fcmVtb3ZlKHRzKTsKIGVycl9yZW1vdmVfYXR0cjoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmJ1cy0+ZGV2LmtvYmosICZhZDc4NzlfYXR0cl9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZhZDc4NzlfYXR0cl9ncm91cCk7CiBlcnJfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoYnVzLT5pcnEsIHRzKTsKKwlmcmVlX2lycSh0cy0+aXJxLCB0cyk7CiBlcnJfZnJlZV9tZW06CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQotCXJldHVybiBlcnI7CisJa2ZyZWUodHMpOworZXJyX291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQorRVhQT1JUX1NZTUJPTChhZDc4NzlfcHJvYmUpOwogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc4NzlfZGVzdHJveShidXNfZGV2aWNlICpidXMsIHN0cnVjdCBhZDc4NzkgKnRzKQordm9pZCBhZDc4NzlfcmVtb3ZlKHN0cnVjdCBhZDc4NzkgKnRzKQogewotCWFkNzg3OV9ncGlvX3JlbW92ZSgmYnVzLT5kZXYpOwotCWFkNzg3OV9kaXNhYmxlKHRzKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRzLT5idXMtPmRldi5rb2JqLCAmYWQ3ODc5X2F0dHJfZ3JvdXApOwotCWZyZWVfaXJxKHRzLT5idXMtPmlycSwgdHMpOworCWFkNzg3OV9ncGlvX3JlbW92ZSh0cyk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0cy0+ZGV2LT5rb2JqLCAmYWQ3ODc5X2F0dHJfZ3JvdXApOworCWZyZWVfaXJxKHRzLT5pcnEsIHRzKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cy0+aW5wdXQpOwotCWRldl9kYmcoJmJ1cy0+ZGV2LCAidW5yZWdpc3RlcmVkIHRvdWNoc2NyZWVuXG4iKTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFkNzg3OV9zdXNwZW5kKGJ1c19kZXZpY2UgKmJ1cywgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCi17Ci0Jc3RydWN0IGFkNzg3OSAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoJmJ1cy0+ZGV2KTsKLQotCWFkNzg3OV9kaXNhYmxlKHRzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkNzg3OV9yZXN1bWUoYnVzX2RldmljZSAqYnVzKQotewotCXN0cnVjdCBhZDc4NzkgKnRzID0gZGV2X2dldF9kcnZkYXRhKCZidXMtPmRldik7Ci0KLQlhZDc4NzlfZW5hYmxlKHRzKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYWQ3ODc5X3N1c3BlbmQgTlVMTAotI2RlZmluZSBhZDc4NzlfcmVzdW1lICBOVUxMCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQotI2RlZmluZSBNQVhfU1BJX0ZSRVFfSFoJCTUwMDAwMDAKLSNkZWZpbmUgQUQ3ODc5X0NNRF9NQUdJQwkweEUwMDAKLSNkZWZpbmUgQUQ3ODc5X0NNRF9SRUFECQkoMSA8PCAxMCkKLSNkZWZpbmUgQUQ3ODc5X1dSSVRFQ01EKHJlZykJKEFENzg3OV9DTURfTUFHSUMgfCAocmVnICYgMHhGKSkKLSNkZWZpbmUgQUQ3ODc5X1JFQURDTUQocmVnKQkoQUQ3ODc5X0NNRF9NQUdJQyB8IEFENzg3OV9DTURfUkVBRCB8IChyZWcgJiAweEYpKQotCi1zdHJ1Y3Qgc2VyX3JlcSB7Ci0JdTE2CQkJY29tbWFuZDsKLQl1MTYJCQlkYXRhOwotCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2Zlcgl4ZmVyWzJdOwotfTsKLQotLyoKLSAqIGFkNzg3OV9yZWFkL3dyaXRlIGFyZSBvbmx5IHVzZWQgZm9yIGluaXRpYWwgc2V0dXAgYW5kIGZvciBzeXNmcyBjb250cm9scy4KLSAqIFRoZSBtYWluIHRyYWZmaWMgaXMgZG9uZSBpbiBhZDc4NzlfY29sbGVjdCgpLgotICovCi0KLXN0YXRpYyBpbnQgYWQ3ODc5X3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcmVnKQotewotCXN0cnVjdCBzZXJfcmVxICpyZXE7Ci0JaW50IHN0YXR1cywgcmV0OwotCi0JcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmcmVxLT5tc2cpOwotCi0JcmVxLT5jb21tYW5kID0gKHUxNikgQUQ3ODc5X1JFQURDTUQocmVnKTsKLQlyZXEtPnhmZXJbMF0udHhfYnVmID0gJnJlcS0+Y29tbWFuZDsKLQlyZXEtPnhmZXJbMF0ubGVuID0gMjsKLQotCXJlcS0+eGZlclsxXS5yeF9idWYgPSAmcmVxLT5kYXRhOwotCXJlcS0+eGZlclsxXS5sZW4gPSAyOwotCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnJlcS0+eGZlclswXSwgJnJlcS0+bXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmcmVxLT54ZmVyWzFdLCAmcmVxLT5tc2cpOwotCi0Jc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmcmVxLT5tc2cpOwotCXJldCA9IHN0YXR1cyA/IDogcmVxLT5kYXRhOwotCi0Ja2ZyZWUocmVxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWQ3ODc5X3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IHJlZywgdTE2IHZhbCkKLXsKLQlzdHJ1Y3Qgc2VyX3JlcSAqcmVxOwotCWludCBzdGF0dXM7Ci0KLQlyZXEgPSBremFsbG9jKHNpemVvZiAqcmVxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlcSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZyZXEtPm1zZyk7Ci0KLQlyZXEtPmNvbW1hbmQgPSAodTE2KSBBRDc4NzlfV1JJVEVDTUQocmVnKTsKLQlyZXEtPnhmZXJbMF0udHhfYnVmID0gJnJlcS0+Y29tbWFuZDsKLQlyZXEtPnhmZXJbMF0ubGVuID0gMjsKLQotCXJlcS0+ZGF0YSA9IHZhbDsKLQlyZXEtPnhmZXJbMV0udHhfYnVmID0gJnJlcS0+ZGF0YTsKLQlyZXEtPnhmZXJbMV0ubGVuID0gMjsKLQotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZyZXEtPnhmZXJbMF0sICZyZXEtPm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnJlcS0+eGZlclsxXSwgJnJlcS0+bXNnKTsKLQotCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJnJlcS0+bXNnKTsKLQotCWtmcmVlKHJlcSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBhZDc4NzlfY29sbGVjdChzdHJ1Y3QgYWQ3ODc5ICp0cykKLXsKLQlpbnQgc3RhdHVzID0gc3BpX3N5bmModHMtPmJ1cywgJnRzLT5tc2cpOwotCi0JaWYgKHN0YXR1cykKLQkJZGV2X2VycigmdHMtPmJ1cy0+ZGV2LCAic3BpX3N5bmMgLS0+ICVkXG4iLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBhZDc4Nzlfc2V0dXBfdHNfZGVmX21zZyhzdHJ1Y3QgYWQ3ODc5ICp0cykKLXsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07Ci0JaW50IGk7Ci0KLQl0cy0+Y21kID0gKHUxNikgQUQ3ODc5X1JFQURDTUQoQUQ3ODc5X1JFR19YUExVUyk7Ci0KLQltID0gJnRzLT5tc2c7Ci0Jc3BpX21lc3NhZ2VfaW5pdChtKTsKLQl0cy0+eGZlclswXS50eF9idWYgPSAmdHMtPmNtZDsKLQl0cy0+eGZlclswXS5sZW4gPSAyOwotCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRzLT54ZmVyWzBdLCBtKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBRDc4NzlfTlJfU0VOU0U7IGkrKykgewotCQl0cy0+eGZlcltpICsgMV0ucnhfYnVmID0gJnRzLT5jb252ZXJzaW9uX2RhdGFbaV07Ci0JCXRzLT54ZmVyW2kgKyAxXS5sZW4gPSAyOwotCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdHMtPnhmZXJbaSArIDFdLCBtKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGFkNzg3OV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhZDc4NzkgKnRzOwotCWludCBlcnJvcjsKLQotCS8qIGRvbid0IGV4Y2VlZCBtYXggc3BlY2lmaWVkIFNQSSBDTEsgZnJlcXVlbmN5ICovCi0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID4gTUFYX1NQSV9GUkVRX0haKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiU1BJIENMSyAlZCBIej9cbiIsIHNwaS0+bWF4X3NwZWVkX2h6KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWQ3ODc5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCB0cyk7Ci0JdHMtPmJ1cyA9IHNwaTsKLQotCWFkNzg3OV9zZXR1cF90c19kZWZfbXNnKHRzKTsKLQotCWVycm9yID0gYWQ3ODc5X2NvbnN0cnVjdChzcGksIHRzKTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7Ci0JCWtmcmVlKHRzKTsKLQl9Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGFkNzg3OV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgYWQ3ODc5ICp0cyA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwotCi0JYWQ3ODc5X2Rlc3Ryb3koc3BpLCB0cyk7Ci0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CiAJa2ZyZWUodHMpOwotCi0JcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDc4NzlfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImFkNzg3OSIsCi0JCS5idXMJPSAmc3BpX2J1c190eXBlLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZQkJPSBhZDc4NzlfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDc4NzlfcmVtb3ZlKSwKLQkuc3VzcGVuZAk9IGFkNzg3OV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYWQ3ODc5X3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFkNzg3OV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzg3OV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYWQ3ODc5X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWQ3ODc5X2V4aXQodm9pZCkKLXsKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzg3OV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoYWQ3ODc5X2V4aXQpOwotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDX01PRFVMRSkKLQotLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZC4KLSAqIEFENzg3OSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24uCi0gKi8KLXN0YXRpYyBpbnQgYWQ3ODc5X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQ3ODc5X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbCkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbCkpOwotfQotCi1zdGF0aWMgdm9pZCBhZDc4NzlfY29sbGVjdChzdHJ1Y3QgYWQ3ODc5ICp0cykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBRDc4NzlfTlJfU0VOU0U7IGkrKykKLQkJdHMtPmNvbnZlcnNpb25fZGF0YVtpXSA9IGFkNzg3OV9yZWFkKHRzLT5idXMsCi0JCQkJCQkgICAgIEFENzg3OV9SRUdfWFBMVVMgKyBpKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWQ3ODc5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgYWQ3ODc5ICp0czsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKLQkJCQkJSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlNNQlVTIFdvcmQgRGF0YSBub3QgU3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWQ3ODc5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0cyk7Ci0JdHMtPmJ1cyA9IGNsaWVudDsKLQotCWVycm9yID0gYWQ3ODc5X2NvbnN0cnVjdChjbGllbnQsIHRzKTsKLQlpZiAoZXJyb3IpCi0JCWtmcmVlKHRzKTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgYWQ3ODc5X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBhZDc4NzkgKnRzID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7Ci0KLQlhZDc4NzlfZGVzdHJveShjbGllbnQsIHRzKTsKLQlrZnJlZSh0cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzg3OV9pZFtdID0gewotCXsgImFkNzg3OSIsIDAgfSwKLQl7ICJhZDc4ODkiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkNzg3OV9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZDc4NzlfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImFkNzg3OSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IGFkNzg3OV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkNzg3OV9yZW1vdmUpLAotCS5zdXNwZW5kCT0gYWQ3ODc5X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBhZDc4NzlfcmVzdW1lLAotCS5pZF90YWJsZQk9IGFkNzg3OV9pZCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFkNzg3OV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZDc4NzlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGFkNzg3OV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGFkNzg3OV9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmFkNzg3OV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoYWQ3ODc5X2V4aXQpOwotI2VuZGlmCitFWFBPUlRfU1lNQk9MKGFkNzg3OV9yZW1vdmUpOwogCiBNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBRDc4NzkoLTEpIHRvdWNoc2NyZWVuIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJzcGk6YWQ3ODc5Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5oIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ1YTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQUQ3ODc5L0FENzg4OSB0b3VjaHNjcmVlbiAoYnVzIGludGVyZmFjZXMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQUQ3ODc5X0hfCisjZGVmaW5lIF9BRDc4NzlfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBhZDc4Nzk7CitzdHJ1Y3QgZGV2aWNlOworCitzdHJ1Y3QgYWQ3ODc5X2J1c19vcHMgeworCXUxNiBidXN0eXBlOworCWludCAoKnJlYWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnKTsKKwlpbnQgKCptdWx0aV9yZWFkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGZpcnN0X3JlZywgdTggY291bnQsIHUxNiAqYnVmKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWcsIHUxNiB2YWwpOworfTsKKwordm9pZCBhZDc4Nzlfc3VzcGVuZChzdHJ1Y3QgYWQ3ODc5ICopOwordm9pZCBhZDc4NzlfcmVzdW1lKHN0cnVjdCBhZDc4NzkgKik7CitzdHJ1Y3QgYWQ3ODc5ICphZDc4NzlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBkZXZpZCwgdW5zaWduZWQgaXJxLAorCQkJICAgIGNvbnN0IHN0cnVjdCBhZDc4NzlfYnVzX29wcyAqYm9wcyk7Cit2b2lkIGFkNzg3OV9yZW1vdmUoc3RydWN0IGFkNzg3OSAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGE5ZmRmNTUuLjE2MDMxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC02OCw2ICs2OCw4IEBACiAJdTE2CXk7CiAJdTE2CXoxLCB6MjsKIAlpbnQJaWdub3JlOworCXU4CXhfYnVmWzNdOworCXU4CXlfYnVmWzNdOwogfTsKIAogLyoKQEAgLTc5LDYgKzgxLDggQEAKIAl1OAkJCXJlYWRfeCwgcmVhZF95LCByZWFkX3oxLCByZWFkX3oyLCBwd3Jkb3duOwogCXUxNgkJCWR1bW15OwkJLyogZm9yIHRoZSBwd3Jkb3duIHJlYWQgKi8KIAlzdHJ1Y3QgdHNfZXZlbnQJCXRjOworCS8qIGZvciBhZHM3ODQ1IHdpdGggbXBjNTEyMSBwc2Mgc3BpIHdlIHVzZSAzLWJ5dGUgYnVmZmVycyAqLworCXU4CQkJcmVhZF94X2NtZFszXSwgcmVhZF95X2NtZFszXSwgcHdyZG93bl9jbWRbM107CiB9OwogCiBzdHJ1Y3QgYWRzNzg0NiB7CkBAIC0yMDcsNiArMjExLDE0IEBACiAJc3RydWN0IHNwaV90cmFuc2Zlcgl4ZmVyWzZdOwogfTsKIAorc3RydWN0IGFkczc4NDVfc2VyX3JlcSB7CisJdTgJCQljb21tYW5kWzNdOworCXU4CQkJcHdyZG93blszXTsKKwl1OAkJCXNhbXBsZVszXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlclsyXTsKK307CisKIHN0YXRpYyB2b2lkIGFkczc4NDZfZW5hYmxlKHN0cnVjdCBhZHM3ODQ2ICp0cyk7CiBzdGF0aWMgdm9pZCBhZHM3ODQ2X2Rpc2FibGUoc3RydWN0IGFkczc4NDYgKnRzKTsKIApAQCAtMjg3LDYgKzI5OSw0MSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgYWRzNzg0NV9yZWFkMTJfc2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY29tbWFuZCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBhZHM3ODQ2CQkqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRzNzg0NV9zZXJfcmVxCSpyZXEgPSBremFsbG9jKHNpemVvZiAqcmVxLCBHRlBfS0VSTkVMKTsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZyZXEtPm1zZyk7CisKKwlyZXEtPmNvbW1hbmRbMF0gPSAodTgpIGNvbW1hbmQ7CisJcmVxLT54ZmVyWzBdLnR4X2J1ZiA9IHJlcS0+Y29tbWFuZDsKKwlyZXEtPnhmZXJbMF0ucnhfYnVmID0gcmVxLT5zYW1wbGU7CisJcmVxLT54ZmVyWzBdLmxlbiA9IDM7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnJlcS0+eGZlclswXSwgJnJlcS0+bXNnKTsKKworCXRzLT5pcnFfZGlzYWJsZWQgPSAxOworCWRpc2FibGVfaXJxKHNwaS0+aXJxKTsKKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZyZXEtPm1zZyk7CisJdHMtPmlycV9kaXNhYmxlZCA9IDA7CisJZW5hYmxlX2lycShzcGktPmlycSk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyogQkUxMiB2YWx1ZSwgdGhlbiBwYWRkaW5nICovCisJCXN0YXR1cyA9IGJlMTZfdG9fY3B1KCooKHUxNiAqKSZyZXEtPnNhbXBsZVsxXSkpOworCQlzdGF0dXMgPSBzdGF0dXMgPj4gMzsKKwkJc3RhdHVzICY9IDB4MGZmZjsKKwl9CisKKwlrZnJlZShyZXEpOworCXJldHVybiBzdGF0dXM7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19IV01PTikgfHwgZGVmaW5lZChDT05GSUdfSFdNT05fTU9EVUxFKQogCiAjZGVmaW5lIFNIT1cobmFtZSwgdmFyLCBhZGp1c3QpIHN0YXRpYyBzc2l6ZV90IFwKQEAgLTU0MCwxMCArNTg3LDE3IEBACiAJLyogYWRzNzg0Nl9yeF92YWwoKSBkaWQgaW4tcGxhY2UgY29udmVyc2lvbiAoaW5jbHVkaW5nIGJ5dGVzd2FwKSBmcm9tCiAJICogb24tdGhlLXdpcmUgZm9ybWF0IGFzIHBhcnQgb2YgZGVib3VuY2luZyB0byBnZXQgc3RhYmxlIHJlYWRpbmdzLgogCSAqLwotCXggPSBwYWNrZXQtPnRjLng7Ci0JeSA9IHBhY2tldC0+dGMueTsKLQl6MSA9IHBhY2tldC0+dGMuejE7Ci0JejIgPSBwYWNrZXQtPnRjLnoyOworCWlmICh0cy0+bW9kZWwgPT0gNzg0NSkgeworCQl4ID0gKih1MTYgKilwYWNrZXQtPnRjLnhfYnVmOworCQl5ID0gKih1MTYgKilwYWNrZXQtPnRjLnlfYnVmOworCQl6MSA9IDA7CisJCXoyID0gMDsKKwl9IGVsc2UgeworCQl4ID0gcGFja2V0LT50Yy54OworCQl5ID0gcGFja2V0LT50Yy55OworCQl6MSA9IHBhY2tldC0+dGMuejE7CisJCXoyID0gcGFja2V0LT50Yy56MjsKKwl9CiAKIAkvKiByYW5nZSBmaWx0ZXJpbmcgKi8KIAlpZiAoeCA9PSBNQVhfMTJCSVQpCkBAIC01NTEsNiArNjA1LDEyIEBACiAKIAlpZiAodHMtPm1vZGVsID09IDc4NDMpIHsKIAkJUnQgPSB0cy0+cHJlc3N1cmVfbWF4IC8gMjsKKwl9IGVsc2UgaWYgKHRzLT5tb2RlbCA9PSA3ODQ1KSB7CisJCWlmIChnZXRfcGVuZG93bl9zdGF0ZSh0cykpCisJCQlSdCA9IHRzLT5wcmVzc3VyZV9tYXggLyAyOworCQllbHNlCisJCQlSdCA9IDA7CisJCWRldl92ZGJnKCZ0cy0+c3BpLT5kZXYsICJ4L3k6ICVkLyVkLCBQRCAlZFxuIiwgeCwgeSwgUnQpOwogCX0gZWxzZSBpZiAobGlrZWx5KHggJiYgejEpKSB7CiAJCS8qIGNvbXB1dGUgdG91Y2ggcHJlc3N1cmUgcmVzaXN0YW5jZSB1c2luZyBlcXVhdGlvbiAjMiAqLwogCQlSdCA9IHoyOwpAQCAtNjcxLDEwICs3MzEsMTQgQEAKIAltID0gJnRzLT5tc2dbdHMtPm1zZ19pZHhdOwogCXQgPSBsaXN0X2VudHJ5KG0tPnRyYW5zZmVycy5wcmV2LCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKIAotCS8qIGFkanVzdDogIG9uLXdpcmUgaXMgYSBtdXN0LWlnbm9yZSBiaXQsIGEgQkUxMiB2YWx1ZSwgdGhlbiBwYWRkaW5nOwotCSAqIGJ1aWx0IGZyb20gdHdvIDggYml0IHZhbHVlcyB3cml0dGVuIG1zYi1maXJzdC4KLQkgKi8KLQl2YWwgPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKXQtPnJ4X2J1ZikgPj4gMzsKKwlpZiAodHMtPm1vZGVsID09IDc4NDUpIHsKKwkJdmFsID0gYmUxNl90b19jcHVwKChfX2JlMTYgKikmKCgoY2hhciopdC0+cnhfYnVmKVsxXSkpID4+IDM7CisJfSBlbHNlIHsKKwkJLyogYWRqdXN0OiAgb24td2lyZSBpcyBhIG11c3QtaWdub3JlIGJpdCwgYSBCRTEyIHZhbHVlLCB0aGVuCisJCSAqIHBhZGRpbmc7IGJ1aWx0IGZyb20gdHdvIDggYml0IHZhbHVlcyB3cml0dGVuIG1zYi1maXJzdC4KKwkJICovCisJCXZhbCA9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopdC0+cnhfYnVmKSA+PiAzOworCX0KIAogCWFjdGlvbiA9IHRzLT5maWx0ZXIodHMtPmZpbHRlcl9kYXRhLCB0cy0+bXNnX2lkeCwgJnZhbCk7CiAJc3dpdGNoIChhY3Rpb24pIHsKQEAgLTg3OCwxNCArOTQyLDE1IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkczc4NDZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgYWRzNzg0NgkJCSp0czsKLQlzdHJ1Y3QgYWRzNzg0Nl9wYWNrZXQJCSpwYWNrZXQ7Ci0Jc3RydWN0IGlucHV0X2RldgkJKmlucHV0X2RldjsKLQlzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlCQkqbTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQkqeDsKLQlpbnQJCQkJdnJlZjsKLQlpbnQJCQkJZXJyOworCXN0cnVjdCBhZHM3ODQ2ICp0czsKKwlzdHJ1Y3QgYWRzNzg0Nl9wYWNrZXQgKnBhY2tldDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJY29uc3Qgc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4OworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCWludCB2cmVmOworCWludCBlcnI7CiAKIAlpZiAoIXNwaS0+aXJxKSB7CiAJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gSVJRP1xuIik7CkBAIC0xMDA4LDE2ICsxMDczLDI2IEBACiAKIAlzcGlfbWVzc2FnZV9pbml0KG0pOwogCi0JLyogeS0gc3RpbGwgb247IHR1cm4gb24gb25seSB5KyAoYW5kIEFEQykgKi8KLQlwYWNrZXQtPnJlYWRfeSA9IFJFQURfWSh2cmVmKTsKLQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3k7Ci0JeC0+bGVuID0gMTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKKwlpZiAodHMtPm1vZGVsID09IDc4NDUpIHsKKwkJcGFja2V0LT5yZWFkX3lfY21kWzBdID0gUkVBRF9ZKHZyZWYpOworCQlwYWNrZXQtPnJlYWRfeV9jbWRbMV0gPSAwOworCQlwYWNrZXQtPnJlYWRfeV9jbWRbMl0gPSAwOworCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3lfY21kWzBdOworCQl4LT5yeF9idWYgPSAmcGFja2V0LT50Yy55X2J1ZlswXTsKKwkJeC0+bGVuID0gMzsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CisJfSBlbHNlIHsKKwkJLyogeS0gc3RpbGwgb247IHR1cm4gb24gb25seSB5KyAoYW5kIEFEQykgKi8KKwkJcGFja2V0LT5yZWFkX3kgPSBSRUFEX1kodnJlZik7CisJCXgtPnR4X2J1ZiA9ICZwYWNrZXQtPnJlYWRfeTsKKwkJeC0+bGVuID0gMTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKLQl4Kys7Ci0JeC0+cnhfYnVmID0gJnBhY2tldC0+dGMueTsKLQl4LT5sZW4gPSAyOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCQl4Kys7CisJCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLnk7CisJCXgtPmxlbiA9IDI7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCX0KIAogCS8qIHRoZSBmaXJzdCBzYW1wbGUgYWZ0ZXIgc3dpdGNoaW5nIGRyaXZlcnMgY2FuIGJlIGxvdyBxdWFsaXR5OwogCSAqIG9wdGlvbmFsbHkgZGlzY2FyZCBpdCwgdXNpbmcgYSBzZWNvbmQgb25lIGFmdGVyIHRoZSBzaWduYWxzCkBAIC0xMDQzLDE3ICsxMTE4LDI4IEBACiAJbSsrOwogCXNwaV9tZXNzYWdlX2luaXQobSk7CiAKLQkvKiB0dXJuIHktIG9mZiwgeCsgb24sIHRoZW4gbGVhdmUgaW4gbG93cG93ZXIgKi8KLQl4Kys7Ci0JcGFja2V0LT5yZWFkX3ggPSBSRUFEX1godnJlZik7Ci0JeC0+dHhfYnVmID0gJnBhY2tldC0+cmVhZF94OwotCXgtPmxlbiA9IDE7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CisJaWYgKHRzLT5tb2RlbCA9PSA3ODQ1KSB7CisJCXgrKzsKKwkJcGFja2V0LT5yZWFkX3hfY21kWzBdID0gUkVBRF9YKHZyZWYpOworCQlwYWNrZXQtPnJlYWRfeF9jbWRbMV0gPSAwOworCQlwYWNrZXQtPnJlYWRfeF9jbWRbMl0gPSAwOworCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3hfY21kWzBdOworCQl4LT5yeF9idWYgPSAmcGFja2V0LT50Yy54X2J1ZlswXTsKKwkJeC0+bGVuID0gMzsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CisJfSBlbHNlIHsKKwkJLyogdHVybiB5LSBvZmYsIHgrIG9uLCB0aGVuIGxlYXZlIGluIGxvd3Bvd2VyICovCisJCXgrKzsKKwkJcGFja2V0LT5yZWFkX3ggPSBSRUFEX1godnJlZik7CisJCXgtPnR4X2J1ZiA9ICZwYWNrZXQtPnJlYWRfeDsKKwkJeC0+bGVuID0gMTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKLQl4Kys7Ci0JeC0+cnhfYnVmID0gJnBhY2tldC0+dGMueDsKLQl4LT5sZW4gPSAyOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCQl4Kys7CisJCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLng7CisJCXgtPmxlbiA9IDI7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCX0KIAogCS8qIC4uLiBtYXliZSBkaXNjYXJkIGZpcnN0IHNhbXBsZSAuLi4gKi8KIAlpZiAocGRhdGEtPnNldHRsZV9kZWxheV91c2VjcykgewpAQCAtMTE0NCwxNSArMTIzMCwyNSBAQAogCW0rKzsKIAlzcGlfbWVzc2FnZV9pbml0KG0pOwogCi0JeCsrOwotCXBhY2tldC0+cHdyZG93biA9IFBXUkRPV047Ci0JeC0+dHhfYnVmID0gJnBhY2tldC0+cHdyZG93bjsKLQl4LT5sZW4gPSAxOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCWlmICh0cy0+bW9kZWwgPT0gNzg0NSkgeworCQl4Kys7CisJCXBhY2tldC0+cHdyZG93bl9jbWRbMF0gPSBQV1JET1dOOworCQlwYWNrZXQtPnB3cmRvd25fY21kWzFdID0gMDsKKwkJcGFja2V0LT5wd3Jkb3duX2NtZFsyXSA9IDA7CisJCXgtPnR4X2J1ZiA9ICZwYWNrZXQtPnB3cmRvd25fY21kWzBdOworCQl4LT5sZW4gPSAzOworCX0gZWxzZSB7CisJCXgrKzsKKwkJcGFja2V0LT5wd3Jkb3duID0gUFdSRE9XTjsKKwkJeC0+dHhfYnVmID0gJnBhY2tldC0+cHdyZG93bjsKKwkJeC0+bGVuID0gMTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKLQl4Kys7Ci0JeC0+cnhfYnVmID0gJnBhY2tldC0+ZHVtbXk7Ci0JeC0+bGVuID0gMjsKKwkJeCsrOworCQl4LT5yeF9idWYgPSAmcGFja2V0LT5kdW1teTsKKwkJeC0+bGVuID0gMjsKKwl9CisKIAlDU19DSEFOR0UoKngpOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOwogCkBAIC0xMTc0LDE3ICsxMjcwLDIyIEBACiAJCWdvdG8gZXJyX3B1dF9yZWd1bGF0b3I7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBhZHM3ODQ2X2lycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCQlzcGktPmRldi5kcml2ZXItPm5hbWUsIHRzKSkgeworCWlycV9mbGFncyA9IHBkYXRhLT5pcnFfZmxhZ3MgPyA6IElSUUZfVFJJR0dFUl9GQUxMSU5HOworCisJZXJyID0gcmVxdWVzdF9pcnEoc3BpLT5pcnEsIGFkczc4NDZfaXJxLCBpcnFfZmxhZ3MsCisJCQkgIHNwaS0+ZGV2LmRyaXZlci0+bmFtZSwgdHMpOworCisJaWYgKGVyciAmJiAhcGRhdGEtPmlycV9mbGFncykgewogCQlkZXZfaW5mbygmc3BpLT5kZXYsCiAJCQkidHJ5aW5nIHBpbiBjaGFuZ2Ugd29ya2Fyb3VuZCBvbiBpcnEgJWRcbiIsIHNwaS0+aXJxKTsKIAkJZXJyID0gcmVxdWVzdF9pcnEoc3BpLT5pcnEsIGFkczc4NDZfaXJxLAogCQkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCSAgc3BpLT5kZXYuZHJpdmVyLT5uYW1lLCB0cyk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiaXJxICVkIGJ1c3k/XG4iLCBzcGktPmlycSk7Ci0JCQlnb3RvIGVycl9kaXNhYmxlX3JlZ3VsYXRvcjsKLQkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIHNwaS0+aXJxKTsKKwkJZ290byBlcnJfZGlzYWJsZV9yZWd1bGF0b3I7CiAJfQogCiAJZXJyID0gYWRzNzg0eF9od21vbl9yZWdpc3RlcihzcGksIHRzKTsKQEAgLTExOTYsOCArMTI5NywxMSBAQAogCS8qIHRha2UgYSBmaXJzdCBzYW1wbGUsIGxlYXZpbmcgblBFTklSUSBhY3RpdmUgYW5kIHZSRUYgb2ZmOyBhdm9pZAogCSAqIHRoZSB0b3VjaHNjcmVlbiwgaW4gY2FzZSBpdCdzIG5vdCBjb25uZWN0ZWQuCiAJICovCi0JKHZvaWQpIGFkczc4NDZfcmVhZDEyX3Nlcigmc3BpLT5kZXYsCi0JCQkgIFJFQURfMTJCSVRfU0VSKHZhdXgpIHwgQURTX1BEMTBfQUxMX09OKTsKKwlpZiAodHMtPm1vZGVsID09IDc4NDUpCisJCWFkczc4NDVfcmVhZDEyX3Nlcigmc3BpLT5kZXYsIFBXUkRPV04pOworCWVsc2UKKwkJKHZvaWQpIGFkczc4NDZfcmVhZDEyX3Nlcigmc3BpLT5kZXYsCisJCQkJUkVBRF8xMkJJVF9TRVIodmF1eCkgfCBBRFNfUEQxMF9BTExfT04pOwogCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmYWRzNzg0eF9hdHRyX2dyb3VwKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jeThjdG1nMTEwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2N5OGN0bWcxMTBfdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI3ZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jeThjdG1nMTEwX3RzLmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBEcml2ZXIgZm9yIGN5cHJlc3MgdG91Y2ggc2NyZWVuIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQWF2YSBNb2JpbGUKKyAqCisgKiBTb21lIGNsZWFudXBzIGJ5IEFsYW4gQ294IDxhbGFuQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvY3k4Y3RtZzExMF9wZGF0YS5oPgorCisjZGVmaW5lIENZOENUTUcxMTBfRFJJVkVSX05BTUUgICAgICAiY3k4Y3RtZzExMCIKKworLyogVG91Y2ggY29vcmRpbmF0ZXMgKi8KKyNkZWZpbmUgQ1k4Q1RNRzExMF9YX01JTgkJMAorI2RlZmluZSBDWThDVE1HMTEwX1lfTUlOCQkwCisjZGVmaW5lIENZOENUTUcxMTBfWF9NQVgJCTc1OQorI2RlZmluZSBDWThDVE1HMTEwX1lfTUFYCQk0NjUKKworCisvKiBjeThjdG1nMTEwIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIENZOENUTUcxMTBfVE9VQ0hfV0FLRVVQX1RJTUUJMAorI2RlZmluZSBDWThDVE1HMTEwX1RPVUNIX1NMRUVQX1RJTUUJMgorI2RlZmluZSBDWThDVE1HMTEwX1RPVUNIX1gxCQkzCisjZGVmaW5lIENZOENUTUcxMTBfVE9VQ0hfWTEJCTUKKyNkZWZpbmUgQ1k4Q1RNRzExMF9UT1VDSF9YMgkJNworI2RlZmluZSBDWThDVE1HMTEwX1RPVUNIX1kyCQk5CisjZGVmaW5lIENZOENUTUcxMTBfRklOR0VSUwkJMTEKKyNkZWZpbmUgQ1k4Q1RNRzExMF9HRVNUVVJFCQkxMgorI2RlZmluZSBDWThDVE1HMTEwX1JFR19NQVgJCTEzCisKKworLyoKKyAqIFRoZSB0b3VjaCBkcml2ZXIgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgY3k4Y3RtZzExMCB7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJY2hhciBwaHlzWzMyXTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXNldF9waW47CisJaW50IGlycV9waW47Cit9OworCisvKgorICogY3k4Y3RtZzExMF9wb3dlciBpcyB0aGUgcm91dGluZSB0aGF0IGlzIGNhbGxlZCB3aGVuIHRvdWNoIGhhcmR3YXJlCisgKiB3aWxsIHBvd2VyZWQgb2ZmIG9yIG9uLgorICovCitzdGF0aWMgdm9pZCBjeThjdG1nMTEwX3Bvd2VyKHN0cnVjdCBjeThjdG1nMTEwICp0cywgYm9vbCBwb3dlcm9uKQoreworCWlmICh0cy0+cmVzZXRfcGluKQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQodHMtPnJlc2V0X3BpbiwgMSAtIHBvd2Vyb24pOworfQorCitzdGF0aWMgaW50IGN5OGN0bWcxMTBfd3JpdGVfcmVncyhzdHJ1Y3QgY3k4Y3RtZzExMCAqdHNjLCB1bnNpZ25lZCBjaGFyIHJlZywKKwkJdW5zaWduZWQgY2hhciBsZW4sIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0c2MtPmNsaWVudDsKKwl1bnNpZ25lZCBpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgaTJjX2RhdGFbNl07CisKKwlCVUdfT04obGVuID4gNSk7CisKKwlpMmNfZGF0YVswXSA9IHJlZzsKKwltZW1jcHkoaTJjX2RhdGEgKyAxLCB2YWx1ZSwgbGVuKTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGkyY19kYXRhLCBsZW4gKyAxKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpMmMgd3JpdGUgZGF0YSBjbWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeThjdG1nMTEwX3JlYWRfcmVncyhzdHJ1Y3QgY3k4Y3RtZzExMCAqdHNjLAorCQl1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBjaGFyIGxlbiwgdW5zaWduZWQgY2hhciBjbWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRzYy0+Y2xpZW50OworCXVuc2lnbmVkIGludCByZXQ7CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQkvKiBmaXJzdCB3cml0ZSBzbGF2ZSBwb3NpdGlvbiB0byBpMmMgZGV2aWNlcyAqLworCQl7IGNsaWVudC0+YWRkciwgMCwgMSwgJmNtZCB9LAorCQkvKiBTZWNvbmQgcmVhZCBkYXRhIGZyb20gcG9zaXRpb24gKi8KKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCBsZW4sIGRhdGEgfQorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3k4Y3RtZzExMF90b3VjaF9wb3Moc3RydWN0IGN5OGN0bWcxMTAgKnRzYykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHRzYy0+aW5wdXQ7CisJdW5zaWduZWQgY2hhciByZWdfcFtDWThDVE1HMTEwX1JFR19NQVhdOworCWludCB4LCB5OworCisJbWVtc2V0KHJlZ19wLCAwLCBDWThDVE1HMTEwX1JFR19NQVgpOworCisJLyogUmVhZGluZyBjb29yZGluYXRlcyAqLworCWlmIChjeThjdG1nMTEwX3JlYWRfcmVncyh0c2MsIHJlZ19wLCA5LCBDWThDVE1HMTEwX1RPVUNIX1gxKSAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCXkgPSByZWdfcFsyXSA8PCA4IHwgcmVnX3BbM107CisJeCA9IHJlZ19wWzBdIDw8IDggfCByZWdfcFsxXTsKKworCS8qIE51bWJlciBvZiB0b3VjaCAqLworCWlmIChyZWdfcFs4XSA9PSAwKSB7CisJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgMCk7CisJfSBlbHNlICB7CisJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgMSk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19YLCB4KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1ksIHkpOworCX0KKworCWlucHV0X3N5bmMoaW5wdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3k4Y3RtZzExMF9zZXRfc2xlZXBtb2RlKHN0cnVjdCBjeThjdG1nMTEwICp0cywgYm9vbCBzbGVlcCkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlZ19wWzNdOworCisJaWYgKHNsZWVwKSB7CisJCXJlZ19wWzBdID0gMHgwMDsKKwkJcmVnX3BbMV0gPSAweGZmOworCQlyZWdfcFsyXSA9IDU7CisJfSBlbHNlIHsKKwkJcmVnX3BbMF0gPSAweDEwOworCQlyZWdfcFsxXSA9IDB4ZmY7CisJCXJlZ19wWzJdID0gMDsKKwl9CisKKwlyZXR1cm4gY3k4Y3RtZzExMF93cml0ZV9yZWdzKHRzLCBDWThDVE1HMTEwX1RPVUNIX1dBS0VVUF9USU1FLCAzLCByZWdfcCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjeThjdG1nMTEwX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBjeThjdG1nMTEwICp0c2MgPSBkZXZfaWQ7CisKKwljeThjdG1nMTEwX3RvdWNoX3Bvcyh0c2MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjeThjdG1nMTEwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgY3k4Y3RtZzExMF9wZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjeThjdG1nMTEwICp0czsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IGVycjsKKworCS8qIE5vIHBkYXRhIG5vIHdheSBmb3J3YXJkICovCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJubyBwZGF0YVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCQlJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpCisJCXJldHVybiAtRUlPOworCisJdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3k4Y3RtZzExMCksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghdHMgfHwgIWlucHV0X2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwl0cy0+Y2xpZW50ID0gY2xpZW50OworCXRzLT5pbnB1dCA9IGlucHV0X2RldjsKKworCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLAorCQkgIiVzL2lucHV0MCIsIGRldl9uYW1lKCZjbGllbnQtPmRldikpOworCisJaW5wdXRfZGV2LT5uYW1lID0gQ1k4Q1RNRzExMF9EUklWRVJfTkFNRSAiIFRvdWNoc2NyZWVuIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSB0cy0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLAorCQkJQ1k4Q1RNRzExMF9YX01JTiwgQ1k4Q1RNRzExMF9YX01BWCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwKKwkJCUNZOENUTUcxMTBfWV9NSU4sIENZOENUTUcxMTBfWV9NQVgsIDAsIDApOworCisJaWYgKHRzLT5yZXNldF9waW4pIHsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0KHRzLT5yZXNldF9waW4sIE5VTEwpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiVW5hYmxlIHRvIHJlcXVlc3QgR1BJTyBwaW4gJWQuXG4iLAorCQkJCXRzLT5yZXNldF9waW4pOworCQkJZ290byBlcnJfZnJlZV9tZW07CisJCX0KKwl9CisKKwljeThjdG1nMTEwX3Bvd2VyKHRzLCB0cnVlKTsKKwljeThjdG1nMTEwX3NldF9zbGVlcG1vZGUodHMsIGZhbHNlKTsKKworCWVyciA9IGdwaW9fcmVxdWVzdCh0cy0+aXJxX3BpbiwgInRvdWNoX2lycV9rZXkiKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJGYWlsZWQgdG8gcmVxdWVzdCBHUElPICVkLCBlcnJvciAlZFxuIiwKKwkJCXRzLT5pcnFfcGluLCBlcnIpOworCQlnb3RvIGVycl9zaHV0b2ZmX2RldmljZTsKKwl9CisKKwllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dCh0cy0+aXJxX3Bpbik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnB1dCBkaXJlY3Rpb24gZm9yIEdQSU8gJWQsIGVycm9yICVkXG4iLAorCQkJdHMtPmlycV9waW4sIGVycik7CisJCWdvdG8gZXJyX2ZyZWVfaXJxX2dwaW87CisJfQorCisJY2xpZW50LT5pcnEgPSBncGlvX3RvX2lycSh0cy0+aXJxX3Bpbik7CisJaWYgKGNsaWVudC0+aXJxIDwgMCkgeworCQllcnIgPSBjbGllbnQtPmlycTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiVW5hYmxlIHRvIGdldCBpcnEgbnVtYmVyIGZvciBHUElPICVkLCBlcnJvciAlZFxuIiwKKwkJCXRzLT5pcnFfcGluLCBlcnIpOworCQlnb3RvIGVycl9mcmVlX2lycV9ncGlvOworCX0KKworCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLCBOVUxMLCBjeThjdG1nMTEwX2lycV90aHJlYWQsCisJCQkJICAgSVJRRl9UUklHR0VSX1JJU0lORywgInRvdWNoX3Jlc2V0X2tleSIsIHRzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJpcnEgJWQgYnVzeT8gZXJyb3IgJWRcbiIsIGNsaWVudC0+aXJxLCBlcnIpOworCQlnb3RvIGVycl9mcmVlX2lycV9ncGlvOworCX0KKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdHMpOworCWRldmljZV9pbml0X3dha2V1cCgmY2xpZW50LT5kZXYsIDEpOworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKK2Vycl9mcmVlX2lycV9ncGlvOgorCWdwaW9fZnJlZSh0cy0+aXJxX3Bpbik7CitlcnJfc2h1dG9mZl9kZXZpY2U6CisJY3k4Y3RtZzExMF9zZXRfc2xlZXBtb2RlKHRzLCB0cnVlKTsKKwljeThjdG1nMTEwX3Bvd2VyKHRzLCBmYWxzZSk7CisJaWYgKHRzLT5yZXNldF9waW4pCisJCWdwaW9fZnJlZSh0cy0+cmVzZXRfcGluKTsKK2Vycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKHRzKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGN5OGN0bWcxMTBfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgY3k4Y3RtZzExMCAqdHMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpKQorCQllbmFibGVfaXJxX3dha2UoY2xpZW50LT5pcnEpOworCWVsc2UgeworCQljeThjdG1nMTEwX3NldF9zbGVlcG1vZGUodHMsIHRydWUpOworCQljeThjdG1nMTEwX3Bvd2VyKHRzLCBmYWxzZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN5OGN0bWcxMTBfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGN5OGN0bWcxMTAgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisJZWxzZSB7CisJCWN5OGN0bWcxMTBfcG93ZXIodHMsIHRydWUpOworCQljeThjdG1nMTEwX3NldF9zbGVlcG1vZGUodHMsIGZhbHNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmV4aXQgY3k4Y3RtZzExMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgY3k4Y3RtZzExMCAqdHMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWN5OGN0bWcxMTBfc2V0X3NsZWVwbW9kZSh0cywgdHJ1ZSk7CisJY3k4Y3RtZzExMF9wb3dlcih0cywgZmFsc2UpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cy0+aW5wdXQpOworCWdwaW9fZnJlZSh0cy0+aXJxX3Bpbik7CisJaWYgKHRzLT5yZXNldF9waW4pCisJCWdwaW9fZnJlZSh0cy0+cmVzZXRfcGluKTsKKwlrZnJlZSh0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIGN5OGN0bWcxMTBfaWR0YWJsZVtdID0geworCXsgQ1k4Q1RNRzExMF9EUklWRVJfTkFNRSwgMSB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGN5OGN0bWcxMTBfaWR0YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBjeThjdG1nMTEwX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gQ1k4Q1RNRzExMF9EUklWRVJfTkFNRSwKKwl9LAorCS5pZF90YWJsZQk9IGN5OGN0bWcxMTBfaWR0YWJsZSwKKwkucHJvYmUJCT0gY3k4Y3RtZzExMF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGN5OGN0bWcxMTBfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGN5OGN0bWcxMTBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGN5OGN0bWcxMTBfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjeThjdG1nMTEwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmN5OGN0bWcxMTBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGN5OGN0bWcxMTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZjeThjdG1nMTEwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGN5OGN0bWcxMTBfaW5pdCk7Cittb2R1bGVfZXhpdChjeThjdG1nMTEwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTYW11bGkgS29udHRpbGEgPHNhbXVsaS5rb250dGlsYUBhYXZhbW9iaWxlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiY3k4Y3RtZzExMCBUb3VjaFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWNzNTAwMF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tY3M1MDAwX3RzLmMKaW5kZXggMWZiMGMyZi4uNmVlOTk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tY3M1MDAwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tY3M1MDAwX3RzLmMKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL21jczUwMDBfdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvbWNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTEwNSw3ICsxMDUsNyBAQAogc3RydWN0IG1jczUwMDBfdHNfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0JY29uc3Qgc3RydWN0IG1jczUwMDBfdHNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKKwljb25zdCBzdHJ1Y3QgbWNzX3BsYXRmb3JtX2RhdGEgKnBsYXRmb3JtX2RhdGE7CiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbWNzNTAwMF90c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIHN0YXRpYyB2b2lkIG1jczUwMDBfdHNfcGh5c19pbml0KHN0cnVjdCBtY3M1MDAwX3RzX2RhdGEgKmRhdGEpCiB7Ci0JY29uc3Qgc3RydWN0IG1jczUwMDBfdHNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YSA9CisJY29uc3Qgc3RydWN0IG1jc19wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhID0KIAkJZGF0YS0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3F0NjAyMjQwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3F0NjAyMjQwX3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiMjZhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vcXQ2MDIyNDBfdHMuYwpAQCAtMCwwICsxLDE0MDEgQEAKKy8qCisgKiBBVDQyUVQ2MDIyNDAvQVRNWFQyMjQgVG91Y2hzY3JlZW4gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvcXQ2MDIyNDBfdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyogVmVyc2lvbiAqLworI2RlZmluZSBRVDYwMjI0MF9WRVJfMjAJCQkyMAorI2RlZmluZSBRVDYwMjI0MF9WRVJfMjEJCQkyMQorI2RlZmluZSBRVDYwMjI0MF9WRVJfMjIJCQkyMgorCisvKiBTbGF2ZSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfQVBQX0xPVwkJMHg0YQorI2RlZmluZSBRVDYwMjI0MF9BUFBfSElHSAkJMHg0YgorI2RlZmluZSBRVDYwMjI0MF9CT09UX0xPVwkJMHgyNAorI2RlZmluZSBRVDYwMjI0MF9CT09UX0hJR0gJCTB4MjUKKworLyogRmlybXdhcmUgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfRldfTkFNRQkJInF0NjAyMjQwLmZ3IgorCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfRkFNSUxZX0lECQkweDAwCisjZGVmaW5lIFFUNjAyMjQwX1ZBUklBTlRfSUQJCTB4MDEKKyNkZWZpbmUgUVQ2MDIyNDBfVkVSU0lPTgkJMHgwMgorI2RlZmluZSBRVDYwMjI0MF9CVUlMRAkJCTB4MDMKKyNkZWZpbmUgUVQ2MDIyNDBfTUFUUklYX1hfU0laRQkJMHgwNAorI2RlZmluZSBRVDYwMjI0MF9NQVRSSVhfWV9TSVpFCQkweDA1CisjZGVmaW5lIFFUNjAyMjQwX09CSkVDVF9OVU0JCTB4MDYKKyNkZWZpbmUgUVQ2MDIyNDBfT0JKRUNUX1NUQVJUCQkweDA3CisKKyNkZWZpbmUgUVQ2MDIyNDBfT0JKRUNUX1NJWkUJCTYKKworLyogT2JqZWN0IHR5cGVzICovCisjZGVmaW5lIFFUNjAyMjQwX0RFQlVHX0RJQUdOT1NUSUMJMzcKKyNkZWZpbmUgUVQ2MDIyNDBfR0VOX01FU1NBR0UJCTUKKyNkZWZpbmUgUVQ2MDIyNDBfR0VOX0NPTU1BTkQJCTYKKyNkZWZpbmUgUVQ2MDIyNDBfR0VOX1BPV0VSCQk3CisjZGVmaW5lIFFUNjAyMjQwX0dFTl9BQ1FVSVJFCQk4CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX01VTFRJCQk5CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX0tFWUFSUkFZCQkxNQorI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9QUk9YSU1JVFkJMjMKKyNkZWZpbmUgUVQ2MDIyNDBfUFJPQ0lfR1JJUEZBQ0UJCTIwCisjZGVmaW5lIFFUNjAyMjQwX1BST0NHX05PSVNFCQkyMgorI2RlZmluZSBRVDYwMjI0MF9QUk9DSV9PTkVUT1VDSAkJMjQKKyNkZWZpbmUgUVQ2MDIyNDBfUFJPQ0lfVFdPVE9VQ0gJCTI3CisjZGVmaW5lIFFUNjAyMjQwX1NQVF9DT01NU0NPTkZJRwkxOAkvKiBmaXJtd2FyZSB2ZXIgMjEgb3ZlciAqLworI2RlZmluZSBRVDYwMjI0MF9TUFRfR1BJT1BXTQkJMTkKKyNkZWZpbmUgUVQ2MDIyNDBfU1BUX1NFTEZURVNUCQkyNQorI2RlZmluZSBRVDYwMjI0MF9TUFRfQ1RFQ09ORklHCQkyOAorI2RlZmluZSBRVDYwMjI0MF9TUFRfVVNFUkRBVEEJCTM4CS8qIGZpcm13YXJlIHZlciAyMSBvdmVyICovCisKKy8qIFFUNjAyMjQwX0dFTl9DT01NQU5EIGZpZWxkICovCisjZGVmaW5lIFFUNjAyMjQwX0NPTU1BTkRfUkVTRVQJCTAKKyNkZWZpbmUgUVQ2MDIyNDBfQ09NTUFORF9CQUNLVVBOVgkxCisjZGVmaW5lIFFUNjAyMjQwX0NPTU1BTkRfQ0FMSUJSQVRFCTIKKyNkZWZpbmUgUVQ2MDIyNDBfQ09NTUFORF9SRVBPUlRBTEwJMworI2RlZmluZSBRVDYwMjI0MF9DT01NQU5EX0RJQUdOT1NUSUMJNQorCisvKiBRVDYwMjI0MF9HRU5fUE9XRVIgZmllbGQgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfUE9XRVJfSURMRUFDUUlOVAkwCisjZGVmaW5lIFFUNjAyMjQwX1BPV0VSX0FDVFZBQ1FJTlQJMQorI2RlZmluZSBRVDYwMjI0MF9QT1dFUl9BQ1RWMklETEVUTwkyCisKKy8qIFFUNjAyMjQwX0dFTl9BQ1FVSVJFIGZpZWxkICovCisjZGVmaW5lIFFUNjAyMjQwX0FDUVVJUkVfQ0hSR1RJTUUJMAorI2RlZmluZSBRVDYwMjI0MF9BQ1FVSVJFX1RDSERSSUZUCTIKKyNkZWZpbmUgUVQ2MDIyNDBfQUNRVUlSRV9EUklGVFNUCTMKKyNkZWZpbmUgUVQ2MDIyNDBfQUNRVUlSRV9UQ0hBVVRPQ0FMCTQKKyNkZWZpbmUgUVQ2MDIyNDBfQUNRVUlSRV9TWU5DCQk1CisjZGVmaW5lIFFUNjAyMjQwX0FDUVVJUkVfQVRDSENBTFNUCTYKKyNkZWZpbmUgUVQ2MDIyNDBfQUNRVUlSRV9BVENIQ0FMU1RIUgk3CisKKy8qIFFUNjAyMjQwX1RPVUNIX01VTFRJIGZpZWxkICovCisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX0NUUkwJCTAKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWE9SSUdJTgkJMQorI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9ZT1JJR0lOCQkyCisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX1hTSVpFCQkzCisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX1lTSVpFCQk0CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX0JMRU4JCTYKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfVENIVEhSCQk3CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX1RDSERJCQk4CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX09SSUVOVAkJOQorI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9NT1ZIWVNUSQkJMTEKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfTU9WSFlTVE4JCTEyCisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX05VTVRPVUNICQkxNAorI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9NUkdIWVNUCQkxNQorI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9NUkdUSFIJCTE2CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX0FNUEhZU1QJCTE3CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX1hSQU5HRV9MU0IJMTgKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWFJBTkdFX01TQgkxOQorI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9ZUkFOR0VfTFNCCTIwCisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX1lSQU5HRV9NU0IJMjEKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWExPQ0xJUAkJMjIKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWEhJQ0xJUAkJMjMKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWUxPQ0xJUAkJMjQKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWUhJQ0xJUAkJMjUKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWEVER0VDVFJMCTI2CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX1hFREdFRElTVAkyNworI2RlZmluZSBRVDYwMjI0MF9UT1VDSF9ZRURHRUNUUkwJMjgKKyNkZWZpbmUgUVQ2MDIyNDBfVE9VQ0hfWUVER0VESVNUCTI5CisjZGVmaW5lIFFUNjAyMjQwX1RPVUNIX0pVTVBMSU1JVAkzMAkvKiBmaXJtd2FyZSB2ZXIgMjIgb3ZlciAqLworCisvKiBRVDYwMjI0MF9QUk9DSV9HUklQRkFDRSBmaWVsZCAqLworI2RlZmluZSBRVDYwMjI0MF9HUklQRkFDRV9DVFJMCQkwCisjZGVmaW5lIFFUNjAyMjQwX0dSSVBGQUNFX1hMT0dSSVAJMQorI2RlZmluZSBRVDYwMjI0MF9HUklQRkFDRV9YSElHUklQCTIKKyNkZWZpbmUgUVQ2MDIyNDBfR1JJUEZBQ0VfWUxPR1JJUAkzCisjZGVmaW5lIFFUNjAyMjQwX0dSSVBGQUNFX1lISUdSSVAJNAorI2RlZmluZSBRVDYwMjI0MF9HUklQRkFDRV9NQVhUQ0hTCTUKKyNkZWZpbmUgUVQ2MDIyNDBfR1JJUEZBQ0VfU1pUSFIxCTcKKyNkZWZpbmUgUVQ2MDIyNDBfR1JJUEZBQ0VfU1pUSFIyCTgKKyNkZWZpbmUgUVQ2MDIyNDBfR1JJUEZBQ0VfU0hQVEhSMQk5CisjZGVmaW5lIFFUNjAyMjQwX0dSSVBGQUNFX1NIUFRIUjIJMTAKKyNkZWZpbmUgUVQ2MDIyNDBfR1JJUEZBQ0VfU1VQRVhUVE8JMTEKKworLyogUVQ2MDIyNDBfUFJPQ0lfTk9JU0UgZmllbGQgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfTk9JU0VfQ1RSTAkJMAorI2RlZmluZSBRVDYwMjI0MF9OT0lTRV9PVVRGTEVOCQkxCisjZGVmaW5lIFFUNjAyMjQwX05PSVNFX0dDQUZVTF9MU0IJMworI2RlZmluZSBRVDYwMjI0MF9OT0lTRV9HQ0FGVUxfTVNCCTQKKyNkZWZpbmUgUVQ2MDIyNDBfTk9JU0VfR0NBRkxMX0xTQgk1CisjZGVmaW5lIFFUNjAyMjQwX05PSVNFX0dDQUZMTF9NU0IJNgorI2RlZmluZSBRVDYwMjI0MF9OT0lTRV9BQ1RWR0NBRlZBTElECTcKKyNkZWZpbmUgUVQ2MDIyNDBfTk9JU0VfTk9JU0VUSFIJCTgKKyNkZWZpbmUgUVQ2MDIyNDBfTk9JU0VfRlJFUUhPUFNDQUxFCTEwCisjZGVmaW5lIFFUNjAyMjQwX05PSVNFX0ZSRVEwCQkxMQorI2RlZmluZSBRVDYwMjI0MF9OT0lTRV9GUkVRMQkJMTIKKyNkZWZpbmUgUVQ2MDIyNDBfTk9JU0VfRlJFUTIJCTEzCisjZGVmaW5lIFFUNjAyMjQwX05PSVNFX0ZSRVEzCQkxNAorI2RlZmluZSBRVDYwMjI0MF9OT0lTRV9GUkVRNAkJMTUKKyNkZWZpbmUgUVQ2MDIyNDBfTk9JU0VfSURMRUdDQUZWQUxJRAkxNgorCisvKiBRVDYwMjI0MF9TUFRfQ09NTVNDT05GSUcgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfQ09NTVNfQ1RSTAkJMAorI2RlZmluZSBRVDYwMjI0MF9DT01NU19DTUQJCTEKKworLyogUVQ2MDIyNDBfU1BUX0NURUNPTkZJRyBmaWVsZCAqLworI2RlZmluZSBRVDYwMjI0MF9DVEVfQ1RSTAkJMAorI2RlZmluZSBRVDYwMjI0MF9DVEVfQ01ECQkxCisjZGVmaW5lIFFUNjAyMjQwX0NURV9NT0RFCQkyCisjZGVmaW5lIFFUNjAyMjQwX0NURV9JRExFR0NBRkRFUFRICTMKKyNkZWZpbmUgUVQ2MDIyNDBfQ1RFX0FDVFZHQ0FGREVQVEgJNAorI2RlZmluZSBRVDYwMjI0MF9DVEVfVk9MVEFHRQkJNQkvKiBmaXJtd2FyZSB2ZXIgMjEgb3ZlciAqLworCisjZGVmaW5lIFFUNjAyMjQwX1ZPTFRBR0VfREVGQVVMVAkyNzAwMDAwCisjZGVmaW5lIFFUNjAyMjQwX1ZPTFRBR0VfU1RFUAkJMTAwMDAKKworLyogRGVmaW5lIGZvciBRVDYwMjI0MF9HRU5fQ09NTUFORCAqLworI2RlZmluZSBRVDYwMjI0MF9CT09UX1ZBTFVFCQkweGE1CisjZGVmaW5lIFFUNjAyMjQwX0JBQ0tVUF9WQUxVRQkJMHg1NQorI2RlZmluZSBRVDYwMjI0MF9CQUNLVVBfVElNRQkJMjUJLyogbXNlYyAqLworI2RlZmluZSBRVDYwMjI0MF9SRVNFVF9USU1FCQk2NQkvKiBtc2VjICovCisKKyNkZWZpbmUgUVQ2MDIyNDBfRldSRVNFVF9USU1FCQkxNzUJLyogbXNlYyAqLworCisvKiBDb21tYW5kIHRvIHVubG9jayBib290bG9hZGVyICovCisjZGVmaW5lIFFUNjAyMjQwX1VOTE9DS19DTURfTVNCCQkweGFhCisjZGVmaW5lIFFUNjAyMjQwX1VOTE9DS19DTURfTFNCCQkweGRjCisKKy8qIEJvb3Rsb2FkZXIgbW9kZSBzdGF0dXMgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfV0FJVElOR19CT09UTE9BRF9DTUQJMHhjMAkvKiB2YWxpZCA3IDYgYml0IG9ubHkgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfV0FJVElOR19GUkFNRV9EQVRBCTB4ODAJLyogdmFsaWQgNyA2IGJpdCBvbmx5ICovCisjZGVmaW5lIFFUNjAyMjQwX0ZSQU1FX0NSQ19DSEVDSwkweDAyCisjZGVmaW5lIFFUNjAyMjQwX0ZSQU1FX0NSQ19GQUlMCQkweDAzCisjZGVmaW5lIFFUNjAyMjQwX0ZSQU1FX0NSQ19QQVNTCQkweDA0CisjZGVmaW5lIFFUNjAyMjQwX0FQUF9DUkNfRkFJTAkJMHg0MAkvKiB2YWxpZCA3IDggYml0IG9ubHkgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfQk9PVF9TVEFUVVNfTUFTSwkweDNmCisKKy8qIFRvdWNoIHN0YXR1cyAqLworI2RlZmluZSBRVDYwMjI0MF9TVVBQUkVTUwkJKDEgPDwgMSkKKyNkZWZpbmUgUVQ2MDIyNDBfQU1QCQkJKDEgPDwgMikKKyNkZWZpbmUgUVQ2MDIyNDBfVkVDVE9SCQkJKDEgPDwgMykKKyNkZWZpbmUgUVQ2MDIyNDBfTU9WRQkJCSgxIDw8IDQpCisjZGVmaW5lIFFUNjAyMjQwX1JFTEVBU0UJCSgxIDw8IDUpCisjZGVmaW5lIFFUNjAyMjQwX1BSRVNTCQkJKDEgPDwgNikKKyNkZWZpbmUgUVQ2MDIyNDBfREVURUNUCQkJKDEgPDwgNykKKworLyogVG91Y2hzY3JlZW4gYWJzb2x1dGUgdmFsdWVzICovCisjZGVmaW5lIFFUNjAyMjQwX01BWF9YQwkJCTB4M2ZmCisjZGVmaW5lIFFUNjAyMjQwX01BWF9ZQwkJCTB4M2ZmCisjZGVmaW5lIFFUNjAyMjQwX01BWF9BUkVBCQkweGZmCisKKyNkZWZpbmUgUVQ2MDIyNDBfTUFYX0ZJTkdFUgkJMTAKKworLyogSW5pdGlhbCByZWdpc3RlciB2YWx1ZXMgcmVjb21tZW5kZWQgZnJvbSBjaGlwIHZlbmRvciAqLworc3RhdGljIGNvbnN0IHU4IGluaXRfdmFsc192ZXJfMjBbXSA9IHsKKwkvKiBRVDYwMjI0MF9HRU5fQ09NTUFORCg2KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfR0VOX1BPV0VSKDcpICovCisJMHgyMCwgMHhmZiwgMHgzMiwKKwkvKiBRVDYwMjI0MF9HRU5fQUNRVUlSRSg4KSAqLworCTB4MDgsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MTQsCisJLyogUVQ2MDIyNDBfVE9VQ0hfTVVMVEkoOSkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDExLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCTB4MDAsIDB4MDEsIDB4MDEsIDB4MGUsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg2NCwKKwkvKiBRVDYwMjI0MF9UT1VDSF9LRVlBUlJBWSgxNSkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsCisJLyogUVQ2MDIyNDBfU1BUX0dQSU9QV00oMTkpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLAorCS8qIFFUNjAyMjQwX1BST0NJX0dSSVBGQUNFKDIwKSAqLworCTB4MDAsIDB4NjQsIDB4NjQsIDB4NjQsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MWUsIDB4MTQsIDB4MDQsCisJMHgxZSwgMHgwMCwKKwkvKiBRVDYwMjI0MF9QUk9DR19OT0lTRSgyMikgKi8KKwkweDA1LCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweGU3LCAweGZmLCAweDA0LCAweDMyLCAweDAwLAorCTB4MDEsIDB4MGEsIDB4MGYsIDB4MTQsIDB4MDAsIDB4MDAsIDB4ZTgsCisJLyogUVQ2MDIyNDBfVE9VQ0hfUFJPWElNSVRZKDIzKSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9QUk9DSV9PTkVUT1VDSCgyNCkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfU1BUX1NFTEZURVNUKDI1KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9QUk9DSV9UV09UT1VDSCgyNykgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIFFUNjAyMjQwX1NQVF9DVEVDT05GSUcoMjgpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwOCwKK307CisKK3N0YXRpYyBjb25zdCB1OCBpbml0X3ZhbHNfdmVyXzIxW10gPSB7CisJLyogUVQ2MDIyNDBfR0VOX0NPTU1BTkQoNikgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIFFUNjAyMjQwX0dFTl9QT1dFUig3KSAqLworCTB4MjAsIDB4ZmYsIDB4MzIsCisJLyogUVQ2MDIyNDBfR0VOX0FDUVVJUkUoOCkgKi8KKwkweDBhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDIzLAorCS8qIFFUNjAyMjQwX1RPVUNIX01VTFRJKDkpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDAxLCAweDAxLCAweDBlLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfVE9VQ0hfS0VZQVJSQVkoMTUpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLAorCS8qIFFUNjAyMjQwX1NQVF9HUElPUFdNKDE5KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9QUk9DSV9HUklQRkFDRSgyMCkgKi8KKwkweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweDI4LCAweDA0LAorCTB4MGYsIDB4MGEsCisJLyogUVQ2MDIyNDBfUFJPQ0dfTk9JU0UoMjIpICovCisJMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgyMywgMHgwMCwKKwkweDAwLCAweDA1LCAweDBmLCAweDE5LCAweDIzLCAweDJkLCAweDAzLAorCS8qIFFUNjAyMjQwX1RPVUNIX1BST1hJTUlUWSgyMykgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfUFJPQ0lfT05FVE9VQ0goMjQpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIFFUNjAyMjQwX1NQVF9TRUxGVEVTVCgyNSkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfUFJPQ0lfVFdPVE9VQ0goMjcpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9TUFRfQ1RFQ09ORklHKDI4KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MTAsIDB4MDAsCit9OworCitzdGF0aWMgY29uc3QgdTggaW5pdF92YWxzX3Zlcl8yMltdID0geworCS8qIFFUNjAyMjQwX0dFTl9DT01NQU5EKDYpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9HRU5fUE9XRVIoNykgKi8KKwkweDIwLCAweGZmLCAweDMyLAorCS8qIFFUNjAyMjQwX0dFTl9BQ1FVSVJFKDgpICovCisJMHgwYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOSwgMHgyMywKKwkvKiBRVDYwMjI0MF9UT1VDSF9NVUxUSSg5KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHgwMSwgMHgwMSwgMHgwZSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsCisJLyogUVQ2MDIyNDBfVE9VQ0hfS0VZQVJSQVkoMTUpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLAorCS8qIFFUNjAyMjQwX1NQVF9HUElPUFdNKDE5KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9QUk9DSV9HUklQRkFDRSgyMCkgKi8KKwkweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweDI4LCAweDA0LAorCTB4MGYsIDB4MGEsCisJLyogUVQ2MDIyNDBfUFJPQ0dfTk9JU0UoMjIpICovCisJMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgyMywgMHgwMCwKKwkweDAwLCAweDA1LCAweDBmLCAweDE5LCAweDIzLCAweDJkLCAweDAzLAorCS8qIFFUNjAyMjQwX1RPVUNIX1BST1hJTUlUWSgyMykgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfUFJPQ0lfT05FVE9VQ0goMjQpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIFFUNjAyMjQwX1NQVF9TRUxGVEVTVCgyNSkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogUVQ2MDIyNDBfUFJPQ0lfVFdPVE9VQ0goMjcpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBRVDYwMjI0MF9TUFRfQ1RFQ09ORklHKDI4KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MTAsIDB4MDAsCit9OworCitzdHJ1Y3QgcXQ2MDIyNDBfaW5mbyB7CisJdTggZmFtaWx5X2lkOworCXU4IHZhcmlhbnRfaWQ7CisJdTggdmVyc2lvbjsKKwl1OCBidWlsZDsKKwl1OCBtYXRyaXhfeHNpemU7CisJdTggbWF0cml4X3lzaXplOworCXU4IG9iamVjdF9udW07Cit9OworCitzdHJ1Y3QgcXQ2MDIyNDBfb2JqZWN0IHsKKwl1OCB0eXBlOworCXUxNiBzdGFydF9hZGRyZXNzOworCXU4IHNpemU7CisJdTggaW5zdGFuY2VzOworCXU4IG51bV9yZXBvcnRfaWRzOworCisJLyogdG8gbWFwIG9iamVjdCBhbmQgbWVzc2FnZSAqLworCXU4IG1heF9yZXBvcnRpZDsKK307CisKK3N0cnVjdCBxdDYwMjI0MF9tZXNzYWdlIHsKKwl1OCByZXBvcnRpZDsKKwl1OCBtZXNzYWdlWzddOworCXU4IGNoZWNrc3VtOworfTsKKworc3RydWN0IHF0NjAyMjQwX2ZpbmdlciB7CisJaW50IHN0YXR1czsKKwlpbnQgeDsKKwlpbnQgeTsKKwlpbnQgYXJlYTsKK307CisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IHF0NjAyMjQwX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWNvbnN0IHN0cnVjdCBxdDYwMjI0MF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcXQ2MDIyNDBfb2JqZWN0ICpvYmplY3RfdGFibGU7CisJc3RydWN0IHF0NjAyMjQwX2luZm8gaW5mbzsKKwlzdHJ1Y3QgcXQ2MDIyNDBfZmluZ2VyIGZpbmdlcltRVDYwMjI0MF9NQVhfRklOR0VSXTsKKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKKworc3RhdGljIGJvb2wgcXQ2MDIyNDBfb2JqZWN0X3JlYWRhYmxlKHVuc2lnbmVkIGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUVQ2MDIyNDBfR0VOX01FU1NBR0U6CisJY2FzZSBRVDYwMjI0MF9HRU5fQ09NTUFORDoKKwljYXNlIFFUNjAyMjQwX0dFTl9QT1dFUjoKKwljYXNlIFFUNjAyMjQwX0dFTl9BQ1FVSVJFOgorCWNhc2UgUVQ2MDIyNDBfVE9VQ0hfTVVMVEk6CisJY2FzZSBRVDYwMjI0MF9UT1VDSF9LRVlBUlJBWToKKwljYXNlIFFUNjAyMjQwX1RPVUNIX1BST1hJTUlUWToKKwljYXNlIFFUNjAyMjQwX1BST0NJX0dSSVBGQUNFOgorCWNhc2UgUVQ2MDIyNDBfUFJPQ0dfTk9JU0U6CisJY2FzZSBRVDYwMjI0MF9QUk9DSV9PTkVUT1VDSDoKKwljYXNlIFFUNjAyMjQwX1BST0NJX1RXT1RPVUNIOgorCWNhc2UgUVQ2MDIyNDBfU1BUX0NPTU1TQ09ORklHOgorCWNhc2UgUVQ2MDIyNDBfU1BUX0dQSU9QV006CisJY2FzZSBRVDYwMjI0MF9TUFRfU0VMRlRFU1Q6CisJY2FzZSBRVDYwMjI0MF9TUFRfQ1RFQ09ORklHOgorCWNhc2UgUVQ2MDIyNDBfU1BUX1VTRVJEQVRBOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBxdDYwMjI0MF9vYmplY3Rfd3JpdGFibGUodW5zaWduZWQgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBRVDYwMjI0MF9HRU5fQ09NTUFORDoKKwljYXNlIFFUNjAyMjQwX0dFTl9QT1dFUjoKKwljYXNlIFFUNjAyMjQwX0dFTl9BQ1FVSVJFOgorCWNhc2UgUVQ2MDIyNDBfVE9VQ0hfTVVMVEk6CisJY2FzZSBRVDYwMjI0MF9UT1VDSF9LRVlBUlJBWToKKwljYXNlIFFUNjAyMjQwX1RPVUNIX1BST1hJTUlUWToKKwljYXNlIFFUNjAyMjQwX1BST0NJX0dSSVBGQUNFOgorCWNhc2UgUVQ2MDIyNDBfUFJPQ0dfTk9JU0U6CisJY2FzZSBRVDYwMjI0MF9QUk9DSV9PTkVUT1VDSDoKKwljYXNlIFFUNjAyMjQwX1BST0NJX1RXT1RPVUNIOgorCWNhc2UgUVQ2MDIyNDBfU1BUX0dQSU9QV006CisJY2FzZSBRVDYwMjI0MF9TUFRfU0VMRlRFU1Q6CisJY2FzZSBRVDYwMjI0MF9TUFRfQ1RFQ09ORklHOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgdm9pZCBxdDYwMjI0MF9kdW1wX21lc3NhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHF0NjAyMjQwX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJZGV2X2RiZyhkZXYsICJyZXBvcnRpZDpcdDB4JXhcbiIsIG1lc3NhZ2UtPnJlcG9ydGlkKTsKKwlkZXZfZGJnKGRldiwgIm1lc3NhZ2UxOlx0MHgleFxuIiwgbWVzc2FnZS0+bWVzc2FnZVswXSk7CisJZGV2X2RiZyhkZXYsICJtZXNzYWdlMjpcdDB4JXhcbiIsIG1lc3NhZ2UtPm1lc3NhZ2VbMV0pOworCWRldl9kYmcoZGV2LCAibWVzc2FnZTM6XHQweCV4XG4iLCBtZXNzYWdlLT5tZXNzYWdlWzJdKTsKKwlkZXZfZGJnKGRldiwgIm1lc3NhZ2U0Olx0MHgleFxuIiwgbWVzc2FnZS0+bWVzc2FnZVszXSk7CisJZGV2X2RiZyhkZXYsICJtZXNzYWdlNTpcdDB4JXhcbiIsIG1lc3NhZ2UtPm1lc3NhZ2VbNF0pOworCWRldl9kYmcoZGV2LCAibWVzc2FnZTY6XHQweCV4XG4iLCBtZXNzYWdlLT5tZXNzYWdlWzVdKTsKKwlkZXZfZGJnKGRldiwgIm1lc3NhZ2U3Olx0MHgleFxuIiwgbWVzc2FnZS0+bWVzc2FnZVs2XSk7CisJZGV2X2RiZyhkZXYsICJjaGVja3N1bTpcdDB4JXhcbiIsIG1lc3NhZ2UtPmNoZWNrc3VtKTsKK30KKworc3RhdGljIGludCBxdDYwMjI0MF9jaGVja19ib290bG9hZGVyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJdTggdmFsOworCityZWNoZWNrOgorCWlmIChpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCAmdmFsLCAxKSAhPSAxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IGkyYyByZWN2IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBRVDYwMjI0MF9XQUlUSU5HX0JPT1RMT0FEX0NNRDoKKwljYXNlIFFUNjAyMjQwX1dBSVRJTkdfRlJBTUVfREFUQToKKwkJdmFsICY9IH5RVDYwMjI0MF9CT09UX1NUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFFUNjAyMjQwX0ZSQU1FX0NSQ19QQVNTOgorCQlpZiAodmFsID09IFFUNjAyMjQwX0ZSQU1FX0NSQ19DSEVDSykKKwkJCWdvdG8gcmVjaGVjazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbCAhPSBzdGF0ZSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVudmFsaWQgYm9vdGxvYWRlciBtb2RlIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXQ2MDIyNDBfdW5sb2NrX2Jvb3Rsb2FkZXIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl1OCBidWZbMl07CisKKwlidWZbMF0gPSBRVDYwMjI0MF9VTkxPQ0tfQ01EX0xTQjsKKwlidWZbMV0gPSBRVDYwMjI0MF9VTkxPQ0tfQ01EX01TQjsKKworCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpICE9IDIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogaTJjIHNlbmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF0NjAyMjQwX2Z3X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSkKK3sKKwlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgZGF0YSwgZnJhbWVfc2l6ZSkgIT0gZnJhbWVfc2l6ZSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBpMmMgc2VuZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19xdDYwMjI0MF9yZWFkX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgIHUxNiByZWcsIHUxNiBsZW4sIHZvaWQgKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCXU4IGJ1ZlsyXTsKKworCWJ1ZlswXSA9IHJlZyAmIDB4ZmY7CisJYnVmWzFdID0gKHJlZyA+PiA4KSAmIDB4ZmY7CisKKwkvKiBXcml0ZSByZWdpc3RlciAqLworCXhmZXJbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwl4ZmVyWzBdLmZsYWdzID0gMDsKKwl4ZmVyWzBdLmxlbiA9IDI7CisJeGZlclswXS5idWYgPSBidWY7CisKKwkvKiBSZWFkIGRhdGEgKi8KKwl4ZmVyWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJeGZlclsxXS5mbGFncyA9IEkyQ19NX1JEOworCXhmZXJbMV0ubGVuID0gbGVuOworCXhmZXJbMV0uYnVmID0gdmFsOworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIHhmZXIsIDIpICE9IDIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogaTJjIHRyYW5zZmVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdDYwMjI0MF9yZWFkX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1OCAqdmFsKQoreworCXJldHVybiBfX3F0NjAyMjQwX3JlYWRfcmVnKGNsaWVudCwgcmVnLCAxLCB2YWwpOworfQorCitzdGF0aWMgaW50IHF0NjAyMjQwX3dyaXRlX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1OCB2YWwpCit7CisJdTggYnVmWzNdOworCisJYnVmWzBdID0gcmVnICYgMHhmZjsKKwlidWZbMV0gPSAocmVnID4+IDgpICYgMHhmZjsKKwlidWZbMl0gPSB2YWw7CisKKwlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKSAhPSAzKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IGkyYyBzZW5kIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdDYwMjI0MF9yZWFkX29iamVjdF90YWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgIHUxNiByZWcsIHU4ICpvYmplY3RfYnVmKQoreworCXJldHVybiBfX3F0NjAyMjQwX3JlYWRfcmVnKGNsaWVudCwgcmVnLCBRVDYwMjI0MF9PQkpFQ1RfU0laRSwKKwkJCQkgICBvYmplY3RfYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCBxdDYwMjI0MF9vYmplY3QgKgorcXQ2MDIyNDBfZ2V0X29iamVjdChzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfb2JqZWN0ICpvYmplY3Q7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+aW5mby5vYmplY3RfbnVtOyBpKyspIHsKKwkJb2JqZWN0ID0gZGF0YS0+b2JqZWN0X3RhYmxlICsgaTsKKwkJaWYgKG9iamVjdC0+dHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIG9iamVjdDsKKwl9CisKKwlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkludmFsaWQgb2JqZWN0IHR5cGVcbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHF0NjAyMjQwX3JlYWRfbWVzc2FnZShzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSwKKwkJCQkgc3RydWN0IHF0NjAyMjQwX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJc3RydWN0IHF0NjAyMjQwX29iamVjdCAqb2JqZWN0OworCXUxNiByZWc7CisKKwlvYmplY3QgPSBxdDYwMjI0MF9nZXRfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX0dFTl9NRVNTQUdFKTsKKwlpZiAoIW9iamVjdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWcgPSBvYmplY3QtPnN0YXJ0X2FkZHJlc3M7CisJcmV0dXJuIF9fcXQ2MDIyNDBfcmVhZF9yZWcoZGF0YS0+Y2xpZW50LCByZWcsCisJCQlzaXplb2Yoc3RydWN0IHF0NjAyMjQwX21lc3NhZ2UpLCBtZXNzYWdlKTsKK30KKworc3RhdGljIGludCBxdDYwMjI0MF9yZWFkX29iamVjdChzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSwKKwkJCQl1OCB0eXBlLCB1OCBvZmZzZXQsIHU4ICp2YWwpCit7CisJc3RydWN0IHF0NjAyMjQwX29iamVjdCAqb2JqZWN0OworCXUxNiByZWc7CisKKwlvYmplY3QgPSBxdDYwMjI0MF9nZXRfb2JqZWN0KGRhdGEsIHR5cGUpOworCWlmICghb2JqZWN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZyA9IG9iamVjdC0+c3RhcnRfYWRkcmVzczsKKwlyZXR1cm4gX19xdDYwMjI0MF9yZWFkX3JlZyhkYXRhLT5jbGllbnQsIHJlZyArIG9mZnNldCwgMSwgdmFsKTsKK30KKworc3RhdGljIGludCBxdDYwMjI0MF93cml0ZV9vYmplY3Qoc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEsCisJCQkJIHU4IHR5cGUsIHU4IG9mZnNldCwgdTggdmFsKQoreworCXN0cnVjdCBxdDYwMjI0MF9vYmplY3QgKm9iamVjdDsKKwl1MTYgcmVnOworCisJb2JqZWN0ID0gcXQ2MDIyNDBfZ2V0X29iamVjdChkYXRhLCB0eXBlKTsKKwlpZiAoIW9iamVjdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWcgPSBvYmplY3QtPnN0YXJ0X2FkZHJlc3M7CisJcmV0dXJuIHF0NjAyMjQwX3dyaXRlX3JlZyhkYXRhLT5jbGllbnQsIHJlZyArIG9mZnNldCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgcXQ2MDIyNDBfaW5wdXRfcmVwb3J0KHN0cnVjdCBxdDYwMjI0MF9kYXRhICpkYXRhLCBpbnQgc2luZ2xlX2lkKQoreworCXN0cnVjdCBxdDYwMjI0MF9maW5nZXIgKmZpbmdlciA9IGRhdGEtPmZpbmdlcjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBkYXRhLT5pbnB1dF9kZXY7CisJaW50IHN0YXR1cyA9IGZpbmdlcltzaW5nbGVfaWRdLnN0YXR1czsKKwlpbnQgZmluZ2VyX251bSA9IDA7CisJaW50IGlkOworCisJZm9yIChpZCA9IDA7IGlkIDwgUVQ2MDIyNDBfTUFYX0ZJTkdFUjsgaWQrKykgeworCQlpZiAoIWZpbmdlcltpZF0uc3RhdHVzKQorCQkJY29udGludWU7CisKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19NVF9UT1VDSF9NQUpPUiwKKwkJCQlmaW5nZXJbaWRdLnN0YXR1cyAhPSBRVDYwMjI0MF9SRUxFQVNFID8KKwkJCQlmaW5nZXJbaWRdLmFyZWEgOiAwKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCWZpbmdlcltpZF0ueCk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKKwkJCQlmaW5nZXJbaWRdLnkpOworCQlpbnB1dF9tdF9zeW5jKGlucHV0X2Rldik7CisKKwkJaWYgKGZpbmdlcltpZF0uc3RhdHVzID09IFFUNjAyMjQwX1JFTEVBU0UpCisJCQlmaW5nZXJbaWRdLnN0YXR1cyA9IDA7CisJCWVsc2UKKwkJCWZpbmdlcl9udW0rKzsKKwl9CisKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2RldiwgQlROX1RPVUNILCBmaW5nZXJfbnVtID4gMCk7CisKKwlpZiAoc3RhdHVzICE9IFFUNjAyMjQwX1JFTEVBU0UpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19YLCBmaW5nZXJbc2luZ2xlX2lkXS54KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19ZLCBmaW5nZXJbc2luZ2xlX2lkXS55KTsKKwl9CisKKwlpbnB1dF9zeW5jKGlucHV0X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHF0NjAyMjQwX2lucHV0X3RvdWNoZXZlbnQoc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEsCisJCQkJICAgICAgc3RydWN0IHF0NjAyMjQwX21lc3NhZ2UgKm1lc3NhZ2UsIGludCBpZCkKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfZmluZ2VyICpmaW5nZXIgPSBkYXRhLT5maW5nZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCXU4IHN0YXR1cyA9IG1lc3NhZ2UtPm1lc3NhZ2VbMF07CisJaW50IHg7CisJaW50IHk7CisJaW50IGFyZWE7CisKKwkvKiBDaGVjayB0aGUgdG91Y2ggaXMgcHJlc2VudCBvbiB0aGUgc2NyZWVuICovCisJaWYgKCEoc3RhdHVzICYgUVQ2MDIyNDBfREVURUNUKSkgeworCQlpZiAoc3RhdHVzICYgUVQ2MDIyNDBfUkVMRUFTRSkgeworCQkJZGV2X2RiZyhkZXYsICJbJWRdIHJlbGVhc2VkXG4iLCBpZCk7CisKKwkJCWZpbmdlcltpZF0uc3RhdHVzID0gUVQ2MDIyNDBfUkVMRUFTRTsKKwkJCXF0NjAyMjQwX2lucHV0X3JlcG9ydChkYXRhLCBpZCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIG9ubHkgQU1QIGRldGVjdGlvbiAqLworCWlmICghKHN0YXR1cyAmIChRVDYwMjI0MF9QUkVTUyB8IFFUNjAyMjQwX01PVkUpKSkKKwkJcmV0dXJuOworCisJeCA9IChtZXNzYWdlLT5tZXNzYWdlWzFdIDw8IDIpIHwgKChtZXNzYWdlLT5tZXNzYWdlWzNdICYgfjB4M2YpID4+IDYpOworCXkgPSAobWVzc2FnZS0+bWVzc2FnZVsyXSA8PCAyKSB8ICgobWVzc2FnZS0+bWVzc2FnZVszXSAmIH4weGYzKSA+PiAyKTsKKwlhcmVhID0gbWVzc2FnZS0+bWVzc2FnZVs0XTsKKworCWRldl9kYmcoZGV2LCAiWyVkXSAlcyB4OiAlZCwgeTogJWQsIGFyZWE6ICVkXG4iLCBpZCwKKwkJc3RhdHVzICYgUVQ2MDIyNDBfTU9WRSA/ICJtb3ZlZCIgOiAicHJlc3NlZCIsCisJCXgsIHksIGFyZWEpOworCisJZmluZ2VyW2lkXS5zdGF0dXMgPSBzdGF0dXMgJiBRVDYwMjI0MF9NT1ZFID8KKwkJCQlRVDYwMjI0MF9NT1ZFIDogUVQ2MDIyNDBfUFJFU1M7CisJZmluZ2VyW2lkXS54ID0geDsKKwlmaW5nZXJbaWRdLnkgPSB5OworCWZpbmdlcltpZF0uYXJlYSA9IGFyZWE7CisKKwlxdDYwMjI0MF9pbnB1dF9yZXBvcnQoZGF0YSwgaWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcXQ2MDIyNDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSA9IGRldl9pZDsKKwlzdHJ1Y3QgcXQ2MDIyNDBfbWVzc2FnZSBtZXNzYWdlOworCXN0cnVjdCBxdDYwMjI0MF9vYmplY3QgKm9iamVjdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CisJaW50IGlkOworCXU4IHJlcG9ydGlkOworCXU4IG1heF9yZXBvcnRpZDsKKwl1OCBtaW5fcmVwb3J0aWQ7CisKKwlkbyB7CisJCWlmIChxdDYwMjI0MF9yZWFkX21lc3NhZ2UoZGF0YSwgJm1lc3NhZ2UpKSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIG1lc3NhZ2VcbiIpOworCQkJZ290byBlbmQ7CisJCX0KKworCQlyZXBvcnRpZCA9IG1lc3NhZ2UucmVwb3J0aWQ7CisKKwkJLyogd2hldGhlciByZXBvcnRpZCBpcyB0aGluZyBvZiBRVDYwMjI0MF9UT1VDSF9NVUxUSSAqLworCQlvYmplY3QgPSBxdDYwMjI0MF9nZXRfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX1RPVUNIX01VTFRJKTsKKwkJaWYgKCFvYmplY3QpCisJCQlnb3RvIGVuZDsKKworCQltYXhfcmVwb3J0aWQgPSBvYmplY3QtPm1heF9yZXBvcnRpZDsKKwkJbWluX3JlcG9ydGlkID0gbWF4X3JlcG9ydGlkIC0gb2JqZWN0LT5udW1fcmVwb3J0X2lkcyArIDE7CisJCWlkID0gcmVwb3J0aWQgLSBtaW5fcmVwb3J0aWQ7CisKKwkJaWYgKHJlcG9ydGlkID49IG1pbl9yZXBvcnRpZCAmJiByZXBvcnRpZCA8PSBtYXhfcmVwb3J0aWQpCisJCQlxdDYwMjI0MF9pbnB1dF90b3VjaGV2ZW50KGRhdGEsICZtZXNzYWdlLCBpZCk7CisJCWVsc2UKKwkJCXF0NjAyMjQwX2R1bXBfbWVzc2FnZShkZXYsICZtZXNzYWdlKTsKKwl9IHdoaWxlIChyZXBvcnRpZCAhPSAweGZmKTsKKworZW5kOgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBxdDYwMjI0MF9jaGVja19yZWdfaW5pdChzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfb2JqZWN0ICpvYmplY3Q7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCWludCBpbmRleCA9IDA7CisJaW50IGksIGo7CisJdTggdmVyc2lvbiA9IGRhdGEtPmluZm8udmVyc2lvbjsKKwl1OCAqaW5pdF92YWxzOworCisJc3dpdGNoICh2ZXJzaW9uKSB7CisJY2FzZSBRVDYwMjI0MF9WRVJfMjA6CisJCWluaXRfdmFscyA9ICh1OCAqKWluaXRfdmFsc192ZXJfMjA7CisJCWJyZWFrOworCWNhc2UgUVQ2MDIyNDBfVkVSXzIxOgorCQlpbml0X3ZhbHMgPSAodTggKilpbml0X3ZhbHNfdmVyXzIxOworCQlicmVhazsKKwljYXNlIFFUNjAyMjQwX1ZFUl8yMjoKKwkJaW5pdF92YWxzID0gKHU4ICopaW5pdF92YWxzX3Zlcl8yMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJGaXJtd2FyZSB2ZXJzaW9uICVkIGRvZXNuJ3Qgc3VwcG9ydFxuIiwgdmVyc2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbmZvLm9iamVjdF9udW07IGkrKykgeworCQlvYmplY3QgPSBkYXRhLT5vYmplY3RfdGFibGUgKyBpOworCisJCWlmICghcXQ2MDIyNDBfb2JqZWN0X3dyaXRhYmxlKG9iamVjdC0+dHlwZSkpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSAwOyBqIDwgb2JqZWN0LT5zaXplICsgMTsgaisrKQorCQkJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIG9iamVjdC0+dHlwZSwgaiwKKwkJCQkJaW5pdF92YWxzW2luZGV4ICsgal0pOworCisJCWluZGV4ICs9IG9iamVjdC0+c2l6ZSArIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXQ2MDIyNDBfY2hlY2tfbWF0cml4X3NpemUoc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IHF0NjAyMjQwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCWludCBtb2RlID0gLTE7CisJaW50IGVycm9yOworCXU4IHZhbDsKKworCWRldl9kYmcoZGV2LCAiTnVtYmVyIG9mIFggbGluZXM6ICVkXG4iLCBwZGF0YS0+eF9saW5lKTsKKwlkZXZfZGJnKGRldiwgIk51bWJlciBvZiBZIGxpbmVzOiAlZFxuIiwgcGRhdGEtPnlfbGluZSk7CisKKwlzd2l0Y2ggKHBkYXRhLT54X2xpbmUpIHsKKwljYXNlIDAgLi4uIDE1OgorCQlpZiAocGRhdGEtPnlfbGluZSA8PSAxNCkKKwkJCW1vZGUgPSAwOworCQlicmVhazsKKwljYXNlIDE2OgorCQlpZiAocGRhdGEtPnlfbGluZSA8PSAxMikKKwkJCW1vZGUgPSAxOworCQlpZiAocGRhdGEtPnlfbGluZSA9PSAxMyB8fCBwZGF0YS0+eV9saW5lID09IDE0KQorCQkJbW9kZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMTc6CisJCWlmIChwZGF0YS0+eV9saW5lIDw9IDExKQorCQkJbW9kZSA9IDI7CisJCWlmIChwZGF0YS0+eV9saW5lID09IDEyIHx8IHBkYXRhLT55X2xpbmUgPT0gMTMpCisJCQltb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJaWYgKHBkYXRhLT55X2xpbmUgPD0gMTApCisJCQltb2RlID0gMzsKKwkJaWYgKHBkYXRhLT55X2xpbmUgPT0gMTEgfHwgcGRhdGEtPnlfbGluZSA9PSAxMikKKwkJCW1vZGUgPSAyOworCQlicmVhazsKKwljYXNlIDE5OgorCQlpZiAocGRhdGEtPnlfbGluZSA8PSA5KQorCQkJbW9kZSA9IDQ7CisJCWlmIChwZGF0YS0+eV9saW5lID09IDEwIHx8IHBkYXRhLT55X2xpbmUgPT0gMTEpCisJCQltb2RlID0gMzsKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJbW9kZSA9IDQ7CisJfQorCisJaWYgKG1vZGUgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBYL1kgbGluZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnJvciA9IHF0NjAyMjQwX3JlYWRfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX1NQVF9DVEVDT05GSUcsCisJCQkJUVQ2MDIyNDBfQ1RFX01PREUsICZ2YWwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKG1vZGUgPT0gdmFsKQorCQlyZXR1cm4gMDsKKworCS8qIENoYW5nZSB0aGUgQ1RFIGNvbmZpZ3VyYXRpb24gKi8KKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfU1BUX0NURUNPTkZJRywKKwkJCVFUNjAyMjQwX0NURV9DVFJMLCAxKTsKKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfU1BUX0NURUNPTkZJRywKKwkJCVFUNjAyMjQwX0NURV9NT0RFLCBtb2RlKTsKKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfU1BUX0NURUNPTkZJRywKKwkJCVFUNjAyMjQwX0NURV9DVFJMLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF0NjAyMjQwX21ha2VfaGlnaGNoZyhzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CisJaW50IGNvdW50ID0gMTA7CisJaW50IGVycm9yOworCXU4IHZhbDsKKworCS8qIFJlYWQgZHVtbXkgbWVzc2FnZSB0byBtYWtlIGhpZ2ggQ0hHIHBpbiAqLworCWRvIHsKKwkJZXJyb3IgPSBxdDYwMjI0MF9yZWFkX29iamVjdChkYXRhLCBRVDYwMjI0MF9HRU5fTUVTU0FHRSwgMCwgJnZhbCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9IHdoaWxlICgodmFsICE9IDB4ZmYpICYmIC0tY291bnQpOworCisJaWYgKCFjb3VudCkgeworCQlkZXZfZXJyKGRldiwgIkNIRyBwaW4gaXNuJ3QgY2xlYXJlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHF0NjAyMjQwX2hhbmRsZV9wZGF0YShzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgcXQ2MDIyNDBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKwl1OCB2b2x0YWdlOworCisJLyogU2V0IHRvdWNoc2NyZWVuIGxpbmVzICovCisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX1RPVUNIX01VTFRJLCBRVDYwMjI0MF9UT1VDSF9YU0laRSwKKwkJCXBkYXRhLT54X2xpbmUpOworCXF0NjAyMjQwX3dyaXRlX29iamVjdChkYXRhLCBRVDYwMjI0MF9UT1VDSF9NVUxUSSwgUVQ2MDIyNDBfVE9VQ0hfWVNJWkUsCisJCQlwZGF0YS0+eV9saW5lKTsKKworCS8qIFNldCB0b3VjaHNjcmVlbiBvcmllbnQgKi8KKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfVE9VQ0hfTVVMVEksIFFUNjAyMjQwX1RPVUNIX09SSUVOVCwKKwkJCXBkYXRhLT5vcmllbnQpOworCisJLyogU2V0IHRvdWNoc2NyZWVuIGJ1cnN0IGxlbmd0aCAqLworCXF0NjAyMjQwX3dyaXRlX29iamVjdChkYXRhLCBRVDYwMjI0MF9UT1VDSF9NVUxUSSwKKwkJCVFUNjAyMjQwX1RPVUNIX0JMRU4sIHBkYXRhLT5ibGVuKTsKKworCS8qIFNldCB0b3VjaHNjcmVlbiB0aHJlc2hvbGQgKi8KKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfVE9VQ0hfTVVMVEksCisJCQlRVDYwMjI0MF9UT1VDSF9UQ0hUSFIsIHBkYXRhLT50aHJlc2hvbGQpOworCisJLyogU2V0IHRvdWNoc2NyZWVuIHJlc29sdXRpb24gKi8KKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfVE9VQ0hfTVVMVEksCisJCQlRVDYwMjI0MF9UT1VDSF9YUkFOR0VfTFNCLCAocGRhdGEtPnhfc2l6ZSAtIDEpICYgMHhmZik7CisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX1RPVUNIX01VTFRJLAorCQkJUVQ2MDIyNDBfVE9VQ0hfWFJBTkdFX01TQiwgKHBkYXRhLT54X3NpemUgLSAxKSA+PiA4KTsKKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfVE9VQ0hfTVVMVEksCisJCQlRVDYwMjI0MF9UT1VDSF9ZUkFOR0VfTFNCLCAocGRhdGEtPnlfc2l6ZSAtIDEpICYgMHhmZik7CisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX1RPVUNIX01VTFRJLAorCQkJUVQ2MDIyNDBfVE9VQ0hfWVJBTkdFX01TQiwgKHBkYXRhLT55X3NpemUgLSAxKSA+PiA4KTsKKworCS8qIFNldCB0b3VjaHNjcmVlbiB2b2x0YWdlICovCisJaWYgKGRhdGEtPmluZm8udmVyc2lvbiA+PSBRVDYwMjI0MF9WRVJfMjEgJiYgcGRhdGEtPnZvbHRhZ2UpIHsKKwkJaWYgKHBkYXRhLT52b2x0YWdlIDwgUVQ2MDIyNDBfVk9MVEFHRV9ERUZBVUxUKSB7CisJCQl2b2x0YWdlID0gKFFUNjAyMjQwX1ZPTFRBR0VfREVGQVVMVCAtIHBkYXRhLT52b2x0YWdlKSAvCisJCQkJUVQ2MDIyNDBfVk9MVEFHRV9TVEVQOworCQkJdm9sdGFnZSA9IDB4ZmYgLSB2b2x0YWdlICsgMTsKKwkJfSBlbHNlCisJCQl2b2x0YWdlID0gKHBkYXRhLT52b2x0YWdlIC0gUVQ2MDIyNDBfVk9MVEFHRV9ERUZBVUxUKSAvCisJCQkJUVQ2MDIyNDBfVk9MVEFHRV9TVEVQOworCisJCXF0NjAyMjQwX3dyaXRlX29iamVjdChkYXRhLCBRVDYwMjI0MF9TUFRfQ1RFQ09ORklHLAorCQkJCVFUNjAyMjQwX0NURV9WT0xUQUdFLCB2b2x0YWdlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcXQ2MDIyNDBfZ2V0X2luZm8oc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlzdHJ1Y3QgcXQ2MDIyNDBfaW5mbyAqaW5mbyA9ICZkYXRhLT5pbmZvOworCWludCBlcnJvcjsKKwl1OCB2YWw7CisKKwllcnJvciA9IHF0NjAyMjQwX3JlYWRfcmVnKGNsaWVudCwgUVQ2MDIyNDBfRkFNSUxZX0lELCAmdmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpbmZvLT5mYW1pbHlfaWQgPSB2YWw7CisKKwllcnJvciA9IHF0NjAyMjQwX3JlYWRfcmVnKGNsaWVudCwgUVQ2MDIyNDBfVkFSSUFOVF9JRCwgJnZhbCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaW5mby0+dmFyaWFudF9pZCA9IHZhbDsKKworCWVycm9yID0gcXQ2MDIyNDBfcmVhZF9yZWcoY2xpZW50LCBRVDYwMjI0MF9WRVJTSU9OLCAmdmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpbmZvLT52ZXJzaW9uID0gdmFsOworCisJZXJyb3IgPSBxdDYwMjI0MF9yZWFkX3JlZyhjbGllbnQsIFFUNjAyMjQwX0JVSUxELCAmdmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpbmZvLT5idWlsZCA9IHZhbDsKKworCWVycm9yID0gcXQ2MDIyNDBfcmVhZF9yZWcoY2xpZW50LCBRVDYwMjI0MF9PQkpFQ1RfTlVNLCAmdmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpbmZvLT5vYmplY3RfbnVtID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXQ2MDIyNDBfZ2V0X29iamVjdF90YWJsZShzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSkKK3sKKwlpbnQgZXJyb3I7CisJaW50IGk7CisJdTE2IHJlZzsKKwl1OCByZXBvcnRpZCA9IDA7CisJdTggYnVmW1FUNjAyMjQwX09CSkVDVF9TSVpFXTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbmZvLm9iamVjdF9udW07IGkrKykgeworCQlzdHJ1Y3QgcXQ2MDIyNDBfb2JqZWN0ICpvYmplY3QgPSBkYXRhLT5vYmplY3RfdGFibGUgKyBpOworCisJCXJlZyA9IFFUNjAyMjQwX09CSkVDVF9TVEFSVCArIFFUNjAyMjQwX09CSkVDVF9TSVpFICogaTsKKwkJZXJyb3IgPSBxdDYwMjI0MF9yZWFkX29iamVjdF90YWJsZShkYXRhLT5jbGllbnQsIHJlZywgYnVmKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCisJCW9iamVjdC0+dHlwZSA9IGJ1ZlswXTsKKwkJb2JqZWN0LT5zdGFydF9hZGRyZXNzID0gKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlsxXTsKKwkJb2JqZWN0LT5zaXplID0gYnVmWzNdOworCQlvYmplY3QtPmluc3RhbmNlcyA9IGJ1Zls0XTsKKwkJb2JqZWN0LT5udW1fcmVwb3J0X2lkcyA9IGJ1Zls1XTsKKworCQlpZiAob2JqZWN0LT5udW1fcmVwb3J0X2lkcykgeworCQkJcmVwb3J0aWQgKz0gb2JqZWN0LT5udW1fcmVwb3J0X2lkcyAqCisJCQkJCShvYmplY3QtPmluc3RhbmNlcyArIDEpOworCQkJb2JqZWN0LT5tYXhfcmVwb3J0aWQgPSByZXBvcnRpZDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF0NjAyMjQwX2luaXRpYWxpemUoc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlzdHJ1Y3QgcXQ2MDIyNDBfaW5mbyAqaW5mbyA9ICZkYXRhLT5pbmZvOworCWludCBlcnJvcjsKKwl1OCB2YWw7CisKKwllcnJvciA9IHF0NjAyMjQwX2dldF9pbmZvKGRhdGEpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZGF0YS0+b2JqZWN0X3RhYmxlID0ga2NhbGxvYyhpbmZvLT5vYmplY3RfbnVtLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBxdDYwMjI0MF9kYXRhKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghZGF0YS0+b2JqZWN0X3RhYmxlKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEdldCBvYmplY3QgdGFibGUgaW5mb3JtYXRpb24gKi8KKwllcnJvciA9IHF0NjAyMjQwX2dldF9vYmplY3RfdGFibGUoZGF0YSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBDaGVjayByZWdpc3RlciBpbml0IHZhbHVlcyAqLworCWVycm9yID0gcXQ2MDIyNDBfY2hlY2tfcmVnX2luaXQoZGF0YSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBDaGVjayBYL1kgbWF0cml4IHNpemUgKi8KKwllcnJvciA9IHF0NjAyMjQwX2NoZWNrX21hdHJpeF9zaXplKGRhdGEpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBxdDYwMjI0MF9tYWtlX2hpZ2hjaGcoZGF0YSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlxdDYwMjI0MF9oYW5kbGVfcGRhdGEoZGF0YSk7CisKKwkvKiBCYWNrdXAgdG8gbWVtb3J5ICovCisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX0dFTl9DT01NQU5ELAorCQkJUVQ2MDIyNDBfQ09NTUFORF9CQUNLVVBOViwKKwkJCVFUNjAyMjQwX0JBQ0tVUF9WQUxVRSk7CisJbXNsZWVwKFFUNjAyMjQwX0JBQ0tVUF9USU1FKTsKKworCS8qIFNvZnQgcmVzZXQgKi8KKwlxdDYwMjI0MF93cml0ZV9vYmplY3QoZGF0YSwgUVQ2MDIyNDBfR0VOX0NPTU1BTkQsCisJCQlRVDYwMjI0MF9DT01NQU5EX1JFU0VULCAxKTsKKwltc2xlZXAoUVQ2MDIyNDBfUkVTRVRfVElNRSk7CisKKwkvKiBVcGRhdGUgbWF0cml4IHNpemUgYXQgaW5mbyBzdHJ1Y3QgKi8KKwllcnJvciA9IHF0NjAyMjQwX3JlYWRfcmVnKGNsaWVudCwgUVQ2MDIyNDBfTUFUUklYX1hfU0laRSwgJnZhbCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaW5mby0+bWF0cml4X3hzaXplID0gdmFsOworCisJZXJyb3IgPSBxdDYwMjI0MF9yZWFkX3JlZyhjbGllbnQsIFFUNjAyMjQwX01BVFJJWF9ZX1NJWkUsICZ2YWwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWluZm8tPm1hdHJpeF95c2l6ZSA9IHZhbDsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCSJGYW1pbHkgSUQ6ICVkIFZhcmlhbnQgSUQ6ICVkIFZlcnNpb246ICVkIEJ1aWxkOiAlZFxuIiwKKwkJCWluZm8tPmZhbWlseV9pZCwgaW5mby0+dmFyaWFudF9pZCwgaW5mby0+dmVyc2lvbiwKKwkJCWluZm8tPmJ1aWxkKTsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCSJNYXRyaXggWCBTaXplOiAlZCBNYXRyaXggWSBTaXplOiAlZCBPYmplY3QgTnVtOiAlZFxuIiwKKwkJCWluZm8tPm1hdHJpeF94c2l6ZSwgaW5mby0+bWF0cml4X3lzaXplLAorCQkJaW5mby0+b2JqZWN0X251bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcXQ2MDIyNDBfb2JqZWN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBxdDYwMjI0MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHF0NjAyMjQwX29iamVjdCAqb2JqZWN0OworCWludCBjb3VudCA9IDA7CisJaW50IGksIGo7CisJaW50IGVycm9yOworCXU4IHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbmZvLm9iamVjdF9udW07IGkrKykgeworCQlvYmplY3QgPSBkYXRhLT5vYmplY3RfdGFibGUgKyBpOworCisJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsCisJCQkJIk9iamVjdCBUYWJsZSBFbGVtZW50ICVkKFR5cGUgJWQpXG4iLAorCQkJCWkgKyAxLCBvYmplY3QtPnR5cGUpOworCisJCWlmICghcXQ2MDIyNDBfb2JqZWN0X3JlYWRhYmxlKG9iamVjdC0+dHlwZSkpIHsKKwkJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICJcbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgb2JqZWN0LT5zaXplICsgMTsgaisrKSB7CisJCQllcnJvciA9IHF0NjAyMjQwX3JlYWRfb2JqZWN0KGRhdGEsCisJCQkJCQlvYmplY3QtPnR5cGUsIGosICZ2YWwpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKworCQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwKKwkJCQkJIiAgQnl0ZSAlZDogMHgleCAoJWQpXG4iLCBqLCB2YWwsIHZhbCk7CisJCX0KKworCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiXG4iKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcXQ2MDIyNDBfbG9hZF9mdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZuKQoreworCXN0cnVjdCBxdDYwMjI0MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcG9zID0gMDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZuLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gb3BlbiBmaXJtd2FyZSAlc1xuIiwgZm4pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIENoYW5nZSB0byB0aGUgYm9vdGxvYWRlciBtb2RlICovCisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX0dFTl9DT01NQU5ELAorCQkJUVQ2MDIyNDBfQ09NTUFORF9SRVNFVCwgUVQ2MDIyNDBfQk9PVF9WQUxVRSk7CisJbXNsZWVwKFFUNjAyMjQwX1JFU0VUX1RJTUUpOworCisJLyogQ2hhbmdlIHRvIHNsYXZlIGFkZHJlc3Mgb2YgYm9vdGxvYWRlciAqLworCWlmIChjbGllbnQtPmFkZHIgPT0gUVQ2MDIyNDBfQVBQX0xPVykKKwkJY2xpZW50LT5hZGRyID0gUVQ2MDIyNDBfQk9PVF9MT1c7CisJZWxzZQorCQljbGllbnQtPmFkZHIgPSBRVDYwMjI0MF9CT09UX0hJR0g7CisKKwlyZXQgPSBxdDYwMjI0MF9jaGVja19ib290bG9hZGVyKGNsaWVudCwgUVQ2MDIyNDBfV0FJVElOR19CT09UTE9BRF9DTUQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogVW5sb2NrIGJvb3Rsb2FkZXIgKi8KKwlxdDYwMjI0MF91bmxvY2tfYm9vdGxvYWRlcihjbGllbnQpOworCisJd2hpbGUgKHBvcyA8IGZ3LT5zaXplKSB7CisJCXJldCA9IHF0NjAyMjQwX2NoZWNrX2Jvb3Rsb2FkZXIoY2xpZW50LAorCQkJCQkJUVQ2MDIyNDBfV0FJVElOR19GUkFNRV9EQVRBKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCWZyYW1lX3NpemUgPSAoKCooZnctPmRhdGEgKyBwb3MpIDw8IDgpIHwgKihmdy0+ZGF0YSArIHBvcyArIDEpKTsKKworCQkvKiBXZSBzaG91bGQgYWRkIDIgYXQgZnJhbWUgc2l6ZSBhcyB0aGUgdGhlIGZpcm13YXJlIGRhdGEgaXMgbm90CisJCSAqIGluY2x1ZGVkIHRoZSBDUkMgYnl0ZXMuCisJCSAqLworCQlmcmFtZV9zaXplICs9IDI7CisKKwkJLyogV3JpdGUgb25lIGZyYW1lIHRvIGRldmljZSAqLworCQlxdDYwMjI0MF9md193cml0ZShjbGllbnQsIGZ3LT5kYXRhICsgcG9zLCBmcmFtZV9zaXplKTsKKworCQlyZXQgPSBxdDYwMjI0MF9jaGVja19ib290bG9hZGVyKGNsaWVudCwKKwkJCQkJCVFUNjAyMjQwX0ZSQU1FX0NSQ19QQVNTKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXBvcyArPSBmcmFtZV9zaXplOworCisJCWRldl9kYmcoZGV2LCAiVXBkYXRlZCAlZCBieXRlcyAvICV6ZCBieXRlc1xuIiwgcG9zLCBmdy0+c2l6ZSk7CisJfQorCitvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwkvKiBDaGFuZ2UgdG8gc2xhdmUgYWRkcmVzcyBvZiBhcHBsaWNhdGlvbiAqLworCWlmIChjbGllbnQtPmFkZHIgPT0gUVQ2MDIyNDBfQk9PVF9MT1cpCisJCWNsaWVudC0+YWRkciA9IFFUNjAyMjQwX0FQUF9MT1c7CisJZWxzZQorCQljbGllbnQtPmFkZHIgPSBRVDYwMjI0MF9BUFBfSElHSDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHF0NjAyMjQwX3VwZGF0ZV9md19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCWludCBlcnJvcjsKKworCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmdmVyc2lvbikgIT0gMSkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgdmFsdWVzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRhdGEtPmluZm8udmVyc2lvbiA8IFFUNjAyMjQwX1ZFUl8yMSB8fCB2ZXJzaW9uIDwgUVQ2MDIyNDBfVkVSXzIxKSB7CisJCWRldl9lcnIoZGV2LCAiRlcgdXBkYXRlIHN1cHBvcnRlZCBzdGFydGluZyB3aXRoIHZlcnNpb24gMjFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkaXNhYmxlX2lycShkYXRhLT5pcnEpOworCisJZXJyb3IgPSBxdDYwMjI0MF9sb2FkX2Z3KGRldiwgUVQ2MDIyNDBfRldfTkFNRSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoZGV2LCAiVGhlIGZpcm13YXJlIHVwZGF0ZSBmYWlsZWQoJWQpXG4iLCBlcnJvcik7CisJCWNvdW50ID0gZXJyb3I7CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhkZXYsICJUaGUgZmlybXdhcmUgdXBkYXRlIHN1Y2NlZWRlZFxuIik7CisKKwkJLyogV2FpdCBmb3IgcmVzZXQgKi8KKwkJbXNsZWVwKFFUNjAyMjQwX0ZXUkVTRVRfVElNRSk7CisKKwkJa2ZyZWUoZGF0YS0+b2JqZWN0X3RhYmxlKTsKKwkJZGF0YS0+b2JqZWN0X3RhYmxlID0gTlVMTDsKKworCQlxdDYwMjI0MF9pbml0aWFsaXplKGRhdGEpOworCX0KKworCWVuYWJsZV9pcnEoZGF0YS0+aXJxKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG9iamVjdCwgMDQ0NCwgcXQ2MDIyNDBfb2JqZWN0X3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9mdywgMDY2NCwgTlVMTCwgcXQ2MDIyNDBfdXBkYXRlX2Z3X3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnF0NjAyMjQwX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX29iamVjdC5hdHRyLAorCSZkZXZfYXR0cl91cGRhdGVfZncuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBxdDYwMjI0MF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IHF0NjAyMjQwX2F0dHJzLAorfTsKKworc3RhdGljIHZvaWQgcXQ2MDIyNDBfc3RhcnQoc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEpCit7CisJLyogVG91Y2ggZW5hYmxlICovCisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsCisJCQlRVDYwMjI0MF9UT1VDSF9NVUxUSSwgUVQ2MDIyNDBfVE9VQ0hfQ1RSTCwgMHg4Myk7Cit9CisKK3N0YXRpYyB2b2lkIHF0NjAyMjQwX3N0b3Aoc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEpCit7CisJLyogVG91Y2ggZGlzYWJsZSAqLworCXF0NjAyMjQwX3dyaXRlX29iamVjdChkYXRhLAorCQkJUVQ2MDIyNDBfVE9VQ0hfTVVMVEksIFFUNjAyMjQwX1RPVUNIX0NUUkwsIDApOworfQorCitzdGF0aWMgaW50IHF0NjAyMjQwX2lucHV0X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBxdDYwMjI0MF9kYXRhICpkYXRhID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXF0NjAyMjQwX3N0YXJ0KGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHF0NjAyMjQwX2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwlxdDYwMjI0MF9zdG9wKGRhdGEpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBxdDYwMjI0MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGE7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKKworCWlmICghY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHF0NjAyMjQwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWRhdGEgfHwgIWlucHV0X2RldikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWlucHV0X2Rldi0+bmFtZSA9ICJBVDQyUVQ2MDIyNDAvQVRNWFQyMjQgVG91Y2hzY3JlZW4iOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWlucHV0X2Rldi0+b3BlbiA9IHF0NjAyMjQwX2lucHV0X29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IHF0NjAyMjQwX2lucHV0X2Nsb3NlOworCisJX19zZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJLyogRm9yIHNpbmdsZSB0b3VjaCAqLworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsCisJCQkgICAgIDAsIFFUNjAyMjQwX01BWF9YQywgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwKKwkJCSAgICAgMCwgUVQ2MDIyNDBfTUFYX1lDLCAwLCAwKTsKKworCS8qIEZvciBtdWx0aSB0b3VjaCAqLworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX1RPVUNIX01BSk9SLAorCQkJICAgICAwLCBRVDYwMjI0MF9NQVhfQVJFQSwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwKKwkJCSAgICAgMCwgUVQ2MDIyNDBfTUFYX1hDLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLAorCQkJICAgICAwLCBRVDYwMjI0MF9NQVhfWUMsIDAsIDApOworCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBkYXRhKTsKKworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwlkYXRhLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisJZGF0YS0+cGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWRhdGEtPmlycSA9IGNsaWVudC0+aXJxOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisKKwllcnJvciA9IHF0NjAyMjQwX2luaXRpYWxpemUoZGF0YSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX29iamVjdDsKKworCWVycm9yID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsIE5VTEwsIHF0NjAyMjQwX2ludGVycnVwdCwKKwkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCBjbGllbnQtPmRldi5kcml2ZXItPm5hbWUsIGRhdGEpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGVycl9mcmVlX29iamVjdDsKKwl9CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnF0NjAyMjQwX2F0dHJfZ3JvdXApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kZXZpY2U7CisKKwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXJfZGV2aWNlOgorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaW5wdXRfZGV2ID0gTlVMTDsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShjbGllbnQtPmlycSwgZGF0YSk7CitlcnJfZnJlZV9vYmplY3Q6CisJa2ZyZWUoZGF0YS0+b2JqZWN0X3RhYmxlKTsKK2Vycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGRhdGEpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcXQ2MDIyNDBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnF0NjAyMjQwX2F0dHJfZ3JvdXApOworCWZyZWVfaXJxKGRhdGEtPmlycSwgZGF0YSk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKKwlrZnJlZShkYXRhLT5vYmplY3RfdGFibGUpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcXQ2MDIyNDBfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgcXQ2MDIyNDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGRhdGEtPmlucHV0X2RldjsKKworCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJaWYgKGlucHV0X2Rldi0+dXNlcnMpCisJCXF0NjAyMjQwX3N0b3AoZGF0YSk7CisKKwltdXRleF91bmxvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXQ2MDIyNDBfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHF0NjAyMjQwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBkYXRhLT5pbnB1dF9kZXY7CisKKwkvKiBTb2Z0IHJlc2V0ICovCisJcXQ2MDIyNDBfd3JpdGVfb2JqZWN0KGRhdGEsIFFUNjAyMjQwX0dFTl9DT01NQU5ELAorCQkJUVQ2MDIyNDBfQ09NTUFORF9SRVNFVCwgMSk7CisKKwltc2xlZXAoUVQ2MDIyNDBfUkVTRVRfVElNRSk7CisKKwltdXRleF9sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCWlmIChpbnB1dF9kZXYtPnVzZXJzKQorCQlxdDYwMjI0MF9zdGFydChkYXRhKTsKKworCW11dGV4X3VubG9jaygmaW5wdXRfZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHF0NjAyMjQwX3N1c3BlbmQJTlVMTAorI2RlZmluZSBxdDYwMjI0MF9yZXN1bWUJCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcXQ2MDIyNDBfaWRbXSA9IHsKKwl7ICJxdDYwMjI0MF90cyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcXQ2MDIyNDBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcXQ2MDIyNDBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInF0NjAyMjQwX3RzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gcXQ2MDIyNDBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChxdDYwMjI0MF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gcXQ2MDIyNDBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHF0NjAyMjQwX3Jlc3VtZSwKKwkuaWRfdGFibGUJPSBxdDYwMjI0MF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHF0NjAyMjQwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnF0NjAyMjQwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxdDYwMjI0MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnF0NjAyMjQwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHF0NjAyMjQwX2luaXQpOworbW9kdWxlX2V4aXQocXQ2MDIyNDBfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBVDQyUVQ2MDIyNDAvQVRNWFQyMjQgVG91Y2hzY3JlZW4gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RwczY1MDd4LXRzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RwczY1MDd4LXRzLmMKaW5kZXggNWI3MGExNC4uYTY0NGQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90cHM2NTA3eC10cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHBzNjUwN3gtdHMuYwpAQCAtMzU1LDkgKzM1NSw2IEBACiAJc3RydWN0IHRwczY1MDd4X3RzICp0c2MgPSB0cHM2NTA3eF9kZXYtPnRzOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IHRzYy0+aW5wdXRfZGV2OwogCi0JaWYgKCF0c2MpCi0JCXJldHVybiAwOwotCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0c2MtPndvcmspOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHRzYy0+d3EpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKaW5kZXggNTY3ZDU3Mi4uZjQ1ZjgwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYwpAQCAtOTUsNiArOTUsNyBAQAogCWludCAgKCpnZXRfcGt0X2xlbikgKHVuc2lnbmVkIGNoYXIgKnBrdCwgaW50IGxlbik7CiAKIAlpbnQgICgqcmVhZF9kYXRhKSAgIChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCwgdW5zaWduZWQgY2hhciAqcGt0KTsKKwlpbnQgICgqYWxsb2MpICAgICAgIChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCk7CiAJaW50ICAoKmluaXQpICAgICAgICAoc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gpOwogCXZvaWQgKCpleGl0KQkgICAgKHN0cnVjdCB1c2J0b3VjaF91c2IgKnVzYnRvdWNoKTsKIH07CkBAIC0xMzUsNyArMTM2LDcgQEAKIAlERVZUWVBFX0pBU1RFQywKIAlERVZUWVBFX0UySSwKIAlERVZUWVBFX1pZVFJPTklDLAotCURFVlRZUEVfVEM1VUgsCisJREVWVFlQRV9UQzQ1VVNCLAogCURFVlRZUEVfTkVYSU8sCiB9OwogCkBAIC0yMjIsOCArMjIzLDExIEBACiAJe1VTQl9ERVZJQ0UoMHgxNGM4LCAweDAwMDMpLCAuZHJpdmVyX2luZm8gPSBERVZUWVBFX1pZVFJPTklDfSwKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9FVFRfVEM1VUgKLQl7VVNCX0RFVklDRSgweDA2NjQsIDB4MDMwOSksIC5kcml2ZXJfaW5mbyA9IERFVlRZUEVfVEM1VUh9LAorI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfRVRUX1RDNDVVU0IKKwkvKiBUQzVVSCAqLworCXtVU0JfREVWSUNFKDB4MDY2NCwgMHgwMzA5KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9UQzQ1VVNCfSwKKwkvKiBUQzRVTSAqLworCXtVU0JfREVWSUNFKDB4MDY2NCwgMHgwMzA2KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9UQzQ1VVNCfSwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9ORVhJTwpAQCAtNTA3LDcgKzUxMSw3IEBACiAJaW50IHJldCA9IC1FTk9NRU07CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCi0JYnVmID0ga21hbGxvYygyLCBHRlBfS0VSTkVMKTsKKwlidWYgPSBrbWFsbG9jKDIsIEdGUF9OT0lPKTsKIAlpZiAoIWJ1ZikKIAkJZ290byBlcnJfbm9idWY7CiAJLyogcmVzZXQgKi8KQEAgLTU3NCwxMCArNTc4LDEwIEBACiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFVCZUIFRDNVVIIHBhcnQKKyAqIEVUJlQgVEM1VUgvVEM0VU0gcGFydAogICovCi0jaWZkZWYgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9FVFRfVEM1VUgKLXN0YXRpYyBpbnQgdGM1dWhfcmVhZF9kYXRhKHN0cnVjdCB1c2J0b3VjaF91c2IgKmRldiwgdW5zaWduZWQgY2hhciAqcGt0KQorI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfRVRUX1RDNDVVU0IKK3N0YXRpYyBpbnQgdGM0NXVzYl9yZWFkX2RhdGEoc3RydWN0IHVzYnRvdWNoX3VzYiAqZGV2LCB1bnNpZ25lZCBjaGFyICpwa3QpCiB7CiAJZGV2LT54ID0gKChwa3RbMl0gJiAweDBGKSA8PCA4KSB8IHBrdFsxXTsKIAlkZXYtPnkgPSAoKHBrdFs0XSAmIDB4MEYpIDw8IDgpIHwgcGt0WzNdOwpAQCAtNzMyLDExICs3MzYsNDMgQEAKIHsKIH0KIAorc3RhdGljIGludCBuZXhpb19hbGxvYyhzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCkKK3sKKwlzdHJ1Y3QgbmV4aW9fcHJpdiAqcHJpdjsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCXVzYnRvdWNoLT5wcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5leGlvX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYnRvdWNoLT5wcml2KQorCQlnb3RvIG91dF9idWY7CisKKwlwcml2ID0gdXNidG91Y2gtPnByaXY7CisKKwlwcml2LT5hY2tfYnVmID0ga21lbWR1cChuZXhpb19hY2tfcGt0LCBzaXplb2YobmV4aW9fYWNrX3BrdCksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5hY2tfYnVmKQorCQlnb3RvIGVycl9wcml2OworCisJcHJpdi0+YWNrID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPmFjaykgeworCQlkYmcoIiVzIC0gdXNiX2FsbG9jX3VyYiBmYWlsZWQ6IHVzYnRvdWNoLT5hY2siLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2Fja19idWY7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9hY2tfYnVmOgorCWtmcmVlKHByaXYtPmFja19idWYpOworZXJyX3ByaXY6CisJa2ZyZWUocHJpdik7CitvdXRfYnVmOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbmV4aW9faW5pdChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih1c2J0b3VjaC0+aW50ZXJmYWNlKTsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB1c2J0b3VjaC0+aW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKLQlzdHJ1Y3QgbmV4aW9fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgbmV4aW9fcHJpdiAqcHJpdiA9IHVzYnRvdWNoLT5wcml2OwogCWludCByZXQgPSAtRU5PTUVNOwogCWludCBhY3R1YWxfbGVuLCBpOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKQEAgLTc1NSw3ICs3OTEsNyBAQAogCWlmICghaW5wdXRfZXAgfHwgIW91dHB1dF9lcCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCWJ1ZiA9IGttYWxsb2MoTkVYSU9fQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJYnVmID0ga21hbGxvYyhORVhJT19CVUZTSVpFLCBHRlBfTk9JTyk7CiAJaWYgKCFidWYpCiAJCWdvdG8gb3V0X2J1ZjsKIApAQCAtNzg3LDExICs4MjMsMTEgQEAKIAkJc3dpdGNoIChidWZbMF0pIHsKIAkJY2FzZSAweDgzOgkvKiBmaXJtd2FyZSB2ZXJzaW9uICovCiAJCQlpZiAoIWZpcm13YXJlX3ZlcikKLQkJCQlmaXJtd2FyZV92ZXIgPSBrc3RyZHVwKCZidWZbMl0sIEdGUF9LRVJORUwpOworCQkJCWZpcm13YXJlX3ZlciA9IGtzdHJkdXAoJmJ1ZlsyXSwgR0ZQX05PSU8pOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg4NDoJLyogZGV2aWNlIG5hbWUgKi8KIAkJCWlmICghZGV2aWNlX25hbWUpCi0JCQkJZGV2aWNlX25hbWUgPSBrc3RyZHVwKCZidWZbMl0sIEdGUF9LRVJORUwpOworCQkJCWRldmljZV9uYW1lID0ga3N0cmR1cCgmYnVmWzJdLCBHRlBfTk9JTyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTgwMiwzNiArODM4LDExIEBACiAJa2ZyZWUoZmlybXdhcmVfdmVyKTsKIAlrZnJlZShkZXZpY2VfbmFtZSk7CiAKLQkvKiBwcmVwYXJlIEFDSyBVUkIgKi8KLQlyZXQgPSAtRU5PTUVNOwotCi0JdXNidG91Y2gtPnByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV4aW9fcHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghdXNidG91Y2gtPnByaXYpCi0JCWdvdG8gb3V0X2J1ZjsKLQotCXByaXYgPSB1c2J0b3VjaC0+cHJpdjsKLQotCXByaXYtPmFja19idWYgPSBrbWVtZHVwKG5leGlvX2Fja19wa3QsIHNpemVvZihuZXhpb19hY2tfcGt0KSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmFja19idWYpCi0JCWdvdG8gZXJyX3ByaXY7Ci0KLQlwcml2LT5hY2sgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+YWNrKSB7Ci0JCWRiZygiJXMgLSB1c2JfYWxsb2NfdXJiIGZhaWxlZDogdXNidG91Y2gtPmFjayIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfYWNrX2J1ZjsKLQl9Ci0KIAl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5hY2ssIGRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldiwgb3V0cHV0X2VwKSwKIAkJCSAgcHJpdi0+YWNrX2J1Ziwgc2l6ZW9mKG5leGlvX2Fja19wa3QpLAogCQkJICBuZXhpb19hY2tfY29tcGxldGUsIHVzYnRvdWNoKTsKIAlyZXQgPSAwOwotCWdvdG8gb3V0X2J1ZjsKIAotZXJyX2Fja19idWY6Ci0Ja2ZyZWUocHJpdi0+YWNrX2J1Zik7Ci1lcnJfcHJpdjoKLQlrZnJlZShwcml2KTsKIG91dF9idWY6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0OwpAQCAtODQ5LDI5ICs4NjAsMzIgQEAKIAogc3RhdGljIGludCBuZXhpb19yZWFkX2RhdGEoc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gsIHVuc2lnbmVkIGNoYXIgKnBrdCkKIHsKLQlpbnQgeCwgeSwgYmVnaW5feCwgYmVnaW5feSwgZW5kX3gsIGVuZF95LCB3LCBoLCByZXQ7CiAJc3RydWN0IG5leGlvX3RvdWNoX3BhY2tldCAqcGFja2V0ID0gKHZvaWQgKikgcGt0OwogCXN0cnVjdCBuZXhpb19wcml2ICpwcml2ID0gdXNidG91Y2gtPnByaXY7CisJdW5zaWduZWQgaW50IGRhdGFfbGVuID0gYmUxNl90b19jcHUocGFja2V0LT5kYXRhX2xlbik7CisJdW5zaWduZWQgaW50IHhfbGVuID0gYmUxNl90b19jcHUocGFja2V0LT54X2xlbik7CisJdW5zaWduZWQgaW50IHlfbGVuID0gYmUxNl90b19jcHUocGFja2V0LT55X2xlbik7CisJaW50IHgsIHksIGJlZ2luX3gsIGJlZ2luX3ksIGVuZF94LCBlbmRfeSwgdywgaCwgcmV0OwogCiAJLyogZ290IHRvdWNoIGRhdGE/ICovCiAJaWYgKChwa3RbMF0gJiAweGUwKSAhPSAweGUwKQogCQlyZXR1cm4gMDsKIAotCWlmIChiZTE2X3RvX2NwdShwYWNrZXQtPmRhdGFfbGVuKSA+IDB4ZmYpCi0JCXBhY2tldC0+ZGF0YV9sZW4gPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdShwYWNrZXQtPmRhdGFfbGVuKSAtIDB4MTAwKTsKLQlpZiAoYmUxNl90b19jcHUocGFja2V0LT54X2xlbikgPiAweGZmKQotCQlwYWNrZXQtPnhfbGVuID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHUocGFja2V0LT54X2xlbikgLSAweDgwKTsKKwlpZiAoZGF0YV9sZW4gPiAweGZmKQorCQlkYXRhX2xlbiAtPSAweDEwMDsKKwlpZiAoeF9sZW4gPiAweGZmKQorCQl4X2xlbiAtPSAweDgwOwogCiAJLyogc2VuZCBBQ0sgKi8KIAlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5hY2ssIEdGUF9BVE9NSUMpOwogCiAJaWYgKCF1c2J0b3VjaC0+dHlwZS0+bWF4X3hjKSB7Ci0JCXVzYnRvdWNoLT50eXBlLT5tYXhfeGMgPSAyICogYmUxNl90b19jcHUocGFja2V0LT54X2xlbik7Ci0JCWlucHV0X3NldF9hYnNfcGFyYW1zKHVzYnRvdWNoLT5pbnB1dCwgQUJTX1gsIDAsCi0JCQkJICAgICAyICogYmUxNl90b19jcHUocGFja2V0LT54X2xlbiksIDAsIDApOwotCQl1c2J0b3VjaC0+dHlwZS0+bWF4X3ljID0gMiAqIGJlMTZfdG9fY3B1KHBhY2tldC0+eV9sZW4pOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyh1c2J0b3VjaC0+aW5wdXQsIEFCU19ZLCAwLAotCQkJCSAgICAgMiAqIGJlMTZfdG9fY3B1KHBhY2tldC0+eV9sZW4pLCAwLCAwKTsKKwkJdXNidG91Y2gtPnR5cGUtPm1heF94YyA9IDIgKiB4X2xlbjsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXModXNidG91Y2gtPmlucHV0LCBBQlNfWCwKKwkJCQkgICAgIDAsIHVzYnRvdWNoLT50eXBlLT5tYXhfeGMsIDAsIDApOworCQl1c2J0b3VjaC0+dHlwZS0+bWF4X3ljID0gMiAqIHlfbGVuOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyh1c2J0b3VjaC0+aW5wdXQsIEFCU19ZLAorCQkJCSAgICAgMCwgdXNidG91Y2gtPnR5cGUtPm1heF95YywgMCwgMCk7CiAJfQogCS8qCiAJICogVGhlIGRldmljZSByZXBvcnRzIHN0YXRlIG9mIElSIHNlbnNvcnMgb24gWCBhbmQgWSBheGVzLgpAQCAtODgxLDIyICs4OTUsMjEgQEAKIAkgKiBpdCdzIGRpc2FibGVkIChhbmQgdW50ZXN0ZWQpIGhlcmUgYXMgdGhlcmUncyBubyBYIGRyaXZlciBmb3IgdGhhdC4KIAkgKi8KIAliZWdpbl94ID0gZW5kX3ggPSBiZWdpbl95ID0gZW5kX3kgPSAtMTsKLQlmb3IgKHggPSAwOyB4IDwgYmUxNl90b19jcHUocGFja2V0LT54X2xlbik7IHgrKykgeworCWZvciAoeCA9IDA7IHggPCB4X2xlbjsgeCsrKSB7CiAJCWlmIChiZWdpbl94ID09IC0xICYmIHBhY2tldC0+ZGF0YVt4XSA+IE5FWElPX1RIUkVTSE9MRCkgewogCQkJYmVnaW5feCA9IHg7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoZW5kX3ggPT0gLTEgJiYgYmVnaW5feCAhPSAtMSAmJiBwYWNrZXQtPmRhdGFbeF0gPCBORVhJT19USFJFU0hPTEQpIHsKIAkJCWVuZF94ID0geCAtIDE7Ci0JCQlmb3IgKHkgPSBiZTE2X3RvX2NwdShwYWNrZXQtPnhfbGVuKTsKLQkJCSAgICAgeSA8IGJlMTZfdG9fY3B1KHBhY2tldC0+ZGF0YV9sZW4pOyB5KyspIHsKKwkJCWZvciAoeSA9IHhfbGVuOyB5IDwgZGF0YV9sZW47IHkrKykgewogCQkJCWlmIChiZWdpbl95ID09IC0xICYmIHBhY2tldC0+ZGF0YVt5XSA+IE5FWElPX1RIUkVTSE9MRCkgewotCQkJCQliZWdpbl95ID0geSAtIGJlMTZfdG9fY3B1KHBhY2tldC0+eF9sZW4pOworCQkJCQliZWdpbl95ID0geSAtIHhfbGVuOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJaWYgKGVuZF95ID09IC0xICYmCiAJCQkJICAgIGJlZ2luX3kgIT0gLTEgJiYgcGFja2V0LT5kYXRhW3ldIDwgTkVYSU9fVEhSRVNIT0xEKSB7Ci0JCQkJCWVuZF95ID0geSAtIDEgLSBiZTE2X3RvX2NwdShwYWNrZXQtPnhfbGVuKTsKKwkJCQkJZW5kX3kgPSB5IC0gMSAtIHhfbGVuOwogCQkJCQl3ID0gZW5kX3ggLSBiZWdpbl94OwogCQkJCQloID0gZW5kX3kgLSBiZWdpbl95OwogI2lmIDAKQEAgLTExMDQsMTQgKzExMTcsMTQgQEAKIAl9LAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0VUVF9UQzVVSAotCVtERVZUWVBFX1RDNVVIXSA9IHsKKyNpZmRlZiBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0VUVF9UQzQ1VVNCCisJW0RFVlRZUEVfVEM0NVVTQl0gPSB7CiAJCS5taW5feGMJCT0gMHgwLAogCQkubWF4X3hjCQk9IDB4MGZmZiwKIAkJLm1pbl95YwkJPSAweDAsCiAJCS5tYXhfeWMJCT0gMHgwZmZmLAogCQkucmVwdF9zaXplCT0gNSwKLQkJLnJlYWRfZGF0YQk9IHRjNXVoX3JlYWRfZGF0YSwKKwkJLnJlYWRfZGF0YQk9IHRjNDV1c2JfcmVhZF9kYXRhLAogCX0sCiAjZW5kaWYKIApAQCAtMTEyMCw2ICsxMTMzLDcgQEAKIAkJLnJlcHRfc2l6ZQk9IDEwMjQsCiAJCS5pcnFfYWx3YXlzCT0gdHJ1ZSwKIAkJLnJlYWRfZGF0YQk9IG5leGlvX3JlYWRfZGF0YSwKKwkJLmFsbG9jCQk9IG5leGlvX2FsbG9jLAogCQkuaW5pdAkJPSBuZXhpb19pbml0LAogCQkuZXhpdAkJPSBuZXhpb19leGl0LAogCX0sCkBAIC0xMjYzLDYgKzEyNzcsNyBAQAogCXVzYnRvdWNoLT50eXBlLT5wcm9jZXNzX3BrdCh1c2J0b3VjaCwgdXNidG91Y2gtPmRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIGV4aXQ6CisJdXNiX21hcmtfbGFzdF9idXN5KGludGVyZmFjZV90b191c2JkZXYodXNidG91Y2gtPmludGVyZmFjZSkpOwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdDogJWQiLApAQCAtMTI3MiwyNSArMTI4Nyw4OSBAQAogc3RhdGljIGludCB1c2J0b3VjaF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQogewogCXN0cnVjdCB1c2J0b3VjaF91c2IgKnVzYnRvdWNoID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOworCWludCByOwogCiAJdXNidG91Y2gtPmlycS0+ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih1c2J0b3VjaC0+aW50ZXJmYWNlKTsKIAorCXIgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodXNidG91Y2gtPmludGVyZmFjZSkgPyAtRUlPIDogMDsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCiAJaWYgKCF1c2J0b3VjaC0+dHlwZS0+aXJxX2Fsd2F5cykgewotCQlpZiAodXNiX3N1Ym1pdF91cmIodXNidG91Y2gtPmlycSwgR0ZQX0tFUk5FTCkpCi0JCSAgcmV0dXJuIC1FSU87CisJCWlmICh1c2Jfc3VibWl0X3VyYih1c2J0b3VjaC0+aXJxLCBHRlBfS0VSTkVMKSkgeworCQkJciA9IC1FSU87CisJCQlnb3RvIG91dF9wdXQ7CisJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwl1c2J0b3VjaC0+aW50ZXJmYWNlLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMTsKK291dF9wdXQ6CisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHVzYnRvdWNoLT5pbnRlcmZhY2UpOworb3V0OgorCXJldHVybiByOwogfQogCiBzdGF0aWMgdm9pZCB1c2J0b3VjaF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKIHsKIAlzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKKwlpbnQgcjsKIAogCWlmICghdXNidG91Y2gtPnR5cGUtPmlycV9hbHdheXMpCiAJCXVzYl9raWxsX3VyYih1c2J0b3VjaC0+aXJxKTsKKwlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHVzYnRvdWNoLT5pbnRlcmZhY2UpOworCXVzYnRvdWNoLT5pbnRlcmZhY2UtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOworCWlmICghcikKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHVzYnRvdWNoLT5pbnRlcmZhY2UpOwogfQogCitzdGF0aWMgaW50IHVzYnRvdWNoX3N1c3BlbmQKKyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2ggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdXNiX2tpbGxfdXJiKHVzYnRvdWNoLT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNidG91Y2hfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2J0b3VjaF91c2IgKnVzYnRvdWNoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHVzYnRvdWNoLT5pbnB1dDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCW11dGV4X2xvY2soJmlucHV0LT5tdXRleCk7CisJaWYgKGlucHV0LT51c2VycyB8fCB1c2J0b3VjaC0+dHlwZS0+aXJxX2Fsd2F5cykKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXNidG91Y2gtPmlycSwgR0ZQX05PSU8pOworCW11dGV4X3VubG9jaygmaW5wdXQtPm11dGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdXNidG91Y2hfcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2J0b3VjaF91c2IgKnVzYnRvdWNoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHVzYnRvdWNoLT5pbnB1dDsKKwlpbnQgZXJyID0gMDsKKworCS8qIHJlaW5pdCB0aGUgZGV2aWNlICovCisJaWYgKHVzYnRvdWNoLT50eXBlLT5pbml0KSB7CisJCWVyciA9IHVzYnRvdWNoLT50eXBlLT5pbml0KHVzYnRvdWNoKTsKKwkJaWYgKGVycikgeworCQkJZGJnKCIlcyAtIHR5cGUtPmluaXQoKSBmYWlsZWQsIGVycjogJWQiLAorCQkJICAgIF9fZnVuY19fLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIHJlc3RhcnQgSU8gaWYgbmVlZGVkICovCisJbXV0ZXhfbG9jaygmaW5wdXQtPm11dGV4KTsKKwlpZiAoaW5wdXQtPnVzZXJzKQorCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1c2J0b3VjaC0+aXJxLCBHRlBfTk9JTyk7CisJbXV0ZXhfdW5sb2NrKCZpbnB1dC0+bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KIAogc3RhdGljIHZvaWQgdXNidG91Y2hfZnJlZV9idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQkJCSAgc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gpCkBAIC0xNDExLDEyICsxNDkwLDIxIEBACiAJdXNidG91Y2gtPmlycS0+dHJhbnNmZXJfZG1hID0gdXNidG91Y2gtPmRhdGFfZG1hOwogCXVzYnRvdWNoLT5pcnEtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCi0JLyogZGV2aWNlIHNwZWNpZmljIGluaXQgKi8KKwkvKiBkZXZpY2Ugc3BlY2lmaWMgYWxsb2NhdGlvbnMgKi8KKwlpZiAodHlwZS0+YWxsb2MpIHsKKwkJZXJyID0gdHlwZS0+YWxsb2ModXNidG91Y2gpOworCQlpZiAoZXJyKSB7CisJCQlkYmcoIiVzIC0gdHlwZS0+YWxsb2MoKSBmYWlsZWQsIGVycjogJWQiLCBfX2Z1bmNfXywgZXJyKTsKKwkJCWdvdG8gb3V0X2ZyZWVfdXJiOworCQl9CisJfQorCisJLyogZGV2aWNlIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uKi8KIAlpZiAodHlwZS0+aW5pdCkgewogCQllcnIgPSB0eXBlLT5pbml0KHVzYnRvdWNoKTsKIAkJaWYgKGVycikgewogCQkJZGJnKCIlcyAtIHR5cGUtPmluaXQoKSBmYWlsZWQsIGVycjogJWQiLCBfX2Z1bmNfXywgZXJyKTsKLQkJCWdvdG8gb3V0X2ZyZWVfdXJiOworCQkJZ290byBvdXRfZG9fZXhpdDsKIAkJfQogCX0KIApAQCAtMTQyOSw4ICsxNTE3LDExIEBACiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCB1c2J0b3VjaCk7CiAKIAlpZiAodXNidG91Y2gtPnR5cGUtPmlycV9hbHdheXMpIHsKKwkJLyogdGhpcyBjYW4ndCBmYWlsICovCisJCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpbnRmKTsKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXNidG91Y2gtPmlycSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIpIHsKKwkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpbnRmKTsKIAkJCWVycigiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQ6ICVkIiwKIAkJCSAgICBfX2Z1bmNfXywgZXJyKTsKIAkJCWdvdG8gb3V0X3VucmVnaXN0ZXJfaW5wdXQ7CkBAIC0xNDgxLDcgKzE1NzIsMTEgQEAKIAkubmFtZQkJPSAidXNidG91Y2hzY3JlZW4iLAogCS5wcm9iZQkJPSB1c2J0b3VjaF9wcm9iZSwKIAkuZGlzY29ubmVjdAk9IHVzYnRvdWNoX2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQJPSB1c2J0b3VjaF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdXNidG91Y2hfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUJPSB1c2J0b3VjaF9yZXNldF9yZXN1bWUsCiAJLmlkX3RhYmxlCT0gdXNidG91Y2hfZGV2aWNlcywKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdXNidG91Y2hfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYyBiL2RyaXZlcnMvaW5wdXQveGVuLWtiZGZyb250LmMKaW5kZXggZTE0MDgxNi4uZWJiMTE5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYworKysgYi9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jCkBAIC0zMzksNyArMzM5LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgeGVua2JkX2luaXQodm9pZCkKIHsKLQlpZiAoIXhlbl9kb21haW4oKSkKKwlpZiAoIXhlbl9wdl9kb21haW4oKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBOb3RoaW5nIHRvIGRvIGlmIHJ1bm5pbmcgaW4gZG9tMC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwppbmRleCAwY2FiZTMxLi5mODBhN2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC01MCw2ICs0OSw3IEBACiAKIC8qIC0tLS0tLS0tIGRyaXZlciBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgREVGSU5FX01VVEVYKGNhcGlfbXV0ZXgpOwogc3RhdGljIHN0cnVjdCBjbGFzcyAqY2FwaV9jbGFzczsKIHN0YXRpYyBpbnQgY2FwaV9tYWpvciA9IDY4OwkJLyogYWxsb2NhdGVkICovCiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogc3RhdGljIHNzaXplX3QKIGNhcGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGNhcGlkZXYgKmNkZXYgPSAoc3RydWN0IGNhcGlkZXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNhcGlkZXYgKmNkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzaXplX3QgY29waWVkOwogCWludCBlcnI7CkBAIC03MjYsNyArNzI2LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBjYXBpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgY2FwaWRldiAqY2RldiA9IChzdHJ1Y3QgY2FwaWRldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2FwaWRldiAqY2RldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXUxNiBtbGVuOwogCkBAIC03NzMsNyArNzczLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGNhcGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCiB7Ci0Jc3RydWN0IGNhcGlkZXYgKmNkZXYgPSAoc3RydWN0IGNhcGlkZXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNhcGlkZXYgKmNkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCiAJaWYgKCFjZGV2LT5hcC5hcHBsaWQpCkBAIC05ODUsOSArOTg1LDkgQEAKIHsKIAlpbnQgcmV0OwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZjYXBpX211dGV4KTsKIAlyZXQgPSBjYXBpX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZjYXBpX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKaW5kZXggYmY1NWVkNS4uMjk3OGJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYwpAQCAtMTQ1MCwxMiArMTQ1MCw5IEBACiAgICAgCX0KIAogCWZvciAocCA9IGRhdGEsIGVuZCA9IGRhdGErbGVuOyBwIDwgZW5kOyBwKyspIHsKLQkJdTggdzsKIAkJUFVUQllURV9UT19TVEFUVVMoY2FyZCwgJyAnKTsKLQkJdyA9ICgqcCA+PiA0KSAmIDB4ZjsKLQkJUFVUQllURV9UT19TVEFUVVMoY2FyZCwgKHcgPCAxMCkgPyAnMCcrdyA6ICdBJy0xMCt3KTsKLQkJdyA9ICpwICYgMHhmOwotCQlQVVRCWVRFX1RPX1NUQVRVUyhjYXJkLCAodyA8IDEwKSA/ICcwJyt3IDogJ0EnLTEwK3cpOworCQlQVVRCWVRFX1RPX1NUQVRVUyhjYXJkLCBoZXhfYXNjX2hpKCpwKSk7CisJCVBVVEJZVEVfVE9fU1RBVFVTKGNhcmQsIGhleF9hc2NfbG8oKnApKTsKIAl9CiAJUFVUQllURV9UT19TVEFUVVMoY2FyZCwgJ1xuJyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9kaXZlcnQvZGl2ZXJ0X3Byb2Nmcy5jIGIvZHJpdmVycy9pc2RuL2RpdmVydC9kaXZlcnRfcHJvY2ZzLmMKaW5kZXggYzUzZTI0MTcuLjMzZWM5ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9kaXZlcnQvZGl2ZXJ0X3Byb2Nmcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9kaXZlcnQvZGl2ZXJ0X3Byb2Nmcy5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pc2RuaWYuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlICJpc2RuX2RpdmVydC5oIgogCiAKQEAgLTI4LDYgKzI4LDcgQEAKIC8qIFZhcmlhYmxlcyBmb3IgaW50ZXJmYWNlIHF1ZXVlICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdWxvbmcgaWZfdXNlZCA9IDA7CQkvKiBudW1iZXIgb2YgaW50ZXJmYWNlIHVzZXJzICovCitzdGF0aWMgREVGSU5FX01VVEVYKGlzZG5fZGl2ZXJ0X211dGV4KTsKIHN0YXRpYyBzdHJ1Y3QgZGl2ZXJ0X2luZm8gKmRpdmVydF9pbmZvX2hlYWQgPSBOVUxMOwkvKiBoZWFkIG9mIHF1ZXVlICovCiBzdGF0aWMgc3RydWN0IGRpdmVydF9pbmZvICpkaXZlcnRfaW5mb190YWlsID0gTlVMTDsJLyogcG9pbnRlciB0byBsYXN0IGVudHJ5ICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpdmVydF9pbmZvX2xvY2spOy8qIGxvY2sgZm9yIHF1ZXVlICovCkBAIC0yNjEsOSArMjYyLDkgQEAKIHsKIAlsb25nIHJldDsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmaXNkbl9kaXZlcnRfbXV0ZXgpOwogCXJldCA9IGlzZG5fZGl2ZXJ0X2lvY3RsX3VubG9ja2VkKGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZpc2RuX2RpdmVydF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L0tjb25maWcKaW5kZXggZGNlZmVkYy4uYjE4YTkyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9LY29uZmlnCkBAIC0xNyw4ICsxNyw3IEBACiBpZiBJU0ROX0RSVl9HSUdBU0VUCiAKIGNvbmZpZyBHSUdBU0VUX0NBUEkKLQlib29sICJHaWdhc2V0IENBUEkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWJvb2wgIkdpZ2FzZXQgQ0FQSSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNETl9DQVBJPSd5J3x8KElTRE5fQ0FQST0nbScmJklTRE5fRFJWX0dJR0FTRVQ9J20nKQogCWRlZmF1bHQgSVNETl9JNEw9J24nCiAJaGVscApAQCAtMjcsNiArMjYsNyBAQAogCSAgc3Vic3lzdGVtIHlvdSdsbCBoYXZlIHRvIGVuYWJsZSB0aGUgY2FwaWRydiBnbHVlIGRyaXZlci4KIAkgIChzZWxlY3QgSVNETl9DQVBJX0NBUElEUlYuKQogCSAgU2F5IE4gdG8gYnVpbGQgdGhlIG9sZCBuYXRpdmUgSVNETjRMaW51eCB2YXJpYW50LgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIEdJR0FTRVRfSTRMCiAJYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMKaW5kZXggNDdhNWZmZS4uMGRlZDM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9iYXMtZ2lnYXNldC5jCkBAIC0xMTg4LDI0ICsxMTg4LDYgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotI2lmZGVmIENPTkZJR19HSUdBU0VUX0RFQlVHCi0JCQkvKiBjaGVjayBhc3N1bXB0aW9uIG9uIHJlbWFpbmluZyBmcmFtZXMgKi8KLQkJCWZvciAoOyBpIDwgQkFTX05VTUZSQU1FUzsgaSsrKSB7Ci0JCQkJaWZkID0gJnVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV07Ci0JCQkJaWYgKGlmZC0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUwotCQkJCSAgICB8fCBpZmQtPmFjdHVhbF9sZW5ndGggIT0gMCkgewotCQkJCQlkZXZfd2Fybihjcy0+ZGV2LAotCQkJCQkgICAgICJpc29jaHJvbm91cyB3cml0ZTogZnJhbWUgJWQ6ICVzLCAiCi0JCQkJCSAgICAgIiVkIG9mICVkIGJ5dGVzIHNlbnRcbiIsCi0JCQkJCSAgICAgaSwgZ2V0X3VzYl9zdGF0bXNnKGlmZC0+c3RhdHVzKSwKLQkJCQkJICAgICBpZmQtPmFjdHVhbF9sZW5ndGgsIGlmZC0+bGVuZ3RoKTsKLQkJCQkJb2Zmc2V0ID0gKGlmZC0+b2Zmc2V0ICsKLQkJCQkJCSAgaWZkLT5hY3R1YWxfbGVuZ3RoKQotCQkJCQkJICUgQkFTX09VVEJVRlNJWkU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLSNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgLUVQSVBFOgkJCS8qIHN0YWxsIC0gcHJvYmFibHkgdW5kZXJydW4gKi8KIAkJCWRldl9lcnIoY3MtPmRldiwgImlzb2Nocm9ub3VzIHdyaXRlIHN0YWxsZWRcbiIpOwpAQCAtMTkxMyw2NSArMTg5NSw0MSBAQAogICogVVNCIHRyYW5zbWlzc2lvbiBpcyBzdGFydGVkIGlmIG5lY2Vzc2FyeS4KICAqIHBhcmFtZXRlcnM6CiAgKgljcwkJY29udHJvbGxlciBzdGF0ZSBzdHJ1Y3R1cmUKLSAqCWJ1ZgkJY29tbWFuZCBzdHJpbmcgdG8gc2VuZAotICoJbGVuCQludW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCAobWF4LiBJRl9XUklURUJVRikKLSAqCXdha2VfdGFza2xldAl0YXNrbGV0IHRvIHJ1biB3aGVuIHRyYW5zbWlzc2lvbiBpcyBjb21wbGV0ZWQKLSAqCQkJKE5VTEwgaWYgbm9uZSkKKyAqCWNiCQljb21tYW5kIGJ1ZmZlciBzdHJ1Y3R1cmUKICAqIHJldHVybiB2YWx1ZToKICAqCW51bWJlciBvZiBieXRlcyBxdWV1ZWQgb24gc3VjY2VzcwogICoJZXJyb3IgY29kZSA8IDAgb24gZXJyb3IKICAqLwotc3RhdGljIGludCBnaWdhc2V0X3dyaXRlX2NtZChzdHJ1Y3QgY2FyZHN0YXRlICpjcywKLQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAotCQkJICAgICBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKndha2VfdGFza2xldCkKK3N0YXRpYyBpbnQgZ2lnYXNldF93cml0ZV9jbWQoc3RydWN0IGNhcmRzdGF0ZSAqY3MsIHN0cnVjdCBjbWRidWZfdCAqY2IpCiB7Ci0Jc3RydWN0IGNtZGJ1Zl90ICpjYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAogCWdpZ2FzZXRfZGJnX2J1ZmZlcihjcy0+bXN0YXRlICE9IE1TX0xPQ0tFRCA/CiAJCQkgICAgIERFQlVHX1RSQU5TQ01EIDogREVCVUdfTE9DS0NNRCwKLQkJCSAgICJDTUQgVHJhbnNtaXQiLCBsZW4sIGJ1Zik7Ci0KLQlpZiAobGVuIDw9IDApIHsKLQkJLyogbm90aGluZyB0byBkbyAqLwotCQlyYyA9IDA7Ci0JCWdvdG8gbm90cXVldWVkOwotCX0KKwkJCSAgICJDTUQgVHJhbnNtaXQiLCBjYi0+bGVuLCBjYi0+YnVmKTsKIAogCS8qIHRyYW5zbGF0ZSAiKysrIiBlc2NhcGUgc2VxdWVuY2Ugc2VudCBhcyBhIHNpbmdsZSBzZXBhcmF0ZSBjb21tYW5kCiAJICogaW50byAiY2xvc2UgQVQgY2hhbm5lbCIgY29tbWFuZCBmb3IgZXJyb3IgcmVjb3ZlcnkKIAkgKiBUaGUgbmV4dCBjb21tYW5kIHdpbGwgcmVvcGVuIHRoZSBBVCBjaGFubmVsIGF1dG9tYXRpY2FsbHkuCiAJICovCi0JaWYgKGxlbiA9PSAzICYmICFtZW1jbXAoYnVmLCAiKysrIiwgMykpIHsKKwlpZiAoY2ItPmxlbiA9PSAzICYmICFtZW1jbXAoY2ItPmJ1ZiwgIisrKyIsIDMpKSB7CisJCWtmcmVlKGNiKTsKIAkJcmMgPSByZXFfc3VibWl0KGNzLT5iY3MsIEhEX0NMT1NFX0FUQ0hBTk5FTCwgMCwgQkFTX1RJTUVPVVQpOwotCQlnb3RvIG5vdHF1ZXVlZDsKKwkJaWYgKGNiLT53YWtlX3Rhc2tsZXQpCisJCQl0YXNrbGV0X3NjaGVkdWxlKGNiLT53YWtlX3Rhc2tsZXQpOworCQlyZXR1cm4gcmMgPCAwID8gcmMgOiBjYi0+bGVuOwogCX0KIAotCWlmIChsZW4gPiBJRl9XUklURUJVRikKLQkJbGVuID0gSUZfV1JJVEVCVUY7Ci0JY2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kYnVmX3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWNiKSB7Ci0JCWRldl9lcnIoY3MtPmRldiwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBub3RxdWV1ZWQ7Ci0JfQotCi0JbWVtY3B5KGNiLT5idWYsIGJ1ZiwgbGVuKTsKLQljYi0+bGVuID0gbGVuOwotCWNiLT5vZmZzZXQgPSAwOwotCWNiLT5uZXh0ID0gTlVMTDsKLQljYi0+d2FrZV90YXNrbGV0ID0gd2FrZV90YXNrbGV0OwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5jbWRsb2NrLCBmbGFncyk7CiAJY2ItPnByZXYgPSBjcy0+bGFzdGNtZGJ1ZjsKIAlpZiAoY3MtPmxhc3RjbWRidWYpCiAJCWNzLT5sYXN0Y21kYnVmLT5uZXh0ID0gY2I7CiAJZWxzZSB7CiAJCWNzLT5jbWRidWYgPSBjYjsKLQkJY3MtPmN1cmxlbiA9IGxlbjsKKwkJY3MtPmN1cmxlbiA9IGNiLT5sZW47CiAJfQotCWNzLT5jbWRieXRlcyArPSBsZW47CisJY3MtPmNtZGJ5dGVzICs9IGNiLT5sZW47CiAJY3MtPmxhc3RjbWRidWYgPSBjYjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+Y21kbG9jaywgZmxhZ3MpOwogCkBAIC0xOTg4LDEyICsxOTQ2LDcgQEAKIAl9CiAJcmMgPSBzdGFydF9jYnNlbmQoY3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJjIDwgMCA/IHJjIDogbGVuOwotCi1ub3RxdWV1ZWQ6CQkJLyogcmVxdWVzdCBoYW5kbGVkIHdpdGhvdXQgcXVldWluZyAqLwotCWlmICh3YWtlX3Rhc2tsZXQpCi0JCXRhc2tsZXRfc2NoZWR1bGUod2FrZV90YXNrbGV0KTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIHJjIDwgMCA/IHJjIDogY2ItPmxlbjsKIH0KIAogLyogZ2lnYXNldF93cml0ZV9yb29tCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jYXBpLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jYXBpLmMKaW5kZXggNmZiZTg5OS4uZTVlYTM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NhcGkuYwpAQCAtNDUsNiArNDUsNyBAQAogI2RlZmluZSBDQVBJX0ZBQ0lMSVRZX0xJCTB4MDAwNQogCiAjZGVmaW5lIENBUElfU1VQUFNWQ19HRVRTVVBQT1JURUQJMHgwMDAwCisjZGVmaW5lIENBUElfU1VQUFNWQ19MSVNURU4JCTB4MDAwMQogCiAvKiBtaXNzaW5nIGZyb20gY2FwaXV0aWwuaCAqLwogI2RlZmluZSBDQVBJTVNHX1BMQ0lfUEFSVChtKQlDQVBJTVNHX1U4KG0sIDkpCkBAIC0yNzAsOSArMjcxLDEzIEBACiAJa2ZyZWUoZGJnbGluZSk7CiAJaWYgKENBUElNU0dfQ09NTUFORChkYXRhKSA9PSBDQVBJX0RBVEFfQjMgJiYKIAkgICAgKENBUElNU0dfU1VCQ09NTUFORChkYXRhKSA9PSBDQVBJX1JFUSB8fAotCSAgICAgQ0FQSU1TR19TVUJDT01NQU5EKGRhdGEpID09IENBUElfSU5EKSAmJgotCSAgICBDQVBJTVNHX0RBVEFMRU4oZGF0YSkgPiAwKSB7CisJICAgICBDQVBJTVNHX1NVQkNPTU1BTkQoZGF0YSkgPT0gQ0FQSV9JTkQpKSB7CiAJCWwgPSBDQVBJTVNHX0RBVEFMRU4oZGF0YSk7CisJCWdpZ19kYmcobGV2ZWwsICIgICBEYXRhTGVuZ3RoPSVkIiwgbCk7CisJCWlmIChsIDw9IDAgfHwgIShnaWdhc2V0X2RlYnVnbGV2ZWwgJiBERUJVR19MTERBVEEpKQorCQkJcmV0dXJuOworCQlpZiAobCA+IDY0KQorCQkJbCA9IDY0OyAvKiBhcmJpdHJhcnkgbGltaXQgKi8KIAkJZGJnbGluZSA9IGttYWxsb2MoMypsLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFkYmdsaW5lKQogCQkJcmV0dXJuOwpAQCAtMzc4LDEzICszODMsMTMgQEAKIAkrK2Jjcy0+dHJhbnNfdXA7CiAKIAlpZiAoIWFwKSB7Ci0JCWRldl9lcnIoY3MtPmRldiwgIiVzOiBubyBhcHBsaWNhdGlvblxuIiwgX19mdW5jX18pOworCQlnaWdfZGJnKERFQlVHX01DTUQsICIlczogYXBwbGljYXRpb24gZ29uZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGRvbid0IHNlbmQgZnVydGhlciBCMyBtZXNzYWdlcyBpZiBkaXNjb25uZWN0ZWQgKi8KIAlpZiAoYmNzLT5hcGNvbm5zdGF0ZSA8IEFQQ09OTl9BQ1RJVkUpIHsKLQkJZ2lnX2RiZyhERUJVR19MTERBVEEsICJkaXNjb25uZWN0ZWQsIGRpc2NhcmRpbmcgYWNrIik7CisJCWdpZ19kYmcoREVCVUdfTUNNRCwgIiVzOiBkaXNjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQyMiwxMyArNDI3LDE0IEBACiAJYmNzLT50cmFuc19kb3duKys7CiAKIAlpZiAoIWFwKSB7Ci0JCWRldl9lcnIoY3MtPmRldiwgIiVzOiBubyBhcHBsaWNhdGlvblxuIiwgX19mdW5jX18pOworCQlnaWdfZGJnKERFQlVHX01DTUQsICIlczogYXBwbGljYXRpb24gZ29uZSIsIF9fZnVuY19fKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGRvbid0IHNlbmQgZnVydGhlciBCMyBtZXNzYWdlcyBpZiBkaXNjb25uZWN0ZWQgKi8KIAlpZiAoYmNzLT5hcGNvbm5zdGF0ZSA8IEFQQ09OTl9BQ1RJVkUpIHsKLQkJZ2lnX2RiZyhERUJVR19MTERBVEEsICJkaXNjb25uZWN0ZWQsIGRpc2NhcmRpbmcgZGF0YSIpOworCQlnaWdfZGJnKERFQlVHX01DTUQsICIlczogZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlyZXR1cm47CiAJfQpAQCAtNDU0LDcgKzQ2MCw3IEBACiAJLyogRGF0YTY0IHBhcmFtZXRlciBub3QgcHJlc2VudCAqLwogCiAJLyogZW1pdCBtZXNzYWdlICovCi0JZHVtcF9yYXdtc2coREVCVUdfTExEQVRBLCAiREFUQV9CM19JTkQiLCBza2ItPmRhdGEpOworCWR1bXBfcmF3bXNnKERFQlVHX01DTUQsIF9fZnVuY19fLCBza2ItPmRhdGEpOwogCWNhcGlfY3RyX2hhbmRsZV9tZXNzYWdlKCZpaWYtPmN0ciwgYXAtPmlkLCBza2IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2lnYXNldF9za2JfcmN2ZCk7CkBAIC03NDcsNyArNzUzLDcgQEAKIAlhcCA9IGJjcy0+YXA7CiAJaWYgKCFhcCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmFwbG9jaywgZmxhZ3MpOwotCQlkZXZfZXJyKGNzLT5kZXYsICIlczogbm8gYXBwbGljYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJZ2lnX2RiZyhERUJVR19DTUQsICIlczogYXBwbGljYXRpb24gZ29uZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoYmNzLT5hcGNvbm5zdGF0ZSA9PSBBUENPTk5fTk9ORSkgewpAQCAtODQzLDcgKzg0OSw3IEBACiAJYXAgPSBiY3MtPmFwOwogCWlmICghYXApIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNzLT5hcGxvY2ssIGZsYWdzKTsKLQkJZGV2X2Vycihjcy0+ZGV2LCAiJXM6IG5vIGFwcGxpY2F0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCWdpZ19kYmcoREVCVUdfQ01ELCAiJXM6IGFwcGxpY2F0aW9uIGdvbmUiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKCFiY3MtPmFwY29ubnN0YXRlKSB7CkBAIC05MDEsMTMgKzkwNywxMiBAQAogICovCiB2b2lkIGdpZ2FzZXRfaXNkbl9odXBCKHN0cnVjdCBiY19zdGF0ZSAqYmNzKQogewotCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gYmNzLT5jczsKIAlzdHJ1Y3QgZ2lnYXNldF9jYXBpX2FwcGwgKmFwID0gYmNzLT5hcDsKIAogCS8qIFRvRG86IGFzc3VyZSBvcmRlciBvZiBESVNDT05ORUNUX0IzX0lORCBhbmQgRElTQ09OTkVDVF9JTkQgPyAqLwogCiAJaWYgKCFhcCkgewotCQlkZXZfZXJyKGNzLT5kZXYsICIlczogbm8gYXBwbGljYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJZ2lnX2RiZyhERUJVR19DTUQsICIlczogYXBwbGljYXRpb24gZ29uZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTc4LDYgKzk4Myw5IEBACiAJc3RydWN0IGNhcmRzdGF0ZSAqY3MgPSBjdHItPmRyaXZlcmRhdGE7CiAJc3RydWN0IGdpZ2FzZXRfY2FwaV9hcHBsICphcDsKIAorCWdpZ19kYmcoREVCVUdfQ01ELCAiJXMgWyV1XSBsM2NudD0ldSBibGtjbnQ9JXUgYmxrbGVuPSV1IiwKKwkJX19mdW5jX18sIGFwcGwsIHJwLT5sZXZlbDNjbnQsIHJwLT5kYXRhYmxrY250LCBycC0+ZGF0YWJsa2xlbik7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFwLCAmaWlmLT5hcHBscywgY3RybGlzdCkKIAkJaWYgKGFwLT5pZCA9PSBhcHBsKSB7CiAJCQlkZXZfbm90aWNlKGNzLT5kZXYsCkBAIC0xMDYyLDYgKzEwNzAsOCBAQAogCXN0cnVjdCBnaWdhc2V0X2NhcGlfYXBwbCAqYXAsICp0bXA7CiAJdW5zaWduZWQgY2g7CiAKKwlnaWdfZGJnKERFQlVHX0NNRCwgIiVzIFsldV0iLCBfX2Z1bmNfXywgYXBwbCk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXAsIHRtcCwgJmlpZi0+YXBwbHMsIGN0cmxpc3QpCiAJCWlmIChhcC0+aWQgPT0gYXBwbCkgewogCQkJLyogcmVtb3ZlIGZyb20gYW55IGNoYW5uZWxzICovCkBAIC0xMTQyLDcgKzExNTIsNyBAQAogCWNhc2UgQ0FQSV9GQUNJTElUWV9TVVBQU1ZDOgogCQkvKiBkZWNvZGUgRnVuY3Rpb24gcGFyYW1ldGVyICovCiAJCXBwYXJhbSA9IGNtc2ctPkZhY2lsaXR5UmVxdWVzdFBhcmFtZXRlcjsKLQkJaWYgKHBwYXJhbSA9PSBOVUxMIHx8ICpwcGFyYW0gPCAyKSB7CisJCWlmIChwcGFyYW0gPT0gTlVMTCB8fCBwcGFyYW1bMF0gPCAyKSB7CiAJCQlkZXZfbm90aWNlKGNzLT5kZXYsICIlczogJXMgbWlzc2luZ1xuIiwgIkZBQ0lMSVRZX1JFUSIsCiAJCQkJICAgIkZhY2lsaXR5IFJlcXVlc3QgUGFyYW1ldGVyIik7CiAJCQlzZW5kX2NvbmYoaWlmLCBhcCwgc2tiLCBDYXBpSWxsTWVzc2FnZVBhcm1Db2RpbmcpOwpAQCAtMTE1OSw4ICsxMTY5LDMyIEBACiAJCQkvKiBTdXBwb3J0ZWQgU2VydmljZXM6IG5vbmUgKi8KIAkJCWNhcGltc2dfc2V0dTMyKGNvbmZwYXJhbSwgNiwgMCk7CiAJCQlicmVhazsKKwkJY2FzZSBDQVBJX1NVUFBTVkNfTElTVEVOOgorCQkJaWYgKHBwYXJhbVswXSA8IDcgfHwgcHBhcmFtWzNdIDwgNCkgeworCQkJCWRldl9ub3RpY2UoY3MtPmRldiwgIiVzOiAlcyBtaXNzaW5nXG4iLAorCQkJCQkgICAiRkFDSUxJVFlfUkVRIiwgIk5vdGlmaWNhdGlvbiBNYXNrIik7CisJCQkJc2VuZF9jb25mKGlpZiwgYXAsIHNrYiwKKwkJCQkJICBDYXBpSWxsTWVzc2FnZVBhcm1Db2RpbmcpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChDQVBJTVNHX1UzMihwcGFyYW0sIDQpICE9IDApIHsKKwkJCQlkZXZfbm90aWNlKGNzLT5kZXYsCisJIiVzOiB1bnN1cHBvcnRlZCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugbm90aWZpY2F0aW9uIG1hc2sgMHgleFxuIiwKKwkJCQkgICAiRkFDSUxJVFlfUkVRIiwgQ0FQSU1TR19VMzIocHBhcmFtLCA0KSk7CisJCQkJaW5mbyA9IENhcGlGYWNpbGl0eVNwZWNpZmljRnVuY3Rpb25Ob3RTdXBwb3J0ZWQ7CisJCQkJY29uZnBhcmFtWzNdID0gMjsJLyogbGVuZ3RoICovCisJCQkJY2FwaW1zZ19zZXR1MTYoY29uZnBhcmFtLCA0LAorCQkJCQlDYXBpU3VwcGxlbWVudGFyeVNlcnZpY2VOb3RTdXBwb3J0ZWQpOworCQkJfQorCQkJaW5mbyA9IENhcGlTdWNjZXNzOworCQkJY29uZnBhcmFtWzNdID0gMjsJLyogbGVuZ3RoICovCisJCQljYXBpbXNnX3NldHUxNihjb25mcGFyYW0sIDQsIENhcGlTdWNjZXNzKTsKKwkJCWJyZWFrOwogCQkvKiBUb0RvOiBhZGQgc3VwcG9ydGVkIHNlcnZpY2VzICovCiAJCWRlZmF1bHQ6CisJCQlkZXZfbm90aWNlKGNzLT5kZXYsCisJCSIlczogdW5zdXBwb3J0ZWQgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIGZ1bmN0aW9uIDB4JTA0eFxuIiwKKwkJCQkgICAiRkFDSUxJVFlfUkVRIiwgZnVuY3Rpb24pOwogCQkJaW5mbyA9IENhcGlGYWNpbGl0eVNwZWNpZmljRnVuY3Rpb25Ob3RTdXBwb3J0ZWQ7CiAJCQkvKiBTdXBwbGVtZW50YXJ5IFNlcnZpY2Ugc3BlY2lmaWMgcGFyYW1ldGVyICovCiAJCQljb25mcGFyYW1bM10gPSAyOwkvKiBsZW5ndGggKi8KQEAgLTE5NTEsMTEgKzE5ODUsNyBAQAogCXUxNiBoYW5kbGUgPSBDQVBJTVNHX0hBTkRMRV9SRVEoc2tiLT5kYXRhKTsKIAogCS8qIGZyZXF1ZW50IG1lc3NhZ2UsIGF2b2lkIF9jbXNnIG92ZXJoZWFkICovCi0JZHVtcF9yYXdtc2coREVCVUdfTExEQVRBLCAiREFUQV9CM19SRVEiLCBza2ItPmRhdGEpOwotCi0JZ2lnX2RiZyhERUJVR19MTERBVEEsCi0JCSJSZWNlaXZpbmcgZGF0YSBmcm9tIExMIChjaDogJWQsIGZsZzogJXgsIHN6OiAlZHwlZCkiLAotCQljaGFubmVsLCBmbGFncywgbXNnbGVuLCBkYXRhbGVuKTsKKwlkdW1wX3Jhd21zZyhERUJVR19NQ01ELCBfX2Z1bmNfXywgc2tiLT5kYXRhKTsKIAogCS8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KIAlpZiAoY2hhbm5lbCA9PSAwIHx8IGNoYW5uZWwgPiBjcy0+Y2hhbm5lbHMgfHwgbmNjaSAhPSAxKSB7CkBAIC0yMDY0LDcgKzIwOTQsNyBAQAogCQkJICAgIHN0cnVjdCBnaWdhc2V0X2NhcGlfYXBwbCAqYXAsCiAJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlkdW1wX3Jhd21zZyhERUJVR19MTERBVEEsIF9fZnVuY19fLCBza2ItPmRhdGEpOworCWR1bXBfcmF3bXNnKERFQlVHX01DTUQsIF9fZnVuY19fLCBza2ItPmRhdGEpOwogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKaW5kZXggNWQ0YmVmYi4uM2NhNTYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKQEAgLTc5MSw4ICs3OTEsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJc2V0dXBfdGltZXIoJmNzLT50aW1lciwgdGltZXJfdGljaywgKHVuc2lnbmVkIGxvbmcpIGNzKTsKIAljcy0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEdJR19USUNLKTsKLQkvKiBGSVhNRTogY2FuIGppZmZpZXMgaW5jcmVhc2UgdG9vIG11Y2ggdW50aWwgdGhlIHRpbWVyIGlzIGFkZGVkPwotCSAqIFNhbWUgcHJvYmxlbSg/KSB3aXRoIG1vZF90aW1lcigpIGluIHRpbWVyX3RpY2soKS4gKi8KIAlhZGRfdGltZXIoJmNzLT50aW1lcik7CiAKIAlnaWdfZGJnKERFQlVHX0lOSVQsICJjcyBpbml0aWFsaXplZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2V2LWxheWVyLmMKaW5kZXggY2VhZWY5YS4uYTE0MTg3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jCkBAIC0zNSw1MyArMzUsNDAgQEAKICNkZWZpbmUgUlRfUklORwkJMgogI2RlZmluZSBSVF9OVU1CRVIJMwogI2RlZmluZSBSVF9TVFJJTkcJNAotI2RlZmluZSBSVF9IRVgJCTUKICNkZWZpbmUgUlRfWkNBVQkJNgogCiAvKiBQb3NzaWJsZSBBU0NJSSByZXNwb25zZXMgKi8KICNkZWZpbmUgUlNQX09LCQkwCi0jZGVmaW5lIFJTUF9CVVNZCTEKLSNkZWZpbmUgUlNQX0NPTk5FQ1QJMgorI2RlZmluZSBSU1BfRVJST1IJMQogI2RlZmluZSBSU1BfWkdDSQkzCiAjZGVmaW5lIFJTUF9SSU5HCTQKLSNkZWZpbmUgUlNQX1pBT0MJNQotI2RlZmluZSBSU1BfWkNTVFIJNgotI2RlZmluZSBSU1BfWkNGR1QJNwotI2RlZmluZSBSU1BfWkNGRwk4Ci0jZGVmaW5lIFJTUF9aQ0NSCTkKLSNkZWZpbmUgUlNQX0VNUFRZCTEwCi0jZGVmaW5lIFJTUF9aTE9HCTExCi0jZGVmaW5lIFJTUF9aQ0FVCTEyCi0jZGVmaW5lIFJTUF9aTVdJCTEzCi0jZGVmaW5lIFJTUF9aQUJJTkZPCTE0Ci0jZGVmaW5lIFJTUF9aU01MU1RDSEcJMTUKKyNkZWZpbmUgUlNQX1pWTFMJNQorI2RlZmluZSBSU1BfWkNBVQk2CisKKy8qIHJlc3BvbnNlcyB3aXRoIHZhbHVlcyB0byBzdG9yZSBpbiBhdF9zdGF0ZSAqLworLyogLSBudW1lcmljICovCiAjZGVmaW5lIFJTUF9WQVIJCTEwMAogI2RlZmluZSBSU1BfWlNBVQkoUlNQX1ZBUiArIFZBUl9aU0FVKQogI2RlZmluZSBSU1BfWkRMRQkoUlNQX1ZBUiArIFZBUl9aRExFKQotI2RlZmluZSBSU1BfWlZMUwkoUlNQX1ZBUiArIFZBUl9aVkxTKQogI2RlZmluZSBSU1BfWkNUUAkoUlNQX1ZBUiArIFZBUl9aQ1RQKQorLyogLSBzdHJpbmcgKi8KICNkZWZpbmUgUlNQX1NUUgkJKFJTUF9WQVIgKyBWQVJfTlVNKQogI2RlZmluZSBSU1BfTk1CUgkoUlNQX1NUUiArIFNUUl9OTUJSKQogI2RlZmluZSBSU1BfWkNQTgkoUlNQX1NUUiArIFNUUl9aQ1BOKQogI2RlZmluZSBSU1BfWkNPTgkoUlNQX1NUUiArIFNUUl9aQ09OKQogI2RlZmluZSBSU1BfWkJDCQkoUlNQX1NUUiArIFNUUl9aQkMpCiAjZGVmaW5lIFJTUF9aSExDCShSU1BfU1RSICsgU1RSX1pITEMpCi0jZGVmaW5lIFJTUF9FUlJPUgktMQkvKiBFUlJPUiAgICAgICAgICAgICAgKi8KKwogI2RlZmluZSBSU1BfV1JPTkdfQ0lECS0yCS8qIHVua25vd24gY2lkIGluIGNtZCAqLwotI2RlZmluZSBSU1BfVU5LTk9XTgktNAkvKiB1bmtub3duIHJlc3BvbnNlICAgKi8KLSNkZWZpbmUgUlNQX0ZBSUwJLTUJLyogaW50ZXJuYWwgZXJyb3IgICAgICovCiAjZGVmaW5lIFJTUF9JTlZBTAktNgkvKiBpbnZhbGlkIHJlc3BvbnNlICAgKi8KKyNkZWZpbmUgUlNQX05PREVWCS05CS8qIGRldmljZSBub3QgY29ubmVjdGVkICovCiAKICNkZWZpbmUgUlNQX05PTkUJLTE5CiAjZGVmaW5lIFJTUF9TVFJJTkcJLTIwCiAjZGVmaW5lIFJTUF9OVUxMCS0yMQotI2RlZmluZSBSU1BfUkVUUllGQUlMCS0yMgotI2RlZmluZSBSU1BfUkVUUlkJLTIzCi0jZGVmaW5lIFJTUF9TS0lQCS0yNAogI2RlZmluZSBSU1BfSU5JVAktMjcKICNkZWZpbmUgUlNQX0FOWQkJLTI2CiAjZGVmaW5lIFJTUF9MQVNUCS0yOAotI2RlZmluZSBSU1BfTk9ERVYJLTkKIAogLyogYWN0aW9ucyBmb3IgcHJvY2Vzc19yZXNwb25zZSAqLwogI2RlZmluZSBBQ1RfTk9USElORwkJMApAQCAtMjU5LDEzICsyNDYsNiBAQAogCiAvKiBtaXNjLiAqLwoge1JTUF9FUlJPUiwJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfRVJST1J9IH0sCi17UlNQX1pDRkdULAkgLTEsICAtMSwgLTEsCQkJIC0xLCAtMSwge0FDVF9ERUJVR30gfSwKLXtSU1BfWkNGRywJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfREVCVUd9IH0sCi17UlNQX1pMT0csCSAtMSwgIC0xLCAtMSwJCQkgLTEsIC0xLCB7QUNUX0RFQlVHfSB9LAote1JTUF9aTVdJLAkgLTEsICAtMSwgLTEsCQkJIC0xLCAtMSwge0FDVF9ERUJVR30gfSwKLXtSU1BfWkFCSU5GTywJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfREVCVUd9IH0sCi17UlNQX1pTTUxTVENIRywJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfREVCVUd9IH0sCi0KIHtSU1BfWkNBVSwJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfWkNBVX0gfSwKIHtSU1BfTk9ORSwJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfREVCVUd9IH0sCiB7UlNQX0FOWSwJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfV0FSTn0gfSwKQEAgLTM2MSwxMCArMzQxLDYgQEAKIAogLyogbWlzYy4gKi8KIHtSU1BfWkNPTiwJIC0xLCAgLTEsIC0xLAkJCSAtMSwgLTEsIHtBQ1RfREVCVUd9IH0sCi17UlNQX1pDQ1IsCSAtMSwgIC0xLCAtMSwJCQkgLTEsIC0xLCB7QUNUX0RFQlVHfSB9LAote1JTUF9aQU9DLAkgLTEsICAtMSwgLTEsCQkJIC0xLCAtMSwge0FDVF9ERUJVR30gfSwKLXtSU1BfWkNTVFIsCSAtMSwgIC0xLCAtMSwJCQkgLTEsIC0xLCB7QUNUX0RFQlVHfSB9LAotCiB7UlNQX1pDQVUsCSAtMSwgIC0xLCAtMSwJCQkgLTEsIC0xLCB7QUNUX1pDQVV9IH0sCiB7UlNQX05PTkUsCSAtMSwgIC0xLCAtMSwJCQkgLTEsIC0xLCB7QUNUX0RFQlVHfSB9LAoge1JTUF9BTlksCSAtMSwgIC0xLCAtMSwJCQkgLTEsIC0xLCB7QUNUX1dBUk59IH0sCkBAIC0zODcsMjAgKzM2MywxMSBAQAogCXsiWlZMUyIsCVJTUF9aVkxTLAlSVF9OVU1CRVJ9LAogCXsiWkNUUCIsCVJTUF9aQ1RQLAlSVF9OVU1CRVJ9LAogCXsiWkRMRSIsCVJTUF9aRExFLAlSVF9OVU1CRVJ9LAotCXsiWkNGR1QiLAlSU1BfWkNGR1QsCVJUX05VTUJFUn0sCi0JeyJaQ0NSIiwJUlNQX1pDQ1IsCVJUX05VTUJFUn0sCi0JeyJaTVdJIiwJUlNQX1pNV0ksCVJUX05VTUJFUn0sCiAJeyJaSExDIiwJUlNQX1pITEMsCVJUX1NUUklOR30sCiAJeyJaQkMiLAkJUlNQX1pCQywJUlRfU1RSSU5HfSwKIAl7Ik5NQlIiLAlSU1BfTk1CUiwJUlRfU1RSSU5HfSwKIAl7IlpDUE4iLAlSU1BfWkNQTiwJUlRfU1RSSU5HfSwKIAl7IlpDT04iLAlSU1BfWkNPTiwJUlRfU1RSSU5HfSwKLQl7IlpBT0MiLAlSU1BfWkFPQywJUlRfU1RSSU5HfSwKLQl7IlpDU1RSIiwJUlNQX1pDU1RSLAlSVF9TVFJJTkd9LAotCXsiWkNGRyIsCVJTUF9aQ0ZHLAlSVF9IRVh9LAotCXsiWkxPRyIsCVJTUF9aTE9HLAlSVF9OT1RISU5HfSwKLQl7IlpBQklORk8iLAlSU1BfWkFCSU5GTywJUlRfTk9USElOR30sCi0JeyJaU01MU1RDSEciLAlSU1BfWlNNTFNUQ0hHLAlSVF9OT1RISU5HfSwKIAl7TlVMTCwJCTAsCQkwfQogfTsKIApAQCAtNDE4LDY0ICszODUsMTggQEAKIAl7TlVMTCwJCQkJWlNBVV9VTktOT1dOfQogfTsKIAotLyoKLSAqIEdldCBpbnRlZ2VyIGZyb20gY2hhci1wb2ludGVyCi0gKi8KLXN0YXRpYyBpbnQgaXNkbl9nZXRudW0oY2hhciAqcCkKLXsKLQlpbnQgdiA9IC0xOwotCi0JZ2lnX2RiZyhERUJVR19FVkVOVCwgInN0cmluZzogJXMiLCBwKTsKLQotCXdoaWxlICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQotCQl2ID0gKCh2IDwgMCkgPyAwIDogKHYgKiAxMCkpICsgKGludCkgKCgqcCsrKSAtICcwJyk7Ci0JaWYgKCpwKQotCQl2ID0gLTE7IC8qIGludmFsaWQgQ2hhcmFjdGVyICovCi0JcmV0dXJuIHY7Ci19Ci0KLS8qCi0gKiBHZXQgaW50ZWdlciBmcm9tIGNoYXItcG9pbnRlcgotICovCi1zdGF0aWMgaW50IGlzZG5fZ2V0aGV4KGNoYXIgKnApCi17Ci0JaW50IHYgPSAwOwotCWludCBjOwotCi0JZ2lnX2RiZyhERUJVR19FVkVOVCwgInN0cmluZzogJXMiLCBwKTsKLQotCWlmICghKnApCi0JCXJldHVybiAtMTsKLQotCWRvIHsKLQkJaWYgKHYgPiAoSU5UX01BWCAtIDE1KSAvIDE2KQotCQkJcmV0dXJuIC0xOwotCQljID0gKnA7Ci0JCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLQkJCWMgLT0gJ2EnIC0gMTA7Ci0JCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQotCQkJYyAtPSAnQScgLSAxMDsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCQl2ID0gdiAqIDE2ICsgYzsKLQl9IHdoaWxlICgqKytwKTsKLQotCXJldHVybiB2OwotfQotCiAvKiByZXRyaWV2ZSBDSUQgZnJvbSBwYXJzZWQgcmVzcG9uc2UKICAqIHJldHVybnMgMCBpZiBubyBDSUQsIC0xIGlmIGludmFsaWQgQ0lELCBvciBDSUQgdmFsdWUgMS4uNjU1MzUKICAqLwogc3RhdGljIGludCBjaWRfb2ZfcmVzcG9uc2UoY2hhciAqcykKIHsKLQlpbnQgY2lkOworCXVuc2lnbmVkIGxvbmcgY2lkOworCWludCByYzsKIAogCWlmIChzWy0xXSAhPSAnOycpCiAJCXJldHVybiAwOwkvKiBubyBDSUQgc2VwYXJhdG9yICovCi0JY2lkID0gaXNkbl9nZXRudW0ocyk7Ci0JaWYgKGNpZCA8IDApCisJcmMgPSBzdHJpY3Rfc3RydG91bChzLCAxMCwgJmNpZCk7CisJaWYgKHJjKQogCQlyZXR1cm4gMDsJLyogQ0lEIG5vdCBudW1lcmljICovCiAJaWYgKGNpZCA8IDEgfHwgY2lkID4gNjU1MzUpCiAJCXJldHVybiAtMTsJLyogQ0lEIG91dCBvZiByYW5nZSAqLwpAQCAtNTg4LDEwICs1MDksMTAgQEAKIAkJCQkJYnJlYWs7CiAKIAkJCWlmICghcnQtPnJlc3BvbnNlKSB7Ci0JCQkJZXZlbnQtPnR5cGUgPSBSU1BfVU5LTk9XTjsKLQkJCQlkZXZfd2Fybihjcy0+ZGV2LAotCQkJCQkgInVua25vd24gbW9kZW0gcmVzcG9uc2U6ICVzXG4iLAotCQkJCQkgYXJndltjdXJhcmddKTsKKwkJCQlldmVudC0+dHlwZSA9IFJTUF9OT05FOworCQkJCWdpZ19kYmcoREVCVUdfRVZFTlQsCisJCQkJCSJ1bmtub3duIG1vZGVtIHJlc3BvbnNlOiAnJXMnXG4iLAorCQkJCQlhcmd2W2N1cmFyZ10pOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC02NDUsMjcgKzU2NiwyNyBAQAogCQljYXNlIFJUX1pDQVU6CiAJCQlldmVudC0+cGFyYW1ldGVyID0gLTE7CiAJCQlpZiAoY3VyYXJnICsgMSA8IHBhcmFtcykgewotCQkJCWkgPSBpc2RuX2dldGhleChhcmd2W2N1cmFyZ10pOwotCQkJCWogPSBpc2RuX2dldGhleChhcmd2W2N1cmFyZyArIDFdKTsKLQkJCQlpZiAoaSA+PSAwICYmIGkgPCAyNTYgJiYgaiA+PSAwICYmIGogPCAyNTYpCi0JCQkJCWV2ZW50LT5wYXJhbWV0ZXIgPSAodW5zaWduZWQpIGkgPDwgOAotCQkJCQkJCSAgIHwgajsKLQkJCQljdXJhcmcgKz0gMjsKKwkJCQl1bnNpZ25lZCBsb25nIHR5cGUsIHZhbHVlOworCisJCQkJaSA9IHN0cmljdF9zdHJ0b3VsKGFyZ3ZbY3VyYXJnKytdLCAxNiwgJnR5cGUpOworCQkJCWogPSBzdHJpY3Rfc3RydG91bChhcmd2W2N1cmFyZysrXSwgMTYsICZ2YWx1ZSk7CisKKwkJCQlpZiAoaSA9PSAwICYmIHR5cGUgPCAyNTYgJiYKKwkJCQkgICAgaiA9PSAwICYmIHZhbHVlIDwgMjU2KQorCQkJCQlldmVudC0+cGFyYW1ldGVyID0gKHR5cGUgPDwgOCkgfCB2YWx1ZTsKIAkJCX0gZWxzZQogCQkJCWN1cmFyZyA9IHBhcmFtcyAtIDE7CiAJCQlicmVhazsKIAkJY2FzZSBSVF9OVU1CRVI6Ci0JCWNhc2UgUlRfSEVYOgorCQkJZXZlbnQtPnBhcmFtZXRlciA9IC0xOwogCQkJaWYgKGN1cmFyZyA8IHBhcmFtcykgewotCQkJCWlmIChwYXJhbV90eXBlID09IFJUX0hFWCkKLQkJCQkJZXZlbnQtPnBhcmFtZXRlciA9Ci0JCQkJCQlpc2RuX2dldGhleChhcmd2W2N1cmFyZ10pOwotCQkJCWVsc2UKLQkJCQkJZXZlbnQtPnBhcmFtZXRlciA9Ci0JCQkJCQlpc2RuX2dldG51bShhcmd2W2N1cmFyZ10pOwotCQkJCSsrY3VyYXJnOwotCQkJfSBlbHNlCi0JCQkJZXZlbnQtPnBhcmFtZXRlciA9IC0xOworCQkJCXVuc2lnbmVkIGxvbmcgcmVzOworCQkJCWludCByYzsKKworCQkJCXJjID0gc3RyaWN0X3N0cnRvdWwoYXJndltjdXJhcmcrK10sIDEwLCAmcmVzKTsKKwkJCQlpZiAocmMgPT0gMCkKKwkJCQkJZXZlbnQtPnBhcmFtZXRlciA9IHJlczsKKwkJCX0KIAkJCWdpZ19kYmcoREVCVUdfRVZFTlQsICJwYXJhbWV0ZXI9PSVkIiwgZXZlbnQtPnBhcmFtZXRlcik7CiAJCQlicmVhazsKIAkJfQpAQCAtNzk3LDQ4ICs3MTgsMjcgQEAKIHN0YXRpYyB2b2lkIHNlbmRfY29tbWFuZChzdHJ1Y3QgY2FyZHN0YXRlICpjcywgY29uc3QgY2hhciAqY21kLCBpbnQgY2lkLAogCQkJIGludCBkbGUsIGdmcF90IGttYWxsb2NmbGFncykKIHsKLQlzaXplX3QgY21kbGVuLCBidWZsZW47Ci0JY2hhciAqY21kcG9zLCAqY21kYnVmLCAqY21kdGFpbDsKKwlzdHJ1Y3QgY21kYnVmX3QgKmNiOworCXNpemVfdCBidWZsZW47CiAKLQljbWRsZW4gPSBzdHJsZW4oY21kKTsKLQlidWZsZW4gPSAxMSArIGNtZGxlbjsKLQlpZiAodW5saWtlbHkoYnVmbGVuIDw9IGNtZGxlbikpIHsKLQkJZGV2X2Vycihjcy0+ZGV2LCAiaW50ZWdlciBvdmVyZmxvdyBpbiBidWZsZW5cbiIpOworCWJ1ZmxlbiA9IHN0cmxlbihjbWQpICsgMTI7IC8qIERMRSAoIEEgVCAxIDIgMyA0IDUgPGNtZD4gRExFICkgXDAgKi8KKwljYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRidWZfdCkgKyBidWZsZW4sIGttYWxsb2NmbGFncyk7CisJaWYgKCFjYikgeworCQlkZXZfZXJyKGNzLT5kZXYsICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQotCi0JY21kYnVmID0ga21hbGxvYyhidWZsZW4sIGttYWxsb2NmbGFncyk7Ci0JaWYgKHVubGlrZWx5KCFjbWRidWYpKSB7Ci0JCWRldl9lcnIoY3MtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JY21kcG9zID0gY21kYnVmICsgOTsKLQljbWR0YWlsID0gY21kcG9zICsgY21kbGVuOwotCW1lbWNweShjbWRwb3MsIGNtZCwgY21kbGVuKTsKLQotCWlmIChjaWQgPiAwICYmIGNpZCA8PSA2NTUzNSkgewotCQlkbyB7Ci0JCQkqLS1jbWRwb3MgPSAnMCcgKyBjaWQgJSAxMDsKLQkJCWNpZCAvPSAxMDsKLQkJCSsrY21kbGVuOwotCQl9IHdoaWxlIChjaWQpOwotCX0KLQotCWNtZGxlbiArPSAyOwotCSotLWNtZHBvcyA9ICdUJzsKLQkqLS1jbWRwb3MgPSAnQSc7Ci0KLQlpZiAoZGxlKSB7Ci0JCWNtZGxlbiArPSA0OwotCQkqLS1jbWRwb3MgPSAnKCc7Ci0JCSotLWNtZHBvcyA9IDB4MTA7Ci0JCSpjbWR0YWlsKysgPSAweDEwOwotCQkqY21kdGFpbCsrID0gJyknOwotCX0KLQotCWNzLT5vcHMtPndyaXRlX2NtZChjcywgY21kcG9zLCBjbWRsZW4sIE5VTEwpOwotCWtmcmVlKGNtZGJ1Zik7CisJaWYgKGNpZCA+IDAgJiYgY2lkIDw9IDY1NTM1KQorCQljYi0+bGVuID0gc25wcmludGYoY2ItPmJ1ZiwgYnVmbGVuLAorCQkJCSAgZGxlID8gIlwwMjAoQVQlZCVzXDAyMCkiIDogIkFUJWQlcyIsCisJCQkJICBjaWQsIGNtZCk7CisJZWxzZQorCQljYi0+bGVuID0gc25wcmludGYoY2ItPmJ1ZiwgYnVmbGVuLAorCQkJCSAgZGxlID8gIlwwMjAoQVQlc1wwMjApIiA6ICJBVCVzIiwKKwkJCQkgIGNtZCk7CisJY2ItPm9mZnNldCA9IDA7CisJY2ItPm5leHQgPSBOVUxMOworCWNiLT53YWtlX3Rhc2tsZXQgPSBOVUxMOworCWNzLT5vcHMtPndyaXRlX2NtZChjcywgY2IpOwogfQogCiBzdGF0aWMgc3RydWN0IGF0X3N0YXRlX3QgKmF0X3N0YXRlX2Zyb21fY2lkKHN0cnVjdCBjYXJkc3RhdGUgKmNzLCBpbnQgY2lkKQpAQCAtMTI0MCw4ICsxMTQwLDIyIEBACiAJCWJyZWFrOwogCWNhc2UgQUNUX0hVUE1PREVNOgogCQkvKiBzZW5kICIrKysiIChoYW5ndXAgaW4gdW5pbW9kZW0gbW9kZSkgKi8KLQkJaWYgKGNzLT5jb25uZWN0ZWQpCi0JCQljcy0+b3BzLT53cml0ZV9jbWQoY3MsICIrKysiLCAzLCBOVUxMKTsKKwkJaWYgKGNzLT5jb25uZWN0ZWQpIHsKKwkJCXN0cnVjdCBjbWRidWZfdCAqY2I7CisKKwkJCWNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNtZGJ1Zl90KSArIDMsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFjYikgeworCQkJCWRldl9lcnIoY3MtPmRldiwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJbWVtY3B5KGNiLT5idWYsICIrKysiLCAzKTsKKwkJCWNiLT5sZW4gPSAzOworCQkJY2ItPm9mZnNldCA9IDA7CisJCQljYi0+bmV4dCA9IE5VTEw7CisJCQljYi0+d2FrZV90YXNrbGV0ID0gTlVMTDsKKwkJCWNzLT5vcHMtPndyaXRlX2NtZChjcywgY2IpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQUNUX1JJTkc6CiAJCS8qIGdldCBmcmVzaCBBVCBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIG5ldyBDSUQgKi8KQEAgLTE4NTUsMTkgKzE3NjksMTMgQEAKIAkJCQlnaWdfZGJnKERFQlVHX0VWRU5ULCAiU2NoZWR1bGluZyBQQ19DSURNT0RFIik7CiAJCQkJY3MtPmNvbW1hbmRzX3BlbmRpbmcgPSAxOwogCQkJCXJldHVybjsKLSNpZmRlZiBHSUdfTUFZSU5JVE9ORElBTAogCQkJY2FzZSBNX1VOS05PV046CiAJCQkJc2NoZWR1bGVfaW5pdChjcywgTVNfSU5JVCk7CiAJCQkJcmV0dXJuOwotI2VuZGlmCiAJCQl9CiAJCQliY3MtPmF0X3N0YXRlLnBlbmRpbmdfY29tbWFuZHMgJj0gflBDX0NJRDsKIAkJCWNzLT5jdXJjaGFubmVsID0gYmNzLT5jaGFubmVsOwotI2lmZGVmIEdJR19SRVRSWUNJRAogCQkJY3MtPnJldHJ5X2NvdW50ID0gMjsKLSNlbHNlCi0JCQljcy0+cmV0cnlfY291bnQgPSAxOwotI2VuZGlmCiAJCQlzY2hlZHVsZV9zZXF1ZW5jZShjcywgJmNzLT5hdF9zdGF0ZSwgU0VRX0NJRCk7CiAJCQlyZXR1cm47CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2dpZ2FzZXQuaCBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2dpZ2FzZXQuaAppbmRleCA4NzM4YjA4Li5hNjk1MTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9naWdhc2V0LmgKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZ2lnYXNldC5oCkBAIC00NiwxMyArNDYsNiBAQAogCiAjZGVmaW5lIFJCVUZTSVpFIDgxOTIKIAotLyogY29tcGlsZSB0aW1lIG9wdGlvbnMgKi8KLSNkZWZpbmUgR0lHX01BSk9SIDAKLQotI2RlZmluZSBHSUdfTUFZSU5JVE9ORElBTAotI2RlZmluZSBHSUdfUkVUUllDSUQKLSNkZWZpbmUgR0lHX1g3NQotCiAjZGVmaW5lIEdJR19USUNLIDEwMAkJLyogaW4gbWlsbGlzZWNvbmRzICovCiAKIC8qIHRpbWVvdXQgdmFsdWVzICh1bml0OiAxIHNlYykgKi8KQEAgLTE5Myw5ICsxODYsOCBAQAogLyogdmFyaWFibGVzIGluIHN0cnVjdCBhdF9zdGF0ZV90ICovCiAjZGVmaW5lIFZBUl9aU0FVCTAKICNkZWZpbmUgVkFSX1pETEUJMQotI2RlZmluZSBWQVJfWlZMUwkyCi0jZGVmaW5lIFZBUl9aQ1RQCTMKLSNkZWZpbmUgVkFSX05VTQkJNAorI2RlZmluZSBWQVJfWkNUUAkyCisjZGVmaW5lIFZBUl9OVU0JCTMKIAogI2RlZmluZSBTVFJfTk1CUgkwCiAjZGVmaW5lIFNUUl9aQ1BOCTEKQEAgLTU3NCw5ICs1NjYsNyBAQAogc3RydWN0IGdpZ2FzZXRfb3BzIHsKIAkvKiBDYWxsZWQgZnJvbSBldi1sYXllci5jL2ludGVyZmFjZS5jIGZvciBzZW5kaW5nIEFUIGNvbW1hbmRzIHRvIHRoZQogCSAgIGRldmljZSAqLwotCWludCAoKndyaXRlX2NtZCkoc3RydWN0IGNhcmRzdGF0ZSAqY3MsCi0JCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAotCQkJIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqd2FrZV90YXNrbGV0KTsKKwlpbnQgKCp3cml0ZV9jbWQpKHN0cnVjdCBjYXJkc3RhdGUgKmNzLCBzdHJ1Y3QgY21kYnVmX3QgKmNiKTsKIAogCS8qIENhbGxlZCBmcm9tIGludGVyZmFjZS5jIGZvciBhZGRpdGlvbmFsIGRldmljZSBjb250cm9sICovCiAJaW50ICgqd3JpdGVfcm9vbSkoc3RydWN0IGNhcmRzdGF0ZSAqY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pNGwuYwppbmRleCBmMDFjM2MyLi4zNGJjYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pNGwuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pNGwuYwpAQCAtNDE5LDYgKzQxOSw4IEBACiAJZGV2X2VycihiY3MtPmNzLT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVRfTlVNOyArK2kpCiAJCWtmcmVlKGNvbW1hbmRzW2ldKTsKKwlrZnJlZShjb21tYW5kcyk7CisJZ2lnYXNldF9mcmVlX2NoYW5uZWwoYmNzKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtNjQzLDkgKzY0NSw3IEBACiAJaWlmLT5tYXhidWZzaXplID0gTUFYX0JVRl9TSVpFOwogCWlpZi0+ZmVhdHVyZXMgPSBJU0ROX0ZFQVRVUkVfTDJfVFJBTlMgfAogCQlJU0ROX0ZFQVRVUkVfTDJfSERMQyB8Ci0jaWZkZWYgR0lHX1g3NQogCQlJU0ROX0ZFQVRVUkVfTDJfWDc1SSB8Ci0jZW5kaWYKIAkJSVNETl9GRUFUVVJFX0wzX1RSQU5TIHwKIAkJSVNETl9GRUFUVVJFX1BfRVVSTzsKIAlpaWYtPmhsX2hkcmxlbiA9IEhXX0hEUl9MRU47CQkvKiBBcmVhIGZvciBzdG9yaW5nIGFjayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwppbmRleCBjOWYyOGRkLi5iYjcxMGQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMKQEAgLTMzOSw3ICszMzksOCBAQAogc3RhdGljIGludCBpZl93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgY2FyZHN0YXRlICpjczsKLQlpbnQgcmV0dmFsID0gLUVOT0RFVjsKKwlzdHJ1Y3QgY21kYnVmX3QgKmNiOworCWludCByZXR2YWw7CiAKIAljcyA9IChzdHJ1Y3QgY2FyZHN0YXRlICopIHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKCFjcykgewpAQCAtMzU1LDE4ICszNTYsMzkgQEAKIAlpZiAoIWNzLT5jb25uZWN0ZWQpIHsKIAkJZ2lnX2RiZyhERUJVR19JRiwgIm5vdCBjb25uZWN0ZWQiKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKLQl9IGVsc2UgaWYgKCFjcy0+b3Blbl9jb3VudCkKKwkJZ290byBkb25lOworCX0KKwlpZiAoIWNzLT5vcGVuX2NvdW50KSB7CiAJCWRldl93YXJuKGNzLT5kZXYsICIlczogZGV2aWNlIG5vdCBvcGVuZWRcbiIsIF9fZnVuY19fKTsKLQllbHNlIGlmIChjcy0+bXN0YXRlICE9IE1TX0xPQ0tFRCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChjcy0+bXN0YXRlICE9IE1TX0xPQ0tFRCkgewogCQlkZXZfd2Fybihjcy0+ZGV2LCAiY2FuJ3Qgd3JpdGUgdG8gdW5sb2NrZWQgZGV2aWNlXG4iKTsKIAkJcmV0dmFsID0gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCXJldHZhbCA9IGNzLT5vcHMtPndyaXRlX2NtZChjcywgYnVmLCBjb3VudCwKLQkJCQkJICAgICZjcy0+aWZfd2FrZV90YXNrbGV0KTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoY291bnQgPD0gMCkgeworCQkvKiBub3RoaW5nIHRvIGRvICovCisJCXJldHZhbCA9IDA7CisJCWdvdG8gZG9uZTsKIAl9CiAKLQltdXRleF91bmxvY2soJmNzLT5tdXRleCk7CisJY2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kYnVmX3QpICsgY291bnQsIEdGUF9LRVJORUwpOworCWlmICghY2IpIHsKKwkJZGV2X2Vycihjcy0+ZGV2LCAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KIAorCW1lbWNweShjYi0+YnVmLCBidWYsIGNvdW50KTsKKwljYi0+bGVuID0gY291bnQ7CisJY2ItPm9mZnNldCA9IDA7CisJY2ItPm5leHQgPSBOVUxMOworCWNiLT53YWtlX3Rhc2tsZXQgPSAmY3MtPmlmX3dha2VfdGFza2xldDsKKwlyZXR2YWwgPSBjcy0+b3BzLT53cml0ZV9jbWQoY3MsIGNiKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZjcy0+bXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTY1NSw3ICs2NzcsNiBAQAogCQlnb3RvIGVub21lbTsKIAogCXR0eS0+bWFnaWMgPQkJVFRZX0RSSVZFUl9NQUdJQywKLQl0dHktPm1ham9yID0JCUdJR19NQUpPUiwKIAl0dHktPnR5cGUgPQkJVFRZX0RSSVZFUl9UWVBFX1NFUklBTCwKIAl0dHktPnN1YnR5cGUgPQkJU0VSSUFMX1RZUEVfTk9STUFMLAogCXR0eS0+ZmxhZ3MgPQkJVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9zZXItZ2lnYXNldC5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvc2VyLWdpZ2FzZXQuYwppbmRleCBlOTZjMDU4Li5kMTUxZGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9zZXItZ2lnYXNldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Nlci1naWdhc2V0LmMKQEAgLTI0MSwzMCArMjQxLDEzIEBACiAgKiByZXR1cm4gdmFsdWU6CiAgKgludW1iZXIgb2YgYnl0ZXMgcXVldWVkLCBvciBlcnJvciBjb2RlIDwgMAogICovCi1zdGF0aWMgaW50IGdpZ2FzZXRfd3JpdGVfY21kKHN0cnVjdCBjYXJkc3RhdGUgKmNzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkgICAgIGludCBsZW4sIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqd2FrZV90YXNrbGV0KQorc3RhdGljIGludCBnaWdhc2V0X3dyaXRlX2NtZChzdHJ1Y3QgY2FyZHN0YXRlICpjcywgc3RydWN0IGNtZGJ1Zl90ICpjYikKIHsKLQlzdHJ1Y3QgY21kYnVmX3QgKmNiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlnaWdhc2V0X2RiZ19idWZmZXIoY3MtPm1zdGF0ZSAhPSBNU19MT0NLRUQgPwogCQkJCURFQlVHX1RSQU5TQ01EIDogREVCVUdfTE9DS0NNRCwKLQkJCSAgICJDTUQgVHJhbnNtaXQiLCBsZW4sIGJ1Zik7Ci0KLQlpZiAobGVuIDw9IDApCi0JCXJldHVybiAwOwotCi0JY2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kYnVmX3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWNiKSB7Ci0JCWRldl9lcnIoY3MtPmRldiwgIiVzOiBvdXQgb2YgbWVtb3J5IVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1jcHkoY2ItPmJ1ZiwgYnVmLCBsZW4pOwotCWNiLT5sZW4gPSBsZW47Ci0JY2ItPm9mZnNldCA9IDA7Ci0JY2ItPm5leHQgPSBOVUxMOwotCWNiLT53YWtlX3Rhc2tsZXQgPSB3YWtlX3Rhc2tsZXQ7CisJCQkgICAiQ01EIFRyYW5zbWl0IiwgY2ItPmxlbiwgY2ItPmJ1Zik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmNtZGxvY2ssIGZsYWdzKTsKIAljYi0+cHJldiA9IGNzLT5sYXN0Y21kYnVmOwpAQCAtMjcyLDkgKzI1NSw5IEBACiAJCWNzLT5sYXN0Y21kYnVmLT5uZXh0ID0gY2I7CiAJZWxzZSB7CiAJCWNzLT5jbWRidWYgPSBjYjsKLQkJY3MtPmN1cmxlbiA9IGxlbjsKKwkJY3MtPmN1cmxlbiA9IGNiLT5sZW47CiAJfQotCWNzLT5jbWRieXRlcyArPSBsZW47CisJY3MtPmNtZGJ5dGVzICs9IGNiLT5sZW47CiAJY3MtPmxhc3RjbWRidWYgPSBjYjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+Y21kbG9jaywgZmxhZ3MpOwogCkBAIC0yODIsNyArMjY1LDcgQEAKIAlpZiAoY3MtPmNvbm5lY3RlZCkKIAkJdGFza2xldF9zY2hlZHVsZSgmY3MtPndyaXRlX3Rhc2tsZXQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gY2ItPmxlbjsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jCmluZGV4IDc2ZGJiMjAuLjRhNjYzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYwpAQCAtMzksNyArMzksOCBAQAogI2RlZmluZSBHSUdBU0VUX01PRFVMRU5BTUUgInVzYl9naWdhc2V0IgogI2RlZmluZSBHSUdBU0VUX0RFVk5BTUUgICAgInR0eUdVIgogCi0jZGVmaW5lIElGX1dSSVRFQlVGIDIwMDAJLyogYXJiaXRyYXJ5IGxpbWl0ICovCisvKiBsZW5ndGggbGltaXQgYWNjb3JkaW5nIHRvIFNpZW1lbnMgMzA3MHVzYi1wcm90b2tvbGwuZG9jIGNoLiAyLjEgKi8KKyNkZWZpbmUgSUZfV1JJVEVCVUYgMjY0CiAKIC8qIFZhbHVlcyBmb3IgdGhlIEdpZ2FzZXQgTTEwNSBEYXRhICovCiAjZGVmaW5lIFVTQl9NMTA1X1ZFTkRPUl9JRAkweDA2ODEKQEAgLTQ5MywyOSArNDk0LDEzIEBACiB9CiAKIC8qIFNlbmQgY29tbWFuZCB0byBkZXZpY2UuICovCi1zdGF0aWMgaW50IGdpZ2FzZXRfd3JpdGVfY21kKHN0cnVjdCBjYXJkc3RhdGUgKmNzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkgICAgIGludCBsZW4sIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqd2FrZV90YXNrbGV0KQorc3RhdGljIGludCBnaWdhc2V0X3dyaXRlX2NtZChzdHJ1Y3QgY2FyZHN0YXRlICpjcywgc3RydWN0IGNtZGJ1Zl90ICpjYikKIHsKLQlzdHJ1Y3QgY21kYnVmX3QgKmNiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlnaWdhc2V0X2RiZ19idWZmZXIoY3MtPm1zdGF0ZSAhPSBNU19MT0NLRUQgPwogCQkJICAgICBERUJVR19UUkFOU0NNRCA6IERFQlVHX0xPQ0tDTUQsCi0JCQkgICAiQ01EIFRyYW5zbWl0IiwgbGVuLCBidWYpOwotCi0JaWYgKGxlbiA8PSAwKQotCQlyZXR1cm4gMDsKLQljYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRidWZfdCkgKyBsZW4sIEdGUF9BVE9NSUMpOwotCWlmICghY2IpIHsKLQkJZGV2X2Vycihjcy0+ZGV2LCAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtY3B5KGNiLT5idWYsIGJ1ZiwgbGVuKTsKLQljYi0+bGVuID0gbGVuOwotCWNiLT5vZmZzZXQgPSAwOwotCWNiLT5uZXh0ID0gTlVMTDsKLQljYi0+d2FrZV90YXNrbGV0ID0gd2FrZV90YXNrbGV0OworCQkJICAgIkNNRCBUcmFuc21pdCIsIGNiLT5sZW4sIGNiLT5idWYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5jbWRsb2NrLCBmbGFncyk7CiAJY2ItPnByZXYgPSBjcy0+bGFzdGNtZGJ1ZjsKQEAgLTUyMyw5ICs1MDgsOSBAQAogCQljcy0+bGFzdGNtZGJ1Zi0+bmV4dCA9IGNiOwogCWVsc2UgewogCQljcy0+Y21kYnVmID0gY2I7Ci0JCWNzLT5jdXJsZW4gPSBsZW47CisJCWNzLT5jdXJsZW4gPSBjYi0+bGVuOwogCX0KLQljcy0+Y21kYnl0ZXMgKz0gbGVuOworCWNzLT5jbWRieXRlcyArPSBjYi0+bGVuOwogCWNzLT5sYXN0Y21kYnVmID0gY2I7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmNtZGxvY2ssIGZsYWdzKTsKIApAQCAtNTMzLDcgKzUxOCw3IEBACiAJaWYgKGNzLT5jb25uZWN0ZWQpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJmNzLT53cml0ZV90YXNrbGV0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBsZW47CisJcmV0dXJuIGNiLT5sZW47CiB9CiAKIHN0YXRpYyBpbnQgZ2lnYXNldF93cml0ZV9yb29tKHN0cnVjdCBjYXJkc3RhdGUgKmNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKaW5kZXggZjQxMGQwZS4uMDliMTc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CkBAIC03Niw5ICs3NSw4IEBACiB7CiAKICAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KLSAgICBwX2Rldi0+aW8uTnVtUG9ydHMxID0gMTY7Ci0gICAgcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0gICAgcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisgICAgcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSAxNjsKKyAgICBwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCiAgICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLwogICAgIHBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CkBAIC0xMjAsMTMgKzExOCw5IEBACiAJaWYgKGNmLT5pby5ud2luIDw9IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2YtPmlvLndpblswXS5sZW47Ci0JcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYXZtX2NzOiB0ZXN0aW5nIGkvbyAlI3gtJSN4XG4iLAotCSAgICAgICBwX2Rldi0+aW8uQmFzZVBvcnQxLAotCSAgICAgICBwX2Rldi0+aW8uQmFzZVBvcnQxK3BfZGV2LT5pby5OdW1Qb3J0czEtMSk7Ci0JcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gY2YtPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2YtPmlvLndpblswXS5sZW47CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIGludCBhdm1jc19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCkBAIC0xOTIsOSArMTg2LDEwIEBACiAJZGVmYXVsdDoKICAgICAgICAgY2FzZSBBVk1fQ0FSRFRZUEVfQjE6IGFkZGNhcmQgPSBiMXBjbWNpYV9hZGRjYXJkX2IxOyBicmVhazsKICAgICB9Ci0gICAgaWYgKChpID0gKCphZGRjYXJkKShsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlycSkpIDwgMCkgewotCSAgICBkZXZfZXJyKCZsaW5rLT5kZXYsICJhdm1fY3M6IGZhaWxlZCB0byBhZGQgQVZNLUNvbnRyb2xsZXIgYXQgaS9vICUjeCwgaXJxICVkXG4iLAotCQkgICAgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEpOworICAgIGlmICgoaSA9ICgqYWRkY2FyZCkobGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LCBsaW5rLT5pcnEpKSA8IDApIHsKKwkgICAgZGV2X2VycigmbGluay0+ZGV2LAorCQkgICAgImF2bV9jczogZmFpbGVkIHRvIGFkZCBBVk0tQ29udHJvbGxlciBhdCBpL28gJSN4LCBpcnEgJWRcbiIsCisJCSAgICAodW5zaWduZWQgaW50KSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQsIGxpbmstPmlycSk7CiAJICAgIGF2bWNzX3JlbGVhc2UobGluayk7CiAJICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KQEAgLTIxMiw3ICsyMDcsNyBAQAogCiBzdGF0aWMgdm9pZCBhdm1jc19yZWxlYXNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewotCWIxcGNtY2lhX2RlbGNhcmQobGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEpOworCWIxcGNtY2lhX2RlbGNhcmQobGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LCBsaW5rLT5pcnEpOwogCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKIH0gLyogYXZtY3NfcmVsZWFzZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGl2YW1udC5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFtbnQuYwppbmRleCAxZTg1Zjc0Li5mMWQ0NjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGl2YW1udC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaXZhbW50LmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJkaXZhc3luYy5oIgogI2luY2x1ZGUgImRlYnVnX2lmLmgiCiAKK3N0YXRpYyBERUZJTkVfTVVURVgobWFpbnRfbXV0ZXgpOwogc3RhdGljIGNoYXIgKm1haW5fcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjMyLjYuMTAgJCI7CiAKIHN0YXRpYyBpbnQgbWFqb3I7CkBAIC0xMzAsNyArMTMxLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZtYWludF9tdXRleCk7CiAJLyogb25seSBvbmUgb3BlbiBpcyBhbGxvd2VkLCBzbyB3ZSB0ZXN0CiAJICAgaXQgYXRvbWljYWxseSAqLwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZvcGVuZWQpKQpAQCAtMTM5LDcgKzE0MCw3IEBACiAJCWZpbGVwLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCQlyZXQgPSBub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZtYWludF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzaS5jCmluZGV4IGY1Nzc3MTkuLjQyZDNiODM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGl2YXNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzaS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKQEAgLTQwMiw3ICs0MDEsNiBAQAogCiBzdGF0aWMgaW50IHVtX2lkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWN5Y2xlX2tlcm5lbF9sb2NrKCk7CiAJcmV0dXJuICgwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzbWFpbi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzbWFpbi5jCmluZGV4IGZiYmNiMjcuLmVkOWM1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaXZhc21haW4uYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGl2YXNtYWluLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKICN1bmRlZiBJRF9NQVNLCkBAIC0xMTMsNDEgKzExMiw0MCBAQAogICBUaGlzIHRhYmxlIHNob3VsZCBiZSBzb3J0ZWQgYnkgUENJIGRldmljZSBJRAogICAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRpdmFzX3BjaV90YmxbXSA9IHsKLS8qIERpdmEgU2VydmVyIEJSSS0yTSBQQ0kgMHhFMDEwICovCi0Je1BDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0FSRFRZUEVfTUFFU1RSQV9QQ0l9LAotLyogRGl2YSBTZXJ2ZXIgNEJSSS04TSBQQ0kgMHhFMDEyICovCi0Je1BDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENBUkRUWVBFX0RJVkFTUlZfUV84TV9QQ0l9LAotLyogRGl2YSBTZXJ2ZXIgNEJSSS04TSAyLjAgUENJIDB4RTAxMyAqLwotCXtQQ0lfVkVORE9SX0lEX0VJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkFRX1UsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENBUkRUWVBFX0RJVkFTUlZfUV84TV9WMl9QQ0l9LAotLyogRGl2YSBTZXJ2ZXIgUFJJLTMwTSBQQ0kgMHhFMDE0ICovCi0Je1BDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENBUkRUWVBFX0RJVkFTUlZfUF8zME1fUENJfSwKLS8qIERpdmEgU2VydmVyIFBSSSAyLjAgYWRhcHRlciAweEUwMTUgKi8KLQl7UENJX1ZFTkRPUl9JRF9FSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl9NQUVTVFJBUF8yLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDQVJEVFlQRV9ESVZBU1JWX1BfMzBNX1YyX1BDSX0sCi0vKiBEaXZhIFNlcnZlciBWb2ljZSA0QlJJLThNIFBDSSAweEUwMTYgKi8KLQl7UENJX1ZFTkRPUl9JRF9FSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl80QlJJX1ZPSVAsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENBUkRUWVBFX0RJVkFTUlZfVk9JQ0VfUV84TV9QQ0l9LAotLyogRGl2YSBTZXJ2ZXIgVm9pY2UgNEJSSS04TSAyLjAgUENJIDB4RTAxNyAqLwotCXtQQ0lfVkVORE9SX0lEX0VJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OXzRCUklfMl9WT0lQLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDQVJEVFlQRV9ESVZBU1JWX1ZPSUNFX1FfOE1fVjJfUENJfSwKLS8qIERpdmEgU2VydmVyIEJSSS0yTSAyLjAgUENJIDB4RTAxOCAqLwotCXtQQ0lfVkVORE9SX0lEX0VJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OX0JSSTJNXzIsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENBUkRUWVBFX0RJVkFTUlZfQl8yTV9WMl9QQ0l9LAotLyogRGl2YSBTZXJ2ZXIgVm9pY2UgUFJJIDIuMCBQQ0kgMHhFMDE5ICovCi0Je1BDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVBfMl9WT0lQLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAotCSBDQVJEVFlQRV9ESVZBU1JWX1ZPSUNFX1BfMzBNX1YyX1BDSX0sCi0vKiBEaXZhIFNlcnZlciAyRlggMHhFMDFBICovCi0Je1BDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fMkYsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENBUkRUWVBFX0RJVkFTUlZfQl8yRl9QQ0l9LAotLyogRGl2YSBTZXJ2ZXIgVm9pY2UgQlJJLTJNIDIuMCBQQ0kgMHhFMDFCICovCi0Je1BDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fQlJJMk1fMl9WT0lQLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDQVJEVFlQRV9ESVZBU1JWX1ZPSUNFX0JfMk1fVjJfUENJfSwKLQl7MCx9CQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCisJLyogRGl2YSBTZXJ2ZXIgQlJJLTJNIFBDSSAweEUwMTAgKi8KKwl7IFBDSV9WREVWSUNFKEVJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkEpLAorCQlDQVJEVFlQRV9NQUVTVFJBX1BDSSB9LAorCS8qIERpdmEgU2VydmVyIDRCUkktOE0gUENJIDB4RTAxMiAqLworCXsgUENJX1ZERVZJQ0UoRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVEpLAorCQlDQVJEVFlQRV9ESVZBU1JWX1FfOE1fUENJIH0sCisJLyogRGl2YSBTZXJ2ZXIgNEJSSS04TSAyLjAgUENJIDB4RTAxMyAqLworCXsgUENJX1ZERVZJQ0UoRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVFfVSksCisJCUNBUkRUWVBFX0RJVkFTUlZfUV84TV9WMl9QQ0kgfSwKKwkvKiBEaXZhIFNlcnZlciBQUkktMzBNIFBDSSAweEUwMTQgKi8KKwl7IFBDSV9WREVWSUNFKEVJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkFQKSwKKwkJQ0FSRFRZUEVfRElWQVNSVl9QXzMwTV9QQ0kgfSwKKwkvKiBEaXZhIFNlcnZlciBQUkkgMi4wIGFkYXB0ZXIgMHhFMDE1ICovCisJeyBQQ0lfVkRFVklDRShFSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl9NQUVTVFJBUF8yKSwKKwkJQ0FSRFRZUEVfRElWQVNSVl9QXzMwTV9WMl9QQ0kgfSwKKwkvKiBEaXZhIFNlcnZlciBWb2ljZSA0QlJJLThNIFBDSSAweEUwMTYgKi8KKwl7IFBDSV9WREVWSUNFKEVJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OXzRCUklfVk9JUCksCisJCUNBUkRUWVBFX0RJVkFTUlZfVk9JQ0VfUV84TV9QQ0kgfSwKKwkvKiBEaXZhIFNlcnZlciBWb2ljZSA0QlJJLThNIDIuMCBQQ0kgMHhFMDE3ICovCisJeyBQQ0lfVkRFVklDRShFSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl80QlJJXzJfVk9JUCksCisJCUNBUkRUWVBFX0RJVkFTUlZfVk9JQ0VfUV84TV9WMl9QQ0kgfSwKKwkvKiBEaXZhIFNlcnZlciBCUkktMk0gMi4wIFBDSSAweEUwMTggKi8KKwl7IFBDSV9WREVWSUNFKEVJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OX0JSSTJNXzIpLAorCQlDQVJEVFlQRV9ESVZBU1JWX0JfMk1fVjJfUENJIH0sCisJLyogRGl2YSBTZXJ2ZXIgVm9pY2UgUFJJIDIuMCBQQ0kgMHhFMDE5ICovCisJeyBQQ0lfVkRFVklDRShFSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl9NQUVTVFJBUF8yX1ZPSVApLAorCQlDQVJEVFlQRV9ESVZBU1JWX1ZPSUNFX1BfMzBNX1YyX1BDSSB9LAorCS8qIERpdmEgU2VydmVyIDJGWCAweEUwMUEgKi8KKwl7IFBDSV9WREVWSUNFKEVJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OXzJGKSwKKwkJQ0FSRFRZUEVfRElWQVNSVl9CXzJGX1BDSSB9LAorCS8qIERpdmEgU2VydmVyIFZvaWNlIEJSSS0yTSAyLjAgUENJIDB4RTAxQiAqLworCXsgUENJX1ZERVZJQ0UoRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fQlJJMk1fMl9WT0lQKSwKKwkJQ0FSRFRZUEVfRElWQVNSVl9WT0lDRV9CXzJNX1YyX1BDSSB9LAorCXsgMCwgfQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkaXZhc19wY2lfdGJsKTsKIApAQCAtNTgxLDcgKzU3OSw2IEBACiAgKi8KIHN0YXRpYyBpbnQgZGl2YXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQljeWNsZV9rZXJuZWxfbG9jaygpOwogCXJldHVybiAoMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKaW5kZXggZDQyMTUzNi4uNDcyYTJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKQEAgLTExMTYsNyArMTExNiw3IEBACiAJCXJlbGVhc2VfY2FyZChjYXJkKTsKIAllbHNlCiAJCWlmIChkZWJ1ZykKLQkJCXByX2luZm8oIiVzOiBkcnZkYXRhIGFsbHJlYWR5IHJlbW92ZWRcbiIsIF9fZnVuY19fKTsKKwkJCXByX2luZm8oIiVzOiBkcnZkYXRhIGFscmVhZHkgcmVtb3ZlZFxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZmNwY2lfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKaW5kZXggMDk1ZWQ3Ni4uNGUzNzgwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKQEAgLTQyNjgsNyArNDI2OCw3IEBACiAJCWdvdG8gZXJyb3I7CiAJLyoKIAkgKiBGaW5hbGx5IGVuYWJsZSBJUlEgb3V0cHV0Ci0JICogdGhpcyBpcyBvbmx5IGFsbG93ZWQsIGlmIGFuIElSUSByb3V0aW5lIGlzIGFsbHJlYWR5CisJICogdGhpcyBpcyBvbmx5IGFsbG93ZWQsIGlmIGFuIElSUSByb3V0aW5lIGlzIGFscmVhZHkKIAkgKiBlc3RhYmxpc2hlZCBmb3IgdGhpcyBIRkMsIHNvIGRvbid0IGRvIHRoYXQgZWFybGllcgogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYy0+bG9jaywgZmxhZ3MpOwpAQCAtNTIxMiw3ICs1MjEyLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSEZDbG9jaywgZmxhZ3MpOwogCX0gIGVsc2UgewogCQlpZiAoZGVidWcpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRydmRhdGEgYWxscmVhZHkgcmVtb3ZlZFxuIiwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZHJ2ZGF0YSBhbHJlYWR5IHJlbW92ZWRcbiIsCiAJCQkgICAgX19mdW5jX18pOwogCX0KIH0KQEAgLTUzNTQsMTIgKzUzNTQsOSBAQAogCXsgUENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0hGQ0UxLCBQQ0lfVkVORE9SX0lEX0NDRCwKIAkJUENJX1NVQkRFVklDRV9JRF9DQ0RfSkhTRTEsIDAsIDAsIEgoMjUpfSwgLyogSnVuZ2hhbm5zIEUxICovCiAKLQl7IFBDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9IRkM0UywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfSEZDOFMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0hGQ0UxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLCAwfSwKKwl7IFBDSV9WREVWSUNFKENDRCwgUENJX0RFVklDRV9JRF9DQ0RfSEZDNFMpLCAwIH0sCisJeyBQQ0lfVkRFVklDRShDQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0hGQzhTKSwgMCB9LAorCXsgUENJX1ZERVZJQ0UoQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9IRkNFMSksIDAgfSwKIAl7MCwgfQogfTsKICN1bmRlZiBICmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjcGNpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjcGNpLmMKaW5kZXggNTk0MGEyYy4uMTVkMzIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3BjaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYwpAQCAtMTc3Myw3ICsxNzczLDcgQEAKIAkJaW5pdGhmY3BjaShoYyk7CiAJCS8qCiAJCSAqIEZpbmFsbHkgZW5hYmxlIElSUSBvdXRwdXQKLQkJICogdGhpcyBpcyBvbmx5IGFsbG93ZWQsIGlmIGFuIElSUSByb3V0aW5lIGlzIGFsbHJlYWR5CisJCSAqIHRoaXMgaXMgb25seSBhbGxvd2VkLCBpZiBhbiBJUlEgcm91dGluZSBpcyBhbHJlYWR5CiAJCSAqIGVzdGFibGlzaGVkIGZvciB0aGlzIEhGQywgc28gZG9uJ3QgZG8gdGhhdCBlYXJsaWVyCiAJCSAqLwogCQllbmFibGVfaHdpcnEoaGMpOwpAQCAtMjE4OCw1MiArMjE4OCw1MiBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaGZjX2lkc1tdID0KIHsKLQl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEXzJCRDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFswXX0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDAwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMV19LAotCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwNiwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzJdfSwKLQl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDcsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFszXX0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDA4LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbNF19LAotCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwOSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzVdfSwKLQl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEEsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFs2XX0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDBCLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbN119LAotCXtQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwQywKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzhdfSwKLQl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IxMDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFs5XX0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CNzAwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMTBdfSwKLQl7UENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0I3MDEsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxMV19LAotCXtQQ0lfVkVORE9SX0lEX0FCT0NPTSwgUENJX0RFVklDRV9JRF9BQk9DT01fMkJEMSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzEyXX0sCi0Je1BDSV9WRU5ET1JfSURfQVNVU1RFSywgUENJX0RFVklDRV9JRF9BU1VTVEVLXzA2NzUsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxM119LAotCXtQQ0lfVkVORE9SX0lEX0JFUktPTSwgUENJX0RFVklDRV9JRF9CRVJLT01fVF9DT05DRVBULAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMTRdfSwKLQl7UENJX1ZFTkRPUl9JRF9CRVJLT00sIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzE1XX0sCi0Je1BDSV9WRU5ET1JfSURfQU5JR01BLCBQQ0lfREVWSUNFX0lEX0FOSUdNQV9NQzE0NTU3NSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzE2XX0sCi0Je1BDSV9WRU5ET1JfSURfWk9MVFJJWCwgUENJX0RFVklDRV9JRF9aT0xUUklYXzJCRDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxN119LAotCXtQQ0lfVkVORE9SX0lEX0RJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfRSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzE4XX0sCi0Je1BDSV9WRU5ET1JfSURfRElHSSwgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fRSwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzE5XX0sCi0Je1BDSV9WRU5ET1JfSURfRElHSSwgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fSU9NMl9BLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMjBdfSwKLQl7UENJX1ZFTkRPUl9JRF9ESUdJLCBQQ0lfREVWSUNFX0lEX0RJR0lfREZfTV9BLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMjFdfSwKLQl7UENJX1ZFTkRPUl9JRF9TSVRFQ09NLCBQQ0lfREVWSUNFX0lEX1NJVEVDT01fREMxMDVWMiwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzIyXX0sCisJeyBQQ0lfVkRFVklDRShDQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEXzJCRDApLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMF0gfSwKKwl7IFBDSV9WREVWSUNFKENDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwMCksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxXSB9LAorCXsgUENJX1ZERVZJQ0UoQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDA2KSwKKwkJKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzJdIH0sCisJeyBQQ0lfVkRFVklDRShDQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDcpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbM10gfSwKKwl7IFBDSV9WREVWSUNFKENDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwOCksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFs0XSB9LAorCXsgUENJX1ZERVZJQ0UoQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDA5KSwKKwkJKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzVdIH0sCisJeyBQQ0lfVkRFVklDRShDQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEEpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbNl0gfSwKKwl7IFBDSV9WREVWSUNFKENDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjAwQiksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFs3XSB9LAorCXsgUENJX1ZERVZJQ0UoQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9CMDBDKSwKKwkJKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzhdIH0sCisJeyBQQ0lfVkRFVklDRShDQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0IxMDApLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbOV0gfSwKKwl7IFBDSV9WREVWSUNFKENDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjcwMCksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxMF0gfSwKKwl7IFBDSV9WREVWSUNFKENDRCwgUENJX0RFVklDRV9JRF9DQ0RfQjcwMSksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxMV0gfSwKKwl7IFBDSV9WREVWSUNFKEFCT0NPTSwgUENJX0RFVklDRV9JRF9BQk9DT01fMkJEMSksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxMl0gfSwKKwl7IFBDSV9WREVWSUNFKEFTVVNURUssIFBDSV9ERVZJQ0VfSURfQVNVU1RFS18wNjc1KSwKKwkJKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzEzXSB9LAorCXsgUENJX1ZERVZJQ0UoQkVSS09NLCBQQ0lfREVWSUNFX0lEX0JFUktPTV9UX0NPTkNFUFQpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMTRdIH0sCisJeyBQQ0lfVkRFVklDRShCRVJLT00sIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVCksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxNV0gfSwKKwl7IFBDSV9WREVWSUNFKEFOSUdNQSwgUENJX0RFVklDRV9JRF9BTklHTUFfTUMxNDU1NzUpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMTZdIH0sCisJeyBQQ0lfVkRFVklDRShaT0xUUklYLCBQQ0lfREVWSUNFX0lEX1pPTFRSSVhfMkJEMCksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxN10gfSwKKwl7IFBDSV9WREVWSUNFKERJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfRSksCisJCSh1bnNpZ25lZCBsb25nKSAmaGZjX21hcFsxOF0gfSwKKwl7IFBDSV9WREVWSUNFKERJR0ksIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0UpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMTldIH0sCisJeyBQQ0lfVkRFVklDRShESUdJLCBQQ0lfREVWSUNFX0lEX0RJR0lfREZfTV9JT00yX0EpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMjBdIH0sCisJeyBQQ0lfVkRFVklDRShESUdJLCBQQ0lfREVWSUNFX0lEX0RJR0lfREZfTV9BKSwKKwkJKHVuc2lnbmVkIGxvbmcpICZoZmNfbWFwWzIxXSB9LAorCXsgUENJX1ZERVZJQ0UoU0lURUNPTSwgUENJX0RFVklDRV9JRF9TSVRFQ09NX0RDMTA1VjIpLAorCQkodW5zaWduZWQgbG9uZykgJmhmY19tYXBbMjJdIH0sCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pbmZpbmVvbi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaW5maW5lb24uYwppbmRleCBmNWIzZDJiLi5kMmRkNjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pbmZpbmVvbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmluZmluZW9uLmMKQEAgLTEyNSwzNiArMTI1LDI1IEBACiAjZGVmaW5lIFBDSV9TVUJfSURfU0VETEJBVUVSICAgICAgICAgICAgMHgwMQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW5maW5lb25faWRzW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX0RJVkEyMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0VJQ09OLCBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMF9VLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX0RJVkEyMFV9LAotCXsgUENJX1ZFTkRPUl9JRF9FSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAxLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX0RJVkEyMDF9LAotCXsgUENJX1ZFTkRPUl9JRF9FSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAyLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX0RJVkEyMDJ9LAorCXsgUENJX1ZERVZJQ0UoRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwKSwgSU5GX0RJVkEyMCB9LAorCXsgUENJX1ZERVZJQ0UoRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwX1UpLCBJTkZfRElWQTIwVSB9LAorCXsgUENJX1ZERVZJQ0UoRUlDT04sIFBDSV9ERVZJQ0VfSURfRUlDT05fRElWQTIwMSksIElORl9ESVZBMjAxIH0sCisJeyBQQ0lfVkRFVklDRShFSUNPTiwgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAyKSwgSU5GX0RJVkEyMDIgfSwKIAl7IFBDSV9WRU5ET1JfSURfVElHRVJKRVQsIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMTAwLAogCSAgUENJX1NVQlZFTkRPUl9TRURMQkFVRVJfUENJLCBQQ0lfU1VCX0lEX1NFRExCQVVFUiwgMCwgMCwKLQkgIElORl9TUEVFRFdJTn0sCisJICBJTkZfU1BFRURXSU4gfSwKIAl7IFBDSV9WRU5ET1JfSURfVElHRVJKRVQsIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMTAwLAotCSAgUENJX1NVQlZFTkRPUl9IU1RfU0FQSElSMywgUENJX1NVQl9JRF9TRURMQkFVRVIsIDAsIDAsIElORl9TQVBISVIzfSwKLQl7IFBDSV9WRU5ET1JfSURfRUxTQSwgUENJX0RFVklDRV9JRF9FTFNBX01JQ1JPTElOSywKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElORl9RUzEwMDB9LAotCXsgUENJX1ZFTkRPUl9JRF9FTFNBLCBQQ0lfREVWSUNFX0lEX0VMU0FfUVMzMDAwLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX1FTMzAwMH0sCi0JeyBQQ0lfVkVORE9SX0lEX1NBVFNBR0VNLCBQQ0lfREVWSUNFX0lEX1NBVFNBR0VNX05JQ0NZLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX05JQ0NZfSwKKwkgIFBDSV9TVUJWRU5ET1JfSFNUX1NBUEhJUjMsIFBDSV9TVUJfSURfU0VETEJBVUVSLCAwLCAwLCBJTkZfU0FQSElSMyB9LAorCXsgUENJX1ZERVZJQ0UoRUxTQSwgUENJX0RFVklDRV9JRF9FTFNBX01JQ1JPTElOSyksIElORl9RUzEwMDAgfSwKKwl7IFBDSV9WREVWSUNFKEVMU0EsIFBDSV9ERVZJQ0VfSURfRUxTQV9RUzMwMDApLCBJTkZfUVMzMDAwIH0sCisJeyBQQ0lfVkRFVklDRShTQVRTQUdFTSwgUENJX0RFVklDRV9JRF9TQVRTQUdFTV9OSUNDWSksIElORl9OSUNDWSB9LAogCXsgUENJX1ZFTkRPUl9JRF9QTFgsIFBDSV9ERVZJQ0VfSURfUExYXzkwNTAsCiAJICBQQ0lfVkVORE9SX0lEX0JFUktPTSwgUENJX0RFVklDRV9JRF9CRVJLT01fU0NJVEVMX1FVQURSTywgMCwgMCwKLQkgIElORl9TQ1RfMX0sCi0JeyBQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfUjY4NSwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElORl9HQVpFTF9SNjg1fSwKLQl7IFBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF9SNzUzLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX0dBWkVMX1I3NTN9LAotCXsgUENJX1ZFTkRPUl9JRF9QTFgsIFBDSV9ERVZJQ0VfSURfUExYX0RKSU5OX0lUT08sCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJTkZfR0FaRUxfUjc1M30sCi0JeyBQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfT0xJVEVDLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5GX0dBWkVMX1I3NTN9LAorCSAgSU5GX1NDVF8xIH0sCisJeyBQQ0lfVkRFVklDRShQTFgsIFBDSV9ERVZJQ0VfSURfUExYX1I2ODUpLCBJTkZfR0FaRUxfUjY4NSB9LAorCXsgUENJX1ZERVZJQ0UoUExYLCBQQ0lfREVWSUNFX0lEX1BMWF9SNzUzKSwgSU5GX0dBWkVMX1I3NTMgfSwKKwl7IFBDSV9WREVWSUNFKFBMWCwgUENJX0RFVklDRV9JRF9QTFhfREpJTk5fSVRPTyksIElORl9HQVpFTF9SNzUzIH0sCisJeyBQQ0lfVkRFVklDRShQTFgsIFBDSV9ERVZJQ0VfSURfUExYX09MSVRFQyksIElORl9HQVpFTF9SNzUzIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGluZmluZW9uX2lkcyk7CkBAIC0xMTUwLDcgKzExMzksNyBAQAogCWlmIChjYXJkKQogCQlyZWxlYXNlX2NhcmQoY2FyZCk7CiAJZWxzZQotCQlwcl9kZWJ1ZygiJXM6IGRydmRhdGEgYWxscmVhZHkgcmVtb3ZlZFxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IGRydmRhdGEgYWxyZWFkeSByZW1vdmVkXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpbmZpbmVvbl9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vc3BlZWRmYXguYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9zcGVlZGZheC5jCmluZGV4IGQwOTdhNGUuLjllMDcyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9zcGVlZGZheC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9zcGVlZGZheC5jCkBAIC00ODQsNyArNDg0LDcgQEAKIAlpZiAoY2FyZCkKIAkJcmVsZWFzZV9jYXJkKGNhcmQpOwogCWVsc2UKLQkJcHJfZGVidWcoIiVzOiBkcnZkYXRhIGFsbHJlYWR5IHJlbW92ZWRcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBkcnZkYXRhIGFscmVhZHkgcmVtb3ZlZFxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2ZheHBjaV9pZHNbXSBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYwppbmRleCAzMWY5ZDcxLi45ZTg0ODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYwpAQCAtMTQwMiw3ICsxNDAyLDcgQEAKIAkJcmVsZWFzZV9jYXJkKGNhcmQpOwogCWVsc2UKIAkJaWYgKGRlYnVnKQotCQkJcHJfbm90aWNlKCIlczogZHJ2ZGF0YSBhbGxyZWFkeSByZW1vdmVkXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9ub3RpY2UoIiVzOiBkcnZkYXRhIGFscmVhZHkgcmVtb3ZlZFxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdzY2OTJfaWRzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jCmluZGV4IGE4MGE3NjEuLjk0MjYzYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpAQCAtNzksMTEgKzc4LDEwIEBACiAgICAgZGV2X2RiZygmcF9kZXYtPmRldiwgImF2bWExY3NfYXR0YWNoKClcbiIpOwogCiAgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCi0gICAgcF9kZXYtPmlvLk51bVBvcnRzMSA9IDE2OwotICAgIHBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotICAgIHBfZGV2LT5pby5OdW1Qb3J0czIgPSAxNjsKLSAgICBwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0gICAgcF9kZXYtPmlvLklPQWRkckxpbmVzID0gNTsKKyAgICBwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IDE2OworICAgIHBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisgICAgcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAxNjsKKyAgICBwX2Rldi0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKIAogICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KICAgICBwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwpAQCAtMTI3LDEzICsxMjUsMTAgQEAKIAlpZiAoY2YtPmlvLm53aW4gPD0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBjZi0+aW8ud2luWzBdLmxlbjsKLQlwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKLQlwcmludGsoS0VSTl9JTkZPICJhdm1hMV9jczogdGVzdGluZyBpL28gJSN4LSUjeFxuIiwKLQkgICAgICAgcF9kZXYtPmlvLkJhc2VQb3J0MSwKLQkgICAgICAgcF9kZXYtPmlvLkJhc2VQb3J0MStwX2Rldi0+aW8uTnVtUG9ydHMxLTEpOwotCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CisJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGNmLT5pby53aW5bMF0ubGVuOworCXBfZGV2LT5pb19saW5lcyA9IDU7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogCkBAIC0xODEsMTYgKzE3NiwxOCBAQAogICAgIH0KIAogICAgIHByaW50ayhLRVJOX05PVElDRSAiYXZtYTFfY3M6IGNoZWNraW5nIGF0IGkvbyAlI3gsIGlycSAlZFxuIiwKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlycSk7CisJCSh1bnNpZ25lZCBpbnQpIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgbGluay0+aXJxKTsKIAogICAgIGljYXJkLnBhcmFbMF0gPSBsaW5rLT5pcnE7Ci0gICAgaWNhcmQucGFyYVsxXSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpY2FyZC5wYXJhWzFdID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogICAgIGljYXJkLnByb3RvY29sID0gaXNkbnByb3Q7CiAgICAgaWNhcmQudHlwID0gSVNETl9DVFlQRV9BMV9QQ01DSUE7CiAgICAgCiAgICAgaSA9IGhpc2F4X2luaXRfcGNtY2lhKGxpbmssICZidXN5LCAmaWNhcmQpOwogICAgIGlmIChpIDwgMCkgewotICAgIAlwcmludGsoS0VSTl9FUlIgImF2bWExX2NzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBBVk0gQTEgUENNQ0lBICVkIGF0IGkvbyAlI3hcbiIsIGksIGxpbmstPmlvLkJhc2VQb3J0MSk7CisJcHJpbnRrKEtFUk5fRVJSICJhdm1hMV9jczogZmFpbGVkIHRvIGluaXRpYWxpemUgQVZNIEExICIKKwkJCSJQQ01DSUEgJWQgYXQgaS9vICUjeFxuIiwgaSwKKwkJCSh1bnNpZ25lZCBpbnQpIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCk7CiAJYXZtYTFjc19yZWxlYXNlKGxpbmspOwogCXJldHVybiAtRU5PREVWOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9jYWxsYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2NhbGxjLmMKaW5kZXggZjU4ZGVkOC4uZjE1MDMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2NhbGxjLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2NhbGxjLmMKQEAgLTExNzIsNyArMTE3Miw3IEBACiAJCQlrZnJlZShjc3RhLT5jaGFubmVsW2ldLmJfc3QpOwogCQkJY3N0YS0+Y2hhbm5lbFtpXS5iX3N0ID0gTlVMTDsKIAkJfSBlbHNlCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYWxsY0ZyZWVDaGFuIGJfc3QgY2glZCBhbGxyZWFkeSBmcmVlZFxuIiwgaSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYWxsY0ZyZWVDaGFuIGJfc3QgY2glZCBhbHJlYWR5IGZyZWVkXG4iLCBpKTsKIAkJaWYgKGkgfHwgdGVzdF9iaXQoRkxHX1RXT19EQ0hBTiwgJmNzdGEtPkhXX0ZsYWdzKSkgewogCQkJcmVsZWFzZV9kX3N0KGNzdGEtPmNoYW5uZWwgKyBpKTsKIAkJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKaW5kZXggNTQ0Y2Y0Yi4uNmY5YWZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYwpAQCAtMTkwOSw2OCArMTkwOSw2OCBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaGlzYXhfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAjaWZkZWYgQ09ORklHX0hJU0FYX0ZSSVRaUENJCi0Je1BDSV9WRU5ET1JfSURfQVZNLCAgICAgIFBDSV9ERVZJQ0VfSURfQVZNX0ExLCAgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCisJe1BDSV9WREVWSUNFKEFWTSwgICAgICBQQ0lfREVWSUNFX0lEX0FWTV9BMSkJCQl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJU0FYX0RJRUhMRElWQQotCXtQQ0lfVkVORE9SX0lEX0VJQ09OLCAgICBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMCwgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAotCXtQQ0lfVkVORE9SX0lEX0VJQ09OLCAgICBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMF9VLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAotCXtQQ0lfVkVORE9SX0lEX0VJQ09OLCAgICBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMDEsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwkKLQl7UENJX1ZFTkRPUl9JRF9FSUNPTiwgICAgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAyLCAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMJCisJe1BDSV9WREVWSUNFKEVJQ09OLCAgICBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMCkJCX0sCisJe1BDSV9WREVWSUNFKEVJQ09OLCAgICBQQ0lfREVWSUNFX0lEX0VJQ09OX0RJVkEyMF9VKQl9LAorCXtQQ0lfVkRFVklDRShFSUNPTiwgICAgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAxKQkJfSwKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCXtQQ0lfVkRFVklDRShFSUNPTiwgICAgUENJX0RFVklDRV9JRF9FSUNPTl9ESVZBMjAyKQkJfSwKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJU0FYX0VMU0EKLQl7UENJX1ZFTkRPUl9JRF9FTFNBLCAgICAgUENJX0RFVklDRV9JRF9FTFNBX01JQ1JPTElOSywgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKLQl7UENJX1ZFTkRPUl9JRF9FTFNBLCAgICAgUENJX0RFVklDRV9JRF9FTFNBX1FTMzAwMCwgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZERVZJQ0UoRUxTQSwgICAgIFBDSV9ERVZJQ0VfSURfRUxTQV9NSUNST0xJTkspCX0sCisJe1BDSV9WREVWSUNFKEVMU0EsICAgICBQQ0lfREVWSUNFX0lEX0VMU0FfUVMzMDAwKQkJfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19ISVNBWF9HQVpFTAotCXtQQ0lfVkVORE9SX0lEX1BMWCwgICAgICBQQ0lfREVWSUNFX0lEX1BMWF9SNjg1LCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAotCXtQQ0lfVkVORE9SX0lEX1BMWCwgICAgICBQQ0lfREVWSUNFX0lEX1BMWF9SNzUzLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAotCXtQQ0lfVkVORE9SX0lEX1BMWCwgICAgICBQQ0lfREVWSUNFX0lEX1BMWF9ESklOTl9JVE9PLCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAotCXtQQ0lfVkVORE9SX0lEX1BMWCwgICAgICBQQ0lfREVWSUNFX0lEX1BMWF9PTElURUMsICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkRFVklDRShQTFgsICAgICAgUENJX0RFVklDRV9JRF9QTFhfUjY4NSkJCQl9LAorCXtQQ0lfVkRFVklDRShQTFgsICAgICAgUENJX0RFVklDRV9JRF9QTFhfUjc1MykJCQl9LAorCXtQQ0lfVkRFVklDRShQTFgsICAgICAgUENJX0RFVklDRV9JRF9QTFhfREpJTk5fSVRPTykJfSwKKwl7UENJX1ZERVZJQ0UoUExYLCAgICAgIFBDSV9ERVZJQ0VfSURfUExYX09MSVRFQykJCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSElTQVhfU0NUX1FVQURSTwotCXtQQ0lfVkVORE9SX0lEX1BMWCwgICAgICBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkRFVklDRShQTFgsICAgICAgUENJX0RFVklDRV9JRF9QTFhfOTA1MCkJCQl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJU0FYX05JQ0NZCi0Je1BDSV9WRU5ET1JfSURfU0FUU0FHRU0sIFBDSV9ERVZJQ0VfSURfU0FUU0FHRU1fTklDQ1ksICAgUENJX0FOWV9JRCxQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZERVZJQ0UoU0FUU0FHRU0sIFBDSV9ERVZJQ0VfSURfU0FUU0FHRU1fTklDQ1kpCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSElTQVhfU0VETEJBVUVSCi0Je1BDSV9WRU5ET1JfSURfVElHRVJKRVQsIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMTAwLCAgICAgUENJX0FOWV9JRCxQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZERVZJQ0UoVElHRVJKRVQsIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMTAwKQkJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0hJU0FYX05FVEpFVCkgfHwgZGVmaW5lZChDT05GSUdfSElTQVhfTkVUSkVUX1UpCi0Je1BDSV9WRU5ET1JfSURfVElHRVJKRVQsIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMzAwLCAgICAgUENJX0FOWV9JRCxQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZERVZJQ0UoVElHRVJKRVQsIFBDSV9ERVZJQ0VfSURfVElHRVJKRVRfMzAwKQkJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0hJU0FYX1RFTEVTUENJKSB8fCBkZWZpbmVkKENPTkZJR19ISVNBWF9TQ1RfUVVBRFJPKQotCXtQQ0lfVkVORE9SX0lEX1pPUkFOLCAgICBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MTIwLCAgICAgIFBDSV9BTllfSUQsUENJX0FOWV9JRH0sCisJe1BDSV9WREVWSUNFKFpPUkFOLCAgICBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MTIwKQkJfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19ISVNBWF9XNjY5MgotCXtQQ0lfVkVORE9SX0lEX0RZTkFMSU5LLCBQQ0lfREVWSUNFX0lEX0RZTkFMSU5LX0lTNjRQSCwgIFBDSV9BTllfSUQsUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfV0lOQk9ORDIsIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfNjY5MiwgICAgUENJX0FOWV9JRCxQQ0lfQU5ZX0lEfSwKKwl7UENJX1ZERVZJQ0UoRFlOQUxJTkssIFBDSV9ERVZJQ0VfSURfRFlOQUxJTktfSVM2NFBIKQl9LAorCXtQQ0lfVkRFVklDRShXSU5CT05EMiwgUENJX0RFVklDRV9JRF9XSU5CT05EMl82NjkyKQkJfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19ISVNBWF9IRkNfUENJCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEXzJCRDAsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDAsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDYsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDcsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDgsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMDksICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEEsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEIsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IwMEMsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0IxMDAsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0I3MDAsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQ0NELCAgICAgIFBDSV9ERVZJQ0VfSURfQ0NEX0I3MDEsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQUJPQ09NLCAgIFBDSV9ERVZJQ0VfSURfQUJPQ09NXzJCRDEsICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQVNVU1RFSywgIFBDSV9ERVZJQ0VfSURfQVNVU1RFS18wNjc1LCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQkVSS09NLCAgIFBDSV9ERVZJQ0VfSURfQkVSS09NX1RfQ09OQ0VQVCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQkVSS09NLCAgIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVCwgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfQU5JR01BLCAgIFBDSV9ERVZJQ0VfSURfQU5JR01BX01DMTQ1NTc1LCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfWk9MVFJJWCwgIFBDSV9ERVZJQ0VfSURfWk9MVFJJWF8yQkQwLCAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfRElHSSwgICAgIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfRElHSSwgICAgIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0UsICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfRElHSSwgICAgIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfQSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCi0Je1BDSV9WRU5ET1JfSURfRElHSSwgICAgIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0EsICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF8yQkQwKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDAwKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDA2KQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDA3KQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDA4KQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDA5KQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDBBKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDBCKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMDBDKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CMTAwKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CNzAwKQkJCX0sCisJe1BDSV9WREVWSUNFKENDRCwgICAgICBQQ0lfREVWSUNFX0lEX0NDRF9CNzAxKQkJCX0sCisJe1BDSV9WREVWSUNFKEFCT0NPTSwgICBQQ0lfREVWSUNFX0lEX0FCT0NPTV8yQkQxKQkJfSwKKwl7UENJX1ZERVZJQ0UoQVNVU1RFSywgIFBDSV9ERVZJQ0VfSURfQVNVU1RFS18wNjc1KQkJfSwKKwl7UENJX1ZERVZJQ0UoQkVSS09NLCAgIFBDSV9ERVZJQ0VfSURfQkVSS09NX1RfQ09OQ0VQVCkJfSwKKwl7UENJX1ZERVZJQ0UoQkVSS09NLCAgIFBDSV9ERVZJQ0VfSURfQkVSS09NX0ExVCkJCX0sCisJe1BDSV9WREVWSUNFKEFOSUdNQSwgICBQQ0lfREVWSUNFX0lEX0FOSUdNQV9NQzE0NTU3NSkJfSwKKwl7UENJX1ZERVZJQ0UoWk9MVFJJWCwgIFBDSV9ERVZJQ0VfSURfWk9MVFJJWF8yQkQwKQkJfSwKKwl7UENJX1ZERVZJQ0UoRElHSSwgICAgIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0lPTTJfRSkJfSwKKwl7UENJX1ZERVZJQ0UoRElHSSwgICAgIFBDSV9ERVZJQ0VfSURfRElHSV9ERl9NX0UpCQl9LAorCXtQQ0lfVkRFVklDRShESUdJLCAgICAgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fSU9NMl9BKQl9LAorCXtQQ0lfVkRFVklDRShESUdJLCAgICAgUENJX0RFVklDRV9JRF9ESUdJX0RGX01fQSkJCX0sCiAjZW5kaWYKIAl7IH0JCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwppbmRleCAyMTg5MjdlLi5iM2MwOGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMTI3LDkgKzEyNiw4IEBACiAgICAgICBhbmQgYXR0cmlidXRlcyBvZiBJTyB3aW5kb3dzKSBhcmUgZml4ZWQgYnkgdGhlIG5hdHVyZSBvZiB0aGUKICAgICAgIGRldmljZSwgYW5kIGNhbiBiZSBoYXJkLXdpcmVkIGhlcmUuCiAgICAgKi8KLSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSA4OwotICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0gICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAzOworICAgIGxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA4OworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKIAogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKQEAgLTE3NCwxNiArMTcyLDE4IEBACiB7CiAJaW50IGo7CiAKKwlwX2Rldi0+aW9fbGluZXMgPSAzOworCiAJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIGNmLT5pby53aW5bMF0uYmFzZSkgewogCQlwcmludGsoS0VSTl9JTkZPICIoZWxzYV9jczogbG9va3MgbGlrZSB0aGUgOTYgbW9kZWwpXG4iKTsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpKQogCQkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiKGVsc2FfY3M6IGxvb2tzIGxpa2UgdGhlIDk3IG1vZGVsKVxuIik7CiAJCWZvciAoaiA9IDB4MmYwOyBqID4gMHgxMDA7IGogLT0gMHgxMCkgewotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGo7Ci0JCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBqOworCQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldikpCiAJCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0yMTUsMjMgKzIxNSwyMSBAQAogCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4KTsKICAgICBpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQogCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEpOwotICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0gICAgICAgIHByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotICAgICAgICAgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKLSAgICBpZiAobGluay0+aW8uTnVtUG9ydHMyKQotICAgICAgICBwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCi0gICAgICAgICAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworICAgIGlmIChsaW5rLT5yZXNvdXJjZVswXSkKKwlwcmludGsoIiAmICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKyAgICBpZiAobGluay0+cmVzb3VyY2VbMV0pCisJcHJpbnRrKCIgJiAlcFIiLCBsaW5rLT5yZXNvdXJjZVsxXSk7CiAgICAgcHJpbnRrKCJcbiIpOwogCiAgICAgaWNhcmQucGFyYVswXSA9IGxpbmstPmlycTsKLSAgICBpY2FyZC5wYXJhWzFdID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIGljYXJkLnBhcmFbMV0gPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAgICAgaWNhcmQucHJvdG9jb2wgPSBwcm90b2NvbDsKICAgICBpY2FyZC50eXAgPSBJU0ROX0NUWVBFX0VMU0FfUENNQ0lBOwogICAgIAogICAgIGkgPSBoaXNheF9pbml0X3BjbWNpYShsaW5rLCAmKCgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+YnVzeSksICZpY2FyZCk7CiAgICAgaWYgKGkgPCAwKSB7Ci0gICAgCXByaW50ayhLRVJOX0VSUiAiZWxzYV9jczogZmFpbGVkIHRvIGluaXRpYWxpemUgRWxzYSBQQ01DSUEgJWQgYXQgaS9vICUjeFxuIiwKLSAgICAJCWksIGxpbmstPmlvLkJhc2VQb3J0MSk7CisJcHJpbnRrKEtFUk5fRVJSICJlbHNhX2NzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBFbHNhICIKKwkJIlBDTUNJQSAlZCB3aXRoICVwUlxuIiwgaSwgbGluay0+cmVzb3VyY2VbMF0pOwogICAgIAllbHNhX2NzX3JlbGVhc2UobGluayk7CiAgICAgfSBlbHNlCiAgICAgCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+Y2FyZG5yID0gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvcTkzMS5jCmluZGV4IDhiODUzZDUuLmMwNzcxZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3E5MzEuYwpAQCAtMTE1MiwyMCArMTE1MiwxMSBAQAogewogCXJlZ2lzdGVyIGludCBpOwogCXJlZ2lzdGVyIGNoYXIgKnQgPSB0eHQ7Ci0JcmVnaXN0ZXIgdV9jaGFyIHc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKIAkJKnQrKyA9ICcgJzsKLQkJdyA9IChwW2ldID4+IDQpICYgMHgwZjsKLQkJaWYgKHcgPCAxMCkKLQkJCSp0KysgPSAnMCcgKyB3OwotCQllbHNlCi0JCQkqdCsrID0gJ0EnIC0gMTAgKyB3OwotCQl3ID0gcFtpXSAmIDB4MGY7Ci0JCWlmICh3IDwgMTApCi0JCQkqdCsrID0gJzAnICsgdzsKLQkJZWxzZQotCQkJKnQrKyA9ICdBJyAtIDEwICsgdzsKKwkJKnQrKyA9IGhleF9hc2NfaGkocFtpXSk7CisJCSp0KysgPSBoZXhfYXNjX2xvKHBbaV0pOwogCX0KIAkqdCsrID0gMDsKIAlyZXR1cm4gKHQgLSB0eHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCmluZGV4IDFmNGZlYWEuLmEwMjQxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMTMwLDkgKzEyOSw4IEBACiAgICAgLyogZnJvbSBvbGQgc2VkbF9jcyAKICAgICAqLwogICAgIC8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLwotICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDg7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDM7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDg7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCiAgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKQEAgLTE3Myw4ICsxNzEsNiBAQAogCQkJCSAgdW5zaWduZWQgaW50IHZjYywKIAkJCQkgIHZvaWQgKnByaXZfZGF0YSkKIHsKLQl3aW5fcmVxX3QgKnJlcSA9IHByaXZfZGF0YTsKLQogCWlmIChjZmctPmluZGV4ID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0yMDIsNTIgKzE5OCwyNSBAQAogCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwogCiAJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAwOwogCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgewogCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOwotCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9CisJCQkJCXBjbWNpYV9pb19jZmdfZGF0YV93aWR0aChpby0+ZmxhZ3MpOwogCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5mbGFncyA9IHBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3M7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSBpby0+d2luWzFdLmxlbjsKIAkJfQogCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pICE9IDApCisJCXBfZGV2LT5pb19saW5lcyA9IDM7CisJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldikgIT0gMCkKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qCi0JICBOb3cgc2V0IHVwIGEgY29tbW9uIG1lbW9yeSB3aW5kb3csIGlmIG5lZWRlZC4gIFRoZXJlIGlzIHJvb20KLQkgIGluIHRoZSBzdHJ1Y3QgcGNtY2lhX2RldmljZSBzdHJ1Y3R1cmUgZm9yIG9uZSBtZW1vcnkgd2luZG93IGhhbmRsZSwKLQkgIGJ1dCBpZiB0aGUgYmFzZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBzYXZlZCwgb3IgaWYgbXVsdGlwbGUKLQkgIHdpbmRvd3MgYXJlIG5lZWRlZCwgdGhlIGluZm8gc2hvdWxkIGdvIGluIHRoZSBwcml2YXRlIGRhdGEKLQkgIHN0cnVjdHVyZSBmb3IgdGhpcyBkZXZpY2UuCi0KLQkgIE5vdGUgdGhhdCB0aGUgbWVtb3J5IHdpbmRvdyBiYXNlIGlzIGEgcGh5c2ljYWwgYWRkcmVzcywgYW5kCi0JICBuZWVkcyB0byBiZSBtYXBwZWQgdG8gdmlydHVhbCBzcGFjZSB3aXRoIGlvcmVtYXAoKSBiZWZvcmUgaXQKLQkgIGlzIHVzZWQuCi0JKi8KLQlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC0+bWVtLm53aW4gPiAwKSkgewotCQljaXN0cGxfbWVtX3QgKm1lbSA9IChjZmctPm1lbS5ud2luKSA/ICZjZmctPm1lbSA6ICZkZmx0LT5tZW07Ci0JCW1lbXJlcV90IG1hcDsKLQkJcmVxLT5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNOwotCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0VOQUJMRTsKLQkJcmVxLT5CYXNlID0gbWVtLT53aW5bMF0uaG9zdF9hZGRyOwotCQlyZXEtPlNpemUgPSBtZW0tPndpblswXS5sZW47Ci0JCXJlcS0+QWNjZXNzU3BlZWQgPSAwOwotCQlpZiAocGNtY2lhX3JlcXVlc3Rfd2luZG93KHBfZGV2LCByZXEsICZwX2Rldi0+d2luKSAhPSAwKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCW1hcC5QYWdlID0gMDsKLQkJbWFwLkNhcmRPZmZzZXQgPSBtZW0tPndpblswXS5jYXJkX2FkZHI7Ci0JCWlmIChwY21jaWFfbWFwX21lbV9wYWdlKHBfZGV2LCBwX2Rldi0+d2luLCAmbWFwKSAhPSAwKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC0yNTUsMTYgKzIyNCwxMSBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzZWRsYmF1ZXJfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewotICAgIHdpbl9yZXFfdCAqcmVxOwogICAgIGludCByZXQ7CiAgICAgSXNkbkNhcmRfdCAgaWNhcmQ7CiAKICAgICBkZXZfZGJnKCZsaW5rLT5kZXYsICJzZWRsYmF1ZXJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHJlcSA9IGt6YWxsb2Moc2l6ZW9mKHdpbl9yZXFfdCksIEdGUF9LRVJORUwpOwotICAgIGlmICghcmVxKQotCSAgICByZXR1cm4gLUVOT01FTTsKLQogICAgIC8qCiAgICAgICBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyaWVzLAogICAgICAgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSB2YWxpZCBjYXJkIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZwpAQCAtMjc3LDcgKzI0MSw3IEBACiAgICAgICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCiAgICAgICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCiAgICAgKi8KLSAgICByZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgc2VkbGJhdWVyX2NvbmZpZ19jaGVjaywgcmVxKTsKKyAgICByZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgc2VkbGJhdWVyX2NvbmZpZ19jaGVjaywgTlVMTCk7CiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAKQEAgLTI5NywyNyArMjYxLDIyIEBACiAJcHJpbnRrKCIsIFZwcCAlZC4lZCIsIGxpbmstPmNvbmYuVnBwLzEwLCBsaW5rLT5jb25mLlZwcCUxMCk7CiAgICAgaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKIAlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxKTsKLSAgICBpZiAobGluay0+aW8uTnVtUG9ydHMxKQotCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOwotICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czIpCi0JcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAotCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOwotICAgIGlmIChsaW5rLT53aW4pCi0JcHJpbnRrKCIsIG1lbSAweCUwNmx4LTB4JTA2bHgiLCByZXEtPkJhc2UsCi0JICAgICAgIHJlcS0+QmFzZStyZXEtPlNpemUtMSk7CisgICAgaWYgKGxpbmstPnJlc291cmNlWzBdKQorCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMF0pOworICAgIGlmIChsaW5rLT5yZXNvdXJjZVsxXSkKKwlwcmludGsoIiAmICVwUiIsIGxpbmstPnJlc291cmNlWzFdKTsKICAgICBwcmludGsoIlxuIik7CiAKICAgICBpY2FyZC5wYXJhWzBdID0gbGluay0+aXJxOwotICAgIGljYXJkLnBhcmFbMV0gPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgaWNhcmQucGFyYVsxXSA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKICAgICBpY2FyZC5wcm90b2NvbCA9IHByb3RvY29sOwogICAgIGljYXJkLnR5cCA9IElTRE5fQ1RZUEVfU0VETEJBVUVSX1BDTUNJQTsKICAgICAKICAgICByZXQgPSBoaXNheF9pbml0X3BjbWNpYShsaW5rLCAKIAkJCSAgICAmKCgobG9jYWxfaW5mb190ICopbGluay0+cHJpdiktPnN0b3ApLCAmaWNhcmQpOwogICAgIGlmIChyZXQgPCAwKSB7Ci0JcHJpbnRrKEtFUk5fRVJSICJzZWRsYmF1ZXJfY3M6IGZhaWxlZCB0byBpbml0aWFsaXplIFNFRExCQVVFUiBQQ01DSUEgJWQgYXQgaS9vICUjeFxuIiwKLQkJcmV0LCBsaW5rLT5pby5CYXNlUG9ydDEpOworCXByaW50ayhLRVJOX0VSUiAic2VkbGJhdWVyX2NzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBTRURMQkFVRVIgUENNQ0lBICVkIHdpdGggJXBSXG4iLAorCQlyZXQsIGxpbmstPnJlc291cmNlWzBdKTsKICAgICAJc2VkbGJhdWVyX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CiAgICAgfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVpLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVpLmMKaW5kZXggZjRjYjE3OC4uODQyZjljOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWkuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAKIAlpZiAoc3QtPmwyLnRlaSAhPSAtMSkgewogCQlzdC0+bWEudGVpX20ucHJpbnRkZWJ1Zygmc3QtPm1hLnRlaV9tLAotCQkJImFzc2lnbiByZXF1ZXN0IGZvciBhbGxyZWFkeSBhc2lnbmVkIHRlaSAlZCIsCisJCQkiYXNzaWduIHJlcXVlc3QgZm9yIGFscmVhZHkgYXNpZ25lZCB0ZWkgJWQiLAogCQkJc3QtPmwyLnRlaSk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jCmluZGV4IDU3NzE5NTUuLjcyOTYxMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTEwNyw5ICsxMDYsOCBAQAogICAgICAgYW5kIGF0dHJpYnV0ZXMgb2YgSU8gd2luZG93cykgYXJlIGZpeGVkIGJ5IHRoZSBuYXR1cmUgb2YgdGhlCiAgICAgICBkZXZpY2UsIGFuZCBjYW4gYmUgaGFyZC13aXJlZCBoZXJlLgogICAgICovCi0gICAgbGluay0+aW8uTnVtUG9ydHMxID0gOTY7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDk2OworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKIAogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKQEAgLTE1NCwxNiArMTUyLDE4IEBACiB7CiAJaW50IGo7CiAKKwlwX2Rldi0+aW9fbGluZXMgPSA1OworCiAJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIGNmLT5pby53aW5bMF0uYmFzZSkgewogCQlwcmludGsoS0VSTl9JTkZPICIodGVsZXNfY3M6IGxvb2tzIGxpa2UgdGhlIDk2IG1vZGVsKVxuIik7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gY2YtPmlvLndpblswXS5iYXNlOworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0lORk8gIih0ZWxlc19jczogbG9va3MgbGlrZSB0aGUgOTcgbW9kZWwpXG4iKTsKIAkJZm9yIChqID0gMHgyZjA7IGogPiAweDEwMDsgaiAtPSAweDEwKSB7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gajsKLQkJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGo7CisJCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTE5NSwyMyArMTk1LDIxIEBACiAJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOwogICAgIGlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJICAgIHByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEpOwotICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0gICAgICAgIHByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotICAgICAgICAgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKLSAgICBpZiAobGluay0+aW8uTnVtUG9ydHMyKQotICAgICAgICBwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCi0gICAgICAgICAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworICAgIGlmIChsaW5rLT5yZXNvdXJjZVswXSkKKwlwcmludGsoIiAmICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKyAgICBpZiAobGluay0+cmVzb3VyY2VbMV0pCisJcHJpbnRrKCIgJiAlcFIiLCBsaW5rLT5yZXNvdXJjZVsxXSk7CiAgICAgcHJpbnRrKCJcbiIpOwogCiAgICAgaWNhcmQucGFyYVswXSA9IGxpbmstPmlycTsKLSAgICBpY2FyZC5wYXJhWzFdID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIGljYXJkLnBhcmFbMV0gPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAgICAgaWNhcmQucHJvdG9jb2wgPSBwcm90b2NvbDsKICAgICBpY2FyZC50eXAgPSBJU0ROX0NUWVBFX1RFTEVTUENNQ0lBOwogICAgIAogICAgIGkgPSBoaXNheF9pbml0X3BjbWNpYShsaW5rLCAmKCgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+YnVzeSksICZpY2FyZCk7CiAgICAgaWYgKGkgPCAwKSB7CiAgICAgCXByaW50ayhLRVJOX0VSUiAidGVsZXNfY3M6IGZhaWxlZCB0byBpbml0aWFsaXplIFRlbGVzIFBDTUNJQSAlZCBhdCBpL28gJSN4XG4iLAotICAgIAkJaSwgbGluay0+aW8uQmFzZVBvcnQxKTsKKwkJCWksICh1bnNpZ25lZCBpbnQpIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCk7CiAgICAgCXRlbGVzX2NzX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Njb25mLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYwppbmRleCA4MDk2NjQ2Li45NmIzZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYwpAQCAtMTcsMTEgKzE3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgImh5c2RuX2RlZnMuaCIKIAorc3RhdGljIERFRklORV9NVVRFWChoeXNkbl9jb25mX211dGV4KTsKIHN0YXRpYyBjaGFyICpoeXNkbl9wcm9jY29uZl9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuOC42LjQgJCI7CiAKICNkZWZpbmUgSU5GT19PVVRfTEVOIDgwCQkvKiBsZW5ndGggb2YgaW5mbyBsaW5lIGluY2x1ZGluZyBsZiAqLwpAQCAtMjM0LDcgKzIzNSw3IEBACiAJY2hhciAqY3AsICp0bXA7CiAKIAkvKiBub3cgc2VhcmNoIHRoZSBhZGRyZXNzZWQgY2FyZCAqLwotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmaHlzZG5fY29uZl9tdXRleCk7CiAJY2FyZCA9IGNhcmRfcm9vdDsKIAl3aGlsZSAoY2FyZCkgewogCQlwZCA9IGNhcmQtPnByb2Njb25mOwpAQCAtMjQzLDcgKzI0NCw3IEBACiAJCWNhcmQgPSBjYXJkLT5uZXh0OwkvKiBzZWFyY2ggbmV4dCBlbnRyeSAqLwogCX0KIAlpZiAoIWNhcmQpIHsKLQkJdW5sb2NrX2tlcm5lbCgpOworCQltdXRleF91bmxvY2soJmh5c2RuX2NvbmZfbXV0ZXgpOwogCQlyZXR1cm4gKC1FTk9ERVYpOwkvKiBkZXZpY2UgaXMgdW5rbm93bi9pbnZhbGlkICovCiAJfQogCWlmIChjYXJkLT5kZWJ1Z19mbGFncyAmIChMT0dfUFJPQ19PUEVOIHwgTE9HX1BST0NfQUxMKSkKQEAgLTI1NSw3ICsyNTYsNyBAQAogCQkvKiB3cml0ZSBvbmx5IGFjY2VzcyAtPiB3cml0ZSBib290IGZpbGUgb3IgY29uZiBsaW5lICovCiAKIAkJaWYgKCEoY25mID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbmZfd3JpdGVkYXRhKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CisJCQltdXRleF91bmxvY2soJmh5c2RuX2NvbmZfbXV0ZXgpOwogCQkJcmV0dXJuICgtRUZBVUxUKTsKIAkJfQogCQljbmYtPmNhcmQgPSBjYXJkOwpAQCAtMjY3LDcgKzI2OCw3IEBACiAJCS8qIHJlYWQgYWNjZXNzIC0+IG91dHB1dCBjYXJkIGluZm8gZGF0YSAqLwogCiAJCWlmICghKHRtcCA9IGttYWxsb2MoSU5GT19PVVRfTEVOICogMiArIDIsIEdGUF9LRVJORUwpKSkgewotCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJbXV0ZXhfdW5sb2NrKCZoeXNkbl9jb25mX211dGV4KTsKIAkJCXJldHVybiAoLUVGQVVMVCk7CS8qIG91dCBvZiBtZW1vcnkgKi8KIAkJfQogCQlmaWxlcC0+cHJpdmF0ZV9kYXRhID0gdG1wOwkvKiBzdGFydCBvZiBzdHJpbmcgKi8KQEAgLTMwMSwxMCArMzAyLDEwIEBACiAJCSpjcCsrID0gJ1xuJzsKIAkJKmNwID0gMDsJLyogZW5kIG9mIHN0cmluZyAqLwogCX0gZWxzZSB7CQkvKiBzaW11bHRhbmVvdXMgcmVhZC93cml0ZSBhY2Nlc3MgZm9yYmlkZGVuICEgKi8KLQkJdW5sb2NrX2tlcm5lbCgpOworCQltdXRleF91bmxvY2soJmh5c2RuX2NvbmZfbXV0ZXgpOwogCQlyZXR1cm4gKC1FUEVSTSk7CS8qIG5vIHBlcm1pc3Npb24gdGhpcyB0aW1lICovCiAJfQotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmh5c2RuX2NvbmZfbXV0ZXgpOwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOwogfQkJCQkvKiBoeXNkbl9jb25mX29wZW4gKi8KIApAQCAtMzE5LDcgKzMyMCw3IEBACiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZDsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmaHlzZG5fY29uZl9tdXRleCk7CiAJLyogc2VhcmNoIHRoZSBhZGRyZXNzZWQgY2FyZCAqLwogCWNhcmQgPSBjYXJkX3Jvb3Q7CiAJd2hpbGUgKGNhcmQpIHsKQEAgLTMyOSw3ICszMzAsNyBAQAogCQljYXJkID0gY2FyZC0+bmV4dDsJLyogc2VhcmNoIG5leHQgZW50cnkgKi8KIAl9CiAJaWYgKCFjYXJkKSB7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfdW5sb2NrKCZoeXNkbl9jb25mX211dGV4KTsKIAkJcmV0dXJuICgtRU5PREVWKTsJLyogZGV2aWNlIGlzIHVua25vd24vaW52YWxpZCAqLwogCX0KIAlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiAoTE9HX1BST0NfT1BFTiB8IExPR19QUk9DX0FMTCkpCkBAIC0zNTIsNyArMzUzLDcgQEAKIAogCQlrZnJlZShmaWxlcC0+cHJpdmF0ZV9kYXRhKTsJLyogcmVsZWFzZSBtZW1vcnkgKi8KIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmaHlzZG5fY29uZl9tdXRleCk7CiAJcmV0dXJuIChyZXR2YWwpOwogfQkJCQkvKiBoeXNkbl9jb25mX2Nsb3NlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jCmluZGV4IGU4M2Y2ZmQuLjJlZTkzZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYwpAQCAtMTUsMTMgKzE1LDE1IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgImh5c2RuX2RlZnMuaCIKIAogLyogdGhlIHByb2Mgc3ViZGlyIGZvciB0aGUgaW50ZXJmYWNlIGlzIGRlZmluZWQgaW4gdGhlIHByb2Njb25mIG1vZHVsZSAqLwogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaHlzZG5fcHJvY19lbnRyeTsKIAorc3RhdGljIERFRklORV9NVVRFWChoeXNkbl9sb2dfbXV0ZXgpOwogc3RhdGljIHZvaWQgcHV0X2xvZ19idWZmZXIoaHlzZG5fY2FyZCAqIGNhcmQsIGNoYXIgKmNwKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTQsMTAgKzE1Niw5IEBACiBoeXNkbl9sb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2ZmKQogewogCXVuc2lnbmVkIGxvbmcgdSA9IDA7Ci0JaW50IGZvdW5kID0gMDsKLQl1bnNpZ25lZCBjaGFyICpjcCwgdmFsYnVmWzEyOF07Ci0JbG9uZyBiYXNlID0gMTA7Ci0JaHlzZG5fY2FyZCAqY2FyZCA9IChoeXNkbl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmM7CisJdW5zaWduZWQgY2hhciB2YWxidWZbMTI4XTsKKwloeXNkbl9jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGNvdW50ID4gKHNpemVvZih2YWxidWYpIC0gMSkpCiAJCWNvdW50ID0gc2l6ZW9mKHZhbGJ1ZikgLSAxOwkvKiBsaW1pdCBsZW5ndGggKi8KQEAgLTE2NSwzMiArMTY2LDEwIEBACiAJCXJldHVybiAoLUVGQVVMVCk7CS8qIGNvcHkgZmFpbGVkICovCiAKIAl2YWxidWZbY291bnRdID0gMDsJLyogdGVybWluYXRpbmcgMCAqLwotCWNwID0gdmFsYnVmOwotCWlmICgoY291bnQgPiAyKSAmJiAodmFsYnVmWzBdID09ICcwJykgJiYgKHZhbGJ1ZlsxXSA9PSAneCcpKSB7Ci0JCWNwICs9IDI7CS8qIHBvaW50ZXIgYWZ0ZXIgaGV4IG1vZGlmaWVyICovCi0JCWJhc2UgPSAxNjsKLQl9Ci0JLyogc2NhbiB0aGUgaW5wdXQgZm9yIGRlYnVnIGZsYWdzICovCi0Jd2hpbGUgKCpjcCkgewotCQlpZiAoKCpjcCA+PSAnMCcpICYmICgqY3AgPD0gJzknKSkgewotCQkJZm91bmQgPSAxOwotCQkJdSAqPSBiYXNlOwkvKiBhZGp1c3QgdG8gbmV4dCBkaWdpdCAqLwotCQkJdSArPSAqY3ArKyAtICcwJzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChiYXNlICE9IDE2KQotCQkJYnJlYWs7CS8qIGVuZCBvZiBudW1iZXIgKi8KIAotCQlpZiAoKCpjcCA+PSAnYScpICYmICgqY3AgPD0gJ2YnKSkgewotCQkJZm91bmQgPSAxOwotCQkJdSAqPSBiYXNlOwkvKiBhZGp1c3QgdG8gbmV4dCBkaWdpdCAqLwotCQkJdSArPSAqY3ArKyAtICdhJyArIDEwOwotCQkJY29udGludWU7Ci0JCX0KLQkJYnJlYWs7CQkvKiB0ZXJtaW5hdGVkICovCi0JfQorCXJjID0gc3RyaWN0X3N0cnRvdWwodmFsYnVmLCAwLCAmdSk7CiAKLQlpZiAoZm91bmQpIHsKKwlpZiAocmMgPT0gMCkgewogCQljYXJkLT5kZWJ1Z19mbGFncyA9IHU7CS8qIHJlbWVtYmVyIGRlYnVnIGZsYWdzICovCiAJCWh5c2RuX2FkZGxvZyhjYXJkLCAiZGVidWcgc2V0IHRvIDB4JWx4IiwgY2FyZC0+ZGVidWdfZmxhZ3MpOwogCX0KQEAgLTI1MSw3ICsyMzAsNyBAQAogCXN0cnVjdCBwcm9jZGF0YSAqcGQgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmh5c2RuX2xvZ19tdXRleCk7CiAJY2FyZCA9IGNhcmRfcm9vdDsKIAl3aGlsZSAoY2FyZCkgewogCQlwZCA9IGNhcmQtPnByb2Nsb2c7CkBAIC0yNjAsNyArMjM5LDcgQEAKIAkJY2FyZCA9IGNhcmQtPm5leHQ7CS8qIHNlYXJjaCBuZXh0IGVudHJ5ICovCiAJfQogCWlmICghY2FyZCkgewotCQl1bmxvY2tfa2VybmVsKCk7CisJCW11dGV4X3VubG9jaygmaHlzZG5fbG9nX211dGV4KTsKIAkJcmV0dXJuICgtRU5PREVWKTsJLyogZGV2aWNlIGlzIHVua25vd24vaW52YWxpZCAqLwogCX0KIAlmaWxlcC0+cHJpdmF0ZV9kYXRhID0gY2FyZDsJLyogcmVtZW1iZXIgb3VyIG93biBjYXJkICovCkBAIC0yNzgsMTAgKzI1NywxMCBAQAogCQkJZmlsZXAtPnByaXZhdGVfZGF0YSA9ICZwZC0+bG9nX2hlYWQ7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewkJLyogc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzIGZvcmJpZGRlbiAhICovCi0JCXVubG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfdW5sb2NrKCZoeXNkbl9sb2dfbXV0ZXgpOwogCQlyZXR1cm4gKC1FUEVSTSk7CS8qIG5vIHBlcm1pc3Npb24gdGhpcyB0aW1lICovCiAJfQotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmh5c2RuX2xvZ19tdXRleCk7CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7CiB9CQkJCS8qIGh5c2RuX2xvZ19vcGVuICovCiAKQEAgLTMwMCw3ICsyNzksNyBAQAogCWh5c2RuX2NhcmQgKmNhcmQ7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmh5c2RuX2xvZ19tdXRleCk7CiAJaWYgKChmaWxlcC0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpID09IEZNT0RFX1dSSVRFKSB7CiAJCS8qIHdyaXRlIG9ubHkgYWNjZXNzIC0+IHdyaXRlIGRlYnVnIGxldmVsIHdyaXR0ZW4gKi8KIAkJcmV0dmFsID0gMDsJLyogc3VjY2VzcyAqLwpAQCAtMzM5LDcgKzMxOCw3IEBACiAJCQkJCWtmcmVlKGluZik7CiAJCQkJfQogCX0JCQkvKiByZWFkIGFjY2VzcyAqLwotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmh5c2RuX2xvZ19tdXRleCk7CiAKIAlyZXR1cm4gKHJldHZhbCk7CiB9CQkJCS8qIGh5c2RuX2xvZ19jbG9zZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCmluZGV4IGE0NGNkYjQuLjE1NjMyYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lzZG4uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSAiaXNkbl9jb21tb24uaCIKICNpbmNsdWRlICJpc2RuX3R0eS5oIgogI2luY2x1ZGUgImlzZG5fbmV0LmgiCkBAIC00Miw2ICs0Miw3IEBACiAKIGlzZG5fZGV2ICpkZXY7CiAKK3N0YXRpYyBERUZJTkVfTVVURVgoaXNkbl9tdXRleCk7CiBzdGF0aWMgY2hhciAqaXNkbl9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuMS4yLjMgJCI7CiAKIGV4dGVybiBjaGFyICppc2RuX25ldF9yZXZpc2lvbjsKQEAgLTEwNzAsNyArMTA3MSw3IEBACiAJaW50IHJldHZhbDsKIAljaGFyICpwOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZpc2RuX211dGV4KTsKIAlpZiAobWlub3IgPT0gSVNETl9NSU5PUl9TVEFUVVMpIHsKIAkJaWYgKCFmaWxlLT5wcml2YXRlX2RhdGEpIHsKIAkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewpAQCAtMTE2Myw3ICsxMTY0LDcgQEAKICNlbmRpZgogCXJldHZhbCA9IC1FTk9ERVY7CiAgb3V0OgotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmlzZG5fbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTExODAsNyArMTE4MSw3IEBACiAJaWYgKCFkZXYtPmRyaXZlcnMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZpc2RuX211dGV4KTsKIAlpZiAobWlub3IgPD0gSVNETl9NSU5PUl9CTUFYKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzZG5fd3JpdGUgbWlub3IgJWQgb2Jzb2xldGUhXG4iLCBtaW5vcik7CiAJCWRydmlkeCA9IGlzZG5fbWlub3IyZHJ2KG1pbm9yKTsKQEAgLTEyMjUsNyArMTIyNiw3IEBACiAjZW5kaWYKIAlyZXR2YWwgPSAtRU5PREVWOwogIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZpc2RuX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMjM2LDcgKzEyMzcsNyBAQAogCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgZHJ2aWR4ID0gaXNkbl9taW5vcjJkcnYobWlub3IgLSBJU0ROX01JTk9SX0NUUkwpOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZpc2RuX211dGV4KTsKIAlpZiAobWlub3IgPT0gSVNETl9NSU5PUl9TVEFUVVMpIHsKIAkJcG9sbF93YWl0KGZpbGUsICYoZGV2LT5pbmZvX3dhaXRxKSwgd2FpdCk7CiAJCS8qIG1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsgKi8KQEAgLTEyNjYsNyArMTI2Nyw3IEBACiAjZW5kaWYKIAltYXNrID0gUE9MTEVSUjsKICBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmaXNkbl9tdXRleCk7CiAJcmV0dXJuIG1hc2s7CiB9CiAKQEAgLTE3MjcsOSArMTcyOCw5IEBACiB7CiAJaW50IHJldDsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmaXNkbl9tdXRleCk7CiAJcmV0ID0gaXNkbl9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmaXNkbl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTc0NSw3ICsxNzQ2LDcgQEAKIAlpbnQgY2hpZHg7CiAJaW50IHJldHZhbCA9IC1FTk9ERVY7CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmlzZG5fbXV0ZXgpOwogCWlmIChtaW5vciA9PSBJU0ROX01JTk9SX1NUQVRVUykgewogCQlpbmZvc3RydWN0ICpwOwogCkBAIC0xNzk2LDcgKzE3OTcsNyBAQAogI2VuZGlmCiAgb3V0OgogCW5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmaXNkbl9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTgwNSw3ICsxODA2LDcgQEAKIHsKIAl1aW50IG1pbm9yID0gaW1pbm9yKGlubyk7CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJmlzZG5fbXV0ZXgpOwogCWlmIChtaW5vciA9PSBJU0ROX01JTk9SX1NUQVRVUykgewogCQlpbmZvc3RydWN0ICpwID0gZGV2LT5pbmZvY2hhaW47CiAJCWluZm9zdHJ1Y3QgKnEgPSBOVUxMOwpAQCAtMTgzOSw3ICsxODQwLDcgQEAKICNlbmRpZgogCiAgb3V0OgotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmlzZG5fbXV0ZXgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKaW5kZXggOGM4NWQxZS4uMjZkNDRjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtMjkyNCwxNiArMjkyNCwxNyBAQAogCQljZmctPmRpYWx0aW1lb3V0ID0gbHAtPmRpYWx0aW1lb3V0ID49IDAgPyBscC0+ZGlhbHRpbWVvdXQgLyBIWiA6IC0xOwogCQljZmctPmRpYWx3YWl0ID0gbHAtPmRpYWx3YWl0IC8gSFo7CiAJCWlmIChscC0+c2xhdmUpIHsKLQkJCWlmIChzdHJsZW4obHAtPnNsYXZlLT5uYW1lKSA+IDgpCisJCQlpZiAoc3RybGVuKGxwLT5zbGF2ZS0+bmFtZSkgPj0gMTApCiAJCQkJc3RyY3B5KGNmZy0+c2xhdmUsICJ0b28tbG9uZyIpOwogCQkJZWxzZQogCQkJCXN0cmNweShjZmctPnNsYXZlLCBscC0+c2xhdmUtPm5hbWUpOwogCQl9IGVsc2UKIAkJCWNmZy0+c2xhdmVbMF0gPSAnXDAnOwogCQlpZiAobHAtPm1hc3RlcikgewotCQkJaWYgKHN0cmxlbihscC0+bWFzdGVyLT5uYW1lKSA+IDgpCisJCQlpZiAoc3RybGVuKGxwLT5tYXN0ZXItPm5hbWUpID49IDEwKQogCQkJCXN0cmNweShjZmctPm1hc3RlciwgInRvby1sb25nIik7Ci0JCQlzdHJjcHkoY2ZnLT5tYXN0ZXIsIGxwLT5tYXN0ZXItPm5hbWUpOworCQkJZWxzZQorCQkJCXN0cmNweShjZmctPm1hc3RlciwgbHAtPm1hc3Rlci0+bmFtZSk7CiAJCX0gZWxzZQogCQkJY2ZnLT5tYXN0ZXJbMF0gPSAnXDAnOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYwppbmRleCBmMzdiOGY2Li5mZTgyNGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCkBAIC00NDksMTQgKzQ0OSw5IEBACiAKIAkvKiB1cHJvZy5sZW4gaXMgdW5zaWduZWQgc2hvcnQsIHNvIG5vIG92ZXJmbG93IGhlcmUgKi8KIAlsZW4gPSB1cHJvZy5sZW4gKiBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKTsKLQljb2RlID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmIChjb2RlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGNvZGUsIHVwcm9nLmZpbHRlciwgbGVuKSkgewotCQlrZnJlZShjb2RlKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCWNvZGUgPSBtZW1kdXBfdXNlcih1cHJvZy5maWx0ZXIsIGxlbik7CisJaWYgKElTX0VSUihjb2RlKSkKKwkJcmV0dXJuIFBUUl9FUlIoY29kZSk7CiAKIAllcnIgPSBza19jaGtfZmlsdGVyKGNvZGUsIHVwcm9nLmxlbik7CiAJaWYgKGVycikgewpAQCAtNDgyLDcgKzQ3Nyw3IEBACiAJc3RydWN0IGlzZG5fcHBwX2NvbXBfZGF0YSBkYXRhOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCi0JaXMgPSAoc3RydWN0IGlwcHBfc3RydWN0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlscCA9IGlzLT5scDsKIAogCWlmIChpcy0+ZGVidWcgJiAweDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKaW5kZXggZmM4NDU0ZC4uNTFkYzYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYwpAQCAtMjYzNiwxMiArMjYzNiw2IEBACiAJCWlmICgoaW5mby0+ZmxhZ3MgJiBJU0ROX0FTWU5DX0NMT1NJTkcpIHx8ICghaW5mby0+dHR5KSkgewogCQkJcmV0dXJuOwogCQl9Ci0jaWZkZWYgQ09ORklHX0lTRE5fQVVESU8KLQkJaWYgKCAhaW5mby0+dm9ubGluZSApCi0JCQl0dHlfbGRpc2NfZmx1c2goaW5mby0+dHR5KTsKLSNlbHNlCi0JCXR0eV9sZGlzY19mbHVzaChpbmZvLT50dHkpOwotI2VuZGlmCiAJCWlmICgoaW5mby0+ZmxhZ3MgJiBJU0ROX0FTWU5DX0NIRUNLX0NEKSAmJgogCQkgICAgKCEoKGluZm8tPmZsYWdzICYgSVNETl9BU1lOQ19DQUxMT1VUX0FDVElWRSkgJiYKIAkJICAgICAgIChpbmZvLT5mbGFncyAmIElTRE5fQVNZTkNfQ0FMTE9VVF9OT0hVUCkpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCmluZGV4IDM0ZTg5OGYuLjFiODVkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCiAJaWYgKHRtLT5sMi0+dGVpICE9IEdST1VQX1RFSSkgewogCQl0bS0+dGVpX20ucHJpbnRkZWJ1ZygmdG0tPnRlaV9tLAotCQkJImFzc2lnbiByZXF1ZXN0IGZvciBhbGxyZWFkeSBhc3NpZ25lZCB0ZWkgJWQiLAorCQkJImFzc2lnbiByZXF1ZXN0IGZvciBhbHJlYWR5IGFzc2lnbmVkIHRlaSAlZCIsCiAJCQl0bS0+bDItPnRlaSk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vdGltZXJkZXYuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi90aW1lcmRldi5jCmluZGV4IDgxMDQ4YjguLmRlNDNjOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi90aW1lcmRldi5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi90aW1lcmRldi5jCkBAIC0yNCw5ICsyNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tSVNETmlmLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgImNvcmUuaCIKIAorc3RhdGljIERFRklORV9NVVRFWChtSVNETl9tdXRleCk7CiBzdGF0aWMgdV9pbnQJKmRlYnVnOwogCiAKQEAgLTIyNCw3ICsyMjUsNyBAQAogCWlmICgqZGVidWcgJiBERUJVR19USU1FUikKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzKCVwLCAleCwgJWx4KVxuIiwgX19mdW5jX18sCiAJCSAgICBmaWxlcCwgY21kLCBhcmcpOwotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmbUlTRE5fbXV0ZXgpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJTUFERFRJTUVSOgogCQlpZiAoZ2V0X3VzZXIodG91dCwgKGludCBfX3VzZXIgKilhcmcpKSB7CkBAIC0yNTYsNyArMjU3LDcgQEAKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZtSVNETl9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jIGIvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jCmluZGV4IDEyM2MxZDYuLjE1MDdkMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9kcnYuYworKysgYi9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMKQEAgLTQxMSwxNCArNDExLDEwIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWNidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2J1ZikKLQkJCXJldHVybiAtRU5PTUVNOworCQljYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBsZW4pOworCQlpZiAoSVNfRVJSKGNidWYpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2J1Zik7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNidWYsIGJ1ZiwgbGVuKSkgewotCQkJa2ZyZWUoY2J1Zik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQogCQltZW1jcHlfdG9pbyhkZXYtPnNoX21lbSwgY2J1ZiwgbGVuKTsKIAkJa2ZyZWUoY2J1Zik7CiAJCXJldHVybiBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvaW9jdGwuYyBiL2RyaXZlcnMvaXNkbi9zYy9pb2N0bC5jCmluZGV4IDEwODEwOTEuLjQzYzVkYzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvaW9jdGwuYworKysgYi9kcml2ZXJzL2lzZG4vc2MvaW9jdGwuYwpAQCAtMjE1LDE5ICsyMTUsMTMgQEAKIAkJcHJfZGVidWcoIiVzOiBEQ0JJT1NFVFNQSUQ6IGlvY3RsIHJlY2VpdmVkXG4iLAogCQkJCXNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUpOwogCi0JCXNwaWQgPSBrbWFsbG9jKFNDSU9DX1NQSURTSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYoIXNwaWQpIHsKLQkJCWtmcmVlKHJjdm1zZyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCiAJCS8qCiAJCSAqIEdldCB0aGUgc3BpZCBmcm9tIHVzZXIgc3BhY2UKIAkJICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihzcGlkLCBkYXRhLT5kYXRhcHRyLCBTQ0lPQ19TUElEU0laRSkpIHsKKwkJc3BpZCA9IG1lbWR1cF91c2VyKGRhdGEtPmRhdGFwdHIsIFNDSU9DX1NQSURTSVpFKTsKKwkJaWYgKElTX0VSUihzcGlkKSkgewogCQkJa2ZyZWUocmN2bXNnKTsKLQkJCWtmcmVlKHNwaWQpOwotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gUFRSX0VSUihzcGlkKTsKIAkJfQogCiAJCXByX2RlYnVnKCIlczogU0NJT0NTRVRTUElEOiBzZXR0aW5nIGNoYW5uZWwgJWQgc3BpZCB0byAlc1xuIiwgCkBAIC0yOTYsMTggKzI5MCwxMyBAQAogCQlwcl9kZWJ1ZygiJXM6IFNDSU9TRVRETjogaW9jdGwgcmVjZWl2ZWRcbiIsCiAJCQkJc2NfYWRhcHRlcltjYXJkXS0+ZGV2aWNlbmFtZSk7CiAKLQkJZG4gPSBrbWFsbG9jKFNDSU9DX0ROU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZG4pIHsKLQkJCWtmcmVlKHJjdm1zZyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQkvKgogCQkgKiBHZXQgdGhlIHNwaWQgZnJvbSB1c2VyIHNwYWNlCiAJCSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoZG4sIGRhdGEtPmRhdGFwdHIsIFNDSU9DX0ROU0laRSkpIHsKKwkJZG4gPSBtZW1kdXBfdXNlcihkYXRhLT5kYXRhcHRyLCBTQ0lPQ19ETlNJWkUpOworCQlpZiAoSVNfRVJSKGRuKSkgewogCQkJa2ZyZWUocmN2bXNnKTsKLQkJCWtmcmVlKGRuKTsKLQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIFBUUl9FUlIoZG4pOwogCQl9CiAKIAkJcHJfZGVidWcoIiVzOiBTQ0lPQ1NFVEROOiBzZXR0aW5nIGNoYW5uZWwgJWQgZG4gdG8gJXNcbiIsIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL0tjb25maWcgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwppbmRleCA4MWJmMjVlLi5lNDExMjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwpAQCAtMzAyLDYgKzMwMiwxNSBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlIHN1cHBvcnQgZm9yIG9uLWNoaXAgTEVEIGRyaXZlcnMgZm91bmQKIAkgIG9uIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIE1DMTM3ODMgUE1JQy4KIAorY29uZmlnIExFRFNfTlMyCisJdHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBOZXR3b3JrIFNwYWNlIHYyIEdQSU8gTEVEcyIKKwlkZXBlbmRzIG9uIE1BQ0hfTkVUU1BBQ0VfVjIgfHwgTUFDSF9JTkVUU1BBQ0VfVjIgfHwgTUFDSF9ORVRTUEFDRV9NQVhfVjIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGR1YWwtR1BJTyBMRUQgZm91bmQgb24gdGhlCisJICBOZXR3b3JrIFNwYWNlIHYyIGJvYXJkIChhbmQgcGFyZW50cykuIFRoaXMgaW5jbHVkZSBJbnRlcm5ldCBTcGFjZSB2MiwKKwkgIE5ldHdvcmsgU3BhY2UgKE1heCkgdjIgYW5kIGQyIE5ldHdvcmsgdjIgYm9hcmRzLgorCiBjb25maWcgTEVEU19UUklHR0VSUwogCWJvb2wgIkxFRCBUcmlnZ2VyIHN1cHBvcnQiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCmluZGV4IDI0OTNkZTQuLjdkNmI5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKQEAgLTM3LDYgKzM3LDcgQEAKIG9iai0kKENPTkZJR19MRURTX0FEUDU1MjApCQkrPSBsZWRzLWFkcDU1MjAubwogb2JqLSQoQ09ORklHX0xFRFNfREVMTF9ORVRCT09LUykJKz0gZGVsbC1sZWQubwogb2JqLSQoQ09ORklHX0xFRFNfTUMxMzc4MykJCSs9IGxlZHMtbWMxMzc4My5vCitvYmotJChDT05GSUdfTEVEU19OUzIpCQkJKz0gbGVkcy1uczIubwogCiAjIExFRCBTUEkgRHJpdmVycwogb2JqLSQoQ09ORklHX0xFRFNfREFDMTI0UzA4NSkJCSs9IGxlZHMtZGFjMTI0czA4NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1iZDI4MDIuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWJkMjgwMi5jCmluZGV4IDVkY2RmOWQuLjE5ZGM0YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWJkMjgwMi5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWJkMjgwMi5jCkBAIC0zNTEsNyArMzUxLDcgQEAKIAlyZXR1cm4gY291bnQ7CQkJCQkJCVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYmQyODAyX3JlZyMjcmVnX2FkZHIjI19hdHRyID0gewkJXAotCS5hdHRyID0gey5uYW1lID0gcmVnX25hbWUsIC5tb2RlID0gMDY0NCwgLm93bmVyID0gVEhJU19NT0RVTEV9LAlcCisJLmF0dHIgPSB7Lm5hbWUgPSByZWdfbmFtZSwgLm1vZGUgPSAwNjQ0fSwJCQlcCiAJLnN0b3JlID0gYmQyODAyX3N0b3JlX3JlZyMjcmVnX2FkZHIsCQkJCVwKIH07CiAKQEAgLTQ4Miw3ICs0ODIsNiBAQAogCS5hdHRyID0gewogCQkubmFtZSA9ICJhZHZhbmNlZF9jb25maWd1cmF0aW9uIiwKIAkJLm1vZGUgPSAwNjQ0LAotCQkub3duZXIgPSBUSElTX01PRFVMRQogCX0sCiAJLnNob3cgPSBiZDI4MDJfc2hvd19hZHZfY29uZiwKIAkuc3RvcmUgPSBiZDI4MDJfc3RvcmVfYWR2X2NvbmYsCkBAIC01MTksNyArNTE4LDYgQEAKIAkuYXR0ciA9IHsJCQkJCQkJXAogCQkubmFtZSA9IG5hbWVfc3RyLAkJCQkJXAogCQkubW9kZSA9IDA2NDQsCQkJCQkJXAotCQkub3duZXIgPSBUSElTX01PRFVMRQkJCQkJXAogCX0sCQkJCQkJCQlcCiAJLnNob3cgPSBiZDI4MDJfc2hvd18jI2F0dHJfbmFtZSwJCQkJXAogCS5zdG9yZSA9IGJkMjgwMl9zdG9yZV8jI2F0dHJfbmFtZSwJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1uczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGRjZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBsZWRzLW5zMi5jIC0gRHJpdmVyIGZvciB0aGUgTmV0d29yayBTcGFjZSB2MiAoYW5kIHBhcmVudHMpIGR1YWwtR1BJTyBMRUQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTGFDaWUKKyAqCisgKiBBdXRob3I6IFNpbW9uIEd1aW5vdCA8c2d1aW5vdEBsYWNpZS5jb20+CisgKgorICogQmFzZWQgb24gbGVkcy1ncGlvLmMgYnkgUmFwaGFlbCBBc3NlbmF0IDxyYXBoQDhkLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxtYWNoL2xlZHMtbnMyLmg+CisKKy8qCisgKiBUaGUgTmV0d29yayBTcGFjZSB2MiBkdWFsLUdQSU8gTEVEIGlzIHdpcmVkIHRvIGEgQ1BMRCBhbmQgY2FuIGJsaW5rIGluCisgKiByZWxhdGlvbiB3aXRoIHRoZSBTQVRBIGFjdGl2aXR5LiBUaGlzIGNhcGFiaWxpdHkgaXMgZXhwb3NlZCB0aHJvdWdoIHRoZQorICogInNhdGEiIHN5c2ZzIGF0dHJpYnV0ZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGFycmF5IGRldGFpbCB0aGUgZGlmZmVyZW50IExFRCByZWdpc3RlcnMgYW5kIHRoZSBjb21iaW5hdGlvbgorICogb2YgdGhlaXIgcG9zc2libGUgdmFsdWVzOgorICoKKyAqICBjbWRfbGVkICAgfCAgc2xvd19sZWQgIHwgL1NBVEEgYWN0aXZlIHwgTEVEIHN0YXRlCisgKiAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisgKiAgICAgMSAgICAgIHwgICAgIDAgICAgICB8ICAgICAgeCAgICAgICB8ICBvZmYKKyAqICAgICAtICAgICAgfCAgICAgMSAgICAgIHwgICAgICB4ICAgICAgIHwgIG9uCisgKiAgICAgMCAgICAgIHwgICAgIDAgICAgICB8ICAgICAgMSAgICAgICB8ICBvbgorICogICAgIDAgICAgICB8ICAgICAwICAgICAgfCAgICAgIDAgICAgICAgfCAgYmxpbmsgKHJhdGUgMzAwbXMpCisgKi8KKworZW51bSBuczJfbGVkX21vZGVzIHsKKwlOU19WMl9MRURfT0ZGLAorCU5TX1YyX0xFRF9PTiwKKwlOU19WMl9MRURfU0FUQSwKK307CisKK3N0cnVjdCBuczJfbGVkX21vZGVfdmFsdWUgeworCWVudW0gbnMyX2xlZF9tb2Rlcwltb2RlOworCWludAkJCWNtZF9sZXZlbDsKKwlpbnQJCQlzbG93X2xldmVsOworfTsKKworc3RhdGljIHN0cnVjdCBuczJfbGVkX21vZGVfdmFsdWUgbnMyX2xlZF9tb2R2YWxbXSA9IHsKKwl7IE5TX1YyX0xFRF9PRkYJLCAxLCAwIH0sCisJeyBOU19WMl9MRURfT04JLCAwLCAxIH0sCisJeyBOU19WMl9MRURfT04JLCAxLCAxIH0sCisJeyBOU19WMl9MRURfU0FUQSwgMCwgMCB9LAorfTsKKworc3RydWN0IG5zMl9sZWRfZGF0YSB7CisJc3RydWN0IGxlZF9jbGFzc2RldgljZGV2OworCXVuc2lnbmVkCQljbWQ7CisJdW5zaWduZWQJCXNsb3c7CisJdW5zaWduZWQgY2hhcgkJc2F0YTsgLyogVHJ1ZSB3aGVuIFNBVEEgbW9kZSBhY3RpdmUuICovCisJcndsb2NrX3QJCXJ3X2xvY2s7IC8qIExvY2sgR1BJT3MuICovCit9OworCitzdGF0aWMgaW50IG5zMl9sZWRfZ2V0X21vZGUoc3RydWN0IG5zMl9sZWRfZGF0YSAqbGVkX2RhdCwKKwkJCSAgICBlbnVtIG5zMl9sZWRfbW9kZXMgKm1vZGUpCit7CisJaW50IGk7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGNtZF9sZXZlbDsKKwlpbnQgc2xvd19sZXZlbDsKKworCXJlYWRfbG9jaygmbGVkX2RhdC0+cndfbG9jayk7CisKKwljbWRfbGV2ZWwgPSBncGlvX2dldF92YWx1ZShsZWRfZGF0LT5jbWQpOworCXNsb3dfbGV2ZWwgPSBncGlvX2dldF92YWx1ZShsZWRfZGF0LT5zbG93KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5zMl9sZWRfbW9kdmFsKTsgaSsrKSB7CisJCWlmIChjbWRfbGV2ZWwgPT0gbnMyX2xlZF9tb2R2YWxbaV0uY21kX2xldmVsICYmCisJCSAgICBzbG93X2xldmVsID09IG5zMl9sZWRfbW9kdmFsW2ldLnNsb3dfbGV2ZWwpIHsKKwkJCSptb2RlID0gbnMyX2xlZF9tb2R2YWxbaV0ubW9kZTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlYWRfdW5sb2NrKCZsZWRfZGF0LT5yd19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG5zMl9sZWRfc2V0X21vZGUoc3RydWN0IG5zMl9sZWRfZGF0YSAqbGVkX2RhdCwKKwkJCSAgICAgZW51bSBuczJfbGVkX21vZGVzIG1vZGUpCit7CisJaW50IGk7CisKKwl3cml0ZV9sb2NrKCZsZWRfZGF0LT5yd19sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5zMl9sZWRfbW9kdmFsKTsgaSsrKSB7CisJCWlmIChtb2RlID09IG5zMl9sZWRfbW9kdmFsW2ldLm1vZGUpIHsKKwkJCWdwaW9fc2V0X3ZhbHVlKGxlZF9kYXQtPmNtZCwKKwkJCQkgICAgICAgbnMyX2xlZF9tb2R2YWxbaV0uY21kX2xldmVsKTsKKwkJCWdwaW9fc2V0X3ZhbHVlKGxlZF9kYXQtPnNsb3csCisJCQkJICAgICAgIG5zMl9sZWRfbW9kdmFsW2ldLnNsb3dfbGV2ZWwpOworCQl9CisJfQorCisJd3JpdGVfdW5sb2NrKCZsZWRfZGF0LT5yd19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbnMyX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCXN0cnVjdCBuczJfbGVkX2RhdGEgKmxlZF9kYXQgPQorCQljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBuczJfbGVkX2RhdGEsIGNkZXYpOworCWVudW0gbnMyX2xlZF9tb2RlcyBtb2RlOworCisJaWYgKHZhbHVlID09IExFRF9PRkYpCisJCW1vZGUgPSBOU19WMl9MRURfT0ZGOworCWVsc2UgaWYgKGxlZF9kYXQtPnNhdGEpCisJCW1vZGUgPSBOU19WMl9MRURfU0FUQTsKKwllbHNlCisJCW1vZGUgPSBOU19WMl9MRURfT047CisKKwluczJfbGVkX3NldF9tb2RlKGxlZF9kYXQsIG1vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBuczJfbGVkX3NhdGFfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGVuYWJsZTsKKwllbnVtIG5zMl9sZWRfbW9kZXMgbW9kZTsKKwlzdHJ1Y3QgbnMyX2xlZF9kYXRhICpsZWRfZGF0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJmVuYWJsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwllbmFibGUgPSAhIWVuYWJsZTsKKworCWlmIChsZWRfZGF0LT5zYXRhID09IGVuYWJsZSkKKwkJcmV0dXJuIGNvdW50OworCisJcmV0ID0gbnMyX2xlZF9nZXRfbW9kZShsZWRfZGF0LCAmbW9kZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoZW5hYmxlICYmIG1vZGUgPT0gTlNfVjJfTEVEX09OKQorCQluczJfbGVkX3NldF9tb2RlKGxlZF9kYXQsIE5TX1YyX0xFRF9TQVRBKTsKKwlpZiAoIWVuYWJsZSAmJiBtb2RlID09IE5TX1YyX0xFRF9TQVRBKQorCQluczJfbGVkX3NldF9tb2RlKGxlZF9kYXQsIE5TX1YyX0xFRF9PTik7CisKKwlsZWRfZGF0LT5zYXRhID0gZW5hYmxlOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBuczJfbGVkX3NhdGFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5zMl9sZWRfZGF0YSAqbGVkX2RhdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGxlZF9kYXQtPnNhdGEpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc2F0YSwgMDY0NCwgbnMyX2xlZF9zYXRhX3Nob3csIG5zMl9sZWRfc2F0YV9zdG9yZSk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitjcmVhdGVfbnMyX2xlZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbnMyX2xlZF9kYXRhICpsZWRfZGF0LAorCSAgICAgICBjb25zdCBzdHJ1Y3QgbnMyX2xlZCAqdGVtcGxhdGUpCit7CisJaW50IHJldDsKKwllbnVtIG5zMl9sZWRfbW9kZXMgbW9kZTsKKworCXJldCA9IGdwaW9fcmVxdWVzdCh0ZW1wbGF0ZS0+Y21kLCB0ZW1wbGF0ZS0+bmFtZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dCh0ZW1wbGF0ZS0+Y21kLAorCQkJCQkgICAgZ3Bpb19nZXRfdmFsdWUodGVtcGxhdGUtPmNtZCkpOworCQlpZiAocmV0KQorCQkJZ3Bpb19mcmVlKHRlbXBsYXRlLT5jbWQpOworCX0KKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gc2V0dXAgY29tbWFuZCBHUElPXG4iLAorCQkJdGVtcGxhdGUtPm5hbWUpOworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdCh0ZW1wbGF0ZS0+c2xvdywgdGVtcGxhdGUtPm5hbWUpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQodGVtcGxhdGUtPnNsb3csCisJCQkJCSAgICBncGlvX2dldF92YWx1ZSh0ZW1wbGF0ZS0+c2xvdykpOworCQlpZiAocmV0KQorCQkJZ3Bpb19mcmVlKHRlbXBsYXRlLT5zbG93KTsKKwl9CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZmFpbGVkIHRvIHNldHVwIHNsb3cgR1BJT1xuIiwKKwkJCXRlbXBsYXRlLT5uYW1lKTsKKwkJZ290byBlcnJfZnJlZV9jbWQ7CisJfQorCisJcndsb2NrX2luaXQoJmxlZF9kYXQtPnJ3X2xvY2spOworCisJbGVkX2RhdC0+Y2Rldi5uYW1lID0gdGVtcGxhdGUtPm5hbWU7CisJbGVkX2RhdC0+Y2Rldi5kZWZhdWx0X3RyaWdnZXIgPSB0ZW1wbGF0ZS0+ZGVmYXVsdF90cmlnZ2VyOworCWxlZF9kYXQtPmNkZXYuYmxpbmtfc2V0ID0gTlVMTDsKKwlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gbnMyX2xlZF9zZXQ7CisJbGVkX2RhdC0+Y2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOworCWxlZF9kYXQtPmNtZCA9IHRlbXBsYXRlLT5jbWQ7CisJbGVkX2RhdC0+c2xvdyA9IHRlbXBsYXRlLT5zbG93OworCisJcmV0ID0gbnMyX2xlZF9nZXRfbW9kZShsZWRfZGF0LCAmbW9kZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfc2xvdzsKKworCS8qIFNldCBMRUQgaW5pdGlhbCBzdGF0ZS4gKi8KKwlsZWRfZGF0LT5zYXRhID0gKG1vZGUgPT0gTlNfVjJfTEVEX1NBVEEpID8gMSA6IDA7CisJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzID0KKwkJKG1vZGUgPT0gTlNfVjJfTEVEX09GRikgPyBMRURfT0ZGIDogTEVEX0ZVTEw7CisKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmxlZF9kYXQtPmNkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX3Nsb3c7CisKKwlkZXZfc2V0X2RydmRhdGEobGVkX2RhdC0+Y2Rldi5kZXYsIGxlZF9kYXQpOworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShsZWRfZGF0LT5jZGV2LmRldiwgJmRldl9hdHRyX3NhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX2NkZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfY2RldjoKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbGVkX2RhdC0+Y2Rldik7CitlcnJfZnJlZV9zbG93OgorCWdwaW9fZnJlZShsZWRfZGF0LT5zbG93KTsKK2Vycl9mcmVlX2NtZDoKKwlncGlvX2ZyZWUobGVkX2RhdC0+Y21kKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkZWxldGVfbnMyX2xlZChzdHJ1Y3QgbnMyX2xlZF9kYXRhICpsZWRfZGF0KQoreworCWRldmljZV9yZW1vdmVfZmlsZShsZWRfZGF0LT5jZGV2LmRldiwgJmRldl9hdHRyX3NhdGEpOworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsZWRfZGF0LT5jZGV2KTsKKwlncGlvX2ZyZWUobGVkX2RhdC0+Y21kKTsKKwlncGlvX2ZyZWUobGVkX2RhdC0+c2xvdyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5zMl9sZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbnMyX2xlZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBuczJfbGVkX2RhdGEgKmxlZHNfZGF0YTsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZWRzX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbnMyX2xlZF9kYXRhKSAqCisJCQkgICAgcGRhdGEtPm51bV9sZWRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxlZHNfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9sZWRzOyBpKyspIHsKKwkJcmV0ID0gY3JlYXRlX25zMl9sZWQocGRldiwgJmxlZHNfZGF0YVtpXSwgJnBkYXRhLT5sZWRzW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGxlZHNfZGF0YSk7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkKKwkJZGVsZXRlX25zMl9sZWQoJmxlZHNfZGF0YVtpXSk7CisKKwlrZnJlZShsZWRzX2RhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbnMyX2xlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbnMyX2xlZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBuczJfbGVkX2RhdGEgKmxlZHNfZGF0YTsKKworCWxlZHNfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKQorCQlkZWxldGVfbnMyX2xlZCgmbGVkc19kYXRhW2ldKTsKKworCWtmcmVlKGxlZHNfZGF0YSk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnMyX2xlZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG5zMl9sZWRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuczJfbGVkX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxlZHMtbnMyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmxlZHMtbnMyIik7CisKK3N0YXRpYyBpbnQgX19pbml0IG5zMl9sZWRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm5zMl9sZWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5zMl9sZWRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZuczJfbGVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5zMl9sZWRfaW5pdCk7Cittb2R1bGVfZXhpdChuczJfbGVkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTaW1vbiBHdWlub3QgPHNndWlub3RAbGFjaWUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXR3b3JrIFNwYWNlIHYyIExFRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19zeXNmcy5jCmluZGV4IDY5OTljZTUuLjYwMjQwMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fc3lzZnMuYwpAQCAtNDEsMTAgKzQxLDcgQEAKIHN0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgICBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZkZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQlpbnQgbGVuOwotCi0JbGVuID0gb2ZfZGV2aWNlX2dldF9tb2RhbGlhcyhvZmRldiwgYnVmLCBQQUdFX1NJWkUgLSAyKTsKKwlpbnQgbGVuID0gb2ZfZGV2aWNlX2dldF9tb2RhbGlhcyhkZXYsIGJ1ZiwgUEFHRV9TSVpFIC0gMik7CiAKIAlidWZbbGVuXSA9ICdcbic7CiAJYnVmW2xlbisxXSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0lSL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL0lSL0tjb25maWcKaW5kZXggZDIyYThlYy4uOTk5YTgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9JUi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvSVIvS2NvbmZpZwpAQCAtOCw2ICs4LDE3IEBACiAJZGVwZW5kcyBvbiBJUl9DT1JFCiAJZGVmYXVsdCBJUl9DT1JFCiAKK2NvbmZpZyBMSVJDCisJdHJpc3RhdGUKKwlkZWZhdWx0IHkKKworCS0tLWhlbHAtLS0KKwkgICBFbmFibGUgdGhpcyBvcHRpb24gdG8gYnVpbGQgdGhlIExpbnV4IEluZnJhcmVkIFJlbW90ZQorCSAgIENvbnRyb2wgKExJUkMpIGNvcmUgZGV2aWNlIGludGVyZmFjZSBkcml2ZXIuIFRoZSBMSVJDCisJICAgaW50ZXJmYWNlIHBhc3NlcyByYXcgSVIgdG8gYW5kIGZyb20gdXNlcnNwYWNlLCB3aGVyZSB0aGUKKwkgICBMSVJDIGRhZW1vbiBoYW5kbGVzIHByb3RvY29sIGRlY29kaW5nIGZvciBJUiByZWNlcHRpb24gYW5uCisJICAgZW5jb2RpbmcgZm9yIElSIHRyYW5zbWl0dGluZyAoYWthICJibGFzdGluZyIpLgorCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9LY29uZmlnIgogCiBjb25maWcgSVJfTkVDX0RFQ09ERVIKQEAgLTMzLDYgKzQ0LDcgQEAKIGNvbmZpZyBJUl9SQzZfREVDT0RFUgogCXRyaXN0YXRlICJFbmFibGUgSVIgcmF3IGRlY29kZXIgZm9yIHRoZSBSQzYgcHJvdG9jb2wiCiAJZGVwZW5kcyBvbiBJUl9DT1JFCisJc2VsZWN0IEJJVFJFVkVSU0UKIAlkZWZhdWx0IHkKIAogCS0tLWhlbHAtLS0KQEAgLTQyLDYgKzU0LDcgQEAKIGNvbmZpZyBJUl9KVkNfREVDT0RFUgogCXRyaXN0YXRlICJFbmFibGUgSVIgcmF3IGRlY29kZXIgZm9yIHRoZSBKVkMgcHJvdG9jb2wiCiAJZGVwZW5kcyBvbiBJUl9DT1JFCisJc2VsZWN0IEJJVFJFVkVSU0UKIAlkZWZhdWx0IHkKIAogCS0tLWhlbHAtLS0KQEAgLTU3LDYgKzcwLDE2IEBACiAJICAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGFuIGluZnJhcmVkIHJlbW90ZSBjb250cm9sIHdoaWNoCiAJICAgdXNlcyB0aGUgU29ueSBwcm90b2NvbCwgYW5kIHlvdSBuZWVkIHNvZnR3YXJlIGRlY29kaW5nIHN1cHBvcnQuCiAKK2NvbmZpZyBJUl9MSVJDX0NPREVDCisJdHJpc3RhdGUgIkVuYWJsZSBJUiB0byBMSVJDIGJyaWRnZSIKKwlkZXBlbmRzIG9uIElSX0NPUkUKKwlkZXBlbmRzIG9uIExJUkMKKwlkZWZhdWx0IHkKKworCS0tLWhlbHAtLS0KKwkgICBFbmFibGUgdGhpcyBvcHRpb24gdG8gcGFzcyByYXcgSVIgdG8gYW5kIGZyb20gdXNlcnNwYWNlIHZpYQorCSAgIHRoZSBMSVJDIGludGVyZmFjZS4KKwogY29uZmlnIElSX0lNT04KIAl0cmlzdGF0ZSAiU291bmRHcmFwaCBpTU9OIFJlY2VpdmVyIGFuZCBEaXNwbGF5IgogCWRlcGVuZHMgb24gVVNCX0FSQ0hfSEFTX0hDRApAQCAtNjgsMyArOTEsMTUgQEAKIAogCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpbW9uLgorCitjb25maWcgSVJfTUNFVVNCCisJdHJpc3RhdGUgIldpbmRvd3MgTWVkaWEgQ2VudGVyIEVkLiBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciIKKwlkZXBlbmRzIG9uIFVTQl9BUkNIX0hBU19IQ0QKKwlkZXBlbmRzIG9uIElSX0NPUkUKKwlzZWxlY3QgVVNCCisJLS0taGVscC0tLQorCSAgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgV2luZG93cyBNZWRpYSBDZW50ZXIgRWRpdGlvbgorCSAgIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyLgorCisJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1jZXVzYi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL0lSL01ha2VmaWxlCmluZGV4IGI5OThmY2MuLjJhZTRmM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvSVIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9NYWtlZmlsZQpAQCAtNSwxMSArNSwxNCBAQAogCiBvYmotJChDT05GSUdfSVJfQ09SRSkgKz0gaXItY29yZS5vCiBvYmotJChDT05GSUdfVklERU9fSVIpICs9IGlyLWNvbW1vbi5vCitvYmotJChDT05GSUdfTElSQykgKz0gbGlyY19kZXYubwogb2JqLSQoQ09ORklHX0lSX05FQ19ERUNPREVSKSArPSBpci1uZWMtZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSVJfUkM1X0RFQ09ERVIpICs9IGlyLXJjNS1kZWNvZGVyLm8KIG9iai0kKENPTkZJR19JUl9SQzZfREVDT0RFUikgKz0gaXItcmM2LWRlY29kZXIubwogb2JqLSQoQ09ORklHX0lSX0pWQ19ERUNPREVSKSArPSBpci1qdmMtZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSVJfU09OWV9ERUNPREVSKSArPSBpci1zb255LWRlY29kZXIubworb2JqLSQoQ09ORklHX0lSX0xJUkNfQ09ERUMpICs9IGlyLWxpcmMtY29kZWMubwogCiAjIHN0YW5kLWFsb25lIElSIHJlY2VpdmVycy90cmFuc21pdHRlcnMKIG9iai0kKENPTkZJR19JUl9JTU9OKSArPSBpbW9uLm8KK29iai0kKENPTkZJR19JUl9NQ0VVU0IpICs9IG1jZXVzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0lSL2ltb24uYyBiL2RyaXZlcnMvbWVkaWEvSVIvaW1vbi5jCmluZGV4IDRiYmQ0NWYuLjY1YzEyNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvSVIvaW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvSVIvaW1vbi5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAlzdHJ1Y3QgaW1vbl9jb250ZXh0ICppY3R4ID0gTlVMTDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWljdHggPSAoc3RydWN0IGltb25fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKCFpY3R4KSB7CiAJCWVycigiJXM6IG5vIGNvbnRleHQgZm9yIGRldmljZSIsIF9fZnVuY19fKTsKQEAgLTgxMiw3ICs4MTIsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgdmZkX3BhY2tldDZbXSA9IHsKIAkJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiB9OwogCi0JaWN0eCA9IChzdHJ1Y3QgaW1vbl9jb250ZXh0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCFpY3R4KSB7CiAJCWVycigiJXM6IG5vIGNvbnRleHQgZm9yIGRldmljZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC04OTYsNyArODk2LDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgaW1vbl9jb250ZXh0ICppY3R4OwogCi0JaWN0eCA9IChzdHJ1Y3QgaW1vbl9jb250ZXh0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCFpY3R4KSB7CiAJCWVycigiJXM6IG5vIGNvbnRleHQgZm9yIGRldmljZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xOTQzLDcgKzE5NDMsNyBAQAogCXJldHVybiBpY3R4OwogCiB1cmJfc3VibWl0X2ZhaWxlZDoKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpY3R4LT5pZGV2KTsKKwlpcl9pbnB1dF91bnJlZ2lzdGVyKGljdHgtPmlkZXYpOwogCWlucHV0X2ZyZWVfZGV2aWNlKGljdHgtPmlkZXYpOwogaWRldl9zZXR1cF9mYWlsZWQ6CiBmaW5kX2VuZHBvaW50X2ZhaWxlZDoKQEAgLTIwNjcsNiArMjA2Nyw3IEBACiAJCWRldGVjdGVkX2Rpc3BsYXlfdHlwZSA9IElNT05fRElTUExBWV9UWVBFX1ZGRDsKIAkJYnJlYWs7CiAJLyogaU1PTiBMQ0QsIE1DRSBJUiAqLworCWNhc2UgMHg5ZToKIAljYXNlIDB4OWY6CiAJCWRldl9pbmZvKGljdHgtPmRldiwgIjB4ZmZkYyBpTU9OIExDRCwgTUNFIElSIik7CiAJCWRldGVjdGVkX2Rpc3BsYXlfdHlwZSA9IElNT05fRElTUExBWV9UWVBFX0xDRDsKQEAgLTIzMDYsNyArMjMwNyw3IEBACiAJaWYgKGlmbnVtID09IDApIHsKIAkJaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjAgPSBmYWxzZTsKIAkJdXNiX2tpbGxfdXJiKGljdHgtPnJ4X3VyYl9pbnRmMCk7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGljdHgtPmlkZXYpOworCQlpcl9pbnB1dF91bnJlZ2lzdGVyKGljdHgtPmlkZXYpOwogCQlpZiAoaWN0eC0+ZGlzcGxheV9zdXBwb3J0ZWQpIHsKIAkJCWlmIChpY3R4LT5kaXNwbGF5X3R5cGUgPT0gSU1PTl9ESVNQTEFZX1RZUEVfTENEKQogCQkJCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZpbW9uX2xjZF9jbGFzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0lSL2lyLWNvcmUtcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9JUi9pci1jb3JlLXByaXYuaAppbmRleCA5YTVlNjVhLi5iYWJkNTIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9JUi9pci1jb3JlLXByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL0lSL2lyLWNvcmUtcHJpdi5oCkBAIC0yMiwxNyArMjIsNjIgQEAKIHN0cnVjdCBpcl9yYXdfaGFuZGxlciB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCisJdTY0IHByb3RvY29sczsgLyogd2hpY2ggYXJlIGhhbmRsZWQgYnkgdGhpcyBoYW5kbGVyICovCiAJaW50ICgqZGVjb2RlKShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCBpcl9yYXdfZXZlbnQgZXZlbnQpOworCisJLyogVGhlc2UgdHdvIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGxpcmMgZGVjb2RlciAqLwogCWludCAoKnJhd19yZWdpc3Rlcikoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KTsKIAlpbnQgKCpyYXdfdW5yZWdpc3Rlcikoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KTsKIH07CiAKIHN0cnVjdCBpcl9yYXdfZXZlbnRfY3RybCB7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsJCS8qIHRvIGtlZXAgdHJhY2sgb2YgcmF3IGNsaWVudHMgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXJ4X3dvcms7CS8qIGZvciB0aGUgcnggZGVjb2Rpbmcgd29ya3F1ZXVlICovCiAJc3RydWN0IGtmaWZvCQkJa2ZpZm87CQkvKiBmaWZvIGZvciB0aGUgcHVsc2Uvc3BhY2UgZHVyYXRpb25zICovCiAJa3RpbWVfdAkJCQlsYXN0X2V2ZW50OwkvKiB3aGVuIGxhc3QgZXZlbnQgb2NjdXJyZWQgKi8KIAllbnVtIHJhd19ldmVudF90eXBlCQlsYXN0X3R5cGU7CS8qIGxhc3QgZXZlbnQgdHlwZSAqLwogCXN0cnVjdCBpbnB1dF9kZXYJCSppbnB1dF9kZXY7CS8qIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBpbnB1dF9kZXYgKi8KKwl1NjQJCQkJZW5hYmxlZF9wcm90b2NvbHM7IC8qIGVuYWJsZWQgcmF3IHByb3RvY29sIGRlY29kZXJzICovCisKKwkvKiByYXcgZGVjb2RlciBzdGF0ZSBmb2xsb3dzICovCisJc3RydWN0IGlyX3Jhd19ldmVudCBwcmV2X2V2OworCXN0cnVjdCBuZWNfZGVjIHsKKwkJaW50IHN0YXRlOworCQl1bnNpZ25lZCBjb3VudDsKKwkJdTMyIGJpdHM7CisJfSBuZWM7CisJc3RydWN0IHJjNV9kZWMgeworCQlpbnQgc3RhdGU7CisJCXUzMiBiaXRzOworCQl1bnNpZ25lZCBjb3VudDsKKwkJdW5zaWduZWQgd2FudGVkX2JpdHM7CisJfSByYzU7CisJc3RydWN0IHJjNl9kZWMgeworCQlpbnQgc3RhdGU7CisJCXU4IGhlYWRlcjsKKwkJdTMyIGJvZHk7CisJCWJvb2wgdG9nZ2xlOworCQl1bnNpZ25lZCBjb3VudDsKKwkJdW5zaWduZWQgd2FudGVkX2JpdHM7CisJfSByYzY7CisJc3RydWN0IHNvbnlfZGVjIHsKKwkJaW50IHN0YXRlOworCQl1MzIgYml0czsKKwkJdW5zaWduZWQgY291bnQ7CisJfSBzb255OworCXN0cnVjdCBqdmNfZGVjIHsKKwkJaW50IHN0YXRlOworCQl1MTYgYml0czsKKwkJdTE2IG9sZF9iaXRzOworCQl1bnNpZ25lZCBjb3VudDsKKwkJYm9vbCBmaXJzdDsKKwkJYm9vbCB0b2dnbGU7CisJfSBqdmM7CisJc3RydWN0IGxpcmNfY29kZWMgeworCQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXY7CisJCXN0cnVjdCBsaXJjX2RyaXZlciAqZHJ2OworCQlpbnQgbGlyY2RhdGE7CisJfSBsaXJjOwogfTsKIAogLyogbWFjcm9zIGZvciBJUiBkZWNvZGVycyAqLwpAQCAtNzQsNiArMTE5LDcgQEAKIC8qCiAgKiBSb3V0aW5lcyBmcm9tIGlyLXJhdy1ldmVudC5jIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhbmQgYnkgZGVjb2RlcnMKICAqLwordTY0IGlyX3Jhd19nZXRfYWxsb3dlZF9wcm90b2NvbHModm9pZCk7CiBpbnQgaXJfcmF3X2V2ZW50X3JlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldik7CiB2b2lkIGlyX3Jhd19ldmVudF91bnJlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldik7CiBpbnQgaXJfcmF3X2hhbmRsZXJfcmVnaXN0ZXIoc3RydWN0IGlyX3Jhd19oYW5kbGVyICppcl9yYXdfaGFuZGxlcik7CkBAIC0xMjMsNCArMTY5LDEyIEBACiAjZGVmaW5lIGxvYWRfc29ueV9kZWNvZGUoKQkwCiAjZW5kaWYKIAorLyogZnJvbSBpci1saXJjLWNvZGVjLmMgKi8KKyNpZmRlZiBDT05GSUdfSVJfTElSQ19DT0RFQ19NT0RVTEUKKyNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJcmVxdWVzdF9tb2R1bGUoImlyLWxpcmMtY29kZWMiKQorI2Vsc2UKKyNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJMAorI2VuZGlmCisKKwogI2VuZGlmIC8qIF9JUl9SQVdfRVZFTlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvaXItanZjLWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvSVIvaXItanZjLWRlY29kZXIuYwppbmRleCAwYjgwNDk0Li44ODk0ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0lSL2lyLWp2Yy1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9pci1qdmMtZGVjb2Rlci5jCkBAIC0yNSwxMCArMjUsNiBAQAogI2RlZmluZSBKVkNfVFJBSUxFUl9QVUxTRQkoMSAgKiBKVkNfVU5JVCkKICNkZWZpbmUJSlZDX1RSQUlMRVJfU1BBQ0UJKDM1ICogSlZDX1VOSVQpCiAKLS8qIFVzZWQgdG8gcmVnaXN0ZXIganZjX2RlY29kZXIgY2xpZW50cyAqLwotc3RhdGljIExJU1RfSEVBRChkZWNvZGVyX2xpc3QpOwotREVGSU5FX1NQSU5MT0NLKGRlY29kZXJfbG9jayk7Ci0KIGVudW0ganZjX3N0YXRlIHsKIAlTVEFURV9JTkFDVElWRSwKIAlTVEFURV9IRUFERVJfU1BBQ0UsCkBAIC0zOCw4NyArMzQsNiBAQAogCVNUQVRFX1RSQUlMRVJfU1BBQ0UsCiB9OwogCi1zdHJ1Y3QgZGVjb2Rlcl9kYXRhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IGlyX2lucHV0X2RldgkqaXJfZGV2OwotCWludAkJCWVuYWJsZWQ6MTsKLQotCS8qIFN0YXRlIG1hY2hpbmUgY29udHJvbCAqLwotCWVudW0ganZjX3N0YXRlCQlzdGF0ZTsKLQl1MTYJCQlqdmNfYml0czsKLQl1MTYJCQlqdmNfb2xkX2JpdHM7Ci0JdW5zaWduZWQJCWNvdW50OwotCWJvb2wJCQlmaXJzdDsKLQlib29sCQkJdG9nZ2xlOwotfTsKLQotCi0vKioKLSAqIGdldF9kZWNvZGVyX2RhdGEoKQktIGdldHMgZGVjb2RlciBkYXRhCi0gKiBAaW5wdXRfZGV2OglpbnB1dCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zIHRoZSBzdHJ1Y3QgZGVjb2Rlcl9kYXRhIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBkZXZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBkZWNvZGVyX2RhdGEgKmdldF9kZWNvZGVyX2RhdGEoc3RydWN0ICBpcl9pbnB1dF9kZXYgKmlyX2RldikKLXsKLQlzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhID0gTlVMTDsKLQotCXNwaW5fbG9jaygmZGVjb2Rlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhdGEsICZkZWNvZGVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGRhdGEtPmlyX2RldiA9PSBpcl9kZXYpCi0JCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2soJmRlY29kZXJfbG9jayk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAotCQkJICAgICBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgIHNpemVfdCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKSB8fCB2YWx1ZSA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGF0YS0+ZW5hYmxlZCA9IHZhbHVlOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhID0gZ2V0X2RlY29kZXJfZGF0YShpcl9kZXYpOwotCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChkYXRhLT5lbmFibGVkKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKLQllbHNlCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihlbmFibGVkLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19lbmFibGVkLCBzdG9yZV9lbmFibGVkKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlY29kZXJfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9lbmFibGVkLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZGVjb2Rlcl9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLm5hbWUJPSAianZjX2RlY29kZXIiLAotCS5hdHRycwk9IGRlY29kZXJfYXR0cmlidXRlcywKLX07Ci0KIC8qKgogICogaXJfanZjX2RlY29kZSgpIC0gRGVjb2RlIG9uZSBKVkMgcHVsc2Ugb3Igc3BhY2UKICAqIEBpbnB1dF9kZXY6CXRoZSBzdHJ1Y3QgaW5wdXRfZGV2IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZQpAQCAtMTI4LDE0ICs0MywxMCBAQAogICovCiBzdGF0aWMgaW50IGlyX2p2Y19kZWNvZGUoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGV2KQogewotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGE7CiAJc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRfZGV2KTsKKwlzdHJ1Y3QganZjX2RlYyAqZGF0YSA9ICZpcl9kZXYtPnJhdy0+anZjOwogCi0JZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFkYXRhLT5lbmFibGVkKQorCWlmICghKGlyX2Rldi0+cmF3LT5lbmFibGVkX3Byb3RvY29scyAmIElSX1RZUEVfSlZDKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoSVNfUkVTRVQoZXYpKSB7CkBAIC0xODgsOSArOTksOSBAQAogCQlpZiAoZXYucHVsc2UpCiAJCQlicmVhazsKIAotCQlkYXRhLT5qdmNfYml0cyA8PD0gMTsKKwkJZGF0YS0+Yml0cyA8PD0gMTsKIAkJaWYgKGVxX21hcmdpbihldi5kdXJhdGlvbiwgSlZDX0JJVF8xX1NQQUNFLCBKVkNfVU5JVCAvIDIpKSB7Ci0JCQlkYXRhLT5qdmNfYml0cyB8PSAxOworCQkJZGF0YS0+Yml0cyB8PSAxOwogCQkJZGVjcmVhc2VfZHVyYXRpb24oJmV2LCBKVkNfQklUXzFfU1BBQ0UpOwogCQl9IGVsc2UgaWYgKGVxX21hcmdpbihldi5kdXJhdGlvbiwgSlZDX0JJVF8wX1NQQUNFLCBKVkNfVU5JVCAvIDIpKQogCQkJZGVjcmVhc2VfZHVyYXRpb24oJmV2LCBKVkNfQklUXzBfU1BBQ0UpOwpAQCAtMjIzLDEzICsxMzQsMTMgQEAKIAogCQlpZiAoZGF0YS0+Zmlyc3QpIHsKIAkJCXUzMiBzY2FuY29kZTsKLQkJCXNjYW5jb2RlID0gKGJpdHJldjgoKGRhdGEtPmp2Y19iaXRzID4+IDgpICYgMHhmZikgPDwgOCkgfAotCQkJCSAgIChiaXRyZXY4KChkYXRhLT5qdmNfYml0cyA+PiAwKSAmIDB4ZmYpIDw8IDApOworCQkJc2NhbmNvZGUgPSAoYml0cmV2OCgoZGF0YS0+Yml0cyA+PiA4KSAmIDB4ZmYpIDw8IDgpIHwKKwkJCQkgICAoYml0cmV2OCgoZGF0YS0+Yml0cyA+PiAwKSAmIDB4ZmYpIDw8IDApOwogCQkJSVJfZHByaW50aygxLCAiSlZDIHNjYW5jb2RlIDB4JTA0eFxuIiwgc2NhbmNvZGUpOwogCQkJaXJfa2V5ZG93bihpbnB1dF9kZXYsIHNjYW5jb2RlLCBkYXRhLT50b2dnbGUpOwogCQkJZGF0YS0+Zmlyc3QgPSBmYWxzZTsKLQkJCWRhdGEtPmp2Y19vbGRfYml0cyA9IGRhdGEtPmp2Y19iaXRzOwotCQl9IGVsc2UgaWYgKGRhdGEtPmp2Y19iaXRzID09IGRhdGEtPmp2Y19vbGRfYml0cykgeworCQkJZGF0YS0+b2xkX2JpdHMgPSBkYXRhLT5iaXRzOworCQl9IGVsc2UgaWYgKGRhdGEtPmJpdHMgPT0gZGF0YS0+b2xkX2JpdHMpIHsKIAkJCUlSX2RwcmludGsoMSwgIkpWQyByZXBlYXRcbiIpOwogCQkJaXJfcmVwZWF0KGlucHV0X2Rldik7CiAJCX0gZWxzZSB7CkBAIC0yNDksNTQgKzE2MCw5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgaXJfanZjX3JlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOwotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGE7Ci0JaW50IHJjOwotCi0JcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlyX2Rldi0+ZGV2LmtvYmosICZkZWNvZGVyX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKSB7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmaXJfZGV2LT5kZXYua29iaiwgJmRlY29kZXJfYXR0cmlidXRlX2dyb3VwKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZGF0YS0+aXJfZGV2ID0gaXJfZGV2OwotCWRhdGEtPmVuYWJsZWQgPSAxOwotCi0Jc3Bpbl9sb2NrKCZkZWNvZGVyX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmRhdGEtPmxpc3QsICZkZWNvZGVyX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZkZWNvZGVyX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXJfanZjX3VucmVnaXN0ZXIoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQotewotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7Ci0Jc3RhdGljIHN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGE7Ci0KLQlkYXRhID0gZ2V0X2RlY29kZXJfZGF0YShpcl9kZXYpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIDA7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmlyX2Rldi0+ZGV2LmtvYmosICZkZWNvZGVyX2F0dHJpYnV0ZV9ncm91cCk7Ci0KLQlzcGluX2xvY2soJmRlY29kZXJfbG9jayk7Ci0JbGlzdF9kZWwoJmRhdGEtPmxpc3QpOwotCXNwaW5fdW5sb2NrKCZkZWNvZGVyX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJfcmF3X2hhbmRsZXIganZjX2hhbmRsZXIgPSB7CisJLnByb3RvY29scwk9IElSX1RZUEVfSlZDLAogCS5kZWNvZGUJCT0gaXJfanZjX2RlY29kZSwKLQkucmF3X3JlZ2lzdGVyCT0gaXJfanZjX3JlZ2lzdGVyLAotCS5yYXdfdW5yZWdpc3Rlcgk9IGlyX2p2Y191bnJlZ2lzdGVyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXJfanZjX2RlY29kZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0lSL2lyLWtleXRhYmxlLmMgYi9kcml2ZXJzL21lZGlhL0lSL2lyLWtleXRhYmxlLmMKaW5kZXggOTRhODU3Ny4uMTVhMGYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9JUi9pci1rZXl0YWJsZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvSVIvaXIta2V5dGFibGUuYwpAQCAtNDk3LDggKzQ5Nyw5IEBACiAJCQkJZ290byBvdXRfZXZlbnQ7CiAJCX0KIAotCUlSX2RwcmludGsoMSwgIlJlZ2lzdGVyZWQgaW5wdXQgZGV2aWNlIG9uICVzIGZvciAlcyByZW1vdGUuXG4iLAotCQkgICBkcml2ZXJfbmFtZSwgcmNfdGFiLT5uYW1lKTsKKwlJUl9kcHJpbnRrKDEsICJSZWdpc3RlcmVkIGlucHV0IGRldmljZSBvbiAlcyBmb3IgJXMgcmVtb3RlJXMuXG4iLAorCQkgICBkcml2ZXJfbmFtZSwgcmNfdGFiLT5uYW1lLAorCQkgICBpcl9kZXYtPnByb3BzLT5kcml2ZXJfdHlwZSA9PSBSQ19EUklWRVJfSVJfUkFXID8gIiBpbiByYXcgbW9kZSIgOiAiIik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9JUi9pci1saXJjLWNvZGVjLmMgYi9kcml2ZXJzL21lZGlhL0lSL2lyLWxpcmMtY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE0ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9pci1saXJjLWNvZGVjLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qIGlyLWxpcmMtY29kZWMuYyAtIGlyLWNvcmUgdG8gY2xhc3NpYyBsaXJjIGludGVyZmFjZSBicmlkZ2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgorI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvaXItY29yZS5oPgorI2luY2x1ZGUgImlyLWNvcmUtcHJpdi5oIgorCisjZGVmaW5lIExJUkNCVUZfU0laRSAyNTYKKworLyoqCisgKiBpcl9saXJjX2RlY29kZSgpIC0gU2VuZCByYXcgSVIgZGF0YSB0byBsaXJjX2RldiB0byBiZSByZWxheWVkIHRvIHRoZQorICoJCSAgICAgIGxpcmNkIHVzZXJzcGFjZSBkYWVtb24gZm9yIGRlY29kaW5nLgorICogQGlucHV0X2RldjoJdGhlIHN0cnVjdCBpbnB1dF9kZXYgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlCisgKiBAZHVyYXRpb246CXRoZSBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGRlc2NyaXB0b3Igb2YgdGhlIHB1bHNlL3NwYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FSU5WQUwgaWYgdGhlIGxpcmMgaW50ZXJmYWNlcyBhcmVuJ3Qgd2lyZWQgdXAuCisgKi8KK3N0YXRpYyBpbnQgaXJfbGlyY19kZWNvZGUoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGV2KQoreworCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7CisKKwlpZiAoIShpcl9kZXYtPnJhdy0+ZW5hYmxlZF9wcm90b2NvbHMgJiBJUl9UWVBFX0xJUkMpKQorCQlyZXR1cm4gMDsKKworCWlmICghaXJfZGV2LT5yYXctPmxpcmMuZHJ2IHx8ICFpcl9kZXYtPnJhdy0+bGlyYy5kcnYtPnJidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJSVJfZHByaW50aygyLCAiTElSQyBkYXRhIHRyYW5zZmVyIHN0YXJ0ZWQgKCV1dXMgJXMpXG4iLAorCQkgICBUT19VUyhldi5kdXJhdGlvbiksIFRPX1NUUihldi5wdWxzZSkpOworCisJaXJfZGV2LT5yYXctPmxpcmMubGlyY2RhdGEgKz0gZXYuZHVyYXRpb24gLyAxMDAwOworCWlmIChldi5wdWxzZSkKKwkJaXJfZGV2LT5yYXctPmxpcmMubGlyY2RhdGEgfD0gUFVMU0VfQklUOworCisJbGlyY19idWZmZXJfd3JpdGUoaXJfZGV2LT5yYXctPmxpcmMuZHJ2LT5yYnVmLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmaXJfZGV2LT5yYXctPmxpcmMubGlyY2RhdGEpOworCXdha2VfdXAoJmlyX2Rldi0+cmF3LT5saXJjLmRydi0+cmJ1Zi0+d2FpdF9wb2xsKTsKKworCWlyX2Rldi0+cmF3LT5saXJjLmxpcmNkYXRhID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBpcl9saXJjX3RyYW5zbWl0X2lyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IG4sIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbGlyY19jb2RlYyAqbGlyYzsKKwlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXY7CisJaW50ICp0eGJ1ZjsgLyogYnVmZmVyIHdpdGggdmFsdWVzIHRvIHRyYW5zbWl0ICovCisJaW50IHJldCA9IDAsIGNvdW50OworCisJbGlyYyA9IGxpcmNfZ2V0X3BkYXRhKGZpbGUpOworCWlmICghbGlyYykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobiAlIHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50ID0gbiAvIHNpemVvZihpbnQpOworCWlmIChjb3VudCA+IExJUkNCVUZfU0laRSB8fCBjb3VudCAlIDIgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eGJ1ZiA9IG1lbWR1cF91c2VyKGJ1Ziwgbik7CisJaWYgKElTX0VSUih0eGJ1ZikpCisJCXJldHVybiBQVFJfRVJSKHR4YnVmKTsKKworCWlyX2RldiA9IGxpcmMtPmlyX2RldjsKKwlpZiAoIWlyX2RldikgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaXJfZGV2LT5wcm9wcyAmJiBpcl9kZXYtPnByb3BzLT50eF9pcikKKwkJcmV0ID0gaXJfZGV2LT5wcm9wcy0+dHhfaXIoaXJfZGV2LT5wcm9wcy0+cHJpdiwgdHhidWYsICh1MzIpbik7CisKK291dDoKKwlrZnJlZSh0eGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgaXJfbGlyY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBsaXJjX2NvZGVjICpsaXJjOworCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldjsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICpkcnZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWxpcmMgPSBsaXJjX2dldF9wZGF0YShmaWxlcCk7CisJaWYgKCFsaXJjKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlyX2RldiA9IGxpcmMtPmlyX2RldjsKKwlpZiAoIWlyX2RldiB8fCAhaXJfZGV2LT5wcm9wcyB8fCAhaXJfZGV2LT5wcm9wcy0+cHJpdikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkcnZfZGF0YSA9IGlyX2Rldi0+cHJvcHMtPnByaXY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTElSQ19TRVRfVFJBTlNNSVRURVJfTUFTSzoKKwkJcmV0ID0gZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChpcl9kZXYtPnByb3BzICYmIGlyX2Rldi0+cHJvcHMtPnNfdHhfbWFzaykKKwkJCXJldCA9IGlyX2Rldi0+cHJvcHMtPnNfdHhfbWFzayhkcnZfZGF0YSwgKHUzMil2YWwpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIExJUkNfU0VUX1NFTkRfQ0FSUklFUjoKKwkJcmV0ID0gZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChpcl9kZXYtPnByb3BzICYmIGlyX2Rldi0+cHJvcHMtPnNfdHhfY2FycmllcikKKwkJCWlyX2Rldi0+cHJvcHMtPnNfdHhfY2FycmllcihkcnZfZGF0YSwgKHUzMil2YWwpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIExJUkNfR0VUX1NFTkRfTU9ERToKKwkJdmFsID0gTElSQ19DQU5fU0VORF9QVUxTRSAmIExJUkNfQ0FOX1NFTkRfTUFTSzsKKwkJcmV0ID0gcHV0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBMSVJDX1NFVF9TRU5EX01PREU6CisJCXJldCA9IGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAodmFsICE9IChMSVJDX01PREVfUFVMU0UgJiBMSVJDX0NBTl9TRU5EX01BU0spKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxpcmNfZGV2X2ZvcF9pb2N0bChmaWxlcCwgY21kLCBhcmcpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXJfbGlyY19vcGVuKHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlyX2xpcmNfY2xvc2Uodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpcmNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLndyaXRlCQk9IGlyX2xpcmNfdHJhbnNtaXRfaXIsCisJLnVubG9ja2VkX2lvY3RsCT0gaXJfbGlyY19pb2N0bCwKKwkucmVhZAkJPSBsaXJjX2Rldl9mb3BfcmVhZCwKKwkucG9sbAkJPSBsaXJjX2Rldl9mb3BfcG9sbCwKKwkub3BlbgkJPSBsaXJjX2Rldl9mb3Bfb3BlbiwKKwkucmVsZWFzZQk9IGxpcmNfZGV2X2ZvcF9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgaXJfbGlyY19yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCit7CisJc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRfZGV2KTsKKwlzdHJ1Y3QgbGlyY19kcml2ZXIgKmRydjsKKwlzdHJ1Y3QgbGlyY19idWZmZXIgKnJidWY7CisJaW50IHJjID0gLUVOT01FTTsKKwl1bnNpZ25lZCBsb25nIGZlYXR1cmVzOworCisJZHJ2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnYpCisJCXJldHVybiByYzsKKworCXJidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJidWYpCisJCWdvdG8gcmJ1Zl9hbGxvY19mYWlsZWQ7CisKKwlyYyA9IGxpcmNfYnVmZmVyX2luaXQocmJ1Ziwgc2l6ZW9mKGludCksIExJUkNCVUZfU0laRSk7CisJaWYgKHJjKQorCQlnb3RvIHJidWZfaW5pdF9mYWlsZWQ7CisKKwlmZWF0dXJlcyA9IExJUkNfQ0FOX1JFQ19NT0RFMjsKKwlpZiAoaXJfZGV2LT5wcm9wcy0+dHhfaXIpIHsKKwkJZmVhdHVyZXMgfD0gTElSQ19DQU5fU0VORF9QVUxTRTsKKwkJaWYgKGlyX2Rldi0+cHJvcHMtPnNfdHhfbWFzaykKKwkJCWZlYXR1cmVzIHw9IExJUkNfQ0FOX1NFVF9UUkFOU01JVFRFUl9NQVNLOworCQlpZiAoaXJfZGV2LT5wcm9wcy0+c190eF9jYXJyaWVyKQorCQkJZmVhdHVyZXMgfD0gTElSQ19DQU5fU0VUX1NFTkRfQ0FSUklFUjsKKwl9CisKKwlzbnByaW50ZihkcnYtPm5hbWUsIHNpemVvZihkcnYtPm5hbWUpLCAiaXItbGlyYy1jb2RlYyAoJXMpIiwKKwkJIGlyX2Rldi0+ZHJpdmVyX25hbWUpOworCWRydi0+bWlub3IgPSAtMTsKKwlkcnYtPmZlYXR1cmVzID0gZmVhdHVyZXM7CisJZHJ2LT5kYXRhID0gJmlyX2Rldi0+cmF3LT5saXJjOworCWRydi0+cmJ1ZiA9IHJidWY7CisJZHJ2LT5zZXRfdXNlX2luYyA9ICZpcl9saXJjX29wZW47CisJZHJ2LT5zZXRfdXNlX2RlYyA9ICZpcl9saXJjX2Nsb3NlOworCWRydi0+Y29kZV9sZW5ndGggPSBzaXplb2Yoc3RydWN0IGlyX3Jhd19ldmVudCkgKiA4OworCWRydi0+Zm9wcyA9ICZsaXJjX2ZvcHM7CisJZHJ2LT5kZXYgPSAmaXJfZGV2LT5kZXY7CisJZHJ2LT5vd25lciA9IFRISVNfTU9EVUxFOworCisJZHJ2LT5taW5vciA9IGxpcmNfcmVnaXN0ZXJfZHJpdmVyKGRydik7CisJaWYgKGRydi0+bWlub3IgPCAwKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBsaXJjX3JlZ2lzdGVyX2ZhaWxlZDsKKwl9CisKKwlpcl9kZXYtPnJhdy0+bGlyYy5kcnYgPSBkcnY7CisJaXJfZGV2LT5yYXctPmxpcmMuaXJfZGV2ID0gaXJfZGV2OworCWlyX2Rldi0+cmF3LT5saXJjLmxpcmNkYXRhID0gUFVMU0VfTUFTSzsKKworCXJldHVybiAwOworCitsaXJjX3JlZ2lzdGVyX2ZhaWxlZDoKK3JidWZfaW5pdF9mYWlsZWQ6CisJa2ZyZWUocmJ1Zik7CityYnVmX2FsbG9jX2ZhaWxlZDoKKwlrZnJlZShkcnYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlyX2xpcmNfdW5yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCit7CisJc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRfZGV2KTsKKwlzdHJ1Y3QgbGlyY19jb2RlYyAqbGlyYyA9ICZpcl9kZXYtPnJhdy0+bGlyYzsKKworCWxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIobGlyYy0+ZHJ2LT5taW5vcik7CisJbGlyY19idWZmZXJfZnJlZShsaXJjLT5kcnYtPnJidWYpOworCWtmcmVlKGxpcmMtPmRydik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcl9yYXdfaGFuZGxlciBsaXJjX2hhbmRsZXIgPSB7CisJLnByb3RvY29scwk9IElSX1RZUEVfTElSQywKKwkuZGVjb2RlCQk9IGlyX2xpcmNfZGVjb2RlLAorCS5yYXdfcmVnaXN0ZXIJPSBpcl9saXJjX3JlZ2lzdGVyLAorCS5yYXdfdW5yZWdpc3Rlcgk9IGlyX2xpcmNfdW5yZWdpc3RlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlyX2xpcmNfY29kZWNfaW5pdCh2b2lkKQoreworCWlyX3Jhd19oYW5kbGVyX3JlZ2lzdGVyKCZsaXJjX2hhbmRsZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSVIgTElSQyBicmlkZ2UgaGFuZGxlciBpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcl9saXJjX2NvZGVjX2V4aXQodm9pZCkKK3sKKwlpcl9yYXdfaGFuZGxlcl91bnJlZ2lzdGVyKCZsaXJjX2hhbmRsZXIpOworfQorCittb2R1bGVfaW5pdChpcl9saXJjX2NvZGVjX2luaXQpOworbW9kdWxlX2V4aXQoaXJfbGlyY19jb2RlY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBJbmMuIChodHRwOi8vd3d3LnJlZGhhdC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxJUkMgSVIgaGFuZGxlciBicmlkZ2UiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvaXItbmVjLWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvSVIvaXItbmVjLWRlY29kZXIuYwppbmRleCBiYTc5MjMzLi41MmUwZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0lSL2lyLW5lYy1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9pci1uZWMtZGVjb2Rlci5jCkBAIC0yNywxMCArMjcsNiBAQAogI2RlZmluZQlORUNfVFJBSUxFUl9QVUxTRQkoMSAgKiBORUNfVU5JVCkKICNkZWZpbmUJTkVDX1RSQUlMRVJfU1BBQ0UJKDEwICogTkVDX1VOSVQpIC8qIGV2ZW4gbG9uZ2VyIGluIHJlYWxpdHkgKi8KIAotLyogVXNlZCB0byByZWdpc3RlciBuZWNfZGVjb2RlciBjbGllbnRzICovCi1zdGF0aWMgTElTVF9IRUFEKGRlY29kZXJfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRlY29kZXJfbG9jayk7Ci0KIGVudW0gbmVjX3N0YXRlIHsKIAlTVEFURV9JTkFDVElWRSwKIAlTVEFURV9IRUFERVJfU1BBQ0UsCkBAIC00MCw4NCArMzYsNiBAQAogCVNUQVRFX1RSQUlMRVJfU1BBQ0UsCiB9OwogCi1zdHJ1Y3QgZGVjb2Rlcl9kYXRhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IGlyX2lucHV0X2RldgkqaXJfZGV2OwotCWludAkJCWVuYWJsZWQ6MTsKLQotCS8qIFN0YXRlIG1hY2hpbmUgY29udHJvbCAqLwotCWVudW0gbmVjX3N0YXRlCQlzdGF0ZTsKLQl1MzIJCQluZWNfYml0czsKLQl1bnNpZ25lZAkJY291bnQ7Ci19OwotCi0KLS8qKgotICogZ2V0X2RlY29kZXJfZGF0YSgpCS0gZ2V0cyBkZWNvZGVyIGRhdGEKLSAqIEBpbnB1dF9kZXY6CWlucHV0IGRldmljZQotICoKLSAqIFJldHVybnMgdGhlIHN0cnVjdCBkZWNvZGVyX2RhdGEgdGhhdCBjb3JyZXNwb25kcyB0byBhIGRldmljZQotICovCi1zdGF0aWMgc3RydWN0IGRlY29kZXJfZGF0YSAqZ2V0X2RlY29kZXJfZGF0YShzdHJ1Y3QgIGlyX2lucHV0X2RldiAqaXJfZGV2KQotewotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGEgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZkZWNvZGVyX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJmRlY29kZXJfbGlzdCwgbGlzdCkgewotCQlpZiAoZGF0YS0+aXJfZGV2ID09IGlyX2RldikKLQkJCWJyZWFrOwotCX0KLQlzcGluX3VubG9jaygmZGVjb2Rlcl9sb2NrKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhID0gZ2V0X2RlY29kZXJfZGF0YShpcl9kZXYpOwotCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpIHx8IHZhbHVlID4gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhLT5lbmFibGVkID0gdmFsdWU7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0KLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRhdGEtPmVuYWJsZWQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwotCWVsc2UKLQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZWQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2VuYWJsZWQsIHN0b3JlX2VuYWJsZWQpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGVjb2Rlcl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX2VuYWJsZWQuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZWNvZGVyX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZQk9ICJuZWNfZGVjb2RlciIsCi0JLmF0dHJzCT0gZGVjb2Rlcl9hdHRyaWJ1dGVzLAotfTsKLQogLyoqCiAgKiBpcl9uZWNfZGVjb2RlKCkgLSBEZWNvZGUgb25lIE5FQyBwdWxzZSBvciBzcGFjZQogICogQGlucHV0X2RldjoJdGhlIHN0cnVjdCBpbnB1dF9kZXYgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlCkBAIC0xMjcsMTYgKzQ1LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgaXJfbmVjX2RlY29kZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCBpcl9yYXdfZXZlbnQgZXYpCiB7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCXN0cnVjdCBuZWNfZGVjICpkYXRhID0gJmlyX2Rldi0+cmF3LT5uZWM7CiAJdTMyIHNjYW5jb2RlOwogCXU4IGFkZHJlc3MsIG5vdF9hZGRyZXNzLCBjb21tYW5kLCBub3RfY29tbWFuZDsKIAotCWRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGF0YS0+ZW5hYmxlZCkKKwlpZiAoIShpcl9kZXYtPnJhdy0+ZW5hYmxlZF9wcm90b2NvbHMgJiBJUl9UWVBFX05FQykpCiAJCXJldHVybiAwOwogCiAJaWYgKElTX1JFU0VUKGV2KSkgewpAQCAtMTkxLDkgKzEwNSw5IEBACiAJCWlmIChldi5wdWxzZSkKIAkJCWJyZWFrOwogCi0JCWRhdGEtPm5lY19iaXRzIDw8PSAxOworCQlkYXRhLT5iaXRzIDw8PSAxOwogCQlpZiAoZXFfbWFyZ2luKGV2LmR1cmF0aW9uLCBORUNfQklUXzFfU1BBQ0UsIE5FQ19VTklUIC8gMikpCi0JCQlkYXRhLT5uZWNfYml0cyB8PSAxOworCQkJZGF0YS0+Yml0cyB8PSAxOwogCQllbHNlIGlmICghZXFfbWFyZ2luKGV2LmR1cmF0aW9uLCBORUNfQklUXzBfU1BBQ0UsIE5FQ19VTklUIC8gMikpCiAJCQlicmVhazsKIAkJZGF0YS0+Y291bnQrKzsKQEAgLTIyMiwxNCArMTM2LDE0IEBACiAJCWlmICghZ2VxX21hcmdpbihldi5kdXJhdGlvbiwgTkVDX1RSQUlMRVJfU1BBQ0UsIE5FQ19VTklUIC8gMikpCiAJCQlicmVhazsKIAotCQlhZGRyZXNzICAgICA9IGJpdHJldjgoKGRhdGEtPm5lY19iaXRzID4+IDI0KSAmIDB4ZmYpOwotCQlub3RfYWRkcmVzcyA9IGJpdHJldjgoKGRhdGEtPm5lY19iaXRzID4+IDE2KSAmIDB4ZmYpOwotCQljb21tYW5kCSAgICA9IGJpdHJldjgoKGRhdGEtPm5lY19iaXRzID4+ICA4KSAmIDB4ZmYpOwotCQlub3RfY29tbWFuZCA9IGJpdHJldjgoKGRhdGEtPm5lY19iaXRzID4+ICAwKSAmIDB4ZmYpOworCQlhZGRyZXNzICAgICA9IGJpdHJldjgoKGRhdGEtPmJpdHMgPj4gMjQpICYgMHhmZik7CisJCW5vdF9hZGRyZXNzID0gYml0cmV2OCgoZGF0YS0+Yml0cyA+PiAxNikgJiAweGZmKTsKKwkJY29tbWFuZAkgICAgPSBiaXRyZXY4KChkYXRhLT5iaXRzID4+ICA4KSAmIDB4ZmYpOworCQlub3RfY29tbWFuZCA9IGJpdHJldjgoKGRhdGEtPmJpdHMgPj4gIDApICYgMHhmZik7CiAKIAkJaWYgKChjb21tYW5kIF4gbm90X2NvbW1hbmQpICE9IDB4ZmYpIHsKIAkJCUlSX2RwcmludGsoMSwgIk5FQyBjaGVja3N1bSBlcnJvcjogcmVjZWl2ZWQgMHglMDh4XG4iLAotCQkJCSAgIGRhdGEtPm5lY19iaXRzKTsKKwkJCQkgICBkYXRhLT5iaXRzKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTI1Niw1NCArMTcwLDkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpcl9uZWNfcmVnaXN0ZXIoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQotewotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKLQlpbnQgcmM7Ci0KLQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaXJfZGV2LT5kZXYua29iaiwgJmRlY29kZXJfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZpcl9kZXYtPmRldi5rb2JqLCAmZGVjb2Rlcl9hdHRyaWJ1dGVfZ3JvdXApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkYXRhLT5pcl9kZXYgPSBpcl9kZXY7Ci0JZGF0YS0+ZW5hYmxlZCA9IDE7Ci0KLQlzcGluX2xvY2soJmRlY29kZXJfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmZGF0YS0+bGlzdCwgJmRlY29kZXJfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmRlY29kZXJfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpcl9uZWNfdW5yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCi17Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRfZGV2KTsKLQlzdGF0aWMgc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gMDsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaXJfZGV2LT5kZXYua29iaiwgJmRlY29kZXJfYXR0cmlidXRlX2dyb3VwKTsKLQotCXNwaW5fbG9jaygmZGVjb2Rlcl9sb2NrKTsKLQlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmRlY29kZXJfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBpcl9yYXdfaGFuZGxlciBuZWNfaGFuZGxlciA9IHsKKwkucHJvdG9jb2xzCT0gSVJfVFlQRV9ORUMsCiAJLmRlY29kZQkJPSBpcl9uZWNfZGVjb2RlLAotCS5yYXdfcmVnaXN0ZXIJPSBpcl9uZWNfcmVnaXN0ZXIsCi0JLnJhd191bnJlZ2lzdGVyCT0gaXJfbmVjX3VucmVnaXN0ZXIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpcl9uZWNfZGVjb2RlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvaXItcmF3LWV2ZW50LmMgYi9kcml2ZXJzL21lZGlhL0lSL2lyLXJhdy1ldmVudC5jCmluZGV4IGVhNjhhM2YuLjZmMTkyZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvSVIvaXItcmF3LWV2ZW50LmMKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9pci1yYXctZXZlbnQuYwpAQCAtMjAsMzUgKzIwLDEzIEBACiAvKiBEZWZpbmUgdGhlIG1heCBudW1iZXIgb2YgcHVsc2Uvc3BhY2UgdHJhbnNpdGlvbnMgdG8gYnVmZmVyICovCiAjZGVmaW5lIE1BWF9JUl9FVkVOVF9TSVpFICAgICAgNTEyCiAKLS8qIFVzZWQgdG8gaGFuZGxlIElSIHJhdyBoYW5kbGVyIGV4dGVuc2lvbnMgKi8KLXN0YXRpYyBMSVNUX0hFQUQoaXJfcmF3X2hhbmRsZXJfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlyX3Jhd19oYW5kbGVyX2xvY2spOworLyogVXNlZCB0byBrZWVwIHRyYWNrIG9mIElSIHJhdyBjbGllbnRzLCBwcm90ZWN0ZWQgYnkgaXJfcmF3X2hhbmRsZXJfbG9jayAqLworc3RhdGljIExJU1RfSEVBRChpcl9yYXdfY2xpZW50X2xpc3QpOwogCi0vKioKLSAqIFJVTl9ERUNPREVSKCkJLSBydW5zIGFuIG9wZXJhdGlvbiBvbiBhbGwgSVIgZGVjb2RlcnMKLSAqIEBvcHM6CUlSIHJhdyBoYW5kbGVyIG9wZXJhdGlvbiB0byBiZSBjYWxsZWQKLSAqIEBhcmc6CWFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCi0gKgotICogQ2FsbHMgaXJfcmF3X2hhbmRsZXI6Om9wcyBmb3IgYWxsIHJlZ2lzdGVyZWQgSVIgaGFuZGxlcnMuIEl0IHByZXZlbnRzCi0gKiBuZXcgZGVjb2RlIGFkZGl0aW9uL3JlbW92YWwgd2hpbGUgcnVubmluZywgYnkgbG9ja2luZyBpcl9yYXdfaGFuZGxlcl9sb2NrCi0gKiBtdXRleC4gSWYgYW4gZXJyb3Igb2NjdXJzLCBpdCBzdG9wcyB0aGUgb3BzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBzdW0KLSAqIG9mIHRoZSByZXR1cm4gY29kZXMuCi0gKi8KLSNkZWZpbmUgUlVOX0RFQ09ERVIob3BzLCAuLi4pICh7CQkJCQkgICAgXAotCXN0cnVjdCBpcl9yYXdfaGFuZGxlcgkJKl9pcl9yYXdfaGFuZGxlcjsJCSAgICBcCi0JaW50IF9zdW1yYyA9IDAsIF9yYzsJCQkJCQkgICAgXAotCXNwaW5fbG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CQkJCSAgICBcCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShfaXJfcmF3X2hhbmRsZXIsICZpcl9yYXdfaGFuZGxlcl9saXN0LCBsaXN0KSB7ICBcCi0JCWlmIChfaXJfcmF3X2hhbmRsZXItPm9wcykgewkJCQkgICAgXAotCQkJX3JjID0gX2lyX3Jhd19oYW5kbGVyLT5vcHMoX19WQV9BUkdTX18pOwkgICAgXAotCQkJaWYgKF9yYyA8IDApCQkJCQkgICAgXAotCQkJCWJyZWFrOwkJCQkJICAgIFwKLQkJCV9zdW1yYyArPSBfcmM7CQkJCQkgICAgXAotCQl9CQkJCQkJCSAgICBcCi0JfQkJCQkJCQkJICAgIFwKLQlzcGluX3VubG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CQkJCSAgICBcCi0JX3N1bXJjOwkJCQkJCQkJICAgIFwKLX0pCisvKiBVc2VkIHRvIGhhbmRsZSBJUiByYXcgaGFuZGxlciBleHRlbnNpb25zICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlyX3Jhd19oYW5kbGVyX2xvY2spOworc3RhdGljIExJU1RfSEVBRChpcl9yYXdfaGFuZGxlcl9saXN0KTsKK3N0YXRpYyB1NjQgYXZhaWxhYmxlX3Byb3RvY29sczsKIAogI2lmZGVmIE1PRFVMRQogLyogVXNlZCB0byBsb2FkIHRoZSBkZWNvZGVycyAqLwpAQCAtNTgsNTcgKzM2LDE3IEBACiBzdGF0aWMgdm9pZCBpcl9yYXdfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGlyX3Jhd19ldmVudCBldjsKKwlzdHJ1Y3QgaXJfcmF3X2hhbmRsZXIgKmhhbmRsZXI7CiAJc3RydWN0IGlyX3Jhd19ldmVudF9jdHJsICpyYXcgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlyX3Jhd19ldmVudF9jdHJsLCByeF93b3JrKTsKIAotCXdoaWxlIChrZmlmb19vdXQoJnJhdy0+a2ZpZm8sICZldiwgc2l6ZW9mKGV2KSkgPT0gc2l6ZW9mKGV2KSkKLQkJUlVOX0RFQ09ERVIoZGVjb2RlLCByYXctPmlucHV0X2RldiwgZXYpOwotfQotCi1pbnQgaXJfcmF3X2V2ZW50X3JlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppciA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7Ci0JaW50IHJjOwotCi0JaXItPnJhdyA9IGt6YWxsb2Moc2l6ZW9mKCppci0+cmF3KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpci0+cmF3KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlyLT5yYXctPmlucHV0X2RldiA9IGlucHV0X2RldjsKLQlJTklUX1dPUksoJmlyLT5yYXctPnJ4X3dvcmssIGlyX3Jhd19ldmVudF93b3JrKTsKLQotCXJjID0ga2ZpZm9fYWxsb2MoJmlyLT5yYXctPmtmaWZvLCBzaXplb2YoczY0KSAqIE1BWF9JUl9FVkVOVF9TSVpFLAotCQkJIEdGUF9LRVJORUwpOwotCWlmIChyYyA8IDApIHsKLQkJa2ZyZWUoaXItPnJhdyk7Ci0JCWlyLT5yYXcgPSBOVUxMOwotCQlyZXR1cm4gcmM7CisJd2hpbGUgKGtmaWZvX291dCgmcmF3LT5rZmlmbywgJmV2LCBzaXplb2YoZXYpKSA9PSBzaXplb2YoZXYpKSB7CisJCXNwaW5fbG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFuZGxlciwgJmlyX3Jhd19oYW5kbGVyX2xpc3QsIGxpc3QpCisJCQloYW5kbGVyLT5kZWNvZGUocmF3LT5pbnB1dF9kZXYsIGV2KTsKKwkJc3Bpbl91bmxvY2soJmlyX3Jhd19oYW5kbGVyX2xvY2spOworCQlyYXctPnByZXZfZXYgPSBldjsKIAl9Ci0KLQlyYyA9IFJVTl9ERUNPREVSKHJhd19yZWdpc3RlciwgaW5wdXRfZGV2KTsKLQlpZiAocmMgPCAwKSB7Ci0JCWtmaWZvX2ZyZWUoJmlyLT5yYXctPmtmaWZvKTsKLQkJa2ZyZWUoaXItPnJhdyk7Ci0JCWlyLT5yYXcgPSBOVUxMOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIGlyX3Jhd19ldmVudF91bnJlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppciA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7Ci0KLQlpZiAoIWlyLT5yYXcpCi0JCXJldHVybjsKLQotCWNhbmNlbF93b3JrX3N5bmMoJmlyLT5yYXctPnJ4X3dvcmspOwotCVJVTl9ERUNPREVSKHJhd191bnJlZ2lzdGVyLCBpbnB1dF9kZXYpOwotCi0Ja2ZpZm9fZnJlZSgmaXItPnJhdy0+a2ZpZm8pOwotCWtmcmVlKGlyLT5yYXcpOwotCWlyLT5yYXcgPSBOVUxMOwogfQogCiAvKioKQEAgLTIwNCwyMyArMTQyLDEwMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJfcmF3X2V2ZW50X2hhbmRsZSk7CiAKKy8qIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgc3lzZnMgaW50ZXJmYWNlICovCit1NjQKK2lyX3Jhd19nZXRfYWxsb3dlZF9wcm90b2NvbHMoKQoreworCXU2NCBwcm90b2NvbHM7CisJc3Bpbl9sb2NrKCZpcl9yYXdfaGFuZGxlcl9sb2NrKTsKKwlwcm90b2NvbHMgPSBhdmFpbGFibGVfcHJvdG9jb2xzOworCXNwaW5fdW5sb2NrKCZpcl9yYXdfaGFuZGxlcl9sb2NrKTsKKwlyZXR1cm4gcHJvdG9jb2xzOworfQorCisvKgorICogVXNlZCB0byAodW4pcmVnaXN0ZXIgcmF3IGV2ZW50IGNsaWVudHMKKyAqLworaW50IGlyX3Jhd19ldmVudF9yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCit7CisJc3RydWN0IGlyX2lucHV0X2RldiAqaXIgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCWludCByYzsKKwlzdHJ1Y3QgaXJfcmF3X2hhbmRsZXIgKmhhbmRsZXI7CisKKwlpci0+cmF3ID0ga3phbGxvYyhzaXplb2YoKmlyLT5yYXcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyLT5yYXcpCisJCXJldHVybiAtRU5PTUVNOworCisJaXItPnJhdy0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCUlOSVRfV09SSygmaXItPnJhdy0+cnhfd29yaywgaXJfcmF3X2V2ZW50X3dvcmspOworCWlyLT5yYXctPmVuYWJsZWRfcHJvdG9jb2xzID0gfjA7CisJcmMgPSBrZmlmb19hbGxvYygmaXItPnJhdy0+a2ZpZm8sIHNpemVvZihzNjQpICogTUFYX0lSX0VWRU5UX1NJWkUsCisJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKHJjIDwgMCkgeworCQlrZnJlZShpci0+cmF3KTsKKwkJaXItPnJhdyA9IE5VTEw7CisJCXJldHVybiByYzsKKwl9CisKKwlzcGluX2xvY2soJmlyX3Jhd19oYW5kbGVyX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmlyLT5yYXctPmxpc3QsICZpcl9yYXdfY2xpZW50X2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFuZGxlciwgJmlyX3Jhd19oYW5kbGVyX2xpc3QsIGxpc3QpCisJCWlmIChoYW5kbGVyLT5yYXdfcmVnaXN0ZXIpCisJCQloYW5kbGVyLT5yYXdfcmVnaXN0ZXIoaXItPnJhdy0+aW5wdXRfZGV2KTsKKwlzcGluX3VubG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpcl9yYXdfZXZlbnRfdW5yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCit7CisJc3RydWN0IGlyX2lucHV0X2RldiAqaXIgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCXN0cnVjdCBpcl9yYXdfaGFuZGxlciAqaGFuZGxlcjsKKworCWlmICghaXItPnJhdykKKwkJcmV0dXJuOworCisJY2FuY2VsX3dvcmtfc3luYygmaXItPnJhdy0+cnhfd29yayk7CisKKwlzcGluX2xvY2soJmlyX3Jhd19oYW5kbGVyX2xvY2spOworCWxpc3RfZGVsKCZpci0+cmF3LT5saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZpcl9yYXdfaGFuZGxlcl9saXN0LCBsaXN0KQorCQlpZiAoaGFuZGxlci0+cmF3X3VucmVnaXN0ZXIpCisJCQloYW5kbGVyLT5yYXdfdW5yZWdpc3Rlcihpci0+cmF3LT5pbnB1dF9kZXYpOworCXNwaW5fdW5sb2NrKCZpcl9yYXdfaGFuZGxlcl9sb2NrKTsKKworCWtmaWZvX2ZyZWUoJmlyLT5yYXctPmtmaWZvKTsKKwlrZnJlZShpci0+cmF3KTsKKwlpci0+cmF3ID0gTlVMTDsKK30KKwogLyoKICAqIEV4dGVuc2lvbiBpbnRlcmZhY2UgLSB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBJUiBkZWNvZGVycwogICovCiAKIGludCBpcl9yYXdfaGFuZGxlcl9yZWdpc3RlcihzdHJ1Y3QgaXJfcmF3X2hhbmRsZXIgKmlyX3Jhd19oYW5kbGVyKQogeworCXN0cnVjdCBpcl9yYXdfZXZlbnRfY3RybCAqcmF3OworCiAJc3Bpbl9sb2NrKCZpcl9yYXdfaGFuZGxlcl9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZpcl9yYXdfaGFuZGxlci0+bGlzdCwgJmlyX3Jhd19oYW5kbGVyX2xpc3QpOworCWlmIChpcl9yYXdfaGFuZGxlci0+cmF3X3JlZ2lzdGVyKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJhdywgJmlyX3Jhd19jbGllbnRfbGlzdCwgbGlzdCkKKwkJCWlyX3Jhd19oYW5kbGVyLT5yYXdfcmVnaXN0ZXIocmF3LT5pbnB1dF9kZXYpOworCWF2YWlsYWJsZV9wcm90b2NvbHMgfD0gaXJfcmF3X2hhbmRsZXItPnByb3RvY29sczsKIAlzcGluX3VubG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woaXJfcmF3X2hhbmRsZXJfcmVnaXN0ZXIpOwogCiB2b2lkIGlyX3Jhd19oYW5kbGVyX3VucmVnaXN0ZXIoc3RydWN0IGlyX3Jhd19oYW5kbGVyICppcl9yYXdfaGFuZGxlcikKIHsKKwlzdHJ1Y3QgaXJfcmF3X2V2ZW50X2N0cmwgKnJhdzsKKwogCXNwaW5fbG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CiAJbGlzdF9kZWwoJmlyX3Jhd19oYW5kbGVyLT5saXN0KTsKKwlpZiAoaXJfcmF3X2hhbmRsZXItPnJhd191bnJlZ2lzdGVyKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJhdywgJmlyX3Jhd19jbGllbnRfbGlzdCwgbGlzdCkKKwkJCWlyX3Jhd19oYW5kbGVyLT5yYXdfdW5yZWdpc3RlcihyYXctPmlucHV0X2Rldik7CisJYXZhaWxhYmxlX3Byb3RvY29scyAmPSB+aXJfcmF3X2hhbmRsZXItPnByb3RvY29sczsKIAlzcGluX3VubG9jaygmaXJfcmF3X2hhbmRsZXJfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGlyX3Jhd19oYW5kbGVyX3VucmVnaXN0ZXIpOwpAQCAtMjM1LDYgKzI1Myw3IEBACiAJbG9hZF9yYzZfZGVjb2RlKCk7CiAJbG9hZF9qdmNfZGVjb2RlKCk7CiAJbG9hZF9zb255X2RlY29kZSgpOworCWxvYWRfbGlyY19jb2RlYygpOwogCiAJLyogSWYgbmVlZGVkLCB3ZSBtYXkgbGF0ZXIgYWRkIHNvbWUgaW5pdCBjb2RlLiBJbiB0aGlzIGNhc2UsCiAJICAgaXQgaXMgbmVlZGVkIHRvIGNoYW5nZSB0aGUgQ09ORklHX01PRFVMRSB0ZXN0IGF0IGlyLWNvcmUuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9JUi9pci1yYzUtZGVjb2Rlci5jIGIvZHJpdmVycy9tZWRpYS9JUi9pci1yYzUtZGVjb2Rlci5jCmluZGV4IDIzY2RiMWIuLmRmNDc3MGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0lSL2lyLXJjNS1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9pci1yYzUtZGVjb2Rlci5jCkBAIC0zMCwxMCArMzAsNiBAQAogI2RlZmluZSBSQzVfQklUX0VORAkJKDEgKiBSQzVfVU5JVCkKICNkZWZpbmUgUkM1WF9TUEFDRQkJKDQgKiBSQzVfVU5JVCkKIAotLyogVXNlZCB0byByZWdpc3RlciByYzVfZGVjb2RlciBjbGllbnRzICovCi1zdGF0aWMgTElTVF9IRUFEKGRlY29kZXJfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRlY29kZXJfbG9jayk7Ci0KIGVudW0gcmM1X3N0YXRlIHsKIAlTVEFURV9JTkFDVElWRSwKIAlTVEFURV9CSVRfU1RBUlQsCkBAIC00Miw4NyArMzgsNiBAQAogCVNUQVRFX0ZJTklTSEVELAogfTsKIAotc3RydWN0IGRlY29kZXJfZGF0YSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBpcl9pbnB1dF9kZXYJKmlyX2RldjsKLQlpbnQJCQllbmFibGVkOjE7Ci0KLQkvKiBTdGF0ZSBtYWNoaW5lIGNvbnRyb2wgKi8KLQllbnVtIHJjNV9zdGF0ZQkJc3RhdGU7Ci0JdTMyCQkJcmM1X2JpdHM7Ci0Jc3RydWN0IGlyX3Jhd19ldmVudAlwcmV2X2V2OwotCXVuc2lnbmVkCQljb3VudDsKLQl1bnNpZ25lZAkJd2FudGVkX2JpdHM7Ci19OwotCi0KLS8qKgotICogZ2V0X2RlY29kZXJfZGF0YSgpCS0gZ2V0cyBkZWNvZGVyIGRhdGEKLSAqIEBpbnB1dF9kZXY6CWlucHV0IGRldmljZQotICoKLSAqIFJldHVybnMgdGhlIHN0cnVjdCBkZWNvZGVyX2RhdGEgdGhhdCBjb3JyZXNwb25kcyB0byBhIGRldmljZQotICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpnZXRfZGVjb2Rlcl9kYXRhKHN0cnVjdCAgaXJfaW5wdXRfZGV2ICppcl9kZXYpCi17Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YSA9IE5VTEw7Ci0KLQlzcGluX2xvY2soJmRlY29kZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCAmZGVjb2Rlcl9saXN0LCBsaXN0KSB7Ci0JCWlmIChkYXRhLT5pcl9kZXYgPT0gaXJfZGV2KQotCQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrKCZkZWNvZGVyX2xvY2spOwotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKLQkJCSAgICAgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICBzaXplX3QgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0KLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSkgfHwgdmFsdWUgPiAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRhdGEtPmVuYWJsZWQgPSB2YWx1ZTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZGF0YS0+ZW5hYmxlZCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7Ci0JZWxzZQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlZCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfZW5hYmxlZCwgc3RvcmVfZW5hYmxlZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZWNvZGVyX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfZW5hYmxlZC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRlY29kZXJfYXR0cmlidXRlX2dyb3VwID0gewotCS5uYW1lCT0gInJjNV9kZWNvZGVyIiwKLQkuYXR0cnMJPSBkZWNvZGVyX2F0dHJpYnV0ZXMsCi19OwotCiAvKioKICAqIGlyX3JjNV9kZWNvZGUoKSAtIERlY29kZSBvbmUgUkMtNSBwdWxzZSBvciBzcGFjZQogICogQGlucHV0X2RldjoJdGhlIHN0cnVjdCBpbnB1dF9kZXYgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlCkBAIC0xMzIsMTcgKzQ3LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgaXJfcmM1X2RlY29kZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCBpcl9yYXdfZXZlbnQgZXYpCiB7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCXN0cnVjdCByYzVfZGVjICpkYXRhID0gJmlyX2Rldi0+cmF3LT5yYzU7CiAJdTggdG9nZ2xlOwogCXUzMiBzY2FuY29kZTsKIAotCWRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGF0YS0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICghKGlyX2Rldi0+cmF3LT5lbmFibGVkX3Byb3RvY29scyAmIElSX1RZUEVfUkM1KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAogCWlmIChJU19SRVNFVChldikpIHsKIAkJZGF0YS0+c3RhdGUgPSBTVEFURV9JTkFDVElWRTsKQEAgLTE3NiwxNiArODcsMTUgQEAKIAkJaWYgKCFlcV9tYXJnaW4oZXYuZHVyYXRpb24sIFJDNV9CSVRfU1RBUlQsIFJDNV9VTklUIC8gMikpCiAJCQlicmVhazsKIAotCQlkYXRhLT5yYzVfYml0cyA8PD0gMTsKKwkJZGF0YS0+Yml0cyA8PD0gMTsKIAkJaWYgKCFldi5wdWxzZSkKLQkJCWRhdGEtPnJjNV9iaXRzIHw9IDE7CisJCQlkYXRhLT5iaXRzIHw9IDE7CiAJCWRhdGEtPmNvdW50Kys7Ci0JCWRhdGEtPnByZXZfZXYgPSBldjsKIAkJZGF0YS0+c3RhdGUgPSBTVEFURV9CSVRfRU5EOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgU1RBVEVfQklUX0VORDoKLQkJaWYgKCFpc190cmFuc2l0aW9uKCZldiwgJmRhdGEtPnByZXZfZXYpKQorCQlpZiAoIWlzX3RyYW5zaXRpb24oJmV2LCAmaXJfZGV2LT5yYXctPnByZXZfZXYpKQogCQkJYnJlYWs7CiAKIAkJaWYgKGRhdGEtPmNvdW50ID09IGRhdGEtPndhbnRlZF9iaXRzKQpAQCAtMjE3LDExICsxMjcsMTEgQEAKIAkJaWYgKGRhdGEtPndhbnRlZF9iaXRzID09IFJDNVhfTkJJVFMpIHsKIAkJCS8qIFJDNVggKi8KIAkJCXU4IHhkYXRhLCBjb21tYW5kLCBzeXN0ZW07Ci0JCQl4ZGF0YSAgICA9IChkYXRhLT5yYzVfYml0cyAmIDB4MDAwM0YpID4+IDA7Ci0JCQljb21tYW5kICA9IChkYXRhLT5yYzVfYml0cyAmIDB4MDBGQzApID4+IDY7Ci0JCQlzeXN0ZW0gICA9IChkYXRhLT5yYzVfYml0cyAmIDB4MUYwMDApID4+IDEyOwotCQkJdG9nZ2xlICAgPSAoZGF0YS0+cmM1X2JpdHMgJiAweDIwMDAwKSA/IDEgOiAwOwotCQkJY29tbWFuZCArPSAoZGF0YS0+cmM1X2JpdHMgJiAweDAxMDAwKSA/IDAgOiAweDQwOworCQkJeGRhdGEgICAgPSAoZGF0YS0+Yml0cyAmIDB4MDAwM0YpID4+IDA7CisJCQljb21tYW5kICA9IChkYXRhLT5iaXRzICYgMHgwMEZDMCkgPj4gNjsKKwkJCXN5c3RlbSAgID0gKGRhdGEtPmJpdHMgJiAweDFGMDAwKSA+PiAxMjsKKwkJCXRvZ2dsZSAgID0gKGRhdGEtPmJpdHMgJiAweDIwMDAwKSA/IDEgOiAwOworCQkJY29tbWFuZCArPSAoZGF0YS0+Yml0cyAmIDB4MDEwMDApID8gMCA6IDB4NDA7CiAJCQlzY2FuY29kZSA9IHN5c3RlbSA8PCAxNiB8IGNvbW1hbmQgPDwgOCB8IHhkYXRhOwogCiAJCQlJUl9kcHJpbnRrKDEsICJSQzVYIHNjYW5jb2RlIDB4JTA2eCAodG9nZ2xlOiAldSlcbiIsCkBAIC0yMzAsMTAgKzE0MCwxMCBAQAogCQl9IGVsc2UgewogCQkJLyogUkM1ICovCiAJCQl1OCBjb21tYW5kLCBzeXN0ZW07Ci0JCQljb21tYW5kICA9IChkYXRhLT5yYzVfYml0cyAmIDB4MDAwM0YpID4+IDA7Ci0JCQlzeXN0ZW0gICA9IChkYXRhLT5yYzVfYml0cyAmIDB4MDA3QzApID4+IDY7Ci0JCQl0b2dnbGUgICA9IChkYXRhLT5yYzVfYml0cyAmIDB4MDA4MDApID8gMSA6IDA7Ci0JCQljb21tYW5kICs9IChkYXRhLT5yYzVfYml0cyAmIDB4MDEwMDApID8gMCA6IDB4NDA7CisJCQljb21tYW5kICA9IChkYXRhLT5iaXRzICYgMHgwMDAzRikgPj4gMDsKKwkJCXN5c3RlbSAgID0gKGRhdGEtPmJpdHMgJiAweDAwN0MwKSA+PiA2OworCQkJdG9nZ2xlICAgPSAoZGF0YS0+Yml0cyAmIDB4MDA4MDApID8gMSA6IDA7CisJCQljb21tYW5kICs9IChkYXRhLT5iaXRzICYgMHgwMTAwMCkgPyAwIDogMHg0MDsKIAkJCXNjYW5jb2RlID0gc3lzdGVtIDw8IDggfCBjb21tYW5kOwogCiAJCQlJUl9kcHJpbnRrKDEsICJSQzUgc2NhbmNvZGUgMHglMDR4ICh0b2dnbGU6ICV1KVxuIiwKQEAgLTI1Miw1NCArMTYyLDkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpcl9yYzVfcmVnaXN0ZXIoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQotewotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKLQlpbnQgcmM7Ci0KLQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaXJfZGV2LT5kZXYua29iaiwgJmRlY29kZXJfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZpcl9kZXYtPmRldi5rb2JqLCAmZGVjb2Rlcl9hdHRyaWJ1dGVfZ3JvdXApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkYXRhLT5pcl9kZXYgPSBpcl9kZXY7Ci0JZGF0YS0+ZW5hYmxlZCA9IDE7Ci0KLQlzcGluX2xvY2soJmRlY29kZXJfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmZGF0YS0+bGlzdCwgJmRlY29kZXJfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmRlY29kZXJfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpcl9yYzVfdW5yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCi17Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRfZGV2KTsKLQlzdGF0aWMgc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gMDsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaXJfZGV2LT5kZXYua29iaiwgJmRlY29kZXJfYXR0cmlidXRlX2dyb3VwKTsKLQotCXNwaW5fbG9jaygmZGVjb2Rlcl9sb2NrKTsKLQlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmRlY29kZXJfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBpcl9yYXdfaGFuZGxlciByYzVfaGFuZGxlciA9IHsKKwkucHJvdG9jb2xzCT0gSVJfVFlQRV9SQzUsCiAJLmRlY29kZQkJPSBpcl9yYzVfZGVjb2RlLAotCS5yYXdfcmVnaXN0ZXIJPSBpcl9yYzVfcmVnaXN0ZXIsCi0JLnJhd191bnJlZ2lzdGVyCT0gaXJfcmM1X3VucmVnaXN0ZXIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpcl9yYzVfZGVjb2RlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvaXItcmM2LWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvSVIvaXItcmM2LWRlY29kZXIuYwppbmRleCAyYmY0NzlmLi5mMTYyNGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0lSL2lyLXJjNi1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9pci1yYzYtZGVjb2Rlci5jCkBAIC0zNiwxMCArMzYsNiBAQAogI2RlZmluZSBSQzZfU1RBUlRCSVRfTUFTSwkweDA4CS8qIGZvciB0aGUgaGVhZGVyIGJpdHMgKi8KICNkZWZpbmUgUkM2XzZBX01DRV9UT0dHTEVfTUFTSwkweDgwMDAJLyogZm9yIHRoZSBib2R5IGJpdHMgKi8KIAotLyogVXNlZCB0byByZWdpc3RlciByYzZfZGVjb2RlciBjbGllbnRzICovCi1zdGF0aWMgTElTVF9IRUFEKGRlY29kZXJfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRlY29kZXJfbG9jayk7Ci0KIGVudW0gcmM2X21vZGUgewogCVJDNl9NT0RFXzAsCiAJUkM2X01PREVfNkEsCkBAIC01OCw4OSArNTQsOCBAQAogCVNUQVRFX0ZJTklTSEVELAogfTsKIAotc3RydWN0IGRlY29kZXJfZGF0YSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBpcl9pbnB1dF9kZXYJKmlyX2RldjsKLQlpbnQJCQllbmFibGVkOjE7Ci0KLQkvKiBTdGF0ZSBtYWNoaW5lIGNvbnRyb2wgKi8KLQllbnVtIHJjNl9zdGF0ZQkJc3RhdGU7Ci0JdTgJCQloZWFkZXI7Ci0JdTMyCQkJYm9keTsKLQlzdHJ1Y3QgaXJfcmF3X2V2ZW50CXByZXZfZXY7Ci0JYm9vbAkJCXRvZ2dsZTsKLQl1bnNpZ25lZAkJY291bnQ7Ci0JdW5zaWduZWQJCXdhbnRlZF9iaXRzOwotfTsKLQotCi0vKioKLSAqIGdldF9kZWNvZGVyX2RhdGEoKQktIGdldHMgZGVjb2RlciBkYXRhCi0gKiBAaW5wdXRfZGV2OglpbnB1dCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zIHRoZSBzdHJ1Y3QgZGVjb2Rlcl9kYXRhIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBkZXZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBkZWNvZGVyX2RhdGEgKmdldF9kZWNvZGVyX2RhdGEoc3RydWN0ICBpcl9pbnB1dF9kZXYgKmlyX2RldikKK3N0YXRpYyBlbnVtIHJjNl9tb2RlIHJjNl9tb2RlKHN0cnVjdCByYzZfZGVjICpkYXRhKQogewotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGEgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZkZWNvZGVyX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJmRlY29kZXJfbGlzdCwgbGlzdCkgewotCQlpZiAoZGF0YS0+aXJfZGV2ID09IGlyX2RldikKLQkJCWJyZWFrOwotCX0KLQlzcGluX3VubG9jaygmZGVjb2Rlcl9sb2NrKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhID0gZ2V0X2RlY29kZXJfZGF0YShpcl9kZXYpOwotCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpIHx8IHZhbHVlID4gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhLT5lbmFibGVkID0gdmFsdWU7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0KLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRhdGEtPmVuYWJsZWQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwotCWVsc2UKLQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZWQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2VuYWJsZWQsIHN0b3JlX2VuYWJsZWQpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGVjb2Rlcl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX2VuYWJsZWQuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZWNvZGVyX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZQk9ICJyYzZfZGVjb2RlciIsCi0JLmF0dHJzCT0gZGVjb2Rlcl9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGVudW0gcmM2X21vZGUgcmM2X21vZGUoc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YSkgewogCXN3aXRjaCAoZGF0YS0+aGVhZGVyICYgUkM2X01PREVfTUFTSykgewogCWNhc2UgMDoKIAkJcmV0dXJuIFJDNl9NT0RFXzA7CkBAIC0xNjIsMTYgKzc3LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgaXJfcmM2X2RlY29kZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCBpcl9yYXdfZXZlbnQgZXYpCiB7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCXN0cnVjdCByYzZfZGVjICpkYXRhID0gJmlyX2Rldi0+cmF3LT5yYzY7CiAJdTMyIHNjYW5jb2RlOwogCXU4IHRvZ2dsZTsKIAotCWRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGF0YS0+ZW5hYmxlZCkKKwlpZiAoIShpcl9kZXYtPnJhdy0+ZW5hYmxlZF9wcm90b2NvbHMgJiBJUl9UWVBFX1JDNikpCiAJCXJldHVybiAwOwogCiAJaWYgKElTX1JFU0VUKGV2KSkgewpAQCAtMjIzLDEyICsxMzQsMTEgQEAKIAkJaWYgKGV2LnB1bHNlKQogCQkJZGF0YS0+aGVhZGVyIHw9IDE7CiAJCWRhdGEtPmNvdW50Kys7Ci0JCWRhdGEtPnByZXZfZXYgPSBldjsKIAkJZGF0YS0+c3RhdGUgPSBTVEFURV9IRUFERVJfQklUX0VORDsKIAkJcmV0dXJuIDA7CiAKIAljYXNlIFNUQVRFX0hFQURFUl9CSVRfRU5EOgotCQlpZiAoIWlzX3RyYW5zaXRpb24oJmV2LCAmZGF0YS0+cHJldl9ldikpCisJCWlmICghaXNfdHJhbnNpdGlvbigmZXYsICZpcl9kZXYtPnJhdy0+cHJldl9ldikpCiAJCQlicmVhazsKIAogCQlpZiAoZGF0YS0+Y291bnQgPT0gUkM2X0hFQURFUl9OQklUUykKQEAgLTI0NCwxMiArMTU0LDExIEBACiAJCQlicmVhazsKIAogCQlkYXRhLT50b2dnbGUgPSBldi5wdWxzZTsKLQkJZGF0YS0+cHJldl9ldiA9IGV2OwogCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX1RPR0dMRV9FTkQ7CiAJCXJldHVybiAwOwogCiAJY2FzZSBTVEFURV9UT0dHTEVfRU5EOgotCQlpZiAoIWlzX3RyYW5zaXRpb24oJmV2LCAmZGF0YS0+cHJldl9ldikgfHwKKwkJaWYgKCFpc190cmFuc2l0aW9uKCZldiwgJmlyX2Rldi0+cmF3LT5wcmV2X2V2KSB8fAogCQkgICAgIWdlcV9tYXJnaW4oZXYuZHVyYXRpb24sIFJDNl9UT0dHTEVfRU5ELCBSQzZfVU5JVCAvIDIpKQogCQkJYnJlYWs7CiAKQEAgLTI1OSw3ICsxNjgsNiBAQAogCQl9CiAKIAkJZGF0YS0+c3RhdGUgPSBTVEFURV9CT0RZX0JJVF9TVEFSVDsKLQkJZGF0YS0+cHJldl9ldiA9IGV2OwogCQlkZWNyZWFzZV9kdXJhdGlvbigmZXYsIFJDNl9UT0dHTEVfRU5EKTsKIAkJZGF0YS0+Y291bnQgPSAwOwogCkBAIC0yOTEsMTMgKzE5OSwxMSBAQAogCQlpZiAoZXYucHVsc2UpCiAJCQlkYXRhLT5ib2R5IHw9IDE7CiAJCWRhdGEtPmNvdW50Kys7Ci0JCWRhdGEtPnByZXZfZXYgPSBldjsKLQogCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0JPRFlfQklUX0VORDsKIAkJcmV0dXJuIDA7CiAKIAljYXNlIFNUQVRFX0JPRFlfQklUX0VORDoKLQkJaWYgKCFpc190cmFuc2l0aW9uKCZldiwgJmRhdGEtPnByZXZfZXYpKQorCQlpZiAoIWlzX3RyYW5zaXRpb24oJmV2LCAmaXJfZGV2LT5yYXctPnByZXZfZXYpKQogCQkJYnJlYWs7CiAKIAkJaWYgKGRhdGEtPmNvdW50ID09IGRhdGEtPndhbnRlZF9iaXRzKQpAQCAtMzQ4LDU0ICsyNTQsOSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGlyX3JjNl9yZWdpc3RlcihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYpCi17Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRfZGV2KTsKLQlzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhOwotCWludCByYzsKLQotCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpcl9kZXYtPmRldi5rb2JqLCAmZGVjb2Rlcl9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmlyX2Rldi0+ZGV2LmtvYmosICZkZWNvZGVyX2F0dHJpYnV0ZV9ncm91cCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRhdGEtPmlyX2RldiA9IGlyX2RldjsKLQlkYXRhLT5lbmFibGVkID0gMTsKLQotCXNwaW5fbG9jaygmZGVjb2Rlcl9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZkYXRhLT5saXN0LCAmZGVjb2Rlcl9saXN0KTsKLQlzcGluX3VubG9jaygmZGVjb2Rlcl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlyX3JjNl91bnJlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOwotCXN0YXRpYyBzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhOwotCi0JZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAwOwotCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpcl9kZXYtPmRldi5rb2JqLCAmZGVjb2Rlcl9hdHRyaWJ1dGVfZ3JvdXApOwotCi0Jc3Bpbl9sb2NrKCZkZWNvZGVyX2xvY2spOwotCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKLQlzcGluX3VubG9jaygmZGVjb2Rlcl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IGlyX3Jhd19oYW5kbGVyIHJjNl9oYW5kbGVyID0geworCS5wcm90b2NvbHMJPSBJUl9UWVBFX1JDNiwKIAkuZGVjb2RlCQk9IGlyX3JjNl9kZWNvZGUsCi0JLnJhd19yZWdpc3Rlcgk9IGlyX3JjNl9yZWdpc3RlciwKLQkucmF3X3VucmVnaXN0ZXIJPSBpcl9yYzZfdW5yZWdpc3RlciwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGlyX3JjNl9kZWNvZGVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9JUi9pci1zb255LWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvSVIvaXItc29ueS1kZWNvZGVyLmMKaW5kZXggOWY0NDBjNS4uYjkwNzRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9JUi9pci1zb255LWRlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL0lSL2lyLXNvbnktZGVjb2Rlci5jCkBAIC0yMywxMCArMjMsNiBAQAogI2RlZmluZSBTT05ZX0JJVF9TUEFDRQkJKDEgKiBTT05ZX1VOSVQpCiAjZGVmaW5lIFNPTllfVFJBSUxFUl9TUEFDRQkoMTAgKiBTT05ZX1VOSVQpIC8qIG1pbmltdW0gKi8KIAotLyogVXNlZCB0byByZWdpc3RlciBzb255X2RlY29kZXIgY2xpZW50cyAqLwotc3RhdGljIExJU1RfSEVBRChkZWNvZGVyX2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhkZWNvZGVyX2xvY2spOwotCiBlbnVtIHNvbnlfc3RhdGUgewogCVNUQVRFX0lOQUNUSVZFLAogCVNUQVRFX0hFQURFUl9TUEFDRSwKQEAgLTM1LDg0ICszMSw2IEBACiAJU1RBVEVfRklOSVNIRUQsCiB9OwogCi1zdHJ1Y3QgZGVjb2Rlcl9kYXRhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IGlyX2lucHV0X2RldgkqaXJfZGV2OwotCWludAkJCWVuYWJsZWQ6MTsKLQotCS8qIFN0YXRlIG1hY2hpbmUgY29udHJvbCAqLwotCWVudW0gc29ueV9zdGF0ZQkJc3RhdGU7Ci0JdTMyCQkJc29ueV9iaXRzOwotCXVuc2lnbmVkCQljb3VudDsKLX07Ci0KLQotLyoqCi0gKiBnZXRfZGVjb2Rlcl9kYXRhKCkJLSBnZXRzIGRlY29kZXIgZGF0YQotICogQGlucHV0X2RldjoJaW5wdXQgZGV2aWNlCi0gKgotICogUmV0dXJucyB0aGUgc3RydWN0IGRlY29kZXJfZGF0YSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpnZXRfZGVjb2Rlcl9kYXRhKHN0cnVjdCAgaXJfaW5wdXRfZGV2ICppcl9kZXYpCi17Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YSA9IE5VTEw7Ci0KLQlzcGluX2xvY2soJmRlY29kZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCAmZGVjb2Rlcl9saXN0LCBsaXN0KSB7Ci0JCWlmIChkYXRhLT5pcl9kZXYgPT0gaXJfZGV2KQotCQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrKCZkZWNvZGVyX2xvY2spOwotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKLQkJCSAgICAgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICBzaXplX3QgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0Jc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGEgPSBnZXRfZGVjb2Rlcl9kYXRhKGlyX2Rldik7Ci0KLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSkgfHwgdmFsdWUgPiAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRhdGEtPmVuYWJsZWQgPSB2YWx1ZTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZGF0YS0+ZW5hYmxlZCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7Ci0JZWxzZQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlZCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfZW5hYmxlZCwgc3RvcmVfZW5hYmxlZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZWNvZGVyX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfZW5hYmxlZC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRlY29kZXJfYXR0cmlidXRlX2dyb3VwID0gewotCS5uYW1lCT0gInNvbnlfZGVjb2RlciIsCi0JLmF0dHJzCT0gZGVjb2Rlcl9hdHRyaWJ1dGVzLAotfTsKLQogLyoqCiAgKiBpcl9zb255X2RlY29kZSgpIC0gRGVjb2RlIG9uZSBTb255IHB1bHNlIG9yIHNwYWNlCiAgKiBAaW5wdXRfZGV2Ogl0aGUgc3RydWN0IGlucHV0X2RldiBkZXNjcmlwdG9yIG9mIHRoZSBkZXZpY2UKQEAgLTEyMiwxNiArNDAsMTIgQEAKICAqLwogc3RhdGljIGludCBpcl9zb255X2RlY29kZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCBpcl9yYXdfZXZlbnQgZXYpCiB7Ci0Jc3RydWN0IGRlY29kZXJfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCXN0cnVjdCBzb255X2RlYyAqZGF0YSA9ICZpcl9kZXYtPnJhdy0+c29ueTsKIAl1MzIgc2NhbmNvZGU7CiAJdTggZGV2aWNlLCBzdWJkZXZpY2UsIGZ1bmN0aW9uOwogCi0JZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFkYXRhLT5lbmFibGVkKQorCWlmICghKGlyX2Rldi0+cmF3LT5lbmFibGVkX3Byb3RvY29scyAmIElSX1RZUEVfU09OWSkpCiAJCXJldHVybiAwOwogCiAJaWYgKElTX1JFU0VUKGV2KSkgewpAQCAtMTcyLDkgKzg2LDkgQEAKIAkJaWYgKCFldi5wdWxzZSkKIAkJCWJyZWFrOwogCi0JCWRhdGEtPnNvbnlfYml0cyA8PD0gMTsKKwkJZGF0YS0+Yml0cyA8PD0gMTsKIAkJaWYgKGVxX21hcmdpbihldi5kdXJhdGlvbiwgU09OWV9CSVRfMV9QVUxTRSwgU09OWV9VTklUIC8gMikpCi0JCQlkYXRhLT5zb255X2JpdHMgfD0gMTsKKwkJCWRhdGEtPmJpdHMgfD0gMTsKIAkJZWxzZSBpZiAoIWVxX21hcmdpbihldi5kdXJhdGlvbiwgU09OWV9CSVRfMF9QVUxTRSwgU09OWV9VTklUIC8gMikpCiAJCQlicmVhazsKIApAQCAtMjA4LDE5ICsxMjIsMTkgQEAKIAogCQlzd2l0Y2ggKGRhdGEtPmNvdW50KSB7CiAJCWNhc2UgMTI6Ci0JCQlkZXZpY2UgICAgPSBiaXRyZXY4KChkYXRhLT5zb255X2JpdHMgPDwgIDMpICYgMHhGOCk7CisJCQlkZXZpY2UgICAgPSBiaXRyZXY4KChkYXRhLT5iaXRzIDw8ICAzKSAmIDB4RjgpOwogCQkJc3ViZGV2aWNlID0gMDsKLQkJCWZ1bmN0aW9uICA9IGJpdHJldjgoKGRhdGEtPnNvbnlfYml0cyA+PiAgNCkgJiAweEZFKTsKKwkJCWZ1bmN0aW9uICA9IGJpdHJldjgoKGRhdGEtPmJpdHMgPj4gIDQpICYgMHhGRSk7CiAJCQlicmVhazsKIAkJY2FzZSAxNToKLQkJCWRldmljZSAgICA9IGJpdHJldjgoKGRhdGEtPnNvbnlfYml0cyA+PiAgMCkgJiAweEZGKTsKKwkJCWRldmljZSAgICA9IGJpdHJldjgoKGRhdGEtPmJpdHMgPj4gIDApICYgMHhGRik7CiAJCQlzdWJkZXZpY2UgPSAwOwotCQkJZnVuY3Rpb24gID0gYml0cmV2OCgoZGF0YS0+c29ueV9iaXRzID4+ICA3KSAmIDB4RkQpOworCQkJZnVuY3Rpb24gID0gYml0cmV2OCgoZGF0YS0+Yml0cyA+PiAgNykgJiAweEZEKTsKIAkJCWJyZWFrOwogCQljYXNlIDIwOgotCQkJZGV2aWNlICAgID0gYml0cmV2OCgoZGF0YS0+c29ueV9iaXRzID4+ICA1KSAmIDB4RjgpOwotCQkJc3ViZGV2aWNlID0gYml0cmV2OCgoZGF0YS0+c29ueV9iaXRzID4+ICAwKSAmIDB4RkYpOwotCQkJZnVuY3Rpb24gID0gYml0cmV2OCgoZGF0YS0+c29ueV9iaXRzID4+IDEyKSAmIDB4RkUpOworCQkJZGV2aWNlICAgID0gYml0cmV2OCgoZGF0YS0+Yml0cyA+PiAgNSkgJiAweEY4KTsKKwkJCXN1YmRldmljZSA9IGJpdHJldjgoKGRhdGEtPmJpdHMgPj4gIDApICYgMHhGRik7CisJCQlmdW5jdGlvbiAgPSBiaXRyZXY4KChkYXRhLT5iaXRzID4+IDEyKSAmIDB4RkUpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlJUl9kcHJpbnRrKDEsICJTb255IGludmFsaWQgYml0Y291bnQgJXVcbiIsIGRhdGEtPmNvdW50KTsKQEAgLTI0MSw1NCArMTU1LDkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpcl9zb255X3JlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOwotCXN0cnVjdCBkZWNvZGVyX2RhdGEgKmRhdGE7Ci0JaW50IHJjOwotCi0JcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlyX2Rldi0+ZGV2LmtvYmosICZkZWNvZGVyX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKSB7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmaXJfZGV2LT5kZXYua29iaiwgJmRlY29kZXJfYXR0cmlidXRlX2dyb3VwKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZGF0YS0+aXJfZGV2ID0gaXJfZGV2OwotCWRhdGEtPmVuYWJsZWQgPSAxOwotCi0Jc3Bpbl9sb2NrKCZkZWNvZGVyX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmRhdGEtPmxpc3QsICZkZWNvZGVyX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZkZWNvZGVyX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXJfc29ueV91bnJlZ2lzdGVyKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKLXsKLQlzdHJ1Y3QgaXJfaW5wdXRfZGV2ICppcl9kZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOwotCXN0YXRpYyBzdHJ1Y3QgZGVjb2Rlcl9kYXRhICpkYXRhOwotCi0JZGF0YSA9IGdldF9kZWNvZGVyX2RhdGEoaXJfZGV2KTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAwOwotCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpcl9kZXYtPmRldi5rb2JqLCAmZGVjb2Rlcl9hdHRyaWJ1dGVfZ3JvdXApOwotCi0Jc3Bpbl9sb2NrKCZkZWNvZGVyX2xvY2spOwotCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKLQlzcGluX3VubG9jaygmZGVjb2Rlcl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IGlyX3Jhd19oYW5kbGVyIHNvbnlfaGFuZGxlciA9IHsKKwkucHJvdG9jb2xzCT0gSVJfVFlQRV9TT05ZLAogCS5kZWNvZGUJCT0gaXJfc29ueV9kZWNvZGUsCi0JLnJhd19yZWdpc3Rlcgk9IGlyX3NvbnlfcmVnaXN0ZXIsCi0JLnJhd191bnJlZ2lzdGVyCT0gaXJfc29ueV91bnJlZ2lzdGVyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXJfc29ueV9kZWNvZGVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9JUi9pci1zeXNmcy5jIGIvZHJpdmVycy9tZWRpYS9JUi9pci1zeXNmcy5jCmluZGV4IDIwOThkZDEuLjYyNzMwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvSVIvaXItc3lzZnMuYworKysgYi9kcml2ZXJzL21lZGlhL0lSL2lyLXN5c2ZzLmMKQEAgLTMzLDEyNSArMzMsMTcyIEBACiAJLmRldm5vZGUJPSBpcl9kZXZub2RlLAogfTsKIAorc3RhdGljIHN0cnVjdCB7CisJdTY0CXR5cGU7CisJY2hhcgkqbmFtZTsKK30gcHJvdG9fbmFtZXNbXSA9IHsKKwl7IElSX1RZUEVfVU5LTk9XTiwJInVua25vd24iCX0sCisJeyBJUl9UWVBFX1JDNSwJCSJyYy01IgkJfSwKKwl7IElSX1RZUEVfTkVDLAkJIm5lYyIJCX0sCisJeyBJUl9UWVBFX1JDNiwJCSJyYy02IgkJfSwKKwl7IElSX1RZUEVfSlZDLAkJImp2YyIJCX0sCisJeyBJUl9UWVBFX1NPTlksCQkic29ueSIJCX0sCisJeyBJUl9UWVBFX0xJUkMsCQkibGlyYyIJCX0sCit9OworCisjZGVmaW5lIFBST1RPX05PTkUJIm5vbmUiCisKIC8qKgotICogc2hvd19wcm90b2NvbCgpIC0gc2hvd3MgdGhlIGN1cnJlbnQgSVIgcHJvdG9jb2wKKyAqIHNob3dfcHJvdG9jb2xzKCkgLSBzaG93cyB0aGUgY3VycmVudCBJUiBwcm90b2NvbChzKQogICogQGQ6CQl0aGUgZGV2aWNlIGRlc2NyaXB0b3IKICAqIEBtYXR0cjoJdGhlIGRldmljZSBhdHRyaWJ1dGUgc3RydWN0ICh1bnVzZWQpCiAgKiBAYnVmOglhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIKICAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgYSBjYWxsYmFjayByb3V0aW5lIGZvciBpbnB1dCByZWFkIHRoZSBJUiBwcm90b2NvbCB0eXBlLgotICogaXQgaXMgdHJpZ2dlZCBieSByZWFkaW5nIC9zeXMvY2xhc3MvcmMvcmM/L2N1cnJlbnRfcHJvdG9jb2wuCi0gKiBJdCByZXR1cm5zIHRoZSBwcm90b2NvbCBuYW1lLCBhcyB1bmRlcnN0b29kIGJ5IHRoZSBkcml2ZXIuCisgKiBUaGlzIHJvdXRpbmUgaXMgYSBjYWxsYmFjayByb3V0aW5lIGZvciBpbnB1dCByZWFkIHRoZSBJUiBwcm90b2NvbCB0eXBlKHMpLgorICogaXQgaXMgdHJpZ2dlZCBieSByZWFkaW5nIC9zeXMvY2xhc3MvcmMvcmM/L3Byb3RvY29scy4KKyAqIEl0IHJldHVybnMgdGhlIHByb3RvY29sIG5hbWVzIG9mIHN1cHBvcnRlZCBwcm90b2NvbHMuCisgKiBFbmFibGVkIHByb3RvY29scyBhcmUgcHJpbnRlZCBpbiBicmFja2V0cy4KICAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19wcm90b2NvbChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHJvdG9jb2xzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsIGNoYXIgKmJ1ZikKIHsKLQljaGFyICpzOwogCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1NjQgaXJfdHlwZSA9IGlyX2Rldi0+cmNfdGFiLmlyX3R5cGU7CisJdTY0IGFsbG93ZWQsIGVuYWJsZWQ7CisJY2hhciAqdG1wID0gYnVmOworCWludCBpOwogCi0JSVJfZHByaW50aygxLCAiQ3VycmVudCBwcm90b2NvbCBpcyAlbGxkXG4iLCAobG9uZyBsb25nKWlyX3R5cGUpOworCWlmIChpcl9kZXYtPnByb3BzLT5kcml2ZXJfdHlwZSA9PSBSQ19EUklWRVJfU0NBTkNPREUpIHsKKwkJZW5hYmxlZCA9IGlyX2Rldi0+cmNfdGFiLmlyX3R5cGU7CisJCWFsbG93ZWQgPSBpcl9kZXYtPnByb3BzLT5hbGxvd2VkX3Byb3RvczsKKwl9IGVsc2UgeworCQllbmFibGVkID0gaXJfZGV2LT5yYXctPmVuYWJsZWRfcHJvdG9jb2xzOworCQlhbGxvd2VkID0gaXJfcmF3X2dldF9hbGxvd2VkX3Byb3RvY29scygpOworCX0KIAotCS8qIEZJWE1FOiBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgcHJvdG9jb2xzIGF0IHRoZSBzYW1lIHRpbWUgKi8KLQlpZiAoaXJfdHlwZSA9PSBJUl9UWVBFX1VOS05PV04pCi0JCXMgPSAiVW5rbm93biI7Ci0JZWxzZSBpZiAoaXJfdHlwZSA9PSBJUl9UWVBFX1JDNSkKLQkJcyA9ICJyYy01IjsKLQllbHNlIGlmIChpcl90eXBlID09IElSX1RZUEVfTkVDKQotCQlzID0gIm5lYyI7Ci0JZWxzZSBpZiAoaXJfdHlwZSA9PSBJUl9UWVBFX1JDNikKLQkJcyA9ICJyYzYiOwotCWVsc2UgaWYgKGlyX3R5cGUgPT0gSVJfVFlQRV9KVkMpCi0JCXMgPSAianZjIjsKLQllbHNlIGlmIChpcl90eXBlID09IElSX1RZUEVfU09OWSkKLQkJcyA9ICJzb255IjsKLQllbHNlCi0JCXMgPSAib3RoZXIiOworCUlSX2RwcmludGsoMSwgImFsbG93ZWQgLSAweCVsbHgsIGVuYWJsZWQgLSAweCVsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpYWxsb3dlZCwKKwkJICAgKGxvbmcgbG9uZyllbmFibGVkKTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm90b19uYW1lcyk7IGkrKykgeworCQlpZiAoYWxsb3dlZCAmIGVuYWJsZWQgJiBwcm90b19uYW1lc1tpXS50eXBlKQorCQkJdG1wICs9IHNwcmludGYodG1wLCAiWyVzXSAiLCBwcm90b19uYW1lc1tpXS5uYW1lKTsKKwkJZWxzZSBpZiAoYWxsb3dlZCAmIHByb3RvX25hbWVzW2ldLnR5cGUpCisJCQl0bXAgKz0gc3ByaW50Zih0bXAsICIlcyAiLCBwcm90b19uYW1lc1tpXS5uYW1lKTsKKwl9CisKKwlpZiAodG1wICE9IGJ1ZikKKwkJdG1wLS07CisJKnRtcCA9ICdcbic7CisJcmV0dXJuIHRtcCArIDEgLSBidWY7CiB9CiAKIC8qKgotICogc3RvcmVfcHJvdG9jb2woKSAtIHNob3dzIHRoZSBjdXJyZW50IElSIHByb3RvY29sCisgKiBzdG9yZV9wcm90b2NvbHMoKSAtIGNoYW5nZXMgdGhlIGN1cnJlbnQgSVIgcHJvdG9jb2wocykKICAqIEBkOgkJdGhlIGRldmljZSBkZXNjcmlwdG9yCiAgKiBAbWF0dHI6CXRoZSBkZXZpY2UgYXR0cmlidXRlIHN0cnVjdCAodW51c2VkKQogICogQGJ1ZjoJYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIKICAqIEBsZW46CWxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyCiAgKgogICogVGhpcyByb3V0aW5lIGlzIGEgY2FsbGJhY2sgcm91dGluZSBmb3IgY2hhbmdpbmcgdGhlIElSIHByb3RvY29sIHR5cGUuCi0gKiBpdCBpcyB0cmlnZ2VkIGJ5IHJlYWRpbmcgL3N5cy9jbGFzcy9yYy9yYz8vY3VycmVudF9wcm90b2NvbC4KLSAqIEl0IGNoYW5nZXMgdGhlIElSIHRoZSBwcm90b2NvbCBuYW1lLCBpZiB0aGUgSVIgdHlwZSBpcyByZWNvZ25pemVkCi0gKiBieSB0aGUgZHJpdmVyLgotICogSWYgYW4gdW5rbm93biBwcm90b2NvbCBuYW1lIGlzIHVzZWQsIHJldHVybnMgLUVJTlZBTC4KKyAqIEl0IGlzIHRyaWdnZWQgYnkgd3JpdGluZyB0byAvc3lzL2NsYXNzL3JjL3JjPy9wcm90b2NvbHMuCisgKiBXcml0aW5nICIrcHJvdG8iIHdpbGwgYWRkIGEgcHJvdG9jb2wgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBwcm90b2NvbHMuCisgKiBXcml0aW5nICItcHJvdG8iIHdpbGwgcmVtb3ZlIGEgcHJvdG9jb2wgZnJvbSB0aGUgbGlzdCBvZiBlbmFibGVkIHByb3RvY29scy4KKyAqIFdyaXRpbmcgInByb3RvIiB3aWxsIGVuYWJsZSBvbmx5ICJwcm90byIuCisgKiBXcml0aW5nICJub25lIiB3aWxsIGRpc2FibGUgYWxsIHByb3RvY29scy4KKyAqIFJldHVybnMgLUVJTlZBTCBpZiBhbiBpbnZhbGlkIHByb3RvY29sIGNvbWJpbmF0aW9uIG9yIHVua25vd24gcHJvdG9jb2wgbmFtZQorICogaXMgdXNlZCwgb3RoZXJ3aXNlIEBsZW4uCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3Byb3RvY29sKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpkYXRhLAotCQkJICAgICAgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3Byb3RvY29scyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXU2NCBpcl90eXBlID0gMDsKLQlpbnQgcmMgPSAtRUlOVkFMOworCWJvb2wgZW5hYmxlLCBkaXNhYmxlOworCWNvbnN0IGNoYXIgKnRtcDsKKwl1NjQgdHlwZTsKKwl1NjQgbWFzazsKKwlpbnQgcmMsIGksIGNvdW50ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNoYXIgKmJ1ZjsKIAotCXdoaWxlICgoYnVmID0gc3Ryc2VwKChjaGFyICoqKSAmZGF0YSwgIiBcbiIpKSAhPSBOVUxMKSB7Ci0JCWlmICghc3RyY2FzZWNtcChidWYsICJyYy01IikgfHwgIXN0cmNhc2VjbXAoYnVmLCAicmM1IikpCi0JCQlpcl90eXBlIHw9IElSX1RZUEVfUkM1OwotCQlpZiAoIXN0cmNhc2VjbXAoYnVmLCAibmVjIikpCi0JCQlpcl90eXBlIHw9IElSX1RZUEVfTkVDOwotCQlpZiAoIXN0cmNhc2VjbXAoYnVmLCAianZjIikpCi0JCQlpcl90eXBlIHw9IElSX1RZUEVfSlZDOwotCQlpZiAoIXN0cmNhc2VjbXAoYnVmLCAic29ueSIpKQotCQkJaXJfdHlwZSB8PSBJUl9UWVBFX1NPTlk7CisJaWYgKGlyX2Rldi0+cHJvcHMtPmRyaXZlcl90eXBlID09IFJDX0RSSVZFUl9TQ0FOQ09ERSkKKwkJdHlwZSA9IGlyX2Rldi0+cmNfdGFiLmlyX3R5cGU7CisJZWxzZQorCQl0eXBlID0gaXJfZGV2LT5yYXctPmVuYWJsZWRfcHJvdG9jb2xzOworCisJd2hpbGUgKCh0bXAgPSBzdHJzZXAoKGNoYXIgKiopICZkYXRhLCAiIFxuIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdG1wKQorCQkJYnJlYWs7CisKKwkJaWYgKCp0bXAgPT0gJysnKSB7CisJCQllbmFibGUgPSB0cnVlOworCQkJZGlzYWJsZSA9IGZhbHNlOworCQkJdG1wKys7CisJCX0gZWxzZSBpZiAoKnRtcCA9PSAnLScpIHsKKwkJCWVuYWJsZSA9IGZhbHNlOworCQkJZGlzYWJsZSA9IHRydWU7CisJCQl0bXArKzsKKwkJfSBlbHNlIHsKKwkJCWVuYWJsZSA9IGZhbHNlOworCQkJZGlzYWJsZSA9IGZhbHNlOworCQl9CisKKwkJaWYgKCFlbmFibGUgJiYgIWRpc2FibGUgJiYgIXN0cm5jYXNlY21wKHRtcCwgUFJPVE9fTk9ORSwgc2l6ZW9mKFBST1RPX05PTkUpKSkgeworCQkJdG1wICs9IHNpemVvZihQUk9UT19OT05FKTsKKwkJCW1hc2sgPSAwOworCQkJY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb3RvX25hbWVzKTsgaSsrKSB7CisJCQkJaWYgKCFzdHJuY2FzZWNtcCh0bXAsIHByb3RvX25hbWVzW2ldLm5hbWUsIHN0cmxlbihwcm90b19uYW1lc1tpXS5uYW1lKSkpIHsKKwkJCQkJdG1wICs9IHN0cmxlbihwcm90b19uYW1lc1tpXS5uYW1lKTsKKwkJCQkJbWFzayA9IHByb3RvX25hbWVzW2ldLnR5cGU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChpID09IEFSUkFZX1NJWkUocHJvdG9fbmFtZXMpKSB7CisJCQkJSVJfZHByaW50aygxLCAiVW5rbm93biBwcm90b2NvbDogJyVzJ1xuIiwgdG1wKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWNvdW50Kys7CisJCX0KKworCQlpZiAoZW5hYmxlKQorCQkJdHlwZSB8PSBtYXNrOworCQllbHNlIGlmIChkaXNhYmxlKQorCQkJdHlwZSAmPSB+bWFzazsKKwkJZWxzZQorCQkJdHlwZSA9IG1hc2s7CiAJfQogCi0JaWYgKCFpcl90eXBlKSB7Ci0JCUlSX2RwcmludGsoMSwgIlVua25vd24gcHJvdG9jb2xcbiIpOworCWlmICghY291bnQpIHsKKwkJSVJfZHByaW50aygxLCAiUHJvdG9jb2wgbm90IHNwZWNpZmllZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpcl9kZXYtPnByb3BzICYmIGlyX2Rldi0+cHJvcHMtPmNoYW5nZV9wcm90b2NvbCkKKwlpZiAoaXJfZGV2LT5wcm9wcyAmJiBpcl9kZXYtPnByb3BzLT5jaGFuZ2VfcHJvdG9jb2wpIHsKIAkJcmMgPSBpcl9kZXYtPnByb3BzLT5jaGFuZ2VfcHJvdG9jb2woaXJfZGV2LT5wcm9wcy0+cHJpdiwKLQkJCQkJCSAgICBpcl90eXBlKTsKLQotCWlmIChyYyA8IDApIHsKLQkJSVJfZHByaW50aygxLCAiRXJyb3Igc2V0dGluZyBwcm90b2NvbCB0byAlbGxkXG4iLAotCQkJICAgKGxvbmcgbG9uZylpcl90eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCQkgICAgdHlwZSk7CisJCWlmIChyYyA8IDApIHsKKwkJCUlSX2RwcmludGsoMSwgIkVycm9yIHNldHRpbmcgcHJvdG9jb2xzIHRvIDB4JWxseFxuIiwKKwkJCQkgICAobG9uZyBsb25nKXR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJfZGV2LT5yY190YWIubG9jaywgZmxhZ3MpOwotCWlyX2Rldi0+cmNfdGFiLmlyX3R5cGUgPSBpcl90eXBlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlyX2Rldi0+cmNfdGFiLmxvY2ssIGZsYWdzKTsKKwlpZiAoaXJfZGV2LT5wcm9wcy0+ZHJpdmVyX3R5cGUgPT0gUkNfRFJJVkVSX1NDQU5DT0RFKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcl9kZXYtPnJjX3RhYi5sb2NrLCBmbGFncyk7CisJCWlyX2Rldi0+cmNfdGFiLmlyX3R5cGUgPSB0eXBlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcl9kZXYtPnJjX3RhYi5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJaXJfZGV2LT5yYXctPmVuYWJsZWRfcHJvdG9jb2xzID0gdHlwZTsKKwl9CiAKLQlJUl9kcHJpbnRrKDEsICJDdXJyZW50IHByb3RvY29sKHMpIGlzKGFyZSkgJWxsZFxuIiwKLQkJICAgKGxvbmcgbG9uZylpcl90eXBlKTsKKwlJUl9kcHJpbnRrKDEsICJDdXJyZW50IHByb3RvY29sKHMpOiAweCVsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpdHlwZSk7CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3N1cHBvcnRlZF9wcm90b2NvbHMoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLCBjaGFyICpidWYpCi17Ci0JY2hhciAqb3JnYnVmID0gYnVmOwotCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQotCS8qIEZJWE1FOiBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgcHJvdG9jb2xzIGF0IHRoZSBzYW1lIHRpbWUgKi8KLQlpZiAoaXJfZGV2LT5wcm9wcy0+YWxsb3dlZF9wcm90b3MgPT0gSVJfVFlQRV9VTktOT1dOKQotCQlidWYgKz0gc3ByaW50ZihidWYsICJ1bmtub3duICIpOwotCWlmIChpcl9kZXYtPnByb3BzLT5hbGxvd2VkX3Byb3RvcyAmIElSX1RZUEVfUkM1KQotCQlidWYgKz0gc3ByaW50ZihidWYsICJyYy01ICIpOwotCWlmIChpcl9kZXYtPnByb3BzLT5hbGxvd2VkX3Byb3RvcyAmIElSX1RZUEVfTkVDKQotCQlidWYgKz0gc3ByaW50ZihidWYsICJuZWMgIik7Ci0JaWYgKGJ1ZiA9PSBvcmdidWYpCi0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIm90aGVyICIpOwotCi0JYnVmICs9IHNwcmludGYoYnVmIC0gMSwgIlxuIik7Ci0KLQlyZXR1cm4gYnVmIC0gb3JnYnVmOwotfQotCiAjZGVmaW5lIEFERF9IT1RQTFVHX1ZBUihmbXQsIHZhbC4uLikJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCWludCBlcnIgPSBhZGRfdWV2ZW50X3ZhcihlbnYsIGZtdCwgdmFsKTsJCVwKQEAgLTE1OSw3ICsyMDYsNyBAQAogCQkJcmV0dXJuIGVycjsJCQkJCVwKIAl9IHdoaWxlICgwKQogCi1zdGF0aWMgaW50IGlyX2Rldl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCitzdGF0aWMgaW50IHJjX2Rldl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCiB7CiAJc3RydWN0IGlyX2lucHV0X2RldiAqaXJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAKQEAgLTE3NCwzNCArMjIxLDI2IEBACiAvKgogICogU3RhdGljIGRldmljZSBhdHRyaWJ1dGUgc3RydWN0IHdpdGggdGhlIHN5c2ZzIGF0dHJpYnV0ZXMgZm9yIElSJ3MKICAqLwotc3RhdGljIERFVklDRV9BVFRSKHByb3RvY29sLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgc2hvd19wcm90b2NvbCwgc3RvcmVfcHJvdG9jb2wpOworc3RhdGljIERFVklDRV9BVFRSKHByb3RvY29scywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfcHJvdG9jb2xzLCBzdG9yZV9wcm90b2NvbHMpOwogCi1zdGF0aWMgREVWSUNFX0FUVFIoc3VwcG9ydGVkX3Byb3RvY29scywgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIHNob3dfc3VwcG9ydGVkX3Byb3RvY29scywgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppcl9od19kZXZfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfcHJvdG9jb2wuYXR0ciwKLQkmZGV2X2F0dHJfc3VwcG9ydGVkX3Byb3RvY29scy5hdHRyLAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnJjX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9wcm90b2NvbHMuYXR0ciwKIAlOVUxMLAogfTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXJfaHdfZGV2X2F0dHJfZ3JwID0gewotCS5hdHRycwk9IGlyX2h3X2Rldl9hdHRycywKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHJjX2Rldl9hdHRyX2dycCA9IHsKKwkuYXR0cnMJPSByY19kZXZfYXR0cnMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqaXJfaHdfZGV2X2F0dHJfZ3JvdXBzW10gPSB7Ci0JJmlyX2h3X2Rldl9hdHRyX2dycCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpyY19kZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmcmNfZGV2X2F0dHJfZ3JwLAogCU5VTEwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgcmNfZGV2X3R5cGUgPSB7Ci0JLmdyb3VwcwkJPSBpcl9od19kZXZfYXR0cl9ncm91cHMsCi0JLnVldmVudAkJPSBpcl9kZXZfdWV2ZW50LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBpcl9yYXdfZGV2X3R5cGUgPSB7Ci0JLnVldmVudAkJPSBpcl9kZXZfdWV2ZW50LAorCS5ncm91cHMJCT0gcmNfZGV2X2F0dHJfZ3JvdXBzLAorCS51ZXZlbnQJCT0gcmNfZGV2X3VldmVudCwKIH07CiAKIC8qKgpAQCAtMjIxLDExICsyNjAsNyBAQAogCWlmICh1bmxpa2VseShkZXZubyA8IDApKQogCQlyZXR1cm4gZGV2bm87CiAKLQlpZiAoaXJfZGV2LT5wcm9wcykgewotCQlpZiAoaXJfZGV2LT5wcm9wcy0+ZHJpdmVyX3R5cGUgPT0gUkNfRFJJVkVSX1NDQU5DT0RFKQotCQkJaXJfZGV2LT5kZXYudHlwZSA9ICZyY19kZXZfdHlwZTsKLQl9IGVsc2UKLQkJaXJfZGV2LT5kZXYudHlwZSA9ICZpcl9yYXdfZGV2X3R5cGU7CisJaXJfZGV2LT5kZXYudHlwZSA9ICZyY19kZXZfdHlwZTsKIAogCWlyX2Rldi0+ZGV2LmNsYXNzID0gJmlyX2lucHV0X2NsYXNzOwogCWlyX2Rldi0+ZGV2LnBhcmVudCA9IGlucHV0X2Rldi0+ZGV2LnBhcmVudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9NYWtlZmlsZQppbmRleCBhZWE2NDlmLi5jYmVlMDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0lSL2tleW1hcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw4IEBACiAJCQlyYy1idWRnZXQtY2ktb2xkLm8gXAogCQkJcmMtY2luZXJneS0xNDAwLm8gXAogCQkJcmMtY2luZXJneS5vIFwKKwkJCXJjLWRpYjA3MDAtbmVjLm8gXAorCQkJcmMtZGliMDcwMC1yYzUubyBcCiAJCQlyYy1kbTExMDUtbmVjLm8gXAogCQkJcmMtZG50di1saXZlLWR2Yi10Lm8gXAogCQkJcmMtZG50di1saXZlLWR2YnQtcHJvLm8gXApAQCAtMzcsNiArMzksNyBAQAogCQkJcmMta2Fpb215Lm8gXAogCQkJcmMta3dvcmxkLTMxNXUubyBcCiAJCQlyYy1rd29ybGQtcGx1cy10di1hbmFsb2cubyBcCisJCQlyYy1saXJjLm8gXAogCQkJcmMtbWFubGkubyBcCiAJCQlyYy1tc2ktdHZhbnl3aGVyZS5vIFwKIAkJCXJjLW1zaS10dmFueXdoZXJlLXBsdXMubyBcCkBAIC01Nyw2ICs2MCw3IEBACiAJCQlyYy1wdjk1MS5vIFwKIAkJCXJjLXJjNS1oYXVwcGF1Z2UtbmV3Lm8gXAogCQkJcmMtcmM1LXR2Lm8gXAorCQkJcmMtcmM2LW1jZS5vIFwKIAkJCXJjLXJlYWwtYXVkaW8tMjIwLTMyLWtleXMubyBcCiAJCQlyYy10YnMtbmVjLm8gXAogCQkJcmMtdGVycmF0ZWMtY2luZXJneS14cy5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jIGIvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL3JjLWRpYjA3MDAtbmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxODMyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiByYy1kdmIwNzAwLWJpZy5jIC0gS2V5dGFibGUgZm9yIGRldmljZXMgaW4gZHZiMDcwMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqCisgKiBUT0RPOiBUaGlzIHRhYmxlIGlzIGEgcmVhbCBtZXNzLCBhcyBpdCBtZXJnZXMgUkMgY29kZXMgZnJvbSBzZXZlcmFsCisgKiBkZXZpY2VzIGludG8gYSBiaWcgdGFibGUuIEl0IGFsc28gaGFzIGJvdGggUkMtNSBhbmQgTkVDIGNvZGVzIGluc2lkZS4KKyAqIEl0IHNob3VsZCBiZSBicm9rZW4gaW50byBzbWFsbCB0YWJsZXMsIGFuZCB0aGUgcHJvdG9jb2xzIHNob3VsZCBwcm9wZXJseQorICogYmUgaW5kZW50aWZpY2F0ZWQuCisgKgorICogVGhlIHRhYmxlIHdlcmUgaW1wb3J0ZWQgZnJvbSBkaWIwNzAwX2RldmljZXMuYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBkaWIwNzAwX25lY190YWJsZVtdID0geworCS8qIEtleSBjb2RlcyBmb3IgdGhlIFBpeGVsdmlldyBTQlRWRCByZW1vdGUgKi8KKwl7IDB4ODYxMywgS0VZX01VVEUgfSwKKwl7IDB4ODYxMiwgS0VZX1BPV0VSIH0sCisJeyAweDg2MDEsIEtFWV8xIH0sCisJeyAweDg2MDIsIEtFWV8yIH0sCisJeyAweDg2MDMsIEtFWV8zIH0sCisJeyAweDg2MDQsIEtFWV80IH0sCisJeyAweDg2MDUsIEtFWV81IH0sCisJeyAweDg2MDYsIEtFWV82IH0sCisJeyAweDg2MDcsIEtFWV83IH0sCisJeyAweDg2MDgsIEtFWV84IH0sCisJeyAweDg2MDksIEtFWV85IH0sCisJeyAweDg2MDAsIEtFWV8wIH0sCisJeyAweDg2MGQsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4ODYxOSwgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDg2MTAsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHg4NjBjLCBLRVlfVk9MVU1FRE9XTiB9LAorCisJeyAweDg2MGEsIEtFWV9DQU1FUkEgfSwKKwl7IDB4ODYwYiwgS0VZX1pPT00gfSwKKwl7IDB4ODYxYiwgS0VZX0JBQ0tTUEFDRSB9LAorCXsgMHg4NjE1LCBLRVlfRU5URVIgfSwKKworCXsgMHg4NjFkLCBLRVlfVVAgfSwKKwl7IDB4ODYxZSwgS0VZX0RPV04gfSwKKwl7IDB4ODYwZSwgS0VZX0xFRlQgfSwKKwl7IDB4ODYwZiwgS0VZX1JJR0hUIH0sCisKKwl7IDB4ODYxOCwgS0VZX1JFQ09SRCB9LAorCXsgMHg4NjFhLCBLRVlfU1RPUCB9LAorCisJLyogS2V5IGNvZGVzIGZvciB0aGUgRXZvbHV0ZVBDIFRWV2F5KyByZW1vdGUgKi8KKwl7IDB4N2EwMCwgS0VZX01FTlUgfSwKKwl7IDB4N2EwMSwgS0VZX1JFQ09SRCB9LAorCXsgMHg3YTAyLCBLRVlfUExBWSB9LAorCXsgMHg3YTAzLCBLRVlfU1RPUCB9LAorCXsgMHg3YTEwLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDdhMTEsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHg3YTEyLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4N2ExMywgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4N2E0MCwgS0VZX1BPV0VSIH0sCisJeyAweDdhNDEsIEtFWV9NVVRFIH0sCisKKwkvKiBLZXkgY29kZXMgZm9yIHRoZSBFbGdhdG8gRXllVFYgRGl2ZXJzaXR5IHNpbHZlciByZW1vdGUgKi8KKwl7IDB4NDUwMSwgS0VZX1BPV0VSIH0sCisJeyAweDQ1MDIsIEtFWV9NVVRFIH0sCisJeyAweDQ1MDMsIEtFWV8xIH0sCisJeyAweDQ1MDQsIEtFWV8yIH0sCisJeyAweDQ1MDUsIEtFWV8zIH0sCisJeyAweDQ1MDYsIEtFWV80IH0sCisJeyAweDQ1MDcsIEtFWV81IH0sCisJeyAweDQ1MDgsIEtFWV82IH0sCisJeyAweDQ1MDksIEtFWV83IH0sCisJeyAweDQ1MGEsIEtFWV84IH0sCisJeyAweDQ1MGIsIEtFWV85IH0sCisJeyAweDQ1MGMsIEtFWV9MQVNUIH0sCisJeyAweDQ1MGQsIEtFWV8wIH0sCisJeyAweDQ1MGUsIEtFWV9FTlRFUiB9LAorCXsgMHg0NTBmLCBLRVlfUkVEIH0sCisJeyAweDQ1MTAsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4NDUxMSwgS0VZX0dSRUVOIH0sCisJeyAweDQ1MTIsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDQ1MTMsIEtFWV9PSyB9LAorCXsgMHg0NTE0LCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4NDUxNSwgS0VZX1lFTExPVyB9LAorCXsgMHg0NTE2LCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4NDUxNywgS0VZX0JMVUUgfSwKKwl7IDB4NDUxOCwgS0VZX0xFRlQgfSwgLyogU2tpcCBiYWNrd2FyZHMgKi8KKwl7IDB4NDUxOSwgS0VZX1BMQVlQQVVTRSB9LAorCXsgMHg0NTFhLCBLRVlfUklHSFQgfSwgLyogU2tpcCBmb3J3YXJkICovCisJeyAweDQ1MWIsIEtFWV9SRVdJTkQgfSwKKwl7IDB4NDUxYywgS0VZX0wgfSwgLyogTGl2ZSAqLworCXsgMHg0NTFkLCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4NDUxZSwgS0VZX1NUT1AgfSwgLyogJ1JldmVhbCcgZm9yIFRlbGV0ZXh0ICovCisJeyAweDQ1MWYsIEtFWV9NRU5VIH0sIC8qIEtFWV9URVhUIGZvciBUZWxldGV4dCAqLworCXsgMHg0NTQwLCBLRVlfUkVDT1JEIH0sIC8qIEZvbnQgJ1NpemUnIGZvciBUZWxldGV4dCAqLworCXsgMHg0NTQxLCBLRVlfU0NSRUVOIH0sIC8qICBGdWxsIHNjcmVlbiB0b2dnbGUsICdIb2xkJyBmb3IgVGVsZXRleHQgKi8KKwl7IDB4NDU0MiwgS0VZX1NFTEVDVCB9LCAvKiBTZWxlY3QgdmlkZW8gaW5wdXQsICdTZWxlY3QnIGZvciBUZWxldGV4dCAqLworfTsKKworc3RhdGljIHN0cnVjdCByY19rZXltYXAgZGliMDcwMF9uZWNfbWFwID0geworCS5tYXAgPSB7CisJCS5zY2FuICAgID0gZGliMDcwMF9uZWNfdGFibGUsCisJCS5zaXplICAgID0gQVJSQVlfU0laRShkaWIwNzAwX25lY190YWJsZSksCisJCS5pcl90eXBlID0gSVJfVFlQRV9ORUMsCisJCS5uYW1lICAgID0gUkNfTUFQX0RJQjA3MDBfTkVDX1RBQkxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmNfbWFwKHZvaWQpCit7CisJcmV0dXJuIGlyX3JlZ2lzdGVyX21hcCgmZGliMDcwMF9uZWNfbWFwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmNfbWFwKHZvaWQpCit7CisJaXJfdW5yZWdpc3Rlcl9tYXAoJmRpYjA3MDBfbmVjX21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwKQorbW9kdWxlX2V4aXQoZXhpdF9yY19tYXApCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMgYi9kcml2ZXJzL21lZGlhL0lSL2tleW1hcHMvcmMtZGliMDcwMC1yYzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQ3OTdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qIHJjLWR2YjA3MDAtYmlnLmMgLSBLZXl0YWJsZSBmb3IgZGV2aWNlcyBpbiBkdmIwNzAwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgorICoKKyAqIFRPRE86IFRoaXMgdGFibGUgaXMgYSByZWFsIG1lc3MsIGFzIGl0IG1lcmdlcyBSQyBjb2RlcyBmcm9tIHNldmVyYWwKKyAqIGRldmljZXMgaW50byBhIGJpZyB0YWJsZS4gSXQgYWxzbyBoYXMgYm90aCBSQy01IGFuZCBORUMgY29kZXMgaW5zaWRlLgorICogSXQgc2hvdWxkIGJlIGJyb2tlbiBpbnRvIHNtYWxsIHRhYmxlcywgYW5kIHRoZSBwcm90b2NvbHMgc2hvdWxkIHByb3Blcmx5CisgKiBiZSBpbmRlbnRpZmljYXRlZC4KKyAqCisgKiBUaGUgdGFibGUgd2VyZSBpbXBvcnRlZCBmcm9tIGRpYjA3MDBfZGV2aWNlcy5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorCitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGRpYjA3MDBfcmM1X3RhYmxlW10gPSB7CisJLyogS2V5IGNvZGVzIGZvciB0aGUgdGlueSBQaW5uYWNsZSByZW1vdGUqLworCXsgMHgwNzAwLCBLRVlfTVVURSB9LAorCXsgMHgwNzAxLCBLRVlfTUVOVSB9LCAvKiBQaW5uYWNsZSBsb2dvICovCisJeyAweDA3MzksIEtFWV9QT1dFUiB9LAorCXsgMHgwNzAzLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDcwOSwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4MDcwNiwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHgwNzBjLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDcwZiwgS0VZXzEgfSwKKwl7IDB4MDcxNSwgS0VZXzIgfSwKKwl7IDB4MDcxMCwgS0VZXzMgfSwKKwl7IDB4MDcxOCwgS0VZXzQgfSwKKwl7IDB4MDcxYiwgS0VZXzUgfSwKKwl7IDB4MDcxZSwgS0VZXzYgfSwKKwl7IDB4MDcxMSwgS0VZXzcgfSwKKwl7IDB4MDcyMSwgS0VZXzggfSwKKwl7IDB4MDcxMiwgS0VZXzkgfSwKKwl7IDB4MDcyNywgS0VZXzAgfSwKKwl7IDB4MDcyNCwgS0VZX1NDUkVFTiB9LCAvKiAnU3F1YXJlJyBrZXkgKi8KKwl7IDB4MDcyYSwgS0VZX1RFWFQgfSwgICAvKiAnVCcga2V5ICovCisJeyAweDA3MmQsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MDczMCwgS0VZX1BMQVkgfSwKKwl7IDB4MDczMywgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweDA3MzYsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDczYywgS0VZX1NUT1AgfSwKKwl7IDB4MDczZiwgS0VZX0NBTkNFTCB9LCAvKiAnPycga2V5ICovCisKKwkvKiBLZXkgY29kZXMgZm9yIHRoZSBUZXJyYXRlYyBDaW5lcmd5IERUIFhTIERpdmVyc2l0eSwgc2ltaWxhciB0byBjaW5lcmd5VDIuYyAqLworCXsgMHhlYjAxLCBLRVlfUE9XRVIgfSwKKwl7IDB4ZWIwMiwgS0VZXzEgfSwKKwl7IDB4ZWIwMywgS0VZXzIgfSwKKwl7IDB4ZWIwNCwgS0VZXzMgfSwKKwl7IDB4ZWIwNSwgS0VZXzQgfSwKKwl7IDB4ZWIwNiwgS0VZXzUgfSwKKwl7IDB4ZWIwNywgS0VZXzYgfSwKKwl7IDB4ZWIwOCwgS0VZXzcgfSwKKwl7IDB4ZWIwOSwgS0VZXzggfSwKKwl7IDB4ZWIwYSwgS0VZXzkgfSwKKwl7IDB4ZWIwYiwgS0VZX1ZJREVPIH0sCisJeyAweGViMGMsIEtFWV8wIH0sCisJeyAweGViMGQsIEtFWV9SRUZSRVNIIH0sCisJeyAweGViMGYsIEtFWV9FUEcgfSwKKwl7IDB4ZWIxMCwgS0VZX1VQIH0sCisJeyAweGViMTEsIEtFWV9MRUZUIH0sCisJeyAweGViMTIsIEtFWV9PSyB9LAorCXsgMHhlYjEzLCBLRVlfUklHSFQgfSwKKwl7IDB4ZWIxNCwgS0VZX0RPV04gfSwKKwl7IDB4ZWIxNiwgS0VZX0lORk8gfSwKKwl7IDB4ZWIxNywgS0VZX1JFRCB9LAorCXsgMHhlYjE4LCBLRVlfR1JFRU4gfSwKKwl7IDB4ZWIxOSwgS0VZX1lFTExPVyB9LAorCXsgMHhlYjFhLCBLRVlfQkxVRSB9LAorCXsgMHhlYjFiLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweGViMWMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHhlYjFkLCBLRVlfTVVURSB9LAorCXsgMHhlYjFlLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHhlYjFmLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4ZWI0MCwgS0VZX1BBVVNFIH0sCisJeyAweGViNDEsIEtFWV9IT01FIH0sCisJeyAweGViNDIsIEtFWV9NRU5VIH0sIC8qIERWRCBNZW51ICovCisJeyAweGViNDMsIEtFWV9TVUJUSVRMRSB9LAorCXsgMHhlYjQ0LCBLRVlfVEVYVCB9LCAvKiBUZWxldGV4dCAqLworCXsgMHhlYjQ1LCBLRVlfREVMRVRFIH0sCisJeyAweGViNDYsIEtFWV9UViB9LAorCXsgMHhlYjQ3LCBLRVlfRFZEIH0sCisJeyAweGViNDgsIEtFWV9TVE9QIH0sCisJeyAweGViNDksIEtFWV9WSURFTyB9LAorCXsgMHhlYjRhLCBLRVlfQVVESU8gfSwgLyogTXVzaWMgKi8KKwl7IDB4ZWI0YiwgS0VZX1NDUkVFTiB9LCAvKiBQaWMgKi8KKwl7IDB4ZWI0YywgS0VZX1BMQVkgfSwKKwl7IDB4ZWI0ZCwgS0VZX0JBQ0sgfSwKKwl7IDB4ZWI0ZSwgS0VZX1JFV0lORCB9LAorCXsgMHhlYjRmLCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4ZWI1NCwgS0VZX1BSRVZJT1VTIH0sCisJeyAweGViNTgsIEtFWV9SRUNPUkQgfSwKKwl7IDB4ZWI1YywgS0VZX05FWFQgfSwKKworCS8qIEtleSBjb2RlcyBmb3IgdGhlIEhhdXBhdWdlIFdpblRWIE5vdmEtVEQsIGNvcGllZCBmcm9tIG5vdmEtdC11c2IyLmMgKE5vdmEtVCBVU0IyKSAqLworCXsgMHgxZTAwLCBLRVlfMCB9LAorCXsgMHgxZTAxLCBLRVlfMSB9LAorCXsgMHgxZTAyLCBLRVlfMiB9LAorCXsgMHgxZTAzLCBLRVlfMyB9LAorCXsgMHgxZTA0LCBLRVlfNCB9LAorCXsgMHgxZTA1LCBLRVlfNSB9LAorCXsgMHgxZTA2LCBLRVlfNiB9LAorCXsgMHgxZTA3LCBLRVlfNyB9LAorCXsgMHgxZTA4LCBLRVlfOCB9LAorCXsgMHgxZTA5LCBLRVlfOSB9LAorCXsgMHgxZTBhLCBLRVlfS1BBU1RFUklTSyB9LAorCXsgMHgxZTBiLCBLRVlfUkVEIH0sCisJeyAweDFlMGMsIEtFWV9SQURJTyB9LAorCXsgMHgxZTBkLCBLRVlfTUVOVSB9LAorCXsgMHgxZTBlLCBLRVlfR1JBVkUgfSwgLyogIyAqLworCXsgMHgxZTBmLCBLRVlfTVVURSB9LAorCXsgMHgxZTEwLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MWUxMSwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4MWUxMiwgS0VZX0NIQU5ORUwgfSwKKwl7IDB4MWUxNCwgS0VZX1VQIH0sCisJeyAweDFlMTUsIEtFWV9ET1dOIH0sCisJeyAweDFlMTYsIEtFWV9MRUZUIH0sCisJeyAweDFlMTcsIEtFWV9SSUdIVCB9LAorCXsgMHgxZTE4LCBLRVlfVklERU8gfSwKKwl7IDB4MWUxOSwgS0VZX0FVRElPIH0sCisJeyAweDFlMWEsIEtFWV9NRURJQSB9LAorCXsgMHgxZTFiLCBLRVlfRVBHIH0sCisJeyAweDFlMWMsIEtFWV9UViB9LAorCXsgMHgxZTFlLCBLRVlfTkVYVCB9LAorCXsgMHgxZTFmLCBLRVlfQkFDSyB9LAorCXsgMHgxZTIwLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDFlMjEsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgxZTI0LCBLRVlfTEFTVCB9LCAvKiBTa2lwIGJhY2t3YXJkcyAqLworCXsgMHgxZTI1LCBLRVlfT0sgfSwKKwl7IDB4MWUyOSwgS0VZX0JMVUV9LAorCXsgMHgxZTJlLCBLRVlfR1JFRU4gfSwKKwl7IDB4MWUzMCwgS0VZX1BBVVNFIH0sCisJeyAweDFlMzIsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MWUzNCwgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweDFlMzUsIEtFWV9QTEFZIH0sCisJeyAweDFlMzYsIEtFWV9TVE9QIH0sCisJeyAweDFlMzcsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MWUzOCwgS0VZX1lFTExPVyB9LAorCXsgMHgxZTNiLCBLRVlfR09UTyB9LAorCXsgMHgxZTNkLCBLRVlfUE9XRVIgfSwKKworCS8qIEtleSBjb2RlcyBmb3IgdGhlIExlYWR0ZWsgV2luZmFzdCBEVFYgRG9uZ2xlICovCisJeyAweDAwNDIsIEtFWV9QT1dFUiB9LAorCXsgMHgwNzdjLCBLRVlfVFVORVIgfSwKKwl7IDB4MGY0ZSwgS0VZX1BSSU5UIH0sIC8qIFBSRVZJRVcgKi8KKwl7IDB4MDg0MCwgS0VZX1NDUkVFTiB9LCAvKiBmdWxsIHNjcmVlbiB0b2dnbGUqLworCXsgMHgwZjcxLCBLRVlfRE9UIH0sIC8qIGZyZXF1ZW5jeSAqLworCXsgMHgwNzQzLCBLRVlfMCB9LAorCXsgMHgwYzQxLCBLRVlfMSB9LAorCXsgMHgwNDQzLCBLRVlfMiB9LAorCXsgMHgwYjdmLCBLRVlfMyB9LAorCXsgMHgwZTQxLCBLRVlfNCB9LAorCXsgMHgwNjQzLCBLRVlfNSB9LAorCXsgMHgwOTdmLCBLRVlfNiB9LAorCXsgMHgwZDdlLCBLRVlfNyB9LAorCXsgMHgwNTdjLCBLRVlfOCB9LAorCXsgMHgwYTQwLCBLRVlfOSB9LAorCXsgMHgwZTRlLCBLRVlfQ0xFQVIgfSwKKwl7IDB4MDQ3YywgS0VZX0NIQU5ORUwgfSwgLyogc2hvdyBjaGFubmVsIG51bWJlciAqLworCXsgMHgwZjQxLCBLRVlfTEFTVCB9LCAvKiByZWNhbGwgKi8KKwl7IDB4MDM0MiwgS0VZX01VVEUgfSwKKwl7IDB4MDY0YywgS0VZX1JFU0VSVkVEIH0sIC8qIFBJUCBidXR0b24qLworCXsgMHgwMTcyLCBLRVlfU0hVRkZMRSB9LCAvKiBTTkFQU0hPVCAqLworCXsgMHgwYzRlLCBLRVlfUExBWVBBVVNFIH0sIC8qIFRJTUVTSElGVCAqLworCXsgMHgwYjcwLCBLRVlfUkVDT1JEIH0sCisJeyAweDAzN2QsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwMTdkLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMjQyLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDAwN2QsIEtFWV9DSEFOTkVMRE9XTiB9LAorCisJLyogS2V5IGNvZGVzIGZvciBOb3ZhLVREICJjcmVkaXQgY2FyZCIgcmVtb3RlIGNvbnRyb2wuICovCisJeyAweDFkMDAsIEtFWV8wIH0sCisJeyAweDFkMDEsIEtFWV8xIH0sCisJeyAweDFkMDIsIEtFWV8yIH0sCisJeyAweDFkMDMsIEtFWV8zIH0sCisJeyAweDFkMDQsIEtFWV80IH0sCisJeyAweDFkMDUsIEtFWV81IH0sCisJeyAweDFkMDYsIEtFWV82IH0sCisJeyAweDFkMDcsIEtFWV83IH0sCisJeyAweDFkMDgsIEtFWV84IH0sCisJeyAweDFkMDksIEtFWV85IH0sCisJeyAweDFkMGEsIEtFWV9URVhUIH0sCisJeyAweDFkMGQsIEtFWV9NRU5VIH0sCisJeyAweDFkMGYsIEtFWV9NVVRFIH0sCisJeyAweDFkMTAsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgxZDExLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgxZDEyLCBLRVlfQ0hBTk5FTCB9LAorCXsgMHgxZDE0LCBLRVlfVVAgfSwKKwl7IDB4MWQxNSwgS0VZX0RPV04gfSwKKwl7IDB4MWQxNiwgS0VZX0xFRlQgfSwKKwl7IDB4MWQxNywgS0VZX1JJR0hUIH0sCisJeyAweDFkMWMsIEtFWV9UViB9LAorCXsgMHgxZDFlLCBLRVlfTkVYVCB9LAorCXsgMHgxZDFmLCBLRVlfQkFDSyB9LAorCXsgMHgxZDIwLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDFkMjEsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgxZDI0LCBLRVlfTEFTVCB9LAorCXsgMHgxZDI1LCBLRVlfT0sgfSwKKwl7IDB4MWQzMCwgS0VZX1BBVVNFIH0sCisJeyAweDFkMzIsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MWQzNCwgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweDFkMzUsIEtFWV9QTEFZIH0sCisJeyAweDFkMzYsIEtFWV9TVE9QIH0sCisJeyAweDFkMzcsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MWQzYiwgS0VZX0dPVE8gfSwKKwl7IDB4MWQzZCwgS0VZX1BPV0VSIH0sCit9OworCitzdGF0aWMgc3RydWN0IHJjX2tleW1hcCBkaWIwNzAwX3JjNV9tYXAgPSB7CisJLm1hcCA9IHsKKwkJLnNjYW4gICAgPSBkaWIwNzAwX3JjNV90YWJsZSwKKwkJLnNpemUgICAgPSBBUlJBWV9TSVpFKGRpYjA3MDBfcmM1X3RhYmxlKSwKKwkJLmlyX3R5cGUgPSBJUl9UWVBFX1JDNSwKKwkJLm5hbWUgICAgPSBSQ19NQVBfRElCMDcwMF9SQzVfVEFCTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yY19tYXAodm9pZCkKK3sKKwlyZXR1cm4gaXJfcmVnaXN0ZXJfbWFwKCZkaWIwNzAwX3JjNV9tYXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yY19tYXAodm9pZCkKK3sKKwlpcl91bnJlZ2lzdGVyX21hcCgmZGliMDcwMF9yYzVfbWFwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9yY19tYXApCittb2R1bGVfZXhpdChleGl0X3JjX21hcCkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0lSL2tleW1hcHMvcmMtbGlyYy5jIGIvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL3JjLWxpcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ZjZjkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL3JjLWxpcmMuYwpAQCAtMCwwICsxLDQxIEBACisvKiByYy1saXJjLmMgLSBFbXB0eSBkdW1teSBrZXl0YWJsZSwgZm9yIHVzZSB3aGVuIGl0cyBwcmVmZXJyZWQgdG8gcGFzcworICogYWxsIHJhdyBJUiBkYXRhIHRvIHRoZSBsaXJjIHVzZXJzcGFjZSBkZWNvZGVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBieSBKYXJvZCBXaWxzb24gPGphcm9kQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvaXItY29yZS5oPgorCitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGxpcmNbXSA9IHsKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHJjX2tleW1hcCBsaXJjX21hcCA9IHsKKwkubWFwID0geworCQkuc2NhbiAgICA9IGxpcmMsCisJCS5zaXplICAgID0gQVJSQVlfU0laRShsaXJjKSwKKwkJLmlyX3R5cGUgPSBJUl9UWVBFX0xJUkMsCisJCS5uYW1lICAgID0gUkNfTUFQX0xJUkMsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yY19tYXBfbGlyYyh2b2lkKQoreworCXJldHVybiBpcl9yZWdpc3Rlcl9tYXAoJmxpcmNfbWFwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmNfbWFwX2xpcmModm9pZCkKK3sKKwlpcl91bnJlZ2lzdGVyX21hcCgmbGlyY19tYXApOworfQorCittb2R1bGVfaW5pdChpbml0X3JjX21hcF9saXJjKQorbW9kdWxlX2V4aXQoZXhpdF9yY19tYXBfbGlyYykKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9JUi9rZXltYXBzL3JjLXJjNi1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9yYy1yYzYtbWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3MjZhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvSVIva2V5bWFwcy9yYy1yYzYtbWNlLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIHJjLXJjNi1tY2UuYyAtIEtleXRhYmxlIGZvciBXaW5kb3dzIE1lZGlhIENlbnRlciBSQy02IHJlbW90ZXMgZm9yIHVzZQorICogd2l0aCB0aGUgTWVkaWEgQ2VudGVyIEVkaXRpb24gZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIGJ5IEphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSByYzZfbWNlW10gPSB7CisJeyAweDgwMGYwNDE1LCBLRVlfUkVXSU5EIH0sCisJeyAweDgwMGYwNDE0LCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4ODAwZjA0MWIsIEtFWV9QUkVWSU9VUyB9LAorCXsgMHg4MDBmMDQxYSwgS0VZX05FWFQgfSwKKworCXsgMHg4MDBmMDQxNiwgS0VZX1BMQVkgfSwKKwl7IDB4ODAwZjA0MTgsIEtFWV9QQVVTRSB9LAorCXsgMHg4MDBmMDQxOSwgS0VZX1NUT1AgfSwKKwl7IDB4ODAwZjA0MTcsIEtFWV9SRUNPUkQgfSwKKworCXsgMHg4MDBmMDQxZSwgS0VZX1VQIH0sCisJeyAweDgwMGYwNDFmLCBLRVlfRE9XTiB9LAorCXsgMHg4MDBmMDQyMCwgS0VZX0xFRlQgfSwKKwl7IDB4ODAwZjA0MjEsIEtFWV9SSUdIVCB9LAorCisJeyAweDgwMGYwNDBiLCBLRVlfRU5URVIgfSwKKwl7IDB4ODAwZjA0MjIsIEtFWV9PSyB9LAorCXsgMHg4MDBmMDQyMywgS0VZX0VYSVQgfSwKKwl7IDB4ODAwZjA0MGEsIEtFWV9ERUxFVEUgfSwKKworCXsgMHg4MDBmMDQwZSwgS0VZX01VVEUgfSwKKwl7IDB4ODAwZjA0MTAsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHg4MDBmMDQxMSwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4ODAwZjA0MTIsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4ODAwZjA0MTMsIEtFWV9DSEFOTkVMRE9XTiB9LAorCisJeyAweDgwMGYwNDAxLCBLRVlfTlVNRVJJQ18xIH0sCisJeyAweDgwMGYwNDAyLCBLRVlfTlVNRVJJQ18yIH0sCisJeyAweDgwMGYwNDAzLCBLRVlfTlVNRVJJQ18zIH0sCisJeyAweDgwMGYwNDA0LCBLRVlfTlVNRVJJQ180IH0sCisJeyAweDgwMGYwNDA1LCBLRVlfTlVNRVJJQ181IH0sCisJeyAweDgwMGYwNDA2LCBLRVlfTlVNRVJJQ182IH0sCisJeyAweDgwMGYwNDA3LCBLRVlfTlVNRVJJQ183IH0sCisJeyAweDgwMGYwNDA4LCBLRVlfTlVNRVJJQ184IH0sCisJeyAweDgwMGYwNDA5LCBLRVlfTlVNRVJJQ185IH0sCisJeyAweDgwMGYwNDAwLCBLRVlfTlVNRVJJQ18wIH0sCisKKwl7IDB4ODAwZjA0MWQsIEtFWV9OVU1FUklDX1NUQVIgfSwKKwl7IDB4ODAwZjA0MWMsIEtFWV9OVU1FUklDX1BPVU5EIH0sCisKKwl7IDB4ODAwZjA0NDYsIEtFWV9UViB9LAorCXsgMHg4MDBmMDQ0NywgS0VZX0FVRElPIH0sIC8qIE15IE11c2ljICovCisJeyAweDgwMGYwNDQ4LCBLRVlfUFZSIH0sIC8qIFJlY29yZGVkVFYgKi8KKwl7IDB4ODAwZjA0NDksIEtFWV9DQU1FUkEgfSwKKwl7IDB4ODAwZjA0NGEsIEtFWV9WSURFTyB9LAorCXsgMHg4MDBmMDQyNCwgS0VZX0RWRCB9LAorCXsgMHg4MDBmMDQyNSwgS0VZX1RVTkVSIH0sIC8qIExpdmVUViAqLworCXsgMHg4MDBmMDQ1MCwgS0VZX1JBRElPIH0sCisKKwl7IDB4ODAwZjA0NGMsIEtFWV9MQU5HVUFHRSB9LAorCXsgMHg4MDBmMDQyNywgS0VZX1pPT00gfSwgLyogQXNwZWN0ICovCisKKwl7IDB4ODAwZjA0NWIsIEtFWV9SRUQgfSwKKwl7IDB4ODAwZjA0NWMsIEtFWV9HUkVFTiB9LAorCXsgMHg4MDBmMDQ1ZCwgS0VZX1lFTExPVyB9LAorCXsgMHg4MDBmMDQ1ZSwgS0VZX0JMVUUgfSwKKworCXsgMHg4MDBmMDQwZiwgS0VZX0lORk8gfSwKKwl7IDB4ODAwZjA0MjYsIEtFWV9FUEcgfSwgLyogR3VpZGUgKi8KKwl7IDB4ODAwZjA0NWEsIEtFWV9TVUJUSVRMRSB9LCAvKiBDYXB0aW9uL1RlbGV0ZXh0ICovCisJeyAweDgwMGYwNDRkLCBLRVlfVElUTEUgfSwKKworCXsgMHg4MDBmMDQwYywgS0VZX1BPV0VSIH0sCisJeyAweDgwMGYwNDBkLCBLRVlfUFJPRzEgfSwgLyogV2luZG93cyBNQ0UgYnV0dG9uICovCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmNfa2V5bWFwIHJjNl9tY2VfbWFwID0geworCS5tYXAgPSB7CisJCS5zY2FuICAgID0gcmM2X21jZSwKKwkJLnNpemUgICAgPSBBUlJBWV9TSVpFKHJjNl9tY2UpLAorCQkuaXJfdHlwZSA9IElSX1RZUEVfUkM2LAorCQkubmFtZSAgICA9IFJDX01BUF9SQzZfTUNFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmNfbWFwX3JjNl9tY2Uodm9pZCkKK3sKKwlyZXR1cm4gaXJfcmVnaXN0ZXJfbWFwKCZyYzZfbWNlX21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JjX21hcF9yYzZfbWNlKHZvaWQpCit7CisJaXJfdW5yZWdpc3Rlcl9tYXAoJnJjNl9tY2VfbWFwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9yY19tYXBfcmM2X21jZSkKK21vZHVsZV9leGl0KGV4aXRfcmNfbWFwX3JjNl9tY2UpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvbGlyY19kZXYuYyBiL2RyaXZlcnMvbWVkaWEvSVIvbGlyY19kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk4OTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9JUi9saXJjX2Rldi5jCkBAIC0wLDAgKzEsNzY0IEBACisvKgorICogTElSQyBiYXNlIGRyaXZlcgorICoKKyAqIGJ5IEFydHVyIExpcG93c2tpIDxhbGlwb3dza2lAaW50ZXJpYS5wbD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKworc3RhdGljIGludCBkZWJ1ZzsKKworI2RlZmluZSBJUkNUTF9ERVZfTkFNRQkiQmFzZVJlbW90ZUN0bCIKKyNkZWZpbmUgTk9QTFVHCQktMQorI2RlZmluZSBMT0dIRUFECQkibGlyY19kZXYgKCVzWyVkXSk6ICIKKworc3RhdGljIGRldl90IGxpcmNfYmFzZV9kZXY7CisKK3N0cnVjdCBpcmN0bCB7CisJc3RydWN0IGxpcmNfZHJpdmVyIGQ7CisJaW50IGF0dGFjaGVkOworCWludCBvcGVuOworCisJc3RydWN0IG11dGV4IGlyY3RsX2xvY2s7CisJc3RydWN0IGxpcmNfYnVmZmVyICpidWY7CisJdW5zaWduZWQgaW50IGNodW5rX3NpemU7CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJbG9uZyBqaWZmaWVzX3RvX3dhaXQ7CisKKwlzdHJ1Y3QgY2RldiBjZGV2OworfTsKKworc3RhdGljIERFRklORV9NVVRFWChsaXJjX2Rldl9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBpcmN0bCAqaXJjdGxzW01BWF9JUkNUTF9ERVZJQ0VTXTsKKworLyogT25seSB1c2VkIGZvciBzeXNmcyBidXQgZGVmaW5lZCB0byB2b2lkIG90aGVyd2lzZSAqLworc3RhdGljIHN0cnVjdCBjbGFzcyAqbGlyY19jbGFzczsKKworLyogIGhlbHBlciBmdW5jdGlvbgorICogIGluaXRpYWxpemVzIHRoZSBpcmN0bCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgaW5pdF9pcmN0bChzdHJ1Y3QgaXJjdGwgKmlyKQoreworCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJpbml0aWFsaXppbmcgaXJjdGxcbiIsCisJCWlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKwltdXRleF9pbml0KCZpci0+aXJjdGxfbG9jayk7CisJaXItPmQubWlub3IgPSBOT1BMVUc7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXAoc3RydWN0IGlyY3RsICppcikKK3sKKwlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAiY2xlYW5pbmcgdXBcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKworCWRldmljZV9kZXN0cm95KGxpcmNfY2xhc3MsIE1LREVWKE1BSk9SKGxpcmNfYmFzZV9kZXYpLCBpci0+ZC5taW5vcikpOworCisJaWYgKGlyLT5idWYgIT0gaXItPmQucmJ1ZikgeworCQlsaXJjX2J1ZmZlcl9mcmVlKGlyLT5idWYpOworCQlrZnJlZShpci0+YnVmKTsKKwl9CisJaXItPmJ1ZiA9IE5VTEw7Cit9CisKKy8qICBoZWxwZXIgZnVuY3Rpb24KKyAqICByZWFkcyBrZXkgY29kZXMgZnJvbSBkcml2ZXIgYW5kIHB1dHMgdGhlbSBpbnRvIGJ1ZmZlcgorICogIHJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgYWRkX3RvX2J1ZihzdHJ1Y3QgaXJjdGwgKmlyKQoreworCWlmIChpci0+ZC5hZGRfdG9fYnVmKSB7CisJCWludCByZXMgPSAtRU5PREFUQTsKKwkJaW50IGdvdF9kYXRhID0gMDsKKworCQkvKgorCQkgKiBzZXJ2aWNlIHRoZSBkZXZpY2UgYXMgbG9uZyBhcyBpdCBpcyByZXR1cm5pbmcKKwkJICogZGF0YSBhbmQgd2UgaGF2ZSBzcGFjZQorCQkgKi8KK2dldF9kYXRhOgorCQlyZXMgPSBpci0+ZC5hZGRfdG9fYnVmKGlyLT5kLmRhdGEsIGlyLT5idWYpOworCQlpZiAocmVzID09IDApIHsKKwkJCWdvdF9kYXRhKys7CisJCQlnb3RvIGdldF9kYXRhOworCQl9CisKKwkJaWYgKHJlcyA9PSAtRU5PREVWKQorCQkJa3RocmVhZF9zdG9wKGlyLT50YXNrKTsKKworCQlyZXR1cm4gZ290X2RhdGEgPyAwIDogcmVzOworCX0KKworCXJldHVybiAwOworfQorCisvKiBtYWluIGZ1bmN0aW9uIG9mIHRoZSBwb2xsaW5nIHRocmVhZAorICovCitzdGF0aWMgaW50IGxpcmNfdGhyZWFkKHZvaWQgKmlyY3RsKQoreworCXN0cnVjdCBpcmN0bCAqaXIgPSBpcmN0bDsKKworCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJwb2xsIHRocmVhZCBzdGFydGVkXG4iLAorCQlpci0+ZC5uYW1lLCBpci0+ZC5taW5vcik7CisKKwlkbyB7CisJCWlmIChpci0+b3BlbikgeworCQkJaWYgKGlyLT5qaWZmaWVzX3RvX3dhaXQpIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoaXItPmppZmZpZXNfdG9fd2FpdCk7CisJCQl9CisJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJCWJyZWFrOworCQkJaWYgKCFhZGRfdG9fYnVmKGlyKSkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlyLT5idWYtPndhaXRfcG9sbCk7CisJCX0gZWxzZSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGUoKTsKKwkJfQorCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJZGV2X2RiZyhpci0+ZC5kZXYsIExPR0hFQUQgInBvbGwgdGhyZWFkIGVuZGVkXG4iLAorCQlpci0+ZC5uYW1lLCBpci0+ZC5taW5vcik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBsaXJjX2Rldl9mb3BfcmVhZCwKKwkud3JpdGUJCT0gbGlyY19kZXZfZm9wX3dyaXRlLAorCS5wb2xsCQk9IGxpcmNfZGV2X2ZvcF9wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpcmNfZGV2X2ZvcF9pb2N0bCwKKwkub3BlbgkJPSBsaXJjX2Rldl9mb3Bfb3BlbiwKKwkucmVsZWFzZQk9IGxpcmNfZGV2X2ZvcF9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgbGlyY19jZGV2X2FkZChzdHJ1Y3QgaXJjdGwgKmlyKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGxpcmNfZHJpdmVyICpkID0gJmlyLT5kOworCisJaWYgKGQtPmZvcHMpIHsKKwkJY2Rldl9pbml0KCZpci0+Y2RldiwgZC0+Zm9wcyk7CisJCWlyLT5jZGV2Lm93bmVyID0gZC0+b3duZXI7CisJfSBlbHNlIHsKKwkJY2Rldl9pbml0KCZpci0+Y2RldiwgJmZvcHMpOworCQlpci0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCX0KKwlrb2JqZWN0X3NldF9uYW1lKCZpci0+Y2Rldi5rb2JqLCAibGlyYyVkIiwgZC0+bWlub3IpOworCisJcmV0dmFsID0gY2Rldl9hZGQoJmlyLT5jZGV2LCBNS0RFVihNQUpPUihsaXJjX2Jhc2VfZGV2KSwgZC0+bWlub3IpLCAxKTsKKwlpZiAocmV0dmFsKQorCQlrb2JqZWN0X3B1dCgmaXItPmNkZXYua29iaik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgbGlyY19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGxpcmNfZHJpdmVyICpkKQoreworCXN0cnVjdCBpcmN0bCAqaXI7CisJaW50IG1pbm9yOworCWludCBieXRlc19pbl9rZXk7CisJdW5zaWduZWQgaW50IGNodW5rX3NpemU7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOworCWludCBlcnI7CisKKwlpZiAoIWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaXJjX2RldjogbGlyY19yZWdpc3Rlcl9kcml2ZXI6ICIKKwkJICAgICAgICJkcml2ZXIgcG9pbnRlciBtdXN0IGJlIG5vdCBOVUxMIVxuIik7CisJCWVyciA9IC1FQkFEUlFDOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoTUFYX0lSQ1RMX0RFVklDRVMgPD0gZC0+bWlub3IpIHsKKwkJZGV2X2VycihkLT5kZXYsICJsaXJjX2RldjogbGlyY19yZWdpc3Rlcl9kcml2ZXI6ICIKKwkJCSJcIm1pbm9yXCIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkICglZCkhXG4iLAorCQkJTUFYX0lSQ1RMX0RFVklDRVMtMSwgZC0+bWlub3IpOworCQllcnIgPSAtRUJBRFJRQzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKDEgPiBkLT5jb2RlX2xlbmd0aCB8fCAoQlVGTEVOICogOCkgPCBkLT5jb2RlX2xlbmd0aCkgeworCQlkZXZfZXJyKGQtPmRldiwgImxpcmNfZGV2OiBsaXJjX3JlZ2lzdGVyX2RyaXZlcjogIgorCQkJImNvZGUgbGVuZ3RoIGluIGJpdHMgZm9yIG1pbm9yICglZCkgIgorCQkJIm11c3QgYmUgbGVzcyB0aGFuICVkIVxuIiwKKwkJCWQtPm1pbm9yLCBCVUZMRU4gKiA4KTsKKwkJZXJyID0gLUVCQURSUUM7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9kYmcoZC0+ZGV2LCAibGlyY19kZXY6IGxpcmNfcmVnaXN0ZXJfZHJpdmVyOiBzYW1wbGVfcmF0ZTogJWRcbiIsCisJCWQtPnNhbXBsZV9yYXRlKTsKKwlpZiAoZC0+c2FtcGxlX3JhdGUpIHsKKwkJaWYgKDIgPiBkLT5zYW1wbGVfcmF0ZSB8fCBIWiA8IGQtPnNhbXBsZV9yYXRlKSB7CisJCQlkZXZfZXJyKGQtPmRldiwgImxpcmNfZGV2OiBsaXJjX3JlZ2lzdGVyX2RyaXZlcjogIgorCQkJCSJzYW1wbGVfcmF0ZSBtdXN0IGJlIGJldHdlZW4gMiBhbmQgJWQhXG4iLCBIWik7CisJCQllcnIgPSAtRUJBRFJRQzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICghZC0+YWRkX3RvX2J1ZikgeworCQkJZGV2X2VycihkLT5kZXYsICJsaXJjX2RldjogbGlyY19yZWdpc3Rlcl9kcml2ZXI6ICIKKwkJCQkiYWRkX3RvX2J1ZiBjYW5ub3QgYmUgTlVMTCB3aGVuICIKKwkJCQkic2FtcGxlX3JhdGUgaXMgc2V0XG4iKTsKKwkJCWVyciA9IC1FQkFEUlFDOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKCEoZC0+Zm9wcyAmJiBkLT5mb3BzLT5yZWFkKSAmJiAhZC0+cmJ1ZikgeworCQlkZXZfZXJyKGQtPmRldiwgImxpcmNfZGV2OiBsaXJjX3JlZ2lzdGVyX2RyaXZlcjogIgorCQkJImZvcHMtPnJlYWQgYW5kIHJidWYgY2Fubm90IGFsbCBiZSBOVUxMIVxuIik7CisJCWVyciA9IC1FQkFEUlFDOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKCFkLT5yYnVmKSB7CisJCWlmICghKGQtPmZvcHMgJiYgZC0+Zm9wcy0+cmVhZCAmJiBkLT5mb3BzLT5wb2xsICYmCisJCSAgICAgIGQtPmZvcHMtPnVubG9ja2VkX2lvY3RsKSkgeworCQkJZGV2X2VycihkLT5kZXYsICJsaXJjX2RldjogbGlyY19yZWdpc3Rlcl9kcml2ZXI6ICIKKwkJCQkibmVpdGhlciByZWFkLCBwb2xsIG5vciB1bmxvY2tlZF9pb2N0bCBjYW4gYmUgTlVMTCFcbiIpOworCQkJZXJyID0gLUVCQURSUUM7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCW11dGV4X2xvY2soJmxpcmNfZGV2X2xvY2spOworCisJbWlub3IgPSBkLT5taW5vcjsKKworCWlmIChtaW5vciA8IDApIHsKKwkJLyogZmluZCBmaXJzdCBmcmVlIHNsb3QgZm9yIGRyaXZlciAqLworCQlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBNQVhfSVJDVExfREVWSUNFUzsgbWlub3IrKykKKwkJCWlmICghaXJjdGxzW21pbm9yXSkKKwkJCQlicmVhazsKKwkJaWYgKE1BWF9JUkNUTF9ERVZJQ0VTID09IG1pbm9yKSB7CisJCQlkZXZfZXJyKGQtPmRldiwgImxpcmNfZGV2OiBsaXJjX3JlZ2lzdGVyX2RyaXZlcjogIgorCQkJCSJubyBmcmVlIHNsb3RzIGZvciBkcml2ZXJzIVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXRfbG9jazsKKwkJfQorCX0gZWxzZSBpZiAoaXJjdGxzW21pbm9yXSkgeworCQlkZXZfZXJyKGQtPmRldiwgImxpcmNfZGV2OiBsaXJjX3JlZ2lzdGVyX2RyaXZlcjogIgorCQkJIm1pbm9yICglZCkganVzdCByZWdpc3RlcmVkIVxuIiwgbWlub3IpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2xvY2s7CisJfQorCisJaXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJjdGwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2xvY2s7CisJfQorCWluaXRfaXJjdGwoaXIpOworCWlyY3Rsc1ttaW5vcl0gPSBpcjsKKwlkLT5taW5vciA9IG1pbm9yOworCisJaWYgKGQtPnNhbXBsZV9yYXRlKSB7CisJCWlyLT5qaWZmaWVzX3RvX3dhaXQgPSBIWiAvIGQtPnNhbXBsZV9yYXRlOworCX0gZWxzZSB7CisJCS8qIGl0IG1lYW5zIC0gd2FpdCBmb3IgZXh0ZXJuYWwgZXZlbnQgaW4gdGFzayBxdWV1ZSAqLworCQlpci0+amlmZmllc190b193YWl0ID0gMDsKKwl9CisKKwkvKiBzb21lIHNhZmV0eSBjaGVjayA4LSkgKi8KKwlkLT5uYW1lW3NpemVvZihkLT5uYW1lKS0xXSA9ICdcMCc7CisKKwlieXRlc19pbl9rZXkgPSBCSVRTX1RPX0xPTkdTKGQtPmNvZGVfbGVuZ3RoKSArCisJCQkoZC0+Y29kZV9sZW5ndGggJSA4ID8gMSA6IDApOworCWJ1ZmZlcl9zaXplID0gZC0+YnVmZmVyX3NpemUgPyBkLT5idWZmZXJfc2l6ZSA6IEJVRkxFTiAvIGJ5dGVzX2luX2tleTsKKwljaHVua19zaXplICA9IGQtPmNodW5rX3NpemUgID8gZC0+Y2h1bmtfc2l6ZSAgOiBieXRlc19pbl9rZXk7CisKKwlpZiAoZC0+cmJ1ZikgeworCQlpci0+YnVmID0gZC0+cmJ1ZjsKKwl9IGVsc2UgeworCQlpci0+YnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaXItPmJ1ZikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKwkJZXJyID0gbGlyY19idWZmZXJfaW5pdChpci0+YnVmLCBjaHVua19zaXplLCBidWZmZXJfc2l6ZSk7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlKGlyLT5idWYpOworCQkJZ290byBvdXRfbG9jazsKKwkJfQorCX0KKwlpci0+Y2h1bmtfc2l6ZSA9IGlyLT5idWYtPmNodW5rX3NpemU7CisKKwlpZiAoZC0+ZmVhdHVyZXMgPT0gMCkKKwkJZC0+ZmVhdHVyZXMgPSBMSVJDX0NBTl9SRUNfTElSQ0NPREU7CisKKwlpci0+ZCA9ICpkOworCWlyLT5kLm1pbm9yID0gbWlub3I7CisKKwlkZXZpY2VfY3JlYXRlKGxpcmNfY2xhc3MsIGlyLT5kLmRldiwKKwkJICAgICAgTUtERVYoTUFKT1IobGlyY19iYXNlX2RldiksIGlyLT5kLm1pbm9yKSwgTlVMTCwKKwkJICAgICAgImxpcmMldSIsIGlyLT5kLm1pbm9yKTsKKworCWlmIChkLT5zYW1wbGVfcmF0ZSkgeworCQkvKiB0cnkgdG8gZmlyZSB1cCBwb2xsaW5nIHRocmVhZCAqLworCQlpci0+dGFzayA9IGt0aHJlYWRfcnVuKGxpcmNfdGhyZWFkLCAodm9pZCAqKWlyLCAibGlyY19kZXYiKTsKKwkJaWYgKElTX0VSUihpci0+dGFzaykpIHsKKwkJCWRldl9lcnIoZC0+ZGV2LCAibGlyY19kZXY6IGxpcmNfcmVnaXN0ZXJfZHJpdmVyOiAiCisJCQkJImNhbm5vdCBydW4gcG9sbCB0aHJlYWQgZm9yIG1pbm9yID0gJWRcbiIsCisJCQkJZC0+bWlub3IpOworCQkJZXJyID0gLUVDSElMRDsKKwkJCWdvdG8gb3V0X3N5c2ZzOworCQl9CisJfQorCisJZXJyID0gbGlyY19jZGV2X2FkZChpcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfc3lzZnM7CisKKwlpci0+YXR0YWNoZWQgPSAxOworCW11dGV4X3VubG9jaygmbGlyY19kZXZfbG9jayk7CisKKwlkZXZfaW5mbyhpci0+ZC5kZXYsICJsaXJjX2RldjogZHJpdmVyICVzIHJlZ2lzdGVyZWQgYXQgbWlub3IgPSAlZFxuIiwKKwkJIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKwlyZXR1cm4gbWlub3I7CisKK291dF9zeXNmczoKKwlkZXZpY2VfZGVzdHJveShsaXJjX2NsYXNzLCBNS0RFVihNQUpPUihsaXJjX2Jhc2VfZGV2KSwgaXItPmQubWlub3IpKTsKK291dF9sb2NrOgorCW11dGV4X3VubG9jaygmbGlyY19kZXZfbG9jayk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGlyY19yZWdpc3Rlcl9kcml2ZXIpOworCitpbnQgbGlyY191bnJlZ2lzdGVyX2RyaXZlcihpbnQgbWlub3IpCit7CisJc3RydWN0IGlyY3RsICppcjsKKworCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPj0gTUFYX0lSQ1RMX0RFVklDRVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaXJjX2RldjogbGlyY191bnJlZ2lzdGVyX2RyaXZlcjogIgorCQkgICAgICAgIlwibWlub3IgKCVkKVwiIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAlZCFcbiIsCisJCSAgICAgICBtaW5vciwgTUFYX0lSQ1RMX0RFVklDRVMtMSk7CisJCXJldHVybiAtRUJBRFJRQzsKKwl9CisKKwlpciA9IGlyY3Rsc1ttaW5vcl07CisKKwltdXRleF9sb2NrKCZsaXJjX2Rldl9sb2NrKTsKKworCWlmIChpci0+ZC5taW5vciAhPSBtaW5vcikgeworCQlwcmludGsoS0VSTl9FUlIgImxpcmNfZGV2OiBsaXJjX3VucmVnaXN0ZXJfZHJpdmVyOiAiCisJCSAgICAgICAibWlub3IgKCVkKSBkZXZpY2Ugbm90IHJlZ2lzdGVyZWQhIiwgbWlub3IpOworCQltdXRleF91bmxvY2soJmxpcmNfZGV2X2xvY2spOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBlbmQgdXAgcG9sbGluZyB0aHJlYWQgKi8KKwlpZiAoaXItPnRhc2spCisJCWt0aHJlYWRfc3RvcChpci0+dGFzayk7CisKKwlkZXZfZGJnKGlyLT5kLmRldiwgImxpcmNfZGV2OiBkcml2ZXIgJXMgdW5yZWdpc3RlcmVkIGZyb20gbWlub3IgPSAlZFxuIiwKKwkJaXItPmQubmFtZSwgaXItPmQubWlub3IpOworCisJaXItPmF0dGFjaGVkID0gMDsKKwlpZiAoaXItPm9wZW4pIHsKKwkJZGV2X2RiZyhpci0+ZC5kZXYsIExPR0hFQUQgInJlbGVhc2luZyBvcGVuZWQgZHJpdmVyXG4iLAorCQkJaXItPmQubmFtZSwgaXItPmQubWlub3IpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlyLT5idWYtPndhaXRfcG9sbCk7CisJCW11dGV4X2xvY2soJmlyLT5pcmN0bF9sb2NrKTsKKwkJaXItPmQuc2V0X3VzZV9kZWMoaXItPmQuZGF0YSk7CisJCW1vZHVsZV9wdXQoaXItPmQub3duZXIpOworCQltdXRleF91bmxvY2soJmlyLT5pcmN0bF9sb2NrKTsKKwkJY2Rldl9kZWwoJmlyLT5jZGV2KTsKKwl9IGVsc2UgeworCQljbGVhbnVwKGlyKTsKKwkJY2Rldl9kZWwoJmlyLT5jZGV2KTsKKwkJa2ZyZWUoaXIpOworCQlpcmN0bHNbbWlub3JdID0gTlVMTDsKKwl9CisKKwltdXRleF91bmxvY2soJmxpcmNfZGV2X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIpOworCitpbnQgbGlyY19kZXZfZm9wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlyY3RsICppcjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChpbWlub3IoaW5vZGUpID49IE1BWF9JUkNUTF9ERVZJQ0VTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxpcmNfZGV2IFslZF06IG9wZW4gcmVzdWx0ID0gLUVOT0RFVlxuIiwKKwkJICAgICAgIGltaW5vcihpbm9kZSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsaXJjX2Rldl9sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlyID0gaXJjdGxzW2ltaW5vcihpbm9kZSldOworCWlmICghaXIpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaXI7CisKKwlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAib3BlbiBjYWxsZWRcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKworCWlmIChpci0+ZC5taW5vciA9PSBOT1BMVUcpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoaXItPm9wZW4pIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICh0cnlfbW9kdWxlX2dldChpci0+ZC5vd25lcikpIHsKKwkJKytpci0+b3BlbjsKKwkJcmV0dmFsID0gaXItPmQuc2V0X3VzZV9pbmMoaXItPmQuZGF0YSk7CisKKwkJaWYgKHJldHZhbCkgeworCQkJbW9kdWxlX3B1dChpci0+ZC5vd25lcik7CisJCQktLWlyLT5vcGVuOworCQl9IGVsc2UgeworCQkJbGlyY19idWZmZXJfY2xlYXIoaXItPmJ1Zik7CisJCX0KKwkJaWYgKGlyLT50YXNrKQorCQkJd2FrZV91cF9wcm9jZXNzKGlyLT50YXNrKTsKKwl9CisKK2Vycm9yOgorCWlmIChpcikKKwkJZGV2X2RiZyhpci0+ZC5kZXYsIExPR0hFQUQgIm9wZW4gcmVzdWx0ID0gJWRcbiIsCisJCQlpci0+ZC5uYW1lLCBpci0+ZC5taW5vciwgcmV0dmFsKTsKKworCW11dGV4X3VubG9jaygmbGlyY19kZXZfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChsaXJjX2Rldl9mb3Bfb3Blbik7CisKK2ludCBsaXJjX2Rldl9mb3BfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlyY3RsICppciA9IGlyY3Rsc1tpbWlub3IoaW5vZGUpXTsKKworCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJjbG9zZSBjYWxsZWRcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKworCVdBUk5fT04obXV0ZXhfbG9ja19raWxsYWJsZSgmbGlyY19kZXZfbG9jaykpOworCisJLS1pci0+b3BlbjsKKwlpZiAoaXItPmF0dGFjaGVkKSB7CisJCWlyLT5kLnNldF91c2VfZGVjKGlyLT5kLmRhdGEpOworCQltb2R1bGVfcHV0KGlyLT5kLm93bmVyKTsKKwl9IGVsc2UgeworCQljbGVhbnVwKGlyKTsKKwkJaXJjdGxzW2lyLT5kLm1pbm9yXSA9IE5VTEw7CisJCWtmcmVlKGlyKTsKKwl9CisKKwltdXRleF91bmxvY2soJmxpcmNfZGV2X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpcmNfZGV2X2ZvcF9jbG9zZSk7CisKK3Vuc2lnbmVkIGludCBsaXJjX2Rldl9mb3BfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgaXJjdGwgKmlyID0gaXJjdGxzW2ltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSldOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAicG9sbCBjYWxsZWRcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKworCWlmICghaXItPmF0dGFjaGVkKSB7CisJCW11dGV4X3VubG9jaygmaXItPmlyY3RsX2xvY2spOworCQlyZXR1cm4gUE9MTEVSUjsKKwl9CisKKwlwb2xsX3dhaXQoZmlsZSwgJmlyLT5idWYtPndhaXRfcG9sbCwgd2FpdCk7CisKKwlpZiAoaXItPmJ1ZikKKwkJaWYgKGxpcmNfYnVmZmVyX2VtcHR5KGlyLT5idWYpKQorCQkJcmV0ID0gMDsKKwkJZWxzZQorCQkJcmV0ID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwllbHNlCisJCXJldCA9IFBPTExFUlI7CisKKwlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAicG9sbCByZXN1bHQgPSAlZFxuIiwKKwkJaXItPmQubmFtZSwgaXItPmQubWlub3IsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChsaXJjX2Rldl9mb3BfcG9sbCk7CisKK2xvbmcgbGlyY19kZXZfZm9wX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIG1vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGlyY3RsICppciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJpb2N0bCBjYWxsZWQgKDB4JXgpXG4iLAorCQlpci0+ZC5uYW1lLCBpci0+ZC5taW5vciwgY21kKTsKKworCWlmIChpci0+ZC5taW5vciA9PSBOT1BMVUcgfHwgIWlyLT5hdHRhY2hlZCkgeworCQlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAiaW9jdGwgcmVzdWx0ID0gLUVOT0RFVlxuIiwKKwkJCWlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXV0ZXhfbG9jaygmaXItPmlyY3RsX2xvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIExJUkNfR0VUX0ZFQVRVUkVTOgorCQlyZXN1bHQgPSBwdXRfdXNlcihpci0+ZC5mZWF0dXJlcywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCQlicmVhazsKKwljYXNlIExJUkNfR0VUX1JFQ19NT0RFOgorCQlpZiAoIShpci0+ZC5mZWF0dXJlcyAmIExJUkNfQ0FOX1JFQ19NQVNLKSkgeworCQkJcmVzdWx0ID0gLUVOT1NZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHV0X3VzZXIoTElSQ19SRUMyTU9ERQorCQkJCSAgKGlyLT5kLmZlYXR1cmVzICYgTElSQ19DQU5fUkVDX01BU0spLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCQlicmVhazsKKwljYXNlIExJUkNfU0VUX1JFQ19NT0RFOgorCQlpZiAoIShpci0+ZC5mZWF0dXJlcyAmIExJUkNfQ0FOX1JFQ19NQVNLKSkgeworCQkJcmVzdWx0ID0gLUVOT1NZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gZ2V0X3VzZXIobW9kZSwgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCQlpZiAoIXJlc3VsdCAmJiAhKExJUkNfTU9ERTJSRUMobW9kZSkgJiBpci0+ZC5mZWF0dXJlcykpCisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkvKgorCQkgKiBGSVhNRTogV2Ugc2hvdWxkIGFjdHVhbGx5IHNldCB0aGUgbW9kZSBzb21laG93IGJ1dAorCQkgKiBmb3Igbm93LCBsaXJjX3NlcmlhbCBkb2Vzbid0IHN1cHBvcnQgbW9kZSBjaGFuZ2luZyBlaXRoZXIKKwkJICovCisJCWJyZWFrOworCWNhc2UgTElSQ19HRVRfTEVOR1RIOgorCQlyZXN1bHQgPSBwdXRfdXNlcihpci0+ZC5jb2RlX2xlbmd0aCwgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCQlicmVhazsKKwljYXNlIExJUkNfR0VUX01JTl9USU1FT1VUOgorCQlpZiAoIShpci0+ZC5mZWF0dXJlcyAmIExJUkNfQ0FOX1NFVF9SRUNfVElNRU9VVCkgfHwKKwkJICAgIGlyLT5kLm1pbl90aW1lb3V0ID09IDApIHsKKwkJCXJlc3VsdCA9IC1FTk9TWVM7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHB1dF91c2VyKGlyLT5kLm1pbl90aW1lb3V0LCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgTElSQ19HRVRfTUFYX1RJTUVPVVQ6CisJCWlmICghKGlyLT5kLmZlYXR1cmVzICYgTElSQ19DQU5fU0VUX1JFQ19USU1FT1VUKSB8fAorCQkgICAgaXItPmQubWF4X3RpbWVvdXQgPT0gMCkgeworCQkJcmVzdWx0ID0gLUVOT1NZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHV0X3VzZXIoaXItPmQubWF4X3RpbWVvdXQsICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAiaW9jdGwgcmVzdWx0ID0gJWRcbiIsCisJCWlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yLCByZXN1bHQpOworCisJbXV0ZXhfdW5sb2NrKCZpci0+aXJjdGxfbG9jayk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChsaXJjX2Rldl9mb3BfaW9jdGwpOworCitzc2l6ZV90IGxpcmNfZGV2X2ZvcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICBjaGFyICpidWZmZXIsCisJCQkgIHNpemVfdCBsZW5ndGgsCisJCQkgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaXJjdGwgKmlyID0gaXJjdGxzW2ltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSldOworCXVuc2lnbmVkIGNoYXIgYnVmW2lyLT5jaHVua19zaXplXTsKKwlpbnQgcmV0ID0gMCwgd3JpdHRlbiA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlkZXZfZGJnKGlyLT5kLmRldiwgTE9HSEVBRCAicmVhZCBjYWxsZWRcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmlyLT5pcmN0bF9sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpZiAoIWlyLT5hdHRhY2hlZCkgeworCQltdXRleF91bmxvY2soJmlyLT5pcmN0bF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGxlbmd0aCAlIGlyLT5jaHVua19zaXplKSB7CisJCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJyZWFkIHJlc3VsdCA9IC1FSU5WQUxcbiIsCisJCQlpci0+ZC5uYW1lLCBpci0+ZC5taW5vcik7CisJCW11dGV4X3VubG9jaygmaXItPmlyY3RsX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHdlIGFkZCBvdXJzZWx2ZXMgdG8gdGhlIHRhc2sgcXVldWUgYmVmb3JlIGJ1ZmZlciBjaGVjaworCSAqIHRvIGF2b2lkIGxvc2luZyBzY2FuIGNvZGUgKGluIGNhc2Ugd2hlbiBxdWV1ZSBpcyBhd2FrZW4gc29tZXdoZXJlCisJICogYmV0d2VlbiB3aGlsZSBjb25kaXRpb24gY2hlY2tpbmcgYW5kIHNjaGVkdWxpbmcpCisJICovCisJYWRkX3dhaXRfcXVldWUoJmlyLT5idWYtPndhaXRfcG9sbCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkvKgorCSAqIHdoaWxlIHdlIGRpZG4ndCBwcm92aWRlICdsZW5ndGgnIGJ5dGVzLCBkZXZpY2UgaXMgb3BlbmVkIGluIGJsb2NraW5nCisJICogbW9kZSBhbmQgJ2NvcHlfdG9fdXNlcicgaXMgaGFwcHksIHdhaXQgZm9yIGRhdGEuCisJICovCisJd2hpbGUgKHdyaXR0ZW4gPCBsZW5ndGggJiYgcmV0ID09IDApIHsKKwkJaWYgKGxpcmNfYnVmZmVyX2VtcHR5KGlyLT5idWYpKSB7CisJCQkvKiBBY2NvcmRpbmcgdG8gdGhlIHJlYWQoMikgbWFuIHBhZ2UsICd3cml0dGVuJyBjYW4gYmUKKwkJCSAqIHJldHVybmVkIGFzIGxlc3MgdGhhbiAnbGVuZ3RoJywgaW5zdGVhZCBvZiBibG9ja2luZworCQkJICogYWdhaW4sIHJldHVybmluZyAtRVdPVUxEQkxPQ0ssIG9yIHJldHVybmluZworCQkJICogLUVSRVNUQVJUU1lTICovCisJCQlpZiAod3JpdHRlbikKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbXV0ZXhfdW5sb2NrKCZpci0+aXJjdGxfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaXItPmlyY3RsX2xvY2spKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZpci0+YnVmLT53YWl0X3BvbGwsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCWdvdG8gb3V0X3VubG9ja2VkOworCQkJfQorCisJCQlpZiAoIWlyLT5hdHRhY2hlZCkgeworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsaXJjX2J1ZmZlcl9yZWFkKGlyLT5idWYsIGJ1Zik7CisJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgKilidWZmZXIrd3JpdHRlbiwgYnVmLAorCQkJCQkgICBpci0+YnVmLT5jaHVua19zaXplKTsKKwkJCXdyaXR0ZW4gKz0gaXItPmJ1Zi0+Y2h1bmtfc2l6ZTsKKwkJfQorCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZpci0+YnVmLT53YWl0X3BvbGwsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCW11dGV4X3VubG9jaygmaXItPmlyY3RsX2xvY2spOworCitvdXRfdW5sb2NrZWQ6CisJZGV2X2RiZyhpci0+ZC5kZXYsIExPR0hFQUQgInJlYWQgcmVzdWx0ID0gJXMgKCVkKVxuIiwKKwkJaXItPmQubmFtZSwgaXItPmQubWlub3IsIHJldCA/ICItRUZBVUxUIiA6ICJPSyIsIHJldCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogd3JpdHRlbjsKK30KK0VYUE9SVF9TWU1CT0wobGlyY19kZXZfZm9wX3JlYWQpOworCit2b2lkICpsaXJjX2dldF9wZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl2b2lkICpkYXRhID0gTlVMTDsKKworCWlmIChmaWxlICYmIGZpbGUtPmZfZGVudHJ5ICYmIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlICYmCisJICAgIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYpIHsKKwkJc3RydWN0IGlyY3RsICppcjsKKwkJaXIgPSBpcmN0bHNbaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKV07CisJCWRhdGEgPSBpci0+ZC5kYXRhOworCX0KKworCXJldHVybiBkYXRhOworfQorRVhQT1JUX1NZTUJPTChsaXJjX2dldF9wZGF0YSk7CisKKworc3NpemVfdCBsaXJjX2Rldl9mb3Bfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaXJjdGwgKmlyID0gaXJjdGxzW2ltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSldOworCisJZGV2X2RiZyhpci0+ZC5kZXYsIExPR0hFQUQgIndyaXRlIGNhbGxlZFxuIiwgaXItPmQubmFtZSwgaXItPmQubWlub3IpOworCisJaWYgKCFpci0+YXR0YWNoZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKGxpcmNfZGV2X2ZvcF93cml0ZSk7CisKKworc3RhdGljIGludCBfX2luaXQgbGlyY19kZXZfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlsaXJjX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibGlyYyIpOworCWlmIChJU19FUlIobGlyY19jbGFzcykpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihsaXJjX2NsYXNzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaXJjX2RldjogY2xhc3NfY3JlYXRlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dmFsID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmbGlyY19iYXNlX2RldiwgMCwgTUFYX0lSQ1RMX0RFVklDRVMsCisJCQkJICAgICBJUkNUTF9ERVZfTkFNRSk7CisJaWYgKHJldHZhbCkgeworCQljbGFzc19kZXN0cm95KGxpcmNfY2xhc3MpOworCQlwcmludGsoS0VSTl9FUlIgImxpcmNfZGV2OiBhbGxvY19jaHJkZXZfcmVnaW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisKKwlwcmludGsoS0VSTl9JTkZPICJsaXJjX2RldjogSVIgUmVtb3RlIENvbnRyb2wgZHJpdmVyIHJlZ2lzdGVyZWQsICIKKwkgICAgICAgIm1ham9yICVkIFxuIiwgTUFKT1IobGlyY19iYXNlX2RldikpOworCitlcnJvcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKworc3RhdGljIHZvaWQgX19leGl0IGxpcmNfZGV2X2V4aXQodm9pZCkKK3sKKwljbGFzc19kZXN0cm95KGxpcmNfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihsaXJjX2Jhc2VfZGV2LCBNQVhfSVJDVExfREVWSUNFUyk7CisJcHJpbnRrKEtFUk5fSU5GTyAibGlyY19kZXY6IG1vZHVsZSB1bmxvYWRlZFxuIik7Cit9CisKK21vZHVsZV9pbml0KGxpcmNfZGV2X2luaXQpOworbW9kdWxlX2V4aXQobGlyY19kZXZfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTElSQyBiYXNlIGRyaXZlciBtb2R1bGUiKTsKK01PRFVMRV9BVVRIT1IoIkFydHVyIExpcG93c2tpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvSVIvbWNldXNiLmMgYi9kcml2ZXJzL21lZGlhL0lSL21jZXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YmY3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL0lSL21jZXVzYi5jCkBAIC0wLDAgKzEsMTE0MyBAQAorLyoKKyAqIERyaXZlciBmb3IgVVNCIFdpbmRvd3MgTWVkaWEgQ2VudGVyIEVkLiBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgYnkgSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSBvcmlnaW5hbCBsaXJjX21jZXVzYiBhbmQgbGlyY19tY2V1c2IyIGRyaXZlcnMsIGJ5IERhbgorICogQ29udGksIE1hcnRpbiBCbGF0dGVyIGFuZCBEYW5pZWwgTWVsYW5kZXIsIHRoZSBsYXR0ZXIgb2Ygd2hpY2ggd2FzCisgKiBpbiB0dXJuIGFsc28gYmFzZWQgb24gdGhlIGxpcmNfYXRpdXNiIGRyaXZlciBieSBQYXVsIE1pbGxlci4gVGhlCisgKiB0d28gbWNlIGRyaXZlcnMgd2VyZSBtZXJnZWQgaW50byBvbmUgYnkgSmFyb2QgV2lsc29uLCB3aXRoIHRyYW5zbWl0CisgKiBzdXBwb3J0IGZvciB0aGUgMXN0LWdlbiBkZXZpY2UgYWRkZWQgcHJpbWFyaWx5IGJ5IFBhdHJpY2sgQ2FsaG91biwKKyAqIHdpdGggYSBiaXQgb2YgdHdlYWtzIGJ5IEphcm9kLiBEZWJ1Z2dpbmcgaW1wcm92ZW1lbnRzIGFuZCBwcm9wZXIKKyAqIHN1cHBvcnQgZm9yIHdoYXQgYXBwZWFycyB0byBiZSAzcmQtZ2VuIGhhcmR3YXJlIGFkZGVkIGJ5IEphcm9kLgorICogSW5pdGlhbCBwb3J0IGZyb20gbGlyYyBkcml2ZXIgdG8gaXItY29yZSBkcml2ZXJ5IGJ5IEphcm9kLCBiYXNlZAorICogcGFydGlhbGx5IG9uIGEgcG9ydCB0byBhbiBlYXJsaWVyIHByb3Bvc2VkIElSIGluZnJhc3RydWN0dXJlIGJ5CisgKiBKb24gU21pcmwsIHdoaWNoIGluY2x1ZGVkIGVuaGFuY2VtZW50cyBhbmQgc2ltcGxpZmljYXRpb25zIHRvIHRoZQorICogaW5jb21pbmcgSVIgYnVmZmVyIHBhcnNpbmcgcm91dGluZXMuCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvaXItY29tbW9uLmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjEuOTEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJIkphcm9kIFdpbHNvbiA8amFyb2RAd2lsc29uZXQuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJIldpbmRvd3MgTWVkaWEgQ2VudGVyIEVkLiBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAiIFwKKwkJCSJkZXZpY2UgZHJpdmVyIgorI2RlZmluZSBEUklWRVJfTkFNRQkibWNldXNiIgorCisjZGVmaW5lIFVTQl9CVUZMRU4JMzIJLyogVVNCIHJlY2VwdGlvbiBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIFVTQl9DVFJMX01TR19TWgkyCS8qIFNpemUgb2YgdXNiIGN0cmwgbXNnIG9uIGdlbjEgaHcgKi8KKyNkZWZpbmUgTUNFX0cxX0lOSVRfTVNHUyA0MAkvKiBJbml0IG1lc3NhZ2VzIG9uIGdlbjEgaHcgdG8gdGhyb3cgb3V0ICovCisKKy8qIE1DRSBjb25zdGFudHMgKi8KKyNkZWZpbmUgTUNFX0NNREJVRl9TSVpFCTM4NCAvKiBNQ0UgQ29tbWFuZCBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIE1DRV9USU1FX1VOSVQJNTAgLyogQXBwcm94IDUwdXMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBNQ0VfQ09ERV9MRU5HVEgJNSAvKiBOb3JtYWwgbGVuZ3RoIG9mIHBhY2tldCAod2l0aCBoZWFkZXIpICovCisjZGVmaW5lIE1DRV9QQUNLRVRfU0laRQk0IC8qIE5vcm1hbCBsZW5ndGggb2YgcGFja2V0ICh3aXRob3V0IGhlYWRlcikgKi8KKyNkZWZpbmUgTUNFX1BBQ0tFVF9IRUFERVIgMHg4NCAvKiBBY3R1YWwgaGVhZGVyIGZvcm1hdCBpcyAweDgwICsgbnVtX2J5dGVzICovCisjZGVmaW5lIE1DRV9DT05UUk9MX0hFQURFUiAweDlGIC8qIE1DRSBzdGF0dXMgaGVhZGVyICovCisjZGVmaW5lIE1DRV9UWF9IRUFERVJfTEVOR1RIIDMgLyogIyBvZiBieXRlcyBpbiB0aGUgaW5pdGlhbGl6aW5nIHR4IGhlYWRlciAqLworI2RlZmluZSBNQ0VfTUFYX0NIQU5ORUxTIDIgLyogVHdvIHRyYW5zbWl0dGVycywgaGFyZHdhcmUgZGVwZW5kZW50PyAqLworI2RlZmluZSBNQ0VfREVGQVVMVF9UWF9NQVNLIDB4MDMgLyogVmFsIG9wdHM6IFRYMT0weDAxLCBUWDI9MHgwMiwgQUxMPTB4MDMgKi8KKyNkZWZpbmUgTUNFX1BVTFNFX0JJVAkweDgwIC8qIFB1bHNlIGJpdCwgTVNCIHNldCA9PSBQVUxTRSBlbHNlIFNQQUNFICovCisjZGVmaW5lIE1DRV9QVUxTRV9NQVNLCTB4N0YgLyogUHVsc2UgbWFzayAqLworI2RlZmluZSBNQ0VfTUFYX1BVTFNFX0xFTkdUSCAweDdGIC8qIExvbmdlc3QgdHJhbnNtaXR0YWJsZSBwdWxzZSBzeW1ib2wgKi8KKyNkZWZpbmUgTUNFX1BBQ0tFVF9MRU5HVEhfTUFTSyAgMHgxRiAvKiBQYWNrZXQgbGVuZ3RoIG1hc2sgKi8KKworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKK3N0YXRpYyBpbnQgZGVidWcgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVidWc7CisjZW5kaWYKKworLyogZ2VuZXJhbCBjb25zdGFudHMgKi8KKyNkZWZpbmUgU0VORF9GTEFHX0lOX1BST0dSRVNTCTEKKyNkZWZpbmUgU0VORF9GTEFHX0NPTVBMRVRFCTIKKyNkZWZpbmUgUkVDVl9GTEFHX0lOX1BST0dSRVNTCTMKKyNkZWZpbmUgUkVDVl9GTEFHX0NPTVBMRVRFCTQKKworI2RlZmluZSBNQ0VVU0JfUlgJCTEKKyNkZWZpbmUgTUNFVVNCX1RYCQkyCisKKyNkZWZpbmUgVkVORE9SX1BISUxJUFMJCTB4MDQ3MQorI2RlZmluZSBWRU5ET1JfU01LCQkweDA2MDkKKyNkZWZpbmUgVkVORE9SX1RBVFVORwkJMHgxNDYwCisjZGVmaW5lIFZFTkRPUl9HQVRFV0FZCQkweDEwN2IKKyNkZWZpbmUgVkVORE9SX1NIVVRUTEUJCTB4MTMwOAorI2RlZmluZSBWRU5ET1JfU0hVVFRMRTIJCTB4MDUxYworI2RlZmluZSBWRU5ET1JfTUlUU1VNSQkJMHgwM2VlCisjZGVmaW5lIFZFTkRPUl9UT1BTRUVECQkweDE3ODQKKyNkZWZpbmUgVkVORE9SX1JJQ0FWSVNJT04JMHgxNzlkCisjZGVmaW5lIFZFTkRPUl9JVFJPTgkJMHgxOTVkCisjZGVmaW5lIFZFTkRPUl9GSUMJCTB4MTUwOQorI2RlZmluZSBWRU5ET1JfTEcJCTB4MDQzZQorI2RlZmluZSBWRU5ET1JfTUlDUk9TT0ZUCTB4MDQ1ZQorI2RlZmluZSBWRU5ET1JfRk9STU9TQQkJMHgxNDdhCisjZGVmaW5lIFZFTkRPUl9GSU5URUsJCTB4MTkzNAorI2RlZmluZSBWRU5ET1JfUElOTkFDTEUJCTB4MjMwNAorI2RlZmluZSBWRU5ET1JfRUNTCQkweDEwMTkKKyNkZWZpbmUgVkVORE9SX1dJU1RST04JCTB4MGZiOAorI2RlZmluZSBWRU5ET1JfQ09NUFJPCQkweDE4NWIKKyNkZWZpbmUgVkVORE9SX05PUlRIU1RBUgkweDA0ZWIKKyNkZWZpbmUgVkVORE9SX1JFQUxURUsJCTB4MGJkYQorI2RlZmluZSBWRU5ET1JfVElWTwkJMHgxMDVhCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtY2V1c2JfZGV2X3RhYmxlW10gPSB7CisJLyogT3JpZ2luYWwgTWljcm9zb2Z0IE1DRSBJUiBUcmFuc2NlaXZlciAob2Z0ZW4gSFAtYnJhbmRlZCkgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX01JQ1JPU09GVCwgMHgwMDZkKSB9LAorCS8qIFBoaWxpcHMgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgLSBTYWhhcmEgYnJhbmRlZCAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfUEhJTElQUywgMHgwNjA4KSB9LAorCS8qIFBoaWxpcHMgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgLSBIUCBicmFuZGVkICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9QSElMSVBTLCAweDA2MGMpIH0sCisJLyogUGhpbGlwcyBTUk01MTAwICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9QSElMSVBTLCAweDA2MGQpIH0sCisJLyogUGhpbGlwcyBJbmZyYXJlZCBUcmFuc2NlaXZlciAtIE9tYXVyYSAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfUEhJTElQUywgMHgwNjBmKSB9LAorCS8qIFBoaWxpcHMgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgLSBTcGluZWwgcGx1cyAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfUEhJTElQUywgMHgwNjEzKSB9LAorCS8qIFBoaWxpcHMgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1BISUxJUFMsIDB4MDgxNSkgfSwKKwkvKiBSZWFsdGVrIE1DRSBJUiBSZWNlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfUkVBTFRFSywgMHgwMTYxKSB9LAorCS8qIFNNSy9Ub3NoaWJhIEc4M0MwMDA0RDQxMCAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzMWQpIH0sCisJLyogU01LIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyIChTb255IFZBSU8pICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9TTUssIDB4MDMyMikgfSwKKwkvKiBidW5kbGVkIHdpdGggSGF1cHBhdWdlIFBWUi0xNTAgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1NNSywgMHgwMzM0KSB9LAorCS8qIFNNSyBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzMzgpIH0sCisJLyogVGF0dW5nIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9UQVRVTkcsIDB4OTE1MCkgfSwKKwkvKiBTaHV0dGxlIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9TSFVUVExFLCAweGMwMDEpIH0sCisJLyogU2h1dHRsZSBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfU0hVVFRMRTIsIDB4YzAwMSkgfSwKKwkvKiBHYXRld2F5IGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9HQVRFV0FZLCAweDMwMDkpIH0sCisJLyogTWl0c3VtaSAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfTUlUU1VNSSwgMHgyNTAxKSB9LAorCS8qIFRvcHNlZWQgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1RPUFNFRUQsIDB4MDAwMSkgfSwKKwkvKiBUb3BzZWVkIEhQIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9UT1BTRUVELCAweDAwMDYpIH0sCisJLyogVG9wc2VlZCBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDA3KSB9LAorCS8qIFRvcHNlZWQgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1RPUFNFRUQsIDB4MDAwOCkgfSwKKwkvKiBUb3BzZWVkIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9UT1BTRUVELCAweDAwMGEpIH0sCisJLyogVG9wc2VlZCBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDExKSB9LAorCS8qIFJpY2F2aXNpb24gaW50ZXJuYWwgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1JJQ0FWSVNJT04sIDB4MDAxMCkgfSwKKwkvKiBJdHJvbiBpb25lIExpYnJhIFEtMTEgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0lUUk9OLCAweDcwMDIpIH0sCisJLyogRklDIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9GSUMsIDB4OTI0MikgfSwKKwkvKiBMRyBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfTEcsIDB4OTgwMykgfSwKKwkvKiBNaWNyb3NvZnQgTUNFIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9NSUNST1NPRlQsIDB4MDBhMCkgfSwKKwkvKiBGb3Jtb3NhIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9GT1JNT1NBLCAweGUwMTUpIH0sCisJLyogRm9ybW9zYTIxIC8gZUhvbWUgSW5mcmFyZWQgUmVjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0ZPUk1PU0EsIDB4ZTAxNikgfSwKKwkvKiBGb3Jtb3NhIGFpbSAvIFRydXN0IE1DRSBJbmZyYXJlZCBSZWNlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfRk9STU9TQSwgMHhlMDE3KSB9LAorCS8qIEZvcm1vc2EgSW5kdXN0cmlhbCBDb21wdXRpbmcgLyBCZWFuYmFnIEVtdWxhdGlvbiBEZXZpY2UgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0ZPUk1PU0EsIDB4ZTAxOCkgfSwKKwkvKiBGb3Jtb3NhMjEgLyBlSG9tZSBJbmZyYXJlZCBSZWNlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfRk9STU9TQSwgMHhlMDNhKSB9LAorCS8qIEZvcm1vc2EgSW5kdXN0cmlhbCBDb21wdXRpbmcgQUlNIElSNjA1L0EgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0ZPUk1PU0EsIDB4ZTAzYykgfSwKKwkvKiBGb3Jtb3NhIEluZHVzdHJpYWwgQ29tcHV0aW5nICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9GT1JNT1NBLCAweGUwM2UpIH0sCisJLyogRmludGVrIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9GSU5URUssIDB4MDYwMikgfSwKKwkvKiBGaW50ZWsgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKGluIHRoZSBBT3BlbiBNUDQ1KSAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfRklOVEVLLCAweDA3MDIpIH0sCisJLyogUGlubmFjbGUgUmVtb3RlIEtpdCAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfUElOTkFDTEUsIDB4MDIyNSkgfSwKKwkvKiBFbGl0ZWdyb3VwIENvbXB1dGVyIFN5c3RlbXMgSVIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0VDUywgMHgwZjM4KSB9LAorCS8qIFdpc3Ryb24gQ29ycC4gZUhvbWUgSW5mcmFyZWQgUmVjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1dJU1RST04sIDB4MDAwMikgfSwKKwkvKiBDb21wcm8gSzEwMCAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfQ09NUFJPLCAweDMwMjApIH0sCisJLyogQ29tcHJvIEsxMDAgdjIgKi8KKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0NPTVBSTywgMHgzMDgyKSB9LAorCS8qIE5vcnRoc3RhciBTeXN0ZW1zLCBJbmMuIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9OT1JUSFNUQVIsIDB4ZTAwNCkgfSwKKwkvKiBUaVZvIFBDIElSIFJlY2VpdmVyICovCisJeyBVU0JfREVWSUNFKFZFTkRPUl9USVZPLCAweDIwMDApIH0sCisJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBnZW4zX2xpc3RbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1BJTk5BQ0xFLCAweDAyMjUpIH0sCisJeyBVU0JfREVWSUNFKFZFTkRPUl9UT1BTRUVELCAweDAwMDgpIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtaWNyb3NvZnRfZ2VuMV9saXN0W10gPSB7CisJeyBVU0JfREVWSUNFKFZFTkRPUl9NSUNST1NPRlQsIDB4MDA2ZCkgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHN0ZF90eF9tYXNrX2xpc3RbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX01JQ1JPU09GVCwgMHgwMDZkKSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfUEhJTElQUywgMHgwNjBjKSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzMWQpIH0sCisJeyBVU0JfREVWSUNFKFZFTkRPUl9TTUssIDB4MDMyMikgfSwKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX1NNSywgMHgwMzM0KSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDAxKSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDA2KSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDA3KSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDA4KSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDBhKSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfVE9QU0VFRCwgMHgwMDExKSB9LAorCXsgVVNCX0RFVklDRShWRU5ET1JfUElOTkFDTEUsIDB4MDIyNSkgfSwKKwl7fQorfTsKKworLyogZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggdXNiIHRyYW5zY2VpdmVyICovCitzdHJ1Y3QgbWNldXNiX2RldiB7CisJLyogaXItY29yZSBiaXRzICovCisJc3RydWN0IGlyX2lucHV0X2RldiAqaXJkZXY7CisJc3RydWN0IGlyX2Rldl9wcm9wcyAqcHJvcHM7CisJc3RydWN0IGlyX3Jhd19ldmVudCByYXdpcjsKKworCS8qIGNvcmUgZGV2aWNlIGJpdHMgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKworCS8qIHVzYiAqLworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJc3RydWN0IHVyYiAqdXJiX2luOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdXNiX2VwX2luOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdXNiX2VwX291dDsKKworCS8qIGJ1ZmZlcnMgYW5kIGRtYSAqLworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9pbjsKKwl1bnNpZ25lZCBpbnQgbGVuX2luOworCXU4IGNtZDsJCS8qIE1DRSBjb21tYW5kIHR5cGUgKi8KKwl1OCByZW07CQkvKiBSZW1haW5pbmcgSVIgZGF0YSBieXRlcyBpbiBwYWNrZXQgKi8KKwlkbWFfYWRkcl90IGRtYV9pbjsKKwlkbWFfYWRkcl90IGRtYV9vdXQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgY29ubmVjdGVkOjE7CisJCXUzMiB0eF9tYXNrX2ludmVydGVkOjE7CisJCXUzMiBtaWNyb3NvZnRfZ2VuMToxOworCQl1MzIgcmVzZXJ2ZWQ6Mjk7CisJfSBmbGFnczsKKworCS8qIHRyYW5zbWl0IHN1cHBvcnQgKi8KKwlpbnQgc2VuZF9mbGFnczsKKwl1MzIgY2FycmllcjsKKwl1bnNpZ25lZCBjaGFyIHR4X21hc2s7CisKKwljaGFyIG5hbWVbMTI4XTsKKwljaGFyIHBoeXNbNjRdOworfTsKKworLyoKKyAqIE1DRSBEZXZpY2UgQ29tbWFuZCBTdHJpbmdzCisgKiBEZXZpY2UgY29tbWFuZCByZXNwb25zZXMgdmFyeSBmcm9tIGRldmljZSB0byBkZXZpY2UuLi4KKyAqIC0gREVWSUNFX1JFU0VUIHJlc2V0cyB0aGUgaGFyZHdhcmUgdG8gaXRzIGRlZmF1bHQgc3RhdGUKKyAqIC0gR0VUX1JFVklTSU9OIGZldGNoZXMgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIHJldmlzaW9uLCBjb21tb24KKyAqICAgcmVwbGllcyBhcmUgZmYgMGIgNDUgZmYgMWIgMDggYW5kIGZmIDBiIDUwIGZmIDFiIDQyCisgKiAtIEdFVF9DQVJSSUVSX0ZSRVEgZ2V0cyB0aGUgY2FycmllciBtb2RlIGFuZCBmcmVxdWVuY3kgb2YgdGhlCisgKiAgIGRldmljZSwgd2l0aCByZXBsaWVzIGluIHRoZSBmb3JtIG9mIDlmIDA2IE1NIEZGLCB3aGVyZSBNTSBpcyAwLTMsCisgKiAgIG1lYW5pbmcgY2xrIG9mIDEwMDAwMDAwLCAyNTAwMDAwLCA2MjUwMDAgb3IgMTU2MjUwLCBhbmQgRkYgaXMKKyAqICAgKChjbGsgLyBmcmVxdWVuY3kpIC0gMSkKKyAqIC0gR0VUX1JYX1RJTUVPVVQgZmV0Y2hlcyB0aGUgcmVjZWl2ZXIgdGltZW91dCBpbiB1bml0cyBvZiA1MHVzLAorICogICByZXNwb25zZSBpbiB0aGUgZm9ybSBvZiA5ZiAwYyBtc2IgbHNiCisgKiAtIEdFVF9UWF9CSVRNQVNLIGZldGNoZXMgdGhlIHRyYW5zbWl0dGVyIGJpdG1hc2ssIHJlcGxpZXMgaW4KKyAqICAgdGhlIGZvcm0gb2YgOWYgMDggYm0sIHdoZXJlIGJtIGlzIHRoZSBiaXRtYXNrCisgKiAtIEdFVF9SWF9TRU5TT1IgZmV0Y2hlcyB0aGUgUlggc2Vuc29yIHNldHRpbmcgLS0gbG9uZy1yYW5nZQorICogICBnZW5lcmFsIHVzZSBvbmUgb3Igc2hvcnQtcmFuZ2UgbGVhcm5pbmcgb25lLCBpbiB0aGUgZm9ybSBvZgorICogICA5ZiAxNCBzcywgd2hlcmUgc3MgaXMgZWl0aGVyIDAxIGZvciBsb25nLXJhbmdlIG9yIDAyIGZvciBzaG9ydAorICogLSBTRVRfQ0FSUklFUl9GUkVRIHNldHMgYSBuZXcgY2FycmllciBtb2RlIGFuZCBmcmVxdWVuY3kKKyAqIC0gU0VUX1RYX0JJVE1BU0sgc2V0cyB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzaworICogLSBTRVRfUlhfVElNRU9VVCBzZXRzIHRoZSByZWNlaXZlciB0aW1lb3V0CisgKiAtIFNFVF9SWF9TRU5TT1Igc2V0cyB3aGljaCByZWNlaXZlciBzZW5zb3IgdG8gdXNlCisgKi8KK3N0YXRpYyBjaGFyIERFVklDRV9SRVNFVFtdCT0gezB4MDAsIDB4ZmYsIDB4YWF9Oworc3RhdGljIGNoYXIgR0VUX1JFVklTSU9OW10JPSB7MHhmZiwgMHgwYn07CitzdGF0aWMgY2hhciBHRVRfVU5LTk9XTltdCT0gezB4ZmYsIDB4MTh9Oworc3RhdGljIGNoYXIgR0VUX1VOS05PV04yW10JPSB7MHg5ZiwgMHgwNX07CitzdGF0aWMgY2hhciBHRVRfQ0FSUklFUl9GUkVRW10JPSB7MHg5ZiwgMHgwN307CitzdGF0aWMgY2hhciBHRVRfUlhfVElNRU9VVFtdCT0gezB4OWYsIDB4MGR9Oworc3RhdGljIGNoYXIgR0VUX1RYX0JJVE1BU0tbXQk9IHsweDlmLCAweDEzfTsKK3N0YXRpYyBjaGFyIEdFVF9SWF9TRU5TT1JbXQk9IHsweDlmLCAweDE1fTsKKy8qIHN1YiBpbiBkZXNpcmVkIHZhbHVlcyBpbiBsb3dlciBieXRlIG9yIGJ5dGVzIGZvciBmdWxsIGNvbW1hbmQgKi8KKy8qIEZJWE1FOiBtYWtlIHVzZSBvZiB0aGVzZSBmb3IgdHJhbnNtaXQuCitzdGF0aWMgY2hhciBTRVRfQ0FSUklFUl9GUkVRW10JPSB7MHg5ZiwgMHgwNiwgMHgwMCwgMHgwMH07CitzdGF0aWMgY2hhciBTRVRfVFhfQklUTUFTS1tdCT0gezB4OWYsIDB4MDgsIDB4MDB9Oworc3RhdGljIGNoYXIgU0VUX1JYX1RJTUVPVVRbXQk9IHsweDlmLCAweDBjLCAweDAwLCAweDAwfTsKK3N0YXRpYyBjaGFyIFNFVF9SWF9TRU5TT1JbXQk9IHsweDlmLCAweDE0LCAweDAwfTsKKyovCisKK3N0YXRpYyB2b2lkIG1jZXVzYl9kZXZfcHJpbnRkYXRhKHN0cnVjdCBtY2V1c2JfZGV2ICppciwgY2hhciAqYnVmLAorCQkJCSBpbnQgbGVuLCBib29sIG91dCkKK3sKKwljaGFyIGNvZGVzW1VTQl9CVUZMRU4gKiAzICsgMV07CisJY2hhciBpbm91dFs5XTsKKwlpbnQgaTsKKwl1OCBjbWQsIHN1YmNtZCwgZGF0YTEsIGRhdGEyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGlyLT5kZXY7CisJaW50IGlkeCA9IDA7CisKKwkvKiBza2lwIG1lYW5pbmdsZXNzIDB4YjEgMHg2MCBoZWFkZXIgYnl0ZXMgb24gb3JpZyByZWNlaXZlciAqLworCWlmIChpci0+ZmxhZ3MubWljcm9zb2Z0X2dlbjEgJiYgIW91dCkKKwkJaWR4ID0gMjsKKworCWlmIChsZW4gPD0gaWR4KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIGkgPCBVU0JfQlVGTEVOOyBpKyspCisJCXNucHJpbnRmKGNvZGVzICsgaSAqIDMsIDQsICIlMDJ4ICIsIGJ1ZltpXSAmIDB4RkYpOworCisJZGV2X2luZm8oZGV2LCAiJXN4IGRhdGE6ICVzIChsZW5ndGg9JWQpXG4iLAorCQkgKG91dCA/ICJ0IiA6ICJyIiksIGNvZGVzLCBsZW4pOworCisJaWYgKG91dCkKKwkJc3RyY3B5KGlub3V0LCAiUmVxdWVzdFwwIik7CisJZWxzZQorCQlzdHJjcHkoaW5vdXQsICJHb3RcMCIpOworCisJY21kICAgID0gYnVmW2lkeF0gJiAweGZmOworCXN1YmNtZCA9IGJ1ZltpZHggKyAxXSAmIDB4ZmY7CisJZGF0YTEgID0gYnVmW2lkeCArIDJdICYgMHhmZjsKKwlkYXRhMiAgPSBidWZbaWR4ICsgM10gJiAweGZmOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIDB4MDA6CisJCWlmIChzdWJjbWQgPT0gMHhmZiAmJiBkYXRhMSA9PSAweGFhKQorCQkJZGV2X2luZm8oZGV2LCAiRGV2aWNlIHJlc2V0IHJlcXVlc3RlZFxuIik7CisJCWVsc2UKKwkJCWRldl9pbmZvKGRldiwgIlVua25vd24gY29tbWFuZCAweCUwMnggMHglMDJ4XG4iLAorCQkJCSBjbWQsIHN1YmNtZCk7CisJCWJyZWFrOworCWNhc2UgMHhmZjoKKwkJc3dpdGNoIChzdWJjbWQpIHsKKwkJY2FzZSAweDBiOgorCQkJaWYgKGxlbiA9PSAyKQorCQkJCWRldl9pbmZvKGRldiwgIkdldCBody9zdyByZXY/XG4iKTsKKwkJCWVsc2UKKwkJCQlkZXZfaW5mbyhkZXYsICJody9zdyByZXYgMHglMDJ4IDB4JTAyeCAiCisJCQkJCSAiMHglMDJ4IDB4JTAyeFxuIiwgZGF0YTEsIGRhdGEyLAorCQkJCQkgYnVmW2lkeCArIDRdLCBidWZbaWR4ICsgNV0pOworCQkJYnJlYWs7CisJCWNhc2UgMHhhYToKKwkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXNldCByZXF1ZXN0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHhmZToKKwkJCWRldl9pbmZvKGRldiwgIlByZXZpb3VzIGNvbW1hbmQgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDE4OgorCQljYXNlIDB4MWI6CisJCWRlZmF1bHQ6CisJCQlkZXZfaW5mbyhkZXYsICJVbmtub3duIGNvbW1hbmQgMHglMDJ4IDB4JTAyeFxuIiwKKwkJCQkgY21kLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDlmOgorCQlzd2l0Y2ggKHN1YmNtZCkgeworCQljYXNlIDB4MDM6CisJCQlkZXZfaW5mbyhkZXYsICJQaW5nXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlkZXZfaW5mbyhkZXYsICJSZXNwIHRvIDlmIDA1IG9mIDB4JTAyeCAweCUwMnhcbiIsCisJCQkJIGRhdGExLCBkYXRhMik7CisJCQlicmVhazsKKwkJY2FzZSAweDA2OgorCQkJZGV2X2luZm8oZGV2LCAiJXMgY2FycmllciBtb2RlIGFuZCBmcmVxIG9mICIKKwkJCQkgIjB4JTAyeCAweCUwMnhcbiIsIGlub3V0LCBkYXRhMSwgZGF0YTIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNzoKKwkJCWRldl9pbmZvKGRldiwgIkdldCBjYXJyaWVyIG1vZGUgYW5kIGZyZXFcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwODoKKwkJCWRldl9pbmZvKGRldiwgIiVzIHRyYW5zbWl0IGJsYXN0ZXIgbWFzayBvZiAweCUwMnhcbiIsCisJCQkJIGlub3V0LCBkYXRhMSk7CisJCQlicmVhazsKKwkJY2FzZSAweDBjOgorCQkJLyogdmFsdWUgaXMgaW4gdW5pdHMgb2YgNTB1cywgc28geCo1MC8xMDAgb3IgeC8yIG1zICovCisJCQlkZXZfaW5mbyhkZXYsICIlcyByZWNlaXZlIHRpbWVvdXQgb2YgJWQgbXNcbiIsCisJCQkJIGlub3V0LCAoKGRhdGExIDw8IDgpIHwgZGF0YTIpIC8gMik7CisJCQlicmVhazsKKwkJY2FzZSAweDBkOgorCQkJZGV2X2luZm8oZGV2LCAiR2V0IHJlY2VpdmUgdGltZW91dFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDEzOgorCQkJZGV2X2luZm8oZGV2LCAiR2V0IHRyYW5zbWl0IGJsYXN0ZXIgbWFza1xuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDE0OgorCQkJZGV2X2luZm8oZGV2LCAiJXMgJXMtcmFuZ2UgcmVjZWl2ZSBzZW5zb3IgaW4gdXNlXG4iLAorCQkJCSBpbm91dCwgZGF0YTEgPT0gMHgwMiA/ICJzaG9ydCIgOiAibG9uZyIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxNToKKwkJCWlmIChsZW4gPT0gMikKKwkJCQlkZXZfaW5mbyhkZXYsICJHZXQgcmVjZWl2ZSBzZW5zb3JcbiIpOworCQkJZWxzZQorCQkJCWRldl9pbmZvKGRldiwgIlJlY2VpdmVkIHB1bHNlIGNvdW50IGlzICVkXG4iLAorCQkJCQkgKChkYXRhMSA8PCA4KSB8IGRhdGEyKSk7CisJCQlicmVhazsKKwkJY2FzZSAweGZlOgorCQkJZGV2X2luZm8oZGV2LCAiRXJyb3IhIEhhcmR3YXJlIGlzIGxpa2VseSB3ZWRnZWQuLi5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNToKKwkJY2FzZSAweDA5OgorCQljYXNlIDB4MGY6CisJCWRlZmF1bHQ6CisJCQlkZXZfaW5mbyhkZXYsICJVbmtub3duIGNvbW1hbmQgMHglMDJ4IDB4JTAyeFxuIiwKKwkJCQkgY21kLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB1c2JfYXN5bmNfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbWNldXNiX2RldiAqaXI7CisJaW50IGxlbjsKKworCWlmICghdXJiKQorCQlyZXR1cm47CisKKwlpciA9IHVyYi0+Y29udGV4dDsKKwlpZiAoaXIpIHsKKwkJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJCWRldl9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCisJCQl1cmItPnN0YXR1cywgbGVuKTsKKworCQlpZiAoZGVidWcpCisJCQltY2V1c2JfZGV2X3ByaW50ZGF0YShpciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJCSAgICAgbGVuLCB0cnVlKTsKKwl9CisKK30KKworLyogcmVxdWVzdCBpbmNvbWluZyBvciBzZW5kIG91dGdvaW5nIHVzYiBwYWNrZXQgLSB1c2VkIHRvIGluaXRpYWxpemUgcmVtb3RlICovCitzdGF0aWMgdm9pZCBtY2VfcmVxdWVzdF9wYWNrZXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyLAorCQkJICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXAsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUsIGludCB1cmJfdHlwZSkKK3sKKwlpbnQgcmVzOworCXN0cnVjdCB1cmIgKmFzeW5jX3VyYjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpci0+ZGV2OworCXVuc2lnbmVkIGNoYXIgKmFzeW5jX2J1ZjsKKworCWlmICh1cmJfdHlwZSA9PSBNQ0VVU0JfVFgpIHsKKwkJYXN5bmNfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KCFhc3luY191cmIpKSB7CisJCQlkZXZfZXJyKGRldiwgIkVycm9yLCBjb3VsZG4ndCBhbGxvY2F0ZSB1cmIhXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWFzeW5jX2J1ZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYXN5bmNfYnVmKSB7CisJCQlkZXZfZXJyKGRldiwgIkVycm9yLCBjb3VsZG4ndCBhbGxvY2F0ZSBidWYhXG4iKTsKKwkJCXVzYl9mcmVlX3VyYihhc3luY191cmIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogb3V0Ym91bmQgZGF0YSAqLworCQl1c2JfZmlsbF9pbnRfdXJiKGFzeW5jX3VyYiwgaXItPnVzYmRldiwKKwkJCXVzYl9zbmRpbnRwaXBlKGlyLT51c2JkZXYsIGVwLT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCWFzeW5jX2J1Ziwgc2l6ZSwgKHVzYl9jb21wbGV0ZV90KSB1c2JfYXN5bmNfY2FsbGJhY2ssCisJCQlpciwgZXAtPmJJbnRlcnZhbCk7CisJCW1lbWNweShhc3luY19idWYsIGRhdGEsIHNpemUpOworCisJfSBlbHNlIGlmICh1cmJfdHlwZSA9PSBNQ0VVU0JfUlgpIHsKKwkJLyogc3RhbmRhcmQgcmVxdWVzdCAqLworCQlhc3luY191cmIgPSBpci0+dXJiX2luOworCQlpci0+c2VuZF9mbGFncyA9IFJFQ1ZfRkxBR19JTl9QUk9HUkVTUzsKKworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAiRXJyb3IhIFVua25vd24gdXJiIHR5cGUgJWRcbiIsIHVyYl90eXBlKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IGNhbGxlZCAoc2l6ZT0lI3gpXG4iLCBzaXplKTsKKworCWFzeW5jX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNpemU7CisJYXN5bmNfdXJiLT5kZXYgPSBpci0+dXNiZGV2OworCisJcmVzID0gdXNiX3N1Ym1pdF91cmIoYXN5bmNfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzKSB7CisJCWRldl9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IEZBSUxFRCEgKHJlcz0lZClcbiIsIHJlcyk7CisJCXJldHVybjsKKwl9CisJZGV2X2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY29tcGxldGUgKHJlcz0lZClcbiIsIHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG1jZV9hc3luY19vdXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwltY2VfcmVxdWVzdF9wYWNrZXQoaXIsIGlyLT51c2JfZXBfb3V0LCBkYXRhLCBzaXplLCBNQ0VVU0JfVFgpOworfQorCitzdGF0aWMgdm9pZCBtY2Vfc3luY19pbihzdHJ1Y3QgbWNldXNiX2RldiAqaXIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCW1jZV9yZXF1ZXN0X3BhY2tldChpciwgaXItPnVzYl9lcF9pbiwgZGF0YSwgc2l6ZSwgTUNFVVNCX1JYKTsKK30KKworLyogU2VuZCBkYXRhIG91dCB0aGUgSVIgYmxhc3RlciBwb3J0KHMpICovCitzdGF0aWMgaW50IG1jZXVzYl90eF9pcih2b2lkICpwcml2LCBpbnQgKnR4YnVmLCB1MzIgbikKK3sKKwlzdHJ1Y3QgbWNldXNiX2RldiAqaXIgPSBwcml2OworCWludCBpLCByZXQgPSAwOworCWludCBjb3VudCwgY21kY291bnQgPSAwOworCXVuc2lnbmVkIGNoYXIgKmNtZGJ1ZjsgLyogTUNFIGNvbW1hbmQgYnVmZmVyICovCisJbG9uZyBzaWduYWxfZHVyYXRpb24gPSAwOyAvKiBTaW5nbmFsIGxlbmd0aCBpbiB1cyAqLworCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RpbWUsIGVuZF90aW1lOworCisJZG9fZ2V0dGltZW9mZGF5KCZzdGFydF90aW1lKTsKKworCWNvdW50ID0gbiAvIHNpemVvZihpbnQpOworCisJY21kYnVmID0ga3phbGxvYyhzaXplb2YoaW50KSAqIE1DRV9DTURCVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbWRidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogTUNFIHR4IGluaXQgaGVhZGVyICovCisJY21kYnVmW2NtZGNvdW50KytdID0gTUNFX0NPTlRST0xfSEVBREVSOworCWNtZGJ1ZltjbWRjb3VudCsrXSA9IDB4MDg7CisJY21kYnVmW2NtZGNvdW50KytdID0gaXItPnR4X21hc2s7CisKKwkvKiBHZW5lcmF0ZSBtY2UgcGFja2V0IGRhdGEgKi8KKwlmb3IgKGkgPSAwOyAoaSA8IGNvdW50KSAmJiAoY21kY291bnQgPCBNQ0VfQ01EQlVGX1NJWkUpOyBpKyspIHsKKwkJc2lnbmFsX2R1cmF0aW9uICs9IHR4YnVmW2ldOworCQl0eGJ1ZltpXSA9IHR4YnVmW2ldIC8gTUNFX1RJTUVfVU5JVDsKKworCQlkbyB7IC8qIGxvb3AgdG8gc3VwcG9ydCBsb25nIHB1bHNlcy9zcGFjZXMgPiAxMjcqNTB1cz02LjM1bXMgKi8KKworCQkJLyogSW5zZXJ0IG1jZSBwYWNrZXQgaGVhZGVyIGV2ZXJ5IDR0aCBlbnRyeSAqLworCQkJaWYgKChjbWRjb3VudCA8IE1DRV9DTURCVUZfU0laRSkgJiYKKwkJCSAgICAoY21kY291bnQgLSBNQ0VfVFhfSEVBREVSX0xFTkdUSCkgJQorCQkJICAgICBNQ0VfQ09ERV9MRU5HVEggPT0gMCkKKwkJCQljbWRidWZbY21kY291bnQrK10gPSBNQ0VfUEFDS0VUX0hFQURFUjsKKworCQkJLyogSW5zZXJ0IG1jZSBwYWNrZXQgZGF0YSAqLworCQkJaWYgKGNtZGNvdW50IDwgTUNFX0NNREJVRl9TSVpFKQorCQkJCWNtZGJ1ZltjbWRjb3VudCsrXSA9CisJCQkJCSh0eGJ1ZltpXSA8IE1DRV9QVUxTRV9CSVQgPworCQkJCQkgdHhidWZbaV0gOiBNQ0VfTUFYX1BVTFNFX0xFTkdUSCkgfAorCQkJCQkgKGkgJiAxID8gMHgwMCA6IE1DRV9QVUxTRV9CSVQpOworCQkJZWxzZSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQl9IHdoaWxlICgodHhidWZbaV0gPiBNQ0VfTUFYX1BVTFNFX0xFTkdUSCkgJiYKKwkJCSAodHhidWZbaV0gLT0gTUNFX01BWF9QVUxTRV9MRU5HVEgpKTsKKwl9CisKKwkvKiBGaXggcGFja2V0IGxlbmd0aCBpbiBsYXN0IGhlYWRlciAqLworCWNtZGJ1ZltjbWRjb3VudCAtIChjbWRjb3VudCAtIE1DRV9UWF9IRUFERVJfTEVOR1RIKSAlIE1DRV9DT0RFX0xFTkdUSF0gPQorCQkweDgwICsgKGNtZGNvdW50IC0gTUNFX1RYX0hFQURFUl9MRU5HVEgpICUgTUNFX0NPREVfTEVOR1RIIC0gMTsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgcm9vbSBmb3IgdGhlIGVtcHR5IHBhY2tldCBhdCB0aGUgZW5kICovCisJaWYgKGNtZGNvdW50ID49IE1DRV9DTURCVUZfU0laRSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBBbGwgbWNlIGNvbW1hbmRzIGVuZCB3aXRoIGFuIGVtcHR5IHBhY2tldCAoMHg4MCkgKi8KKwljbWRidWZbY21kY291bnQrK10gPSAweDgwOworCisJLyogVHJhbnNtaXQgdGhlIGNvbW1hbmQgdG8gdGhlIG1jZSBkZXZpY2UgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBjbWRidWYsIGNtZGNvdW50KTsKKworCS8qCisJICogVGhlIGxpcmNkIGdhcCBjYWxjdWxhdGlvbiBleHBlY3RzIHRoZSB3cml0ZSBmdW5jdGlvbiB0bworCSAqIHdhaXQgdGhlIHRpbWUgaXQgdGFrZXMgZm9yIHRoZSBpcmNvbW1hbmQgdG8gYmUgc2VudCBiZWZvcmUKKwkgKiBpdCByZXR1cm5zLgorCSAqLworCWRvX2dldHRpbWVvZmRheSgmZW5kX3RpbWUpOworCXNpZ25hbF9kdXJhdGlvbiAtPSAoZW5kX3RpbWUudHZfdXNlYyAtIHN0YXJ0X3RpbWUudHZfdXNlYykgKworCQkJICAgKGVuZF90aW1lLnR2X3NlYyAtIHN0YXJ0X3RpbWUudHZfc2VjKSAqIDEwMDAwMDA7CisKKwkvKiBkZWxheSB3aXRoIHRoZSBjbG9zZXN0IG51bWJlciBvZiB0aWNrcyAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dCh1c2Vjc190b19qaWZmaWVzKHNpZ25hbF9kdXJhdGlvbikpOworCitvdXQ6CisJa2ZyZWUoY21kYnVmKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKK30KKworLyogU2V0cyBhY3RpdmUgSVIgb3V0cHV0cyAtLSBtY2UgZGV2aWNlcyB0eXBpY2FsbHkgKGFsbD8pIGhhdmUgdHdvICovCitzdGF0aWMgaW50IG1jZXVzYl9zZXRfdHhfbWFzayh2b2lkICpwcml2LCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgbWNldXNiX2RldiAqaXIgPSBwcml2OworCisJaWYgKGlyLT5mbGFncy50eF9tYXNrX2ludmVydGVkKQorCQlpci0+dHhfbWFzayA9IChtYXNrICE9IDB4MDMgPyBtYXNrIF4gMHgwMyA6IG1hc2spIDw8IDE7CisJZWxzZQorCQlpci0+dHhfbWFzayA9IG1hc2s7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2V0cyB0aGUgc2VuZCBjYXJyaWVyIGZyZXF1ZW5jeSBhbmQgbW9kZSAqLworc3RhdGljIGludCBtY2V1c2Jfc2V0X3R4X2NhcnJpZXIodm9pZCAqcHJpdiwgdTMyIGNhcnJpZXIpCit7CisJc3RydWN0IG1jZXVzYl9kZXYgKmlyID0gcHJpdjsKKwlpbnQgY2xrID0gMTAwMDAwMDA7CisJaW50IHByZXNjYWxlciA9IDAsIGRpdmlzb3IgPSAwOworCXVuc2lnbmVkIGNoYXIgY21kYnVmWzRdID0geyAweDlmLCAweDA2LCAweDAwLCAweDAwIH07CisKKwkvKiBDYXJyaWVyIGhhcyBjaGFuZ2VkICovCisJaWYgKGlyLT5jYXJyaWVyICE9IGNhcnJpZXIpIHsKKworCQlpZiAoY2FycmllciA9PSAwKSB7CisJCQlpci0+Y2FycmllciA9IGNhcnJpZXI7CisJCQljbWRidWZbMl0gPSAweDAxOworCQkJY21kYnVmWzNdID0gMHg4MDsKKwkJCWRldl9kYmcoaXItPmRldiwgIiVzOiBkaXNhYmxpbmcgY2FycmllciAiCisJCQkJIm1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJCW1jZV9hc3luY19vdXQoaXIsIGNtZGJ1Ziwgc2l6ZW9mKGNtZGJ1ZikpOworCQkJcmV0dXJuIGNhcnJpZXI7CisJCX0KKworCQlmb3IgKHByZXNjYWxlciA9IDA7IHByZXNjYWxlciA8IDQ7ICsrcHJlc2NhbGVyKSB7CisJCQlkaXZpc29yID0gKGNsayA+PiAoMiAqIHByZXNjYWxlcikpIC8gY2FycmllcjsKKwkJCWlmIChkaXZpc29yIDw9IDB4RkYpIHsKKwkJCQlpci0+Y2FycmllciA9IGNhcnJpZXI7CisJCQkJY21kYnVmWzJdID0gcHJlc2NhbGVyOworCQkJCWNtZGJ1ZlszXSA9IGRpdmlzb3I7CisJCQkJZGV2X2RiZyhpci0+ZGV2LCAiJXM6IHJlcXVlc3RpbmcgJXUgSFogIgorCQkJCQkiY2FycmllclxuIiwgX19mdW5jX18sIGNhcnJpZXIpOworCisJCQkJLyogVHJhbnNtaXQgbmV3IGNhcnJpZXIgdG8gbWNlIGRldmljZSAqLworCQkJCW1jZV9hc3luY19vdXQoaXIsIGNtZGJ1Ziwgc2l6ZW9mKGNtZGJ1ZikpOworCQkJCXJldHVybiBjYXJyaWVyOworCQkJfQorCQl9CisKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gY2FycmllcjsKK30KKworc3RhdGljIHZvaWQgbWNldXNiX3Byb2Nlc3NfaXJfZGF0YShzdHJ1Y3QgbWNldXNiX2RldiAqaXIsIGludCBidWZfbGVuKQoreworCXN0cnVjdCBpcl9yYXdfZXZlbnQgcmF3aXIgPSB7IC5wdWxzZSA9IGZhbHNlLCAuZHVyYXRpb24gPSAwIH07CisJaW50IGksIHN0YXJ0X2luZGV4ID0gMDsKKwl1OCBoZHIgPSBNQ0VfQ09OVFJPTF9IRUFERVI7CisKKwkvKiBza2lwIG1lYW5pbmdsZXNzIDB4YjEgMHg2MCBoZWFkZXIgYnl0ZXMgb24gb3JpZyByZWNlaXZlciAqLworCWlmIChpci0+ZmxhZ3MubWljcm9zb2Z0X2dlbjEpCisJCXN0YXJ0X2luZGV4ID0gMjsKKworCWZvciAoaSA9IHN0YXJ0X2luZGV4OyBpIDwgYnVmX2xlbjspIHsKKwkJaWYgKGlyLT5yZW0gPT0gMCkgeworCQkJLyogZGVjb2RlIG1jZSBwYWNrZXRzIG9mIHRoZSBmb3JtICg4NCksQUEsQkIsQ0MsREQgKi8KKwkJCS8qIElSIGRhdGEgcGFja2V0cyBjYW4gc3BhbiBVU0IgbWVzc2FnZXMgLSByZW0gKi8KKwkJCWhkciA9IGlyLT5idWZfaW5baV07CisJCQlpci0+cmVtID0gKGhkciAmIE1DRV9QQUNLRVRfTEVOR1RIX01BU0spOworCQkJaXItPmNtZCA9IChoZHIgJiB+TUNFX1BBQ0tFVF9MRU5HVEhfTUFTSyk7CisJCQlkZXZfZGJnKGlyLT5kZXYsICJOZXcgZGF0YS4gcmVtOiAweCUwMngsIGNtZDogMHglMDJ4XG4iLAorCQkJCWlyLT5yZW0sIGlyLT5jbWQpOworCQkJaSsrOworCQl9CisKKwkJLyogZG9uJ3QgcHJvY2VzcyBNQ0UgY29tbWFuZHMgKi8KKwkJaWYgKGhkciA9PSBNQ0VfQ09OVFJPTF9IRUFERVIgfHwgaGRyID09IDB4ZmYpIHsKKwkJCWlyLT5yZW0gPSAwOworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yICg7IChpci0+cmVtID4gMCkgJiYgKGkgPCBidWZfbGVuKTsgaSsrKSB7CisJCQlpci0+cmVtLS07CisKKwkJCXJhd2lyLnB1bHNlID0gKChpci0+YnVmX2luW2ldICYgTUNFX1BVTFNFX0JJVCkgIT0gMCk7CisJCQlyYXdpci5kdXJhdGlvbiA9IChpci0+YnVmX2luW2ldICYgTUNFX1BVTFNFX01BU0spCisJCQkJCSAqIE1DRV9USU1FX1VOSVQgKiAxMDAwOworCisJCQlpZiAoKGlyLT5idWZfaW5baV0gJiBNQ0VfUFVMU0VfTUFTSykgPT0gMHg3ZikgeworCQkJCWlmIChpci0+cmF3aXIucHVsc2UgPT0gcmF3aXIucHVsc2UpCisJCQkJCWlyLT5yYXdpci5kdXJhdGlvbiArPSByYXdpci5kdXJhdGlvbjsKKwkJCQllbHNlIHsKKwkJCQkJaXItPnJhd2lyLmR1cmF0aW9uID0gcmF3aXIuZHVyYXRpb247CisJCQkJCWlyLT5yYXdpci5wdWxzZSA9IHJhd2lyLnB1bHNlOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJhd2lyLmR1cmF0aW9uICs9IGlyLT5yYXdpci5kdXJhdGlvbjsKKwkJCWlyLT5yYXdpci5kdXJhdGlvbiA9IDA7CisJCQlpci0+cmF3aXIucHVsc2UgPSByYXdpci5wdWxzZTsKKworCQkJZGV2X2RiZyhpci0+ZGV2LCAiU3RvcmluZyAlcyB3aXRoIGR1cmF0aW9uICVkXG4iLAorCQkJCXJhd2lyLnB1bHNlID8gInB1bHNlIiA6ICJzcGFjZSIsCisJCQkJcmF3aXIuZHVyYXRpb24pOworCisJCQlpcl9yYXdfZXZlbnRfc3RvcmUoaXItPmlkZXYsICZyYXdpcik7CisJCX0KKworCQlpZiAoaXItPmJ1Zl9pbltpXSA9PSAweDgwIHx8IGlyLT5idWZfaW5baV0gPT0gMHg5ZikKKwkJCWlyLT5yZW0gPSAwOworCisJCWRldl9kYmcoaXItPmRldiwgImNhbGxpbmcgaXJfcmF3X2V2ZW50X2hhbmRsZVxuIik7CisJCWlyX3Jhd19ldmVudF9oYW5kbGUoaXItPmlkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgbWNldXNiX2Rldl9yZWN2KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG1jZXVzYl9kZXYgKmlyOworCWludCBidWZfbGVuOworCisJaWYgKCF1cmIpCisJCXJldHVybjsKKworCWlyID0gdXJiLT5jb250ZXh0OworCWlmICghaXIpIHsKKwkJdXNiX3VubGlua191cmIodXJiKTsKKwkJcmV0dXJuOworCX0KKworCWJ1Zl9sZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7CisKKwlpZiAoZGVidWcpCisJCW1jZXVzYl9kZXZfcHJpbnRkYXRhKGlyLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgYnVmX2xlbiwgZmFsc2UpOworCisJaWYgKGlyLT5zZW5kX2ZsYWdzID09IFJFQ1ZfRkxBR19JTl9QUk9HUkVTUykgeworCQlpci0+c2VuZF9mbGFncyA9IFNFTkRfRkxBR19DT01QTEVURTsKKwkJZGV2X2RiZygmaXItPmlyZGV2LT5kZXYsICJzZXR1cCBhbnN3ZXIgcmVjZWl2ZWQgJWQgYnl0ZXNcbiIsCisJCQlidWZfbGVuKTsKKwl9CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJLyogc3VjY2VzcyAqLworCWNhc2UgMDoKKwkJbWNldXNiX3Byb2Nlc3NfaXJfZGF0YShpciwgYnVmX2xlbik7CisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQl1c2JfdW5saW5rX3VyYih1cmIpOworCQlyZXR1cm47CisKKwljYXNlIC1FUElQRToKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgdm9pZCBtY2V1c2JfZ2VuMV9pbml0KHN0cnVjdCBtY2V1c2JfZGV2ICppcikKK3sKKwlpbnQgcmV0OworCWludCBtYXhwID0gaXItPmxlbl9pbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpci0+ZGV2OworCWNoYXIgKmRhdGE7CisKKwlkYXRhID0ga3phbGxvYyhVU0JfQ1RSTF9NU0dfU1osIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgYSBzdHJhbmdlIG9uZS4gV2luZG93cyBpc3N1ZXMgYSBzZXQgYWRkcmVzcyB0byB0aGUgZGV2aWNlCisJICogb24gdGhlIHJlY2VpdmUgY29udHJvbCBwaXBlIGFuZCBleHBlY3QgYSBjZXJ0YWluIHZhbHVlIHBhaXIgYmFjaworCSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhpci0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUoaXItPnVzYmRldiwgMCksCisJCQkgICAgICBVU0JfUkVRX1NFVF9BRERSRVNTLCBVU0JfVFlQRV9WRU5ET1IsIDAsIDAsCisJCQkgICAgICBkYXRhLCBVU0JfQ1RSTF9NU0dfU1osIEhaICogMyk7CisJZGV2X2RiZyhkZXYsICIlcyAtIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlkZXZfZGJnKGRldiwgIiVzIC0gZGF0YVswXSA9ICVkLCBkYXRhWzFdID0gJWRcbiIsCisJCV9fZnVuY19fLCBkYXRhWzBdLCBkYXRhWzFdKTsKKworCS8qIHNldCBmZWF0dXJlOiBiaXQgcmF0ZSAzODQwMCBicHMgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2coaXItPnVzYmRldiwgdXNiX3NuZGN0cmxwaXBlKGlyLT51c2JkZXYsIDApLAorCQkJICAgICAgVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX1RZUEVfVkVORE9SLAorCQkJICAgICAgMHhjMDRlLCAweDAwMDAsIE5VTEwsIDAsIEhaICogMyk7CisKKwlkZXZfZGJnKGRldiwgIiVzIC0gcmV0ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJLyogYlJlcXVlc3QgNDogc2V0IGNoYXIgbGVuZ3RoIHRvIDggYml0cyAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhpci0+dXNiZGV2LCB1c2Jfc25kY3RybHBpcGUoaXItPnVzYmRldiwgMCksCisJCQkgICAgICA0LCBVU0JfVFlQRV9WRU5ET1IsCisJCQkgICAgICAweDA4MDgsIDB4MDAwMCwgTlVMTCwgMCwgSFogKiAzKTsKKwlkZXZfZGJnKGRldiwgIiVzIC0gcmV0QiA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCS8qIGJSZXF1ZXN0IDI6IHNldCBoYW5kc2hha2luZyB0byB1c2UgRFRSL0RTUiAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhpci0+dXNiZGV2LCB1c2Jfc25kY3RybHBpcGUoaXItPnVzYmRldiwgMCksCisJCQkgICAgICAyLCBVU0JfVFlQRV9WRU5ET1IsCisJCQkgICAgICAweDAwMDAsIDB4MDEwMCwgTlVMTCwgMCwgSFogKiAzKTsKKwlkZXZfZGJnKGRldiwgIiVzIC0gcmV0QyA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCS8qIGRldmljZSByZXNldCAqLworCW1jZV9hc3luY19vdXQoaXIsIERFVklDRV9SRVNFVCwgc2l6ZW9mKERFVklDRV9SRVNFVCkpOworCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKKworCS8qIGdldCBody9zdyByZXZpc2lvbj8gKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBHRVRfUkVWSVNJT04sIHNpemVvZihHRVRfUkVWSVNJT04pKTsKKwltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CisKKwlrZnJlZShkYXRhKTsKK307CisKK3N0YXRpYyB2b2lkIG1jZXVzYl9nZW4yX2luaXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQoreworCWludCBtYXhwID0gaXItPmxlbl9pbjsKKworCS8qIGRldmljZSByZXNldCAqLworCW1jZV9hc3luY19vdXQoaXIsIERFVklDRV9SRVNFVCwgc2l6ZW9mKERFVklDRV9SRVNFVCkpOworCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKKworCS8qIGdldCBody9zdyByZXZpc2lvbj8gKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBHRVRfUkVWSVNJT04sIHNpemVvZihHRVRfUkVWSVNJT04pKTsKKwltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CisKKwkvKiB1bmtub3duIHdoYXQgdGhlIG5leHQgdHdvIGFjdHVhbGx5IHJldHVybi4uLiAqLworCW1jZV9hc3luY19vdXQoaXIsIEdFVF9VTktOT1dOLCBzaXplb2YoR0VUX1VOS05PV04pKTsKKwltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CisJbWNlX2FzeW5jX291dChpciwgR0VUX1VOS05PV04yLCBzaXplb2YoR0VUX1VOS05PV04yKSk7CisJbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOworfQorCitzdGF0aWMgdm9pZCBtY2V1c2JfZ2V0X3BhcmFtZXRlcnMoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQoreworCWludCBtYXhwID0gaXItPmxlbl9pbjsKKworCS8qIGdldCB0aGUgY2FycmllciBhbmQgZnJlcXVlbmN5ICovCisJbWNlX2FzeW5jX291dChpciwgR0VUX0NBUlJJRVJfRlJFUSwgc2l6ZW9mKEdFVF9DQVJSSUVSX0ZSRVEpKTsKKwltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CisKKwkvKiBnZXQgdGhlIHRyYW5zbWl0dGVyIGJpdG1hc2sgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVFhfQklUTUFTSywgc2l6ZW9mKEdFVF9UWF9CSVRNQVNLKSk7CisJbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOworCisJLyogZ2V0IHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBHRVRfUlhfVElNRU9VVCwgc2l6ZW9mKEdFVF9SWF9USU1FT1VUKSk7CisJbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOworCisJLyogZ2V0IHJlY2VpdmVyIHNlbnNvciBzZXR0aW5nICovCisJbWNlX2FzeW5jX291dChpciwgR0VUX1JYX1NFTlNPUiwgc2l6ZW9mKEdFVF9SWF9TRU5TT1IpKTsKKwltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICptY2V1c2JfaW5pdF9pbnB1dF9kZXYoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisJc3RydWN0IGlyX2Rldl9wcm9wcyAqcHJvcHM7CisJc3RydWN0IGlyX2lucHV0X2RldiAqaXJkZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaXItPmRldjsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlkZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlkZXYpIHsKKwkJZGV2X2VycihkZXYsICJyZW1vdGUgaW5wdXQgZGV2IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBpZGV2X2FsbG9jX2ZhaWxlZDsKKwl9CisKKwlyZXQgPSAtRU5PTUVNOworCXByb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlyX2Rldl9wcm9wcyksIEdGUF9LRVJORUwpOworCWlmICghcHJvcHMpIHsKKwkJZGV2X2VycihkZXYsICJyZW1vdGUgaXIgZGV2IHByb3BzIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBwcm9wc19hbGxvY19mYWlsZWQ7CisJfQorCisJaXJkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJfaW5wdXRfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcmRldikgeworCQlkZXZfZXJyKGRldiwgInJlbW90ZSBpciBpbnB1dCBkZXYgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGlyX2Rldl9hbGxvY19mYWlsZWQ7CisJfQorCisJc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJNZWRpYSBDZW50ZXIgRWQuIGVIb21lICIKKwkJICJJbmZyYXJlZCBSZW1vdGUgVHJhbnNjZWl2ZXIgKCUwNHg6JTA0eCkiLAorCQkgbGUxNl90b19jcHUoaXItPnVzYmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCSBsZTE2X3RvX2NwdShpci0+dXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJaWRldi0+bmFtZSA9IGlyLT5uYW1lOworCXVzYl9tYWtlX3BhdGgoaXItPnVzYmRldiwgaXItPnBoeXMsIHNpemVvZihpci0+cGh5cykpOworCXN0cmxjYXQoaXItPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGlyLT5waHlzKSk7CisJaWRldi0+cGh5cyA9IGlyLT5waHlzOworCisJcHJvcHMtPnByaXYgPSBpcjsKKwlwcm9wcy0+ZHJpdmVyX3R5cGUgPSBSQ19EUklWRVJfSVJfUkFXOworCXByb3BzLT5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfQUxMOworCXByb3BzLT5zX3R4X21hc2sgPSBtY2V1c2Jfc2V0X3R4X21hc2s7CisJcHJvcHMtPnNfdHhfY2FycmllciA9IG1jZXVzYl9zZXRfdHhfY2FycmllcjsKKwlwcm9wcy0+dHhfaXIgPSBtY2V1c2JfdHhfaXI7CisKKwlpci0+cHJvcHMgPSBwcm9wczsKKwlpci0+aXJkZXYgPSBpcmRldjsKKworCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIGlyZGV2KTsKKworCXJldCA9IGlyX2lucHV0X3JlZ2lzdGVyKGlkZXYsIFJDX01BUF9SQzZfTUNFLCBwcm9wcywgRFJJVkVSX05BTUUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicmVtb3RlIGlucHV0IGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIGlyZGV2X2ZhaWxlZDsKKwl9CisKKwlyZXR1cm4gaWRldjsKKworaXJkZXZfZmFpbGVkOgorCWtmcmVlKGlyZGV2KTsKK2lyX2Rldl9hbGxvY19mYWlsZWQ6CisJa2ZyZWUocHJvcHMpOworcHJvcHNfYWxsb2NfZmFpbGVkOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlkZXYpOworaWRldl9hbGxvY19mYWlsZWQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1jZXVzYl9kZXZfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlkZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXAgPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW4gPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnICpjb25maWc7CisJc3RydWN0IG1jZXVzYl9kZXYgKmlyID0gTlVMTDsKKwlpbnQgcGlwZSwgbWF4cCwgaTsKKwljaGFyIGJ1Zls2M10sIG5hbWVbMTI4XSA9ICIiOworCWJvb2wgaXNfZ2VuMzsKKwlib29sIGlzX21pY3Jvc29mdF9nZW4xOworCWJvb2wgdHhfbWFza19pbnZlcnRlZDsKKworCWRldl9kYmcoJmludGYtPmRldiwgIjogJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwljb25maWcgPSBkZXYtPmFjdGNvbmZpZzsKKwlpZGVzYyAgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCWlzX2dlbjMgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZ2VuM19saXN0KSA/IDEgOiAwOworCWlzX21pY3Jvc29mdF9nZW4xID0gdXNiX21hdGNoX2lkKGludGYsIG1pY3Jvc29mdF9nZW4xX2xpc3QpID8gMSA6IDA7CisJdHhfbWFza19pbnZlcnRlZCA9IHVzYl9tYXRjaF9pZChpbnRmLCBzdGRfdHhfbWFza19saXN0KSA/IDAgOiAxOworCisJLyogc3RlcCB0aHJvdWdoIHRoZSBlbmRwb2ludHMgdG8gZmluZCBmaXJzdCBidWxrIGluIGFuZCBvdXQgZW5kcG9pbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWRlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVwID0gJmlkZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCisJCWlmICgoZXBfaW4gPT0gTlVMTCkKKwkJCSYmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisJCQkgICAgPT0gVVNCX0RJUl9JTikKKwkJCSYmICgoKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKKwkJCSAgICA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKQorCQkJfHwgKChlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCisJCQkgICAgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkpIHsKKworCQkJZXBfaW4gPSBlcDsKKwkJCWVwX2luLT5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ7CisJCQllcF9pbi0+YkludGVydmFsID0gMTsKKwkJCWRldl9kYmcoJmludGYtPmRldiwgIjogYWNjZXB0YWJsZSBpbmJvdW5kIGVuZHBvaW50ICIKKwkJCQkiZm91bmRcbiIpOworCQl9CisKKwkJaWYgKChlcF9vdXQgPT0gTlVMTCkKKwkJCSYmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisJCQkgICAgPT0gVVNCX0RJUl9PVVQpCisJCQkmJiAoKChlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCisJCQkgICAgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykKKwkJCXx8ICgoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQorCQkJICAgID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpKSB7CisKKwkJCWVwX291dCA9IGVwOworCQkJZXBfb3V0LT5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ7CisJCQllcF9vdXQtPmJJbnRlcnZhbCA9IDE7CisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICI6IGFjY2VwdGFibGUgb3V0Ym91bmQgZW5kcG9pbnQgIgorCQkJCSJmb3VuZFxuIik7CisJCX0KKwl9CisJaWYgKGVwX2luID09IE5VTEwpIHsKKwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiOiBpbmJvdW5kIGFuZC9vciBlbmRwb2ludCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlcF9pbi0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisKKwlpciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2V1c2JfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcikKKwkJZ290byBtZW1fYWxsb2NfZmFpbDsKKworCWlyLT5idWZfaW4gPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LCBtYXhwLCBHRlBfQVRPTUlDLCAmaXItPmRtYV9pbik7CisJaWYgKCFpci0+YnVmX2luKQorCQlnb3RvIGJ1Zl9pbl9hbGxvY19mYWlsOworCisJaXItPnVyYl9pbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpci0+dXJiX2luKQorCQlnb3RvIHVyYl9pbl9hbGxvY19mYWlsOworCisJaXItPnVzYmRldiA9IGRldjsKKwlpci0+ZGV2ID0gJmludGYtPmRldjsKKwlpci0+bGVuX2luID0gbWF4cDsKKwlpci0+ZmxhZ3MubWljcm9zb2Z0X2dlbjEgPSBpc19taWNyb3NvZnRfZ2VuMTsKKwlpci0+ZmxhZ3MudHhfbWFza19pbnZlcnRlZCA9IHR4X21hc2tfaW52ZXJ0ZWQ7CisKKwkvKiBTYXZpbmcgdXNiIGludGVyZmFjZSBkYXRhIGZvciB1c2UgYnkgdGhlIHRyYW5zbWl0dGVyIHJvdXRpbmUgKi8KKwlpci0+dXNiX2VwX2luID0gZXBfaW47CisJaXItPnVzYl9lcF9vdXQgPSBlcF9vdXQ7CisKKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIKKwkgICAgJiYgdXNiX3N0cmluZyhkZXYsIGRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyLAorCQkJICBidWYsIHNpemVvZihidWYpKSA+IDApCisJCXN0cmxjcHkobmFtZSwgYnVmLCBzaXplb2YobmFtZSkpOworCWlmIChkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QKKwkgICAgJiYgdXNiX3N0cmluZyhkZXYsIGRldi0+ZGVzY3JpcHRvci5pUHJvZHVjdCwKKwkJCSAgYnVmLCBzaXplb2YoYnVmKSkgPiAwKQorCQlzbnByaW50ZihuYW1lICsgc3RybGVuKG5hbWUpLCBzaXplb2YobmFtZSkgLSBzdHJsZW4obmFtZSksCisJCQkgIiAlcyIsIGJ1Zik7CisKKwlpci0+aWRldiA9IG1jZXVzYl9pbml0X2lucHV0X2Rldihpcik7CisJaWYgKCFpci0+aWRldikKKwkJZ290byBpbnB1dF9kZXZfZmFpbDsKKworCS8qIGZsdXNoIGJ1ZmZlcnMgb24gdGhlIGRldmljZSAqLworCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKKwltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CisKKwkvKiB3aXJlIHVwIGluYm91bmQgZGF0YSBoYW5kbGVyICovCisJdXNiX2ZpbGxfaW50X3VyYihpci0+dXJiX2luLCBkZXYsIHBpcGUsIGlyLT5idWZfaW4sCisJCW1heHAsICh1c2JfY29tcGxldGVfdCkgbWNldXNiX2Rldl9yZWN2LCBpciwgZXBfaW4tPmJJbnRlcnZhbCk7CisJaXItPnVyYl9pbi0+dHJhbnNmZXJfZG1hID0gaXItPmRtYV9pbjsKKwlpci0+dXJiX2luLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qIGluaXRpYWxpemUgZGV2aWNlICovCisJaWYgKGlyLT5mbGFncy5taWNyb3NvZnRfZ2VuMSkKKwkJbWNldXNiX2dlbjFfaW5pdChpcik7CisJZWxzZSBpZiAoIWlzX2dlbjMpCisJCW1jZXVzYl9nZW4yX2luaXQoaXIpOworCisJbWNldXNiX2dldF9wYXJhbWV0ZXJzKGlyKTsKKworCW1jZXVzYl9zZXRfdHhfbWFzayhpciwgTUNFX0RFRkFVTFRfVFhfTUFTSyk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGlyKTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJSZWdpc3RlcmVkICVzIG9uIHVzYiVkOiVkXG4iLCBuYW1lLAorCQkgZGV2LT5idXMtPmJ1c251bSwgZGV2LT5kZXZudW0pOworCisJcmV0dXJuIDA7CisKKwkvKiBFcnJvci1oYW5kbGluZyBwYXRoICovCitpbnB1dF9kZXZfZmFpbDoKKwl1c2JfZnJlZV91cmIoaXItPnVyYl9pbik7Cit1cmJfaW5fYWxsb2NfZmFpbDoKKwl1c2JfZnJlZV9jb2hlcmVudChkZXYsIG1heHAsIGlyLT5idWZfaW4sIGlyLT5kbWFfaW4pOworYnVmX2luX2FsbG9jX2ZhaWw6CisJa2ZyZWUoaXIpOworbWVtX2FsbG9jX2ZhaWw6CisJZGV2X2VycigmaW50Zi0+ZGV2LCAiJXM6IGRldmljZSBzZXR1cCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbWNldXNiX2Rldl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBtY2V1c2JfZGV2ICppciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJaWYgKCFpcikKKwkJcmV0dXJuOworCisJaXItPnVzYmRldiA9IE5VTEw7CisJaXJfaW5wdXRfdW5yZWdpc3Rlcihpci0+aWRldik7CisJdXNiX2tpbGxfdXJiKGlyLT51cmJfaW4pOworCXVzYl9mcmVlX3VyYihpci0+dXJiX2luKTsKKwl1c2JfZnJlZV9jb2hlcmVudChkZXYsIGlyLT5sZW5faW4sIGlyLT5idWZfaW4sIGlyLT5kbWFfaW4pOworCisJa2ZyZWUoaXIpOworfQorCitzdGF0aWMgaW50IG1jZXVzYl9kZXZfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IG1jZXVzYl9kZXYgKmlyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlkZXZfaW5mbyhpci0+ZGV2LCAic3VzcGVuZFxuIik7CisJdXNiX2tpbGxfdXJiKGlyLT51cmJfaW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jZXVzYl9kZXZfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBtY2V1c2JfZGV2ICppciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJZGV2X2luZm8oaXItPmRldiwgInJlc3VtZVxuIik7CisJaWYgKHVzYl9zdWJtaXRfdXJiKGlyLT51cmJfaW4sIEdGUF9BVE9NSUMpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG1jZXVzYl9kZXZfZHJpdmVyID0geworCS5uYW1lID0JCURSSVZFUl9OQU1FLAorCS5wcm9iZSA9CW1jZXVzYl9kZXZfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQltY2V1c2JfZGV2X2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQltY2V1c2JfZGV2X3N1c3BlbmQsCisJLnJlc3VtZSA9CW1jZXVzYl9kZXZfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUgPQltY2V1c2JfZGV2X3Jlc3VtZSwKKwkuaWRfdGFibGUgPQltY2V1c2JfZGV2X3RhYmxlCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtY2V1c2JfZGV2X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdXNiX3JlZ2lzdGVyKCZtY2V1c2JfZGV2X2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRQorCQkgICAgICAgIjogdXNiIHJlZ2lzdGVyIGZhaWxlZCwgcmVzdWx0ID0gJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWNldXNiX2Rldl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm1jZXVzYl9kZXZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWNldXNiX2Rldl9pbml0KTsKK21vZHVsZV9leGl0KG1jZXVzYl9kZXZfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG1jZXVzYl9kZXZfdGFibGUpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwppbmRleCA3MzY0Yjk2Li40ZGEyYTU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCiAJdmlkZW9idWZfd2FpdG9uKCZidWYtPnZiLDAsMCk7Ci0JdmlkZW9idWZfZG1hX3VubWFwKHEsIGRtYSk7CisJdmlkZW9idWZfZG1hX3VubWFwKHEtPmRldiwgZG1hKTsKIAl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmJpLmMKaW5kZXggNzRlMmI1Ni4uODIyNGMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZiaS5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIAogc3RhdGljIGludCB2Ymlfb3BlbihzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHNhYTcxNDZfZmggKmZoID0gKHN0cnVjdCBzYWE3MTQ2X2ZoICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXUzMiBhcmJ0cl9jdHJsCT0gc2FhNzE0Nl9yZWFkKGRldiwgUENJX0JUX1YxKTsKIAlpbnQgcmV0ID0gMDsKQEAgLTQzNyw3ICs0MzcsNyBAQAogCiBzdGF0aWMgdm9pZCB2YmlfY2xvc2Uoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IChzdHJ1Y3Qgc2FhNzE0Nl9maCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCURFQl9WQkkoKCJkZXY6JXAsIGZoOiVwXG4iLGRldixmaCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKaW5kZXggYjhiMmM1NS4uYTIxMmE5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYwpAQCAtMTM3MCw3ICsxMzcwLDcgQEAKIAogc3RhdGljIGludCB2aWRlb19vcGVuKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSAoc3RydWN0IHNhYTcxNDZfZmggKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNhYTcxNDZfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2Zvcm1hdCAqc2ZtdDsKIAogCWZoLT52aWRlb19mbXQud2lkdGggPSAzODQ7CkBAIC0xMzk0LDcgKzEzOTQsNyBAQAogCiBzdGF0aWMgdm9pZCB2aWRlb19jbG9zZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHNhYTcxNDZfZmggKmZoID0gKHN0cnVjdCBzYWE3MTQ2X2ZoICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxID0gJmZoLT52aWRlb19xOwogCWludCBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtZmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCmluZGV4IGIyZTE1NDUuLjc5NTVlNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCkBAIC0xMjQ5LDcgKzEyNDksNyBAQAogCQkJCSAgICAgc3RydWN0IHRkYTE4MjcxX2NvbmZpZyAqY2ZnKQogewogCXN0cnVjdCB0ZGExODI3MV9wcml2ICpwcml2ID0gTlVMTDsKLQlpbnQgaW5zdGFuY2U7CisJaW50IGluc3RhbmNlLCByZXQ7CiAKIAltdXRleF9sb2NrKCZ0ZGExODI3MV9saXN0X211dGV4KTsKIApAQCAtMTI2OCwxMCArMTI2OCwxMiBAQAogCQlwcml2LT5jYWxfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAkJbXV0ZXhfaW5pdCgmcHJpdi0+bG9jayk7CiAKLQkJaWYgKHRkYV9mYWlsKHRkYTE4MjcxX2dldF9pZChmZSkpKQorCQlyZXQgPSB0ZGExODI3MV9nZXRfaWQoZmUpOworCQlpZiAodGRhX2ZhaWwocmV0KSkKIAkJCWdvdG8gZmFpbDsKIAotCQlpZiAodGRhX2ZhaWwodGRhMTgyNzFfYXNzaWduX21hcF9sYXlvdXQoZmUpKSkKKwkJcmV0ID0gdGRhMTgyNzFfYXNzaWduX21hcF9sYXlvdXQoZmUpOworCQlpZiAodGRhX2ZhaWwocmV0KSkKIAkJCWdvdG8gZmFpbDsKIAogCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci1zaW1wbGUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci1zaW1wbGUuYwppbmRleCA4Y2YyYWI2Li5mOGVlMjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItc2ltcGxlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXNpbXBsZS5jCkBAIC01NDYsMTQgKzU0NiwxMSBAQAogCXN0cnVjdCB0dW5lcl9zaW1wbGVfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OwogCXU4IGNvbmZpZywgY2I7CiAJdTE2IGRpdjsKLQlzdHJ1Y3QgdHVuZXJ0eXBlICp0dW47CiAJdTggYnVmZmVyWzRdOwogCWludCByYywgSUZQQ29mZiwgaTsKIAllbnVtIHBhcmFtX3R5cGUgZGVzaXJlZF90eXBlOwogCXN0cnVjdCB0dW5lcl9wYXJhbXMgKnRfcGFyYW1zOwogCi0JdHVuID0gcHJpdi0+dHVuOwotCiAJLyogSUZQQ29mZiA9IFZpZGVvIEludGVybWVkaWF0ZSBGcmVxdWVuY3kgLSBWaWY6CiAJCTk0MCAgPTE2KjU4Ljc1ICBOVFNDL0ogKEphcGFuKQogCQk3MzIgID0xNio0NS43NSAgTS9OIFNURApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jCmluZGV4IDQzMjAwM2QuLmQyYjJjMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmMKQEAgLTIxNyw2ICsyMTcsNyBAQAogCXJldHVybiBYQ19SRVNVTFRfU1VDQ0VTUzsKIH0KIAorI2lmIDAKIC8qIFRoaXMgcm91dGluZSBpcyBuZXZlciB1c2VkIGJlY2F1c2UgdGhlIG9ubHkgdGltZSB3ZSByZWFkIGRhdGEgZnJvbSB0aGUKICAgIGkyYyBidXMgaXMgd2hlbiB3ZSByZWFkIHJlZ2lzdGVycywgYW5kIHdlIHdhbnQgdGhhdCB0byBiZSBhbiBhdG9taWMgaTJjCiAgICB0cmFuc2FjdGlvbiBpbiBjYXNlIHdlIGFyZSBvbiBhIG11bHRpLW1hc3RlciBidXMgKi8KQEAgLTIzMSw2ICsyMzIsMjcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKKworc3RhdGljIGludCB4YzUwMDBfcmVhZHJlZyhzdHJ1Y3QgeGM1MDAwX3ByaXYgKnByaXYsIHUxNiByZWcsIHUxNiAqdmFsKQoreworCXU4IGJ1ZlsyXSA9IHsgcmVnID4+IDgsIHJlZyAmIDB4ZmYgfTsKKwl1OCBidmFsWzJdID0geyAwLCAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7IC5hZGRyID0gcHJpdi0+aTJjX3Byb3BzLmFkZHIsCisJCQkuZmxhZ3MgPSAwLCAuYnVmID0gJmJ1ZlswXSwgLmxlbiA9IDIgfSwKKwkJeyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSAmYnZhbFswXSwgLmxlbiA9IDIgfSwKKwl9OworCisJaWYgKGkyY190cmFuc2Zlcihwcml2LT5pMmNfcHJvcHMuYWRhcCwgbXNnLCAyKSAhPSAyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInhjNTAwMDogSTJDIHJlYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJKnZhbCA9IChidmFsWzBdIDw8IDgpIHwgYnZhbFsxXTsKKwlyZXR1cm4gWENfUkVTVUxUX1NVQ0NFU1M7Cit9CiAKIHN0YXRpYyB2b2lkIHhjX3dhaXQoaW50IHdhaXRfbXMpCiB7CkBAIC0yNzUsMjAgKzI5NywxNCBAQAogCWlmIChyZXN1bHQgPT0gWENfUkVTVUxUX1NVQ0NFU1MpIHsKIAkJLyogd2FpdCBmb3IgYnVzeSBmbGFnIHRvIGNsZWFyICovCiAJCXdoaWxlICgoV2F0Y2hEb2dUaW1lciA+IDApICYmIChyZXN1bHQgPT0gWENfUkVTVUxUX1NVQ0NFU1MpKSB7Ci0JCQlidWZbMF0gPSAwOwotCQkJYnVmWzFdID0gWFJFR19CVVNZOwotCi0JCQlyZXN1bHQgPSB4Y19zZW5kX2kyY19kYXRhKHByaXYsIGJ1ZiwgMik7CisJCQlyZXN1bHQgPSB4YzUwMDBfcmVhZHJlZyhwcml2LCBYUkVHX0JVU1ksICh1MTYgKilidWYpOwogCQkJaWYgKHJlc3VsdCA9PSBYQ19SRVNVTFRfU1VDQ0VTUykgewotCQkJCXJlc3VsdCA9IHhjX3JlYWRfaTJjX2RhdGEocHJpdiwgYnVmLCAyKTsKLQkJCQlpZiAocmVzdWx0ID09IFhDX1JFU1VMVF9TVUNDRVNTKSB7Ci0JCQkJCWlmICgoYnVmWzBdID09IDApICYmIChidWZbMV0gPT0gMCkpIHsKLQkJCQkJCS8qIGJ1c3kgZmxhZyBjbGVhcmVkICovCisJCQkJaWYgKChidWZbMF0gPT0gMCkgJiYgKGJ1ZlsxXSA9PSAwKSkgeworCQkJCQkvKiBidXN5IGZsYWcgY2xlYXJlZCAqLwogCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXhjX3dhaXQoNSk7IC8qIHdhaXQgNSBtcyAqLwotCQkJCQkJV2F0Y2hEb2dUaW1lci0tOwotCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJeGNfd2FpdCg1KTsgLyogd2FpdCA1IG1zICovCisJCQkJCVdhdGNoRG9nVGltZXItLTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTUyNiwyNSArNTQyLDYgQEAKIAlyZXR1cm4gZm91bmQ7CiB9CiAKLXN0YXRpYyBpbnQgeGM1MDAwX3JlYWRyZWcoc3RydWN0IHhjNTAwMF9wcml2ICpwcml2LCB1MTYgcmVnLCB1MTYgKnZhbCkKLXsKLQl1OCBidWZbMl0gPSB7IHJlZyA+PiA4LCByZWcgJiAweGZmIH07Ci0JdTggYnZhbFsyXSA9IHsgMCwgMCB9OwotCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKLQkJeyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAotCQkJLmZsYWdzID0gMCwgLmJ1ZiA9ICZidWZbMF0sIC5sZW4gPSAyIH0sCi0JCXsgLmFkZHIgPSBwcml2LT5pMmNfcHJvcHMuYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJmJ2YWxbMF0sIC5sZW4gPSAyIH0sCi0JfTsKLQotCWlmIChpMmNfdHJhbnNmZXIocHJpdi0+aTJjX3Byb3BzLmFkYXAsIG1zZywgMikgIT0gMikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4YzUwMDA6IEkyQyByZWFkIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCSp2YWwgPSAoYnZhbFswXSA8PCA4KSB8IGJ2YWxbMV07Ci0JcmV0dXJuIFhDX1JFU1VMVF9TVUNDRVNTOwotfQogCiBzdGF0aWMgaW50IHhjNTAwMF9md3VwbG9hZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKaW5kZXggNzcwMjQzYy4uY2Y4NzA1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKQEAgLTU2NSw3ICs1NjUsNyBAQAogCWludCByZXN1bHQgPSAwOwogCiAJbG9ja19rZXJuZWwoKTsKLQlkdmJkZXYgPSAoc3RydWN0IGR2Yl9kZXZpY2UgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0YXRlID0gKHN0cnVjdCBkc3Rfc3RhdGUgKilkdmJkZXYtPnByaXY7CiAJcF9jYV9tZXNzYWdlID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKTsKIAlwX2NhX3Nsb3RfaW5mbyA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2Ffc2xvdF9pbmZvKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCmluZGV4IDQyNTg2MmYuLjAwNDIzMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAl9CiAJLyogVE9ETyAqLwogCWR2YmRldi0+dXNlcnMtLTsKLQlpZihkdmJkZXYtPnVzZXJzPT0tMSAmJiBkbXhkZXYtPmV4aXQ9PTEpIHsKKwlpZiAoZHZiZGV2LT51c2VycyA9PSAxICYmIGRteGRldi0+ZXhpdCA9PSAxKSB7CiAJCWZvcHNfcHV0KGZpbGUtPmZfb3ApOwogCQlmaWxlLT5mX29wID0gTlVMTDsKIAkJbXV0ZXhfdW5sb2NrKCZkbXhkZXYtPm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCmluZGV4IGVmMjU5YTAuLmNiOTdlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYwpAQCAtMTMxOCw4ICsxMzE4LDExIEBACiAKIAkJZnJhZ2J1ZlswXSA9IGNvbm5lY3Rpb25faWQ7CiAJCWZyYWdidWZbMV0gPSAoKGZyYWdwb3MgKyBmcmFnbGVuKSA8IGNvdW50KSA/IDB4ODAgOiAweDAwOwotCQlpZiAoKHN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGZyYWdidWYgKyAyLCBidWYgKyBmcmFncG9zLCBmcmFnbGVuKSkgIT0gMCkKKwkJc3RhdHVzID0gY29weV9mcm9tX3VzZXIoZnJhZ2J1ZiArIDIsIGJ1ZiArIGZyYWdwb3MsIGZyYWdsZW4pOworCQlpZiAoc3RhdHVzKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOwogCQkJZ290byBleGl0OworCQl9CiAKIAkJdGltZW91dCA9IGppZmZpZXMgKyBIWiAvIDI7CiAJCXdyaXR0ZW4gPSAwOwpAQCAtMTQ5NCw4ICsxNDk3LDExIEBACiAKIAloZHJbMF0gPSBzbG90OwogCWhkclsxXSA9IGNvbm5lY3Rpb25faWQ7Ci0JaWYgKChzdGF0dXMgPSBjb3B5X3RvX3VzZXIoYnVmLCBoZHIsIDIpKSAhPSAwKQorCXN0YXR1cyA9IGNvcHlfdG9fdXNlcihidWYsIGhkciwgMik7CisJaWYgKHN0YXR1cykgeworCQlzdGF0dXMgPSAtRUZBVUxUOwogCQlnb3RvIGV4aXQ7CisJfQogCXN0YXR1cyA9IHBrdGxlbjsKIAogZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKaW5kZXggOTc3ZGRiYS4uNGE4OGEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKQEAgLTExMzAsMTMgKzExMzAsOSBAQAogCWlmICgoIWRlbXV4LT5mcm9udGVuZCkgfHwgKGRlbXV4LT5mcm9udGVuZC0+c291cmNlICE9IERNWF9NRU1PUllfRkUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXAgPSBrbWFsbG9jKGNvdW50LCBHRlBfVVNFUik7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoY29weV9mcm9tX3VzZXIocCwgYnVmLCBjb3VudCkpIHsKLQkJa2ZyZWUocCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwlwID0gbWVtZHVwX3VzZXIoYnVmLCBjb3VudCk7CisJaWYgKElTX0VSUihwKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZHZiZGVtdXgtPm11dGV4KSkgewogCQlrZnJlZShwKTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggNDRhZTg5ZS4uNGQ0NWI3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTQ2NSw3ICs0NjUsNyBAQAogCWlmICgoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfU0VBUkNISU5HX0ZBU1QpIHx8IChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpKSB7CiAJCWZlcHJpdi0+ZGVsYXkgPSBmZXByaXYtPm1pbl9kZWxheTsKIAotCQkvKiBwZWZvcm0gYSB0dW5lICovCisJCS8qIHBlcmZvcm0gYSB0dW5lICovCiAJCXJldHZhbCA9IGR2Yl9mcm9udGVuZF9zd3ppZ3phZ19hdXRvdHVuZShmZSwKIAkJCQkJCQlmZXByaXYtPmNoZWNrX3dyYXBwZWQpOwogCQlpZiAocmV0dmFsIDwgMCkgewpAQCAtNzkxLDcgKzc5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGR2Yl9mcm9udGVuZF9nZXRfZnJlcXVlbnlfbGltaXRzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorc3RhdGljIHZvaWQgZHZiX2Zyb250ZW5kX2dldF9mcmVxdWVuY3lfbGltaXRzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAogCQkJCQl1MzIgKmZyZXFfbWluLCB1MzIgKmZyZXFfbWF4KQogewogCSpmcmVxX21pbiA9IG1heChmZS0+b3BzLmluZm8uZnJlcXVlbmN5X21pbiwgZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluKTsKQEAgLTgxNSw3ICs4MTUsNyBAQAogCXUzMiBmcmVxX21heDsKIAogCS8qIHJhbmdlIGNoZWNrOiBmcmVxdWVuY3kgKi8KLQlkdmJfZnJvbnRlbmRfZ2V0X2ZyZXF1ZW55X2xpbWl0cyhmZSwgJmZyZXFfbWluLCAmZnJlcV9tYXgpOworCWR2Yl9mcm9udGVuZF9nZXRfZnJlcXVlbmN5X2xpbWl0cyhmZSwgJmZyZXFfbWluLCAmZnJlcV9tYXgpOwogCWlmICgoZnJlcV9taW4gJiYgcGFybXMtPmZyZXF1ZW5jeSA8IGZyZXFfbWluKSB8fAogCSAgICAoZnJlcV9tYXggJiYgcGFybXMtPmZyZXF1ZW5jeSA+IGZyZXFfbWF4KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJEVkI6IGFkYXB0ZXIgJWkgZnJvbnRlbmQgJWkgZnJlcXVlbmN5ICV1IG91dCBvZiByYW5nZSAoJXUuLiV1KVxuIiwKQEAgLTE2MjcsNyArMTYyNyw3IEBACiAJY2FzZSBGRV9HRVRfSU5GTzogewogCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8qIGluZm8gPSBwYXJnOwogCQltZW1jcHkoaW5mbywgJmZlLT5vcHMuaW5mbywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykpOwotCQlkdmJfZnJvbnRlbmRfZ2V0X2ZyZXF1ZW55X2xpbWl0cyhmZSwgJmluZm8tPmZyZXF1ZW5jeV9taW4sICZpbmZvLT5mcmVxdWVuY3lfbWF4KTsKKwkJZHZiX2Zyb250ZW5kX2dldF9mcmVxdWVuY3lfbGltaXRzKGZlLCAmaW5mby0+ZnJlcXVlbmN5X21pbiwgJmluZm8tPmZyZXF1ZW5jeV9tYXgpOwogCiAJCS8qIEZvcmNlIHRoZSBDQU5fSU5WRVJTSU9OX0FVVE8gYml0IG9uLiBJZiB0aGUgZnJvbnRlbmQgZG9lc24ndAogCQkgKiBkbyBpdCwgaXQgaXMgZG9uZSBmb3IgaXQuICovCkBAIC0xNzI2LDcgKzE3MjYsNyBAQAogCQkJICogKHN0djAyOTkgZm9yIGluc3RhbmNlKSB0YWtlIGxvbmdlciB0aGFuIDhtc2VjIHRvCiAJCQkgKiByZXNwb25kIHRvIGEgc2V0X3ZvbHRhZ2UgY29tbWFuZC4gIFRob3NlIHN3aXRjaGVzCiAJCQkgKiBuZWVkIGN1c3RvbSByb3V0aW5lcyB0byBzd2l0Y2ggcHJvcGVybHkuICBGb3IgYWxsCi0JCQkgKiBvdGhlciBmcm9udGVuZHMsIHRoZSBmb2xsb3dpbmcgc2hvdWxlIHdvcmsgb2suCisJCQkgKiBvdGhlciBmcm9udGVuZHMsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgb2suCiAJCQkgKiBEaXNoIG5ldHdvcmsgbGVnYWN5IHN3aXRjaGVzIChhcyB1c2VkIGJ5IERpc2g1MDApCiAJCQkgKiBhcmUgY29udHJvbGxlZCBieSBzZW5kaW5nIDktYml0IGNvbW1hbmQgd29yZHMKIAkJCSAqIHNwYWNlZCA4bXNlYyBhcGFydC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKaW5kZXggYjZjYmIxZC4uYTVjMzYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19hODAwX3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX2E4MDBfdGFibGVbXSA9IHsKIAl7IDB4MDIwMSwgS0VZX1BST0cxIH0sICAgICAgIC8qIFNPVVJDRSAqLwogCXsgMHgwMjAwLCBLRVlfUE9XRVIgfSwgICAgICAgLyogUE9XRVIgKi8KIAl7IDB4MDIwNSwgS0VZXzEgfSwgICAgICAgICAgIC8qIDEgKi8KQEAgLTE0NiwxMCArMTQ2LDEyIEBACiAJLnBvd2VyX2N0cmwgICAgICAgPSBhODAwX3Bvd2VyX2N0cmwsCiAJLmlkZW50aWZ5X3N0YXRlICAgPSBhODAwX2lkZW50aWZ5X3N0YXRlLAogCi0JLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfYTgwMF90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfYTgwMF90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBhODAwX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19hODAwX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfYTgwMF90YWJsZSksCisJCS5yY19xdWVyeSAgICAgICAgID0gYTgwMF9yY19xdWVyeSwKKwl9LAogCiAJLmkyY19hbGdvICAgICAgICAgPSAmZGlidXNiX2kyY19hbGdvLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS1yZW1vdGUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXJlbW90ZS5jCmluZGV4IGI0MWZhODcuLjY5NjIwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXJlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXJlbW90ZS5jCkBAIC0zMyw3ICszMyw3IEBACiAKICNkZWZpbmUgZGViX2RlY29kZShhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl9hZjkwMDVfcmVtb3RlX2RlYnVnLDB4MDEsYXJncykKIAotc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FmOTAwNV90YWJsZVtdID0geworc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX2FmOTAwNV90YWJsZVtdID0gewogCiAJezB4MDFiNywgS0VZX1BPV0VSfSwKIAl7MHgwMWE3LCBLRVlfVk9MVU1FVVB9LApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgaXJfY29kZXNfYWY5MDA1X3RhYmxlX3NpemU7IGkrKykgewogCQkJCWlmIChyYzVfY3VzdG9tKCZpcl9jb2Rlc19hZjkwMDVfdGFibGVbaV0pID09IGN1c3QKIAkJCQkgICAgJiYgcmM1X2RhdGEoJmlyX2NvZGVzX2FmOTAwNV90YWJsZVtpXSkgPT0gZGF0KSB7Ci0JCQkJCSpldmVudCA9IGlyX2NvZGVzX2FmOTAwNV90YWJsZVtpXS5ldmVudDsKKwkJCQkJKmV2ZW50ID0gaXJfY29kZXNfYWY5MDA1X3RhYmxlW2ldLmtleWNvZGU7CiAJCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKIAkJCQkJZGViX2RlY29kZQogCQkJCQkgICAgKCJrZXkgcHJlc3NlZCwgZXZlbnQgJXhcbiIsICpldmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUuYwppbmRleCBjZmQ2MTA3Li44ZWNiYTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmMKQEAgLTU0LDUwICs1NCw2IEBACiAJaW50IGxlZF9zdGF0ZTsKIH07CiAKLXN0YXRpYyBpbnQgYWY5MDA1X3VzYl9nZW5lcmljX3J3KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggKndidWYsIHUxNiB3bGVuLAotCQkJICB1OCAqcmJ1ZiwgdTE2IHJsZW4sIGludCBkZWxheV9tcykKLXsKLQlpbnQgYWN0bGVuLCByZXQgPSAtRU5PTUVNOwotCi0JaWYgKHdidWYgPT0gTlVMTCB8fCB3bGVuID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkpKQotCQlyZXR1cm4gcmV0OwotCi0JZGViX3hmZXIoIj4+PiAiKTsKLQlkZWJ1Z19kdW1wKHdidWYsIHdsZW4sIGRlYl94ZmVyKTsKLQotCXJldCA9IHVzYl9idWxrX21zZyhkLT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZC0+dWRldiwKLQkJCQkJCSAgICAyKSwgd2J1Ziwgd2xlbiwKLQkJCSAgICZhY3RsZW4sIDIwMDApOwotCi0JaWYgKHJldCkKLQkJZXJyKCJidWxrIG1lc3NhZ2UgZmFpbGVkOiAlZCAoJWQvJWQpIiwgcmV0LCB3bGVuLCBhY3RsZW4pOwotCWVsc2UKLQkJcmV0ID0gYWN0bGVuICE9IHdsZW4gPyAtMSA6IDA7Ci0KLQkvKiBhbiBhbnN3ZXIgaXMgZXhwZWN0ZWQsIGFuZCBubyBlcnJvciBiZWZvcmUgKi8KLQlpZiAoIXJldCAmJiByYnVmICYmIHJsZW4pIHsKLQkJaWYgKGRlbGF5X21zKQotCQkJbXNsZWVwKGRlbGF5X21zKTsKLQotCQlyZXQgPSB1c2JfYnVsa19tc2coZC0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsCi0JCQkJCQkJICAgIDB4MDEpLCByYnVmLAotCQkJCSAgIHJsZW4sICZhY3RsZW4sIDIwMDApOwotCi0JCWlmIChyZXQpCi0JCQllcnIoInJlY3YgYnVsayBtZXNzYWdlIGZhaWxlZDogJWQiLCByZXQpOwotCQllbHNlIHsKLQkJCWRlYl94ZmVyKCI8PDwgIik7Ci0JCQlkZWJ1Z19kdW1wKHJidWYsIGFjdGxlbiwgZGViX3hmZXIpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgYWY5MDA1X2dlbmVyaWNfcmVhZF93cml0ZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUxNiByZWcsCiAJCQkgICAgICBpbnQgcmVhZHdyaXRlLCBpbnQgdHlwZSwgdTggKiB2YWx1ZXMsIGludCBsZW4pCiB7CkBAIC0xNDYsNyArMTAyLDcgQEAKIAkJb2J1Zls4XSA9IHZhbHVlc1swXTsKIAlvYnVmWzddID0gY29tbWFuZDsKIAotCXJldCA9IGFmOTAwNV91c2JfZ2VuZXJpY19ydyhkLCBvYnVmLCAxNiwgaWJ1ZiwgMTcsIDApOworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhkLCBvYnVmLCAxNiwgaWJ1ZiwgMTcsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTUzNCw3ICs0OTAsNyBAQAogCWJ1Zls2XSA9IHdsZW47CiAJZm9yIChpID0gMDsgaSA8IHdsZW47IGkrKykKIAkJYnVmWzcgKyBpXSA9IHdidWZbaV07Ci0JcmV0ID0gYWY5MDA1X3VzYl9nZW5lcmljX3J3KGQsIGJ1Ziwgd2xlbiArIDcsIGlidWYsIHJsZW4gKyA3LCAwKTsKKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYnVmLCB3bGVuICsgNywgaWJ1ZiwgcmxlbiArIDcsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKGlidWZbMl0gIT0gMHgyNykgewpAQCAtNTgxLDcgKzUzNyw3IEBACiAKIAlvYnVmWzZdID0gbGVuOwogCW9idWZbN10gPSBhZGRyZXNzOwotCXJldCA9IGFmOTAwNV91c2JfZ2VuZXJpY19ydyhkLCBvYnVmLCAxNiwgaWJ1ZiwgMTQsIDApOworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhkLCBvYnVmLCAxNiwgaWJ1ZiwgMTQsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKGlidWZbMl0gIT0gMHgyYikgewpAQCAtODgyLDcgKzgzOCw3IEBACiAJb2J1ZlsyXSA9IDB4NDA7CQkvKiByZWFkIHJlbW90ZSAqLwogCW9idWZbM10gPSAxOwkJLyogcmVzdCBvZiBwYWNrZXQgbGVuZ3RoICovCiAJb2J1Zls0XSA9IHN0LT5zZXF1ZW5jZSsrOwkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KLQlyZXQgPSBhZjkwMDVfdXNiX2dlbmVyaWNfcncoZCwgb2J1ZiwgNSwgaWJ1ZiwgMjU2LCAwKTsKKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgb2J1ZiwgNSwgaWJ1ZiwgMjU2LCAwKTsKIAlpZiAocmV0KSB7CiAJCWVycigicmMgcXVlcnkgZmFpbGVkIik7CiAJCXJldHVybiByZXQ7CkBAIC0xMDY5LDEwICsxMDI1LDE1IEBACiAKIAkuaTJjX2FsZ28gPSAmYWY5MDA1X2kyY19hbGdvLAogCi0JLnJjX2ludGVydmFsID0gMjAwLAotCS5yY19rZXlfbWFwID0gTlVMTCwKLQkucmNfa2V5X21hcF9zaXplID0gMCwKLQkucmNfcXVlcnkgPSBhZjkwMDVfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsID0gMjAwLAorCQkucmNfa2V5X21hcCA9IE5VTEwsCisJCS5yY19rZXlfbWFwX3NpemUgPSAwLAorCQkucmNfcXVlcnkgPSBhZjkwMDVfcmNfcXVlcnksCisJfSwKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCAgICAgICAgICA9IDIsCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50X3Jlc3BvbnNlID0gMSwKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMywKIAkuZGV2aWNlcyA9IHsKQEAgLTExMTMsMTAgKzEwNzQsMTAgQEAKIAlyY19rZXlzX3NpemUgPSBzeW1ib2xfcmVxdWVzdChpcl9jb2Rlc19hZjkwMDVfdGFibGVfc2l6ZSk7CiAJaWYgKHJjX2RlY29kZSA9PSBOVUxMIHx8IHJjX2tleXMgPT0gTlVMTCB8fCByY19rZXlzX3NpemUgPT0gTlVMTCkgewogCQllcnIoImFmOTAwNV9yY19kZWNvZGUgZnVuY3Rpb24gbm90IGZvdW5kLCBkaXNhYmxpbmcgcmVtb3RlIik7Ci0JCWFmOTAwNV9wcm9wZXJ0aWVzLnJjX3F1ZXJ5ID0gTlVMTDsKKwkJYWY5MDA1X3Byb3BlcnRpZXMucmMubGVnYWN5LnJjX3F1ZXJ5ID0gTlVMTDsKIAl9IGVsc2UgewotCQlhZjkwMDVfcHJvcGVydGllcy5yY19rZXlfbWFwID0gcmNfa2V5czsKLQkJYWY5MDA1X3Byb3BlcnRpZXMucmNfa2V5X21hcF9zaXplID0gKnJjX2tleXNfc2l6ZTsKKwkJYWY5MDA1X3Byb3BlcnRpZXMucmMubGVnYWN5LnJjX2tleV9tYXAgPSByY19rZXlzOworCQlhZjkwMDVfcHJvcGVydGllcy5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplID0gKnJjX2tleXNfc2l6ZTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5oCmluZGV4IDA4OGU3MDguLjNjMWZiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUuaApAQCAtMzQ5MCw3ICszNDkwLDcgQEAKIC8qIHJlbW90ZSBjb250cm9sIGRlY29kZXIgKi8KIGV4dGVybiBpbnQgYWY5MDA1X3JjX2RlY29kZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4ICogZGF0YSwgaW50IGxlbiwKIAkJCSAgICB1MzIgKiBldmVudCwgaW50ICpzdGF0ZSk7Ci1leHRlcm4gc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FmOTAwNV90YWJsZVtdOworZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19hZjkwMDVfdGFibGVbXTsKIGV4dGVybiBpbnQgaXJfY29kZXNfYWY5MDA1X3RhYmxlX3NpemU7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKaW5kZXggNjZjN2MzZS4uZWExZWQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCkBAIC03MzUsNyArNzM1LDcgQEAKIAogc3RydWN0IGFmOTAxNV9zZXR1cCB7CiAJdW5zaWduZWQgaW50IGlkOwotCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqcmNfa2V5X21hcDsKKwlzdHJ1Y3QgaXJfc2NhbmNvZGUgKnJjX2tleV9tYXA7CiAJdW5zaWduZWQgaW50IHJjX2tleV9tYXBfc2l6ZTsKIAl1OCAqaXJfdGFibGU7CiAJdW5zaWduZWQgaW50IGlyX3RhYmxlX3NpemU7CkBAIC04NDcsOCArODQ3LDggQEAKIAl9CiAKIAlpZiAodGFibGUpIHsKLQkJcHJvcHMtPnJjX2tleV9tYXAgPSB0YWJsZS0+cmNfa2V5X21hcDsKLQkJcHJvcHMtPnJjX2tleV9tYXBfc2l6ZSA9IHRhYmxlLT5yY19rZXlfbWFwX3NpemU7CisJCXByb3BzLT5yYy5sZWdhY3kucmNfa2V5X21hcCA9IHRhYmxlLT5yY19rZXlfbWFwOworCQlwcm9wcy0+cmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZSA9IHRhYmxlLT5yY19rZXlfbWFwX3NpemU7CiAJCWFmOTAxNV9jb25maWcuaXJfdGFibGUgPSB0YWJsZS0+aXJfdGFibGU7CiAJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9IHRhYmxlLT5pcl90YWJsZV9zaXplOwogCX0KQEAgLTg3OCw4ICs4NzgsOCBAQAogCWRlYl9pbmZvKCIlczogSVIgbW9kZTolZFxuIiwgX19mdW5jX18sIHZhbCk7CiAJZm9yIChpID0gMDsgaSA8IGFmOTAxNV9wcm9wZXJ0aWVzX2NvdW50OyBpKyspIHsKIAkJaWYgKHZhbCA9PSBBRjkwMTVfSVJfTU9ERV9ESVNBQkxFRCkgewotCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0ucmNfa2V5X21hcCA9IE5VTEw7Ci0JCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwX3NpemUgID0gMDsKKwkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjLmxlZ2FjeS5yY19rZXlfbWFwID0gTlVMTDsKKwkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemUgID0gMDsKIAkJfSBlbHNlCiAJCQlhZjkwMTVfc2V0X3JlbW90ZV9jb25maWcodWRldiwgJmFmOTAxNV9wcm9wZXJ0aWVzW2ldKTsKIAl9CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogewogCXU4IGJ1Zls4XTsKIAlzdHJ1Y3QgcmVxX3QgcmVxID0ge0dFVF9JUl9DT0RFLCAwLCAwLCAwLCAwLCBzaXplb2YoYnVmKSwgYnVmfTsKLQlzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleW1hcCA9IGQtPnByb3BzLnJjX2tleV9tYXA7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcDsKIAlpbnQgaSwgcmV0OwogCiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwpAQCAtMTA3NSwxMCArMTA3NSwxMCBAQAogCSpldmVudCA9IDA7CiAJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOwogCi0JZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemU7IGkrKykgewogCQlpZiAoIWJ1ZlsxXSAmJiByYzVfY3VzdG9tKCZrZXltYXBbaV0pID09IGJ1ZlswXSAmJgogCQkgICAgcmM1X2RhdGEoJmtleW1hcFtpXSkgPT0gYnVmWzJdKSB7Ci0JCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CisJCQkqZXZlbnQgPSBrZXltYXBbaV0ua2V5Y29kZTsKIAkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMjk5LDYgKzEyOTksNyBAQAogCXtVU0JfREVWSUNFKFVTQl9WSURfTEVBRFRFSywgICBVU0JfUElEX1dJTkZBU1RfRFRWMjAwMERTKX0sCiAvKiAzMCAqL3tVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxEXzIsICBVU0JfUElEX0tXT1JMRF9VQjM4M19UKX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9LV09STERfMiwgIFVTQl9QSURfS1dPUkxEXzM5NVVfNCl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBLCBVU0JfUElEX0FWRVJNRURJQV9BODE1TSl9LAogCXswfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYWY5MDE1X3VzYl90YWJsZSk7CkBAIC0xMzUzLDggKzEzNTQsMTAgQEAKIAogCQkuaWRlbnRpZnlfc3RhdGUgPSBhZjkwMTVfaWRlbnRpZnlfc3RhdGUsCiAKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhZjkwMTVfcmNfcXVlcnksCi0JCS5yY19pbnRlcnZhbCAgICAgID0gMTUwLAorCQkucmMubGVnYWN5ID0geworCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhZjkwMTVfcmNfcXVlcnksCisJCQkucmNfaW50ZXJ2YWwgICAgICA9IDE1MCwKKwkJfSwKIAogCQkuaTJjX2FsZ28gPSAmYWY5MDE1X2kyY19hbGdvLAogCkBAIC0xNDYwLDggKzE0NjMsMTAgQEAKIAogCQkuaWRlbnRpZnlfc3RhdGUgPSBhZjkwMTVfaWRlbnRpZnlfc3RhdGUsCiAKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhZjkwMTVfcmNfcXVlcnksCi0JCS5yY19pbnRlcnZhbCAgICAgID0gMTUwLAorCQkucmMubGVnYWN5ID0geworCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhZjkwMTVfcmNfcXVlcnksCisJCQkucmNfaW50ZXJ2YWwgICAgICA9IDE1MCwKKwkJfSwKIAogCQkuaTJjX2FsZ28gPSAmYWY5MDE1X2kyY19hbGdvLAogCkBAIC0xNTY3LDEyICsxNTcyLDE0IEBACiAKIAkJLmlkZW50aWZ5X3N0YXRlID0gYWY5MDE1X2lkZW50aWZ5X3N0YXRlLAogCi0JCS5yY19xdWVyeSAgICAgICAgID0gYWY5MDE1X3JjX3F1ZXJ5LAotCQkucmNfaW50ZXJ2YWwgICAgICA9IDE1MCwKKwkJLnJjLmxlZ2FjeSA9IHsKKwkJCS5yY19xdWVyeSAgICAgICAgID0gYWY5MDE1X3JjX3F1ZXJ5LAorCQkJLnJjX2ludGVydmFsICAgICAgPSAxNTAsCisJCX0sCiAKIAkJLmkyY19hbGdvID0gJmFmOTAxNV9pMmNfYWxnbywKIAotCQkubnVtX2RldmljZV9kZXNjcyA9IDgsIC8qIG1heCA5ICovCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gOSwgLyogbWF4IDkgKi8KIAkJLmRldmljZXMgPSB7CiAJCQl7CiAJCQkJLm5hbWUgPSAiQXZlck1lZGlhIEFWZXJUViBWb2xhciBHUFMgODA1IChBODA1KSIsCkBAIC0xNjE3LDYgKzE2MjQsMTEgQEAKIAkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMzBdLCBOVUxMfSwKIAkJCQkud2FybV9pZHMgPSB7TlVMTH0sCiAJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkF2ZXJNZWRpYSBBVmVyVFYgVm9sYXIgTSAoQTgxNU1hYykiLAorCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVszMl0sIE5VTEx9LAorCQkJCS53YXJtX2lkcyA9IHtOVUxMfSwKKwkJCX0sCiAJCX0KIAl9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oCmluZGV4IDYzYjJhNDkuLmM4ZTkzNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaApAQCAtMTIzLDcgKzEyMyw3IEBACiAKIC8qIExlYWRUZWsgLSBZMDRHMDA1MSAqLwogLyogTGVhZHRlayBXaW5GYXN0IERUViBEb25nbGUgR29sZCAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfbGVhZHRla1tdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfbGVhZHRla1tdID0gewogCXsgMHgwMDFlLCBLRVlfMSB9LAogCXsgMHgwMDFmLCBLRVlfMiB9LAogCXsgMHgwMDIwLCBLRVlfMyB9LApAQCAtMjI3LDcgKzIyNyw3IEBACiB9OwogCiAvKiBUd2luSGFuIEF6dXJlV2F2ZSBBRC1UVTcwMCg3MDRKKSAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfdHdpbmhhbltdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfdHdpbmhhbltdID0gewogCXsgMHgwNTNmLCBLRVlfUE9XRVIgfSwKIAl7IDB4MDAxOSwgS0VZX0ZBVk9SSVRFUyB9LCAgICAvKiBGYXZvcml0ZSBMaXN0ICovCiAJeyAweDAwMDQsIEtFWV9URVhUIH0sICAgICAgICAgLyogVGVsZXRleHQgKi8KQEAgLTMzOCw3ICszMzgsNyBAQAogfTsKIAogLyogQS1MaW5rIERUVShtKSAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfYV9saW5rW10gPSB7CitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX2FmOTAxNV90YWJsZV9hX2xpbmtbXSA9IHsKIAl7IDB4MDAxZSwgS0VZXzEgfSwKIAl7IDB4MDAxZiwgS0VZXzIgfSwKIAl7IDB4MDAyMCwgS0VZXzMgfSwKQEAgLTM4MSw3ICszODEsNyBAQAogfTsKIAogLyogTVNJIERJR0lWT1ggbWluaSBJSSBWMy4wICovCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FmOTAxNV90YWJsZV9tc2lbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfYWY5MDE1X3RhYmxlX21zaVtdID0gewogCXsgMHgwMDFlLCBLRVlfMSB9LAogCXsgMHgwMDFmLCBLRVlfMiB9LAogCXsgMHgwMDIwLCBLRVlfMyB9LApAQCAtNDI0LDcgKzQyNCw3IEBACiB9OwogCiAvKiBNWUdJQ1RWIFU3MTggKi8KLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfYWY5MDE1X3RhYmxlX215Z2ljdHZbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfYWY5MDE1X3RhYmxlX215Z2ljdHZbXSA9IHsKIAl7IDB4MDAzZCwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LAogCQkJCQkgIC8qIFRWIC8gQVYgKi8KIAl7IDB4MDU0NSwgS0VZX1BPV0VSIH0sCkBAIC01NTAsNyArNTUwLDcgQEAKIH07CiAKIC8qIEF2ZXJNZWRpYSBWb2xhciBYICovCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FmOTAxNV90YWJsZV9hdmVybWVkaWFbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfYWY5MDE1X3RhYmxlX2F2ZXJtZWRpYVtdID0gewogCXsgMHgwNTNkLCBLRVlfUFJPRzEgfSwgICAgICAgLyogU09VUkNFICovCiAJeyAweDA1MTIsIEtFWV9QT1dFUiB9LCAgICAgICAvKiBQT1dFUiAqLwogCXsgMHgwNTFlLCBLRVlfMSB9LCAgICAgICAgICAgLyogMSAqLwpAQCAtNjU2LDcgKzY1Niw3IEBACiB9OwogCiAvKiBEaWdpdHRyYWRlIERWQi1UIFVTQiBTdGljayAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfZGlnaXR0cmFkZVtdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfZGlnaXR0cmFkZVtdID0gewogCXsgMHgwMTBmLCBLRVlfTEFTVCB9LAkvKiBSRVRVUk4gKi8KIAl7IDB4MDUxNywgS0VZX1RFWFQgfSwJLyogVEVMRVRFWFQgKi8KIAl7IDB4MDEwOCwgS0VZX0VQRyB9LAkvKiBFUEcgKi8KQEAgLTcxOSw3ICs3MTksNyBAQAogfTsKIAogLyogVFJFS1NUT1IgRFZCLVQgVVNCIFN0aWNrICovCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FmOTAxNV90YWJsZV90cmVrc3RvcltdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19hZjkwMTVfdGFibGVfdHJla3N0b3JbXSA9IHsKIAl7IDB4MDcwNCwgS0VZX0FHQUlOIH0sCQkvKiBIb21lICovCiAJeyAweDA3MDUsIEtFWV9NVVRFIH0sCQkvKiBNdXRlICovCiAJeyAweDA3MDYsIEtFWV9VUCB9LAkJCS8qIFVwICovCkBAIC03ODIsNyArNzgyLDcgQEAKIH07CiAKIC8qIE1TSSBESUdJVk9YIG1pbmkgSUlJICovCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FmOTAxNV90YWJsZV9tc2lfZGlnaXZveF9paWlbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfYWY5MDE1X3RhYmxlX21zaV9kaWdpdm94X2lpaVtdID0gewogCXsgMHgwNzEzLCBLRVlfUE9XRVIgfSwgICAgICAgLyogW3JlZCBwb3dlciBidXR0b25dICovCiAJeyAweDA3M2IsIEtFWV9WSURFTyB9LCAgICAgICAvKiBTb3VyY2UgKi8KIAl7IDB4MDczZSwgS0VZX1pPT00gfSwgICAgICAgIC8qIFpvb20gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCmluZGV4IGZhY2ExYWQuLjQ2ODUyNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiBzdGF0aWMgaW50IGFueXNlZV9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCiB7CiAJdTggYnVmW10gPSB7Q01EX0dFVF9JUl9DT0RFfTsKLQlzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleW1hcCA9IGQtPnByb3BzLnJjX2tleV9tYXA7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcDsKIAl1OCBpcmNvZGVbMl07CiAJaW50IGksIHJldDsKIApAQCAtMzg4LDEwICszODgsMTAgQEAKIAkqZXZlbnQgPSAwOwogCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKIAotCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplOyBpKyspIHsKIAkJaWYgKHJjNV9jdXN0b20oJmtleW1hcFtpXSkgPT0gaXJjb2RlWzBdICYmCiAJCSAgICByYzVfZGF0YSgma2V5bWFwW2ldKSA9PSBpcmNvZGVbMV0pIHsKLQkJCSpldmVudCA9IGtleW1hcFtpXS5ldmVudDsKKwkJCSpldmVudCA9IGtleW1hcFtpXS5rZXljb2RlOwogCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM5OSw3ICszOTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2FueXNlZV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19hbnlzZWVfdGFibGVbXSA9IHsKIAl7IDB4MDEwMCwgS0VZXzAgfSwKIAl7IDB4MDEwMSwgS0VZXzEgfSwKIAl7IDB4MDEwMiwgS0VZXzIgfSwKQEAgLTQ2Myw2ICs0NjMsMTEgQEAKIAlpZiAoaW50Zi0+bnVtX2FsdHNldHRpbmcgPCAxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qCisJICogQW55c2VlIGlzIGFsd2F5cyB3YXJtIChpdHMgVVNCLWJyaWRnZSwgQ3lwcmVzcyBGWDIsIHVwbG9hZHMKKwkgKiBmaXJtd2FyZSBmcm9tIGVlcHJvbSkuICBJZiBkdmJfdXNiX2RldmljZV9pbml0KCkgc3VjY2VlZHMgdGhhdAorCSAqIG1lYW5zIGQgaXMgYSB2YWxpZCBwb2ludGVyLgorCSAqLwogCXJldCA9IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmFueXNlZV9wcm9wZXJ0aWVzLCBUSElTX01PRFVMRSwgJmQsCiAJCWFkYXB0ZXJfbnIpOwogCWlmIChyZXQpCkBAIC00NzksMTAgKzQ4NCw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChkKQotCQlyZXQgPSBhbnlzZWVfaW5pdChkKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFueXNlZV9pbml0KGQpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYW55c2VlX3RhYmxlW10gPSB7CkBAIC01MTgsMTAgKzUyMCwxMiBAQAogCQl9CiAJfSwKIAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfYW55c2VlX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19hbnlzZWVfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gYW55c2VlX3JjX3F1ZXJ5LAotCS5yY19pbnRlcnZhbCAgICAgID0gMjAwLCAgLyogd2luZG93cyBkcml2ZXIgdXNlcyA1MDBtcyAqLworCS5yYy5sZWdhY3kgPSB7CisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfYW55c2VlX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfYW55c2VlX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhbnlzZWVfcmNfcXVlcnksCisJCS5yY19pbnRlcnZhbCAgICAgID0gMjAwLCAgLyogd2luZG93cyBkcml2ZXIgdXNlcyA1MDBtcyAqLworCX0sCiAKIAkuaTJjX2FsZ28gICAgICAgICA9ICZhbnlzZWVfaTJjX2FsZ28sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXo2MDI3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F6NjAyNy5jCmluZGV4IDY2ODFhYzEuLjYyYzU4MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXo2MDI3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hejYwMjcuYwpAQCAtMzg2LDcgKzM4Niw3IEBACiB9CiAKIC8qIGtleXMgZm9yIHRoZSBlbmNsb3NlZCByZW1vdGUgY29udHJvbCAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19hejYwMjdfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfYXo2MDI3X3RhYmxlW10gPSB7CiAJeyAweDAxLCBLRVlfMSB9LAogCXsgMHgwMiwgS0VZXzIgfSwKIH07CkBAIC0xMTI1LDEwICsxMTI1LDEzIEBACiAJLnBvd2VyX2N0cmwgICAgICAgPSBhejYwMjdfcG93ZXJfY3RybCwKIAkucmVhZF9tYWNfYWRkcmVzcyA9IGF6NjAyN19yZWFkX21hY19hZGRyLAogICovCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19hejYwMjdfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2F6NjAyN190YWJsZSksCi0JLnJjX2ludGVydmFsICAgICAgPSA0MDAsCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBhejYwMjdfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19hejYwMjdfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19hejYwMjdfdGFibGUpLAorCQkucmNfaW50ZXJ2YWwgICAgICA9IDQwMCwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhejYwMjdfcmNfcXVlcnksCisJfSwKKwogCS5pMmNfYWxnbyAgICAgICAgID0gJmF6NjAyN19pMmNfYWxnbywKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gNSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYwppbmRleCA1YTljMTRiLi40ZjVhYTgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYwpAQCAtODQsNyArODQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2NpbmVyZ3l0Ml90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19jaW5lcmd5dDJfdGFibGVbXSA9IHsKIAl7IDB4MDQwMSwgS0VZX1BPV0VSIH0sCiAJeyAweDA0MDIsIEtFWV8xIH0sCiAJeyAweDA0MDMsIEtFWV8yIH0sCkBAIC0yMTcsMTAgKzIxNywxMiBAQAogCiAJLnBvd2VyX2N0cmwgICAgICAgPSBjaW5lcmd5dDJfcG93ZXJfY3RybCwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gNTAsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19jaW5lcmd5dDJfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2NpbmVyZ3l0Ml90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBjaW5lcmd5dDJfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSA1MCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19jaW5lcmd5dDJfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19jaW5lcmd5dDJfdGFibGUpLAorCQkucmNfcXVlcnkgICAgICAgICA9IGNpbmVyZ3l0Ml9yY19xdWVyeSwKKwl9LAogCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCmluZGV4IDExZTllODUuLmNkOWYzNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKQEAgLTM4NSw3ICszODUsNyBAQAogCiBzdGF0aWMgaW50IGN4dXNiX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTMyICpldmVudCwgaW50ICpzdGF0ZSkKIHsKLQlzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleW1hcCA9IGQtPnByb3BzLnJjX2tleV9tYXA7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcDsKIAl1OCBpcmNvZGVbNF07CiAJaW50IGk7CiAKQEAgLTM5NCwxMCArMzk0LDEwIEBACiAJKmV2ZW50ID0gMDsKIAkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmNfa2V5X21hcF9zaXplOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZTsgaSsrKSB7CiAJCWlmIChyYzVfY3VzdG9tKCZrZXltYXBbaV0pID09IGlyY29kZVsyXSAmJgogCQkgICAgcmM1X2RhdGEoJmtleW1hcFtpXSkgPT0gaXJjb2RlWzNdKSB7Ci0JCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CisJCQkqZXZlbnQgPSBrZXltYXBbaV0ua2V5Y29kZTsKIAkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKIAogCQkJcmV0dXJuIDA7CkBAIC00MTAsNyArNDEwLDcgQEAKIHN0YXRpYyBpbnQgY3h1c2JfYmx1ZWJpcmQyX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTMyICpldmVudCwKIAkJCQkgICAgaW50ICpzdGF0ZSkKIHsKLQlzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleW1hcCA9IGQtPnByb3BzLnJjX2tleV9tYXA7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcDsKIAl1OCBpcmNvZGVbNF07CiAJaW50IGk7CiAJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NmIsIC5mbGFncyA9IEkyQ19NX1JELApAQCAtNDIyLDEwICs0MjIsMTAgQEAKIAlpZiAoY3h1c2JfaTJjX3hmZXIoJmQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplOyBpKyspIHsKIAkJaWYgKHJjNV9jdXN0b20oJmtleW1hcFtpXSkgPT0gaXJjb2RlWzFdICYmCiAJCSAgICByYzVfZGF0YSgma2V5bWFwW2ldKSA9PSBpcmNvZGVbMl0pIHsKLQkJCSpldmVudCA9IGtleW1hcFtpXS5ldmVudDsKKwkJCSpldmVudCA9IGtleW1hcFtpXS5rZXljb2RlOwogCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwogCiAJCQlyZXR1cm4gMDsKQEAgLTQzOCw3ICs0MzgsNyBAQAogc3RhdGljIGludCBjeHVzYl9kNjgwX2RtYl9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsCiAJCWludCAqc3RhdGUpCiB7Ci0Jc3RydWN0IGR2Yl91c2JfcmNfa2V5ICprZXltYXAgPSBkLT5wcm9wcy5yY19rZXlfbWFwOworCXN0cnVjdCBpcl9zY2FuY29kZSAqa2V5bWFwID0gZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXA7CiAJdTggaXJjb2RlWzJdOwogCWludCBpOwogCkBAIC00NDgsMTAgKzQ0OCwxMCBAQAogCWlmIChjeHVzYl9jdHJsX21zZyhkLCAweDEwLCBOVUxMLCAwLCBpcmNvZGUsIDIpIDwgMCkKIAkJcmV0dXJuIDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmNfa2V5X21hcF9zaXplOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZTsgaSsrKSB7CiAJCWlmIChyYzVfY3VzdG9tKCZrZXltYXBbaV0pID09IGlyY29kZVswXSAmJgogCQkgICAgcmM1X2RhdGEoJmtleW1hcFtpXSkgPT0gaXJjb2RlWzFdKSB7Ci0JCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CisJCQkqZXZlbnQgPSBrZXltYXBbaV0ua2V5Y29kZTsKIAkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKIAogCQkJcmV0dXJuIDA7CkBAIC00NjEsNyArNDYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19kdmljb19tY2VfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfZHZpY29fbWNlX3RhYmxlW10gPSB7CiAJeyAweGZlMDIsIEtFWV9UViB9LAogCXsgMHhmZTBlLCBLRVlfTVAzIH0sCiAJeyAweGZlMWEsIEtFWV9EVkQgfSwKQEAgLTUwOSw3ICs1MDksNyBAQAogCXsgMHhmZTRlLCBLRVlfUE9XRVIgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGVbXSA9IHsKIAl7IDB4ZmMwMiwgS0VZX1NFVFVQIH0sICAgICAgIC8qIFByb2ZpbGUgKi8KIAl7IDB4ZmM0MywgS0VZX1BPV0VSMiB9LAogCXsgMHhmYzA2LCBLRVlfRVBHIH0sCkBAIC01NDgsNyArNTQ4LDcgQEAKIAl7IDB4ZmMwMCwgS0VZX1VOS05PV04gfSwgICAgLyogSEQgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfZDY4MF9kbWJfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfZDY4MF9kbWJfdGFibGVbXSA9IHsKIAl7IDB4MDAzOCwgS0VZX1VOS05PV04gfSwJLyogVFYvQVYgKi8KIAl7IDB4MDgwYywgS0VZX1pPT00gfSwKIAl7IDB4MDgwMCwgS0VZXzAgfSwKQEAgLTkyMyw3ICs5MjMsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCS8qIHRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgbm8gSVIgZGVjb2RlciBvbiB0aGUgSTJDIGJ1cyAqLwotCWZvciAoaSA9IDA7IGFkYXAtPmRldi0+cHJvcHMucmNfa2V5X21hcCAhPSBOVUxMICYmIGkgPCA1OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBhZGFwLT5kZXYtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwICE9IE5VTEwgJiYgaSA8IDU7IGkrKykgewogCQltc2xlZXAoMjApOwogCQlpZiAoY3h1c2JfaTJjX3hmZXIoJmFkYXAtPmRldi0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCQlnb3RvIG5vX0lSOwpAQCAtOTMxLDcgKzkzMSw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKGlyY29kZVsyXSArIGlyY29kZVszXSAhPSAweGZmKSB7CiBub19JUjoKLQkJCWFkYXAtPmRldi0+cHJvcHMucmNfa2V5X21hcCA9IE5VTEw7CisJCQlhZGFwLT5kZXYtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwID0gTlVMTDsKIAkJCWluZm8oIk5vIElSIHJlY2VpdmVyIGRldGVjdGVkIG9uIHRoaXMgZGV2aWNlLiIpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE0NTEsMTAgKzE0NTEsMTIgQEAKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAogCi0JLnJjX2ludGVydmFsICAgICAgPSAxMDAsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSksCisJCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfcmNfcXVlcnksCisJfSwKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAKQEAgLTE1MDIsMTAgKzE1MDQsMTIgQEAKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAogCi0JLnJjX2ludGVydmFsICAgICAgPSAxNTAsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19tY2VfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R2aWNvX21jZV90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBjeHVzYl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDE1MCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19tY2VfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdmljb19tY2VfdGFibGUpLAorCQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX3JjX3F1ZXJ5LAorCX0sCiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAogCkBAIC0xNTYxLDEwICsxNTY1LDEyIEBACiAKIAkuaTJjX2FsZ28gICAgICAgICA9ICZjeHVzYl9pMmNfYWxnbywKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R2aWNvX3BvcnRhYmxlX3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAorCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2R2aWNvX3BvcnRhYmxlX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUpLAorCQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX3JjX3F1ZXJ5LAorCX0sCiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKQEAgLTE2MTEsMTAgKzE2MTcsMTIgQEAKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAogCi0JLnJjX2ludGVydmFsICAgICAgPSAxMDAsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSksCisJCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfcmNfcXVlcnksCisJfSwKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAKQEAgLTE2NjAsMTAgKzE2NjgsMTIgQEAKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAKLQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKLQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2R2aWNvX21jZV90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHZpY29fbWNlX3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX2JsdWViaXJkMl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19tY2VfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdmljb19tY2VfdGFibGUpLAorCQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX2JsdWViaXJkMl9yY19xdWVyeSwKKwl9LAogCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewpAQCAtMTcwOCwxMCArMTcxOCwxMiBAQAogCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZHZpY29fcG9ydGFibGVfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R2aWNvX3BvcnRhYmxlX3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX2JsdWViaXJkMl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSwKKwkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R2aWNvX3BvcnRhYmxlX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBjeHVzYl9ibHVlYmlyZDJfcmNfcXVlcnksCisJfSwKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKIAkuZGV2aWNlcyA9IHsKQEAgLTE3NTgsMTAgKzE3NzAsMTIgQEAKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAKLQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKLQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2R2aWNvX3BvcnRhYmxlX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBjeHVzYl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kdmljb19wb3J0YWJsZV90YWJsZSwKKwkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R2aWNvX3BvcnRhYmxlX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBjeHVzYl9yY19xdWVyeSwKKwl9LAogCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewpAQCAtMTg0OSwxMCArMTg2MywxMiBAQAogCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZHZpY29fbWNlX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdmljb19tY2VfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZHZpY29fbWNlX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHZpY29fbWNlX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBjeHVzYl9yY19xdWVyeSwKKwl9LAogCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewpAQCAtMTg5NywxMCArMTkxMywxMiBAQAogCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZDY4MF9kbWJfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2Q2ODBfZG1iX3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX2Q2ODBfZG1iX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAorCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2Q2ODBfZG1iX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZDY4MF9kbWJfdGFibGUpLAorCQkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX2Q2ODBfZG1iX3JjX3F1ZXJ5LAorCX0sCiAKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCiAJLmRldmljZXMgPSB7CkBAIC0xOTQ2LDEwICsxOTY0LDEyIEBACiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAogCi0JLnJjX2ludGVydmFsICAgICAgPSAxMDAsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kNjgwX2RtYl90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZDY4MF9kbWJfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfZDY4MF9kbWJfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZDY4MF9kbWJfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kNjgwX2RtYl90YWJsZSksCisJCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfZDY4MF9kbWJfcmNfcXVlcnksCisJfSwKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKIAkuZGV2aWNlcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmgKaW5kZXggODNmYzI0YS4uYzJjOWQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmgKQEAgLTYwLDYgKzYwLDcgQEAKIGV4dGVybiBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkaWIwNzAwX2kyY19hbGdvOwogZXh0ZXJuIGludCBkaWIwNzAwX2lkZW50aWZ5X3N0YXRlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyAqcHJvcHMsCiAJCQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKipkZXNjLCBpbnQgKmNvbGQpOworZXh0ZXJuIGludCBkaWIwNzAwX2NoYW5nZV9wcm90b2NvbCh2b2lkICpwcml2LCB1NjQgaXJfdHlwZSk7CiAKIGV4dGVybiBpbnQgZGliMDcwMF9kZXZpY2VfY291bnQ7CiBleHRlcm4gaW50IGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCmluZGV4IDRmOTYxZDIuLmZlODE4MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYwpAQCAtMTMsMTAgKzEzLDYgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX2RpYjA3MDBfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLDI9ZncsND1md2RhdGEsOD1kYXRhIChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CiAKLWludCBkdmJfdXNiX2RpYjA3MDBfaXJfcHJvdG8gPSAxOwotbW9kdWxlX3BhcmFtKGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZHZiX3VzYl9kaWIwNzAwX2lyX3Byb3RvLCAic2V0IGlyIHByb3RvY29sICgwPU5FQywgMT1SQzUgKGRlZmF1bHQpLCAyPVJDNikuIik7Ci0KIHN0YXRpYyBpbnQgbmJfcGFja2V0X2J1ZmZlcl9zaXplID0gMjE7CiBtb2R1bGVfcGFyYW0obmJfcGFja2V0X2J1ZmZlcl9zaXplLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhuYl9wYWNrZXRfYnVmZmVyX3NpemUsCkBAIC01Myw3ICs0OSw3IEBACiAJaW50IHN0YXR1czsKIAogCWRlYl9kYXRhKCI+Pj4gIik7Ci0JZGVidWdfZHVtcCh0eCx0eGxlbixkZWJfZGF0YSk7CisJZGVidWdfZHVtcCh0eCwgdHhsZW4sIGRlYl9kYXRhKTsKIAogCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhkLT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZC0+dWRldiwwKSwKIAkJdHhbMF0sIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULCAwLCAwLCB0eCwgdHhsZW4sCkBAIC05OCw3ICs5NCw3IEBACiAJCWRlYl9pbmZvKCJlcCAwIHJlYWQgZXJyb3IgKHN0YXR1cyA9ICVkKVxuIixzdGF0dXMpOwogCiAJZGViX2RhdGEoIjw8PCAiKTsKLQlkZWJ1Z19kdW1wKHJ4LHJ4bGVuLGRlYl9kYXRhKTsKKwlkZWJ1Z19kdW1wKHJ4LCByeGxlbiwgZGViX2RhdGEpOwogCiAJcmV0dXJuIHN0YXR1czsgLyogbGVuZ3RoIGluIGNhc2Ugb2Ygc3VjY2VzcyAqLwogfQpAQCAtMTA2LDI4ICsxMDIsMjkgQEAKIGludCBkaWIwNzAwX3NldF9ncGlvKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgZW51bSBkaWIwN3gwX2dwaW9zIGdwaW8sIHU4IGdwaW9fZGlyLCB1OCBncGlvX3ZhbCkKIHsKIAl1OCBidWZbM10gPSB7IFJFUVVFU1RfU0VUX0dQSU8sIGdwaW8sICgoZ3Bpb19kaXIgJiAweDAxKSA8PCA3KSB8ICgoZ3Bpb192YWwgJiAweDAxKSA8PCA2KSB9OwotCXJldHVybiBkaWIwNzAwX2N0cmxfd3IoZCxidWYsMyk7CisJcmV0dXJuIGRpYjA3MDBfY3RybF93cihkLCBidWYsIHNpemVvZihidWYpKTsKIH0KIAogc3RhdGljIGludCBkaWIwNzAwX3NldF91c2JfeGZlcl9sZW4oc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MTYgbmJfdHNfcGFja2V0cykKIHsKLSAgICBzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBkLT5wcml2OwotICAgIHU4IGJbM107Ci0gICAgaW50IHJldDsKKwlzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBkLT5wcml2OworCXU4IGJbM107CisJaW50IHJldDsKIAotICAgIGlmIChzdC0+ZndfdmVyc2lvbiA+PSAweDEwMjAxKSB7Ci0JYlswXSA9IFJFUVVFU1RfU0VUX1VTQl9YRkVSX0xFTjsKLQliWzFdID0gKG5iX3RzX3BhY2tldHMgPj4gOCkmMHhmZjsKLQliWzJdID0gbmJfdHNfcGFja2V0cyAmIDB4ZmY7CisJaWYgKHN0LT5md192ZXJzaW9uID49IDB4MTAyMDEpIHsKKwkJYlswXSA9IFJFUVVFU1RfU0VUX1VTQl9YRkVSX0xFTjsKKwkJYlsxXSA9IChuYl90c19wYWNrZXRzID4+IDgpICYgMHhmZjsKKwkJYlsyXSA9IG5iX3RzX3BhY2tldHMgJiAweGZmOwogCi0JZGViX2luZm8oInNldCB0aGUgVVNCIHhmZXIgbGVuIHRvICVpIFRzIHBhY2tldFxuIiwgbmJfdHNfcGFja2V0cyk7CisJCWRlYl9pbmZvKCJzZXQgdGhlIFVTQiB4ZmVyIGxlbiB0byAlaSBUcyBwYWNrZXRcbiIsIG5iX3RzX3BhY2tldHMpOwogCi0JcmV0ID0gZGliMDcwMF9jdHJsX3dyKGQsIGIsIDMpOwotICAgIH0gZWxzZSB7Ci0JZGViX2luZm8oInRoaXMgZmlybXdhcmUgZG9lcyBub3QgYWxsb3cgdG8gY2hhbmdlIHRoZSBVU0IgeGZlciBsZW5cbiIpOwotCXJldCA9IC1FSU87Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisJCXJldCA9IGRpYjA3MDBfY3RybF93cihkLCBiLCBzaXplb2YoYikpOworCX0gZWxzZSB7CisJCWRlYl9pbmZvKCJ0aGlzIGZpcm13YXJlIGRvZXMgbm90IGFsbG93IHRvIGNoYW5nZSB0aGUgVVNCIHhmZXIgbGVuXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTc4LDcgKzE3NSw4IEBACiAJCQl2YWx1ZSA9ICgoZW5fc3RhcnQgPDwgNykgfCAoZW5fc3RvcCA8PCA2KSB8CiAJCQkJIChtc2dbaV0ubGVuICYgMHgzRikpIDw8IDggfCBpMmNfZGVzdDsKIAkJCS8qIEkyQyBjdHJsICsgRkUgYnVzOyAqLwotCQkJaW5kZXggPSAoKGdlbl9tb2RlPDw2KSYweEMwKSB8ICgoYnVzX21vZGU8PDQpJjB4MzApOworCQkJaW5kZXggPSAoKGdlbl9tb2RlIDw8IDYpICYgMHhDMCkgfAorCQkJCSgoYnVzX21vZGUgPDwgNCkgJiAweDMwKTsKIAogCQkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsCiAJCQkJCQkgdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsIDApLApAQCAtMTk4LDExICsxOTYsMTIgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIFdyaXRlIHJlcXVlc3QgKi8KIAkJCWJ1ZlswXSA9IFJFUVVFU1RfTkVXX0kyQ19XUklURTsKLQkJCWJ1ZlsxXSA9IChtc2dbaV0uYWRkciA8PCAxKTsKKwkJCWJ1ZlsxXSA9IG1zZ1tpXS5hZGRyIDw8IDE7CiAJCQlidWZbMl0gPSAoZW5fc3RhcnQgPDwgNykgfCAoZW5fc3RvcCA8PCA2KSB8CiAJCQkJKG1zZ1tpXS5sZW4gJiAweDNGKTsKIAkJCS8qIEkyQyBjdHJsICsgRkUgYnVzOyAqLwotCQkJYnVmWzNdID0gKChnZW5fbW9kZTw8NikmMHhDMCkgfCAoKGJ1c19tb2RlPDw0KSYweDMwKTsKKwkJCWJ1ZlszXSA9ICgoZ2VuX21vZGUgPDwgNikgJiAweEMwKSB8CisJCQkJICgoYnVzX21vZGUgPDwgNCkgJiAweDMwKTsKIAkJCS8qIFRoZSBBY3R1YWwgaTJjIHBheWxvYWQgKi8KIAkJCW1lbWNweSgmYnVmWzRdLCBtc2dbaV0uYnVmLCBtc2dbaV0ubGVuKTsKIApAQCAtMjQwLDcgKzIzOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJLyogZmlsbCBpbiB0aGUgYWRkcmVzcyAqLwotCQlidWZbMV0gPSAobXNnW2ldLmFkZHIgPDwgMSk7CisJCWJ1ZlsxXSA9IG1zZ1tpXS5hZGRyIDw8IDE7CiAJCS8qIGZpbGwgdGhlIGJ1ZmZlciAqLwogCQltZW1jcHkoJmJ1ZlsyXSwgbXNnW2ldLmJ1ZiwgbXNnW2ldLmxlbik7CiAKQEAgLTM2OCw3ICszNjcsOCBAQAogCXU4IGJ1ZlsyNjBdOwogCiAJd2hpbGUgKChyZXQgPSBkdmJfdXNiX2dldF9oZXhsaW5lKGZ3LCAmaHgsICZwb3MpKSA+IDApIHsKLQkJZGViX2Z3ZGF0YSgid3JpdGluZyB0byBhZGRyZXNzIDB4JTA4eCAoYnVmZmVyOiAweCUwMnggJTAyeClcbiIsaHguYWRkciwgaHgubGVuLCBoeC5jaGspOworCQlkZWJfZndkYXRhKCJ3cml0aW5nIHRvIGFkZHJlc3MgMHglMDh4IChidWZmZXI6IDB4JTAyeCAlMDJ4KVxuIiwKKwkJCQloeC5hZGRyLCBoeC5sZW4sIGh4LmNoayk7CiAKIAkJYnVmWzBdID0gaHgubGVuOwogCQlidWZbMV0gPSAoaHguYWRkciA+PiA4KSAmIDB4ZmY7CkBAIC00MDgsMTYgKzQwOCwxNiBAQAogCQkJCSAgUkVRVUVTVF9HRVRfVkVSU0lPTiwKIAkJCQkgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sIDAsIDAsCiAJCQkJICBiLCBzaXplb2YoYiksIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKLQlmd192ZXJzaW9uID0gKGJbOF0gPDwgMjQpICB8IChiWzldIDw8IDE2KSAgfCAoYlsxMF0gPDwgOCkgfCBiWzExXTsKKwlmd192ZXJzaW9uID0gKGJbOF0gPDwgMjQpIHwgKGJbOV0gPDwgMTYpIHwgKGJbMTBdIDw8IDgpIHwgYlsxMV07CiAKIAkvKiBzZXQgdGhlIGJ1ZmZlciBzaXplIC0gRFZCLVVTQiBpcyBhbGxvY2F0aW5nIFVSQiBidWZmZXJzCiAJICogb25seSBhZnRlciB0aGUgZmlyd21hcmUgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZGliMDcwMF9kZXZpY2VfY291bnQ7IGkrKykgewogCQlmb3IgKGFkYXBfbnVtID0gMDsgYWRhcF9udW0gPCBkaWIwNzAwX2RldmljZXNbaV0ubnVtX2FkYXB0ZXJzOwogCQkJCWFkYXBfbnVtKyspIHsKLQkJCWlmIChmd192ZXJzaW9uID49IDB4MTAyMDEpCisJCQlpZiAoZndfdmVyc2lvbiA+PSAweDEwMjAxKSB7CiAJCQkJZGliMDcwMF9kZXZpY2VzW2ldLmFkYXB0ZXJbYWRhcF9udW1dLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZSA9IDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemU7Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJLyogZm9yIGZ3IHZlcnNpb24gb2xkZXIgdGhhbiAxLjIwLjEsCiAJCQkJICogdGhlIGJ1ZmZlcnNpemUgaGFzIHRvIGJlIG4gdGltZXMgNTEyICovCiAJCQkJZGliMDcwMF9kZXZpY2VzW2ldLmFkYXB0ZXJbYWRhcF9udW1dLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZSA9ICgoMTg4Km5iX3BhY2tldF9idWZmZXJfc2l6ZSsxODgvMikvNTEyKSo1MTI7CkBAIC00NTMsNyArNDUzLDcgQEAKIAlpZiAoc3QtPmRpc2FibGVfc3RyZWFtaW5nX21hc3Rlcl9tb2RlID09IDEpCiAJCWJbMl0gPSAweDAwOwogCWVsc2UKLQkJYlsyXSA9ICgweDAxIDw8IDQpOyAvKiBNYXN0ZXIgbW9kZSAqLworCQliWzJdID0gMHgwMSA8PCA0OyAvKiBNYXN0ZXIgbW9kZSAqLwogCiAJYlszXSA9IDB4MDA7CiAKQEAgLTQ2NiwxMSArNDY2LDQ0IEBACiAKIAliWzJdIHw9IHN0LT5jaGFubmVsX3N0YXRlOwogCi0JZGViX2luZm8oImRhdGEgZm9yIHN0cmVhbWluZzogJXggJXhcbiIsYlsxXSxiWzJdKTsKKwlkZWJfaW5mbygiZGF0YSBmb3Igc3RyZWFtaW5nOiAleCAleFxuIiwgYlsxXSwgYlsyXSk7CiAKIAlyZXR1cm4gZGliMDcwMF9jdHJsX3dyKGFkYXAtPmRldiwgYiwgNCk7CiB9CiAKK2ludCBkaWIwNzAwX2NoYW5nZV9wcm90b2NvbCh2b2lkICpwcml2LCB1NjQgaXJfdHlwZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBwcml2OworCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7CisJdTggcmNfc2V0dXBbM10gPSB7IFJFUVVFU1RfU0VUX1JDLCAwLCAwIH07CisJaW50IG5ld19wcm90bywgcmV0OworCisJLyogU2V0IHRoZSBJUiBtb2RlICovCisJaWYgKGlyX3R5cGUgPT0gSVJfVFlQRV9SQzUpCisJCW5ld19wcm90byA9IDE7CisJZWxzZSBpZiAoaXJfdHlwZSA9PSBJUl9UWVBFX05FQykKKwkJbmV3X3Byb3RvID0gMDsKKwllbHNlIGlmIChpcl90eXBlID09IElSX1RZUEVfUkM2KSB7CisJCWlmIChzdC0+ZndfdmVyc2lvbiA8IDB4MTAyMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQluZXdfcHJvdG8gPSAyOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjX3NldHVwWzFdID0gbmV3X3Byb3RvOworCisJcmV0ID0gZGliMDcwMF9jdHJsX3dyKGQsIHJjX3NldHVwLCBzaXplb2YocmNfc2V0dXApKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoImlyIHByb3RvY29sIHNldHVwIGZhaWxlZCIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWQtPnByb3BzLnJjLmNvcmUucHJvdG9jb2wgPSBpcl90eXBlOworCisJcmV0dXJuIHJldDsKK30KKwogLyogTnVtYmVyIG9mIGtleXByZXNzZXMgdG8gaWdub3JlIGJlZm9yZSBzdGFydCByZXBlYXRpbmcgKi8KICNkZWZpbmUgUkNfUkVQRUFUX0RFTEFZX1YxXzIwIDEwCiAKQEAgLTQ3OCw3ICs1MTEsMTMgQEAKIHN0cnVjdCBkaWIwNzAwX3JjX3Jlc3BvbnNlIHsKIAl1OCByZXBvcnRfaWQ7CiAJdTggZGF0YV9zdGF0ZTsKLQl1MTYgc3lzdGVtOworCXVuaW9uIHsKKwkJdTE2IHN5c3RlbTE2OworCQlzdHJ1Y3QgeworCQkJdTggc3lzdGVtOworCQkJdTggbm90X3N5c3RlbTsKKwkJfTsKKwl9OwogCXU4IGRhdGE7CiAJdTggbm90X2RhdGE7CiB9OwpAQCAtNDg3LDE0ICs1MjYsMTAgQEAKIHN0YXRpYyB2b2lkIGRpYjA3MDBfcmNfdXJiX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqcHVyYikKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBwdXJiLT5jb250ZXh0OwotCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqa2V5bWFwOwogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdDsKLQlzdHJ1Y3QgZGliMDcwMF9yY19yZXNwb25zZSBwb2xsX3JlcGx5OwotCXU4ICpidWY7Ci0JaW50IGZvdW5kID0gMDsKLQl1MzIgZXZlbnQ7Ci0JaW50IHN0YXRlOwotCWludCBpOworCXN0cnVjdCBkaWIwNzAwX3JjX3Jlc3BvbnNlICpwb2xsX3JlcGx5OworCXUzMiB1bmluaXRpYWxpemVkX3ZhcihrZXljb2RlKTsKKwl1OCB0b2dnbGU7CiAKIAlkZWJfaW5mbygiJXMoKVxuIiwgX19mdW5jX18pOwogCWlmIChkID09IE5VTEwpCkBAIC01MDYsOSArNTQxLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWtleW1hcCA9IGQtPnByb3BzLnJjX2tleV9tYXA7CiAJc3QgPSBkLT5wcml2OwotCWJ1ZiA9ICh1OCAqKXB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlwb2xsX3JlcGx5ID0gcHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCiAJaWYgKHB1cmItPnN0YXR1cyA8IDApIHsKIAkJZGViX2luZm8oImRpc2NvbnRpbnVpbmcgcG9sbGluZ1xuIik7CkBAIC01MjEsMTA0ICs1NTUsNTIgQEAKIAkJZ290byByZXN1Ym1pdDsKIAl9CiAKLQkvKiBTZXQgaW5pdGlhbCByZXN1bHRzIGluIGNhc2Ugd2UgZXhpdCB0aGUgZnVuY3Rpb24gZWFybHkgKi8KLQlldmVudCA9IDA7Ci0Jc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CisJZGViX2RhdGEoIklSIElEID0gJTAyWCBzdGF0ZSA9ICUwMlggU3lzdGVtID0gJTAyWCAlMDJYIENtZCA9ICUwMlggJTAyWCAobGVuICVkKVxuIiwKKwkJIHBvbGxfcmVwbHktPnJlcG9ydF9pZCwgcG9sbF9yZXBseS0+ZGF0YV9zdGF0ZSwKKwkJIHBvbGxfcmVwbHktPnN5c3RlbSwgcG9sbF9yZXBseS0+bm90X3N5c3RlbSwKKwkJIHBvbGxfcmVwbHktPmRhdGEsIHBvbGxfcmVwbHktPm5vdF9kYXRhLAorCQkgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKLQlkZWJfZGF0YSgiSVIgcmF3ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYIChsZW4gJWQpXG4iLCBidWZbMF0sCi0JCSBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLCBidWZbNF0sIGJ1Zls1XSwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0KLQlzd2l0Y2ggKGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bykgewotCWNhc2UgMDoKLQkJLyogTkVDIFByb3RvY29sICovCi0JCXBvbGxfcmVwbHkucmVwb3J0X2lkICA9IDA7Ci0JCXBvbGxfcmVwbHkuZGF0YV9zdGF0ZSA9IDE7Ci0JCXBvbGxfcmVwbHkuc3lzdGVtICAgICA9IGJ1ZlsyXTsKLQkJcG9sbF9yZXBseS5kYXRhICAgICAgID0gYnVmWzRdOwotCQlwb2xsX3JlcGx5Lm5vdF9kYXRhICAgPSBidWZbNV07CisJc3dpdGNoIChkLT5wcm9wcy5yYy5jb3JlLnByb3RvY29sKSB7CisJY2FzZSBJUl9UWVBFX05FQzoKKwkJdG9nZ2xlID0gMDsKIAogCQkvKiBORUMgcHJvdG9jb2wgc2VuZHMgcmVwZWF0IGNvZGUgYXMgMCAwIDAgRkYgKi8KLQkJaWYgKChwb2xsX3JlcGx5LnN5c3RlbSA9PSAweDAwKSAmJiAocG9sbF9yZXBseS5kYXRhID09IDB4MDApCi0JCSAgICAmJiAocG9sbF9yZXBseS5ub3RfZGF0YSA9PSAweGZmKSkgewotCQkJcG9sbF9yZXBseS5kYXRhX3N0YXRlID0gMjsKKwkJaWYgKChwb2xsX3JlcGx5LT5zeXN0ZW0gPT0gMHgwMCkgJiYgKHBvbGxfcmVwbHktPmRhdGEgPT0gMHgwMCkKKwkJICAgICYmIChwb2xsX3JlcGx5LT5ub3RfZGF0YSA9PSAweGZmKSkgeworCQkJcG9sbF9yZXBseS0+ZGF0YV9zdGF0ZSA9IDI7CiAJCQlicmVhazsKIAkJfQorCisJCWlmICgocG9sbF9yZXBseS0+c3lzdGVtIF4gcG9sbF9yZXBseS0+bm90X3N5c3RlbSkgIT0gMHhmZikgeworCQkJZGViX2RhdGEoIk5FQyBleHRlbmRlZCBwcm90b2NvbFxuIik7CisJCQkvKiBORUMgZXh0ZW5kZWQgY29kZSAtIDI0IGJpdHMgKi8KKwkJCWtleWNvZGUgPSBwb2xsX3JlcGx5LT5zeXN0ZW0xNiA8PCA4IHwgcG9sbF9yZXBseS0+ZGF0YTsKKwkJfSBlbHNlIHsKKwkJCWRlYl9kYXRhKCJORUMgbm9ybWFsIHByb3RvY29sXG4iKTsKKwkJCS8qIG5vcm1hbCBORUMgY29kZSAtIDE2IGJpdHMgKi8KKwkJCWtleWNvZGUgPSBwb2xsX3JlcGx5LT5zeXN0ZW0gPDwgOCB8IHBvbGxfcmVwbHktPmRhdGE7CisJCX0KKwogCQlicmVhazsKIAlkZWZhdWx0OgorCQlkZWJfZGF0YSgiUkM1IHByb3RvY29sXG4iKTsKIAkJLyogUkM1IFByb3RvY29sICovCi0JCXBvbGxfcmVwbHkucmVwb3J0X2lkICA9IGJ1ZlswXTsKLQkJcG9sbF9yZXBseS5kYXRhX3N0YXRlID0gYnVmWzFdOwotCQlwb2xsX3JlcGx5LnN5c3RlbSAgICAgPSAoYnVmWzJdIDw8IDgpIHwgYnVmWzNdOwotCQlwb2xsX3JlcGx5LmRhdGEgICAgICAgPSBidWZbNF07Ci0JCXBvbGxfcmVwbHkubm90X2RhdGEgICA9IGJ1Zls1XTsKKwkJdG9nZ2xlID0gcG9sbF9yZXBseS0+cmVwb3J0X2lkOworCQlrZXljb2RlID0gcG9sbF9yZXBseS0+c3lzdGVtMTYgPDwgOCB8IHBvbGxfcmVwbHktPmRhdGE7CisKIAkJYnJlYWs7CiAJfQogCi0JaWYgKChwb2xsX3JlcGx5LmRhdGEgKyBwb2xsX3JlcGx5Lm5vdF9kYXRhKSAhPSAweGZmKSB7CisJaWYgKChwb2xsX3JlcGx5LT5kYXRhICsgcG9sbF9yZXBseS0+bm90X2RhdGEpICE9IDB4ZmYpIHsKIAkJLyogS2V5IGZhaWxlZCBpbnRlZ3JpdHkgY2hlY2sgKi8KIAkJZXJyKCJrZXkgZmFpbGVkIGludGVncml0eSBjaGVjazogJTA0eCAlMDJ4ICUwMngiLAotCQkgICAgcG9sbF9yZXBseS5zeXN0ZW0sCi0JCSAgICBwb2xsX3JlcGx5LmRhdGEsIHBvbGxfcmVwbHkubm90X2RhdGEpOworCQkgICAgcG9sbF9yZXBseS0+c3lzdGVtLAorCQkgICAgcG9sbF9yZXBseS0+ZGF0YSwgcG9sbF9yZXBseS0+bm90X2RhdGEpOwogCQlnb3RvIHJlc3VibWl0OwogCX0KIAotCWRlYl9kYXRhKCJyaWQ9JTAyeCBkcz0lMDJ4IHNtPSUwNHggZD0lMDJ4IG5kPSUwMnhcbiIsCi0JCSBwb2xsX3JlcGx5LnJlcG9ydF9pZCwgcG9sbF9yZXBseS5kYXRhX3N0YXRlLAotCQkgcG9sbF9yZXBseS5zeXN0ZW0sIHBvbGxfcmVwbHkuZGF0YSwgcG9sbF9yZXBseS5ub3RfZGF0YSk7Ci0KLQkvKiBGaW5kIHRoZSBrZXkgaW4gdGhlIG1hcCAqLwotCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgewotCQlpZiAocmM1X2N1c3RvbSgma2V5bWFwW2ldKSA9PSAocG9sbF9yZXBseS5zeXN0ZW0gJiAweGZmKSAmJgotCQkgICAgcmM1X2RhdGEoJmtleW1hcFtpXSkgPT0gcG9sbF9yZXBseS5kYXRhKSB7Ci0JCQlldmVudCA9IGtleW1hcFtpXS5ldmVudDsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGZvdW5kID09IDApIHsKLQkJZXJyKCJVbmtub3duIHJlbW90ZSBjb250cm9sbGVyIGtleTogJTA0eCAlMDJ4ICUwMngiLAotCQkgICAgcG9sbF9yZXBseS5zeXN0ZW0sIHBvbGxfcmVwbHkuZGF0YSwgcG9sbF9yZXBseS5ub3RfZGF0YSk7Ci0JCWQtPmxhc3RfZXZlbnQgPSAwOwotCQlnb3RvIHJlc3VibWl0OwotCX0KLQotCWlmIChwb2xsX3JlcGx5LmRhdGFfc3RhdGUgPT0gMSkgewotCQkvKiBOZXcga2V5IGhpdCAqLwotCQlzdC0+cmNfY291bnRlciA9IDA7Ci0JCWV2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OwotCQlzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJZC0+bGFzdF9ldmVudCA9IGtleW1hcFtpXS5ldmVudDsKLQl9IGVsc2UgaWYgKHBvbGxfcmVwbHkuZGF0YV9zdGF0ZSA9PSAyKSB7Ci0JCS8qIEtleSByZXBlYXRlZCAqLwotCQlzdC0+cmNfY291bnRlcisrOwotCi0JCS8qIHByZXZlbnRzIHVud2FudGVkIGRvdWJsZSBoaXRzICovCi0JCWlmIChzdC0+cmNfY291bnRlciA+IFJDX1JFUEVBVF9ERUxBWV9WMV8yMCkgewotCQkJZXZlbnQgPSBkLT5sYXN0X2V2ZW50OwotCQkJc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7Ci0JCQlzdC0+cmNfY291bnRlciA9IFJDX1JFUEVBVF9ERUxBWV9WMV8yMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycigiVW5rbm93biBkYXRhIHN0YXRlIFslZF0iLCBwb2xsX3JlcGx5LmRhdGFfc3RhdGUpOwotCX0KLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIFJFTU9URV9OT19LRVlfUFJFU1NFRDoKLQkJYnJlYWs7Ci0JY2FzZSBSRU1PVEVfS0VZX1BSRVNTRUQ6Ci0JCWRlYl9pbmZvKCJrZXkgcHJlc3NlZFxuIik7Ci0JCWQtPmxhc3RfZXZlbnQgPSBldmVudDsKLQljYXNlIFJFTU9URV9LRVlfUkVQRUFUOgotCQlkZWJfaW5mbygia2V5IHJlcGVhdGVkXG4iKTsKLQkJaW5wdXRfZXZlbnQoZC0+cmNfaW5wdXRfZGV2LCBFVl9LRVksIGV2ZW50LCAxKTsKLQkJaW5wdXRfc3luYyhkLT5yY19pbnB1dF9kZXYpOwotCQlpbnB1dF9ldmVudChkLT5yY19pbnB1dF9kZXYsIEVWX0tFWSwgZC0+bGFzdF9ldmVudCwgMCk7Ci0JCWlucHV0X3N5bmMoZC0+cmNfaW5wdXRfZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCWlyX2tleWRvd24oZC0+cmNfaW5wdXRfZGV2LCBrZXljb2RlLCB0b2dnbGUpOwogCiByZXN1Ym1pdDoKIAkvKiBDbGVhbiB0aGUgYnVmZmVyIGJlZm9yZSB3ZSByZXF1ZXVlICovCkBAIC02MzEsMjEgKzYxMywxMCBAQAogaW50IGRpYjA3MDBfcmNfc2V0dXAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7Ci0JdTggcmNfc2V0dXBbM10gPSB7UkVRVUVTVF9TRVRfUkMsIGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bywgMH07CiAJc3RydWN0IHVyYiAqcHVyYjsKIAlpbnQgcmV0OwotCWludCBpOwogCi0JaWYgKGQtPnByb3BzLnJjX2tleV9tYXAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBTZXQgdGhlIElSIG1vZGUgKi8KLQlpID0gZGliMDcwMF9jdHJsX3dyKGQsIHJjX3NldHVwLCAzKTsKLQlpZiAoaTwwKSB7Ci0JCWVycigiaXIgcHJvdG9jb2wgc2V0dXAgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KKwkvKiBQb2xsLWJhc2VkLiBEb24ndCBpbml0aWFsaXplIGJ1bGsgbW9kZSAqLwogCWlmIChzdC0+ZndfdmVyc2lvbiA8IDB4MTAyMDApCiAJCXJldHVybiAwOwogCkBAIC02NTMsMTQgKzYyNCwxNCBAQAogCXB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmIChwdXJiID09IE5VTEwpIHsKIAkJZXJyKCJyYyB1c2IgYWxsb2MgdXJiIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhSQ19NU0dfU0laRV9WMV8yMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CiAJCWVycigicmMga3phbGxvYyBmYWlsZWRcbiIpOwogCQl1c2JfZnJlZV91cmIocHVyYik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcHVyYi0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwpAQCAtNjY5LDEyICs2NDAsMTAgQEAKIAkJCSAgZGliMDcwMF9yY191cmJfY29tcGxldGlvbiwgZCk7CiAKIAlyZXQgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0ICE9IDApIHsKKwlpZiAocmV0KQogCQllcnIoInJjIHN1Ym1pdCB1cmIgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDcwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKQEAgLTY5OCw2ICs2NjcsMTUgQEAKIAkJCXN0LT5md192ZXJzaW9uID0gZndfdmVyc2lvbjsKIAkJCXN0LT5uYl9wYWNrZXRfYnVmZmVyX3NpemUgPSAodTMyKW5iX3BhY2tldF9idWZmZXJfc2l6ZTsKIAorCQkJLyogRGlzYWJsZSBwb2xsaW5nIG1vZGUgb24gbmV3ZXIgZmlybXdhcmVzICovCisJCQlpZiAoc3QtPmZ3X3ZlcnNpb24gPj0gMHgxMDIwMCkKKwkJCQlkZXYtPnByb3BzLnJjLmNvcmUuYnVsa19tb2RlID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlkZXYtPnByb3BzLnJjLmNvcmUuYnVsa19tb2RlID0gZmFsc2U7CisKKwkJCS8qIE5lZWQgYSBoaWdoZXIgZGVsYXksIHRvIGF2b2lkIHdyb25nIHJlcGVhdCAqLworCQkJZGV2LT5yY19pbnB1dF9kZXYtPnJlcFtSRVBfREVMQVldID0gNTAwOworCiAJCQlkaWIwNzAwX3JjX3NldHVwKGRldik7CiAKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKaW5kZXggODAwODAwYS4uZjYzNGQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCkBAIC00NzMsMTYgKzQ3MywxOSBAQAogLyogTnVtYmVyIG9mIGtleXByZXNzZXMgdG8gaWdub3JlIGJlZm9yZSBzdGFydCByZXBlYXRpbmcgKi8KICNkZWZpbmUgUkNfUkVQRUFUX0RFTEFZIDYKIAotc3RhdGljIGludCBkaWIwNzAwX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTMyICpldmVudCwgaW50ICpzdGF0ZSkKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSB3aGVuIGZpcm13YXJlIGlzIDwgMS4yMCB2ZXJzaW9uLiBOZXdlcgorICogZmlybXdhcmVzIHVzZSBidWxrIG1vZGUsIHdpdGggZnVuY3Rpb25zIGltcGxlbWVudGVkIGF0IGRpYjA3MDBfY29yZSwKKyAqIGF0IGRpYjA3MDBfcmNfdXJiX2NvbXBsZXRpb24oKQorICovCitzdGF0aWMgaW50IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAl1OCBrZXlbNF07CisJdTMyIGtleWNvZGU7CisJdTggdG9nZ2xlOwogCWludCBpOwotCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqa2V5bWFwID0gZC0+cHJvcHMucmNfa2V5X21hcDsKIAlzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBkLT5wcml2OwogCi0JKmV2ZW50ID0gMDsKLQkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7Ci0KIAlpZiAoc3QtPmZ3X3ZlcnNpb24gPj0gMHgxMDIwMCkgewogCQkvKiBGb3IgMS4yMCBmaXJtd2FyZSAsIFdlIG5lZWQgdG8ga2VlcCB0aGUgUkMgcG9sbGluZwogCQkgICBjYWxsYmFjayBzbyB3ZSBjYW4gcmV1c2UgdGhlIGlucHV0IGRldmljZSBzZXR1cCBpbgpAQCAtNDkxLDM0OCArNDk0LDQ1IEBACiAJCXJldHVybiAwOwogCX0KIAotCWk9ZGliMDcwMF9jdHJsX3JkKGQscmNfcmVxdWVzdCwyLGtleSw0KTsKLQlpZiAoaTw9MCkgeworCWkgPSBkaWIwNzAwX2N0cmxfcmQoZCwgcmNfcmVxdWVzdCwgMiwga2V5LCA0KTsKKwlpZiAoaSA8PSAwKSB7CiAJCWVycigiUkMgUXVlcnkgRmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBsb3NpbmcgaGFsZiBvZiBLRVlfMCBldmVudHMgZnJvbSBQaGlsaXBwcyByYzUgcmVtb3Rlcy4uICovCi0JaWYgKGtleVswXT09MCAmJiBrZXlbMV09PTAgJiYga2V5WzJdPT0wICYmIGtleVszXT09MCkgcmV0dXJuIDA7CisJaWYgKGtleVswXSA9PSAwICYmIGtleVsxXSA9PSAwICYmIGtleVsyXSA9PSAwICYmIGtleVszXSA9PSAwKQorCQlyZXR1cm4gMDsKIAogCS8qIGluZm8oIiVkOiAlMlggJTJYICUyWCAlMlgiLGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bywoaW50KWtleVszLTJdLChpbnQpa2V5WzMtM10sKGludClrZXlbMy0xXSwoaW50KWtleVszXSk7ICAqLwogCiAJZGliMDcwMF9yY19zZXR1cChkKTsgLyogcmVzZXQgaXIgc2Vuc29yIGRhdGEgdG8gcHJldmVudCBmYWxzZSBldmVudHMgKi8KIAotCXN3aXRjaCAoZHZiX3VzYl9kaWIwNzAwX2lyX3Byb3RvKSB7Ci0JY2FzZSAwOiB7CisJZC0+bGFzdF9ldmVudCA9IDA7CisJc3dpdGNoIChkLT5wcm9wcy5yYy5jb3JlLnByb3RvY29sKSB7CisJY2FzZSBJUl9UWVBFX05FQzoKIAkJLyogTkVDIHByb3RvY29sIHNlbmRzIHJlcGVhdCBjb2RlIGFzIDAgMCAwIEZGICovCiAJCWlmICgoa2V5WzMtMl0gPT0gMHgwMCkgJiYgKGtleVszLTNdID09IDB4MDApICYmCi0JCSAgICAoa2V5WzNdID09IDB4RkYpKSB7Ci0JCQlzdC0+cmNfY291bnRlcisrOwotCQkJaWYgKHN0LT5yY19jb3VudGVyID4gUkNfUkVQRUFUX0RFTEFZKSB7Ci0JCQkJKmV2ZW50ID0gZC0+bGFzdF9ldmVudDsKLQkJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7Ci0JCQkJc3QtPnJjX2NvdW50ZXIgPSBSQ19SRVBFQVRfREVMQVk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKKwkJICAgIChrZXlbM10gPT0gMHhmZikpCisJCQlrZXljb2RlID0gZC0+bGFzdF9ldmVudDsKKwkJZWxzZSB7CisJCQlrZXljb2RlID0ga2V5WzMtMl0gPDwgOCB8IGtleVszLTNdOworCQkJZC0+bGFzdF9ldmVudCA9IGtleWNvZGU7CiAJCX0KLQkJZm9yIChpPTA7aTxkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgewotCQkJaWYgKHJjNV9jdXN0b20oJmtleW1hcFtpXSkgPT0ga2V5WzMtMl0gJiYKLQkJCSAgICByYzVfZGF0YSgma2V5bWFwW2ldKSA9PSBrZXlbMy0zXSkgewotCQkJCXN0LT5yY19jb3VudGVyID0gMDsKLQkJCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7Ci0JCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwotCQkJCWQtPmxhc3RfZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJLyogUkMtNSBwcm90b2NvbCBjaGFuZ2VzIHRvZ2dsZSBiaXQgb24gbmV3IGtleXByZXNzICovCi0JCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgewotCQkJaWYgKHJjNV9jdXN0b20oJmtleW1hcFtpXSkgPT0ga2V5WzMtMl0gJiYKLQkJCSAgICByYzVfZGF0YSgma2V5bWFwW2ldKSA9PSBrZXlbMy0zXSkgewotCQkJCWlmIChkLT5sYXN0X2V2ZW50ID09IGtleW1hcFtpXS5ldmVudCAmJgotCQkJCQlrZXlbMy0xXSA9PSBzdC0+cmNfdG9nZ2xlKSB7Ci0JCQkJCXN0LT5yY19jb3VudGVyKys7Ci0JCQkJCS8qIHByZXZlbnRzIHVud2FudGVkIGRvdWJsZSBoaXRzICovCi0JCQkJCWlmIChzdC0+cmNfY291bnRlciA+IFJDX1JFUEVBVF9ERUxBWSkgewotCQkJCQkJKmV2ZW50ID0gZC0+bGFzdF9ldmVudDsKLQkJCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJCQkJCXN0LT5yY19jb3VudGVyID0gUkNfUkVQRUFUX0RFTEFZOwotCQkJCQl9CiAKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXN0LT5yY19jb3VudGVyID0gMDsKLQkJCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7Ci0JCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwotCQkJCXN0LT5yY190b2dnbGUgPSBrZXlbMy0xXTsKLQkJCQlkLT5sYXN0X2V2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9CisJCWlyX2tleWRvd24oZC0+cmNfaW5wdXRfZGV2LCBrZXljb2RlLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogUkMtNSBwcm90b2NvbCBjaGFuZ2VzIHRvZ2dsZSBiaXQgb24gbmV3IGtleXByZXNzICovCisJCWtleWNvZGUgPSBrZXlbMy0yXSA8PCA4IHwga2V5WzMtM107CisJCXRvZ2dsZSA9IGtleVszLTFdOworCQlpcl9rZXlkb3duKGQtPnJjX2lucHV0X2Rldiwga2V5Y29kZSwgdG9nZ2xlKTsKKwogCQlicmVhazsKIAl9Ci0JfQotCWVycigiVW5rbm93biByZW1vdGUgY29udHJvbGxlciBrZXk6ICUyWCAlMlggJTJYICUyWCIsIChpbnQpIGtleVszLTJdLCAoaW50KSBrZXlbMy0zXSwgKGludCkga2V5WzMtMV0sIChpbnQpIGtleVszXSk7Ci0JZC0+bGFzdF9ldmVudCA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfZGliMDcwMF90YWJsZVtdID0gewotCS8qIEtleSBjb2RlcyBmb3IgdGhlIHRpbnkgUGlubmFjbGUgcmVtb3RlKi8KLQl7IDB4MDcwMCwgS0VZX01VVEUgfSwKLQl7IDB4MDcwMSwgS0VZX01FTlUgfSwgLyogUGlubmFjbGUgbG9nbyAqLwotCXsgMHgwNzM5LCBLRVlfUE9XRVIgfSwKLQl7IDB4MDcwMywgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDA3MDksIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweDA3MDYsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4MDcwYywgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweDA3MGYsIEtFWV8xIH0sCi0JeyAweDA3MTUsIEtFWV8yIH0sCi0JeyAweDA3MTAsIEtFWV8zIH0sCi0JeyAweDA3MTgsIEtFWV80IH0sCi0JeyAweDA3MWIsIEtFWV81IH0sCi0JeyAweDA3MWUsIEtFWV82IH0sCi0JeyAweDA3MTEsIEtFWV83IH0sCi0JeyAweDA3MjEsIEtFWV84IH0sCi0JeyAweDA3MTIsIEtFWV85IH0sCi0JeyAweDA3MjcsIEtFWV8wIH0sCi0JeyAweDA3MjQsIEtFWV9TQ1JFRU4gfSwgLyogJ1NxdWFyZScga2V5ICovCi0JeyAweDA3MmEsIEtFWV9URVhUIH0sICAgLyogJ1QnIGtleSAqLwotCXsgMHgwNzJkLCBLRVlfUkVXSU5EIH0sCi0JeyAweDA3MzAsIEtFWV9QTEFZIH0sCi0JeyAweDA3MzMsIEtFWV9GQVNURk9SV0FSRCB9LAotCXsgMHgwNzM2LCBLRVlfUkVDT1JEIH0sCi0JeyAweDA3M2MsIEtFWV9TVE9QIH0sCi0JeyAweDA3M2YsIEtFWV9DQU5DRUwgfSwgLyogJz8nIGtleSAqLwotCS8qIEtleSBjb2RlcyBmb3IgdGhlIFRlcnJhdGVjIENpbmVyZ3kgRFQgWFMgRGl2ZXJzaXR5LCBzaW1pbGFyIHRvIGNpbmVyZ3lUMi5jICovCi0JeyAweGViMDEsIEtFWV9QT1dFUiB9LAotCXsgMHhlYjAyLCBLRVlfMSB9LAotCXsgMHhlYjAzLCBLRVlfMiB9LAotCXsgMHhlYjA0LCBLRVlfMyB9LAotCXsgMHhlYjA1LCBLRVlfNCB9LAotCXsgMHhlYjA2LCBLRVlfNSB9LAotCXsgMHhlYjA3LCBLRVlfNiB9LAotCXsgMHhlYjA4LCBLRVlfNyB9LAotCXsgMHhlYjA5LCBLRVlfOCB9LAotCXsgMHhlYjBhLCBLRVlfOSB9LAotCXsgMHhlYjBiLCBLRVlfVklERU8gfSwKLQl7IDB4ZWIwYywgS0VZXzAgfSwKLQl7IDB4ZWIwZCwgS0VZX1JFRlJFU0ggfSwKLQl7IDB4ZWIwZiwgS0VZX0VQRyB9LAotCXsgMHhlYjEwLCBLRVlfVVAgfSwKLQl7IDB4ZWIxMSwgS0VZX0xFRlQgfSwKLQl7IDB4ZWIxMiwgS0VZX09LIH0sCi0JeyAweGViMTMsIEtFWV9SSUdIVCB9LAotCXsgMHhlYjE0LCBLRVlfRE9XTiB9LAotCXsgMHhlYjE2LCBLRVlfSU5GTyB9LAotCXsgMHhlYjE3LCBLRVlfUkVEIH0sCi0JeyAweGViMTgsIEtFWV9HUkVFTiB9LAotCXsgMHhlYjE5LCBLRVlfWUVMTE9XIH0sCi0JeyAweGViMWEsIEtFWV9CTFVFIH0sCi0JeyAweGViMWIsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4ZWIxYywgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweGViMWQsIEtFWV9NVVRFIH0sCi0JeyAweGViMWUsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweGViMWYsIEtFWV9DSEFOTkVMRE9XTiB9LAotCXsgMHhlYjQwLCBLRVlfUEFVU0UgfSwKLQl7IDB4ZWI0MSwgS0VZX0hPTUUgfSwKLQl7IDB4ZWI0MiwgS0VZX01FTlUgfSwgLyogRFZEIE1lbnUgKi8KLQl7IDB4ZWI0MywgS0VZX1NVQlRJVExFIH0sCi0JeyAweGViNDQsIEtFWV9URVhUIH0sIC8qIFRlbGV0ZXh0ICovCi0JeyAweGViNDUsIEtFWV9ERUxFVEUgfSwKLQl7IDB4ZWI0NiwgS0VZX1RWIH0sCi0JeyAweGViNDcsIEtFWV9EVkQgfSwKLQl7IDB4ZWI0OCwgS0VZX1NUT1AgfSwKLQl7IDB4ZWI0OSwgS0VZX1ZJREVPIH0sCi0JeyAweGViNGEsIEtFWV9BVURJTyB9LCAvKiBNdXNpYyAqLwotCXsgMHhlYjRiLCBLRVlfU0NSRUVOIH0sIC8qIFBpYyAqLwotCXsgMHhlYjRjLCBLRVlfUExBWSB9LAotCXsgMHhlYjRkLCBLRVlfQkFDSyB9LAotCXsgMHhlYjRlLCBLRVlfUkVXSU5EIH0sCi0JeyAweGViNGYsIEtFWV9GQVNURk9SV0FSRCB9LAotCXsgMHhlYjU0LCBLRVlfUFJFVklPVVMgfSwKLQl7IDB4ZWI1OCwgS0VZX1JFQ09SRCB9LAotCXsgMHhlYjVjLCBLRVlfTkVYVCB9LAotCi0JLyogS2V5IGNvZGVzIGZvciB0aGUgSGF1cGF1Z2UgV2luVFYgTm92YS1URCwgY29waWVkIGZyb20gbm92YS10LXVzYjIuYyAoTm92YS1UIFVTQjIpICovCi0JeyAweDFlMDAsIEtFWV8wIH0sCi0JeyAweDFlMDEsIEtFWV8xIH0sCi0JeyAweDFlMDIsIEtFWV8yIH0sCi0JeyAweDFlMDMsIEtFWV8zIH0sCi0JeyAweDFlMDQsIEtFWV80IH0sCi0JeyAweDFlMDUsIEtFWV81IH0sCi0JeyAweDFlMDYsIEtFWV82IH0sCi0JeyAweDFlMDcsIEtFWV83IH0sCi0JeyAweDFlMDgsIEtFWV84IH0sCi0JeyAweDFlMDksIEtFWV85IH0sCi0JeyAweDFlMGEsIEtFWV9LUEFTVEVSSVNLIH0sCi0JeyAweDFlMGIsIEtFWV9SRUQgfSwKLQl7IDB4MWUwYywgS0VZX1JBRElPIH0sCi0JeyAweDFlMGQsIEtFWV9NRU5VIH0sCi0JeyAweDFlMGUsIEtFWV9HUkFWRSB9LCAvKiAjICovCi0JeyAweDFlMGYsIEtFWV9NVVRFIH0sCi0JeyAweDFlMTAsIEtFWV9WT0xVTUVVUCB9LAotCXsgMHgxZTExLCBLRVlfVk9MVU1FRE9XTiB9LAotCXsgMHgxZTEyLCBLRVlfQ0hBTk5FTCB9LAotCXsgMHgxZTE0LCBLRVlfVVAgfSwKLQl7IDB4MWUxNSwgS0VZX0RPV04gfSwKLQl7IDB4MWUxNiwgS0VZX0xFRlQgfSwKLQl7IDB4MWUxNywgS0VZX1JJR0hUIH0sCi0JeyAweDFlMTgsIEtFWV9WSURFTyB9LAotCXsgMHgxZTE5LCBLRVlfQVVESU8gfSwKLQl7IDB4MWUxYSwgS0VZX01FRElBIH0sCi0JeyAweDFlMWIsIEtFWV9FUEcgfSwKLQl7IDB4MWUxYywgS0VZX1RWIH0sCi0JeyAweDFlMWUsIEtFWV9ORVhUIH0sCi0JeyAweDFlMWYsIEtFWV9CQUNLIH0sCi0JeyAweDFlMjAsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4MWUyMSwgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweDFlMjQsIEtFWV9MQVNUIH0sIC8qIFNraXAgYmFja3dhcmRzICovCi0JeyAweDFlMjUsIEtFWV9PSyB9LAotCXsgMHgxZTI5LCBLRVlfQkxVRX0sCi0JeyAweDFlMmUsIEtFWV9HUkVFTiB9LAotCXsgMHgxZTMwLCBLRVlfUEFVU0UgfSwKLQl7IDB4MWUzMiwgS0VZX1JFV0lORCB9LAotCXsgMHgxZTM0LCBLRVlfRkFTVEZPUldBUkQgfSwKLQl7IDB4MWUzNSwgS0VZX1BMQVkgfSwKLQl7IDB4MWUzNiwgS0VZX1NUT1AgfSwKLQl7IDB4MWUzNywgS0VZX1JFQ09SRCB9LAotCXsgMHgxZTM4LCBLRVlfWUVMTE9XIH0sCi0JeyAweDFlM2IsIEtFWV9HT1RPIH0sCi0JeyAweDFlM2QsIEtFWV9QT1dFUiB9LAotCi0JLyogS2V5IGNvZGVzIGZvciB0aGUgTGVhZHRlayBXaW5mYXN0IERUViBEb25nbGUgKi8KLQl7IDB4MDA0MiwgS0VZX1BPV0VSIH0sCi0JeyAweDA3N2MsIEtFWV9UVU5FUiB9LAotCXsgMHgwZjRlLCBLRVlfUFJJTlQgfSwgLyogUFJFVklFVyAqLwotCXsgMHgwODQwLCBLRVlfU0NSRUVOIH0sIC8qIGZ1bGwgc2NyZWVuIHRvZ2dsZSovCi0JeyAweDBmNzEsIEtFWV9ET1QgfSwgLyogZnJlcXVlbmN5ICovCi0JeyAweDA3NDMsIEtFWV8wIH0sCi0JeyAweDBjNDEsIEtFWV8xIH0sCi0JeyAweDA0NDMsIEtFWV8yIH0sCi0JeyAweDBiN2YsIEtFWV8zIH0sCi0JeyAweDBlNDEsIEtFWV80IH0sCi0JeyAweDA2NDMsIEtFWV81IH0sCi0JeyAweDA5N2YsIEtFWV82IH0sCi0JeyAweDBkN2UsIEtFWV83IH0sCi0JeyAweDA1N2MsIEtFWV84IH0sCi0JeyAweDBhNDAsIEtFWV85IH0sCi0JeyAweDBlNGUsIEtFWV9DTEVBUiB9LAotCXsgMHgwNDdjLCBLRVlfQ0hBTk5FTCB9LCAvKiBzaG93IGNoYW5uZWwgbnVtYmVyICovCi0JeyAweDBmNDEsIEtFWV9MQVNUIH0sIC8qIHJlY2FsbCAqLwotCXsgMHgwMzQyLCBLRVlfTVVURSB9LAotCXsgMHgwNjRjLCBLRVlfUkVTRVJWRUQgfSwgLyogUElQIGJ1dHRvbiovCi0JeyAweDAxNzIsIEtFWV9TSFVGRkxFIH0sIC8qIFNOQVBTSE9UICovCi0JeyAweDBjNGUsIEtFWV9QTEFZUEFVU0UgfSwgLyogVElNRVNISUZUICovCi0JeyAweDBiNzAsIEtFWV9SRUNPUkQgfSwKLQl7IDB4MDM3ZCwgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDAxN2QsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweDAyNDIsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4MDA3ZCwgS0VZX0NIQU5ORUxET1dOIH0sCi0KLQkvKiBLZXkgY29kZXMgZm9yIE5vdmEtVEQgImNyZWRpdCBjYXJkIiByZW1vdGUgY29udHJvbC4gKi8KLQl7IDB4MWQwMCwgS0VZXzAgfSwKLQl7IDB4MWQwMSwgS0VZXzEgfSwKLQl7IDB4MWQwMiwgS0VZXzIgfSwKLQl7IDB4MWQwMywgS0VZXzMgfSwKLQl7IDB4MWQwNCwgS0VZXzQgfSwKLQl7IDB4MWQwNSwgS0VZXzUgfSwKLQl7IDB4MWQwNiwgS0VZXzYgfSwKLQl7IDB4MWQwNywgS0VZXzcgfSwKLQl7IDB4MWQwOCwgS0VZXzggfSwKLQl7IDB4MWQwOSwgS0VZXzkgfSwKLQl7IDB4MWQwYSwgS0VZX1RFWFQgfSwKLQl7IDB4MWQwZCwgS0VZX01FTlUgfSwKLQl7IDB4MWQwZiwgS0VZX01VVEUgfSwKLQl7IDB4MWQxMCwgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDFkMTEsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweDFkMTIsIEtFWV9DSEFOTkVMIH0sCi0JeyAweDFkMTQsIEtFWV9VUCB9LAotCXsgMHgxZDE1LCBLRVlfRE9XTiB9LAotCXsgMHgxZDE2LCBLRVlfTEVGVCB9LAotCXsgMHgxZDE3LCBLRVlfUklHSFQgfSwKLQl7IDB4MWQxYywgS0VZX1RWIH0sCi0JeyAweDFkMWUsIEtFWV9ORVhUIH0sCi0JeyAweDFkMWYsIEtFWV9CQUNLIH0sCi0JeyAweDFkMjAsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4MWQyMSwgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweDFkMjQsIEtFWV9MQVNUIH0sCi0JeyAweDFkMjUsIEtFWV9PSyB9LAotCXsgMHgxZDMwLCBLRVlfUEFVU0UgfSwKLQl7IDB4MWQzMiwgS0VZX1JFV0lORCB9LAotCXsgMHgxZDM0LCBLRVlfRkFTVEZPUldBUkQgfSwKLQl7IDB4MWQzNSwgS0VZX1BMQVkgfSwKLQl7IDB4MWQzNiwgS0VZX1NUT1AgfSwKLQl7IDB4MWQzNywgS0VZX1JFQ09SRCB9LAotCXsgMHgxZDNiLCBLRVlfR09UTyB9LAotCXsgMHgxZDNkLCBLRVlfUE9XRVIgfSwKLQotCS8qIEtleSBjb2RlcyBmb3IgdGhlIFBpeGVsdmlldyBTQlRWRCByZW1vdGUgKHByb3RvIE5FQykgKi8KLQl7IDB4ODYxMywgS0VZX01VVEUgfSwKLQl7IDB4ODYxMiwgS0VZX1BPV0VSIH0sCi0JeyAweDg2MDEsIEtFWV8xIH0sCi0JeyAweDg2MDIsIEtFWV8yIH0sCi0JeyAweDg2MDMsIEtFWV8zIH0sCi0JeyAweDg2MDQsIEtFWV80IH0sCi0JeyAweDg2MDUsIEtFWV81IH0sCi0JeyAweDg2MDYsIEtFWV82IH0sCi0JeyAweDg2MDcsIEtFWV83IH0sCi0JeyAweDg2MDgsIEtFWV84IH0sCi0JeyAweDg2MDksIEtFWV85IH0sCi0JeyAweDg2MDAsIEtFWV8wIH0sCi0JeyAweDg2MGQsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4ODYxOSwgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweDg2MTAsIEtFWV9WT0xVTUVVUCB9LAotCXsgMHg4NjBjLCBLRVlfVk9MVU1FRE9XTiB9LAotCi0JeyAweDg2MGEsIEtFWV9DQU1FUkEgfSwKLQl7IDB4ODYwYiwgS0VZX1pPT00gfSwKLQl7IDB4ODYxYiwgS0VZX0JBQ0tTUEFDRSB9LAotCXsgMHg4NjE1LCBLRVlfRU5URVIgfSwKLQotCXsgMHg4NjFkLCBLRVlfVVAgfSwKLQl7IDB4ODYxZSwgS0VZX0RPV04gfSwKLQl7IDB4ODYwZSwgS0VZX0xFRlQgfSwKLQl7IDB4ODYwZiwgS0VZX1JJR0hUIH0sCi0KLQl7IDB4ODYxOCwgS0VZX1JFQ09SRCB9LAotCXsgMHg4NjFhLCBLRVlfU1RPUCB9LAotCi0JLyogS2V5IGNvZGVzIGZvciB0aGUgRXZvbHV0ZVBDIFRWV2F5KyByZW1vdGUgKHByb3RvIE5FQykgKi8KLQl7IDB4N2EwMCwgS0VZX01FTlUgfSwKLQl7IDB4N2EwMSwgS0VZX1JFQ09SRCB9LAotCXsgMHg3YTAyLCBLRVlfUExBWSB9LAotCXsgMHg3YTAzLCBLRVlfU1RPUCB9LAotCXsgMHg3YTEwLCBLRVlfQ0hBTk5FTFVQIH0sCi0JeyAweDdhMTEsIEtFWV9DSEFOTkVMRE9XTiB9LAotCXsgMHg3YTEyLCBLRVlfVk9MVU1FVVAgfSwKLQl7IDB4N2ExMywgS0VZX1ZPTFVNRURPV04gfSwKLQl7IDB4N2E0MCwgS0VZX1BPV0VSIH0sCi0JeyAweDdhNDEsIEtFWV9NVVRFIH0sCi0KLQkvKiBLZXkgY29kZXMgZm9yIHRoZSBFbGdhdG8gRXllVFYgRGl2ZXJzaXR5IHNpbHZlciByZW1vdGUsCi0JICAgc2V0IGR2Yl91c2JfZGliMDcwMF9pcl9wcm90bz0wICovCi0JeyAweDQ1MDEsIEtFWV9QT1dFUiB9LAotCXsgMHg0NTAyLCBLRVlfTVVURSB9LAotCXsgMHg0NTAzLCBLRVlfMSB9LAotCXsgMHg0NTA0LCBLRVlfMiB9LAotCXsgMHg0NTA1LCBLRVlfMyB9LAotCXsgMHg0NTA2LCBLRVlfNCB9LAotCXsgMHg0NTA3LCBLRVlfNSB9LAotCXsgMHg0NTA4LCBLRVlfNiB9LAotCXsgMHg0NTA5LCBLRVlfNyB9LAotCXsgMHg0NTBhLCBLRVlfOCB9LAotCXsgMHg0NTBiLCBLRVlfOSB9LAotCXsgMHg0NTBjLCBLRVlfTEFTVCB9LAotCXsgMHg0NTBkLCBLRVlfMCB9LAotCXsgMHg0NTBlLCBLRVlfRU5URVIgfSwKLQl7IDB4NDUwZiwgS0VZX1JFRCB9LAotCXsgMHg0NTEwLCBLRVlfQ0hBTk5FTFVQIH0sCi0JeyAweDQ1MTEsIEtFWV9HUkVFTiB9LAotCXsgMHg0NTEyLCBLRVlfVk9MVU1FRE9XTiB9LAotCXsgMHg0NTEzLCBLRVlfT0sgfSwKLQl7IDB4NDUxNCwgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDQ1MTUsIEtFWV9ZRUxMT1cgfSwKLQl7IDB4NDUxNiwgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweDQ1MTcsIEtFWV9CTFVFIH0sCi0JeyAweDQ1MTgsIEtFWV9MRUZUIH0sIC8qIFNraXAgYmFja3dhcmRzICovCi0JeyAweDQ1MTksIEtFWV9QTEFZUEFVU0UgfSwKLQl7IDB4NDUxYSwgS0VZX1JJR0hUIH0sIC8qIFNraXAgZm9yd2FyZCAqLwotCXsgMHg0NTFiLCBLRVlfUkVXSU5EIH0sCi0JeyAweDQ1MWMsIEtFWV9MIH0sIC8qIExpdmUgKi8KLQl7IDB4NDUxZCwgS0VZX0ZBU1RGT1JXQVJEIH0sCi0JeyAweDQ1MWUsIEtFWV9TVE9QIH0sIC8qICdSZXZlYWwnIGZvciBUZWxldGV4dCAqLwotCXsgMHg0NTFmLCBLRVlfTUVOVSB9LCAvKiBLRVlfVEVYVCBmb3IgVGVsZXRleHQgKi8KLQl7IDB4NDU0MCwgS0VZX1JFQ09SRCB9LCAvKiBGb250ICdTaXplJyBmb3IgVGVsZXRleHQgKi8KLQl7IDB4NDU0MSwgS0VZX1NDUkVFTiB9LCAvKiAgRnVsbCBzY3JlZW4gdG9nZ2xlLCAnSG9sZCcgZm9yIFRlbGV0ZXh0ICovCi0JeyAweDQ1NDIsIEtFWV9TRUxFQ1QgfSwgLyogU2VsZWN0IHZpZGVvIGlucHV0LCAnU2VsZWN0JyBmb3IgVGVsZXRleHQgKi8KLX07Ci0KIC8qIFNUSzc3MDBQOiBIYXVwcGF1Z2UgTm92YS1UIFN0aWNrLCBBVmVyTWVkaWEgVm9sYXIgKi8KIHN0YXRpYyBzdHJ1Y3QgZGlieDAwMF9hZ2NfY29uZmlnIHN0azc3MDBwXzcwMDBtX210MjA2MF9hZ2NfY29uZmlnID0gewogCUJBTkRfVUhGIHwgQkFORF9WSEYsCkBAIC0yMTY4LDEwICsxODY4LDE3IEBACiAJCQl9CiAJCX0sCiAKLQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYjA3MDBfdGFibGUsCi0JCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kaWIwNzAwX3RhYmxlKSwKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5CisJCS5yYy5jb3JlID0geworCQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAorCQkJLnJjX2NvZGVzICAgICAgICAgPSBSQ19NQVBfRElCMDcwMF9SQzVfVEFCTEUsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLnJjX3Byb3BzID0geworCQkJCS5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwKKwkJCQkJCSAgSVJfVFlQRV9SQzYgfAorCQkJCQkJICBJUl9UWVBFX05FQywKKwkJCQkuY2hhbmdlX3Byb3RvY29sID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCQl9LAorCQl9LAogCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAogCiAJCS5udW1fYWRhcHRlcnMgPSAyLApAQCAtMjE5NywxMCArMTkwNCwxNyBAQAogCQkJfSwKIAkJfSwKIAotCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCi0JCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGliMDcwMF90YWJsZSwKLQkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2RpYjA3MDBfdGFibGUpLAotCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnkKKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5yY19xdWVyeSAgICAgICAgID0gZGliMDcwMF9yY19xdWVyeV9vbGRfZmlybXdhcmUsCisJCQkucmNfcHJvcHMgPSB7CisJCQkJLmFsbG93ZWRfcHJvdG9zID0gSVJfVFlQRV9SQzUgfAorCQkJCQkJICBJUl9UWVBFX1JDNiB8CisJCQkJCQkgIElSX1RZUEVfTkVDLAorCQkJCS5jaGFuZ2VfcHJvdG9jb2wgPSBkaWIwNzAwX2NoYW5nZV9wcm90b2NvbCwKKwkJCX0sCisJCX0sCiAJfSwgeyBESUIwNzAwX0RFRkFVTFRfREVWSUNFX1BST1BFUlRJRVMsCiAKIAkJLm51bV9hZGFwdGVycyA9IDIsCkBAIC0yMjUxLDExICsxOTY1LDE3IEBACiAKIAkJfSwKIAotCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCi0JCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGliMDcwMF90YWJsZSwKLQkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2RpYjA3MDBfdGFibGUpLAotCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnkKLQorCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfUkM1X1RBQkxFLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAogCQkubnVtX2FkYXB0ZXJzID0gMSwKQEAgLTIyODgsMTAgKzIwMDgsMTggQEAKIAkJCX0KIAkJfSwKIAotCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCi0JCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGliMDcwMF90YWJsZSwKLQkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2RpYjA3MDBfdGFibGUpLAotCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnkKKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAogCQkubnVtX2FkYXB0ZXJzID0gMSwKQEAgLTIzNTgsMTEgKzIwODYsMTggQEAKIAkJCX0sCiAJCX0sCiAKLQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYjA3MDBfdGFibGUsCi0JCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kaWIwNzAwX3RhYmxlKSwKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5Ci0KKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAogCQkubnVtX2FkYXB0ZXJzID0gMSwKQEAgLTIzOTcsMTEgKzIxMzIsMTggQEAKIAkJCX0sCiAJCX0sCiAKLQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYjA3MDBfdGFibGUsCi0JCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kaWIwNzAwX3RhYmxlKSwKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5Ci0KKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAogCQkubnVtX2FkYXB0ZXJzID0gMiwKQEAgLTI0MzEsNyArMjE3Myw3IEBACiAJCQl9CiAJCX0sCiAKLQkJLm51bV9kZXZpY2VfZGVzY3MgPSA3LAorCQkubnVtX2RldmljZV9kZXNjcyA9IDYsCiAJCS5kZXZpY2VzID0gewogCQkJeyAgICJEaUJjb20gU1RLNzA3MFBEIHJlZmVyZW5jZSBkZXNpZ24iLAogCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzE3XSwgTlVMTCB9LApAQCAtMjQ1OCwxNSArMjIwMCw2OSBAQAogCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzQ0XSwgTlVMTCB9LAogCQkJCXsgTlVMTCB9LAogCQkJfSwKKwkJfSwKKworCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfUkM1X1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLnJjX3Byb3BzID0geworCQkJCS5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwKKwkJCQkJCSAgSVJfVFlQRV9SQzYgfAorCQkJCQkJICBJUl9UWVBFX05FQywKKwkJCQkuY2hhbmdlX3Byb3RvY29sID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCQl9LAorCQl9LAorCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAorCisJCS5udW1fYWRhcHRlcnMgPSAyLAorCQkuYWRhcHRlciA9IHsKKwkJCXsKKwkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAorCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCisJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLAorCQkJCS5waWRfZmlsdGVyX2N0cmwgID0gc3RrNzB4MHBfcGlkX2ZpbHRlcl9jdHJsLAorCQkJCS5mcm9udGVuZF9hdHRhY2ggID0gc3RrNzA3MHBkX2Zyb250ZW5kX2F0dGFjaDAsCisJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCisKKwkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKKworCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAorCQkJfSwgeworCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKwkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCisJCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBzdGs3MHgwcF9waWRfZmlsdGVyX2N0cmwsCisJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBzdGs3MDcwcGRfZnJvbnRlbmRfYXR0YWNoMSwKKwkJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYjcwNzBwX3R1bmVyX2F0dGFjaCwKKworCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDMpLAorCisJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCisJCQl9CisJCX0sCisKKwkJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCQkuZGV2aWNlcyA9IHsKIAkJCXsgICAiRWxnYXRvIEV5ZVRWIERpdmVyc2l0eSIsCiAJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNjhdLCBOVUxMIH0sCiAJCQkJeyBOVUxMIH0sCiAJCQl9LAogCQl9LAotCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCi0JCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGliMDcwMF90YWJsZSwKLQkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2RpYjA3MDBfdGFibGUpLAotCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnkKKworCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfTkVDX1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLnJjX3Byb3BzID0geworCQkJCS5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwKKwkJCQkJCSAgSVJfVFlQRV9SQzYgfAorCQkJCQkJICBJUl9UWVBFX05FQywKKwkJCQkuY2hhbmdlX3Byb3RvY29sID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCQl9LAorCQl9LAogCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAogCiAJCS5udW1fYWRhcHRlcnMgPSAxLApAQCAtMjUyNSwxMCArMjMyMSwxOSBAQAogCQkJCXsgTlVMTCB9LAogCQkJfSwKIAkJfSwKLQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYjA3MDBfdGFibGUsCi0JCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kaWIwNzAwX3RhYmxlKSwKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5CisKKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewpAQCAtMjU1NCwxMCArMjM1OSwxOSBAQAogCQkJCXsgTlVMTCB9LAogCQkJfSwKIAkJfSwKLQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYjA3MDBfdGFibGUsCi0JCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kaWIwNzAwX3RhYmxlKSwKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5CisKKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewpAQCAtMjYxNSwxMCArMjQyOSwxOSBAQAogCQkJCXsgTlVMTCB9LAogCQkJfSwKIAkJfSwKLQkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYjA3MDBfdGFibGUsCi0JCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19kaWIwNzAwX3RhYmxlKSwKLQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5CisKKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5yY19wcm9wcyA9IHsKKwkJCQkuYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX1JDNSB8CisJCQkJCQkgIElSX1RZUEVfUkM2IHwKKwkJCQkJCSAgSVJfVFlQRV9ORUMsCisJCQkJLmNoYW5nZV9wcm90b2NvbCA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQkJfSwKKwkJfSwKIAl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewpAQCAtMjY1MywxMSArMjQ3NiwxOCBAQAogCQkJfSwKIAkJfSwKIAotCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCi0JCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGliMDcwMF90YWJsZSwKLQkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2RpYjA3MDBfdGFibGUpLAotCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnkKLQorCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfTkVDX1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLnJjX3Byb3BzID0geworCQkJCS5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwKKwkJCQkJCSAgSVJfVFlQRV9SQzYgfAorCQkJCQkJICBJUl9UWVBFX05FQywKKwkJCQkuY2hhbmdlX3Byb3RvY29sID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCQl9LAorCQl9LAogCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CkBAIC0yNjk3LDEwICsyNTI3LDE4IEBACiAJCQl9LAogCQl9LAogCi0JCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKLQkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kaWIwNzAwX3RhYmxlLAotCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZGliMDcwMF90YWJsZSksCi0JCS5yY19xdWVyeSAgICAgICAgID0gZGliMDcwMF9yY19xdWVyeQorCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfUkM1X1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLnJjX3Byb3BzID0geworCQkJCS5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwKKwkJCQkJCSAgSVJfVFlQRV9SQzYgfAorCQkJCQkJICBJUl9UWVBFX05FQywKKwkJCQkuY2hhbmdlX3Byb3RvY29sID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCQl9LAorCQl9LAogCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CkBAIC0yNzI4LDEwICsyNTY2LDE4IEBACiAJCQl9LAogCQl9LAogCi0JCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKLQkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kaWIwNzAwX3RhYmxlLAotCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZGliMDcwMF90YWJsZSksCi0JCS5yY19xdWVyeSAgICAgICAgID0gZGliMDcwMF9yY19xdWVyeQorCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfUkM1X1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLnJjX3Byb3BzID0geworCQkJCS5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwKKwkJCQkJCSAgSVJfVFlQRV9SQzYgfAorCQkJCQkJICBJUl9UWVBFX05FQywKKwkJCQkuY2hhbmdlX3Byb3RvY29sID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCQl9LAorCQl9LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCmluZGV4IGJjMDhiYzAuLmJhOTkxYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCkBAIC0zMjcsNyArMzI3LDcgQEAKIC8qCiAgKiBjb21tb24gcmVtb3RlIGNvbnRyb2wgc3R1ZmYKICAqLwotc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2RpYnVzYl90YWJsZVtdID0geworc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX2RpYnVzYl90YWJsZVtdID0gewogCS8qIEtleSBjb2RlcyBmb3IgdGhlIGxpdHRsZSBBcnRlYyBUMS9Ud2luaGFuL0hBTUEvIHJlbW90ZS4gKi8KIAl7IDB4MDAxNiwgS0VZX1BPV0VSIH0sCiAJeyAweDAwMTAsIEtFWV9NVVRFIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYwppbmRleCBlYjJlNmYwLi44ZTNjMGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKQEAgLTIxMSwxMCArMjExLDEyIEBACiAKIAkucG93ZXJfY3RybCAgICAgICA9IGRpYnVzYl9wb3dlcl9jdHJsLAogCi0JLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGlidXNiX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gMTExLCAvKiB3b3csIHRoYXQgaXMgdWdseSAuLi4gSSB3YW50IHRvIGxvYWQgaXQgdG8gdGhlIGRyaXZlciBkeW5hbWljYWxseSAqLwotCS5yY19xdWVyeSAgICAgICAgID0gZGlidXNiX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kaWJ1c2JfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gMTExLCAvKiB3b3csIHRoYXQgaXMgdWdseSAuLi4gSSB3YW50IHRvIGxvYWQgaXQgdG8gdGhlIGRyaXZlciBkeW5hbWljYWxseSAqLworCQkucmNfcXVlcnkgICAgICAgICA9IGRpYnVzYl9yY19xdWVyeSwKKwl9LAogCiAJLmkyY19hbGdvICAgICAgICAgPSAmZGlidXNiX2kyY19hbGdvLAogCkBAIC0yOTUsMTAgKzI5NywxMiBAQAogCX0sCiAJLnBvd2VyX2N0cmwgICAgICAgPSBkaWJ1c2JfcG93ZXJfY3RybCwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKLQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYnVzYl90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IDExMSwgLyogd293LCB0aGF0IGlzIHVnbHkgLi4uIEkgd2FudCB0byBsb2FkIGl0IHRvIHRoZSBkcml2ZXIgZHluYW1pY2FsbHkgKi8KLQkucmNfcXVlcnkgICAgICAgICA9IGRpYnVzYl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGlidXNiX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IDExMSwgLyogd293LCB0aGF0IGlzIHVnbHkgLi4uIEkgd2FudCB0byBsb2FkIGl0IHRvIHRoZSBkcml2ZXIgZHluYW1pY2FsbHkgKi8KKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWJ1c2JfcmNfcXVlcnksCisJfSwKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmRpYnVzYl9pMmNfYWxnbywKIApAQCAtMzU5LDEwICszNjMsMTIgQEAKIAl9LAogCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiMl8wX3Bvd2VyX2N0cmwsCiAKLQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kaWJ1c2JfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSAxMTEsIC8qIHdvdywgdGhhdCBpcyB1Z2x5IC4uLiBJIHdhbnQgdG8gbG9hZCBpdCB0byB0aGUgZHJpdmVyIGR5bmFtaWNhbGx5ICovCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWJ1c2JfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAorCQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYnVzYl90YWJsZSwKKwkJLnJjX2tleV9tYXBfc2l6ZSAgPSAxMTEsIC8qIHdvdywgdGhhdCBpcyB1Z2x5IC4uLiBJIHdhbnQgdG8gbG9hZCBpdCB0byB0aGUgZHJpdmVyIGR5bmFtaWNhbGx5ICovCisJCS5yY19xdWVyeSAgICAgICAgID0gZGlidXNiX3JjX3F1ZXJ5LAorCX0sCiAKIAkuaTJjX2FsZ28gICAgICAgICA9ICZkaWJ1c2JfaTJjX2FsZ28sCiAKQEAgLTQxNiwxMCArNDIyLDEyIEBACiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGRpYnVzYjJfMF9wb3dlcl9jdHJsLAogCi0JLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGlidXNiX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gMTExLCAvKiB3b3csIHRoYXQgaXMgdWdseSAuLi4gSSB3YW50IHRvIGxvYWQgaXQgdG8gdGhlIGRyaXZlciBkeW5hbWljYWxseSAqLwotCS5yY19xdWVyeSAgICAgICAgID0gZGlidXNiX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19kaWJ1c2JfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgID0gMTExLCAvKiB3b3csIHRoYXQgaXMgdWdseSAuLi4gSSB3YW50IHRvIGxvYWQgaXQgdG8gdGhlIGRyaXZlciBkeW5hbWljYWxseSAqLworCQkucmNfcXVlcnkgICAgICAgICA9IGRpYnVzYl9yY19xdWVyeSwKKwl9LAogCiAJLmkyY19hbGdvICAgICAgICAgPSAmZGlidXNiX2kyY19hbGdvLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYwppbmRleCA1ODgzMDhlLi4xY2JjNDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKQEAgLTgxLDEwICs4MSwxMiBAQAogCX0sCiAJLnBvd2VyX2N0cmwgICAgICAgPSBkaWJ1c2IyXzBfcG93ZXJfY3RybCwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKLQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpYnVzYl90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IDExMSwgLyogRklYTUUgKi8KLQkucmNfcXVlcnkgICAgICAgICA9IGRpYnVzYl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGlidXNiX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IDExMSwgLyogRklYTUUgKi8KKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWJ1c2JfcmNfcXVlcnksCisJfSwKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmRpYnVzYl9pMmNfYWxnbywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLmgKaW5kZXggM2Q1MGFjNS4uNjFhNmJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2IuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi5oCkBAIC0xMjQsNyArMTI0LDcgQEAKICNkZWZpbmUgREVGQVVMVF9SQ19JTlRFUlZBTCAxNTAKIC8vI2RlZmluZSBERUZBVUxUX1JDX0lOVEVSVkFMIDEwMDAwMAogCi1leHRlcm4gc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2RpYnVzYl90YWJsZVtdOworZXh0ZXJuIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19kaWJ1c2JfdGFibGVbXTsKIGV4dGVybiBpbnQgZGlidXNiX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCB1MzIgKiwgaW50ICopOwogZXh0ZXJuIGludCBkaWJ1c2JfcmVhZF9lZXByb21fYnl0ZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgdTgsIHU4ICopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYwppbmRleCBlODI2MDc3Li4xM2QwMDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX2RpZ2l0dl90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19kaWdpdHZfdGFibGVbXSA9IHsKIAl7IDB4NWY1NSwgS0VZXzAgfSwKIAl7IDB4NmY1NSwgS0VZXzEgfSwKIAl7IDB4OWY1NSwgS0VZXzIgfSwKQEAgLTIzNywxMCArMjM3LDEwIEBACiAJLyogaWYgc29tZXRoaW5nIGlzIGluc2lkZSB0aGUgYnVmZmVyLCBzaW11bGF0ZSBrZXkgcHJlc3MgKi8KIAlpZiAoa2V5WzFdICE9IDApCiAJewotCQkgIGZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgewotCQkJaWYgKHJjNV9jdXN0b20oJmQtPnByb3BzLnJjX2tleV9tYXBbaV0pID09IGtleVsxXSAmJgotCQkJICAgIHJjNV9kYXRhKCZkLT5wcm9wcy5yY19rZXlfbWFwW2ldKSA9PSBrZXlbMl0pIHsKLQkJCQkqZXZlbnQgPSBkLT5wcm9wcy5yY19rZXlfbWFwW2ldLmV2ZW50OworCQkgIGZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplOyBpKyspIHsKKwkJCWlmIChyYzVfY3VzdG9tKCZkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcFtpXSkgPT0ga2V5WzFdICYmCisJCQkgICAgcmM1X2RhdGEoJmQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwW2ldKSA9PSBrZXlbMl0pIHsKKwkJCQkqZXZlbnQgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcFtpXS5rZXljb2RlOwogCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTMxMCwxMCArMzEwLDEyIEBACiAJfSwKIAkuaWRlbnRpZnlfc3RhdGUgICA9IGRpZ2l0dl9pZGVudGlmeV9zdGF0ZSwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwMCwKLQkucmNfa2V5X21hcCAgICAgICA9IGlyX2NvZGVzX2RpZ2l0dl90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZGlnaXR2X3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgICA9IGRpZ2l0dl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfZGlnaXR2X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZGlnaXR2X3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWdpdHZfcmNfcXVlcnksCisJfSwKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmRpZ2l0dl9pMmNfYWxnbywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYwppbmRleCBmNTdlNTkwLi5jYTQ5NWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYwpAQCAtNTcsNyArNTcsNyBAQAogCiAvKiByZW1vdGUgY29udHJvbCAqLwogLyoga2V5IGxpc3QgZm9yIHRoZSB0aW55IHJlbW90ZSBjb250cm9sIChZYWt1bW8sIGRvbid0IGtub3cgYWJvdXQgdGhlIG90aGVycykgKi8KLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfZHR0MjAwdV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc19kdHQyMDB1X3RhYmxlW10gPSB7CiAJeyAweDgwMDEsIEtFWV9NVVRFIH0sCiAJeyAweDgwMDIsIEtFWV9DSEFOTkVMRE9XTiB9LAogCXsgMHg4MDAzLCBLRVlfVk9MVU1FRE9XTiB9LApAQCAtMTYxLDEwICsxNjEsMTIgQEAKIAl9LAogCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCiAKLQkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAotCS5yY19rZXlfbWFwICAgICAgPSBpcl9jb2Rlc19kdHQyMDB1X3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R0dDIwMHVfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgPSBkdHQyMDB1X3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgPSAzMDAsCisJCS5yY19rZXlfbWFwICAgICAgPSBpcl9jb2Rlc19kdHQyMDB1X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdHQyMDB1X3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICA9IGR0dDIwMHVfcmNfcXVlcnksCisJfSwKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAKQEAgLTIwNiwxMCArMjA4LDEyIEBACiAJfSwKIAkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLAogCi0JLnJjX2ludGVydmFsICAgICA9IDMwMCwKLQkucmNfa2V5X21hcCAgICAgID0gaXJfY29kZXNfZHR0MjAwdV90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdHQyMDB1X3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgID0gZHR0MjAwdV9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAorCQkucmNfa2V5X21hcCAgICAgID0gaXJfY29kZXNfZHR0MjAwdV90YWJsZSwKKwkJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHR0MjAwdV90YWJsZSksCisJCS5yY19xdWVyeSAgICAgICAgPSBkdHQyMDB1X3JjX3F1ZXJ5LAorCX0sCiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAogCkBAIC0yNTEsMTAgKzI1NSwxMiBAQAogCX0sCiAJLnBvd2VyX2N0cmwgICAgICA9IGR0dDIwMHVfcG93ZXJfY3RybCwKIAotCS5yY19pbnRlcnZhbCAgICAgPSAzMDAsCi0JLnJjX2tleV9tYXAgICAgICA9IGlyX2NvZGVzX2R0dDIwMHVfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHR0MjAwdV90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICA9IGR0dDIwMHVfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICA9IDMwMCwKKwkJLnJjX2tleV9tYXAgICAgICA9IGlyX2NvZGVzX2R0dDIwMHVfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R0dDIwMHVfdGFibGUpLAorCQkucmNfcXVlcnkgICAgICAgID0gZHR0MjAwdV9yY19xdWVyeSwKKwl9LAogCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKIApAQCAtMjk2LDEwICszMDIsMTIgQEAKIAl9LAogCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCiAKLQkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAotCS5yY19rZXlfbWFwICAgICAgPSBpcl9jb2Rlc19kdHQyMDB1X3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R0dDIwMHVfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgPSBkdHQyMDB1X3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19pbnRlcnZhbCAgICAgPSAzMDAsCisJCS5yY19rZXlfbWFwICAgICAgPSBpcl9jb2Rlc19kdHQyMDB1X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdHQyMDB1X3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICA9IGR0dDIwMHVfcmNfcXVlcnksCisJfSwKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCBiNGFmZTZmLi4xYTc3NGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0xOTcsNiArMTk3LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfQTMxMAkJCQkweGEzMTAKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfQTg1MAkJCQkweDg1MGEKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfQTgwNQkJCQkweGE4MDUKKyNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfQTgxNU0JCQkJMHg4MTVhCiAjZGVmaW5lIFVTQl9QSURfVEVDSE5PVFJFTkRfQ09OTkVDVF9TMjQwMCAgICAgICAgICAgICAgIDB4MzAwNgogI2RlZmluZSBVU0JfUElEX1RFQ0hOT1RSRU5EX0NPTk5FQ1RfQ1QzNjUwCQkweDMwMGQKICNkZWZpbmUgVVNCX1BJRF9URVJSQVRFQ19DSU5FUkdZX0RUX1hTX0RJVkVSU0lUWQkweDAwNWEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCmluZGV4IDVkOTFmNzAuLjJlM2VhMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYwpAQCAtMTUsNyArMTUsNyBAQAogCiAvKiBkZWJ1ZyAqLwogaW50IGR2Yl91c2JfZGVidWc7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsZHZiX3VzYl9kZWJ1ZywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHZiX3VzYl9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8seGZlcj0yLHBsbD00LHRzPTgsZXJyPTE2LHJjPTMyLGZ3PTY0LG1lbT0xMjgsdXhmZXI9MjU2ICAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOwogCiBpbnQgZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmc7CkBAIC0yOSw3ICsyOSw3IEBACiBzdGF0aWMgaW50IGR2Yl91c2JfYWRhcHRlcl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgc2hvcnQgKmFkYXB0ZXJfbnJzKQogewogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXA7Ci0JaW50IHJldCxuOworCWludCByZXQsIG47CiAKIAlmb3IgKG4gPSAwOyBuIDwgZC0+cHJvcHMubnVtX2FkYXB0ZXJzOyBuKyspIHsKIAkJYWRhcCA9ICZkLT5hZGFwdGVyW25dOwpAQCAtMzgsNyArMzgsNyBAQAogCiAJCW1lbWNweSgmYWRhcC0+cHJvcHMsICZkLT5wcm9wcy5hZGFwdGVyW25dLCBzaXplb2Yoc3RydWN0IGR2Yl91c2JfYWRhcHRlcl9wcm9wZXJ0aWVzKSk7CiAKLS8qIHNwZWVkIC0gd2hlbiBydW5uaW5nIGF0IEZVTEwgc3BlZWQgd2UgbmVlZCBhIEhXIFBJRCBmaWx0ZXIgKi8KKwkJLyogc3BlZWQgLSB3aGVuIHJ1bm5pbmcgYXQgRlVMTCBzcGVlZCB3ZSBuZWVkIGEgSFcgUElEIGZpbHRlciAqLwogCQlpZiAoZC0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwgJiYgIShhZGFwLT5wcm9wcy5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSkgewogCQkJZXJyKCJUaGlzIFVTQjIuMCBkZXZpY2UgY2Fubm90IGJlIHJ1biBvbiBhIFVTQjEuMSBwb3J0LiAoaXQgbGFja3MgYSBoYXJkd2FyZSBQSUQgZmlsdGVyKSIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC00Niw3ICs0Niw3IEBACiAKIAkJaWYgKChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiBhZGFwLT5wcm9wcy5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSB8fAogCQkJKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HKSkgewotCQkJaW5mbygid2lsbCB1c2UgdGhlIGRldmljZSdzIGhhcmR3YXJlIFBJRCBmaWx0ZXIgKHRhYmxlIGNvdW50OiAlZCkuIixhZGFwLT5wcm9wcy5waWRfZmlsdGVyX2NvdW50KTsKKwkJCWluZm8oIndpbGwgdXNlIHRoZSBkZXZpY2UncyBoYXJkd2FyZSBQSUQgZmlsdGVyICh0YWJsZSBjb3VudDogJWQpLiIsIGFkYXAtPnByb3BzLnBpZF9maWx0ZXJfY291bnQpOwogCQkJYWRhcC0+cGlkX2ZpbHRlcmluZyAgPSAxOwogCQkJYWRhcC0+bWF4X2ZlZWRfY291bnQgPSBhZGFwLT5wcm9wcy5waWRfZmlsdGVyX2NvdW50OwogCQl9IGVsc2UgewpAQCAtNjQsOSArNjQsOSBAQAogCQl9CiAKIAkJaWYgKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdiA+IDApIHsKLQkJCWFkYXAtPnByaXYgPSBremFsbG9jKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdixHRlBfS0VSTkVMKTsKKwkJCWFkYXAtPnByaXYgPSBremFsbG9jKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdiwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoYWRhcC0+cHJpdiA9PSBOVUxMKSB7Ci0JCQkJZXJyKCJubyBtZW1vcnkgZm9yIHByaXYgZm9yIGFkYXB0ZXIgJWQuIixuKTsKKwkJCQllcnIoIm5vIG1lbW9yeSBmb3IgcHJpdiBmb3IgYWRhcHRlciAlZC4iLCBuKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJfQpAQCAtODYsOCArODYsOCBAQAogCSAqIHNvbWV0aW1lcyBhIHRpbWVvdXQgb2NjdXJlcywgdGhpcyBoZWxwcwogCSAqLwogCWlmIChkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCAhPSAwKSB7Ci0JCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsdXNiX3NuZGJ1bGtwaXBlKGQtPnVkZXYsZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKLQkJdXNiX2NsZWFyX2hhbHQoZC0+dWRldix1c2JfcmN2YnVsa3BpcGUoZC0+dWRldixkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkpOworCQl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKKwkJdXNiX2NsZWFyX2hhbHQoZC0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIGQtPnByb3BzLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50KSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC05Niw2ICs5Niw3IEBACiBzdGF0aWMgaW50IGR2Yl91c2JfYWRhcHRlcl9leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAlpbnQgbjsKKwogCWZvciAobiA9IDA7IG4gPCBkLT5udW1fYWRhcHRlcnNfaW5pdGlhbGl6ZWQ7IG4rKykgewogCQlkdmJfdXNiX2FkYXB0ZXJfZnJvbnRlbmRfZXhpdCgmZC0+YWRhcHRlcltuXSk7CiAJCWR2Yl91c2JfYWRhcHRlcl9kdmJfZXhpdCgmZC0+YWRhcHRlcltuXSk7CkBAIC0xMTEsMTEgKzExMiwxMSBAQAogLyogZ2VuZXJhbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KIHN0YXRpYyBpbnQgZHZiX3VzYl9leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQlkZWJfaW5mbygic3RhdGUgYmVmb3JlIGV4aXRpbmcgZXZlcnl0aGluZzogJXhcbiIsZC0+c3RhdGUpOworCWRlYl9pbmZvKCJzdGF0ZSBiZWZvcmUgZXhpdGluZyBldmVyeXRoaW5nOiAleFxuIiwgZC0+c3RhdGUpOwogCWR2Yl91c2JfcmVtb3RlX2V4aXQoZCk7CiAJZHZiX3VzYl9hZGFwdGVyX2V4aXQoZCk7CiAJZHZiX3VzYl9pMmNfZXhpdChkKTsKLQlkZWJfaW5mbygic3RhdGUgc2hvdWxkIGJlIHplcm8gbm93OiAleFxuIixkLT5zdGF0ZSk7CisJZGViX2luZm8oInN0YXRlIHNob3VsZCBiZSB6ZXJvIG5vdzogJXhcbiIsIGQtPnN0YXRlKTsKIAlkLT5zdGF0ZSA9IERWQl9VU0JfU1RBVEVfSU5JVDsKIAlrZnJlZShkLT5wcml2KTsKIAlrZnJlZShkKTsKQEAgLTEzMiwxNCArMTMzLDE0IEBACiAJZC0+c3RhdGUgPSBEVkJfVVNCX1NUQVRFX0lOSVQ7CiAKIAlpZiAoZC0+cHJvcHMuc2l6ZV9vZl9wcml2ID4gMCkgewotCQlkLT5wcml2ID0ga3phbGxvYyhkLT5wcm9wcy5zaXplX29mX3ByaXYsR0ZQX0tFUk5FTCk7CisJCWQtPnByaXYgPSBremFsbG9jKGQtPnByb3BzLnNpemVfb2ZfcHJpdiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChkLT5wcml2ID09IE5VTEwpIHsKIAkJCWVycigibm8gbWVtb3J5IGZvciBwcml2IGluICdzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UnIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAotLyogY2hlY2sgdGhlIGNhcGFiaWxpdGllcyBhbmQgc2V0IGFwcHJvcHJpYXRlIHZhcmlhYmxlcyAqLworCS8qIGNoZWNrIHRoZSBjYXBhYmlsaXRpZXMgYW5kIHNldCBhcHByb3ByaWF0ZSB2YXJpYWJsZXMgKi8KIAlkdmJfdXNiX2RldmljZV9wb3dlcl9jdHJsKGQsIDEpOwogCiAJaWYgKChyZXQgPSBkdmJfdXNiX2kyY19pbml0KGQpKSB8fApAQCAtMTU3LDE2ICsxNTgsMTcgQEAKIH0KIAogLyogZGV0ZXJtaW5lIHRoZSBuYW1lIGFuZCB0aGUgc3RhdGUgb2YgdGhlIGp1c3QgZm91bmQgVVNCIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqIGR2Yl91c2JfZmluZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgKnByb3BzLCBpbnQgKmNvbGQpCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uICpkdmJfdXNiX2ZpbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyAqcHJvcHMsIGludCAqY29sZCkKIHsKLQlpbnQgaSxqOworCWludCBpLCBqOwogCXN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqZGVzYyA9IE5VTEw7CisKIAkqY29sZCA9IC0xOwogCiAJZm9yIChpID0gMDsgaSA8IHByb3BzLT5udW1fZGV2aWNlX2Rlc2NzOyBpKyspIHsKIAogCQlmb3IgKGogPSAwOyBqIDwgRFZCX1VTQl9JRF9NQVhfTlVNICYmIHByb3BzLT5kZXZpY2VzW2ldLmNvbGRfaWRzW2pdICE9IE5VTEw7IGorKykgewotCQkJZGViX2luZm8oImNoZWNrIGZvciBjb2xkICV4ICV4XG4iLHByb3BzLT5kZXZpY2VzW2ldLmNvbGRfaWRzW2pdLT5pZFZlbmRvciwgcHJvcHMtPmRldmljZXNbaV0uY29sZF9pZHNbal0tPmlkUHJvZHVjdCk7CisJCQlkZWJfaW5mbygiY2hlY2sgZm9yIGNvbGQgJXggJXhcbiIsIHByb3BzLT5kZXZpY2VzW2ldLmNvbGRfaWRzW2pdLT5pZFZlbmRvciwgcHJvcHMtPmRldmljZXNbaV0uY29sZF9pZHNbal0tPmlkUHJvZHVjdCk7CiAJCQlpZiAocHJvcHMtPmRldmljZXNbaV0uY29sZF9pZHNbal0tPmlkVmVuZG9yICA9PSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSAmJgogCQkJCXByb3BzLT5kZXZpY2VzW2ldLmNvbGRfaWRzW2pdLT5pZFByb2R1Y3QgPT0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSB7CiAJCQkJKmNvbGQgPSAxOwpAQCAtMTc5LDcgKzE4MSw3IEBACiAJCQlicmVhazsKIAogCQlmb3IgKGogPSAwOyBqIDwgRFZCX1VTQl9JRF9NQVhfTlVNICYmIHByb3BzLT5kZXZpY2VzW2ldLndhcm1faWRzW2pdICE9IE5VTEw7IGorKykgewotCQkJZGViX2luZm8oImNoZWNrIGZvciB3YXJtICV4ICV4XG4iLHByb3BzLT5kZXZpY2VzW2ldLndhcm1faWRzW2pdLT5pZFZlbmRvciwgcHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkUHJvZHVjdCk7CisJCQlkZWJfaW5mbygiY2hlY2sgZm9yIHdhcm0gJXggJXhcbiIsIHByb3BzLT5kZXZpY2VzW2ldLndhcm1faWRzW2pdLT5pZFZlbmRvciwgcHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkUHJvZHVjdCk7CiAJCQlpZiAocHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkVmVuZG9yID09IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICYmCiAJCQkJcHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkUHJvZHVjdCA9PSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKIAkJCQkqY29sZCA9IDA7CkBAIC0xOTAsNyArMTkyLDcgQEAKIAl9CiAKIAlpZiAoZGVzYyAhPSBOVUxMICYmIHByb3BzLT5pZGVudGlmeV9zdGF0ZSAhPSBOVUxMKQotCQlwcm9wcy0+aWRlbnRpZnlfc3RhdGUodWRldixwcm9wcywmZGVzYyxjb2xkKTsKKwkJcHJvcHMtPmlkZW50aWZ5X3N0YXRlKHVkZXYsIHByb3BzLCAmZGVzYywgY29sZCk7CiAKIAlyZXR1cm4gZGVzYzsKIH0KQEAgLTIwMiw3ICsyMDQsNyBAQAogCWVsc2UKIAkJZC0+cG93ZXJlZC0tOwogCi0JaWYgKGQtPnBvd2VyZWQgPT0gMCB8fCAob25vZmYgJiYgZC0+cG93ZXJlZCA9PSAxKSkgeyAvLyB3aGVuIHN3aXRjaGluZyBmcm9tIDEgdG8gMCBvciBmcm9tIDAgdG8gMQorCWlmIChkLT5wb3dlcmVkID09IDAgfHwgKG9ub2ZmICYmIGQtPnBvd2VyZWQgPT0gMSkpIHsgLyogd2hlbiBzd2l0Y2hpbmcgZnJvbSAxIHRvIDAgb3IgZnJvbSAwIHRvIDEgKi8KIAkJZGViX2luZm8oInBvd2VyIGNvbnRyb2w6ICVkXG4iLCBvbm9mZik7CiAJCWlmIChkLT5wcm9wcy5wb3dlcl9jdHJsKQogCQkJcmV0dXJuIGQtPnByb3BzLnBvd2VyX2N0cmwoZCwgb25vZmYpOwpAQCAtMjIyLDMyICsyMjQsMzIgQEAKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBOVUxMOwogCXN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqZGVzYyA9IE5VTEw7CiAKLQlpbnQgcmV0ID0gLUVOT01FTSxjb2xkPTA7CisJaW50IHJldCA9IC1FTk9NRU0sIGNvbGQgPSAwOwogCiAJaWYgKGR1ICE9IE5VTEwpCiAJCSpkdSA9IE5VTEw7CiAKLQlpZiAoKGRlc2MgPSBkdmJfdXNiX2ZpbmRfZGV2aWNlKHVkZXYscHJvcHMsJmNvbGQpKSA9PSBOVUxMKSB7CisJaWYgKChkZXNjID0gZHZiX3VzYl9maW5kX2RldmljZSh1ZGV2LCBwcm9wcywgJmNvbGQpKSA9PSBOVUxMKSB7CiAJCWRlYl9lcnIoInNvbWV0aGluZyB3ZW50IHZlcnkgd3JvbmcsIGRldmljZSB3YXMgbm90IGZvdW5kIGluIGN1cnJlbnQgZGV2aWNlIGxpc3QgLSBsZXQncyBzZWUgd2hhdCBjb21lcyBuZXh0LlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChjb2xkKSB7Ci0JCWluZm8oImZvdW5kIGEgJyVzJyBpbiBjb2xkIHN0YXRlLCB3aWxsIHRyeSB0byBsb2FkIGEgZmlybXdhcmUiLGRlc2MtPm5hbWUpOwotCQlyZXQgPSBkdmJfdXNiX2Rvd25sb2FkX2Zpcm13YXJlKHVkZXYscHJvcHMpOworCQlpbmZvKCJmb3VuZCBhICclcycgaW4gY29sZCBzdGF0ZSwgd2lsbCB0cnkgdG8gbG9hZCBhIGZpcm13YXJlIiwgZGVzYy0+bmFtZSk7CisJCXJldCA9IGR2Yl91c2JfZG93bmxvYWRfZmlybXdhcmUodWRldiwgcHJvcHMpOwogCQlpZiAoIXByb3BzLT5ub19yZWNvbm5lY3QgfHwgcmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWluZm8oImZvdW5kIGEgJyVzJyBpbiB3YXJtIHN0YXRlLiIsZGVzYy0+bmFtZSk7Ci0JCWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UpLEdGUF9LRVJORUwpOworCWluZm8oImZvdW5kIGEgJyVzJyBpbiB3YXJtIHN0YXRlLiIsIGRlc2MtPm5hbWUpOworCWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZCA9PSBOVUxMKSB7CiAJCWVycigibm8gbWVtb3J5IGZvciAnc3RydWN0IGR2Yl91c2JfZGV2aWNlJyIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlkLT51ZGV2ID0gdWRldjsKLQltZW1jcHkoJmQtPnByb3BzLHByb3BzLHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcykpOworCW1lbWNweSgmZC0+cHJvcHMsIHByb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMpKTsKIAlkLT5kZXNjID0gZGVzYzsKIAlkLT5vd25lciA9IG93bmVyOwogCkBAIC0yNTksOSArMjYxLDkgQEAKIAlyZXQgPSBkdmJfdXNiX2luaXQoZCwgYWRhcHRlcl9udW1zKTsKIAogCWlmIChyZXQgPT0gMCkKLQkJaW5mbygiJXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCBjb25uZWN0ZWQuIixkZXNjLT5uYW1lKTsKKwkJaW5mbygiJXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCBjb25uZWN0ZWQuIiwgZGVzYy0+bmFtZSk7CiAJZWxzZQotCQlpbmZvKCIlcyBlcnJvciB3aGlsZSBsb2FkaW5nIGRyaXZlciAoJWQpIixkZXNjLT5uYW1lLHJldCk7CisJCWluZm8oIiVzIGVycm9yIHdoaWxlIGxvYWRpbmcgZHJpdmVyICglZCkiLCBkZXNjLT5uYW1lLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGR2Yl91c2JfZGV2aWNlX2luaXQpOwpAQCAtMjcxLDEyICsyNzMsMTIgQEAKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWNvbnN0IGNoYXIgKm5hbWUgPSAiZ2VuZXJpYyBEVkItVVNCIG1vZHVsZSI7CiAKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsTlVMTCk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlpZiAoZCAhPSBOVUxMICYmIGQtPmRlc2MgIT0gTlVMTCkgewogCQluYW1lID0gZC0+ZGVzYy0+bmFtZTsKIAkJZHZiX3VzYl9leGl0KGQpOwogCX0KLQlpbmZvKCIlcyBzdWNjZXNzZnVsbHkgZGVpbml0aWFsaXplZCBhbmQgZGlzY29ubmVjdGVkLiIsbmFtZSk7CisJaW5mbygiJXMgc3VjY2Vzc2Z1bGx5IGRlaW5pdGlhbGl6ZWQgYW5kIGRpc2Nvbm5lY3RlZC4iLCBuYW1lKTsKIAogfQogRVhQT1JUX1NZTUJPTChkdmJfdXNiX2RldmljZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYwppbmRleCA4NTJmZTg5Li5iNTc5ZmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jCkBAIC04LDI5ICs4LDI5IEBACiAjaW5jbHVkZSAiZHZiLXVzYi1jb21tb24uaCIKICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KIAotc3RhdGljIGludCBkdmJfdXNiX2dldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LAorc3RhdGljIGludCBsZWdhY3lfZHZiX3VzYl9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKIAkJCQl1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCAqa2V5Y29kZSkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCi0Jc3RydWN0IGR2Yl91c2JfcmNfa2V5ICprZXltYXAgPSBkLT5wcm9wcy5yY19rZXlfbWFwOworCXN0cnVjdCBpcl9zY2FuY29kZSAqa2V5bWFwID0gZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXA7CiAJaW50IGk7CiAKIAkvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSByYXcga2V5IGNvZGUuICovCi0JZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQotCQlpZiAoa2V5bWFwW2ldLnNjYW4gPT0gc2NhbmNvZGUpIHsKLQkJCSprZXljb2RlID0ga2V5bWFwW2ldLmV2ZW50OworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplOyBpKyspCisJCWlmIChrZXltYXBbaV0uc2NhbmNvZGUgPT0gc2NhbmNvZGUpIHsKKwkJCSprZXljb2RlID0ga2V5bWFwW2ldLmtleWNvZGU7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJLyoKIAkgKiBJZiBpcyB0aGVyZSBleHRyYSBzcGFjZSwgcmV0dXJucyBLRVlfUkVTRVJWRUQsCi0JICogb3RoZXJ3aXNlLCBpbnB1dCBjb3JlIHdvbid0IGxldCBkdmJfdXNiX3NldGtleWNvZGUKKwkgKiBvdGhlcndpc2UsIGlucHV0IGNvcmUgd29uJ3QgbGV0IGxlZ2FjeV9kdmJfdXNiX3NldGtleWNvZGUKIAkgKiB0byB3b3JrCiAJICovCi0JZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQotCQlpZiAoa2V5bWFwW2ldLmV2ZW50ID09IEtFWV9SRVNFUlZFRCB8fAotCQkgICAga2V5bWFwW2ldLmV2ZW50ID09IEtFWV9VTktOT1dOKSB7CisJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemU7IGkrKykKKwkJaWYgKGtleW1hcFtpXS5rZXljb2RlID09IEtFWV9SRVNFUlZFRCB8fAorCQkgICAga2V5bWFwW2ldLmtleWNvZGUgPT0gS0VZX1VOS05PV04pIHsKIAkJCSprZXljb2RlID0gS0VZX1JFU0VSVkVEOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM4LDI3ICszOCwyNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGR2Yl91c2Jfc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCitzdGF0aWMgaW50IGxlZ2FjeV9kdmJfdXNiX3NldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LAogCQkJCXVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqa2V5bWFwID0gZC0+cHJvcHMucmNfa2V5X21hcDsKKwlzdHJ1Y3QgaXJfc2NhbmNvZGUgKmtleW1hcCA9IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwOwogCWludCBpOwogCiAJLyogU2VhcmNoIGlmIGl0IGlzIHJlcGxhY2luZyBhbiBleGlzdGluZyBrZXljb2RlICovCi0JZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQotCQlpZiAoa2V5bWFwW2ldLnNjYW4gPT0gc2NhbmNvZGUpIHsKLQkJCWtleW1hcFtpXS5ldmVudCA9IGtleWNvZGU7CisJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemU7IGkrKykKKwkJaWYgKGtleW1hcFtpXS5zY2FuY29kZSA9PSBzY2FuY29kZSkgeworCQkJa2V5bWFwW2ldLmtleWNvZGUgPSBrZXljb2RlOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCS8qIFNlYXJjaCBpZiBpcyB0aGVyZSBhIGNsZWFuIGVudHJ5LiBJZiBzbywgdXNlIGl0ICovCi0JZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQotCQlpZiAoa2V5bWFwW2ldLmV2ZW50ID09IEtFWV9SRVNFUlZFRCB8fAotCQkgICAga2V5bWFwW2ldLmV2ZW50ID09IEtFWV9VTktOT1dOKSB7Ci0JCQlrZXltYXBbaV0uc2NhbiA9IHNjYW5jb2RlOwotCQkJa2V5bWFwW2ldLmV2ZW50ID0ga2V5Y29kZTsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZTsgaSsrKQorCQlpZiAoa2V5bWFwW2ldLmtleWNvZGUgPT0gS0VZX1JFU0VSVkVEIHx8CisJCSAgICBrZXltYXBbaV0ua2V5Y29kZSA9PSBLRVlfVU5LTk9XTikgeworCQkJa2V5bWFwW2ldLnNjYW5jb2RlID0gc2NhbmNvZGU7CisJCQlrZXltYXBbaV0ua2V5Y29kZSA9IGtleWNvZGU7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC03OCw3ICs3OCw3IEBACiAgKgogICogVE9ETzogRml4IHRoZSByZXBlYXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGV2aWNlLgogICovCi1zdGF0aWMgdm9pZCBkdmJfdXNiX3JlYWRfcmVtb3RlX2NvbnRyb2woc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgbGVnYWN5X2R2Yl91c2JfcmVhZF9yZW1vdGVfY29udHJvbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkdmJfdXNiX2RldmljZSwgcmNfcXVlcnlfd29yay53b3JrKTsKQEAgLTkyLDcgKzkyLDcgQEAKIAlpZiAoZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmcpCiAJCXJldHVybjsKIAotCWlmIChkLT5wcm9wcy5yY19xdWVyeShkLCZldmVudCwmc3RhdGUpKSB7CisJaWYgKGQtPnByb3BzLnJjLmxlZ2FjeS5yY19xdWVyeShkLCZldmVudCwmc3RhdGUpKSB7CiAJCWVycigiZXJyb3Igd2hpbGUgcXVlcnlpbmcgZm9yIGFuIHJlbW90ZSBjb250cm9sIGV2ZW50LiIpOwogCQlnb3RvIHNjaGVkdWxlOwogCX0KQEAgLTE1MSwxOCArMTUxLDExNyBAQAogKi8KIAogc2NoZWR1bGU6Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkLT5yY19xdWVyeV93b3JrLG1zZWNzX3RvX2ppZmZpZXMoZC0+cHJvcHMucmNfaW50ZXJ2YWwpKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmQtPnJjX3F1ZXJ5X3dvcmssbXNlY3NfdG9famlmZmllcyhkLT5wcm9wcy5yYy5sZWdhY3kucmNfaW50ZXJ2YWwpKTsKK30KKworc3RhdGljIGludCBsZWdhY3lfZHZiX3VzYl9yZW1vdGVfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsCisJCQkJICAgICAgc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQoreworCWludCBpLCBlcnIsIHJjX2ludGVydmFsOworCisJaW5wdXRfZGV2LT5nZXRrZXljb2RlID0gbGVnYWN5X2R2Yl91c2JfZ2V0a2V5Y29kZTsKKwlpbnB1dF9kZXYtPnNldGtleWNvZGUgPSBsZWdhY3lfZHZiX3VzYl9zZXRrZXljb2RlOworCisJLyogc2V0IHRoZSBiaXRzIGZvciB0aGUga2V5cyAqLworCWRlYl9yYygia2V5IG1hcCBzaXplOiAlZFxuIiwgZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemU7IGkrKykgeworCQlkZWJfcmMoInNldHRpbmcgYml0IGZvciBldmVudCAlZCBpdGVtICVkXG4iLAorCQkJZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBbaV0ua2V5Y29kZSwgaSk7CisJCXNldF9iaXQoZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBbaV0ua2V5Y29kZSwgaW5wdXRfZGV2LT5rZXliaXQpOworCX0KKworCS8qIHNldHRpbmcgdGhlc2UgdHdvIHZhbHVlcyB0byBub24temVybywgd2UgaGF2ZSB0byBtYW5hZ2Uga2V5IHJlcGVhdHMgKi8KKwlpbnB1dF9kZXYtPnJlcFtSRVBfUEVSSU9EXSA9IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19pbnRlcnZhbDsKKwlpbnB1dF9kZXYtPnJlcFtSRVBfREVMQVldICA9IGQtPnByb3BzLnJjLmxlZ2FjeS5yY19pbnRlcnZhbCArIDE1MDsKKworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgZCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCisJcmNfaW50ZXJ2YWwgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfaW50ZXJ2YWw7CisKKwlJTklUX0RFTEFZRURfV09SSygmZC0+cmNfcXVlcnlfd29yaywgbGVnYWN5X2R2Yl91c2JfcmVhZF9yZW1vdGVfY29udHJvbCk7CisKKwlpbmZvKCJzY2hlZHVsZSByZW1vdGUgcXVlcnkgaW50ZXJ2YWwgdG8gJWQgbXNlY3MuIiwgcmNfaW50ZXJ2YWwpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZC0+cmNfcXVlcnlfd29yaywKKwkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMocmNfaW50ZXJ2YWwpKTsKKworCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfUkVNT1RFOworCisJcmV0dXJuIGVycjsKK30KKworLyogUmVtb3RlLWNvbnRyb2wgcG9sbCBmdW5jdGlvbiAtIGNhbGxlZCBldmVyeSBkaWItPnJjX3F1ZXJ5X2ludGVydmFsIG1zIHRvIHNlZQorICogd2hldGhlciB0aGUgcmVtb3RlIGNvbnRyb2wgaGFzIHJlY2VpdmVkIGFueXRoaW5nLgorICoKKyAqIFRPRE86IEZpeCB0aGUgcmVwZWF0IHJhdGUgb2YgdGhlIGlucHV0IGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgZHZiX3VzYl9yZWFkX3JlbW90ZV9jb250cm9sKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGR2Yl91c2JfZGV2aWNlLCByY19xdWVyeV93b3JrLndvcmspOworCWludCBlcnI7CisKKwkvKiBUT0RPOiBuZWVkIGEgbG9jayBoZXJlLiAgV2UgY2FuIHNpbXBseSBza2lwIGNoZWNraW5nIGZvciB0aGUgcmVtb3RlIGNvbnRyb2wKKwkgICBpZiB3ZSdyZSBidXN5LiAqLworCisJLyogd2hlbiB0aGUgcGFyYW1ldGVyIGhhcyBiZWVuIHNldCB0byAxIHZpYSBzeXNmcyB3aGlsZSB0aGUKKwkgKiBkcml2ZXIgd2FzIHJ1bm5pbmcsIG9yIHdoZW4gYnVsayBtb2RlIGlzIGVuYWJsZWQgYWZ0ZXIgSVIgaW5pdAorCSAqLworCWlmIChkdmJfdXNiX2Rpc2FibGVfcmNfcG9sbGluZyB8fCBkLT5wcm9wcy5yYy5jb3JlLmJ1bGtfbW9kZSkKKwkJcmV0dXJuOworCisJZXJyID0gZC0+cHJvcHMucmMuY29yZS5yY19xdWVyeShkKTsKKwlpZiAoZXJyKQorCQllcnIoImVycm9yICVkIHdoaWxlIHF1ZXJ5aW5nIGZvciBhbiByZW1vdGUgY29udHJvbCBldmVudC4iLCBlcnIpOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkLT5yY19xdWVyeV93b3JrLAorCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhkLT5wcm9wcy5yYy5jb3JlLnJjX2ludGVydmFsKSk7Cit9CisKK3N0YXRpYyBpbnQgcmNfY29yZV9kdmJfdXNiX3JlbW90ZV9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwKKwkJCQkgICAgICAgc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQoreworCWludCBlcnIsIHJjX2ludGVydmFsOworCisJZC0+cHJvcHMucmMuY29yZS5yY19wcm9wcy5wcml2ID0gZDsKKwllcnIgPSBpcl9pbnB1dF9yZWdpc3RlcihpbnB1dF9kZXYsCisJCQkJIGQtPnByb3BzLnJjLmNvcmUucmNfY29kZXMsCisJCQkJICZkLT5wcm9wcy5yYy5jb3JlLnJjX3Byb3BzLAorCQkJCSBkLT5wcm9wcy5yYy5jb3JlLm1vZHVsZV9uYW1lKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICghZC0+cHJvcHMucmMuY29yZS5yY19xdWVyeSB8fCBkLT5wcm9wcy5yYy5jb3JlLmJ1bGtfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBQb2xsaW5nIG1vZGUgLSBpbml0aWFsaXplIGEgd29yayBxdWV1ZSBmb3IgaGFuZGxpbmcgaXQgKi8KKwlJTklUX0RFTEFZRURfV09SSygmZC0+cmNfcXVlcnlfd29yaywgZHZiX3VzYl9yZWFkX3JlbW90ZV9jb250cm9sKTsKKworCXJjX2ludGVydmFsID0gZC0+cHJvcHMucmMuY29yZS5yY19pbnRlcnZhbDsKKworCWluZm8oInNjaGVkdWxlIHJlbW90ZSBxdWVyeSBpbnRlcnZhbCB0byAlZCBtc2Vjcy4iLCByY19pbnRlcnZhbCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkLT5yY19xdWVyeV93b3JrLAorCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhyY19pbnRlcnZhbCkpOworCisJcmV0dXJuIDA7CiB9CiAKIGludCBkdmJfdXNiX3JlbW90ZV9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0JaW50IGk7CiAJaW50IGVycjsKIAotCWlmIChkLT5wcm9wcy5yY19rZXlfbWFwID09IE5VTEwgfHwKLQkJZC0+cHJvcHMucmNfcXVlcnkgPT0gTlVMTCB8fAotCQlkdmJfdXNiX2Rpc2FibGVfcmNfcG9sbGluZykKKwlpZiAoZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmcpCisJCXJldHVybiAwOworCisJaWYgKGQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwICYmIGQtPnByb3BzLnJjLmxlZ2FjeS5yY19xdWVyeSkKKwkJZC0+cHJvcHMucmMubW9kZSA9IERWQl9SQ19MRUdBQ1k7CisJZWxzZSBpZiAoZC0+cHJvcHMucmMuY29yZS5yY19jb2RlcykKKwkJZC0+cHJvcHMucmMubW9kZSA9IERWQl9SQ19DT1JFOworCWVsc2UKIAkJcmV0dXJuIDA7CiAKIAl1c2JfbWFrZV9wYXRoKGQtPnVkZXYsIGQtPnJjX3BoeXMsIHNpemVvZihkLT5yY19waHlzKSk7CkBAIC0xNzcsMzkgKzI3NiwxOSBAQAogCWlucHV0X2Rldi0+cGh5cyA9IGQtPnJjX3BoeXM7CiAJdXNiX3RvX2lucHV0X2lkKGQtPnVkZXYsICZpbnB1dF9kZXYtPmlkKTsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmZC0+dWRldi0+ZGV2OwotCWlucHV0X2Rldi0+Z2V0a2V5Y29kZSA9IGR2Yl91c2JfZ2V0a2V5Y29kZTsKLQlpbnB1dF9kZXYtPnNldGtleWNvZGUgPSBkdmJfdXNiX3NldGtleWNvZGU7Ci0KLQkvKiBzZXQgdGhlIGJpdHMgZm9yIHRoZSBrZXlzICovCi0JZGViX3JjKCJrZXkgbWFwIHNpemU6ICVkXG4iLCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemUpOwotCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgewotCQlkZWJfcmMoInNldHRpbmcgYml0IGZvciBldmVudCAlZCBpdGVtICVkXG4iLAotCQkJZC0+cHJvcHMucmNfa2V5X21hcFtpXS5ldmVudCwgaSk7Ci0JCXNldF9iaXQoZC0+cHJvcHMucmNfa2V5X21hcFtpXS5ldmVudCwgaW5wdXRfZGV2LT5rZXliaXQpOwotCX0KIAogCS8qIFN0YXJ0IHRoZSByZW1vdGUtY29udHJvbCBwb2xsaW5nLiAqLwotCWlmIChkLT5wcm9wcy5yY19pbnRlcnZhbCA8IDQwKQotCQlkLT5wcm9wcy5yY19pbnRlcnZhbCA9IDEwMDsgLyogZGVmYXVsdCAqLwotCi0JLyogc2V0dGluZyB0aGVzZSB0d28gdmFsdWVzIHRvIG5vbi16ZXJvLCB3ZSBoYXZlIHRvIG1hbmFnZSBrZXkgcmVwZWF0cyAqLwotCWlucHV0X2Rldi0+cmVwW1JFUF9QRVJJT0RdID0gZC0+cHJvcHMucmNfaW50ZXJ2YWw7Ci0JaW5wdXRfZGV2LT5yZXBbUkVQX0RFTEFZXSAgPSBkLT5wcm9wcy5yY19pbnRlcnZhbCArIDE1MDsKLQotCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgZCk7Ci0KLQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWlmIChkLT5wcm9wcy5yYy5sZWdhY3kucmNfaW50ZXJ2YWwgPCA0MCkKKwkJZC0+cHJvcHMucmMubGVnYWN5LnJjX2ludGVydmFsID0gMTAwOyAvKiBkZWZhdWx0ICovCiAKIAlkLT5yY19pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CiAKLQlJTklUX0RFTEFZRURfV09SSygmZC0+cmNfcXVlcnlfd29yaywgZHZiX3VzYl9yZWFkX3JlbW90ZV9jb250cm9sKTsKLQotCWluZm8oInNjaGVkdWxlIHJlbW90ZSBxdWVyeSBpbnRlcnZhbCB0byAlZCBtc2Vjcy4iLCBkLT5wcm9wcy5yY19pbnRlcnZhbCk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkLT5yY19xdWVyeV93b3JrLG1zZWNzX3RvX2ppZmZpZXMoZC0+cHJvcHMucmNfaW50ZXJ2YWwpKTsKKwlpZiAoZC0+cHJvcHMucmMubW9kZSA9PSBEVkJfUkNfTEVHQUNZKQorCQllcnIgPSBsZWdhY3lfZHZiX3VzYl9yZW1vdGVfaW5pdChkLCBpbnB1dF9kZXYpOworCWVsc2UKKwkJZXJyID0gcmNfY29yZV9kdmJfdXNiX3JlbW90ZV9pbml0KGQsIGlucHV0X2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfUkVNT1RFOwogCkBAIC0yMjEsNyArMzAwLDEwIEBACiAJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9SRU1PVEUpIHsKIAkJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmZC0+cmNfcXVlcnlfd29yayk7CiAJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGQtPnJjX2lucHV0X2Rldik7CisJCWlmIChkLT5wcm9wcy5yYy5tb2RlID09IERWQl9SQ19MRUdBQ1kpCisJCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkLT5yY19pbnB1dF9kZXYpOworCQllbHNlCisJCQlpcl9pbnB1dF91bnJlZ2lzdGVyKGQtPnJjX2lucHV0X2Rldik7CiAJfQogCWQtPnN0YXRlICY9IH5EVkJfVVNCX1NUQVRFX1JFTU9URTsKIAlyZXR1cm4gMDsKQEAgLTIzNCw3ICszMTYsNyBAQAogCQl1OCBrZXlidWZbNV0sIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGR2Yl91c2JfcmNfa2V5ICprZXltYXAgPSBkLT5wcm9wcy5yY19rZXlfbWFwOworCXN0cnVjdCBpcl9zY2FuY29kZSAqa2V5bWFwID0gZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXA7CiAJKmV2ZW50ID0gMDsKIAkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CiAJc3dpdGNoIChrZXlidWZbMF0pIHsKQEAgLTI0NywxMCArMzI5LDEwIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQkvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSByYXcga2V5IGNvZGUuICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmNfa2V5X21hcF9zaXplOyBpKyspCisJCQlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZTsgaSsrKQogCQkJCWlmIChyYzVfY3VzdG9tKCZrZXltYXBbaV0pID09IGtleWJ1ZlsxXSAmJgogCQkJCQlyYzVfZGF0YSgma2V5bWFwW2ldKSA9PSBrZXlidWZbM10pIHsKLQkJCQkJKmV2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OworCQkJCQkqZXZlbnQgPSBrZXltYXBbaV0ua2V5Y29kZTsKIAkJCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOwogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDRhOWY2NzYuLjM0ZjdiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPG1lZGlhL2lyLWNvcmUuaD4KIAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgImR2Yl9kZW11eC5oIgpAQCAtNzQsMzAgKzc1LDE5IEBACiAJc3RydWN0IHVzYl9kZXZpY2VfaWQgKndhcm1faWRzW0RWQl9VU0JfSURfTUFYX05VTV07CiB9OwogCi0vKioKLSAqIHN0cnVjdCBkdmJfdXNiX3JjX2tleSAtIGEgcmVtb3RlIGNvbnRyb2wga2V5IGFuZCBpdHMgaW5wdXQtZXZlbnQKLSAqIEBjdXN0b206IHRoZSB2ZW5kb3IvY3VzdG9tIHBhcnQgb2YgdGhlIGtleQotICogQGRhdGE6IHRoZSBhY3R1YWwga2V5IHBhcnQKLSAqIEBldmVudDogdGhlIGlucHV0IGV2ZW50IGFzc2lnbmVkIHRvIGtleSBpZGVudGlmaWVkIGJ5IGN1c3RvbSBhbmQgZGF0YQotICovCi1zdHJ1Y3QgZHZiX3VzYl9yY19rZXkgewotCXUxNiBzY2FuOwotCXUzMiBldmVudDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTggcmM1X2N1c3RvbShzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleSkKK3N0YXRpYyBpbmxpbmUgdTggcmM1X2N1c3RvbShzdHJ1Y3QgaXJfc2NhbmNvZGUgKmtleSkKIHsKLQlyZXR1cm4gKGtleS0+c2NhbiA+PiA4KSAmIDB4ZmY7CisJcmV0dXJuIChrZXktPnNjYW5jb2RlID4+IDgpICYgMHhmZjsKIH0KIAotc3RhdGljIGlubGluZSB1OCByYzVfZGF0YShzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleSkKK3N0YXRpYyBpbmxpbmUgdTggcmM1X2RhdGEoc3RydWN0IGlyX3NjYW5jb2RlICprZXkpCiB7Ci0JcmV0dXJuIGtleS0+c2NhbiAmIDB4ZmY7CisJcmV0dXJuIGtleS0+c2NhbmNvZGUgJiAweGZmOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IHJjNV9zY2FuKHN0cnVjdCBkdmJfdXNiX3JjX2tleSAqa2V5KQorc3RhdGljIGlubGluZSB1OCByYzVfc2NhbihzdHJ1Y3QgaXJfc2NhbmNvZGUgKmtleSkKIHsKLQlyZXR1cm4ga2V5LT5zY2FuICYgMHhmZmZmOworCXJldHVybiBrZXktPnNjYW5jb2RlICYgMHhmZmZmOwogfQogCiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2U7CkBAIC0xNjgsNiArMTU4LDU1IEBACiB9OwogCiAvKioKKyAqIHN0cnVjdCBkdmJfcmNfbGVnYWN5IC0gb2xkIHByb3BlcnRpZXMgb2YgcmVtb3RlIGNvbnRyb2xsZXIKKyAqIEByY19rZXlfbWFwOiBhIGhhcmQtd2lyZWQgYXJyYXkgb2Ygc3RydWN0IGlyX3NjYW5jb2RlIChOVUxMIHRvIGRpc2FibGUKKyAqICByZW1vdGUgY29udHJvbCBoYW5kbGluZykuCisgKiBAcmNfa2V5X21hcF9zaXplOiBudW1iZXIgb2YgaXRlbXMgaW4gQHJjX2tleV9tYXAuCisgKiBAcmNfcXVlcnk6IGNhbGxlZCB0byBxdWVyeSBhbiBldmVudCBldmVudC4KKyAqIEByY19pbnRlcnZhbDogdGltZSBpbiBtcyBiZXR3ZWVuIHR3byBxdWVyaWVzLgorICovCitzdHJ1Y3QgZHZiX3JjX2xlZ2FjeSB7CisvKiByZW1vdGUgY29udHJvbCBwcm9wZXJ0aWVzICovCisjZGVmaW5lIFJFTU9URV9OT19LRVlfUFJFU1NFRCAgICAgIDB4MDAKKyNkZWZpbmUgUkVNT1RFX0tFWV9QUkVTU0VEICAgICAgICAgMHgwMQorI2RlZmluZSBSRU1PVEVfS0VZX1JFUEVBVCAgICAgICAgICAweDAyCisJc3RydWN0IGlyX3NjYW5jb2RlICAqcmNfa2V5X21hcDsKKwlpbnQgcmNfa2V5X21hcF9zaXplOworCWludCAoKnJjX3F1ZXJ5KSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHUzMiAqLCBpbnQgKik7CisJaW50IHJjX2ludGVydmFsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHZiX3JjIHByb3BlcnRpZXMgb2YgcmVtb3RlIGNvbnRyb2xsZXIsIHVzaW5nIHJjLWNvcmUKKyAqIEByY19jb2RlczogbmFtZSBvZiByYyBjb2RlcyB0YWJsZQorICogQHByb3RvY29sOiB0eXBlIG9mIHByb3RvY29sKHMpIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBkcml2ZXIKKyAqIEByY19xdWVyeTogY2FsbGVkIHRvIHF1ZXJ5IGFuIGV2ZW50IGV2ZW50LgorICogQHJjX2ludGVydmFsOiB0aW1lIGluIG1zIGJldHdlZW4gdHdvIHF1ZXJpZXMuCisgKiBAcmNfcHJvcHM6IHJlbW90ZSBjb250cm9sbGVyIHByb3BlcnRpZXMKKyAqIEBidWxrX21vZGU6IGRldmljZSBzdXBwb3J0cyBidWxrIG1vZGUgZm9yIFJDIChkaXNhYmxlIHBvbGxpbmcgbW9kZSkKKyAqLworc3RydWN0IGR2Yl9yYyB7CisJY2hhciAqcmNfY29kZXM7CisJdTY0IHByb3RvY29sOworCWNoYXIgKm1vZHVsZV9uYW1lOworCWludCAoKnJjX3F1ZXJ5KSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKTsKKwlpbnQgcmNfaW50ZXJ2YWw7CisJc3RydWN0IGlyX2Rldl9wcm9wcyByY19wcm9wczsKKwlib29sIGJ1bGtfbW9kZTsJCQkJLyogdXNlcyBidWxrIG1vZGUgKi8KK307CisKKy8qKgorICogZW51bSBkdmJfdXNiX21vZGUgLSBTcGVjaWZpZXMgaWYgaXQgaXMgdXNpbmcgYSBsZWdhY3kgZHJpdmVyIG9yIGEgbmV3IG9uZQorICoJCSAgICAgICBiYXNlZCBvbiByYy1jb3JlCisgKiBUaGlzIGlzIGluaXRpYWxpemVkL3VzZWQgb25seSBpbnNpZGUgZHZiLXVzYi1yZW1vdGUuYy4KKyAqIEl0IHNob3VsZG4ndCBiZSBzZXQgYnkgdGhlIGRyaXZlcnMuCisgKi8KK2VudW0gZHZiX3VzYl9tb2RlIHsKKwlEVkJfUkNfTEVHQUNZLAorCURWQl9SQ19DT1JFLAorfTsKKworLyoqCiAgKiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyAtIHByb3BlcnRpZXMgb2YgYSBkdmItdXNiLWRldmljZQogICogQHVzYl9jdHJsOiB3aGljaCBVU0IgZGV2aWNlLXNpZGUgY29udHJvbGxlciBpcyBpbiB1c2UuIE5lZWRlZCBmb3IgZmlybXdhcmUKICAqICBkb3dubG9hZC4KQEAgLTE4NSwxMSArMjI0LDcgQEAKICAqIEBpZGVudGlmeV9zdGF0ZTogY2FsbGVkIHRvIGRldGVybWluZSB0aGUgc3RhdGUgKGNvbGQgb3Igd2FybSksIHdoZW4gaXQKICAqICBpcyBub3QgZGlzdGluZ3Vpc2hhYmxlIGJ5IHRoZSBVU0IgSURzLgogICoKLSAqIEByY19rZXlfbWFwOiBhIGhhcmQtd2lyZWQgYXJyYXkgb2Ygc3RydWN0IGR2Yl91c2JfcmNfa2V5IChOVUxMIHRvIGRpc2FibGUKLSAqICByZW1vdGUgY29udHJvbCBoYW5kbGluZykuCi0gKiBAcmNfa2V5X21hcF9zaXplOiBudW1iZXIgb2YgaXRlbXMgaW4gQHJjX2tleV9tYXAuCi0gKiBAcmNfcXVlcnk6IGNhbGxlZCB0byBxdWVyeSBhbiBldmVudCBldmVudC4KLSAqIEByY19pbnRlcnZhbDogdGltZSBpbiBtcyBiZXR3ZWVuIHR3byBxdWVyaWVzLgorICogQHJjOiByZW1vdGUgY29udHJvbGxlciBwcm9wZXJ0aWVzCiAgKgogICogQGkyY19hbGdvOiBpMmNfYWxnb3JpdGhtIGlmIHRoZSBkZXZpY2UgaGFzIEkyQ292ZXJVU0IuCiAgKgpAQCAtMjMzLDE0ICsyNjgsMTEgQEAKIAlpbnQgKCppZGVudGlmeV9zdGF0ZSkgICAoc3RydWN0IHVzYl9kZXZpY2UgKiwgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgKiwKIAkJCXN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqKiwgaW50ICopOwogCi0vKiByZW1vdGUgY29udHJvbCBwcm9wZXJ0aWVzICovCi0jZGVmaW5lIFJFTU9URV9OT19LRVlfUFJFU1NFRCAgICAgIDB4MDAKLSNkZWZpbmUgUkVNT1RFX0tFWV9QUkVTU0VEICAgICAgICAgMHgwMQotI2RlZmluZSBSRU1PVEVfS0VZX1JFUEVBVCAgICAgICAgICAweDAyCi0Jc3RydWN0IGR2Yl91c2JfcmNfa2V5ICAqcmNfa2V5X21hcDsKLQlpbnQgcmNfa2V5X21hcF9zaXplOwotCWludCAoKnJjX3F1ZXJ5KSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHUzMiAqLCBpbnQgKik7Ci0JaW50IHJjX2ludGVydmFsOworCXN0cnVjdCB7CisJCWVudW0gZHZiX3VzYl9tb2RlIG1vZGU7CS8qIERyaXZlcnMgc2hvdWxkbid0IHRvdWNoIG9uIGl0ICovCisJCXN0cnVjdCBkdmJfcmNfbGVnYWN5IGxlZ2FjeTsKKwkJc3RydWN0IGR2Yl9yYyBjb3JlOworCX0gcmM7CiAKIAlzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqaTJjX2FsZ287CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R3MjEwMi5jCmluZGV4IGU4ZmI4NTMuLjc3NGRmODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYwpAQCAtNzQsNyArNzQsNyBAQAogCQkib24gZmlybXdhcmUtcHJvYmxlbXMuIgogCiBzdHJ1Y3QgaXJfY29kZXNfZHZiX3VzYl90YWJsZV90YWJsZSB7Ci0Jc3RydWN0IGR2Yl91c2JfcmNfa2V5ICpyY19rZXlzOworCXN0cnVjdCBpcl9zY2FuY29kZSAqcmNfa2V5czsKIAlpbnQgcmNfa2V5c19zaXplOwogfTsKIApAQCAtOTQ4LDcgKzk0OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfZHcyMTB4X3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX2R3MjEweF90YWJsZVtdID0gewogCXsgMHhmODBhLCBLRVlfUSB9LAkJLypwb3dlciovCiAJeyAweGY4MGMsIEtFWV9NIH0sCQkvKm11dGUqLwogCXsgMHhmODExLCBLRVlfMSB9LApAQCAtOTgyLDcgKzk4Miw3IEBACiAJeyAweGY4MWIsIEtFWV9CIH0sCQkvKnJlY2FsbCovCiB9OwogCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX3RldmlpX3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX3RldmlpX3RhYmxlW10gPSB7CiAJeyAweGY4MGEsIEtFWV9QT1dFUiB9LAogCXsgMHhmODBjLCBLRVlfTVVURSB9LAogCXsgMHhmODExLCBLRVlfMSB9LApAQCAtMTAzMiw3ICsxMDMyLDcgQEAKIAl7IDB4Zjg1OCwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc190YnNfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfdGJzX3RhYmxlW10gPSB7CiAJeyAweGY4ODQsIEtFWV9QT1dFUiB9LAogCXsgMHhmODk0LCBLRVlfTVVURSB9LAogCXsgMHhmODg3LCBLRVlfMSB9LApAQCAtMTA3NSw4ICsxMDc1LDggQEAKIAogc3RhdGljIGludCBkdzIxMDJfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQogewotCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqa2V5bWFwID0gZC0+cHJvcHMucmNfa2V5X21hcDsKLQlpbnQga2V5bWFwX3NpemUgPSBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7CisJc3RydWN0IGlyX3NjYW5jb2RlICprZXltYXAgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcDsKKwlpbnQga2V5bWFwX3NpemUgPSBkLT5wcm9wcy5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplOwogCXU4IGtleVsyXTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CiAJCS5hZGRyID0gRFcyMTAyX1JDX1FVRVJZLApAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGtleW1hcF9zaXplIDsgaSsrKSB7CiAJCQlpZiAocmM1X2RhdGEoJmtleW1hcFtpXSkgPT0gbXNnLmJ1ZlswXSkgewogCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CisJCQkJKmV2ZW50ID0ga2V5bWFwW2ldLmtleWNvZGU7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTExODUsMTMgKzExODUsMTMgQEAKIAkJLyogaW5pdCByZWdpc3RlcnMgKi8KIAkJc3dpdGNoIChkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSB7CiAJCWNhc2UgVVNCX1BJRF9QUk9GXzExMDA6Ci0JCQlzNngwX3Byb3BlcnRpZXMucmNfa2V5X21hcCA9IGlyX2NvZGVzX3Ric190YWJsZTsKLQkJCXM2eDBfcHJvcGVydGllcy5yY19rZXlfbWFwX3NpemUgPQorCQkJczZ4MF9wcm9wZXJ0aWVzLnJjLmxlZ2FjeS5yY19rZXlfbWFwID0gaXJfY29kZXNfdGJzX3RhYmxlOworCQkJczZ4MF9wcm9wZXJ0aWVzLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemUgPQogCQkJCQlBUlJBWV9TSVpFKGlyX2NvZGVzX3Ric190YWJsZSk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUElEX1RFVklJX1M2NTA6Ci0JCQlkdzIxMDRfcHJvcGVydGllcy5yY19rZXlfbWFwID0gaXJfY29kZXNfdGV2aWlfdGFibGU7Ci0JCQlkdzIxMDRfcHJvcGVydGllcy5yY19rZXlfbWFwX3NpemUgPQorCQkJZHcyMTA0X3Byb3BlcnRpZXMucmMubGVnYWN5LnJjX2tleV9tYXAgPSBpcl9jb2Rlc190ZXZpaV90YWJsZTsKKwkJCWR3MjEwNF9wcm9wZXJ0aWVzLnJjLmxlZ2FjeS5yY19rZXlfbWFwX3NpemUgPQogCQkJCQlBUlJBWV9TSVpFKGlyX2NvZGVzX3RldmlpX3RhYmxlKTsKIAkJY2FzZSBVU0JfUElEX0RXMjEwNDoKIAkJCXJlc2V0ID0gMTsKQEAgLTEyNTUsMTAgKzEyNTUsMTMgQEAKIAkubm9fcmVjb25uZWN0ID0gMSwKIAogCS5pMmNfYWxnbyA9ICZkdzIxMDJfc2VyaXRfaTJjX2FsZ28sCi0JLnJjX2tleV9tYXAgPSBpcl9jb2Rlc19kdzIxMHhfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHcyMTB4X3RhYmxlKSwKLQkucmNfaW50ZXJ2YWwgPSAxNTAsCi0JLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAorCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2tleV9tYXAgPSBpcl9jb2Rlc19kdzIxMHhfdGFibGUsCisJCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R3MjEweF90YWJsZSksCisJCS5yY19pbnRlcnZhbCA9IDE1MCwKKwkJLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAorCX0sCiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDgxLAogCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KQEAgLTEzMDYsMTAgKzEzMDksMTIgQEAKIAkubm9fcmVjb25uZWN0ID0gMSwKIAogCS5pMmNfYWxnbyA9ICZkdzIxMDRfaTJjX2FsZ28sCi0JLnJjX2tleV9tYXAgPSBpcl9jb2Rlc19kdzIxMHhfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHcyMTB4X3RhYmxlKSwKLQkucmNfaW50ZXJ2YWwgPSAxNTAsCi0JLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19rZXlfbWFwID0gaXJfY29kZXNfZHcyMTB4X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc19kdzIxMHhfdGFibGUpLAorCQkucmNfaW50ZXJ2YWwgPSAxNTAsCisJCS5yY19xdWVyeSA9IGR3MjEwMl9yY19xdWVyeSwKKwl9LAogCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHg4MSwKIAkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCkBAIC0xMzUzLDEwICsxMzU4LDEyIEBACiAJLm5vX3JlY29ubmVjdCA9IDEsCiAKIAkuaTJjX2FsZ28gPSAmZHczMTAxX2kyY19hbGdvLAotCS5yY19rZXlfbWFwID0gaXJfY29kZXNfZHcyMTB4X3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2R3MjEweF90YWJsZSksCi0JLnJjX2ludGVydmFsID0gMTUwLAotCS5yY19xdWVyeSA9IGR3MjEwMl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfa2V5X21hcCA9IGlyX2NvZGVzX2R3MjEweF90YWJsZSwKKwkJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfZHcyMTB4X3RhYmxlKSwKKwkJLnJjX2ludGVydmFsID0gMTUwLAorCQkucmNfcXVlcnkgPSBkdzIxMDJfcmNfcXVlcnksCisJfSwKIAogCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4ODEsCiAJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwpAQCAtMTM5NiwxMCArMTQwMywxMiBAQAogCS5ub19yZWNvbm5lY3QgPSAxLAogCiAJLmkyY19hbGdvID0gJnM2eDBfaTJjX2FsZ28sCi0JLnJjX2tleV9tYXAgPSBpcl9jb2Rlc190ZXZpaV90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc190ZXZpaV90YWJsZSksCi0JLnJjX2ludGVydmFsID0gMTUwLAotCS5yY19xdWVyeSA9IGR3MjEwMl9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfa2V5X21hcCA9IGlyX2NvZGVzX3RldmlpX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc190ZXZpaV90YWJsZSksCisJCS5yY19pbnRlcnZhbCA9IDE1MCwKKwkJLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAorCX0sCiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDgxLAogCS5udW1fYWRhcHRlcnMgPSAxLApAQCAtMTQ1OSw4ICsxNDY4LDggQEAKIAkvKiBmaWxsIG9ubHkgZGlmZmVyZW50IGZpZWxkcyAqLwogCXA3NTAwLT5maXJtd2FyZSA9ICJkdmItdXNiLXA3NTAwLmZ3IjsKIAlwNzUwMC0+ZGV2aWNlc1swXSA9IGQ3NTAwOwotCXA3NTAwLT5yY19rZXlfbWFwID0gaXJfY29kZXNfdGJzX3RhYmxlOwotCXA3NTAwLT5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX3Ric190YWJsZSk7CisJcDc1MDAtPnJjLmxlZ2FjeS5yY19rZXlfbWFwID0gaXJfY29kZXNfdGJzX3RhYmxlOworCXA3NTAwLT5yYy5sZWdhY3kucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc190YnNfdGFibGUpOwogCXA3NTAwLT5hZGFwdGVyLT5mcm9udGVuZF9hdHRhY2ggPSBwcm9mXzc1MDBfZnJvbnRlbmRfYXR0YWNoOwogCiAJaWYgKDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmZHcyMTAyX3Byb3BlcnRpZXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYwppbmRleCA3YTdmMWIyLi5kYmRiNTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMKQEAgLTM0OSw3ICszNDksNyBAQAogCQkJICogRkVfQ0FOX1FBTV8xNiBpcyBmb3IgY29tcGF0aWJpbGl0eQogCQkJICogKE15dGggaW5jb3JyZWN0bHkgZGV0ZWN0cyBUdXJiby1RUFNLIGFzIHBsYWluIFFBTS0xNikKIAkJCSAqLwotCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2CisJCQlGRV9DQU5fUVBTSyB8IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fVFVSQk9fRkVDCiAJfSwKIAogCS5yZWxlYXNlID0gZ3A4cHNrX2ZlX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMKaW5kZXggYzIxMWZlZi4uYmRlZjFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguYwpAQCAtNjksNyArNjksNyBAQAogCWludCBhZGFwX2VuYWJsZWRbTTkyMDZfTUFYX0FEQVBURVJTXSA9IHsgMCB9OwogCiAJLyogUmVtb3RlIGNvbnRyb2xsZXIgaW5pdC4gKi8KLQlpZiAoZC0+cHJvcHMucmNfcXVlcnkpIHsKKwlpZiAoZC0+cHJvcHMucmMubGVnYWN5LnJjX3F1ZXJ5KSB7CiAJCWRlYigiSW5pdGlhbGlzaW5nIHJlbW90ZSBjb250cm9sXG4iKTsKIAkJd2hpbGUgKHJjX3NlcS0+YWRkcmVzcykgewogCQkJaWYgKChyZXQgPSBtOTIweF93cml0ZShkLT51ZGV2LCBNOTIwNl9DT1JFLApAQCAtMTQyLDkgKzE0Miw5IEBACiAJaWYgKChyZXQgPSBtOTIweF9yZWFkKGQtPnVkZXYsIE05MjA2X0NPUkUsIDB4MCwgTTkyMDZfUkNfS0VZLCByY19zdGF0ZSArIDEsIDEpKSAhPSAwKQogCQlnb3RvIHVubG9jazsKIAotCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykKLQkJaWYgKHJjNV9kYXRhKCZkLT5wcm9wcy5yY19rZXlfbWFwW2ldKSA9PSByY19zdGF0ZVsxXSkgewotCQkJKmV2ZW50ID0gZC0+cHJvcHMucmNfa2V5X21hcFtpXS5ldmVudDsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBfc2l6ZTsgaSsrKQorCQlpZiAocmM1X2RhdGEoJmQtPnByb3BzLnJjLmxlZ2FjeS5yY19rZXlfbWFwW2ldKSA9PSByY19zdGF0ZVsxXSkgeworCQkJKmV2ZW50ID0gZC0+cHJvcHMucmMubGVnYWN5LnJjX2tleV9tYXBbaV0ua2V5Y29kZTsKIAogCQkJc3dpdGNoKHJjX3N0YXRlWzBdKSB7CiAJCQljYXNlIDB4ODA6CkBAIC01ODksNyArNTg5LDcgQEAKIH07CiAKIC8qIGlyIGtleW1hcHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfbWVnYXNreV90YWJsZSBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfbWVnYXNreV90YWJsZVtdID0gewogCXsgMHgwMDEyLCBLRVlfUE9XRVIgfSwKIAl7IDB4MDAxZSwgS0VZX0NZQ0xFV0lORE9XUyB9LCAvKiBtaW4vbWF4ICovCiAJeyAweDAwMDIsIEtFWV9DSEFOTkVMVVAgfSwKQEAgLTYwOCw3ICs2MDgsNyBAQAogCXsgMHgwMDBlLCBLRVlfQ09GRkVFIH0sIC8qICJNVFMiICovCiB9OwogCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX3R2d2Fsa2VydHdpbl90YWJsZSBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfdHZ3YWxrZXJ0d2luX3RhYmxlW10gPSB7CiAJeyAweDAwMDEsIEtFWV9aT09NIH0sIC8qIEZ1bGwgU2NyZWVuICovCiAJeyAweDAwMDIsIEtFWV9DQU1FUkEgfSwgLyogc25hcHNob3QgKi8KIAl7IDB4MDAwMywgS0VZX01VVEUgfSwKQEAgLTYyOCw3ICs2MjgsNyBAQAogCXsgMHgwMDFlLCBLRVlfVk9MVU1FVVAgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfcGlubmFjbGUzMTBlX3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX3Bpbm5hY2xlMzEwZV90YWJsZVtdID0gewogCXsgMHgxNiwgS0VZX1BPV0VSIH0sCiAJeyAweDE3LCBLRVlfRkFWT1JJVEVTIH0sCiAJeyAweDBmLCBLRVlfVEVYVCB9LApAQCAtNzg0LDEwICs3ODQsMTIgQEAKIAkuZmlybXdhcmUgPSAiZHZiLXVzYi1tZWdhc2t5LTAyLmZ3IiwKIAkuZG93bmxvYWRfZmlybXdhcmUgPSBtOTIweF9maXJtd2FyZV9kb3dubG9hZCwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfbWVnYXNreV90YWJsZSwKLQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfbWVnYXNreV90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSBtOTIweF9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19tZWdhc2t5X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfbWVnYXNreV90YWJsZSksCisJCS5yY19xdWVyeSAgICAgICAgID0gbTkyMHhfcmNfcXVlcnksCisJfSwKIAogCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBtOTIweF9zdGF0ZSksCiAKQEAgLTg4NSwxMCArODg3LDEyIEBACiAJLmZpcm13YXJlID0gImR2Yi11c2ItdHZ3YWxrZXJ0LmZ3IiwKIAkuZG93bmxvYWRfZmlybXdhcmUgPSBtOTIweF9maXJtd2FyZV9kb3dubG9hZCwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfdHZ3YWxrZXJ0d2luX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc190dndhbGtlcnR3aW5fdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gbTkyMHhfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfdHZ3YWxrZXJ0d2luX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfdHZ3YWxrZXJ0d2luX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBtOTIweF9yY19xdWVyeSwKKwl9LAogCiAJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG05MjB4X3N0YXRlKSwKIApAQCAtOTkyLDEwICs5OTYsMTIgQEAKIAkudXNiX2N0cmwgPSBERVZJQ0VfU1BFQ0lGSUMsCiAJLmRvd25sb2FkX2Zpcm13YXJlID0gTlVMTCwKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfcGlubmFjbGUzMTBlX3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc19waW5uYWNsZTMxMGVfdGFibGUpLAotCS5yY19xdWVyeSAgICAgICAgID0gbTkyMHhfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfcGlubmFjbGUzMTBlX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfcGlubmFjbGUzMTBlX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBtOTIweF9yY19xdWVyeSwKKwl9LAogCiAJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG05MjB4X3N0YXRlKSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCmluZGV4IGQxOTVhNTguLjE4MWYzNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNkZWZpbmUgZGViX2VlKGFyZ3MuLi4pIGRwcmludGsoZGVidWcsMHgwMixhcmdzKQogCiAvKiBIYXVwcGF1Z2UgTk9WQS1UIFVTQjIga2V5cyAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19oYXVwcF90YWJsZSBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfaGF1cHBfdGFibGVbXSA9IHsKIAl7IDB4MWUwMCwgS0VZXzAgfSwKIAl7IDB4MWUwMSwgS0VZXzEgfSwKIAl7IDB4MWUwMiwgS0VZXzIgfSwKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCQkJZGViX3JjKCJjOiAleCwgZDogJXhcbiIsIHJjNV9kYXRhKCZpcl9jb2Rlc19oYXVwcF90YWJsZVtpXSksCiAJCQkJCQkJCSByYzVfY3VzdG9tKCZpcl9jb2Rlc19oYXVwcF90YWJsZVtpXSkpOwogCi0JCQkJCSpldmVudCA9IGlyX2NvZGVzX2hhdXBwX3RhYmxlW2ldLmV2ZW50OworCQkJCQkqZXZlbnQgPSBpcl9jb2Rlc19oYXVwcF90YWJsZVtpXS5rZXljb2RlOwogCQkJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7CiAJCQkJCWlmIChzdC0+b2xkX3RvZ2dsZSA9PSB0b2dnbGUpIHsKIAkJCQkJCWlmIChzdC0+bGFzdF9yZXBlYXRfY291bnQrKyA8IDIpCkBAIC0xOTUsMTAgKzE5NSwxMiBAQAogCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiMl8wX3Bvd2VyX2N0cmwsCiAJLnJlYWRfbWFjX2FkZHJlc3MgPSBub3ZhX3RfcmVhZF9tYWNfYWRkcmVzcywKIAotCS5yY19pbnRlcnZhbCAgICAgID0gMTAwLAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfaGF1cHBfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2hhdXBwX3RhYmxlKSwKLQkucmNfcXVlcnkgICAgICAgICA9IG5vdmFfdF9yY19xdWVyeSwKKwkucmMubGVnYWN5ID0geworCQkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkJLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc19oYXVwcF90YWJsZSwKKwkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX2hhdXBwX3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBub3ZhX3RfcmNfcXVlcnksCisJfSwKIAogCS5pMmNfYWxnbyAgICAgICAgID0gJmRpYnVzYl9pMmNfYWxnbywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmMKaW5kZXggZGZiODFmZi4uNmIyMmVjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL29wZXJhMS5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBpcl9jb2Rlc19vcGVyYTFfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJfc2NhbmNvZGUgaXJfY29kZXNfb3BlcmExX3RhYmxlW10gPSB7CiAJezB4NWZhMCwgS0VZXzF9LAogCXsweDUxYWYsIEtFWV8yfSwKIAl7MHg1ZGEyLCBLRVlfM30sCkBAIC00MDcsOSArNDA3LDkgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXJfY29kZXNfb3BlcmExX3RhYmxlKTsgaSsrKSB7CiAJCQlpZiAocmM1X3NjYW4oJmlyX2NvZGVzX29wZXJhMV90YWJsZVtpXSkgPT0gKHNlbmRfa2V5ICYgMHhmZmZmKSkgewogCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJCQkqZXZlbnQgPSBpcl9jb2Rlc19vcGVyYTFfdGFibGVbaV0uZXZlbnQ7CisJCQkJKmV2ZW50ID0gaXJfY29kZXNfb3BlcmExX3RhYmxlW2ldLmtleWNvZGU7CiAJCQkJb3BzdC0+bGFzdF9rZXlfcHJlc3NlZCA9Ci0JCQkJCWlyX2NvZGVzX29wZXJhMV90YWJsZVtpXS5ldmVudDsKKwkJCQkJaXJfY29kZXNfb3BlcmExX3RhYmxlW2ldLmtleWNvZGU7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlvcHN0LT5sYXN0X2tleV9wcmVzc2VkID0gMDsKQEAgLTQ5OCwxMCArNDk4LDEyIEBACiAJLnBvd2VyX2N0cmwgPSBvcGVyYTFfcG93ZXJfY3RybCwKIAkuaTJjX2FsZ28gPSAmb3BlcmExX2kyY19hbGdvLAogCi0JLnJjX2tleV9tYXAgPSBpcl9jb2Rlc19vcGVyYTFfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoaXJfY29kZXNfb3BlcmExX3RhYmxlKSwKLQkucmNfaW50ZXJ2YWwgPSAyMDAsCi0JLnJjX3F1ZXJ5ID0gb3BlcmExX3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19rZXlfbWFwID0gaXJfY29kZXNfb3BlcmExX3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShpcl9jb2Rlc19vcGVyYTFfdGFibGUpLAorCQkucmNfaW50ZXJ2YWwgPSAyMDAsCisJCS5yY19xdWVyeSA9IG9wZXJhMV9yY19xdWVyeSwKKwl9LAogCS5yZWFkX21hY19hZGRyZXNzID0gb3BlcmExX3JlYWRfbWFjX2FkZHJlc3MsCiAJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMCwKIAkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYwppbmRleCA0ZDMzMjQ1Li41YzlmMzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogfQogCiAvKiBrZXlzIGZvciB0aGUgZW5jbG9zZWQgcmVtb3RlIGNvbnRyb2wgKi8KLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaXJfY29kZXNfdnA3MDJ4X3RhYmxlW10gPSB7CitzdGF0aWMgc3RydWN0IGlyX3NjYW5jb2RlIGlyX2NvZGVzX3ZwNzAyeF90YWJsZVtdID0gewogCXsgMHgwMDAxLCBLRVlfMSB9LAogCXsgMHgwMDAyLCBLRVlfMiB9LAogfTsKQEAgLTIwMCw3ICsyMDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlyX2NvZGVzX3ZwNzAyeF90YWJsZSk7IGkrKykKIAkJaWYgKHJjNV9jdXN0b20oJmlyX2NvZGVzX3ZwNzAyeF90YWJsZVtpXSkgPT0ga2V5WzFdKSB7CiAJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7Ci0JCQkqZXZlbnQgPSBpcl9jb2Rlc192cDcwMnhfdGFibGVbaV0uZXZlbnQ7CisJCQkqZXZlbnQgPSBpcl9jb2Rlc192cDcwMnhfdGFibGVbaV0ua2V5Y29kZTsKIAkJCWJyZWFrOwogCQl9CiAJcmV0dXJuIDA7CkBAIC0yODMsMTAgKzI4MywxMiBAQAogCX0sCiAJLnJlYWRfbWFjX2FkZHJlc3MgPSB2cDcwMnhfcmVhZF9tYWNfYWRkciwKIAotCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfdnA3MDJ4X3RhYmxlLAotCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShpcl9jb2Rlc192cDcwMnhfdGFibGUpLAotCS5yY19pbnRlcnZhbCAgICAgID0gNDAwLAotCS5yY19xdWVyeSAgICAgICAgID0gdnA3MDJ4X3JjX3F1ZXJ5LAorCS5yYy5sZWdhY3kgPSB7CisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfdnA3MDJ4X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfdnA3MDJ4X3RhYmxlKSwKKwkJLnJjX2ludGVydmFsICAgICAgPSA0MDAsCisJCS5yY19xdWVyeSAgICAgICAgID0gdnA3MDJ4X3JjX3F1ZXJ5LAorCX0sCiAKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCiAJLmRldmljZXMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwppbmRleCAwMzY4OTNmLi5mMTM3OTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKQEAgLTk5LDcgKzk5LDcgQEAKIAogLyogVGhlIGtleW1hcHBpbmcgc3RydWN0LiBTb21laG93IHRoaXMgc2hvdWxkIGJlIGxvYWRlZCB0byB0aGUgZHJpdmVyLCBidXQKICAqIGN1cnJlbnRseSBpdCBpcyBoYXJkY29kZWQuICovCi1zdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGlyX2NvZGVzX3ZwNzA0NV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBpcl9zY2FuY29kZSBpcl9jb2Rlc192cDcwNDVfdGFibGVbXSA9IHsKIAl7IDB4MDAxNiwgS0VZX1BPV0VSIH0sCiAJeyAweDAwMTAsIEtFWV9NVVRFIH0sCiAJeyAweDAwMDMsIEtFWV8xIH0sCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcl9jb2Rlc192cDcwNDVfdGFibGUpOyBpKyspCiAJCWlmIChyYzVfZGF0YSgmaXJfY29kZXNfdnA3MDQ1X3RhYmxlW2ldKSA9PSBrZXkpIHsKIAkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJCSpldmVudCA9IGlyX2NvZGVzX3ZwNzA0NV90YWJsZVtpXS5ldmVudDsKKwkJCSpldmVudCA9IGlyX2NvZGVzX3ZwNzA0NV90YWJsZVtpXS5rZXljb2RlOwogCQkJYnJlYWs7CiAJCX0KIAlyZXR1cm4gMDsKQEAgLTI1OSwxMCArMjU5LDEyIEBACiAJLnBvd2VyX2N0cmwgICAgICAgPSB2cDcwNDVfcG93ZXJfY3RybCwKIAkucmVhZF9tYWNfYWRkcmVzcyA9IHZwNzA0NV9yZWFkX21hY19hZGRyLAogCi0JLnJjX2ludGVydmFsICAgICAgPSA0MDAsCi0JLnJjX2tleV9tYXAgICAgICAgPSBpcl9jb2Rlc192cDcwNDVfdGFibGUsCi0JLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGlyX2NvZGVzX3ZwNzA0NV90YWJsZSksCi0JLnJjX3F1ZXJ5ICAgICAgICAgPSB2cDcwNDVfcmNfcXVlcnksCisJLnJjLmxlZ2FjeSA9IHsKKwkJLnJjX2ludGVydmFsICAgICAgPSA0MDAsCisJCS5yY19rZXlfbWFwICAgICAgID0gaXJfY29kZXNfdnA3MDQ1X3RhYmxlLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoaXJfY29kZXNfdnA3MDQ1X3RhYmxlKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSB2cDcwNDVfcmNfcXVlcnksCisJfSwKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKIAkuZGV2aWNlcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggY2Q3ZjliNy4uNTFkNTc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTU4NCw2ICs1ODQsNyBAQAogY29uZmlnIERWQl9MR1M4R1hYCiAJdHJpc3RhdGUgIkxlZ2VuZCBTaWxpY29uIExHUzg5MTMvTEdTOEdMNS9MR1M4R1hYIERNQi1USCBkZW1vZHVsYXRvciIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCXNlbGVjdCBGV19MT0FERVIKIAlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIEEgRE1CLVRIIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzLmMKaW5kZXggMTJlMDE4Yi4uZGFjOTE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hZjkwMTMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEVkIgVVNCIExpbnV4IGRyaXZlciBmb3IgQWZhdGVjaCBBRjkwMTUgRFZCLVQgVVNCMi4wIHJlY2VpdmVyCisgKiBBZmF0ZWNoIEFGOTAxMyBkZW1vZHVsYXRvciBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CiAgKgpAQCAtNzYxLDYgKzc2MSwxMCBAQAogCiAJc3RhdGUtPmZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5OwogCisJLyogcHJvZ3JhbSB0dW5lciAqLworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKQorCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwYXJhbXMpOworCiAJLyogcHJvZ3JhbSBDRk9FIGNvZWZmaWNpZW50cyAqLwogCXJldCA9IGFmOTAxM19zZXRfY29lZmYoc3RhdGUsIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CiAJaWYgKHJldCkKQEAgLTc5MSwxMCArNzk1LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwogCi0JLyogcHJvZ3JhbSB0dW5lciAqLwotCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKQotCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwYXJhbXMpOwotCiAJLyogcHJvZ3JhbSBUUFMgYW5kIGJhbmR3aWR0aCwgY2hlY2sgaWYgYXV0byBtb2RlIG5lZWRlZCAqLwogCXJldCA9IGFmOTAxM19zZXRfb2ZkbV9wYXJhbXMoc3RhdGUsICZwYXJhbXMtPnUub2ZkbSwgJmF1dG9fbW9kZSk7CiAJaWYgKHJldCkKQEAgLTExODQsMjEgKzExODQsNDMgQEAKIAl1OCB0bXA7CiAJKnN0YXR1cyA9IDA7CiAKLQkvKiBUUFMgbG9jayAqLwotCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQzMzAsIDMsIDEsICZ0bXApOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKHRtcCkKLQkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSSB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NJR05BTDsKLQogCS8qIE1QRUcyIGxvY2sgKi8KIAlyZXQgPSBhZjkwMTNfcmVhZF9yZWdfYml0cyhzdGF0ZSwgMHhkNTA3LCA2LCAxLCAmdG1wKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwogCWlmICh0bXApCi0JCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfVklURVJCSSB8CisJCQlGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOwogCi0JaWYgKCEoKnN0YXR1cyAmIEZFX0hBU19TSUdOQUwpKSB7CisJaWYgKCEqc3RhdHVzKSB7CisJCS8qIFRQUyBsb2NrICovCisJCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQzMzAsIDMsIDEsICZ0bXApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJaWYgKHRtcCkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwKKwkJCQlGRV9IQVNfVklURVJCSTsKKwl9CisKKwlpZiAoISpzdGF0dXMpIHsKKwkJLyogQ0ZPIGxvY2sgKi8KKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDMzMywgNywgMSwgJnRtcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCQlpZiAodG1wKQorCQkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVI7CisJfQorCisJaWYgKCEqc3RhdHVzKSB7CisJCS8qIFNGT0UgbG9jayAqLworCQlyZXQgPSBhZjkwMTNfcmVhZF9yZWdfYml0cyhzdGF0ZSwgMHhkMzM0LCA2LCAxLCAmdG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICh0bXApCisJCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfQ0FSUklFUjsKKwl9CisKKwlpZiAoISpzdGF0dXMpIHsKIAkJLyogQUdDIGxvY2sgKi8KIAkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDFhMCwgNiwgMSwgJnRtcCk7CiAJCWlmIChyZXQpCkBAIC0xMjA3LDI0ICsxMjI5LDYgQEAKIAkJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKIAl9CiAKLQlpZiAoISgqc3RhdHVzICYgRkVfSEFTX0NBUlJJRVIpKSB7Ci0JCS8qIENGTyBsb2NrICovCi0JCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQzMzMsIDcsIDEsICZ0bXApOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHRtcCkKLQkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7Ci0JfQotCi0JaWYgKCEoKnN0YXR1cyAmIEZFX0hBU19DQVJSSUVSKSkgewotCQkvKiBTRk9FIGxvY2sgKi8KLQkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDMzNCwgNiwgMSwgJnRtcCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAodG1wKQotCQkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKLQl9Ci0KIAlyZXQgPSBhZjkwMTNfdXBkYXRlX3N0YXRpc3RpY3MoZmUpOwogCiBlcnJvcjoKQEAgLTE1NzQsNyArMTU3OCw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSA9IE5VTEw7Ci0JdTggYnVmWzNdLCBpOworCXU4IGJ1Zls0XSwgaTsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCiAJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWY5MDEzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CkBAIC0xNjA3LDEyICsxNjExLDEyIEBACiAJfQogCiAJLyogZmlybXdhcmUgdmVyc2lvbiAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHg1MTAzICsgaSwgJmJ1ZltpXSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwogCX0KLQlpbmZvKCJmaXJtd2FyZSB2ZXJzaW9uOiVkLiVkLiVkIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisJaW5mbygiZmlybXdhcmUgdmVyc2lvbjolZC4lZC4lZC4lZCIsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSk7CiAKIAkvKiBzZXR0aW5ncyBmb3IgbXAyaWYgKi8KIAlpZiAoc3RhdGUtPmNvbmZpZy5vdXRwdXRfbW9kZSA9PSBBRjkwMTNfT1VUUFVUX01PREVfVVNCKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzLmgKaW5kZXggZTkwZmE5Mi4uNzJjNzFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hZjkwMTMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEVkIgVVNCIExpbnV4IGRyaXZlciBmb3IgQWZhdGVjaCBBRjkwMTUgRFZCLVQgVVNCMi4wIHJlY2VpdmVyCisgKiBBZmF0ZWNoIEFGOTAxMyBkZW1vZHVsYXRvciBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxM19wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzX3ByaXYuaAppbmRleCAxNjNlMjUxLi4wZmQ0MmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzX3ByaXYuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEVkIgVVNCIExpbnV4IGRyaXZlciBmb3IgQWZhdGVjaCBBRjkwMTUgRFZCLVQgVVNCMi4wIHJlY2VpdmVyCisgKiBBZmF0ZWNoIEFGOTAxMyBkZW1vZHVsYXRvciBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CiAgKgpAQCAtMTMyLDYgKzEzMiw4IEBACiAJeyAweGQ3NDAsIDIsIDEsIDB4MDAgfSwKIAl7IDB4ZDc0MCwgMywgMSwgMHgwMSB9LAogCXsgMHhkM2MxLCA0LCAxLCAweDAxIH0sCisJeyAweDkxMjQsIDAsIDgsIDB4NTggfSwKKwl7IDB4OTEyNSwgMCwgMiwgMHgwMiB9LAogCXsgMHhkM2EyLCAwLCA4LCAweDAwIH0sCiAJeyAweGQzYTMsIDAsIDgsIDB4MDQgfSwKIAl7IDB4ZDMwNSwgMCwgOCwgMHgzMiB9LApAQCAtMTQzLDcgKzE0NSw3IEBACiAJeyAweDkxMWIsIDAsIDEsIDB4MDEgfSwKIAl7IDB4OWJjZSwgMCwgNCwgMHgwMiB9LAogCXsgMHg5MTE2LCAwLCAxLCAweDAxIH0sCi0JeyAweDliZDEsIDAsIDEsIDB4MDEgfSwKKwl7IDB4OTEyMiwgMCwgOCwgMHhkMCB9LAogCXsgMHhkMmUwLCAwLCA4LCAweGQwIH0sCiAJeyAweGQyZTksIDAsIDQsIDB4MGQgfSwKIAl7IDB4ZDM4YywgMCwgOCwgMHhmYyB9LApAQCAtMTY1LDcgKzE2Nyw2IEBACiAJeyAweGQwODEsIDQsIDQsIDB4MDkgfSwKIAl7IDB4ZDA5OCwgNCwgNCwgMHgwZiB9LAogCXsgMHhkMDk4LCAwLCA0LCAweDAzIH0sCi0JeyAweGRiYzAsIDMsIDEsIDB4MDEgfSwKIAl7IDB4ZGJjMCwgNCwgMSwgMHgwMSB9LAogCXsgMHhkYmM3LCAwLCA4LCAweDA4IH0sCiAJeyAweGRiYzgsIDQsIDQsIDB4MDAgfSwKQEAgLTE3OSw2ICsxODAsNyBAQAogCXsgMHhkMGYwLCAwLCA3LCAweDFhIH0sCiAJeyAweGQwZjEsIDQsIDEsIDB4MDEgfSwKIAl7IDB4ZDBmMiwgMCwgOCwgMHgwYyB9LAorCXsgMHhkMTAxLCA1LCAzLCAweDA2IH0sCiAJeyAweGQxMDMsIDAsIDQsIDB4MDggfSwKIAl7IDB4ZDBmOCwgMCwgNywgMHgyMCB9LAogCXsgMHhkMTExLCA1LCAxLCAweDAwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKaW5kZXggYWQ0YzhjZi4uZTgwYzU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwpAQCAtMzgsMTEgKzM4LDEwIEBACiAjZGVmaW5lIERSSVZFUl9ERVNDICJEaUJjb20gMzAwME0tQiBEVkItVCBkZW1vZHVsYXRvciIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiUGF0cmljayBCb2V0dGNoZXIsIHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUiCiAKLSNpZmRlZiBDT05GSUdfRFZCX0RJQkNPTV9ERUJVRwogc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8sMj14ZmVyLDQ9c2V0ZmUsOD1nZXRmZSAofC1hYmxlKSkuIik7Ci0jZW5kaWYKKwogI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKDB4MDEsYXJncykKICNkZWZpbmUgZGViX2kyYyhhcmdzLi4uKSAgZHByaW50aygweDAyLGFyZ3MpCiAjZGVmaW5lIGRlYl9zcmNoKGFyZ3MuLi4pIGRwcmludGsoMHgwNCxhcmdzKQpAQCAtNTEsMTIgKzUwLDYgQEAKICNkZWZpbmUgZGViX3NldGYoYXJncy4uLikgZHByaW50aygweDA0LGFyZ3MpCiAjZGVmaW5lIGRlYl9nZXRmKGFyZ3MuLi4pIGRwcmludGsoMHgwOCxhcmdzKQogCi0jaWZkZWYgQ09ORklHX0RWQl9ESUJDT01fREVCVUcKLXN0YXRpYyBpbnQgZGVidWc7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLDI9aTJjLDQ9c3JjaCAofC1hYmxlKSkuIik7Ci0jZW5kaWYKLQogc3RhdGljIGludCBkaWIzMDAwX3JlYWRfcmVnKHN0cnVjdCBkaWIzMDAwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZykKIHsKIAl1OCB3YltdID0geyAoKHJlZyA+PiA4KSB8IDB4ODApICYgMHhmZiwgcmVnICYgMHhmZiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYl9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iX3ByaXYuaAppbmRleCAxYTEyNzQ3Li4xNmM1MjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iX3ByaXYuaApAQCAtMzcsMTIgKzM3LDggQEAKIAogLyogZGVidWcgKi8KIAotI2lmZGVmIENPTkZJR19EVkJfRElCQ09NX0RFQlVHCiAjZGVmaW5lIGRwcmludGsobGV2ZWwsYXJncy4uLikgXAogICAgIGRvIHsgaWYgKChkZWJ1ZyAmIGxldmVsKSkgeyBwcmludGsoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIGRwcmludGsoYXJncy4uLikgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCiAKIC8qIG1hc2sgZm9yIGVuYWJsaW5nIGEgc3BlY2lmaWMgcGlkIGZvciB0aGUgcGlkX2ZpbHRlciAqLwogI2RlZmluZSBESUIzMDAwX0FDVElWQVRFX1BJRF9GSUxURVJJTkcJKDB4MjAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwppbmRleCBhZmFkMjUyLi4wODhlN2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCkBAIC04MjIsNyArODIyLDcgQEAKIAogCWRtY3N0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpYjMwMDBtY19zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChkbWNzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlkbWNzdC0+aTJjX2FkYXAgPSBpMmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA1LmMKaW5kZXggZDY5Yzc3NS4uMzI3Mjg4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA1LmMKQEAgLTEsNyArMSw5IEBACiAvKgotICogICAgU3VwcG9ydCBmb3IgTEdEVDMzMDUgLSBWU0IvUUFNCisgKiAgICBTdXBwb3J0IGZvciBMRyBFbGVjdHJvbmljcyBMR0RUMzMwNCBhbmQgTEdEVDMzMDUgLSBWU0IvUUFNCiAgKgotICogICAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPgorICoKKyAqICAgIExHRFQzMzA0IHN1cHBvcnQgYnkgSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPgogICoKICAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNjUsNiArNjcsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogRklYTUU6IHZlcmlmeSAmIGRvY3VtZW50IHRoZSBMR0RUMzMwNCByZWdpc3RlcnMgKi8KKwogI2RlZmluZSBMR0RUMzMwNV9HRU5fQ1RSTF8xICAgICAgICAgICAgICAgICAgIDB4MDAwMAogI2RlZmluZSBMR0RUMzMwNV9HRU5fQ1RSTF8yICAgICAgICAgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBMR0RUMzMwNV9HRU5fQ1RSTF8zICAgICAgICAgICAgICAgICAgIDB4MDAwMgpAQCAtMzU4LDcgKzM2MiwxMiBAQAogCWNhc2UgUUFNXzI1NjoKIAkJYWdjZGVsYXkgPSAweDA0NmI7CiAJCXJmYncgICAgID0gMHg4ODg5OwotCQlpZmJ3ICAgICA9IDB4ODg4ODsKKwkJLyogRklYTUU6IGludmVzdGlnYXRlIG9wdGltYWwgaWZidyAmIHJmYncgdmFsdWVzIGZvciB0aGUKKwkJICogICAgICAgIERUMzMwNCBhbmQgcmUtd3JpdGUgdGhpcyBzd2l0Y2guLmNhc2UgYmxvY2sgKi8KKwkJaWYgKHN0YXRlLT5jZmctPmRlbW9kX2NoaXAgPT0gTEdEVDMzMDQpCisJCQlpZmJ3ID0gMHg2NjY2OworCQllbHNlIC8qIChzdGF0ZS0+Y2ZnLT5kZW1vZF9jaGlwID09IExHRFQzMzA1KSAqLworCQkJaWZidyA9IDB4ODg4ODsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MTAsOCArNDE5LDE4IEBACiAJbGdfZGJnKCJsb2NrZHRlbiA9ICVkLCBhY3FlbiA9ICVkXG4iLCBsb2NrZHRlbiwgYWNxZW4pOwogCiAJLyogY29udHJvbCBhZ2MgZnVuY3Rpb24gKi8KLQlsZ2R0MzMwNV93cml0ZV9yZWcoc3RhdGUsIExHRFQzMzA1X0FHQ19DVFJMXzQsIDB4ZTEgfCBsb2NrZHRlbiA8PCAxKTsKLQlsZ2R0MzMwNV9zZXRfcmVnX2JpdChzdGF0ZSwgTEdEVDMzMDVfQUdDX0NUUkxfMSwgMiwgYWNxZW4pOworCXN3aXRjaCAoc3RhdGUtPmNmZy0+ZGVtb2RfY2hpcCkgeworCWNhc2UgTEdEVDMzMDQ6CisJCWxnZHQzMzA1X3dyaXRlX3JlZyhzdGF0ZSwgMHgwMzE0LCAweGUxIHwgbG9ja2R0ZW4gPDwgMSk7CisJCWxnZHQzMzA1X3NldF9yZWdfYml0KHN0YXRlLCAweDAzMGUsIDIsIGFjcWVuKTsKKwkJYnJlYWs7CisJY2FzZSBMR0RUMzMwNToKKwkJbGdkdDMzMDVfd3JpdGVfcmVnKHN0YXRlLCBMR0RUMzMwNV9BR0NfQ1RSTF80LCAweGUxIHwgbG9ja2R0ZW4gPDwgMSk7CisJCWxnZHQzMzA1X3NldF9yZWdfYml0KHN0YXRlLCBMR0RUMzMwNV9BR0NfQ1RSTF8xLCAyLCBhY3Flbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiBsZ2R0MzMwNV9yZmFnY19sb29wKHN0YXRlLCBwYXJhbSk7CiB9CkBAIC01NzcsNjEgKzU5Niw3OSBAQAogCXN0cnVjdCBsZ2R0MzMwNV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgcmV0OwogCisJc3RhdGljIHN0cnVjdCBsZ2R0MzMwNV9yZWcgbGdkdDMzMDRfaW5pdF9kYXRhW10gPSB7CisJCXsgLnJlZyA9IExHRFQzMzA1X0dFTl9DVFJMXzEsICAgICAgICAgICAudmFsID0gMHgwMywgfSwKKwkJeyAucmVnID0gMHgwMDBkLCAgICAgICAgICAgICAgICAgICAgICAgIC52YWwgPSAweDAyLCB9LAorCQl7IC5yZWcgPSAweDAwMGUsICAgICAgICAgICAgICAgICAgICAgICAgLnZhbCA9IDB4MDIsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0RHVExfQUdDX1JFRl8xLCAgICAgICAudmFsID0gMHgzMiwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfREdUTF9BR0NfUkVGXzIsICAgICAgIC52YWwgPSAweGM0LCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9DUl9DVFJfRlJFUV8xLCAgICAgICAgLnZhbCA9IDB4MDAsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0NSX0NUUl9GUkVRXzIsICAgICAgICAudmFsID0gMHgwMCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSX0ZSRVFfMywgICAgICAgIC52YWwgPSAweDAwLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9DUl9DVFJfRlJFUV80LCAgICAgICAgLnZhbCA9IDB4MDAsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0NSX0NUUkxfNywgICAgICAgICAgICAudmFsID0gMHhmOSwgfSwKKwkJeyAucmVnID0gMHgwMTEyLCAgICAgICAgICAgICAgICAgICAgICAgIC52YWwgPSAweDE3LCB9LAorCQl7IC5yZWcgPSAweDAxMTMsICAgICAgICAgICAgICAgICAgICAgICAgLnZhbCA9IDB4MTUsIH0sCisJCXsgLnJlZyA9IDB4MDExNCwgICAgICAgICAgICAgICAgICAgICAgICAudmFsID0gMHgxOCwgfSwKKwkJeyAucmVnID0gMHgwMTE1LCAgICAgICAgICAgICAgICAgICAgICAgIC52YWwgPSAweGZmLCB9LAorCQl7IC5yZWcgPSAweDAxMTYsICAgICAgICAgICAgICAgICAgICAgICAgLnZhbCA9IDB4M2MsIH0sCisJCXsgLnJlZyA9IDB4MDIxNCwgICAgICAgICAgICAgICAgICAgICAgICAudmFsID0gMHg2NywgfSwKKwkJeyAucmVnID0gMHgwNDI0LCAgICAgICAgICAgICAgICAgICAgICAgIC52YWwgPSAweDhkLCB9LAorCQl7IC5yZWcgPSAweDA0MjcsICAgICAgICAgICAgICAgICAgICAgICAgLnZhbCA9IDB4MTIsIH0sCisJCXsgLnJlZyA9IDB4MDQyOCwgICAgICAgICAgICAgICAgICAgICAgICAudmFsID0gMHg0ZiwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfSUZCV18xLCAgICAgICAgICAgICAgIC52YWwgPSAweDgwLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9JRkJXXzIsICAgICAgICAgICAgICAgLnZhbCA9IDB4MDAsIH0sCisJCXsgLnJlZyA9IDB4MDMwYSwgICAgICAgICAgICAgICAgICAgICAgICAudmFsID0gMHgwOCwgfSwKKwkJeyAucmVnID0gMHgwMzBiLCAgICAgICAgICAgICAgICAgICAgICAgIC52YWwgPSAweDliLCB9LAorCQl7IC5yZWcgPSAweDAzMGQsICAgICAgICAgICAgICAgICAgICAgICAgLnZhbCA9IDB4MDAsIH0sCisJCXsgLnJlZyA9IDB4MDMwZSwgICAgICAgICAgICAgICAgICAgICAgICAudmFsID0gMHgxYywgfSwKKwkJeyAucmVnID0gMHgwMzE0LCAgICAgICAgICAgICAgICAgICAgICAgIC52YWwgPSAweGUxLCB9LAorCQl7IC5yZWcgPSAweDAwMGQsICAgICAgICAgICAgICAgICAgICAgICAgLnZhbCA9IDB4ODIsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X1RQX0NUUkxfMSwgICAgICAgICAgICAudmFsID0gMHg1YiwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfVFBfQ1RSTF8xLCAgICAgICAgICAgIC52YWwgPSAweDViLCB9LAorCX07CisKIAlzdGF0aWMgc3RydWN0IGxnZHQzMzA1X3JlZyBsZ2R0MzMwNV9pbml0X2RhdGFbXSA9IHsKLQkJeyAucmVnID0gTEdEVDMzMDVfR0VOX0NUUkxfMSwKLQkJICAudmFsID0gMHgwMywgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfR0VOX0NUUkxfMiwKLQkJICAudmFsID0gMHhiMCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfR0VOX0NUUkxfMywKLQkJICAudmFsID0gMHgwMSwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfR0VOX0NPTlRST0wsCi0JCSAgLnZhbCA9IDB4NmYsIH0sCi0JCXsgLnJlZyA9IExHRFQzMzA1X0dFTl9DVFJMXzQsCi0JCSAgLnZhbCA9IDB4MDMsIH0sCi0JCXsgLnJlZyA9IExHRFQzMzA1X0RHVExfQUdDX1JFRl8xLAotCQkgIC52YWwgPSAweDMyLCB9LAotCQl7IC5yZWcgPSBMR0RUMzMwNV9ER1RMX0FHQ19SRUZfMiwKLQkJICAudmFsID0gMHhjNCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSX0ZSRVFfMSwKLQkJICAudmFsID0gMHgwMCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSX0ZSRVFfMiwKLQkJICAudmFsID0gMHgwMCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSX0ZSRVFfMywKLQkJICAudmFsID0gMHgwMCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSX0ZSRVFfNCwKLQkJICAudmFsID0gMHgwMCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSTF83LAotCQkgIC52YWwgPSAweDc5LCB9LAotCQl7IC5yZWcgPSBMR0RUMzMwNV9BR0NfUE9XRVJfUkVGXzEsCi0JCSAgLnZhbCA9IDB4MzIsIH0sCi0JCXsgLnJlZyA9IExHRFQzMzA1X0FHQ19QT1dFUl9SRUZfMiwKLQkJICAudmFsID0gMHhjNCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfQUdDX0RFTEFZX1BUXzEsCi0JCSAgLnZhbCA9IDB4MGQsIH0sCi0JCXsgLnJlZyA9IExHRFQzMzA1X0FHQ19ERUxBWV9QVF8yLAotCQkgIC52YWwgPSAweDMwLCB9LAotCQl7IC5yZWcgPSBMR0RUMzMwNV9SRkFHQ19MT09QX0ZMVFJfQldfMSwKLQkJICAudmFsID0gMHg4MCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfUkZBR0NfTE9PUF9GTFRSX0JXXzIsCi0JCSAgLnZhbCA9IDB4MDAsIH0sCi0JCXsgLnJlZyA9IExHRFQzMzA1X0lGQldfMSwKLQkJICAudmFsID0gMHg4MCwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfSUZCV18yLAotCQkgIC52YWwgPSAweDAwLCB9LAotCQl7IC5yZWcgPSBMR0RUMzMwNV9BR0NfQ1RSTF8xLAotCQkgIC52YWwgPSAweDMwLCB9LAotCQl7IC5yZWcgPSBMR0RUMzMwNV9BR0NfQ1RSTF80LAotCQkgIC52YWwgPSAweDYxLCB9LAotCQl7IC5yZWcgPSBMR0RUMzMwNV9GRUNfQkxPQ0tfQ1RSTCwKLQkJICAudmFsID0gMHhmZiwgfSwKLQkJeyAucmVnID0gTEdEVDMzMDVfVFBfQ1RSTF8xLAotCQkgIC52YWwgPSAweDFiLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9HRU5fQ1RSTF8xLCAgICAgICAgICAgLnZhbCA9IDB4MDMsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0dFTl9DVFJMXzIsICAgICAgICAgICAudmFsID0gMHhiMCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfR0VOX0NUUkxfMywgICAgICAgICAgIC52YWwgPSAweDAxLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9HRU5fQ09OVFJPTCwgICAgICAgICAgLnZhbCA9IDB4NmYsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0dFTl9DVFJMXzQsICAgICAgICAgICAudmFsID0gMHgwMywgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfREdUTF9BR0NfUkVGXzEsICAgICAgIC52YWwgPSAweDMyLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9ER1RMX0FHQ19SRUZfMiwgICAgICAgLnZhbCA9IDB4YzQsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0NSX0NUUl9GUkVRXzEsICAgICAgICAudmFsID0gMHgwMCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSX0ZSRVFfMiwgICAgICAgIC52YWwgPSAweDAwLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9DUl9DVFJfRlJFUV8zLCAgICAgICAgLnZhbCA9IDB4MDAsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0NSX0NUUl9GUkVRXzQsICAgICAgICAudmFsID0gMHgwMCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfQ1JfQ1RSTF83LCAgICAgICAgICAgIC52YWwgPSAweDc5LCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9BR0NfUE9XRVJfUkVGXzEsICAgICAgLnZhbCA9IDB4MzIsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0FHQ19QT1dFUl9SRUZfMiwgICAgICAudmFsID0gMHhjNCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfQUdDX0RFTEFZX1BUXzEsICAgICAgIC52YWwgPSAweDBkLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9BR0NfREVMQVlfUFRfMiwgICAgICAgLnZhbCA9IDB4MzAsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X1JGQUdDX0xPT1BfRkxUUl9CV18xLCAudmFsID0gMHg4MCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfUkZBR0NfTE9PUF9GTFRSX0JXXzIsIC52YWwgPSAweDAwLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9JRkJXXzEsICAgICAgICAgICAgICAgLnZhbCA9IDB4ODAsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0lGQldfMiwgICAgICAgICAgICAgICAudmFsID0gMHgwMCwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfQUdDX0NUUkxfMSwgICAgICAgICAgIC52YWwgPSAweDMwLCB9LAorCQl7IC5yZWcgPSBMR0RUMzMwNV9BR0NfQ1RSTF80LCAgICAgICAgICAgLnZhbCA9IDB4NjEsIH0sCisJCXsgLnJlZyA9IExHRFQzMzA1X0ZFQ19CTE9DS19DVFJMLCAgICAgICAudmFsID0gMHhmZiwgfSwKKwkJeyAucmVnID0gTEdEVDMzMDVfVFBfQ1RSTF8xLCAgICAgICAgICAgIC52YWwgPSAweDFiLCB9LAogCX07CiAKIAlsZ19kYmcoIlxuIik7CiAKLQlyZXQgPSBsZ2R0MzMwNV93cml0ZV9yZWdzKHN0YXRlLCBsZ2R0MzMwNV9pbml0X2RhdGEsCi0JCQkJICBBUlJBWV9TSVpFKGxnZHQzMzA1X2luaXRfZGF0YSkpOworCXN3aXRjaCAoc3RhdGUtPmNmZy0+ZGVtb2RfY2hpcCkgeworCWNhc2UgTEdEVDMzMDQ6CisJCXJldCA9IGxnZHQzMzA1X3dyaXRlX3JlZ3Moc3RhdGUsIGxnZHQzMzA0X2luaXRfZGF0YSwKKwkJCQkJICBBUlJBWV9TSVpFKGxnZHQzMzA0X2luaXRfZGF0YSkpOworCQlicmVhazsKKwljYXNlIExHRFQzMzA1OgorCQlyZXQgPSBsZ2R0MzMwNV93cml0ZV9yZWdzKHN0YXRlLCBsZ2R0MzMwNV9pbml0X2RhdGEsCisJCQkJCSAgQVJSQVlfU0laRShsZ2R0MzMwNV9pbml0X2RhdGEpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CiAJaWYgKGxnX2ZhaWwocmV0KSkKIAkJZ290byBmYWlsOwogCkBAIC02NDAsNiArNjc3LDc2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBsZ2R0MzMwNF9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQoreworCXN0cnVjdCBsZ2R0MzMwNV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCisJbGdfZGJnKCIoJWQsICVkKVxuIiwgcGFyYW0tPmZyZXF1ZW5jeSwgcGFyYW0tPnUudnNiLm1vZHVsYXRpb24pOworCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJcmV0ID0gZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW0pOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwkJaWYgKGxnX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ID0gcGFyYW0tPmZyZXF1ZW5jeTsKKwl9CisKKwlyZXQgPSBsZ2R0MzMwNV9zZXRfbW9kdWxhdGlvbihzdGF0ZSwgcGFyYW0pOworCWlmIChsZ19mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGxnZHQzMzA1X3Bhc3NiYW5kX2RpZ2l0YWxfYWdjKHN0YXRlLCBwYXJhbSk7CisJaWYgKGxnX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbGdkdDMzMDVfYWdjX3NldHVwKHN0YXRlLCBwYXJhbSk7CisJaWYgKGxnX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJLyogcmVnIDB4MDMwZCBpcyAzMzA0LW9ubHkuLi4gc2VlbiBpbiB2c2IgYW5kIHFhbSB1c2Jzbm9vcHMuLi4gKi8KKwlzd2l0Y2ggKHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7CisJY2FzZSBWU0JfODoKKwkJbGdkdDMzMDVfd3JpdGVfcmVnKHN0YXRlLCAweDAzMGQsIDB4MDApOworCQlsZ2R0MzMwNV93cml0ZV9yZWcoc3RhdGUsIExHRFQzMzA1X0NSX0NUUl9GUkVRXzEsIDB4NGYpOworCQlsZ2R0MzMwNV93cml0ZV9yZWcoc3RhdGUsIExHRFQzMzA1X0NSX0NUUl9GUkVRXzIsIDB4MGMpOworCQlsZ2R0MzMwNV93cml0ZV9yZWcoc3RhdGUsIExHRFQzMzA1X0NSX0NUUl9GUkVRXzMsIDB4YWMpOworCQlsZ2R0MzMwNV93cml0ZV9yZWcoc3RhdGUsIExHRFQzMzA1X0NSX0NUUl9GUkVRXzQsIDB4YmEpOworCQlicmVhazsKKwljYXNlIFFBTV82NDoKKwljYXNlIFFBTV8yNTY6CisJCWxnZHQzMzA1X3dyaXRlX3JlZyhzdGF0ZSwgMHgwMzBkLCAweDE0KTsKKwkJcmV0ID0gbGdkdDMzMDVfc2V0X2lmKHN0YXRlLCBwYXJhbSk7CisJCWlmIChsZ19mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJcmV0ID0gbGdkdDMzMDVfc3BlY3RyYWxfaW52ZXJzaW9uKHN0YXRlLCBwYXJhbSwKKwkJCQkJICBzdGF0ZS0+Y2ZnLT5zcGVjdHJhbF9pbnZlcnNpb24KKwkJCQkJICA/IDEgOiAwKTsKKwlpZiAobGdfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gcGFyYW0tPnUudnNiLm1vZHVsYXRpb247CisKKwlyZXQgPSBsZ2R0MzMwNV9tcGVnX21vZGUoc3RhdGUsIHN0YXRlLT5jZmctPm1wZWdfbW9kZSk7CisJaWYgKGxnX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJLyogbGdkdDMzMDVfbXBlZ19tb2RlX3BvbGFyaXR5IGNhbGxzIGxnZHQzMzA1X3NvZnRfcmVzZXQgKi8KKwlyZXQgPSBsZ2R0MzMwNV9tcGVnX21vZGVfcG9sYXJpdHkoc3RhdGUsCisJCQkJCSAgc3RhdGUtPmNmZy0+dHBjbGtfZWRnZSwKKwkJCQkJICBzdGF0ZS0+Y2ZnLT50cHZhbGlkX3BvbGFyaXR5KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBsZ2R0MzMwNV9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQkgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQogewpAQCAtODQ4LDYgKzk1NSwxMCBAQAogCXN3aXRjaCAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbikgewogCWNhc2UgUUFNXzI1NjoKIAljYXNlIFFBTV82NDoKKwkJLyogc2lnbmFsIGJpdCBpcyB1bnJlbGlhYmxlIG9uIHRoZSBEVDMzMDQgaW4gUUFNIG1vZGUgKi8KKwkJaWYgKCgoTEdEVDMzMDQgPT0gc3RhdGUtPmNmZy0+ZGVtb2RfY2hpcCkpICYmIChjcl9sb2NrKSkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKKwogCQlyZXQgPSBsZ2R0MzMwNV9yZWFkX2ZlY19sb2NrX3N0YXR1cyhzdGF0ZSwgJmZlY19sb2NrKTsKIAkJaWYgKGxnX2ZhaWwocmV0KSkKIAkJCWdvdG8gZmFpbDsKQEAgLTk5Myw2ICsxMTA0LDcgQEAKIAlrZnJlZShzdGF0ZSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBsZ2R0MzMwNF9vcHM7CiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbGdkdDMzMDVfb3BzOwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsZ2R0MzMwNV9hdHRhY2goY29uc3Qgc3RydWN0IGxnZHQzMzA1X2NvbmZpZyAqY29uZmlnLApAQCAtMTAxMywxMSArMTEyNSwyMSBAQAogCXN0YXRlLT5jZmcgPSBjb25maWc7CiAJc3RhdGUtPmkyY19hZGFwID0gaTJjX2FkYXA7CiAKLQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZsZ2R0MzMwNV9vcHMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN3aXRjaCAoY29uZmlnLT5kZW1vZF9jaGlwKSB7CisJY2FzZSBMR0RUMzMwNDoKKwkJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmbGdkdDMzMDRfb3BzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJCWJyZWFrOworCWNhc2UgTEdEVDMzMDU6CisJCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmxnZHQzMzA1X29wcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGZhaWw7CisJfQogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKLQkvKiB2ZXJpZnkgdGhhdCB3ZSdyZSB0YWxraW5nIHRvIGEgbGcgZHQzMzA1ICovCisJLyogdmVyaWZ5IHRoYXQgd2UncmUgdGFsa2luZyB0byBhIGxnIGR0MzMwNC81ICovCiAJcmV0ID0gbGdkdDMzMDVfcmVhZF9yZWcoc3RhdGUsIExHRFQzMzA1X0dFTl9DVFJMXzIsICZ2YWwpOwogCWlmICgobGdfZmFpbChyZXQpKSB8ICh2YWwgPT0gMCkpCiAJCWdvdG8gZmFpbDsKQEAgLTEwMzYsMTIgKzExNTgsMzUgQEAKIAogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogZmFpbDoKLQlsZ193YXJuKCJ1bmFibGUgdG8gZGV0ZWN0IExHRFQzMzA1IGhhcmR3YXJlXG4iKTsKKwlsZ193YXJuKCJ1bmFibGUgdG8gZGV0ZWN0ICVzIGhhcmR3YXJlXG4iLAorCQljb25maWctPmRlbW9kX2NoaXAgPyAiTEdEVDMzMDQiIDogIkxHRFQzMzA1Iik7CiAJa2ZyZWUoc3RhdGUpOwogCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChsZ2R0MzMwNV9hdHRhY2gpOwogCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbGdkdDMzMDRfb3BzID0geworCS5pbmZvID0geworCQkubmFtZSA9ICJMRyBFbGVjdHJvbmljcyBMR0RUMzMwNCBWU0IvUUFNIEZyb250ZW5kIiwKKwkJLnR5cGUgICAgICAgICAgICAgICA9IEZFX0FUU0MsCisJCS5mcmVxdWVuY3lfbWluICAgICAgPSA1NDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggICAgICA9IDg1ODAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDYyNTAwLAorCQkuY2FwcyA9IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzI1NiB8IEZFX0NBTl84VlNCCisJfSwKKwkuaTJjX2dhdGVfY3RybCAgICAgICAgPSBsZ2R0MzMwNV9pMmNfZ2F0ZV9jdHJsLAorCS5pbml0ICAgICAgICAgICAgICAgICA9IGxnZHQzMzA1X2luaXQsCisJLnNldF9mcm9udGVuZCAgICAgICAgID0gbGdkdDMzMDRfc2V0X3BhcmFtZXRlcnMsCisJLmdldF9mcm9udGVuZCAgICAgICAgID0gbGdkdDMzMDVfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyAgICA9IGxnZHQzMzA1X2dldF90dW5lX3NldHRpbmdzLAorCS5yZWFkX3N0YXR1cyAgICAgICAgICA9IGxnZHQzMzA1X3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciAgICAgICAgICAgICA9IGxnZHQzMzA1X3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGxnZHQzMzA1X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciAgICAgICAgICAgICA9IGxnZHQzMzA1X3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzICAgICAgICA9IGxnZHQzMzA1X3JlYWRfdWNibG9ja3MsCisJLnJlbGVhc2UgICAgICAgICAgICAgID0gbGdkdDMzMDVfcmVsZWFzZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBsZ2R0MzMwNV9vcHMgPSB7CiAJLmluZm8gPSB7CiAJCS5uYW1lID0gIkxHIEVsZWN0cm9uaWNzIExHRFQzMzA1IFZTQi9RQU0gRnJvbnRlbmQiLApAQCAtMTA2NSwxMCArMTIxMCwxMCBAQAogCS5yZWxlYXNlICAgICAgICAgICAgICA9IGxnZHQzMzA1X3JlbGVhc2UsCiB9OwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkxHIEVsZWN0cm9uaWNzIExHRFQzMzA1IEFUU0MvUUFNLUIgRGVtb2R1bGF0b3IgRHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxHIEVsZWN0cm9uaWNzIExHRFQzMzA0LzUgQVRTQy9RQU0tQiBEZW1vZHVsYXRvciBEcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjAuMSIpOworTU9EVUxFX1ZFUlNJT04oIjAuMiIpOwogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDUuaAppbmRleCA5Y2IxMWM5Li4wMjE3MmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDUuaApAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiAgICBTdXBwb3J0IGZvciBMR0RUMzMwNSAtIFZTQi9RQU0KKyAqICAgIFN1cHBvcnQgZm9yIExHIEVsZWN0cm9uaWNzIExHRFQzMzA0IGFuZCBMR0RUMzMwNSAtIFZTQi9RQU0KICAqCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbGludXh0di5vcmc+CiAgKgogICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC00MSw2ICs0MSwxMSBAQAogCUxHRFQzMzA1X1RQX1ZBTElEX0hJR0ggPSAxLAogfTsKIAorZW51bSBsZ2R0X2RlbW9kX2NoaXBfdHlwZSB7CisJTEdEVDMzMDUgPSAwLAorCUxHRFQzMzA0ID0gMSwKK307CisKIHN0cnVjdCBsZ2R0MzMwNV9jb25maWcgewogCXU4IGkyY19hZGRyOwogCkBAIC02NSw2ICs3MCw3IEBACiAJZW51bSBsZ2R0MzMwNV9tcGVnX21vZGUgbXBlZ19tb2RlOwogCWVudW0gbGdkdDMzMDVfdHBfY2xvY2tfZWRnZSB0cGNsa19lZGdlOwogCWVudW0gbGdkdDMzMDVfdHBfdmFsaWRfcG9sYXJpdHkgdHB2YWxpZF9wb2xhcml0eTsKKwllbnVtIGxnZHRfZGVtb2RfY2hpcF90eXBlIGRlbW9kX2NoaXA7CiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX0xHRFQzMzA1KSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0xHRFQzMzA1X01PRFVMRSkgJiYgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnczhneHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ3M4Z3h4LmMKaW5kZXggZGVlNTM5Ni4uNWVhMjhhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnczhneHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdzOGd4eC5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKIApAQCAtNDYsNDIgKzQ3LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZmFrZV9zaWduYWxfc3RyLCAiZmFrZSBzaWduYWwgc3RyZW5ndGggZm9yIExHUzg5MTMuIgogIlNpZ25hbCBzdHJlbmd0aCBjYWxjdWxhdGlvbiBpcyBzbG93LihkZWZhdWx0Om9uKS4iKTsKIAotc3RhdGljIGNvbnN0IHU4IGxnczhnNzVfaW5pdGRhdFtdID0gewotCTB4MDEsIDB4MzAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAotCTB4RTQsIDB4RjUsIDB4QTgsIDB4RjUsIDB4QjgsIDB4RjUsIDB4ODgsIDB4RjUsCi0JMHg4OSwgMHhGNSwgMHg4NywgMHg3NSwgMHhEMCwgMHgwMCwgMHgxMSwgMHg1MCwKLQkweDExLCAweDUwLCAweEY0LCAweEY1LCAweDgwLCAweEY1LCAweDkwLCAweEY1LAotCTB4QTAsIDB4RjUsIDB4QjAsIDB4NzUsIDB4ODEsIDB4MzAsIDB4ODAsIDB4MDEsCi0JMHgzMiwgMHg5MCwgMHg4MCwgMHgxMiwgMHg3NCwgMHhGRiwgMHhGMCwgMHg5MCwKLQkweDgwLCAweDEzLCAweDc0LCAweDFGLCAweEYwLCAweDkwLCAweDgwLCAweDIzLAotCTB4NzQsIDB4MDEsIDB4RjAsIDB4OTAsIDB4ODAsIDB4MjIsIDB4RjAsIDB4OTAsCi0JMHgwMCwgMHg0OCwgMHg3NCwgMHgwMCwgMHhGMCwgMHg5MCwgMHg4MCwgMHg0RCwKLQkweDc0LCAweDA1LCAweEYwLCAweDkwLCAweDgwLCAweDA5LCAweEUwLCAweDYwLAotCTB4MjEsIDB4MTIsIDB4MDAsIDB4REQsIDB4MTQsIDB4NjAsIDB4MUIsIDB4MTIsCi0JMHgwMCwgMHhERCwgMHgxNCwgMHg2MCwgMHgxNSwgMHgxMiwgMHgwMCwgMHhERCwKLQkweDE0LCAweDYwLCAweDBGLCAweDEyLCAweDAwLCAweERELCAweDE0LCAweDYwLAotCTB4MDksIDB4MTIsIDB4MDAsIDB4REQsIDB4MTQsIDB4NjAsIDB4MDMsIDB4MTIsCi0JMHgwMCwgMHhERCwgMHg5MCwgMHg4MCwgMHg0MiwgMHhFMCwgMHg2MCwgMHgwQiwKLQkweDE0LCAweDYwLCAweDBDLCAweDE0LCAweDYwLCAweDBELCAweDE0LCAweDYwLAotCTB4MEUsIDB4MDEsIDB4QjMsIDB4NzQsIDB4MDQsIDB4MDEsIDB4QjksIDB4NzQsCi0JMHgwNSwgMHgwMSwgMHhCOSwgMHg3NCwgMHgwNywgMHgwMSwgMHhCOSwgMHg3NCwKLQkweDBBLCAweEMwLCAweEUwLCAweDc0LCAweEM4LCAweDEyLCAweDAwLCAweEUyLAotCTB4RDAsIDB4RTAsIDB4MTQsIDB4NzAsIDB4RjQsIDB4OTAsIDB4ODAsIDB4MDksCi0JMHhFMCwgMHg3MCwgMHhBRSwgMHgxMiwgMHgwMCwgMHhGNiwgMHgxMiwgMHgwMCwKLQkweEZFLCAweDkwLCAweDAwLCAweDQ4LCAweEUwLCAweDA0LCAweEYwLCAweDkwLAotCTB4ODAsIDB4NEUsIDB4RjAsIDB4MDEsIDB4NzMsIDB4OTAsIDB4ODAsIDB4MDgsCi0JMHhGMCwgMHgyMiwgMHhGOCwgMHg3QSwgMHgwQywgMHg3OSwgMHhGRCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LAotCTB4RjYsIDB4REEsIDB4RjIsIDB4RDgsIDB4RUUsIDB4MjIsIDB4OTAsIDB4ODAsCi0JMHg2NSwgMHhFMCwgMHg1NCwgMHhGRCwgMHhGMCwgMHgyMiwgMHg5MCwgMHg4MCwKLQkweDY1LCAweEUwLCAweDQ0LCAweEMyLCAweEYwLCAweDIyCi19OwotCiAvKiBMR1M4R1hYIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgKi8KIAogc3RhdGljIGludCBsZ3M4Z3h4X3dyaXRlX3JlZyhzdHJ1Y3QgbGdzOGd4eF9zdGF0ZSAqcHJpdiwgdTggcmVnLCB1OCBkYXRhKQpAQCAtNjI3LDkgKzU5MiwxNCBAQAogCiBzdGF0aWMgaW50IGxnczhnNzVfaW5pdF9kYXRhKHN0cnVjdCBsZ3M4Z3h4X3N0YXRlICpwcml2KQogewotCWNvbnN0IHU4ICpwID0gbGdzOGc3NV9pbml0ZGF0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJaW50IHJjOwogCWludCBpOwogCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgImxnczhnNzUuZnciLCAmcHJpdi0+aTJjLT5kZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCiAJbGdzOGd4eF93cml0ZV9yZWcocHJpdiwgMHhDNiwgMHg0MCk7CiAKIAlsZ3M4Z3h4X3dyaXRlX3JlZyhwcml2LCAweDNELCAweDA0KTsKQEAgLTY0MCwxNiArNjEwLDE2IEBACiAJbGdzOGd4eF93cml0ZV9yZWcocHJpdiwgMHgzQiwgMHgwMCk7CiAJbGdzOGd4eF93cml0ZV9yZWcocHJpdiwgMHgzOCwgMHgwMCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGxnczhnNzVfaW5pdGRhdCk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZTsgaSsrKSB7CiAJCWxnczhneHhfd3JpdGVfcmVnKHByaXYsIDB4MzgsIDB4MDApOwogCQlsZ3M4Z3h4X3dyaXRlX3JlZyhwcml2LCAweDNBLCAodTgpKGkmMHhmZikpOwogCQlsZ3M4Z3h4X3dyaXRlX3JlZyhwcml2LCAweDNCLCAodTgpKGk+PjgpKTsKLQkJbGdzOGd4eF93cml0ZV9yZWcocHJpdiwgMHgzQywgKnApOwotCQlwKys7CisJCWxnczhneHhfd3JpdGVfcmVnKHByaXYsIDB4M0MsIGZ3LT5kYXRhW2ldKTsKIAl9CiAKIAlsZ3M4Z3h4X3dyaXRlX3JlZyhwcml2LCAweDM4LCAweDAwKTsKIAorCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbWI4NmExNi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL21iODZhMTYuYwppbmRleCA1OTlkMWFhLi4zM2I2MzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbWI4NmExNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tYjg2YTE2LmMKQEAgLTE4MzMsNyArMTgzMyw2IEBACiAKIAkuZ2V0X2Zyb250ZW5kX2FsZ28JCT0gbWI4NmExNl9mcm9udGVuZF9hbGdvLAogCS5zZWFyY2gJCQkJPSBtYjg2YTE2X3NlYXJjaCwKLQkucmVhZF9zdGF0dXMJCQk9IG1iODZhMTZfcmVhZF9zdGF0dXMsCiAJLmluaXQJCQkJPSBtYjg2YTE2X2luaXQsCiAJLnNsZWVwCQkJCT0gbWI4NmExNl9zbGVlcCwKIAkucmVhZF9zdGF0dXMJCQk9IG1iODZhMTZfcmVhZF9zdGF0dXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0OC5jCmluZGV4IDRlMmE3YzguLjkzZjZhNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0OC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCiAjaW5jbHVkZSAiZHZiX21hdGguaCIKQEAgLTQ5LDggKzUwLDggQEAKICNkZWZpbmUgVERBMTAwNDhfQ09ORl9DNF8xICAgICAgICAgMHgxRQogI2RlZmluZSBUREExMDA0OF9DT05GX0M0XzIgICAgICAgICAweDFGCiAjZGVmaW5lIFREQTEwMDQ4X0NPREVfSU5fUkFNICAgICAgIDB4MjAKLSNkZWZpbmUgVERBMTAwNDhfQ0hBTk5FTF9JTkZPXzFfUiAgMHgyMgotI2RlZmluZSBUREExMDA0OF9DSEFOTkVMX0lORk9fMl9SICAweDIzCisjZGVmaW5lIFREQTEwMDQ4X0NIQU5ORUxfSU5GTzFfUiAgIDB4MjIKKyNkZWZpbmUgVERBMTAwNDhfQ0hBTk5FTF9JTkZPMl9SICAgMHgyMwogI2RlZmluZSBUREExMDA0OF9DSEFOTkVMX0lORk8xICAgICAweDI0CiAjZGVmaW5lIFREQTEwMDQ4X0NIQU5ORUxfSU5GTzIgICAgIDB4MjUKICNkZWZpbmUgVERBMTAwNDhfVElNRV9FUlJPUl9SICAgICAgMHgyNgpAQCAtNjMsOCArNjQsOCBAQAogI2RlZmluZSBUREExMDA0OF9JVF9TVEFUICAgICAgICAgICAweDMyCiAjZGVmaW5lIFREQTEwMDQ4X0RTUF9BRF9MU0IgICAgICAgIDB4M0MKICNkZWZpbmUgVERBMTAwNDhfRFNQX0FEX01TQiAgICAgICAgMHgzRAotI2RlZmluZSBUREExMDA0OF9EU1BfUkVGX0xTQiAgICAgICAweDNFCi0jZGVmaW5lIFREQTEwMDQ4X0RTUF9SRUZfTVNCICAgICAgIDB4M0YKKyNkZWZpbmUgVERBMTAwNDhfRFNQX1JFR19MU0IgICAgICAgMHgzRQorI2RlZmluZSBUREExMDA0OF9EU1BfUkVHX01TQiAgICAgICAweDNGCiAjZGVmaW5lIFREQTEwMDQ4X0NPTkZfVFJJU1RBVEUxICAgIDB4NDQKICNkZWZpbmUgVERBMTAwNDhfQ09ORl9UUklTVEFURTIgICAgMHg0NQogI2RlZmluZSBUREExMDA0OF9DT05GX1BPTEFSSVRZICAgICAweDQ2CkBAIC0xMTIsNyArMTEzLDcgQEAKICNkZWZpbmUgVERBMTAwNDhfRlJFRV9SRUdfMSAgICAgICAgMHhCMgogI2RlZmluZSBUREExMDA0OF9GUkVFX1JFR18yICAgICAgICAweEIzCiAjZGVmaW5lIFREQTEwMDQ4X0NPTkZfQzNfMSAgICAgICAgIDB4QzAKLSNkZWZpbmUgVERBMTAwNDhfQ1lCRVJfQ1RSTCAgICAgICAgMHhDMgorI2RlZmluZSBUREExMDA0OF9DVkJFUl9DVFJMICAgICAgICAweEMyCiAjZGVmaW5lIFREQTEwMDQ4X0NCRVJfTk1BWF9MU0IgICAgIDB4QzQKICNkZWZpbmUgVERBMTAwNDhfQ0JFUl9OTUFYX01TQiAgICAgMHhDNQogI2RlZmluZSBUREExMDA0OF9DQkVSX0xTQiAgICAgICAgICAweEM2CkBAIC0xMjAsNyArMTIxLDcgQEAKICNkZWZpbmUgVERBMTAwNDhfVkJFUl9MU0IgICAgICAgICAgMHhDOAogI2RlZmluZSBUREExMDA0OF9WQkVSX01JRCAgICAgICAgICAweEM5CiAjZGVmaW5lIFREQTEwMDQ4X1ZCRVJfTVNCICAgICAgICAgIDB4Q0EKLSNkZWZpbmUgVERBMTAwNDhfQ1lCRVJfTFVUICAgICAgICAgMHhDQworI2RlZmluZSBUREExMDA0OF9DVkJFUl9MVVQgICAgICAgICAweENDCiAjZGVmaW5lIFREQTEwMDQ4X1VOQ09SX0NUUkwgICAgICAgIDB4Q0QKICNkZWZpbmUgVERBMTAwNDhfVU5DT1JfQ1BUX0xTQiAgICAgMHhDRQogI2RlZmluZSBUREExMDA0OF9VTkNPUl9DUFRfTVNCICAgICAweENGCkBAIC0xODMsNyArMTg0LDcgQEAKIAl7IFREQTEwMDQ4X0FHQ19JRl9NQVgsIDB4ZmYgfSwKIAl7IFREQTEwMDQ4X0FHQ19USFJFU0hPTERfTVNCLCAweDAwIH0sCiAJeyBUREExMDA0OF9BR0NfVEhSRVNIT0xEX0xTQiwgMHg3MCB9LAotCXsgVERBMTAwNDhfQ1lCRVJfQ1RSTCwgMHgzOCB9LAorCXsgVERBMTAwNDhfQ1ZCRVJfQ1RSTCwgMHgzOCB9LAogCXsgVERBMTAwNDhfQUdDX0dBSU5TLCAweDEyIH0sCiAJeyBUREExMDA0OF9DT05GX1hPLCAweDAwIH0sCiAJeyBUREExMDA0OF9DT05GX1RTMSwgMHgwNyB9LApAQCAtNjg4LDcgKzY4OSw3IEBACiAJCXAtPmd1YXJkX2ludGVydmFsID0gIEdVQVJEX0lOVEVSVkFMXzFfNDsKIAkJYnJlYWs7CiAJfQotCXN3aXRjaCAodmFsICYgMHgwMikgeworCXN3aXRjaCAodmFsICYgMHgwMykgewogCWNhc2UgMDoKIAkJcC0+dHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKIAkJYnJlYWs7CkBAIC03NjUsNiArNzY2LDggQEAKIAogCS8qIEVuYWJsZSBkZW1vZCBUUFMgYXV0byBkZXRlY3Rpb24gYW5kIGJlZ2luIGFjcXVpc2l0aW9uICovCiAJdGRhMTAwNDhfd3JpdGVyZWcoc3RhdGUsIFREQTEwMDQ4X0FVVE8sIDB4NTcpOworCS8qIHRyaWdnZXIgY2JlciBhbmQgdmJlciBhY3F1aXNpdGlvbiAqLworCXRkYTEwMDQ4X3dyaXRlcmVnKHN0YXRlLCBUREExMDA0OF9DVkJFUl9DVFJMLCAweDNCKTsKIAogCXJldHVybiAwOwogfQpAQCAtODMwLDEyICs4MzMsMjcgQEAKIHN0YXRpYyBpbnQgdGRhMTAwNDhfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQogewogCXN0cnVjdCB0ZGExMDA0OF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdGF0aWMgdTMyIGNiZXJfY3VycmVudDsKKwl1MzIgY2Jlcl9ubWF4OworCXU2NCBjYmVyX3RtcDsKIAogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCS8qIFRPRE86IEEgcmVzZXQgbWF5IGJlIHJlcXVpcmVkIGhlcmUgKi8KLQkqYmVyID0gdGRhMTAwNDhfcmVhZHJlZyhzdGF0ZSwgVERBMTAwNDhfQ0JFUl9NU0IpIDw8IDggfAotCQl0ZGExMDA0OF9yZWFkcmVnKHN0YXRlLCBUREExMDA0OF9DQkVSX0xTQik7CisJLyogdXBkYXRlIGNiZXIgb24gaW50ZXJydXB0ICovCisJaWYgKHRkYTEwMDQ4X3JlYWRyZWcoc3RhdGUsIFREQTEwMDQ4X1NPRlRfSVRfQzMpICYgMHgwMSkgeworCQljYmVyX3RtcCA9IHRkYTEwMDQ4X3JlYWRyZWcoc3RhdGUsIFREQTEwMDQ4X0NCRVJfTVNCKSA8PCA4IHwKKwkJCXRkYTEwMDQ4X3JlYWRyZWcoc3RhdGUsIFREQTEwMDQ4X0NCRVJfTFNCKTsKKwkJY2Jlcl9ubWF4ID0gdGRhMTAwNDhfcmVhZHJlZyhzdGF0ZSwgVERBMTAwNDhfQ0JFUl9OTUFYX01TQikgPDwgOCB8CisJCQl0ZGExMDA0OF9yZWFkcmVnKHN0YXRlLCBUREExMDA0OF9DQkVSX05NQVhfTFNCKTsKKwkJY2Jlcl90bXAgKj0gMTAwMDAwMDAwOworCQljYmVyX3RtcCAqPSAyOworCQljYmVyX3RtcCA9IGRpdl91NjQoY2Jlcl90bXAsIChjYmVyX25tYXggKiAzMikgKyAxKTsKKwkJY2Jlcl9jdXJyZW50ID0gKHUzMiljYmVyX3RtcDsKKwkJLyogcmV0cmlnZ2VyIGNiZXIgYWNxdWlzaXRpb24gKi8KKwkJdGRhMTAwNDhfd3JpdGVyZWcoc3RhdGUsIFREQTEwMDQ4X0NWQkVSX0NUUkwsIDB4MzkpOworCX0KKwkvKiBhY3R1YWwgY2JlciBpcyAoKmJlcikvMWU4ICovCisJKmJlciA9IGNiZXJfY3VycmVudDsKIAogCXJldHVybiAwOwogfQpAQCAtMTAxNSw2ICsxMDMzLDkgQEAKIAogCSp1Y2Jsb2NrcyA9IHRkYTEwMDQ4X3JlYWRyZWcoc3RhdGUsIFREQTEwMDQ4X1VOQ09SX0NQVF9NU0IpIDw8IDggfAogCQl0ZGExMDA0OF9yZWFkcmVnKHN0YXRlLCBUREExMDA0OF9VTkNPUl9DUFRfTFNCKTsKKwkvKiBjbGVhciB0aGUgdW5jb3JyZWN0ZWQgVFMgcGFja2V0cyBjb3VudGVyIHdoZW4gc2F0dXJhdGVkICovCisJaWYgKCp1Y2Jsb2NrcyA9PSAweEZGRkYpCisJCXRkYTEwMDQ4X3dyaXRlcmVnKHN0YXRlLCBUREExMDA0OF9VTkNPUl9DVFJMLCAweDgwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvS2NvbmZpZwppbmRleCBmN2I3MmEzLi5kZWNkZWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvS2NvbmZpZwpAQCAtMTAsOSArMTAsMTUgQEAKIGNvbmZpZyBEVkJfTUFOVElTCiAJdHJpc3RhdGUgIk1BTlRJUyBiYXNlZCBjYXJkcyIKIAlkZXBlbmRzIG9uIE1BTlRJU19DT1JFICYmIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKLQlzZWxlY3QgRFZCX01CODZBMTYKLQlzZWxlY3QgRFZCX1pMMTAzNTMKLQlzZWxlY3QgRFZCX1NUVjAyOTkKKwlzZWxlY3QgRFZCX01CODZBMTYgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1pMMTAzNTMgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUVjAyOTkgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX0xOQlAyMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RCMDg5OSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RCNjEwMCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBNjY1eCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBMTAwMjEgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTEwMDIzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9QTEwKIAloZWxwCiAJICBTdXBwb3J0IGZvciBQQ0kgY2FyZHMgYmFzZWQgb24gdGhlIE1hbnRpcyBQQ0kgYnJpZGdlLgpAQCAtMjMsNyArMjksNyBAQAogY29uZmlnIERWQl9IT1BQRVIKIAl0cmlzdGF0ZSAiSE9QUEVSIGJhc2VkIGNhcmRzIgogCWRlcGVuZHMgb24gTUFOVElTX0NPUkUgJiYgRFZCX0NPUkUgJiYgUENJICYmIEkyQwotCXNlbGVjdCBEVkJfWkwxMDM1MworCXNlbGVjdCBEVkJfWkwxMDM1MyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfUExMCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgUENJIGNhcmRzIGJhc2VkIG9uIHRoZSBIb3BwZXIgIFBDSSBicmlkZ2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2lucHV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2lucHV0LmMKaW5kZXggM2Q0ZTQ2Ni4uYTk5NDg5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfaW5wdXQuYwpAQCAtMTksNyArMTksNyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvaXItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvaXItY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSAiZG14ZGV2LmgiCkBAIC0xMDQsNyArMTA0LDYgQEAKIGludCBtYW50aXNfaW5wdXRfaW5pdChzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKnJjOwotCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSByY19zdGF0ZTsKIAljaGFyIG5hbWVbODBdLCBkZXZbODBdOwogCWludCBlcnI7CiAKQEAgLTEyMCw4ICsxMTksNiBAQAogCXJjLT5uYW1lID0gbmFtZTsKIAlyYy0+cGh5cyA9IGRldjsKIAotCWlyX2lucHV0X2luaXQocmMsICZyY19zdGF0ZSwgSVJfVFlQRV9PVEhFUik7Ci0KIAlyYy0+aWQuYnVzdHlwZQk9IEJVU19QQ0k7CiAJcmMtPmlkLnZlbmRvcgk9IG1hbnRpcy0+dmVuZG9yX2lkOwogCXJjLT5pZC5wcm9kdWN0CT0gbWFudGlzLT5kZXZpY2VfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCmluZGV4IGNmZjc3ZTIuLjI1YjQzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCkBAIC02NCw5ICs2NCwxMSBAQAogCQkudHlwZQk9IFNNU19OT1ZBX0IwLAogCQkuZndbREVWSUNFX01PREVfSVNEQlRfQkRBXSA9ICJzbXMxeHh4LWhjdy01NXh4eC1pc2RidC0wMi5mdyIsCiAJCS5md1tERVZJQ0VfTU9ERV9EVkJUX0JEQV0gPSAic21zMXh4eC1oY3ctNTV4eHgtZHZidC0wMi5mdyIsCisJCS5yY19jb2RlcyA9IFJDX01BUF9SQzVfSEFVUFBBVUdFX05FVywKIAkJLmJvYXJkX2NmZy5sZWRzX3Bvd2VyID0gMjYsCiAJCS5ib2FyZF9jZmcubGVkMCA9IDI3LAogCQkuYm9hcmRfY2ZnLmxlZDEgPSAyOCwKKwkJLmJvYXJkX2NmZy5pciA9IDksCiAJCS5sZWRfcG93ZXIgPSAyNiwKIAkJLmxlZF9sbyAgICA9IDI3LAogCQkubGVkX2hpICAgID0gMjgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oCmluZGV4IDhmMTlmYzAuLmQ4Y2RmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oCkBAIC03NSw3ICs3NSw3IEBACiAJZW51bSBzbXNfZGV2aWNlX3R5cGVfc3QgdHlwZTsKIAljaGFyICpuYW1lLCAqZndbREVWSUNFX01PREVfTUFYXTsKIAlzdHJ1Y3Qgc21zX2JvYXJkX2dwaW9fY2ZnIGJvYXJkX2NmZzsKLQllbnVtIGlyX2tiX3R5cGUgaXJfa2JfdHlwZTsKKwljaGFyICpyY19jb2RlczsJCQkJLyogTmFtZSBvZiBJUiBjb2RlcyB0YWJsZSAqLwogCiAJLyogZ3Bpb3MgKi8KIAlpbnQgbGVkX3Bvd2VyLCBsZWRfaGksIGxlZF9sbywgbG5hX2N0cmwsIHJmX3N3aXRjaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYwppbmRleCAwYzg3YTNjLi43ZjJjOTRhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYwpAQCAtMTE2LDkgKzExNiw3IEBACiAJCQlyZXR1cm4gZW50cnk7CiAJCX0KIAl9Ci0JZW50cnkgPSAoc3RydWN0IHNtc2NvcmVfcmVnaXN0cnlfZW50cnlfdCAqKQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHNtc2NvcmVfcmVnaXN0cnlfZW50cnlfdCksCi0JCQkJR0ZQX0tFUk5FTCk7CisJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21zY29yZV9yZWdpc3RyeV9lbnRyeV90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVudHJ5KSB7CiAJCWVudHJ5LT5tb2RlID0gZGVmYXVsdF9tb2RlOwogCQlzdHJjcHkoZW50cnktPmRldnBhdGgsIGRldnBhdGgpOwpAQCAtMTI5Nyw3ICsxMjk1LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNtc2NsaWVudF9zZW5kcmVxdWVzdCk7CiAKIAotLyogb2xkIEdQSU8gbWFuYWdtZW50cyBpbXBsZW1lbnRhdGlvbiAqLworLyogb2xkIEdQSU8gbWFuYWdlbWVudHMgaW1wbGVtZW50YXRpb24gKi8KIGludCBzbXNjb3JlX2NvbmZpZ3VyZV9ncGlvKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlZGV2LCB1MzIgcGluLAogCQkJICAgc3RydWN0IHNtc2NvcmVfY29uZmlnX2dwaW8gKnBpbmNvbmZpZykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2lyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNpci5jCmluZGV4IGE1NmVhYzcuLmQwZTQ2MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zaXIuYwpAQCAtNCw2ICs0LDExIEBACiAgTURUViByZWNlaXZlciBrZXJuZWwgbW9kdWxlcy4KICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSwgVXJpIFNoa29sbmlrCiAKKyBDb3B5cmlnaHQgKGMpIDIwMTAgLSBNYXVybyBDYXJ2YWxobyBDaGVoYWIKKwktIFBvcnRlZCB0aGUgZHJpdmVyIHRvIHVzZSByYy1jb3JlCisJLSBJUiByYXcgZXZlbnQgZGVjb2RpbmcgaXMgbm93IGRvbmUgYXQgcmMtY29yZQorCS0gQ29kZSBhbG1vc3QgcmUtd3JpdHRlbgorCiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0yNywyMjYgKzMyLDI4IEBACiAjaW5jbHVkZSAic21zaXIuaCIKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKIAotLyogSW4gb3JkZXIgdG8gYWRkIG5ldyBJUiByZW1vdGUgY29udHJvbCAtCi0gKiAxKSBBZGQgaXQgdG8gdGhlIDxlbnVtIGlyX2tiX3R5cGU+IEAgc21zaXIsaCwKLSAqIDIpIEFkZCBpdHMgbWFwIHRvIGtleWJvYXJkX2xheW91dF9tYXBzIGJlbG93Ci0gKiAzKSBTZXQgeW91ciBib2FyZCAoc21zLWNhcmRzIHN1Yi1tb2R1bGUpIHRvIHVzZSBpdAotICovCi0KLXN0YXRpYyBzdHJ1Y3Qga2V5Ym9hcmRfbGF5b3V0X21hcF90IGtleWJvYXJkX2xheW91dF9tYXBzW10gPSB7Ci0JCVtTTVNfSVJfS0JfREVGQVVMVF9UVl0gPSB7Ci0JCQkuaXJfcHJvdG9jb2wgPSBJUl9SQzUsCi0JCQkucmM1X2tiZF9hZGRyZXNzID0gS0VZQk9BUkRfQUREUkVTU19UVjEsCi0JCQkua2V5Ym9hcmRfbGF5b3V0X21hcCA9IHsKLQkJCQkJS0VZXzAsIEtFWV8xLCBLRVlfMiwKLQkJCQkJS0VZXzMsIEtFWV80LCBLRVlfNSwKLQkJCQkJS0VZXzYsIEtFWV83LCBLRVlfOCwKLQkJCQkJS0VZXzksIDAsIDAsIEtFWV9QT1dFUiwKLQkJCQkJS0VZX01VVEUsIDAsIDAsCi0JCQkJCUtFWV9WT0xVTUVVUCwgS0VZX1ZPTFVNRURPV04sCi0JCQkJCUtFWV9CUklHSFRORVNTVVAsCi0JCQkJCUtFWV9CUklHSFRORVNTRE9XTiwgS0VZX0NIQU5ORUxVUCwKLQkJCQkJS0VZX0NIQU5ORUxET1dOLAotCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0JCQl9Ci0JCX0sCi0JCVtTTVNfSVJfS0JfSENXX1NJTFZFUl0gPSB7Ci0JCQkuaXJfcHJvdG9jb2wgPSBJUl9SQzUsCi0JCQkucmM1X2tiZF9hZGRyZXNzID0gS0VZQk9BUkRfQUREUkVTU19MSUdIVElORzEsCi0JCQkua2V5Ym9hcmRfbGF5b3V0X21hcCA9IHsKLQkJCQkJS0VZXzAsIEtFWV8xLCBLRVlfMiwKLQkJCQkJS0VZXzMsIEtFWV80LCBLRVlfNSwKLQkJCQkJS0VZXzYsIEtFWV83LCBLRVlfOCwKLQkJCQkJS0VZXzksIEtFWV9URVhULCBLRVlfUkVELAotCQkJCQlLRVlfUkFESU8sIEtFWV9NRU5VLAotCQkJCQlLRVlfU1VCVElUTEUsCi0JCQkJCUtFWV9NVVRFLCBLRVlfVk9MVU1FVVAsCi0JCQkJCUtFWV9WT0xVTUVET1dOLCBLRVlfUFJFVklPVVMsIDAsCi0JCQkJCUtFWV9VUCwgS0VZX0RPV04sIEtFWV9MRUZULAotCQkJCQlLRVlfUklHSFQsIEtFWV9WSURFTywgS0VZX0FVRElPLAotCQkJCQlLRVlfTUhQLCBLRVlfRVBHLCBLRVlfVFYsCi0JCQkJCTAsIEtFWV9ORVhUU09ORywgS0VZX0VYSVQsCi0JCQkJCUtFWV9DSEFOTkVMVVAsIAlLRVlfQ0hBTk5FTERPV04sCi0JCQkJCUtFWV9DSEFOTkVMLCAwLAotCQkJCQlLRVlfUFJFVklPVVNTT05HLCBLRVlfRU5URVIsCi0JCQkJCUtFWV9TTEVFUCwgMCwgMCwgS0VZX0JMVUUsCi0JCQkJCTAsIDAsIDAsIDAsIEtFWV9HUkVFTiwgMCwKLQkJCQkJS0VZX1BBVVNFLCAwLCBLRVlfUkVXSU5ELAotCQkJCQkwLCBLRVlfRkFTVEZPUldBUkQsIEtFWV9QTEFZLAotCQkJCQlLRVlfU1RPUCwgS0VZX1JFQ09SRCwKLQkJCQkJS0VZX1lFTExPVywgMCwgMCwgS0VZX1NFTEVDVCwKLQkJCQkJS0VZX1pPT00sIEtFWV9QT1dFUiwgMCwgMAotCQkJfQotCQl9LAotCQl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KLX07Ci0KLXN0YXRpYyB1MzIgaXJfcG9zOwotc3RhdGljIHUzMiBpcl93b3JkOwotc3RhdGljIHUzMiBpcl90b2dnbGU7Ci0KLSNkZWZpbmUgUkM1X1BVU0hfQklUKGRzdCwgYml0LCBwb3MpCVwKLQl7IGRzdCA8PD0gMTsgZHN0IHw9IGJpdDsgcG9zKys7IH0KLQotCi1zdGF0aWMgdm9pZCBzbXNfaXJfcmM1X2V2ZW50KHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlZGV2LAotCQkJCXUzMiB0b2dnbGUsIHUzMiBhZGRyLCB1MzIgY21kKQotewotCWJvb2wgdG9nZ2xlX2NoYW5nZWQ7Ci0JdTE2IGtleWNvZGU7Ci0KLQlzbXNfbG9nKCJJUiBSQzUgd29yZDogYWRkcmVzcyAlZCwgY29tbWFuZCAlZCwgdG9nZ2xlICVkIiwKLQkJCQlhZGRyLCBjbWQsIHRvZ2dsZSk7Ci0KLQl0b2dnbGVfY2hhbmdlZCA9IGlyX3RvZ2dsZSAhPSB0b2dnbGU7Ci0JLyoga2VlcCB0b2dnbGUgKi8KLQlpcl90b2dnbGUgPSB0b2dnbGU7Ci0KLQlpZiAoYWRkciAhPQotCQlrZXlib2FyZF9sYXlvdXRfbWFwc1tjb3JlZGV2LT5pci5pcl9rYl90eXBlXS5yYzVfa2JkX2FkZHJlc3MpCi0JCXJldHVybjsgLyogQ2hlY2sgZm9yIHZhbGlkIGFkZHJlc3MgKi8KLQotCWtleWNvZGUgPQotCQlrZXlib2FyZF9sYXlvdXRfbWFwcwotCQlbY29yZWRldi0+aXIuaXJfa2JfdHlwZV0ua2V5Ym9hcmRfbGF5b3V0X21hcFtjbWRdOwotCi0JaWYgKCF0b2dnbGVfY2hhbmdlZCAmJgotCQkJKGtleWNvZGUgIT0gS0VZX1ZPTFVNRVVQICYmIGtleWNvZGUgIT0gS0VZX1ZPTFVNRURPV04pKQotCQlyZXR1cm47IC8qIGFjY2VwdCBvbmx5IHJlcGVhdGVkIHZvbHVtZSwgcmVqZWN0IG90aGVyIGtleXMgKi8KLQotCXNtc19sb2coImtlcm5lbCBpbnB1dCBrZXljb2RlIChmcm9tIGlyKSAlZCIsIGtleWNvZGUpOwotCWlucHV0X3JlcG9ydF9rZXkoY29yZWRldi0+aXIuaW5wdXRfZGV2LCBrZXljb2RlLCAxKTsKLQlpbnB1dF9zeW5jKGNvcmVkZXYtPmlyLmlucHV0X2Rldik7Ci0KLX0KLQotLyogZGVjb2RlIHJhdyBiaXQgcGF0dGVybiB0byBSQzUgY29kZSAqLwotLyogdGFrZW4gZnJvbSBpci1mdW5jdGlvbnMuYyAqLwotc3RhdGljIHUzMiBpcl9yYzVfZGVjb2RlKHVuc2lnbmVkIGludCBjb2RlKQotewotLyoJdW5zaWduZWQgaW50IG9yZ19jb2RlID0gY29kZTsqLwotCXVuc2lnbmVkIGludCBwYWlyOwotCXVuc2lnbmVkIGludCByYzUgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE0OyArK2kpIHsKLQkJcGFpciA9IGNvZGUgJiAweDM7Ci0JCWNvZGUgPj49IDI7Ci0KLQkJcmM1IDw8PSAxOwotCQlzd2l0Y2ggKHBhaXIpIHsKLQkJY2FzZSAwOgotCQljYXNlIDI6Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcmM1IHw9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotLyoJZHByaW50aygxLCAiaXItY29tbW9uOiBpcl9yYzVfZGVjb2RlKCV4KSBiYWQgY29kZVxuIiwgb3JnX2NvZGUpOyovCi0JCQlzbXNfbG9nKCJiYWQgY29kZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0vKgotCWRwcmludGsoMSwgImlyLWNvbW1vbjogY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwKLQkJdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCi0JCSJpbnN0cj0leFxuIiwgcmM1LCBvcmdfY29kZSwgUkM1X1NUQVJUKHJjNSksCi0JCVJDNV9UT0dHTEUocmM1KSwgUkM1X0FERFIocmM1KSwgUkM1X0lOU1RSKHJjNSkpOwotKi8KLQlyZXR1cm4gcmM1OwotfQotCi1zdGF0aWMgdm9pZCBzbXNfcmM1X3BhcnNlX3dvcmQoc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYpCi17Ci0JI2RlZmluZSBSQzVfU1RBUlQoeCkgICAgKCgoeCk+PjEyKSYzKQotCSNkZWZpbmUgUkM1X1RPR0dMRSh4KSAgICgoKHgpPj4xMSkmMSkKLQkjZGVmaW5lIFJDNV9BRERSKHgpICAgICAoKCh4KT4+NikmMHgxRikKLQkjZGVmaW5lIFJDNV9JTlNUUih4KSAgICAoKHgpJjB4M0YpCi0KLQlpbnQgaSwgajsKLQl1MzIgcmM1X3dvcmQgPSAwOwotCi0JLyogUmV2ZXJzZSB0aGUgSVIgd29yZCBkaXJlY3Rpb24gKi8KLQlmb3IgKGkgPSAwIDsgaSA8IDI4IDsgaSsrKQotCQlSQzVfUFVTSF9CSVQocmM1X3dvcmQsIChpcl93b3JkPj5pKSYxLCBqKQotCi0JcmM1X3dvcmQgPSBpcl9yYzVfZGVjb2RlKHJjNV93b3JkKTsKLQkvKiBzbXNfbG9nKCJ0ZW1wID0gMHgleCwgcmM1X2NvZGUgPSAweCV4IiwgaXJfd29yZCwgcmM1X3dvcmQpOyAqLwotCi0Jc21zX2lyX3JjNV9ldmVudChjb3JlZGV2LAotCQkJCVJDNV9UT0dHTEUocmM1X3dvcmQpLAotCQkJCVJDNV9BRERSKHJjNV93b3JkKSwKLQkJCQlSQzVfSU5TVFIocmM1X3dvcmQpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBzbXNfcmM1X2FjY3VtdWxhdGVfYml0cyhzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZWRldiwKLQkJczMyIGlyX3NhbXBsZSkKLXsKLQkjZGVmaW5lIFJDNV9USU1FX0dSQU5VTEFSSVRZCTIwMAotCSNkZWZpbmUgUkM1X0RFRl9CSVRfVElNRQkJODg5Ci0JI2RlZmluZSBSQzVfTUFYX1NBTUVfQklUX0NPTlQJNAotCSNkZWZpbmUgUkM1X1dPUkRfTEVOCQkJMjcgLyogMjggYml0ICovCi0KLQl1MzIgaSwgajsKLQlzMzIgZGVsdGFfdGltZTsKLQl1MzIgdGltZSA9IChpcl9zYW1wbGUgPiAwKSA/IGlyX3NhbXBsZSA6ICgwLWlyX3NhbXBsZSk7Ci0JdTMyIGxldmVsID0gKGlyX3NhbXBsZSA8IDApID8gMCA6IDE7Ci0KLQlmb3IgKGkgPSBSQzVfTUFYX1NBTUVfQklUX0NPTlQ7IGkgPiAwOyBpLS0pIHsKLQkJZGVsdGFfdGltZSA9IHRpbWUgLSAoaSpSQzVfREVGX0JJVF9USU1FKSArIFJDNV9USU1FX0dSQU5VTEFSSVRZOwotCQlpZiAoZGVsdGFfdGltZSA8IDApCi0JCQljb250aW51ZTsgLyogbm90IHNvIG1hbnkgY29uc2VjdXRpdmUgYml0cyAqLwotCQlpZiAoZGVsdGFfdGltZSA+ICgyICogUkM1X1RJTUVfR1JBTlVMQVJJVFkpKSB7Ci0JCQkvKiB0aW1lb3V0ICovCi0JCQlpZiAoaXJfcG9zID09IChSQzVfV09SRF9MRU4tMSkpCi0JCQkJLyogY29tcGxldGUgbGFzdCBiaXQgKi8KLQkJCQlSQzVfUFVTSF9CSVQoaXJfd29yZCwgbGV2ZWwsIGlyX3BvcykKLQotCQkJaWYgKGlyX3BvcyA9PSBSQzVfV09SRF9MRU4pCi0JCQkJc21zX3JjNV9wYXJzZV93b3JkKGNvcmVkZXYpOwotCQkJZWxzZSBpZiAoaXJfcG9zKSAvKiB0aW1lb3V0IHdpdGhpbiBhIHdvcmQgKi8KLQkJCQlzbXNfbG9nKCJJUiBlcnJvciBwYXJzaW5nIGEgd29yZCIpOwotCi0JCQlpcl9wb3MgPSAwOwotCQkJaXJfd29yZCA9IDA7Ci0JCQkvKiBzbXNfbG9nKCJ0aW1lb3V0ICVkIiwgdGltZSk7ICovCi0JCQlicmVhazsKLQkJfQotCQkvKiBUaGUgdGltZSBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoaXMgbnVtYmVyIG9mIGJpdHMgKi8KLQkJZm9yIChqID0gMCA7IGogPCBpIDsgaisrKQotCQkJUkM1X1BVU0hfQklUKGlyX3dvcmQsIGxldmVsLCBpcl9wb3MpCi0KLQkJYnJlYWs7Ci0JfQotfQorI2RlZmluZSBNT0RVTEVfTkFNRSAic21zbWR0diIKIAogdm9pZCBzbXNfaXJfZXZlbnQoc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKLQkjZGVmaW5lIElSX0RBVEFfUkVDRUlWRV9NQVhfTEVOCTUyMCAvKiAxMjgqNCArIDQgKyA0ICovCi0JdTMyIGk7Ci0JZW51bSBpcl9wcm90b2NvbCBpcl9wcm90b2NvbCA9Ci0JCQlrZXlib2FyZF9sYXlvdXRfbWFwc1tjb3JlZGV2LT5pci5pcl9rYl90eXBlXQotCQkJCQkgICAgIC5pcl9wcm90b2NvbDsKLQlzMzIgKnNhbXBsZXM7Ci0JaW50IGNvdW50ID0gbGVuPj4yOworCWludCBpOworCWNvbnN0IHMzMiAqc2FtcGxlcyA9IChjb25zdCB2b2lkICopYnVmOwogCi0Jc2FtcGxlcyA9IChzMzIgKilidWY7Ci0vKglzbXNfbG9nKCJJUiBidWZmZXIgcmVjZWl2ZWQsIGxlbmd0aCA9ICVkIiwgY291bnQpOyovCisJZm9yIChpID0gMDsgaSA8IGxlbiA+PiAyOyBpKyspIHsKKwkJc3RydWN0IGlyX3Jhd19ldmVudCBldjsKIAotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlpZiAoaXJfcHJvdG9jb2wgPT0gSVJfUkM1KQotCQkJc21zX3JjNV9hY2N1bXVsYXRlX2JpdHMoY29yZWRldiwgc2FtcGxlc1tpXSk7Ci0JLyogIElSX1JDTU0gbm90IGltcGxlbWVudGVkICovCisJCWV2LmR1cmF0aW9uID0gYWJzKHNhbXBsZXNbaV0pICogMTAwMDsgLyogQ29udmVydCB0byBucyAqLworCQlldi5wdWxzZSA9IChzYW1wbGVzW2ldID4gMCkgPyBmYWxzZSA6IHRydWU7CisKKwkJaXJfcmF3X2V2ZW50X3N0b3JlKGNvcmVkZXYtPmlyLmlucHV0X2RldiwgJmV2KTsKKwl9CisJaXJfcmF3X2V2ZW50X2hhbmRsZShjb3JlZGV2LT5pci5pbnB1dF9kZXYpOwogfQogCiBpbnQgc21zX2lyX2luaXQoc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBib2FyZF9pZCA9IHNtc2NvcmVfZ2V0X2JvYXJkX2lkKGNvcmVkZXYpOwogCiAJc21zX2xvZygiQWxsb2NhdGluZyBpbnB1dCBkZXZpY2UiKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKQEAgLTI1NiwzMyArNjMsMzggQEAKIAl9CiAKIAljb3JlZGV2LT5pci5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7Ci0JY29yZWRldi0+aXIuaXJfa2JfdHlwZSA9Ci0JCXNtc19nZXRfYm9hcmQoc21zY29yZV9nZXRfYm9hcmRfaWQoY29yZWRldikpLT5pcl9rYl90eXBlOwotCWNvcmVkZXYtPmlyLmtleWJvYXJkX2xheW91dF9tYXAgPQotCQlrZXlib2FyZF9sYXlvdXRfbWFwc1tjb3JlZGV2LT5pci5pcl9rYl90eXBlXS4KLQkJCQlrZXlib2FyZF9sYXlvdXRfbWFwOwotCXNtc19sb2coIklSIHJlbW90ZSBrZXlib2FyZCB0eXBlIGlzICVkIiwgY29yZWRldi0+aXIuaXJfa2JfdHlwZSk7CiAKIAljb3JlZGV2LT5pci5jb250cm9sbGVyID0gMDsJLyogVG9kbzogdmVnYS9ub3ZhIFNQSSBudW1iZXIgKi8KIAljb3JlZGV2LT5pci50aW1lb3V0ID0gSVJfREVGQVVMVF9USU1FT1VUOwogCXNtc19sb2coIklSIHBvcnQgJWQsIHRpbWVvdXQgJWQgbXMiLAogCQkJY29yZWRldi0+aXIuY29udHJvbGxlciwgY29yZWRldi0+aXIudGltZW91dCk7CiAKLQlzbnByaW50Zihjb3JlZGV2LT5pci5uYW1lLAotCQkJCUlSX0RFVl9OQU1FX01BWF9MRU4sCi0JCQkJIlNNUyBJUiB3L2tiZCB0eXBlICVkIiwKLQkJCQljb3JlZGV2LT5pci5pcl9rYl90eXBlKTsKKwlzbnByaW50Zihjb3JlZGV2LT5pci5uYW1lLCBzaXplb2YoY29yZWRldi0+aXIubmFtZSksCisJCSAiU01TIElSICglcykiLCBzbXNfZ2V0X2JvYXJkKGJvYXJkX2lkKS0+bmFtZSk7CisKKwlzdHJsY3B5KGNvcmVkZXYtPmlyLnBoeXMsIGNvcmVkZXYtPmRldnBhdGgsIHNpemVvZihjb3JlZGV2LT5pci5waHlzKSk7CisJc3RybGNhdChjb3JlZGV2LT5pci5waHlzLCAiL2lyMCIsIHNpemVvZihjb3JlZGV2LT5pci5waHlzKSk7CisKIAlpbnB1dF9kZXYtPm5hbWUgPSBjb3JlZGV2LT5pci5uYW1lOwotCWlucHV0X2Rldi0+cGh5cyA9IGNvcmVkZXYtPmlyLm5hbWU7CisJaW5wdXRfZGV2LT5waHlzID0gY29yZWRldi0+aXIucGh5czsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSBjb3JlZGV2LT5kZXZpY2U7CiAKLQkvKiBLZXkgcHJlc3MgZXZlbnRzIG9ubHkgKi8KLQlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKTsKLQlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fMCldID0gQklUX01BU0soQlROXzApOworI2lmIDAKKwkvKiBUT0RPOiBwcm9wZXJseSBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXJzIGJlbGxvdyAqLworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19VU0I7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisjZW5kaWYKKworCWNvcmVkZXYtPmlyLnByb3BzLnByaXYgPSBjb3JlZGV2OworCWNvcmVkZXYtPmlyLnByb3BzLmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX0lSX1JBVzsKKwljb3JlZGV2LT5pci5wcm9wcy5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfQUxMOwogCiAJc21zX2xvZygiSW5wdXQgZGV2aWNlIChJUikgJXMgaXMgc2V0IGZvciBrZXkgZXZlbnRzIiwgaW5wdXRfZGV2LT5uYW1lKTsKIAotCWlmIChpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KSkgeworCWlmIChpcl9pbnB1dF9yZWdpc3RlcihpbnB1dF9kZXYsIHNtc19nZXRfYm9hcmQoYm9hcmRfaWQpLT5yY19jb2RlcywKKwkJCSAgICAgICZjb3JlZGV2LT5pci5wcm9wcywgTU9EVUxFX05BTUUpKSB7CiAJCXNtc19lcnIoIkZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UiKTsKIAkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAkJcmV0dXJuIC1FQUNDRVM7CkBAIC0yOTQsOCArMTA2LDcgQEAKIHZvaWQgc21zX2lyX2V4aXQoc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYpCiB7CiAJaWYgKGNvcmVkZXYtPmlyLmlucHV0X2RldikKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoY29yZWRldi0+aXIuaW5wdXRfZGV2KTsKKwkJaXJfaW5wdXRfdW5yZWdpc3Rlcihjb3JlZGV2LT5pci5pbnB1dF9kZXYpOwogCiAJc21zX2xvZygiIik7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2lyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNpci5oCmluZGV4IGI3ZDcwM2UuLjkyNmUyNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zaXIuaApAQCAtNCw2ICs0LDExIEBACiBNRFRWIHJlY2VpdmVyIGtlcm5lbCBtb2R1bGVzLgogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDksIFVyaSBTaGtvbG5pawogCisgQ29weXJpZ2h0IChjKSAyMDEwIC0gTWF1cm8gQ2FydmFsaG8gQ2hlaGFiCisJLSBQb3J0ZWQgdGhlIGRyaXZlciB0byB1c2UgcmMtY29yZQorCS0gSVIgcmF3IGV2ZW50IGRlY29kaW5nIGlzIG5vdyBkb25lIGF0IHJjLWNvcmUKKwktIENvZGUgYWxtb3N0IHJlLXdyaXR0ZW4KKwogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjMsNjMgKzI4LDIxIEBACiAjZGVmaW5lIF9fU01TX0lSX0hfXwogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb3JlLmg+CiAKLSNkZWZpbmUgSVJfREVWX05BTUVfTUFYX0xFTgkJMjMgLyogIlNNUyBJUiBrYmQgdHlwZSBublwwIiAqLwotI2RlZmluZSBJUl9LRVlCT0FSRF9MQVlPVVRfU0laRQk2NAogI2RlZmluZSBJUl9ERUZBVUxUX1RJTUVPVVQJCTEwMAogCi1lbnVtIGlyX2tiX3R5cGUgewotCVNNU19JUl9LQl9ERUZBVUxUX1RWLAotCVNNU19JUl9LQl9IQ1dfU0lMVkVSCi19OwotCi1lbnVtIHJjNV9rZXlib2FyZF9hZGRyZXNzIHsKLQlLRVlCT0FSRF9BRERSRVNTX1RWMSA9IDAsCi0JS0VZQk9BUkRfQUREUkVTU19UVjIgPSAxLAotCUtFWUJPQVJEX0FERFJFU1NfVEVMRVRFWFQgPSAyLAotCUtFWUJPQVJEX0FERFJFU1NfVklERU8gPSAzLAotCUtFWUJPQVJEX0FERFJFU1NfTFYxID0gNCwKLQlLRVlCT0FSRF9BRERSRVNTX1ZDUjEgPSA1LAotCUtFWUJPQVJEX0FERFJFU1NfVkNSMiA9IDYsCi0JS0VZQk9BUkRfQUREUkVTU19FWFBFUklNRU5UQUwgPSA3LAotCUtFWUJPQVJEX0FERFJFU1NfU0FUMSA9IDgsCi0JS0VZQk9BUkRfQUREUkVTU19DQU1FUkEgPSA5LAotCUtFWUJPQVJEX0FERFJFU1NfU0FUMiA9IDEwLAotCUtFWUJPQVJEX0FERFJFU1NfQ0RWID0gMTIsCi0JS0VZQk9BUkRfQUREUkVTU19DQU1DT1JERVIgPSAxMywKLQlLRVlCT0FSRF9BRERSRVNTX1BSRV9BTVAgPSAxNiwKLQlLRVlCT0FSRF9BRERSRVNTX1RVTkVSID0gMTcsCi0JS0VZQk9BUkRfQUREUkVTU19SRUNPUkRFUjEgPSAxOCwKLQlLRVlCT0FSRF9BRERSRVNTX1BSRV9BTVAxID0gMTksCi0JS0VZQk9BUkRfQUREUkVTU19DRF9QTEFZRVIgPSAyMCwKLQlLRVlCT0FSRF9BRERSRVNTX1BIT05PID0gMjEsCi0JS0VZQk9BUkRfQUREUkVTU19TQVRBID0gMjIsCi0JS0VZQk9BUkRfQUREUkVTU19SRUNPUkRFUjIgPSAyMywKLQlLRVlCT0FSRF9BRERSRVNTX0NEUiA9IDI2LAotCUtFWUJPQVJEX0FERFJFU1NfTElHSFRJTkcgPSAyOSwKLQlLRVlCT0FSRF9BRERSRVNTX0xJR0hUSU5HMSA9IDMwLCAvKiBLRVlCT0FSRF9BRERSRVNTX0hDV19TSUxWRVIgKi8KLQlLRVlCT0FSRF9BRERSRVNTX1BIT05FID0gMzEsCi0JS0VZQk9BUkRfQUREUkVTU19OT1RfUkM1ID0gMHhGRkZGCi19OwotCi1lbnVtIGlyX3Byb3RvY29sIHsKLQlJUl9SQzUsCi0JSVJfUkNNTQotfTsKLQotc3RydWN0IGtleWJvYXJkX2xheW91dF9tYXBfdCB7Ci0JZW51bSBpcl9wcm90b2NvbCBpcl9wcm90b2NvbDsKLQllbnVtIHJjNV9rZXlib2FyZF9hZGRyZXNzIHJjNV9rYmRfYWRkcmVzczsKLQl1MTYga2V5Ym9hcmRfbGF5b3V0X21hcFtJUl9LRVlCT0FSRF9MQVlPVVRfU0laRV07Ci19OwotCiBzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdDsKIAogc3RydWN0IGlyX3QgewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQllbnVtIGlyX2tiX3R5cGUgaXJfa2JfdHlwZTsKLQljaGFyIG5hbWVbSVJfREVWX05BTUVfTUFYX0xFTisxXTsKLQl1MTYgKmtleWJvYXJkX2xheW91dF9tYXA7CisJY2hhciBuYW1lWzQwXTsKKwljaGFyIHBoeXNbMzJdOworCisJY2hhciAqcmNfY29kZXM7CisJdTY0IHByb3RvY29sOworCXN0cnVjdCBpcl9kZXZfcHJvcHMgcHJvcHM7CisKIAl1MzIgdGltZW91dDsKIAl1MzIgY29udHJvbGxlcjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXN1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3VzYi5jCmluZGV4IGE5YzI3ZmIuLjUwZDQzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3VzYi5jCkBAIC0zNTIsOCArMzUyLDcgQEAKIAlwYXJhbXMubnVtX2J1ZmZlcnMgPSBNQVhfQlVGRkVSUzsKIAlwYXJhbXMuc2VuZHJlcXVlc3RfaGFuZGxlciA9IHNtc3VzYl9zZW5kcmVxdWVzdDsKIAlwYXJhbXMuY29udGV4dCA9IGRldjsKLQlzbnByaW50ZihwYXJhbXMuZGV2cGF0aCwgc2l6ZW9mKHBhcmFtcy5kZXZwYXRoKSwKLQkJICJ1c2JcXCVkLSVzIiwgZGV2LT51ZGV2LT5idXMtPmJ1c251bSwgZGV2LT51ZGV2LT5kZXZwYXRoKTsKKwl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgcGFyYW1zLmRldnBhdGgsIHNpemVvZihwYXJhbXMuZGV2cGF0aCkpOwogCiAJLyogcmVnaXN0ZXIgaW4gc21zY29yZSAqLwogCXJjID0gc21zY29yZV9yZWdpc3Rlcl9kZXZpY2UoJnBhcmFtcywgJmRldi0+Y29yZWRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtY29tbW9uLmMKaW5kZXggNDcwNzVmYy4uOTkyN2E1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC1jb21tb24uYwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAJCXN0cnVjdCB2NGwyX3R1bmVyICp0dW5lcikKIHsKIAlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCByZXR2YWwgPSAtRUlOVkFMOworCWludCByZXR2YWwgPSAwOwogCiAJLyogc2FmZXR5IGNoZWNrcyAqLwogCXJldHZhbCA9IHNpNDcweF9kaXNjb25uZWN0X2NoZWNrKHJhZGlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKaW5kZXggYWI2M2RkNS4uZmM3ZjRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKQEAgLTEwMDksOCArMTAwOSwxMCBAQAogCQkJZ290byBleGl0OwogCQl9CiAJCXJ2YWwgPSBjb3B5X2Zyb21fdXNlcihwc19uYW1lLCBjb250cm9sLT5zdHJpbmcsIGxlbik7Ci0JCWlmIChydmFsIDwgMCkKKwkJaWYgKHJ2YWwpIHsKKwkJCXJ2YWwgPSAtRUZBVUxUOwogCQkJZ290byBleGl0OworCQl9CiAJCXBzX25hbWVbbGVuXSA9ICdcMCc7CiAKIAkJaWYgKHN0cmxlbihwc19uYW1lKSAlIHZxYy5zdGVwKSB7CkBAIC0xMDMxLDggKzEwMzMsMTAgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfQogCQlydmFsID0gY29weV9mcm9tX3VzZXIocmFkaW9fdGV4dCwgY29udHJvbC0+c3RyaW5nLCBsZW4pOwotCQlpZiAocnZhbCA8IDApCisJCWlmIChydmFsKSB7CisJCQlydmFsID0gLUVGQVVMVDsKIAkJCWdvdG8gZXhpdDsKKwkJfQogCQlyYWRpb190ZXh0W2xlbl0gPSAnXDAnOwogCiAJCWlmIChzdHJsZW4ocmFkaW9fdGV4dCkgJSB2cWMuc3RlcCkgewpAQCAtMTM2Nyw2ICsxMzcxLDggQEAKIAkJfQogCQlydmFsID0gY29weV90b191c2VyKGNvbnRyb2wtPnN0cmluZywgc2Rldi0+cmRzX2luZm8ucHNfbmFtZSwKIAkJCQkJc3RybGVuKHNkZXYtPnJkc19pbmZvLnBzX25hbWUpICsgMSk7CisJCWlmIChydmFsKQorCQkJcnZhbCA9IC1FRkFVTFQ7CiAJCWJyZWFrOwogCiAJY2FzZSBWNEwyX0NJRF9SRFNfVFhfUkFESU9fVEVYVDoKQEAgLTEzNzcsNiArMTM4Myw4IEBACiAJCX0KIAkJcnZhbCA9IGNvcHlfdG9fdXNlcihjb250cm9sLT5zdHJpbmcsIHNkZXYtPnJkc19pbmZvLnJhZGlvX3RleHQsCiAJCQkJCXN0cmxlbihzZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0KSArIDEpOworCQlpZiAocnZhbCkKKwkJCXJ2YWwgPSAtRUZBVUxUOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKaW5kZXggYmRiYzlkMy4uMmUxNTkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpAQCAtNTE3LDE5ICs1MTcsNiBAQAogCiBlbmRtZW51ICMgZW5jb2RlciAvIGRlY29kZXIgY2hpcHMKIAotY29uZmlnIERJU1BMQVlfREFWSU5DSV9ETTY0NlhfRVZNCi0JdHJpc3RhdGUgIkRNNjQ2eCBFVk0gVmlkZW8gRGlzcGxheSIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBNQUNIX0RBVklOQ0lfRE02NDY3X0VWTQotCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCi0Jc2VsZWN0IFZJREVPX0RBVklOQ0lfVlBJRgotCXNlbGVjdCBWSURFT19BRFY3MzQzCi0Jc2VsZWN0IFZJREVPX1RIUzczMDMKLQloZWxwCi0JICBTdXBwb3J0IGZvciBETTY0NjcgYmFzZWQgZGlzcGxheSBkZXZpY2UuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwaWZfZGlzcGxheS4KLQogY29uZmlnIFZJREVPX1NIX1ZPVQogCXRyaXN0YXRlICJTdXBlckggVk9VIHZpZGVvIG91dHB1dCBkcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgQVJDSF9TSE1PQklMRQpAQCAtNTM3LDI5ICs1MjQsMjIgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgVmlkZW8gT3V0cHV0IFVuaXQgKFZPVSkgb24gU3VwZXJIIFNvQ3MuCiAKLWNvbmZpZyBDQVBUVVJFX0RBVklOQ0lfRE02NDZYX0VWTQotCXRyaXN0YXRlICJETTY0NnggRVZNIFZpZGVvIENhcHR1cmUiCi0JZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgTUFDSF9EQVZJTkNJX0RNNjQ2N19FVk0KK2NvbmZpZyBWSURFT19WSVUKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIFZJVSBWaWRlbyBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFBQQ19NUEM1MTJ4CiAJc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKLQlzZWxlY3QgVklERU9fREFWSU5DSV9WUElGCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgRE02NDY3IGJhc2VkIGNhcHR1cmUgZGV2aWNlLgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIEZyZWVzY2FsZSBWSVUgdmlkZW8gZHJpdmVyLiBUaGlzIGRldmljZSBjYXB0dXJlcworCSAgdmlkZW8gZGF0YSwgb3Igb3ZlcmxheXMgdmlkZW8gb24gRElVIGZyYW1lIGJ1ZmZlci4KIAotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBpZl9jYXB0dXJlLgotCi1jb25maWcgVklERU9fREFWSU5DSV9WUElGCi0JdHJpc3RhdGUgIkRhVmluY2kgVlBJRiBEcml2ZXIiCi0JZGVwZW5kcyBvbiBESVNQTEFZX0RBVklOQ0lfRE02NDZYX0VWTQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIERhVmluY2kgVlBJRiBEcml2ZXIuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwaWYuCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBWSVUgZGV2aWNlIG9uIE1QQzUxMjFlIFJldjIrLgorCSAgSW4gZG91YnQsIHNheSBOLgogCiBjb25maWcgVklERU9fVklWSQogCXRyaXN0YXRlICJWaXJ0dWFsIFZpZGVvIERyaXZlciIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyICYmICFTUEFSQzMyICYmICFTUEFSQzY0ICYmIEZPTlRTCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgVklERU9fVjRMMiAmJiAhU1BBUkMzMiAmJiAhU1BBUkM2NAorCWRlcGVuZHMgb24gKEZSQU1FQlVGRkVSX0NPTlNPTEUgfHwgU1RJX0NPTlNPTEUpICYmIEZPTlRTCiAJc2VsZWN0IEZPTlRfOHgxNgogCXNlbGVjdCBWSURFT0JVRl9WTUFMTE9DCiAJZGVmYXVsdCBuCkBAIC01NzAsNjYgKzU1MCw3IEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHRlc3QgdmlkZW8gYXBwcyBvciBkZWJ1ZyBWNEwgZGV2aWNlcy4KIAkgIEluIGRvdWJ0LCBzYXkgTi4KIAotY29uZmlnIFZJREVPX1ZQU1NfU1lTVEVNCi0JdHJpc3RhdGUgIlZQU1MgU3lzdGVtIG1vZHVsZSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0kKLQloZWxwCi0JICBTdXBwb3J0IGZvciB2cHNzIHN5c3RlbSBtb2R1bGUgZm9yIHZpZGVvIGRyaXZlcgotCi1jb25maWcgVklERU9fVlBGRV9DQVBUVVJFCi0JdHJpc3RhdGUgIlZQRkUgVmlkZW8gQ2FwdHVyZSBEcml2ZXIiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIEFSQ0hfREFWSU5DSQotCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgRE1YWFhYIFZQRkUgYmFzZWQgZnJhbWUgZ3JhYmJlci4gVGhpcyBpcyB0aGUKLQkgIGNvbW1vbiBWNEwyIG1vZHVsZSBmb3IgZm9sbG93aW5nIERNWFhYIFNvQ3MgZnJvbSBUZXhhcwotCSAgSW5zdHJ1bWVudHM6LSBETTY0NDYgJiBETTM1NS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBmZS1jYXB0dXJlLgotCi1jb25maWcgVklERU9fRE02NDQ2X0NDREMKLQl0cmlzdGF0ZSAiRE02NDQ2IENDREMgSFcgbW9kdWxlIgotCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RNNjQ0eCAmJiBWSURFT19WUEZFX0NBUFRVUkUKLQlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KLQlkZWZhdWx0IHkKLQloZWxwCi0JICAgRW5hYmxlcyBEYVZpbmNpIENDRCBodyBtb2R1bGUuIERhVmluY2kgQ0NEQyBodyBpbnRlcmZhY2VzCi0JICAgd2l0aCBkZWNvZGVyIG1vZHVsZXMgc3VjaCBhcyBUVlA1MTQ2IG92ZXIgQlQ2NTYgb3IKLQkgICBzZW5zb3IgbW9kdWxlIHN1Y2ggYXMgTVQ5VDAwMSBvdmVyIGEgcmF3IGludGVyZmFjZS4gVGhpcwotCSAgIG1vZHVsZSBjb25maWd1cmVzIHRoZSBpbnRlcmZhY2UgYW5kIENDREMvSVNJRiB0byBkbwotCSAgIHZpZGVvIGZyYW1lIGNhcHR1cmUgZnJvbSBzbGF2ZSBkZWNvZGVycy4KLQotCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGZlLgotCi1jb25maWcgVklERU9fRE0zNTVfQ0NEQwotCXRyaXN0YXRlICJETTM1NSBDQ0RDIEhXIG1vZHVsZSIKLQlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTM1NSAmJiBWSURFT19WUEZFX0NBUFRVUkUKLQlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KLQlkZWZhdWx0IHkKLQloZWxwCi0JICAgRW5hYmxlcyBETTM1NSBDQ0QgaHcgbW9kdWxlLiBETTM1NSBDQ0RDIGh3IGludGVyZmFjZXMKLQkgICB3aXRoIGRlY29kZXIgbW9kdWxlcyBzdWNoIGFzIFRWUDUxNDYgb3ZlciBCVDY1NiBvcgotCSAgIHNlbnNvciBtb2R1bGUgc3VjaCBhcyBNVDlUMDAxIG92ZXIgYSByYXcgaW50ZXJmYWNlLiBUaGlzCi0JICAgbW9kdWxlIGNvbmZpZ3VyZXMgdGhlIGludGVyZmFjZSBhbmQgQ0NEQy9JU0lGIHRvIGRvCi0JICAgdmlkZW8gZnJhbWUgY2FwdHVyZSBmcm9tIGEgc2xhdmUgZGVjb2RlcnMKLQotCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGZlLgotCi1jb25maWcgVklERU9fSVNJRgotCXRyaXN0YXRlICJJU0lGIEhXIG1vZHVsZSIKLQlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTM2NSAmJiBWSURFT19WUEZFX0NBUFRVUkUKLQlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KLQlkZWZhdWx0IHkKLQloZWxwCi0JICAgRW5hYmxlcyBJU0lGIGh3IG1vZHVsZS4gVGhpcyBpcyB0aGUgaGFyZHdhcmUgbW9kdWxlIGZvcgotCSAgIGNvbmZpZ3VyaW5nIElTSUYgaW4gVlBGRSB0byBjYXB0dXJlIFJhdyBCYXllciBSR0IgZGF0YSAgZnJvbQotCSAgIGEgaW1hZ2Ugc2Vuc29yIG9yIFlVViBkYXRhIGZyb20gYSBZVVYgc291cmNlLgotCi0JICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwZmUuCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9LY29uZmlnIgogCkBAIC05NTUsNiArODc2LDEyIEBACiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIHY0bDIgZHJpdmVyIGZvciB0aGUgUFhBMjd4IFF1aWNrIENhcHR1cmUgSW50ZXJmYWNlCiAKK2NvbmZpZyBWSURFT19TSF9NT0JJTEVfQ1NJMgorCXRyaXN0YXRlICJTdXBlckggTW9iaWxlIE1JUEkgQ1NJLTIgSW50ZXJmYWNlIGRyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBTT0NfQ0FNRVJBICYmIEhBVkVfQ0xLCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHY0bDIgZHJpdmVyIGZvciB0aGUgU3VwZXJIIE1JUEkgQ1NJLTIgSW50ZXJmYWNlCisKIGNvbmZpZyBWSURFT19TSF9NT0JJTEVfQ0VVCiAJdHJpc3RhdGUgIlN1cGVySCBNb2JpbGUgQ0VVIEludGVyZmFjZSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgU09DX0NBTUVSQSAmJiBIQVNfRE1BICYmIEhBVkVfQ0xLCkBAIC05NjksNiArODk2LDE5IEBACiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIHY0bDIgZHJpdmVyIGZvciB0aGUgVEkgT01BUDIgY2FtZXJhIGNhcHR1cmUgaW50ZXJmYWNlCiAKK2NvbmZpZyBWSURFT19NWDJfSE9TVFNVUFBPUlQKKyAgICAgICAgYm9vbAorCitjb25maWcgVklERU9fTVgyCisJdHJpc3RhdGUgImkuTVgyNy9pLk1YMjUgQ2FtZXJhIFNlbnNvciBJbnRlcmZhY2UgZHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFNPQ19DQU1FUkEgJiYgKE1BQ0hfTVgyNyB8fCBBUkNIX01YMjUpCisJc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKKwlzZWxlY3QgVklERU9fTVgyX0hPU1RTVVBQT1JUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHY0bDIgZHJpdmVyIGZvciB0aGUgaS5NWDI3IGFuZCB0aGUgaS5NWDI1IENhbWVyYSBTZW5zb3IKKwkgIEludGVyZmFjZQorCisKICMKICMgVVNCIE11bHRpbWVkaWEgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKQEAgLTEwMDAsNjEgKzk0MCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9LY29uZmlnIgogCi1jb25maWcgVklERU9fT1ZDQU1DSElQCi0JdHJpc3RhdGUgIk9tbmlWaXNpb24gQ2FtZXJhIENoaXAgc3VwcG9ydCAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgZ3NwY2Egb3Y1MTkgbW9kdWxlCi0JICBpbnN0ZWFkLiBOb3RlIHRoYXQgZm9yIHRoZSBvdjUxMSAvIG92NTE4IHN1cHBvcnQgb2YgdGhlIGdzcGNhIG1vZHVsZQotCSAgeW91IG5lZWQgYXRsZWFzdCB2ZXJzaW9uIDAuNi4wIG9mIGxpYnY0bCBhbmQgZm9yIHRoZSB3OTk2OGNmCi0JICBhdGxlYXN0IHZlcnNpb24gMC42LjMgb2YgbGlidjRsLgotCi0JICBTdXBwb3J0IGZvciB0aGUgT21uaVZpc2lvbiBPVjZ4eHggYW5kIE9WN3h4eCBzZXJpZXMgb2YgY2FtZXJhIGNoaXBzLgotCSAgVGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBvdjUxMSBhbmQgdzk5NjhjZiBVU0IKLQkgIGNhbWVyYSBkcml2ZXJzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvdmNhbWNoaXAuCi0KLWNvbmZpZyBVU0JfVzk5NjhDRgotCXRyaXN0YXRlICJVU0IgVzk5Nls4N11DRiBKUEVHIER1YWwgTW9kZSBDYW1lcmEgc3VwcG9ydCAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIEkyQyAmJiBWSURFT19PVkNBTUNISVAKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBpcyBERVBSRUNBVEVEIHBsZWFzZSB1c2UgdGhlIGdzcGNhIG92NTE5IG1vZHVsZQotCSAgaW5zdGVhZC4gTm90ZSB0aGF0IGZvciB0aGUgdzk5NjhjZiBzdXBwb3J0IG9mIHRoZSBnc3BjYSBtb2R1bGUKLQkgIHlvdSBuZWVkIGF0bGVhc3QgdmVyc2lvbiAwLjYuMyBvZiBsaWJ2NGwuCi0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiBPVjY4MSBvcgotCSAgV2luYm9uZCBXOTk2N0NGL1c5OTY4Q0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgaGFzIGFuIG9wdGlvbmFsIHBsdWdpbiwgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgYXMgYQotCSAgc2VwYXJhdGUgbW9kdWxlIG9ubHkgKHJlbGVhc2VkIHVuZGVyIEdQTCkuIEl0IGFsbG93cyB0byB1c2UgaGlnaGVyCi0JICByZXNvbHV0aW9ucyBhbmQgZnJhbWVyYXRlcywgYnV0IGNhbm5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2ZmaWNpYWwKLQkgIExpbnV4IGtlcm5lbCBmb3IgcGVyZm9ybWFuY2UgcHVycG9zZXMuCi0KLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY4Y2YudHh0PiBmb3IgbW9yZSBpbmZvLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3OTk2OGNmLgotCi1jb25maWcgVVNCX09WNTExCi0JdHJpc3RhdGUgIlVTQiBPVjUxMSBDYW1lcmEgc3VwcG9ydCAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwxCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBnc3BjYSBvdjUxOSBtb2R1bGUKLQkgIGluc3RlYWQuIE5vdGUgdGhhdCBmb3IgdGhlIG92NTExIC8gb3Y1MTggc3VwcG9ydCBvZiB0aGUgZ3NwY2EgbW9kdWxlCi0JICB5b3UgbmVlZCBhdGxlYXN0IHZlcnNpb24gMC42LjAgb2YgbGlidjRsLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIGNhbWVyYSB0byB5b3VyCi0JICBjb21wdXRlcidzIFVTQiBwb3J0LiBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9vdjUxMS50eHQ+Ci0JICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgY2FtZXJhcy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3Y1MTEuCi0KIGNvbmZpZyBVU0JfU0U0MDEKIAl0cmlzdGF0ZSAiVVNCIFNFNDAxIENhbWVyYSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVklERU9fVjRMMQpAQCAtMTA2OCwyNSArOTUzLDYgQEAKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZyIKIAotY29uZmlnIFVTQl9TVFY2ODAKLQl0cmlzdGF0ZSAiVVNCIFNUVjY4MCAoUGVuY2FtKSBDYW1lcmEgc3VwcG9ydCAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwxCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBnc3BjYSBzdHYwNjgwIG1vZHVsZQotCSAgaW5zdGVhZC4gTm90ZSB0aGF0IGZvciB0aGUgZ3NwY2Egc3R2MDY4MCBtb2R1bGUgeW91IG5lZWQKLQkgIGF0bGVhc3QgdmVyc2lvbiAwLjYuMyBvZiBsaWJ2NGwuCi0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0aGlzIHR5cGUgb2YgY2FtZXJhIHRvIHlvdXIKLQkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIFRoaXMgaW5jbHVkZXMgdGhlIFBlbmNhbSBsaW5lIG9mIGNhbWVyYXMuCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zdHY2ODAudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbgotCSAgYW5kIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhbWVyYXMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN0djY4MC4KLQotc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWciCiAKIGNvbmZpZyBVU0JfWlIzNjRYWApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggY2M5Mzg1OS4uMTA1MWVjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtMTA1LDcgKzEwNSw2IEBACiBvYmotJChDT05GSUdfVklERU9fQ1gyMzFYWCkgKz0gY3gyMzF4eC8KIG9iai0kKENPTkZJR19WSURFT19VU0JWSVNJT04pICs9IHVzYnZpc2lvbi8KIG9iai0kKENPTkZJR19WSURFT19QVlJVU0IyKSArPSBwdnJ1c2IyLwotb2JqLSQoQ09ORklHX1ZJREVPX09WQ0FNQ0hJUCkgKz0gb3ZjYW1jaGlwLwogb2JqLSQoQ09ORklHX1ZJREVPX0NQSUEyKSArPSBjcGlhMi8KIG9iai0kKENPTkZJR19WSURFT19NWEIpICs9IG14Yi5vCiBvYmotJChDT05GSUdfVklERU9fSEVYSVVNX09SSU9OKSArPSBoZXhpdW1fb3Jpb24ubwpAQCAtMTI3LDE3ICsxMjYsMTMgQEAKIG9iai0kKENPTkZJR19WSURFT19DQUZFX0NDSUMpICs9IGNhZmVfY2NpYy5vCiAKIG9iai0kKENPTkZJR19VU0JfREFCVVNCKSAgICAgICAgKz0gZGFidXNiLm8KLW9iai0kKENPTkZJR19VU0JfT1Y1MTEpICAgICAgICAgKz0gb3Y1MTEubwogb2JqLSQoQ09ORklHX1VTQl9TRTQwMSkgICAgICAgICArPSBzZTQwMS5vCi1vYmotJChDT05GSUdfVVNCX1NUVjY4MCkgICAgICAgICs9IHN0djY4MC5vCi1vYmotJChDT05GSUdfVVNCX1c5OTY4Q0YpICAgICAgICs9IHc5OTY4Y2Yubwogb2JqLSQoQ09ORklHX1VTQl9aUjM2NFhYKSAgICAgICArPSB6cjM2NHh4Lm8KIG9iai0kKENPTkZJR19VU0JfU1RLV0VCQ0FNKSAgICAgKz0gc3Rrd2ViY2FtLm8KIAogb2JqLSQoQ09ORklHX1VTQl9TTjlDMTAyKSAgICAgICArPSBzbjljMTAyLwogb2JqLSQoQ09ORklHX1VTQl9FVDYxWDI1MSkgICAgICArPSBldDYxeDI1MS8KIG9iai0kKENPTkZJR19VU0JfUFdDKSAgICAgICAgICAgKz0gcHdjLwotb2JqLSQoQ09ORklHX1VTQl9aQzAzMDEpICAgICAgICArPSB6YzAzMDEvCiBvYmotJChDT05GSUdfVVNCX0dTUENBKSAgICAgICAgICs9IGdzcGNhLwogCiBvYmotJChDT05GSUdfVklERU9fSERQVlIpCSs9IGhkcHZyLwpAQCAtMTUxLDYgKzE0Niw3IEBACiBvYmotJChDT05GSUdfVklERU9fSVZUVikgKz0gaXZ0di8KIG9iai0kKENPTkZJR19WSURFT19DWDE4KSArPSBjeDE4LwogCitvYmotJChDT05GSUdfVklERU9fVklVKSArPSBmc2wtdml1Lm8KIG9iai0kKENPTkZJR19WSURFT19WSVZJKSArPSB2aXZpLm8KIG9iai0kKENPTkZJR19WSURFT19NRU0yTUVNX1RFU1RERVYpICs9IG1lbTJtZW1fdGVzdGRldi5vCiBvYmotJChDT05GSUdfVklERU9fQ1gyMzg4NSkgKz0gY3gyMzg4NS8KQEAgLTE2Miw4ICsxNTgsMTAgQEAKIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX1BMQVRGT1JNKQkrPSBzb2NfY2FtZXJhX3BsYXRmb3JtLm8KICMgc29jLWNhbWVyYSBob3N0IGRyaXZlcnMgaGF2ZSB0byBiZSBsaW5rZWQgYWZ0ZXIgY2FtZXJhIGRyaXZlcnMKIG9iai0kKENPTkZJR19WSURFT19NWDEpCQkJKz0gbXgxX2NhbWVyYS5vCitvYmotJChDT05GSUdfVklERU9fTVgyKQkJCSs9IG14Ml9jYW1lcmEubwogb2JqLSQoQ09ORklHX1ZJREVPX01YMykJCQkrPSBteDNfY2FtZXJhLm8KIG9iai0kKENPTkZJR19WSURFT19QWEEyN3gpCQkrPSBweGFfY2FtZXJhLm8KK29iai0kKENPTkZJR19WSURFT19TSF9NT0JJTEVfQ1NJMikJKz0gc2hfbW9iaWxlX2NzaTIubwogb2JqLSQoQ09ORklHX1ZJREVPX1NIX01PQklMRV9DRVUpCSs9IHNoX21vYmlsZV9jZXVfY2FtZXJhLm8KIAogb2JqLSQoQ09ORklHX0FSQ0hfREFWSU5DSSkJCSs9IGRhdmluY2kvCkBAIC0xNzcsNyArMTc1LDcgQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX0lSX0kyQykgICs9IGlyLWtiZC1pMmMubwogCi1vYmotJChDT05GSUdfQVJDSF9EQVZJTkNJKQkrPSBkYXZpbmNpLworb2JqLXkJKz0gZGF2aW5jaS8KIAogb2JqLSQoQ09ORklHX0FSQ0hfT01BUCkJKz0gb21hcC8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hazg4MXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWs4ODF4LmMKaW5kZXggMTU3MzM5Mi4uYjM4ODY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hazg4MXguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FrODgxeC5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIAl2NGxfYm91bmRfYWxpZ25faW1hZ2UoJm1mLT53aWR0aCwgMCwgNzIwLCAyLAogCQkJICAgICAgJm1mLT5oZWlnaHQsIDAsIGFrODgxeC0+bGluZXMsIDEsIDApOwogCW1mLT5maWVsZAk9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKLQltZi0+Y29kZQk9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0xFOworCW1mLT5jb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CiAJbWYtPmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOwogCiAJcmV0dXJuIDA7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJCSAgICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7CiAJaWYgKG1mLT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHwKLQkgICAgbWYtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEUpCisJICAgIG1mLT5jb2RlICE9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBhazg4MXhfdHJ5X2dfbWJ1c19mbXQoc2QsIG1mKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogCWlmIChpbmRleCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqY29kZSA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0xFOworCSpjb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvTWFrZWZpbGUKaW5kZXggNGQyNjIzMS4uNWM3ZjJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi1hdTA4Mjgtb2Jqcwk6PSBhdTA4MjgtY29yZS5vIGF1MDgyOC1pMmMubyBhdTA4MjgtY2FyZHMubyBhdTA4MjgtZHZiLm8gYXUwODI4LXZpZGVvLm8KK2F1MDgyOC1vYmpzCTo9IGF1MDgyOC1jb3JlLm8gYXUwODI4LWkyYy5vIGF1MDgyOC1jYXJkcy5vIGF1MDgyOC1kdmIubyBhdTA4MjgtdmlkZW8ubyBhdTA4MjgtdmJpLm8KIAogb2JqLSQoQ09ORklHX1ZJREVPX0FVMDgyOCkgKz0gYXUwODI4Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZiaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmJpLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgICBhdTA4MjgtdmJpLmMgLSBWQkkgZHJpdmVyIGZvciBhdTA4MjgKKworICAgQ29weXJpZ2h0IChDKSAyMDEwIERldmluIEhlaXRtdWVsbGVyIDxkaGVpdG11ZWxsZXJAa2VybmVsbGFicy5jb20+CisKKyAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdldFdlbGxOZXR3b3JrIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJhdTA4MjguaCIKKworc3RhdGljIHVuc2lnbmVkIGludCB2YmlidWZzID0gNTsKK21vZHVsZV9wYXJhbSh2YmlidWZzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2YmlidWZzLCAibnVtYmVyIG9mIHZiaSBidWZmZXJzLCByYW5nZSAyLTMyIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorZnJlZV9idWZmZXIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IGF1MDgyOF9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXUwODI4X2ZoICAgICAqZmggID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgYXUwODI4X2RldiAgICAqZGV2ID0gZmgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCUJVRygpOworCisJLyogV2UgdXNlZCB0byB3YWl0IGZvciB0aGUgYnVmZmVyIHRvIGZpbmlzaCBoZXJlLCBidXQgdGhpcyBkaWRuJ3Qgd29yaworCSAgIGJlY2F1c2UsIGFzIHdlIHdlcmUga2VlcGluZyB0aGUgc3RhdGUgYXMgVklERU9CVUZfUVVFVUVELAorCSAgIHZpZGVvYnVmX3F1ZXVlX2NhbmNlbCBtYXJrZWQgaXQgYXMgZmluaXNoZWQgZm9yIHVzLgorCSAgIChBbHNvLCBpdCBjb3VsZCB3ZWRnZSBmb3JldmVyIGlmIHRoZSBoYXJkd2FyZSB3YXMgbWlzY29uZmlndXJlZC4pCisKKwkgICBUaGlzIHNob3VsZCBiZSBzYWZlOyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgdGhlIGJ1ZmZlciBpc24ndAorCSAgIHF1ZXVlZCBhbnltb3JlLiBJZiB3ZSBldmVyIHN0YXJ0IG1hcmtpbmcgdGhlIGJ1ZmZlcnMgYXMKKwkgICBWSURFT0JVRl9BQ1RJVkUsIGl0IHdvbid0IGJlLCB0aG91Z2guCisJKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworCWlmIChkZXYtPmlzb2NfY3RsLnZiaV9idWYgPT0gYnVmKQorCQlkZXYtPmlzb2NfY3RsLnZiaV9idWYgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKKworCXZpZGVvYnVmX3ZtYWxsb2NfZnJlZSgmYnVmLT52Yik7CisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Cit9CisKK3N0YXRpYyBpbnQKK3ZiaV9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgYXUwODI4X2ZoICAgICAqZmggID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCBhdTA4MjhfZGV2ICAgICpkZXYgPSBmaC0+ZGV2OworCisJKnNpemUgPSBkZXYtPnZiaV93aWR0aCAqIGRldi0+dmJpX2hlaWdodCAqIDI7CisKKwlpZiAoMCA9PSAqY291bnQpCisJCSpjb3VudCA9IHZiaWJ1ZnM7CisJaWYgKCpjb3VudCA8IDIpCisJCSpjb3VudCA9IDI7CisJaWYgKCpjb3VudCA+IDMyKQorCQkqY291bnQgPSAzMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmJpX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkgICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCBhdTA4MjhfZmggICAgICpmaCAgPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IGF1MDgyOF9kZXYgICAgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGF1MDgyOF9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGF1MDgyOF9idWZmZXIsIHZiKTsKKwlpbnQgICAgICAgICAgICAgICAgICByYyA9IDA7CisKKwlidWYtPnZiLnNpemUgPSBkZXYtPnZiaV93aWR0aCAqIGRldi0+dmJpX2hlaWdodCAqIDI7CisKKwlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICAmJiAgYnVmLT52Yi5ic2l6ZSA8IGJ1Zi0+dmIuc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWYtPnZiLndpZHRoICA9IGRldi0+dmJpX3dpZHRoOworCWJ1Zi0+dmIuaGVpZ2h0ID0gZGV2LT52YmlfaGVpZ2h0OworCWJ1Zi0+dmIuZmllbGQgID0gZmllbGQ7CisKKwlpZiAoVklERU9CVUZfTkVFRFNfSU5JVCA9PSBidWYtPnZiLnN0YXRlKSB7CisJCXJjID0gdmlkZW9idWZfaW9sb2NrKHEsICZidWYtPnZiLCBOVUxMKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9idWZmZXIocSwgYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCit2YmlfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGF1MDgyOF9idWZmZXIgICAgKmJ1ZiAgICAgPSBjb250YWluZXJfb2YodmIsCisJCQkJCQkJc3RydWN0IGF1MDgyOF9idWZmZXIsCisJCQkJCQkJdmIpOworCXN0cnVjdCBhdTA4MjhfZmggICAgICAgICpmaCAgICAgID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgYXUwODI4X2RldiAgICAgICAqZGV2ICAgICA9IGZoLT5kZXY7CisJc3RydWN0IGF1MDgyOF9kbWFxdWV1ZSAgKnZiaXEgICAgPSAmZGV2LT52YmlxOworCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKKwlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmdmJpcS0+YWN0aXZlKTsKK30KKworc3RhdGljIHZvaWQgdmJpX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgYXUwODI4X2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgYXUwODI4X2J1ZmZlciwgdmIpOworCWZyZWVfYnVmZmVyKHEsIGJ1Zik7Cit9CisKK3N0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgYXUwODI4X3ZiaV9xb3BzID0geworCS5idWZfc2V0dXAgICAgPSB2Ymlfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlICA9IHZiaV9wcmVwYXJlLAorCS5idWZfcXVldWUgICAgPSB2YmlfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICA9IHZiaV9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZpZGVvLmMKaW5kZXggNTJmMjVhYS4uNzk4OWE3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZpZGVvLmMKQEAgLTMxNCw2ICszMTQsMjMgQEAKIAl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdmJpX2J1ZmZlcl9maWxsZWQoc3RydWN0IGF1MDgyOF9kZXYgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBhdTA4MjhfZG1hcXVldWUgKmRtYV9xLAorCQkJCSAgICAgc3RydWN0IGF1MDgyOF9idWZmZXIgKmJ1ZikKK3sKKwkvKiBBZHZpY2UgdGhhdCBidWZmZXIgd2FzIGZpbGxlZCAqLworCWF1MDgyOF9pc29jZGJnKCJbJXAvJWRdIHdha2V1cFxuIiwgYnVmLCBidWYtPnZiLmkpOworCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CisJYnVmLT52Yi5maWVsZF9jb3VudCsrOworCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CisKKwlkZXYtPmlzb2NfY3RsLnZiaV9idWYgPSBOVUxMOworCisJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7Cit9CisKIC8qCiAgKiBJZGVudGlmeSB0aGUgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCiAgKi8KQEAgLTMyNyw2ICszNDQsOSBAQAogCWludCAgbGluZXNkb25lLCBjdXJybGluZWRvbmUsIG9mZnNldCwgbGVuY29weSwgcmVtYWluOwogCWludCBieXRlc3BlcmxpbmUgPSBkZXYtPndpZHRoIDw8IDE7IC8qIEFzc3VtZXMgMTYtYml0IGRlcHRoIEBAQEAgKi8KIAorCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuOworCiAJaWYgKGRtYV9xLT5wb3MgKyBsZW4gPiBidWYtPnZiLnNpemUpCiAJCWxlbiA9IGJ1Zi0+dmIuc2l6ZSAtIGRtYV9xLT5wb3M7CiAKQEAgLTQxNCwxNyArNDM0LDk4IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBhdTA4MjhfY29weV92Ymkoc3RydWN0IGF1MDgyOF9kZXYgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBhdTA4MjhfZG1hcXVldWUgICpkbWFfcSwKKwkJCSAgICAgIHN0cnVjdCBhdTA4MjhfYnVmZmVyICpidWYsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpwLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqb3V0cCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqc3RhcnR3cml0ZSwgKnN0YXJ0cmVhZDsKKwlpbnQgYnl0ZXNwZXJsaW5lOworCWludCBpLCBqID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlhdTA4MjhfaXNvY2RiZygiZGV2IGlzIG51bGxcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRtYV9xID09IE5VTEwpIHsKKwkJYXUwODI4X2lzb2NkYmcoImRtYV9xIGlzIG51bGxcbiIpOworCQlyZXR1cm47CisJfQorCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChwID09IE5VTEwpIHsKKwkJYXUwODI4X2lzb2NkYmcoInAgaXMgbnVsbFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKG91dHAgPT0gTlVMTCkgeworCQlhdTA4MjhfaXNvY2RiZygib3V0cCBpcyBudWxsXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJ5dGVzcGVybGluZSA9IGRldi0+dmJpX3dpZHRoOworCisJaWYgKGRtYV9xLT5wb3MgKyBsZW4gPiBidWYtPnZiLnNpemUpCisJCWxlbiA9IGJ1Zi0+dmIuc2l6ZSAtIGRtYV9xLT5wb3M7CisKKwlzdGFydHJlYWQgPSBwOworCXN0YXJ0d3JpdGUgPSBvdXRwICsgKGRtYV9xLT5wb3MgLyAyKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgYm90dG9tIGZpZWxkIHBvcHVsYXRlcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGZyYW1lICovCisJaWYgKGJ1Zi0+dG9wX2ZpZWxkID09IDApCisJCXN0YXJ0d3JpdGUgKz0gYnl0ZXNwZXJsaW5lICogZGV2LT52YmlfaGVpZ2h0OworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKQorCQlzdGFydHdyaXRlW2orK10gPSBzdGFydHJlYWRbaSsxXTsKKworCWRtYV9xLT5wb3MgKz0gbGVuOworfQorCisKKy8qCisgKiB2aWRlby1idWYgZ2VuZXJpYyByb3V0aW5lIHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgVkJJIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmJpX2dldF9uZXh0X2J1ZihzdHJ1Y3QgYXUwODI4X2RtYXF1ZXVlICpkbWFfcSwKKwkJCQkgICAgc3RydWN0IGF1MDgyOF9idWZmZXIgKipidWYpCit7CisJc3RydWN0IGF1MDgyOF9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IGF1MDgyOF9kZXYsIHZiaXEpOworCWNoYXIgKm91dHA7CisKKwlpZiAobGlzdF9lbXB0eSgmZG1hX3EtPmFjdGl2ZSkpIHsKKwkJYXUwODI4X2lzb2NkYmcoIk5vIGFjdGl2ZSBxdWV1ZSB0byBzZXJ2ZVxuIik7CisJCWRldi0+aXNvY19jdGwudmJpX2J1ZiA9IE5VTEw7CisJCSpidWYgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSBuZXh0IGJ1ZmZlciAqLworCSpidWYgPSBsaXN0X2VudHJ5KGRtYV9xLT5hY3RpdmUubmV4dCwgc3RydWN0IGF1MDgyOF9idWZmZXIsIHZiLnF1ZXVlKTsKKwkvKiBDbGVhbnMgdXAgYnVmZmVyIC0gVXNlZnVsbCBmb3IgdGVzdGluZyBmb3IgZnJhbWUvVVJCIGxvc3MgKi8KKwlvdXRwID0gdmlkZW9idWZfdG9fdm1hbGxvYygmKCpidWYpLT52Yik7CisJbWVtc2V0KG91dHAsIDB4MDAsICgqYnVmKS0+dmIuc2l6ZSk7CisKKwlkZXYtPmlzb2NfY3RsLnZiaV9idWYgPSAqYnVmOworCisJcmV0dXJuOworfQorCiAvKgogICogQ29udHJvbHMgdGhlIGlzb2MgY29weSBvZiBlYWNoIHVyYiBwYWNrZXQKICAqLwogc3RhdGljIGlubGluZSBpbnQgYXUwODI4X2lzb2NfY29weShzdHJ1Y3QgYXUwODI4X2RldiAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGF1MDgyOF9idWZmZXIgICAgKmJ1ZjsKKwlzdHJ1Y3QgYXUwODI4X2J1ZmZlciAgICAqdmJpX2J1ZjsKIAlzdHJ1Y3QgYXUwODI4X2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGF1MDgyOF9kbWFxdWV1ZSAgKnZiaV9kbWFfcSA9ICZkZXYtPnZiaXE7CiAJdW5zaWduZWQgY2hhciAqb3V0cCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqdmJpb3V0cCA9IE5VTEw7CiAJaW50IGksIGxlbiA9IDAsIHJjID0gMTsKIAl1bnNpZ25lZCBjaGFyICpwOwogCXVuc2lnbmVkIGNoYXIgZmJ5dGU7CisJdW5zaWduZWQgaW50IHZiaV9maWVsZF9zaXplOworCXVuc2lnbmVkIGludCByZW1haW4sIGxlbmNvcHk7CiAKIAlpZiAoIWRldikKIAkJcmV0dXJuIDA7CkBAIC00NDMsNiArNTQ0LDEwIEBACiAJaWYgKGJ1ZiAhPSBOVUxMKQogCQlvdXRwID0gdmlkZW9idWZfdG9fdm1hbGxvYygmYnVmLT52Yik7CiAKKwl2YmlfYnVmID0gZGV2LT5pc29jX2N0bC52YmlfYnVmOworCWlmICh2YmlfYnVmICE9IE5VTEwpCisJCXZiaW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCZ2YmlfYnVmLT52Yik7CisKIAlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CiAJCWludCBzdGF0dXMgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKIApAQCAtNDcyLDYgKzU3NywxOSBAQAogCQkJYXUwODI4X2lzb2NkYmcoIlZpZGVvIGZyYW1lICVzXG4iLAogCQkJCSAgICAgICAoZmJ5dGUgJiAweDQwKSA/ICJvZGQiIDogImV2ZW4iKTsKIAkJCWlmICghKGZieXRlICYgMHg0MCkpIHsKKwkJCQkvKiBWQkkgKi8KKwkJCQlpZiAodmJpX2J1ZiAhPSBOVUxMKQorCQkJCQl2YmlfYnVmZmVyX2ZpbGxlZChkZXYsCisJCQkJCQkJICB2YmlfZG1hX3EsCisJCQkJCQkJICB2YmlfYnVmKTsKKwkJCQl2YmlfZ2V0X25leHRfYnVmKHZiaV9kbWFfcSwgJnZiaV9idWYpOworCQkJCWlmICh2YmlfYnVmID09IE5VTEwpCisJCQkJCXZiaW91dHAgPSBOVUxMOworCQkJCWVsc2UKKwkJCQkJdmJpb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoCisJCQkJCQkmdmJpX2J1Zi0+dmIpOworCisJCQkJLyogVmlkZW8gKi8KIAkJCQlpZiAoYnVmICE9IE5VTEwpCiAJCQkJCWJ1ZmZlcl9maWxsZWQoZGV2LCBkbWFfcSwgYnVmKTsKIAkJCQlnZXRfbmV4dF9idWYoZG1hX3EsICZidWYpOwpAQCAtNDg4LDkgKzYwNiwzNiBAQAogCQkJCQlidWYtPnRvcF9maWVsZCA9IDA7CiAJCQl9CiAKKwkJCWlmICh2YmlfYnVmICE9IE5VTEwpIHsKKwkJCQlpZiAoZmJ5dGUgJiAweDQwKQorCQkJCQl2YmlfYnVmLT50b3BfZmllbGQgPSAxOworCQkJCWVsc2UKKwkJCQkJdmJpX2J1Zi0+dG9wX2ZpZWxkID0gMDsKKwkJCX0KKworCQkJZGV2LT52YmlfcmVhZCA9IDA7CisJCQl2YmlfZG1hX3EtPnBvcyA9IDA7CiAJCQlkbWFfcS0+cG9zID0gMDsKIAkJfQotCQlpZiAoYnVmICE9IE5VTEwpCisKKwkJdmJpX2ZpZWxkX3NpemUgPSBkZXYtPnZiaV93aWR0aCAqIGRldi0+dmJpX2hlaWdodCAqIDI7CisJCWlmIChkZXYtPnZiaV9yZWFkIDwgdmJpX2ZpZWxkX3NpemUpIHsKKwkJCXJlbWFpbiAgPSB2YmlfZmllbGRfc2l6ZSAtIGRldi0+dmJpX3JlYWQ7CisJCQlpZiAobGVuIDwgcmVtYWluKQorCQkJCWxlbmNvcHkgPSBsZW47CisJCQllbHNlCisJCQkJbGVuY29weSA9IHJlbWFpbjsKKworCQkJaWYgKHZiaV9idWYgIT0gTlVMTCkKKwkJCQlhdTA4MjhfY29weV92YmkoZGV2LCB2YmlfZG1hX3EsIHZiaV9idWYsIHAsCisJCQkJCQl2YmlvdXRwLCBsZW4pOworCisJCQlsZW4gLT0gbGVuY29weTsKKwkJCXAgKz0gbGVuY29weTsKKwkJCWRldi0+dmJpX3JlYWQgKz0gbGVuY29weTsKKwkJfQorCisJCWlmIChkZXYtPnZiaV9yZWFkID49IHZiaV9maWVsZF9zaXplICYmIGJ1ZiAhPSBOVUxMKQogCQkJYXUwODI4X2NvcHlfdmlkZW8oZGV2LCBkbWFfcSwgYnVmLCBwLCBvdXRwLCBsZW4pOwogCX0KIAlyZXR1cm4gcmM7CkBAIC02NDIsNyArNzg3LDcgQEAKIAlhdTA4Mjhfd3JpdGVyZWcoZCwgMHgxMTQsIDB4YTApOwogCWF1MDgyOF93cml0ZXJlZyhkLCAweDExNSwgMHgwNSk7CiAJLyogc2V0IHkgcG9zaXRpb24gKi8KLQlhdTA4Mjhfd3JpdGVyZWcoZCwgMHgxMTIsIDB4MDIpOworCWF1MDgyOF93cml0ZXJlZyhkLCAweDExMiwgMHgwMCk7CiAJYXUwODI4X3dyaXRlcmVnKGQsIDB4MTEzLCAweDAwKTsKIAlhdTA4Mjhfd3JpdGVyZWcoZCwgMHgxMTYsIDB4ZjIpOwogCWF1MDgyOF93cml0ZXJlZyhkLCAweDExNywgMHgwMCk7CkBAIC03MDMsNDcgKzg0OCw4MyBAQAogCiAKIC8qIFVzYWdlIGxvY2sgY2hlY2sgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IGF1MDgyOF9maCAqZmgpCitzdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IGF1MDgyOF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCiB7Ci0Jc3RydWN0IGF1MDgyOF9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50CQkgcmMgICA9IDA7CisJc3RydWN0IGF1MDgyOF9kZXYgICAgKmRldiA9IGZoLT5kZXY7CiAKLQkvKiBUaGlzIGluc3RhbmNlIGFscmVhZHkgaGFzIHN0cmVhbV9vbiAqLwotCWlmIChmaC0+c3RyZWFtX29uKQotCQlyZXR1cm4gcmM7CisJaWYgKGZoLT5yZXNvdXJjZXMgJiBiaXQpCisJCS8qIGhhdmUgaXQgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwkJcmV0dXJuIDE7CiAKLQlpZiAoZGV2LT5zdHJlYW1fb24pCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlkZXYtPnN0cmVhbV9vbiA9IDE7Ci0JZmgtPnN0cmVhbV9vbiAgPSAxOwotCXJldHVybiByYzsKKwkvKiBpcyBpdCBmcmVlPyAqLworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJaWYgKGRldi0+cmVzb3VyY2VzICYgYml0KSB7CisJCS8qIG5vLCBzb21lb25lIGVsc2UgdXNlcyBpdCAqLworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KKwlmaC0+cmVzb3VyY2VzICB8PSBiaXQ7CisJZGV2LT5yZXNvdXJjZXMgfD0gYml0OworCWRwcmludGsoMSwgInJlczogZ2V0ICVkXG4iLCBiaXQpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCByZXNfY2hlY2soc3RydWN0IGF1MDgyOF9maCAqZmgpCitzdGF0aWMgaW50IHJlc19jaGVjayhzdHJ1Y3QgYXUwODI4X2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKIHsKLQlyZXR1cm4gZmgtPnN0cmVhbV9vbjsKKwlyZXR1cm4gZmgtPnJlc291cmNlcyAmIGJpdDsKIH0KIAotc3RhdGljIHZvaWQgcmVzX2ZyZWUoc3RydWN0IGF1MDgyOF9maCAqZmgpCitzdGF0aWMgaW50IHJlc19sb2NrZWQoc3RydWN0IGF1MDgyOF9kZXYgKmRldiwgdW5zaWduZWQgaW50IGJpdCkKIHsKLQlzdHJ1Y3QgYXUwODI4X2RldiAqZGV2ID0gZmgtPmRldjsKKwlyZXR1cm4gZGV2LT5yZXNvdXJjZXMgJiBiaXQ7Cit9CiAKLQlmaC0+c3RyZWFtX29uID0gMDsKLQlkZXYtPnN0cmVhbV9vbiA9IDA7CitzdGF0aWMgdm9pZCByZXNfZnJlZShzdHJ1Y3QgYXUwODI4X2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJc3RydWN0IGF1MDgyOF9kZXYgICAgKmRldiA9IGZoLT5kZXY7CisKKwlCVUdfT04oKGZoLT5yZXNvdXJjZXMgJiBiaXRzKSAhPSBiaXRzKTsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CisJZGV2LT5yZXNvdXJjZXMgJj0gfmJpdHM7CisJZHByaW50aygxLCAicmVzOiBwdXQgJWRcbiIsIGJpdHMpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKK30KKworc3RhdGljIGludCBnZXRfcmVzc291cmNlKHN0cnVjdCBhdTA4MjhfZmggKmZoKQoreworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJcmV0dXJuIEFVMDgyOF9SRVNPVVJDRV9WSURFTzsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCXJldHVybiBBVTA4MjhfUkVTT1VSQ0VfVkJJOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYXUwODI4X3Y0bDJfb3BlbihzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgYXUwODI4X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgYXUwODI4X2ZoICpmaDsKLQlpbnQgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlpbnQgdHlwZTsKIAotI2lmZGVmIFZCSV9JU19XT1JLSU5HCi0JaWYgKHZpZGVvX2RldmRhdGEoZmlscCktPnZmbF90eXBlID09IFZGTF9UWVBFX0dSQUJCRVIpCisJc3dpdGNoICh2ZGV2LT52ZmxfdHlwZSkgeworCWNhc2UgVkZMX1RZUEVfR1JBQkJFUjoKKwkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJYnJlYWs7CisJY2FzZSBWRkxfVFlQRV9WQkk6CiAJCXR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwotI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWZoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1MDgyOF9maCksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IGZoKSB7CkBAIC03ODEsMTAgKzk2MiwyMSBAQAogCWRldi0+dXNlcnMrKzsKIAogCXZpZGVvYnVmX3F1ZXVlX3ZtYWxsb2NfaW5pdCgmZmgtPnZiX3ZpZHEsICZhdTA4MjhfdmlkZW9fcW9wcywKLQkJCQkgICAgTlVMTCwgJmRldi0+c2xvY2ssIGZoLT50eXBlLAorCQkJCSAgICBOVUxMLCAmZGV2LT5zbG9jaywKKwkJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAogCQkJCSAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgYXUwODI4X2J1ZmZlciksIGZoKTsKIAorCS8qIFZCSSBTZXR1cCAqLworCWRldi0+dmJpX3dpZHRoID0gNzIwOworCWRldi0+dmJpX2hlaWdodCA9IDE7CisJdmlkZW9idWZfcXVldWVfdm1hbGxvY19pbml0KCZmaC0+dmJfdmJpcSwgJmF1MDgyOF92YmlfcW9wcywKKwkJCQkgICAgTlVMTCwgJmRldi0+c2xvY2ssCisJCQkJICAgIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUsCisJCQkJICAgIFY0TDJfRklFTERfU0VRX1RCLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGF1MDgyOF9idWZmZXIpLCBmaCk7CisKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc5NCwxNyArOTg2LDE5IEBACiAJc3RydWN0IGF1MDgyOF9maCAqZmggPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGF1MDgyOF9kZXYgKmRldiA9IGZoLT5kZXY7CiAKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCWlmIChyZXNfY2hlY2soZmgpKQotCQlyZXNfZnJlZShmaCk7CisJaWYgKHJlc19jaGVjayhmaCwgQVUwODI4X1JFU09VUkNFX1ZJREVPKSkgeworCQl2aWRlb2J1Zl9zdG9wKCZmaC0+dmJfdmlkcSk7CisJCXJlc19mcmVlKGZoLCBBVTA4MjhfUkVTT1VSQ0VfVklERU8pOworCX0KKworCWlmIChyZXNfY2hlY2soZmgsIEFVMDgyOF9SRVNPVVJDRV9WQkkpKSB7CisJCXZpZGVvYnVmX3N0b3AoJmZoLT52Yl92YmlxKTsKKwkJcmVzX2ZyZWUoZmgsIEFVMDgyOF9SRVNPVVJDRV9WQkkpOworCX0KIAogCWlmIChkZXYtPnVzZXJzID09IDEpIHsKLQkJdmlkZW9idWZfc3RvcCgmZmgtPnZiX3ZpZHEpOwotCQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52Yl92aWRxKTsKLQogCQlpZiAoZGV2LT5kZXZfc3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7CiAJCQlhdTA4MjhfYW5hbG9nX3VucmVnaXN0ZXIoZGV2KTsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAkJCWtmcmVlKGRldik7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtODIzLDEwICsxMDE3LDExIEBACiAJCQlwcmludGsoS0VSTl9JTkZPICJBdTA4MjggY2FuJ3Qgc2V0IGFsdGVybmF0ZSB0byAwIVxuIik7CiAJfQogCisJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmJfdmlkcSk7CisJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmJfdmJpcSk7CiAJa2ZyZWUoZmgpOwogCWRldi0+dXNlcnMtLTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGVfbnIoJmRldi0+b3BlbiwgMSk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC04NDIsMTYgKzEwMzcsMjEgQEAKIAkJcmV0dXJuIHJjOwogCiAJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCQlyYyA9IHJlc19nZXQoZmgpOwotCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQkJaWYgKHVubGlrZWx5KHJjIDwgMCkpCi0JCQlyZXR1cm4gcmM7CisJCWlmIChyZXNfbG9ja2VkKGRldiwgQVUwODI4X1JFU09VUkNFX1ZJREVPKSkKKwkJCXJldHVybiAtRUJVU1k7CiAKIAkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+dmJfdmlkcSwgYnVmLCBjb3VudCwgcG9zLCAwLAogCQkJCQlmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAJfQorCisJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpIHsKKwkJaWYgKCFyZXNfZ2V0KGZoLCBBVTA4MjhfUkVTT1VSQ0VfVkJJKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+dmJfdmJpcSwgYnVmLCBjb3VudCwgcG9zLCAwLAorCQkJCQkgICAgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC04NjUsMTcgKzEwNjUsMTcgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCXJjID0gcmVzX2dldChmaCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCi0JaWYgKHVubGlrZWx5KHJjIDwgMCkpCisJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQlpZiAoIXJlc19nZXQoZmgsIEFVMDgyOF9SRVNPVVJDRV9WSURFTykpCisJCQlyZXR1cm4gUE9MTEVSUjsKKwkJcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbHAsICZmaC0+dmJfdmlkcSwgd2FpdCk7CisJfSBlbHNlIGlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKSB7CisJCWlmICghcmVzX2dldChmaCwgQVUwODI4X1JFU09VUkNFX1ZCSSkpCisJCQlyZXR1cm4gUE9MTEVSUjsKKwkJcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbHAsICZmaC0+dmJfdmJpcSwgd2FpdCk7CisJfSBlbHNlIHsKIAkJcmV0dXJuIFBPTExFUlI7Ci0KLQlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICE9IGZoLT50eXBlKQotCQlyZXR1cm4gUE9MTEVSUjsKLQotCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxwLCAmZmgtPnZiX3ZpZHEsIHdhaXQpOworCX0KIH0KIAogc3RhdGljIGludCBhdTA4MjhfdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKQEAgLTg4OCwxNCArMTA4OCwxMCBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JcmMgPSByZXNfZ2V0KGZoKTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQlpZiAodW5saWtlbHkocmMgPCAwKSkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZpZHEsIHZtYSk7CisJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmMgPSB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZpZHEsIHZtYSk7CisJZWxzZSBpZiAoZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkKKwkJcmMgPSB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZiaXEsIHZtYSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05MTEsMTQgKzExMDcsNiBAQAogCW1heHdpZHRoID0gNzIwOwogCW1heGhlaWdodCA9IDQ4MDsKIAotI2lmZGVmIFZCSV9JU19XT1JLSU5HCi0JaWYgKGZvcm1hdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSkgewotCQlkcHJpbnRrKDEsICJWQkkgZm9ybWF0IHNldDogdG8gYmUgc3VwcG9ydGVkIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZm9ybWF0LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpCi0JCXJldHVybiAwOwotI2VuZGlmCiAJaWYgKGZvcm1hdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC05OTksOSArMTE4Nyw3IEBACiAKIAkvKnNldCB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcyAqLwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0jaWZkZWYgVkJJX0lTX1dPUktJTkcKIAkJVjRMMl9DQVBfVkJJX0NBUFRVUkUgfAotI2VuZGlmCiAJCVY0TDJfQ0FQX0FVRElPIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFIHwKIAkJVjRMMl9DQVBfU1RSRUFNSU5HIHwKQEAgLTEwNTYsMjAgKzEyNDIsMjEgQEAKIAlzdHJ1Y3QgYXUwODI4X2RldiAqZGV2ID0gZmgtPmRldjsKIAlpbnQgcmM7CiAKKwlyYyA9IGNoZWNrX2RldihkZXYpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisKIAlpZiAodmlkZW9idWZfcXVldWVfaXNfYnVzeSgmZmgtPnZiX3ZpZHEpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzIHF1ZXVlIGJ1c3lcbiIsIF9fZnVuY19fKTsKIAkJcmMgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChkZXYtPnN0cmVhbV9vbiAmJiAhZmgtPnN0cmVhbV9vbikgewotCQlwcmludGsoS0VSTl9JTkZPICIlcyBkZXZpY2UgaW4gdXNlIGJ5IGFub3RoZXIgZmhcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldHVybiBhdTA4Mjhfc2V0X2Zvcm1hdChkZXYsIFZJRElPQ19TX0ZNVCwgZik7CisJcmMgPSBhdTA4Mjhfc2V0X2Zvcm1hdChkZXYsIFZJRElPQ19TX0ZNVCwgZik7CiBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiByYzsKIH0KIApAQCAtMTMwMCw2ICsxNDg3LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKKworLyogUkFXIFZCSSBpb2N0bHMgKi8KKworc3RhdGljIGludCB2aWRpb2NfZ19mbXRfdmJpX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgYXUwODI4X2ZoICAgICAgKmZoICA9IHByaXY7CisJc3RydWN0IGF1MDgyOF9kZXYgICAgICpkZXYgPSBmaC0+ZGV2OworCisJZm9ybWF0LT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmUgPSBkZXYtPnZiaV93aWR0aDsKKwlmb3JtYXQtPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZOworCWZvcm1hdC0+Zm10LnZiaS5vZmZzZXQgPSAwOworCWZvcm1hdC0+Zm10LnZiaS5mbGFncyA9IDA7CisJZm9ybWF0LT5mbXQudmJpLnNhbXBsaW5nX3JhdGUgPSA2NzUwMDAwICogNCAvIDI7CisKKwlmb3JtYXQtPmZtdC52YmkuY291bnRbMF0gPSBkZXYtPnZiaV9oZWlnaHQ7CisJZm9ybWF0LT5mbXQudmJpLmNvdW50WzFdID0gZGV2LT52YmlfaGVpZ2h0OworCWZvcm1hdC0+Zm10LnZiaS5zdGFydFswXSA9IDIxOworCWZvcm1hdC0+Zm10LnZiaS5zdGFydFsxXSA9IDI4NDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZpZGlvY19nX2NoaXBfaWRlbnQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJICAgICAgIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQogewpAQCAtMTM0NSwyNSArMTU1NSwzMiBAQAogc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgYXUwODI4X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGF1MDgyOF9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IHJjOworCXN0cnVjdCBhdTA4MjhfZmggICAgICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgYXUwODI4X2RldiAgICAgKmRldiA9IGZoLT5kZXY7CisJaW50ICAgICAgICAgICAgICAgICAgIHJjID0gLUVJTlZBTDsKIAogCXJjID0gY2hlY2tfZGV2KGRldik7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCisJaWYgKHVubGlrZWx5KHR5cGUgIT0gZmgtPnR5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoMSwgInZpZGlvY19zdHJlYW1vbiBmaD0lcCB0PSVkIGZoLT5yZXM9JWQgZGV2LT5yZXM9JWRcbiIsCisJCWZoLCB0eXBlLCBmaC0+cmVzb3VyY2VzLCBkZXYtPnJlc291cmNlcyk7CisKKwlpZiAodW5saWtlbHkoIXJlc19nZXQoZmgsIGdldF9yZXNzb3VyY2UoZmgpKSkpCisJCXJldHVybiAtRUJVU1k7CisKIAlpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKIAkJYXUwODI4X2FuYWxvZ19zdHJlYW1fZW5hYmxlKGRldik7CiAJCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB2aWRlbywgc19zdHJlYW0sIDEpOwogCX0KIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JcmMgPSByZXNfZ2V0KGZoKTsKLQotCWlmIChsaWtlbHkocmMgPj0gMCkpCisJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmMgPSB2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwllbHNlIGlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKQorCQlyYyA9IHZpZGVvYnVmX3N0cmVhbW9uKCZmaC0+dmJfdmJpcSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzcxLDM4ICsxNTg4LDQyIEBACiBzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGF1MDgyOF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBhdTA4MjhfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBpOwotCWludCByZXQ7Ci0JaW50IHJjOworCXN0cnVjdCBhdTA4MjhfZmggICAgICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgYXUwODI4X2RldiAgICAgKmRldiA9IGZoLT5kZXY7CisJaW50ICAgICAgICAgICAgICAgICAgIHJjOworCWludCAgICAgICAgICAgICAgICAgICBpOwogCiAJcmMgPSBjaGVja19kZXYoZGV2KTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgJiYKKwkgICAgZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHR5cGUgIT0gZmgtPnR5cGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJZHByaW50aygxLCAidmlkaW9jX3N0cmVhbW9mZiBmaD0lcCB0PSVkIGZoLT5yZXM9JWQgZGV2LT5yZXM9JWRcbiIsCisJCWZoLCB0eXBlLCBmaC0+cmVzb3VyY2VzLCBkZXYtPnJlc291cmNlcyk7CisKKwlpZiAoZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CiAJCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB2aWRlbywgc19zdHJlYW0sIDApOwotCQlyZXQgPSBhdTA4Mjhfc3RyZWFtX2ludGVycnVwdChkZXYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KKwkJcmMgPSBhdTA4Mjhfc3RyZWFtX2ludGVycnVwdChkZXYpOworCQlpZiAocmMgIT0gMCkKKwkJCXJldHVybiByYzsKIAotCWZvciAoaSA9IDA7IGkgPCBBVTA4MjhfTUFYX0lOUFVUOyBpKyspIHsKLQkJaWYgKEFVVklfSU5QVVQoaSkuYXVkaW9fc2V0dXAgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQkoQVVWSV9JTlBVVChpKS5hdWRpb19zZXR1cCkoZGV2LCAwKTsKLQl9CisJCWZvciAoaSA9IDA7IGkgPCBBVTA4MjhfTUFYX0lOUFVUOyBpKyspIHsKKwkJCWlmIChBVVZJX0lOUFVUKGkpLmF1ZGlvX3NldHVwID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQkoQVVWSV9JTlBVVChpKS5hdWRpb19zZXR1cCkoZGV2LCAwKTsKKwkJfQogCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQl2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52Yl92aWRxKTsKLQlyZXNfZnJlZShmaCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQl2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52Yl92aWRxKTsKKwkJcmVzX2ZyZWUoZmgsIEFVMDgyOF9SRVNPVVJDRV9WSURFTyk7CisJfSBlbHNlIGlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKSB7CisJCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZiaXEpOworCQlyZXNfZnJlZShmaCwgQVUwODI4X1JFU09VUkNFX1ZCSSk7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTI3LDE5ICsxNzQ4LDExIEBACiAJLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgICAgID0gdmlkaW9jX2dfZm10X3ZpZF9jYXAsCiAJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgICAgID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKIAkudmlkaW9jX3NfZm10X3ZpZF9jYXAgICAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKLSNpZmRlZiBWQklfSVNfV09SS0lORwogCS52aWRpb2NfZ19mbXRfdmJpX2NhcCAgICAgICA9IHZpZGlvY19nX2ZtdF92YmlfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwICAgICA9IHZpZGlvY19zX2ZtdF92YmlfY2FwLAotCS52aWRpb2Nfc19mbXRfdmJpX2NhcCAgICAgICA9IHZpZGlvY19zX2ZtdF92YmlfY2FwLAotI2VuZGlmCisJLnZpZGlvY19zX2ZtdF92YmlfY2FwICAgICAgID0gdmlkaW9jX2dfZm10X3ZiaV9jYXAsCiAJLnZpZGlvY19nX2F1ZGlvICAgICAgICAgICAgID0gdmlkaW9jX2dfYXVkaW8sCiAJLnZpZGlvY19zX2F1ZGlvICAgICAgICAgICAgID0gdmlkaW9jX3NfYXVkaW8sCiAJLnZpZGlvY19jcm9wY2FwICAgICAgICAgICAgID0gdmlkaW9jX2Nyb3BjYXAsCi0jaWZkZWYgVkJJX0lTX1dPUktJTkcKLQkudmlkaW9jX2dfZm10X3NsaWNlZF92YmlfY2FwICAgPSB2aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9jYXAsCi0JLnZpZGlvY190cnlfZm10X3NsaWNlZF92YmlfY2FwID0gdmlkaW9jX3RyeV9zZXRfc2xpY2VkX3ZiaV9jYXAsCi0JLnZpZGlvY19zX2ZtdF9zbGljZWRfdmJpX2NhcCAgID0gdmlkaW9jX3RyeV9zZXRfc2xpY2VkX3ZiaV9jYXAsCi0jZW5kaWYKIAkudmlkaW9jX3JlcWJ1ZnMgICAgICAgICAgICAgPSB2aWRpb2NfcmVxYnVmcywKIAkudmlkaW9jX3F1ZXJ5YnVmICAgICAgICAgICAgPSB2aWRpb2NfcXVlcnlidWYsCiAJLnZpZGlvY19xYnVmICAgICAgICAgICAgICAgID0gdmlkaW9jX3FidWYsCkBAIC0xNjIxLDggKzE4MzQsMTEgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKIAorCS8qIGluaXQgdmlkZW8gZG1hIHF1ZXVlcyAqLwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZpZHEuYWN0aXZlKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLnF1ZXVlZCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJpcS5hY3RpdmUpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZiaXEucXVldWVkKTsKIAogCWRldi0+d2lkdGggPSBOVFNDX1NURF9XOwogCWRldi0+aGVpZ2h0ID0gTlRTQ19TVERfSDsKQEAgLTE2MzgsMjYgKzE4NTQsMjMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0jaWZkZWYgVkJJX0lTX1dPUktJTkcKKwkvKiBhbGxvY2F0ZSB0aGUgVkJJIHN0cnVjdCAqLwogCWRldi0+dmJpX2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCWlmIChOVUxMID09IGRldi0+dmJpX2RldikgewogCQlkcHJpbnRrKDEsICJDYW4ndCBhbGxvY2F0ZSB2YmlfZGV2aWNlLlxuIik7CiAJCWtmcmVlKGRldi0+dmRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLSNlbmRpZgogCiAJLyogRmlsbCB0aGUgdmlkZW8gY2FwdHVyZSBkZXZpY2Ugc3RydWN0ICovCiAJKmRldi0+dmRldiA9IGF1MDgyOF92aWRlb190ZW1wbGF0ZTsKIAlkZXYtPnZkZXYtPnBhcmVudCA9ICZkZXYtPnVzYmRldi0+ZGV2OwogCXN0cmNweShkZXYtPnZkZXYtPm5hbWUsICJhdTA4MjhhIHZpZGVvIik7CiAKLSNpZmRlZiBWQklfSVNfV09SS0lORwogCS8qIFNldHVwIHRoZSBWQkkgZGV2aWNlICovCiAJKmRldi0+dmJpX2RldiA9IGF1MDgyOF92aWRlb190ZW1wbGF0ZTsKIAlkZXYtPnZiaV9kZXYtPnBhcmVudCA9ICZkZXYtPnVzYmRldi0+ZGV2OwogCXN0cmNweShkZXYtPnZiaV9kZXYtPm5hbWUsICJhdTA4MjhhIHZiaSIpOwotI2VuZGlmCiAKIAkvKiBSZWdpc3RlciB0aGUgdjRsMiBkZXZpY2UgKi8KIAl2aWRlb19zZXRfZHJ2ZGF0YShkZXYtPnZkZXYsIGRldik7CkBAIC0xNjY5LDcgKzE4ODIsNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLSNpZmRlZiBWQklfSVNfV09SS0lORwogCS8qIFJlZ2lzdGVyIHRoZSB2YmkgZGV2aWNlICovCiAJdmlkZW9fc2V0X2RydmRhdGEoZGV2LT52YmlfZGV2LCBkZXYpOwogCXJldHZhbCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShkZXYtPnZiaV9kZXYsIFZGTF9UWVBFX1ZCSSwgLTEpOwpAQCAtMTY4MCw3ICsxODkyLDYgQEAKIAkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT52ZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotI2VuZGlmCiAKIAlkcHJpbnRrKDEsICIlcyBjb21wbGV0ZWQhXG4iLCBfX2Z1bmNfXyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LmgKaW5kZXggMjA3ZjMyZC4uOTkwNWJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LmgKQEAgLTYwLDYgKzYwLDEwIEBACiAKICNkZWZpbmUgQVUwODI4X01BWF9JTlBVVCAgICAgICAgNAogCisvKiBhdTA4MjggcmVzb3VyY2UgdHlwZXMgKHVzZWQgZm9yIHJlc19nZXQvcmVzX2xvY2sgZXRjICovCisjZGVmaW5lIEFVMDgyOF9SRVNPVVJDRV9WSURFTyAweDAxCisjZGVmaW5lIEFVMDgyOF9SRVNPVVJDRV9WQkkgICAweDAyCisKIGVudW0gYXUwODI4X2l0eXBlIHsKIAlBVTA4MjhfVk1VWF9VTkRFRklORUQgPSAwLAogCUFVMDgyOF9WTVVYX0NPTVBPU0lURSwKQEAgLTExNSw4ICsxMTksMTAgQEAKIAogc3RydWN0IGF1MDgyOF9maCB7CiAJc3RydWN0IGF1MDgyOF9kZXYgKmRldjsKLQl1bnNpZ25lZCBpbnQgIHN0cmVhbV9vbjoxOwkvKiBMb2NrcyBzdHJlYW1zICovCisJdW5zaWduZWQgaW50ICByZXNvdXJjZXM7CisKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgICAgICAgIHZiX3ZpZHE7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgICB2Yl92YmlxOwogCWVudW0gdjRsMl9idWZfdHlwZSAgICAgICAgICAgdHlwZTsKIH07CiAKQEAgLTE0NSw3ICsxNTEsOCBAQAogCWludAkJCQl0bXBfYnVmX2xlbjsKIAogCQkvKiBTdG9yZXMgYWxyZWFkeSByZXF1ZXN0ZWQgYnVmZmVycyAqLwotCXN0cnVjdCBhdTA4MjhfYnVmZmVyICAgIAkqYnVmOworCXN0cnVjdCBhdTA4MjhfYnVmZmVyCQkqYnVmOworCXN0cnVjdCBhdTA4MjhfYnVmZmVyCQkqdmJpX2J1ZjsKIAogCQkvKiBTdG9yZXMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBmaWVsZHMgKi8KIAlpbnQJCQkJbmZpZWxkczsKQEAgLTE5NCwxMSArMjAxLDE0IEBACiAJLyogQW5hbG9nICovCiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCWludCB1c2VyczsKLQl1bnNpZ25lZCBpbnQgc3RyZWFtX29uOjE7CS8qIExvY2tzIHN0cmVhbXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVzb3VyY2VzOwkvKiByZXNvdXJjZXMgaW4gdXNlICovCiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2YmlfZGV2OwogCWludCB3aWR0aDsKIAlpbnQgaGVpZ2h0OworCWludCB2Ymlfd2lkdGg7CisJaW50IHZiaV9oZWlnaHQ7CisJdTMyIHZiaV9yZWFkOwogCXUzMiBmaWVsZF9zaXplOwogCXUzMiBmcmFtZV9zaXplOwogCXUzMiBieXRlc3BlcmxpbmU7CkBAIC0yMTksNiArMjI5LDcgQEAKIAogCS8qIElzb2MgY29udHJvbCBzdHJ1Y3QgKi8KIAlzdHJ1Y3QgYXUwODI4X2RtYXF1ZXVlIHZpZHE7CisJc3RydWN0IGF1MDgyOF9kbWFxdWV1ZSB2YmlxOwogCXN0cnVjdCBhdTA4MjhfdXNiX2lzb2NfY3RsIGlzb2NfY3RsOwogCXNwaW5sb2NrX3Qgc2xvY2s7CiAKQEAgLTI3OCw2ICsyODksOSBAQAogZXh0ZXJuIGludCBhdTA4MjhfZHZiX3JlZ2lzdGVyKHN0cnVjdCBhdTA4MjhfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgYXUwODI4X2R2Yl91bnJlZ2lzdGVyKHN0cnVjdCBhdTA4MjhfZGV2ICpkZXYpOwogCisvKiBhdTA4MjgtdmJpLmMgKi8KK2V4dGVybiBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGF1MDgyOF92YmlfcW9wczsKKwogI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLilcCiAJZG8geyBpZiAoYXUwODI4X2RlYnVnICYgbGV2ZWwpXAogCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiLzA6ICIgZm10LCAjIyBhcmcpO1wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1yaXNjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtcmlzYy5jCmluZGV4IGMyNGIxYzEuLjBmYTlmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1yaXNjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXJpc2MuYwpAQCAtNTgzLDcgKzU4Myw3IEBACiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwwLDApOwotCXZpZGVvYnVmX2RtYV91bm1hcChxLCBkbWEpOworCXZpZGVvYnVmX2RtYV91bm1hcChxLT5kZXYsIGRtYSk7CiAJdmlkZW9idWZfZG1hX2ZyZWUoZG1hKTsKIAlidGN4X3Jpc2NtZW1fZnJlZShidHYtPmMucGNpLCZidWYtPmJvdHRvbSk7CiAJYnRjeF9yaXNjbWVtX2ZyZWUoYnR2LT5jLnBjaSwmYnVmLT50b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCmluZGV4IGVmMWY4OTMuLjU4ZDE5M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV91c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKQEAgLTU4NCw3ICs1ODQsNiBAQAogewogCXN0cnVjdCBjYW1fZGF0YSAqY2FtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgdXNiX2NwaWEgKnVjcGlhOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlpZiAoIWNhbSkKQEAgLTYwNiw4ICs2MDUsNiBAQAogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ1Y3BpYS0+d3Ffc3RyZWFtKSkKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1Y3BpYS0+d3Ffc3RyZWFtKTsKIAotCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCiAJdWNwaWEtPmN1cmJ1ZmYgPSB1Y3BpYS0+d29ya2J1ZmYgPSBOVUxMOwogCiAJdmZyZWUodWNwaWEtPmJ1ZmZlcnNbMl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKaW5kZXggMjBlYWYzOC4uZDY3OTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCkBAIC0xMDgxLDcgKzEwODEsNyBAQAogCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gdmlkZW9fZGV2ZGF0YShmaWxwKTsKLQlzdHJ1Y3QgY3gxOF9vcGVuX2lkICppZCA9IChzdHJ1Y3QgY3gxOF9vcGVuX2lkICopZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDE4X29wZW5faWQgKmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjeDE4ICpjeCA9IGlkLT5jeDsKIAlsb25nIHJlczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKaW5kZXggZDYzOTE4Ni4uMjAxNGRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCkBAIC00MDgsMTAgKzQwOCwxOCBAQAogCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3NSwKIAl9LCB7CiAJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDIyMWQsCisJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjc1LAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKIAkJLnN1YmRldmljZSA9IDB4MjI1MSwKIAkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNTUsCiAJfSwgewogCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgyMjU5LAorCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI1NSwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCiAJCS5zdWJkZXZpY2UgPSAweDIyOTEsCiAJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjEwLAogCX0sIHsKQEAgLTQxOSw2ICs0MjcsMzggQEAKIAkJLnN1YmRldmljZSA9IDB4MjI5NSwKIAkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyMTAsCiAJfSwgeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgyMjk5LAorCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDIyOWQsCisJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjEwLCAvKiBIVlIxMjE1ICovCisJfSwgeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgyMmYwLAorCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDIyZjEsCisJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjU1LAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4MjJmMiwKKwkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzUsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgyMmYzLAorCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMCwgLyogSFZSMTIxNSAqLworCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4MjJmNCwKKwkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyMTAsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgyMmY1LAorCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMCwgLyogSFZSMTIxNSAqLworCX0sIHsKIAkJLnN1YnZlbmRvciA9IDB4MTRmMSwKIAkJLnN1YmRldmljZSA9IDB4ODY1MSwKIAkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTA2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCmluZGV4IDBkZGU1N2UuLmZmNzZmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKQEAgLTExNDIsNyArMTE0Miw3IEBACiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwgMCwgMCk7Ci0JdmlkZW9idWZfZG1hX3VubWFwKHEsIGRtYSk7CisJdmlkZW9idWZfZG1hX3VubWFwKHEtPmRldiwgZG1hKTsKIAl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCWJ0Y3hfcmlzY21lbV9mcmVlKHRvX3BjaV9kZXYocS0+ZGV2KSwgJmJ1Zi0+cmlzYyk7CiAJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CkBAIC0xOTUzLDggKzE5NTMsMTIgQEAKIAkJZ290byBmYWlsX2lycTsKIAl9CiAKLQllcnIgPSByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIGN4MjM4ODVfaXJxLAotCQkJICBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoIXBjaV9lbmFibGVfbXNpKHBjaV9kZXYpKQorCQllcnIgPSByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIGN4MjM4ODVfaXJxLAorCQkJCSAgSVJRRl9ESVNBQkxFRCwgZGV2LT5uYW1lLCBkZXYpOworCWVsc2UKKwkJZXJyID0gcmVxdWVzdF9pcnEocGNpX2Rldi0+aXJxLCBjeDIzODg1X2lycSwKKwkJCQkgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBJUlEgJWRcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIHBjaV9kZXYtPmlycSk7CkBAIC0yMDAwLDYgKzIwMDQsNyBAQAogCiAJLyogdW5yZWdpc3RlciBzdHVmZiAqLwogCWZyZWVfaXJxKHBjaV9kZXYtPmlycSwgZGV2KTsKKwlwY2lfZGlzYWJsZV9tc2kocGNpX2Rldik7CiAKIAljeDIzODg1X2Rldl91bnJlZ2lzdGVyKGRldik7CiAJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcih2NGwyX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCmluZGV4IDBhMTk5ZDcuLjNkNzBhZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCkBAIC05OTEsNyArOTkxLDcgQEAKIAlyZXQgPSB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXJfYnVzKCZwb3J0LT5mcm9udGVuZHMsIFRISVNfTU9EVUxFLCBwb3J0LAogCQkJCQkmZGV2LT5wY2ktPmRldiwgYWRhcHRlcl9uciwgMCwKIAkJCQkJY3gyMzg4NV9kdmJfZmVfaW9jdGxfb3ZlcnJpZGUpOwotCWlmICghcmV0KQorCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBpbml0IENJICYgTUFDICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaW5wdXQuYwppbmRleCA1ZGU2YmE5Li5kMGIxNjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMKQEAgLTM3LDE2MSArMzcsNTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL2lyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL2lyLWNvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogCiAjaW5jbHVkZSAiY3gyMzg4NS5oIgogCi0jZGVmaW5lIFJDNV9CSVRTCQkxNAotI2RlZmluZSBSQzVfSEFMRl9CSVRTCQkoMipSQzVfQklUUykKLSNkZWZpbmUgUkM1X0hBTEZfQklUU19NQVNLCSgoMSA8PCBSQzVfSEFMRl9CSVRTKSAtIDEpCi0KLSNkZWZpbmUgUkM1X1NUQVJUX0JJVFNfTk9STUFMCTB4MyAvKiBDb21tYW5kIHJhbmdlICAwIC0gIDYzICovCi0jZGVmaW5lIFJDNV9TVEFSVF9CSVRTX0VYVEVOREVECTB4MiAvKiBDb21tYW5kIHJhbmdlIDY0IC0gMTI3ICovCi0KLSNkZWZpbmUgUkM1X0VYVEVOREVEX0NPTU1BTkRfT0ZGU0VUCTY0Ci0KICNkZWZpbmUgTU9EVUxFX05BTUUgImN4MjM4ODUiCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJjNV9jb21tYW5kKHUzMiByYzVfYmFzZWJhbmQpCitzdGF0aWMgdm9pZCBjb252ZXJ0X21lYXN1cmVtZW50KHUzMiB4LCBzdHJ1Y3QgaXJfcmF3X2V2ZW50ICp5KQogewotCXJldHVybiBSQzVfSU5TVFIocmM1X2Jhc2ViYW5kKSArCi0JCSgoUkM1X1NUQVJUKHJjNV9iYXNlYmFuZCkgPT0gUkM1X1NUQVJUX0JJVFNfRVhURU5ERUQpCi0JCQk/IFJDNV9FWFRFTkRFRF9DT01NQU5EX09GRlNFVCA6IDApOworCWlmICh4ID09IFY0TDJfU1VCREVWX0lSX1BVTFNFX1JYX1NFUV9FTkQpIHsKKwkJeS0+cHVsc2UgPSBmYWxzZTsKKwkJeS0+ZHVyYXRpb24gPSBWNEwyX1NVQkRFVl9JUl9QVUxTRV9NQVhfV0lEVEhfTlM7CisJCXJldHVybjsKKwl9CisKKwl5LT5wdWxzZSA9ICh4ICYgVjRMMl9TVUJERVZfSVJfUFVMU0VfTEVWRUxfTUFTSykgPyB0cnVlIDogZmFsc2U7CisJeS0+ZHVyYXRpb24gPSB4ICYgVjRMMl9TVUJERVZfSVJfUFVMU0VfTUFYX1dJRFRIX05TOwogfQogCi1zdGF0aWMgdm9pZCBjeDIzODg1X2lucHV0X3Byb2Nlc3NfcmF3X3JjNShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfcHJvY2Vzc19tZWFzdXJlbWVudHMoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJCQkJCSAgICAgICBib29sIG92ZXJydW4pCiB7Ci0Jc3RydWN0IGNhcmRfaXIgKmlyX2lucHV0ID0gZGV2LT5pcl9pbnB1dDsKLQl1bnNpZ25lZCBpbnQgY29kZSwgY29tbWFuZDsKLQl1MzIgcmM1OworCXN0cnVjdCBjeDIzODg1X2tlcm5lbF9pciAqa2VybmVsX2lyID0gZGV2LT5rZXJuZWxfaXI7CisJc3RydWN0IGlyX3Jhd19ldmVudCBrZXJuZWxfaXJfZXZlbnQ7CiAKLQkvKiBJZ25vcmUgY29kZXMgdGhhdCBhcmUgdG9vIHNob3J0IHRvIGJlIHZhbGlkIFJDLTUgKi8KLQlpZiAoaXJfaW5wdXQtPmxhc3RfYml0IDwgKFJDNV9IQUxGX0JJVFMgLSAxKSkKLQkJcmV0dXJuOwotCi0JLyogVGhlIGxpYnJhcnkgaGFzIHRoZSBtYW5jaGVzdGVyIGNvZGluZyBiYWNrd2FyZHM7IFhPUiB0byBhZGFwdC4gKi8KLQljb2RlID0gKGlyX2lucHV0LT5jb2RlICYgUkM1X0hBTEZfQklUU19NQVNLKSBeIFJDNV9IQUxGX0JJVFNfTUFTSzsKLQlyYzUgPSBpcl9yYzVfZGVjb2RlKGNvZGUpOwotCi0Jc3dpdGNoIChSQzVfU1RBUlQocmM1KSkgewotCWNhc2UgUkM1X1NUQVJUX0JJVFNfTk9STUFMOgotCQlicmVhazsKLQljYXNlIFJDNV9TVEFSVF9CSVRTX0VYVEVOREVEOgotCQkvKiBEb24ndCBhbGxvdyBpZiB0aGUgcmVtb3RlIG9ubHkgZW1pdHMgc3RhbmRhcmQgY29tbWFuZHMgKi8KLQkJaWYgKGlyX2lucHV0LT5zdGFydCA9PSBSQzVfU1RBUlRfQklUU19OT1JNQUwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXJfaW5wdXQtPmFkZHIgIT0gUkM1X0FERFIocmM1KSkKLQkJcmV0dXJuOwotCi0JLyogRG9uJ3QgZ2VuZXJhdGUgYSBrZXlwcmVzcyBmb3IgUkMtNSBhdXRvLXJlcGVhdGVkIGtleXByZXNzZXMgKi8KLQljb21tYW5kID0gcmM1X2NvbW1hbmQocmM1KTsKLQlpZiAoUkM1X1RPR0dMRShyYzUpICE9IFJDNV9UT0dHTEUoaXJfaW5wdXQtPmxhc3RfcmM1KSB8fAotCSAgICBjb21tYW5kICE9IHJjNV9jb21tYW5kKGlyX2lucHV0LT5sYXN0X3JjNSkgfHwKLQkgICAgLyogQ2F0Y2ggVCA9PSAwLCBDTUQgPT0gMCAoZS5nLiAnMCcpIGFzIGZpcnN0IGtleXByZXNzIGFmdGVyIGluaXQgKi8KLQkgICAgUkM1X1NUQVJUKGlyX2lucHV0LT5sYXN0X3JjNSkgPT0gMCkgewotCQkvKiBUaGlzIGtleXByZXNzIGlzIGRpZmZlcm5ldDogbm90IGFuIGF1dG8gcmVwZWF0ICovCi0JCWlyX2lucHV0X25va2V5KGlyX2lucHV0LT5kZXYsICZpcl9pbnB1dC0+aXIpOwotCQlpcl9pbnB1dF9rZXlkb3duKGlyX2lucHV0LT5kZXYsICZpcl9pbnB1dC0+aXIsIGNvbW1hbmQpOwotCX0KLQlpcl9pbnB1dC0+bGFzdF9yYzUgPSByYzU7Ci0KLQkvKiBTY2hlZHVsZSB3aGVuIHdlIHNob3VsZCBkbyB0aGUga2V5IHVwIGV2ZW50OiBpcl9pbnB1dF9ub2tleSgpICovCi0JbW9kX3RpbWVyKCZpcl9pbnB1dC0+dGltZXJfa2V5dXAsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaXJfaW5wdXQtPnJjNV9rZXlfdGltZW91dCkpOwotfQotCi1zdGF0aWMgdm9pZCBjeDIzODg1X2lucHV0X25leHRfcHVsc2Vfd2lkdGhfcmM1KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAotCQkJCQkgICAgICAgdTMyIG5zX3B1bHNlKQotewotCWNvbnN0IGludCByYzVfcXVhcnRlcmJpdF9ucyA9IDQ0NDQ0NDsgLyogMzIgY3ljbGVzLzM2IGtIei8yID0gNDQ0IHVzICovCi0Jc3RydWN0IGNhcmRfaXIgKmlyX2lucHV0ID0gZGV2LT5pcl9pbnB1dDsKLQlpbnQgaSwgbGV2ZWwsIHF1YXJ0ZXJiaXRzLCBoYWxmYml0czsKLQotCWlmICghaXJfaW5wdXQtPmFjdGl2ZSkgewotCQlpcl9pbnB1dC0+YWN0aXZlID0gMTsKLQkJLyogYXNzdW1lIGFuIGluaXRpYWwgc3BhY2UgdGhhdCB3ZSBtYXkgbm90IGRldGVjdCBvciBtZWFzdXJlICovCi0JCWlyX2lucHV0LT5jb2RlID0gMDsKLQkJaXJfaW5wdXQtPmxhc3RfYml0ID0gMDsKLQl9Ci0KLQlpZiAobnNfcHVsc2UgPT0gVjRMMl9TVUJERVZfSVJfUFVMU0VfUlhfU0VRX0VORCkgewotCQlpcl9pbnB1dC0+bGFzdF9iaXQrKzsgLyogQWNjb3VudCBmb3IgdGhlIGZpbmFsIHNwYWNlICovCi0JCWlyX2lucHV0LT5hY3RpdmUgPSAwOwotCQljeDIzODg1X2lucHV0X3Byb2Nlc3NfcmF3X3JjNShkZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JbGV2ZWwgPSAobnNfcHVsc2UgJiBWNEwyX1NVQkRFVl9JUl9QVUxTRV9MRVZFTF9NQVNLKSA/IDEgOiAwOwotCi0JLyogU2tpcCBhbnkgbGVhZGluZyBzcGFjZSB0byBzeW5jIHRvIHRoZSBzdGFydCBiaXQgKi8KLQlpZiAoaXJfaW5wdXQtPmxhc3RfYml0ID09IDAgJiYgbGV2ZWwgPT0gMCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBXaXRoIHZhbGlkIFJDLTUgd2UgY2FuIGdldCB1cCB0byB0d28gY29uc2VjdXRpdmUgaGFsZi1iaXRzIGluIGEKLQkgKiBzaW5nbGUgcHVsc2UgbWVhc3VybWVudC4gIEV4cGVyaW1lbnRzIGhhdmUgc2hvd24gdGhhdCB0aGUgZHVyYXRpb24KLQkgKiBvZiBhIGhhbGYtYml0IGNhbiB2YXJ5LiAgTWFrZSBzdXJlIHdlIGFsd2F5cyBlbmQgdXAgd2l0aCBhbiBldmVuCi0JICogbnVtYmVyIG9mIHF1YXJ0ZXIgYml0cyBhdCB0aGUgc2FtZSBsZXZlbCAobWFyayBvciBzcGFjZSkuCi0JICovCi0JbnNfcHVsc2UgJj0gVjRMMl9TVUJERVZfSVJfUFVMU0VfTUFYX1dJRFRIX05TOwotCXF1YXJ0ZXJiaXRzID0gbnNfcHVsc2UgLyByYzVfcXVhcnRlcmJpdF9uczsKLQlpZiAocXVhcnRlcmJpdHMgJiAxKQotCQlxdWFydGVyYml0cysrOwotCWhhbGZiaXRzID0gcXVhcnRlcmJpdHMgLyAyOwotCi0JZm9yIChpID0gMDsgaSA8IGhhbGZiaXRzOyBpKyspIHsKLQkJaXJfaW5wdXQtPmxhc3RfYml0Kys7Ci0JCWlyX2lucHV0LT5jb2RlIHw9IChsZXZlbCA8PCBpcl9pbnB1dC0+bGFzdF9iaXQpOwotCi0JCWlmIChpcl9pbnB1dC0+bGFzdF9iaXQgPj0gUkM1X0hBTEZfQklUUy0xKSB7Ci0JCQlpcl9pbnB1dC0+YWN0aXZlID0gMDsKLQkJCWN4MjM4ODVfaW5wdXRfcHJvY2Vzc19yYXdfcmM1KGRldik7Ci0JCQkvKgotCQkJICogSWYgbGV2ZWwgaXMgMSwgYSBsZWFkaW5nIG1hcmsgaXMgaW52YWxpZCBmb3IgUkM1LgotCQkJICogSWYgbGV2ZWwgaXMgMCwgd2Ugc2NhbiBwYXN0IGV4dHJhIGludGlhbCBzcGFjZS4KLQkJCSAqIEVpdGhlciB3YXkgd2UgZG9uJ3Qgd2FudCB0byByZWFjdGl2YXRlIGNvbGxlY3RpbmcKLQkJCSAqIG1hcmtzIG9yIHNwYWNlcyBoZXJlIHdpdGggYW55IGxlZnQgb3ZlciBoYWxmLWJpdHMuCi0JCQkgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjeDIzODg1X2lucHV0X3Byb2Nlc3NfcHVsc2Vfd2lkdGhzX3JjNShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKLQkJCQkJCSAgIGJvb2wgYWRkX2VvbSkKLXsKLQlzdHJ1Y3QgY2FyZF9pciAqaXJfaW5wdXQgPSBkZXYtPmlyX2lucHV0OwotCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXJfaW5wdXRfc3RhdGUgPSAmaXJfaW5wdXQtPmlyOwotCi0JdTMyIG5zX3B1bHNlW1JDNV9IQUxGX0JJVFMrMV07Ci0Jc3NpemVfdCBudW0gPSAwOworCXUzMiBzZF9pcl9kYXRhWzY0XTsKKwlzc2l6ZV90IG51bTsKIAlpbnQgY291bnQsIGk7CisJYm9vbCBoYW5kbGUgPSBmYWxzZTsKIAogCWRvIHsKLQkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfcmVhZCwgKHU4ICopIG5zX3B1bHNlLAotCQkJCSBzaXplb2YobnNfcHVsc2UpLCAmbnVtKTsKKwkJbnVtID0gMDsKKwkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfcmVhZCwgKHU4ICopIHNkX2lyX2RhdGEsCisJCQkJIHNpemVvZihzZF9pcl9kYXRhKSwgJm51bSk7CiAKIAkJY291bnQgPSBudW0gLyBzaXplb2YodTMyKTsKIAotCQkvKiBBcHBlbmQgYW4gZW5kIG9mIFJ4IHNlcSwgaWYgdGhlIGNhbGxlciByZXF1ZXN0ZWQgKi8KLQkJaWYgKGFkZF9lb20gJiYgY291bnQgPCBBUlJBWV9TSVpFKG5zX3B1bHNlKSkgewotCQkJbnNfcHVsc2VbY291bnRdID0gVjRMMl9TVUJERVZfSVJfUFVMU0VfUlhfU0VRX0VORDsKLQkJCWNvdW50Kys7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQljb252ZXJ0X21lYXN1cmVtZW50KHNkX2lyX2RhdGFbaV0sICZrZXJuZWxfaXJfZXZlbnQpOworCQkJaXJfcmF3X2V2ZW50X3N0b3JlKGtlcm5lbF9pci0+aW5wX2RldiwKKwkJCQkJICAgJmtlcm5lbF9pcl9ldmVudCk7CisJCQloYW5kbGUgPSB0cnVlOwogCQl9Ci0KLQkJLyogSnVzdCBkcmFpbiB0aGUgUnggRklGTywgaWYgd2UncmUgY2FsbGVkLCBidXQgbm90IFJDLTUgKi8KLQkJaWYgKGlyX2lucHV0X3N0YXRlLT5pcl90eXBlICE9IElSX1RZUEVfUkM1KQotCQkJY29udGludWU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQljeDIzODg1X2lucHV0X25leHRfcHVsc2Vfd2lkdGhfcmM1KGRldiwgbnNfcHVsc2VbaV0pOwogCX0gd2hpbGUgKG51bSAhPSAwKTsKKworCWlmIChvdmVycnVuKQorCQlpcl9yYXdfZXZlbnRfcmVzZXQoa2VybmVsX2lyLT5pbnBfZGV2KTsKKwllbHNlIGlmIChoYW5kbGUpCisJCWlyX3Jhd19ldmVudF9oYW5kbGUoa2VybmVsX2lyLT5pbnBfZGV2KTsKIH0KIAogdm9pZCBjeDIzODg1X2lucHV0X3J4X3dvcmtfaGFuZGxlcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIGV2ZW50cykKQEAgLTIzMCw3ICsxMjQsNyBAQAogCX0KIAogCWlmIChkYXRhX2F2YWlsYWJsZSkKLQkJY3gyMzg4NV9pbnB1dF9wcm9jZXNzX3B1bHNlX3dpZHRoc19yYzUoZGV2LCBvdmVycnVuKTsKKwkJY3gyMzg4NV9pbnB1dF9wcm9jZXNzX21lYXN1cmVtZW50cyhkZXYsIG92ZXJydW4pOwogCiAJaWYgKG92ZXJydW4pIHsKIAkJLyogSWYgdGhlcmUgd2FzIGEgRklGTyBvdmVycnVuLCBjbGVhciAmIHJlc3RhcnQgdGhlIGRldmljZSAqLwpAQCAtMjQxLDM0ICsxMzUsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfaXJfc3RhcnQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCitzdGF0aWMgaW50IGN4MjM4ODVfaW5wdXRfaXJfc3RhcnQoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGNhcmRfaXIgKmlyX2lucHV0ID0gZGV2LT5pcl9pbnB1dDsKLQlzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgKmlyX2lucHV0X3N0YXRlID0gJmlyX2lucHV0LT5pcjsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXZfaXJfcGFyYW1ldGVycyBwYXJhbXM7CiAKIAlpZiAoZGV2LT5zZF9pciA9PSBOVUxMKQotCQlyZXR1cm47CisJCXJldHVybiAtRU5PREVWOwogCiAJYXRvbWljX3NldCgmZGV2LT5pcl9pbnB1dF9zdG9wcGluZywgMCk7CiAKLQkvKiBrZXl1cCB0aW1lciBzZXQgdXAsIGlmIG5lZWRlZCAqLwotCXN3aXRjaCAoZGV2LT5ib2FyZCkgewotCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKLQljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6Ci0JCXNldHVwX3RpbWVyKCZpcl9pbnB1dC0+dGltZXJfa2V5dXAsCi0JCQkgICAgaXJfcmM1X3RpbWVyX2tleXVwLAkvKiBOb3QgYWN0dWFsbHkgUkMtNSBzcGVjaWZpYyAqLwotCQkJICAgICh1bnNpZ25lZCBsb25nKSBpcl9pbnB1dCk7Ci0JCWlmIChpcl9pbnB1dF9zdGF0ZS0+aXJfdHlwZSA9PSBJUl9UWVBFX1JDNSkgewotCQkJLyoKLQkJCSAqIFJDLTUgcmVwZWF0cyBhIGhlbGQga2V5IGV2ZXJ5Ci0JCQkgKiA2NCBiaXRzICogKDIgKiAzMi8zNjAwMCkgc2VjL2JpdCA9IDExMy43NzggbXMKLQkJCSAqLwotCQkJaXJfaW5wdXQtPnJjNV9rZXlfdGltZW91dCA9IDExNTsKLQkJfQotCQlicmVhazsKLQl9Ci0KIAl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9nX3BhcmFtZXRlcnMsICZwYXJhbXMpOwogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKQEAgLTI5OSwxMSArMTc0LDIxIEBACiAJCWJyZWFrOwogCX0KIAl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9zX3BhcmFtZXRlcnMsICZwYXJhbXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjM4ODVfaW5wdXRfaXJfb3Blbih2b2lkICpwcml2KQoreworCXN0cnVjdCBjeDIzODg1X2tlcm5lbF9pciAqa2VybmVsX2lyID0gcHJpdjsKKworCWlmIChrZXJuZWxfaXItPmN4ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGN4MjM4ODVfaW5wdXRfaXJfc3RhcnQoa2VybmVsX2lyLT5jeCk7CiB9CiAKIHN0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfaXJfc3RvcChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgY2FyZF9pciAqaXJfaW5wdXQgPSBkZXYtPmlyX2lucHV0OwogCXN0cnVjdCB2NGwyX3N1YmRldl9pcl9wYXJhbWV0ZXJzIHBhcmFtczsKIAogCWlmIChkZXYtPnNkX2lyID09IE5VTEwpCkBAIC0zMjcsMjEgKzIxMiwyNiBAQAogCX0KIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Cit9CiAKLQlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKLQljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6Ci0JY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgotCQlkZWxfdGltZXJfc3luYygmaXJfaW5wdXQtPnRpbWVyX2tleXVwKTsKLQkJYnJlYWs7Ci0JfQorc3RhdGljIHZvaWQgY3gyMzg4NV9pbnB1dF9pcl9jbG9zZSh2b2lkICpwcml2KQoreworCXN0cnVjdCBjeDIzODg1X2tlcm5lbF9pciAqa2VybmVsX2lyID0gcHJpdjsKKworCWlmIChrZXJuZWxfaXItPmN4ICE9IE5VTEwpCisJCWN4MjM4ODVfaW5wdXRfaXJfc3RvcChrZXJuZWxfaXItPmN4KTsKIH0KIAogaW50IGN4MjM4ODVfaW5wdXRfaW5pdChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgY2FyZF9pciAqaXI7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwotCWNoYXIgKmlyX2NvZGVzID0gTlVMTDsKLQlpbnQgaXJfdHlwZSwgaXJfYWRkciwgaXJfc3RhcnQ7CisJc3RydWN0IGN4MjM4ODVfa2VybmVsX2lyICprZXJuZWxfaXI7CisJc3RydWN0IGlucHV0X2RldiAqaW5wX2RldjsKKwlzdHJ1Y3QgaXJfZGV2X3Byb3BzICpwcm9wczsKKworCWNoYXIgKnJjX21hcDsKKwllbnVtIHJjX2RyaXZlcl90eXBlIGRyaXZlcl90eXBlOworCXVuc2lnbmVkIGxvbmcgYWxsb3dlZF9wcm90b3M7CisKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTM1NCw1MyArMjQ0LDU5IEBACiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKLQkJLyogUGFyYW1ldGVycyBmb3IgdGhlIGdyZXkgSGF1cHBhdWdlIHJlbW90ZSBmb3IgdGhlIEhWUi0xODUwICovCi0JCWlyX2NvZGVzID0gUkNfTUFQX0hBVVBQQVVHRV9ORVc7Ci0JCWlyX3R5cGUgPSBJUl9UWVBFX1JDNTsKLQkJaXJfYWRkciA9IDB4MWU7IC8qIFJDLTUgc3lzdGVtIGJpdHMgZW1pdHRlZCBieSB0aGUgcmVtb3RlICovCi0JCWlyX3N0YXJ0ID0gUkM1X1NUQVJUX0JJVFNfTk9STUFMOyAvKiBBIGJhc2ljIFJDLTUgcmVtb3RlICovCisJCS8qIEludGVncmF0ZWQgQ1gyMzg4OCBJUiBjb250cm9sbGVyICovCisJCWRyaXZlcl90eXBlID0gUkNfRFJJVkVSX0lSX1JBVzsKKwkJYWxsb3dlZF9wcm90b3MgPSBJUl9UWVBFX0FMTDsKKwkJLyogVGhlIGdyZXkgSGF1cHBhdWdlIFJDLTUgcmVtb3RlICovCisJCXJjX21hcCA9IFJDX01BUF9SQzVfSEFVUFBBVUdFX05FVzsKIAkJYnJlYWs7Ci0JfQotCWlmIChpcl9jb2RlcyA9PSBOVUxMKQorCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOworCX0KIAotCWlyID0ga3phbGxvYyhzaXplb2YoKmlyKSwgR0ZQX0tFUk5FTCk7Ci0JaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFpciB8fCAhaW5wdXRfZGV2KSB7CisJLyogY3gyMzg4NSBib2FyZCBpbnN0YW5jZSBrZXJuZWwgSVIgc3RhdGUgKi8KKwlrZXJuZWxfaXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3gyMzg4NV9rZXJuZWxfaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2VybmVsX2lyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJa2VybmVsX2lyLT5jeCA9IGRldjsKKwlrZXJuZWxfaXItPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImN4MjM4ODUgSVIgKCVzKSIsCisJCQkJICAgIGN4MjM4ODVfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUpOworCWtlcm5lbF9pci0+cGh5cyA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAicGNpLSVzL2lyMCIsCisJCQkJICAgIHBjaV9uYW1lKGRldi0+cGNpKSk7CisKKwkvKiBpbnB1dCBkZXZpY2UgKi8KKwlpbnBfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGlucF9kZXYgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXRfZnJlZTsKIAl9CiAKLQlpci0+ZGV2ID0gaW5wdXRfZGV2OwotCWlyLT5hZGRyID0gaXJfYWRkcjsKLQlpci0+c3RhcnQgPSBpcl9zdGFydDsKLQotCS8qIGluaXQgaW5wdXQgZGV2aWNlICovCi0Jc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJjeDIzODg1IElSICglcykiLAotCQkgY3gyMzg4NV9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7Ci0Jc25wcmludGYoaXItPnBoeXMsIHNpemVvZihpci0+cGh5cyksICJwY2ktJXMvaXIwIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQotCXJldCA9IGlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQlpbnB1dF9kZXYtPm5hbWUgPSBpci0+bmFtZTsKLQlpbnB1dF9kZXYtPnBoeXMgPSBpci0+cGh5czsKLQlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOwotCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDE7CisJa2VybmVsX2lyLT5pbnBfZGV2ID0gaW5wX2RldjsKKwlpbnBfZGV2LT5uYW1lID0ga2VybmVsX2lyLT5uYW1lOworCWlucF9kZXYtPnBoeXMgPSBrZXJuZWxfaXItPnBoeXM7CisJaW5wX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CisJaW5wX2Rldi0+aWQudmVyc2lvbiA9IDE7CiAJaWYgKGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yKSB7Ci0JCWlucHV0X2Rldi0+aWQudmVuZG9yICA9IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOwotCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZTsKKwkJaW5wX2Rldi0+aWQudmVuZG9yICA9IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpbnBfZGV2LT5pZC5wcm9kdWN0ID0gZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2U7CiAJfSBlbHNlIHsKLQkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gZGV2LT5wY2ktPnZlbmRvcjsKLQkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gZGV2LT5wY2ktPmRldmljZTsKKwkJaW5wX2Rldi0+aWQudmVuZG9yICA9IGRldi0+cGNpLT52ZW5kb3I7CisJCWlucF9kZXYtPmlkLnByb2R1Y3QgPSBkZXYtPnBjaS0+ZGV2aWNlOwogCX0KLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmZGV2LT5wY2ktPmRldjsKKwlpbnBfZGV2LT5kZXYucGFyZW50ID0gJmRldi0+cGNpLT5kZXY7CiAKLQlkZXYtPmlyX2lucHV0ID0gaXI7Ci0JY3gyMzg4NV9pbnB1dF9pcl9zdGFydChkZXYpOworCS8qIGtlcm5lbCBpciBkZXZpY2UgcHJvcGVydGllcyAqLworCXByb3BzID0gJmtlcm5lbF9pci0+cHJvcHM7CisJcHJvcHMtPmRyaXZlcl90eXBlID0gZHJpdmVyX3R5cGU7CisJcHJvcHMtPmFsbG93ZWRfcHJvdG9zID0gYWxsb3dlZF9wcm90b3M7CisJcHJvcHMtPnByaXYgPSBrZXJuZWxfaXI7CisJcHJvcHMtPm9wZW4gPSBjeDIzODg1X2lucHV0X2lyX29wZW47CisJcHJvcHMtPmNsb3NlID0gY3gyMzg4NV9pbnB1dF9pcl9jbG9zZTsKIAotCXJldCA9IGlyX2lucHV0X3JlZ2lzdGVyKGlyLT5kZXYsIGlyX2NvZGVzLCBOVUxMLCBNT0RVTEVfTkFNRSk7CisJLyogR28gKi8KKwlkZXYtPmtlcm5lbF9pciA9IGtlcm5lbF9pcjsKKwlyZXQgPSBpcl9pbnB1dF9yZWdpc3RlcihpbnBfZGV2LCByY19tYXAsIHByb3BzLCBNT0RVTEVfTkFNRSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfb3V0X3N0b3A7CiAKQEAgLTQwOCw5ICszMDQsMTIgQEAKIAogZXJyX291dF9zdG9wOgogCWN4MjM4ODVfaW5wdXRfaXJfc3RvcChkZXYpOwotCWRldi0+aXJfaW5wdXQgPSBOVUxMOworCWRldi0+a2VybmVsX2lyID0gTlVMTDsKKwkvKiBUT0RPOiBkb3VibGUgY2hlY2sgY2xlYW4tdXAgb2Yga2VybmVsX2lyLT5pbnBfZGV2ICovCiBlcnJfb3V0X2ZyZWU6Ci0Ja2ZyZWUoaXIpOworCWtmcmVlKGtlcm5lbF9pci0+cGh5cyk7CisJa2ZyZWUoa2VybmVsX2lyLT5uYW1lKTsKKwlrZnJlZShrZXJuZWxfaXIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQxOSw5ICszMTgsMTEgQEAKIAkvKiBBbHdheXMgc3RvcCB0aGUgSVIgaGFyZHdhcmUgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KIAljeDIzODg1X2lucHV0X2lyX3N0b3AoZGV2KTsKIAotCWlmIChkZXYtPmlyX2lucHV0ID09IE5VTEwpCisJaWYgKGRldi0+a2VybmVsX2lyID09IE5VTEwpCiAJCXJldHVybjsKLQlpcl9pbnB1dF91bnJlZ2lzdGVyKGRldi0+aXJfaW5wdXQtPmRldik7Ci0Ja2ZyZWUoZGV2LT5pcl9pbnB1dCk7Ci0JZGV2LT5pcl9pbnB1dCA9IE5VTEw7CisJaXJfaW5wdXRfdW5yZWdpc3RlcihkZXYtPmtlcm5lbF9pci0+aW5wX2Rldik7CisJa2ZyZWUoZGV2LT5rZXJuZWxfaXItPnBoeXMpOworCWtmcmVlKGRldi0+a2VybmVsX2lyLT5uYW1lKTsKKwlrZnJlZShkZXYtPmtlcm5lbF9pcik7CisJZGV2LT5rZXJuZWxfaXIgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlyLmMKaW5kZXggOWE2NzdlYi4uNmNlYWJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pci5jCkBAIC01Myw3ICs1Myw3IEBACiAJaWYgKGV2ZW50cyA9PSAwKQogCQlyZXR1cm47CiAKLQlpZiAoZGV2LT5pcl9pbnB1dCkKKwlpZiAoZGV2LT5rZXJuZWxfaXIpCiAJCWN4MjM4ODVfaW5wdXRfcnhfd29ya19oYW5kbGVyKGRldiwgZXZlbnRzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKaW5kZXggOGQ2YTU1ZS4uYTMzZjJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtc2cuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kdmIuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb3JlLmg+CiAKICNpbmNsdWRlICJidGN4LXJpc2MuaCIKICNpbmNsdWRlICJjeDIzODg1LXJlZy5oIgpAQCAtMzA0LDYgKzMwNSwxNSBAQAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwb3J0X3ByaXY7CiB9OwogCitzdHJ1Y3QgY3gyMzg4NV9rZXJuZWxfaXIgeworCXN0cnVjdCBjeDIzODg1X2RldgkqY3g7CisJY2hhcgkJCSpuYW1lOworCWNoYXIJCQkqcGh5czsKKworCXN0cnVjdCBpbnB1dF9kZXYJKmlucF9kZXY7CisJc3RydWN0IGlyX2Rldl9wcm9wcwlwcm9wczsKK307CisKIHN0cnVjdCBjeDIzODg1X2RldiB7CiAJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgcmVmY291bnQ7CiAJc3RydWN0IHY0bDJfZGV2aWNlIAkgICB2NGwyX2RldjsKQEAgLTM2Myw3ICszNzMsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdAkgICBpcl90eF93b3JrOwogCXVuc2lnbmVkIGxvbmcJCSAgIGlyX3R4X25vdGlmaWNhdGlvbnM7CiAKLQlzdHJ1Y3QgY2FyZF9pcgkJICAgKmlyX2lucHV0OworCXN0cnVjdCBjeDIzODg1X2tlcm5lbF9pciAgICprZXJuZWxfaXI7CiAJYXRvbWljX3QJCSAgIGlyX2lucHV0X3N0b3BwaW5nOwogCiAJLyogVjRsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKaW5kZXggMzMwODJjOS4uNGYzODNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYwpAQCAtNTQsNiArNTQsMTIgQEAKIAlEYXRhIHR5cGUgZGVjbGFyYXRpb25zIC0gQ2FuIGJlIG1vZGVkIHRvIGEgaGVhZGVyIGZpbGUgbGF0ZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdHJ1Y3QgY3g4OF9hdWRpb19idWZmZXIgeworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGJwbDsKKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtICAgICAgICByaXNjOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgICAgIGRtYTsKK307CisKIHN0cnVjdCBjeDg4X2F1ZGlvX2RldiB7CiAJc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7CiAJc3RydWN0IGN4ODhfZG1hcXVldWUgICAgICAgcTsKQEAgLTc1LDcgKzgxLDcgQEAKIAogCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgICAgICpkbWFfcmlzYzsKIAotCXN0cnVjdCBjeDg4X2J1ZmZlcgkgICAqYnVmOworCXN0cnVjdCBjeDg4X2F1ZGlvX2J1ZmZlciAgICpidWY7CiAKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gICAqc3Vic3RyZWFtOwogfTsKQEAgLTEyMyw3ICsxMjksNyBAQAogCiBzdGF0aWMgaW50IF9jeDg4X3N0YXJ0X2F1ZGlvX2RtYShzbmRfY3g4OF9jYXJkX3QgKmNoaXApCiB7Ci0Jc3RydWN0IGN4ODhfYnVmZmVyICAgKmJ1ZiA9IGNoaXAtPmJ1ZjsKKwlzdHJ1Y3QgY3g4OF9hdWRpb19idWZmZXIgKmJ1ZiA9IGNoaXAtPmJ1ZjsKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlPWNoaXAtPmNvcmU7CiAJc3RydWN0IHNyYW1fY2hhbm5lbCAqYXVkaW9fY2ggPSAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyNV07CiAKQEAgLTI4Myw3ICsyODksNyBAQAogCUJVR19PTighY2hpcC0+ZG1hX3NpemUpOwogCiAJZHByaW50aygyLCJGcmVlaW5nIGJ1ZmZlclxuIik7Ci0JdmlkZW9idWZfc2dfZG1hX3VubWFwKCZjaGlwLT5wY2ktPmRldiwgY2hpcC0+ZG1hX3Jpc2MpOworCXZpZGVvYnVmX2RtYV91bm1hcCgmY2hpcC0+cGNpLT5kZXYsIGNoaXAtPmRtYV9yaXNjKTsKIAl2aWRlb2J1Zl9kbWFfZnJlZShjaGlwLT5kbWFfcmlzYyk7CiAJYnRjeF9yaXNjbWVtX2ZyZWUoY2hpcC0+cGNpLCZjaGlwLT5idWYtPnJpc2MpOwogCWtmcmVlKGNoaXAtPmJ1Zik7CkBAIC0zNzYsNyArMzgyLDcgQEAKIAlzbmRfY3g4OF9jYXJkX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hOwogCi0Jc3RydWN0IGN4ODhfYnVmZmVyICpidWY7CisJc3RydWN0IGN4ODhfYXVkaW9fYnVmZmVyICpidWY7CiAJaW50IHJldDsKIAogCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7CkBAIC0zOTEsMzAgKzM5NywyNSBAQAogCUJVR19PTighY2hpcC0+ZG1hX3NpemUpOwogCUJVR19PTihjaGlwLT5udW1fcGVyaW9kcyAmIChjaGlwLT5udW1fcGVyaW9kcy0xKSk7CiAKLQlidWYgPSB2aWRlb2J1Zl9zZ19hbGxvYyhzaXplb2YoKmJ1ZikpOworCWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKCpidWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYnVmLT52Yi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCWJ1Zi0+dmIuZmllbGQgID0gVjRMMl9GSUVMRF9OT05FOwotCWJ1Zi0+dmIud2lkdGggID0gY2hpcC0+cGVyaW9kX3NpemU7Ci0JYnVmLT5icGwgICAgICAgPSBjaGlwLT5wZXJpb2Rfc2l6ZTsKLQlidWYtPnZiLmhlaWdodCA9IGNoaXAtPm51bV9wZXJpb2RzOwotCWJ1Zi0+dmIuc2l6ZSAgID0gY2hpcC0+ZG1hX3NpemU7CisJYnVmLT5icGwgPSBjaGlwLT5wZXJpb2Rfc2l6ZTsKIAotCWRtYSA9IHZpZGVvYnVmX3RvX2RtYSgmYnVmLT52Yik7CisJZG1hID0gJmJ1Zi0+ZG1hOwogCXZpZGVvYnVmX2RtYV9pbml0KGRtYSk7CiAJcmV0ID0gdmlkZW9idWZfZG1hX2luaXRfa2VybmVsKGRtYSwgUENJX0RNQV9GUk9NREVWSUNFLAotCQkJKFBBR0VfQUxJR04oYnVmLT52Yi5zaXplKSA+PiBQQUdFX1NISUZUKSk7CisJCQkoUEFHRV9BTElHTihjaGlwLT5kbWFfc2l6ZSkgPj4gUEFHRV9TSElGVCkpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JcmV0ID0gdmlkZW9idWZfc2dfZG1hX21hcCgmY2hpcC0+cGNpLT5kZXYsIGRtYSk7CisJcmV0ID0gdmlkZW9idWZfZG1hX21hcCgmY2hpcC0+cGNpLT5kZXYsIGRtYSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAlyZXQgPSBjeDg4X3Jpc2NfZGF0YWJ1ZmZlcihjaGlwLT5wY2ksICZidWYtPnJpc2MsIGRtYS0+c2dsaXN0LAotCQkJCSAgIGJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCAxKTsKKwkJCQkgICBjaGlwLT5wZXJpb2Rfc2l6ZSwgY2hpcC0+bnVtX3BlcmlvZHMsIDEpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCkBAIC00MjIsMTIgKzQyMywxMCBAQAogCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVB8UklTQ19JUlExfFJJU0NfQ05UX0lOQyk7CiAJYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwogCi0JYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwotCiAJY2hpcC0+YnVmID0gYnVmOwogCWNoaXAtPmRtYV9yaXNjID0gZG1hOwogCi0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IGNoaXAtPmRtYV9yaXNjLT52bWFsbG9jOworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBjaGlwLT5kbWFfcmlzYy0+dmFkZHI7CiAJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSBjaGlwLT5kbWFfc2l6ZTsKIAlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKIAlyZXR1cm4gMDsKQEAgLTc0MCw3ICs3MzksNyBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAotCWNoaXAgPSAoc25kX2N4ODhfY2FyZF90ICopIGNhcmQtPnByaXZhdGVfZGF0YTsKKwljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJY29yZSA9IGN4ODhfY29yZV9nZXQocGNpKTsKIAlpZiAoTlVMTCA9PSBjb3JlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCAyOTE4YTZlLi5lODQxNmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTQ1LDYgKzQ1LDEwIEBACiBtb2R1bGVfcGFyYW0obGF0ZW5jeSxpbnQsMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxhdGVuY3ksInBjaSBsYXRlbmN5IHRpbWVyIik7CiAKK3N0YXRpYyBpbnQgZGlzYWJsZV9pcjsKK21vZHVsZV9wYXJhbShkaXNhYmxlX2lyLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhsYXRlbmN5LCAiRGlzYWJsZSBJUiBzdXBwb3J0Iik7CisKICNkZWZpbmUgaW5mb19wcmludGsoY29yZSwgZm10LCBhcmcuLi4pIFwKIAlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQsIGNvcmUtPm5hbWUgLCAjIyBhcmcpCiAKQEAgLTM0OTgsNyArMzUwMiwxMCBAQAogCX0KIAogCWN4ODhfY2FyZF9zZXR1cChjb3JlKTsKLQljeDg4X2lyX2luaXQoY29yZSwgcGNpKTsKKwlpZiAoIWRpc2FibGVfaXIpIHsKKwkJY3g4OF9pMmNfaW5pdF9pcihjb3JlKTsKKwkJY3g4OF9pcl9pbml0KGNvcmUsIHBjaSk7CisJfQogCiAJcmV0dXJuIGNvcmU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggOGIyMTQ1Ny4uODVlYjI2NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCiAJQlVHX09OKGluX2ludGVycnVwdCgpKTsKIAl2aWRlb2J1Zl93YWl0b24oJmJ1Zi0+dmIsMCwwKTsKLQl2aWRlb2J1Zl9kbWFfdW5tYXAocSwgZG1hKTsKKwl2aWRlb2J1Zl9kbWFfdW5tYXAocS0+ZGV2LCBkbWEpOwogCXZpZGVvYnVmX2RtYV9mcmVlKGRtYSk7CiAJYnRjeF9yaXNjbWVtX2ZyZWUodG9fcGNpX2RldihxLT5kZXYpLCAmYnVmLT5yaXNjKTsKIAlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKaW5kZXggZmIzOWYxMS4uMzc1YWQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTE4MSw2ICsxODEsMTEgQEAKIAl9IGVsc2UKIAkJcHJpbnRrKCIlczogaTJjIHJlZ2lzdGVyIEZBSUxFRFxuIiwgY29yZS0+bmFtZSk7CiAKKwlyZXR1cm4gY29yZS0+aTJjX3JjOworfQorCit2b2lkIGN4ODhfaTJjX2luaXRfaXIoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKK3sKIAkvKiBJbnN0YW50aWF0ZSB0aGUgSVIgcmVjZWl2ZXIgZGV2aWNlLCBpZiBwcmVzZW50ICovCiAJaWYgKDAgPT0gY29yZS0+aTJjX3JjKSB7CiAJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOwpAQCAtMjA3LDcgKzIxMiw2IEBACiAJCQl9CiAJCX0KIAl9Ci0JcmV0dXJuIGNvcmUtPmkyY19yYzsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IGUxODUyODkuLmVjY2M1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiY3g4OC5oIgorI2luY2x1ZGUgPG1lZGlhL2lyLWNvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KIAogI2RlZmluZSBNT0RVTEVfTkFNRSAiY3g4OHh4IgpAQCAtMzksOCArNDAsOCBAQAogc3RydWN0IGN4ODhfSVIgewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0Jc3RydWN0IGlyX2lucHV0X3N0YXRlIGlyOwogCXN0cnVjdCBpcl9kZXZfcHJvcHMgcHJvcHM7CisJdTY0IGlyX3R5cGU7CiAKIAlpbnQgdXNlcnM7CiAKQEAgLTUxLDcgKzUyLDYgQEAKIAl1MzIgc2FtcGxpbmc7CiAJdTMyIHNhbXBsZXNbMTZdOwogCWludCBzY291bnQ7Ci0JdW5zaWduZWQgbG9uZyByZWxlYXNlOwogCiAJLyogcG9sbCBleHRlcm5hbCBkZWNvZGVyICovCiAJaW50IHBvbGxpbmc7CkBAIC0xMjUsMjkgKzEyNSwyMSBAQAogCiAJCWRhdGEgPSAoZGF0YSA8PCA0KSB8ICgoZ3Bpb19rZXkgJiAweGYwKSA+PiA0KTsKIAotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSk7Ci0JCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dCwgJmlyLT5pcik7CisJCWlyX2tleWRvd24oaXItPmlucHV0LCBkYXRhLCAwKTsKIAogCX0gZWxzZSBpZiAoaXItPm1hc2tfa2V5ZG93bikgewogCQkvKiBiaXQgc2V0IG9uIGtleWRvd24gKi8KLQkJaWYgKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSB7Ci0JCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgZGF0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwotCQl9CisJCWlmIChncGlvICYgaXItPm1hc2tfa2V5ZG93bikKKwkJCWlyX2tleWRvd24oaXItPmlucHV0LCBkYXRhLCAwKTsKIAogCX0gZWxzZSBpZiAoaXItPm1hc2tfa2V5dXApIHsKIAkJLyogYml0IGNsZWFyZWQgb24ga2V5ZG93biAqLwotCQlpZiAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkgewotCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGRhdGEpOwotCQl9IGVsc2UgewotCQkJaXJfaW5wdXRfbm9rZXkoaXItPmlucHV0LCAmaXItPmlyKTsKLQkJfQorCQlpZiAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkKKwkJCWlyX2tleWRvd24oaXItPmlucHV0LCBkYXRhLCAwKTsKIAogCX0gZWxzZSB7CiAJCS8qIGNhbid0IGRpc3Rpbmd1aXNoIGtleWRvd24vdXAgOi0vICovCi0JCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBkYXRhKTsKLQkJaXJfaW5wdXRfbm9rZXkoaXItPmlucHV0LCAmaXItPmlyKTsKKwkJaXJfa2V5ZG93bihpci0+aW5wdXQsIGRhdGEsIDApOwogCX0KIH0KIApAQCAtNDM5LDkgKzQzMSw3IEBACiAJc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJjeDg4IElSICglcykiLCBjb3JlLT5ib2FyZC5uYW1lKTsKIAlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLCBwY2lfbmFtZShwY2kpKTsKIAotCWVyciA9IGlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJfb3V0X2ZyZWU7CisJaXItPmlyX3R5cGUgPSBpcl90eXBlOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gaXItPm5hbWU7CiAJaW5wdXRfZGV2LT5waHlzID0gaXItPnBoeXM7CkBAIC01MTYsOCArNTA2LDYgQEAKIAl9CiAJaWYgKCFpci0+c2NvdW50KSB7CiAJCS8qIG5vdGhpbmcgdG8gc2FtcGxlICovCi0JCWlmIChpci0+aXIua2V5cHJlc3NlZCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGlyLT5yZWxlYXNlKSkKLQkJCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dCwgJmlyLT5pcik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU1Myw3ICs1NDEsNyBAQAogCiAJCWlmIChpcmNvZGUgPT0gMCkgeyAvKiBrZXkgc3RpbGwgcHJlc3NlZCAqLwogCQkJaXJfZHByaW50aygicHVsc2UgZGlzdGFuY2UgZGVjb2RlZCByZXBlYXQgY29kZVxuIik7Ci0JCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CisJCQlpcl9yZXBlYXQoaXItPmlucHV0KTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTU2NywxMCArNTU1LDggQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaXJfZHByaW50aygiS2V5IENvZGU6ICV4XG4iLCAoaXJjb2RlID4+IDE2KSAmIDB4N2YpOwotCi0JCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCAoaXJjb2RlID4+IDE2KSAmIDB4N2YpOwotCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CisJCWlyX2RwcmludGsoIktleSBDb2RlOiAleFxuIiwgKGlyY29kZSA+PiAxNikgJiAweGZmKTsKKwkJaXJfa2V5ZG93bihpci0+aW5wdXQsIChpcmNvZGUgPj4gMTYpICYgMHhmZiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CkBAIC02MDYsMTYgKzU5MiwxNiBAQAogCQlpZiAoIGRldiAhPSAweDFlICYmIGRldiAhPSAweDFmICkKIAkJCS8qIG5vdCBhIGhhdXBwYXVnZSByZW1vdGUgKi8KIAkJCWJyZWFrOwotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwgY29kZSk7Ci0JCWlyLT5yZWxlYXNlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTIwKTsKKwkJaXJfa2V5ZG93bihpci0+aW5wdXQsIGNvZGUsIHRvZ2dsZSk7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0hEXzgwMGk6CiAJCWlyY29kZSA9IGlyX2RlY29kZV9iaXBoYXNlKGlyLT5zYW1wbGVzLCBpci0+c2NvdW50LCA1LCA3KTsKIAkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIiwgaXJjb2RlKTsKIAkJaWYgKChpcmNvZGUgJiAweGZmZmZmMDAwKSAhPSAweDMwMDApCiAJCQlicmVhazsKLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGlyY29kZSAmIDB4M2YpOwotCQlpci0+cmVsZWFzZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMCk7CisJCS8qIE5vdGU6IGJpdCAweDgwMCBiZWluZyB0aGUgdG9nZ2xlIGlzIGFzc3VtZWQsIG5vdCBjaGVja2VkCisJCSAgIHdpdGggcmVhbCBoYXJkd2FyZSAgKi8KKwkJaXJfa2V5ZG93bihpci0+aW5wdXQsIGlyY29kZSAmIDB4M2YsIGlyY29kZSAmIDB4MDgwMCA/IDEgOiAwKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAppbmRleCBiZGIwM2QzLi4zM2QxNjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKQEAgLTYzNiw2ICs2MzYsNyBAQAogLyogY3g4OC1pMmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogZXh0ZXJuIGludCBjeDg4X2kyY19pbml0KHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHN0cnVjdCBwY2lfZGV2ICpwY2kpOworZXh0ZXJuIHZvaWQgY3g4OF9pMmNfaW5pdF9pcihzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKTsKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYWJ1c2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGFidXNiLmMKaW5kZXggMGY1MDUwOC4uNWIxNzZiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYWJ1c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhYnVzYi5jCkBAIC03MDYsMTYgKzcwNiwxMSBAQAogCXN3aXRjaCAoY21kKSB7CiAKIAljYXNlIElPQ1RMX0RBQl9CVUxLOgotCQlwYnVsayA9IGttYWxsb2Moc2l6ZW9mIChidWxrX3RyYW5zZmVyX3QpLCBHRlBfS0VSTkVMKTsKKwkJcGJ1bGsgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgIHNpemVvZihidWxrX3RyYW5zZmVyX3QpKTsKIAotCQlpZiAoIXBidWxrKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIgKHBidWxrLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YgKGJ1bGtfdHJhbnNmZXJfdCkpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJa2ZyZWUgKHBidWxrKTsKKwkJaWYgKElTX0VSUihwYnVsaykpIHsKKwkJCXJldCA9IFBUUl9FUlIocGJ1bGspOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjE5NTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKQEAgLTAsMCArMSw5MyBAQAorY29uZmlnIERJU1BMQVlfREFWSU5DSV9ETTY0NlhfRVZNCisJdHJpc3RhdGUgIkRNNjQ2eCBFVk0gVmlkZW8gRGlzcGxheSIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBNQUNIX0RBVklOQ0lfRE02NDY3X0VWTQorCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCisJc2VsZWN0IFZJREVPX0RBVklOQ0lfVlBJRgorCXNlbGVjdCBWSURFT19BRFY3MzQzCisJc2VsZWN0IFZJREVPX1RIUzczMDMKKwloZWxwCisJICBTdXBwb3J0IGZvciBETTY0NjcgYmFzZWQgZGlzcGxheSBkZXZpY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwaWZfZGlzcGxheS4KKworY29uZmlnIENBUFRVUkVfREFWSU5DSV9ETTY0NlhfRVZNCisJdHJpc3RhdGUgIkRNNjQ2eCBFVk0gVmlkZW8gQ2FwdHVyZSIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBNQUNIX0RBVklOQ0lfRE02NDY3X0VWTQorCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCisJc2VsZWN0IFZJREVPX0RBVklOQ0lfVlBJRgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIERNNjQ2NyBiYXNlZCBjYXB0dXJlIGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBpZl9jYXB0dXJlLgorCitjb25maWcgVklERU9fREFWSU5DSV9WUElGCisJdHJpc3RhdGUgIkRhVmluY2kgVlBJRiBEcml2ZXIiCisJZGVwZW5kcyBvbiBESVNQTEFZX0RBVklOQ0lfRE02NDZYX0VWTQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIERhVmluY2kgVlBJRiBEcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwaWYuCisKK2NvbmZpZyBWSURFT19WUFNTX1NZU1RFTQorCXRyaXN0YXRlICJWUFNTIFN5c3RlbSBtb2R1bGUgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdnBzcyBzeXN0ZW0gbW9kdWxlIGZvciB2aWRlbyBkcml2ZXIKKworY29uZmlnIFZJREVPX1ZQRkVfQ0FQVFVSRQorCXRyaXN0YXRlICJWUEZFIFZpZGVvIENhcHR1cmUgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiAoQVJDSF9EQVZJTkNJIHx8IEFSQ0hfT01BUDMpCisJc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKKwloZWxwCisJICBTdXBwb3J0IGZvciBETXgvQU14IFZQRkUgYmFzZWQgZnJhbWUgZ3JhYmJlci4gVGhpcyBpcyB0aGUKKwkgIGNvbW1vbiBWNEwyIG1vZHVsZSBmb3IgZm9sbG93aW5nIERNeC9BTXggU29DcyBmcm9tIFRleGFzCisJICBJbnN0cnVtZW50czotIERNNjQ0NiwgRE0zNjUsIERNMzU1ICYgQU0zNTE3LzA1LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGZlLWNhcHR1cmUuCisKK2NvbmZpZyBWSURFT19ETTY0NDZfQ0NEQworCXRyaXN0YXRlICJETTY0NDYgQ0NEQyBIVyBtb2R1bGUiCisJZGVwZW5kcyBvbiBWSURFT19WUEZFX0NBUFRVUkUKKwlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KKwlkZWZhdWx0IHkKKwloZWxwCisJICAgRW5hYmxlcyBEYVZpbmNpIENDRCBodyBtb2R1bGUuIERhVmluY2kgQ0NEQyBodyBpbnRlcmZhY2VzCisJICAgd2l0aCBkZWNvZGVyIG1vZHVsZXMgc3VjaCBhcyBUVlA1MTQ2IG92ZXIgQlQ2NTYgb3IKKwkgICBzZW5zb3IgbW9kdWxlIHN1Y2ggYXMgTVQ5VDAwMSBvdmVyIGEgcmF3IGludGVyZmFjZS4gVGhpcworCSAgIG1vZHVsZSBjb25maWd1cmVzIHRoZSBpbnRlcmZhY2UgYW5kIENDREMvSVNJRiB0byBkbworCSAgIHZpZGVvIGZyYW1lIGNhcHR1cmUgZnJvbSBzbGF2ZSBkZWNvZGVycy4KKworCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGZlLgorCitjb25maWcgVklERU9fRE0zNTVfQ0NEQworCXRyaXN0YXRlICJETTM1NSBDQ0RDIEhXIG1vZHVsZSIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTM1NSAmJiBWSURFT19WUEZFX0NBUFRVUkUKKwlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KKwlkZWZhdWx0IHkKKwloZWxwCisJICAgRW5hYmxlcyBETTM1NSBDQ0QgaHcgbW9kdWxlLiBETTM1NSBDQ0RDIGh3IGludGVyZmFjZXMKKwkgICB3aXRoIGRlY29kZXIgbW9kdWxlcyBzdWNoIGFzIFRWUDUxNDYgb3ZlciBCVDY1NiBvcgorCSAgIHNlbnNvciBtb2R1bGUgc3VjaCBhcyBNVDlUMDAxIG92ZXIgYSByYXcgaW50ZXJmYWNlLiBUaGlzCisJICAgbW9kdWxlIGNvbmZpZ3VyZXMgdGhlIGludGVyZmFjZSBhbmQgQ0NEQy9JU0lGIHRvIGRvCisJICAgdmlkZW8gZnJhbWUgY2FwdHVyZSBmcm9tIGEgc2xhdmUgZGVjb2RlcnMKKworCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGZlLgorCitjb25maWcgVklERU9fSVNJRgorCXRyaXN0YXRlICJJU0lGIEhXIG1vZHVsZSIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTM2NSAmJiBWSURFT19WUEZFX0NBUFRVUkUKKwlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KKwlkZWZhdWx0IHkKKwloZWxwCisJICAgRW5hYmxlcyBJU0lGIGh3IG1vZHVsZS4gVGhpcyBpcyB0aGUgaGFyZHdhcmUgbW9kdWxlIGZvcgorCSAgIGNvbmZpZ3VyaW5nIElTSUYgaW4gVlBGRSB0byBjYXB0dXJlIFJhdyBCYXllciBSR0IgZGF0YSAgZnJvbQorCSAgIGEgaW1hZ2Ugc2Vuc29yIG9yIFlVViBkYXRhIGZyb20gYSBZVVYgc291cmNlLgorCisJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwZmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCmluZGV4IDNhNGZkODUuLmZmYmU1NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCkBAIC0xNTgsNiArMTU4LDIyIEBACiAJeyAtMSwJCQktMSwJLTEsCQktMX0sCiB9OwogCisvKgorICogS1dvcmxkIFBsdXNUViAzNDBVIGFuZCBVQjQzNS1RIChBVFNDKSBHUElPcyBtYXA6CisgKiBFTV9HUElPXzAgLSBjdXJyZW50bHkgdW5rbm93bgorICogRU1fR1BJT18xIC0gTEVEIGRpc2FibGUvZW5hYmxlICgxID0gb2ZmLCAwID0gb24pCisgKiBFTV9HUElPXzIgLSBjdXJyZW50bHkgdW5rbm93bgorICogRU1fR1BJT18zIC0gY3VycmVudGx5IHVua25vd24KKyAqIEVNX0dQSU9fNCAtIFREQTE4MjcxSEQvQzEgdHVuZXIgKDEgPSBhY3RpdmUsIDAgPSBpbiByZXNldCkKKyAqIEVNX0dQSU9fNSAtIExHRFQzMzA0IEFUU0MvUUFNIGRlbW9kICgxID0gYWN0aXZlLCAwID0gaW4gcmVzZXQpCisgKiBFTV9HUElPXzYgLSBjdXJyZW50bHkgdW5rbm93bgorICogRU1fR1BJT183IC0gY3VycmVudGx5IHVua25vd24KKyAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBrd29ybGRfYTM0MF9kaWdpdGFsW10gPSB7CisJe0VNMjhYWF9SMDhfR1BJTywJMHg2ZCwJCX5FTV9HUElPXzQsCTEwfSwKKwl7IC0xLAkJCS0xLAkJLTEsCQktMX0sCit9OworCiAvKiBQaW5uYWNsZSBIeWJyaWQgUHJvIGViMWE6Mjg4MSAqLwogc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBwaW5uYWNsZV9oeWJyaWRfcHJvX2FuYWxvZ1tdID0gewogCXtFTTI4WFhfUjA4X0dQSU8sCTB4ZmQsICAgfkVNX0dQSU9fNCwJMTB9LApAQCAtMTY2Nyw2ICsxNjgzLDE2IEBACiAJCS50dW5lcl9ncGlvICAgID0gcmVkZG9fZHZiX2NfdXNiX2JveCwKIAkJLmhhc19kdmIgICAgICAgPSAxLAogCX0sCisJLyogMWI4MDphMzQwIC0gRW1waWEgRU0yODcwLCBOWFAgVERBMTgyNzFIRCBhbmQgTEcgRFQzMzA0LCBzb2xkCisJICogaW5pdGlhbGx5IGFzIHRoZSBLV29ybGQgUGx1c1RWIDM0MFUsIHRoZW4gYXMgdGhlIFVCNDM1LVEuCisJICogRWFybHkgdmFyaWFudHMgaGF2ZSBhIFREQTE4MjcxSEQvQzEsIGxhdGVyIG9uZXMgYSBUREExODI3MUhEL0MyICovCisJW0VNMjg3MF9CT0FSRF9LV09STERfQTM0MF0gPSB7CisJCS5uYW1lICAgICAgID0gIktXb3JsZCBQbHVzVFYgMzQwVSBvciBVQjQzNS1RIChBVFNDKSIsCisJCS50dW5lcl90eXBlID0gVFVORVJfQUJTRU5ULAkvKiBEaWdpdGFsLW9ubHkgVERBMTgyNzFIRCAqLworCQkuaGFzX2R2YiAgICA9IDEsCisJCS5kdmJfZ3BpbyAgID0ga3dvcmxkX2EzNDBfZGlnaXRhbCwKKwkJLnR1bmVyX2dwaW8gPSBkZWZhdWx0X3R1bmVyX2dwaW8sCisJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgZW0yOHh4X2Jjb3VudCA9IEFSUkFZX1NJWkUoZW0yOHh4X2JvYXJkcyk7CiAKQEAgLTE3ODgsNiArMTgxNCw4IEBACiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4MjBfQk9BUkRfSU9EQVRBX0dWTVZQX1NaIH0sCiAJeyBVU0JfREVWSUNFKDB4ZWIxYSwgMHg1MGE2KSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg2MF9CT0FSRF9HQURNRUlfVVRWMzMwIH0sCisJeyBVU0JfREVWSUNFKDB4MWI4MCwgMHhhMzQwKSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjg3MF9CT0FSRF9LV09STERfQTM0MCB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZW0yOHh4X2lkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYwppbmRleCBjZjFkOGMzLi4zYWM4ZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCkBAIC0zMCwxMSArMzAsMTMgQEAKICNpbmNsdWRlICJ0dW5lci1zaW1wbGUuaCIKIAogI2luY2x1ZGUgImxnZHQzMzB4LmgiCisjaW5jbHVkZSAibGdkdDMzMDUuaCIKICNpbmNsdWRlICJ6bDEwMzUzLmgiCiAjaW5jbHVkZSAiczVoMTQwOS5oIgogI2luY2x1ZGUgIm10MzUyLmgiCiAjaW5jbHVkZSAibXQzNTJfcHJpdi5oIiAvKiBGSVhNRSAqLwogI2luY2x1ZGUgInRkYTEwMDJ4LmgiCisjaW5jbHVkZSAidGRhMTgyNzEuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGVtMjh4eCBiYXNlZCBEVkIgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiIpOwpAQCAtMjMxLDYgKzIzMywxOCBAQAogCS5kZW1vZF9jaGlwID0gTEdEVDMzMDMsCiB9OwogCitzdGF0aWMgc3RydWN0IGxnZHQzMzA1X2NvbmZpZyBlbTI4NzBfbGdkdDMzMDRfZGV2ID0geworCS5pMmNfYWRkciAgICAgICAgICAgPSAweDBlLAorCS5kZW1vZF9jaGlwICAgICAgICAgPSBMR0RUMzMwNCwKKwkuc3BlY3RyYWxfaW52ZXJzaW9uID0gMSwKKwkuZGVueV9pMmNfcnB0ciAgICAgID0gMSwKKwkubXBlZ19tb2RlICAgICAgICAgID0gTEdEVDMzMDVfTVBFR19QQVJBTExFTCwKKwkudHBjbGtfZWRnZSAgICAgICAgID0gTEdEVDMzMDVfVFBDTEtfRkFMTElOR19FREdFLAorCS50cHZhbGlkX3BvbGFyaXR5ICAgPSBMR0RUMzMwNV9UUF9WQUxJRF9ISUdILAorCS52c2JfaWZfa2h6ICAgICAgICAgPSAzMjUwLAorCS5xYW1faWZfa2h6ICAgICAgICAgPSA0MDAwLAorfTsKKwogc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBlbTI4eHhfemwxMDM1M193aXRoX3hjMzAyOCA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9ICgweDFlID4+IDEpLAogCS5ub190dW5lciA9IDEsCkBAIC0yNDcsNiArMjYxLDE3IEBACiAJLm1wZWdfdGltaW5nICAgPSBTNUgxNDA5X01QRUdUSU1JTkdfQ09OVElOT1VTX05PTklOVkVSVElOR19DTE9DSwogfTsKIAorc3RhdGljIHN0cnVjdCB0ZGExODI3MV9zdGRfbWFwIGt3b3JsZF9hMzQwX3N0ZF9tYXAgPSB7CisJLmF0c2NfNiAgID0geyAuaWZfZnJlcSA9IDMyNTAsIC5hZ2NfbW9kZSA9IDMsIC5zdGQgPSAwLAorCQkgICAgICAuaWZfbHZsID0gMSwgLnJmYWdjX3RvcCA9IDB4MzcsIH0sCisJLnFhbV82ICAgID0geyAuaWZfZnJlcSA9IDQwMDAsIC5hZ2NfbW9kZSA9IDMsIC5zdGQgPSAxLAorCQkgICAgICAuaWZfbHZsID0gMSwgLnJmYWdjX3RvcCA9IDB4MzcsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHRkYTE4MjcxX2NvbmZpZyBrd29ybGRfYTM0MF9jb25maWcgPSB7CisJLnN0ZF9tYXAgICAgICAgICAgID0gJmt3b3JsZF9hMzQwX3N0ZF9tYXAsCit9OworCiBzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIGVtMjh4eF96bDEwMzUzX3hjMzAyOF9ub19pMmNfZ2F0ZSA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9ICgweDFlID4+IDEpLAogCS5ub190dW5lciA9IDEsCkBAIC01NzIsNiArNTk3LDE0IEBACiAJCQl9CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBFTTI4NzBfQk9BUkRfS1dPUkxEX0EzNDA6CisJCWR2Yi0+ZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGxnZHQzMzA1X2F0dGFjaCwKKwkJCQkJICAgJmVtMjg3MF9sZ2R0MzMwNF9kZXYsCisJCQkJCSAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGR2Yi0+ZnJvbnRlbmQgIT0gTlVMTCkKKwkJCWR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBkdmItPmZyb250ZW5kLCAweDYwLAorCQkJCSAgICZkZXYtPmkyY19hZGFwLCAma3dvcmxkX2EzNDBfY29uZmlnKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZW0yOHh4X2VycmRldigiLzI6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQiCiAJCQkJIiBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMKaW5kZXggNWMzZmQ5NC4uNjc1OWNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMKQEAgLTY1LDE3ICs2NSwxNCBAQAogc3RydWN0IGVtMjh4eF9JUiB7CiAJc3RydWN0IGVtMjh4eCAqZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwotCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSBpcjsKIAljaGFyIG5hbWVbMzJdOwogCWNoYXIgcGh5c1szMl07CiAKIAkvKiBwb2xsIGV4dGVybmFsIGRlY29kZXIgKi8KIAlpbnQgcG9sbGluZzsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0JdW5zaWduZWQgaW50IGxhc3RfdG9nZ2xlOjE7CiAJdW5zaWduZWQgaW50IGZ1bGxfY29kZToxOwogCXVuc2lnbmVkIGludCBsYXN0X3JlYWRjb3VudDsKLQl1bnNpZ25lZCBpbnQgcmVwZWF0X2ludGVydmFsOwogCiAJaW50ICAoKmdldF9rZXkpKHN0cnVjdCBlbTI4eHhfSVIgKiwgc3RydWN0IGVtMjh4eF9pcl9wb2xsX3Jlc3VsdCAqKTsKIApAQCAtMjkxLDY3ICsyODgsMzkgQEAKIHN0YXRpYyB2b2lkIGVtMjh4eF9pcl9oYW5kbGVfa2V5KHN0cnVjdCBlbTI4eHhfSVIgKmlyKQogewogCWludCByZXN1bHQ7Ci0JaW50IGRvX3NlbmRrZXkgPSAwOwogCXN0cnVjdCBlbTI4eHhfaXJfcG9sbF9yZXN1bHQgcG9sbF9yZXN1bHQ7CiAKIAkvKiByZWFkIHRoZSByZWdpc3RlcnMgY29udGFpbmluZyB0aGUgSVIgc3RhdHVzICovCiAJcmVzdWx0ID0gaXItPmdldF9rZXkoaXIsICZwb2xsX3Jlc3VsdCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKKwlpZiAodW5saWtlbHkocmVzdWx0IDwgMCkpIHsKIAkJZHByaW50aygiaXItPmdldF9rZXkoKSBmYWlsZWQgJWRcbiIsIHJlc3VsdCk7CiAJCXJldHVybjsKIAl9CiAKLQlkcHJpbnRrKCJpci0+Z2V0X2tleSByZXN1bHQgdGI9JTAyeCByYz0lMDJ4IGxyPSUwMnggZGF0YT0lMDJ4JTAyeFxuIiwKLQkJcG9sbF9yZXN1bHQudG9nZ2xlX2JpdCwgcG9sbF9yZXN1bHQucmVhZF9jb3VudCwKLQkJaXItPmxhc3RfcmVhZGNvdW50LCBwb2xsX3Jlc3VsdC5yY19hZGRyZXNzLAotCQlwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKLQotCWlmIChpci0+ZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7Ci0JCS8qIFRoZSBlbTI4NzQgY2xlYXJzIHRoZSByZWFkY291bnQgZmllbGQgZXZlcnkgdGltZSB0aGUKLQkJICAgcmVnaXN0ZXIgaXMgcmVhZC4gIFRoZSBlbTI4NjAvMjg4MCBkYXRhc2hlZXQgc2F5cyB0aGF0IGl0Ci0JCSAgIGlzIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSByZWFkY291bnQsIGJ1dCBpdCBkb2Vzbid0LiAgU28gd2l0aAotCQkgICB0aGUgZW0yODc0LCB3ZSBhcmUgbG9va2luZyBmb3IgYSBub24temVybyByZWFkIGNvdW50IGFzCi0JCSAgIG9wcG9zZWQgdG8gYSByZWFkY291bnQgdGhhdCBpcyBpbmNyZW1lbnRpbmcgKi8KLQkJaXItPmxhc3RfcmVhZGNvdW50ID0gMDsKLQl9Ci0KLQlpZiAocG9sbF9yZXN1bHQucmVhZF9jb3VudCA9PSAwKSB7Ci0JCS8qIFRoZSBidXR0b24gaGFzIG5vdCBiZWVuIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgcmVhZCAqLwotCX0gZWxzZSBpZiAoaXItPmxhc3RfdG9nZ2xlICE9IHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQpIHsKLQkJLyogQSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZCAqLwotCQlkcHJpbnRrKCJidXR0b24gaGFzIGJlZW4gcHJlc3NlZFxuIik7Ci0JCWlyLT5sYXN0X3RvZ2dsZSA9IHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQ7Ci0JCWlyLT5yZXBlYXRfaW50ZXJ2YWwgPSAwOwotCQlkb19zZW5ka2V5ID0gMTsKLQl9IGVsc2UgaWYgKHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQgPT0gaXItPmxhc3RfdG9nZ2xlICYmCi0JCSAgIHBvbGxfcmVzdWx0LnJlYWRfY291bnQgPiAwICYmCi0JCSAgIHBvbGxfcmVzdWx0LnJlYWRfY291bnQgIT0gaXItPmxhc3RfcmVhZGNvdW50KSB7Ci0JCS8qIFRoZSBidXR0b24gaXMgc3RpbGwgYmVpbmcgaGVsZCBkb3duICovCi0JCWRwcmludGsoImJ1dHRvbiBiZWluZyBoZWxkIGRvd25cbiIpOwotCi0JCS8qIERlYm91bmNlciBmb3IgZmlyc3Qga2V5cHJlc3MgKi8KLQkJaWYgKGlyLT5yZXBlYXRfaW50ZXJ2YWwrKyA+IDkpIHsKLQkJCS8qIFN0YXJ0IHJlcGVhdGluZyBhZnRlciAxIHNlY29uZCAqLwotCQkJZG9fc2VuZGtleSA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoZG9fc2VuZGtleSkgewotCQlkcHJpbnRrKCJzZW5kaW5nIGtleXByZXNzXG4iKTsKLQorCWlmICh1bmxpa2VseShwb2xsX3Jlc3VsdC5yZWFkX2NvdW50ICE9IGlyLT5sYXN0X3JlYWRjb3VudCkpIHsKKwkJZHByaW50aygiJXM6IHRvZ2dsZTogJWQsIGNvdW50OiAlZCwga2V5IDB4JTAyeCUwMnhcbiIsIF9fZnVuY19fLAorCQkJcG9sbF9yZXN1bHQudG9nZ2xlX2JpdCwgcG9sbF9yZXN1bHQucmVhZF9jb3VudCwKKwkJCXBvbGxfcmVzdWx0LnJjX2FkZHJlc3MsIHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0pOwogCQlpZiAoaXItPmZ1bGxfY29kZSkKLQkJCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLAotCQkJCQkgcG9sbF9yZXN1bHQucmNfYWRkcmVzcyA8PCA4IHwKLQkJCQkJIHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0pOworCQkJaXJfa2V5ZG93bihpci0+aW5wdXQsCisJCQkJICAgcG9sbF9yZXN1bHQucmNfYWRkcmVzcyA8PCA4IHwKKwkJCQkgICBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdLAorCQkJCSAgIHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQpOwogCQllbHNlCi0JCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5pbnB1dCwgJmlyLT5pciwKLQkJCQkJIHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0pOworCQkJaXJfa2V5ZG93bihpci0+aW5wdXQsCisJCQkJICAgcG9sbF9yZXN1bHQucmNfZGF0YVswXSwKKwkJCQkgICBwb2xsX3Jlc3VsdC50b2dnbGVfYml0KTsKIAotCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOworCQlpZiAoaXItPmRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCkKKwkJCS8qIFRoZSBlbTI4NzQgY2xlYXJzIHRoZSByZWFkY291bnQgZmllbGQgZXZlcnkgdGltZSB0aGUKKwkJCSAgIHJlZ2lzdGVyIGlzIHJlYWQuICBUaGUgZW0yODYwLzI4ODAgZGF0YXNoZWV0IHNheXMgdGhhdCBpdAorCQkJICAgaXMgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIHJlYWRjb3VudCwgYnV0IGl0IGRvZXNuJ3QuICBTbyB3aXRoCisJCQkgICB0aGUgZW0yODc0LCB3ZSBhcmUgbG9va2luZyBmb3IgYSBub24temVybyByZWFkIGNvdW50IGFzCisJCQkgICBvcHBvc2VkIHRvIGEgcmVhZGNvdW50IHRoYXQgaXMgaW5jcmVtZW50aW5nICovCisJCQlpci0+bGFzdF9yZWFkY291bnQgPSAwOworCQllbHNlCisJCQlpci0+bGFzdF9yZWFkY291bnQgPSBwb2xsX3Jlc3VsdC5yZWFkX2NvdW50OwogCX0KLQotCWlyLT5sYXN0X3JlYWRjb3VudCA9IHBvbGxfcmVzdWx0LnJlYWRfY291bnQ7Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBlbTI4eHhfaXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC00NjYsMTEgKzQzNSw2IEBACiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpKTsKIAlzdHJsY2F0KGlyLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihpci0+cGh5cykpOwogCi0JLyogU2V0IElSIHByb3RvY29sICovCi0JZXJyID0gaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZpci0+aXIsIElSX1RZUEVfT1RIRVIpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9vdXRfZnJlZTsKLQogCWlucHV0X2Rldi0+bmFtZSA9IGlyLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9IGlyLT5waHlzOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19VU0I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IDIwMDkwZTMuLjdiOWVjNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCkBAIC02NTQsMTIgKzY1NCwxMiBAQAogCQl9CiAKIAkJaWYgKGJ1ZiAhPSBOVUxMICYmIGRldi0+Y2FwdHVyZV90eXBlID09IDIpIHsKLQkJCWlmIChsZW4gPiA0ICYmIHBbMF0gPT0gMHg4OCAmJiBwWzFdID09IDB4ODggJiYKKwkJCWlmIChsZW4gPj0gNCAmJiBwWzBdID09IDB4ODggJiYgcFsxXSA9PSAweDg4ICYmCiAJCQkgICAgcFsyXSA9PSAweDg4ICYmIHBbM10gPT0gMHg4OCkgewogCQkJCXAgKz0gNDsKIAkJCQlsZW4gLT0gNDsKIAkJCX0KLQkJCWlmIChsZW4gPiA0ICYmIHBbMF0gPT0gMHgyMiAmJiBwWzFdID09IDB4NWEpIHsKKwkJCWlmIChsZW4gPj0gNCAmJiBwWzBdID09IDB4MjIgJiYgcFsxXSA9PSAweDVhKSB7CiAJCQkJZW0yOHh4X2lzb2NkYmcoIlZpZGVvIGZyYW1lICVkLCBsZW49JWksICVzXG4iLAogCQkJCQkgICAgICAgcFsyXSwgbGVuLCAocFsyXSAmIDEpID8KIAkJCQkJICAgICAgICJvZGQiIDogImV2ZW4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKaW5kZXggYjI1MmQxYi4uMWM2MWE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb3JlLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfVklERU9fRU0yOFhYX0RWQikgfHwgZGVmaW5lZChDT05GSUdfVklERU9fRU0yOFhYX0RWQl9NT0RVTEUpCiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZHZiLmg+CiAjZW5kaWYKQEAgLTExMyw2ICsxMTQsNyBAQAogI2RlZmluZSBFTTI4NzBfQk9BUkRfUkVERE9fRFZCX0NfVVNCX0JPWCAgICAgICAgICA3MwogI2RlZmluZSBFTTI4MDBfQk9BUkRfVkMyMTFBCQkJICA3NAogI2RlZmluZSBFTTI4ODJfQk9BUkRfRElLT01fREszMDAJCSAgNzUKKyNkZWZpbmUgRU0yODcwX0JPQVJEX0tXT1JMRF9BMzQwCQkgIDc2CiAKIC8qIExpbWl0cyBtaW5pbXVtIGFuZCBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzICovCiAjZGVmaW5lIEVNMjhYWF9NSU5fQlVGIDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9mc2wtdml1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxYzk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCkBAIC0wLDAgKzEsMTYzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgRnJlZXNjYWxlIFZJVSB2aWRlbyBkcml2ZXIKKyAqCisgKiAgQXV0aG9yczogSG9uZ2p1biBDaGVuIDxob25nLWp1bi5jaGVuQGZyZWVzY2FsZS5jb20+CisgKgkgICAgIFBvcnRpbmcgdG8gMi42LjM1IGJ5IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsCisgKgkgICAgIEFuYXRvbGlqIEd1c3RzY2hpbiA8YWd1c3RAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJCSJmc2xfdml1IgorI2RlZmluZSBWSVVfTUFKT1JfVkVSU0lPTgkwCisjZGVmaW5lIFZJVV9NSU5PUl9WRVJTSU9OCTUKKyNkZWZpbmUgVklVX1JFTEVBU0UJCTAKKyNkZWZpbmUgVklVX1ZFUlNJT04JCUtFUk5FTF9WRVJTSU9OKFZJVV9NQUpPUl9WRVJTSU9OLCBcCisJCQkJCSAgICAgICBWSVVfTUlOT1JfVkVSU0lPTiwgXAorCQkJCQkgICAgICAgVklVX1JFTEVBU0UpCisKKyNkZWZpbmUgQlVGRkVSX1RJTUVPVVQJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSAgLyogMC41IHNlY29uZHMgKi8KKworI2RlZmluZQlWSVVfVklEX01FTV9MSU1JVAk0CS8qIFZpZGVvIG1lbW9yeSBsaW1pdCwgaW4gTWIgKi8KKworLyogSTJDIGFkZHJlc3Mgb2YgdmlkZW8gZGVjb2RlciBjaGlwIGlzIDB4NEEgKi8KKyNkZWZpbmUgVklVX1ZJREVPX0RFQ09ERVJfQUREUgkweDI1CisKKy8qIHN1cHBvcnRlZCBjb250cm9scyAqLworc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2aXVfcWN0cmxbXSA9IHsKKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJCcmlnaHRuZXNzIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEyNywKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sIHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJDb250cmFzdCIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAyNTUsCisJCS5zdGVwICAgICAgICAgID0gMHgxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDB4MTAsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJTYXR1cmF0aW9uIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAweDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMTI3LAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0hVRSwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJIdWUiLAorCQkubWluaW11bSAgICAgICA9IC0xMjgsCisJCS5tYXhpbXVtICAgICAgID0gMTI3LAorCQkuc3RlcCAgICAgICAgICA9IDB4MSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfQorfTsKKworc3RhdGljIGludCBxY3RsX3JlZ3NbQVJSQVlfU0laRSh2aXVfcWN0cmwpXTsKKworc3RhdGljIGludCBpbmZvX2xldmVsOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGxldmVsIDw9IGluZm9fbGV2ZWwpCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ2aXU6ICIgZm10ICwgIyMgYXJnKTsJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBCYXNpYyBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCB2aXVfZm10IHsKKwljaGFyICBuYW1lWzMyXTsKKwl1MzIgICBmb3VyY2M7CQkvKiB2NGwyIGZvcm1hdCBpZCAqLworCXUzMiAgIHBpeGVsZm9ybWF0OworCWludCAgIGRlcHRoOworfTsKKworc3RhdGljIHN0cnVjdCB2aXVfZm10IGZvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJSR0ItMTYgKDUvQi02L0ctNS9SKSIsCisJCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkJLmRlcHRoCQk9IDE2LAorCX0sIHsKKwkJLm5hbWUJCT0gIlJHQi0zMiAoQS1SLUctQikiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9SR0IzMiwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjMyLAorCQkuZGVwdGgJCT0gMzIsCisJfQorfTsKKworc3RydWN0IHZpdV9kZXY7CitzdHJ1Y3Qgdml1X2J1ZjsKKworLyogYnVmZmVyIGZvciBvbmUgdmlkZW8gZnJhbWUgKi8KK3N0cnVjdCB2aXVfYnVmIHsKKwkvKiBjb21tb24gdjRsIGJ1ZmZlciBzdHVmZiAtLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciB2YjsKKwlzdHJ1Y3Qgdml1X2ZtdCAqZm10OworfTsKKworc3RydWN0IHZpdV9kbWFxdWV1ZSB7CisJc3RydWN0IHZpdV9kZXYJCSpkZXY7CisJc3RydWN0IGxpc3RfaGVhZAlhY3RpdmU7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZWQ7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZW91dDsKK307CisKK3N0cnVjdCB2aXVfc3RhdHVzIHsKKwl1MzIgZmllbGRfaXJxOworCXUzMiB2c3luY19pcnE7CisJdTMyIGhzeW5jX2lycTsKKwl1MzIgdnN0YXJ0X2lycTsKKwl1MzIgZG1hX2VuZF9pcnE7CisJdTMyIGVycm9yX2lycTsKK307CisKK3N0cnVjdCB2aXVfcmVnIHsKKwl1MzIgc3RhdHVzX2NmZzsKKwl1MzIgbHVtaW5hbmNlOworCXUzMiBjaHJvbWFfcjsKKwl1MzIgY2hyb21hX2c7CisJdTMyIGNocm9tYV9iOworCXUzMiBmaWVsZF9iYXNlX2FkZHI7CisJdTMyIGRtYV9pbmM7CisJdTMyIHBpY3R1cmVfY291bnQ7CisJdTMyIHJlcV9hbGFybTsKKwl1MzIgYWxwaGE7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHZpdV9kZXYgeworCXN0cnVjdCB2NGwyX2RldmljZQl2NGwyX2RldjsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJc3BpbmxvY2tfdAkJc2xvY2s7CisJaW50CQkJdXNlcnM7CisKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlCSp2ZGV2OworCXN0cnVjdCB2aXVfZG1hcXVldWUJdmlkcTsKKwllbnVtIHY0bDJfZmllbGQJCWNhcGZpZWxkOworCWludAkJCWZpZWxkOworCWludAkJCWZpcnN0OworCWludAkJCWRtYV9kb25lOworCisJLyogSGFyZHdhcmUgcmVnaXN0ZXIgYXJlYSAqLworCXN0cnVjdCB2aXVfcmVnCQkqdnI7CisKKwkvKiBJbnRlcnJ1cHQgdmVjdG9yICovCisJaW50CQkJaXJxOworCXN0cnVjdCB2aXVfc3RhdHVzCWlycXM7CisKKwkvKiB2aWRlbyBvdmVybGF5ICovCisJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIJb3ZidWY7CisJc3RydWN0IHZpdV9mbXQJCSpvdmZtdDsKKwl1bnNpZ25lZCBpbnQJCW92ZW5hYmxlOworCWVudW0gdjRsMl9maWVsZAkJb3ZmaWVsZDsKKworCS8qIGNyb3AgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0CWNyb3BfY3VycmVudDsKKworCS8qIGNsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgY2xrCQkqY2xrOworCisJLyogZGVjb2RlciAqLworCXN0cnVjdCB2NGwyX3N1YmRldgkqZGVjb2RlcjsKK307CisKK3N0cnVjdCB2aXVfZmggeworCXN0cnVjdCB2aXVfZGV2CQkqZGV2OworCisJLyogdmlkZW8gY2FwdHVyZSAqLworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZQl2Yl92aWRxOworCXNwaW5sb2NrX3QJCXZicV9sb2NrOyAvKiBzcGlubG9jayBmb3IgdGhlIHZpZGVvYnVmIHF1ZXVlICovCisKKwkvKiB2aWRlbyBvdmVybGF5ICovCisJc3RydWN0IHY0bDJfd2luZG93CXdpbjsKKwlzdHJ1Y3QgdjRsMl9jbGlwCWNsaXBzWzFdOworCisJLyogdmlkZW8gY2FwdHVyZSAqLworCXN0cnVjdCB2aXVfZm10CQkqZm10OworCWludAkJCXdpZHRoLCBoZWlnaHQsIHNpemVpbWFnZTsKKwllbnVtIHY0bDJfYnVmX3R5cGUJdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdml1X3JlZyByZWdfdmFsOworCisvKgorICogTWFjcm8gZGVmaW5pdGlvbnMgb2YgVklVIHJlZ2lzdGVycworICovCisKKy8qIFNUQVRVU19DT05GSUcgcmVnaXN0ZXIgKi8KK2VudW0gc3RhdHVzX2NvbmZpZyB7CisJU09GVF9SU1QJCT0gMSA8PCAwLAorCisJRVJSX01BU0sJCT0gMHgwZiA8PCA0LAkvKiBFcnJvciBjb2RlIG1hc2sgKi8KKwlFUlJfTk8JCQk9IDB4MDAsCQkvKiBObyBlcnJvciAqLworCUVSUl9ETUFfVgkJPSAweDAxIDw8IDQsCS8qIERNQSBpbiB2ZXJ0aWNhbCBhY3RpdmUgKi8KKwlFUlJfRE1BX1ZCCQk9IDB4MDIgPDwgNCwJLyogRE1BIGluIHZlcnRpY2FsIGJsYW5raW5nICovCisJRVJSX0xJTkVfVE9PX0xPTkcJPSAweDA0IDw8IDQsCS8qIExpbmUgdG9vIGxvbmcgKi8KKwlFUlJfVE9PX01BTkdfTElORVMJPSAweDA1IDw8IDQsCS8qIFRvbyBtYW55IGxpbmVzIGluIGZpZWxkICovCisJRVJSX0xJTkVfVE9PX1NIT1JUCT0gMHgwNiA8PCA0LAkvKiBMaW5lIHRvbyBzaG9ydCAqLworCUVSUl9OT1RfRU5PVUdIX0xJTkUJPSAweDA3IDw8IDQsCS8qIE5vdCBlbm91Z2ggbGluZXMgaW4gZmllbGQgKi8KKwlFUlJfRklGT19PVkVSRkxPVwk9IDB4MDggPDwgNCwJLyogRklGTyBvdmVyZmxvdyAqLworCUVSUl9GSUZPX1VOREVSRkxPVwk9IDB4MDkgPDwgNCwJLyogRklGTyB1bmRlcmZsb3cgKi8KKwlFUlJfMWJpdF9FQ0MJCT0gMHgwYSA8PCA0LAkvKiBPbmUgYml0IEVDQyBlcnJvciAqLworCUVSUl9NT1JFX0VDQwkJPSAweDBiIDw8IDQsCS8qIFR3by9tb3JlIGJpdHMgRUNDIGVycm9yICovCisKKwlJTlRfRklFTERfRU4JCT0gMHgwMSA8PCA4LAkvKiBFbmFibGUgZmllbGQgaW50ZXJydXB0ICovCisJSU5UX1ZTWU5DX0VOCQk9IDB4MDEgPDwgOSwJLyogRW5hYmxlIHZzeW5jIGludGVycnVwdCAqLworCUlOVF9IU1lOQ19FTgkJPSAweDAxIDw8IDEwLAkvKiBFbmFibGUgaHN5bmMgaW50ZXJydXB0ICovCisJSU5UX1ZTVEFSVF9FTgkJPSAweDAxIDw8IDExLAkvKiBFbmFibGUgdnN0YXJ0IGludGVycnVwdCAqLworCUlOVF9ETUFfRU5EX0VOCQk9IDB4MDEgPDwgMTIsCS8qIEVuYWJsZSBETUEgZW5kIGludGVycnVwdCAqLworCUlOVF9FUlJPUl9FTgkJPSAweDAxIDw8IDEzLAkvKiBFbmFibGUgZXJyb3IgaW50ZXJydXB0ICovCisJSU5UX0VDQ19FTgkJPSAweDAxIDw8IDE0LAkvKiBFbmFibGUgRUNDIGludGVycnVwdCAqLworCisJSU5UX0ZJRUxEX1NUQVRVUwk9IDB4MDEgPDwgMTYsCS8qIGZpZWxkIGludGVycnVwdCBzdGF0dXMgKi8KKwlJTlRfVlNZTkNfU1RBVFVTCT0gMHgwMSA8PCAxNywJLyogdnN5bmMgaW50ZXJydXB0IHN0YXR1cyAqLworCUlOVF9IU1lOQ19TVEFUVVMJPSAweDAxIDw8IDE4LAkvKiBoc3luYyBpbnRlcnJ1cHQgc3RhdHVzICovCisJSU5UX1ZTVEFSVF9TVEFUVVMJPSAweDAxIDw8IDE5LAkvKiB2c3RhcnQgaW50ZXJydXB0IHN0YXR1cyAqLworCUlOVF9ETUFfRU5EX1NUQVRVUwk9IDB4MDEgPDwgMjAsCS8qIERNQSBlbmQgaW50ZXJydXB0IHN0YXR1cyAqLworCUlOVF9FUlJPUl9TVEFUVVMJPSAweDAxIDw8IDIxLAkvKiBlcnJvciBpbnRlcnJ1cHQgc3RhdHVzICovCisKKwlETUFfQUNUCQkJPSAweDAxIDw8IDI3LAkvKiBFbmFibGUgRE1BIHRyYW5zZmVyICovCisJRklFTERfTk8JCT0gMHgwMSA8PCAyOCwJLyogRmllbGQgbnVtYmVyICovCisJRElUSEVSX09OCQk9IDB4MDEgPDwgMjksCS8qIERpdGhlcmluZyBpcyBvbiAqLworCVJPVU5EX09OCQk9IDB4MDEgPDwgMzAsCS8qIFJvdW5kIGlzIG9uICovCisJTU9ERV8zMkJJVAkJPSAweDAxIDw8IDMxLAkvKiBEYXRhIGluIFJHQmE4ODgsCisJCQkJCQkgKiAwIGluIFJHQjU2NQorCQkJCQkJICovCit9OworCisjZGVmaW5lIG5vcm1fbWF4dygpCTcyMAorI2RlZmluZSBub3JtX21heGgoKQk1NzYKKworI2RlZmluZSBJTlRfQUxMX1NUQVRVUwkoSU5UX0ZJRUxEX1NUQVRVUyB8IElOVF9WU1lOQ19TVEFUVVMgfCBcCisJCQkgSU5UX0hTWU5DX1NUQVRVUyB8IElOVF9WU1RBUlRfU1RBVFVTIHwgXAorCQkJIElOVF9ETUFfRU5EX1NUQVRVUyB8IElOVF9FUlJPUl9TVEFUVVMpCisKKyNkZWZpbmUgTlVNX0ZPUk1BVFMJQVJSQVlfU0laRShmb3JtYXRzKQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgdml1X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKworc3RydWN0IHZpdV9mbXQgKmZvcm1hdF9ieV9mb3VyY2MoaW50IGZvdXJjYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CisJCWlmIChmb3JtYXRzW2ldLnBpeGVsZm9ybWF0ID09IGZvdXJjYykKKwkJCXJldHVybiBmb3JtYXRzICsgaTsKKwl9CisKKwlkcHJpbnRrKDAsICJ1bmtub3duIHBpeGVsZm9ybWF0OiclNC40cydcbiIsIChjaGFyICopJmZvdXJjYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgdml1X3N0YXJ0X2RtYShzdHJ1Y3Qgdml1X2RldiAqZGV2KQoreworCXN0cnVjdCB2aXVfcmVnICp2ciA9IGRldi0+dnI7CisKKwlkZXYtPmZpZWxkID0gMDsKKworCS8qIEVuYWJsZSBETUEgb3BlcmF0aW9uICovCisJb3V0X2JlMzIoJnZyLT5zdGF0dXNfY2ZnLCBTT0ZUX1JTVCk7CisJb3V0X2JlMzIoJnZyLT5zdGF0dXNfY2ZnLCBJTlRfRklFTERfRU4pOworfQorCit2b2lkIHZpdV9zdG9wX2RtYShzdHJ1Y3Qgdml1X2RldiAqZGV2KQoreworCXN0cnVjdCB2aXVfcmVnICp2ciA9IGRldi0+dnI7CisJaW50IGNudCA9IDEwMDsKKwl1MzIgc3RhdHVzX2NmZzsKKworCW91dF9iZTMyKCZ2ci0+c3RhdHVzX2NmZywgMCk7CisKKwkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlzdGF0dXNfY2ZnID0gaW5fYmUzMigmdnItPnN0YXR1c19jZmcpOworCWlmIChzdGF0dXNfY2ZnICYgMHgzZjAwMDApCisJCW91dF9iZTMyKCZ2ci0+c3RhdHVzX2NmZywgc3RhdHVzX2NmZyAmIDB4M2YwMDAwKTsKKworCWlmIChzdGF0dXNfY2ZnICYgRE1BX0FDVCkgeworCQlkbyB7CisJCQlzdGF0dXNfY2ZnID0gaW5fYmUzMigmdnItPnN0YXR1c19jZmcpOworCQkJaWYgKHN0YXR1c19jZmcgJiBJTlRfRE1BX0VORF9TVEFUVVMpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKGNudC0tKTsKKworCQlpZiAoY250IDwgMCkgeworCQkJLyogdGltZWQgb3V0LCBpc3N1ZSBzb2Z0IHJlc2V0ICovCisJCQlvdXRfYmUzMigmdnItPnN0YXR1c19jZmcsIFNPRlRfUlNUKTsKKwkJCW91dF9iZTMyKCZ2ci0+c3RhdHVzX2NmZywgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBjbGVhciBETUFfRU5EIGFuZCBvdGhlciBwZW5kaW5nIGlycXMgKi8KKwkJCW91dF9iZTMyKCZ2ci0+c3RhdHVzX2NmZywgc3RhdHVzX2NmZyAmIDB4M2YwMDAwKTsKKwkJfQorCX0KKworCWRldi0+ZmllbGQgPSAwOworfQorCitzdGF0aWMgaW50IHJlc3RhcnRfdmlkZW9fcXVldWUoc3RydWN0IHZpdV9kbWFxdWV1ZSAqdmlkcSkKK3sKKwlzdHJ1Y3Qgdml1X2J1ZiAqYnVmLCAqcHJldjsKKworCWRwcmludGsoMSwgIiVzIHZpZHE9MHglMDhseFxuIiwgX19mdW5jX18sICh1bnNpZ25lZCBsb25nKXZpZHEpOworCWlmICghbGlzdF9lbXB0eSgmdmlkcS0+YWN0aXZlKSkgeworCQlidWYgPSBsaXN0X2VudHJ5KHZpZHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3Qgdml1X2J1ZiwgdmIucXVldWUpOworCQlkcHJpbnRrKDIsICJyZXN0YXJ0X3F1ZXVlIFslcC8lZF06IHJlc3RhcnQgZG1hXG4iLAorCQkJYnVmLCBidWYtPnZiLmkpOworCisJCXZpdV9zdG9wX2RtYSh2aWRxLT5kZXYpOworCisJCS8qIGNhbmNlbCBhbGwgb3V0c3RhbmRpbmcgY2FwdHVyZSByZXF1ZXN0cyAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVmLCBwcmV2LCAmdmlkcS0+YWN0aXZlLCB2Yi5xdWV1ZSkgeworCQkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOworCQkJd2FrZV91cCgmYnVmLT52Yi5kb25lKTsKKwkJfQorCQltb2RfdGltZXIoJnZpZHEtPnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmV2ID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCWlmIChsaXN0X2VtcHR5KCZ2aWRxLT5xdWV1ZWQpKQorCQkJcmV0dXJuIDA7CisJCWJ1ZiA9IGxpc3RfZW50cnkodmlkcS0+cXVldWVkLm5leHQsIHN0cnVjdCB2aXVfYnVmLCB2Yi5xdWV1ZSk7CisJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZ2aWRxLT5hY3RpdmUpOworCisJCQlkcHJpbnRrKDEsICJSZXN0YXJ0aW5nIHZpZGVvIGRtYVxuIik7CisJCQl2aXVfc3RvcF9kbWEodmlkcS0+ZGV2KTsKKwkJCXZpdV9zdGFydF9kbWEodmlkcS0+ZGV2KTsKKworCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwkJCW1vZF90aW1lcigmdmlkcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJCQlkcHJpbnRrKDIsICJbJXAvJWRdIHJlc3RhcnRfcXVldWUgLSBmaXJzdCBhY3RpdmVcbiIsCisJCQkJYnVmLCBidWYtPnZiLmkpOworCisJCX0gZWxzZSBpZiAocHJldi0+dmIud2lkdGggID09IGJ1Zi0+dmIud2lkdGggICYmCisJCQkgICBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQgJiYKKwkJCSAgIHByZXYtPmZtdCAgICAgICA9PSBidWYtPmZtdCkgeworCQkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnZpZHEtPmFjdGl2ZSk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkJZHByaW50aygyLCAiWyVwLyVkXSByZXN0YXJ0X3F1ZXVlIC0gbW92ZSB0byBhY3RpdmVcbiIsCisJCQkJYnVmLCBidWYtPnZiLmkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJldiA9IGJ1ZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZpdV92aWRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHZpdV9kZXYgKmRldiA9IChzdHJ1Y3Qgdml1X2RldiAqKWRhdGE7CisJc3RydWN0IHZpdV9idWYgKmJ1ZjsKKwlzdHJ1Y3Qgdml1X2RtYXF1ZXVlICp2aWRxID0gJmRldi0+dmlkcTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmdmlkcS0+YWN0aXZlKSkgeworCQlidWYgPSBsaXN0X2VudHJ5KHZpZHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3Qgdml1X2J1ZiwgdmIucXVldWUpOworCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9FUlJPUjsKKwkJd2FrZV91cCgmYnVmLT52Yi5kb25lKTsKKwkJZHByaW50aygxLCAidml1LzA6IFslcC8lZF0gdGltZW91dFxuIiwgYnVmLCBidWYtPnZiLmkpOworCX0KKworCXJlc3RhcnRfdmlkZW9fcXVldWUodmlkcSk7Cit9CisKKy8qCisgKiBWaWRlb2J1ZiBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqY291bnQsCisJCQl1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IHZpdV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCisJKnNpemUgPSBmaC0+d2lkdGggKiBmaC0+aGVpZ2h0ICogZmgtPmZtdC0+ZGVwdGggPj4gMzsKKwlpZiAoKmNvdW50ID09IDApCisJCSpjb3VudCA9IDMyOworCisJd2hpbGUgKCpzaXplICogKmNvdW50ID4gVklVX1ZJRF9NRU1fTElNSVQgKiAxMDI0ICogMTAyNCkKKwkJKCpjb3VudCktLTsKKworCWRwcmludGsoMSwgIiVzLCBjb3VudD0lZCwgc2l6ZT0lZFxuIiwgX19mdW5jX18sICpjb3VudCwgKnNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3Qgdml1X2J1ZiAqYnVmKQoreworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiID0gJmJ1Zi0+dmI7CisJdm9pZCAqdmFkZHIgPSBOVUxMOworCisJQlVHX09OKGluX2ludGVycnVwdCgpKTsKKworCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwgMCwgMCk7CisKKwlpZiAodnEtPmludF9vcHMgJiYgdnEtPmludF9vcHMtPnZhZGRyKQorCQl2YWRkciA9IHZxLT5pbnRfb3BzLT52YWRkcih2Yik7CisKKwlpZiAodmFkZHIpCisJCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgJmJ1Zi0+dmIpOworCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Cit9CisKK2lubGluZSBpbnQgYnVmZmVyX2FjdGl2YXRlKHN0cnVjdCB2aXVfZGV2ICpkZXYsIHN0cnVjdCB2aXVfYnVmICpidWYpCit7CisJc3RydWN0IHZpdV9yZWcgKnZyID0gZGV2LT52cjsKKwlpbnQgYnBwOworCisJLyogc2V0dXAgdGhlIERNQSBiYXNlIGFkZHJlc3MgKi8KKwlyZWdfdmFsLmZpZWxkX2Jhc2VfYWRkciA9IHZpZGVvYnVmX3RvX2RtYV9jb250aWcoJmJ1Zi0+dmIpOworCisJZHByaW50aygxLCAiYnVmZmVyX2FjdGl2YXRlIFslcC8lZF06IGRtYSBhZGRyIDB4JWx4XG4iLAorCQlidWYsIGJ1Zi0+dmIuaSwgKHVuc2lnbmVkIGxvbmcpcmVnX3ZhbC5maWVsZF9iYXNlX2FkZHIpOworCisJLyogaW50ZXJsYWNlIGlzIG9uIGJ5IGRlZmF1bHQsIHNldCBob3Jpem9udGFsIERNQSBpbmNyZW1lbnQgKi8KKwlyZWdfdmFsLnN0YXR1c19jZmcgPSAwOworCWJwcCA9IGJ1Zi0+Zm10LT5kZXB0aCA+PiAzOworCXN3aXRjaCAoYnBwKSB7CisJY2FzZSAyOgorCQlyZWdfdmFsLnN0YXR1c19jZmcgJj0gfk1PREVfMzJCSVQ7CisJCXJlZ192YWwuZG1hX2luYyA9IGJ1Zi0+dmIud2lkdGggKiAyOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJlZ192YWwuc3RhdHVzX2NmZyB8PSBNT0RFXzMyQklUOworCQlyZWdfdmFsLmRtYV9pbmMgPSBidWYtPnZiLndpZHRoICogNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHByaW50aygwLCAiZG9lc24ndCBzdXBwb3J0IGNvbG9yIGRlcHRoKCVkKVxuIiwKKwkJCWJwcCAqIDgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzZXR1cCBwaWN0dXJlX2NvdW50IHJlZ2lzdGVyICovCisJcmVnX3ZhbC5waWN0dXJlX2NvdW50ID0gKGJ1Zi0+dmIuaGVpZ2h0IC8gMikgPDwgMTYgfAorCQkJCWJ1Zi0+dmIud2lkdGg7CisKKwlyZWdfdmFsLnN0YXR1c19jZmcgfD0gRE1BX0FDVCB8IElOVF9ETUFfRU5EX0VOIHwgSU5UX0ZJRUxEX0VOOworCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwlkZXYtPmNhcGZpZWxkID0gYnVmLT52Yi5maWVsZDsKKworCS8qIHJlc2V0IGRtYSBpbmNyZW1lbnQgaWYgbmVlZGVkICovCisJaWYgKCFWNEwyX0ZJRUxEX0hBU19CT1RIKGJ1Zi0+dmIuZmllbGQpKQorCQlyZWdfdmFsLmRtYV9pbmMgPSAwOworCisJb3V0X2JlMzIoJnZyLT5kbWFfaW5jLCByZWdfdmFsLmRtYV9pbmMpOworCW91dF9iZTMyKCZ2ci0+cGljdHVyZV9jb3VudCwgcmVnX3ZhbC5waWN0dXJlX2NvdW50KTsKKwlvdXRfYmUzMigmdnItPmZpZWxkX2Jhc2VfYWRkciwgcmVnX3ZhbC5maWVsZF9iYXNlX2FkZHIpOworCW1vZF90aW1lcigmZGV2LT52aWRxLnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3Qgdml1X2ZoICAqZmggID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgdml1X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3Qgdml1X2J1ZiwgdmIpOworCWludCByYzsKKworCUJVR19PTihmaC0+Zm10ID09IE5VTEwpOworCisJaWYgKGZoLT53aWR0aCAgPCA0OCB8fCBmaC0+d2lkdGggID4gbm9ybV9tYXh3KCkgfHwKKwkgICAgZmgtPmhlaWdodCA8IDMyIHx8IGZoLT5oZWlnaHQgPiBub3JtX21heGgoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYnVmLT52Yi5zaXplID0gKGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKKwlpZiAoYnVmLT52Yi5iYWRkciAhPSAwICYmIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1Zi0+Zm10ICAgICAgICE9IGZoLT5mbXQJIHx8CisJICAgIGJ1Zi0+dmIud2lkdGggICE9IGZoLT53aWR0aCAgfHwKKwkgICAgYnVmLT52Yi5oZWlnaHQgIT0gZmgtPmhlaWdodCB8fAorCSAgICBidWYtPnZiLmZpZWxkICAhPSBmaWVsZCkgeworCQlidWYtPmZtdCAgICAgICA9IGZoLT5mbXQ7CisJCWJ1Zi0+dmIud2lkdGggID0gZmgtPndpZHRoOworCQlidWYtPnZiLmhlaWdodCA9IGZoLT5oZWlnaHQ7CisJCWJ1Zi0+dmIuZmllbGQgID0gZmllbGQ7CisJfQorCisJaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfTkVFRFNfSU5JVCkgeworCQlyYyA9IHZpZGVvYnVmX2lvbG9jayh2cSwgJmJ1Zi0+dmIsIE5VTEwpOworCQlpZiAocmMgIT0gMCkKKwkJCWdvdG8gZmFpbDsKKworCQlidWYtPnZiLndpZHRoICA9IGZoLT53aWR0aDsKKwkJYnVmLT52Yi5oZWlnaHQgPSBmaC0+aGVpZ2h0OworCQlidWYtPnZiLmZpZWxkICA9IGZpZWxkOworCQlidWYtPmZtdCAgICAgICA9IGZoLT5mbXQ7CisJfQorCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOworCXJldHVybiAwOworCitmYWlsOgorCWZyZWVfYnVmZmVyKHZxLCBidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCB2aXVfYnVmICAgICAgICpidWYgICAgID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3Qgdml1X2J1ZiwgdmIpOworCXN0cnVjdCB2aXVfZmggICAgICAgICpmaCAgICAgID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgdml1X2RldiAgICAgICAqZGV2ICAgICA9IGZoLT5kZXY7CisJc3RydWN0IHZpdV9kbWFxdWV1ZSAgKnZpZHEgICAgPSAmZGV2LT52aWRxOworCXN0cnVjdCB2aXVfYnVmICAgICAgICpwcmV2OworCisJaWYgKCFsaXN0X2VtcHR5KCZ2aWRxLT5xdWV1ZWQpKSB7CisJCWRwcmludGsoMSwgImFkZGluZyB2YiBxdWV1ZT0weCUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSZidWYtPnZiLnF1ZXVlKTsKKwkJZHByaW50aygxLCAidmlkcSBwb2ludGVyIDB4JXAsIHF1ZXVlZCAweCVwXG4iLAorCQkJCXZpZHEsICZ2aWRxLT5xdWV1ZWQpOworCQlkcHJpbnRrKDEsICJkZXYgJXAsIHF1ZXVlZDogc2VsZiAlcCwgbmV4dCAlcCwgaGVhZCAlcFxuIiwKKwkJCWRldiwgJnZpZHEtPnF1ZXVlZCwgdmlkcS0+cXVldWVkLm5leHQsCisJCQl2aWRxLT5xdWV1ZWQucHJldik7CisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZ2aWRxLT5xdWV1ZWQpOworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOworCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsCisJCQlidWYsIGJ1Zi0+dmIuaSk7CisJfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZ2aWRxLT5hY3RpdmUpKSB7CisJCWRwcmludGsoMSwgImFkZGluZyB2YiBhY3RpdmU9MHglMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykmYnVmLT52Yi5xdWV1ZSk7CisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZ2aWRxLT5hY3RpdmUpOworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQltb2RfdGltZXIoJnZpZHEtPnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOworCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJCWJ1ZiwgYnVmLT52Yi5pKTsKKworCQlidWZmZXJfYWN0aXZhdGUoZGV2LCBidWYpOworCX0gZWxzZSB7CisJCWRwcmludGsoMSwgImFkZGluZyB2YiBxdWV1ZTI9MHglMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykmYnVmLT52Yi5xdWV1ZSk7CisJCXByZXYgPSBsaXN0X2VudHJ5KHZpZHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3Qgdml1X2J1ZiwgdmIucXVldWUpOworCQlpZiAocHJldi0+dmIud2lkdGggID09IGJ1Zi0+dmIud2lkdGggICYmCisJCSAgICBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQgJiYKKwkJICAgIHByZXYtPmZtdCAgICAgICA9PSBidWYtPmZtdCkgeworCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnZpZHEtPmFjdGl2ZSk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlXG4iLAorCQkJCWJ1ZiwgYnVmLT52Yi5pKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZ2aWRxLT5xdWV1ZWQpOworCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKKwkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLAorCQkJCWJ1ZiwgYnVmLT52Yi5pKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3Qgdml1X2J1ZiAqYnVmICA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHZpdV9idWYsIHZiKTsKKwlzdHJ1Y3Qgdml1X2ZoICAqZmggICA9IHZxLT5wcml2X2RhdGE7CisJc3RydWN0IHZpdV9kZXYgKmRldiAgPSAoc3RydWN0IHZpdV9kZXYgKilmaC0+ZGV2OworCisJdml1X3N0b3BfZG1hKGRldik7CisJZnJlZV9idWZmZXIodnEsIGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIHZpdV92aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgICAgICA9IGJ1ZmZlcl9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgICAgPSBidWZmZXJfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlICAgICAgPSBidWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlICAgID0gYnVmZmVyX3JlbGVhc2UsCit9OworCisvKgorICogSU9DVEwgdmlkaW9jIGhhbmRsaW5nCisgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cmNweShjYXAtPmRyaXZlciwgInZpdSIpOworCXN0cmNweShjYXAtPmNhcmQsICJ2aXUiKTsKKwljYXAtPnZlcnNpb24gPSBWSVVfVkVSU0lPTjsKKwljYXAtPmNhcGFiaWxpdGllcyA9CVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAorCQkJCVY0TDJfQ0FQX1ZJREVPX09WRVJMQVkgfAorCQkJCVY0TDJfQ0FQX1JFQURXUklURTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCWludCBpbmRleCA9IGYtPmluZGV4OworCisJaWYgKGYtPmluZGV4ID4gTlVNX0ZPUk1BVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm9ybWF0c1tpbmRleF0ubmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmb3JtYXRzW2luZGV4XS5mb3VyY2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCB2aXVfZmggKmZoID0gcHJpdjsKKworCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gZmgtPndpZHRoOworCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gZmgtPmhlaWdodDsKKwlmLT5mbXQucGl4LmZpZWxkICAgICAgICA9IGZoLT52Yl92aWRxLmZpZWxkOworCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gZmgtPmZtdC0+cGl4ZWxmb3JtYXQ7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQorCQkJKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKKwlmLT5mbXQucGl4LnNpemVpbWFnZQk9IGZoLT5zaXplaW1hZ2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHZpdV9mbXQgKmZtdDsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CisKKwlmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCWlmICghZm10KSB7CisJCWRwcmludGsoMSwgIkZvdXJjYyBmb3JtYXQgKDB4JTA4eCkgaW52YWxpZC4iLAorCQkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKworCWlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkgeworCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwl9IGVsc2UgaWYgKGZpZWxkICE9IFY0TDJfRklFTERfSU5URVJMQUNFRCkgeworCQlkcHJpbnRrKDEsICJGaWVsZCB0eXBlIGludmFsaWQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWF4dyAgPSBub3JtX21heHcoKTsKKwltYXhoICA9IG5vcm1fbWF4aCgpOworCisJZi0+Zm10LnBpeC5maWVsZCA9IGZpZWxkOworCWlmIChmLT5mbXQucGl4LmhlaWdodCA8IDMyKQorCQlmLT5mbXQucGl4LmhlaWdodCA9IDMyOworCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IG1heGgpCisJCWYtPmZtdC5waXguaGVpZ2h0ID0gbWF4aDsKKwlpZiAoZi0+Zm10LnBpeC53aWR0aCA8IDQ4KQorCQlmLT5mbXQucGl4LndpZHRoID0gNDg7CisJaWYgKGYtPmZtdC5waXgud2lkdGggPiBtYXh3KQorCQlmLT5mbXQucGl4LndpZHRoID0gbWF4dzsKKwlmLT5mbXQucGl4LndpZHRoICY9IH4weDAzOworCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0KKwkJKGYtPmZtdC5waXgud2lkdGggKiBmbXQtPmRlcHRoKSA+PiAzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10X2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCB2aXVfZmggKmZoID0gcHJpdjsKKwlpbnQgcmV0OworCisJcmV0ID0gdmlkaW9jX3RyeV9mbXRfY2FwKGZpbGUsIGZoLCBmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZoLT5mbXQgICAgICAgICAgID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwlmaC0+d2lkdGggICAgICAgICA9IGYtPmZtdC5waXgud2lkdGg7CisJZmgtPmhlaWdodCAgICAgICAgPSBmLT5mbXQucGl4LmhlaWdodDsKKwlmaC0+c2l6ZWltYWdlICAgICA9IGYtPmZtdC5waXguc2l6ZWltYWdlOworCWZoLT52Yl92aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwlmaC0+dHlwZSAgICAgICAgICA9IGYtPnR5cGU7CisJZHByaW50aygxLCAic2V0IHRvIHBpeGVsZm9ybWF0ICclNC42cydcbiIsIChjaGFyICopJmZoLT5mbXQtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZtdF9vdmVybGF5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHZpdV9maCAqZmggPSBwcml2OworCisJZi0+Zm10LndpbiA9IGZoLT53aW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X3ByZXZpZXcoc3RydWN0IHZpdV9kZXYgKmRldiwgc3RydWN0IHY0bDJfd2luZG93ICp3aW4pCit7CisJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCWludCBtYXh3LCBtYXhoOworCisJaWYgKGRldi0+b3ZidWYuYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGV2LT5vdmZtdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAod2luLT53LndpZHRoIDwgNDggfHwgd2luLT53LmhlaWdodCA8IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpZWxkID0gd2luLT5maWVsZDsKKwltYXh3ICA9IGRldi0+Y3JvcF9jdXJyZW50LndpZHRoOworCW1heGggID0gZGV2LT5jcm9wX2N1cnJlbnQuaGVpZ2h0OworCisJaWYgKGZpZWxkID09IFY0TDJfRklFTERfQU5ZKSB7CisJCWZpZWxkID0gKHdpbi0+dy5oZWlnaHQgPiBtYXhoLzIpCisJCQk/IFY0TDJfRklFTERfSU5URVJMQUNFRAorCQkJOiBWNEwyX0ZJRUxEX1RPUDsKKwl9CisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgVjRMMl9GSUVMRF9UT1A6CisJY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKKwkJbWF4aCA9IG1heGggLyAyOworCQlicmVhazsKKwljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2luLT5maWVsZCA9IGZpZWxkOworCWlmICh3aW4tPncud2lkdGggPiBtYXh3KQorCQl3aW4tPncud2lkdGggPSBtYXh3OworCWlmICh3aW4tPncuaGVpZ2h0ID4gbWF4aCkKKwkJd2luLT53LmhlaWdodCA9IG1heGg7CisJcmV0dXJuIDA7Cit9CisKK2lubGluZSB2b2lkIHZpdV9hY3RpdmF0ZV9vdmVybGF5KHN0cnVjdCB2aXVfcmVnICp2aXVfcmVnKQoreworCXN0cnVjdCB2aXVfcmVnICp2ciA9IHZpdV9yZWc7CisKKwlvdXRfYmUzMigmdnItPmZpZWxkX2Jhc2VfYWRkciwgcmVnX3ZhbC5maWVsZF9iYXNlX2FkZHIpOworCW91dF9iZTMyKCZ2ci0+ZG1hX2luYywgcmVnX3ZhbC5kbWFfaW5jKTsKKwlvdXRfYmUzMigmdnItPnBpY3R1cmVfY291bnQsIHJlZ192YWwucGljdHVyZV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgdml1X3N0YXJ0X3ByZXZpZXcoc3RydWN0IHZpdV9kZXYgKmRldiwgc3RydWN0IHZpdV9maCAqZmgpCit7CisJaW50IGJwcDsKKworCWRwcmludGsoMSwgIiVzICVkeCVkICVzXG4iLCBfX2Z1bmNfXywKKwkJZmgtPndpbi53LndpZHRoLCBmaC0+d2luLncuaGVpZ2h0LCBkZXYtPm92Zm10LT5uYW1lKTsKKworCXJlZ192YWwuc3RhdHVzX2NmZyA9IDA7CisKKwkvKiBzZXR1cCB3aW5kb3cgKi8KKwlyZWdfdmFsLnBpY3R1cmVfY291bnQgPSAoZmgtPndpbi53LmhlaWdodCAvIDIpIDw8IDE2IHwKKwkJCQlmaC0+d2luLncud2lkdGg7CisKKwkvKiBzZXR1cCBjb2xvciBkZXB0aCBhbmQgZG1hIGluY3JlbWVudCAqLworCWJwcCA9IGRldi0+b3ZmbXQtPmRlcHRoIC8gODsKKwlzd2l0Y2ggKGJwcCkgeworCWNhc2UgMjoKKwkJcmVnX3ZhbC5zdGF0dXNfY2ZnICY9IH5NT0RFXzMyQklUOworCQlyZWdfdmFsLmRtYV9pbmMgPSBmaC0+d2luLncud2lkdGggKiAyOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJlZ192YWwuc3RhdHVzX2NmZyB8PSBNT0RFXzMyQklUOworCQlyZWdfdmFsLmRtYV9pbmMgPSBmaC0+d2luLncud2lkdGggKiA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDAsICJkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGNvbG9yIGRlcHRoKCVkKVxuIiwKKwkJCWJwcCAqIDgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXYtPm92ZmllbGQgPSBmaC0+d2luLmZpZWxkOworCWlmICghVjRMMl9GSUVMRF9IQVNfQk9USChkZXYtPm92ZmllbGQpKQorCQlyZWdfdmFsLmRtYV9pbmMgPSAwOworCisJcmVnX3ZhbC5zdGF0dXNfY2ZnIHw9IERNQV9BQ1QgfCBJTlRfRE1BX0VORF9FTiB8IElOVF9GSUVMRF9FTjsKKworCS8qIHNldHVwIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG92ZXJsYXkgYnVmZmVyICovCisJcmVnX3ZhbC5maWVsZF9iYXNlX2FkZHIgPSAodTMyKWRldi0+b3ZidWYuYmFzZTsKKworCWRldi0+b3ZlbmFibGUgPSAxOworCXZpdV9hY3RpdmF0ZV9vdmVybGF5KGRldi0+dnIpOworCisJLyogc3RhcnQgZG1hICovCisJdml1X3N0YXJ0X2RtYShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZtdF9vdmVybGF5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHZpdV9maCAgKmZoICA9IHByaXY7CisJc3RydWN0IHZpdV9kZXYgKmRldiA9IChzdHJ1Y3Qgdml1X2RldiAqKWZoLT5kZXY7CisJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CisJaW50IGVycjsKKworCWVyciA9IHZlcmlmeV9wcmV2aWV3KGRldiwgJmYtPmZtdC53aW4pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCWZoLT53aW4gPSBmLT5mbXQud2luOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKKwl2aXVfc3RhcnRfcHJldmlldyhkZXYsIGZoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY190cnlfZm10X292ZXJsYXkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHZpZGlvY19nX2ZidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICphcmcpCit7CisJc3RydWN0IHZpdV9maCAgKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgdml1X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7CisKKwkqZmIgPSBkZXYtPm92YnVmOworCWZiLT5jYXBhYmlsaXR5ID0gVjRMMl9GQlVGX0NBUF9MSVNUX0NMSVBQSU5HOworCXJldHVybiAwOworfQorCitpbnQgdmlkaW9jX3NfZmJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmFyZykKK3sKKwlzdHJ1Y3Qgdml1X2ZoICAqZmggPSBwcml2OworCXN0cnVjdCB2aXVfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYiA9IGFyZzsKKwlzdHJ1Y3Qgdml1X2ZtdCAqZm10OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogY2hlY2sgYXJncyAqLworCWZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZmItPmZtdC5waXhlbGZvcm1hdCk7CisJaWYgKGZtdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9rLCBhY2NlcHQgaXQgKi8KKwlkZXYtPm92YnVmID0gKmZiOworCWRldi0+b3ZmbXQgPSBmbXQ7CisJaWYgKGRldi0+b3ZidWYuZm10LmJ5dGVzcGVybGluZSA9PSAwKSB7CisJCWRldi0+b3ZidWYuZm10LmJ5dGVzcGVybGluZSA9CisJCQlkZXYtPm92YnVmLmZtdC53aWR0aCAqIGZtdC0+ZGVwdGggLyA4OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKK3sKKwlzdHJ1Y3Qgdml1X2ZoICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZmgtPnZiX3ZpZHEsIHApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB2aXVfZmggKmZoID0gcHJpdjsKKworCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPnZiX3ZpZHEsIHApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IHZpdV9maCAqZmggPSBwcml2OworCisJcmV0dXJuIHZpZGVvYnVmX3FidWYoJmZoLT52Yl92aWRxLCBwKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKK3sKKwlzdHJ1Y3Qgdml1X2ZoICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBwLAorCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCB2aXVfZmggKmZoID0gcHJpdjsKKworCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmaC0+dHlwZSAhPSBpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCB2aXVfZmggICpmaCA9IHByaXY7CisKKwlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmgtPnR5cGUgIT0gaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmJfdmlkcSk7Cit9CisKKyNkZWZpbmUgZGVjb2Rlcl9jYWxsKHZpdSwgbywgZiwgYXJncy4uLikgXAorCXY0bDJfc3ViZGV2X2NhbGwodml1LT5kZWNvZGVyLCBvLCBmLCAjI2FyZ3MpCisKK3N0YXRpYyBpbnQgdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaWQpCit7CisJc3RydWN0IHZpdV9maCAqZmggPSBwcml2OworCisJZGVjb2Rlcl9jYWxsKGZoLT5kZXYsIGNvcmUsIHNfc3RkLCAqaWQpOworCXJldHVybiAwOworfQorCisvKiBvbmx5IG9uZSBpbnB1dCBpbiB0aGlzIGRyaXZlciAqLworc3RhdGljIGludCB2aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfaW5wdXQgKmlucCkKK3sKKwlzdHJ1Y3Qgdml1X2ZoICpmaCA9IHByaXY7CisKKwlpZiAoaW5wLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJaW5wLT5zdGQgPSBmaC0+ZGV2LT52ZGV2LT50dm5vcm1zOworCXN0cmNweShpbnAtPm5hbWUsICJDYW1lcmEiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IHZpdV9maCAqZmggPSBwcml2OworCisJaWYgKGkgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlY29kZXJfY2FsbChmaC0+ZGV2LCB2aWRlbywgc19yb3V0aW5nLCBpLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ29udHJvbHMgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml1X3FjdHJsKTsgaSsrKSB7CisJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHZpdV9xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHZpdV9xY3RybFtpXSksIHNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZpdV9xY3RybCk7IGkrKykgeworCQlpZiAoY3RybC0+aWQgPT0gdml1X3FjdHJsW2ldLmlkKSB7CisJCQljdHJsLT52YWx1ZSA9IHFjdGxfcmVnc1tpXTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2aXVfcWN0cmwpOyBpKyspIHsKKwkJaWYgKGN0cmwtPmlkID09IHZpdV9xY3RybFtpXS5pZCkgeworCQkJaWYgKGN0cmwtPnZhbHVlIDwgdml1X3FjdHJsW2ldLm1pbmltdW0KKwkJCQl8fCBjdHJsLT52YWx1ZSA+IHZpdV9xY3RybFtpXS5tYXhpbXVtKQorCQkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCXFjdGxfcmVnc1tpXSA9IGN0cmwtPnZhbHVlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2lubGluZSB2b2lkIHZpdV9hY3RpdmF0ZV9uZXh0X2J1ZihzdHJ1Y3Qgdml1X2RldiAqZGV2LAorCQkJCXN0cnVjdCB2aXVfZG1hcXVldWUgKnZpdXEpCit7CisJc3RydWN0IHZpdV9kbWFxdWV1ZSAqdmlkcSA9IHZpdXE7CisJc3RydWN0IHZpdV9idWYgKmJ1ZjsKKworCS8qIGxhdW5jaCBhbm90aGVyIERNQSBvcGVyYXRpb24gZm9yIGFuIGFjdGl2ZS9xdWV1ZWQgYnVmZmVyICovCisJaWYgKCFsaXN0X2VtcHR5KCZ2aWRxLT5hY3RpdmUpKSB7CisJCWJ1ZiA9IGxpc3RfZW50cnkodmlkcS0+YWN0aXZlLm5leHQsIHN0cnVjdCB2aXVfYnVmLAorCQkJCQl2Yi5xdWV1ZSk7CisJCWRwcmludGsoMSwgInN0YXJ0IGFub3RoZXIgcXVldWVkIGJ1ZmZlcjogMHglcFxuIiwgYnVmKTsKKwkJYnVmZmVyX2FjdGl2YXRlKGRldiwgYnVmKTsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZ2aWRxLT5xdWV1ZWQpKSB7CisJCWJ1ZiA9IGxpc3RfZW50cnkodmlkcS0+cXVldWVkLm5leHQsIHN0cnVjdCB2aXVfYnVmLAorCQkJCQl2Yi5xdWV1ZSk7CisJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKworCQlkcHJpbnRrKDEsICJzdGFydCBhbm90aGVyIHF1ZXVlZCBidWZmZXI6IDB4JXBcbiIsIGJ1Zik7CisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZ2aWRxLT5hY3RpdmUpOworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQlidWZmZXJfYWN0aXZhdGUoZGV2LCBidWYpOworCX0KK30KKworaW5saW5lIHZvaWQgdml1X2RlZmF1bHRfc2V0dGluZ3Moc3RydWN0IHZpdV9yZWcgKnZpdV9yZWcpCit7CisJc3RydWN0IHZpdV9yZWcgKnZyID0gdml1X3JlZzsKKworCW91dF9iZTMyKCZ2ci0+bHVtaW5hbmNlLCAweDk1MTJBMjU0KTsKKwlvdXRfYmUzMigmdnItPmNocm9tYV9yLCAweDAzMzEwMDAwKTsKKwlvdXRfYmUzMigmdnItPmNocm9tYV9nLCAweDA2NjAwRjM4KTsKKwlvdXRfYmUzMigmdnItPmNocm9tYV9iLCAweDAwMDAwNDA5KTsKKwlvdXRfYmUzMigmdnItPmFscGhhLCAweDAwMDAwMGZmKTsKKwlvdXRfYmUzMigmdnItPnJlcV9hbGFybSwgMHgwMDAwMDA5MCk7CisJZHByaW50aygxLCAic3RhdHVzIHJlZzogMHglMDh4LCBmaWVsZCBiYXNlOiAweCUwOHhcbiIsCisJCWluX2JlMzIoJnZyLT5zdGF0dXNfY2ZnKSwgaW5fYmUzMigmdnItPmZpZWxkX2Jhc2VfYWRkcikpOworfQorCitzdGF0aWMgdm9pZCB2aXVfb3ZlcmxheV9pbnRyKHN0cnVjdCB2aXVfZGV2ICpkZXYsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IHZpdV9yZWcgKnZyID0gZGV2LT52cjsKKworCWlmIChzdGF0dXMgJiBJTlRfRE1BX0VORF9TVEFUVVMpCisJCWRldi0+ZG1hX2RvbmUgPSAxOworCisJaWYgKHN0YXR1cyAmIElOVF9GSUVMRF9TVEFUVVMpIHsKKwkJaWYgKGRldi0+ZG1hX2RvbmUpIHsKKwkJCXUzMiBhZGRyID0gcmVnX3ZhbC5maWVsZF9iYXNlX2FkZHI7CisKKwkJCWRldi0+ZG1hX2RvbmUgPSAwOworCQkJaWYgKHN0YXR1cyAmIEZJRUxEX05PKQorCQkJCWFkZHIgKz0gcmVnX3ZhbC5kbWFfaW5jOworCisJCQlvdXRfYmUzMigmdnItPmZpZWxkX2Jhc2VfYWRkciwgYWRkcik7CisJCQlvdXRfYmUzMigmdnItPmRtYV9pbmMsIHJlZ192YWwuZG1hX2luYyk7CisJCQlvdXRfYmUzMigmdnItPnN0YXR1c19jZmcsCisJCQkJIChzdGF0dXMgJiAweGZmYzBmZmZmKSB8CisJCQkJIChzdGF0dXMgJiBJTlRfQUxMX1NUQVRVUykgfAorCQkJCSByZWdfdmFsLnN0YXR1c19jZmcpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElOVF9WU1lOQ19TVEFUVVMpIHsKKwkJCW91dF9iZTMyKCZ2ci0+c3RhdHVzX2NmZywKKwkJCQkgKHN0YXR1cyAmIDB4ZmZjMGZmZmYpIHwKKwkJCQkgKHN0YXR1cyAmIElOVF9BTExfU1RBVFVTKSB8CisJCQkJIHJlZ192YWwuc3RhdHVzX2NmZyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZpdV9jYXB0dXJlX2ludHIoc3RydWN0IHZpdV9kZXYgKmRldiwgdTMyIHN0YXR1cykKK3sKKwlzdHJ1Y3Qgdml1X2RtYXF1ZXVlICp2aWRxID0gJmRldi0+dmlkcTsKKwlzdHJ1Y3Qgdml1X3JlZyAqdnIgPSBkZXYtPnZyOworCXN0cnVjdCB2aXVfYnVmICpidWY7CisJaW50IGZpZWxkX251bTsKKwlpbnQgbmVlZF90d287CisJaW50IGRtYV9kb25lID0gMDsKKworCWZpZWxkX251bSA9IHN0YXR1cyAmIEZJRUxEX05POworCW5lZWRfdHdvID0gVjRMMl9GSUVMRF9IQVNfQk9USChkZXYtPmNhcGZpZWxkKTsKKworCWlmIChzdGF0dXMgJiBJTlRfRE1BX0VORF9TVEFUVVMpIHsKKwkJZG1hX2RvbmUgPSAxOworCQlpZiAoKChmaWVsZF9udW0gPT0gMCkgJiYgKGRldi0+ZmllbGQgPT0gMCkpIHx8CisJCSAgICAoZmllbGRfbnVtICYmIChkZXYtPmZpZWxkID09IDEpKSkKKwkJCWRldi0+ZmllbGQrKzsKKwl9CisKKwlpZiAoc3RhdHVzICYgSU5UX0ZJRUxEX1NUQVRVUykgeworCQlkcHJpbnRrKDEsICJpcnE6IGZpZWxkICVkLCBkb25lICVkXG4iLAorCQkJISFmaWVsZF9udW0sIGRtYV9kb25lKTsKKwkJaWYgKHVubGlrZWx5KGRldi0+Zmlyc3QpKSB7CisJCQlpZiAoZmllbGRfbnVtID09IDApIHsKKwkJCQlkZXYtPmZpcnN0ID0gMDsKKwkJCQlkcHJpbnRrKDEsICJhY3RpdmF0ZSBmaXJzdCBidWZcbiIpOworCQkJCXZpdV9hY3RpdmF0ZV9uZXh0X2J1ZihkZXYsIHZpZHEpOworCQkJfSBlbHNlCisJCQkJZHByaW50aygxLCAid2FpdCBmaWVsZCAwXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHNldHVwIGJ1ZmZlciBhZGRyZXNzIGZvciBuZXh0IGRtYSBvcGVyYXRpb24gKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZ2aWRxLT5hY3RpdmUpKSB7CisJCQl1MzIgYWRkciA9IHJlZ192YWwuZmllbGRfYmFzZV9hZGRyOworCisJCQlpZiAoZmllbGRfbnVtICYmIG5lZWRfdHdvKSB7CisJCQkJYWRkciArPSByZWdfdmFsLmRtYV9pbmM7CisJCQkJZHByaW50aygxLCAiZmllbGQgMSwgMHglbHgsIGRldiBmaWVsZCAlZFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpYWRkciwgZGV2LT5maWVsZCk7CisJCQl9CisJCQlvdXRfYmUzMigmdnItPmZpZWxkX2Jhc2VfYWRkciwgYWRkcik7CisJCQlvdXRfYmUzMigmdnItPmRtYV9pbmMsIHJlZ192YWwuZG1hX2luYyk7CisJCQlvdXRfYmUzMigmdnItPnN0YXR1c19jZmcsCisJCQkJIChzdGF0dXMgJiAweGZmYzBmZmZmKSB8CisJCQkJIChzdGF0dXMgJiBJTlRfQUxMX1NUQVRVUykgfAorCQkJCSByZWdfdmFsLnN0YXR1c19jZmcpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGRtYV9kb25lICYmIGZpZWxkX251bSAmJiAoZGV2LT5maWVsZCA9PSAyKSkgeworCQlkZXYtPmZpZWxkID0gMDsKKwkJYnVmID0gbGlzdF9lbnRyeSh2aWRxLT5hY3RpdmUubmV4dCwKKwkJCQkgc3RydWN0IHZpdV9idWYsIHZiLnF1ZXVlKTsKKwkJZHByaW50aygxLCAidml1LzA6IFslcC8lZF0gMHglbHgvMHglbHg6IGRtYSBjb21wbGV0ZVxuIiwKKwkJCWJ1ZiwgYnVmLT52Yi5pLAorCQkJKHVuc2lnbmVkIGxvbmcpdmlkZW9idWZfdG9fZG1hX2NvbnRpZygmYnVmLT52YiksCisJCQkodW5zaWduZWQgbG9uZylpbl9iZTMyKCZ2ci0+ZmllbGRfYmFzZV9hZGRyKSk7CisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJ1Zi0+dmIuZG9uZSkpIHsKKwkJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfRE9ORTsKKwkJCWJ1Zi0+dmIuZmllbGRfY291bnQrKzsKKwkJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJCX0KKwkJLyogYWN0aXZhdGUgbmV4dCBkbWEgYnVmZmVyICovCisJCXZpdV9hY3RpdmF0ZV9uZXh0X2J1ZihkZXYsIHZpZHEpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHZpdV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgdml1X2RldiAqZGV2ICA9IChzdHJ1Y3Qgdml1X2RldiAqKWRldl9pZDsKKwlzdHJ1Y3Qgdml1X3JlZyAqdnIgPSBkZXYtPnZyOworCXUzMiBzdGF0dXM7CisJdTMyIGVycm9yOworCisJc3RhdHVzID0gaW5fYmUzMigmdnItPnN0YXR1c19jZmcpOworCisJaWYgKHN0YXR1cyAmIElOVF9FUlJPUl9TVEFUVVMpIHsKKwkJZGV2LT5pcnFzLmVycm9yX2lycSsrOworCQllcnJvciA9IHN0YXR1cyAmIEVSUl9NQVNLOworCQlpZiAoZXJyb3IpCisJCQlkcHJpbnRrKDEsICJFcnI6IGVycm9yKCVkKSwgdGltZXM6JWQhXG4iLAorCQkJCWVycm9yID4+IDQsIGRldi0+aXJxcy5lcnJvcl9pcnEpOworCQkvKiBDbGVhciBpbnRlcnJ1cHQgZXJyb3IgYml0IGFuZCBlcnJvciBmbGFncyAqLworCQlvdXRfYmUzMigmdnItPnN0YXR1c19jZmcsCisJCQkgKHN0YXR1cyAmIDB4ZmZjMGZmZmYpIHwgSU5UX0VSUk9SX1NUQVRVUyk7CisJfQorCisJaWYgKHN0YXR1cyAmIElOVF9ETUFfRU5EX1NUQVRVUykgeworCQlkZXYtPmlycXMuZG1hX2VuZF9pcnErKzsKKwkJZGV2LT5kbWFfZG9uZSA9IDE7CisJCWRwcmludGsoMiwgIlZJVSBETUEgZW5kIGludGVycnVwdCB0aW1lczogJWRcbiIsCisJCQkJCWRldi0+aXJxcy5kbWFfZW5kX2lycSk7CisJfQorCisJaWYgKHN0YXR1cyAmIElOVF9IU1lOQ19TVEFUVVMpCisJCWRldi0+aXJxcy5oc3luY19pcnErKzsKKworCWlmIChzdGF0dXMgJiBJTlRfRklFTERfU1RBVFVTKSB7CisJCWRldi0+aXJxcy5maWVsZF9pcnErKzsKKwkJZHByaW50aygyLCAiVklVIGZpZWxkIGludGVycnVwdCB0aW1lczogJWRcbiIsCisJCQkJCWRldi0+aXJxcy5maWVsZF9pcnEpOworCX0KKworCWlmIChzdGF0dXMgJiBJTlRfVlNUQVJUX1NUQVRVUykKKwkJZGV2LT5pcnFzLnZzdGFydF9pcnErKzsKKworCWlmIChzdGF0dXMgJiBJTlRfVlNZTkNfU1RBVFVTKSB7CisJCWRldi0+aXJxcy52c3luY19pcnErKzsKKwkJZHByaW50aygyLCAiVklVIHZzeW5jIGludGVycnVwdCB0aW1lczogJWRcbiIsCisJCQlkZXYtPmlycXMudnN5bmNfaXJxKTsKKwl9CisKKwkvKiBjbGVhciBhbGwgcGVuZGluZyBpcnFzICovCisJc3RhdHVzID0gaW5fYmUzMigmdnItPnN0YXR1c19jZmcpOworCW91dF9iZTMyKCZ2ci0+c3RhdHVzX2NmZywKKwkJIChzdGF0dXMgJiAweGZmYzBmZmZmKSB8IChzdGF0dXMgJiBJTlRfQUxMX1NUQVRVUykpOworCisJaWYgKGRldi0+b3ZlbmFibGUpIHsKKwkJdml1X292ZXJsYXlfaW50cihkZXYsIHN0YXR1cyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBDYXB0dXJlIG1vZGUgKi8KKwl2aXVfY2FwdHVyZV9pbnRyKGRldiwgc3RhdHVzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgZm9yIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIGludCB2aXVfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3Qgdml1X2RldiAqZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHZpdV9maCAqZmg7CisJc3RydWN0IHZpdV9yZWcgKnZyOworCWludCBtaW5vciA9IHZkZXYtPm1pbm9yOworCXUzMiBzdGF0dXNfY2ZnOworCWludCBpOworCisJZHByaW50aygxLCAidml1OiBvcGVuIChtaW5vcj0lZClcbiIsIG1pbm9yKTsKKworCWRldi0+dXNlcnMrKzsKKwlpZiAoZGV2LT51c2VycyA+IDEpIHsKKwkJZGV2LT51c2Vycy0tOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXZyID0gZGV2LT52cjsKKworCWRwcmludGsoMSwgIm9wZW4gbWlub3I9JWQgdHlwZT0lcyB1c2Vycz0lZFxuIiwgbWlub3IsCisJCXY0bDJfdHlwZV9uYW1lc1tWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVdLCBkZXYtPnVzZXJzKTsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmICghZmgpIHsKKwkJZGV2LT51c2Vycy0tOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKKwlmaC0+ZGV2ID0gZGV2OworCisJZmgtPnR5cGUgICAgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWZoLT5mbXQgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoVjRMMl9QSVhfRk1UX1JHQjMyKTsKKwlmaC0+d2lkdGggICAgPSBub3JtX21heHcoKTsKKwlmaC0+aGVpZ2h0ICAgPSBub3JtX21heGgoKTsKKwlkZXYtPmNyb3BfY3VycmVudC53aWR0aCAgPSBmaC0+d2lkdGg7CisJZGV2LT5jcm9wX2N1cnJlbnQuaGVpZ2h0ID0gZmgtPmhlaWdodDsKKworCS8qIFB1dCBhbGwgY29udHJvbHMgYXQgYSBzYW5lIHN0YXRlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml1X3FjdHJsKTsgaSsrKQorCQlxY3RsX3JlZ3NbaV0gPSB2aXVfcWN0cmxbaV0uZGVmYXVsdF92YWx1ZTsKKworCWRwcmludGsoMSwgIk9wZW46IGZoPTB4JTA4bHgsIGRldj0weCUwOGx4LCBkZXYtPnZpZHE9MHglMDhseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpZmgsICh1bnNpZ25lZCBsb25nKWRldiwKKwkJKHVuc2lnbmVkIGxvbmcpJmRldi0+dmlkcSk7CisJZHByaW50aygxLCAiT3BlbjogbGlzdF9lbXB0eSBxdWV1ZWQ9JWRcbiIsCisJCWxpc3RfZW1wdHkoJmRldi0+dmlkcS5xdWV1ZWQpKTsKKwlkcHJpbnRrKDEsICJPcGVuOiBsaXN0X2VtcHR5IGFjdGl2ZT0lZFxuIiwKKwkJbGlzdF9lbXB0eSgmZGV2LT52aWRxLmFjdGl2ZSkpOworCisJdml1X2RlZmF1bHRfc2V0dGluZ3ModnIpOworCisJc3RhdHVzX2NmZyA9IGluX2JlMzIoJnZyLT5zdGF0dXNfY2ZnKTsKKwlvdXRfYmUzMigmdnItPnN0YXR1c19jZmcsCisJCSBzdGF0dXNfY2ZnICYgfihJTlRfVlNZTkNfRU4gfCBJTlRfSFNZTkNfRU4gfAorCQkJCUlOVF9GSUVMRF9FTiB8IElOVF9WU1RBUlRfRU4gfAorCQkJCUlOVF9ETUFfRU5EX0VOIHwgSU5UX0VSUk9SX0VOIHwgSU5UX0VDQ19FTikpOworCisJc3RhdHVzX2NmZyA9IGluX2JlMzIoJnZyLT5zdGF0dXNfY2ZnKTsKKwlvdXRfYmUzMigmdnItPnN0YXR1c19jZmcsIHN0YXR1c19jZmcgfCBJTlRfQUxMX1NUQVRVUyk7CisKKwlzcGluX2xvY2tfaW5pdCgmZmgtPnZicV9sb2NrKTsKKwl2aWRlb2J1Zl9xdWV1ZV9kbWFfY29udGlnX2luaXQoJmZoLT52Yl92aWRxLCAmdml1X3ZpZGVvX3FvcHMsCisJCQkJICAgICAgIGRldi0+ZGV2LCAmZmgtPnZicV9sb2NrLAorCQkJCSAgICAgICBmaC0+dHlwZSwgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZpdV9idWYpLCBmaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZpdV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aXVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2aXVfZGV2ICpkZXYgPSBmaC0+ZGV2OworCWludCByZXQgPSAwOworCisJZHByaW50aygyLCAiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoZGV2LT5vdmVuYWJsZSkKKwkJZGV2LT5vdmVuYWJsZSA9IDA7CisKKwlpZiAoZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCXZpdV9zdGFydF9kbWEoZGV2KTsKKwkJcmV0ID0gdmlkZW9idWZfcmVhZF9zdHJlYW0oJmZoLT52Yl92aWRxLCBkYXRhLCBjb3VudCwKKwkJCQlwcG9zLCAwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHZpdV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHZpdV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxID0gJmZoLT52Yl92aWRxOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAhPSBmaC0+dHlwZSkKKwkJcmV0dXJuIFBPTExFUlI7CisKKwlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgcSwgd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgdml1X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpdV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpdV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IG1pbm9yID0gdmlkZW9fZGV2ZGF0YShmaWxlKS0+bWlub3I7CisKKwl2aXVfc3RvcF9kbWEoZGV2KTsKKwl2aWRlb2J1Zl9zdG9wKCZmaC0+dmJfdmlkcSk7CisKKwlrZnJlZShmaCk7CisKKwlkZXYtPnVzZXJzLS07CisJZHByaW50aygxLCAiY2xvc2UgKG1pbm9yPSVkLCB1c2Vycz0lZClcbiIsCisJCW1pbm9yLCBkZXYtPnVzZXJzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2aXVfcmVzZXQoc3RydWN0IHZpdV9yZWcgKnJlZykKK3sKKwlvdXRfYmUzMigmcmVnLT5zdGF0dXNfY2ZnLCAwKTsKKwlvdXRfYmUzMigmcmVnLT5sdW1pbmFuY2UsIDB4OTUxMmEyNTQpOworCW91dF9iZTMyKCZyZWctPmNocm9tYV9yLCAweDAzMzEwMDAwKTsKKwlvdXRfYmUzMigmcmVnLT5jaHJvbWFfZywgMHgwNjYwMGYzOCk7CisJb3V0X2JlMzIoJnJlZy0+Y2hyb21hX2IsIDB4MDAwMDA0MDkpOworCW91dF9iZTMyKCZyZWctPmZpZWxkX2Jhc2VfYWRkciwgMCk7CisJb3V0X2JlMzIoJnJlZy0+ZG1hX2luYywgMCk7CisJb3V0X2JlMzIoJnJlZy0+cGljdHVyZV9jb3VudCwgMHgwMWUwMDJkMCk7CisJb3V0X2JlMzIoJnJlZy0+cmVxX2FsYXJtLCAweDAwMDAwMDkwKTsKKwlvdXRfYmUzMigmcmVnLT5hbHBoYSwgMHgwMDAwMDBmZik7Cit9CisKK3N0YXRpYyBpbnQgdml1X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aXVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlkcHJpbnRrKDEsICJtbWFwIGNhbGxlZCwgdm1hPTB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXZtYSk7CisKKwlyZXQgPSB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZpZHEsIHZtYSk7CisKKwlkcHJpbnRrKDEsICJ2bWEgc3RhcnQ9MHglMDhseCwgc2l6ZT0lbGQsIHJldD0lZFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9zdGFydCwKKwkJKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9lbmQtKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9zdGFydCwKKwkJcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdml1X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHZpdV9vcGVuLAorCS5yZWxlYXNlCT0gdml1X3JlbGVhc2UsCisJLnJlYWQJCT0gdml1X3JlYWQsCisJLnBvbGwJCT0gdml1X3BvbGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwgLyogVjRMMiBpb2N0bCBoYW5kbGVyICovCisJLm1tYXAJCT0gdml1X21tYXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpdV9pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcAk9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgID0gdmlkaW9jX2VudW1fZm10LAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2NfZ19mbXRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICAgPSB2aWRpb2NfdHJ5X2ZtdF9jYXAsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwICAgICA9IHZpZGlvY19zX2ZtdF9jYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3ZlcmxheSA9IHZpZGlvY19lbnVtX2ZtdCwKKwkudmlkaW9jX2dfZm10X3ZpZF9vdmVybGF5ID0gdmlkaW9jX2dfZm10X292ZXJsYXksCisJLnZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5ID0gdmlkaW9jX3RyeV9mbXRfb3ZlcmxheSwKKwkudmlkaW9jX3NfZm10X3ZpZF9vdmVybGF5ID0gdmlkaW9jX3NfZm10X292ZXJsYXksCisJLnZpZGlvY19nX2ZidWYJICAgICAgPSB2aWRpb2NfZ19mYnVmLAorCS52aWRpb2Nfc19mYnVmCSAgICAgID0gdmlkaW9jX3NfZmJ1ZiwKKwkudmlkaW9jX3JlcWJ1ZnMgICAgICAgPSB2aWRpb2NfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmICAgICAgPSB2aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmICAgICAgICAgID0gdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiAgICAgICAgID0gdmlkaW9jX2RxYnVmLAorCS52aWRpb2Nfc19zdGQgICAgICAgICA9IHZpZGlvY19zX3N0ZCwKKwkudmlkaW9jX2VudW1faW5wdXQgICAgPSB2aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgICAgICAgPSB2aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICAgID0gdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX3N0cmVhbW9uICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgICAgID0gdmlkaW9jX3N0cmVhbW9mZiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpdV90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJPSAiRlNMIHZpdSIsCisJLmZvcHMJCT0gJnZpdV9mb3BzLAorCS5taW5vcgkJPSAtMSwKKwkuaW9jdGxfb3BzCT0gJnZpdV9pb2N0bF9vcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKworCS50dm5vcm1zICAgICAgICA9IFY0TDJfU1REX05UU0NfTSB8IFY0TDJfU1REX1BBTCwKKwkuY3VycmVudF9ub3JtICAgPSBWNEwyX1NURF9OVFNDX00sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aXVfb2ZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3Qgdml1X2RldiAqdml1X2RldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCByZXNvdXJjZSByOworCXN0cnVjdCB2aXVfcmVnIF9faW9tZW0gKnZpdV9yZWdzOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWQ7CisJaW50IHJldCwgdml1X2lycTsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob3AtPmRldi5vZl9ub2RlLCAwLCAmcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiQ2FuJ3QgcGFyc2UgZGV2aWNlIG5vZGUgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2aXVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAodml1X2lycSA9PSBOT19JUlEpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgIkVycm9yIHdoaWxlIG1hcHBpbmcgdGhlIGlycVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlcXVlc3QgbWVtIHJlZ2lvbiAqLworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJm9wLT5kZXYsIHIuc3RhcnQsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHZpdV9yZWcpLCBEUlZfTkFNRSkpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJLyogcmVtYXAgcmVnaXN0ZXJzICovCisJdml1X3JlZ3MgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHNpemVvZihzdHJ1Y3Qgdml1X3JlZykpOworCWlmICghdml1X3JlZ3MpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgIkNhbid0IG1hcCByZWdpc3RlciBzZXRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBQcmVwYXJlIG91ciBwcml2YXRlIHN0cnVjdHVyZSAqLworCXZpdV9kZXYgPSBkZXZtX2t6YWxsb2MoJm9wLT5kZXYsIHNpemVvZihzdHJ1Y3Qgdml1X2RldiksIEdGUF9BVE9NSUMpOworCWlmICghdml1X2RldikgeworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgcHJpdmF0ZSBzdHJ1Y3R1cmVcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwl2aXVfZGV2LT52ciA9IHZpdV9yZWdzOworCXZpdV9kZXYtPmlycSA9IHZpdV9pcnE7CisJdml1X2Rldi0+ZGV2ID0gJm9wLT5kZXY7CisKKwkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmdml1X2Rldi0+dmlkcS5hY3RpdmUpOworCUlOSVRfTElTVF9IRUFEKCZ2aXVfZGV2LT52aWRxLnF1ZXVlZCk7CisKKwkvKiBpbml0aWFsaXplIGxvY2tzICovCisJbXV0ZXhfaW5pdCgmdml1X2Rldi0+bG9jayk7CisKKwlzbnByaW50Zih2aXVfZGV2LT52NGwyX2Rldi5uYW1lLAorCQkgc2l6ZW9mKHZpdV9kZXYtPnY0bDJfZGV2Lm5hbWUpLCAiJXMiLCAiVklVIik7CisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIodml1X2Rldi0+ZGV2LCAmdml1X2Rldi0+djRsMl9kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJm9wLT5kZXYsICJ2NGwyX2RldmljZV9yZWdpc3RlcigpIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCWFkID0gaTJjX2dldF9hZGFwdGVyKDApOworCXZpdV9kZXYtPmRlY29kZXIgPSB2NGwyX2kyY19uZXdfc3ViZGV2KCZ2aXVfZGV2LT52NGwyX2RldiwgYWQsCisJCQkic2FhNzExNSIsICJzYWE3MTEzIiwgVklVX1ZJREVPX0RFQ09ERVJfQUREUiwgTlVMTCk7CisKKwl2aXVfZGV2LT52aWRxLnRpbWVvdXQuZnVuY3Rpb24gPSB2aXVfdmlkX3RpbWVvdXQ7CisJdml1X2Rldi0+dmlkcS50aW1lb3V0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpdml1X2RldjsKKwlpbml0X3RpbWVyKCZ2aXVfZGV2LT52aWRxLnRpbWVvdXQpOworCXZpdV9kZXYtPmZpcnN0ID0gMTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdmlkZW8gZGV2aWNlICovCisJdmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICh2ZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdmRldjsKKwl9CisKKwltZW1jcHkodmRldiwgJnZpdV90ZW1wbGF0ZSwgc2l6ZW9mKHZpdV90ZW1wbGF0ZSkpOworCisJdmRldi0+djRsMl9kZXYgPSAmdml1X2Rldi0+djRsMl9kZXY7CisKKwl2aXVfZGV2LT52ZGV2ID0gdmRldjsKKworCXZpZGVvX3NldF9kcnZkYXRhKHZpdV9kZXYtPnZkZXYsIHZpdV9kZXYpOworCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZpdV9kZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAocmV0IDwgMCkgeworCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh2aXVfZGV2LT52ZGV2KTsKKwkJZ290byBlcnJfdmRldjsKKwl9CisKKwkvKiBlbmFibGUgVklVIGNsb2NrICovCisJdml1X2Rldi0+Y2xrID0gY2xrX2dldCgmb3AtPmRldiwgInZpdV9jbGsiKTsKKwlpZiAoSVNfRVJSKHZpdV9kZXYtPmNsaykpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgImZhaWxlZCB0byBmaW5kIHRoZSBjbG9jayBtb2R1bGUhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfY2xrOworCX0gZWxzZSB7CisJCWNsa19lbmFibGUodml1X2Rldi0+Y2xrKTsKKwl9CisKKwkvKiByZXNldCBWSVUgbW9kdWxlICovCisJdml1X3Jlc2V0KHZpdV9kZXYtPnZyKTsKKworCS8qIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEodml1X2Rldi0+aXJxLCB2aXVfaW50ciwgMCwgInZpdSIsICh2b2lkICopdml1X2RldikpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgIlJlcXVlc3QgVklVIElSUSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWRldl9pbmZvKCZvcC0+ZGV2LCAiRnJlZXNjYWxlIFZJVSBWaWRlbyBDYXB0dXJlIEJvYXJkXG4iKTsKKwlyZXR1cm4gcmV0OworCitlcnJfaXJxOgorCWNsa19kaXNhYmxlKHZpdV9kZXYtPmNsayk7CisJY2xrX3B1dCh2aXVfZGV2LT5jbGspOworZXJyX2NsazoKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2aXVfZGV2LT52ZGV2KTsKK2Vycl92ZGV2OgorCWkyY19wdXRfYWRhcHRlcihhZCk7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcigmdml1X2Rldi0+djRsMl9kZXYpOworZXJyOgorCWlycV9kaXNwb3NlX21hcHBpbmcodml1X2lycSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdml1X29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3Qgdml1X2RldiAqZGV2ID0gY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3Qgdml1X2RldiwgdjRsMl9kZXYpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2RldiA9IGxpc3RfZW50cnkodjRsMl9kZXYtPnN1YmRldnMubmV4dCwKKwkJCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2LCBsaXN0KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCAodm9pZCAqKWRldik7CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyhkZXYtPmlycSk7CisKKwljbGtfZGlzYWJsZShkZXYtPmNsayk7CisJY2xrX3B1dChkZXYtPmNsayk7CisKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZkZXYpOworCWkyY19wdXRfYWRhcHRlcihjbGllbnQtPmFkYXB0ZXIpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHZpdV9zdXNwZW5kKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IHZpdV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZih2NGwyX2Rldiwgc3RydWN0IHZpdV9kZXYsIHY0bDJfZGV2KTsKKworCWNsa19kaXNhYmxlKGRldi0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aXVfcmVzdW1lKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCB2aXVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCB2aXVfZGV2LCB2NGwyX2Rldik7CisKKwljbGtfZW5hYmxlKGRldi0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogSW5pdGlhbGl6YXRpb24gYW5kIG1vZHVsZSBzdHVmZgorICovCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1MTJ4X3ZpdV9vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtdml1IiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1wYzUxMnhfdml1X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgdml1X29mX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUgPSB2aXVfb2ZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHZpdV9vZl9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gdml1X3N1c3BlbmQsCisJLnJlc3VtZSA9IHZpdV9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTEyeF92aXVfb2ZfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZpdV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdml1X29mX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2aXVfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ2aXVfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodml1X2luaXQpOworbW9kdWxlX2V4aXQodml1X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBWaWRlby1JbihWSVUpIik7CitNT0RVTEVfQVVUSE9SKCJIb25nanVuIENoZW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwppbmRleCA1ZDkyMGU1Li4yM2RiMGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCkBAIC0yNDYsNiArMjQ2LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zcGNhNTYxLgogCitjb25maWcgVVNCX0dTUENBX1NQQ0ExNTI4CisJdHJpc3RhdGUgIlNQQ0ExNTI4IFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFNQQ0ExNTI4IGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3NwY2ExNTI4LgorCiBjb25maWcgVVNCX0dTUENBX1NROTA1CiAJdHJpc3RhdGUgIlNRIFRlY2hub2xvZ2llcyBTUTkwNSBiYXNlZCBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCkBAIC0yNjQsNiArMjczLDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zcTkwNWMuCiAKK2NvbmZpZyBVU0JfR1NQQ0FfU1E5MzBYCisJdHJpc3RhdGUgIlNRIFRlY2hub2xvZ2llcyBTUTkzMFggYmFzZWQgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgU1E5MzBYIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3NxOTMweC4KKwogY29uZmlnIFVTQl9HU1BDQV9TVEswMTQKIAl0cmlzdGF0ZSAiU3ludGVrIERWNDAwMCAoU1RLMDE0KSBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQppbmRleCA2ZTRjZjFjLi5mNjYxNmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKQEAgLTIzLDggKzIzLDEwIEBACiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NQQ0E1MDYpICArPSBnc3BjYV9zcGNhNTA2Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU1BDQTUwOCkgICs9IGdzcGNhX3NwY2E1MDgubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TUENBNTYxKSAgKz0gZ3NwY2Ffc3BjYTU2MS5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1NQQ0ExNTI4KSArPSBnc3BjYV9zcGNhMTUyOC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NROTA1KSAgICArPSBnc3BjYV9zcTkwNS5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NROTA1QykgICArPSBnc3BjYV9zcTkwNWMubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TUTkzMFgpICAgKz0gZ3NwY2Ffc3E5MzB4Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU1VOUExVUykgICs9IGdzcGNhX3N1bnBsdXMubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TVEswMTQpICAgKz0gZ3NwY2Ffc3RrMDE0Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU1RWMDY4MCkgICs9IGdzcGNhX3N0djA2ODAubwpAQCAtNTgsOCArNjAsMTAgQEAKIGdzcGNhX3NwY2E1MDYtb2JqcyAgOj0gc3BjYTUwNi5vCiBnc3BjYV9zcGNhNTA4LW9ianMgIDo9IHNwY2E1MDgubwogZ3NwY2Ffc3BjYTU2MS1vYmpzICA6PSBzcGNhNTYxLm8KK2dzcGNhX3NwY2ExNTI4LW9ianMgOj0gc3BjYTE1MjgubwogZ3NwY2Ffc3E5MDUtb2JqcyAgICA6PSBzcTkwNS5vCiBnc3BjYV9zcTkwNWMtb2JqcyAgIDo9IHNxOTA1Yy5vCitnc3BjYV9zcTkzMHgtb2JqcyAgIDo9IHNxOTMweC5vCiBnc3BjYV9zdGswMTQtb2JqcyAgIDo9IHN0azAxNC5vCiBnc3BjYV9zdHYwNjgwLW9ianMgIDo9IHN0djA2ODAubwogZ3NwY2Ffc3VucGx1cy1vYmpzICA6PSBzdW5wbHVzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYwppbmRleCAxOWZlNmIyLi5kNmE3NTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvbmV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jCkBAIC00MSw3ICs0MSw3IEBACiAjZGVmaW5lIFFVQUxJVFlfTUFYIDYwCiAjZGVmaW5lIFFVQUxJVFlfREVGIDQwCiAKLQl1OCAqanBlZ19oZHI7CisJdTgganBlZ19oZHJbSlBFR19IRFJfU1pdOwogfTsKIAogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwpAQCAtODQ1LDkgKzg0NSw2IEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJLyogY3JlYXRlIHRoZSBKUEVHIGhlYWRlciAqLwotCXNkLT5qcGVnX2hkciA9IGttYWxsb2MoSlBFR19IRFJfU1osIEdGUF9LRVJORUwpOwotCWlmICghc2QtPmpwZWdfaGRyKQotCQlyZXR1cm4gLUVOT01FTTsKIAlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGdzcGNhX2Rldi0+aGVpZ2h0LCBnc3BjYV9kZXYtPndpZHRoLAogCQkJMHgyMik7CQkvKiBKUEVHIDQxMSAqLwogCWpwZWdfc2V0X3F1YWwoc2QtPmpwZWdfaGRyLCBzZC0+cXVhbGl0eSk7CkBAIC04NjIsMTEgKzg1OSw4IEBACiAvKiBjYWxsZWQgb24gc3RyZWFtb2ZmIHdpdGggYWx0IDAgYW5kIG9uIGRpc2Nvbm5lY3QgKi8KIHN0YXRpYyB2b2lkIHNkX3N0b3AwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJaW50IHJldHJ5ID0gNTA7CiAKLQlrZnJlZShzZC0+anBlZ19oZHIpOwotCiAJaWYgKCFnc3BjYV9kZXYtPnByZXNlbnQpCiAJCXJldHVybjsKIAlyZWdfd192YWwoZ3NwY2FfZGV2LCAweDAwMDAsIDB4MDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jcGlhMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jcGlhMS5jCmluZGV4IDU4YjY5NmYuLjM3NDdhMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY3BpYTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NwaWExLmMKQEAgLTE3NjAsMjIgKzE3NjAsMTkgQEAKIAkgICAgZGF0YVsyNV0gPT0gc2QtPnBhcmFtcy5yb2kuY29sRW5kICYmCiAJICAgIGRhdGFbMjZdID09IHNkLT5wYXJhbXMucm9pLnJvd1N0YXJ0ICYmCiAJICAgIGRhdGFbMjddID09IHNkLT5wYXJhbXMucm9pLnJvd0VuZCkgewotCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKKwkJdTggKmltYWdlOwogCiAJCWF0b21pY19zZXQoJnNkLT5jYW1fZXhwb3N1cmUsIGRhdGFbMzldICogMik7CiAJCWF0b21pY19zZXQoJnNkLT5mcHMsIGRhdGFbNDFdKTsKIAotCQlpZiAoZnJhbWUgPT0gTlVMTCkgewotCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7Ci0JCQlyZXR1cm47Ci0JCX0KLQogCQkvKiBDaGVjayBmb3IgcHJvcGVyIEVPRiBmb3IgbGFzdCBmcmFtZSAqLwotCQlpZiAoKGZyYW1lLT5kYXRhX2VuZCAtIGZyYW1lLT5kYXRhKSA+IDQgJiYKLQkJICAgIGZyYW1lLT5kYXRhX2VuZFstNF0gPT0gMHhmZiAmJgotCQkgICAgZnJhbWUtPmRhdGFfZW5kWy0zXSA9PSAweGZmICYmCi0JCSAgICBmcmFtZS0+ZGF0YV9lbmRbLTJdID09IDB4ZmYgJiYKLQkJICAgIGZyYW1lLT5kYXRhX2VuZFstMV0gPT0gMHhmZikKKwkJaW1hZ2UgPSBnc3BjYV9kZXYtPmltYWdlOworCQlpZiAoaW1hZ2UgIT0gTlVMTCAmJgorCQkgICAgZ3NwY2FfZGV2LT5pbWFnZV9sZW4gPiA0ICYmCisJCSAgICBpbWFnZVtnc3BjYV9kZXYtPmltYWdlX2xlbiAtIDRdID09IDB4ZmYgJiYKKwkJICAgIGltYWdlW2dzcGNhX2Rldi0+aW1hZ2VfbGVuIC0gM10gPT0gMHhmZiAmJgorCQkgICAgaW1hZ2VbZ3NwY2FfZGV2LT5pbWFnZV9sZW4gLSAyXSA9PSAweGZmICYmCisJCSAgICBpbWFnZVtnc3BjYV9kZXYtPmltYWdlX2xlbiAtIDFdID09IDB4ZmYpCiAJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKIAkJCQkJCU5VTEwsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW1pMjAyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1taTIwMjAuYwppbmRleCA3YzMxYjRmLi41Nzc4MmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW1pMjAyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtbWkyMDIwLmMKQEAgLTEsNiArMSw3IEBACiAvKiBTdWJkcml2ZXIgZm9yIHRoZSBHTDg2MCBjaGlwIHdpdGggdGhlIE1JMjAyMCBzZW5zb3IKLSAqIEF1dGhvciBPbGl2aWVyIExPUklOLCBmcm9tIEljZS9Tb3JvMjAwNSdzIGxvZ3MoQSksIEZyZXRfc2F3L0h1bGtpZSdzCi0gKiBsb2dzKEIpIGFuZCBUcmljaWQicyBsb2dzKEMpLiBXaXRoIHRoZSBoZWxwIG9mIEt5dHJpeC9CVUdhYnVuZG8vQmxhemVyY2lzdC4KKyAqIEF1dGhvciBPbGl2aWVyIExPUklOLCBmcm9tIGxvZ3MgYnkgSWNlbWFuL1Nvcm8yMDA1ICsgRnJldF9zYXcvSHVsa2llL1RyaWNpZAorICogd2l0aCB0aGUgaGVscCBvZiBLeXRyaXgvQlVHYWJ1bmRvL0JsYXplcmNpc3QuCisgKiBEcml2ZXIgYWNoaWV2ZWQgdGhhbmtzIHRvIGEgd2ViY2FtIGdpZnQgYnkgS3l0cml4LgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjAsNDcgKzIxLDcwIEBACiAKICNpbmNsdWRlICJnbDg2MC5oIgogCitzdGF0aWMgdTggZGF0X3diYWwxW10gPSB7MHg4YywgMHhhMiwgMHgwY307CisKIHN0YXRpYyB1OCBkYXRfYnJpZ2h0MVtdID0gezB4OGMsIDB4YTIsIDB4MDZ9Owogc3RhdGljIHU4IGRhdF9icmlnaHQzW10gPSB7MHg4YywgMHhhMSwgMHgwMn07CiBzdGF0aWMgdTggZGF0X2JyaWdodDRbXSA9IHsweDkwLCAweDAwLCAweDBmfTsKIHN0YXRpYyB1OCBkYXRfYnJpZ2h0NVtdID0gezB4OGMsIDB4YTEsIDB4MDN9Owogc3RhdGljIHU4IGRhdF9icmlnaHQ2W10gPSB7MHg5MCwgMHgwMCwgMHgwNX07CiAKLXN0YXRpYyB1OCBkYXRfZHVtbXkxW10gPSB7MHg5MCwgMHgwMCwgMHgwNn07Ci0vKnN0YXRpYyB1OCBkdW1teTJbXSA9IHsweDhjLCAweGExLCAweDAyfTsqLwotLypzdGF0aWMgdTggZHVtbXkzW10gPSB7MHg5MCwgMHgwMCwgMHgxZn07Ki8KLQogc3RhdGljIHU4IGRhdF9odmZsaXAxW10gPSB7MHg4YywgMHgyNywgMHgxOX07CiBzdGF0aWMgdTggZGF0X2h2ZmxpcDNbXSA9IHsweDhjLCAweDI3LCAweDNifTsKIHN0YXRpYyB1OCBkYXRfaHZmbGlwNVtdID0gezB4OGMsIDB4YTEsIDB4MDN9Owogc3RhdGljIHU4IGRhdF9odmZsaXA2W10gPSB7MHg5MCwgMHgwMCwgMHgwNn07CiAKK3N0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfbWlkZGxlX2h2ZmxpcF9sb3dbXSA9IHsKKwl7MHgzMywgIlx4OTBceDAwXHgwNiJ9LAorCXs2LCAiXHhmZlx4ZmZceGZmIn0sCisJezB4MzMsICJceDkwXHgwMFx4MDYifSwKKwl7NiwgIlx4ZmZceGZmXHhmZiJ9LAorCXsweDMzLCAiXHg5MFx4MDBceDA2In0sCisJezYsICJceGZmXHhmZlx4ZmYifSwKKwl7MHgzMywgIlx4OTBceDAwXHgwNiJ9LAorCXs2LCAiXHhmZlx4ZmZceGZmIn0sCit9OworCitzdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX21pZGRsZV9odmZsaXBfYmlnW10gPSB7CisJezB4MzMsICJceDhjXHhhMVx4MDMifSwgezB4MzMsICJceDkwXHgwMFx4MDEifSwgezB4MzMsICJceDhjXHhhMVx4MjAifSwKKwl7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceGE3XHgwMiJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LAorCXsxMDIsICJceGZmXHhmZlx4ZmYifSwKKwl7MHgzMywgIlx4OGNceGExXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMiJ9LCB7MHgzMywgIlx4OGNceGExXHgyMCJ9LAorCXsweDMzLCAiXHg5MFx4MDBceDcyIn0sIHsweDMzLCAiXHg4Y1x4YTdceDAyIn0sIHsweDMzLCAiXHg5MFx4MDBceDAxIn0sCit9OworCitzdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2VuZF9odmZsaXBbXSA9IHsKKwl7MHgzMywgIlx4OGNceGExXHgwMiJ9LCB7MHgzMywgIlx4OTBceDAwXHgxZiJ9LAorCXs2LCAiXHhmZlx4ZmZceGZmIn0sCisJezB4MzMsICJceDhjXHhhMVx4MDIifSwgezB4MzMsICJceDkwXHgwMFx4MWYifSwKKwl7NiwgIlx4ZmZceGZmXHhmZiJ9LAorCXsweDMzLCAiXHg4Y1x4YTFceDAyIn0sIHsweDMzLCAiXHg5MFx4MDBceDFmIn0sCisJezYsICJceGZmXHhmZlx4ZmYifSwKKwl7MHgzMywgIlx4OGNceGExXHgwMiJ9LCB7MHgzMywgIlx4OTBceDAwXHgxZiJ9LAorfTsKKwogc3RhdGljIHU4IGRhdF9mcmVxMVtdID0geyAweDhjLCAweGE0LCAweDA0IH07CiAKIHN0YXRpYyB1OCBkYXRfbXVsdGk1W10gPSB7IDB4OGMsIDB4YTEsIDB4MDMgfTsKIHN0YXRpYyB1OCBkYXRfbXVsdGk2W10gPSB7IDB4OTAsIDB4MDAsIDB4MDUgfTsKIAotc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2NvbW1vbjFbXSA9IHsKLQl7MHgwMDAwLCAweDAwMDB9LAotCXsxLCAweGZmZmZ9LCAvKiBtc2xlZXAoMzUpOyAqLwotCXsweDAwNmEsIDB4MDAwN30sIHsweDAwNjMsIDB4MDAwNn0sIHsweDAwNmEsIDB4MDAwZH0sIHsweDAwMDAsIDB4MDBjMH0sCi0JezB4MDAxMCwgMHgwMDEwfSwgezB4MDAwMywgMHgwMGMxfSwgezB4MDA0MiwgMHgwMGMyfSwgezB4MDAwNCwgMHgwMGQ4fSwKLQl7MHgwMDAwLCAweDAwNTh9LCB7MHgwMDAyLCAweDAwMDR9LCB7MHgwMDQxLCAweDAwMDB9LAorc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2luaXRfYXRfc3RhcnR1cFtdID0geworCXsweDAwMDAsIDB4MDAwMH0sIHsweDAwMTAsIDB4MDAxMH0sIHsweDAwMDgsIDB4MDBjMH0sIHsweDAwMDEsMHgwMGMxfSwKKwl7MHgwMDAxLCAweDAwYzJ9LCB7MHgwMDIwLCAweDAwMDZ9LCB7MHgwMDZhLCAweDAwMGR9LAorCXs1MywgMHhmZmZmfSwKKwl7MHgwMDQwLCAweDAwMDB9LCB7MHgwMDYzLCAweDAwMDZ9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2NvbW1vbjJbXSA9IHsKLQl7MHgwMDZhLCAweDAwMDd9LAotCXszNSwgMHhmZmZmfSwKLQl7MHgwMGVmLCAweDAwMDZ9LAotCXszNSwgMHhmZmZmfSwKLQl7MHgwMDZhLCAweDAwMGR9LAotCXszNSwgMHhmZmZmfSwKLQl7MHgwMDAwLCAweDAwYzB9LCB7MHgwMDEwLCAweDAwMTB9LCB7MHgwMDAzLCAweDAwYzF9LCB7MHgwMDQyLCAweDAwYzJ9LAorc3RhdGljIHN0cnVjdCB2YWxpZHggdGJsX2NvbW1vbl8wQltdID0geworCXsweDAwMDIsIDB4MDAwNH0sIHsweDAwNmEsIDB4MDAwN30sIHsweDAwZWYsIDB4MDAwNn0sIHsweDAwNmEsMHgwMDBkfSwKKwl7MHgwMDAwLCAweDAwYzB9LCB7MHgwMDEwLCAweDAwMTB9LCB7MHgwMDAzLCAweDAwYzF9LCB7MHgwMDQyLDB4MDBjMn0sCiAJezB4MDAwNCwgMHgwMGQ4fSwgezB4MDAwMCwgMHgwMDU4fSwgezB4MDA0MSwgMHgwMDAwfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfY29tbW9uM1tdID0gewotCXsweDMyLCAiXHgwMlx4MDBceDA4In0sIHsweDMzLCAiXHhmNFx4MDNceDFkIn0sCitzdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2NvbW1vbl8zQltdID0geworCXsweDMzLCAiXHg4Nlx4MjVceDAxIn0sIHsweDMzLCAiXHg4Nlx4MjVceDAwIn0sCisJezIsICJceGZmXHhmZlx4ZmYifSwKKwl7MHgzMCwgIlx4MWFceDBhXHhjYyJ9LCB7MHgzMiwgIlx4MDJceDAwXHgwOCJ9LCB7MHgzMywgIlx4ZjRceDAzXHgxZCJ9LAogCXs2LCAiXHhmZlx4ZmZceGZmIn0sIC8qIDEyICovCiAJezB4MzQsICJceDFlXHg4Zlx4MDkifSwgezB4MzQsICJceDFjXHgwMVx4MjgifSwgezB4MzQsICJceDFlXHg4Zlx4MDkifSwKIAl7MiwgIlx4ZmZceGZmXHhmZiJ9LCAvKiAtICovCkBAIC05OCw4NSArMTIyLDU4IEBACiAJezB4MzUsICJceDUwXHgwMFx4MDYifSwgezB4MzUsICJceDQ4XHgwN1x4ZmYifSwgezB4MzUsICJceDYwXHgwNVx4ODkifSwKIAl7MHgzNSwgIlx4NThceDA3XHhmZiJ9LCB7MHgzNSwgIlx4NDBceDAwXHhhMCJ9LCB7MHgzNSwgIlx4NDJceDAwXHgwMCJ9LAogCXsweDMyLCAiXHgxMFx4MDFceGZjIn0sIHsweDMzLCAiXHg4Y1x4YTFceDE4In0sIHsweDMzLCAiXHg5MFx4MDBceDNjIn0sCi0JezEsICJceGZmXHhmZlx4ZmYifSwKIAl7MHgzMywgIlx4NzhceDAwXHgwMCJ9LAotCXsxLCAiXHhmZlx4ZmZceGZmIn0sCisJezIsICJceGZmXHhmZlx4ZmYifSwKIAl7MHgzNSwgIlx4YjhceDFmXHgyMCJ9LCB7MHgzMywgIlx4OGNceGEyXHgwNiJ9LCB7MHgzMywgIlx4OTBceDAwXHgxMCJ9LAogCXsweDMzLCAiXHg4Y1x4YTJceDA3In0sIHsweDMzLCAiXHg5MFx4MDBceDA4In0sIHsweDMzLCAiXHg4Y1x4YTJceDQyIn0sCiAJezB4MzMsICJceDkwXHgwMFx4MGIifSwgezB4MzMsICJceDhjXHhhMlx4NGEifSwgezB4MzMsICJceDkwXHgwMFx4OGMifSwKIAl7MHgzNSwgIlx4YmFceGZhXHgwOCJ9LCB7MHgzMywgIlx4OGNceGEyXHgwMiJ9LCB7MHgzMywgIlx4OTBceDAwXHgyMiJ9LAotCXsweDMzLCAiXHg4Y1x4YTJceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceGJiIn0sCi19OwotCi1zdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2NvbW1vbjRbXSA9IHsKLQl7MHgzMywgIlx4OGNceDIyXHgyZSJ9LCB7MHgzMywgIlx4OTBceDAwXHhhMCJ9LCB7MHgzMywgIlx4OGNceGE0XHgwOCJ9LAorCXsweDMzLCAiXHg4Y1x4YTJceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceGJiIn0sIHsweDMzLCAiXHg4Y1x4YTRceDA0In0sCisJezB4MzMsICJceDkwXHgwMFx4ODAifSwgezB4MzMsICJceDhjXHhhN1x4OWQifSwgezB4MzMsICJceDkwXHgwMFx4MDAifSwKKwl7MHgzMywgIlx4OGNceGE3XHg5ZSJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceGEyXHgwYyJ9LAorCXsweDMzLCAiXHg5MFx4MDBceDE3In0sIHsweDMzLCAiXHg4Y1x4YTJceDE1In0sIHsweDMzLCAiXHg5MFx4MDBceDA0In0sCisJezB4MzMsICJceDhjXHhhMlx4MTQifSwgezB4MzMsICJceDkwXHgwMFx4MjAifSwgezB4MzMsICJceDhjXHhhMVx4MDMifSwKKwl7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHgxNyJ9LCB7MHgzMywgIlx4OTBceDIxXHgxMSJ9LAorCXsweDMzLCAiXHg4Y1x4MjdceDFiIn0sIHsweDMzLCAiXHg5MFx4MDJceDRmIn0sIHsweDMzLCAiXHg4Y1x4MjdceDI1In0sCisJezB4MzMsICJceDkwXHgwNlx4MGYifSwgezB4MzMsICJceDhjXHgyN1x4MzkifSwgezB4MzMsICJceDkwXHgyMVx4MTEifSwKKwl7MHgzMywgIlx4OGNceDI3XHgzZCJ9LCB7MHgzMywgIlx4OTBceDAxXHgyMCJ9LCB7MHgzMywgIlx4OGNceDI3XHg0NyJ9LAorCXsweDMzLCAiXHg5MFx4MDlceDRjIn0sIHsweDMzLCAiXHg4Y1x4MjdceDAzIn0sIHsweDMzLCAiXHg5MFx4MDJceDg0In0sCisJezB4MzMsICJceDhjXHgyN1x4MDUifSwgezB4MzMsICJceDkwXHgwMVx4ZTIifSwgezB4MzMsICJceDhjXHgyN1x4MDcifSwKKwl7MHgzMywgIlx4OTBceDA2XHg0MCJ9LCB7MHgzMywgIlx4OGNceDI3XHgwOSJ9LCB7MHgzMywgIlx4OTBceDA0XHhiMCJ9LAorCXsweDMzLCAiXHg4Y1x4MjdceDBkIn0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sIHsweDMzLCAiXHg4Y1x4MjdceDBmIn0sCisJezB4MzMsICJceDkwXHgwMFx4MDAifSwgezB4MzMsICJceDhjXHgyN1x4MTEifSwgezB4MzMsICJceDkwXHgwNFx4YmQifSwKKwl7MHgzMywgIlx4OGNceDI3XHgxMyJ9LCB7MHgzMywgIlx4OTBceDA2XHg0ZCJ9LCB7MHgzMywgIlx4OGNceDI3XHgxNSJ9LAorCXsweDMzLCAiXHg5MFx4MDBceDAwIn0sIHsweDMzLCAiXHg4Y1x4MjdceDE3In0sIHsweDMzLCAiXHg5MFx4MjFceDExIn0sCisJezB4MzMsICJceDhjXHgyN1x4MTkifSwgezB4MzMsICJceDkwXHgwNFx4NmMifSwgezB4MzMsICJceDhjXHgyN1x4MWIifSwKKwl7MHgzMywgIlx4OTBceDAyXHg0ZiJ9LCB7MHgzMywgIlx4OGNceDI3XHgxZCJ9LCB7MHgzMywgIlx4OTBceDAxXHgwMiJ9LAorCXsweDMzLCAiXHg4Y1x4MjdceDFmIn0sIHsweDMzLCAiXHg5MFx4MDJceDc5In0sIHsweDMzLCAiXHg4Y1x4MjdceDIxIn0sCisJezB4MzMsICJceDkwXHgwMVx4NTUifSwgezB4MzMsICJceDhjXHgyN1x4MjMifSwgezB4MzMsICJceDkwXHgwMlx4ODUifSwKKwl7MHgzMywgIlx4OGNceDI3XHgyNSJ9LCB7MHgzMywgIlx4OTBceDA2XHgwZiJ9LCB7MHgzMywgIlx4OGNceDI3XHgyNyJ9LAorCXsweDMzLCAiXHg5MFx4MjBceDIwIn0sIHsweDMzLCAiXHg4Y1x4MjdceDI5In0sIHsweDMzLCAiXHg5MFx4MjBceDIwIn0sCisJezB4MzMsICJceDhjXHgyN1x4MmIifSwgezB4MzMsICJceDkwXHgxMFx4MjAifSwgezB4MzMsICJceDhjXHgyN1x4MmQifSwKKwl7MHgzMywgIlx4OTBceDIwXHgwNyJ9LCB7MHgzMywgIlx4OGNceDI3XHgyZiJ9LCB7MHgzMywgIlx4OTBceDAwXHgwNCJ9LAorCXsweDMzLCAiXHg4Y1x4MjdceDMxIn0sIHsweDMzLCAiXHg5MFx4MDBceDA0In0sIHsweDMzLCAiXHg4Y1x4MjdceDMzIn0sCisJezB4MzMsICJceDkwXHgwNFx4YmIifSwgezB4MzMsICJceDhjXHgyN1x4MzUifSwgezB4MzMsICJceDkwXHgwNlx4NGIifSwKKwl7MHgzMywgIlx4OGNceDI3XHgzNyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHgzOSJ9LAorCXsweDMzLCAiXHg5MFx4MjFceDExIn0sIHsweDMzLCAiXHg4Y1x4MjdceDNiIn0sIHsweDMzLCAiXHg5MFx4MDBceDI0In0sCisJezB4MzMsICJceDhjXHgyN1x4M2QifSwgezB4MzMsICJceDkwXHgwMVx4MjAifSwgezB4MzMsICJceDhjXHgyN1x4NDEifSwKKwl7MHgzMywgIlx4OTBceDAxXHg2OSJ9LCB7MHgzMywgIlx4OGNceDI3XHg0NSJ9LCB7MHgzMywgIlx4OTBceDA0XHhlZCJ9LAorCXsweDMzLCAiXHg4Y1x4MjdceDQ3In0sIHsweDMzLCAiXHg5MFx4MDlceDRjIn0sIHsweDMzLCAiXHg4Y1x4MjdceDUxIn0sCisJezB4MzMsICJceDkwXHgwMFx4MDAifSwgezB4MzMsICJceDhjXHgyN1x4NTMifSwgezB4MzMsICJceDkwXHgwM1x4MjAifSwKKwl7MHgzMywgIlx4OGNceDI3XHg1NSJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHg1NyJ9LAorCXsweDMzLCAiXHg5MFx4MDJceDU4In0sIHsweDMzLCAiXHg4Y1x4MjdceDVmIn0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sCisJezB4MzMsICJceDhjXHgyN1x4NjEifSwgezB4MzMsICJceDkwXHgwNlx4NDAifSwgezB4MzMsICJceDhjXHgyN1x4NjMifSwKKwl7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHg2NSJ9LCB7MHgzMywgIlx4OTBceDA0XHhiMCJ9LAorCXsweDMzLCAiXHg4Y1x4MjJceDJlIn0sIHsweDMzLCAiXHg5MFx4MDBceGExIn0sIHsweDMzLCAiXHg4Y1x4YTRceDA4In0sCiAJezB4MzMsICJceDkwXHgwMFx4MWYifSwgezB4MzMsICJceDhjXHhhNFx4MDkifSwgezB4MzMsICJceDkwXHgwMFx4MjEifSwKIAl7MHgzMywgIlx4OGNceGE0XHgwYSJ9LCB7MHgzMywgIlx4OTBceDAwXHgyNSJ9LCB7MHgzMywgIlx4OGNceGE0XHgwYiJ9LAotCXsweDMzLCAiXHg5MFx4MDBceDI3In0sIHsweDMzLCAiXHg4Y1x4MjRceDExIn0sIHsweDMzLCAiXHg5MFx4MDBceGEwIn0sCi0JezB4MzMsICJceDhjXHgyNFx4MTMifSwgezB4MzMsICJceDkwXHgwMFx4YzAifSwgezB4MzMsICJceDhjXHgyNFx4MTUifSwKLQl7MHgzMywgIlx4OTBceDAwXHhhMCJ9LCB7MHgzMywgIlx4OGNceDI0XHgxNyJ9LCB7MHgzMywgIlx4OTBceDAwXHhjMCJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9jb21tb241W10gPSB7Ci0JezB4MzMsICJceDhjXHhhNFx4MDQifSwgezB4MzMsICJceDkwXHgwMFx4ODAifSwgezB4MzMsICJceDhjXHhhN1x4OWQifSwKLQl7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceGE3XHg5ZSJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LAotCXsweDMzLCAiXHg4Y1x4YTJceDBjIn0sIHsweDMzLCAiXHg5MFx4MDBceDE3In0sIHsweDMzLCAiXHg4Y1x4YTJceDE1In0sCi0JezB4MzMsICJceDkwXHgwMFx4MDQifSwgezB4MzMsICJceDhjXHhhMlx4MTQifSwgezB4MzMsICJceDkwXHgwMFx4MjAifSwKLQl7MHgzMywgIlx4OGNceGExXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHgxNyJ9LAotCS8qIG1zbGVlcCg1Myk7ICovCi0JezB4MzMsICJceDkwXHgyMVx4MTEifSwgezB4MzMsICJceDhjXHgyN1x4MWIifSwgezB4MzMsICJceDkwXHgwMlx4NGYifSwKLQl7MHgzMywgIlx4OGNceDI3XHgyNSJ9LCB7MHgzMywgIlx4OTBceDA2XHgwZiJ9LCB7MHgzMywgIlx4OGNceDI3XHgzOSJ9LAotCXsweDMzLCAiXHg5MFx4MjFceDExIn0sIHsweDMzLCAiXHg4Y1x4MjdceDNkIn0sIHsweDMzLCAiXHg5MFx4MDFceDIwIn0sCi0JezB4MzMsICJceDhjXHgyN1x4NDcifSwgezB4MzMsICJceDkwXHgwOVx4NGMifSwgezB4MzMsICJceDhjXHgyN1x4MDMifSwKLQl7MHgzMywgIlx4OTBceDAyXHg4NCJ9LCB7MHgzMywgIlx4OGNceDI3XHgwNSJ9LCB7MHgzMywgIlx4OTBceDAxXHhlMiJ9LAotCXsweDMzLCAiXHg4Y1x4MjdceDA3In0sIHsweDMzLCAiXHg5MFx4MDZceDQwIn0sIHsweDMzLCAiXHg4Y1x4MjdceDA5In0sCi0JezB4MzMsICJceDkwXHgwNFx4YjAifSwgezB4MzMsICJceDhjXHgyN1x4MGQifSwgezB4MzMsICJceDkwXHgwMFx4MDAifSwKLQl7MHgzMywgIlx4OGNceDI3XHgwZiJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHgxMSJ9LAotCXsweDMzLCAiXHg5MFx4MDRceGJkIn0sIHsweDMzLCAiXHg4Y1x4MjdceDEzIn0sIHsweDMzLCAiXHg5MFx4MDZceDRkIn0sCi0JezB4MzMsICJceDhjXHgyN1x4MTUifSwgezB4MzMsICJceDkwXHgwMFx4MDAifSwgezB4MzMsICJceDhjXHgyN1x4MTcifSwKLQl7MHgzMywgIlx4OTBceDIxXHgxMSJ9LCB7MHgzMywgIlx4OGNceDI3XHgxOSJ9LCB7MHgzMywgIlx4OTBceDA0XHg2YyJ9LAotCXsweDMzLCAiXHg4Y1x4MjdceDFiIn0sIHsweDMzLCAiXHg5MFx4MDJceDRmIn0sIHsweDMzLCAiXHg4Y1x4MjdceDFkIn0sCi0JezB4MzMsICJceDkwXHgwMVx4MDIifSwgezB4MzMsICJceDhjXHgyN1x4MWYifSwgezB4MzMsICJceDkwXHgwMlx4NzkifSwKLQl7MHgzMywgIlx4OGNceDI3XHgyMSJ9LCB7MHgzMywgIlx4OTBceDAxXHg1NSJ9LCB7MHgzMywgIlx4OGNceDI3XHgyMyJ9LAotCXsweDMzLCAiXHg5MFx4MDJceDg1In0sIHsweDMzLCAiXHg4Y1x4MjdceDI1In0sIHsweDMzLCAiXHg5MFx4MDZceDBmIn0sCi0JezB4MzMsICJceDhjXHgyN1x4MjcifSwgezB4MzMsICJceDkwXHgyMFx4MjAifSwgezB4MzMsICJceDhjXHgyN1x4MjkifSwKLQl7MHgzMywgIlx4OTBceDIwXHgyMCJ9LCB7MHgzMywgIlx4OGNceDI3XHgyYiJ9LCB7MHgzMywgIlx4OTBceDEwXHgyMCJ9LAotCXsweDMzLCAiXHg4Y1x4MjdceDJkIn0sIHsweDMzLCAiXHg5MFx4MjBceDA3In0sIHsweDMzLCAiXHg4Y1x4MjdceDJmIn0sCi0JezB4MzMsICJceDkwXHgwMFx4MDQifSwgezB4MzMsICJceDhjXHgyN1x4MzEifSwgezB4MzMsICJceDkwXHgwMFx4MDQifSwKLQl7MHgzMywgIlx4OGNceDI3XHgzMyJ9LCB7MHgzMywgIlx4OTBceDA0XHhiYiJ9LCB7MHgzMywgIlx4OGNceDI3XHgzNSJ9LAotCXsweDMzLCAiXHg5MFx4MDZceDRiIn0sIHsweDMzLCAiXHg4Y1x4MjdceDM3In0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sCi0JezB4MzMsICJceDhjXHgyN1x4MzkifSwgezB4MzMsICJceDkwXHgyMVx4MTEifSwgezB4MzMsICJceDhjXHgyN1x4M2IifSwKLQl7MHgzMywgIlx4OTBceDAwXHgyNCJ9LCB7MHgzMywgIlx4OGNceDI3XHgzZCJ9LCB7MHgzMywgIlx4OTBceDAxXHgyMCJ9LAotCXsweDMzLCAiXHg4Y1x4MjdceDQxIn0sIHsweDMzLCAiXHg5MFx4MDFceDY5In0sIHsweDMzLCAiXHg4Y1x4MjdceDQ1In0sCi0JezB4MzMsICJceDkwXHgwNFx4ZWQifSwgezB4MzMsICJceDhjXHgyN1x4NDcifSwgezB4MzMsICJceDkwXHgwOVx4NGMifSwKLQl7MHgzMywgIlx4OGNceDI3XHg1MSJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHg1MyJ9LAotCXsweDMzLCAiXHg5MFx4MDNceDIwIn0sIHsweDMzLCAiXHg4Y1x4MjdceDU1In0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sCi0JezB4MzMsICJceDhjXHgyN1x4NTcifSwgezB4MzMsICJceDkwXHgwMlx4NTgifSwgezB4MzMsICJceDhjXHgyN1x4NWYifSwKLQl7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceDI3XHg2MSJ9LCB7MHgzMywgIlx4OTBceDA2XHg0MCJ9LAotCXsweDMzLCAiXHg4Y1x4MjdceDYzIn0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sIHsweDMzLCAiXHg4Y1x4MjdceDY1In0sCi0JezB4MzMsICJceDkwXHgwNFx4YjAifSwgezB4MzMsICJceDhjXHgyMlx4MmUifSwgezB4MzMsICJceDkwXHgwMFx4YTEifSwKLQl7MHgzMywgIlx4OGNceGE0XHgwOCJ9LCB7MHgzMywgIlx4OTBceDAwXHgxZiJ9LCB7MHgzMywgIlx4OGNceGE0XHgwOSJ9LAotCXsweDMzLCAiXHg5MFx4MDBceDIxIn0sIHsweDMzLCAiXHg4Y1x4YTRceDBhIn0sIHsweDMzLCAiXHg5MFx4MDBceDI1In0sCi0JezB4MzMsICJceDhjXHhhNFx4MGIifSwgezB4MzMsICJceDkwXHgwMFx4MjcifSwgezB4MzMsICJceDhjXHgyNFx4MTEifSwKLQl7MHgzMywgIlx4OTBceDAwXHhhMSJ9LCB7MHgzMywgIlx4OGNceDI0XHgxMyJ9LCB7MHgzMywgIlx4OTBceDAwXHhjMSJ9LAotCXsweDMzLCAiXHg4Y1x4MjRceDE1In0sCi19OwotCi1zdGF0aWMgc3RydWN0IHZhbGlkeCB0YmxfaW5pdF9hdF9zdGFydHVwW10gPSB7Ci0JezB4MDAwMCwgMHgwMDAwfSwKLQl7NTMsIDB4ZmZmZn0sCi0JezB4MDAxMCwgMHgwMDEwfSwKLQl7NTMsIDB4ZmZmZn0sCi0JezB4MDAwOCwgMHgwMGMwfSwKLQl7NTMsIDB4ZmZmZn0sCi0JezB4MDAwMSwgMHgwMGMxfSwKLQl7NTMsIDB4ZmZmZn0sCi0JezB4MDAwMSwgMHgwMGMyfSwKLQl7NTMsIDB4ZmZmZn0sCi0JezB4MDAyMCwgMHgwMDA2fSwKLQl7NTMsIDB4ZmZmZn0sCi0JezB4MDA2YSwgMHgwMDBkfSwKLQl7NTMsIDB4ZmZmZn0sCisJezB4MzMsICJceDkwXHgwMFx4MjcifSwgezB4MzMsICJceDhjXHgyNFx4MTEifSwgezB4MzMsICJceDkwXHgwMFx4YTEifSwKKwl7MHgzMywgIlx4OGNceDI0XHgxMyJ9LCB7MHgzMywgIlx4OTBceDAwXHhjMSJ9LCB7MHgzMywgIlx4OGNceDI0XHgxNSJ9LAorCXsweDMzLCAiXHg5MFx4MDBceDZhIn0sIHsweDMzLCAiXHg4Y1x4MjRceDE3In0sIHsweDMzLCAiXHg5MFx4MDBceDgwIn0sCisJezB4MzMsICJceDhjXHhhMVx4MDMifSwgezB4MzMsICJceDkwXHgwMFx4MDUifSwKKwl7MiwgIlx4ZmZceGZmXHhmZiJ9LAorCXsweDMzLCAiXHg4Y1x4YTFceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceDA2In0sCisJezMsICJceGZmXHhmZlx4ZmYifSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9sb3cxW10gPSB7CkBAIC0yMDksNyArMjA2LDcgQEAKIAl7MiwgIlx4ZmZceGZmXHhmZiJ9LAogCXsweDMzLCAiXHg4Y1x4YTFceDIwIn0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sIHsweDMzLCAiXHg4Y1x4YTFceDAzIn0sCiAJezB4MzMsICJceDkwXHgwMFx4MDEifSwgezB4MzMsICJceDhjXHhhN1x4MDIifSwgezB4MzMsICJceDkwXHgwMFx4MDAifSwKLQl7MiwgIlx4ZmZceGZmXHhmZiJ9LCAvKiAtICogKi8KKwl7MiwgIlx4ZmZceGZmXHhmZiJ9LAogCXsweDMzLCAiXHg4Y1x4YTFceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceDA1In0sCiAJezIsICJceGZmXHhmZlx4ZmYifSwKIAl7MHgzMywgIlx4OGNceGExXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwNiJ9LApAQCAtMjE3LDYxICsyMTQsMTUgQEAKIAl7MHgzMywgIlx4OGNceGExXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwNSJ9LAogCXsyLCAiXHhmZlx4ZmZceGZmIn0sCiAJezB4MzMsICJceDhjXHhhMVx4MDMifSwgezB4MzMsICJceDkwXHgwMFx4MDYifSwKLQl7MSwgIlx4ZmZceGZmXHhmZiJ9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9pbml0X3Bvc3RfYWx0X2xvdzRbXSA9IHsKLQl7MHgzMiwgIlx4MTBceDAxXHhmOCJ9LCB7MHgzNCwgIlx4Y2VceDAxXHhhOCJ9LCB7MHgzNCwgIlx4ZDBceDY2XHgzMyJ9LAotCXsweDM0LCAiXHhkMlx4MzFceDlhIn0sIHsweDM0LCAiXHhkNFx4OTRceDYzIn0sIHsweDM0LCAiXHhkNlx4NGJceDI1In0sCi0JezB4MzQsICJceGQ4XHgyNlx4NzAifSwgezB4MzQsICJceGRhXHg3Mlx4NGMifSwgezB4MzQsICJceGRjXHhmZlx4MDQifSwKLQl7MHgzNCwgIlx4ZGVceDAxXHg1YiJ9LCB7MHgzNCwgIlx4ZTZceDAxXHgxMyJ9LCB7MHgzNCwgIlx4ZWVceDBiXHhmMCJ9LAotCXsweDM0LCAiXHhmNlx4MGJceGE0In0sIHsweDM1LCAiXHgwMFx4ZjZceGU3In0sIHsweDM1LCAiXHgwOFx4MGRceGZkIn0sCi0JezB4MzUsICJceDEwXHgyNVx4NjMifSwgezB4MzUsICJceDE4XHgzNVx4NmMifSwgezB4MzUsICJceDIwXHg0Mlx4N2UifSwKLQl7MHgzNSwgIlx4MjhceDE5XHg0NCJ9LCB7MHgzNSwgIlx4MzBceDM5XHhkNCJ9LCB7MHgzNSwgIlx4MzhceGY1XHhhOCJ9LAotCXsweDM1LCAiXHg0Y1x4MDdceDkwIn0sIHsweDM1LCAiXHg0NFx4MDdceGI4In0sIHsweDM1LCAiXHg1Y1x4MDZceDg4In0sCi0JezB4MzUsICJceDU0XHgwN1x4ZmYifSwgezB4MzQsICJceGUwXHgwMVx4NTIifSwgezB4MzQsICJceGU4XHgwMFx4Y2MifSwKLQl7MHgzNCwgIlx4ZjBceDBkXHg4MyJ9LCB7MHgzNCwgIlx4ZjhceDBjXHhiMyJ9LCB7MHgzNSwgIlx4MDJceGZlXHhiYSJ9LAotCXsweDM1LCAiXHgwYVx4MDRceGUwIn0sIHsweDM1LCAiXHgxMlx4MWNceDYzIn0sIHsweDM1LCAiXHgxYVx4MmJceDVhIn0sCi0JezB4MzUsICJceDIyXHgzMlx4NWUifSwgezB4MzUsICJceDJhXHgwZFx4MjgifSwgezB4MzUsICJceDMyXHgyY1x4MDIifSwKLQl7MHgzNSwgIlx4M2FceGY0XHhmYSJ9LCB7MHgzNSwgIlx4NGVceDA3XHhlZiJ9LCB7MHgzNSwgIlx4NDZceDA3XHg4OCJ9LAotCXsweDM1LCAiXHg1ZVx4MDdceGMxIn0sIHsweDM1LCAiXHg1Nlx4MDRceDY0In0sIHsweDM0LCAiXHhlNFx4MDFceDE1In0sCi0JezB4MzQsICJceGVjXHgwMFx4ODIifSwgezB4MzQsICJceGY0XHgwY1x4Y2UifSwgezB4MzQsICJceGZjXHgwY1x4YmEifSwKLQl7MHgzNSwgIlx4MDZceDFmXHgwMiJ9LCB7MHgzNSwgIlx4MGVceDAyXHhlMyJ9LCB7MHgzNSwgIlx4MTZceDFhXHg1MCJ9LAotCXsweDM1LCAiXHgxZVx4MjRceDM5In0sIHsweDM1LCAiXHgyNlx4MjNceDRjIn0sIHsweDM1LCAiXHgyZVx4ZjlceDFiIn0sCi0JezB4MzUsICJceDM2XHgyM1x4MTkifSwgezB4MzUsICJceDNlXHgxMlx4MDgifSwgezB4MzUsICJceDUyXHgwN1x4MjIifSwKLQl7MHgzNSwgIlx4NGFceDAzXHhkMyJ9LCB7MHgzNSwgIlx4NjJceDA2XHg1NCJ9LCB7MHgzNSwgIlx4NWFceDA0XHg1ZCJ9LAotCXsweDM0LCAiXHhlMlx4MDFceDA0In0sIHsweDM0LCAiXHhlYVx4MDBceGEwIn0sIHsweDM0LCAiXHhmMlx4MGNceGJjIn0sCi0JezB4MzQsICJceGZhXHgwY1x4NWIifSwgezB4MzUsICJceDA0XHgxN1x4ZjIifSwgezB4MzUsICJceDBjXHgwMlx4MDgifSwKLQl7MHgzNSwgIlx4MTRceDI4XHg0MyJ9LCB7MHgzNSwgIlx4MWNceDI4XHg2MiJ9LCB7MHgzNSwgIlx4MjRceDJiXHg2MCJ9LAotCXsweDM1LCAiXHgyY1x4MDdceDMzIn0sIHsweDM1LCAiXHgzNFx4MWZceGIwIn0sIHsweDM1LCAiXHgzY1x4ZWRceGNkIn0sCi0JezB4MzUsICJceDUwXHgwMFx4MDYifSwgezB4MzUsICJceDQ4XHgwN1x4ZmYifSwgezB4MzUsICJceDYwXHgwNVx4ODkifSwKLQl7MHgzNSwgIlx4NThceDA3XHhmZiJ9LCB7MHgzNSwgIlx4NDBceDAwXHhhMCJ9LCB7MHgzNSwgIlx4NDJceDAwXHgwMCJ9LAotCXsweDMyLCAiXHgxMFx4MDFceGZjIn0sIHsweDMzLCAiXHg4Y1x4YTFceDE4In0sCi0JLyogRmxpcC9NaXJyb3IgaC92PTEgKi8KLQl7MHgzMywgIlx4OTBceDAwXHgzYyJ9LCB7MHgzMywgIlx4OGNceDI3XHgxOSJ9LCB7MHgzMywgIlx4OTBceDA0XHg2YyJ9LAotCXsweDMzLCAiXHg4Y1x4MjdceDNiIn0sIHsweDMzLCAiXHg5MFx4MDBceDI0In0sIHsweDMzLCAiXHg4Y1x4YTFceDAzIn0sCi0JezB4MzMsICJceDkwXHgwMFx4MDYifSwKLQl7MTMwLCAiXHhmZlx4ZmZceGZmIn0sCi0JezB4MzMsICJceDkwXHgwMFx4MDYifSwgezB4MzMsICJceDkwXHgwMFx4MDYifSwgezB4MzMsICJceDkwXHgwMFx4MDYifSwKLQl7MHgzMywgIlx4OTBceDAwXHgwNiJ9LCB7MHgzMywgIlx4OTBceDAwXHgwNiJ9LCB7MHgzMywgIlx4OTBceDAwXHgwNiJ9LAotCXsxMDAsICJceGZmXHhmZlx4ZmYifSwKLQkvKiA/PyAqLwotCXsweDMzLCAiXHg4Y1x4YTFceDAyIn0sIHsweDMzLCAiXHg5MFx4MDBceDFmIn0sIHsweDMzLCAiXHg4Y1x4YTFceDAyIn0sCi0JezB4MzMsICJceDkwXHgwMFx4MWYifSwgezB4MzMsICJceDhjXHhhMVx4MDIifSwgezB4MzMsICJceDkwXHgwMFx4MWYifSwKLQl7MHgzMywgIlx4OGNceGExXHgwMiJ9LCB7MHgzMywgIlx4OTBceDAwXHgxZiJ9LAotCS8qIEJyaWd0aG5lc3M9NzAgKi8KLQl7MHgzMywgIlx4OGNceGEyXHgwNiJ9LCB7MHgzMywgIlx4OTBceDAwXHg0NiJ9LCB7MHgzMywgIlx4OGNceGExXHgwMiJ9LAotCXsweDMzLCAiXHg5MFx4MDBceDBmIn0sIHsweDMzLCAiXHg4Y1x4YTFceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceDA1In0sCi0JLyogU2hhcnBuZXNzPTIwICovCi0JezB4MzIsICJceDZjXHgxNFx4MDgifSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF9iaWcxW10gPSB7CitzdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfYmlnW10gPSB7CiAJezB4MzMsICJceDhjXHhhMVx4MDMifSwgezB4MzMsICJceDkwXHgwMFx4MDUifSwKIAl7MiwgIlx4ZmZceGZmXHhmZiJ9LAogCXsweDMzLCAiXHg4Y1x4YTFceDAzIn0sIHsweDMzLCAiXHg5MFx4MDBceDA2In0sCiAJezIsICJceGZmXHhmZlx4ZmYifSwKIAl7MHgzNCwgIlx4MWVceDhmXHgwOSJ9LCB7MHgzNCwgIlx4MWNceDAxXHgyOCJ9LCB7MHgzNCwgIlx4MWVceDhmXHgwOSJ9LAorCXsyLCAiXHhmZlx4ZmZceGZmIn0sCiAJezB4MzQsICJceDFlXHg4Zlx4MDkifSwgezB4MzIsICJceDE0XHgwNlx4ZTYifSwgezB4MzMsICJceDhjXHhhMVx4MDMifSwKIAl7MHgzMywgIlx4OTBceDAwXHgwNSJ9LAogCXsyLCAiXHhmZlx4ZmZceGZmIn0sCkBAIC0yODUsOSArMjM2LDE3IEBACiAJezB4MzMsICJceDkwXHgwMFx4MDMifSwgezB4MzMsICJceDhjXHhhMVx4MzQifSwgezB4MzMsICJceDkwXHgwMFx4MDMifSwKIAl7MHgzMywgIlx4OGNceGExXHgwMyJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMiJ9LCB7MHgzMywgIlx4MmVceDAxXHgwMCJ9LAogCXsweDM0LCAiXHgwNFx4MDBceDJhIn0sIHsweDMzLCAiXHg4Y1x4YTdceDAyIn0sIHsweDMzLCAiXHg5MFx4MDBceDAxIn0sCisJezB4MzMsICJceDhjXHgyN1x4OTcifSwgezB4MzMsICJceDkwXHgwMVx4MDAifSwKKwl7NTEsICJceGZmXHhmZlx4ZmYifSwKKwl7MHgzMywgIlx4OGNceGExXHgyMCJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMCJ9LCB7MHgzMywgIlx4OGNceGExXHgwMyJ9LAorCXsweDMzLCAiXHg5MFx4MDBceDAxIn0sIHsweDMzLCAiXHg4Y1x4YTdceDAyIn0sIHsweDMzLCAiXHg5MFx4MDBceDAwIn0sCisJezUxLCAiXHhmZlx4ZmZceGZmIn0sCisJezB4MzMsICJceDhjXHhhMVx4MjAifSwgezB4MzMsICJceDkwXHgwMFx4NzIifSwgezB4MzMsICJceDhjXHhhMVx4MDMifSwKKwl7MHgzMywgIlx4OTBceDAwXHgwMiJ9LCB7MHgzMywgIlx4OGNceGE3XHgwMiJ9LCB7MHgzMywgIlx4OTBceDAwXHgwMSJ9LAorCXs1MSwgIlx4ZmZceGZmXHhmZiJ9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpZHhkYXRhIHRibF9pbml0X3Bvc3RfYWx0X2JpZzJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWR4ZGF0YSB0YmxfaW5pdF9wb3N0X2FsdF8zQltdID0gewogCXsweDMyLCAiXHgxMFx4MDFceGY4In0sIHsweDM0LCAiXHhjZVx4MDFceGE4In0sIHsweDM0LCAiXHhkMFx4NjZceDMzIn0sCiAJezB4MzQsICJceGQyXHgzMVx4OWEifSwgezB4MzQsICJceGQ0XHg5NFx4NjMifSwgezB4MzQsICJceGQ2XHg0Ylx4MjUifSwKIAl7MHgzNCwgIlx4ZDhceDI2XHg3MCJ9LCB7MHgzNCwgIlx4ZGFceDcyXHg0YyJ9LCB7MHgzNCwgIlx4ZGNceGZmXHgwNCJ9LApAQCAtMzE2LDE3ICsyNzUsNiBAQAogCXsweDMyLCAiXHgxMFx4MDFceGZjIn0sIHsweDMzLCAiXHg4Y1x4YTFceDE4In0sIHsweDMzLCAiXHg5MFx4MDBceDNjIn0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGlkeGRhdGEgdGJsX2luaXRfcG9zdF9hbHRfYmlnM1tdID0gewotCXsweDMzLCAiXHg4Y1x4YTFceDAyIn0sCi0JezB4MzMsICJceDkwXHgwMFx4MWYifSwKLQl7MHgzMywgIlx4OGNceGExXHgwMiJ9LAotCXsweDMzLCAiXHg5MFx4MDBceDFmIn0sCi0JezB4MzMsICJceDhjXHhhMVx4MDIifSwKLQl7MHgzMywgIlx4OTBceDAwXHgxZiJ9LAotCXsweDMzLCAiXHg4Y1x4YTFceDAyIn0sCi0JezB4MzMsICJceDkwXHgwMFx4MWYifSwKLX07Ci0KIHN0YXRpYyB1OCAqZGF0XzY0MCAgPSAiXHhkMFx4MDJceGQxXHgwOFx4ZDJceGUxXHhkM1x4MDJceGQ0XHgxMFx4ZDVceDgxIjsKIHN0YXRpYyB1OCAqZGF0XzgwMCAgPSAiXHhkMFx4MDJceGQxXHgxMFx4ZDJceDU3XHhkM1x4MDJceGQ0XHgxOFx4ZDVceDIxIjsKIHN0YXRpYyB1OCAqZGF0XzEyODAgPSAiXHhkMFx4MDJceGQxXHgyMFx4ZDJceDAxXHhkM1x4MDJceGQ0XHgyOFx4ZDVceDAxIjsKQEAgLTM1MSw3ICsyOTksNyBAQAogCXNkLT52Y3VyLmdhbW1hICAgICAgPSAgMDsKIAlzZC0+dmN1ci5odWUgICAgICAgID0gIDA7CiAJc2QtPnZjdXIuc2F0dXJhdGlvbiA9IDYwOwotCXNkLT52Y3VyLndoaXRlYmFsICAgPSA1MDsKKwlzZC0+dmN1ci53aGl0ZWJhbCAgID0gIDA7IC8qIDUwLCBub3QgZG9uZSBieSBoYXJkd2FyZSAqLwogCXNkLT52Y3VyLm1pcnJvciA9IDA7CiAJc2QtPnZjdXIuZmxpcCAgID0gMDsKIAlzZC0+dmN1ci5BQzUwSHogPSAxOwpAQCAtMzYxLDE3ICszMDksMTIgQEAKIAlzZC0+dm1heC5zaGFycG5lc3MgID0gIDQwOwogCXNkLT52bWF4LmNvbnRyYXN0ICAgPSAgIDM7CiAJc2QtPnZtYXguZ2FtbWEgICAgICA9ICAgMjsKLQlzZC0+dm1heC5odWUgICAgICAgID0gICAwICsgMTsgLyogMjAwICovCi0Jc2QtPnZtYXguc2F0dXJhdGlvbiA9ICAgMDsgICAgIC8qIDEwMCAqLwotCXNkLT52bWF4LndoaXRlYmFsICAgPSAgIDA7ICAgICAvKiAxMDAgKi8KKwlzZC0+dm1heC5odWUgICAgICAgID0gICAwICsgMTsgLyogMjAwLCBub3QgZG9uZSBieSBoYXJkd2FyZSAqLworCXNkLT52bWF4LnNhdHVyYXRpb24gPSAgIDA7ICAgICAvKiAxMDAsIG5vdCBkb25lIGJ5IGhhcmR3YXJlICovCisJc2QtPnZtYXgud2hpdGViYWwgICA9ICAgMjsgICAgIC8qIDEwMCwgbm90IGRvbmUgYnkgaGFyZHdhcmUgKi8KIAlzZC0+dm1heC5taXJyb3IgPSAxOwogCXNkLT52bWF4LmZsaXAgICA9IDE7CiAJc2QtPnZtYXguQUM1MEh6ID0gMTsKLQlpZiAoX01JMjAyMGJfKSB7Ci0JCXNkLT52bWF4LmNvbnRyYXN0ICA9IDA7Ci0JCXNkLT52bWF4LmdhbW1hICAgICA9IDA7Ci0JCXNkLT52bWF4LmJhY2tsaWdodCA9IDA7Ci0JfQogCiAJc2QtPmRldl9jYW1lcmFfc2V0dGluZ3MgPSBtaTIwMjBfY2FtZXJhX3NldHRpbmdzOwogCXNkLT5kZXZfaW5pdF9hdF9zdGFydHVwID0gbWkyMDIwX2luaXRfYXRfc3RhcnR1cDsKQEAgLTM4NCw1MSArMzI3LDkgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzMzIgcmVzbyA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhzMzIpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwotCi0JaWYgKF9NSTIwMjBiXykgewotCQlmZXRjaF92YWxpZHgoZ3NwY2FfZGV2LCB0YmxfY29tbW9uMSwgQVJSQVlfU0laRSh0YmxfY29tbW9uMSkpOwotCX0gZWxzZSB7Ci0JCWlmIChfTUkyMDIwXykKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDEsIDB4MDAwOCwgMHgwMDA0LCAgMCwgTlVMTCk7Ci0JCWVsc2UKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDEsIDB4MDAwMiwgMHgwMDA0LCAgMCwgTlVMTCk7Ci0JCW1zbGVlcCgzNSk7Ci0JCWZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9jb21tb24yLCBBUlJBWV9TSVpFKHRibF9jb21tb24yKSk7Ci0JfQotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDMsIDB4N2EwMCwgMHgwMDMzLCAgMywgIlx4ODZceDI1XHgwMSIpOwotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDMsIDB4N2EwMCwgMHgwMDMzLCAgMywgIlx4ODZceDI1XHgwMCIpOwotCW1zbGVlcCgyKTsgLyogLSAqICovCi0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAgMywgMHg3YTAwLCAweDAwMzAsICAzLCAiXHgxYVx4MGFceGNjIik7Ci0JaWYgKHJlc28gPT0gSU1BR0VfMTYwMCkKLQkJbXNsZWVwKDIpOyAvKiAxNjAwICovCi0JZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9jb21tb24zLCBBUlJBWV9TSVpFKHRibF9jb21tb24zKSk7Ci0KLQlpZiAoX01JMjAyMGJfIHx8IF9NSTIwMjBfKQotCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2NvbW1vbjQsCi0JCQkJQVJSQVlfU0laRSh0YmxfY29tbW9uNCkpOwotCi0JZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9jb21tb241LCBBUlJBWV9TSVpFKHRibF9jb21tb241KSk7Ci0JaWYgKF9NSTIwMjBiXyB8fCBfTUkyMDIwXykgewotCQkvKiBEaWZmZXJlbnQgZnJvbSBmcmV0ICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4NzgiKTsKLQkJLyogU2FtZSBhcyBmcmV0ICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHgyNFx4MTciKTsKLQkJLyogRGlmZmVyZW50IGZyb20gZnJldCAqLwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg5MFx4MDBceDkwIik7Ci0JfSBlbHNlIHsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHg2YSIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg4Y1x4MjRceDE3Iik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4ODAiKTsKLQl9Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OGNceGExXHgwMyIpOwotCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4MDUiKTsKLQltc2xlZXAoMik7Ci0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OGNceGExXHgwMyIpOwotCWlmIChyZXNvID09IElNQUdFXzE2MDApCi0JCW1zbGVlcCgxNCk7IC8qIDE2MDAgKi8KLQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg5MFx4MDBceDA2Iik7Ci0JbXNsZWVwKDIpOworCWZldGNoX3ZhbGlkeChnc3BjYV9kZXYsIHRibF9jb21tb25fMEIsIEFSUkFZX1NJWkUodGJsX2NvbW1vbl8wQikpOworCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfY29tbW9uXzNCLCBBUlJBWV9TSVpFKHRibF9jb21tb25fM0IpKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MSwgMHgwMDAwLCAwLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBtaTIwMjBfaW5pdF9hdF9zdGFydHVwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTQ0MSw4ICszNDIsMTYgQEAKIAlmZXRjaF92YWxpZHgoZ3NwY2FfZGV2LCB0YmxfaW5pdF9hdF9zdGFydHVwLAogCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9hdF9zdGFydHVwKSk7CiAKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAxLCAweDdhMDAsIDB4ODAzMCwgIDAsIE5VTEwpOworCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAgMiwgMHg3YTAwLCAweDgwMzAsICAxLCAmYyk7CisKIAljb21tb24oZ3NwY2FfZGV2KTsKIAorCW1zbGVlcCg2MSk7CisvKgljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDExLCAweDAwMDAsIDB4MDAwMCwgIDAsIE5VTEwpOyAqLworLyoJbXNsZWVwKDM2KTsgKi8KKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAxLCAweDAwMDEsIDB4MDAwMCwgIDAsIE5VTEwpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1MCwxNyArMzU5LDE3IEBACiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0Jc2QtPm1pcnJvck1hc2sgPSAwOworCXNkLT5taXJyb3JNYXNrID0gIDA7CisJc2QtPnZvbGQuaHVlICAgPSAtMTsKIAotCXNkLT52b2xkLmJhY2tsaWdodCAgPSAtMTsKKwkvKiBUaGVzZSBjb250cm9scyBuZWVkIHRvIGJlIHJlc2V0ICovCiAJc2QtPnZvbGQuYnJpZ2h0bmVzcyA9IC0xOwogCXNkLT52b2xkLnNoYXJwbmVzcyAgPSAtMTsKLQlzZC0+dm9sZC5jb250cmFzdCAgID0gLTE7Ci0Jc2QtPnZvbGQuZ2FtbWEgID0gLTE7Ci0Jc2QtPnZvbGQuaHVlICAgID0gLTE7Ci0Jc2QtPnZvbGQubWlycm9yID0gLTE7Ci0Jc2QtPnZvbGQuZmxpcCAgID0gLTE7Ci0Jc2QtPnZvbGQuQUM1MEh6ID0gLTE7CisKKwkvKiBJZiBub3QgZGlmZmVyZW50IGZyb20gZGVmYXVsdCwgdGhleSBkbyBub3QgbmVlZCB0byBiZSBzZXQgKi8KKwlzZC0+dm9sZC5jb250cmFzdCAgPSAwOworCXNkLT52b2xkLmdhbW1hICAgICA9IDA7CisJc2QtPnZvbGQuYmFja2xpZ2h0ID0gMDsKIAogCW1pMjAyMF9pbml0X3Bvc3RfYWx0KGdzcGNhX2Rldik7CiAKQEAgLTQ3MiwxMCArMzgxLDEwIEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXMzMiByZXNvID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbKHMzMikgZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXY7CiAKLQlzMzIgYmFja2xpZ2h0ID0gc2QtPnZjdXIuYmFja2xpZ2h0OwogCXMzMiBtaXJyb3IgPSAoKChzZC0+dmN1ci5taXJyb3IgPiAwKSBeIHNkLT5taXJyb3JNYXNrKSA+IDApOwogCXMzMiBmbGlwICAgPSAoKChzZC0+dmN1ci5mbGlwICAgPiAwKSBeIHNkLT5taXJyb3JNYXNrKSA+IDApOwogCXMzMiBmcmVxICAgPSAoc2QtPnZjdXIuQUM1MEh6ICA+IDApOworCXMzMiB3YmFsICAgPSBzZC0+dmN1ci53aGl0ZWJhbDsKIAogCXU4IGRhdF9mcmVxMltdID0gezB4OTAsIDB4MDAsIDB4ODB9OwogCXU4IGRhdF9tdWx0aTFbXSA9IHsweDhjLCAweGE3LCAweDAwfTsKQEAgLTQ4NCw2ICszOTMsNyBAQAogCXU4IGRhdF9tdWx0aTRbXSA9IHsweDkwLCAweDAwLCAweDAwfTsKIAl1OCBkYXRfaHZmbGlwMltdID0gezB4OTAsIDB4MDQsIDB4NmN9OwogCXU4IGRhdF9odmZsaXA0W10gPSB7MHg5MCwgMHgwMCwgMHgyNH07CisJdTggZGF0X3diYWwyW10gPSB7MHg5MCwgMHgwMCwgMHgwMH07CiAJdTggYzsKIAogCXNkLT5uYkltID0gLTE7CkBAIC00OTEsMjMgKzQwMSwyNiBAQAogCWRhdF9mcmVxMlsyXSA9IGZyZXEgPyAweGMwIDogMHg4MDsKIAlkYXRfbXVsdGkxWzJdID0gMHg5ZDsKIAlkYXRfbXVsdGkzWzJdID0gZGF0X211bHRpMVsyXSArIDE7Ci0JZGF0X211bHRpNFsyXSA9IGRhdF9tdWx0aTJbMl0gPSBiYWNrbGlnaHQ7CisJaWYgKHdiYWwgPT0gMCkgeworCQlkYXRfbXVsdGk0WzJdID0gZGF0X211bHRpMlsyXSA9IDA7CisJCWRhdF93YmFsMlsyXSA9IDB4MTc7CisJfSBlbHNlIGlmICh3YmFsID09IDEpIHsKKwkJZGF0X211bHRpNFsyXSA9IGRhdF9tdWx0aTJbMl0gPSAwOworCQlkYXRfd2JhbDJbMl0gPSAweDM1OworCX0gZWxzZSBpZiAod2JhbCA9PSAyKSB7CisJCWRhdF9tdWx0aTRbMl0gPSBkYXRfbXVsdGkyWzJdID0gMHgyMDsKKwkJZGF0X3diYWwyWzJdID0gMHgxNzsKKwl9CiAJZGF0X2h2ZmxpcDJbMl0gPSAweDZjICsgMiAqICgxIC0gZmxpcCkgKyAoMSAtIG1pcnJvcik7CiAJZGF0X2h2ZmxpcDRbMl0gPSAweDI0ICsgMiAqICgxIC0gZmxpcCkgKyAoMSAtIG1pcnJvcik7CiAKIAltc2xlZXAoMjAwKTsKLQogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgNSwgMHgwMDAxLCAweDAwMDAsIDAsIE5VTEwpOwotCW1zbGVlcCgzKTsgLyogMzUgKiAqLworCW1zbGVlcCgyKTsKIAogCWNvbW1vbihnc3BjYV9kZXYpOwogCi0JY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAgMSwgMHgwMDQxLCAweDAwMDAsICAwLCBOVUxMKTsKLQltc2xlZXAoNzApOwotCi0JaWYgKF9NSTIwMjBiXykKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAgMSwgMHgwMDQwLCAweDAwMDAsICAwLCBOVUxMKTsKLQorCW1zbGVlcCgxNDIpOwogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgIDEsIDB4MDAxMCwgMHgwMDEwLCAgMCwgTlVMTCk7CiAJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAgMSwgMHgwMDAzLCAweDAwYzEsICAwLCBOVUxMKTsKIAljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAxLCAweDAwNDIsIDB4MDBjMiwgIDAsIE5VTEwpOwpAQCAtNTIzLDggKzQzNiw3IEBACiAJCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsICAzLCAweDAwMDAsIDB4MDIwMCwKIAkJCQkxMiwgZGF0XzgwMCk7CiAKLQkJaWYgKF9NSTIwMjBjXykKLQkJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9sb3cxLAorCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfbG93MSwKIAkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9sb3cxKSk7CiAKIAkJaWYgKHJlc28gPT0gSU1BR0VfODAwKQpAQCAtNTM0LDg3ICs0NDYsMTAgQEAKIAkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2xvdzMsCiAJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9sb3czKSk7CiAKLQkJaWYgKF9NSTIwMjBiXykgewotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwMDEsIDB4MDAxMCwgMCwgTlVMTCk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDAwMCwgMHgwMGMxLCAwLCBOVUxMKTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDQxLCAweDAwYzIsIDAsIE5VTEwpOwotCQkJbXNsZWVwKDE1MCk7Ci0JCX0gZWxzZSBpZiAoX01JMjAyMGNfKSB7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDAxMCwgMHgwMDEwLCAwLCBOVUxMKTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDAwLCAweDAwYzEsIDAsIE5VTEwpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwNDEsIDB4MDBjMiwgMCwgTlVMTCk7Ci0JCQltc2xlZXAoMTIwKTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDQwLCAweDAwMDAsIDAsIE5VTEwpOwotCQkJbXNsZWVwKDMwKTsKLQkJfSBlbHNlIGlmIChfTUkyMDIwXykgewotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwMDEsIDB4MDAxMCwgMCwgTlVMTCk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDAwMCwgMHgwMGMxLCAwLCBOVUxMKTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDQxLCAweDAwYzIsIDAsIE5VTEwpOwotCQkJbXNsZWVwKDEyMCk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MCwgMHgwMDAwLCAwLCBOVUxMKTsKLQkJCW1zbGVlcCgzMCk7Ci0JCX0KLQotCQkvKiBBQyBwb3dlciBmcmVxdWVuY3kgKi8KLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2ZyZXExKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2ZyZXEyKTsKLQkJbXNsZWVwKDIwKTsKLQkJLyogYmFja2xpZ2h0ICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTEpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGkyKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMyk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTQpOwotCQkvKiBhdCBpbml0IHRpbWUgYnV0IG5vdCBhZnRlciAqLwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg4Y1x4YTJceDBjIik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4MTciKTsKLQkJLyogZmluaXNoIHRoZSBiYWNrbGlnaHQgKi8KLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNSk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTYpOwotCQltc2xlZXAoNSk7LyogIiAqLwotCi0JCWlmIChfTUkyMDIwY18pIHsKLQkJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF9sb3c0LAotCQkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0X2xvdzQpKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDAwMDAsIDB4MDAwMCwgMSwgJmMpOwotCQkJbXNsZWVwKDE0KTsgLyogMHhkOCAqLwotCi0JCQkvKiBmbGlwL21pcnJvciAqLwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2h2ZmxpcDEpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2h2ZmxpcDIpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2h2ZmxpcDMpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2h2ZmxpcDQpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2h2ZmxpcDUpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2h2ZmxpcDYpOwotCQkJbXNsZWVwKDIxKTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsCi0JCQkJCTMsIGRhdF9kdW1teTEpOwotCQkJbXNsZWVwKDUpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2R1bW15MSk7Ci0JCQltc2xlZXAoNSk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLAotCQkJCQkzLCBkYXRfZHVtbXkxKTsKLQkJCW1zbGVlcCg1KTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsCi0JCQkJCTMsIGRhdF9kdW1teTEpOwotCQkJbXNsZWVwKDUpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywKLQkJCQkJMywgZGF0X2R1bW15MSk7Ci0JCQltc2xlZXAoNSk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLAotCQkJCQkzLCBkYXRfZHVtbXkxKTsKLQkJCS8qIGVuZCBvZiBmbGlwL21pcnJvciBtYWluIHBhcnQgKi8KLQkJCW1zbGVlcCgyNDYpOyAvKiAxNDYgKi8KLQotCQkJc2QtPm5iSW0gPSAwOwotCQl9CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDEwLCAweDAwMTAsIDAsIE5VTEwpOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDAwMCwgMHgwMGMxLCAwLCBOVUxMKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwNDEsIDB4MDBjMiwgMCwgTlVMTCk7CisJCW1zbGVlcCgxMjApOwogCQlicmVhazsKIAogCWNhc2UgSU1BR0VfMTI4MDoKQEAgLTY0MywxMDggKzQ3OCw2MiBAQAogCQkJCQkzLCAiXHg5MFx4MDRceGIwIik7CiAJCX0KIAotCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfYmlnMSwKLQkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0X2JpZzEpKTsKKwkJZmV0Y2hfaWR4ZGF0YShnc3BjYV9kZXYsIHRibF9pbml0X3Bvc3RfYWx0X2JpZywKKwkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0X2JpZykpOwogCi0JCWlmIChyZXNvID09IElNQUdFXzE2MDApCi0JCQltc2xlZXAoMTMpOyAvKiAxNjAwICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHgyN1x4OTciKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAxXHgwMCIpOwotCQltc2xlZXAoNTMpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg4Y1x4YTFceDIwIik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4MDAiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OGNceGExXHgwMyIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg5MFx4MDBceDAxIik7Ci0JCWlmIChyZXNvID09IElNQUdFXzE2MDApCi0JCQltc2xlZXAoMTMpOyAvKiAxNjAwICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHhhN1x4MDIiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHgwMCIpOwotCQltc2xlZXAoNTMpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg4Y1x4YTFceDIwIik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4NzIiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OGNceGExXHgwMyIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg5MFx4MDBceDAyIik7Ci0JCWlmIChyZXNvID09IElNQUdFXzE2MDApCi0JCQltc2xlZXAoMTMpOyAvKiAxNjAwICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHhhN1x4MDIiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHgwMSIpOwotCQltc2xlZXAoNTMpOwotCi0JCWlmIChfTUkyMDIwYl8pIHsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDAxLCAweDAwMTAsIDAsIE5VTEwpOwotCQkJaWYgKHJlc28gPT0gSU1BR0VfMTYwMCkKLQkJCQltc2xlZXAoNTAwKTsgLyogMTYwMCAqLwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwMDAsIDB4MDBjMSwgMCwgTlVMTCk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MSwgMHgwMGMyLCAwLCBOVUxMKTsKLQkJCW1zbGVlcCgxODUwKTsKLQkJfSBlbHNlIGlmIChfTUkyMDIwY18gfHwgX01JMjAyMF8pIHsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDAxLCAweDAwMTAsIDAsIE5VTEwpOwotCQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwMDAsIDB4MDBjMSwgMCwgTlVMTCk7Ci0JCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MSwgMHgwMGMyLCAwLCBOVUxMKTsKLQkJCW1zbGVlcCgxODUwKTsKLQkJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDQwLCAweDAwMDAsIDAsIE5VTEwpOwotCQkJbXNsZWVwKDMwKTsKLQkJfQotCi0JCS8qIEFDIHBvd2VyIGZyZXF1ZW5jeSAqLwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfZnJlcTEpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfZnJlcTIpOwotCQltc2xlZXAoMjApOwotCQkvKiBiYWNrbGlnaHQgKi8KLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMSk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGkzKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNCk7Ci0JCS8qIGF0IGluaXQgdGltZSBidXQgbm90IGFmdGVyICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHhhMlx4MGMiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHgxNyIpOwotCQkvKiBmaW5pc2ggdGhlIGJhY2tsaWdodCAqLwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGk1KTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNik7Ci0JCW1zbGVlcCg2KTsgLyogIiAqLwotCi0JCWN0cmxfaW4oZ3NwY2FfZGV2LCAweGMwLCAyLCAweDAwMDAsIDB4MDAwMCwgMSwgJmMpOwotCQltc2xlZXAoMTQpOwotCi0JCWlmIChfTUkyMDIwY18pCi0JCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfYmlnMiwKLQkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9iaWcyKSk7Ci0KLQkJLyogZmxpcC9taXJyb3IgKi8KLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2h2ZmxpcDEpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfaHZmbGlwMik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXAzKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2h2ZmxpcDQpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfaHZmbGlwNSk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXA2KTsKLQkJLyogZW5kIG9mIGZsaXAvbWlycm9yIG1haW4gcGFydCAqLwotCQltc2xlZXAoMTYpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg4Y1x4YTFceDAzIik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4MDEiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OGNceGExXHgyMCIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg5MFx4MDBceDAwIik7Ci0JCWlmIChyZXNvID09IElNQUdFXzE2MDApCi0JCQltc2xlZXAoMjUpOyAvKiAxNjAwICovCi0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHhhN1x4MDIiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHgwMCIpOwotCQltc2xlZXAoMTAzKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OGNceGExXHgwMyIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg5MFx4MDBceDAyIik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDhjXHhhMVx4MjAiKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgIlx4OTBceDAwXHg3MiIpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCAiXHg4Y1x4YTdceDAyIik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsICJceDkwXHgwMFx4MDEiKTsKLQkJc2QtPm5iSW0gPSAwOwotCi0JCWlmIChfTUkyMDIwY18pCi0JCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2luaXRfcG9zdF9hbHRfYmlnMywKLQkJCQkJQVJSQVlfU0laRSh0YmxfaW5pdF9wb3N0X2FsdF9iaWczKSk7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDAxLCAweDAwMTAsIDAsIE5VTEwpOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDAwMCwgMHgwMGMxLCAwLCBOVUxMKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwNDEsIDB4MDBjMiwgMCwgTlVMTCk7CisJCW1zbGVlcCgxODUwKTsKIAl9CiAKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MCwgMHgwMDAwLCAwLCBOVUxMKTsKKwltc2xlZXAoNDApOworCisJLyogQUMgcG93ZXIgZnJlcXVlbmN5ICovCisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2ZyZXExKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfZnJlcTIpOworCW1zbGVlcCgzMyk7CisJLyogbGlnaHQgc291cmNlICovCisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMik7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMyk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNCk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X3diYWwxKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfd2JhbDIpOworCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTUpOworCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTYpOworCW1zbGVlcCg3KTsKKwljdHJsX2luKGdzcGNhX2RldiwgMHhjMCwgMiwgMHgwMDAwLCAweDAwMDAsIDEsICZjKTsKKworCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF8zQiwKKwkJCUFSUkFZX1NJWkUodGJsX2luaXRfcG9zdF9hbHRfM0IpKTsKKworCS8qIGh2ZmxpcCAqLworCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXAxKTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfaHZmbGlwMik7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2h2ZmxpcDMpOworCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXA0KTsKKwljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfaHZmbGlwNSk7CisJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2h2ZmxpcDYpOworCW1zbGVlcCgyNTApOworCisJaWYgKHJlc28gPT0gSU1BR0VfNjQwIHx8IHJlc28gPT0gSU1BR0VfODAwKQorCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX21pZGRsZV9odmZsaXBfbG93LAorCQkJCUFSUkFZX1NJWkUodGJsX21pZGRsZV9odmZsaXBfbG93KSk7CisJZWxzZQorCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX21pZGRsZV9odmZsaXBfYmlnLAorCQkJCUFSUkFZX1NJWkUodGJsX21pZGRsZV9odmZsaXBfYmlnKSk7CisKKwlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX2VuZF9odmZsaXAsCisJCQlBUlJBWV9TSVpFKHRibF9lbmRfaHZmbGlwKSk7CisKKwlzZC0+bmJJbSA9IDA7CisKIAlzZC0+dm9sZC5taXJyb3IgICAgPSBtaXJyb3I7CiAJc2QtPnZvbGQuZmxpcCAgICAgID0gZmxpcDsKIAlzZC0+dm9sZC5BQzUwSHogICAgPSBmcmVxOwotCXNkLT52b2xkLmJhY2tsaWdodCA9IGJhY2tsaWdodDsKKwlzZC0+dm9sZC53aGl0ZWJhbCAgPSB3YmFsOwogCiAJbWkyMDIwX2NhbWVyYV9zZXR0aW5ncyhnc3BjYV9kZXYpOwogCkBAIC03NzIsNiArNTYxLDcgQEAKIHN0YXRpYyBpbnQgbWkyMDIwX2NhbWVyYV9zZXR0aW5ncyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXMzMiByZXNvID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbKHMzMikgZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXY7CiAKIAlzMzIgYmFja2xpZ2h0ID0gc2QtPnZjdXIuYmFja2xpZ2h0OwogCXMzMiBicmlnaHQgPSAgc2QtPnZjdXIuYnJpZ2h0bmVzczsKQEAgLTc4Miw2ICs1NzIsNyBAQAogCXMzMiBtaXJyb3IgPSAoKChzZC0+dmN1ci5taXJyb3IgPiAwKSBeIHNkLT5taXJyb3JNYXNrKSA+IDApOwogCXMzMiBmbGlwICAgPSAoKChzZC0+dmN1ci5mbGlwICAgPiAwKSBeIHNkLT5taXJyb3JNYXNrKSA+IDApOwogCXMzMiBmcmVxICAgPSAoc2QtPnZjdXIuQUM1MEh6ID4gMCk7CisJczMyIHdiYWwgICA9IHNkLT52Y3VyLndoaXRlYmFsOwogCiAJdTggZGF0X3NoYXJwW10gPSB7MHg2YywgMHgwMCwgMHgwOH07CiAJdTggZGF0X2JyaWdodDJbXSA9IHsweDkwLCAweDAwLCAweDAwfTsKQEAgLTc5Miw2ICs1ODMsNyBAQAogCXU4IGRhdF9tdWx0aTRbXSA9IHsweDkwLCAweDAwLCAweDAwfTsKIAl1OCBkYXRfaHZmbGlwMltdID0gezB4OTAsIDB4MDQsIDB4NmN9OwogCXU4IGRhdF9odmZsaXA0W10gPSB7MHg5MCwgMHgwMCwgMHgyNH07CisJdTggZGF0X3diYWwyW10gPSB7MHg5MCwgMHgwMCwgMHgwMH07CiAKIAkvKiBMZXNzIHRoYW4gNCBpbWFnZXMgcmVjZWl2ZWQgLT4gdG9vIGVhcmx5IHRvIHNldCB0aGUgc2V0dGluZ3MgKi8KIAlpZiAoc2QtPm5iSW0gPCA0KSB7CkBAIC04MDksNDEgKzYwMSw5NSBAQAogCQltc2xlZXAoMjApOwogCX0KIAorCWlmICh3YmFsICE9IHNkLT52b2xkLndoaXRlYmFsKSB7CisJCXNkLT52b2xkLndoaXRlYmFsID0gd2JhbDsKKwkJaWYgKHdiYWwgPCAwIHx8IHdiYWwgPiBzZC0+dm1heC53aGl0ZWJhbCkKKwkJCXdiYWwgPSAwOworCisJCWRhdF9tdWx0aTFbMl0gPSAweDlkOworCQlkYXRfbXVsdGkzWzJdID0gZGF0X211bHRpMVsyXSArIDE7CisJCWlmICh3YmFsID09IDApIHsKKwkJCWRhdF9tdWx0aTRbMl0gPSBkYXRfbXVsdGkyWzJdID0gMDsKKwkJCWRhdF93YmFsMlsyXSA9IDB4MTc7CisJCX0gZWxzZSBpZiAod2JhbCA9PSAxKSB7CisJCQlkYXRfbXVsdGk0WzJdID0gZGF0X211bHRpMlsyXSA9IDA7CisJCQlkYXRfd2JhbDJbMl0gPSAweDM1OworCQl9IGVsc2UgaWYgKHdiYWwgPT0gMikgeworCQkJZGF0X211bHRpNFsyXSA9IGRhdF9tdWx0aTJbMl0gPSAweDIwOworCQkJZGF0X3diYWwyWzJdID0gMHgxNzsKKwkJfQorCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGkxKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMik7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTMpOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGk0KTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X3diYWwxKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X3diYWwyKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNSk7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTYpOworCX0KKwogCWlmIChtaXJyb3IgIT0gc2QtPnZvbGQubWlycm9yIHx8IGZsaXAgIT0gc2QtPnZvbGQuZmxpcCkgewogCQlzZC0+dm9sZC5taXJyb3IgPSBtaXJyb3I7CiAJCXNkLT52b2xkLmZsaXAgICA9IGZsaXA7CiAKIAkJZGF0X2h2ZmxpcDJbMl0gPSAweDZjICsgMiAqICgxIC0gZmxpcCkgKyAoMSAtIG1pcnJvcik7CiAJCWRhdF9odmZsaXA0WzJdID0gMHgyNCArIDIgKiAoMSAtIGZsaXApICsgKDEgLSBtaXJyb3IpOworCisJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfaW5pdF9wb3N0X2FsdF8zQiwKKwkJCQlBUlJBWV9TSVpFKHRibF9pbml0X3Bvc3RfYWx0XzNCKSk7CisKIAkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2h2ZmxpcDEpOwogCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfaHZmbGlwMik7CiAJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXAzKTsKIAkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2h2ZmxpcDQpOwogCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfaHZmbGlwNSk7CiAJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9odmZsaXA2KTsKLQkJbXNsZWVwKDEzMCk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9kdW1teTEpOwotCQltc2xlZXAoNik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9kdW1teTEpOwotCQltc2xlZXAoNik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9kdW1teTEpOwotCQltc2xlZXAoNik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9kdW1teTEpOwotCQltc2xlZXAoNik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9kdW1teTEpOwotCQltc2xlZXAoNik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9kdW1teTEpOwotCQltc2xlZXAoNik7CisJCW1zbGVlcCg0MCk7CiAKLQkJLyogU29tZXRpbWVzIHByZXNlbnQsIHNvbWV0aW1lcyBub3QsIHVzZWZ1bD8gKi8KLQkJLyogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkyKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkzKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkyKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkzKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkyKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkzKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkyKTsKLQkJICogY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZHVtbXkzKTsqLworCQlpZiAocmVzbyA9PSBJTUFHRV82NDAgfHwgcmVzbyA9PSBJTUFHRV84MDApCisJCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX21pZGRsZV9odmZsaXBfbG93LAorCQkJCQlBUlJBWV9TSVpFKHRibF9taWRkbGVfaHZmbGlwX2xvdykpOworCQllbHNlCisJCQlmZXRjaF9pZHhkYXRhKGdzcGNhX2RldiwgdGJsX21pZGRsZV9odmZsaXBfYmlnLAorCQkJCQlBUlJBWV9TSVpFKHRibF9taWRkbGVfaHZmbGlwX2JpZykpOworCisJCWZldGNoX2lkeGRhdGEoZ3NwY2FfZGV2LCB0YmxfZW5kX2h2ZmxpcCwKKwkJCQlBUlJBWV9TSVpFKHRibF9lbmRfaHZmbGlwKSk7CisJfQorCisJaWYgKGJyaWdodCAhPSBzZC0+dm9sZC5icmlnaHRuZXNzKSB7CisJCXNkLT52b2xkLmJyaWdodG5lc3MgPSBicmlnaHQ7CisJCWlmIChicmlnaHQgPCAwIHx8IGJyaWdodCA+IHNkLT52bWF4LmJyaWdodG5lc3MpCisJCQlicmlnaHQgPSAwOworCisJCWRhdF9icmlnaHQyWzJdID0gYnJpZ2h0OworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfYnJpZ2h0MSk7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9icmlnaHQyKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2JyaWdodDMpOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfYnJpZ2h0NCk7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9icmlnaHQ1KTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2JyaWdodDYpOworCX0KKworCWlmIChjbnRyICE9IHNkLT52b2xkLmNvbnRyYXN0IHx8IGdhbSAhPSBzZC0+dm9sZC5nYW1tYSkgeworCQlzZC0+dm9sZC5jb250cmFzdCA9IGNudHI7CisJCWlmIChjbnRyIDwgMCB8fCBjbnRyID4gc2QtPnZtYXguY29udHJhc3QpCisJCQljbnRyID0gMDsKKwkJc2QtPnZvbGQuZ2FtbWEgPSBnYW07CisJCWlmIChnYW0gPCAwIHx8IGdhbSA+IHNkLT52bWF4LmdhbW1hKQorCQkJZ2FtID0gMDsKKworCQlkYXRfbXVsdGkxWzJdID0gMHg2ZDsKKwkJZGF0X211bHRpM1syXSA9IGRhdF9tdWx0aTFbMl0gKyAxOworCQlpZiAoY250ciA9PSAwKQorCQkJY250ciA9IDQ7CisJCWRhdF9tdWx0aTRbMl0gPSBkYXRfbXVsdGkyWzJdID0gY250ciAqIDB4MTAgKyAyIC0gZ2FtOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGkxKTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMik7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTMpOworCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGk0KTsKKwkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNSk7CisJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTYpOwogCX0KIAogCWlmIChiYWNrbGlnaHQgIT0gc2QtPnZvbGQuYmFja2xpZ2h0KSB7CkBAIC04NjIsNTIgKzcwOCw2IEBACiAJCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTYpOwogCX0KIAotCWlmIChnYW0gIT0gc2QtPnZvbGQuZ2FtbWEpIHsKLQkJc2QtPnZvbGQuZ2FtbWEgPSBnYW07Ci0JCWlmIChnYW0gPCAwIHx8IGdhbSA+IHNkLT52bWF4LmdhbW1hKQotCQkJZ2FtID0gMDsKLQotCQlkYXRfbXVsdGkxWzJdID0gMHg2ZDsKLQkJZGF0X211bHRpM1syXSA9IGRhdF9tdWx0aTFbMl0gKyAxOwotCQlkYXRfbXVsdGk0WzJdID0gZGF0X211bHRpMlsyXSA9IDB4NDAgKyBnYW07Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTEpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGkyKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMyk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTQpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGk1KTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNik7Ci0JfQotCi0JaWYgKGNudHIgIT0gc2QtPnZvbGQuY29udHJhc3QpIHsKLQkJc2QtPnZvbGQuY29udHJhc3QgPSBjbnRyOwotCQlpZiAoY250ciA8IDAgfHwgY250ciA+IHNkLT52bWF4LmNvbnRyYXN0KQotCQkJY250ciA9IDA7Ci0KLQkJZGF0X211bHRpMVsyXSA9IDB4NmQ7Ci0JCWRhdF9tdWx0aTNbMl0gPSBkYXRfbXVsdGkxWzJdICsgMTsKLQkJZGF0X211bHRpNFsyXSA9IGRhdF9tdWx0aTJbMl0gPSAweDEyICsgMTYgKiBjbnRyOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGkxKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpMik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTMpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfbXVsdGk0KTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X211bHRpNSk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9tdWx0aTYpOwotCX0KLQotCWlmIChicmlnaHQgIT0gc2QtPnZvbGQuYnJpZ2h0bmVzcykgewotCQlzZC0+dm9sZC5icmlnaHRuZXNzID0gYnJpZ2h0OwotCQlpZiAoYnJpZ2h0IDwgMCB8fCBicmlnaHQgPiBzZC0+dm1heC5icmlnaHRuZXNzKQotCQkJYnJpZ2h0ID0gMDsKLQotCQlkYXRfYnJpZ2h0MlsyXSA9IGJyaWdodDsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2JyaWdodDEpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfYnJpZ2h0Mik7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9icmlnaHQzKTsKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDdhMDAsIDB4MDAzMywgMywgZGF0X2JyaWdodDQpOwotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDMsIDB4N2EwMCwgMHgwMDMzLCAzLCBkYXRfYnJpZ2h0NSk7Ci0JCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMywgMHg3YTAwLCAweDAwMzMsIDMsIGRhdF9icmlnaHQ2KTsKLQl9Ci0KIAlpZiAoc2hhcnAgIT0gc2QtPnZvbGQuc2hhcnBuZXNzKSB7CiAJCXNkLT52b2xkLnNoYXJwbmVzcyA9IHNoYXJwOwogCQlpZiAoc2hhcnAgPCAwIHx8IHNoYXJwID4gc2QtPnZtYXguc2hhcnBuZXNzKQpAQCAtOTI4LDkgKzcyOCw2IEBACiBzdGF0aWMgdm9pZCBtaTIwMjBfcG9zdF91bnNldF9hbHQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgNSwgMHgwMDAwLCAweDAwMDAsIDAsIE5VTEwpOwotCW1zbGVlcCgyMCk7Ci0JaWYgKF9NSTIwMjBjXyB8fCBfTUkyMDIwXykKLQkJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAxLCAweDAwMDEsIDB4MDAwMCwgMCwgTlVMTCk7Ci0JZWxzZQotCQljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDEsIDB4MDA0MSwgMHgwMDAwLCAwLCBOVUxMKTsKKwltc2xlZXAoNDApOworCWN0cmxfb3V0KGdzcGNhX2RldiwgMHg0MCwgMSwgMHgwMDAxLCAweDAwMDAsIDAsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1vdjk2NTUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAtb3Y5NjU1LmMKaW5kZXggZDQxMjY5NC4uNWFlOTYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC1vdjk2NTUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLW92OTY1NS5jCkBAIC02OSw3ICs2OSw3IEBACiAJIlx4ZDBceDAxXHhkMVx4MDhceGQyXHhlMFx4ZDNceDAxIiAiXHhkNFx4MTBceGQ1XHg4MCIKIH07CiAKLXN0YXRpYyB1OCAqdGJsXzgwMFtdID0geworc3RhdGljIHU4ICp0YmxfMTI4MFtdID0gewogCSJceDAwXHg0MFx4MDdceDZhXHgwNlx4ZjNceDBkXHg2YSIgIlx4MTBceDEwXHhjMVx4MDEiCiAJLAogCSJceDEyXHg4MFx4MDBceDAwXHgwMVx4OThceDAyXHg4MCIgIlx4MDNceDEyXHgwNFx4MDFceDBiXHg1N1x4MGVceDYxIgpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAljdHJsX291dChnc3BjYV9kZXYsIDB4NDAsIDUsIDB4MDAwMSwgMHgwMDAwLCAwLCBOVUxMKTsKIAotCXRibCA9IChyZXNvID09IElNQUdFXzY0MCkgPyB0YmxfNjQwIDogdGJsXzgwMDsKKwl0YmwgPSAocmVzbyA9PSBJTUFHRV82NDApID8gdGJsXzY0MCA6IHRibF8xMjgwOwogCiAJY3RybF9vdXQoZ3NwY2FfZGV2LCAweDQwLCAzLCAweDAwMDAsIDB4MDIwMCwKIAkJCXRibF9sZW5ndGhbMF0sIHRibFswXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmMKaW5kZXggOWU0MjQ3Ni4uZTg2ZWI4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuYwpAQCAtNjMsNyArNjMsNyBAQAogXAogCXNkLT52Y3VyLnRoZW5hbWUgPSB2YWw7XAogCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZylcCi0JCXNkLT5kZXZfY2FtZXJhX3NldHRpbmdzKGdzcGNhX2Rldik7XAorCQlzZC0+d2FpdFNldCA9IDE7XAogCXJldHVybiAwO1wKIH0gXAogc3RhdGljIGludCBzZF9nZXRfIyN0aGVuYW1lKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgczMyICp2YWwpXApAQCAtOTEsNyArOTEsNiBAQAogLyogY29udHJvbCB0YWJsZSAqLwogc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzX21pMTMyMFtHTDg2MF9OQ1RSTFNdOwogc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzX21pMjAyMFtHTDg2MF9OQ1RSTFNdOwotc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzX21pMjAyMGJbR0w4NjBfTkNUUkxTXTsKIHN0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc19vdjI2NDBbR0w4NjBfTkNUUkxTXTsKIHN0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc19vdjk2NTVbR0w4NjBfTkNUUkxTXTsKIApAQCAtMTIxLDggKzEyMCw2IEBACiAJCXNkX2N0cmxzID0gc2RfY3RybHNfbWkxMzIwOwogCWVsc2UgaWYgKF9NSTIwMjBfKQogCQlzZF9jdHJscyA9IHNkX2N0cmxzX21pMjAyMDsKLQllbHNlIGlmIChfTUkyMDIwYl8pCi0JCXNkX2N0cmxzID0gc2RfY3RybHNfbWkyMDIwYjsKIAllbHNlIGlmIChfT1YyNjQwXykKIAkJc2RfY3RybHMgPSBzZF9jdHJsc19vdjI2NDA7CiAJZWxzZSBpZiAoX09WOTY1NV8pCkBAIC0xODcsMTkgKzE4NCw2IEBACiAJLmRxX2NhbGxiYWNrID0gc2RfY2FsbGJhY2ssCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzY19taTIwMjBiID0gewotCS5uYW1lICAgICAgICA9IE1PRFVMRV9OQU1FLAotCS5jdHJscyAgICAgICA9IHNkX2N0cmxzX21pMjAyMGIsCi0JLm5jdHJscyAgICAgID0gR0w4NjBfTkNUUkxTLAotCS5jb25maWcgICAgICA9IHNkX2NvbmZpZywKLQkuaW5pdCAgICAgICAgPSBzZF9pbml0LAotCS5pc29jX2luaXQgICA9IHNkX2lzb2NfaW5pdCwKLQkuc3RhcnQgICAgICAgPSBzZF9zdGFydCwKLQkuc3RvcDAgICAgICAgPSBzZF9zdG9wMCwKLQkucGt0X3NjYW4gICAgPSBzZF9wa3Rfc2NhbiwKLQkuZHFfY2FsbGJhY2sgPSBzZF9jYWxsYmFjaywKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjX292MjY0MCA9IHsKIAkubmFtZSAgICAgICAgPSBNT0RVTEVfTkFNRSwKIAkuY3RybHMgICAgICAgPSBzZF9jdHJsc19vdjI2NDAsCkBAIC0yMzUsOSArMjE5LDkgQEAKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAkJLnByaXYgPSAwCiAJfSwKLQl7IDgwMCwgIDYwMCwgVjRMMl9QSVhfRk1UX1NHQlJHOCwgVjRMMl9GSUVMRF9OT05FLAorCXsgODAwLCAgNTk4LCBWNEwyX1BJWF9GTVRfU0dCUkc4LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSA4MDAsCi0JCS5zaXplaW1hZ2UgPSA4MDAgKiA2MDAsCisJCS5zaXplaW1hZ2UgPSA4MDAgKiA1OTgsCiAJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCiAJCS5wcml2ID0gMQogCX0sCkBAIC0yNDcsOSArMjMxLDkgQEAKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAkJLnByaXYgPSAyCiAJfSwKLQl7MTYwMCwgMTIwMCwgVjRMMl9QSVhfRk1UX1NHQlJHOCwgVjRMMl9GSUVMRF9OT05FLAorCXsxNjAwLCAxMTk4LCBWNEwyX1BJWF9GTVRfU0dCUkc4LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAxNjAwLAotCQkuc2l6ZWltYWdlID0gMTYwMCAqIDEyMDAsCisJCS5zaXplaW1hZ2UgPSAxNjAwICogMTE5OCwKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAkJLnByaXYgPSAzCiAJfSwKQEAgLTM0NCw4ICszMjgsNiBAQAogCQlzZC0+c2Vuc29yID0gSURfT1Y5NjU1OwogCWVsc2UgaWYgKHN0cmNtcChzZW5zb3IsICJNSTIwMjAiKSA9PSAwKQogCQlzZC0+c2Vuc29yID0gSURfTUkyMDIwOwotCWVsc2UgaWYgKHN0cmNtcChzZW5zb3IsICJNSTIwMjBiIikgPT0gMCkKLQkJc2QtPnNlbnNvciA9IElEX01JMjAyMGI7CiAKIAkvKiBHZXQgc2Vuc29yIGFuZCBzZXQgdGhlIHN1aXRhYmxlIGluaXQvc3RhcnQvLi4vc3RvcCBmdW5jdGlvbnMgKi8KIAlpZiAoZ2w4NjBfZ3Vlc3Nfc2Vuc29yKGdzcGNhX2RldiwgdmVuZG9yX2lkLCBwcm9kdWN0X2lkKSA9PSAtMSkKQEAgLTM2OSwxMyArMzUxLDYgQEAKIAkJZGV2X2luaXRfc2V0dGluZ3MgICA9IG1pMjAyMF9pbml0X3NldHRpbmdzOwogCQlicmVhazsKIAotCWNhc2UgSURfTUkyMDIwYjoKLQkJZ3NwY2FfZGV2LT5zZF9kZXNjID0gJnNkX2Rlc2NfbWkyMDIwYjsKLQkJY2FtLT5jYW1fbW9kZSA9IG1pMjAyMF9tb2RlOwotCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUobWkyMDIwX21vZGUpOwotCQlkZXZfaW5pdF9zZXR0aW5ncyAgID0gbWkyMDIwX2luaXRfc2V0dGluZ3M7Ci0JCWJyZWFrOwotCiAJY2FzZSBJRF9PVjI2NDA6CiAJCWdzcGNhX2Rldi0+c2RfZGVzYyA9ICZzZF9kZXNjX292MjY0MDsKIAkJY2FtLT5jYW1fbW9kZSA9IG92MjY0MF9tb2RlOwpAQCAtNjIwLDEwICs1OTUsNyBAQAogCWVsc2UgaWYgKGxlbiA+IDEgJiYgciA8IGxlbikKIAkJUERFQlVHKERfRVJSLCAic2hvcnQgY3RybCB0cmFuc2ZlciAlZC8lZCIsIHIsIGxlbik7CiAKLQlpZiAoKF9NSTIwMjBfIHx8IF9NSTIwMjBiXyB8fCBfTUkyMDIwY18pICYmICh2YWwgfHwgaW5kZXgpKQotCQltc2xlZXAoMSk7Ci0JaWYgKF9PVjI2NDBfKQotCQltc2xlZXAoMSk7CisJbXNsZWVwKDEpOwogCiAJcmV0dXJuIHI7CiB9CkBAIC03NjcsOCArNzM5LDYgQEAKIAkJUERFQlVHKERfUFJPQkUsICIwNWUzOmYxOTEgc2Vuc29yIE1JMTMyMCAoMS4zTSkiKTsKIAl9IGVsc2UgaWYgKF9NSTIwMjBfKSB7CiAJCVBERUJVRyhEX1BST0JFLCAiMDVlMzowNTAzIHNlbnNvciBNSTIwMjAgKDIuME0pIik7Ci0JfSBlbHNlIGlmIChfTUkyMDIwYl8pIHsKLQkJUERFQlVHKERfUFJPQkUsICIwNWUzOjA1MDMgc2Vuc29yIE1JMjAyMCBhbHQuIGRyaXZlciAoMi4wTSkiKTsKIAl9IGVsc2UgaWYgKF9PVjk2NTVfKSB7CiAJCVBERUJVRyhEX1BST0JFLCAiMDVlMzowNTAzIHNlbnNvciBPVjk2NTUgKDEuM00pIik7CiAJfSBlbHNlIGlmIChfT1YyNjQwXykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oCmluZGV4IDMwNTA2MWYuLjQ5YWQ0YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmgKQEAgLTMyLDE5ICszMiwxNiBAQAogI2RlZmluZSBJRF9PVjI2NDAgICAyCiAjZGVmaW5lIElEX09WOTY1NSAgIDQKICNkZWZpbmUgSURfTUkyMDIwICAgOAotI2RlZmluZSBJRF9NSTIwMjBiIDE2CiAKICNkZWZpbmUgX01JMTMyMF8gICgoKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXYpLT5zZW5zb3IgPT0gSURfTUkxMzIwKQogI2RlZmluZSBfTUkyMDIwXyAgKCgoc3RydWN0IHNkICopIGdzcGNhX2RldiktPnNlbnNvciA9PSBJRF9NSTIwMjApCi0jZGVmaW5lIF9NSTIwMjBiXyAoKChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2KS0+c2Vuc29yID09IElEX01JMjAyMGIpCi0jZGVmaW5lIF9NSTIwMjBjXyAwCiAjZGVmaW5lIF9PVjI2NDBfICAoKChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2KS0+c2Vuc29yID09IElEX09WMjY0MCkKICNkZWZpbmUgX09WOTY1NV8gICgoKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXYpLT5zZW5zb3IgPT0gSURfT1Y5NjU1KQogCiAjZGVmaW5lIElNQUdFXzY0MCAgIDAKICNkZWZpbmUgSU1BR0VfODAwICAgMQogI2RlZmluZSBJTUFHRV8xMjgwICAyCi0jZGVmaW5lIElNQUdFXzE2MDAgMworI2RlZmluZSBJTUFHRV8xNjAwICAzCiAKIHN0cnVjdCBzZF9nbDg2MCB7CiAJdTE2IGJhY2tsaWdodDsKQEAgLTc1LDEwICs3MiwxMCBAQAogCWludCAgKCpkZXZfY2FtZXJhX3NldHRpbmdzKShzdHJ1Y3QgZ3NwY2FfZGV2ICopOwogCiAJdTggICBzd2FwUkI7Ci0JdTggIG1pcnJvck1hc2s7Ci0JdTggIHNlbnNvcjsKLQlzMzIgbmJJbTsKLQlzMzIgbmJSaWdodFVwOworCXU4ICAgbWlycm9yTWFzazsKKwl1OCAgIHNlbnNvcjsKKwlzMzIgIG5iSW07CisJczMyICBuYlJpZ2h0VXA7CiAJdTggICB3YWl0U2V0OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCmluZGV4IDY3ODY3NWIuLmQ5NTFiMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAJYnVmZmVyX2xlbiA9IGxlMTZfdG9fY3B1KGVwLT53TWF4UGFja2V0U2l6ZSk7CiAJaW50ZXJ2YWwgPSBlcC0+YkludGVydmFsOwotCVBERUJVRyhEX1BST0JFLCAiZm91bmQgaW50IGluIGVuZHBvaW50OiAweCV4LCAiCisJUERFQlVHKERfQ09ORiwgImZvdW5kIGludCBpbiBlbmRwb2ludDogMHgleCwgIgogCQkiYnVmZmVyX2xlbj0ldSwgaW50ZXJ2YWw9JXUiLAogCQllcC0+YkVuZHBvaW50QWRkcmVzcywgYnVmZmVyX2xlbiwgaW50ZXJ2YWwpOwogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlnc3BjYV9kZXYtPmludF91cmIgPSB1cmI7CiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmV0IDwgMCkgewotCQlQREVCVUcoRF9FUlIsICJzdWJtaXQgVVJCIGZhaWxlZCB3aXRoIGVycm9yICVpIiwgcmV0KTsKKwkJUERFQlVHKERfRVJSLCAic3VibWl0IGludCBVUkIgZmFpbGVkIHdpdGggZXJyb3IgJWkiLCByZXQpOwogCQlnb3RvIGVycm9yX3N1Ym1pdDsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTI5NCwxOSArMjk0LDYgQEAKIH0KICNlbmRpZgogCi0vKiBnZXQgdGhlIGN1cnJlbnQgaW5wdXQgZnJhbWUgYnVmZmVyICovCi1zdHJ1Y3QgZ3NwY2FfZnJhbWUgKmdzcGNhX2dldF9pX2ZyYW1lKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwotCi0JZnJhbWUgPSBnc3BjYV9kZXYtPmN1cl9mcmFtZTsKLQlpZiAoKGZyYW1lLT52NGwyX2J1Zi5mbGFncyAmIEJVRl9BTExfRkxBR1MpCi0JCQkJIT0gVjRMMl9CVUZfRkxBR19RVUVVRUQpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBmcmFtZTsKLX0KLUVYUE9SVF9TWU1CT0woZ3NwY2FfZ2V0X2lfZnJhbWUpOwotCiAvKgogICogZmlsbCBhIHZpZGVvIGZyYW1lIGZyb20gYW4gVVJCIGFuZCByZXN1Ym1pdAogICovCkBAIC00MzksMjAgKzQyNiwyMCBAQAogCiAJUERFQlVHKERfUEFDSywgImFkZCB0OiVkIGw6JWQiLAlwYWNrZXRfdHlwZSwgbGVuKTsKIAotCS8qIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGZyYW1lIGJ1ZmZlciAqLwotCWZyYW1lID0gZ3NwY2FfZGV2LT5jdXJfZnJhbWU7Ci0JaWYgKChmcmFtZS0+djRsMl9idWYuZmxhZ3MgJiBCVUZfQUxMX0ZMQUdTKQotCQkJCQkhPSBWNEwyX0JVRl9GTEFHX1FVRVVFRCkgewotCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHdoZW4gc3RhcnQgb2YgYSBuZXcgZnJhbWUsIGlmIHRoZSBjdXJyZW50IGZyYW1lIGJ1ZmZlcgotCSAqIGlzIG5vdCBxdWV1ZWQsIGRpc2NhcmQgdGhlIHdob2xlIGZyYW1lICovCiAJaWYgKHBhY2tldF90eXBlID09IEZJUlNUX1BBQ0tFVCkgewotCQlmcmFtZS0+ZGF0YV9lbmQgPSBmcmFtZS0+ZGF0YTsKKwkJaSA9IGF0b21pY19yZWFkKCZnc3BjYV9kZXYtPmZyX2kpOworCisJCS8qIGlmIHRoZXJlIGFyZSBubyBxdWV1ZWQgYnVmZmVyLCBkaXNjYXJkIHRoZSB3aG9sZSBmcmFtZSAqLworCQlpZiAoaSA9PSBhdG9taWNfcmVhZCgmZ3NwY2FfZGV2LT5mcl9xKSkgeworCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCQlyZXR1cm47CisJCX0KKwkJaiA9IGdzcGNhX2Rldi0+ZnJfcXVldWVbaV07CisJCWZyYW1lID0gJmdzcGNhX2Rldi0+ZnJhbWVbal07CiAJCWZyYW1lLT52NGwyX2J1Zi50aW1lc3RhbXAgPSBrdGltZV90b190aW1ldmFsKGt0aW1lX2dldCgpKTsKIAkJZnJhbWUtPnY0bDJfYnVmLnNlcXVlbmNlID0gKytnc3BjYV9kZXYtPnNlcXVlbmNlOworCQlnc3BjYV9kZXYtPmltYWdlID0gZnJhbWUtPmRhdGE7CisJCWdzcGNhX2Rldi0+aW1hZ2VfbGVuID0gMDsKIAl9IGVsc2UgaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9PSBESVNDQVJEX1BBQ0tFVCkgewogCQlpZiAocGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpCiAJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBwYWNrZXRfdHlwZTsKQEAgLTQ2MSwzNCArNDQ4LDM3IEBACiAKIAkvKiBhcHBlbmQgdGhlIHBhY2tldCB0byB0aGUgZnJhbWUgYnVmZmVyICovCiAJaWYgKGxlbiA+IDApIHsKLQkJaWYgKGZyYW1lLT5kYXRhX2VuZCAtIGZyYW1lLT5kYXRhICsgbGVuCi0JCQkJCQkgPiBmcmFtZS0+djRsMl9idWYubGVuZ3RoKSB7Ci0JCQlQREVCVUcoRF9FUlJ8RF9QQUNLLCAiZnJhbWUgb3ZlcmZsb3cgJXpkID4gJWQiLAotCQkJCWZyYW1lLT5kYXRhX2VuZCAtIGZyYW1lLT5kYXRhICsgbGVuLAotCQkJCWZyYW1lLT52NGwyX2J1Zi5sZW5ndGgpOworCQlpZiAoZ3NwY2FfZGV2LT5pbWFnZV9sZW4gKyBsZW4gPiBnc3BjYV9kZXYtPmZyc3opIHsKKwkJCVBERUJVRyhEX0VSUnxEX1BBQ0ssICJmcmFtZSBvdmVyZmxvdyAlZCA+ICVkIiwKKwkJCQlnc3BjYV9kZXYtPmltYWdlX2xlbiArIGxlbiwKKwkJCQlnc3BjYV9kZXYtPmZyc3opOwogCQkJcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKIAkJfSBlbHNlIHsKLQkJCW1lbWNweShmcmFtZS0+ZGF0YV9lbmQsIGRhdGEsIGxlbik7Ci0JCQlmcmFtZS0+ZGF0YV9lbmQgKz0gbGVuOworCQkJbWVtY3B5KGdzcGNhX2Rldi0+aW1hZ2UgKyBnc3BjYV9kZXYtPmltYWdlX2xlbiwKKwkJCQlkYXRhLCBsZW4pOworCQkJZ3NwY2FfZGV2LT5pbWFnZV9sZW4gKz0gbGVuOwogCQl9CiAJfQogCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IHBhY2tldF90eXBlOwogCi0JLyogaWYgbGFzdCBwYWNrZXQsIHdha2UgdXAgdGhlIGFwcGxpY2F0aW9uIGFuZCBhZHZhbmNlIGluIHRoZSBxdWV1ZSAqLworCS8qIGlmIGxhc3QgcGFja2V0LCBpbnZhbGlkYXRlIHBhY2tldCBjb25jYXRlbmF0aW9uIHVudGlsCisJICogbmV4dCBmaXJzdCBwYWNrZXQsIHdha2UgdXAgdGhlIGFwcGxpY2F0aW9uIGFuZCBhZHZhbmNlCisJICogaW4gdGhlIHF1ZXVlICovCiAJaWYgKHBhY2tldF90eXBlID09IExBU1RfUEFDS0VUKSB7Ci0JCWZyYW1lLT52NGwyX2J1Zi5ieXRlc3VzZWQgPSBmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YTsKLQkJZnJhbWUtPnY0bDJfYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1FVRVVFRDsKLQkJZnJhbWUtPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnc3BjYV9kZXYtPndxKTsJLyogZXZlbnQgPSBuZXcgZnJhbWUgKi8KLQkJaSA9IChnc3BjYV9kZXYtPmZyX2kgKyAxKSAlIGdzcGNhX2Rldi0+bmZyYW1lczsKLQkJZ3NwY2FfZGV2LT5mcl9pID0gaTsKLQkJUERFQlVHKERfRlJBTSwgImZyYW1lIGNvbXBsZXRlIGxlbjolZCBxOiVkIGk6JWQgbzolZCIsCi0JCQlmcmFtZS0+djRsMl9idWYuYnl0ZXN1c2VkLAotCQkJZ3NwY2FfZGV2LT5mcl9xLAotCQkJaSwKLQkJCWdzcGNhX2Rldi0+ZnJfbyk7CisJCWkgPSBhdG9taWNfcmVhZCgmZ3NwY2FfZGV2LT5mcl9pKTsKIAkJaiA9IGdzcGNhX2Rldi0+ZnJfcXVldWVbaV07Ci0JCWdzcGNhX2Rldi0+Y3VyX2ZyYW1lID0gJmdzcGNhX2Rldi0+ZnJhbWVbal07CisJCWZyYW1lID0gJmdzcGNhX2Rldi0+ZnJhbWVbal07CisJCWZyYW1lLT52NGwyX2J1Zi5ieXRlc3VzZWQgPSBnc3BjYV9kZXYtPmltYWdlX2xlbjsKKwkJZnJhbWUtPnY0bDJfYnVmLmZsYWdzID0gKGZyYW1lLT52NGwyX2J1Zi5mbGFncworCQkJCQkgfCBWNEwyX0JVRl9GTEFHX0RPTkUpCisJCQkJCSYgflY0TDJfQlVGX0ZMQUdfUVVFVUVEOworCQlpID0gKGkgKyAxKSAlIEdTUENBX01BWF9GUkFNRVM7CisJCWF0b21pY19zZXQoJmdzcGNhX2Rldi0+ZnJfaSwgaSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3NwY2FfZGV2LT53cSk7CS8qIGV2ZW50ID0gbmV3IGZyYW1lICovCisJCVBERUJVRyhEX0ZSQU0sICJmcmFtZSBjb21wbGV0ZSBsZW46JWQiLAorCQkJZnJhbWUtPnY0bDJfYnVmLmJ5dGVzdXNlZCk7CisJCWdzcGNhX2Rldi0+aW1hZ2UgPSBOVUxMOworCQlnc3BjYV9kZXYtPmltYWdlX2xlbiA9IDA7CiAJfQogfQogRVhQT1JUX1NZTUJPTChnc3BjYV9mcmFtZV9hZGQpOwpAQCAtNTA2LDM2ICs0OTYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCAqcnZtYWxsb2MobG9uZyBzaXplKQotewotCXZvaWQgKm1lbTsKLQl1bnNpZ25lZCBsb25nIGFkcjsKLQotCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7Ci0JaWYgKG1lbSAhPSBOVUxMKSB7Ci0JCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07Ci0JCXdoaWxlIChzaXplID4gMCkgewotCQkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKSBhZHIpKTsKLQkJCWFkciArPSBQQUdFX1NJWkU7Ci0JCQlzaXplIC09IFBBR0VfU0laRTsKLQkJfQotCX0KLQlyZXR1cm4gbWVtOwotfQotCi1zdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqbWVtLCBsb25nIHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBhZHI7Ci0KLQlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOwotCXdoaWxlIChzaXplID4gMCkgewotCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKikgYWRyKSk7Ci0JCWFkciArPSBQQUdFX1NJWkU7Ci0JCXNpemUgLT0gUEFHRV9TSVpFOwotCX0KLQl2ZnJlZShtZW0pOwotfQotCiBzdGF0aWMgaW50IGZyYW1lX2FsbG9jKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXVuc2lnbmVkIGludCBjb3VudCkKIHsKQEAgLTU0OCw5ICs1MDgsOSBAQAogCVBERUJVRyhEX1NUUkVBTSwgImZyYW1lIGFsbG9jIGZyc3o6ICVkIiwgZnJzeik7CiAJZnJzeiA9IFBBR0VfQUxJR04oZnJzeik7CiAJZ3NwY2FfZGV2LT5mcnN6ID0gZnJzejsKLQlpZiAoY291bnQgPiBHU1BDQV9NQVhfRlJBTUVTKQotCQljb3VudCA9IEdTUENBX01BWF9GUkFNRVM7Ci0JZ3NwY2FfZGV2LT5mcmJ1ZiA9IHJ2bWFsbG9jKGZyc3ogKiBjb3VudCk7CisJaWYgKGNvdW50ID49IEdTUENBX01BWF9GUkFNRVMpCisJCWNvdW50ID0gR1NQQ0FfTUFYX0ZSQU1FUyAtIDE7CisJZ3NwY2FfZGV2LT5mcmJ1ZiA9IHZtYWxsb2NfMzIoZnJzeiAqIGNvdW50KTsKIAlpZiAoIWdzcGNhX2Rldi0+ZnJidWYpIHsKIAkJZXJyKCJmcmFtZSBhbGxvYyBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NjUsMTQgKzUyNSwxMiBAQAogCQlmcmFtZS0+djRsMl9idWYubGVuZ3RoID0gZnJzejsKIAkJZnJhbWUtPnY0bDJfYnVmLm1lbW9yeSA9IGdzcGNhX2Rldi0+bWVtb3J5OwogCQlmcmFtZS0+djRsMl9idWYuc2VxdWVuY2UgPSAwOwotCQlmcmFtZS0+ZGF0YSA9IGZyYW1lLT5kYXRhX2VuZCA9Ci0JCQkJCWdzcGNhX2Rldi0+ZnJidWYgKyBpICogZnJzejsKKwkJZnJhbWUtPmRhdGEgPSBnc3BjYV9kZXYtPmZyYnVmICsgaSAqIGZyc3o7CiAJCWZyYW1lLT52NGwyX2J1Zi5tLm9mZnNldCA9IGkgKiBmcnN6OwogCX0KLQlnc3BjYV9kZXYtPmZyX2kgPSBnc3BjYV9kZXYtPmZyX28gPSBnc3BjYV9kZXYtPmZyX3EgPSAwOwotCWdzcGNhX2Rldi0+Y3VyX2ZyYW1lID0gJmdzcGNhX2Rldi0+ZnJhbWVbMF07Ci0JZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7Ci0JZ3NwY2FfZGV2LT5zZXF1ZW5jZSA9IDA7CisJYXRvbWljX3NldCgmZ3NwY2FfZGV2LT5mcl9xLCAwKTsKKwlhdG9taWNfc2V0KCZnc3BjYV9kZXYtPmZyX2ksIDApOworCWdzcGNhX2Rldi0+ZnJfbyA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4Miw4ICs1NDAsNyBAQAogCiAJUERFQlVHKERfU1RSRUFNLCAiZnJhbWUgZnJlZSIpOwogCWlmIChnc3BjYV9kZXYtPmZyYnVmICE9IE5VTEwpIHsKLQkJcnZmcmVlKGdzcGNhX2Rldi0+ZnJidWYsCi0JCQlnc3BjYV9kZXYtPm5mcmFtZXMgKiBnc3BjYV9kZXYtPmZyc3opOworCQl2ZnJlZShnc3BjYV9kZXYtPmZyYnVmKTsKIAkJZ3NwY2FfZGV2LT5mcmJ1ZiA9IE5VTEw7CiAJCWZvciAoaSA9IDA7IGkgPCBnc3BjYV9kZXYtPm5mcmFtZXM7IGkrKykKIAkJCWdzcGNhX2Rldi0+ZnJhbWVbaV0uZGF0YSA9IE5VTEw7CkBAIC02ODMsMTIgKzY0MCwxNiBAQAogCQkJCSAgIDogVVNCX0VORFBPSU5UX1hGRVJfSVNPQzsKIAlpID0gZ3NwY2FfZGV2LT5hbHQ7CQkJLyogcHJldmlvdXMgYWx0IHNldHRpbmcgKi8KIAlpZiAoZ3NwY2FfZGV2LT5jYW0ucmV2ZXJzZV9hbHRzKSB7CisJCWlmIChnc3BjYV9kZXYtPmF1ZGlvKQorCQkJaSsrOwogCQl3aGlsZSAoKytpIDwgZ3NwY2FfZGV2LT5uYmFsdCkgewogCQkJZXAgPSBhbHRfeGZlcigmaW50Zi0+YWx0c2V0dGluZ1tpXSwgeGZlcik7CiAJCQlpZiAoZXApCiAJCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgeworCQlpZiAoZ3NwY2FfZGV2LT5hdWRpbykKKwkJCWktLTsKIAkJd2hpbGUgKC0taSA+PSAwKSB7CiAJCQllcCA9IGFsdF94ZmVyKCZpbnRmLT5hbHRzZXR0aW5nW2ldLCB4ZmVyKTsKIAkJCWlmIChlcCkKQEAgLTgxMSw2ICs3NzIsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyogcmVzZXQgdGhlIHN0cmVhbWluZyB2YXJpYWJsZXMgKi8KKwlnc3BjYV9kZXYtPmltYWdlID0gTlVMTDsKKwlnc3BjYV9kZXYtPmltYWdlX2xlbiA9IDA7CisJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJZ3NwY2FfZGV2LT5zZXF1ZW5jZSA9IDA7CisKIAlnc3BjYV9kZXYtPnVzYl9lcnIgPSAwOwogCiAJLyogc2V0IHRoZSBoaWdoZXIgYWx0ZXJuYXRlIHNldHRpbmcgYW5kCkBAIC0xNDMzLDM0ICsxNDAwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKmZpeG1lOiBoYXZlIGFuIGF1ZGlvIGZsYWcgaW4gZ3NwY2FfZGV2PyovCi1zdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmluZGV4ICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbykKLXsKLQlzdHJjcHkoYXVkaW8tPm5hbWUsICJNaWNyb3Bob25lIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2VudW1hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSBzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5pbmRleCAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0cmNweShhdWRpby0+bmFtZSwgIk1pY3JvcGhvbmUiKTsKLQlhdWRpby0+Y2FwYWJpbGl0eSA9IDA7Ci0JYXVkaW8tPm1vZGUgPSAwOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHZpZGlvY19xdWVyeW1lbnUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgc3RydWN0IHY0bDJfcXVlcnltZW51ICpxbWVudSkKIHsKQEAgLTE1MDQsNyArMTQ0Myw4IEBACiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gcHJpdjsKIAlpbnQgaSwgcmV0ID0gMCwgc3RyZWFtaW5nOwogCi0Jc3dpdGNoIChyYi0+bWVtb3J5KSB7CisJaSA9IHJiLT5tZW1vcnk7CQkJLyogKGF2b2lkIGNvbXBpbGF0aW9uIHdhcm5pbmcpICovCisJc3dpdGNoIChpKSB7CiAJY2FzZSBHU1BDQV9NRU1PUllfUkVBRDoJCQkvKiAoaW50ZXJuYWwgY2FsbCkgKi8KIAljYXNlIFY0TDJfTUVNT1JZX01NQVA6CiAJY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgpAQCAtMTYyNiw3ICsxNTY2LDcgQEAKIAkJCQllbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGUpCiB7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gcHJpdjsKLQlpbnQgaSwgcmV0OworCWludCByZXQ7CiAKIAlpZiAoYnVmX3R5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2NTAsMTIgKzE1OTAsMTAgQEAKIAlnc3BjYV9zdHJlYW1fb2ZmKGdzcGNhX2Rldik7CiAJbXV0ZXhfdW5sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKIAotCS8qIGVtcHR5IHRoZSBhcHBsaWNhdGlvbiBxdWV1ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZ3NwY2FfZGV2LT5uZnJhbWVzOyBpKyspCi0JCWdzcGNhX2Rldi0+ZnJhbWVbaV0udjRsMl9idWYuZmxhZ3MgJj0gfkJVRl9BTExfRkxBR1M7Ci0JZ3NwY2FfZGV2LT5mcl9pID0gZ3NwY2FfZGV2LT5mcl9vID0gZ3NwY2FfZGV2LT5mcl9xID0gMDsKLQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQlnc3BjYV9kZXYtPnNlcXVlbmNlID0gMDsKKwkvKiBlbXB0eSB0aGUgdHJhbnNmZXIgcXVldWVzICovCisJYXRvbWljX3NldCgmZ3NwY2FfZGV2LT5mcl9xLCAwKTsKKwlhdG9taWNfc2V0KCZnc3BjYV9kZXYtPmZyX2ksIDApOworCWdzcGNhX2Rldi0+ZnJfbyA9IDA7CiAJcmV0ID0gMDsKIG91dDoKIAltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+cXVldWVfbG9jayk7CkBAIC0xNzMyLDcgKzE2NzAsNyBAQAogCWludCBuOwogCiAJbiA9IHBhcm0tPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVyczsKLQlpZiAobiA9PSAwIHx8IG4gPiBHU1BDQV9NQVhfRlJBTUVTKQorCWlmIChuID09IDAgfHwgbiA+PSBHU1BDQV9NQVhfRlJBTUVTKQogCQlwYXJtLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBnc3BjYV9kZXYtPm5idWZyZWFkOwogCWVsc2UKIAkJZ3NwY2FfZGV2LT5uYnVmcmVhZCA9IG47CkBAIC0xNzU1LDQ5ICsxNjkzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotc3RhdGljIGludCB2aWRpb2NnbWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCXN0cnVjdCB2aWRlb19tYnVmICptYnVmKQotewotCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgaTsKLQotCVBERUJVRyhEX1NUUkVBTSwgImNnbWJ1ZiIpOwotCWlmIChnc3BjYV9kZXYtPm5mcmFtZXMgPT0gMCkgewotCQlpbnQgcmV0OwotCi0JCXsKLQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7Ci0KLQkJCWZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQkJaSA9IGdzcGNhX2Rldi0+Y2FtLm5tb2RlcyAtIDE7CS8qIGhpZ2hlc3QgbW9kZSAqLwotCQkJZm10LmZtdC5waXgud2lkdGggPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtpXS53aWR0aDsKLQkJCWZtdC5mbXQucGl4LmhlaWdodCA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2ldLmhlaWdodDsKLQkJCWZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjI0OwotCQkJcmV0ID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgJmZtdCk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByYjsKLQotCQkJbWVtc2V0KCZyYiwgMCwgc2l6ZW9mIHJiKTsKLQkJCXJiLmNvdW50ID0gNDsKLQkJCXJiLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCQlyYi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQkJcmV0ID0gdmlkaW9jX3JlcWJ1ZnMoZmlsZSwgcHJpdiwgJnJiKTsKLQkJCWlmIChyZXQgIT0gMCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCW1idWYtPmZyYW1lcyA9IGdzcGNhX2Rldi0+bmZyYW1lczsKLQltYnVmLT5zaXplID0gZ3NwY2FfZGV2LT5mcnN6ICogZ3NwY2FfZGV2LT5uZnJhbWVzOwotCWZvciAoaSA9IDA7IGkgPCBtYnVmLT5mcmFtZXM7IGkrKykKLQkJbWJ1Zi0+b2Zmc2V0c1tpXSA9IGdzcGNhX2Rldi0+ZnJhbWVbaV0udjRsMl9idWYubS5vZmZzZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGludCBkZXZfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtMTgzOCwxMiArMTczMyw3IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkvKiB2NGwxIG1hcHMgYWxsIHRoZSBidWZmZXJzICovCi0JaWYgKGkgIT0gMAotCSAgICB8fCBzaXplICE9IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGggKiBnc3BjYV9kZXYtPm5mcmFtZXMpCi0jZW5kaWYKLQkgICAgaWYgKHNpemUgIT0gZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCkgeworCWlmIChzaXplICE9IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGgpIHsKIAkJUERFQlVHKERfU1RSRUFNLCAibW1hcCBiYWQgc2l6ZSIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTE4ODMsMjEgKzE3NzMsMTcgQEAKIHN0YXRpYyBpbnQgZnJhbWVfd2FpdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCQlpbnQgbm9uYmxvY2tfaW5nKQogewotCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7Ci0JaW50IGksIGosIHJldDsKKwlpbnQgaSwgcmV0OwogCiAJLyogY2hlY2sgaWYgYSBmcmFtZSBpcyByZWFkeSAqLwogCWkgPSBnc3BjYV9kZXYtPmZyX287Ci0JaiA9IGdzcGNhX2Rldi0+ZnJfcXVldWVbaV07Ci0JZnJhbWUgPSAmZ3NwY2FfZGV2LT5mcmFtZVtqXTsKLQotCWlmICghKGZyYW1lLT52NGwyX2J1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfRE9ORSkpIHsKKwlpZiAoaSA9PSBhdG9taWNfcmVhZCgmZ3NwY2FfZGV2LT5mcl9pKSkgewogCQlpZiAobm9uYmxvY2tfaW5nKQogCQkJcmV0dXJuIC1FQUdBSU47CiAKIAkJLyogd2FpdCB0aWxsIGEgZnJhbWUgaXMgcmVhZHkgKi8KIAkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZ3NwY2FfZGV2LT53cSwKLQkJCShmcmFtZS0+djRsMl9idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0RPTkUpIHx8CisJCQlpICE9IGF0b21pY19yZWFkKCZnc3BjYV9kZXYtPmZyX2kpIHx8CiAJCQkhZ3NwY2FfZGV2LT5zdHJlYW1pbmcgfHwgIWdzcGNhX2Rldi0+cHJlc2VudCwKIAkJCW1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpOwogCQlpZiAocmV0IDwgMCkKQEAgLTE5MDYsMTEgKzE3OTIsNyBAQAogCQkJcmV0dXJuIC1FSU87CiAJfQogCi0JZ3NwY2FfZGV2LT5mcl9vID0gKGkgKyAxKSAlIGdzcGNhX2Rldi0+bmZyYW1lczsKLQlQREVCVUcoRF9GUkFNLCAiZnJhbWUgd2FpdCBxOiVkIGk6JWQgbzolZCIsCi0JCWdzcGNhX2Rldi0+ZnJfcSwKLQkJZ3NwY2FfZGV2LT5mcl9pLAotCQlnc3BjYV9kZXYtPmZyX28pOworCWdzcGNhX2Rldi0+ZnJfbyA9IChpICsgMSkgJSBHU1BDQV9NQVhfRlJBTUVTOwogCiAJaWYgKGdzcGNhX2Rldi0+c2RfZGVzYy0+ZHFfY2FsbGJhY2spIHsKIAkJbXV0ZXhfbG9jaygmZ3NwY2FfZGV2LT51c2JfbG9jayk7CkBAIC0xOTE5LDcgKzE4MDEsNyBAQAogCQkJZ3NwY2FfZGV2LT5zZF9kZXNjLT5kcV9jYWxsYmFjayhnc3BjYV9kZXYpOwogCQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwogCX0KLQlyZXR1cm4gajsKKwlyZXR1cm4gZ3NwY2FfZGV2LT5mcl9xdWV1ZVtpXTsKIH0KIAogLyoKQEAgLTIwMjQsMTUgKzE5MDYsOSBAQAogCX0KIAogCS8qIHB1dCB0aGUgYnVmZmVyIGluIHRoZSAncXVldWVkJyBxdWV1ZSAqLwotCWkgPSBnc3BjYV9kZXYtPmZyX3E7CisJaSA9IGF0b21pY19yZWFkKCZnc3BjYV9kZXYtPmZyX3EpOwogCWdzcGNhX2Rldi0+ZnJfcXVldWVbaV0gPSBpbmRleDsKLQlpZiAoZ3NwY2FfZGV2LT5mcl9pID09IGkpCi0JCWdzcGNhX2Rldi0+Y3VyX2ZyYW1lID0gZnJhbWU7Ci0JZ3NwY2FfZGV2LT5mcl9xID0gKGkgKyAxKSAlIGdzcGNhX2Rldi0+bmZyYW1lczsKLQlQREVCVUcoRF9GUkFNLCAicWJ1ZiBxOiVkIGk6JWQgbzolZCIsCi0JCWdzcGNhX2Rldi0+ZnJfcSwKLQkJZ3NwY2FfZGV2LT5mcl9pLAotCQlnc3BjYV9kZXYtPmZyX28pOworCWF0b21pY19zZXQoJmdzcGNhX2Rldi0+ZnJfcSwgKGkgKyAxKSAlIEdTUENBX01BWF9GUkFNRVMpOwogCiAJdjRsMl9idWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwogCXY0bDJfYnVmLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOwpAQCAtMjA4OCw3ICsxOTY0LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBpLCByZXQ7CisJaW50IHJldDsKIAogCVBERUJVRyhEX0ZSQU0sICJwb2xsIik7CiAKQEAgLTIxMDYsMTEgKzE5ODIsOSBAQAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdzcGNhX2Rldi0+cXVldWVfbG9jaykgIT0gMCkKIAkJcmV0dXJuIFBPTExFUlI7CiAKLQkvKiBjaGVjayB0aGUgbmV4dCBpbmNvbWluZyBidWZmZXIgKi8KLQlpID0gZ3NwY2FfZGV2LT5mcl9vOwotCWkgPSBnc3BjYV9kZXYtPmZyX3F1ZXVlW2ldOwotCWlmIChnc3BjYV9kZXYtPmZyYW1lW2ldLnY0bDJfYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19ET05FKQotCQlyZXQgPSBQT0xMSU4gfCBQT0xMUkROT1JNOwkvKiBzb21ldGhpbmcgdG8gcmVhZCAqLworCS8qIGNoZWNrIGlmIGFuIGltYWdlIGhhcyBiZWVuIHJlY2VpdmVkICovCisJaWYgKGdzcGNhX2Rldi0+ZnJfbyAhPSBhdG9taWNfcmVhZCgmZ3NwY2FfZGV2LT5mcl9pKSkKKwkJcmV0ID0gUE9MTElOIHwgUE9MTFJETk9STTsJLyogeWVzICovCiAJZWxzZQogCQlyZXQgPSAwOwogCW11dGV4X3VubG9jaygmZ3NwY2FfZGV2LT5xdWV1ZV9sb2NrKTsKQEAgLTIyMTQsOSArMjA4OCw2IEBACiAJLnZpZGlvY19xdWVyeWN0cmwJPSB2aWRpb2NfcXVlcnljdHJsLAogCS52aWRpb2NfZ19jdHJsCQk9IHZpZGlvY19nX2N0cmwsCiAJLnZpZGlvY19zX2N0cmwJCT0gdmlkaW9jX3NfY3RybCwKLQkudmlkaW9jX2dfYXVkaW8JCT0gdmlkaW9jX2dfYXVkaW8sCi0JLnZpZGlvY19zX2F1ZGlvCQk9IHZpZGlvY19zX2F1ZGlvLAotCS52aWRpb2NfZW51bWF1ZGlvCT0gdmlkaW9jX2VudW1hdWRpbywKIAkudmlkaW9jX3F1ZXJ5bWVudQk9IHZpZGlvY19xdWVyeW1lbnUsCiAJLnZpZGlvY19lbnVtX2lucHV0CT0gdmlkaW9jX2VudW1faW5wdXQsCiAJLnZpZGlvY19nX2lucHV0CQk9IHZpZGlvY19nX2lucHV0LApAQCAtMjIzNSw5ICsyMTA2LDYgQEAKIAkudmlkaW9jX3NfcmVnaXN0ZXIJPSB2aWRpb2Nfc19yZWdpc3RlciwKICNlbmRpZgogCS52aWRpb2NfZ19jaGlwX2lkZW50CT0gdmlkaW9jX2dfY2hpcF9pZGVudCwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkudmlkaW9jZ21idWYgICAgICAgICAgPSB2aWRpb2NnbWJ1ZiwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZ3NwY2FfdGVtcGxhdGUgPSB7CkBAIC0yMjUzLDMxICsyMTIxLDE4IEBACiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IHRoZSBzdWItZHJpdmVyIHdoZW4gaXQgaXMKICAqIGNhbGxlZCBmb3IgcHJvYmluZyBhIG5ldyBkZXZpY2UuCiAgKi8KLWludCBnc3BjYV9kZXZfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCitpbnQgZ3NwY2FfZGV2X3Byb2JlMihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLAogCQljb25zdCBzdHJ1Y3Qgc2RfZGVzYyAqc2RfZGVzYywKIAkJaW50IGRldl9zaXplLAogCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCiB7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlOwogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlpbnQgcmV0OwogCiAJUERFQlVHKERfUFJPQkUsICJwcm9iaW5nICUwNHg6JTA0eCIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAKLQkvKiB3ZSBkb24ndCBoYW5kbGUgbXVsdGktY29uZmlnIGNhbWVyYXMgKi8KLQlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKSB7Ci0JCVBERUJVRyhEX0VSUiwgIlRvbyBtYW55IGNvbmZpZyIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiB0aGUgVVNCIHZpZGVvIGludGVyZmFjZSBtdXN0IGJlIHRoZSBmaXJzdCBvbmUgKi8KLQlpbnRlcmZhY2UgPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2M7Ci0JaWYgKGRldi0+Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEgJiYKLQkgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyICE9IDApCi0JCXJldHVybiAtRU5PREVWOwotCiAJLyogY3JlYXRlIHRoZSBkZXZpY2UgKi8KIAlpZiAoZGV2X3NpemUgPCBzaXplb2YgKmdzcGNhX2RldikKIAkJZGV2X3NpemUgPSBzaXplb2YgKmdzcGNhX2RldjsKQEAgLTIyOTMsOCArMjE0OCwyNiBAQAogCQlnb3RvIG91dDsKIAl9CiAJZ3NwY2FfZGV2LT5kZXYgPSBkZXY7Ci0JZ3NwY2FfZGV2LT5pZmFjZSA9IGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcjsKKwlnc3BjYV9kZXYtPmlmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAlnc3BjYV9kZXYtPm5iYWx0ID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CisKKwkvKiBjaGVjayBpZiBhbnkgYXVkaW8gZGV2aWNlICovCisJaWYgKGRldi0+Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEpIHsKKwkJaW50IGk7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmMjsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQkJaW50ZjIgPSBkZXYtPmNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQkJaWYgKGludGYyICE9IE5VTEwKKwkJCSAmJiBpbnRmMi0+YWx0c2V0dGluZyAhPSBOVUxMCisJCQkgJiYgaW50ZjItPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzID09CisJCQkJCSBVU0JfQ0xBU1NfQVVESU8pIHsKKwkJCQlnc3BjYV9kZXYtPmF1ZGlvID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwogCWdzcGNhX2Rldi0+c2RfZGVzYyA9IHNkX2Rlc2M7CiAJZ3NwY2FfZGV2LT5uYnVmcmVhZCA9IDI7CiAJZ3NwY2FfZGV2LT5lbXB0eV9wYWNrZXQgPSAtMTsJLyogZG9uJ3QgY2hlY2sgdGhlIGVtcHR5IHBhY2tldHMgKi8KQEAgLTIzNDUsNiArMjIxOCwzMSBAQAogCWtmcmVlKGdzcGNhX2Rldik7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woZ3NwY2FfZGV2X3Byb2JlMik7CisKKy8qIHNhbWUgZnVuY3Rpb24gYXMgdGhlIHByZXZpb3VzIG9uZSwgYnV0IGNoZWNrIHRoZSBpbnRlcmZhY2UgKi8KK2ludCBnc3BjYV9kZXZfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwKKwkJY29uc3Qgc3RydWN0IHNkX2Rlc2MgKnNkX2Rlc2MsCisJCWludCBkZXZfc2l6ZSwKKwkJc3RydWN0IG1vZHVsZSAqbW9kdWxlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJLyogd2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCisJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkgeworCQlQREVCVUcoRF9FUlIsICIlMDR4OiUwNHggdG9vIG1hbnkgY29uZmlnIiwKKwkJCQlpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiB0aGUgVVNCIHZpZGVvIGludGVyZmFjZSBtdXN0IGJlIHRoZSBmaXJzdCBvbmUgKi8KKwlpZiAoZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXMgIT0gMQorCSAmJiBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZTIoaW50ZiwgaWQsIHNkX2Rlc2MsIGRldl9zaXplLCBtb2R1bGUpOworfQogRVhQT1JUX1NZTUJPTChnc3BjYV9kZXZfcHJvYmUpOwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCmluZGV4IDhiOTYzZGYuLmI3NDljMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmgKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogY29tcGlsYXRpb24gb3B0aW9uICovCiAjZGVmaW5lIEdTUENBX0RFQlVHIDEKQEAgLTE0OCw3ICsxNDcsNiBAQAogCiBzdHJ1Y3QgZ3NwY2FfZnJhbWUgewogCV9fdTggKmRhdGE7CQkJLyogZnJhbWUgYnVmZmVyICovCi0JX191OCAqZGF0YV9lbmQ7CQkJLyogZW5kIG9mIGZyYW1lIHdoaWxlIGZpbGxpbmcgKi8KIAlpbnQgdm1hX3VzZV9jb3VudDsKIAlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWY7CiB9OwpAQCAtMTc3LDEzICsxNzUsMTQgQEAKIAogCV9fdTggKmZyYnVmOwkJCQkvKiBidWZmZXIgZm9yIG5mcmFtZXMgKi8KIAlzdHJ1Y3QgZ3NwY2FfZnJhbWUgZnJhbWVbR1NQQ0FfTUFYX0ZSQU1FU107Ci0Jc3RydWN0IGdzcGNhX2ZyYW1lICpjdXJfZnJhbWU7CQkvKiBmcmFtZSBiZWVpbmcgZmlsbGVkICovCisJdTggKmltYWdlOwkJCQkvKiBpbWFnZSBiZWVpbmcgZmlsbGVkICovCiAJX191MzIgZnJzejsJCQkJLyogZnJhbWUgc2l6ZSAqLwotCWNoYXIgbmZyYW1lczsJCQkJLyogbnVtYmVyIG9mIGZyYW1lcyAqLwotCWNoYXIgZnJfaTsJCQkJLyogZnJhbWUgYmVpbmcgZmlsbGVkICovCi0JY2hhciBmcl9xOwkJCQkvKiBuZXh0IGZyYW1lIHRvIHF1ZXVlICovCi0JY2hhciBmcl9vOwkJCQkvKiBuZXh0IGZyYW1lIHRvIGRlcXVldWUgKi8KKwl1MzIgaW1hZ2VfbGVuOwkJCQkvKiBjdXJyZW50IGxlbmd0aCBvZiBpbWFnZSAqLworCWF0b21pY190IGZyX3E7CQkJCS8qIG5leHQgZnJhbWUgdG8gcXVldWUgKi8KKwlhdG9taWNfdCBmcl9pOwkJCQkvKiBmcmFtZSBiZWluZyBmaWxsZWQgKi8KIAlzaWduZWQgY2hhciBmcl9xdWV1ZVtHU1BDQV9NQVhfRlJBTUVTXTsJLyogZnJhbWUgcXVldWUgKi8KKwljaGFyIG5mcmFtZXM7CQkJCS8qIG51bWJlciBvZiBmcmFtZXMgKi8KKwl1OCBmcl9vOwkJCQkvKiBuZXh0IGZyYW1lIHRvIGRlcXVldWUgKi8KIAlfX3U4IGxhc3RfcGFja2V0X3R5cGU7CiAJX19zOCBlbXB0eV9wYWNrZXQ7CQkvKiBpZiAoLTEpIGRvbid0IGNoZWNrIGVtcHR5IHBhY2tldHMgKi8KIAlfX3U4IHN0cmVhbWluZzsKQEAgLTE5OSw2ICsxOTgsNyBAQAogCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7CQkvKiByZWFkIHByb3RlY3Rpb24gKi8KIAlzdHJ1Y3QgbXV0ZXggcXVldWVfbG9jazsJLyogSVNPQyBxdWV1ZSBwcm90ZWN0aW9uICovCiAJaW50IHVzYl9lcnI7CQkJLyogVVNCIGVycm9yIC0gcHJvdGVjdGVkIGJ5IHVzYl9sb2NrICovCisJdTE2IHBrdF9zaXplOwkJCS8qIElTT0MgcGFja2V0IHNpemUgKi8KICNpZmRlZiBDT05GSUdfUE0KIAljaGFyIGZyb3plbjsJCQkvKiBzdXNwZW5kIC0gcmVzdW1lICovCiAjZW5kaWYKQEAgLTIwOSw3ICsyMDksNyBAQAogCV9fdTggaWZhY2U7CQkJLyogVVNCIGludGVyZmFjZSBudW1iZXIgKi8KIAlfX3U4IGFsdDsJCQkvKiBVU0IgYWx0ZXJuYXRlIHNldHRpbmcgKi8KIAlfX3U4IG5iYWx0OwkJCS8qIG51bWJlciBvZiBVU0IgYWx0ZXJuYXRlIHNldHRpbmdzICovCi0JdTE2IHBrdF9zaXplOwkJCS8qIElTT0MgcGFja2V0IHNpemUgKi8KKwl1OCBhdWRpbzsJCQkvKiBwcmVzZW5jZSBvZiBhdWRpbyBkZXZpY2UgKi8KIH07CiAKIGludCBnc3BjYV9kZXZfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCkBAIC0yMTcsMTIgKzIxNywxNiBAQAogCQljb25zdCBzdHJ1Y3Qgc2RfZGVzYyAqc2RfZGVzYywKIAkJaW50IGRldl9zaXplLAogCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOworaW50IGdzcGNhX2Rldl9wcm9iZTIoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwKKwkJY29uc3Qgc3RydWN0IHNkX2Rlc2MgKnNkX2Rlc2MsCisJCWludCBkZXZfc2l6ZSwKKwkJc3RydWN0IG1vZHVsZSAqbW9kdWxlKTsKIHZvaWQgZ3NwY2FfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiB2b2lkIGdzcGNhX2ZyYW1lX2FkZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCQllbnVtIGdzcGNhX3BhY2tldF90eXBlIHBhY2tldF90eXBlLAogCQkJY29uc3QgdTggKmRhdGEsCiAJCQlpbnQgbGVuKTsKLXN0cnVjdCBnc3BjYV9mcmFtZSAqZ3NwY2FfZ2V0X2lfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKICNpZmRlZiBDT05GSUdfUE0KIGludCBnc3BjYV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CiBpbnQgZ3NwY2FfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvamVpbGluai5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9qZWlsaW5qLmMKaW5kZXggODRlY2Q1Ni4uMTJkOWNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9qZWlsaW5qLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9qZWlsaW5qLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya190aHJlYWQ7CiAJdTggcXVhbGl0eTsJCQkJIC8qIGltYWdlIHF1YWxpdHkgKi8KIAl1OCBqcGVncXVhbDsJCQkJLyogd2ViY2FtIHF1YWxpdHkgKi8KLQl1OCAqanBlZ19oZHI7CisJdTgganBlZ19oZHJbSlBFR19IRFJfU1pdOwogfTsKIAogCXN0cnVjdCBqbGpfY29tbWFuZCB7CkBAIC0yODIsNyArMjgyLDYgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZShkZXYtPndvcmtfdGhyZWFkKTsKIAlkZXYtPndvcmtfdGhyZWFkID0gTlVMTDsKIAltdXRleF9sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKLQlrZnJlZShkZXYtPmpwZWdfaGRyKTsKIH0KIAogLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCkBAIC0yOTgsOSArMjk3LDYgQEAKIAlpbnQgcmV0OwogCiAJLyogY3JlYXRlIHRoZSBKUEVHIGhlYWRlciAqLwotCWRldi0+anBlZ19oZHIgPSBrbWFsbG9jKEpQRUdfSERSX1NaLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2LT5qcGVnX2hkciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKIAlqcGVnX2RlZmluZShkZXYtPmpwZWdfaGRyLCBnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCwKIAkJCTB4MjEpOyAgICAgICAgICAvKiBKUEVHIDQyMiAqLwogCWpwZWdfc2V0X3F1YWwoZGV2LT5qcGVnX2hkciwgZGV2LT5xdWFsaXR5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfYnJpZGdlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2JyaWRnZS5oCmluZGV4IDExMjdhNDAuLjUxYWYzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfYnJpZGdlLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9icmlkZ2UuaApAQCAtMTksNiArMTksNyBAQAogI2lmbmRlZiBNNTYwMl9CUklER0VfSF8KICNkZWZpbmUgTTU2MDJfQlJJREdFX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiZ3NwY2EuaCIKIAogI2RlZmluZSBNT0RVTEVfTkFNRSAiQUxpIG01NjAyIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYwppbmRleCA0Mjk0Yzc1Li5iMDczZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYwpAQCAtMzA1LDMwICszMDUsMjMgQEAKIAkJICAgICAgIHNkLT5mcmFtZV9jb3VudCk7CiAKIAl9IGVsc2UgewotCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwogCQlpbnQgY3VyX2ZyYW1lX2xlbjsKIAotCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7Ci0JCWlmIChmcmFtZSA9PSBOVUxMKSB7Ci0JCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWN1cl9mcmFtZV9sZW4gPSBmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YTsKKwkJY3VyX2ZyYW1lX2xlbiA9IGdzcGNhX2Rldi0+aW1hZ2VfbGVuOwogCQkvKiBSZW1vdmUgdXJiIGhlYWRlciAqLwogCQlkYXRhICs9IDQ7CiAJCWxlbiAtPSA0OwogCi0JCWlmIChjdXJfZnJhbWVfbGVuICsgbGVuIDw9IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGgpIHsKKwkJaWYgKGN1cl9mcmFtZV9sZW4gKyBsZW4gPD0gZ3NwY2FfZGV2LT5mcnN6KSB7CiAJCQlQREVCVUcoRF9GUkFNLCAiQ29udGludWluZyBmcmFtZSAlZCBjb3B5aW5nICVkIGJ5dGVzIiwKIAkJCSAgICAgICBzZC0+ZnJhbWVfY291bnQsIGxlbik7CiAKIAkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKIAkJCQkJZGF0YSwgbGVuKTsKLQkJfSBlbHNlIGlmIChmcmFtZS0+djRsMl9idWYubGVuZ3RoIC0gY3VyX2ZyYW1lX2xlbiA+IDApIHsKKwkJfSBlbHNlIHsKIAkJCS8qIEFkZCB0aGUgcmVtYWluaW5nIGRhdGEgdXAgdG8gZnJhbWUgc2l6ZSAqLwogCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLAotCQkJCSAgICBmcmFtZS0+djRsMl9idWYubGVuZ3RoIC0gY3VyX2ZyYW1lX2xlbik7CisJCQkJICAgIGdzcGNhX2Rldi0+ZnJzeiAtIGN1cl9mcmFtZV9sZW4pOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKaW5kZXggNmIzYmU0Zi4uZmJkOTE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAibTU2MDJfczVrODNhLmgiCiAKIHN0YXRpYyBpbnQgczVrODNhX3NldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tYXJzLmMKaW5kZXggM2Q5MjI5ZS4uMDMxZjcxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tYXJzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tYXJzLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNkZWZpbmUgUVVBTElUWV9NQVggNzAKICNkZWZpbmUgUVVBTElUWV9ERUYgNTAKIAotCXU4ICpqcGVnX2hkcjsKKwl1OCBqcGVnX2hkcltKUEVHX0hEUl9TWl07CiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCkBAIC0yMDAsOSArMjAwLDYgQEAKIAlpbnQgaTsKIAogCS8qIGNyZWF0ZSB0aGUgSlBFRyBoZWFkZXIgKi8KLQlzZC0+anBlZ19oZHIgPSBrbWFsbG9jKEpQRUdfSERSX1NaLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNkLT5qcGVnX2hkcikKLQkJcmV0dXJuIC1FTk9NRU07CiAJanBlZ19kZWZpbmUoc2QtPmpwZWdfaGRyLCBnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCwKIAkJCTB4MjEpOwkJLyogSlBFRyA0MjIgKi8KIAlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOwpAQCAtMzE3LDEzICszMTQsNiBAQAogCQlQREVCVUcoRF9FUlIsICJDYW1lcmEgU3RvcCBmYWlsZWQiKTsKIH0KIAotc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCWtmcmVlKHNkLT5qcGVnX2hkcik7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCkBAIC00ODYsNyArNDc2LDYgQEAKIAkuaW5pdCA9IHNkX2luaXQsCiAJLnN0YXJ0ID0gc2Rfc3RhcnQsCiAJLnN0b3BOID0gc2Rfc3RvcE4sCi0JLnN0b3AwID0gc2Rfc3RvcDAsCiAJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCiAJLmdldF9qY29tcCA9IHNkX2dldF9qY29tcCwKIAkuc2V0X2pjb21wID0gc2Rfc2V0X2pjb21wLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCmluZGV4IGYzNmUxMWEuLjJiMmNiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKQEAgLTQxLDYgKzQxLDExIEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlICJnc3BjYS5oIgogCisvKiBUaGUganBlZ19oZHIgaXMgdXNlZCBieSB3OTk2WGNmIG9ubHkgKi8KKy8qIFRoZSBDT05FWF9DQU0gZGVmaW5lIGZvciBqcGVnLmggbmVlZHMgcmVuYW1pbmcsIG5vdyBpdHMgdXNlZCBoZXJlIHRvbyAqLworI2RlZmluZSBDT05FWF9DQU0KKyNpbmNsdWRlICJqcGVnLmgiCisKIE1PRFVMRV9BVVRIT1IoIkplYW4tRnJhbmNvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk9WNTE5IFVTQiBDYW1lcmEgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC05MCw2ICs5NSw3IEBACiAjZGVmaW5lIFFVQUxJVFlfREVGIDUwCiAKIAlfX3U4IHN0b3BwZWQ7CQkvKiBTdHJlYW1pbmcgaXMgdGVtcG9yYXJpbHkgcGF1c2VkICovCisJX191OCBmaXJzdF9mcmFtZTsKIAogCV9fdTggZnJhbWVfcmF0ZTsJLyogY3VycmVudCBGcmFtZXJhdGUgKi8KIAlfX3U4IGNsb2NrZGl2OwkJLyogY2xvY2tkaXYgb3ZlcnJpZGUgKi8KQEAgLTExNSw3ICsxMjEsNyBAQAogCWludCBzZW5zb3JfaGVpZ2h0OwogCWludCBzZW5zb3JfcmVnX2NhY2hlWzI1Nl07CiAKLQl1OCAqanBlZ19oZHI7CisJdTgganBlZ19oZHJbSlBFR19IRFJfU1pdOwogfTsKIAogLyogTm90ZSB0aGlzIGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IHRoZSB3OTk2OGNmIGRyaXZlciBuZWVkcyB0aGUgY29kZSBmb3IgYWxsCkBAIC0zMTQ3LDcgKzMxNTMsNyBAQAogCXNkLT5hdXRvYnJpZ2h0bmVzcyA9IEFVVE9CUklHSFRfREVGOwogCWlmIChzZC0+c2Vuc29yID09IFNFTl9PVjc2NzApIHsKIAkJc2QtPmZyZXEgPSBPVjc2NzBfRlJFUV9ERUY7Ci0JCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAxIDw8IEZSRVFfSURYOworCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgRlJFUV9JRFgpIHwgKDEgPDwgQ09MT1JfSURYKTsKIAl9IGVsc2UgewogCQlzZC0+ZnJlcSA9IEZSRVFfREVGOwogCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgSEZMSVBfSURYKSB8ICgxIDw8IFZGTElQX0lEWCkgfApAQCAtMzk2MSw2ICszOTY3LDggQEAKIAlzZF9yZXNldF9zbmFwc2hvdChnc3BjYV9kZXYpOwogCXNkLT5zbmFwc2hvdF9wcmVzc2VkID0gMDsKIAorCXNkLT5maXJzdF9mcmFtZSA9IDM7CisKIAlyZXQgPSBvdjUxeF9yZXN0YXJ0KHNkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CkBAIC00MTUzLDEzICs0MTYxLDIzIEBACiAJCQl1OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogeworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKKwogCS8qIEEgc2hvcnQgcmVhZCBzaWduYWxzIEVPRiAqLwogCWlmIChsZW4gPCBPVkZYMl9CVUxLX1NJWkUpIHsKLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGRhdGEsIGxlbik7CisJCS8qIElmIHRoZSBmcmFtZSBpcyBzaG9ydCwgYW5kIGl0IGlzIG9uZSBvZiB0aGUgZmlyc3Qgb25lcworCQkgICB0aGUgc2Vuc29yIGFuZCBicmlkZ2UgYXJlIHN0aWxsIHN5bmNpbmcsIHNvIGRyb3AgaXQuICovCisJCWlmIChzZC0+Zmlyc3RfZnJhbWUpIHsKKwkJCXNkLT5maXJzdF9mcmFtZS0tOworCQkJaWYgKGdzcGNhX2Rldi0+aW1hZ2VfbGVuIDwKKwkJCQkgIHNkLT5nc3BjYV9kZXYud2lkdGggKiBzZC0+Z3NwY2FfZGV2LmhlaWdodCkKKwkJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKKwkJfQorCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgTlVMTCwgMCk7CiAJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgTlVMTCwgMCk7Ci0JCXJldHVybjsKIAl9Ci0JZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMKaW5kZXggZGMxZTRlZi4uOTZjYjNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzQuYwpAQCAtOTg3LDEzICs5ODcsOCBAQAogCQkJCQlkYXRhICsgMTIsIGxlbiAtIDEyKTsKIAkJLyogSWYgdGhpcyBwYWNrZXQgaXMgbWFya2VkIGFzIEVPRiwgZW5kIHRoZSBmcmFtZSAqLwogCQl9IGVsc2UgaWYgKGRhdGFbMV0gJiBVVkNfU1RSRUFNX0VPRikgewotCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZTsKLQogCQkJc2QtPmxhc3RfcHRzID0gMDsKLQkJCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKLQkJCWlmIChmcmFtZSA9PSBOVUxMKQotCQkJCWdvdG8gZGlzY2FyZDsKLQkJCWlmIChmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YSArIChsZW4gLSAxMikgIT0KKwkJCWlmIChnc3BjYV9kZXYtPmltYWdlX2xlbiArIGxlbiAtIDEyICE9CiAJCQkgICAgZ3NwY2FfZGV2LT53aWR0aCAqIGdzcGNhX2Rldi0+aGVpZ2h0ICogMikgewogCQkJCVBERUJVRyhEX1BBQ0ssICJ3cm9uZyBzaXplZCBmcmFtZSIpOwogCQkJCWdvdG8gZGlzY2FyZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKaW5kZXggMmE2ODIyMC4uYTY2ZGYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCW1lbWNweShnc3BjYV9kZXYtPnVzYl9idWYsIGJ1ZmZlciwgbGVuKTsKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCiAJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAotCQkJMSwJCS8qIHJlcXVlc3QgKi8KKwkJCTAsCQkvKiByZXF1ZXN0ICovCiAJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkwLAkJLyogdmFsdWUgKi8KIAkJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKQEAgLTgwNCw3ICs4MDQsNiBAQAogfTsKIAogc3RhdGljIHZvaWQgcGFjX3N0YXJ0X2ZyYW1lKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwKIAkJX191MTYgbGluZXMsIF9fdTE2IHNhbXBsZXNfcGVyX2xpbmUpCiB7CiAJdW5zaWduZWQgY2hhciB0bXBidWZbNF07CkBAIC04MjksMTkgKzgyOCwxMyBAQAogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOworCXU4ICppbWFnZTsKIAl1bnNpZ25lZCBjaGFyICpzb2Y7CiAKIAlzb2YgPSBwYWNfZmluZF9zb2YoJnNkLT5zb2ZfcmVhZCwgZGF0YSwgbGVuKTsKIAlpZiAoc29mKSB7CiAJCWludCBuLCBsdW1fb2Zmc2V0LCBmb290ZXJfbGVuZ3RoOwogCi0JCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKLQkJaWYgKGZyYW1lID09IE5VTEwpIHsKLQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwotCQkJcmV0dXJuOwotCQl9Ci0KIAkJLyogNiBieXRlcyBhZnRlciB0aGUgRkYgRDkgRU9GIG1hcmtlciBhIG51bWJlciBvZiBsdW1pbmF0aW9uCiAJCSAgIGJ5dGVzIGFyZSBzZW5kIGNvcnJlc3BvbmRpbmcgdG8gZGlmZmVyZW50IHBhcnRzIG9mIHRoZQogCQkgICBpbWFnZSwgdGhlIDE0dGggYW5kIDE1dGggYnl0ZSBhZnRlciB0aGUgRU9GIHNlZW0gdG8KQEAgLTg1MiwxNiArODQ1LDE3IEBACiAJCS8qIEZpbmlzaCBkZWNvZGluZyBjdXJyZW50IGZyYW1lICovCiAJCW4gPSAoc29mIC0gZGF0YSkgLSAoZm9vdGVyX2xlbmd0aCArIHNpemVvZiBwYWNfc29mX21hcmtlcik7CiAJCWlmIChuIDwgMCkgewotCQkJZnJhbWUtPmRhdGFfZW5kICs9IG47CisJCQlnc3BjYV9kZXYtPmltYWdlX2xlbiArPSBuOwogCQkJbiA9IDA7CisJCX0gZWxzZSB7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIG4pOwogCQl9Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKLQkJCQkJZGF0YSwgbik7Ci0JCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgIT0gRElTQ0FSRF9QQUNLRVQgJiYKLQkJCQlmcmFtZS0+ZGF0YV9lbmRbLTJdID09IDB4ZmYgJiYKLQkJCQlmcmFtZS0+ZGF0YV9lbmRbLTFdID09IDB4ZDkpCi0JCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKLQkJCQkJCU5VTEwsIDApOworCisJCWltYWdlID0gZ3NwY2FfZGV2LT5pbWFnZTsKKwkJaWYgKGltYWdlICE9IE5VTEwKKwkJICYmIGltYWdlW2dzcGNhX2Rldi0+aW1hZ2VfbGVuIC0gMl0gPT0gMHhmZgorCQkgJiYgaW1hZ2VbZ3NwY2FfZGV2LT5pbWFnZV9sZW4gLSAxXSA9PSAweGQ5KQorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIE5VTEwsIDApOwogCiAJCW4gPSBzb2YgLSBkYXRhOwogCQlsZW4gLT0gbjsKQEAgLTg3Nyw3ICs4NzEsNyBAQAogCiAJCS8qIFN0YXJ0IHRoZSBuZXcgZnJhbWUgd2l0aCB0aGUganBlZyBoZWFkZXIgKi8KIAkJLyogVGhlIFBBQzczMDIgaGFzIHRoZSBpbWFnZSByb3RhdGVkIDkwIGRlZ3JlZXMgKi8KLQkJcGFjX3N0YXJ0X2ZyYW1lKGdzcGNhX2RldiwgZnJhbWUsCisJCXBhY19zdGFydF9mcmFtZShnc3BjYV9kZXYsCiAJCQlnc3BjYV9kZXYtPndpZHRoLCBnc3BjYV9kZXYtPmhlaWdodCk7CiAJfQogCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKQEAgLTEyMDAsNiArMTE5NCw3IEBACiAJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjEpfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyMiksIC5kcml2ZXJfaW5mbyA9IEZMX1ZGTElQfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyNCksIC5kcml2ZXJfaW5mbyA9IEZMX1ZGTElQfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyNSl9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI2KX0sCiAJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjgpfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyOSksIC5kcml2ZXJfaW5mbyA9IEZMX1ZGTElQfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKaW5kZXggNDRmZWQ5Ni4uMWNiN2U5OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAltZW1jcHkoZ3NwY2FfZGV2LT51c2JfYnVmLCBidWZmZXIsIGxlbik7CiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAogCQkJdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKLQkJCTEsCQkvKiByZXF1ZXN0ICovCisJCQkwLAkJLyogcmVxdWVzdCAqLwogCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJMCwJCS8qIHZhbHVlICovCiAJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCkBAIC01OTksNyArNTk5LDYgQEAKIH07CiAKIHN0YXRpYyB2b2lkIHBhY19zdGFydF9mcmFtZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCiAJCV9fdTE2IGxpbmVzLCBfX3UxNiBzYW1wbGVzX3Blcl9saW5lKQogewogCXVuc2lnbmVkIGNoYXIgdG1wYnVmWzRdOwpAQCAtNjI0LDE5ICs2MjMsMTMgQEAKIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggKmltYWdlOwogCXVuc2lnbmVkIGNoYXIgKnNvZjsKLQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwogCiAJc29mID0gcGFjX2ZpbmRfc29mKCZzZC0+c29mX3JlYWQsIGRhdGEsIGxlbik7CiAJaWYgKHNvZikgewogCQlpbnQgbiwgbHVtX29mZnNldCwgZm9vdGVyX2xlbmd0aDsKIAotCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7Ci0JCWlmIChmcmFtZSA9PSBOVUxMKSB7Ci0JCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQkJCXJldHVybjsKLQkJfQotCiAJCS8qIDYgYnl0ZXMgYWZ0ZXIgdGhlIEZGIEQ5IEVPRiBtYXJrZXIgYSBudW1iZXIgb2YgbHVtaW5hdGlvbgogCQkgICBieXRlcyBhcmUgc2VuZCBjb3JyZXNwb25kaW5nIHRvIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUKIAkJICAgaW1hZ2UsIHRoZSAxNHRoIGFuZCAxNXRoIGJ5dGUgYWZ0ZXIgdGhlIEVPRiBzZWVtIHRvCkBAIC02NDcsMTYgKzY0MCwxNiBAQAogCQkvKiBGaW5pc2ggZGVjb2RpbmcgY3VycmVudCBmcmFtZSAqLwogCQluID0gKHNvZiAtIGRhdGEpIC0gKGZvb3Rlcl9sZW5ndGggKyBzaXplb2YgcGFjX3NvZl9tYXJrZXIpOwogCQlpZiAobiA8IDApIHsKLQkJCWZyYW1lLT5kYXRhX2VuZCArPSBuOworCQkJZ3NwY2FfZGV2LT5pbWFnZV9sZW4gKz0gbjsKIAkJCW4gPSAwOworCQl9IGVsc2UgeworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBuKTsKIAkJfQotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCi0JCQkJCWRhdGEsIG4pOwotCQlpZiAoZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlICE9IERJU0NBUkRfUEFDS0VUICYmCi0JCQkJZnJhbWUtPmRhdGFfZW5kWy0yXSA9PSAweGZmICYmCi0JCQkJZnJhbWUtPmRhdGFfZW5kWy0xXSA9PSAweGQ5KQotCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCi0JCQkJCQlOVUxMLCAwKTsKKwkJaW1hZ2UgPSBnc3BjYV9kZXYtPmltYWdlOworCQlpZiAoaW1hZ2UgIT0gTlVMTAorCQkgJiYgaW1hZ2VbZ3NwY2FfZGV2LT5pbWFnZV9sZW4gLSAyXSA9PSAweGZmCisJCSAmJiBpbWFnZVtnc3BjYV9kZXYtPmltYWdlX2xlbiAtIDFdID09IDB4ZDkpCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgTlVMTCwgMCk7CiAKIAkJbiA9IHNvZiAtIGRhdGE7CiAJCWxlbiAtPSBuOwpAQCAtNjcxLDcgKzY2NCw3IEBACiAJCQlhdG9taWNfc2V0KCZzZC0+YXZnX2x1bSwgLTEpOwogCiAJCS8qIFN0YXJ0IHRoZSBuZXcgZnJhbWUgd2l0aCB0aGUganBlZyBoZWFkZXIgKi8KLQkJcGFjX3N0YXJ0X2ZyYW1lKGdzcGNhX2RldiwgZnJhbWUsCisJCXBhY19zdGFydF9mcmFtZShnc3BjYV9kZXYsCiAJCQlnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCk7CiAJfQogCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc245YzIweC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKaW5kZXggNjQ0YTdmZC4uODNhNzE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2lmZGVmIENPTkZJR19JTlBVVAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtODksNyArODgsNyBAQAogCXU4IGhzdGFydDsKIAl1OCB2c3RhcnQ7CiAKLQl1OCAqanBlZ19oZHI7CisJdTgganBlZ19oZHJbSlBFR19IRFJfU1pdOwogCXU4IHF1YWxpdHk7CiAKIAl1OCBmbGFnczsKQEAgLTIxNjIsMTAgKzIxNjEsNiBAQAogCWludCBoZWlnaHQgPSBnc3BjYV9kZXYtPmhlaWdodDsKIAl1OCBmbXQsIHNjYWxlID0gMDsKIAotCXNkLT5qcGVnX2hkciA9IGttYWxsb2MoSlBFR19IRFJfU1osIEdGUF9LRVJORUwpOwotCWlmIChzZC0+anBlZ19oZHIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGhlaWdodCwgd2lkdGgsCiAJCQkweDIxKTsKIAlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOwpAQCAtMjE5Nyw4ICsyMTkyLDggQEAKIAl9CiAKIAljb25maWd1cmVfc2Vuc29yX291dHB1dChnc3BjYV9kZXYsIG1vZGUpOwotCXJlZ193KGdzcGNhX2RldiwgMHgxMTAwLCBzZC0+anBlZ19oZHIgKyBKUEVHX1FUMF9PRkZTRVQsIDY0KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MTE0MCwgc2QtPmpwZWdfaGRyICsgSlBFR19RVDFfT0ZGU0VULCA2NCk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDExMDAsICZzZC0+anBlZ19oZHJbSlBFR19RVDBfT0ZGU0VUXSwgNjQpOworCXJlZ193KGdzcGNhX2RldiwgMHgxMTQwLCAmc2QtPmpwZWdfaGRyW0pQRUdfUVQxX09GRlNFVF0sIDY0KTsKIAlyZWdfdyhnc3BjYV9kZXYsIDB4MTBmYiwgQ0xSX1dJTih3aWR0aCwgaGVpZ2h0KSwgNSk7CiAJcmVnX3coZ3NwY2FfZGV2LCAweDExODAsIEhXX1dJTihtb2RlLCBzZC0+aHN0YXJ0LCBzZC0+dnN0YXJ0KSwgNik7CiAJcmVnX3cxKGdzcGNhX2RldiwgMHgxMTg5LCBzY2FsZSk7CkBAIC0yMjI2LDEyICsyMjIxLDYgQEAKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDEwNjEsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAmIH4weDAyKTsKIH0KIAotc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlrZnJlZShzZC0+anBlZ19oZHIpOwotfQotCiBzdGF0aWMgdm9pZCBkb19hdXRvZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgYXZnX2x1bSkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC0yMzk3LDcgKzIzODYsNiBAQAogCS5pbml0ID0gc2RfaW5pdCwKIAkuc3RhcnQgPSBzZF9zdGFydCwKIAkuc3RvcE4gPSBzZF9zdG9wTiwKLQkuc3RvcDAgPSBzZF9zdG9wMCwKIAkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKICNpZmRlZiBDT05GSUdfSU5QVVQKIAkuaW50X3BrdF9zY2FuID0gc2RfaW50X3BrdF9zY2FuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhiLmMKaW5kZXggOTUzNTRhMy4uMjA0YmIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4Yi5jCkBAIC0xMjUxLDE2ICsxMjUxLDEwIEBACiAJaWYgKGNhbS0+Y2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXYgJiBNT0RFX1JBVykgewogCQkvKiBJbiByYXcgbW9kZSB3ZSBzb21ldGltZXMgZ2V0IHNvbWUgZ2FyYmFnZSBhZnRlciB0aGUgZnJhbWUKIAkJICAgaWdub3JlIHRoaXMgKi8KLQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZTsKIAkJaW50IHVzZWQ7CiAJCWludCBzaXplID0gY2FtLT5jYW1fbW9kZVtnc3BjYV9kZXYtPmN1cnJfbW9kZV0uc2l6ZWltYWdlOwogCi0JCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKLQkJaWYgKGZyYW1lID09IE5VTEwpIHsKLQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVzZWQgPSBmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YTsKKwkJdXNlZCA9IGdzcGNhX2Rldi0+aW1hZ2VfbGVuOwogCQlpZiAodXNlZCArIGxlbiA+IHNpemUpCiAJCQlsZW4gPSBzaXplIC0gdXNlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYwppbmRleCAxNzZjNWIzLi5lZTE3YjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgTU9EVUxFX05BTUUgInNvbml4aiIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgImdzcGNhLmgiCiAjaW5jbHVkZSAianBlZy5oIgogCkBAIC0zOTIsNyArMzkxLDcgQEAKIAogc3RhdGljIGNvbnN0IHU4IHNuX2h2NzEzMVsweDFjXSA9IHsKIC8qCXJlZzAJcmVnMQlyZWcyCXJlZzMJcmVnNAlyZWc1CXJlZzYJcmVnNyAqLwotCTB4MDAsCTB4MDMsCTB4NjQsCTB4MDAsCTB4MWEsCTB4MjAsCTB4MjAsCTB4MjAsCisJMHgwMCwJMHgwMywJMHg2MCwJMHgwMCwJMHgxYSwJMHgyMCwJMHgyMCwJMHgyMCwKIC8qCXJlZzgJcmVnOQlyZWdhCXJlZ2IJcmVnYwlyZWdkCXJlZ2UJcmVnZiAqLwogCTB4ODEsCTB4MTEsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCiAvKglyZWcxMAlyZWcxMQlyZWcxMglyZWcxMwlyZWcxNAlyZWcxNQlyZWcxNglyZWcxNyAqLwpAQCAtNDAzLDcgKzQwMiw3IEBACiAKIHN0YXRpYyBjb25zdCB1OCBzbl9taTAzNjBbMHgxY10gPSB7CiAvKglyZWcwCXJlZzEJcmVnMglyZWczCXJlZzQJcmVnNQlyZWc2CXJlZzcgKi8KLQkweDAwLAkweDYxLAkweDQ0LAkweDAwLAkweDFhLAkweDIwLAkweDIwLAkweDIwLAorCTB4MDAsCTB4NjEsCTB4NDAsCTB4MDAsCTB4MWEsCTB4MjAsCTB4MjAsCTB4MjAsCiAvKglyZWc4CXJlZzkJcmVnYQlyZWdiCXJlZ2MJcmVnZAlyZWdlCXJlZ2YgKi8KIAkweDgxLAkweDVkLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAkweDAwLAogLyoJcmVnMTAJcmVnMTEJcmVnMTIJcmVnMTMJcmVnMTQJcmVnMTUJcmVnMTYJcmVnMTcgKi8KQEAgLTE2NDQsNiArMTY0Myw3IEBACiAJCQkgIGNvbnN0IHU4ICpzbjljMXh4KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCByZWcwMTAyWzJdOwogCWNvbnN0IHU4ICpyZWc5YTsKIAlzdGF0aWMgY29uc3QgdTggcmVnOWFfZGVmW10gPQogCQl7MHgwMCwgMHg0MCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMH07CkBAIC0xNjU2LDcgKzE2NTYsMTEgQEAKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCBzbjljMXh4WzFdKTsKIAogCS8qIGNvbmZpZ3VyZSBncGlvICovCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAmc245YzF4eFsxXSwgMik7CisJcmVnMDEwMlswXSA9IHNuOWMxeHhbMV07CisJcmVnMDEwMlsxXSA9IHNuOWMxeHhbMl07CisJaWYgKGdzcGNhX2Rldi0+YXVkaW8pCisJCXJlZzAxMDJbMV0gfD0gMHgwNDsJLyoga2VlcCB0aGUgYXVkaW8gY29ubmVjdGlvbiAqLworCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgcmVnMDEwMiwgMik7CiAJcmVnX3coZ3NwY2FfZGV2LCAweDA4LCAmc245YzF4eFs4XSwgMik7CiAJcmVnX3coZ3NwY2FfZGV2LCAweDE3LCAmc245YzF4eFsweDE3XSwgNSk7CiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CkBAIC0xNzM3LDEzICsxNzQxLDEyIEBACiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4NDApOwogCQlicmVhazsKIAljYXNlIFNFTlNPUl9QTzIwMzBOOgorCWNhc2UgU0VOU09SX09WNzY2MDoKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg2Myk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4MjApOwogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYyKTsKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg0Mik7CiAJCWJyZWFrOwotCWNhc2UgU0VOU09SX09WNzY2MDoKLQkJLyogZmFsbCB0aHJ1ICovCiAJY2FzZSBTRU5TT1JfU1A4MDcwODoKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg2Myk7CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4MjApOwpAQCAtMTgxNiw3ICsxODE5LDcgQEAKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJY29uc3QgdTggKnNuOWMxeHg7Ci0JdTggcmVnR3Bpb1tdID0geyAweDI5LCAweDc0IH07CisJdTggcmVnR3Bpb1tdID0geyAweDI5LCAweDc0IH07CQkvKiB3aXRoIGF1ZGlvICovCiAJdTggcmVnRjE7CiAKIAkvKiBzZXR1cCBhIHNlbGVjdG9yIGJ5IGJyaWRnZSAqLwpAQCAtMTg1Niw3ICsxODU5LDcgQEAKIAkJCXBvMjAzMG5fcHJvYmUoZ3NwY2FfZGV2KTsKIAkJCWJyZWFrOwogCQl9Ci0JCXJlZ0dwaW9bMV0gPSAweDcwOworCQlyZWdHcGlvWzFdID0gMHg3MDsJCS8qIG5vIGF1ZGlvICovCiAJCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgcmVnR3BpbywgMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMjc0LDcgKzIyNzcsNyBAQAogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlpbnQgaTsKLQl1OCByZWcxLCByZWcyLCByZWcxNzsKKwl1OCByZWcxLCByZWcxNzsKIAljb25zdCB1OCAqc245YzF4eDsKIAljb25zdCB1OCAoKmluaXQpWzhdOwogCWludCBtb2RlOwpAQCAtMjMwNCwyMyArMjMwNyw2IEBACiAJLyogaW5pdGlhbGl6ZSB0aGUgc2Vuc29yICovCiAJaTJjX3dfc2VxKGdzcGNhX2Rldiwgc2Vuc29yX2luaXRbc2QtPnNlbnNvcl0pOwogCi0Jc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5TT1JfQURDTTE3MDA6Ci0JCXJlZzIgPSAweDYwOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9PTTY4MDI6Ci0JCXJlZzIgPSAweDcxOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TUDgwNzA4OgotCQlyZWcyID0gMHg2MjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmVnMiA9IDB4NDA7Ci0JCWJyZWFrOwotCX0KLQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAyLCByZWcyKTsKLQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAyLCByZWcyKTsKLQogCXJlZ193MShnc3BjYV9kZXYsIDB4MTUsIHNuOWMxeHhbMHgxNV0pOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MTYsIHNuOWMxeHhbMHgxNl0pOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MTIsIHNuOWMxeHhbMHgxMl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhMTUyOC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhMTUyOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTE0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2ExNTI4LmMKQEAgLTAsMCArMSw2MDUgQEAKKy8qCisgKiBzcGNhMTUyOCBzdWJkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSmVhbi1GcmFuY29pcyBNb2luZSAoaHR0cDovL21vaW5lamYuZnJlZS5mcikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInNwY2ExNTI4IgorCisjaW5jbHVkZSAiZ3NwY2EuaCIKKyNpbmNsdWRlICJqcGVnLmgiCisKK01PRFVMRV9BVVRIT1IoIkplYW4tRnJhbmNvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNQQ0ExNTI4IFVTQiBDYW1lcmEgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIHNwZWNpZmljIHdlYmNhbSBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgc2QgeworCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCisKKwl1OCBicmlnaHRuZXNzOworCXU4IGNvbnRyYXN0OworCXU4IGh1ZTsKKwl1OCBjb2xvcjsKKwl1OCBzaGFycG5lc3M7CisKKwl1OCBwa3Rfc2VxOworCisJdTgganBlZ19oZHJbSlBFR19IRFJfU1pdOworfTsKKworLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLworc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGh1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGh1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRjb2xvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGNvbG9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIkJyaWdodG5lc3MiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjU1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIEJSSUdIVE5FU1NfREVGIDEyOAorCQkuZGVmYXVsdF92YWx1ZSA9IEJSSUdIVE5FU1NfREVGLAorCSAgICB9LAorCSAgICAuc2V0ID0gc2Rfc2V0YnJpZ2h0bmVzcywKKwkgICAgLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCisJfSwKKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJDb250cmFzdCIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSA4LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIENPTlRSQVNUX0RFRiAxCisJCS5kZWZhdWx0X3ZhbHVlID0gQ09OVFJBU1RfREVGLAorCSAgICB9LAorCSAgICAuc2V0ID0gc2Rfc2V0Y29udHJhc3QsCisJICAgIC5nZXQgPSBzZF9nZXRjb250cmFzdCwKKwl9LAorCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0hVRSwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJIdWUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjU1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIEhVRV9ERUYgMAorCQkuZGVmYXVsdF92YWx1ZSA9IEhVRV9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRodWUsCisJICAgIC5nZXQgPSBzZF9nZXRodWUsCisJfSwKKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIlNhdHVyYXRpb24iLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gOCwKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBDT0xPUl9ERUYgMQorCQkuZGVmYXVsdF92YWx1ZSA9IENPTE9SX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGNvbG9yLAorCSAgICAuZ2V0ID0gc2RfZ2V0Y29sb3IsCisJfSwKKwl7CisJICAgIHsKKwkJLmlkCSA9IFY0TDJfQ0lEX1NIQVJQTkVTUywKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJTaGFycG5lc3MiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjU1LAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIFNIQVJQTkVTU19ERUYgMAorCQkuZGVmYXVsdF92YWx1ZSA9IFNIQVJQTkVTU19ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRzaGFycG5lc3MsCisJICAgIC5nZXQgPSBzZF9nZXRzaGFycG5lc3MsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CisvKgkJKGRvZXMgbm90IHdvcmsgY29ycmVjdGx5KQorCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDE3NiwKKwkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCAqIDUgLyA4ICsgNTkwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCQkucHJpdiA9IDN9LAorKi8KKwl7MzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCisJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAgKiA0IC8gOCArIDU5MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkJLnByaXYgPSAyfSwKKwl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSA2NDAsCisJCS5zaXplaW1hZ2UgPSA2NDAgKiA0ODAgKiAzIC8gOCArIDU5MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkJLnByaXYgPSAxfSwKK307CisKKy8qIHJlYWQgPGxlbj4gYnl0ZXMgdG8gZ3NwY2EgdXNiX2J1ZiAqLworc3RhdGljIHZvaWQgcmVnX3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJdTggcmVxLAorCQkJdTE2IGluZGV4LAorCQkJaW50IGxlbikKK3sKKyNpZiBVU0JfQlVGX1NaIDwgNjQKKyNlcnJvciAiVVNCIGJ1ZmZlciB0b28gc21hbGwiCisjZW5kaWYKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJaW50IHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQlyZXEsCisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCTB4MDAwMCwJCQkvKiB2YWx1ZSAqLworCQkJaW5kZXgsCisJCQlnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKKwkJCTUwMCk7CisJUERFQlVHKERfVVNCSSwgIkdFVCAlMDJ4IDAwMDAgJTA0eCAlMDJ4IiwgcmVxLCBpbmRleCwKKwkJCSBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOworCWlmIChyZXQgPCAwKSB7CisJCVBERUJVRyhEX0VSUiwgInJlZ19yIGVyciAlZCIsIHJldCk7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlZ193KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXU4IHJlcSwKKwkJCXUxNiB2YWx1ZSwKKwkJCXUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJaW50IHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJUERFQlVHKERfVVNCTywgIlNFVCAlMDJ4ICUwNHggJTA0eCIsIHJlcSwgdmFsdWUsIGluZGV4KTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCXJlcSwKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXZhbHVlLCBpbmRleCwKKwkJCU5VTEwsIDAsIDUwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAicmVnX3cgZXJyICVkIiwgcmV0KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVnX3diKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXU4IHJlcSwKKwkJCXUxNiB2YWx1ZSwKKwkJCXUxNiBpbmRleCwKKwkJCXU4IGJ5dGUpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OworCWludCByZXQ7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCVBERUJVRyhEX1VTQk8sICJTRVQgJTAyeCAlMDR4ICUwNHggJTAyeCIsIHJlcSwgdmFsdWUsIGluZGV4LCBieXRlKTsKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSBieXRlOworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJcmVxLAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJdmFsdWUsIGluZGV4LAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCA1MDApOworCWlmIChyZXQgPCAwKSB7CisJCVBERUJVRyhEX0VSUiwgInJlZ193IGVyciAlZCIsIHJldCk7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfc3RhdHVzXzAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCWludCBpOworCisJaSA9IDIwOworCWRvIHsKKwkJcmVnX3IoZ3NwY2FfZGV2LCAweDIxLCAweDAwMDAsIDEpOworCQlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdID09IDApCisJCQlyZXR1cm47CisJCW1zbGVlcCgzMCk7CisJfSB3aGlsZSAoLS1pID4gMCk7CisJUERFQlVHKERfRVJSLCAid2FpdF9zdGF0dXNfMCB0aW1lb3V0Iik7CisJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVUSU1FOworfQorCitzdGF0aWMgdm9pZCB3YWl0X3N0YXR1c18xKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlpbnQgaTsKKworCWkgPSAxMDsKKwlkbyB7CisJCXJlZ19yKGdzcGNhX2RldiwgMHgyMSwgMHgwMDAxLCAxKTsKKwkJbXNsZWVwKDEwKTsKKwkJaWYgKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9PSAxKSB7CisJCQlyZWdfd2IoZ3NwY2FfZGV2LCAweDIxLCAweDAwMDAsIDB4MDAwMSwgMHgwMCk7CisJCQlyZWdfcihnc3BjYV9kZXYsIDB4MjEsIDB4MDAwMSwgMSk7CisJCQlyZXR1cm47CisJCX0KKwl9IHdoaWxlICgtLWkgPiAwKTsKKwlQREVCVUcoRF9FUlIsICJ3YWl0X3N0YXR1c18xIHRpbWVvdXQiKTsKKwlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRVRJTUU7Cit9CisKK3N0YXRpYyB2b2lkIHNldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXJlZ193Yihnc3BjYV9kZXYsIDB4YzAsIDB4MDAwMCwgMHgwMGMwLCBzZC0+YnJpZ2h0bmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweGMxLCAweDAwMDAsIDB4MDBjMSwgc2QtPmNvbnRyYXN0KTsKK30KKworc3RhdGljIHZvaWQgc2V0aHVlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweGMyLCAweDAwMDAsIDB4MDAwMCwgc2QtPmh1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGNvbG9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweGMzLCAweDAwMDAsIDB4MDBjMywgc2QtPmNvbG9yKTsKK30KKworc3RhdGljIHZvaWQgc2V0c2hhcnBuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweGM0LCAweDAwMDAsIDB4MDBjNCwgc2QtPnNoYXJwbmVzcyk7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KK3N0YXRpYyBpbnQgc2RfY29uZmlnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZSA9IHZnYV9tb2RlOworCWdzcGNhX2Rldi0+Y2FtLm5tb2RlcyA9IEFSUkFZX1NJWkUodmdhX21vZGUpOworCWdzcGNhX2Rldi0+Y2FtLm5wa3QgPSAxMjg7IC8qIG51bWJlciBvZiBwYWNrZXRzIHBlciBJU09DIG1lc3NhZ2UgKi8KKwkJCS8qZml4bWU6IDI1NiBpbiBtcy13aW4gdHJhY2VzKi8KKworCXNkLT5icmlnaHRuZXNzID0gQlJJR0hUTkVTU19ERUY7CisJc2QtPmNvbnRyYXN0ID0gQ09OVFJBU1RfREVGOworCXNkLT5odWUgPSBIVUVfREVGOworCXNkLT5jb2xvciA9IENPTE9SX0RFRjsKKwlzZC0+c2hhcnBuZXNzID0gU0hBUlBORVNTX0RFRjsKKworCWdzcGNhX2Rldi0+bmJhbHQgPSA0OwkJLyogdXNlIGFsdGVybmF0ZSBzZXR0aW5nIDMgKi8KKworCXJldHVybiAwOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSBhbmQgcmVzdW1lIHRpbWUgKi8KK3N0YXRpYyBpbnQgc2RfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDAwMDEsIDB4MjA2Nyk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDAwZDAsIDB4MjA2Yik7CisJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDAwMDAsIDB4MjA2Yyk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDAwMDEsIDB4MjA2OSk7CisJbXNsZWVwKDgpOworCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgwMGMwLCAweDIwNmIpOworCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgwMDAwLCAweDIwNmMpOworCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgwMDAxLCAweDIwNjkpOworCisJcmVnX3IoZ3NwY2FfZGV2LCAweDIwLCAweDAwMDAsIDEpOworCXJlZ19yKGdzcGNhX2RldiwgMHgyMCwgMHgwMDAwLCA1KTsKKwlyZWdfcihnc3BjYV9kZXYsIDB4MjMsIDB4MDAwMCwgNjQpOworCVBERUJVRyhEX1BST0JFLCAiJXMlcyIsICZnc3BjYV9kZXYtPnVzYl9idWZbMHgxY10sCisJCQkJJmdzcGNhX2Rldi0+dXNiX2J1ZlsweDMwXSk7CisJcmVnX3IoZ3NwY2FfZGV2LCAweDIzLCAweDAwMDEsIDY0KTsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCisvKiBmdW5jdGlvbiBjYWxsZWQgYXQgc3RhcnQgdGltZSBiZWZvcmUgVVJCIGNyZWF0aW9uICovCitzdGF0aWMgaW50IHNkX2lzb2NfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJdTggbW9kZTsKKworCXJlZ19yKGdzcGNhX2RldiwgMHgwMCwgMHgyNTIwLCAxKTsKKwl3YWl0X3N0YXR1c18wKGdzcGNhX2Rldik7CisJcmVnX3coZ3NwY2FfZGV2LCAweGM1LCAweDAwMDMsIDB4MDAwMCk7CisJd2FpdF9zdGF0dXNfMShnc3BjYV9kZXYpOworCisJd2FpdF9zdGF0dXNfMChnc3BjYV9kZXYpOworCW1vZGUgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweDI1LCAweDAwMDAsIDB4MDAwNCwgbW9kZSk7CisJcmVnX3IoZ3NwY2FfZGV2LCAweDI1LCAweDAwMDQsIDEpOworCXJlZ193Yihnc3BjYV9kZXYsIDB4MjcsIDB4MDAwMCwgMHgwMDAwLCAweDA2KTsKKwlyZWdfcihnc3BjYV9kZXYsIDB4MjcsIDB4MDAwMCwgMSk7CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLworc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJLyogaW5pdGlhbGl6ZSB0aGUgSlBFRyBoZWFkZXIgKi8KKwlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGdzcGNhX2Rldi0+aGVpZ2h0LCBnc3BjYV9kZXYtPndpZHRoLAorCQkJMHgyMik7CQkvKiBKUEVHIDQxMSAqLworCisJLyogdGhlIEpQRUcgcXVhbGl0eSBzZWVtcyB0byBiZSA4MiUgKi8KKwlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgODIpOworCisJLyogc2V0IHRoZSBjb250cm9scyAqLworCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKKwlzZXRjb250cmFzdChnc3BjYV9kZXYpOworCXNldGh1ZShnc3BjYV9kZXYpOworCXNldGNvbG9yKGdzcGNhX2Rldik7CisJc2V0c2hhcnBuZXNzKGdzcGNhX2Rldik7CisKKwltc2xlZXAoNSk7CisJcmVnX3IoZ3NwY2FfZGV2LCAweDAwLCAweDI1MjAsIDEpOworCW1zbGVlcCg4KTsKKworCS8qIHN0YXJ0IHRoZSBjYXB0dXJlICovCisJd2FpdF9zdGF0dXNfMChnc3BjYV9kZXYpOworCXJlZ193KGdzcGNhX2RldiwgMHgzMSwgMHgwMDAwLCAweDAwMDQpOworCXdhaXRfc3RhdHVzXzEoZ3NwY2FfZGV2KTsKKwl3YWl0X3N0YXR1c18wKGdzcGNhX2Rldik7CisJbXNsZWVwKDIwMCk7CisKKwlzZC0+cGt0X3NlcSA9IDA7CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCS8qIHN0b3AgdGhlIGNhcHR1cmUgKi8KKwl3YWl0X3N0YXR1c18wKGdzcGNhX2Rldik7CisJcmVnX3coZ3NwY2FfZGV2LCAweDMxLCAweDAwMDAsIDB4MDAwMCk7CisJd2FpdF9zdGF0dXNfMShnc3BjYV9kZXYpOworCXdhaXRfc3RhdHVzXzAoZ3NwY2FfZGV2KTsKK30KKworLyogbW92ZSBhIHBhY2tldCBhZGRpbmcgMHgwMCBhZnRlciAweGZmICovCitzdGF0aWMgdm9pZCBhZGRfcGFja2V0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXU4ICpkYXRhLAorCQkJaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWkgPSAwOworCWRvIHsKKwkJaWYgKGRhdGFbaV0gPT0gMHhmZikgeworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQkJCQlkYXRhLCBpICsgMSk7CisJCQlsZW4gLT0gaTsKKwkJCWRhdGEgKz0gaTsKKwkJCSpkYXRhID0gMHgwMDsKKwkJCWkgPSAwOworCQl9CisJfSB3aGlsZSAoKytpIDwgbGVuKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0YXRpYyBjb25zdCB1OCBmZmQ5W10gPSB7MHhmZiwgMHhkOX07CisKKwkvKiBpbWFnZSBwYWNrZXRzIHN0YXJ0IHdpdGg6CisJICoJMDIgOG4KKwkgKiB3aXRoIDxuPiBiaXQ6CisJICoJMHgwMTogZXZlbiAoMCkgLyBvZGQgKDEpIGltYWdlCisJICoJMHgwMjogZW5kIG9mIGltYWdlIHdoZW4gc2V0CisJICovCisJaWYgKGxlbiA8IDMpCisJCXJldHVybjsJCQkJLyogZW1wdHkgcGFja2V0ICovCisJaWYgKCpkYXRhID09IDB4MDIpIHsKKwkJaWYgKGRhdGFbMV0gJiAweDAyKSB7CisJCQlzZC0+cGt0X3NlcSA9ICEoZGF0YVsxXSAmIDEpOworCQkJYWRkX3BhY2tldChnc3BjYV9kZXYsIGRhdGEgKyAyLCBsZW4gLSAyKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAorCQkJCQlmZmQ5LCAyKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKGRhdGFbMV0gJiAxKSAhPSBzZC0+cGt0X3NlcSkKKwkJCWdvdG8gZXJyOworCQlpZiAoZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID09IExBU1RfUEFDS0VUKQorCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULAorCQkJCQlzZC0+anBlZ19oZHIsIEpQRUdfSERSX1NaKTsKKwkJYWRkX3BhY2tldChnc3BjYV9kZXYsIGRhdGEgKyAyLCBsZW4gLSAyKTsKKwkJcmV0dXJuOworCX0KK2VycjoKKwlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKK30KKworc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5icmlnaHRuZXNzID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5icmlnaHRuZXNzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5jb250cmFzdCA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIGludCBzZF9nZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5jb250cmFzdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRodWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmh1ZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGh1ZShnc3BjYV9kZXYpOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0aHVlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPmh1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRjb2xvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+Y29sb3IgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRjb2xvcihnc3BjYV9kZXYpOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0Y29sb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Y29sb3I7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0c2hhcnBuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5zaGFycG5lc3MgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRzaGFycG5lc3MoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgaW50IHNkX2dldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5zaGFycG5lc3M7CisJcmV0dXJuIDA7Cit9CisKKy8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0geworCS5uYW1lID0gTU9EVUxFX05BTUUsCisJLmN0cmxzID0gc2RfY3RybHMsCisJLm5jdHJscyA9IEFSUkFZX1NJWkUoc2RfY3RybHMpLAorCS5jb25maWcgPSBzZF9jb25maWcsCisJLmluaXQgPSBzZF9pbml0LAorCS5pc29jX2luaXQgPSBzZF9pc29jX2luaXQsCisJLnN0YXJ0ID0gc2Rfc3RhcnQsCisJLnN0b3BOID0gc2Rfc3RvcE4sCisJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCit9OworCisvKiAtLSBtb2R1bGUgaW5pdGlhbGlzYXRpb24gLS0gKi8KK3N0YXRpYyBjb25zdCBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDRmYywgMHgxNTI4KX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJLyogdGhlIHZpZGVvIGludGVyZmFjZSBmb3IgaXNvY2hyb25vdXMgdHJhbnNmZXIgaXMgMSAqLworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZTIoaW50ZiwgaWQsICZzZF9kZXNjLCBzaXplb2Yoc3RydWN0IHNkKSwKKwkJCQlUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgPSBkZXZpY2VfdGFibGUsCisJLnByb2JlID0gc2RfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBnc3BjYV9kaXNjb25uZWN0LAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gZ3NwY2Ffc3VzcGVuZCwKKwkucmVzdW1lID0gZ3NwY2FfcmVzdW1lLAorI2VuZGlmCit9OworCisvKiAtLSBtb2R1bGUgaW5zZXJ0IC8gcmVtb3ZlIC0tICovCitzdGF0aWMgaW50IF9faW5pdCBzZF9tb2RfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB1c2JfcmVnaXN0ZXIoJnNkX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaW5mbygicmVnaXN0ZXJlZCIpOworCXJldHVybiAwOworfQorc3RhdGljIHZvaWQgX19leGl0IHNkX21vZF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNkX2RyaXZlcik7CisJaW5mbygiZGVyZWdpc3RlcmVkIik7Cit9CisKK21vZHVsZV9pbml0KHNkX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHNkX21vZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAwLmMKaW5kZXggYjg2NmM3My4uYzAyYmViNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAwLmMKQEAgLTU3LDcgKzU3LDcgQEAKICNkZWZpbmUgUGFsbVBpeERDODUgMTMKICNkZWZpbmUgVG9wdHJvSW5kdXMgMTQKIAotCXU4ICpqcGVnX2hkcjsKKwl1OCBqcGVnX2hkcltKUEVHX0hEUl9TWl07CiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCkBAIC02NjksOSArNjY5LDYgQEAKIAlfX3U4IHhtdWx0LCB5bXVsdDsKIAogCS8qIGNyZWF0ZSB0aGUgSlBFRyBoZWFkZXIgKi8KLQlzZC0+anBlZ19oZHIgPSBrbWFsbG9jKEpQRUdfSERSX1NaLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNkLT5qcGVnX2hkcikKLQkJcmV0dXJuIC1FTk9NRU07CiAJanBlZ19kZWZpbmUoc2QtPmpwZWdfaGRyLCBnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCwKIAkJCTB4MjIpOwkJLyogSlBFRyA0MTEgKi8KIAlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOwpAQCAtODkxLDEzICs4ODgsNiBAQAogCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwogfQogCi1zdGF0aWMgdm9pZCBzZF9zdG9wMChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Ja2ZyZWUoc2QtPmpwZWdfaGRyKTsKLX0KLQogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KIAkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KQEAgLTEwNTUsNyArMTA0NSw2IEBACiAJLmluaXQgPSBzZF9pbml0LAogCS5zdGFydCA9IHNkX3N0YXJ0LAogCS5zdG9wTiA9IHNkX3N0b3BOLAotCS5zdG9wMCA9IHNkX3N0b3AwLAogCS5wa3Rfc2NhbiA9IHNkX3BrdF9zY2FuLAogCS5nZXRfamNvbXAgPSBzZF9nZXRfamNvbXAsCiAJLnNldF9qY29tcCA9IHNkX3NldF9qY29tcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MzB4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTMweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Y2VlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTMweC5jCkBAIC0wLDAgKzEsMTQwMiBAQAorLyoKKyAqIFNROTMweCBzdWJkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSmVhbi1GcmFuw6dvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgLTIwMDggR2VyYXJkIEtsYXZlciA8Z2VyYXJkIGF0IGdrYWxsIGRvdCBob2JieSBkb3Qgbmw+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2FtIFJldml0Y2ggPHNhbXI3QGNzLndhc2hpbmd0b24uZWR1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2RlZmluZSBNT0RVTEVfTkFNRSAic3E5MzB4IgorCisjaW5jbHVkZSAiZ3NwY2EuaCIKKyNpbmNsdWRlICJqcGVnLmgiCisKK01PRFVMRV9BVVRIT1IoIkplYW4tRnJhbmNvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+XG4iCisJCSJHZXJhcmQgS2xhdmVyIDxnZXJhcmQgYXQgZ2thbGwgZG90IGhvYmJ5IGRvdCBubFxuIgorCQkiU2FtIFJldml0Y2ggPHNhbXI3QGNzLndhc2hpbmd0b24uZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHU1BDQS9TUTkzMHggVVNCIENhbWVyYSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBCVUxLX1RSQU5TRkVSX0xFTiA1MTI4CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCitzdHJ1Y3Qgc2QgeworCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCisKKwl1MTYgZXhwbzsKKwl1OCBnYWluOworCisJdTggcXVhbGl0eTsJCS8qIHdlYmNhbSBxdWFsaXR5IDAuLjMgKi8KKyNkZWZpbmUgUVVBTElUWV9ERUYgMQorCisJdTggZ3Bpb1syXTsKKworCXU4IGVvZl9sZW47CisJdTggZG9fY3RybDsKKworCXU4IHNlbnNvcjsKK2VudW0geworCVNFTlNPUl9JQ1gwOThCUSwKKwlTRU5TT1JfTFoyNEJQLAorCVNFTlNPUl9NSTAzNjAsCisJU0VOU09SX01UOVYxMTEsCisJU0VOU09SX09WNzY2MCwKKwlTRU5TT1JfT1Y5NjMwLAorfSBzZW5zb3JzOworCXU4IHR5cGU7CisjZGVmaW5lIEdlbmVyaWMgMAorI2RlZmluZSBDcmVhdGl2ZV9saXZlX21vdGlvbiAxCisKKwl1OCBqcGVnX2hkcltKUEVHX0hEUl9TWl07Cit9OworCitzdGF0aWMgaW50IHNkX3NldGV4cG8oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRleHBvKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0geworCXsKKwkgICAgeworCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJFeHBvc3VyZSIsCisJCS5taW5pbXVtID0gMHgwMDAxLAorCQkubWF4aW11bSA9IDB4MGZmZiwKKwkJLnN0ZXAgPSAxLAorI2RlZmluZSBFWFBPX0RFRiAweDAyN2QKKwkJLmRlZmF1bHRfdmFsdWUgPSBFWFBPX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGV4cG8sCisJICAgIC5nZXQgPSBzZF9nZXRleHBvLAorCX0sCisJeworCSAgICB7CisJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiR2FpbiIsCisJCS5taW5pbXVtID0gMHgwMSwKKwkJLm1heGltdW0gPSAweGZmLAorCQkuc3RlcCA9IDEsCisjZGVmaW5lIEdBSU5fREVGIDB4NjEKKwkJLmRlZmF1bHRfdmFsdWUgPSBHQUlOX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGdhaW4sCisJICAgIC5nZXQgPSBzZF9nZXRnYWluLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0geworCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDE2MCwKKwkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDUgLyA4ICsgNTkwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCQkucHJpdiA9IDB9LAorCXszMjAsIDI0MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDMyMCwKKwkJLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDQgLyA4ICsgNTkwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCQkucHJpdiA9IDF9LAorCXs2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCwKKwkJLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCAqIDMgLyA4ICsgNTkwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCQkucHJpdiA9IDJ9LAorfTsKKworLyogSlBFRyBxdWFsaXR5IGluZGV4ZWQgYnkgd2ViY2FtIHF1YWxpdHkgKi8KKyNkZWZpbmUgUVVBTF8wIDkwCisjZGVmaW5lIFFVQUxfMSA4NQorI2RlZmluZSBRVUFMXzIgNzUKKyNkZWZpbmUgUVVBTF8zIDcwCitzdGF0aWMgY29uc3QgdTggcXVhbGl0eV90Yls0XSA9IHsgUVVBTF8wLCBRVUFMXzEsIFFVQUxfMiwgUVVBTF8zIH07CisKKy8qIHNxOTMweCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1E5MzBfQ1RSTF9VQ0JVU19JTwkweDAwMDEKKyNkZWZpbmUgU1E5MzBfQ1RSTF9JMkNfSU8JMHgwMDAyCisjZGVmaW5lIFNROTMwX0NUUkxfR1BJTwkJMHgwMDA1CisjZGVmaW5lIFNROTMwX0NUUkxfQ0FQX1NUQVJUCTB4MDAxMAorI2RlZmluZSBTUTkzMF9DVFJMX0NBUF9TVE9QCTB4MDAxMQorI2RlZmluZSBTUTkzMF9DVFJMX1NFVF9FWFBPU1VSRSAweDAwMWQKKyNkZWZpbmUgU1E5MzBfQ1RSTF9SRVNFVAkweDAwMWUKKyNkZWZpbmUgU1E5MzBfQ1RSTF9HRVRfREVWX0lORk8gMHgwMDFmCisKKy8qIGdwaW8gMSAoOC4uMTUpICovCisjZGVmaW5lIFNROTMwX0dQSU9fREZMX0kyQ19TREEJMHgwMDAxCisjZGVmaW5lIFNROTMwX0dQSU9fREZMX0kyQ19TQ0wJMHgwMDAyCisjZGVmaW5lIFNROTMwX0dQSU9fUlNUQkFSCTB4MDAwNAorI2RlZmluZSBTUTkzMF9HUElPX0VYVFJBMQkweDAwNDAKKyNkZWZpbmUgU1E5MzBfR1BJT19FWFRSQTIJMHgwMDgwCisvKiBncGlvIDMgKDI0Li4zMSkgKi8KKyNkZWZpbmUgU1E5MzBfR1BJT19QT1dFUgkweDAyMDAKKyNkZWZpbmUgU1E5MzBfR1BJT19ERkxfTEVECTB4MTAwMAorCitzdHJ1Y3QgdWNidXNfd3JpdGVfY21kIHsKKwl1MTYJYndfYWRkcjsKKwl1OAlid19kYXRhOworfTsKK3N0cnVjdCBpMmNfd3JpdGVfY21kIHsKKwl1OAlyZWc7CisJdTE2CXZhbDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWNidXNfd3JpdGVfY21kIGljeDA5OGJxX3N0YXJ0XzBbXSA9IHsKKwl7MHgwMzU0LCAweDAwfSwgezB4MDNmYSwgMHgwMH0sIHsweGY4MDAsIDB4MDJ9LCB7MHhmODAxLCAweGNlfSwKKwl7MHhmODAyLCAweGMxfSwgezB4ZjgwNCwgMHgwMH0sIHsweGY4MDgsIDB4MDB9LCB7MHhmODA5LCAweDBlfSwKKwl7MHhmODBhLCAweDAxfSwgezB4ZjgwYiwgMHhlZX0sIHsweGY4MDcsIDB4NjB9LCB7MHhmODBjLCAweDAyfSwKKwl7MHhmODBkLCAweGYwfSwgezB4ZjgwZSwgMHgwM30sIHsweGY4MGYsIDB4MGF9LCB7MHhmODFjLCAweDAyfSwKKwl7MHhmODFkLCAweGYwfSwgezB4ZjgxZSwgMHgwM30sIHsweGY4MWYsIDB4MGF9LCB7MHhmODNhLCAweDAwfSwKKwl7MHhmODNiLCAweDEwfSwgezB4ZjgzYywgMHgwMH0sIHsweGY4M2QsIDB4NGV9LCB7MHhmODEwLCAweDA0fSwKKwl7MHhmODExLCAweDAwfSwgezB4ZjgxMiwgMHgwMn0sIHsweGY4MTMsIDB4MTB9LCB7MHhmODAzLCAweDAwfSwKKwl7MHhmODE0LCAweDAxfSwgezB4ZjgxNSwgMHgxOH0sIHsweGY4MTYsIDB4MDB9LCB7MHhmODE3LCAweDQ4fSwKKwl7MHhmODE4LCAweDAwfSwgezB4ZjgxOSwgMHgyNX0sIHsweGY4MWEsIDB4MDB9LCB7MHhmODFiLCAweDNjfSwKKwl7MHhmODJmLCAweDAzfSwgezB4ZjgyMCwgMHhmZn0sIHsweGY4MjEsIDB4MGR9LCB7MHhmODIyLCAweGZmfSwKKwl7MHhmODIzLCAweDA3fSwgezB4ZjgyNCwgMHhmZn0sIHsweGY4MjUsIDB4MDN9LCB7MHhmODI2LCAweGZmfSwKKwl7MHhmODI3LCAweDA2fSwgezB4ZjgyOCwgMHhmZn0sIHsweGY4MjksIDB4MDN9LCB7MHhmODJhLCAweGZmfSwKKwl7MHhmODJiLCAweDBjfSwgezB4ZjgyYywgMHhmZH0sIHsweGY4MmQsIDB4MDF9LCB7MHhmODJlLCAweDAwfSwKKwl7MHhmODMwLCAweDAwfSwgezB4ZjgzMSwgMHg0N30sIHsweGY4MzIsIDB4MDB9LCB7MHhmODMzLCAweDAwfSwKKwl7MHhmODUwLCAweDAwfSwgezB4Zjg1MSwgMHgwMH0sIHsweGY4NTIsIDB4MDB9LCB7MHhmODUzLCAweDI0fSwKKwl7MHhmODU0LCAweDAwfSwgezB4Zjg1NSwgMHgxOH0sIHsweGY4NTYsIDB4MDB9LCB7MHhmODU3LCAweDNjfSwKKwl7MHhmODU4LCAweDAwfSwgezB4Zjg1OSwgMHgwY30sIHsweGY4NWEsIDB4MDB9LCB7MHhmODViLCAweDMwfSwKKwl7MHhmODVjLCAweDAwfSwgezB4Zjg1ZCwgMHgwY30sIHsweGY4NWUsIDB4MDB9LCB7MHhmODVmLCAweDMwfSwKKwl7MHhmODYwLCAweDAwfSwgezB4Zjg2MSwgMHg0OH0sIHsweGY4NjIsIDB4MDF9LCB7MHhmODYzLCAweGRjfSwKKwl7MHhmODY0LCAweGZmfSwgezB4Zjg2NSwgMHg5OH0sIHsweGY4NjYsIDB4ZmZ9LCB7MHhmODY3LCAweGMwfSwKKwl7MHhmODY4LCAweGZmfSwgezB4Zjg2OSwgMHg3MH0sIHsweGY4NmMsIDB4ZmZ9LCB7MHhmODZkLCAweDAwfSwKKwl7MHhmODZhLCAweGZmfSwgezB4Zjg2YiwgMHg0OH0sIHsweGY4NmUsIDB4ZmZ9LCB7MHhmODZmLCAweDAwfSwKKwl7MHhmODcwLCAweDAxfSwgezB4Zjg3MSwgMHhkYn0sIHsweGY4NzIsIDB4MDF9LCB7MHhmODczLCAweGZhfSwKKwl7MHhmODc0LCAweDAxfSwgezB4Zjg3NSwgMHhkYn0sIHsweGY4NzYsIDB4MDF9LCB7MHhmODc3LCAweGZhfSwKKwl7MHhmODc4LCAweDBmfSwgezB4Zjg3OSwgMHgwZn0sIHsweGY4N2EsIDB4ZmZ9LCB7MHhmODdiLCAweGZmfSwKKwl7MHhmODAwLCAweDAzfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWNidXNfd3JpdGVfY21kIGljeDA5OGJxX3N0YXJ0XzFbXSA9IHsKKwl7MHhmNWYwLCAweDAwfSwgezB4ZjVmMSwgMHhjZH0sIHsweGY1ZjIsIDB4ODB9LCB7MHhmNWYzLCAweDgwfSwKKwl7MHhmNWY0LCAweGMwfSwKKwl7MHhmNWYwLCAweDQ5fSwgezB4ZjVmMSwgMHhjZH0sIHsweGY1ZjIsIDB4ODB9LCB7MHhmNWYzLCAweDgwfSwKKwl7MHhmNWY0LCAweGMwfSwKKwl7MHhmNWZhLCAweDAwfSwgezB4ZjVmNiwgMHgwMH0sIHsweGY1ZjcsIDB4MDB9LCB7MHhmNWY4LCAweDAwfSwKKwl7MHhmNWY5LCAweDAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgaWN4MDk4YnFfc3RhcnRfMltdID0geworCXsweGY4MDAsIDB4MDJ9LCB7MHhmODA3LCAweGZmfSwgezB4ZjgwNSwgMHg4Mn0sIHsweGY4MDYsIDB4MDB9LAorCXsweGY4MDcsIDB4N2Z9LCB7MHhmODAwLCAweDAzfSwKKwl7MHhmODAwLCAweDAyfSwgezB4ZjgwNywgMHhmZn0sIHsweGY4MDUsIDB4NDB9LCB7MHhmODA2LCAweDAwfSwKKwl7MHhmODA3LCAweDdmfSwgezB4ZjgwMCwgMHgwM30sCisJezB4ZjgwMCwgMHgwMn0sIHsweGY4MDcsIDB4ZmZ9LCB7MHhmODA1LCAweGNmfSwgezB4ZjgwNiwgMHhkMH0sCisJezB4ZjgwNywgMHg3Zn0sIHsweGY4MDAsIDB4MDN9LAorCXsweGY4MDAsIDB4MDJ9LCB7MHhmODA3LCAweGZmfSwgezB4ZjgwNSwgMHgwMH0sIHsweGY4MDYsIDB4MDB9LAorCXsweGY4MDcsIDB4N2Z9LCB7MHhmODAwLCAweDAzfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgbHoyNGJwX3N0YXJ0XzBbXSA9IHsKKwl7MHgwMzU0LCAweDAwfSwgezB4MDNmYSwgMHgwMH0sIHsweGY4MDAsIDB4MDJ9LCB7MHhmODAxLCAweGJlfSwKKwl7MHhmODAyLCAweGM2fSwgezB4ZjgwNCwgMHgwMH0sIHsweGY4MDgsIDB4MDB9LCB7MHhmODA5LCAweDA2fSwKKwl7MHhmODBhLCAweDAxfSwgezB4ZjgwYiwgMHhmZX0sIHsweGY4MDcsIDB4ODR9LCB7MHhmODBjLCAweDAyfSwKKwl7MHhmODBkLCAweGY3fSwgezB4ZjgwZSwgMHgwM30sIHsweGY4MGYsIDB4MGJ9LCB7MHhmODFjLCAweDAwfSwKKwl7MHhmODFkLCAweDQ5fSwgezB4ZjgxZSwgMHgwM30sIHsweGY4MWYsIDB4MGJ9LCB7MHhmODNhLCAweDAwfSwKKwl7MHhmODNiLCAweDAxfSwgezB4ZjgzYywgMHgwMH0sIHsweGY4M2QsIDB4NmJ9LCB7MHhmODEwLCAweDAzfSwKKwl7MHhmODExLCAweDEwfSwgezB4ZjgxMiwgMHgwMn0sIHsweGY4MTMsIDB4NmZ9LCB7MHhmODAzLCAweDAwfSwKKwl7MHhmODE0LCAweDAwfSwgezB4ZjgxNSwgMHg0NH0sIHsweGY4MTYsIDB4MDB9LCB7MHhmODE3LCAweDQ4fSwKKwl7MHhmODE4LCAweDAwfSwgezB4ZjgxOSwgMHgyNX0sIHsweGY4MWEsIDB4MDB9LCB7MHhmODFiLCAweDNjfSwKKwl7MHhmODJmLCAweDAzfSwgezB4ZjgyMCwgMHhmZn0sIHsweGY4MjEsIDB4MGR9LCB7MHhmODIyLCAweGZmfSwKKwl7MHhmODIzLCAweDA3fSwgezB4ZjgyNCwgMHhmZH0sIHsweGY4MjUsIDB4MDd9LCB7MHhmODI2LCAweGYwfSwKKwl7MHhmODI3LCAweDBjfSwgezB4ZjgyOCwgMHhmZn0sIHsweGY4MjksIDB4MDN9LCB7MHhmODJhLCAweGZmfSwKKwl7MHhmODJiLCAweDBjfSwgezB4ZjgyYywgMHhmY30sIHsweGY4MmQsIDB4MDF9LCB7MHhmODJlLCAweDAwfSwKKwl7MHhmODMwLCAweDAwfSwgezB4ZjgzMSwgMHg0N30sIHsweGY4MzIsIDB4MDB9LCB7MHhmODMzLCAweDAwfSwKKwl7MHhmODUwLCAweDAwfSwgezB4Zjg1MSwgMHgwMH0sIHsweGY4NTIsIDB4MDB9LCB7MHhmODUzLCAweDI0fSwKKwl7MHhmODU0LCAweDAwfSwgezB4Zjg1NSwgMHgwY30sIHsweGY4NTYsIDB4MDB9LCB7MHhmODU3LCAweDMwfSwKKwl7MHhmODU4LCAweDAwfSwgezB4Zjg1OSwgMHgxOH0sIHsweGY4NWEsIDB4MDB9LCB7MHhmODViLCAweDNjfSwKKwl7MHhmODVjLCAweDAwfSwgezB4Zjg1ZCwgMHgxOH0sIHsweGY4NWUsIDB4MDB9LCB7MHhmODVmLCAweDNjfSwKKwl7MHhmODYwLCAweGZmfSwgezB4Zjg2MSwgMHgzN30sIHsweGY4NjIsIDB4ZmZ9LCB7MHhmODYzLCAweDFkfSwKKwl7MHhmODY0LCAweGZmfSwgezB4Zjg2NSwgMHg5OH0sIHsweGY4NjYsIDB4ZmZ9LCB7MHhmODY3LCAweGMwfSwKKwl7MHhmODY4LCAweDAwfSwgezB4Zjg2OSwgMHgzN30sIHsweGY4NmMsIDB4MDJ9LCB7MHhmODZkLCAweDFkfSwKKwl7MHhmODZhLCAweDAwfSwgezB4Zjg2YiwgMHgzN30sIHsweGY4NmUsIDB4MDJ9LCB7MHhmODZmLCAweDFkfSwKKwl7MHhmODcwLCAweDAxfSwgezB4Zjg3MSwgMHhjNn0sIHsweGY4NzIsIDB4MDJ9LCB7MHhmODczLCAweDA0fSwKKwl7MHhmODc0LCAweDAxfSwgezB4Zjg3NSwgMHhjNn0sIHsweGY4NzYsIDB4MDJ9LCB7MHhmODc3LCAweDA0fSwKKwl7MHhmODc4LCAweDBmfSwgezB4Zjg3OSwgMHgwZn0sIHsweGY4N2EsIDB4ZmZ9LCB7MHhmODdiLCAweGZmfSwKKwl7MHhmODAwLCAweDAzfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWNidXNfd3JpdGVfY21kIGx6MjRicF9zdGFydF8xX2dlbltdID0geworCXsweGY1ZjAsIDB4MDB9LCB7MHhmNWYxLCAweGZmfSwgezB4ZjVmMiwgMHg4MH0sIHsweGY1ZjMsIDB4ODB9LAorCXsweGY1ZjQsIDB4YjN9LAorCXsweGY1ZjAsIDB4NDB9LCB7MHhmNWYxLCAweGZmfSwgezB4ZjVmMiwgMHg4MH0sIHsweGY1ZjMsIDB4ODB9LAorCXsweGY1ZjQsIDB4YjN9LAorCXsweGY1ZmEsIDB4MDB9LCB7MHhmNWY2LCAweDAwfSwgezB4ZjVmNywgMHgwMH0sIHsweGY1ZjgsIDB4MDB9LAorCXsweGY1ZjksIDB4MDB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVjYnVzX3dyaXRlX2NtZCBsejI0YnBfc3RhcnRfMV9jbG1bXSA9IHsKKwl7MHhmNWYwLCAweDAwfSwgezB4ZjVmMSwgMHhmZn0sIHsweGY1ZjIsIDB4ODh9LCB7MHhmNWYzLCAweDg4fSwKKwl7MHhmNWY0LCAweGMwfSwKKwl7MHhmNWYwLCAweDQwfSwgezB4ZjVmMSwgMHhmZn0sIHsweGY1ZjIsIDB4ODh9LCB7MHhmNWYzLCAweDg4fSwKKwl7MHhmNWY0LCAweGMwfSwKKwl7MHhmNWZhLCAweDAwfSwgezB4ZjVmNiwgMHgwMH0sIHsweGY1ZjcsIDB4MDB9LCB7MHhmNWY4LCAweDAwfSwKKwl7MHhmNWY5LCAweDAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgbHoyNGJwX3N0YXJ0XzJbXSA9IHsKKwl7MHhmODAwLCAweDAyfSwgezB4ZjgwNywgMHhmZn0sIHsweGY4MDUsIDB4ODB9LCB7MHhmODA2LCAweDAwfSwKKwl7MHhmODA3LCAweDdmfSwgezB4ZjgwMCwgMHgwM30sCisJezB4ZjgwMCwgMHgwMn0sIHsweGY4MDcsIDB4ZmZ9LCB7MHhmODA1LCAweDRlfSwgezB4ZjgwNiwgMHgwMH0sCisJezB4ZjgwNywgMHg3Zn0sIHsweGY4MDAsIDB4MDN9LAorCXsweGY4MDAsIDB4MDJ9LCB7MHhmODA3LCAweGZmfSwgezB4ZjgwNSwgMHhjMH0sIHsweGY4MDYsIDB4NDh9LAorCXsweGY4MDcsIDB4N2Z9LCB7MHhmODAwLCAweDAzfSwKKwl7MHhmODAwLCAweDAyfSwgezB4ZjgwNywgMHhmZn0sIHsweGY4MDUsIDB4MDB9LCB7MHhmODA2LCAweDAwfSwKKwl7MHhmODA3LCAweDdmfSwgezB4ZjgwMCwgMHgwM30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWNidXNfd3JpdGVfY21kIG1pMDM2MF9zdGFydF8wW10gPSB7CisJezB4MDM1NCwgMHgwMH0sIHsweDAzZmEsIDB4MDB9LCB7MHhmMzMyLCAweGNjfSwgezB4ZjMzMywgMHhjY30sCisJezB4ZjMzNCwgMHhjY30sIHsweGYzMzUsIDB4Y2N9LCB7MHhmMzNmLCAweDAwfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX3dyaXRlX2NtZCBtaTAzNjBfaW5pdF8yM1tdID0geworCXsweDMwLCAweDAwNDB9LAkJLyogcmVzZXJ2ZWQgLSBkZWYgMHgwMDA1ICovCisJezB4MzEsIDB4MDAwMH0sCQkvKiByZXNlcnZlZCAtIGRlZiAweDAwMmEgKi8KKwl7MHgzNCwgMHgwMTAwfSwJCS8qIHJlc2VydmVkIC0gZGVmIDB4MDEwMCAqLworCXsweDNkLCAweDA2OGZ9LAkJLyogcmVzZXJ2ZWQgLSBkZWYgMHgwNjhmICovCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfd3JpdGVfY21kIG1pMDM2MF9pbml0XzI0W10gPSB7CisJezB4MDMsIDB4MDFlNX0sCQkvKiB3aW5kb3cgaGVpZ2h0ICovCisJezB4MDQsIDB4MDI4NX0sCQkvKiB3aW5kb3cgd2lkdGggKi8KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY193cml0ZV9jbWQgbWkwMzYwX2luaXRfMjVbXSA9IHsKKwl7MHgzNSwgMHgwMDIwfSwJCS8qIGdsb2JhbCBnYWluICovCisJezB4MmIsIDB4MDAyMH0sCQkvKiBncmVlbjEgZ2FpbiAqLworCXsweDJjLCAweDAwMmF9LAkJLyogYmx1ZSBnYWluICovCisJezB4MmQsIDB4MDAyOH0sCQkvKiByZWQgZ2FpbiAqLworCXsweDJlLCAweDAwMjB9LAkJLyogZ3JlZW4yIGdhaW4gKi8KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVjYnVzX3dyaXRlX2NtZCBtaTAzNjBfc3RhcnRfMVtdID0geworCXsweGY1ZjAsIDB4MTF9LCB7MHhmNWYxLCAweDk5fSwgezB4ZjVmMiwgMHg4MH0sIHsweGY1ZjMsIDB4ODB9LAorCXsweGY1ZjQsIDB4YTZ9LAorCXsweGY1ZjAsIDB4NTF9LCB7MHhmNWYxLCAweDk5fSwgezB4ZjVmMiwgMHg4MH0sIHsweGY1ZjMsIDB4ODB9LAorCXsweGY1ZjQsIDB4YTZ9LAorCXsweGY1ZmEsIDB4MDB9LCB7MHhmNWY2LCAweDAwfSwgezB4ZjVmNywgMHgwMH0sIHsweGY1ZjgsIDB4MDB9LAorCXsweGY1ZjksIDB4MDB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfd3JpdGVfY21kIG1pMDM2MF9zdGFydF8yW10gPSB7CisJezB4NjIsIDB4MDQxZH0sCQkvKiByZXNlcnZlZCAtIGRlZiAweDA0MTggKi8KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY193cml0ZV9jbWQgbWkwMzYwX3N0YXJ0XzNbXSA9IHsKKwl7MHgwNSwgMHgwMDdifSwJCS8qIGhvcml6IGJsYW5raW5nICovCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfd3JpdGVfY21kIG1pMDM2MF9zdGFydF80W10gPSB7CisJezB4MDUsIDB4MDNmNX0sCQkvKiBob3JpeiBibGFua2luZyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfd3JpdGVfY21kIG10OXYxMTFfaW5pdF8wW10gPSB7CisJezB4MDEsIDB4MDAwMX0sCQkvKiBzZWxlY3QgSUZQL1NPQyByZWdpc3RlcnMgKi8KKwl7MHgwNiwgMHgzMDBjfSwJCS8qIG9wZXJhdGluZyBtb2RlIGNvbnRyb2wgKi8KKwl7MHgwOCwgMHhjYzAwfSwJCS8qIG91dHB1dCBmb3JtYXQgY29udHJvbCAoUkdCKSAqLworCXsweDAxLCAweDAwMDR9LAkJLyogc2VsZWN0IGNvcmUgcmVnaXN0ZXJzICovCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfd3JpdGVfY21kIG10OXYxMTFfaW5pdF8xW10gPSB7CisJezB4MDMsIDB4MDFlNX0sCQkvKiB3aW5kb3cgaGVpZ2h0ICovCisJezB4MDQsIDB4MDI4NX0sCQkvKiB3aW5kb3cgd2lkdGggKi8KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY193cml0ZV9jbWQgbXQ5djExMV9pbml0XzJbXSA9IHsKKwl7MHgzMCwgMHg3ODAwfSwKKwl7MHgzMSwgMHgwMDAwfSwKKwl7MHgwNywgMHgzMDAyfSwJCS8qIG91dHB1dCBjb250cm9sICovCisJezB4MzUsIDB4MDAyMH0sCQkvKiBnbG9iYWwgZ2FpbiAqLworCXsweDJiLCAweDAwMjB9LAkJLyogZ3JlZW4xIGdhaW4gKi8KKwl7MHgyYywgMHgwMDIwfSwJCS8qIGJsdWUgZ2FpbiAqLworCXsweDJkLCAweDAwMjB9LAkJLyogcmVkIGdhaW4gKi8KKwl7MHgyZSwgMHgwMDIwfSwJCS8qIGdyZWVuMiBnYWluICovCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgbXQ5djExMV9zdGFydF8xW10gPSB7CisJezB4ZjVmMCwgMHgxMX0sIHsweGY1ZjEsIDB4OTZ9LCB7MHhmNWYyLCAweDgwfSwgezB4ZjVmMywgMHg4MH0sCisJezB4ZjVmNCwgMHhhYX0sCisJezB4ZjVmMCwgMHg1MX0sIHsweGY1ZjEsIDB4OTZ9LCB7MHhmNWYyLCAweDgwfSwgezB4ZjVmMywgMHg4MH0sCisJezB4ZjVmNCwgMHhhYX0sCisJezB4ZjVmYSwgMHgwMH0sIHsweGY1ZjYsIDB4MGF9LCB7MHhmNWY3LCAweDBhfSwgezB4ZjVmOCwgMHgwYX0sCisJezB4ZjVmOSwgMHgwYX0KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY193cml0ZV9jbWQgbXQ5djExMV9pbml0XzNbXSA9IHsKKwl7MHg2MiwgMHgwNDA1fSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY193cml0ZV9jbWQgbXQ5djExMV9pbml0XzRbXSA9IHsKKwl7MHgwNSwgMHgwMGNlfSwJCS8qIGhvcml6b250YWwgYmxhbmtpbmcgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWNidXNfd3JpdGVfY21kIG92NzY2MF9zdGFydF8wW10gPSB7CisJezB4MDM1NCwgMHgwMH0sIHsweDAzZmEsIDB4MDB9LCB7MHhmMzMyLCAweDAwfSwgezB4ZjMzMywgMHhjMH0sCisJezB4ZjMzNCwgMHgzOX0sIHsweGYzMzUsIDB4ZTd9LCB7MHhmMzNmLCAweDAzfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgb3Y5NjMwX3N0YXJ0XzBbXSA9IHsKKwl7MHgwMzU0LCAweDAwfSwgezB4MDNmYSwgMHgwMH0sIHsweGYzMzIsIDB4MDB9LCB7MHhmMzMzLCAweDAwfSwKKwl7MHhmMzM0LCAweDNlfSwgezB4ZjMzNSwgMHhmOH0sIHsweGYzM2YsIDB4MDN9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNhcF9zIHsKKwl1OAljY19zaXplaWQ7CisJdTgJY2NfYnl0ZXNbMzJdOworfSBjYXBjb25maWdbNF1bM10gPSB7CisJW1NFTlNPUl9JQ1gwOThCUV0gPSB7CisJCXswLAkJCQkvKiBKUEVHLCAxNjB4MTIwICovCisJCSAgezB4MDEsIDB4MWYsIDB4MjAsIDB4MGUsIDB4MDAsIDB4OWYsIDB4MDIsIDB4ZWUsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDIsIDB4OGIsIDB4MDAsIDB4OGIsIDB4MDAsIDB4NDEsIDB4MDEsIDB4NDEsCisJCSAgIDB4MDEsIDB4NDEsIDB4MDEsIDB4MDUsIDB4NDAsIDB4MDEsIDB4ZjAsIDB4MDB9IH0sCisJCXsyLAkJCQkvKiBKUEVHLCAzMjB4MjQwICovCisJCSAgezB4MDEsIDB4MWYsIDB4MjAsIDB4MGUsIDB4MDAsIDB4OWYsIDB4MDIsIDB4ZWUsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDIsIDB4ZGYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4M2YsIDB4MDEsIDB4M2YsCisJCSAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NDAsIDB4MDEsIDB4ZjAsIDB4MDB9IH0sCisJCXs0LAkJCQkvKiBKUEVHLCA2NDB4NDgwICovCisJCSAgezB4MDEsIDB4MjIsIDB4MjAsIDB4MGUsIDB4MDAsIDB4YTIsIDB4MDIsIDB4ZjAsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDcsIDB4ZTEsIDB4MDEsIDB4ZTEsIDB4MDEsIDB4M2YsIDB4MDEsIDB4M2YsCisJCSAgIDB4MDEsIDB4M2YsIDB4MDEsIDB4MDUsIDB4ODAsIDB4MDIsIDB4ZTAsIDB4MDF9IH0sCisJfSwKKwlbU0VOU09SX0xaMjRCUF0gPSB7CisJCXswLAkJCQkvKiBKUEVHLCAxNjB4MTIwICovCisJCSAgezB4MDEsIDB4MWYsIDB4MjAsIDB4MGUsIDB4MDAsIDB4OWYsIDB4MDIsIDB4ZWUsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDIsIDB4OGIsIDB4MDAsIDB4OGIsIDB4MDAsIDB4NDEsIDB4MDEsIDB4NDEsCisJCSAgIDB4MDEsIDB4NDEsIDB4MDEsIDB4MDUsIDB4NDAsIDB4MDEsIDB4ZjAsIDB4MDB9IH0sCisJCXsyLAkJCQkvKiBKUEVHLCAzMjB4MjQwICovCisJCSAgezB4MDEsIDB4MjIsIDB4MjAsIDB4MGUsIDB4MDAsIDB4YTIsIDB4MDIsIDB4ZWUsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDIsIDB4ZGYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4M2YsIDB4MDEsIDB4M2YsCisJCSAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NDAsIDB4MDEsIDB4ZjAsIDB4MDB9IH0sCisJCXs0LAkJCQkvKiBKUEVHLCA2NDB4NDgwICovCisJCSAgezB4MDEsIDB4MjIsIDB4MjAsIDB4MGUsIDB4MDAsIDB4YTIsIDB4MDIsIDB4ZjAsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDcsIDB4ZTEsIDB4MDEsIDB4ZTEsIDB4MDEsIDB4M2YsIDB4MDEsIDB4M2YsCisJCSAgIDB4MDEsIDB4M2YsIDB4MDEsIDB4MDUsIDB4ODAsIDB4MDIsIDB4ZTAsIDB4MDF9IH0sCisJfSwKKwlbU0VOU09SX01JMDM2MF0gPSB7CisJCXswLAkJCQkvKiBKUEVHLCAxNjB4MTIwICovCisJCSAgezB4MDUsIDB4M2QsIDB4MjAsIDB4MGIsIDB4MDAsIDB4YmQsIDB4MDIsIDB4MGIsCisJCSAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4OWYsIDB4MDAsIDB4OWYsCisJCSAgIDB4MDAsIDB4OWYsIDB4MDEsIDB4MDUsIDB4YTAsIDB4MDAsIDB4ODAsIDB4MDB9IH0sCisJCXsyLAkJCQkvKiBKUEVHLCAzMjB4MjQwICovCisJCSAgezB4MDEsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjAsIDB4ODIsIDB4MDIsIDB4ZTEsCisvKmZpeG1lCQkJCSAgICAgICAwMwkJICAgICAgIGUzICovCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDIsIDB4ZGYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4M2YsIDB4MDEsIDB4M2YsCisJCSAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NDAsIDB4MDEsIDB4ZjAsIDB4MDB9IH0sCisJCXs0LAkJCQkvKiBKUEVHLCA2NDB4NDgwICovCisJCSAgezB4MDEsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjAsIDB4ODIsIDB4MDIsIDB4ZTMsCisJCSAgIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MTgsIDB4MTIsIDB4NzgsIDB4YzgsCisJCSAgIDB4MDcsIDB4ZTEsIDB4MDEsIDB4ZTEsIDB4MDEsIDB4M2YsIDB4MDEsIDB4M2YsCisJCSAgIDB4MDEsIDB4M2YsIDB4MDEsIDB4MDUsIDB4ODAsIDB4MDIsIDB4ZTAsIDB4MDF9IH0sCisJfSwKKwlbU0VOU09SX01UOVYxMTFdID0geworCQl7MCwJCQkJLyogSlBFRywgMTYweDEyMCAqLworCQkgIHsweDA1LCAweDNkLCAweDIwLCAweDBiLCAweDAwLCAweGJkLCAweDAyLCAweDBiLAorCQkgICAweDAyLCAweDAyLCAweDAwLCAweDA4LCAweDE4LCAweDEyLCAweDc4LCAweGM4LAorCQkgICAweDAyLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDlmLCAweDAwLCAweDlmLAorCQkgICAweDAwLCAweDlmLCAweDAxLCAweDA1LCAweGEwLCAweDAwLCAweDgwLCAweDAwfSB9LAorCQl7MiwJCQkJLyogSlBFRywgMzIweDI0MCAqLworCQkgIHsweDAxLCAweDAyLCAweDIwLCAweDAzLCAweDIwLCAweDgyLCAweDAyLCAweGUzLAorCQkgICAweDAxLCAweDAyLCAweDAwLCAweDA4LCAweDE4LCAweDEyLCAweDc4LCAweGM4LAorCQkgICAweDAyLCAweGRmLCAweDAxLCAweDAwLCAweDAwLCAweDNmLCAweDAxLCAweDNmLAorCQkgICAweDAxLCAweDAwLCAweDAwLCAweDA1LCAweDQwLCAweDAxLCAweGYwLCAweDAwfSB9LAorCQl7NCwJCQkJLyogSlBFRywgNjQweDQ4MCAqLworCQkgIHsweDAxLCAweDAyLCAweDIwLCAweDAzLCAweDIwLCAweDgyLCAweDAyLCAweGUzLAorCQkgICAweDAxLCAweDAyLCAweDAwLCAweDA4LCAweDE4LCAweDEyLCAweDc4LCAweGM4LAorCQkgICAweDA3LCAweGUxLCAweDAxLCAweGUxLCAweDAxLCAweDNmLCAweDAxLCAweDNmLAorCQkgICAweDAxLCAweDNmLCAweDAxLCAweDA1LCAweDgwLCAweDAyLCAweGUwLCAweDAxfSB9LAorCX0sCit9OworCitzdHJ1Y3Qgc2Vuc29yX3MgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggaTJjX2FkZHI7CisJdTggaTJjX2R1bTsKKwl1OCBncGlvWzVdOworCXU4IGNtZF9sZW47CisJY29uc3Qgc3RydWN0IHVjYnVzX3dyaXRlX2NtZCAqY21kOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZW5zb3JfcyBzZW5zb3JfdGJbXSA9IHsKKwlbU0VOU09SX0lDWDA5OEJRXSA9IHsKKwkJImljeDA5OGJwIiwKKwkJMHgwMCwgMHgwMCwKKwkJezAsCisJCSBTUTkzMF9HUElPX0RGTF9JMkNfU0RBIHwgU1E5MzBfR1BJT19ERkxfSTJDX1NDTCwKKwkJIFNROTMwX0dQSU9fREZMX0kyQ19TREEsCisJCSAwLAorCQkgU1E5MzBfR1BJT19SU1RCQVIKKwkJfSwKKwkJOCwgaWN4MDk4YnFfc3RhcnRfMAorCSAgICB9LAorCVtTRU5TT1JfTFoyNEJQXSA9IHsKKwkJImx6MjRicCIsCisJCTB4MDAsIDB4MDAsCisJCXswLAorCQkgU1E5MzBfR1BJT19ERkxfSTJDX1NEQSB8IFNROTMwX0dQSU9fREZMX0kyQ19TQ0wsCisJCSBTUTkzMF9HUElPX0RGTF9JMkNfU0RBLAorCQkgMCwKKwkJIFNROTMwX0dQSU9fUlNUQkFSCisJCX0sCisJCTgsIGx6MjRicF9zdGFydF8wCisJICAgIH0sCisJW1NFTlNPUl9NSTAzNjBdID0geworCQkibWkwMzYwIiwKKwkJMHg1ZCwgMHg4MCwKKwkJe1NROTMwX0dQSU9fUlNUQkFSLAorCQkgU1E5MzBfR1BJT19ERkxfSTJDX1NEQSB8IFNROTMwX0dQSU9fREZMX0kyQ19TQ0wsCisJCSBTUTkzMF9HUElPX0RGTF9JMkNfU0RBLAorCQkgMCwKKwkJIDAKKwkJfSwKKwkJNywgbWkwMzYwX3N0YXJ0XzAKKwkgICAgfSwKKwlbU0VOU09SX01UOVYxMTFdID0geworCQkibXQ5djExMSIsCisJCTB4NWMsIDB4N2YsCisJCXtTUTkzMF9HUElPX1JTVEJBUiwKKwkJIFNROTMwX0dQSU9fREZMX0kyQ19TREEgfCBTUTkzMF9HUElPX0RGTF9JMkNfU0NMLAorCQkgU1E5MzBfR1BJT19ERkxfSTJDX1NEQSwKKwkJIDAsCisJCSAwCisJCX0sCisJCTcsIG1pMDM2MF9zdGFydF8wCisJICAgIH0sCisJW1NFTlNPUl9PVjc2NjBdID0geworCQkib3Y3NjYwIiwKKwkJMHgyMSwgMHgwMCwKKwkJezAsCisJCSBTUTkzMF9HUElPX0RGTF9JMkNfU0RBIHwgU1E5MzBfR1BJT19ERkxfSTJDX1NDTCwKKwkJIFNROTMwX0dQSU9fREZMX0kyQ19TREEsCisJCSAwLAorCQkgU1E5MzBfR1BJT19SU1RCQVIKKwkJfSwKKwkJNywgb3Y3NjYwX3N0YXJ0XzAKKwkgICAgfSwKKwlbU0VOU09SX09WOTYzMF0gPSB7CisJCSJvdjk2MzAiLAorCQkweDMwLCAweDAwLAorCQl7MCwKKwkJIFNROTMwX0dQSU9fREZMX0kyQ19TREEgfCBTUTkzMF9HUElPX0RGTF9JMkNfU0NMLAorCQkgU1E5MzBfR1BJT19ERkxfSTJDX1NEQSwKKwkJIDAsCisJCSBTUTkzMF9HUElPX1JTVEJBUgorCQl9LAorCQk3LCBvdjk2MzBfc3RhcnRfMAorCSAgICB9LAorfTsKKworc3RhdGljIHZvaWQgcmVnX3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQl1MTYgdmFsdWUsIGludCBsZW4pCit7CisJaW50IHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJdXNiX3JjdmN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKKwkJCTB4MGMsCisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXZhbHVlLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKKwkJCTUwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAicmVnX3IgJTA0eCBmYWlsZWQgJWQiLCB2YWx1ZSwgcmV0KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVnX3coc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybjsKKwlQREVCVUcoRF9VU0JPLCAicmVnX3cgdjogJTA0eCBpOiAlMDR4IiwgdmFsdWUsIGluZGV4KTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJMHgwYywJCQkvKiByZXF1ZXN0ICovCisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsCisJCQk1MDApOworCW1zbGVlcCgzMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAicmVnX3cgJTA0eCAlMDR4IGZhaWxlZCAlZCIsIHZhbHVlLCBpbmRleCwgcmV0KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVnX3diKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCisJCWNvbnN0IHU4ICpkYXRhLCBpbnQgbGVuKQoreworCWludCByZXQ7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCVBERUJVRyhEX1VTQk8sICJyZWdfd2IgdjogJTA0eCBpOiAlMDR4ICUwMnguLi4lMDJ4IiwKKwkJCXZhbHVlLCBpbmRleCwgKmRhdGEsIGRhdGFbbGVuIC0gMV0pOworCW1lbWNweShnc3BjYV9kZXYtPnVzYl9idWYsIGRhdGEsIGxlbik7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKKwkJCTB4MGMsCQkJLyogcmVxdWVzdCAqLworCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJdmFsdWUsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKKwkJCTEwMDApOworCW1zbGVlcCgzMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAicmVnX3diICUwNHggJTA0eCBmYWlsZWQgJWQiLCB2YWx1ZSwgaW5kZXgsIHJldCk7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGkyY193cml0ZShzdHJ1Y3Qgc2QgKnNkLAorCQkJY29uc3Qgc3RydWN0IGkyY193cml0ZV9jbWQgKmNtZCwKKwkJCWludCBuY21kcykKK3sKKwlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSAmc2QtPmdzcGNhX2RldjsKKwljb25zdCBzdHJ1Y3Qgc2Vuc29yX3MgKnNlbnNvcjsKKwl1MTYgdmFsLCBpZHg7CisJdTggKmJ1ZjsKKwlpbnQgcmV0OworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybjsKKworCXNlbnNvciA9ICZzZW5zb3JfdGJbc2QtPnNlbnNvcl07CisKKwl2YWwgPSAoc2Vuc29yLT5pMmNfYWRkciA8PCA4KSB8IFNROTMwX0NUUkxfSTJDX0lPOworCWlkeCA9IChjbWQtPnZhbCAmIDB4ZmYwMCkgfCBjbWQtPnJlZzsKKworCWJ1ZiA9IGdzcGNhX2Rldi0+dXNiX2J1ZjsKKwkqYnVmKysgPSBzZW5zb3ItPmkyY19kdW07CisJKmJ1ZisrID0gY21kLT52YWw7CisKKwl3aGlsZSAoLS1uY21kcyA+IDApIHsKKwkJY21kKys7CisJCSpidWYrKyA9IGNtZC0+cmVnOworCQkqYnVmKysgPSBjbWQtPnZhbCA+PiA4OworCQkqYnVmKysgPSBzZW5zb3ItPmkyY19kdW07CisJCSpidWYrKyA9IGNtZC0+dmFsOworCX0KKworCVBERUJVRyhEX1VTQk8sICJpMmNfdyB2OiAlMDR4IGk6ICUwNHggJTAyeC4uLiUwMngiLAorCQkJdmFsLCBpZHgsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSwgYnVmWy0xXSk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKKwkJCTB4MGMsCQkJLyogcmVxdWVzdCAqLworCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJdmFsLCBpZHgsCisJCQlnc3BjYV9kZXYtPnVzYl9idWYsIGJ1ZiAtIGdzcGNhX2Rldi0+dXNiX2J1ZiwKKwkJCTUwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAiaTJjX3dyaXRlIGZhaWxlZCAlZCIsIHJldCk7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVjYnVzX3dyaXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgKmNtZCwKKwkJCWludCBuY21kcywKKwkJCWludCBiYXRjaHNpemUpCit7CisJdTggKmJ1ZjsKKwl1MTYgdmFsLCBpZHg7CisJaW50IGxlbiwgcmV0OworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybjsKKworI2lmZGVmIEdTUENBX0RFQlVHCisJaWYgKChiYXRjaHNpemUgLSAxKSAqIDMgPiBVU0JfQlVGX1NaKSB7CisJCWVycigiQnVnOiB1c2JfYnVmIG92ZXJmbG93Iik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FTk9NRU07CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCWZvciAoOzspIHsKKwkJbGVuID0gbmNtZHM7CisJCWlmIChsZW4gPiBiYXRjaHNpemUpCisJCQlsZW4gPSBiYXRjaHNpemU7CisJCW5jbWRzIC09IGxlbjsKKworCQl2YWwgPSAoY21kLT5id19hZGRyIDw8IDgpIHwgU1E5MzBfQ1RSTF9VQ0JVU19JTzsKKwkJaWR4ID0gKGNtZC0+YndfZGF0YSA8PCA4KSB8IChjbWQtPmJ3X2FkZHIgPj4gOCk7CisKKwkJYnVmID0gZ3NwY2FfZGV2LT51c2JfYnVmOworCQl3aGlsZSAoLS1sZW4gPiAwKSB7CisJCQljbWQrKzsKKwkJCSpidWYrKyA9IGNtZC0+YndfYWRkcjsKKwkJCSpidWYrKyA9IGNtZC0+YndfYWRkciA+PiA4OworCQkJKmJ1ZisrID0gY21kLT5id19kYXRhOworCQl9CisJCWlmIChidWYgIT0gZ3NwY2FfZGV2LT51c2JfYnVmKQorCQkJUERFQlVHKERfVVNCTywgInVjYnVzIHY6ICUwNHggaTogJTA0eCAlMDJ4Li4uJTAyeCIsCisJCQkJCXZhbCwgaWR4LAorCQkJCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0sIGJ1ZlstMV0pOworCQllbHNlCisJCQlQREVCVUcoRF9VU0JPLCAidWNidXMgdjogJTA0eCBpOiAlMDR4IiwKKwkJCQkJdmFsLCBpZHgpOworCQlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkJdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKKwkJCQkweDBjLAkJCS8qIHJlcXVlc3QgKi8KKwkJCSAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCQl2YWwsIGlkeCwKKwkJCQlnc3BjYV9kZXYtPnVzYl9idWYsIGJ1ZiAtIGdzcGNhX2Rldi0+dXNiX2J1ZiwKKwkJCQk1MDApOworCQlpZiAocmV0IDwgMCkgeworCQkJUERFQlVHKERfRVJSLCAidWNidXNfd3JpdGUgZmFpbGVkICVkIiwgcmV0KTsKKwkJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwkJCXJldHVybjsKKwkJfQorCQltc2xlZXAoMzApOworCQlpZiAobmNtZHMgPD0gMCkKKwkJCWJyZWFrOworCQljbWQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9fc2V0KHN0cnVjdCBzZCAqc2QsIHUxNiB2YWwsIHUxNiBtYXNrKQoreworCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9ICZzZC0+Z3NwY2FfZGV2OworCisJaWYgKG1hc2sgJiAweDAwZmYpIHsKKwkJc2QtPmdwaW9bMF0gJj0gfm1hc2s7CisJCXNkLT5ncGlvWzBdIHw9IHZhbDsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAxMDAgfCBTUTkzMF9DVFJMX0dQSU8sCisJCQl+c2QtPmdwaW9bMF0gPDwgOCk7CisJfQorCW1hc2sgPj49IDg7CisJdmFsID4+PSA4OworCWlmIChtYXNrKSB7CisJCXNkLT5ncGlvWzFdICY9IH5tYXNrOworCQlzZC0+Z3Bpb1sxXSB8PSB2YWw7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwMzAwIHwgU1E5MzBfQ1RSTF9HUElPLAorCQkJfnNkLT5ncGlvWzFdIDw8IDgpOworCX0KK30KKworc3RhdGljIHZvaWQgZ3Bpb19pbml0KHN0cnVjdCBzZCAqc2QsCisJCQljb25zdCB1OCAqZ3BpbykKK3sKKwlncGlvX3NldChzZCwgKmdwaW8rKywgMHgwMDBmKTsKKwlncGlvX3NldChzZCwgKmdwaW8rKywgMHgwMDBmKTsKKwlncGlvX3NldChzZCwgKmdwaW8rKywgMHgwMDBmKTsKKwlncGlvX3NldChzZCwgKmdwaW8rKywgMHgwMDBmKTsKKwlncGlvX3NldChzZCwgKmdwaW8sIDB4MDAwZik7Cit9CisKK3N0YXRpYyB2b2lkIGJyaWRnZV9pbml0KHN0cnVjdCBzZCAqc2QpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB1Y2J1c193cml0ZV9jbWQgY2xrZnJlcV9jbWQgPSB7CisJCQkJMHhmMDMxLCAwCS8qIFNROTMwX0NMS0ZSRVFfNjBNSFogKi8KKwl9OworCisJdWNidXNfd3JpdGUoJnNkLT5nc3BjYV9kZXYsICZjbGtmcmVxX2NtZCwgMSwgMSk7CisKKwlncGlvX3NldChzZCwgU1E5MzBfR1BJT19QT1dFUiwgMHhmZjAwKTsKK30KKworc3RhdGljIHZvaWQgY21vc19wcm9iZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBpOworCWNvbnN0IHN0cnVjdCBzZW5zb3JfcyAqc2Vuc29yOworCXN0YXRpYyBjb25zdCB1OCBwcm9iZV9vcmRlcltdID0geworLyoJCVNFTlNPUl9MWjI0QlAsCQkodGVzdGVkIGFzIGNjZCkgKi8KKwkJU0VOU09SX09WOTYzMCwKKwkJU0VOU09SX01JMDM2MCwKKwkJU0VOU09SX09WNzY2MCwKKwkJU0VOU09SX01UOVYxMTEsCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb2JlX29yZGVyKTsgaSsrKSB7CisJCXNlbnNvciA9ICZzZW5zb3JfdGJbcHJvYmVfb3JkZXJbaV1dOworCQl1Y2J1c193cml0ZSgmc2QtPmdzcGNhX2Rldiwgc2Vuc29yLT5jbWQsIHNlbnNvci0+Y21kX2xlbiwgOCk7CisJCWdwaW9faW5pdChzZCwgc2Vuc29yLT5ncGlvKTsKKwkJbXNsZWVwKDEwMCk7CisJCXJlZ19yKGdzcGNhX2RldiwgKHNlbnNvci0+aTJjX2FkZHIgPDwgOCkgfCAweDAwMWMsIDEpOworCQltc2xlZXAoMTAwKTsKKwkJaWYgKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAhPSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IEFSUkFZX1NJWkUocHJvYmVfb3JkZXIpKQorCQlQREVCVUcoRF9QUk9CRSwgIlVua25vd24gc2Vuc29yIik7CisJZWxzZQorCQlzZC0+c2Vuc29yID0gcHJvYmVfb3JkZXJbaV07Cit9CisKK3N0YXRpYyB2b2lkIG10OXYxMTFfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJaW50IGksIG53YWl0OworCXN0YXRpYyBjb25zdCB1OCBjbWRfMDAxYltdID0geworCQkweDAwLCAweDNiLCAweGY2LCAweDAxLCAweDAzLCAweDAyLCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDAwCisJfTsKKwlzdGF0aWMgY29uc3QgdTggY21kXzAxMWJbXVs3XSA9IHsKKwkJezB4MTAsIDB4MDEsIDB4NjYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDB9LAorCQl7MHgwMSwgMHgwMCwgMHgxYSwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJCXsweDIwLCAweDAwLCAweDEwLCAweDA0LCAweDAwLCAweDAwLCAweDAwfSwKKwkJezB4MDIsIDB4MDEsIDB4YWUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9LAorCX07CisKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweDAwMWIsIDB4MDAwMCwgY21kXzAwMWIsIHNpemVvZiBjbWRfMDAxYik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY21kXzAxMWIpOyBpKyspIHsKKwkJcmVnX3diKGdzcGNhX2RldiwgMHgwMDFiLCAweDAwMDAsIGNtZF8wMTFiW2ldLAorCQkJCUFSUkFZX1NJWkUoY21kXzAxMWJbMF0pKTsKKwkJbXNsZWVwKDQwMCk7CisJCW53YWl0ID0gMjA7CisJCWZvciAoOzspIHsKKwkJCXJlZ19yKGdzcGNhX2RldiwgMHgwMzFiLCAxKTsKKwkJCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMAorCQkJIHx8IGdzcGNhX2Rldi0+dXNiX2VyciAhPSAwKQorCQkJCWJyZWFrOworCQkJaWYgKC0tbndhaXQgPCAwKSB7CisJCQkJUERFQlVHKERfUFJPQkUsICJtdDl2MTExX2luaXQgdGltZW91dCIpOworCQkJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FVElNRTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQltc2xlZXAoNTApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBnbG9iYWxfaW5pdChzdHJ1Y3Qgc2QgKnNkLCBpbnQgZmlyc3RfdGltZSkKK3sKKwlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKKwljYXNlIFNFTlNPUl9JQ1gwOThCUToKKwkJaWYgKGZpcnN0X3RpbWUpCisJCQl1Y2J1c193cml0ZSgmc2QtPmdzcGNhX2RldiwKKwkJCQkJaWN4MDk4YnFfc3RhcnRfMCwKKwkJCQkJOCwgOCk7CisJCWdwaW9faW5pdChzZCwgc2Vuc29yX3RiW3NkLT5zZW5zb3JdLmdwaW8pOworCQlicmVhazsKKwljYXNlIFNFTlNPUl9MWjI0QlA6CisJCWlmIChzZC0+dHlwZSAhPSBDcmVhdGl2ZV9saXZlX21vdGlvbikKKwkJCWdwaW9fc2V0KHNkLCBTUTkzMF9HUElPX0VYVFJBMSwgMHgwMGZmKTsKKwkJZWxzZQorCQkJZ3Bpb19zZXQoc2QsIDAsIDB4MDBmZik7CisJCW1zbGVlcCg1MCk7CisJCWlmIChmaXJzdF90aW1lKQorCQkJdWNidXNfd3JpdGUoJnNkLT5nc3BjYV9kZXYsCisJCQkJCWx6MjRicF9zdGFydF8wLAorCQkJCQk4LCA4KTsKKwkJZ3Bpb19pbml0KHNkLCBzZW5zb3JfdGJbc2QtPnNlbnNvcl0uZ3Bpbyk7CisJCWJyZWFrOworCWNhc2UgU0VOU09SX01JMDM2MDoKKwkJaWYgKGZpcnN0X3RpbWUpCisJCQl1Y2J1c193cml0ZSgmc2QtPmdzcGNhX2RldiwKKwkJCQkJbWkwMzYwX3N0YXJ0XzAsCisJCQkJCUFSUkFZX1NJWkUobWkwMzYwX3N0YXJ0XzApLAorCQkJCQk4KTsKKwkJZ3Bpb19pbml0KHNkLCBzZW5zb3JfdGJbc2QtPnNlbnNvcl0uZ3Bpbyk7CisJCWdwaW9fc2V0KHNkLCBTUTkzMF9HUElPX0VYVFJBMiwgU1E5MzBfR1BJT19FWFRSQTIpOworCQlicmVhazsKKwlkZWZhdWx0OgorLyoJY2FzZSBTRU5TT1JfTVQ5VjExMTogKi8KKwkJaWYgKGZpcnN0X3RpbWUpCisJCQltdDl2MTExX2luaXQoJnNkLT5nc3BjYV9kZXYpOworCQllbHNlCisJCQlncGlvX2luaXQoc2QsIHNlbnNvcl90YltzZC0+c2Vuc29yXS5ncGlvKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBsejI0YnBfcHBsKHN0cnVjdCBzZCAqc2QsIHUxNiBwcGwpCit7CisJc3RydWN0IHVjYnVzX3dyaXRlX2NtZCBjbWRzWzJdID0geworCQl7MHhmODEwLCBwcGwgPj4gOH0sCisJCXsweGY4MTEsIHBwbH0KKwl9OworCisJdWNidXNfd3JpdGUoJnNkLT5nc3BjYV9kZXYsIGNtZHMsIEFSUkFZX1NJWkUoY21kcyksIDIpOworfQorCitzdGF0aWMgdm9pZCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBpLCBpbnRlZ2Nsa3MsIGludHN0YXJ0Y2xrLCBmcmFtZWNsa3MsIG1pbl9mcmNsazsKKwljb25zdCBzdHJ1Y3Qgc2Vuc29yX3MgKnNlbnNvcjsKKwl1MTYgY21kOworCXU4IGJ1ZlsxNV07CisKKwlpbnRlZ2Nsa3MgPSBzZC0+ZXhwbzsKKwlpID0gMDsKKwljbWQgPSBTUTkzMF9DVFJMX1NFVF9FWFBPU1VSRTsKKworCXN3aXRjaCAoc2QtPnNlbnNvcikgeworCWNhc2UgU0VOU09SX0lDWDA5OEJROgkJCS8qIGNjZCAqLworCWNhc2UgU0VOU09SX0xaMjRCUDoKKwkJbWluX2ZyY2xrID0gc2QtPnNlbnNvciA9PSBTRU5TT1JfSUNYMDk4QlEgPyAweDIxMCA6IDB4MjZmOworCQlpZiAoaW50ZWdjbGtzID49IG1pbl9mcmNsaykgeworCQkJaW50c3RhcnRjbGsgPSAwOworCQkJZnJhbWVjbGtzID0gaW50ZWdjbGtzOworCQl9IGVsc2UgeworCQkJaW50c3RhcnRjbGsgPSBtaW5fZnJjbGsgLSBpbnRlZ2Nsa3M7CisJCQlmcmFtZWNsa3MgPSBtaW5fZnJjbGs7CisJCX0KKwkJYnVmW2krK10gPSBpbnRzdGFydGNsayA+PiA4OworCQlidWZbaSsrXSA9IGludHN0YXJ0Y2xrOworCQlidWZbaSsrXSA9IGZyYW1lY2xrcyA+PiA4OworCQlidWZbaSsrXSA9IGZyYW1lY2xrczsKKwkJYnVmW2krK10gPSBzZC0+Z2FpbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCQkJLyogY21vcyAqLworLyoJY2FzZSBTRU5TT1JfTUkwMzYwOiAqLworLyoJY2FzZSBTRU5TT1JfTVQ5VjExMTogKi8KKwkJY21kIHw9IDB4MDEwMDsKKwkJc2Vuc29yID0gJnNlbnNvcl90YltzZC0+c2Vuc29yXTsKKwkJYnVmW2krK10gPSBzZW5zb3ItPmkyY19hZGRyOwkvKiBpMmNfc2xhdmVfYWRkciAqLworCQlidWZbaSsrXSA9IDB4MDg7CS8qIDIgKiBuaTJjICovCisJCWJ1ZltpKytdID0gMHgwOTsJLyogcmVnID0gc2h1dHRlciB3aWR0aCAqLworCQlidWZbaSsrXSA9IGludGVnY2xrcyA+PiA4OyAvKiB2YWwgSCAqLworCQlidWZbaSsrXSA9IHNlbnNvci0+aTJjX2R1bTsKKwkJYnVmW2krK10gPSBpbnRlZ2Nsa3M7CS8qIHZhbCBMICovCisJCWJ1ZltpKytdID0gMHgzNTsJLyogcmVnID0gZ2xvYmFsIGdhaW4gKi8KKwkJYnVmW2krK10gPSAweDAwOwkvKiB2YWwgSCAqLworCQlidWZbaSsrXSA9IHNlbnNvci0+aTJjX2R1bTsKKwkJYnVmW2krK10gPSBzZC0+Z2FpbjsJLyogdmFsIEwgKi8KKwkJYnVmW2krK10gPSAweDAwOworCQlidWZbaSsrXSA9IDB4MDA7CisJCWJ1ZltpKytdID0gMHgwMDsKKwkJYnVmW2krK10gPSAweDAwOworCQlidWZbaSsrXSA9IDB4ODM7CisJCWJyZWFrOworCX0KKwlyZWdfd2IoZ3NwY2FfZGV2LCBjbWQsIDAsIGJ1ZiwgaSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUganVzdCBiZWZvcmUgc2RfaW5pdCAqLworc3RhdGljIGludCBzZF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0cnVjdCBjYW0gKmNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKKworCXNkLT5zZW5zb3IgPSBpZC0+ZHJpdmVyX2luZm8gPj4gODsKKwlzZC0+dHlwZSA9IGlkLT5kcml2ZXJfaW5mbzsKKworCWNhbS0+Y2FtX21vZGUgPSB2Z2FfbW9kZTsKKwljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUodmdhX21vZGUpOworCisJY2FtLT5idWxrID0gMTsKKwljYW0tPmJ1bGtfc2l6ZSA9IEJVTEtfVFJBTlNGRVJfTEVOOworLyoJY2FtLT5idWxrX251cmJzID0gMjsJZml4bWU6IGlmIG5vIHNldGV4cG8gc3luYyAqLworCisJc2QtPnF1YWxpdHkgPSBRVUFMSVRZX0RFRjsKKwlzZC0+Z2FpbiA9IEdBSU5fREVGOworCXNkLT5leHBvID0gRVhQT19ERUY7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5ncGlvWzBdID0gc2QtPmdwaW9bMV0gPSAweGZmOwkvKiBmb3JjZSBncGlvIHJld3JpdGUgKi8KKworLypmaXhtZTogaXMgdGhpcyBuZWVkZWQgZm9yIGljeDA5OGJwIGFuZCBtaTAzNjA/CisJaWYgKHNkLT5zZW5zb3IgIT0gU0VOU09SX0xaMjRCUCkKKwkJcmVnX3coZ3NwY2FfZGV2LCBTUTkzMF9DVFJMX1JFU0VULCAweDAwMDApOworICovCisKKwlyZWdfcihnc3BjYV9kZXYsIFNROTMwX0NUUkxfR0VUX0RFVl9JTkZPLCA4KTsKKy8qIGl0IHJldHVybnM6CisgKiAwMyAwMCAxMiA5MyAwYiBmNiBjOSAwMAlsaXZlISB1bHRyYQorICogMDMgMDAgMDcgOTMgMGIgZjYgY2EgMDAJbGl2ZSEgdWx0cmEgZm9yIG5vdGVib29rCisgKiAwMyAwMCAxMiA5MyAwYiBmZSBjOCAwMAlUcnVzdCBXQi0zNTAwVAorICogMDIgMDAgMDYgOTMgMGIgZmUgYzggMDAJSm95LUlUIDMxOFMKKyAqIDAzIDAwIDEyIDkzIDBiIGY2IGNmIDAwCWljYW0gdHJhY2VyIC0gc2Vuc29yIGljeDA5OGJxCisgKiAwMiAwMCAxMiA5MyAwYiBmZSBjZiAwMAlQcm9RIE1vdGlvbiBXZWJjYW0KKyAqCisgKiBieXRlCisgKiAwOiAwMiA9IHVzYiAxLjAgKDEyTWJpdCkgLyAwMyA9IHVzYjIuMCAoNDgwTWJpdCkKKyAqIDE6IDAwCisgKiAyOiAwNiAvIDA3IC8gMTIgPSBtb2RlIHdlYmNhbT8gZmlybXdhcmU/PworICogMzogOTMgY2hpcCA9IDkzMGIgKDkzMGIgb3IgOTMwYykKKyAqIDQ6IDBiCisgKiA1OiBmNiA9IGNkZCAoaWN4MDk4YnEsIGx6MjRicCkgLyBmZSBvciBkZSA9IGNtb3MgKGkyYykgKG90aGVyIHNlbnNvcnMpCisgKiA2OiBjOCAvIGM5IC8gY2EgLyBjZiA9IG1vZGUgd2ViY2FtPywgc2Vuc29yPyB3ZWJjYW0/CisgKiA3OiAwMAorICovCisJUERFQlVHKERfUFJPQkUsICJpbmZvOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngiLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzFdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzJdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzNdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzRdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzVdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzZdLAorCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzddKTsKKworCWJyaWRnZV9pbml0KHNkKTsKKworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9NSTAzNjApIHsKKworCQkvKiBubyBzZW5zb3IgcHJvYmUgZm9yIGljYW0gdHJhY2VyICovCisJCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbNV0gPT0gMHhmNikgewkvKiBpZiBDTU9TICovCisJCQlzZC0+c2Vuc29yID0gU0VOU09SX0lDWDA5OEJROworCQkJZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGUgPSAmdmdhX21vZGVbMV07CisJCQlnc3BjYV9kZXYtPmNhbS5ubW9kZXMgPSAxOwkvKiBvbmx5IDMyMHgyNDAgKi8KKwkJfSBlbHNlIHsKKwkJCWNtb3NfcHJvYmUoZ3NwY2FfZGV2KTsKKwkJfQorCX0KKworCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yICVzIiwgc2Vuc29yX3RiW3NkLT5zZW5zb3JdLm5hbWUpOworCisJZ2xvYmFsX2luaXQoc2QsIDEpOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Cit9CisKKy8qIHNwZWNpYWwgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIG9mIHRoZSBKUEVHIGhlYWRlciAqLworc3RhdGljIHZvaWQgc2RfanBlZ19zZXRfcXVhbCh1OCAqanBlZ19oZHIsCisJCQkJaW50IHF1YWxpdHkpCit7CisJaW50IGksIHNjMSwgc2MyOworCisJcXVhbGl0eSA9IHF1YWxpdHlfdGJbcXVhbGl0eV07CS8qIGNvbnZlcnQgdG8gSlBFRyBxdWFsaXR5ICovCisvKgorICogYXBwcm94aW1hdGl2ZSBxdWFsaXRpZXMgZm9yIFkgYW5kIFUvVjoKKyAqCXF1YW50ID0gMDo5NCUvOTElIDE6OTElLzg3JSAyOjgyJS83MyUgMzo2OSUvNTYlCisgKiBzaG91bGQgaGF2ZToKKyAqCXF1YW50ID0gMDo5NCUvOTElIDE6OTElLzg3LjUlIDI6ODEuNSUvNzIlIDM6NjklLzU0LjUlCisgKi8KKwlzYzEgPSAyMDAgLSBxdWFsaXR5ICogMjsKKwlxdWFsaXR5ID0gcXVhbGl0eSAqIDcgLyA1IC0gNDA7CQkvKiBVViBxdWFsaXR5ICovCisJc2MyID0gMjAwIC0gcXVhbGl0eSAqIDI7CisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJanBlZ19oZHJbSlBFR19RVDBfT0ZGU0VUICsgaV0gPQorCQkJKGpwZWdfaGVhZFtKUEVHX1FUMF9PRkZTRVQgKyBpXSAqIHNjMSArIDUwKSAvIDEwMDsKKwkJanBlZ19oZHJbSlBFR19RVDFfT0ZGU0VUICsgaV0gPQorCQkJKGpwZWdfaGVhZFtKUEVHX1FUMV9PRkZTRVQgKyBpXSAqIHNjMiArIDUwKSAvIDEwMDsKKwl9Cit9CisKKy8qIHNlbmQgdGhlIHN0YXJ0L3N0b3AgY29tbWFuZHMgdG8gdGhlIHdlYmNhbSAqLworc3RhdGljIHZvaWQgc2VuZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWNvbnN0IHN0cnVjdCBjYXBfcyAqY2FwOworCWludCBtb2RlLCBxdWFsaXR5OworCisJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OworCWNhcCA9ICZjYXBjb25maWdbc2QtPnNlbnNvcl1bbW9kZV07CisJcXVhbGl0eSA9IHNkLT5xdWFsaXR5OworCXJlZ193Yihnc3BjYV9kZXYsIChxdWFsaXR5IDw8IDEyKQorCQkJCSB8IDB4MGEwMAkvKiA5MDAgZm9yIEJheWVyICovCisJCQkJIHwgU1E5MzBfQ1RSTF9DQVBfU1RBUlQsCisJCQkweDA1MDAJCQkvKiBhMDAgZm9yIEJheWVyICovCisJCQkJIHwgY2FwLT5jY19zaXplaWQsCisJCQljYXAtPmNjX2J5dGVzLCAzMik7Cit9Oworc3RhdGljIHZvaWQgc2VuZF9zdG9wKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlyZWdfdyhnc3BjYV9kZXYsIFNROTMwX0NUUkxfQ0FQX1NUT1AsIDApOworfTsKKworLyogZnVuY3Rpb24gY2FsbGVkIGF0IHN0YXJ0IHRpbWUgYmVmb3JlIFVSQiBjcmVhdGlvbiAqLworc3RhdGljIGludCBzZF9pc29jX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgPSAxOwkvKiB0aGVyZSBtdXN0IGJlIG9uZSBVUkIgb25seSAqLworCXNkLT5kb19jdHJsID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyogc3RhcnQgdGhlIGNhcHR1cmUgKi8KK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgbW9kZTsKKworCS8qIGluaXRpYWxpemUgdGhlIEpQRUcgaGVhZGVyICovCisJanBlZ19kZWZpbmUoc2QtPmpwZWdfaGRyLCBnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCwKKwkJCTB4MjEpOwkJLyogSlBFRyA0MjIgKi8KKwlzZF9qcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOworCisJYnJpZGdlX2luaXQoc2QpOworCWdsb2JhbF9pbml0KHNkLCAwKTsKKwltc2xlZXAoMTAwKTsKKworCXN3aXRjaCAoc2QtPnNlbnNvcikgeworCWNhc2UgU0VOU09SX0lDWDA5OEJROgorCQl1Y2J1c193cml0ZShnc3BjYV9kZXYsIGljeDA5OGJxX3N0YXJ0XzAsCisJCQkJQVJSQVlfU0laRShpY3gwOThicV9zdGFydF8wKSwKKwkJCQk4KTsKKwkJdWNidXNfd3JpdGUoZ3NwY2FfZGV2LCBpY3gwOThicV9zdGFydF8xLAorCQkJCUFSUkFZX1NJWkUoaWN4MDk4YnFfc3RhcnRfMSksCisJCQkJNSk7CisJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgaWN4MDk4YnFfc3RhcnRfMiwKKwkJCQlBUlJBWV9TSVpFKGljeDA5OGJxX3N0YXJ0XzIpLAorCQkJCTYpOworCQltc2xlZXAoNTApOworCisJCS8qIDFzdCBzdGFydCAqLworCQlzZW5kX3N0YXJ0KGdzcGNhX2Rldik7CisJCWdwaW9fc2V0KHNkLCBTUTkzMF9HUElPX0VYVFJBMiB8IFNROTMwX0dQSU9fUlNUQkFSLCAweDAwZmYpOworCQltc2xlZXAoNzApOworCQlyZWdfdyhnc3BjYV9kZXYsIFNROTMwX0NUUkxfQ0FQX1NUT1AsIDB4MDAwMCk7CisJCWdwaW9fc2V0KHNkLCAweDdmLCAweDAwZmYpOworCisJCS8qIDJuZCBzdGFydCAqLworCQlzZW5kX3N0YXJ0KGdzcGNhX2Rldik7CisJCWdwaW9fc2V0KHNkLCBTUTkzMF9HUElPX0VYVFJBMiB8IFNROTMwX0dQSU9fUlNUQkFSLCAweDAwZmYpOworCQlnb3RvIG91dDsKKwljYXNlIFNFTlNPUl9MWjI0QlA6CisJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgbHoyNGJwX3N0YXJ0XzAsCisJCQkJQVJSQVlfU0laRShsejI0YnBfc3RhcnRfMCksCisJCQkJOCk7CisJCWlmIChzZC0+dHlwZSAhPSBDcmVhdGl2ZV9saXZlX21vdGlvbikKKwkJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgbHoyNGJwX3N0YXJ0XzFfZ2VuLAorCQkJCQlBUlJBWV9TSVpFKGx6MjRicF9zdGFydF8xX2dlbiksCisJCQkJCTUpOworCQllbHNlCisJCQl1Y2J1c193cml0ZShnc3BjYV9kZXYsIGx6MjRicF9zdGFydF8xX2NsbSwKKwkJCQkJQVJSQVlfU0laRShsejI0YnBfc3RhcnRfMV9jbG0pLAorCQkJCQk1KTsKKwkJdWNidXNfd3JpdGUoZ3NwY2FfZGV2LCBsejI0YnBfc3RhcnRfMiwKKwkJCQlBUlJBWV9TSVpFKGx6MjRicF9zdGFydF8yKSwKKwkJCQk2KTsKKwkJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OworCQlsejI0YnBfcHBsKHNkLCBtb2RlID09IDIgPyAweDA1NjQgOiAweDAzMTApOworCQltc2xlZXAoMTApOworCQlicmVhazsKKwljYXNlIFNFTlNPUl9NSTAzNjA6CisJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgbWkwMzYwX3N0YXJ0XzAsCisJCQkJQVJSQVlfU0laRShtaTAzNjBfc3RhcnRfMCksCisJCQkJOCk7CisJCWkyY193cml0ZShzZCwgbWkwMzYwX2luaXRfMjMsCisJCQkJQVJSQVlfU0laRShtaTAzNjBfaW5pdF8yMykpOworCQlpMmNfd3JpdGUoc2QsIG1pMDM2MF9pbml0XzI0LAorCQkJCUFSUkFZX1NJWkUobWkwMzYwX2luaXRfMjQpKTsKKwkJaTJjX3dyaXRlKHNkLCBtaTAzNjBfaW5pdF8yNSwKKwkJCQlBUlJBWV9TSVpFKG1pMDM2MF9pbml0XzI1KSk7CisJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgbWkwMzYwX3N0YXJ0XzEsCisJCQkJQVJSQVlfU0laRShtaTAzNjBfc3RhcnRfMSksCisJCQkJNSk7CisJCWkyY193cml0ZShzZCwgbWkwMzYwX3N0YXJ0XzIsCisJCQkJQVJSQVlfU0laRShtaTAzNjBfc3RhcnRfMikpOworCQlpMmNfd3JpdGUoc2QsIG1pMDM2MF9zdGFydF8zLAorCQkJCUFSUkFZX1NJWkUobWkwMzYwX3N0YXJ0XzMpKTsKKworCQkvKiAxc3Qgc3RhcnQgKi8KKwkJc2VuZF9zdGFydChnc3BjYV9kZXYpOworCQltc2xlZXAoNjApOworCQlyZWdfdyhnc3BjYV9kZXYsIFNROTMwX0NUUkxfQ0FQX1NUT1AsIDB4MDAwMCk7CisKKwkJaTJjX3dyaXRlKHNkLAorCQkJbWkwMzYwX3N0YXJ0XzQsIEFSUkFZX1NJWkUobWkwMzYwX3N0YXJ0XzQpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKy8qCWNhc2UgU0VOU09SX01UOVYxMTE6ICovCisJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgbWkwMzYwX3N0YXJ0XzAsCisJCQkJQVJSQVlfU0laRShtaTAzNjBfc3RhcnRfMCksCisJCQkJOCk7CisJCWkyY193cml0ZShzZCwgbXQ5djExMV9pbml0XzAsCisJCQkJQVJSQVlfU0laRShtdDl2MTExX2luaXRfMCkpOworCQlpMmNfd3JpdGUoc2QsIG10OXYxMTFfaW5pdF8xLAorCQkJCUFSUkFZX1NJWkUobXQ5djExMV9pbml0XzEpKTsKKwkJaTJjX3dyaXRlKHNkLCBtdDl2MTExX2luaXRfMiwKKwkJCQlBUlJBWV9TSVpFKG10OXYxMTFfaW5pdF8yKSk7CisJCXVjYnVzX3dyaXRlKGdzcGNhX2RldiwgbXQ5djExMV9zdGFydF8xLAorCQkJCUFSUkFZX1NJWkUobXQ5djExMV9zdGFydF8xKSwKKwkJCQk4KTsKKwkJaTJjX3dyaXRlKHNkLCBtdDl2MTExX2luaXRfMywKKwkJCQlBUlJBWV9TSVpFKG10OXYxMTFfaW5pdF8zKSk7CisJCWkyY193cml0ZShzZCwgbXQ5djExMV9pbml0XzQsCisJCQkJQVJSQVlfU0laRShtdDl2MTExX2luaXRfNCkpOworCQlicmVhazsKKwl9CisKKwlzZW5kX3N0YXJ0KGdzcGNhX2Rldik7CitvdXQ6CisJbXNsZWVwKDEwMDApOworCisJc2QtPmVvZl9sZW4gPSAwOwkvKiBpbml0IHBhY2tldCBzY2FuICovCisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfTVQ5VjExMSkKKwkJZ3Bpb19zZXQoc2QsIFNROTMwX0dQSU9fREZMX0xFRCwgU1E5MzBfR1BJT19ERkxfTEVEKTsKKworCXNkLT5kb19jdHJsID0gMTsJLyogc2V0IHRoZSBleHBvc3VyZSAqLworCisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9NVDlWMTExKQorCQlncGlvX3NldChzZCwgMCwgU1E5MzBfR1BJT19ERkxfTEVEKTsKKwlzZW5kX3N0b3AoZ3NwY2FfZGV2KTsKK30KKworLyogZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGdldHMgYSBuZXcgZnJhbWUgKi8KKy8qIEl0IHNldHMgdGhlIGV4cG9zdXJlIGlmIHJlcXVpcmVkIGFuZCByZXN0YXJ0IHRoZSBidWxrIHRyYW5zZmVyLiAqLworc3RhdGljIHZvaWQgc2RfZHFfY2FsbGJhY2soc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgcmV0OworCisJaWYgKCFzZC0+ZG9fY3RybCB8fCBnc3BjYV9kZXYtPmNhbS5idWxrX251cmJzICE9IDApCisJCXJldHVybjsKKwlzZC0+ZG9fY3RybCA9IDA7CisKKwlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCisJZ3NwY2FfZGV2LT5jYW0uYnVsa19udXJicyA9IDE7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIoZ3NwY2FfZGV2LT51cmJbMF0sIEdGUF9BVE9NSUMpOworCWlmIChyZXQgPCAwKQorCQlQREVCVUcoRF9FUlJ8RF9QQUNLLCAic2RfZHFfY2FsbGJhY2soKSBlcnIgJWQiLCByZXQpOworCisJLyogd2FpdCBhIGxpdHRsZSB0aW1lLCBvdGhlcndpc2UgdGhlIHdlYmNhbSBjcmFzaGVzICovCisJbXNsZWVwKDEwMCk7Cit9CisKKy8qIG1vdmUgYSBwYWNrZXQgYWRkaW5nIDB4MDAgYWZ0ZXIgMHhmZiAqLworc3RhdGljIHZvaWQgYWRkX3BhY2tldChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQl1OCAqZGF0YSwKKwkJCWludCBsZW4pCit7CisJaW50IGk7CisKKwlpID0gMDsKKwlkbyB7CisJCWlmIChkYXRhW2ldID09IDB4ZmYpIHsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKKwkJCQkJZGF0YSwgaSArIDEpOworCQkJbGVuIC09IGk7CisJCQlkYXRhICs9IGk7CisJCQkqZGF0YSA9IDB4MDA7CisJCQlpID0gMDsKKwkJfQorCX0gd2hpbGUgKCsraSA8IGxlbik7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOworfQorCisvKiBlbmQgYSBmcmFtZSBhbmQgc3RhcnQgYSBuZXcgb25lICovCitzdGF0aWMgdm9pZCBlb2Zfc29mKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RhdGljIGNvbnN0IHU4IGZmZDlbXSA9IHsweGZmLCAweGQ5fTsKKworCS8qIGlmIGNvbnRyb2wgc2V0LCBzdG9wIGJ1bGsgdHJhbnNmZXIgKi8KKwlpZiAoc2QtPmRvX2N0cmwKKwkgJiYgZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID09IElOVEVSX1BBQ0tFVCkKKwkJZ3NwY2FfZGV2LT5jYW0uYnVsa19udXJicyA9IDA7CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQlmZmQ5LCAyKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCisJCQlzZC0+anBlZ19oZHIsIEpQRUdfSERSX1NaKTsKK30KKworc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJdTggKmRhdGEsCQkvKiBpc29jIHBhY2tldCAqLworCQkJaW50IGxlbikJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4ICpwOworCWludCBsOworCisJbGVuIC09IDg7CS8qIGlnbm9yZSBsYXN0IDggYnl0ZXMgKDAwIDAwIDU1IGFhIDU1IGFhIDAwIDAwKSAqLworCisJLyoKKwkgKiB0aGUgZW5kL3N0YXJ0IG9mIGZyYW1lIGlzIGluZGljYXRlZCBieQorCSAqCTB4MDAgKiAxNiAtICAweGFiICogOAorCSAqIGFsaWduZWQgb24gOCBieXRlcyBib3VuZGFyeQorCSAqLworCWlmIChzZC0+ZW9mX2xlbiAhPSAwKSB7CQkvKiBpZiAnYWJhYmFiYWInIGluIHByZXZpb3VzIHBrdCAqLworCQlpZiAoKigodTMyICopIGRhdGEpID09IDB4YWJhYmFiYWIpIHsKKwkJCQkvKmZpeG1lOiBzaG91bGQgcmVtb3ZlIHByZXZpb3VzIDAwMDBhYmFiYWIqLworCQkJZW9mX3NvZihnc3BjYV9kZXYpOworCQkJZGF0YSArPSA0OworCQkJbGVuIC09IDQ7CisJCX0KKwkJc2QtPmVvZl9sZW4gPSAwOworCX0KKwlwID0gZGF0YTsKKwlsID0gbGVuOworCWZvciAoOzspIHsKKwkJaWYgKCooKHUzMiAqKSBwKSA9PSAweGFiYWJhYmFiKSB7CisJCQlpZiAobCA8IDgpIHsJCS8qIChtYXkgYmUgNCBvbmx5KSAqLworCQkJCXNkLT5lb2ZfbGVuID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgqKCh1MzIgKikgcCArIDEpID09IDB4YWJhYmFiYWIpIHsKKwkJCQlhZGRfcGFja2V0KGdzcGNhX2RldiwgZGF0YSwgcCAtIGRhdGEgLSAxNik7CisJCQkJCQkvKiByZW1vdmUgcHJldmlvdXMgemVyb3MgKi8KKwkJCQllb2Zfc29mKGdzcGNhX2Rldik7CisJCQkJcCArPSA4OworCQkJCWwgLT0gODsKKwkJCQlpZiAobCA8PSAwKQorCQkJCQlyZXR1cm47CisJCQkJbGVuID0gbDsKKwkJCQlkYXRhID0gcDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlwICs9IDQ7CisJCWwgLT0gNDsKKwkJaWYgKGwgPD0gMCkKKwkJCWJyZWFrOworCX0KKwlhZGRfcGFja2V0KGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5nYWluID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2QtPmRvX2N0cmwgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Z2FpbjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgc2Rfc2V0ZXhwbyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+ZXhwbyA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNkLT5kb19jdHJsID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRleHBvKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPmV4cG87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0X2pjb21wKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqamNvbXApCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBxdWFsaXR5OworCisJaWYgKGpjb21wLT5xdWFsaXR5ID49IChRVUFMXzAgKyBRVUFMXzEpIC8gMikKKwkJcXVhbGl0eSA9IDA7CisJZWxzZSBpZiAoamNvbXAtPnF1YWxpdHkgPj0gKFFVQUxfMSArIFFVQUxfMikgLyAyKQorCQlxdWFsaXR5ID0gMTsKKwllbHNlIGlmIChqY29tcC0+cXVhbGl0eSA+PSAoUVVBTF8yICsgUVVBTF8zKSAvIDIpCisJCXF1YWxpdHkgPSAyOworCWVsc2UKKwkJcXVhbGl0eSA9IDM7CisKKwlpZiAocXVhbGl0eSAhPSBzZC0+cXVhbGl0eSkgeworCQlzZC0+cXVhbGl0eSA9IHF1YWxpdHk7CisJCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgeworCQkJc2VuZF9zdG9wKGdzcGNhX2Rldik7CisJCQlzZF9qcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgc2QtPnF1YWxpdHkpOworCQkJbXNsZWVwKDcwKTsKKwkJCXNlbmRfc3RhcnQoZ3NwY2FfZGV2KTsKKwkJfQorCX0KKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgaW50IHNkX2dldF9qY29tcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKmpjb21wKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCW1lbXNldChqY29tcCwgMCwgc2l6ZW9mICpqY29tcCk7CisJamNvbXAtPnF1YWxpdHkgPSBxdWFsaXR5X3RiW3NkLT5xdWFsaXR5XTsKKwlqY29tcC0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQKKwkJCXwgVjRMMl9KUEVHX01BUktFUl9EUVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0geworCS5uYW1lICAgPSBNT0RVTEVfTkFNRSwKKwkuY3RybHMgPSBzZF9jdHJscywKKwkubmN0cmxzID0gQVJSQVlfU0laRShzZF9jdHJscyksCisJLmNvbmZpZyA9IHNkX2NvbmZpZywKKwkuaW5pdCAgID0gc2RfaW5pdCwKKwkuaXNvY19pbml0ID0gc2RfaXNvY19pbml0LAorCS5zdGFydCAgPSBzZF9zdGFydCwKKwkuc3RvcE4gID0gc2Rfc3RvcE4sCisJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCisJLmRxX2NhbGxiYWNrID0gc2RfZHFfY2FsbGJhY2ssCisJLmdldF9qY29tcCA9IHNkX2dldF9qY29tcCwKKwkuc2V0X2pjb21wID0gc2Rfc2V0X2pjb21wLAorfTsKKworLyogVGFibGUgb2Ygc3VwcG9ydGVkIFVTQiBkZXZpY2VzICovCisjZGVmaW5lIFNUKHNlbnNvciwgdHlwZSkgXAorCS5kcml2ZXJfaW5mbyA9IChTRU5TT1JfICMjIHNlbnNvciA8PCA4KSBcCisJCQl8ICh0eXBlKQorc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMzgpLCBTVChNSTAzNjAsIDApfSwKKwl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDAzYyksIFNUKExaMjRCUCwgMCl9LAorCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDNkKSwgU1QoTFoyNEJQLCAwKX0sCisJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNDEpLCBTVChMWjI0QlAsIENyZWF0aXZlX2xpdmVfbW90aW9uKX0sCisJe1VTQl9ERVZJQ0UoMHgyNzcwLCAweDkzMGIpLCBTVChNSTAzNjAsIDApfSwKKwl7VVNCX0RFVklDRSgweDI3NzAsIDB4OTMwYyksIFNUKE1JMDM2MCwgMCl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CisKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZ3NwY2FfZGV2X3Byb2JlKGludGYsIGlkLCAmc2RfZGVzYywgc2l6ZW9mKHN0cnVjdCBzZCksCisJCQlUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CisJLm5hbWUJICAgID0gTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlICAgPSBkZXZpY2VfdGFibGUsCisJLnByb2JlCSAgICA9IHNkX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZ3NwY2FfZGlzY29ubmVjdCwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCAgICA9IGdzcGNhX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpbmZvKCJyZWdpc3RlcmVkIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgc2RfbW9kX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2RfZHJpdmVyKTsKKwlpbmZvKCJkZXJlZ2lzdGVyZWQiKTsKK30KKworbW9kdWxlX2luaXQoc2RfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoc2RfbW9kX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMKaW5kZXggMGZiNTM0Mi4uMmFlZGY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0azAxNC5jCkBAIC0zNiwxMSArMzYsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIGNvbG9yczsKIAl1bnNpZ25lZCBjaGFyIGxpZ2h0ZnJlcTsKIAl1OCBxdWFsaXR5OwotI2RlZmluZSBRVUFMSVRZX01JTiA2MAorI2RlZmluZSBRVUFMSVRZX01JTiA3MAogI2RlZmluZSBRVUFMSVRZX01BWCA5NQotI2RlZmluZSBRVUFMSVRZX0RFRiA4MAorI2RlZmluZSBRVUFMSVRZX0RFRiA4OAogCi0JdTggKmpwZWdfaGRyOworCXU4IGpwZWdfaGRyW0pQRUdfSERSX1NaXTsKIH07CiAKIC8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KQEAgLTMzNyw5ICszMzcsNiBAQAogCWludCByZXQsIHZhbHVlOwogCiAJLyogY3JlYXRlIHRoZSBKUEVHIGhlYWRlciAqLwotCXNkLT5qcGVnX2hkciA9IGttYWxsb2MoSlBFR19IRFJfU1osIEdGUF9LRVJORUwpOwotCWlmICghc2QtPmpwZWdfaGRyKQotCQlyZXR1cm4gLUVOT01FTTsKIAlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGdzcGNhX2Rldi0+aGVpZ2h0LCBnc3BjYV9kZXYtPndpZHRoLAogCQkJMHgyMik7CQkvKiBKUEVHIDQxMSAqLwogCWpwZWdfc2V0X3F1YWwoc2QtPmpwZWdfaGRyLCBzZC0+cXVhbGl0eSk7CkBAIC00MTIsMTMgKzQwOSw2IEBACiAJUERFQlVHKERfU1RSRUFNLCAiY2FtZXJhIHN0b3BwZWQiKTsKIH0KIAotc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCWtmcmVlKHNkLT5qcGVnX2hkcik7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCkBAIC01NzgsNyArNTY4LDYgQEAKIAkuaW5pdCA9IHNkX2luaXQsCiAJLnN0YXJ0ID0gc2Rfc3RhcnQsCiAJLnN0b3BOID0gc2Rfc3RvcE4sCi0JLnN0b3AwID0gc2Rfc3RvcDAsCiAJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCiAJLnF1ZXJ5bWVudSA9IHNkX3F1ZXJ5bWVudSwKIAkuZ2V0X2pjb21wID0gc2RfZ2V0X2pjb21wLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmgKaW5kZXggOTkyY2U1My4uMDUzYTI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5oCkBAIC0zMCw2ICszMCw3IEBACiAjaWZuZGVmIFNUVjA2WFhfSF8KICNkZWZpbmUgU1RWMDZYWF9IXwogCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgImdzcGNhLmgiCiAKICNkZWZpbmUgTU9EVUxFX05BTUUgIlNUVjA2eHgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCmluZGV4IDBjNzg2ZTAuLjk0OTRmODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCkBAIC01NCw3ICs1NCw3IEBACiAjZGVmaW5lIE1lZ2FwaXhWNCA0CiAjZGVmaW5lIE1lZ2FJbWFnZVZJIDUKIAotCXU4ICpqcGVnX2hkcjsKKwl1OCBqcGVnX2hkcltKUEVHX0hEUl9TWl07CiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCkBAIC04MDUsNyArODA1LDcgQEAKIAkJCS8qIFNldCBBRSBBV0IgQmFuZGluZyBUeXBlIDMtPiA1MEh6IDItPiA2MEh6ICovCiAJCQlzcGNhNTA0QV9hY2tub3dsZWRnZWRfY29tbWFuZChnc3BjYV9kZXYsIDB4MjQsCiAJCQkJCQkJOCwgMywgMHg5ZSwgMSk7Ci0JCQkvKiBUd2ljZSBzZXF1ZW5jaWFsIG5lZWQgc3RhdHVzIDB4ZmYtPjB4OWUtPjB4OWQgKi8KKwkJCS8qIFR3aWNlIHNlcXVlbnRpYWwgbmVlZCBzdGF0dXMgMHhmZi0+MHg5ZS0+MHg5ZCAqLwogCQkJc3BjYTUwNEFfYWNrbm93bGVkZ2VkX2NvbW1hbmQoZ3NwY2FfZGV2LCAweDI0LAogCQkJCQkJCTgsIDMsIDB4OWUsIDApOwogCkBAIC04NDIsOSArODQyLDYgQEAKIAlpbnQgZW5hYmxlOwogCiAJLyogY3JlYXRlIHRoZSBKUEVHIGhlYWRlciAqLwotCXNkLT5qcGVnX2hkciA9IGttYWxsb2MoSlBFR19IRFJfU1osIEdGUF9LRVJORUwpOwotCWlmICghc2QtPmpwZWdfaGRyKQotCQlyZXR1cm4gLUVOT01FTTsKIAlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGdzcGNhX2Rldi0+aGVpZ2h0LCBnc3BjYV9kZXYtPndpZHRoLAogCQkJMHgyMik7CQkvKiBKUEVHIDQxMSAqLwogCWpwZWdfc2V0X3F1YWwoc2QtPmpwZWdfaGRyLCBzZC0+cXVhbGl0eSk7CkBAIC04ODAsNyArODc3LDcgQEAKIAkJCS8qIFNldCBBRSBBV0IgQmFuZGluZyBUeXBlIDMtPiA1MEh6IDItPiA2MEh6ICovCiAJCQlzcGNhNTA0QV9hY2tub3dsZWRnZWRfY29tbWFuZChnc3BjYV9kZXYsIDB4MjQsCiAJCQkJCQkJOCwgMywgMHg5ZSwgMSk7Ci0JCQkvKiBUd2ljZSBzZXF1ZW5jaWFsIG5lZWQgc3RhdHVzIDB4ZmYtPjB4OWUtPjB4OWQgKi8KKwkJCS8qIFR3aWNlIHNlcXVlbnRpYWwgbmVlZCBzdGF0dXMgMHhmZi0+MHg5ZS0+MHg5ZCAqLwogCQkJc3BjYTUwNEFfYWNrbm93bGVkZ2VkX2NvbW1hbmQoZ3NwY2FfZGV2LCAweDI0LAogCQkJCQkJCTgsIDMsIDB4OWUsIDApOwogCQkJc3BjYTUwNEFfYWNrbm93bGVkZ2VkX2NvbW1hbmQoZ3NwY2FfZGV2LCAweDI0LApAQCAtOTU0LDEzICs5NTEsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCWtmcmVlKHNkLT5qcGVnX2hkcik7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCkBAIC0xMTYyLDcgKzExNTIsNiBAQAogCS5pbml0ID0gc2RfaW5pdCwKIAkuc3RhcnQgPSBzZF9zdGFydCwKIAkuc3RvcE4gPSBzZF9zdG9wTiwKLQkuc3RvcDAgPSBzZF9zdG9wMCwKIAkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKIAkuZ2V0X2pjb21wID0gc2RfZ2V0X2pjb21wLAogCS5zZXRfamNvbXAgPSBzZF9zZXRfamNvbXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jCmluZGV4IDYzMDE0MzcuLjJhMGYxMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jCkBAIC0xLDUgKzEsNyBAQAogLyoKLSAqIFY0TDIgYnkgSmVhbi1GcmFuY29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4KKyAqIFQ2MTMgc3ViZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEplYW4tRnJhbmNvaXMgTW9pbmUgKGh0dHA6Ly9tb2luZWpmLmZyZWUuZnIpCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNiw2ICsyOCw3IEBACiAKICNkZWZpbmUgTU9EVUxFX05BTUUgInQ2MTMiCiAKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiZ3NwY2EuaCIKIAogI2RlZmluZSBWNEwyX0NJRF9FRkZFQ1RTIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQpAQCAtNDQsMTggKzQ3LDIwIEBACiAJdTggZ2FtbWE7CiAJdTggc2hhcnBuZXNzOwogCXU4IGZyZXE7Ci0JdTggcmVkX2JhbGFuY2U7IC8qIHNwbGl0IGJhbGFuY2UgKi8KLQl1OCBibHVlX2JhbGFuY2U7Ci0JdTggZ2xvYmFsX2dhaW47IC8qIGFrYSBnYWluICovCi0JdTggd2hpdGViYWxhbmNlOyAvKiBzZXQgZGVmYXVsdCByL2cvYiBhbmQgYWN0aXZhdGUgKi8KKwl1OCByZWRfZ2FpbjsKKwl1OCBibHVlX2dhaW47CisJdTggZ3JlZW5fZ2FpbjsKKwl1OCBhd2I7IC8qIHNldCBkZWZhdWx0IHIvZy9iIGFuZCBhY3RpdmF0ZSAqLwogCXU4IG1pcnJvcjsKIAl1OCBlZmZlY3Q7CiAKIAl1OCBzZW5zb3I7Ci0jZGVmaW5lIFNFTlNPUl9PTTY4MDIgMAotI2RlZmluZSBTRU5TT1JfT1RIRVIgMQotI2RlZmluZSBTRU5TT1JfVEFTNTEzMEEgMgotI2RlZmluZSBTRU5TT1JfTFQxNjhHIDMgICAgIC8qIG11c3QgdmVyaWZ5IGlmIHRoaXMgaXMgdGhlIGFjdHVhbCBtb2RlbCAqLworZW51bSB7CisJU0VOU09SX09NNjgwMiwKKwlTRU5TT1JfT1RIRVIsCisJU0VOU09SX1RBUzUxMzBBLAorCVNFTlNPUl9MVDE2OEcsCQkvKiBtdXN0IHZlcmlmeSBpZiB0aGlzIGlzIHRoZSBhY3R1YWwgbW9kZWwgKi8KK30gc2Vuc29yczsKIH07CiAKIC8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KQEAgLTc0LDI0ICs3OSwyMiBAQAogc3RhdGljIGludCBzZF9zZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIHN0YXRpYyBpbnQgc2RfZ2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogCitzdGF0aWMgaW50IHNkX3NldGF3YihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGF3YihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRibHVlX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRibHVlX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0cmVkX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRyZWRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogCi1zdGF0aWMgaW50IHNkX3NldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKLXN0YXRpYyBpbnQgc2Rfc2V0cmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRyZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRnbG9iYWxfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldGdsb2JhbF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7Ci0KLXN0YXRpYyBpbnQgc2Rfc2V0ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0bWlycm9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0bWlycm9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiBzdGF0aWMgaW50IHNkX3NldGVmZmVjdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CiBzdGF0aWMgaW50IHNkX2dldGVmZmVjdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIGludCBzZF9xdWVyeW1lbnUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICptZW51KTsKIAotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKIAl7CiAJIHsKQEAgLTE3Nyw4ICsxODAsOCBAQAogI2RlZmluZSBNSVJST1JfREVGIDAKIAkgIC5kZWZhdWx0X3ZhbHVlID0gTUlSUk9SX0RFRiwKIAkgIH0sCi0JIC5zZXQgPSBzZF9zZXRmbGlwLAotCSAuZ2V0ID0gc2RfZ2V0ZmxpcAorCSAuc2V0ID0gc2Rfc2V0bWlycm9yLAorCSAuZ2V0ID0gc2RfZ2V0bWlycm9yCiAJfSwKIAl7CiAJIHsKQEAgLTE5OCwxNSArMjAxLDE1IEBACiAJIHsKIAkgIC5pZCA9ICBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCiAJICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAubmFtZSA9ICJXaGl0ZSBCYWxhbmNlIiwKKwkgIC5uYW1lID0gIkF1dG8gV2hpdGUgQmFsYW5jZSIsCiAJICAubWluaW11bSA9IDAsCiAJICAubWF4aW11bSA9IDEsCiAJICAuc3RlcCA9IDEsCi0jZGVmaW5lIFdISVRFX0JBTEFOQ0VfREVGIDAKLQkgIC5kZWZhdWx0X3ZhbHVlID0gV0hJVEVfQkFMQU5DRV9ERUYsCisjZGVmaW5lIEFXQl9ERUYgMAorCSAgLmRlZmF1bHRfdmFsdWUgPSBBV0JfREVGLAogCSAgfSwKLQkgLnNldCA9IHNkX3NldHdoaXRlYmFsYW5jZSwKLQkgLmdldCA9IHNkX2dldHdoaXRlYmFsYW5jZQorCSAuc2V0ID0gc2Rfc2V0YXdiLAorCSAuZ2V0ID0gc2RfZ2V0YXdiCiAJfSwKIAl7CiAJIHsKQEAgLTI0NCwxMSArMjQ3LDExIEBACiAJICAgIC5taW5pbXVtID0gMHgxMCwKIAkgICAgLm1heGltdW0gPSAweDQwLAogCSAgICAuc3RlcCAgICA9IDEsCi0jZGVmaW5lIEJMVUVfQkFMQU5DRV9ERUYgMHgyMAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IEJMVUVfQkFMQU5DRV9ERUYsCisjZGVmaW5lIEJMVUVfR0FJTl9ERUYgMHgyMAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IEJMVUVfR0FJTl9ERUYsCiAJIH0sCi0JLnNldCA9IHNkX3NldGJsdWVfYmFsYW5jZSwKLQkuZ2V0ID0gc2RfZ2V0Ymx1ZV9iYWxhbmNlLAorCS5zZXQgPSBzZF9zZXRibHVlX2dhaW4sCisJLmdldCA9IHNkX2dldGJsdWVfZ2FpbiwKIAl9LAogCXsKIAkgewpAQCAtMjU4LDExICsyNjEsMTEgQEAKIAkgICAgLm1pbmltdW0gPSAweDEwLAogCSAgICAubWF4aW11bSA9IDB4NDAsCiAJICAgIC5zdGVwICAgID0gMSwKLSNkZWZpbmUgUkVEX0JBTEFOQ0VfREVGIDB4MjAKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSBSRURfQkFMQU5DRV9ERUYsCisjZGVmaW5lIFJFRF9HQUlOX0RFRiAweDIwCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gUkVEX0dBSU5fREVGLAogCSB9LAotCS5zZXQgPSBzZF9zZXRyZWRfYmFsYW5jZSwKLQkuZ2V0ID0gc2RfZ2V0cmVkX2JhbGFuY2UsCisJLnNldCA9IHNkX3NldHJlZF9nYWluLAorCS5nZXQgPSBzZF9nZXRyZWRfZ2FpbiwKIAl9LAogCXsKIAkgewpAQCAtMjcyLDI0ICsyNzUsMTQgQEAKIAkgICAgLm1pbmltdW0gPSAweDEwLAogCSAgICAubWF4aW11bSA9IDB4NDAsCiAJICAgIC5zdGVwICAgID0gMSwKLSNkZWZpbmUgZ2xvYmFsX2dhaW5fREVGICAweDIwCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gZ2xvYmFsX2dhaW5fREVGLAorI2RlZmluZSBHQUlOX0RFRiAgMHgyMAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IEdBSU5fREVGLAogCSB9LAotCS5zZXQgPSBzZF9zZXRnbG9iYWxfZ2FpbiwKLQkuZ2V0ID0gc2RfZ2V0Z2xvYmFsX2dhaW4sCisJLnNldCA9IHNkX3NldGdhaW4sCisJLmdldCA9IHNkX2dldGdhaW4sCiAJfSwKIH07CiAKLXN0YXRpYyBjaGFyICplZmZlY3RzX2NvbnRyb2xbXSA9IHsKLQkiTm9ybWFsIiwKLQkiRW1ib3NzIiwJCS8qIGRpc2FibGVkICovCi0JIk1vbm9jaHJvbWUiLAotCSJTZXBpYSIsCi0JIlNrZXRjaCIsCi0JIlN1biBFZmZlY3QiLAkJLyogZGlzYWJsZWQgKi8KLQkiTmVnYXRpdmUiLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVfdDE2W10gPSB7CiAJezE2MCwgMTIwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTYwLApAQCAtMzI3LDcgKzMyMCw2IEBACiAJY29uc3QgdTggZGF0YTFbMTBdOwogCWNvbnN0IHU4IGRhdGEyWzldOwogCWNvbnN0IHU4IGRhdGEzWzldOwotCWNvbnN0IHU4IGRhdGE0WzRdOwogCWNvbnN0IHU4IGRhdGE1WzZdOwogCWNvbnN0IHU4IHN0cmVhbVs0XTsKIH07CkBAIC0zNzUsNyArMzY3LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkaXRpb25hbF9zZW5zb3JfZGF0YSBzZW5zb3JfZGF0YVtdID0gewotICAgIHsJCQkJLyogMDogT002ODAyICovCitbU0VOU09SX09NNjgwMl0gPSB7CiAJLm4zID0KIAkJezB4NjEsIDB4NjgsIDB4NjUsIDB4MGEsIDB4NjAsIDB4MDR9LAogCS5uNCA9IG40X29tNjgwMiwKQEAgLTM5MiwxNCArMzg0LDEyIEBACiAJLmRhdGEzID0KIAkJezB4ODAsIDB4ZmYsIDB4ZmYsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4ODAsIDB4ZmYsCiAJCSAweGZmfSwKLQkuZGF0YTQgPQkvKkZyZXEgKDUwLzYwSHopLiBTcGxpdHRlZCBmb3IgdGVzdCBwdXJwb3NlICovCi0JCXsweDY2LCAweGNhLCAweGE4LCAweGYwfSwKIAkuZGF0YTUgPQkvKiB0aGlzIGNvdWxkIGJlIHJlbW92ZWQgbGF0ZXIgKi8KIAkJezB4MGMsIDB4MDMsIDB4YWIsIDB4MTMsIDB4ODEsIDB4MjN9LAogCS5zdHJlYW0gPQogCQl7MHgwYiwgMHgwNCwgMHgwYSwgMHg3OH0sCiAgICAgfSwKLSAgICB7CQkJCS8qIDE6IE9USEVSICovCitbU0VOU09SX09USEVSXSA9IHsKIAkubjMgPQogCQl7MHg2MSwgMHhjMiwgMHg2NSwgMHg4OCwgMHg2MCwgMHgwMH0sCiAJLm40ID0gbjRfb3RoZXIsCkBAIC00MTYsMTQgKzQwNiwxMiBAQAogCS5kYXRhMyA9CiAJCXsweDRlLCAweDljLCAweGVjLCAweDQwLCAweDgwLCAweGMwLCAweDQ4LCAweDk2LAogCQkgMHhkOX0sCi0JLmRhdGE0ID0KLQkJezB4NjYsIDB4MDAsIDB4YTgsIDB4YTh9LAogCS5kYXRhNSA9CiAJCXsweDBjLCAweDAzLCAweGFiLCAweDI5LCAweDgxLCAweDY5fSwKIAkuc3RyZWFtID0KIAkJezB4MGIsIDB4MDQsIDB4MGEsIDB4MDB9LAogICAgIH0sCi0gICAgewkJCQkvKiAyOiBUQVM1MTMwQSAqLworW1NFTlNPUl9UQVM1MTMwQV0gPSB7CiAJLm4zID0KIAkJezB4NjEsIDB4YzIsIDB4NjUsIDB4MGQsIDB4NjAsIDB4MDh9LAogCS5uNCA9IG40X3RhczUxMzBhLApAQCAtNDQwLDE0ICs0MjgsMTIgQEAKIAkuZGF0YTMgPQogCQl7MHg2MCwgMHhhOCwgMHhlMCwgMHg2MCwgMHhhOCwgMHhlMCwgMHg2MCwgMHhhOCwKIAkJIDB4ZTB9LAotCS5kYXRhNCA9CS8qIEZyZXEgKDUwLzYwSHopLiBTcGxpdHRlZCBmb3IgdGVzdCBwdXJwb3NlICovCi0JCXsweDY2LCAweDAwLCAweGE4LCAweGU4fSwKIAkuZGF0YTUgPQogCQl7MHgwYywgMHgwMywgMHhhYiwgMHgxMCwgMHg4MSwgMHgyMH0sCiAJLnN0cmVhbSA9CiAJCXsweDBiLCAweDA0LCAweDBhLCAweDQwfSwKICAgICB9LAotICAgIHsJCQkJLyogMzogTFQxNjhHICovCitbU0VOU09SX0xUMTY4R10gPSB7CiAJLm4zID0gezB4NjEsIDB4YzIsIDB4NjUsIDB4NjgsIDB4NjAsIDB4MDB9LAogCS5uNCA9IG40X2x0MTY4ZywKIAkubjRzeiA9IHNpemVvZiBuNF9sdDE2OGcsCkBAIC00NjAsNyArNDQ2LDYgQEAKIAkJIDB4ZmZ9LAogCS5kYXRhMyA9IHsweDQwLCAweDgwLCAweGMwLCAweDUwLCAweGEwLCAweGYwLCAweDUzLCAweGE2LAogCQkgMHhmZn0sCi0JLmRhdGE0ID0gezB4NjYsIDB4NDEsIDB4YTgsIDB4ZjB9LAogCS5kYXRhNSA9IHsweDBjLCAweDAzLCAweGFiLCAweDRiLCAweDgxLCAweDJifSwKIAkuc3RyZWFtID0gezB4MGIsIDB4MDQsIDB4MGEsIDB4Mjh9LAogICAgIH0sCkBAIC00NjksNiArNDU0LDE1IEBACiAjZGVmaW5lIE1BWF9FRkZFQ1RTIDcKIC8qIGVhc2lseSBkb25lIGJ5IHNvZnQsIHRoaXMgdGFibGUgY291bGQgYmUgcmVtb3ZlZCwKICAqIGkga2VlcCBpdCBoZXJlIGp1c3QgaW4gY2FzZSAqLworc3RhdGljIGNoYXIgKmVmZmVjdHNfY29udHJvbFtNQVhfRUZGRUNUU10gPSB7CisJIk5vcm1hbCIsCisJIkVtYm9zcyIsCQkvKiBkaXNhYmxlZCAqLworCSJNb25vY2hyb21lIiwKKwkiU2VwaWEiLAorCSJTa2V0Y2giLAorCSJTdW4gRWZmZWN0IiwJCS8qIGRpc2FibGVkICovCisJIk5lZ2F0aXZlIiwKK307CiBzdGF0aWMgY29uc3QgdTggZWZmZWN0c190YWJsZVtNQVhfRUZGRUNUU11bNl0gPSB7CiAJezB4YTgsIDB4ZTgsIDB4YzYsIDB4ZDIsIDB4YzAsIDB4MDB9LAkvKiBOb3JtYWwgKi8KIAl7MHhhOCwgMHhjOCwgMHhjNiwgMHg1MiwgMHhjMCwgMHgwNH0sCS8qIFJlcHVqYXIgKi8KQEAgLTQ4MCw0MCArNDc0LDQxIEBACiB9OwogCiBzdGF0aWMgY29uc3QgdTggZ2FtbWFfdGFibGVbR0FNTUFfTUFYXVsxN10gPSB7Ci0JezB4MDAsIDB4M2UsIDB4NjksIDB4ODUsIDB4OTUsIDB4YTEsIDB4YWUsIDB4YjksCS8qIDAgKi8KLQkgMHhjMiwgMHhjYiwgMHhkNCwgMHhkYiwgMHhlMywgMHhlYSwgMHhmMSwgMHhmOCwKKy8qIGdhbW1hIHRhYmxlIGZyb20gY2FtMTY5MC5pbmkgKi8KKwl7MHgwMCwgMHgwMCwgMHgwMSwgMHgwNCwgMHgwOCwgMHgwZSwgMHgxNiwgMHgyMSwJLyogMCAqLworCSAweDJlLCAweDNkLCAweDUwLCAweDY1LCAweDdkLCAweDk5LCAweGI4LCAweGRiLAogCSAweGZmfSwKLQl7MHgwMCwgMHgzMywgMHg1YSwgMHg3NSwgMHg4NSwgMHg5MywgMHhhMSwgMHhhZCwJLyogMSAqLwotCSAweGI3LCAweGMyLCAweGNiLCAweGQ0LCAweGRlLCAweGU3LCAweGYwLCAweGY3LAorCXsweDAwLCAweDAxLCAweDAzLCAweDA4LCAweDBlLCAweDE2LCAweDIxLCAweDJkLAkvKiAxICovCisJIDB4M2MsIDB4NGQsIDB4NjAsIDB4NzUsIDB4OGQsIDB4YTYsIDB4YzIsIDB4ZTEsCiAJIDB4ZmZ9LAotCXsweDAwLCAweDJmLCAweDUxLCAweDZiLCAweDdjLCAweDhhLCAweDk5LCAweGE2LAkvKiAyICovCi0JIDB4YjEsIDB4YmMsIDB4YzYsIDB4ZDAsIDB4ZGIsIDB4ZTQsIDB4ZWQsIDB4ZjYsCisJezB4MDAsIDB4MDEsIDB4MDUsIDB4MGIsIDB4MTIsIDB4MWMsIDB4MjgsIDB4MzUsCS8qIDIgKi8KKwkgMHg0NSwgMHg1NiwgMHg2OSwgMHg3ZSwgMHg5NSwgMHhhZCwgMHhjNywgMHhlMywKIAkgMHhmZn0sCi0JezB4MDAsIDB4MjksIDB4NDgsIDB4NjAsIDB4NzIsIDB4ODEsIDB4OTAsIDB4OWUsCS8qIDMgKi8KLQkgMHhhYSwgMHhiNSwgMHhiZiwgMHhjYiwgMHhkNiwgMHhlMSwgMHhlYiwgMHhmNSwKKwl7MHgwMCwgMHgwMiwgMHgwNywgMHgwZiwgMHgxOCwgMHgyNCwgMHgzMCwgMHgzZiwJLyogMyAqLworCSAweDRmLCAweDYxLCAweDczLCAweDg4LCAweDlkLCAweGI0LCAweGNkLCAweGU2LAogCSAweGZmfSwKLQl7MHgwMCwgMHgyMywgMHgzZiwgMHg1NSwgMHg2OCwgMHg3NywgMHg4NiwgMHg5NSwJLyogNCAqLwotCSAweGEyLCAweGFkLCAweGI5LCAweGM2LCAweGQyLCAweGRlLCAweGU5LCAweGY0LAorCXsweDAwLCAweDA0LCAweDBCLCAweDE1LCAweDIwLCAweDJkLCAweDNiLCAweDRhLAkvKiA0ICovCisJIDB4NWIsIDB4NmMsIDB4N2YsIDB4OTIsIDB4YTcsIDB4YmMsIDB4ZDIsIDB4ZTksCiAJIDB4ZmZ9LAotCXsweDAwLCAweDFiLCAweDMzLCAweDQ4LCAweDU5LCAweDY5LCAweDc5LCAweDg3LAkvKiA1ICovCi0JIDB4OTYsIDB4YTMsIDB4YjEsIDB4YmUsIDB4Y2MsIDB4ZGEsIDB4ZTcsIDB4ZjMsCisJezB4MDAsIDB4MDcsIDB4MTEsIDB4MTUsIDB4MjAsIDB4MmQsIDB4NDgsIDB4NTgsCS8qIDUgKi8KKwkgMHg2OCwgMHg3OSwgMHg4YiwgMHg5ZCwgMHhiMCwgMHhjNCwgMHhkNywgMHhlYywKIAkgMHhmZn0sCi0JezB4MDAsIDB4MDIsIDB4MTAsIDB4MjAsIDB4MzIsIDB4NDAsIDB4NTcsIDB4NjcsCS8qIDYgKi8KKwl7MHgwMCwgMHgwYywgMHgxYSwgMHgyOSwgMHgzOCwgMHg0NywgMHg1NywgMHg2NywJLyogNiAqLwogCSAweDc3LCAweDg4LCAweDk5LCAweGFhLCAweGJiLCAweGNjLCAweGRkLCAweGVlLAogCSAweGZmfSwKLQl7MHgwMCwgMHgwMiwgMHgxNCwgMHgyNiwgMHgzOCwgMHg0YSwgMHg2MCwgMHg3MCwJLyogNyAqLworCXsweDAwLCAweDEwLCAweDIwLCAweDMwLCAweDQwLCAweDUwLCAweDYwLCAweDcwLAkvKiA3ICovCiAJIDB4ODAsIDB4OTAsIDB4YTAsIDB4YjAsIDB4YzAsIDB4ZDAsIDB4ZTAsIDB4ZjAsCiAJIDB4ZmZ9LAotCXsweDAwLCAweDEwLCAweDIyLCAweDM1LCAweDQ3LCAweDVhLCAweDY5LCAweDc5LAkvKiA4ICovCi0JIDB4ODgsIDB4OTcsIDB4YTcsIDB4YjYsIDB4YzQsIDB4ZDMsIDB4ZTAsIDB4ZjAsCisJezB4MDAsIDB4MTUsIDB4MjcsIDB4MzgsIDB4NDksIDB4NTksIDB4NjksIDB4NzksCS8qIDggKi8KKwkgMHg4OCwgMHg5NywgMHhhNywgMHhiNiwgMHhjNCwgMHhkMywgMHhlMiwgMHhmMCwKIAkgMHhmZn0sCi0JezB4MDAsIDB4MTAsIDB4MjYsIDB4NDAsIDB4NTQsIDB4NjUsIDB4NzUsIDB4ODQsCS8qIDkgKi8KLQkgMHg5MywgMHhhMSwgMHhiMCwgMHhiZCwgMHhjYSwgMHhkNiwgMHhlMCwgMHhmMCwKKwl7MHgwMCwgMHgxYywgMHgzMCwgMHg0MywgMHg1NCwgMHg2NSwgMHg3NSwgMHg4NCwJLyogOSAqLworCSAweDkzLCAweGExLCAweGIwLCAweGJkLCAweGNhLCAweGQ4LCAweGU1LCAweGYyLAogCSAweGZmfSwKLQl7MHgwMCwgMHgxOCwgMHgyYiwgMHg0NCwgMHg2MCwgMHg3MCwgMHg4MCwgMHg4ZSwJLyogMTAgKi8KLQkgMHg5YywgMHhhYSwgMHhiNywgMHhjNCwgMHhkMCwgMHhkOCwgMHhlMiwgMHhmMCwKKwl7MHgwMCwgMHgyNCwgMHgzYiwgMHg0ZiwgMHg2MCwgMHg3MCwgMHg4MCwgMHg4ZSwJLyogMTAgKi8KKwkgMHg5YywgMHhhYSwgMHhiNywgMHhjNCwgMHhkMCwgMHhkYywgMHhlOCwgMHhmMywKIAkgMHhmZn0sCi0JezB4MDAsIDB4MWEsIDB4MzQsIDB4NTIsIDB4NjYsIDB4N2UsIDB4OGQsIDB4OWIsCS8qIDExICovCisJezB4MDAsIDB4MmEsIDB4M2MsIDB4NWQsIDB4NmUsIDB4N2UsIDB4OGQsIDB4OWIsCS8qIDExICovCiAJIDB4YTgsIDB4YjQsIDB4YzAsIDB4Y2IsIDB4ZDYsIDB4ZTEsIDB4ZWIsIDB4ZjUsCiAJIDB4ZmZ9LAogCXsweDAwLCAweDNmLCAweDVhLCAweDZlLCAweDdmLCAweDhlLCAweDljLCAweGE4LAkvKiAxMiAqLwpAQCAtNTc3LDEyICs1NzIsMTEgQEAKIAl9IGVsc2UgewogCQl1OCAqdG1wYnVmOwogCi0JCXRtcGJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJdG1wYnVmID0ga21lbWR1cChidWZmZXIsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdG1wYnVmKSB7CiAJCQllcnIoIk91dCBvZiBtZW1vcnkiKTsKIAkJCXJldHVybjsKIAkJfQotCQltZW1jcHkodG1wYnVmLCBidWZmZXIsIGxlbik7CiAJCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKIAkJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAogCQkJCTAsCkBAIC02MjUsNyArNjE5LDYgQEAKIAkJa2ZyZWUodG1wYnVmKTsKIH0KIAotLyogUmVwb3J0ZWQgYXMgT002ODAyKi8KIHN0YXRpYyB2b2lkIG9tNjgwMl9zZW5zb3JfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJaW50IGk7CkBAIC03MDMsMTIgKzY5NiwxMiBAQAogCXNkLT5hdXRvZ2FpbiA9IEFVVE9HQUlOX0RFRjsKIAlzZC0+bWlycm9yID0gTUlSUk9SX0RFRjsKIAlzZC0+ZnJlcSA9IEZSRVFfREVGOwotCXNkLT53aGl0ZWJhbGFuY2UgPSBXSElURV9CQUxBTkNFX0RFRjsKKwlzZC0+YXdiID0gQVdCX0RFRjsKIAlzZC0+c2hhcnBuZXNzID0gU0hBUlBORVNTX0RFRjsKIAlzZC0+ZWZmZWN0ID0gRUZGRUNUU19ERUY7Ci0Jc2QtPnJlZF9iYWxhbmNlID0gUkVEX0JBTEFOQ0VfREVGOwotCXNkLT5ibHVlX2JhbGFuY2UgPSBCTFVFX0JBTEFOQ0VfREVGOwotCXNkLT5nbG9iYWxfZ2FpbiA9IGdsb2JhbF9nYWluX0RFRjsKKwlzZC0+cmVkX2dhaW4gPSBSRURfR0FJTl9ERUY7CisJc2QtPmJsdWVfZ2FpbiA9IEJMVUVfR0FJTl9ERUY7CisJc2QtPmdyZWVuX2dhaW4gPSBHQUlOX0RFRiAqIDMgLSBSRURfR0FJTl9ERUYgLSBCTFVFX0dBSU5fREVGOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjEsNDAgKzc1NCw1OSBAQAogCXJlZ193X2l4YnVmKGdzcGNhX2RldiwgMHg5MCwKIAkJZ2FtbWFfdGFibGVbc2QtPmdhbW1hXSwgc2l6ZW9mIGdhbW1hX3RhYmxlWzBdKTsKIH0KLXN0YXRpYyB2b2lkIHNldGdsb2JhbGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewogCitzdGF0aWMgdm9pZCBzZXRSR0Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlyZWdfdyhnc3BjYV9kZXYsIChzZC0+cmVkX2JhbGFuY2UgIDw8IDgpICsgMHg4Nyk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAoc2QtPmJsdWVfYmFsYW5jZSA8PCA4KSArIDB4ODgpOwotCXJlZ193KGdzcGNhX2RldiwgKHNkLT5nbG9iYWxfZ2FpbiAgPDwgOCkgKyAweDg5KTsKKwl1OCBhbGxfZ2Fpbl9yZWdbNl0gPQorCQl7MHg4NywgMHgwMCwgMHg4OCwgMHgwMCwgMHg4OSwgMHgwMH07CisKKwlhbGxfZ2Fpbl9yZWdbMV0gPSBzZC0+cmVkX2dhaW47CisJYWxsX2dhaW5fcmVnWzNdID0gc2QtPmJsdWVfZ2FpbjsKKwlhbGxfZ2Fpbl9yZWdbNV0gPSBzZC0+Z3JlZW5fZ2FpbjsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBhbGxfZ2Fpbl9yZWcsIHNpemVvZiBhbGxfZ2Fpbl9yZWcpOwogfQogCi0vKiBHZW5lcmljIGZuYyBmb3Igci9iIGJhbGFuY2UsIGV4cG9zdXJlIGFuZCB3aGl0ZWJhbGFuY2UgKi8KLXN0YXRpYyB2b2lkIHNldGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorLyogR2VuZXJpYyBmbmMgZm9yIHIvYiBiYWxhbmNlLCBleHBvc3VyZSBhbmQgYXdiICovCitzdGF0aWMgdm9pZCBzZXRhd2Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1MTYgcmVnODA7CiAKLQkvKiBvbiB3aGl0ZWJhbGFuY2UgbGVhdmUgZGVmYXVsdHMgdmFsdWVzICovCi0JaWYgKHNkLT53aGl0ZWJhbGFuY2UpIHsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweDNjODApOwotCX0gZWxzZSB7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHgzODgwKTsKKwlyZWc4MCA9IChzZW5zb3JfZGF0YVtzZC0+c2Vuc29yXS5yZWc4MCA8PCA4KSB8IDB4ODA7CisKKwkvKiBvbiBhd2IgbGVhdmUgZGVmYXVsdHMgdmFsdWVzICovCisJaWYgKCFzZC0+YXdiKSB7CiAJCS8qIHNob3VkIHdlIHdhaXQgaGVyZS4uICovCi0JCS8qIHVwZGF0ZSBhbmQgcmVzZXQgJ2dsb2JhbCBnYWluJyB3aXRoIHdlYmNhbSBwYXJhbWV0ZXJzICovCi0JCXNkLT5yZWRfYmFsYW5jZSA9IHJlZ19yKGdzcGNhX2RldiwgMHgwMDg3KTsKLQkJc2QtPmJsdWVfYmFsYW5jZSA9IHJlZ19yKGdzcGNhX2RldiwgMHgwMDg4KTsKLQkJc2QtPmdsb2JhbF9nYWluID0gcmVnX3IoZ3NwY2FfZGV2LCAweDAwODkpOwotCQlzZXRnbG9iYWxnYWluKGdzcGNhX2Rldik7CisJCS8qIHVwZGF0ZSBhbmQgcmVzZXQgUkdCIGdhaW5zIHdpdGggd2ViY2FtIHZhbHVlcyAqLworCQlzZC0+cmVkX2dhaW4gPSByZWdfcihnc3BjYV9kZXYsIDB4MDA4Nyk7CisJCXNkLT5ibHVlX2dhaW4gPSByZWdfcihnc3BjYV9kZXYsIDB4MDA4OCk7CisJCXNkLT5ncmVlbl9nYWluID0gcmVnX3IoZ3NwY2FfZGV2LCAweDAwODkpOworCQlyZWc4MCAmPSB+MHgwNDAwOwkJLyogQVdCIG9mZiAqLwogCX0KLQorCXJlZ193KGdzcGNhX2RldiwgcmVnODApOworCXJlZ193KGdzcGNhX2RldiwgcmVnODApOwogfQogCi0KLQotc3RhdGljIHZvaWQgc2V0d2hpdGViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyB2b2lkIGluaXRfZ2FpbnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewotCXNldGJhbGFuY2UoZ3NwY2FfZGV2KTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTE2IHJlZzgwOworCXU4IGFsbF9nYWluX3JlZ1s4XSA9CisJCXsweDg3LCAweDAwLCAweDg4LCAweDAwLCAweDg5LCAweDAwLCAweDgwLCAweDAwfTsKKworCWFsbF9nYWluX3JlZ1sxXSA9IHNkLT5yZWRfZ2FpbjsKKwlhbGxfZ2Fpbl9yZWdbM10gPSBzZC0+Ymx1ZV9nYWluOworCWFsbF9nYWluX3JlZ1s1XSA9IHNkLT5ncmVlbl9nYWluOworCXJlZzgwID0gc2Vuc29yX2RhdGFbc2QtPnNlbnNvcl0ucmVnODA7CisJaWYgKCFzZC0+YXdiKQorCQlyZWc4MCAmPSB+MHgwNDsKKwlhbGxfZ2Fpbl9yZWdbN10gPSByZWc4MDsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBhbGxfZ2Fpbl9yZWcsIHNpemVvZiBhbGxfZ2Fpbl9yZWcpOworCisJcmVnX3coZ3NwY2FfZGV2LCAoc2QtPnJlZF9nYWluICA8PCA4KSArIDB4ODcpOworCXJlZ193KGdzcGNhX2RldiwgKHNkLT5ibHVlX2dhaW4gPDwgOCkgKyAweDg4KTsKKwlyZWdfdyhnc3BjYV9kZXYsIChzZC0+Z3JlZW5fZ2FpbiAgPDwgOCkgKyAweDg5KTsKIH0KIAogc3RhdGljIHZvaWQgc2V0c2hhcnBuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTgwNyw2ICs4MTksMzggQEAKIAlyZWdfdyhnc3BjYV9kZXYsIHJlZ190b193cml0ZSk7CiB9CiAKK3N0YXRpYyB2b2lkIHNldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCByZWc2NjsKKwl1OCBmcmVxWzRdID0geyAweDY2LCAweDAwLCAweGE4LCAweGU4IH07CisKKwlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKKwljYXNlIFNFTlNPUl9MVDE2OEc6CisJCWlmIChzZC0+ZnJlcSAhPSAwKQorCQkJZnJlcVszXSA9IDB4YTg7CisJCXJlZzY2ID0gMHg0MTsKKwkJYnJlYWs7CisJY2FzZSBTRU5TT1JfT002ODAyOgorCQlyZWc2NiA9IDB4Y2E7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlZzY2ID0gMHg0MDsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAoc2QtPmZyZXEpIHsKKwljYXNlIDA6CQkJCS8qIG5vIGZsaWNrZXIgKi8KKwkJZnJlcVszXSA9IDB4ZjA7CisJCWJyZWFrOworCWNhc2UgMjoJCQkJLyogNjBIeiAqLworCQlyZWc2NiAmPSB+MHg0MDsKKwkJYnJlYWs7CisJfQorCWZyZXFbMV0gPSByZWc2NjsKKworCXJlZ193X2J1Zihnc3BjYV9kZXYsIGZyZXEsIHNpemVvZiBmcmVxKTsKK30KKwogLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCiBzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewpAQCAtOTAxLDEzICs5NDUsOSBAQAogCXNldGdhbW1hKGdzcGNhX2Rldik7CiAJc2V0Y29sb3JzKGdzcGNhX2Rldik7CiAJc2V0c2hhcnBuZXNzKGdzcGNhX2Rldik7Ci0Jc2V0d2hpdGViYWxhbmNlKGdzcGNhX2Rldik7CisJaW5pdF9nYWlucyhnc3BjYV9kZXYpOworCXNldGZyZXEoZ3NwY2FfZGV2KTsKIAotCXJlZ193KGdzcGNhX2RldiwgMHgyMDg3KTsJLyogdGllZCB0byB3aGl0ZSBiYWxhbmNlPyAqLwotCXJlZ193KGdzcGNhX2RldiwgMHgyMDg4KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MjA4OSk7Ci0KLQlyZWdfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3ItPmRhdGE0LCBzaXplb2Ygc2Vuc29yLT5kYXRhNCk7CiAJcmVnX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yLT5kYXRhNSwgc2l6ZW9mIHNlbnNvci0+ZGF0YTUpOwogCXJlZ193X2J1Zihnc3BjYV9kZXYsIHNlbnNvci0+bnNldDgsIHNpemVvZiBzZW5zb3ItPm5zZXQ4KTsKIAlyZWdfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3ItPnN0cmVhbSwgc2l6ZW9mIHNlbnNvci0+c3RyZWFtKTsKQEAgLTkyNiwxNiArOTY2LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNldGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIHZvaWQgc2V0bWlycm9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0JdTggZmxpcGNtZFs4XSA9CisJdTggaGZsaXBjbWRbOF0gPQogCQl7MHg2MiwgMHgwNywgMHg2MywgMHgwMywgMHg2NCwgMHgwMCwgMHg2MCwgMHgwOX07CiAKIAlpZiAoc2QtPm1pcnJvcikKLQkJZmxpcGNtZFszXSA9IDB4MDE7CisJCWhmbGlwY21kWzNdID0gMHgwMTsKIAotCXJlZ193X2J1Zihnc3BjYV9kZXYsIGZsaXBjbWQsIHNpemVvZiBmbGlwY21kKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBoZmxpcGNtZCwgc2l6ZW9mIGhmbGlwY21kKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0ZWZmZWN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTk1NiwxNyArOTk2LDYgQEAKIAkJcmVnX3coZ3NwY2FfZGV2LCAweGZhYTYpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRsaWdodGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQl1OCBmcmVxWzRdID0geyAweDY2LCAweDQwLCAweGE4LCAweGU4IH07Ci0KLQlpZiAoc2QtPmZyZXEgPT0gMikJLyogNjBoeiAqLwotCQlmcmVxWzFdID0gMHgwMDsKLQotCXJlZ193X2J1Zihnc3BjYV9kZXYsIGZyZXEsIHNpemVvZiBmcmVxKTsKLX0KLQogLyogSXMgdGhpcyByZWFsbHkgbmVlZGVkPwogICogaSBhZGRlZCBzb21lIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciB0ZXN0IHdpdGggc29tZSB1c2VycyAqLwogc3RhdGljIHZvaWQgcG9sbF9zZW5zb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtOTc5LDkgKzEwMDgsNyBAQAogCXN0YXRpYyBjb25zdCB1OCBwb2xsMltdID0KIAkJezB4NjcsIDB4MDIsIDB4NjgsIDB4NzEsIDB4NjksIDB4NzIsIDB4NzIsIDB4YTksCiAJCSAweDczLCAweDAyLCAweDczLCAweDAyLCAweDYwLCAweDE0fTsKLQlzdGF0aWMgY29uc3QgdTggcG9sbDNbXSA9Ci0JCXsweDg3LCAweDNmLCAweDg4LCAweDIwLCAweDg5LCAweDJkfTsKLQlzdGF0aWMgY29uc3QgdTggcG9sbDRbXSA9CisJc3RhdGljIGNvbnN0IHU4IG5vaXNlMDNbXSA9CS8qIChzb21lIGRpZmZlcmVuY2VzIC8gbXMtZHJ2KSAqLwogCQl7MHhhNiwgMHgwYSwgMHhlYSwgMHhjZiwgMHhiZSwgMHgyNiwgMHhiMSwgMHg1ZiwKIAkJIDB4YTEsIDB4YjEsIDB4ZGEsIDB4NmIsIDB4ZGIsIDB4OTgsIDB4ZGYsIDB4MGMsCiAJCSAweGMyLCAweDgwLCAweGMzLCAweDEwfTsKQEAgLTk4OSw4ICsxMDE2LDcgQEAKIAlQREVCVUcoRF9TVFJFQU0sICJbU2Vuc29yIHJlcXVpcmVzIHBvbGxpbmddIik7CiAJcmVnX3dfYnVmKGdzcGNhX2RldiwgcG9sbDEsIHNpemVvZiBwb2xsMSk7CiAJcmVnX3dfYnVmKGdzcGNhX2RldiwgcG9sbDIsIHNpemVvZiBwb2xsMik7Ci0JcmVnX3dfYnVmKGdzcGNhX2RldiwgcG9sbDMsIHNpemVvZiBwb2xsMyk7Ci0JcmVnX3dfYnVmKGdzcGNhX2RldiwgcG9sbDQsIHNpemVvZiBwb2xsNCk7CisJcmVnX3dfYnVmKGdzcGNhX2Rldiwgbm9pc2UwMywgc2l6ZW9mIG5vaXNlMDMpOwogfQogCiBzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTEwMjUsMTIgKzEwNTEsNyBAQAogCWNhc2UgU0VOU09SX09NNjgwMjoKIAkJb202ODAyX3NlbnNvcl9pbml0KGdzcGNhX2Rldik7CiAJCWJyZWFrOwotCWNhc2UgU0VOU09SX0xUMTY4RzoKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfT1RIRVI6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0vKgljYXNlIFNFTlNPUl9UQVM1MTMwQTogKi8KKwljYXNlIFNFTlNPUl9UQVM1MTMwQToKIAkJaSA9IDA7CiAJCWZvciAoOzspIHsKIAkJCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRhczUxMzBhX3NlbnNvcl9pbml0W2ldLApAQCAtMTA0Nyw3ICsxMDY4LDcgQEAKIAkJYnJlYWs7CiAJfQogCXNlbnNvciA9ICZzZW5zb3JfZGF0YVtzZC0+c2Vuc29yXTsKLQlyZWdfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3ItPmRhdGE0LCBzaXplb2Ygc2Vuc29yLT5kYXRhNCk7CisJc2V0ZnJlcShnc3BjYV9kZXYpOwogCXJlZ19yKGdzcGNhX2RldiwgMHgwMDEyKTsKIAlyZWdfd19idWYoZ3NwY2FfZGV2LCB0Miwgc2l6ZW9mIHQyKTsKIAlyZWdfd19peGJ1Zihnc3BjYV9kZXYsIDB4YjMsIHQzLCBzaXplb2YgdDMpOwpAQCAtMTA4MCw3ICsxMTAxLDcgQEAKIAkJCXU4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCiAJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCiB7Ci0Jc3RhdGljIHU4IGZmZDlbXSA9IHsgMHhmZiwgMHhkOSB9OworCWludCBwa3RfdHlwZTsKIAogCWlmIChkYXRhWzBdID09IDB4NWEpIHsKIAkJLyogQ29udHJvbCBQYWNrZXQsIGFmdGVyIHRoaXMgY2FtZSB0aGUgaGVhZGVyIGFnYWluLApAQCAtMTA5MCw4NCArMTExMSw4OCBAQAogCX0KIAlkYXRhICs9IDI7CiAJbGVuIC09IDI7Ci0JaWYgKGRhdGFbMF0gPT0gMHhmZiAmJiBkYXRhWzFdID09IDB4ZDgpIHsKLQkJLyogZXh0cmEgYnl0ZXMuLi4uLiwgY291bGQgYmUgcHJvY2Vzc2VkIHRvbyBidXQgd291bGQgYmUKLQkJICogYSB3YXN0ZSBvZiB0aW1lLCByaWdodCBub3cgbGVhdmUgdGhlIGFwcGxpY2F0aW9uIGFuZAotCQkgKiBsaWJqcGVnIGRvIGl0IGZvciBvdXJzZXJsdmVzLi4gKi8KLQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCi0JCQkJCWZmZDksIDIpOwotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZGF0YVtsZW4gLSAyXSA9PSAweGZmICYmIGRhdGFbbGVuIC0gMV0gPT0gMHhkOSkgewotCQkvKiBKdXN0IGluIGNhc2UsIGkgaGF2ZSBzZWVuIHBhY2tldHMgd2l0aCB0aGUgbWFya2VyLAotCQkgKiBvdGhlcidzIGRvIG5vdCBpbmNsdWRlIGl0Li4uICovCi0JCWxlbiAtPSAyOwotCX0KLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7CisJaWYgKGRhdGFbMF0gPT0gMHhmZiAmJiBkYXRhWzFdID09IDB4ZDgpCisJCXBrdF90eXBlID0gRklSU1RfUEFDS0VUOworCWVsc2UgaWYgKGRhdGFbbGVuIC0gMl0gPT0gMHhmZiAmJiBkYXRhW2xlbiAtIDFdID09IDB4ZDkpCisJCXBrdF90eXBlID0gTEFTVF9QQUNLRVQ7CisJZWxzZQorCQlwa3RfdHlwZSA9IElOVEVSX1BBQ0tFVDsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBwa3RfdHlwZSwgZGF0YSwgbGVuKTsKIH0KIAotCi1zdGF0aWMgaW50IHNkX3NldGJsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3N0YXRpYyBpbnQgc2Rfc2V0Ymx1ZV9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCXNkLT5ibHVlX2JhbGFuY2UgPSB2YWw7CisJc2QtPmJsdWVfZ2FpbiA9IHZhbDsKIAlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCiAJCXJlZ193KGdzcGNhX2RldiwgKHZhbCA8PCA4KSArIDB4ODgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX2dldGJsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCitzdGF0aWMgaW50IHNkX2dldGJsdWVfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JKnZhbCA9IHNkLT5ibHVlX2JhbGFuY2U7CisJKnZhbCA9IHNkLT5ibHVlX2dhaW47CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2Rfc2V0cmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCitzdGF0aWMgaW50IHNkX3NldHJlZF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCXNkLT5yZWRfYmFsYW5jZSA9IHZhbDsKKwlzZC0+cmVkX2dhaW4gPSB2YWw7CiAJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQogCQlyZWdfdyhnc3BjYV9kZXYsICh2YWwgPDwgOCkgKyAweDg3KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX2dldHJlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3N0YXRpYyBpbnQgc2RfZ2V0cmVkX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCSp2YWwgPSBzZC0+cmVkX2JhbGFuY2U7CisJKnZhbCA9IHNkLT5yZWRfZ2FpbjsKIAlyZXR1cm4gMDsKIH0KIAotCi0KLXN0YXRpYyBpbnQgc2Rfc2V0Z2xvYmFsX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCitzdGF0aWMgaW50IHNkX3NldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXUxNiBwc2csIG5zZzsKIAotCXNkLT5nbG9iYWxfZ2FpbiA9IHZhbDsKKwlwc2cgPSBzZC0+cmVkX2dhaW4gKyBzZC0+Ymx1ZV9nYWluICsgc2QtPmdyZWVuX2dhaW47CisJbnNnID0gdmFsICogMzsKKwlzZC0+cmVkX2dhaW4gPSBzZC0+cmVkX2dhaW4gKiBuc2cgLyBwc2c7CisJaWYgKHNkLT5yZWRfZ2FpbiA+IDB4NDApCisJCXNkLT5yZWRfZ2FpbiA9IDB4NDA7CisJZWxzZSBpZiAoc2QtPnJlZF9nYWluIDwgMHgxMCkKKwkJc2QtPnJlZF9nYWluID0gMHgxMDsKKwlzZC0+Ymx1ZV9nYWluID0gc2QtPmJsdWVfZ2FpbiAqIG5zZyAvIHBzZzsKKwlpZiAoc2QtPmJsdWVfZ2FpbiA+IDB4NDApCisJCXNkLT5ibHVlX2dhaW4gPSAweDQwOworCWVsc2UgaWYgKHNkLT5ibHVlX2dhaW4gPCAweDEwKQorCQlzZC0+Ymx1ZV9nYWluID0gMHgxMDsKKwlzZC0+Z3JlZW5fZ2FpbiA9IHNkLT5ncmVlbl9nYWluICogbnNnIC8gcHNnOworCWlmIChzZC0+Z3JlZW5fZ2FpbiA+IDB4NDApCisJCXNkLT5ncmVlbl9nYWluID0gMHg0MDsKKwllbHNlIGlmIChzZC0+Z3JlZW5fZ2FpbiA8IDB4MTApCisJCXNkLT5ncmVlbl9nYWluID0gMHgxMDsKKwogCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0Z2xvYmFsZ2Fpbihnc3BjYV9kZXYpOwotCisJCXNldFJHQihnc3BjYV9kZXYpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX2dldGdsb2JhbF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3N0YXRpYyBpbnQgc2RfZ2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JKnZhbCA9IHNkLT5nbG9iYWxfZ2FpbjsKKwkqdmFsID0gKHNkLT5yZWRfZ2FpbiArIHNkLT5ibHVlX2dhaW4gKyBzZC0+Z3JlZW5fZ2FpbikgLyAzOwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC0xMTg2LDM1ICsxMjExLDM1IEBACiAJcmV0dXJuICp2YWw7CiB9CiAKLXN0YXRpYyBpbnQgc2Rfc2V0d2hpdGViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQorc3RhdGljIGludCBzZF9zZXRhd2Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0Jc2QtPndoaXRlYmFsYW5jZSA9IHZhbDsKKwlzZC0+YXdiID0gdmFsOwogCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0d2hpdGViYWxhbmNlKGdzcGNhX2Rldik7CisJCXNldGF3Yihnc3BjYV9kZXYpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX2dldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCitzdGF0aWMgaW50IHNkX2dldGF3YihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JKnZhbCA9IHNkLT53aGl0ZWJhbGFuY2U7CisJKnZhbCA9IHNkLT5hd2I7CiAJcmV0dXJuICp2YWw7CiB9CiAKLXN0YXRpYyBpbnQgc2Rfc2V0ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3N0YXRpYyBpbnQgc2Rfc2V0bWlycm9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXNkLT5taXJyb3IgPSB2YWw7CiAJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRmbGlwKGdzcGNhX2Rldik7CisJCXNldG1pcnJvcihnc3BjYV9kZXYpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX2dldGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQorc3RhdGljIGludCBzZF9nZXRtaXJyb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIApAQCAtMTMwMCw3ICsxMzI1LDcgQEAKIAogCXNkLT5mcmVxID0gdmFsOwogCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0bGlnaHRmcmVxKGdzcGNhX2Rldik7CisJCXNldGZyZXEoZ3NwY2FfZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM2OCw3ICsxMzkzLDggQEAKIAljYXNlIFY0TDJfQ0lEX0VGRkVDVFM6CiAJCWlmICgodW5zaWduZWQpIG1lbnUtPmluZGV4IDwgQVJSQVlfU0laRShlZmZlY3RzX2NvbnRyb2wpKSB7CiAJCQlzdHJuY3B5KChjaGFyICopIG1lbnUtPm5hbWUsCi0JCQkJZWZmZWN0c19jb250cm9sW21lbnUtPmluZGV4XSwgMzIpOworCQkJCWVmZmVjdHNfY29udHJvbFttZW51LT5pbmRleF0sCisJCQkJc2l6ZW9mIG1lbnUtPm5hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3R2ODUzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90djg1MzIuYwppbmRleCBjN2I2ZWIxLi5kOWM1YmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3R2ODUzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdHY4NTMyLmMKQEAgLTMwLDI5ICszMCw0NiBAQAogc3RydWN0IHNkIHsKIAlzdHJ1Y3QgZ3NwY2FfZGV2IGdzcGNhX2RldjsJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLwogCi0JX191MTYgYnJpZ2h0bmVzczsKKwlfX3UxNiBleHBvc3VyZTsKKwlfX3UxNiBnYWluOwogCiAJX191OCBwYWNrZXQ7CiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCi1zdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHNkX2N0cmxzW10gPSB7CiAJewogCSB7Ci0JICAuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCSAgLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCiAJICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAubmFtZSA9ICJCcmlnaHRuZXNzIiwKKwkgIC5uYW1lID0gIkV4cG9zdXJlIiwKIAkgIC5taW5pbXVtID0gMSwKLQkgIC5tYXhpbXVtID0gMHgxNWYsCS8qID0gMzUyIC0gMSAqLworCSAgLm1heGltdW0gPSAweDE4ZiwKIAkgIC5zdGVwID0gMSwKLSNkZWZpbmUgQlJJR0hUTkVTU19ERUYgMHgxNGMKLQkgIC5kZWZhdWx0X3ZhbHVlID0gQlJJR0hUTkVTU19ERUYsCisjZGVmaW5lIEVYUE9TVVJFX0RFRiAweDE4ZgorCSAgLmRlZmF1bHRfdmFsdWUgPSBFWFBPU1VSRV9ERUYsCiAJICB9LAotCSAuc2V0ID0gc2Rfc2V0YnJpZ2h0bmVzcywKLQkgLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCisJIC5zZXQgPSBzZF9zZXRleHBvc3VyZSwKKwkgLmdldCA9IHNkX2dldGV4cG9zdXJlLAorCSB9LAorCXsKKwkgeworCSAgLmlkID0gVjRMMl9DSURfR0FJTiwKKwkgIC50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgIC5uYW1lID0gIkdhaW4iLAorCSAgLm1pbmltdW0gPSAwLAorCSAgLm1heGltdW0gPSAweDdmZiwKKwkgIC5zdGVwID0gMSwKKyNkZWZpbmUgR0FJTl9ERUYgMHgxMDAKKwkgIC5kZWZhdWx0X3ZhbHVlID0gR0FJTl9ERUYsCisJICB9LAorCSAuc2V0ID0gc2Rfc2V0Z2FpbiwKKwkgLmdldCA9IHNkX2dldGdhaW4sCiAJIH0sCiB9OwogCkBAIC05Miw2ICsxMDksMTQgQEAKICNkZWZpbmUgUjE0X0FEX1JPV19CRUdJTkwgMHgxNAogI2RlZmluZSBSMTVfQURfUk9XQkVHSU5IICAweDE1CiAjZGVmaW5lIFIxQ19BRF9FWFBPU0VfVElNRUwgMHgxYworI2RlZmluZSBSMjBfR0FJTl9HMUwJMHgyMAorI2RlZmluZSBSMjFfR0FJTl9HMUgJMHgyMQorI2RlZmluZSBSMjJfR0FJTl9STAkweDIyCisjZGVmaW5lIFIyM19HQUlOX1JICTB4MjMKKyNkZWZpbmUgUjI0X0dBSU5fQkwJMHgyNAorI2RlZmluZSBSMjVfR0FJTl9CSAkweDI1CisjZGVmaW5lIFIyNl9HQUlOX0cyTAkweDI2CisjZGVmaW5lIFIyN19HQUlOX0cySAkweDI3CiAjZGVmaW5lIFIyOF9RVUFOVAkweDI4CiAjZGVmaW5lIFIyOV9MSU5FCTB4MjkKICNkZWZpbmUgUjJDX1BPTEFSSVRZCTB4MmMKQEAgLTEyOSwxOCArMTU0LDYgQEAKIAl7MHgwNSwgMHgwOSwgMHhmMX0sCiB9OwogCi1zdGF0aWMgaW50IHJlZ19yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJIF9fdTE2IGluZGV4KQotewotCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKLQkJCXVzYl9yY3ZjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCi0JCQkweDAzLAotCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkwLAkvKiB2YWx1ZSAqLwotCQkJaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKLQkJCTUwMCk7Ci0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKLX0KIAogLyogd3JpdGUgMSBieXRlICovCiBzdGF0aWMgdm9pZCByZWdfdzEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LApAQCAtMTgzLDcgKzE5Niw2IEBACiAJfQogCXJlZ193MShnc3BjYV9kZXYsIFIwN19UQUJMRV9MRU4sIGkpOwogCXJlZ193MShnc3BjYV9kZXYsIFIwMV9USU1JTkdfQ09OVFJPTF9MT1csIENNRF9FRXByb21fQ2xvc2UpOwotCW1zbGVlcCgxMCk7CiB9CiAKIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KQEAgLTE5Nyw1MyArMjA5LDEzIEBACiAJY2FtLT5jYW1fbW9kZSA9IHNpZl9tb2RlOwogCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShzaWZfbW9kZSk7CiAKLQlzZC0+YnJpZ2h0bmVzcyA9IEJSSUdIVE5FU1NfREVGOworCXNkLT5leHBvc3VyZSA9IEVYUE9TVVJFX0RFRjsKKwlzZC0+Z2FpbiA9IEdBSU5fREVGOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0dl84NTMyUmVhZFJlZ2lzdGVycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCi17Ci0JaW50IGk7Ci0Jc3RhdGljIHU4IHJlZ190YltdID0gewotCQlSMENfQURfV0lEVEhMLAotCQlSMERfQURfV0lEVEhILAotCQlSMjhfUVVBTlQsCi0JCVIyOV9MSU5FLAotCQlSMkNfUE9MQVJJVFksCi0JCVIyRF9QT0lOVCwKLQkJUjJFX1BPSU5USCwKLQkJUjJGX1BPSU5UQiwKLQkJUjMwX1BPSU5UQkgsCi0JCVIyQV9ISUdIX0JVREdFVCwKLQkJUjJCX0xPV19CVURHRVQsCi0JCVIzNF9WSUQsCi0JCVIzNV9WSURILAotCQlSMzZfUElELAotCQlSMzdfUElESCwKLQkJUjgzX0FEX0lESCwKLQkJUjEwX0FEX0NPTF9CRUdJTkwsCi0JCVIxMV9BRF9DT0xfQkVHSU5ILAotCQlSMTRfQURfUk9XX0JFR0lOTCwKLQkJUjE1X0FEX1JPV0JFR0lOSCwKLQkJMAotCX07Ci0KLQlpID0gMDsKLQlkbyB7Ci0JCXJlZ19yKGdzcGNhX2RldiwgcmVnX3RiW2ldKTsKLQkJaSsrOwotCX0gd2hpbGUgKHJlZ190YltpXSAhPSAwKTsKLX0KLQogc3RhdGljIHZvaWQgdHZfODUzMl9zZXRSZWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewotCXJlZ193MShnc3BjYV9kZXYsIFIxMF9BRF9DT0xfQkVHSU5MLCAweDQ0KTsKLQkJCQkJCS8qIGJlZ2luIGFjdGl2ZSBsaW5lICovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjExX0FEX0NPTF9CRUdJTkgsIDB4MDApOwotCQkJCQkJLyogbWlycm9yIGFuZCBkaWdpdGFsIGdhaW4gKi8KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMDBfUEFSVF9DT05UUk9MLCBMQVRFTlRfQ0hBTkdFIHwgRVhQT19DSEFOR0UpOwotCQkJCQkJLyogPSAweDg0ICovCi0KIAlyZWdfdzEoZ3NwY2FfZGV2LCBSM0JfVGVzdDMsIDB4MGEpOwkvKiBUZXN0MFNlbCA9IDEwICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlyZWdfdzEoZ3NwY2FfZGV2LCBSMEVfQURfSEVJR0hUTCwgMHg5MCk7CkBAIC0yNTUsMTAxICsyMjcsNDQgQEAKIAkJCQkJCS8qIG1pcnJvciBhbmQgZGlnaXRhbCBnYWluICovCiAJcmVnX3cxKGdzcGNhX2RldiwgUjE0X0FEX1JPV19CRUdJTkwsIDB4MGEpOwogCi0JcmVnX3cxKGdzcGNhX2RldiwgUjkxX0FEX1NMT1BFUkVHLCAweDAwKTsKIAlyZWdfdzEoZ3NwY2FfZGV2LCBSOTRfQURfQklUQ09OVFJPTCwgMHgwMik7Ci0KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMDFfVElNSU5HX0NPTlRST0xfTE9XLCBDTURfRUVwcm9tX0Nsb3NlKTsKLQogCXJlZ193MShnc3BjYV9kZXYsIFI5MV9BRF9TTE9QRVJFRywgMHgwMCk7CiAJcmVnX3cxKGdzcGNhX2RldiwgUjAwX1BBUlRfQ09OVFJPTCwgTEFURU5UX0NIQU5HRSB8IEVYUE9fQ0hBTkdFKTsKIAkJCQkJCS8qID0gMHg4NCAqLwogfQogCi1zdGF0aWMgdm9pZCB0dl84NTMyX1BvbGxSZWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCWludCBpOwotCi0JLyogc3RyYW5nZSBwb2xsaW5nIGZyb20gdGdjICovCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJcmVnX3cxKGdzcGNhX2RldiwgUjJDX1BPTEFSSVRZLCAweDEwKTsKLQkJcmVnX3cxKGdzcGNhX2RldiwgUjAwX1BBUlRfQ09OVFJPTCwKLQkJCQlMQVRFTlRfQ0hBTkdFIHwgRVhQT19DSEFOR0UpOwotCQlyZWdfdzEoZ3NwY2FfZGV2LCBSMzFfVVBELCAweDAxKTsKLQl9Ci19Ci0KIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSAqLwogc3RhdGljIGludCBzZF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAl0dl84NTMyV3JpdGVFRXByb20oZ3NwY2FfZGV2KTsKIAotCXJlZ193MShnc3BjYV9kZXYsIFI5MV9BRF9TTE9QRVJFRywgMHgzMik7CS8qIHNsb3BlIGJlZ2luIDEsN1YsCi0JCQkJCQkJICogc2xvcGUgcmF0ZSAyICovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjk0X0FEX0JJVENPTlRST0wsIDB4MDApOwotCXR2Xzg1MzJSZWFkUmVnaXN0ZXJzKGdzcGNhX2Rldik7Ci0JcmVnX3cxKGdzcGNhX2RldiwgUjNCX1Rlc3QzLCAweDBiKTsKLQlyZWdfdzIoZ3NwY2FfZGV2LCBSMEVfQURfSEVJR0hUTCwgMHgwMTkwKTsKLQlyZWdfdzIoZ3NwY2FfZGV2LCBSMUNfQURfRVhQT1NFX1RJTUVMLCAweDAxOGYpOwotCXJlZ193MShnc3BjYV9kZXYsIFIwQ19BRF9XSURUSEwsIDB4ZTgpOwotCXJlZ193MShnc3BjYV9kZXYsIFIwRF9BRF9XSURUSEgsIDB4MDMpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjI4X1FVQU5ULCAweDkwKTsKLQkJCQkJLyogbm8gY29tcHJlc3MgLSBmaXhlZCBRIC0gcXVhbnQgMCAqLwotCXJlZ193MShnc3BjYV9kZXYsIFIyOV9MSU5FLCAweDgxKTsKLQkJCQkJLyogMHg4NDsgLy8gQ0lGIHwgNCBwYWNrZXQgMHgyOSAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMkNfUE9MQVJJVFksIDB4MTApOwotCQkJCQkJLyogMHg0ODsgLy8weDA4OyAweDJjICovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjJEX1BPSU5ULCAweDE0KTsKLQkJCQkJCS8qIDB4Mzg7IDB4MmQgKi8KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMkVfUE9JTlRILCAweDAxKTsKLQkJCQkJCS8qIDB4MDQ7IDB4MmUgKi8KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMkZfUE9JTlRCLCAweDEyKTsKLQkJCQkJCS8qIDB4MDQ7IDB4MmYgKi8KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMzBfUE9JTlRCSCwgMHgwMSk7Ci0JCQkJCQkvKiAweDA0OyAweDMwICovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjAwX1BBUlRfQ09OVFJPTCwgTEFURU5UX0NIQU5HRSB8IEVYUE9fQ0hBTkdFKTsKLQkJCQkJCS8qIDB4MDA8LTB4ODQgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMzFfVVBELCAweDAxKTsJLyogdXBkYXRlIHJlZ2lzdGVycyAqLwotCW1zbGVlcCgyMDApOwotCXJlZ193MShnc3BjYV9kZXYsIFIzMV9VUEQsIDB4MDApOwkJLyogZW5kIHVwZGF0ZSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXR2Xzg1MzJfc2V0UmVnKGdzcGNhX2Rldik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjNCX1Rlc3QzLCAweDBiKTsJLyogVGVzdDBTZWwgPSAxMSA9IEdQSU8gKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl0dl84NTMyX3NldFJlZyhnc3BjYV9kZXYpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXR2Xzg1MzJfUG9sbFJlZyhnc3BjYV9kZXYpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyB2b2lkIHNldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlyZWdfdzIoZ3NwY2FfZGV2LCBSMUNfQURfRVhQT1NFX1RJTUVMLCBzZC0+YnJpZ2h0bmVzcyk7CisJcmVnX3cyKGdzcGNhX2RldiwgUjFDX0FEX0VYUE9TRV9USU1FTCwgc2QtPmV4cG9zdXJlKTsKIAlyZWdfdzEoZ3NwY2FfZGV2LCBSMDBfUEFSVF9DT05UUk9MLCBMQVRFTlRfQ0hBTkdFIHwgRVhQT19DSEFOR0UpOwogCQkJCQkJLyogMHg4NCAqLwogfQogCitzdGF0aWMgdm9pZCBzZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZWdfdzIoZ3NwY2FfZGV2LCBSMjBfR0FJTl9HMUwsIHNkLT5nYWluKTsKKwlyZWdfdzIoZ3NwY2FfZGV2LCBSMjJfR0FJTl9STCwgc2QtPmdhaW4pOworCXJlZ193Mihnc3BjYV9kZXYsIFIyNF9HQUlOX0JMLCBzZC0+Z2Fpbik7CisJcmVnX3cyKGdzcGNhX2RldiwgUjI2X0dBSU5fRzJMLCBzZC0+Z2Fpbik7Cit9CisKIC8qIC0tIHN0YXJ0IHRoZSBjYW1lcmEgLS0gKi8KIHN0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCXJlZ193MShnc3BjYV9kZXYsIFI5MV9BRF9TTE9QRVJFRywgMHgzMik7CS8qIHNsb3BlIGJlZ2luIDEsN1YsCi0JCQkJCQkJICogc2xvcGUgcmF0ZSAyICovCi0JcmVnX3cxKGdzcGNhX2RldiwgUjk0X0FEX0JJVENPTlRST0wsIDB4MDApOwotCXR2Xzg1MzJSZWFkUmVnaXN0ZXJzKGdzcGNhX2Rldik7Ci0JcmVnX3cxKGdzcGNhX2RldiwgUjNCX1Rlc3QzLCAweDBiKTsKLQotCXJlZ193Mihnc3BjYV9kZXYsIFIwRV9BRF9IRUlHSFRMLCAweDAxOTApOwotCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKLQogCXJlZ193MShnc3BjYV9kZXYsIFIwQ19BRF9XSURUSEwsIDB4ZTgpOwkJLyogMHgyMDsgMHgwYyAqLwogCXJlZ193MShnc3BjYV9kZXYsIFIwRF9BRF9XSURUSEgsIDB4MDMpOwogCkBAIC0zNzEsMTkgKzI4NiwxNSBAQAogCXJlZ193MShnc3BjYV9kZXYsIFIyRV9QT0lOVEgsIDB4MDEpOwogCXJlZ193MShnc3BjYV9kZXYsIFIyRl9QT0lOVEIsIDB4MTIpOwogCXJlZ193MShnc3BjYV9kZXYsIFIzMF9QT0lOVEJILCAweDAxKTsKLQlyZWdfdzEoZ3NwY2FfZGV2LCBSMDBfUEFSVF9DT05UUk9MLCBMQVRFTlRfQ0hBTkdFIHwgRVhQT19DSEFOR0UpOworCisJdHZfODUzMl9zZXRSZWcoZ3NwY2FfZGV2KTsKKworCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJc2V0Z2Fpbihnc3BjYV9kZXYpOworCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlyZWdfdzEoZ3NwY2FfZGV2LCBSMzFfVVBELCAweDAxKTsJLyogdXBkYXRlIHJlZ2lzdGVycyAqLwogCW1zbGVlcCgyMDApOwotCXJlZ193MShnc3BjYV9kZXYsIFIzMV9VUEQsIDB4MDApOwkJLyogZW5kIHVwZGF0ZSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdHZfODUzMl9zZXRSZWcoZ3NwY2FfZGV2KTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXJlZ193MShnc3BjYV9kZXYsIFIzQl9UZXN0MywgMHgwYik7CS8qIFRlc3QwU2VsID0gMTEgPSBHUElPICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl0dl84NTMyX3NldFJlZyhnc3BjYV9kZXYpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdHZfODUzMl9Qb2xsUmVnKGdzcGNhX2Rldik7CiAJcmVnX3cxKGdzcGNhX2RldiwgUjMxX1VQRCwgMHgwMCk7CS8qIGVuZCB1cGRhdGUgKi8KIAogCWdzcGNhX2Rldi0+ZW1wdHlfcGFja2V0ID0gMDsJCS8qIGNoZWNrIHRoZSBlbXB0eSBwYWNrZXRzICovCkBAIC00MjgsMjEgKzMzOSwzOSBAQAogCQkJZGF0YSArIGdzcGNhX2Rldi0+d2lkdGggKyA1LCBnc3BjYV9kZXYtPndpZHRoKTsKIH0KIAotc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQorc3RhdGljIGludCBzZF9zZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlzZC0+YnJpZ2h0bmVzcyA9IHZhbDsKKwlzZC0+ZXhwb3N1cmUgPSB2YWw7CiAJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CisJCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCitzdGF0aWMgaW50IHNkX2dldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQkqdmFsID0gc2QtPmJyaWdodG5lc3M7CisJKnZhbCA9IHNkLT5leHBvc3VyZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5nYWluID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0Z2Fpbihnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Z2FpbjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMKaW5kZXggNzMyYzNkZi4uMDMxMjY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jCkBAIC0yNzQ4LDExICsyNzQ4LDExIEBACiAJezB4YjMsIDB4MDQsIDB4MTUsIDB4Y2N9LAogCXsweGIzLCAweDIwLCAweDAwLCAweGNjfSwKIAl7MHhiMywgMHgyMSwgMHgwMCwgMHhjY30sCi0JezB4YjMsIDB4MjIsIDB4MDQsIDB4Y2N9LAorCXsweGIzLCAweDIyLCAweDA0LCAweGNjfSwJLyogc2Vuc29yIGhlaWdodCA9IDEwMjQgKi8KIAl7MHhiMywgMHgyMywgMHgwMCwgMHhjY30sCiAJezB4YjMsIDB4MTQsIDB4MDAsIDB4Y2N9LAogCXsweGIzLCAweDE1LCAweDAwLCAweGNjfSwKLQl7MHhiMywgMHgxNiwgMHgwNCwgMHhjY30sCisJezB4YjMsIDB4MTYsIDB4MDQsIDB4Y2N9LAkvKiBzZW5zb3Igd2lkdGggPSAxMjgwICovCiAJezB4YjMsIDB4MTcsIDB4ZmYsIDB4Y2N9LAogCXsweGIzLCAweDJjLCAweDAzLCAweGNjfSwKIAl7MHhiMywgMHgyZCwgMHg1NiwgMHhjY30sCkBAIC0yOTE5LDcgKzI5MTksNyBAQAogCXsweDAwLCAweDIwLCAweDExLCAweGFhfSwKIAl7MHgwMCwgMHgzMywgMHgzOCwgMHhhYX0sCiAJezB4MDAsIDB4YmIsIDB4MGQsIDB4YWF9LAotCXsweGIzLCAweDIyLCAweDAxLCAweGNjfSwKKwl7MHhiMywgMHgyMiwgMHgwMSwgMHhjY30sCS8qIGNoYW5nZSB0byA2NDB4NDgwICovCiAJezB4YjMsIDB4MjMsIDB4ZTAsIDB4Y2N9LAogCXsweGIzLCAweDE2LCAweDAyLCAweGNjfSwKIAl7MHhiMywgMHgxNywgMHg3ZiwgMHhjY30sCkBAIC0yOTM1LDcgKzI5MzUsNyBAQAogCXsweDAwLCAweDIwLCAweDMzLCAweGFhfSwKIAl7MHgwMCwgMHgzMywgMHgzOCwgMHhhYX0sCiAJezB4MDAsIDB4YmIsIDB4MGQsIDB4YWF9LAotCXsweGIzLCAweDIyLCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgyMiwgMHgwMCwgMHhjY30sCS8qIGNoYW5nZSB0byAzMjB4MjQwICovCiAJezB4YjMsIDB4MjMsIDB4ZjAsIDB4Y2N9LAogCXsweGIzLCAweDE2LCAweDAxLCAweGNjfSwKIAl7MHhiMywgMHgxNywgMHgzZiwgMHhjY30sCkBAIC0zMDY4LDM3ICszMDY4LDg0IEBACiB9OwogCiAvKiByZWFkICdsZW4nIGJ5dGVzIGluIGdzcGNhX2Rldi0+dXNiX2J1ZiAqLwotc3RhdGljIHZvaWQgcmVnX3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorc3RhdGljIHZvaWQgcmVnX3JfaShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCSAgdTE2IHJlcSwKIAkJICB1MTYgaW5kZXgsCiAJCSAgdTE2IGxlbikKIHsKLQl1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJaW50IHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAogCQkJdXNiX3JjdmN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKIAkJCXJlcSwKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJMSwJCQkvKiB2YWx1ZSAqLwogCQkJaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuLAogCQkJNTAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlQREVCVUcoRF9FUlIsICJyZWdfciBlcnIgJWQiLCByZXQpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CisJfQorfQorc3RhdGljIHZvaWQgcmVnX3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkgIHUxNiByZXEsCisJCSAgdTE2IGluZGV4LAorCQkgIHUxNiBsZW4pCit7CisJcmVnX3JfaShnc3BjYV9kZXYsIHJlcSwgaW5kZXgsIGxlbik7CisjaWZkZWYgR1NQQ0FfREVCVUcKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCWlmIChsZW4gPT0gMSkKKwkJUERFQlVHKERfVVNCSSwgIkdFVCAlMDJ4IDAwMDEgJTA0eCAlMDJ4IiwgcmVxLCBpbmRleCwKKwkJCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0pOworCWVsc2UKKwkJUERFQlVHKERfVVNCSSwgIkdFVCAlMDJ4IDAwMDEgJTA0eCAlMDJ4ICUwMnggJTAyeCIsCisJCQkJcmVxLCBpbmRleCwKKwkJCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0sCisJCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzFdLAorCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZlsyXSk7CisjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgcmVnX3coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIHJlZ193X2koc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkJICAgIHUxNiByZXEsCiAJCQkgICAgdTE2IHZhbHVlLAogCQkJICAgIHUxNiBpbmRleCkKIHsKLQl1c2JfY29udHJvbF9tc2coZGV2LAotCQkJdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJaW50IHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKIAkJCXJlcSwKIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwKIAkJCTUwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJUERFQlVHKERfRVJSLCAicmVnX3cgZXJyICVkIiwgcmV0KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCX0KK30KK3N0YXRpYyB2b2lkIHJlZ193KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICB1MTYgcmVxLAorCQkJICAgIHUxNiB2YWx1ZSwKKwkJCSAgICB1MTYgaW5kZXgpCit7CisjaWZkZWYgR1NQQ0FfREVCVUcKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCVBERUJVRyhEX1VTQk8sICJTRVQgJTAyeCAlMDR4ICUwNHgiLCByZXEsIHZhbHVlLCBpbmRleCk7CisjZW5kaWYKKwlyZWdfd19pKGdzcGNhX2RldiwgcmVxLCB2YWx1ZSwgaW5kZXgpOwogfQogCiBzdGF0aWMgdTE2IHJlYWRfc2Vuc29yX3JlZ2lzdGVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCQl1MTYgYWRkcmVzcykKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CiAJdTggbGRhdGEsIG1kYXRhLCBoZGF0YTsKIAlpbnQgcmV0cnkgPSA1MDsKIApAQCAtMzEwOCw4ICszMTU1LDggQEAKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CiAJCXJldHVybiAwOwogCX0KLQlyZWdfdyhkZXYsIDB4YTAsIGFkZHJlc3MsIDB4YjMzYSk7Ci0JcmVnX3coZGV2LCAweGEwLCAweDAyLCAweGIzMzkpOworCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgYWRkcmVzcywgMHhiMzNhKTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4MDIsIDB4YjMzOSk7CiAKIAlkbyB7CiAJCXJlZ19yKGdzcGNhX2RldiwgMHhhMSwgMHhiMzNiLCAxKTsKQEAgLTMxMzYsMTUgKzMxODMsMTUgQEAKIHN0YXRpYyBpbnQgdmMwMzJ4X3Byb2JlX3NlbnNvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKIAlpbnQgaSwgbjsKIAl1MTYgdmFsdWU7CiAJY29uc3Qgc3RydWN0IHNlbnNvcl9pbmZvICpwdHNlbnNvcl9pbmZvOwogCiAvKmZpeG1lOiBzaG91bGQgYWxzbyBjaGVjayB0aGUgb3RoZXIgc2Vuc29yIChiYWNrIG1pMTMyMF9zb2MsIGZyb250IG1jNTAxY2IpKi8KIAlpZiAoc2QtPmZsYWdzICYgRkxfU0FNU1VORykgewotCQlyZWdfdyhkZXYsIDB4YTAsIDB4MDEsIDB4YjMwMSk7Ci0JCXJlZ193KGRldiwgMHg4OSwgMHhmMGZmLCAweGZmZmYpOyAvKiBzZWxlY3QgdGhlIGJhY2sgc2Vuc29yICovCisJCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgMHgwMSwgMHhiMzAxKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDg5LCAweGYwZmYsIDB4ZmZmZik7CisJCQkJCQkvKiBzZWxlY3QgdGhlIGJhY2sgc2Vuc29yICovCiAJfQogCiAJcmVnX3IoZ3NwY2FfZGV2LCAweGExLCAweGJmY2YsIDEpOwpAQCAtMzE1OCwxMyArMzIwNSwxMyBAQAogCQluID0gQVJSQVlfU0laRSh2YzAzMjNfcHJvYmVfZGF0YSk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJcmVnX3coZGV2LCAweGEwLCAweDAyLCAweGIzMzQpOwotCQlyZWdfdyhkZXYsIDB4YTAsIHB0c2Vuc29yX2luZm8tPm0xLCAweGIzMDApOwotCQlyZWdfdyhkZXYsIDB4YTAsIHB0c2Vuc29yX2luZm8tPm0yLCAweGIzMDApOwotCQlyZWdfdyhkZXYsIDB4YTAsIDB4MDEsIDB4YjMwOCk7Ci0JCXJlZ193KGRldiwgMHhhMCwgMHgwYywgMHhiMzA5KTsKLQkJcmVnX3coZGV2LCAweGEwLCBwdHNlbnNvcl9pbmZvLT5JMmNBZGQsIDB4YjMzNSk7Ci0JCXJlZ193KGRldiwgMHhhMCwgcHRzZW5zb3JfaW5mby0+b3AsIDB4YjMwMSk7CisJCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgMHgwMiwgMHhiMzM0KTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCBwdHNlbnNvcl9pbmZvLT5tMSwgMHhiMzAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCBwdHNlbnNvcl9pbmZvLT5tMiwgMHhiMzAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCAweDAxLCAweGIzMDgpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4MGMsIDB4YjMwOSk7CisJCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgcHRzZW5zb3JfaW5mby0+STJjQWRkLCAweGIzMzUpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIHB0c2Vuc29yX2luZm8tPm9wLCAweGIzMDEpOwogCQl2YWx1ZSA9IHJlYWRfc2Vuc29yX3JlZ2lzdGVyKGdzcGNhX2RldiwgcHRzZW5zb3JfaW5mby0+SWRBZGQpOwogCQlpZiAodmFsdWUgPT0gMCAmJiBwdHNlbnNvcl9pbmZvLT5JZEFkZCA9PSAweDgyKQogCQkJdmFsdWUgPSByZWFkX3NlbnNvcl9yZWdpc3Rlcihnc3BjYV9kZXYsIDB4ODMpOwpAQCAtMzE5MiwyNiArMzIzOSwzMyBAQAogCQkJdTggcmVnLCBjb25zdCB1OCAqdmFsLAogCQkJdTggc2l6ZSkJCS8qIDEgb3IgMiAqLwogewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKIAlpbnQgcmV0cnk7CiAKLQlyZWdfcihnc3BjYV9kZXYsIDB4YTEsIDB4YjMzZiwgMSk7CisjaWZkZWYgR1NQQ0FfREVCVUcKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCWlmIChzaXplID09IDEpCisJCVBERUJVRyhEX1VTQk8sICJpMmNfdyAlMDJ4ICUwMngiLCByZWcsICp2YWwpOworCWVsc2UKKwkJUERFQlVHKERfVVNCTywgImkyY193ICUwMnggJTAyeCUwMngiLCByZWcsICp2YWwsIHZhbFsxXSk7CisjZW5kaWYKKwlyZWdfcl9pKGdzcGNhX2RldiwgMHhhMSwgMHhiMzNmLCAxKTsKIC8qZml4bWU6c2hvdWxkIGNoZWNrIGlmICghKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAmIDB4MDIpKSBlcnJvciovCi0JcmVnX3coZGV2LCAweGEwLCBzaXplLCAweGIzMzQpOwotCXJlZ193KGRldiwgMHhhMCwgcmVnLCAweGIzM2EpOwotCXJlZ193KGRldiwgMHhhMCwgdmFsWzBdLCAweGIzMzYpOworCXJlZ193X2koZ3NwY2FfZGV2LCAweGEwLCBzaXplLCAweGIzMzQpOworCXJlZ193X2koZ3NwY2FfZGV2LCAweGEwLCByZWcsIDB4YjMzYSk7CisJcmVnX3dfaShnc3BjYV9kZXYsIDB4YTAsIHZhbFswXSwgMHhiMzM2KTsKIAlpZiAoc2l6ZSA+IDEpCi0JCXJlZ193KGRldiwgMHhhMCwgdmFsWzFdLCAweGIzMzcpOwotCXJlZ193KGRldiwgMHhhMCwgMHgwMSwgMHhiMzM5KTsKKwkJcmVnX3dfaShnc3BjYV9kZXYsIDB4YTAsIHZhbFsxXSwgMHhiMzM3KTsKKwlyZWdfd19pKGdzcGNhX2RldiwgMHhhMCwgMHgwMSwgMHhiMzM5KTsKIAlyZXRyeSA9IDQ7CiAJZG8gewotCQlyZWdfcihnc3BjYV9kZXYsIDB4YTEsIDB4YjMzYiwgMSk7CisJCXJlZ19yX2koZ3NwY2FfZGV2LCAweGExLCAweGIzM2IsIDEpOwogCQlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdID09IDApCiAJCQlicmVhazsKIAkJbXNsZWVwKDIwKTsKIAl9IHdoaWxlICgtLXJldHJ5ID4gMCk7CiAJaWYgKHJldHJ5IDw9IDApCi0JCVBERUJVRyhEX0VSUiwgImkyY193cml0ZSBmYWlsZWQiKTsKKwkJUERFQlVHKERfRVJSLCAiaTJjX3dyaXRlIHRpbWVvdXQiKTsKIH0KIAogc3RhdGljIHZvaWQgcHV0X3RhYl90b19yZWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LApAQCAtMzIyMSwxMyArMzI3NSwxMiBAQAogCXUxNiBhZCA9IGFkZHI7CiAKIAlmb3IgKGogPSAwOyBqIDwgdGFic2l6ZTsgaisrKQotCQlyZWdfdyhnc3BjYV9kZXYtPmRldiwgMHhhMCwgdGFiW2pdLCBhZCsrKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCB0YWJbal0sIGFkKyspOwogfQogCiBzdGF0aWMgdm9pZCB1c2JfZXhjaGFuZ2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkJY29uc3QgdTggZGF0YVtdWzRdKQogewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKIAlpbnQgaSA9IDA7CiAKIAlmb3IgKDs7KSB7CkBAIC0zMjM1LDcgKzMyODgsNyBAQAogCQlkZWZhdWx0OgogCQkJcmV0dXJuOwogCQljYXNlIDB4Y2M6CQkJLyogbm9ybWFsIHdyaXRlICovCi0JCQlyZWdfdyhkZXYsIDB4YTAsIGRhdGFbaV1bMl0sCisJCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIGRhdGFbaV1bMl0sCiAJCQkJCShkYXRhW2ldWzBdKSA8PCA4IHwgZGF0YVtpXVsxXSk7CiAJCQlicmVhazsKIAkJY2FzZSAweGFhOgkJCS8qIGkyYyBvcCAqLwpAQCAtMzI1OSw3ICszMzEyLDYgQEAKIAkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OwogCXN0cnVjdCBjYW0gKmNhbTsKIAlpbnQgc2Vuc29yOwogCXN0YXRpYyB1OCBucGt0W10gPSB7CS8qIG51bWJlciBvZiBwYWNrZXRzIHBlciBJU09DIG1lc3NhZ2UgKi8KQEAgLTMzNjMsMTMgKzM0MTUsNiBAQAogCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9PVjc2NzApCiAJCXNkLT5mbGFncyB8PSBGTF9IRkxJUCB8IEZMX1ZGTElQOwogCi0JaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1ZDMDMyMSkgewotCQlyZWdfcihnc3BjYV9kZXYsIDB4OGEsIDAsIDMpOwotCQlyZWdfdyhkZXYsIDB4ODcsIDB4MDAsIDB4MGYwZik7Ci0KLQkJcmVnX3IoZ3NwY2FfZGV2LCAweDhiLCAwLCAzKTsKLQkJcmVnX3coZGV2LCAweDg4LCAweDAwLCAweDAyMDIpOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM3OCwxNSArMzQyMywyMSBAQAogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QT3h4eHgpIHsKLQkJcmVnX3IoZ3NwY2FfZGV2LCAweGExLCAweGIzMDAsIDEpOwotCQlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdICE9IDApIHsKLQkJCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweGEwLCAweDI2LCAweGIzMDApOwotCQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4YTAsIDB4MDQsIDB4YjMwMCk7Ci0JCQlyZWdfdyhnc3BjYV9kZXYtPmRldiwgMHhhMCwgMHgwMCwgMHhiMzAwKTsKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVkMwMzIxKSB7CisJCXJlZ19yKGdzcGNhX2RldiwgMHg4YSwgMCwgMyk7CisJCXJlZ193KGdzcGNhX2RldiwgMHg4NywgMHgwMCwgMHgwZjBmKTsKKwkJcmVnX3IoZ3NwY2FfZGV2LCAweDhiLCAwLCAzKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDg4LCAweDAwLCAweDAyMDIpOworCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfUE94eHh4KSB7CisJCQlyZWdfcihnc3BjYV9kZXYsIDB4YTEsIDB4YjMwMCwgMSk7CisJCQlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdICE9IDApIHsKKwkJCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4MjYsIDB4YjMwMCk7CisJCQkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCAweDA0LCAweGIzMDApOworCQkJCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgMHgwMCwgMHhiMzAwKTsKKwkJCX0KIAkJfQogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogfQogCiBzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTM1MTYsMTcgKzM1NjcsMTcgQEAKIAogLypmaXhtZTogYmFjayBzZW5zb3Igb25seSovCiAJaWYgKHNkLT5mbGFncyAmIEZMX1NBTVNVTkcpIHsKLQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4ODksIDB4ZjBmZiwgMHhmZmZmKTsKLQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4YTksIDB4ODM0OCwgMHgwMDBlKTsKLQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4YTksIDB4MDAwMCwgMHgwMDFhKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDg5LCAweGYwZmYsIDB4ZmZmZik7CisJCXJlZ193KGdzcGNhX2RldiwgMHhhOSwgMHg4MzQ4LCAweDAwMGUpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTksIDB4MDAwMCwgMHgwMDFhKTsKIAl9CiAKIAkvKiBBc3N1bWUgc3RhcnQgdXNlIHRoZSBnb29kIHJlc29sdXRpb24gZnJvbSBnc3BjYV9kZXYtPm1vZGUgKi8KIAlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVkMwMzIxKSB7Ci0JCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweGEwLCAweGZmLCAweGJmZWMpOwotCQlyZWdfdyhnc3BjYV9kZXYtPmRldiwgMHhhMCwgMHhmZiwgMHhiZmVkKTsKLQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4YTAsIDB4ZmYsIDB4YmZlZSk7Ci0JCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweGEwLCAweGZmLCAweGJmZWYpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4ZmYsIDB4YmZlYyk7CisJCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgMHhmZiwgMHhiZmVkKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCAweGZmLCAweGJmZWUpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4ZmYsIDB4YmZlZik7CiAJCXNkLT5pbWFnZV9vZmZzZXQgPSA0NjsKIAl9IGVsc2UgewogCQlpZiAoZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnBpeGVsZm9ybWF0CkBAIC0zNjE3LDcgKzM2NjgsNyBAQAogCQkJaW5pdCA9IHBveHh4eF9pbml0VkdBOwogCQl1c2JfZXhjaGFuZ2UoZ3NwY2FfZGV2LCBpbml0KTsKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDhjLCAweDAwMDAsIDMpOwotCQlyZWdfdyhnc3BjYV9kZXYtPmRldiwgMHhhMCwKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLAogCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZlsyXSAmIDEgPyAwIDogMSwKIAkJCQkweGIzNWMpOwogCQltc2xlZXAoMzAwKTsKQEAgLTM2MzUsMTAgKzM2ODYsMTAgQEAKIAkJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJCWNhc2UgU0VOU09SX1BPMTIwMDoKIAkJY2FzZSBTRU5TT1JfSFY3MTMxUjoKLQkJCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweDg5LCAweDA0MDAsIDB4MTQxNSk7CisJCQlyZWdfdyhnc3BjYV9kZXYsIDB4ODksIDB4MDQwMCwgMHgxNDE1KTsKIAkJCWJyZWFrOwogCQljYXNlIFNFTlNPUl9NSTEzMTBfU09DOgotCQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4ODksIDB4MDU4YywgMHgwMDAwKTsKKwkJCXJlZ193KGdzcGNhX2RldiwgMHg4OSwgMHgwNThjLCAweDAwMDApOwogCQkJYnJlYWs7CiAJCX0KIAkJbXNsZWVwKDEwMCk7CkBAIC0zNjQ4LDkgKzM2OTksOSBAQAogCX0KIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKIAljYXNlIFNFTlNPUl9PVjc2NzA6Ci0JCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweDg3LCAweGZmZmYsIDB4ZmZmZik7Ci0JCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweDg4LCAweGZmMDAsIDB4ZjBmMSk7Ci0JCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweGEwLCAweDAwMDAsIDB4YmZmZik7CisJCXJlZ193KGdzcGNhX2RldiwgMHg4NywgMHhmZmZmLCAweGZmZmYpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4ODgsIDB4ZmYwMCwgMHhmMGYxKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCAweDAwMDAsIDB4YmZmZik7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX1BPeHh4eDoKIAkJc2V0Y29sb3JzKGdzcGNhX2Rldik7CkBAIC0zNjU5LDUxICszNzEwLDQ5IEBACiAKIAkJLyogbGVkIG9uICovCiAJCW1zbGVlcCg4MCk7Ci0JCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweDg5LCAweGZmZmYsIDB4ZmRmZik7CisJCXJlZ193KGdzcGNhX2RldiwgMHg4OSwgMHhmZmZmLCAweGZkZmYpOwogCQl1c2JfZXhjaGFuZ2UoZ3NwY2FfZGV2LCBwb3h4eHhfaW5pdF9lbmRfMik7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogfQogCiBzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOU09SX01JMTMxMF9TT0M6Ci0JCXJlZ193KGRldiwgMHg4OSwgMHgwNThjLCAweDAwZmYpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4ODksIDB4MDU4YywgMHgwMGZmKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfUE94eHh4OgogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJaWYgKCEoc2QtPmZsYWdzICYgRkxfU0FNU1VORykpCi0JCQlyZWdfdyhkZXYsIDB4ODksIDB4ZmZmZiwgMHhmZmZmKTsKKwkJCXJlZ193KGdzcGNhX2RldiwgMHg4OSwgMHhmZmZmLCAweGZmZmYpOwogCQlicmVhazsKIAl9Ci0JcmVnX3coZGV2LCAweGEwLCAweDAxLCAweGIzMDEpOwotCXJlZ193KGRldiwgMHhhMCwgMHgwOSwgMHhiMDAzKTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4MDEsIDB4YjMwMSk7CisJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCAweDA5LCAweGIwMDMpOwogfQogCiAvKiBjYWxsZWQgb24gc3RyZWFtb2ZmIHdpdGggYWx0IDAgYW5kIG9uIGRpc2Nvbm5lY3QgKi8KIHN0YXRpYyB2b2lkIHNkX3N0b3AwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJaWYgKCFnc3BjYV9kZXYtPnByZXNlbnQpCiAJCXJldHVybjsKIC8qZml4bWU6IGlzIHRoaXMgdXNlZnVsPyovCiAJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX01JMTMxMF9TT0MpCi0JCXJlZ193KGRldiwgMHg4OSwgMHgwNThjLCAweDAwZmYpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4ODksIDB4MDU4YywgMHgwMGZmKTsKIAllbHNlIGlmICghKHNkLT5mbGFncyAmIEZMX1NBTVNVTkcpKQotCQlyZWdfdyhkZXYsIDB4ODksIDB4ZmZmZiwgMHhmZmZmKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDg5LCAweGZmZmYsIDB4ZmZmZik7CiAKIAlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfUE94eHh4KSB7Ci0JCXJlZ193KGRldiwgMHhhMCwgMHgyNiwgMHhiMzAwKTsKLQkJcmVnX3coZGV2LCAweGEwLCAweDA0LCAweGIzMDApOwotCQlyZWdfdyhkZXYsIDB4YTAsIDB4MDAsIDB4YjMwMCk7CisJCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgMHgyNiwgMHhiMzAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCAweDA0LCAweGIzMDApOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YTAsIDB4MDAsIDB4YjMwMCk7CiAJfQogfQogCkBAIC0zNzI2LDE3ICszNzc1LDEyIEBACiAJLyogVGhlIHZjMDMyMSBzZW5kcyBzb21lIGFkZGl0aW9uYWwgZGF0YSBhZnRlciBzZW5kaW5nIHRoZSBjb21wbGV0ZQogCSAqIGZyYW1lLCB3ZSBpZ25vcmUgdGhpcy4gKi8KIAlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVkMwMzIxKSB7Ci0JCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7Ci0JCWludCBsOworCQlpbnQgc2l6ZSwgbDsKIAotCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7Ci0JCWlmIChmcmFtZSA9PSBOVUxMKSB7Ci0JCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQkJCXJldHVybjsKLQkJfQotCQlsID0gZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGE7Ci0JCWlmIChsZW4gPiBmcmFtZS0+djRsMl9idWYubGVuZ3RoIC0gbCkKLQkJCWxlbiA9IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGggLSBsOworCQlsID0gZ3NwY2FfZGV2LT5pbWFnZV9sZW47CisJCXNpemUgPSBnc3BjYV9kZXYtPmZyc3o7CisJCWlmIChsZW4gPiBzaXplIC0gbCkKKwkJCWxlbiA9IHNpemUgLSBsOwogCX0KIAlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGRhdGEsIGxlbik7CiB9CkBAIC0zNzQ4LDcgKzM3OTIsNyBAQAogCXNkLT5icmlnaHRuZXNzID0gdmFsOwogCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKIAkJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOwotCXJldHVybiAwOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0zNzY2LDcgKzM4MTAsNyBAQAogCXNkLT5jb250cmFzdCA9IHZhbDsKIAlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCiAJCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIH0KIAogc3RhdGljIGludCBzZF9nZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0zNzg0LDcgKzM4MjgsNyBAQAogCXNkLT5jb2xvcnMgPSB2YWw7CiAJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQogCQlzZXRjb2xvcnMoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogfQogCiBzdGF0aWMgaW50IHNkX2dldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0zODAyLDcgKzM4NDYsNyBAQAogCXNkLT5oZmxpcCA9IHZhbDsKIAlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCiAJCXNldGh2ZmxpcChnc3BjYV9kZXYpOwotCXJldHVybiAwOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2RfZ2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMzgyMCw3ICszODY0LDcgQEAKIAlzZC0+dmZsaXAgPSB2YWw7CiAJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQogCQlzZXRodmZsaXAoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogfQogCiBzdGF0aWMgaW50IHNkX2dldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTM4MzgsNyArMzg4Miw3IEBACiAJc2QtPmxpZ2h0ZnJlcSA9IHZhbDsKIAlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCiAJCXNldGxpZ2h0ZnJlcShnc3BjYV9kZXYpOwotCXJldHVybiAwOworCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2RfZ2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0zODU2LDcgKzM5MDAsNyBAQAogCXNkLT5zaGFycG5lc3MgPSB2YWw7CiAJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQogCQlzZXRzaGFycG5lc3MoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogfQogCiBzdGF0aWMgaW50IHNkX2dldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3c5OTZYY2YuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evdzk5NlhjZi5jCmluZGV4IDJmZmZlMjAuLjM4YTY4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evdzk5NlhjZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evdzk5NlhjZi5jCkBAIC0zMSwxNCArMzEsMTAgQEAKICAgIHRoZSBzZW5zb3IgZHJpdmVycyB0byB2NGwyIHN1YiBkcml2ZXJzLCBhbmQgcHJvcGVybHkgc3BsaXQgb2YgdGhpcwogICAgZHJpdmVyIGZyb20gb3Y1MTkuYyAqLwogCi0vKiBUaGUgQ09ORVhfQ0FNIGRlZmluZSBmb3IganBlZy5oIG5lZWRzIHJlbmFtaW5nLCBub3cgaXRzIHVzZWQgaGVyZSB0b28gKi8KLSNkZWZpbmUgQ09ORVhfQ0FNCi0jaW5jbHVkZSAianBlZy5oIgotCiAjZGVmaW5lIFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSAgICA0IC8qIGRlbGF5IGluIHVzIGZvciBJMkMgYml0IHIvdyBvcGVyYXRpb25zICovCiAKLSNkZWZpbmUgWV9RVUFOVEFCTEUgKHNkLT5qcGVnX2hkciArIEpQRUdfUVQwX09GRlNFVCkKLSNkZWZpbmUgVVZfUVVBTlRBQkxFIChzZC0+anBlZ19oZHIgKyBKUEVHX1FUMV9PRkZTRVQpCisjZGVmaW5lIFlfUVVBTlRBQkxFICgmc2QtPmpwZWdfaGRyW0pQRUdfUVQwX09GRlNFVF0pCisjZGVmaW5lIFVWX1FVQU5UQUJMRSAoJnNkLT5qcGVnX2hkcltKUEVHX1FUMV9PRkZTRVRdKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB3OTk2OGNmX3ZnYV9tb2RlW10gPSB7CiAJezE2MCwgMTIwLCBWNEwyX1BJWF9GTVRfVVlWWSwgVjRMMl9GSUVMRF9OT05FLApAQCAtNTA5LDExICs1MDUsNiBAQAogCWlmICh3OTk2OGNmX3ZnYV9tb2RlW3NkLT5nc3BjYV9kZXYuY3Vycl9tb2RlXS5waXhlbGZvcm1hdCA9PQogCSAgICBWNEwyX1BJWF9GTVRfSlBFRykgewogCQkvKiBXZSBtYXkgZ2V0IGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAodXNiIGlzb2MgYncgbmVnb3RpYXQuKSAqLwotCQlpZiAoIXNkLT5qcGVnX2hkcikKLQkJCXNkLT5qcGVnX2hkciA9IGttYWxsb2MoSlBFR19IRFJfU1osIEdGUF9LRVJORUwpOwotCQlpZiAoIXNkLT5qcGVnX2hkcikKLQkJCXJldHVybiAtRU5PTUVNOwotCiAJCWpwZWdfZGVmaW5lKHNkLT5qcGVnX2hkciwgc2QtPmdzcGNhX2Rldi5oZWlnaHQsCiAJCQkgICAgc2QtPmdzcGNhX2Rldi53aWR0aCwgMHgyMik7IC8qIEpQRUcgNDIwICovCiAJCWpwZWdfc2V0X3F1YWwoc2QtPmpwZWdfaGRyLCBzZC0+cXVhbGl0eSk7CkBAIC01NjIsOSArNTUzLDYgQEAKIAkJcmVnX3coc2QsIDB4MzksIDB4MDAwMCk7IC8qIGRpc2FibGUgSlBFRyBlbmNvZGVyICovCiAJCXJlZ193KHNkLCAweDE2LCAweDAwMDApOyAvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KIAl9Ci0KLQlrZnJlZShzZC0+anBlZ19oZHIpOwotCXNkLT5qcGVnX2hkciA9IE5VTEw7CiB9CiAKIC8qIFRoZSB3OTk2OGNmIGRvY3Mgc2F5IHRoYXQgYSAwIHNpemVkIHBhY2tldCBtZWFucyBFT0YgKGFuZCBhbHNvIFNPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jCmluZGV4IGQwMmFhNWMuLjQ0NzNmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgTU9EVUxFX05BTUUgInpjM3h4IgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiZ3NwY2EuaCIKICNpbmNsdWRlICJqcGVnLmgiCiAKQEAgLTQwLDE1ICszOSwxNiBAQAogc3RydWN0IHNkIHsKIAlzdHJ1Y3QgZ3NwY2FfZGV2IGdzcGNhX2RldjsJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLwogCisJdTggYnJpZ2h0bmVzczsKIAl1OCBjb250cmFzdDsKIAl1OCBnYW1tYTsKIAl1OCBhdXRvZ2FpbjsKIAl1OCBsaWdodGZyZXE7CiAJdTggc2hhcnBuZXNzOwogCXU4IHF1YWxpdHk7CQkJLyogaW1hZ2UgcXVhbGl0eSAqLwotI2RlZmluZSBRVUFMSVRZX01JTiA0MAotI2RlZmluZSBRVUFMSVRZX01BWCA2MAotI2RlZmluZSBRVUFMSVRZX0RFRiA1MAorI2RlZmluZSBRVUFMSVRZX01JTiA1MAorI2RlZmluZSBRVUFMSVRZX01BWCA4MAorI2RlZmluZSBRVUFMSVRZX0RFRiA3MAogCiAJdTggc2Vuc29yOwkJLyogVHlwZSBvZiBpbWFnZSBzZW5zb3IgY2hpcCAqLwogLyogISEgdmFsdWVzIHVzZWQgaW4gZGlmZmVyZW50IHRhYmxlcyAqLwpAQCAtNzUsMTAgKzc1LDEyIEBACiAjZGVmaW5lIFNFTlNPUl9NQVggMTkKIAl1bnNpZ25lZCBzaG9ydCBjaGlwX3JldmlzaW9uOwogCi0JdTggKmpwZWdfaGRyOworCXU4IGpwZWdfaGRyW0pQRUdfSERSX1NaXTsKIH07CiAKIC8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIHN0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwogc3RhdGljIGludCBzZF9nZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIGludCBzZF9zZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CkBAIC05Myw2ICs5NSwyMCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHNkX2N0cmxzW10gPSB7CiAJewogCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDI1NSwKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBCUklHSFRORVNTX0RFRiAxMjgKKwkJLmRlZmF1bHRfdmFsdWUgPSBCUklHSFRORVNTX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGJyaWdodG5lc3MsCisJICAgIC5nZXQgPSBzZF9nZXRicmlnaHRuZXNzLAorCX0sCisJeworCSAgICB7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkJLm5hbWUgICAgPSAiQ29udHJhc3QiLApAQCAtMTMyLDcgKzE0OCw3IEBACiAJICAgIC5zZXQgPSBzZF9zZXRhdXRvZ2FpbiwKIAkgICAgLmdldCA9IHNkX2dldGF1dG9nYWluLAogCX0sCi0jZGVmaW5lIExJR0hURlJFUV9JRFggMworI2RlZmluZSBMSUdIVEZSRVFfSURYIDQKIAl7CiAJICAgIHsKIAkJLmlkCSA9IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLApAQCAtNjAxMSw5ICs2MDI3LDEyIEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKIAljb25zdCB1OCAqVGdhbW1hOwotCWludCBnLCBpLCBrLCBhZGosIGdwOworCWludCBnLCBpLCBicmlnaHRuZXNzLCBjb250cmFzdCwgYWRqLCBncDEsIGdwMjsKIAl1OCBnclsxNl07Ci0Jc3RhdGljIGNvbnN0IHU4IGRlbHRhX3RiWzE2XSA9CQkvKiBkZWx0YSBmb3IgY29udHJhc3QgKi8KKwlzdGF0aWMgY29uc3QgdTggZGVsdGFfYlsxNl0gPQkJLyogZGVsdGEgZm9yIGJyaWdodG5lc3MgKi8KKwkJezB4NTAsIDB4MzgsIDB4MmQsIDB4MjgsIDB4MjQsIDB4MjEsIDB4MWUsIDB4MWQsCisJCSAweDFkLCAweDFiLCAweDFiLCAweDFiLCAweDE5LCAweDE4LCAweDE4LCAweDE4fTsKKwlzdGF0aWMgY29uc3QgdTggZGVsdGFfY1sxNl0gPQkJLyogZGVsdGEgZm9yIGNvbnRyYXN0ICovCiAJCXsweDJjLCAweDFhLCAweDEyLCAweDBjLCAweDBhLCAweDA2LCAweDA2LCAweDA2LAogCQkgMHgwNCwgMHgwNiwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMiwgMHgwMn07CiAJc3RhdGljIGNvbnN0IHU4IGdhbW1hX3RiWzZdWzE2XSA9IHsKQEAgLTYwMzMsMzAgKzYwNTIsMzAgQEAKIAogCVRnYW1tYSA9IGdhbW1hX3RiW3NkLT5nYW1tYSAtIDFdOwogCi0JayA9ICgoaW50KSBzZC0+Y29udHJhc3QgLSAxMjgpOwkJLyogLTEyOCAvIDEyOCAqLworCWNvbnRyYXN0ID0gKChpbnQpIHNkLT5jb250cmFzdCAtIDEyOCk7CQkvKiAtMTI4IC8gMTI3ICovCisJYnJpZ2h0bmVzcyA9ICgoaW50KSBzZC0+YnJpZ2h0bmVzcyAtIDEyOCk7CS8qIC0xMjggLyA5MiAqLwogCWFkaiA9IDA7Ci0JZ3AgPSAwOworCWdwMSA9IGdwMiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJZyA9IFRnYW1tYVtpXSAtIGRlbHRhX3RiW2ldICogayAvIDI1NiAtIGFkaiAvIDI7CisJCWcgPSBUZ2FtbWFbaV0gKyBkZWx0YV9iW2ldICogYnJpZ2h0bmVzcyAvIDI1NgorCQkJCS0gZGVsdGFfY1tpXSAqIGNvbnRyYXN0IC8gMjU2IC0gYWRqIC8gMjsKIAkJaWYgKGcgPiAweGZmKQogCQkJZyA9IDB4ZmY7CiAJCWVsc2UgaWYgKGcgPCAwKQogCQkJZyA9IDA7CiAJCXJlZ193KGRldiwgZywgMHgwMTIwICsgaSk7CS8qIGdhbW1hICovCi0JCWlmIChrID4gMCkKKwkJaWYgKGNvbnRyYXN0ID4gMCkKIAkJCWFkai0tOwotCQllbHNlCisJCWVsc2UgaWYgKGNvbnRyYXN0IDwgMCkKIAkJCWFkaisrOwotCi0JCWlmIChpICE9IDApIHsKLQkJCWlmIChncCA9PSAwKQotCQkJCWdyW2kgLSAxXSA9IDA7Ci0JCQllbHNlCi0JCQkJZ3JbaSAtIDFdID0gZyAtIGdwOwotCQl9Ci0JCWdwID0gZzsKKwkJaWYgKGkgPiAxKQorCQkJZ3JbaSAtIDFdID0gKGcgLSBncDIpIC8gMjsKKwkJZWxzZSBpZiAoaSAhPSAwKQorCQkJZ3JbMF0gPSBncDEgPT0gMCA/IDAgOiAoZyAtIGdwMSk7CisJCWdwMiA9IGdwMTsKKwkJZ3AxID0gZzsKIAl9Ci0JZ3JbMTVdID0gZ3JbMTRdIC8gMjsKKwlnclsxNV0gPSAoMHhmZiAtIGdwMikgLyAyOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlyZWdfdyhkZXYsIGdyW2ldLCAweDAxMzAgKyBpKTsJLyogZ3JhZGllbnQgKi8KIH0KQEAgLTY3NDQsNiArNjc2Myw3IEBACiAJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShicm9rZW5fdmdhX21vZGUpOwogCQlicmVhazsKIAl9CisJc2QtPmJyaWdodG5lc3MgPSBCUklHSFRORVNTX0RFRjsKIAlzZC0+Y29udHJhc3QgPSBDT05UUkFTVF9ERUY7CiAJc2QtPmdhbW1hID0gZ2FtbWFbc2QtPnNlbnNvcl07CiAJc2QtPmF1dG9nYWluID0gQVVUT0dBSU5fREVGOwpAQCAtNjc5OCw5ICs2ODE4LDYgQEAKIAl9OwogCiAJLyogY3JlYXRlIHRoZSBKUEVHIGhlYWRlciAqLwotCXNkLT5qcGVnX2hkciA9IGttYWxsb2MoSlBFR19IRFJfU1osIEdGUF9LRVJORUwpOwotCWlmICghc2QtPmpwZWdfaGRyKQotCQlyZXR1cm4gLUVOT01FTTsKIAlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGdzcGNhX2Rldi0+aGVpZ2h0LCBnc3BjYV9kZXYtPndpZHRoLAogCQkJMHgyMSk7CQkvKiBKUEVHIDQyMiAqLwogCWpwZWdfc2V0X3F1YWwoc2QtPmpwZWdfaGRyLCBzZC0+cXVhbGl0eSk7CkBAIC02OTE4LDEwICs2OTM1LDYgQEAKIAkJcmVnX3coZGV2LCAweDAwLCAweDAwMDcpOwkvKiAoZnJvbSB3aW4gdHJhY2VzKSAqLwogCQlyZWdfdyhkZXYsIDB4MDIsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HKTsKIAkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfUEFTMjAyQjoKLQkJcmVnX3coZGV2LCAweDMyLCAweDAwMDcpOwkvKiAoZnJvbSB3aW4gdHJhY2VzKSAqLwotCQlyZWdfdyhkZXYsIDB4MDIsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HKTsKLQkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNjkzMSw3ICs2OTQ0LDYgQEAKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlrZnJlZShzZC0+anBlZ19oZHIpOwogCWlmICghZ3NwY2FfZGV2LT5wcmVzZW50KQogCQlyZXR1cm47CiAJc2VuZF91bmtub3duKGdzcGNhX2Rldi0+ZGV2LCBzZC0+c2Vuc29yKTsKQEAgLTY5NjIsNiArNjk3NCwyNCBAQAogCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIH0KIAorc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5icmlnaHRuZXNzID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPmJyaWdodG5lc3M7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwpAQCAtNzE2Myw5ICs3MTkzLDcgQEAKIAl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDhhYSl9LAogCXtVU0JfREVWSUNFKDB4MDQ2ZCwgMHgwOGFjKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWQpfSwKLSNpZiAhZGVmaW5lZCBDT05GSUdfVVNCX1pDMDMwMSAmJiAhZGVmaW5lZCBDT05GSUdfVVNCX1pDMDMwMV9NT0RVTEUKIAl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDhhZSl9LAotI2VuZGlmCiAJe1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWYpfSwKIAl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDhiOSl9LAogCXtVU0JfREVWSUNFKDB4MDQ2ZCwgMHgwOGQ3KX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCmluZGV4IDgzMGQ0N2IuLjBjYWU1YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCkBAIC0yODYsNiArMjg2LDggQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlkZXYtPndvcmtxdWV1ZSA9IDA7CisKIAkvKiByZWdpc3RlciB2NGwyX2RldmljZSBlYXJseSBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgcHJpbnRrcyAqLwogCWlmICh2NGwyX2RldmljZV9yZWdpc3RlcigmaW50ZXJmYWNlLT5kZXYsICZkZXYtPnY0bDJfZGV2KSkgewogCQllcnIoInY0bDJfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZCIpOwpAQCAtMzgwLDYgKzM4Miw5IEBACiAKIGVycm9yOgogCWlmIChkZXYpIHsKKwkJLyogRGVzdHJveSBzaW5nbGUgdGhyZWFkICovCisJCWlmIChkZXYtPndvcmtxdWV1ZSkKKwkJCWRlc3Ryb3lfd29ya3F1ZXVlKGRldi0+d29ya3F1ZXVlKTsKIAkJLyogdGhpcyBmcmVlcyBhbGxvY2F0ZWQgbWVtb3J5ICovCiAJCWhkcHZyX2RlbGV0ZShkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYwppbmRleCBjMzM4ZjNmLi40ODYzYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jCkBAIC0zOTQsNyArMzk0LDcgQEAKIAogc3RhdGljIGludCBoZHB2cl9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBoZHB2cl9maAkJKmZoICA9IChzdHJ1Y3QgaGRwdnJfZmggKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGhkcHZyX2ZoCQkqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBoZHB2cl9kZXZpY2UJKmRldiA9IGZoLT5kZXY7CiAKIAlpZiAoIWRldikKQEAgLTUxOCw3ICs1MTgsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBoZHB2cl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXN0cnVjdCBoZHB2cl9idWZmZXIgKmJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IGhkcHZyX2ZoICpmaCA9IChzdHJ1Y3QgaGRwdnJfZmggKilmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGhkcHZyX2ZoICpmaCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaGRwdnJfZGV2aWNlICpkZXYgPSBmaC0+ZGV2OwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCAyOWQ0Mzk3Li4yN2FlOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvaXItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvaXItY29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI3MiwxMSArMjcyLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICgwID09IHJjKSB7Ci0JCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dCwgJmlyLT5pcik7Ci0JfSBlbHNlIHsKLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGlyX2tleSk7Ci0JfQorCWlmIChyYykKKwkJaXJfa2V5ZG93bihpci0+aW5wdXQsIGlyX2tleSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNDM5LDEwICs0MzYsNyBAQAogCQkgZGV2X25hbWUoJmNsaWVudC0+ZGV2KSk7CiAKIAkvKiBpbml0ICsgcmVnaXN0ZXIgaW5wdXQgZGV2aWNlICovCi0JZXJyID0gaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZpci0+aXIsIGlyX3R5cGUpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9vdXRfZnJlZTsKLQorCWlyLT5pcl90eXBlID0gaXJfdHlwZTsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOwogCWlucHV0X2Rldi0+bmFtZSAgICAgICA9IGlyLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyAgICAgICA9IGlyLT5waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwppbmRleCAxYjc5NDc1Li45MGRhYTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwpAQCAtMTMwLDYgKzEzMCw5IEBACiBzdGF0aWMgaW50IGl2dHZfcGNpX2xhdGVuY3kgPSAxOwogCiBpbnQgaXZ0dl9kZWJ1ZzsKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitpbnQgaXZ0dl9md19kZWJ1ZzsKKyNlbmRpZgogCiBzdGF0aWMgaW50IHR1bmVydHlwZSA9IC0xOwogc3RhdGljIGludCBuZXdpMmMgPSAtMTsKQEAgLTE0MSw2ICsxNDQsOSBAQAogbW9kdWxlX3BhcmFtX3N0cmluZyhzZWNhbSwgc2VjYW0sIHNpemVvZihzZWNhbSksIDA2NDQpOwogbW9kdWxlX3BhcmFtX3N0cmluZyhudHNjLCBudHNjLCBzaXplb2YobnRzYyksIDA2NDQpOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGl2dHZfZGVidWcsIGludCwgMDY0NCk7CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworbW9kdWxlX3BhcmFtX25hbWVkKGZ3X2RlYnVnLCBpdnR2X2Z3X2RlYnVnLCBpbnQsIDA2NDQpOworI2VuZGlmCiBtb2R1bGVfcGFyYW0oaXZ0dl9wY2lfbGF0ZW5jeSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShpdnR2X3l1dl9tb2RlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGl2dHZfeXV2X3RocmVzaG9sZCwgaW50LCAwNjQ0KTsKQEAgLTIxNyw2ICsyMjMsMTAgQEAKIAkJICJcdFx0XHQgMjU2LzB4MDEwMDogeXV2XG4iCiAJCSAiXHRcdFx0IDUxMi8weDAyMDA6IGkyY1xuIgogCQkgIlx0XHRcdDEwMjQvMHgwNDAwOiBoaWdoIHZvbHVtZVxuIik7CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworTU9EVUxFX1BBUk1fREVTQyhmd19kZWJ1ZywKKwkJICJFbmFibGUgY29kZSBmb3IgZGVidWdnaW5nIGZpcm13YXJlIHByb2JsZW1zLiAgRGVmYXVsdDogMFxuIik7CisjZW5kaWYKIE1PRFVMRV9QQVJNX0RFU0MoaXZ0dl9wY2lfbGF0ZW5jeSwKIAkJICJDaGFuZ2UgdGhlIFBDSSBsYXRlbmN5IHRvIDY0IGlmIGxvd2VyOiAwID0gTm8sIDEgPSBZZXMsXG4iCiAJCSAiXHRcdFx0RGVmYXVsdDogWWVzIik7CkBAIC0xNDI1LDEyICsxNDM1LDE2IEBACiBFWFBPUlRfU1lNQk9MKGl2dHZfdmFwaV9yZXN1bHQpOwogRVhQT1JUX1NZTUJPTChpdnR2X2NsZWFyX2lycV9tYXNrKTsKIEVYUE9SVF9TWU1CT0woaXZ0dl9kZWJ1Zyk7CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworRVhQT1JUX1NZTUJPTChpdnR2X2Z3X2RlYnVnKTsKKyNlbmRpZgogRVhQT1JUX1NZTUJPTChpdnR2X3Jlc2V0X2lyX2dwaW8pOwogRVhQT1JUX1NZTUJPTChpdnR2X3VkbWFfc2V0dXApOwogRVhQT1JUX1NZTUJPTChpdnR2X3VkbWFfdW5tYXApOwogRVhQT1JUX1NZTUJPTChpdnR2X3VkbWFfYWxsb2MpOwogRVhQT1JUX1NZTUJPTChpdnR2X3VkbWFfcHJlcGFyZSk7CiBFWFBPUlRfU1lNQk9MKGl2dHZfaW5pdF9vbl9maXJzdF9vcGVuKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl9maXJtd2FyZV9jaGVjayk7CiAKIG1vZHVsZV9pbml0KG1vZHVsZV9zdGFydCk7CiBtb2R1bGVfZXhpdChtb2R1bGVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCmluZGV4IDViNDVmZDIuLmJkMDg0ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCkBAIC0xMjIsNiArMTIyLDkgQEAKIAogLyogZGVidWdnaW5nICovCiBleHRlcm4gaW50IGl2dHZfZGVidWc7CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworZXh0ZXJuIGludCBpdnR2X2Z3X2RlYnVnOworI2VuZGlmCiAKICNkZWZpbmUgSVZUVl9EQkdGTEdfV0FSTiAgICAoMSA8PCAwKQogI2RlZmluZSBJVlRWX0RCR0ZMR19JTkZPICAgICgxIDw8IDEpCkBAIC03MzQsNiArNzM3LDcgQEAKIAlzdHJ1Y3QgdjRsMl9yZWN0IG9zZF9yZWN0OyAgICAgIC8qIGN1cnJlbnQgT1NEIHBvc2l0aW9uIGFuZCBzaXplICovCiAJc3RydWN0IHY0bDJfcmVjdCBtYWluX3JlY3Q7ICAgICAvKiBjdXJyZW50IE1haW4gd2luZG93IHBvc2l0aW9uIGFuZCBzaXplICovCiAJc3RydWN0IG9zZF9pbmZvICpvc2RfaW5mbzsgICAgICAvKiBpdnR2ZmIgcHJpdmF0ZSBPU0QgaW5mbyAqLworCXZvaWQgKCppdnR2ZmJfcmVzdG9yZSkoc3RydWN0IGl2dHYgKml0dik7IC8qIFVzZWQgZm9yIGEgd2FybSBzdGFydCAqLwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXZ0diAqdG9faXZ0dihzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCmluZGV4IDNjMmNjMjcuLmE2YTJjZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJpdnR2LXl1di5oIgogI2luY2x1ZGUgIml2dHYtaW9jdGwuaCIKICNpbmNsdWRlICJpdnR2LWNhcmRzLmgiCisjaW5jbHVkZSAiaXZ0di1maXJtd2FyZS5oIgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zYWE3MTE1Lmg+CiAKQEAgLTUyNiw2ICs1MjcsNyBAQAogewogCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OwogCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaWQtPnR5cGVdOworCWludCByYzsKIAogCWlmIChhdG9taWNfcmVhZCgmaXR2LT5kZWNvZGluZykgPT0gMCkgewogCQlpZiAoaXZ0dl9jbGFpbV9zdHJlYW0oaWQsIHMtPnR5cGUpKSB7CkBAIC01MzMsNyArNTM1LDEzIEBACiAJCQlJVlRWX0RFQlVHX1dBUk4oInN0YXJ0IGRlY29kZSwgc3RyZWFtIGFscmVhZHkgY2xhaW1lZFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9Ci0JCWl2dHZfc3RhcnRfdjRsMl9kZWNvZGVfc3RyZWFtKHMsIDApOworCQlyYyA9IGl2dHZfc3RhcnRfdjRsMl9kZWNvZGVfc3RyZWFtKHMsIDApOworCQlpZiAocmMgPCAwKSB7CisJCQlpZiAocmMgPT0gLUVBR0FJTikKKwkJCQlyYyA9IGl2dHZfc3RhcnRfdjRsMl9kZWNvZGVfc3RyZWFtKHMsIDApOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCX0KIAl9CiAJaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKQogCQlyZXR1cm4gaXZ0dl9zZXRfc3BlZWQoaXR2LCBzcGVlZCk7CkBAIC05MTIsMTIgKzkyMCwzMiBAQAogCiBzdGF0aWMgaW50IGl2dHZfc2VyaWFsaXplZF9vcGVuKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgc3RydWN0IGZpbGUgKmZpbHApCiB7CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOworI2VuZGlmCiAJc3RydWN0IGl2dHYgKml0diA9IHMtPml0djsKIAlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppdGVtOwogCWludCByZXMgPSAwOwogCiAJSVZUVl9ERUJVR19GSUxFKCJvcGVuICVzXG4iLCBzLT5uYW1lKTsKIAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwkvKiBVbmxlc3MgaXZ0dl9md19kZWJ1ZyBpcyBzZXQsIGVycm9yIG91dCBpZiBmaXJtd2FyZSBkZWFkLiAqLworCWlmIChpdnR2X2Z3X2RlYnVnKSB7CisJCUlWVFZfV0FSTigiT3BlbmluZyAlcyB3aXRoIGRlYWQgZmlybXdhcmUgbG9ja291dCBkaXNhYmxlZFxuIiwKKwkJCSAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7CisJCUlWVFZfV0FSTigiU2VsZWN0ZWQgZmlybXdhcmUgZXJyb3JzIHdpbGwgYmUgaWdub3JlZFxuIik7CisJfSBlbHNlIHsKKyNlbHNlCisJaWYgKDEpIHsKKyNlbmRpZgorCQlyZXMgPSBpdnR2X2Zpcm13YXJlX2NoZWNrKGl0diwgIml2dHZfc2VyaWFsaXplZF9vcGVuIik7CisJCWlmIChyZXMgPT0gLUVBR0FJTikKKwkJCXJlcyA9IGl2dHZfZmlybXdhcmVfY2hlY2soaXR2LCAiaXZ0dl9zZXJpYWxpemVkX29wZW4iKTsKKwkJaWYgKHJlcyA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKIAlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcgJiYKIAkJdGVzdF9iaXQoSVZUVl9GX1NfQ0xBSU1FRCwgJml0di0+c3RyZWFtc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVZdLnNfZmxhZ3MpKQogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMKaW5kZXggYTcxZThiYS4uZDhiZjJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5jCkBAIC0yMyw3ICsyMywxMCBAQAogI2luY2x1ZGUgIml2dHYtbWFpbGJveC5oIgogI2luY2x1ZGUgIml2dHYtZmlybXdhcmUuaCIKICNpbmNsdWRlICJpdnR2LXl1di5oIgorI2luY2x1ZGUgIml2dHYtaW9jdGwuaCIKKyNpbmNsdWRlICJpdnR2LWNhcmRzLmgiCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zYWE3MTI3Lmg+CiAKICNkZWZpbmUgSVZUVl9NQVNLX1NQVV9FTkFCTEUgCQkweEZGRkZGRkZFCiAjZGVmaW5lIElWVFZfTUFTS19WUFVfRU5BQkxFMTUgCQkweEZGRkZGRkY2CkBAIC0yNzEsMyArMjc0LDEyMiBAQAogCX0KIAlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVE9QX1BMQVlCQUNLLCA0LCAwLCAwLCAwLCAxKTsKIH0KKworLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGNhcmQgJiByZXN0b3JlIHByZXZpb3VzIHNldHRpbmdzICovCitpbnQgaXZ0dl9maXJtd2FyZV9yZXN0YXJ0KHN0cnVjdCBpdnR2ICppdHYpCit7CisJaW50IHJjID0gMDsKKwl2NGwyX3N0ZF9pZCBzdGQ7CisJc3RydWN0IGl2dHZfb3Blbl9pZCBmaDsKKwlmaC5pdHYgPSBpdHY7CisKKwlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkKKwkJLyogRGlzcGxheSB0ZXN0IGltYWdlIGR1cmluZyByZXN0YXJ0ICovCisJCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzEyNywgdmlkZW8sIHNfcm91dGluZywKKwkJICAgIFNBQTcxMjdfSU5QVVRfVFlQRV9URVNUX0lNQUdFLAorCQkgICAgaXR2LT5jYXJkLT52aWRlb19vdXRwdXRzW2l0di0+YWN0aXZlX291dHB1dF0udmlkZW9fb3V0cHV0LAorCQkgICAgMCk7CisKKwltdXRleF9sb2NrKCZpdHYtPnVkbWEubG9jayk7CisKKwlyYyA9IGl2dHZfZmlybXdhcmVfaW5pdChpdHYpOworCWlmIChyYykgeworCQltdXRleF91bmxvY2soJml0di0+dWRtYS5sb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEFsbG93IHNldHRpbmdzIHRvIHJlbG9hZCAqLworCWl2dHZfbWFpbGJveF9jYWNoZV9pbnZhbGlkYXRlKGl0dik7CisKKwkvKiBSZXN0b3JlIHZpZGVvIHN0YW5kYXJkICovCisJc3RkID0gaXR2LT5zdGQ7CisJaXR2LT5zdGQgPSAwOworCWl2dHZfc19zdGQoTlVMTCwgJmZoLCAmc3RkKTsKKworCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7CisJCWl2dHZfaW5pdF9tcGVnX2RlY29kZXIoaXR2KTsKKworCQkvKiBSZXN0b3JlIGZyYW1lYnVmZmVyIGlmIGFjdGl2ZSAqLworCQlpZiAoaXR2LT5pdnR2ZmJfcmVzdG9yZSkKKwkJCWl0di0+aXZ0dmZiX3Jlc3RvcmUoaXR2KTsKKworCQkvKiBSZXN0b3JlIGFscGhhIHNldHRpbmdzICovCisJCWl2dHZfc2V0X29zZF9hbHBoYShpdHYpOworCisJCS8qIFJlc3RvcmUgbm9ybWFsIG91dHB1dCAqLworCQlpdnR2X2NhbGxfaHcoaXR2LCBJVlRWX0hXX1NBQTcxMjcsIHZpZGVvLCBzX3JvdXRpbmcsCisJCSAgICBTQUE3MTI3X0lOUFVUX1RZUEVfTk9STUFMLAorCQkgICAgaXR2LT5jYXJkLT52aWRlb19vdXRwdXRzW2l0di0+YWN0aXZlX291dHB1dF0udmlkZW9fb3V0cHV0LAorCQkgICAgMCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpdHYtPnVkbWEubG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKiBDaGVjayBmaXJtd2FyZSBydW5uaW5nIHN0YXRlLiBUaGUgY2hlY2tzIGZhbGwgdGhyb3VnaAorICAgYWxsb3dpbmcgbXVsdGlwbGUgZmFpbHVyZXMgdG8gYmUgbG9nZ2VkLiAqLworaW50IGl2dHZfZmlybXdhcmVfY2hlY2soc3RydWN0IGl2dHYgKml0diwgY2hhciAqd2hlcmUpCit7CisJaW50IHJlcyA9IDA7CisKKwkvKiBDaGVjayBlbmNvZGVyIGlzIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfUElOR19GVywgMCkgPCAwKSB7CisJCUlWVFZfV0FSTigiRW5jb2RlciBoYXMgZGllZCA6ICVzXG4iLCB3aGVyZSk7CisJCXJlcyA9IC0xOworCX0KKworCS8qIEFsc28gY2hlY2sgYXVkaW8uIE9ubHkgY2hlY2sgaWYgbm90IGluIHVzZSAmIGVuY29kZXIgaXMgb2theSAqLworCWlmICghcmVzICYmICFhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpICYmCisJICAgICghYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpIHx8CisJICAgICAoYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpIDwgMiAmJiB0ZXN0X2JpdChJVlRWX0ZfSV9ERUNfWVVWLAorCQkJCQkJCSAgICAgJml0di0+aV9mbGFncykpKSkgeworCisJCWlmIChpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19NSVNDLCAxLCAxMikgPCAwKSB7CisJCQlJVlRWX1dBUk4oIkF1ZGlvIGhhcyBkaWVkIChFbmNvZGVyIE9LKSA6ICVzXG4iLCB3aGVyZSk7CisJCQlyZXMgPSAtMjsKKwkJfQorCX0KKworCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7CisJCS8qIFNlY29uZCBhdWRpbyBjaGVjay4gU2tpcCBpZiBhdWRpbyBhbHJlYWR5IGZhaWxlZCAqLworCQlpZiAocmVzICE9IC0yICYmIHJlYWRfZGVjKDB4MTAwKSAhPSByZWFkX2RlYygweDEwNCkpIHsKKwkJCS8qIFdhaXQgJiB0cnkgYWdhaW4gdG8gYmUgY2VydGFpbi4gKi8KKwkJCWl2dHZfbXNsZWVwX3RpbWVvdXQoMTQsIDApOworCQkJaWYgKHJlYWRfZGVjKDB4MTAwKSAhPSByZWFkX2RlYygweDEwNCkpIHsKKwkJCQlJVlRWX1dBUk4oIkF1ZGlvIGhhcyBkaWVkIChEZWNvZGVyKSA6ICVzXG4iLAorCQkJCQkgIHdoZXJlKTsKKwkJCQlyZXMgPSAtMTsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIGRlY29kZXIgaXMgc3RpbGwgcnVubmluZyAqLworCQlpZiAoaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfUElOR19GVywgMCkgPCAwKSB7CisJCQlJVlRWX1dBUk4oIkRlY29kZXIgaGFzIGRpZWQgOiAlc1xuIiwgd2hlcmUpOworCQkJcmVzID0gLTE7CisJCX0KKwl9CisKKwkvKiBJZiBzb21ldGhpbmcgZmFpbGVkICYgY3VycmVudGx5IGlkbGUsIHRyeSB0byByZWxvYWQgKi8KKwlpZiAocmVzICYmICFhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpICYmCisJCQkJCQkhYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpKSB7CisJCUlWVFZfSU5GTygiRGV0ZWN0ZWQgaW4gJXMgdGhhdCBmaXJtd2FyZSBoYWQgZmFpbGVkIC0gIgorCQkJICAiUmVsb2FkaW5nXG4iLCB3aGVyZSk7CisJCXJlcyA9IGl2dHZfZmlybXdhcmVfcmVzdGFydChpdHYpOworCQkvKgorCQkgKiBFdmVuIGlmIHJlc3RhcnRlZCBvaywgc3RpbGwgc2lnbmFsIGEgcHJvYmxlbSBoYWQgb2NjdXJlZC4KKwkJICogVGhlIGNhbGxlciBjYW4gY29tZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gYWdhaW4gdG8gY2hlY2sKKwkJICogaWYgdGhpbmdzIGFyZSByZWFsbHkgb2sgYWZ0ZXIgdGhlIHJlc3RhcnQuCisJCSAqLworCQlpZiAoIXJlcykgeworCQkJSVZUVl9JTkZPKCJGaXJtd2FyZSByZXN0YXJ0IG9rYXlcbiIpOworCQkJcmVzID0gLUVBR0FJTjsKKwkJfSBlbHNlIHsKKwkJCUlWVFZfSU5GTygiRmlybXdhcmUgcmVzdGFydCBmYWlsZWRcbiIpOworCQl9CisJfSBlbHNlIGlmIChyZXMpIHsKKwkJcmVzID0gLUVJTzsKKwl9CisKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmgKaW5kZXggMDQxYmE5NC4uNTJiYjRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5oCkBAIC0yNiw1ICsyNiw2IEBACiB2b2lkIGl2dHZfZmlybXdhcmVfdmVyc2lvbnMoc3RydWN0IGl2dHYgKml0dik7CiB2b2lkIGl2dHZfaGFsdF9maXJtd2FyZShzdHJ1Y3QgaXZ0diAqaXR2KTsKIHZvaWQgaXZ0dl9pbml0X21wZWdfZGVjb2RlcihzdHJ1Y3QgaXZ0diAqaXR2KTsKK2ludCBpdnR2X2Zpcm13YXJlX2NoZWNrKHN0cnVjdCBpdnR2ICppdHYsIGNoYXIgKndoZXJlKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmMKaW5kZXggODQ1NzdmNi4uZTNjZTk2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtbWFpbGJveC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LW1haWxib3guYwpAQCAtMzc3LDMgKzM3NywxMSBAQAogCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyssIHArKykKIAkJZGF0YVtpXSA9IHJlYWRsKHApOwogfQorCisvKiBXaXBlIGFwaSBjYWNoZSAqLwordm9pZCBpdnR2X21haWxib3hfY2FjaGVfaW52YWxpZGF0ZShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJaXR2LT5hcGlfY2FjaGVbaV0ubGFzdF9qaWZmaWVzID0gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LW1haWxib3guaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LW1haWxib3guaAppbmRleCA4MjQ3NjYyLi4yYzgzNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtbWFpbGJveC5oCkBAIC0zMCw1ICszMCw2IEBACiBpbnQgaXZ0dl92YXBpX3Jlc3VsdChzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdLCBpbnQgY21kLCBpbnQgYXJncywgLi4uKTsKIGludCBpdnR2X3ZhcGkoc3RydWN0IGl2dHYgKml0diwgaW50IGNtZCwgaW50IGFyZ3MsIC4uLik7CiBpbnQgaXZ0dl9hcGlfZnVuYyh2b2lkICpwcml2LCB1MzIgY21kLCBpbnQgaW4sIGludCBvdXQsIHUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV0pOwordm9pZCBpdnR2X21haWxib3hfY2FjaGVfaW52YWxpZGF0ZShzdHJ1Y3QgaXZ0diAqaXR2KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKaW5kZXggYTkzN2UyZi4uNTVkZjQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgIml2dHYteXV2LmgiCiAjaW5jbHVkZSAiaXZ0di1jYXJkcy5oIgogI2luY2x1ZGUgIml2dHYtc3RyZWFtcy5oIgorI2luY2x1ZGUgIml2dHYtZmlybXdhcmUuaCIKICNpbmNsdWRlIDxtZWRpYS92NGwyLWV2ZW50Lmg+CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgaXZ0dl92NGwyX2VuY19mb3BzID0gewpAQCAtNjc0LDEyICs2NzUsMTQgQEAKIAkvKiBEZWNvZGVyIHNvbWV0aW1lcyBkaWVzIGhlcmUsIHNvIHdhaXQgYSBtb21lbnQgKi8KIAlpdnR2X21zbGVlcF90aW1lb3V0KDEwLCAwKTsKIAotCXJldHVybiAwOworCS8qIEtub3duIGZhaWx1cmUgcG9pbnQgZm9yIGZpcm13YXJlLCBzbyBjaGVjayAqLworCXJldHVybiBpdnR2X2Zpcm13YXJlX2NoZWNrKGl0diwgIml2dHZfc2V0dXBfdjRsMl9kZWNvZGVfc3RyZWFtIik7CiB9CiAKIGludCBpdnR2X3N0YXJ0X3Y0bDJfZGVjb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIGludCBnb3Bfb2Zmc2V0KQogewogCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisJaW50IHJjOwogCiAJaWYgKHMtPnZkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02ODksNyArNjkyLDExIEBACiAKIAlJVlRWX0RFQlVHX0lORk8oIlN0YXJ0aW5nIGRlY29kZSBzdHJlYW0gJXMgKGdvcF9vZmZzZXQgJWQpXG4iLCBzLT5uYW1lLCBnb3Bfb2Zmc2V0KTsKIAotCWl2dHZfc2V0dXBfdjRsMl9kZWNvZGVfc3RyZWFtKHMpOworCXJjID0gaXZ0dl9zZXR1cF92NGwyX2RlY29kZV9zdHJlYW0ocyk7CisJaWYgKHJjIDwgMCkgeworCQljbGVhcl9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncyk7CisJCXJldHVybiByYzsKKwl9CiAKIAkvKiBzZXQgZG1hIHNpemUgdG8gNjU1MzYgYnl0ZXMgKi8KIAlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfRE1BX0JMT0NLX1NJWkUsIDEsIDY1NTM2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaAppbmRleCBiNTMwZGVjLi5iNjdhNDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmVyc2lvbi5oCkBAIC0yMyw3ICsyMyw3IEBACiAjZGVmaW5lIElWVFZfRFJJVkVSX05BTUUgIml2dHYiCiAjZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IgMQogI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SIDQKLSNkZWZpbmUgSVZUVl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMIDEKKyNkZWZpbmUgSVZUVl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMIDIKIAogI2RlZmluZSBJVlRWX1ZFUlNJT04gX19zdHJpbmdpZnkoSVZUVl9EUklWRVJfVkVSU0lPTl9NQUpPUikgIi4iIF9fc3RyaW5naWZ5KElWVFZfRFJJVkVSX1ZFUlNJT05fTUlOT1IpICIuIiBfX3N0cmluZ2lmeShJVlRWX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCiAjZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oSVZUVl9EUklWRVJfVkVSU0lPTl9NQUpPUixJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SLElWVFZfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYwppbmRleCA5ZmYzNDI1Li5iZTAzYTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0dmZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSAiaXZ0di1pMmMuaCIKICNpbmNsdWRlICJpdnR2LXVkbWEuaCIKICNpbmNsdWRlICJpdnR2LW1haWxib3guaCIKKyNpbmNsdWRlICJpdnR2LWZpcm13YXJlLmgiCiAKIC8qIGNhcmQgcGFyYW1ldGVycyAqLwogc3RhdGljIGludCBpdnR2ZmJfY2FyZF9pZCA9IC0xOwpAQCAtMTc4LDYgKzE3OSwxMiBAQAogCXN0cnVjdCBmYl9pbmZvIGl2dHZmYl9pbmZvOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBpdnR2ZmJfZGVmaW5lZDsKIAlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gaXZ0dmZiX2ZpeDsKKworCS8qIFVzZWQgZm9yIGEgd2FybSBzdGFydCAqLworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBmYnZhcl9jdXI7CisJaW50IGJsYW5rX2N1cjsKKwl1MzIgcGFsZXR0ZV9jdXJbMjU2XTsKKwl1MzIgcGFuX2N1cjsKIH07CiAKIHN0cnVjdCBpdnR2X29zZF9jb29yZHMgewpAQCAtMTk5LDYgKzIwNiw3IEBACiAJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKIAlpbnQgcmM7CiAKKwlpdnR2X2Zpcm13YXJlX2NoZWNrKGl0diwgIml2dHZmYl9nZXRfZnJhbWVidWZmZXIiKTsKIAlyYyA9IGl2dHZfdmFwaV9yZXN1bHQoaXR2LCBkYXRhLCBDWDIzNDFYX09TRF9HRVRfRlJBTUVCVUZGRVIsIDApOwogCSpmYmJhc2UgPSBkYXRhWzBdOwogCSpmYmxlbmd0aCA9IGRhdGFbMV07CkBAIC01ODEsOCArNTg5LDEwIEBACiAJaXZ0dl93aW5kb3cuaGVpZ2h0ID0gdmFyLT55cmVzOwogCiAJLyogTWluaW11bSBtYXJnaW4gY2Fubm90IGJlIDAsIGFzIFggd29uJ3QgYWxsb3cgc3VjaCBhIG1vZGUgKi8KLQlpZiAoIXZhci0+dXBwZXJfbWFyZ2luKSB2YXItPnVwcGVyX21hcmdpbisrOwotCWlmICghdmFyLT5sZWZ0X21hcmdpbikgdmFyLT5sZWZ0X21hcmdpbisrOworCWlmICghdmFyLT51cHBlcl9tYXJnaW4pCisJCXZhci0+dXBwZXJfbWFyZ2luKys7CisJaWYgKCF2YXItPmxlZnRfbWFyZ2luKQorCQl2YXItPmxlZnRfbWFyZ2luKys7CiAJaXZ0dl93aW5kb3cudG9wID0gdmFyLT51cHBlcl9tYXJnaW4gLSAxOwogCWl2dHZfd2luZG93LmxlZnQgPSB2YXItPmxlZnRfbWFyZ2luIC0gMTsKIApAQCAtNTk1LDYgKzYwNSw5IEBACiAJLyogRm9yY2UgdXBkYXRlIG9mIHl1diByZWdpc3RlcnMgKi8KIAlpdHYtPnl1dl9pbmZvLnl1dl9mb3JjZWRfdXBkYXRlID0gMTsKIAorCS8qIEtlZXAgYSBjb3B5IG9mIHRoZXNlIHNldHRpbmdzICovCisJbWVtY3B5KCZvaS0+ZmJ2YXJfY3VyLCB2YXIsIHNpemVvZihvaS0+ZmJ2YXJfY3VyKSk7CisKIAlJVlRWRkJfREVCVUdfSU5GTygiRGlzcGxheSBzaXplOiAlZHglZCAodmlydHVhbCAlZHglZCkgQCAlZGJwcFxuIiwKIAkJICAgICAgdmFyLT54cmVzLCB2YXItPnlyZXMsCiAJCSAgICAgIHZhci0+eHJlc192aXJ0dWFsLCB2YXItPnlyZXNfdmlydHVhbCwKQEAgLTgyOSw2ICs4NDIsOCBAQAogCWl0di0+eXV2X2luZm8ub3NkX3lfcGFuID0gdmFyLT55b2Zmc2V0OwogCS8qIEZvcmNlIHVwZGF0ZSBvZiB5dXYgcmVnaXN0ZXJzICovCiAJaXR2LT55dXZfaW5mby55dXZfZm9yY2VkX3VwZGF0ZSA9IDE7CisJLyogUmVtZW1iZXIgdGhpcyB2YWx1ZSAqLworCWl0di0+b3NkX2luZm8tPnBhbl9jdXIgPSBvc2RfcGFuX2luZGV4OwogCXJldHVybiAwOwogfQogCkBAIC04NDIsNiArODU3LDcgQEAKIAlyYyA9IGl2dHZmYl9zZXRfdmFyKGl0diwgJmluZm8tPnZhcik7CiAJaXZ0dmZiX3Bhbl9kaXNwbGF5KCZpbmZvLT52YXIsIGluZm8pOwogCWl2dHZmYl9nZXRfZml4KGl0diwgJmluZm8tPmZpeCk7CisJaXZ0dl9maXJtd2FyZV9jaGVjayhpdHYsICJpdnR2ZmJfc2V0X3BhciIpOwogCXJldHVybiByYzsKIH0KIApAQCAtODU5LDYgKzg3NSw3IEBACiAJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA8PSA4KSB7CiAJCXdyaXRlX3JlZyhyZWdubywgMHgwMmEzMCk7CiAJCXdyaXRlX3JlZyhjb2xvciwgMHgwMmEzNCk7CisJCWl0di0+b3NkX2luZm8tPnBhbGV0dGVfY3VyW3JlZ25vXSA9IGNvbG9yOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHJlZ25vID49IDE2KQpAQCAtOTExLDYgKzkyOCw3IEBACiAJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9TVEFURSwgMSwgMCk7CiAJCWJyZWFrOwogCX0KKwlpdHYtPm9zZF9pbmZvLT5ibGFua19jdXIgPSBibGFua19tb2RlOwogCXJldHVybiAwOwogfQogCkBAIC05MjksNiArOTQ3LDIxIEBACiAJLmZiX2JsYW5rICAgICAgID0gaXZ0dmZiX2JsYW5rLAogfTsKIAorLyogUmVzdG9yZSBoYXJkd2FyZSBhZnRlciBmaXJtd2FyZSByZXN0YXJ0ICovCitzdGF0aWMgdm9pZCBpdnR2ZmJfcmVzdG9yZShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCBvc2RfaW5mbyAqb2kgPSBpdHYtPm9zZF9pbmZvOworCWludCBpOworCisJaXZ0dmZiX3NldF92YXIoaXR2LCAmb2ktPmZidmFyX2N1cik7CisJaXZ0dmZiX2JsYW5rKG9pLT5ibGFua19jdXIsICZvaS0+aXZ0dmZiX2luZm8pOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl3cml0ZV9yZWcoaSwgMHgwMmEzMCk7CisJCXdyaXRlX3JlZyhvaS0+cGFsZXR0ZV9jdXJbaV0sIDB4MDJhMzQpOworCX0KKwl3cml0ZV9yZWcob2ktPnBhbl9jdXIsIDB4MDJhMGMpOworfQorCiAvKiBJbml0aWFsaXphdGlvbiAqLwogCiAKQEAgLTExOTIsNiArMTIyNSw5IEBACiAJLyogRW5hYmxlIHRoZSBvc2QgKi8KIAlpdnR2ZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgJml0di0+b3NkX2luZm8tPml2dHZmYl9pbmZvKTsKIAorCS8qIEVuYWJsZSByZXN0YXJ0ICovCisJaXR2LT5pdnR2ZmJfcmVzdG9yZSA9IGl2dHZmYl9yZXN0b3JlOworCiAJLyogQWxsb2NhdGUgRE1BICovCiAJaXZ0dl91ZG1hX2FsbG9jKGl0dik7CiAJcmV0dXJuIDA7CkBAIC0xMjAzLDcgKzEyMzksNyBAQAogCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaXZ0diAqaXR2ID0gY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3QgaXZ0diwgdjRsMl9kZXYpOwogCi0JaWYgKGl0diAmJiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpIHsKKwlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkgewogCQlpZiAoaXZ0dmZiX2luaXRfY2FyZChpdHYpID09IDApIHsKIAkJCUlWVFZGQl9JTkZPKCJGcmFtZWJ1ZmZlciByZWdpc3RlcmVkIG9uICVzXG4iLAogCQkJCQlpdHYtPnY0bDJfZGV2Lm5hbWUpOwpAQCAtMTIxOSwxMyArMTI1NSwxNCBAQAogCXN0cnVjdCBpdnR2ICppdHYgPSBjb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBpdnR2LCB2NGwyX2Rldik7CiAJc3RydWN0IG9zZF9pbmZvICpvaSA9IGl0di0+b3NkX2luZm87CiAKLQlpZiAoaXR2ICYmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkgeworCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7CiAJCWlmICh1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZpdHYtPm9zZF9pbmZvLT5pdnR2ZmJfaW5mbykpIHsKIAkJCUlWVFZGQl9XQVJOKCJGcmFtZWJ1ZmZlciAlZCBpcyBpbiB1c2UsIGNhbm5vdCB1bmxvYWRcbiIsCiAJCQkJICAgICAgIGl0di0+aW5zdGFuY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJSVZUVkZCX0lORk8oIlVucmVnaXN0ZXIgZnJhbWVidWZmZXIgJWRcbiIsIGl0di0+aW5zdGFuY2UpOworCQlpdHYtPml2dHZmYl9yZXN0b3JlID0gTlVMTDsKIAkJaXZ0dmZiX2JsYW5rKEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQsICZvaS0+aXZ0dmZiX2luZm8pOwogCQlpdnR2ZmJfcmVsZWFzZV9idWZmZXJzKGl0dik7CiAJCWl0di0+b3NkX3ZpZGVvX3BiYXNlID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jCmluZGV4IDEwZGRlY2MuLjQ1MjUzMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYwpAQCAtOTAzLDE0ICs5MDMsMTQgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbTJtdGVzdF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCSBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0Jc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSAoc3RydWN0IG0ybXRlc3RfY3R4ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJcmV0dXJuIHY0bDJfbTJtX3BvbGwoZmlsZSwgY3R4LT5tMm1fY3R4LCB3YWl0KTsKIH0KIAogc3RhdGljIGludCBtMm10ZXN0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gKHN0cnVjdCBtMm10ZXN0X2N0eCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXJldHVybiB2NGwyX20ybV9tbWFwKGZpbGUsIGN0eC0+bTJtX2N0eCwgdm1hKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKaW5kZXggZmJkMGZjNy4uMzFjYzNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKQEAgLTE0MywxMCArMTQzLDEwIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10IG10OW0xMTFfY29sb3VyX2ZtdHNbXSA9IHsKLQl7VjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEUsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKLQl7VjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfTEUsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKLQl7VjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkUsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKLQl7VjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfQkUsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7VjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7VjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7VjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7VjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKIAl7VjRMMl9NQlVTX0ZNVF9SR0I1NTVfMlg4X1BBREhJX0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCiAJe1Y0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogCXtWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKQEAgLTUwNSwyMiArNTA1LDIyIEBACiAJY2FzZSBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfTEU6CiAJCXJldCA9IG10OW0xMTFfc2V0Zm10X3JnYjU2NShjbGllbnQpOwogCQlicmVhazsKLQljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0JFOgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg6CiAJCW10OW0xMTEtPnN3YXBfeXV2X3lfY2hyb21hcyA9IDA7CiAJCW10OW0xMTEtPnN3YXBfeXV2X2NiX2NyID0gMDsKIAkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfeXV2KGNsaWVudCk7CiAJCWJyZWFrOwotCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfQkU6CisJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKIAkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMDsKIAkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAxOwogCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9MRToKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgogCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAxOwogCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDA7CiAJCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihjbGllbnQpOwogCQlicmVhazsKLQljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0xFOgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDg6CiAJCW10OW0xMTEtPnN3YXBfeXV2X3lfY2hyb21hcyA9IDE7CiAJCW10OW0xMTEtPnN3YXBfeXV2X2NiX2NyID0gMTsKIAkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfeXV2KGNsaWVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCmluZGV4IGU0YmYxZGIuLjhlYzQ3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCkBAIC0xMjEsMjIgKzEyMSwyMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG10OXQxMTJfZm9ybWF0IG10OXQxMTJfY2ZtdHNbXSA9IHsKIAl7Ci0JCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0JFLAorCQkuY29kZQkJPSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCwKIAkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKIAkJLmZtdAkJPSAxLAogCQkub3JkZXIJCT0gMCwKIAl9LCB7Ci0JCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0JFLAorCQkuY29kZQkJPSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYOCwKIAkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKIAkJLmZtdAkJPSAxLAogCQkub3JkZXIJCT0gMSwKIAl9LCB7Ci0JCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0xFLAorCQkuY29kZQkJPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKIAkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKIAkJLmZtdAkJPSAxLAogCQkub3JkZXIJCT0gMiwKIAl9LCB7Ci0JCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0xFLAorCQkuY29kZQkJPSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYOCwKIAkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKIAkJLmZtdAkJPSAxLAogCQkub3JkZXIJCT0gMywKQEAgLTk3Miw3ICs5NzIsNyBAQAogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKIAogCXJldHVybiBtdDl0MTEyX3NldF9wYXJhbXMoY2xpZW50LCByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0LAotCQkJCSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRSk7CisJCQkJIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4KTsKIH0KIAogc3RhdGljIGludCBtdDl0MTEyX2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC05ODMsNyArOTgzLDcgQEAKIAogCWlmICghcHJpdi0+Zm9ybWF0KSB7CiAJCWludCByZXQgPSBtdDl0MTEyX3NldF9wYXJhbXMoY2xpZW50LCBWR0FfV0lEVEgsIFZHQV9IRUlHSFQsCi0JCQkJCSAgICAgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkUpOworCQkJCQkgICAgIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2YmVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jCkBAIC0wLDAgKzEsMTUxMyBAQAorLyoKKyAqIFY0TDIgRHJpdmVyIGZvciBpLk1YMjcvaS5NWDI1IGNhbWVyYSBob3N0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEJhcnVjaCBTaWFjaCwgT3JleCBDb21wdXRlZCBSYWRpb2dyYXBoeQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSA8bWFjaC9teDJfY2FtLmg+CisjaWZkZWYgQ09ORklHX01BQ0hfTVgyNworI2luY2x1ZGUgPG1hY2gvZG1hLW14MS1teDIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBNWDJfQ0FNX0RSVl9OQU1FICJteDItY2FtZXJhIgorI2RlZmluZSBNWDJfQ0FNX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCA1KQorI2RlZmluZSBNWDJfQ0FNX0RSSVZFUl9ERVNDUklQVElPTiAiaS5NWDJ4X0NhbWVyYSIKKworLyogcmVzZXQgdmFsdWVzICovCisjZGVmaW5lIENTSUNSMV9SRVNFVF9WQUwJMHg0MDAwMDgwMAorI2RlZmluZSBDU0lDUjJfUkVTRVRfVkFMCTB4MAorI2RlZmluZSBDU0lDUjNfUkVTRVRfVkFMCTB4MAorCisvKiBjc2kgY29udHJvbCByZWcgMSAqLworI2RlZmluZSBDU0lDUjFfU1dBUDE2X0VOCSgxIDw8IDMxKQorI2RlZmluZSBDU0lDUjFfRVhUX1ZTWU5DCSgxIDw8IDMwKQorI2RlZmluZSBDU0lDUjFfRU9GX0lOVEVOCSgxIDw8IDI5KQorI2RlZmluZSBDU0lDUjFfUFJQX0lGX0VOCSgxIDw8IDI4KQorI2RlZmluZSBDU0lDUjFfQ0NJUl9NT0RFCSgxIDw8IDI3KQorI2RlZmluZSBDU0lDUjFfQ09GX0lOVEVOCSgxIDw8IDI2KQorI2RlZmluZSBDU0lDUjFfU0ZfT1JfSU5URU4JKDEgPDwgMjUpCisjZGVmaW5lIENTSUNSMV9SRl9PUl9JTlRFTgkoMSA8PCAyNCkKKyNkZWZpbmUgQ1NJQ1IxX1NUQVRGRl9MRVZFTAkoMyA8PCAyMikKKyNkZWZpbmUgQ1NJQ1IxX1NUQVRGRl9JTlRFTgkoMSA8PCAyMSkKKyNkZWZpbmUgQ1NJQ1IxX1JYRkZfTEVWRUwobCkJKCgobCkgJiAzKSA8PCAxOSkJLyogTVgyNyAqLworI2RlZmluZSBDU0lDUjFfRkIyX0RNQV9JTlRFTgkoMSA8PCAyMCkJCS8qIE1YMjUgKi8KKyNkZWZpbmUgQ1NJQ1IxX0ZCMV9ETUFfSU5URU4JKDEgPDwgMTkpCQkvKiBNWDI1ICovCisjZGVmaW5lIENTSUNSMV9SWEZGX0lOVEVOCSgxIDw8IDE4KQorI2RlZmluZSBDU0lDUjFfU09GX1BPTAkJKDEgPDwgMTcpCisjZGVmaW5lIENTSUNSMV9TT0ZfSU5URU4JKDEgPDwgMTYpCisjZGVmaW5lIENTSUNSMV9NQ0xLRElWKGQpCSgoKGQpICYgMHhGKSA8PCAxMikKKyNkZWZpbmUgQ1NJQ1IxX0hTWU5DX1BPTAkoMSA8PCAxMSkKKyNkZWZpbmUgQ1NJQ1IxX0NDSVJfRU4JCSgxIDw8IDEwKQorI2RlZmluZSBDU0lDUjFfTUNMS0VOCQkoMSA8PCA5KQorI2RlZmluZSBDU0lDUjFfRkNDCQkoMSA8PCA4KQorI2RlZmluZSBDU0lDUjFfUEFDS19ESVIJCSgxIDw8IDcpCisjZGVmaW5lIENTSUNSMV9DTFJfU1RBVEZJRk8JKDEgPDwgNikKKyNkZWZpbmUgQ1NJQ1IxX0NMUl9SWEZJRk8JKDEgPDwgNSkKKyNkZWZpbmUgQ1NJQ1IxX0dDTEtfTU9ERQkoMSA8PCA0KQorI2RlZmluZSBDU0lDUjFfSU5WX0RBVEEJCSgxIDw8IDMpCisjZGVmaW5lIENTSUNSMV9JTlZfUENMSwkJKDEgPDwgMikKKyNkZWZpbmUgQ1NJQ1IxX1JFREdFCQkoMSA8PCAxKQorCisjZGVmaW5lIFNISUZUX1NUQVRGRl9MRVZFTAkyMgorI2RlZmluZSBTSElGVF9SWEZGX0xFVkVMCTE5CisjZGVmaW5lIFNISUZUX01DTEtESVYJCTEyCisKKy8qIGNvbnRyb2wgcmVnIDMgKi8KKyNkZWZpbmUgQ1NJQ1IzX0ZSTUNOVAkJKDB4RkZGRiA8PCAxNikKKyNkZWZpbmUgQ1NJQ1IzX0ZSTUNOVF9SU1QJKDEgPDwgMTUpCisjZGVmaW5lIENTSUNSM19ETUFfUkVGTEFTSF9SRkYJKDEgPDwgMTQpCisjZGVmaW5lIENTSUNSM19ETUFfUkVGTEFTSF9TRkYJKDEgPDwgMTMpCisjZGVmaW5lIENTSUNSM19ETUFfUkVRX0VOX1JGRgkoMSA8PCAxMikKKyNkZWZpbmUgQ1NJQ1IzX0RNQV9SRVFfRU5fU0ZGCSgxIDw8IDExKQorI2RlZmluZSBDU0lDUjNfUlhGRl9MRVZFTChsKQkoKChsKSAmIDcpIDw8IDQpCS8qIE1YMjUgKi8KKyNkZWZpbmUgQ1NJQ1IzX0NTSV9TVVAJCSgxIDw8IDMpCisjZGVmaW5lIENTSUNSM19aRVJPX1BBQ0tfRU4JKDEgPDwgMikKKyNkZWZpbmUgQ1NJQ1IzX0VDQ19JTlRfRU4JKDEgPDwgMSkKKyNkZWZpbmUgQ1NJQ1IzX0VDQ19BVVRPX0VOCSgxIDw8IDApCisKKyNkZWZpbmUgU0hJRlRfRlJNQ05UCQkxNgorCisvKiBjc2kgc3RhdHVzIHJlZyAqLworI2RlZmluZSBDU0lTUl9TRkZfT1JfSU5UCSgxIDw8IDI1KQorI2RlZmluZSBDU0lTUl9SRkZfT1JfSU5UCSgxIDw8IDI0KQorI2RlZmluZSBDU0lTUl9TVEFURkZfSU5UCSgxIDw8IDIxKQorI2RlZmluZSBDU0lTUl9ETUFfVFNGX0ZCMl9JTlQJKDEgPDwgMjApCS8qIE1YMjUgKi8KKyNkZWZpbmUgQ1NJU1JfRE1BX1RTRl9GQjFfSU5UCSgxIDw8IDE5KQkvKiBNWDI1ICovCisjZGVmaW5lIENTSVNSX1JYRkZfSU5UCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ1NJU1JfRU9GX0lOVAkJKDEgPDwgMTcpCisjZGVmaW5lIENTSVNSX1NPRl9JTlQJCSgxIDw8IDE2KQorI2RlZmluZSBDU0lTUl9GMl9JTlQJCSgxIDw8IDE1KQorI2RlZmluZSBDU0lTUl9GMV9JTlQJCSgxIDw8IDE0KQorI2RlZmluZSBDU0lTUl9DT0ZfSU5UCQkoMSA8PCAxMykKKyNkZWZpbmUgQ1NJU1JfRUNDX0lOVAkJKDEgPDwgMSkKKyNkZWZpbmUgQ1NJU1JfRFJEWQkJKDEgPDwgMCkKKworI2RlZmluZSBDU0lDUjEJCQkweDAwCisjZGVmaW5lIENTSUNSMgkJCTB4MDQKKyNkZWZpbmUgQ1NJU1IJCQkoY3B1X2lzX214MjcoKSA/IDB4MDggOiAweDE4KQorI2RlZmluZSBDU0lTVEFURklGTwkJMHgwYworI2RlZmluZSBDU0lSRklGTwkJMHgxMAorI2RlZmluZSBDU0lSWENOVAkJMHgxNAorI2RlZmluZSBDU0lDUjMJCQkoY3B1X2lzX214MjcoKSA/IDB4MUMgOiAweDA4KQorI2RlZmluZSBDU0lETUFTQV9TVEFURklGTwkweDIwCisjZGVmaW5lIENTSURNQVRBX1NUQVRGSUZPCTB4MjQKKyNkZWZpbmUgQ1NJRE1BU0FfRkIxCQkweDI4CisjZGVmaW5lIENTSURNQVNBX0ZCMgkJMHgyYworI2RlZmluZSBDU0lGQlVGX1BBUkEJCTB4MzAKKyNkZWZpbmUgQ1NJSU1BR19QQVJBCQkweDM0CisKKy8qIEVNTUEgUHJQICovCisjZGVmaW5lIFBSUF9DTlRMCQkJMHgwMAorI2RlZmluZSBQUlBfSU5UUl9DTlRMCQkJMHgwNAorI2RlZmluZSBQUlBfSU5UUlNUQVRVUwkJCTB4MDgKKyNkZWZpbmUgUFJQX1NPVVJDRV9ZX1BUUgkJMHgwYworI2RlZmluZSBQUlBfU09VUkNFX0NCX1BUUgkJMHgxMAorI2RlZmluZSBQUlBfU09VUkNFX0NSX1BUUgkJMHgxNAorI2RlZmluZSBQUlBfREVTVF9SR0IxX1BUUgkJMHgxOAorI2RlZmluZSBQUlBfREVTVF9SR0IyX1BUUgkJMHgxYworI2RlZmluZSBQUlBfREVTVF9ZX1BUUgkJCTB4MjAKKyNkZWZpbmUgUFJQX0RFU1RfQ0JfUFRSCQkJMHgyNAorI2RlZmluZSBQUlBfREVTVF9DUl9QVFIJCQkweDI4CisjZGVmaW5lIFBSUF9TUkNfRlJBTUVfU0laRQkJMHgyYworI2RlZmluZSBQUlBfREVTVF9DSDFfTElORV9TVFJJREUJMHgzMAorI2RlZmluZSBQUlBfU1JDX1BJWEVMX0ZPUk1BVF9DTlRMCTB4MzQKKyNkZWZpbmUgUFJQX0NIMV9QSVhFTF9GT1JNQVRfQ05UTAkweDM4CisjZGVmaW5lIFBSUF9DSDFfT1VUX0lNQUdFX1NJWkUJCTB4M2MKKyNkZWZpbmUgUFJQX0NIMl9PVVRfSU1BR0VfU0laRQkJMHg0MAorI2RlZmluZSBQUlBfU1JDX0xJTkVfU1RSSURFCQkweDQ0CisjZGVmaW5lIFBSUF9DU0NfQ09FRl8wMTIJCTB4NDgKKyNkZWZpbmUgUFJQX0NTQ19DT0VGXzM0NQkJMHg0YworI2RlZmluZSBQUlBfQ1NDX0NPRUZfNjc4CQkweDUwCisjZGVmaW5lIFBSUF9DSDFfUlpfSE9SSV9DT0VGMQkJMHg1NAorI2RlZmluZSBQUlBfQ0gxX1JaX0hPUklfQ09FRjIJCTB4NTgKKyNkZWZpbmUgUFJQX0NIMV9SWl9IT1JJX1ZBTElECQkweDVjCisjZGVmaW5lIFBSUF9DSDFfUlpfVkVSVF9DT0VGMQkJMHg2MAorI2RlZmluZSBQUlBfQ0gxX1JaX1ZFUlRfQ09FRjIJCTB4NjQKKyNkZWZpbmUgUFJQX0NIMV9SWl9WRVJUX1ZBTElECQkweDY4CisjZGVmaW5lIFBSUF9DSDJfUlpfSE9SSV9DT0VGMQkJMHg2YworI2RlZmluZSBQUlBfQ0gyX1JaX0hPUklfQ09FRjIJCTB4NzAKKyNkZWZpbmUgUFJQX0NIMl9SWl9IT1JJX1ZBTElECQkweDc0CisjZGVmaW5lIFBSUF9DSDJfUlpfVkVSVF9DT0VGMQkJMHg3OAorI2RlZmluZSBQUlBfQ0gyX1JaX1ZFUlRfQ09FRjIJCTB4N2MKKyNkZWZpbmUgUFJQX0NIMl9SWl9WRVJUX1ZBTElECQkweDgwCisKKyNkZWZpbmUgUFJQX0NOVExfQ0gxRU4JCSgxIDw8IDApCisjZGVmaW5lIFBSUF9DTlRMX0NIMkVOCQkoMSA8PCAxKQorI2RlZmluZSBQUlBfQ05UTF9DU0lFTgkJKDEgPDwgMikKKyNkZWZpbmUgUFJQX0NOVExfREFUQV9JTl9ZVVY0MjAJKDAgPDwgMykKKyNkZWZpbmUgUFJQX0NOVExfREFUQV9JTl9ZVVY0MjIJKDEgPDwgMykKKyNkZWZpbmUgUFJQX0NOVExfREFUQV9JTl9SR0IxNgkoMiA8PCAzKQorI2RlZmluZSBQUlBfQ05UTF9EQVRBX0lOX1JHQjMyCSgzIDw8IDMpCisjZGVmaW5lIFBSUF9DTlRMX0NIMV9PVVRfUkdCOAkoMCA8PCA1KQorI2RlZmluZSBQUlBfQ05UTF9DSDFfT1VUX1JHQjE2CSgxIDw8IDUpCisjZGVmaW5lIFBSUF9DTlRMX0NIMV9PVVRfUkdCMzIJKDIgPDwgNSkKKyNkZWZpbmUgUFJQX0NOVExfQ0gxX09VVF9ZVVY0MjIJKDMgPDwgNSkKKyNkZWZpbmUgUFJQX0NOVExfQ0gyX09VVF9ZVVY0MjAJKDAgPDwgNykKKyNkZWZpbmUgUFJQX0NOVExfQ0gyX09VVF9ZVVY0MjIgKDEgPDwgNykKKyNkZWZpbmUgUFJQX0NOVExfQ0gyX09VVF9ZVVY0NDQJKDIgPDwgNykKKyNkZWZpbmUgUFJQX0NOVExfQ0gxX0xFTgkoMSA8PCA5KQorI2RlZmluZSBQUlBfQ05UTF9DSDJfTEVOCSgxIDw8IDEwKQorI2RlZmluZSBQUlBfQ05UTF9TS0lQX0ZSQU1FCSgxIDw8IDExKQorI2RlZmluZSBQUlBfQ05UTF9TV1JTVAkJKDEgPDwgMTIpCisjZGVmaW5lIFBSUF9DTlRMX0NMS0VOCQkoMSA8PCAxMykKKyNkZWZpbmUgUFJQX0NOVExfV0VOCQkoMSA8PCAxNCkKKyNkZWZpbmUgUFJQX0NOVExfQ0gxQllQCQkoMSA8PCAxNSkKKyNkZWZpbmUgUFJQX0NOVExfSU5fVFNLSVAoeCkJKCh4KSA8PCAxNikKKyNkZWZpbmUgUFJQX0NOVExfQ0gxX1RTS0lQKHgpCSgoeCkgPDwgMTkpCisjZGVmaW5lIFBSUF9DTlRMX0NIMl9UU0tJUCh4KQkoKHgpIDw8IDIyKQorI2RlZmluZSBQUlBfQ05UTF9JTlBVVF9GSUZPX0xFVkVMKHgpCSgoeCkgPDwgMjUpCisjZGVmaW5lIFBSUF9DTlRMX1JaX0ZJRk9fTEVWRUwoeCkJKCh4KSA8PCAyNykKKyNkZWZpbmUgUFJQX0NOVExfQ0gyQjFFTgkoMSA8PCAyOSkKKyNkZWZpbmUgUFJQX0NOVExfQ0gyQjJFTgkoMSA8PCAzMCkKKyNkZWZpbmUgUFJQX0NOVExfQ0gyRkVOCQkoMSA8PCAzMSkKKworLyogSVJRIEVuYWJsZSBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBSUF9JTlRSX1JERVJSCQkoMSA8PCAwKQorI2RlZmluZSBQUlBfSU5UUl9DSDFXRVJSCSgxIDw8IDEpCisjZGVmaW5lIFBSUF9JTlRSX0NIMldFUlIJKDEgPDwgMikKKyNkZWZpbmUgUFJQX0lOVFJfQ0gxRkMJCSgxIDw8IDMpCisjZGVmaW5lIFBSUF9JTlRSX0NIMkZDCQkoMSA8PCA1KQorI2RlZmluZSBQUlBfSU5UUl9MQk9WRgkJKDEgPDwgNykKKyNkZWZpbmUgUFJQX0lOVFJfQ0gyT1ZGCQkoMSA8PCA4KQorCisjZGVmaW5lIG14MjdfY2FtZXJhX2VtbWEocGNkZXYpCShjcHVfaXNfbXgyNygpICYmIHBjZGV2LT51c2VfZW1tYSkKKworI2RlZmluZSBNQVhfVklERU9fTUVNCTE2CisKK3N0cnVjdCBteDJfY2FtZXJhX2RldiB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0CXNvY19ob3N0OworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkOworCXN0cnVjdCBjbGsJCSpjbGtfY3NpLCAqY2xrX2VtbWE7CisKKwl1bnNpZ25lZCBpbnQJCWlycV9jc2ksIGlycV9lbW1hOworCXZvaWQgX19pb21lbQkJKmJhc2VfY3NpLCAqYmFzZV9lbW1hOworCXVuc2lnbmVkIGxvbmcJCWJhc2VfZG1hOworCisJc3RydWN0IG14Ml9jYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlCQkqcmVzX2NzaSwgKnJlc19lbW1hOworCXVuc2lnbmVkIGxvbmcJCXBsYXRmb3JtX2ZsYWdzOworCisJc3RydWN0IGxpc3RfaGVhZAljYXB0dXJlOworCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlX2J1ZnM7CisKKwlzcGlubG9ja190CQlsb2NrOworCisJaW50CQkJZG1hOworCXN0cnVjdCBteDJfYnVmZmVyCSphY3RpdmU7CisJc3RydWN0IG14Ml9idWZmZXIJKmZiMV9hY3RpdmU7CisJc3RydWN0IG14Ml9idWZmZXIJKmZiMl9hY3RpdmU7CisKKwlpbnQJCQl1c2VfZW1tYTsKKworCXUzMgkJCWNzaWNyMTsKKworCXZvaWQJCQkqZGlzY2FyZF9idWZmZXI7CisJZG1hX2FkZHJfdAkJZGlzY2FyZF9idWZmZXJfZG1hOworCXNpemVfdAkJCWRpc2NhcmRfc2l6ZTsKK307CisKKy8qIGJ1ZmZlciBmb3Igb25lIHZpZGVvIGZyYW1lICovCitzdHJ1Y3QgbXgyX2J1ZmZlciB7CisJLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIJCXZiOworCisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlCWNvZGU7CisKKwlpbnQgYnVmbnVtOworfTsKKworc3RhdGljIHZvaWQgbXgyX2NhbWVyYV9kZWFjdGl2YXRlKHN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNsa19kaXNhYmxlKHBjZGV2LT5jbGtfY3NpKTsKKwl3cml0ZWwoMCwgcGNkZXYtPmJhc2VfY3NpICsgQ1NJQ1IxKTsKKwlpZiAobXgyN19jYW1lcmFfZW1tYShwY2RldikpIHsKKwkJd3JpdGVsKDAsIHBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfQ05UTCk7CisJfSBlbHNlIGlmIChjcHVfaXNfbXgyNSgpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOworCQlwY2Rldi0+ZmIxX2FjdGl2ZSA9IE5VTEw7CisJCXBjZGV2LT5mYjJfYWN0aXZlID0gTlVMTDsKKwkJd3JpdGVsKDAsIHBjZGV2LT5iYXNlX2NzaSArIENTSURNQVNBX0ZCMSk7CisJCXdyaXRlbCgwLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lETUFTQV9GQjIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOworCX0KK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhYnNvbHV0ZWx5IGRlcGVuZCBvbiB0aGUgZmFjdCwgdGhhdAorICogdGhlcmUgY2FuIGJlIG9ubHkgb25lIGNhbWVyYSBvbiBteDIgY2FtZXJhIHNlbnNvciBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBteDJfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlpbnQgcmV0OworCXUzMiBjc2ljcjE7CisKKwlpZiAocGNkZXYtPmljZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldCA9IGNsa19lbmFibGUocGNkZXYtPmNsa19jc2kpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY3NpY3IxID0gQ1NJQ1IxX01DTEtFTjsKKworCWlmIChteDI3X2NhbWVyYV9lbW1hKHBjZGV2KSkgeworCQljc2ljcjEgfD0gQ1NJQ1IxX1BSUF9JRl9FTiB8IENTSUNSMV9GQ0MgfAorCQkJQ1NJQ1IxX1JYRkZfTEVWRUwoMCk7CisJfSBlbHNlIGlmIChjcHVfaXNfbXgyNygpKQorCQljc2ljcjEgfD0gQ1NJQ1IxX1NPRl9JTlRFTiB8IENTSUNSMV9SWEZGX0xFVkVMKDIpOworCisJcGNkZXYtPmNzaWNyMSA9IGNzaWNyMTsKKwl3cml0ZWwocGNkZXYtPmNzaWNyMSwgcGNkZXYtPmJhc2VfY3NpICsgQ1NJQ1IxKTsKKworCXBjZGV2LT5pY2QgPSBpY2Q7CisKKwlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKKwkJIGljZC0+ZGV2bnVtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBteDJfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKworCUJVR19PTihpY2QgIT0gcGNkZXYtPmljZCk7CisKKwlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAorCQkgaWNkLT5kZXZudW0pOworCisJbXgyX2NhbWVyYV9kZWFjdGl2YXRlKHBjZGV2KTsKKworCWlmIChwY2Rldi0+ZGlzY2FyZF9idWZmZXIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoaWNpLT52NGwyX2Rldi5kZXYsIHBjZGV2LT5kaXNjYXJkX3NpemUsCisJCQkJcGNkZXYtPmRpc2NhcmRfYnVmZmVyLAorCQkJCXBjZGV2LT5kaXNjYXJkX2J1ZmZlcl9kbWEpOworCQlwY2Rldi0+ZGlzY2FyZF9idWZmZXIgPSBOVUxMOworCX0KKworCXBjZGV2LT5pY2QgPSBOVUxMOworfQorCisjaWZkZWYgQ09ORklHX01BQ0hfTVgyNworc3RhdGljIHZvaWQgbXgyN19jYW1lcmFfZG1hX2VuYWJsZShzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2KQoreworCXUzMiB0bXA7CisKKwlpbXhfZG1hX2VuYWJsZShwY2Rldi0+ZG1hKTsKKworCXRtcCA9IHJlYWRsKHBjZGV2LT5iYXNlX2NzaSArIENTSUNSMSk7CisJdG1wIHw9IENTSUNSMV9SRl9PUl9JTlRFTjsKKwl3cml0ZWwodG1wLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lDUjEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXgyN19jYW1lcmFfaXJxKGludCBpcnFfY3NpLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBkYXRhOworCXUzMiBzdGF0dXMgPSByZWFkbChwY2Rldi0+YmFzZV9jc2kgKyBDU0lTUik7CisKKwlpZiAoc3RhdHVzICYgQ1NJU1JfU09GX0lOVCAmJiBwY2Rldi0+YWN0aXZlKSB7CisJCXUzMiB0bXA7CisKKwkJdG1wID0gcmVhZGwocGNkZXYtPmJhc2VfY3NpICsgQ1NJQ1IxKTsKKwkJd3JpdGVsKHRtcCB8IENTSUNSMV9DTFJfUlhGSUZPLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lDUjEpOworCQlteDI3X2NhbWVyYV9kbWFfZW5hYmxlKHBjZGV2KTsKKwl9CisKKwl3cml0ZWwoQ1NJU1JfU09GX0lOVCB8IENTSVNSX1JGRl9PUl9JTlQsIHBjZGV2LT5iYXNlX2NzaSArIENTSVNSKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbXgyN19jYW1lcmFfaXJxKGludCBpcnFfY3NpLCB2b2lkICpkYXRhKQoreworCXJldHVybiBJUlFfTk9ORTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTUFDSF9NWDI3ICovCisKK3N0YXRpYyB2b2lkIG14MjVfY2FtZXJhX2ZyYW1lX2RvbmUoc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiwgaW50IGZiLAorCQlpbnQgc3RhdGUpCit7CisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CisJc3RydWN0IG14Ml9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgbXgyX2J1ZmZlciAqKmZiX2FjdGl2ZSA9IGZiID09IDEgPyAmcGNkZXYtPmZiMV9hY3RpdmUgOgorCQkmcGNkZXYtPmZiMl9hY3RpdmU7CisJdTMyIGZiX3JlZyA9IGZiID09IDEgPyBDU0lETUFTQV9GQjEgOiBDU0lETUFTQV9GQjI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOworCisJdmIgPSAmKCpmYl9hY3RpdmUpLT52YjsKKwlkZXZfZGJnKHBjZGV2LT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CisKKwl2Yi0+c3RhdGUgPSBzdGF0ZTsKKwlkb19nZXR0aW1lb2ZkYXkoJnZiLT50cyk7CisJdmItPmZpZWxkX2NvdW50Kys7CisKKwl3YWtlX3VwKCZ2Yi0+ZG9uZSk7CisKKwlpZiAobGlzdF9lbXB0eSgmcGNkZXYtPmNhcHR1cmUpKSB7CisJCWJ1ZiA9IE5VTEw7CisJCXdyaXRlbCgwLCBwY2Rldi0+YmFzZV9jc2kgKyBmYl9yZWcpOworCX0gZWxzZSB7CisJCWJ1ZiA9IGxpc3RfZW50cnkocGNkZXYtPmNhcHR1cmUubmV4dCwgc3RydWN0IG14Ml9idWZmZXIsCisJCQkJdmIucXVldWUpOworCQl2YiA9ICZidWYtPnZiOworCQlsaXN0X2RlbCgmdmItPnF1ZXVlKTsKKwkJdmItPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQl3cml0ZWwodmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YiksIHBjZGV2LT5iYXNlX2NzaSArIGZiX3JlZyk7CisJfQorCisJKmZiX2FjdGl2ZSA9IGJ1ZjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBteDI1X2NhbWVyYV9pcnEoaW50IGlycV9jc2ksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGRhdGE7CisJdTMyIHN0YXR1cyA9IHJlYWRsKHBjZGV2LT5iYXNlX2NzaSArIENTSVNSKTsKKworCWlmIChzdGF0dXMgJiBDU0lTUl9ETUFfVFNGX0ZCMV9JTlQpCisJCW14MjVfY2FtZXJhX2ZyYW1lX2RvbmUocGNkZXYsIDEsIFZJREVPQlVGX0RPTkUpOworCWVsc2UgaWYgKHN0YXR1cyAmIENTSVNSX0RNQV9UU0ZfRkIyX0lOVCkKKwkJbXgyNV9jYW1lcmFfZnJhbWVfZG9uZShwY2RldiwgMiwgVklERU9CVUZfRE9ORSk7CisKKwkvKiBGSVhNRTogaGFuZGxlIENTSVNSX1JGRl9PUl9JTlQgKi8KKworCXdyaXRlbChzdGF0dXMsIHBjZGV2LT5iYXNlX2NzaSArIENTSVNSKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqICBWaWRlb2J1ZiBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgbXgyX3ZpZGVvYnVmX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqY291bnQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOworCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKKworCWRldl9kYmcoJmljZC0+ZGV2LCAiY291bnQ9JWQsIHNpemU9JWRcbiIsICpjb3VudCwgKnNpemUpOworCisJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKKwkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOworCisJKnNpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CisKKwlpZiAoMCA9PSAqY291bnQpCisJCSpjb3VudCA9IDMyOworCWlmICgqc2l6ZSAqICpjb3VudCA+IE1BWF9WSURFT19NRU0gKiAxMDI0ICogMTAyNCkKKwkJKmNvdW50ID0gKE1BWF9WSURFT19NRU0gKiAxMDI0ICogMTAyNCkgLyAqc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgbXgyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiA9ICZidWYtPnZiOworCisJZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CisKKwkvKgorCSAqIFRoaXMgd2FpdHMgdW50aWwgdGhpcyBidWZmZXIgaXMgb3V0IG9mIGRhbmdlciwgaS5lLiwgdW50aWwgaXQgaXMgbm8KKwkgKiBsb25nZXIgaW4gU1RBVEVfUVVFVUVEIG9yIFNUQVRFX0FDVElWRQorCSAqLworCXZpZGVvYnVmX3dhaXRvbih2YiwgMCwgMCk7CisKKwl2aWRlb2J1Zl9kbWFfY29udGlnX2ZyZWUodnEsIHZiKTsKKwlkZXZfZGJnKCZpY2QtPmRldiwgIiVzIGZyZWVkXG4iLCBfX2Z1bmNfXyk7CisKKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOworfQorCitzdGF0aWMgaW50IG14Ml92aWRlb2J1Zl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCisJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLCBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBteDJfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDJfYnVmZmVyLCB2Yik7CisJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCWludCByZXQgPSAwOworCisJZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CisKKwlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQorCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CisKKyNpZmRlZiBERUJVRworCS8qCisJICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBmaWxsCisJICogdGhlIGJ1ZmZlciB3aXRoIHNvbWV0aGluZworCSAqLworCW1lbXNldCgodm9pZCAqKXZiLT5iYWRkciwgMHhhYSwgdmItPmJzaXplKTsKKyNlbmRpZgorCisJaWYgKGJ1Zi0+Y29kZQkhPSBpY2QtPmN1cnJlbnRfZm10LT5jb2RlIHx8CisJICAgIHZiLT53aWR0aAkhPSBpY2QtPnVzZXJfd2lkdGggfHwKKwkgICAgdmItPmhlaWdodAkhPSBpY2QtPnVzZXJfaGVpZ2h0IHx8CisJICAgIHZiLT5maWVsZAkhPSBmaWVsZCkgeworCQlidWYtPmNvZGUJPSBpY2QtPmN1cnJlbnRfZm10LT5jb2RlOworCQl2Yi0+d2lkdGgJPSBpY2QtPnVzZXJfd2lkdGg7CisJCXZiLT5oZWlnaHQJPSBpY2QtPnVzZXJfaGVpZ2h0OworCQl2Yi0+ZmllbGQJPSBmaWVsZDsKKwkJdmItPnN0YXRlCT0gVklERU9CVUZfTkVFRFNfSU5JVDsKKwl9CisKKwl2Yi0+c2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogdmItPmhlaWdodDsKKwlpZiAodmItPmJhZGRyICYmIHZiLT5ic2l6ZSA8IHZiLT5zaXplKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2Yi0+c3RhdGUgPT0gVklERU9CVUZfTkVFRFNfSU5JVCkgeworCQlyZXQgPSB2aWRlb2J1Zl9pb2xvY2sodnEsIHZiLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKKworCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9QUkVQQVJFRDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlmcmVlX2J1ZmZlcih2cSwgYnVmKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBteDJfdmlkZW9idWZfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCSAgICAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KKwkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgbXgyX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgbXgyX2J1ZmZlciwgdmIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpY2QtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOworCisJdmItPnN0YXRlID0gVklERU9CVUZfUVVFVUVEOworCWxpc3RfYWRkX3RhaWwoJnZiLT5xdWV1ZSwgJnBjZGV2LT5jYXB0dXJlKTsKKworCWlmIChteDI3X2NhbWVyYV9lbW1hKHBjZGV2KSkgeworCQlnb3RvIG91dDsKKyNpZmRlZiBDT05GSUdfTUFDSF9NWDI3CisJfSBlbHNlIGlmIChjcHVfaXNfbXgyNygpKSB7CisJCWludCByZXQ7CisKKwkJaWYgKHBjZGV2LT5hY3RpdmUgPT0gTlVMTCkgeworCQkJcmV0ID0gaW14X2RtYV9zZXR1cF9zaW5nbGUocGNkZXYtPmRtYSwKKwkJCQkJdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YiksIHZiLT5zaXplLAorCQkJCQkodTMyKXBjZGV2LT5iYXNlX2RtYSArIDB4MTAsCisJCQkJCURNQV9NT0RFX1JFQUQpOworCQkJaWYgKHJldCkgeworCQkJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOworCQkJCXdha2VfdXAoJnZiLT5kb25lKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJdmItPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkJcGNkZXYtPmFjdGl2ZSA9IGJ1ZjsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsgLyogY3B1X2lzX214MjUoKSAqLworCQl1MzIgY3NpY3IzLCBkbWFfaW50ZW4gPSAwOworCisJCWlmIChwY2Rldi0+ZmIxX2FjdGl2ZSA9PSBOVUxMKSB7CisJCQl3cml0ZWwodmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YiksCisJCQkJCXBjZGV2LT5iYXNlX2NzaSArIENTSURNQVNBX0ZCMSk7CisJCQlwY2Rldi0+ZmIxX2FjdGl2ZSA9IGJ1ZjsKKwkJCWRtYV9pbnRlbiA9IENTSUNSMV9GQjFfRE1BX0lOVEVOOworCQl9IGVsc2UgaWYgKHBjZGV2LT5mYjJfYWN0aXZlID09IE5VTEwpIHsKKwkJCXdyaXRlbCh2aWRlb2J1Zl90b19kbWFfY29udGlnKHZiKSwKKwkJCQkJcGNkZXYtPmJhc2VfY3NpICsgQ1NJRE1BU0FfRkIyKTsKKwkJCXBjZGV2LT5mYjJfYWN0aXZlID0gYnVmOworCQkJZG1hX2ludGVuID0gQ1NJQ1IxX0ZCMl9ETUFfSU5URU47CisJCX0KKworCQlpZiAoZG1hX2ludGVuKSB7CisJCQlsaXN0X2RlbCgmdmItPnF1ZXVlKTsKKwkJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKworCQkJY3NpY3IzID0gcmVhZGwocGNkZXYtPmJhc2VfY3NpICsgQ1NJQ1IzKTsKKworCQkJLyogUmVmbGFzaCBETUEgKi8KKwkJCXdyaXRlbChjc2ljcjMgfCBDU0lDUjNfRE1BX1JFRkxBU0hfUkZGLAorCQkJCQlwY2Rldi0+YmFzZV9jc2kgKyBDU0lDUjMpOworCisJCQkvKiBjbGVhciAmIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCQl3cml0ZWwoZG1hX2ludGVuLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lTUik7CisJCQlwY2Rldi0+Y3NpY3IxIHw9IGRtYV9pbnRlbjsKKwkJCXdyaXRlbChwY2Rldi0+Y3NpY3IxLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lDUjEpOworCisJCQkvKiBlbmFibGUgRE1BICovCisJCQljc2ljcjMgfD0gQ1NJQ1IzX0RNQV9SRVFfRU5fUkZGIHwgQ1NJQ1IzX1JYRkZfTEVWRUwoMSk7CisJCQl3cml0ZWwoY3NpY3IzLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lDUjMpOworCQl9CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNkZXYtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXgyX3ZpZGVvYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CisJc3RydWN0IG14Ml9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG14Ml9idWZmZXIsIHZiKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUcKKwlkZXZfZGJnKCZpY2QtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKKworCXN3aXRjaCAodmItPnN0YXRlKSB7CisJY2FzZSBWSURFT0JVRl9BQ1RJVkU6CisJCWRldl9pbmZvKCZpY2QtPmRldiwgIiVzIChhY3RpdmUpXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgVklERU9CVUZfUVVFVUVEOgorCQlkZXZfaW5mbygmaWNkLT5kZXYsICIlcyAocXVldWVkKVxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwljYXNlIFZJREVPQlVGX1BSRVBBUkVEOgorCQlkZXZfaW5mbygmaWNkLT5kZXYsICIlcyAocHJlcGFyZWQpXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9pbmZvKCZpY2QtPmRldiwgIiVzICh1bmtub3duKSAlZFxuIiwgX19mdW5jX18sCisJCQkJdmItPnN0YXRlKTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFRlcm1pbmF0ZSBvbmx5IHF1ZXVlZCBidXQgaW5hY3RpdmUgYnVmZmVycy4gQWN0aXZlIGJ1ZmZlcnMgYXJlCisJICogcmVsZWFzZWQgd2hlbiB0aGV5IGJlY29tZSBpbmFjdGl2ZSBhZnRlciB2aWRlb2J1Zl93YWl0b24oKS4KKwkgKgorCSAqIEZJWE1FOiBpbXBsZW1lbnQgZm9yY2VkIHRlcm1pbmF0aW9uIG9mIGFjdGl2ZSBidWZmZXJzLCBzbyB0aGF0IHRoZQorCSAqIHVzZXIgd29uJ3QgZ2V0IHN0dWNrIGluIGFuIHVuaW50ZXJydXB0aWJsZSBzdGF0ZS4gVGhpcyByZXF1aXJlcyBhCisJICogc3BlY2lmaWMgaGFuZGxpbmcgZm9yIGVhY2ggb2YgdGhlIHRocmVlIERNQSB0eXBlcyB0aGF0IHRoaXMgZHJpdmVyCisJICogc3VwcG9ydHMuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7CisJaWYgKHZiLT5zdGF0ZSA9PSBWSURFT0JVRl9RVUVVRUQpIHsKKwkJbGlzdF9kZWwoJnZiLT5xdWV1ZSk7CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOworCisJZnJlZV9idWZmZXIodnEsIGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIG14Ml92aWRlb2J1Zl9vcHMgPSB7CisJLmJ1Zl9zZXR1cCAgICAgID0gbXgyX3ZpZGVvYnVmX3NldHVwLAorCS5idWZfcHJlcGFyZSAgICA9IG14Ml92aWRlb2J1Zl9wcmVwYXJlLAorCS5idWZfcXVldWUgICAgICA9IG14Ml92aWRlb2J1Zl9xdWV1ZSwKKwkuYnVmX3JlbGVhc2UgICAgPSBteDJfdmlkZW9idWZfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIG14Ml9jYW1lcmFfaW5pdF92aWRlb2J1ZihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkgICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OworCisJdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KHEsICZteDJfdmlkZW9idWZfb3BzLCBwY2Rldi0+ZGV2LAorCQkJJnBjZGV2LT5sb2NrLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQlWNEwyX0ZJRUxEX05PTkUsIHNpemVvZihzdHJ1Y3QgbXgyX2J1ZmZlciksIGljZCk7Cit9CisKKyNkZWZpbmUgTVgyX0JVU19GTEFHUwkoU09DQU1fREFUQVdJRFRIXzggfCBcCisJCQlTT0NBTV9NQVNURVIgfCBcCisJCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFwKKwkJCVNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgfCBcCisJCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFwKKwkJCVNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgfCBcCisJCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBcCisJCQlTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgXAorCQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFwKKwkJCVNPQ0FNX0RBVEFfQUNUSVZFX0xPVykKKworc3RhdGljIGludCBteDI3X2NhbWVyYV9lbW1hX3BycF9yZXNldChzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2KQoreworCXUzMiBjbnRsOworCWludCBjb3VudCA9IDA7CisKKwljbnRsID0gcmVhZGwocGNkZXYtPmJhc2VfZW1tYSArIFBSUF9DTlRMKTsKKwl3cml0ZWwoUFJQX0NOVExfU1dSU1QsIHBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfQ05UTCk7CisJd2hpbGUgKGNvdW50KysgPCAxMDApIHsKKwkJaWYgKCEocmVhZGwocGNkZXYtPmJhc2VfZW1tYSArIFBSUF9DTlRMKSAmIFBSUF9DTlRMX1NXUlNUKSkKKwkJCXJldHVybiAwOworCQliYXJyaWVyKCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHZvaWQgbXgyN19jYW1lcmFfZW1tYV9idWZfaW5pdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJaW50IGJ5dGVzcGVybGluZSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQorCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OworCisJd3JpdGVsKHBjZGV2LT5kaXNjYXJkX2J1ZmZlcl9kbWEsCisJCQlwY2Rldi0+YmFzZV9lbW1hICsgUFJQX0RFU1RfUkdCMV9QVFIpOworCXdyaXRlbChwY2Rldi0+ZGlzY2FyZF9idWZmZXJfZG1hLAorCQkJcGNkZXYtPmJhc2VfZW1tYSArIFBSUF9ERVNUX1JHQjJfUFRSKTsKKworCS8qCisJICogV2Ugb25seSB1c2UgdGhlIEVNTUEgZW5naW5lIHRvIGdldCByaWQgb2YgdGhlIGJyb2tlbgorCSAqIERNQSBFbmdpbmUuIE5vIGNvbG9yIHNwYWNlIGNvbnN2ZXJzaW9uIGF0IHRoZSBtb21lbnQuCisJICogV2UgYWRqdXN0IGluY29taW5nIGFuZCBvdXRnb2luZyBwaXhlbGZvcm1hdCB0byByZ2IxNgorCSAqIGFuZCBhZGp1c3QgdGhlIGJ5dGVzcGVybGluZSBhY2NvcmRpbmdseS4KKwkgKi8KKwl3cml0ZWwoUFJQX0NOVExfQ0gxRU4gfAorCQkJUFJQX0NOVExfQ1NJRU4gfAorCQkJUFJQX0NOVExfREFUQV9JTl9SR0IxNiB8CisJCQlQUlBfQ05UTF9DSDFfT1VUX1JHQjE2IHwKKwkJCVBSUF9DTlRMX0NIMV9MRU4gfAorCQkJUFJQX0NOVExfQ0gxQllQIHwKKwkJCVBSUF9DTlRMX0NIMV9UU0tJUCgwKSB8CisJCQlQUlBfQ05UTF9JTl9UU0tJUCgwKSwKKwkJCXBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfQ05UTCk7CisKKwl3cml0ZWwoKChieXRlc3BlcmxpbmUgPj4gMSkgPDwgMTYpIHwgaWNkLT51c2VyX2hlaWdodCwKKwkJCXBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfU1JDX0ZSQU1FX1NJWkUpOworCXdyaXRlbCgoKGJ5dGVzcGVybGluZSA+PiAxKSA8PCAxNikgfCBpY2QtPnVzZXJfaGVpZ2h0LAorCQkJcGNkZXYtPmJhc2VfZW1tYSArIFBSUF9DSDFfT1VUX0lNQUdFX1NJWkUpOworCXdyaXRlbChieXRlc3BlcmxpbmUsCisJCQlwY2Rldi0+YmFzZV9lbW1hICsgUFJQX0RFU1RfQ0gxX0xJTkVfU1RSSURFKTsKKwl3cml0ZWwoMHgyY2EwMDU2NSwgLyogUkdCNTY1ICovCisJCQlwY2Rldi0+YmFzZV9lbW1hICsgUFJQX1NSQ19QSVhFTF9GT1JNQVRfQ05UTCk7CisJd3JpdGVsKDB4MmNhMDA1NjUsIC8qIFJHQjU2NSAqLworCQkJcGNkZXYtPmJhc2VfZW1tYSArIFBSUF9DSDFfUElYRUxfRk9STUFUX0NOVEwpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoUFJQX0lOVFJfUkRFUlIgfAorCQkJUFJQX0lOVFJfQ0gxV0VSUiB8CisJCQlQUlBfSU5UUl9DSDJXRVJSIHwKKwkJCVBSUF9JTlRSX0NIMUZDIHwKKwkJCVBSUF9JTlRSX0NIMkZDIHwKKwkJCVBSUF9JTlRSX0xCT1ZGIHwKKwkJCVBSUF9JTlRSX0NIMk9WRiwKKwkJCXBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfSU5UUl9DTlRMKTsKK30KKworc3RhdGljIGludCBteDJfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCV9fdTMyIHBpeGZtdCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQorCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OworCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CisJaW50IHJldCA9IDA7CisJaW50IGJ5dGVzcGVybGluZTsKKwl1MzIgY3NpY3IxID0gcGNkZXYtPmNzaWNyMTsKKworCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKKworCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLAorCQkJCU1YMl9CVVNfRkxBR1MpOworCWlmICghY29tbW9uX2ZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKSkgeworCQlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9IU1lOQ19ISUdIKQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfTE9XOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIOworCX0KKworCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKKwkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfUENMS19TQU1QTEVfUklTSU5HKQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORzsKKwl9CisKKwlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykKKwkJY3NpY3IxIHw9IENTSUNSMV9JTlZfUENMSzsKKwlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpCisJCWNzaWNyMSB8PSBDU0lDUjFfU09GX1BPTDsKKwlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpCisJCWNzaWNyMSB8PSBDU0lDUjFfSFNZTkNfUE9MOworCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBNWDJfQ0FNRVJBX1NXQVAxNikKKwkJY3NpY3IxIHw9IENTSUNSMV9TV0FQMTZfRU47CisJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfRVhUX1ZTWU5DKQorCQljc2ljcjEgfD0gQ1NJQ1IxX0VYVF9WU1lOQzsKKwlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9DQ0lSKQorCQljc2ljcjEgfD0gQ1NJQ1IxX0NDSVJfRU47CisJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfQ0NJUl9JTlRFUkxBQ0UpCisJCWNzaWNyMSB8PSBDU0lDUjFfQ0NJUl9NT0RFOworCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBNWDJfQ0FNRVJBX0dBVEVEX0NMT0NLKQorCQljc2ljcjEgfD0gQ1NJQ1IxX0dDTEtfTU9ERTsKKwlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9JTlZfREFUQSkKKwkJY3NpY3IxIHw9IENTSUNSMV9JTlZfREFUQTsKKwlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9QQUNLX0RJUl9NU0IpCisJCWNzaWNyMSB8PSBDU0lDUjFfUEFDS19ESVI7CisKKwlwY2Rldi0+Y3NpY3IxID0gY3NpY3IxOworCisJYnl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCWlmIChieXRlc3BlcmxpbmUgPCAwKQorCQlyZXR1cm4gYnl0ZXNwZXJsaW5lOworCisJaWYgKG14MjdfY2FtZXJhX2VtbWEocGNkZXYpKSB7CisJCXJldCA9IG14MjdfY2FtZXJhX2VtbWFfcHJwX3Jlc2V0KHBjZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHBjZGV2LT5kaXNjYXJkX2J1ZmZlcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGljaS0+djRsMl9kZXYuZGV2LAorCQkJCXBjZGV2LT5kaXNjYXJkX3NpemUsIHBjZGV2LT5kaXNjYXJkX2J1ZmZlciwKKwkJCQlwY2Rldi0+ZGlzY2FyZF9idWZmZXJfZG1hKTsKKworCQkvKgorCQkgKiBJIGRpZG4ndCBtYW5hZ2UgdG8gcHJvcGVybHkgZW5hYmxlL2Rpc2FibGUgdGhlIHBycAorCQkgKiBvbiBhIHBlciBmcmFtZSBiYXNpcyBkdXJpbmcgcnVubmluZyB0cmFuc2ZlcnMsCisJCSAqIHRodXMgd2UgYWxsb2NhdGUgYSBidWZmZXIgaGVyZSBhbmQgdXNlIGl0IHRvCisJCSAqIGRpc2NhcmQgZnJhbWVzIHdoZW4gbm8gYnVmZmVyIGlzIGF2YWlsYWJsZS4KKwkJICogRmVlbCBmcmVlIHRvIHdvcmsgb24gdGhpcyA7KQorCQkgKi8KKwkJcGNkZXYtPmRpc2NhcmRfc2l6ZSA9IGljZC0+dXNlcl9oZWlnaHQgKiBieXRlc3BlcmxpbmU7CisJCXBjZGV2LT5kaXNjYXJkX2J1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudChpY2ktPnY0bDJfZGV2LmRldiwKKwkJCQlwY2Rldi0+ZGlzY2FyZF9zaXplLCAmcGNkZXYtPmRpc2NhcmRfYnVmZmVyX2RtYSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFwY2Rldi0+ZGlzY2FyZF9idWZmZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlteDI3X2NhbWVyYV9lbW1hX2J1Zl9pbml0KGljZCwgYnl0ZXNwZXJsaW5lKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19teDI1KCkpIHsKKwkJd3JpdGVsKChieXRlc3BlcmxpbmUgKiBpY2QtPnVzZXJfaGVpZ2h0KSA+PiAyLAorCQkJCXBjZGV2LT5iYXNlX2NzaSArIENTSVJYQ05UKTsKKwkJd3JpdGVsKChieXRlc3BlcmxpbmUgPDwgMTYpIHwgaWNkLT51c2VyX2hlaWdodCwKKwkJCQlwY2Rldi0+YmFzZV9jc2kgKyBDU0lJTUFHX1BBUkEpOworCX0KKworCXdyaXRlbChwY2Rldi0+Y3NpY3IxLCBwY2Rldi0+YmFzZV9jc2kgKyBDU0lDUjEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXgyX2NhbWVyYV9zZXRfY3JvcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQlzdHJ1Y3QgdjRsMl9jcm9wICphKQoreworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOworCWludCByZXQ7CisKKwlzb2NfY2FtZXJhX2xpbWl0X3NpZGUoJnJlY3QtPmxlZnQsICZyZWN0LT53aWR0aCwgMCwgMiwgNDA5Nik7CisJc29jX2NhbWVyYV9saW1pdF9zaWRlKCZyZWN0LT50b3AsICZyZWN0LT5oZWlnaHQsIDAsIDIsIDQwOTYpOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfY3JvcCwgYSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBUaGUgY2FwdHVyZSBkZXZpY2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0cyBvdXRwdXQgICovCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19mbXQsICZtZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNlbnNvciBjcm9wcGVkICVkeCVkXG4iLAorCQltZi53aWR0aCwgbWYuaGVpZ2h0KTsKKworCWljZC0+dXNlcl93aWR0aAkJPSBtZi53aWR0aDsKKwlpY2QtPnVzZXJfaGVpZ2h0CT0gbWYuaGVpZ2h0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteDJfY2FtZXJhX3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOworCWludCByZXQ7CisKKwl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4LT5waXhlbGZvcm1hdCk7CisJaWYgKCF4bGF0ZSkgeworCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLAorCQkJCXBpeC0+cGl4ZWxmb3JtYXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBlTU1BIGNhbiBvbmx5IGRvIFJHQjU2NSAqLworCWlmIChteDI3X2NhbWVyYV9lbW1hKHBjZGV2KSAmJiBwaXgtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9SR0I1NjUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWYud2lkdGgJPSBwaXgtPndpZHRoOworCW1mLmhlaWdodAk9IHBpeC0+aGVpZ2h0OworCW1mLmZpZWxkCT0gcGl4LT5maWVsZDsKKwltZi5jb2xvcnNwYWNlCT0gcGl4LT5jb2xvcnNwYWNlOworCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2ZtdCwgJm1mKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG1mLmNvZGUgIT0geGxhdGUtPmNvZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJcGl4LT53aWR0aAkJPSBtZi53aWR0aDsKKwlwaXgtPmhlaWdodAkJPSBtZi5oZWlnaHQ7CisJcGl4LT5maWVsZAkJPSBtZi5maWVsZDsKKwlwaXgtPmNvbG9yc3BhY2UJCT0gbWYuY29sb3JzcGFjZTsKKwlpY2QtPmN1cnJlbnRfZm10CT0geGxhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteDJfY2FtZXJhX3RyeV9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CisJX191MzIgcGl4Zm10ID0gcGl4LT5waXhlbGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgd2lkdGhfbGltaXQ7CisJaW50IHJldDsKKworCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOworCWlmIChwaXhmbXQgJiYgIXhsYXRlKSB7CisJCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZJWE1FOiBpbXBsZW1lbnQgTVgyNyBsaW1pdHMgKi8KKworCS8qIGVNTUEgY2FuIG9ubHkgZG8gUkdCNTY1ICovCisJaWYgKG14MjdfY2FtZXJhX2VtbWEocGNkZXYpICYmIHBpeGZtdCAhPSBWNEwyX1BJWF9GTVRfUkdCNTY1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGxpbWl0IHRvIE1YMjUgaGFyZHdhcmUgY2FwYWJpbGl0aWVzICovCisJaWYgKGNwdV9pc19teDI1KCkpIHsKKwkJaWYgKHhsYXRlLT5ob3N0X2ZtdC0+Yml0c19wZXJfc2FtcGxlIDw9IDgpCisJCQl3aWR0aF9saW1pdCA9IDB4ZmZmZiAqIDQ7CisJCWVsc2UKKwkJCXdpZHRoX2xpbWl0ID0gMHhmZmZmICogMjsKKwkJLyogQ1NJSU1BR19QQVJBIGxpbWl0ICovCisJCWlmIChwaXgtPndpZHRoID4gd2lkdGhfbGltaXQpCisJCQlwaXgtPndpZHRoID0gd2lkdGhfbGltaXQ7CisJCWlmIChwaXgtPmhlaWdodCA+IDB4ZmZmZikKKwkJCXBpeC0+aGVpZ2h0ID0gMHhmZmZmOworCisJCXBpeC0+Ynl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUocGl4LT53aWR0aCwKKwkJCQl4bGF0ZS0+aG9zdF9mbXQpOworCQlpZiAocGl4LT5ieXRlc3BlcmxpbmUgPCAwKQorCQkJcmV0dXJuIHBpeC0+Ynl0ZXNwZXJsaW5lOworCQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7CisJCWlmIChwaXgtPnNpemVpbWFnZSA+ICg0ICogMHgzZmZmZikpIHsgLyogQ1NJUlhDTlQgbGltaXQgKi8KKwkJCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJCQkJIkltYWdlIHNpemUgKCV1KSBhYm92ZSBsaW1pdFxuIiwKKwkJCQkJcGl4LT5zaXplaW1hZ2UpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBsaW1pdCB0byBzZW5zb3IgY2FwYWJpbGl0aWVzICovCisJbWYud2lkdGgJPSBwaXgtPndpZHRoOworCW1mLmhlaWdodAk9IHBpeC0+aGVpZ2h0OworCW1mLmZpZWxkCT0gcGl4LT5maWVsZDsKKwltZi5jb2xvcnNwYWNlCT0gcGl4LT5jb2xvcnNwYWNlOworCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgdHJ5X21idXNfZm10LCAmbWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG1mLmZpZWxkID09IFY0TDJfRklFTERfQU5ZKQorCQltZi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlpZiAobWYuZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKSB7CisJCWRldl9lcnIoaWNkLT5kZXYucGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCisJCQkJbWYuZmllbGQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaXgtPndpZHRoCT0gbWYud2lkdGg7CisJcGl4LT5oZWlnaHQJPSBtZi5oZWlnaHQ7CisJcGl4LT5maWVsZAk9IG1mLmZpZWxkOworCXBpeC0+Y29sb3JzcGFjZQk9IG1mLmNvbG9yc3BhY2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteDJfY2FtZXJhX3F1ZXJ5Y2FwKHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJLyogY2FwLT5uYW1lIGlzIHNldCBieSB0aGUgZnJpZW5kbHkgY2FsbGVyOi0+ICovCisJc3RybGNweShjYXAtPmNhcmQsIE1YMl9DQU1fRFJJVkVSX0RFU0NSSVBUSU9OLCBzaXplb2YoY2FwLT5jYXJkKSk7CisJY2FwLT52ZXJzaW9uID0gTVgyX0NBTV9WRVJTSU9OX0NPREU7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXgyX2NhbWVyYV9yZXFidWZzKHN0cnVjdCBzb2NfY2FtZXJhX2ZpbGUgKmljZiwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHAtPmNvdW50OyBpKyspIHsKKwkJc3RydWN0IG14Ml9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZihpY2YtPnZiX3ZpZHEuYnVmc1tpXSwKKwkJCQkJCSAgICAgIHN0cnVjdCBteDJfYnVmZmVyLCB2Yik7CisJCUlOSVRfTElTVF9IRUFEKCZidWYtPnZiLnF1ZXVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19NQUNIX01YMjcKK3N0YXRpYyB2b2lkIG14MjdfY2FtZXJhX2ZyYW1lX2RvbmUoc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiwgaW50IHN0YXRlKQoreworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOworCXN0cnVjdCBteDJfYnVmZmVyICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXBjZGV2LT5hY3RpdmUpIHsKKwkJZGV2X2VycihwY2Rldi0+ZGV2LCAiJXMgY2FsbGVkIHdpdGggbm8gYWN0aXZlIGJ1ZmZlciFcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CisKKwl2YiA9ICZwY2Rldi0+YWN0aXZlLT52YjsKKwlidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDJfYnVmZmVyLCB2Yik7CisJV0FSTl9PTihsaXN0X2VtcHR5KCZ2Yi0+cXVldWUpKTsKKwlkZXZfZGJnKHBjZGV2LT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CisKKwkvKiBfaW5pdCBpcyB1c2VkIHRvIGRlYnVnIHJhY2VzLCBzZWUgY29tbWVudCBpbiBweGFfY2FtZXJhX3JlcWJ1ZnMoKSAqLworCWxpc3RfZGVsX2luaXQoJnZiLT5xdWV1ZSk7CisJdmItPnN0YXRlID0gc3RhdGU7CisJZG9fZ2V0dGltZW9mZGF5KCZ2Yi0+dHMpOworCXZiLT5maWVsZF9jb3VudCsrOworCisJd2FrZV91cCgmdmItPmRvbmUpOworCisJaWYgKGxpc3RfZW1wdHkoJnBjZGV2LT5jYXB0dXJlKSkgeworCQlwY2Rldi0+YWN0aXZlID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGNkZXYtPmFjdGl2ZSA9IGxpc3RfZW50cnkocGNkZXYtPmNhcHR1cmUubmV4dCwKKwkJCXN0cnVjdCBteDJfYnVmZmVyLCB2Yi5xdWV1ZSk7CisKKwl2YiA9ICZwY2Rldi0+YWN0aXZlLT52YjsKKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CisKKwlyZXQgPSBpbXhfZG1hX3NldHVwX3NpbmdsZShwY2Rldi0+ZG1hLCB2aWRlb2J1Zl90b19kbWFfY29udGlnKHZiKSwKKwkJCXZiLT5zaXplLCAodTMyKXBjZGV2LT5iYXNlX2RtYSArIDB4MTAsIERNQV9NT0RFX1JFQUQpOworCisJaWYgKHJldCkgeworCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9FUlJPUjsKKwkJcGNkZXYtPmFjdGl2ZSA9IE5VTEw7CisJCXdha2VfdXAoJnZiLT5kb25lKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBteDI3X2NhbWVyYV9kbWFfZXJyX2NhbGxiYWNrKGludCBjaGFubmVsLCB2b2lkICpkYXRhLCBpbnQgZXJyKQoreworCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBkYXRhOworCisJbXgyN19jYW1lcmFfZnJhbWVfZG9uZShwY2RldiwgVklERU9CVUZfRVJST1IpOworfQorCitzdGF0aWMgdm9pZCBteDI3X2NhbWVyYV9kbWFfY2FsbGJhY2soaW50IGNoYW5uZWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGRhdGE7CisKKwlteDI3X2NhbWVyYV9mcmFtZV9kb25lKHBjZGV2LCBWSURFT0JVRl9ET05FKTsKK30KKworI2RlZmluZSBETUFfUkVRX0NTSV9SWCAgICAgICAgICAzMSAvKiBGSVhNRTogQWRkIHRoaXMgdG8gYSByZXNvdXJjZSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteDI3X2NhbWVyYV9kbWFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2KQoreworCWludCBlcnI7CisKKwlwY2Rldi0+ZG1hID0gaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8oIkNTSSBSWCBETUEiLCBETUFfUFJJT19ISUdIKTsKKwlpZiAocGNkZXYtPmRtYSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWxcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gcGNkZXYtPmRtYTsKKwl9CisKKwllcnIgPSBpbXhfZG1hX3NldHVwX2hhbmRsZXJzKHBjZGV2LT5kbWEsIG14MjdfY2FtZXJhX2RtYV9jYWxsYmFjaywKKwkJCQkJbXgyN19jYW1lcmFfZG1hX2Vycl9jYWxsYmFjaywgcGNkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkIHRvIHNldCBETUEgY2FsbGJhY2tcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZXJyID0gaW14X2RtYV9jb25maWdfY2hhbm5lbChwY2Rldi0+ZG1hLAorCQkJSU1YX0RNQV9NRU1TSVpFXzMyIHwgSU1YX0RNQV9UWVBFX0ZJRk8sCisJCQlJTVhfRE1BX01FTVNJWkVfMzIgfCBJTVhfRE1BX1RZUEVfTElORUFSLAorCQkJRE1BX1JFUV9DU0lfUlgsIDEpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkIHRvIGNvbmZpZyBETUEgY2hhbm5lbFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpbXhfZG1hX2NvbmZpZ19idXJzdGxlbihwY2Rldi0+ZG1hLCA2NCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlpbXhfZG1hX2ZyZWUocGNkZXYtPmRtYSk7CisKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIENPTkZJR19NQUNIX01YMjcgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBteDJfY2FtZXJhX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2ZpbGUgKmljZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmaWNmLT52Yl92aWRxLCBwdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0X29wcyBteDJfc29jX2NhbWVyYV9ob3N0X29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmFkZAkJPSBteDJfY2FtZXJhX2FkZF9kZXZpY2UsCisJLnJlbW92ZQkJPSBteDJfY2FtZXJhX3JlbW92ZV9kZXZpY2UsCisJLnNldF9mbXQJPSBteDJfY2FtZXJhX3NldF9mbXQsCisJLnNldF9jcm9wCT0gbXgyX2NhbWVyYV9zZXRfY3JvcCwKKwkudHJ5X2ZtdAk9IG14Ml9jYW1lcmFfdHJ5X2ZtdCwKKwkuaW5pdF92aWRlb2J1Zgk9IG14Ml9jYW1lcmFfaW5pdF92aWRlb2J1ZiwKKwkucmVxYnVmcwk9IG14Ml9jYW1lcmFfcmVxYnVmcywKKwkucG9sbAkJPSBteDJfY2FtZXJhX3BvbGwsCisJLnF1ZXJ5Y2FwCT0gbXgyX2NhbWVyYV9xdWVyeWNhcCwKKwkuc2V0X2J1c19wYXJhbQk9IG14Ml9jYW1lcmFfc2V0X2J1c19wYXJhbSwKK307CisKK3N0YXRpYyB2b2lkIG14MjdfY2FtZXJhX2ZyYW1lX2RvbmVfZW1tYShzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2LAorCQlpbnQgYnVmbnVtLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG14Ml9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YjsKKwl1bnNpZ25lZCBsb25nIHBoeXM7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBjZGV2LT5hY3RpdmVfYnVmcykpIHsKKwkJYnVmID0gbGlzdF9lbnRyeShwY2Rldi0+YWN0aXZlX2J1ZnMubmV4dCwKKwkJCXN0cnVjdCBteDJfYnVmZmVyLCB2Yi5xdWV1ZSk7CisKKwkJQlVHX09OKGJ1Zi0+YnVmbnVtICE9IGJ1Zm51bSk7CisKKwkJdmIgPSAmYnVmLT52YjsKKyNpZmRlZiBERUJVRworCQlwaHlzID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2Yik7CisJCWlmIChyZWFkbChwY2Rldi0+YmFzZV9lbW1hICsgUFJQX0RFU1RfUkdCMV9QVFIgKyA0ICogYnVmbnVtKQorCQkJCSE9IHBoeXMpIHsKKwkJCWRldl9lcnIocGNkZXYtPmRldiwgIiVwICE9ICVwXG4iLCBwaHlzLAorCQkJCQlyZWFkbChwY2Rldi0+YmFzZV9lbW1hICsKKwkJCQkJCVBSUF9ERVNUX1JHQjFfUFRSICsKKwkJCQkJCTQgKiBidWZudW0pKTsKKwkJfQorI2VuZGlmCisJCWRldl9kYmcocGNkZXYtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywgdmIsCisJCQkJdmItPmJhZGRyLCB2Yi0+YnNpemUpOworCisJCWxpc3RfZGVsKCZ2Yi0+cXVldWUpOworCQl2Yi0+c3RhdGUgPSBzdGF0ZTsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ2Yi0+dHMpOworCQl2Yi0+ZmllbGRfY291bnQrKzsKKworCQl3YWtlX3VwKCZ2Yi0+ZG9uZSk7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJnBjZGV2LT5jYXB0dXJlKSkgeworCQl3cml0ZWwocGNkZXYtPmRpc2NhcmRfYnVmZmVyX2RtYSwgcGNkZXYtPmJhc2VfZW1tYSArCisJCQkJUFJQX0RFU1RfUkdCMV9QVFIgKyA0ICogYnVmbnVtKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IGxpc3RfZW50cnkocGNkZXYtPmNhcHR1cmUubmV4dCwKKwkJCXN0cnVjdCBteDJfYnVmZmVyLCB2Yi5xdWV1ZSk7CisKKwlidWYtPmJ1Zm51bSA9IGJ1Zm51bTsKKworCWxpc3RfbW92ZV90YWlsKHBjZGV2LT5jYXB0dXJlLm5leHQsICZwY2Rldi0+YWN0aXZlX2J1ZnMpOworCisJdmIgPSAmYnVmLT52YjsKKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CisKKwlwaHlzID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2Yik7CisJd3JpdGVsKHBoeXMsIHBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfREVTVF9SR0IxX1BUUiArIDQgKiBidWZudW0pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXgyN19jYW1lcmFfZW1tYV9pcnEoaW50IGlycV9lbW1hLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBkYXRhOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkbChwY2Rldi0+YmFzZV9lbW1hICsgUFJQX0lOVFJTVEFUVVMpOworCXN0cnVjdCBteDJfYnVmZmVyICpidWY7CisKKwlpZiAoc3RhdHVzICYgKDEgPDwgNykpIHsgLyogb3ZlcmZsb3cgKi8KKwkJdTMyIGNudGw7CisJCS8qCisJCSAqIFdlIG9ubHkgZGlzYWJsZSBjaGFubmVsIDEgaGVyZSBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5CisJCSAqIGVuYWJsZWQgY2hhbm5lbAorCQkgKgorCQkgKiBGSVhNRTogdGhlIGNvcnJlY3QgRE1BIG92ZXJmbG93IGhhbmRsaW5nIHNob3VsZCBiZSByZXNldHRpbmcKKwkJICogdGhlIGJ1ZmZlciwgcmV0dXJuaW5nIGFuIGVycm9yIGZyYW1lLCBhbmQgY29udGludWluZyB3aXRoCisJCSAqIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCWNudGwgPSByZWFkbChwY2Rldi0+YmFzZV9lbW1hICsgUFJQX0NOVEwpOworCQl3cml0ZWwoY250bCAmIH5QUlBfQ05UTF9DSDFFTiwgcGNkZXYtPmJhc2VfZW1tYSArIFBSUF9DTlRMKTsKKwkJd3JpdGVsKGNudGwsIHBjZGV2LT5iYXNlX2VtbWEgKyBQUlBfQ05UTCk7CisJfQorCWlmICgoc3RhdHVzICYgKDMgPDwgNSkpID09ICgzIDw8IDUpCisJCQkmJiAhbGlzdF9lbXB0eSgmcGNkZXYtPmFjdGl2ZV9idWZzKSkgeworCQkvKgorCQkgKiBCb3RoIGJ1ZmZlcnMgaGF2ZSB0cmlnZ2VyZWQsIHByb2Nlc3MgdGhlIG9uZSB3ZSdyZSBleHBlY3RpbmcKKwkJICogdG8gZmlyc3QKKwkJICovCisJCWJ1ZiA9IGxpc3RfZW50cnkocGNkZXYtPmFjdGl2ZV9idWZzLm5leHQsCisJCQlzdHJ1Y3QgbXgyX2J1ZmZlciwgdmIucXVldWUpOworCQlteDI3X2NhbWVyYV9mcmFtZV9kb25lX2VtbWEocGNkZXYsIGJ1Zi0+YnVmbnVtLCBWSURFT0JVRl9ET05FKTsKKwkJc3RhdHVzICY9IH4oMSA8PCAoNiAtIGJ1Zi0+YnVmbnVtKSk7IC8qIG1hcmsgcHJvY2Vzc2VkICovCisJfQorCWlmIChzdGF0dXMgJiAoMSA8PCA2KSkKKwkJbXgyN19jYW1lcmFfZnJhbWVfZG9uZV9lbW1hKHBjZGV2LCAwLCBWSURFT0JVRl9ET05FKTsKKwlpZiAoc3RhdHVzICYgKDEgPDwgNSkpCisJCW14MjdfY2FtZXJhX2ZyYW1lX2RvbmVfZW1tYShwY2RldiwgMSwgVklERU9CVUZfRE9ORSk7CisKKwl3cml0ZWwoc3RhdHVzLCBwY2Rldi0+YmFzZV9lbW1hICsgUFJQX0lOVFJTVEFUVVMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteDI3X2NhbWVyYV9lbW1hX2luaXQoc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19lbW1hID0gcGNkZXYtPnJlc19lbW1hOworCWludCBlcnIgPSAwOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzX2VtbWEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlc19lbW1hKSwKKwkJCQlNWDJfQ0FNX0RSVl9OQU1FKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXBjZGV2LT5iYXNlX2VtbWEgPSBpb3JlbWFwKHJlc19lbW1hLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXNfZW1tYSkpOworCWlmICghcGNkZXYtPmJhc2VfZW1tYSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShwY2Rldi0+aXJxX2VtbWEsIG14MjdfY2FtZXJhX2VtbWFfaXJxLCAwLAorCQkJTVgyX0NBTV9EUlZfTkFNRSwgcGNkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihwY2Rldi0+ZGV2LCAiQ2FtZXJhIEVNTUEgaW50ZXJydXB0IHJlZ2lzdGVyIGZhaWxlZCBcbiIpOworCQlnb3RvIGV4aXRfaW91bm1hcDsKKwl9CisKKwlwY2Rldi0+Y2xrX2VtbWEgPSBjbGtfZ2V0KE5VTEwsICJlbW1hIik7CisJaWYgKElTX0VSUihwY2Rldi0+Y2xrX2VtbWEpKSB7CisJCWVyciA9IFBUUl9FUlIocGNkZXYtPmNsa19lbW1hKTsKKwkJZ290byBleGl0X2ZyZWVfaXJxOworCX0KKworCWNsa19lbmFibGUocGNkZXYtPmNsa19lbW1hKTsKKworCWVyciA9IG14MjdfY2FtZXJhX2VtbWFfcHJwX3Jlc2V0KHBjZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfY2xrX2VtbWFfcHV0OworCisJcmV0dXJuIGVycjsKKworZXhpdF9jbGtfZW1tYV9wdXQ6CisJY2xrX2Rpc2FibGUocGNkZXYtPmNsa19lbW1hKTsKKwljbGtfcHV0KHBjZGV2LT5jbGtfZW1tYSk7CitleGl0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKHBjZGV2LT5pcnFfZW1tYSwgcGNkZXYpOworZXhpdF9pb3VubWFwOgorCWlvdW5tYXAocGNkZXYtPmJhc2VfZW1tYSk7CitleGl0X3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlc19lbW1hLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXNfZW1tYSkpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14Ml9jYW1lcmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzX2NzaSwgKnJlc19lbW1hOworCXZvaWQgX19pb21lbSAqYmFzZV9jc2k7CisJaW50IGlycV9jc2ksIGlycV9lbW1hOworCWlycV9oYW5kbGVyX3QgbXgyX2NhbV9pcnFfaGFuZGxlciA9IGNwdV9pc19teDI1KCkgPyBteDI1X2NhbWVyYV9pcnEKKwkJOiBteDI3X2NhbWVyYV9pcnE7CisJaW50IGVyciA9IDA7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJpbml0aWFsaXNpbmdcbiIpOworCisJcmVzX2NzaSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaXJxX2NzaSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJlc19jc2kgPT0gTlVMTCB8fCBpcnFfY3NpIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIHBsYXRmb3JtIHJlc291cmNlcyBkYXRhXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCXBjZGV2ID0ga3phbGxvYyhzaXplb2YoKnBjZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgcGNkZXZcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJcGNkZXYtPmNsa19jc2kgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIocGNkZXYtPmNsa19jc2kpKSB7CisJCWVyciA9IFBUUl9FUlIocGNkZXYtPmNsa19jc2kpOworCQlnb3RvIGV4aXRfa2ZyZWU7CisJfQorCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ2FtZXJhIGNsb2NrIGZyZXF1ZW5jeTogJWxkXG4iLAorCQkJY2xrX2dldF9yYXRlKHBjZGV2LT5jbGtfY3NpKSk7CisKKwkvKiBJbml0aWFsaXplIERNQSAqLworI2lmZGVmIENPTkZJR19NQUNIX01YMjcKKwlpZiAoY3B1X2lzX214MjcoKSkgeworCQllcnIgPSBteDI3X2NhbWVyYV9kbWFfaW5pdChwZGV2LCBwY2Rldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfY2xrX3B1dDsKKwl9CisjZW5kaWYgLyogQ09ORklHX01BQ0hfTVgyNyAqLworCisJcGNkZXYtPnJlc19jc2kgPSByZXNfY3NpOworCXBjZGV2LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwY2Rldi0+cGRhdGEpIHsKKwkJbG9uZyByYXRlOworCisJCXBjZGV2LT5wbGF0Zm9ybV9mbGFncyA9IHBjZGV2LT5wZGF0YS0+ZmxhZ3M7CisKKwkJcmF0ZSA9IGNsa19yb3VuZF9yYXRlKHBjZGV2LT5jbGtfY3NpLCBwY2Rldi0+cGRhdGEtPmNsayAqIDIpOworCQlpZiAocmF0ZSA8PSAwKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBleGl0X2RtYV9mcmVlOworCQl9CisJCWVyciA9IGNsa19zZXRfcmF0ZShwY2Rldi0+Y2xrX2NzaSwgcmF0ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBleGl0X2RtYV9mcmVlOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZwY2Rldi0+Y2FwdHVyZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBjZGV2LT5hY3RpdmVfYnVmcyk7CisJc3Bpbl9sb2NrX2luaXQoJnBjZGV2LT5sb2NrKTsKKworCS8qCisJICogUmVxdWVzdCB0aGUgcmVnaW9ucy4KKwkgKi8KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXNfY3NpLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXNfY3NpKSwKKwkJCQlNWDJfQ0FNX0RSVl9OQU1FKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdF9kbWFfZnJlZTsKKwl9CisKKwliYXNlX2NzaSA9IGlvcmVtYXAocmVzX2NzaS0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzX2NzaSkpOworCWlmICghYmFzZV9jc2kpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCXBjZGV2LT5pcnFfY3NpID0gaXJxX2NzaTsKKwlwY2Rldi0+YmFzZV9jc2kgPSBiYXNlX2NzaTsKKwlwY2Rldi0+YmFzZV9kbWEgPSByZXNfY3NpLT5zdGFydDsKKwlwY2Rldi0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBjZGV2LT5pcnFfY3NpLCBteDJfY2FtX2lycV9oYW5kbGVyLCAwLAorCQkJTVgyX0NBTV9EUlZfTkFNRSwgcGNkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihwY2Rldi0+ZGV2LCAiQ2FtZXJhIGludGVycnVwdCByZWdpc3RlciBmYWlsZWQgXG4iKTsKKwkJZ290byBleGl0X2lvdW5tYXA7CisJfQorCisJaWYgKGNwdV9pc19teDI3KCkpIHsKKwkJLyogRU1NQSBzdXBwb3J0ICovCisJCXJlc19lbW1hID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwkJaXJxX2VtbWEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCisJCWlmIChyZXNfZW1tYSAmJiBpcnFfZW1tYSA+PSAwKSB7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVXNpbmcgRU1NQVxuIik7CisJCQlwY2Rldi0+dXNlX2VtbWEgPSAxOworCQkJcGNkZXYtPnJlc19lbW1hID0gcmVzX2VtbWE7CisJCQlwY2Rldi0+aXJxX2VtbWEgPSBpcnFfZW1tYTsKKwkJCWlmIChteDI3X2NhbWVyYV9lbW1hX2luaXQocGNkZXYpKQorCQkJCWdvdG8gZXhpdF9mcmVlX2lycTsKKwkJfQorCX0KKworCXBjZGV2LT5zb2NfaG9zdC5kcnZfbmFtZQk9IE1YMl9DQU1fRFJWX05BTUUsCisJcGNkZXYtPnNvY19ob3N0Lm9wcwkJPSAmbXgyX3NvY19jYW1lcmFfaG9zdF9vcHMsCisJcGNkZXYtPnNvY19ob3N0LnByaXYJCT0gcGNkZXY7CisJcGNkZXYtPnNvY19ob3N0LnY0bDJfZGV2LmRldgk9ICZwZGV2LT5kZXY7CisJcGNkZXYtPnNvY19ob3N0Lm5yCQk9IHBkZXYtPmlkOworCWVyciA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3RlcigmcGNkZXYtPnNvY19ob3N0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZV9lbW1hOworCisJcmV0dXJuIDA7CisKK2V4aXRfZnJlZV9lbW1hOgorCWlmIChteDI3X2NhbWVyYV9lbW1hKHBjZGV2KSkgeworCQlmcmVlX2lycShwY2Rldi0+aXJxX2VtbWEsIHBjZGV2KTsKKwkJY2xrX2Rpc2FibGUocGNkZXYtPmNsa19lbW1hKTsKKwkJY2xrX3B1dChwY2Rldi0+Y2xrX2VtbWEpOworCQlpb3VubWFwKHBjZGV2LT5iYXNlX2VtbWEpOworCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzX2VtbWEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlc19lbW1hKSk7CisJfQorZXhpdF9mcmVlX2lycToKKwlmcmVlX2lycShwY2Rldi0+aXJxX2NzaSwgcGNkZXYpOworZXhpdF9pb3VubWFwOgorCWlvdW5tYXAoYmFzZV9jc2kpOworZXhpdF9yZWxlYXNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXNfY3NpLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXNfY3NpKSk7CitleGl0X2RtYV9mcmVlOgorI2lmZGVmIENPTkZJR19NQUNIX01YMjcKKwlpZiAoY3B1X2lzX214MjcoKSkKKwkJaW14X2RtYV9mcmVlKHBjZGV2LT5kbWEpOworZXhpdF9jbGtfcHV0OgorCWNsa19wdXQocGNkZXYtPmNsa19jc2kpOworI2VuZGlmIC8qIENPTkZJR19NQUNIX01YMjcgKi8KK2V4aXRfa2ZyZWU6CisJa2ZyZWUocGNkZXYpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBteDJfY2FtZXJhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKnNvY19ob3N0ID0gdG9fc29jX2NhbWVyYV9ob3N0KCZwZGV2LT5kZXYpOworCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBjb250YWluZXJfb2Yoc29jX2hvc3QsCisJCQlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYsIHNvY19ob3N0KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWNsa19wdXQocGNkZXYtPmNsa19jc2kpOworI2lmZGVmIENPTkZJR19NQUNIX01YMjcKKwlpZiAoY3B1X2lzX214MjcoKSkKKwkJaW14X2RtYV9mcmVlKHBjZGV2LT5kbWEpOworI2VuZGlmIC8qIENPTkZJR19NQUNIX01YMjcgKi8KKwlmcmVlX2lycShwY2Rldi0+aXJxX2NzaSwgcGNkZXYpOworCWlmIChteDI3X2NhbWVyYV9lbW1hKHBjZGV2KSkKKwkJZnJlZV9pcnEocGNkZXYtPmlycV9lbW1hLCBwY2Rldik7CisKKwlzb2NfY2FtZXJhX2hvc3RfdW5yZWdpc3RlcigmcGNkZXYtPnNvY19ob3N0KTsKKworCWlvdW5tYXAocGNkZXYtPmJhc2VfY3NpKTsKKworCWlmIChteDI3X2NhbWVyYV9lbW1hKHBjZGV2KSkgeworCQljbGtfZGlzYWJsZShwY2Rldi0+Y2xrX2VtbWEpOworCQljbGtfcHV0KHBjZGV2LT5jbGtfZW1tYSk7CisJCWlvdW5tYXAocGNkZXYtPmJhc2VfZW1tYSk7CisJCXJlcyA9IHBjZGV2LT5yZXNfZW1tYTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJfQorCisJcmVzID0gcGNkZXYtPnJlc19jc2k7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlrZnJlZShwY2Rldik7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTVgyIENhbWVyYSBkcml2ZXIgdW5sb2FkZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14Ml9jYW1lcmFfZHJpdmVyID0geworCS5kcml2ZXIgCT0geworCQkubmFtZQk9IE1YMl9DQU1fRFJWX05BTUUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG14Ml9jYW1lcmFfcmVtb3ZlKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbXgyX2NhbWVyYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmbXgyX2NhbWVyYV9kcml2ZXIsICZteDJfY2FtZXJhX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG14Ml9jYW1lcmFfZXhpdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXgyX2NhbWVyYV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChteDJfY2FtZXJhX2luaXQpOworbW9kdWxlX2V4aXQobXgyX2NhbWVyYV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJpLk1YMjcvaS5NWDI1IFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8c2hhQHBlbmd1dHJvbml4LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCmluZGV4IDkyOTA3M2UuLjRlZDUxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKQEAgLTI1NDUsMTkgKzI1NDUsMTEgQEAKIAkJCS8qIHNldCB0aGUgdXBkYXRlIG1vZGUgKi8KIAkJCWlmIChkZWZfZGlzcGxheS0+Y2FwcyAmCiAJCQkJCU9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpIHsKLSNpZmRlZiBDT05GSUdfRkJfT01BUDJfRk9SQ0VfQVVUT19VUERBVEUKLQkJCQlpZiAoZHNzZHJ2LT5lbmFibGVfdGUpCi0JCQkJCWRzc2Rydi0+ZW5hYmxlX3RlKGRlZl9kaXNwbGF5LCAxKTsKLQkJCQlpZiAoZHNzZHJ2LT5zZXRfdXBkYXRlX21vZGUpCi0JCQkJCWRzc2Rydi0+c2V0X3VwZGF0ZV9tb2RlKGRlZl9kaXNwbGF5LAotCQkJCQkJCU9NQVBfRFNTX1VQREFURV9BVVRPKTsKLSNlbHNlCS8qIE1BTlVBTF9VUERBVEUgKi8KIAkJCQlpZiAoZHNzZHJ2LT5lbmFibGVfdGUpCiAJCQkJCWRzc2Rydi0+ZW5hYmxlX3RlKGRlZl9kaXNwbGF5LCAwKTsKIAkJCQlpZiAoZHNzZHJ2LT5zZXRfdXBkYXRlX21vZGUpCiAJCQkJCWRzc2Rydi0+c2V0X3VwZGF0ZV9tb2RlKGRlZl9kaXNwbGF5LAogCQkJCQkJCU9NQVBfRFNTX1VQREFURV9NQU5VQUwpOwotI2VuZGlmCiAJCQl9IGVsc2UgewogCQkJCWlmIChkc3NkcnYtPnNldF91cGRhdGVfbW9kZSkKIAkJCQkJZHNzZHJ2LT5zZXRfdXBkYXRlX21vZGUoZGVmX2Rpc3BsYXksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKaW5kZXggZjg1YjJlZC4uOTI2YTVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAJCQkgICAgIGRtYS0+ZGlyZWN0aW9uKTsKIAkJZG1hLT5kaXJlY3Rpb24gPSBETUFfTk9ORTsKIAl9IGVsc2UgewotCQl2aWRlb2J1Zl9kbWFfdW5tYXAodmJxLCB2aWRlb2J1Zl90b19kbWEodmIpKTsKKwkJdmlkZW9idWZfZG1hX3VubWFwKHZicS0+ZGV2LCB2aWRlb2J1Zl90b19kbWEodmIpKTsKIAkJdmlkZW9idWZfZG1hX2ZyZWUodmlkZW9idWZfdG9fZG1hKHZiKSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDkxMjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTk5NSArMCwwIEBACi0vKgotICogT21uaVZpc2lvbiBPVjUxMSBDYW1lcmEtdG8tVVNCIEJyaWRnZSBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBNYXJrIFcuIE1jQ2xlbGxhbmQKLSAqIE9yaWdpbmFsIGRlY29tcHJlc3Npb24gY29kZSBDb3B5cmlnaHQgMTk5OC0yMDAwIE9tbmlWaXNpb24gVGVjaG5vbG9naWVzCi0gKiBNYW55IGltcHJvdmVtZW50cyBieSBCcmV0IFdhbGxhY2ggPGJ3YWxsYWMxQHNhbi5yci5jb20+Ci0gKiBDb2xvciBmaXhlcyBieSBieSBPcmlvbiBTa3kgTGF3bG9yIDxvbGF3bG9yQGFjbS5vcmc+ICgyLzI2LzIwMDApCi0gKiBTbmFwc2hvdCBjb2RlIGJ5IEtldmluIE1vb3JlCi0gKiBPVjc2MjAgZml4ZXMgYnkgQ2hhcmwgUC4gQm90aGEgPGNwYm90aGFAaWVlZS5vcmc+Ci0gKiBDaGFuZ2VzIGJ5IENsYXVkaW8gTWF0c3Vva2EgPGNsYXVkaW9AY29uZWN0aXZhLmNvbT4KLSAqIE9yaWdpbmFsIFNBQTcxMTFBIGNvZGUgYnkgRGF2ZSBQZXJrcyA8ZHBlcmtzQGlibS5uZXQ+Ci0gKiBVUkIgZXJyb3IgbWVzc2FnZXMgZnJvbSBwd2MgZHJpdmVyIGJ5IE5lbW9zb2Z0Ci0gKiBnZW5lcmljX2lvY3RsKCkgY29kZSBmcm9tIHZpZGVvZGV2LmMgYnkgR2VyZCBLbm9yciBhbmQgQWxhbiBDb3gKLSAqIE1lbW9yeSBtYW5hZ2VtZW50IChydm1hbGxvYykgY29kZSBmcm9tIGJ0dHYgZHJpdmVyLCBieSBHZXJkIEtub3JyIGFuZCBvdGhlcnMKLSAqCi0gKiBCYXNlZCBvbiB0aGUgTGludXggQ1BpQSBkcml2ZXIgd3JpdHRlbiBieSBQZXRlciBQcmVnbGVyLAotICogU2NvdHQgSi4gQmVydGluIGFuZCBKb2hhbm5lcyBFcmRmZWx0LgotICoKLSAqIFBsZWFzZSBzZWUgdGhlIGZpbGU6IERvY3VtZW50YXRpb24vdXNiL292NTExLnR4dAotICogYW5kIHRoZSB3ZWJzaXRlIGF0OiAgaHR0cDovL2FscGhhLmR5bmRucy5vcmcvb3Y1MTEKLSAqIGZvciBtb3JlIGluZm8uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQotICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotCi0jaWYgZGVmaW5lZCAoX19pMzg2X18pCi0JI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm92NTExLmgiCi0KLS8qCi0gKiBWZXJzaW9uIEluZm9ybWF0aW9uCi0gKi8KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjY0IGZvciBMaW51eCAyLjUiCi0jZGVmaW5lIEVNQUlMICJtYXJrQGFscGhhLmR5bmRucy5vcmciCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmsgTWNDbGVsbGFuZCA8bWFya0BhbHBoYS5keW5kbnMub3JnPiAmIEJyZXQgV2FsbGFjaCBcCi0mIE9yaW9uIFNreSBMYXdsb3IgPG9sYXdsb3JAYWNtLm9yZz4gJiBLZXZpbiBNb29yZSAmIENoYXJsIFAuIEJvdGhhIFwKLTxjcGJvdGhhQGllZWUub3JnPiAmIENsYXVkaW8gTWF0c3Vva2EgPGNsYXVkaW9AY29uZWN0aXZhLmNvbT4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICJvdjUxMSBVU0IgQ2FtZXJhIERyaXZlciIKLQotI2RlZmluZSBPVjUxMV9JMkNfUkVUUklFUyAzCi0jZGVmaW5lIEVOQUJMRV9ZX1FVQU5UQUJMRSAxCi0jZGVmaW5lIEVOQUJMRV9VVl9RVUFOVEFCTEUgMQotCi0jZGVmaW5lIE9WNTExX01BWF9VTklUX1ZJREVPIDE2Ci0KLS8qIFBpeGVsIGNvdW50ICogYnl0ZXMgcGVyIFlVVjQyMCBwaXhlbCAoMS41KSAqLwotI2RlZmluZSBNQVhfRlJBTUVfU0laRSh3LCBoKSAoKHcpICogKGgpICogMyAvIDIpCi0KLSNkZWZpbmUgTUFYX0RBVEFfU0laRSh3LCBoKSAoTUFYX0ZSQU1FX1NJWkUodywgaCkgKyBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKQotCi0vKiBNYXggc2l6ZSAqIGJ5dGVzIHBlciBZVVY0MjAgcGl4ZWwgKDEuNSkgKyBvbmUgZXh0cmEgaXNvYyBmcmFtZSBmb3Igc2FmZXR5ICovCi0jZGVmaW5lIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpICgodykgKiAoaCkgKiAzIC8gMiArIDEwMjQpCi0KLSNkZWZpbmUgRkFUQUxfRVJST1IocmMpICgocmMpIDwgMCAmJiAocmMpICE9IC1FUEVSTSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1vZHVsZSBQYXJhbWV0ZXJzCi0gKiAoU2VlIG92NTExLnR4dCBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb25zIG9mIHRoZXNlKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyAoYW5kIGFsbCBzdGF0aWMgZ2xvYmFscykgZGVmYXVsdCB0byB6ZXJvICovCi1zdGF0aWMgaW50IGF1dG9icmlnaHQJCT0gMTsKLXN0YXRpYyBpbnQgYXV0b2dhaW4JCT0gMTsKLXN0YXRpYyBpbnQgYXV0b2V4cAkJPSAxOwotc3RhdGljIGludCBkZWJ1ZzsKLXN0YXRpYyBpbnQgc25hcHNob3Q7Ci1zdGF0aWMgaW50IGNhbXMJCQk9IDE7Ci1zdGF0aWMgaW50IGNvbXByZXNzOwotc3RhdGljIGludCB0ZXN0cGF0Owotc3RhdGljIGludCBkdW1wcGl4Owotc3RhdGljIGludCBsZWQgCQkJPSAxOwotc3RhdGljIGludCBkdW1wX2JyaWRnZTsKLXN0YXRpYyBpbnQgZHVtcF9zZW5zb3I7Ci1zdGF0aWMgaW50IHByaW50cGg7Ci1zdGF0aWMgaW50IHBoeQkJCT0gMHgxZjsKLXN0YXRpYyBpbnQgcGh1dgkJCT0gMHgwNTsKLXN0YXRpYyBpbnQgcHZ5CQkJPSAweDA2Owotc3RhdGljIGludCBwdnV2CQkJPSAweDA2Owotc3RhdGljIGludCBxaHkJCQk9IDB4MTQ7Ci1zdGF0aWMgaW50IHFodXYJCQk9IDB4MDM7Ci1zdGF0aWMgaW50IHF2eQkJCT0gMHgwNDsKLXN0YXRpYyBpbnQgcXZ1dgkJCT0gMHgwNDsKLXN0YXRpYyBpbnQgbGlnaHRmcmVxOwotc3RhdGljIGludCBiYW5kaW5nZmlsdGVyOwotc3RhdGljIGludCBjbG9ja2RpdgkJPSAtMTsKLXN0YXRpYyBpbnQgcGFja2V0c2l6ZQkJPSAtMTsKLXN0YXRpYyBpbnQgZnJhbWVkcm9wCQk9IC0xOwotc3RhdGljIGludCBmYXN0c2V0Owotc3RhdGljIGludCBmb3JjZV9wYWxldHRlOwotc3RhdGljIGludCBiYWNrbGlnaHQ7Ci0vKiBCaXRtYXNrIG1hcmtpbmcgYWxsb2NhdGVkIGRldmljZXMgZnJvbSAwIHRvIE9WNTExX01BWF9VTklUX1ZJREVPICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvdjUxMV9kZXZ1c2VkOwotc3RhdGljIGludCB1bml0X3ZpZGVvW09WNTExX01BWF9VTklUX1ZJREVPXTsKLXN0YXRpYyBpbnQgcmVtb3ZlX3plcm9zOwotc3RhdGljIGludCBtaXJyb3I7Ci1zdGF0aWMgaW50IG92NTE4X2NvbG9yOwotCi1tb2R1bGVfcGFyYW0oYXV0b2JyaWdodCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYXV0b2JyaWdodCwgIlNlbnNvciBhdXRvbWF0aWNhbGx5IGNoYW5nZXMgYnJpZ2h0bmVzcyIpOwotbW9kdWxlX3BhcmFtKGF1dG9nYWluLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhhdXRvZ2FpbiwgIlNlbnNvciBhdXRvbWF0aWNhbGx5IGNoYW5nZXMgZ2FpbiIpOwotbW9kdWxlX3BhcmFtKGF1dG9leHAsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGF1dG9leHAsICJTZW5zb3IgYXV0b21hdGljYWxseSBjaGFuZ2VzIGV4cG9zdXJlIik7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLAotICAiRGVidWcgbGV2ZWw6IDA9bm9uZSwgMT1pbml0cywgMj13YXJuaW5nLCAzPWNvbmZpZywgND1mdW5jdGlvbnMsIDU9bWF4Iik7Ci1tb2R1bGVfcGFyYW0oc25hcHNob3QsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHNuYXBzaG90LCAiRW5hYmxlIHNuYXBzaG90IG1vZGUiKTsKLW1vZHVsZV9wYXJhbShjYW1zLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhjYW1zLCAiTnVtYmVyIG9mIHNpbXVsdGFuZW91cyBjYW1lcmFzIik7Ci1tb2R1bGVfcGFyYW0oY29tcHJlc3MsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNvbXByZXNzLCAiVHVybiBvbiBjb21wcmVzc2lvbiIpOwotbW9kdWxlX3BhcmFtKHRlc3RwYXQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRlc3RwYXQsCi0gICJSZXBsYWNlIGltYWdlIHdpdGggdmVydGljYWwgYmFyIHRlc3RwYXR0ZXJuIChvbmx5IHBhcnRpYWxseSB3b3JraW5nKSIpOwotbW9kdWxlX3BhcmFtKGR1bXBwaXgsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGR1bXBwaXgsICJEdW1wIHJhdyBwaXhlbCBkYXRhIik7Ci1tb2R1bGVfcGFyYW0obGVkLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhsZWQsCi0gICJMRUQgcG9saWN5IChPVjUxMSsgb3IgbGF0ZXIpLiAwPW9mZiwgMT1vbiAoZGVmYXVsdCksIDI9YXV0byAob24gd2hlbiBvcGVuKSIpOwotbW9kdWxlX3BhcmFtKGR1bXBfYnJpZGdlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkdW1wX2JyaWRnZSwgIkR1bXAgdGhlIGJyaWRnZSByZWdpc3RlcnMiKTsKLW1vZHVsZV9wYXJhbShkdW1wX3NlbnNvciwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZHVtcF9zZW5zb3IsICJEdW1wIHRoZSBzZW5zb3IgcmVnaXN0ZXJzIik7Ci1tb2R1bGVfcGFyYW0ocHJpbnRwaCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocHJpbnRwaCwgIlByaW50IGZyYW1lIHN0YXJ0L2VuZCBoZWFkZXJzIik7Ci1tb2R1bGVfcGFyYW0ocGh5LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhwaHksICJQcmVkaWN0aW9uIHJhbmdlIChob3Jpei4gWSkiKTsKLW1vZHVsZV9wYXJhbShwaHV2LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhwaHV2LCAiUHJlZGljdGlvbiByYW5nZSAoaG9yaXouIFVWKSIpOwotbW9kdWxlX3BhcmFtKHB2eSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocHZ5LCAiUHJlZGljdGlvbiByYW5nZSAodmVydC4gWSkiKTsKLW1vZHVsZV9wYXJhbShwdnV2LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhwdnV2LCAiUHJlZGljdGlvbiByYW5nZSAodmVydC4gVVYpIik7Ci1tb2R1bGVfcGFyYW0ocWh5LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhxaHksICJRdWFudGl6YXRpb24gdGhyZXNob2xkIChob3Jpei4gWSkiKTsKLW1vZHVsZV9wYXJhbShxaHV2LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhxaHV2LCAiUXVhbnRpemF0aW9uIHRocmVzaG9sZCAoaG9yaXouIFVWKSIpOwotbW9kdWxlX3BhcmFtKHF2eSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocXZ5LCAiUXVhbnRpemF0aW9uIHRocmVzaG9sZCAodmVydC4gWSkiKTsKLW1vZHVsZV9wYXJhbShxdnV2LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhxdnV2LCAiUXVhbnRpemF0aW9uIHRocmVzaG9sZCAodmVydC4gVVYpIik7Ci1tb2R1bGVfcGFyYW0obGlnaHRmcmVxLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhsaWdodGZyZXEsCi0gICJMaWdodCBmcmVxdWVuY3kuIFNldCB0byA1MCBvciA2MCBIeiwgb3IgemVybyBmb3IgZGVmYXVsdCBzZXR0aW5ncyIpOwotbW9kdWxlX3BhcmFtKGJhbmRpbmdmaWx0ZXIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJhbmRpbmdmaWx0ZXIsCi0gICJFbmFibGUgYmFuZGluZyBmaWx0ZXIgKHRvIHJlZHVjZSBlZmZlY3RzIG9mIGZsdW9yZXNjZW50IGxpZ2h0aW5nKSIpOwotbW9kdWxlX3BhcmFtKGNsb2NrZGl2LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhjbG9ja2RpdiwgIkZvcmNlIHBpeGVsIGNsb2NrIGRpdmlzb3IgdG8gYSBzcGVjaWZpYyB2YWx1ZSIpOwotbW9kdWxlX3BhcmFtKHBhY2tldHNpemUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBhY2tldHNpemUsICJGb3JjZSBhIHNwZWNpZmljIGlzb2MgcGFja2V0IHNpemUiKTsKLW1vZHVsZV9wYXJhbShmcmFtZWRyb3AsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZyYW1lZHJvcCwgIkZvcmNlIGEgc3BlY2lmaWMgZnJhbWUgZHJvcCByZWdpc3RlciBzZXR0aW5nIik7Ci1tb2R1bGVfcGFyYW0oZmFzdHNldCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZmFzdHNldCwgIkFsbG93cyBwaWN0dXJlIHNldHRpbmdzIHRvIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5Iik7Ci1tb2R1bGVfcGFyYW0oZm9yY2VfcGFsZXR0ZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcGFsZXR0ZSwgIkZvcmNlIHRoZSBwYWxldHRlIHRvIGEgc3BlY2lmaWMgdmFsdWUiKTsKLW1vZHVsZV9wYXJhbShiYWNrbGlnaHQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJhY2tsaWdodCwgIkZvciBvYmplY3RzIHRoYXQgYXJlIGxpdCBmcm9tIGJlaGluZCIpOwotc3RhdGljIHVuc2lnbmVkIGludCBudW1fdXY7Ci1tb2R1bGVfcGFyYW1fYXJyYXkodW5pdF92aWRlbywgaW50LCAmbnVtX3V2LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0ModW5pdF92aWRlbywKLSAgIkZvcmNlIHVzZSBvZiBzcGVjaWZpYyBtaW5vciBudW1iZXIocykuIDAgaXMgbm90IGFsbG93ZWQuIik7Ci1tb2R1bGVfcGFyYW0ocmVtb3ZlX3plcm9zLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhyZW1vdmVfemVyb3MsCi0gICJSZW1vdmUgemVyby1wYWRkaW5nIGZyb20gdW5jb21wcmVzc2VkIGluY29taW5nIGRhdGEiKTsKLW1vZHVsZV9wYXJhbShtaXJyb3IsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1pcnJvciwgIlJldmVyc2UgaW1hZ2UgaG9yaXpvbnRhbGx5Iik7Ci1tb2R1bGVfcGFyYW0ob3Y1MThfY29sb3IsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG92NTE4X2NvbG9yLCAiRW5hYmxlIE9WNTE4IGNvbG9yIChleHBlcmltZW50YWwpIik7Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWlzY2VsbGFuZW91cyBHbG9iYWxzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG92NTExX2RyaXZlcjsKLQotLyogTnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgZmFpbGVkIEkyQyB0cmFuc2FjdGlvbi4gSW5jcmVhc2UgdGhpcyBpZiB5b3UKLSAqIGFyZSBnZXR0aW5nICJGYWlsZWQgdG8gcmVhZCBzZW5zb3IgSUQuLi4iICovCi1zdGF0aWMgY29uc3QgaW50IGkyY19kZXRlY3RfdHJpZXMgPSA1OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlIFtdID0gewotCXsgVVNCX0RFVklDRShWRU5EX09NTklWSVNJT04sIFBST0RfT1Y1MTEpIH0sCi0JeyBVU0JfREVWSUNFKFZFTkRfT01OSVZJU0lPTiwgUFJPRF9PVjUxMVBMVVMpIH0sCi0JeyBVU0JfREVWSUNFKFZFTkRfTUFUVEVMLCBQUk9EX01FMkNBTSkgfSwKLQl7IH0gIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRldmljZV90YWJsZSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHlRdWFuVGFibGU1MTFbXSA9IE9WNTExX1lRVUFOVEFCTEU7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciB1dlF1YW5UYWJsZTUxMVtdID0gT1Y1MTFfVVZRVUFOVEFCTEU7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciB5UXVhblRhYmxlNTE4W10gPSBPVjUxOF9ZUVVBTlRBQkxFOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgdXZRdWFuVGFibGU1MThbXSA9IE9WNTE4X1VWUVVBTlRBQkxFOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3ltYm9saWMgTmFtZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBLbm93biBPVjUxMS1iYXNlZCBjYW1lcmFzICovCi1zdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3QgY2FtbGlzdFtdID0gewotCXsgICAwLCAiR2VuZXJpYyBDYW1lcmEgKG5vIElEKSIgfSwKLQl7ICAgMSwgIk11c3RlayBXQ2FtIDNYIiB9LAotCXsgICAzLCAiRC1MaW5rIERTQi1DMzAwIiB9LAotCXsgICA0LCAiR2VuZXJpYyBPVjUxMS9PVjc2MTAiIH0sCi0JeyAgIDUsICJQdXJldGVrIFBULTYwMDciIH0sCi0JeyAgIDYsICJMaWZldmlldyBVU0IgTGlmZSBUViAoTlRTQykiIH0sCi0JeyAgMjEsICJDcmVhdGl2ZSBMYWJzIFdlYkNhbSAzIiB9LAotCXsgIDIyLCAiTGlmZXZpZXcgVVNCIExpZmUgVFYgKFBBTCBEL0srQi9HKSIgfSwKLQl7ICAzNiwgIktvYWxhLUNhbSIgfSwKLQl7ICAzOCwgIkxpZmV2aWV3IFVTQiBMaWZlIFRWIChQQUwpIiB9LAotCXsgIDQxLCAiU2Ftc3VuZyBBbnljYW0gTVBDLU0xMCIgfSwKLQl7ICA0MywgIk10ZWt2aXNpb24gWmVjYSBNVjQwMiIgfSwKLQl7ICA0NiwgIlN1bWEgZU9OIiB9LAotCXsgIDcwLCAiTGlmZXZpZXcgVVNCIExpZmUgVFYgKFBBTC9TRUNBTSkiIH0sCi0JeyAxMDAsICJMaWZldmlldyBSb2JvQ2FtIiB9LAotCXsgMTAyLCAiQXZlck1lZGlhIEludGVyQ2FtIEVsaXRlIiB9LAotCXsgMTEyLCAiTWVkaWFGb3J0ZSBNVjMwMCIgfSwJLyogb3IgT1Y3MTEwIGV2YWx1YXRpb24ga2l0ICovCi0JeyAxMzQsICJFem9uaWNzIEVaQ2FtIElJIiB9LAotCXsgMTkyLCAiV2ViZXllIDIwMDBCIiB9LAotCXsgMjUzLCAiQWxwaGEgVmlzaW9uIFRlY2guIEFscGhhQ2FtIFNFIiB9LAotCXsgIC0xLCBOVUxMIH0KLX07Ci0KLS8qIFZpZGVvNExpbnV4MSBQYWxldHRlcyAqLwotc3RhdGljIHN0cnVjdCBzeW1ib2xpY19saXN0IHY0bDFfcGxpc3RbXSA9IHsKLQl7IFZJREVPX1BBTEVUVEVfR1JFWSwJIkdSRVkiIH0sCi0JeyBWSURFT19QQUxFVFRFX0hJMjQwLAkiSEkyNDAiIH0sCi0JeyBWSURFT19QQUxFVFRFX1JHQjU2NSwJIlJHQjU2NSIgfSwKLQl7IFZJREVPX1BBTEVUVEVfUkdCMjQsCSJSR0IyNCIgfSwKLQl7IFZJREVPX1BBTEVUVEVfUkdCMzIsCSJSR0IzMiIgfSwKLQl7IFZJREVPX1BBTEVUVEVfUkdCNTU1LAkiUkdCNTU1IiB9LAotCXsgVklERU9fUEFMRVRURV9ZVVY0MjIsCSJZVVY0MjIiIH0sCi0JeyBWSURFT19QQUxFVFRFX1lVWVYsCSJZVVlWIiB9LAotCXsgVklERU9fUEFMRVRURV9VWVZZLAkiVVlWWSIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDIwLAkiWVVWNDIwIiB9LAotCXsgVklERU9fUEFMRVRURV9ZVVY0MTEsCSJZVVY0MTEiIH0sCi0JeyBWSURFT19QQUxFVFRFX1JBVywJIlJBVyIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDIyUCwiWVVWNDIyUCIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDExUCwiWVVWNDExUCIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDIwUCwiWVVWNDIwUCIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDEwUCwiWVVWNDEwUCIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3ltYm9saWNfbGlzdCBicmdsaXN0W10gPSB7Ci0JeyBCUkdfT1Y1MTEsCQkiT1Y1MTEiIH0sCi0JeyBCUkdfT1Y1MTFQTFVTLAkiT1Y1MTErIiB9LAotCXsgQlJHX09WNTE4LAkJIk9WNTE4IiB9LAotCXsgQlJHX09WNTE4UExVUywJIk9WNTE4KyIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3ltYm9saWNfbGlzdCBzZW5saXN0W10gPSB7Ci0JeyBTRU5fT1Y3NkJFLAkiT1Y3NkJFIiB9LAotCXsgU0VOX09WNzYxMCwJIk9WNzYxMCIgfSwKLQl7IFNFTl9PVjc2MjAsCSJPVjc2MjAiIH0sCi0JeyBTRU5fT1Y3NjIwQUUsCSJPVjc2MjBBRSIgfSwKLQl7IFNFTl9PVjY2MjAsCSJPVjY2MjAiIH0sCi0JeyBTRU5fT1Y2NjMwLAkiT1Y2NjMwIiB9LAotCXsgU0VOX09WNjYzMEFFLAkiT1Y2NjMwQUUiIH0sCi0JeyBTRU5fT1Y2NjMwQUYsCSJPVjY2MzBBRiIgfSwKLQl7IFNFTl9PVjg2MDAsCSJPVjg2MDAiIH0sCi0JeyBTRU5fS1MwMTI3LAkiS1MwMTI3IiB9LAotCXsgU0VOX0tTMDEyN0IsCSJLUzAxMjdCIiB9LAotCXsgU0VOX1NBQTcxMTFBLAkiU0FBNzExMUEiIH0sCi0JeyAtMSwgTlVMTCB9Ci19OwotCi0vKiBVUkIgZXJyb3IgY29kZXM6ICovCi1zdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3QgdXJiX2Vycmxpc3RbXSA9IHsKLQl7IC1FTk9TUiwJIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiIH0sCi0JeyAtRVBJUEUsCSJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIiB9LAotCXsgLUVPVkVSRkxPVywJIkJhYmJsZSAoZGV2aWNlIHNlbmRzIHRvbyBtdWNoIGRhdGEpIiB9LAotCXsgLUVQUk9UTywJIkJpdC1zdHVmZiBlcnJvciAoYmFkIGNhYmxlPykiIH0sCi0JeyAtRUlMU0VRLAkiQ1JDL1RpbWVvdXQgKGJhZCBjYWJsZT8pIiB9LAotCXsgLUVUSU1FLAkiRGV2aWNlIGRvZXMgbm90IHJlc3BvbmQgdG8gdG9rZW4iIH0sCi0JeyAtRVRJTUVET1VULAkiRGV2aWNlIGRvZXMgbm90IHJlc3BvbmQgdG8gY29tbWFuZCIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNZW1vcnkgbWFuYWdlbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCAqCi1ydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqbWVtOwotCXVuc2lnbmVkIGxvbmcgYWRyOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0JbWVtID0gdm1hbGxvY18zMihzaXplKTsKLQlpZiAoIW1lbSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KLQlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOwotCXdoaWxlIChzaXplID4gMCkgewotCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JCWFkciArPSBQQUdFX1NJWkU7Ci0JCXNpemUgLT0gUEFHRV9TSVpFOwotCX0KLQotCXJldHVybiBtZW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1ydmZyZWUodm9pZCAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBhZHI7Ci0KLQlpZiAoIW1lbSkKLQkJcmV0dXJuOwotCi0JYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKLQl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCQlhZHIgKz0gUEFHRV9TSVpFOwotCQlzaXplIC09IFBBR0VfU0laRTsKLQl9Ci0JdmZyZWUobWVtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZWdpc3RlciBJL08KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdGUgYW4gT1Y1MXggcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQKLXJlZ193KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLQlpbnQgcmM7Ci0KLQlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIHZhbHVlKTsKLQotCW11dGV4X2xvY2soJm92LT5jYnVmX2xvY2spOwotCW92LT5jYnVmWzBdID0gdmFsdWU7Ci0JcmMgPSB1c2JfY29udHJvbF9tc2cob3YtPmRldiwKLQkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKG92LT5kZXYsIDApLAotCQkJICAgICAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpPzE6MiAvKiBSRUdfSU8gKi8sCi0JCQkgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgIDAsIChfX3UxNilyZWcsICZvdi0+Y2J1ZlswXSwgMSwgMTAwMCk7Ci0JbXV0ZXhfdW5sb2NrKCZvdi0+Y2J1Zl9sb2NrKTsKLQotCWlmIChyYyA8IDApCi0JCWVycigicmVnIHdyaXRlOiBlcnJvciAlZDogJXMiLCByYywgc3ltYm9saWModXJiX2Vycmxpc3QsIHJjKSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIFJlYWQgZnJvbSBhbiBPVjUxeCByZWdpc3RlciAqLwotLyogcmV0dXJuczogbmVnYXRpdmUgaXMgZXJyb3IsIHBvcyBvciB6ZXJvIGlzIGRhdGEgKi8KLXN0YXRpYyBpbnQKLXJlZ19yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZykKLXsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZvdi0+Y2J1Zl9sb2NrKTsKLQlyYyA9IHVzYl9jb250cm9sX21zZyhvdi0+ZGV2LAotCQkJICAgICB1c2JfcmN2Y3RybHBpcGUob3YtPmRldiwgMCksCi0JCQkgICAgIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCk/MTozIC8qIFJFR19JTyAqLywKLQkJCSAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgIDAsIChfX3UxNilyZWcsICZvdi0+Y2J1ZlswXSwgMSwgMTAwMCk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCWVycigicmVnIHJlYWQ6IGVycm9yICVkOiAlcyIsIHJjLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmMpKTsKLQl9IGVsc2UgewotCQlyYyA9IG92LT5jYnVmWzBdOwotCQlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIG92LT5jYnVmWzBdKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJm92LT5jYnVmX2xvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogV3JpdGVzIGJpdHMgYXQgcG9zaXRpb25zIHNwZWNpZmllZCBieSBtYXNrIHRvIGFuIE9WNTF4IHJlZy4gQml0cyB0aGF0IGFyZSBpbgotICogdGhlIHNhbWUgcG9zaXRpb24gYXMgMSdzIGluICJtYXNrIiBhcmUgY2xlYXJlZCBhbmQgc2V0IHRvICJ2YWx1ZSIuIEJpdHMKLSAqIHRoYXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uIGFzIDAncyBpbiAibWFzayIgYXJlIHByZXNlcnZlZCwgcmVnYXJkbGVzcwotICogb2YgdGhlaXIgcmVzcGVjdGl2ZSBzdGF0ZSBpbiAidmFsdWUiLgotICovCi1zdGF0aWMgaW50Ci1yZWdfd19tYXNrKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAotCSAgIHVuc2lnbmVkIGNoYXIgcmVnLAotCSAgIHVuc2lnbmVkIGNoYXIgdmFsdWUsCi0JICAgdW5zaWduZWQgY2hhciBtYXNrKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBvbGR2YWwsIG5ld3ZhbDsKLQotCXJldCA9IHJlZ19yKG92LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jb2xkdmFsID0gKHVuc2lnbmVkIGNoYXIpIHJldDsKLQlvbGR2YWwgJj0gKH5tYXNrKTsJCS8qIENsZWFyIHRoZSBtYXNrZWQgYml0cyAqLwotCXZhbHVlICY9IG1hc2s7CQkJLyogRW5mb3JjZSBtYXNrIG9uIHZhbHVlICovCi0JbmV3dmFsID0gb2xkdmFsIHwgdmFsdWU7CS8qIFNldCB0aGUgZGVzaXJlZCBiaXRzICovCi0KLQlyZXR1cm4gKHJlZ193KG92LCByZWcsIG5ld3ZhbCkpOwotfQotCi0vKgotICogV3JpdGVzIG11bHRpcGxlIChuKSBieXRlIHZhbHVlIHRvIGEgc2luZ2xlIHJlZ2lzdGVyLiBPbmx5IHZhbGlkIHdpdGggY2VydGFpbgotICogcmVnaXN0ZXJzICgweDMwIGFuZCAweGM0IC0gMHhjZSkuCi0gKi8KLXN0YXRpYyBpbnQKLW92NTE4X3JlZ193MzIoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVnLCB1MzIgdmFsLCBpbnQgbikKLXsKLQlpbnQgcmM7Ci0KLQlQREVCVUcoNSwgIjB4JTAyWDolN2QsIG49JWQiLCByZWcsIHZhbCwgbik7Ci0KLQltdXRleF9sb2NrKCZvdi0+Y2J1Zl9sb2NrKTsKLQotCSooKF9fbGUzMiAqKW92LT5jYnVmKSA9IF9fY3B1X3RvX2xlMzIodmFsKTsKLQotCXJjID0gdXNiX2NvbnRyb2xfbXNnKG92LT5kZXYsCi0JCQkgICAgIHVzYl9zbmRjdHJscGlwZShvdi0+ZGV2LCAwKSwKLQkJCSAgICAgMSAvKiBSRUdfSU8gKi8sCi0JCQkgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgIDAsIChfX3UxNilyZWcsIG92LT5jYnVmLCBuLCAxMDAwKTsKLQltdXRleF91bmxvY2soJm92LT5jYnVmX2xvY2spOwotCi0JaWYgKHJjIDwgMCkKLQkJZXJyKCJyZWcgd3JpdGUgbXVsdGlwbGU6IGVycm9yICVkOiAlcyIsIHJjLAotCQkgICAgc3ltYm9saWModXJiX2Vycmxpc3QsIHJjKSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQKLW92NTExX3VwbG9hZF9xdWFuX3RhYmxlcyhzdHJ1Y3QgdXNiX292NTExICpvdikKLXsKLQl1bnNpZ25lZCBjaGFyICpwWVRhYmxlID0geVF1YW5UYWJsZTUxMTsKLQl1bnNpZ25lZCBjaGFyICpwVVZUYWJsZSA9IHV2UXVhblRhYmxlNTExOwotCXVuc2lnbmVkIGNoYXIgdmFsMCwgdmFsMTsKLQlpbnQgaSwgcmMsIHJlZyA9IFI1MTFfQ09NUF9MVVRfQkVHSU47Ci0KLQlQREVCVUcoNCwgIlVwbG9hZGluZyBxdWFudGl6YXRpb24gdGFibGVzIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfUVVBTlRBQkxFU0laRSAvIDI7IGkrKykgewotCQlpZiAoRU5BQkxFX1lfUVVBTlRBQkxFKQl7Ci0JCQl2YWwwID0gKnBZVGFibGUrKzsKLQkJCXZhbDEgPSAqcFlUYWJsZSsrOwotCQkJdmFsMCAmPSAweDBmOwotCQkJdmFsMSAmPSAweDBmOwotCQkJdmFsMCB8PSB2YWwxIDw8IDQ7Ci0JCQlyYyA9IHJlZ193KG92LCByZWcsIHZhbDApOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlpZiAoRU5BQkxFX1VWX1FVQU5UQUJMRSkgewotCQkJdmFsMCA9ICpwVVZUYWJsZSsrOwotCQkJdmFsMSA9ICpwVVZUYWJsZSsrOwotCQkJdmFsMCAmPSAweDBmOwotCQkJdmFsMSAmPSAweDBmOwotCQkJdmFsMCB8PSB2YWwxIDw8IDQ7Ci0JCQlyYyA9IHJlZ193KG92LCByZWcgKyBPVjUxMV9RVUFOVEFCTEVTSVpFLzIsIHZhbDApOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlyZWcrKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogT1Y1MTggcXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgOHg0IChpbnN0ZWFkIG9mIDh4OCkgKi8KLXN0YXRpYyBpbnQKLW92NTE4X3VwbG9hZF9xdWFuX3RhYmxlcyhzdHJ1Y3QgdXNiX292NTExICpvdikKLXsKLQl1bnNpZ25lZCBjaGFyICpwWVRhYmxlID0geVF1YW5UYWJsZTUxODsKLQl1bnNpZ25lZCBjaGFyICpwVVZUYWJsZSA9IHV2UXVhblRhYmxlNTE4OwotCXVuc2lnbmVkIGNoYXIgdmFsMCwgdmFsMTsKLQlpbnQgaSwgcmMsIHJlZyA9IFI1MTFfQ09NUF9MVVRfQkVHSU47Ci0KLQlQREVCVUcoNCwgIlVwbG9hZGluZyBxdWFudGl6YXRpb24gdGFibGVzIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT1Y1MThfUVVBTlRBQkxFU0laRSAvIDI7IGkrKykgewotCQlpZiAoRU5BQkxFX1lfUVVBTlRBQkxFKSB7Ci0JCQl2YWwwID0gKnBZVGFibGUrKzsKLQkJCXZhbDEgPSAqcFlUYWJsZSsrOwotCQkJdmFsMCAmPSAweDBmOwotCQkJdmFsMSAmPSAweDBmOwotCQkJdmFsMCB8PSB2YWwxIDw8IDQ7Ci0JCQlyYyA9IHJlZ193KG92LCByZWcsIHZhbDApOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlpZiAoRU5BQkxFX1VWX1FVQU5UQUJMRSkgewotCQkJdmFsMCA9ICpwVVZUYWJsZSsrOwotCQkJdmFsMSA9ICpwVVZUYWJsZSsrOwotCQkJdmFsMCAmPSAweDBmOwotCQkJdmFsMSAmPSAweDBmOwotCQkJdmFsMCB8PSB2YWwxIDw8IDQ7Ci0JCQlyYyA9IHJlZ193KG92LCByZWcgKyBPVjUxOF9RVUFOVEFCTEVTSVpFLzIsIHZhbDApOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlyZWcrKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotb3Y1MXhfcmVzZXQoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVzZXRfdHlwZSkKLXsKLQlpbnQgcmM7Ci0KLQkvKiBTZXR0aW5nIGJpdCAwIG5vdCBhbGxvd2VkIG9uIDUxOC81MThQbHVzICovCi0JaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQotCQlyZXNldF90eXBlICY9IDB4ZmU7Ci0KLQlQREVCVUcoNCwgIlJlc2V0OiB0eXBlPTB4JTAyWCIsIHJlc2V0X3R5cGUpOwotCi0JcmMgPSByZWdfdyhvdiwgUjUxeF9TWVNfUkVTRVQsIHJlc2V0X3R5cGUpOwotCXJjID0gcmVnX3cob3YsIFI1MXhfU1lTX1JFU0VULCAwKTsKLQotCWlmIChyYyA8IDApCi0JCWVycigicmVzZXQ6IGNvbW1hbmQgZmFpbGVkIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTG93LWxldmVsIEkyQyBJL08gZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE5PVEU6IERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhCi0gKiBUaGUgT1Y1MTggSTJDIEkvTyBwcm9jZWR1cmUgaXMgZGlmZmVyZW50LCBoZW5jZSwgdGhpcyBmdW5jdGlvbi4KLSAqIFRoaXMgaXMgbm9ybWFsbHkgb25seSBjYWxsZWQgZnJvbSBpMmNfdygpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgotICogYWx3YXlzIHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc2Vuc29yIGlzIHByZXNlbnQgYW5kIHdvcmtpbmcuCi0gKi8KLXN0YXRpYyBpbnQKLW92NTE4X2kyY193cml0ZV9pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwKLQkJCSB1bnNpZ25lZCBjaGFyIHJlZywKLQkJCSB1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCWludCByYzsKLQotCVBERUJVRyg1LCAiMHglMDJYOjB4JTAyWCIsIHJlZywgdmFsdWUpOwotCi0JLyogU2VsZWN0IGNhbWVyYSByZWdpc3RlciAqLwotCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX1NBRERSXzMsIHJlZyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JLyogV3JpdGUgInZhbHVlIiB0byBJMkMgZGF0YSBwb3J0IG9mIE9WNTExICovCi0JcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfREFUQSwgdmFsdWUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIEluaXRpYXRlIDMtYnl0ZSB3cml0ZSBjeWNsZSAqLwotCXJjID0gcmVnX3cob3YsIFI1MThfSTJDX0NUTCwgMHgwMSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5PVEU6IERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhICovCi1zdGF0aWMgaW50Ci1vdjUxMV9pMmNfd3JpdGVfaW50ZXJuYWwoc3RydWN0IHVzYl9vdjUxMSAqb3YsCi0JCQkgdW5zaWduZWQgY2hhciByZWcsCi0JCQkgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLQlpbnQgcmMsIHJldHJpZXM7Ci0KLQlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIHZhbHVlKTsKLQotCS8qIFRocmVlIGJ5dGUgd3JpdGUgY3ljbGUgKi8KLQlmb3IgKHJldHJpZXMgPSBPVjUxMV9JMkNfUkVUUklFUzsgOyApIHsKLQkJLyogU2VsZWN0IGNhbWVyYSByZWdpc3RlciAqLwotCQlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19TQUREUl8zLCByZWcpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJLyogV3JpdGUgInZhbHVlIiB0byBJMkMgZGF0YSBwb3J0IG9mIE9WNTExICovCi0JCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX0RBVEEsIHZhbHVlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCS8qIEluaXRpYXRlIDMtYnl0ZSB3cml0ZSBjeWNsZSAqLwotCQlyYyA9IHJlZ193KG92LCBSNTExX0kyQ19DVEwsIDB4MDEpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJLyogUmV0cnkgdW50aWwgaWRsZSAqLwotCQlkbyB7Ci0JCQlyYyA9IHJlZ19yKG92LCBSNTExX0kyQ19DVEwpOwotCQl9IHdoaWxlIChyYyA+IDAgJiYgKChyYyYxKSA9PSAwKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQkvKiBBY2s/ICovCi0JCWlmICgocmMmMikgPT0gMCkgewotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLSNpZiAwCi0JCS8qIEkyQyBhYm9ydCAqLwotCQlyZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDEwKTsKLSNlbmRpZgotCQlpZiAoLS1yZXRyaWVzIDwgMCkgewotCQkJZXJyKCJpMmMgd3JpdGUgcmV0cmllcyBleGhhdXN0ZWQiKTsKLQkJCXJjID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotLyogTk9URTogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEKLSAqIFRoZSBPVjUxOCBJMkMgSS9PIHByb2NlZHVyZSBpcyBkaWZmZXJlbnQsIGhlbmNlLCB0aGlzIGZ1bmN0aW9uLgotICogVGhpcyBpcyBub3JtYWxseSBvbmx5IGNhbGxlZCBmcm9tIGkyY19yKCkuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gKiBhbHdheXMgc3VjY2VlZHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzZW5zb3IgaXMgcHJlc2VudCBhbmQgd29ya2luZy4KLSAqLwotc3RhdGljIGludAotb3Y1MThfaTJjX3JlYWRfaW50ZXJuYWwoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVnKQotewotCWludCByYywgdmFsdWU7Ci0KLQkvKiBTZWxlY3QgY2FtZXJhIHJlZ2lzdGVyICovCi0JcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfU0FERFJfMiwgcmVnKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBJbml0aWF0ZSAyLWJ5dGUgd3JpdGUgY3ljbGUgKi8KLQlyYyA9IHJlZ193KG92LCBSNTE4X0kyQ19DVEwsIDB4MDMpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIEluaXRpYXRlIDItYnl0ZSByZWFkIGN5Y2xlICovCi0JcmMgPSByZWdfdyhvdiwgUjUxOF9JMkNfQ1RMLCAweDA1KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQl2YWx1ZSA9IHJlZ19yKG92LCBSNTF4X0kyQ19EQVRBKTsKLQotCVBERUJVRyg1LCAiMHglMDJYOjB4JTAyWCIsIHJlZywgdmFsdWUpOwotCi0JcmV0dXJuIHZhbHVlOwotfQotCi0vKiBOT1RFOiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IQotICogcmV0dXJuczogbmVnYXRpdmUgaXMgZXJyb3IsIHBvcyBvciB6ZXJvIGlzIGRhdGEgKi8KLXN0YXRpYyBpbnQKLW92NTExX2kyY19yZWFkX2ludGVybmFsKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZykKLXsKLQlpbnQgcmMsIHZhbHVlLCByZXRyaWVzOwotCi0JLyogVHdvIGJ5dGUgd3JpdGUgY3ljbGUgKi8KLQlmb3IgKHJldHJpZXMgPSBPVjUxMV9JMkNfUkVUUklFUzsgOyApIHsKLQkJLyogU2VsZWN0IGNhbWVyYSByZWdpc3RlciAqLwotCQlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19TQUREUl8yLCByZWcpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCS8qIEluaXRpYXRlIDItYnl0ZSB3cml0ZSBjeWNsZSAqLwotCQlyYyA9IHJlZ193KG92LCBSNTExX0kyQ19DVEwsIDB4MDMpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCS8qIFJldHJ5IHVudGlsIGlkbGUgKi8KLQkJZG8gewotCQkJcmMgPSByZWdfcihvdiwgUjUxMV9JMkNfQ1RMKTsKLQkJfSB3aGlsZSAocmMgPiAwICYmICgocmMgJiAxKSA9PSAwKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJaWYgKChyYyYyKSA9PSAwKSAvKiBBY2s/ICovCi0JCQlicmVhazsKLQotCQkvKiBJMkMgYWJvcnQgKi8KLQkJcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgxMCk7Ci0KLQkJaWYgKC0tcmV0cmllcyA8IDApIHsKLQkJCWVycigiaTJjIHdyaXRlIHJldHJpZXMgZXhoYXVzdGVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKiBUd28gYnl0ZSByZWFkIGN5Y2xlICovCi0JZm9yIChyZXRyaWVzID0gT1Y1MTFfSTJDX1JFVFJJRVM7IDsgKSB7Ci0JCS8qIEluaXRpYXRlIDItYnl0ZSByZWFkIGN5Y2xlICovCi0JCXJjID0gcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgwNSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJLyogUmV0cnkgdW50aWwgaWRsZSAqLwotCQlkbyB7Ci0JCQlyYyA9IHJlZ19yKG92LCBSNTExX0kyQ19DVEwpOwotCQl9IHdoaWxlIChyYyA+IDAgJiYgKChyYyYxKSA9PSAwKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJaWYgKChyYyYyKSA9PSAwKSAvKiBBY2s/ICovCi0JCQlicmVhazsKLQotCQkvKiBJMkMgYWJvcnQgKi8KLQkJcmMgPSByZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDEwKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAoLS1yZXRyaWVzIDwgMCkgewotCQkJZXJyKCJpMmMgcmVhZCByZXRyaWVzIGV4aGF1c3RlZCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JdmFsdWUgPSByZWdfcihvdiwgUjUxeF9JMkNfREFUQSk7Ci0KLQlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIHZhbHVlKTsKLQotCS8qIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgaTJjX3coKSB3b3JrICovCi0JcmMgPSByZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDA1KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIHJldHVybnM6IG5lZ2F0aXZlIGlzIGVycm9yLCBwb3Mgb3IgemVybyBpcyBkYXRhICovCi1zdGF0aWMgaW50Ci1pMmNfcihzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZWcpCi17Ci0JaW50IHJjOwotCi0JbXV0ZXhfbG9jaygmb3YtPmkyY19sb2NrKTsKLQotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKLQkJcmMgPSBvdjUxOF9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKLQllbHNlCi0JCXJjID0gb3Y1MTFfaTJjX3JlYWRfaW50ZXJuYWwob3YsIHJlZyk7Ci0KLQltdXRleF91bmxvY2soJm92LT5pMmNfbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQKLWkyY193KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZvdi0+aTJjX2xvY2spOwotCi0JaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQotCQlyYyA9IG92NTE4X2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCB2YWx1ZSk7Ci0JZWxzZQotCQlyYyA9IG92NTExX2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCB2YWx1ZSk7Ci0KLQltdXRleF91bmxvY2soJm92LT5pMmNfbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhICovCi1zdGF0aWMgaW50Ci1vdjUxeF9pMmNfd3JpdGVfbWFza19pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwKLQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgcmVnLAotCQkJICAgICAgdW5zaWduZWQgY2hhciB2YWx1ZSwKLQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgbWFzaykKLXsKLQlpbnQgcmM7Ci0JdW5zaWduZWQgY2hhciBvbGR2YWwsIG5ld3ZhbDsKLQotCWlmIChtYXNrID09IDB4ZmYpIHsKLQkJbmV3dmFsID0gdmFsdWU7Ci0JfSBlbHNlIHsKLQkJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQotCQkJcmMgPSBvdjUxOF9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKLQkJZWxzZQotCQkJcmMgPSBvdjUxMV9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlvbGR2YWwgPSAodW5zaWduZWQgY2hhcikgcmM7Ci0JCW9sZHZhbCAmPSAofm1hc2spOwkJLyogQ2xlYXIgdGhlIG1hc2tlZCBiaXRzICovCi0JCXZhbHVlICY9IG1hc2s7CQkJLyogRW5mb3JjZSBtYXNrIG9uIHZhbHVlICovCi0JCW5ld3ZhbCA9IG9sZHZhbCB8IHZhbHVlOwkvKiBTZXQgdGhlIGRlc2lyZWQgYml0cyAqLwotCX0KLQotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKLQkJcmV0dXJuIChvdjUxOF9pMmNfd3JpdGVfaW50ZXJuYWwob3YsIHJlZywgbmV3dmFsKSk7Ci0JZWxzZQotCQlyZXR1cm4gKG92NTExX2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCBuZXd2YWwpKTsKLX0KLQotLyogV3JpdGVzIGJpdHMgYXQgcG9zaXRpb25zIHNwZWNpZmllZCBieSBtYXNrIHRvIGFuIEkyQyByZWcuIEJpdHMgdGhhdCBhcmUgaW4KLSAqIHRoZSBzYW1lIHBvc2l0aW9uIGFzIDEncyBpbiAibWFzayIgYXJlIGNsZWFyZWQgYW5kIHNldCB0byAidmFsdWUiLiBCaXRzCi0gKiB0aGF0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyAwJ3MgaW4gIm1hc2siIGFyZSBwcmVzZXJ2ZWQsIHJlZ2FyZGxlc3MKLSAqIG9mIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGUgaW4gInZhbHVlIi4KLSAqLwotc3RhdGljIGludAotaTJjX3dfbWFzayhzdHJ1Y3QgdXNiX292NTExICpvdiwKLQkgICB1bnNpZ25lZCBjaGFyIHJlZywKLQkgICB1bnNpZ25lZCBjaGFyIHZhbHVlLAotCSAgIHVuc2lnbmVkIGNoYXIgbWFzaykKLXsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZvdi0+aTJjX2xvY2spOwotCXJjID0gb3Y1MXhfaTJjX3dyaXRlX21hc2tfaW50ZXJuYWwob3YsIHJlZywgdmFsdWUsIG1hc2spOwotCW11dGV4X3VubG9jaygmb3YtPmkyY19sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotLyogU2V0IHRoZSByZWFkIGFuZCB3cml0ZSBzbGF2ZSBJRHMuIFRoZSAic2xhdmUiIGFyZ3VtZW50IGlzIHRoZSB3cml0ZSBzbGF2ZSwKLSAqIGFuZCB0aGUgcmVhZCBzbGF2ZSB3aWxsIGJlIHNldCB0byAoc2xhdmUgKyAxKS4gb3YtPmkyY19sb2NrIHNob3VsZCBiZSBoZWxkCi0gKiB3aGVuIGNhbGxpbmcgdGhpcy4gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIGkyYyBJL08KLSAqIGZ1bmN0aW9ucy4KLSAqLwotc3RhdGljIGludAotaTJjX3NldF9zbGF2ZV9pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciBzbGF2ZSkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19XX1NJRCwgc2xhdmUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX1JfU0lELCBzbGF2ZSArIDEpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiAwOwotfQotCi0vKiBXcml0ZSB0byBhIHNwZWNpZmljIEkyQyBzbGF2ZSBJRCBhbmQgcmVnaXN0ZXIsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWFzayAqLwotc3RhdGljIGludAotaTJjX3dfc2xhdmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsCi0JICAgIHVuc2lnbmVkIGNoYXIgc2xhdmUsCi0JICAgIHVuc2lnbmVkIGNoYXIgcmVnLAotCSAgICB1bnNpZ25lZCBjaGFyIHZhbHVlLAotCSAgICB1bnNpZ25lZCBjaGFyIG1hc2spCi17Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJm92LT5pMmNfbG9jayk7Ci0KLQkvKiBTZXQgbmV3IHNsYXZlIElEcyAqLwotCXJjID0gaTJjX3NldF9zbGF2ZV9pbnRlcm5hbChvdiwgc2xhdmUpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmMgPSBvdjUxeF9pMmNfd3JpdGVfbWFza19pbnRlcm5hbChvdiwgcmVnLCB2YWx1ZSwgbWFzayk7Ci0KLW91dDoKLQkvKiBSZXN0b3JlIHByaW1hcnkgSURzICovCi0JaWYgKGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIG92LT5wcmltYXJ5X2kyY19zbGF2ZSkgPCAwKQotCQllcnIoIkNvdWxkbid0IHJlc3RvcmUgcHJpbWFyeSBJMkMgc2xhdmUiKTsKLQotCW11dGV4X3VubG9jaygmb3YtPmkyY19sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIFJlYWQgZnJvbSBhIHNwZWNpZmljIEkyQyBzbGF2ZSBJRCBhbmQgcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQKLWkyY19yX3NsYXZlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAotCSAgICB1bnNpZ25lZCBjaGFyIHNsYXZlLAotCSAgICB1bnNpZ25lZCBjaGFyIHJlZykKLXsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZvdi0+aTJjX2xvY2spOwotCi0JLyogU2V0IG5ldyBzbGF2ZSBJRHMgKi8KLQlyYyA9IGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIHNsYXZlKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG91dDsKLQotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKLQkJcmMgPSBvdjUxOF9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKLQllbHNlCi0JCXJjID0gb3Y1MTFfaTJjX3JlYWRfaW50ZXJuYWwob3YsIHJlZyk7Ci0KLW91dDoKLQkvKiBSZXN0b3JlIHByaW1hcnkgSURzICovCi0JaWYgKGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIG92LT5wcmltYXJ5X2kyY19zbGF2ZSkgPCAwKQotCQllcnIoIkNvdWxkbid0IHJlc3RvcmUgcHJpbWFyeSBJMkMgc2xhdmUiKTsKLQotCW11dGV4X3VubG9jaygmb3YtPmkyY19sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIFNldHMgSTJDIHJlYWQgYW5kIHdyaXRlIHNsYXZlIElEcy4gUmV0dXJucyA8MCBmb3IgZXJyb3IgKi8KLXN0YXRpYyBpbnQKLW92NTF4X3NldF9zbGF2ZV9pZHMoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgc2lkKQotewotCWludCByYzsKLQotCW11dGV4X2xvY2soJm92LT5pMmNfbG9jayk7Ci0KLQlyYyA9IGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIHNpZCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvLyBGSVhNRTogSXMgdGhpcyBhY3R1YWxseSBuZWNlc3Nhcnk/Ci0JcmMgPSBvdjUxeF9yZXNldChvdiwgT1Y1MTFfUkVTRVRfTk9SRUdTKTsKLW91dDoKLQltdXRleF91bmxvY2soJm92LT5pMmNfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50Ci13cml0ZV9yZWd2YWxzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyAqIHBSZWd2YWxzKQotewotCWludCByYzsKLQotCXdoaWxlIChwUmVndmFscy0+YnVzICE9IE9WNTExX0RPTkVfQlVTKSB7Ci0JCWlmIChwUmVndmFscy0+YnVzID09IE9WNTExX1JFR19CVVMpIHsKLQkJCWlmICgocmMgPSByZWdfdyhvdiwgcFJlZ3ZhbHMtPnJlZywgcFJlZ3ZhbHMtPnZhbCkpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCX0gZWxzZSBpZiAocFJlZ3ZhbHMtPmJ1cyA9PSBPVjUxMV9JMkNfQlVTKSB7Ci0JCQlpZiAoKHJjID0gaTJjX3cob3YsIHBSZWd2YWxzLT5yZWcsIHBSZWd2YWxzLT52YWwpKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQl9IGVsc2UgewotCQkJZXJyKCJCYWQgcmVndmFsIGFycmF5Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcFJlZ3ZhbHMrKzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBPVjUxMV9ERUJVRwotc3RhdGljIHZvaWQKLWR1bXBfaTJjX3JhbmdlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgcmVnMSwgaW50IHJlZ24pCi17Ci0JaW50IGksIHJjOwotCi0JZm9yIChpID0gcmVnMTsgaSA8PSByZWduOyBpKyspIHsKLQkJcmMgPSBpMmNfcihvdiwgaSk7Ci0JCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3JbMHglMDJYXSA9IDB4JTAyWFxuIiwgaSwgcmMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaTJjX3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkkyQyBSRUdTXG4iKTsKLQlkdW1wX2kyY19yYW5nZShvdiwgMHgwMCwgMHg3Qyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlZ19yYW5nZShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IHJlZzEsIGludCByZWduKQotewotCWludCBpLCByYzsKLQotCWZvciAoaSA9IHJlZzE7IGkgPD0gcmVnbjsgaSsrKSB7Ci0JCXJjID0gcmVnX3Iob3YsIGkpOwotCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiT1Y1MTFbMHglMDJYXSA9IDB4JTAyWFxuIiwgaSwgcmMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLW92NTExX2R1bXBfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdikKLXsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiQ0FNRVJBIElOVEVSRkFDRSBSRUdTXG4iKTsKLQlkdW1wX3JlZ19yYW5nZShvdiwgMHgxMCwgMHgxZik7Ci0JZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkRSQU0gSU5URVJGQUNFIFJFR1NcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDIwLCAweDIzKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiSVNPIEZJRk8gUkVHU1xuIik7Ci0JZHVtcF9yZWdfcmFuZ2Uob3YsIDB4MzAsIDB4MzEpOwotCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJQSU8gUkVHU1xuIik7Ci0JZHVtcF9yZWdfcmFuZ2Uob3YsIDB4MzgsIDB4MzkpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDNlLCAweDNlKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiSTJDIFJFR1NcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDQwLCAweDQ5KTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU1lTVEVNIENPTlRST0wgUkVHU1xuIik7Ci0JZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NTAsIDB4NTUpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDVlLCAweDVmKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiT21uaUNFIFJFR1NcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDcwLCAweDc5KTsKLQkvKiBOT1RFOiBRdWFudGl6YXRpb24gdGFibGVzIGFyZSBub3QgcmVhZGFibGUuIFlvdSB3aWxsIGdldCB0aGUgdmFsdWUKLQkgKiBpbiByZWcuIDB4NzkgZm9yIGV2ZXJ5IHRhYmxlIHJlZ2lzdGVyICovCi0JZHVtcF9yZWdfcmFuZ2Uob3YsIDB4ODAsIDB4OWYpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweGEwLCAweGJmKTsKLQotfQotCi1zdGF0aWMgdm9pZAotb3Y1MThfZHVtcF9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJWSURFTyBNT0RFIFJFR1NcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDIwLCAweDJmKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiREFUQSBQVU1QIEFORCBTTkFQU0hPVCBSRUdTXG4iKTsKLQlkdW1wX3JlZ19yYW5nZShvdiwgMHgzMCwgMHgzZik7Ci0JZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkkyQyBSRUdTXG4iKTsKLQlkdW1wX3JlZ19yYW5nZShvdiwgMHg0MCwgMHg0Zik7Ci0JZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlNZU1RFTSBDT05UUk9MIEFORCBWRU5ET1IgUkVHU1xuIik7Ci0JZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NTAsIDB4NWYpOwotCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICI2MCAtIDZGXG4iKTsKLQlkdW1wX3JlZ19yYW5nZShvdiwgMHg2MCwgMHg2Zik7Ci0JZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIjcwIC0gN0ZcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDcwLCAweDdmKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiWSBRVUFOVElaQVRJT04gVEFCTEVcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweDgwLCAweDhmKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiVVYgUVVBTlRJWkFUSU9OIFRBQkxFXG4iKTsKLQlkdW1wX3JlZ19yYW5nZShvdiwgMHg5MCwgMHg5Zik7Ci0JZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkEwIC0gQkZcbiIpOwotCWR1bXBfcmVnX3JhbmdlKG92LCAweGEwLCAweGJmKTsKLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiQ0JSXG4iKTsKLQlkdW1wX3JlZ19yYW5nZShvdiwgMHhjMCwgMHhjZik7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUZW1wb3JhcmlseSBzdG9wcyBPVjUxMSBmcm9tIGZ1bmN0aW9uaW5nLiBNdXN0IGRvIHRoaXMgYmVmb3JlIGNoYW5naW5nCi0gKiByZWdpc3RlcnMgd2hpbGUgdGhlIGNhbWVyYSBpcyBzdHJlYW1pbmcgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdjUxeF9zdG9wKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCVBERUJVRyg0LCAic3RvcHBpbmciKTsKLQlvdi0+c3RvcHBlZCA9IDE7Ci0JaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQotCQlyZXR1cm4gKHJlZ193X21hc2sob3YsIFI1MXhfU1lTX1JFU0VULCAweDNhLCAweDNhKSk7Ci0JZWxzZQotCQlyZXR1cm4gKHJlZ193KG92LCBSNTF4X1NZU19SRVNFVCwgMHgzZCkpOwotfQotCi0vKiBSZXN0YXJ0cyBPVjUxMSBhZnRlciBvdjUxMV9zdG9wKCkgaXMgY2FsbGVkLiBIYXMgbm8gZWZmZWN0IGlmIGl0IGlzIG5vdAotICogYWN0dWFsbHkgc3RvcHBlZCAoZm9yIHBlcmZvcm1hbmNlKS4gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdjUxeF9yZXN0YXJ0KHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWlmIChvdi0+c3RvcHBlZCkgewotCQlQREVCVUcoNCwgInJlc3RhcnRpbmciKTsKLQkJb3YtPnN0b3BwZWQgPSAwOwotCi0JCS8qIFJlaW5pdGlhbGl6ZSB0aGUgc3RyZWFtICovCi0JCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKLQkJCXJlZ193KG92LCAweDJmLCAweDgwKTsKLQotCQlyZXR1cm4gKHJlZ193KG92LCBSNTF4X1NZU19SRVNFVCwgMHgwMCkpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBTbGVlcHMgdW50aWwgbm8gZnJhbWVzIGFyZSBhY3RpdmUuIFJldHVybnMgITAgaWYgZ290IHNpZ25hbCAqLwotc3RhdGljIGludAotb3Y1MXhfd2FpdF9mcmFtZXNfaW5hY3RpdmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JcmV0dXJuIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShvdi0+d3EsIG92LT5jdXJmcmFtZSA8IDApOwotfQotCi0vKiBSZXNldHMgdGhlIGhhcmR3YXJlIHNuYXBzaG90IGJ1dHRvbiAqLwotc3RhdGljIHZvaWQKLW92NTF4X2NsZWFyX3NuYXBzaG90KHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkgewotCQlyZWdfdyhvdiwgUjUxeF9TWVNfU05BUCwgMHgwMCk7Ci0JCXJlZ193KG92LCBSNTF4X1NZU19TTkFQLCAweDAyKTsKLQkJcmVnX3cob3YsIFI1MXhfU1lTX1NOQVAsIDB4MDApOwotCX0gZWxzZSBpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpIHsKLQkJZGV2X3dhcm4oJm92LT5kZXYtPmRldiwKLQkJCSAic25hcHNob3QgcmVzZXQgbm90IHN1cHBvcnRlZCB5ZXQgb24gT1Y1MTgoKylcbiIpOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJm92LT5kZXYtPmRldiwgImNsZWFyIHNuYXA6IGludmFsaWQgYnJpZGdlIHR5cGVcbiIpOwotCX0KLX0KLQotI2lmIDAKLS8qIENoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSBzbmFwc2hvdCBidXR0b24uIFJldHVybnMgMSBpZiBpdCB3YXMgcHJlc3NlZCBzaW5jZQotICogaXQgd2FzIGxhc3QgY2xlYXJlZCwgYW5kIHplcm8gaW4gYWxsIG90aGVyIGNhc2VzIChpbmNsdWRpbmcgZXJyb3JzKSAqLwotc3RhdGljIGludAotb3Y1MXhfY2hlY2tfc25hcHNob3Qoc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IHJldCwgc3RhdHVzID0gMDsKLQotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkgewotCQlyZXQgPSByZWdfcihvdiwgUjUxeF9TWVNfU05BUCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZvdi0+ZGV2LT5kZXYsCi0JCQkJIkVycm9yIGNoZWNraW5nIHNuc3BzaG90IHN0YXR1cyAoJWQpXG4iLCByZXQpOwotCQl9IGVsc2UgaWYgKHJldCAmIDB4MDgpIHsKLQkJCXN0YXR1cyA9IDE7Ci0JCX0KLQl9IGVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7Ci0JCWRldl93YXJuKCZvdi0+ZGV2LT5kZXYsCi0JCQkgInNuYXBzaG90IGNoZWNrIG5vdCBzdXBwb3J0ZWQgeWV0IG9uIE9WNTE4KCspXG4iKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKCZvdi0+ZGV2LT5kZXYsICJjbGVhciBzbmFwOiBpbnZhbGlkIGJyaWRnZSB0eXBlXG4iKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZG9lcyBhbiBpbml0aWFsIHJlc2V0IG9mIGFuIE9tbmlWaXNpb24gc2Vuc29yIGFuZCBlbnN1cmVzIHRoYXQgSTJDCi0gKiBpcyBzeW5jaHJvbml6ZWQuIFJldHVybnMgPDAgZm9yIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLWluaXRfb3Zfc2Vuc29yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWludCBpLCBzdWNjZXNzOwotCi0JLyogUmVzZXQgdGhlIHNlbnNvciAqLwotCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIFdhaXQgZm9yIGl0IHRvIGluaXRpYWxpemUgKi8KLQltc2xlZXAoMTUwKTsKLQotCWZvciAoaSA9IDAsIHN1Y2Nlc3MgPSAwOyBpIDwgaTJjX2RldGVjdF90cmllcyAmJiAhc3VjY2VzczsgaSsrKSB7Ci0JCWlmICgoaTJjX3Iob3YsIE9WNzYxMF9SRUdfSURfSElHSCkgPT0gMHg3RikgJiYKLQkJICAgIChpMmNfcihvdiwgT1Y3NjEwX1JFR19JRF9MT1cpID09IDB4QTIpKSB7Ci0JCQlzdWNjZXNzID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogUmVzZXQgdGhlIHNlbnNvciAqLwotCQlpZiAoaTJjX3cob3YsIDB4MTIsIDB4ODApIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQkvKiBXYWl0IGZvciBpdCB0byBpbml0aWFsaXplICovCi0JCW1zbGVlcCgxNTApOwotCQkvKiBEdW1teSByZWFkIHRvIHN5bmMgSTJDICovCi0JCWlmIChpMmNfcihvdiwgMHgwMCkgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gLUVJTzsKLQotCVBERUJVRygxLCAiSTJDIHN5bmNlZCBpbiAlZCBhdHRlbXB0KHMpIiwgaSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotb3Y1MTFfc2V0X3BhY2tldF9zaXplKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgc2l6ZSkKLXsKLQlpbnQgYWx0LCBtdWx0OwotCi0JaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQltdWx0ID0gc2l6ZSA+PiA1OwotCi0JaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQlhbHQgPSBPVjUxMV9BTFRfU0laRV8wOwotCQllbHNlIGlmIChzaXplID09IDI1NykKLQkJCWFsdCA9IE9WNTExX0FMVF9TSVpFXzI1NzsKLQkJZWxzZSBpZiAoc2l6ZSA9PSA1MTMpCi0JCQlhbHQgPSBPVjUxMV9BTFRfU0laRV81MTM7Ci0JCWVsc2UgaWYgKHNpemUgPT0gNzY5KQotCQkJYWx0ID0gT1Y1MTFfQUxUX1NJWkVfNzY5OwotCQllbHNlIGlmIChzaXplID09IDk5MykKLQkJCWFsdCA9IE9WNTExX0FMVF9TSVpFXzk5MzsKLQkJZWxzZSB7Ci0JCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogaW52YWxpZCBzaXplICglZCkiLCBzaXplKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxMVBMVVMpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV8wOwotCQllbHNlIGlmIChzaXplID09IDMzKQotCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzMzOwotCQllbHNlIGlmIChzaXplID09IDEyOSkKLQkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV8xMjk7Ci0JCWVsc2UgaWYgKHNpemUgPT0gMjU3KQotCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzI1NzsKLQkJZWxzZSBpZiAoc2l6ZSA9PSAzODUpCi0JCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfMzg1OwotCQllbHNlIGlmIChzaXplID09IDUxMykKLQkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV81MTM7Ci0JCWVsc2UgaWYgKHNpemUgPT0gNzY5KQotCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzc2OTsKLQkJZWxzZSBpZiAoc2l6ZSA9PSA5NjEpCi0JCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfOTYxOwotCQllbHNlIHsKLQkJCWVycigiU2V0IHBhY2tldCBzaXplOiBpbnZhbGlkIHNpemUgKCVkKSIsIHNpemUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogSW52YWxpZCBicmlkZ2UgdHlwZSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlQREVCVUcoMywgIiVkLCBtdWx0PSVkLCBhbHQ9JWQiLCBzaXplLCBtdWx0LCBhbHQpOwotCi0JaWYgKHJlZ193KG92LCBSNTF4X0ZJRk9fUFNJWkUsIG11bHQpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAodXNiX3NldF9pbnRlcmZhY2Uob3YtPmRldiwgb3YtPmlmYWNlLCBhbHQpIDwgMCkgewotCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogc2V0IGludGVyZmFjZSBlcnJvciIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmIChvdjUxeF9yZXNldChvdiwgT1Y1MTFfUkVTRVRfTk9SRUdTKSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0Jb3YtPnBhY2tldF9zaXplID0gc2l6ZTsKLQotCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5vdGU6IFVubGlrZSB0aGUgT1Y1MTEvT1Y1MTErLCB0aGUgc2l6ZSBhcmd1bWVudCBkb2VzIE5PVCBpbmNsdWRlIHRoZQotICogb3B0aW9uYWwgcGFja2V0IG51bWJlciBieXRlLiBUaGUgYWN0dWFsIHNpemUgKmlzKiBzdG9yZWQgaW4gb3YtPnBhY2tldF9zaXplLAotICogdGhvdWdoLiAqLwotc3RhdGljIGludAotb3Y1MThfc2V0X3BhY2tldF9zaXplKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgc2l6ZSkKLXsKLQlpbnQgYWx0OwotCi0JaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzA7Ci0JCWVsc2UgaWYgKHNpemUgPT0gMTI4KQotCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfMTI4OwotCQllbHNlIGlmIChzaXplID09IDI1NikKLQkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzI1NjsKLQkJZWxzZSBpZiAoc2l6ZSA9PSAzODQpCi0JCQlhbHQgPSBPVjUxOF9BTFRfU0laRV8zODQ7Ci0JCWVsc2UgaWYgKHNpemUgPT0gNTEyKQotCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfNTEyOwotCQllbHNlIGlmIChzaXplID09IDY0MCkKLQkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzY0MDsKLQkJZWxzZSBpZiAoc2l6ZSA9PSA3NjgpCi0JCQlhbHQgPSBPVjUxOF9BTFRfU0laRV83Njg7Ci0JCWVsc2UgaWYgKHNpemUgPT0gODk2KQotCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfODk2OwotCQllbHNlIHsKLQkJCWVycigiU2V0IHBhY2tldCBzaXplOiBpbnZhbGlkIHNpemUgKCVkKSIsIHNpemUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogSW52YWxpZCBicmlkZ2UgdHlwZSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlQREVCVUcoMywgIiVkLCBhbHQ9JWQiLCBzaXplLCBhbHQpOwotCi0Jb3YtPnBhY2tldF9zaXplID0gc2l6ZTsKLQlpZiAoc2l6ZSA+IDApIHsKLQkJLyogUHJvZ3JhbSBJU08gRklGTyBzaXplIHJlZyAocGFja2V0IG51bWJlciBpc24ndCBpbmNsdWRlZCkgKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHgzMCwgc2l6ZSwgMik7Ci0KLQkJaWYgKG92LT5wYWNrZXRfbnVtYmVyaW5nKQotCQkJKytvdi0+cGFja2V0X3NpemU7Ci0JfQotCi0JaWYgKHVzYl9zZXRfaW50ZXJmYWNlKG92LT5kZXYsIG92LT5pZmFjZSwgYWx0KSA8IDApIHsKLQkJZXJyKCJTZXQgcGFja2V0IHNpemU6IHNldCBpbnRlcmZhY2UgZXJyb3IiKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBzdHJlYW0gKi8KLQlpZiAocmVnX3cob3YsIDB4MmYsIDB4ODApIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChvdjUxeF9yZXNldChvdiwgT1Y1MTFfUkVTRVRfTk9SRUdTKSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFVwbG9hZCBjb21wcmVzc2lvbiBwYXJhbXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMuIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4gKi8KLXN0YXRpYyBpbnQKLW92NTExX2luaXRfY29tcHJlc3Npb24oc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghb3YtPmNvbXByZXNzX2luaXRlZCkgewotCQlyZWdfdyhvdiwgMHg3MCwgcGh5KTsKLQkJcmVnX3cob3YsIDB4NzEsIHBodXYpOwotCQlyZWdfdyhvdiwgMHg3MiwgcHZ5KTsKLQkJcmVnX3cob3YsIDB4NzMsIHB2dXYpOwotCQlyZWdfdyhvdiwgMHg3NCwgcWh5KTsKLQkJcmVnX3cob3YsIDB4NzUsIHFodXYpOwotCQlyZWdfdyhvdiwgMHg3NiwgcXZ5KTsKLQkJcmVnX3cob3YsIDB4NzcsIHF2dXYpOwotCi0JCWlmIChvdjUxMV91cGxvYWRfcXVhbl90YWJsZXMob3YpIDwgMCkgewotCQkJZXJyKCJFcnJvciB1cGxvYWRpbmcgcXVhbnRpemF0aW9uIHRhYmxlcyIpOwotCQkJcmMgPSAtRUlPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlvdi0+Y29tcHJlc3NfaW5pdGVkID0gMTsKLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIFVwbG9hZCBjb21wcmVzc2lvbiBwYXJhbXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMuIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4gKi8KLXN0YXRpYyBpbnQKLW92NTE4X2luaXRfY29tcHJlc3Npb24oc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghb3YtPmNvbXByZXNzX2luaXRlZCkgewotCQlpZiAob3Y1MThfdXBsb2FkX3F1YW5fdGFibGVzKG92KSA8IDApIHsKLQkJCWVycigiRXJyb3IgdXBsb2FkaW5nIHF1YW50aXphdGlvbiB0YWJsZXMiKTsKLQkJCXJjID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0Jb3YtPmNvbXByZXNzX2luaXRlZCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBTZXRzIHNlbnNvcidzIGNvbnRyYXN0IHNldHRpbmcgdG8gInZhbCIgKi8KLXN0YXRpYyBpbnQKLXNlbnNvcl9zZXRfY29udHJhc3Qoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0IHZhbCkKLXsKLQlpbnQgcmM7Ci0KLQlQREVCVUcoMywgIiVkIiwgdmFsKTsKLQotCWlmIChvdi0+c3RvcF9kdXJpbmdfc2V0KQotCQlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKLQljYXNlIFNFTl9PVjc2MTA6Ci0JY2FzZSBTRU5fT1Y2NjIwOgotCXsKLQkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19DTlQsIHZhbCA+PiA4KTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCQlicmVhazsKLQl9Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCXsKLQkJcmMgPSBpMmNfd19tYXNrKG92LCBPVjc2MTBfUkVHX0NOVCwgdmFsID4+IDEyLCAweDBmKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCQlicmVhazsKLQl9Ci0JY2FzZSBTRU5fT1Y3NjIwOgotCXsKLQkJdW5zaWduZWQgY2hhciBjdGFiW10gPSB7Ci0JCQkweDAxLCAweDA1LCAweDA5LCAweDExLCAweDE1LCAweDM1LCAweDM3LCAweDU3LAotCQkJMHg1YiwgMHhhNSwgMHhhNywgMHhjNywgMHhjOSwgMHhjZiwgMHhlZiwgMHhmZgotCQl9OwotCi0JCS8qIFVzZSBZIGdhbW1hIGNvbnRyb2wgaW5zdGVhZC4gQml0IDAgZW5hYmxlcyBpdC4gKi8KLQkJcmMgPSBpMmNfdyhvdiwgMHg2NCwgY3RhYlt2YWw+PjEyXSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgU0VOX1NBQTcxMTFBOgotCXsKLQkJcmMgPSBpMmNfdyhvdiwgMHgwYiwgdmFsID4+IDkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCXsKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJjID0gLUVQRVJNOwotCQlnb3RvIG91dDsKLQl9Ci0JfQotCi0JcmMgPSAwOwkJLyogU3VjY2VzcyAqLwotCW92LT5jb250cmFzdCA9IHZhbDsKLW91dDoKLQlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiByYzsKLX0KLQotLyogR2V0cyBzZW5zb3IncyBjb250cmFzdCBzZXR0aW5nICovCi1zdGF0aWMgaW50Ci1zZW5zb3JfZ2V0X2NvbnRyYXN0KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCAqdmFsKQotewotCWludCByYzsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYxMDoKLQljYXNlIFNFTl9PVjY2MjA6Ci0JCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfQ05UKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZQotCQkJKnZhbCA9IHJjIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNjYzMDoKLQkJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19DTlQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQllbHNlCi0JCQkqdmFsID0gcmMgPDwgMTI7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNzYyMDoKLQkJLyogVXNlIFkgZ2FtbWEgcmVnIGluc3RlYWQuIEJpdCAwIGlzIHRoZSBlbmFibGUgYml0LiAqLwotCQlyYyA9IGkyY19yKG92LCAweDY0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZQotCQkJKnZhbCA9IChyYyAmIDB4ZmUpIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX1NBQTcxMTFBOgotCQkqdmFsID0gb3YtPmNvbnRyYXN0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQlQREVCVUcoMywgIiVkIiwgKnZhbCk7Ci0Jb3YtPmNvbnRyYXN0ID0gKnZhbDsKLQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBTZXRzIHNlbnNvcidzIGJyaWdodG5lc3Mgc2V0dGluZyB0byAidmFsIiAqLwotc3RhdGljIGludAotc2Vuc29yX3NldF9icmlnaHRuZXNzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCB2YWwpCi17Ci0JaW50IHJjOwotCi0JUERFQlVHKDQsICIlZCIsIHZhbCk7Ci0KLQlpZiAob3YtPnN0b3BfZHVyaW5nX3NldCkKLQkJaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCi0Jc3dpdGNoIChvdi0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5fT1Y3NjEwOgotCWNhc2UgU0VOX09WNzZCRToKLQljYXNlIFNFTl9PVjY2MjA6Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX0JSVCwgdmFsID4+IDgpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNzYyMDoKLQkJLyogNzYyMCBkb2Vzbid0IGxpa2UgbWFudWFsIGNoYW5nZXMgd2hlbiBpbiBhdXRvIG1vZGUgKi8KLQkJaWYgKCFvdi0+YXV0b19icnQpIHsKLQkJCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfQlJULCB2YWwgPj4gOCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU0VOX1NBQTcxMTFBOgotCQlyYyA9IGkyY193KG92LCAweDBhLCB2YWwgPj4gOCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJjID0gLUVQRVJNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IDA7CQkvKiBTdWNjZXNzICovCi0Jb3YtPmJyaWdodG5lc3MgPSB2YWw7Ci1vdXQ6Ci0JaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIEdldHMgc2Vuc29yJ3MgYnJpZ2h0bmVzcyBzZXR0aW5nICovCi1zdGF0aWMgaW50Ci1zZW5zb3JfZ2V0X2JyaWdodG5lc3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0ICp2YWwpCi17Ci0JaW50IHJjOwotCi0Jc3dpdGNoIChvdi0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5fT1Y3NjEwOgotCWNhc2UgU0VOX09WNzZCRToKLQljYXNlIFNFTl9PVjc2MjA6Ci0JY2FzZSBTRU5fT1Y2NjIwOgotCWNhc2UgU0VOX09WNjYzMDoKLQkJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19CUlQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQllbHNlCi0JCQkqdmFsID0gcmMgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JCSp2YWwgPSBvdi0+YnJpZ2h0bmVzczsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JUERFQlVHKDMsICIlZCIsICp2YWwpOwotCW92LT5icmlnaHRuZXNzID0gKnZhbDsKLQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBTZXRzIHNlbnNvcidzIHNhdHVyYXRpb24gKGNvbG9yIGludGVuc2l0eSkgc2V0dGluZyB0byAidmFsIiAqLwotc3RhdGljIGludAotc2Vuc29yX3NldF9zYXR1cmF0aW9uKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCB2YWwpCi17Ci0JaW50IHJjOwotCi0JUERFQlVHKDMsICIlZCIsIHZhbCk7Ci0KLQlpZiAob3YtPnN0b3BfZHVyaW5nX3NldCkKLQkJaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCi0Jc3dpdGNoIChvdi0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5fT1Y3NjEwOgotCWNhc2UgU0VOX09WNzZCRToKLQljYXNlIFNFTl9PVjY2MjA6Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX1NBVCwgdmFsID4+IDgpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNzYyMDoKLS8vCQkvKiBVc2UgVVYgZ2FtbWEgY29udHJvbCBpbnN0ZWFkLiBCaXRzIDAgJiA3IGFyZSByZXNlcnZlZC4gKi8KLS8vCQlyYyA9IG92X2kyY193cml0ZShvdi0+ZGV2LCAweDYyLCAodmFsID4+IDkpICYgMHg3ZSk7Ci0vLwkJaWYgKHJjIDwgMCkKLS8vCQkJZ290byBvdXQ7Ci0JCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfU0FULCB2YWwgPj4gOCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JCXJjID0gaTJjX3cob3YsIDB4MGMsIHZhbCA+PiA5KTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKLQkJcmMgPSAtRVBFUk07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gMDsJCS8qIFN1Y2Nlc3MgKi8KLQlvdi0+Y29sb3VyID0gdmFsOwotb3V0OgotCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBHZXRzIHNlbnNvcidzIHNhdHVyYXRpb24gKGNvbG9yIGludGVuc2l0eSkgc2V0dGluZyAqLwotc3RhdGljIGludAotc2Vuc29yX2dldF9zYXR1cmF0aW9uKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCAqdmFsKQotewotCWludCByYzsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYxMDoKLQljYXNlIFNFTl9PVjc2QkU6Ci0JY2FzZSBTRU5fT1Y2NjIwOgotCWNhc2UgU0VOX09WNjYzMDoKLQkJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19TQVQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQllbHNlCi0JCQkqdmFsID0gcmMgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y3NjIwOgotLy8JCS8qIFVzZSBVViBnYW1tYSByZWcgaW5zdGVhZC4gQml0cyAwICYgNyBhcmUgcmVzZXJ2ZWQuICovCi0vLwkJcmMgPSBpMmNfcihvdiwgMHg2Mik7Ci0vLwkJaWYgKHJjIDwgMCkKLS8vCQkJcmV0dXJuIHJjOwotLy8JCWVsc2UKLS8vCQkJKnZhbCA9IChyYyAmIDB4N2UpIDw8IDk7Ci0JCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfU0FUKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZQotCQkJKnZhbCA9IHJjIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX1NBQTcxMTFBOgotCQkqdmFsID0gb3YtPmNvbG91cjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JUERFQlVHKDMsICIlZCIsICp2YWwpOwotCW92LT5jb2xvdXIgPSAqdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFNldHMgc2Vuc29yJ3MgaHVlIChyZWQvYmx1ZSBiYWxhbmNlKSBzZXR0aW5nIHRvICJ2YWwiICovCi1zdGF0aWMgaW50Ci1zZW5zb3Jfc2V0X2h1ZShzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgdmFsKQotewotCWludCByYzsKLQotCVBERUJVRygzLCAiJWQiLCB2YWwpOwotCi0JaWYgKG92LT5zdG9wX2R1cmluZ19zZXQpCi0JCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYxMDoKLQljYXNlIFNFTl9PVjY2MjA6Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX1JFRCwgMHhGRiAtICh2YWwgPj4gOCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19CTFVFLCB2YWwgPj4gOCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y3NjIwOgotLy8gSHVlIGNvbnRyb2wgaXMgY2F1c2luZyBwcm9ibGVtcy4gSSB3aWxsIGVuYWJsZSBpdCBvbmNlIGl0J3MgZml4ZWQuCi0jaWYgMAotCQlyYyA9IGkyY193KG92LCAweDdhLCAodW5zaWduZWQgY2hhcikodmFsID4+IDgpICsgMHhiKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCXJjID0gaTJjX3cob3YsIDB4NzksICh1bnNpZ25lZCBjaGFyKSh2YWwgPj4gOCkgKyAweGIpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JCXJjID0gaTJjX3cob3YsIDB4MGQsICh2YWwgKyAzMjc2OCkgPj4gOCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJjID0gLUVQRVJNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IDA7CQkvKiBTdWNjZXNzICovCi0Jb3YtPmh1ZSA9IHZhbDsKLW91dDoKLQlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiByYzsKLX0KLQotLyogR2V0cyBzZW5zb3IncyBodWUgKHJlZC9ibHVlIGJhbGFuY2UpIHNldHRpbmcgKi8KLXN0YXRpYyBpbnQKLXNlbnNvcl9nZXRfaHVlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCAqdmFsKQotewotCWludCByYzsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYxMDoKLQljYXNlIFNFTl9PVjY2MjA6Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX0JMVUUpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQllbHNlCi0JCQkqdmFsID0gcmMgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y3NjIwOgotCQlyYyA9IGkyY19yKG92LCAweDdhKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZQotCQkJKnZhbCA9IHJjIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX1NBQTcxMTFBOgotCQkqdmFsID0gb3YtPmh1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JUERFQlVHKDMsICIlZCIsICp2YWwpOwotCW92LT5odWUgPSAqdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQKLXNlbnNvcl9zZXRfcGljdHVyZShzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IHZpZGVvX3BpY3R1cmUgKnApCi17Ci0JaW50IHJjOwotCi0JUERFQlVHKDQsICJzZW5zb3Jfc2V0X3BpY3R1cmUiKTsKLQotCW92LT53aGl0ZW5lc3MgPSBwLT53aGl0ZW5lc3M7Ci0KLQkvKiBEb24ndCByZXR1cm4gZXJyb3IgaWYgYSBzZXR0aW5nIGlzIHVuc3VwcG9ydGVkLCBvciByZXN0IG9mIHNldHRpbmdzCi0JICogd2lsbCBub3QgYmUgcGVyZm9ybWVkICovCi0KLQlyYyA9IHNlbnNvcl9zZXRfY29udHJhc3Qob3YsIHAtPmNvbnRyYXN0KTsKLQlpZiAoRkFUQUxfRVJST1IocmMpKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHNlbnNvcl9zZXRfYnJpZ2h0bmVzcyhvdiwgcC0+YnJpZ2h0bmVzcyk7Ci0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBzZW5zb3Jfc2V0X3NhdHVyYXRpb24ob3YsIHAtPmNvbG91cik7Ci0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBzZW5zb3Jfc2V0X2h1ZShvdiwgcC0+aHVlKTsKLQlpZiAoRkFUQUxfRVJST1IocmMpKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2Vuc29yX2dldF9waWN0dXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCkKLXsKLQlpbnQgcmM7Ci0KLQlQREVCVUcoNCwgInNlbnNvcl9nZXRfcGljdHVyZSIpOwotCi0JLyogRG9uJ3QgcmV0dXJuIGVycm9yIGlmIGEgc2V0dGluZyBpcyB1bnN1cHBvcnRlZCwgb3IgcmVzdCBvZiBzZXR0aW5ncwotCSAqIHdpbGwgbm90IGJlIHBlcmZvcm1lZCAqLwotCi0JcmMgPSBzZW5zb3JfZ2V0X2NvbnRyYXN0KG92LCAmKHAtPmNvbnRyYXN0KSk7Ci0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBzZW5zb3JfZ2V0X2JyaWdodG5lc3Mob3YsICYocC0+YnJpZ2h0bmVzcykpOwotCWlmIChGQVRBTF9FUlJPUihyYykpCi0JCXJldHVybiByYzsKLQotCXJjID0gc2Vuc29yX2dldF9zYXR1cmF0aW9uKG92LCAmKHAtPmNvbG91cikpOwotCWlmIChGQVRBTF9FUlJPUihyYykpCi0JCXJldHVybiByYzsKLQotCXJjID0gc2Vuc29yX2dldF9odWUob3YsICYocC0+aHVlKSk7Ci0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0JcC0+d2hpdGVuZXNzID0gMTA1IDw8IDg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmIDAKLS8vIEZJWE1FOiBFeHBvc3VyZSByYW5nZSBpcyBvbmx5IDB4MDAtMHg3ZiBpbiBpbnRlcmxhY2UgbW9kZQotLyogU2V0cyBjdXJyZW50IGV4cG9zdXJlIGZvciBzZW5zb3IuIFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGlmIGF1dG8tZXhwb3N1cmUKLSAqIGlzIG9mZiAqLwotc3RhdGljIGlubGluZSBpbnQKLXNlbnNvcl9zZXRfZXhwb3N1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgdmFsKQotewotCWludCByYzsKLQotCVBERUJVRygzLCAiJWQiLCB2YWwpOwotCi0JaWYgKG92LT5zdG9wX2R1cmluZ19zZXQpCi0JCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNjYyMDoKLQljYXNlIFNFTl9PVjY2MzA6Ci0JY2FzZSBTRU5fT1Y3NjEwOgotCWNhc2UgU0VOX09WNzYyMDoKLQljYXNlIFNFTl9PVjc2QkU6Ci0JY2FzZSBTRU5fT1Y4NjAwOgotCQlyYyA9IGkyY193KG92LCAweDEwLCB2YWwpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTRU5fS1MwMTI3OgotCWNhc2UgU0VOX0tTMDEyN0I6Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOwotCQlyZXR1cm4gLUVQRVJNOwotCWRlZmF1bHQ6Ci0JCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIHNldF9leHBvc3VyZSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IDA7CQkvKiBTdWNjZXNzICovCi0Jb3YtPmV4cG9zdXJlID0gdmFsOwotb3V0OgotCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLS8qIEdldHMgY3VycmVudCBleHBvc3VyZSBsZXZlbCBmcm9tIHNlbnNvciwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIHVuZGVyCi0gKiBtYW51YWwgY29udHJvbC4gKi8KLXN0YXRpYyBpbnQKLXNlbnNvcl9nZXRfZXhwb3N1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgKnZhbCkKLXsKLQlpbnQgcmM7Ci0KLQlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKLQljYXNlIFNFTl9PVjc2MTA6Ci0JY2FzZSBTRU5fT1Y2NjIwOgotCWNhc2UgU0VOX09WNjYzMDoKLQljYXNlIFNFTl9PVjc2MjA6Ci0JY2FzZSBTRU5fT1Y3NkJFOgotCWNhc2UgU0VOX09WODYwMDoKLQkJcmMgPSBpMmNfcihvdiwgMHgxMCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCWVsc2UKLQkJCSp2YWwgPSByYzsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fS1MwMTI3OgotCWNhc2UgU0VOX0tTMDEyN0I6Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JCXZhbCA9IE5VTEw7Ci0JCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOwotCQlyZXR1cm4gLUVQRVJNOwotCWRlZmF1bHQ6Ci0JCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIGdldF9leHBvc3VyZSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlQREVCVUcoMywgIiVkIiwgKnZhbCk7Ci0Jb3YtPmV4cG9zdXJlID0gKnZhbDsKLQotCXJldHVybiAwOwotfQotCi0vKiBUdXJucyBvbiBvciBvZmYgdGhlIExFRC4gT25seSBoYXMgYW4gZWZmZWN0IHdpdGggT1Y1MTErL09WNTE4KCspICovCi1zdGF0aWMgdm9pZAotb3Y1MXhfbGVkX2NvbnRyb2woc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBlbmFibGUpCi17Ci0JUERFQlVHKDQsICIgKCVzKSIsIGVuYWJsZSA/ICJ0dXJuIG9uIiA6ICJ0dXJuIG9mZiIpOwotCi0JaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExUExVUykKLQkJcmVnX3cob3YsIFI1MTFfU1lTX0xFRF9DVEwsIGVuYWJsZSA/IDEgOiAwKTsKLQllbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKLQkJcmVnX3dfbWFzayhvdiwgUjUxOF9HUElPX09VVCwgZW5hYmxlID8gMHgwMiA6IDB4MDAsIDB4MDIpOwotCi0JcmV0dXJuOwotfQotCi0vKiBNYXRjaGVzIHRoZSBzZW5zb3IncyBpbnRlcm5hbCBmcmFtZSByYXRlIHRvIHRoZSBsaWdodGluZyBmcmVxdWVuY3kuCi0gKiBWYWxpZCBmcmVxdWVuY2llcyBhcmU6Ci0gKgk1MCAtIDUwSHosIGZvciBFdXJvcGVhbiBhbmQgQXNpYW4gbGlnaHRpbmcKLSAqCTYwIC0gNjBIeiwgZm9yIEFtZXJpY2FuIGxpZ2h0aW5nCi0gKgotICogVGVzdGVkIHdpdGg6IE9WNzYxMCwgT1Y3NjIwLCBPVjc2QkUsIE9WNjYyMAotICogVW5zdXBwb3J0ZWQ6IEtTMDEyNywgS1MwMTI3QiwgU0FBNzExMUEKLSAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKLSAqLwotc3RhdGljIGludAotc2Vuc29yX3NldF9saWdodF9mcmVxKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZnJlcSkKLXsKLQlpbnQgc2l4dHk7Ci0KLQlQREVCVUcoNCwgIiVkIEh6IiwgZnJlcSk7Ci0KLQlpZiAoZnJlcSA9PSA2MCkKLQkJc2l4dHkgPSAxOwotCWVsc2UgaWYgKGZyZXEgPT0gNTApCi0JCXNpeHR5ID0gMDsKLQllbHNlIHsKLQkJZXJyKCJJbnZhbGlkIGxpZ2h0IGZyZXEgKCVkIEh6KSIsIGZyZXEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKLQljYXNlIFNFTl9PVjc2MTA6Ci0JCWkyY193X21hc2sob3YsIDB4MmEsIHNpeHR5PzB4MDA6MHg4MCwgMHg4MCk7Ci0JCWkyY193KG92LCAweDJiLCBzaXh0eT8weDAwOjB4YWMpOwotCQlpMmNfd19tYXNrKG92LCAweDEzLCAweDEwLCAweDEwKTsKLQkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgwMCwgMHgxMCk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNzYyMDoKLQljYXNlIFNFTl9PVjc2QkU6Ci0JY2FzZSBTRU5fT1Y4NjAwOgotCQlpMmNfd19tYXNrKG92LCAweDJhLCBzaXh0eT8weDAwOjB4ODAsIDB4ODApOwotCQlpMmNfdyhvdiwgMHgyYiwgc2l4dHk/MHgwMDoweGFjKTsKLQkJaTJjX3dfbWFzayhvdiwgMHg3NiwgMHgwMSwgMHgwMSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNjYyMDoKLQljYXNlIFNFTl9PVjY2MzA6Ci0JCWkyY193KG92LCAweDJiLCBzaXh0eT8weGE4OjB4MjgpOwotCQlpMmNfdyhvdiwgMHgyYSwgc2l4dHk/MHg4NDoweGE0KTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fS1MwMTI3OgotCWNhc2UgU0VOX0tTMDEyN0I6Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JCVBERUJVRyg1LCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOwotCQlyZXR1cm4gLUVQRVJNOwotCWRlZmF1bHQ6Ci0JCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIHNldF9saWdodF9mcmVxIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW92LT5saWdodGZyZXEgPSBmcmVxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIElmIGVuYWJsZSBpcyB0cnVlLCB0dXJuIG9uIHRoZSBzZW5zb3IncyBiYW5kaW5nIGZpbHRlciwgb3RoZXJ3aXNlIHR1cm4gaXQKLSAqIG9mZi4gVGhpcyBmaWx0ZXIgdHJpZXMgdG8gcmVkdWNlIHRoZSBwYXR0ZXJuIG9mIGhvcml6b250YWwgbGlnaHQvZGFyayBiYW5kcwotICogY2F1c2VkIGJ5IHNvbWUgKHVzdWFsbHkgZmx1b3Jlc2NlbnQpIGxpZ2h0aW5nLiBUaGUgbGlnaHQgZnJlcXVlbmN5IG11c3QgYmUKLSAqIHNldCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGVuYWJsaW5nIGl0IHdpdGggb3Y1MXhfc2V0X2xpZ2h0X2ZyZXEoKS4KLSAqCi0gKiBUZXN0ZWQgd2l0aDogT1Y3NjEwLCBPVjc2MjAsIE9WNzZCRSwgT1Y2NjIwLgotICogVW5zdXBwb3J0ZWQ6IEtTMDEyNywgS1MwMTI3QiwgU0FBNzExMUEKLSAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKLSAqLwotc3RhdGljIGludAotc2Vuc29yX3NldF9iYW5kaW5nX2ZpbHRlcihzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGVuYWJsZSkKLXsKLQlpbnQgcmM7Ci0KLQlQREVCVUcoNCwgIiAoJXMpIiwgZW5hYmxlID8gInR1cm4gb24iIDogInR1cm4gb2ZmIik7Ci0KLQlpZiAob3YtPnNlbnNvciA9PSBTRU5fS1MwMTI3IHx8IG92LT5zZW5zb3IgPT0gU0VOX0tTMDEyN0IKLQkJfHwgb3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEpIHsKLQkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JcmMgPSBpMmNfd19tYXNrKG92LCAweDJkLCBlbmFibGU/MHgwNDoweDAwLCAweDA0KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlvdi0+YmFuZGZpbHQgPSBlbmFibGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogSWYgZW5hYmxlIGlzIHRydWUsIHR1cm4gb24gdGhlIHNlbnNvcidzIGF1dG8gYnJpZ2h0bmVzcyBjb250cm9sLCBvdGhlcndpc2UKLSAqIHR1cm4gaXQgb2ZmLgotICoKLSAqIFVuc3VwcG9ydGVkOiBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCi0gKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCi0gKi8KLXN0YXRpYyBpbnQKLXNlbnNvcl9zZXRfYXV0b19icmlnaHRuZXNzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZW5hYmxlKQotewotCWludCByYzsKLQotCVBERUJVRyg0LCAiICglcykiLCBlbmFibGUgPyAidHVybiBvbiIgOiAidHVybiBvZmYiKTsKLQotCWlmIChvdi0+c2Vuc29yID09IFNFTl9LUzAxMjcgfHwgb3YtPnNlbnNvciA9PSBTRU5fS1MwMTI3QgotCQl8fCBvdi0+c2Vuc29yID09IFNFTl9TQUE3MTExQSkgewotCQlQREVCVUcoNSwgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQlyYyA9IGkyY193X21hc2sob3YsIDB4MmQsIGVuYWJsZT8weDEwOjB4MDAsIDB4MTApOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW92LT5hdXRvX2JydCA9IGVuYWJsZTsKLQotCXJldHVybiAwOwotfQotCi0vKiBJZiBlbmFibGUgaXMgdHJ1ZSwgdHVybiBvbiB0aGUgc2Vuc29yJ3MgYXV0byBleHBvc3VyZSBjb250cm9sLCBvdGhlcndpc2UKLSAqIHR1cm4gaXQgb2ZmLgotICoKLSAqIFVuc3VwcG9ydGVkOiBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCi0gKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCi0gKi8KLXN0YXRpYyBpbnQKLXNlbnNvcl9zZXRfYXV0b19leHBvc3VyZShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGVuYWJsZSkKLXsKLQlQREVCVUcoNCwgIiAoJXMpIiwgZW5hYmxlID8gInR1cm4gb24iIDogInR1cm4gb2ZmIik7Ci0KLQlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKLQljYXNlIFNFTl9PVjc2MTA6Ci0JCWkyY193X21hc2sob3YsIDB4MjksIGVuYWJsZT8weDAwOjB4ODAsIDB4ODApOwotCQlicmVhazsKLQljYXNlIFNFTl9PVjY2MjA6Ci0JY2FzZSBTRU5fT1Y3NjIwOgotCWNhc2UgU0VOX09WNzZCRToKLQljYXNlIFNFTl9PVjg2MDA6Ci0JCWkyY193X21hc2sob3YsIDB4MTMsIGVuYWJsZT8weDAxOjB4MDAsIDB4MDEpOwotCQlicmVhazsKLQljYXNlIFNFTl9PVjY2MzA6Ci0JCWkyY193X21hc2sob3YsIDB4MjgsIGVuYWJsZT8weDAwOjB4MTAsIDB4MTApOwotCQlicmVhazsKLQljYXNlIFNFTl9LUzAxMjc6Ci0JY2FzZSBTRU5fS1MwMTI3QjoKLQljYXNlIFNFTl9TQUE3MTExQToKLQkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JZGVmYXVsdDoKLQkJZXJyKCJTZW5zb3Igbm90IHN1cHBvcnRlZCBmb3Igc2V0X2F1dG9fZXhwb3N1cmUiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jb3YtPmF1dG9fZXhwID0gZW5hYmxlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE1vZGlmaWVzIHRoZSBzZW5zb3IncyBleHBvc3VyZSBhbGdvcml0aG0gdG8gYWxsb3cgcHJvcGVyIGV4cG9zdXJlIG9mIG9iamVjdHMKLSAqIHRoYXQgYXJlIGlsbHVtaW5hdGVkIGZyb20gYmVoaW5kLgotICoKLSAqIFRlc3RlZCB3aXRoOiBPVjY2MjAsIE9WNzYyMAotICogVW5zdXBwb3J0ZWQ6IE9WNzYxMCwgT1Y3NkJFLCBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCi0gKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCi0gKi8KLXN0YXRpYyBpbnQKLXNlbnNvcl9zZXRfYmFja2xpZ2h0KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZW5hYmxlKQotewotCVBERUJVRyg0LCAiICglcykiLCBlbmFibGUgPyAidHVybiBvbiIgOiAidHVybiBvZmYiKTsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYyMDoKLQljYXNlIFNFTl9PVjg2MDA6Ci0JCWkyY193X21hc2sob3YsIDB4NjgsIGVuYWJsZT8weGUwOjB4YzAsIDB4ZTApOwotCQlpMmNfd19tYXNrKG92LCAweDI5LCBlbmFibGU/MHgwODoweDAwLCAweDA4KTsKLQkJaTJjX3dfbWFzayhvdiwgMHgyOCwgZW5hYmxlPzB4MDI6MHgwMCwgMHgwMik7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX09WNjYyMDoKLQkJaTJjX3dfbWFzayhvdiwgMHg0ZSwgZW5hYmxlPzB4ZTA6MHhjMCwgMHhlMCk7Ci0JCWkyY193X21hc2sob3YsIDB4MjksIGVuYWJsZT8weDA4OjB4MDAsIDB4MDgpOwotCQlpMmNfd19tYXNrKG92LCAweDBlLCBlbmFibGU/MHg4MDoweDAwLCAweDgwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCQlpMmNfd19tYXNrKG92LCAweDRlLCBlbmFibGU/MHg4MDoweDYwLCAweGUwKTsKLQkJaTJjX3dfbWFzayhvdiwgMHgyOSwgZW5hYmxlPzB4MDg6MHgwMCwgMHgwOCk7Ci0JCWkyY193X21hc2sob3YsIDB4MjgsIGVuYWJsZT8weDAyOjB4MDAsIDB4MDIpOwotCQlicmVhazsKLQljYXNlIFNFTl9PVjc2MTA6Ci0JY2FzZSBTRU5fT1Y3NkJFOgotCWNhc2UgU0VOX0tTMDEyNzoKLQljYXNlIFNFTl9LUzAxMjdCOgotCWNhc2UgU0VOX1NBQTcxMTFBOgotCQlQREVCVUcoNSwgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQlkZWZhdWx0OgotCQllcnIoIlNlbnNvciBub3Qgc3VwcG9ydGVkIGZvciBzZXRfYmFja2xpZ2h0Iik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW92LT5iYWNrbGlnaHQgPSBlbmFibGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2Vuc29yX3NldF9taXJyb3Ioc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBlbmFibGUpCi17Ci0JUERFQlVHKDQsICIgKCVzKSIsIGVuYWJsZSA/ICJ0dXJuIG9uIiA6ICJ0dXJuIG9mZiIpOwotCi0Jc3dpdGNoIChvdi0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5fT1Y2NjIwOgotCWNhc2UgU0VOX09WNjYzMDoKLQljYXNlIFNFTl9PVjc2MTA6Ci0JY2FzZSBTRU5fT1Y3NjIwOgotCWNhc2UgU0VOX09WNzZCRToKLQljYXNlIFNFTl9PVjg2MDA6Ci0JCWkyY193X21hc2sob3YsIDB4MTIsIGVuYWJsZT8weDQwOjB4MDAsIDB4NDApOwotCQlicmVhazsKLQljYXNlIFNFTl9LUzAxMjc6Ci0JY2FzZSBTRU5fS1MwMTI3QjoKLQljYXNlIFNFTl9TQUE3MTExQToKLQkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JZGVmYXVsdDoKLQkJZXJyKCJTZW5zb3Igbm90IHN1cHBvcnRlZCBmb3Igc2V0X21pcnJvciIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlvdi0+bWlycm9yID0gZW5hYmxlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIChyZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkgYXJlIGxvY2F0ZWQ7Ci0gKiBwbGFuYXIgb3Igbm90KSwgb3IgemVybyBmb3IgdW5zdXBwb3J0ZWQgZm9ybWF0LgotICovCi1zdGF0aWMgaW5saW5lIGludAotZ2V0X2RlcHRoKGludCBwYWxldHRlKQotewotCXN3aXRjaCAocGFsZXR0ZSkgewotCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOiAgICByZXR1cm4gODsKLQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwOiAgcmV0dXJuIDEyOwotCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOiByZXR1cm4gMTI7IC8qIFBsYW5hciAqLwotCWRlZmF1bHQ6CQkgICAgcmV0dXJuIDA7ICAvKiBJbnZhbGlkIGZvcm1hdCAqLwotCX0KLX0KLQotLyogQnl0ZXMgcGVyIGZyYW1lLiBVc2VkIGJ5IHJlYWQoKS4gUmV0dXJuIG9mIDAgaW5kaWNhdGVzIGVycm9yICovCi1zdGF0aWMgaW5saW5lIGxvbmcgaW50Ci1nZXRfZnJhbWVfbGVuZ3RoKHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUpCi17Ci0JaWYgKCFmcmFtZSkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gKChmcmFtZS0+d2lkdGggKiBmcmFtZS0+aGVpZ2h0Ci0JCQkgKiBnZXRfZGVwdGgoZnJhbWUtPmZvcm1hdCkpID4+IDMpOwotfQotCi1zdGF0aWMgaW50Ci1tb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLQkJCSBpbnQgbW9kZSwgaW50IHN1Yl9mbGFnLCBpbnQgcXZnYSkKLXsKLQlpbnQgY2xvY2s7Ci0KLQkvKioqKioqKiogTW9kZSAoVkdBL1FWR0EpIGFuZCBzZW5zb3Igc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYxMDoKLQkJaTJjX3cob3YsIDB4MTQsIHF2Z2E/MHgyNDoweDA0KTsKLS8vIEZJWE1FOiBEb2VzIHRoaXMgaW1wcm92ZSB0aGUgaW1hZ2UgcXVhbGl0eSBvciBmcmFtZSByYXRlPwotI2lmIDAKLQkJaTJjX3dfbWFzayhvdiwgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOwotCQlpMmNfdyhvdiwgMHgyNCwgMHgxMCk7Ci0JCWkyY193KG92LCAweDI1LCBxdmdhPzB4NDA6MHg4YSk7Ci0JCWkyY193KG92LCAweDJmLCBxdmdhPzB4MzA6MHhiMCk7Ci0JCWkyY193KG92LCAweDM1LCBxdmdhPzB4MWM6MHg5Yyk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y3NjIwOgotLy8JCWkyY193KG92LCAweDJiLCAweDAwKTsKLQkJaTJjX3cob3YsIDB4MTQsIHF2Z2E/MHhhNDoweDg0KTsKLQkJaTJjX3dfbWFzayhvdiwgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOwotCQlpMmNfdyhvdiwgMHgyNCwgcXZnYT8weDIwOjB4M2EpOwotCQlpMmNfdyhvdiwgMHgyNSwgcXZnYT8weDMwOjB4NjApOwotCQlpMmNfd19tYXNrKG92LCAweDJkLCBxdmdhPzB4NDA6MHgwMCwgMHg0MCk7Ci0JCWkyY193X21hc2sob3YsIDB4NjcsIHF2Z2E/MHhmMDoweDkwLCAweGYwKTsKLQkJaTJjX3dfbWFzayhvdiwgMHg3NCwgcXZnYT8weDIwOjB4MDAsIDB4MjApOwotCQlicmVhazsKLQljYXNlIFNFTl9PVjc2QkU6Ci0vLwkJaTJjX3cob3YsIDB4MmIsIDB4MDApOwotCQlpMmNfdyhvdiwgMHgxNCwgcXZnYT8weGE0OjB4ODQpOwotLy8gRklYTUU6IEVuYWJsZSB0aGlzIG9uY2UgNzYyMEFFIHVzZXMgNzYyMCBpbml0aWFsIHNldHRpbmdzCi0jaWYgMAotCQlpMmNfd19tYXNrKG92LCAweDI4LCBxdmdhPzB4MDA6MHgyMCwgMHgyMCk7Ci0JCWkyY193KG92LCAweDI0LCBxdmdhPzB4MjA6MHgzYSk7Ci0JCWkyY193KG92LCAweDI1LCBxdmdhPzB4MzA6MHg2MCk7Ci0JCWkyY193X21hc2sob3YsIDB4MmQsIHF2Z2E/MHg0MDoweDAwLCAweDQwKTsKLQkJaTJjX3dfbWFzayhvdiwgMHg2NywgcXZnYT8weGIwOjB4OTAsIDB4ZjApOwotCQlpMmNfd19tYXNrKG92LCAweDc0LCBxdmdhPzB4MjA6MHgwMCwgMHgyMCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y2NjIwOgotCQlpMmNfdyhvdiwgMHgxNCwgcXZnYT8weDI0OjB4MDQpOwotCQlicmVhazsKLQljYXNlIFNFTl9PVjY2MzA6Ci0JCWkyY193KG92LCAweDE0LCBxdmdhPzB4YTA6MHg4MCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycigiSW52YWxpZCBzZW5zb3IiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCWlmIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSkgewotCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjEwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNzZCRSkgewotCQkJLyogdGhlc2UgYXJlbid0IHZhbGlkIG9uIHRoZSBPVjY2MjAvT1Y3NjIwLzY2MzA/ICovCi0JCQlpMmNfd19tYXNrKG92LCAweDBlLCAweDQwLCAweDQwKTsKLQkJfQotCi0JCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjY2MzAgJiYgb3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgKLQkJICAgICYmIG92NTE4X2NvbG9yKSB7Ci0JCQlpMmNfd19tYXNrKG92LCAweDEyLCAweDAwLCAweDEwKTsKLQkJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MDAsIDB4MjApOwotCQl9IGVsc2UgewotCQkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgyMCwgMHgyMCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjEwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNzZCRSkgewotCQkJLyogbm90IHZhbGlkIG9uIHRoZSBPVjY2MjAvT1Y3NjIwLzY2MzA/ICovCi0JCQlpMmNfd19tYXNrKG92LCAweDBlLCAweDAwLCAweDQwKTsKLQkJfQotCi0JCS8qIFRoZSBPVjUxOCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudC4gQWx0aG91Z2ggYm90aCB0aGUgT1Y1MTgKLQkJICogYW5kIHRoZSBPVjY2MzAgc3VwcG9ydCBhIDE2LWJpdCB2aWRlbyBidXMsIG9ubHkgdGhlIDggYml0IFkKLQkJICogYnVzIGlzIGFjdHVhbGx5IHVzZWQuIFRoZSBVViBidXMgaXMgdGllZCB0byBncm91bmQuCi0JCSAqIFRoZXJlZm9yZSwgdGhlIE9WNjYzMCBuZWVkcyB0byBiZSBpbiA4LWJpdCBtdWx0aXBsZXhlZAotCQkgKiBvdXRwdXQgbW9kZSAqLwotCi0JCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjY2MzAgJiYgb3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgKLQkJICAgICYmIG92NTE4X2NvbG9yKSB7Ci0JCQlpMmNfd19tYXNrKG92LCAweDEyLCAweDEwLCAweDEwKTsKLQkJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MjAsIDB4MjApOwotCQl9IGVsc2UgewotCQkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgwMCwgMHgyMCk7Ci0JCX0KLQl9Ci0KLQkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCi0KLQkvKiBUaGUgT1Y2NjIwIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuIFRoaXMgcHJldmVudHMgdGhlCi0JICogc2V2ZXJlIGJhbmRpbmcgdGhhdCBub3JtYWxseSBvY2N1cnMgKi8KLQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y2NjIwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNjYzMCkKLQl7Ci0JCS8qIENsb2NrIGRvd24gKi8KLQotCQlpMmNfdyhvdiwgMHgyYSwgMHgwNCk7Ci0KLQkJaWYgKG92LT5jb21wcmVzcykgewotLy8JCQljbG9jayA9IDA7ICAgIC8qIFRoaXMgZW5zdXJlcyB0aGUgaGlnaGVzdCBmcmFtZSByYXRlICovCi0JCQljbG9jayA9IDM7Ci0JCX0gZWxzZSBpZiAoY2xvY2tkaXYgPT0gLTEpIHsgICAvKiBJZiB1c2VyIGRpZG4ndCBvdmVycmlkZSBpdCAqLwotCQkJY2xvY2sgPSAzOyAgICAvKiBHaXZlcyBiZXR0ZXIgZXhwb3N1cmUgdGltZSAqLwotCQl9IGVsc2UgewotCQkJY2xvY2sgPSBjbG9ja2RpdjsKLQkJfQotCi0JCVBERUJVRyg0LCAiU2V0dGluZyBjbG9jayBkaXZpc29yIHRvICVkIiwgY2xvY2spOwotCi0JCWkyY193KG92LCAweDExLCBjbG9jayk7Ci0KLQkJaTJjX3cob3YsIDB4MmEsIDB4ODQpOwotCQkvKiBUaGlzIG5leHQgc2V0dGluZyBpcyBjcml0aWNhbC4gSXQgc2VlbXMgdG8gaW1wcm92ZQotCQkgKiB0aGUgZ2FpbiBvciB0aGUgY29udHJhc3QuIFRoZSAicmVzZXJ2ZWQiIGJpdHMgc2VlbQotCQkgKiB0byBoYXZlIHNvbWUgZWZmZWN0IGluIHRoaXMgY2FzZS4gKi8KLQkJaTJjX3cob3YsIDB4MmQsIDB4ODUpOwotCX0KLQllbHNlCi0JewotCQlpZiAob3YtPmNvbXByZXNzKSB7Ci0JCQljbG9jayA9IDE7ICAgIC8qIFRoaXMgZW5zdXJlcyB0aGUgaGlnaGVzdCBmcmFtZSByYXRlICovCi0JCX0gZWxzZSBpZiAoY2xvY2tkaXYgPT0gLTEpIHsgICAvKiBJZiB1c2VyIGRpZG4ndCBvdmVycmlkZSBpdCAqLwotCQkJLyogQ2FsY3VsYXRlIGFuZCBzZXQgdGhlIGNsb2NrIGRpdmlzb3IgKi8KLQkJCWNsb2NrID0gKChzdWJfZmxhZyA/IG92LT5zdWJ3ICogb3YtPnN1YmgKLQkJCQkgIDogd2lkdGggKiBoZWlnaHQpCi0JCQkJICogKG1vZGUgPT0gVklERU9fUEFMRVRURV9HUkVZID8gMiA6IDMpIC8gMikKLQkJCQkgLyA2NjAwMDsKLQkJfSBlbHNlIHsKLQkJCWNsb2NrID0gY2xvY2tkaXY7Ci0JCX0KLQotCQlQREVCVUcoNCwgIlNldHRpbmcgY2xvY2sgZGl2aXNvciB0byAlZCIsIGNsb2NrKTsKLQotCQlpMmNfdyhvdiwgMHgxMSwgY2xvY2spOwotCX0KLQotCS8qKioqKioqKiBTcGVjaWFsIEZlYXR1cmVzICoqKioqKioqLwotCi0JaWYgKGZyYW1lZHJvcCA+PSAwKQotCQlpMmNfdyhvdiwgMHgxNiwgZnJhbWVkcm9wKTsKLQotCS8qIFRlc3QgUGF0dGVybiAqLwotCWkyY193X21hc2sob3YsIDB4MTIsICh0ZXN0cGF0PzB4MDI6MHgwMCksIDB4MDIpOwotCi0JLyogRW5hYmxlIGF1dG8gd2hpdGUgYmFsYW5jZSAqLwotCWkyY193X21hc2sob3YsIDB4MTIsIDB4MDQsIDB4MDQpOwotCi0JLy8gVGhpcyB3aWxsIGdvIGF3YXkgYXMgc29vbiBhcyBvdjUxeF9tb2RlX2luaXRfc2Vuc29yX3JlZ3MoKQotCS8vIGlzIGZ1bGx5IHRlc3RlZC4KLQkvKiA3NjIwLzY2MjAvNjYzMD8gZG9uJ3QgaGF2ZSByZWdpc3RlciAweDM1LCBzbyBwbGF5IGl0IHNhZmUgKi8KLQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjEwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNzZCRSkgewotCQlpZiAod2lkdGggPT0gNjQwICYmIGhlaWdodCA9PSA0ODApCi0JCQlpMmNfdyhvdiwgMHgzNSwgMHg5ZSk7Ci0JCWVsc2UKLQkJCWkyY193KG92LCAweDM1LCAweDFlKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2V0X292X3NlbnNvcl93aW5kb3coc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1vZGUsCi0JCSAgICAgaW50IHN1Yl9mbGFnKQotewotCWludCByZXQ7Ci0JaW50IGh3c2Jhc2UsIGh3ZWJhc2UsIHZ3c2Jhc2UsIHZ3ZWJhc2UsIGh3c2l6ZSwgdndzaXplOwotCWludCBob2Zmc2V0LCB2b2Zmc2V0LCBod3NjYWxlID0gMCwgdndzY2FsZSA9IDA7Ci0KLQkvKiBUaGUgZGlmZmVyZW50IHNlbnNvciBJQ3MgaGFuZGxlIHNldHRpbmcgdXAgb2Ygd2luZG93IGRpZmZlcmVudGx5LgotCSAqIElGIFlPVSBTRVQgSVQgV1JPTkcsIFlPVSBXSUxMIEdFVCBBTEwgWkVSTyBJU09DIERBVEEgRlJPTSBPVjUxeCEhISAqLwotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX09WNzYxMDoKLQljYXNlIFNFTl9PVjc2QkU6Ci0JCWh3c2Jhc2UgPSAweDM4OwotCQlod2ViYXNlID0gMHgzYTsKLQkJdndzYmFzZSA9IHZ3ZWJhc2UgPSAweDA1OwotCQlicmVhazsKLQljYXNlIFNFTl9PVjY2MjA6Ci0JY2FzZSBTRU5fT1Y2NjMwOgotCQlod3NiYXNlID0gMHgzODsKLQkJaHdlYmFzZSA9IDB4M2E7Ci0JCXZ3c2Jhc2UgPSAweDA1OwotCQl2d2ViYXNlID0gMHgwNjsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fT1Y3NjIwOgotCQlod3NiYXNlID0gMHgyZjsJCS8qIEZyb20gNzYyMC5TRVQgKHNwZWMgaXMgd3JvbmcpICovCi0JCWh3ZWJhc2UgPSAweDJmOwotCQl2d3NiYXNlID0gdndlYmFzZSA9IDB4MDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycigiSW52YWxpZCBzZW5zb3IiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNjYyMCB8fCBvdi0+c2Vuc29yID09IFNFTl9PVjY2MzApIHsKLQkJLyogTm90ZTogT1Y1MTgoKykgZG9lcyBkb3duc2FtcGxlIG9uIGl0cyBvd24pICovCi0JCWlmICgod2lkdGggPiAxNzYgJiYgaGVpZ2h0ID4gMTQ0KQotCQkgICAgfHwgb3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpIHsgIC8qIENJRiAqLwotCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAotCQkJCW1vZGUsIHN1Yl9mbGFnLCAwKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlod3NjYWxlID0gMTsKLQkJCXZ3c2NhbGUgPSAxOyAgLyogVGhlIGRhdGFzaGVldCBzYXlzIDA7IGl0J3Mgd3JvbmcgKi8KLQkJCWh3c2l6ZSA9IDM1MjsKLQkJCXZ3c2l6ZSA9IDI4ODsKLQkJfSBlbHNlIGlmICh3aWR0aCA+IDE3NiB8fCBoZWlnaHQgPiAxNDQpIHsKLQkJCWVycigiSWxsZWdhbCBkaW1lbnNpb25zIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsJCQkgICAgLyogUUNJRiAqLwotCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAotCQkJCW1vZGUsIHN1Yl9mbGFnLCAxKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlod3NpemUgPSAxNzY7Ci0JCQl2d3NpemUgPSAxNDQ7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAod2lkdGggPiAzMjAgJiYgaGVpZ2h0ID4gMjQwKSB7ICAvKiBWR0EgKi8KLQkJCXJldCA9IG1vZGVfaW5pdF9vdl9zZW5zb3JfcmVncyhvdiwgd2lkdGgsIGhlaWdodCwKLQkJCQltb2RlLCBzdWJfZmxhZywgMCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJaHdzY2FsZSA9IDI7Ci0JCQl2d3NjYWxlID0gMTsKLQkJCWh3c2l6ZSA9IDY0MDsKLQkJCXZ3c2l6ZSA9IDQ4MDsKLQkJfSBlbHNlIGlmICh3aWR0aCA+IDMyMCB8fCBoZWlnaHQgPiAyNDApIHsKLQkJCWVycigiSWxsZWdhbCBkaW1lbnNpb25zIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsJCQkgICAgLyogUVZHQSAqLwotCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAotCQkJCW1vZGUsIHN1Yl9mbGFnLCAxKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlod3NjYWxlID0gMTsKLQkJCWh3c2l6ZSA9IDMyMDsKLQkJCXZ3c2l6ZSA9IDI0MDsKLQkJfQotCX0KLQotCS8qIENlbnRlciB0aGUgd2luZG93ICovCi0JaG9mZnNldCA9ICgoaHdzaXplIC0gd2lkdGgpIC8gMikgPj4gaHdzY2FsZTsKLQl2b2Zmc2V0ID0gKCh2d3NpemUgLSBoZWlnaHQpIC8gMikgPj4gdndzY2FsZTsKLQotCS8qIEZJWE1FISAtIFRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBzdXBwb3J0IDE2MHgxMjAgYW5kIDY2MjAhISEgKi8KLQlpZiAoc3ViX2ZsYWcpIHsKLQkJaTJjX3cob3YsIDB4MTcsIGh3c2Jhc2UrKG92LT5zdWJ4Pj5od3NjYWxlKSk7Ci0JCWkyY193KG92LCAweDE4LAlod2ViYXNlKygob3YtPnN1Yngrb3YtPnN1YncpPj5od3NjYWxlKSk7Ci0JCWkyY193KG92LCAweDE5LCB2d3NiYXNlKyhvdi0+c3VieT4+dndzY2FsZSkpOwotCQlpMmNfdyhvdiwgMHgxYSwgdndlYmFzZSsoKG92LT5zdWJ5K292LT5zdWJoKT4+dndzY2FsZSkpOwotCX0gZWxzZSB7Ci0JCWkyY193KG92LCAweDE3LCBod3NiYXNlICsgaG9mZnNldCk7Ci0JCWkyY193KG92LCAweDE4LCBod2ViYXNlICsgaG9mZnNldCArIChod3NpemU+Pmh3c2NhbGUpKTsKLQkJaTJjX3cob3YsIDB4MTksIHZ3c2Jhc2UgKyB2b2Zmc2V0KTsKLQkJaTJjX3cob3YsIDB4MWEsIHZ3ZWJhc2UgKyB2b2Zmc2V0ICsgKHZ3c2l6ZT4+dndzY2FsZSkpOwotCX0KLQotI2lmZGVmIE9WNTExX0RFQlVHCi0JaWYgKGR1bXBfc2Vuc29yKQotCQlkdW1wX2kyY19yZWdzKG92KTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCB1cCB0aGUgT1Y1MTEvT1Y1MTErIHdpdGggdGhlIGdpdmVuIGltYWdlIHBhcmFtZXRlcnMuCi0gKgotICogRG8gbm90IHB1dCBhbnkgc2Vuc29yLXNwZWNpZmljIGNvZGUgaW4gaGVyZSAoaW5jbHVkaW5nIEkyQyBJL08gZnVuY3Rpb25zKQotICovCi1zdGF0aWMgaW50Ci1vdjUxMV9tb2RlX2luaXRfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdiwKLQkJICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtb2RlLCBpbnQgc3ViX2ZsYWcpCi17Ci0JaW50IGhzZWdzLCB2c2VnczsKLQotCWlmIChzdWJfZmxhZykgewotCQl3aWR0aCA9IG92LT5zdWJ3OwotCQloZWlnaHQgPSBvdi0+c3ViaDsKLQl9Ci0KLQlQREVCVUcoMywgIndpZHRoOiVkLCBoZWlnaHQ6JWQsIG1vZGU6JWQsIHN1YjolZCIsCi0JICAgICAgIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKLQotCS8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBhIDcxMTFhLXNwZWNpZmljIGZ1bmN0aW9uIG9uY2UKLQkvLyBzdWJjYXB0dXJlIGlzIGRlYWx0IHdpdGggcHJvcGVybHkKLQlpZiAob3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEpIHsKLQkJaWYgKHdpZHRoID09IDMyMCAmJiBoZWlnaHQgPT0gMjQwKSB7Ci0JCQkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgKi8KLQkJfSBlbHNlIGlmICh3aWR0aCA9PSA2NDAgJiYgaGVpZ2h0ID09IDQ4MCkgewotCQkJLyogU2V0IHRoZSBPVjUxMSB1cCBhcyAzMjB4NDgwLCBidXQga2VlcCB0aGUKLQkJCSAqIFY0TCByZXNvbHV0aW9uIGFzIDY0MHg0ODAgKi8KLQkJCXdpZHRoID0gMzIwOwotCQl9IGVsc2UgewotCQkJZXJyKCJTQUE3MTExQSBvbmx5IGFsbG93cyAzMjB4MjQwIG9yIDY0MHg0ODAiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JLyogTWFrZSBzdXJlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGEgbXVsdGlwbGUgb2YgOCAqLwotCWlmICh3aWR0aCAlIDggfHwgaGVpZ2h0ICUgOCkgewotCQllcnIoIkludmFsaWQgc2l6ZSAoJWQsICVkKSAobW9kZSA9ICVkKSIsIHdpZHRoLCBoZWlnaHQsIG1vZGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAod2lkdGggPCBvdi0+bWlud2lkdGggfHwgaGVpZ2h0IDwgb3YtPm1pbmhlaWdodCkgewotCQllcnIoIlJlcXVlc3RlZCBkaW1lbnNpb25zIGFyZSB0b28gc21hbGwiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkpIHsKLQkJcmVnX3cob3YsIFI1MTFfQ0FNX1VWX0VOLCAweDAwKTsKLQkJcmVnX3cob3YsIFI1MTFfU05BUF9VVl9FTiwgMHgwMCk7Ci0JCXJlZ193KG92LCBSNTExX1NOQVBfT1BUUywgMHgwMSk7Ci0JfSBlbHNlIHsKLQkJcmVnX3cob3YsIFI1MTFfQ0FNX1VWX0VOLCAweDAxKTsKLQkJcmVnX3cob3YsIFI1MTFfU05BUF9VVl9FTiwgMHgwMSk7Ci0JCXJlZ193KG92LCBSNTExX1NOQVBfT1BUUywgMHgwMyk7Ci0JfQotCi0JLyogSGVyZSBJJ20gYXNzdW1pbmcgdGhhdCBzbmFwc2hvdCBzaXplID09IGltYWdlIHNpemUuCi0JICogSSBob3BlIHRoYXQncyBhbHdheXMgdHJ1ZS4gLS1jbGF1ZGlvCi0JICovCi0JaHNlZ3MgPSAod2lkdGggPj4gMykgLSAxOwotCXZzZWdzID0gKGhlaWdodCA+PiAzKSAtIDE7Ci0KLQlyZWdfdyhvdiwgUjUxMV9DQU1fUFhDTlQsIGhzZWdzKTsKLQlyZWdfdyhvdiwgUjUxMV9DQU1fTE5DTlQsIHZzZWdzKTsKLQlyZWdfdyhvdiwgUjUxMV9DQU1fUFhESVYsIDB4MDApOwotCXJlZ193KG92LCBSNTExX0NBTV9MTkRJViwgMHgwMCk7Ci0KLQkvKiBZVVY0MjAsIGxvdyBwYXNzIGZpbHRlciBvbiAqLwotCXJlZ193KG92LCBSNTExX0NBTV9PUFRTLCAweDAzKTsKLQotCS8qIFNuYXBzaG90IGFkZGl0aW9ucyAqLwotCXJlZ193KG92LCBSNTExX1NOQVBfUFhDTlQsIGhzZWdzKTsKLQlyZWdfdyhvdiwgUjUxMV9TTkFQX0xOQ05ULCB2c2Vncyk7Ci0JcmVnX3cob3YsIFI1MTFfU05BUF9QWERJViwgMHgwMCk7Ci0JcmVnX3cob3YsIFI1MTFfU05BUF9MTkRJViwgMHgwMCk7Ci0KLQlpZiAob3YtPmNvbXByZXNzKSB7Ci0JCS8qIEVuYWJsZSBZIGFuZCBVViBxdWFudGl6YXRpb24gYW5kIGNvbXByZXNzaW9uICovCi0JCXJlZ193KG92LCBSNTExX0NPTVBfRU4sIDB4MDcpOwotCQlyZWdfdyhvdiwgUjUxMV9DT01QX0xVVF9FTiwgMHgwMyk7Ci0JCW92NTF4X3Jlc2V0KG92LCBPVjUxMV9SRVNFVF9PTU5JQ0UpOwotCX0KLQotCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFNldHMgdXAgdGhlIE9WNTE4L09WNTE4KyB3aXRoIHRoZSBnaXZlbiBpbWFnZSBwYXJhbWV0ZXJzCi0gKgotICogT1Y1MTggbmVlZHMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaCwgdW50aWwgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdAotICogdGhlIGluZGl2aWR1YWwgcmVnaXN0ZXJzIGRvLiBBbHNvLCBvbmx5IDE1IEZQUyBpcyBzdXBwb3J0ZWQgbm93LgotICoKLSAqIERvIG5vdCBwdXQgYW55IHNlbnNvci1zcGVjaWZpYyBjb2RlIGluIGhlcmUgKGluY2x1ZGluZyBJMkMgSS9PIGZ1bmN0aW9ucykKLSAqLwotc3RhdGljIGludAotb3Y1MThfbW9kZV9pbml0X3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsCi0JCSAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbW9kZSwgaW50IHN1Yl9mbGFnKQotewotCWludCBoc2VncywgdnNlZ3MsIGhpX3JlczsKLQotCWlmIChzdWJfZmxhZykgewotCQl3aWR0aCA9IG92LT5zdWJ3OwotCQloZWlnaHQgPSBvdi0+c3ViaDsKLQl9Ci0KLQlQREVCVUcoMywgIndpZHRoOiVkLCBoZWlnaHQ6JWQsIG1vZGU6JWQsIHN1YjolZCIsCi0JICAgICAgIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKLQotCWlmICh3aWR0aCAlIDE2IHx8IGhlaWdodCAlIDgpIHsKLQkJZXJyKCJJbnZhbGlkIHNpemUgKCVkLCAlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHdpZHRoIDwgb3YtPm1pbndpZHRoIHx8IGhlaWdodCA8IG92LT5taW5oZWlnaHQpIHsKLQkJZXJyKCJSZXF1ZXN0ZWQgZGltZW5zaW9ucyBhcmUgdG9vIHNtYWxsIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh3aWR0aCA+PSAzMjAgJiYgaGVpZ2h0ID49IDI0MCkgewotCQloaV9yZXMgPSAxOwotCX0gZWxzZSBpZiAod2lkdGggPj0gMzIwIHx8IGhlaWdodCA+PSAyNDApIHsKLQkJZXJyKCJJbnZhbGlkIHdpZHRoL2hlaWdodCBjb21iaW5hdGlvbiAoJWQsICVkKSIsIHdpZHRoLCBoZWlnaHQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQloaV9yZXMgPSAwOwotCX0KLQotCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JLyoqKioqKioqIFNldCB0aGUgbW9kZSAqKioqKioqKi8KLQotCXJlZ193KG92LCAweDJiLCAwKTsKLQlyZWdfdyhvdiwgMHgyYywgMCk7Ci0JcmVnX3cob3YsIDB4MmQsIDApOwotCXJlZ193KG92LCAweDJlLCAwKTsKLQlyZWdfdyhvdiwgMHgzYiwgMCk7Ci0JcmVnX3cob3YsIDB4M2MsIDApOwotCXJlZ193KG92LCAweDNkLCAwKTsKLQlyZWdfdyhvdiwgMHgzZSwgMCk7Ci0KLQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTggJiYgb3Y1MThfY29sb3IpIHsKLQkJLyogT1Y1MTggbmVlZHMgVSBhbmQgViBzd2FwcGVkICovCi0JCWkyY193X21hc2sob3YsIDB4MTUsIDB4MDAsIDB4MDEpOwotCi0JCWlmIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSkgewotCQkJLyogU2V0IDE2LWJpdCBpbnB1dCBmb3JtYXQgKFVWIGRhdGEgYXJlIGlnbm9yZWQpICovCi0JCQlyZWdfd19tYXNrKG92LCAweDIwLCAweDAwLCAweDA4KTsKLQotCQkJLyogU2V0IDgtYml0ICg0OjA6MCkgb3V0cHV0IGZvcm1hdCAqLwotCQkJcmVnX3dfbWFzayhvdiwgMHgyOCwgMHgwMCwgMHhmMCk7Ci0JCQlyZWdfd19tYXNrKG92LCAweDM4LCAweDAwLCAweGYwKTsKLQkJfSBlbHNlIHsKLQkJCS8qIFNldCA4LWJpdCAoWVZZVSkgaW5wdXQgZm9ybWF0ICovCi0JCQlyZWdfd19tYXNrKG92LCAweDIwLCAweDA4LCAweDA4KTsKLQotCQkJLyogU2V0IDEyLWJpdCAoNDoyOjApIG91dHB1dCBmb3JtYXQgKi8KLQkJCXJlZ193X21hc2sob3YsIDB4MjgsIDB4ODAsIDB4ZjApOwotCQkJcmVnX3dfbWFzayhvdiwgMHgzOCwgMHg4MCwgMHhmMCk7Ci0JCX0KLQl9IGVsc2UgewotCQlyZWdfdyhvdiwgMHgyOCwgKG1vZGUgPT0gVklERU9fUEFMRVRURV9HUkVZKSA/IDB4MDA6MHg4MCk7Ci0JCXJlZ193KG92LCAweDM4LCAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkpID8gMHgwMDoweDgwKTsKLQl9Ci0KLQloc2VncyA9IHdpZHRoIC8gMTY7Ci0JdnNlZ3MgPSBoZWlnaHQgLyA0OwotCi0JcmVnX3cob3YsIDB4MjksIGhzZWdzKTsKLQlyZWdfdyhvdiwgMHgyYSwgdnNlZ3MpOwotCi0JcmVnX3cob3YsIDB4MzksIGhzZWdzKTsKLQlyZWdfdyhvdiwgMHgzYSwgdnNlZ3MpOwotCi0JLyogV2luZG93cyBkcml2ZXIgZG9lcyB0aGlzIGhlcmU7IHdobyBrbm93cyB3aHkgKi8KLQlyZWdfdyhvdiwgMHgyZiwgMHg4MCk7Ci0KLQkvKioqKioqKiogU2V0IHRoZSBmcmFtZXJhdGUgKHRvIDE1IEZQUykgKioqKioqKiovCi0KLQkvKiBNb2RlIGluZGVwZW5kZW50LCBidXQgZnJhbWVyYXRlIGRlcGVuZGVudCwgcmVncyAqLwotCXJlZ193KG92LCAweDUxLCAweDAyKTsJLyogQ2xvY2sgZGl2aWRlcjsgbG93ZXI9PWZhc3RlciAqLwotCXJlZ193KG92LCAweDIyLCAweDE4KTsKLQlyZWdfdyhvdiwgMHgyMywgMHhmZik7Ci0KLQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MThQTFVTKQotCQlyZWdfdyhvdiwgMHgyMSwgMHgxOSk7Ci0JZWxzZQotCQlyZWdfdyhvdiwgMHg3MSwgMHgxOSk7CS8qIENvbXByZXNzaW9uLXJlbGF0ZWQ/ICovCi0KLQkvLyBGSVhNRTogU2Vuc29yLXNwZWNpZmljCi0JLyogQml0IDUgaXMgd2hhdCBtYXR0ZXJzIGhlcmUuIE9mIGNvdXJzZSwgaXQgaXMgInJlc2VydmVkIiAqLwotCWkyY193KG92LCAweDU0LCAweDIzKTsKLQotCXJlZ193KG92LCAweDJmLCAweDgwKTsKLQotCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxOFBMVVMpIHsKLQkJcmVnX3cob3YsIDB4MjQsIDB4OTQpOwotCQlyZWdfdyhvdiwgMHgyNSwgMHg5MCk7Ci0JCW92NTE4X3JlZ193MzIob3YsIDB4YzQsICAgIDQwMCwgMik7CS8qIDE5MGggICAqLwotCQlvdjUxOF9yZWdfdzMyKG92LCAweGM2LCAgICA1NDAsIDIpOwkvKiAyMWNoICAgKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHhjNywgICAgNTQwLCAyKTsJLyogMjFjaCAgICovCi0JCW92NTE4X3JlZ193MzIob3YsIDB4YzgsICAgIDEwOCwgMik7CS8qIDZjaCAgICAqLwotCQlvdjUxOF9yZWdfdzMyKG92LCAweGNhLCAxMzEwOTgsIDMpOwkvKiAyMDAxYWggKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHhjYiwgICAgNTMyLCAyKTsJLyogMjE0aCAgICovCi0JCW92NTE4X3JlZ193MzIob3YsIDB4Y2MsICAgMjQwMCwgMik7CS8qIDk2MGggICAqLwotCQlvdjUxOF9yZWdfdzMyKG92LCAweGNkLCAgICAgMzIsIDIpOwkvKiAyMGggICAgKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHhjZSwgICAgNjA4LCAyKTsJLyogMjYwaCAgICovCi0JfSBlbHNlIHsKLQkJcmVnX3cob3YsIDB4MjQsIDB4OWYpOwotCQlyZWdfdyhvdiwgMHgyNSwgMHg5MCk7Ci0JCW92NTE4X3JlZ193MzIob3YsIDB4YzQsICAgIDQwMCwgMik7CS8qIDE5MGggICAqLwotCQlvdjUxOF9yZWdfdzMyKG92LCAweGM2LCAgICA1MDAsIDIpOwkvKiAxZjRoICAgKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHhjNywgICAgNTAwLCAyKTsJLyogMWY0aCAgICovCi0JCW92NTE4X3JlZ193MzIob3YsIDB4YzgsICAgIDE0MiwgMik7CS8qIDhlaCAgICAqLwotCQlvdjUxOF9yZWdfdzMyKG92LCAweGNhLCAxMzEwOTgsIDMpOwkvKiAyMDAxYWggKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHhjYiwgICAgNTMyLCAyKTsJLyogMjE0aCAgICovCi0JCW92NTE4X3JlZ193MzIob3YsIDB4Y2MsICAgMjAwMCwgMik7CS8qIDdkMGggICAqLwotCQlvdjUxOF9yZWdfdzMyKG92LCAweGNkLCAgICAgMzIsIDIpOwkvKiAyMGggICAgKi8KLQkJb3Y1MThfcmVnX3czMihvdiwgMHhjZSwgICAgNjA4LCAyKTsJLyogMjYwaCAgICovCi0JfQotCi0JcmVnX3cob3YsIDB4MmYsIDB4ODApOwotCi0JaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBSZXNldCBpdCBqdXN0IGZvciBnb29kIG1lYXN1cmUgKi8KLQlpZiAob3Y1MXhfcmVzZXQob3YsIE9WNTExX1JFU0VUX05PUkVHUykgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIE9WNTExLCBPVjUxOCwgYW5kIHNlbnNvciBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQKLW1vZGVfaW5pdF9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAotCSAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtb2RlLCBpbnQgc3ViX2ZsYWcpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghb3YgfHwgIW92LT5kZXYpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7Ci0JCXJjID0gb3Y1MThfbW9kZV9pbml0X3JlZ3Mob3YsIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKLQl9IGVsc2UgewotCQlyYyA9IG92NTExX21vZGVfaW5pdF9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LCBtb2RlLCBzdWJfZmxhZyk7Ci0JfQotCi0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0Jc3dpdGNoIChvdi0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5fT1Y3NjEwOgotCWNhc2UgU0VOX09WNzYyMDoKLQljYXNlIFNFTl9PVjc2QkU6Ci0JY2FzZSBTRU5fT1Y4NjAwOgotCWNhc2UgU0VOX09WNjYyMDoKLQljYXNlIFNFTl9PVjY2MzA6Ci0JCXJjID0gc2V0X292X3NlbnNvcl93aW5kb3cob3YsIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5fS1MwMTI3OgotCWNhc2UgU0VOX0tTMDEyN0I6Ci0JCWVycigiS1MwMTI3LXNlcmllcyBkZWNvZGVycyBub3Qgc3VwcG9ydGVkIHlldCIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgU0VOX1NBQTcxMTFBOgotLy8JCXJjID0gbW9kZV9pbml0X3NhYV9zZW5zb3JfcmVncyhvdiwgd2lkdGgsIGhlaWdodCwgbW9kZSwKLS8vCQkJCQkgICAgICAgc3ViX2ZsYWcpOwotCi0JCVBERUJVRygxLCAiU0FBIHN0YXR1cyA9IDB4JTAyWCIsIGkyY19yKG92LCAweDFmKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycigiVW5rbm93biBzZW5zb3IiKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCWlmIChGQVRBTF9FUlJPUihyYykpCi0JCXJldHVybiByYzsKLQotCS8qIFNlbnNvci1pbmRlcGVuZGVudCBzZXR0aW5ncyAqLwotCXJjID0gc2Vuc29yX3NldF9hdXRvX2JyaWdodG5lc3Mob3YsIG92LT5hdXRvX2JydCk7Ci0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBzZW5zb3Jfc2V0X2F1dG9fZXhwb3N1cmUob3YsIG92LT5hdXRvX2V4cCk7Ci0JaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBzZW5zb3Jfc2V0X2JhbmRpbmdfZmlsdGVyKG92LCBiYW5kaW5nZmlsdGVyKTsKLQlpZiAoRkFUQUxfRVJST1IocmMpKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAob3YtPmxpZ2h0ZnJlcSkgewotCQlyYyA9IHNlbnNvcl9zZXRfbGlnaHRfZnJlcShvdiwgbGlnaHRmcmVxKTsKLQkJaWYgKEZBVEFMX0VSUk9SKHJjKSkKLQkJCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IHNlbnNvcl9zZXRfYmFja2xpZ2h0KG92LCBvdi0+YmFja2xpZ2h0KTsKLQlpZiAoRkFUQUxfRVJST1IocmMpKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHNlbnNvcl9zZXRfbWlycm9yKG92LCBvdi0+bWlycm9yKTsKLQlpZiAoRkFUQUxfRVJST1IocmMpKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBzZXRzIHRoZSBkZWZhdWx0IGltYWdlIHBhcmFtZXRlcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBzIHRoYXQgdXNlCi0gKiByZWFkKCkgYW5kIGRvIG5vdCBzZXQgdGhlc2UuCi0gKi8KLXN0YXRpYyBpbnQKLW92NTF4X3NldF9kZWZhdWx0X3BhcmFtcyhzdHJ1Y3QgdXNiX292NTExICpvdikKLXsKLQlpbnQgaTsKLQotCS8qIFNldCBkZWZhdWx0IHNpemVzIGluIGNhc2UgSU9DVEwgKFZJRElPQ01DQVBUVVJFKSBpcyBub3QgdXNlZAotCSAqICh1c2luZyByZWFkKCkgaW5zdGVhZCkuICovCi0JZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7Ci0JCW92LT5mcmFtZVtpXS53aWR0aCA9IG92LT5tYXh3aWR0aDsKLQkJb3YtPmZyYW1lW2ldLmhlaWdodCA9IG92LT5tYXhoZWlnaHQ7Ci0JCW92LT5mcmFtZVtpXS5ieXRlc19yZWFkID0gMDsKLQkJaWYgKGZvcmNlX3BhbGV0dGUpCi0JCQlvdi0+ZnJhbWVbaV0uZm9ybWF0ID0gZm9yY2VfcGFsZXR0ZTsKLQkJZWxzZQotCQkJb3YtPmZyYW1lW2ldLmZvcm1hdCA9IFZJREVPX1BBTEVUVEVfWVVWNDIwOwotCi0JCW92LT5mcmFtZVtpXS5kZXB0aCA9IGdldF9kZXB0aChvdi0+ZnJhbWVbaV0uZm9ybWF0KTsKLQl9Ci0KLQlQREVCVUcoMywgIiVkeCVkLCAlcyIsIG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCwKLQkgICAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgb3YtPmZyYW1lWzBdLmZvcm1hdCkpOwotCi0JLyogSW5pdGlhbGl6ZSB0byBtYXggd2lkdGgvaGVpZ2h0LCBZVVY0MjAgb3IgUkdCMjQgKGlmIHN1cHBvcnRlZCkgKi8KLQlpZiAobW9kZV9pbml0X3JlZ3Mob3YsIG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCwKLQkJCSAgIG92LT5mcmFtZVswXS5mb3JtYXQsIDApIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBWaWRlbyBkZWNvZGVyIHN0dWZmCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNldCBhbmFsb2cgaW5wdXQgcG9ydCBvZiBkZWNvZGVyICovCi1zdGF0aWMgaW50Ci1kZWNvZGVyX3NldF9pbnB1dChzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGlucHV0KQotewotCVBERUJVRyg0LCAicG9ydCAlZCIsIGlucHV0KTsKLQotCXN3aXRjaCAob3YtPnNlbnNvcikgewotCWNhc2UgU0VOX1NBQTcxMTFBOgotCXsKLQkJLyogU2VsZWN0IG1vZGUgKi8KLQkJaTJjX3dfbWFzayhvdiwgMHgwMiwgaW5wdXQsIDB4MDcpOwotCQkvKiBCeXBhc3MgY2hyb21pbmFuY2UgdHJhcCBmb3IgbW9kZXMgNC4uNyAqLwotCQlpMmNfd19tYXNrKG92LCAweDA5LCAoaW5wdXQgPiAzKSA/IDB4ODA6MHgwMCwgMHg4MCk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogR2V0IEFTQ0lJIG5hbWUgb2YgdmlkZW8gaW5wdXQgKi8KLXN0YXRpYyBpbnQKLWRlY29kZXJfZ2V0X2lucHV0X25hbWUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBpbnB1dCwgY2hhciAqbmFtZSkKLXsKLQlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKLQljYXNlIFNFTl9TQUE3MTExQToKLQl7Ci0JCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPiA3KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgaWYgKGlucHV0IDwgNCkKLQkJCXNwcmludGYobmFtZSwgIkNWQlMtJWQiLCBpbnB1dCk7Ci0JCWVsc2UgLy8gaWYgKGlucHV0IDwgOCkKLQkJCXNwcmludGYobmFtZSwgIlMtVmlkZW8tJWQiLCBpbnB1dCAtIDQpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJc3ByaW50ZihuYW1lLCAiJXMiLCAiQ2FtZXJhIik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCBub3JtIChOVFNDLCBQQUwsIFNFQ0FNLCBBVVRPKSAqLwotc3RhdGljIGludAotZGVjb2Rlcl9zZXRfbm9ybShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IG5vcm0pCi17Ci0JUERFQlVHKDQsICIlZCIsIG5vcm0pOwotCi0Jc3dpdGNoIChvdi0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5fU0FBNzExMUE6Ci0JewotCQlpbnQgcmVnXzgsIHJlZ19lOwotCi0JCWlmIChub3JtID09IFZJREVPX01PREVfTlRTQykgewotCQkJcmVnXzggPSAweDQwOwkvKiA2MCBIeiAqLwotCQkJcmVnX2UgPSAweDAwOwkvKiBOVFNDIE0gLyBQQUwgQkdISSAqLwotCQl9IGVsc2UgaWYgKG5vcm0gPT0gVklERU9fTU9ERV9QQUwpIHsKLQkJCXJlZ184ID0gMHgwMDsJLyogNTAgSHogKi8KLQkJCXJlZ19lID0gMHgwMDsJLyogTlRTQyBNIC8gUEFMIEJHSEkgKi8KLQkJfSBlbHNlIGlmIChub3JtID09IFZJREVPX01PREVfQVVUTykgewotCQkJcmVnXzggPSAweDgwOwkvKiBBdXRvIGZpZWxkIGRldGVjdCAqLwotCQkJcmVnX2UgPSAweDAwOwkvKiBOVFNDIE0gLyBQQUwgQkdISSAqLwotCQl9IGVsc2UgaWYgKG5vcm0gPT0gVklERU9fTU9ERV9TRUNBTSkgewotCQkJcmVnXzggPSAweDAwOwkvKiA1MCBIeiAqLwotCQkJcmVnX2UgPSAweDUwOwkvKiBTRUNBTSAvIFBBTCA0LjQzICovCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWkyY193X21hc2sob3YsIDB4MDgsIHJlZ184LCAweGMwKTsKLQkJaTJjX3dfbWFzayhvdiwgMHgwZSwgcmVnX2UsIDB4NzApOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUmF3IGRhdGEgcGFyc2luZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb3BpZXMgYSA2NC1ieXRlIHNlZ21lbnQgYXQgcEluIHRvIGFuIDh4OCBibG9jayBhdCBwT3V0LiBUaGUgd2lkdGggb2YgdGhlCi0gKiBpbWFnZSBhdCBwT3V0IGlzIHNwZWNpZmllZCBieSB3LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1ha2VfOHg4KHVuc2lnbmVkIGNoYXIgKnBJbiwgdW5zaWduZWQgY2hhciAqcE91dCwgaW50IHcpCi17Ci0JdW5zaWduZWQgY2hhciAqcE91dDEgPSBwT3V0OwotCWludCB4LCB5OwotCi0JZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgewotCQlwT3V0MSA9IHBPdXQ7Ci0JCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKLQkJCSpwT3V0MSsrID0gKnBJbisrOwotCQl9Ci0JCXBPdXQgKz0gdzsKLQl9Ci19Ci0KLS8qCi0gKiBGb3IgUkFXIEJXIChZVVYgNDowOjApIGltYWdlcywgZGF0YSBzaG93IHVwIGluIDI1NiBieXRlIHNlZ21lbnRzLgotICogVGhlIHNlZ21lbnRzIHJlcHJlc2VudCA0IHNxdWFyZXMgb2YgOHg4IHBpeGVscyBhcyBmb2xsb3dzOgotICoKLSAqICAgICAgMCAgMSAuLi4gIDcgICAgNjQgIDY1IC4uLiAgNzEgICAuLi4gIDE5MiAxOTMgLi4uIDE5OQotICogICAgICA4ICA5IC4uLiAxNSAgICA3MiAgNzMgLi4uICA3OSAgICAgICAgMjAwIDIwMSAuLi4gMjA3Ci0gKiAgICAgICAgICAgLi4uICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgIC4uLgotICogICAgIDU2IDU3IC4uLiA2MyAgIDEyMCAxMjEgLi4uIDEyNyAgICAgICAgMjQ4IDI0OSAuLi4gMjU1Ci0gKgotICovCi1zdGF0aWMgdm9pZAoteXV2NDAwcmF3X3RvX3l1djQwMHAoc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSwKLQkJICAgICB1bnNpZ25lZCBjaGFyICpwSW4wLCB1bnNpZ25lZCBjaGFyICpwT3V0MCkKLXsKLQlpbnQgeCwgeTsKLQl1bnNpZ25lZCBjaGFyICpwSW4sICpwT3V0LCAqcE91dExpbmU7Ci0KLQkvKiBDb3B5IFkgKi8KLQlwSW4gPSBwSW4wOwotCXBPdXRMaW5lID0gcE91dDA7Ci0JZm9yICh5ID0gMDsgeSA8IGZyYW1lLT5yYXdoZWlnaHQgLSAxOyB5ICs9IDgpIHsKLQkJcE91dCA9IHBPdXRMaW5lOwotCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoIC0gMTsgeCArPSA4KSB7Ci0JCQltYWtlXzh4OChwSW4sIHBPdXQsIGZyYW1lLT5yYXd3aWR0aCk7Ci0JCQlwSW4gKz0gNjQ7Ci0JCQlwT3V0ICs9IDg7Ci0JCX0KLQkJcE91dExpbmUgKz0gOCAqIGZyYW1lLT5yYXd3aWR0aDsKLQl9Ci19Ci0KLS8qCi0gKiBGb3IgWVVWIDQ6MjowIGltYWdlcywgdGhlIGRhdGEgc2hvdyB1cCBpbiAzODQgYnl0ZSBzZWdtZW50cy4KLSAqIFRoZSBmaXJzdCA2NCBieXRlcyBvZiBlYWNoIHNlZ21lbnQgYXJlIFUsIHRoZSBuZXh0IDY0IGFyZSBWLiAgVGhlIFUgYW5kCi0gKiBWIGFyZSBhcnJhbmdlZCBhcyBmb2xsb3dzOgotICoKLSAqICAgICAgMCAgMSAuLi4gIDcKLSAqICAgICAgOCAgOSAuLi4gMTUKLSAqICAgICAgICAgICAuLi4KLSAqICAgICA1NiA1NyAuLi4gNjMKLSAqCi0gKiBVIGFuZCBWIGFyZSBzaGlwcGVkIGF0IGhhbGYgcmVzb2x1dGlvbiAoMSBVLFYgc2FtcGxlIC0+IG9uZSAyeDIgYmxvY2spLgotICoKLSAqIFRoZSBuZXh0IDI1NiBieXRlcyBhcmUgZnVsbCByZXNvbHV0aW9uIFkgZGF0YSBhbmQgcmVwcmVzZW50IDQgc3F1YXJlcwotICogb2YgOHg4IHBpeGVscyBhcyBmb2xsb3dzOgotICoKLSAqICAgICAgMCAgMSAuLi4gIDcgICAgNjQgIDY1IC4uLiAgNzEgICAuLi4gIDE5MiAxOTMgLi4uIDE5OQotICogICAgICA4ICA5IC4uLiAxNSAgICA3MiAgNzMgLi4uICA3OSAgICAgICAgMjAwIDIwMSAuLi4gMjA3Ci0gKiAgICAgICAgICAgLi4uICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgIC4uLgotICogICAgIDU2IDU3IC4uLiA2MyAgIDEyMCAxMjEgLi4uIDEyNyAgIC4uLiAgMjQ4IDI0OSAuLi4gMjU1Ci0gKgotICogTm90ZSB0aGF0IHRoZSBVIGFuZCBWIGRhdGEgaW4gb25lIHNlZ21lbnQgcmVwcmVzZW50IGEgMTYgeCAxNiBwaXhlbAotICogYXJlYSwgYnV0IHRoZSBZIGRhdGEgcmVwcmVzZW50IGEgMzIgeCA4IHBpeGVsIGFyZWEuIElmIHRoZSB3aWR0aCBpcyBub3QgYW4KLSAqIGV2ZW4gbXVsdGlwbGUgb2YgMzIsIHRoZSBleHRyYSA4eDggYmxvY2tzIHdpdGhpbiBhIDMyeDggYmxvY2sgYmVsb25nIHRvIHRoZQotICogbmV4dCBob3Jpem9udGFsIHN0cmlwZS4KLSAqCi0gKiBJZiBkdW1wcGl4IG1vZHVsZSBwYXJhbSBpcyBzZXQsIF9wYXJzZV9kYXRhIGp1c3QgZHVtcHMgdGhlIGluY29taW5nIHNlZ21lbnRzLAotICogdmVyYmF0aW0sIGluIG9yZGVyLCBpbnRvIHRoZSBmcmFtZS4gV2hlbiB1c2VkIHdpdGggdmlkY2F0IC1mIHBwbSAtcyA2NDB4NDgwCi0gKiB0aGlzIHB1dHMgdGhlIGRhdGEgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgY2FuIGJlIGFuYWx5emVkIHdpdGggdGhlCi0gKiBwYXJzZXBwbS5jIHV0aWxpdHkgSSB3cm90ZS4gIFRoYXQncyBhIG11Y2ggZmFzdGVyIHdheSBmb3IgZmlndXJpbmcgb3V0IGhvdwotICogdGhlc2UgZGF0YSBhcmUgc2NyYW1ibGVkLgotICovCi0KLS8qIENvbnZlcnRzIGZyb20gcmF3LCB1bmNvbXByZXNzZWQgc2VnbWVudHMgYXQgcEluMCB0byBhIFlVVjQyMFAgZnJhbWUgYXQgcE91dDAuCi0gKgotICogRklYTUU6IEN1cnJlbnRseSBvbmx5IGhhbmRsZXMgd2lkdGggYW5kIGhlaWdodCB0aGF0IGFyZSBtdWx0aXBsZXMgb2YgMTYKLSAqLwotc3RhdGljIHZvaWQKLXl1djQyMHJhd190b195dXY0MjBwKHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUsCi0JCSAgICAgdW5zaWduZWQgY2hhciAqcEluMCwgdW5zaWduZWQgY2hhciAqcE91dDApCi17Ci0JaW50IGssIHgsIHk7Ci0JdW5zaWduZWQgY2hhciAqcEluLCAqcE91dCwgKnBPdXRMaW5lOwotCWNvbnN0IHVuc2lnbmVkIGludCBhID0gZnJhbWUtPnJhd3dpZHRoICogZnJhbWUtPnJhd2hlaWdodDsKLQljb25zdCB1bnNpZ25lZCBpbnQgdyA9IGZyYW1lLT5yYXd3aWR0aCAvIDI7Ci0KLQkvKiBDb3B5IFUgYW5kIFYgKi8KLQlwSW4gPSBwSW4wOwotCXBPdXRMaW5lID0gcE91dDAgKyBhOwotCWZvciAoeSA9IDA7IHkgPCBmcmFtZS0+cmF3aGVpZ2h0IC0gMTsgeSArPSAxNikgewotCQlwT3V0ID0gcE91dExpbmU7Ci0JCWZvciAoeCA9IDA7IHggPCBmcmFtZS0+cmF3d2lkdGggLSAxOyB4ICs9IDE2KSB7Ci0JCQltYWtlXzh4OChwSW4sIHBPdXQsIHcpOwotCQkJbWFrZV84eDgocEluICsgNjQsIHBPdXQgKyBhLzQsIHcpOwotCQkJcEluICs9IDM4NDsKLQkJCXBPdXQgKz0gODsKLQkJfQotCQlwT3V0TGluZSArPSA4ICogdzsKLQl9Ci0KLQkvKiBDb3B5IFkgKi8KLQlwSW4gPSBwSW4wICsgMTI4OwotCXBPdXRMaW5lID0gcE91dDA7Ci0JayA9IDA7Ci0JZm9yICh5ID0gMDsgeSA8IGZyYW1lLT5yYXdoZWlnaHQgLSAxOyB5ICs9IDgpIHsKLQkJcE91dCA9IHBPdXRMaW5lOwotCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoIC0gMTsgeCArPSA4KSB7Ci0JCQltYWtlXzh4OChwSW4sIHBPdXQsIGZyYW1lLT5yYXd3aWR0aCk7Ci0JCQlwSW4gKz0gNjQ7Ci0JCQlwT3V0ICs9IDg7Ci0JCQlpZiAoKCsraykgPiAzKSB7Ci0JCQkJayA9IDA7Ci0JCQkJcEluICs9IDEyODsKLQkJCX0KLQkJfQotCQlwT3V0TGluZSArPSA4ICogZnJhbWUtPnJhd3dpZHRoOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZWNvbXByZXNzaW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLXJlcXVlc3RfZGVjb21wcmVzc29yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSB8fCBvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgewotCQllcnIoIk5vIGRlY29tcHJlc3NvciBhdmFpbGFibGUiKTsKLQl9IGVsc2UgewotCQllcnIoIlVua25vd24gYnJpZGdlIik7Ci0JfQotCi0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWNvbXByZXNzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lLAotCSAgIHVuc2lnbmVkIGNoYXIgKnBJbjAsIHVuc2lnbmVkIGNoYXIgKnBPdXQwKQotewotCWlmICghb3YtPmRlY29tcF9vcHMpCi0JCWlmIChyZXF1ZXN0X2RlY29tcHJlc3NvcihvdikpCi0JCQlyZXR1cm47Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGb3JtYXQgY29udmVyc2lvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdXNlcyBldmVuIGFuZCBvZGQgZmllbGRzIHRvZ2V0aGVyLCBhbmQgZG91YmxlcyB3aWR0aC4KLSAqIElOUFVUOiBhbiBvZGQgZmllbGQgZm9sbG93ZWQgYnkgYW4gZXZlbiBmaWVsZCBhdCBwSW4wLCBpbiBZVVYgcGxhbmFyIGZvcm1hdAotICogT1VUUFVUOiBhIG5vcm1hbCBZVVYgcGxhbmFyIGltYWdlLCB3aXRoIGNvcnJlY3QgYXNwZWN0IHJhdGlvCi0gKi8KLXN0YXRpYyB2b2lkCi1kZWludGVybGFjZShzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lLCBpbnQgcmF3Zm9ybWF0LAotCSAgICB1bnNpZ25lZCBjaGFyICpwSW4wLCB1bnNpZ25lZCBjaGFyICpwT3V0MCkKLXsKLQljb25zdCBpbnQgZmllbGRoZWlnaHQgPSBmcmFtZS0+cmF3aGVpZ2h0IC8gMjsKLQljb25zdCBpbnQgZmllbGRwaXggPSBmaWVsZGhlaWdodCAqIGZyYW1lLT5yYXd3aWR0aDsKLQljb25zdCBpbnQgdyA9IGZyYW1lLT53aWR0aDsKLQlpbnQgeCwgeTsKLQl1bnNpZ25lZCBjaGFyICpwSW5FdmVuLCAqcEluT2RkLCAqcE91dDsKLQotCVBERUJVRyg1LCAiZmllbGRoZWlnaHQ9JWQiLCBmaWVsZGhlaWdodCk7Ci0KLQlpZiAoZnJhbWUtPnJhd2hlaWdodCAhPSBmcmFtZS0+aGVpZ2h0KSB7Ci0JCWVycigiaW52YWxpZCBoZWlnaHQiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoZnJhbWUtPnJhd3dpZHRoICogMikgIT0gZnJhbWUtPndpZHRoKSB7Ci0JCWVycigiaW52YWxpZCB3aWR0aCIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogWSAqLwotCXBJbk9kZCA9IHBJbjA7Ci0JcEluRXZlbiA9IHBJbk9kZCArIGZpZWxkcGl4OwotCXBPdXQgPSBwT3V0MDsKLQlmb3IgKHkgPSAwOyB5IDwgZmllbGRoZWlnaHQ7IHkrKykgewotCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoOyB4KyspIHsKLQkJCSpwT3V0ID0gKnBJbkV2ZW47Ci0JCQkqKHBPdXQrMSkgPSAqcEluRXZlbisrOwotCQkJKihwT3V0K3cpID0gKnBJbk9kZDsKLQkJCSoocE91dCt3KzEpID0gKnBJbk9kZCsrOwotCQkJcE91dCArPSAyOwotCQl9Ci0JCXBPdXQgKz0gdzsKLQl9Ci0KLQlpZiAocmF3Zm9ybWF0ID09IFJBV0ZNVF9ZVVY0MjApIHsKLQkvKiBVICovCi0JCXBJbk9kZCA9IHBJbjAgKyBmaWVsZHBpeCAqIDI7Ci0JCXBJbkV2ZW4gPSBwSW5PZGQgKyBmaWVsZHBpeCAvIDQ7Ci0JCWZvciAoeSA9IDA7IHkgPCBmaWVsZGhlaWdodCAvIDI7IHkrKykgewotCQkJZm9yICh4ID0gMDsgeCA8IGZyYW1lLT5yYXd3aWR0aCAvIDI7IHgrKykgewotCQkJCSpwT3V0ID0gKnBJbkV2ZW47Ci0JCQkJKihwT3V0KzEpID0gKnBJbkV2ZW4rKzsKLQkJCQkqKHBPdXQrdy8yKSA9ICpwSW5PZGQ7Ci0JCQkJKihwT3V0K3cvMisxKSA9ICpwSW5PZGQrKzsKLQkJCQlwT3V0ICs9IDI7Ci0JCQl9Ci0JCQlwT3V0ICs9IHcvMjsKLQkJfQotCS8qIFYgKi8KLQkJcEluT2RkID0gcEluMCArIGZpZWxkcGl4ICogMiArIGZpZWxkcGl4IC8gMjsKLQkJcEluRXZlbiA9IHBJbk9kZCArIGZpZWxkcGl4IC8gNDsKLQkJZm9yICh5ID0gMDsgeSA8IGZpZWxkaGVpZ2h0IC8gMjsgeSsrKSB7Ci0JCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoIC8gMjsgeCsrKSB7Ci0JCQkJKnBPdXQgPSAqcEluRXZlbjsKLQkJCQkqKHBPdXQrMSkgPSAqcEluRXZlbisrOwotCQkJCSoocE91dCt3LzIpID0gKnBJbk9kZDsKLQkJCQkqKHBPdXQrdy8yKzEpID0gKnBJbk9kZCsrOwotCQkJCXBPdXQgKz0gMjsKLQkJCX0KLQkJCXBPdXQgKz0gdy8yOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotb3Y1MXhfcG9zdHByb2Nlc3NfZ3JleShzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSkKLXsKLQkJLyogRGVpbnRlcmxhY2UgZnJhbWUsIGlmIG5lY2Vzc2FyeSAqLwotCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEgJiYgZnJhbWUtPnJhd2hlaWdodCA+PSA0ODApIHsKLQkJCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKLQkJCQlkZWNvbXByZXNzKG92LCBmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCi0JCQkJCQkgZnJhbWUtPnRlbXBkYXRhKTsKLQkJCWVsc2UKLQkJCQl5dXY0MDByYXdfdG9feXV2NDAwcChmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCi0JCQkJCQkgICAgIGZyYW1lLT50ZW1wZGF0YSk7Ci0KLQkJCWRlaW50ZXJsYWNlKGZyYW1lLCBSQVdGTVRfWVVWNDAwLCBmcmFtZS0+dGVtcGRhdGEsCi0JCQkJICAgIGZyYW1lLT5kYXRhKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKLQkJCQlkZWNvbXByZXNzKG92LCBmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCi0JCQkJCQkgZnJhbWUtPmRhdGEpOwotCQkJZWxzZQotCQkJCXl1djQwMHJhd190b195dXY0MDBwKGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwKLQkJCQkJCSAgICAgZnJhbWUtPmRhdGEpOwotCQl9Ci19Ci0KLS8qIFByb2Nlc3MgcmF3IFlVVjQyMCBkYXRhIGludG8gc3RhbmRhcmQgWVVWNDIwUCAqLwotc3RhdGljIHZvaWQKLW92NTF4X3Bvc3Rwcm9jZXNzX3l1djQyMChzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSkKLXsKLQkvKiBEZWludGVybGFjZSBmcmFtZSwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKG92LT5zZW5zb3IgPT0gU0VOX1NBQTcxMTFBICYmIGZyYW1lLT5yYXdoZWlnaHQgPj0gNDgwKSB7Ci0JCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKLQkJCWRlY29tcHJlc3Mob3YsIGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwgZnJhbWUtPnRlbXBkYXRhKTsKLQkJZWxzZQotCQkJeXV2NDIwcmF3X3RvX3l1djQyMHAoZnJhbWUsIGZyYW1lLT5yYXdkYXRhLAotCQkJCQkgICAgIGZyYW1lLT50ZW1wZGF0YSk7Ci0KLQkJZGVpbnRlcmxhY2UoZnJhbWUsIFJBV0ZNVF9ZVVY0MjAsIGZyYW1lLT50ZW1wZGF0YSwKLQkJCSAgICBmcmFtZS0+ZGF0YSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZyYW1lLT5jb21wcmVzc2VkKQotCQkJZGVjb21wcmVzcyhvdiwgZnJhbWUsIGZyYW1lLT5yYXdkYXRhLCBmcmFtZS0+ZGF0YSk7Ci0JCWVsc2UKLQkJCXl1djQyMHJhd190b195dXY0MjBwKGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwKLQkJCQkJICAgICBmcmFtZS0+ZGF0YSk7Ci0JfQotfQotCi0vKiBQb3N0LXByb2Nlc3NlcyB0aGUgc3BlY2lmaWVkIGZyYW1lLiBUaGlzIGNvbnNpc3RzIG9mOgotICogCTEuIERlY29tcHJlc3MgZnJhbWUsIGlmIG5lY2Vzc2FyeQotICoJMi4gRGVpbnRlcmxhY2UgZnJhbWUgYW5kIHNjYWxlIHRvIHByb3BlciBzaXplLCBpZiBuZWNlc3NhcnkKLSAqIAkzLiBDb252ZXJ0IGZyb20gWVVWIHBsYW5hciB0byBkZXN0aW5hdGlvbiBmb3JtYXQsIGlmIG5lY2Vzc2FyeQotICogCTQuIEZpeCB0aGUgUkdCIG9mZnNldCwgaWYgbmVjZXNzYXJ5Ci0gKi8KLXN0YXRpYyB2b2lkCi1vdjUxeF9wb3N0cHJvY2VzcyhzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSkKLXsKLQlpZiAoZHVtcHBpeCkgewotCQltZW1zZXQoZnJhbWUtPmRhdGEsIDAsCi0JCQlNQVhfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCkpOwotCQlQREVCVUcoNCwgIkR1bXBpbmcgJWQgYnl0ZXMiLCBmcmFtZS0+Ynl0ZXNfcmVjdmQpOwotCQltZW1jcHkoZnJhbWUtPmRhdGEsIGZyYW1lLT5yYXdkYXRhLCBmcmFtZS0+Ynl0ZXNfcmVjdmQpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoZnJhbWUtPmZvcm1hdCkgewotCQljYXNlIFZJREVPX1BBTEVUVEVfR1JFWToKLQkJCW92NTF4X3Bvc3Rwcm9jZXNzX2dyZXkob3YsIGZyYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwOgotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKLQkJCW92NTF4X3Bvc3Rwcm9jZXNzX3l1djQyMChvdiwgZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIoIkNhbm5vdCBjb252ZXJ0IGRhdGEgdG8gJXMiLAotCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIGZyYW1lLT5mb3JtYXQpKTsKLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBPVjUxeCBkYXRhIHRyYW5zZmVyLCBJUlEgaGFuZGxlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW92NTExX21vdmVfZGF0YShzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciAqaW4sIGludCBuKQotewotCWludCBudW0sIG9mZnNldDsKLQlpbnQgcG51bSA9IGluW292LT5wYWNrZXRfc2l6ZSAtIDFdOwkJLyogR2V0IHBhY2tldCBudW1iZXIgKi8KLQlpbnQgbWF4X3JhdyA9IE1BWF9SQVdfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCk7Ci0Jc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSA9ICZvdi0+ZnJhbWVbb3YtPmN1cmZyYW1lXTsKLQlzdHJ1Y3QgdGltZXZhbCAqdHM7Ci0KLQkvKiBTT0YvRU9GIHBhY2tldHMgaGF2ZSAxc3QgdG8gOHRoIGJ5dGVzIHplcm9lZCBhbmQgdGhlIDl0aAotCSAqIGJ5dGUgbm9uLXplcm8uIFRoZSBFT0YgcGFja2V0IGhhcyBpbWFnZSB3aWR0aC9oZWlnaHQgaW4gdGhlCi0JICogMTB0aCBhbmQgMTF0aCBieXRlcy4gVGhlIDl0aCBieXRlIGlzIGdpdmVuIGFzIGZvbGxvd3M6Ci0JICoKLQkgKiBiaXQgNzogRU9GCi0JICogICAgIDY6IGNvbXByZXNzaW9uIGVuYWJsZWQKLQkgKiAgICAgNTogNDIyLzQyMC80MDAgbW9kZXMKLQkgKiAgICAgNDogNDIyLzQyMC80MDAgbW9kZXMKLQkgKiAgICAgMzogMQotCSAqICAgICAyOiBzbmFwc2hvdCBidXR0b24gb24KLQkgKiAgICAgMTogc25hcHNob3QgZnJhbWUKLQkgKiAgICAgMDogZXZlbi9vZGQgZmllbGQKLQkgKi8KLQotCWlmIChwcmludHBoKSB7Ci0JCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsCi0JCQkgInBoKCUzZCk6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLAotCQkJIHBudW0sIGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdLCBpbls0XSwgaW5bNV0sIGluWzZdLAotCQkJIGluWzddLCBpbls4XSwgaW5bOV0sIGluWzEwXSwgaW5bMTFdKTsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgU09GL0VPRiBwYWNrZXQgKi8KLQlpZiAoKGluWzBdIHwgaW5bMV0gfCBpblsyXSB8IGluWzNdIHwgaW5bNF0gfCBpbls1XSB8IGluWzZdIHwgaW5bN10pIHx8Ci0JICAgICh+aW5bOF0gJiAweDA4KSkKLQkJZ290byBjaGVja19taWRkbGU7Ci0KLQkvKiBGcmFtZSBlbmQgKi8KLQlpZiAoaW5bOF0gJiAweDgwKSB7Ci0JCXRzID0gKHN0cnVjdCB0aW1ldmFsICopKGZyYW1lLT5kYXRhCi0JCSAgICAgICsgTUFYX0ZSQU1FX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KSk7Ci0JCWRvX2dldHRpbWVvZmRheSh0cyk7Ci0KLQkJLyogR2V0IHRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBmcm9tIHRoZSBFT0YgaGVhZGVyICovCi0JCWZyYW1lLT5yYXd3aWR0aCA9ICgoaW50KShpbls5XSkgKyAxKSAqIDg7Ci0JCWZyYW1lLT5yYXdoZWlnaHQgPSAoKGludCkoaW5bMTBdKSArIDEpICogODsKLQotCQlQREVCVUcoNCwgIkZyYW1lIGVuZCwgZnJhbWU9JWQsIHBudW09JWQsIHc9JWQsIGg9JWQsIHJlY3ZkPSVkIiwKLQkJCW92LT5jdXJmcmFtZSwgcG51bSwgZnJhbWUtPnJhd3dpZHRoLCBmcmFtZS0+cmF3aGVpZ2h0LAotCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKLQotCQkvKiBWYWxpZGF0ZSB0aGUgaGVhZGVyIGRhdGEgKi8KLQkJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPnJhd3dpZHRoLCBvdi0+bWlud2lkdGgsIG92LT5tYXh3aWR0aCk7Ci0JCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lLT5yYXdoZWlnaHQsIG92LT5taW5oZWlnaHQsCi0JCQkJICBvdi0+bWF4aGVpZ2h0KTsKLQotCQkvKiBEb24ndCBhbGxvdyBieXRlIGNvdW50IHRvIGV4Y2VlZCBidWZmZXIgc2l6ZSAqLwotCQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+Ynl0ZXNfcmVjdmQsIDgsIG1heF9yYXcpOwotCi0JCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0JCQlpbnQgbmV4dGY7Ci0KLQkJCWZyYW1lLT5ncmFic3RhdGUgPSBGUkFNRV9ET05FOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmcmFtZS0+d3EpOwotCi0JCQkvKiBJZiBuZXh0IGZyYW1lIGlzIHJlYWR5IG9yIGdyYWJiaW5nLAotCQkJICogcG9pbnQgdG8gaXQgKi8KLQkJCW5leHRmID0gKG92LT5jdXJmcmFtZSArIDEpICUgT1Y1MTFfTlVNRlJBTUVTOwotCQkJaWYgKG92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlID09IEZSQU1FX1JFQURZCi0JCQkgICAgfHwgb3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpIHsKLQkJCQlvdi0+Y3VyZnJhbWUgPSBuZXh0ZjsKLQkJCQlvdi0+ZnJhbWVbbmV4dGZdLnNjYW5zdGF0ZSA9IFNUQVRFX1NDQU5OSU5HOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9ET05FKSB7Ci0JCQkJCVBERUJVRyg0LCAiKiogRnJhbWUgZG9uZSAqKiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVBERUJVRyg0LCAiRnJhbWUgbm90IHJlYWR5PyBzdGF0ZSA9ICVkIiwKLQkJCQkJCW92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlKTsKLQkJCQl9Ci0KLQkJCQlvdi0+Y3VyZnJhbWUgPSAtMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVBERUJVRyg1LCAiRnJhbWUgZG9uZSwgYnV0IG5vdCBzY2FubmluZyIpOwotCQl9Ci0JCS8qIEltYWdlIGNvcnJ1cHRpb24gY2F1c2VkIGJ5IG1pc3BsYWNlZCBmcmFtZS0+c2VnbWVudCA9IDAKLQkJICogZml4ZWQgYnkgY2FybG9zZkBjb25lY3RpdmEuY29tLmJyCi0JCSAqLwotCX0gZWxzZSB7Ci0JCS8qIEZyYW1lIHN0YXJ0ICovCi0JCVBERUJVRyg0LCAiRnJhbWUgc3RhcnQsIGZyYW1lbnVtID0gJWQiLCBvdi0+Y3VyZnJhbWUpOwotCi0JCS8qIENoZWNrIHRvIHNlZSBpZiBpdCdzIGEgc25hcHNob3QgZnJhbWUgKi8KLQkJLyogRklYTUU/PyBTaG91bGQgdGhlIHNuYXBzaG90IHJlc2V0IGdvIGhlcmU/IFBlcmZvcm1hbmNlPyAqLwotCQlpZiAoaW5bOF0gJiAweDAyKSB7Ci0JCQlmcmFtZS0+c25hcHNob3QgPSAxOwotCQkJUERFQlVHKDMsICJzbmFwc2hvdCBkZXRlY3RlZCIpOwotCQl9Ci0KLQkJZnJhbWUtPnNjYW5zdGF0ZSA9IFNUQVRFX0xJTkVTOwotCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgPSAwOwotCQlmcmFtZS0+Y29tcHJlc3NlZCA9IGluWzhdICYgMHg0MDsKLQl9Ci0KLWNoZWNrX21pZGRsZToKLQkvKiBBcmUgd2UgaW4gYSBmcmFtZT8gKi8KLQlpZiAoZnJhbWUtPnNjYW5zdGF0ZSAhPSBTVEFURV9MSU5FUykgewotCQlQREVCVUcoNSwgIk5vdCBpbiBhIGZyYW1lOyBwYWNrZXQgc2tpcHBlZCIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSWYgZnJhbWUgc3RhcnQsIHNraXAgaGVhZGVyICovCi0JaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCA9PSAwKQotCQlvZmZzZXQgPSA5OwotCWVsc2UKLQkJb2Zmc2V0ID0gMDsKLQotCW51bSA9IG4gLSBvZmZzZXQgLSAxOwotCi0JLyogRHVtcCBhbGwgZGF0YSBleGFjdGx5IGFzIHJlY2VpdmVkICovCi0JaWYgKGR1bXBwaXggPT0gMikgewotCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgKz0gbiAtIDE7Ci0JCWlmIChmcmFtZS0+Ynl0ZXNfcmVjdmQgPD0gbWF4X3JhdykKLQkJCW1lbWNweShmcmFtZS0+cmF3ZGF0YSArIGZyYW1lLT5ieXRlc19yZWN2ZCAtIChuIC0gMSksCi0JCQkJaW4sIG4gLSAxKTsKLQkJZWxzZQotCQkJUERFQlVHKDMsICJSYXcgZGF0YSBidWZmZXIgb3ZlcnJ1biEhICglZCkiLAotCQkJCWZyYW1lLT5ieXRlc19yZWN2ZCAtIG1heF9yYXcpOwotCX0gZWxzZSBpZiAoIWZyYW1lLT5jb21wcmVzc2VkICYmICFyZW1vdmVfemVyb3MpIHsKLQkJZnJhbWUtPmJ5dGVzX3JlY3ZkICs9IG51bTsKLQkJaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCA8PSBtYXhfcmF3KQotCQkJbWVtY3B5KGZyYW1lLT5yYXdkYXRhICsgZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbnVtLAotCQkJCWluICsgb2Zmc2V0LCBudW0pOwotCQllbHNlCi0JCQlQREVCVUcoMywgIlJhdyBkYXRhIGJ1ZmZlciBvdmVycnVuISEgKCVkKSIsCi0JCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbWF4X3Jhdyk7Ci0JfSBlbHNlIHsgLyogUmVtb3ZlIGFsbC16ZXJvIEZJRk8gbGluZXMgKGFsaWduZWQgMzItYnl0ZSBibG9ja3MpICovCi0JCWludCBiLCByZWFkID0gMCwgYWxsemVybywgY29waWVkID0gMDsKLQkJaWYgKG9mZnNldCkgewotCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkICs9IDMyIC0gb2Zmc2V0OwkvLyBCeXRlcyBvdXQKLQkJCW1lbWNweShmcmFtZS0+cmF3ZGF0YSwJaW4gKyBvZmZzZXQsIDMyIC0gb2Zmc2V0KTsKLQkJCXJlYWQgKz0gMzI7Ci0JCX0KLQotCQl3aGlsZSAocmVhZCA8IG4gLSAxKSB7Ci0JCQlhbGx6ZXJvID0gMTsKLQkJCWZvciAoYiA9IDA7IGIgPCAzMjsgYisrKSB7Ci0JCQkJaWYgKGluW3JlYWQgKyBiXSkgewotCQkJCQlhbGx6ZXJvID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYWxsemVybykgewotCQkJCS8qIERvbid0IGNvcHkgaXQgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCArIGNvcGllZCArIDMyIDw9IG1heF9yYXcpCi0JCQkJewotCQkJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEKLQkJCQkJCSsgZnJhbWUtPmJ5dGVzX3JlY3ZkICsgY29waWVkLAotCQkJCQkJaW4gKyByZWFkLCAzMik7Ci0JCQkJCWNvcGllZCArPSAzMjsKLQkJCQl9IGVsc2UgewotCQkJCQlQREVCVUcoMywgIlJhdyBkYXRhIGJ1ZmZlciBvdmVycnVuISEiKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWFkICs9IDMyOwotCQl9Ci0KLQkJZnJhbWUtPmJ5dGVzX3JlY3ZkICs9IGNvcGllZDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotb3Y1MThfbW92ZV9kYXRhKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyICppbiwgaW50IG4pCi17Ci0JaW50IG1heF9yYXcgPSBNQVhfUkFXX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpOwotCXN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUgPSAmb3YtPmZyYW1lW292LT5jdXJmcmFtZV07Ci0Jc3RydWN0IHRpbWV2YWwgKnRzOwotCi0JLyogRG9uJ3QgY29weSB0aGUgcGFja2V0IG51bWJlciBieXRlICovCi0JaWYgKG92LT5wYWNrZXRfbnVtYmVyaW5nKQotCQktLW47Ci0KLQkvKiBBIGZhbHNlIHBvc2l0aXZlIGhlcmUgaXMgbGlrZWx5LCB1bnRpbCBPVlQgZ2l2ZXMgbWUKLQkgKiB0aGUgZGVmaW5pdGl2ZSBTT0YvRU9GIGZvcm1hdCAqLwotCWlmICgoIShpblswXSB8IGluWzFdIHwgaW5bMl0gfCBpblszXSB8IGluWzVdKSkgJiYgaW5bNl0pIHsKLQkJaWYgKHByaW50cGgpIHsKLQkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsCi0JCQkJICJwaDogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeFxuIiwKLQkJCQkgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIGluWzRdLCBpbls1XSwKLQkJCQkgaW5bNl0sIGluWzddKTsKLQkJfQotCi0JCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0JCQlQREVCVUcoNCwgIkRldGVjdGVkIGZyYW1lIGVuZC9zdGFydCIpOwotCQkJZ290byBlb2Y7Ci0JCX0gZWxzZSB7IC8vc2NhbnN0YXRlID09IFNUQVRFX1NDQU5OSU5HCi0JCQkvKiBGcmFtZSBzdGFydCAqLwotCQkJUERFQlVHKDQsICJGcmFtZSBzdGFydCwgZnJhbWVudW0gPSAlZCIsIG92LT5jdXJmcmFtZSk7Ci0JCQlnb3RvIHNvZjsKLQkJfQotCX0gZWxzZSB7Ci0JCWdvdG8gY2hlY2tfbWlkZGxlOwotCX0KLQotZW9mOgotCXRzID0gKHN0cnVjdCB0aW1ldmFsICopKGZyYW1lLT5kYXRhCi0JICAgICAgKyBNQVhfRlJBTUVfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpKTsKLQlkb19nZXR0aW1lb2ZkYXkodHMpOwotCi0JUERFQlVHKDQsICJGcmFtZSBlbmQsIGN1cmZyYW1lID0gJWQsIGh3PSVkLCB2dz0lZCwgcmVjdmQ9JWQiLAotCQlvdi0+Y3VyZnJhbWUsCi0JCShpbnQpKGluWzldKSwgKGludCkoaW5bMTBdKSwgZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKLQotCS8vIEZJWE1FOiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBoZWFkZXIgZm9ybWF0cyB5ZXQsCi0JLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hhdCB0aGUgYWN0dWFsIGltYWdlIHNpemUgaXMKLQlmcmFtZS0+cmF3d2lkdGggPSBmcmFtZS0+d2lkdGg7Ci0JZnJhbWUtPnJhd2hlaWdodCA9IGZyYW1lLT5oZWlnaHQ7Ci0KLQkvKiBWYWxpZGF0ZSB0aGUgaGVhZGVyIGRhdGEgKi8KLQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+cmF3d2lkdGgsIG92LT5taW53aWR0aCwgb3YtPm1heHdpZHRoKTsKLQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+cmF3aGVpZ2h0LCBvdi0+bWluaGVpZ2h0LCBvdi0+bWF4aGVpZ2h0KTsKLQotCS8qIERvbid0IGFsbG93IGJ5dGUgY291bnQgdG8gZXhjZWVkIGJ1ZmZlciBzaXplICovCi0JUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPmJ5dGVzX3JlY3ZkLCA4LCBtYXhfcmF3KTsKLQotCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0JCWludCBuZXh0ZjsKLQotCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmcmFtZS0+d3EpOwotCi0JCS8qIElmIG5leHQgZnJhbWUgaXMgcmVhZHkgb3IgZ3JhYmJpbmcsCi0JCSAqIHBvaW50IHRvIGl0ICovCi0JCW5leHRmID0gKG92LT5jdXJmcmFtZSArIDEpICUgT1Y1MTFfTlVNRlJBTUVTOwotCQlpZiAob3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUgPT0gRlJBTUVfUkVBRFkKLQkJICAgIHx8IG92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKSB7Ci0JCQlvdi0+Y3VyZnJhbWUgPSBuZXh0ZjsKLQkJCW92LT5mcmFtZVtuZXh0Zl0uc2NhbnN0YXRlID0gU1RBVEVfU0NBTk5JTkc7Ci0JCQlmcmFtZSA9ICZvdi0+ZnJhbWVbbmV4dGZdOwotCQl9IGVsc2UgewotCQkJaWYgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRE9ORSkgewotCQkJCVBERUJVRyg0LCAiKiogRnJhbWUgZG9uZSAqKiIpOwotCQkJfSBlbHNlIHsKLQkJCQlQREVCVUcoNCwgIkZyYW1lIG5vdCByZWFkeT8gc3RhdGUgPSAlZCIsCi0JCQkJICAgICAgIG92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlKTsKLQkJCX0KLQotCQkJb3YtPmN1cmZyYW1lID0gLTE7Ci0JCQlQREVCVUcoNCwgIlNPRiBkcm9wcGVkIChubyBhY3RpdmUgZnJhbWUpIik7Ci0JCQlyZXR1cm47ICAvKiBOb3doZXJlIHRvIHN0b3JlIHRoaXMgZnJhbWUgKi8KLQkJfQotCX0KLXNvZjoKLQlQREVCVUcoNCwgIlN0YXJ0aW5nIGNhcHR1cmUgb24gZnJhbWUgJWQiLCBmcmFtZS0+ZnJhbWVudW0pOwotCi0vLyBTbmFwc2hvdCBub3QgcmV2ZXJzZS1lbmdpbmVlcmVkIHlldC4KLSNpZiAwCi0JLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYSBzbmFwc2hvdCBmcmFtZSAqLwotCS8qIEZJWE1FPz8gU2hvdWxkIHRoZSBzbmFwc2hvdCByZXNldCBnbyBoZXJlPyBQZXJmb3JtYW5jZT8gKi8KLQlpZiAoaW5bOF0gJiAweDAyKSB7Ci0JCWZyYW1lLT5zbmFwc2hvdCA9IDE7Ci0JCVBERUJVRygzLCAic25hcHNob3QgZGV0ZWN0ZWQiKTsKLQl9Ci0jZW5kaWYKLQlmcmFtZS0+c2NhbnN0YXRlID0gU1RBVEVfTElORVM7Ci0JZnJhbWUtPmJ5dGVzX3JlY3ZkID0gMDsKLQlmcmFtZS0+Y29tcHJlc3NlZCA9IDE7Ci0KLWNoZWNrX21pZGRsZToKLQkvKiBBcmUgd2UgaW4gYSBmcmFtZT8gKi8KLQlpZiAoZnJhbWUtPnNjYW5zdGF0ZSAhPSBTVEFURV9MSU5FUykgewotCQlQREVCVUcoNCwgInNjYW5zdGF0ZTogbm8gU09GIHlldCIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRHVtcCBhbGwgZGF0YSBleGFjdGx5IGFzIHJlY2VpdmVkICovCi0JaWYgKGR1bXBwaXggPT0gMikgewotCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgKz0gbjsKLQkJaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCA8PSBtYXhfcmF3KQotCQkJbWVtY3B5KGZyYW1lLT5yYXdkYXRhICsgZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbiwgaW4sIG4pOwotCQllbHNlCi0JCQlQREVCVUcoMywgIlJhdyBkYXRhIGJ1ZmZlciBvdmVycnVuISEgKCVkKSIsCi0JCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbWF4X3Jhdyk7Ci0JfSBlbHNlIHsKLQkJLyogQWxsIGluY29taW5nIGRhdGEgYXJlIGRpdmlkZWQgaW50byA4LWJ5dGUgc2VnbWVudHMuIElmIHRoZQotCQkgKiBzZWdtZW50IGNvbnRhaW5zIGFsbCB6ZXJvIGJ5dGVzLCBpdCBtdXN0IGJlIHNraXBwZWQuIFRoZXNlCi0JCSAqIHplcm8tc2VnbWVudHMgYWxsb3cgdGhlIE9WNTE4IHRvIG1haW5haW4gYSBjb25zdGFudCBkYXRhIHJhdGUKLQkJICogcmVnYXJkbGVzcyBvZiB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUgY29tcHJlc3Npb24uIFNlZ21lbnRzCi0JCSAqIGFyZSBhbGlnbmVkIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpc29jaHJvbm91cwotCQkgKiBwYWNrZXQuIFRoZSBmaXJzdCBzZWdtZW50IGluIGVhY2ggaW1hZ2UgaXMgYSBoZWFkZXIgKHRoZQotCQkgKiBkZWNvbXByZXNzb3Igc2tpcHMgaXQgbGF0ZXIpLgotCQkgKi8KLQotCQlpbnQgYiwgcmVhZCA9IDAsIGFsbHplcm8sIGNvcGllZCA9IDA7Ci0KLQkJd2hpbGUgKHJlYWQgPCBuKSB7Ci0JCQlhbGx6ZXJvID0gMTsKLQkJCWZvciAoYiA9IDA7IGIgPCA4OyBiKyspIHsKLQkJCQlpZiAoaW5bcmVhZCArIGJdKSB7Ci0JCQkJCWFsbHplcm8gPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChhbGx6ZXJvKSB7Ci0JCQkvKiBEb24ndCBjb3B5IGl0ICovCi0JCQl9IGVsc2UgewotCQkJCWlmIChmcmFtZS0+Ynl0ZXNfcmVjdmQgKyBjb3BpZWQgKyA4IDw9IG1heF9yYXcpCi0JCQkJewotCQkJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEKLQkJCQkJCSsgZnJhbWUtPmJ5dGVzX3JlY3ZkICsgY29waWVkLAotCQkJCQkJaW4gKyByZWFkLCA4KTsKLQkJCQkJY29waWVkICs9IDg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUERFQlVHKDMsICJSYXcgZGF0YSBidWZmZXIgb3ZlcnJ1biEhIik7Ci0JCQkJfQotCQkJfQotCQkJcmVhZCArPSA4OwotCQl9Ci0JCWZyYW1lLT5ieXRlc19yZWN2ZCArPSBjb3BpZWQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotb3Y1MXhfaXNvY19pcnEoc3RydWN0IHVyYiAqdXJiKQotewotCWludCBpOwotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92OwotCXN0cnVjdCBvdjUxMV9zYnVmICpzYnVmOwotCi0JaWYgKCF1cmItPmNvbnRleHQpIHsKLQkJUERFQlVHKDQsICJubyBjb250ZXh0Iik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzYnVmID0gdXJiLT5jb250ZXh0OwotCW92ID0gc2J1Zi0+b3Y7Ci0KLQlpZiAoIW92IHx8ICFvdi0+ZGV2IHx8ICFvdi0+dXNlcikgewotCQlQREVCVUcoNCwgIm5vIGRldmljZSwgb3Igbm90IG9wZW4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghb3YtPnN0cmVhbWluZykgewotCQlQREVCVUcoNCwgImhtbW0uLi4gbm90IHN0cmVhbWluZywgYnV0IGdvdCBpbnRlcnJ1cHQiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7Ci0JCVBERUJVRyg0LCAiVVJCIHVubGlua2VkIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTICYmIHVyYi0+c3RhdHVzICE9IDApIHsKLQkJZXJyKCJFUlJPUjogdXJiLT5zdGF0dXM9JWQ6ICVzIiwgdXJiLT5zdGF0dXMsCi0JCSAgICBzeW1ib2xpYyh1cmJfZXJybGlzdCwgdXJiLT5zdGF0dXMpKTsKLQl9Ci0KLQkvKiBDb3B5IHRoZSBkYXRhIHJlY2VpdmVkIGludG8gb3VyIGZyYW1lIGJ1ZmZlciAqLwotCVBERUJVRyg1LCAic2J1ZlslZF06IE1vdmluZyAlZCBwYWNrZXRzIiwgc2J1Zi0+biwKLQkgICAgICAgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7Ci0JZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewotCQkvKiBXYXJuaW5nOiBEb24ndCBjYWxsICpfbW92ZV9kYXRhKCkgaWYgbm8gZnJhbWUgYWN0aXZlISAqLwotCQlpZiAob3YtPmN1cmZyYW1lID49IDApIHsKLQkJCWludCBuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwotCQkJaW50IHN0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7Ci0JCQl1bnNpZ25lZCBjaGFyICpjZGF0YTsKLQotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0gMDsKLQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gMDsKLQotCQkJY2RhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcgotCQkJCSsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7Ci0KLQkJCWlmICghbikgewotCQkJCVBERUJVRyg0LCAiWmVyby1sZW5ndGggcGFja2V0Iik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChzdCkKLQkJCQlQREVCVUcoMiwgImRhdGEgZXJyb3I6IFslZF0gbGVuPSVkLCBzdGF0dXM9JWQiLAotCQkJCSAgICAgICBpLCBuLCBzdCk7Ci0KLQkJCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkKLQkJCQlvdjUxMV9tb3ZlX2RhdGEob3YsIGNkYXRhLCBuKTsKLQkJCWVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQotCQkJCW92NTE4X21vdmVfZGF0YShvdiwgY2RhdGEsIG4pOwotCQkJZWxzZQotCQkJCWVycigiVW5rbm93biBicmlkZ2UgZGV2aWNlICglZCkiLCBvdi0+YnJpZGdlKTsKLQotCQl9IGVsc2UgaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJm92LT53cSkpIHsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb3YtPndxKTsKLQkJfQotCX0KLQotCS8qIFJlc3VibWl0IHRoaXMgVVJCICovCi0JdXJiLT5kZXYgPSBvdi0+ZGV2OwotCWlmICgoaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApCi0JCWVycigidXNiX3N1Ym1pdF91cmIoKSByZXQgJWQiLCBpKTsKLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBTdHJlYW0gaW5pdGlhbGl6YXRpb24gYW5kIHRlcm1pbmF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotb3Y1MXhfaW5pdF9pc29jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCXN0cnVjdCB1cmIgKnVyYjsKLQlpbnQgZngsIGVyciwgbiwgaSwgc2l6ZTsKLQotCVBERUJVRygzLCAiKioqIEluaXRpYWxpemluZyBjYXB0dXJlICoqKiIpOwotCi0Jb3YtPmN1cmZyYW1lID0gLTE7Ci0KLQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTEpIHsKLQkJaWYgKGNhbXMgPT0gMSkKLQkJCXNpemUgPSA5OTM7Ci0JCWVsc2UgaWYgKGNhbXMgPT0gMikKLQkJCXNpemUgPSA1MTM7Ci0JCWVsc2UgaWYgKGNhbXMgPT0gMyB8fCBjYW1zID09IDQpCi0JCQlzaXplID0gMjU3OwotCQllbHNlIHsKLQkJCWVycigiXCJjYW1zXCIgcGFyYW1ldGVyIHRvbyBoaWdoISIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfSBlbHNlIGlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxMVBMVVMpIHsKLQkJaWYgKGNhbXMgPT0gMSkKLQkJCXNpemUgPSA5NjE7Ci0JCWVsc2UgaWYgKGNhbXMgPT0gMikKLQkJCXNpemUgPSA1MTM7Ci0JCWVsc2UgaWYgKGNhbXMgPT0gMyB8fCBjYW1zID09IDQpCi0JCQlzaXplID0gMjU3OwotCQllbHNlIGlmIChjYW1zID49IDUgJiYgY2FtcyA8PSA4KQotCQkJc2l6ZSA9IDEyOTsKLQkJZWxzZSBpZiAoY2FtcyA+PSA5ICYmIGNhbXMgPD0gMzEpCi0JCQlzaXplID0gMzM7Ci0JCWVsc2UgewotCQkJZXJyKCJcImNhbXNcIiBwYXJhbWV0ZXIgdG9vIGhpZ2ghIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7Ci0JCWlmIChjYW1zID09IDEpCi0JCQlzaXplID0gODk2OwotCQllbHNlIGlmIChjYW1zID09IDIpCi0JCQlzaXplID0gNTEyOwotCQllbHNlIGlmIChjYW1zID09IDMgfHwgY2FtcyA9PSA0KQotCQkJc2l6ZSA9IDI1NjsKLQkJZWxzZSBpZiAoY2FtcyA+PSA1ICYmIGNhbXMgPD0gOCkKLQkJCXNpemUgPSAxMjg7Ci0JCWVsc2UgewotCQkJZXJyKCJcImNhbXNcIiBwYXJhbWV0ZXIgdG9vIGhpZ2ghIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgewotCQllcnIoImludmFsaWQgYnJpZGdlIHR5cGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8vIEZJWE1FOiBPVjUxOCBpcyBoYXJkY29kZWQgdG8gMTUgRlBTIChhbHRlcm5hdGUgNSkgZm9yIG5vdwotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgewotCQlpZiAocGFja2V0c2l6ZSA9PSAtMSkgewotCQkJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCA2NDApOwotCQl9IGVsc2UgewotCQkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkZvcmNpbmcgcGFja2V0IHNpemUgdG8gJWRcbiIsCi0JCQkJIHBhY2tldHNpemUpOwotCQkJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCBwYWNrZXRzaXplKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwYWNrZXRzaXplID09IC0xKSB7Ci0JCQlvdjUxMV9zZXRfcGFja2V0X3NpemUob3YsIHNpemUpOwotCQl9IGVsc2UgewotCQkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkZvcmNpbmcgcGFja2V0IHNpemUgdG8gJWRcbiIsCi0JCQkJIHBhY2tldHNpemUpOwotCQkJb3Y1MTFfc2V0X3BhY2tldF9zaXplKG92LCBwYWNrZXRzaXplKTsKLQkJfQotCX0KLQotCWZvciAobiA9IDA7IG4gPCBPVjUxMV9OVU1TQlVGOyBuKyspIHsKLQkJdXJiID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJZXJyKCJpbml0IGlzb2M6IHVzYl9hbGxvY191cmIgcmV0LiBOVUxMIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQkJCXVzYl9mcmVlX3VyYihvdi0+c2J1ZltpXS51cmIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJb3YtPnNidWZbbl0udXJiID0gdXJiOwotCQl1cmItPmRldiA9IG92LT5kZXY7Ci0JCXVyYi0+Y29udGV4dCA9ICZvdi0+c2J1ZltuXTsKLQkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKG92LT5kZXYsIE9WNTExX0VORFBPSU5UX0FERFJFU1MpOwotCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IG92LT5zYnVmW25dLmRhdGE7Ci0JCXVyYi0+Y29tcGxldGUgPSBvdjUxeF9pc29jX2lycTsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfREVTQzsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gb3YtPnBhY2tldF9zaXplICogRlJBTUVTX1BFUl9ERVNDOwotCQl1cmItPmludGVydmFsID0gMTsKLQkJZm9yIChmeCA9IDA7IGZ4IDwgRlJBTUVTX1BFUl9ERVNDOyBmeCsrKSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2Z4XS5vZmZzZXQgPSBvdi0+cGFja2V0X3NpemUgKiBmeDsKLQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnhdLmxlbmd0aCA9IG92LT5wYWNrZXRfc2l6ZTsKLQkJfQotCX0KLQotCW92LT5zdHJlYW1pbmcgPSAxOwotCi0JZm9yIChuID0gMDsgbiA8IE9WNTExX05VTVNCVUY7IG4rKykgewotCQlvdi0+c2J1ZltuXS51cmItPmRldiA9IG92LT5kZXY7Ci0JCWVyciA9IHVzYl9zdWJtaXRfdXJiKG92LT5zYnVmW25dLnVyYiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlcnIpIHsKLQkJCWVycigiaW5pdCBpc29jOiB1c2Jfc3VibWl0X3VyYiglZCkgcmV0ICVkIiwgbiwgZXJyKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLW92NTF4X3VubGlua19pc29jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWludCBuOwotCi0JLyogVW5zY2hlZHVsZSBhbGwgb2YgdGhlIGlzbyB0ZCdzICovCi0JZm9yIChuID0gT1Y1MTFfTlVNU0JVRiAtIDE7IG4gPj0gMDsgbi0tKSB7Ci0JCWlmIChvdi0+c2J1ZltuXS51cmIpIHsKLQkJCXVzYl9raWxsX3VyYihvdi0+c2J1ZltuXS51cmIpOwotCQkJdXNiX2ZyZWVfdXJiKG92LT5zYnVmW25dLnVyYik7Ci0JCQlvdi0+c2J1ZltuXS51cmIgPSBOVUxMOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotb3Y1MXhfc3RvcF9pc29jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWlmICghb3YtPnN0cmVhbWluZyB8fCAhb3YtPmRldikKLQkJcmV0dXJuOwotCi0JUERFQlVHKDMsICIqKiogU3RvcHBpbmcgY2FwdHVyZSAqKioiKTsKLQotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKLQkJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCAwKTsKLQllbHNlCi0JCW92NTExX3NldF9wYWNrZXRfc2l6ZShvdiwgMCk7Ci0KLQlvdi0+c3RyZWFtaW5nID0gMDsKLQotCW92NTF4X3VubGlua19pc29jKG92KTsKLX0KLQotc3RhdGljIGludAotb3Y1MXhfbmV3X2ZyYW1lKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZnJhbWVudW0pCi17Ci0Jc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZTsKLQlpbnQgbmV3bnVtOwotCi0JUERFQlVHKDQsICJvdi0+Y3VyZnJhbWUgPSAlZCwgZnJhbWVudW0gPSAlZCIsIG92LT5jdXJmcmFtZSwgZnJhbWVudW0pOwotCi0JaWYgKCFvdi0+ZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBJZiB3ZSdyZSBub3QgZ3JhYmJpbmcgYSBmcmFtZSByaWdodCBub3cgYW5kIHRoZSBvdGhlciBmcmFtZSBpcyAqLwotCS8qIHJlYWR5IHRvIGJlIGdyYWJiZWQgaW50bywgdGhlbiB1c2UgaXQgaW5zdGVhZCAqLwotCWlmIChvdi0+Y3VyZnJhbWUgPT0gLTEpIHsKLQkJbmV3bnVtID0gKGZyYW1lbnVtIC0gMSArIE9WNTExX05VTUZSQU1FUykgJSBPVjUxMV9OVU1GUkFNRVM7Ci0JCWlmIChvdi0+ZnJhbWVbbmV3bnVtXS5ncmFic3RhdGUgPT0gRlJBTUVfUkVBRFkpCi0JCQlmcmFtZW51bSA9IG5ld251bTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci0KLQlmcmFtZSA9ICZvdi0+ZnJhbWVbZnJhbWVudW1dOwotCi0JUERFQlVHKDQsICJmcmFtZW51bSA9ICVkLCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCIsIGZyYW1lbnVtLAotCSAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOwotCi0JZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0dSQUJCSU5HOwotCWZyYW1lLT5zY2Fuc3RhdGUgPSBTVEFURV9TQ0FOTklORzsKLQlmcmFtZS0+c25hcHNob3QgPSAwOwotCi0Jb3YtPmN1cmZyYW1lID0gZnJhbWVudW07Ci0KLQkvKiBNYWtlIHN1cmUgaXQncyBub3QgdG9vIGJpZyAqLwotCWlmIChmcmFtZS0+d2lkdGggPiBvdi0+bWF4d2lkdGgpCi0JCWZyYW1lLT53aWR0aCA9IG92LT5tYXh3aWR0aDsKLQotCWZyYW1lLT53aWR0aCAmPSB+N0w7CQkvKiBNdWx0aXBsZSBvZiA4ICovCi0KLQlpZiAoZnJhbWUtPmhlaWdodCA+IG92LT5tYXhoZWlnaHQpCi0JCWZyYW1lLT5oZWlnaHQgPSBvdi0+bWF4aGVpZ2h0OwotCi0JZnJhbWUtPmhlaWdodCAmPSB+M0w7CQkvKiBNdWx0aXBsZSBvZiA0ICovCi0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBCdWZmZXIgbWFuYWdlbWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiAtIFlvdSBtdXN0IGFjcXVpcmUgYnVmX2xvY2sgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24uCi0gKiAtIEJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZnJlZSBhbnkgbm9uLW51bGwgcG9pbnRlciwgeW91IG11c3QgYmUgc3VyZSB0byBudWxsCi0gKiAgIHRoZW0gaWYgeW91IGV4cGxpY2l0bHkgZnJlZSB0aGVtIHNvbWV3aGVyZSBlbHNlIQotICovCi1zdGF0aWMgdm9pZAotb3Y1MXhfZG9fZGVhbGxvYyhzdHJ1Y3QgdXNiX292NTExICpvdikKLXsKLQlpbnQgaTsKLQlQREVCVUcoNCwgImVudGVyZWQiKTsKLQotCWlmIChvdi0+ZmJ1ZikgewotCQlydmZyZWUob3YtPmZidWYsIE9WNTExX05VTUZSQU1FUwotCQkgICAgICAgKiBNQVhfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCkpOwotCQlvdi0+ZmJ1ZiA9IE5VTEw7Ci0JfQotCi0JdmZyZWUob3YtPnJhd2ZidWYpOwotCW92LT5yYXdmYnVmID0gTlVMTDsKLQotCXZmcmVlKG92LT50ZW1wZmJ1Zik7Ci0Jb3YtPnRlbXBmYnVmID0gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1TQlVGOyBpKyspIHsKLQkJa2ZyZWUob3YtPnNidWZbaV0uZGF0YSk7Ci0JCW92LT5zYnVmW2ldLmRhdGEgPSBOVUxMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgewotCQlvdi0+ZnJhbWVbaV0uZGF0YSA9IE5VTEw7Ci0JCW92LT5mcmFtZVtpXS5yYXdkYXRhID0gTlVMTDsKLQkJb3YtPmZyYW1lW2ldLnRlbXBkYXRhID0gTlVMTDsKLQkJaWYgKG92LT5mcmFtZVtpXS5jb21wYnVmKSB7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG92LT5mcmFtZVtpXS5jb21wYnVmKTsKLQkJCW92LT5mcmFtZVtpXS5jb21wYnVmID0gTlVMTDsKLQkJfQotCX0KLQotCVBERUJVRyg0LCAiYnVmZmVyIG1lbW9yeSBkZWFsbG9jYXRlZCIpOwotCW92LT5idWZfc3RhdGUgPSBCVUZfTk9UX0FMTE9DQVRFRDsKLQlQREVCVUcoNCwgImxlYXZpbmciKTsKLX0KLQotc3RhdGljIGludAotb3Y1MXhfYWxsb2Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IGk7Ci0JY29uc3QgaW50IHcgPSBvdi0+bWF4d2lkdGg7Ci0JY29uc3QgaW50IGggPSBvdi0+bWF4aGVpZ2h0OwotCWNvbnN0IGludCBkYXRhX2J1ZnNpemUgPSBPVjUxMV9OVU1GUkFNRVMgKiBNQVhfREFUQV9TSVpFKHcsIGgpOwotCWNvbnN0IGludCByYXdfYnVmc2l6ZSA9IE9WNTExX05VTUZSQU1FUyAqIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpOwotCi0JUERFQlVHKDQsICJlbnRlcmVkIik7Ci0JbXV0ZXhfbG9jaygmb3YtPmJ1Zl9sb2NrKTsKLQotCWlmIChvdi0+YnVmX3N0YXRlID09IEJVRl9BTExPQ0FURUQpCi0JCWdvdG8gb3V0OwotCi0Jb3YtPmZidWYgPSBydm1hbGxvYyhkYXRhX2J1ZnNpemUpOwotCWlmICghb3YtPmZidWYpCi0JCWdvdG8gZXJyb3I7Ci0KLQlvdi0+cmF3ZmJ1ZiA9IHZtYWxsb2MocmF3X2J1ZnNpemUpOwotCWlmICghb3YtPnJhd2ZidWYpCi0JCWdvdG8gZXJyb3I7Ci0KLQltZW1zZXQob3YtPnJhd2ZidWYsIDAsIHJhd19idWZzaXplKTsKLQotCW92LT50ZW1wZmJ1ZiA9IHZtYWxsb2MocmF3X2J1ZnNpemUpOwotCWlmICghb3YtPnRlbXBmYnVmKQotCQlnb3RvIGVycm9yOwotCi0JbWVtc2V0KG92LT50ZW1wZmJ1ZiwgMCwgcmF3X2J1ZnNpemUpOwotCi0JZm9yIChpID0gMDsgaSA8IE9WNTExX05VTVNCVUY7IGkrKykgewotCQlvdi0+c2J1ZltpXS5kYXRhID0ga21hbGxvYyhGUkFNRVNfUEVSX0RFU0MgKgotCQkJTUFYX0ZSQU1FX1NJWkVfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwotCQlpZiAoIW92LT5zYnVmW2ldLmRhdGEpCi0JCQlnb3RvIGVycm9yOwotCi0JCVBERUJVRyg0LCAic2J1ZlslZF0gQCAlcCIsIGksIG92LT5zYnVmW2ldLmRhdGEpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgewotCQlvdi0+ZnJhbWVbaV0uZGF0YSA9IG92LT5mYnVmICsgaSAqIE1BWF9EQVRBX1NJWkUodywgaCk7Ci0JCW92LT5mcmFtZVtpXS5yYXdkYXRhID0gb3YtPnJhd2ZidWYKLQkJICsgaSAqIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpOwotCQlvdi0+ZnJhbWVbaV0udGVtcGRhdGEgPSBvdi0+dGVtcGZidWYKLQkJICsgaSAqIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpOwotCi0JCW92LT5mcmFtZVtpXS5jb21wYnVmID0KLQkJICh1bnNpZ25lZCBjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFvdi0+ZnJhbWVbaV0uY29tcGJ1ZikKLQkJCWdvdG8gZXJyb3I7Ci0KLQkJUERFQlVHKDQsICJmcmFtZVslZF0gQCAlcCIsIGksIG92LT5mcmFtZVtpXS5kYXRhKTsKLQl9Ci0KLQlvdi0+YnVmX3N0YXRlID0gQlVGX0FMTE9DQVRFRDsKLW91dDoKLQltdXRleF91bmxvY2soJm92LT5idWZfbG9jayk7Ci0JUERFQlVHKDQsICJsZWF2aW5nIik7Ci0JcmV0dXJuIDA7Ci1lcnJvcjoKLQlvdjUxeF9kb19kZWFsbG9jKG92KTsKLQltdXRleF91bmxvY2soJm92LT5idWZfbG9jayk7Ci0JUERFQlVHKDQsICJlcnJvcmVkIik7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB2b2lkCi1vdjUxeF9kZWFsbG9jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCVBERUJVRyg0LCAiZW50ZXJlZCIpOwotCW11dGV4X2xvY2soJm92LT5idWZfbG9jayk7Ci0Jb3Y1MXhfZG9fZGVhbGxvYyhvdik7Ci0JbXV0ZXhfdW5sb2NrKCZvdi0+YnVmX2xvY2spOwotCVBERUJVRyg0LCAibGVhdmluZyIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFY0TCAxIEFQSQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLW92NTF4X3Y0bDFfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCWludCBlcnIsIGk7Ci0KLQlQREVCVUcoNCwgIm9wZW5pbmciKTsKLQotCW11dGV4X2xvY2soJm92LT5sb2NrKTsKLQotCWVyciA9IC1FQlVTWTsKLQlpZiAob3YtPnVzZXIpCi0JCWdvdG8gb3V0OwotCi0Jb3YtPnN1Yl9mbGFnID0gMDsKLQotCS8qIEluIGNhc2UgYXBwIGRvZXNuJ3Qgc2V0IHRoZW0uLi4gKi8KLQllcnIgPSBvdjUxeF9zZXRfZGVmYXVsdF9wYXJhbXMob3YpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIE1ha2Ugc3VyZSBmcmFtZXMgYXJlIHJlc2V0ICovCi0JZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7Ci0JCW92LT5mcmFtZVtpXS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7Ci0JCW92LT5mcmFtZVtpXS5ieXRlc19yZWFkID0gMDsKLQl9Ci0KLQkvKiBJZiBjb21wcmVzc2lvbiBpcyBvbiwgbWFrZSBzdXJlIG5vdyB0aGF0IGEKLQkgKiBkZWNvbXByZXNzb3IgY2FuIGJlIGxvYWRlZCAqLwotCWlmIChvdi0+Y29tcHJlc3MgJiYgIW92LT5kZWNvbXBfb3BzKSB7Ci0JCWVyciA9IHJlcXVlc3RfZGVjb21wcmVzc29yKG92KTsKLQkJaWYgKGVyciAmJiAhZHVtcHBpeCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWVyciA9IG92NTF4X2FsbG9jKG92KTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBvdjUxeF9pbml0X2lzb2Mob3YpOwotCWlmIChlcnIpIHsKLQkJb3Y1MXhfZGVhbGxvYyhvdik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW92LT51c2VyKys7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmRldjsKLQotCWlmIChvdi0+bGVkX3BvbGljeSA9PSBMRURfQVVUTykKLQkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDEpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZvdi0+bG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludAotb3Y1MXhfdjRsMV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0KLQlQREVCVUcoNCwgIm92NTExX2Nsb3NlIik7Ci0KLQltdXRleF9sb2NrKCZvdi0+bG9jayk7Ci0KLQlvdi0+dXNlci0tOwotCW92NTF4X3N0b3BfaXNvYyhvdik7Ci0KLQlpZiAob3YtPmxlZF9wb2xpY3kgPT0gTEVEX0FVVE8pCi0JCW92NTF4X2xlZF9jb250cm9sKG92LCAwKTsKLQotCWlmIChvdi0+ZGV2KQotCQlvdjUxeF9kZWFsbG9jKG92KTsKLQotCW11dGV4X3VubG9jaygmb3YtPmxvY2spOwotCi0JLyogRGV2aWNlIHVucGx1Z2dlZCB3aGlsZSBvcGVuLiBPbmx5IGEgbWluaW11bSBvZiB1bnJlZ2lzdHJhdGlvbiBpcyBkb25lCi0JICogaGVyZTsgdGhlIGRpc2Nvbm5lY3QgY2FsbGJhY2sgYWxyZWFkeSBkaWQgdGhlIHJlc3QuICovCi0JaWYgKCFvdi0+ZGV2KSB7Ci0JCW11dGV4X2xvY2soJm92LT5jYnVmX2xvY2spOwotCQlrZnJlZShvdi0+Y2J1Zik7Ci0JCW92LT5jYnVmID0gTlVMTDsKLQkJbXV0ZXhfdW5sb2NrKCZvdi0+Y2J1Zl9sb2NrKTsKLQotCQlvdjUxeF9kZWFsbG9jKG92KTsKLQkJa2ZyZWUob3YpOwotCQlvdiA9IE5VTEw7Ci0JfQotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotLyogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEgKi8KLXN0YXRpYyBsb25nCi1vdjUxeF92NGwxX2lvY3RsX2ludGVybmFsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCVBERUJVRyg1LCAiSU9DdGw6IDB4JVgiLCBjbWQpOwotCi0JaWYgKCFvdi0+ZGV2KQotCQlyZXR1cm4gLUVJTzsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NHQ0FQOgotCXsKLQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7Ci0KLQkJUERFQlVHKDQsICJWSURJT0NHQ0FQIik7Ci0KLQkJbWVtc2V0KGIsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSkpOwotCQlzcHJpbnRmKGItPm5hbWUsICIlcyBVU0IgQ2FtZXJhIiwKLQkJCXN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKLQkJYi0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TVUJDQVBUVVJFOwotCQliLT5jaGFubmVscyA9IG92LT5udW1faW5wdXRzOwotCQliLT5hdWRpb3MgPSAwOwotCQliLT5tYXh3aWR0aCA9IG92LT5tYXh3aWR0aDsKLQkJYi0+bWF4aGVpZ2h0ID0gb3YtPm1heGhlaWdodDsKLQkJYi0+bWlud2lkdGggPSBvdi0+bWlud2lkdGg7Ci0JCWItPm1pbmhlaWdodCA9IG92LT5taW5oZWlnaHQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DR0NIQU46Ci0JewotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKLQotCQlQREVCVUcoNCwgIlZJRElPQ0dDSEFOIik7Ci0KLQkJaWYgKCh1bnNpZ25lZCkodi0+Y2hhbm5lbCkgPj0gb3YtPm51bV9pbnB1dHMpIHsKLQkJCWVycigiSW52YWxpZCBjaGFubmVsICglZCkiLCB2LT5jaGFubmVsKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJdi0+bm9ybSA9IG92LT5ub3JtOwotCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7Ci0JCXYtPmZsYWdzID0gMDsKLS8vCQl2LT5mbGFncyB8PSAob3YtPmhhc19kZWNvZGVyKSA/IFZJREVPX1ZDX05PUk0gOiAwOwotCQl2LT50dW5lcnMgPSAwOwotCQlkZWNvZGVyX2dldF9pbnB1dF9uYW1lKG92LCB2LT5jaGFubmVsLCB2LT5uYW1lKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NTQ0hBTjoKLQl7Ci0JCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOwotCQlpbnQgZXJyOwotCi0JCVBERUJVRyg0LCAiVklESU9DU0NIQU4iKTsKLQotCQkvKiBNYWtlIHN1cmUgaXQncyBub3QgYSBjYW1lcmEgKi8KLQkJaWYgKCFvdi0+aGFzX2RlY29kZXIpIHsKLQkJCWlmICh2LT5jaGFubmVsID09IDApCi0JCQkJcmV0dXJuIDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAodi0+bm9ybSAhPSBWSURFT19NT0RFX1BBTCAmJgotCQkgICAgdi0+bm9ybSAhPSBWSURFT19NT0RFX05UU0MgJiYKLQkJICAgIHYtPm5vcm0gIT0gVklERU9fTU9ERV9TRUNBTSAmJgotCQkgICAgdi0+bm9ybSAhPSBWSURFT19NT0RFX0FVVE8pIHsKLQkJCWVycigiSW52YWxpZCBub3JtICglZCkiLCB2LT5ub3JtKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKCh1bnNpZ25lZCkodi0+Y2hhbm5lbCkgPj0gb3YtPm51bV9pbnB1dHMpIHsKLQkJCWVycigiSW52YWxpZCBjaGFubmVsICglZCkiLCB2LT5jaGFubmVsKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZXJyID0gZGVjb2Rlcl9zZXRfaW5wdXQob3YsIHYtPmNoYW5uZWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQllcnIgPSBkZWNvZGVyX3NldF9ub3JtKG92LCB2LT5ub3JtKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DR1BJQ1Q6Ci0JewotCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKLQotCQlQREVCVUcoNCwgIlZJRElPQ0dQSUNUIik7Ci0KLQkJbWVtc2V0KHAsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fcGljdHVyZSkpOwotCQlpZiAoc2Vuc29yX2dldF9waWN0dXJlKG92LCBwKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCS8qIENhbiB3ZSBnZXQgdGhlc2UgZnJvbSBmcmFtZVswXT8gLWNsYXVkaW8/ICovCi0JCXAtPmRlcHRoID0gb3YtPmZyYW1lWzBdLmRlcHRoOwotCQlwLT5wYWxldHRlID0gb3YtPmZyYW1lWzBdLmZvcm1hdDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NTUElDVDoKLQl7Ci0JCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOwotCQlpbnQgaSwgcmM7Ci0KLQkJUERFQlVHKDQsICJWSURJT0NTUElDVCIpOwotCi0JCWlmICghZ2V0X2RlcHRoKHAtPnBhbGV0dGUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKHNlbnNvcl9zZXRfcGljdHVyZShvdiwgcCkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAoZm9yY2VfcGFsZXR0ZSAmJiBwLT5wYWxldHRlICE9IGZvcmNlX3BhbGV0dGUpIHsKLQkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJQYWxldHRlIHJlamVjdGVkICglcylcbiIsCi0JCQkgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHAtPnBhbGV0dGUpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLy8gRklYTUU6IEZvcm1hdCBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2YgZnJhbWVzCi0JCWlmIChwLT5wYWxldHRlICE9IG92LT5mcmFtZVswXS5mb3JtYXQpIHsKLQkJCVBERUJVRyg0LCAiRGV0ZWN0ZWQgZm9ybWF0IGNoYW5nZSIpOwotCi0JCQlyYyA9IG92NTF4X3dhaXRfZnJhbWVzX2luYWN0aXZlKG92KTsKLQkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1vZGVfaW5pdF9yZWdzKG92LCBvdi0+ZnJhbWVbMF0ud2lkdGgsCi0JCQkJb3YtPmZyYW1lWzBdLmhlaWdodCwgcC0+cGFsZXR0ZSwgb3YtPnN1Yl9mbGFnKTsKLQkJfQotCi0JCVBERUJVRyg0LCAiU2V0dGluZyBkZXB0aD0lZCwgcGFsZXR0ZT0lcyIsCi0JCSAgICAgICBwLT5kZXB0aCwgc3ltYm9saWModjRsMV9wbGlzdCwgcC0+cGFsZXR0ZSkpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgewotCQkJb3YtPmZyYW1lW2ldLmRlcHRoID0gcC0+ZGVwdGg7Ci0JCQlvdi0+ZnJhbWVbaV0uZm9ybWF0ID0gcC0+cGFsZXR0ZTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ0dDQVBUVVJFOgotCXsKLQkJaW50ICp2ZiA9IGFyZzsKLQotCQlQREVCVUcoNCwgIlZJRElPQ0dDQVBUVVJFIik7Ci0KLQkJb3YtPnN1Yl9mbGFnID0gKnZmOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NTQ0FQVFVSRToKLQl7Ci0JCXN0cnVjdCB2aWRlb19jYXB0dXJlICp2YyA9IGFyZzsKLQotCQlQREVCVUcoNCwgIlZJRElPQ1NDQVBUVVJFIik7Ci0KLQkJaWYgKHZjLT5mbGFncykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodmMtPmRlY2ltYXRpb24pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQl2Yy0+eCAmPSB+M0w7Ci0JCXZjLT55ICY9IH4xTDsKLQkJdmMtPnkgJj0gfjMxTDsKLQotCQlpZiAodmMtPndpZHRoID09IDApCi0JCQl2Yy0+d2lkdGggPSAzMjsKLQotCQl2Yy0+aGVpZ2h0IC89IDE2OwotCQl2Yy0+aGVpZ2h0ICo9IDE2OwotCQlpZiAodmMtPmhlaWdodCA9PSAwKQotCQkJdmMtPmhlaWdodCA9IDE2OwotCi0JCW92LT5zdWJ4ID0gdmMtPng7Ci0JCW92LT5zdWJ5ID0gdmMtPnk7Ci0JCW92LT5zdWJ3ID0gdmMtPndpZHRoOwotCQlvdi0+c3ViaCA9IHZjLT5oZWlnaHQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DU1dJTjoKLQl7Ci0JCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOwotCQlpbnQgaSwgcmM7Ci0KLQkJUERFQlVHKDQsICJWSURJT0NTV0lOOiAlZHglZCIsIHZ3LT53aWR0aCwgdnctPmhlaWdodCk7Ci0KLSNpZiAwCi0JCWlmICh2dy0+ZmxhZ3MpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHZ3LT5jbGlwY291bnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHZ3LT5oZWlnaHQgIT0gb3YtPm1heGhlaWdodCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodnctPndpZHRoICE9IG92LT5tYXh3aWR0aCkKLQkJCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi0KLQkJcmMgPSBvdjUxeF93YWl0X2ZyYW1lc19pbmFjdGl2ZShvdik7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IG1vZGVfaW5pdF9yZWdzKG92LCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQsCi0JCQlvdi0+ZnJhbWVbMF0uZm9ybWF0LCBvdi0+c3ViX2ZsYWcpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgewotCQkJb3YtPmZyYW1lW2ldLndpZHRoID0gdnctPndpZHRoOwotCQkJb3YtPmZyYW1lW2ldLmhlaWdodCA9IHZ3LT5oZWlnaHQ7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NHV0lOOgotCXsKLQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7Ci0KLQkJbWVtc2V0KHZ3LCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykpOwotCQl2dy0+eCA9IDA7CQkvKiBGSVhNRSAqLwotCQl2dy0+eSA9IDA7Ci0JCXZ3LT53aWR0aCA9IG92LT5mcmFtZVswXS53aWR0aDsKLQkJdnctPmhlaWdodCA9IG92LT5mcmFtZVswXS5oZWlnaHQ7Ci0JCXZ3LT5mbGFncyA9IDMwOwotCi0JCVBERUJVRyg0LCAiVklESU9DR1dJTjogJWR4JWQiLCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQpOwotCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ0dNQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOwotCQlpbnQgaTsKLQotCQlQREVCVUcoNCwgIlZJRElPQ0dNQlVGIik7Ci0KLQkJbWVtc2V0KHZtLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX21idWYpKTsKLQkJdm0tPnNpemUgPSBPVjUxMV9OVU1GUkFNRVMKLQkJCSAgICogTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpOwotCQl2bS0+ZnJhbWVzID0gT1Y1MTFfTlVNRlJBTUVTOwotCi0JCXZtLT5vZmZzZXRzWzBdID0gMDsKLQkJZm9yIChpID0gMTsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7Ci0JCQl2bS0+b2Zmc2V0c1tpXSA9IHZtLT5vZmZzZXRzW2ktMV0KLQkJCSAgICsgTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DTUNBUFRVUkU6Ci0JewotCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqdm0gPSBhcmc7Ci0JCWludCByYywgZGVwdGg7Ci0JCXVuc2lnbmVkIGludCBmID0gdm0tPmZyYW1lOwotCi0JCVBERUJVRyg0LCAiVklESU9DTUNBUFRVUkU6IGZyYW1lOiAlZCwgJWR4JWQsICVzIiwgZiwgdm0tPndpZHRoLAotCQkJdm0tPmhlaWdodCwgc3ltYm9saWModjRsMV9wbGlzdCwgdm0tPmZvcm1hdCkpOwotCi0JCWRlcHRoID0gZ2V0X2RlcHRoKHZtLT5mb3JtYXQpOwotCQlpZiAoIWRlcHRoKSB7Ci0JCQlQREVCVUcoMiwgIlZJRElPQ01DQVBUVVJFOiBpbnZhbGlkIGZvcm1hdCAoJXMpIiwKLQkJCSAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCB2bS0+Zm9ybWF0KSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChmID49IE9WNTExX05VTUZSQU1FUykgewotCQkJZXJyKCJWSURJT0NNQ0FQVFVSRTogaW52YWxpZCBmcmFtZSAoJWQpIiwgZik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICh2bS0+d2lkdGggPiBvdi0+bWF4d2lkdGgKLQkJICAgIHx8IHZtLT5oZWlnaHQgPiBvdi0+bWF4aGVpZ2h0KSB7Ci0JCQllcnIoIlZJRElPQ01DQVBUVVJFOiByZXF1ZXN0ZWQgZGltZW5zaW9ucyB0b28gYmlnIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChvdi0+ZnJhbWVbZl0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKSB7Ci0JCQlQREVCVUcoNCwgIlZJRElPQ01DQVBUVVJFOiBhbHJlYWR5IGdyYWJiaW5nIik7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQkJaWYgKGZvcmNlX3BhbGV0dGUgJiYgKHZtLT5mb3JtYXQgIT0gZm9yY2VfcGFsZXR0ZSkpIHsKLQkJCVBERUJVRygyLCAicGFsZXR0ZSByZWplY3RlZCAoJXMpIiwKLQkJCSAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCB2bS0+Zm9ybWF0KSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICgob3YtPmZyYW1lW2ZdLndpZHRoICE9IHZtLT53aWR0aCkgfHwKLQkJICAgIChvdi0+ZnJhbWVbZl0uaGVpZ2h0ICE9IHZtLT5oZWlnaHQpIHx8Ci0JCSAgICAob3YtPmZyYW1lW2ZdLmZvcm1hdCAhPSB2bS0+Zm9ybWF0KSB8fAotCQkgICAgKG92LT5mcmFtZVtmXS5zdWJfZmxhZyAhPSBvdi0+c3ViX2ZsYWcpIHx8Ci0JCSAgICAob3YtPmZyYW1lW2ZdLmRlcHRoICE9IGRlcHRoKSkgewotCQkJUERFQlVHKDQsICJWSURJT0NNQ0FQVFVSRTogY2hhbmdlIGluIGltYWdlIHBhcmFtZXRlcnMiKTsKLQotCQkJcmMgPSBvdjUxeF93YWl0X2ZyYW1lc19pbmFjdGl2ZShvdik7Ci0JCQlpZiAocmMpCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlyYyA9IG1vZGVfaW5pdF9yZWdzKG92LCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsCi0JCQkJdm0tPmZvcm1hdCwgb3YtPnN1Yl9mbGFnKTsKLSNpZiAwCi0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJUERFQlVHKDEsICJHb3QgZXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIHJlZ3MgIik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLSNlbmRpZgotCQkJb3YtPmZyYW1lW2ZdLndpZHRoID0gdm0tPndpZHRoOwotCQkJb3YtPmZyYW1lW2ZdLmhlaWdodCA9IHZtLT5oZWlnaHQ7Ci0JCQlvdi0+ZnJhbWVbZl0uZm9ybWF0ID0gdm0tPmZvcm1hdDsKLQkJCW92LT5mcmFtZVtmXS5zdWJfZmxhZyA9IG92LT5zdWJfZmxhZzsKLQkJCW92LT5mcmFtZVtmXS5kZXB0aCA9IGRlcHRoOwotCQl9Ci0KLQkJLyogTWFyayBpdCBhcyByZWFkeSAqLwotCQlvdi0+ZnJhbWVbZl0uZ3JhYnN0YXRlID0gRlJBTUVfUkVBRFk7Ci0KLQkJUERFQlVHKDQsICJWSURJT0NNQ0FQVFVSRTogcmVuZXdpbmcgZnJhbWUgJWQiLCBmKTsKLQotCQlyZXR1cm4gb3Y1MXhfbmV3X2ZyYW1lKG92LCBmKTsKLQl9Ci0JY2FzZSBWSURJT0NTWU5DOgotCXsKLQkJdW5zaWduZWQgaW50IGZudW0gPSAqKCh1bnNpZ25lZCBpbnQgKikgYXJnKTsKLQkJc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZTsKLQkJaW50IHJjOwotCi0JCWlmIChmbnVtID49IE9WNTExX05VTUZSQU1FUykgewotCQkJZXJyKCJWSURJT0NTWU5DOiBpbnZhbGlkIGZyYW1lICglZCkiLCBmbnVtKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZnJhbWUgPSAmb3YtPmZyYW1lW2ZudW1dOwotCi0JCVBERUJVRyg0LCAic3luY2luZyB0byBmcmFtZSAlZCwgZ3JhYnN0YXRlID0gJWQiLCBmbnVtLAotCQkgICAgICAgZnJhbWUtPmdyYWJzdGF0ZSk7Ci0KLQkJc3dpdGNoIChmcmFtZS0+Z3JhYnN0YXRlKSB7Ci0JCWNhc2UgRlJBTUVfVU5VU0VEOgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNhc2UgRlJBTUVfUkVBRFk6Ci0JCWNhc2UgRlJBTUVfR1JBQkJJTkc6Ci0JCWNhc2UgRlJBTUVfRVJST1I6Ci1yZWRvOgotCQkJaWYgKCFvdi0+ZGV2KQotCQkJCXJldHVybiAtRUlPOwotCi0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmcmFtZS0+d3EsCi0JCQkgICAgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRE9ORSkKLQkJCSAgICB8fCAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikpOwotCi0JCQlpZiAocmMpCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikgewotCQkJCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsIGZudW0pKSA8IDApCi0JCQkJCXJldHVybiByYzsKLQkJCQlnb3RvIHJlZG87Ci0JCQl9Ci0JCQkvKiBGYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBGUkFNRV9ET05FOgotCQkJaWYgKG92LT5zbmFwX2VuYWJsZWQgJiYgIWZyYW1lLT5zbmFwc2hvdCkgewotCQkJCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsIGZudW0pKSA8IDApCi0JCQkJCXJldHVybiByYzsKLQkJCQlnb3RvIHJlZG87Ci0JCQl9Ci0KLQkJCWZyYW1lLT5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7Ci0KLQkJCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBzbmFwc2hvdCBidXR0b24gKi8KLQkJCS8qIEZJWE1FIC0gSXMgdGhpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcz8gKi8KLQkJCWlmICgob3YtPnNuYXBfZW5hYmxlZCkgJiYgKGZyYW1lLT5zbmFwc2hvdCkpIHsKLQkJCQlmcmFtZS0+c25hcHNob3QgPSAwOwotCQkJCW92NTF4X2NsZWFyX3NuYXBzaG90KG92KTsKLQkJCX0KLQotCQkJLyogRGVjb21wcmVzc2lvbiwgZm9ybWF0IGNvbnZlcnNpb24sIGV0Yy4uLiAqLwotCQkJb3Y1MXhfcG9zdHByb2Nlc3Mob3YsIGZyYW1lKTsKLQotCQkJYnJlYWs7Ci0JCX0gLyogZW5kIHN3aXRjaCAqLwotCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ0dGQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmIgPSBhcmc7Ci0KLQkJUERFQlVHKDQsICJWSURJT0NHRkJVRiIpOwotCi0JCW1lbXNldCh2YiwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19idWZmZXIpKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NHVU5JVDoKLQl7Ci0JCXN0cnVjdCB2aWRlb191bml0ICp2dSA9IGFyZzsKLQotCQlQREVCVUcoNCwgIlZJRElPQ0dVTklUIik7Ci0KLQkJbWVtc2V0KHZ1LCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3VuaXQpKTsKLQotCQl2dS0+dmlkZW8gPSBvdi0+dmRldi0+bWlub3I7Ci0JCXZ1LT52YmkgPSBWSURFT19OT19VTklUOwotCQl2dS0+cmFkaW8gPSBWSURFT19OT19VTklUOwotCQl2dS0+YXVkaW8gPSBWSURFT19OT19VTklUOwotCQl2dS0+dGVsZXRleHQgPSBWSURFT19OT19VTklUOwotCi0JCXJldHVybiAwOwotCX0KLQljYXNlIE9WNTExSU9DX1dJMkM6Ci0JewotCQlzdHJ1Y3Qgb3Y1MTFfaTJjX3N0cnVjdCAqdyA9IGFyZzsKLQotCQlyZXR1cm4gaTJjX3dfc2xhdmUob3YsIHctPnNsYXZlLCB3LT5yZWcsIHctPnZhbHVlLCB3LT5tYXNrKTsKLQl9Ci0JY2FzZSBPVjUxMUlPQ19SSTJDOgotCXsKLQkJc3RydWN0IG92NTExX2kyY19zdHJ1Y3QgKnIgPSBhcmc7Ci0JCWludCByYzsKLQotCQlyYyA9IGkyY19yX3NsYXZlKG92LCByLT5zbGF2ZSwgci0+cmVnKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyLT52YWx1ZSA9IHJjOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGVmYXVsdDoKLQkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCBJT0N0bDogMHglWCIsIGNtZCk7Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfSAvKiBlbmQgc3dpdGNoICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLW92NTF4X3Y0bDFfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0JaW50IHJjOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmb3YtPmxvY2spKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JcmMgPSB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgb3Y1MXhfdjRsMV9pb2N0bF9pbnRlcm5hbCk7Ci0KLQltdXRleF91bmxvY2soJm92LT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1vdjUxeF92NGwxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBub2Jsb2NrID0gZmlsZS0+Zl9mbGFncyZPX05PTkJMT0NLOwotCXVuc2lnbmVkIGxvbmcgY291bnQgPSBjbnQ7Ci0Jc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlpbnQgaSwgcmMgPSAwLCBmcm14ID0gLTE7Ci0Jc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm92LT5sb2NrKSkKLQkJcmV0dXJuIC1FSU5UUjsKLQotCVBERUJVRyg0LCAiJWxkIGJ5dGVzLCBub2Jsb2NrPSVkIiwgY291bnQsIG5vYmxvY2spOwotCi0JaWYgKCF2ZGV2IHx8ICFidWYpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWlmICghb3YtPmRldikgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0vLyBGSVhNRTogT25seSBzdXBwb3J0cyB0d28gZnJhbWVzCi0JLyogU2VlIGlmIGEgZnJhbWUgaXMgY29tcGxldGVkLCB0aGVuIHVzZSBpdC4gKi8KLQlpZiAob3YtPmZyYW1lWzBdLmdyYWJzdGF0ZSA+PSBGUkFNRV9ET05FKQkvKiBfRE9ORSBvciBfRVJST1IgKi8KLQkJZnJteCA9IDA7Ci0JZWxzZSBpZiAob3YtPmZyYW1lWzFdLmdyYWJzdGF0ZSA+PSBGUkFNRV9ET05FKS8qIF9ET05FIG9yIF9FUlJPUiAqLwotCQlmcm14ID0gMTsKLQotCS8qIElmIG5vbmJsb2NraW5nIHdlIHJldHVybiBpbW1lZGlhdGVseSAqLwotCWlmIChub2Jsb2NrICYmIChmcm14ID09IC0xKSkgewotCQlyYyA9IC1FQUdBSU47Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogSWYgbm8gRlJBTUVfRE9ORSwgbG9vayBmb3IgYSBGUkFNRV9HUkFCQklORyBzdGF0ZS4gKi8KLQkvKiBTZWUgaWYgYSBmcmFtZSBpcyBpbiBwcm9jZXNzIChncmFiYmluZyksIHRoZW4gdXNlIGl0LiAqLwotCWlmIChmcm14ID09IC0xKSB7Ci0JCWlmIChvdi0+ZnJhbWVbMF0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKQotCQkJZnJteCA9IDA7Ci0JCWVsc2UgaWYgKG92LT5mcmFtZVsxXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpCi0JCQlmcm14ID0gMTsKLQl9Ci0KLQkvKiBJZiBubyBmcmFtZSBpcyBhY3RpdmUsIHN0YXJ0IG9uZS4gKi8KLQlpZiAoZnJteCA9PSAtMSkgewotCQlpZiAoKHJjID0gb3Y1MXhfbmV3X2ZyYW1lKG92LCBmcm14ID0gMCkpKSB7Ci0JCQllcnIoInJlYWQ6IG92NTF4X25ld19mcmFtZSBlcnJvciIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KLQotCWZyYW1lID0gJm92LT5mcmFtZVtmcm14XTsKLQotcmVzdGFydDoKLQlpZiAoIW92LT5kZXYpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIFdhaXQgd2hpbGUgd2UncmUgZ3JhYmJpbmcgdGhlIGltYWdlICovCi0JUERFQlVHKDQsICJXYWl0aW5nIGltYWdlIGdyYWJiaW5nIik7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZnJhbWUtPndxLAotCQkoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9ET05FKQotCQl8fCAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikpOwotCi0JaWYgKHJjKQotCQlnb3RvIGVycm9yOwotCi0JUERFQlVHKDQsICJHb3QgaW1hZ2UsIGZyYW1lLT5ncmFic3RhdGUgPSAlZCIsIGZyYW1lLT5ncmFic3RhdGUpOwotCVBERUJVRyg0LCAiYnl0ZXNfcmVjdmQgPSAlZCIsIGZyYW1lLT5ieXRlc19yZWN2ZCk7Ci0KLQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikgewotCQlmcmFtZS0+Ynl0ZXNfcmVhZCA9IDA7Ci0JCWVycigiKiogaWNrISAqKiBFcnJvcmVkIGZyYW1lICVkIiwgb3YtPmN1cmZyYW1lKTsKLQkJaWYgKG92NTF4X25ld19mcmFtZShvdiwgZnJteCkpIHsKLQkJCWVycigicmVhZDogb3Y1MXhfbmV3X2ZyYW1lIGVycm9yIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQotCS8qIFJlcGVhdCB1bnRpbCB3ZSBnZXQgYSBzbmFwc2hvdCBmcmFtZSAqLwotCWlmIChvdi0+c25hcF9lbmFibGVkKQotCQlQREVCVUcoNCwgIldhaXRpbmcgc25hcHNob3QgZnJhbWUiKTsKLQlpZiAob3YtPnNuYXBfZW5hYmxlZCAmJiAhZnJhbWUtPnNuYXBzaG90KSB7Ci0JCWZyYW1lLT5ieXRlc19yZWFkID0gMDsKLQkJaWYgKChyYyA9IG92NTF4X25ld19mcmFtZShvdiwgZnJteCkpKSB7Ci0JCQllcnIoInJlYWQ6IG92NTF4X25ld19mcmFtZSBlcnJvciIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIHNuYXBzaG90ICovCi0JaWYgKG92LT5zbmFwX2VuYWJsZWQgJiYgZnJhbWUtPnNuYXBzaG90KSB7Ci0JCWZyYW1lLT5zbmFwc2hvdCA9IDA7Ci0JCW92NTF4X2NsZWFyX3NuYXBzaG90KG92KTsKLQl9Ci0KLQkvKiBEZWNvbXByZXNzaW9uLCBmb3JtYXQgY29udmVyc2lvbiwgZXRjLi4uICovCi0Jb3Y1MXhfcG9zdHByb2Nlc3Mob3YsIGZyYW1lKTsKLQotCVBERUJVRyg0LCAiZnJteD0lZCwgYnl0ZXNfcmVhZD0lbGQsIGxlbmd0aD0lbGQiLCBmcm14LAotCQlmcmFtZS0+Ynl0ZXNfcmVhZCwKLQkJZ2V0X2ZyYW1lX2xlbmd0aChmcmFtZSkpOwotCi0JLyogY29weSBieXRlcyB0byB1c2VyIHNwYWNlOyB3ZSBhbGxvdyBmb3IgcGFydGlhbHMgcmVhZHMgKi8KLS8vCWlmICgoY291bnQgKyBmcmFtZS0+Ynl0ZXNfcmVhZCkKLS8vCSAgICA+IGdldF9mcmFtZV9sZW5ndGgoKHN0cnVjdCBvdjUxMV9mcmFtZSAqKWZyYW1lKSkKLS8vCQljb3VudCA9IGZyYW1lLT5zY2FubGVuZ3RoIC0gZnJhbWUtPmJ5dGVzX3JlYWQ7Ci0KLQkvKiBGSVhNRSAtIGNvdW50IGhhcmR3aXJlZCB0byBiZSBvbmUgZnJhbWUuLi4gKi8KLQljb3VudCA9IGdldF9mcmFtZV9sZW5ndGgoZnJhbWUpOwotCi0JUERFQlVHKDQsICJDb3B5IHRvIHVzZXIgc3BhY2U6ICVsZCBieXRlcyIsIGNvdW50KTsKLQlpZiAoKGkgPSBjb3B5X3RvX3VzZXIoYnVmLCBmcmFtZS0+ZGF0YSArIGZyYW1lLT5ieXRlc19yZWFkLCBjb3VudCkpKSB7Ci0JCVBERUJVRyg0LCAiQ29weSBmYWlsZWQhICVkIGJ5dGVzIG5vdCBjb3BpZWQiLCBpKTsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWZyYW1lLT5ieXRlc19yZWFkICs9IGNvdW50OwotCVBERUJVRyg0LCAie2NvcHl9IGNvdW50IHVzZWQ9JWxkLCBuZXcgYnl0ZXNfcmVhZD0lbGQiLAotCQljb3VudCwgZnJhbWUtPmJ5dGVzX3JlYWQpOwotCi0JLyogSWYgYWxsIGRhdGEgaGF2ZSBiZWVuIHJlYWQuLi4gKi8KLQlpZiAoZnJhbWUtPmJ5dGVzX3JlYWQKLQkgICAgPj0gZ2V0X2ZyYW1lX2xlbmd0aChmcmFtZSkpIHsKLQkJZnJhbWUtPmJ5dGVzX3JlYWQgPSAwOwotCi0vLyBGSVhNRTogT25seSBzdXBwb3J0cyB0d28gZnJhbWVzCi0JCS8qIE1hcmsgaXQgYXMgYXZhaWxhYmxlIHRvIGJlIHVzZWQgYWdhaW4uICovCi0JCW92LT5mcmFtZVtmcm14XS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7Ci0JCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsICFmcm14KSkpIHsKLQkJCWVycigib3Y1MXhfbmV3X2ZyYW1lIHJldHVybmVkIGVycm9yIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCi0JUERFQlVHKDQsICJyZWFkIGZpbmlzaGVkLCByZXR1cm5pbmcgJWxkIChzd2VldCkiLCBjb3VudCk7Ci0KLQltdXRleF91bmxvY2soJm92LT5sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci0KLWVycm9yOgotCW11dGV4X3VubG9jaygmb3YtPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludAotb3Y1MXhfdjRsMV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0Jc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKLQotCWlmIChvdi0+ZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUlPOwotCi0JUERFQlVHKDQsICJtbWFwOiAlbGQgKCVsWCkgYnl0ZXMiLCBzaXplLCBzaXplKTsKLQotCWlmIChzaXplID4gKCgoT1Y1MTFfTlVNRlJBTUVTCi0JCSAgICAgICogTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpCi0JCSAgICAgICsgUEFHRV9TSVpFIC0gMSkgJiB+KFBBR0VfU0laRSAtIDEpKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmb3YtPmxvY2spKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JcG9zID0gKHVuc2lnbmVkIGxvbmcpb3YtPmZidWY7Ci0Jd2hpbGUgKHNpemUgPiAwKSB7Ci0JCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7Ci0JCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpIHsKLQkJCW11dGV4X3VubG9jaygmb3YtPmxvY2spOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQkJc3RhcnQgKz0gUEFHRV9TSVpFOwotCQlwb3MgKz0gUEFHRV9TSVpFOwotCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKLQkJCXNpemUgLT0gUEFHRV9TSVpFOwotCQllbHNlCi0JCQlzaXplID0gMDsKLQl9Ci0KLQltdXRleF91bmxvY2soJm92LT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBvdjUxMV9mb3BzID0gewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5vcGVuID0JCW92NTF4X3Y0bDFfb3BlbiwKLQkucmVsZWFzZSA9CW92NTF4X3Y0bDFfY2xvc2UsCi0JLnJlYWQgPQkJb3Y1MXhfdjRsMV9yZWFkLAotCS5tbWFwID0JCW92NTF4X3Y0bDFfbW1hcCwKLQkuaW9jdGwgPQlvdjUxeF92NGwxX2lvY3RsLAotfTsKLQotc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdmRldl90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9CQkiT1Y1MTEgVVNCIENhbWVyYSIsCi0JLmZvcHMgPQkJJm92NTExX2ZvcHMsCi0JLnJlbGVhc2UgPQl2aWRlb19kZXZpY2VfcmVsZWFzZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogT1Y1MTEgYW5kIHNlbnNvciBjb25maWd1cmF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y3NjEwLCBPVjc2MjAsIG9yIE9WNzZCRSBzZW5zb3IuIFRoZSBPVjc2QkUgdXNlcwotICogdGhlIHNhbWUgcmVnaXN0ZXIgc2V0dGluZ3MgYXMgdGhlIE9WNzYxMCwgc2luY2UgdGhleSBhcmUgdmVyeSBzaW1pbGFyLgotICovCi1zdGF0aWMgaW50Ci1vdjd4eDBfY29uZmlndXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCWludCBpLCBzdWNjZXNzOwotCWludCByYzsKLQotCS8qIExhd3JlbmNlIEdsYWlzdGVyIDxsZ0BqZm0uYmMuY2E+IHJlcG9ydHM6Ci0JICoKLQkgKiBSZWdpc3RlciAweDBmIGluIHRoZSA3NjEwIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6Ci0JICoKLQkgKiAweDg1IChBRUMgbWV0aG9kIDEpOiBCZXN0IG92ZXJhbGwsIGdvb2QgY29udHJhc3QgcmFuZ2UKLQkgKiAweDQ1IChBRUMgbWV0aG9kIDIpOiBWZXJ5IG92ZXJleHBvc2VkCi0JICogMHhhNSAoc3BlYyBzaGVldCBkZWZhdWx0KTogT2ssIGJ1dCB0aGUgYmxhY2sgbGV2ZWwgaXMKLQkgKglzaGlmdGVkIHJlc3VsdGluZyBpbiBsb3NzIG9mIGNvbnRyYXN0Ci0JICogMHgwNSAob2xkIGRyaXZlciBzZXR0aW5nKTogdmVyeSBvdmVyZXhwb3NlZCwgdG9vIG11Y2gKLQkgKgljb250cmFzdAotCSAqLwotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm03NjEwW10gPSB7Ci0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMCwgMHhmZiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDYgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDI0IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyYiwgMHhhYyB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTIsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDM4LCAweDgxIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyOCwgMHgyNCB9LAkvKiAwYyAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MGYsIDB4ODUgfSwJLyogbGcncyBzZXR0aW5nICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxNSwgMHgwMSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MjAsIDB4MWMgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDIzLCAweDJhIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyNCwgMHgxMCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MjUsIDB4OGEgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDI2LCAweGEyIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyNywgMHhjMiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MmEsIDB4MDQgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDJjLCAweGZlIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyZCwgMHg5MyB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MzAsIDB4NzEgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDMxLCAweDYwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgzMiwgMHgyNiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MzMsIDB4MjAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDM0LCAweDQ4IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgyNCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTEsIDB4MDEgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgyNCB9LAotCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKLQl9OwotCi0Jc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTc2MjBbXSA9IHsKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDAwLCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwMSwgMHg4MCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MDIsIDB4ODAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDAzLCAweGMwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwNiwgMHg2MCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MDcsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwYywgMHgyNCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MGQsIDB4MjQgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDExLCAweDAxIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgyNCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTMsIDB4MDEgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDE0LCAweDg0IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxNSwgMHgwMSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDMgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDE3LCAweDJmIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxOCwgMHhjZiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTksIDB4MDYgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDFhLCAweGY1IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxYiwgMHgwMCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MjAsIDB4MTggfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDIxLCAweDgwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyMiwgMHg4MCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MjMsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDI2LCAweGEyIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyNywgMHhlYSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MjgsIDB4MjAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDI5LCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyYSwgMHgxMCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MmIsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDJjLCAweDg4IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyZCwgMHg5MSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MmUsIDB4ODAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDJmLCAweDQ0IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg2MCwgMHgyNyB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NjEsIDB4MDIgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDYyLCAweDVmIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg2MywgMHhkNSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NjQsIDB4NTcgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDY1LCAweDgzIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg2NiwgMHg1NSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NjcsIDB4OTIgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDY4LCAweGNmIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg2OSwgMHg3NiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NmEsIDB4MjIgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDZiLCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg2YywgMHgwMiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NmQsIDB4NDQgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDZlLCAweDgwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg2ZiwgMHgxZCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NzAsIDB4OGIgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDcxLCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg3MiwgMHgxNCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NzMsIDB4NTQgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDc0LCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg3NSwgMHg4ZSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NzYsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDc3LCAweGZmIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg3OCwgMHg4MCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NzksIDB4ODAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDdhLCAweDgwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg3YiwgMHhlMiB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4N2MsIDB4MDAgfSwKLQkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCi0JfTsKLQotCVBERUJVRyg0LCAic3RhcnRpbmcgY29uZmlndXJhdGlvbiIpOwotCi0JLyogVGhpcyBsb29rcyByZWR1bmRhbnQsIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIFdlYkNhbSAzICovCi0Jb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y3eHgwX1NJRDsKLQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y3eHgwX1NJRCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpID49IDApIHsKLQkJUERFQlVHKDEsICJPVjd4eDAgc2Vuc29yIGluaXRhbGl6ZWQgKG1ldGhvZCAxKSIpOwotCX0gZWxzZSB7Ci0JCS8qIFJlc2V0IHRoZSA3Nnh4ICovCi0JCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCi0JCS8qIFdhaXQgZm9yIGl0IHRvIGluaXRpYWxpemUgKi8KLQkJbXNsZWVwKDE1MCk7Ci0KLQkJaSA9IDA7Ci0JCXN1Y2Nlc3MgPSAwOwotCQl3aGlsZSAoaSA8PSBpMmNfZGV0ZWN0X3RyaWVzKSB7Ci0JCQlpZiAoKGkyY19yKG92LCBPVjc2MTBfUkVHX0lEX0hJR0gpID09IDB4N0YpICYmCi0JCQkgICAgKGkyY19yKG92LCBPVjc2MTBfUkVHX0lEX0xPVykgPT0gMHhBMikpIHsKLQkJCQlzdWNjZXNzID0gMTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLS8vIFdhcyAoaSA9PSBpMmNfZGV0ZWN0X3RyaWVzKSBwcmV2aW91c2x5LiBUaGlzIG9idmlvdXNseSB1c2VkIHRvIGFsd2F5cyByZXBvcnQKLS8vIHN1Y2Nlc3MuIFdoZXRoZXIgYW55b25lIGFjdHVhbGx5IGRlcGVuZGVkIG9uIHRoYXQgYnVnIGlzIHVua25vd24KLQkJaWYgKChpID49IGkyY19kZXRlY3RfdHJpZXMpICYmIChzdWNjZXNzID09IDApKSB7Ci0JCQllcnIoIkZhaWxlZCB0byByZWFkIHNlbnNvciBJRC4gWW91IG1pZ2h0IG5vdCBoYXZlIGFuIik7Ci0JCQllcnIoIk9WNzYxMC8yMCwgb3IgaXQgbWF5IGJlIG5vdCByZXNwb25kaW5nLiBSZXBvcnQiKTsKLQkJCWVycigidGhpcyB0byAiIEVNQUlMKTsKLQkJCWVycigiVGhpcyBpcyBvbmx5IGEgd2FybmluZy4gWW91IGNhbiBhdHRlbXB0IHRvIHVzZSIpOwotCQkJZXJyKCJ5b3VyIGNhbWVyYSBhbnl3YXkiKTsKLS8vIE9ubHkgaXNzdWUgYSB3YXJuaW5nIGZvciBub3cKLS8vCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJUERFQlVHKDEsICJPVjd4eDAgaW5pdGlhbGl6ZWQgKG1ldGhvZCAyLCAlZHgpIiwgaSsxKTsKLQkJfQotCX0KLQotCS8qIERldGVjdCBzZW5zb3IgKHN1Yil0eXBlICovCi0JcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19DT01fSSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCWVycigiRXJyb3IgZGV0ZWN0aW5nIHNlbnNvciB0eXBlIik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKChyYyAmIDMpID09IDMpIHsKLQkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlNlbnNvciBpcyBhbiBPVjc2MTBcbiIpOwotCQlvdi0+c2Vuc29yID0gU0VOX09WNzYxMDsKLQl9IGVsc2UgaWYgKChyYyAmIDMpID09IDEpIHsKLQkJLyogSSBkb24ndCBrbm93IHdoYXQncyBkaWZmZXJlbnQgYWJvdXQgdGhlIDc2QkUgeWV0LiAqLwotCQlpZiAoaTJjX3Iob3YsIDB4MTUpICYgMSkKLQkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y3NjIwQUVcbiIpOwotCQllbHNlCi0JCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU2Vuc29yIGlzIGFuIE9WNzZCRVxuIik7Ci0KLQkJLyogT1Y1MTErIHdpbGwgcmV0dXJuIGFsbCB6ZXJvIGlzb2MgZGF0YSB1bmxlc3Mgd2UKLQkJICogY29uZmlndXJlIHRoZSBzZW5zb3IgYXMgYSA3NjIwLiBTb21lb25lIG5lZWRzIHRvCi0JCSAqIGZpbmQgdGhlIGV4YWN0IHJlZy4gc2V0dGluZyB0aGF0IGNhdXNlcyB0aGlzLiAqLwotCQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7Ci0JCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LAotCQkJCSAiRW5hYmxpbmcgNTExKy83NjIwQUUgd29ya2Fyb3VuZFxuIik7Ci0JCQlvdi0+c2Vuc29yID0gU0VOX09WNzYyMDsKLQkJfSBlbHNlIHsKLQkJCW92LT5zZW5zb3IgPSBTRU5fT1Y3NkJFOwotCQl9Ci0JfSBlbHNlIGlmICgocmMgJiAzKSA9PSAwKSB7Ci0JCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y3NjIwXG4iKTsKLQkJb3YtPnNlbnNvciA9IFNFTl9PVjc2MjA7Ci0JfSBlbHNlIHsKLQkJZXJyKCJVbmtub3duIGltYWdlIHNlbnNvciB2ZXJzaW9uOiAlZCIsIHJjICYgMyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjIwKSB7Ci0JCVBERUJVRyg0LCAiV3JpdGluZyA3NjIwIHJlZ2lzdGVycyIpOwotCQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtNzYyMCkpCi0JCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJUERFQlVHKDQsICJXcml0aW5nIDc2MTAgcmVnaXN0ZXJzIik7Ci0JCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm03NjEwKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBTZXQgc2Vuc29yLXNwZWNpZmljIHZhcnMgKi8KLQlvdi0+bWF4d2lkdGggPSA2NDA7Ci0Jb3YtPm1heGhlaWdodCA9IDQ4MDsKLQlvdi0+bWlud2lkdGggPSA2NDsKLQlvdi0+bWluaGVpZ2h0ID0gNDg7Ci0KLQkvLyBGSVhNRTogVGhlc2UgZG8gbm90IG1hdGNoIHRoZSBhY3R1YWwgc2V0dGluZ3MgeWV0Ci0Jb3YtPmJyaWdodG5lc3MgPSAweDgwIDw8IDg7Ci0Jb3YtPmNvbnRyYXN0ID0gMHg4MCA8PCA4OwotCW92LT5jb2xvdXIgPSAweDgwIDw8IDg7Ci0Jb3YtPmh1ZSA9IDB4ODAgPDwgODsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjY2MjAsIE9WNjYzMCwgT1Y2NjMwQUUsIG9yIE9WNjYzMEFGIHNlbnNvci4gKi8KLXN0YXRpYyBpbnQKLW92Nnh4MF9jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IHJjOwotCi0Jc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTZ4MjBbXSA9IHsKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDgwIH0sIC8qIHJlc2V0ICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMSwgMHgwMSB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MDMsIDB4NjAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDA1LCAweDdmIH0sIC8qIEZvciB3aGVuIGF1dG9hZGp1c3QgaXMgb2ZmICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwNywgMHhhOCB9LAotCQkvKiBUaGUgcmF0aW8gb2YgMHgwYyBhbmQgMHgwZCAgY29udHJvbHMgdGhlIHdoaXRlIHBvaW50ICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwYywgMHgyNCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MGQsIDB4MjQgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDBmLCAweDE1IH0sIC8qIENPTVMgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDEwLCAweDc1IH0sIC8qIEFFQyBFeHBvc3VyZSB0aW1lICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgyNCB9LCAvKiBFbmFibGUgQUdDICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxNCwgMHgwNCB9LAotCQkvKiAweDE2OiAweDA2IGhlbHBzIGZyYW1lIHN0YWJpbGl0eSB3aXRoIG1vdmluZyBvYmplY3RzICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxNiwgMHgwNiB9LAotLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHgyMCwgMHgzMCB9LCAvKiBBcGVydHVyZSBjb3JyZWN0aW9uIGVuYWJsZSAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MjYsIDB4YjIgfSwgLyogQkxDIGVuYWJsZSAqLwotCQkvKiAweDI4OiAweDA1IFNlbGVjdHMgUkdCIGZvcm1hdCBpZiBSR0Igb24gKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDA1IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgyYSwgMHgwNCB9LCAvKiBEaXNhYmxlIGZyYW1lcmF0ZSBhZGp1c3QgKi8KLS8vCQl7IE9WNTExX0kyQ19CVVMsIDB4MmIsIDB4YWMgfSwgLyogRnJhbWVyYXRlOyBTZXQgMmFbN10gZmlyc3QgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDJkLCAweDk5IH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgzMywgMHhhMCB9LCAvKiBDb2xvciBQcm9jZXNzaW5nIFBhcmFtZXRlciAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MzQsIDB4ZDIgfSwgLyogTWF4IEEvRCByYW5nZSAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MzgsIDB4OGIgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDM5LCAweDQwIH0sCi0KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDNjLCAweDM5IH0sIC8qIEVuYWJsZSBBRUMgbW9kZSBjaGFuZ2luZyAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4M2MsIDB4M2MgfSwgLyogQ2hhbmdlIEFFQyBtb2RlICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgzYywgMHgyNCB9LCAvKiBEaXNhYmxlIEFFQyBtb2RlIGNoYW5naW5nICovCi0KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDNkLCAweDgwIH0sCi0JCS8qIFRoZXNlIG5leHQgdHdvIHJlZ2lzdGVycyAoMHg0YSwgMHg0YikgYXJlIHVuZG9jdW1lbnRlZC4gVGhleQotCQkgKiBjb250cm9sIHRoZSBjb2xvciBiYWxhbmNlICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg0YSwgMHg4MCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4NGIsIDB4ODAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDRkLCAweGQyIH0sIC8qIFRoaXMgcmVkdWNlcyBub2lzZSBhIGJpdCAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4NGUsIDB4YzEgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDRmLCAweDA0IH0sCi0vLyBEbyA1MC01MyBoYXZlIGFueSBlZmZlY3Q/Ci0vLyBUb2dnbGUgMHgxMlsyXSBvZmYgYW5kIG9uIGhlcmU/Ci0JCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAkvKiBFTkQgTUFSS0VSICovCi0JfTsKLQotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm02eDMwW10gPSB7Ci0JLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHg4MCB9LCAvKiByZXNldCAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTEsIDB4MDAgfSwKLQkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDAzLCAweDYwIH0sCi0JLyowQT8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MDUsIDB4N2YgfSwgLyogRm9yIHdoZW4gYXV0b2FkanVzdCBpcyBvZmYgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDA3LCAweGE4IH0sCi0JCS8qIFRoZSByYXRpbyBvZiAweDBjIGFuZCAweDBkICBjb250cm9scyB0aGUgd2hpdGUgcG9pbnQgKi8KLQkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCi0JLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgyNCB9LAotCS8qQSovCXsgT1Y1MTFfSTJDX0JVUywgMHgwZSwgMHgyMCB9LAotLy8JLyowND8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MTQsIDB4ODAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDE2LCAweDAzIH0sCi0vLwkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDIwLCAweDMwIH0sIC8qIEFwZXJ0dXJlIGNvcnJlY3Rpb24gZW5hYmxlICovCi0JCS8vIDIxICYgMjI/IFRoZSBzdWdnZXN0ZWQgdmFsdWVzIGxvb2sgd3JvbmcuIEdvIHdpdGggZGVmYXVsdAotCS8qQSovCXsgT1Y1MTFfSTJDX0JVUywgMHgyMywgMHhjMCB9LAotCS8qQSovCXsgT1Y1MTFfSTJDX0JVUywgMHgyNSwgMHg5YSB9LCAvLyBDaGVjayB0aGlzIGFnYWluc3QgZGVmYXVsdAotLy8JLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgyNiwgMHhiMiB9LCAvKiBCTEMgZW5hYmxlICovCi0KLQkJLyogMHgyODogMHgwNSBTZWxlY3RzIFJHQiBmb3JtYXQgaWYgUkdCIG9uICovCi0vLwkvKjA0PyovCXsgT1Y1MTFfSTJDX0JVUywgMHgyOCwgMHgwNSB9LAotLy8JLyowND8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MjgsIDB4NDUgfSwgLy8gREVCVUc6IFRyaXN0YXRlIFVWIGJ1cwotCi0JLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgyYSwgMHgwNCB9LCAvKiBEaXNhYmxlIGZyYW1lcmF0ZSBhZGp1c3QgKi8KLS8vCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MmIsIDB4YWMgfSwgLyogRnJhbWVyYXRlOyBTZXQgMmFbN10gZmlyc3QgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDJkLCAweDk5IH0sCi0vLwkvKkEqLwl7IE9WNTExX0kyQ19CVVMsIDB4MzMsIDB4MjYgfSwgLy8gUmVzZXJ2ZWQgYml0cyBvbiA2NjIwCi0vLwkvKmQyPyovCXsgT1Y1MTFfSTJDX0JVUywgMHgzNCwgMHgwMyB9LCAvKiBNYXggQS9EIHJhbmdlICovCi0vLwkvKjhiPyovCXsgT1Y1MTFfSTJDX0JVUywgMHgzOCwgMHg4MyB9LAotLy8JLyo0MD8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MzksIDB4YzAgfSwgLy8gNjYzMCBhZGRzIGJpdCA3Ci0vLwkJeyBPVjUxMV9JMkNfQlVTLCAweDNjLCAweDM5IH0sIC8qIEVuYWJsZSBBRUMgbW9kZSBjaGFuZ2luZyAqLwotLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHgzYywgMHgzYyB9LCAvKiBDaGFuZ2UgQUVDIG1vZGUgKi8KLS8vCQl7IE9WNTExX0kyQ19CVVMsIDB4M2MsIDB4MjQgfSwgLyogRGlzYWJsZSBBRUMgbW9kZSBjaGFuZ2luZyAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4M2QsIDB4ODAgfSwKLS8vCS8qQSovCXsgT1Y1MTFfSTJDX0JVUywgMHgzZiwgMHgwZSB9LAotCi0JCS8qIFRoZXNlIG5leHQgdHdvIHJlZ2lzdGVycyAoMHg0YSwgMHg0YikgYXJlIHVuZG9jdW1lbnRlZC4gVGhleQotCQkgKiBjb250cm9sIHRoZSBjb2xvciBiYWxhbmNlICovCi0vLwkvKk9LPyovCXsgT1Y1MTFfSTJDX0JVUywgMHg0YSwgMHg4MCB9LCAvLyBDaGVjayB0aGVzZQotLy8JLypPSz8qLwl7IE9WNTExX0kyQ19CVVMsIDB4NGIsIDB4ODAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDRkLCAweDEwIH0sIC8qIFUgPSAwLjU2M3UsIFYgPSAwLjcxNHYgKi8KLQkvKmMxPyovCXsgT1Y1MTFfSTJDX0JVUywgMHg0ZSwgMHg0MCB9LAotCi0JCS8qIFVWIGF2ZXJhZ2UgbW9kZSwgY29sb3Iga2lsbGVyOiBzdHJvbmdlc3QgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDRmLCAweDA3IH0sCi0KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDU0LCAweDIzIH0sIC8qIE1heCBBR0MgZ2FpbjogMThkQiAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4NTcsIDB4ODEgfSwgLyogKGRlZmF1bHQpICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg1OSwgMHgwMSB9LCAvKiBBR0MgZGFyayBjdXJyZW50IGNvbXA6ICsxICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHg1YSwgMHgyYyB9LCAvKiAodW5kb2N1bWVudGVkKSAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4NWIsIDB4MGYgfSwgLyogQVdCIGNocm9taW5hbmNlIGxldmVscyAqLwotLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHg1YywgMHgxMCB9LAotCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwJLyogRU5EIE1BUktFUiAqLwotCX07Ci0KLQlQREVCVUcoNCwgInN0YXJ0aW5nIHNlbnNvciBjb25maWd1cmF0aW9uIik7Ci0KLQlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpIDwgMCkgewotCQllcnIoIkZhaWxlZCB0byByZWFkIHNlbnNvciBJRC4gWW91IG1pZ2h0IG5vdCBoYXZlIGFuIE9WNnh4MCwiKTsKLQkJZXJyKCJvciBpdCBtYXkgYmUgbm90IHJlc3BvbmRpbmcuIFJlcG9ydCB0aGlzIHRvICIgRU1BSUwpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJUERFQlVHKDEsICJPVjZ4eDAgc2Vuc29yIGRldGVjdGVkIik7Ci0JfQotCi0JLyogRGV0ZWN0IHNlbnNvciAoc3ViKXR5cGUgKi8KLQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX0NPTV9JKTsKLQotCWlmIChyYyA8IDApIHsKLQkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHR5cGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICgocmMgJiAzKSA9PSAwKSB7Ci0JCW92LT5zZW5zb3IgPSBTRU5fT1Y2NjMwOwotCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU2Vuc29yIGlzIGFuIE9WNjYzMFxuIik7Ci0JfSBlbHNlIGlmICgocmMgJiAzKSA9PSAxKSB7Ci0JCW92LT5zZW5zb3IgPSBTRU5fT1Y2NjIwOwotCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU2Vuc29yIGlzIGFuIE9WNjYyMFxuIik7Ci0JfSBlbHNlIGlmICgocmMgJiAzKSA9PSAyKSB7Ci0JCW92LT5zZW5zb3IgPSBTRU5fT1Y2NjMwOwotCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU2Vuc29yIGlzIGFuIE9WNjYzMEFFXG4iKTsKLQl9IGVsc2UgaWYgKChyYyAmIDMpID09IDMpIHsKLQkJb3YtPnNlbnNvciA9IFNFTl9PVjY2MzA7Ci0JCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y2NjMwQUZcbiIpOwotCX0KLQotCS8qIFNldCBzZW5zb3Itc3BlY2lmaWMgdmFycyAqLwotCW92LT5tYXh3aWR0aCA9IDM1MjsKLQlvdi0+bWF4aGVpZ2h0ID0gMjg4OwotCW92LT5taW53aWR0aCA9IDY0OwotCW92LT5taW5oZWlnaHQgPSA0ODsKLQotCS8vIEZJWE1FOiBUaGVzZSBkbyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBzZXR0aW5ncyB5ZXQKLQlvdi0+YnJpZ2h0bmVzcyA9IDB4ODAgPDwgODsKLQlvdi0+Y29udHJhc3QgPSAweDgwIDw8IDg7Ci0Jb3YtPmNvbG91ciA9IDB4ODAgPDwgODsKLQlvdi0+aHVlID0gMHg4MCA8PCA4OwotCi0JaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNjYyMCkgewotCQlQREVCVUcoNCwgIldyaXRpbmcgNngyMCByZWdpc3RlcnMiKTsKLQkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTZ4MjApKQotCQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCVBERUJVRyg0LCAiV3JpdGluZyA2eDMwIHJlZ2lzdGVycyIpOwotCQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtNngzMCkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIEtTMDEyNyBhbmQgS1MwMTI3QiB2aWRlbyBkZWNvZGVycy4gKi8KLXN0YXRpYyBpbnQKLWtzMDEyN19jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IHJjOwotCi0vLyBGSVhNRTogSSBkb24ndCBrbm93IGhvdyB0byBzeW5jIG9yIHJlc2V0IGl0IHlldAotI2lmIDAKLQlpZiAob3Y1MXhfaW5pdF9rc19zZW5zb3Iob3YpIDwgMCkgewotCQllcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBLUzAxMjciKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCVBERUJVRygxLCAiS1MwMTJ4KEIpIHNlbnNvciBkZXRlY3RlZCIpOwotCX0KLSNlbmRpZgotCi0JLyogRGV0ZWN0IGRlY29kZXIgc3VidHlwZSAqLwotCXJjID0gaTJjX3Iob3YsIDB4MDApOwotCWlmIChyYyA8IDApIHsKLQkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHR5cGUiKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAocmMgJiAweDA4KSB7Ci0JCXJjID0gaTJjX3Iob3YsIDB4M2QpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQllcnIoIkVycm9yIGRldGVjdGluZyBzZW5zb3IgdHlwZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgaWYgKChyYyAmIDB4MGYpID09IDApIHsKLQkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYSBLUzAxMjdcbiIpOwotCQkJb3YtPnNlbnNvciA9IFNFTl9LUzAxMjc7Ci0JCX0gZWxzZSBpZiAoKHJjICYgMHgwZikgPT0gOSkgewotCQkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlNlbnNvciBpcyBhIEtTMDEyN0IgUmV2LiBBXG4iKTsKLQkJCW92LT5zZW5zb3IgPSBTRU5fS1MwMTI3QjsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycigiRXJyb3I6IFNlbnNvciBpcyBhbiB1bnN1cHBvcnRlZCBLUzAxMjIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFNldCBzZW5zb3Itc3BlY2lmaWMgdmFycyAqLwotCW92LT5tYXh3aWR0aCA9IDY0MDsKLQlvdi0+bWF4aGVpZ2h0ID0gNDgwOwotCW92LT5taW53aWR0aCA9IDY0OwotCW92LT5taW5oZWlnaHQgPSA0ODsKLQotCS8vIEZJWE1FOiBUaGVzZSBkbyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBzZXR0aW5ncyB5ZXQKLQlvdi0+YnJpZ2h0bmVzcyA9IDB4ODAgPDwgODsKLQlvdi0+Y29udHJhc3QgPSAweDgwIDw8IDg7Ci0Jb3YtPmNvbG91ciA9IDB4ODAgPDwgODsKLQlvdi0+aHVlID0gMHg4MCA8PCA4OwotCi0JLyogVGhpcyBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIEJhaWwgb3V0IG5vdy4uLiAqLwotCWVycigiVGhpcyBzZW5zb3IgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7Ci0JcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIFNBQTcxMTFBIHZpZGVvIGRlY29kZXIuICovCi1zdGF0aWMgaW50Ci1zYWE3MTExYV9jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCi17Ci0JaW50IHJjOwotCi0JLyogU2luY2UgdGhlcmUgaXMgbm8gcmVnaXN0ZXIgcmVzZXQgY29tbWFuZCwgYWxsIHJlZ2lzdGVycyBtdXN0IGJlCi0JICogd3JpdHRlbiwgb3RoZXJ3aXNlIGdpdmVzIGVycmF0aWMgcmVzdWx0cyAqLwotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm1TQUE3MTExQVtdID0gewotCQl7IE9WNTExX0kyQ19CVVMsIDB4MDYsIDB4Y2UgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDA3LCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMCwgMHg0NCB9LCAvKiBZVVY0MjIsIDI0MC8yODYgbGluZXMgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDBlLCAweDAxIH0sIC8qIE5UU0MgTSBvciBQQUwgQkdISSAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MDAsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDAxLCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwMywgMHgyMyB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MDQsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDA1LCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwOCwgMHhjOCB9LCAvKiBBdXRvIGZpZWxkIGZyZXEgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDA5LCAweDAxIH0sIC8qIENocm9tLiB0cmFwIG9mZiwgQVBFUj0wLjI1ICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwYSwgMHg4MCB9LCAvKiBCUklHPTEyOCAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MGIsIDB4NDAgfSwgLyogQ09OVD0xLjAgKi8KLQkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDQwIH0sIC8qIFNBVE49MS4wICovCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgwMCB9LCAvKiBIVUU9MCAqLwotCQl7IE9WNTExX0kyQ19CVVMsIDB4MGYsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDExLCAweDBjIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgwMCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTMsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDE0LCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgxNSwgMHgwMCB9LAotCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDAgfSwKLQkJeyBPVjUxMV9JMkNfQlVTLCAweDE3LCAweDAwIH0sCi0JCXsgT1Y1MTFfSTJDX0JVUywgMHgwMiwgMHhjMCB9LAkvKiBDb21wb3NpdGUgaW5wdXQgMCAqLwotCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKLQl9OwotCi0vLyBGSVhNRTogSSBkb24ndCBrbm93IGhvdyB0byBzeW5jIG9yIHJlc2V0IGl0IHlldAotI2lmIDAKLQlpZiAob3Y1MXhfaW5pdF9zYWFfc2Vuc29yKG92KSA8IDApIHsKLQkJZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU0FBNzExMUEiKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCVBERUJVRygxLCAiU0FBNzExMUEgc2Vuc29yIGRldGVjdGVkIik7Ci0JfQotI2VuZGlmCi0KLQkvKiA2NDB4NDgwIG5vdCBzdXBwb3J0ZWQgd2l0aCBQQUwgKi8KLQlpZiAob3YtPnBhbCkgewotCQlvdi0+bWF4d2lkdGggPSAzMjA7Ci0JCW92LT5tYXhoZWlnaHQgPSAyNDA7CQkvKiBFdmVuIGZpZWxkIG9ubHkgKi8KLQl9IGVsc2UgewotCQlvdi0+bWF4d2lkdGggPSA2NDA7Ci0JCW92LT5tYXhoZWlnaHQgPSA0ODA7CQkvKiBFdmVuL09kZCBmaWVsZHMgKi8KLQl9Ci0KLQlvdi0+bWlud2lkdGggPSAzMjA7Ci0Jb3YtPm1pbmhlaWdodCA9IDI0MDsJCS8qIEV2ZW4gZmllbGQgb25seSAqLwotCi0Jb3YtPmhhc19kZWNvZGVyID0gMTsKLQlvdi0+bnVtX2lucHV0cyA9IDg7Ci0Jb3YtPm5vcm0gPSBWSURFT19NT0RFX0FVVE87Ci0Jb3YtPnN0b3BfZHVyaW5nX3NldCA9IDA7CS8qIERlY29kZXIgZ3VhcmFudGVlcyBzdGFibGUgaW1hZ2UgKi8KLQotCS8qIERlY29kZXIgZG9lc24ndCBjaGFuZ2UgdGhlc2UgdmFsdWVzLCBzbyB3ZSB1c2UgdGhlc2UgaW5zdGVhZCBvZgotCSAqIGFjdXRhbGx5IHJlYWRpbmcgdGhlIHJlZ2lzdGVycyAod2hpY2ggZG9lc24ndCB3b3JrKSAqLwotCW92LT5icmlnaHRuZXNzID0gMHg4MCA8PCA4OwotCW92LT5jb250cmFzdCA9IDB4NDAgPDwgOTsKLQlvdi0+Y29sb3VyID0gMHg0MCA8PCA5OwotCW92LT5odWUgPSAzMjc2ODsKLQotCVBERUJVRyg0LCAiV3JpdGluZyBTQUE3MTExQSByZWdpc3RlcnMiKTsKLQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtU0FBNzExMUEpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBEZXRlY3QgdmVyc2lvbiBvZiBkZWNvZGVyLiBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB3cml0aW5nIHRoZQotCSAqIGluaXRpYWwgcmVncyBvciB0aGUgZGVjb2RlciB3aWxsIGxvY2sgdXAuICovCi0JcmMgPSBpMmNfcihvdiwgMHgwMCk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCWVycigiRXJyb3IgZGV0ZWN0aW5nIHNlbnNvciB2ZXJzaW9uIik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LAotCQkJICJTZW5zb3IgaXMgYW4gU0FBNzExMUEgKHZlcnNpb24gMHgleClcbiIsIHJjKTsKLQkJb3YtPnNlbnNvciA9IFNFTl9TQUE3MTExQTsKLQl9Ci0KLQkvLyBGSVhNRTogRml4IHRoaXMgZm9yIE9WNTE4KCspCi0JLyogTGF0Y2ggdG8gbmVnYXRpdmUgZWRnZSBvZiBjbG9jay4gT3RoZXJ3aXNlLCB3ZSBnZXQgaW5jb3JyZWN0Ci0JICogY29sb3JzIGFuZCBqaXR0ZXIgaW4gdGhlIGRpZ2l0YWwgc2lnbmFsLiAqLwotCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkKLQkJcmVnX3cob3YsIDB4MTEsIDB4MDApOwotCWVsc2UKLQkJZGV2X3dhcm4oJm92LT5kZXYtPmRldiwKLQkJCSAiU0FBNzExMUEgbm90IHlldCBzdXBwb3J0ZWQgd2l0aCBPVjUxOC9PVjUxOCtcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNTExL09WNTExKyBhbmQgdGhlIHNlbnNvciAqLwotc3RhdGljIGludAotb3Y1MTFfY29uZmlndXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc0luaXQ1MTFbXSA9IHsKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHg3ZiB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX0lOSVQsCQkweDAxIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4N2YgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHgwMSB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1JFU0VULAkweDNmIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfSU5JVCwJCTB4MDEgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHgzZCB9LAotCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDB9LAotCX07Ci0KLQlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNOb3JtNTExW10gPSB7Ci0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9EUkFNX0ZMT1dfQ1RMLCAJMHgwMSB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDIgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMCB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MTFfRklGT19PUFRTLAkweDFmIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9DT01QX0VOLAkJMHgwMCB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MTFfQ09NUF9MVVRfRU4sCTB4MDMgfSwKLQkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCi0JfTsKLQotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MTFQbHVzW10gPSB7Ci0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9EUkFNX0ZMT1dfQ1RMLAkweGZmIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDAgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMiB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9GSUZPX09QVFMsCTB4ZmYgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0NPTVBfRU4sCQkweDAwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9DT01QX0xVVF9FTiwJMHgwMyB9LAotCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKLQl9OwotCi0JUERFQlVHKDQsICIiKTsKLQotCW92LT5jdXN0b21pZCA9IHJlZ19yKG92LCBSNTExX1NZU19DVVNUX0lEKTsKLQlpZiAob3YtPmN1c3RvbWlkIDwgMCkgewotCQllcnIoIlVuYWJsZSB0byByZWFkIGNhbWVyYSBicmlkZ2UgcmVnaXN0ZXJzIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JUERFQlVHICgxLCAiQ3VzdG9tSUQgPSAlZCIsIG92LT5jdXN0b21pZCk7Ci0Jb3YtPmRlc2MgPSBzeW1ib2xpYyhjYW1saXN0LCBvdi0+Y3VzdG9taWQpOwotCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJtb2RlbDogJXNcbiIsIG92LT5kZXNjKTsKLQotCWlmICgwID09IHN0cmNtcChvdi0+ZGVzYywgTk9UX0RFRklORURfU1RSKSkgewotCQllcnIoIkNhbWVyYSB0eXBlICglZCkgbm90IHJlY29nbml6ZWQiLCBvdi0+Y3VzdG9taWQpOwotCQllcnIoIlBsZWFzZSBub3RpZnkgIiBFTUFJTCAiIG9mIHRoZSBuYW1lLCIpOwotCQllcnIoIm1hbnVmYWN0dXJlciwgbW9kZWwsIGFuZCB0aGlzIG51bWJlciBvZiB5b3VyIGNhbWVyYS4iKTsKLQkJZXJyKCJBbHNvIGluY2x1ZGUgdGhlIG91dHB1dCBvZiB0aGUgZGV0ZWN0aW9uIHByb2Nlc3MuIik7Ci0JfQotCi0JaWYgKG92LT5jdXN0b21pZCA9PSA3MCkJCS8qIFVTQiBMaWZlIFRWIChQQUwvU0VDQU0pICovCi0JCW92LT5wYWwgPSAxOwotCi0JaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzSW5pdDUxMSkpCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAob3YtPmxlZF9wb2xpY3kgPT0gTEVEX09GRiB8fCBvdi0+bGVkX3BvbGljeSA9PSBMRURfQVVUTykKLQkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDApOwotCi0JLyogVGhlIE9WNTExKyBoYXMgdW5kb2N1bWVudGVkIGJpdHMgaW4gdGhlIGZsb3cgY29udHJvbCByZWdpc3Rlci4KLQkgKiBTZXR0aW5nIGl0IHRvIDB4ZmYgZml4ZXMgdGhlIGNvcnJ1cHRpb24gd2l0aCBtb3Zpbmcgb2JqZWN0cy4gKi8KLQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTEpIHsKLQkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTUxMSkpCi0JCQlnb3RvIGVycm9yOwotCX0gZWxzZSBpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7Ci0JCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm01MTFQbHVzKSkKLQkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlIHsKLQkJZXJyKCJJbnZhbGlkIGJyaWRnZSIpOwotCX0KLQotCWlmIChvdjUxMV9pbml0X2NvbXByZXNzaW9uKG92KSkKLQkJZ290byBlcnJvcjsKLQotCW92LT5wYWNrZXRfbnVtYmVyaW5nID0gMTsKLQlvdjUxMV9zZXRfcGFja2V0X3NpemUob3YsIDApOwotCi0Jb3YtPnNuYXBfZW5hYmxlZCA9IHNuYXBzaG90OwotCi0JLyogVGVzdCBmb3IgN3h4MCAqLwotCVBERUJVRygzLCAiVGVzdGluZyBmb3IgMFY3eHgwIik7Ci0Jb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y3eHgwX1NJRDsKLQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y3eHgwX1NJRCkgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKGkyY193KG92LCAweDEyLCAweDgwKSA8IDApIHsKLQkJLyogVGVzdCBmb3IgNnh4MCAqLwotCQlQREVCVUcoMywgIlRlc3RpbmcgZm9yIDBWNnh4MCIpOwotCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjZ4eDBfU0lEOwotCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y2eHgwX1NJRCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQotCQlpZiAoaTJjX3cob3YsIDB4MTIsIDB4ODApIDwgMCkgewotCQkJLyogVGVzdCBmb3IgOHh4MCAqLwotCQkJUERFQlVHKDMsICJUZXN0aW5nIGZvciAwVjh4eDAiKTsKLQkJCW92LT5wcmltYXJ5X2kyY19zbGF2ZSA9IE9WOHh4MF9TSUQ7Ci0JCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y4eHgwX1NJRCkgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0KLQkJCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKSB7Ci0JCQkJLyogVGVzdCBmb3IgU0FBNzExMUEgKi8KLQkJCQlQREVCVUcoMywgIlRlc3RpbmcgZm9yIFNBQTcxMTFBIik7Ci0JCQkJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gU0FBNzExMUFfU0lEOwotCQkJCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBTQUE3MTExQV9TSUQpIDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQotCQkJCWlmIChpMmNfdyhvdiwgMHgwZCwgMHgwMCkgPCAwKSB7Ci0JCQkJCS8qIFRlc3QgZm9yIEtTMDEyNyAqLwotCQkJCQlQREVCVUcoMywgIlRlc3RpbmcgZm9yIEtTMDEyNyIpOwotCQkJCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBLUzAxMjdfU0lEOwotCQkJCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgS1MwMTI3X1NJRCkgPCAwKQotCQkJCQkJZ290byBlcnJvcjsKLQotCQkJCQlpZiAoaTJjX3cob3YsIDB4MTAsIDB4MDApIDwgMCkgewotCQkJCQkJZXJyKCJDYW4ndCBkZXRlcm1pbmUgc2Vuc29yIHNsYXZlIElEcyIpOwotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChrczAxMjdfY29uZmlndXJlKG92KSA8IDApIHsKLQkJCQkJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgS1MwMTI3Iik7Ci0JCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChzYWE3MTExYV9jb25maWd1cmUob3YpIDwgMCkgewotCQkJCQkJZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIFNBQTcxMTFBIik7Ci0JCQkJCQlnb3RvIGVycm9yOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllcnIoIkRldGVjdGVkIHVuc3VwcG9ydGVkIE9WOHh4MCBzZW5zb3IiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG92Nnh4MF9jb25maWd1cmUob3YpIDwgMCkgewotCQkJCWVycigiRmFpbGVkIHRvIGNvbmZpZ3VyZSBPVjZ4eDAiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKG92N3h4MF9jb25maWd1cmUob3YpIDwgMCkgewotCQkJZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIE9WN3h4MCIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQllcnIoIk9WNTExIENvbmZpZyBmYWlsZWQiKTsKLQotCXJldHVybiAtRUJVU1k7Ci19Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNTE4L09WNTE4KyBhbmQgdGhlIHNlbnNvciAqLwotc3RhdGljIGludAotb3Y1MThfY29uZmlndXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQotewotCS8qIEZvciA1MTggYW5kIDUxOCsgKi8KLQlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNJbml0NTE4W10gPSB7Ci0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4NDAgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHhlMSB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1JFU0VULAkweDNlIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfSU5JVCwJCTB4ZTEgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHgwMCB9LAotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX0lOSVQsCQkweGUxIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg0NiwJCQkweDAwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg1ZCwJCQkweDAzIH0sCi0JCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMH0sCi0JfTsKLQotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MThbXSA9IHsKLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMiB9LCAvKiBSZXNldCAqLwotCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAxIH0sIC8qIEVuYWJsZSAqLwotCQl7IE9WNTExX1JFR19CVVMsIDB4MzEsIAkJCTB4MGYgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCAweDVkLAkJCTB4MDMgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCAweDI0LAkJCTB4OWYgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCAweDI1LAkJCTB4OTAgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCAweDIwLAkJCTB4MDAgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCAweDUxLAkJCTB4MDQgfSwKLQkJeyBPVjUxMV9SRUdfQlVTLCAweDcxLAkJCTB4MTkgfSwKLQkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCi0JfTsKLQotCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MThQbHVzW10gPSB7Ci0JCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDIgfSwgLyogUmVzZXQgKi8KLQkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMSB9LCAvKiBFbmFibGUgKi8KLQkJeyBPVjUxMV9SRUdfQlVTLCAweDMxLCAJCQkweDBmIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg1ZCwJCQkweDAzIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHgyNCwJCQkweDlmIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHgyNSwJCQkweDkwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHgyMCwJCQkweDYwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg1MSwJCQkweDAyIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg3MSwJCQkweDE5IH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg0MCwJCQkweGZmIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg0MSwJCQkweDQyIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHg0NiwJCQkweDAwIH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHgzMywJCQkweDA0IH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHgyMSwJCQkweDE5IH0sCi0JCXsgT1Y1MTFfUkVHX0JVUywgMHgzZiwJCQkweDEwIH0sCi0JCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAotCX07Ci0KLQlQREVCVUcoNCwgIiIpOwotCi0JLyogRmlyc3QgNSBiaXRzIG9mIGN1c3RvbSBJRCByZWcgYXJlIGEgcmV2aXNpb24gSUQgb24gT1Y1MTggKi8KLQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiRGV2aWNlIHJldmlzaW9uICVkXG4iLAotCQkgMHgxRiAmIHJlZ19yKG92LCBSNTExX1NZU19DVVNUX0lEKSk7Ci0KLQkvKiBHaXZlIGl0IHRoZSBkZWZhdWx0IGRlc2NyaXB0aW9uICovCi0Jb3YtPmRlc2MgPSBzeW1ib2xpYyhjYW1saXN0LCAwKTsKLQotCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc0luaXQ1MTgpKQotCQlnb3RvIGVycm9yOwotCi0JLyogU2V0IExFRCBHUElPIHBpbiB0byBvdXRwdXQgbW9kZSAqLwotCWlmIChyZWdfd19tYXNrKG92LCAweDU3LCAweDAwLCAweDAyKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBMRUQgaXMgb2ZmIGJ5IGRlZmF1bHQgd2l0aCBPVjUxODsgaGF2ZSB0byBleHBsaWNpdGx5IHR1cm4gaXQgb24gKi8KLQlpZiAob3YtPmxlZF9wb2xpY3kgPT0gTEVEX09GRiB8fCBvdi0+bGVkX3BvbGljeSA9PSBMRURfQVVUTykKLQkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDApOwotCWVsc2UKLQkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDEpOwotCi0JLyogRG9uJ3QgcmVxdWlyZSBjb21wcmVzc2lvbiBpZiBkdW1wcGl4IGlzIGVuYWJsZWQ7IG90aGVyd2lzZSBpdCdzCi0JICogcmVxdWlyZWQuIE9WNTE4IGhhcyBubyB1bmNvbXByZXNzZWQgbW9kZSwgdG8gc2F2ZSBSQU0uICovCi0JaWYgKCFkdW1wcGl4ICYmICFvdi0+Y29tcHJlc3MpIHsKLQkJb3YtPmNvbXByZXNzID0gMTsKLQkJZGV2X3dhcm4oJm92LT5kZXYtPmRldiwKLQkJCSAiQ29tcHJlc3Npb24gcmVxdWlyZWQgd2l0aCBPVjUxOC4uLmVuYWJsaW5nXG4iKTsKLQl9Ci0KLQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgpIHsKLQkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTUxOCkpCi0JCQlnb3RvIGVycm9yOwotCX0gZWxzZSBpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MThQTFVTKSB7Ci0JCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm01MThQbHVzKSkKLQkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlIHsKLQkJZXJyKCJJbnZhbGlkIGJyaWRnZSIpOwotCX0KLQotCWlmIChyZWdfdyhvdiwgMHgyZiwgMHg4MCkgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKG92NTE4X2luaXRfY29tcHJlc3Npb24ob3YpKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTE4KQotCXsKLQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmcDsKLQkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwotCQlfX3UxNiBteHBzID0gMDsKLQotCQlpZnAgPSB1c2JfaWZudW1fdG9faWYob3YtPmRldiwgMCk7Ci0JCWlmIChpZnApIHsKLQkJCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpZnAsIDcpOwotCQkJaWYgKGFsdCkKLQkJCQlteHBzID0gbGUxNl90b19jcHUoYWx0LT5lbmRwb2ludFswXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKLQkJfQotCi0JCS8qIFNvbWUgT1Y1MThzIGhhdmUgcGFja2V0IG51bWJlcmluZyBieSBkZWZhdWx0LCBzb21lIGRvbid0ICovCi0JCWlmIChteHBzID09IDg5NykKLQkJCW92LT5wYWNrZXRfbnVtYmVyaW5nID0gMTsKLQkJZWxzZQotCQkJb3YtPnBhY2tldF9udW1iZXJpbmcgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIE9WNTE4KyBoYXMgcGFja2V0IG51bWJlcmluZyB0dXJuZWQgb24gYnkgZGVmYXVsdCAqLwotCQlvdi0+cGFja2V0X251bWJlcmluZyA9IDE7Ci0JfQotCi0Jb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCAwKTsKLQotCW92LT5zbmFwX2VuYWJsZWQgPSBzbmFwc2hvdDsKLQotCS8qIFRlc3QgZm9yIDc2eHggKi8KLQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjd4eDBfU0lEOwotCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBPVjd4eDBfU0lEKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBUaGUgT1Y1MTggbXVzdCBiZSBtb3JlIGFnZ3Jlc3NpdmUgYWJvdXQgc2Vuc29yIGRldGVjdGlvbiBzaW5jZQotCSAqIEkyQyB3cml0ZSB3aWxsIG5ldmVyIGZhaWwgaWYgdGhlIHNlbnNvciBpcyBub3QgcHJlc2VudC4gV2UgaGF2ZQotCSAqIHRvIHRyeSB0byBpbml0aWFsaXplIHRoZSBzZW5zb3IgdG8gZGV0ZWN0IGl0cyBwcmVzZW5jZSAqLwotCi0JaWYgKGluaXRfb3Zfc2Vuc29yKG92KSA8IDApIHsKLQkJLyogVGVzdCBmb3IgNnh4MCAqLwotCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjZ4eDBfU0lEOwotCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y2eHgwX1NJRCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQotCQlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpIDwgMCkgewotCQkJLyogVGVzdCBmb3IgOHh4MCAqLwotCQkJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y4eHgwX1NJRDsKLQkJCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBPVjh4eDBfU0lEKSA8IDApCi0JCQkJZ290byBlcnJvcjsKLQotCQkJaWYgKGluaXRfb3Zfc2Vuc29yKG92KSA8IDApIHsKLQkJCQllcnIoIkNhbid0IGRldGVybWluZSBzZW5zb3Igc2xhdmUgSURzIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyKCJEZXRlY3RlZCB1bnN1cHBvcnRlZCBPVjh4eDAgc2Vuc29yIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvdjZ4eDBfY29uZmlndXJlKG92KSA8IDApIHsKLQkJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgT1Y2eHgwIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChvdjd4eDBfY29uZmlndXJlKG92KSA8IDApIHsKLQkJCWVycigiRmFpbGVkIHRvIGNvbmZpZ3VyZSBPVjd4eDAiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlvdi0+bWF4d2lkdGggPSAzNTI7Ci0Jb3YtPm1heGhlaWdodCA9IDI4ODsKLQotCS8vIFRoZSBPVjUxOCBjYW5ub3QgZ28gYXMgbG93IGFzIHRoZSBzZW5zb3IgY2FuCi0Jb3YtPm1pbndpZHRoID0gMTYwOwotCW92LT5taW5oZWlnaHQgPSAxMjA7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JZXJyKCJPVjUxOCBDb25maWcgZmFpbGVkIik7Ci0KLQlyZXR1cm4gLUVCVVNZOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHN5c2ZzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1c2Jfb3Y1MTEgKmNkX3RvX292KHN0cnVjdCBkZXZpY2UgKmNkKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2QpOwotCXJldHVybiB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19jdXN0b21faWQoc3RydWN0IGRldmljZSAqY2QsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvdi0+Y3VzdG9taWQpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGN1c3RvbV9pZCwgU19JUlVHTywgc2hvd19jdXN0b21faWQsIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBzaG93X21vZGVsKHN0cnVjdCBkZXZpY2UgKmNkLAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBvdi0+ZGVzYyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kZWwsIFNfSVJVR08sIHNob3dfbW9kZWwsIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBzaG93X2JyaWRnZShzdHJ1Y3QgZGV2aWNlICpjZCwKLQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihicmlkZ2UsIFNfSVJVR08sIHNob3dfYnJpZGdlLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3Qgc2hvd19zZW5zb3Ioc3RydWN0IGRldmljZSAqY2QsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzeW1ib2xpYyhzZW5saXN0LCBvdi0+c2Vuc29yKSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoc2Vuc29yLCBTX0lSVUdPLCBzaG93X3NlbnNvciwgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfYnJpZ2h0bmVzcyhzdHJ1Y3QgZGV2aWNlICpjZCwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOwotCXVuc2lnbmVkIHNob3J0IHg7Ci0KLQlpZiAoIW92LT5kZXYpCi0JCXJldHVybiAtRU5PREVWOwotCXNlbnNvcl9nZXRfYnJpZ2h0bmVzcyhvdiwgJngpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4ID4+IDgpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGJyaWdodG5lc3MsIFNfSVJVR08sIHNob3dfYnJpZ2h0bmVzcywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfc2F0dXJhdGlvbihzdHJ1Y3QgZGV2aWNlICpjZCwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOwotCXVuc2lnbmVkIHNob3J0IHg7Ci0KLQlpZiAoIW92LT5kZXYpCi0JCXJldHVybiAtRU5PREVWOwotCXNlbnNvcl9nZXRfc2F0dXJhdGlvbihvdiwgJngpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4ID4+IDgpOwotfQotc3RhdGljIERFVklDRV9BVFRSKHNhdHVyYXRpb24sIFNfSVJVR08sIHNob3dfc2F0dXJhdGlvbiwgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY29udHJhc3Qoc3RydWN0IGRldmljZSAqY2QsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7Ci0JdW5zaWduZWQgc2hvcnQgeDsKLQotCWlmICghb3YtPmRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0Jc2Vuc29yX2dldF9jb250cmFzdChvdiwgJngpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4ID4+IDgpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGNvbnRyYXN0LCBTX0lSVUdPLCBzaG93X2NvbnRyYXN0LCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3Qgc2hvd19odWUoc3RydWN0IGRldmljZSAqY2QsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOwotCXVuc2lnbmVkIHNob3J0IHg7Ci0KLQlpZiAoIW92LT5kZXYpCi0JCXJldHVybiAtRU5PREVWOwotCXNlbnNvcl9nZXRfaHVlKG92LCAmeCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHggPj4gOCk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoaHVlLCBTX0lSVUdPLCBzaG93X2h1ZSwgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZXhwb3N1cmUoc3RydWN0IGRldmljZSAqY2QsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7Ci0JdW5zaWduZWQgY2hhciBleHAgPSAwOwotCi0JaWYgKCFvdi0+ZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQlzZW5zb3JfZ2V0X2V4cG9zdXJlKG92LCAmZXhwKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZXhwKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihleHBvc3VyZSwgU19JUlVHTywgc2hvd19leHBvc3VyZSwgTlVMTCk7Ci0KLXN0YXRpYyBpbnQgb3ZfY3JlYXRlX3N5c2ZzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2N1c3RvbV9pZCk7Ci0JaWYgKHJjKSBnb3RvIGVycjsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfbW9kZWwpOwotCWlmIChyYykgZ290byBlcnJfaWQ7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2JyaWRnZSk7Ci0JaWYgKHJjKSBnb3RvIGVycl9tb2RlbDsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yKTsKLQlpZiAocmMpIGdvdG8gZXJyX2JyaWRnZTsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfYnJpZ2h0bmVzcyk7Ci0JaWYgKHJjKSBnb3RvIGVycl9zZW5zb3I7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3NhdHVyYXRpb24pOwotCWlmIChyYykgZ290byBlcnJfYnJpZ2h0OwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9jb250cmFzdCk7Ci0JaWYgKHJjKSBnb3RvIGVycl9zYXQ7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2h1ZSk7Ci0JaWYgKHJjKSBnb3RvIGVycl9jb250cmFzdDsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfZXhwb3N1cmUpOwotCWlmIChyYykgZ290byBlcnJfaHVlOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9odWU6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9odWUpOwotZXJyX2NvbnRyYXN0OgotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfY29udHJhc3QpOwotZXJyX3NhdDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3NhdHVyYXRpb24pOwotZXJyX2JyaWdodDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2JyaWdodG5lc3MpOwotZXJyX3NlbnNvcjoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcik7Ci1lcnJfYnJpZGdlOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfYnJpZGdlKTsKLWVycl9tb2RlbDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX21vZGVsKTsKLWVycl9pZDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2N1c3RvbV9pZCk7Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFVTQiByb3V0aW5lcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotb3Y1MXhfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZGVzYzsKLQlzdHJ1Y3QgdXNiX292NTExICpvdjsKLQlpbnQgaSwgcmMsIG5yOwotCi0JUERFQlVHKDEsICJwcm9iaW5nIGZvciBkZXZpY2UuLi4iKTsKLQotCS8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLwotCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWRlc2MgPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2M7Ci0KLQlpZiAoaWRlc2MtPmJJbnRlcmZhY2VDbGFzcyAhPSAweEZGKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoaWRlc2MtPmJJbnRlcmZhY2VTdWJDbGFzcyAhPSAweDAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICgob3YgPSBremFsbG9jKHNpemVvZigqb3YpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQllcnIoImNvdWxkbid0IGttYWxsb2Mgb3Ygc3RydWN0Iik7Ci0JCWdvdG8gZXJyb3Jfb3V0OwotCX0KLQotCW92LT5kZXYgPSBkZXY7Ci0Jb3YtPmlmYWNlID0gaWRlc2MtPmJJbnRlcmZhY2VOdW1iZXI7Ci0Jb3YtPmxlZF9wb2xpY3kgPSBsZWQ7Ci0Jb3YtPmNvbXByZXNzID0gY29tcHJlc3M7Ci0Jb3YtPmxpZ2h0ZnJlcSA9IGxpZ2h0ZnJlcTsKLQlvdi0+bnVtX2lucHV0cyA9IDE7CSAgIC8qIFZpZGVvIGRlY29kZXIgaW5pdCBmdW5jdHMuIGNoYW5nZSB0aGlzICovCi0Jb3YtPnN0b3BfZHVyaW5nX3NldCA9ICFmYXN0c2V0OwotCW92LT5iYWNrbGlnaHQgPSBiYWNrbGlnaHQ7Ci0Jb3YtPm1pcnJvciA9IG1pcnJvcjsKLQlvdi0+YXV0b19icnQgPSBhdXRvYnJpZ2h0OwotCW92LT5hdXRvX2dhaW4gPSBhdXRvZ2FpbjsKLQlvdi0+YXV0b19leHAgPSBhdXRvZXhwOwotCi0Jc3dpdGNoIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkgewotCWNhc2UgUFJPRF9PVjUxMToKLQkJb3YtPmJyaWRnZSA9IEJSR19PVjUxMTsKLQkJb3YtPmJjbGFzcyA9IEJDTF9PVjUxMTsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9EX09WNTExUExVUzoKLQkJb3YtPmJyaWRnZSA9IEJSR19PVjUxMVBMVVM7Ci0JCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTE7Ci0JCWJyZWFrOwotCWNhc2UgUFJPRF9PVjUxODoKLQkJb3YtPmJyaWRnZSA9IEJSR19PVjUxODsKLQkJb3YtPmJjbGFzcyA9IEJDTF9PVjUxODsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9EX09WNTE4UExVUzoKLQkJb3YtPmJyaWRnZSA9IEJSR19PVjUxOFBMVVM7Ci0JCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTg7Ci0JCWJyZWFrOwotCWNhc2UgUFJPRF9NRTJDQU06Ci0JCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICE9IFZFTkRfTUFUVEVMKQotCQkJZ290byBlcnJvcjsKLQkJb3YtPmJyaWRnZSA9IEJSR19PVjUxMVBMVVM7Ci0JCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycigiVW5rbm93biBwcm9kdWN0IElEIDB4JTA0eCIsIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVVNCICVzIHZpZGVvIGRldmljZSBmb3VuZFxuIiwKLQkJIHN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm92LT53cSk7Ci0KLQltdXRleF9pbml0KCZvdi0+bG9jayk7CS8qIHRvIDEgPT0gYXZhaWxhYmxlICovCi0JbXV0ZXhfaW5pdCgmb3YtPmJ1Zl9sb2NrKTsKLQltdXRleF9pbml0KCZvdi0+aTJjX2xvY2spOwotCW11dGV4X2luaXQoJm92LT5jYnVmX2xvY2spOwotCi0Jb3YtPmJ1Zl9zdGF0ZSA9IEJVRl9OT1RfQUxMT0NBVEVEOwotCi0JaWYgKHVzYl9tYWtlX3BhdGgoZGV2LCBvdi0+dXNiX3BhdGgsIE9WNTExX1VTQl9QQVRIX0xFTikgPCAwKSB7Ci0JCWVycigidXNiX21ha2VfcGF0aCBlcnJvciIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIEFsbG9jYXRlIGNvbnRyb2wgdHJhbnNmZXIgYnVmZmVyLiAqLwotCS8qIE11c3QgYmUga21hbGxvYygpJ2VkLCBmb3IgRE1BIGNvbXBhdGliaWxpdHkgKi8KLQlvdi0+Y2J1ZiA9IGttYWxsb2MoT1Y1MTFfQ0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW92LT5jYnVmKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7Ci0JCWlmIChvdjUxOF9jb25maWd1cmUob3YpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlIHsKLQkJaWYgKG92NTExX2NvbmZpZ3VyZShvdikgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTlVNRlJBTUVTOyBpKyspIHsKLQkJb3YtPmZyYW1lW2ldLmZyYW1lbnVtID0gaTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmb3YtPmZyYW1lW2ldLndxKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTlVNU0JVRjsgaSsrKSB7Ci0JCW92LT5zYnVmW2ldLm92ID0gb3Y7Ci0JCXNwaW5fbG9ja19pbml0KCZvdi0+c2J1ZltpXS5sb2NrKTsKLQkJb3YtPnNidWZbaV0ubiA9IGk7Ci0JfQotCi0JLyogVW5uZWNlc3Nhcnk/IChUaGlzIGlzIGRvbmUgb24gb3BlbigpLiBOZWVkIHRvIG1ha2Ugc3VyZSB2YXJpYWJsZXMKLQkgKiBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgd2l0aG91dCB0aGlzIGJlZm9yZSByZW1vdmluZyBpdCwgdGhvdWdoKS4gKi8KLQlpZiAob3Y1MXhfc2V0X2RlZmF1bHRfcGFyYW1zKG92KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLSNpZmRlZiBPVjUxMV9ERUJVRwotCWlmIChkdW1wX2JyaWRnZSkgewotCQlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTEpCi0JCQlvdjUxMV9kdW1wX3JlZ3Mob3YpOwotCQllbHNlCi0JCQlvdjUxOF9kdW1wX3JlZ3Mob3YpOwotCX0KLSNlbmRpZgotCi0Jb3YtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKLQlpZiAoIW92LT52ZGV2KQotCQlnb3RvIGVycm9yOwotCi0JbWVtY3B5KG92LT52ZGV2LCAmdmRldl90ZW1wbGF0ZSwgc2l6ZW9mKCpvdi0+dmRldikpOwotCW92LT52ZGV2LT5wYXJlbnQgPSAmaW50Zi0+ZGV2OwotCXZpZGVvX3NldF9kcnZkYXRhKG92LT52ZGV2LCBvdik7Ci0KLQltdXRleF9sb2NrKCZvdi0+bG9jayk7Ci0KLQkvKiBDaGVjayB0byBzZWUgbmV4dCBmcmVlIGRldmljZSBhbmQgbWFyayBhcyB1c2VkICovCi0JbnIgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZvdjUxMV9kZXZ1c2VkLCBPVjUxMV9NQVhfVU5JVF9WSURFTyk7Ci0KLQkvKiBSZWdpc3RlcnMgZGV2aWNlICovCi0JaWYgKHVuaXRfdmlkZW9bbnJdICE9IDApCi0JCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKG92LT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAotCQkJCQkgICB1bml0X3ZpZGVvW25yXSk7Ci0JZWxzZQotCQlyYyA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShvdi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCi0JaWYgKHJjIDwgMCkgewotCQllcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiKTsKLQkJbXV0ZXhfdW5sb2NrKCZvdi0+bG9jayk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogTWFyayBkZXZpY2UgYXMgdXNlZCAqLwotCW92NTExX2RldnVzZWQgfD0gMSA8PCBucjsKLQlvdi0+bnIgPSBucjsKLQotCWRldl9pbmZvKCZpbnRmLT5kZXYsICJEZXZpY2UgYXQgJXMgcmVnaXN0ZXJlZCB0byAlc1xuIiwKLQkJIG92LT51c2JfcGF0aCwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShvdi0+dmRldikpOwotCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBvdik7Ci0JaWYgKG92X2NyZWF0ZV9zeXNmcyhvdi0+dmRldikpIHsKLQkJZXJyKCJvdl9jcmVhdGVfc3lzZnMgZmFpbGVkIik7Ci0JCW92NTExX2RldnVzZWQgJj0gfigxIDw8IG5yKTsKLQkJbXV0ZXhfdW5sb2NrKCZvdi0+bG9jayk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZvdi0+bG9jayk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JaWYgKG92LT52ZGV2KSB7Ci0JCWlmICghdmlkZW9faXNfcmVnaXN0ZXJlZChvdi0+dmRldikpCi0JCQl2aWRlb19kZXZpY2VfcmVsZWFzZShvdi0+dmRldik7Ci0JCWVsc2UKLQkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKG92LT52ZGV2KTsKLQkJb3YtPnZkZXYgPSBOVUxMOwotCX0KLQotCWlmIChvdi0+Y2J1ZikgewotCQltdXRleF9sb2NrKCZvdi0+Y2J1Zl9sb2NrKTsKLQkJa2ZyZWUob3YtPmNidWYpOwotCQlvdi0+Y2J1ZiA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmb3YtPmNidWZfbG9jayk7Ci0JfQotCi0Ja2ZyZWUob3YpOwotCW92ID0gTlVMTDsKLQotZXJyb3Jfb3V0OgotCWVycigiQ2FtZXJhIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOwotCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgdm9pZAotb3Y1MXhfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JaW50IG47Ci0KLQlQREVCVUcoMywgIiIpOwotCi0JbXV0ZXhfbG9jaygmb3YtPmxvY2spOwotCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOwotCi0JLyogRnJlZSBkZXZpY2UgbnVtYmVyICovCi0Jb3Y1MTFfZGV2dXNlZCAmPSB+KDEgPDwgb3YtPm5yKTsKLQotCWlmIChvdi0+dmRldikKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uob3YtPnZkZXYpOwotCi0JZm9yIChuID0gMDsgbiA8IE9WNTExX05VTUZSQU1FUzsgbisrKQotCQlvdi0+ZnJhbWVbbl0uZ3JhYnN0YXRlID0gRlJBTUVfRVJST1I7Ci0KLQlvdi0+Y3VyZnJhbWUgPSAtMTsKLQotCS8qIFRoaXMgd2lsbCBjYXVzZSB0aGUgcHJvY2VzcyB0byByZXF1ZXN0IGFub3RoZXIgZnJhbWUgKi8KLQlmb3IgKG4gPSAwOyBuIDwgT1Y1MTFfTlVNRlJBTUVTOyBuKyspCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb3YtPmZyYW1lW25dLndxKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb3YtPndxKTsKLQotCW92LT5zdHJlYW1pbmcgPSAwOwotCW92NTF4X3VubGlua19pc29jKG92KTsKLQltdXRleF91bmxvY2soJm92LT5sb2NrKTsKLQotCW92LT5kZXYgPSBOVUxMOwotCi0JLyogRnJlZSB0aGUgbWVtb3J5ICovCi0JaWYgKCFvdi0+dXNlcikgewotCQltdXRleF9sb2NrKCZvdi0+Y2J1Zl9sb2NrKTsKLQkJa2ZyZWUob3YtPmNidWYpOwotCQlvdi0+Y2J1ZiA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmb3YtPmNidWZfbG9jayk7Ci0KLQkJb3Y1MXhfZGVhbGxvYyhvdik7Ci0JCWtmcmVlKG92KTsKLQkJb3YgPSBOVUxMOwotCX0KLQotCVBERUJVRygzLCAiRGlzY29ubmVjdCBjb21wbGV0ZSIpOwotfQotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgb3Y1MTFfZHJpdmVyID0gewotCS5uYW1lID0JCSJvdjUxMSIsCi0JLmlkX3RhYmxlID0JZGV2aWNlX3RhYmxlLAotCS5wcm9iZSA9CW92NTF4X3Byb2JlLAotCS5kaXNjb25uZWN0ID0Jb3Y1MXhfZGlzY29ubmVjdAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgTW9kdWxlIHJvdXRpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2luaXQKLXVzYl9vdjUxMV9pbml0KHZvaWQpCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IHVzYl9yZWdpc3Rlcigmb3Y1MTFfZHJpdmVyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKLQotCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBEUklWRVJfVkVSU0lPTiAiOiIKLQkgICAgICAgRFJJVkVSX0RFU0MgIlxuIik7Ci0KLW91dDoKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLXVzYl9vdjUxMV9leGl0KHZvaWQpCi17Ci0JdXNiX2RlcmVnaXN0ZXIoJm92NTExX2RyaXZlcik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiBkcml2ZXIgZGVyZWdpc3RlcmVkXG4iKTsKLX0KLQotbW9kdWxlX2luaXQodXNiX292NTExX2luaXQpOwotbW9kdWxlX2V4aXQodXNiX292NTExX2V4aXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTBjOTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTczICswLDAgQEAKLSNpZm5kZWYgX19MSU5VWF9PVjUxMV9ICi0jZGVmaW5lIF9fTElOVVhfT1Y1MTFfSAotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNkZWZpbmUgT1Y1MTFfREVCVUcJLyogVHVybiBvbiBkZWJ1ZyBtZXNzYWdlcyAqLwotCi0jaWZkZWYgT1Y1MTFfREVCVUcKLQkjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCi0JCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKQlcCi0JCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICJbJXM6JWRdIFxuIiBmbXQsIFwKLQkJX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncykKLSNlbHNlCi0JI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCi0vKiBUaGlzIG1hY3JvIHJlc3RyaWN0cyBhbiBpbnQgdmFyaWFibGUgdG8gYW4gaW5jbHVzaXZlIHJhbmdlICovCi0jZGVmaW5lIFJFU1RSSUNUX1RPX1JBTkdFKHYsbWksbWEpIHsgXAotCWlmICgodikgPCAobWkpKSAodikgPSAobWkpOyBcCi0JZWxzZSBpZiAoKHYpID4gKG1hKSkgKHYpID0gKG1hKTsgXAotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIERFRklORVMgRk9SIE9WNTExIEFORCBPVEhFUiBDSElQUyAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFVTQiBJRHMgKi8KLSNkZWZpbmUgVkVORF9PTU5JVklTSU9OCTB4MDVBOQotI2RlZmluZSBQUk9EX09WNTExCTB4MDUxMQotI2RlZmluZSBQUk9EX09WNTExUExVUwkweEE1MTEKLSNkZWZpbmUgUFJPRF9PVjUxOAkweDA1MTgKLSNkZWZpbmUgUFJPRF9PVjUxOFBMVVMJMHhBNTE4Ci0KLSNkZWZpbmUgVkVORF9NQVRURUwJMHgwODEzCi0jZGVmaW5lIFBST0RfTUUyQ0FNCTB4MDAwMgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgICBPVjUxeCBSRUdJU1RFUiBNTkVNT05JQ1MgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIENhbWVyYSBpbnRlcmZhY2UgcmVnaXN0ZXIgbnVtYmVycyAqLwotI2RlZmluZSBSNTExX0NBTV9ERUxBWQkJMHgxMAotI2RlZmluZSBSNTExX0NBTV9FREdFCQkweDExCi0jZGVmaW5lIFI1MTFfQ0FNX1BYQ05UCQkweDEyCi0jZGVmaW5lIFI1MTFfQ0FNX0xOQ05UCQkweDEzCi0jZGVmaW5lIFI1MTFfQ0FNX1BYRElWCQkweDE0Ci0jZGVmaW5lIFI1MTFfQ0FNX0xORElWCQkweDE1Ci0jZGVmaW5lIFI1MTFfQ0FNX1VWX0VOCQkweDE2Ci0jZGVmaW5lIFI1MTFfQ0FNX0xJTkVfTU9ERQkweDE3Ci0jZGVmaW5lIFI1MTFfQ0FNX09QVFMJCTB4MTgKLQotLyogU25hcHNob3QgbW9kZSBjYW1lcmEgaW50ZXJmYWNlIHJlZ2lzdGVyIG51bWJlcnMgKi8KLSNkZWZpbmUgUjUxMV9TTkFQX0ZSQU1FCQkweDE5Ci0jZGVmaW5lIFI1MTFfU05BUF9QWENOVAkJMHgxQQotI2RlZmluZSBSNTExX1NOQVBfTE5DTlQJCTB4MUIKLSNkZWZpbmUgUjUxMV9TTkFQX1BYRElWCQkweDFDCi0jZGVmaW5lIFI1MTFfU05BUF9MTkRJVgkJMHgxRAotI2RlZmluZSBSNTExX1NOQVBfVVZfRU4JCTB4MUUKLSNkZWZpbmUgUjUxMV9TTkFQX09QVFMJCTB4MUYKLQotLyogRFJBTSByZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lIFI1MTFfRFJBTV9GTE9XX0NUTAkweDIwCi0jZGVmaW5lIFI1MTFfRFJBTV9BUkNQCQkweDIxCi0jZGVmaW5lIFI1MTFfRFJBTV9NUkMJCTB4MjIKLSNkZWZpbmUgUjUxMV9EUkFNX1JGQwkJMHgyMwotCi0vKiBJU08gRklGTyByZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lIFI1MXhfRklGT19QU0laRQkJMHgzMAkvKiAyIGJ5dGVzIHdpZGUgdy8gT1Y1MTgoKykgKi8KLSNkZWZpbmUgUjUxMV9GSUZPX09QVFMJCTB4MzEKLQotLyogUGFyYWxsZWwgSU8gcmVnaXN0ZXIgbnVtYmVycyAqLwotI2RlZmluZSBSNTExX1BJT19PUFRTCQkweDM4Ci0jZGVmaW5lIFI1MTFfUElPX0RBVEEJCTB4MzkKLSNkZWZpbmUgUjUxMV9QSU9fQklTVAkJMHgzRQotI2RlZmluZSBSNTE4X0dQSU9fSU4JCTB4NTUJLyogT1Y1MTgoKykgb25seSAqLwotI2RlZmluZSBSNTE4X0dQSU9fT1VUCQkweDU2CS8qIE9WNTE4KCspIG9ubHkgKi8KLSNkZWZpbmUgUjUxOF9HUElPX0NUTAkJMHg1NwkvKiBPVjUxOCgrKSBvbmx5ICovCi0jZGVmaW5lIFI1MThfR1BJT19QVUxTRV9JTgkweDU4CS8qIE9WNTE4KCspIG9ubHkgKi8KLSNkZWZpbmUgUjUxOF9HUElPX1BVTFNFX0NMRUFSCTB4NTkJLyogT1Y1MTgoKykgb25seSAqLwotI2RlZmluZSBSNTE4X0dQSU9fUFVMU0VfUE9MCTB4NWEJLyogT1Y1MTgoKykgb25seSAqLwotI2RlZmluZSBSNTE4X0dQSU9fUFVMU0VfRU4JMHg1YgkvKiBPVjUxOCgrKSBvbmx5ICovCi0jZGVmaW5lIFI1MThfR1BJT19SRVNFVAkJMHg1YwkvKiBPVjUxOCgrKSBvbmx5ICovCi0KLS8qIEkyQyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUjUxMV9JMkNfQ1RMCQkweDQwCi0jZGVmaW5lIFI1MThfSTJDX0NUTAkJMHg0NwkvKiBPVjUxOCgrKSBvbmx5ICovCi0jZGVmaW5lIFI1MXhfSTJDX1dfU0lECQkweDQxCi0jZGVmaW5lIFI1MXhfSTJDX1NBRERSXzMJMHg0MgotI2RlZmluZSBSNTF4X0kyQ19TQUREUl8yCTB4NDMKLSNkZWZpbmUgUjUxeF9JMkNfUl9TSUQJCTB4NDQKLSNkZWZpbmUgUjUxeF9JMkNfREFUQQkJMHg0NQotI2RlZmluZSBSNTF4X0kyQ19DTE9DSwkJMHg0NgotI2RlZmluZSBSNTF4X0kyQ19USU1FT1VUCTB4NDcKLQotLyogSTJDIHNuYXBzaG90IHJlZ2lzdGVycyAqLwotI2RlZmluZSBSNTExX1NJMkNfU0FERFJfMwkweDQ4Ci0jZGVmaW5lIFI1MTFfU0kyQ19EQVRBCQkweDQ5Ci0KLS8qIFN5c3RlbSBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSNTF4X1NZU19SRVNFVAkJMHg1MAotCQkvKiBSZXNldCB0eXBlIGRlZmluaXRpb25zICovCi0jZGVmaW5lIAlPVjUxMV9SRVNFVF9VREMJCTB4MDEKLSNkZWZpbmUgCU9WNTExX1JFU0VUX0kyQwkJMHgwMgotI2RlZmluZSAJT1Y1MTFfUkVTRVRfRklGTwkweDA0Ci0jZGVmaW5lIAlPVjUxMV9SRVNFVF9PTU5JQ0UJMHgwOAotI2RlZmluZSAJT1Y1MTFfUkVTRVRfRFJBTQkweDEwCi0jZGVmaW5lIAlPVjUxMV9SRVNFVF9DQU1fSU5UCTB4MjAKLSNkZWZpbmUgCU9WNTExX1JFU0VUX09WNTExCTB4NDAKLSNkZWZpbmUgCU9WNTExX1JFU0VUX05PUkVHUwkweDNGIC8qIEFsbCBidXQgT1Y1MTEgJiByZWdzICovCi0jZGVmaW5lIAlPVjUxMV9SRVNFVF9BTEwJCTB4N0YKLQotI2RlZmluZSBSNTExX1NZU19DTE9DS19ESVYJMHg1MQotI2RlZmluZSBSNTF4X1NZU19TTkFQCQkweDUyCi0jZGVmaW5lIFI1MXhfU1lTX0lOSVQgICAgICAgICAJMHg1MwotI2RlZmluZSBSNTExX1NZU19QV1JfQ0xLCTB4NTQgLyogT1Y1MTErL09WNTE4KCspIG9ubHkgKi8KLSNkZWZpbmUgUjUxMV9TWVNfTEVEX0NUTAkweDU1IC8qIE9WNTExKyBvbmx5ICovCi0jZGVmaW5lIFI1MTFfU1lTX1VTRVIJCTB4NUUKLSNkZWZpbmUgUjUxMV9TWVNfQ1VTVF9JRAkweDVGCi0KLS8qIE9tbmlDRSAoY29tcHJlc3Npb24pIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSNTExX0NPTVBfUEhZCQkweDcwCi0jZGVmaW5lIFI1MTFfQ09NUF9QSFVWCQkweDcxCi0jZGVmaW5lIFI1MTFfQ09NUF9QVlkJCTB4NzIKLSNkZWZpbmUgUjUxMV9DT01QX1BWVVYJCTB4NzMKLSNkZWZpbmUgUjUxMV9DT01QX1FIWQkJMHg3NAotI2RlZmluZSBSNTExX0NPTVBfUUhVVgkJMHg3NQotI2RlZmluZSBSNTExX0NPTVBfUVZZCQkweDc2Ci0jZGVmaW5lIFI1MTFfQ09NUF9RVlVWCQkweDc3Ci0jZGVmaW5lIFI1MTFfQ09NUF9FTgkJMHg3OAotI2RlZmluZSBSNTExX0NPTVBfTFVUX0VOCTB4NzkKLSNkZWZpbmUgUjUxMV9DT01QX0xVVF9CRUdJTgkweDgwCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgICAgICBBTFRFUk5BVEUgTlVNQkVSUyAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogQWx0ZXJuYXRlIG51bWJlcnMgZm9yIHZhcmlvdXMgbWF4IHBhY2tldCBzaXplcyAoT1Y1MTEgb25seSkgKi8KLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfOTkyCTAKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfOTkzCTEKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNzY4CTIKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNzY5CTMKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNTEyCTQKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNTEzCTUKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfMjU3CTYKLSNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfMAk3Ci0KLS8qIEFsdGVybmF0ZSBudW1iZXJzIGZvciB2YXJpb3VzIG1heCBwYWNrZXQgc2l6ZXMgKE9WNTExKyBvbmx5KSAqLwotI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfMAkwCi0jZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV8zMwkxCi0jZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV8xMjkJMgotI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfMjU3CTMKLSNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzM4NQk0Ci0jZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV81MTMJNQotI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfNzY5CTYKLSNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzk2MQk3Ci0KLS8qIEFsdGVybmF0ZSBudW1iZXJzIGZvciB2YXJpb3VzIG1heCBwYWNrZXQgc2l6ZXMgKE9WNTE4KCspIG9ubHkpICovCi0jZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzAJMAotI2RlZmluZSBPVjUxOF9BTFRfU0laRV8xMjgJMQotI2RlZmluZSBPVjUxOF9BTFRfU0laRV8yNTYJMgotI2RlZmluZSBPVjUxOF9BTFRfU0laRV8zODQJMwotI2RlZmluZSBPVjUxOF9BTFRfU0laRV81MTIJNAotI2RlZmluZSBPVjUxOF9BTFRfU0laRV82NDAJNQotI2RlZmluZSBPVjUxOF9BTFRfU0laRV83NjgJNgotI2RlZmluZSBPVjUxOF9BTFRfU0laRV84OTYJNwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgICBPVjc2MTAgUkVHSVNURVIgTU5FTU9OSUNTICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIE9WNzYxMCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19HQUlOICAgICAgICAgIDB4MDAJLyogZ2FpbiBzZXR0aW5nICg1OjApICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQkxVRSAgICAgICAgICAweDAxCS8qIGJsdWUgY2hhbm5lbCBiYWxhbmNlICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfUkVEICAgICAgICAgICAweDAyCS8qIHJlZCBjaGFubmVsIGJhbGFuY2UgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19TQVQgICAgICAgICAgIDB4MDMJLyogc2F0dXJhdGlvbiAqLwotCQkJCQkvKiAwNCByZXNlcnZlZCAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0NOVCAgICAgICAgICAgMHgwNQkvKiBZIGNvbnRyYXN0ICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQlJUICAgICAgICAgICAweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLwotCQkJCQkvKiAwOC0wYiByZXNlcnZlZCAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0JMVUVfQklBUyAgICAgMHgwQwkvKiBibHVlIGNoYW5uZWwgYmlhcyAoNTowKSAqLwotI2RlZmluZSBPVjc2MTBfUkVHX1JFRF9CSUFTICAgICAgMHgwRAkvKiByZWFkIGNoYW5uZWwgYmlhcyAoNTowKSAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0dBTU1BX0NPRUZGICAgMHgwRQkvKiBnYW1tYSBzZXR0aW5ncyAqLwotI2RlZmluZSBPVjc2MTBfUkVHX1dCX1JBTkdFICAgICAgMHgwRgkvKiBBRUMvQUxDL1MtQVdCIHNldHRpbmdzICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfRVhQICAgICAgICAgICAweDEwCS8qIG1hbnVhbCBleHBvc3VyZSBzZXR0aW5nICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQ0xPQ0sgICAgICAgICAweDExCS8qIHBvbGFyaXR5L2Nsb2NrIHByZXNjYWxlciAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9BICAgICAgICAgMHgxMgkvKiBtaXNjIGNvbW1vbiByZWdzICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0IgICAgICAgICAweDEzCS8qIG1pc2MgY29tbW9uIHJlZ3MgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19DT01fQyAgICAgICAgIDB4MTQJLyogbWlzYyBjb21tb24gcmVncyAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9EICAgICAgICAgMHgxNQkvKiBtaXNjIGNvbW1vbiByZWdzICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfRklFTERfRElWSURFICAweDE2CS8qIGZpZWxkIGludGVydmFsL21vZGUgc2V0dGluZ3MgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19IV0lOX1NUQVJUICAgIDB4MTcJLyogaG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19IV0lOX0VORCAgICAgIDB4MTgJLyogaG9yaXpvbnRhbCB3aW5kb3cgZW5kICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfVldJTl9TVEFSVCAgICAweDE5CS8qIHZlcnRpY2FsIHdpbmRvdyBzdGFydCAqLwotI2RlZmluZSBPVjc2MTBfUkVHX1ZXSU5fRU5EICAgICAgMHgxQQkvKiB2ZXJ0aWNhbCB3aW5kb3cgZW5kICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfUElYRUxfU0hJRlQgICAweDFCCS8qIHBpeGVsIHNoaWZ0ICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfSURfSElHSCAgICAgICAweDFDCS8qIG1hbnVmYWN0dXJlciBJRCBNU0IgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19JRF9MT1cgICAgICAgIDB4MUQJLyogbWFudWZhY3R1cmVyIElEIExTQiAqLwotCQkJCQkvKiAwZS0wZiByZXNlcnZlZCAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9FICAgICAgICAgMHgyMAkvKiBtaXNjIGNvbW1vbiByZWdzICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfWU9GRlNFVCAgICAgICAweDIxCS8qIFkgY2hhbm5lbCBvZmZzZXQgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19VT0ZGU0VUICAgICAgIDB4MjIJLyogVSBjaGFubmVsIG9mZnNldCAqLwotCQkJCQkvKiAyMyByZXNlcnZlZCAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0VDVyAgICAgICAgICAgMHgyNAkvKiBFeHBvc3VyZSB3aGl0ZSBsZXZlbCBmb3IgQUVDICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfRUNCICAgICAgICAgICAweDI1CS8qIEV4cG9zdXJlIGJsYWNrIGxldmVsIGZvciBBRUMgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19DT01fRiAgICAgICAgIDB4MjYJLyogbWlzYyBzZXR0aW5ncyAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9HICAgICAgICAgMHgyNwkvKiBtaXNjIHNldHRpbmdzICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0ggICAgICAgICAweDI4CS8qIG1pc2Mgc2V0dGluZ3MgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19DT01fSSAgICAgICAgIDB4MjkJLyogbWlzYyBzZXR0aW5ncyAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0ZSQU1FUkFURV9IICAgMHgyQQkvKiBmcmFtZSByYXRlIE1TQiArIG1pc2MgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19GUkFNRVJBVEVfTCAgIDB4MkIJLyogZnJhbWUgcmF0ZSBMU0IgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19BTEMgICAgICAgICAgIDB4MkMJLyogQXV0byBMZXZlbCBDb250cm9sIHNldHRpbmdzICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0ogICAgICAgICAweDJECS8qIG1pc2Mgc2V0dGluZ3MgKi8KLSNkZWZpbmUgT1Y3NjEwX1JFR19WT0ZGU0VUICAgICAgIDB4MkUJLyogViBjaGFubmVsIG9mZnNldCBhZGp1c3RtZW50ICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQVJSQVlfQklBUwkgMHgyRgkvKiBBcnJheSBiaWFzIC0tIGRvbid0IGNoYW5nZSAqLwotCQkJCQkvKiAzMC0zMiByZXNlcnZlZCAqLwotI2RlZmluZSBPVjc2MTBfUkVHX1lHQU1NQSAgICAgICAgMHgzMwkvKiBtaXNjIGdhbW1hIHNldHRpbmdzICg3OjYpICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQklBU19BREpVU1QgICAweDM0CS8qIG1pc2MgYmlhcyBzZXR0aW5ncyAqLwotI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9MICAgICAgICAgMHgzNQkvKiBtaXNjIHNldHRpbmdzICovCi0JCQkJCS8qIDM2LTM3IHJlc2VydmVkICovCi0jZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0sgICAgICAgICAweDM4CS8qIG1pc2MgcmVnaXN0ZXJzICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgICAgICAgIEkyQyBBRERSRVNTRVMgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBPVjd4eDBfU0lEICAgMHg0MgotI2RlZmluZSBPVjZ4eDBfU0lEICAgMHhDMAotI2RlZmluZSBPVjh4eDBfU0lEICAgMHhBMAotI2RlZmluZSBLUzAxMjdfU0lEICAgMHhEOAotI2RlZmluZSBTQUE3MTExQV9TSUQgMHg0OAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgICAgIE1JU0NFTExBTkVPVVMgREVGSU5FUyAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgSTJDX0NMT0NLX1BSRVNDQUxFUiAJMHgwMwotCi0jZGVmaW5lIEZSQU1FU19QRVJfREVTQwkJMTAJLyogRklYTUUgLSBXaGF0IHNob3VsZCB0aGlzIGJlPyAqLwotI2RlZmluZSBNQVhfRlJBTUVfU0laRV9QRVJfREVTQwk5OTMJLyogRm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0dWZmICovCi0jZGVmaW5lIFBJWEVMU19QRVJfU0VHCQkyNTYJLyogUGl4ZWxzIHBlciBzZWdtZW50ICovCi0KLSNkZWZpbmUgT1Y1MTFfRU5EUE9JTlRfQUREUkVTUwkxCS8qIElzb2MgZW5kcG9pbnQgbnVtYmVyICovCi0KLSNkZWZpbmUgT1Y1MTFfTlVNRlJBTUVTCTIKLSNpZiBPVjUxMV9OVU1GUkFNRVMgPiBWSURFT19NQVhfRlJBTUUKLQkjZXJyb3IgIk9WNTExX05VTUZSQU1FUyBpcyB0b28gaGlnaCIKLSNlbmRpZgotCi0jZGVmaW5lIE9WNTExX05VTVNCVUYJCTIKLQotLyogQ29udHJvbCB0cmFuc2ZlcnMgdXNlIHVwIHRvIDQgYnl0ZXMgKi8KLSNkZWZpbmUgT1Y1MTFfQ0JVRl9TSVpFCQk0Ci0KLS8qIFNpemUgb2YgdXNiX21ha2VfcGF0aCgpIGJ1ZmZlciAqLwotI2RlZmluZSBPVjUxMV9VU0JfUEFUSF9MRU4JNjQKLQotLyogQnJpZGdlIHR5cGVzICovCi1lbnVtIHsKLQlCUkdfVU5LTk9XTiwKLQlCUkdfT1Y1MTEsCi0JQlJHX09WNTExUExVUywKLQlCUkdfT1Y1MTgsCi0JQlJHX09WNTE4UExVUywKLX07Ci0KLS8qIEJyaWRnZSBjbGFzc2VzICovCi1lbnVtIHsKLQlCQ0xfVU5LTk9XTiwKLQlCQ0xfT1Y1MTEsCi0JQkNMX09WNTE4LAotfTsKLQotLyogU2Vuc29yIHR5cGVzICovCi1lbnVtIHsKLQlTRU5fVU5LTk9XTiwKLQlTRU5fT1Y3NkJFLAotCVNFTl9PVjc2MTAsCi0JU0VOX09WNzYyMCwKLQlTRU5fT1Y3NjIwQUUsCi0JU0VOX09WNjYyMCwKLQlTRU5fT1Y2NjMwLAotCVNFTl9PVjY2MzBBRSwKLQlTRU5fT1Y2NjMwQUYsCi0JU0VOX09WODYwMCwKLQlTRU5fS1MwMTI3LAotCVNFTl9LUzAxMjdCLAotCVNFTl9TQUE3MTExQSwKLX07Ci0KLWVudW0gewotCVNUQVRFX1NDQU5OSU5HLAkJLyogU2Nhbm5pbmcgZm9yIHN0YXJ0ICovCi0JU1RBVEVfSEVBREVSLAkJLyogUGFyc2luZyBoZWFkZXIgKi8KLQlTVEFURV9MSU5FUywJCS8qIFBhcnNpbmcgbGluZXMgKi8KLX07Ci0KLS8qIEJ1ZmZlciBzdGF0ZXMgKi8KLWVudW0gewotCUJVRl9OT1RfQUxMT0NBVEVELAotCUJVRl9BTExPQ0FURUQsCi19OwotCi0vKiAtLS0tLS0tLS0gRGVmaW5pdGlvbiBvZiBpb2N0bCBpbnRlcmZhY2UgLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgT1Y1MTFfSU5URVJGQUNFX1ZFUiAxMDEKLQotLyogTEVEIG9wdGlvbnMgKi8KLWVudW0gewotCUxFRF9PRkYsCi0JTEVEX09OLAotCUxFRF9BVVRPLAotfTsKLQotLyogUmF3IGZyYW1lIGZvcm1hdHMgKi8KLWVudW0gewotCVJBV0ZNVF9JTlZBTElELAotCVJBV0ZNVF9ZVVY0MDAsCi0JUkFXRk1UX1lVVjQyMCwKLQlSQVdGTVRfWVVWNDIyLAotCVJBV0ZNVF9HQlI0MjIsCi19OwotCi1zdHJ1Y3Qgb3Y1MTFfaTJjX3N0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBzbGF2ZTsgLyogV3JpdGUgc2xhdmUgSUQgKHJlYWQgSUQgLSAxKSAqLwotCXVuc2lnbmVkIGNoYXIgcmVnOyAgIC8qIEluZGV4IG9mIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgY2hhciB2YWx1ZTsgLyogVXNlciBzZXRzIHRoaXMgdy8gd3JpdGUsIGRyaXZlciBkb2VzIHcvIHJlYWQgKi8KLQl1bnNpZ25lZCBjaGFyIG1hc2s7ICAvKiBCaXRzIHRvIGJlIGNoYW5nZWQuIE5vdCB1c2VkIHdpdGggcmVhZCBvcHMgKi8KLX07Ci0KLS8qIGlvY3RscyAqLwotI2RlZmluZSBPVjUxMUlPQ19XSTJDICAgICBfSU9XKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgNSwgXAotCQkJICAgICAgIHN0cnVjdCBvdjUxMV9pMmNfc3RydWN0KQotI2RlZmluZSBPVjUxMUlPQ19SSTJDICAgIF9JT1dSKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgNiwgXAotCQkJICAgICAgIHN0cnVjdCBvdjUxMV9pMmNfc3RydWN0KQotLyogLS0tLS0tLS0tLS0tLSBFbmQgSU9DVEwgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tICovCi0KLXN0cnVjdCB1c2Jfb3Y1MTE7CQkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi0KLXN0cnVjdCBvdjUxMV9zYnVmIHsKLQlzdHJ1Y3QgdXNiX292NTExICpvdjsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCXN0cnVjdCB1cmIgKnVyYjsKLQlzcGlubG9ja190IGxvY2s7Ci0JaW50IG47Ci19OwotCi1lbnVtIHsKLQlGUkFNRV9VTlVTRUQsCQkvKiBVbnVzZWQgKG5vIE1DQVBUVVJFKSAqLwotCUZSQU1FX1JFQURZLAkJLyogUmVhZHkgdG8gc3RhcnQgZ3JhYmJpbmcgKi8KLQlGUkFNRV9HUkFCQklORywJCS8qIEluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGdyYWJiZWQgaW50byAqLwotCUZSQU1FX0RPTkUsCQkvKiBGaW5pc2hlZCBncmFiYmluZywgYnV0IG5vdCBiZWVuIHN5bmNlZCB5ZXQgKi8KLQlGUkFNRV9FUlJPUiwJCS8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZyAqLwotfTsKLQotc3RydWN0IG92NTExX3JlZ3ZhbHMgewotCWVudW0gewotCQlPVjUxMV9ET05FX0JVUywKLQkJT1Y1MTFfUkVHX0JVUywKLQkJT1Y1MTFfSTJDX0JVUywKLQl9IGJ1czsKLQl1bnNpZ25lZCBjaGFyIHJlZzsKLQl1bnNpZ25lZCBjaGFyIHZhbDsKLX07Ci0KLXN0cnVjdCBvdjUxMV9mcmFtZSB7Ci0JaW50IGZyYW1lbnVtOwkJLyogSW5kZXggb2YgdGhpcyBmcmFtZSAqLwotCXVuc2lnbmVkIGNoYXIgKmRhdGE7CS8qIEZyYW1lIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGNoYXIgKnRlbXBkYXRhOyAvKiBUZW1wIGJ1ZmZlciBmb3IgbXVsdGktc3RhZ2UgY29udmVyc2lvbnMgKi8KLQl1bnNpZ25lZCBjaGFyICpyYXdkYXRhOwkvKiBSYXcgY2FtZXJhIGRhdGEgYnVmZmVyICovCi0JdW5zaWduZWQgY2hhciAqY29tcGJ1ZjsJLyogVGVtcCBidWZmZXIgZm9yIGRlY29tcHJlc3NvciAqLwotCi0JaW50IGRlcHRoOwkJLyogQnl0ZXMgcGVyIHBpeGVsICovCi0JaW50IHdpZHRoOwkJLyogV2lkdGggYXBwbGljYXRpb24gaXMgZXhwZWN0aW5nICovCi0JaW50IGhlaWdodDsJCS8qIEhlaWdodCBhcHBsaWNhdGlvbiBpcyBleHBlY3RpbmcgKi8KLQotCWludCByYXd3aWR0aDsJCS8qIEFjdHVhbCB3aWR0aCBvZiBmcmFtZSBzZW50IGZyb20gY2FtZXJhICovCi0JaW50IHJhd2hlaWdodDsJCS8qIEFjdHVhbCBoZWlnaHQgb2YgZnJhbWUgc2VudCBmcm9tIGNhbWVyYSAqLwotCi0JaW50IHN1Yl9mbGFnOwkJLyogU3ViLWNhcHR1cmUgbW9kZSBmb3IgdGhpcyBmcmFtZT8gKi8KLQl1bnNpZ25lZCBpbnQgZm9ybWF0OwkvKiBGb3JtYXQgZm9yIHRoaXMgZnJhbWUgKi8KLQlpbnQgY29tcHJlc3NlZDsJCS8qIElzIGZyYW1lIGNvbXByZXNzZWQ/ICovCi0KLQl2b2xhdGlsZSBpbnQgZ3JhYnN0YXRlOwkvKiBTdGF0ZSBvZiBncmFiYmluZyAqLwotCWludCBzY2Fuc3RhdGU7CQkvKiBTdGF0ZSBvZiBzY2FubmluZyAqLwotCi0JaW50IGJ5dGVzX3JlY3ZkOwkvKiBOdW1iZXIgb2YgaW1hZ2UgYnl0ZXMgcmVjZWl2ZWQgZnJvbSBjYW1lcmEgKi8KLQotCWxvbmcgYnl0ZXNfcmVhZDsJLyogQW1vdW50IHRoYXQgaGFzIGJlZW4gcmVhZCgpICovCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsJLyogUHJvY2Vzc2VzIHdhaXRpbmcgKi8KLQotCWludCBzbmFwc2hvdDsJCS8qIFRydWUgaWYgZnJhbWUgd2FzIGEgc25hcHNob3QgKi8KLX07Ci0KLSNkZWZpbmUgREVDT01QX0lOVEVSRkFDRV9WRVIgNAotCi0vKiBDb21wcmVzc2lvbiBtb2R1bGUgb3BlcmF0aW9ucyAqLwotc3RydWN0IG92NTF4X2RlY29tcF9vcHMgewotCWludCAoKmRlY29tcF80MDApKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkgIGludCwgaW50LCBpbnQpOwotCWludCAoKmRlY29tcF80MjApKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkgIGludCwgaW50LCBpbnQpOwotCWludCAoKmRlY29tcF80MjIpKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkgIGludCwgaW50LCBpbnQpOwotCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotfTsKLQotc3RydWN0IHVzYl9vdjUxMSB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwotCi0JaW50IGN1c3RvbWlkOwotCWNoYXIgKmRlc2M7Ci0JdW5zaWduZWQgY2hhciBpZmFjZTsKLQljaGFyIHVzYl9wYXRoW09WNTExX1VTQl9QQVRIX0xFTl07Ci0KLQkvKiBEZXRlcm1pbmVkIGJ5IHNlbnNvciB0eXBlICovCi0JaW50IG1heHdpZHRoOwotCWludCBtYXhoZWlnaHQ7Ci0JaW50IG1pbndpZHRoOwotCWludCBtaW5oZWlnaHQ7Ci0KLQlpbnQgYnJpZ2h0bmVzczsKLQlpbnQgY29sb3VyOwotCWludCBjb250cmFzdDsKLQlpbnQgaHVlOwotCWludCB3aGl0ZW5lc3M7Ci0JaW50IGV4cG9zdXJlOwotCWludCBhdXRvX2JydDsJCS8qIEF1dG8gYnJpZ2h0bmVzcyBlbmFibGVkIGZsYWcgKi8KLQlpbnQgYXV0b19nYWluOwkJLyogQXV0byBnYWluIGNvbnRyb2wgZW5hYmxlZCBmbGFnICovCi0JaW50IGF1dG9fZXhwOwkJLyogQXV0byBleHBvc3VyZSBlbmFibGVkIGZsYWcgKi8KLQlpbnQgYmFja2xpZ2h0OwkJLyogQmFja2xpZ2h0IGV4cG9zdXJlIGFsZ29yaXRobSBmbGFnICovCi0JaW50IG1pcnJvcjsJCS8qIEltYWdlIGlzIHJldmVyc2VkIGhvcml6b250YWxseSAqLwotCi0JaW50IGxlZF9wb2xpY3k7CQkvKiBMRUQ6IG9mZnxvbnxhdXRvOyBPVjUxMSsgb25seSAqLwotCi0Jc3RydWN0IG11dGV4IGxvY2s7CS8qIFNlcmlhbGl6ZXMgdXNlci1hY2Nlc3NpYmxlIG9wZXJhdGlvbnMgKi8KLQlpbnQgdXNlcjsJCS8qIHVzZXIgY291bnQgZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KLQotCWludCBzdHJlYW1pbmc7CQkvKiBBcmUgd2Ugc3RyZWFtaW5nIElzb2Nocm9ub3VzPyAqLwotCWludCBncmFiYmluZzsJCS8qIEFyZSB3ZSBncmFiYmluZz8gKi8KLQotCWludCBjb21wcmVzczsJCS8qIFNob3VsZCB0aGUgbmV4dCBmcmFtZSBiZSBjb21wcmVzc2VkPyAqLwotCWludCBjb21wcmVzc19pbml0ZWQ7CS8qIEFyZSBjb21wcmVzc2lvbiBwYXJhbXMgdXBsb2FkZWQ/ICovCi0KLQlpbnQgbGlnaHRmcmVxOwkJLyogUG93ZXIgKGxpZ2h0aW5nKSBmcmVxdWVuY3kgKi8KLQlpbnQgYmFuZGZpbHQ7CQkvKiBCYW5kaW5nIGZpbHRlciBlbmFibGVkIGZsYWcgKi8KLQotCXVuc2lnbmVkIGNoYXIgKmZidWY7CS8qIFZpZGVvZGV2IGJ1ZmZlciBhcmVhICovCi0JdW5zaWduZWQgY2hhciAqdGVtcGZidWY7IC8qIFRlbXBvcmFyeSAoaW50ZXJtZWRpYXRlKSBidWZmZXIgYXJlYSAqLwotCXVuc2lnbmVkIGNoYXIgKnJhd2ZidWY7CS8qIFJhdyBjYW1lcmEgZGF0YSBidWZmZXIgYXJlYSAqLwotCi0JaW50IHN1Yl9mbGFnOwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgb24gZmxhZyAqLwotCWludCBzdWJ4OwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgeCBvZmZzZXQgKi8KLQlpbnQgc3VieTsJCS8qIFBpeCBBcnJheSBzdWJjYXB0dXJlIHkgb2Zmc2V0ICovCi0JaW50IHN1Ync7CQkvKiBQaXggQXJyYXkgc3ViY2FwdHVyZSB3aWR0aCAqLwotCWludCBzdWJoOwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgaGVpZ2h0ICovCi0KLQlpbnQgY3VyZnJhbWU7CQkvKiBDdXJyZW50IHJlY2VpdmluZyBzYnVmICovCi0Jc3RydWN0IG92NTExX2ZyYW1lIGZyYW1lW09WNTExX05VTUZSQU1FU107Ci0KLQlzdHJ1Y3Qgb3Y1MTFfc2J1ZiBzYnVmW09WNTExX05VTVNCVUZdOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CS8qIFByb2Nlc3NlcyB3YWl0aW5nICovCi0KLQlpbnQgc25hcF9lbmFibGVkOwkvKiBTbmFwc2hvdCBtb2RlIGVuYWJsZWQgKi8KLQotCWludCBicmlkZ2U7CQkvKiBUeXBlIG9mIGJyaWRnZSAoQlJHXyopICovCi0JaW50IGJjbGFzczsJCS8qIENsYXNzIG9mIGJyaWRnZSAoQkNMXyopICovCi0JaW50IHNlbnNvcjsJCS8qIFR5cGUgb2YgaW1hZ2Ugc2Vuc29yIGNoaXAgKFNFTl8qKSAqLwotCi0JaW50IHBhY2tldF9zaXplOwkvKiBGcmFtZSBzaXplIHBlciBpc29jIGRlc2MgKi8KLQlpbnQgcGFja2V0X251bWJlcmluZzsJLyogSXMgSVNPIGZyYW1lIG51bWJlcmluZyBlbmFibGVkPyAqLwotCi0JLyogRnJhbWVidWZmZXIvc2J1ZiBtYW5hZ2VtZW50ICovCi0JaW50IGJ1Zl9zdGF0ZTsKLQlzdHJ1Y3QgbXV0ZXggYnVmX2xvY2s7Ci0KLQlzdHJ1Y3Qgb3Y1MXhfZGVjb21wX29wcyAqZGVjb21wX29wczsKLQotCS8qIFN0b3Agc3RyZWFtaW5nIHdoaWxlIGNoYW5naW5nIHBpY3R1cmUgc2V0dGluZ3MgKi8KLQlpbnQgc3RvcF9kdXJpbmdfc2V0OwotCi0JaW50IHN0b3BwZWQ7CQkvKiBTdHJlYW1pbmcgaXMgdGVtcG9yYXJpbHkgcGF1c2VkICovCi0KLQkvKiBWaWRlbyBkZWNvZGVyIHN0dWZmICovCi0JaW50IGlucHV0OwkJLyogQ29tcG9zaXRlLCBTLVZJREVPLCBldGMuLi4gKi8KLQlpbnQgbnVtX2lucHV0czsJCS8qIE51bWJlciBvZiBpbnB1dHMgKi8KLQlpbnQgbm9ybTsgCQkvKiBOVFNDIC8gUEFMIC8gU0VDQU0gKi8KLQlpbnQgaGFzX2RlY29kZXI7CS8qIERldmljZSBoYXMgYSB2aWRlbyBkZWNvZGVyICovCi0JaW50IHBhbDsJCS8qIERldmljZSBpcyBkZXNpZ25lZCBmb3IgUEFMIHJlc29sdXRpb24gKi8KLQotCS8qIG92NTExIGRldmljZSBudW1iZXIgSUQgKi8KLQlpbnQgbnI7CQkJLyogU3RvcmVzIGEgZGV2aWNlIG51bWJlciAqLwotCi0JLyogSTJDIGludGVyZmFjZSAqLwotCXN0cnVjdCBtdXRleCBpMmNfbG9jazsJICAvKiBQcm90ZWN0IEkyQyBjb250cm9sbGVyIHJlZ3MgKi8KLQl1bnNpZ25lZCBjaGFyIHByaW1hcnlfaTJjX3NsYXZlOyAgLyogSTJDIHdyaXRlIGlkIG9mIHNlbnNvciAqLwotCi0JLyogQ29udHJvbCB0cmFuc2FjdGlvbiBzdHVmZiAqLwotCXVuc2lnbmVkIGNoYXIgKmNidWY7CQkvKiBCdWZmZXIgZm9yIHBheWxvYWQgKi8KLQlzdHJ1Y3QgbXV0ZXggY2J1Zl9sb2NrOwotfTsKLQotLyogVXNlZCB0byByZXByZXNlbnQgYSBsaXN0IG9mIHZhbHVlcyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBzeW1ib2xpYyBuYW1lcyAqLwotc3RydWN0IHN5bWJvbGljX2xpc3QgewotCWludCBudW07Ci0JY2hhciAqbmFtZTsKLX07Ci0KLSNkZWZpbmUgTk9UX0RFRklORURfU1RSICJVbmtub3duIgotCi0vKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBzeW1ib2xpY19saXN0IGFycmF5LiBUaGUKLSAqIGVuZCBvZiB0aGUgbGlzdCBtdXN0IGJlIG1hcmtlZCB3aXRoIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSBOVUxMIG5hbWUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgY2hhciAqCi1zeW1ib2xpYyhzdHJ1Y3Qgc3ltYm9saWNfbGlzdCBsaXN0W10sIGludCBudW0pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBsaXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQkJaWYgKGxpc3RbaV0ubnVtID09IG51bSkKLQkJCQlyZXR1cm4gKGxpc3RbaV0ubmFtZSk7Ci0KLQlyZXR1cm4gKE5PVF9ERUZJTkVEX1NUUik7Ci19Ci0KLS8qIENvbXByZXNzaW9uIHN0dWZmICovCi0KLSNkZWZpbmUgT1Y1MTFfUVVBTlRBQkxFU0laRQk2NAotI2RlZmluZSBPVjUxOF9RVUFOVEFCTEVTSVpFCTMyCi0KLSNkZWZpbmUgT1Y1MTFfWVFVQU5UQUJMRSB7IFwKLQkwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCBcCi0JMSwgMSwgMSwgMiwgMiwgMywgNCwgNCwgXAotCTEsIDEsIDIsIDIsIDMsIDQsIDQsIDQsIFwKLQkyLCAyLCAyLCAzLCA0LCA0LCA0LCA0LCBcCi0JMiwgMiwgMywgNCwgNCwgNSwgNSwgNSwgXAotCTMsIDMsIDQsIDQsIDUsIDUsIDUsIDUsIFwKLQkzLCA0LCA0LCA0LCA1LCA1LCA1LCA1LCBcCi0JNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSAgXAotfQotCi0jZGVmaW5lIE9WNTExX1VWUVVBTlRBQkxFIHsgXAotCTAsIDIsIDIsIDMsIDQsIDQsIDQsIDQsIFwKLQkyLCAyLCAyLCA0LCA0LCA0LCA0LCA0LCBcCi0JMiwgMiwgMywgNCwgNCwgNCwgNCwgNCwgXAotCTMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIFwKLQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCBcCi0JNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgXAotCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIFwKLQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0ICBcCi19Ci0KLSNkZWZpbmUgT1Y1MThfWVFVQU5UQUJMRSB7IFwKLQk1LCA0LCA1LCA2LCA2LCA3LCA3LCA3LCBcCi0JNSwgNSwgNSwgNSwgNiwgNywgNywgNywgXAotCTYsIDYsIDYsIDYsIDcsIDcsIDcsIDgsIFwKLQk3LCA3LCA2LCA3LCA3LCA3LCA4LCA4ICBcCi19Ci0KLSNkZWZpbmUgT1Y1MThfVVZRVUFOVEFCTEUgeyBcCi0JNiwgNiwgNiwgNywgNywgNywgNywgNywgXAotCTYsIDYsIDYsIDcsIDcsIDcsIDcsIDcsIFwKLQk2LCA2LCA2LCA3LCA3LCA3LCA3LCA4LCBcCi0JNywgNywgNywgNywgNywgNywgOCwgOCAgXAotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCmluZGV4IDM0MDM0YTcuLjI1ZWI1ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwpAQCAtNDQwLDIxICs0NDAsMjEgQEAKICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBvdjc3MnhfY29sb3JfZm9ybWF0IG92NzcyeF9jZm10c1tdID0gewogCXsKLQkJLmNvZGUJCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEUsCisJCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4LAogCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAogCQkuZHNwMwkJPSAweDAsCiAJCS5jb20zCQk9IFNXQVBfWVVWLAogCQkuY29tNwkJPSBPRk1UX1lVViwKIAl9LAogCXsKLQkJLmNvZGUJCT0gVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfTEUsCisJCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfWVZZVThfMlg4LAogCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAogCQkuZHNwMwkJPSBVVl9PTiwKIAkJLmNvbTMJCT0gU1dBUF9ZVVYsCiAJCS5jb203CQk9IE9GTVRfWVVWLAogCX0sCiAJewotCQkuY29kZQkJPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRSwKKwkJLmNvZGUJCT0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgsCiAJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCiAJCS5kc3AzCQk9IDB4MCwKIAkJLmNvbTMJCT0gMHgwLApAQCAtOTYwLDcgKzk2MCw3IEBACiAJaWYgKCFwcml2LT53aW4gfHwgIXByaXYtPmNmbXQpIHsKIAkJdTMyIHdpZHRoID0gVkdBX1dJRFRILCBoZWlnaHQgPSBWR0FfSEVJR0hUOwogCQlpbnQgcmV0ID0gb3Y3NzJ4X3NldF9wYXJhbXMoY2xpZW50LCAmd2lkdGgsICZoZWlnaHQsCi0JCQkJCSAgICBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9MRSk7CisJCQkJCSAgICBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYwppbmRleCA3Y2U5ZTA1Li40MGNkZmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogfTsKIAogc3RhdGljIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBvdjk2NDBfY29kZXNbXSA9IHsKLQlWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRSwKKwlWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCwKIAlWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfTEUsCiAJVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLAogfTsKQEAgLTQzMCw3ICs0MzAsNyBAQAogewogCXN3aXRjaCAoY29kZSkgewogCWRlZmF1bHQ6Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRToKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgogCQlhbHQtPmNvbTEyCT0gT1Y5NjQwX0NPTTEyX1lVVl9BVkc7CiAJCWFsdC0+Y29tMTMJPSBPVjk2NDBfQ09NMTNfWV9ERUxBWV9FTiB8CiAJCQkJCU9WOTY0MF9DT00xM19ZVVZfRExZKDB4MDEpOwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJfQogCiAJLyogc2VsZWN0IGNvbG9yIG1hdHJpeCBjb25maWd1cmF0aW9uIGZvciBnaXZlbiBjb2xvciBlbmNvZGluZyAqLwotCWlmIChjb2RlID09IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0JFKSB7CisJaWYgKGNvZGUgPT0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgpIHsKIAkJbWF0cml4X3JlZ3MJPSBvdjk2NDBfcmVnc195dXY7CiAJCW1hdHJpeF9yZWdzX2xlbgk9IEFSUkFZX1NJWkUob3Y5NjQwX3JlZ3NfeXV2KTsKIAl9IGVsc2UgewpAQCAtNTc5LDggKzU3OSw4IEBACiAJCWNzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQljb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkU7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRToKKwkJY29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OworCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg6CiAJCWNzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOwogCX0KIApAQCAtNjA2LDggKzYwNiw4IEBACiAJCW1mLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkU7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRToKKwkJbWYtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODsKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgogCQltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNGNkZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotb3ZjYW1jaGlwLW9ianMgICAgIDo9IG92Y2FtY2hpcF9jb3JlLm8gb3Y2eDIwLm8gb3Y2eDMwLm8gb3Y3eDEwLm8gb3Y3eDIwLm8gXAotCQkgICAgICBvdjc2YmUubwotCi1vYmotJChDT05GSUdfVklERU9fT1ZDQU1DSElQKSArPSBvdmNhbWNoaXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0MTMwZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKiBPbW5pVmlzaW9uIE9WNjYyMC9PVjYxMjAgQ2FtZXJhIENoaXAgU3VwcG9ydCBDb2RlCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+Ci0gKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KLSAqLwotCi0jZGVmaW5lIERFQlVHCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAib3ZjYW1jaGlwX3ByaXYuaCIKLQotLyogUmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFR19HQUlOCQkweDAwCS8qIGdhaW4gWzU6MF0gKi8KLSNkZWZpbmUgUkVHX0JMVUUJCTB4MDEJLyogYmx1ZSBnYWluICovCi0jZGVmaW5lIFJFR19SRUQJCQkweDAyCS8qIHJlZCBnYWluICovCi0jZGVmaW5lIFJFR19TQVQJCQkweDAzCS8qIHNhdHVyYXRpb24gKi8KLSNkZWZpbmUgUkVHX0NOVAkJCTB4MDUJLyogWSBjb250cmFzdCAqLwotI2RlZmluZSBSRUdfQlJUCQkJMHgwNgkvKiBZIGJyaWdodG5lc3MgKi8KLSNkZWZpbmUgUkVHX1dCX0JMVUUJCTB4MEMJLyogV0IgYmx1ZSByYXRpbyBbNTowXSAqLwotI2RlZmluZSBSRUdfV0JfUkVECQkweDBECS8qIFdCIHJlZCByYXRpbyBbNTowXSAqLwotI2RlZmluZSBSRUdfRVhQCQkJMHgxMAkvKiBleHBvc3VyZSAqLwotCi0vKiBXaW5kb3cgcGFyYW1ldGVycyAqLwotI2RlZmluZSBIV1NCQVNFIDB4MzgKLSNkZWZpbmUgSFdFQkFTRSAweDNBCi0jZGVmaW5lIFZXU0JBU0UgMHgwNQotI2RlZmluZSBWV0VCQVNFIDB4MDYKLQotc3RydWN0IG92NngyMCB7Ci0JaW50IGF1dG9fYnJ0OwotCWludCBhdXRvX2V4cDsKLQlpbnQgYmFja2xpZ2h0OwotCWludCBiYW5kZmlsdDsKLQlpbnQgbWlycm9yOwotfTsKLQotLyogSW5pdGlhbCB2YWx1ZXMgZm9yIHVzZSB3aXRoIE9WNTExL09WNTExKyBjYW1lcmFzICovCi1zdGF0aWMgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzIHJlZ3ZhbHNfaW5pdF82eDIwXzUxMVtdID0gewotCXsgMHgxMiwgMHg4MCB9LCAvKiByZXNldCAqLwotCXsgMHgxMSwgMHgwMSB9LAotCXsgMHgwMywgMHg2MCB9LAotCXsgMHgwNSwgMHg3ZiB9LCAvKiBGb3Igd2hlbiBhdXRvYWRqdXN0IGlzIG9mZiAqLwotCXsgMHgwNywgMHhhOCB9LAotCXsgMHgwYywgMHgyNCB9LAotCXsgMHgwZCwgMHgyNCB9LAotCXsgMHgwZiwgMHgxNSB9LCAvKiBDT01TICovCi0JeyAweDEwLCAweDc1IH0sIC8qIEFFQyBFeHBvc3VyZSB0aW1lICovCi0JeyAweDEyLCAweDI0IH0sIC8qIEVuYWJsZSBBR0MgYW5kIEFXQiAqLwotCXsgMHgxNCwgMHgwNCB9LAotCXsgMHgxNiwgMHgwMyB9LAotCXsgMHgyNiwgMHhiMiB9LCAvKiBCTEMgZW5hYmxlICovCi0JLyogMHgyODogMHgwNSBTZWxlY3RzIFJHQiBmb3JtYXQgaWYgUkdCIG9uICovCi0JeyAweDI4LCAweDA1IH0sCi0JeyAweDJhLCAweDA0IH0sIC8qIERpc2FibGUgZnJhbWVyYXRlIGFkanVzdCAqLwotCXsgMHgyZCwgMHg5OSB9LAotCXsgMHgzMywgMHhhMCB9LCAvKiBDb2xvciBQcm9jZXNzaW5nIFBhcmFtZXRlciAqLwotCXsgMHgzNCwgMHhkMiB9LCAvKiBNYXggQS9EIHJhbmdlICovCi0JeyAweDM4LCAweDhiIH0sCi0JeyAweDM5LCAweDQwIH0sCi0KLQl7IDB4M2MsIDB4MzkgfSwgLyogRW5hYmxlIEFFQyBtb2RlIGNoYW5naW5nICovCi0JeyAweDNjLCAweDNjIH0sIC8qIENoYW5nZSBBRUMgbW9kZSAqLwotCXsgMHgzYywgMHgyNCB9LCAvKiBEaXNhYmxlIEFFQyBtb2RlIGNoYW5naW5nICovCi0KLQl7IDB4M2QsIDB4ODAgfSwKLQkvKiBUaGVzZSBuZXh0IHR3byByZWdpc3RlcnMgKDB4NGEsIDB4NGIpIGFyZSB1bmRvY3VtZW50ZWQuIFRoZXkKLQkgKiBjb250cm9sIHRoZSBjb2xvciBiYWxhbmNlICovCi0JeyAweDRhLCAweDgwIH0sCi0JeyAweDRiLCAweDgwIH0sCi0JeyAweDRkLCAweGQyIH0sIC8qIFRoaXMgcmVkdWNlcyBub2lzZSBhIGJpdCAqLwotCXsgMHg0ZSwgMHhjMSB9LAotCXsgMHg0ZiwgMHgwNCB9LAotCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCi19OwotCi0vKiBJbml0aWFsIHZhbHVlcyBmb3IgdXNlIHdpdGggT1Y1MTggY2FtZXJhcyAqLwotc3RhdGljIHN0cnVjdCBvdmNhbWNoaXBfcmVndmFscyByZWd2YWxzX2luaXRfNngyMF81MThbXSA9IHsKLQl7IDB4MTIsIDB4ODAgfSwgLyogRG8gYSByZXNldCAqLwotCXsgMHgwMywgMHhjMCB9LCAvKiBTYXR1cmF0aW9uICovCi0JeyAweDA1LCAweDhhIH0sIC8qIENvbnRyYXN0ICovCi0JeyAweDBjLCAweDI0IH0sIC8qIEFXQiBibHVlICovCi0JeyAweDBkLCAweDI0IH0sIC8qIEFXQiByZWQgKi8KLQl7IDB4MGUsIDB4OGQgfSwgLyogQWRkaXRpb25hbCAyeCBnYWluICovCi0JeyAweDBmLCAweDI1IH0sIC8qIEJsYWNrIGV4cGFuZGluZyBsZXZlbCA9IDEuM1YgKi8KLQl7IDB4MTEsIDB4MDEgfSwgLyogQ2xvY2sgZGl2LiAqLwotCXsgMHgxMiwgMHgyNCB9LCAvKiBFbmFibGUgQUdDIGFuZCBBV0IgKi8KLQl7IDB4MTMsIDB4MDEgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDE0LCAweDgwIH0sIC8qIFNldCByZXNlcnZlZCBiaXQgNyAqLwotCXsgMHgxNSwgMHgwMSB9LCAvKiAoZGVmYXVsdCkgKi8KLQl7IDB4MTYsIDB4MDMgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDE3LCAweDM4IH0sIC8qIChkZWZhdWx0KSAqLwotCXsgMHgxOCwgMHhlYSB9LCAvKiAoZGVmYXVsdCkgKi8KLQl7IDB4MTksIDB4MDQgfSwKLQl7IDB4MWEsIDB4OTMgfSwKLQl7IDB4MWIsIDB4MDAgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDFlLCAweGM0IH0sIC8qIChkZWZhdWx0KSAqLwotCXsgMHgxZiwgMHgwNCB9LCAvKiAoZGVmYXVsdCkgKi8KLQl7IDB4MjAsIDB4MjAgfSwgLyogRW5hYmxlIDFzdCBzdGFnZSBhcGVydHVyZSBjb3JyZWN0aW9uICovCi0JeyAweDIxLCAweDEwIH0sIC8qIFkgb2Zmc2V0ICovCi0JeyAweDIyLCAweDg4IH0sIC8qIFUgb2Zmc2V0ICovCi0JeyAweDIzLCAweGMwIH0sIC8qIFNldCBYVEFMIHBvd2VyIGxldmVsICovCi0JeyAweDI0LCAweDUzIH0sIC8qIEFFQyBicmlnaHQgcmF0aW8gKi8KLQl7IDB4MjUsIDB4N2EgfSwgLyogQUVDIGJsYWNrIHJhdGlvICovCi0JeyAweDI2LCAweGIyIH0sIC8qIEJMQyBlbmFibGUgKi8KLQl7IDB4MjcsIDB4YTIgfSwgLyogRnVsbCBvdXRwdXQgcmFuZ2UgKi8KLQl7IDB4MjgsIDB4MDEgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDI5LCAweDAwIH0sIC8qIChkZWZhdWx0KSAqLwotCXsgMHgyYSwgMHg4NCB9LCAvKiAoZGVmYXVsdCkgKi8KLQl7IDB4MmIsIDB4YTggfSwgLyogU2V0IGN1c3RvbSBmcmFtZSByYXRlICovCi0JeyAweDJjLCAweGEwIH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4MmQsIDB4OTUgfSwgLyogRW5hYmxlIGJhbmRpbmcgZmlsdGVyICovCi0JeyAweDJlLCAweDg4IH0sIC8qIFYgb2Zmc2V0ICovCi0JeyAweDMzLCAweDIyIH0sIC8qIEx1bWluYW5jZSBnYW1tYSBvbiAqLwotCXsgMHgzNCwgMHhjNyB9LCAvKiBBL0QgYmlhcyAqLwotCXsgMHgzNiwgMHgxMiB9LCAvKiAocmVzZXJ2ZWQpICovCi0JeyAweDM3LCAweDYzIH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4MzgsIDB4OGIgfSwgLyogUXVpY2sgQUVDL0FFQiAqLwotCXsgMHgzOSwgMHgwMCB9LCAvKiAoZGVmYXVsdCkgKi8KLQl7IDB4M2EsIDB4MGYgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDNiLCAweDNjIH0sIC8qIChkZWZhdWx0KSAqLwotCXsgMHgzYywgMHg1YyB9LCAvKiBBRUMgY29udHJvbHMgKi8KLQl7IDB4M2QsIDB4ODAgfSwgLyogRHJvcCAxIChiYWQpIGZyYW1lIHdoZW4gQUVDIGNoYW5nZSAqLwotCXsgMHgzZSwgMHg4MCB9LCAvKiAoZGVmYXVsdCkgKi8KLQl7IDB4M2YsIDB4MDIgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDQwLCAweDEwIH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4NDEsIDB4MTAgfSwgLyogKHJlc2VydmVkKSAqLwotCXsgMHg0MiwgMHgwMCB9LCAvKiAocmVzZXJ2ZWQpICovCi0JeyAweDQzLCAweDdmIH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4NDQsIDB4ODAgfSwgLyogKHJlc2VydmVkKSAqLwotCXsgMHg0NSwgMHgxYyB9LCAvKiAocmVzZXJ2ZWQpICovCi0JeyAweDQ2LCAweDFjIH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4NDcsIDB4ODAgfSwgLyogKHJlc2VydmVkKSAqLwotCXsgMHg0OCwgMHg1ZiB9LCAvKiAocmVzZXJ2ZWQpICovCi0JeyAweDQ5LCAweDAwIH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4NGEsIDB4MDAgfSwgLyogQ29sb3IgYmFsYW5jZSAodW5kb2N1bWVudGVkKSAqLwotCXsgMHg0YiwgMHg4MCB9LCAvKiBDb2xvciBiYWxhbmNlICh1bmRvY3VtZW50ZWQpICovCi0JeyAweDRjLCAweDU4IH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4NGQsIDB4ZDIgfSwgLyogVSAqPSAuOTM4LCBWICo9IC44MzggKi8KLQl7IDB4NGUsIDB4YTAgfSwgLyogKGRlZmF1bHQpICovCi0JeyAweDRmLCAweDA0IH0sIC8qIFVWIDMtcG9pbnQgYXZlcmFnZSAqLwotCXsgMHg1MCwgMHhmZiB9LCAvKiAocmVzZXJ2ZWQpICovCi0JeyAweDUxLCAweDU4IH0sIC8qIChyZXNlcnZlZCkgKi8KLQl7IDB4NTIsIDB4YzAgfSwgLyogKHJlc2VydmVkKSAqLwotCXsgMHg1MywgMHg0MiB9LCAvKiAocmVzZXJ2ZWQpICovCi0JeyAweDI3LCAweGE2IH0sIC8qIEVuYWJsZSBtYW51YWwgb2Zmc2V0IGFkai4gKHJlZyAyMSAmIDIyKSAqLwotCXsgMHgxMiwgMHgyMCB9LAotCXsgMHgxMiwgMHgyNCB9LAotCi0JeyAweGZmLCAweGZmIH0sCS8qIEVORCBNQVJLRVIgKi8KLX07Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNngyMCBjYW1lcmEgY2hpcCBhbmQgcmVsZXZhbnQgdmFyaWFibGVzLiAqLwotc3RhdGljIGludCBvdjZ4MjBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y2eDIwICpzOwotCWludCByYzsKLQotCURERUJVRyg0LCAmYy0+ZGV2LCAiZW50ZXJlZCIpOwotCi0Jc3dpdGNoIChjLT5hZGFwdGVyLT5pZCkgewotCWNhc2UgSTJDX0hXX1NNQlVTX09WNTExOgotCQlyYyA9IG92X3dyaXRlX3JlZ3ZhbHMoYywgcmVndmFsc19pbml0XzZ4MjBfNTExKTsKLQkJYnJlYWs7Ci0JY2FzZSBJMkNfSFdfU01CVVNfT1Y1MTg6Ci0JCXJjID0gb3Zfd3JpdGVfcmVndmFscyhjLCByZWd2YWxzX2luaXRfNngyMF81MTgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKCZjLT5kZXYsICJvdjZ4MjA6IFVuc3VwcG9ydGVkIGFkYXB0ZXJcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0Jb3YtPnNwcml2ID0gcyA9IGt6YWxsb2Moc2l6ZW9mICpzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jcy0+YXV0b19icnQgPSAxOwotCXMtPmF1dG9fZXhwID0gMTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjZ4MjBfZnJlZShzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQotCWtmcmVlKG92LT5zcHJpdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y2eDIwX3NldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0Jc3RydWN0IG92NngyMCAqcyA9IG92LT5zcHJpdjsKLQlpbnQgcmM7Ci0JaW50IHYgPSBjdGwtPnZhbHVlOwotCi0Jc3dpdGNoIChjdGwtPmlkKSB7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0NPTlQ6Ci0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX0NOVCwgdiA+PiA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfQlJULCB2ID4+IDgpOwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgotCQlyYyA9IG92X3dyaXRlKGMsIFJFR19TQVQsIHYgPj4gOCk7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9IVUU6Ci0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX1JFRCwgMHhGRiAtICh2ID4+IDgpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX0JMVUUsIHYgPj4gOCk7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6Ci0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX0VYUCwgdik7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9GUkVROgotCXsKLQkJaW50IHNpeHR5ID0gKHYgPT0gNjApOwotCi0JCXJjID0gb3Zfd3JpdGUoYywgMHgyYiwgc2l4dHk/MHhhODoweDI4KTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCXJjID0gb3Zfd3JpdGUoYywgMHgyYSwgc2l4dHk/MHg4NDoweGE0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgT1ZDQU1DSElQX0NJRF9CQU5ERklMVDoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmQsIHY/MHgwNDoweDAwLCAweDA0KTsKLQkJcy0+YmFuZGZpbHQgPSB2OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVDoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmQsIHY/MHgxMDoweDAwLCAweDEwKTsKLQkJcy0+YXV0b19icnQgPSB2OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUDoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTMsIHY/MHgwMToweDAwLCAweDAxKTsKLQkJcy0+YXV0b19leHAgPSB2OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQkFDS0xJR0hUOgotCXsKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4NGUsIHY/MHhlMDoweGMwLCAweGUwKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDI5LCB2PzB4MDg6MHgwMCwgMHgwOCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgwZSwgdj8weDgwOjB4MDAsIDB4ODApOwotCQlzLT5iYWNrbGlnaHQgPSB2OwotCQlicmVhazsKLQl9Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX01JUlJPUjoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTIsIHY/MHg0MDoweDAwLCAweDQwKTsKLQkJcy0+bWlycm9yID0gdjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRERFQlVHKDIsICZjLT5kZXYsICJjb250cm9sIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY3RsLT5pZCk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi1vdXQ6Ci0JRERFQlVHKDMsICZjLT5kZXYsICJpZD0lZCwgYXJnPSVkLCByYz0lZCIsIGN0bC0+aWQsIHYsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y2eDIwX2dldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0Jc3RydWN0IG92NngyMCAqcyA9IG92LT5zcHJpdjsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKLQotCXN3aXRjaCAoY3RsLT5pZCkgewotCWNhc2UgT1ZDQU1DSElQX0NJRF9DT05UOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX0NOVCwgJnZhbCk7Ci0JCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKLQkJcmMgPSBvdl9yZWFkKGMsIFJFR19CUlQsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfU0FULCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfSFVFOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX0JMVUUsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfRVhQLCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgotCQljdGwtPnZhbHVlID0gcy0+YmFuZGZpbHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19icnQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19leHA7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQ6Ci0JCWN0bC0+dmFsdWUgPSBzLT5iYWNrbGlnaHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6Ci0JCWN0bC0+dmFsdWUgPSBzLT5taXJyb3I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCBjdGwtPnZhbHVlLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NngyMF9tb2RlX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfd2luZG93ICp3aW4pCi17Ci0JLyoqKioqKioqIFFDSUYtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCW92X3dyaXRlKGMsIDB4MTQsIHdpbi0+cXVhcnRlcj8weDI0OjB4MDQpOwotCi0JLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCS8qIE9WNTE4IG5lZWRzIDggYml0IG11bHRpcGxleGVkIGluIGNvbG9yIG1vZGUsIGFuZCAxNiBiaXQgaW4gQiZXICovCi0JaWYgKGMtPmFkYXB0ZXItPmlkID09IEkyQ19IV19TTUJVU19PVjUxOCkgewotCQlpZiAod2luLT5mb3JtYXQgPT0gVklERU9fUEFMRVRURV9HUkVZKQotCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDAwLCAweDIwKTsKLQkJZWxzZQotCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDIwLCAweDIwKTsKLQl9IGVsc2UgewotCQlpZiAod2luLT5mb3JtYXQgPT0gVklERU9fUEFMRVRURV9HUkVZKQotCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDIwLCAweDIwKTsKLQkJZWxzZQotCQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDAwLCAweDIwKTsKLQl9Ci0KLQkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCi0KLQkvKiBUaGUgT1Y2NjIwIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuIFRoaXMgcHJldmVudHMgdGhlCi0JICogc2V2ZXJlIGJhbmRpbmcgdGhhdCBub3JtYWxseSBvY2N1cnMgKi8KLQotCS8qIENsb2NrIGRvd24gKi8KLQlvdl93cml0ZShjLCAweDJhLCAweDA0KTsKLQotCW92X3dyaXRlKGMsIDB4MTEsIHdpbi0+Y2xvY2tkaXYpOwotCi0Jb3Zfd3JpdGUoYywgMHgyYSwgMHg4NCk7Ci0JLyogVGhpcyBuZXh0IHNldHRpbmcgaXMgY3JpdGljYWwuIEl0IHNlZW1zIHRvIGltcHJvdmUKLQkgKiB0aGUgZ2FpbiBvciB0aGUgY29udHJhc3QuIFRoZSAicmVzZXJ2ZWQiIGJpdHMgc2VlbQotCSAqIHRvIGhhdmUgc29tZSBlZmZlY3QgaW4gdGhpcyBjYXNlLiAqLwotCW92X3dyaXRlKGMsIDB4MmQsIDB4ODUpOyAvKiBGSVhNRTogVGhpcyBtZXNzZXMgdXAgYmFuZGluZyBmaWx0ZXIgKi8KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NngyMF9zZXRfd2luZG93KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQotewotCWludCByZXQsIGh3c2NhbGUsIHZ3c2NhbGU7Ci0KLQlyZXQgPSBvdjZ4MjBfbW9kZV9pbml0KGMsIHdpbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAod2luLT5xdWFydGVyKSB7Ci0JCWh3c2NhbGUgPSAwOwotCQl2d3NjYWxlID0gMDsKLQl9IGVsc2UgewotCQlod3NjYWxlID0gMTsKLQkJdndzY2FsZSA9IDE7CS8qIFRoZSBkYXRhc2hlZXQgc2F5cyAwOyBpdCdzIHdyb25nICovCi0JfQotCi0Jb3Zfd3JpdGUoYywgMHgxNywgSFdTQkFTRSArICh3aW4tPnggPj4gaHdzY2FsZSkpOwotCW92X3dyaXRlKGMsIDB4MTgsIEhXRUJBU0UgKyAoKHdpbi0+eCArIHdpbi0+d2lkdGgpID4+IGh3c2NhbGUpKTsKLQlvdl93cml0ZShjLCAweDE5LCBWV1NCQVNFICsgKHdpbi0+eSA+PiB2d3NjYWxlKSk7Ci0Jb3Zfd3JpdGUoYywgMHgxYSwgVldFQkFTRSArICgod2luLT55ICsgd2luLT5oZWlnaHQpID4+IHZ3c2NhbGUpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NngyMF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfU19DVFJMOgotCQlyZXR1cm4gb3Y2eDIwX3NldF9jb250cm9sKGMsIGFyZyk7Ci0JY2FzZSBPVkNBTUNISVBfQ01EX0dfQ1RSTDoKLQkJcmV0dXJuIG92NngyMF9nZXRfY29udHJvbChjLCBhcmcpOwotCWNhc2UgT1ZDQU1DSElQX0NNRF9TX01PREU6Ci0JCXJldHVybiBvdjZ4MjBfc2V0X3dpbmRvdyhjLCBhcmcpOwotCWRlZmF1bHQ6Ci0JCURERUJVRygyLCAmYy0+ZGV2LCAiY29tbWFuZCBub3Qgc3VwcG9ydGVkOiAlZCIsIGNtZCk7Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotfQotCi1zdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjZ4MjBfb3BzID0gewotCS5pbml0ICAgID0Jb3Y2eDIwX2luaXQsCi0JLmZyZWUgICAgPQlvdjZ4MjBfZnJlZSwKLQkuY29tbWFuZCA9CW92NngyMF9jb21tYW5kLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjk0ZjUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qIE9tbmlWaXNpb24gT1Y2NjMwL09WNjEzMCBDYW1lcmEgQ2hpcCBTdXBwb3J0IENvZGUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBNYXJrIE1jQ2xlbGxhbmQgPG1hcmtAYWxwaGEuZHluZG5zLm9yZz4KLSAqIGh0dHA6Ly9hbHBoYS5keW5kbnMub3JnL292NTExLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIE5PIFdBUlJBTlRZIE9GIEFOWSBLSU5EIGlzIGV4cHJlc3NlZCBvciBpbXBsaWVkLgotICovCi0KLSNkZWZpbmUgREVCVUcKLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICJvdmNhbWNoaXBfcHJpdi5oIgotCi0vKiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgUkVHX0dBSU4JCTB4MDAJLyogZ2FpbiBbNTowXSAqLwotI2RlZmluZSBSRUdfQkxVRQkJMHgwMQkvKiBibHVlIGdhaW4gKi8KLSNkZWZpbmUgUkVHX1JFRAkJCTB4MDIJLyogcmVkIGdhaW4gKi8KLSNkZWZpbmUgUkVHX1NBVAkJCTB4MDMJLyogc2F0dXJhdGlvbiBbNzozXSAqLwotI2RlZmluZSBSRUdfQ05UCQkJMHgwNQkvKiBZIGNvbnRyYXN0IFszOjBdICovCi0jZGVmaW5lIFJFR19CUlQJCQkweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLwotI2RlZmluZSBSRUdfU0hBUlAJCTB4MDcJLyogc2hhcnBuZXNzICovCi0jZGVmaW5lIFJFR19XQl9CTFVFCQkweDBDCS8qIFdCIGJsdWUgcmF0aW8gWzU6MF0gKi8KLSNkZWZpbmUgUkVHX1dCX1JFRAkJMHgwRAkvKiBXQiByZWQgcmF0aW8gWzU6MF0gKi8KLSNkZWZpbmUgUkVHX0VYUAkJCTB4MTAJLyogZXhwb3N1cmUgKi8KLQotLyogV2luZG93IHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgSFdTQkFTRSAweDM4Ci0jZGVmaW5lIEhXRUJBU0UgMHgzQQotI2RlZmluZSBWV1NCQVNFIDB4MDUKLSNkZWZpbmUgVldFQkFTRSAweDA2Ci0KLXN0cnVjdCBvdjZ4MzAgewotCWludCBhdXRvX2JydDsKLQlpbnQgYXV0b19leHA7Ci0JaW50IGJhY2tsaWdodDsKLQlpbnQgYmFuZGZpbHQ7Ci0JaW50IG1pcnJvcjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgcmVndmFsc19pbml0XzZ4MzBbXSA9IHsKLQl7IDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KLQl7IDB4MDAsIDB4MWYgfSwgLyogR2FpbiAqLwotCXsgMHgwMSwgMHg5OSB9LCAvKiBCbHVlIGdhaW4gKi8KLQl7IDB4MDIsIDB4N2MgfSwgLyogUmVkIGdhaW4gKi8KLQl7IDB4MDMsIDB4YzAgfSwgLyogU2F0dXJhdGlvbiAqLwotCXsgMHgwNSwgMHgwYSB9LCAvKiBDb250cmFzdCAqLwotCXsgMHgwNiwgMHg5NSB9LCAvKiBCcmlnaHRuZXNzICovCi0JeyAweDA3LCAweDJkIH0sIC8qIFNoYXJwbmVzcyAqLwotCXsgMHgwYywgMHgyMCB9LAotCXsgMHgwZCwgMHgyMCB9LAotCXsgMHgwZSwgMHgyMCB9LAotCXsgMHgwZiwgMHgwNSB9LAotCXsgMHgxMCwgMHg5YSB9LCAvKiAiZXhwb3N1cmUgY2hlY2siICovCi0JeyAweDExLCAweDAwIH0sIC8qIFBpeGVsIGNsb2NrID0gZmFzdGVzdCAqLwotCXsgMHgxMiwgMHgyNCB9LCAvKiBFbmFibGUgQUdDIGFuZCBBV0IgKi8KLQl7IDB4MTMsIDB4MjEgfSwKLQl7IDB4MTQsIDB4ODAgfSwKLQl7IDB4MTUsIDB4MDEgfSwKLQl7IDB4MTYsIDB4MDMgfSwKLQl7IDB4MTcsIDB4MzggfSwKLQl7IDB4MTgsIDB4ZWEgfSwKLQl7IDB4MTksIDB4MDQgfSwKLQl7IDB4MWEsIDB4OTMgfSwKLQl7IDB4MWIsIDB4MDAgfSwKLQl7IDB4MWUsIDB4YzQgfSwKLQl7IDB4MWYsIDB4MDQgfSwKLQl7IDB4MjAsIDB4MjAgfSwKLQl7IDB4MjEsIDB4MTAgfSwKLQl7IDB4MjIsIDB4ODggfSwKLQl7IDB4MjMsIDB4YzAgfSwgLyogQ3J5c3RhbCBjaXJjdWl0IHBvd2VyIGxldmVsICovCi0JeyAweDI1LCAweDlhIH0sIC8qIEluY3JlYXNlIEFFQyBibGFjayBwaXhlbCByYXRpbyAqLwotCXsgMHgyNiwgMHhiMiB9LCAvKiBCTEMgZW5hYmxlICovCi0JeyAweDI3LCAweGEyIH0sCi0JeyAweDI4LCAweDAwIH0sCi0JeyAweDI5LCAweDAwIH0sCi0JeyAweDJhLCAweDg0IH0sIC8qIChrZWVwKSAqLwotCXsgMHgyYiwgMHhhOCB9LCAvKiAoa2VlcCkgKi8KLQl7IDB4MmMsIDB4YTAgfSwKLQl7IDB4MmQsIDB4OTUgfSwJLyogRW5hYmxlIGF1dG8tYnJpZ2h0bmVzcyAqLwotCXsgMHgyZSwgMHg4OCB9LAotCXsgMHgzMywgMHgyNiB9LAotCXsgMHgzNCwgMHgwMyB9LAotCXsgMHgzNiwgMHg4ZiB9LAotCXsgMHgzNywgMHg4MCB9LAotCXsgMHgzOCwgMHg4MyB9LAotCXsgMHgzOSwgMHg4MCB9LAotCXsgMHgzYSwgMHgwZiB9LAotCXsgMHgzYiwgMHgzYyB9LAotCXsgMHgzYywgMHgxYSB9LAotCXsgMHgzZCwgMHg4MCB9LAotCXsgMHgzZSwgMHg4MCB9LAotCXsgMHgzZiwgMHgwZSB9LAotCXsgMHg0MCwgMHgwMCB9LCAvKiBXaGl0ZSBiYWwgKi8KLQl7IDB4NDEsIDB4MDAgfSwgLyogV2hpdGUgYmFsICovCi0JeyAweDQyLCAweDgwIH0sCi0JeyAweDQzLCAweDNmIH0sIC8qIFdoaXRlIGJhbCAqLwotCXsgMHg0NCwgMHg4MCB9LAotCXsgMHg0NSwgMHgyMCB9LAotCXsgMHg0NiwgMHgyMCB9LAotCXsgMHg0NywgMHg4MCB9LAotCXsgMHg0OCwgMHg3ZiB9LAotCXsgMHg0OSwgMHgwMCB9LAotCXsgMHg0YSwgMHgwMCB9LAotCXsgMHg0YiwgMHg4MCB9LAotCXsgMHg0YywgMHhkMCB9LAotCXsgMHg0ZCwgMHgxMCB9LCAvKiBVID0gMC41NjN1LCBWID0gMC43MTR2ICovCi0JeyAweDRlLCAweDQwIH0sCi0JeyAweDRmLCAweDA3IH0sIC8qIFVWIGF2ZXJhZ2UgbW9kZSwgY29sb3Iga2lsbGVyOiBzdHJvbmdlc3QgKi8KLQl7IDB4NTAsIDB4ZmYgfSwKLQl7IDB4NTQsIDB4MjMgfSwgLyogTWF4IEFHQyBnYWluOiAxOGRCICovCi0JeyAweDU1LCAweGZmIH0sCi0JeyAweDU2LCAweDEyIH0sCi0JeyAweDU3LCAweDgxIH0sIC8qIChkZWZhdWx0KSAqLwotCXsgMHg1OCwgMHg3NSB9LAotCXsgMHg1OSwgMHgwMSB9LCAvKiBBR0MgZGFyayBjdXJyZW50IGNvbXBlbnNhdGlvbjogKzEgKi8KLQl7IDB4NWEsIDB4MmMgfSwKLQl7IDB4NWIsIDB4MGYgfSwgLyogQVdCIGNocm9taW5hbmNlIGxldmVscyAqLwotCXsgMHg1YywgMHgxMCB9LAotCXsgMHgzZCwgMHg4MCB9LAotCXsgMHgyNywgMHhhNiB9LAotCS8qIFRvZ2dsZSBBV0Igb2ZmIGFuZCBvbiAqLwotCXsgMHgxMiwgMHgyMCB9LAotCXsgMHgxMiwgMHgyNCB9LAotCi0JeyAweGZmLCAweGZmIH0sCS8qIEVORCBNQVJLRVIgKi8KLX07Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNngzMCBjYW1lcmEgY2hpcCBhbmQgcmVsZXZhbnQgdmFyaWFibGVzLiAqLwotc3RhdGljIGludCBvdjZ4MzBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y2eDMwICpzOwotCWludCByYzsKLQotCURERUJVRyg0LCAmYy0+ZGV2LCAiZW50ZXJlZCIpOwotCi0JcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF82eDMwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlvdi0+c3ByaXYgPSBzID0ga3phbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOwotCWlmICghcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzLT5hdXRvX2JydCA9IDE7Ci0Jcy0+YXV0b19leHAgPSAxOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NngzMF9mcmVlKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCi0Ja2ZyZWUob3YtPnNwcml2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjZ4MzBfc2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCi0JCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y2eDMwICpzID0gb3YtPnNwcml2OwotCWludCByYzsKLQlpbnQgdiA9IGN0bC0+dmFsdWU7Ci0KLQlzd2l0Y2ggKGN0bC0+aWQpIHsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQ09OVDoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIFJFR19DTlQsIHYgPj4gMTIsIDB4MGYpOwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgotCQlyYyA9IG92X3dyaXRlKGMsIFJFR19CUlQsIHYgPj4gOCk7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6Ci0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX1NBVCwgdiA+PiA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0hVRToKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfUkVELCAweEZGIC0gKHYgPj4gOCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfQkxVRSwgdiA+PiA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0VYUDoKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfRVhQLCB2KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0ZSRVE6Ci0JewotCQlpbnQgc2l4dHkgPSAodiA9PSA2MCk7Ci0KLQkJcmMgPSBvdl93cml0ZShjLCAweDJiLCBzaXh0eT8weGE4OjB4MjgpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmMgPSBvdl93cml0ZShjLCAweDJhLCBzaXh0eT8weDg0OjB4YTQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyZCwgdj8weDA0OjB4MDAsIDB4MDQpOwotCQlzLT5iYW5kZmlsdCA9IHY7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyZCwgdj8weDEwOjB4MDAsIDB4MTApOwotCQlzLT5hdXRvX2JydCA9IHY7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyOCwgdj8weDAwOjB4MTAsIDB4MTApOwotCQlzLT5hdXRvX2V4cCA9IHY7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQ6Ci0JewotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHg0ZSwgdj8weDgwOjB4NjAsIDB4ZTApOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MjksIHY/MHgwODoweDAwLCAweDA4KTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDI4LCB2PzB4MDI6MHgwMCwgMHgwMik7Ci0JCXMtPmJhY2tsaWdodCA9IHY7Ci0JCWJyZWFrOwotCX0KLQljYXNlIE9WQ0FNQ0hJUF9DSURfTUlSUk9SOgotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgxMiwgdj8weDQwOjB4MDAsIDB4NDApOwotCQlzLT5taXJyb3IgPSB2OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbnRyb2wgbm90IHN1cHBvcnRlZDogJWQiLCBjdGwtPmlkKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLW91dDoKLQlEREVCVUcoMywgJmMtPmRldiwgImlkPSVkLCBhcmc9JWQsIHJjPSVkIiwgY3RsLT5pZCwgdiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjZ4MzBfZ2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCi0JCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y2eDMwICpzID0gb3YtPnNwcml2OwotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciB2YWwgPSAwOwotCi0Jc3dpdGNoIChjdGwtPmlkKSB7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0NPTlQ6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfQ05ULCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9ICh2YWwgJiAweDBmKSA8PCAxMjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKLQkJcmMgPSBvdl9yZWFkKGMsIFJFR19CUlQsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfU0FULCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfSFVFOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX0JMVUUsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfRVhQLCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgotCQljdGwtPnZhbHVlID0gcy0+YmFuZGZpbHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19icnQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19leHA7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQ6Ci0JCWN0bC0+dmFsdWUgPSBzLT5iYWNrbGlnaHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6Ci0JCWN0bC0+dmFsdWUgPSBzLT5taXJyb3I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCBjdGwtPnZhbHVlLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NngzMF9tb2RlX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfd2luZG93ICp3aW4pCi17Ci0JLyoqKioqKioqIFFDSUYtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCW92X3dyaXRlX21hc2soYywgMHgxNCwgd2luLT5xdWFydGVyPzB4MjA6MHgwMCwgMHgyMCk7Ci0KLQkvKioqKioqKiogUGFsZXR0ZS1zcGVjaWZpYyByZWdzICoqKioqKioqLwotCi0JaWYgKHdpbi0+Zm9ybWF0ID09IFZJREVPX1BBTEVUVEVfR1JFWSkgewotCQlpZiAoYy0+YWRhcHRlci0+aWQgPT0gSTJDX0hXX1NNQlVTX09WNTE4KSB7Ci0JCQkvKiBEbyBub3RoaW5nIC0gd2UncmUgYWxyZWFkeSBpbiA4LWJpdCBtb2RlICovCi0JCX0gZWxzZSB7Ci0JCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MjAsIDB4MjApOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogVGhlIE9WNTE4IG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LiBBbHRob3VnaCBib3RoIHRoZSBPVjUxOAotCQkgKiBhbmQgdGhlIE9WNjYzMCBzdXBwb3J0IGEgMTYtYml0IHZpZGVvIGJ1cywgb25seSB0aGUgOCBiaXQgWQotCQkgKiBidXMgaXMgYWN0dWFsbHkgdXNlZC4gVGhlIFVWIGJ1cyBpcyB0aWVkIHRvIGdyb3VuZC4KLQkJICogVGhlcmVmb3JlLCB0aGUgT1Y2NjMwIG5lZWRzIHRvIGJlIGluIDgtYml0IG11bHRpcGxleGVkCi0JCSAqIG91dHB1dCBtb2RlICovCi0KLQkJaWYgKGMtPmFkYXB0ZXItPmlkID09IEkyQ19IV19TTUJVU19PVjUxOCkgewotCQkJLyogRG8gbm90aGluZyAtIHdlIHdhbnQgdG8gc3RheSBpbiA4LWJpdCBtb2RlICovCi0JCQkvKiBXYXJuaW5nOiBNZXNzaW5nIHdpdGggcmVnIDB4MTMgYnJlYWtzIE9WNTE4IGNvbG9yICovCi0JCX0gZWxzZSB7Ci0JCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MDAsIDB4MjApOwotCQl9Ci0JfQotCi0JLyoqKioqKioqIENsb2NrIHByb2dyYW1taW5nICoqKioqKioqLwotCi0Jb3Zfd3JpdGUoYywgMHgxMSwgd2luLT5jbG9ja2Rpdik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjZ4MzBfc2V0X3dpbmRvdyhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IG92Y2FtY2hpcF93aW5kb3cgKndpbikKLXsKLQlpbnQgcmV0LCBod3NjYWxlLCB2d3NjYWxlOwotCi0JcmV0ID0gb3Y2eDMwX21vZGVfaW5pdChjLCB3aW4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHdpbi0+cXVhcnRlcikgewotCQlod3NjYWxlID0gMDsKLQkJdndzY2FsZSA9IDA7Ci0JfSBlbHNlIHsKLQkJaHdzY2FsZSA9IDE7Ci0JCXZ3c2NhbGUgPSAxOwkvKiBUaGUgZGF0YXNoZWV0IHNheXMgMDsgaXQncyB3cm9uZyAqLwotCX0KLQotCW92X3dyaXRlKGMsIDB4MTcsIEhXU0JBU0UgKyAod2luLT54ID4+IGh3c2NhbGUpKTsKLQlvdl93cml0ZShjLCAweDE4LCBIV0VCQVNFICsgKCh3aW4tPnggKyB3aW4tPndpZHRoKSA+PiBod3NjYWxlKSk7Ci0Jb3Zfd3JpdGUoYywgMHgxOSwgVldTQkFTRSArICh3aW4tPnkgPj4gdndzY2FsZSkpOwotCW92X3dyaXRlKGMsIDB4MWEsIFZXRUJBU0UgKyAoKHdpbi0+eSArIHdpbi0+aGVpZ2h0KSA+PiB2d3NjYWxlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjZ4MzBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPVkNBTUNISVBfQ01EX1NfQ1RSTDoKLQkJcmV0dXJuIG92NngzMF9zZXRfY29udHJvbChjLCBhcmcpOwotCWNhc2UgT1ZDQU1DSElQX0NNRF9HX0NUUkw6Ci0JCXJldHVybiBvdjZ4MzBfZ2V0X2NvbnRyb2woYywgYXJnKTsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfU19NT0RFOgotCQlyZXR1cm4gb3Y2eDMwX3NldF93aW5kb3coYywgYXJnKTsKLQlkZWZhdWx0OgotCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbW1hbmQgbm90IHN1cHBvcnRlZDogJWQiLCBjbWQpOwotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y2eDMwX29wcyA9IHsKLQkuaW5pdCAgICA9CW92NngzMF9pbml0LAotCS5mcmVlICAgID0Jb3Y2eDMwX2ZyZWUsCi0JLmNvbW1hbmQgPQlvdjZ4MzBfY29tbWFuZCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjc2YmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NzZiZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY2YmU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NzZiZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qIE9tbmlWaXNpb24gT1Y3NkJFIENhbWVyYSBDaGlwIFN1cHBvcnQgQ29kZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IE1hcmsgTWNDbGVsbGFuZCA8bWFya0BhbHBoYS5keW5kbnMub3JnPgotICogaHR0cDovL2FscGhhLmR5bmRucy5vcmcvb3Y1MTEvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgaXMgZXhwcmVzc2VkIG9yIGltcGxpZWQuCi0gKi8KLQotI2RlZmluZSBERUJVRwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgIm92Y2FtY2hpcF9wcml2LmgiCi0KLS8qIE9WNzYxMCByZWdpc3RlcnM6IFNpbmNlIHRoZSBPVjc2QkUgaXMgdW5kb2N1bWVudGVkLCB3ZSdsbCBzZXR0bGUgZm9yIHRoZXNlCi0gKiBmb3Igbm93LiAqLwotI2RlZmluZSBSRUdfR0FJTgkJMHgwMAkvKiBnYWluIFs1OjBdICovCi0jZGVmaW5lIFJFR19CTFVFCQkweDAxCS8qIGJsdWUgY2hhbm5lbCBiYWxhbmNlICovCi0jZGVmaW5lIFJFR19SRUQJCQkweDAyCS8qIHJlZCBjaGFubmVsIGJhbGFuY2UgKi8KLSNkZWZpbmUgUkVHX1NBVAkJCTB4MDMJLyogc2F0dXJhdGlvbiAqLwotI2RlZmluZSBSRUdfQ05UCQkJMHgwNQkvKiBZIGNvbnRyYXN0ICovCi0jZGVmaW5lIFJFR19CUlQJCQkweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLwotI2RlZmluZSBSRUdfQkxVRV9CSUFTCQkweDBDCS8qIGJsdWUgY2hhbm5lbCBiaWFzIFs1OjBdICovCi0jZGVmaW5lIFJFR19SRURfQklBUwkJMHgwRAkvKiByZWQgY2hhbm5lbCBiaWFzIFs1OjBdICovCi0jZGVmaW5lIFJFR19HQU1NQV9DT0VGRgkJMHgwRQkvKiBnYW1tYSBzZXR0aW5ncyAqLwotI2RlZmluZSBSRUdfV0JfUkFOR0UJCTB4MEYJLyogQUVDL0FMQy9TLUFXQiBzZXR0aW5ncyAqLwotI2RlZmluZSBSRUdfRVhQCQkJMHgxMAkvKiBtYW51YWwgZXhwb3N1cmUgc2V0dGluZyAqLwotI2RlZmluZSBSRUdfQ0xPQ0sJCTB4MTEJLyogcG9sYXJpdHkvY2xvY2sgcHJlc2NhbGVyICovCi0jZGVmaW5lIFJFR19GSUVMRF9ESVZJREUJMHgxNgkvKiBmaWVsZCBpbnRlcnZhbC9tb2RlIHNldHRpbmdzICovCi0jZGVmaW5lIFJFR19IV0lOX1NUQVJUCQkweDE3CS8qIGhvcml6b250YWwgd2luZG93IHN0YXJ0ICovCi0jZGVmaW5lIFJFR19IV0lOX0VORAkJMHgxOAkvKiBob3Jpem9udGFsIHdpbmRvdyBlbmQgKi8KLSNkZWZpbmUgUkVHX1ZXSU5fU1RBUlQJCTB4MTkJLyogdmVydGljYWwgd2luZG93IHN0YXJ0ICovCi0jZGVmaW5lIFJFR19WV0lOX0VORAkJMHgxQQkvKiB2ZXJ0aWNhbCB3aW5kb3cgZW5kICovCi0jZGVmaW5lIFJFR19QSVhFTF9TSElGVCAgIAkweDFCCS8qIHBpeGVsIHNoaWZ0ICovCi0jZGVmaW5lIFJFR19ZT0ZGU0VUCQkweDIxCS8qIFkgY2hhbm5lbCBvZmZzZXQgKi8KLSNkZWZpbmUgUkVHX1VPRkZTRVQJCTB4MjIJLyogVSBjaGFubmVsIG9mZnNldCAqLwotI2RlZmluZSBSRUdfRUNXCQkJMHgyNAkvKiBleHBvc3VyZSB3aGl0ZSBsZXZlbCBmb3IgQUVDICovCi0jZGVmaW5lIFJFR19FQ0IJCQkweDI1CS8qIGV4cG9zdXJlIGJsYWNrIGxldmVsIGZvciBBRUMgKi8KLSNkZWZpbmUgUkVHX0ZSQU1FUkFURV9ICQkweDJBCS8qIGZyYW1lIHJhdGUgTVNCICsgbWlzYyAqLwotI2RlZmluZSBSRUdfRlJBTUVSQVRFX0wJCTB4MkIJLyogZnJhbWUgcmF0ZSBMU0IgKi8KLSNkZWZpbmUgUkVHX0FMQwkJCTB4MkMJLyogQXV0byBMZXZlbCBDb250cm9sIHNldHRpbmdzICovCi0jZGVmaW5lIFJFR19WT0ZGU0VUCQkweDJFCS8qIFYgY2hhbm5lbCBvZmZzZXQgYWRqdXN0bWVudCAqLwotI2RlZmluZSBSRUdfQVJSQVlfQklBUwkJMHgyRgkvKiBhcnJheSBiaWFzIC0tIGRvbid0IGNoYW5nZSAqLwotI2RlZmluZSBSRUdfWUdBTU1BCQkweDMzCS8qIG1pc2MgZ2FtbWEgc2V0dGluZ3MgWzc6Nl0gKi8KLSNkZWZpbmUgUkVHX0JJQVNfQURKVVNUCQkweDM0CS8qIG1pc2MgYmlhcyBzZXR0aW5ncyAqLwotCi0vKiBXaW5kb3cgcGFyYW1ldGVycyAqLwotI2RlZmluZSBIV1NCQVNFIDB4MzgKLSNkZWZpbmUgSFdFQkFTRSAweDNhCi0jZGVmaW5lIFZXU0JBU0UgMHgwNQotI2RlZmluZSBWV0VCQVNFIDB4MDUKLQotc3RydWN0IG92NzZiZSB7Ci0JaW50IGF1dG9fYnJ0OwotCWludCBhdXRvX2V4cDsKLQlpbnQgYmFuZGZpbHQ7Ci0JaW50IG1pcnJvcjsKLX07Ci0KLS8qIE5PVEU6IFRoZXNlIGFyZSB0aGUgc2FtZSBhcyB0aGUgN3gxMCBzZXR0aW5ncywgYnV0IHNob3VsZCBldmVudHVhbGx5IGJlCi0gKiBvcHRpbWl6ZWQgZm9yIHRoZSBPVjc2QkUgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgcmVndmFsc19pbml0Xzc2YmVbXSA9IHsKLQl7IDB4MTAsIDB4ZmYgfSwKLQl7IDB4MTYsIDB4MDMgfSwKLQl7IDB4MjgsIDB4MjQgfSwKLQl7IDB4MmIsIDB4YWMgfSwKLQl7IDB4MTIsIDB4MDAgfSwKLQl7IDB4MzgsIDB4ODEgfSwKLQl7IDB4MjgsIDB4MjQgfSwJLyogMGMgKi8KLQl7IDB4MGYsIDB4ODUgfSwJLyogbGcncyBzZXR0aW5nICovCi0JeyAweDE1LCAweDAxIH0sCi0JeyAweDIwLCAweDFjIH0sCi0JeyAweDIzLCAweDJhIH0sCi0JeyAweDI0LCAweDEwIH0sCi0JeyAweDI1LCAweDhhIH0sCi0JeyAweDI2LCAweGEyIH0sCi0JeyAweDI3LCAweGMyIH0sCi0JeyAweDJhLCAweDA0IH0sCi0JeyAweDJjLCAweGZlIH0sCi0JeyAweDJkLCAweDkzIH0sCi0JeyAweDMwLCAweDcxIH0sCi0JeyAweDMxLCAweDYwIH0sCi0JeyAweDMyLCAweDI2IH0sCi0JeyAweDMzLCAweDIwIH0sCi0JeyAweDM0LCAweDQ4IH0sCi0JeyAweDEyLCAweDI0IH0sCi0JeyAweDExLCAweDAxIH0sCi0JeyAweDBjLCAweDI0IH0sCi0JeyAweDBkLCAweDI0IH0sCi0JeyAweGZmLCAweGZmIH0sCS8qIEVORCBNQVJLRVIgKi8KLX07Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNzZiZSBjYW1lcmEgY2hpcCBhbmQgcmVsZXZhbnQgdmFyaWFibGVzLiAqLwotc3RhdGljIGludCBvdjc2YmVfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y3NmJlICpzOwotCWludCByYzsKLQotCURERUJVRyg0LCAmYy0+ZGV2LCAiZW50ZXJlZCIpOwotCi0JcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF83NmJlKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlvdi0+c3ByaXYgPSBzID0ga3phbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOwotCWlmICghcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzLT5hdXRvX2JydCA9IDE7Ci0Jcy0+YXV0b19leHAgPSAxOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NzZiZV9mcmVlKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCi0Ja2ZyZWUob3YtPnNwcml2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjc2YmVfc2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCi0JCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y3NmJlICpzID0gb3YtPnNwcml2OwotCWludCByYzsKLQlpbnQgdiA9IGN0bC0+dmFsdWU7Ci0KLQlzd2l0Y2ggKGN0bC0+aWQpIHsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgotCQlyYyA9IG92X3dyaXRlKGMsIFJFR19CUlQsIHYgPj4gOCk7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6Ci0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX1NBVCwgdiA+PiA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0VYUDoKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfRVhQLCB2KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0ZSRVE6Ci0JewotCQlpbnQgc2l4dHkgPSAodiA9PSA2MCk7Ci0KLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmEsIHNpeHR5PzB4MDA6MHg4MCwgMHg4MCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlKGMsIDB4MmIsIHNpeHR5PzB4MDA6MHhhYyk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHg3NiwgMHgwMSwgMHgwMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIE9WQ0FNQ0hJUF9DSURfQkFOREZJTFQ6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MDQ6MHgwMCwgMHgwNCk7Ci0JCXMtPmJhbmRmaWx0ID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQ6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MTA6MHgwMCwgMHgxMCk7Ci0JCXMtPmF1dG9fYnJ0ID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9FWFA6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDEzLCB2PzB4MDE6MHgwMCwgMHgwMSk7Ci0JCXMtPmF1dG9fZXhwID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX01JUlJPUjoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTIsIHY/MHg0MDoweDAwLCAweDQwKTsKLQkJcy0+bWlycm9yID0gdjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRERFQlVHKDIsICZjLT5kZXYsICJjb250cm9sIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY3RsLT5pZCk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi1vdXQ6Ci0JRERFQlVHKDMsICZjLT5kZXYsICJpZD0lZCwgYXJnPSVkLCByYz0lZCIsIGN0bC0+aWQsIHYsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NmJlX2dldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0Jc3RydWN0IG92NzZiZSAqcyA9IG92LT5zcHJpdjsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKLQotCXN3aXRjaCAoY3RsLT5pZCkgewotCWNhc2UgT1ZDQU1DSElQX0NJRF9CUklHSFQ6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfQlJULCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX1NBVCwgJnZhbCk7Ci0JCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0VYUDoKLQkJcmMgPSBvdl9yZWFkKGMsIFJFR19FWFAsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsOwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQkFOREZJTFQ6Ci0JCWN0bC0+dmFsdWUgPSBzLT5iYW5kZmlsdDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQ6Ci0JCWN0bC0+dmFsdWUgPSBzLT5hdXRvX2JydDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9FWFA6Ci0JCWN0bC0+dmFsdWUgPSBzLT5hdXRvX2V4cDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX01JUlJPUjoKLQkJY3RsLT52YWx1ZSA9IHMtPm1pcnJvcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRERFQlVHKDIsICZjLT5kZXYsICJjb250cm9sIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY3RsLT5pZCk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JRERFQlVHKDMsICZjLT5kZXYsICJpZD0lZCwgYXJnPSVkLCByYz0lZCIsIGN0bC0+aWQsIGN0bC0+dmFsdWUsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NmJlX21vZGVfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IG92Y2FtY2hpcF93aW5kb3cgKndpbikKLXsKLQlpbnQgcXZnYSA9IHdpbi0+cXVhcnRlcjsKLQotCS8qKioqKioqKiBRVkdBLXNwZWNpZmljIHJlZ3MgKioqKioqKiovCi0KLQlvdl93cml0ZShjLCAweDE0LCBxdmdhPzB4YTQ6MHg4NCk7Ci0KLQkvKioqKioqKiogUGFsZXR0ZS1zcGVjaWZpYyByZWdzICoqKioqKioqLwotCi0JaWYgKHdpbi0+Zm9ybWF0ID09IFZJREVPX1BBTEVUVEVfR1JFWSkgewotCQlvdl93cml0ZV9tYXNrKGMsIDB4MGUsIDB4NDAsIDB4NDApOwotCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MjAsIDB4MjApOwotCX0gZWxzZSB7Ci0JCW92X3dyaXRlX21hc2soYywgMHgwZSwgMHgwMCwgMHg0MCk7Ci0JCW92X3dyaXRlX21hc2soYywgMHgxMywgMHgwMCwgMHgyMCk7Ci0JfQotCi0JLyoqKioqKioqIENsb2NrIHByb2dyYW1taW5nICoqKioqKioqLwotCi0Jb3Zfd3JpdGUoYywgMHgxMSwgd2luLT5jbG9ja2Rpdik7Ci0KLQkvKioqKioqKiogUmVzb2x1dGlvbi1zcGVjaWZpYyAqKioqKioqKi8KLQotCWlmICh3aW4tPndpZHRoID09IDY0MCAmJiB3aW4tPmhlaWdodCA9PSA0ODApCi0JCW92X3dyaXRlKGMsIDB4MzUsIDB4OWUpOwotCWVsc2UKLQkJb3Zfd3JpdGUoYywgMHgzNSwgMHgxZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjc2YmVfc2V0X3dpbmRvdyhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IG92Y2FtY2hpcF93aW5kb3cgKndpbikKLXsKLQlpbnQgcmV0LCBod3NjYWxlLCB2d3NjYWxlOwotCi0JcmV0ID0gb3Y3NmJlX21vZGVfaW5pdChjLCB3aW4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHdpbi0+cXVhcnRlcikgewotCQlod3NjYWxlID0gMTsKLQkJdndzY2FsZSA9IDA7Ci0JfSBlbHNlIHsKLQkJaHdzY2FsZSA9IDI7Ci0JCXZ3c2NhbGUgPSAxOwotCX0KLQotCW92X3dyaXRlKGMsIDB4MTcsIEhXU0JBU0UgKyAod2luLT54ID4+IGh3c2NhbGUpKTsKLQlvdl93cml0ZShjLCAweDE4LCBIV0VCQVNFICsgKCh3aW4tPnggKyB3aW4tPndpZHRoKSA+PiBod3NjYWxlKSk7Ci0Jb3Zfd3JpdGUoYywgMHgxOSwgVldTQkFTRSArICh3aW4tPnkgPj4gdndzY2FsZSkpOwotCW92X3dyaXRlKGMsIDB4MWEsIFZXRUJBU0UgKyAoKHdpbi0+eSArIHdpbi0+aGVpZ2h0KSA+PiB2d3NjYWxlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjc2YmVfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPVkNBTUNISVBfQ01EX1NfQ1RSTDoKLQkJcmV0dXJuIG92NzZiZV9zZXRfY29udHJvbChjLCBhcmcpOwotCWNhc2UgT1ZDQU1DSElQX0NNRF9HX0NUUkw6Ci0JCXJldHVybiBvdjc2YmVfZ2V0X2NvbnRyb2woYywgYXJnKTsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfU19NT0RFOgotCQlyZXR1cm4gb3Y3NmJlX3NldF93aW5kb3coYywgYXJnKTsKLQlkZWZhdWx0OgotCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbW1hbmQgbm90IHN1cHBvcnRlZDogJWQiLCBjbWQpOwotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3NmJlX29wcyA9IHsKLQkuaW5pdCAgICA9CW92NzZiZV9pbml0LAotCS5mcmVlICAgID0Jb3Y3NmJlX2ZyZWUsCi0JLmNvbW1hbmQgPQlvdjc2YmVfY29tbWFuZCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjd4MTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2ZTc5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qIE9tbmlWaXNpb24gT1Y3NjEwL09WNzExMCBDYW1lcmEgQ2hpcCBTdXBwb3J0IENvZGUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBNYXJrIE1jQ2xlbGxhbmQgPG1hcmtAYWxwaGEuZHluZG5zLm9yZz4KLSAqIGh0dHA6Ly9hbHBoYS5keW5kbnMub3JnL292NTExLwotICoKLSAqIENvbG9yIGZpeGVzIGJ5IGJ5IE9yaW9uIFNreSBMYXdsb3IgPG9sYXdsb3JAYWNtLm9yZz4gKDIvMjYvMjAwMCkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KLSAqLwotCi0jZGVmaW5lIERFQlVHCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAib3ZjYW1jaGlwX3ByaXYuaCIKLQotLyogUmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFR19HQUlOCQkweDAwCS8qIGdhaW4gWzU6MF0gKi8KLSNkZWZpbmUgUkVHX0JMVUUJCTB4MDEJLyogYmx1ZSBjaGFubmVsIGJhbGFuY2UgKi8KLSNkZWZpbmUgUkVHX1JFRAkJCTB4MDIJLyogcmVkIGNoYW5uZWwgYmFsYW5jZSAqLwotI2RlZmluZSBSRUdfU0FUCQkJMHgwMwkvKiBzYXR1cmF0aW9uICovCi0jZGVmaW5lIFJFR19DTlQJCQkweDA1CS8qIFkgY29udHJhc3QgKi8KLSNkZWZpbmUgUkVHX0JSVAkJCTB4MDYJLyogWSBicmlnaHRuZXNzICovCi0jZGVmaW5lIFJFR19CTFVFX0JJQVMJCTB4MEMJLyogYmx1ZSBjaGFubmVsIGJpYXMgWzU6MF0gKi8KLSNkZWZpbmUgUkVHX1JFRF9CSUFTCQkweDBECS8qIHJlZCBjaGFubmVsIGJpYXMgWzU6MF0gKi8KLSNkZWZpbmUgUkVHX0dBTU1BX0NPRUZGCQkweDBFCS8qIGdhbW1hIHNldHRpbmdzICovCi0jZGVmaW5lIFJFR19XQl9SQU5HRQkJMHgwRgkvKiBBRUMvQUxDL1MtQVdCIHNldHRpbmdzICovCi0jZGVmaW5lIFJFR19FWFAJCQkweDEwCS8qIG1hbnVhbCBleHBvc3VyZSBzZXR0aW5nICovCi0jZGVmaW5lIFJFR19DTE9DSwkJMHgxMQkvKiBwb2xhcml0eS9jbG9jayBwcmVzY2FsZXIgKi8KLSNkZWZpbmUgUkVHX0ZJRUxEX0RJVklERQkweDE2CS8qIGZpZWxkIGludGVydmFsL21vZGUgc2V0dGluZ3MgKi8KLSNkZWZpbmUgUkVHX0hXSU5fU1RBUlQJCTB4MTcJLyogaG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQgKi8KLSNkZWZpbmUgUkVHX0hXSU5fRU5ECQkweDE4CS8qIGhvcml6b250YWwgd2luZG93IGVuZCAqLwotI2RlZmluZSBSRUdfVldJTl9TVEFSVAkJMHgxOQkvKiB2ZXJ0aWNhbCB3aW5kb3cgc3RhcnQgKi8KLSNkZWZpbmUgUkVHX1ZXSU5fRU5ECQkweDFBCS8qIHZlcnRpY2FsIHdpbmRvdyBlbmQgKi8KLSNkZWZpbmUgUkVHX1BJWEVMX1NISUZUICAgCTB4MUIJLyogcGl4ZWwgc2hpZnQgKi8KLSNkZWZpbmUgUkVHX1lPRkZTRVQJCTB4MjEJLyogWSBjaGFubmVsIG9mZnNldCAqLwotI2RlZmluZSBSRUdfVU9GRlNFVAkJMHgyMgkvKiBVIGNoYW5uZWwgb2Zmc2V0ICovCi0jZGVmaW5lIFJFR19FQ1cJCQkweDI0CS8qIGV4cG9zdXJlIHdoaXRlIGxldmVsIGZvciBBRUMgKi8KLSNkZWZpbmUgUkVHX0VDQgkJCTB4MjUJLyogZXhwb3N1cmUgYmxhY2sgbGV2ZWwgZm9yIEFFQyAqLwotI2RlZmluZSBSRUdfRlJBTUVSQVRFX0gJCTB4MkEJLyogZnJhbWUgcmF0ZSBNU0IgKyBtaXNjICovCi0jZGVmaW5lIFJFR19GUkFNRVJBVEVfTAkJMHgyQgkvKiBmcmFtZSByYXRlIExTQiAqLwotI2RlZmluZSBSRUdfQUxDCQkJMHgyQwkvKiBBdXRvIExldmVsIENvbnRyb2wgc2V0dGluZ3MgKi8KLSNkZWZpbmUgUkVHX1ZPRkZTRVQJCTB4MkUJLyogViBjaGFubmVsIG9mZnNldCBhZGp1c3RtZW50ICovCi0jZGVmaW5lIFJFR19BUlJBWV9CSUFTCQkweDJGCS8qIGFycmF5IGJpYXMgLS0gZG9uJ3QgY2hhbmdlICovCi0jZGVmaW5lIFJFR19ZR0FNTUEJCTB4MzMJLyogbWlzYyBnYW1tYSBzZXR0aW5ncyBbNzo2XSAqLwotI2RlZmluZSBSRUdfQklBU19BREpVU1QJCTB4MzQJLyogbWlzYyBiaWFzIHNldHRpbmdzICovCi0KLS8qIFdpbmRvdyBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIEhXU0JBU0UgMHgzOAotI2RlZmluZSBIV0VCQVNFIDB4M2EKLSNkZWZpbmUgVldTQkFTRSAweDA1Ci0jZGVmaW5lIFZXRUJBU0UgMHgwNQotCi1zdHJ1Y3Qgb3Y3eDEwIHsKLQlpbnQgYXV0b19icnQ7Ci0JaW50IGF1dG9fZXhwOwotCWludCBiYW5kZmlsdDsKLQlpbnQgbWlycm9yOwotfTsKLQotLyogTGF3cmVuY2UgR2xhaXN0ZXIgPGxnQGpmbS5iYy5jYT4gcmVwb3J0czoKLSAqCi0gKiBSZWdpc3RlciAweDBmIGluIHRoZSA3NjEwIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6Ci0gKgotICogMHg4NSAoQUVDIG1ldGhvZCAxKTogQmVzdCBvdmVyYWxsLCBnb29kIGNvbnRyYXN0IHJhbmdlCi0gKiAweDQ1IChBRUMgbWV0aG9kIDIpOiBWZXJ5IG92ZXJleHBvc2VkCi0gKiAweGE1IChzcGVjIHNoZWV0IGRlZmF1bHQpOiBPaywgYnV0IHRoZSBibGFjayBsZXZlbCBpcwotICoJc2hpZnRlZCByZXN1bHRpbmcgaW4gbG9zcyBvZiBjb250cmFzdAotICogMHgwNSAob2xkIGRyaXZlciBzZXR0aW5nKTogdmVyeSBvdmVyZXhwb3NlZCwgdG9vIG11Y2gKLSAqCWNvbnRyYXN0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgcmVndmFsc19pbml0Xzd4MTBbXSA9IHsKLQl7IDB4MTAsIDB4ZmYgfSwKLQl7IDB4MTYsIDB4MDMgfSwKLQl7IDB4MjgsIDB4MjQgfSwKLQl7IDB4MmIsIDB4YWMgfSwKLQl7IDB4MTIsIDB4MDAgfSwKLQl7IDB4MzgsIDB4ODEgfSwKLQl7IDB4MjgsIDB4MjQgfSwJLyogMGMgKi8KLQl7IDB4MGYsIDB4ODUgfSwJLyogbGcncyBzZXR0aW5nICovCi0JeyAweDE1LCAweDAxIH0sCi0JeyAweDIwLCAweDFjIH0sCi0JeyAweDIzLCAweDJhIH0sCi0JeyAweDI0LCAweDEwIH0sCi0JeyAweDI1LCAweDhhIH0sCi0JeyAweDI2LCAweGEyIH0sCi0JeyAweDI3LCAweGMyIH0sCi0JeyAweDJhLCAweDA0IH0sCi0JeyAweDJjLCAweGZlIH0sCi0JeyAweDJkLCAweDkzIH0sCi0JeyAweDMwLCAweDcxIH0sCi0JeyAweDMxLCAweDYwIH0sCi0JeyAweDMyLCAweDI2IH0sCi0JeyAweDMzLCAweDIwIH0sCi0JeyAweDM0LCAweDQ4IH0sCi0JeyAweDEyLCAweDI0IH0sCi0JeyAweDExLCAweDAxIH0sCi0JeyAweDBjLCAweDI0IH0sCi0JeyAweDBkLCAweDI0IH0sCi0JeyAweGZmLCAweGZmIH0sCS8qIEVORCBNQVJLRVIgKi8KLX07Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WN3gxMCBjYW1lcmEgY2hpcCBhbmQgcmVsZXZhbnQgdmFyaWFibGVzLiAqLwotc3RhdGljIGludCBvdjd4MTBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y3eDEwICpzOwotCWludCByYzsKLQotCURERUJVRyg0LCAmYy0+ZGV2LCAiZW50ZXJlZCIpOwotCi0JcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF83eDEwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlvdi0+c3ByaXYgPSBzID0ga3phbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOwotCWlmICghcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzLT5hdXRvX2JydCA9IDE7Ci0Jcy0+YXV0b19leHAgPSAxOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92N3gxMF9mcmVlKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCi0Ja2ZyZWUob3YtPnNwcml2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjd4MTBfc2V0X2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKmMsCi0JCQkgICAgICBzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y3eDEwICpzID0gb3YtPnNwcml2OwotCWludCByYzsKLQlpbnQgdiA9IGN0bC0+dmFsdWU7Ci0KLQlzd2l0Y2ggKGN0bC0+aWQpIHsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQ09OVDoKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfQ05ULCB2ID4+IDgpOwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgotCQlyYyA9IG92X3dyaXRlKGMsIFJFR19CUlQsIHYgPj4gOCk7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6Ci0JCXJjID0gb3Zfd3JpdGUoYywgUkVHX1NBVCwgdiA+PiA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0hVRToKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfUkVELCAweEZGIC0gKHYgPj4gOCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfQkxVRSwgdiA+PiA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0VYUDoKLQkJcmMgPSBvdl93cml0ZShjLCBSRUdfRVhQLCB2KTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0ZSRVE6Ci0JewotCQlpbnQgc2l4dHkgPSAodiA9PSA2MCk7Ci0KLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmEsIHNpeHR5PzB4MDA6MHg4MCwgMHg4MCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlKGMsIDB4MmIsIHNpeHR5PzB4MDA6MHhhYyk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgxMywgMHgxMCwgMHgxMCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgxMywgMHgwMCwgMHgxMCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIE9WQ0FNQ0hJUF9DSURfQkFOREZJTFQ6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MDQ6MHgwMCwgMHgwNCk7Ci0JCXMtPmJhbmRmaWx0ID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQ6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MTA6MHgwMCwgMHgxMCk7Ci0JCXMtPmF1dG9fYnJ0ID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9FWFA6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDI5LCB2PzB4MDA6MHg4MCwgMHg4MCk7Ci0JCXMtPmF1dG9fZXhwID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX01JUlJPUjoKLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MTIsIHY/MHg0MDoweDAwLCAweDQwKTsKLQkJcy0+bWlycm9yID0gdjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRERFQlVHKDIsICZjLT5kZXYsICJjb250cm9sIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY3RsLT5pZCk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi1vdXQ6Ci0JRERFQlVHKDMsICZjLT5kZXYsICJpZD0lZCwgYXJnPSVkLCByYz0lZCIsIGN0bC0+aWQsIHYsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3eDEwX2dldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJICAgICAgc3RydWN0IG92Y2FtY2hpcF9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0Jc3RydWN0IG92N3gxMCAqcyA9IG92LT5zcHJpdjsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKLQotCXN3aXRjaCAoY3RsLT5pZCkgewotCWNhc2UgT1ZDQU1DSElQX0NJRF9DT05UOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX0NOVCwgJnZhbCk7Ci0JCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKLQkJcmMgPSBvdl9yZWFkKGMsIFJFR19CUlQsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9TQVQ6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfU0FULCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbCA8PCA4OwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfSFVFOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX0JMVUUsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfRVhQLCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgotCQljdGwtPnZhbHVlID0gcy0+YmFuZGZpbHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19icnQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19leHA7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6Ci0JCWN0bC0+dmFsdWUgPSBzLT5taXJyb3I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCBjdGwtPnZhbHVlLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92N3gxMF9tb2RlX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfd2luZG93ICp3aW4pCi17Ci0JaW50IHF2Z2EgPSB3aW4tPnF1YXJ0ZXI7Ci0KLQkvKioqKioqKiogUVZHQS1zcGVjaWZpYyByZWdzICoqKioqKioqLwotCi0Jb3Zfd3JpdGUoYywgMHgxNCwgcXZnYT8weDI0OjB4MDQpOwotCi0JLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KLQotCWlmICh3aW4tPmZvcm1hdCA9PSBWSURFT19QQUxFVFRFX0dSRVkpIHsKLQkJb3Zfd3JpdGVfbWFzayhjLCAweDBlLCAweDQwLCAweDQwKTsKLQkJb3Zfd3JpdGVfbWFzayhjLCAweDEzLCAweDIwLCAweDIwKTsKLQl9IGVsc2UgewotCQlvdl93cml0ZV9tYXNrKGMsIDB4MGUsIDB4MDAsIDB4NDApOwotCQlvdl93cml0ZV9tYXNrKGMsIDB4MTMsIDB4MDAsIDB4MjApOwotCX0KLQotCS8qKioqKioqKiBDbG9jayBwcm9ncmFtbWluZyAqKioqKioqKi8KLQotCW92X3dyaXRlKGMsIDB4MTEsIHdpbi0+Y2xvY2tkaXYpOwotCi0JLyoqKioqKioqIFJlc29sdXRpb24tc3BlY2lmaWMgKioqKioqKiovCi0KLQlpZiAod2luLT53aWR0aCA9PSA2NDAgJiYgd2luLT5oZWlnaHQgPT0gNDgwKQotCQlvdl93cml0ZShjLCAweDM1LCAweDllKTsKLQllbHNlCi0JCW92X3dyaXRlKGMsIDB4MzUsIDB4MWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3eDEwX3NldF93aW5kb3coc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfd2luZG93ICp3aW4pCi17Ci0JaW50IHJldCwgaHdzY2FsZSwgdndzY2FsZTsKLQotCXJldCA9IG92N3gxMF9tb2RlX2luaXQoYywgd2luKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICh3aW4tPnF1YXJ0ZXIpIHsKLQkJaHdzY2FsZSA9IDE7Ci0JCXZ3c2NhbGUgPSAwOwotCX0gZWxzZSB7Ci0JCWh3c2NhbGUgPSAyOwotCQl2d3NjYWxlID0gMTsKLQl9Ci0KLQlvdl93cml0ZShjLCAweDE3LCBIV1NCQVNFICsgKHdpbi0+eCA+PiBod3NjYWxlKSk7Ci0Jb3Zfd3JpdGUoYywgMHgxOCwgSFdFQkFTRSArICgod2luLT54ICsgd2luLT53aWR0aCkgPj4gaHdzY2FsZSkpOwotCW92X3dyaXRlKGMsIDB4MTksIFZXU0JBU0UgKyAod2luLT55ID4+IHZ3c2NhbGUpKTsKLQlvdl93cml0ZShjLCAweDFhLCBWV0VCQVNFICsgKCh3aW4tPnkgKyB3aW4tPmhlaWdodCkgPj4gdndzY2FsZSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3eDEwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgT1ZDQU1DSElQX0NNRF9TX0NUUkw6Ci0JCXJldHVybiBvdjd4MTBfc2V0X2NvbnRyb2woYywgYXJnKTsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfR19DVFJMOgotCQlyZXR1cm4gb3Y3eDEwX2dldF9jb250cm9sKGMsIGFyZyk7Ci0JY2FzZSBPVkNBTUNISVBfQ01EX1NfTU9ERToKLQkJcmV0dXJuIG92N3gxMF9zZXRfd2luZG93KGMsIGFyZyk7Ci0JZGVmYXVsdDoKLQkJRERFQlVHKDIsICZjLT5kZXYsICJjb21tYW5kIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgY21kKTsKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci19Ci0KLXN0cnVjdCBvdmNhbWNoaXBfb3BzIG92N3gxMF9vcHMgPSB7Ci0JLmluaXQgICAgPQlvdjd4MTBfaW5pdCwKLQkuZnJlZSAgICA9CW92N3gxMF9mcmVlLAotCS5jb21tYW5kID0Jb3Y3eDEwX2NvbW1hbmQsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjd4MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyNmFlMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjd4MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKiBPbW5pVmlzaW9uIE9WNzYyMC9PVjcxMjAgQ2FtZXJhIENoaXAgU3VwcG9ydCBDb2RlCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+Ci0gKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KLSAqCi0gKiBPVjc2MjAgZml4ZXMgYnkgQ2hhcmwgUC4gQm90aGEgPGNwYm90aGFAaWVlZS5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgaXMgZXhwcmVzc2VkIG9yIGltcGxpZWQuCi0gKi8KLQotI2RlZmluZSBERUJVRwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgIm92Y2FtY2hpcF9wcml2LmgiCi0KLS8qIFJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfR0FJTgkJMHgwMAkvKiBnYWluIFs1OjBdICovCi0jZGVmaW5lIFJFR19CTFVFCQkweDAxCS8qIGJsdWUgZ2FpbiAqLwotI2RlZmluZSBSRUdfUkVECQkJMHgwMgkvKiByZWQgZ2FpbiAqLwotI2RlZmluZSBSRUdfU0FUCQkJMHgwMwkvKiBzYXR1cmF0aW9uICovCi0jZGVmaW5lIFJFR19CUlQJCQkweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLwotI2RlZmluZSBSRUdfU0hBUlAJCTB4MDcJLyogYW5hbG9nIHNoYXJwbmVzcyAqLwotI2RlZmluZSBSRUdfQkxVRV9CSUFTCQkweDBDCS8qIFdCIGJsdWUgcmF0aW8gWzU6MF0gKi8KLSNkZWZpbmUgUkVHX1JFRF9CSUFTCQkweDBECS8qIFdCIHJlZCByYXRpbyBbNTowXSAqLwotI2RlZmluZSBSRUdfRVhQCQkJMHgxMAkvKiBleHBvc3VyZSAqLwotCi0vKiBEZWZhdWx0IGNvbnRyb2wgc2V0dGluZ3MuIFZhbHVlcyBhcmUgaW4gdGVybXMgb2YgVjRMMiBjb250cm9scy4gKi8KLSNkZWZpbmUgT1Y3MTIwX0RGTF9CUklHSFQgICAgIDB4NjAKLSNkZWZpbmUgT1Y3NjIwX0RGTF9CUklHSFQgICAgIDB4NjAKLSNkZWZpbmUgT1Y3MTIwX0RGTF9TQVQgICAgICAgIDB4YjAKLSNkZWZpbmUgT1Y3NjIwX0RGTF9TQVQgICAgICAgIDB4YzAKLSNkZWZpbmUgREZMX0FVVE9fRVhQICAgICAgICAgICAgIDEKLSNkZWZpbmUgREZMX0FVVE9fR0FJTiAgICAgICAgICAgIDEKLSNkZWZpbmUgT1Y3MTIwX0RGTF9HQUlOICAgICAgIDB4MDAKLSNkZWZpbmUgT1Y3NjIwX0RGTF9HQUlOICAgICAgIDB4MDAKLS8qIE5PVEU6IFNpbmNlIGF1dG9leHBvc3VyZSBpcyB0aGUgZGVmYXVsdCwgdGhlc2UgYXJlbid0IHByb2dyYW1tZWQgaW50byB0aGUKLSAqIE9WN3gyMCBjaGlwLiBUaGV5IGFyZSBqdXN0IGhlcmUgYmVjYXVzZSBWNEwyIGV4cGVjdHMgYSBkZWZhdWx0ICovCi0jZGVmaW5lIE9WNzEyMF9ERkxfRVhQICAgICAgICAweDdmCi0jZGVmaW5lIE9WNzYyMF9ERkxfRVhQICAgICAgICAweDdmCi0KLS8qIFdpbmRvdyBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIEhXU0JBU0UgMHgyRgkvKiBGcm9tIDc2MjAuU0VUIChzcGVjIGlzIHdyb25nKSAqLwotI2RlZmluZSBIV0VCQVNFIDB4MkYKLSNkZWZpbmUgVldTQkFTRSAweDA1Ci0jZGVmaW5lIFZXRUJBU0UgMHgwNQotCi1zdHJ1Y3Qgb3Y3eDIwIHsKLQlpbnQgYXV0b19icnQ7Ci0JaW50IGF1dG9fZXhwOwotCWludCBhdXRvX2dhaW47Ci0JaW50IGJhY2tsaWdodDsKLQlpbnQgYmFuZGZpbHQ7Ci0JaW50IG1pcnJvcjsKLX07Ci0KLS8qIENvbnRyYXN0IGxvb2stdXAgdGFibGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGN0YWJbXSA9IHsKLQkweDAxLCAweDA1LCAweDA5LCAweDExLCAweDE1LCAweDM1LCAweDM3LCAweDU3LAotCTB4NWIsIDB4YTUsIDB4YTcsIDB4YzcsIDB4YzksIDB4Y2YsIDB4ZWYsIDB4ZmYKLX07Ci0KLS8qIFNldHRpbmdzIGZvciAoQmxhY2sgJiBXaGl0ZSkgT1Y3MTIwIGNhbWVyYSBjaGlwICovCi1zdGF0aWMgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzIHJlZ3ZhbHNfaW5pdF83MTIwW10gPSB7Ci0JeyAweDEyLCAweDgwIH0sIC8qIHJlc2V0ICovCi0JeyAweDEzLCAweDAwIH0sIC8qIEF1dG9hZGp1c3Qgb2ZmICovCi0JeyAweDEyLCAweDIwIH0sIC8qIERpc2FibGUgQVdCICovCi0JeyAweDEzLCBERkxfQVVUT19HQUlOPzB4MDE6MHgwMCB9LCAvKiBBdXRvYWRqdXN0IG9uIChpZiBkZXNpcmVkKSAqLwotCXsgMHgwMCwgT1Y3MTIwX0RGTF9HQUlOIH0sCi0JeyAweDAxLCAweDgwIH0sCi0JeyAweDAyLCAweDgwIH0sCi0JeyAweDAzLCBPVjcxMjBfREZMX1NBVCB9LAotCXsgMHgwNiwgT1Y3MTIwX0RGTF9CUklHSFQgfSwKLQl7IDB4MDcsIDB4MDAgfSwKLQl7IDB4MGMsIDB4MjAgfSwKLQl7IDB4MGQsIDB4MjAgfSwKLQl7IDB4MTEsIDB4MDEgfSwKLQl7IDB4MTQsIDB4ODQgfSwKLQl7IDB4MTUsIDB4MDEgfSwKLQl7IDB4MTYsIDB4MDMgfSwKLQl7IDB4MTcsIDB4MmYgfSwKLQl7IDB4MTgsIDB4Y2YgfSwKLQl7IDB4MTksIDB4MDYgfSwKLQl7IDB4MWEsIDB4ZjUgfSwKLQl7IDB4MWIsIDB4MDAgfSwKLQl7IDB4MjAsIDB4MDggfSwKLQl7IDB4MjEsIDB4ODAgfSwKLQl7IDB4MjIsIDB4ODAgfSwKLQl7IDB4MjMsIDB4MDAgfSwKLQl7IDB4MjYsIDB4YTAgfSwKLQl7IDB4MjcsIDB4ZmEgfSwKLQl7IDB4MjgsIDB4MjAgfSwgLyogRE9OJ1Qgc2V0IGJpdCA2LiBJdCBpcyBmb3IgdGhlIE9WNzYyMCBvbmx5ICovCi0JeyAweDI5LCBERkxfQVVUT19FWFA/MHgwMDoweDgwIH0sCi0JeyAweDJhLCAweDEwIH0sCi0JeyAweDJiLCAweDAwIH0sCi0JeyAweDJjLCAweDg4IH0sCi0JeyAweDJkLCAweDk1IH0sCi0JeyAweDJlLCAweDgwIH0sCi0JeyAweDJmLCAweDQ0IH0sCi0JeyAweDYwLCAweDIwIH0sCi0JeyAweDYxLCAweDAyIH0sCi0JeyAweDYyLCAweDVmIH0sCi0JeyAweDYzLCAweGQ1IH0sCi0JeyAweDY0LCAweDU3IH0sCi0JeyAweDY1LCAweDgzIH0sIC8qIE9WIHNheXMgImRvbid0IGNoYW5nZSB0aGlzIHZhbHVlIiAqLwotCXsgMHg2NiwgMHg1NSB9LAotCXsgMHg2NywgMHg5MiB9LAotCXsgMHg2OCwgMHhjZiB9LAotCXsgMHg2OSwgMHg3NiB9LAotCXsgMHg2YSwgMHgyMiB9LAotCXsgMHg2YiwgMHhlMiB9LAotCXsgMHg2YywgMHg0MCB9LAotCXsgMHg2ZCwgMHg0OCB9LAotCXsgMHg2ZSwgMHg4MCB9LAotCXsgMHg2ZiwgMHgwZCB9LAotCXsgMHg3MCwgMHg4OSB9LAotCXsgMHg3MSwgMHgwMCB9LAotCXsgMHg3MiwgMHgxNCB9LAotCXsgMHg3MywgMHg1NCB9LAotCXsgMHg3NCwgMHhhMCB9LAotCXsgMHg3NSwgMHg4ZSB9LAotCXsgMHg3NiwgMHgwMCB9LAotCXsgMHg3NywgMHhmZiB9LAotCXsgMHg3OCwgMHg4MCB9LAotCXsgMHg3OSwgMHg4MCB9LAotCXsgMHg3YSwgMHg4MCB9LAotCXsgMHg3YiwgMHhlNiB9LAotCXsgMHg3YywgMHgwMCB9LAotCXsgMHgyNCwgMHgzYSB9LAotCXsgMHgyNSwgMHg2MCB9LAotCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCi19OwotCi0vKiBTZXR0aW5ncyBmb3IgKGNvbG9yKSBPVjc2MjAgY2FtZXJhIGNoaXAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgcmVndmFsc19pbml0Xzc2MjBbXSA9IHsKLQl7IDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KLQl7IDB4MDAsIE9WNzYyMF9ERkxfR0FJTiB9LAotCXsgMHgwMSwgMHg4MCB9LAotCXsgMHgwMiwgMHg4MCB9LAotCXsgMHgwMywgT1Y3NjIwX0RGTF9TQVQgfSwKLQl7IDB4MDYsIE9WNzYyMF9ERkxfQlJJR0hUIH0sCi0JeyAweDA3LCAweDAwIH0sCi0JeyAweDBjLCAweDI0IH0sCi0JeyAweDBjLCAweDI0IH0sCi0JeyAweDBkLCAweDI0IH0sCi0JeyAweDExLCAweDAxIH0sCi0JeyAweDEyLCAweDI0IH0sCi0JeyAweDEzLCBERkxfQVVUT19HQUlOPzB4MDE6MHgwMCB9LAotCXsgMHgxNCwgMHg4NCB9LAotCXsgMHgxNSwgMHgwMSB9LAotCXsgMHgxNiwgMHgwMyB9LAotCXsgMHgxNywgMHgyZiB9LAotCXsgMHgxOCwgMHhjZiB9LAotCXsgMHgxOSwgMHgwNiB9LAotCXsgMHgxYSwgMHhmNSB9LAotCXsgMHgxYiwgMHgwMCB9LAotCXsgMHgyMCwgMHgxOCB9LAotCXsgMHgyMSwgMHg4MCB9LAotCXsgMHgyMiwgMHg4MCB9LAotCXsgMHgyMywgMHgwMCB9LAotCXsgMHgyNiwgMHhhMiB9LAotCXsgMHgyNywgMHhlYSB9LAotCXsgMHgyOCwgMHgyMCB9LAotCXsgMHgyOSwgREZMX0FVVE9fRVhQPzB4MDA6MHg4MCB9LAotCXsgMHgyYSwgMHgxMCB9LAotCXsgMHgyYiwgMHgwMCB9LAotCXsgMHgyYywgMHg4OCB9LAotCXsgMHgyZCwgMHg5MSB9LAotCXsgMHgyZSwgMHg4MCB9LAotCXsgMHgyZiwgMHg0NCB9LAotCXsgMHg2MCwgMHgyNyB9LAotCXsgMHg2MSwgMHgwMiB9LAotCXsgMHg2MiwgMHg1ZiB9LAotCXsgMHg2MywgMHhkNSB9LAotCXsgMHg2NCwgMHg1NyB9LAotCXsgMHg2NSwgMHg4MyB9LAotCXsgMHg2NiwgMHg1NSB9LAotCXsgMHg2NywgMHg5MiB9LAotCXsgMHg2OCwgMHhjZiB9LAotCXsgMHg2OSwgMHg3NiB9LAotCXsgMHg2YSwgMHgyMiB9LAotCXsgMHg2YiwgMHgwMCB9LAotCXsgMHg2YywgMHgwMiB9LAotCXsgMHg2ZCwgMHg0NCB9LAotCXsgMHg2ZSwgMHg4MCB9LAotCXsgMHg2ZiwgMHgxZCB9LAotCXsgMHg3MCwgMHg4YiB9LAotCXsgMHg3MSwgMHgwMCB9LAotCXsgMHg3MiwgMHgxNCB9LAotCXsgMHg3MywgMHg1NCB9LAotCXsgMHg3NCwgMHgwMCB9LAotCXsgMHg3NSwgMHg4ZSB9LAotCXsgMHg3NiwgMHgwMCB9LAotCXsgMHg3NywgMHhmZiB9LAotCXsgMHg3OCwgMHg4MCB9LAotCXsgMHg3OSwgMHg4MCB9LAotCXsgMHg3YSwgMHg4MCB9LAotCXsgMHg3YiwgMHhlMiB9LAotCXsgMHg3YywgMHgwMCB9LAotCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCi19OwotCi0vKiBSZXR1cm5zIGluZGV4IGludG8gdGhlIHNwZWNpZmllZCBsb29rLXVwIHRhYmxlLCB3aXRoICduJyBlbGVtZW50cywgZm9yIHdoaWNoCi0gKiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICJ2YWwiLiBJZiBhIG1hdGNoIGlzbid0IGZvdW5kLCAobi0xKQotICogaXMgcmV0dXJuZWQuIFRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBtdXN0IGJlIGluIGFzY2VuZGluZyBvcmRlci4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG92N3gyMF9sdXRfZmluZCh1bnNpZ25lZCBjaGFyIGx1dFtdLCBpbnQgbiwgdW5zaWduZWQgY2hhciB2YWwpCi17Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGx1dFtpXSA8IHZhbCAmJiBpIDwgbikKLQkJaSsrOwotCi0JcmV0dXJuIGk7Ci19Ci0KLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WN3gyMCBjYW1lcmEgY2hpcCBhbmQgcmVsZXZhbnQgdmFyaWFibGVzLiAqLwotc3RhdGljIGludCBvdjd4MjBfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3Qgb3Y3eDIwICpzOwotCWludCByYzsKLQotCURERUJVRyg0LCAmYy0+ZGV2LCAiZW50ZXJlZCIpOwotCi0JaWYgKG92LT5tb25vKQotCQlyYyA9IG92X3dyaXRlX3JlZ3ZhbHMoYywgcmVndmFsc19pbml0XzcxMjApOwotCWVsc2UKLQkJcmMgPSBvdl93cml0ZV9yZWd2YWxzKGMsIHJlZ3ZhbHNfaW5pdF83NjIwKTsKLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW92LT5zcHJpdiA9IHMgPSBremFsbG9jKHNpemVvZiAqcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXMtPmF1dG9fYnJ0ID0gMTsKLQlzLT5hdXRvX2V4cCA9IERGTF9BVVRPX0VYUDsKLQlzLT5hdXRvX2dhaW4gPSBERkxfQVVUT19HQUlOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3eDIwX2ZyZWUoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0KLQlrZnJlZShvdi0+c3ByaXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92N3gyMF9zZXRfdjRsMV9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJCSAgIHN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCXN0cnVjdCBvdjd4MjAgKnMgPSBvdi0+c3ByaXY7Ci0JaW50IHJjOwotCWludCB2ID0gY3RsLT52YWx1ZTsKLQotCXN3aXRjaCAoY3RsLT5pZCkgewotCWNhc2UgT1ZDQU1DSElQX0NJRF9DT05UOgotCXsKLQkJLyogVXNlIFkgZ2FtbWEgY29udHJvbCBpbnN0ZWFkLiBCaXQgMCBlbmFibGVzIGl0LiAqLwotCQlyYyA9IG92X3dyaXRlKGMsIDB4NjQsIGN0YWJbdiA+PiAxMl0pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JSSUdIVDoKLQkJLyogNzYyMCBkb2Vzbid0IGxpa2UgbWFudWFsIGNoYW5nZXMgd2hlbiBpbiBhdXRvIG1vZGUgKi8KLQkJaWYgKCFzLT5hdXRvX2JydCkKLQkJCXJjID0gb3Zfd3JpdGUoYywgUkVHX0JSVCwgdiA+PiA4KTsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfU0FUOgotCQlyYyA9IG92X3dyaXRlKGMsIFJFR19TQVQsIHYgPj4gOCk7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6Ci0JCWlmICghcy0+YXV0b19leHApCi0JCQlyYyA9IG92X3dyaXRlKGMsIFJFR19FWFAsIHYpOwotCQllbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0ZSRVE6Ci0JewotCQlpbnQgc2l4dHkgPSAodiA9PSA2MCk7Ci0KLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MmEsIHNpeHR5PzB4MDA6MHg4MCwgMHg4MCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlKGMsIDB4MmIsIHNpeHR5PzB4MDA6MHhhYyk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHg3NiwgMHgwMSwgMHgwMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIE9WQ0FNQ0hJUF9DSURfQkFOREZJTFQ6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MDQ6MHgwMCwgMHgwNCk7Ci0JCXMtPmJhbmRmaWx0ID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQ6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDJkLCB2PzB4MTA6MHgwMCwgMHgxMCk7Ci0JCXMtPmF1dG9fYnJ0ID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0FVVE9FWFA6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDEzLCB2PzB4MDE6MHgwMCwgMHgwMSk7Ci0JCXMtPmF1dG9fZXhwID0gdjsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JBQ0tMSUdIVDoKLQl7Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDY4LCB2PzB4ZTA6MHhjMCwgMHhlMCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlyYyA9IG92X3dyaXRlX21hc2soYywgMHgyOSwgdj8weDA4OjB4MDAsIDB4MDgpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmMgPSBvdl93cml0ZV9tYXNrKGMsIDB4MjgsIHY/MHgwMjoweDAwLCAweDAyKTsKLQkJcy0+YmFja2xpZ2h0ID0gdjsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6Ci0JCXJjID0gb3Zfd3JpdGVfbWFzayhjLCAweDEyLCB2PzB4NDA6MHgwMCwgMHg0MCk7Ci0JCXMtPm1pcnJvciA9IHY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotb3V0OgotCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCB2LCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92N3gyMF9nZXRfdjRsMV9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjLAotCQkJCSAgIHN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCXN0cnVjdCBvdjd4MjAgKnMgPSBvdi0+c3ByaXY7Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7Ci0KLQlzd2l0Y2ggKGN0bC0+aWQpIHsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQ09OVDoKLQkJcmMgPSBvdl9yZWFkKGMsIDB4NjQsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gb3Y3eDIwX2x1dF9maW5kKGN0YWIsIDE2LCB2YWwpIDw8IDEyOwotCQlicmVhazsKLQljYXNlIE9WQ0FNQ0hJUF9DSURfQlJJR0hUOgotCQlyYyA9IG92X3JlYWQoYywgUkVHX0JSVCwgJnZhbCk7Ci0JCWN0bC0+dmFsdWUgPSB2YWwgPDwgODsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX1NBVDoKLQkJcmMgPSBvdl9yZWFkKGMsIFJFR19TQVQsICZ2YWwpOwotCQljdGwtPnZhbHVlID0gdmFsIDw8IDg7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9FWFA6Ci0JCXJjID0gb3ZfcmVhZChjLCBSRUdfRVhQLCAmdmFsKTsKLQkJY3RsLT52YWx1ZSA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBPVkNBTUNISVBfQ0lEX0JBTkRGSUxUOgotCQljdGwtPnZhbHVlID0gcy0+YmFuZGZpbHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPQlJJR0hUOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19icnQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9BVVRPRVhQOgotCQljdGwtPnZhbHVlID0gcy0+YXV0b19leHA7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQ6Ci0JCWN0bC0+dmFsdWUgPSBzLT5iYWNrbGlnaHQ7Ci0JCWJyZWFrOwotCWNhc2UgT1ZDQU1DSElQX0NJRF9NSVJST1I6Ci0JCWN0bC0+dmFsdWUgPSBzLT5taXJyb3I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURERUJVRygyLCAmYy0+ZGV2LCAiY29udHJvbCBub3Qgc3VwcG9ydGVkOiAlZCIsIGN0bC0+aWQpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCURERUJVRygzLCAmYy0+ZGV2LCAiaWQ9JWQsIGFyZz0lZCwgcmM9JWQiLCBjdGwtPmlkLCBjdGwtPnZhbHVlLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92N3gyMF9tb2RlX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfd2luZG93ICp3aW4pCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0JaW50IHF2Z2EgPSB3aW4tPnF1YXJ0ZXI7Ci0KLQkvKioqKioqKiogUVZHQS1zcGVjaWZpYyByZWdzICoqKioqKioqLwotCW92X3dyaXRlX21hc2soYywgMHgxNCwgcXZnYT8weDIwOjB4MDAsIDB4MjApOwotCW92X3dyaXRlX21hc2soYywgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOwotCW92X3dyaXRlKGMsIDB4MjQsIHF2Z2E/MHgyMDoweDNhKTsKLQlvdl93cml0ZShjLCAweDI1LCBxdmdhPzB4MzA6MHg2MCk7Ci0Jb3Zfd3JpdGVfbWFzayhjLCAweDJkLCBxdmdhPzB4NDA6MHgwMCwgMHg0MCk7Ci0JaWYgKCFvdi0+bW9ubykKLQkJb3Zfd3JpdGVfbWFzayhjLCAweDY3LCBxdmdhPzB4ZjA6MHg5MCwgMHhmMCk7Ci0Jb3Zfd3JpdGVfbWFzayhjLCAweDc0LCBxdmdhPzB4MjA6MHgwMCwgMHgyMCk7Ci0KLQkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCi0KLQlvdl93cml0ZShjLCAweDExLCB3aW4tPmNsb2NrZGl2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92N3gyMF9zZXRfd2luZG93KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyAqd2luKQotewotCWludCByZXQsIGh3c2NhbGUsIHZ3c2NhbGU7Ci0KLQlyZXQgPSBvdjd4MjBfbW9kZV9pbml0KGMsIHdpbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAod2luLT5xdWFydGVyKSB7Ci0JCWh3c2NhbGUgPSAxOwotCQl2d3NjYWxlID0gMDsKLQl9IGVsc2UgewotCQlod3NjYWxlID0gMjsKLQkJdndzY2FsZSA9IDE7Ci0JfQotCi0Jb3Zfd3JpdGUoYywgMHgxNywgSFdTQkFTRSArICh3aW4tPnggPj4gaHdzY2FsZSkpOwotCW92X3dyaXRlKGMsIDB4MTgsIEhXRUJBU0UgKyAoKHdpbi0+eCArIHdpbi0+d2lkdGgpID4+IGh3c2NhbGUpKTsKLQlvdl93cml0ZShjLCAweDE5LCBWV1NCQVNFICsgKHdpbi0+eSA+PiB2d3NjYWxlKSk7Ci0Jb3Zfd3JpdGUoYywgMHgxYSwgVldFQkFTRSArICgod2luLT55ICsgd2luLT5oZWlnaHQpID4+IHZ3c2NhbGUpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92N3gyMF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfU19DVFJMOgotCQlyZXR1cm4gb3Y3eDIwX3NldF92NGwxX2NvbnRyb2woYywgYXJnKTsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfR19DVFJMOgotCQlyZXR1cm4gb3Y3eDIwX2dldF92NGwxX2NvbnRyb2woYywgYXJnKTsKLQljYXNlIE9WQ0FNQ0hJUF9DTURfU19NT0RFOgotCQlyZXR1cm4gb3Y3eDIwX3NldF93aW5kb3coYywgYXJnKTsKLQlkZWZhdWx0OgotCQlEREVCVUcoMiwgJmMtPmRldiwgImNvbW1hbmQgbm90IHN1cHBvcnRlZDogJWQiLCBjbWQpOwotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3eDIwX29wcyA9IHsKLQkuaW5pdCAgICA9CW92N3gyMF9pbml0LAotCS5mcmVlICAgID0Jb3Y3eDIwX2ZyZWUsCi0JLmNvbW1hbmQgPQlvdjd4MjBfY29tbWFuZCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3M2Q4NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qIFNoYXJlZCBDb2RlIGZvciBPbW5pVmlzaW9uIENhbWVyYSBDaGlwIERyaXZlcnMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFyayBNY0NsZWxsYW5kIDxtYXJrQGFscGhhLmR5bmRucy5vcmc+Ci0gKiBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMS8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KLSAqLwotCi0jZGVmaW5lIERFQlVHCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYuaD4KLSNpbmNsdWRlICJvdmNhbWNoaXBfcHJpdi5oIgotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4yNyBmb3IgTGludXggMi42IgotI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrIE1jQ2xlbGxhbmQgPG1hcmtAYWxwaGEuZHluZG5zLm9yZz4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICJPViBjYW1lcmEgY2hpcCBJMkMgZHJpdmVyIgotCi0jZGVmaW5lIFBJTkZPKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fSU5GTyAib3ZjYW1jaGlwOiAiIGZtdCAiXG4iICwgIyMgYXJncyk7Ci0jZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAib3ZjYW1jaGlwOiAiIGZtdCAiXG4iICwgIyMgYXJncyk7Ci0KLSNpZmRlZiBERUJVRwotaW50IG92Y2FtY2hpcF9kZWJ1ZyA9IDA7Ci1zdGF0aWMgaW50IGRlYnVnOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKLSAgIkRlYnVnIGxldmVsOiAwPW5vbmUsIDE9aW5pdHMsIDI9d2FybmluZywgMz1jb25maWcsIDQ9ZnVuY3Rpb25zLCA1PWFsbCIpOwotI2VuZGlmCi0KLS8qIEJ5IGRlZmF1bHQsIGxldCBicmlkZ2UgZHJpdmVyIHRlbGwgdXMgaWYgY2hpcCBpcyBtb25vY2hyb21lLiBtb25vPTAKLSAqIHdpbGwgaWdub3JlIHRoYXQgYW5kIGFsd2F5cyB0cmVhdCBjaGlwcyBhcyBjb2xvci4gbW9ubz0xIHdpbGwgZm9yY2UKLSAqIG1vbm9jaHJvbWUgbW9kZSBmb3IgYWxsIGNoaXBzLiAqLwotc3RhdGljIGludCBtb25vID0gLTE7Ci1tb2R1bGVfcGFyYW0obW9ubywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobW9ubywKLSAgIjE9Y2hpcHMgYXJlIG1vbm9jaHJvbWUgKE9WeDF4eCksIDA9Zm9yY2UgY29sb3IsIC0xPWF1dG9kZXRlY3QgKGRlZmF1bHQpIik7Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLS8qIFJlZ2lzdGVycyBjb21tb24gdG8gYWxsIGNoaXBzLCB0aGF0IGFyZSBuZWVkZWQgZm9yIGRldGVjdGlvbiAqLwotI2RlZmluZSBHRU5FUklDX1JFR19JRF9ISUdIICAgICAgIDB4MUMJLyogbWFudWZhY3R1cmVyIElEIE1TQiAqLwotI2RlZmluZSBHRU5FUklDX1JFR19JRF9MT1cgICAgICAgIDB4MUQJLyogbWFudWZhY3R1cmVyIElEIExTQiAqLwotI2RlZmluZSBHRU5FUklDX1JFR19DT01fSSAgICAgICAgIDB4MjkJLyogbWlzYyBJRCBiaXRzICovCi0KLXN0YXRpYyBjaGFyICpjaGlwX25hbWVzW05VTV9DQ19UWVBFU10gPSB7Ci0JW0NDX1VOS05PV05dCT0gIlVua25vd24gY2hpcCIsCi0JW0NDX09WNzZCRV0JPSAiT1Y3NkJFIiwKLQlbQ0NfT1Y3NjEwXQk9ICJPVjc2MTAiLAotCVtDQ19PVjc2MjBdCT0gIk9WNzYyMCIsCi0JW0NDX09WNzYyMEFFXQk9ICJPVjc2MjBBRSIsCi0JW0NDX09WNjYyMF0JPSAiT1Y2NjIwIiwKLQlbQ0NfT1Y2NjMwXQk9ICJPVjY2MzAiLAotCVtDQ19PVjY2MzBBRV0JPSAiT1Y2NjMwQUUiLAotCVtDQ19PVjY2MzBBRl0JPSAiT1Y2NjMwQUYiLAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IG92X3dyaXRlX3JlZ3ZhbHMoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCBvdmNhbWNoaXBfcmVndmFscyAqcnZhbHMpCi17Ci0JaW50IHJjOwotCi0Jd2hpbGUgKHJ2YWxzLT5yZWcgIT0gMHhmZikgewotCQlyYyA9IG92X3dyaXRlKGMsIHJ2YWxzLT5yZWcsIHJ2YWxzLT52YWwpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlydmFscysrOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBXcml0ZXMgYml0cyBhdCBwb3NpdGlvbnMgc3BlY2lmaWVkIGJ5IG1hc2sgdG8gYW4gSTJDIHJlZy4gQml0cyB0aGF0IGFyZSBpbgotICogdGhlIHNhbWUgcG9zaXRpb24gYXMgMSdzIGluICJtYXNrIiBhcmUgY2xlYXJlZCBhbmQgc2V0IHRvICJ2YWx1ZSIuIEJpdHMKLSAqIHRoYXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uIGFzIDAncyBpbiAibWFzayIgYXJlIHByZXNlcnZlZCwgcmVnYXJkbGVzcwotICogb2YgdGhlaXIgcmVzcGVjdGl2ZSBzdGF0ZSBpbiAidmFsdWUiLgotICovCi1pbnQgb3Zfd3JpdGVfbWFzayhzdHJ1Y3QgaTJjX2NsaWVudCAqYywKLQkJICB1bnNpZ25lZCBjaGFyIHJlZywKLQkJICB1bnNpZ25lZCBjaGFyIHZhbHVlLAotCQkgIHVuc2lnbmVkIGNoYXIgbWFzaykKLXsKLQlpbnQgcmM7Ci0JdW5zaWduZWQgY2hhciBvbGR2YWwsIG5ld3ZhbDsKLQotCWlmIChtYXNrID09IDB4ZmYpIHsKLQkJbmV3dmFsID0gdmFsdWU7Ci0JfSBlbHNlIHsKLQkJcmMgPSBvdl9yZWFkKGMsIHJlZywgJm9sZHZhbCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJb2xkdmFsICY9ICh+bWFzayk7CQkvKiBDbGVhciB0aGUgbWFza2VkIGJpdHMgKi8KLQkJdmFsdWUgJj0gbWFzazsJCQkvKiBFbmZvcmNlIG1hc2sgb24gdmFsdWUgKi8KLQkJbmV3dmFsID0gb2xkdmFsIHwgdmFsdWU7CS8qIFNldCB0aGUgZGVzaXJlZCBiaXRzICovCi0JfQotCi0JcmV0dXJuIG92X3dyaXRlKGMsIHJlZywgbmV3dmFsKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogUmVzZXQgdGhlIGNoaXAgYW5kIGVuc3VyZSB0aGF0IEkyQyBpcyBzeW5jaHJvbml6ZWQuIFJldHVybnMgPDAgaWYgZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBpbml0X2NhbWNoaXAoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0JaW50IGksIHN1Y2Nlc3M7Ci0JdW5zaWduZWQgY2hhciBoaWdoLCBsb3c7Ci0KLQkvKiBSZXNldCB0aGUgY2hpcCAqLwotCW92X3dyaXRlKGMsIDB4MTIsIDB4ODApOwotCi0JLyogV2FpdCBmb3IgaXQgdG8gaW5pdGlhbGl6ZSAqLwotCW1zbGVlcCgxNTApOwotCi0JZm9yIChpID0gMCwgc3VjY2VzcyA9IDA7IGkgPCBJMkNfREVURUNUX1JFVFJJRVMgJiYgIXN1Y2Nlc3M7IGkrKykgewotCQlpZiAob3ZfcmVhZChjLCBHRU5FUklDX1JFR19JRF9ISUdILCAmaGlnaCkgPj0gMCkgewotCQkJaWYgKG92X3JlYWQoYywgR0VORVJJQ19SRUdfSURfTE9XLCAmbG93KSA+PSAwKSB7Ci0JCQkJaWYgKGhpZ2ggPT0gMHg3RiAmJiBsb3cgPT0gMHhBMikgewotCQkJCQlzdWNjZXNzID0gMTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogUmVzZXQgdGhlIGNoaXAgKi8KLQkJb3Zfd3JpdGUoYywgMHgxMiwgMHg4MCk7Ci0KLQkJLyogV2FpdCBmb3IgaXQgdG8gaW5pdGlhbGl6ZSAqLwotCQltc2xlZXAoMTUwKTsKLQotCQkvKiBEdW1teSByZWFkIHRvIHN5bmMgSTJDICovCi0JCW92X3JlYWQoYywgMHgwMCwgJmxvdyk7Ci0JfQotCi0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gLUVJTzsKLQotCVBERUJVRygxLCAiSTJDIHN5bmNlZCBpbiAlZCBhdHRlbXB0KHMpIiwgaSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBkZXRlY3RzIHRoZSBPVjc2MTAsIE9WNzYyMCwgb3IgT1Y3NkJFIGNoaXAuICovCi1zdGF0aWMgaW50IG92N3h4MF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0JaW50IHJjOwotCXVuc2lnbmVkIGNoYXIgdmFsOwotCi0JUERFQlVHKDQsICIiKTsKLQotCS8qIERldGVjdCBjaGlwIChzdWIpdHlwZSAqLwotCXJjID0gb3ZfcmVhZChjLCBHRU5FUklDX1JFR19DT01fSSwgJnZhbCk7Ci0JaWYgKHJjIDwgMCkgewotCQlQRVJST1IoIkVycm9yIGRldGVjdGluZyBvdjd4eDAgdHlwZSIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKCh2YWwgJiAzKSA9PSAzKSB7Ci0JCVBJTkZPKCJDYW1lcmEgY2hpcCBpcyBhbiBPVjc2MTAiKTsKLQkJb3YtPnN1YnR5cGUgPSBDQ19PVjc2MTA7Ci0JfSBlbHNlIGlmICgodmFsICYgMykgPT0gMSkgewotCQlyYyA9IG92X3JlYWQoYywgMHgxNSwgJnZhbCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCVBFUlJPUigiRXJyb3IgZGV0ZWN0aW5nIG92N3h4MCB0eXBlIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlpZiAodmFsICYgMSkgewotCQkJUElORk8oIkNhbWVyYSBjaGlwIGlzIGFuIE9WNzYyMEFFIik7Ci0JCQkvKiBPVjc2MjAgaXMgYSBjbG9zZSBlbm91Z2ggbWF0Y2ggZm9yIG5vdy4gVGhlcmUgYXJlCi0JCQkgKiBzb21lIGRlZmluaXRlIGRpZmZlcmVuY2VzIHRob3VnaCwgc28gdGhpcyBzaG91bGQgYmUKLQkJCSAqIGZpeGVkICovCi0JCQlvdi0+c3VidHlwZSA9IENDX09WNzYyMDsKLQkJfSBlbHNlIHsKLQkJCVBJTkZPKCJDYW1lcmEgY2hpcCBpcyBhbiBPVjc2QkUiKTsKLQkJCW92LT5zdWJ0eXBlID0gQ0NfT1Y3NkJFOwotCQl9Ci0JfSBlbHNlIGlmICgodmFsICYgMykgPT0gMCkgewotCQlQSU5GTygiQ2FtZXJhIGNoaXAgaXMgYW4gT1Y3NjIwIik7Ci0JCW92LT5zdWJ0eXBlID0gQ0NfT1Y3NjIwOwotCX0gZWxzZSB7Ci0JCVBFUlJPUigiVW5rbm93biBjYW1lcmEgY2hpcCB2ZXJzaW9uOiAlZCIsIHZhbCAmIDMpOwotCQlyZXR1cm4gLUVOT1NZUzsKLQl9Ci0KLQlpZiAob3YtPnN1YnR5cGUgPT0gQ0NfT1Y3NkJFKQotCQlvdi0+c29wcyA9ICZvdjc2YmVfb3BzOwotCWVsc2UgaWYgKG92LT5zdWJ0eXBlID09IENDX09WNzYyMCkKLQkJb3YtPnNvcHMgPSAmb3Y3eDIwX29wczsKLQllbHNlCi0JCW92LT5zb3BzID0gJm92N3gxMF9vcHM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBkZXRlY3RzIHRoZSBPVjY2MjAsIE9WNjYzMCwgT1Y2NjMwQUUsIG9yIE9WNjYzMEFGIGNoaXAuICovCi1zdGF0aWMgaW50IG92Nnh4MF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcCAqb3YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0JaW50IHJjOwotCXVuc2lnbmVkIGNoYXIgdmFsOwotCi0JUERFQlVHKDQsICIiKTsKLQotCS8qIERldGVjdCBjaGlwIChzdWIpdHlwZSAqLwotCXJjID0gb3ZfcmVhZChjLCBHRU5FUklDX1JFR19DT01fSSwgJnZhbCk7Ci0JaWYgKHJjIDwgMCkgewotCQlQRVJST1IoIkVycm9yIGRldGVjdGluZyBvdjZ4eDAgdHlwZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCh2YWwgJiAzKSA9PSAwKSB7Ci0JCW92LT5zdWJ0eXBlID0gQ0NfT1Y2NjMwOwotCQlQSU5GTygiQ2FtZXJhIGNoaXAgaXMgYW4gT1Y2NjMwIik7Ci0JfSBlbHNlIGlmICgodmFsICYgMykgPT0gMSkgewotCQlvdi0+c3VidHlwZSA9IENDX09WNjYyMDsKLQkJUElORk8oIkNhbWVyYSBjaGlwIGlzIGFuIE9WNjYyMCIpOwotCX0gZWxzZSBpZiAoKHZhbCAmIDMpID09IDIpIHsKLQkJb3YtPnN1YnR5cGUgPSBDQ19PVjY2MzA7Ci0JCVBJTkZPKCJDYW1lcmEgY2hpcCBpcyBhbiBPVjY2MzBBRSIpOwotCX0gZWxzZSBpZiAoKHZhbCAmIDMpID09IDMpIHsKLQkJb3YtPnN1YnR5cGUgPSBDQ19PVjY2MzA7Ci0JCVBJTkZPKCJDYW1lcmEgY2hpcCBpcyBhbiBPVjY2MzBBRiIpOwotCX0KLQotCWlmIChvdi0+c3VidHlwZSA9PSBDQ19PVjY2MjApCi0JCW92LT5zb3BzID0gJm92NngyMF9vcHM7Ci0JZWxzZQotCQlvdi0+c29wcyA9ICZvdjZ4MzBfb3BzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3ZjYW1jaGlwX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLQkvKiBJZGVhbGx5IHdlIHdvdWxkIGp1c3QgdHJ5IGEgc2luZ2xlIHJlZ2lzdGVyIHdyaXRlIGFuZCBzZWUgaWYgaXQgTkFLcy4KLQkgKiBUaGF0IGlzbid0IHBvc3NpYmxlIHNpbmNlIHRoZSBPVjUxOCBjYW4ndCByZXBvcnQgSTJDIHRyYW5zYWN0aW9uCi0JICogZmFpbHVyZXMuIFNvLCB3ZSBoYXZlIHRvIHRyeSB0byBpbml0aWFsaXplIHRoZSBjaGlwIChpLmUuIHJlc2V0IGl0Ci0JICogYW5kIGNoZWNrIHRoZSBJRCByZWdpc3RlcnMpIHRvIGRldGVjdCBpdHMgcHJlc2VuY2UuICovCi0KLQkvKiBUZXN0IGZvciA3eHgwICovCi0JUERFQlVHKDMsICJUZXN0aW5nIGZvciAwVjd4eDAiKTsKLQlpZiAoaW5pdF9jYW1jaGlwKGMpIDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JLyogNy1iaXQgYWRkcmVzc2VzIHdpdGggYml0IDAgc2V0IGFyZSBmb3IgdGhlIE9WN3h4MCAqLwotCWlmIChjLT5hZGRyICYgMSkgewotCQlpZiAob3Y3eHgwX2RldGVjdChjKSA8IDApIHsKLQkJCVBFUlJPUigiRmFpbGVkIHRvIGluaXQgT1Y3eHgwIik7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JLyogVGVzdCBmb3IgNnh4MCAqLwotCVBERUJVRygzLCAiVGVzdGluZyBmb3IgMFY2eHgwIik7Ci0JaWYgKG92Nnh4MF9kZXRlY3QoYykgPCAwKSB7Ci0JCVBFUlJPUigiRmFpbGVkIHRvIGluaXQgT1Y2eHgwIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGxvbmcgb3ZjYW1jaGlwX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwICpvdiA9IHRvX292Y2FtY2hpcChzZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQotCWlmICghb3YtPmluaXRpYWxpemVkICYmCi0JICAgIGNtZCAhPSBPVkNBTUNISVBfQ01EX1FfU1VCVFlQRSAmJgotCSAgICBjbWQgIT0gT1ZDQU1DSElQX0NNRF9JTklUSUFMSVpFKSB7Ci0JCXY0bDJfZXJyKHNkLCAiQ2FtZXJhIGNoaXAgbm90IGluaXRpYWxpemVkIHlldCFcbiIpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPVkNBTUNISVBfQ01EX1FfU1VCVFlQRToKLQl7Ci0JCSooaW50ICopYXJnID0gb3YtPnN1YnR5cGU7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIE9WQ0FNQ0hJUF9DTURfSU5JVElBTElaRToKLQl7Ci0JCWludCByYzsKLQotCQlpZiAobW9ubyA9PSAtMSkKLQkJCW92LT5tb25vID0gKihpbnQgKilhcmc7Ci0JCWVsc2UKLQkJCW92LT5tb25vID0gbW9ubzsKLQotCQlpZiAob3YtPm1vbm8pIHsKLQkJCWlmIChvdi0+c3VidHlwZSAhPSBDQ19PVjc2MjApCi0JCQkJdjRsMl93YXJuKHNkLCAiTW9ub2Nocm9tZSBub3QgIgotCQkJCQkiaW1wbGVtZW50ZWQgZm9yIHRoaXMgY2hpcFxuIik7Ci0JCQllbHNlCi0JCQkJdjRsMl9pbmZvKHNkLCAiSW5pdGlhbGl6aW5nIGNoaXAgYXMgIgotCQkJCQkibW9ub2Nocm9tZVxuIik7Ci0JCX0KLQotCQlyYyA9IG92LT5zb3BzLT5pbml0KGMpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCW92LT5pbml0aWFsaXplZCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQlkZWZhdWx0OgotCQlyZXR1cm4gb3YtPnNvcHMtPmNvbW1hbmQoYywgY21kLCBhcmcpOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdmNhbWNoaXBfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gb3ZjYW1jaGlwX2lvY3RsLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgb3ZjYW1jaGlwX29wcyA9IHsKLQkuY29yZSA9ICZvdmNhbWNoaXBfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgaW50IG92Y2FtY2hpcF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBvdmNhbWNoaXAgKm92OwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7Ci0JaW50IHJjID0gMDsKLQotCW92ID0ga3phbGxvYyhzaXplb2YgKm92LCBHRlBfS0VSTkVMKTsKLQlpZiAoIW92KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBub19vdjsKLQl9Ci0Jc2QgPSAmb3YtPnNkOwotCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZvdmNhbWNoaXBfb3BzKTsKLQotCXJjID0gb3ZjYW1jaGlwX2RldGVjdChjbGllbnQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQl2NGxfaW5mbyhjbGllbnQsICIlcyBmb3VuZCBAIDB4JTAyeCAoJXMpXG4iLAotCQkJY2hpcF9uYW1lc1tvdi0+c3VidHlwZV0sIGNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOwotCi0JUERFQlVHKDEsICJDYW1lcmEgY2hpcCBkZXRlY3Rpb24gY29tcGxldGUiKTsKLQotCXJldHVybiByYzsKLWVycm9yOgotCWtmcmVlKG92KTsKLW5vX292OgotCVBERUJVRygxLCAicmV0dXJuaW5nICVkIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdmNhbWNoaXBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCBvdmNhbWNoaXAgKm92ID0gdG9fb3ZjYW1jaGlwKHNkKTsKLQlpbnQgcmM7Ci0KLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7Ci0JcmMgPSBvdi0+c29wcy0+ZnJlZShjbGllbnQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWtmcmVlKG92KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG92Y2FtY2hpcF9pZFtdID0gewotCXsgIm92Y2FtY2hpcCIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgb3ZjYW1jaGlwX2lkKTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX2kyY19kcml2ZXJfZGF0YSB2NGwyX2kyY19kYXRhID0gewotCS5uYW1lID0gIm92Y2FtY2hpcCIsCi0JLnByb2JlID0gb3ZjYW1jaGlwX3Byb2JlLAotCS5yZW1vdmUgPSBvdmNhbWNoaXBfcmVtb3ZlLAotCS5pZF90YWJsZSA9IG92Y2FtY2hpcF9pZCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwN2I3OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qIE9tbmlWaXNpb24qIGNhbWVyYSBjaGlwIGRyaXZlciBwcml2YXRlIGRlZmluaXRpb25zIGZvciBjb3JlIGNvZGUgYW5kCi0gKiBjaGlwLXNwZWNpZmljIGNvZGUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBNYXJrIE1jQ2xlbGxhbmQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBpcyBleHByZXNzZWQgb3IgaW1wbGllZC4KLSAqCi0gKiAqIE9tbmlWaXNpb24gaXMgYSB0cmFkZW1hcmsgb2YgT21uaVZpc2lvbiBUZWNobm9sb2dpZXMsIEluYy4gVGhpcyBkcml2ZXIKLSAqIGlzIG5vdCBzcG9uc29yZWQgb3IgZGV2ZWxvcGVkIGJ5IHRoZW0uCi0gKi8KLQotI2lmbmRlZiBfX0xJTlVYX09WQ0FNQ0hJUF9QUklWX0gKLSNkZWZpbmUgX19MSU5VWF9PVkNBTUNISVBfUFJJVl9ICi0KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL292Y2FtY2hpcC5oPgotCi0jaWZkZWYgREVCVUcKLWV4dGVybiBpbnQgb3ZjYW1jaGlwX2RlYnVnOwotI2VuZGlmCi0KLSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKLQlpZiAob3ZjYW1jaGlwX2RlYnVnID49IChsZXZlbCkpCXByX2RlYnVnKCJbJXM6JWRdICIgZm10ICJcbiIsIFwKLQkJX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncykKLQotI2RlZmluZSBEREVCVUcobGV2ZWwsIGRldiwgZm10LCBhcmdzLi4uKSBcCi0JaWYgKG92Y2FtY2hpcF9kZWJ1ZyA+PSAobGV2ZWwpKQlkZXZfZGJnKGRldiwgIlslczolZF0gIiBmbXQgIlxuIiwgXAotCQlfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKQotCi0vKiBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgY2hpcCBkZXRlY3Rpb24uIEluY3JlYXNlIHRoaXMgaWYgeW91IGFyZSBnZXR0aW5nCi0gKiAiRmFpbGVkIHRvIGluaXQgY2FtZXJhIGNoaXAiICovCi0jZGVmaW5lIEkyQ19ERVRFQ1RfUkVUUklFUwkxMAotCi1zdHJ1Y3Qgb3ZjYW1jaGlwX3JlZ3ZhbHMgewotCXVuc2lnbmVkIGNoYXIgcmVnOwotCXVuc2lnbmVkIGNoYXIgdmFsOwotfTsKLQotc3RydWN0IG92Y2FtY2hpcF9vcHMgewotCWludCAoKmluaXQpKHN0cnVjdCBpMmNfY2xpZW50ICopOwotCWludCAoKmZyZWUpKHN0cnVjdCBpMmNfY2xpZW50ICopOwotCWludCAoKmNvbW1hbmQpKHN0cnVjdCBpMmNfY2xpZW50ICosIHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLX07Ci0KLXN0cnVjdCBvdmNhbWNoaXAgewotCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKLQlzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyAqc29wczsKLQl2b2lkICpzcHJpdjsgICAgICAgICAgICAgICAvKiBQcml2YXRlIGRhdGEgZm9yIE9WN3gxMC5jIGV0Yy4uLiAqLwotCWludCBzdWJ0eXBlOyAgICAgICAgICAgICAgIC8qID0gU0VOX09WNzYxMCBldGMuLi4gKi8KLQlpbnQgbW9ubzsgICAgICAgICAgICAgICAgICAvKiBNb25vY2hyb21lIGNoaXA/IChpbnZhbGlkIHVudGlsIGluaXQpICovCi0JaW50IGluaXRpYWxpemVkOyAgICAgICAgICAgLyogT1ZDQU1DSElQX0NNRF9JTklUSUFMSVpFIHdhcyBzdWNjZXNzZnVsICovCi19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBvdmNhbWNoaXAgKnRvX292Y2FtY2hpcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBvdmNhbWNoaXAsIHNkKTsKLX0KLQotZXh0ZXJuIHN0cnVjdCBvdmNhbWNoaXBfb3BzIG92NngyMF9vcHM7Ci1leHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y2eDMwX29wczsKLWV4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjd4MTBfb3BzOwotZXh0ZXJuIHN0cnVjdCBvdmNhbWNoaXBfb3BzIG92N3gyMF9vcHM7Ci1leHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3NmJlX29wczsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICAgICAgICAgICAgSTJDIEkvTyAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBvdl9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBjaGFyIHJlZywKLQkJCSAgdW5zaWduZWQgY2hhciAqdmFsdWUpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoYywgcmVnKTsKLQkqdmFsdWUgPSAodW5zaWduZWQgY2hhcikgcmM7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBvdl93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciByZWcsCi0JCQkgICB1bnNpZ25lZCBjaGFyIHZhbHVlICkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjLCByZWcsIHZhbHVlKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICAgICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBGdW5jdGlvbnMgaW4gb3ZjYW1jaGlwX2NvcmUuYyAqLwotCi1leHRlcm4gaW50IG92X3dyaXRlX3JlZ3ZhbHMoc3RydWN0IGkyY19jbGllbnQgKmMsCi0JCQkgICAgc3RydWN0IG92Y2FtY2hpcF9yZWd2YWxzICpydmFscyk7Ci0KLWV4dGVybiBpbnQgb3Zfd3JpdGVfbWFzayhzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciByZWcsCi0JCQkgdW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgY2hhciBtYXNrKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pb3JlYWQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWlvcmVhZC5jCmluZGV4IGI0ODI0NzguLmJiYTYxMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWlvcmVhZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWlvcmVhZC5jCkBAIC0yMjMsNyArMjIzLDEwIEBACiAJCQkJICAgIiBwdnIyX2lvcmVhZF9zZXR1cCAoc2V0dXApIGlkPSVwIixjcCk7CiAJCQlwdnIyX3N0cmVhbV9raWxsKHNwKTsKIAkJCXJldCA9IHB2cjJfc3RyZWFtX3NldF9idWZmZXJfY291bnQoc3AsQlVGRkVSX0NPVU5UKTsKLQkJCWlmIChyZXQgPCAwKSByZXR1cm4gcmV0OworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltdXRleF91bmxvY2soJmNwLT5tdXRleCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KIAkJCWZvciAoaWR4ID0gMDsgaWR4IDwgQlVGRkVSX0NPVU5UOyBpZHgrKykgewogCQkJCWJwID0gcHZyMl9zdHJlYW1fZ2V0X2J1ZmZlcihzcCxpZHgpOwogCQkJCXB2cjJfYnVmZmVyX3NldF9idWZmZXIoYnAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCmluZGV4IGZiMjQyZjYuLjlkZTdkNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkgKiBsb25nZXIgaW4gU1RBVEVfUVVFVUVEIG9yIFNUQVRFX0FDVElWRQogCSAqLwogCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwgMCwgMCk7Ci0JdmlkZW9idWZfZG1hX3VubWFwKHZxLCBkbWEpOworCXZpZGVvYnVmX2RtYV91bm1hcCh2cS0+ZGV2LCBkbWEpOwogCXZpZGVvYnVmX2RtYV9mcmVlKGRtYSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWYtPmRtYXMpOyBpKyspIHsKQEAgLTEyODQsNyArMTI4NCw3IEBACiAJfQogCiAJc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRToKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgogCQlmb3JtYXRzKys7CiAJCWlmICh4bGF0ZSkgewogCQkJeGxhdGUtPmhvc3RfZm10CT0gJnB4YV9jYW1lcmFfZm9ybWF0c1swXTsKQEAgLTEyOTMsOSArMTI5Myw5IEBACiAJCQlkZXZfZGJnKGRldiwgIlByb3ZpZGluZyBmb3JtYXQgJXMgdXNpbmcgY29kZSAlZFxuIiwKIAkJCQlweGFfY2FtZXJhX2Zvcm1hdHNbMF0ubmFtZSwgY29kZSk7CiAJCX0KLQljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0JFOgotCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEU6Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYOF9MRToKKwljYXNlIFY0TDJfTUJVU19GTVRfVllVWThfMlg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKIAljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRToKIAljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9MRToKIAkJaWYgKHhsYXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3JqNTRuMWNiMGMuYwppbmRleCA0N2ZkMjA3Li5jZTc4ZmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3JqNTRuMWNiMGMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3JqNTRuMWNiMGMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEcml2ZXIgZm9yIFJKNTROMUNCMEMgQ01PUyBJbWFnZSBTZW5zb3IgZnJvbSBNaWNyb24KKyAqIERyaXZlciBmb3IgUko1NE4xQ0IwQyBDTU9TIEltYWdlIFNlbnNvciBmcm9tIFNoYXJwCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5LCBHdWVubmFkaSBMaWFraG92ZXRza2kgPGcubGlha2hvdmV0c2tpQGdteC5kZT4KICAqCkBAIC0xMjcsOCArMTI3LDggQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCByajU0bjFfZGF0YWZtdCByajU0bjFfY29sb3VyX2ZtdHNbXSA9IHsKLQl7VjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEUsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKLQl7VjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfTEUsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7VjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKKwl7VjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKIAl7VjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCiAJe1Y0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9CRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogCXtWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBREhJX0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCkBAIC0xMDQ2LDEyICsxMDQ2LDEyIEBACiAKIAkvKiBSQV9TRUxfVUwgaXMgb25seSByZWxldmFudCBmb3IgcmF3IG1vZGVzLCBpZ25vcmVkIG90aGVyd2lzZS4gKi8KIAlzd2l0Y2ggKG1mLT5jb2RlKSB7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9MRToKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgogCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT1VUX1NFTCwgMCk7CiAJCWlmICghcmV0KQogCQkJcmV0ID0gcmVnX3NldChjbGllbnQsIFJKNTROMV9CWVRFX1NXQVAsIDgsIDgpOwogCQlicmVhazsKLQljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0xFOgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDg6CiAJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9PVVRfU0VMLCAwKTsKIAkJaWYgKCFyZXQpCiAJCQlyZXQgPSByZWdfc2V0KGNsaWVudCwgUko1NE4xX0JZVEVfU1dBUCwgMCwgOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3MyMjU1ZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3MyMjU1ZHJ2LmMKaW5kZXggM2M3YTc5Zi4uOGVjN2M5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYwpAQCAtMTkxLDcgKzE5MSw2IEBACiBzdHJ1Y3QgczIyNTVfZG1hcXVldWUgewogCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlOwogCXN0cnVjdCBzMjI1NV9kZXYJKmRldjsKLQlpbnQJCQljaGFubmVsOwogfTsKIAogLyogZm9yIGZpcm13YXJlIGxvYWRpbmcsIGZ3X3N0YXRlICovCkBAIC0yMjYsNTEgKzIyNSw2MCBAQAogfTsKIAogc3RydWN0IHMyMjU1X2ZtdDsgLypmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgczIyNTVfZGV2OworCitzdHJ1Y3QgczIyNTVfY2hhbm5lbCB7CisJc3RydWN0IHZpZGVvX2RldmljZQl2ZGV2OworCWludAkJCXJlc291cmNlczsKKwlzdHJ1Y3QgczIyNTVfZG1hcXVldWUJdmlkcTsKKwlzdHJ1Y3QgczIyNTVfYnVmZmVyaQlidWZmZXI7CisJc3RydWN0IHMyMjU1X21vZGUJbW9kZTsKKwkvKiBqcGVnIGNvbXByZXNzaW9uICovCisJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIGpjOworCS8qIGNhcHR1cmUgcGFyYW1ldGVycyAoZm9yIGhpZ2ggcXVhbGl0eSBtb2RlIGZ1bGwgc2l6ZSkgKi8KKwlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSBjYXBfcGFybTsKKwlpbnQJCQljdXJfZnJhbWU7CisJaW50CQkJbGFzdF9mcmFtZTsKKworCWludAkJCWJfYWNxdWlyZTsKKwkvKiBhbGxvY2F0ZWQgaW1hZ2Ugc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcJCXJlcV9pbWFnZV9zaXplOworCS8qIHJlY2VpdmVkIHBhY2tldCBzaXplICovCisJdW5zaWduZWQgbG9uZwkJcGt0X3NpemU7CisJaW50CQkJYmFkX3BheWxvYWQ7CisJdW5zaWduZWQgbG9uZwkJZnJhbWVfY291bnQ7CisJLyogaWYgSlBFRyBpbWFnZSAqLworCWludCAgICAgICAgICAgICAgICAgICAgIGpwZ19zaXplOworCS8qIGlmIGNoYW5uZWwgY29uZmlndXJlZCB0byBkZWZhdWx0IHN0YXRlICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0X3NldG1vZGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgc2V0bW9kZV9yZWFkeTsKKwkvKiB2aWRlbyBzdGF0dXMgaXRlbXMgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICB2aWRzdGF0dXM7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgd2FpdF92aWRzdGF0dXM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgdmlkc3RhdHVzX3JlYWR5OworCXVuc2lnbmVkIGludAkJd2lkdGg7CisJdW5zaWduZWQgaW50CQloZWlnaHQ7CisJY29uc3Qgc3RydWN0IHMyMjU1X2ZtdAkqZm10OworCWludCBpZHg7IC8qIGNoYW5uZWwgbnVtYmVyIG9uIGRldmljZSwgMC0zICovCit9OworCiAKIHN0cnVjdCBzMjI1NV9kZXYgewotCXN0cnVjdCB2aWRlb19kZXZpY2UJdmRldltNQVhfQ0hBTk5FTFNdOworCXN0cnVjdCBzMjI1NV9jaGFubmVsICAgIGNoYW5uZWxbTUFYX0NIQU5ORUxTXTsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgCXY0bDJfZGV2OwotCWF0b21pY190ICAgICAgICAgICAgICAgIGNoYW5uZWxzOyAvKiBudW1iZXIgb2YgY2hhbm5lbHMgcmVnaXN0ZXJlZCAqLworCWF0b21pY190ICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKIAlpbnQJCQlmcmFtZXM7CiAJc3RydWN0IG11dGV4CQlsb2NrOwogCXN0cnVjdCBtdXRleAkJb3Blbl9sb2NrOwotCWludAkJCXJlc291cmNlc1tNQVhfQ0hBTk5FTFNdOwogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRlcmZhY2U7CiAJdTgJCQlyZWFkX2VuZHBvaW50OwotCi0Jc3RydWN0IHMyMjU1X2RtYXF1ZXVlCXZpZHFbTUFYX0NIQU5ORUxTXTsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKIAlzdHJ1Y3QgczIyNTVfZncJKmZ3X2RhdGE7CiAJc3RydWN0IHMyMjU1X3BpcGVpbmZvCXBpcGU7Ci0Jc3RydWN0IHMyMjU1X2J1ZmZlcmkJYnVmZmVyW01BWF9DSEFOTkVMU107Ci0Jc3RydWN0IHMyMjU1X21vZGUJbW9kZVtNQVhfQ0hBTk5FTFNdOwotCS8qIGpwZWcgY29tcHJlc3Npb24gKi8KLQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gamNbTUFYX0NIQU5ORUxTXTsKLQkvKiBjYXB0dXJlIHBhcmFtZXRlcnMgKGZvciBoaWdoIHF1YWxpdHkgbW9kZSBmdWxsIHNpemUpICovCi0Jc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gY2FwX3Bhcm1bTUFYX0NIQU5ORUxTXTsKLQljb25zdCBzdHJ1Y3QgczIyNTVfZm10CSpjdXJfZm10W01BWF9DSEFOTkVMU107Ci0JaW50CQkJY3VyX2ZyYW1lW01BWF9DSEFOTkVMU107Ci0JaW50CQkJbGFzdF9mcmFtZVtNQVhfQ0hBTk5FTFNdOwogCXUzMgkJCWNjOwkvKiBjdXJyZW50IGNoYW5uZWwgKi8KLQlpbnQJCQliX2FjcXVpcmVbTUFYX0NIQU5ORUxTXTsKLQkvKiBhbGxvY2F0ZWQgaW1hZ2Ugc2l6ZSAqLwotCXVuc2lnbmVkIGxvbmcJCXJlcV9pbWFnZV9zaXplW01BWF9DSEFOTkVMU107Ci0JLyogcmVjZWl2ZWQgcGFja2V0IHNpemUgKi8KLQl1bnNpZ25lZCBsb25nCQlwa3Rfc2l6ZVtNQVhfQ0hBTk5FTFNdOwotCWludAkJCWJhZF9wYXlsb2FkW01BWF9DSEFOTkVMU107Ci0JdW5zaWduZWQgbG9uZwkJZnJhbWVfY291bnRbTUFYX0NIQU5ORUxTXTsKIAlpbnQJCQlmcmFtZV9yZWFkeTsKLQkvKiBpZiBKUEVHIGltYWdlICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAganBnX3NpemVbTUFYX0NIQU5ORUxTXTsKLQkvKiBpZiBjaGFubmVsIGNvbmZpZ3VyZWQgdG8gZGVmYXVsdCBzdGF0ZSAqLwotCWludCAgICAgICAgICAgICAgICAgICAgIGNobl9jb25maWd1cmVkW01BWF9DSEFOTkVMU107Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgd2FpdF9zZXRtb2RlW01BWF9DSEFOTkVMU107Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc2V0bW9kZV9yZWFkeVtNQVhfQ0hBTk5FTFNdOwotCS8qIHZpZGVvIHN0YXR1cyBpdGVtcyAqLwotCWludCAgICAgICAgICAgICAgICAgICAgIHZpZHN0YXR1c1tNQVhfQ0hBTk5FTFNdOwotCXdhaXRfcXVldWVfaGVhZF90ICAgICAgIHdhaXRfdmlkc3RhdHVzW01BWF9DSEFOTkVMU107Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgdmlkc3RhdHVzX3JlYWR5W01BWF9DSEFOTkVMU107CiAJaW50ICAgICAgICAgICAgICAgICAgICAgY2huX3JlYWR5OwogCXNwaW5sb2NrX3QgICAgICAgICAgICAgIHNsb2NrOwogCS8qIGRzcCBmaXJtd2FyZSB2ZXJzaW9uIChmMjI1NXVzYi5iaW4pICovCkBAIC0yOTgsMTYgKzMwNiwxMCBAQAogCiBzdHJ1Y3QgczIyNTVfZmggewogCXN0cnVjdCBzMjI1NV9kZXYJKmRldjsKLQljb25zdCBzdHJ1Y3QgczIyNTVfZm10CSpmbXQ7Ci0JdW5zaWduZWQgaW50CQl3aWR0aDsKLQl1bnNpZ25lZCBpbnQJCWhlaWdodDsKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUJdmJfdmlkcTsKIAllbnVtIHY0bDJfYnVmX3R5cGUJdHlwZTsKLQlpbnQJCQljaGFubmVsOwotCS8qIG1vZGUgYmVsb3cgaXMgdGhlIGRlc2lyZWQgbW9kZS4KLQkgICBtb2RlIGluIHMyMjU1X2RldiBpcyB0aGUgY3VycmVudCBtb2RlIHRoYXQgd2FzIGxhc3Qgc2V0ICovCi0Jc3RydWN0IHMyMjU1X21vZGUJbW9kZTsKLQlpbnQJCQlyZXNvdXJjZXNbTUFYX0NIQU5ORUxTXTsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbAkqY2hhbm5lbDsKKwlpbnQJCQlyZXNvdXJjZXM7CiB9OwogCiAvKiBjdXJyZW50IGN5cHJlc3MgRUVQUk9NIGZpcm13YXJlIHZlcnNpb24gKi8KQEAgLTM2MCwxMiArMzYyLDExIEBACiAKIHN0YXRpYyBpbnQgczIyNTVfc3RhcnRfcmVhZHBpcGUoc3RydWN0IHMyMjU1X2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkIHMyMjU1X3N0b3BfcmVhZHBpcGUoc3RydWN0IHMyMjU1X2RldiAqZGV2KTsKLXN0YXRpYyBpbnQgczIyNTVfc3RhcnRfYWNxdWlyZShzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2huKTsKLXN0YXRpYyBpbnQgczIyNTVfc3RvcF9hY3F1aXJlKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBjaG4pOwotc3RhdGljIHZvaWQgczIyNTVfZmlsbGJ1ZmYoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBzdHJ1Y3QgczIyNTVfYnVmZmVyICpidWYsCi0JCQkgICBpbnQgY2huLCBpbnQganBnc2l6ZSk7Ci1zdGF0aWMgaW50IHMyMjU1X3NldF9tb2RlKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBjaG4sCi0JCQkgIHN0cnVjdCBzMjI1NV9tb2RlICptb2RlKTsKK3N0YXRpYyBpbnQgczIyNTVfc3RhcnRfYWNxdWlyZShzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgaW50IHMyMjU1X3N0b3BfYWNxdWlyZShzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBzMjI1NV9maWxsYnVmZihzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2huLCBzdHJ1Y3QgczIyNTVfYnVmZmVyICpidWYsCisJCQkgICBpbnQganBnc2l6ZSk7CitzdGF0aWMgaW50IHMyMjU1X3NldF9tb2RlKHN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgczIyNTVfbW9kZSAqbW9kZSk7CiBzdGF0aWMgaW50IHMyMjU1X2JvYXJkX3NodXRkb3duKHN0cnVjdCBzMjI1NV9kZXYgKmRldik7CiBzdGF0aWMgdm9pZCBzMjI1NV9md2xvYWRfc3RhcnQoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBpbnQgcmVzZXQpOwogc3RhdGljIHZvaWQgczIyNTVfZGVzdHJveShzdHJ1Y3QgczIyNTVfZGV2ICpkZXYpOwpAQCAtNTc3LDEwICs1NzgsMTEgQEAKIAogfQogCi1zdGF0aWMgaW50IHMyMjU1X2dvdF9mcmFtZShzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIGludCBjaG4sIGludCBqcGdzaXplKQorc3RhdGljIGludCBzMjI1NV9nb3RfZnJhbWUoc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwsIGludCBqcGdzaXplKQogewotCXN0cnVjdCBzMjI1NV9kbWFxdWV1ZSAqZG1hX3EgPSAmZGV2LT52aWRxW2Nobl07CisJc3RydWN0IHMyMjU1X2RtYXF1ZXVlICpkbWFfcSA9ICZjaGFubmVsLT52aWRxOwogCXN0cnVjdCBzMjI1NV9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSB0b19zMjI1NV9kZXYoY2hhbm5lbC0+dmRldi52NGwyX2Rldik7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJaW50IHJjID0gMDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwpAQCAtNTkzLDcgKzU5NSw3IEBACiAJCQkgc3RydWN0IHMyMjU1X2J1ZmZlciwgdmIucXVldWUpOwogCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKIAlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwotCXMyMjU1X2ZpbGxidWZmKGRldiwgYnVmLCBkbWFfcS0+Y2hhbm5lbCwganBnc2l6ZSk7CisJczIyNTVfZmlsbGJ1ZmYoY2hhbm5lbCwgYnVmLCBqcGdzaXplKTsKIAl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwogCWRwcmludGsoMiwgIiVzOiBbYnVmL2ldIFslcC8lZF1cbiIsIF9fZnVuY19fLCBidWYsIGJ1Zi0+dmIuaSk7CiB1bmxvY2s6CkBAIC02MjEsOCArNjIzLDggQEAKICAqICAgICAgICAgICAgICAgICAgaHR0cDovL3Y0bC52aWRlb3RlY2hub2xvZ3kuY29tLwogICoKICAqLwotc3RhdGljIHZvaWQgczIyNTVfZmlsbGJ1ZmYoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBzdHJ1Y3QgczIyNTVfYnVmZmVyICpidWYsCi0JCQkgICBpbnQgY2huLCBpbnQganBnc2l6ZSkKK3N0YXRpYyB2b2lkIHMyMjU1X2ZpbGxidWZmKHN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsLAorCQkJICAgc3RydWN0IHMyMjU1X2J1ZmZlciAqYnVmLCBpbnQganBnc2l6ZSkKIHsKIAlpbnQgcG9zID0gMDsKIAlzdHJ1Y3QgdGltZXZhbCB0czsKQEAgLTYzMywxMiArNjM1LDExIEBACiAKIAlpZiAoIXZidWYpCiAJCXJldHVybjsKLQotCWxhc3RfZnJhbWUgPSBkZXYtPmxhc3RfZnJhbWVbY2huXTsKKwlsYXN0X2ZyYW1lID0gY2hhbm5lbC0+bGFzdF9mcmFtZTsKIAlpZiAobGFzdF9mcmFtZSAhPSAtMSkgewotCQlmcm0gPSAmZGV2LT5idWZmZXJbY2huXS5mcmFtZVtsYXN0X2ZyYW1lXTsKKwkJZnJtID0gJmNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtsYXN0X2ZyYW1lXTsKIAkJdG1wYnVmID0KLQkJICAgIChjb25zdCBjaGFyICopZGV2LT5idWZmZXJbY2huXS5mcmFtZVtsYXN0X2ZyYW1lXS5scHZiaXRzOworCQkgICAgKGNvbnN0IGNoYXIgKiljaGFubmVsLT5idWZmZXIuZnJhbWVbbGFzdF9mcmFtZV0ubHB2Yml0czsKIAkJc3dpdGNoIChidWYtPmZtdC0+Zm91cmNjKSB7CiAJCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CiAJCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CkBAIC02NjEsNyArNjYyLDcgQEAKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0RFQlVHICJzMjI1NTogdW5rbm93biBmb3JtYXQ/XG4iKTsKIAkJfQotCQlkZXYtPmxhc3RfZnJhbWVbY2huXSA9IC0xOworCQljaGFubmVsLT5sYXN0X2ZyYW1lID0gLTE7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzMjI1NTogPT09PT09PW5vIGZyYW1lXG4iKTsKIAkJcmV0dXJuOwpAQCAtNjcxLDcgKzY3Miw3IEBACiAJCSh1bnNpZ25lZCBsb25nKXZidWYsIHBvcyk7CiAJLyogdGVsbCB2NGwgYnVmZmVyIHdhcyBmaWxsZWQgKi8KIAotCWJ1Zi0+dmIuZmllbGRfY291bnQgPSBkZXYtPmZyYW1lX2NvdW50W2Nobl0gKiAyOworCWJ1Zi0+dmIuZmllbGRfY291bnQgPSBjaGFubmVsLT5mcmFtZV9jb3VudCAqIDI7CiAJZG9fZ2V0dGltZW9mZGF5KCZ0cyk7CiAJYnVmLT52Yi50cyA9IHRzOwogCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOwpAQCAtNjg2LDggKzY4Nyw4IEBACiAJCQl1bnNpZ25lZCBpbnQgKnNpemUpCiB7CiAJc3RydWN0IHMyMjU1X2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0KLQkqc2l6ZSA9IGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgKiAoZmgtPmZtdC0+ZGVwdGggPj4gMyk7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKKwkqc2l6ZSA9IGNoYW5uZWwtPndpZHRoICogY2hhbm5lbC0+aGVpZ2h0ICogKGNoYW5uZWwtPmZtdC0+ZGVwdGggPj4gMyk7CiAKIAlpZiAoMCA9PSAqY291bnQpCiAJCSpjb3VudCA9IFMyMjU1X0RFRl9CVUZTOwpAQCAtNzEwLDMwICs3MTEsMzEgQEAKIAkJCSAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQogewogCXN0cnVjdCBzMjI1NV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsID0gZmgtPmNoYW5uZWw7CiAJc3RydWN0IHMyMjU1X2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgczIyNTVfYnVmZmVyLCB2Yik7CiAJaW50IHJjOworCWludCB3ID0gY2hhbm5lbC0+d2lkdGg7CisJaW50IGggPSBjaGFubmVsLT5oZWlnaHQ7CiAJZHByaW50ayg0LCAiJXMsIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmllbGQpOwotCWlmIChmaC0+Zm10ID09IE5VTEwpCisJaWYgKGNoYW5uZWwtPmZtdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICgoZmgtPndpZHRoIDwgbm9ybV9taW53KCZmaC0+ZGV2LT52ZGV2W2ZoLT5jaGFubmVsXSkpIHx8Ci0JICAgIChmaC0+d2lkdGggPiBub3JtX21heHcoJmZoLT5kZXYtPnZkZXZbZmgtPmNoYW5uZWxdKSkgfHwKLQkgICAgKGZoLT5oZWlnaHQgPCBub3JtX21pbmgoJmZoLT5kZXYtPnZkZXZbZmgtPmNoYW5uZWxdKSkgfHwKLQkgICAgKGZoLT5oZWlnaHQgPiBub3JtX21heGgoJmZoLT5kZXYtPnZkZXZbZmgtPmNoYW5uZWxdKSkpIHsKKwlpZiAoKHcgPCBub3JtX21pbncoJmNoYW5uZWwtPnZkZXYpKSB8fAorCSAgICAodyA+IG5vcm1fbWF4dygmY2hhbm5lbC0+dmRldikpIHx8CisJICAgIChoIDwgbm9ybV9taW5oKCZjaGFubmVsLT52ZGV2KSkgfHwKKwkgICAgKGggPiBub3JtX21heGgoJmNoYW5uZWwtPnZkZXYpKSkgewogCQlkcHJpbnRrKDQsICJpbnZhbGlkIGJ1ZmZlciBwcmVwYXJlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JYnVmLT52Yi5zaXplID0gZmgtPndpZHRoICogZmgtPmhlaWdodCAqIChmaC0+Zm10LT5kZXB0aCA+PiAzKTsKLQorCWJ1Zi0+dmIuc2l6ZSA9IHcgKiBoICogKGNoYW5uZWwtPmZtdC0+ZGVwdGggPj4gMyk7CiAJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAmJiBidWYtPnZiLmJzaXplIDwgYnVmLT52Yi5zaXplKSB7CiAJCWRwcmludGsoNCwgImludmFsaWQgYnVmZmVyIHByZXBhcmVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlidWYtPmZtdCA9IGZoLT5mbXQ7Ci0JYnVmLT52Yi53aWR0aCA9IGZoLT53aWR0aDsKLQlidWYtPnZiLmhlaWdodCA9IGZoLT5oZWlnaHQ7CisJYnVmLT5mbXQgPSBjaGFubmVsLT5mbXQ7CisJYnVmLT52Yi53aWR0aCA9IHc7CisJYnVmLT52Yi5oZWlnaHQgPSBoOwogCWJ1Zi0+dmIuZmllbGQgPSBmaWVsZDsKIAogCWlmIChWSURFT0JVRl9ORUVEU19JTklUID09IGJ1Zi0+dmIuc3RhdGUpIHsKQEAgLTc1Myw4ICs3NTUsOCBAQAogewogCXN0cnVjdCBzMjI1NV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHMyMjU1X2J1ZmZlciwgdmIpOwogCXN0cnVjdCBzMjI1NV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IHMyMjU1X2RtYXF1ZXVlICp2aWRxID0gJmRldi0+dmlkcVtmaC0+Y2hhbm5lbF07CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgczIyNTVfZG1hcXVldWUgKnZpZHEgPSAmY2hhbm5lbC0+dmlkcTsKIAlkcHJpbnRrKDEsICIlc1xuIiwgX19mdW5jX18pOwogCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CiAJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnZpZHEtPmFjdGl2ZSk7CkBAIC03NjUsNyArNzY3LDcgQEAKIHsKIAlzdHJ1Y3QgczIyNTVfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBzMjI1NV9idWZmZXIsIHZiKTsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlkcHJpbnRrKDQsICIlcyAlZFxuIiwgX19mdW5jX18sIGZoLT5jaGFubmVsKTsKKwlkcHJpbnRrKDQsICIlcyAlZFxuIiwgX19mdW5jX18sIGZoLT5jaGFubmVsLT5pZHgpOwogCWZyZWVfYnVmZmVyKHZxLCBidWYpOwogfQogCkBAIC03NzcsMzkgKzc3OSw0MyBAQAogfTsKIAogCi1zdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBzdHJ1Y3QgczIyNTVfZmggKmZoKQorc3RhdGljIGludCByZXNfZ2V0KHN0cnVjdCBzMjI1NV9maCAqZmgpCiB7CisJc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gZmgtPmRldjsKIAkvKiBpcyBpdCBmcmVlPyAqLworCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsID0gZmgtPmNoYW5uZWw7CiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQlpZiAoZGV2LT5yZXNvdXJjZXNbZmgtPmNoYW5uZWxdKSB7CisJaWYgKGNoYW5uZWwtPnJlc291cmNlcykgewogCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogaXQncyBmcmVlLCBncmFiIGl0ICovCi0JZGV2LT5yZXNvdXJjZXNbZmgtPmNoYW5uZWxdID0gMTsKLQlmaC0+cmVzb3VyY2VzW2ZoLT5jaGFubmVsXSA9IDE7CisJY2hhbm5lbC0+cmVzb3VyY2VzID0gMTsKKwlmaC0+cmVzb3VyY2VzID0gMTsKIAlkcHJpbnRrKDEsICJzMjI1NTogcmVzOiBnZXRcbiIpOwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCByZXNfbG9ja2VkKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgc3RydWN0IHMyMjU1X2ZoICpmaCkKK3N0YXRpYyBpbnQgcmVzX2xvY2tlZChzdHJ1Y3QgczIyNTVfZmggKmZoKQogewotCXJldHVybiBkZXYtPnJlc291cmNlc1tmaC0+Y2hhbm5lbF07CisJcmV0dXJuIGZoLT5jaGFubmVsLT5yZXNvdXJjZXM7CiB9CiAKIHN0YXRpYyBpbnQgcmVzX2NoZWNrKHN0cnVjdCBzMjI1NV9maCAqZmgpCiB7Ci0JcmV0dXJuIGZoLT5yZXNvdXJjZXNbZmgtPmNoYW5uZWxdOworCXJldHVybiBmaC0+cmVzb3VyY2VzOwogfQogCiAKLXN0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgc3RydWN0IHMyMjU1X2ZoICpmaCkKK3N0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCBzMjI1NV9maCAqZmgpCiB7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JZGV2LT5yZXNvdXJjZXNbZmgtPmNoYW5uZWxdID0gMDsKLQlmaC0+cmVzb3VyY2VzW2ZoLT5jaGFubmVsXSA9IDA7CisJY2hhbm5lbC0+cmVzb3VyY2VzID0gMDsKKwlmaC0+cmVzb3VyY2VzID0gMDsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJZHByaW50aygxLCAicmVzOiBwdXRcbiIpOwogfQpAQCAtODY5LDEyICs4NzUsMTMgQEAKIAkJCSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJc3RydWN0IHMyMjU1X2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKIAotCWYtPmZtdC5waXgud2lkdGggPSBmaC0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgPSBmaC0+aGVpZ2h0OworCWYtPmZtdC5waXgud2lkdGggPSBjaGFubmVsLT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCA9IGNoYW5uZWwtPmhlaWdodDsKIAlmLT5mbXQucGl4LmZpZWxkID0gZmgtPnZiX3ZpZHEuZmllbGQ7Ci0JZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IGZoLT5mbXQtPmZvdXJjYzsKLQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGggKiAoZmgtPmZtdC0+ZGVwdGggPj4gMyk7CisJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IGNoYW5uZWwtPmZtdC0+Zm91cmNjOworCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gZi0+Zm10LnBpeC53aWR0aCAqIChjaGFubmVsLT5mbXQtPmRlcHRoID4+IDMpOwogCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg4NiwxMSArODkzLDEwIEBACiAJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwogCWludCAgYl9hbnlfZmllbGQgPSAwOwogCXN0cnVjdCBzMjI1NV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKIAlpbnQgaXNfbnRzYzsKLQogCWlzX250c2MgPQotCSAgICAoZGV2LT52ZGV2W2ZoLT5jaGFubmVsXS5jdXJyZW50X25vcm0gJiBWNEwyX1NURF9OVFNDKSA/IDEgOiAwOworCQkoY2hhbm5lbC0+dmRldi5jdXJyZW50X25vcm0gJiBWNEwyX1NURF9OVFNDKSA/IDEgOiAwOwogCiAJZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKIApAQCAtOTgyLDggKzk4OCwxMCBAQAogCQkJICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9IGZoLT5jaGFubmVsOwogCWNvbnN0IHN0cnVjdCBzMjI1NV9mbXQgKmZtdDsKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSAmZmgtPnZiX3ZpZHE7CisJc3RydWN0IHMyMjU1X21vZGUgbW9kZTsKIAlpbnQgcmV0OwogCWludCBub3JtOwogCkBAIC0xMDA1LDU0ICsxMDEzLDYxIEBACiAJCWdvdG8gb3V0X3NfZm10OwogCX0KIAotCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsIGZoKSkgeworCWlmIChyZXNfbG9ja2VkKGZoKSkgewogCQlkcHJpbnRrKDEsICIlczogY2hhbm5lbCBidXN5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXRfc19mbXQ7CiAJfQotCi0JZmgtPmZtdCA9IGZtdDsKLQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKKwltb2RlID0gY2hhbm5lbC0+bW9kZTsKKwljaGFubmVsLT5mbXQgPSBmbXQ7CisJY2hhbm5lbC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOworCWNoYW5uZWwtPmhlaWdodCA9IGYtPmZtdC5waXguaGVpZ2h0OwogCWZoLT52Yl92aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKIAlmaC0+dHlwZSA9IGYtPnR5cGU7Ci0Jbm9ybSA9IG5vcm1fbWludygmZmgtPmRldi0+dmRldltmaC0+Y2hhbm5lbF0pOwotCWlmIChmaC0+d2lkdGggPiBub3JtX21pbncoJmZoLT5kZXYtPnZkZXZbZmgtPmNoYW5uZWxdKSkgewotCQlpZiAoZmgtPmhlaWdodCA+IG5vcm1fbWluaCgmZmgtPmRldi0+dmRldltmaC0+Y2hhbm5lbF0pKSB7Ci0JCQlpZiAoZmgtPmRldi0+Y2FwX3Bhcm1bZmgtPmNoYW5uZWxdLmNhcHR1cmVtb2RlICYKKwlub3JtID0gbm9ybV9taW53KCZjaGFubmVsLT52ZGV2KTsKKwlpZiAoY2hhbm5lbC0+d2lkdGggPiBub3JtX21pbncoJmNoYW5uZWwtPnZkZXYpKSB7CisJCWlmIChjaGFubmVsLT5oZWlnaHQgPiBub3JtX21pbmgoJmNoYW5uZWwtPnZkZXYpKSB7CisJCQlpZiAoY2hhbm5lbC0+Y2FwX3Bhcm0uY2FwdHVyZW1vZGUgJgogCQkJICAgIFY0TDJfTU9ERV9ISUdIUVVBTElUWSkKLQkJCQlmaC0+bW9kZS5zY2FsZSA9IFNDQUxFXzRDSUZTSTsKKwkJCQltb2RlLnNjYWxlID0gU0NBTEVfNENJRlNJOwogCQkJZWxzZQotCQkJCWZoLT5tb2RlLnNjYWxlID0gU0NBTEVfNENJRlM7CisJCQkJbW9kZS5zY2FsZSA9IFNDQUxFXzRDSUZTOwogCQl9IGVsc2UKLQkJCWZoLT5tb2RlLnNjYWxlID0gU0NBTEVfMkNJRlM7CisJCQltb2RlLnNjYWxlID0gU0NBTEVfMkNJRlM7CiAKIAl9IGVsc2UgewotCQlmaC0+bW9kZS5zY2FsZSA9IFNDQUxFXzFDSUZTOworCQltb2RlLnNjYWxlID0gU0NBTEVfMUNJRlM7CiAJfQotCiAJLyogY29sb3IgbW9kZSAqLwotCXN3aXRjaCAoZmgtPmZtdC0+Zm91cmNjKSB7CisJc3dpdGNoIChjaGFubmVsLT5mbXQtPmZvdXJjYykgewogCWNhc2UgVjRMMl9QSVhfRk1UX0dSRVk6Ci0JCWZoLT5tb2RlLmNvbG9yICY9IH5NQVNLX0NPTE9SOwotCQlmaC0+bW9kZS5jb2xvciB8PSBDT0xPUl9ZODsKKwkJbW9kZS5jb2xvciAmPSB+TUFTS19DT0xPUjsKKwkJbW9kZS5jb2xvciB8PSBDT0xPUl9ZODsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzoKLQkJZmgtPm1vZGUuY29sb3IgJj0gfk1BU0tfQ09MT1I7Ci0JCWZoLT5tb2RlLmNvbG9yIHw9IENPTE9SX0pQRzsKLQkJZmgtPm1vZGUuY29sb3IgfD0gKGZoLT5kZXYtPmpjW2ZoLT5jaGFubmVsXS5xdWFsaXR5IDw8IDgpOworCQltb2RlLmNvbG9yICY9IH5NQVNLX0NPTE9SOworCQltb2RlLmNvbG9yIHw9IENPTE9SX0pQRzsKKwkJbW9kZS5jb2xvciB8PSAoY2hhbm5lbC0+amMucXVhbGl0eSA8PCA4KTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKLQkJZmgtPm1vZGUuY29sb3IgJj0gfk1BU0tfQ09MT1I7Ci0JCWZoLT5tb2RlLmNvbG9yIHw9IENPTE9SX1lVVlBMOworCQltb2RlLmNvbG9yICY9IH5NQVNLX0NPTE9SOworCQltb2RlLmNvbG9yIHw9IENPTE9SX1lVVlBMOwogCQlicmVhazsKIAljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgogCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CiAJZGVmYXVsdDoKLQkJZmgtPm1vZGUuY29sb3IgJj0gfk1BU0tfQ09MT1I7Ci0JCWZoLT5tb2RlLmNvbG9yIHw9IENPTE9SX1lVVlBLOworCQltb2RlLmNvbG9yICY9IH5NQVNLX0NPTE9SOworCQltb2RlLmNvbG9yIHw9IENPTE9SX1lVVlBLOwogCQlicmVhazsKIAl9CisJaWYgKChtb2RlLmNvbG9yICYgTUFTS19DT0xPUikgIT0gKGNoYW5uZWwtPm1vZGUuY29sb3IgJiBNQVNLX0NPTE9SKSkKKwkJbW9kZS5yZXN0YXJ0ID0gMTsKKwllbHNlIGlmIChtb2RlLnNjYWxlICE9IGNoYW5uZWwtPm1vZGUuc2NhbGUpCisJCW1vZGUucmVzdGFydCA9IDE7CisJZWxzZSBpZiAobW9kZS5mb3JtYXQgIT0gY2hhbm5lbC0+bW9kZS5mb3JtYXQpCisJCW1vZGUucmVzdGFydCA9IDE7CisJY2hhbm5lbC0+bW9kZSA9IG1vZGU7CisJKHZvaWQpIHMyMjU1X3NldF9tb2RlKGNoYW5uZWwsICZtb2RlKTsKIAlyZXQgPSAwOwogb3V0X3NfZm10OgogCW11dGV4X3VubG9jaygmcS0+dmJfbG9jayk7CkBAIC0xMTk3LDI2ICsxMjEyLDI3IEBACiAgKiBXaGVuIHRoZSByZXN0YXJ0IHBhcmFtZXRlciBpcyBzZXQsIHdlIHNsZWVwIGZvciBPTkUgZnJhbWUgdG8gYWxsb3cgdGhlCiAgKiBEU1AgdGltZSB0byBnZXQgdGhlIG5ldyBmcmFtZQogICovCi1zdGF0aWMgaW50IHMyMjU1X3NldF9tb2RlKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBjaG4sCitzdGF0aWMgaW50IHMyMjU1X3NldF9tb2RlKHN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsLAogCQkJICBzdHJ1Y3QgczIyNTVfbW9kZSAqbW9kZSkKIHsKIAlpbnQgcmVzOwogCV9fbGUzMiAqYnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgY2huX3JldjsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSB0b19zMjI1NV9kZXYoY2hhbm5lbC0+dmRldi52NGwyX2Rldik7CiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQljaG5fcmV2ID0gR19jaG5tYXBbY2huXTsKLQlkcHJpbnRrKDMsICIlcyBjaGFubmVsICVsdVxuIiwgX19mdW5jX18sIGNobik7CisJY2huX3JldiA9IEdfY2hubWFwW2NoYW5uZWwtPmlkeF07CisJZHByaW50aygzLCAiJXMgY2hhbm5lbDogJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsLT5pZHgpOwogCS8qIGlmIEpQRUcsIHNldCB0aGUgcXVhbGl0eSAqLwogCWlmICgobW9kZS0+Y29sb3IgJiBNQVNLX0NPTE9SKSA9PSBDT0xPUl9KUEcpIHsKIAkJbW9kZS0+Y29sb3IgJj0gfk1BU0tfQ09MT1I7CiAJCW1vZGUtPmNvbG9yIHw9IENPTE9SX0pQRzsKIAkJbW9kZS0+Y29sb3IgJj0gfk1BU0tfSlBHX1FVQUxJVFk7Ci0JCW1vZGUtPmNvbG9yIHw9IChkZXYtPmpjW2Nobl0ucXVhbGl0eSA8PCA4KTsKKwkJbW9kZS0+Y29sb3IgfD0gKGNoYW5uZWwtPmpjLnF1YWxpdHkgPDwgOCk7CiAJfQogCS8qIHNhdmUgdGhlIG1vZGUgKi8KLQlkZXYtPm1vZGVbY2huXSA9ICptb2RlOwotCWRldi0+cmVxX2ltYWdlX3NpemVbY2huXSA9IGdldF90cmFuc2Zlcl9zaXplKG1vZGUpOwotCWRwcmludGsoMSwgIiVzOiByZXFzaXplICVsZFxuIiwgX19mdW5jX18sIGRldi0+cmVxX2ltYWdlX3NpemVbY2huXSk7CisJY2hhbm5lbC0+bW9kZSA9ICptb2RlOworCWNoYW5uZWwtPnJlcV9pbWFnZV9zaXplID0gZ2V0X3RyYW5zZmVyX3NpemUobW9kZSk7CisJZHByaW50aygxLCAiJXM6IHJlcXNpemUgJWxkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbC0+cmVxX2ltYWdlX3NpemUpOwogCWJ1ZmZlciA9IGt6YWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtXG4iKTsKQEAgLTEyMjcsMzggKzEyNDMsMzggQEAKIAlidWZmZXJbMF0gPSBJTl9EQVRBX1RPS0VOOwogCWJ1ZmZlclsxXSA9IChfX2xlMzIpIGNwdV90b19sZTMyKGNobl9yZXYpOwogCWJ1ZmZlclsyXSA9IENNRF9TRVRfTU9ERTsKLQltZW1jcHkoJmJ1ZmZlclszXSwgJmRldi0+bW9kZVtjaG5dLCBzaXplb2Yoc3RydWN0IHMyMjU1X21vZGUpKTsKLQlkZXYtPnNldG1vZGVfcmVhZHlbY2huXSA9IDA7CisJbWVtY3B5KCZidWZmZXJbM10sICZjaGFubmVsLT5tb2RlLCBzaXplb2Yoc3RydWN0IHMyMjU1X21vZGUpKTsKKwljaGFubmVsLT5zZXRtb2RlX3JlYWR5ID0gMDsKIAlyZXMgPSBzMjI1NV93cml0ZV9jb25maWcoZGV2LT51ZGV2LCAodW5zaWduZWQgY2hhciAqKWJ1ZmZlciwgNTEyKTsKIAlpZiAoZGVidWcpCiAJCXMyMjU1X3ByaW50X2NmZyhkZXYsIG1vZGUpOwogCWtmcmVlKGJ1ZmZlcik7CiAJLyogd2FpdCBhdCBsZWFzdCAzIGZyYW1lcyBiZWZvcmUgY29udGludWluZyAqLwogCWlmIChtb2RlLT5yZXN0YXJ0KSB7Ci0JCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfc2V0bW9kZVtjaG5dLAotCQkJCSAgIChkZXYtPnNldG1vZGVfcmVhZHlbY2huXSAhPSAwKSwKKwkJd2FpdF9ldmVudF90aW1lb3V0KGNoYW5uZWwtPndhaXRfc2V0bW9kZSwKKwkJCQkgICAoY2hhbm5lbC0+c2V0bW9kZV9yZWFkeSAhPSAwKSwKIAkJCQkgICBtc2Vjc190b19qaWZmaWVzKFMyMjU1X1NFVE1PREVfVElNRU9VVCkpOwotCQlpZiAoZGV2LT5zZXRtb2RlX3JlYWR5W2Nobl0gIT0gMSkgeworCQlpZiAoY2hhbm5lbC0+c2V0bW9kZV9yZWFkeSAhPSAxKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiczIyNTU6IG5vIHNldCBtb2RlIHJlc3BvbnNlXG4iKTsKIAkJCXJlcyA9IC1FRkFVTFQ7CiAJCX0KIAl9CiAJLyogY2xlYXIgdGhlIHJlc3RhcnQgZmxhZyAqLwotCWRldi0+bW9kZVtjaG5dLnJlc3RhcnQgPSAwOworCWNoYW5uZWwtPm1vZGUucmVzdGFydCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCWRwcmludGsoMSwgIiVzIGNobiAlbHUsIHJlc3VsdDogJWRcbiIsIF9fZnVuY19fLCBjaG4sIHJlcyk7CisJZHByaW50aygxLCAiJXMgY2huICVkLCByZXN1bHQ6ICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbC0+aWR4LCByZXMpOwogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgczIyNTVfY21kX3N0YXR1cyhzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2huLAotCQkJICAgIHUzMiAqcHN0YXR1cykKK3N0YXRpYyBpbnQgczIyNTVfY21kX3N0YXR1cyhzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCwgdTMyICpwc3RhdHVzKQogewogCWludCByZXM7CiAJX19sZTMyICpidWZmZXI7CiAJdTMyIGNobl9yZXY7CisJc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gdG9fczIyNTVfZGV2KGNoYW5uZWwtPnZkZXYudjRsMl9kZXYpOwogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JY2huX3JldiA9IEdfY2hubWFwW2Nobl07Ci0JZHByaW50ayg0LCAiJXMgY2hhbiAlbHVcbiIsIF9fZnVuY19fLCBjaG4pOworCWNobl9yZXYgPSBHX2Nobm1hcFtjaGFubmVsLT5pZHhdOworCWRwcmludGsoNCwgIiVzIGNoYW4gJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsLT5pZHgpOwogCWJ1ZmZlciA9IGt6YWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtXG4iKTsKQEAgLTEyNzAsMTcgKzEyODYsMTcgQEAKIAlidWZmZXJbMV0gPSAoX19sZTMyKSBjcHVfdG9fbGUzMihjaG5fcmV2KTsKIAlidWZmZXJbMl0gPSBDTURfU1RBVFVTOwogCSpwc3RhdHVzID0gMDsKLQlkZXYtPnZpZHN0YXR1c19yZWFkeVtjaG5dID0gMDsKKwljaGFubmVsLT52aWRzdGF0dXNfcmVhZHkgPSAwOwogCXJlcyA9IHMyMjU1X3dyaXRlX2NvbmZpZyhkZXYtPnVkZXYsICh1bnNpZ25lZCBjaGFyICopYnVmZmVyLCA1MTIpOwogCWtmcmVlKGJ1ZmZlcik7Ci0Jd2FpdF9ldmVudF90aW1lb3V0KGRldi0+d2FpdF92aWRzdGF0dXNbY2huXSwKLQkJCSAgIChkZXYtPnZpZHN0YXR1c19yZWFkeVtjaG5dICE9IDApLAorCXdhaXRfZXZlbnRfdGltZW91dChjaGFubmVsLT53YWl0X3ZpZHN0YXR1cywKKwkJCSAgIChjaGFubmVsLT52aWRzdGF0dXNfcmVhZHkgIT0gMCksCiAJCQkgICBtc2Vjc190b19qaWZmaWVzKFMyMjU1X1ZJRFNUQVRVU19USU1FT1VUKSk7Ci0JaWYgKGRldi0+dmlkc3RhdHVzX3JlYWR5W2Nobl0gIT0gMSkgeworCWlmIChjaGFubmVsLT52aWRzdGF0dXNfcmVhZHkgIT0gMSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiczIyNTU6IG5vIHZpZHN0YXR1cyByZXNwb25zZVxuIik7CiAJCXJlcyA9IC1FRkFVTFQ7CiAJfQotCSpwc3RhdHVzID0gZGV2LT52aWRzdGF0dXNbY2huXTsKKwkqcHN0YXR1cyA9IGNoYW5uZWwtPnZpZHN0YXR1czsKIAlkcHJpbnRrKDQsICIlcywgdmlkIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sICpwc3RhdHVzKTsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIHJlczsKQEAgLTEyOTEsOSArMTMwNyw3IEBACiAJaW50IHJlczsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKIAlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBzMjI1NV9tb2RlICpuZXdfbW9kZTsKLQlzdHJ1Y3QgczIyNTVfbW9kZSAqb2xkX21vZGU7Ci0JaW50IGNobjsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9IGZoLT5jaGFubmVsOwogCWludCBqOwogCWRwcmludGsoNCwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewpAQCAtMTMwNSw1MSArMTMxOSwzMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIXJlc19nZXQoZGV2LCBmaCkpIHsKKwlpZiAoIXJlc19nZXQoZmgpKSB7CiAJCXMyMjU1X2Rldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAic3RyZWFtIGJ1c3lcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KLQotCS8qIHNlbmQgYSBzZXQgbW9kZSBjb21tYW5kIGV2ZXJ5dGltZSB3aXRoIHJlc3RhcnQuCi0JICAgaW4gY2FzZSB3ZSBzd2l0Y2ggcmVzb2x1dGlvbnMgb3Igb3RoZXIgcGFyYW1ldGVycyAqLwotCWNobiA9IGZoLT5jaGFubmVsOwotCW5ld19tb2RlID0gJmZoLT5tb2RlOwotCW9sZF9tb2RlID0gJmZoLT5kZXYtPm1vZGVbY2huXTsKLQotCWlmICgobmV3X21vZGUtPmNvbG9yICYgTUFTS19DT0xPUikgIT0gKG9sZF9tb2RlLT5jb2xvciAmIE1BU0tfQ09MT1IpKQotCQluZXdfbW9kZS0+cmVzdGFydCA9IDE7Ci0JZWxzZSBpZiAobmV3X21vZGUtPnNjYWxlICE9IG9sZF9tb2RlLT5zY2FsZSkKLQkJbmV3X21vZGUtPnJlc3RhcnQgPSAxOwotCWVsc2UgaWYgKG5ld19tb2RlLT5mb3JtYXQgIT0gb2xkX21vZGUtPmZvcm1hdCkKLQkJbmV3X21vZGUtPnJlc3RhcnQgPSAxOwotCi0JczIyNTVfc2V0X21vZGUoZGV2LCBjaG4sIG5ld19tb2RlKTsKLQluZXdfbW9kZS0+cmVzdGFydCA9IDA7Ci0JKm9sZF9tb2RlID0gKm5ld19tb2RlOwotCWRldi0+Y3VyX2ZtdFtjaG5dID0gZmgtPmZtdDsKLQlkZXYtPmxhc3RfZnJhbWVbY2huXSA9IC0xOwotCWRldi0+YmFkX3BheWxvYWRbY2huXSA9IDA7Ci0JZGV2LT5jdXJfZnJhbWVbY2huXSA9IDA7Ci0JZGV2LT5mcmFtZV9jb3VudFtjaG5dID0gMDsKKwljaGFubmVsLT5sYXN0X2ZyYW1lID0gLTE7CisJY2hhbm5lbC0+YmFkX3BheWxvYWQgPSAwOworCWNoYW5uZWwtPmN1cl9mcmFtZSA9IDA7CisJY2hhbm5lbC0+ZnJhbWVfY291bnQgPSAwOwogCWZvciAoaiA9IDA7IGogPCBTWVNfRlJBTUVTOyBqKyspIHsKLQkJZGV2LT5idWZmZXJbY2huXS5mcmFtZVtqXS51bFN0YXRlID0gUzIyNTVfUkVBRF9JRExFOwotCQlkZXYtPmJ1ZmZlcltjaG5dLmZyYW1lW2pdLmN1cl9zaXplID0gMDsKKwkJY2hhbm5lbC0+YnVmZmVyLmZyYW1lW2pdLnVsU3RhdGUgPSBTMjI1NV9SRUFEX0lETEU7CisJCWNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtqXS5jdXJfc2l6ZSA9IDA7CiAJfQogCXJlcyA9IHZpZGVvYnVmX3N0cmVhbW9uKCZmaC0+dmJfdmlkcSk7CiAJaWYgKHJlcyA9PSAwKSB7Ci0JCXMyMjU1X3N0YXJ0X2FjcXVpcmUoZGV2LCBjaG4pOwotCQlkZXYtPmJfYWNxdWlyZVtjaG5dID0gMTsKLQl9IGVsc2UgewotCQlyZXNfZnJlZShkZXYsIGZoKTsKLQl9CisJCXMyMjU1X3N0YXJ0X2FjcXVpcmUoY2hhbm5lbCk7CisJCWNoYW5uZWwtPmJfYWNxdWlyZSA9IDE7CisJfSBlbHNlCisJCXJlc19mcmVlKGZoKTsKKwogCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCiB7CiAJc3RydWN0IHMyMjU1X2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gZmgtPmRldjsKLQlkcHJpbnRrKDQsICIlc1xuLCBjaGFubmVsOiAlZCIsIF9fZnVuY19fLCBmaC0+Y2hhbm5lbCk7CisJZHByaW50ayg0LCAiJXNcbiwgY2hhbm5lbDogJWQiLCBfX2Z1bmNfXywgZmgtPmNoYW5uZWwtPmlkeCk7CiAJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewogCQlwcmludGsoS0VSTl9FUlIgImludmFsaWQgZmggdHlwZTBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzNTgsMTYgKzEzNTMsMTYgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIHR5cGUgaVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzMjI1NV9zdG9wX2FjcXVpcmUoZGV2LCBmaC0+Y2hhbm5lbCk7CisJczIyNTVfc3RvcF9hY3F1aXJlKGZoLT5jaGFubmVsKTsKIAl2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52Yl92aWRxKTsKLQlyZXNfZnJlZShkZXYsIGZoKTsKKwlyZXNfZnJlZShmaCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaSkKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgczIyNTVfbW9kZSAqbW9kZTsKKwlzdHJ1Y3QgczIyNTVfbW9kZSBtb2RlOwogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSA9ICZmaC0+dmJfdmlkcTsKIAlpbnQgcmV0ID0gMDsKIAltdXRleF9sb2NrKCZxLT52Yl9sb2NrKTsKQEAgLTEzNzYsMjkgKzEzNzEsMzIgQEAKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dF9zX3N0ZDsKIAl9Ci0JaWYgKHJlc19sb2NrZWQoZmgtPmRldiwgZmgpKSB7CisJaWYgKHJlc19sb2NrZWQoZmgpKSB7CiAJCWRwcmludGsoMSwgImNhbid0IGNoYW5nZSBzdGFuZGFyZCBhZnRlciBzdGFydGVkXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dF9zX3N0ZDsKIAl9Ci0JbW9kZSA9ICZmaC0+bW9kZTsKKwltb2RlID0gZmgtPmNoYW5uZWwtPm1vZGU7CiAJaWYgKCppICYgVjRMMl9TVERfTlRTQykgewogCQlkcHJpbnRrKDQsICIlcyBOVFNDXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIGlmIGNoYW5naW5nIGZvcm1hdCwgcmVzZXQgZnJhbWUgZGVjaW1hdGlvbi9pbnRlcnZhbHMgKi8KLQkJaWYgKG1vZGUtPmZvcm1hdCAhPSBGT1JNQVRfTlRTQykgewotCQkJbW9kZS0+Zm9ybWF0ID0gRk9STUFUX05UU0M7Ci0JCQltb2RlLT5mZGVjID0gRkRFQ18xOworCQlpZiAobW9kZS5mb3JtYXQgIT0gRk9STUFUX05UU0MpIHsKKwkJCW1vZGUucmVzdGFydCA9IDE7CisJCQltb2RlLmZvcm1hdCA9IEZPUk1BVF9OVFNDOworCQkJbW9kZS5mZGVjID0gRkRFQ18xOwogCQl9CiAJfSBlbHNlIGlmICgqaSAmIFY0TDJfU1REX1BBTCkgewogCQlkcHJpbnRrKDQsICIlcyBQQUxcbiIsIF9fZnVuY19fKTsKLQkJbW9kZS0+Zm9ybWF0ID0gRk9STUFUX1BBTDsKLQkJaWYgKG1vZGUtPmZvcm1hdCAhPSBGT1JNQVRfUEFMKSB7Ci0JCQltb2RlLT5mb3JtYXQgPSBGT1JNQVRfUEFMOwotCQkJbW9kZS0+ZmRlYyA9IEZERUNfMTsKKwkJaWYgKG1vZGUuZm9ybWF0ICE9IEZPUk1BVF9QQUwpIHsKKwkJCW1vZGUucmVzdGFydCA9IDE7CisJCQltb2RlLmZvcm1hdCA9IEZPUk1BVF9QQUw7CisJCQltb2RlLmZkZWMgPSBGREVDXzE7CiAJCX0KIAl9IGVsc2UgewogCQlyZXQgPSAtRUlOVkFMOwogCX0KKwlpZiAobW9kZS5yZXN0YXJ0KQorCQlzMjI1NV9zZXRfbW9kZShmaC0+Y2hhbm5lbCwgJm1vZGUpOwogb3V0X3Nfc3RkOgogCW11dGV4X3VubG9jaygmcS0+dmJfbG9jayk7CiAJcmV0dXJuIHJldDsKQEAgLTE0MTYsNiArMTQxNCw3IEBACiB7CiAJc3RydWN0IHMyMjU1X2ZoICpmaCA9IHByaXY7CiAJc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9IGZoLT5jaGFubmVsOwogCXUzMiBzdGF0dXMgPSAwOwogCWlmIChpbnAtPmluZGV4ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQyNCw3ICsxNDIzLDcgQEAKIAlpbnAtPnN0YXR1cyA9IDA7CiAJaWYgKGRldi0+ZHNwX2Z3X3ZlciA+PSBTMjI1NV9NSU5fRFNQX1NUQVRVUykgewogCQlpbnQgcmM7Ci0JCXJjID0gczIyNTVfY21kX3N0YXR1cyhkZXYsIGZoLT5jaGFubmVsLCAmc3RhdHVzKTsKKwkJcmMgPSBzMjI1NV9jbWRfc3RhdHVzKGZoLT5jaGFubmVsLCAmc3RhdHVzKTsKIAkJZHByaW50ayg0LCAiczIyNTVfY21kX3N0YXR1cyByYzogJWQgc3RhdHVzICV4XG4iLCByYywgc3RhdHVzKTsKIAkJaWYgKHJjID09IDApCiAJCQlpbnAtPnN0YXR1cyA9ICAoc3RhdHVzICYgMHgwMSkgPyAwCkBAIC0xNDM2LDcgKzE0MzUsNyBAQAogCQlzdHJsY3B5KGlucC0+bmFtZSwgIkNvbXBvc2l0ZSIsIHNpemVvZihpbnAtPm5hbWUpKTsKIAkJYnJlYWs7CiAJY2FzZSAweDIyNTc6Ci0JCXN0cmxjcHkoaW5wLT5uYW1lLCAoZmgtPmNoYW5uZWwgPCAyKSA/ICJDb21wb3NpdGUiIDogIlMtVmlkZW8iLAorCQlzdHJsY3B5KGlucC0+bmFtZSwgKGNoYW5uZWwtPmlkeCA8IDIpID8gIkNvbXBvc2l0ZSIgOiAiUy1WaWRlbyIsCiAJCQlzaXplb2YoaW5wLT5uYW1lKSk7CiAJCWJyZWFrOwogCX0KQEAgLTE0NjAsNiArMTQ1OSw3IEBACiAJCQkgICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9IGZoLT5jaGFubmVsOwogCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IGZoLT5kZXY7CiAJc3dpdGNoIChxYy0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT0xPUkZJTFRFUjoKIAkJaWYgKGRldi0+ZHNwX2Z3X3ZlciA8IFMyMjU1X01JTl9EU1BfQ09MT1JGSUxURVIpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKChkZXYtPnBpZCA9PSAweDIyNTcpICYmIChmaC0+Y2hhbm5lbCA+IDEpKQorCQlpZiAoKGRldi0+cGlkID09IDB4MjI1NykgJiYgKGNoYW5uZWwtPmlkeCA+IDEpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXN0cmxjcHkocWMtPm5hbWUsICJDb2xvciBGaWx0ZXIiLCBzaXplb2YocWMtPm5hbWUpKTsKIAkJcWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VOwpAQCAtMTQ5OSwyNSArMTQ5OSwyNiBAQAogewogCXN0cnVjdCBzMjI1NV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQljdHJsLT52YWx1ZSA9IGZoLT5tb2RlLmJyaWdodDsKKwkJY3RybC0+dmFsdWUgPSBjaGFubmVsLT5tb2RlLmJyaWdodDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJY3RybC0+dmFsdWUgPSBmaC0+bW9kZS5jb250cmFzdDsKKwkJY3RybC0+dmFsdWUgPSBjaGFubmVsLT5tb2RlLmNvbnRyYXN0OwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCWN0cmwtPnZhbHVlID0gZmgtPm1vZGUuc2F0dXJhdGlvbjsKKwkJY3RybC0+dmFsdWUgPSBjaGFubmVsLT5tb2RlLnNhdHVyYXRpb247CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfSFVFOgotCQljdHJsLT52YWx1ZSA9IGZoLT5tb2RlLmh1ZTsKKwkJY3RybC0+dmFsdWUgPSBjaGFubmVsLT5tb2RlLmh1ZTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTE9SRklMVEVSOgogCQlpZiAoZGV2LT5kc3BfZndfdmVyIDwgUzIyNTVfTUlOX0RTUF9DT0xPUkZJTFRFUikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKGRldi0+cGlkID09IDB4MjI1NykgJiYgKGZoLT5jaGFubmVsID4gMSkpCisJCWlmICgoZGV2LT5waWQgPT0gMHgyMjU3KSAmJiAoY2hhbm5lbC0+aWR4ID4gMSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJY3RybC0+dmFsdWUgPSAhKChmaC0+bW9kZS5jb2xvciAmIE1BU0tfSU5QVVRfVFlQRSkgPj4gMTYpOworCQljdHJsLT52YWx1ZSA9ICEoKGNoYW5uZWwtPm1vZGUuY29sb3IgJiBNQVNLX0lOUFVUX1RZUEUpID4+IDE2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTMwLDQxICsxNTMxLDQyIEBACiAJCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBzMjI1NV9tb2RlICptb2RlOwotCW1vZGUgPSAmZmgtPm1vZGU7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSB0b19zMjI1NV9kZXYoY2hhbm5lbC0+dmRldi52NGwyX2Rldik7CisJc3RydWN0IHMyMjU1X21vZGUgbW9kZTsKKwltb2RlID0gY2hhbm5lbC0+bW9kZTsKIAlkcHJpbnRrKDQsICIlc1xuIiwgX19mdW5jX18pOwogCS8qIHVwZGF0ZSB0aGUgbW9kZSB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSAqLwogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCW1vZGUtPmJyaWdodCA9IGN0cmwtPnZhbHVlOworCQltb2RlLmJyaWdodCA9IGN0cmwtPnZhbHVlOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQltb2RlLT5jb250cmFzdCA9IGN0cmwtPnZhbHVlOworCQltb2RlLmNvbnRyYXN0ID0gY3RybC0+dmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfSFVFOgotCQltb2RlLT5odWUgPSBjdHJsLT52YWx1ZTsKKwkJbW9kZS5odWUgPSBjdHJsLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQltb2RlLT5zYXR1cmF0aW9uID0gY3RybC0+dmFsdWU7CisJCW1vZGUuc2F0dXJhdGlvbiA9IGN0cmwtPnZhbHVlOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1JGSUxURVI6CiAJCWlmIChkZXYtPmRzcF9md192ZXIgPCBTMjI1NV9NSU5fRFNQX0NPTE9SRklMVEVSKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgoZGV2LT5waWQgPT0gMHgyMjU3KSAmJiAoZmgtPmNoYW5uZWwgPiAxKSkKKwkJaWYgKChkZXYtPnBpZCA9PSAweDIyNTcpICYmIChjaGFubmVsLT5pZHggPiAxKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQltb2RlLT5jb2xvciAmPSB+TUFTS19JTlBVVF9UWVBFOwotCQltb2RlLT5jb2xvciB8PSAoKGN0cmwtPnZhbHVlID8gMCA6IDEpIDw8IDE2KTsKKwkJbW9kZS5jb2xvciAmPSB+TUFTS19JTlBVVF9UWVBFOworCQltb2RlLmNvbG9yIHw9ICgoY3RybC0+dmFsdWUgPyAwIDogMSkgPDwgMTYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JbW9kZS0+cmVzdGFydCA9IDA7CisJbW9kZS5yZXN0YXJ0ID0gMDsKIAkvKiBzZXQgbW9kZSBoZXJlLiAgTm90ZTogc3RyZWFtIGRvZXMgbm90IG5lZWQgcmVzdGFydGVkLgogCSAgIHNvbWUgVjRMIHByb2dyYW1zIHJlc3RhcnQgc3RyZWFtIHVubmVjZXNzYXJpbHkKIAkgICBhZnRlciBhIHNfY3J0bC4KIAkqLwotCXMyMjU1X3NldF9tb2RlKGRldiwgZmgtPmNoYW5uZWwsIG1vZGUpOworCXMyMjU1X3NldF9tb2RlKGZoLT5jaGFubmVsLCAmbW9kZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NzIsOCArMTU3NCw4IEBACiAJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqYykKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCSpqYyA9IGRldi0+amNbZmgtPmNoYW5uZWxdOworCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsID0gZmgtPmNoYW5uZWw7CisJKmpjID0gY2hhbm5lbC0+amM7CiAJZHByaW50aygyLCAiJXM6IHF1YWxpdHkgJWRcbiIsIF9fZnVuY19fLCBqYy0+cXVhbGl0eSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNTgyLDEwICsxNTg0LDEwIEBACiAJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqYykKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsID0gZmgtPmNoYW5uZWw7CiAJaWYgKGpjLT5xdWFsaXR5IDwgMCB8fCBqYy0+cXVhbGl0eSA+IDEwMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JZGV2LT5qY1tmaC0+Y2hhbm5lbF0ucXVhbGl0eSA9IGpjLT5xdWFsaXR5OworCWNoYW5uZWwtPmpjLnF1YWxpdHkgPSBqYy0+cXVhbGl0eTsKIAlkcHJpbnRrKDIsICIlczogcXVhbGl0eSAlZFxuIiwgX19mdW5jX18sIGpjLT5xdWFsaXR5KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1OTQsMTcgKzE1OTYsMTcgQEAKIAkJCSBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpzcCkKIHsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCV9fdTMyIGRlZl9udW0sIGRlZl9kZW07CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKIAlpZiAoc3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1zZXQoc3AsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSk7CiAJc3AtPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOwotCXNwLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSBkZXYtPmNhcF9wYXJtW2ZoLT5jaGFubmVsXS5jYXB0dXJlbW9kZTsKLQlkZWZfbnVtID0gKGZoLT5tb2RlLmZvcm1hdCA9PSBGT1JNQVRfTlRTQykgPyAxMDAxIDogMTAwMDsKLQlkZWZfZGVtID0gKGZoLT5tb2RlLmZvcm1hdCA9PSBGT1JNQVRfTlRTQykgPyAzMDAwMCA6IDI1MDAwOworCXNwLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSBjaGFubmVsLT5jYXBfcGFybS5jYXB0dXJlbW9kZTsKKwlkZWZfbnVtID0gKGNoYW5uZWwtPm1vZGUuZm9ybWF0ID09IEZPUk1BVF9OVFNDKSA/IDEwMDEgOiAxMDAwOworCWRlZl9kZW0gPSAoY2hhbm5lbC0+bW9kZS5mb3JtYXQgPT0gRk9STUFUX05UU0MpID8gMzAwMDAgOiAyNTAwMDsKIAlzcC0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGRlZl9kZW07Ci0Jc3dpdGNoIChmaC0+bW9kZS5mZGVjKSB7CisJc3dpdGNoIChjaGFubmVsLT5tb2RlLmZkZWMpIHsKIAlkZWZhdWx0OgogCWNhc2UgRkRFQ18xOgogCQlzcC0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBkZWZfbnVtOwpAQCAtMTYzMCwxNyArMTYzMiwxOSBAQAogCQkJIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnNwKQogewogCXN0cnVjdCBzMjI1NV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgczIyNTVfbW9kZSBtb2RlOwogCWludCBmZGVjID0gRkRFQ18xOwogCV9fdTMyIGRlZl9udW0sIGRlZl9kZW07CiAJaWYgKHNwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJbW9kZSA9IGNoYW5uZWwtPm1vZGU7CiAJLyogaGlnaCBxdWFsaXR5IGNhcHR1cmUgbW9kZSByZXF1aXJlcyBhIHN0cmVhbSByZXN0YXJ0ICovCi0JaWYgKGRldi0+Y2FwX3Bhcm1bZmgtPmNoYW5uZWxdLmNhcHR1cmVtb2RlCi0JICAgICE9IHNwLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgJiYgcmVzX2xvY2tlZChmaC0+ZGV2LCBmaCkpCisJaWYgKGNoYW5uZWwtPmNhcF9wYXJtLmNhcHR1cmVtb2RlCisJICAgICE9IHNwLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgJiYgcmVzX2xvY2tlZChmaCkpCiAJCXJldHVybiAtRUJVU1k7Ci0JZGVmX251bSA9IChmaC0+bW9kZS5mb3JtYXQgPT0gRk9STUFUX05UU0MpID8gMTAwMSA6IDEwMDA7Ci0JZGVmX2RlbSA9IChmaC0+bW9kZS5mb3JtYXQgPT0gRk9STUFUX05UU0MpID8gMzAwMDAgOiAyNTAwMDsKKwlkZWZfbnVtID0gKG1vZGUuZm9ybWF0ID09IEZPUk1BVF9OVFNDKSA/IDEwMDEgOiAxMDAwOworCWRlZl9kZW0gPSAobW9kZS5mb3JtYXQgPT0gRk9STUFUX05UU0MpID8gMzAwMDAgOiAyNTAwMDsKIAlpZiAoZGVmX2RlbSAhPSBzcC0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcikKIAkJc3AtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gZGVmX251bTsKIAllbHNlIGlmIChzcC0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPD0gZGVmX251bSkKQEAgLTE2NTUsOSArMTY1OSw5IEBACiAJCXNwLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IGRlZl9udW0gKiA1OwogCQlmZGVjID0gRkRFQ181OwogCX0KLQlmaC0+bW9kZS5mZGVjID0gZmRlYzsKKwltb2RlLmZkZWMgPSBmZGVjOwogCXNwLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZGVmX2RlbTsKLQlzMjI1NV9zZXRfbW9kZShkZXYsIGZoLT5jaGFubmVsLCAmZmgtPm1vZGUpOworCXMyMjU1X3NldF9tb2RlKGNoYW5uZWwsICZtb2RlKTsKIAlkcHJpbnRrKDQsICIlcyBjYXB0dXJlIG1vZGUsICVkIHRpbWVwZXJmcmFtZSAlZC8lZCwgZmRlYyAlZFxuIiwKIAkJX19mdW5jX18sCiAJCXNwLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUsCkBAIC0xNzA3LDI0ICsxNzExLDEzIEBACiBzdGF0aWMgaW50IHMyMjU1X29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gdG9fczIyNTVfZGV2KHZkZXYtPnY0bDJfZGV2KTsKIAlzdHJ1Y3QgczIyNTVfZmggKmZoOwogCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCWludCBpID0gMDsKLQlpbnQgY3VyX2NoYW5uZWwgPSAtMTsKIAlpbnQgc3RhdGU7CiAJZHByaW50aygxLCAiczIyNTU6IG9wZW4gY2FsbGVkIChkZXY9JXMpXG4iLAogCQl2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykgewotCQlpZiAoJmRldi0+dmRldltpXSA9PSB2ZGV2KSB7Ci0JCQljdXJfY2hhbm5lbCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSBNQVhfQ0hBTk5FTFMpCi0JCXJldHVybiAtRU5PREVWOwotCiAJLyoKIAkgKiBvcGVuIGxvY2sgbmVjZXNzYXJ5IHRvIHByZXZlbnQgbXVsdGlwbGUgaW5zdGFuY2VzCiAJICogb2YgdjRsLWNvbmYgKG9yIG90aGVyIHByb2dyYW1zKSBmcm9tIHNpbXVsdGFuZW91c2x5CkBAIC0xODA2LDI0ICsxNzk5LDIwIEBACiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CiAJZmgtPmRldiA9IGRldjsKIAlmaC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlmaC0+bW9kZSA9IGRldi0+bW9kZVtjdXJfY2hhbm5lbF07Ci0JZmgtPmZtdCA9IGRldi0+Y3VyX2ZtdFtjdXJfY2hhbm5lbF07Ci0JLyogZGVmYXVsdCA0Q0lGIE5UU0MgKi8KLQlmaC0+d2lkdGggPSBMSU5FX1NaXzRDSUZTX05UU0M7Ci0JZmgtPmhlaWdodCA9IE5VTV9MSU5FU180Q0lGU19OVFNDICogMjsKLQlmaC0+Y2hhbm5lbCA9IGN1cl9jaGFubmVsOwotCS8qIGNvbmZpZ3VyZSBjaGFubmVsIHRvIGRlZmF1bHQgc3RhdGUgKi8KLQlpZiAoIWRldi0+Y2huX2NvbmZpZ3VyZWRbY3VyX2NoYW5uZWxdKSB7Ci0JCXMyMjU1X3NldF9tb2RlKGRldiwgY3VyX2NoYW5uZWwsICZmaC0+bW9kZSk7Ci0JCWRldi0+Y2huX2NvbmZpZ3VyZWRbY3VyX2NoYW5uZWxdID0gMTsKKwlmaC0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJaWYgKCFjaGFubmVsLT5jb25maWd1cmVkKSB7CisJCS8qIGNvbmZpZ3VyZSBjaGFubmVsIHRvIGRlZmF1bHQgc3RhdGUgKi8KKwkJY2hhbm5lbC0+Zm10ID0gJmZvcm1hdHNbMF07CisJCXMyMjU1X3NldF9tb2RlKGNoYW5uZWwsICZjaGFubmVsLT5tb2RlKTsKKwkJY2hhbm5lbC0+Y29uZmlndXJlZCA9IDE7CiAJfQogCWRwcmludGsoMSwgIiVzOiBkZXY9JXMgdHlwZT0lc1xuIiwgX19mdW5jX18sCiAJCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldiksIHY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CiAJZHByaW50aygyLCAiJXM6IGZoPTB4JTA4bHgsIGRldj0weCUwOGx4LCB2aWRxPTB4JTA4bHhcbiIsIF9fZnVuY19fLAogCQkodW5zaWduZWQgbG9uZylmaCwgKHVuc2lnbmVkIGxvbmcpZGV2LAotCQkodW5zaWduZWQgbG9uZykmZGV2LT52aWRxW2N1cl9jaGFubmVsXSk7CisJCSh1bnNpZ25lZCBsb25nKSZjaGFubmVsLT52aWRxKTsKIAlkcHJpbnRrKDQsICIlczogbGlzdF9lbXB0eSBhY3RpdmU9JWRcbiIsIF9fZnVuY19fLAotCQlsaXN0X2VtcHR5KCZkZXYtPnZpZHFbY3VyX2NoYW5uZWxdLmFjdGl2ZSkpOworCQlsaXN0X2VtcHR5KCZjaGFubmVsLT52aWRxLmFjdGl2ZSkpOwogCXZpZGVvYnVmX3F1ZXVlX3ZtYWxsb2NfaW5pdCgmZmgtPnZiX3ZpZHEsICZzMjI1NV92aWRlb19xb3BzLAogCQkJCSAgICBOVUxMLCAmZGV2LT5zbG9jaywKIAkJCQkgICAgZmgtPnR5cGUsCkBAIC0xODY1LDYgKzE4NTQsNyBAQAogCW11dGV4X2Rlc3Ryb3koJmRldi0+b3Blbl9sb2NrKTsKIAltdXRleF9kZXN0cm95KCZkZXYtPmxvY2spOwogCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CiAJZHByaW50aygxLCAiJXMiLCBfX2Z1bmNfXyk7CiAJa2ZyZWUoZGV2KTsKIH0KQEAgLTE4NzQsMTQgKzE4NjQsMTUgQEAKIAlzdHJ1Y3QgczIyNTVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IGZoLT5kZXY7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHMyMjU1X2NoYW5uZWwgKmNoYW5uZWwgPSBmaC0+Y2hhbm5lbDsKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAJLyogdHVybiBvZmYgc3RyZWFtICovCiAJaWYgKHJlc19jaGVjayhmaCkpIHsKLQkJaWYgKGRldi0+Yl9hY3F1aXJlW2ZoLT5jaGFubmVsXSkKLQkJCXMyMjU1X3N0b3BfYWNxdWlyZShkZXYsIGZoLT5jaGFubmVsKTsKKwkJaWYgKGNoYW5uZWwtPmJfYWNxdWlyZSkKKwkJCXMyMjU1X3N0b3BfYWNxdWlyZShmaC0+Y2hhbm5lbCk7CiAJCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZpZHEpOwotCQlyZXNfZnJlZShkZXYsIGZoKTsKKwkJcmVzX2ZyZWUoZmgpOwogCX0KIAl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52Yl92aWRxKTsKIAlkcHJpbnRrKDEsICIlcyAoZGV2PSVzKVxuIiwgX19mdW5jX18sIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOwpAQCAtMTk0NSw5ICsxOTM2LDEwIEBACiAKIHN0YXRpYyB2b2lkIHMyMjU1X3ZpZGVvX2RldmljZV9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7Ci0Jc3RydWN0IHMyMjU1X2RldiAqZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0JZHByaW50ayg0LCAiJXMsIGNobmxzOiAlZCBcbiIsIF9fZnVuY19fLCBhdG9taWNfcmVhZCgmZGV2LT5jaGFubmVscykpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPmNoYW5uZWxzKSkKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSB0b19zMjI1NV9kZXYodmRldi0+djRsMl9kZXYpOworCWRwcmludGsoNCwgIiVzLCBjaG5sczogJWQgXG4iLCBfX2Z1bmNfXywKKwkJYXRvbWljX3JlYWQoJmRldi0+bnVtX2NoYW5uZWxzKSk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+bnVtX2NoYW5uZWxzKSkKIAkJczIyNTVfZGVzdHJveShkZXYpOwogCXJldHVybjsKIH0KQEAgLTE5NjYsNDcgKzE5NTgsNDggQEAKIAlpbnQgcmV0OwogCWludCBpOwogCWludCBjdXJfbnIgPSB2aWRlb19ucjsKKwlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbDsKIAlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmZGV2LT5pbnRlcmZhY2UtPmRldiwgJmRldi0+djRsMl9kZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJLyogaW5pdGlhbGl6ZSBhbGwgdmlkZW8gNCBsaW51eCAqLwogCS8qIHJlZ2lzdGVyIDQgdmlkZW8gZGV2aWNlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxW2ldLmFjdGl2ZSk7Ci0JCWRldi0+dmlkcVtpXS5kZXYgPSBkZXY7Ci0JCWRldi0+dmlkcVtpXS5jaGFubmVsID0gaTsKKwkJY2hhbm5lbCA9ICZkZXYtPmNoYW5uZWxbaV07CisJCUlOSVRfTElTVF9IRUFEKCZjaGFubmVsLT52aWRxLmFjdGl2ZSk7CisJCWNoYW5uZWwtPnZpZHEuZGV2ID0gZGV2OwogCQkvKiByZWdpc3RlciA0IHZpZGVvIGRldmljZXMgKi8KLQkJbWVtY3B5KCZkZXYtPnZkZXZbaV0sICZ0ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpKTsKLQkJZGV2LT52ZGV2W2ldLnY0bDJfZGV2ID0gJmRldi0+djRsMl9kZXY7Ci0JCXZpZGVvX3NldF9kcnZkYXRhKCZkZXYtPnZkZXZbaV0sIGRldik7CisJCWNoYW5uZWwtPnZkZXYgPSB0ZW1wbGF0ZTsKKwkJY2hhbm5lbC0+dmRldi52NGwyX2RldiA9ICZkZXYtPnY0bDJfZGV2OworCQl2aWRlb19zZXRfZHJ2ZGF0YSgmY2hhbm5lbC0+dmRldiwgY2hhbm5lbCk7CiAJCWlmICh2aWRlb19uciA9PSAtMSkKLQkJCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmZGV2LT52ZGV2W2ldLAorCQkJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjaGFubmVsLT52ZGV2LAogCQkJCQkJICAgIFZGTF9UWVBFX0dSQUJCRVIsCiAJCQkJCQkgICAgdmlkZW9fbnIpOwogCQllbHNlCi0JCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmRldi0+dmRldltpXSwKKwkJCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmY2hhbm5lbC0+dmRldiwKIAkJCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLAogCQkJCQkJICAgIGN1cl9uciArIGkpOworCiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LAogCQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIVxuIik7CiAJCQlicmVhazsKIAkJfQotCQlhdG9taWNfaW5jKCZkZXYtPmNoYW5uZWxzKTsKKwkJYXRvbWljX2luYygmZGV2LT5udW1fY2hhbm5lbHMpOwogCQl2NGwyX2luZm8oJmRldi0+djRsMl9kZXYsICJWNEwyIGRldmljZSByZWdpc3RlcmVkIGFzICVzXG4iLAotCQkJICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKCZkZXYtPnZkZXZbaV0pKTsKKwkJCSAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSgmY2hhbm5lbC0+dmRldikpOwogCiAJfQotCiAJcHJpbnRrKEtFUk5fSU5GTyAiU2Vuc29yYXkgMjI1NSBWNEwgZHJpdmVyIFJldmlzaW9uOiAlZC4lZFxuIiwKIAkgICAgICAgUzIyNTVfTUFKT1JfVkVSU0lPTiwKIAkgICAgICAgUzIyNTVfTUlOT1JfVkVSU0lPTik7CiAJLyogaWYgbm8gY2hhbm5lbHMgcmVnaXN0ZXJlZCwgcmV0dXJuIGVycm9yIGFuZCBwcm9iZSB3aWxsIGZhaWwqLwotCWlmIChhdG9taWNfcmVhZCgmZGV2LT5jaGFubmVscykgPT0gMCkgeworCWlmIChhdG9taWNfcmVhZCgmZGV2LT5udW1fY2hhbm5lbHMpID09IDApIHsKIAkJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CiAJCXJldHVybiByZXQ7CiAJfQotCWlmIChhdG9taWNfcmVhZCgmZGV2LT5jaGFubmVscykgIT0gTUFYX0NIQU5ORUxTKQorCWlmIChhdG9taWNfcmVhZCgmZGV2LT5udW1fY2hhbm5lbHMpICE9IE1BWF9DSEFOTkVMUykKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiczIyNTU6IE5vdCBhbGwgY2hhbm5lbHMgYXZhaWxhYmxlLlxuIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMDMzLDEyICsyMDI2LDExIEBACiAJczMyIGlkeCA9IC0xOwogCXN0cnVjdCBzMjI1NV9mcmFtZWkgKmZybTsKIAl1bnNpZ25lZCBjaGFyICpwZGF0YTsKLQorCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsOwogCWRwcmludGsoMTAwLCAiYnVmZmVyIHRvIHVzZXJcbiIpOwotCi0JaWR4ID0gZGV2LT5jdXJfZnJhbWVbZGV2LT5jY107Ci0JZnJtID0gJmRldi0+YnVmZmVyW2Rldi0+Y2NdLmZyYW1lW2lkeF07Ci0KKwljaGFubmVsID0gJmRldi0+Y2hhbm5lbFtkZXYtPmNjXTsKKwlpZHggPSBjaGFubmVsLT5jdXJfZnJhbWU7CisJZnJtID0gJmNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtpZHhdOwogCWlmIChmcm0tPnVsU3RhdGUgPT0gUzIyNTVfUkVBRF9JRExFKSB7CiAJCWludCBqajsKIAkJdW5zaWduZWQgaW50IGNjOwpAQCAtMjA2MywxNiArMjA1NSwxOCBAQAogCQkJCX0KIAkJCQkvKiByZXZlcnNlIGl0ICovCiAJCQkJZGV2LT5jYyA9IEdfY2hubWFwW2NjXTsKKwkJCQljaGFubmVsID0gJmRldi0+Y2hhbm5lbFtkZXYtPmNjXTsKIAkJCQlwYXlsb2FkID0gIHBkd29yZFszXTsKLQkJCQlpZiAocGF5bG9hZCA+IGRldi0+cmVxX2ltYWdlX3NpemVbZGV2LT5jY10pIHsKLQkJCQkJZGV2LT5iYWRfcGF5bG9hZFtkZXYtPmNjXSsrOworCQkJCWlmIChwYXlsb2FkID4gY2hhbm5lbC0+cmVxX2ltYWdlX3NpemUpIHsKKwkJCQkJY2hhbm5lbC0+YmFkX3BheWxvYWQrKzsKIAkJCQkJLyogZGlzY2FyZCB0aGUgYmFkIGZyYW1lICovCiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0KLQkJCQlkZXYtPnBrdF9zaXplW2Rldi0+Y2NdID0gcGF5bG9hZDsKLQkJCQlkZXYtPmpwZ19zaXplW2Rldi0+Y2NdID0gcGR3b3JkWzRdOworCQkJCWNoYW5uZWwtPnBrdF9zaXplID0gcGF5bG9hZDsKKwkJCQljaGFubmVsLT5qcGdfc2l6ZSA9IHBkd29yZFs0XTsKIAkJCQlicmVhazsKIAkJCWNhc2UgUzIyNTVfTUFSS0VSX1JFU1BPTlNFOgorCiAJCQkJcGRhdGEgKz0gREVGX1VTQl9CTE9DSzsKIAkJCQlqaiArPSBERUZfVVNCX0JMT0NLOwogCQkJCWlmIChwZHdvcmRbMV0gPj0gTUFYX0NIQU5ORUxTKQpAQCAtMjA4MCwxMiArMjA3NCwxMyBAQAogCQkJCWNjID0gR19jaG5tYXBbcGR3b3JkWzFdXTsKIAkJCQlpZiAoY2MgPj0gTUFYX0NIQU5ORUxTKQogCQkJCQlicmVhazsKKwkJCQljaGFubmVsID0gJmRldi0+Y2hhbm5lbFtjY107CiAJCQkJc3dpdGNoIChwZHdvcmRbMl0pIHsKIAkJCQljYXNlIFMyMjU1X1JFU1BPTlNFX1NFVE1PREU6CiAJCQkJCS8qIGNoZWNrIGlmIGNoYW5uZWwgdmFsaWQgKi8KIAkJCQkJLyogc2V0IG1vZGUgcmVhZHkgKi8KLQkJCQkJZGV2LT5zZXRtb2RlX3JlYWR5W2NjXSA9IDE7Ci0JCQkJCXdha2VfdXAoJmRldi0+d2FpdF9zZXRtb2RlW2NjXSk7CisJCQkJCWNoYW5uZWwtPnNldG1vZGVfcmVhZHkgPSAxOworCQkJCQl3YWtlX3VwKCZjaGFubmVsLT53YWl0X3NldG1vZGUpOwogCQkJCQlkcHJpbnRrKDUsICJzZXRtb2RlIHJlYWR5ICVkXG4iLCBjYyk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgUzIyNTVfUkVTUE9OU0VfRlc6CkBAIC0yMDk5LDkgKzIwOTQsOSBAQAogCQkJCQl3YWtlX3VwKCZkZXYtPmZ3X2RhdGEtPndhaXRfZncpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFMyMjU1X1JFU1BPTlNFX1NUQVRVUzoKLQkJCQkJZGV2LT52aWRzdGF0dXNbY2NdID0gcGR3b3JkWzNdOwotCQkJCQlkZXYtPnZpZHN0YXR1c19yZWFkeVtjY10gPSAxOwotCQkJCQl3YWtlX3VwKCZkZXYtPndhaXRfdmlkc3RhdHVzW2NjXSk7CisJCQkJCWNoYW5uZWwtPnZpZHN0YXR1cyA9IHBkd29yZFszXTsKKwkJCQkJY2hhbm5lbC0+dmlkc3RhdHVzX3JlYWR5ID0gMTsKKwkJCQkJd2FrZV91cCgmY2hhbm5lbC0+d2FpdF92aWRzdGF0dXMpOwogCQkJCQlkcHJpbnRrKDUsICJnb3Qgdmlkc3RhdHVzICV4IGNoYW4gJWRcbiIsCiAJCQkJCQlwZHdvcmRbM10sIGNjKTsKIAkJCQkJYnJlYWs7CkBAIC0yMTE4LDEzICsyMTEzLDExIEBACiAJCWlmICghYmZyYW1lKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0KLQlpZHggPSBkZXYtPmN1cl9mcmFtZVtkZXYtPmNjXTsKLQlmcm0gPSAmZGV2LT5idWZmZXJbZGV2LT5jY10uZnJhbWVbaWR4XTsKLQorCWNoYW5uZWwgPSAmZGV2LT5jaGFubmVsW2Rldi0+Y2NdOworCWlkeCA9IGNoYW5uZWwtPmN1cl9mcmFtZTsKKwlmcm0gPSAmY2hhbm5lbC0+YnVmZmVyLmZyYW1lW2lkeF07CiAJLyogc2VhcmNoIGRvbmUuICBub3cgZmluZCBvdXQgaWYgc2hvdWxkIGJlIGFjcXVpcmluZyBvbiB0aGlzIGNoYW5uZWwgKi8KLQlpZiAoIWRldi0+Yl9hY3F1aXJlW2Rldi0+Y2NdKSB7CisJaWYgKCFjaGFubmVsLT5iX2FjcXVpcmUpIHsKIAkJLyogd2UgZm91bmQgYSBmcmFtZSwgYnV0IHRoaXMgY2hhbm5lbCBpcyB0dXJuZWQgb2ZmICovCiAJCWZybS0+dWxTdGF0ZSA9IFMyMjU1X1JFQURfSURMRTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTQ5LDMwICsyMTQyLDI4IEBACiAKIAljb3B5X3NpemUgPSAocGlwZV9pbmZvLT5jdXJfdHJhbnNmZXJfc2l6ZSAtIG9mZnNldCk7CiAKLQlzaXplID0gZGV2LT5wa3Rfc2l6ZVtkZXYtPmNjXSAtIFBSRUZJWF9TSVpFOworCXNpemUgPSBjaGFubmVsLT5wa3Rfc2l6ZSAtIFBSRUZJWF9TSVpFOwogCiAJLyogc2FuaXR5IGNoZWNrIG9uIHBkZXN0ICovCi0JaWYgKChjb3B5X3NpemUgKyBmcm0tPmN1cl9zaXplKSA8IGRldi0+cmVxX2ltYWdlX3NpemVbZGV2LT5jY10pCisJaWYgKChjb3B5X3NpemUgKyBmcm0tPmN1cl9zaXplKSA8IGNoYW5uZWwtPnJlcV9pbWFnZV9zaXplKQogCQltZW1jcHkocGRlc3QsIHBzcmMsIGNvcHlfc2l6ZSk7CiAKIAlmcm0tPmN1cl9zaXplICs9IGNvcHlfc2l6ZTsKIAlkcHJpbnRrKDQsICJjdXJfc2l6ZSBzaXplICVsdSBzaXplICVsdSBcbiIsIGZybS0+Y3VyX3NpemUsIHNpemUpOwogCiAJaWYgKGZybS0+Y3VyX3NpemUgPj0gc2l6ZSkgewotCi0JCXUzMiBjYyA9IGRldi0+Y2M7CiAJCWRwcmludGsoMiwgIioqKioqKioqKioqKioqKipbJWRdQnVmZmVyWyVkXWZ1bGwqKioqKioqKioqKioqXG4iLAotCQkJY2MsIGlkeCk7Ci0JCWRldi0+bGFzdF9mcmFtZVtjY10gPSBkZXYtPmN1cl9mcmFtZVtjY107Ci0JCWRldi0+Y3VyX2ZyYW1lW2NjXSsrOworCQkJZGV2LT5jYywgaWR4KTsKKwkJY2hhbm5lbC0+bGFzdF9mcmFtZSA9IGNoYW5uZWwtPmN1cl9mcmFtZTsKKwkJY2hhbm5lbC0+Y3VyX2ZyYW1lKys7CiAJCS8qIGVuZCBvZiBzeXN0ZW0gZnJhbWUgcmluZyBidWZmZXIsIHN0YXJ0IGF0IHplcm8gKi8KLQkJaWYgKChkZXYtPmN1cl9mcmFtZVtjY10gPT0gU1lTX0ZSQU1FUykgfHwKLQkJICAgIChkZXYtPmN1cl9mcmFtZVtjY10gPT0gZGV2LT5idWZmZXJbY2NdLmR3RnJhbWVzKSkKLQkJCWRldi0+Y3VyX2ZyYW1lW2NjXSA9IDA7CisJCWlmICgoY2hhbm5lbC0+Y3VyX2ZyYW1lID09IFNZU19GUkFNRVMpIHx8CisJCSAgICAoY2hhbm5lbC0+Y3VyX2ZyYW1lID09IGNoYW5uZWwtPmJ1ZmZlci5kd0ZyYW1lcykpCisJCQljaGFubmVsLT5jdXJfZnJhbWUgPSAwOwogCQkvKiBmcmFtZSByZWFkeSAqLwotCQlpZiAoZGV2LT5iX2FjcXVpcmVbY2NdKQotCQkJczIyNTVfZ290X2ZyYW1lKGRldiwgY2MsIGRldi0+anBnX3NpemVbY2NdKTsKLQkJZGV2LT5mcmFtZV9jb3VudFtjY10rKzsKKwkJaWYgKGNoYW5uZWwtPmJfYWNxdWlyZSkKKwkJCXMyMjU1X2dvdF9mcmFtZShjaGFubmVsLCBjaGFubmVsLT5qcGdfc2l6ZSk7CisJCWNoYW5uZWwtPmZyYW1lX2NvdW50Kys7CiAJCWZybS0+dWxTdGF0ZSA9IFMyMjU1X1JFQURfSURMRTsKIAkJZnJtLT5jdXJfc2l6ZSA9IDA7CiAKQEAgLTIyNDUsMTYgKzIyMzYsMTIgQEAKICAqIENyZWF0ZSB0aGUgc3lzdGVtIHJpbmcgYnVmZmVyIHRvIGNvcHkgZnJhbWVzIGludG8gZnJvbSB0aGUKICAqIHVzYiByZWFkIHBpcGUuCiAgKi8KLXN0YXRpYyBpbnQgczIyNTVfY3JlYXRlX3N5c19idWZmZXJzKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBjaG4pCitzdGF0aWMgaW50IHMyMjU1X2NyZWF0ZV9zeXNfYnVmZmVycyhzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyByZXFzaXplOwogCWRwcmludGsoMSwgImNyZWF0ZSBzeXMgYnVmZmVyc1xuIik7Ci0JaWYgKGNobiA+PSBNQVhfQ0hBTk5FTFMpCi0JCXJldHVybiAtMTsKLQotCWRldi0+YnVmZmVyW2Nobl0uZHdGcmFtZXMgPSBTWVNfRlJBTUVTOwotCisJY2hhbm5lbC0+YnVmZmVyLmR3RnJhbWVzID0gU1lTX0ZSQU1FUzsKIAkvKiBhbHdheXMgYWxsb2NhdGUgbWF4aW11bSBzaXplKFBBTCkgZm9yIHN5c3RlbSBidWZmZXJzICovCiAJcmVxc2l6ZSA9IFNZU19GUkFNRVNfTUFYU0laRTsKIApAQCAtMjI2Myw0MiArMjI1MCw0MCBAQAogCiAJZm9yIChpID0gMDsgaSA8IFNZU19GUkFNRVM7IGkrKykgewogCQkvKiBhbGxvY2F0ZSB0aGUgZnJhbWVzICovCi0JCWRldi0+YnVmZmVyW2Nobl0uZnJhbWVbaV0ubHB2Yml0cyA9IHZtYWxsb2MocmVxc2l6ZSk7Ci0KLQkJZHByaW50aygxLCAidmFsbG9jICVwIGNoYW4gJWx1LCBpZHggJWx1LCBwZGF0YSAlcFxuIiwKLQkJCSZkZXYtPmJ1ZmZlcltjaG5dLmZyYW1lW2ldLCBjaG4sIGksCi0JCQlkZXYtPmJ1ZmZlcltjaG5dLmZyYW1lW2ldLmxwdmJpdHMpOwotCQlkZXYtPmJ1ZmZlcltjaG5dLmZyYW1lW2ldLnNpemUgPSByZXFzaXplOwotCQlpZiAoZGV2LT5idWZmZXJbY2huXS5mcmFtZVtpXS5scHZiaXRzID09IE5VTEwpIHsKKwkJY2hhbm5lbC0+YnVmZmVyLmZyYW1lW2ldLmxwdmJpdHMgPSB2bWFsbG9jKHJlcXNpemUpOworCQlkcHJpbnRrKDEsICJ2YWxsb2MgJXAgY2hhbiAlZCwgaWR4ICVsdSwgcGRhdGEgJXBcbiIsCisJCQkmY2hhbm5lbC0+YnVmZmVyLmZyYW1lW2ldLCBjaGFubmVsLT5pZHgsIGksCisJCQljaGFubmVsLT5idWZmZXIuZnJhbWVbaV0ubHB2Yml0cyk7CisJCWNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtpXS5zaXplID0gcmVxc2l6ZTsKKwkJaWYgKGNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtpXS5scHZiaXRzID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIm91dCBvZiBtZW1vcnkuICB1c2luZyBsZXNzIGZyYW1lc1xuIik7Ci0JCQlkZXYtPmJ1ZmZlcltjaG5dLmR3RnJhbWVzID0gaTsKKwkJCWNoYW5uZWwtPmJ1ZmZlci5kd0ZyYW1lcyA9IGk7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCS8qIG1ha2Ugc3VyZSBpbnRlcm5hbCBzdGF0ZXMgYXJlIHNldCAqLwogCWZvciAoaSA9IDA7IGkgPCBTWVNfRlJBTUVTOyBpKyspIHsKLQkJZGV2LT5idWZmZXJbY2huXS5mcmFtZVtpXS51bFN0YXRlID0gMDsKLQkJZGV2LT5idWZmZXJbY2huXS5mcmFtZVtpXS5jdXJfc2l6ZSA9IDA7CisJCWNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtpXS51bFN0YXRlID0gMDsKKwkJY2hhbm5lbC0+YnVmZmVyLmZyYW1lW2ldLmN1cl9zaXplID0gMDsKIAl9CiAKLQlkZXYtPmN1cl9mcmFtZVtjaG5dID0gMDsKLQlkZXYtPmxhc3RfZnJhbWVbY2huXSA9IC0xOworCWNoYW5uZWwtPmN1cl9mcmFtZSA9IDA7CisJY2hhbm5lbC0+bGFzdF9mcmFtZSA9IC0xOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHMyMjU1X3JlbGVhc2Vfc3lzX2J1ZmZlcnMoc3RydWN0IHMyMjU1X2RldiAqZGV2LAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBjaGFubmVsKQorc3RhdGljIGludCBzMjI1NV9yZWxlYXNlX3N5c19idWZmZXJzKHN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIAlkcHJpbnRrKDEsICJyZWxlYXNlIHN5cyBidWZmZXJzXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgU1lTX0ZSQU1FUzsgaSsrKSB7Ci0JCWlmIChkZXYtPmJ1ZmZlcltjaGFubmVsXS5mcmFtZVtpXS5scHZiaXRzKSB7CisJCWlmIChjaGFubmVsLT5idWZmZXIuZnJhbWVbaV0ubHB2Yml0cykgewogCQkJZHByaW50aygxLCAidmZyZWUgJXBcbiIsCi0JCQkJZGV2LT5idWZmZXJbY2hhbm5lbF0uZnJhbWVbaV0ubHB2Yml0cyk7Ci0JCQl2ZnJlZShkZXYtPmJ1ZmZlcltjaGFubmVsXS5mcmFtZVtpXS5scHZiaXRzKTsKKwkJCQljaGFubmVsLT5idWZmZXIuZnJhbWVbaV0ubHB2Yml0cyk7CisJCQl2ZnJlZShjaGFubmVsLT5idWZmZXIuZnJhbWVbaV0ubHB2Yml0cyk7CiAJCX0KLQkJZGV2LT5idWZmZXJbY2hhbm5lbF0uZnJhbWVbaV0ubHB2Yml0cyA9IE5VTEw7CisJCWNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtpXS5scHZiaXRzID0gTlVMTDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzM1LDE3ICsyMzIwLDIwIEBACiAJCQlmd192ZXIgJiAweGZmKTsKIAogCWZvciAoaiA9IDA7IGogPCBNQVhfQ0hBTk5FTFM7IGorKykgewotCQlkZXYtPmJfYWNxdWlyZVtqXSA9IDA7Ci0JCWRldi0+bW9kZVtqXSA9IG1vZGVfZGVmOworCQlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9ICZkZXYtPmNoYW5uZWxbal07CisJCWNoYW5uZWwtPmJfYWNxdWlyZSA9IDA7CisJCWNoYW5uZWwtPm1vZGUgPSBtb2RlX2RlZjsKIAkJaWYgKGRldi0+cGlkID09IDB4MjI1NyAmJiBqID4gMSkKLQkJCWRldi0+bW9kZVtqXS5jb2xvciB8PSAoMSA8PCAxNik7Ci0JCWRldi0+amNbal0ucXVhbGl0eSA9IFMyMjU1X0RFRl9KUEVHX1FVQUw7Ci0JCWRldi0+Y3VyX2ZtdFtqXSA9ICZmb3JtYXRzWzBdOwotCQlkZXYtPm1vZGVbal0ucmVzdGFydCA9IDE7Ci0JCWRldi0+cmVxX2ltYWdlX3NpemVbal0gPSBnZXRfdHJhbnNmZXJfc2l6ZSgmbW9kZV9kZWYpOwotCQlkZXYtPmZyYW1lX2NvdW50W2pdID0gMDsKKwkJCWNoYW5uZWwtPm1vZGUuY29sb3IgfD0gKDEgPDwgMTYpOworCQljaGFubmVsLT5qYy5xdWFsaXR5ID0gUzIyNTVfREVGX0pQRUdfUVVBTDsKKwkJY2hhbm5lbC0+d2lkdGggPSBMSU5FX1NaXzRDSUZTX05UU0M7CisJCWNoYW5uZWwtPmhlaWdodCA9IE5VTV9MSU5FU180Q0lGU19OVFNDICogMjsKKwkJY2hhbm5lbC0+Zm10ID0gJmZvcm1hdHNbMF07CisJCWNoYW5uZWwtPm1vZGUucmVzdGFydCA9IDE7CisJCWNoYW5uZWwtPnJlcV9pbWFnZV9zaXplID0gZ2V0X3RyYW5zZmVyX3NpemUoJm1vZGVfZGVmKTsKKwkJY2hhbm5lbC0+ZnJhbWVfY291bnQgPSAwOwogCQkvKiBjcmVhdGUgdGhlIHN5c3RlbSBidWZmZXJzICovCi0JCXMyMjU1X2NyZWF0ZV9zeXNfYnVmZmVycyhkZXYsIGopOworCQlzMjI1NV9jcmVhdGVfc3lzX2J1ZmZlcnMoY2hhbm5lbCk7CiAJfQogCS8qIHN0YXJ0IHJlYWQgcGlwZSAqLwogCXMyMjU1X3N0YXJ0X3JlYWRwaXBlKGRldik7CkBAIC0yMzU5LDE0ICsyMzQ3LDEyIEBACiAJZHByaW50aygxLCAiJXM6IGRldjogJXAiLCBfX2Z1bmNfXywgIGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspIHsKLQkJaWYgKGRldi0+Yl9hY3F1aXJlW2ldKQotCQkJczIyNTVfc3RvcF9hY3F1aXJlKGRldiwgaSk7CisJCWlmIChkZXYtPmNoYW5uZWxbaV0uYl9hY3F1aXJlKQorCQkJczIyNTVfc3RvcF9hY3F1aXJlKCZkZXYtPmNoYW5uZWxbaV0pOwogCX0KLQogCXMyMjU1X3N0b3BfcmVhZHBpcGUoZGV2KTsKLQogCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykKLQkJczIyNTVfcmVsZWFzZV9zeXNfYnVmZmVycyhkZXYsIGkpOworCQlzMjI1NV9yZWxlYXNlX3N5c19idWZmZXJzKCZkZXYtPmNoYW5uZWxbaV0pOwogCS8qIHJlbGVhc2UgdHJhbnNmZXIgYnVmZmVyICovCiAJa2ZyZWUoZGV2LT5waXBlLnRyYW5zZmVyX2J1ZmZlcik7CiAJcmV0dXJuIDA7CkBAIC0yNDU5LDI5ICsyNDQ1LDI2IEBACiB9CiAKIC8qIHN0YXJ0cyBhY3F1aXNpdGlvbiBwcm9jZXNzICovCi1zdGF0aWMgaW50IHMyMjU1X3N0YXJ0X2FjcXVpcmUoc3RydWN0IHMyMjU1X2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIGNobikKK3N0YXRpYyBpbnQgczIyNTVfc3RhcnRfYWNxdWlyZShzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJaW50IHJlczsKIAl1bnNpZ25lZCBsb25nIGNobl9yZXY7CiAJaW50IGo7Ci0JaWYgKGNobiA+PSBNQVhfQ0hBTk5FTFMpIHsKLQkJZHByaW50aygyLCAic3RhcnQgYWNxdWlyZSBmYWlsZWQsIGJhZCBjaGFubmVsICVsdVxuIiwgY2huKTsKLQkJcmV0dXJuIC0xOwotCX0KLQljaG5fcmV2ID0gR19jaG5tYXBbY2huXTsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSB0b19zMjI1NV9kZXYoY2hhbm5lbC0+dmRldi52NGwyX2Rldik7CisJY2huX3JldiA9IEdfY2hubWFwW2NoYW5uZWwtPmlkeF07CiAJYnVmZmVyID0ga3phbGxvYyg1MTIsIEdGUF9LRVJORUwpOwogCWlmIChidWZmZXIgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwgIm91dCBvZiBtZW1cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkZXYtPmxhc3RfZnJhbWVbY2huXSA9IC0xOwotCWRldi0+YmFkX3BheWxvYWRbY2huXSA9IDA7Ci0JZGV2LT5jdXJfZnJhbWVbY2huXSA9IDA7CisJY2hhbm5lbC0+bGFzdF9mcmFtZSA9IC0xOworCWNoYW5uZWwtPmJhZF9wYXlsb2FkID0gMDsKKwljaGFubmVsLT5jdXJfZnJhbWUgPSAwOwogCWZvciAoaiA9IDA7IGogPCBTWVNfRlJBTUVTOyBqKyspIHsKLQkJZGV2LT5idWZmZXJbY2huXS5mcmFtZVtqXS51bFN0YXRlID0gMDsKLQkJZGV2LT5idWZmZXJbY2huXS5mcmFtZVtqXS5jdXJfc2l6ZSA9IDA7CisJCWNoYW5uZWwtPmJ1ZmZlci5mcmFtZVtqXS51bFN0YXRlID0gMDsKKwkJY2hhbm5lbC0+YnVmZmVyLmZyYW1lW2pdLmN1cl9zaXplID0gMDsKIAl9CiAKIAkvKiBzZW5kIHRoZSBzdGFydCBjb21tYW5kICovCkBAIC0yNDkyLDIxICsyNDc1LDE4IEBACiAJaWYgKHJlcyAhPSAwKQogCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwgIkNNRF9TVEFSVCBlcnJvclxuIik7CiAKLQlkcHJpbnRrKDIsICJzdGFydCBhY3F1aXJlIGV4aXRbJWx1XSAlZCBcbiIsIGNobiwgcmVzKTsKKwlkcHJpbnRrKDIsICJzdGFydCBhY3F1aXJlIGV4aXRbJWRdICVkIFxuIiwgY2hhbm5lbC0+aWR4LCByZXMpOwogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczIyNTVfc3RvcF9hY3F1aXJlKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBjaG4pCitzdGF0aWMgaW50IHMyMjU1X3N0b3BfYWNxdWlyZShzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJaW50IHJlczsKIAl1bnNpZ25lZCBsb25nIGNobl9yZXY7Ci0JaWYgKGNobiA+PSBNQVhfQ0hBTk5FTFMpIHsKLQkJZHByaW50aygyLCAic3RvcCBhY3F1aXJlIGZhaWxlZCwgYmFkIGNoYW5uZWwgJWx1XG4iLCBjaG4pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWNobl9yZXYgPSBHX2Nobm1hcFtjaG5dOworCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IHRvX3MyMjU1X2RldihjaGFubmVsLT52ZGV2LnY0bDJfZGV2KTsKKwljaG5fcmV2ID0gR19jaG5tYXBbY2hhbm5lbC0+aWR4XTsKIAlidWZmZXIgPSBremFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbVxuIik7CkBAIC0yNTIwLDggKzI1MDAsOCBAQAogCWlmIChyZXMgIT0gMCkKIAkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJDTURfU1RPUCBlcnJvclxuIik7CiAJa2ZyZWUoYnVmZmVyKTsKLQlkZXYtPmJfYWNxdWlyZVtjaG5dID0gMDsKLQlkcHJpbnRrKDQsICIlczogY2huICVsdSwgcmVzICVkXG4iLCBfX2Z1bmNfXywgY2huLCByZXMpOworCWNoYW5uZWwtPmJfYWNxdWlyZSA9IDA7CisJZHByaW50ayg0LCAiJXM6IGNobiAlZCwgcmVzICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbC0+aWR4LCByZXMpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTI1NzUsNyArMjU1NSw3IEBACiAJCXMyMjU1X2Rldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlhdG9taWNfc2V0KCZkZXYtPmNoYW5uZWxzLCAwKTsKKwlhdG9taWNfc2V0KCZkZXYtPm51bV9jaGFubmVscywgMCk7CiAJZGV2LT5waWQgPSBpZC0+aWRQcm9kdWN0OwogCWRldi0+ZndfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzMjI1NV9mdyksIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT5md19kYXRhKQpAQCAtMjYxMiw4ICsyNTkyLDEwIEBACiAJZGV2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2LT5md19kYXRhOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+ZndfZGF0YS0+d2FpdF9mdyk7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgaSsrKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d2FpdF9zZXRtb2RlW2ldKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53YWl0X3ZpZHN0YXR1c1tpXSk7CisJCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsID0gJmRldi0+Y2hhbm5lbFtpXTsKKwkJZGV2LT5jaGFubmVsW2ldLmlkeCA9IGk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoYW5uZWwtPndhaXRfc2V0bW9kZSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoYW5uZWwtPndhaXRfdmlkc3RhdHVzKTsKIAl9CiAKIAlkZXYtPmZ3X2RhdGEtPmZ3X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CkBAIC0yNjUxLDcgKzI2MzMsNyBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTU6IGYyMjU1dXNiLmJpbiBvdXQgb2YgZGF0ZS5cbiIpOwogCQlpZiAoZGV2LT5waWQgPT0gMHgyMjU3ICYmICpwUmVsIDwgUzIyNTVfTUlOX0RTUF9DT0xPUkZJTFRFUikKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInMyMjU1OiAyMjU3IHJlcXVpcmVzIGZpcm13YXJlICVkIgotCQkJICAgICAgICJvciBhYm92ZS5cbiIsIFMyMjU1X01JTl9EU1BfQ09MT1JGSUxURVIpOworCQkJICAgICAgICIgb3IgYWJvdmUuXG4iLCBTMjI1NV9NSU5fRFNQX0NPTE9SRklMVEVSKTsKIAl9CiAJdXNiX3Jlc2V0X2RldmljZShkZXYtPnVkZXYpOwogCS8qIGxvYWQgMjI1NSBib2FyZCBzcGVjaWZpYyAqLwpAQCAtMjY5MywyNSArMjY3NSwyMyBAQAogewogCXN0cnVjdCBzMjI1NV9kZXYgKmRldiA9IHRvX3MyMjU1X2Rldih1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSkpOwogCWludCBpOwotCWludCBjaGFubmVscyA9IGF0b21pY19yZWFkKCZkZXYtPmNoYW5uZWxzKTsKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKKwlpbnQgY2hhbm5lbHMgPSBhdG9taWNfcmVhZCgmZGV2LT5udW1fY2hhbm5lbHMpOworCXY0bDJfZGV2aWNlX2Rpc2Nvbm5lY3QoJmRldi0+djRsMl9kZXYpOwogCS8qc2VlIGNvbW1lbnRzIGluIHRoZSB1dmNfZHJpdmVyLmMgdXNiIGRpc2Nvbm5lY3QgZnVuY3Rpb24gKi8KLQlhdG9taWNfaW5jKCZkZXYtPmNoYW5uZWxzKTsKKwlhdG9taWNfaW5jKCZkZXYtPm51bV9jaGFubmVscyk7CiAJLyogdW5yZWdpc3RlciBlYWNoIHZpZGVvIGRldmljZS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgewotCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZCgmZGV2LT52ZGV2W2ldKSkKLQkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZkZXYtPnZkZXZbaV0pOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmRldi0+Y2hhbm5lbFtpXS52ZGV2KTsKIAkvKiB3YWtlIHVwIGFueSBvZiBvdXIgdGltZXJzICovCiAJYXRvbWljX3NldCgmZGV2LT5md19kYXRhLT5md19zdGF0ZSwgUzIyNTVfRldfRElTQ09OTkVDVElORyk7CiAJd2FrZV91cCgmZGV2LT5md19kYXRhLT53YWl0X2Z3KTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspIHsKLQkJZGV2LT5zZXRtb2RlX3JlYWR5W2ldID0gMTsKLQkJd2FrZV91cCgmZGV2LT53YWl0X3NldG1vZGVbaV0pOwotCQlkZXYtPnZpZHN0YXR1c19yZWFkeVtpXSA9IDE7Ci0JCXdha2VfdXAoJmRldi0+d2FpdF92aWRzdGF0dXNbaV0pOworCQlkZXYtPmNoYW5uZWxbaV0uc2V0bW9kZV9yZWFkeSA9IDE7CisJCXdha2VfdXAoJmRldi0+Y2hhbm5lbFtpXS53YWl0X3NldG1vZGUpOworCQlkZXYtPmNoYW5uZWxbaV0udmlkc3RhdHVzX3JlYWR5ID0gMTsKKwkJd2FrZV91cCgmZGV2LT5jaGFubmVsW2ldLndhaXRfdmlkc3RhdHVzKTsKIAl9Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+Y2hhbm5lbHMpKQorCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPm51bV9jaGFubmVscykpCiAJCXMyMjU1X2Rlc3Ryb3koZGV2KTsKIAlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCmluZGV4IGQzYmQ4MmEuLjEwNDYwZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogCS8qIHJlbGVhc2UgdGhlIG9sZCBidWZmZXIgKi8KIAlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgewogCQlzYWE3MTM0X3BndGFibGVfZnJlZShkZXYtPnBjaSwgJmRldi0+ZG1hc291bmQucHQpOwotCQl2aWRlb2J1Zl9zZ19kbWFfdW5tYXAoJmRldi0+cGNpLT5kZXYsICZkZXYtPmRtYXNvdW5kLmRtYSk7CisJCXZpZGVvYnVmX2RtYV91bm1hcCgmZGV2LT5wY2ktPmRldiwgJmRldi0+ZG1hc291bmQuZG1hKTsKIAkJZHNwX2J1ZmZlcl9mcmVlKGRldik7CiAJCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBOVUxMOwogCX0KQEAgLTY0NiwxMiArNjQ2LDEyIEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKDAgIT0gKGVyciA9IHZpZGVvYnVmX3NnX2RtYV9tYXAoJmRldi0+cGNpLT5kZXYsICZkZXYtPmRtYXNvdW5kLmRtYSkpKSB7CisJaWYgKDAgIT0gKGVyciA9IHZpZGVvYnVmX2RtYV9tYXAoJmRldi0+cGNpLT5kZXYsICZkZXYtPmRtYXNvdW5kLmRtYSkpKSB7CiAJCWRzcF9idWZmZXJfZnJlZShkZXYpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoMCAhPSAoZXJyID0gc2FhNzEzNF9wZ3RhYmxlX2FsbG9jKGRldi0+cGNpLCZkZXYtPmRtYXNvdW5kLnB0KSkpIHsKLQkJdmlkZW9idWZfc2dfZG1hX3VubWFwKCZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5kbWFzb3VuZC5kbWEpOworCQl2aWRlb2J1Zl9kbWFfdW5tYXAoJmRldi0+cGNpLT5kZXYsICZkZXYtPmRtYXNvdW5kLmRtYSk7CiAJCWRzcF9idWZmZXJfZnJlZShkZXYpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTY2MCw3ICs2NjAsNyBAQAogCQkJCQkJZGV2LT5kbWFzb3VuZC5kbWEuc2dsZW4sCiAJCQkJCQkwKSkpIHsKIAkJc2FhNzEzNF9wZ3RhYmxlX2ZyZWUoZGV2LT5wY2ksICZkZXYtPmRtYXNvdW5kLnB0KTsKLQkJdmlkZW9idWZfc2dfZG1hX3VubWFwKCZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5kbWFzb3VuZC5kbWEpOworCQl2aWRlb2J1Zl9kbWFfdW5tYXAoJmRldi0+cGNpLT5kZXYsICZkZXYtPmRtYXNvdW5kLmRtYSk7CiAJCWRzcF9idWZmZXJfZnJlZShkZXYpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTY2OSw3ICs2NjksNyBAQAogCSAgIGJ5dGUsIGJ1dCBpdCBkb2Vzbid0IHdvcmsuIFNvIEkgYWxsb2NhdGUgdGhlIERNQSB1c2luZyB0aGUKIAkgICBWNEwgZnVuY3Rpb25zLCBhbmQgZm9yY2UgQUxTQSB0byB1c2UgdGhhdCBhcyB0aGUgRE1BIGFyZWEgKi8KIAotCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBkZXYtPmRtYXNvdW5kLmRtYS52bWFsbG9jOworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBkZXYtPmRtYXNvdW5kLmRtYS52YWRkcjsKIAlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA9IGRldi0+ZG1hc291bmQuYnVmc2l6ZTsKIAlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKIApAQCAtNjk2LDcgKzY5Niw3IEBACiAKIAlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgewogCQlzYWE3MTM0X3BndGFibGVfZnJlZShkZXYtPnBjaSwgJmRldi0+ZG1hc291bmQucHQpOwotCQl2aWRlb2J1Zl9zZ19kbWFfdW5tYXAoJmRldi0+cGNpLT5kZXYsICZkZXYtPmRtYXNvdW5kLmRtYSk7CisJCXZpZGVvYnVmX2RtYV91bm1hcCgmZGV2LT5wY2ktPmRldiwgJmRldi0+ZG1hc291bmQuZG1hKTsKIAkJZHNwX2J1ZmZlcl9mcmVlKGRldik7CiAJCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBOVUxMOwogCX0KQEAgLTEwODAsNyArMTA4MCw3IEBACiAJLyogQ2FyZCAiY3JlYXRpb24iICovCiAKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfc2FhNzEzNF9mcmVlOwotCWNoaXAgPSAoc25kX2NhcmRfc2FhNzEzNF90ICopIGNhcmQtPnByaXZhdGVfZGF0YTsKKwljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZjaGlwLT5taXhlcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IDA3ZjZiYjguLmVjNjk3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtNTQ2Miw2ICs1NDYyLDMwIEBACiAJCQkuYW11eCA9IFRWLAogCQl9LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfVEVDSE5PVFJFTkRfQlVER0VUX1QzMDAwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRlY2hvVHJlbmQgVFQtYnVkZ2V0IFQtMzAwMCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVEQxMzE2LAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIgICAgID0gMHg2MywKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19QT1JUMV9BQ1RJVkUsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSB9LAorCX0sCiAKIH07CiAKQEAgLTY2MzEsNiArNjY1NSwxMiBAQAogCQkuc3ViZGV2aWNlICAgID0gMHg2NjU1LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfRFRWMTAwMFMsCiAJfSwgeworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEzYzIsCisJCS5zdWJkZXZpY2UgICAgPSAweDI4MDQsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1RFQ0hOT1RSRU5EX0JVREdFVF9UMzAwMCwKKwl9LCB7CiAJCS8qIC0tLSBib2FyZHMgd2l0aG91dCBlZXByb20gKyBzdWJzeXN0ZW0gSUQgLS0tICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKQEAgLTczMjAsNiArNzM1MCw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzMwMDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU19FVVJPUEEyX0hZQlJJRDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU19FVVJPUEFfSFlCUklEOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9URUNITk9UUkVORF9CVURHRVRfVDMwMDA6CiAJewogCiAJCS8qIFRoZSBQaGlsaXBzIEVVUk9QQSBiYXNlZCBoeWJyaWQgYm9hcmRzIGhhdmUgdGhlIHR1bmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggOTBmMjMxOC4uNDBiYzYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJQlVHX09OKGluX2ludGVycnVwdCgpKTsKIAogCXZpZGVvYnVmX3dhaXRvbigmYnVmLT52YiwwLDApOwotCXZpZGVvYnVmX2RtYV91bm1hcChxLCBkbWEpOworCXZpZGVvYnVmX2RtYV91bm1hcChxLT5kZXYsIGRtYSk7CiAJdmlkZW9idWZfZG1hX2ZyZWUoZG1hKTsKIAlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKaW5kZXggMzFlODJiZS4uZjI2ZmU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTQ4MSw2ICs0ODEsMTcgQEAKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQogfTsKIAorc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgdGVjaG5vdHJlbmRfYnVkZ2V0X3QzMDAwX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF80TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8zNjE3LAorCS50dW5lcl9hZGRyZXNzID0gMHg2MywKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiB0ZGEgMTAwNHggYmFzZWQgY2FyZHMgd2l0aCBwaGlsaXBzIHNpbGljb24gdHVuZXIKICAqLwpAQCAtMTE2OCw2ICsxMTc5LDE4IEBACiAJCQlmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZDEzMTZfdHVuZXJfc2V0X3BhcmFtczsKIAkJfQogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfVEVDSE5PVFJFTkRfQlVER0VUX1QzMDAwOgorCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCQkgICAgICAgJnRlY2hub3RyZW5kX2J1ZGdldF90MzAwMF9jb25maWcsCisJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5vcmlnaW5hbF9kZW1vZF9zbGVlcCA9IGZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuc2xlZXA7CisJCQlmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnNsZWVwID0gcGhpbGlwc19ldXJvcGFfZGVtb2Rfc2xlZXA7CisJCQlmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc19ldXJvcGFfdHVuZXJfaW5pdDsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gcGhpbGlwc19ldXJvcGFfdHVuZXJfc2xlZXA7CisJCQlmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZDEzMTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQorCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0RWQlRfMjAwOgogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAogCQkJCQkgICAgICAgJnBoaWxpcHNfdHUxMjE2XzYxX2NvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCmluZGV4IDc1NmExY2EuLmMwNDBhMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaApAQCAtMzA0LDYgKzMwNCw3IEBACiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQkVIT0xEX0g3ICAgICAgICAgICAgIDE3OAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0JFSE9MRF9BNyAgICAgICAgICAgICAxNzkKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfTTczM0EgICAgICAgMTgwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVEVDSE5PVFJFTkRfQlVER0VUX1QzMDAwIDE4MQogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDMyCiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwppbmRleCA5NjFiZmEyLi4yYjI0YmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCkBAIC02MzMsNiArNjMzLDEyIEBACiAJCWNkd2RyX3dpZHRoICo9IDI7CiAJfQogCisJLyogQ1NJMiBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAocGNkZXYtPnBkYXRhLT5jc2kyX2RldikgeworCQlpbl93aWR0aCA9ICgoaW5fd2lkdGggLSAyKSAqIDIpOworCQlsZWZ0X29mZnNldCAqPSAyOworCX0KKwogCS8qIFNldCBDQU1PUiwgQ0FQV1IsIENGU1pSLCB0YWtlIGNhcmUgb2YgQ0RXRFIgKi8KIAljYW1vciA9IGxlZnRfb2Zmc2V0IHwgKHRvcF9vZmZzZXQgPDwgMTYpOwogCkBAIC03NDMsMTYgKzc0OSwxNiBAQAogCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6CiAJY2FzZSBWNEwyX1BJWF9GTVRfTlY2MToKIAkJc3dpdGNoIChjYW0tPmNvZGUpIHsKLQkJY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRToKKwkJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODoKIAkJCXZhbHVlID0gMHgwMDAwMDAwMDsgLyogQ2IwLCBZMCwgQ3IwLCBZMSAqLwogCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfQkU6CisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDg6CiAJCQl2YWx1ZSA9IDB4MDAwMDAxMDA7IC8qIENyMCwgWTAsIENiMCwgWTEgKi8KIAkJCWJyZWFrOwotCQljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0xFOgorCQljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgogCQkJdmFsdWUgPSAweDAwMDAwMjAwOyAvKiBZMCwgQ2IwLCBZMSwgQ3IwICovCiAJCQlicmVhazsKLQkJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYOF9MRToKKwkJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKIAkJCXZhbHVlID0gMHgwMDAwMDMwMDsgLyogWTAsIENyMCwgWTEsIENiMCAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC03NjcsNiArNzczLDExIEBACiAJdmFsdWUgfD0gY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVyA/IDEgPDwgMSA6IDA7CiAJdmFsdWUgfD0gY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVyA/IDEgPDwgMCA6IDA7CiAJdmFsdWUgfD0gcGNkZXYtPmlzXzE2Yml0ID8gMSA8PCAxMiA6IDA7CisKKwkvKiBDU0kyIG1vZGUgKi8KKwlpZiAocGNkZXYtPnBkYXRhLT5jc2kyX2RldikKKwkJdmFsdWUgfD0gMyA8PCAxMjsKKwogCWNldV93cml0ZShwY2RldiwgQ0FNQ1IsIHZhbHVlKTsKIAogCWNldV93cml0ZShwY2RldiwgQ0FQQ1IsIDB4MDAzMDAwMDApOwpAQCAtODgzLDYgKzg5NCw4IEBACiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOworCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldCwgaywgbjsKIAlpbnQgZm9ybWF0cyA9IDA7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfY2FtICpjYW07CkBAIC04OTYsMTkgKzkwOSwxOSBAQAogCiAJZm10ID0gc29jX21idXNfZ2V0X2ZtdGRlc2MoY29kZSk7CiAJaWYgKCFmbXQpIHsKLQkJZGV2X2VycihpY2QtPmRldi5wYXJlbnQsCi0JCQkiSW52YWxpZCBmb3JtYXQgY29kZSAjJXU6ICVkXG4iLCBpZHgsIGNvZGUpOworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgZm9ybWF0IGNvZGUgIyV1OiAlZFxuIiwgaWR4LCBjb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gc2hfbW9iaWxlX2NldV90cnlfYnVzX3BhcmFtKGljZCwgZm10LT5iaXRzX3Blcl9zYW1wbGUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gMDsKKwlpZiAoIXBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpIHsKKwkJcmV0ID0gc2hfbW9iaWxlX2NldV90cnlfYnVzX3BhcmFtKGljZCwgZm10LT5iaXRzX3Blcl9zYW1wbGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAwOworCX0KIAogCWlmICghaWNkLT5ob3N0X3ByaXYpIHsKIAkJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtZjsKIAkJc3RydWN0IHY0bDJfcmVjdCByZWN0OwotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CiAJCWludCBzaGlmdCA9IDA7CiAKIAkJLyogRklYTUU6IHN1YndpbmRvdyBpcyBsb3N0IGJldHdlZW4gY2xvc2UgLyBvcGVuICovCkBAIC05MjcsNyArOTQwLDggQEAKIAkJCS8qIFRyeSAyNTYweDE5MjAsIDEyODB4OTYwLCA2NDB4NDgwLCAzMjB4MjQwICovCiAJCQltZi53aWR0aAk9IDI1NjAgPj4gc2hpZnQ7CiAJCQltZi5oZWlnaHQJPSAxOTIwID4+IHNoaWZ0OwotCQkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfbWJ1c19mbXQsICZtZik7CisJCQlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIDAsIHZpZGVvLAorCQkJCQkJCSBzX21idXNfZm10LCAmbWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAkJCXNoaWZ0Kys7CkBAIC05NjUsMTAgKzk3OSwxMCBAQAogCQljYW0tPmV4dHJhX2ZtdCA9IE5VTEw7CiAKIAlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0JFOgotCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDhfQkU6Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9MRToKLQljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0xFOgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDg6CiAJCWlmIChjYW0tPmV4dHJhX2ZtdCkKIAkJCWJyZWFrOwogCkBAIC0xMDA1LDcgKzEwMTksNyBAQAogCQl4bGF0ZS0+Y29kZQk9IGNvZGU7CiAJCXhsYXRlKys7CiAJCWRldl9kYmcoZGV2LCAiUHJvdmlkaW5nIGZvcm1hdCAlcyBpbiBwYXNzLXRocm91Z2ggbW9kZVxuIiwKLQkJCXhsYXRlLT5ob3N0X2ZtdC0+bmFtZSk7CisJCQlmbXQtPm5hbWUpOwogCX0KIAogCXJldHVybiBmb3JtYXRzOwpAQCAtMTIyOCw3ICsxMjQyLDggQEAKIAlzdHJ1Y3QgdjRsMl9jcm9wY2FwIGNhcDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfbWJ1c19mbXQsIG1mKTsKKwlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIDAsIHZpZGVvLAorCQkJCQkgc19tYnVzX2ZtdCwgbWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMjU3LDcgKzEyNzIsOCBAQAogCQl0bXBfaCA9IG1pbigyICogdG1wX2gsIG1heF9oZWlnaHQpOwogCQltZi0+d2lkdGggPSB0bXBfdzsKIAkJbWYtPmhlaWdodCA9IHRtcF9oOwotCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2ZtdCwgbWYpOworCQlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIDAsIHZpZGVvLAorCQkJCQkJIHNfbWJ1c19mbXQsIG1mKTsKIAkJZGV2X2dlbyhkZXYsICJDYW1lcmEgc2NhbGVkIHRvICV1eCV1XG4iLAogCQkJbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTE1MTQsNyArMTUzMCw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwogCV9fdTMyIHBpeGZtdCA9IHBpeC0+cGl4ZWxmb3JtYXQ7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKLQl1bnNpZ25lZCBpbnQgY2V1X3N1Yl93aWR0aCwgY2V1X3N1Yl9oZWlnaHQ7CisJLyogS2VlcCBDb21waWxlciBIYXBweSAqLworCXVuc2lnbmVkIGludCBjZXVfc3ViX3dpZHRoID0gMCwgY2V1X3N1Yl9oZWlnaHQgPSAwOwogCXUxNiBzY2FsZV92LCBzY2FsZV9oOwogCWludCByZXQ7CiAJYm9vbCBpbWFnZV9tb2RlOwpAQCAtMTU2OSw4ICsxNTg2LDggQEAKIAogCS8qIERvbmUgd2l0aCB0aGUgY2FtZXJhLiBOb3cgc2VlIGlmIHdlIGNhbiBpbXByb3ZlIHRoZSByZXN1bHQgKi8KIAotCWRldl9nZW8oZGV2LCAiQ2FtZXJhICVkIGZtdCAldXgldSwgcmVxdWVzdGVkICV1eCV1XG4iLAotCQlyZXQsIG1mLndpZHRoLCBtZi5oZWlnaHQsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlkZXZfZ2VvKGRldiwgImZtdCAldXgldSwgcmVxdWVzdGVkICV1eCV1XG4iLAorCQltZi53aWR0aCwgbWYuaGVpZ2h0LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE2MzQsNiArMTY1MSw5IEBACiAJaW50IHdpZHRoLCBoZWlnaHQ7CiAJaW50IHJldDsKIAorCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiVFJZX0ZNVChwaXg9MHgleCwgJXV4JXUpXG4iLAorCQkgcGl4Zm10LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKIAl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKIAlpZiAoIXhsYXRlKSB7CiAJCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CkBAIC0xNjYwLDcgKzE2ODAsNyBAQAogCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CiAJbWYuY29sb3JzcGFjZQk9IHBpeC0+Y29sb3JzcGFjZTsKIAotCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCB0cnlfbWJ1c19mbXQsICZtZik7CisJcmV0ID0gdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoc2QtPnY0bDJfZGV2LCAwLCB2aWRlbywgdHJ5X21idXNfZm10LCAmbWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNjg0LDcgKzE3MDQsOCBAQAogCQkJICovCiAJCQltZi53aWR0aCA9IDI1NjA7CiAJCQltZi5oZWlnaHQgPSAxOTIwOwotCQkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHRyeV9tYnVzX2ZtdCwgJm1mKTsKKwkJCXJldCA9IHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKHNkLT52NGwyX2RldiwgMCwgdmlkZW8sCisJCQkJCQkJIHRyeV9tYnVzX2ZtdCwgJm1mKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJLyogU2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbi4uLiAqLwogCQkJCWRldl9lcnIoaWNkLT5kZXYucGFyZW50LApAQCAtMTY5OSw2ICsxNzIwLDkgQEAKIAkJCXBpeC0+aGVpZ2h0ID0gaGVpZ2h0OwogCX0KIAorCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiJXMoKTogcmV0dXJuICVkLCBmbXQgMHgleCwgJXV4JXVcbiIsCisJCV9fZnVuY19fLCByZXQsIHBpeC0+cGl4ZWxmb3JtYXQsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4NTMsNiArMTg3NywzMCBAQAogCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKHNoX21vYmlsZV9jZXVfY29udHJvbHMpLAogfTsKIAorc3RydWN0IGJ1c193YWl0IHsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJbm90aWZpZXI7CisJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGlvbjsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworfTsKKworc3RhdGljIGludCBidXNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGJ1c193YWl0ICp3YWl0ID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgYnVzX3dhaXQsIG5vdGlmaWVyKTsKKworCWlmICh3YWl0LT5kZXYgIT0gZGV2KQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUjoKKwkJLyogUHJvdGVjdCBmcm9tIG1vZHVsZSB1bmxvYWRpbmcgKi8KKwkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdC0+Y29tcGxldGlvbik7CisJCXJldHVybiBOT1RJRllfT0s7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgc2hfbW9iaWxlX2NldV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXY7CkBAIC0xODYwLDYgKzE5MDgsMTEgQEAKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgYnVzX3dhaXQgd2FpdCA9IHsKKwkJLmNvbXBsZXRpb24gPSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSX09OU1RBQ0sod2FpdC5jb21wbGV0aW9uKSwKKwkJLm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBidXNfbm90aWZ5LAorCX07CisJc3RydWN0IGRldmljZSAqY3NpMjsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKQEAgLTE5MzEsMTIgKzE5ODQsNTQgQEAKIAlwY2Rldi0+aWNpLmRydl9uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJcGNkZXYtPmljaS5vcHMgPSAmc2hfbW9iaWxlX2NldV9ob3N0X29wczsKIAorCS8qIENTSTIgaW50ZXJmYWNpbmcgKi8KKwljc2kyID0gcGNkZXYtPnBkYXRhLT5jc2kyX2RldjsKKwlpZiAoY3NpMikgeworCQl3YWl0LmRldiA9IGNzaTI7CisKKwkJZXJyID0gYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJndhaXQubm90aWZpZXIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXhpdF9mcmVlX2NsazsKKworCQkvKgorCQkgKiBGcm9tIHRoaXMgcG9pbnQgdGhlIGRyaXZlciBtb2R1bGUgd2lsbCBub3QgdW5sb2FkLCB1bnRpbAorCQkgKiB3ZSBjb21wbGV0ZSB0aGUgY29tcGxldGlvbi4KKwkJICovCisKKwkJaWYgKCFjc2kyLT5kcml2ZXIgfHwgIWNzaTItPmRyaXZlci0+b3duZXIpIHsKKwkJCWNvbXBsZXRlKCZ3YWl0LmNvbXBsZXRpb24pOworCQkJLyogRWl0aGVyIHRvbyBsYXRlLCBvciBwcm9iaW5nIGZhaWxlZCAqLworCQkJYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmd2FpdC5ub3RpZmllcik7CisJCQllcnIgPSAtRU5YSU87CisJCQlnb3RvIGV4aXRfZnJlZV9jbGs7CisJCX0KKworCQkvKgorCQkgKiBUaGUgbW9kdWxlIGlzIHN0aWxsIGxvYWRlZCwgaW4gdGhlIHdvcnN0IGNhc2UgaXQgaXMgaGFuZ2luZworCQkgKiBpbiBkZXZpY2UgcmVsZWFzZSBvbiBvdXIgY29tcGxldGlvbi4gU28sIF9ub3dfIGRlcmVmZXJlbmNpbmcKKwkJICogdGhlICJvd25lciIgaXMgc2FmZSEKKwkJICovCisKKwkJZXJyID0gdHJ5X21vZHVsZV9nZXQoY3NpMi0+ZHJpdmVyLT5vd25lcik7CisKKwkJLyogTGV0IG5vdGlmaWVyIGNvbXBsZXRlLCBpZiBpdCBoYXMgYmVlbiBsb2NrZWQgKi8KKwkJY29tcGxldGUoJndhaXQuY29tcGxldGlvbik7CisJCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJndhaXQubm90aWZpZXIpOworCQlpZiAoIWVycikgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXhpdF9mcmVlX2NsazsKKwkJfQorCX0KKwogCWVyciA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3RlcigmcGNkZXYtPmljaSk7CiAJaWYgKGVycikKLQkJZ290byBleGl0X2ZyZWVfY2xrOworCQlnb3RvIGV4aXRfbW9kdWxlX3B1dDsKIAogCXJldHVybiAwOwogCitleGl0X21vZHVsZV9wdXQ6CisJaWYgKGNzaTIgJiYgY3NpMi0+ZHJpdmVyKQorCQltb2R1bGVfcHV0KGNzaTItPmRyaXZlci0+b3duZXIpOwogZXhpdF9mcmVlX2NsazoKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJZnJlZV9pcnEocGNkZXYtPmlycSwgcGNkZXYpOwpAQCAtMTk1Niw2ICsyMDUxLDcgQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICpzb2NfaG9zdCA9IHRvX3NvY19jYW1lcmFfaG9zdCgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gY29udGFpbmVyX29mKHNvY19ob3N0LAogCQkJCQlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYsIGljaSk7CisJc3RydWN0IGRldmljZSAqY3NpMiA9IHBjZGV2LT5wZGF0YS0+Y3NpMl9kZXY7CiAKIAlzb2NfY2FtZXJhX2hvc3RfdW5yZWdpc3Rlcihzb2NfaG9zdCk7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwpAQCAtMTk2Myw3ICsyMDU5LDEwIEBACiAJaWYgKHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSkpCiAJCWRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeSgmcGRldi0+ZGV2KTsKIAlpb3VubWFwKHBjZGV2LT5iYXNlKTsKKwlpZiAoY3NpMiAmJiBjc2kyLT5kcml2ZXIpCisJCW1vZHVsZV9wdXQoY3NpMi0+ZHJpdmVyLT5vd25lcik7CiAJa2ZyZWUocGNkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OTUsNiArMjA5NCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNoX21vYmlsZV9jZXVfaW5pdCh2b2lkKQogeworCS8qIFdoYXRldmVyIHJldHVybiBjb2RlICovCisJcmVxdWVzdF9tb2R1bGUoInNoX21vYmlsZV9jc2kyIik7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2hfbW9iaWxlX2NldV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhNjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIFNILU1vYmlsZSBNSVBJIENTSS0yIHVuaXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NzaTIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisKKyNkZWZpbmUgU0hfQ1NJMl9UUkVGCTB4MDAKKyNkZWZpbmUgU0hfQ1NJMl9TUlNUCTB4MDQKKyNkZWZpbmUgU0hfQ1NJMl9QSFlDTlQJMHgwOAorI2RlZmluZSBTSF9DU0kyX0NIS1NVTQkweDBDCisjZGVmaW5lIFNIX0NTSTJfVkNEVAkweDEwCisKK3N0cnVjdCBzaF9jc2kyIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCXN0cnVjdCBub3RpZmllcl9ibG9jawkJbm90aWZpZXI7CisJdW5zaWduZWQgaW50CQkJaXJxOworCXZvaWQgX19pb21lbQkJCSpiYXNlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OworCXN0cnVjdCBzaF9jc2kyX2NsaWVudF9jb25maWcJKmNsaWVudDsKK307CisKK3N0YXRpYyBpbnQgc2hfY3NpMl90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlzdHJ1Y3Qgc2hfY3NpMiAqcHJpdiA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHNoX2NzaTIsIHN1YmRldik7CisJc3RydWN0IHNoX2NzaTJfcGRhdGEgKnBkYXRhID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAobWYtPndpZHRoID4gODE4OCkKKwkJbWYtPndpZHRoID0gODE4ODsKKwllbHNlIGlmIChtZi0+d2lkdGggJiAxKQorCQltZi0+d2lkdGggJj0gfjE7CisKKwlzd2l0Y2ggKHBkYXRhLT50eXBlKSB7CisJY2FzZSBTSF9DU0kyQzoKKwkJc3dpdGNoIChtZi0+Y29kZSkgeworCQljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgkJLyogWVVWNDIyICovCisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xXzVYODoJCS8qIFlVVjQyMCAqLworCQljYXNlIFY0TDJfTUJVU19GTVRfR1JFWThfMVg4OgkJLyogUkFXOCAqLworCQljYXNlIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYODoKKwkJY2FzZSBWNEwyX01CVVNfRk1UX1NHUkJHOF8xWDg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEFsbCBNSVBJIENTSS0yIGRldmljZXMgbXVzdCBzdXBwb3J0IG9uZSBvZiBwcmltYXJ5IGZvcm1hdHMgKi8KKwkJCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSF9DU0kySToKKwkJc3dpdGNoIChtZi0+Y29kZSkgeworCQljYXNlIFY0TDJfTUJVU19GTVRfR1JFWThfMVg4OgkJLyogUkFXOCAqLworCQljYXNlIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYODoKKwkJY2FzZSBWNEwyX01CVVNfRk1UX1NHUkJHOF8xWDg6CisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTA6CS8qIFJBVzEwICovCisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9TQkdHUjEyXzFYMTI6CS8qIFJBVzEyICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEFsbCBNSVBJIENTSS0yIGRldmljZXMgbXVzdCBzdXBwb3J0IG9uZSBvZiBwcmltYXJ5IGZvcm1hdHMgKi8KKwkJCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4OworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogV2UgaGF2ZSBkb25lIG91ciBiZXN0IGluIHRyeV9mbXQgdG8gdHJ5IGFuZCB0ZWxsIHRoZSBzZW5zb3IsIHdoaWNoIGZvcm1hdHMKKyAqIHdlIHN1cHBvcnQuIElmIG5vdyB0aGUgY29uZmlndXJhdGlvbiBpcyB1bnN1aXRhYmxlIGZvciB1cyB3ZSBjYW4gb25seQorICogZXJyb3Igb3V0LgorICovCitzdGF0aWMgaW50IHNoX2NzaTJfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlzdHJ1Y3Qgc2hfY3NpMiAqcHJpdiA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHNoX2NzaTIsIHN1YmRldik7CisJdTMyIHRtcCA9IChwcml2LT5jbGllbnQtPmNoYW5uZWwgJiAzKSA8PCA4OworCisJZGV2X2RiZyhzZC0+djRsMl9kZXYtPmRldiwgIiVzKCV1KVxuIiwgX19mdW5jX18sIG1mLT5jb2RlKTsKKwlpZiAobWYtPndpZHRoID4gODE4OCB8fCBtZi0+d2lkdGggJiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobWYtPmNvZGUpIHsKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgorCQl0bXAgfD0gMHgxZTsJLyogWVVWNDIyIDggYml0ICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xXzVYODoKKwkJdG1wIHw9IDB4MTg7CS8qIFlVVjQyMCA4IGJpdCAqLworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9CRToKKwkJdG1wIHw9IDB4MjE7CS8qIFJHQjU1NSAqLworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9CRToKKwkJdG1wIHw9IDB4MjI7CS8qIFJHQjU2NSAqLworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfR1JFWThfMVg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9TR1JCRzhfMVg4OgorCQl0bXAgfD0gMHgyYTsJLyogUkFXOCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpb3dyaXRlMzIodG1wLCBwcml2LT5iYXNlICsgU0hfQ1NJMl9WQ0RUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBzaF9jc2kyX3N1YmRldl92aWRlb19vcHMgPSB7CisJLnNfbWJ1c19mbXQJPSBzaF9jc2kyX3NfZm10LAorCS50cnlfbWJ1c19mbXQJPSBzaF9jc2kyX3RyeV9mbXQsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHNoX2NzaTJfc3ViZGV2X2NvcmVfb3BzOworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzaF9jc2kyX3N1YmRldl9vcHMgPSB7CisJLmNvcmUJPSAmc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMsCisJLnZpZGVvCT0gJnNoX2NzaTJfc3ViZGV2X3ZpZGVvX29wcywKK307CisKK3N0YXRpYyB2b2lkIHNoX2NzaTJfaHdpbml0KHN0cnVjdCBzaF9jc2kyICpwcml2KQoreworCXN0cnVjdCBzaF9jc2kyX3BkYXRhICpwZGF0YSA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCV9fdTMyIHRtcCA9IDB4MTA7IC8qIEVuYWJsZSBNSVBJIENTSSBjbG9jayBsYW5lICovCisKKwkvKiBSZWZsZWN0IHJlZ2lzdGVycyBpbW1lZGlhdGVseSAqLworCWlvd3JpdGUzMigweDAwMDAwMDAxLCBwcml2LT5iYXNlICsgU0hfQ1NJMl9UUkVGKTsKKwkvKiByZXNldCBDU0kyIGhhcndhcmUgKi8KKwlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgcHJpdi0+YmFzZSArIFNIX0NTSTJfU1JTVCk7CisJdWRlbGF5KDUpOworCWlvd3JpdGUzMigweDAwMDAwMDAwLCBwcml2LT5iYXNlICsgU0hfQ1NJMl9TUlNUKTsKKworCWlmIChwcml2LT5jbGllbnQtPmxhbmVzICYgMykKKwkJdG1wIHw9IHByaXYtPmNsaWVudC0+bGFuZXMgJiAzOworCWVsc2UKKwkJLyogRGVmYXVsdCAtIGJvdGggbGFuZXMgKi8KKwkJdG1wIHw9IDM7CisKKwlpZiAocHJpdi0+Y2xpZW50LT5waHkgPT0gU0hfQ1NJMl9QSFlfTUFJTikKKwkJdG1wIHw9IDB4ODAwMDsKKworCWlvd3JpdGUzMih0bXAsIHByaXYtPmJhc2UgKyBTSF9DU0kyX1BIWUNOVCk7CisKKwl0bXAgPSAwOworCWlmIChwZGF0YS0+ZmxhZ3MgJiBTSF9DU0kyX0VDQykKKwkJdG1wIHw9IDI7CisJaWYgKHBkYXRhLT5mbGFncyAmIFNIX0NTSTJfQ1JDKQorCQl0bXAgfD0gMTsKKwlpb3dyaXRlMzIodG1wLCBwcml2LT5iYXNlICsgU0hfQ1NJMl9DSEtTVU0pOworfQorCitzdGF0aWMgaW50IHNoX2NzaTJfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hfY3NpMl9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CisJY29uc3QgdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8CisJCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlTT0NBTV9NQVNURVIgfCBTT0NBTV9EQVRBV0lEVEhfOCB8IFNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7CisKKwlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2hfY3NpMl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHRvX3NvY19jYW1lcmFfZGV2KGRldik7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJc3RydWN0IHNoX2NzaTIgKnByaXYgPQorCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBzaF9jc2kyLCBub3RpZmllcik7CisJc3RydWN0IHNoX2NzaTJfcGRhdGEgKnBkYXRhID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2NsaWVudHM7IGkrKykKKwkJaWYgKCZwZGF0YS0+Y2xpZW50c1tpXS5wZGV2LT5kZXYgPT0gaWNkLT5wZGV2KQorCQkJYnJlYWs7CisKKwlkZXZfZGJnKGRldiwgIiVzKCVwKTogYWN0aW9uID0gJWx1LCBmb3VuZCAjJWRcbiIsIF9fZnVuY19fLCBkZXYsIGFjdGlvbiwgaSk7CisKKwlpZiAoaSA9PSBwZGF0YS0+bnVtX2NsaWVudHMpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUjoKKwkJc25wcmludGYocHJpdi0+c3ViZGV2Lm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIiVzJXMiLAorCQkJIGRldl9uYW1lKHY0bDJfZGV2LT5kZXYpLCAiLm1pcGktY3NpIik7CisJCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2NGwyX2RldiwgJnByaXYtPnN1YmRldik7CisJCWRldl9kYmcoZGV2LCAiJXMoJXApOiByZXQocmVnaXN0ZXJfc3ViZGV2KSA9ICVkXG4iLCBfX2Z1bmNfXywgcHJpdiwgcmV0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkJcHJpdi0+Y2xpZW50ID0gcGRhdGEtPmNsaWVudHMgKyBpOworCisJCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IHNoX2NzaTJfc2V0X2J1c19wYXJhbTsKKwkJaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHNoX2NzaTJfcXVlcnlfYnVzX3BhcmFtOworCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmModjRsMl9nZXRfc3ViZGV2ZGF0YSgmcHJpdi0+c3ViZGV2KSk7CisKKwkJc2hfY3NpMl9od2luaXQocHJpdik7CisJCWJyZWFrOworCWNhc2UgQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSOgorCQlwcml2LT5jbGllbnQgPSBOVUxMOworCisJCS8qIERyaXZlciBpcyBhYm91dCB0byBiZSB1bmJvdW5kICovCisJCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IE5VTEw7CisJCWljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0JPSBOVUxMOworCisJCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOworCisJCXBtX3J1bnRpbWVfcHV0KHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldikpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgX19kZXZpbml0IGludCBzaF9jc2kyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgcmV0OworCXN0cnVjdCBzaF9jc2kyICpwcml2OworCS8qIFBsYXRmb3JtIGRhdGEgc3BlY2lmeSB0aGUgUEhZLCBsYW5lcywgRUNDLCBDUkMgKi8KKwlzdHJ1Y3Qgc2hfY3NpMl9wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJLyogSW50ZXJydXB0IHVudXNlZCBzbyBmYXIgKi8KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJaWYgKCFyZXMgfHwgKGludClpcnEgPD0gMCB8fCAhcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm90IGVub3VnaCBDU0kyIHBsYXRmb3JtIHJlc291cmNlcy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgQ1NJMkkuIENhcmVmdWw6IGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXQhICovCisJaWYgKHBkYXRhLT50eXBlICE9IFNIX0NTSTJDKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk9ubHkgQ1NJMkMgc3VwcG9ydGVkIEFUTS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNoX2NzaTIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+aXJxID0gaXJxOworCXByaXYtPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBzaF9jc2kyX25vdGlmeTsKKworCS8qIFdlIE1VU1QgYXR0YWNoIGFmdGVyIHRoZSBNSVBJIHNlbnNvciAqLworCXJldCA9IGJ1c19yZWdpc3Rlcl9ub3RpZmllcigmc29jX2NhbWVyYV9idXNfdHlwZSwgJnByaXYtPm5vdGlmaWVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDU0kyIGNhbm5vdCByZWdpc3RlciBub3RpZmllclxuIik7CisJCWdvdG8gZXJub3RpZnk7CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDU0kyIHJlZ2lzdGVyIHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJlcXJlZzsKKwl9CisKKwlwcml2LT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcHJpdi0+YmFzZSkgeworCQlyZXQgPSAtRU5YSU87CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBpb3JlbWFwIENTSTIgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZXJlbWFwOworCX0KKworCXByaXYtPnBkZXYgPSBwZGV2OworCisJdjRsMl9zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCAmc2hfY3NpMl9zdWJkZXZfb3BzKTsKKwl2NGwyX3NldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYsICZwZGV2LT5kZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIkNTSTIgcHJvYmVkLlxuIik7CisKKwlyZXR1cm4gMDsKKworZXJlbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZXJlcXJlZzoKKwlidXNfdW5yZWdpc3Rlcl9ub3RpZmllcigmc29jX2NhbWVyYV9idXNfdHlwZSwgJnByaXYtPm5vdGlmaWVyKTsKK2Vybm90aWZ5OgorCWtmcmVlKHByaXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2ZXhpdCBpbnQgc2hfY3NpMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2hfY3NpMiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZzb2NfY2FtZXJhX2J1c190eXBlLCAmcHJpdi0+bm90aWZpZXIpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlpb3VubWFwKHByaXYtPmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIF9fcmVmZGF0YSBzaF9jc2kyX3BkcnYgPSB7CisJLnJlbW92ZSAgPSBfX2RldmV4aXRfcChzaF9jc2kyX3JlbW92ZSksCisJLmRyaXZlciAgPSB7CisJCS5uYW1lCT0gInNoLW1vYmlsZS1jc2kyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoX2NzaTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNoX2NzaTJfcGRydiwgc2hfY3NpMl9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaF9jc2kyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2hfY3NpMl9wZHJ2KTsKK30KKworbW9kdWxlX2luaXQoc2hfY3NpMl9pbml0KTsKK21vZHVsZV9leGl0KHNoX2NzaTJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU0gtTW9iaWxlIE1JUEkgQ1NJLTIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJHdWVubmFkaSBMaWFraG92ZXRza2kgPGcubGlha2hvdmV0c2tpQGdteC5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c2gtbW9iaWxlLWNzaTIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX3ZvdS5jCmluZGV4IGY1Yjg5MmEuLmQzOTQxODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF92b3UuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCkBAIC01Nyw3ICs1OCw3IEBACiB9OwogCiAjZGVmaW5lIFZPVV9NQVhfSU1BR0VfV0lEVEgJNzIwCi0jZGVmaW5lIFZPVV9NQVhfSU1BR0VfSEVJR0hUCTQ4MAorI2RlZmluZSBWT1VfTUFYX0lNQUdFX0hFSUdIVAk1NzYKIAogc3RydWN0IHNoX3ZvdV9kZXZpY2UgewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTUyNywyMCArNTI4LDE3IEBACiBzdGF0aWMgdm9pZCB2b3VfYWRqdXN0X2lucHV0KHN0cnVjdCBzaF92b3VfZ2VvbWV0cnkgKmdlbywgdjRsMl9zdGRfaWQgc3RkKQogewogCS8qIFRoZSBjb21waWxlciBjYW5ub3Qga25vdywgdGhhdCBiZXN0IGFuZCBpZHggd2lsbCBpbmRlZWQgYmUgc2V0ICovCi0JdW5zaWduZWQgaW50IGJlc3RfZXJyID0gVUlOVF9NQVgsIGJlc3QgPSAwLCB3aWR0aF9tYXgsIGhlaWdodF9tYXg7CisJdW5zaWduZWQgaW50IGJlc3RfZXJyID0gVUlOVF9NQVgsIGJlc3QgPSAwLCBpbWdfaGVpZ2h0X21heDsKIAlpbnQgaSwgaWR4ID0gMDsKIAotCWlmIChzdGQgJiBWNEwyX1NURF81MjVfNjApIHsKLQkJd2lkdGhfbWF4ID0gODU4OwotCQloZWlnaHRfbWF4ID0gMjYyOwotCX0gZWxzZSB7Ci0JCXdpZHRoX21heCA9IDg2NDsKLQkJaGVpZ2h0X21heCA9IDMxMjsKLQl9CisJaWYgKHN0ZCAmIFY0TDJfU1REXzUyNV82MCkKKwkJaW1nX2hlaWdodF9tYXggPSA0ODA7CisJZWxzZQorCQlpbWdfaGVpZ2h0X21heCA9IDU3NjsKIAogCS8qIEltYWdlIHdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0ICovCiAJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZnZW8tPmluX3dpZHRoLCAwLCBWT1VfTUFYX0lNQUdFX1dJRFRILCAyLAotCQkJICAgICAgJmdlby0+aW5faGVpZ2h0LCAwLCBWT1VfTUFYX0lNQUdFX0hFSUdIVCwgMSwgMCk7CisJCQkgICAgICAmZ2VvLT5pbl9oZWlnaHQsIDAsIGltZ19oZWlnaHRfbWF4LCAxLCAwKTsKIAogCS8qIFNlbGVjdCBzY2FsZXMgdG8gY29tZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGltYWdlICovCiAJZm9yIChpID0gQVJSQVlfU0laRSh2b3Vfc2NhbGVfaF9udW0pIC0gMTsgaSA+PSAwOyBpLS0pIHsKQEAgLTU3Myw3ICs1NzEsNyBAQAogCQl1bnNpZ25lZCBpbnQgZm91bmQgPSBnZW8tPm91dHB1dC5oZWlnaHQgKiB2b3Vfc2NhbGVfdl9kZW5baV0gLwogCQkJdm91X3NjYWxlX3ZfbnVtW2ldOwogCi0JCWlmIChmb3VuZCA+IFZPVV9NQVhfSU1BR0VfSEVJR0hUKQorCQlpZiAoZm91bmQgPiBpbWdfaGVpZ2h0X21heCkKIAkJCS8qIHNjYWxlcyBpbmNyZWFzZSAqLwogCQkJYnJlYWs7CiAKQEAgLTU5NywxNSArNTk1LDE4IEBACiAgKi8KIHN0YXRpYyB2b2lkIHZvdV9hZGp1c3Rfb3V0cHV0KHN0cnVjdCBzaF92b3VfZ2VvbWV0cnkgKmdlbywgdjRsMl9zdGRfaWQgc3RkKQogewotCXVuc2lnbmVkIGludCBiZXN0X2VyciA9IFVJTlRfTUFYLCBiZXN0LCB3aWR0aF9tYXgsIGhlaWdodF9tYXg7CisJdW5zaWduZWQgaW50IGJlc3RfZXJyID0gVUlOVF9NQVgsIGJlc3QsIHdpZHRoX21heCwgaGVpZ2h0X21heCwKKwkJaW1nX2hlaWdodF9tYXg7CiAJaW50IGksIGlkeDsKIAogCWlmIChzdGQgJiBWNEwyX1NURF81MjVfNjApIHsKIAkJd2lkdGhfbWF4ID0gODU4OwogCQloZWlnaHRfbWF4ID0gMjYyICogMjsKKwkJaW1nX2hlaWdodF9tYXggPSA0ODA7CiAJfSBlbHNlIHsKIAkJd2lkdGhfbWF4ID0gODY0OwogCQloZWlnaHRfbWF4ID0gMzEyICogMjsKKwkJaW1nX2hlaWdodF9tYXggPSA1NzY7CiAJfQogCiAJLyogU2VsZWN0IHNjYWxlcyB0byBjb21lIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgaW1hZ2UgKi8KQEAgLTY0NCw3ICs2NDUsNyBAQAogCQl1bnNpZ25lZCBpbnQgZm91bmQgPSBnZW8tPmluX2hlaWdodCAqIHZvdV9zY2FsZV92X251bVtpXSAvCiAJCQl2b3Vfc2NhbGVfdl9kZW5baV07CiAKLQkJaWYgKGZvdW5kID4gVk9VX01BWF9JTUFHRV9IRUlHSFQpCisJCWlmIChmb3VuZCA+IGltZ19oZWlnaHRfbWF4KQogCQkJLyogc2NhbGVzIGluY3JlYXNlICovCiAJCQlicmVhazsKIApAQCAtNjczLDExICs2NzQsMTIgQEAKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3Qgc2hfdm91X2RldmljZSAqdm91X2RldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmbXQtPmZtdC5waXg7CisJdW5zaWduZWQgaW50IGltZ19oZWlnaHRfbWF4OwogCWludCBwaXhfaWR4OwogCXN0cnVjdCBzaF92b3VfZ2VvbWV0cnkgZ2VvOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJmbXQgPSB7CiAJCS8qIFJldmlzaXQ6IGlzIHRoaXMgdGhlIGNvcnJlY3QgY29kZT8gKi8KLQkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9MRSwKKwkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKIAkJLmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAogCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0sCiAJfTsKQEAgLTcwMSw5ICs3MDMsMTQgQEAKIAlpZiAocGl4X2lkeCA9PSBBUlJBWV9TSVpFKHZvdV9mbXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh2b3VfZGV2LT5zdGQgJiBWNEwyX1NURF81MjVfNjApCisJCWltZ19oZWlnaHRfbWF4ID0gNDgwOworCWVsc2UKKwkJaW1nX2hlaWdodF9tYXggPSA1NzY7CisKIAkvKiBJbWFnZSB3aWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAqLwogCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcGl4LT53aWR0aCwgMCwgVk9VX01BWF9JTUFHRV9XSURUSCwgMiwKLQkJCSAgICAgICZwaXgtPmhlaWdodCwgMCwgVk9VX01BWF9JTUFHRV9IRUlHSFQsIDEsIDApOworCQkJICAgICAgJnBpeC0+aGVpZ2h0LCAwLCBpbWdfaGVpZ2h0X21heCwgMSwgMCk7CiAKIAlnZW8uaW5fd2lkdGggPSBwaXgtPndpZHRoOwogCWdlby5pbl9oZWlnaHQgPSBwaXgtPmhlaWdodDsKQEAgLTcyNCw4ICs3MzEsOCBAQAogCiAJLyogU2FuaXR5IGNoZWNrcyAqLwogCWlmICgodW5zaWduZWQpbWJmbXQud2lkdGggPiBWT1VfTUFYX0lNQUdFX1dJRFRIIHx8Ci0JICAgICh1bnNpZ25lZCltYmZtdC5oZWlnaHQgPiBWT1VfTUFYX0lNQUdFX0hFSUdIVCB8fAotCSAgICBtYmZtdC5jb2RlICE9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0xFKQorCSAgICAodW5zaWduZWQpbWJmbXQuaGVpZ2h0ID4gaW1nX2hlaWdodF9tYXggfHwKKwkgICAgbWJmbXQuY29kZSAhPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAobWJmbXQud2lkdGggIT0gZ2VvLm91dHB1dC53aWR0aCB8fApAQCAtOTM2LDEwICs5NDMsMTEgQEAKIAlzdHJ1Y3Qgc2hfdm91X2dlb21ldHJ5IGdlbzsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1iZm10ID0gewogCQkvKiBSZXZpc2l0OiBpcyB0aGlzIHRoZSBjb3JyZWN0IGNvZGU/ICovCi0JCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEUsCisJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCiAJCS5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRCwKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNLAogCX07CisJdW5zaWduZWQgaW50IGltZ19oZWlnaHRfbWF4OwogCWludCByZXQ7CiAKIAlkZXZfZGJnKHZvdV9kZXYtPnY0bDJfZGV2LmRldiwgIiVzKCk6ICV1eCV1QCV1OiV1XG4iLCBfX2Z1bmNfXywKQEAgLTk0OCwxNCArOTU2LDE5IEBACiAJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHZvdV9kZXYtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCkKKwkJaW1nX2hlaWdodF9tYXggPSA0ODA7CisJZWxzZQorCQlpbWdfaGVpZ2h0X21heCA9IDU3NjsKKwogCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcmVjdC0+d2lkdGgsIDAsIFZPVV9NQVhfSU1BR0VfV0lEVEgsIDEsCi0JCQkgICAgICAmcmVjdC0+aGVpZ2h0LCAwLCBWT1VfTUFYX0lNQUdFX0hFSUdIVCwgMSwgMCk7CisJCQkgICAgICAmcmVjdC0+aGVpZ2h0LCAwLCBpbWdfaGVpZ2h0X21heCwgMSwgMCk7CiAKIAlpZiAocmVjdC0+d2lkdGggKyByZWN0LT5sZWZ0ID4gVk9VX01BWF9JTUFHRV9XSURUSCkKIAkJcmVjdC0+bGVmdCA9IFZPVV9NQVhfSU1BR0VfV0lEVEggLSByZWN0LT53aWR0aDsKIAotCWlmIChyZWN0LT5oZWlnaHQgKyByZWN0LT50b3AgPiBWT1VfTUFYX0lNQUdFX0hFSUdIVCkKLQkJcmVjdC0+dG9wID0gVk9VX01BWF9JTUFHRV9IRUlHSFQgLSByZWN0LT5oZWlnaHQ7CisJaWYgKHJlY3QtPmhlaWdodCArIHJlY3QtPnRvcCA+IGltZ19oZWlnaHRfbWF4KQorCQlyZWN0LT50b3AgPSBpbWdfaGVpZ2h0X21heCAtIHJlY3QtPmhlaWdodDsKIAogCWdlby5vdXRwdXQgPSAqcmVjdDsKIAlnZW8uaW5fd2lkdGggPSBwaXgtPndpZHRoOwpAQCAtOTgwLDggKzk5Myw4IEBACiAKIAkvKiBTYW5pdHkgY2hlY2tzICovCiAJaWYgKCh1bnNpZ25lZCltYmZtdC53aWR0aCA+IFZPVV9NQVhfSU1BR0VfV0lEVEggfHwKLQkgICAgKHVuc2lnbmVkKW1iZm10LmhlaWdodCA+IFZPVV9NQVhfSU1BR0VfSEVJR0hUIHx8Ci0JICAgIG1iZm10LmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfTEUpCisJICAgICh1bnNpZ25lZCltYmZtdC5oZWlnaHQgPiBpbWdfaGVpZ2h0X21heCB8fAorCSAgICBtYmZtdC5jb2RlICE9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4KQogCQlyZXR1cm4gLUVJTzsKIAogCWdlby5vdXRwdXQud2lkdGggPSBtYmZtdC53aWR0aDsKQEAgLTEzMjksMTMgKzEzNDIsMTMgQEAKIAlyZWN0LT5sZWZ0CQk9IDA7CiAJcmVjdC0+dG9wCQk9IDA7CiAJcmVjdC0+d2lkdGgJCT0gVk9VX01BWF9JTUFHRV9XSURUSDsKLQlyZWN0LT5oZWlnaHQJCT0gVk9VX01BWF9JTUFHRV9IRUlHSFQ7CisJcmVjdC0+aGVpZ2h0CQk9IDQ4MDsKIAlwaXgtPndpZHRoCQk9IFZPVV9NQVhfSU1BR0VfV0lEVEg7Ci0JcGl4LT5oZWlnaHQJCT0gVk9VX01BWF9JTUFHRV9IRUlHSFQ7CisJcGl4LT5oZWlnaHQJCT0gNDgwOwogCXBpeC0+cGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVZZVTsKIAlwaXgtPmZpZWxkCQk9IFY0TDJfRklFTERfTk9ORTsKIAlwaXgtPmJ5dGVzcGVybGluZQk9IFZPVV9NQVhfSU1BR0VfV0lEVEggKiAyOwotCXBpeC0+c2l6ZWltYWdlCQk9IFZPVV9NQVhfSU1BR0VfV0lEVEggKiAyICogVk9VX01BWF9JTUFHRV9IRUlHSFQ7CisJcGl4LT5zaXplaW1hZ2UJCT0gVk9VX01BWF9JTUFHRV9XSURUSCAqIDIgKiA0ODA7CiAJcGl4LT5jb2xvcnNwYWNlCQk9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CiAKIAlyZWdpb24gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVnX3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVnX3JlcyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCmluZGV4IDQ3NTc1N2IuLmYyMDMyOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCkBAIC0xMTA3LDEzICsxMTA3LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBzb2NfY2FtZXJhX2J1c190eXBlID0geworc3RydWN0IGJ1c190eXBlIHNvY19jYW1lcmFfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gInNvYy1jYW1lcmEiLAogCS5wcm9iZQkJPSBzb2NfY2FtZXJhX3Byb2JlLAogCS5yZW1vdmUJCT0gc29jX2NhbWVyYV9yZW1vdmUsCiAJLnN1c3BlbmQJPSBzb2NfY2FtZXJhX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBzb2NfY2FtZXJhX3Jlc3VtZSwKIH07CitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY2FtZXJhX2J1c190eXBlKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGljX2RydiA9IHsKIAkubmFtZQk9ICJjYW1lcmEiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhX3BsYXRmb3JtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYwppbmRleCAyNDhjOTg2Li5iZjQwNmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYwpAQCAtNTYsOCArNTYsOCBAQAogCXJldHVybiBwLT5idXNfcGFyYW07CiB9CiAKLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQkJICAgICAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQorc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX2ZpbGxfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKnAgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIApAQCAtNjUsNiArNjUsNyBAQAogCW1mLT5oZWlnaHQJPSBwLT5mb3JtYXQuaGVpZ2h0OwogCW1mLT5jb2RlCT0gcC0+Zm9ybWF0LmNvZGU7CiAJbWYtPmNvbG9yc3BhY2UJPSBwLT5mb3JtYXQuY29sb3JzcGFjZTsKKwltZi0+ZmllbGQJPSBwLT5mb3JtYXQuZmllbGQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgzLDEwICs4NCw0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICAgICAgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICpwID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlhLT5jLmxlZnQJPSAwOworCWEtPmMudG9wCT0gMDsKKwlhLT5jLndpZHRoCT0gcC0+Zm9ybWF0LndpZHRoOworCWEtPmMuaGVpZ2h0CT0gcC0+Zm9ybWF0LmhlaWdodDsKKwlhLT50eXBlCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fY3JvcGNhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKnAgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWEtPmJvdW5kcy5sZWZ0CQkJPSAwOworCWEtPmJvdW5kcy50b3AJCQk9IDA7CisJYS0+Ym91bmRzLndpZHRoCQkJPSBwLT5mb3JtYXQud2lkdGg7CisJYS0+Ym91bmRzLmhlaWdodAkJPSBwLT5mb3JtYXQuaGVpZ2h0OworCWEtPmRlZnJlY3QJCQk9IGEtPmJvdW5kczsKKwlhLT50eXBlCQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7CisJYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IJPSAxOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHBsYXRmb3JtX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9zX3N0cmVhbSwKLQkudHJ5X21idXNfZm10CT0gc29jX2NhbWVyYV9wbGF0Zm9ybV90cnlfZm10LAogCS5lbnVtX21idXNfZm10CT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9lbnVtX2ZtdCwKKwkuY3JvcGNhcAk9IHNvY19jYW1lcmFfcGxhdGZvcm1fY3JvcGNhcCwKKwkuZ19jcm9wCQk9IHNvY19jYW1lcmFfcGxhdGZvcm1fZ19jcm9wLAorCS50cnlfbWJ1c19mbXQJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX2ZpbGxfZm10LAorCS5nX21idXNfZm10CT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9maWxsX2ZtdCwKKwkuc19tYnVzX2ZtdAk9IHNvY19jYW1lcmFfcGxhdGZvcm1fZmlsbF9mbXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBwbGF0Zm9ybV9zdWJkZXZfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfbWVkaWFidXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX21lZGlhYnVzLmMKaW5kZXggOGI2M2I2NTQuLjkxMzkxMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX21lZGlhYnVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfbWVkaWFidXMuYwpAQCAtMTgsMjggKzE4LDI4IEBACiAjZGVmaW5lIE1CVVNfSURYKGYpIChWNEwyX01CVVNfRk1UXyAjIyBmIC0gVjRMMl9NQlVTX0ZNVF9GSVhFRCAtIDEpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgbWJ1c19mbXRbXSA9IHsKLQlbTUJVU19JRFgoWVVZVjhfMlg4X0xFKV0gPSB7CisJW01CVVNfSURYKFlVWVY4XzJYOCldID0gewogCQkuZm91cmNjCQkJPSBWNEwyX1BJWF9GTVRfWVVZViwKIAkJLm5hbWUJCQk9ICJZVVlWIiwKIAkJLmJpdHNfcGVyX3NhbXBsZQk9IDgsCiAJCS5wYWNraW5nCQk9IFNPQ19NQlVTX1BBQ0tJTkdfMlg4X1BBREhJLAogCQkub3JkZXIJCQk9IFNPQ19NQlVTX09SREVSX0xFLAogCX0sCi0JW01CVVNfSURYKFlWWVU4XzJYOF9MRSldID0geworCVtNQlVTX0lEWChZVllVOF8yWDgpXSA9IHsKIAkJLmZvdXJjYwkJCT0gVjRMMl9QSVhfRk1UX1lWWVUsCiAJCS5uYW1lCQkJPSAiWVZZVSIsCiAJCS5iaXRzX3Blcl9zYW1wbGUJPSA4LAogCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HXzJYOF9QQURISSwKIAkJLm9yZGVyCQkJPSBTT0NfTUJVU19PUkRFUl9MRSwKIAl9LAotCVtNQlVTX0lEWChZVVlWOF8yWDhfQkUpXSA9IHsKKwlbTUJVU19JRFgoVVlWWThfMlg4KV0gPSB7CiAJCS5mb3VyY2MJCQk9IFY0TDJfUElYX0ZNVF9VWVZZLAogCQkubmFtZQkJCT0gIlVZVlkiLAogCQkuYml0c19wZXJfc2FtcGxlCT0gOCwKIAkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR18yWDhfUEFESEksCiAJCS5vcmRlcgkJCT0gU09DX01CVVNfT1JERVJfTEUsCiAJfSwKLQlbTUJVU19JRFgoWVZZVThfMlg4X0JFKV0gPSB7CisJW01CVVNfSURYKFZZVVk4XzJYOCldID0gewogCQkuZm91cmNjCQkJPSBWNEwyX1BJWF9GTVRfVllVWSwKIAkJLm5hbWUJCQk9ICJWWVVZIiwKIAkJLmJpdHNfcGVyX3NhbXBsZQk9IDgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOGFkOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2NSArMCwwIEBACi0vKgotICogIFNUVjA2ODAgVVNCIENhbWVyYSBEcml2ZXIsIGJ5IEtldmluIFNpc3NvbiAoa2pzaXNzb25AYmVsbHNvdXRoLm5ldCkKLSAqCi0gKiBUaGFua3MgdG8gU1RNaWNyb2VsZWN0cm9uaWNzIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgdXNiIGNvbW1hbmRzLCBhbmQKLSAqIHRvIFN0ZXZlIE1pbGxlciBhdCBTVE0gZm9yIGhpcyBoZWxwIGFuZCBlbmNvdXJhZ2VtZW50IHdoaWxlIEkgd2FzCi0gKiB3cml0aW5nIHRoaXMgZHJpdmVyLgotICoKLSAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIGhlYXZpbHkgb24gdGhlCi0gKiBFbmRwb2ludHMgKGZvcm1lcmx5IGtub3duIGFzIEFPWCkgc2U0MDEgVVNCIENhbWVyYSBEcml2ZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMCBKZXJvZW4gQi4gVnJlZWtlbiAocGUxcnhxQGFtc2F0Lm9yZykKLSAqCi0gKiBTdGlsbCBzb21ld2hhdCBiYXNlZCBvbiB0aGUgTGludXggb3Y1MTEgZHJpdmVyLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKLSAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIEhpc3Rvcnk6Ci0gKiB2ZXIgMC4xIE9jdG9iZXIsIDIwMDEuIEluaXRpYWwgYXR0ZW1wdC4KLSAqCi0gKiB2ZXIgMC4yIE5vdmVtYmVyLCAyMDAxLiBGaXhlZCBhc2JpbGl0eSB0byByZXNpemUsIGFkZGVkIGJyaWdodG5lc3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBtYWRlIG1vcmUgc3RhYmxlICg/KQotICoKLSAqIHZlciAwLjIxIE5vdiwgMjAwMS4gICAgIEFkZGVkIGdhbW1hIGNvcnJlY3Rpb24gYW5kIHdoaXRlIGJhbGFuY2UsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBkdWUgdG8gQWxleGFuZGVyIFNjaHdhcnR6LiBTdGlsbCB0cnlpbmcgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgc3RhYmxpbGl0eS4gTW92ZWQgc3R1ZmYgaW50byBzdHY2ODAuaAotICoKLSAqIHZlciAwLjIyIE5vdiwgMjAwMS4JICAgQWRkZWQgc2hhcnBlbiBmdW5jdGlvbiAoYnkgTWljaGFlbCBTd2VldCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG1pa2VAZWFzeXN3LmNvbSkgZnJvbSBHSU1QLCBhbHNvIHVzZWQgaW4gcGVuY2FtLgotICogICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlLCBmYXN0LCBnb29kIGludGVnZXIgbWF0aCByb3V0aW5lLgotICoKLSAqIHZlciAwLjIzIERlYywgMjAwMSAoZ2toKQotICogCQkJICAgVG9vayBvdXQgc2hhcnBlbiBmdW5jdGlvbiwgcmFuIGNvZGUgdGhyb3VnaAotICogCQkJICAgTGluZGVudCwgYW5kIGRpZCBvdGhlciBtaW5vciB0d2Vha3MgdG8gZ2V0Ci0gKiAJCQkgICB0aGluZ3MgdG8gd29yayBwcm9wZXJseSB3aXRoIDIuNS4xCi0gKgotICogdmVyIDAuMjQgSmFuLCAyMDAyIChranMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCB0aGUgcHJvYmxlbSB3aXRoIHdlYmNhbSBjcmFzaGluZyBhZnRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgdHdvIHBpY3R1cmVzLiBDaGFuZ2VkIHRoZSB3YXkgcGljIGlzIGhhbHZlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBxdWFsaXR5LiBHb3QgcmlkIG9mIGdyZWVuIGxpbmUgYXJvdW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS4gRml4IGJyaWdodG5lc3MgcmVzZXQgd2hlbiBjaGFuZ2luZyBzaXplCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBidWcuIEFkanVzdGVkIGdhbW1hIGZpbHRlcnMgc2xpZ2h0bHkuCi0gKgotICogdmVyIDAuMjUgSmFuLCAyMDAyIChranMpCi0gKgkJCSAgIEZpeGVkIGEgYnVnIGluIHdoaWNoIHRoZSBkcml2ZXIgc29tZXRpbWVzIGF0dGVtcHRlZAotICoJCQkgICB0byBzZXQgdG8gYSBub24tc3VwcG9ydGVkIHNpemUuIFRoaXMgYWxsb3dlZAotICoJCQkgICBnbm9tZW1lZXRpbmcgdG8gd29yay4KLSAqCQkJICAgRml4ZWQgcHJvYyBlbnRyeSByZW1vdmFsIGJ1Zy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJzdHY2ODAuaCIKLQotc3RhdGljIGludCB2aWRlb19uciA9IC0xOwotCi1zdGF0aWMgaW50IHN3YXBSR0I7CS8qIDAgPSBkZWZhdWx0IGZvciBhdXRvIHNlbGVjdCAqLwotCi0vKiAwID0gZGVmYXVsdCB0byBhbGxvdyBhdXRvIHNlbGVjdDsgLTEgPSBzd2FwIG5ldmVyLCArMSA9IHN3YXAgYWx3YXlzICovCi1zdGF0aWMgaW50IHN3YXBSR0Jfb247Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7Ci0KLSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKLQlkbyB7IFwKLQlpZiAoZGVidWcgPj0gbGV2ZWwpCVwKLQkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiIFslczolZF0gXG4iIGZtdCwJXAotCQkJX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7CVwKLQl9IHdoaWxlICgwKQotCi0KLS8qCi0gKiBWZXJzaW9uIEluZm9ybWF0aW9uCi0gKi8KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjI1IgotI2RlZmluZSBEUklWRVJfQVVUSE9SICJLZXZpbiBTaXNzb24gPGtqc2lzc29uQGJlbGxzb3V0aC5uZXQ+IgotI2RlZmluZSBEUklWRVJfREVTQyAiU1RWMDY4MCBVU0IgQ2FtZXJhIERyaXZlciIKLQotTU9EVUxFX0FVVEhPUiAoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyAoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOwotbW9kdWxlX3BhcmFtKHN3YXBSR0Jfb24sIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDIChzd2FwUkdCX29uLCAiUmVkL2JsdWUgc3dhcDogMT1hbHdheXMsIDA9YXV0bywgLTE9bmV2ZXIiKTsKLW1vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTWVtb3J5IG1hbmFnZW1lbnQKLSAqCi0gKiBUaGlzIGlzIGEgc2hhbWVsZXNzIGNvcHkgZnJvbSB0aGUgVVNCLWNwaWEgZHJpdmVyIChsaW51eCBrZXJuZWwKLSAqIHZlcnNpb24gMi4zLjI5IG9yIHNvLCBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgY29kZSBhY3R1YWxseSBkb2VzIDspLgotICogQWN0dWFsbHkgaXQgc2VlbXMgdG8gYmUgYSBjb3B5IG9mIGEgc2hhbWVsZXNzIGNvcHkgb2YgdGhlIGJ0dHYtZHJpdmVyLgotICogT3IgdGhhdCBpcyBhIGNvcHkgb2YgYSBzaGFtZWxlc3MgY29weSBvZiAuLi4gKFRvIHRoZSBwb3dlcnM6IGlzIHRoZXJlCi0gKiBubyBnZW5lcmljIGtlcm5lbC1mdW5jdGlvbiB0byBkbyB0aGlzIHNvcnQgb2Ygc3R1ZmY/KQotICoKLSAqIFllcywgaXQgd2FzIGEgc2hhbWVsZXNzIGNvcHkgZnJvbSB0aGUgYnR0di1kcml2ZXIuIElJUkMsIEFsYW4gc2F5cwotICogdGhlcmUgd2lsbCBiZSBvbmUsIGJ1dCBhcHBhcmVudGVseSBub3QgeWV0IC1qZXJkZmVsdAotICoKLSAqIFNvIEkgY29waWVkIGl0IGFnYWluIGZvciB0aGUgb3Y1MTEgZHJpdmVyIC1jbGF1ZGlvCi0gKgotICogU2FtZSBmb3IgdGhlIHNlNDAxIGRyaXZlciAtSmVyb2VuCi0gKgotICogQW5kIHRoZSBTVFYwNjgwIGRyaXZlciAtIEtldmluCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCAqcnZtYWxsb2MgKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICptZW07Ci0JdW5zaWduZWQgbG9uZyBhZHI7Ci0KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQltZW0gPSB2bWFsbG9jXzMyIChzaXplKTsKLQlpZiAoIW1lbSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1zZXQgKG1lbSwgMCwgc2l6ZSk7CS8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCi0JYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKLQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCQlhZHIgKz0gUEFHRV9TSVpFOwotCQlzaXplIC09IFBBR0VfU0laRTsKLQl9Ci0JcmV0dXJuIG1lbTsKLX0KLQotc3RhdGljIHZvaWQgcnZmcmVlICh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGFkcjsKLQotCWlmICghbWVtKQotCQlyZXR1cm47Ci0KLQlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOwotCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIHsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JCWFkciArPSBQQUdFX1NJWkU7Ci0JCXNpemUgLT0gUEFHRV9TSVpFOwotCX0KLQl2ZnJlZSAobWVtKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwZW5jYW0gcmVhZC93cml0ZSBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBzdHZfc25kY3RybCAoaW50IHNldCwgc3RydWN0IHVzYl9zdHYgKnN0djY4MCwgdW5zaWduZWQgc2hvcnQgcmVxLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKLXsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlzd2l0Y2ggKHNldCkgewotCWNhc2UgMDoJCS8qICAweGMxICAqLwotCQlyZXQgPSB1c2JfY29udHJvbF9tc2cgKHN0djY4MC0+dWRldiwKLQkJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlIChzdHY2ODAtPnVkZXYsIDApLAotCQkJCSAgICAgICByZXEsCi0JCQkJICAgICAgIChVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5UKSwKLQkJCQkgICAgICAgdmFsdWUsIDAsIGJ1ZmZlciwgc2l6ZSwgUEVOQ0FNX1RJTUVPVVQpOwotCQlicmVhazsKLQotCWNhc2UgMToJCS8qICAweDQxICAqLwotCQlyZXQgPSB1c2JfY29udHJvbF9tc2cgKHN0djY4MC0+dWRldiwKLQkJCQkgICAgICAgdXNiX3NuZGN0cmxwaXBlIChzdHY2ODAtPnVkZXYsIDApLAotCQkJCSAgICAgICByZXEsCi0JCQkJICAgICAgIChVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVCksCi0JCQkJICAgICAgIHZhbHVlLCAwLCBidWZmZXIsIHNpemUsIFBFTkNBTV9USU1FT1VUKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDI6CQkvKiAgMHg4MCAgKi8KLQkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnIChzdHY2ODAtPnVkZXYsCi0JCQkJICAgICAgIHVzYl9yY3ZjdHJscGlwZSAoc3R2NjgwLT51ZGV2LCAwKSwKLQkJCQkgICAgICAgcmVxLAotCQkJCSAgICAgICAoVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9ERVZJQ0UpLAotCQkJCSAgICAgICB2YWx1ZSwgMCwgYnVmZmVyLCBzaXplLCBQRU5DQU1fVElNRU9VVCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgkJLyogIDB4NDAgICovCi0JCXJldCA9IHVzYl9jb250cm9sX21zZyAoc3R2NjgwLT51ZGV2LAotCQkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUgKHN0djY4MC0+dWRldiwgMCksCi0JCQkJICAgICAgIHJlcSwKLQkJCQkgICAgICAgKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSksCi0JCQkJICAgICAgIHZhbHVlLCAwLCBidWZmZXIsIHNpemUsIFBFTkNBTV9USU1FT1VUKTsKLQkJYnJlYWs7Ci0KLQl9Ci0JaWYgKChyZXQgPCAwKSAmJiAocmVxICE9IDB4MGEpKSB7Ci0JCVBERUJVRyAoMSwgIlNUVihlKTogdXNiX2NvbnRyb2xfbXNnIGVycm9yICVpLCByZXF1ZXN0ID0gMHgleCwgZXJyb3IgPSAlaSIsIHNldCwgcmVxLCByZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN0dl9zZXRfY29uZmlnIChzdHJ1Y3QgdXNiX3N0diAqZGV2LCBpbnQgY29uZmlndXJhdGlvbiwgaW50IGludGVyZmFjZSwgaW50IGFsdGVybmF0ZSkKLXsKLQotCWlmIChjb25maWd1cmF0aW9uICE9IGRldi0+dWRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUKLQkJCXx8IHVzYl9yZXNldF9jb25maWd1cmF0aW9uIChkZXYtPnVkZXYpIDwgMCkgewotCQlQREVCVUcgKDEsICJTVFYoZSk6IEZBSUxFRCB0byByZXNldCBjb25maWd1cmF0aW9uICVpIiwgY29uZmlndXJhdGlvbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHVzYl9zZXRfaW50ZXJmYWNlIChkZXYtPnVkZXYsIGludGVyZmFjZSwgYWx0ZXJuYXRlKSA8IDApIHsKLQkJUERFQlVHICgxLCAiU1RWKGUpOiBGQUlMRUQgdG8gc2V0IGFsdGVybmF0ZSBpbnRlcmZhY2UgJWkiLCBhbHRlcm5hdGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0dl9zdG9wX3ZpZGVvIChzdHJ1Y3QgdXNiX3N0diAqZGV2KQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IGttYWxsb2MgKDQwLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBPdXQgb2YgKHNtYWxsIGJ1ZikgbWVtb3J5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiB0aGlzIGlzIGEgaGlnaCBwcmlvcml0eSBjb21tYW5kOyBpdCBzdG9wcyBhbGwgbG93ZXIgb3JkZXIgY29tbWFuZHMgKi8KLQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMSwgZGV2LCAweDA0LCAweDAwMDAsIGJ1ZiwgMHgwKSkgPCAwKSB7Ci0JCWkgPSBzdHZfc25kY3RybCAoMCwgZGV2LCAweDgwLCAwLCBidWYsIDB4MDIpOwkvKiBHZXQgTGFzdCBFcnJvcjsgMiA9IGJ1c3kgKi8KLQkJUERFQlVHICgxLCAiU1RWKGkpOiBsYXN0IGVycm9yOiAlaSwgIGNvbW1hbmQgPSAweCV4IiwgYnVmWzBdLCBidWZbMV0pOwotCX0gZWxzZSB7Ci0JCVBERUJVRyAoMSwgIlNUVihpKTogQ2FtZXJhIHJlc2V0IHRvIGlkbGUgbW9kZS4iKTsKLQl9Ci0KLQlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoZGV2LCAxLCAwLCAwKSkgPCAwKQotCQlQREVCVUcgKDEsICJTVFYoZSk6IFJlc2V0IGNvbmZpZyBkdXJpbmcgZXhpdCBmYWlsZWQiKTsKLQotCS8qICBnZXQgY3VycmVudCBtb2RlICAqLwotCWJ1ZlswXSA9IDB4ZjA7Ci0JaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIGRldiwgMHg4NywgMCwgYnVmLCAweDA4KSkgIT0gMHgwOCkJLyogZ2V0IG1vZGUgKi8KLQkJUERFQlVHICgwLCAiU1RWKGUpOiBTdG9wX3ZpZGVvOiBwcm9ibGVtIHNldHRpbmcgb3JpZ2luYWwgbW9kZSIpOwotCWlmIChkZXYtPm9yaWdNb2RlICE9IGJ1ZlswXSkgewotCQltZW1zZXQgKGJ1ZiwgMCwgOCk7Ci0JCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSBkZXYtPm9yaWdNb2RlOwotCQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMywgZGV2LCAweDA3LCAweDAxMDAsIGJ1ZiwgMHgwOCkpICE9IDB4MDgpIHsKLQkJCVBERUJVRyAoMCwgIlNUVihlKTogU3RvcF92aWRlbzogU2V0X0NhbWVyYV9Nb2RlIGZhaWxlZCIpOwotCQkJaSA9IC0xOwotCQl9Ci0JCWJ1ZlswXSA9IDB4ZjA7Ci0JCWkgPSBzdHZfc25kY3RybCAoMCwgZGV2LCAweDg3LCAwLCBidWYsIDB4MDgpOwotCQlpZiAoKGkgIT0gMHgwOCkgfHwgKGJ1ZlswXSAhPSBkZXYtPm9yaWdNb2RlKSkgewotCQkJUERFQlVHICgwLCAiU1RWKGUpOiBjYW1lcmEgTk9UIHNldCB0byBvcmlnaW5hbCByZXNvbHV0aW9uLiIpOwotCQkJaSA9IC0xOwotCQl9IGVsc2UKLQkJCVBERUJVRyAoMCwgIlNUVihpKTogQ2FtZXJhIHNldCB0byBvcmlnaW5hbCByZXNvbHV0aW9uIik7Ci0JfQotCS8qIG9yaWdNb2RlICovCi0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gaTsKLX0KLQotc3RhdGljIGludCBzdHZfc2V0X3ZpZGVvX21vZGUgKHN0cnVjdCB1c2Jfc3R2ICpkZXYpCi17Ci0JaW50IGksIHN0b3BfdmlkZW8gPSAxOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IGttYWxsb2MgKDQwLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBPdXQgb2YgKHNtYWxsIGJ1ZikgbWVtb3J5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoZGV2LCAxLCAwLCAwKSkgPCAwKSB7Ci0JCWtmcmVlKGJ1Zik7Ci0JCXJldHVybiBpOwotCX0KLQotCWkgPSBzdHZfc25kY3RybCAoMiwgZGV2LCAweDA2LCAweDAxMDAsIGJ1ZiwgMHgxMik7Ci0JaWYgKCEoaSA+IDApICYmIChidWZbOF0gPT0gMHg1MykgJiYgKGJ1Zls5XSA9PSAweDA1KSkgewotCQlQREVCVUcgKDEsICJTVFYoZSk6IENvdWxkIG5vdCBnZXQgZGVzY3JpcHRvciAwMTAwLiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qICBzZXQgYWx0ZXJuYXRlIGludGVyZmFjZSAxICovCi0JaWYgKChpID0gc3R2X3NldF9jb25maWcgKGRldiwgMSwgMCwgMSkpIDwgMCkKLQkJZ290byBlcnJvcjsKLQotCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBkZXYsIDB4ODUsIDAsIGJ1ZiwgMHgxMCkpICE9IDB4MTApCi0JCWdvdG8gZXJyb3I7Ci0JUERFQlVHICgxLCAiU1RWKGkpOiBTZXR0aW5nIHZpZGVvIG1vZGUuIik7Ci0JLyogIFN3aXRjaCB0byBWaWRlbyBtb2RlOiAweDAxMDAgPSBWR0EgKDY0MHg0ODApLCAweDAwMDAgPSBDSUYgKDM1MngyODgpIDB4MDMwMCA9IFFWR0EgKDMyMHgyNDApICAqLwotCWlmICgoaSA9IHN0dl9zbmRjdHJsICgxLCBkZXYsIDB4MDksIGRldi0+VmlkZW9Nb2RlLCBidWYsIDB4MCkpIDwgMCkgewotCQlzdG9wX3ZpZGVvID0gMDsKLQkJZ290byBlcnJvcjsKLQl9Ci0JZ290byBleGl0OwotCi1lcnJvcjoKLQlrZnJlZShidWYpOwotCWlmIChzdG9wX3ZpZGVvID09IDEpCi0JCXN0dl9zdG9wX3ZpZGVvIChkZXYpOwotCXJldHVybiAtMTsKLQotZXhpdDoKLQlrZnJlZShidWYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0dl9pbml0IChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwKQotewotCWludCBpID0gMDsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0JdW5zaWduZWQgbG9uZyBpbnQgYnVmc2l6ZTsKLQotCWJ1ZmZlciA9IGt6YWxsb2MgKDQwLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBPdXQgb2YgKHNtYWxsIGJ1ZikgbWVtb3J5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdWRlbGF5ICgxMDApOwotCi0JLyogc2V0IGNvbmZpZyAxLCBpbnRlcmZhY2UgMCwgYWx0ZXJuYXRlIDAgKi8KLQlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoc3R2NjgwLCAxLCAwLCAwKSkgPCAwKSB7Ci0JCWtmcmVlKGJ1ZmZlcik7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogc2V0IGNvbmZpZyAxLDAsMCBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBwaW5nIGNhbWVyYSB0byBiZSBzdXJlIFNUVjA2ODAgaXMgcHJlc2VudCAqLwotCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4ODgsIDB4NTY3OCwgYnVmZmVyLCAweDAyKSkgIT0gMHgwMikKLQkJZ290byBlcnJvcjsKLQlpZiAoKGJ1ZmZlclswXSAhPSAweDU2KSB8fCAoYnVmZmVyWzFdICE9IDB4NzgpKSB7Ci0JCVBERUJVRyAoMSwgIlNUVihlKTogY2FtZXJhIHBpbmcgZmFpbGVkISEiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBnZXQgY2FtZXJhIGRlc2NyaXB0b3IgKi8KLQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMiwgc3R2NjgwLCAweDA2LCAweDAyMDAsIGJ1ZmZlciwgMHgwOSkpICE9IDB4MDkpCi0JCWdvdG8gZXJyb3I7Ci0JaSA9IHN0dl9zbmRjdHJsICgyLCBzdHY2ODAsIDB4MDYsIDB4MDIwMCwgYnVmZmVyLCAweDIyKTsKLQlpZiAoIShpID49IDApICYmIChidWZmZXJbN10gPT0gMHhhMCkgJiYgKGJ1ZmZlcls4XSA9PSAweDIzKSkgewotCQlQREVCVUcgKDEsICJTVFYoZSk6IENvdWxkIG5vdCBnZXQgZGVzY3JpcHRvciAwMjAwLiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDhhLCAwLCBidWZmZXIsIDB4MDIpKSAhPSAweDAyKQotCQlnb3RvIGVycm9yOwotCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4OGIsIDAsIGJ1ZmZlciwgMHgyNCkpICE9IDB4MjQpCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4NSwgMCwgYnVmZmVyLCAweDEwKSkgIT0gMHgxMCkKLQkJZ290byBlcnJvcjsKLQotCXN0djY4MC0+U3VwcG9ydGVkTW9kZXMgPSBidWZmZXJbN107Ci0JaSA9IHN0djY4MC0+U3VwcG9ydGVkTW9kZXM7Ci0Jc3R2NjgwLT5DSUYgPSAwOwotCXN0djY4MC0+VkdBID0gMDsKLQlzdHY2ODAtPlFWR0EgPSAwOwotCWlmIChpICYgMSkKLQkJc3R2NjgwLT5DSUYgPSAxOwotCWlmIChpICYgMikKLQkJc3R2NjgwLT5WR0EgPSAxOwotCWlmIChpICYgOCkKLQkJc3R2NjgwLT5RVkdBID0gMTsKLQlpZiAoc3R2NjgwLT5TdXBwb3J0ZWRNb2RlcyA9PSAwKSB7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogVGhlcmUgYXJlIE5PIHN1cHBvcnRlZCBTVFY2ODAgbW9kZXMhISIpOwotCQlpID0gLTE7Ci0JCWdvdG8gZXJyb3I7Ci0JfSBlbHNlIHsKLQkJaWYgKHN0djY4MC0+Q0lGKQotCQkJUERFQlVHICgwLCAiU1RWKGkpOiBDSUYgaXMgc3VwcG9ydGVkIik7Ci0JCWlmIChzdHY2ODAtPlFWR0EpCi0JCQlQREVCVUcgKDAsICJTVFYoaSk6IFFWR0EgaXMgc3VwcG9ydGVkIik7Ci0JfQotCS8qIEZXIHJldiwgQVNJQyByZXYsIHNlbnNvciBJRCAgKi8KLQlQREVCVUcgKDEsICJTVFYoaSk6IEZpcm13YXJlIHJldiBpcyAlaS4laSIsIGJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKLQlQREVCVUcgKDEsICJTVFYoaSk6IEFTSUMgcmV2IGlzICVpLiVpIiwgYnVmZmVyWzJdLCBidWZmZXJbM10pOwotCVBERUJVRyAoMSwgIlNUVihpKTogU2Vuc29yIElEIGlzICVpIiwgKGJ1ZmZlcls0XSoxNikgKyAoYnVmZmVyWzVdPj40KSk7Ci0KLQkvKiAgc2V0IGFsdGVybmF0ZSBpbnRlcmZhY2UgMSAqLwotCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChzdHY2ODAsIDEsIDAsIDEpKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDg1LCAwLCBidWZmZXIsIDB4MTApKSAhPSAweDEwKQotCQlnb3RvIGVycm9yOwotCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4OGQsIDAsIGJ1ZmZlciwgMHgwOCkpICE9IDB4MDgpCi0JCWdvdG8gZXJyb3I7Ci0JaSA9IGJ1ZmZlclszXTsKLQlQREVCVUcgKDAsICJTVFYoaSk6IENhbWVyYSBoYXMgJWkgcGljdHVyZXMuIiwgaSk7Ci0KLQkvKiAgZ2V0IGN1cnJlbnQgbW9kZSAqLwotCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4ODcsIDAsIGJ1ZmZlciwgMHgwOCkpICE9IDB4MDgpCi0JCWdvdG8gZXJyb3I7Ci0Jc3R2NjgwLT5vcmlnTW9kZSA9IGJ1ZmZlclswXTsJLyogMDEgPSBWR0EsIDAzID0gUVZHQSwgMDAgPSBDSUYgKi8KLQotCS8qIFRoaXMgd2lsbCBhdHRlbXAgQ0lGIG1vZGUsIGlmIHN1cHBvcnRlZC4gSWYgbm90LCBzZXQgdG8gUVZHQSAgKi8KLQltZW1zZXQgKGJ1ZmZlciwgMCwgOCk7Ci0JaWYgKHN0djY4MC0+Q0lGKQotCQlidWZmZXJbMF0gPSAweDAwOwotCWVsc2UgaWYgKHN0djY4MC0+UVZHQSkKLQkJYnVmZmVyWzBdID0gMHgwMzsKLQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMywgc3R2NjgwLCAweDA3LCAweDAxMDAsIGJ1ZmZlciwgMHgwOCkpICE9IDB4MDgpIHsKLQkJUERFQlVHICgwLCAiU1RWKGkpOiBTZXRfQ2FtZXJhX01vZGUgZmFpbGVkIik7Ci0JCWkgPSAtMTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JYnVmZmVyWzBdID0gMHhmMDsKLQlzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDg3LCAwLCBidWZmZXIsIDB4MDgpOwotCWlmICgoKHN0djY4MC0+Q0lGID09IDEpICYmIChidWZmZXJbMF0gIT0gMHgwMCkpIHx8ICgoc3R2NjgwLT5RVkdBID09IDEpICYmIChidWZmZXJbMF0gIT0gMHgwMykpKSB7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogRXJyb3Igc2V0dGluZyBjYW1lcmEgdmlkZW8gbW9kZSEiKTsKLQkJaSA9IC0xOwotCQlnb3RvIGVycm9yOwotCX0gZWxzZSB7Ci0JCWlmIChidWZmZXJbMF0gPT0gMCkgewotCQkJc3R2NjgwLT5WaWRlb01vZGUgPSAweDAwMDA7Ci0JCQlQREVCVUcgKDAsICJTVFYoaSk6IFZpZGVvIE1vZGUgc2V0IHRvIENJRiIpOwotCQl9Ci0JCWlmIChidWZmZXJbMF0gPT0gMHgwMykgewotCQkJc3R2NjgwLT5WaWRlb01vZGUgPSAweDAzMDA7Ci0JCQlQREVCVUcgKDAsICJTVFYoaSk6IFZpZGVvIE1vZGUgc2V0IHRvIFFWR0EiKTsKLQkJfQotCX0KLQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDhmLCAwLCBidWZmZXIsIDB4MTApKSAhPSAweDEwKQotCQlnb3RvIGVycm9yOwotCWJ1ZnNpemUgPSAoYnVmZmVyWzBdIDw8IDI0KSB8IChidWZmZXJbMV0gPDwgMTYpIHwgKGJ1ZmZlclsyXSA8PCA4KSB8IChidWZmZXJbM10pOwotCXN0djY4MC0+Y3dpZHRoID0gKGJ1ZmZlcls0XSA8PCA4KSB8IChidWZmZXJbNV0pOwkvKiAtPmNhbWVyYSA9IDMyMiwgMzU2LCA2NDQgICovCi0Jc3R2NjgwLT5jaGVpZ2h0ID0gKGJ1ZmZlcls2XSA8PCA4KSB8IChidWZmZXJbN10pOwkvKiAtPmNhbWVyYSA9IDI0MiwgMjkyLCA0ODQgICovCi0Jc3R2NjgwLT5vcmlnR2FpbiA9IGJ1ZmZlclsxMl07Ci0KLQlnb3RvIGV4aXQ7Ci0KLWVycm9yOgotCWkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDgwLCAwLCBidWZmZXIsIDB4MDIpOwkvKiBHZXQgTGFzdCBFcnJvciAqLwotCVBERUJVRyAoMSwgIlNUVihpKTogbGFzdCBlcnJvcjogJWksICBjb21tYW5kID0gMHgleCIsIGJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKLQlrZnJlZShidWZmZXIpOwotCXJldHVybiAtMTsKLQotZXhpdDoKLQlrZnJlZShidWZmZXIpOwotCi0JLyogdmlkZW8gPSAzMjB4MjQwLCAzNTJ4Mjg4ICovCi0JaWYgKHN0djY4MC0+Q0lGID09IDEpIHsKLQkJc3R2NjgwLT5tYXh3aWR0aCA9IDM1MjsKLQkJc3R2NjgwLT5tYXhoZWlnaHQgPSAyODg7Ci0JCXN0djY4MC0+dndpZHRoID0gMzUyOwotCQlzdHY2ODAtPnZoZWlnaHQgPSAyODg7Ci0JfQotCWlmIChzdHY2ODAtPlFWR0EgPT0gMSkgewotCQlzdHY2ODAtPm1heHdpZHRoID0gMzIwOwotCQlzdHY2ODAtPm1heGhlaWdodCA9IDI0MDsKLQkJc3R2NjgwLT52d2lkdGggPSAzMjA7Ci0JCXN0djY4MC0+dmhlaWdodCA9IDI0MDsKLQl9Ci0KLQlzdHY2ODAtPnJhd2J1ZnNpemUgPSBidWZzaXplOwkvKiBtdXN0IGJlIC4vLiBieSA4ICovCi0Jc3R2NjgwLT5tYXhmcmFtZXNpemUgPSBidWZzaXplICogMzsJLyogUkdCIHNpemUgKi8KLQlQREVCVUcgKDIsICJTVFYoaSk6IGN3aWR0aCA9ICVpLCBjaGVpZ2h0ID0gJWkiLCBzdHY2ODAtPmN3aWR0aCwgc3R2NjgwLT5jaGVpZ2h0KTsKLQlQREVCVUcgKDEsICJTVFYoaSk6IHdpZHRoID0gJWksIGhlaWdodCA9ICVpLCByYXdidWZzaXplID0gJWxpIiwgc3R2NjgwLT52d2lkdGgsIHN0djY4MC0+dmhlaWdodCwgc3R2NjgwLT5yYXdidWZzaXplKTsKLQotCS8qIHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KLQlzdHY2ODAtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gMHg4MjsKLQlzdHY2ODAtPmRyb3BwZWQgPSAwOwotCXN0djY4MC0+ZXJyb3IgPSAwOwotCXN0djY4MC0+ZnJhbWVjb3VudCA9IDA7Ci0Jc3R2NjgwLT5yZWFkY291bnQgPSAwOwotCXN0djY4MC0+c3RyZWFtaW5nID0gMDsKLQkvKiBicmlnaHQsIHdoaXRlLCBjb2xvdXIsIGh1ZSwgY29udHJhc3QgYXJlIHNldCBieSBzb2Z0d2FyZSwgbm90IGluIHN0djA2ODAgKi8KLQlzdHY2ODAtPmJyaWdodG5lc3MgPSAzMjc2NzsKLQlzdHY2ODAtPmNoZ2JyaWdodCA9IDA7Ci0Jc3R2NjgwLT53aGl0ZW5lc3MgPSAwOwkvKiBvbmx5IGZvciBncmV5c2NhbGUgKi8KLQlzdHY2ODAtPmNvbG91ciA9IDMyNzY3OwotCXN0djY4MC0+Y29udHJhc3QgPSAzMjc2NzsKLQlzdHY2ODAtPmh1ZSA9IDMyNzY3OwotCXN0djY4MC0+cGFsZXR0ZSA9IFNUVl9WSURFT19QQUxFVFRFOwotCXN0djY4MC0+ZGVwdGggPSAyNDsJLyogcmdiMjQgYml0cyAqLwotCWlmICgoc3dhcFJHQl9vbiA9PSAwKSAmJiAoc3dhcFJHQiA9PSAwKSkKLQkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChhdXRvKSBPRkYiKTsKLQllbHNlIGlmICgoc3dhcFJHQl9vbiA9PSAwKSAmJiAoc3dhcFJHQiA9PSAxKSkKLQkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChhdXRvKSBPTiIpOwotCWVsc2UgaWYgKHN3YXBSR0Jfb24gPT0gMSkKLQkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChmb3JjZWQpIE9OIik7Ci0JZWxzZSBpZiAoc3dhcFJHQl9vbiA9PSAtMSkKLQkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChmb3JjZWQpIE9GRiIpOwotCi0JaWYgKHN0dl9zZXRfdmlkZW9fbW9kZSAoc3R2NjgwKSA8IDApIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qgc2V0IHZpZGVvIG1vZGUgaW4gc3R2X2luaXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKiogbGFzdCBvZiBwZW5jYW0gIHJvdXRpbmVzICAqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHN5c2ZzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBzdHY2ODBfZmlsZShuYW1lLCB2YXJpYWJsZSwgZmllbGQpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKmNsYXNzX2RldiwJCQlcCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2xhc3NfZGV2KTsJCVwKLQlzdHJ1Y3QgdXNiX3N0diAqc3R2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CQkJXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgZmllbGQsIHN0di0+dmFyaWFibGUpOwkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpOwotCi1zdHY2ODBfZmlsZShtb2RlbCwgY2FtZXJhX25hbWUsICIlc1xuIik7Ci1zdHY2ODBfZmlsZShpbl91c2UsIHVzZXIsICIlZFxuIik7Ci1zdHY2ODBfZmlsZShzdHJlYW1pbmcsIHN0cmVhbWluZywgIiVkXG4iKTsKLXN0djY4MF9maWxlKHBhbGV0dGUsIHBhbGV0dGUsICIlaVxuIik7Ci1zdHY2ODBfZmlsZShmcmFtZXNfdG90YWwsIHJlYWRjb3VudCwgIiVkXG4iKTsKLXN0djY4MF9maWxlKGZyYW1lc19yZWFkLCBmcmFtZWNvdW50LCAiJWRcbiIpOwotc3R2NjgwX2ZpbGUocGFja2V0c19kcm9wcGVkLCBkcm9wcGVkLCAiJWRcbiIpOwotc3R2NjgwX2ZpbGUoZGVjb2RpbmdfZXJyb3JzLCBlcnJvciwgIiVkXG4iKTsKLQotc3RhdGljIGludCBzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX21vZGVsKTsKLQlpZiAocmMpIGdvdG8gZXJyOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9pbl91c2UpOwotCWlmIChyYykgZ290byBlcnJfbW9kZWw7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3N0cmVhbWluZyk7Ci0JaWYgKHJjKSBnb3RvIGVycl9pbnVzZTsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfcGFsZXR0ZSk7Ci0JaWYgKHJjKSBnb3RvIGVycl9zdHJlYW07Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2ZyYW1lc190b3RhbCk7Ci0JaWYgKHJjKSBnb3RvIGVycl9wYWw7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2ZyYW1lc19yZWFkKTsKLQlpZiAocmMpIGdvdG8gZXJyX2ZyYW10b3Q7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3BhY2tldHNfZHJvcHBlZCk7Ci0JaWYgKHJjKSBnb3RvIGVycl9mcmFtcmVhZDsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfZGVjb2RpbmdfZXJyb3JzKTsKLQlpZiAocmMpIGdvdG8gZXJyX2Ryb3BwZWQ7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2Ryb3BwZWQ6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9wYWNrZXRzX2Ryb3BwZWQpOwotZXJyX2ZyYW1yZWFkOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfZnJhbWVzX3JlYWQpOwotZXJyX2ZyYW10b3Q6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9mcmFtZXNfdG90YWwpOwotZXJyX3BhbDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3BhbGV0dGUpOwotZXJyX3N0cmVhbToKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3N0cmVhbWluZyk7Ci1lcnJfaW51c2U6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9pbl91c2UpOwotZXJyX21vZGVsOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfbW9kZWwpOwotZXJyOgotCVBERUJVRygwLCAiU1RWKGUpOiBDb3VsZCBub3QgY3JlYXRlIHN5c2ZzIGZpbGVzIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBzdHY2ODBfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RlbCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9pbl91c2UpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfc3RyZWFtaW5nKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3BhbGV0dGUpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfZnJhbWVzX3RvdGFsKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2ZyYW1lc19yZWFkKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX3BhY2tldHNfZHJvcHBlZCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9kZWNvZGluZ19lcnJvcnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENhbWVyYSBjb250cm9sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBzdHY2ODBfZ2V0X3BpY3QgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIHN0cnVjdCB2aWRlb19waWN0dXJlICpwKQotewotCS8qIFRoaXMgc2V0cyB2YWx1ZXMgZm9yIHY0bCBpbnRlcmZhY2UuIG1heC9taW4gPSA2NTUzNS8wICAqLwotCi0JcC0+YnJpZ2h0bmVzcyA9IHN0djY4MC0+YnJpZ2h0bmVzczsKLQlwLT53aGl0ZW5lc3MgPSBzdHY2ODAtPndoaXRlbmVzczsJLyogZ3JleXNjYWxlICovCi0JcC0+Y29sb3VyID0gc3R2NjgwLT5jb2xvdXI7Ci0JcC0+Y29udHJhc3QgPSBzdHY2ODAtPmNvbnRyYXN0OwotCXAtPmh1ZSA9IHN0djY4MC0+aHVlOwotCXAtPnBhbGV0dGUgPSBzdHY2ODAtPnBhbGV0dGU7Ci0JcC0+ZGVwdGggPSBzdHY2ODAtPmRlcHRoOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0djY4MF9zZXRfcGljdCAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCwgc3RydWN0IHZpZGVvX3BpY3R1cmUgKnApCi17Ci0JLyogU2VlIGFib3ZlIHN0djY4MF9nZXRfcGljdCAgKi8KLQotCWlmIChwLT5wYWxldHRlICE9IFNUVl9WSURFT19QQUxFVFRFKSB7Ci0JCVBERUJVRyAoMiwgIlNUVihlKTogUGFsZXR0ZSBzZXQgZXJyb3IgaW4gX3NldF9waWMiKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHN0djY4MC0+YnJpZ2h0bmVzcyAhPSBwLT5icmlnaHRuZXNzKSB7Ci0JCXN0djY4MC0+Y2hnYnJpZ2h0ID0gMTsKLQkJc3R2NjgwLT5icmlnaHRuZXNzID0gcC0+YnJpZ2h0bmVzczsKLQl9Ci0KLQlzdHY2ODAtPndoaXRlbmVzcyA9IHAtPndoaXRlbmVzczsJLyogZ3JleXNjYWxlICovCi0Jc3R2NjgwLT5jb2xvdXIgPSBwLT5jb2xvdXI7Ci0Jc3R2NjgwLT5jb250cmFzdCA9IHAtPmNvbnRyYXN0OwotCXN0djY4MC0+aHVlID0gcC0+aHVlOwotCXN0djY4MC0+cGFsZXR0ZSA9IHAtPnBhbGV0dGU7Ci0Jc3R2NjgwLT5kZXB0aCA9IHAtPmRlcHRoOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0djY4MF92aWRlb19pcnEgKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdXJiLT5jb250ZXh0OwotCWludCBsZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0KLQlpZiAobGVuZ3RoIDwgc3R2NjgwLT5yYXdidWZzaXplKQotCQlQREVCVUcgKDIsICJTVFYoaSk6IExvc3QgZGF0YSBpbiB0cmFuc2ZlcjogZXhwICVsaSwgZ290ICVpIiwgc3R2NjgwLT5yYXdidWZzaXplLCBsZW5ndGgpOwotCi0JLyogb2hvaC4uLiAqLwotCWlmICghc3R2NjgwLT5zdHJlYW1pbmcpCi0JCXJldHVybjsKLQotCWlmICghc3R2NjgwLT51ZGV2KSB7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogZGV2aWNlIHZhcG91cmlzaGVkIGluIHZpZGVvX2lycSIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogMCBzaXplZCBwYWNrZXRzIGhhcHBlbiBpZiB3ZSBhcmUgdG8gZmFzdCwgYnV0IHNvbWV0aW1lcyB0aGUgY2FtZXJhCi0JICAga2VlcHMgc2VuZGluZyB0aGVtIGZvcmV2ZXIuLi4KLQkgKi8KLQlpZiAobGVuZ3RoICYmICF1cmItPnN0YXR1cykgewotCQlzdHY2ODAtPm51bGxwYWNrZXRzID0gMDsKLQkJc3dpdGNoIChzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX25leHRdLnN0YXRlKSB7Ci0JCWNhc2UgQlVGRkVSX1JFQURZOgotCQljYXNlIEJVRkZFUl9CVVNZOgotCQkJc3R2NjgwLT5kcm9wcGVkKys7Ci0JCQlicmVhazsKLQotCQljYXNlIEJVRkZFUl9VTlVTRUQ6Ci0JCQltZW1jcHkgKHN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfbmV4dF0uZGF0YSwKLQkJCQkodW5zaWduZWQgY2hhciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlciwgbGVuZ3RoKTsKLQkJCXN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfbmV4dF0uc3RhdGUgPSBCVUZGRVJfUkVBRFk7Ci0JCQlzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX25leHRdLmxlbmd0aCA9IGxlbmd0aDsKLQkJCWlmICh3YWl0cXVldWVfYWN0aXZlICgmc3R2NjgwLT53cSkpIHsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZzdHY2ODAtPndxKTsKLQkJCX0KLQkJCXN0djY4MC0+c2NyYXRjaF9vdmVyZmxvdyA9IDA7Ci0JCQlzdHY2ODAtPnNjcmF0Y2hfbmV4dCsrOwotCQkJaWYgKHN0djY4MC0+c2NyYXRjaF9uZXh0ID49IFNUVjY4MF9OVU1TQ1JBVENIKQotCQkJCXN0djY4MC0+c2NyYXRjaF9uZXh0ID0gMDsKLQkJCWJyZWFrOwotCQl9CQkvKiBzd2l0Y2ggICovCi0JfSBlbHNlIHsKLQkJc3R2NjgwLT5udWxscGFja2V0cysrOwotCQlpZiAoc3R2NjgwLT5udWxscGFja2V0cyA+IFNUVjY4MF9NQVhfTlVMTFBBQ0tFVFMpIHsKLQkJCWlmICh3YWl0cXVldWVfYWN0aXZlICgmc3R2NjgwLT53cSkpIHsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZzdHY2ODAtPndxKTsKLQkJCX0KLQkJfQotCX0JCQkvKiAgaWYgLSBlbHNlICovCi0KLQkvKiBSZXN1Ym1pdCB1cmIgZm9yIG5ldyBkYXRhICovCi0JdXJiLT5zdGF0dXMgPSAwOwotCXVyYi0+ZGV2ID0gc3R2NjgwLT51ZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKSkKLQkJUERFQlVHICgwLCAiU1RWKGUpOiB1cmIgYnVybmVkIGRvd24gaW4gdmlkZW8gaXJxIik7Ci0JcmV0dXJuOwotfQkJCQkvKiAgX3ZpZGVvX2lycSAgKi8KLQotc3RhdGljIGludCBzdHY2ODBfc3RhcnRfc3RyZWFtIChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwKQotewotCXN0cnVjdCB1cmIgKnVyYjsKLQlpbnQgZXJyID0gMCwgaTsKLQotCXN0djY4MC0+c3RyZWFtaW5nID0gMTsKLQotCS8qIERvIHNvbWUgbWVtb3J5IGFsbG9jYXRpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTUZSQU1FUzsgaSsrKSB7Ci0JCXN0djY4MC0+ZnJhbWVbaV0uZGF0YSA9IHN0djY4MC0+ZmJ1ZiArIGkgKiBzdHY2ODAtPm1heGZyYW1lc2l6ZTsKLQkJc3R2NjgwLT5mcmFtZVtpXS5jdXJwaXggPSAwOwotCX0KLQkvKiBwYWNrZXQgc2l6ZSA9IDQwOTYgICovCi0JZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQlVGOyBpKyspIHsKLQkJc3R2NjgwLT5zYnVmW2ldLmRhdGEgPSBrbWFsbG9jIChzdHY2ODAtPnJhd2J1ZnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoc3R2NjgwLT5zYnVmW2ldLmRhdGEgPT0gTlVMTCkgewotCQkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qga21hbGxvYyByYXcgZGF0YSBidWZmZXIgJWkiLCBpKTsKLQkJCWdvdG8gbm9tZW1fZXJyOwotCQl9Ci0JfQotCi0Jc3R2NjgwLT5zY3JhdGNoX25leHQgPSAwOwotCXN0djY4MC0+c2NyYXRjaF91c2UgPSAwOwotCXN0djY4MC0+c2NyYXRjaF9vdmVyZmxvdyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQ1JBVENIOyBpKyspIHsKLQkJc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEgPSBrbWFsbG9jIChzdHY2ODAtPnJhd2J1ZnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEgPT0gTlVMTCkgewotCQkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qga21hbGxvYyByYXcgc2NyYXRjaCBidWZmZXIgJWkiLCBpKTsKLQkJCWdvdG8gbm9tZW1fZXJyOwotCQl9Ci0JCXN0djY4MC0+c2NyYXRjaFtpXS5zdGF0ZSA9IEJVRkZFUl9VTlVTRUQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQlVGOyBpKyspIHsKLQkJdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKQotCQkJZ290byBub21lbV9lcnI7Ci0KLQkJLyogc2J1ZiBpcyB1cmItPnRyYW5zZmVyX2J1ZmZlciwgbGF0ZXIgZ2V0cyBtZW1jcHllZCB0byBzY3JhdGNoICovCi0JCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIHN0djY4MC0+dWRldiwKLQkJCQkgICB1c2JfcmN2YnVsa3BpcGUgKHN0djY4MC0+dWRldiwgc3R2NjgwLT5idWxrX2luX2VuZHBvaW50QWRkciksCi0JCQkJICAgc3R2NjgwLT5zYnVmW2ldLmRhdGEsIHN0djY4MC0+cmF3YnVmc2l6ZSwKLQkJCQkgICBzdHY2ODBfdmlkZW9faXJxLCBzdHY2ODApOwotCQlzdHY2ODAtPnVyYltpXSA9IHVyYjsKLQkJZXJyID0gdXNiX3N1Ym1pdF91cmIgKHN0djY4MC0+dXJiW2ldLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVycikgewotCQkJUERFQlVHICgwLCAiU1RWKGUpOiB1cmIgYnVybmVkIGRvd24gd2l0aCBlcnIgIgotCQkJCSAgICIlZCBpbiBzdGFydCBzdHJlYW0gJWQiLCBlcnIsIGkpOwotCQkJZ290byBub21lbV9lcnI7Ci0JCX0KLQl9CQkJLyogaSBTVFY2ODBfTlVNU0JVRiAqLwotCi0Jc3R2NjgwLT5mcmFtZWNvdW50ID0gMDsKLQlyZXR1cm4gMDsKLQotIG5vbWVtX2VycjoKLQlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNCVUY7IGkrKykgewotCQl1c2Jfa2lsbF91cmIoc3R2NjgwLT51cmJbaV0pOwotCQl1c2JfZnJlZV91cmIoc3R2NjgwLT51cmJbaV0pOwotCQlzdHY2ODAtPnVyYltpXSA9IE5VTEw7Ci0JCWtmcmVlKHN0djY4MC0+c2J1ZltpXS5kYXRhKTsKLQkJc3R2NjgwLT5zYnVmW2ldLmRhdGEgPSBOVUxMOwotCX0KLQkvKiB1c2VkIGluIGlycSwgZnJlZSBvbmx5IGFzIGFsbCBVUkJzIGFyZSBkZWFkICovCi0JZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQ1JBVENIOyBpKyspIHsKLQkJa2ZyZWUoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEpOwotCQlzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9IE5VTEw7Ci0JfQotCXJldHVybiAtRU5PTUVNOwotCi19Ci0KLXN0YXRpYyBpbnQgc3R2NjgwX3N0b3Bfc3RyZWFtIChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwKQotewotCWludCBpOwotCi0JaWYgKCFzdHY2ODAtPnN0cmVhbWluZyB8fCAhc3R2NjgwLT51ZGV2KQotCQlyZXR1cm4gMTsKLQotCXN0djY4MC0+c3RyZWFtaW5nID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0JVRjsgaSsrKQotCQlpZiAoc3R2NjgwLT51cmJbaV0pIHsKLQkJCXVzYl9raWxsX3VyYiAoc3R2NjgwLT51cmJbaV0pOwotCQkJdXNiX2ZyZWVfdXJiIChzdHY2ODAtPnVyYltpXSk7Ci0JCQlzdHY2ODAtPnVyYltpXSA9IE5VTEw7Ci0JCQlrZnJlZShzdHY2ODAtPnNidWZbaV0uZGF0YSk7Ci0JCX0KLQlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNDUkFUQ0g7IGkrKykgewotCQlrZnJlZShzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7Ci0JCXN0djY4MC0+c2NyYXRjaFtpXS5kYXRhID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHY2ODBfc2V0X3NpemUgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQlpbnQgd2Fzc3RyZWFtaW5nID0gc3R2NjgwLT5zdHJlYW1pbmc7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgKi8KLQlpZiAoKHN0djY4MC0+dndpZHRoID09IHdpZHRoKSAmJiAoc3R2NjgwLT52aGVpZ2h0ID09IGhlaWdodCkpCi0JCXJldHVybiAwOwotCi0JUERFQlVHICgxLCAiU1RWKGkpOiBzaXplIHJlcXVlc3QgZm9yICVpIHggJWkiLCB3aWR0aCwgaGVpZ2h0KTsKLQkvKiBDaGVjayBmb3IgYSB2YWxpZCBtb2RlICovCi0JaWYgKCghd2lkdGggfHwgIWhlaWdodCkgfHwgKCh3aWR0aCAmIDEpIHx8IChoZWlnaHQgJiAxKSkpIHsKLQkJUERFQlVHICgxLCAiU1RWKGUpOiBzZXRfc2l6ZSBlcnJvcjogcmVxdWVzdDogdi53aWR0aCA9ICVpLCB2LmhlaWdodCA9ICVpICBhY3R1YWw6IHN0di53aWR0aCA9ICVpLCBzdHYuaGVpZ2h0ID0gJWkiLCB3aWR0aCwgaGVpZ2h0LCBzdHY2ODAtPnZ3aWR0aCwgc3R2NjgwLT52aGVpZ2h0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKCh3aWR0aCA8IChzdHY2ODAtPm1heHdpZHRoIC8gMikpIHx8IChoZWlnaHQgPCAoc3R2NjgwLT5tYXhoZWlnaHQgLyAyKSkpIHsKLQkJd2lkdGggPSBzdHY2ODAtPm1heHdpZHRoIC8gMjsKLQkJaGVpZ2h0ID0gc3R2NjgwLT5tYXhoZWlnaHQgLyAyOwotCX0gZWxzZSBpZiAoKHdpZHRoID49IDE1OCkgJiYgKHdpZHRoIDw9IDE2NikgJiYgKHN0djY4MC0+UVZHQSA9PSAxKSkgewotCQl3aWR0aCA9IDE2MDsKLQkJaGVpZ2h0ID0gMTIwOwotCX0gZWxzZSBpZiAoKHdpZHRoID49IDE3MikgJiYgKHdpZHRoIDw9IDE4MCkgJiYgKHN0djY4MC0+Q0lGID09IDEpKSB7Ci0JCXdpZHRoID0gMTc2OwotCQloZWlnaHQgPSAxNDQ7Ci0JfSBlbHNlIGlmICgod2lkdGggPj0gMzE4KSAmJiAod2lkdGggPD0gMzUwKSAmJiAoc3R2NjgwLT5RVkdBID09IDEpKSB7Ci0JCXdpZHRoID0gMzIwOwotCQloZWlnaHQgPSAyNDA7Ci0JfSBlbHNlIGlmICgod2lkdGggPj0gMzUwKSAmJiAod2lkdGggPD0gMzU4KSAmJiAoc3R2NjgwLT5DSUYgPT0gMSkpIHsKLQkJd2lkdGggPSAzNTI7Ci0JCWhlaWdodCA9IDI4ODsKLQl9IGVsc2UgewotCQlQREVCVUcgKDEsICJTVFYoZSk6IHJlcXVlc3QgZm9yIG5vbi1zdXBwb3J0ZWQgc2l6ZTogcmVxdWVzdDogdi53aWR0aCA9ICVpLCB2LmhlaWdodCA9ICVpICBhY3R1YWw6IHN0di53aWR0aCA9ICVpLCBzdHYuaGVpZ2h0ID0gJWkiLCB3aWR0aCwgaGVpZ2h0LCBzdHY2ODAtPnZ3aWR0aCwgc3R2NjgwLT52aGVpZ2h0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogU3RvcCBhIGN1cnJlbnQgc3RyZWFtIGFuZCBzdGFydCBpdCBhZ2FpbiBhdCB0aGUgbmV3IHNpemUgKi8KLQlpZiAod2Fzc3RyZWFtaW5nKQotCQlzdHY2ODBfc3RvcF9zdHJlYW0gKHN0djY4MCk7Ci0Jc3R2NjgwLT52d2lkdGggPSB3aWR0aDsKLQlzdHY2ODAtPnZoZWlnaHQgPSBoZWlnaHQ7Ci0JUERFQlVHICgxLCAiU1RWKGkpOiBzaXplIHNldCB0byAlaSB4ICVpIiwgc3R2NjgwLT52d2lkdGgsIHN0djY4MC0+dmhlaWdodCk7Ci0JaWYgKHdhc3N0cmVhbWluZykKLQkJc3R2NjgwX3N0YXJ0X3N0cmVhbSAoc3R2NjgwKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmlkZW8gRGVjb2RpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKiAgcm91dGluZXMgZnJvbSB0aGUgcGVuY2FtIHByb2dyYW07IGhleSwgdGhleSB3b3JrISAgKioqKioqKiovCi0KLS8qCi0gKiBTVFYwNjgwIFZpc2lvbiBDYW1lcmEgQ2hpcHNldCBEcml2ZXIKLSAqIENvcHlyaWdodCAoQykgMjAwMCBBZGFtIEhhcnJpc29uIDxhZGFtQGFudGlzcGluLm9yZz4KLSovCi0KLSNkZWZpbmUgUkVEIDAKLSNkZWZpbmUgR1JFRU4gMQotI2RlZmluZSBCTFVFIDIKLSNkZWZpbmUgQUQoeCwgeSwgdykgKCgoeSkqKHcpKyh4KSkqMykKLQotc3RhdGljIHZvaWQgYmF5ZXJfdW5zaHVmZmxlIChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCBzdHJ1Y3Qgc3R2NjgwX3NjcmF0Y2ggKmJ1ZmZlcikKLXsKLQlpbnQgeCwgeSwgaTsKLQlpbnQgdyA9IHN0djY4MC0+Y3dpZHRoOwotCWludCB2dyA9IHN0djY4MC0+Y3dpZHRoLCB2aCA9IHN0djY4MC0+Y2hlaWdodDsKLQl1bnNpZ25lZCBpbnQgcCA9IDA7Ci0JaW50IGNvbG91ciA9IDAsIGJheWVyID0gMDsKLQl1bnNpZ25lZCBjaGFyICpyYXcgPSBidWZmZXItPmRhdGE7Ci0Jc3RydWN0IHN0djY4MF9mcmFtZSAqZnJhbWUgPSAmc3R2NjgwLT5mcmFtZVtzdHY2ODAtPmN1cmZyYW1lXTsKLQl1bnNpZ25lZCBjaGFyICpvdXRwdXQgPSBmcmFtZS0+ZGF0YTsKLQl1bnNpZ25lZCBjaGFyICp0ZW1wID0gZnJhbWUtPmRhdGE7Ci0JaW50IG9mZnNldCA9IGJ1ZmZlci0+b2Zmc2V0OwotCi0JaWYgKGZyYW1lLT5jdXJwaXggPT0gMCkgewotCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWSkgewotCQkJZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0dSQUJCSU5HOwotCQl9Ci0JfQotCWlmIChvZmZzZXQgIT0gZnJhbWUtPmN1cnBpeCkgewkvKiBSZWdhcmQgZnJhbWUgYXMgbG9zdCA6KCAqLwotCQlmcmFtZS0+Y3VycGl4ID0gMDsKLQkJc3R2NjgwLT5lcnJvcisrOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAzMjApIHx8IChzdHY2ODAtPnZ3aWR0aCA9PSAxNjApKSB7Ci0JCXZ3ID0gMzIwOwotCQl2aCA9IDI0MDsKLQl9Ci0JaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAzNTIpIHx8IChzdHY2ODAtPnZ3aWR0aCA9PSAxNzYpKSB7Ci0JCXZ3ID0gMzUyOwotCQl2aCA9IDI4ODsKLQl9Ci0KLQltZW1zZXQgKG91dHB1dCwgMCwgMyAqIHZ3ICogdmgpOwkvKiBjbGVhciBvdXRwdXQgbWF0cml4LiAqLwotCi0JZm9yICh5ID0gMDsgeSA8IHZoOyB5KyspIHsKLQkJZm9yICh4ID0gMDsgeCA8IHZ3OyB4KyspIHsKLQkJCWlmICh4ICYgMSkKLQkJCQlwID0gKihyYXcgKyB5ICogdyArICh4ID4+IDEpKTsKLQkJCWVsc2UKLQkJCQlwID0gKihyYXcgKyB5ICogdyArICh4ID4+IDEpICsgKHcgPj4gMSkpOwotCi0JCQlpZiAoeSAmIDEpCi0JCQkJYmF5ZXIgPSAyOwotCQkJZWxzZQotCQkJCWJheWVyID0gMDsKLQkJCWlmICh4ICYgMSkKLQkJCQliYXllcisrOwotCi0JCQlzd2l0Y2ggKGJheWVyKSB7Ci0JCQljYXNlIDA6Ci0JCQljYXNlIDM6Ci0JCQkJY29sb3VyID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQljb2xvdXIgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWNvbG91ciA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpID0gKHkgKiB2dyArIHgpICogMzsKLQkJCSoob3V0cHV0ICsgaSArIGNvbG91cikgPSAodW5zaWduZWQgY2hhcikgcDsKLQkJfQkJLyogZm9yIHggKi8KLQotCX0JCQkvKiBmb3IgeSAqLwotCi0JLyoqKioqKiBnYW1tYSBjb3JyZWN0aW9uIHBsdXMgaGFyZGNvZGVkIHdoaXRlIGJhbGFuY2UgKi8KLQkvKiBUaGFua3MgdG8gQWxleGFuZGVyIFNjaHdhcnR4IDxhbGV4YW5kZXIuc2Nod2FydHhAZ214Lm5ldD4gZm9yIHRoaXMgY29kZS4KLQkgICBDb3JyZWN0aW9uIHZhbHVlcyByZWRbXSwgZ3JlZW5bXSwgYmx1ZVtdLCBhcmUgZ2VuZXJhdGVkIGJ5Ci0JICAgKHBvdyhpLzI1Ni4wLCBHQU1NQSkqMjU1LjApKndoaXRlIGJhbGFuY2VSR0Igd2hlcmUgR0FNTUE9MC41NSwgMTxpPDI1NS4KLQkgICBXaGl0ZSBiYWxhbmNlIChSR0IpPSAxLjAsIDEuMTcsIDEuNDguIFZhbHVlcyBhcmUgY2FsY3VsYXRlZCBhcyBkb3VibGUgZmxvYXQgYW5kCi0JICAgY29udmVydGVkIHRvIHVuc2lnbmVkIGNoYXIuIFZhbHVlcyBhcmUgaW4gc3R2NjgwLmggICovCi0KLQlmb3IgKHkgPSAwOyB5IDwgdmg7IHkrKykgewotCQlmb3IgKHggPSAwOyB4IDwgdnc7IHgrKykgewotCQkJaSA9ICh5ICogdncgKyB4KSAqIDM7Ci0JCQkqKG91dHB1dCArIGkpID0gcmVkWyoob3V0cHV0ICsgaSldOwotCQkJKihvdXRwdXQgKyBpICsgMSkgPSBncmVlblsqKG91dHB1dCArIGkgKyAxKV07Ci0JCQkqKG91dHB1dCArIGkgKyAyKSA9IGJsdWVbKihvdXRwdXQgKyBpICsgMildOwotCQl9Ci0JfQotCi0JLyoqKioqKiAgYmF5ZXIgZGVtb3NhaWMgICoqKioqKi8KLQlmb3IgKHkgPSAxOyB5IDwgKHZoIC0gMSk7IHkrKykgewotCQlmb3IgKHggPSAxOyB4IDwgKHZ3IC0gMSk7IHgrKykgewkvKiB3b3JrIG91dCBwaXhlbCB0eXBlICovCi0JCQlpZiAoeSAmIDEpCi0JCQkJYmF5ZXIgPSAwOwotCQkJZWxzZQotCQkJCWJheWVyID0gMjsKLQkJCWlmICghKHggJiAxKSkKLQkJCQliYXllcisrOwotCi0JCQlzd2l0Y2ggKGJheWVyKSB7Ci0JCQljYXNlIDA6CS8qIGdyZWVuLiBibHVlIGxyLCByZWQgdGIgKi8KLQkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBCTFVFKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSwgdncpICsgQkxVRSkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSwgdncpICsgQkxVRSkpID4+IDE7Ci0JCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgUkVEKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4LCB5IC0gMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBSRUQpKSA+PiAxOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDE6CS8qIGJsdWUuIGdyZWVuIGxydGIsIHJlZCBkaWFnb25hbHMgKi8KLQkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBHUkVFTikgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHksIHZ3KSArIEdSRUVOKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5LCB2dykgKyBHUkVFTikgKyAoaW50KSAqKG91dHB1dCArIEFEICh4LCB5IC0gMSwgdncpICsgR1JFRU4pICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCwgeSArIDEsIHZ3KSArIEdSRUVOKSkgPj4gMjsKLQkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBSRUQpID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5IC0gMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5ICsgMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5IC0gMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5ICsgMSwgdncpICsgUkVEKSkgPj4gMjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAyOgkvKiByZWQuIGdyZWVuIGxydGIsIGJsdWUgZGlhZ29uYWxzICovCi0JCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgR1JFRU4pID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5LCB2dykgKyBHUkVFTikgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSwgdncpICsgR1JFRU4pICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCwgeSAtIDEsIHZ3KSArIEdSRUVOKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBHUkVFTikpID4+IDI7Ci0JCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgQkxVRSkgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHkgLSAxLCB2dykgKyBCTFVFKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5IC0gMSwgdncpICsgQkxVRSkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSArIDEsIHZ3KSArIEJMVUUpICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCArIDEsIHkgKyAxLCB2dykgKyBCTFVFKSkgPj4gMjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOgkvKiBncmVlbi4gcmVkIGxyLCBibHVlIHRiICovCi0JCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgUkVEKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5LCB2dykgKyBSRUQpKSA+PiAxOwotCQkJCSoob3V0cHV0ICsgQUQgKHgsIHksIHZ3KSArIEJMVUUpID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgLSAxLCB2dykgKyBCTFVFKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBCTFVFKSkgPj4gMTsKLQkJCQlicmVhazsKLQkJCX0JLyogc3dpdGNoICovCi0JCX0JCS8qIGZvciB4ICovCi0JfQkJCS8qIGZvciB5ICAtIGVuZCBkZW1vc2FpYyAgKi8KLQotCS8qIGZpeCB0b3AgYW5kIGJvdHRvbSByb3csIGxlZnQgYW5kIHJpZ2h0IHNpZGUgKi8KLQlpID0gdncgKiAzOwotCW1lbWNweSAob3V0cHV0LCAob3V0cHV0ICsgaSksIGkpOwotCW1lbWNweSAoKG91dHB1dCArICh2aCAqIGkpKSwgKG91dHB1dCArICgodmggLSAxKSAqIGkpKSwgaSk7Ci0JZm9yICh5ID0gMDsgeSA8IHZoOyB5KyspIHsKLQkJaSA9IHkgKiB2dyAqIDM7Ci0JCW1lbWNweSAoKG91dHB1dCArIGkpLCAob3V0cHV0ICsgaSArIDMpLCAzKTsKLQkJbWVtY3B5ICgob3V0cHV0ICsgaSArICh2dyAqIDMpKSwgKG91dHB1dCArIGkgKyAodncgLSAxKSAqIDMpLCAzKTsKLQl9Ci0KLQkvKiAgcHJvY2VzcyBhbGwgcmF3IGRhdGEsIHRoZW4gdHJpbSB0byBzaXplIGlmIG5lY2Vzc2FyeSAqLwotCWlmICgoc3R2NjgwLT52d2lkdGggPT0gMTYwKSB8fCAoc3R2NjgwLT52d2lkdGggPT0gMTc2KSkgIHsKLQkJaSA9IDA7Ci0JCWZvciAoeSA9IDA7IHkgPCB2aDsgeSsrKSB7Ci0JCQlpZiAoISh5ICYgMSkpIHsKLQkJCQlmb3IgKHggPSAwOyB4IDwgdnc7IHgrKykgewotCQkJCQlwID0gKHkgKiB2dyArIHgpICogMzsKLQkJCQkJaWYgKCEoeCAmIDEpKSB7Ci0JCQkJCQkqKG91dHB1dCArIGkpID0gKihvdXRwdXQgKyBwKTsKLQkJCQkJCSoob3V0cHV0ICsgaSArIDEpID0gKihvdXRwdXQgKyBwICsgMSk7Ci0JCQkJCQkqKG91dHB1dCArIGkgKyAyKSA9ICoob3V0cHV0ICsgcCArIDIpOwotCQkJCQkJaSArPSAzOwotCQkJCQl9Ci0JCQkJfSAgLyogZm9yIHggKi8KLQkJCX0KLQkJfSAgLyogZm9yIHkgKi8KLQl9Ci0JLyogcmVzZXQgdG8gcHJvcGVyIHdpZHRoICovCi0JaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAxNjApKSB7Ci0JCXZ3ID0gMTYwOwotCQl2aCA9IDEyMDsKLQl9Ci0JaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAxNzYpKSB7Ci0JCXZ3ID0gMTc2OwotCQl2aCA9IDE0NDsKLQl9Ci0KLQkvKiBvdXRwdXQgaXMgUkdCOyBzb21lIHByb2dyYW1zIHdhbnQgQkdSICAqLwotCS8qIHN3YXBSR0Jfb249MCAtPiBwcm9ncmFtIGRlY2lkZXM7ICBzd2FwUkdCX29uPTEsIGFsd2F5cyBzd2FwICovCi0JLyogc3dhcFJHQl9vbj0tMSwgbmV2ZXIgc3dhcCAqLwotCWlmICgoKHN3YXBSR0IgPT0gMSkgJiYgKHN3YXBSR0Jfb24gIT0gLTEpKSB8fCAoc3dhcFJHQl9vbiA9PSAxKSkgewotCQlmb3IgKHkgPSAwOyB5IDwgdmg7IHkrKykgewotCQkJZm9yICh4ID0gMDsgeCA8IHZ3OyB4KyspIHsKLQkJCQlpID0gKHkgKiB2dyArIHgpICogMzsKLQkJCQkqKHRlbXApID0gKihvdXRwdXQgKyBpKTsKLQkJCQkqKG91dHB1dCArIGkpID0gKihvdXRwdXQgKyBpICsgMik7Ci0JCQkJKihvdXRwdXQgKyBpICsgMikgPSAqKHRlbXApOwotCQkJfQotCQl9Ci0JfQotCS8qIGJyaWdodG5lc3MgKi8KLQlpZiAoc3R2NjgwLT5jaGdicmlnaHQgPT0gMSkgewotCQlpZiAoc3R2NjgwLT5icmlnaHRuZXNzID49IDMyNzY3KSB7Ci0JCQlwID0gKHN0djY4MC0+YnJpZ2h0bmVzcyAtIDMyNzY3KSAvIDI1NjsKLQkJCWZvciAoeCA9IDA7IHggPCAodncgKiB2aCAqIDMpOyB4KyspIHsKLQkJCQlpZiAoKCoob3V0cHV0ICsgeCkgKyAodW5zaWduZWQgY2hhcikgcCkgPiAyNTUpCi0JCQkJCSoob3V0cHV0ICsgeCkgPSAyNTU7Ci0JCQkJZWxzZQotCQkJCQkqKG91dHB1dCArIHgpICs9ICh1bnNpZ25lZCBjaGFyKSBwOwotCQkJfQkvKiBmb3IgKi8KLQkJfSBlbHNlIHsKLQkJCXAgPSAoMzI3NjcgLSBzdHY2ODAtPmJyaWdodG5lc3MpIC8gMjU2OwotCQkJZm9yICh4ID0gMDsgeCA8ICh2dyAqIHZoICogMyk7IHgrKykgewotCQkJCWlmICgodW5zaWduZWQgY2hhcikgcCA+ICoob3V0cHV0ICsgeCkpCi0JCQkJCSoob3V0cHV0ICsgeCkgPSAwOwotCQkJCWVsc2UKLQkJCQkJKihvdXRwdXQgKyB4KSAtPSAodW5zaWduZWQgY2hhcikgcDsKLQkJCX0JLyogZm9yICovCi0JCX0JCS8qIGVsc2UgKi8KLQl9Ci0JLyogaWYgKi8KLQlmcmFtZS0+Y3VycGl4ID0gMDsKLQlmcmFtZS0+Y3VybGluZXBpeCA9IDA7Ci0JZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0RPTkU7Ci0Jc3R2NjgwLT5mcmFtZWNvdW50Kys7Ci0Jc3R2NjgwLT5yZWFkY291bnQrKzsKLQlpZiAoc3R2NjgwLT5mcmFtZVsoc3R2NjgwLT5jdXJmcmFtZSArIDEpICYgKFNUVjY4MF9OVU1GUkFNRVMgLSAxKV0uZ3JhYnN0YXRlID09IEZSQU1FX1JFQURZKSB7Ci0JCXN0djY4MC0+Y3VyZnJhbWUgPSAoc3R2NjgwLT5jdXJmcmFtZSArIDEpICYgKFNUVjY4MF9OVU1GUkFNRVMgLSAxKTsKLQl9Ci0KLX0JCQkJLyogYmF5ZXJfdW5zaHVmZmxlICovCi0KLS8qKioqKioqICBlbmQgcm91dGluZXMgZnJvbSB0aGUgcGVuY2FtIHByb2dyYW0gICoqKioqKioqKi8KLQotc3RhdGljIGludCBzdHY2ODBfbmV3ZnJhbWUgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIGludCBmcmFtZW5yKQotewotCWludCBlcnJvcnMgPSAwOwotCi0Jd2hpbGUgKHN0djY4MC0+c3RyZWFtaW5nICYmIChzdHY2ODAtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWSB8fCBzdHY2ODAtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykpIHsKLQkJaWYgKCFzdHY2ODAtPmZyYW1lW2ZyYW1lbnJdLmN1cnBpeCkgewotCQkJZXJyb3JzKys7Ci0JCX0KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIChzdHY2ODAtPndxLCAoc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlID09IEJVRkZFUl9SRUFEWSkpOwotCi0JCWlmIChzdHY2ODAtPm51bGxwYWNrZXRzID4gU1RWNjgwX01BWF9OVUxMUEFDS0VUUykgewotCQkJc3R2NjgwLT5udWxscGFja2V0cyA9IDA7Ci0JCQlQREVCVUcgKDIsICJTVFYoaSk6IHRvbyBtYW55IG51bGwgbGVuZ3RoIHBhY2tldHMsIHJlc3RhcnRpbmcgY2FwdHVyZSIpOwotCQkJc3R2NjgwX3N0b3Bfc3RyZWFtIChzdHY2ODApOwotCQkJc3R2NjgwX3N0YXJ0X3N0cmVhbSAoc3R2NjgwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX3VzZV0uc3RhdGUgIT0gQlVGRkVSX1JFQURZKSB7Ci0JCQkJc3R2NjgwLT5mcmFtZVtmcmFtZW5yXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKLQkJCQlQREVCVUcgKDIsICJTVFYoZSk6IEZSQU1FX0VSUk9SIGluIF9uZXdmcmFtZSIpOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQkJc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlID0gQlVGRkVSX0JVU1k7Ci0KLQkJCWJheWVyX3Vuc2h1ZmZsZSAoc3R2NjgwLCAmc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdKTsKLQotCQkJc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlID0gQlVGRkVSX1VOVVNFRDsKLQkJCXN0djY4MC0+c2NyYXRjaF91c2UrKzsKLQkJCWlmIChzdHY2ODAtPnNjcmF0Y2hfdXNlID49IFNUVjY4MF9OVU1TQ1JBVENIKQotCQkJCXN0djY4MC0+c2NyYXRjaF91c2UgPSAwOwotCQkJaWYgKGVycm9ycyA+IFNUVjY4MF9NQVhfRVJST1JTKSB7Ci0JCQkJZXJyb3JzID0gMDsKLQkJCQlQREVCVUcgKDIsICJTVFYoaSk6IHRvbyBtYW55IGVycm9ycywgcmVzdGFydGluZyBjYXB0dXJlIik7Ci0JCQkJc3R2NjgwX3N0b3Bfc3RyZWFtIChzdHY2ODApOwotCQkJCXN0djY4MF9zdGFydF9zdHJlYW0gKHN0djY4MCk7Ci0JCQl9Ci0JCX0JCS8qIGVsc2UgKi8KLQl9CQkJLyogd2hpbGUgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmlkZW80TGludXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgc3R2X29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgZXJyID0gMDsKLQotCS8qIHdlIGFyZSBjYWxsZWQgd2l0aCB0aGUgQktMIGhlbGQgKi8KLQlsb2NrX2tlcm5lbCgpOwotCXN0djY4MC0+dXNlciA9IDE7Ci0JZXJyID0gc3R2X2luaXQgKHN0djY4MCk7CS8qIG1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgY2FtZXJhICovCi0KLQlpZiAoZXJyID49IDApIHsKLQkJc3R2NjgwLT5mYnVmID0gcnZtYWxsb2MgKHN0djY4MC0+bWF4ZnJhbWVzaXplICogU1RWNjgwX05VTUZSQU1FUyk7Ci0JCWlmICghc3R2NjgwLT5mYnVmKSB7Ci0JCQlQREVCVUcgKDAsICJTVFYoZSk6IENvdWxkIG5vdCBydm1hbGxvYyBmcmFtZSBidWZlciIpOwotCQkJZXJyID0gLUVOT01FTTsKLQkJfQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7Ci0JfQotCWlmIChlcnIpCi0JCXN0djY4MC0+dXNlciA9IDA7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBzdHZfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1GUkFNRVM7IGkrKykKLQkJc3R2NjgwLT5mcmFtZVtpXS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7Ci0JaWYgKHN0djY4MC0+c3RyZWFtaW5nKQotCQlzdHY2ODBfc3RvcF9zdHJlYW0gKHN0djY4MCk7Ci0KLQlpZiAoKGkgPSBzdHZfc3RvcF92aWRlbyAoc3R2NjgwKSkgPCAwKQotCQlQREVCVUcgKDEsICJTVFYoZSk6IHN0b3BfdmlkZW8gZmFpbGVkIGluIHN0dl9jbG9zZSIpOwotCi0JcnZmcmVlIChzdHY2ODAtPmZidWYsIHN0djY4MC0+bWF4ZnJhbWVzaXplICogU1RWNjgwX05VTUZSQU1FUyk7Ci0Jc3R2NjgwLT51c2VyID0gMDsKLQotCWlmIChzdHY2ODAtPnJlbW92ZWQpIHsKLQkJa2ZyZWUoc3R2NjgwKTsKLQkJc3R2NjgwID0gTlVMTDsKLQkJUERFQlVHICgwLCAiU1RWKGkpOiBkZXZpY2UgdW5yZWdpc3RlcmVkIik7Ci0JfQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHN0djY4MF9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCi0JaWYgKCFzdHY2ODAtPnVkZXYpCi0JCXJldHVybiAtRUlPOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ0dDQVA6ewotCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7Ci0KLQkJCXN0cmNweSAoYi0+bmFtZSwgc3R2NjgwLT5jYW1lcmFfbmFtZSk7Ci0JCQliLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKLQkJCWItPmNoYW5uZWxzID0gMTsKLQkJCWItPmF1ZGlvcyA9IDA7Ci0JCQliLT5tYXh3aWR0aCA9IHN0djY4MC0+bWF4d2lkdGg7Ci0JCQliLT5tYXhoZWlnaHQgPSBzdHY2ODAtPm1heGhlaWdodDsKLQkJCWItPm1pbndpZHRoID0gc3R2NjgwLT5tYXh3aWR0aCAvIDI7Ci0JCQliLT5taW5oZWlnaHQgPSBzdHY2ODAtPm1heGhlaWdodCAvIDI7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgVklESU9DR0NIQU46ewotCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5jaGFubmVsICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl2LT5mbGFncyA9IDA7Ci0JCQl2LT50dW5lcnMgPSAwOwotCQkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwotCQkJc3RyY3B5ICh2LT5uYW1lLCAiU1RWIENhbWVyYSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQljYXNlIFZJRElPQ1NDSEFOOnsKLQkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOwotCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXJldHVybiAwOwotCQl9Ci0JY2FzZSBWSURJT0NHUElDVDp7Ci0JCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKLQotCQkJc3R2NjgwX2dldF9waWN0IChzdHY2ODAsIHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQljYXNlIFZJRElPQ1NQSUNUOnsKLQkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOwotCi0JCQlpZiAoc3R2NjgwX3NldF9waWN0IChzdHY2ODAsIHApKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQljYXNlIFZJRElPQ1NXSU46ewotCQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7Ci0KLQkJCWlmICh2dy0+ZmxhZ3MpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAodnctPmNsaXBjb3VudCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmICh2dy0+d2lkdGggIT0gc3R2NjgwLT52d2lkdGgpIHsKLQkJCQlpZiAoc3R2NjgwX3NldF9zaXplIChzdHY2ODAsIHZ3LT53aWR0aCwgdnctPmhlaWdodCkpIHsKLQkJCQkJUERFQlVHICgyLCAiU1RWKGUpOiBmYWlsZWQgKGZyb20gdXNlcikgc2V0IHNpemUgaW4gVklESU9DU1dJTiIpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgVklESU9DR1dJTjp7Ci0JCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKLQotCQkJdnctPnggPSAwOwkvKiBGSVhNRSAqLwotCQkJdnctPnkgPSAwOwotCQkJdnctPmNocm9tYWtleSA9IDA7Ci0JCQl2dy0+ZmxhZ3MgPSAwOwotCQkJdnctPmNsaXBjb3VudCA9IDA7Ci0JCQl2dy0+d2lkdGggPSBzdHY2ODAtPnZ3aWR0aDsKLQkJCXZ3LT5oZWlnaHQgPSBzdHY2ODAtPnZoZWlnaHQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgVklESU9DR01CVUY6ewotCQkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOwotCQkJaW50IGk7Ci0KLQkJCW1lbXNldCAodm0sIDAsIHNpemVvZiAoKnZtKSk7Ci0JCQl2bS0+c2l6ZSA9IFNUVjY4MF9OVU1GUkFNRVMgKiBzdHY2ODAtPm1heGZyYW1lc2l6ZTsKLQkJCXZtLT5mcmFtZXMgPSBTVFY2ODBfTlVNRlJBTUVTOwotCQkJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1GUkFNRVM7IGkrKykKLQkJCQl2bS0+b2Zmc2V0c1tpXSA9IHN0djY4MC0+bWF4ZnJhbWVzaXplICogaTsKLQkJCXJldHVybiAwOwotCQl9Ci0JY2FzZSBWSURJT0NNQ0FQVFVSRTp7Ci0JCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqdm0gPSBhcmc7Ci0KLQkJCWlmICh2bS0+Zm9ybWF0ICE9IFNUVl9WSURFT19QQUxFVFRFKSB7Ci0JCQkJUERFQlVHICgyLCAiU1RWKGkpOiBWSURJT0NNQ0FQVFVSRSB2bS5mb3JtYXQgKCVpKSAhPSBWSURFT19QQUxFVFRFICglaSkiLAotCQkJCQl2bS0+Zm9ybWF0LCBTVFZfVklERU9fUEFMRVRURSk7Ci0JCQkJaWYgKCh2bS0+Zm9ybWF0ID09IDMpICYmIChzd2FwUkdCX29uID09IDApKSAgewotCQkJCQlQREVCVUcgKDIsICJTVFYoaSk6IFZJRElPQ01DQVBUVVJFIHN3YXBSR0IgaXMgKGF1dG8pIE9OIik7Ci0JCQkJCS8qIHRoaXMgbWF5IGZpeCB0aG9zZSBhcHBzIChlLmcuLCB4YXd0dikgdGhhdCB3YW50IEJHUiAqLwotCQkJCQlzd2FwUkdCID0gMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZiAodm0tPmZyYW1lID49IFNUVjY4MF9OVU1GUkFNRVMpIHsKLQkJCQlQREVCVUcgKDIsICJTVFYoZSk6IFZJRElPQ01DQVBUVVJFIHZtLmZyYW1lID4gTlVNRlJBTUVTIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZiAoKHN0djY4MC0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUgPT0gRlJBTUVfRVJST1IpCi0JCQkgICAgfHwgKHN0djY4MC0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpKSB7Ci0JCQkJUERFQlVHICgyLCAiU1RWKGUpOiBWSURJT0NNQ0FQVFVSRSBncmFic3RhdGUgKCVpKSBlcnJvciIsCi0JCQkJCXN0djY4MC0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUpOwotCQkJCXJldHVybiAtRUJVU1k7Ci0JCQl9Ci0JCQkvKiBJcyB0aGlzIGFjY29yZGluZyB0byB0aGUgdjRsIHNwZWM/Pz8gKi8KLQkJCWlmIChzdHY2ODAtPnZ3aWR0aCAhPSB2bS0+d2lkdGgpIHsKLQkJCQlpZiAoc3R2NjgwX3NldF9zaXplIChzdHY2ODAsIHZtLT53aWR0aCwgdm0tPmhlaWdodCkpIHsKLQkJCQkJUERFQlVHICgyLCAiU1RWKGUpOiBWSURJT0NNQ0FQVFVSRSBzZXRfc2l6ZSBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJfQotCQkJc3R2NjgwLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZSA9IEZSQU1FX1JFQURZOwotCi0JCQlpZiAoIXN0djY4MC0+c3RyZWFtaW5nKQotCQkJCXN0djY4MF9zdGFydF9zdHJlYW0gKHN0djY4MCk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JY2FzZSBWSURJT0NTWU5DOnsKLQkJCWludCAqZnJhbWUgPSBhcmc7Ci0JCQlpbnQgcmV0ID0gMDsKLQotCQkJaWYgKCpmcmFtZSA8IDAgfHwgKmZyYW1lID49IFNUVjY4MF9OVU1GUkFNRVMpIHsKLQkJCQlQREVCVUcgKDIsICJTVFYoZSk6IEJhZCBmcmFtZSAjIGluIFZJRElPQ1NZTkMiKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXJldCA9IHN0djY4MF9uZXdmcmFtZSAoc3R2NjgwLCAqZnJhbWUpOwotCQkJc3R2NjgwLT5mcmFtZVsqZnJhbWVdLmdyYWJzdGF0ZSA9IEZSQU1FX1VOVVNFRDsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQljYXNlIFZJRElPQ0dGQlVGOnsKLQkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOwotCi0JCQltZW1zZXQgKHZiLCAwLCBzaXplb2YgKCp2YikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQljYXNlIFZJRElPQ0tFWToKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWSURJT0NDQVBUVVJFOgotCQl7Ci0JCQlQREVCVUcgKDIsICJTVFYoZSk6IFZJRElPQ0NBUFRVUkUgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCWNhc2UgVklESU9DU0ZCVUY6Ci0JY2FzZSBWSURJT0NHVFVORVI6Ci0JY2FzZSBWSURJT0NTVFVORVI6Ci0JY2FzZSBWSURJT0NHRlJFUToKLQljYXNlIFZJRElPQ1NGUkVROgotCWNhc2UgVklESU9DR0FVRElPOgotCWNhc2UgVklESU9DU0FVRElPOgotCQlyZXR1cm4gLUVJTlZBTDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0JCQkvKiBlbmQgc3dpdGNoICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgc3R2NjgwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBzdHY2ODBfZG9faW9jdGwpOwotfQotCi1zdGF0aWMgaW50IHN0djY4MF9tbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOwotCi0JbXV0ZXhfbG9jaygmc3R2NjgwLT5sb2NrKTsKLQotCWlmIChzdHY2ODAtPnVkZXYgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJnN0djY4MC0+bG9jayk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAoc2l6ZSA+ICgoKFNUVjY4MF9OVU1GUkFNRVMgKiBzdHY2ODAtPm1heGZyYW1lc2l6ZSkgKyBQQUdFX1NJWkUgLSAxKQotCQkgICAgJiB+KFBBR0VfU0laRSAtIDEpKSkgewotCQltdXRleF91bmxvY2soJnN0djY4MC0+bG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwb3MgPSAodW5zaWduZWQgbG9uZykgc3R2NjgwLT5mYnVmOwotCXdoaWxlIChzaXplID4gMCkgewotCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOwotCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7Ci0JCQltdXRleF91bmxvY2soJnN0djY4MC0+bG9jayk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0JCXBvcyArPSBQQUdFX1NJWkU7Ci0JCWlmIChzaXplID4gUEFHRV9TSVpFKQotCQkJc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JCWVsc2UKLQkJCXNpemUgPSAwOwotCX0KLQltdXRleF91bmxvY2soJnN0djY4MC0+bG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3R2NjgwX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgaW50IHJlYWxjb3VudCA9IGNvdW50OwotCWludCByZXQgPSAwOwotCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgaW50IGk7Ci0KLQlpZiAoU1RWNjgwX05VTUZSQU1FUyAhPSAyKSB7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogU1RWNjgwX05VTUZSQU1FUyBuZWVkcyB0byBiZSAyISIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzdHY2ODAtPnVkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKHJlYWxjb3VudCA+IChzdHY2ODAtPnZ3aWR0aCAqIHN0djY4MC0+dmhlaWdodCAqIDMpKQotCQlyZWFsY291bnQgPSBzdHY2ODAtPnZ3aWR0aCAqIHN0djY4MC0+dmhlaWdodCAqIDM7Ci0KLQkvKiBTaG91bGRuJ3QgaGFwcGVuOiAqLwotCWlmIChzdHY2ODAtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykgewotCQlQREVCVUcgKDIsICJTVFYoZSk6IEZSQU1FX0dSQUJCSU5HIGluIHN0djY4MF9yZWFkIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCXN0djY4MC0+ZnJhbWVbMF0uZ3JhYnN0YXRlID0gRlJBTUVfUkVBRFk7Ci0Jc3R2NjgwLT5mcmFtZVsxXS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7Ci0Jc3R2NjgwLT5jdXJmcmFtZSA9IDA7Ci0KLQlpZiAoIXN0djY4MC0+c3RyZWFtaW5nKQotCQlzdHY2ODBfc3RhcnRfc3RyZWFtIChzdHY2ODApOwotCi0JaWYgKCFzdHY2ODAtPnN0cmVhbWluZykgewotCQlyZXQgPSBzdHY2ODBfbmV3ZnJhbWUgKHN0djY4MCwgMCk7CS8qIHJldCBzaG91bGQgPSAwICovCi0JfQotCi0JcmV0ID0gc3R2NjgwX25ld2ZyYW1lIChzdHY2ODAsIDApOwotCi0JaWYgKCFyZXQpIHsKLQkJaWYgKChpID0gY29weV90b191c2VyIChidWYsIHN0djY4MC0+ZnJhbWVbMF0uZGF0YSwgcmVhbGNvdW50KSkgIT0gMCkgewotCQkJUERFQlVHICgyLCAiU1RWKGUpOiBjb3B5X3RvX3VzZXIgZnJhbWUgMCBmYWlsZWQsIHJldCBjb3VudCA9ICVsaSIsIGkpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9IGVsc2UgewotCQlyZWFsY291bnQgPSByZXQ7Ci0JfQotCXN0djY4MC0+ZnJhbWVbMF0uZ3JhYnN0YXRlID0gRlJBTUVfVU5VU0VEOwotCXJldHVybiByZWFsY291bnQ7Ci19CQkJCS8qIHN0djY4MF9yZWFkICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgc3R2NjgwX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm9wZW4gPQkJc3R2X29wZW4sCi0JLnJlbGVhc2UgPSAgICAgCXN0dl9jbG9zZSwKLQkucmVhZCA9CQlzdHY2ODBfcmVhZCwKLQkubW1hcCA9CQlzdHY2ODBfbW1hcCwKLQkuaW9jdGwgPSAgICAgICAgc3R2NjgwX2lvY3RsLAotfTsKLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHN0djY4MF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9CQkiU1RWMDY4MCBVU0IgY2FtZXJhIiwKLQkuZm9wcyA9ICAgICAgICAgJnN0djY4MF9mb3BzLAotCS5yZWxlYXNlID0JdmlkZW9fZGV2aWNlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHN0djY4MF9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci0Jc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IE5VTEw7Ci0JY2hhciAqY2FtZXJhX25hbWUgPSBOVUxMOwotCWludCByZXR2YWwgPSAwOwotCi0JLyogV2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCi0JaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkgewotCQlQREVCVUcgKDAsICJTVFYoZSk6IE51bWJlciBvZiBDb25maWd1cmF0aW9ucyAhPSAxIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWludGVyZmFjZSA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOwotCS8qIElzIGl0IGEgU1RWNjgwPyAqLwotCWlmICgobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBVU0JfUEVOQ0FNX1ZFTkRPUl9JRCkgJiYKLQkgICAgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9QRU5DQU1fUFJPRFVDVF9JRCkpIHsKLQkJY2FtZXJhX25hbWUgPSAiU1RWMDY4MCI7Ci0JCVBERUJVRyAoMCwgIlNUVihpKTogU1RWMDY4MCBjYW1lcmEgZm91bmQuIik7Ci0JfSBlbHNlIGlmICgobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBVU0JfQ1JFQVRJVkVHT01JTklfVkVORE9SX0lEKSAmJgotCQkgICAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0NSRUFUSVZFR09NSU5JX1BST0RVQ1RfSUQpKSB7Ci0JCWNhbWVyYV9uYW1lID0gIkNyZWF0aXZlIFdlYkNhbSBHbyBNaW5pIjsKLQkJUERFQlVHICgwLCAiU1RWKGkpOiBDcmVhdGl2ZSBXZWJDYW0gR28gTWluaSBmb3VuZC4iKTsKLQl9IGVsc2UgewotCQlQREVCVUcgKDAsICJTVFYoZSk6IFZlbmRvci9Qcm9kdWN0IElEIGRvIG5vdCBtYXRjaCBTVFYwNjgwIG9yIENyZWF0aXZlIFdlYkNhbSBHbyBNaW5pIHZhbHVlcy4iKTsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBDaGVjayB0aGF0IHRoZSBTVFYwNjgwIG9yIENyZWF0aXZlIFdlYkNhbSBHbyBNaW5pIGNhbWVyYSBpcyBjb25uZWN0ZWQgdG8gdGhlIGNvbXB1dGVyLiIpOwotCQlyZXR2YWwgPSAtRU5PREVWOwotCQlnb3RvIGVycm9yOwotCX0KLQkvKiBXZSBmb3VuZCBvbmUgKi8KLQlpZiAoKHN0djY4MCA9IGt6YWxsb2MgKHNpemVvZiAoKnN0djY4MCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogY291bGRuJ3Qga21hbGxvYyBzdHY2ODAgc3RydWN0LiIpOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXN0djY4MC0+dWRldiA9IGRldjsKLQlzdHY2ODAtPmNhbWVyYV9uYW1lID0gY2FtZXJhX25hbWU7Ci0KLQlzdHY2ODAtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKLQlpZiAoIXN0djY4MC0+dmRldikgewotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQltZW1jcHkoc3R2NjgwLT52ZGV2LCAmc3R2NjgwX3RlbXBsYXRlLCBzaXplb2Yoc3R2NjgwX3RlbXBsYXRlKSk7Ci0Jc3R2NjgwLT52ZGV2LT5wYXJlbnQgPSAmaW50Zi0+ZGV2OwotCXZpZGVvX3NldF9kcnZkYXRhKHN0djY4MC0+dmRldiwgc3R2NjgwKTsKLQotCW1lbWNweSAoc3R2NjgwLT52ZGV2LT5uYW1lLCBzdHY2ODAtPmNhbWVyYV9uYW1lLCBzdHJsZW4gKHN0djY4MC0+Y2FtZXJhX25hbWUpKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkICgmc3R2NjgwLT53cSk7Ci0JbXV0ZXhfaW5pdCAoJnN0djY4MC0+bG9jayk7Ci0Jd21iICgpOwotCi0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHY2ODAtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA8IDApIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkIik7Ci0JCXJldHZhbCA9IC1FSU87Ci0JCWdvdG8gZXJyb3JfdmRldjsKLQl9Ci0JUERFQlVHKDAsICJTVFYoaSk6IHJlZ2lzdGVyZWQgbmV3IHZpZGVvIGRldmljZTogJXMiLAotCQl2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHN0djY4MC0+dmRldikpOwotCi0JdXNiX3NldF9pbnRmZGF0YSAoaW50Ziwgc3R2NjgwKTsKLQlyZXR2YWwgPSBzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0djY4MC0+dmRldik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcl91bnJlZzsKLQlyZXR1cm4gMDsKLQotZXJyb3JfdW5yZWc6Ci0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3R2NjgwLT52ZGV2KTsKLWVycm9yX3ZkZXY6Ci0JdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3R2NjgwLT52ZGV2KTsKLWVycm9yOgotCWtmcmVlKHN0djY4MCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVzYl9zdHY2ODBfcmVtb3ZlX2Rpc2Nvbm5lY3RlZCAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCkKLXsKLQlpbnQgaTsKLQotCXN0djY4MC0+dWRldiA9IE5VTEw7Ci0Jc3R2NjgwLT5mcmFtZVswXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKLQlzdHY2ODAtPmZyYW1lWzFdLmdyYWJzdGF0ZSA9IEZSQU1FX0VSUk9SOwotCXN0djY4MC0+c3RyZWFtaW5nID0gMDsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnN0djY4MC0+d3EpOwotCi0JZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQlVGOyBpKyspCi0JCWlmIChzdHY2ODAtPnVyYltpXSkgewotCQkJdXNiX2tpbGxfdXJiIChzdHY2ODAtPnVyYltpXSk7Ci0JCQl1c2JfZnJlZV91cmIgKHN0djY4MC0+dXJiW2ldKTsKLQkJCXN0djY4MC0+dXJiW2ldID0gTlVMTDsKLQkJCWtmcmVlKHN0djY4MC0+c2J1ZltpXS5kYXRhKTsKLQkJfQotCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0NSQVRDSDsgaSsrKQotCQlrZnJlZShzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7Ci0JUERFQlVHICgwLCAiU1RWKGkpOiAlcyBkaXNjb25uZWN0ZWQiLCBzdHY2ODAtPmNhbWVyYV9uYW1lKTsKLQotCS8qIEZyZWUgdGhlIG1lbW9yeSAqLwotCWtmcmVlKHN0djY4MCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0djY4MF9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKLQotCWlmIChzdHY2ODApIHsKLQkJLyogV2UgZG9uJ3Qgd2FudCBwZW9wbGUgdHJ5aW5nIHRvIG9wZW4gdXAgdGhlIGRldmljZSAqLwotCQlpZiAoc3R2NjgwLT52ZGV2KSB7Ci0JCQlzdHY2ODBfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0djY4MC0+dmRldik7Ci0JCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShzdHY2ODAtPnZkZXYpOwotCQkJc3R2NjgwLT52ZGV2ID0gTlVMTDsKLQkJfQotCQlpZiAoIXN0djY4MC0+dXNlcikgewotCQkJdXNiX3N0djY4MF9yZW1vdmVfZGlzY29ubmVjdGVkIChzdHY2ODApOwotCQl9IGVsc2UgewotCQkJc3R2NjgwLT5yZW1vdmVkID0gMTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHN0djY4MF9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJInN0djY4MCIsCi0JLnByb2JlID0Jc3R2NjgwX3Byb2JlLAotCS5kaXNjb25uZWN0ID0Jc3R2NjgwX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlID0JZGV2aWNlX3RhYmxlCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBNb2R1bGUgcm91dGluZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2luaXQgdXNiX3N0djY4MF9pbml0ICh2b2lkKQotewotCWlmICh1c2JfcmVnaXN0ZXIgKCZzdHY2ODBfZHJpdmVyKSA8IDApIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qgc2V0dXAgU1RWMDY4MCBkcml2ZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQREVCVUcgKDAsICJTVFYoaSk6IHVzYiBjYW1lcmEgZHJpdmVyIHZlcnNpb24gJXMgcmVnaXN0ZXJpbmciLCBEUklWRVJfVkVSU0lPTik7Ci0KLQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCi0JICAgICAgIERSSVZFUl9ERVNDICJcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3N0djY4MF9leGl0ICh2b2lkKQotewotCXVzYl9kZXJlZ2lzdGVyICgmc3R2NjgwX2RyaXZlcik7Ci0JUERFQlVHICgwLCAiU1RWKGkpOiBkcml2ZXIgZGVyZWdpc3RlcmVkIik7Ci19Ci0KLW1vZHVsZV9pbml0ICh1c2Jfc3R2NjgwX2luaXQpOwotbW9kdWxlX2V4aXQgKHVzYl9zdHY2ODBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4ZjFiMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiBzdHY2ODAuaAotICoKLSAqICBEZXNjcmlwdGlvbjoKLSAqICAgICBUaGlzIGlzIGEgVVNCIGRyaXZlciBmb3IgU1RWMDY4MCBiYXNlZCB1c2IgdmlkZW8gY2FtZXJhcy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBzaXplIG9mIHVzYiB0cmFuc2ZlcnMgKi8KLSNkZWZpbmUgU1RWNjgwX1BBQ0tFVFNJWkUJNDA5NgotCi0vKiBudW1iZXIgb2YgcXVldWVkIGJ1bGsgdHJhbnNmZXJzIHRvIHVzZSwgbWF5IGhhdmUgcHJvYmxlbXMgaWYgPiAxICovCi0jZGVmaW5lIFNUVjY4MF9OVU1TQlVGCQkxCi0KLS8qIG51bWJlciBvZiBmcmFtZXMgc3VwcG9ydGVkIGJ5IHRoZSB2NGwgcGFydCAqLwotI2RlZmluZSBTVFY2ODBfTlVNRlJBTUVTCTIKLQotLyogc2NyYXRjaCBidWZmZXJzIGZvciBwYXNzaW5nIGRhdGEgdG8gdGhlIGRlY29kZXJzOiAyIG9yIDQgYXJlIGdvb2QgKi8KLSNkZWZpbmUgU1RWNjgwX05VTVNDUkFUQ0gJMgotCi0vKiBudW1iZXIgb2YgbnVsIHNpemVkIHBhY2tldHMgdG8gcmVjZWl2ZSBiZWZvcmUga2lja2luZyB0aGUgY2FtZXJhICovCi0jZGVmaW5lIFNUVjY4MF9NQVhfTlVMTFBBQ0tFVFMJMjAwCi0KLS8qIG51bWJlciBvZiBkZWNvZGluZyBlcnJvcnMgYmVmb3JlIGtpY2tpbmcgdGhlIGNhbWVyYSAqLwotI2RlZmluZSBTVFY2ODBfTUFYX0VSUk9SUwkxMDAKLQotI2RlZmluZSBVU0JfUEVOQ0FNX1ZFTkRPUl9JRAkweDA1NTMKLSNkZWZpbmUgVVNCX1BFTkNBTV9QUk9EVUNUX0lECTB4MDIwMgotCi0jZGVmaW5lIFVTQl9DUkVBVElWRUdPTUlOSV9WRU5ET1JfSUQJMHgwNDFlCi0jZGVmaW5lIFVTQl9DUkVBVElWRUdPTUlOSV9QUk9EVUNUX0lECTB4NDAwNwotCi0jZGVmaW5lIFBFTkNBTV9USU1FT1VUICAgICAgICAgIDEwMDAKLS8qIGZtdCA0ICovCi0jZGVmaW5lIFNUVl9WSURFT19QQUxFVFRFICAgICAgIFZJREVPX1BBTEVUVEVfUkdCMjQKLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0gewotCXtVU0JfREVWSUNFIChVU0JfUEVOQ0FNX1ZFTkRPUl9JRCwgVVNCX1BFTkNBTV9QUk9EVUNUX0lEKX0sCi0Je1VTQl9ERVZJQ0UgKFVTQl9DUkVBVElWRUdPTUlOSV9WRU5ET1JfSUQsIFVTQl9DUkVBVElWRUdPTUlOSV9QUk9EVUNUX0lEKX0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRldmljZV90YWJsZSk7Ci0KLXN0cnVjdCBzdHY2ODBfc2J1ZiB7Ci0JdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLWVudW0gewotCUZSQU1FX1VOVVNFRCwJCS8qIFVudXNlZCAobm8gTUNBUFRVUkUpICovCi0JRlJBTUVfUkVBRFksCQkvKiBSZWFkeSB0byBzdGFydCBncmFiYmluZyAqLwotCUZSQU1FX0dSQUJCSU5HLAkJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCi0JRlJBTUVfRE9ORSwJCS8qIEZpbmlzaGVkIGdyYWJiaW5nLCBidXQgbm90IGJlZW4gc3luY2VkIHlldCAqLwotCUZSQU1FX0VSUk9SLAkJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nICovCi19OwotCi1lbnVtIHsKLQlCVUZGRVJfVU5VU0VELAotCUJVRkZFUl9SRUFEWSwKLQlCVUZGRVJfQlVTWSwKLQlCVUZGRVJfRE9ORSwKLX07Ci0KLS8qIHJhdyBjYW1lcmEgZGF0YSA8LSBzYnVmICh1cmIgdHJhbnNmZXIgYnVmKSAqLwotc3RydWN0IHN0djY4MF9zY3JhdGNoIHsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCXZvbGF0aWxlIGludCBzdGF0ZTsKLQlpbnQgb2Zmc2V0OwotCWludCBsZW5ndGg7Ci19OwotCi0vKiBwcm9jZXNzZWQgZGF0YSBmb3IgZGlzcGxheSBlbmRzIHVwIGhlcmUsIGFmdGVyIGJheWVyICovCi1zdHJ1Y3Qgc3R2NjgwX2ZyYW1lIHsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBGcmFtZSBidWZmZXIgKi8KLQl2b2xhdGlsZSBpbnQgZ3JhYnN0YXRlOwkvKiBTdGF0ZSBvZiBncmFiYmluZyAqLwotCXVuc2lnbmVkIGNoYXIgKmN1cmxpbmU7Ci0JaW50IGN1cmxpbmVwaXg7Ci0JaW50IGN1cnBpeDsKLX07Ci0KLS8qIHRoaXMgaXMgYWxtb3N0IHRoZSB2aWRlbyBzdHJ1Y3R1cmUgdXZkX3QsIHdpdGggZXh0cmEgcGFyYW1ldGVycyBmb3Igc3R2ICovCi1zdHJ1Y3QgdXNiX3N0diB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKLQotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCi0JdW5zaWduZWQgY2hhciBidWxrX2luX2VuZHBvaW50QWRkcjsJLyogX191OCAgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1bGsgaW4gZW5kcG9pbnQgKi8KLQljaGFyICpjYW1lcmFfbmFtZTsKLQotCXVuc2lnbmVkIGludCBWaWRlb01vZGU7CS8qIDB4MDEwMCA9IFZHQSwgMHgwMDAwID0gQ0lGLCAweDAzMDAgPSBRVkdBICovCi0JaW50IFN1cHBvcnRlZE1vZGVzOwotCWludCBDSUY7Ci0JaW50IFZHQTsKLQlpbnQgUVZHQTsKLQlpbnQgY3dpZHRoOwkJLyogY2FtZXJhIHdpZHRoICovCi0JaW50IGNoZWlnaHQ7CQkvKiBjYW1lcmEgaGVpZ2h0ICovCi0JaW50IG1heHdpZHRoOwkJLyogbWF4IHZpZGVvIHdpZHRoICovCi0JaW50IG1heGhlaWdodDsJCS8qIG1heCB2aWRlbyBoZWlnaHQgKi8KLQlpbnQgdndpZHRoOwkJLyogY3VycmVudCB3aWR0aCBmb3IgdmlkZW8gd2luZG93ICovCi0JaW50IHZoZWlnaHQ7CQkvKiBjdXJyZW50IGhlaWdodCBmb3IgdmlkZW8gd2luZG93ICovCi0JdW5zaWduZWQgbG9uZyBpbnQgcmF3YnVmc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGludCBtYXhmcmFtZXNpemU7CS8qIHJhd2J1ZnNpemUgKiAzIGZvciBSR0IgKi8KLQotCWludCBvcmlnR2FpbjsKLQlpbnQgb3JpZ01vZGU7CQkvKiBvcmlnaW5hbCBjYW1lcmEgbW9kZSAqLwotCi0Jc3RydWN0IG11dGV4IGxvY2s7CS8qIHRvIGxvY2sgdGhlIHN0cnVjdHVyZSAqLwotCWludCB1c2VyOwkJLyogdXNlciBjb3VudCBmb3IgZXhjbHVzaXZlIHVzZSAqLwotCWludCByZW1vdmVkOwkJLyogZGV2aWNlIGRpc2Nvbm5lY3RlZCAqLwotCWludCBzdHJlYW1pbmc7CQkvKiBBcmUgd2Ugc3RyZWFtaW5nIHZpZGVvPyAqLwotCWNoYXIgKmZidWY7CQkvKiBWaWRlb2RldiBidWZmZXIgYXJlYSAqLwotCXN0cnVjdCB1cmIgKnVyYltTVFY2ODBfTlVNU0JVRl07CS8qICMgb2YgcXVldWVkIGJ1bGsgdHJhbnNmZXJzICovCi0JaW50IGN1cmZyYW1lOwkJLyogQ3VycmVudCByZWNlaXZpbmcgZnJhbWUgKi8KLQlzdHJ1Y3Qgc3R2NjgwX2ZyYW1lIGZyYW1lW1NUVjY4MF9OVU1GUkFNRVNdOwkvKiAjIGZyYW1lcyBzdXBwb3J0ZWQgYnkgdjRsIHBhcnQgKi8KLQlpbnQgcmVhZGNvdW50OwotCWludCBmcmFtZWNvdW50OwotCWludCBlcnJvcjsKLQlpbnQgZHJvcHBlZDsKLQlpbnQgc2NyYXRjaF9uZXh0OwotCWludCBzY3JhdGNoX3VzZTsKLQlpbnQgc2NyYXRjaF9vdmVyZmxvdzsKLQlzdHJ1Y3Qgc3R2NjgwX3NjcmF0Y2ggc2NyYXRjaFtTVFY2ODBfTlVNU0NSQVRDSF07CS8qIGZvciBkZWNvZGVycyAqLwotCXN0cnVjdCBzdHY2ODBfc2J1ZiBzYnVmW1NUVjY4MF9OVU1TQlVGXTsKLQotCXVuc2lnbmVkIGludCBicmlnaHRuZXNzOwotCXVuc2lnbmVkIGludCBjaGdicmlnaHQ7Ci0JdW5zaWduZWQgaW50IHdoaXRlbmVzczsKLQl1bnNpZ25lZCBpbnQgY29sb3VyOwotCXVuc2lnbmVkIGludCBjb250cmFzdDsKLQl1bnNpZ25lZCBpbnQgaHVlOwotCXVuc2lnbmVkIGludCBwYWxldHRlOwotCXVuc2lnbmVkIGludCBkZXB0aDsJLyogcmdiMjQgaW4gYml0cyAqLwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CS8qIFByb2Nlc3NlcyB3YWl0aW5nICovCi0KLQlpbnQgbnVsbHBhY2tldHM7Ci19OwotCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJlZFsyNTZdID0gewotCTAsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwKLQkxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMjUsIDMwLCAzNSwgMzgsIDQyLAotCTQ0LCA0NywgNTAsIDUzLCA1NCwgNTcsIDU5LCA2MSwgNjMsIDY1LCA2NywgNjksCi0JNzEsIDcxLCA3MywgNzUsIDc3LCA3OCwgODAsIDgxLCA4MiwgODQsIDg1LCA4NywKLQk4OCwgODksIDkwLCA5MSwgOTMsIDk0LCA5NSwgOTcsIDk4LCA5OCwgOTksIDEwMSwKLQkxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLAotCTExNCwgMTE1LCAxMTYsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsCi0JMTI1LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwKLQkxMzQsIDEzNSwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQwLCAxNDEsIDE0MiwgMTQzLAotCTE0MywgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUwLCAxNTEsCi0JMTUyLCAxNTIsIDE1MiwgMTUzLCAxNTQsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU3LCAxNTgsIDE1OSwKLQkxNTksIDE2MCwgMTYxLCAxNjEsIDE2MSwgMTYyLCAxNjMsIDE2MywgMTY0LCAxNjUsIDE2NSwgMTY2LAotCTE2NywgMTY3LCAxNjgsIDE2OCwgMTY5LCAxNzAsIDE3MCwgMTcwLCAxNzEsIDE3MSwgMTcyLCAxNzMsCi0JMTczLCAxNzQsIDE3NCwgMTc1LCAxNzYsIDE3NiwgMTc3LCAxNzgsIDE3OCwgMTc5LCAxNzksIDE3OSwKLQkxODAsIDE4MCwgMTgxLCAxODEsIDE4MiwgMTgzLCAxODMsIDE4NCwgMTg0LCAxODUsIDE4NSwgMTg2LAotCTE4NywgMTg3LCAxODgsIDE4OCwgMTg4LCAxODgsIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkxLCAxOTIsCi0JMTkyLCAxOTMsIDE5MywgMTk0LCAxOTUsIDE5NSwgMTk2LCAxOTYsIDE5NywgMTk3LCAxOTcsIDE5NywKLQkxOTgsIDE5OCwgMTk5LCAxOTksIDIwMCwgMjAxLCAyMDEsIDIwMiwgMjAyLCAyMDMsIDIwMywgMjA0LAotCTIwNCwgMjA1LCAyMDUsIDIwNiwgMjA2LCAyMDYsIDIwNiwgMjA3LCAyMDcsIDIwOCwgMjA4LCAyMDksCi0JMjA5LCAyMTAsIDIxMCwgMjExLCAyMTEsIDIxMiwgMjEyLCAyMTMsIDIxMywgMjE0LCAyMTQsIDIxNSwKLQkyMTUsIDIxNSwgMjE1LCAyMTYsIDIxNiwgMjE3LCAyMTcsIDIxOCwgMjE4LCAyMTgsIDIxOSwgMjE5LAotCTIyMCwgMjIwLCAyMjEsIDIyMQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ3JlZW5bMjU2XSA9IHsKLQkwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsCi0JMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDI4LCAzNCwgMzksIDQzLCA0NywKLQk1MCwgNTMsIDU2LCA1OSwgNjEsIDY0LCA2NiwgNjgsIDcxLCA3MywgNzUsIDc3LAotCTc5LCA4MCwgODIsIDg0LCA4NiwgODcsIDg5LCA5MSwgOTIsIDk0LCA5NSwgOTcsCi0JOTgsIDEwMCwgMTAxLCAxMDIsIDEwNCwgMTA1LCAxMDYsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEzLAotCTExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsCi0JMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwKLQkxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LAotCTE1MCwgMTUxLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTYsIDE1NywgMTU4LCAxNTksCi0JMTYwLCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjcsIDE2OCwKLQkxNjksIDE3MCwgMTcwLCAxNzEsIDE3MiwgMTcyLCAxNzMsIDE3NCwgMTc1LCAxNzUsIDE3NiwgMTc3LAotCTE3NywgMTc4LCAxNzksIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgyLCAxODMsIDE4NCwgMTg0LCAxODUsCi0JMTg2LCAxODYsIDE4NywgMTg3LCAxODgsIDE4OSwgMTg5LCAxOTAsIDE5MSwgMTkxLCAxOTIsIDE5MywKLQkxOTMsIDE5NCwgMTk0LCAxOTUsIDE5NiwgMTk2LCAxOTcsIDE5OCwgMTk4LCAxOTksIDE5OSwgMjAwLAotCTIwMSwgMjAxLCAyMDIsIDIwMiwgMjAzLCAyMDQsIDIwNCwgMjA1LCAyMDUsIDIwNiwgMjA2LCAyMDcsCi0JMjA4LCAyMDgsIDIwOSwgMjA5LCAyMTAsIDIxMCwgMjExLCAyMTIsIDIxMiwgMjEzLCAyMTMsIDIxNCwKLQkyMTQsIDIxNSwgMjE1LCAyMTYsIDIxNywgMjE3LCAyMTgsIDIxOCwgMjE5LCAyMTksIDIyMCwgMjIwLAotCTIyMSwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjQsIDIyNCwgMjI1LCAyMjUsIDIyNiwgMjI2LCAyMjcsCi0JMjI3LCAyMjgsIDIyOCwgMjI5LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMSwgMjMyLCAyMzIsIDIzMywKLQkyMzMsIDIzNCwgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM5LAotCTIzOSwgMjQwLCAyNDAsIDI0MSwgMjQxLCAyNDIsIDI0MiwgMjQzLCAyNDMsIDI0MywgMjQ0LCAyNDQsCi0JMjQ1LCAyNDUsIDI0NiwgMjQ2Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBibHVlWzI1Nl0gPSB7Ci0JMCwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLAotCTIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAzMCwgMzcsIDQyLCA0NywgNTEsCi0JNTUsIDU4LCA2MSwgNjQsIDY3LCA3MCwgNzIsIDc0LCA3OCwgODAsIDgyLCA4NCwKLQk4NiwgODgsIDkwLCA5MiwgOTQsIDk1LCA5NywgMTAwLCAxMDEsIDEwMywgMTA0LCAxMDYsCi0JMTA3LCAxMTAsIDExMSwgMTEyLCAxMTQsIDExNSwgMTE2LCAxMTgsIDExOSwgMTIxLCAxMjIsIDEyNCwKLQkxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LAotCTEzOSwgMTQwLCAxNDEsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsCi0JMTUyLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjIsIDE2MywKLQkxNjUsIDE2NiwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcxLCAxNzIsIDE3MywgMTc0LAotCTE3NiwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MCwgMTgxLCAxODIsIDE4MywgMTgzLCAxODQsCi0JMTg1LCAxODcsIDE4NywgMTg4LCAxODksIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkyLCAxOTMsIDE5NCwKLQkxOTQsIDE5NSwgMTk2LCAxOTYsIDE5OCwgMTk5LCAyMDAsIDIwMCwgMjAxLCAyMDIsIDIwMiwgMjAzLAotCTIwNCwgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDcsIDIwNywgMjA5LCAyMTAsIDIxMCwgMjExLCAyMTIsCi0JMjEyLCAyMTMsIDIxMywgMjE0LCAyMTUsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTgsIDIyMCwKLQkyMjEsIDIyMSwgMjIyLCAyMjIsIDIyMywgMjI0LCAyMjQsIDIyNSwgMjI1LCAyMjYsIDIyNiwgMjI3LAotCTIyOCwgMjI4LCAyMjksIDIyOSwgMjMxLCAyMzEsIDIzMiwgMjMzLCAyMzMsIDIzNCwgMjM0LCAyMzUsCi0JMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzgsIDIzOCwgMjM5LCAyMzksIDI0MCwgMjQwLCAyNDIsIDI0MiwKLQkyNDMsIDI0MywgMjQ0LCAyNDQsIDI0NSwgMjQ2LCAyNDYsIDI0NywgMjQ3LCAyNDgsIDI0OCwgMjQ5LAotCTI0OSwgMjUwLCAyNTAsIDI1MSwgMjUxLCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsCi0JMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLQkyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotCTI1NSwgMjU1LCAyNTUsIDI1NQotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9wZC1tYWluLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtbWFpbi5jCmluZGV4IDI1NmNjNTUuLjQ1NTVmNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9wZC1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLW1haW4uYwpAQCAtMjI3LDEyICsyMjcsMTEgQEAKIAogCWZ3bGVuZ3RoID0gZnctPnNpemU7CiAKLQlmd2J1ZiA9IGt6YWxsb2MoZndsZW5ndGgsIEdGUF9LRVJORUwpOworCWZ3YnVmID0ga21lbWR1cChmdy0+ZGF0YSwgZndsZW5ndGgsIEdGUF9LRVJORUwpOwogCWlmICghZndidWYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCW1lbWNweShmd2J1ZiwgZnctPmRhdGEsIGZ3bGVuZ3RoKTsKIAogCW1heF9wYWNrZXRfc2l6ZSA9IHVkZXYtPmVwX291dFsweDFdLT5kZXNjLndNYXhQYWNrZXRTaXplOwogCWxvZygiXHRcdCBkb3dubG9hZCBzaXplIDogJWQiLCAoaW50KW1heF9wYWNrZXRfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYwppbmRleCA0NDVkYzkzLi5hNzI3OTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKQEAgLTc2OCw3ICs3NjgsNyBAQAogCiAJbWYtPndpZHRoCT0gcHJpdi0+c2NhbGUtPndpZHRoOwogCW1mLT5oZWlnaHQJPSBwcml2LT5zY2FsZS0+aGVpZ2h0OwotCW1mLT5jb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkU7CisJbWYtPmNvZGUJPSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODsKIAltZi0+Y29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOwogCW1mLT5maWVsZAk9IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVDsKIApAQCAtNzk3LDcgKzc5Nyw3IEBACiAJLyoKIAkgKiBjaGVjayBjb2xvciBmb3JtYXQKIAkgKi8KLQlpZiAobWYtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkUpCisJaWYgKG1mLT5jb2RlICE9IFY0TDJfTUJVU19GTVRfVVlWWThfMlg4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1mLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CkBAIC04MjQsNyArODI0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWYtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOF9CRTsKKwltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OwogCW1mLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CiAKIAkvKgpAQCAtOTA5LDcgKzkwOSw3IEBACiAJaWYgKGluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSpjb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDhfQkU7CisJKmNvZGUgPSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnCmluZGV4IGFkYjFjMDQuLmQ2ZTE2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL0tjb25maWcKQEAgLTM3LDE3ICszNywzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBrb25pY2F3Yy4KIAotY29uZmlnIFVTQl9RVUlDS0NBTV9NRVNTRU5HRVIKLQl0cmlzdGF0ZSAiVVNCIExvZ2l0ZWNoIFF1aWNrY2FtIE1lc3NlbmdlciAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwxCi0Jc2VsZWN0IFZJREVPX1VTQlZJREVPCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBnc3BjYSBzdHYwNnh4IG1vZHVsZQotCSAgaW5zdGVhZC4KLQotCSAgU2F5IFkgb3IgTSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVVNCIExvZ2l0ZWNoIFF1aWNrY2FtCi0JICBNZXNzZW5nZXIgd2ViY2FtLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBxdWlja2NhbV9tZXNzZW5nZXIuCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL01ha2VmaWxlCmluZGV4IDRhMWIxNDQuLmJiNTJlYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9NYWtlZmlsZQpAQCAtMiw0ICsyLDMgQEAKIG9iai0kKENPTkZJR19VU0JfSUJNQ0FNKSAgICAgICAgKz0gaWJtY2FtLm8gdWx0cmFjYW0ubwogb2JqLSQoQ09ORklHX1VTQl9LT05JQ0FXQykgICAgICArPSBrb25pY2F3Yy5vCiBvYmotJChDT05GSUdfVVNCX1ZJQ0FNKSAgICAgICAgICs9IHZpY2FtLm8KLW9iai0kKENPTkZJR19VU0JfUVVJQ0tDQU1fTUVTU0VOR0VSKQkrPSBxdWlja2NhbV9tZXNzZW5nZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDY2NWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMjYgKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgTG9naXRlY2ggUXVpY2tjYW0gTWVzc2VuZ2VyIHVzYiB2aWRlbyBjYW1lcmEKLSAqIENvcHlyaWdodCAoQykgSmF5YSBLdW1hcgotICoKLSAqIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IENJUyhNKSBTZG4gQmhkLgotICogSGlzdG9yeToKLSAqIDA1LzA4LzIwMDYgLSBKYXlhIEt1bWFyCi0gKiBJIHdyb3RlIHRoaXMgYmFzZWQgb24gdGhlIGtvbmljYXdjIGJ5IFNpbW9uIEV2YW5zLgotICogLQotICogRnVsbCBjcmVkaXQgZm9yIHJldmVyc2UgZW5naW5lZXJpbmcgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwKLSAqIHdvcmtpbmcgbGludXggZHJpdmVyIGZvciB0aGUgVlY2NDIyIGdvZXMgdG8gdGhlIHFjZS1nYSBwcm9qZWN0IGJ5Ci0gKiBUdXVra2EgVG9pdm9uZW4sIEpvY2hlbiBIb2VuaWNrZSwgUGV0ZXIgTWNDb25uZWxsLAotICogQ3Jpc3RpYW5vIERlIE1pY2hlbGUsIEdlb3JnIEFjaGVyLCBKZWFuLUZyZWRlcmljIENsZXJlIGFzIHdlbGwgYXMKLSAqIG90aGVycy4KLSAqIC0tLQotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlICJ1c2J2aWRlby5oIgotI2luY2x1ZGUgInF1aWNrY2FtX21lc3Nlbmdlci5oIgotCi0vKgotICogVmVyc2lvbiBJbmZvcm1hdGlvbgotICovCi0KLSNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCi1zdGF0aWMgaW50IGRlYnVnOwotI2RlZmluZSBERUJVRyhuLCBmb3JtYXQsIGFyZy4uLikgXAotCWlmIChuIDw9IGRlYnVnKSB7CSBcCi0JCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6JXMoKTogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjIyBhcmcpOyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUcobiwgYXJnLi4uKQotc3RhdGljIGNvbnN0IGludCBkZWJ1ZzsKLSNlbmRpZgotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4wMSIKLSNkZWZpbmUgRFJJVkVSX0RFU0MgIkxvZ2l0ZWNoIFF1aWNrY2FtIE1lc3NlbmdlciBVU0IiCi0KLSNkZWZpbmUgVVNCX0xPR0lURUNIX1ZFTkRPUl9JRAkweDA0NkQKLSNkZWZpbmUgVVNCX1FDTV9QUk9EVUNUX0lECTB4MDhGMAotCi0jZGVmaW5lIE1BWF9DQU1FUkFTCTEKLQotI2RlZmluZSBNQVhfQ09MT1VSCTMyNzY4Ci0jZGVmaW5lIE1BWF9IVUUJCTMyNzY4Ci0jZGVmaW5lIE1BWF9CUklHSFRORVNTCTMyNzY4Ci0jZGVmaW5lIE1BWF9DT05UUkFTVAkzMjc2OAotI2RlZmluZSBNQVhfV0hJVEVORVNTCTMyNzY4Ci0KLXN0YXRpYyBpbnQgc2l6ZSA9IFNJWkVfMzIwWDI0MDsKLXN0YXRpYyBpbnQgY29sb3VyID0gTUFYX0NPTE9VUjsKLXN0YXRpYyBpbnQgaHVlID0gTUFYX0hVRTsKLXN0YXRpYyBpbnQgYnJpZ2h0bmVzcyA9CU1BWF9CUklHSFRORVNTOwotc3RhdGljIGludCBjb250cmFzdCA9CU1BWF9DT05UUkFTVDsKLXN0YXRpYyBpbnQgd2hpdGVuZXNzID0JTUFYX1dISVRFTkVTUzsKLQotc3RhdGljIHN0cnVjdCB1c2J2aWRlbyAqY2FtczsKLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHFjbV90YWJsZSBbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoVVNCX0xPR0lURUNIX1ZFTkRPUl9JRCwgVVNCX1FDTV9QUk9EVUNUX0lEKSB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBxY21fdGFibGUpOwotCi0jaWZkZWYgQ09ORklHX0lOUFVUCi1zdGF0aWMgdm9pZCBxY21fcmVnaXN0ZXJfaW5wdXQoc3RydWN0IHFjbSAqY2FtLCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgZXJyb3I7Ci0KLQl1c2JfbWFrZV9wYXRoKGRldiwgY2FtLT5pbnB1dF9waHlzbmFtZSwgc2l6ZW9mKGNhbS0+aW5wdXRfcGh5c25hbWUpKTsKLQlzdHJsY2F0KGNhbS0+aW5wdXRfcGh5c25hbWUsICIvaW5wdXQwIiwgc2l6ZW9mKGNhbS0+aW5wdXRfcGh5c25hbWUpKTsKLQotCWNhbS0+aW5wdXQgPSBpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWlucHV0X2RldikgewotCQlkZXZfd2FybigmZGV2LT5kZXYsICJpbnN1ZmZpY2llbnQgbWVtIGZvciBjYW0gaW5wdXQgZGV2aWNlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlucHV0X2Rldi0+bmFtZSA9ICJRQ00gYnV0dG9uIjsKLQlpbnB1dF9kZXYtPnBoeXMgPSBjYW0tPmlucHV0X3BoeXNuYW1lOwotCXVzYl90b19pbnB1dF9pZChkZXYsICZpbnB1dF9kZXYtPmlkKTsKLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7Ci0KLQlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKTsKLQlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChLRVlfQ0FNRVJBKV0gPSBCSVRfTUFTSyhLRVlfQ0FNRVJBKTsKLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNhbS0+aW5wdXQpOwotCWlmIChlcnJvcikgewotCQlkZXZfd2FybigmZGV2LT5kZXYsCi0JCQkgIkZhaWxlZCB0byByZWdpc3RlciBjYW1lcmEncyBpbnB1dCBkZXZpY2UsIGVycjogJWRcbiIsCi0JCQkgZXJyb3IpOwotCQlpbnB1dF9mcmVlX2RldmljZShjYW0tPmlucHV0KTsKLQkJY2FtLT5pbnB1dCA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBxY21fdW5yZWdpc3Rlcl9pbnB1dChzdHJ1Y3QgcWNtICpjYW0pCi17Ci0JaWYgKGNhbS0+aW5wdXQpIHsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoY2FtLT5pbnB1dCk7Ci0JCWNhbS0+aW5wdXQgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcWNtX3JlcG9ydF9idXR0b25zdGF0KHN0cnVjdCBxY20gKmNhbSkKLXsKLQlpZiAoY2FtLT5pbnB1dCkgewotCQlpbnB1dF9yZXBvcnRfa2V5KGNhbS0+aW5wdXQsIEtFWV9DQU1FUkEsIGNhbS0+YnV0dG9uX3N0cyk7Ci0JCWlucHV0X3N5bmMoY2FtLT5pbnB1dCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBxY21faW50X2lycShzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdXZkICp1dmQgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHFjbSAqY2FtOwotCi0JaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkKLQkJcmV0dXJuOwotCi0JaWYgKCF1dmQtPnN0cmVhbWluZykKLQkJcmV0dXJuOwotCi0JdXZkLT5zdGF0cy51cmJfY291bnQrKzsKLQotCWlmICh1cmItPnN0YXR1cyA8IDApCi0JCXV2ZC0+c3RhdHMuaXNvX2Vycl9jb3VudCsrOwotCWVsc2UgewotCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCApIHsKLQkJCWNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOwotCQkJaWYgKGNhbS0+YnV0dG9uX3N0c19idWYgPT0gMHg4OCkKLQkJCQljYW0tPmJ1dHRvbl9zdHMgPSAweDA7Ci0JCQllbHNlIGlmIChjYW0tPmJ1dHRvbl9zdHNfYnVmID09IDB4ODApCi0JCQkJY2FtLT5idXR0b25fc3RzID0gMHgxOwotCQkJcWNtX3JlcG9ydF9idXR0b25zdGF0KGNhbSk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQgPCAwKQotCQllcnIoInVzYl9zdWJtaXRfdXJiIGVycm9yICglZCkiLCByZXQpOwotfQotCi1zdGF0aWMgaW50IHFjbV9zZXR1cF9pbnB1dF9pbnQoc3RydWN0IHFjbSAqY2FtLCBzdHJ1Y3QgdXZkICp1dmQpCi17Ci0JaW50IGVycmZsYWc7Ci0JdXNiX2ZpbGxfaW50X3VyYihjYW0tPmJ1dHRvbl91cmIsIHV2ZC0+ZGV2LAotCQkJdXNiX3JjdmludHBpcGUodXZkLT5kZXYsIHV2ZC0+dmlkZW9fZW5kcCArIDEpLAotCQkJJmNhbS0+YnV0dG9uX3N0c19idWYsCi0JCQkxLAotCQkJcWNtX2ludF9pcnEsCi0JCQl1dmQsIDE2KTsKLQotCWVycmZsYWcgPSB1c2Jfc3VibWl0X3VyYihjYW0tPmJ1dHRvbl91cmIsIEdGUF9LRVJORUwpOwotCWlmIChlcnJmbGFnKQotCQllcnIgKCJ1c2Jfc3VibWl0X2ludCByZXQgJWQiLCBlcnJmbGFnKTsKLQlyZXR1cm4gZXJyZmxhZzsKLX0KLQotc3RhdGljIHZvaWQgcWNtX3N0b3BfaW50X2RhdGEoc3RydWN0IHFjbSAqY2FtKQotewotCXVzYl9raWxsX3VyYihjYW0tPmJ1dHRvbl91cmIpOwotfQotCi1zdGF0aWMgaW50IHFjbV9hbGxvY19pbnRfdXJiKHN0cnVjdCBxY20gKmNhbSkKLXsKLQljYW0tPmJ1dHRvbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFjYW0tPmJ1dHRvbl91cmIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHFjbV9mcmVlX2ludChzdHJ1Y3QgcWNtICpjYW0pCi17Ci0JdXNiX2ZyZWVfdXJiKGNhbS0+YnV0dG9uX3VyYik7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0lOUFVUICovCi0KLXN0YXRpYyBpbnQgcWNtX3N0dl9zZXRiKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHUxNiByZWcsIHU4IHZhbCkKLXsKLQlpbnQgcmV0OwotCi0JLyogd2UnbGwgd2FpdCB1cCB0byAzIHNsaWNlcyBidXQgbm8gbW9yZSAqLwotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkweDA0LCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCXJlZywgMCwgJnZhbCwgMSwgMypIWik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxY21fc3R2X3NldHcoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTE2IHJlZywgX19sZTE2IHZhbCkKLXsKLQlpbnQgcmV0OwotCi0JLyogd2UnbGwgd2FpdCB1cCB0byAzIHNsaWNlcyBidXQgbm8gbW9yZSAqLwotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkweDA0LCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCXJlZywgMCwgJnZhbCwgMiwgMypIWik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxY21fc3R2X2dldHcoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkJCQkJCV9fbGUxNiAqdmFsKQotewotCWludCByZXQ7Ci0KLQkvKiB3ZSdsbCB3YWl0IHVwIHRvIDMgc2xpY2VzIGJ1dCBubyBtb3JlICovCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCTB4MDQsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4gfCBVU0JfUkVDSVBfREVWSUNFLAotCQlyZWcsIDAsIHZhbCwgMiwgMypIWik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxY21fY2FtZXJhX29uKHN0cnVjdCB1dmQgKnV2ZCkKLXsKLQlpbnQgcmV0OwotCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgU1RWX0lTT19FTkFCTEUsIDB4MDEpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxY21fY2FtZXJhX29mZihzdHJ1Y3QgdXZkICp1dmQpCi17Ci0JaW50IHJldDsKLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIFNUVl9JU09fRU5BQkxFLCAweDAwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHFjbV9oc3YycmdiKHUxNiBodWUsIHUxNiBzYXQsIHUxNiB2YWwsIHUxNiAqciwgdTE2ICpnLCB1MTYgKmIpCi17Ci0JdW5zaWduZWQgaW50IHNlZ21lbnQsIHZhbHNhdDsKLQlzaWduZWQgaW50ICAgaCA9IChzaWduZWQgaW50KSBodWU7Ci0JdW5zaWduZWQgaW50IHMgPSAoc2F0IC0gMzI3NjgpICogMjsJLyogcmVzY2FsZSAqLwotCXVuc2lnbmVkIGludCB2ID0gdmFsOwotCXVuc2lnbmVkIGludCBwOwotCi0JLyoKLQl0aGUgcmVnaXN0ZXJzIGNvbnRyb2xsaW5nIGdhaW4gYXJlIDggYml0IG9mIHdoaWNoCi0Jd2UgYWZmZWN0IG9ubHkgdGhlIGxhc3QgNCBiaXRzIHdpdGggb3VyIGdhaW4uCi0Jd2Uga25vdyB0aGF0IGlmIHNhdHVyYXRpb24gaXMgMCwgKHVuc2F0dXJhdGVkKSB0aGVuCi0Jd2UncmUgZ3JheXNjYWxlIChjZW50ZXIgYXhpcyBvZiB0aGUgY29sb3VyIGNvbmUpIHNvCi0Jd2Ugc2V0IHJnYj12YWx1ZS4gd2UgdXNlIGEgZm9ybXVsYSBvYnRhaW5lZCBmcm9tCi0Jd2lraXBlZGlhIHRvIG1hcCB0aGUgY29uZSB0byB0aGUgUkdCIHBsYW5lLiBpdCdzCi0JYXMgZm9sbG93cyBmb3IgdGhlIGh1bWFuIHZhbHVlIGNhc2Ugb2YgaD0wLi4zNjAsCi0Jcz0wLi4xLCB2PTAuLjEKLQloX2kgPSBoLzYwICUgNiAsIGYgPSBoLzYwIC0gaF9pICwgcCA9IHYoMS1zKQotCXEgPSB2KDEgLSBmKnMpICwgdCA9IHYoMSAtICgxLWYpcykKLQloX2k9PTAgPT4gcj12ICwgZz10LCBiPXAKLQloX2k9PTEgPT4gcj1xICwgZz12LCBiPXAKLQloX2k9PTIgPT4gcj1wICwgZz12LCBiPXQKLQloX2k9PTMgPT4gcj1wICwgZz1xLCBiPXYKLQloX2k9PTQgPT4gcj10ICwgZz1wLCBiPXYKLQloX2k9PTUgPT4gcj12ICwgZz1wLCBiPXEKLQl0aGUgYm90dG9tIHNpZGUgKHRoZSBwb2ludCkgYW5kIHRoZSBzdHVmZiBqdXN0IHVwCi0Jb2YgdGhhdCBpcyBibGFjayBzbyB3ZSBzaW1wbGlmeSB0aG9zZSB0d28gY2FzZXMuCi0JKi8KLQlpZiAoc2F0IDwgMzI3NjgpIHsKLQkJLyogYW55dGhpbmcgbGVzcyB0aGFuIHRoaXMgaXMgdW5zYXR1cmF0ZWQgKi8KLQkJKnIgPSB2YWw7Ci0JCSpnID0gdmFsOwotCQkqYiA9IHZhbDsKLQkJcmV0dXJuOwotCX0KLQlpZiAodmFsIDw9ICgweEZGRkYvOCkpIHsKLQkJLyogYW55dGhpbmcgbGVzcyB0aGFuIHRoaXMgaXMgYmxhY2sgKi8KLQkJKnIgPSAwOwotCQkqZyA9IDA7Ci0JCSpiID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHRoZSByZXN0IG9mIHRoaXMgY29kZSBpcyBjb3B5aW5nIHR1a2thdCdzCi0JaW1wbGVtZW50YXRpb24gb2YgdGhlIGhzdjJyZ2IgY29udmVyc2lvbiBhcyB0YWtlbgotCWZyb20gcWMtdXNiLW1lc3NlbmdlciBjb2RlLiB0aGUgMTA5MjMgaXMgMHhGRkZGLzYKLQl0byBkaXZpZGUgdGhlIGNvbmUgaW50byA2IHNlY3RvcnMuICAqLwotCi0Jc2VnbWVudCA9IChoICsgMTA5MjMpICYgMHhGRkZGOwotCXNlZ21lbnQgPSBzZWdtZW50KjMgPj4gMTY7CQkvKiAwLi4yOiAwPVIsIDE9RywgMj1CICovCi0JaHVlIC09IHNlZ21lbnQgKiAyMTg0NTsJCQkvKiAtMTA5MjMuLjEwOTIzICovCi0JaCA9IGh1ZTsKLQloICo9IDM7Ci0JdmFsc2F0ID0gdipzID4+IDE2OwkJCS8qIDAuLjY1NTM0ICovCi0JcCA9IHYgLSB2YWxzYXQ7Ci0JaWYgKGggPj0gMCkgewotCQl1bnNpZ25lZCBpbnQgdCA9IHYgLSAodmFsc2F0ICogKDMyNzY5IC0gaCkgPj4gMTUpOwotCQlzd2l0Y2ggKHNlZ21lbnQpIHsKLQkJY2FzZSAwOgkvKiBSLT4gKi8KLQkJCSpyID0gdjsKLQkJCSpnID0gdDsKLQkJCSpiID0gcDsKLQkJCWJyZWFrOwotCQljYXNlIDE6CS8qIEctPiAqLwotCQkJKnIgPSBwOwotCQkJKmcgPSB2OwotCQkJKmIgPSB0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoJLyogQi0+ICovCi0JCQkqciA9IHQ7Ci0JCQkqZyA9IHA7Ci0JCQkqYiA9IHY7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBxID0gdiAtICh2YWxzYXQgKiAoMzI3NjkgKyBoKSA+PiAxNSk7Ci0JCXN3aXRjaCAoc2VnbWVudCkgewotCQljYXNlIDA6CS8qIC0+UiAqLwotCQkJKnIgPSB2OwotCQkJKmcgPSBwOwotCQkJKmIgPSBxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToJLyogLT5HICovCi0JCQkqciA9IHE7Ci0JCQkqZyA9IHY7Ci0JCQkqYiA9IHA7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgkvKiAtPkIgKi8KLQkJCSpyID0gcDsKLQkJCSpnID0gcTsKLQkJCSpiID0gdjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0X2dhaW5zKHN0cnVjdCB1dmQgKnV2ZCwgdTE2IGh1ZSwKLQl1MTYgc2F0dXJhdGlvbiwgdTE2IHZhbHVlKQotewotCWludCByZXQ7Ci0JdTE2IHI9MCxnPTAsYj0wOwotCi0JLyogdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHFjLXVzYi1tZXNzZW5nZXIgKi8KLQlxY21faHN2MnJnYihodWUsIHNhdHVyYXRpb24sIHZhbHVlLCAmciwgJmcsICZiKTsKLQotCXIgPj49IDEyOwotCWcgPj49IDEyOwotCWIgPj49IDEyOwotCi0JLyogbWluIHZhbCBpcyA4ICovCi0JciA9IG1heCgodTE2KSA4LCByKTsKLQlnID0gbWF4KCh1MTYpIDgsIGcpOwotCWIgPSBtYXgoKHUxNikgOCwgYik7Ci0KLQlyIHw9IDB4MzA7Ci0JZyB8PSAweDMwOwotCWIgfD0gMHgzMDsKLQotCS8qIHNldCB0aGUgcixnLGIgZ2FpbiByZWdpc3RlcnMgKi8KLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MDUwOSwgcikpOwotCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgwNTBBLCBnKSk7Ci0JQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDA1MEIsIGIpKTsKLQotCS8qIGRvaW5nIGFzIHFjLXVzYiBkaWQgKi8KLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MDUwQywgMHgyQSkpOwotCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgwNTBELCAweDAxKSk7Ci0JQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0YsIDB4MDEpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0X2V4cG9zdXJlKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGV4cG9zdXJlKQotewotCWludCByZXQ7Ci0JaW50IGZvcm1lZHZhbDsKLQotCS8qIGNhbGN1bGF0aW9uIHdhcyBmcm9tIHFjLXVzYi1tZXNzZW5nZXIgZHJpdmVyICovCi0JZm9ybWVkdmFsID0gKCBleHBvc3VyZSA+PiAxMiApOwotCi0JLyogbWF4IHZhbHVlIGZvciBmb3JtZWR2YWwgaXMgMTQgKi8KLQlmb3JtZWR2YWwgPSBtaW4oZm9ybWVkdmFsLCAxNCk7Ci0KLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsCi0JCQkweDE0M0EsIDB4RjAgfCBmb3JtZWR2YWwpKTsKLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTQzRiwgMHgwMSkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0bGV2ZWxzKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGJyaWdodG5lc3MsIGludCBjb250cmFzdCwKLQkJCQkJaW50IGh1ZSwgaW50IGNvbG91cikKLXsKLQlpbnQgcmV0OwotCS8qIGJyaWdodG5lc3MgaXMgZXhwb3N1cmUsIGNvbnRyYXN0IGlzIGdhaW4sIGNvbG91ciBpcyBzYXR1cmF0aW9uICovCi0JQ0hFQ0tfUkVUKHJldCwKLQkJcWNtX3NlbnNvcl9zZXRfZXhwb3N1cmUodXZkLCBicmlnaHRuZXNzKSk7Ci0JQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRfZ2FpbnModXZkLCBodWUsIGNvbG91ciwgY29udHJhc3QpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0c2l6ZShzdHJ1Y3QgdXZkICp1dmQsIHU4IHNpemUpCi17Ci0JaW50IHJldDsKLQotCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNTA1LCBzaXplKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcWNtX3NlbnNvcl9zZXRfc2h1dHRlcihzdHJ1Y3QgdXZkICp1dmQsIGludCB3aGl0ZW5lc3MpCi17Ci0JaW50IHJldDsKLQkvKiBzb21lIHJlc2NhbGluZyBhcyBkb25lIGJ5IHRoZSBxYy11c2ItbWVzc2VuZ2VyIGNvZGUgKi8KLQlpZiAod2hpdGVuZXNzID4gMHhDMDAwKQotCQl3aGl0ZW5lc3MgPSAweEMwMDAgKyAod2hpdGVuZXNzICYgMHgzRkZGKSo4OwotCi0JQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0QsCi0JCQkJKHdoaXRlbmVzcyA+PiA4KSAmIDB4RkYpKTsKLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTQzRSwKLQkJCQkod2hpdGVuZXNzID4+IDE2KSAmIDB4MDMpKTsKLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTQzRiwgMHgwMSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcWNtX3NlbnNvcl9pbml0KHN0cnVjdCB1dmQgKnV2ZCkKLXsKLQlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JZm9yIChpPTA7IGkgPCBBUlJBWV9TSVpFKHJlZ3ZhbF90YWJsZSkgOyBpKyspIHsKLQkJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LAotCQkJCQlyZWd2YWxfdGFibGVbaV0ucmVnLAotCQkJCQlyZWd2YWxfdGFibGVbaV0udmFsKSk7Ci0JfQotCi0JQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXR3KHV2ZC0+ZGV2LCAweDE1YzEsCi0JCQkJY3B1X3RvX2xlMTYoSVNPQ19QQUNLRVRfU0laRSkpKTsKLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTVjMywgMHgwOCkpOwotCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNDNmLCAweDAxKSk7Ci0KLQlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIFNUVl9JU09fRU5BQkxFLCAweDAwKSk7Ci0KLQlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldHNpemUodXZkLCBjYW1lcmFfc2l6ZXNbY2FtLT5zaXplXS5jbWQpKTsKLQotCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0bGV2ZWxzKHV2ZCwgdXZkLT52cGljLmJyaWdodG5lc3MsCi0JCQl1dmQtPnZwaWMuY29udHJhc3QsIHV2ZC0+dnBpYy5odWUsIHV2ZC0+dnBpYy5jb2xvdXIpKTsKLQotCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0X3NodXR0ZXIodXZkLCB1dmQtPnZwaWMud2hpdGVuZXNzKSk7Ci0JQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRzaXplKHV2ZCwgY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uY21kKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxY21fc2V0X2NhbWVyYV9zaXplKHN0cnVjdCB1dmQgKnV2ZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOwotCi0JQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRzaXplKHV2ZCwgY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uY21kKSk7Ci0JY2FtLT53aWR0aCA9IGNhbWVyYV9zaXplc1tjYW0tPnNpemVdLndpZHRoOwotCWNhbS0+aGVpZ2h0ID0gY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uaGVpZ2h0OwotCXV2ZC0+dmlkZW9zaXplID0gVklERU9TSVpFKGNhbS0+d2lkdGgsIGNhbS0+aGVpZ2h0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHFjbV9zZXR1cF9vbl9vcGVuKHN0cnVjdCB1dmQgKnV2ZCkKLXsKLQlpbnQgcmV0OwotCi0JQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRfZ2FpbnModXZkLCB1dmQtPnZwaWMuaHVlLAotCQkJCXV2ZC0+dnBpYy5jb2xvdXIsIHV2ZC0+dnBpYy5jb250cmFzdCkpOwotCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0X2V4cG9zdXJlKHV2ZCwgdXZkLT52cGljLmJyaWdodG5lc3MpKTsKLQlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldF9zaHV0dGVyKHV2ZCwgdXZkLT52cGljLndoaXRlbmVzcykpOwotCUNIRUNLX1JFVChyZXQsIHFjbV9zZXRfY2FtZXJhX3NpemUodXZkKSk7Ci0JQ0hFQ0tfUkVUKHJldCwgcWNtX2NhbWVyYV9vbih1dmQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcWNtX2FkanVzdF9waWN0dXJlKHN0cnVjdCB1dmQgKnV2ZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOwotCi0JcmV0ID0gcWNtX2NhbWVyYV9vZmYodXZkKTsKLQlpZiAocmV0KSB7Ci0JCWVycigiY2FuJ3QgdHVybiBjYW1lcmEgb2ZmLiBhYmFuZG9uaW5nIHBpYyBhZGp1c3RtZW50Iik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBpZiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgaW4gY29udHJhc3QsIGh1ZSwgb3IKLQljb2xvdXIgdGhlbiB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGhzdiBpbiBvcmRlcgotCXRvIHVwZGF0ZSBnYWlucyAqLwotCWlmICgoY2FtLT5jb250cmFzdCAhPSB1dmQtPnZwaWMuY29udHJhc3QpIHx8Ci0JCShjYW0tPmh1ZSAhPSB1dmQtPnZwaWMuaHVlKSB8fAotCQkoY2FtLT5jb2xvdXIgIT0gdXZkLT52cGljLmNvbG91cikpIHsKLQkJY2FtLT5jb250cmFzdCA9IHV2ZC0+dnBpYy5jb250cmFzdDsKLQkJY2FtLT5odWUgPSB1dmQtPnZwaWMuaHVlOwotCQljYW0tPmNvbG91ciA9IHV2ZC0+dnBpYy5jb2xvdXI7Ci0JCXJldCA9IHFjbV9zZW5zb3Jfc2V0X2dhaW5zKHV2ZCwgY2FtLT5odWUsIGNhbS0+Y29sb3VyLAotCQkJCQkJY2FtLT5jb250cmFzdCk7Ci0JCWlmIChyZXQpIHsKLQkJCWVycigiY2FuJ3Qgc2V0IGdhaW5zLiBhYmFuZG9uaW5nIHBpYyBhZGp1c3RtZW50Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoY2FtLT5icmlnaHRuZXNzICE9IHV2ZC0+dnBpYy5icmlnaHRuZXNzKSB7Ci0JCWNhbS0+YnJpZ2h0bmVzcyA9IHV2ZC0+dnBpYy5icmlnaHRuZXNzOwotCQlyZXQgPSBxY21fc2Vuc29yX3NldF9leHBvc3VyZSh1dmQsIGNhbS0+YnJpZ2h0bmVzcyk7Ci0JCWlmIChyZXQpIHsKLQkJCWVycigiY2FuJ3Qgc2V0IGV4cG9zdXJlLiBhYmFuZG9uaW5nIHBpYyBhZGp1c3RtZW50Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoY2FtLT53aGl0ZW5lc3MgIT0gdXZkLT52cGljLndoaXRlbmVzcykgewotCQljYW0tPndoaXRlbmVzcyA9IHV2ZC0+dnBpYy53aGl0ZW5lc3M7Ci0JCXFjbV9zZW5zb3Jfc2V0X3NodXR0ZXIodXZkLCBjYW0tPndoaXRlbmVzcyk7Ci0JCWlmIChyZXQpIHsKLQkJCWVycigiY2FuJ3Qgc2V0IHNodXR0ZXIuIGFiYW5kb25pbmcgcGljIGFkanVzdG1lbnQiKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXJldCA9IHFjbV9jYW1lcmFfb24odXZkKTsKLQlpZiAocmV0KSB7Ci0JCWVycigiY2FuJ3QgcmVlbmFibGUgY2FtZXJhLiBwaWMgYWRqdXN0bWVudCBmYWlsZWQiKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIGludCBxY21fcHJvY2Vzc19mcmFtZShzdHJ1Y3QgdXZkICp1dmQsIHU4ICpjZGF0YSwgaW50IGZyYW1lbGVuKQotewotCWludCBkYXRhbGVuOwotCWludCB0b3RhbGRhdGE7Ci0Jc3RydWN0IGZyYW1laGRyIHsKLQkJX19iZTE2IGlkOwotCQlfX2JlMTYgbGVuOwotCX07Ci0Jc3RydWN0IGZyYW1laGRyICpmaGRyOwotCi0JdG90YWxkYXRhID0gMDsKLQl3aGlsZSAoZnJhbWVsZW4pIHsKLQkJZmhkciA9IChzdHJ1Y3QgZnJhbWVoZHIgKikgY2RhdGE7Ci0JCWRhdGFsZW4gPSBiZTE2X3RvX2NwdShmaGRyLT5sZW4pOwotCQlmcmFtZWxlbiAtPSA0OwotCQljZGF0YSArPSA0OwotCi0JCWlmICgoZmhkci0+aWQpID09IGNwdV90b19iZTE2KDB4ODAwMSkpIHsKLQkJCVJpbmdRdWV1ZV9FbnF1ZXVlKCZ1dmQtPmRwLCBtYXJrZXIsIDQpOwotCQkJdG90YWxkYXRhICs9IDQ7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoKGZoZHItPmlkICYgY3B1X3RvX2JlMTYoMHhGRjAwKSkgPT0gY3B1X3RvX2JlMTYoMHgwMjAwKSkgewotCQkJUmluZ1F1ZXVlX0VucXVldWUoJnV2ZC0+ZHAsIGNkYXRhLCBkYXRhbGVuKTsKLQkJCXRvdGFsZGF0YSArPSBkYXRhbGVuOwotCQl9Ci0JCWZyYW1lbGVuIC09IGRhdGFsZW47Ci0JCWNkYXRhICs9IGRhdGFsZW47Ci0JfQotCXJldHVybiB0b3RhbGRhdGE7Ci19Ci0KLXN0YXRpYyBpbnQgcWNtX2NvbXByZXNzX2lzbyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1cmIgKmRhdGF1cmIpCi17Ci0JaW50IHRvdGxlbjsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyICpjZGF0YTsKLQotCXRvdGxlbj0wOwotCWZvciAoaSA9IDA7IGkgPCBkYXRhdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7Ci0JCWludCBuID0gZGF0YXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKLQkJaW50IHN0ID0gZGF0YXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOwotCi0JCWNkYXRhID0gZGF0YXVyYi0+dHJhbnNmZXJfYnVmZmVyICsKLQkJCWRhdGF1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKLQotCQlpZiAoc3QgPCAwKSB7Ci0JCQlkZXZfd2FybigmdXZkLT5kZXYtPmRldiwKLQkJCQkgIkRhdGEgZXJyb3I6IHBhY2tldD0lZC4gbGVuPSVkLiBzdGF0dXM9JWQuXG4iLAotCQkJCSBpLCBuLCBzdCk7Ci0JCQl1dmQtPnN0YXRzLmlzb19lcnJfY291bnQrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghbikKLQkJCWNvbnRpbnVlOwotCi0JCXRvdGxlbiArPSBxY21fcHJvY2Vzc19mcmFtZSh1dmQsIGNkYXRhLCBuKTsKLQl9Ci0JcmV0dXJuIHRvdGxlbjsKLX0KLQotc3RhdGljIHZvaWQgcmVzdWJtaXRfdXJiKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVyYiAqdXJiKQotewotCWludCByZXQ7Ci0KLQl1cmItPmRldiA9IHV2ZC0+ZGV2OwotCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldCkKLQkJZXJyKCJ1c2Jfc3VibWl0X3VyYiBlcnJvciAoJWQpIiwgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQgcWNtX2lzb2NfaXJxKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlpbnQgbGVuOwotCXN0cnVjdCB1dmQgKnV2ZCA9IHVyYi0+Y29udGV4dDsKLQotCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCi0JCXJldHVybjsKLQotCWlmICghdXZkLT5zdHJlYW1pbmcpCi0JCXJldHVybjsKLQotCXV2ZC0+c3RhdHMudXJiX2NvdW50Kys7Ci0KLQlpZiAoIXVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQlyZXN1Ym1pdF91cmIodXZkLCB1cmIpOwotCQlyZXR1cm47Ci0JfQotCi0JbGVuID0gcWNtX2NvbXByZXNzX2lzbyh1dmQsIHVyYik7Ci0JcmVzdWJtaXRfdXJiKHV2ZCwgdXJiKTsKLQl1dmQtPnN0YXRzLnVyYl9sZW5ndGggPSBsZW47Ci0JdXZkLT5zdGF0cy5kYXRhX2NvdW50ICs9IGxlbjsKLQlpZiAobGVuKQotCQlSaW5nUXVldWVfV2FrZVVwSW50ZXJydXB0aWJsZSgmdXZkLT5kcCk7Ci19Ci0KLXN0YXRpYyBpbnQgcWNtX3N0YXJ0X2RhdGEoc3RydWN0IHV2ZCAqdXZkKQotewotCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOwotCWludCBpOwotCWludCBlcnJmbGFnOwotCWludCBwa3RzejsKLQlpbnQgZXJyOwotCi0JcGt0c3ogPSB1dmQtPmlzb19wYWNrZXRfbGVuOwotCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpIHsKLQkJZXJyKCJDYW1lcmEgaXMgbm90IG9wZXJhdGlvbmFsIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHV2ZC0+ZGV2LCB1dmQtPmlmYWNlLCB1dmQtPmlmYWNlQWx0QWN0aXZlKTsKLQlpZiAoZXJyIDwgMCkgewotCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlIGVycm9yIik7Ci0JCXV2ZC0+bGFzdF9lcnJvciA9IGVycjsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgewotCQlpbnQgaiwgazsKLQkJc3RydWN0IHVyYiAqdXJiID0gdXZkLT5zYnVmW2ldLnVyYjsKLQkJdXJiLT5kZXYgPSB1dmQtPmRldjsKLQkJdXJiLT5jb250ZXh0ID0gdXZkOwotCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodXZkLT5kZXYsIHV2ZC0+dmlkZW9fZW5kcCk7Ci0JCXVyYi0+aW50ZXJ2YWwgPSAxOwotCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHV2ZC0+c2J1ZltpXS5kYXRhOwotCQl1cmItPmNvbXBsZXRlID0gcWNtX2lzb2NfaXJxOwotCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gRlJBTUVTX1BFUl9ERVNDOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwa3RzeiAqIEZSQU1FU19QRVJfREVTQzsKLQkJZm9yIChqPWs9MDsgaiA8IEZSQU1FU19QRVJfREVTQzsgaisrLCBrICs9IHBrdHN6KSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGs7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBrdHN6OwotCQl9Ci0JfQotCi0JdXZkLT5zdHJlYW1pbmcgPSAxOwotCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKLQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgewotCQllcnJmbGFnID0gdXNiX3N1Ym1pdF91cmIodXZkLT5zYnVmW2ldLnVyYiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlcnJmbGFnKQotCQkJZXJyICgidXNiX3N1Ym1pdF9pc29jKCVkKSByZXQgJWQiLCBpLCBlcnJmbGFnKTsKLQl9Ci0KLQlDSEVDS19SRVQoZXJyLCBxY21fc2V0dXBfaW5wdXRfaW50KGNhbSwgdXZkKSk7Ci0JQ0hFQ0tfUkVUKGVyciwgcWNtX2NhbWVyYV9vbih1dmQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcWNtX3N0b3BfZGF0YShzdHJ1Y3QgdXZkICp1dmQpCi17Ci0Jc3RydWN0IHFjbSAqY2FtOwotCWludCBpLCBqOwotCWludCByZXQ7Ci0KLQlpZiAoKHV2ZCA9PSBOVUxMKSB8fCAoIXV2ZC0+c3RyZWFtaW5nKSB8fCAodXZkLT5kZXYgPT0gTlVMTCkpCi0JCXJldHVybjsKLQljYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKLQotCXJldCA9IHFjbV9jYW1lcmFfb2ZmKHV2ZCk7Ci0JaWYgKHJldCkKLQkJZGV2X3dhcm4oJnV2ZC0+ZGV2LT5kZXYsICJjb3VsZG4ndCB0dXJuIHRoZSBjYW0gb2ZmLlxuIik7Ci0KLQl1dmQtPnN0cmVhbWluZyA9IDA7Ci0KLQkvKiBVbnNjaGVkdWxlIGFsbCBvZiB0aGUgaXNvIHRkJ3MgKi8KLQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykKLQkJdXNiX2tpbGxfdXJiKHV2ZC0+c2J1ZltpXS51cmIpOwotCi0JcWNtX3N0b3BfaW50X2RhdGEoY2FtKTsKLQotCWlmICghdXZkLT5yZW1vdmVfcGVuZGluZykgewotCQkvKiBTZXQgcGFja2V0IHNpemUgdG8gMCAqLwotCQlqID0gdXNiX3NldF9pbnRlcmZhY2UodXZkLT5kZXYsIHV2ZC0+aWZhY2UsCi0JCQkJCXV2ZC0+aWZhY2VBbHRJbmFjdGl2ZSk7Ci0JCWlmIChqIDwgMCkgewotCQkJZXJyKCJ1c2Jfc2V0X2ludGVyZmFjZSgpIGVycm9yICVkLiIsIGopOwotCQkJdXZkLT5sYXN0X2Vycm9yID0gajsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgcWNtX3Byb2Nlc3NfaXNvYyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpCi17Ci0Jc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7Ci0JaW50IHg7Ci0Jc3RydWN0IHJnYiAqcmdiTDA7Ci0Jc3RydWN0IHJnYiAqcmdiTDE7Ci0Jc3RydWN0IGJheUwwICpiYXlMMDsKLQlzdHJ1Y3QgYmF5TDEgKmJheUwxOwotCWludCBob3IsdmVyLGhvcmRlbCx2ZXJkZWw7Ci0JYXNzZXJ0KGZyYW1lICE9IE5VTEwpOwotCi0Jc3dpdGNoIChjYW0tPnNpemUpIHsKLQljYXNlIFNJWkVfMTYwWDEyMDoKLQkJaG9yID0gMTYyOyB2ZXIgPSAxMjQ7IGhvcmRlbCA9IDE7IHZlcmRlbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0laRV8zMjBYMjQwOgotCWRlZmF1bHQ6Ci0JCWhvciA9IDMyNDsgdmVyID0gMjQ4OyBob3JkZWwgPSAyOyB2ZXJkZWwgPSA0OwotCQlicmVhazsKLQl9Ci0KLQlpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTY2FuU3RhdGVfU2Nhbm5pbmcpIHsKLQkJd2hpbGUgKFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApID49Ci0JCQkgNCArIChob3IqdmVyZGVsICsgaG9yZGVsKSkgewotCQkJaWYgKChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDApID09IDB4MDApICYmCi0JCQkgICAgKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMSkgPT0gMHhmZikgJiYKLQkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAyKSA9PSAweDAwKSAmJgotCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDMpID09IDB4ZmYpKSB7Ci0JCQkJZnJhbWUtPmN1cmxpbmUgPSAwOwotCQkJCWZyYW1lLT5zY2Fuc3RhdGUgPSBTY2FuU3RhdGVfTGluZXM7Ci0JCQkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0dyYWJiaW5nOwotCQkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwgNCk7Ci0JCQkvKgotCQkJKiBpZiB3ZSdyZSBzdGFydGluZywgd2UgbmVlZCB0byBkaXNjYXJkIHRoZSBmaXJzdAotCQkJKiA0IGxpbmVzIG9mIHkgYmF5ZXIgZGF0YQotCQkJKiBhbmQgdGhlIGZpcnN0IDIgZ3IgZWxlbWVudHMgb2YgeCBiYXllciBkYXRhCi0JCQkqLwotCQkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwKLQkJCQkJCQkoaG9yKnZlcmRlbCArIGhvcmRlbCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLCAxKTsKLQkJfQotCX0KLQotCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNjYW5TdGF0ZV9TY2FubmluZykKLQkJcmV0dXJuOwotCi0JLyogbm93IHdlIGNhbiBzdGFydCBwcm9jZXNzaW5nIGJheWVyIGRhdGEgc28gbG9uZyBhcyB3ZSBoYXZlIGF0IGxlYXN0Ci0JKiAyIGxpbmVzIHdvcnRoIG9mIGRhdGEuIHRoaXMgaXMgdGhlIHNpbXBsZXN0IGRlbW9zYWljaW5nIG1ldGhvZCB0aGF0Ci0JKiBJIGNvdWxkIHRoaW5rIG9mLiBJIHVzZSBlYWNoIDJ4MiBiYXllciBlbGVtZW50IHdpdGhvdXQgaW50ZXJwb2xhdGlvbgotCSogdG8gZ2VuZXJhdGUgNCByZ2IgcGl4ZWxzLgotCSovCi0Jd2hpbGUgKCBmcmFtZS0+Y3VybGluZSA8IGNhbS0+aGVpZ2h0ICYmCi0JCShSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+PSBob3IqMikpIHsKLQkJLyogZ2V0IDIgbGluZXMgb2YgYmF5ZXIgZm9yIGRlbW9zYWljaW5nCi0JCSAqIGludG8gMiBsaW5lcyBvZiBSR0IgKi8KLQkJUmluZ1F1ZXVlX0RlcXVldWUoJnV2ZC0+ZHAsIGNhbS0+c2NyYXRjaCwgaG9yKjIpOwotCQliYXlMMCA9IChzdHJ1Y3QgYmF5TDAgKikgY2FtLT5zY3JhdGNoOwotCQliYXlMMSA9IChzdHJ1Y3QgYmF5TDEgKikgKGNhbS0+c2NyYXRjaCArIGhvcik7Ci0JCS8qIGZyYW1lLT5jdXJsaW5lIGlzIHRoZSByZ2IgeSBsaW5lICovCi0JCXJnYkwwID0gKHN0cnVjdCByZ2IgKikKLQkJCQkoIGZyYW1lLT5kYXRhICsgKGNhbS0+d2lkdGgqMypmcmFtZS0+Y3VybGluZSkpOwotCQkvKiB3LzIgYmVjYXVzZSB3ZSdyZSBhbHJlYWR5IGRvaW5nIDIgcGl4ZWxzICovCi0JCXJnYkwxID0gcmdiTDAgKyAoY2FtLT53aWR0aC8yKTsKLQotCQlmb3IgKHg9MDsgeCA8IGNhbS0+d2lkdGg7IHgrPTIpIHsKLQkJCXJnYkwwLT5yID0gYmF5TDAtPnI7Ci0JCQlyZ2JMMC0+ZyA9IGJheUwwLT5nOwotCQkJcmdiTDAtPmIgPSBiYXlMMS0+YjsKLQotCQkJcmdiTDAtPnIyID0gYmF5TDAtPnI7Ci0JCQlyZ2JMMC0+ZzIgPSBiYXlMMS0+ZzsKLQkJCXJnYkwwLT5iMiA9IGJheUwxLT5iOwotCi0JCQlyZ2JMMS0+ciA9IGJheUwwLT5yOwotCQkJcmdiTDEtPmcgPSBiYXlMMS0+ZzsKLQkJCXJnYkwxLT5iID0gYmF5TDEtPmI7Ci0KLQkJCXJnYkwxLT5yMiA9IGJheUwwLT5yOwotCQkJcmdiTDEtPmcyID0gYmF5TDEtPmc7Ci0JCQlyZ2JMMS0+YjIgPSBiYXlMMS0+YjsKLQotCQkJcmdiTDArKzsKLQkJCXJnYkwxKys7Ci0KLQkJCWJheUwwKys7Ci0JCQliYXlMMSsrOwotCQl9Ci0KLQkJZnJhbWUtPnNlcVJlYWRfTGVuZ3RoICs9IGNhbS0+d2lkdGgqMyoyOwotCQlmcmFtZS0+Y3VybGluZSArPSAyOwotCX0KLQkvKiBTZWUgaWYgd2UgZmlsbGVkIHRoZSBmcmFtZSAqLwotCWlmIChmcmFtZS0+Y3VybGluZSA9PSBjYW0tPmhlaWdodCkgewotCQlmcmFtZS0+ZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfRG9uZV9Ib2xkOwotCQlmcmFtZS0+Y3VybGluZSA9IDA7Ci0JCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKLQkJdXZkLT5zdGF0cy5mcmFtZV9udW0rKzsKLQl9Ci19Ci0KLS8qIHRha2VuIGZyb20ga29uaWNhd2MgKi8KLXN0YXRpYyBpbnQgcWNtX3NldF92aWRlb19tb2RlKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHZpZGVvX3dpbmRvdyAqdncpCi17Ci0JaW50IHJldDsKLQlpbnQgbmV3c2l6ZTsKLQlpbnQgb2xkc2l6ZTsKLQlpbnQgeCA9IHZ3LT53aWR0aDsKLQlpbnQgeSA9IHZ3LT5oZWlnaHQ7Ci0Jc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7Ci0KLQlpZiAoeCA+IDAgJiYgeSA+IDApIHsKLQkJREVCVUcoMiwgInRyeWluZyB0byBmaW5kIHNpemUgJWQsJWQiLCB4LCB5KTsKLQkJZm9yIChuZXdzaXplID0gMDsgbmV3c2l6ZSA8PSBNQVhfRlJBTUVfU0laRTsgbmV3c2l6ZSsrKSB7Ci0JCQlpZiAoKGNhbWVyYV9zaXplc1tuZXdzaXplXS53aWR0aCA9PSB4KSAmJgotCQkJCShjYW1lcmFfc2l6ZXNbbmV3c2l6ZV0uaGVpZ2h0ID09IHkpKQotCQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlCi0JCW5ld3NpemUgPSBjYW0tPnNpemU7Ci0KLQlpZiAobmV3c2l6ZSA+IE1BWF9GUkFNRV9TSVpFKSB7Ci0JCURFQlVHKDEsICJjb3VsZG4ndCBmaW5kIHNpemUgJWQsJWQiLCB4LCB5KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG5ld3NpemUgPT0gY2FtLT5zaXplKSB7Ci0JCURFQlVHKDEsICJOb3RoaW5nIHRvIGRvIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXFjbV9zdG9wX2RhdGEodXZkKTsKLQotCWlmIChjYW0tPnNpemUgIT0gbmV3c2l6ZSkgewotCQlvbGRzaXplID0gY2FtLT5zaXplOwotCQljYW0tPnNpemUgPSBuZXdzaXplOwotCQlyZXQgPSBxY21fc2V0X2NhbWVyYV9zaXplKHV2ZCk7Ci0JCWlmIChyZXQpIHsKLQkJCWVycigiQ291bGRuJ3Qgc2V0IGNhbWVyYSBzaXplLCBlcnI9JWQiLHJldCk7Ci0JCQkvKiByZXN0b3JlIHRoZSBvcmlnaW5hbCBzaXplICovCi0JCQljYW0tPnNpemUgPSBvbGRzaXplOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCS8qIEZsdXNoIHRoZSBpbnB1dCBxdWV1ZSBhbmQgY2xlYXIgYW55IGN1cnJlbnQgZnJhbWUgaW4gcHJvZ3Jlc3MgKi8KLQotCVJpbmdRdWV1ZV9GbHVzaCgmdXZkLT5kcCk7Ci0JaWYgKHV2ZC0+Y3VyZnJhbWUgIT0gLTEpIHsKLQkJdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXS5jdXJsaW5lID0gMDsKLQkJdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXS5zZXFSZWFkX0xlbmd0aCA9IDA7Ci0JCXV2ZC0+ZnJhbWVbdXZkLT5jdXJmcmFtZV0uc2VxUmVhZF9JbmRleCA9IDA7Ci0JfQotCi0JQ0hFQ0tfUkVUKHJldCwgcWNtX3N0YXJ0X2RhdGEodXZkKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcWNtX2NvbmZpZ3VyZV92aWRlbyhzdHJ1Y3QgdXZkICp1dmQpCi17Ci0JaW50IHJldDsKLQltZW1zZXQoJnV2ZC0+dnBpYywgMCwgc2l6ZW9mKHV2ZC0+dnBpYykpOwotCW1lbXNldCgmdXZkLT52cGljX29sZCwgMHg1NSwgc2l6ZW9mKHV2ZC0+dnBpY19vbGQpKTsKLQotCXV2ZC0+dnBpYy5jb2xvdXIgPSBjb2xvdXI7Ci0JdXZkLT52cGljLmh1ZSA9IGh1ZTsKLQl1dmQtPnZwaWMuYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7Ci0JdXZkLT52cGljLmNvbnRyYXN0ID0gY29udHJhc3Q7Ci0JdXZkLT52cGljLndoaXRlbmVzcyA9IHdoaXRlbmVzczsKLQl1dmQtPnZwaWMuZGVwdGggPSAyNDsKLQl1dmQtPnZwaWMucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7Ci0KLQltZW1zZXQoJnV2ZC0+dmNhcCwgMCwgc2l6ZW9mKHV2ZC0+dmNhcCkpOwotCXN0cmNweSh1dmQtPnZjYXAubmFtZSwgIlFDTSBVU0IgQ2FtZXJhIik7Ci0JdXZkLT52Y2FwLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOwotCXV2ZC0+dmNhcC5jaGFubmVscyA9IDE7Ci0JdXZkLT52Y2FwLmF1ZGlvcyA9IDA7Ci0KLQl1dmQtPnZjYXAubWlud2lkdGggPSBjYW1lcmFfc2l6ZXNbU0laRV8xNjBYMTIwXS53aWR0aDsKLQl1dmQtPnZjYXAubWluaGVpZ2h0ID0gY2FtZXJhX3NpemVzW1NJWkVfMTYwWDEyMF0uaGVpZ2h0OwotCXV2ZC0+dmNhcC5tYXh3aWR0aCA9IGNhbWVyYV9zaXplc1tTSVpFXzMyMFgyNDBdLndpZHRoOwotCXV2ZC0+dmNhcC5tYXhoZWlnaHQgPSBjYW1lcmFfc2l6ZXNbU0laRV8zMjBYMjQwXS5oZWlnaHQ7Ci0KLQltZW1zZXQoJnV2ZC0+dmNoYW4sIDAsIHNpemVvZih1dmQtPnZjaGFuKSk7Ci0JdXZkLT52Y2hhbi5mbGFncyA9IDAgOwotCXV2ZC0+dmNoYW4udHVuZXJzID0gMDsKLQl1dmQtPnZjaGFuLmNoYW5uZWwgPSAwOwotCXV2ZC0+dmNoYW4udHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwotCXN0cmNweSh1dmQtPnZjaGFuLm5hbWUsICJDYW1lcmEiKTsKLQotCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3JfaW5pdCh1dmQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxY21fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqZGV2aWQpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgdXZkICp1dmQ7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0Jc3RydWN0IHFjbSAqY2FtOwotCXNpemVfdCBidWZmZXJfc2l6ZTsKLQl1bnNpZ25lZCBjaGFyIHZpZGVvX2VwOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwotCWludCBpLGo7Ci0JdW5zaWduZWQgaW50IGlmYWNlbnVtLCBpZmFjZW51bV9pbmFjdD0wOwotCV9fbGUxNiBzZW5zb3JfaWQ7Ci0KLQkvKiB3ZSBkb24ndCBzdXBwb3J0IG11bHRpY29uZmlnIGNhbXMgKi8KLQlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIGZpcnN0IGNoZWNrIGZvciB0aGUgdmlkZW8gaW50ZXJmYWNlIGFuZCBub3QKLQkqIHRoZSBhdWRpbyBpbnRlcmZhY2UgKi8KLQlpbnRlcmZhY2UgPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmdbMF07Ci0JaWYgKChpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykKLQkJfHwgKGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0KLQkJCVVTQl9DTEFTU19WRU5ET1JfU1BFQykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyoKLQl3YWxrIHRocm91Z2ggZWFjaCBlbmRwb2ludCBpbiBlYWNoIHNldHRpbmcgaW4gdGhlIGludGVyZmFjZQotCXN0b3Agd2hlbiB3ZSBmaW5kIHRoZSBvbmUgdGhhdCdzIGFuIGlzb2Nocm9ub3VzIElOIGVuZHBvaW50LgotCSovCi0JZm9yIChpPTA7IGkgPCBpbnRmLT5udW1fYWx0c2V0dGluZzsgaSsrKSB7Ci0JCWludGVyZmFjZSA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZ1tpXTsKLQkJaWZhY2VudW0gPSBpbnRlcmZhY2UtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmc7Ci0JCS8qIHdhbGsgdGhlIGVuZCBwb2ludHMgKi8KLQkJZm9yIChqPTA7IGogPCBpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50czsgaisrKSB7Ci0JCQllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50W2pdLmRlc2M7Ci0KLQkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX291dChlbmRwb2ludCkpCi0JCQkJY29udGludWU7IC8qIG5vdCBpbnB1dCB0aGVuIG5vdCBnb29kICovCi0KLQkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLQkJCWlmICghYnVmZmVyX3NpemUpIHsKLQkJCQlpZmFjZW51bV9pbmFjdCA9IGlmYWNlbnVtOwotCQkJCWNvbnRpbnVlOyAvKiAwIHBrdCBzaXplIGlzIG5vdCB3aGF0IHdlIHdhbnQgKi8KLQkJCX0KLQotCQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7Ci0JCQkJdmlkZW9fZXAgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCQkvKiBicmVhayBvdXQgb2YgdGhlIHNlYXJjaCAqLwotCQkJCWdvdG8gZ29vZF92aWRlb2VwOwotCQkJfQotCQl9Ci0JfQotCS8qIGZhaWxlZCBvdXQgc2luY2Ugbm90aGluZyB1c2VmdWwgd2FzIGZvdW5kICovCi0JZXJyKCJObyBzdWl0YWJsZSBlbmRwb2ludCB3YXMgZm91bmRcbiIpOwotCXJldHVybiAtRU5PREVWOwotCi1nb29kX3ZpZGVvZXA6Ci0JLyogZGlzYWJsZSBpc29jaHJvbm91cyBzdHJlYW0gYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgKi8KLQllcnIgPSBxY21fc3R2X3NldGIoZGV2LCBTVFZfSVNPX0VOQUJMRSwgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBzZW5zb3Igc3RyZWFtIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JQ2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIHVua25vd24gc2Vuc29yIHRoYXQgaXMga25vd24gdG8gd29yay4gVGhpcwotCXNlbnNvciBpcyBzdXNwZWN0ZWQgdG8gYmUgdGhlIFNUIFZWNjQyMkMwMDEuIEknbGwgY2hlY2sgdGhlIHNhbWUgdmFsdWUKLQl0aGF0IHRoZSBxYy11c2IgZHJpdmVyIGNoZWNrcy4gVGhpcyB2YWx1ZSBpcyBwcm9iYWJseSBub3QgZXZlbiB0aGUKLQlzZW5zb3IgSUQgc2luY2UgaXQgbWF0Y2hlcyB0aGUgVVNCIGRldiBJRC4gT2ggd2VsbC4gSWYgaXQgZG9lc24ndAotCW1hdGNoLCBpdCdzIHByb2JhYmx5IGEgZGlmZiBzZW5zb3Igc28gZXhpdCBhbmQgYXBvbG9naXplLgotCSovCi0JZXJyID0gcWNtX3N0dl9nZXR3KGRldiwgQ01PU19TRU5TT1JfSURSRVYsICZzZW5zb3JfaWQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiQ291bGRuJ3QgcmVhZCBzZW5zb3IgdmFsdWVzLiBFcnIgJWRcbiIsZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKHNlbnNvcl9pZCAhPSBjcHVfdG9fbGUxNigweDA4RjApKSB7Ci0JCWVycigiU2Vuc29yIElEICV4ICE9ICV4LiBVbnN1cHBvcnRlZC4gU29ycnlcbiIsCi0JCQlsZTE2X3RvX2NwdShzZW5zb3JfaWQpLCAoMHgwOEYwKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXV2ZCA9IHVzYnZpZGVvX0FsbG9jYXRlRGV2aWNlKGNhbXMpOwotCWlmICghdXZkKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOwotCi0JLyogYnVmIGZvciBkb2luZyBkZW1vc2FpY2luZyAqLwotCWNhbS0+c2NyYXRjaCA9IGttYWxsb2MoMzI0KjIsIEdGUF9LRVJORUwpOwotCWlmICghY2FtLT5zY3JhdGNoKSAvKiB1dmQgZnJlZWQgaW4gZGVyZWcgKi8KLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiB5ZXMsIGlmIHdlIGZhaWwgYWZ0ZXIgaGVyZSwgY2FtLT5zY3JhdGNoIGdldHMgZnJlZWQKLQlieSBxY21fZnJlZV91dmQgKi8KLQotCWVyciA9IHFjbV9hbGxvY19pbnRfdXJiKGNhbSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiB5ZXMsIGlmIHdlIGZhaWwgYWZ0ZXIgaGVyZSwgaW50IHVyYiBnZXRzIGZyZWVkCi0JYnkgcWNtX2ZyZWVfdXZkICovCi0KLQlSRVNUUklDVF9UT19SQU5HRShzaXplLCBTSVpFXzE2MFgxMjAsIFNJWkVfMzIwWDI0MCk7Ci0JY2FtLT53aWR0aCA9IGNhbWVyYV9zaXplc1tzaXplXS53aWR0aDsKLQljYW0tPmhlaWdodCA9IGNhbWVyYV9zaXplc1tzaXplXS5oZWlnaHQ7Ci0JY2FtLT5zaXplID0gc2l6ZTsKLQotCXV2ZC0+ZGVidWcgPSBkZWJ1ZzsKLQl1dmQtPmZsYWdzID0gMDsKLQl1dmQtPmRldiA9IGRldjsKLQl1dmQtPmlmYWNlID0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwotCXV2ZC0+aWZhY2VBbHRBY3RpdmUgPSBpZmFjZW51bTsKLQl1dmQtPmlmYWNlQWx0SW5hY3RpdmUgPSBpZmFjZW51bV9pbmFjdDsKLQl1dmQtPnZpZGVvX2VuZHAgPSB2aWRlb19lcDsKLQl1dmQtPmlzb19wYWNrZXRfbGVuID0gYnVmZmVyX3NpemU7Ci0JdXZkLT5wYWxldHRlQml0cyA9IDFMIDw8IFZJREVPX1BBTEVUVEVfUkdCMjQ7Ci0JdXZkLT5kZWZhdWx0UGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7Ci0JdXZkLT5jYW52YXMgPSBWSURFT1NJWkUoMzIwLCAyNDApOwotCXV2ZC0+dmlkZW9zaXplID0gVklERU9TSVpFKGNhbS0+d2lkdGgsIGNhbS0+aGVpZ2h0KTsKLQllcnIgPSBxY21fY29uZmlndXJlX3ZpZGVvKHV2ZCk7Ci0JaWYgKGVycikgewotCQllcnIoImZhaWxlZCB0byBjb25maWd1cmUgdmlkZW8gc2V0dGluZ3MiKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQllcnIgPSB1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKHV2ZCk7Ci0JaWYgKGVycikgeyAvKiB0aGUgdXZkIGdldHMgZnJlZWQgaW4gRGVyZWdpc3RlciAqLwotCQllcnIoInVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UoKSBmYWlsZWQuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JdXZkLT5tYXhfZnJhbWVfc2l6ZSA9ICgzMjAgKiAyNDAgKiAzKTsKLQlxY21fcmVnaXN0ZXJfaW5wdXQoY2FtLCBkZXYpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgdXZkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcWNtX2ZyZWVfdXZkKHN0cnVjdCB1dmQgKnV2ZCkKLXsKLQlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKLQotCWtmcmVlKGNhbS0+c2NyYXRjaCk7Ci0JcWNtX3VucmVnaXN0ZXJfaW5wdXQoY2FtKTsKLQlxY21fZnJlZV9pbnQoY2FtKTsKLX0KLQotc3RhdGljIHN0cnVjdCB1c2J2aWRlb19jYiBxY21fZHJpdmVyID0gewotCS5wcm9iZSA9IAkJcWNtX3Byb2JlLAotCS5zZXR1cE9uT3BlbiA9IAkJcWNtX3NldHVwX29uX29wZW4sCi0JLnByb2Nlc3NEYXRhID0gCQlxY21fcHJvY2Vzc19pc29jLAotCS5zZXRWaWRlb01vZGUgPSAJcWNtX3NldF92aWRlb19tb2RlLAotCS5zdGFydERhdGFQdW1wID0gCXFjbV9zdGFydF9kYXRhLAotCS5zdG9wRGF0YVB1bXAgPSAJcWNtX3N0b3BfZGF0YSwKLQkuYWRqdXN0UGljdHVyZSA9IAlxY21fYWRqdXN0X3BpY3R1cmUsCi0JLnVzZXJGcmVlID0gCQlxY21fZnJlZV91dmQKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHFjbV9pbml0KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgotCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKLQotCXJldHVybiB1c2J2aWRlb19yZWdpc3RlcigKLQkJJmNhbXMsCi0JCU1BWF9DQU1FUkFTLAotCQlzaXplb2Yoc3RydWN0IHFjbSksCi0JCSJRQ00iLAotCQkmcWNtX2RyaXZlciwKLQkJVEhJU19NT0RVTEUsCi0JCXFjbV90YWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBxY21fZXhpdCh2b2lkKQotewotCXVzYnZpZGVvX0RlcmVnaXN0ZXIoJmNhbXMpOwotfQotCi1tb2R1bGVfcGFyYW0oc2l6ZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkluaXRpYWwgU2l6ZSAwOiAxNjB4MTIwIDE6IDMyMHgyNDAiKTsKLW1vZHVsZV9wYXJhbShjb2xvdXIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNvbG91ciwgIkluaXRpYWwgY29sb3VyIik7Ci1tb2R1bGVfcGFyYW0oaHVlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhodWUsICJJbml0aWFsIGh1ZSIpOwotbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3MsICJJbml0aWFsIGJyaWdodG5lc3MiKTsKLW1vZHVsZV9wYXJhbShjb250cmFzdCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoY29udHJhc3QsICJJbml0aWFsIGNvbnRyYXN0Iik7Ci1tb2R1bGVfcGFyYW0od2hpdGVuZXNzLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyh3aGl0ZW5lc3MsICJJbml0aWFsIHdoaXRlbmVzcyIpOwotCi0jaWZkZWYgQ09ORklHX1VTQl9ERUJVRwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbDogMC05IChkZWZhdWx0PTApIik7Ci0jZW5kaWYKLQotbW9kdWxlX2luaXQocWNtX2luaXQpOwotbW9kdWxlX2V4aXQocWNtX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJKYXlhIEt1bWFyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlFDTSBVU0IgQ2FtZXJhIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiUUNNIFVTQiBDYW1lcmEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FjZTM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotI2lmbmRlZiBxdWlja2NhbV9tZXNzZW5nZXJfaAotI2RlZmluZSBxdWlja2NhbV9tZXNzZW5nZXJfaAotCi0jaWZuZGVmIENPTkZJR19JTlBVVAotLyogaWYgd2UncmUgbm90IHVzaW5nIGlucHV0IHdlIGR1bW15IG91dCB0aGVzZSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgcWNtX3JlZ2lzdGVyX2lucHV0KC4uLikKLSNkZWZpbmUgcWNtX3VucmVnaXN0ZXJfaW5wdXQoLi4uKQotI2RlZmluZSBxY21fcmVwb3J0X2J1dHRvbnN0YXQoLi4uKQotI2RlZmluZSBxY21fc2V0dXBfaW5wdXRfaW50KC4uLikgMAotI2RlZmluZSBxY21fc3RvcF9pbnRfZGF0YSguLi4pCi0jZGVmaW5lIHFjbV9hbGxvY19pbnRfdXJiKC4uLikgMAotI2RlZmluZSBxY21fZnJlZV9pbnQoLi4uKQotI2VuZGlmCi0KLQotI2RlZmluZSBDSEVDS19SRVQocmV0LCBleHByKSBcCi0JaWYgKChyZXQgPSBleHByKSA8IDApIHJldHVybiByZXQKLQotLyogQ29udHJvbCBSZWdpc3RlcnMgZm9yIHRoZSBTVFZWNjQyMiBBU0lDCi0gKiAtIHRoaXMgZGVmaW5lIGlzIHRha2VuIGZyb20gdGhlIHFjLXVzYi1tZXNzZW5nZXIgY29kZQotICovCi0jZGVmaW5lIFNUVl9JU09fRU5BQkxFCQkweDE0NDAKLSNkZWZpbmUgSVNPQ19QQUNLRVRfU0laRQkxMDIzCi0KLS8qIENoaXAgaWRlbnRpZmljYXRpb24gbnVtYmVyIGluY2x1ZGluZyByZXZpc2lvbiBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgQ01PU19TRU5TT1JfSURSRVYJMHhFMDBBCi0KLXN0cnVjdCByZ2IgewotCXU4IGI7Ci0JdTggZzsKLQl1OCByOwotCXU4IGIyOwotCXU4IGcyOwotCXU4IHIyOwotfTsKLQotc3RydWN0IGJheUwwIHsKLQl1OCBnOwotCXU4IHI7Ci19OwotCi1zdHJ1Y3QgYmF5TDEgewotCXU4IGI7Ci0JdTggZzsKLX07Ci0KLXN0cnVjdCBjYW1fc2l6ZSB7Ci0JdTE2CXdpZHRoOwotCXUxNgloZWlnaHQ7Ci0JdTgJY21kOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjYW1fc2l6ZSBjYW1lcmFfc2l6ZXNbXSA9IHsKLQl7IDE2MCwgMTIwLCAweGYgfSwKLQl7IDMyMCwgMjQwLCAweDIgfSwKLX07Ci0KLWVudW0gZnJhbWVfc2l6ZXMgewotCVNJWkVfMTYwWDEyMAk9IDAsCi0JU0laRV8zMjBYMjQwCT0gMSwKLX07Ci0KLSNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgU0laRV8zMjBYMjQwCi0KLXN0cnVjdCBxY20gewotCXUxNiBjb2xvdXI7Ci0JdTE2IGh1ZTsKLQl1MTYgYnJpZ2h0bmVzczsKLQl1MTYgY29udHJhc3Q7Ci0JdTE2IHdoaXRlbmVzczsKLQotCXU4IHNpemU7Ci0JaW50IGhlaWdodDsKLQlpbnQgd2lkdGg7Ci0JdTggKnNjcmF0Y2g7Ci0Jc3RydWN0IHVyYiAqYnV0dG9uX3VyYjsKLQl1OCBidXR0b25fc3RzOwotCXU4IGJ1dHRvbl9zdHNfYnVmOwotCi0jaWZkZWYgQ09ORklHX0lOUFVUCi0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0JY2hhciBpbnB1dF9waHlzbmFtZVs2NF07Ci0jZW5kaWYKLX07Ci0KLXN0cnVjdCByZWd2YWwgewotCXUxNiByZWc7Ci0JdTggdmFsOwotfTsKLS8qIHRoaXMgdGFibGUgaXMgZGVyaXZlZCBmcm9tIHRoZQotcWMtdXNiLW1lc3NlbmdlciBjb2RlICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3ZhbCByZWd2YWxfdGFibGVbXSA9IHsKLQl7IFNUVl9JU09fRU5BQkxFLCAweDAwIH0sCi0JeyAweDE0MzYsIDB4MDAgfSwgeyAweDE0MzIsIDB4MDMgfSwKLQl7IDB4MTQzYSwgMHhGOSB9LCB7IDB4MDUwOSwgMHgzOCB9LAotCXsgMHgwNTBhLCAweDM4IH0sIHsgMHgwNTBiLCAweDM4IH0sCi0JeyAweDA1MGMsIDB4MkEgfSwgeyAweDA1MGQsIDB4MDEgfSwKLQl7IDB4MTQzMSwgMHgwMCB9LCB7IDB4MTQzMywgMHgzNCB9LAotCXsgMHgxNDM4LCAweDE4IH0sIHsgMHgxNDM5LCAweDAwIH0sCi0JeyAweDE0M2IsIDB4MDUgfSwgeyAweDE0M2MsIDB4MDAgfSwKLQl7IDB4MTQzZSwgMHgwMSB9LCB7IDB4MTQzZCwgMHgwMCB9LAotCXsgMHgxNDQyLCAweGUyIH0sIHsgMHgxNTAwLCAweGQwIH0sCi0JeyAweDE1MDAsIDB4ZDAgfSwgeyAweDE1MDAsIDB4NTAgfSwKLQl7IDB4MTUwMSwgMHhhZiB9LCB7IDB4MTUwMiwgMHhjMiB9LAotCXsgMHgxNTAzLCAweDQ1IH0sIHsgMHgxNTA1LCAweDAyIH0sCi0JeyAweDE1MGUsIDB4OGUgfSwgeyAweDE1MGYsIDB4MzcgfSwKLQl7IDB4MTVjMCwgMHgwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFya2VyW10gPSB7IDB4MDAsIDB4ZmYsIDB4MDAsIDB4RkYgfTsKLQotI2VuZGlmIC8qIHF1aWNrY2FtX21lc3Nlbmdlcl9oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3ZpY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3ZpY2FtLmMKaW5kZXggNjAzMDQxMC4uNWQ2ZmQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby92aWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdmljYW0uYwpAQCAtMiw3ICsyLDcgQEAKICAqIFVTQiBWaUNhbSBXZWJDYW0gZHJpdmVyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSm9lIEJ1cmtzIChqYnVya3NAd2F2aWNsZS5vcmcpLAogICogICAgICAgICAgICAgICAgICAgIENocmlzdG9waGVyIEwgQ2hlbmV5IChjY2hlbmV5QGNoZW5leS5jeCksCi0gKiAgICAgICAgICAgICAgICAgICAgUGF2ZWwgTWFjaGVrIChwYXZlbEBzdXNlLmN6KSwKKyAqICAgICAgICAgICAgICAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHVjdy5jeiksCiAgKiAgICAgICAgICAgICAgICAgICAgSm9obiBUeW5lciAoanR5bmVyQGNzLnVjci5lZHUpLAogICogICAgICAgICAgICAgICAgICAgIE1vbnJvZSBXaWxsaWFtcyAobW9ucm9lQHBvYm94LmNvbSkKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYwppbmRleCAyN2E3OWYwLi5hMzUwZmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKQEAgLTYwNiw2ICs2MDYsMjYgQEAKIAkJLnNldAkJPSB1dmNfY3RybF9zZXRfem9vbSwKIAl9LAogCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX1BBTl9BQlNPTFVURSwKKwkJLm5hbWUJCT0gIlBhbiAoQWJzb2x1dGUpIiwKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfQ0FNRVJBLAorCQkuc2VsZWN0b3IJPSBVVkNfQ1RfUEFOVElMVF9BQlNPTFVURV9DT05UUk9MLAorCQkuc2l6ZQkJPSAzMiwKKwkJLm9mZnNldAkJPSAwLAorCQkudjRsMl90eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLmRhdGFfdHlwZQk9IFVWQ19DVFJMX0RBVEFfVFlQRV9VTlNJR05FRCwKKwl9LAorCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUsCisJCS5uYW1lCQk9ICJUaWx0IChBYnNvbHV0ZSkiLAorCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCisJCS5zZWxlY3Rvcgk9IFVWQ19DVF9QQU5USUxUX0FCU09MVVRFX0NPTlRST0wsCisJCS5zaXplCQk9IDMyLAorCQkub2Zmc2V0CQk9IDMyLAorCQkudjRsMl90eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLmRhdGFfdHlwZQk9IFVWQ19DVFJMX0RBVEFfVFlQRV9VTlNJR05FRCwKKwl9LAorCXsKIAkJLmlkCQk9IFY0TDJfQ0lEX1BSSVZBQ1ksCiAJCS5uYW1lCQk9ICJQcml2YWN5IiwKIAkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfQ0FNRVJBLApAQCAtNjIzLDcgKzY0Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgX191OCAqdXZjX2N0cmxfZGF0YShzdHJ1Y3QgdXZjX2NvbnRyb2wgKmN0cmwsIGludCBpZCkKIHsKLQlyZXR1cm4gY3RybC0+ZGF0YSArIGlkICogY3RybC0+aW5mby0+c2l6ZTsKKwlyZXR1cm4gY3RybC0+dXZjX2RhdGEgKyBpZCAqIGN0cmwtPmluZm8tPnNpemU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHV2Y190ZXN0X2JpdChjb25zdCBfX3U4ICpkYXRhLCBpbnQgYml0KQpAQCAtNjc4LDYgKzY5OCwxNCBAQAogCWludCBvZmZzZXQgPSBtYXBwaW5nLT5vZmZzZXQ7CiAJX191OCBtYXNrOwogCisJLyogQWNjb3JkaW5nIHRvIHRoZSB2NGwyIHNwZWMsIHdyaXRpbmcgYW55IHZhbHVlIHRvIGEgYnV0dG9uIGNvbnRyb2wKKwkgKiBzaG91bGQgcmVzdWx0IGluIHRoZSBhY3Rpb24gYmVsb25naW5nIHRvIHRoZSBidXR0b24gY29udHJvbCBiZWluZworCSAqIHRyaWdnZXJlZC4gVVZDIGRldmljZXMgaG93ZXZlciB3YW50IHRvIHNlZSBhIDEgd3JpdHRlbiAtPiBvdmVycmlkZQorCSAqIHZhbHVlLgorCSAqLworCWlmIChtYXBwaW5nLT52NGwyX3R5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OKQorCQl2YWx1ZSA9IC0xOworCiAJZGF0YSArPSBvZmZzZXQgLyA4OwogCW9mZnNldCAmPSA3OwogCkBAIC0xMjY1LDEzICsxMjkzLDE1IEBACiAgKiBDb250cm9sIGFuZCBtYXBwaW5nIGhhbmRsaW5nCiAgKi8KIAotc3RhdGljIHZvaWQgdXZjX2N0cmxfYWRkX2N0cmwoc3RydWN0IHV2Y19kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgdXZjX2N0cmxfYWRkX2N0cmwoc3RydWN0IHV2Y19kZXZpY2UgKmRldiwKIAlzdHJ1Y3QgdXZjX2NvbnRyb2xfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgdXZjX2VudGl0eSAqZW50aXR5OwogCXN0cnVjdCB1dmNfY29udHJvbCAqY3RybCA9IE5VTEw7Ci0JaW50IHJldCwgZm91bmQgPSAwOworCWludCByZXQgPSAwLCBmb3VuZCA9IDA7CiAJdW5zaWduZWQgaW50IGk7CisJdTggKnV2Y19pbmZvOworCXU4ICp1dmNfZGF0YTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmZGV2LT5lbnRpdGllcywgbGlzdCkgewogCQlpZiAoIXV2Y19lbnRpdHlfbWF0Y2hfZ3VpZChlbnRpdHksIGluZm8tPmVudGl0eSkpCkBAIC0xMjkwLDU2ICsxMzIwLDY5IEBACiAJfQogCiAJaWYgKCFmb3VuZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKKworCXV2Y19kYXRhID0ga21hbGxvYyhpbmZvLT5zaXplICogVVZDX0NUUkxfREFUQV9MQVNUICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHV2Y19kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdXZjX2luZm8gPSB1dmNfZGF0YSArIGluZm8tPnNpemUgKiBVVkNfQ1RSTF9EQVRBX0xBU1Q7CiAKIAlpZiAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkgPT0gVVZDX1ZDX0VYVEVOU0lPTl9VTklUKSB7CiAJCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgY29udHJvbCBpbmZvcm1hdGlvbiBhbmQgbGVuZ3RoIG1hdGNoCiAJCSAqIHRoZSB1c2VyIHN1cHBsaWVkIGluZm9ybWF0aW9uLgogCQkgKi8KLQkJX191MzIgZmxhZ3M7Ci0JCV9fbGUxNiBzaXplOwotCQlfX3U4IGluZjsKLQogCQlyZXQgPSB1dmNfcXVlcnlfY3RybChkZXYsIFVWQ19HRVRfTEVOLCBjdHJsLT5lbnRpdHktPmlkLAotCQkJZGV2LT5pbnRmbnVtLCBpbmZvLT5zZWxlY3RvciwgKF9fdTggKikmc2l6ZSwgMik7CisJCQkJICAgICBkZXYtPmludGZudW0sIGluZm8tPnNlbGVjdG9yLCB1dmNfZGF0YSwgMik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0NPTlRST0wsCiAJCQkJIkdFVF9MRU4gZmFpbGVkIG9uIGNvbnRyb2wgJXBVbC8ldSAoJWQpLlxuIiwKIAkJCQlpbmZvLT5lbnRpdHksIGluZm8tPnNlbGVjdG9yLCByZXQpOwotCQkJcmV0dXJuOworCQkJZ290byBkb25lOwogCQl9CiAKLQkJaWYgKGluZm8tPnNpemUgIT0gbGUxNl90b19jcHUoc2l6ZSkpIHsKKwkJaWYgKGluZm8tPnNpemUgIT0gbGUxNl90b19jcHUoKihfX2xlMTYgKil1dmNfZGF0YSkpIHsKIAkJCXV2Y190cmFjZShVVkNfVFJBQ0VfQ09OVFJPTCwgIkNvbnRyb2wgJXBVbC8ldSBzaXplICIKIAkJCQkiZG9lc24ndCBtYXRjaCB1c2VyIHN1cHBsaWVkIHZhbHVlLlxuIiwKIAkJCQlpbmZvLT5lbnRpdHksIGluZm8tPnNlbGVjdG9yKTsKLQkJCXJldHVybjsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAogCQlyZXQgPSB1dmNfcXVlcnlfY3RybChkZXYsIFVWQ19HRVRfSU5GTywgY3RybC0+ZW50aXR5LT5pZCwKLQkJCWRldi0+aW50Zm51bSwgaW5mby0+c2VsZWN0b3IsICZpbmYsIDEpOworCQkJCSAgICAgZGV2LT5pbnRmbnVtLCBpbmZvLT5zZWxlY3RvciwgdXZjX2luZm8sIDEpOwogCQlpZiAocmV0IDwgMCkgewogCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9DT05UUk9MLAogCQkJCSJHRVRfSU5GTyBmYWlsZWQgb24gY29udHJvbCAlcFVsLyV1ICglZCkuXG4iLAogCQkJCWluZm8tPmVudGl0eSwgaW5mby0+c2VsZWN0b3IsIHJldCk7Ci0JCQlyZXR1cm47CisJCQlnb3RvIGRvbmU7CiAJCX0KIAotCQlmbGFncyA9IGluZm8tPmZsYWdzOwotCQlpZiAoKChmbGFncyAmIFVWQ19DT05UUk9MX0dFVF9DVVIpICYmICEoaW5mICYgKDEgPDwgMCkpKSB8fAotCQkgICAgKChmbGFncyAmIFVWQ19DT05UUk9MX1NFVF9DVVIpICYmICEoaW5mICYgKDEgPDwgMSkpKSkgeworCQlpZiAoKChpbmZvLT5mbGFncyAmIFVWQ19DT05UUk9MX0dFVF9DVVIpICYmCisJCSAgICAhKCp1dmNfaW5mbyAmIFVWQ19DT05UUk9MX0NBUF9HRVQpKSB8fAorCQkgICAgKChpbmZvLT5mbGFncyAmIFVWQ19DT05UUk9MX1NFVF9DVVIpICYmCisJCSAgICAhKCp1dmNfaW5mbyAmIFVWQ19DT05UUk9MX0NBUF9TRVQpKSkgewogCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9DT05UUk9MLCAiQ29udHJvbCAlcFVsLyV1IGZsYWdzICIKIAkJCQkiZG9uJ3QgbWF0Y2ggc3VwcG9ydGVkIG9wZXJhdGlvbnMuXG4iLAogCQkJCWluZm8tPmVudGl0eSwgaW5mby0+c2VsZWN0b3IpOwotCQkJcmV0dXJuOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIAogCWN0cmwtPmluZm8gPSBpbmZvOwotCWN0cmwtPmRhdGEgPSBrbWFsbG9jKGN0cmwtPmluZm8tPnNpemUgKiBVVkNfQ1RSTF9EQVRBX0xBU1QsIEdGUF9LRVJORUwpOworCWN0cmwtPnV2Y19kYXRhID0gdXZjX2RhdGE7CisJY3RybC0+dXZjX2luZm8gPSB1dmNfaW5mbzsKKwogCXV2Y190cmFjZShVVkNfVFJBQ0VfQ09OVFJPTCwgIkFkZGVkIGNvbnRyb2wgJXBVbC8ldSB0byBkZXZpY2UgJXMgIgogCQkiZW50aXR5ICV1XG4iLCBjdHJsLT5pbmZvLT5lbnRpdHksIGN0cmwtPmluZm8tPnNlbGVjdG9yLAogCQlkZXYtPnVkZXYtPmRldnBhdGgsIGVudGl0eS0+aWQpOworCitkb25lOgorCWlmIChyZXQgPCAwKQorCQlrZnJlZSh1dmNfZGF0YSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTU3MiwxMiArMTYxNSwzNCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRpdHksICZkZXYtPmVudGl0aWVzLCBsaXN0KSB7CiAJCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPm5jb250cm9sczsgKytpKQotCQkJa2ZyZWUoZW50aXR5LT5jb250cm9sc1tpXS5kYXRhKTsKKwkJCWtmcmVlKGVudGl0eS0+Y29udHJvbHNbaV0udXZjX2RhdGEpOwogCiAJCWtmcmVlKGVudGl0eS0+Y29udHJvbHMpOwogCX0KIH0KIAordm9pZCB1dmNfY3RybF9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IHV2Y19jb250cm9sX2luZm8gKmluZm87CisJc3RydWN0IHV2Y19jb250cm9sX2luZm8gKm5pOworCXN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nICptYXBwaW5nOworCXN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nICpubTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbmZvLCBuaSwgJnV2Y19kcml2ZXIuY29udHJvbHMsIGxpc3QpIHsKKwkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBVVkNfQ09OVFJPTF9FWFRFTlNJT04pKQorCQkJY29udGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1hcHBpbmcsIG5tLCAmaW5mby0+bWFwcGluZ3MsIGxpc3QpIHsKKwkJCWxpc3RfZGVsKCZtYXBwaW5nLT5saXN0KTsKKwkJCWtmcmVlKG1hcHBpbmctPm1lbnVfaW5mbyk7CisJCQlrZnJlZShtYXBwaW5nKTsKKwkJfQorCisJCWxpc3RfZGVsKCZpbmZvLT5saXN0KTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorfQorCiB2b2lkIHV2Y19jdHJsX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgdXZjX2NvbnRyb2xfaW5mbyAqY3RybCA9IHV2Y19jdHJsczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwppbmRleCA4MzhiNTZmLi43ZWFmOTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCkBAIC02MzcsMTQgKzYzNywxMyBAQAogCX0KIAlzdHJlYW1pbmctPmhlYWRlci5iQ29udHJvbFNpemUgPSBuOwogCi0Jc3RyZWFtaW5nLT5oZWFkZXIuYm1hQ29udHJvbHMgPSBrbWFsbG9jKHAqbiwgR0ZQX0tFUk5FTCk7CisJc3RyZWFtaW5nLT5oZWFkZXIuYm1hQ29udHJvbHMgPSBrbWVtZHVwKCZidWZmZXJbc2l6ZV0sIHAgKiBuLAorCQkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKHN0cmVhbWluZy0+aGVhZGVyLmJtYUNvbnRyb2xzID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQltZW1jcHkoc3RyZWFtaW5nLT5oZWFkZXIuYm1hQ29udHJvbHMsICZidWZmZXJbc2l6ZV0sIHAqbik7Ci0KIAlidWZsZW4gLT0gYnVmZmVyWzBdOwogCWJ1ZmZlciArPSBidWZmZXJbMF07CiAKQEAgLTIxNzQsNiArMjE3MywxNSBAQAogCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCiAJICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKIAkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfRVhUUkFGSUVMRFMgfSwKKwkvKiBNYW50YSBNTS0zNTMgUGxha28gKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDE4ZWMsCisJICAuaWRQcm9kdWN0CQk9IDB4MzE4OCwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKIAkvKiBGU0MgV2ViQ2FtIFYzMFMgKi8KIAl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQogCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKQEAgLTIyNjEsNiArMjI2OSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgdXZjX2NsZWFudXAodm9pZCkKIHsKIAl1c2JfZGVyZWdpc3RlcigmdXZjX2RyaXZlci5kcml2ZXIpOworCXV2Y19jdHJsX2NsZWFudXAoKTsKIH0KIAogbW9kdWxlX2luaXQodXZjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKaW5kZXggN2M5YWIyOS4uODZkYjMyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCkBAIC0yOSw2ICsyOSw3MSBAQAogI2luY2x1ZGUgInV2Y3ZpZGVvLmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVVZDIGlvY3RscworICovCitzdGF0aWMgaW50IHV2Y19pb2N0bF9jdHJsX21hcChzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZyAqeG1hcCwgaW50IG9sZCkKK3sKKwlzdHJ1Y3QgdXZjX2NvbnRyb2xfbWFwcGluZyAqbWFwOworCXVuc2lnbmVkIGludCBzaXplOworCWludCByZXQ7CisKKwltYXAgPSBremFsbG9jKHNpemVvZiAqbWFwLCBHRlBfS0VSTkVMKTsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWFwLT5pZCA9IHhtYXAtPmlkOworCW1lbWNweShtYXAtPm5hbWUsIHhtYXAtPm5hbWUsIHNpemVvZiBtYXAtPm5hbWUpOworCW1lbWNweShtYXAtPmVudGl0eSwgeG1hcC0+ZW50aXR5LCBzaXplb2YgbWFwLT5lbnRpdHkpOworCW1hcC0+c2VsZWN0b3IgPSB4bWFwLT5zZWxlY3RvcjsKKwltYXAtPnNpemUgPSB4bWFwLT5zaXplOworCW1hcC0+b2Zmc2V0ID0geG1hcC0+b2Zmc2V0OworCW1hcC0+djRsMl90eXBlID0geG1hcC0+djRsMl90eXBlOworCW1hcC0+ZGF0YV90eXBlID0geG1hcC0+ZGF0YV90eXBlOworCisJc3dpdGNoICh4bWFwLT52NGwyX3R5cGUpIHsKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI6CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOOgorCWNhc2UgVjRMMl9DVFJMX1RZUEVfQlVUVE9OOgorCQlicmVhazsKKworCWNhc2UgVjRMMl9DVFJMX1RZUEVfTUVOVToKKwkJaWYgKG9sZCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXNpemUgPSB4bWFwLT5tZW51X2NvdW50ICogc2l6ZW9mKCptYXAtPm1lbnVfaW5mbyk7CisJCW1hcC0+bWVudV9pbmZvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG1hcC0+bWVudV9pbmZvID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIobWFwLT5tZW51X2luZm8sIHhtYXAtPm1lbnVfaW5mbywgc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQltYXAtPm1lbnVfY291bnQgPSB4bWFwLT5tZW51X2NvdW50OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSB1dmNfY3RybF9hZGRfbWFwcGluZyhtYXApOworCitkb25lOgorCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKG1hcC0+bWVudV9pbmZvKTsKKwkJa2ZyZWUobWFwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFY0TDIgaW50ZXJmYWNlCiAgKi8KIApAQCAtNDUxLDcgKzUxNiw3IEBACiAKIHN0YXRpYyBpbnQgdXZjX3Y0bDJfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdXZjX2ZoICpoYW5kbGUgPSAoc3RydWN0IHV2Y19maCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXZjX2ZoICpoYW5kbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHV2Y19zdHJlYW1pbmcgKnN0cmVhbSA9IGhhbmRsZS0+c3RyZWFtOwogCiAJdXZjX3RyYWNlKFVWQ19UUkFDRV9DQUxMUywgInV2Y192NGwyX3JlbGVhc2VcbiIpOwpAQCAtNDgyLDcgKzU0Nyw3IEBACiBzdGF0aWMgbG9uZyB1dmNfdjRsMl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1dmNfZmggKmhhbmRsZSA9IChzdHJ1Y3QgdXZjX2ZoICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1dmNfZmggKmhhbmRsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluICpjaGFpbiA9IGhhbmRsZS0+Y2hhaW47CiAJc3RydWN0IHV2Y19zdHJlYW1pbmcgKnN0cmVhbSA9IGhhbmRsZS0+c3RyZWFtOwogCWxvbmcgcmV0ID0gMDsKQEAgLTk2Myw2ICsxMDI4LDkgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKIAorCQlpZiAoeGluZm8tPnNpemUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCiAJCWluZm8gPSBremFsbG9jKHNpemVvZiAqaW5mbywgR0ZQX0tFUk5FTCk7CiAJCWlmIChpbmZvID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTk3NCw3ICsxMDQyLDggQEAKIAkJaW5mby0+ZmxhZ3MgPSB4aW5mby0+ZmxhZ3M7CiAKIAkJaW5mby0+ZmxhZ3MgfD0gVVZDX0NPTlRST0xfR0VUX01JTiB8IFVWQ19DT05UUk9MX0dFVF9NQVggfAotCQkJCVVWQ19DT05UUk9MX0dFVF9SRVMgfCBVVkNfQ09OVFJPTF9HRVRfREVGOworCQkJICAgICAgIFVWQ19DT05UUk9MX0dFVF9SRVMgfCBVVkNfQ09OVFJPTF9HRVRfREVGIHwKKwkJCSAgICAgICBVVkNfQ09OVFJPTF9FWFRFTlNJT047CiAKIAkJcmV0ID0gdXZjX2N0cmxfYWRkX2luZm8oaW5mbyk7CiAJCWlmIChyZXQgPCAwKQpAQCAtOTgyLDMyICsxMDUxLDEyIEBACiAJCWJyZWFrOwogCX0KIAorCWNhc2UgVVZDSU9DX0NUUkxfTUFQX09MRDoKIAljYXNlIFVWQ0lPQ19DVFJMX01BUDoKLQl7Ci0JCXN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nICp4bWFwID0gYXJnOwotCQlzdHJ1Y3QgdXZjX2NvbnRyb2xfbWFwcGluZyAqbWFwOwotCiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CiAKLQkJbWFwID0ga3phbGxvYyhzaXplb2YgKm1hcCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChtYXAgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW1hcC0+aWQgPSB4bWFwLT5pZDsKLQkJbWVtY3B5KG1hcC0+bmFtZSwgeG1hcC0+bmFtZSwgc2l6ZW9mIG1hcC0+bmFtZSk7Ci0JCW1lbWNweShtYXAtPmVudGl0eSwgeG1hcC0+ZW50aXR5LCBzaXplb2YgbWFwLT5lbnRpdHkpOwotCQltYXAtPnNlbGVjdG9yID0geG1hcC0+c2VsZWN0b3I7Ci0JCW1hcC0+c2l6ZSA9IHhtYXAtPnNpemU7Ci0JCW1hcC0+b2Zmc2V0ID0geG1hcC0+b2Zmc2V0OwotCQltYXAtPnY0bDJfdHlwZSA9IHhtYXAtPnY0bDJfdHlwZTsKLQkJbWFwLT5kYXRhX3R5cGUgPSB4bWFwLT5kYXRhX3R5cGU7Ci0KLQkJcmV0ID0gdXZjX2N0cmxfYWRkX21hcHBpbmcobWFwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlrZnJlZShtYXApOwotCQlicmVhazsKLQl9CisJCXJldHVybiB1dmNfaW9jdGxfY3RybF9tYXAoYXJnLCBjbWQgPT0gVVZDSU9DX0NUUkxfTUFQX09MRCk7CiAKIAljYXNlIFVWQ0lPQ19DVFJMX0dFVDoKIAkJcmV0dXJuIHV2Y194dV9jdHJsX3F1ZXJ5KGNoYWluLCBhcmcsIDApOwpAQCAtMTA2Nyw3ICsxMTE2LDcgQEAKIAogc3RhdGljIGludCB1dmNfdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgdXZjX2ZoICpoYW5kbGUgPSAoc3RydWN0IHV2Y19maCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXZjX2ZoICpoYW5kbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHV2Y19zdHJlYW1pbmcgKnN0cmVhbSA9IGhhbmRsZS0+c3RyZWFtOwogCXN0cnVjdCB1dmNfdmlkZW9fcXVldWUgKnF1ZXVlID0gJnN0cmVhbS0+cXVldWU7CiAJc3RydWN0IHV2Y19idWZmZXIgKnVuaW5pdGlhbGl6ZWRfdmFyKGJ1ZmZlcik7CkBAIC0xMTIyLDcgKzExNzEsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHV2Y192NGwyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IHV2Y19maCAqaGFuZGxlID0gKHN0cnVjdCB1dmNfZmggKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHV2Y19maCAqaGFuZGxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1dmNfc3RyZWFtaW5nICpzdHJlYW0gPSBoYW5kbGUtPnN0cmVhbTsKIAogCXV2Y190cmFjZShVVkNfVFJBQ0VfQ0FMTFMsICJ1dmNfdjRsMl9wb2xsXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCmluZGV4IGQxZjg4NDAuLmFjMjcyNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaApAQCAtMjcsNiArMjcsOCBAQAogI2RlZmluZSBVVkNfQ09OVFJPTF9SRVNUT1JFCSgxIDw8IDYpCiAvKiBDb250cm9sIGNhbiBiZSB1cGRhdGVkIGJ5IHRoZSBjYW1lcmEuICovCiAjZGVmaW5lIFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFCSgxIDw8IDcpCisvKiBDb250cm9sIGlzIGFuIGV4dGVuc2lvbiB1bml0IGNvbnRyb2wuICovCisjZGVmaW5lIFVWQ19DT05UUk9MX0VYVEVOU0lPTgkoMSA8PCA4KQogCiAjZGVmaW5lIFVWQ19DT05UUk9MX0dFVF9SQU5HRQkoVVZDX0NPTlRST0xfR0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9NSU4gfCBcCiAJCQkJIFVWQ19DT05UUk9MX0dFVF9NQVggfCBVVkNfQ09OVFJPTF9HRVRfUkVTIHwgXApAQCAtNDAsNiArNDIsMTUgQEAKIAlfX3UzMiBmbGFnczsKIH07CiAKK3N0cnVjdCB1dmNfbWVudV9pbmZvIHsKKwlfX3UzMiB2YWx1ZTsKKwlfX3U4IG5hbWVbMzJdOworfTsKKworc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmdfb2xkIHsKKwlfX3U4IHJlc2VydmVkWzY0XTsKK307CisKIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nIHsKIAlfX3UzMiBpZDsKIAlfX3U4IG5hbWVbMzJdOwpAQCAtNTAsNiArNjEsMTEgQEAKIAlfX3U4IG9mZnNldDsKIAllbnVtIHY0bDJfY3RybF90eXBlIHY0bDJfdHlwZTsKIAlfX3UzMiBkYXRhX3R5cGU7CisKKwlzdHJ1Y3QgdXZjX21lbnVfaW5mbyBfX3VzZXIgKm1lbnVfaW5mbzsKKwlfX3UzMiBtZW51X2NvdW50OworCisJX191MzIgcmVzZXJ2ZWRbNF07CiB9OwogCiBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wgewpAQCAtNjAsNiArNzYsNyBAQAogfTsKIAogI2RlZmluZSBVVkNJT0NfQ1RSTF9BREQJCV9JT1coJ1UnLCAxLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfaW5mbykKKyNkZWZpbmUgVVZDSU9DX0NUUkxfTUFQX09MRAlfSU9XUignVScsIDIsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nX29sZCkKICNkZWZpbmUgVVZDSU9DX0NUUkxfTUFQCQlfSU9XUignVScsIDIsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nKQogI2RlZmluZSBVVkNJT0NfQ1RSTF9HRVQJCV9JT1dSKCdVJywgMywgc3RydWN0IHV2Y194dV9jb250cm9sKQogI2RlZmluZSBVVkNJT0NfQ1RSTF9TRVQJCV9JT1coJ1UnLCA0LCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wpCkBAIC0xNzksMzAgKzE5Niw2IEBACiAvKiBUT0RPOiBQdXQgdGhlIG1vc3QgZnJlcXVlbnRseSBhY2Nlc3NlZCBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZgogICogc3RydWN0dXJlcyB0byBtYXhpbWl6ZSBjYWNoZSBlZmZpY2llbmN5LgogICovCi1zdHJ1Y3QgdXZjX3N0cmVhbWluZ19jb250cm9sIHsKLQlfX3UxNiBibUhpbnQ7Ci0JX191OCAgYkZvcm1hdEluZGV4OwotCV9fdTggIGJGcmFtZUluZGV4OwotCV9fdTMyIGR3RnJhbWVJbnRlcnZhbDsKLQlfX3UxNiB3S2V5RnJhbWVSYXRlOwotCV9fdTE2IHdQRnJhbWVSYXRlOwotCV9fdTE2IHdDb21wUXVhbGl0eTsKLQlfX3UxNiB3Q29tcFdpbmRvd1NpemU7Ci0JX191MTYgd0RlbGF5OwotCV9fdTMyIGR3TWF4VmlkZW9GcmFtZVNpemU7Ci0JX191MzIgZHdNYXhQYXlsb2FkVHJhbnNmZXJTaXplOwotCV9fdTMyIGR3Q2xvY2tGcmVxdWVuY3k7Ci0JX191OCAgYm1GcmFtaW5nSW5mbzsKLQlfX3U4ICBiUHJlZmVyZWRWZXJzaW9uOwotCV9fdTggIGJNaW5WZXJzaW9uOwotCV9fdTggIGJNYXhWZXJzaW9uOwotfTsKLQotc3RydWN0IHV2Y19tZW51X2luZm8gewotCV9fdTMyIHZhbHVlOwotCV9fdTggbmFtZVszMl07Ci19OwotCiBzdHJ1Y3QgdXZjX2NvbnRyb2xfaW5mbyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbWFwcGluZ3M7CkBAIC0yNTAsNyArMjQzLDggQEAKIAkgICAgIG1vZGlmaWVkIDogMSwKIAkgICAgIGNhY2hlZCA6IDE7CiAKLQlfX3U4ICpkYXRhOworCV9fdTggKnV2Y19kYXRhOworCV9fdTggKnV2Y19pbmZvOwogfTsKIAogc3RydWN0IHV2Y19mb3JtYXRfZGVzYyB7CkBAIC02MjUsNiArNjE5LDcgQEAKIGV4dGVybiB2b2lkIHV2Y19jdHJsX2NsZWFudXBfZGV2aWNlKHN0cnVjdCB1dmNfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCB1dmNfY3RybF9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1dmNfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgdXZjX2N0cmxfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHV2Y19jdHJsX2NsZWFudXAodm9pZCk7CiAKIGV4dGVybiBpbnQgdXZjX2N0cmxfYmVnaW4oc3RydWN0IHV2Y192aWRlb19jaGFpbiAqY2hhaW4pOwogZXh0ZXJuIGludCBfX3V2Y19jdHJsX2NvbW1pdChzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluICpjaGFpbiwgaW50IHJvbGxiYWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKaW5kZXggOTAwNGE1Zi4uZDJmMjBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKQEAgLTUsNyArNSw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCAgSmFrdWIgSmVsaW5layAgKGpha3ViQHJlZGhhdC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogICogQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgIEFuZGkgS2xlZW4sIFN1U0UgTGFicwotICogQ29weXJpZ2h0IChDKSAyMDAzICAgICAgIFBhdmVsIE1hY2hlayAocGF2ZWxAc3VzZS5jeikKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHVjdy5jeikKICAqIENvcHlyaWdodCAoQykgMjAwNSAgICAgICBQaGlsaXBwZSBEZSBNdXl0ZXIgKHBoZG1AbWFjcWVsLmJlKQogICogQ29weXJpZ2h0IChDKSAyMDA4ICAgICAgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYwppbmRleCAwY2E3ZWM5Li45ZTg5YmY2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJaW50IG1pbm9yX29mZnNldCA9IDA7CiAJaW50IG1pbm9yX2NudCA9IFZJREVPX05VTV9ERVZJQ0VTOwogCWNvbnN0IGNoYXIgKm5hbWVfYmFzZTsKLQl2b2lkICpwcml2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJdm9pZCAqcHJpdiA9IHZkZXYtPmRldi5wOwogCiAJLyogQSBtaW5vciB2YWx1ZSBvZiAtMSBtYXJrcyB0aGlzIHZpZGVvIGRldmljZSBhcyBuZXZlcgogCSAgIGhhdmluZyBiZWVuIHJlZ2lzdGVyZWQgKi8KQEAgLTUzNiw5ICs1MzYsOSBAQAogCiAJLyogUGFydCA0OiByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggc3lzZnMgKi8KIAltZW1zZXQoJnZkZXYtPmRldiwgMCwgc2l6ZW9mKHZkZXYtPmRldikpOwotCS8qIFRoZSBtZW1zZXQgYWJvdmUgY2xlYXJlZCB0aGUgZGV2aWNlJ3MgZHJ2ZGF0YSwgc28KKwkvKiBUaGUgbWVtc2V0IGFib3ZlIGNsZWFyZWQgdGhlIGRldmljZSdzIGRldmljZV9wcml2YXRlLCBzbwogCSAgIHB1dCBiYWNrIHRoZSBjb3B5IHdlIG1hZGUgZWFybGllci4gKi8KLQl2aWRlb19zZXRfZHJ2ZGF0YSh2ZGV2LCBwcml2KTsKKwl2ZGV2LT5kZXYucCA9IHByaXY7CiAJdmRldi0+ZGV2LmNsYXNzID0gJnZpZGVvX2NsYXNzOwogCXZkZXYtPmRldi5kZXZ0ID0gTUtERVYoVklERU9fTUFKT1IsIHZkZXYtPm1pbm9yKTsKIAlpZiAodmRldi0+cGFyZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWNvcmUuYwppbmRleCA3ZDMzNzg0Li5jZTE1OTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWNvcmUuYwpAQCAtNTIsMTggKzUyLDE4IEBACiAjZGVmaW5lIENBTEwocSwgZiwgYXJnLi4uKQkJCQkJCVwKIAkoKHEtPmludF9vcHMtPmYpID8gcS0+aW50X29wcy0+ZihhcmcpIDogMCkKIAotc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmlkZW9idWZfYWxsb2Moc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxKQorc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmlkZW9idWZfYWxsb2NfdmIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxKQogewogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwogCiAJQlVHX09OKHEtPm1zaXplIDwgc2l6ZW9mKCp2YikpOwogCi0JaWYgKCFxLT5pbnRfb3BzIHx8ICFxLT5pbnRfb3BzLT5hbGxvYykgeworCWlmICghcS0+aW50X29wcyB8fCAhcS0+aW50X29wcy0+YWxsb2NfdmIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJObyBzcGVjaWZpYyBvcHMgZGVmaW5lZCFcbiIpOwogCQlCVUcoKTsKIAl9CiAKLQl2YiA9IHEtPmludF9vcHMtPmFsbG9jKHEtPm1zaXplKTsKKwl2YiA9IHEtPmludF9vcHMtPmFsbG9jX3ZiKHEtPm1zaXplKTsKIAlpZiAoTlVMTCAhPSB2YikgewogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Yi0+ZG9uZSk7CiAJCXZiLT5tYWdpYyA9IE1BR0lDX0JVRkZFUjsKQEAgLTcxLDcgKzcxLDcgQEAKIAogCXJldHVybiB2YjsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX2FsbG9jX3ZiKTsKIAogI2RlZmluZSBXQUlUT05fQ09ORElUSU9OICh2Yi0+c3RhdGUgIT0gVklERU9CVUZfQUNUSVZFICYmXAogCQkJCXZiLT5zdGF0ZSAhPSBWSURFT0JVRl9RVUVVRUQpCkBAIC0xOTUsNiArMTk1LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9xdWV1ZV9pc19idXN5KTsKIAorLyoqCisgKiBfX3ZpZGVvYnVmX2ZyZWUoKSAtIGZyZWUgYWxsIHRoZSBidWZmZXJzIGFuZCB0aGVpciBjb250cm9sIHN0cnVjdHVyZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiBzdHJlYW1pbmcvcmVhZGluZyBpcyBvZmYsIGkuZS4gbm8gYnVmZmVycworICogYXJlIHVuZGVyIGNvbnRyb2wgb2YgdGhlIGRyaXZlci4KKyAqLworLyogTG9ja2luZzogQ2FsbGVyIGhvbGRzIHEtPnZiX2xvY2sgKi8KK3N0YXRpYyBpbnQgX192aWRlb2J1Zl9mcmVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSkKK3sKKwlpbnQgaTsKKworCWRwcmludGsoMSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFxKQorCQlyZXR1cm4gMDsKKworCWlmIChxLT5zdHJlYW1pbmcgfHwgcS0+cmVhZGluZykgeworCQlkcHJpbnRrKDEsICJDYW5ub3QgZnJlZSBidWZmZXJzIHdoZW4gc3RyZWFtaW5nIG9yIHJlYWRpbmdcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCU1BR0lDX0NIRUNLKHEtPmludF9vcHMtPm1hZ2ljLCBNQUdJQ19RVFlQRV9PUFMpOworCisJZm9yIChpID0gMDsgaSA8IFZJREVPX01BWF9GUkFNRTsgaSsrKQorCQlpZiAocS0+YnVmc1tpXSAmJiBxLT5idWZzW2ldLT5tYXApIHsKKwkJCWRwcmludGsoMSwgIkNhbm5vdCBmcmVlIG1tYXBwZWQgYnVmZmVyc1xuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKKwkJaWYgKE5VTEwgPT0gcS0+YnVmc1tpXSkKKwkJCWNvbnRpbnVlOworCQlxLT5vcHMtPmJ1Zl9yZWxlYXNlKHEsIHEtPmJ1ZnNbaV0pOworCQlrZnJlZShxLT5idWZzW2ldKTsKKwkJcS0+YnVmc1tpXSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIExvY2tpbmc6IENhbGxlciBob2xkcyBxLT52Yl9sb2NrICovCiB2b2lkIHZpZGVvYnVmX3F1ZXVlX2NhbmNlbChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEpCiB7CkBAIC0zMDgsMzYgKzM0NywxMSBAQAogCWItPnNlcXVlbmNlICA9IHZiLT5maWVsZF9jb3VudCA+PiAxOwogfQogCi0vKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgcS0+dmJfbG9jayAqLwotc3RhdGljIGludCBfX3ZpZGVvYnVmX21tYXBfZnJlZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIXEpCi0JCXJldHVybiAwOwotCi0JTUFHSUNfQ0hFQ0socS0+aW50X29wcy0+bWFnaWMsIE1BR0lDX1FUWVBFX09QUyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspCi0JCWlmIChxLT5idWZzW2ldICYmIHEtPmJ1ZnNbaV0tPm1hcCkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKLQkJaWYgKE5VTEwgPT0gcS0+YnVmc1tpXSkKLQkJCWNvbnRpbnVlOwotCQlxLT5vcHMtPmJ1Zl9yZWxlYXNlKHEsIHEtPmJ1ZnNbaV0pOwotCQlrZnJlZShxLT5idWZzW2ldKTsKLQkJcS0+YnVmc1tpXSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCB2aWRlb2J1Zl9tbWFwX2ZyZWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxKQogewogCWludCByZXQ7CiAJbXV0ZXhfbG9jaygmcS0+dmJfbG9jayk7Ci0JcmV0ID0gX192aWRlb2J1Zl9tbWFwX2ZyZWUocSk7CisJcmV0ID0gX192aWRlb2J1Zl9mcmVlKHEpOwogCW11dGV4X3VubG9jaygmcS0+dmJfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM1MywxMyArMzY3LDEzIEBACiAKIAlNQUdJQ19DSEVDSyhxLT5pbnRfb3BzLT5tYWdpYywgTUFHSUNfUVRZUEVfT1BTKTsKIAotCWVyciA9IF9fdmlkZW9idWZfbW1hcF9mcmVlKHEpOworCWVyciA9IF9fdmlkZW9idWZfZnJlZShxKTsKIAlpZiAoMCAhPSBlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBidWZmZXJzICovCiAJZm9yIChpID0gMDsgaSA8IGJjb3VudDsgaSsrKSB7Ci0JCXEtPmJ1ZnNbaV0gPSB2aWRlb2J1Zl9hbGxvYyhxKTsKKwkJcS0+YnVmc1tpXSA9IHZpZGVvYnVmX2FsbG9jX3ZiKHEpOwogCiAJCWlmIChOVUxMID09IHEtPmJ1ZnNbaV0pCiAJCQlicmVhazsKQEAgLTc2Niw3ICs3ODAsNyBAQAogCU1BR0lDX0NIRUNLKHEtPmludF9vcHMtPm1hZ2ljLCBNQUdJQ19RVFlQRV9PUFMpOwogCiAJLyogc2V0dXAgc3R1ZmYgKi8KLQlxLT5yZWFkX2J1ZiA9IHZpZGVvYnVmX2FsbG9jKHEpOworCXEtPnJlYWRfYnVmID0gdmlkZW9idWZfYWxsb2NfdmIocSk7CiAJaWYgKE5VTEwgPT0gcS0+cmVhZF9idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC04NzEsNyArODg1LDcgQEAKIAlpZiAoTlVMTCA9PSBxLT5yZWFkX2J1ZikgewogCQkvKiBuZWVkIHRvIGNhcHR1cmUgYSBuZXcgZnJhbWUgKi8KIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJcS0+cmVhZF9idWYgPSB2aWRlb2J1Zl9hbGxvYyhxKTsKKwkJcS0+cmVhZF9idWYgPSB2aWRlb2J1Zl9hbGxvY192YihxKTsKIAogCQlkcHJpbnRrKDEsICJ2aWRlbyBhbGxvYz0weCVwXG4iLCBxLT5yZWFkX2J1Zik7CiAJCWlmIChOVUxMID09IHEtPnJlYWRfYnVmKQpAQCAtOTcwLDcgKzk4NCw3IEBACiAJaW50IGk7CiAKIAl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwocSk7Ci0JX192aWRlb2J1Zl9tbWFwX2ZyZWUocSk7CisJX192aWRlb2J1Zl9mcmVlKHEpOwogCUlOSVRfTElTVF9IRUFEKCZxLT5zdHJlYW0pOwogCWZvciAoaSA9IDA7IGkgPCBWSURFT19NQVhfRlJBTUU7IGkrKykgewogCQlpZiAoTlVMTCA9PSBxLT5idWZzW2ldKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1jb250aWcuYwppbmRleCA3NDczMGM2Li4zNzJiODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1jb250aWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1jb250aWcuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKl9fdmlkZW9idWZfYWxsb2Moc2l6ZV90IHNpemUpCitzdGF0aWMgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqX192aWRlb2J1Zl9hbGxvY192YihzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgdmlkZW9idWZfZG1hX2NvbnRpZ19tZW1vcnkgKm1lbTsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YjsKQEAgLTI4MCw4ICsyODAsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWJ1Zi0+bWFwID0gbWFwOwotCW1hcC0+c3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwotCW1hcC0+ZW5kID0gdm1hLT52bV9lbmQ7CiAJbWFwLT5xID0gcTsKIAogCWJ1Zi0+YmFkZHIgPSB2bWEtPnZtX3N0YXJ0OwpAQCAtMzM4LDcgKzMzNiw3IEBACiBzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F0eXBlX29wcyBxb3BzID0gewogCS5tYWdpYyAgICAgICAgPSBNQUdJQ19RVFlQRV9PUFMsCiAKLQkuYWxsb2MgICAgICAgID0gX192aWRlb2J1Zl9hbGxvYywKKwkuYWxsb2NfdmIgICAgID0gX192aWRlb2J1Zl9hbGxvY192YiwKIAkuaW9sb2NrICAgICAgID0gX192aWRlb2J1Zl9pb2xvY2ssCiAJLm1tYXBfbWFwcGVyICA9IF9fdmlkZW9idWZfbW1hcF9tYXBwZXIsCiAJLnZhZGRyICAgICAgICA9IF9fdmlkZW9idWZfdG9fdmFkZHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYwppbmRleCA4MzU5ZTZiLi4wNmY5YTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKQEAgLTU3LDcgKzU3LDEzIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdHJ1Y3Qgc2NhdHRlcmxpc3QgKnZpZGVvYnVmX3ZtYWxsb2NfdG9fc2codW5zaWduZWQgY2hhciAqdmlydCwgaW50IG5yX3BhZ2VzKQorLyoKKyAqIFJldHVybiBhIHNjYXR0ZXJsaXN0IGZvciBzb21lIHBhZ2UtYWxpZ25lZCB2bWFsbG9jKCknZWQgbWVtb3J5CisgKiBibG9jayAoTlVMTCBvbiBlcnJvcnMpLiAgTWVtb3J5IGZvciB0aGUgc2NhdHRlcmxpc3QgaXMgYWxsb2NhdGVkCisgKiB1c2luZyBrbWFsbG9jLiAgVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIG1lbW9yeS4KKyAqLworc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqdmlkZW9idWZfdm1hbGxvY190b19zZyh1bnNpZ25lZCBjaGFyICp2aXJ0LAorCQkJCQkJICBpbnQgbnJfcGFnZXMpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CiAJc3RydWN0IHBhZ2UgKnBnOwpAQCAtODEsMTAgKzg3LDE0IEBACiAJdmZyZWUoc2dsaXN0KTsKIAlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3ZtYWxsb2NfdG9fc2cpOwogCi1zdHJ1Y3Qgc2NhdHRlcmxpc3QgKnZpZGVvYnVmX3BhZ2VzX3RvX3NnKHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBucl9wYWdlcywKLQkJCQkJIGludCBvZmZzZXQpCisvKgorICogUmV0dXJuIGEgc2NhdHRlcmxpc3QgZm9yIGEgYW4gYXJyYXkgb2YgdXNlcnBhZ2VzIChOVUxMIG9uIGVycm9ycykuCisgKiBNZW1vcnkgZm9yIHRoZSBzY2F0dGVybGlzdCBpcyBhbGxvY2F0ZWQgdXNpbmcga21hbGxvYy4gIFRoZSBjYWxsZXIKKyAqIG11c3QgZnJlZSB0aGUgbWVtb3J5LgorICovCitzdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICp2aWRlb2J1Zl9wYWdlc190b19zZyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCQkJaW50IG5yX3BhZ2VzLCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OwogCWludCBpOwpAQCAtMjAxLDE3ICsyMTEsMTcgQEAKIAlkcHJpbnRrKDEsICJpbml0IGtlcm5lbCBbJWQgcGFnZXNdXG4iLCBucl9wYWdlcyk7CiAKIAlkbWEtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQlkbWEtPnZtYWxsb2MgPSB2bWFsbG9jXzMyKG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwotCWlmIChOVUxMID09IGRtYS0+dm1hbGxvYykgeworCWRtYS0+dmFkZHIgPSB2bWFsbG9jXzMyKG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCWlmIChOVUxMID09IGRtYS0+dmFkZHIpIHsKIAkJZHByaW50aygxLCAidm1hbGxvY18zMiglZCBwYWdlcykgZmFpbGVkXG4iLCBucl9wYWdlcyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWRwcmludGsoMSwgInZtYWxsb2MgaXMgYXQgYWRkciAweCUwOGx4LCBzaXplPSVkXG4iLAotCQkJCSh1bnNpZ25lZCBsb25nKWRtYS0+dm1hbGxvYywKKwkJCQkodW5zaWduZWQgbG9uZylkbWEtPnZhZGRyLAogCQkJCW5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCi0JbWVtc2V0KGRtYS0+dm1hbGxvYywgMCwgbnJfcGFnZXMgPDwgUEFHRV9TSElGVCk7CisJbWVtc2V0KGRtYS0+dmFkZHIsIDAsIG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCWRtYS0+bnJfcGFnZXMgPSBucl9wYWdlczsKIAogCXJldHVybiAwOwpAQCAtMjM1LDcgKzI0NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9kbWFfaW5pdF9vdmVybGF5KTsKIAotaW50IHZpZGVvYnVmX2RtYV9tYXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpCitpbnQgdmlkZW9idWZfZG1hX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSkKIHsKIAlNQUdJQ19DSEVDSyhkbWEtPm1hZ2ljLCBNQUdJQ19ETUFCVUYpOwogCUJVR19PTigwID09IGRtYS0+bnJfcGFnZXMpOwpAQCAtMjQ0LDggKzI1NCw4IEBACiAJCWRtYS0+c2dsaXN0ID0gdmlkZW9idWZfcGFnZXNfdG9fc2coZG1hLT5wYWdlcywgZG1hLT5ucl9wYWdlcywKIAkJCQkJCSAgIGRtYS0+b2Zmc2V0KTsKIAl9Ci0JaWYgKGRtYS0+dm1hbGxvYykgewotCQlkbWEtPnNnbGlzdCA9IHZpZGVvYnVmX3ZtYWxsb2NfdG9fc2coZG1hLT52bWFsbG9jLAorCWlmIChkbWEtPnZhZGRyKSB7CisJCWRtYS0+c2dsaXN0ID0gdmlkZW9idWZfdm1hbGxvY190b19zZyhkbWEtPnZhZGRyLAogCQkJCQkJICAgICBkbWEtPm5yX3BhZ2VzKTsKIAl9CiAJaWYgKGRtYS0+YnVzX2FkZHIpIHsKQEAgLTI2Myw3ICsyNzMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKCFkbWEtPmJ1c19hZGRyKSB7Ci0JCWRtYS0+c2dsZW4gPSBkbWFfbWFwX3NnKHEtPmRldiwgZG1hLT5zZ2xpc3QsCisJCWRtYS0+c2dsZW4gPSBkbWFfbWFwX3NnKGRldiwgZG1hLT5zZ2xpc3QsCiAJCQkJCWRtYS0+bnJfcGFnZXMsIGRtYS0+ZGlyZWN0aW9uKTsKIAkJaWYgKDAgPT0gZG1hLT5zZ2xlbikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtMjc5LDE0ICsyODksMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX2RtYV9tYXApOwogCi1pbnQgdmlkZW9idWZfZG1hX3VubWFwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hKQoraW50IHZpZGVvYnVmX2RtYV91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSkKIHsKIAlNQUdJQ19DSEVDSyhkbWEtPm1hZ2ljLCBNQUdJQ19ETUFCVUYpOwogCiAJaWYgKCFkbWEtPnNnbGVuKQogCQlyZXR1cm4gMDsKIAotCWRtYV91bm1hcF9zZyhxLT5kZXYsIGRtYS0+c2dsaXN0LCBkbWEtPnNnbGVuLCBkbWEtPmRpcmVjdGlvbik7CisJZG1hX3VubWFwX3NnKGRldiwgZG1hLT5zZ2xpc3QsIGRtYS0+c2dsZW4sIGRtYS0+ZGlyZWN0aW9uKTsKIAogCXZmcmVlKGRtYS0+c2dsaXN0KTsKIAlkbWEtPnNnbGlzdCA9IE5VTEw7CkBAIC0zMDksOCArMzE5LDggQEAKIAkJZG1hLT5wYWdlcyA9IE5VTEw7CiAJfQogCi0JdmZyZWUoZG1hLT52bWFsbG9jKTsKLQlkbWEtPnZtYWxsb2MgPSBOVUxMOworCXZmcmVlKGRtYS0+dmFkZHIpOworCWRtYS0+dmFkZHIgPSBOVUxMOwogCiAJaWYgKGRtYS0+YnVzX2FkZHIpCiAJCWRtYS0+YnVzX2FkZHIgPSAwOwpAQCAtMzIyLDI4ICszMzIsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50IHZpZGVvYnVmX3NnX2RtYV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpCi17Ci0Jc3RydWN0IHZpZGVvYnVmX3F1ZXVlIHE7Ci0KLQlxLmRldiA9IGRldjsKLQotCXJldHVybiB2aWRlb2J1Zl9kbWFfbWFwKCZxLCBkbWEpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlkZW9idWZfc2dfZG1hX21hcCk7Ci0KLWludCB2aWRlb2J1Zl9zZ19kbWFfdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpCi17Ci0Jc3RydWN0IHZpZGVvYnVmX3F1ZXVlIHE7Ci0KLQlxLmRldiA9IGRldjsKLQotCXJldHVybiB2aWRlb2J1Zl9kbWFfdW5tYXAoJnEsIGRtYSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aWRlb2J1Zl9zZ19kbWFfdW5tYXApOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogc3RhdGljIHZvaWQgdmlkZW9idWZfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgdmlkZW9idWZfbWFwcGluZyAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CkBAIC00MjgsNyArNDE2LDcgQEAKIAlzdHJ1Y3QgdmlkZW9idWZfZG1hX3NnX21lbW9yeQogICovCiAKLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICpfX3ZpZGVvYnVmX2FsbG9jKHNpemVfdCBzaXplKQorc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKl9fdmlkZW9idWZfYWxsb2NfdmIoc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHZpZGVvYnVmX2RtYV9zZ19tZW1vcnkgKm1lbTsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YjsKQEAgLTQ1Niw3ICs0NDQsNyBAQAogCiAJTUFHSUNfQ0hFQ0sobWVtLT5tYWdpYywgTUFHSUNfU0dfTUVNKTsKIAotCXJldHVybiBtZW0tPmRtYS52bWFsbG9jOworCXJldHVybiBtZW0tPmRtYS52YWRkcjsKIH0KIAogc3RhdGljIGludCBfX3ZpZGVvYnVmX2lvbG9jayhzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCkBAIC01MjAsNyArNTA4LDcgQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Ci0JZXJyID0gdmlkZW9idWZfZG1hX21hcChxLCAmbWVtLT5kbWEpOworCWVyciA9IHZpZGVvYnVmX2RtYV9tYXAocS0+ZGV2LCAmbWVtLT5kbWEpOwogCWlmICgwICE9IGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtNjIwLDggKzYwOCw2IEBACiAJfQogCiAJbWFwLT5jb3VudCAgICA9IDE7Ci0JbWFwLT5zdGFydCAgICA9IHZtYS0+dm1fc3RhcnQ7Ci0JbWFwLT5lbmQgICAgICA9IHZtYS0+dm1fZW5kOwogCW1hcC0+cSAgICAgICAgPSBxOwogCXZtYS0+dm1fb3BzICAgPSAmdmlkZW9idWZfdm1fb3BzOwogCXZtYS0+dm1fZmxhZ3MgfD0gVk1fRE9OVEVYUEFORCB8IFZNX1JFU0VSVkVEOwpAQCAtNjM4LDcgKzYyNCw3IEBACiBzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F0eXBlX29wcyBzZ19vcHMgPSB7CiAJLm1hZ2ljICAgICAgICA9IE1BR0lDX1FUWVBFX09QUywKIAotCS5hbGxvYyAgICAgICAgPSBfX3ZpZGVvYnVmX2FsbG9jLAorCS5hbGxvY192YiAgICAgPSBfX3ZpZGVvYnVmX2FsbG9jX3ZiLAogCS5pb2xvY2sgICAgICAgPSBfX3ZpZGVvYnVmX2lvbG9jaywKIAkuc3luYyAgICAgICAgID0gX192aWRlb2J1Zl9zeW5jLAogCS5tbWFwX21hcHBlciAgPSBfX3ZpZGVvYnVmX21tYXBfbWFwcGVyLApAQCAtNjU0LDcgKzY0MCw3IEBACiAKIAlxLm1zaXplID0gc2l6ZTsKIAotCXJldHVybiB2aWRlb2J1Zl9hbGxvYygmcSk7CisJcmV0dXJuIHZpZGVvYnVmX2FsbG9jX3ZiKCZxKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3NnX2FsbG9jKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi12bWFsbG9jLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLXZtYWxsb2MuYwppbmRleCA1ODM3MjhmLi5lN2ZlMzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLXZtYWxsb2MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLXZtYWxsb2MuYwpAQCAtMTAyLDEwICsxMDIsMTAgQEAKIAkJCQkgICBjYWxsZWQgd2l0aCBJUlEncyBkaXNhYmxlZAogCQkJCSAqLwogCQkJCWRwcmludGsoMSwgIiVzOiBidWZbJWRdIGZyZWVpbmcgKCVwKVxuIiwKLQkJCQkJX19mdW5jX18sIGksIG1lbS0+dm1hbGxvYyk7CisJCQkJCV9fZnVuY19fLCBpLCBtZW0tPnZhZGRyKTsKIAotCQkJCXZmcmVlKG1lbS0+dm1hbGxvYyk7Ci0JCQkJbWVtLT52bWFsbG9jID0gTlVMTDsKKwkJCQl2ZnJlZShtZW0tPnZhZGRyKTsKKwkJCQltZW0tPnZhZGRyID0gTlVMTDsKIAkJCX0KIAogCQkJcS0+YnVmc1tpXS0+bWFwICAgPSBOVUxMOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJc3RydWN0IHZpZGVvYnVmX2RtYV9zZ19tZW1vcnkKICAqLwogCi1zdGF0aWMgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqX192aWRlb2J1Zl9hbGxvYyhzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICpfX3ZpZGVvYnVmX2FsbG9jX3ZiKHNpemVfdCBzaXplKQogewogCXN0cnVjdCB2aWRlb2J1Zl92bWFsbG9jX21lbW9yeSAqbWVtOwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJCWRwcmludGsoMSwgIiVzIG1lbW9yeSBtZXRob2QgTU1BUFxuIiwgX19mdW5jX18pOwogCiAJCS8qIEFsbCBoYW5kbGluZyBzaG91bGQgYmUgZG9uZSBieSBfX3ZpZGVvYnVmX21tYXBfbWFwcGVyKCkgKi8KLQkJaWYgKCFtZW0tPnZtYWxsb2MpIHsKKwkJaWYgKCFtZW0tPnZhZGRyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIm1lbW9yeSBpcyBub3QgYWxsb2NlZC9tbWFwcGVkLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTg5LDEzICsxODksMTMgQEAKIAkJICogcmVhZCgpIG1ldGhvZC4KIAkJICovCiAKLQkJbWVtLT52bWFsbG9jID0gdm1hbGxvY191c2VyKHBhZ2VzKTsKLQkJaWYgKCFtZW0tPnZtYWxsb2MpIHsKKwkJbWVtLT52YWRkciA9IHZtYWxsb2NfdXNlcihwYWdlcyk7CisJCWlmICghbWVtLT52YWRkcikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJ2bWFsbG9jICglZCBwYWdlcykgZmFpbGVkXG4iLCBwYWdlcyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlkcHJpbnRrKDEsICJ2bWFsbG9jIGlzIGF0IGFkZHIgJXAgKCVkIHBhZ2VzKVxuIiwKLQkJCW1lbS0+dm1hbGxvYywgcGFnZXMpOworCQkJbWVtLT52YWRkciwgcGFnZXMpOwogCiAjaWYgMAogCQlpbnQgcmM7CkBAIC0yNDUsOCArMjQ1LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlidWYtPm1hcCA9IG1hcDsKLQltYXAtPnN0YXJ0ID0gdm1hLT52bV9zdGFydDsKLQltYXAtPmVuZCAgID0gdm1hLT52bV9lbmQ7CiAJbWFwLT5xICAgICA9IHE7CiAKIAlidWYtPmJhZGRyID0gdm1hLT52bV9zdGFydDsKQEAgLTI1NiwxOCArMjU0LDE4IEBACiAJTUFHSUNfQ0hFQ0sobWVtLT5tYWdpYywgTUFHSUNfVk1BTF9NRU0pOwogCiAJcGFnZXMgPSBQQUdFX0FMSUdOKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7Ci0JbWVtLT52bWFsbG9jID0gdm1hbGxvY191c2VyKHBhZ2VzKTsKLQlpZiAoIW1lbS0+dm1hbGxvYykgeworCW1lbS0+dmFkZHIgPSB2bWFsbG9jX3VzZXIocGFnZXMpOworCWlmICghbWVtLT52YWRkcikgewogCQlwcmludGsoS0VSTl9FUlIgInZtYWxsb2MgKCVkIHBhZ2VzKSBmYWlsZWRcbiIsIHBhZ2VzKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JZHByaW50aygxLCAidm1hbGxvYyBpcyBhdCBhZGRyICVwICglZCBwYWdlcylcbiIsIG1lbS0+dm1hbGxvYywgcGFnZXMpOworCWRwcmludGsoMSwgInZtYWxsb2MgaXMgYXQgYWRkciAlcCAoJWQgcGFnZXMpXG4iLCBtZW0tPnZhZGRyLCBwYWdlcyk7CiAKIAkvKiBUcnkgdG8gcmVtYXAgbWVtb3J5ICovCi0JcmV0dmFsID0gcmVtYXBfdm1hbGxvY19yYW5nZSh2bWEsIG1lbS0+dm1hbGxvYywgMCk7CisJcmV0dmFsID0gcmVtYXBfdm1hbGxvY19yYW5nZSh2bWEsIG1lbS0+dmFkZHIsIDApOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibW1hcDogcmVtYXAgZmFpbGVkIHdpdGggZXJyb3IgJWQuICIsIHJldHZhbCk7Ci0JCXZmcmVlKG1lbS0+dm1hbGxvYyk7CisJCXZmcmVlKG1lbS0+dmFkZHIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMjkzLDcgKzI5MSw3IEBACiBzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F0eXBlX29wcyBxb3BzID0gewogCS5tYWdpYyAgICAgICAgPSBNQUdJQ19RVFlQRV9PUFMsCiAKLQkuYWxsb2MgICAgICAgID0gX192aWRlb2J1Zl9hbGxvYywKKwkuYWxsb2NfdmIgICAgID0gX192aWRlb2J1Zl9hbGxvY192YiwKIAkuaW9sb2NrICAgICAgID0gX192aWRlb2J1Zl9pb2xvY2ssCiAJLm1tYXBfbWFwcGVyICA9IF9fdmlkZW9idWZfbW1hcF9tYXBwZXIsCiAJLnZhZGRyICAgICAgICA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MsCkBAIC0zMTksNyArMzE3LDcgQEAKIAlCVUdfT04oIW1lbSk7CiAJTUFHSUNfQ0hFQ0sobWVtLT5tYWdpYywgTUFHSUNfVk1BTF9NRU0pOwogCi0JcmV0dXJuIG1lbS0+dm1hbGxvYzsKKwlyZXR1cm4gbWVtLT52YWRkcjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpZGVvYnVmX3RvX3ZtYWxsb2MpOwogCkBAIC0zNDEsOCArMzM5LDggQEAKIAogCU1BR0lDX0NIRUNLKG1lbS0+bWFnaWMsIE1BR0lDX1ZNQUxfTUVNKTsKIAotCXZmcmVlKG1lbS0+dm1hbGxvYyk7Ci0JbWVtLT52bWFsbG9jID0gTlVMTDsKKwl2ZnJlZShtZW0tPnZhZGRyKTsKKwltZW0tPnZhZGRyID0gTlVMTDsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDdlZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZpZGVvNExpbnV4IGRyaXZlciBmb3IgVzk5Nls4N11DRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIENoaXAuICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIC0gTWVtb3J5IG1hbmFnZW1lbnQgY29kZSBmcm9tIGJ0dHYgZHJpdmVyIGJ5IFJhbHBoIE1ldHpsZXIsICAgICAgICAgICAgICoKLSAqICAgTWFyY3VzIE1ldHpsZXIgYW5kIEdlcmQgS25vcnIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIC0gSTJDIGludGVyZmFjZSB0byBrZXJuZWwsIGhpZ2gtbGV2ZWwgaW1hZ2Ugc2Vuc29yIGNvbnRyb2wgcm91dGluZXMgYW5kICoKLSAqICAgc29tZSBzeW1ib2xpYyBuYW1lcyBmcm9tIE9WNTExIGRyaXZlciBieSBNYXJrIFcuIE1jQ2xlbGxhbmQuICAgICAgICAgICoKLSAqIC0gTG93LWxldmVsIEkyQyBmYXN0IHdyaXRlIGZ1bmN0aW9uIGJ5IFBpb3RyIEN6ZXJjemFrLiAgICAgICAgICAgICAgICAgICoKLSAqIC0gTG93LWxldmVsIEkyQyByZWFkIGZ1bmN0aW9uIGJ5IEZyZWRlcmljIEpvdWF1bHQuICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLQotI2luY2x1ZGUgInc5OTY4Y2YuaCIKLSNpbmNsdWRlICJ3OTk2OGNmX2RlY29kZXIuaCIKLQotc3RhdGljIHN0cnVjdCB3OTk2OGNmX3ZwcF90KiB3OTk2OGNmX3ZwcDsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3OTk2OGNmX3ZwcG1vZF93YWl0KTsKLQotc3RhdGljIExJU1RfSEVBRCh3OTk2OGNmX2Rldl9saXN0KTsgLyogaGVhZCBvZiBWNEwgcmVnaXN0ZXJlZCBjYW1lcmFzIGxpc3QgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgodzk5NjhjZl9kZXZsaXN0X211dGV4KTsgLyogc2VtYXBob3JlIGZvciBsaXN0IHRyYXZlcnNhbCAqLwotCi1zdGF0aWMgREVDTEFSRV9SV1NFTSh3OTk2OGNmX2Rpc2Nvbm5lY3QpOyAvKiBwcmV2ZW50IHJhY2VzIHdpdGggb3BlbigpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1vZHVsZSBtYWNyb3MgYW5kIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHdpbmJvbmRfaWRfdGFibGUpOwotCi1NT0RVTEVfQVVUSE9SKFc5OTY4Q0ZfTU9EVUxFX0FVVEhPUiIgIlc5OTY4Q0ZfQVVUSE9SX0VNQUlMKTsKLU1PRFVMRV9ERVNDUklQVElPTihXOTk2OENGX01PRFVMRV9OQU1FKTsKLU1PRFVMRV9WRVJTSU9OKFc5OTY4Q0ZfTU9EVUxFX1ZFUlNJT04pOwotTU9EVUxFX0xJQ0VOU0UoVzk5NjhDRl9NT0RVTEVfTElDRU5TRSk7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiVmlkZW8iKTsKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHNpbWNhbXMgPSBXOTk2OENGX1NJTUNBTVM7Ci1zdGF0aWMgc2hvcnQgdmlkZW9fbnJbXT17WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSAtMX07IC8qLTE9Zmlyc3QgZnJlZSovCi1zdGF0aWMgdW5zaWduZWQgaW50IHBhY2tldF9zaXplW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPQotCQkJCSAgICAgVzk5NjhDRl9QQUNLRVRfU0laRX07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbWF4X2J1ZmZlcnNbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9Ci0JCQkJICAgICAgIFc5OTY4Q0ZfQlVGRkVSU307Ci1zdGF0aWMgaW50IGRvdWJsZV9idWZmZXJbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9Ci0JCQkgICAgICBXOTk2OENGX0RPVUJMRV9CVUZGRVJ9Owotc3RhdGljIGludCBjbGFtcGluZ1tdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9DTEFNUElOR307Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZmlsdGVyX3R5cGVbXT0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0KLQkJCQkgICAgICBXOTk2OENGX0ZJTFRFUl9UWVBFfTsKLXN0YXRpYyBpbnQgbGFyZ2V2aWV3W109IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfTEFSR0VWSUVXfTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBkZWNvbXByZXNzaW9uW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPQotCQkJCQkgVzk5NjhDRl9ERUNPTVBSRVNTSU9OfTsKLXN0YXRpYyBpbnQgdXBzY2FsaW5nW109IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfVVBTQ0FMSU5HfTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9wYWxldHRlW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSAwfTsKLXN0YXRpYyBpbnQgZm9yY2VfcmdiW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0ZPUkNFX1JHQn07Ci1zdGF0aWMgaW50IGF1dG9icmlnaHRbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfQVVUT0JSSUdIVH07Ci1zdGF0aWMgaW50IGF1dG9leHBbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfQVVUT0VYUH07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbGlnaHRmcmVxW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPQotCQkJCSAgICAgVzk5NjhDRl9MSUdIVEZSRVF9Owotc3RhdGljIGludCBiYW5kaW5nZmlsdGVyW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV09Ci0JCQkgICAgICBXOTk2OENGX0JBTkRJTkdGSUxURVJ9Owotc3RhdGljIHNob3J0IGNsb2NrZGl2W10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0NMT0NLRElWfTsKLXN0YXRpYyBpbnQgYmFja2xpZ2h0W10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0JBQ0tMSUdIVH07Ci1zdGF0aWMgaW50IG1pcnJvcltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9NSVJST1J9Owotc3RhdGljIGludCBtb25vY2hyb21lW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV09Vzk5NjhDRl9NT05PQ0hST01FfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzc1tdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0KLQkJCQkgICAgVzk5NjhDRl9CUklHSFRORVNTfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaHVlW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0hVRX07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvbG91cltdPXtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfQ09MT1VSfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29udHJhc3RbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9Ci0JCQkJICBXOTk2OENGX0NPTlRSQVNUfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgd2hpdGVuZXNzW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPQotCQkJCSAgIFc5OTY4Q0ZfV0hJVEVORVNTfTsKLSNpZmRlZiBXOTk2OENGX0RFQlVHCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVidWcgPSBXOTk2OENGX0RFQlVHX0xFVkVMOwotc3RhdGljIGludCBzcGVjaWZpY19kZWJ1ZyA9IFc5OTY4Q0ZfU1BFQ0lGSUNfREVCVUc7Ci0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludCBwYXJhbV9udlsyNF07IC8qIG51bWJlciBvZiB2YWx1ZXMgcGVyIHBhcmFtZXRlciAqLwotCi1tb2R1bGVfcGFyYW0oc2ltY2FtcywgdXNob3J0LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheSh2aWRlb19uciwgc2hvcnQsICZwYXJhbV9udlswXSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocGFja2V0X3NpemUsIHVpbnQsICZwYXJhbV9udlsxXSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkobWF4X2J1ZmZlcnMsIHVzaG9ydCwgJnBhcmFtX252WzJdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShkb3VibGVfYnVmZmVyLCBib29sLCAmcGFyYW1fbnZbM10sIDA0NDQpOwotbW9kdWxlX3BhcmFtX2FycmF5KGNsYW1waW5nLCBib29sLCAmcGFyYW1fbnZbNF0sIDA0NDQpOwotbW9kdWxlX3BhcmFtX2FycmF5KGZpbHRlcl90eXBlLCB1c2hvcnQsICZwYXJhbV9udls1XSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkobGFyZ2V2aWV3LCBib29sLCAmcGFyYW1fbnZbNl0sIDA0NDQpOwotbW9kdWxlX3BhcmFtX2FycmF5KGRlY29tcHJlc3Npb24sIHVzaG9ydCwgJnBhcmFtX252WzddLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheSh1cHNjYWxpbmcsIGJvb2wsICZwYXJhbV9udls4XSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZm9yY2VfcGFsZXR0ZSwgdXNob3J0LCAmcGFyYW1fbnZbOV0sIDA0NDQpOwotbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX3JnYiwgdXNob3J0LCAmcGFyYW1fbnZbMTBdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShhdXRvYnJpZ2h0LCBib29sLCAmcGFyYW1fbnZbMTFdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShhdXRvZXhwLCBib29sLCAmcGFyYW1fbnZbMTJdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShsaWdodGZyZXEsIHVzaG9ydCwgJnBhcmFtX252WzEzXSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoYmFuZGluZ2ZpbHRlciwgYm9vbCwgJnBhcmFtX252WzE0XSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoY2xvY2tkaXYsIHNob3J0LCAmcGFyYW1fbnZbMTVdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShiYWNrbGlnaHQsIGJvb2wsICZwYXJhbV9udlsxNl0sIDA0NDQpOwotbW9kdWxlX3BhcmFtX2FycmF5KG1pcnJvciwgYm9vbCwgJnBhcmFtX252WzE3XSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkobW9ub2Nocm9tZSwgYm9vbCwgJnBhcmFtX252WzE4XSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoYnJpZ2h0bmVzcywgdWludCwgJnBhcmFtX252WzE5XSwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoaHVlLCB1aW50LCAmcGFyYW1fbnZbMjBdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShjb2xvdXIsIHVpbnQsICZwYXJhbV9udlsyMV0sIDA0NDQpOwotbW9kdWxlX3BhcmFtX2FycmF5KGNvbnRyYXN0LCB1aW50LCAmcGFyYW1fbnZbMjJdLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheSh3aGl0ZW5lc3MsIHVpbnQsICZwYXJhbV9udlsyM10sIDA0NDQpOwotI2lmZGVmIFc5OTY4Q0ZfREVCVUcKLW1vZHVsZV9wYXJhbShkZWJ1ZywgdXNob3J0LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShzcGVjaWZpY19kZWJ1ZywgYm9vbCwgMDY0NCk7Ci0jZW5kaWYKLQotTU9EVUxFX1BBUk1fREVTQyhzaW1jYW1zLAotCQkgIlxuPG4+IE51bWJlciBvZiBjYW1lcmFzIGFsbG93ZWQgdG8gc3RyZWFtIHNpbXVsdGFuZW91c2x5LiIKLQkJICJcbm4gbWF5IHZhcnkgZnJvbSAwIHRvICIKLQkJIF9fTU9EVUxFX1NUUklORyhXOTk2OENGX01BWF9ERVZJQ0VTKSIuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfU0lNQ0FNUykiLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwKLQkJICJcbjwtMXxuWywuLi5dPiBTcGVjaWZ5IFY0TCBtaW5vciBtb2RlIG51bWJlci4iCi0JCSAiXG4gLTEgPSB1c2UgbmV4dCBhdmFpbGFibGUgKGRlZmF1bHQpIgotCQkgIlxuICBuID0gdXNlIG1pbm9yIG51bWJlciBuIChpbnRlZ2VyID49IDApIgotCQkgIlxuWW91IGNhbiBzcGVjaWZ5IHVwIHRvICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9NQVhfREVWSUNFUykKLQkJICIgY2FtZXJhcyB0aGlzIHdheS4iCi0JCSAiXG5Gb3IgZXhhbXBsZToiCi0JCSAiXG52aWRlb19ucj0tMSwyLC0xIHdvdWxkIGFzc2lnbiBtaW5vciBudW1iZXIgMiB0byIKLQkJICJcbnRoZSBzZWNvbmQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IgotCQkgIlxub25lIGFuZCBmb3IgZXZlcnkgb3RoZXIgY2FtZXJhLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhwYWNrZXRfc2l6ZSwKLQkJICJcbjxuWywuLi5dPiBTcGVjaWZ5IHRoZSBtYXhpbXVtIGRhdGEgcGF5bG9hZCIKLQkJICJcbnNpemUgaW4gYnl0ZXMgZm9yIGFsdGVybmF0ZSBzZXR0aW5ncywgZm9yIGVhY2ggZGV2aWNlLiIKLQkJICJcbm4gaXMgc2NhbGVkIGJldHdlZW4gNjMgYW5kIDEwMjMgIgotCQkgIihkZWZhdWx0IGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9QQUNLRVRfU0laRSkiKS4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0MobWF4X2J1ZmZlcnMsCi0JCSAiXG48blssLi4uXT4gRm9yIGFkdmFuY2VkIHVzZXJzLiIKLQkJICJcblNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZpZGVvIGZyYW1lIGJ1ZmZlcnMiCi0JCSAiXG50byBhbGxvY2F0ZSBmb3IgZWFjaCBkZXZpY2UsIGZyb20gMiB0byAiCi0JCSBfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9NQVhfQlVGRkVSUykKLQkJICIuIChkZWZhdWx0IGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9CVUZGRVJTKSIpLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfYnVmZmVyLAotCQkgIlxuPDB8MVssLi4uXT4gIgotCQkgIkhhcmR3YXJlIGRvdWJsZSBidWZmZXJpbmc6IDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCi0JCSAiXG5JdCBzaG91bGQgYmUgZW5hYmxlZCBpZiB5b3Ugd2FudCBzbW9vdGggdmlkZW8gb3V0cHV0OiBpZiIKLQkJICJcbnlvdSBvYnRhaW4gb3V0IG9mIHN5bmMuIHZpZGVvLCBkaXNhYmxlIGl0LCBvciB0cnkgdG8iCi0JCSAiXG5kZWNyZWFzZSB0aGUgJ2Nsb2NrZGl2JyBtb2R1bGUgcGFyYW1ldGVyIHZhbHVlLiIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0RPVUJMRV9CVUZGRVIpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGNsYW1waW5nLAotCQkgIlxuPDB8MVssLi4uXT4gVmlkZW8gZGF0YSBjbGFtcGluZzogMCBkaXNhYmxlZCwgMSBlbmFibGVkLiIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0NMQU1QSU5HKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhmaWx0ZXJfdHlwZSwKLQkJICJcbjwwfDF8MlssLi4uXT4gVmlkZW8gZmlsdGVyIHR5cGUuIgotCQkgIlxuMCBub25lLCAxICgxLTItMSkgMy10YXAgZmlsdGVyLCAiCi0JCSAiMiAoMi0zLTYtMy0yKSA1LXRhcCBmaWx0ZXIuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfRklMVEVSX1RZUEUpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuVGhlIGZpbHRlciBpcyB1c2VkIHRvIHJlZHVjZSBub2lzZSBhbmQgYWxpYXNpbmcgYXJ0aWZhY3RzIgotCQkgIlxucHJvZHVjZWQgYnkgdGhlIENDRCBvciBDTU9TIGltYWdlIHNlbnNvciwgYW5kIHRoZSBzY2FsaW5nIgotCQkgIiBwcm9jZXNzLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhsYXJnZXZpZXcsCi0JCSAiXG48MHwxWywuLi5dPiBMYXJnZSB2aWV3OiAwIGRpc2FibGVkLCAxIGVuYWJsZWQuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfTEFSR0VWSUVXKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyh1cHNjYWxpbmcsCi0JCSAiXG48MHwxWywuLi5dPiBTb2Z0d2FyZSBzY2FsaW5nIChmb3Igbm9uLWNvbXByZXNzZWQgdmlkZW8pOiIKLQkJICJcbjAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCi0JCSAiXG5EaXNhYmxlIGl0IGlmIHlvdSBoYXZlIGEgc2xvdyBDUFUgb3IgeW91IGRvbid0IGhhdmUiCi0JCSAiIGVub3VnaCBtZW1vcnkuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfVVBTQ0FMSU5HKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbklmICd3OTk2OGNmLXZwcCcgaXMgbm90IHByZXNlbnQsIHRoaXMgcGFyYW1ldGVyIGlzIgotCQkgIiBzZXQgdG8gMC4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVjb21wcmVzc2lvbiwKLQkJICJcbjwwfDF8MlssLi4uXT4gU29mdHdhcmUgdmlkZW8gZGVjb21wcmVzc2lvbjoiCi0JCSAiXG4tIDAgZGlzYWJsZXMgZGVjb21wcmVzc2lvbiAoZG9lc24ndCBhbGxvdyBmb3JtYXRzIG5lZWRpbmciCi0JCSAiIGRlY29tcHJlc3Npb24pIgotCQkgIlxuLSAxIGZvcmNlcyBkZWNvbXByZXNzaW9uIChhbGxvd3MgZm9ybWF0cyBuZWVkaW5nIgotCQkgIiBkZWNvbXByZXNzaW9uIG9ubHkpOyIKLQkJICJcbi0gMiBhbGxvd3MgYW55IHBlcm1pdHRlZCBmb3JtYXRzLiIKLQkJICJcbkZvcm1hdHMgc3VwcG9ydGluZyBjb21wcmVzc2VkIHZpZGVvIGFyZSBZVVY0MjJQIGFuZCIKLQkJICIgWVVWNDIwUC9ZVVY0MjAgIgotCQkgIlxuaW4gYW55IHJlc29sdXRpb25zIHdoZXJlIGJvdGggd2lkdGggYW5kIGhlaWdodCBhcmUgIgotCQkgImEgbXVsdGlwbGUgb2YgMTYuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfREVDT01QUkVTU0lPTikKLQkJICIgZm9yIGV2ZXJ5IGRldmljZS4iCi0JCSAiXG5JZiAndzk5NjhjZi12cHAnIGlzIG5vdCBwcmVzZW50LCBmb3JjaW5nIGRlY29tcHJlc3Npb24gaXMgIgotCQkgIlxubm90IGFsbG93ZWQ7IGluIHRoaXMgY2FzZSB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gMi4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcGFsZXR0ZSwKLQkJICJcbjwwIgotCQkgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1VZVlkpCi0JCSAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfWVVWNDIwKQotCQkgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1lVVjQyMlApCi0JCSAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfWVVWNDIwUCkKLQkJICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9ZVVlWKQotCQkgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1lVVjQyMikKLQkJICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9HUkVZKQotCQkgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1JHQjU1NSkKLQkJICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9SR0I1NjUpCi0JCSAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfUkdCMjQpCi0JCSAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfUkdCMzIpCi0JCSAiWywuLi5dPiIKLQkJICIgRm9yY2UgcGljdHVyZSBwYWxldHRlLiIKLQkJICJcbkluIG9yZGVyOiIKLQkJICJcbi0gMCBhbGxvd3MgYW55IG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoiCi0JCSAiXG4tIFVZVlkgICAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGRpc2FibGVkIgotCQkgIlxuLSBZVVY0MjAgIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkIgotCQkgIlxuLSBZVVY0MjJQIDE2IGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkIgotCQkgIlxuLSBZVVY0MjBQIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkIgotCQkgIlxuLSBZVVZZICAgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuLSBZVVY0MjIgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuLSBHUkVZICAgICA4IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuLSBSR0I1NTUgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuLSBSR0I1NjUgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuLSBSR0IyNCAgIDI0IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuLSBSR0IzMiAgIDMyIGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgotCQkgIlxuV2hlbiBub3QgMCwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBvdmVycmlkZSAnZGVjb21wcmVzc2lvbicuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAwIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuSW5pdGlhbCBwYWxldHRlIGlzICIKLQkJIF9fTU9EVUxFX1NUUklORyhXOTk2OENGX1BBTEVUVEVfREVDT01QX09OKSIuIgotCQkgIlxuSWYgJ3c5OTY4Y2YtdnBwJyBpcyBub3QgcHJlc2VudCwgdGhpcyBwYXJhbWV0ZXIgaXMiCi0JCSAiIHNldCB0byA5IChVWVZZKS4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcmdiLAotCQkgIlxuPDB8MVssLi4uXT4gUmVhZCBSR0IgdmlkZW8gZGF0YSBpbnN0ZWFkIG9mIEJHUjoiCi0JCSAiXG4gMSA9IHVzZSBSR0IgY29tcG9uZW50IG9yZGVyaW5nLiIKLQkJICJcbiAwID0gdXNlIEJHUiBjb21wb25lbnQgb3JkZXJpbmcuIgotCQkgIlxuVGhpcyBwYXJhbWV0ZXIgaGFzIGVmZmVjdCB3aGVuIHVzaW5nIFJHQlggcGFsZXR0ZXMgb25seS4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9GT1JDRV9SR0IpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGF1dG9icmlnaHQsCi0JCSAiXG48MHwxWywuLi5dPiBJbWFnZSBzZW5zb3IgYXV0b21hdGljYWxseSBjaGFuZ2VzIGJyaWdodG5lc3M6IgotCQkgIlxuIDAgPSBubywgMSA9IHllcyIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0FVVE9CUklHSFQpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGF1dG9leHAsCi0JCSAiXG48MHwxWywuLi5dPiBJbWFnZSBzZW5zb3IgYXV0b21hdGljYWxseSBjaGFuZ2VzIGV4cG9zdXJlOiIKLQkJICJcbiAwID0gbm8sIDEgPSB5ZXMiCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9BVVRPRVhQKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhsaWdodGZyZXEsCi0JCSAiXG48NTB8NjBbLC4uLl0+IExpZ2h0IGZyZXF1ZW5jeSBpbiBIejoiCi0JCSAiXG4gNTAgZm9yIEV1cm9wZWFuIGFuZCBBc2lhbiBsaWdodGluZywiCi0JCSAiIDYwIGZvciBBbWVyaWNhbiBsaWdodGluZy4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9MSUdIVEZSRVEpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGJhbmRpbmdmaWx0ZXIsCi0JCSAiXG48MHwxWywuLi5dPiBCYW5kaW5nIGZpbHRlciB0byByZWR1Y2UgZWZmZWN0cyBvZiIKLQkJICIgZmx1b3Jlc2NlbnQgbGlnaHRpbmc6IgotCQkgIlxuIDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCi0JCSAiXG5UaGlzIGZpbHRlciB0cmllcyB0byByZWR1Y2UgdGhlIHBhdHRlcm4gb2YgaG9yaXpvbnRhbCIKLQkJICJcbmxpZ2h0L2RhcmsgYmFuZHMgY2F1c2VkIGJ5IHNvbWUgKHVzdWFsbHkgZmx1b3Jlc2NlbnQpIgotCQkgIiBsaWdodGluZy4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9CQU5ESU5HRklMVEVSKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhjbG9ja2RpdiwKLQkJICJcbjwtMXxuWywuLi5dPiAiCi0JCSAiRm9yY2UgcGl4ZWwgY2xvY2sgZGl2aXNvciB0byBhIHNwZWNpZmljIHZhbHVlIChmb3IgZXhwZXJ0cyk6IgotCQkgIlxuICBuIG1heSB2YXJ5IGZyb20gMCB0byAxMjcuIgotCQkgIlxuIC0xIGZvciBhdXRvbWF0aWMgdmFsdWUuIgotCQkgIlxuU2VlIGFsc28gdGhlICdkb3VibGVfYnVmZmVyJyBtb2R1bGUgcGFyYW1ldGVyLiIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0NMT0NLRElWKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhiYWNrbGlnaHQsCi0JCSAiXG48MHwxWywuLi5dPiBPYmplY3RzIGFyZSBsaXQgZnJvbSBiZWhpbmQ6IgotCQkgIlxuIDAgPSBubywgMSA9IHllcyIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0JBQ0tMSUdIVCkKLQkJICIgZm9yIGV2ZXJ5IGRldmljZS4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0MobWlycm9yLAotCQkgIlxuPDB8MVssLi4uXT4gUmV2ZXJzZSBpbWFnZSBob3Jpem9udGFsbHk6IgotCQkgIlxuIDAgPSBubywgMSA9IHllcyIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX01JUlJPUikKLQkJICIgZm9yIGV2ZXJ5IGRldmljZS4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0MobW9ub2Nocm9tZSwKLQkJICJcbjwwfDFbLC4uLl0+IFVzZSBpbWFnZSBzZW5zb3IgYXMgbW9ub2Nocm9tZSBzZW5zb3I6IgotCQkgIlxuIDAgPSBubywgMSA9IHllcyIKLQkJICJcbk5vdCBhbGwgdGhlIHNlbnNvcnMgc3VwcG9ydCBtb25vY2hyb21lIGNvbG9yLiIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX01PTk9DSFJPTUUpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3MsCi0JCSAiXG48blssLi4uXT4gU2V0IHBpY3R1cmUgYnJpZ2h0bmVzcyAoMC02NTUzNSkuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQlJJR0hUTkVTUykKLQkJICIgZm9yIGV2ZXJ5IGRldmljZS4iCi0JCSAiXG5UaGlzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGlmICdhdXRvYnJpZ2h0JyBpcyBlbmFibGVkLiIKLQkJICJcbiIpOwotTU9EVUxFX1BBUk1fREVTQyhodWUsCi0JCSAiXG48blssLi4uXT4gU2V0IHBpY3R1cmUgaHVlICgwLTY1NTM1KS4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9IVUUpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGNvbG91ciwKLQkJICJcbjxuWywuLi5dPiBTZXQgcGljdHVyZSBzYXR1cmF0aW9uICgwLTY1NTM1KS4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9DT0xPVVIpCi0JCSAiIGZvciBldmVyeSBkZXZpY2UuIgotCQkgIlxuIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGNvbnRyYXN0LAotCQkgIlxuPG5bLC4uLl0+IFNldCBwaWN0dXJlIGNvbnRyYXN0ICgwLTY1NTM1KS4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9DT05UUkFTVCkKLQkJICIgZm9yIGV2ZXJ5IGRldmljZS4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0Mod2hpdGVuZXNzLAotCQkgIlxuPG5bLC4uLl0+IFNldCBwaWN0dXJlIHdoaXRlbmVzcyAoMC02NTUzNSkuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfV0hJVEVORVNTKQotCQkgIiBmb3IgZXZlcnkgZGV2aWNlLiIKLQkJICJcbiIpOwotI2lmZGVmIFc5OTY4Q0ZfREVCVUcKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsCi0JCSAiXG48bj4gRGVidWdnaW5nIGluZm9ybWF0aW9uIGxldmVsLCBmcm9tIDAgdG8gNjoiCi0JCSAiXG4wID0gbm9uZSAodXNlIGNhcmVmdWxseSkiCi0JCSAiXG4xID0gY3JpdGljYWwgZXJyb3JzIgotCQkgIlxuMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucyIKLQkJICJcbjMgPSBjb25maWd1cmF0aW9uIG9yIGdlbmVyYWwgbWVzc2FnZXMiCi0JCSAiXG40ID0gd2FybmluZ3MiCi0JCSAiXG41ID0gY2FsbGVkIGZ1bmN0aW9ucyIKLQkJICJcbjYgPSBmdW5jdGlvbiBpbnRlcm5hbHMiCi0JCSAiXG5MZXZlbCA1IGFuZCA2IGFyZSB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5ICIKLQkJICJvbmUgZGV2aWNlIGlzIHVzZWQuIgotCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfREVCVUdfTEVWRUwpIi4iCi0JCSAiXG4iKTsKLU1PRFVMRV9QQVJNX0RFU0Moc3BlY2lmaWNfZGVidWcsCi0JCSAiXG48MHwxPiBFbmFibGUgb3IgZGlzYWJsZSBzcGVjaWZpYyBkZWJ1Z2dpbmcgbWVzc2FnZXM6IgotCQkgIlxuMCA9IHByaW50IG1lc3NhZ2VzIGNvbmNlcm5pbmcgZXZlcnkgbGV2ZWwiCi0JCSAiIDw9ICdkZWJ1ZycgbGV2ZWwuIgotCQkgIlxuMSA9IHByaW50IG1lc3NhZ2VzIGNvbmNlcm5pbmcgdGhlIGxldmVsIgotCQkgIiBpbmRpY2F0ZWQgYnkgJ2RlYnVnJy4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICIKLQkJIF9fTU9EVUxFX1NUUklORyhXOTk2OENGX1NQRUNJRklDX0RFQlVHKSIuIgotCQkgIlxuIik7Ci0jZW5kaWYgLyogVzk5NjhDRl9ERUJVRyAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNvbWUgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVmlkZW80bGludXggaW50ZXJmYWNlICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHc5OTY4Y2ZfZm9wczsKLXN0YXRpYyBpbnQgdzk5NjhjZl9vcGVuKHN0cnVjdCBmaWxlICopOwotc3RhdGljIGludCB3OTk2OGNmX3JlbGVhc2Uoc3RydWN0IGZpbGUgKik7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfbW1hcChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci1zdGF0aWMgbG9uZyB3OTk2OGNmX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBzc2l6ZV90IHc5OTY4Y2ZfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLXN0YXRpYyBsb25nIHc5OTY4Y2ZfdjRsX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJCSAgICAgdm9pZCBfX3VzZXIgKik7Ci0KLS8qIFVTQi1zcGVjaWZpYyAqLwotc3RhdGljIGludCB3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCB3OTk2OGNmX3N0b3BfdHJhbnNmZXIoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7Ci1zdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfcmVnKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9yZWFkX3JlZyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYgaW5kZXgpOwotc3RhdGljIGludCB3OTk2OGNmX3dyaXRlX2ZzYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYqIGRhdGEpOwotc3RhdGljIGludCB3OTk2OGNmX3dyaXRlX3NiKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHUxNiB2YWx1ZSk7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl91cGxvYWRfcXVhbnRpemF0aW9udGFibGVzKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIHZvaWQgdzk5NjhjZl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKTsKLQotLyogTG93LWxldmVsIEkyQyAoU01CdXMpIEkvTyAqLwotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3N0YXJ0KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3N0b3Aoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7Ci1zdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfd3JpdGVfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1OCB2KTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19yZWFkX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTgqIHYpOwotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3dyaXRlX2FjayhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19yZWFkX2FjayhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19yZWZyZXNoX2J1cyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sCi0JCQkJICAgICAgdTE2IGFkZHJlc3MsIHU4KiB2YWx1ZSk7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlX2RhdGEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTE2IGFkZHJlc3MsCi0JCQkJCSAgIHU4IHN1YmFkZHJlc3MsIHU4KiB2YWx1ZSk7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfd3JpdGVfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLAotCQkJCSAgICAgICB1MTYgYWRkcmVzcywgdTggc3ViYWRkcmVzcyk7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfZmFzdHdyaXRlX2J5dGVfZGF0YShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLAotCQkJCQkJdTE2IGFkZHJlc3MsIHU4IHN1YmFkZHJlc3MsCi0JCQkJCQl1OCB2YWx1ZSk7Ci0KLS8qIEkyQyBpbnRlcmZhY2UgdG8ga2VybmVsICovCi1zdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2luaXQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyKiwgdTE2IGFkZHIsCi0JCQkJICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAotCQkJCSAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhKik7Ci1zdGF0aWMgdTMyIHc5OTY4Y2ZfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyKik7Ci0KLS8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCi1zdGF0aWMgdm9pZCogcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKLXN0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1zdGF0aWMgdm9pZCB3OTk2OGNmX2RlYWxsb2NhdGVfbWVtb3J5KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCAgdzk5NjhjZl9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7Ci0KLS8qIEhpZ2gtbGV2ZWwgaW1hZ2Ugc2Vuc29yIGNvbnRyb2wgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKHN0cnVjdCB3OTk2OGNmX2RldmljZSosaW50IGNpZCxpbnQgdmFsKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKixpbnQgY2lkLGludCAqdmFsKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfY21kKHN0cnVjdCB3OTk2OGNmX2RldmljZSosCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwotc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl91cGRhdGVfc2V0dGluZ3Moc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7Ci1zdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX2dldF9waWN0dXJlKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl91cGRhdGVfcGljdHVyZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLAotCQkJCQkgc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdCk7Ci0KLS8qIE90aGVyIGhlbHBlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIHc5OTY4Y2ZfY29uZmlndXJlX2NhbWVyYShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLHN0cnVjdCB1c2JfZGV2aWNlKiwKLQkJCQkgICAgIGVudW0gdzk5NjhjZl9tb2RlbF9pZCwKLQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRldl9ucik7Ci1zdGF0aWMgdm9pZCB3OTk2OGNmX2FkanVzdF9jb25maWd1cmF0aW9uKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCB3OTk2OGNmX3R1cm5fb25fbGVkKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOwotc3RhdGljIGludCB3OTk2OGNmX2luaXRfY2hpcChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKLXN0YXRpYyBpbmxpbmUgdTE2IHc5OTY4Y2ZfdmFsaWRfcGFsZXR0ZSh1MTYgcGFsZXR0ZSk7Ci1zdGF0aWMgaW5saW5lIHUxNiB3OTk2OGNmX3ZhbGlkX2RlcHRoKHUxNiBwYWxldHRlKTsKLXN0YXRpYyBpbmxpbmUgdTggdzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24odTE2IHBhbGV0dGUpOwotc3RhdGljIGludCB3OTk2OGNmX3NldF9waWN0dXJlKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHN0cnVjdCB2aWRlb19waWN0dXJlKTsKLXN0YXRpYyBpbnQgdzk5NjhjZl9zZXRfd2luZG93KHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHN0cnVjdCB2aWRlb193aW5kb3cpOwotc3RhdGljIGludCB3OTk2OGNmX3Bvc3Rwcm9jZXNzX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSosCi0JCQkJICAgICBzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90Kik7Ci1zdGF0aWMgaW50IHc5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHUzMiAqdywgdTMyICpoKTsKLXN0YXRpYyB2b2lkIHc5OTY4Y2ZfaW5pdF9mcmFtZWxpc3Qoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7Ci1zdGF0aWMgdm9pZCB3OTk2OGNmX3B1c2hfZnJhbWUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTggZl9udW0pOwotc3RhdGljIHZvaWQgdzk5NjhjZl9wb3BfZnJhbWUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKixzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiopOwotc3RhdGljIHZvaWQgdzk5NjhjZl9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTeW1ib2xpYyBuYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFVzZWQgdG8gcmVwcmVzZW50IGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgc3ltYm9saWMgbmFtZXMgKi8KLXN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3QgewotCWNvbnN0IGludCBudW07Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgc3ltYm9saWNfbGlzdCBhcnJheS4gVGhlCi0gIGVuZCBvZiB0aGUgbGlzdCBtdXN0IGJlIG1hcmtlZCB3aXRoIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSBOVUxMIG5hbWUuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCi1zeW1ib2xpYyhzdHJ1Y3Qgdzk5NjhjZl9zeW1ib2xpY19saXN0IGxpc3RbXSwgY29uc3QgaW50IG51bSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGxpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCWlmIChsaXN0W2ldLm51bSA9PSBudW0pCi0JCQlyZXR1cm4gKGxpc3RbaV0ubmFtZSk7Ci0KLQlyZXR1cm4gIlVua25vd24iOwotfQotCi1zdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCBjYW1saXN0W10gPSB7Ci0JeyBXOTk2OENGX01PRF9HRU5FUklDLCAiVzk5Nls4N11DRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIiB9LAotCXsgVzk5NjhDRl9NT0RfQ0xWQldHUCwgIkNyZWF0aXZlIExhYnMgVmlkZW8gQmxhc3RlciBXZWJDYW0gR28gUGx1cyIgfSwKLQotCS8qIE90aGVyIGNhbWVyYXMgKGhhdmluZyB0aGUgc2FtZSBkZXNjcmlwdG9ycyBhcyBHZW5lcmljIFc5OTZbODddQ0YpICovCi0JeyBXOTk2OENGX01PRF9BRFBWRE1BLCAiQXJvbWEgRGlnaSBQZW4gVkdBIER1YWwgTW9kZSBBREctNTAwMCIgfSwKLQl7IFc5OTg2Q0ZfTU9EX0FBVSwgIkFWZXJNZWRpYSBBVmVyVFYgVVNCIiB9LAotCXsgVzk5NjhDRl9NT0RfQ0xWQldHLCAiQ3JlYXRpdmUgTGFicyBWaWRlbyBCbGFzdGVyIFdlYkNhbSBHbyIgfSwKLQl7IFc5OTY4Q0ZfTU9EX0xMLCAiTGVib24gTERDLTAzNUEiIH0sCi0JeyBXOTk2OENGX01PRF9FRUVNQywgIkV6b25pY3MgRVotODAyIEVaTWVnYSBDYW0iIH0sCi0JeyBXOTk2OENGX01PRF9PT0UsICJPbW5pVmlzaW9uIE9WODYxMC1FREUiIH0sCi0JeyBXOTk2OENGX01PRF9PRFBWRE1QQywgIk9QQ09NIERpZ2kgUGVuIFZHQSBEdWFsIE1vZGUgUGVuIENhbWVyYSIgfSwKLQl7IFc5OTY4Q0ZfTU9EX1BEUElJLCAiUHJldGVjIERpZ2kgUGVuLUlJIiB9LAotCXsgVzk5NjhDRl9NT0RfUERQNDgwLCAiUHJldGVjIERpZ2lQZW4tNDgwIiB9LAotCi0JeyAgLTEsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3Qgc2VubGlzdFtdID0gewotCXsgQ0NfT1Y3NkJFLCAgICJPVjc2QkUiIH0sCi0JeyBDQ19PVjc2MTAsICAgIk9WNzYxMCIgfSwKLQl7IENDX09WNzYyMCwgICAiT1Y3NjIwIiB9LAotCXsgQ0NfT1Y3NjIwQUUsICJPVjc2MjBBRSIgfSwKLQl7IENDX09WNjYyMCwgICAiT1Y2NjIwIiB9LAotCXsgQ0NfT1Y2NjMwLCAgICJPVjY2MzAiIH0sCi0JeyBDQ19PVjY2MzBBRSwgIk9WNjYzMEFFIiB9LAotCXsgQ0NfT1Y2NjMwQUYsICJPVjY2MzBBRiIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLS8qIFZpZGVvNExpbnV4MSBwYWxldHRlcyAqLwotc3RhdGljIHN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3QgdjRsMV9wbGlzdFtdID0gewotCXsgVklERU9fUEFMRVRURV9HUkVZLCAgICAiR1JFWSIgfSwKLQl7IFZJREVPX1BBTEVUVEVfSEkyNDAsICAgIkhJMjQwIiB9LAotCXsgVklERU9fUEFMRVRURV9SR0I1NjUsICAiUkdCNTY1IiB9LAotCXsgVklERU9fUEFMRVRURV9SR0IyNCwgICAiUkdCMjQiIH0sCi0JeyBWSURFT19QQUxFVFRFX1JHQjMyLCAgICJSR0IzMiIgfSwKLQl7IFZJREVPX1BBTEVUVEVfUkdCNTU1LCAgIlJHQjU1NSIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDIyLCAgIllVVjQyMiIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVZViwgICAgIllVWVYiIH0sCi0JeyBWSURFT19QQUxFVFRFX1VZVlksICAgICJVWVZZIiB9LAotCXsgVklERU9fUEFMRVRURV9ZVVY0MjAsICAiWVVWNDIwIiB9LAotCXsgVklERU9fUEFMRVRURV9ZVVY0MTEsICAiWVVWNDExIiB9LAotCXsgVklERU9fUEFMRVRURV9SQVcsICAgICAiUkFXIiB9LAotCXsgVklERU9fUEFMRVRURV9ZVVY0MjJQLCAiWVVWNDIyUCIgfSwKLQl7IFZJREVPX1BBTEVUVEVfWVVWNDExUCwgIllVVjQxMVAiIH0sCi0JeyBWSURFT19QQUxFVFRFX1lVVjQyMFAsICJZVVY0MjBQIiB9LAotCXsgVklERU9fUEFMRVRURV9ZVVY0MTBQLCAiWVVWNDEwUCIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLS8qIERlY29kZXIgZXJyb3IgY29kZXM6ICovCi1zdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCBkZWNvZGVyX2Vycmxpc3RbXSA9IHsKLQl7IFc5OTY4Q0ZfREVDX0VSUl9DT1JSVVBURURfREFUQSwgIkNvcnJ1cHRlZCBkYXRhIiB9LAotCXsgVzk5NjhDRl9ERUNfRVJSX0JVRl9PVkVSRkxPVywgICAiQnVmZmVyIG92ZXJmbG93IiB9LAotCXsgVzk5NjhDRl9ERUNfRVJSX05PX1NPSSwgICAgICAgICAiU09JIG1hcmtlciBub3QgZm91bmQiIH0sCi0JeyBXOTk2OENGX0RFQ19FUlJfTk9fU09GMCwgICAgICAgICJTT0YwIG1hcmtlciBub3QgZm91bmQiIH0sCi0JeyBXOTk2OENGX0RFQ19FUlJfTk9fU09TLCAgICAgICAgICJTT1MgbWFya2VyIG5vdCBmb3VuZCIgfSwKLQl7IFc5OTY4Q0ZfREVDX0VSUl9OT19FT0ksICAgICAgICAgIkVPSSBtYXJrZXIgbm90IGZvdW5kIiB9LAotCXsgLTEsIE5VTEwgfQotfTsKLQotLyogVVJCIGVycm9yIGNvZGVzOiAqLwotc3RhdGljIHN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3QgdXJiX2Vycmxpc3RbXSA9IHsKLQl7IC1FTk9NRU0sICAgICJObyBtZW1vcnkgZm9yIGFsbG9jYXRpb24gb2YgaW50ZXJuYWwgc3RydWN0dXJlcyIgfSwKLQl7IC1FTk9TUEMsICAgICJUaGUgaG9zdCBjb250cm9sbGVyJ3MgYmFuZHdpZHRoIGlzIGFscmVhZHkgY29uc3VtZWQiIH0sCi0JeyAtRU5PRU5ULCAgICAiVVJCIHdhcyBjYW5jZWxlZCBieSB1bmxpbmtfdXJiIiB9LAotCXsgLUVYREVWLCAgICAgIklTTyB0cmFuc2ZlciBvbmx5IHBhcnRpYWxseSBjb21wbGV0ZWQiIH0sCi0JeyAtRUFHQUlOLCAgICAiVG9vIG1hdGNoIHNjaGVkdWxlZCBmb3IgdGhlIGZ1dHVyZSIgfSwKLQl7IC1FTlhJTywgICAgICJVUkIgYWxyZWFkeSBxdWV1ZWQiIH0sCi0JeyAtRUZCSUcsICAgICAiVG9vIG11Y2ggSVNPIGZyYW1lcyByZXF1ZXN0ZWQiIH0sCi0JeyAtRU5PU1IsICAgICAiQnVmZmVyIGVycm9yIChvdmVycnVuKSIgfSwKLQl7IC1FUElQRSwgICAgICJTcGVjaWZpZWQgZW5kcG9pbnQgaXMgc3RhbGxlZCAoZGV2aWNlIG5vdCByZXNwb25kaW5nKSJ9LAotCXsgLUVPVkVSRkxPVywgIkJhYmJsZSAodG9vIG11Y2ggZGF0YSkiIH0sCi0JeyAtRVBST1RPLCAgICAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSIgfSwKLQl7IC1FSUxTRVEsICAgICJDUkMvVGltZW91dCIgfSwKLQl7IC1FVElNRSwgICAgICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCB0byB0b2tlbiIgfSwKLQl7IC1FVElNRURPVVQsICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCB0byBjb21tYW5kIiB9LAotCXsgLTEsIE5VTEwgfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkKiBydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCogbWVtOwotCXVuc2lnbmVkIGxvbmcgYWRyOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0JbWVtID0gdm1hbGxvY18zMihzaXplKTsKLQlpZiAoIW1lbSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KLQlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOwotCXdoaWxlIChzaXplID4gMCkgewotCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JCWFkciArPSBQQUdFX1NJWkU7Ci0JCXNpemUgLT0gUEFHRV9TSVpFOwotCX0KLQotCXJldHVybiBtZW07Ci19Ci0KLQotc3RhdGljIHZvaWQgcnZmcmVlKHZvaWQqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgYWRyOwotCi0JaWYgKCFtZW0pCi0JCXJldHVybjsKLQotCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07Ci0Jd2hpbGUgKChsb25nKSBzaXplID4gMCkgewotCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKLQkJYWRyICs9IFBBR0VfU0laRTsKLQkJc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JfQotCXZmcmVlKG1lbSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBEZWFsbG9jYXRlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgdzk5NjhjZl9kZWFsbG9jYXRlX21lbW9yeShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKLXsKLQl1OCBpOwotCi0JLyogRnJlZSB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykgewotCQlrZnJlZShjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSk7Ci0JCWNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldID0gTlVMTDsKLQl9Ci0KLQkvKiBGcmVlIHRlbXBvcmFyeSBmcmFtZSBidWZmZXIgKi8KLQlpZiAoY2FtLT5mcmFtZV90bXAuYnVmZmVyKSB7Ci0JCXJ2ZnJlZShjYW0tPmZyYW1lX3RtcC5idWZmZXIsIGNhbS0+ZnJhbWVfdG1wLnNpemUpOwotCQljYW0tPmZyYW1lX3RtcC5idWZmZXIgPSBOVUxMOwotCX0KLQotCS8qIEZyZWUgaGVscGVyIGJ1ZmZlciAqLwotCWlmIChjYW0tPmZyYW1lX3ZwcC5idWZmZXIpIHsKLQkJcnZmcmVlKGNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciwgY2FtLT5mcmFtZV92cHAuc2l6ZSk7Ci0JCWNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciA9IE5VTEw7Ci0JfQotCi0JLyogRnJlZSB2aWRlbyBmcmFtZSBidWZmZXJzICovCi0JaWYgKGNhbS0+ZnJhbWVbMF0uYnVmZmVyKSB7Ci0JCXJ2ZnJlZShjYW0tPmZyYW1lWzBdLmJ1ZmZlciwgY2FtLT5uYnVmZmVycypjYW0tPmZyYW1lWzBdLnNpemUpOwotCQljYW0tPmZyYW1lWzBdLmJ1ZmZlciA9IE5VTEw7Ci0JfQotCi0JY2FtLT5uYnVmZmVycyA9IDA7Ci0KLQlEQkcoNSwgIk1lbW9yeSBzdWNjZXNzZnVsbHkgZGVhbGxvY2F0ZWQiKQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgQWxsb2NhdGUgbWVtb3J5IGJ1ZmZlcnMgZm9yIFVTQiB0cmFuc2ZlcnMgYW5kIHZpZGVvIGZyYW1lcy4KLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgb3BlbigpIG9ubHkuCi0gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB3OTk2OGNmX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKLXsKLQljb25zdCB1MTYgcF9zaXplID0gd01heFBhY2tldFNpemVbY2FtLT5hbHRzZXR0aW5nLTFdOwotCXZvaWQqIGJ1ZmYgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgaHdfYnVmc2l6ZSwgdnBwX2J1ZnNpemU7Ci0JdTggaSwgYnBwOwotCi0JLyogTk9URTogRGVhbGxvY2F0aW9uIGlzIGRvbmUgZWxzZXdoZXJlIGluIGNhc2Ugb2YgZXJyb3IgKi8KLQotCS8qIENhbGN1bGF0ZSB0aGUgbWF4IGFtb3VudCBvZiByYXcgZGF0YSBwZXIgZnJhbWUgZnJvbSB0aGUgZGV2aWNlICovCi0JaHdfYnVmc2l6ZSA9IGNhbS0+bWF4d2lkdGgqY2FtLT5tYXhoZWlnaHQqMjsKLQotCS8qIENhbGN1bGF0ZSB0aGUgbWF4IGJ1Zi4gc2l6ZSBuZWVkZWQgZm9yIHBvc3QtcHJvY2Vzc2luZyByb3V0aW5lcyAqLwotCWJwcCA9ICh3OTk2OGNmX3ZwcCkgPyA0IDogMjsKLQlpZiAoY2FtLT51cHNjYWxpbmcpCi0JCXZwcF9idWZzaXplID0gbWF4KFc5OTY4Q0ZfTUFYX1dJRFRIKlc5OTY4Q0ZfTUFYX0hFSUdIVCpicHAsCi0JCQkJICBjYW0tPm1heHdpZHRoKmNhbS0+bWF4aGVpZ2h0KmJwcCk7Ci0JZWxzZQotCQl2cHBfYnVmc2l6ZSA9IGNhbS0+bWF4d2lkdGgqY2FtLT5tYXhoZWlnaHQqYnBwOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykgewotCQlpZiAoIShjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSA9Ci0JCSAgICAgIGt6YWxsb2MoVzk5NjhDRl9JU09fUEFDS0VUUypwX3NpemUsIEdGUF9LRVJORUwpKSkgewotCQkJREJHKDEsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpc29jaHJvbm91cyAiCi0JCQkgICAgICAgInRyYW5zZmVyIGJ1ZmZlcnMgKCV1IGJ5dGVzKSIsCi0JCQkgICAgcF9zaXplICogVzk5NjhDRl9JU09fUEFDS0VUUykKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdGVtcG9yYXJ5IGZyYW1lIGJ1ZmZlciAqLwotCWlmICghKGNhbS0+ZnJhbWVfdG1wLmJ1ZmZlciA9IHJ2bWFsbG9jKGh3X2J1ZnNpemUpKSkgewotCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRlbXBvcmFyeSAiCi0JCSAgICAgICAidmlkZW8gZnJhbWUgYnVmZmVyICglbHUgYnl0ZXMpIiwgaHdfYnVmc2l6ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWNhbS0+ZnJhbWVfdG1wLnNpemUgPSBod19idWZzaXplOwotCWNhbS0+ZnJhbWVfdG1wLm51bWJlciA9IC0xOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaGVscGVyIGJ1ZmZlciAqLwotCWlmICh3OTk2OGNmX3ZwcCkgewotCQlpZiAoIShjYW0tPmZyYW1lX3ZwcC5idWZmZXIgPSBydm1hbGxvYyh2cHBfYnVmc2l6ZSkpKSB7Ci0JCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGhlbHBlciBidWZmZXIiCi0JCQkgICAgICAgIiAoJWx1IGJ5dGVzKSIsIHZwcF9idWZzaXplKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJY2FtLT5mcmFtZV92cHAuc2l6ZSA9IHZwcF9idWZzaXplOwotCX0gZWxzZQotCQljYW0tPmZyYW1lX3ZwcC5idWZmZXIgPSBOVUxMOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB2aWRlbyBmcmFtZSBidWZmZXJzICovCi0JY2FtLT5uYnVmZmVycyA9IGNhbS0+bWF4X2J1ZmZlcnM7Ci0Jd2hpbGUgKGNhbS0+bmJ1ZmZlcnMgPj0gMikgewotCQlpZiAoKGJ1ZmYgPSBydm1hbGxvYyhjYW0tPm5idWZmZXJzICogdnBwX2J1ZnNpemUpKSkKLQkJCWJyZWFrOwotCQllbHNlCi0JCQljYW0tPm5idWZmZXJzLS07Ci0JfQotCi0JaWYgKCFidWZmKSB7Ci0JCURCRygxLCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdmlkZW8gZnJhbWUgYnVmZmVycyIpCi0JCWNhbS0+bmJ1ZmZlcnMgPSAwOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAoY2FtLT5uYnVmZmVycyAhPSBjYW0tPm1heF9idWZmZXJzKQotCQlEQkcoMiwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXUgdmlkZW8gZnJhbWUgYnVmZmVycy4gIgotCQkgICAgICAgIk9ubHkgbWVtb3J5IGZvciAldSBidWZmZXJzIGhhcyBiZWVuIGFsbG9jYXRlZCIsCi0JCSAgICBjYW0tPm1heF9idWZmZXJzLCBjYW0tPm5idWZmZXJzKQotCi0JZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykgewotCQljYW0tPmZyYW1lW2ldLmJ1ZmZlciA9IGJ1ZmYgKyBpKnZwcF9idWZzaXplOwotCQljYW0tPmZyYW1lW2ldLnNpemUgPSB2cHBfYnVmc2l6ZTsKLQkJY2FtLT5mcmFtZVtpXS5udW1iZXIgPSBpOwotCQkvKiBDaXJjdWxhciBsaXN0ICovCi0JCWlmIChpICE9IGNhbS0+bmJ1ZmZlcnMtMSkKLQkJCWNhbS0+ZnJhbWVbaV0ubmV4dCA9ICZjYW0tPmZyYW1lW2krMV07Ci0JCWVsc2UKLQkJCWNhbS0+ZnJhbWVbaV0ubmV4dCA9ICZjYW0tPmZyYW1lWzBdOwotCQljYW0tPmZyYW1lW2ldLnN0YXR1cyA9IEZfVU5VU0VEOwotCX0KLQotCURCRyg1LCAiTWVtb3J5IHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQiKQotCXJldHVybiAwOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVTQi1zcGVjaWZpYyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBUaGlzIGlzIGFuIGhhbmRsZXIgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHRoZSBVUkJzIGFyZSBjb21wbGV0ZWQuCi0gIEl0IGNvbGxlY3RzIG11bHRpcGxlIGRhdGEgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgY2FtZXJhIGJ5IHB1dHRpbmcgdGhlbQotICBpbnRvIGZyYW1lIGJ1ZmZlcnM6IG9uZSBvciBtb3JlIHplcm8gZGF0YSBsZW5ndGggZGF0YSBwYWNrZXRzIGFyZSB1c2VkIHRvCi0gIG1hcmsgdGhlIGVuZCBvZiBhIHZpZGVvIGZyYW1lOyB0aGUgZmlyc3Qgbm9uLXplcm8gZGF0YSBwYWNrZXQgaXMgdGhlIHN0YXJ0Ci0gIG9mIHRoZSBuZXh0IHZpZGVvIGZyYW1lOyBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBpbiBhIHBhY2tldCwgdGhlIGVudGlyZQotICB2aWRlbyBmcmFtZSBpcyBkaXNjYXJkZWQgYW5kIGdyYWJiZWQgYWdhaW4uCi0gIElmIHRoZXJlIGFyZSBubyByZXF1ZXN0ZWQgZnJhbWVzIGluIHRoZSBGSUZPIGxpc3QsIHBhY2tldHMgYXJlIGNvbGxlY3RlZCBpbnRvCi0gIGEgdGVtcG9yYXJ5IGJ1ZmZlci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgdzk5NjhjZl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdXJiLT5jb250ZXh0OwotCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqKiBmOwotCXVuc2lnbmVkIGludCBsZW4sIHN0YXR1czsKLQl2b2lkKiBwb3M7Ci0JdTggaTsKLQlpbnQgZXJyID0gMDsKLQotCWlmICgoIWNhbS0+c3RyZWFtaW5nKSB8fCBjYW0tPmRpc2Nvbm5lY3RlZCkgewotCQlEQkcoNCwgIkdvdCBpbnRlcnJ1cHQsIGJ1dCBub3Qgc3RyZWFtaW5nIikKLQkJcmV0dXJuOwotCX0KLQotCS8qICIoKmYpIiB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAiY2FtLT5mcmFtZV9jdXJyZW50IiAqLwotCWYgPSAmY2FtLT5mcmFtZV9jdXJyZW50OwotCi0JLyogSWYgYSBmcmFtZSBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHdlIGFyZSBncmFiYmluZyBpbnRvCi0JICAgdGhlIHRlbXBvcmFyeSBmcmFtZSwgd2UnbGwgc3dpdGNoIHRvIHRoYXQgcmVxdWVzdGVkIGZyYW1lICovCi0JaWYgKCgqZikgPT0gJmNhbS0+ZnJhbWVfdG1wICYmICpjYW0tPnJlcXVlc3RlZF9mcmFtZSkgewotCQlpZiAoY2FtLT5mcmFtZV90bXAuc3RhdHVzID09IEZfR1JBQkJJTkcpIHsKLQkJCXc5OTY4Y2ZfcG9wX2ZyYW1lKGNhbSwgJmNhbS0+ZnJhbWVfY3VycmVudCk7Ci0JCQkoKmYpLT5zdGF0dXMgPSBGX0dSQUJCSU5HOwotCQkJKCpmKS0+bGVuZ3RoID0gY2FtLT5mcmFtZV90bXAubGVuZ3RoOwotCQkJbWVtY3B5KCgqZiktPmJ1ZmZlciwgY2FtLT5mcmFtZV90bXAuYnVmZmVyLAotCQkJICAgICAgICgqZiktPmxlbmd0aCk7Ci0JCQlEQkcoNiwgIlN3aXRjaGVkIGZyb20gdGVtcC4gZnJhbWUgdG8gZnJhbWUgIyVkIiwKLQkJCSAgICAoKmYpLT5udW1iZXIpCi0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7Ci0JCWxlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKLQkJc3RhdHVzID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7Ci0JCXBvcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ICsgdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0KLQkJaWYgKHN0YXR1cyAmJiBsZW4gIT0gMCkgewotCQkJREJHKDQsICJVUkIgZmFpbGVkLCBlcnJvciBpbiBkYXRhIHBhY2tldCAiCi0JCQkgICAgICAgIihlcnJvciAjJXUsICVzKSIsCi0JCQkgICAgc3RhdHVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgc3RhdHVzKSkKLQkJCSgqZiktPnN0YXR1cyA9IEZfRVJST1I7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChsZW4pIHsgLyogc3RhcnQgb2YgZnJhbWUgKi8KLQotCQkJaWYgKCgqZiktPnN0YXR1cyA9PSBGX1VOVVNFRCkgewotCQkJCSgqZiktPnN0YXR1cyA9IEZfR1JBQkJJTkc7Ci0JCQkJKCpmKS0+bGVuZ3RoID0gMDsKLQkJCX0KLQotCQkJLyogQnVmZmVyIG92ZXJmbG93cyBzaG91bGRuJ3QgaGFwcGVuLCBob3dldmVyLi4uKi8KLQkJCWlmICgoKmYpLT5sZW5ndGggKyBsZW4gPiAoKmYpLT5zaXplKSB7Ci0JCQkJREJHKDQsICJCdWZmZXIgb3ZlcmZsb3c6IGJhZCBkYXRhIHBhY2tldHMiKQotCQkJCSgqZiktPnN0YXR1cyA9IEZfRVJST1I7Ci0JCQl9Ci0KLQkJCWlmICgoKmYpLT5zdGF0dXMgPT0gRl9HUkFCQklORykgewotCQkJCW1lbWNweSgoKmYpLT5idWZmZXIgKyAoKmYpLT5sZW5ndGgsIHBvcywgbGVuKTsKLQkJCQkoKmYpLT5sZW5ndGggKz0gbGVuOwotCQkJfQotCi0JCX0gZWxzZSBpZiAoKCpmKS0+c3RhdHVzID09IEZfR1JBQkJJTkcpIHsgLyogZW5kIG9mIGZyYW1lICovCi0KLQkJCURCRyg2LCAiRnJhbWUgIyVkIHN1Y2Nlc3NmdWxseSBncmFiYmVkIiwgKCpmKS0+bnVtYmVyKQotCi0JCQlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSB7Ci0JCQkJZXJyID0gdzk5NjhjZl92cHAtPmNoZWNrX2hlYWRlcnMoKCpmKS0+YnVmZmVyLAotCQkJCQkJCQkgKCpmKS0+bGVuZ3RoKTsKLQkJCQlpZiAoZXJyKSB7Ci0JCQkJCURCRyg0LCAiU2tpcCBjb3JydXB0ZWQgZnJhbWU6ICVzIiwKLQkJCQkJICAgIHN5bWJvbGljKGRlY29kZXJfZXJybGlzdCwgZXJyKSkKLQkJCQkJKCpmKS0+c3RhdHVzID0gRl9VTlVTRUQ7Ci0JCQkJCWNvbnRpbnVlOyAvKiBncmFiIHRoaXMgZnJhbWUgYWdhaW4gKi8KLQkJCQl9Ci0JCQl9Ci0KLQkJCSgqZiktPnN0YXR1cyA9IEZfUkVBRFk7Ci0JCQkoKmYpLT5xdWV1ZWQgPSAwOwotCi0JCQkvKiBUYWtlIGEgcG9pbnRlciB0byB0aGUgbmV3IGZyYW1lIGZyb20gdGhlIEZJRk8gbGlzdC4KLQkJCSAgIElmIHRoZSBsaXN0IGlzIGVtcHR5LHdlJ2xsIHVzZSB0aGUgdGVtcG9yYXJ5IGZyYW1lKi8KLQkJCWlmICgqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUpCi0JCQkJdzk5NjhjZl9wb3BfZnJhbWUoY2FtLCAmY2FtLT5mcmFtZV9jdXJyZW50KTsKLQkJCWVsc2UgewotCQkJCWNhbS0+ZnJhbWVfY3VycmVudCA9ICZjYW0tPmZyYW1lX3RtcDsKLQkJCQkoKmYpLT5zdGF0dXMgPSBGX1VOVVNFRDsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKCgqZiktPnN0YXR1cyA9PSBGX0VSUk9SKQotCQkJKCpmKS0+c3RhdHVzID0gRl9VTlVTRUQ7IC8qIGdyYWIgaXQgYWdhaW4gKi8KLQotCQlQREJHRygiRnJhbWUgbGVuZ3RoICVsdSB8IHBhY2suIyV1IHwgcGFjay5sZW4uICV1IHwgc3RhdGUgJWQiLAotCQkgICAgICAodW5zaWduZWQgbG9uZykoKmYpLT5sZW5ndGgsIGksIGxlbiwgKCpmKS0+c3RhdHVzKQotCi0JfSAvKiBlbmQgZm9yICovCi0KLQkvKiBSZXN1Ym1pdCB0aGlzIFVSQiAqLwotCXVyYi0+ZGV2ID0gY2FtLT51c2JkZXY7Ci0JdXJiLT5zdGF0dXMgPSAwOwotCXNwaW5fbG9jaygmY2FtLT51cmJfbG9jayk7Ci0JaWYgKGNhbS0+c3RyZWFtaW5nKQotCQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpKSB7Ci0JCQljYW0tPm1pc2NvbmZpZ3VyZWQgPSAxOwotCQkJREJHKDEsICJDb3VsZG4ndCByZXN1Ym1pdCB0aGUgVVJCOiBlcnJvciAlZCwgJXMiLAotCQkJICAgIGVyciwgc3ltYm9saWModXJiX2Vycmxpc3QsIGVycikpCi0JCX0KLQlzcGluX3VubG9jaygmY2FtLT51cmJfbG9jayk7Ci0KLQkvKiBXYWtlIHVwIHRoZSB1c2VyIHByb2Nlc3MgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhbS0+d2FpdF9xdWV1ZSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgU2V0dXAgdGhlIFVSQiBzdHJ1Y3R1cmVzIGZvciB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIuCi0gIFN1Ym1pdCB0aGUgVVJCcyBzbyB0aGF0IHRoZSBkYXRhIHRyYW5zZmVyIGJlZ2lucy4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gY2FtLT51c2JkZXY7Ci0Jc3RydWN0IHVyYiogdXJiOwotCWNvbnN0IHUxNiBwX3NpemUgPSB3TWF4UGFja2V0U2l6ZVtjYW0tPmFsdHNldHRpbmctMV07Ci0JdTE2IHcsIGgsIGQ7Ci0JaW50IHZpZGNhcHQ7Ci0JdTMyIHRfc2l6ZTsKLQlpbnQgZXJyID0gMDsKLQlzOCBpLCBqOwotCi0JZm9yIChpID0gMDsgaSA8IFc5OTY4Q0ZfVVJCUzsgaSsrKSB7Ci0JCXVyYiA9IHVzYl9hbGxvY191cmIoVzk5NjhDRl9JU09fUEFDS0VUUywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCXVzYl9mcmVlX3VyYihjYW0tPnVyYltqXSk7Ci0JCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIHRoZSBVUkIgc3RydWN0dXJlcyIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWNhbS0+dXJiW2ldID0gdXJiOwotCQl1cmItPmRldiA9IHVkZXY7Ci0JCXVyYi0+Y29udGV4dCA9ICh2b2lkKiljYW07Ci0JCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZSh1ZGV2LCAxKTsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IFc5OTY4Q0ZfSVNPX1BBQ0tFVFM7Ci0JCXVyYi0+Y29tcGxldGUgPSB3OTk2OGNmX3VyYl9jb21wbGV0ZTsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXTsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gcF9zaXplKlc5OTY4Q0ZfSVNPX1BBQ0tFVFM7Ci0JCXVyYi0+aW50ZXJ2YWwgPSAxOwotCQlmb3IgKGogPSAwOyBqIDwgVzk5NjhDRl9JU09fUEFDS0VUUzsgaisrKSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IHBfc2l6ZSpqOwotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBwX3NpemU7Ci0JCX0KLQl9Ci0KLQkvKiBUcmFuc2ZlciBzaXplIHBlciBmcmFtZSwgaW4gV09SRCAhICovCi0JZCA9IGNhbS0+aHdfZGVwdGg7Ci0JdyA9IGNhbS0+aHdfd2lkdGg7Ci0JaCA9IGNhbS0+aHdfaGVpZ2h0OwotCi0JdF9zaXplID0gKHcqaCpkKS8xNjsKLQotCWVyciA9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhiZjE3LCAweDAwKTsgLyogcmVzZXQgZXZlcnl0aGluZyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4YmYxMCwgMHgwMCk7IC8qIG5vcm1hbCBvcGVyYXRpb24gKi8KLQotCS8qIFRyYW5zZmVyIHNpemUgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB0X3NpemUgJiAweGZmZmYsIDB4M2QpOyAvKiBsb3cgYml0cyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHRfc2l6ZSA+PiAxNiwgMHgzZSk7ICAgIC8qIGhpZ2ggYml0cyAqLwotCi0JaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikKLQkJZXJyICs9IHc5OTY4Y2ZfdXBsb2FkX3F1YW50aXphdGlvbnRhYmxlcyhjYW0pOwotCi0JdmlkY2FwdCA9IHc5OTY4Y2ZfcmVhZF9yZWcoY2FtLCAweDE2KTsgLyogcmVhZCBwaWN0dXJlIHNldHRpbmdzICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdmlkY2FwdHwweDgwMDAsIDB4MTYpOyAvKiBjYXB0LiBlbmFibGUgKi8KLQotCWVyciArPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCAwLCBjYW0tPmFsdHNldHRpbmcpOwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4OGEwNSwgMHgzYyk7IC8qIFVTQiBGSUZPIGVuYWJsZSAqLwotCi0JaWYgKGVyciB8fCAodmlkY2FwdCA8IDApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykKLQkJCXVzYl9mcmVlX3VyYihjYW0tPnVyYltpXSk7Ci0JCURCRygxLCAiQ291bGRuJ3QgdGVsbCB0aGUgY2FtZXJhIHRvIHN0YXJ0IHRoZSBkYXRhIHRyYW5zZmVyIikKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQl3OTk2OGNmX2luaXRfZnJhbWVsaXN0KGNhbSk7Ci0KLQkvKiBCZWdpbiB0byBncmFiIGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIgKi8KLQljYW0tPmZyYW1lX3RtcC5zdGF0dXMgPSBGX1VOVVNFRDsKLQljYW0tPmZyYW1lX3RtcC5xdWV1ZWQgPSAwOwotCWNhbS0+ZnJhbWVfY3VycmVudCA9ICZjYW0tPmZyYW1lX3RtcDsKLQotCWlmICghKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikpCi0JCURCRyg1LCAiSXNvY2hyb25vdXMgdHJhbnNmZXIgc2l6ZTogJWx1IGJ5dGVzL2ZyYW1lIiwKLQkJICAgICh1bnNpZ25lZCBsb25nKXRfc2l6ZSoyKQotCi0JREJHKDUsICJTdGFydGluZyB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIuLi4iKQotCi0JY2FtLT5zdHJlYW1pbmcgPSAxOwotCi0JLyogU3VibWl0IHRoZSBVUkJzICovCi0JZm9yIChpID0gMDsgaSA8IFc5OTY4Q0ZfVVJCUzsgaSsrKSB7Ci0JCWVyciA9IHVzYl9zdWJtaXRfdXJiKGNhbS0+dXJiW2ldLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVycikgewotCQkJY2FtLT5zdHJlYW1pbmcgPSAwOwotCQkJZm9yIChqID0gaS0xOyBqID49IDA7IGotLSkgewotCQkJCXVzYl9raWxsX3VyYihjYW0tPnVyYltqXSk7Ci0JCQkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2pdKTsKLQkJCX0KLQkJCURCRygxLCAiQ291bGRuJ3Qgc2VuZCBhIHRyYW5zZmVyIHJlcXVlc3QgdG8gdGhlICIKLQkJCSAgICAgICAiVVNCIGNvcmUgKGVycm9yICMlZCwgJXMpIiwgZXJyLAotCQkJICAgIHN5bWJvbGljKHVyYl9lcnJsaXN0LCBlcnIpKQotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgU3RvcCB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgYW5kIHNldCBhbHRlcm5hdGUgc2V0dGluZyB0byAwICgwTWIvcykuCi0gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB3OTk2OGNmX3N0b3BfdHJhbnNmZXIoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKLQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7Ci0JaW50IGVyciA9IDA7Ci0JczggaTsKLQotCWlmICghY2FtLT5zdHJlYW1pbmcpCi0JCXJldHVybiAwOwotCi0JLyogVGhpcyBhdm9pZHMgcmFjZSBjb25kaXRpb25zIHdpdGggdXNiX3N1Ym1pdF91cmIoKQotCSAgIGluIHRoZSBVUkIgY29tcGxldGl0aW9uIGhhbmRsZXIgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT51cmJfbG9jaywgbG9ja19mbGFncyk7Ci0JY2FtLT5zdHJlYW1pbmcgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+dXJiX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JZm9yIChpID0gVzk5NjhDRl9VUkJTLTE7IGkgPj0gMDsgaS0tKQotCQlpZiAoY2FtLT51cmJbaV0pIHsKLQkJCXVzYl9raWxsX3VyYihjYW0tPnVyYltpXSk7Ci0JCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbaV0pOwotCQkJY2FtLT51cmJbaV0gPSBOVUxMOwotCQl9Ci0KLQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCi0JCWdvdG8gZXhpdDsKLQotCWVyciA9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwYTA1LCAweDNjKTsgLyogc3RvcCBVU0IgdHJhbnNmZXIgKi8KLQllcnIgKz0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgMCwgMCk7IC8qIDAgTWIvcyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgzOSk7IC8qIGRpc2FibGUgSlBFRyBlbmNvZGVyICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDE2KTsgLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCi0KLQlpZiAoZXJyKSB7Ci0JCURCRygyLCAiRmFpbGVkIHRvIHRlbGwgdGhlIGNhbWVyYSB0byBzdG9wIHRoZSBpc29jaHJvbm91cyAiCi0JCSAgICAgICAidHJhbnNmZXIuIEhvd2V2ZXIgdGhpcyBpcyBub3QgYSBjcml0aWNhbCBlcnJvci4iKQotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLWV4aXQ6Ci0JREJHKDUsICJJc29jaHJvbm91cyB0cmFuc2ZlciBzdG9wcGVkIikKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFdyaXRlIGEgVzk5NjhDRiByZWdpc3Rlci4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfcmVnKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OwotCWludCByZXM7Ci0KLQlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAwLAotCQkJICAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFLAotCQkJICAgICAgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCBXOTk2OENGX1VTQl9DVFJMX1RJTUVPVVQpOwotCi0JaWYgKHJlcyA8IDApCi0JCURCRyg0LCAiRmFpbGVkIHRvIHdyaXRlIGEgcmVnaXN0ZXIgIgotCQkgICAgICAgIih2YWx1ZSAweCUwNFgsIGluZGV4IDB4JTAyWCwgZXJyb3IgIyVkLCAlcykiLAotCQkgICAgdmFsdWUsIGluZGV4LCByZXMsIHN5bWJvbGljKHVyYl9lcnJsaXN0LCByZXMpKQotCi0JcmV0dXJuIChyZXMgPj0gMCkgPyAwIDogLTE7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBSZWFkIGEgVzk5NjhDRiByZWdpc3Rlci4KLSAgUmV0dXJuIHRoZSByZWdpc3RlciB2YWx1ZSBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgdzk5NjhjZl9yZWFkX3JlZyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgdTE2IGluZGV4KQotewotCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7Ci0JdTE2KiBidWZmID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKLQlpbnQgcmVzOwotCi0JcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMSwKLQkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotCQkJICAgICAgMCwgaW5kZXgsIGJ1ZmYsIDIsIFc5OTY4Q0ZfVVNCX0NUUkxfVElNRU9VVCk7Ci0KLQlpZiAocmVzIDwgMCkKLQkJREJHKDQsICJGYWlsZWQgdG8gcmVhZCBhIHJlZ2lzdGVyICIKLQkJICAgICAgICIoaW5kZXggMHglMDJYLCBlcnJvciAjJWQsICVzKSIsCi0JCSAgICBpbmRleCwgcmVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmVzKSkKLQotCXJldHVybiAocmVzID49IDApID8gKGludCkoKmJ1ZmYpIDogLTE7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBXcml0ZSA2NC1iaXQgZGF0YSB0byB0aGUgZmFzdCBzZXJpYWwgYnVzIHJlZ2lzdGVycy4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfZnNiKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1MTYqIGRhdGEpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYgPSBjYW0tPnVzYmRldjsKLQl1MTYgdmFsdWU7Ci0JaW50IHJlczsKLQotCXZhbHVlID0gKmRhdGErKzsKLQotCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDAsCi0JCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgICB2YWx1ZSwgMHgwNiwgZGF0YSwgNiwgVzk5NjhDRl9VU0JfQ1RSTF9USU1FT1VUKTsKLQotCWlmIChyZXMgPCAwKQotCQlEQkcoNCwgIkZhaWxlZCB0byB3cml0ZSB0aGUgRlNCIHJlZ2lzdGVycyAiCi0JCSAgICAgICAiKGVycm9yICMlZCwgJXMpIiwgcmVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmVzKSkKLQotCXJldHVybiAocmVzID49IDApID8gMCA6IC0xOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgV3JpdGUgZGF0YSB0byB0aGUgc2VyaWFsIGJ1cyBjb250cm9sIHJlZ2lzdGVyLgotICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgdTE2IHZhbHVlKQotewotCWludCBlcnIgPSAwOwotCi0JZXJyID0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2YWx1ZSwgMHgwMSk7Ci0JdWRlbGF5KFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgUmVhZCBkYXRhIGZyb20gdGhlIHNlcmlhbCBidXMgY29udHJvbCByZWdpc3Rlci4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKLXsKLQlpbnQgdiA9IDA7Ci0KLQl2ID0gdzk5NjhjZl9yZWFkX3JlZyhjYW0sIDB4MDEpOwotCXVkZWxheShXOTk2OENGX0kyQ19CVVNfREVMQVkpOwotCi0JcmV0dXJuIHY7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBVcGxvYWQgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3IgdGhlIEpQRUcgY29tcHJlc3Npb24uCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoKS4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHc5OTY4Y2ZfdXBsb2FkX3F1YW50aXphdGlvbnRhYmxlcyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKLXsKLQl1MTYgYSwgYjsKLQlpbnQgZXJyID0gMCwgaSwgajsKLQotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAxMCwgMHgzOSk7IC8qIEpQRUcgY2xvY2sgZW5hYmxlICovCi0KLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDMyOyBpKyssIGogKz0gMikgewotCQlhID0gWV9RVUFOVEFCTEVbal0gfCAoKHVuc2lnbmVkKShZX1FVQU5UQUJMRVtqKzFdKSA8PCA4KTsKLQkJYiA9IFVWX1FVQU5UQUJMRVtqXSB8ICgodW5zaWduZWQpKFVWX1FVQU5UQUJMRVtqKzFdKSA8PCA4KTsKLQkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgYSwgMHg0MCtpKTsKLQkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgYiwgMHg2MCtpKTsKLQl9Ci0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDM5KTsgLyogSlBFRyBlbmNvZGVyIGVuYWJsZSAqLwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMb3ctbGV2ZWwgSTJDIEkvTyBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBJMkMgdHJhbnNmZXIgZnVuY3Rpb25zOiAgICAgICAgICAgICAgICoKLSAqIGkyY19hZGFwX2Zhc3R3cml0ZV9ieXRlX2RhdGEoKSAoYXQgNDAwIGtIeiBiaXQgZnJlcXVlbmN5IG9ubHkpICAgICAgICAgICAqCi0gKiBpMmNfYWRhcF9yZWFkX2J5dGVfZGF0YSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogaTJjX2FkYXBfcmVhZF9ieXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfc3RhcnQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCi17Ci0JaW50IGVyciA9IDA7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMCk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTAgKi8KLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3N0b3Aoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCi17Ci0JaW50IGVyciA9IDA7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMyk7IC8qIFNERT0xLCBTREE9MSwgU0NMPTEgKi8KLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHU4IHYpCi17Ci0JdTggYml0OwotCWludCBlcnIgPSAwLCBzZGE7Ci0KLQlmb3IgKGJpdCA9IDAgOyBiaXQgPCA4IDsgYml0KyspIHsKLQkJc2RhID0gKHYgJiAweDgwKSA/IDIgOiAwOwotCQl2IDw8PSAxOwotCQkvKiBTREU9MSwgU0RBPXNkYSwgU0NMPTAgKi8KLQkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDEwIHwgc2RhKTsKLQkJLyogU0RFPTEsIFNEQT1zZGEsIFNDTD0xICovCi0JCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgxMSB8IHNkYSk7Ci0JCS8qIFNERT0xLCBTREE9c2RhLCBTQ0w9MCAqLwotCQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MTAgfCBzZGEpOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgdTgqIHYpCi17Ci0JdTggYml0OwotCWludCBlcnIgPSAwOwotCi0JKnYgPSAwOwotCWZvciAoYml0ID0gMCA7IGJpdCA8IDggOyBiaXQrKykgewotCQkqdiA8PD0gMTsKLQkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOwotCQkqdiB8PSAodzk5NjhjZl9yZWFkX3NiKGNhbSkgJiAweDAwMDgpID8gMSA6IDA7Ci0JCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDEyKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0KLXN0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c193cml0ZV9hY2soc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCi17Ci0JaW50IGVyciA9IDA7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMCk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTAgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMCk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTAgKi8KLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwLCBzZGE7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMyk7IC8qIFNERT0xLCBTREE9MSwgU0NMPTEgKi8KLQlzZGEgPSAodzk5NjhjZl9yZWFkX3NiKGNhbSkgJiAweDA4KSA/IDEgOiAwOyAvKiBzZGEgPSBTREEgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMik7IC8qIFNERT0xLCBTREE9MSwgU0NMPTAgKi8KLQlpZiAoc2RhIDwgMCkKLQkJZXJyICs9IHNkYTsKLQlpZiAoc2RhID09IDEpIHsKLQkJREJHKDYsICJDb3VsZG4ndCByZWNlaXZlIHRoZSBBQ0siKQotCQllcnIgKz0gLTE7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotCi0vKiBUaGlzIHNlZW1zIHRvIHJlZnJlc2ggdGhlIGNvbW11bmljYXRpb24gdGhyb3VnaCB0aGUgc2VyaWFsIGJ1cyAqLwotc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlZnJlc2hfYnVzKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwLCBqOwotCi0JZm9yIChqID0gMTsgaiA8PSAxMDsgaisrKSB7Ci0JCWVyciA9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDIwLCAweDAxKTsKLQkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLQotLyogU01CdXMgcHJvdG9jb2w6IFMgQWRkciBXciBbQV0gU3ViYWRkciBbQV0gVmFsdWUgW0FdIFAgKi8KLXN0YXRpYyBpbnQKLXc5OTY4Y2ZfaTJjX2FkYXBfZmFzdHdyaXRlX2J5dGVfZGF0YShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwKLQkJCQkgICAgIHUxNiBhZGRyZXNzLCB1OCBzdWJhZGRyZXNzLHU4IHZhbHVlKQotewotCXUxNiogZGF0YSA9IGNhbS0+ZGF0YV9idWZmZXI7Ci0JaW50IGVyciA9IDA7Ci0KLQllcnIgKz0gdzk5NjhjZl9zbWJ1c19yZWZyZXNoX2J1cyhjYW0pOwotCi0JLyogRW5hYmxlIFNCVVMgb3V0cHV0cyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDIwKTsKLQotCWRhdGFbMF0gPSAweDA4MmYgfCAoKGFkZHJlc3MgJiAweDgwKSA/IDB4MTUwMCA6IDB4MCk7Ci0JZGF0YVswXSB8PSAoYWRkcmVzcyAmIDB4NDApID8gMHg0MDAwIDogMHgwOwotCWRhdGFbMV0gPSAweDIwODIgfCAoKGFkZHJlc3MgJiAweDQwKSA/IDB4MDAwNSA6IDB4MCk7Ci0JZGF0YVsxXSB8PSAoYWRkcmVzcyAmIDB4MjApID8gMHgwMTUwIDogMHgwOwotCWRhdGFbMV0gfD0gKGFkZHJlc3MgJiAweDEwKSA/IDB4NTQwMCA6IDB4MDsKLQlkYXRhWzJdID0gMHg4MjA4IHwgKChhZGRyZXNzICYgMHgwOCkgPyAweDAwMTUgOiAweDApOwotCWRhdGFbMl0gfD0gKGFkZHJlc3MgJiAweDA0KSA/IDB4MDU0MCA6IDB4MDsKLQlkYXRhWzJdIHw9IChhZGRyZXNzICYgMHgwMikgPyAweDUwMDAgOiAweDA7Ci0JZGF0YVszXSA9IDB4MWQyMCB8ICgoYWRkcmVzcyAmIDB4MDIpID8gMHgwMDAxIDogMHgwKTsKLQlkYXRhWzNdIHw9IChhZGRyZXNzICYgMHgwMSkgPyAweDAwNTQgOiAweDA7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9mc2IoY2FtLCBkYXRhKTsKLQotCWRhdGFbMF0gPSAweDgyMDggfCAoKHN1YmFkZHJlc3MgJiAweDgwKSA/IDB4MDAxNSA6IDB4MCk7Ci0JZGF0YVswXSB8PSAoc3ViYWRkcmVzcyAmIDB4NDApID8gMHgwNTQwIDogMHgwOwotCWRhdGFbMF0gfD0gKHN1YmFkZHJlc3MgJiAweDIwKSA/IDB4NTAwMCA6IDB4MDsKLQlkYXRhWzFdID0gMHgwODIwIHwgKChzdWJhZGRyZXNzICYgMHgyMCkgPyAweDAwMDEgOiAweDApOwotCWRhdGFbMV0gfD0gKHN1YmFkZHJlc3MgJiAweDEwKSA/IDB4MDA1NCA6IDB4MDsKLQlkYXRhWzFdIHw9IChzdWJhZGRyZXNzICYgMHgwOCkgPyAweDE1MDAgOiAweDA7Ci0JZGF0YVsxXSB8PSAoc3ViYWRkcmVzcyAmIDB4MDQpID8gMHg0MDAwIDogMHgwOwotCWRhdGFbMl0gPSAweDIwODIgfCAoKHN1YmFkZHJlc3MgJiAweDA0KSA/IDB4MDAwNSA6IDB4MCk7Ci0JZGF0YVsyXSB8PSAoc3ViYWRkcmVzcyAmIDB4MDIpID8gMHgwMTUwIDogMHgwOwotCWRhdGFbMl0gfD0gKHN1YmFkZHJlc3MgJiAweDAxKSA/IDB4NTQwMCA6IDB4MDsKLQlkYXRhWzNdID0gMHgwMDFkOwotCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfZnNiKGNhbSwgZGF0YSk7Ci0KLQlkYXRhWzBdID0gMHg4MjA4IHwgKCh2YWx1ZSAmIDB4ODApID8gMHgwMDE1IDogMHgwKTsKLQlkYXRhWzBdIHw9ICh2YWx1ZSAmIDB4NDApID8gMHgwNTQwIDogMHgwOwotCWRhdGFbMF0gfD0gKHZhbHVlICYgMHgyMCkgPyAweDUwMDAgOiAweDA7Ci0JZGF0YVsxXSA9IDB4MDgyMCB8ICgodmFsdWUgJiAweDIwKSA/IDB4MDAwMSA6IDB4MCk7Ci0JZGF0YVsxXSB8PSAodmFsdWUgJiAweDEwKSA/IDB4MDA1NCA6IDB4MDsKLQlkYXRhWzFdIHw9ICh2YWx1ZSAmIDB4MDgpID8gMHgxNTAwIDogMHgwOwotCWRhdGFbMV0gfD0gKHZhbHVlICYgMHgwNCkgPyAweDQwMDAgOiAweDA7Ci0JZGF0YVsyXSA9IDB4MjA4MiB8ICgodmFsdWUgJiAweDA0KSA/IDB4MDAwNSA6IDB4MCk7Ci0JZGF0YVsyXSB8PSAodmFsdWUgJiAweDAyKSA/IDB4MDE1MCA6IDB4MDsKLQlkYXRhWzJdIHw9ICh2YWx1ZSAmIDB4MDEpID8gMHg1NDAwIDogMHgwOwotCWRhdGFbM10gPSAweGZlMWQ7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9mc2IoY2FtLCBkYXRhKTsKLQotCS8qIERpc2FibGUgU0JVUyBvdXRwdXRzICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMDApOwotCi0JaWYgKCFlcnIpCi0JCURCRyg1LCAiSTJDIHdyaXRlIGJ5dGUgZGF0YSBkb25lLCBhZGRyLjB4JTA0WCwgc3ViYWRkci4weCUwMlggIgotCQkgICAgICAgInZhbHVlIDB4JTAyWCIsIGFkZHJlc3MsIHN1YmFkZHJlc3MsIHZhbHVlKQotCWVsc2UKLQkJREJHKDUsICJJMkMgd3JpdGUgYnl0ZSBkYXRhIGZhaWxlZCwgYWRkci4weCUwNFgsICIKLQkJICAgICAgICJzdWJhZGRyLjB4JTAyWCwgdmFsdWUgMHglMDJYIiwKLQkJICAgIGFkZHJlc3MsIHN1YmFkZHJlc3MsIHZhbHVlKQotCi0JcmV0dXJuIGVycjsKLX0KLQotCi0vKiBTTUJ1cyBwcm90b2NvbDogUyBBZGRyIFdyIFtBXSBTdWJhZGRyIFtBXSBQIFMgQWRkcisxIFJkIFtBXSBbVmFsdWVdIE5BIFAgKi8KLXN0YXRpYyBpbnQKLXc5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlX2RhdGEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sCi0JCQkJdTE2IGFkZHJlc3MsIHU4IHN1YmFkZHJlc3MsCi0JCQkJdTgqIHZhbHVlKQotewotCWludCBlcnIgPSAwOwotCi0JLyogU2VyaWFsIGRhdGEgZW5hYmxlICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOyAvKiBkb24ndCBjaGFuZ2UgISAqLwotCi0JZXJyICs9IHc5OTY4Y2Zfc21idXNfc3RhcnQoY2FtKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgYWRkcmVzcyk7Ci0JZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soY2FtKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgc3ViYWRkcmVzcyk7Ci0JZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soY2FtKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c19zdG9wKGNhbSk7Ci0JZXJyICs9IHc5OTY4Y2Zfc21idXNfc3RhcnQoY2FtKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgYWRkcmVzcyArIDEpOwotCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKGNhbSk7Ci0JZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9ieXRlKGNhbSwgdmFsdWUpOwotCWVyciArPSB3OTk2OGNmX3NtYnVzX3dyaXRlX2FjayhjYW0pOwotCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0b3AoY2FtKTsKLQotCS8qIFNlcmlhbCBkYXRhIGRpc2FibGUgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAwMCk7Ci0KLQlpZiAoIWVycikKLQkJREJHKDUsICJJMkMgcmVhZCBieXRlIGRhdGEgZG9uZSwgYWRkci4weCUwNFgsICIKLQkJICAgICAgICJzdWJhZGRyLjB4JTAyWCwgdmFsdWUgMHglMDJYIiwKLQkJICAgIGFkZHJlc3MsIHN1YmFkZHJlc3MsICp2YWx1ZSkKLQllbHNlCi0JCURCRyg1LCAiSTJDIHJlYWQgYnl0ZSBkYXRhIGZhaWxlZCwgYWRkci4weCUwNFgsICIKLQkJICAgICAgICJzdWJhZGRyLjB4JTAyWCwgd3JvbmcgdmFsdWUgMHglMDJYIiwKLQkJICAgIGFkZHJlc3MsIHN1YmFkZHJlc3MsICp2YWx1ZSkKLQotCXJldHVybiBlcnI7Ci19Ci0KLQotLyogU01CdXMgcHJvdG9jb2w6IFMgQWRkcisxIFJkIFtBXSBbVmFsdWVdIE5BIFAgKi8KLXN0YXRpYyBpbnQKLXc5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLAotCQkJICAgdTE2IGFkZHJlc3MsIHU4KiB2YWx1ZSkKLXsKLQlpbnQgZXJyID0gMDsKLQotCS8qIFNlcmlhbCBkYXRhIGVuYWJsZSAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDEzKTsKLQotCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0YXJ0KGNhbSk7Ci0JZXJyICs9IHc5OTY4Y2Zfc21idXNfd3JpdGVfYnl0ZShjYW0sIGFkZHJlc3MgKyAxKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c19yZWFkX2FjayhjYW0pOwotCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShjYW0sIHZhbHVlKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9hY2soY2FtKTsKLQllcnIgKz0gdzk5NjhjZl9zbWJ1c19zdG9wKGNhbSk7Ci0KLQkvKiBTZXJpYWwgZGF0YSBkaXNhYmxlICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMDApOwotCi0JaWYgKCFlcnIpCi0JCURCRyg1LCAiSTJDIHJlYWQgYnl0ZSBkb25lLCBhZGRyLjB4JTA0WCwgIgotCQkgICAgICAgInZhbHVlIDB4JTAyWCIsIGFkZHJlc3MsICp2YWx1ZSkKLQllbHNlCi0JCURCRyg1LCAiSTJDIHJlYWQgYnl0ZSBmYWlsZWQsIGFkZHIuMHglMDRYLCAiCi0JCSAgICAgICAid3JvbmcgdmFsdWUgMHglMDJYIiwgYWRkcmVzcywgKnZhbHVlKQotCi0JcmV0dXJuIGVycjsKLX0KLQotCi0vKiBTTUJ1cyBwcm90b2NvbDogUyBBZGRyIFdyIFtBXSBWYWx1ZSBbQV0gUCAqLwotc3RhdGljIGludAotdzk5NjhjZl9pMmNfYWRhcF93cml0ZV9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLAotCQkJICAgIHUxNiBhZGRyZXNzLCB1OCB2YWx1ZSkKLXsKLQlEQkcoNCwgImkyY193cml0ZV9ieXRlKCkgaXMgYW4gdW5zdXBwb3J0ZWQgdHJhbnNmZXIgbW9kZSIpCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSTJDIGludGVyZmFjZSB0byBrZXJuZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci13OTk2OGNmX2kyY19zbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHIsCi0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLAotCQkgICAgICAgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQotewotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOwotCXN0cnVjdCB3OTk2OGNmX2RldmljZSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKLQl1OCBpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKHNpemUgPT0gSTJDX1NNQlVTX0JZVEUpIHsKLQkJLyogV2h5IGFkZHIgPDw9IDE/IFNlZSBPVlhYWDBfU0lEIGRlZmluZXMgaW4gb3ZjYW1jaGlwLmggKi8KLQkJYWRkciA8PD0gMTsKLQotCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCi0JCQllcnIgPSB3OTk2OGNmX2kyY19hZGFwX3dyaXRlX2J5dGUoY2FtLCBhZGRyLCBjb21tYW5kKTsKLQkJZWxzZSBpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKLQkJCWZvciAoaSA9IDE7IGkgPD0gVzk5NjhDRl9JMkNfUldfUkVUUklFUzsgaSsrKSB7Ci0JCQkJZXJyID0gdzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGUoY2FtLCBhZGRyLAotCQkJCQkJCSAmZGF0YS0+Ynl0ZSk7Ci0JCQkJaWYgKGVycikgewotCQkJCQlpZiAodzk5NjhjZl9zbWJ1c19yZWZyZXNoX2J1cyhjYW0pKSB7Ci0JCQkJCQllcnIgPSAtRUlPOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JfSBlbHNlIGlmIChzaXplID09IEkyQ19TTUJVU19CWVRFX0RBVEEpIHsKLQkJYWRkciA8PD0gMTsKLQotCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCi0JCQllcnIgPSB3OTk2OGNmX2kyY19hZGFwX2Zhc3R3cml0ZV9ieXRlX2RhdGEoY2FtLCBhZGRyLAotCQkJCQkJCSAgY29tbWFuZCwgZGF0YS0+Ynl0ZSk7Ci0JCWVsc2UgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKLQkJCWZvciAoaSA9IDE7IGkgPD0gVzk5NjhDRl9JMkNfUldfUkVUUklFUzsgaSsrKSB7Ci0JCQkJZXJyID0gdzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGVfZGF0YShjYW0sYWRkciwKLQkJCQkJCQkgY29tbWFuZCwgJmRhdGEtPmJ5dGUpOwotCQkJCWlmIChlcnIpIHsKLQkJCQkJaWYgKHc5OTY4Y2Zfc21idXNfcmVmcmVzaF9idXMoY2FtKSkgewotCQkJCQkJZXJyID0gLUVJTzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl9IGVsc2UgewotCQlEQkcoNCwgIlVuc3VwcG9ydGVkIEkyQyB0cmFuc2ZlciBtb2RlICglZCkiLCBzaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgdTMyIHc5OTY4Y2ZfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyKiBhZGFwKQotewotCXJldHVybiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSAgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEE7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX2kyY19pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwOwotCi0Jc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsZ28gPSB7Ci0JCS5zbWJ1c194ZmVyID0gICAgdzk5NjhjZl9pMmNfc21idXNfeGZlciwKLQkJLmZ1bmN0aW9uYWxpdHkgPSB3OTk2OGNmX2kyY19mdW5jLAotCX07Ci0KLQlzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGFkYXAgPSB7Ci0JCS5vd25lciA9ICAgICAgICAgICAgIFRISVNfTU9EVUxFLAotCQkuYWxnbyA9ICAgICAgICAgICAgICAmYWxnbywKLQl9OwotCi0JbWVtY3B5KCZjYW0tPmkyY19hZGFwdGVyLCAmYWRhcCwgc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlcikpOwotCXN0cmNweShjYW0tPmkyY19hZGFwdGVyLm5hbWUsICJ3OTk2OGNmIik7Ci0JY2FtLT5pMmNfYWRhcHRlci5kZXYucGFyZW50ID0gJmNhbS0+dXNiZGV2LT5kZXY7Ci0JaTJjX3NldF9hZGFwZGF0YSgmY2FtLT5pMmNfYWRhcHRlciwgJmNhbS0+djRsMl9kZXYpOwotCi0JREJHKDYsICJSZWdpc3RlcmluZyBJMkMgYWRhcHRlciB3aXRoIGtlcm5lbC4uLiIpCi0KLQllcnIgPSBpMmNfYWRkX2FkYXB0ZXIoJmNhbS0+aTJjX2FkYXB0ZXIpOwotCWlmIChlcnIpCi0JCURCRygxLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSBJMkMgYWRhcHRlciIpCi0JZWxzZQotCQlEQkcoNSwgIkkyQyBhZGFwdGVyIHJlZ2lzdGVyZWQiKQotCi0JcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBIZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgVHVybiBvbiB0aGUgTEVEIG9uIHNvbWUgd2ViY2Ftcy4gQSBiZWVwIHNob3VsZCBiZSBoZWFyZCB0b28uCi0gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB3OTk2OGNmX3R1cm5fb25fbGVkKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwOwotCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhmZjAwLCAweDAwKTsgLyogcG93ZXItZG93biAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4YmYxNywgMHgwMCk7IC8qIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGJmMTAsIDB4MDApOyAvKiBub3JtYWwgb3BlcmF0aW9uICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDEwLCAweDAxKTsgLyogc2VyaWFsIGJ1cywgU0RTIGhpZ2ggKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMDAsIDB4MDEpOyAvKiBzZXJpYWwgYnVzLCBTRFMgbG93ICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDEwLCAweDAxKTsgLyogLi5oaWdoICdiZWVwLWJlZXAnICovCi0KLQlpZiAoZXJyKQotCQlEQkcoMiwgIkNvdWxkbid0IHR1cm4gb24gdGhlIExFRCIpCi0KLQlEQkcoNSwgIkxFRCB0dXJuZWQgb24iKQotCi0JcmV0dXJuIGVycjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFdyaXRlIHNvbWUgcmVnaXN0ZXJzIGZvciB0aGUgZGV2aWNlIGluaXRpYWxpemF0aW9uLgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIG9uIG9wZW4oKS4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHc5OTY4Y2ZfaW5pdF9jaGlwKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCXVuc2lnbmVkIGxvbmcgaHdfYnVmc2l6ZSA9IGNhbS0+bWF4d2lkdGgqY2FtLT5tYXhoZWlnaHQqMiwKLQkJICAgICAgeTAgPSAweDAwMDAsCi0JCSAgICAgIHUwID0geTAgKyBod19idWZzaXplLzIsCi0JCSAgICAgIHYwID0gdTAgKyBod19idWZzaXplLzQsCi0JCSAgICAgIHkxID0gdjAgKyBod19idWZzaXplLzQsCi0JCSAgICAgIHUxID0geTEgKyBod19idWZzaXplLzIsCi0JCSAgICAgIHYxID0gdTEgKyBod19idWZzaXplLzQ7Ci0JaW50IGVyciA9IDA7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGZmMDAsIDB4MDApOyAvKiBwb3dlciBvZmYgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGJmMTAsIDB4MDApOyAvKiBwb3dlciBvbiAqLwotCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHg0MDVkLCAweDAzKTsgLyogRFJBTSB0aW1pbmdzICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDMwLCAweDA0KTsgLyogU0RSQU0gdGltaW5ncyAqLwotCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTAgJiAweGZmZmYsIDB4MjApOyAvKiBZIGJ1Zi4wLCBsb3cgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MCA+PiAxNiwgMHgyMSk7ICAgIC8qIFkgYnVmLjAsIGhpZ2ggKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB1MCAmIDB4ZmZmZiwgMHgyNCk7IC8qIFUgYnVmLjAsIGxvdyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHUwID4+IDE2LCAweDI1KTsgICAgLyogVSBidWYuMCwgaGlnaCAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHYwICYgMHhmZmZmLCAweDI4KTsgLyogViBidWYuMCwgbG93ICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdjAgPj4gMTYsIDB4MjkpOyAgICAvKiBWIGJ1Zi4wLCBoaWdoICovCi0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MSAmIDB4ZmZmZiwgMHgyMik7IC8qIFkgYnVmLjEsIGxvdyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkxID4+IDE2LCAweDIzKTsgICAgLyogWSBidWYuMSwgaGlnaCAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHUxICYgMHhmZmZmLCAweDI2KTsgLyogVSBidWYuMSwgbG93ICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdTEgPj4gMTYsIDB4MjcpOyAgICAvKiBVIGJ1Zi4xLCBoaWdoICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdjEgJiAweGZmZmYsIDB4MmEpOyAvKiBWIGJ1Zi4xLCBsb3cgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2MSA+PiAxNiwgMHgyYik7ICAgIC8qIFYgYnVmLjEsIGhpZ2ggKi8KLQotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkxICYgMHhmZmZmLCAweDMyKTsgLyogSlBFRyBidWYgMCBsb3cgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MSA+PiAxNiwgMHgzMyk7ICAgIC8qIEpQRUcgYnVmIDAgaGlnaCAqLwotCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTEgJiAweGZmZmYsIDB4MzQpOyAvKiBKUEVHIGJ1ZiAxIGxvdyAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkxID4+IDE2LCAweDM1KTsgICAgLyogSlBFRyBidWcgMSBoaWdoICovCi0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMDAsIDB4MzYpOy8qIEpQRUcgcmVzdGFydCBpbnRlcnZhbCAqLwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDgwNCwgMHgzNyk7LypKUEVHIFZMRSBGSUZPIHRocmVzaG9sZCovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDM4KTsvKiBkaXNhYmxlIGh3IHVwLXNjYWxpbmcgKi8KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMDAsIDB4M2YpOyAvKiBKUEVHL01DVEwgdGVzdCBkYXRhICovCi0KLQllcnIgKz0gdzk5NjhjZl9zZXRfcGljdHVyZShjYW0sIGNhbS0+cGljdHVyZSk7IC8qIHRoaXMgYmVmb3JlICovCi0JZXJyICs9IHc5OTY4Y2Zfc2V0X3dpbmRvdyhjYW0sIGNhbS0+d2luZG93KTsKLQotCWlmIChlcnIpCi0JCURCRygxLCAiQ2hpcCBpbml0aWFsaXphdGlvbiBmYWlsZWQiKQotCWVsc2UKLQkJREJHKDUsICJDaGlwIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCIpCi0KLQlyZXR1cm4gZXJyOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwYWxldHRlIGlzIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgdTE2IHc5OTY4Y2ZfdmFsaWRfcGFsZXR0ZSh1MTYgcGFsZXR0ZSkKLXsKLQl1OCBpID0gMDsKLQl3aGlsZSAodzk5NjhjZl9mb3JtYXRsaXN0W2ldLnBhbGV0dGUgIT0gMCkgewotCQlpZiAocGFsZXR0ZSA9PSB3OTk2OGNmX2Zvcm1hdGxpc3RbaV0ucGFsZXR0ZSkKLQkJCXJldHVybiBwYWxldHRlOwotCQlpKys7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgUmV0dXJuIHRoZSBkZXB0aCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwYWxldHRlLgotICBQYWxldHRlIF9tdXN0XyBiZSBzdXBwb3J0ZWQgIQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIHUxNiB3OTk2OGNmX3ZhbGlkX2RlcHRoKHUxNiBwYWxldHRlKQotewotCXU4IGk9MDsKLQl3aGlsZSAodzk5NjhjZl9mb3JtYXRsaXN0W2ldLnBhbGV0dGUgIT0gcGFsZXR0ZSkKLQkJaSsrOwotCi0JcmV0dXJuIHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5kZXB0aDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFJldHVybiBub24temVybyBpZiB0aGUgZm9ybWF0IHJlcXVpcmVzIGRlY29tcHJlc3Npb24sIDAgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIHU4IHc5OTY4Y2ZfbmVlZF9kZWNvbXByZXNzaW9uKHUxNiBwYWxldHRlKQotewotCXU4IGkgPSAwOwotCXdoaWxlICh3OTk2OGNmX2Zvcm1hdGxpc3RbaV0ucGFsZXR0ZSAhPSAwKSB7Ci0JCWlmIChwYWxldHRlID09IHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5wYWxldHRlKQotCQkJcmV0dXJuIHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5jb21wcmVzc2lvbjsKLQkJaSsrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIENoYW5nZSB0aGUgcGljdHVyZSBzZXR0aW5ncyBvZiB0aGUgY2FtZXJhLgotICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQKLXc5OTY4Y2Zfc2V0X3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3QpCi17Ci0JdTE2IGZtdCwgaHdfZGVwdGgsIGh3X3BhbGV0dGUsIHJlZ192ID0gMHgwMDAwOwotCWludCBlcnIgPSAwOwotCi0JLyogTWFrZSBzdXJlIHdlIGFyZSB1c2luZyBhIHZhbGlkIGRlcHRoICovCi0JcGljdC5kZXB0aCA9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgocGljdC5wYWxldHRlKTsKLQotCWZtdCA9IHBpY3QucGFsZXR0ZTsKLQotCWh3X2RlcHRoID0gcGljdC5kZXB0aDsgLyogZGVwdGggdXNlZCBieSB0aGUgd2luYm9uZCBjaGlwICovCi0JaHdfcGFsZXR0ZSA9IHBpY3QucGFsZXR0ZTsgLyogcGFsZXR0ZSB1c2VkIGJ5IHRoZSB3aW5ib25kIGNoaXAgKi8KLQotCS8qIFZTICYgSFMgcG9sYXJpdGllcyAqLwotCXJlZ192ID0gKGNhbS0+dnNfcG9sYXJpdHkgPDwgMTIpIHwgKGNhbS0+aHNfcG9sYXJpdHkgPDwgMTEpOwotCi0Jc3dpdGNoIChmbXQpCi0JewotCQljYXNlIFZJREVPX1BBTEVUVEVfVVlWWToKLQkJCXJlZ192IHw9IDB4MDAwMDsKLQkJCWNhbS0+dnBwX2ZsYWcgPSBWUFBfTk9ORTsKLQkJCWJyZWFrOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIyUDoKLQkJCXJlZ192IHw9IDB4MDAwMjsKLQkJCWNhbS0+dnBwX2ZsYWcgPSBWUFBfREVDT01QUkVTU0lPTjsKLQkJCWJyZWFrOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwOgotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKLQkJCXJlZ192IHw9IDB4MDAwMzsKLQkJCWNhbS0+dnBwX2ZsYWcgPSBWUFBfREVDT01QUkVTU0lPTjsKLQkJCWJyZWFrOwotCQljYXNlIFZJREVPX1BBTEVUVEVfWVVZVjoKLQkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMjoKLQkJCXJlZ192IHw9IDB4MDAwMDsKLQkJCWNhbS0+dnBwX2ZsYWcgPSBWUFBfU1dBUF9ZVVZfQllURVM7Ci0JCQlod19wYWxldHRlID0gVklERU9fUEFMRVRURV9VWVZZOwotCQkJYnJlYWs7Ci0JCS8qIE9yaWdpbmFsIHZpZGVvIGlzIHVzZWQgaW5zdGVhZCBvZiBSR0JYIHBhbGV0dGVzLgotCQkgICBTb2Z0d2FyZSBjb252ZXJzaW9uIGxhdGVyLiAqLwotCQljYXNlIFZJREVPX1BBTEVUVEVfR1JFWToKLQkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU1NToKLQkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NToKLQkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjI0OgotCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6Ci0JCQlyZWdfdiB8PSAweDAwMDA7IC8qIFVZVlkgMTYgYml0IGlzIHVzZWQgKi8KLQkJCWh3X2RlcHRoID0gMTY7Ci0JCQlod19wYWxldHRlID0gVklERU9fUEFMRVRURV9VWVZZOwotCQkJY2FtLT52cHBfZmxhZyA9IFZQUF9VWVZZX1RPX1JHQlg7Ci0JCQlicmVhazsKLQl9Ci0KLQkvKiBOT1RFOiBkdWUgdG8gbWVtb3J5IGlzc3VlcywgaXQgaXMgYmV0dGVyIHRvIGRpc2FibGUgdGhlIGhhcmR3YXJlCi0JCSBkb3VibGUgYnVmZmVyaW5nIGR1cmluZyBjb21wcmVzc2lvbiAqLwotCWlmIChjYW0tPmRvdWJsZV9idWZmZXIgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pKQotCQlyZWdfdiB8PSAweDAwODA7Ci0KLQlpZiAoY2FtLT5jbGFtcGluZykKLQkJcmVnX3YgfD0gMHgwMDIwOwotCi0JaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMSkKLQkJcmVnX3YgfD0gMHgwMDA4OwotCWVsc2UgaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMikKLQkJcmVnX3YgfD0gMHgwMDBjOwotCi0JaWYgKChlcnIgPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHJlZ192LCAweDE2KSkpCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAoKGVyciA9IHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9waWN0dXJlKGNhbSwgcGljdCkpKQotCQlnb3RvIGVycm9yOwotCi0JLyogSWYgYWxsIHdlbnQgd2VsbCwgdXBkYXRlIHRoZSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgKi8KLQltZW1jcHkoJmNhbS0+cGljdHVyZSwgJnBpY3QsIHNpemVvZihwaWN0KSk7Ci0JY2FtLT5od19kZXB0aCA9IGh3X2RlcHRoOwotCWNhbS0+aHdfcGFsZXR0ZSA9IGh3X3BhbGV0dGU7Ci0KLQkvKiBTZXR0aW5ncyBjaGFuZ2VkLCBzbyB3ZSBjbGVhciB0aGUgZnJhbWUgYnVmZmVycyAqLwotCW1lbXNldChjYW0tPmZyYW1lWzBdLmJ1ZmZlciwgMCwgY2FtLT5uYnVmZmVycypjYW0tPmZyYW1lWzBdLnNpemUpOwotCi0JREJHKDQsICJQYWxldHRlIGlzICVzLCBkZXB0aCBpcyAldSBicHAiLAotCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpLCBwaWN0LmRlcHRoKQotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCURCRygxLCAiRmFpbGVkIHRvIGNoYW5nZSBwaWN0dXJlIHNldHRpbmdzIikKLQlyZXR1cm4gZXJyOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgQ2hhbmdlIHRoZSBjYXB0dXJlIGFyZWEgc2l6ZSBvZiB0aGUgY2FtZXJhLgotICBUaGlzIGZ1bmN0aW9uIF9tdXN0XyBiZSBjYWxsZWQgX2FmdGVyXyB3OTk2OGNmX3NldF9waWN0dXJlKCkuCi0gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotdzk5NjhjZl9zZXRfd2luZG93KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCBzdHJ1Y3QgdmlkZW9fd2luZG93IHdpbikKLXsKLQl1MTYgeCwgeSwgdywgaCwgc2N4LCBzY3ksIGN3LCBjaCwgYXgsIGF5OwotCXVuc2lnbmVkIGxvbmcgZncsIGZoOwotCXN0cnVjdCBvdmNhbWNoaXBfd2luZG93IHNfd2luOwotCWludCBlcnIgPSAwOwotCi0JLyogV29yayBhcm91bmQgdG8gYXZvaWQgRlAgYXJpdGhtZXRpY3MgKi8KLQkjZGVmaW5lIFNDKHgpICgoeCkgPDwgMTApCi0JI2RlZmluZSBVTlNDKHgpICgoeCkgPj4gMTApCi0KLQkvKiBNYWtlIHN1cmUgd2UgYXJlIHVzaW5nIGEgc3VwcG9ydGVkIHJlc29sdXRpb24gKi8KLQlpZiAoKGVyciA9IHc5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKGNhbSwgJndpbi53aWR0aCwgJndpbi5oZWlnaHQpKSkKLQkJZ290byBlcnJvcjsKLQotCS8qIFNjYWxpbmcgZmFjdG9ycyAqLwotCWZ3ID0gU0Mod2luLndpZHRoKSAvIGNhbS0+bWF4d2lkdGg7Ci0JZmggPSBTQyh3aW4uaGVpZ2h0KSAvIGNhbS0+bWF4aGVpZ2h0OwotCi0JLyogU2V0IHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB1c2VkIGJ5IHRoZSBjaGlwICovCi0JaWYgKCh3aW4ud2lkdGggPiBjYW0tPm1heHdpZHRoKSB8fCAod2luLmhlaWdodCA+IGNhbS0+bWF4aGVpZ2h0KSkgewotCQljYW0tPnZwcF9mbGFnIHw9IFZQUF9VUFNDQUxFOwotCQkvKiBDYWxjdWxhdGUgbGFyZ2VzdCB3LGggbWFudGFpbmluZyB0aGUgc2FtZSB3L2ggcmF0aW8gKi8KLQkJdyA9IChmdyA+PSBmaCkgPyBjYW0tPm1heHdpZHRoIDogU0Mod2luLndpZHRoKS9maDsKLQkJaCA9IChmdyA+PSBmaCkgPyBTQyh3aW4uaGVpZ2h0KS9mdyA6IGNhbS0+bWF4aGVpZ2h0OwotCQlpZiAodyA8IGNhbS0+bWlud2lkdGgpIC8qIGp1c3QgaW4gY2FzZSAqLwotCQkJdyA9IGNhbS0+bWlud2lkdGg7Ci0JCWlmIChoIDwgY2FtLT5taW5oZWlnaHQpIC8qIGp1c3QgaW4gY2FzZSAqLwotCQkJaCA9IGNhbS0+bWluaGVpZ2h0OwotCX0gZWxzZSB7Ci0JCWNhbS0+dnBwX2ZsYWcgJj0gflZQUF9VUFNDQUxFOwotCQl3ID0gd2luLndpZHRoOwotCQloID0gd2luLmhlaWdodDsKLQl9Ci0KLQkvKiB4LHkgb2Zmc2V0cyBvZiB0aGUgY3JvcHBlZCBhcmVhICovCi0Jc2N4ID0gY2FtLT5zdGFydF9jcm9weDsKLQlzY3kgPSBjYW0tPnN0YXJ0X2Nyb3B5OwotCi0JLyogQ2FsY3VsYXRlIGNyb3BwZWQgYXJlYSBtYW50ZWluaW5nIHRoZSByaWdodCB3L2ggcmF0aW8gKi8KLQlpZiAoY2FtLT5sYXJnZXZpZXcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX1VQU0NBTEUpKSB7Ci0JCWN3ID0gKGZ3ID49IGZoKSA/IGNhbS0+bWF4d2lkdGggOiBTQyh3aW4ud2lkdGgpL2ZoOwotCQljaCA9IChmdyA+PSBmaCkgPyBTQyh3aW4uaGVpZ2h0KS9mdyA6IGNhbS0+bWF4aGVpZ2h0OwotCX0gZWxzZSB7Ci0JCWN3ID0gdzsKLQkJY2ggPSBoOwotCX0KLQotCS8qIFNldHVwIHRoZSB3aW5kb3cgb2YgdGhlIHNlbnNvciAqLwotCXNfd2luLmZvcm1hdCA9IFZJREVPX1BBTEVUVEVfVVlWWTsKLQlzX3dpbi53aWR0aCA9IGNhbS0+bWF4d2lkdGg7Ci0Jc193aW4uaGVpZ2h0ID0gY2FtLT5tYXhoZWlnaHQ7Ci0Jc193aW4ucXVhcnRlciA9IDA7IC8qIGZ1bGwgcHJvZ3Jlc3NpdmUgdmlkZW8gKi8KLQotCS8qIENlbnRlciBpdCAqLwotCXNfd2luLnggPSAoc193aW4ud2lkdGggLSBjdykgLyAyOwotCXNfd2luLnkgPSAoc193aW4uaGVpZ2h0IC0gY2gpIC8gMjsKLQotCS8qIENsb2NrIGRpdmlzb3IgKi8KLQlpZiAoY2FtLT5jbG9ja2RpdiA+PSAwKQotCQlzX3dpbi5jbG9ja2RpdiA9IGNhbS0+Y2xvY2tkaXY7IC8qIG1hbnVhbCBvdmVycmlkZSAqLwotCWVsc2UKLQkJc3dpdGNoIChjYW0tPnNlbnNvcikgewotCQkJY2FzZSBDQ19PVjY2MjA6Ci0JCQkJc193aW4uY2xvY2tkaXYgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDQ19PVjY2MzA6Ci0JCQkJc193aW4uY2xvY2tkaXYgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDQ19PVjc2QkU6Ci0JCQljYXNlIENDX09WNzYxMDoKLQkJCWNhc2UgQ0NfT1Y3NjIwOgotCQkJCXNfd2luLmNsb2NrZGl2ID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc193aW4uY2xvY2tkaXYgPSBXOTk2OENGX0RFRl9DTE9DS0RJVklTT1I7Ci0JCX0KLQotCS8qIFdlIGhhdmUgdG8gc2NhbGUgd2luLnggYW5kIHdpbi55IG9mZnNldHMgKi8KLQlpZiAoIChjYW0tPmxhcmdldmlldyAmJiAhKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVBTQ0FMRSkpCi0JICAgICB8fCAoY2FtLT52cHBfZmxhZyAmIFZQUF9VUFNDQUxFKSApIHsKLQkJYXggPSBTQyh3aW4ueCkvZnc7Ci0JCWF5ID0gU0Mod2luLnkpL2ZoOwotCX0gZWxzZSB7Ci0JCWF4ID0gd2luLng7Ci0JCWF5ID0gd2luLnk7Ci0JfQotCi0JaWYgKChheCArIGN3KSA+IGNhbS0+bWF4d2lkdGgpCi0JCWF4ID0gY2FtLT5tYXh3aWR0aCAtIGN3OwotCi0JaWYgKChheSArIGNoKSA+IGNhbS0+bWF4aGVpZ2h0KQotCQlheSA9IGNhbS0+bWF4aGVpZ2h0IC0gY2g7Ci0KLQkvKiBBZGp1c3Qgd2luLngsIHdpbi55ICovCi0JaWYgKCAoY2FtLT5sYXJnZXZpZXcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX1VQU0NBTEUpKQotCSAgICAgfHwgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVBTQ0FMRSkgKSB7Ci0JCXdpbi54ID0gVU5TQyhheCpmdyk7Ci0JCXdpbi55ID0gVU5TQyhheSpmaCk7Ci0JfSBlbHNlIHsKLQkJd2luLnggPSBheDsKLQkJd2luLnkgPSBheTsKLQl9Ci0KLQkvKiBPZmZzZXRzIHVzZWQgYnkgdGhlIGNoaXAgKi8KLQl4ID0gYXggKyBzX3dpbi54OwotCXkgPSBheSArIHNfd2luLnk7Ci0KLQkvKiBHbyAhICovCi0JaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX1NfTU9ERSwgJnNfd2luKSkpCi0JCWdvdG8gZXJyb3I7Ci0KLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBzY3ggKyB4LCAweDEwKTsKLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBzY3kgKyB5LCAweDExKTsKLQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBzY3ggKyB4ICsgY3csIDB4MTIpOwotCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHNjeSArIHkgKyBjaCwgMHgxMyk7Ci0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdywgMHgxNCk7Ci0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgaCwgMHgxNSk7Ci0KLQkvKiBKUEVHIHdpZHRoICYgaGVpZ2h0ICovCi0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdywgMHgzMCk7Ci0JZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgaCwgMHgzMSk7Ci0KLQkvKiBZICYgVVYgZnJhbWUgYnVmZmVyIHN0cmlkZXMgKGluIFdPUkQpICovCi0JaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgewotCQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LzIsIDB4MmMpOwotCQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LzQsIDB4MmQpOwotCX0gZWxzZQotCQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LCAweDJjKTsKLQotCWlmIChlcnIpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBJZiBhbGwgd2VudCB3ZWxsLCB1cGRhdGUgdGhlIGRldmljZSBkYXRhIHN0cnVjdHVyZSAqLwotCW1lbWNweSgmY2FtLT53aW5kb3csICZ3aW4sIHNpemVvZih3aW4pKTsKLQljYW0tPmh3X3dpZHRoID0gdzsKLQljYW0tPmh3X2hlaWdodCA9IGg7Ci0KLQkvKiBTZXR0aW5ncyBjaGFuZ2VkLCBzbyB3ZSBjbGVhciB0aGUgZnJhbWUgYnVmZmVycyAqLwotCW1lbXNldChjYW0tPmZyYW1lWzBdLmJ1ZmZlciwgMCwgY2FtLT5uYnVmZmVycypjYW0tPmZyYW1lWzBdLnNpemUpOwotCi0JREJHKDQsICJUaGUgY2FwdHVyZSBhcmVhIGlzICVkeCVkLCBPZmZzZXQgKHgseSk9KCV1LCV1KSIsCi0JICAgIHdpbi53aWR0aCwgd2luLmhlaWdodCwgd2luLngsIHdpbi55KQotCi0JUERCR0coIng9JXUgLHk9JXUsIHc9JXUsIGg9JXUsIGF4PSV1LCBheT0ldSwgc193aW4ueD0ldSwgc193aW4ueT0ldSwgIgotCSAgICAgICJjdz0ldSwgY2g9JXUsIHdpbi54PSV1LCB3aW4ueT0ldSwgd2luLndpZHRoPSV1LCB3aW4uaGVpZ2h0PSV1IiwKLQkgICAgICB4LCB5LCB3LCBoLCBheCwgYXksIHNfd2luLngsIHNfd2luLnksIGN3LCBjaCwgd2luLngsIHdpbi55LAotCSAgICAgIHdpbi53aWR0aCwgd2luLmhlaWdodCkKLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQlEQkcoMSwgIkZhaWxlZCB0byBjaGFuZ2UgdGhlIGNhcHR1cmUgYXJlYSBzaXplIikKLQlyZXR1cm4gZXJyOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgQWRqdXN0IHRoZSBhc2tlZCB2YWx1ZXMgZm9yIHdpbmRvdyB3aWR0aCBhbmQgaGVpZ2h0LgotICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQKLXc5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKHN0cnVjdCB3OTk2OGNmX2RldmljZSAqY2FtLCB1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKLXsKLQl1bnNpZ25lZCBpbnQgbWF4dywgbWF4aCwgYWxpZ247Ci0KLQltYXh3ID0gY2FtLT51cHNjYWxpbmcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pICYmCi0JICAgICAgIHc5OTY4Y2ZfdnBwID8gbWF4KCh1MTYpVzk5NjhDRl9NQVhfV0lEVEgsIGNhbS0+bWF4d2lkdGgpCi0JCQkgICA6IGNhbS0+bWF4d2lkdGg7Ci0JbWF4aCA9IGNhbS0+dXBzY2FsaW5nICYmICEoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSAmJgotCSAgICAgICB3OTk2OGNmX3ZwcCA/IG1heCgodTE2KVc5OTY4Q0ZfTUFYX0hFSUdIVCwgY2FtLT5tYXhoZWlnaHQpCi0JCQkgICA6IGNhbS0+bWF4aGVpZ2h0OwotCWFsaWduID0gKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgPyA0IDogMDsKLQotCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSh3aWR0aCwgY2FtLT5taW53aWR0aCwgbWF4dywgYWxpZ24sCi0JCQkgICAgICBoZWlnaHQsIGNhbS0+bWluaGVpZ2h0LCBtYXhoLCBhbGlnbiwgMCk7Ci0KLQlQREJHRygiV2luZG93IHNpemUgYWRqdXN0ZWQgdz0ldSwgaD0ldSAiLCAqd2lkdGgsICpoZWlnaHQpCi0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIEluaXRpYWxpemUgdGhlIEZJRk8gbGlzdCBvZiByZXF1ZXN0ZWQgZnJhbWVzLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCB3OTk2OGNmX2luaXRfZnJhbWVsaXN0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCXU4IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKSB7Ci0JCWNhbS0+cmVxdWVzdGVkX2ZyYW1lW2ldID0gTlVMTDsKLQkJY2FtLT5mcmFtZVtpXS5xdWV1ZWQgPSAwOwotCQljYW0tPmZyYW1lW2ldLnN0YXR1cyA9IEZfVU5VU0VEOwotCX0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIEFkZCBhIGZyYW1lIGluIHRoZSBGSUZPIGxpc3Qgb2YgcmVxdWVzdGVkIGZyYW1lcy4KLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCB3OTk2OGNmX3B1c2hfZnJhbWUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHU4IGZfbnVtKQotewotCXU4IGY7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+Zmxpc3RfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlmb3IgKGY9MDsgY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbZl0gIT0gTlVMTDsgZisrKTsKLQljYW0tPnJlcXVlc3RlZF9mcmFtZVtmXSA9ICZjYW0tPmZyYW1lW2ZfbnVtXTsKLQljYW0tPmZyYW1lW2ZfbnVtXS5xdWV1ZWQgPSAxOwotCWNhbS0+ZnJhbWVbZl9udW1dLnN0YXR1cyA9IEZfVU5VU0VEOyAvKiBjbGVhciB0aGUgc3RhdHVzICovCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmZsaXN0X2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JREJHKDYsICJGcmFtZSAjJXUgcHVzaGVkIGludG8gdGhlIEZJRk8gbGlzdC4gUG9zaXRpb24gJXUiLCBmX251bSwgZikKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFJlYWQsIHN0b3JlIGFuZCByZW1vdmUgdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIEZJRk8gbGlzdCBvZiByZXF1ZXN0ZWQKLSAgZnJhbWVzLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQKLXc5OTY4Y2ZfcG9wX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCBzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiogZnJhbWVwKQotewotCXU4IGk7Ci0KLQlzcGluX2xvY2soJmNhbS0+Zmxpc3RfbG9jayk7Ci0KLQkqZnJhbWVwID0gY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbMF07Ci0KLQkvKiBTaGlmdCB0aGUgbGlzdCBvZiBwb2ludGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzLTE7IGkrKykKLQkJY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbaV0gPSBjYW0tPnJlcXVlc3RlZF9mcmFtZVtpKzFdOwotCWNhbS0+cmVxdWVzdGVkX2ZyYW1lW2ldID0gTlVMTDsKLQotCXNwaW5fdW5sb2NrKCZjYW0tPmZsaXN0X2xvY2spOwotCi0JREJHKDYsIlBvcHBlZCBmcmFtZSAjJWQgZnJvbSB0aGUgbGlzdCIsICgqZnJhbWVwKS0+bnVtYmVyKQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgSGlnaC1sZXZlbCB2aWRlbyBwb3N0LXByb2Nlc3Npbmcgcm91dGluZSBvbiBncmFiYmVkIGZyYW1lcy4KLSAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50Ci13OTk2OGNmX3Bvc3Rwcm9jZXNzX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLAotCQkJICBzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcikKLXsKLQl2b2lkICpwSW4gPSBmci0+YnVmZmVyLCAqcE91dCA9IGNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciwgKnRtcDsKLQl1MTYgdyA9IGNhbS0+d2luZG93LndpZHRoLAotCSAgICBoID0gY2FtLT53aW5kb3cuaGVpZ2h0LAotCSAgICBkID0gY2FtLT5waWN0dXJlLmRlcHRoLAotCSAgICBmbXQgPSBjYW0tPnBpY3R1cmUucGFsZXR0ZSwKLQkgICAgcmdiID0gY2FtLT5mb3JjZV9yZ2IsCi0JICAgIGh3X3cgPSBjYW0tPmh3X3dpZHRoLAotCSAgICBod19oID0gY2FtLT5od19oZWlnaHQsCi0JICAgIGh3X2QgPSBjYW0tPmh3X2RlcHRoOwotCWludCBlcnIgPSAwOwotCi0JI2RlZmluZSBfUFNXQVAocEluLCBwT3V0KSB7dG1wID0gKHBJbik7IChwSW4pID0gKHBPdXQpOyAocE91dCkgPSB0bXA7fQotCi0JaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgewotCQltZW1jcHkocE91dCwgcEluLCBmci0+bGVuZ3RoKTsKLQkJX1BTV0FQKHBJbiwgcE91dCkKLQkJZXJyID0gdzk5NjhjZl92cHAtPmRlY29kZShwSW4sIGZyLT5sZW5ndGgsIGh3X3csIGh3X2gsIHBPdXQpOwotCQlQREJHRygiQ29tcHJlc3NlZCBmcmFtZSBsZW5ndGg6ICVsdSIsKHVuc2lnbmVkIGxvbmcpZnItPmxlbmd0aCkKLQkJZnItPmxlbmd0aCA9IChod193Kmh3X2gqaHdfZCkvODsKLQkJX1BTV0FQKHBJbiwgcE91dCkKLQkJaWYgKGVycikgewotCQkJREJHKDQsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkZWNvZGluZyB0aGUgZnJhbWU6ICIKLQkJCSAgICAgICAiJXMiLCBzeW1ib2xpYyhkZWNvZGVyX2Vycmxpc3QsIGVycikpCi0JCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UKLQkJCURCRyg2LCAiRnJhbWUgZGVjb2RlZCIpCi0JfQotCi0JaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfU1dBUF9ZVVZfQllURVMpIHsKLQkJdzk5NjhjZl92cHAtPnN3YXBfeXV2Ynl0ZXMocEluLCBmci0+bGVuZ3RoKTsKLQkJREJHKDYsICJPcmlnaW5hbCBVWVZZIGNvbXBvbmVudCBvcmRlcmluZyBjaGFuZ2VkIikKLQl9Ci0KLQlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9VUFNDQUxFKSB7Ci0JCXc5OTY4Y2ZfdnBwLT5zY2FsZV91cChwSW4sIHBPdXQsIGh3X3csIGh3X2gsIGh3X2QsIHcsIGgpOwotCQlmci0+bGVuZ3RoID0gKHcqaCpod19kKS84OwotCQlfUFNXQVAocEluLCBwT3V0KQotCQlEQkcoNiwgIlZlcnRpY2FsIHVwLXNjYWxpbmcgZG9uZTogJXUsJXUsJXVicHAtPiV1LCV1IiwKLQkJICAgIGh3X3csIGh3X2gsIGh3X2QsIHcsIGgpCi0JfQotCi0JaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVlWWV9UT19SR0JYKSB7Ci0JCXc5OTY4Y2ZfdnBwLT51eXZ5X3RvX3JnYngocEluLCBmci0+bGVuZ3RoLCBwT3V0LCBmbXQsIHJnYik7Ci0JCWZyLT5sZW5ndGggPSAodypoKmQpLzg7Ci0JCV9QU1dBUChwSW4sIHBPdXQpCi0JCURCRyg2LCAiVVlWWS0xNmJpdCB0byAlcyBjb252ZXJzaW9uIGRvbmUiLAotCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgZm10KSkKLQl9Ci0KLQlpZiAocE91dCA9PSBmci0+YnVmZmVyKQotCQltZW1jcHkoZnItPmJ1ZmZlciwgY2FtLT5mcmFtZV92cHAuYnVmZmVyLCBmci0+bGVuZ3RoKTsKLQotCXJldHVybiAwOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEltYWdlIHNlbnNvciBjb250cm9sIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIGludCBjaWQsIGludCB2YWwpCi17Ci0Jc3RydWN0IG92Y2FtY2hpcF9jb250cm9sIGN0bDsKLQlpbnQgZXJyOwotCi0JY3RsLmlkID0gY2lkOwotCWN0bC52YWx1ZSA9IHZhbDsKLQotCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2NtZChjYW0sIE9WQ0FNQ0hJUF9DTURfU19DVFJMLCAmY3RsKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludAotdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIGludCBjaWQsIGludCogdmFsKQotewotCXN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCBjdGw7Ci0JaW50IGVycjsKLQotCWN0bC5pZCA9IGNpZDsKLQotCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2NtZChjYW0sIE9WQ0FNQ0hJUF9DTURfR19DVFJMLCAmY3RsKTsKLQlpZiAoIWVycikKLQkJKnZhbCA9IGN0bC52YWx1ZTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludAotdzk5NjhjZl9zZW5zb3JfY21kKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkKiBhcmcpCi17Ci0JaW50IHJjOwotCi0JcmMgPSB2NGwyX3N1YmRldl9jYWxsKGNhbS0+c2Vuc29yX3NkLCBjb3JlLCBpb2N0bCwgY21kLCBhcmcpOwotCS8qIFRoZSBJMkMgZHJpdmVyIHJldHVybnMgLUVQRVJNIG9uIG5vbi1zdXBwb3J0ZWQgY29udHJvbHMgKi8KLQlyZXR1cm4gKHJjIDwgMCAmJiByYyAhPSAtRVBFUk0pID8gcmMgOiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgVXBkYXRlIHNvbWUgc2V0dGluZ3Mgb2YgdGhlIGltYWdlIHNlbnNvci4KLSAgUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfdXBkYXRlX3NldHRpbmdzKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwOwotCi0JLyogQXV0byBicmlnaHRuZXNzICovCi0JZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQsCi0JCQkJCSBjYW0tPmF1dG9fYnJ0KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQXV0byBleHBvc3VyZSAqLwotCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9BVVRPRVhQLAotCQkJCQkgY2FtLT5hdXRvX2V4cCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCS8qIEJhbmRpbmcgZmlsdGVyICovCi0JZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JBTkRGSUxULAotCQkJCQkgY2FtLT5iYW5kZmlsdCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCS8qIExpZ2h0IGZyZXF1ZW5jeSAqLwotCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9GUkVRLAotCQkJCQkgY2FtLT5saWdodGZyZXEpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBCYWNrIGxpZ2h0ICovCi0JZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JBQ0tMSUdIVCwKLQkJCQkJIGNhbS0+YmFja2xpZ2h0KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogTWlycm9yICovCi0JZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX01JUlJPUiwKLQkJCQkJIGNhbS0+bWlycm9yKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBHZXQgc29tZSBjdXJyZW50IHBpY3R1cmUgc2V0dGluZ3MgZnJvbSB0aGUgaW1hZ2Ugc2Vuc29yIGFuZCB1cGRhdGUgdGhlCi0gIGludGVybmFsICdwaWN0dXJlJyBzdHJ1Y3R1cmUgb2YgdGhlIGNhbWVyYS4KLSAgUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfZ2V0X3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCi17Ci0JaW50IGVyciwgdjsKLQotCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2dldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9DT05ULCAmdik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQljYW0tPnBpY3R1cmUuY29udHJhc3QgPSB2OwotCi0JZXJyID0gdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JSSUdIVCwgJnYpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JY2FtLT5waWN0dXJlLmJyaWdodG5lc3MgPSB2OwotCi0JZXJyID0gdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX1NBVCwgJnYpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JY2FtLT5waWN0dXJlLmNvbG91ciA9IHY7Ci0KLQllcnIgPSB3OTk2OGNmX3NlbnNvcl9nZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfSFVFLCAmdik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQljYW0tPnBpY3R1cmUuaHVlID0gdjsKLQotCURCRyg1LCAiR290IHBpY3R1cmUgc2V0dGluZ3MgZnJvbSB0aGUgaW1hZ2Ugc2Vuc29yIikKLQotCVBEQkdHKCJCcmlnaHRuZXNzLCBjb250cmFzdCwgaHVlLCBjb2xvdXIsIHdoaXRlbmVzcyBhcmUgIgotCSAgICAgICIldSwldSwldSwldSwldSIsIGNhbS0+cGljdHVyZS5icmlnaHRuZXNzLGNhbS0+cGljdHVyZS5jb250cmFzdCwKLQkgICAgICBjYW0tPnBpY3R1cmUuaHVlLCBjYW0tPnBpY3R1cmUuY29sb3VyLCBjYW0tPnBpY3R1cmUud2hpdGVuZXNzKQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBVcGRhdGUgcGljdHVyZSBzZXR0aW5ncyBvZiB0aGUgaW1hZ2Ugc2Vuc29yLgotICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotdzk5NjhjZl9zZW5zb3JfdXBkYXRlX3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sCi0JCQkgICAgICBzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0KQotewotCWludCBlcnIgPSAwOwotCi0JaWYgKCghY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQpCi0JICAgIHx8IHBpY3QuY29udHJhc3QgIT0gY2FtLT5waWN0dXJlLmNvbnRyYXN0KSB7Ci0JCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9DT05ULAotCQkJCQkJIHBpY3QuY29udHJhc3QpOwotCQlpZiAoZXJyKQotCQkJZ290byBmYWlsOwotCQlEQkcoNCwgIkNvbnRyYXN0IGNoYW5nZWQgZnJvbSAldSB0byAldSIsCi0JCSAgICBjYW0tPnBpY3R1cmUuY29udHJhc3QsIHBpY3QuY29udHJhc3QpCi0JCWNhbS0+cGljdHVyZS5jb250cmFzdCA9IHBpY3QuY29udHJhc3Q7Ci0JfQotCi0JaWYgKCgoIWNhbS0+c2Vuc29yX2luaXRpYWxpemVkKSB8fAotCSAgICBwaWN0LmJyaWdodG5lc3MgIT0gY2FtLT5waWN0dXJlLmJyaWdodG5lc3MpICYmICghY2FtLT5hdXRvX2JydCkpIHsKLQkJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JSSUdIVCwKLQkJCQkJCSBwaWN0LmJyaWdodG5lc3MpOwotCQlpZiAoZXJyKQotCQkJZ290byBmYWlsOwotCQlEQkcoNCwgIkJyaWdodG5lc3MgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwKLQkJICAgIGNhbS0+cGljdHVyZS5icmlnaHRuZXNzLCBwaWN0LmJyaWdodG5lc3MpCi0JCWNhbS0+cGljdHVyZS5icmlnaHRuZXNzID0gcGljdC5icmlnaHRuZXNzOwotCX0KLQotCWlmICgoIWNhbS0+c2Vuc29yX2luaXRpYWxpemVkKSB8fCBwaWN0LmNvbG91ciAhPSBjYW0tPnBpY3R1cmUuY29sb3VyKSB7Ci0JCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9TQVQsCi0JCQkJCQkgcGljdC5jb2xvdXIpOwotCQlpZiAoZXJyKQotCQkJZ290byBmYWlsOwotCQlEQkcoNCwgIkNvbG91ciBjaGFuZ2VkIGZyb20gJXUgdG8gJXUiLAotCQkgICAgY2FtLT5waWN0dXJlLmNvbG91ciwgcGljdC5jb2xvdXIpCi0JCWNhbS0+cGljdHVyZS5jb2xvdXIgPSBwaWN0LmNvbG91cjsKLQl9Ci0KLQlpZiAoKCFjYW0tPnNlbnNvcl9pbml0aWFsaXplZCkgfHwgcGljdC5odWUgIT0gY2FtLT5waWN0dXJlLmh1ZSkgewotCQllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfSFVFLAotCQkJCQkJIHBpY3QuaHVlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZmFpbDsKLQkJREJHKDQsICJIdWUgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwKLQkJICAgIGNhbS0+cGljdHVyZS5odWUsIHBpY3QuaHVlKQotCQljYW0tPnBpY3R1cmUuaHVlID0gcGljdC5odWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JREJHKDQsICJGYWlsZWQgdG8gY2hhbmdlIHNlbnNvciBwaWN0dXJlIHNldHRpbmciKQotCXJldHVybiBlcnI7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2FtZXJhIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBzdXBwb3J0ZWQgaW1hZ2Ugc2Vuc29yIGlzIGRldGVjdGVkLgotICBSZXR1cm4gMCBpZiB0aGUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZHMsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwOwotCi0JaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX0lOSVRJQUxJWkUsCi0JCQkJICAgICAgJmNhbS0+bW9ub2Nocm9tZSkpKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX1FfU1VCVFlQRSwKLQkJCQkgICAgICAmY2FtLT5zZW5zb3IpKSkKLQkJZ290byBlcnJvcjsKLQotCS8qIE5PVEU6IE1ha2Ugc3VyZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhIG11bHRpcGxlIG9mIDE2ICovCi0Jc3dpdGNoICh2NGwyX2kyY19zdWJkZXZfYWRkcihjYW0tPnNlbnNvcl9zZCkpIHsKLQkJY2FzZSBPVjZ4eDBfU0lEOgotCQkJY2FtLT5tYXh3aWR0aCA9IDM1MjsKLQkJCWNhbS0+bWF4aGVpZ2h0ID0gMjg4OwotCQkJY2FtLT5taW53aWR0aCA9IDY0OwotCQkJY2FtLT5taW5oZWlnaHQgPSA0ODsKLQkJCWJyZWFrOwotCQljYXNlIE9WN3h4MF9TSUQ6Ci0JCQljYW0tPm1heHdpZHRoID0gNjQwOwotCQkJY2FtLT5tYXhoZWlnaHQgPSA0ODA7Ci0JCQljYW0tPm1pbndpZHRoID0gNjQ7Ci0JCQljYW0tPm1pbmhlaWdodCA9IDQ4OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkcoMSwgIk5vdCBzdXBwb3J0ZWQgaW1hZ2Ugc2Vuc29yIGRldGVjdGVkIGZvciAlcyIsCi0JCQkgICAgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBUaGVzZSB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBvbmVzIGluIHRoZSBvdnh4eDAuYyBzb3VyY2VzICovCi0Jc3dpdGNoIChjYW0tPnNlbnNvcikgewotCQljYXNlIENDX09WNzYyMDoKLQkJCWNhbS0+c3RhcnRfY3JvcHggPSAyODc7Ci0JCQljYW0tPnN0YXJ0X2Nyb3B5ID0gMzU7Ci0JCQkvKiBTZWVtcyB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgaW1hZ2Ugc2Vuc29yICovCi0JCQljYW0tPnZzX3BvbGFyaXR5ID0gMTsKLQkJCWNhbS0+aHNfcG9sYXJpdHkgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQljYW0tPnN0YXJ0X2Nyb3B4ID0gMzIwOwotCQkJY2FtLT5zdGFydF9jcm9weSA9IDM1OwotCQkJY2FtLT52c19wb2xhcml0eSA9IDE7Ci0JCQljYW0tPmhzX3BvbGFyaXR5ID0gMDsKLQl9Ci0KLQlpZiAoKGVyciA9IHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9zZXR0aW5ncyhjYW0pKSkKLQkJZ290byBlcnJvcjsKLQotCWlmICgoZXJyID0gdzk5NjhjZl9zZW5zb3JfdXBkYXRlX3BpY3R1cmUoY2FtLCBjYW0tPnBpY3R1cmUpKSkKLQkJZ290byBlcnJvcjsKLQotCWNhbS0+c2Vuc29yX2luaXRpYWxpemVkID0gMTsKLQotCURCRygyLCAiJXMgaW1hZ2Ugc2Vuc29yIGluaXRpYWxpemVkIiwgc3ltYm9saWMoc2VubGlzdCwgY2FtLT5zZW5zb3IpKQotCXJldHVybiAwOwotCi1lcnJvcjoKLQljYW0tPnNlbnNvcl9pbml0aWFsaXplZCA9IDA7Ci0JY2FtLT5zZW5zb3IgPSBDQ19VTktOT1dOOwotCURCRygxLCAiSW1hZ2Ugc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCBmb3IgJXMgKCVzKS4gIgotCSAgICAgICAiVHJ5IHRvIGRldGFjaCBhbmQgYXR0YWNoIHRoaXMgZGV2aWNlIGFnYWluIiwKLQkgICAgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCksIHZpZGVvX2RldmljZV9ub2RlX25hbWUoY2FtLT52NGxkZXYpKQotCXJldHVybiBlcnI7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBGaWxsIHNvbWUgYmFzaWMgZmllbGRzIGluIHRoZSBtYWluIGRldmljZSBkYXRhIHN0cnVjdHVyZS4KLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBvbiB3OTk2OGNmX3VzYl9wcm9iZSgpIGZvciBlYWNoIHJlY29nbml6ZWQKLSAgY2FtZXJhLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZAotdzk5NjhjZl9jb25maWd1cmVfY2FtZXJhKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLAotCQkJIHN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2LAotCQkJIGVudW0gdzk5NjhjZl9tb2RlbF9pZCBtb2RfaWQsCi0JCQkgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV2X25yKQotewotCW11dGV4X2luaXQoJmNhbS0+ZmlsZW9wX211dGV4KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPm9wZW4pOwotCXNwaW5fbG9ja19pbml0KCZjYW0tPnVyYl9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmY2FtLT5mbGlzdF9sb2NrKTsKLQotCWNhbS0+dXNlcnMgPSAwOwotCWNhbS0+ZGlzY29ubmVjdGVkID0gMDsKLQljYW0tPmlkID0gbW9kX2lkOwotCWNhbS0+c2Vuc29yID0gQ0NfVU5LTk9XTjsKLQljYW0tPnNlbnNvcl9pbml0aWFsaXplZCA9IDA7Ci0KLQkvKiBDYWxjdWxhdGUgdGhlIGFsdGVybmF0ZSBzZXR0aW5nIG51bWJlciAoZnJvbSAxIHRvIDE2KQotCSAgIGFjY29yZGluZyB0byB0aGUgJ3BhY2tldF9zaXplJyBtb2R1bGUgcGFyYW1ldGVyICovCi0JaWYgKHBhY2tldF9zaXplW2Rldl9ucl0gPCBXOTk2OENGX01JTl9QQUNLRVRfU0laRSkKLQkJcGFja2V0X3NpemVbZGV2X25yXSA9IFc5OTY4Q0ZfTUlOX1BBQ0tFVF9TSVpFOwotCWZvciAoY2FtLT5hbHRzZXR0aW5nID0gMTsKLQkgICAgIHBhY2tldF9zaXplW2Rldl9ucl0gPCB3TWF4UGFja2V0U2l6ZVtjYW0tPmFsdHNldHRpbmctMV07Ci0JICAgICBjYW0tPmFsdHNldHRpbmcrKyk7Ci0KLQljYW0tPm1heF9idWZmZXJzID0gKG1heF9idWZmZXJzW2Rldl9ucl0gPCAyIHx8Ci0JCQkgICAgbWF4X2J1ZmZlcnNbZGV2X25yXSA+IFc5OTY4Q0ZfTUFYX0JVRkZFUlMpCi0JCQkgICA/IFc5OTY4Q0ZfQlVGRkVSUyA6ICh1OCltYXhfYnVmZmVyc1tkZXZfbnJdOwotCi0JY2FtLT5kb3VibGVfYnVmZmVyID0gKGRvdWJsZV9idWZmZXJbZGV2X25yXSA9PSAwIHx8Ci0JCQkgICAgICBkb3VibGVfYnVmZmVyW2Rldl9ucl0gPT0gMSkKLQkJCSAgICAgPyAodTgpZG91YmxlX2J1ZmZlcltkZXZfbnJdOlc5OTY4Q0ZfRE9VQkxFX0JVRkZFUjsKLQotCWNhbS0+Y2xhbXBpbmcgPSAoY2xhbXBpbmdbZGV2X25yXSA9PSAwIHx8IGNsYW1waW5nW2Rldl9ucl0gPT0gMSkKLQkJCT8gKHU4KWNsYW1waW5nW2Rldl9ucl0gOiBXOTk2OENGX0NMQU1QSU5HOwotCi0JY2FtLT5maWx0ZXJfdHlwZSA9IChmaWx0ZXJfdHlwZVtkZXZfbnJdID09IDAgfHwKLQkJCSAgICBmaWx0ZXJfdHlwZVtkZXZfbnJdID09IDEgfHwKLQkJCSAgICBmaWx0ZXJfdHlwZVtkZXZfbnJdID09IDIpCi0JCQkgICA/ICh1OClmaWx0ZXJfdHlwZVtkZXZfbnJdIDogVzk5NjhDRl9GSUxURVJfVFlQRTsKLQotCWNhbS0+Y2FwdHVyZSA9IDE7Ci0KLQljYW0tPmxhcmdldmlldyA9IChsYXJnZXZpZXdbZGV2X25yXSA9PSAwIHx8IGxhcmdldmlld1tkZXZfbnJdID09IDEpCi0JCQkgPyAodTgpbGFyZ2V2aWV3W2Rldl9ucl0gOiBXOTk2OENGX0xBUkdFVklFVzsKLQotCWNhbS0+ZGVjb21wcmVzc2lvbiA9IChkZWNvbXByZXNzaW9uW2Rldl9ucl0gPT0gMCB8fAotCQkJICAgICAgZGVjb21wcmVzc2lvbltkZXZfbnJdID09IDEgfHwKLQkJCSAgICAgIGRlY29tcHJlc3Npb25bZGV2X25yXSA9PSAyKQotCQkJICAgICA/ICh1OClkZWNvbXByZXNzaW9uW2Rldl9ucl06Vzk5NjhDRl9ERUNPTVBSRVNTSU9OOwotCi0JY2FtLT51cHNjYWxpbmcgPSAodXBzY2FsaW5nW2Rldl9ucl0gPT0gMCB8fAotCQkJICB1cHNjYWxpbmdbZGV2X25yXSA9PSAxKQotCQkJID8gKHU4KXVwc2NhbGluZ1tkZXZfbnJdIDogVzk5NjhDRl9VUFNDQUxJTkc7Ci0KLQljYW0tPmF1dG9fYnJ0ID0gKGF1dG9icmlnaHRbZGV2X25yXSA9PSAwIHx8IGF1dG9icmlnaHRbZGV2X25yXSA9PSAxKQotCQkJPyAodTgpYXV0b2JyaWdodFtkZXZfbnJdIDogVzk5NjhDRl9BVVRPQlJJR0hUOwotCi0JY2FtLT5hdXRvX2V4cCA9IChhdXRvZXhwW2Rldl9ucl0gPT0gMCB8fCBhdXRvZXhwW2Rldl9ucl0gPT0gMSkKLQkJCT8gKHU4KWF1dG9leHBbZGV2X25yXSA6IFc5OTY4Q0ZfQVVUT0VYUDsKLQotCWNhbS0+bGlnaHRmcmVxID0gKGxpZ2h0ZnJlcVtkZXZfbnJdID09IDUwIHx8IGxpZ2h0ZnJlcVtkZXZfbnJdID09IDYwKQotCQkJID8gKHU4KWxpZ2h0ZnJlcVtkZXZfbnJdIDogVzk5NjhDRl9MSUdIVEZSRVE7Ci0KLQljYW0tPmJhbmRmaWx0ID0gKGJhbmRpbmdmaWx0ZXJbZGV2X25yXSA9PSAwIHx8Ci0JCQkgYmFuZGluZ2ZpbHRlcltkZXZfbnJdID09IDEpCi0JCQk/ICh1OCliYW5kaW5nZmlsdGVyW2Rldl9ucl0gOiBXOTk2OENGX0JBTkRJTkdGSUxURVI7Ci0KLQljYW0tPmJhY2tsaWdodCA9IChiYWNrbGlnaHRbZGV2X25yXSA9PSAwIHx8IGJhY2tsaWdodFtkZXZfbnJdID09IDEpCi0JCQkgPyAodTgpYmFja2xpZ2h0W2Rldl9ucl0gOiBXOTk2OENGX0JBQ0tMSUdIVDsKLQotCWNhbS0+Y2xvY2tkaXYgPSAoY2xvY2tkaXZbZGV2X25yXSA9PSAtMSB8fCBjbG9ja2RpdltkZXZfbnJdID49IDApCi0JCQk/IChzOCljbG9ja2RpdltkZXZfbnJdIDogVzk5NjhDRl9DTE9DS0RJVjsKLQotCWNhbS0+bWlycm9yID0gKG1pcnJvcltkZXZfbnJdID09IDAgfHwgbWlycm9yW2Rldl9ucl0gPT0gMSkKLQkJICAgICAgPyAodTgpbWlycm9yW2Rldl9ucl0gOiBXOTk2OENGX01JUlJPUjsKLQotCWNhbS0+bW9ub2Nocm9tZSA9IChtb25vY2hyb21lW2Rldl9ucl0gPT0gMCB8fCBtb25vY2hyb21lW2Rldl9ucl0gPT0gMSkKLQkJCSAgPyBtb25vY2hyb21lW2Rldl9ucl0gOiBXOTk2OENGX01PTk9DSFJPTUU7Ci0KLQljYW0tPnBpY3R1cmUuYnJpZ2h0bmVzcyA9ICh1MTYpYnJpZ2h0bmVzc1tkZXZfbnJdOwotCWNhbS0+cGljdHVyZS5odWUgPSAodTE2KWh1ZVtkZXZfbnJdOwotCWNhbS0+cGljdHVyZS5jb2xvdXIgPSAodTE2KWNvbG91cltkZXZfbnJdOwotCWNhbS0+cGljdHVyZS5jb250cmFzdCA9ICh1MTYpY29udHJhc3RbZGV2X25yXTsKLQljYW0tPnBpY3R1cmUud2hpdGVuZXNzID0gKHUxNil3aGl0ZW5lc3NbZGV2X25yXTsKLQlpZiAodzk5NjhjZl92YWxpZF9wYWxldHRlKCh1MTYpZm9yY2VfcGFsZXR0ZVtkZXZfbnJdKSkgewotCQljYW0tPnBpY3R1cmUucGFsZXR0ZSA9ICh1MTYpZm9yY2VfcGFsZXR0ZVtkZXZfbnJdOwotCQljYW0tPmZvcmNlX3BhbGV0dGUgPSAxOwotCX0gZWxzZSB7Ci0JCWNhbS0+Zm9yY2VfcGFsZXR0ZSA9IDA7Ci0JCWlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMCkKLQkJCWNhbS0+cGljdHVyZS5wYWxldHRlID0gVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9PRkY7Ci0JCWVsc2UgaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAxKQotCQkJY2FtLT5waWN0dXJlLnBhbGV0dGUgPSBXOTk2OENGX1BBTEVUVEVfREVDT01QX0ZPUkNFOwotCQllbHNlCi0JCQljYW0tPnBpY3R1cmUucGFsZXR0ZSA9IFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfT047Ci0JfQotCWNhbS0+cGljdHVyZS5kZXB0aCA9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgoY2FtLT5waWN0dXJlLnBhbGV0dGUpOwotCi0JY2FtLT5mb3JjZV9yZ2IgPSAoZm9yY2VfcmdiW2Rldl9ucl0gPT0gMCB8fCBmb3JjZV9yZ2JbZGV2X25yXSA9PSAxKQotCQkJID8gKHU4KWZvcmNlX3JnYltkZXZfbnJdIDogVzk5NjhDRl9GT1JDRV9SR0I7Ci0KLQljYW0tPndpbmRvdy54ID0gMDsKLQljYW0tPndpbmRvdy55ID0gMDsKLQljYW0tPndpbmRvdy53aWR0aCA9IFc5OTY4Q0ZfV0lEVEg7Ci0JY2FtLT53aW5kb3cuaGVpZ2h0ID0gVzk5NjhDRl9IRUlHSFQ7Ci0JY2FtLT53aW5kb3cuY2hyb21ha2V5ID0gMDsKLQljYW0tPndpbmRvdy5jbGlwY291bnQgPSAwOwotCWNhbS0+d2luZG93LmZsYWdzID0gMDsKLQotCURCRygzLCAiJXMgY29uZmlndXJlZCB3aXRoIHNldHRpbmdzICMldToiLAotCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwgZGV2X25yKQotCi0JREJHKDMsICItIERhdGEgcGFja2V0IHNpemUgZm9yIFVTQiBpc29jaHJub3VzIHRyYW5zZmVyOiAldSBieXRlcyIsCi0JICAgIHdNYXhQYWNrZXRTaXplW2NhbS0+YWx0c2V0dGluZy0xXSkKLQotCURCRygzLCAiLSBOdW1iZXIgb2YgcmVxdWVzdGVkIHZpZGVvIGZyYW1lIGJ1ZmZlcnM6ICV1IiwKLQkgICAgY2FtLT5tYXhfYnVmZmVycykKLQotCWlmIChjYW0tPmRvdWJsZV9idWZmZXIpCi0JCURCRygzLCAiLSBIYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nIGVuYWJsZWQiKQotCWVsc2UKLQkJREJHKDMsICItIEhhcmR3YXJlIGRvdWJsZSBidWZmZXJpbmcgZGlzYWJsZWQiKQotCi0JaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMCkKLQkJREJHKDMsICItIFZpZGVvIGZpbHRlcmluZyBkaXNhYmxlZCIpCi0JZWxzZSBpZiAoY2FtLT5maWx0ZXJfdHlwZSA9PSAxKQotCQlEQkcoMywgIi0gVmlkZW8gZmlsdGVyaW5nIGVuYWJsZWQ6IHR5cGUgMS0yLTEiKQotCWVsc2UgaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMikKLQkJREJHKDMsICItIFZpZGVvIGZpbHRlcmluZyBlbmFibGVkOiB0eXBlIDItMy02LTMtMiIpCi0KLQlpZiAoY2FtLT5jbGFtcGluZykKLQkJREJHKDMsICItIFZpZGVvIGRhdGEgY2xhbXBpbmcgKENDSVItNjAxIGZvcm1hdCkgZW5hYmxlZCIpCi0JZWxzZQotCQlEQkcoMywgIi0gVmlkZW8gZGF0YSBjbGFtcGluZyAoQ0NJUi02MDEgZm9ybWF0KSBkaXNhYmxlZCIpCi0KLQlpZiAoY2FtLT5sYXJnZXZpZXcpCi0JCURCRygzLCAiLSBMYXJnZSB2aWV3IGVuYWJsZWQiKQotCWVsc2UKLQkJREJHKDMsICItIExhcmdlIHZpZXcgZGlzYWJsZWQiKQotCi0JaWYgKChjYW0tPmRlY29tcHJlc3Npb24pID09IDAgJiYgKCFjYW0tPmZvcmNlX3BhbGV0dGUpKQotCQlEQkcoMywgIi0gRGVjb21wcmVzc2lvbiBkaXNhYmxlZCIpCi0JZWxzZSBpZiAoKGNhbS0+ZGVjb21wcmVzc2lvbikgPT0gMSAmJiAoIWNhbS0+Zm9yY2VfcGFsZXR0ZSkpCi0JCURCRygzLCAiLSBEZWNvbXByZXNzaW9uIGZvcmNlZCIpCi0JZWxzZSBpZiAoKGNhbS0+ZGVjb21wcmVzc2lvbikgPT0gMiAmJiAoIWNhbS0+Zm9yY2VfcGFsZXR0ZSkpCi0JCURCRygzLCAiLSBEZWNvbXByZXNzaW9uIGFsbG93ZWQiKQotCi0JaWYgKGNhbS0+dXBzY2FsaW5nKQotCQlEQkcoMywgIi0gU29mdHdhcmUgaW1hZ2Ugc2NhbGluZyBlbmFibGVkIikKLQllbHNlCi0JCURCRygzLCAiLSBTb2Z0d2FyZSBpbWFnZSBzY2FsaW5nIGRpc2FibGVkIikKLQotCWlmIChjYW0tPmZvcmNlX3BhbGV0dGUpCi0JCURCRygzLCAiLSBJbWFnZSBwYWxldHRlIGZvcmNlZCB0byAlcyIsCi0JCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBjYW0tPnBpY3R1cmUucGFsZXR0ZSkpCi0KLQlpZiAoY2FtLT5mb3JjZV9yZ2IpCi0JCURCRygzLCAiLSBSR0IgY29tcG9uZW50IG9yZGVyaW5nIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIEJHUiIpCi0KLQlpZiAoY2FtLT5hdXRvX2JydCkKLQkJREJHKDMsICItIEF1dG8gYnJpZ2h0bmVzcyBlbmFibGVkIikKLQllbHNlCi0JCURCRygzLCAiLSBBdXRvIGJyaWdodG5lc3MgZGlzYWJsZWQiKQotCi0JaWYgKGNhbS0+YXV0b19leHApCi0JCURCRygzLCAiLSBBdXRvIGV4cG9zdXJlIGVuYWJsZWQiKQotCWVsc2UKLQkJREJHKDMsICItIEF1dG8gZXhwb3N1cmUgZGlzYWJsZWQiKQotCi0JaWYgKGNhbS0+YmFja2xpZ2h0KQotCQlEQkcoMywgIi0gQmFja2xpZ2h0IGV4cG9zdXJlIGFsZ29yaXRobSBlbmFibGVkIikKLQllbHNlCi0JCURCRygzLCAiLSBCYWNrbGlnaHQgZXhwb3N1cmUgYWxnb3JpdGhtIGRpc2FibGVkIikKLQotCWlmIChjYW0tPm1pcnJvcikKLQkJREJHKDMsICItIE1pcnJvciBlbmFibGVkIikKLQllbHNlCi0JCURCRygzLCAiLSBNaXJyb3IgZGlzYWJsZWQiKQotCi0JaWYgKGNhbS0+YmFuZGZpbHQpCi0JCURCRygzLCAiLSBCYW5kaW5nIGZpbHRlciBlbmFibGVkIikKLQllbHNlCi0JCURCRygzLCAiLSBCYW5kaW5nIGZpbHRlciBkaXNhYmxlZCIpCi0KLQlEQkcoMywgIi0gUG93ZXIgbGlnaHRpbmcgZnJlcXVlbmN5OiAldSIsIGNhbS0+bGlnaHRmcmVxKQotCi0JaWYgKGNhbS0+Y2xvY2tkaXYgPT0gLTEpCi0JCURCRygzLCAiLSBBdXRvbWF0aWMgY2xvY2sgZGl2aXNvciBlbmFibGVkIikKLQllbHNlCi0JCURCRygzLCAiLSBDbG9jayBkaXZpc29yOiAlZCIsIGNhbS0+Y2xvY2tkaXYpCi0KLQlpZiAoY2FtLT5tb25vY2hyb21lKQotCQlEQkcoMywgIi0gSW1hZ2Ugc2Vuc29yIHVzZWQgYXMgbW9ub2Nocm9tZSIpCi0JZWxzZQotCQlEQkcoMywgIi0gSW1hZ2Ugc2Vuc29yIG5vdCB1c2VkIGFzIG1vbm9jaHJvbWUiKQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgSWYgdGhlIHZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgaXMgbm90IGxvYWRlZCwgc29tZSBwYXJhbWV0ZXJzCi0gIG11c3QgYmUgb3ZlcnJpZGRlbi4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgdzk5NjhjZl9hZGp1c3RfY29uZmlndXJhdGlvbihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKLXsKLQlpZiAoIXc5OTY4Y2ZfdnBwKSB7Ci0JCWlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMSkgewotCQkJY2FtLT5kZWNvbXByZXNzaW9uID0gMjsKLQkJCURCRygyLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBub3QgZm91bmQ6ICIKLQkJCSAgICAgICAiJ2RlY29tcHJlc3Npb24nIHBhcmFtZXRlciBmb3JjZWQgdG8gMiIpCi0JCX0KLQkJaWYgKGNhbS0+dXBzY2FsaW5nKSB7Ci0JCQljYW0tPnVwc2NhbGluZyA9IDA7Ci0JCQlEQkcoMiwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgbm90IGZvdW5kOiAiCi0JCQkgICAgICAgIid1cHNjYWxpbmcnIHBhcmFtZXRlciBmb3JjZWQgdG8gMCIpCi0JCX0KLQkJaWYgKGNhbS0+cGljdHVyZS5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfVVlWWSkgewotCQkJY2FtLT5mb3JjZV9wYWxldHRlID0gMDsKLQkJCURCRygyLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBub3QgZm91bmQ6ICIKLQkJCSAgICAgICAiJ2ZvcmNlX3BhbGV0dGUnIHBhcmFtZXRlciBmb3JjZWQgdG8gMCIpCi0JCX0KLQkJY2FtLT5waWN0dXJlLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1VZVlk7Ci0JCWNhbS0+cGljdHVyZS5kZXB0aCA9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgoY2FtLT5waWN0dXJlLnBhbGV0dGUpOwotCX0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFJlbGVhc2UgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBkcml2ZXIuCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGRpc2Nvbm5lY3QKLSAgKG9yIG9uIGNsb3NlIGlmIGRlYWxsb2NhdGlvbiBoYXMgYmVlbiBkZWZlcnJlZCkKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgdzk5NjhjZl9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKLXsKLQltdXRleF9sb2NrKCZ3OTk2OGNmX2Rldmxpc3RfbXV0ZXgpOwotCi0JREJHKDIsICJWNEwgZGV2aWNlIGRlcmVnaXN0ZXJlZDogJXMiLAotCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSkKLQotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKLQlsaXN0X2RlbCgmY2FtLT52NGxsaXN0KTsKLQlpMmNfZGVsX2FkYXB0ZXIoJmNhbS0+aTJjX2FkYXB0ZXIpOwotCXc5OTY4Y2ZfZGVhbGxvY2F0ZV9tZW1vcnkoY2FtKTsKLQlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKLQlrZnJlZShjYW0tPmRhdGFfYnVmZmVyKTsKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjYW0tPnY0bDJfZGV2KTsKLQotCW11dGV4X3VubG9jaygmdzk5NjhjZl9kZXZsaXN0X211dGV4KTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWaWRlbzRMaW51eCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgdzk5NjhjZl9vcGVuKHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOwotCWludCBlcnI7Ci0KLQkvKiBUaGlzIHRoZSBvbmx5IHNhZmUgd2F5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggZGlzY29ubmVjdCAqLwotCWlmICghZG93bl9yZWFkX3RyeWxvY2soJnc5OTY4Y2ZfZGlzY29ubmVjdCkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7Ci0KLQltdXRleF9sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0KLQlpZiAoY2FtLT5zZW5zb3IgPT0gQ0NfVU5LTk9XTikgewotCQlEQkcoMiwgIk5vIHN1cHBvcnRlZCBpbWFnZSBzZW5zb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYnkgdGhlICIKLQkJICAgICAgICInb3ZjYW1jaGlwJyBtb2R1bGUgZm9yIHRoZSAlcyAoJXMpLiBNYWtlIHN1cmUgIgotCQkgICAgICAgIml0IGlzIGxvYWRlZCAqYmVmb3JlKiAocmUpY29ubmVjdGluZyB0aGUgY2FtZXJhLiIsCi0JCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwKLQkJICAgIHZpZGVvX2RldmljZV9ub2RlX25hbWUoY2FtLT52NGxkZXYpKQotCQltdXRleF91bmxvY2soJmNhbS0+ZGV2X211dGV4KTsKLQkJdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGNhbS0+dXNlcnMpIHsKLQkJREJHKDIsICIlcyAoJXMpIGhhcyBiZWVuIGFscmVhZHkgb2NjdXBpZWQgYnkgJyVzJyIsCi0JCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwKLQkJICAgIHZpZGVvX2RldmljZV9ub2RlX25hbWUoY2FtLT52NGxkZXYpLCBjYW0tPmNvbW1hbmQpCi0JCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spfHwoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0JCQl1cF9yZWFkKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOwotCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKLQkJfQotCQltdXRleF91bmxvY2soJmNhbS0+ZGV2X211dGV4KTsKLQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2V4Y2x1c2l2ZShjYW0tPm9wZW4sCi0JCQkJCQkJIGNhbS0+ZGlzY29ubmVjdGVkIHx8Ci0JCQkJCQkJICFjYW0tPnVzZXJzKTsKLQkJaWYgKGVycikgewotCQkJdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7Ci0JCQl1cF9yZWFkKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJbXV0ZXhfbG9jaygmY2FtLT5kZXZfbXV0ZXgpOwotCX0KLQotCURCRyg1LCAiT3BlbmluZyAnJXMnLCAlcyAuLi4iLAotCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpCi0KLQljYW0tPnN0cmVhbWluZyA9IDA7Ci0JY2FtLT5taXNjb25maWd1cmVkID0gMDsKLQotCXc5OTY4Y2ZfYWRqdXN0X2NvbmZpZ3VyYXRpb24oY2FtKTsKLQotCWlmICgoZXJyID0gdzk5NjhjZl9hbGxvY2F0ZV9tZW1vcnkoY2FtKSkpCi0JCWdvdG8gZGVhbGxvY2F0ZV9tZW1vcnk7Ci0KLQlpZiAoKGVyciA9IHc5OTY4Y2ZfaW5pdF9jaGlwKGNhbSkpKQotCQlnb3RvIGRlYWxsb2NhdGVfbWVtb3J5OwotCi0JaWYgKChlcnIgPSB3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKGNhbSkpKQotCQlnb3RvIGRlYWxsb2NhdGVfbWVtb3J5OwotCi0JZmlscC0+cHJpdmF0ZV9kYXRhID0gY2FtOwotCi0JY2FtLT51c2VycysrOwotCXN0cmNweShjYW0tPmNvbW1hbmQsIGN1cnJlbnQtPmNvbW0pOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT53YWl0X3F1ZXVlKTsKLQotCURCRyg1LCAiVmlkZW8gZGV2aWNlIGlzIG9wZW4iKQotCi0JbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0JdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKLQotCXJldHVybiAwOwotCi1kZWFsbG9jYXRlX21lbW9yeToKLQl3OTk2OGNmX2RlYWxsb2NhdGVfbWVtb3J5KGNhbSk7Ci0JREJHKDIsICJGYWlsZWQgdG8gb3BlbiB0aGUgdmlkZW8gZGV2aWNlIikKLQltdXRleF91bmxvY2soJmNhbS0+ZGV2X211dGV4KTsKLQl1cF9yZWFkKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOwotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW07Ci0KLQljYW0gPSAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKil2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKLQotCW11dGV4X2xvY2soJmNhbS0+ZGV2X211dGV4KTsgLyogcHJldmVudCBkaXNjb25uZWN0KCkgdG8gYmUgY2FsbGVkICovCi0KLQl3OTk2OGNmX3N0b3BfdHJhbnNmZXIoY2FtKTsKLQotCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkgewotCQl3OTk2OGNmX3JlbGVhc2VfcmVzb3VyY2VzKGNhbSk7Ci0JCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOwotCQlrZnJlZShjYW0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYW0tPnVzZXJzLS07Ci0Jdzk5NjhjZl9kZWFsbG9jYXRlX21lbW9yeShjYW0pOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZV9ucigmY2FtLT5vcGVuLCAxKTsKLQotCURCRyg1LCAiVmlkZW8gZGV2aWNlIGNsb3NlZCIpCi0JbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QKLXc5OTY4Y2ZfcmVhZChzdHJ1Y3QgZmlsZSogZmlscCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90KiBmX3BvcykKLXsKLQlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbTsKLQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcjsKLQlpbnQgZXJyID0gMDsKLQotCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOwotCi0JaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQlyZXR1cm4gLUVXT1VMREJMT0NLOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3BfbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7Ci0JCURCRygyLCAiRGV2aWNlIG5vdCBwcmVzZW50IikKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChjYW0tPm1pc2NvbmZpZ3VyZWQpIHsKLQkJREJHKDIsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIENsb3NlIGFuZCBvcGVuIGl0IGFnYWluLiIpCi0JCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIWNhbS0+ZnJhbWVbMF0ucXVldWVkKQotCQl3OTk2OGNmX3B1c2hfZnJhbWUoY2FtLCAwKTsKLQotCWlmICghY2FtLT5mcmFtZVsxXS5xdWV1ZWQpCi0JCXc5OTY4Y2ZfcHVzaF9mcmFtZShjYW0sIDEpOwotCi0JZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhbS0+d2FpdF9xdWV1ZSwKLQkJCQkgICAgICAgY2FtLT5mcmFtZVswXS5zdGF0dXMgPT0gRl9SRUFEWSB8fAotCQkJCSAgICAgICBjYW0tPmZyYW1lWzFdLnN0YXR1cyA9PSBGX1JFQURZIHx8Ci0JCQkJICAgICAgIGNhbS0+ZGlzY29ubmVjdGVkKTsKLQlpZiAoZXJyKSB7Ci0JCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWZyID0gKGNhbS0+ZnJhbWVbMF0uc3RhdHVzID09IEZfUkVBRFkpID8gJmNhbS0+ZnJhbWVbMF06JmNhbS0+ZnJhbWVbMV07Ci0KLQlpZiAodzk5NjhjZl92cHApCi0JCXc5OTY4Y2ZfcG9zdHByb2Nlc3NfZnJhbWUoY2FtLCBmcik7Ci0KLQlpZiAoY291bnQgPiBmci0+bGVuZ3RoKQotCQljb3VudCA9IGZyLT5sZW5ndGg7Ci0KLQlpZiAoY29weV90b191c2VyKGJ1ZiwgZnItPmJ1ZmZlciwgY291bnQpKSB7Ci0JCWZyLT5zdGF0dXMgPSBGX1VOVVNFRDsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQkqZl9wb3MgKz0gY291bnQ7Ci0KLQlmci0+c3RhdHVzID0gRl9VTlVTRUQ7Ci0KLQlEQkcoNSwgIiV6dSBieXRlcyByZWFkIiwgY291bnQpCi0KLQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLQotc3RhdGljIGludCB3OTk2OGNmX21tYXAoc3RydWN0IGZpbGUqIGZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopCi0JCQkJICAgICB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKLQl1bnNpZ25lZCBsb25nIHZzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAotCQkgICAgICBwc2l6ZSA9IGNhbS0+bmJ1ZmZlcnMgKiBjYW0tPmZyYW1lWzBdLnNpemUsCi0JCSAgICAgIHN0YXJ0ID0gdm1hLT52bV9zdGFydCwKLQkJICAgICAgcG9zID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZVswXS5idWZmZXIsCi0JCSAgICAgIHBhZ2U7Ci0KLQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpIHsKLQkJREJHKDIsICJEZXZpY2Ugbm90IHByZXNlbnQiKQotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoY2FtLT5taXNjb25maWd1cmVkKSB7Ci0JCURCRygyLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCBhZ2FpbiIpCi0JCXJldHVybiAtRUlPOwotCX0KLQotCVBEQkdHKCJtbWFwcGluZyAlbHUgYnl0ZXMuLi4iLCB2c2l6ZSkKLQotCWlmICh2c2l6ZSA+IHBzaXplIC0gKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd2hpbGUgKHZzaXplID4gMCkgewotCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOwotCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UgKyB2bWEtPnZtX3Bnb2ZmLAotCQkJCQkJUEFHRV9TSVpFLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJc3RhcnQgKz0gUEFHRV9TSVpFOwotCQlwb3MgKz0gUEFHRV9TSVpFOwotCQl2c2l6ZSAtPSBQQUdFX1NJWkU7Ci0JfQotCi0JREJHKDUsICJtbWFwIG1ldGhvZCBzdWNjZXNzZnVsbHkgY2FsbGVkIikKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgbG9uZwotdzk5NjhjZl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbTsKLQlsb25nIGVycjsKLQotCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3BfbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7Ci0JCURCRygyLCAiRGV2aWNlIG5vdCBwcmVzZW50IikKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChjYW0tPm1pc2NvbmZpZ3VyZWQpIHsKLQkJREJHKDIsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIENsb3NlIGFuZCBvcGVuIGl0IGFnYWluLiIpCi0JCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQllcnIgPSB3OTk2OGNmX3Y0bF9pb2N0bChmaWxwLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0KLQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQlyZXR1cm4gZXJyOwotfQotCi0KLXN0YXRpYyBsb25nIHc5OTY4Y2ZfdjRsX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOwotCWNvbnN0IGNoYXIqIHY0bDFfaW9jdGxzW10gPSB7Ci0JCSI/IiwgIkNHQVAiLCAiR0NIQU4iLCAiU0NIQU4iLCAiR1RVTkVSIiwgIlNUVU5FUiIsCi0JCSJHUElDVCIsICJTUElDVCIsICJDQ0FQVFVSRSIsICJHV0lOIiwgIlNXSU4iLCAiR0ZCVUYiLAotCQkiU0ZCVUYiLCAiS0VZIiwgIkdGUkVRIiwgIlNGUkVRIiwgIkdBVURJTyIsICJTQVVESU8iLAotCQkiU1lOQyIsICJNQ0FQVFVSRSIsICJHTUJVRiIsICJHVU5JVCIsICJHQ0FQVFVSRSIsICJTQ0FQVFVSRSIsCi0JCSJTUExBWU1PREUiLCAiU1dSSVRFTU9ERSIsICJHUExBWUlORk8iLCAiU01JQ1JPQ09ERSIsCi0JCSJHVkJJRk1UIiwgIlNWQklGTVQiCi0JfTsKLQotCSNkZWZpbmUgVjRMMV9JT0NUTChjbWQpIFwKLQkJKChfSU9DX05SKChjbWQpKSA8IEFSUkFZX1NJWkUodjRsMV9pb2N0bHMpKSA/IFwKLQkJdjRsMV9pb2N0bHNbX0lPQ19OUigoY21kKSldIDogIj8iKQotCi0JY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCi0JY2FzZSBWSURJT0NHQ0FQOiAvKiBnZXQgdmlkZW8gY2FwYWJpbGl0eSAqLwotCXsKLQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgY2FwID0gewotCQkJLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU0NBTEVTLAotCQkJLmNoYW5uZWxzID0gMSwKLQkJCS5hdWRpb3MgPSAwLAotCQkJLm1pbndpZHRoID0gY2FtLT5taW53aWR0aCwKLQkJCS5taW5oZWlnaHQgPSBjYW0tPm1pbmhlaWdodCwKLQkJfTsKLQkJc3ByaW50ZihjYXAubmFtZSwgIlc5OTZbODddQ0YgVVNCIENhbWVyYSIpOwotCQljYXAubWF4d2lkdGggPSAoY2FtLT51cHNjYWxpbmcgJiYgdzk5NjhjZl92cHApCi0JCQkgICAgICAgPyBtYXgoKHUxNilXOTk2OENGX01BWF9XSURUSCwgY2FtLT5tYXh3aWR0aCkKLQkJCQkgOiBjYW0tPm1heHdpZHRoOwotCQljYXAubWF4aGVpZ2h0ID0gKGNhbS0+dXBzY2FsaW5nICYmIHc5OTY4Y2ZfdnBwKQotCQkJCT8gbWF4KCh1MTYpVzk5NjhDRl9NQVhfSEVJR0hULCBjYW0tPm1heGhlaWdodCkKLQkJCQkgIDogY2FtLT5tYXhoZWlnaHQ7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjYXAsIHNpemVvZihjYXApKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURCRyg1LCAiVklESU9DR0NBUCBzdWNjZXNzZnVsbHkgY2FsbGVkIikKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NHQ0hBTjogLyogZ2V0IHZpZGVvIGNoYW5uZWwgaW5mb3JtYXRpb25zICovCi0JewotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBjaGFuOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNoYW4sIGFyZywgc2l6ZW9mKGNoYW4pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChjaGFuLmNoYW5uZWwgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN0cmNweShjaGFuLm5hbWUsICJDYW1lcmEiKTsKLQkJY2hhbi50dW5lcnMgPSAwOwotCQljaGFuLmZsYWdzID0gMDsKLQkJY2hhbi50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7Ci0JCWNoYW4ubm9ybSA9IFZJREVPX01PREVfQVVUTzsKLQotCQlpZiAoY29weV90b191c2VyKGFyZywgJmNoYW4sIHNpemVvZihjaGFuKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEQkcoNSwgIlZJRElPQ0dDSEFOIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYXNlIFZJRElPQ1NDSEFOOiAvKiBzZXQgYWN0aXZlIGNoYW5uZWwgKi8KLQl7Ci0JCXN0cnVjdCB2aWRlb19jaGFubmVsIGNoYW47Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaGFuLCBhcmcsIHNpemVvZihjaGFuKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoY2hhbi5jaGFubmVsICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlEQkcoNSwgIlZJRElPQ1NDSEFOIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYXNlIFZJRElPQ0dQSUNUOiAvKiBnZXQgaW1hZ2UgcHJvcGVydGllcyBvZiB0aGUgcGljdHVyZSAqLwotCXsKLQkJaWYgKHc5OTY4Y2Zfc2Vuc29yX2dldF9waWN0dXJlKGNhbSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAoY29weV90b191c2VyKGFyZywgJmNhbS0+cGljdHVyZSwgc2l6ZW9mKGNhbS0+cGljdHVyZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJREJHKDUsICJWSURJT0NHUElDVCBzdWNjZXNzZnVsbHkgY2FsbGVkIikKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NTUElDVDogLyogY2hhbmdlIHBpY3R1cmUgc2V0dGluZ3MgKi8KLQl7Ci0JCXN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3Q7Ci0JCWludCBlcnIgPSAwOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmcGljdCwgYXJnLCBzaXplb2YocGljdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKCAoY2FtLT5mb3JjZV9wYWxldHRlIHx8ICF3OTk2OGNmX3ZwcCkKLQkJICAgICAmJiBwaWN0LnBhbGV0dGUgIT0gY2FtLT5waWN0dXJlLnBhbGV0dGUgKSB7Ci0JCQlEQkcoNCwgIlBhbGV0dGUgJXMgcmVqZWN0ZWQ6IG9ubHkgJXMgaXMgYWxsb3dlZCIsCi0JCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcGljdC5wYWxldHRlKSwKLQkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBjYW0tPnBpY3R1cmUucGFsZXR0ZSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICghdzk5NjhjZl92YWxpZF9wYWxldHRlKHBpY3QucGFsZXR0ZSkpIHsKLQkJCURCRyg0LCAiUGFsZXR0ZSAlcyBub3Qgc3VwcG9ydGVkLiBWSURJT0NTUElDVCBmYWlsZWQiLAotCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHBpY3QucGFsZXR0ZSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICghY2FtLT5mb3JjZV9wYWxldHRlKSB7Ci0JCSAgIGlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMCkgewotCQkgICAgICBpZiAodzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24ocGljdC5wYWxldHRlKSkgewotCQkJIERCRyg0LCAiRGVjb21wcmVzc2lvbiBkaXNhYmxlZDogcGFsZXR0ZSAlcyBpcyBub3QgIgotCQkJCSJhbGxvd2VkLiBWSURJT0NTUElDVCBmYWlsZWQiLAotCQkJICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpKQotCQkJIHJldHVybiAtRUlOVkFMOwotCQkgICAgICB9Ci0JCSAgIH0gZWxzZSBpZiAoY2FtLT5kZWNvbXByZXNzaW9uID09IDEpIHsKLQkJICAgICAgaWYgKCF3OTk2OGNmX25lZWRfZGVjb21wcmVzc2lvbihwaWN0LnBhbGV0dGUpKSB7Ci0JCQkgREJHKDQsICJEZWNvbXByZXNzaW9uIGZvcmNlZDogcGFsZXR0ZSAlcyBpcyBub3QgIgotCQkJCSJhbGxvd2VkLiBWSURJT0NTUElDVCBmYWlsZWQiLAotCQkJICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpKQotCQkJIHJldHVybiAtRUlOVkFMOwotCQkgICAgICB9Ci0JCSAgIH0KLQkJfQotCi0JCWlmIChwaWN0LmRlcHRoICE9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgocGljdC5wYWxldHRlKSkgewotCQkJREJHKDQsICJSZXF1ZXN0ZWQgZGVwdGggJXUgYnBwIGlzIG5vdCB2YWxpZCBmb3IgJXMgIgotCQkJICAgICAgICJwYWxldHRlOiBpZ25vcmVkIGFuZCBjaGFuZ2VkIHRvICV1IGJwcCIsCi0JCQkgICAgcGljdC5kZXB0aCwgc3ltYm9saWModjRsMV9wbGlzdCwgcGljdC5wYWxldHRlKSwKLQkJCSAgICB3OTk2OGNmX3ZhbGlkX2RlcHRoKHBpY3QucGFsZXR0ZSkpCi0JCQlwaWN0LmRlcHRoID0gdzk5NjhjZl92YWxpZF9kZXB0aChwaWN0LnBhbGV0dGUpOwotCQl9Ci0KLQkJaWYgKHBpY3QucGFsZXR0ZSAhPSBjYW0tPnBpY3R1cmUucGFsZXR0ZSkgewotCQkJaWYoKmNhbS0+cmVxdWVzdGVkX2ZyYW1lCi0JCQkgICB8fCBjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgewotCQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZQotCQkJCSAgICAgICggY2FtLT53YWl0X3F1ZXVlLAotCQkJCQljYW0tPmRpc2Nvbm5lY3RlZCB8fAotCQkJCQkoISpjYW0tPnJlcXVlc3RlZF9mcmFtZSAmJgotCQkJCQkgIWNhbS0+ZnJhbWVfY3VycmVudC0+cXVldWVkKSApOwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQkJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKQotCQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQotCQkJaWYgKHc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pKQotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQotCQkJaWYgKHc5OTY4Y2Zfc2V0X3BpY3R1cmUoY2FtLCBwaWN0KSkKLQkJCQlnb3RvIGlvY3RsX2ZhaWw7Ci0KLQkJCWlmICh3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKGNhbSkpCi0JCQkJZ290byBpb2N0bF9mYWlsOwotCi0JCX0gZWxzZSBpZiAodzk5NjhjZl9zZW5zb3JfdXBkYXRlX3BpY3R1cmUoY2FtLCBwaWN0KSkKLQkJCXJldHVybiAtRUlPOwotCi0KLQkJREJHKDUsICJWSURJT0NTUElDVCBzdWNjZXNzZnVsbHkgY2FsbGVkIikKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NTV0lOOiAvKiBzZXQgY2FwdHVyZSBhcmVhICovCi0JewotCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHdpbjsKLQkJaW50IGVyciA9IDA7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3aW4sIGFyZywgc2l6ZW9mKHdpbikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJREJHKDYsICJWSURJT0NTV0lOIGNhbGxlZDogY2xpcGNvdW50PSVkLCBmbGFncz0ldSwgIgotCQkgICAgICAgIng9JXUsIHk9JXUsICV1eCV1Iiwgd2luLmNsaXBjb3VudCwgd2luLmZsYWdzLAotCQkgICAgd2luLngsIHdpbi55LCB3aW4ud2lkdGgsIHdpbi5oZWlnaHQpCi0KLQkJaWYgKHdpbi5jbGlwY291bnQgIT0gMCB8fCB3aW4uZmxhZ3MgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmICgoZXJyID0gdzk5NjhjZl9hZGp1c3Rfd2luZG93X3NpemUoY2FtLCAmd2luLndpZHRoLAotCQkJCQkJICAgICAgJndpbi5oZWlnaHQpKSkgewotCQkJREJHKDQsICJSZXNvbHV0aW9uIG5vdCBzdXBwb3J0ZWQgKCV1eCV1KS4gIgotCQkJICAgICAgICJWSURJT0NTV0lOIGZhaWxlZCIsIHdpbi53aWR0aCwgd2luLmhlaWdodCkKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQotCQlpZiAod2luLnggIT0gY2FtLT53aW5kb3cueCB8fAotCQkgICAgd2luLnkgIT0gY2FtLT53aW5kb3cueSB8fAotCQkgICAgd2luLndpZHRoICE9IGNhbS0+d2luZG93LndpZHRoIHx8Ci0JCSAgICB3aW4uaGVpZ2h0ICE9IGNhbS0+d2luZG93LmhlaWdodCkgewotCQkJaWYoKmNhbS0+cmVxdWVzdGVkX2ZyYW1lCi0JCQkgICB8fCBjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgewotCQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZQotCQkJCSAgICAgICggY2FtLT53YWl0X3F1ZXVlLAotCQkJCQljYW0tPmRpc2Nvbm5lY3RlZCB8fAotCQkJCQkoISpjYW0tPnJlcXVlc3RlZF9mcmFtZSAmJgotCQkJCQkgIWNhbS0+ZnJhbWVfY3VycmVudC0+cXVldWVkKSApOwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQkJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKQotCQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQotCQkJaWYgKHc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pKQotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQotCQkJLyogVGhpcyBfbXVzdF8gYmUgY2FsbGVkIGJlZm9yZSBzZXRfd2luZG93KCkgKi8KLQkJCWlmICh3OTk2OGNmX3NldF9waWN0dXJlKGNhbSwgY2FtLT5waWN0dXJlKSkKLQkJCQlnb3RvIGlvY3RsX2ZhaWw7Ci0KLQkJCWlmICh3OTk2OGNmX3NldF93aW5kb3coY2FtLCB3aW4pKQotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQotCQkJaWYgKHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoY2FtKSkKLQkJCQlnb3RvIGlvY3RsX2ZhaWw7Ci0JCX0KLQotCQlEQkcoNSwgIlZJRElPQ1NXSU4gc3VjY2Vzc2Z1bGx5IGNhbGxlZC4gIikKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NHV0lOOiAvKiBnZXQgY3VycmVudCB3aW5kb3cgcHJvcGVydGllcyAqLwotCXsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsJmNhbS0+d2luZG93LHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEQkcoNSwgIlZJRElPQ0dXSU4gc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCi0JCXJldHVybiAwOwotCX0KLQotCWNhc2UgVklESU9DR01CVUY6IC8qIHJlcXVlc3QgZm9yIG1lbW9yeSAobWFwcGVkKSBidWZmZXIgKi8KLQl7Ci0JCXN0cnVjdCB2aWRlb19tYnVmIG1idWY7Ci0JCXU4IGk7Ci0KLQkJbWJ1Zi5zaXplID0gY2FtLT5uYnVmZmVycyAqIGNhbS0+ZnJhbWVbMF0uc2l6ZTsKLQkJbWJ1Zi5mcmFtZXMgPSBjYW0tPm5idWZmZXJzOwotCQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKQotCQkJbWJ1Zi5vZmZzZXRzW2ldID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZVtpXS5idWZmZXIgLQotCQkJCQkgICh1bnNpZ25lZCBsb25nKWNhbS0+ZnJhbWVbMF0uYnVmZmVyOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmbWJ1Ziwgc2l6ZW9mKG1idWYpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURCRyg1LCAiVklESU9DR01CVUYgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCi0JCXJldHVybiAwOwotCX0KLQotCWNhc2UgVklESU9DTUNBUFRVUkU6IC8qIHN0YXJ0IHRoZSBjYXB0dXJlIHRvIGEgZnJhbWUgKi8KLQl7Ci0JCXN0cnVjdCB2aWRlb19tbWFwIG1tYXA7Ci0JCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIGZyOwotCQl1MzIgdywgaDsKLQkJaW50IGVyciA9IDA7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtbWFwLCBhcmcsIHNpemVvZihtbWFwKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEQkcoNiwgIlZJRElPQ01DQVBUVVJFIGNhbGxlZDogZnJhbWUgIyV1LCBmb3JtYXQ9JXMsICVkeCVkIiwKLQkJICAgIG1tYXAuZnJhbWUsIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSwKLQkJICAgIG1tYXAud2lkdGgsIG1tYXAuaGVpZ2h0KQotCi0JCWlmIChtbWFwLmZyYW1lID49IGNhbS0+bmJ1ZmZlcnMpIHsKLQkJCURCRyg0LCAiSW52YWxpZCBmcmFtZSBudW1iZXIgKCV1KS4gIgotCQkJICAgICAgICJWSURJT0NNQ0FQVFVSRSBmYWlsZWQiLCBtbWFwLmZyYW1lKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAobW1hcC5mb3JtYXQhPWNhbS0+cGljdHVyZS5wYWxldHRlICYmCi0JCSAgICAoY2FtLT5mb3JjZV9wYWxldHRlIHx8ICF3OTk2OGNmX3ZwcCkpIHsKLQkJCURCRyg0LCAiUGFsZXR0ZSAlcyByZWplY3RlZDogb25seSAlcyBpcyBhbGxvd2VkIiwKLQkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBtbWFwLmZvcm1hdCksCi0JCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgY2FtLT5waWN0dXJlLnBhbGV0dGUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoIXc5OTY4Y2ZfdmFsaWRfcGFsZXR0ZShtbWFwLmZvcm1hdCkpIHsKLQkJCURCRyg0LCAiUGFsZXR0ZSAlcyBub3Qgc3VwcG9ydGVkLiAiCi0JCQkgICAgICAgIlZJRElPQ01DQVBUVVJFIGZhaWxlZCIsCi0JCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgbW1hcC5mb3JtYXQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoIWNhbS0+Zm9yY2VfcGFsZXR0ZSkgewotCQkgICBpZiAoY2FtLT5kZWNvbXByZXNzaW9uID09IDApIHsKLQkJICAgICAgaWYgKHc5OTY4Y2ZfbmVlZF9kZWNvbXByZXNzaW9uKG1tYXAuZm9ybWF0KSkgewotCQkJIERCRyg0LCAiRGVjb21wcmVzc2lvbiBkaXNhYmxlZDogcGFsZXR0ZSAlcyBpcyBub3QgIgotCQkJCSJhbGxvd2VkLiBWSURJT0NTUElDVCBmYWlsZWQiLAotCQkJICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBtbWFwLmZvcm1hdCkpCi0JCQkgcmV0dXJuIC1FSU5WQUw7Ci0JCSAgICAgIH0KLQkJICAgfSBlbHNlIGlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMSkgewotCQkgICAgICBpZiAoIXc5OTY4Y2ZfbmVlZF9kZWNvbXByZXNzaW9uKG1tYXAuZm9ybWF0KSkgewotCQkJIERCRyg0LCAiRGVjb21wcmVzc2lvbiBmb3JjZWQ6IHBhbGV0dGUgJXMgaXMgbm90ICIKLQkJCQkiYWxsb3dlZC4gVklESU9DU1BJQ1QgZmFpbGVkIiwKLQkJCSAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgbW1hcC5mb3JtYXQpKQotCQkJIHJldHVybiAtRUlOVkFMOwotCQkgICAgICB9Ci0JCSAgIH0KLQkJfQotCi0JCXcgPSBtbWFwLndpZHRoOyBoID0gbW1hcC5oZWlnaHQ7Ci0JCWVyciA9IHc5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKGNhbSwgJncsICZoKTsKLQkJbW1hcC53aWR0aCA9IHc7IG1tYXAuaGVpZ2h0ID0gaDsKLQkJaWYgKGVycikgewotCQkJREJHKDQsICJSZXNvbHV0aW9uIG5vdCBzdXBwb3J0ZWQgKCVkeCVkKS4gIgotCQkJICAgICAgICJWSURJT0NNQ0FQVFVSRSBmYWlsZWQiLAotCQkJICAgIG1tYXAud2lkdGgsIG1tYXAuaGVpZ2h0KQotCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JCWZyID0gJmNhbS0+ZnJhbWVbbW1hcC5mcmFtZV07Ci0KLQkJaWYgKG1tYXAud2lkdGggICE9IGNhbS0+d2luZG93LndpZHRoIHx8Ci0JCSAgICBtbWFwLmhlaWdodCAhPSBjYW0tPndpbmRvdy5oZWlnaHQgfHwKLQkJICAgIG1tYXAuZm9ybWF0ICE9IGNhbS0+cGljdHVyZS5wYWxldHRlKSB7Ci0KLQkJCXN0cnVjdCB2aWRlb193aW5kb3cgd2luOwotCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdDsKLQotCQkJaWYoKmNhbS0+cmVxdWVzdGVkX2ZyYW1lCi0JCQkgICB8fCBjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgewotCQkJCURCRyg2LCAiVklESU9DTUNBUFRVUkUuIENoYW5nZSBzZXR0aW5ncyBmb3IgIgotCQkJCSAgICAgICAiZnJhbWUgIyV1OiAlZHglZCwgZm9ybWF0ICVzLiBXYWl0Li4uIiwKLQkJCQkgICAgbW1hcC5mcmFtZSwgbW1hcC53aWR0aCwgbW1hcC5oZWlnaHQsCi0JCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSkKLQkJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKLQkJCQkgICAgICAoIGNhbS0+d2FpdF9xdWV1ZSwKLQkJCQkJY2FtLT5kaXNjb25uZWN0ZWQgfHwKLQkJCQkJKCEqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUgJiYKLQkJCQkJICFjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkKLQkJCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQl9Ci0KLQkJCW1lbWNweSgmd2luLCAmY2FtLT53aW5kb3csIHNpemVvZih3aW4pKTsKLQkJCW1lbWNweSgmcGljdCwgJmNhbS0+cGljdHVyZSwgc2l6ZW9mKHBpY3QpKTsKLQkJCXdpbi53aWR0aCA9IG1tYXAud2lkdGg7Ci0JCQl3aW4uaGVpZ2h0ID0gbW1hcC5oZWlnaHQ7Ci0JCQlwaWN0LnBhbGV0dGUgPSBtbWFwLmZvcm1hdDsKLQotCQkJaWYgKHc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pKQotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQotCQkJLyogVGhpcyBiZWZvcmUgc2V0X3dpbmRvdyAqLwotCQkJaWYgKHc5OTY4Y2Zfc2V0X3BpY3R1cmUoY2FtLCBwaWN0KSkKLQkJCQlnb3RvIGlvY3RsX2ZhaWw7Ci0KLQkJCWlmICh3OTk2OGNmX3NldF93aW5kb3coY2FtLCB3aW4pKQotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQotCQkJaWYgKHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoY2FtKSkKLQkJCQlnb3RvIGlvY3RsX2ZhaWw7Ci0KLQkJfSBlbHNlIAlpZiAoZnItPnF1ZXVlZCkgewotCi0JCQlEQkcoNiwgIldhaXQgdW50aWwgZnJhbWUgIyV1IGlzIGZyZWUiLCBtbWFwLmZyYW1lKQotCi0JCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2FtLT53YWl0X3F1ZXVlLAotCQkJCQkJICAgICAgIGNhbS0+ZGlzY29ubmVjdGVkIHx8Ci0JCQkJCQkgICAgICAgKCFmci0+cXVldWVkKSk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQl3OTk2OGNmX3B1c2hfZnJhbWUoY2FtLCBtbWFwLmZyYW1lKTsKLQkJREJHKDUsICJWSURJT0NNQ0FQVFVSRSgldSk6IHN1Y2Nlc3NmdWxseSBjYWxsZWQiLCBtbWFwLmZyYW1lKQotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYXNlIFZJRElPQ1NZTkM6IC8qIHdhaXQgdW50aWwgdGhlIGNhcHR1cmUgb2YgYSBmcmFtZSBpcyBmaW5pc2hlZCAqLwotCXsKLQkJdW5zaWduZWQgaW50IGZfbnVtOwotCQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcjsKLQkJaW50IGVyciA9IDA7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmX251bSwgYXJnLCBzaXplb2YoZl9udW0pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChmX251bSA+PSBjYW0tPm5idWZmZXJzKSB7Ci0JCQlEQkcoNCwgIkludmFsaWQgZnJhbWUgbnVtYmVyICgldSkuICIKLQkJCSAgICAgICAiVklESU9DTUNBUFRVUkUgZmFpbGVkIiwgZl9udW0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCURCRyg2LCAiVklESU9DU1lOQyBjYWxsZWQgZm9yIGZyYW1lICMldSIsIGZfbnVtKQotCi0JCWZyID0gJmNhbS0+ZnJhbWVbZl9udW1dOwotCi0JCXN3aXRjaCAoZnItPnN0YXR1cykgewotCQljYXNlIEZfVU5VU0VEOgotCQkJaWYgKCFmci0+cXVldWVkKSB7Ci0JCQkJREJHKDQsICJWSURJT1NZTkM6IEZyYW1lICMldSBub3QgcmVxdWVzdGVkISIsCi0JCQkJICAgIGZfbnVtKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQljYXNlIEZfRVJST1I6Ci0JCWNhc2UgRl9HUkFCQklORzoKLQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjYW0tPndhaXRfcXVldWUsCi0JCQkJCQkgICAgICAgKGZyLT5zdGF0dXMgPT0gRl9SRUFEWSkKLQkJCQkJCSAgICAgICB8fCBjYW0tPmRpc2Nvbm5lY3RlZCk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQlicmVhazsKLQkJY2FzZSBGX1JFQURZOgotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodzk5NjhjZl92cHApCi0JCQl3OTk2OGNmX3Bvc3Rwcm9jZXNzX2ZyYW1lKGNhbSwgZnIpOwotCi0JCWZyLT5zdGF0dXMgPSBGX1VOVVNFRDsKLQotCQlEQkcoNSwgIlZJRElPQ1NZTkMoJXUpIHN1Y2Nlc3NmdWxseSBjYWxsZWQiLCBmX251bSkKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NHVU5JVDovKiByZXBvcnQgdGhlIHVuaXQgbnVtYmVycyBvZiB0aGUgYXNzb2NpYXRlZCBkZXZpY2VzKi8KLQl7Ci0JCXN0cnVjdCB2aWRlb191bml0IHVuaXQgPSB7Ci0JCQkudmlkZW8gPSBjYW0tPnY0bGRldi0+bWlub3IsCi0JCQkudmJpID0gVklERU9fTk9fVU5JVCwKLQkJCS5yYWRpbyA9IFZJREVPX05PX1VOSVQsCi0JCQkuYXVkaW8gPSBWSURFT19OT19VTklULAotCQkJLnRlbGV0ZXh0ID0gVklERU9fTk9fVU5JVCwKLQkJfTsKLQotCQlpZiAoY29weV90b191c2VyKGFyZywgJnVuaXQsIHNpemVvZih1bml0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEQkcoNSwgIlZJRElPQ0dVTklUIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYXNlIFZJRElPQ0tFWToKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFZJRElPQ0dGQlVGOgotCXsKLQkJaWYgKGNsZWFyX3VzZXIoYXJnLCBzaXplb2Yoc3RydWN0IHZpZGVvX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJREJHKDUsICJWSURJT0NHRkJVRiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NHVFVORVI6Ci0JewotCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgdHVuZXI7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdHVuZXIsIGFyZywgc2l6ZW9mKHR1bmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAodHVuZXIudHVuZXIgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN0cmNweSh0dW5lci5uYW1lLCAibm9fdHVuZXIiKTsKLQkJdHVuZXIucmFuZ2Vsb3cgPSAwOwotCQl0dW5lci5yYW5nZWhpZ2ggPSAwOwotCQl0dW5lci5mbGFncyA9IFZJREVPX1RVTkVSX05PUk07Ci0JCXR1bmVyLm1vZGUgPSBWSURFT19NT0RFX0FVVE87Ci0JCXR1bmVyLnNpZ25hbCA9IDB4ZmZmZjsKLQotCQlpZiAoY29weV90b191c2VyKGFyZywgJnR1bmVyLCBzaXplb2YodHVuZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURCRyg1LCAiVklESU9DR1RVTkVSIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYXNlIFZJRElPQ1NUVU5FUjoKLQl7Ci0JCXN0cnVjdCB2aWRlb190dW5lciB0dW5lcjsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0dW5lciwgYXJnLCBzaXplb2YodHVuZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICh0dW5lci50dW5lciAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKHR1bmVyLm1vZGUgIT0gVklERU9fTU9ERV9BVVRPKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJREJHKDUsICJWSURJT0NTVFVORVIgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCi0JCXJldHVybiAwOwotCX0KLQotCWNhc2UgVklESU9DU0ZCVUY6Ci0JY2FzZSBWSURJT0NDQVBUVVJFOgotCWNhc2UgVklESU9DR0ZSRVE6Ci0JY2FzZSBWSURJT0NTRlJFUToKLQljYXNlIFZJRElPQ0dBVURJTzoKLQljYXNlIFZJRElPQ1NBVURJTzoKLQljYXNlIFZJRElPQ1NQTEFZTU9ERToKLQljYXNlIFZJRElPQ1NXUklURU1PREU6Ci0JY2FzZSBWSURJT0NHUExBWUlORk86Ci0JY2FzZSBWSURJT0NTTUlDUk9DT0RFOgotCWNhc2UgVklESU9DR1ZCSUZNVDoKLQljYXNlIFZJRElPQ1NWQklGTVQ6Ci0JCURCRyg0LCAiVW5zdXBwb3J0ZWQgVjRMMSBJT0N0bDogVklESU9DJXMgIgotCQkgICAgICAgIih0eXBlIDB4JTAxWCwgIgotCQkgICAgICAgIm4uIDB4JTAxWCwgIgotCQkgICAgICAgImRpci4gMHglMDFYLCAiCi0JCSAgICAgICAic2l6ZSAweCUwMlgpIiwKLQkJICAgIFY0TDFfSU9DVEwoY21kKSwKLQkJICAgIF9JT0NfVFlQRShjbWQpLF9JT0NfTlIoY21kKSxfSU9DX0RJUihjbWQpLF9JT0NfU0laRShjbWQpKQotCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGVmYXVsdDoKLQkJREJHKDQsICJJbnZhbGlkIFY0TDEgSU9DdGw6IFZJRElPQyVzICIKLQkJICAgICAgICJ0eXBlIDB4JTAxWCwgIgotCQkgICAgICAgIm4uIDB4JTAxWCwgIgotCQkgICAgICAgImRpci4gMHglMDFYLCAiCi0JCSAgICAgICAic2l6ZSAweCUwMlgiLAotCQkgICAgVjRMMV9JT0NUTChjbWQpLAotCQkgICAgX0lPQ19UWVBFKGNtZCksX0lPQ19OUihjbWQpLF9JT0NfRElSKGNtZCksX0lPQ19TSVpFKGNtZCkpCi0KLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQotCX0gLyogZW5kIG9mIHN3aXRjaCAqLwotCi1pb2N0bF9mYWlsOgotCWNhbS0+bWlzY29uZmlndXJlZCA9IDE7Ci0JREJHKDEsICJWSURJT0MlcyBmYWlsZWQgYmVjYXVzZSBvZiBoYXJkd2FyZSBwcm9ibGVtcy4gIgotCSAgICAgICAiVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuIGl0IGFnYWluLiIsIFY0TDFfSU9DVEwoY21kKSkKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHc5OTY4Y2ZfZm9wcyA9IHsKLQkub3duZXIgPSAgIFRISVNfTU9EVUxFLAotCS5vcGVuID0gICAgdzk5NjhjZl9vcGVuLAotCS5yZWxlYXNlID0gdzk5NjhjZl9yZWxlYXNlLAotCS5yZWFkID0gICAgdzk5NjhjZl9yZWFkLAotCS5pb2N0bCA9ICAgdzk5NjhjZl9pb2N0bCwKLQkubW1hcCA9ICAgIHc5OTY4Y2ZfbW1hcCwKLX07Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVVNCIHByb2JlIGFuZCBWNEwgcmVnaXN0cmF0aW9uLCBkaXNjb25uZWN0IGFuZCBpZF90YWJsZVtdIGRlZmluaXRpb24gICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci13OTk2OGNmX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSogaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQqIGlkKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbTsKLQlpbnQgZXJyID0gMDsKLQllbnVtIHc5OTY4Y2ZfbW9kZWxfaWQgbW9kX2lkOwotCXN0cnVjdCBsaXN0X2hlYWQqIHB0cjsKLQl1OCBzYyA9IDA7IC8qIG51bWJlciBvZiBzaW11bHRhbmVvdXMgY2FtZXJhcyAqLwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBkZXZfbnI7IC8qIDAgLSB3ZSBhcmUgaGFuZGxpbmcgZGV2aWNlIG51bWJlciBuICovCi0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IGFkZHJzW10gPSB7Ci0JCU9WN3h4MF9TSUQsCi0JCU9WNnh4MF9TSUQsCi0JCUkyQ19DTElFTlRfRU5ECi0JfTsKLQotCWlmIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSAgPT0gd2luYm9uZF9pZF90YWJsZVswXS5pZFZlbmRvciAmJgotCSAgICBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gd2luYm9uZF9pZF90YWJsZVswXS5pZFByb2R1Y3QpCi0JCW1vZF9pZCA9IFc5OTY4Q0ZfTU9EX0NMVkJXR1A7IC8qIHNlZSBjYW1saXN0W10gdGFibGUgKi8KLQllbHNlIGlmIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSAgPT0gd2luYm9uZF9pZF90YWJsZVsxXS5pZFZlbmRvciAmJgotCQkgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IHdpbmJvbmRfaWRfdGFibGVbMV0uaWRQcm9kdWN0KQotCQltb2RfaWQgPSBXOTk2OENGX01PRF9HRU5FUklDOyAvKiBzZWUgY2FtbGlzdFtdIHRhYmxlICovCi0JZWxzZQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKQotCQkgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3OTk2OGNmX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghY2FtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZpbnRmLT5kZXYsICZjYW0tPnY0bDJfZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWwwOwotCi0JbXV0ZXhfaW5pdCgmY2FtLT5kZXZfbXV0ZXgpOwotCW11dGV4X2xvY2soJmNhbS0+ZGV2X211dGV4KTsKLQotCWNhbS0+dXNiZGV2ID0gdWRldjsKLQotCURCRygyLCAiJXMgZGV0ZWN0ZWQiLCBzeW1ib2xpYyhjYW1saXN0LCBtb2RfaWQpKQotCi0JaWYgKHNpbWNhbXMgPiBXOTk2OENGX01BWF9ERVZJQ0VTKQotCQlzaW1jYW1zID0gVzk5NjhDRl9TSU1DQU1TOwotCi0JLyogSG93IG1hbnkgY2FtZXJhcyBhcmUgY29ubmVjdGVkID8gKi8KLQltdXRleF9sb2NrKCZ3OTk2OGNmX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gocHRyLCAmdzk5NjhjZl9kZXZfbGlzdCkKLQkJc2MrKzsKLQltdXRleF91bmxvY2soJnc5OTY4Y2ZfZGV2bGlzdF9tdXRleCk7Ci0KLQlpZiAoc2MgPj0gc2ltY2FtcykgewotCQlEQkcoMiwgIkRldmljZSByZWplY3RlZDogdG9vIG1hbnkgY29ubmVjdGVkIGNhbWVyYXMgIgotCQkgICAgICAgIihtYXguICV1KSIsIHNpbWNhbXMpCi0JCWVyciA9IC1FUEVSTTsKLQkJZ290byBmYWlsOwotCX0KLQotCi0JLyogQWxsb2NhdGUgMiBieXRlcyBvZiBtZW1vcnkgZm9yIGNhbWVyYSBjb250cm9sIFVTQiB0cmFuc2ZlcnMgKi8KLQlpZiAoIShjYW0tPmNvbnRyb2xfYnVmZmVyID0ga3phbGxvYygyLCBHRlBfS0VSTkVMKSkpIHsKLQkJREJHKDEsIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FtZXJhIGNvbnRyb2wgdHJhbnNmZXJzIikKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIEFsbG9jYXRlIDggYnl0ZXMgb2YgbWVtb3J5IGZvciBVU0IgZGF0YSB0cmFuc2ZlcnMgdG8gdGhlIEZTQiAqLwotCWlmICghKGNhbS0+ZGF0YV9idWZmZXIgPSBremFsbG9jKDgsIEdGUF9LRVJORUwpKSkgewotCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YSAiCi0JCSAgICAgICAidHJhbnNmZXJzIHRvIHRoZSBGU0IiKQotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogUmVnaXN0ZXIgdGhlIFY0TCBkZXZpY2UgKi8KLQljYW0tPnY0bGRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmICghY2FtLT52NGxkZXYpIHsKLQkJREJHKDEsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIFY0TCBzdHJ1Y3R1cmUiKQotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jc3RyY3B5KGNhbS0+djRsZGV2LT5uYW1lLCBzeW1ib2xpYyhjYW1saXN0LCBtb2RfaWQpKTsKLQljYW0tPnY0bGRldi0+Zm9wcyA9ICZ3OTk2OGNmX2ZvcHM7Ci0JY2FtLT52NGxkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKLQl2aWRlb19zZXRfZHJ2ZGF0YShjYW0tPnY0bGRldiwgY2FtKTsKLQljYW0tPnY0bGRldi0+djRsMl9kZXYgPSAmY2FtLT52NGwyX2RldjsKLQotCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShjYW0tPnY0bGRldiwgVkZMX1RZUEVfR1JBQkJFUiwKLQkJCQkgICAgdmlkZW9fbnJbZGV2X25yXSk7Ci0JaWYgKGVycikgewotCQlEQkcoMSwgIlY0TCBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCIpCi0JCWlmIChlcnIgPT0gLUVORklMRSAmJiB2aWRlb19ucltkZXZfbnJdID09IC0xKQotCQkJREJHKDIsICJDb3VsZG4ndCBmaW5kIGEgZnJlZSAvZGV2L3ZpZGVvWCBub2RlIikKLQkJdmlkZW9fbnJbZGV2X25yXSA9IC0xOwotCQlkZXZfbnIgPSAoZGV2X25yIDwgVzk5NjhDRl9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKLQkJZ290byBmYWlsOwotCX0KLQotCURCRygyLCAiVjRMIGRldmljZSByZWdpc3RlcmVkIGFzICVzIiwKLQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpCi0KLQkvKiBTZXQgc29tZSBiYXNpYyBjb25zdGFudHMgKi8KLQl3OTk2OGNmX2NvbmZpZ3VyZV9jYW1lcmEoY2FtLCB1ZGV2LCBtb2RfaWQsIGRldl9ucik7Ci0KLQkvKiBBZGQgYSBuZXcgZW50cnkgaW50byB0aGUgbGlzdCBvZiBWNEwgcmVnaXN0ZXJlZCBkZXZpY2VzICovCi0JbXV0ZXhfbG9jaygmdzk5NjhjZl9kZXZsaXN0X211dGV4KTsKLQlsaXN0X2FkZCgmY2FtLT52NGxsaXN0LCAmdzk5NjhjZl9kZXZfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZ3OTk2OGNmX2Rldmxpc3RfbXV0ZXgpOwotCWRldl9uciA9IChkZXZfbnIgPCBXOTk2OENGX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOwotCi0Jdzk5NjhjZl90dXJuX29uX2xlZChjYW0pOwotCi0Jdzk5NjhjZl9pMmNfaW5pdChjYW0pOwotCWNhbS0+c2Vuc29yX3NkID0gdjRsMl9pMmNfbmV3X3N1YmRldigmY2FtLT52NGwyX2RldiwKLQkJCSZjYW0tPmkyY19hZGFwdGVyLAotCQkJIm92Y2FtY2hpcCIsICJvdmNhbWNoaXAiLCAwLCBhZGRycyk7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGNhbSk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0KLQllcnIgPSB3OTk2OGNmX3NlbnNvcl9pbml0KGNhbSk7Ci0JcmV0dXJuIDA7Ci0KLWZhaWw6IC8qIEZyZWUgdW51c2VkIG1lbW9yeSAqLwotCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOwotCWtmcmVlKGNhbS0+ZGF0YV9idWZmZXIpOwotCWlmIChjYW0tPnY0bGRldikKLQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoY2FtLT52NGxkZXYpOwotCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOwotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmNhbS0+djRsMl9kZXYpOwotZmFpbDA6Ci0Ja2ZyZWUoY2FtKTsKLQlyZXR1cm4gZXJyOwotfQotCi0KLXN0YXRpYyB2b2lkIHc5OTY4Y2ZfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UqIGludGYpCi17Ci0Jc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0gPQotCSAgIChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0KLQlpZiAoY2FtKSB7Ci0JCWRvd25fd3JpdGUoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7Ci0JCS8qIFByZXZlbnQgY29uY3VycmVudCBhY2Nlc3NlcyB0byBkYXRhICovCi0JCW11dGV4X2xvY2soJmNhbS0+ZGV2X211dGV4KTsKLQotCQljYW0tPmRpc2Nvbm5lY3RlZCA9IDE7Ci0KLQkJREJHKDIsICJEaXNjb25uZWN0aW5nICVzLi4uIiwgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCkpOwotCi0JCXY0bDJfZGV2aWNlX2Rpc2Nvbm5lY3QoJmNhbS0+djRsMl9kZXYpOwotCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmNhbS0+b3Blbik7Ci0KLQkJaWYgKGNhbS0+dXNlcnMpIHsKLQkJCURCRygyLCAiVGhlIGRldmljZSBpcyBvcGVuICglcykhICIKLQkJCSAgICAgICAiUHJvY2VzcyBuYW1lOiAlcy4gRGVyZWdpc3RyYXRpb24gYW5kIG1lbW9yeSAiCi0JCQkgICAgICAgImRlYWxsb2NhdGlvbiBhcmUgZGVmZXJyZWQgb24gY2xvc2UuIiwKLQkJCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSwgY2FtLT5jb21tYW5kKQotCQkJY2FtLT5taXNjb25maWd1cmVkID0gMTsKLQkJCXc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfcXVldWUpOwotCQl9IGVsc2UKLQkJCXc5OTY4Y2ZfcmVsZWFzZV9yZXNvdXJjZXMoY2FtKTsKLQotCQltdXRleF91bmxvY2soJmNhbS0+ZGV2X211dGV4KTsKLQkJdXBfd3JpdGUoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7Ci0KLQkJaWYgKCFjYW0tPnVzZXJzKSB7Ci0JCQlrZnJlZShjYW0pOwotCQl9Ci0JfQotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB3OTk2OGNmX3VzYl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAgICAgICAidzk5NjhjZiIsCi0JLmlkX3RhYmxlID0gICB3aW5ib25kX2lkX3RhYmxlLAotCS5wcm9iZSA9ICAgICAgdzk5NjhjZl91c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSB3OTk2OGNmX3VzYl9kaXNjb25uZWN0LAotfTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNb2R1bGUgaW5pdCwgZXhpdCBhbmQgaW50ZXJtb2R1bGUgY29tbXVuaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19pbml0IHc5OTY4Y2ZfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JS0RCRygyLCBXOTk2OENGX01PRFVMRV9OQU1FIiAiVzk5NjhDRl9NT0RVTEVfVkVSU0lPTikKLQlLREJHKDMsIFc5OTY4Q0ZfTU9EVUxFX0FVVEhPUikKLQotCWlmICgoZXJyID0gdXNiX3JlZ2lzdGVyKCZ3OTk2OGNmX3VzYl9kcml2ZXIpKSkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3OTk2OGNmX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JLyogdzk5NjhjZl91c2JfZGlzY29ubmVjdCgpIHdpbGwgYmUgY2FsbGVkICovCi0JdXNiX2RlcmVnaXN0ZXIoJnc5OTY4Y2ZfdXNiX2RyaXZlcik7Ci0KLQlLREJHKDIsIFc5OTY4Q0ZfTU9EVUxFX05BTUUiIGRlcmVnaXN0ZXJlZCIpCi19Ci0KLQotbW9kdWxlX2luaXQodzk5NjhjZl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdCh3OTk2OGNmX21vZHVsZV9leGl0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhZDg2NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWaWRlbzRMaW51eCBkcml2ZXIgZm9yIFc5OTZbODddQ0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwLiAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9XOTk2OENGX0hfCi0jZGVmaW5lIF9XOTk2OENGX0hfCi0KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3ZjYW1jaGlwLmg+Ci0KLSNpbmNsdWRlICJ3OTk2OGNmX3ZwcC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZWZhdWx0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVzk5NjhDRl9WUFBNT0RfTE9BRCAgICAgMSAgLyogYXV0b21hdGljICd3OTk2OGNmLXZwcCcgbW9kdWxlIGxvYWRpbmcgKi8KLQotLyogQ29tbWVudC91bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuYWJsZS9kaXNhYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwotI2RlZmluZSBXOTk2OENGX0RFQlVHCi0KLS8qIFRoZXNlIGhhdmUgZWZmZWN0IG9ubHkgaWYgVzk5NjhDRl9ERUJVRyBpcyBkZWZpbmVkICovCi0jZGVmaW5lIFc5OTY4Q0ZfREVCVUdfTEVWRUwgICAgMiAvKiBmcm9tIDAgdG8gNi4gMCBmb3Igbm8gZGVidWcgaW5mb3JtYXRpb25zICovCi0jZGVmaW5lIFc5OTY4Q0ZfU1BFQ0lGSUNfREVCVUcgMCAvKiAwIG9yIDEgKi8KLQotI2RlZmluZSBXOTk2OENGX01BWF9ERVZJQ0VTICAgIDMyCi0jZGVmaW5lIFc5OTY4Q0ZfU0lNQ0FNUyAgICAgICAgVzk5NjhDRl9NQVhfREVWSUNFUyAvKiBzaW11bHRhbmVvdXMgY2FtZXJhcyAqLwotCi0jZGVmaW5lIFc5OTY4Q0ZfTUFYX0JVRkZFUlMgICAzMgotI2RlZmluZSBXOTk2OENGX0JVRkZFUlMgICAgICAgMiAvKiBuLiBvZiBmcmFtZSBidWZmZXJzIGZyb20gMiB0byBNQVhfQlVGRkVSUyAqLwotCi0vKiBNYXhpbXVtIGRhdGEgcGF5bG9hZCBzaXplcyBpbiBieXRlcyBmb3IgYWx0ZXJuYXRlIHNldHRpbmdzICovCi1zdGF0aWMgY29uc3QgdTE2IHdNYXhQYWNrZXRTaXplW10gPSB7MTAyMywgOTU5LCA4OTUsIDgzMSwgNzY3LCA3MDMsIDYzOSwgNTc1LAotCQkJCSAgICAgIDUxMSwgNDQ3LCAzODMsIDMxOSwgMjU1LCAxOTEsIDEyNywgIDYzfTsKLSNkZWZpbmUgVzk5NjhDRl9QQUNLRVRfU0laRSAgICAgIDEwMjMgLyogYWNjb3JkaW5nIHRvIHdNYXhQYWNrZXRTaXplc1tdICovCi0jZGVmaW5lIFc5OTY4Q0ZfTUlOX1BBQ0tFVF9TSVpFICA2MyAvKiBtaW5pbXVtIHZhbHVlICovCi0jZGVmaW5lIFc5OTY4Q0ZfSVNPX1BBQ0tFVFMgICAgICA1IC8qIG4ub2YgcGFja2V0cyBmb3IgaXNvY2hyb25vdXMgdHJhbnNmZXJzICovCi0jZGVmaW5lIFc5OTY4Q0ZfVVNCX0NUUkxfVElNRU9VVCAxMDAwIC8qIHRpbWVvdXQgKG1zKSBmb3IgdXNiIGNvbnRyb2wgY29tbWFuZHMgKi8KLSNkZWZpbmUgVzk5NjhDRl9VUkJTICAgICAgICAgICAgIDIgLyogbi4gb2Ygc2NoZWR1bGVkIFVSQnMgZm9yIElTTyB0cmFuc2ZlciAqLwotCi0jZGVmaW5lIFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSAgICA0IC8qIGRlbGF5IGluIHVzIGZvciBJMkMgYml0IHIvdyBvcGVyYXRpb25zICovCi0jZGVmaW5lIFc5OTY4Q0ZfSTJDX1JXX1JFVFJJRVMgICAxNSAvKiBudW1iZXIgb2YgbWF4IEkyQyByL3cgcmV0cmllcyAqLwotCi0vKiBBdmFpbGFibGUgdmlkZW8gZm9ybWF0cyAqLwotc3RydWN0IHc5OTY4Y2ZfZm9ybWF0IHsKLQljb25zdCB1MTYgcGFsZXR0ZTsKLQljb25zdCB1MTYgZGVwdGg7Ci0JY29uc3QgdTggY29tcHJlc3Npb247Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHc5OTY4Y2ZfZm9ybWF0IHc5OTY4Y2ZfZm9ybWF0bGlzdFtdID0gewotCXsgVklERU9fUEFMRVRURV9VWVZZLCAgICAxNiwgMCB9LCAvKiBvcmlnaW5hbCB2aWRlbyAqLwotCXsgVklERU9fUEFMRVRURV9ZVVY0MjJQLCAxNiwgMSB9LCAvKiB3aXRoIEpQRUcgY29tcHJlc3Npb24gKi8KLQl7IFZJREVPX1BBTEVUVEVfWVVWNDIwUCwgMTIsIDEgfSwgLyogd2l0aCBKUEVHIGNvbXByZXNzaW9uICovCi0JeyBWSURFT19QQUxFVFRFX1lVVjQyMCwgIDEyLCAxIH0sIC8qIHNhbWUgYXMgWVVWNDIwUCAqLwotCXsgVklERU9fUEFMRVRURV9ZVVlWLCAgICAxNiwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCi0JeyBWSURFT19QQUxFVFRFX1lVVjQyMiwgIDE2LCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KLQl7IFZJREVPX1BBTEVUVEVfR1JFWSwgICAgIDgsIDAgfSwgLyogc29mdHdhcmUgY29udmVyc2lvbiAqLwotCXsgVklERU9fUEFMRVRURV9SR0I1NTUsICAxNiwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCi0JeyBWSURFT19QQUxFVFRFX1JHQjU2NSwgIDE2LCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KLQl7IFZJREVPX1BBTEVUVEVfUkdCMjQsICAgMjQsIDAgfSwgLyogc29mdHdhcmUgY29udmVyc2lvbiAqLwotCXsgVklERU9fUEFMRVRURV9SR0IzMiwgICAzMiwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCi0JeyAwLCAgICAgICAgICAgICAgICAgICAgICAwLCAwIH0gIC8qIDAgaXMgYSB0ZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotI2RlZmluZSBXOTk2OENGX0RFQ09NUFJFU1NJT04gICAgMiAvKiBkZWNvbXA6MD1kaXNhYmxlLDE9Zm9yY2UsMj1hbnkgZm9ybWF0cyAqLwotI2RlZmluZSBXOTk2OENGX1BBTEVUVEVfREVDT01QX09GRiAgIFZJREVPX1BBTEVUVEVfVVlWWSAgICAvKiB3aGVuIGRlY29tcD0wICovCi0jZGVmaW5lIFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfRk9SQ0UgVklERU9fUEFMRVRURV9ZVVY0MjBQIC8qIHdoZW4gZGVjb21wPTEgKi8KLSNkZWZpbmUgVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9PTiAgICBWSURFT19QQUxFVFRFX1VZVlkgICAgLyogd2hlbiBkZWNvbXA9MiAqLwotCi0jZGVmaW5lIFc5OTY4Q0ZfRk9SQ0VfUkdCICAgICAgICAwICAvKiByZWFkIFJHQiBpbnN0ZWFkIG9mIEJHUiwgeWVzPTEvbm89MCAqLwotCi0jZGVmaW5lIFc5OTY4Q0ZfTUFYX1dJRFRIICAgICAgODAwIC8qIEhhcyBlZmZlY3QgaWYgdXAtc2NhbGluZyBpcyBvbiAqLwotI2RlZmluZSBXOTk2OENGX01BWF9IRUlHSFQgICAgIDYwMCAvKiBIYXMgZWZmZWN0IGlmIHVwLXNjYWxpbmcgaXMgb24gKi8KLSNkZWZpbmUgVzk5NjhDRl9XSURUSCAgICAgICAgICAzMjAgLyogZnJvbSAxMjggdG8gMzUyLCBtdWx0aXBsZSBvZiAxNiAqLwotI2RlZmluZSBXOTk2OENGX0hFSUdIVCAgICAgICAgIDI0MCAvKiBmcm9tICA5NiB0byAyODgsIG11bHRpcGxlIG9mIDE2ICovCi0KLSNkZWZpbmUgVzk5NjhDRl9DTEFNUElORyAgICAgICAwIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgdmlkZW8gZGF0YSBjbGFtcGluZyAqLwotI2RlZmluZSBXOTk2OENGX0ZJTFRFUl9UWVBFICAgIDAgLyogMCBkaXNhYmxlICAxICgxLTItMSksIDIgKDItMy02LTMtMikgKi8KLSNkZWZpbmUgVzk5NjhDRl9ET1VCTEVfQlVGRkVSICAxIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgZG91YmxlIGJ1ZmZlciAqLwotI2RlZmluZSBXOTk2OENGX0xBUkdFVklFVyAgICAgIDEgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSAqLwotI2RlZmluZSBXOTk2OENGX1VQU0NBTElORyAgICAgIDAgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSAqLwotCi0jZGVmaW5lIFc5OTY4Q0ZfTU9OT0NIUk9NRSAgICAgMCAvKiAwIG5vdCBtb25vY2hyb21lLCAxIG1vbm9jaHJvbWUgc2Vuc29yICovCi0jZGVmaW5lIFc5OTY4Q0ZfQlJJR0hUTkVTUyAgICAgMzEwMDAgLyogZnJvbSAwIHRvIDY1NTM1ICovCi0jZGVmaW5lIFc5OTY4Q0ZfSFVFICAgICAgICAgICAgMzI3NjggLyogZnJvbSAwIHRvIDY1NTM1ICovCi0jZGVmaW5lIFc5OTY4Q0ZfQ09MT1VSICAgICAgICAgMzI3NjggLyogZnJvbSAwIHRvIDY1NTM1ICovCi0jZGVmaW5lIFc5OTY4Q0ZfQ09OVFJBU1QgICAgICAgNTAwMDAgLyogZnJvbSAwIHRvIDY1NTM1ICovCi0jZGVmaW5lIFc5OTY4Q0ZfV0hJVEVORVNTICAgICAgMzI3NjggLyogZnJvbSAwIHRvIDY1NTM1ICovCi0KLSNkZWZpbmUgVzk5NjhDRl9BVVRPQlJJR0hUICAgICAwIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgYXV0b21hdGljIGJyaWdodG5lc3MgKi8KLSNkZWZpbmUgVzk5NjhDRl9BVVRPRVhQICAgICAgICAxIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgYXV0b21hdGljIGV4cG9zdXJlICovCi0jZGVmaW5lIFc5OTY4Q0ZfTElHSFRGUkVRICAgICAgNTAgLyogbGlnaHQgZnJlcXVlbmN5LiA1MEh6IChFdXJvcGUpIG9yIDYwSHogKi8KLSNkZWZpbmUgVzk5NjhDRl9CQU5ESU5HRklMVEVSICAwIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgYmFuZGluZyBmaWx0ZXIgKi8KLSNkZWZpbmUgVzk5NjhDRl9CQUNLTElHSFQgICAgICAwIC8qIDAgb3IgMSwgMT1vYmplY3QgaXMgbGl0IGZyb20gYmVoaW5kICovCi0jZGVmaW5lIFc5OTY4Q0ZfTUlSUk9SICAgICAgICAgMCAvKiAwIG9yIDEgW2Rvbid0XSByZXZlcnNlIGltYWdlIGhvcml6b250YWxseSovCi0KLSNkZWZpbmUgVzk5NjhDRl9DTE9DS0RJViAgICAgICAgIC0xIC8qIC0xID0gYXV0b21hdGljIGNsb2NrIGRpdmlzb3IgKi8KLSNkZWZpbmUgVzk5NjhDRl9ERUZfQ0xPQ0tESVZJU09SICAwIC8qIGRlZmF1bHQgc2Vuc29yIGNsb2NrIGRpdmlzb3IgdmFsdWUgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR2xvYmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX05BTUUgICAgICJWNEwgZHJpdmVyIGZvciBXOTk2Wzg3XUNGIEpQRUcgVVNCICIgXAotCQkJCSJEdWFsIE1vZGUgQ2FtZXJhIENoaXAiCi0jZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX1ZFUlNJT04gICIxOjEuMzQtYmFzaWMiCi0jZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX0FVVEhPUiAgICIoQykgMjAwMi0yMDA0IEx1Y2EgUmlzb2xpYSIKLSNkZWZpbmUgVzk5NjhDRl9BVVRIT1JfRU1BSUwgICAgIjxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIKLSNkZWZpbmUgVzk5NjhDRl9NT0RVTEVfTElDRU5TRSAgIkdQTCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdpbmJvbmRfaWRfdGFibGVbXSA9IHsKLQl7Ci0JCS8qIENyZWF0aXZlIExhYnMgVmlkZW8gQmxhc3RlciBXZWJDYW0gR28gUGx1cyAqLwotCQlVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDAzKSwKLQkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpInc5OTY4Y2YiLAotCX0sCi0JewotCQkvKiBHZW5lcmljIFc5OTZbODddQ0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSAqLwotCQlVU0JfREVWSUNFKDB4MTA0NiwgMHg5OTY3KSwKLQkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpInc5OTY4Y2YiLAotCX0sCi0JeyB9IC8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0vKiBXOTk2Wzg3XUNGIGNhbWVyYSBtb2RlbHMsIGludGVybmFsIGlkczogKi8KLWVudW0gdzk5NjhjZl9tb2RlbF9pZCB7Ci0JVzk5NjhDRl9NT0RfR0VORVJJQyA9IDEsIC8qIEdlbmVyaWMgVzk5Nls4N11DRiBiYXNlZCBkZXZpY2UgKi8KLQlXOTk2OENGX01PRF9DTFZCV0dQID0gMTEsLypDcmVhdGl2ZSBMYWJzIFZpZGVvIEJsYXN0ZXIgV2ViQ2FtIEdvIFBsdXMqLwotCVc5OTY4Q0ZfTU9EX0FEUFZETUEgPSAyMSwgLyogQXJvbWEgRGlnaSBQZW4gVkdBIER1YWwgTW9kZSBBREctNTAwMCAqLwotCVc5OTg2Q0ZfTU9EX0FBVSA9IDMxLCAgICAgLyogQVZlck1lZGlhIEFWZXJUViBVU0IgKi8KLQlXOTk2OENGX01PRF9DTFZCV0cgPSAzNCwgIC8qIENyZWF0aXZlIExhYnMgVmlkZW8gQmxhc3RlciBXZWJDYW0gR28gKi8KLQlXOTk2OENGX01PRF9MTCA9IDM3LCAgICAgIC8qIExlYm9uIExEQy0wMzVBICovCi0JVzk5NjhDRl9NT0RfRUVFTUMgPSA0MCwgICAvKiBFem9uaWNzIEVaLTgwMiBFWk1lZ2EgQ2FtICovCi0JVzk5NjhDRl9NT0RfT09FID0gNDIsICAgICAvKiBPbW5pVmlzaW9uIE9WODYxMC1FREUgKi8KLQlXOTk2OENGX01PRF9PRFBWRE1QQyA9IDQzLC8qIE9QQ09NIERpZ2kgUGVuIFZHQSBEdWFsIE1vZGUgUGVuIENhbWVyYSAqLwotCVc5OTY4Q0ZfTU9EX1BEUElJID0gNDYsICAgLyogUHJldGVjIERpZ2kgUGVuLUlJICovCi0JVzk5NjhDRl9NT0RfUERQNDgwID0gNDksICAvKiBQcmV0ZWMgRGlnaVBlbi00ODAgKi8KLX07Ci0KLWVudW0gdzk5NjhjZl9mcmFtZV9zdGF0dXMgewotCUZfUkVBRFksICAgICAgICAgICAgLyogZmluaXNoZWQgZ3JhYmJpbmcgJiByZWFkeSB0byBiZSByZWFkL3N5bmNlZCAqLwotCUZfR1JBQkJJTkcsICAgICAgICAgLyogaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCi0JRl9FUlJPUiwgICAgICAgICAgICAvKiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkIHdoaWxlIHByb2Nlc3NpbmcgKi8KLQlGX1VOVVNFRCAgICAgICAgICAgIC8qIHVudXNlZCAobm8gVklESU9DTUNBUFRVUkUpICovCi19OwotCi1zdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90IHsKLQl2b2lkKiBidWZmZXI7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXUzMiBsZW5ndGg7Ci0JaW50IG51bWJlcjsKLQllbnVtIHc5OTY4Y2ZfZnJhbWVfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBuZXh0OwotCXU4IHF1ZXVlZDsKLX07Ci0KLWVudW0gdzk5NjhjZl92cHBfZmxhZyB7Ci0JVlBQX05PTkUgPSAweDAwLAotCVZQUF9VUFNDQUxFID0gMHgwMSwKLQlWUFBfU1dBUF9ZVVZfQllURVMgPSAweDAyLAotCVZQUF9ERUNPTVBSRVNTSU9OID0gMHgwNCwKLQlWUFBfVVlWWV9UT19SR0JYID0gMHgwOCwKLX07Ci0KLS8qIE1haW4gZGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB3OTk2OGNmX2RldmljZSB7Ci0JZW51bSB3OTk2OGNmX21vZGVsX2lkIGlkOyAgIC8qIHByaXZhdGUgZGV2aWNlIGlkZW50aWZpZXIgKi8KLQotCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlKiB2NGxkZXY7IC8qIC0+IFY0TCBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHY0bGxpc3Q7ICAgIC8qIGVudHJ5IG9mIHRoZSBsaXN0IG9mIFY0TCBjYW1lcmFzICovCi0KLQlzdHJ1Y3QgdXNiX2RldmljZSogdXNiZGV2OyAgICAgICAgICAgLyogLT4gbWFpbiBVU0Igc3RydWN0dXJlICovCi0Jc3RydWN0IHVyYiogdXJiW1c5OTY4Q0ZfVVJCU107ICAgICAgIC8qIC0+IFVTQiByZXF1ZXN0IGJsb2NrIHN0cnVjdHMgKi8KLQl2b2lkKiB0cmFuc2Zlcl9idWZmZXJbVzk5NjhDRl9VUkJTXTsgLyogLT4gSVNPIHRyYW5zZmVyIGJ1ZmZlcnMgKi8KLQl1MTYqIGNvbnRyb2xfYnVmZmVyOyAgICAgICAgICAgICAgICAgLyogLT4gYnVmZmVyIGZvciBjb250cm9sIHJlcS4qLwotCXUxNiogZGF0YV9idWZmZXI7ICAgICAgICAgICAgICAgICAgICAvKiAtPiBkYXRhIHRvIHNlbmQgdG8gdGhlIEZTQiAqLwotCi0Jc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCBmcmFtZVtXOTk2OENGX01BWF9CVUZGRVJTXTsKLQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90IGZyYW1lX3RtcDsgLyogdGVtcG9yYXJ5IGZyYW1lICovCi0Jc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCBmcmFtZV92cHA7IC8qIGhlbHBlciBmcmFtZS4qLwotCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIGZyYW1lX2N1cnJlbnQ7IC8qIC0+IGZyYW1lIGJlaW5nIGdyYWJiZWQgKi8KLQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiByZXF1ZXN0ZWRfZnJhbWVbVzk5NjhDRl9NQVhfQlVGRkVSU107Ci0KLQl1OCBtYXhfYnVmZmVycywgICAvKiBudW1iZXIgb2YgcmVxdWVzdGVkIGJ1ZmZlcnMgKi8KLQkgICBmb3JjZV9wYWxldHRlLCAvKiB5ZXM9MS9ubz0wICovCi0JICAgZm9yY2VfcmdiLCAgICAgLyogcmVhZCBSR0IgaW5zdGVhZCBvZiBCR1IsIHllcz0xLCBubz0wICovCi0JICAgZG91YmxlX2J1ZmZlciwgLyogaGFyZHdhcmUgZG91YmxlIGJ1ZmZlcmluZyB5ZXM9MS9ubz0wICovCi0JICAgY2xhbXBpbmcsICAgICAgLyogdmlkZW8gZGF0YSBjbGFtcGluZyB5ZXM9MS9ubz0wICovCi0JICAgZmlsdGVyX3R5cGUsICAgLyogMD1kaXNhYmxlZCwgMT0zIHRhcCwgMj01IHRhcCBmaWx0ZXIgKi8KLQkgICBjYXB0dXJlLCAgICAgICAvKiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KLQkgICBsYXJnZXZpZXcsICAgICAvKiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KLQkgICBkZWNvbXByZXNzaW9uLCAvKiAwPWRpc2FibGVkLCAxPWZvcmNlZCwgMj1hbGxvd2VkICovCi0JICAgdXBzY2FsaW5nOyAgICAgLyogc29mdHdhcmUgaW1hZ2Ugc2NhbGluZywgMD1lbmFibGVkLCAxPWRpc2FibGVkICovCi0KLQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0dXJlOyAvKiBjdXJyZW50IHBpY3R1cmUgc2V0dGluZ3MgKi8KLQlzdHJ1Y3QgdmlkZW9fd2luZG93IHdpbmRvdzsgICAvKiBjdXJyZW50IHdpbmRvdyBzZXR0aW5ncyAqLwotCi0JdTE2IGh3X2RlcHRoLCAgICAvKiBkZXB0aCAodXNlZCBieSB0aGUgY2hpcCkgKi8KLQkgICAgaHdfcGFsZXR0ZSwgIC8qIHBhbGV0dGUgKHVzZWQgYnkgdGhlIGNoaXApICovCi0JICAgIGh3X3dpZHRoLCAgICAvKiB3aWR0aCAodXNlZCBieSB0aGUgY2hpcCkgKi8KLQkgICAgaHdfaGVpZ2h0LCAgIC8qIGhlaWdodCAodXNlZCBieSB0aGUgY2hpcCkgKi8KLQkgICAgaHNfcG9sYXJpdHksIC8qIDA9bmVnYXRpdmUgc3luYyBwdWxzZSwgMT1wb3NpdGl2ZSBzeW5jIHB1bHNlICovCi0JICAgIHZzX3BvbGFyaXR5LCAvKiAwPW5lZ2F0aXZlIHN5bmMgcHVsc2UsIDE9cG9zaXRpdmUgc3luYyBwdWxzZSAqLwotCSAgICBzdGFydF9jcm9weCwgLyogcGl4ZWxzIGZyb20gSFMgaW5hY3RpdmUgZWRnZSB0byAxc3QgY3JvcHBlZCBwaXhlbCovCi0JICAgIHN0YXJ0X2Nyb3B5OyAvKiBwaXhlbHMgZnJvbSBWUyBpbmFjdGl2ZSBlZGdlIHRvIDFzdCBjcm9wcGVkIHBpeGVsKi8KLQotCWVudW0gdzk5NjhjZl92cHBfZmxhZyB2cHBfZmxhZzsgLyogcG9zdC1wcm9jZXNzaW5nIHJvdXRpbmVzIGluIHVzZSAqLwotCi0JdTggbmJ1ZmZlcnMsICAgICAgLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBmcmFtZSBidWZmZXJzICovCi0JICAgYWx0c2V0dGluZywgICAgLyogY2FtZXJhIGFsdGVybmF0ZSBzZXR0aW5nICovCi0JICAgZGlzY29ubmVjdGVkLCAgLyogZmxhZzogeWVzPTEsIG5vPTAgKi8KLQkgICBtaXNjb25maWd1cmVkLCAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLwotCSAgIHVzZXJzLCAgICAgICAgIC8qIGZsYWc6IG51bWJlciBvZiB1c2VycyBob2xkaW5nIHRoZSBkZXZpY2UgKi8KLQkgICBzdHJlYW1pbmc7ICAgICAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLwotCi0JdTggc2Vuc29yX2luaXRpYWxpemVkOyAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLwotCi0JLyogRGV0ZXJtaW5lZCBieSB0aGUgaW1hZ2Ugc2Vuc29yIHR5cGU6ICovCi0JaW50IHNlbnNvciwgICAgICAgLyogdHlwZSBvZiBpbWFnZSBzZW5zb3IgY2hpcCAoQ0NfKikgKi8KLQkgICAgbW9ub2Nocm9tZTsgICAvKiBpbWFnZSBzZW5zb3IgaXMgKHByb2JhYmx5KSBtb25vY2hyb21lICovCi0JdTE2IG1heHdpZHRoLCAgICAgLyogbWF4aW11bSB3aWR0aCBzdXBwb3J0ZWQgYnkgdGhlIGltYWdlIHNlbnNvciAqLwotCSAgICBtYXhoZWlnaHQsICAgIC8qIG1heGltdW0gaGVpZ2h0IHN1cHBvcnRlZCBieSB0aGUgaW1hZ2Ugc2Vuc29yICovCi0JICAgIG1pbndpZHRoLCAgICAgLyogbWluaW11bSB3aWR0aCBzdXBwb3J0ZWQgYnkgdGhlIGltYWdlIHNlbnNvciAqLwotCSAgICBtaW5oZWlnaHQ7ICAgIC8qIG1pbmltdW0gaGVpZ2h0IHN1cHBvcnRlZCBieSB0aGUgaW1hZ2Ugc2Vuc29yICovCi0JdTggIGF1dG9fYnJ0LCAgICAgLyogYXV0byBicmlnaHRuZXNzIGVuYWJsZWQgZmxhZyAqLwotCSAgICBhdXRvX2V4cCwgICAgIC8qIGF1dG8gZXhwb3N1cmUgZW5hYmxlZCBmbGFnICovCi0JICAgIGJhY2tsaWdodCwgICAgLyogYmFja2xpZ2h0IGV4cG9zdXJlIGFsZ29yaXRobSBmbGFnICovCi0JICAgIG1pcnJvciwgICAgICAgLyogaW1hZ2UgaXMgcmV2ZXJzZWQgaG9yaXpvbnRhbGx5ICovCi0JICAgIGxpZ2h0ZnJlcSwgICAgLyogcG93ZXIgKGxpZ2h0aW5nKSBmcmVxdWVuY3kgKi8KLQkgICAgYmFuZGZpbHQ7ICAgICAvKiBiYW5kaW5nIGZpbHRlciBlbmFibGVkIGZsYWcgKi8KLQlzOCAgY2xvY2tkaXY7ICAgICAvKiBjbG9jayBkaXZpc29yICovCi0KLQkvKiBJMkMgaW50ZXJmYWNlIHRvIGtlcm5lbCAqLwotCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcHRlcjsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvcl9zZDsKLQotCS8qIExvY2tzICovCi0Jc3RydWN0IG11dGV4IGRldl9tdXRleCwgICAgLyogZm9yIHByb2JlLCBkaXNjb25uZWN0LG9wZW4gYW5kIGNsb3NlICovCi0JCQkgZmlsZW9wX211dGV4OyAvKiBmb3IgcmVhZCBhbmQgaW9jdGwgKi8KLQlzcGlubG9ja190IHVyYl9sb2NrLCAgIC8qIGZvciBzdWJtaXRfdXJiKCkgYW5kIHVubGlua191cmIoKSAqLwotCQkgICBmbGlzdF9sb2NrOyAvKiBmb3IgcmVxdWVzdGVkIGZyYW1lIGxpc3QgYWNjZXNzZXMgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuLCB3YWl0X3F1ZXVlOwotCi0JY2hhciBjb21tYW5kWzE2XTsgLyogbmFtZSBvZiB0aGUgcHJvZ3JhbSBob2xkaW5nIHRoZSBkZXZpY2UgKi8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHc5OTY4Y2ZfZGV2aWNlICp0b19jYW0oc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UsIHY0bDJfZGV2KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWFjcm9zIGZvciBkZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jdW5kZWYgREJHCi0jdW5kZWYgS0RCRwotI2lmZGVmIFc5OTY4Q0ZfREVCVUcKLS8qIEZvciBkZXZpY2Ugc3BlY2lmaWMgZGVidWdnaW5nIG1lc3NhZ2VzICovCi0jCWRlZmluZSBEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKCAoKHNwZWNpZmljX2RlYnVnKSAmJiAoZGVidWcgPT0gKGxldmVsKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICgoIXNwZWNpZmljX2RlYnVnKSAmJiAoZGVidWcgPj0gKGxldmVsKSkpICkgeyAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoKGxldmVsKSA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXY0bDJfZXJyKCZjYW0tPnY0bDJfZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgIFwKLQkJZWxzZSBpZiAoKGxldmVsKSA9PSAyIHx8IChsZXZlbCkgPT0gMykgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl2NGwyX2luZm8oJmNhbS0+djRsMl9kZXYsIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgICBcCi0JCWVsc2UgaWYgKChsZXZlbCkgPT0gNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJdjRsMl93YXJuKCZjYW0tPnY0bDJfZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgXAotCQllbHNlIGlmICgobGV2ZWwpID49IDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXY0bDJfaW5mbygmY2FtLT52NGwyX2RldiwgIlslczolZF0gIiBmbXQgIlxuIiwgICAgICAgIFwKLQkJCQkgX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7ICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0vKiBGb3IgZ2VuZXJpYyBrZXJuZWwgKG5vdCBkZXZpY2Ugc3BlY2lmaWMpIG1lc3NhZ2VzICovCi0jCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKCAoKHNwZWNpZmljX2RlYnVnKSAmJiAoZGVidWcgPT0gKGxldmVsKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICgoIXNwZWNpZmljX2RlYnVnKSAmJiAoZGVidWcgPj0gKGxldmVsKSkpICkgeyAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoKGxldmVsKSA+PSAxICYmIChsZXZlbCkgPD0gNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByX2luZm8oInc5OTY4Y2Y6ICIgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgICAgICAgIFwKLQkJZWxzZSBpZiAoKGxldmVsKSA+PSA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcl9kZWJ1Zygidzk5NjhjZjogWyVzOiVkXSAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgIFwKLQkJCQkgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZWxzZQotCS8qIE5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KLSMJZGVmaW5lIERCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCk7Ci0jCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKTsKLSNlbmRpZgotCi0jdW5kZWYgUERCRwotI2RlZmluZSBQREJHKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdjRsMl9pbmZvKCZjYW0tPnY0bDJfZGV2LCAiWyVzOiVkXSAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKTsKLQotI3VuZGVmIFBEQkdHCi0jZGVmaW5lIFBEQkdHKGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApOyAvKiBub3RoaW5nOiBpdCdzIGEgcGxhY2Vob2xkZXIgKi8KLQotI2VuZGlmIC8qIF9XOTk2OENGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2ZfZGVjb2Rlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkZWNiZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2ZfZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmlkZW8gZGVjb2RlciBmb3IgdGhlIFc5OTZbODddQ0YgZHJpdmVyIGZvciBMaW51eC4gICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzIDIwMDQgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfVzk5NjhDRl9ERUNPREVSX0hfCi0jZGVmaW5lIF9XOTk2OENGX0RFQ09ERVJfSF8KLQotLyogQ29tbWVudC91bmNvbW1lbnQgdGhpcyBmb3IgaGlnaC9sb3cgcXVhbGl0eSBvZiBjb21wcmVzc2VkIHZpZGVvICovCi0jZGVmaW5lIFc5OTY4Q0ZfREVDX0ZBU1RfTE9XUVVBTElUWV9WSURFTwotCi0jaWZkZWYgVzk5NjhDRl9ERUNfRkFTVF9MT1dRVUFMSVRZX1ZJREVPCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBZX1FVQU5UQUJMRVs2NF0gPSB7Ci0JMTYsICAxMSwgIDEwLCAgMTYsICAyNCwgIDQwLCAgNTEsICA2MSwKLQkxMiwgIDEyLCAgMTQsICAxOSwgIDI2LCAgNTgsICA2MCwgIDU1LAotCTE0LCAgMTMsICAxNiwgIDI0LCAgNDAsICA1NywgIDY5LCAgNTYsCi0JMTQsICAxNywgIDIyLCAgMjksICA1MSwgIDg3LCAgODAsICA2MiwKLQkxOCwgIDIyLCAgMzcsICA1NiwgIDY4LCAxMDksIDEwMywgIDc3LAotCTI0LCAgMzUsICA1NSwgIDY0LCAgODEsIDEwNCwgMTEzLCAgOTIsCi0JNDksICA2NCwgIDc4LCAgODcsIDEwMywgMTIxLCAxMjAsIDEwMSwKLQk3MiwgIDkyLCAgOTUsICA5OCwgMTEyLCAxMDAsIDEwMywgIDk5Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVVl9RVUFOVEFCTEVbNjRdID0gewotCTE3LCAgMTgsICAyNCwgIDQ3LCAgOTksICA5OSwgIDk5LCAgOTksCi0JMTgsICAyMSwgIDI2LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwKLQkyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotCTQ3LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0JOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLQk5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotCTk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0JOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQotfTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBZX1FVQU5UQUJMRVs2NF0gPSB7Ci0JIDgsICAgNSwgICA1LCAgIDgsICAxMiwgIDIwLCAgMjUsICAzMCwKLQkgNiwgICA2LCAgIDcsICAgOSwgIDEzLCAgMjksICAzMCwgIDI3LAotCSA3LCAgIDYsICAgOCwgIDEyLCAgMjAsICAyOCwgIDM0LCAgMjgsCi0JIDcsICAgOCwgIDExLCAgMTQsICAyNSwgIDQzLCAgNDAsICAzMSwKLQkgOSwgIDExLCAgMTgsICAyOCwgIDM0LCAgNTQsICA1MSwgIDM4LAotCTEyLCAgMTcsICAyNywgIDMyLCAgNDAsICA1MiwgIDU2LCAgNDYsCi0JMjQsICAzMiwgIDM5LCAgNDMsICA1MSwgIDYwLCAgNjAsICA1MCwKLQkzNiwgIDQ2LCAgNDcsICA0OSwgIDU2LCAgNTAsICA1MSwgIDQ5Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVVl9RVUFOVEFCTEVbNjRdID0gewotCSA4LCAgIDksICAxMiwgIDIzLCAgNDksICA0OSwgIDQ5LCAgNDksCi0JIDksICAxMCwgIDEzLCAgMzMsICA0OSwgIDQ5LCAgNDksICA0OSwKLQkxMiwgIDEzLCAgMjgsICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAotCTIzLCAgMzMsICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksCi0JNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwKLQk0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAotCTQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksCi0JNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OQotfTsKLSNlbmRpZgotCi0jZGVmaW5lIFc5OTY4Q0ZfREVDX0VSUl9DT1JSVVBURURfREFUQSAgLTEKLSNkZWZpbmUgVzk5NjhDRl9ERUNfRVJSX0JVRl9PVkVSRkxPVyAgICAtMgotI2RlZmluZSBXOTk2OENGX0RFQ19FUlJfTk9fU09JICAgICAgICAgIC0zCi0jZGVmaW5lIFc5OTY4Q0ZfREVDX0VSUl9OT19TT0YwICAgICAgICAgLTQKLSNkZWZpbmUgVzk5NjhDRl9ERUNfRVJSX05PX1NPUyAgICAgICAgICAtNQotI2RlZmluZSBXOTk2OENGX0RFQ19FUlJfTk9fRU9JICAgICAgICAgIC02Ci0KLWV4dGVybiB2b2lkIHc5OTY4Y2ZfaW5pdF9kZWNvZGVyKHZvaWQpOwotZXh0ZXJuIGludCB3OTk2OGNmX2NoZWNrX2hlYWRlcnMoY29uc3QgdW5zaWduZWQgY2hhciogUGluLAotCQkJCSBjb25zdCB1bnNpZ25lZCBsb25nIEJVRl9TSVpFKTsKLWV4dGVybiBpbnQgdzk5NjhjZl9kZWNvZGUoY29uc3QgY2hhciogUGluLCBjb25zdCB1bnNpZ25lZCBsb25nIEJVRl9TSVpFLAotCQkJICBjb25zdCB1bnNpZ25lZCBXLCBjb25zdCB1bnNpZ25lZCBILCBjaGFyKiBQb3V0KTsKLQotI2VuZGlmIC8qIF9XOTk2OENGX0RFQ09ERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZl92cHAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZl92cHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjOWI2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2ZfdnBwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbnRlcmZhY2UgZm9yIHZpZGVvIHBvc3QtcHJvY2Vzc2luZyBmdW5jdGlvbnMgZm9yIHRoZSBXOTk2Wzg3XUNGIGRyaXZlciAqCi0gKiBmb3IgTGludXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9XOTk2OENGX1ZQUF9IXwotI2RlZmluZSBfVzk5NjhDRl9WUFBfSF8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi1zdHJ1Y3Qgdzk5NjhjZl92cHBfdCB7Ci0Jc3RydWN0IG1vZHVsZSogb3duZXI7Ci0JaW50ICgqY2hlY2tfaGVhZGVycykoY29uc3QgdW5zaWduZWQgY2hhciosIGNvbnN0IHVuc2lnbmVkIGxvbmcpOwotCWludCAoKmRlY29kZSkoY29uc3QgY2hhciosIGNvbnN0IHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCwgY2hhciopOwotCXZvaWQgKCpzd2FwX3l1dmJ5dGVzKSh2b2lkKiwgdW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKnV5dnlfdG9fcmdieCkodTgqLCB1bnNpZ25lZCBsb25nLCB1OCosIHUxNiwgdTgpOwotCXZvaWQgKCpzY2FsZV91cCkodTgqLCB1OCosIHUxNiwgdTE2LCB1MTYsIHUxNiwgdTE2KTsKLQotCXU4IGJ1c3k7IC8qIHJlYWQtb25seSBmbGFnOiBtb2R1bGUgaXMvaXMgbm90IGluIHVzZSAqLwotfTsKLQotI2VuZGlmIC8qIF9XOTk2OENGX1ZQUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTYxMGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWNvbmZpZyBVU0JfWkMwMzAxCi0JdHJpc3RhdGUgIlVTQiBaQzAzMDFbUF0gd2ViY2FtIHN1cHBvcnQgKERFUFJFQ0FURUQpIgotCWRlcGVuZHMgb24gVklERU9fVjRMMgotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgZ3NwY2EgemMzeHggbW9kdWxlCi0JICBpbnN0ZWFkLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFpDMDMwMSBvcgotCSAgWkMwMzAxUCBJbWFnZSBQcm9jZXNzb3JzIGFuZCBDb250cm9sIENoaXBzLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96YzAzMDEudHh0PiBmb3IgbW9yZSBpbmZvLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB6YzAzMDEuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU2ZDk3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi16YzAzMDEtb2JqcyAgICAgOj0gemMwMzAxX2NvcmUubyB6YzAzMDFfcGIwMzMwLm8gemMwMzAxX3BhczIwMmJjYi5vCi0KLW9iai0kKENPTkZJR19VU0JfWkMwMzAxKSAgICAgICAgKz0gemMwMzAxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjVjY2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVjRMMiBkcml2ZXIgZm9yIFpDMDMwMVtQXSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfWkMwMzAxX0hfCi0jZGVmaW5lIF9aQzAzMDFfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgotCi0jaW5jbHVkZSAiemMwMzAxX3NlbnNvci5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgWkMwMzAxX0RFQlVHCi0jZGVmaW5lIFpDMDMwMV9ERUJVR19MRVZFTCAgICAgICAgIDIKLSNkZWZpbmUgWkMwMzAxX01BWF9ERVZJQ0VTICAgICAgICAgNjQKLSNkZWZpbmUgWkMwMzAxX0ZPUkNFX01VTk1BUCAgICAgICAgMAotI2RlZmluZSBaQzAzMDFfTUFYX0ZSQU1FUyAgICAgICAgICAzMgotI2RlZmluZSBaQzAzMDFfQ09NUFJFU1NJT05fUVVBTElUWSAwCi0jZGVmaW5lIFpDMDMwMV9VUkJTICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgWkMwMzAxX0lTT19QQUNLRVRTICAgICAgICAgNwotI2RlZmluZSBaQzAzMDFfQUxURVJOQVRFX1NFVFRJTkcgICA3Ci0jZGVmaW5lIFpDMDMwMV9VUkJfVElNRU9VVCAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMiAqIFpDMDMwMV9JU09fUEFDS0VUUykKLSNkZWZpbmUgWkMwMzAxX0NUUkxfVElNRU9VVCAgICAgICAgMTAwCi0jZGVmaW5lIFpDMDMwMV9GUkFNRV9USU1FT1VUICAgICAgIDIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1aQzAzMDFfSURfVEFCTEUKLVpDMDMwMV9TRU5TT1JfVEFCTEUKLQotZW51bSB6YzAzMDFfZnJhbWVfc3RhdGUgewotCUZfVU5VU0VELAotCUZfUVVFVUVELAotCUZfR1JBQkJJTkcsCi0JRl9ET05FLAotCUZfRVJST1IsCi19OwotCi1zdHJ1Y3QgemMwMzAxX2ZyYW1lX3QgewotCXZvaWQqIGJ1Zm1lbTsKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOwotCWVudW0gemMwMzAxX2ZyYW1lX3N0YXRlIHN0YXRlOwotCXN0cnVjdCBsaXN0X2hlYWQgZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyB2bWFfdXNlX2NvdW50OwotfTsKLQotZW51bSB6YzAzMDFfZGV2X3N0YXRlIHsKLQlERVZfSU5JVElBTElaRUQgPSAweDAxLAotCURFVl9ESVNDT05ORUNURUQgPSAweDAyLAotCURFVl9NSVNDT05GSUdVUkVEID0gMHgwNCwKLX07Ci0KLWVudW0gemMwMzAxX2lvX21ldGhvZCB7Ci0JSU9fTk9ORSwKLQlJT19SRUFELAotCUlPX01NQVAsCi19OwotCi1lbnVtIHpjMDMwMV9zdHJlYW1fc3RhdGUgewotCVNUUkVBTV9PRkYsCi0JU1RSRUFNX0lOVEVSUlVQVCwKLQlTVFJFQU1fT04sCi19OwotCi1zdHJ1Y3QgemMwMzAxX21vZHVsZV9wYXJhbSB7Ci0JdTggZm9yY2VfbXVubWFwOwotCXUxNiBmcmFtZV90aW1lb3V0OwotfTsKLQotc3RhdGljIERFQ0xBUkVfUldTRU0oemMwMzAxX2Rldl9sb2NrKTsKLQotc3RydWN0IHpjMDMwMV9kZXZpY2UgewotCXN0cnVjdCB2aWRlb19kZXZpY2UqIHY0bGRldjsKLQotCXN0cnVjdCB6YzAzMDFfc2Vuc29yIHNlbnNvcjsKLQotCXN0cnVjdCB1c2JfZGV2aWNlKiB1c2JkZXY7Ci0Jc3RydWN0IHVyYiogdXJiW1pDMDMwMV9VUkJTXTsKLQl2b2lkKiB0cmFuc2Zlcl9idWZmZXJbWkMwMzAxX1VSQlNdOwotCXU4KiBjb250cm9sX2J1ZmZlcjsKLQotCXN0cnVjdCB6YzAzMDFfZnJhbWVfdCAqZnJhbWVfY3VycmVudCwgZnJhbWVbWkMwMzAxX01BWF9GUkFNRVNdOwotCXN0cnVjdCBsaXN0X2hlYWQgaW5xdWV1ZSwgb3V0cXVldWU7Ci0JdTMyIGZyYW1lX2NvdW50LCBuYnVmZmVycywgbnJlYWRidWZmZXJzOwotCi0JZW51bSB6YzAzMDFfaW9fbWV0aG9kIGlvOwotCWVudW0gemMwMzAxX3N0cmVhbV9zdGF0ZSBzdHJlYW07Ci0KLQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gY29tcHJlc3Npb247Ci0KLQlzdHJ1Y3QgemMwMzAxX21vZHVsZV9wYXJhbSBtb2R1bGVfcGFyYW07Ci0KLQlzdHJ1Y3Qga3JlZiBrcmVmOwotCWVudW0gemMwMzAxX2Rldl9zdGF0ZSBzdGF0ZTsKLQl1OCB1c2VyczsKLQotCXN0cnVjdCBjb21wbGV0aW9uIHByb2JlOwotCXN0cnVjdCBtdXRleCBvcGVuX211dGV4LCBmaWxlb3BfbXV0ZXg7Ci0Jc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfb3Blbiwgd2FpdF9mcmFtZSwgd2FpdF9zdHJlYW07Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCB6YzAzMDFfZGV2aWNlKgotemMwMzAxX21hdGNoX2lkKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlyZXR1cm4gdXNiX21hdGNoX2lkKHVzYl9pZm51bV90b19pZihjYW0tPnVzYmRldiwgMCksIGlkKSA/IGNhbSA6IE5VTEw7Ci19Ci0KLXZvaWQKLXpjMDMwMV9hdHRhY2hfc2Vuc29yKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzZW5zb3IpCi17Ci0JbWVtY3B5KCZjYW0tPnNlbnNvciwgc2Vuc29yLCBzaXplb2Yoc3RydWN0IHpjMDMwMV9zZW5zb3IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jdW5kZWYgREJHCi0jdW5kZWYgS0RCRwotI2lmZGVmIFpDMDMwMV9ERUJVRwotIwlkZWZpbmUgREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmICgobGV2ZWwpID09IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJZGV2X2VycigmY2FtLT51c2JkZXYtPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgXAotCQllbHNlIGlmICgobGV2ZWwpID09IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWRldl9pbmZvKCZjYW0tPnVzYmRldi0+ZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgIFwKLQkJZWxzZSBpZiAoKGxldmVsKSA+PSAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgIlslczolczolZF0gIiBmbXQgIlxuIiwgICBcCi0JCQkJIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKTsgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotIwlkZWZpbmUgS0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmICgobGV2ZWwpID09IDEgfHwgKGxldmVsKSA9PSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJfaW5mbygiemMwMzAxOiAiIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgICAgICAgICAgXAotCQllbHNlIGlmICgobGV2ZWwpID09IDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByX2RlYnVnKCJzbjljMTAyOiBbJXM6JXM6JWRdICIgZm10ICJcbiIsIF9fRklMRV9fLCAgIFwKLQkJCQkgX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7ICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0jCWRlZmluZSBWNExEQkcobGV2ZWwsIG5hbWUsIGNtZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGRlYnVnID49IChsZXZlbCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJdjRsX3ByaW50X2lvY3RsKG5hbWUsIGNtZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotI2Vsc2UKLSMJZGVmaW5lIERCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCkKLSMJZGVmaW5lIEtEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApCi0jCWRlZmluZSBWNExEQkcobGV2ZWwsIG5hbWUsIGNtZCkgZG8gezt9IHdoaWxlKDApCi0jZW5kaWYKLQotI3VuZGVmIFBEQkcKLSNkZWZpbmUgUERCRyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRldl9pbmZvKCZjYW0tPnVzYmRldi0+ZGV2LCAiWyVzOiVzOiVkXSAiIGZtdCAiXG4iLCBfX0ZJTEVfXywgX19mdW5jX18sICAgXAotCSBfX0xJTkVfXyAsICMjIGFyZ3MpCi0KLSN1bmRlZiBQREJHRwotI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKSAvKiBwbGFjZWhvbGRlciAqLwotCi0jZW5kaWYgLyogX1pDMDMwMV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTFjZmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmlkZW80TGludXgyIGRyaXZlciBmb3IgWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogSW5mb3JtYXRpb25zIGFib3V0IHRoZSBjaGlwIGludGVybmFscyBuZWVkZWQgdG8gZW5hYmxlIHRoZSBJMkMgcHJvdG9jb2wgKgotICogaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIFpDMDMweCBWaWRlbzRMaW51eDEgICAgICAgKgotICogZHJpdmVyIHdyaXR0ZW4gYnkgQW5kcmV3IEJpcmtldHQgPGFuZHlAbm9idWdzLm9yZz4gICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgInpjMDMwMS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgWkMwMzAxX01PRFVMRV9OQU1FICAgICJWNEwyIGRyaXZlciBmb3IgWkMwMzAxW1BdICIgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICAgICJJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCIKLSNkZWZpbmUgWkMwMzAxX01PRFVMRV9BVVRIT1IgICIoQykgMjAwNi0yMDA3IEx1Y2EgUmlzb2xpYSIKLSNkZWZpbmUgWkMwMzAxX0FVVEhPUl9FTUFJTCAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCi0jZGVmaW5lIFpDMDMwMV9NT0RVTEVfTElDRU5TRSAiR1BMIgotI2RlZmluZSBaQzAzMDFfTU9EVUxFX1ZFUlNJT04gIjE6MS4xMCIKLSNkZWZpbmUgWkMwMzAxX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDEsIDEwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB6YzAzMDFfaWRfdGFibGUpOwotCi1NT0RVTEVfQVVUSE9SKFpDMDMwMV9NT0RVTEVfQVVUSE9SICIgIiBaQzAzMDFfQVVUSE9SX0VNQUlMKTsKLU1PRFVMRV9ERVNDUklQVElPTihaQzAzMDFfTU9EVUxFX05BTUUpOwotTU9EVUxFX1ZFUlNJT04oWkMwMzAxX01PRFVMRV9WRVJTSU9OKTsKLU1PRFVMRV9MSUNFTlNFKFpDMDMwMV9NT0RVTEVfTElDRU5TRSk7Ci0KLXN0YXRpYyBzaG9ydCB2aWRlb19ucltdID0ge1swIC4uLiBaQzAzMDFfTUFYX0RFVklDRVMtMV0gPSAtMX07Ci1tb2R1bGVfcGFyYW1fYXJyYXkodmlkZW9fbnIsIHNob3J0LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsCi0JCSAiXG48LTF8blssLi4uXT4gU3BlY2lmeSBWNEwyIG1pbm9yIG1vZGUgbnVtYmVyLiIKLQkJICJcbiAtMSA9IHVzZSBuZXh0IGF2YWlsYWJsZSAoZGVmYXVsdCkiCi0JCSAiXG4gIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4gKGludGVnZXIgPj0gMCkiCi0JCSAiXG5Zb3UgY2FuIHNwZWNpZnkgdXAgdG8gIgotCQkgX19NT0RVTEVfU1RSSU5HKFpDMDMwMV9NQVhfREVWSUNFUykgIiBjYW1lcmFzIHRoaXMgd2F5LiIKLQkJICJcbkZvciBleGFtcGxlOiIKLQkJICJcbnZpZGVvX25yPS0xLDIsLTEgd291bGQgYXNzaWduIG1pbm9yIG51bWJlciAyIHRvIgotCQkgIlxudGhlIHNlY29uZCByZWdpc3RlcmVkIGNhbWVyYSBhbmQgdXNlIGF1dG8gZm9yIHRoZSBmaXJzdCIKLQkJICJcbm9uZSBhbmQgZm9yIGV2ZXJ5IG90aGVyIGNhbWVyYS4iCi0JCSAiXG4iKTsKLQotc3RhdGljIHNob3J0IGZvcmNlX211bm1hcFtdID0ge1swIC4uLiBaQzAzMDFfTUFYX0RFVklDRVMtMV0gPQotCQkJICAgICAgIFpDMDMwMV9GT1JDRV9NVU5NQVB9OwotbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX211bm1hcCwgYm9vbCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX211bm1hcCwKLQkJICJcbjwwfDFbLC4uLl0+IEZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byB1bm1hcCBwcmV2aW91c2x5IgotCQkgIlxubWFwcGVkIGJ1ZmZlciBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgYW55IFZJRElPQ19TX0NST1Agb3IiCi0JCSAiXG5WSURJT0NfU19GTVQgaW9jdGwncy4gTm90IGFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQiCi0JCSAiXG50aGlzIGZlYXR1cmUuIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmljIGZvciBlYWNoIgotCQkgIlxuZGV0ZWN0ZWQgY2FtZXJhLiIKLQkJICJcbiAwID0gZG8gbm90IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmciCi0JCSAiXG4gMSA9IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcgKHNhdmUgbWVtb3J5KSIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhaQzAzMDFfRk9SQ0VfTVVOTUFQKSIuIgotCQkgIlxuIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZnJhbWVfdGltZW91dFtdID0ge1swIC4uLiBaQzAzMDFfTUFYX0RFVklDRVMtMV0gPQotCQkJCSAgICAgICBaQzAzMDFfRlJBTUVfVElNRU9VVH07Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZnJhbWVfdGltZW91dCwgdWludCwgTlVMTCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZyYW1lX3RpbWVvdXQsCi0JCSAiXG48blssLi4uXT4gVGltZW91dCBmb3IgYSB2aWRlbyBmcmFtZSBpbiBzZWNvbmRzLiIKLQkJICJcblRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmljIGZvciBlYWNoIGRldGVjdGVkIGNhbWVyYS4iCi0JCSAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoWkMwMzAxX0ZSQU1FX1RJTUVPVVQpIi4iCi0JCSAiXG4iKTsKLQotI2lmZGVmIFpDMDMwMV9ERUJVRwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGRlYnVnID0gWkMwMzAxX0RFQlVHX0xFVkVMOwotbW9kdWxlX3BhcmFtKGRlYnVnLCB1c2hvcnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKLQkJICJcbjxuPiBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24gbGV2ZWwsIGZyb20gMCB0byAzOiIKLQkJICJcbjAgPSBub25lICh1c2UgY2FyZWZ1bGx5KSIKLQkJICJcbjEgPSBjcml0aWNhbCBlcnJvcnMiCi0JCSAiXG4yID0gc2lnbmlmaWNhbnQgaW5mb3JtYXRpb25zIgotCQkgIlxuMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcyIKLQkJICJcbkxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSAiCi0JCSAib25lIGRldmljZSBpcyB1c2VkLiIKLQkJICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhaQzAzMDFfREVCVUdfTEVWRUwpIi4iCi0JCSAiXG4iKTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIKLXpjMDMwMV9yZXF1ZXN0X2J1ZmZlcnMoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdTMyIGNvdW50LAotCQkgICAgICAgZW51bSB6YzAzMDFfaW9fbWV0aG9kIGlvKQotewotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHAgPSAmKGNhbS0+c2Vuc29yLnBpeF9mb3JtYXQpOwotCXN0cnVjdCB2NGwyX3JlY3QqIHIgPSAmKGNhbS0+c2Vuc29yLmNyb3BjYXAuYm91bmRzKTsKLQljb25zdCBzaXplX3QgaW1hZ2VzaXplID0gY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwIHx8Ci0JCQkJIGlvID09IElPX1JFQUQgPwotCQkJCSAocC0+d2lkdGggKiBwLT5oZWlnaHQgKiBwLT5wcml2KSAvIDggOgotCQkJCSAoci0+d2lkdGggKiByLT5oZWlnaHQgKiBwLT5wcml2KSAvIDg7Ci0Jdm9pZCogYnVmZiA9IE5VTEw7Ci0JdTMyIGk7Ci0KLQlpZiAoY291bnQgPiBaQzAzMDFfTUFYX0ZSQU1FUykKLQkJY291bnQgPSBaQzAzMDFfTUFYX0ZSQU1FUzsKLQotCWNhbS0+bmJ1ZmZlcnMgPSBjb3VudDsKLQl3aGlsZSAoY2FtLT5uYnVmZmVycyA+IDApIHsKLQkJaWYgKChidWZmID0gdm1hbGxvY18zMl91c2VyKGNhbS0+bmJ1ZmZlcnMgKgotCQkJCQkgICAgUEFHRV9BTElHTihpbWFnZXNpemUpKSkpCi0JCQlicmVhazsKLQkJY2FtLT5uYnVmZmVycy0tOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspIHsKLQkJY2FtLT5mcmFtZVtpXS5idWZtZW0gPSBidWZmICsgaSpQQUdFX0FMSUdOKGltYWdlc2l6ZSk7Ci0JCWNhbS0+ZnJhbWVbaV0uYnVmLmluZGV4ID0gaTsKLQkJY2FtLT5mcmFtZVtpXS5idWYubS5vZmZzZXQgPSBpKlBBR0VfQUxJR04oaW1hZ2VzaXplKTsKLQkJY2FtLT5mcmFtZVtpXS5idWYubGVuZ3RoID0gaW1hZ2VzaXplOwotCQljYW0tPmZyYW1lW2ldLmJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQljYW0tPmZyYW1lW2ldLmJ1Zi5zZXF1ZW5jZSA9IDA7Ci0JCWNhbS0+ZnJhbWVbaV0uYnVmLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCQljYW0tPmZyYW1lW2ldLmJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQljYW0tPmZyYW1lW2ldLmJ1Zi5mbGFncyA9IDA7Ci0JfQotCi0JcmV0dXJuIGNhbS0+bmJ1ZmZlcnM7Ci19Ci0KLQotc3RhdGljIHZvaWQgemMwMzAxX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtKQotewotCWlmIChjYW0tPm5idWZmZXJzKSB7Ci0JCXZmcmVlKGNhbS0+ZnJhbWVbMF0uYnVmbWVtKTsKLQkJY2FtLT5uYnVmZmVycyA9IDA7Ci0JfQotCWNhbS0+ZnJhbWVfY3VycmVudCA9IE5VTEw7Ci19Ci0KLQotc3RhdGljIHZvaWQgemMwMzAxX2VtcHR5X2ZyYW1lcXVldWVzKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pCi17Ci0JdTMyIGk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5pbnF1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5vdXRxdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgWkMwMzAxX01BWF9GUkFNRVM7IGkrKykgewotCQljYW0tPmZyYW1lW2ldLnN0YXRlID0gRl9VTlVTRUQ7Ci0JCWNhbS0+ZnJhbWVbaV0uYnVmLmJ5dGVzdXNlZCA9IDA7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIHpjMDMwMV9yZXF1ZXVlX291dHF1ZXVlKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pCi17Ci0Jc3RydWN0IHpjMDMwMV9mcmFtZV90ICppOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmY2FtLT5vdXRxdWV1ZSwgZnJhbWUpIHsKLQkJaS0+c3RhdGUgPSBGX1FVRVVFRDsKLQkJbGlzdF9hZGQoJmktPmZyYW1lLCAmY2FtLT5pbnF1ZXVlKTsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5vdXRxdWV1ZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgemMwMzAxX3F1ZXVlX3VudXNlZGZyYW1lcyhzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtKQotewotCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspCi0JCWlmIChjYW0tPmZyYW1lW2ldLnN0YXRlID09IEZfVU5VU0VEKSB7Ci0JCQljYW0tPmZyYW1lW2ldLnN0YXRlID0gRl9RVUVVRUQ7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmNhbS0+ZnJhbWVbaV0uZnJhbWUsICZjYW0tPmlucXVldWUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCB6YzAzMDFfd3JpdGVfcmVnKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCwgdTE2IHZhbHVlKQotewotCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7Ci0JaW50IHJlczsKLQotCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDB4YTAsIDB4NDAsCi0JCQkgICAgICB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIFpDMDMwMV9DVFJMX1RJTUVPVVQpOwotCWlmIChyZXMgPCAwKSB7Ci0JCURCRygzLCAiRmFpbGVkIHRvIHdyaXRlIGEgcmVnaXN0ZXIgKGluZGV4IDB4JTA0WCwgIgotCQkgICAgICAgInZhbHVlIDB4JTAyWCwgZXJyb3IgJWQpIixpbmRleCwgdmFsdWUsIHJlcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgemMwMzAxX3JlYWRfcmVnKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OwotCXU4KiBidWZmID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKLQlpbnQgcmVzOwotCi0JcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMHhhMSwgMHhjMCwKLQkJCSAgICAgIDB4MDAwMSwgaW5kZXgsIGJ1ZmYsIDEsIFpDMDMwMV9DVFJMX1RJTUVPVVQpOwotCWlmIChyZXMgPCAwKQotCQlEQkcoMywgIkZhaWxlZCB0byByZWFkIGEgcmVnaXN0ZXIgKGluZGV4IDB4JTA0WCwgZXJyb3IgJWQpIiwKLQkJICAgIGluZGV4LCByZXMpOwotCi0JUERCR0coIlJlYWQ6IGluZGV4IDB4JTA0WCwgdmFsdWU6IDB4JTA0WCIsIGluZGV4LCAoaW50KSgqYnVmZikpOwotCi0JcmV0dXJuIChyZXMgPj0gMCkgPyAoaW50KSgqYnVmZikgOiAtMTsKLX0KLQotCi1pbnQgemMwMzAxX2kyY19yZWFkKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHUxNiBhZGRyZXNzLCB1OCBsZW5ndGgpCi17Ci0JaW50IGVyciA9IDAsIHJlcywgcjAsIHIxOwotCi0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOTIsIGFkZHJlc3MpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDkwLCAweDAyKTsKLQotCW1zbGVlcCgxKTsKLQotCXJlcyA9IHpjMDMwMV9yZWFkX3JlZyhjYW0sIDB4MDA5MSk7Ci0JaWYgKHJlcyA8IDApCi0JCWVyciArPSByZXM7Ci0JcjAgPSB6YzAzMDFfcmVhZF9yZWcoY2FtLCAweDAwOTUpOwotCWlmIChyMCA8IDApCi0JCWVyciArPSByMDsKLQlyMSA9IHpjMDMwMV9yZWFkX3JlZyhjYW0sIDB4MDA5Nik7Ci0JaWYgKHIxIDwgMCkKLQkJZXJyICs9IHIxOwotCi0JcmVzID0gKGxlbmd0aCA8PSAxKSA/IHIwIDogcjAgfCAocjEgPDwgOCk7Ci0KLQlpZiAoZXJyKQotCQlEQkcoMywgIkkyQyByZWFkIGZhaWxlZCBhdCBhZGRyZXNzIDB4JTA0WCwgdmFsdWU6IDB4JTA0WCIsCi0JCSAgICBhZGRyZXNzLCByZXMpOwotCi0KLQlQREJHRygiSTJDIHJlYWQ6IGFkZHJlc3MgMHglMDRYLCB2YWx1ZTogMHglMDRYIiwgYWRkcmVzcywgcmVzKTsKLQotCXJldHVybiBlcnIgPyAtMSA6IHJlczsKLX0KLQotCi1pbnQgemMwMzAxX2kyY193cml0ZShzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLCB1MTYgYWRkcmVzcywgdTE2IHZhbHVlKQotewotCWludCBlcnIgPSAwLCByZXM7Ci0KLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA5MiwgYWRkcmVzcyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOTMsIHZhbHVlICYgMHhmZik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOTQsIHZhbHVlID4+IDgpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDkwLCAweDAxKTsKLQotCW1zbGVlcCgxKTsKLQotCXJlcyA9IHpjMDMwMV9yZWFkX3JlZyhjYW0sIDB4MDA5MSk7Ci0JaWYgKHJlcyA8IDApCi0JCWVyciArPSByZXM7Ci0KLQlpZiAoZXJyKQotCQlEQkcoMywgIkkyQyB3cml0ZSBmYWlsZWQgYXQgYWRkcmVzcyAweCUwNFgsIHZhbHVlOiAweCUwNFgiLAotCQkgICAgYWRkcmVzcywgdmFsdWUpOwotCi0JUERCR0coIkkyQyB3cml0ZTogYWRkcmVzcyAweCUwNFgsIHZhbHVlOiAweCUwNFgiLCBhZGRyZXNzLCB2YWx1ZSk7Ci0KLQlyZXR1cm4gZXJyID8gLTEgOiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHpjMDMwMV91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0gPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHpjMDMwMV9mcmFtZV90KiogZjsKLQlzaXplX3QgaW1hZ2VzaXplOwotCXU4IGk7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCkKLQkJcmV0dXJuOwotCi0JZiA9ICZjYW0tPmZyYW1lX2N1cnJlbnQ7Ci0KLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX0lOVEVSUlVQVCkgewotCQljYW0tPnN0cmVhbSA9IFNUUkVBTV9PRkY7Ci0JCWlmICgoKmYpKQotCQkJKCpmKS0+c3RhdGUgPSBGX1FVRVVFRDsKLQkJREJHKDMsICJTdHJlYW0gaW50ZXJydXB0ZWQiKTsKLQkJd2FrZV91cCgmY2FtLT53YWl0X3N0cmVhbSk7Ci0JfQotCi0JaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQotCQlyZXR1cm47Ci0KLQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X2ZyYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT0ZGIHx8IGxpc3RfZW1wdHkoJmNhbS0+aW5xdWV1ZSkpCi0JCWdvdG8gcmVzdWJtaXRfdXJiOwotCi0JaWYgKCEoKmYpKQotCQkoKmYpID0gbGlzdF9lbnRyeShjYW0tPmlucXVldWUubmV4dCwgc3RydWN0IHpjMDMwMV9mcmFtZV90LAotCQkJCSAgZnJhbWUpOwotCi0JaW1hZ2VzaXplID0gKGNhbS0+c2Vuc29yLnBpeF9mb3JtYXQud2lkdGggKgotCQkgICAgIGNhbS0+c2Vuc29yLnBpeF9mb3JtYXQuaGVpZ2h0ICoKLQkJICAgICBjYW0tPnNlbnNvci5waXhfZm9ybWF0LnByaXYpIC8gODsKLQotCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGxlbiwgc3RhdHVzOwotCQl2b2lkICpwb3M7Ci0JCXUxNiogc29pOwotCQl1OCBzb2Y7Ci0KLQkJbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwotCQlzdGF0dXMgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKLQkJcG9zID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgKyB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQotCQlpZiAoc3RhdHVzKSB7Ci0JCQlEQkcoMywgIkVycm9yIGluIGlzb2Nocm9ub3VzIGZyYW1lIik7Ci0JCQkoKmYpLT5zdGF0ZSA9IEZfRVJST1I7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXNvZiA9ICgqKHNvaSA9IHBvcykgPT0gMHhkOGZmKTsKLQotCQlQREJHRygiSXNvY2hybm91cyBmcmFtZTogbGVuZ3RoICV1LCAjJXUgaSwiLCBsZW4sIGkpOwotCi0JCWlmICgoKmYpLT5zdGF0ZSA9PSBGX1FVRVVFRCB8fCAoKmYpLT5zdGF0ZSA9PSBGX0VSUk9SKQotc3RhcnRfb2ZfZnJhbWU6Ci0JCQlpZiAoc29mKSB7Ci0JCQkJKCpmKS0+c3RhdGUgPSBGX0dSQUJCSU5HOwotCQkJCSgqZiktPmJ1Zi5ieXRlc3VzZWQgPSAwOwotCQkJCWRvX2dldHRpbWVvZmRheSgmKCpmKS0+YnVmLnRpbWVzdGFtcCk7Ci0JCQkJREJHKDMsICJTT0YgZGV0ZWN0ZWQ6IG5ldyB2aWRlbyBmcmFtZSIpOwotCQkJfQotCi0JCWlmICgoKmYpLT5zdGF0ZSA9PSBGX0dSQUJCSU5HKSB7Ci0JCQlpZiAoc29mICYmICgqZiktPmJ1Zi5ieXRlc3VzZWQpCi0JCQkJCWdvdG8gZW5kX29mX2ZyYW1lOwotCi0JCQlpZiAoKCpmKS0+YnVmLmJ5dGVzdXNlZCArIGxlbiA+IGltYWdlc2l6ZSkgewotCQkJCURCRygzLCAiVmlkZW8gZnJhbWUgc2l6ZSBleGNlZWRlZCIpOwotCQkJCSgqZiktPnN0YXRlID0gRl9FUlJPUjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJbWVtY3B5KCgqZiktPmJ1Zm1lbSsoKmYpLT5idWYuYnl0ZXN1c2VkLCBwb3MsIGxlbik7Ci0JCQkoKmYpLT5idWYuYnl0ZXN1c2VkICs9IGxlbjsKLQotCQkJaWYgKCgqZiktPmJ1Zi5ieXRlc3VzZWQgPT0gaW1hZ2VzaXplKSB7Ci0JCQkJdTMyIGI7Ci1lbmRfb2ZfZnJhbWU6Ci0JCQkJYiA9ICgqZiktPmJ1Zi5ieXRlc3VzZWQ7Ci0JCQkJKCpmKS0+c3RhdGUgPSBGX0RPTkU7Ci0JCQkJKCpmKS0+YnVmLnNlcXVlbmNlPSArK2NhbS0+ZnJhbWVfY291bnQ7Ci0JCQkJc3Bpbl9sb2NrKCZjYW0tPnF1ZXVlX2xvY2spOwotCQkJCWxpc3RfbW92ZV90YWlsKCYoKmYpLT5mcmFtZSwgJmNhbS0+b3V0cXVldWUpOwotCQkJCWlmICghbGlzdF9lbXB0eSgmY2FtLT5pbnF1ZXVlKSkKLQkJCQkJKCpmKSA9IGxpc3RfZW50cnkoY2FtLT5pbnF1ZXVlLm5leHQsCi0JCQkJCQkgICAgICAgc3RydWN0IHpjMDMwMV9mcmFtZV90LAotCQkJCQkJCSAgZnJhbWUpOwotCQkJCWVsc2UKLQkJCQkJKCpmKSA9IE5VTEw7Ci0JCQkJc3Bpbl91bmxvY2soJmNhbS0+cXVldWVfbG9jayk7Ci0JCQkJREJHKDMsICJWaWRlbyBmcmFtZSBjYXB0dXJlZDogOiAlbHUgYnl0ZXMiLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykoYikpOwotCi0JCQkJaWYgKCEoKmYpKQotCQkJCQlnb3RvIHJlc3VibWl0X3VyYjsKLQotCQkJCWlmIChzb2YpCi0JCQkJCWdvdG8gc3RhcnRfb2ZfZnJhbWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLXJlc3VibWl0X3VyYjoKLQl1cmItPmRldiA9IGNhbS0+dXNiZGV2OwotCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FUEVSTSkgewotCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwotCQlEQkcoMSwgInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIik7Ci0JfQotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfZnJhbWUpOwotfQotCi0KLXN0YXRpYyBpbnQgemMwMzAxX3N0YXJ0X3RyYW5zZmVyKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlKiBhbHRzZXR0aW5nID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKAotCQkJCQkJICAgICB1c2JfaWZudW1fdG9faWYodWRldiwgMCksCi0JCQkJCQkgICAgIFpDMDMwMV9BTFRFUk5BVEVfU0VUVElORyk7Ci0JY29uc3QgdW5zaWduZWQgaW50IHBzeiA9IGxlMTZfdG9fY3B1KGFsdHNldHRpbmctPgotCQkJCQkgICAgIGVuZHBvaW50WzBdLmRlc2Mud01heFBhY2tldFNpemUpOwotCXN0cnVjdCB1cmIqIHVyYjsKLQlzOCBpLCBqOwotCWludCBlcnIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IFpDMDMwMV9VUkJTOyBpKyspIHsKLQkJY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0gPSBremFsbG9jKFpDMDMwMV9JU09fUEFDS0VUUyAqIHBzeiwKLQkJCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0pIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlEQkcoMSwgIk5vdCBlbm91Z2ggbWVtb3J5Iik7Ci0JCQlnb3RvIGZyZWVfYnVmZmVyczsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBaQzAzMDFfVVJCUzsgaSsrKSB7Ci0JCXVyYiA9IHVzYl9hbGxvY191cmIoWkMwMzAxX0lTT19QQUNLRVRTLCBHRlBfS0VSTkVMKTsKLQkJY2FtLT51cmJbaV0gPSB1cmI7Ci0JCWlmICghdXJiKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJREJHKDEsICJ1c2JfYWxsb2NfdXJiKCkgZmFpbGVkIik7Ci0JCQlnb3RvIGZyZWVfdXJiczsKLQkJfQotCQl1cmItPmRldiA9IHVkZXY7Ci0JCXVyYi0+Y29udGV4dCA9IGNhbTsKLQkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHVkZXYsIDEpOwotCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOwotCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gWkMwMzAxX0lTT19QQUNLRVRTOwotCQl1cmItPmNvbXBsZXRlID0gemMwMzAxX3VyYl9jb21wbGV0ZTsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXTsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gcHN6ICogWkMwMzAxX0lTT19QQUNLRVRTOwotCQl1cmItPmludGVydmFsID0gMTsKLQkJZm9yIChqID0gMDsgaiA8IFpDMDMwMV9JU09fUEFDS0VUUzsgaisrKSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IHBzeiAqIGo7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBzejsKLQkJfQotCX0KLQotCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIDAsIFpDMDMwMV9BTFRFUk5BVEVfU0VUVElORyk7Ci0JaWYgKGVycikgewotCQlEQkcoMSwgInVzYl9zZXRfaW50ZXJmYWNlKCkgZmFpbGVkIik7Ci0JCWdvdG8gZnJlZV91cmJzOwotCX0KLQotCWNhbS0+ZnJhbWVfY3VycmVudCA9IE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgWkMwMzAxX1VSQlM7IGkrKykgewotCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjYW0tPnVyYltpXSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlcnIpIHsKLQkJCWZvciAoaiA9IGktMTsgaiA+PSAwOyBqLS0pCi0JCQkJdXNiX2tpbGxfdXJiKGNhbS0+dXJiW2pdKTsKLQkJCURCRygxLCAidXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQsIGVycm9yICVkIiwgZXJyKTsKLQkJCWdvdG8gZnJlZV91cmJzOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZyZWVfdXJiczoKLQlmb3IgKGkgPSAwOyAoaSA8IFpDMDMwMV9VUkJTKSAmJiBjYW0tPnVyYltpXTsgaSsrKQotCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbaV0pOwotCi1mcmVlX2J1ZmZlcnM6Ci0JZm9yIChpID0gMDsgKGkgPCBaQzAzMDFfVVJCUykgJiYgY2FtLT50cmFuc2Zlcl9idWZmZXJbaV07IGkrKykKLQkJa2ZyZWUoY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0pOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgaW50IHpjMDMwMV9zdG9wX3RyYW5zZmVyKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKLQlzOCBpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IFpDMDMwMV9VUkJTLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCXVzYl9raWxsX3VyYihjYW0tPnVyYltpXSk7Ci0JCXVzYl9mcmVlX3VyYihjYW0tPnVyYltpXSk7Ci0JCWtmcmVlKGNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldKTsKLQl9Ci0KLQllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCAwLCAwKTsgLyogMCBNYi9zICovCi0JaWYgKGVycikKLQkJREJHKDMsICJ1c2Jfc2V0X2ludGVyZmFjZSgpIGZhaWxlZCIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgaW50IHpjMDMwMV9zdHJlYW1faW50ZXJydXB0KHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pCi17Ci0JbG9uZyB0aW1lb3V0OwotCi0JY2FtLT5zdHJlYW0gPSBTVFJFQU1fSU5URVJSVVBUOwotCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT53YWl0X3N0cmVhbSwKLQkJCQkgICAgIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT0ZGKSB8fAotCQkJCSAgICAgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSwKLQkJCQkgICAgIFpDMDMwMV9VUkJfVElNRU9VVCk7Ci0JaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQotCQlyZXR1cm4gLUVOT0RFVjsKLQllbHNlIGlmIChjYW0tPnN0cmVhbSAhPSBTVFJFQU1fT0ZGKSB7Ci0JCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7Ci0JCURCRygxLCAiVVJCIHRpbWVvdXQgcmVhY2hlZC4gVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBUbyAiCi0JCSAgICAgICAidXNlIGl0LCBjbG9zZSBhbmQgb3BlbiAlcyBhZ2Fpbi4iLAotCQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci16YzAzMDFfc2V0X2NvbXByZXNzaW9uKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sCi0JCSAgICAgICBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24qIGNvbXByZXNzaW9uKQotewotCWludCByLCBlcnIgPSAwOwotCi0JaWYgKChyID0gemMwMzAxX3JlYWRfcmVnKGNhbSwgMHgwMDA4KSkgPCAwKQotCQllcnIgKz0gcjsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwOCwgciB8IDB4MTEgfCBjb21wcmVzc2lvbi0+cXVhbGl0eSk7Ci0KLQlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Ci19Ci0KLQotc3RhdGljIGludCB6YzAzMDFfaW5pdChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtKQotewotCXN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzID0gJmNhbS0+c2Vuc29yOwotCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOwotCXN0cnVjdCB2NGwyX3JlY3QqIHJlY3Q7Ci0JdTggaSA9IDA7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoIShjYW0tPnN0YXRlICYgREVWX0lOSVRJQUxJWkVEKSkgewotCQltdXRleF9pbml0KCZjYW0tPm9wZW5fbXV0ZXgpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPndhaXRfb3Blbik7Ci0JCXFjdHJsID0gcy0+cWN0cmw7Ci0JCXJlY3QgPSAmKHMtPmNyb3BjYXAuZGVmcmVjdCk7Ci0JCWNhbS0+Y29tcHJlc3Npb24ucXVhbGl0eSA9IFpDMDMwMV9DT01QUkVTU0lPTl9RVUFMSVRZOwotCX0gZWxzZSB7IC8qIHVzZSBjdXJyZW50IHZhbHVlcyAqLwotCQlxY3RybCA9IHMtPl9xY3RybDsKLQkJcmVjdCA9ICYocy0+X3JlY3QpOwotCX0KLQotCWlmIChzLT5pbml0KSB7Ci0JCWVyciA9IHMtPmluaXQoY2FtKTsKLQkJaWYgKGVycikgewotCQkJREJHKDMsICJTZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCi0JaWYgKChlcnIgPSB6YzAzMDFfc2V0X2NvbXByZXNzaW9uKGNhbSwgJmNhbS0+Y29tcHJlc3Npb24pKSkgewotCQlEQkcoMywgInNldF9jb21wcmVzc2lvbigpIGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChzLT5zZXRfY3JvcCkKLQkJaWYgKChlcnIgPSBzLT5zZXRfY3JvcChjYW0sIHJlY3QpKSkgewotCQkJREJHKDMsICJzZXRfY3JvcCgpIGZhaWxlZCIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JaWYgKHMtPnNldF9jdHJsKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnFjdHJsKTsgaSsrKQotCQkJaWYgKHMtPnFjdHJsW2ldLmlkICE9IDAgJiYKLQkJCSAgICAhKHMtPnFjdHJsW2ldLmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpKSB7Ci0JCQkJY3RybC5pZCA9IHMtPnFjdHJsW2ldLmlkOwotCQkJCWN0cmwudmFsdWUgPSBxY3RybFtpXS5kZWZhdWx0X3ZhbHVlOwotCQkJCWVyciA9IHMtPnNldF9jdHJsKGNhbSwgJmN0cmwpOwotCQkJCWlmIChlcnIpIHsKLQkJCQkJREJHKDMsICJTZXQgJXMgY29udHJvbCBmYWlsZWQiLAotCQkJCQkgICAgcy0+cWN0cmxbaV0ubmFtZSk7Ci0JCQkJCXJldHVybiBlcnI7Ci0JCQkJfQotCQkJCURCRygzLCAiSW1hZ2Ugc2Vuc29yIHN1cHBvcnRzICclcycgY29udHJvbCIsCi0JCQkJICAgIHMtPnFjdHJsW2ldLm5hbWUpOwotCQkJfQotCX0KLQotCWlmICghKGNhbS0+c3RhdGUgJiBERVZfSU5JVElBTElaRUQpKSB7Ci0JCW11dGV4X2luaXQoJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJc3Bpbl9sb2NrX2luaXQoJmNhbS0+cXVldWVfbG9jayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+d2FpdF9mcmFtZSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+d2FpdF9zdHJlYW0pOwotCQljYW0tPm5yZWFkYnVmZmVycyA9IDI7Ci0JCW1lbWNweShzLT5fcWN0cmwsIHMtPnFjdHJsLCBzaXplb2Yocy0+cWN0cmwpKTsKLQkJbWVtY3B5KCYocy0+X3JlY3QpLCAmKHMtPmNyb3BjYXAuZGVmcmVjdCksCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHY0bDJfcmVjdCkpOwotCQljYW0tPnN0YXRlIHw9IERFVl9JTklUSUFMSVpFRDsKLQl9Ci0KLQlEQkcoMiwgIkluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCIpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHpjMDMwMV9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSAqY2FtID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB6YzAzMDFfZGV2aWNlLAotCQkJCQkJIGtyZWYpOwotCURCRygyLCAiVjRMMiBkZXZpY2UgJXMgZGVyZWdpc3RlcmVkIiwKLQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpOwotCXZpZGVvX3NldF9kcnZkYXRhKGNhbS0+djRsZGV2LCBOVUxMKTsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnY0bGRldik7Ci0JdXNiX3B1dF9kZXYoY2FtLT51c2JkZXYpOwotCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOwotCWtmcmVlKGNhbSk7Ci19Ci0KLQotc3RhdGljIGludCB6YzAzMDFfb3BlbihzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtOwotCWludCBlcnIgPSAwOwotCi0JaWYgKCFkb3duX3JlYWRfdHJ5bG9jaygmemMwMzAxX2Rldl9sb2NrKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQljYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmY2FtLT5wcm9iZSkpIHsKLQkJdXBfcmVhZCgmemMwMzAxX2Rldl9sb2NrKTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQl9Ci0KLQlrcmVmX2dldCgmY2FtLT5rcmVmKTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNhbS0+b3Blbl9tdXRleCkpIHsKLQkJa3JlZl9wdXQoJmNhbS0+a3JlZiwgemMwMzAxX3JlbGVhc2VfcmVzb3VyY2VzKTsKLQkJdXBfcmVhZCgmemMwMzAxX2Rldl9sb2NrKTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQl9Ci0KLQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKLQkJREJHKDEsICJEZXZpY2Ugbm90IHByZXNlbnQiKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGNhbS0+dXNlcnMpIHsKLQkJREJHKDIsICJEZXZpY2UgJXMgaXMgYnVzeS4uLiIsCi0JCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0JCURCRygzLCAiU2ltdWx0YW5lb3VzIG9wZW5zIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0JCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8Ci0JCSAgICAoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSkgewotCQkJZXJyID0gLUVXT1VMREJMT0NLOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJREJHKDIsICJBIGJsb2NraW5nIG9wZW4oKSBoYXMgYmVlbiByZXF1ZXN0ZWQuIFdhaXQgZm9yIHRoZSAiCi0JCSAgICAgICAiZGV2aWNlIHRvIGJlIHJlbGVhc2VkLi4uIik7Ci0JCXVwX3JlYWQoJnpjMDMwMV9kZXZfbG9jayk7Ci0JCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUoY2FtLT53YWl0X29wZW4sCi0JCQkJCQkoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpCi0JCQkJCQkJIHx8ICFjYW0tPnVzZXJzKTsKLQkJZG93bl9yZWFkKCZ6YzAzMDFfZGV2X2xvY2spOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0JCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgewotCQkJZXJyID0gLUVOT0RFVjsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgewotCQllcnIgPSB6YzAzMDFfaW5pdChjYW0pOwotCQlpZiAoZXJyKSB7Ci0JCQlEQkcoMSwgIkluaXRpYWxpemF0aW9uIGZhaWxlZCBhZ2Fpbi4gIgotCQkJICAgICAgICJJIHdpbGwgcmV0cnkgb24gbmV4dCBvcGVuKCkuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQljYW0tPnN0YXRlICY9IH5ERVZfTUlTQ09ORklHVVJFRDsKLQl9Ci0KLQlpZiAoKGVyciA9IHpjMDMwMV9zdGFydF90cmFuc2ZlcihjYW0pKSkKLQkJZ290byBvdXQ7Ci0KLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBjYW07Ci0JY2FtLT51c2VycysrOwotCWNhbS0+aW8gPSBJT19OT05FOwotCWNhbS0+c3RyZWFtID0gU1RSRUFNX09GRjsKLQljYW0tPm5idWZmZXJzID0gMDsKLQljYW0tPmZyYW1lX2NvdW50ID0gMDsKLQl6YzAzMDFfZW1wdHlfZnJhbWVxdWV1ZXMoY2FtKTsKLQotCURCRygzLCAiVmlkZW8gZGV2aWNlICVzIGlzIG9wZW4iLAotCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmNhbS0+b3Blbl9tdXRleCk7Ci0JaWYgKGVycikKLQkJa3JlZl9wdXQoJmNhbS0+a3JlZiwgemMwMzAxX3JlbGVhc2VfcmVzb3VyY2VzKTsKLQl1cF9yZWFkKCZ6YzAzMDFfZGV2X2xvY2spOwotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCB6YzAzMDFfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtOwotCi0JZG93bl93cml0ZSgmemMwMzAxX2Rldl9sb2NrKTsKLQotCWNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQl6YzAzMDFfc3RvcF90cmFuc2ZlcihjYW0pOwotCXpjMDMwMV9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKLQljYW0tPnVzZXJzLS07Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX25yKCZjYW0tPndhaXRfb3BlbiwgMSk7Ci0KLQlEQkcoMywgIlZpZGVvIGRldmljZSAlcyBjbG9zZWQiLAotCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0KLQlrcmVmX3B1dCgmY2FtLT5rcmVmLCB6YzAzMDFfcmVsZWFzZV9yZXNvdXJjZXMpOwotCi0JdXBfd3JpdGUoJnpjMDMwMV9kZXZfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdAotemMwMzAxX3JlYWQoc3RydWN0IGZpbGUqIGZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCogZl9wb3MpCi17Ci0Jc3RydWN0IHpjMDMwMV9kZXZpY2UgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0Jc3RydWN0IHpjMDMwMV9mcmFtZV90KiBmLCAqIGk7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotCWxvbmcgdGltZW91dDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgewotCQlEQkcoMSwgIkRldmljZSBub3QgcHJlc2VudCIpOwotCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgewotCQlEQkcoMSwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgIgotCQkgICAgICAgImFnYWluLiIpOwotCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKGNhbS0+aW8gPT0gSU9fTU1BUCkgewotCQlEQkcoMywgIkNsb3NlIGFuZCBvcGVuIHRoZSBkZXZpY2UgYWdhaW4gdG8gY2hvb3NlIHRoZSByZWFkICIKLQkJICAgICAgICJtZXRob2QiKTsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaWYgKGNhbS0+aW8gPT0gSU9fTk9ORSkgewotCQlpZiAoIXpjMDMwMV9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCBjYW0tPm5yZWFkYnVmZmVycywgSU9fUkVBRCkpIHsKLQkJCURCRygxLCAicmVhZCgpIGZhaWxlZCwgbm90IGVub3VnaCBtZW1vcnkiKTsKLQkJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJY2FtLT5pbyA9IElPX1JFQUQ7Ci0JCWNhbS0+c3RyZWFtID0gU1RSRUFNX09OOwotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZjYW0tPmlucXVldWUpKSB7Ci0JCWlmICghbGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpCi0JCQl6YzAzMDFfZW1wdHlfZnJhbWVxdWV1ZXMoY2FtKTsKLQkJemMwMzAxX3F1ZXVlX3VudXNlZGZyYW1lcyhjYW0pOwotCX0KLQotCWlmICghY291bnQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkgewotCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQkJdGltZW91dCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0JCQkgICggY2FtLT53YWl0X2ZyYW1lLAotCQkJICAgICghbGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpIHx8Ci0JCQkgICAgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB8fAotCQkJICAgIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpLAotCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoCi0JCQkJY2FtLT5tb2R1bGVfcGFyYW0uZnJhbWVfdGltZW91dCAqIDEwMDAKLQkJCSAgICApCi0JCQkgICk7Ci0JCWlmICh0aW1lb3V0IDwgMCkgewotCQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCQlyZXR1cm4gdGltZW91dDsKLQkJfQotCQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKLQkJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJaWYgKCF0aW1lb3V0IHx8IChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpKSB7Ci0JCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCi0JZiA9IGxpc3RfZW50cnkoY2FtLT5vdXRxdWV1ZS5wcmV2LCBzdHJ1Y3QgemMwMzAxX2ZyYW1lX3QsIGZyYW1lKTsKLQotCWlmIChjb3VudCA+IGYtPmJ1Zi5ieXRlc3VzZWQpCi0JCWNvdW50ID0gZi0+YnVmLmJ5dGVzdXNlZDsKLQotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBmLT5idWZtZW0sIGNvdW50KSkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCSpmX3BvcyArPSBjb3VudDsKLQotZXhpdDoKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZjYW0tPm91dHF1ZXVlLCBmcmFtZSkKLQkJaS0+c3RhdGUgPSBGX1VOVVNFRDsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5vdXRxdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXpjMDMwMV9xdWV1ZV91bnVzZWRmcmFtZXMoY2FtKTsKLQotCVBEQkdHKCJGcmFtZSAjJWx1LCBieXRlcyByZWFkOiAlenUiLAotCSAgICAgICh1bnNpZ25lZCBsb25nKWYtPmJ1Zi5pbmRleCwgY291bnQpOwotCi0JbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0KLQlyZXR1cm4gZXJyID8gZXJyIDogY291bnQ7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCB6YzAzMDFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKLQlzdHJ1Y3QgemMwMzAxX2ZyYW1lX3QqIGY7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX211dGV4KSkKLQkJcmV0dXJuIFBPTExFUlI7Ci0KLQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKLQkJREJHKDEsICJEZXZpY2Ugbm90IHByZXNlbnQiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7Ci0JCURCRygxLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCAiCi0JCSAgICAgICAiYWdhaW4uIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaWYgKGNhbS0+aW8gPT0gSU9fTk9ORSkgewotCQlpZiAoIXpjMDMwMV9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCBjYW0tPm5yZWFkYnVmZmVycywgSU9fUkVBRCkpIHsKLQkJCURCRygxLCAicG9sbCgpIGZhaWxlZCwgbm90IGVub3VnaCBtZW1vcnkiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJY2FtLT5pbyA9IElPX1JFQUQ7Ci0JCWNhbS0+c3RyZWFtID0gU1RSRUFNX09OOwotCX0KLQotCWlmIChjYW0tPmlvID09IElPX1JFQUQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmNhbS0+b3V0cXVldWUsIGZyYW1lKQotCQkJZi0+c3RhdGUgPSBGX1VOVVNFRDsKLQkJSU5JVF9MSVNUX0hFQUQoJmNhbS0+b3V0cXVldWUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQl6YzAzMDFfcXVldWVfdW51c2VkZnJhbWVzKGNhbSk7Ci0JfQotCi0JcG9sbF93YWl0KGZpbHAsICZjYW0tPndhaXRfZnJhbWUsIHdhaXQpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkKLQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCi0JbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0KLQlyZXR1cm4gbWFzazsKLQotZXJyb3I6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JcmV0dXJuIFBPTExFUlI7Ci19Ci0KLQotc3RhdGljIHZvaWQgemMwMzAxX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0KiB2bWEpCi17Ci0Jc3RydWN0IHpjMDMwMV9mcmFtZV90KiBmID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0JZi0+dm1hX3VzZV9jb3VudCsrOwotfQotCi0KLXN0YXRpYyB2b2lkIHpjMDMwMV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqIHZtYSkKLXsKLQkvKiBOT1RFOiBidWZmZXJzIGFyZSBub3QgZnJlZWQgaGVyZSAqLwotCXN0cnVjdCB6YzAzMDFfZnJhbWVfdCogZiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCWYtPnZtYV91c2VfY291bnQtLTsKLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHpjMDMwMV92bV9vcHMgPSB7Ci0JLm9wZW4gPSB6YzAzMDFfdm1fb3BlbiwKLQkuY2xvc2UgPSB6YzAzMDFfdm1fY2xvc2UsCi19OwotCi0KLXN0YXRpYyBpbnQgemMwMzAxX21tYXAoc3RydWN0IGZpbGUqIGZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCB6YzAzMDFfZGV2aWNlICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJICAgICAgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwotCXZvaWQgKnBvczsKLQl1MzIgaTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgewotCQlEQkcoMSwgIkRldmljZSBub3QgcHJlc2VudCIpOwotCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgewotCQlEQkcoMSwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgIgotCQkgICAgICAgImFnYWluLiIpOwotCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9XUklURSB8IFZNX1JFQUQpKSkgewotCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQotCi0JaWYgKGNhbS0+aW8gIT0gSU9fTU1BUCB8fAotCSAgICBzaXplICE9IFBBR0VfQUxJR04oY2FtLT5mcmFtZVswXS5idWYubGVuZ3RoKSkgewotCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykgewotCQlpZiAoKGNhbS0+ZnJhbWVbaV0uYnVmLm0ub2Zmc2V0Pj5QQUdFX1NISUZUKSA9PSB2bWEtPnZtX3Bnb2ZmKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IGNhbS0+bmJ1ZmZlcnMpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmZpbGVvcF9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKLQotCXBvcyA9IGNhbS0+ZnJhbWVbaV0uYnVmbWVtOwotCXdoaWxlIChzaXplID4gMCkgeyAvKiBzaXplIGlzIHBhZ2UtYWxpZ25lZCAqLwotCQlpZiAodm1faW5zZXJ0X3BhZ2Uodm1hLCBzdGFydCwgdm1hbGxvY190b19wYWdlKHBvcykpKSB7Ci0JCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCXN0YXJ0ICs9IFBBR0VfU0laRTsKLQkJcG9zICs9IFBBR0VfU0laRTsKLQkJc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JfQotCi0Jdm1hLT52bV9vcHMgPSAmemMwMzAxX3ZtX29wczsKLQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9ICZjYW0tPmZyYW1lW2ldOwotCXpjMDMwMV92bV9vcGVuKHZtYSk7Ci0KLQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfcXVlcnljYXAoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0Jc3RydWN0IHY0bDJfY2FwYWJpbGl0eSBjYXAgPSB7Ci0JCS5kcml2ZXIgPSAiemMwMzAxIiwKLQkJLnZlcnNpb24gPSBaQzAzMDFfTU9EVUxFX1ZFUlNJT05fQ09ERSwKLQkJLmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEUgfAotCQkJCVY0TDJfQ0FQX1NUUkVBTUlORywKLQl9OwotCi0Jc3RybGNweShjYXAuY2FyZCwgY2FtLT52NGxkZXYtPm5hbWUsIHNpemVvZihjYXAuY2FyZCkpOwotCWlmICh1c2JfbWFrZV9wYXRoKGNhbS0+dXNiZGV2LCBjYXAuYnVzX2luZm8sIHNpemVvZihjYXAuYnVzX2luZm8pKSA8IDApCi0JCXN0cmxjcHkoY2FwLmJ1c19pbmZvLCBkZXZfbmFtZSgmY2FtLT51c2JkZXYtPmRldiksCi0JCQlzaXplb2YoY2FwLmJ1c19pbmZvKSk7Ci0KLQlpZiAoY29weV90b191c2VyKGFyZywgJmNhcCwgc2l6ZW9mKGNhcCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfZW51bWlucHV0KHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB2NGwyX2lucHV0IGk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmksIGFyZywgc2l6ZW9mKGkpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoaS5pbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoJmksIDAsIHNpemVvZihpKSk7Ci0Jc3RyY3B5KGkubmFtZSwgIkNhbWVyYSIpOwotCWkudHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0KLQlpZiAoY29weV90b191c2VyKGFyZywgJmksIHNpemVvZihpKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotemMwMzAxX3ZpZGlvY19nX2lucHV0KHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCWludCBpbmRleCA9IDA7Ci0KLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZGV4LCBzaXplb2YoaW5kZXgpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci16YzAzMDFfdmlkaW9jX3NfaW5wdXQoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IGluZGV4OwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmRleCwgYXJnLCBzaXplb2YoaW5kZXgpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoaW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci16YzAzMDFfdmlkaW9jX3F1ZXJ5X2N0cmwoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0Jc3RydWN0IHpjMDMwMV9zZW5zb3IqIHMgPSAmY2FtLT5zZW5zb3I7Ci0Jc3RydWN0IHY0bDJfcXVlcnljdHJsIHFjOwotCXU4IGk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnFjLCBhcmcsIHNpemVvZihxYykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnFjdHJsKTsgaSsrKQotCQlpZiAocWMuaWQgJiYgcWMuaWQgPT0gcy0+cWN0cmxbaV0uaWQpIHsKLQkJCW1lbWNweSgmcWMsICYocy0+cWN0cmxbaV0pLCBzaXplb2YocWMpKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcWMsIHNpemVvZihxYykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfZ19jdHJsKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzID0gJmNhbS0+c2Vuc29yOwotCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKLQlpbnQgZXJyID0gMDsKLQl1OCBpOwotCi0JaWYgKCFzLT5nZXRfY3RybCAmJiAhcy0+c2V0X2N0cmwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdHJsLCBhcmcsIHNpemVvZihjdHJsKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKCFzLT5nZXRfY3RybCkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5xY3RybCk7IGkrKykKLQkJCWlmIChjdHJsLmlkID09IHMtPnFjdHJsW2ldLmlkKSB7Ci0JCQkJY3RybC52YWx1ZSA9IHMtPl9xY3RybFtpXS5kZWZhdWx0X3ZhbHVlOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlCi0JCWVyciA9IHMtPmdldF9jdHJsKGNhbSwgJmN0cmwpOwotCi1leGl0OgotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY3RybCwgc2l6ZW9mKGN0cmwpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2Nfc19jdHJsKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzID0gJmNhbS0+c2Vuc29yOwotCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKLQl1OCBpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKCFzLT5zZXRfY3RybCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsIGFyZywgc2l6ZW9mKGN0cmwpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5xY3RybCk7IGkrKykgewotCQlpZiAoY3RybC5pZCA9PSBzLT5xY3RybFtpXS5pZCkgewotCQkJaWYgKHMtPnFjdHJsW2ldLmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoY3RybC52YWx1ZSA8IHMtPnFjdHJsW2ldLm1pbmltdW0gfHwKLQkJCSAgICBjdHJsLnZhbHVlID4gcy0+cWN0cmxbaV0ubWF4aW11bSkKLQkJCQlyZXR1cm4gLUVSQU5HRTsKLQkJCWN0cmwudmFsdWUgLT0gY3RybC52YWx1ZSAlIHMtPnFjdHJsW2ldLnN0ZXA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKHMtPnFjdHJsKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChlcnIgPSBzLT5zZXRfY3RybChjYW0sICZjdHJsKSkpCi0JCXJldHVybiBlcnI7Ci0KLQlzLT5fcWN0cmxbaV0uZGVmYXVsdF92YWx1ZSA9IGN0cmwudmFsdWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci16YzAzMDFfdmlkaW9jX2Nyb3BjYXAoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0Jc3RydWN0IHY0bDJfY3JvcGNhcCogY2MgPSAmKGNhbS0+c2Vuc29yLmNyb3BjYXApOwotCi0JY2MtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JY2MtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9IDE7Ci0JY2MtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yID0gMTsKLQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBjYywgc2l6ZW9mKCpjYykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfZ19jcm9wKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzID0gJmNhbS0+c2Vuc29yOwotCXN0cnVjdCB2NGwyX2Nyb3AgY3JvcCA9IHsKLQkJLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JfTsKLQotCW1lbWNweSgmKGNyb3AuYyksICYocy0+X3JlY3QpLCBzaXplb2Yoc3RydWN0IHY0bDJfcmVjdCkpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjcm9wLCBzaXplb2YoY3JvcCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2Nfc19jcm9wKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzID0gJmNhbS0+c2Vuc29yOwotCXN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKLQlzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0OwotCXN0cnVjdCB2NGwyX3JlY3QqIGJvdW5kcyA9ICYocy0+Y3JvcGNhcC5ib3VuZHMpOwotCWNvbnN0IGVudW0gemMwMzAxX3N0cmVhbV9zdGF0ZSBzdHJlYW0gPSBjYW0tPnN0cmVhbTsKLQljb25zdCB1MzIgbmJ1ZmZlcnMgPSBjYW0tPm5idWZmZXJzOwotCXUzMiBpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjcm9wLCBhcmcsIHNpemVvZihjcm9wKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmVjdCA9ICYoY3JvcC5jKTsKLQotCWlmIChjcm9wLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXApCi0JCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspCi0JCQlpZiAoY2FtLT5mcmFtZVtpXS52bWFfdXNlX2NvdW50KSB7Ci0JCQkJREJHKDMsICJWSURJT0NfU19DUk9QIGZhaWxlZC4gIgotCQkJCSAgICAgICAiVW5tYXAgdGhlIGJ1ZmZlcnMgZmlyc3QuIik7Ci0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJCX0KLQotCWlmICghcy0+c2V0X2Nyb3ApIHsKLQkJbWVtY3B5KHJlY3QsICYocy0+X3JlY3QpLCBzaXplb2YoKnJlY3QpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjcm9wLCBzaXplb2YoY3JvcCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCXJlY3QtPmxlZnQgJj0gfjdMOwotCXJlY3QtPnRvcCAmPSB+N0w7Ci0JaWYgKHJlY3QtPndpZHRoIDwgOCkKLQkJcmVjdC0+d2lkdGggPSA4OwotCWlmIChyZWN0LT5oZWlnaHQgPCA4KQotCQlyZWN0LT5oZWlnaHQgPSA4OwotCWlmIChyZWN0LT53aWR0aCA+IGJvdW5kcy0+d2lkdGgpCi0JCXJlY3QtPndpZHRoID0gYm91bmRzLT53aWR0aDsKLQlpZiAocmVjdC0+aGVpZ2h0ID4gYm91bmRzLT5oZWlnaHQpCi0JCXJlY3QtPmhlaWdodCA9IGJvdW5kcy0+aGVpZ2h0OwotCWlmIChyZWN0LT5sZWZ0IDwgYm91bmRzLT5sZWZ0KQotCQlyZWN0LT5sZWZ0ID0gYm91bmRzLT5sZWZ0OwotCWlmIChyZWN0LT50b3AgPCBib3VuZHMtPnRvcCkKLQkJcmVjdC0+dG9wID0gYm91bmRzLT50b3A7Ci0JaWYgKHJlY3QtPmxlZnQgKyByZWN0LT53aWR0aCA+IGJvdW5kcy0+bGVmdCArIGJvdW5kcy0+d2lkdGgpCi0JCXJlY3QtPmxlZnQgPSBib3VuZHMtPmxlZnQrYm91bmRzLT53aWR0aCAtIHJlY3QtPndpZHRoOwotCWlmIChyZWN0LT50b3AgKyByZWN0LT5oZWlnaHQgPiBib3VuZHMtPnRvcCArIGJvdW5kcy0+aGVpZ2h0KQotCQlyZWN0LT50b3AgPSBib3VuZHMtPnRvcCtib3VuZHMtPmhlaWdodCAtIHJlY3QtPmhlaWdodDsKLQlyZWN0LT53aWR0aCAmPSB+N0w7Ci0JcmVjdC0+aGVpZ2h0ICY9IH43TDsKLQotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gemMwMzAxX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCi0JCQlyZXR1cm4gZXJyOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjcm9wLCBzaXplb2YoY3JvcCkpKSB7Ci0JCWNhbS0+c3RyZWFtID0gc3RyZWFtOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwIHx8IGNhbS0+aW8gPT0gSU9fUkVBRCkKLQkJemMwMzAxX3JlbGVhc2VfYnVmZmVycyhjYW0pOwotCi0JaWYgKHMtPnNldF9jcm9wKQotCQllcnIgKz0gcy0+c2V0X2Nyb3AoY2FtLCByZWN0KTsKLQotCWlmIChlcnIpIHsgLyogYXRvbWljLCBubyByb2xsYmFjayBpbiBpb2N0bCgpICovCi0JCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7Ci0JCURCRygxLCAiVklESU9DX1NfQ1JPUCBmYWlsZWQgYmVjYXVzZSBvZiBoYXJkd2FyZSBwcm9ibGVtcy4gVG8gIgotCQkgICAgICAgInVzZSB0aGUgY2FtZXJhLCBjbG9zZSBhbmQgb3BlbiAlcyBhZ2Fpbi4iLAotCQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlzLT5waXhfZm9ybWF0LndpZHRoID0gcmVjdC0+d2lkdGg7Ci0Jcy0+cGl4X2Zvcm1hdC5oZWlnaHQgPSByZWN0LT5oZWlnaHQ7Ci0JbWVtY3B5KCYocy0+X3JlY3QpLCByZWN0LCBzaXplb2YoKnJlY3QpKTsKLQotCWlmICgoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwICB8fCBjYW0tPmlvID09IElPX1JFQUQpICYmCi0JICAgIG5idWZmZXJzICE9IHpjMDMwMV9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCBuYnVmZmVycywgY2FtLT5pbykpIHsKLQkJY2FtLT5zdGF0ZSB8PSBERVZfTUlTQ09ORklHVVJFRDsKLQkJREJHKDEsICJWSURJT0NfU19DUk9QIGZhaWxlZCBiZWNhdXNlIG9mIG5vdCBlbm91Z2ggbWVtb3J5LiBUbyAiCi0JCSAgICAgICAidXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICVzIGFnYWluLiIsCi0JCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjYW0tPmlvID09IElPX1JFQUQpCi0JCXpjMDMwMV9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOwotCWVsc2UgaWYgKGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCkKLQkJemMwMzAxX3JlcXVldWVfb3V0cXVldWUoY2FtKTsKLQotCWNhbS0+c3RyZWFtID0gc3RyZWFtOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotemMwMzAxX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0Jc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gZnJtc2l6ZTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZnJtc2l6ZSwgYXJnLCBzaXplb2YoZnJtc2l6ZSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChmcm1zaXplLmluZGV4ICE9IDAgJiYgZnJtc2l6ZS5pbmRleCAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChmcm1zaXplLnBpeGVsX2Zvcm1hdCAhPSBWNEwyX1BJWF9GTVRfSlBFRykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmcm1zaXplLnR5cGUgPSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKLQotCWlmIChmcm1zaXplLmluZGV4ID09IDEpIHsKLQkJZnJtc2l6ZS5kaXNjcmV0ZS53aWR0aCA9IGNhbS0+c2Vuc29yLmNyb3BjYXAuZGVmcmVjdC53aWR0aDsKLQkJZnJtc2l6ZS5kaXNjcmV0ZS5oZWlnaHQgPSBjYW0tPnNlbnNvci5jcm9wY2FwLmRlZnJlY3QuaGVpZ2h0OwotCX0KLQltZW1zZXQoJmZybXNpemUucmVzZXJ2ZWQsIDAsIHNpemVvZihmcm1zaXplLnJlc2VydmVkKSk7Ci0KLQlpZiAoY29weV90b191c2VyKGFyZywgJmZybXNpemUsIHNpemVvZihmcm1zaXplKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotemMwMzAxX3ZpZGlvY19lbnVtX2ZtdChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZtdGQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmZtdGQsIGFyZywgc2l6ZW9mKGZtdGQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoZm10ZC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZm10ZC5pbmRleCA9PSAwKSB7Ci0JCXN0cmNweShmbXRkLmRlc2NyaXB0aW9uLCAiSlBFRyIpOwotCQlmbXRkLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0pQRUc7Ci0JCWZtdGQuZmxhZ3MgPSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQ7Ci0JfSBlbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm10ZC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCW1lbXNldCgmZm10ZC5yZXNlcnZlZCwgMCwgc2l6ZW9mKGZtdGQucmVzZXJ2ZWQpKTsKLQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm10ZCwgc2l6ZW9mKGZtdGQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci16YzAzMDFfdmlkaW9jX2dfZm10KHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGZtdCA9ICYoY2FtLT5zZW5zb3IucGl4X2Zvcm1hdCk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmZvcm1hdCwgYXJnLCBzaXplb2YoZm9ybWF0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGZvcm1hdC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwZm10LT5ieXRlc3BlcmxpbmUgPSAwOwotCXBmbXQtPnNpemVpbWFnZSA9IHBmbXQtPmhlaWdodCAqICgocGZtdC0+d2lkdGgqcGZtdC0+cHJpdikvOCk7Ci0JcGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JbWVtY3B5KCYoZm9ybWF0LmZtdC5waXgpLCBwZm10LCBzaXplb2YoKnBmbXQpKTsKLQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm9ybWF0LCBzaXplb2YoZm9ybWF0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotemMwMzAxX3ZpZGlvY190cnlfc19mbXQoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB6YzAzMDFfc2Vuc29yKiBzID0gJmNhbS0+c2Vuc29yOwotCXN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4OwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBmbXQgPSAmKHMtPnBpeF9mb3JtYXQpOwotCXN0cnVjdCB2NGwyX3JlY3QqIGJvdW5kcyA9ICYocy0+Y3JvcGNhcC5ib3VuZHMpOwotCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsKLQljb25zdCBlbnVtIHpjMDMwMV9zdHJlYW1fc3RhdGUgc3RyZWFtID0gY2FtLT5zdHJlYW07Ci0JY29uc3QgdTMyIG5idWZmZXJzID0gY2FtLT5uYnVmZmVyczsKLQl1MzIgaTsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZm9ybWF0LCBhcmcsIHNpemVvZihmb3JtYXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlwaXggPSAmKGZvcm1hdC5mbXQucGl4KTsKLQotCWlmIChmb3JtYXQudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtY3B5KCZyZWN0LCAmKHMtPl9yZWN0KSwgc2l6ZW9mKHJlY3QpKTsKLQotCWlmICghcy0+c2V0X2Nyb3ApIHsKLQkJcGl4LT53aWR0aCA9IHJlY3Qud2lkdGg7Ci0JCXBpeC0+aGVpZ2h0ID0gcmVjdC5oZWlnaHQ7Ci0JfSBlbHNlIHsKLQkJcmVjdC53aWR0aCA9IHBpeC0+d2lkdGg7Ci0JCXJlY3QuaGVpZ2h0ID0gcGl4LT5oZWlnaHQ7Ci0JfQotCi0JaWYgKHJlY3Qud2lkdGggPCA4KQotCQlyZWN0LndpZHRoID0gODsKLQlpZiAocmVjdC5oZWlnaHQgPCA4KQotCQlyZWN0LmhlaWdodCA9IDg7Ci0JaWYgKHJlY3Qud2lkdGggPiBib3VuZHMtPmxlZnQgKyBib3VuZHMtPndpZHRoIC0gcmVjdC5sZWZ0KQotCQlyZWN0LndpZHRoID0gYm91bmRzLT5sZWZ0ICsgYm91bmRzLT53aWR0aCAtIHJlY3QubGVmdDsKLQlpZiAocmVjdC5oZWlnaHQgPiBib3VuZHMtPnRvcCArIGJvdW5kcy0+aGVpZ2h0IC0gcmVjdC50b3ApCi0JCXJlY3QuaGVpZ2h0ID0gYm91bmRzLT50b3AgKyBib3VuZHMtPmhlaWdodCAtIHJlY3QudG9wOwotCXJlY3Qud2lkdGggJj0gfjdMOwotCXJlY3QuaGVpZ2h0ICY9IH43TDsKLQotCXBpeC0+d2lkdGggPSByZWN0LndpZHRoOwotCXBpeC0+aGVpZ2h0ID0gcmVjdC5oZWlnaHQ7Ci0JcGl4LT5waXhlbGZvcm1hdCA9IHBmbXQtPnBpeGVsZm9ybWF0OwotCXBpeC0+cHJpdiA9IHBmbXQtPnByaXY7Ci0JcGl4LT5jb2xvcnNwYWNlID0gcGZtdC0+Y29sb3JzcGFjZTsKLQlwaXgtPmJ5dGVzcGVybGluZSA9IDA7Ci0JcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqICgocGl4LT53aWR0aCAqIHBpeC0+cHJpdikgLyA4KTsKLQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCi0JaWYgKGNtZCA9PSBWSURJT0NfVFJZX0ZNVCkgewotCQlpZiAoY29weV90b191c2VyKGFyZywgJmZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXApCi0JCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspCi0JCQlpZiAoY2FtLT5mcmFtZVtpXS52bWFfdXNlX2NvdW50KSB7Ci0JCQkJREJHKDMsICJWSURJT0NfU19GTVQgZmFpbGVkLiAiCi0JCQkJICAgICAgICJVbm1hcCB0aGUgYnVmZmVycyBmaXJzdC4iKTsKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJfQotCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSB6YzAzMDFfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKLQkJCXJldHVybiBlcnI7Ci0KLQlpZiAoY29weV90b191c2VyKGFyZywgJmZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpKSB7Ci0JCWNhbS0+c3RyZWFtID0gc3RyZWFtOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwIHx8IGNhbS0+aW8gPT0gSU9fUkVBRCkKLQkJemMwMzAxX3JlbGVhc2VfYnVmZmVycyhjYW0pOwotCi0JaWYgKHMtPnNldF9jcm9wKQotCQllcnIgKz0gcy0+c2V0X2Nyb3AoY2FtLCAmcmVjdCk7Ci0KLQlpZiAoZXJyKSB7IC8qIGF0b21pYywgbm8gcm9sbGJhY2sgaW4gaW9jdGwoKSAqLwotCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwotCQlEQkcoMSwgIlZJRElPQ19TX0ZNVCBmYWlsZWQgYmVjYXVzZSBvZiBoYXJkd2FyZSBwcm9ibGVtcy4gVG8gIgotCQkgICAgICAgInVzZSB0aGUgY2FtZXJhLCBjbG9zZSBhbmQgb3BlbiAlcyBhZ2Fpbi4iLAotCQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltZW1jcHkocGZtdCwgcGl4LCBzaXplb2YoKnBpeCkpOwotCW1lbWNweSgmKHMtPl9yZWN0KSwgJnJlY3QsIHNpemVvZihyZWN0KSk7Ci0KLQlpZiAoKGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCAgfHwgY2FtLT5pbyA9PSBJT19SRUFEKSAmJgotCSAgICBuYnVmZmVycyAhPSB6YzAzMDFfcmVxdWVzdF9idWZmZXJzKGNhbSwgbmJ1ZmZlcnMsIGNhbS0+aW8pKSB7Ci0JCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7Ci0JCURCRygxLCAiVklESU9DX1NfRk1UIGZhaWxlZCBiZWNhdXNlIG9mIG5vdCBlbm91Z2ggbWVtb3J5LiBUbyAiCi0JCSAgICAgICAidXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICVzIGFnYWluLiIsCi0JCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjYW0tPmlvID09IElPX1JFQUQpCi0JCXpjMDMwMV9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOwotCWVsc2UgaWYgKGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCkKLQkJemMwMzAxX3JlcXVldWVfb3V0cXVldWUoY2FtKTsKLQotCWNhbS0+c3RyZWFtID0gc3RyZWFtOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotemMwMzAxX3ZpZGlvY19nX2pwZWdjb21wKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2FtLT5jb21wcmVzc2lvbiwgc2l6ZW9mKGNhbS0+Y29tcHJlc3Npb24pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci16YzAzMDFfdmlkaW9jX3NfanBlZ2NvbXAoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0Jc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIGpjOwotCWNvbnN0IGVudW0gemMwMzAxX3N0cmVhbV9zdGF0ZSBzdHJlYW0gPSBjYW0tPnN0cmVhbTsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmamMsIGFyZywgc2l6ZW9mKGpjKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGpjLnF1YWxpdHkgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQotCQlpZiAoKGVyciA9IHpjMDMwMV9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQotCQkJcmV0dXJuIGVycjsKLQotCWVyciArPSB6YzAzMDFfc2V0X2NvbXByZXNzaW9uKGNhbSwgJmpjKTsKLQlpZiAoZXJyKSB7IC8qIGF0b21pYywgbm8gcm9sbGJhY2sgaW4gaW9jdGwoKSAqLwotCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwotCQlEQkcoMSwgIlZJRElPQ19TX0pQRUdDT01QIGZhaWxlZCBiZWNhdXNlIG9mIGhhcmR3YXJlICIKLQkJICAgICAgICJwcm9ibGVtcy4gVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICVzIGFnYWluLiIsCi0JCSAgICAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWNhbS0+Y29tcHJlc3Npb24ucXVhbGl0eSA9IGpjLnF1YWxpdHk7Ci0KLQljYW0tPnN0cmVhbSA9IHN0cmVhbTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByYjsKLQl1MzIgaTsKLQlpbnQgZXJyOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyYiwgYXJnLCBzaXplb2YocmIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAocmIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkgICAgcmIubWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNhbS0+aW8gPT0gSU9fUkVBRCkgewotCQlEQkcoMywgIkNsb3NlIGFuZCBvcGVuIHRoZSBkZXZpY2UgYWdhaW4gdG8gY2hvb3NlIHRoZSBtbWFwICIKLQkJICAgICAgICJJL08gbWV0aG9kIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykKLQkJaWYgKGNhbS0+ZnJhbWVbaV0udm1hX3VzZV9jb3VudCkgewotCQkJREJHKDMsICJWSURJT0NfUkVRQlVGUyBmYWlsZWQuICIKLQkJCSAgICAgICAiUHJldmlvdXMgYnVmZmVycyBhcmUgc3RpbGwgbWFwcGVkLiIpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSB6YzAzMDFfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKLQkJCXJldHVybiBlcnI7Ci0KLQl6YzAzMDFfZW1wdHlfZnJhbWVxdWV1ZXMoY2FtKTsKLQotCXpjMDMwMV9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKLQlpZiAocmIuY291bnQpCi0JCXJiLmNvdW50ID0gemMwMzAxX3JlcXVlc3RfYnVmZmVycyhjYW0sIHJiLmNvdW50LCBJT19NTUFQKTsKLQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcmIsIHNpemVvZihyYikpKSB7Ci0JCXpjMDMwMV9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKLQkJY2FtLT5pbyA9IElPX05PTkU7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWNhbS0+aW8gPSByYi5jb3VudCA/IElPX01NQVAgOiBJT19OT05FOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotemMwMzAxX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgYjsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYiwgYXJnLCBzaXplb2YoYikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChiLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8Ci0JICAgIGIuaW5kZXggPj0gY2FtLT5uYnVmZmVycyB8fCBjYW0tPmlvICE9IElPX01NQVApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtY3B5KCZiLCAmY2FtLT5mcmFtZVtiLmluZGV4XS5idWYsIHNpemVvZihiKSk7Ci0KLQlpZiAoY2FtLT5mcmFtZVtiLmluZGV4XS52bWFfdXNlX2NvdW50KQotCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCi0JaWYgKGNhbS0+ZnJhbWVbYi5pbmRleF0uc3RhdGUgPT0gRl9ET05FKQotCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKLQllbHNlIGlmIChjYW0tPmZyYW1lW2IuaW5kZXhdLnN0YXRlICE9IEZfVU5VU0VEKQotCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZiLCBzaXplb2YoYikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfcWJ1ZihzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgYjsKLQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmIsIGFyZywgc2l6ZW9mKGIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoYi50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAotCSAgICBiLmluZGV4ID49IGNhbS0+bmJ1ZmZlcnMgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjYW0tPmZyYW1lW2IuaW5kZXhdLnN0YXRlICE9IEZfVU5VU0VEKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNhbS0+ZnJhbWVbYi5pbmRleF0uc3RhdGUgPSBGX1FVRVVFRDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmNhbS0+ZnJhbWVbYi5pbmRleF0uZnJhbWUsICZjYW0tPmlucXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlQREJHRygiRnJhbWUgIyVsdSBxdWV1ZWQiLCAodW5zaWduZWQgbG9uZyliLmluZGV4KTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfZHFidWYoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgc3RydWN0IGZpbGUqIGZpbHAsCi0JCSAgICB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgYjsKLQlzdHJ1Y3QgemMwMzAxX2ZyYW1lX3QgKmY7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotCWxvbmcgdGltZW91dDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYiwgYXJnLCBzaXplb2YoYikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChiLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8IGNhbS0+aW8hPSBJT19NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkgewotCQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09GRikKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJdGltZW91dCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0JCQkgICggY2FtLT53YWl0X2ZyYW1lLAotCQkJICAgICghbGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpIHx8Ci0JCQkgICAgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB8fAotCQkJICAgIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpLAotCQkJICAgIGNhbS0+bW9kdWxlX3BhcmFtLmZyYW1lX3RpbWVvdXQgKgotCQkJICAgIDEwMDAgKiBtc2Vjc190b19qaWZmaWVzKDEpICk7Ci0JCWlmICh0aW1lb3V0IDwgMCkKLQkJCXJldHVybiB0aW1lb3V0OwotCQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJaWYgKCF0aW1lb3V0IHx8IChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7Ci0JZiA9IGxpc3RfZW50cnkoY2FtLT5vdXRxdWV1ZS5uZXh0LCBzdHJ1Y3QgemMwMzAxX2ZyYW1lX3QsIGZyYW1lKTsKLQlsaXN0X2RlbChjYW0tPm91dHF1ZXVlLm5leHQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlmLT5zdGF0ZSA9IEZfVU5VU0VEOwotCi0JbWVtY3B5KCZiLCAmZi0+YnVmLCBzaXplb2YoYikpOwotCWlmIChmLT52bWFfdXNlX2NvdW50KQotCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZiLCBzaXplb2YoYikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCVBEQkdHKCJGcmFtZSAjJWx1IGRlcXVldWVkIiwgKHVuc2lnbmVkIGxvbmcpZi0+YnVmLmluZGV4KTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2Nfc3RyZWFtb24oc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IHR5cGU7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnR5cGUsIGFyZywgc2l6ZW9mKHR5cGUpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNhbS0+c3RyZWFtID0gU1RSRUFNX09OOwotCi0JREJHKDMsICJTdHJlYW0gb24iKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCWludCB0eXBlLCBlcnI7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnR5cGUsIGFyZywgc2l6ZW9mKHR5cGUpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gemMwMzAxX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCi0JCQlyZXR1cm4gZXJyOwotCi0JemMwMzAxX2VtcHR5X2ZyYW1lcXVldWVzKGNhbSk7Ci0KLQlEQkcoMywgIlN0cmVhbSBvZmYiKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2NfZ19wYXJtKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gc3A7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNwLCBhcmcsIHNpemVvZihzcCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChzcC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcC5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBjYW0tPm5yZWFkYnVmZmVyczsKLQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmc3AsIHNpemVvZihzcCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpjMDMwMV92aWRpb2Nfc19wYXJtKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0sIHZvaWQgX191c2VyICogYXJnKQotewotCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gc3A7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNwLCBhcmcsIHNpemVvZihzcCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChzcC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcC5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQotCWlmIChzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPT0gMCkKLQkJc3AucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gY2FtLT5ucmVhZGJ1ZmZlcnM7Ci0KLQlpZiAoc3AucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID4gWkMwMzAxX01BWF9GUkFNRVMpCi0JCXNwLnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IFpDMDMwMV9NQVhfRlJBTUVTOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZzcCwgc2l6ZW9mKHNwKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JY2FtLT5ucmVhZGJ1ZmZlcnMgPSBzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgbG9uZyB6YzAzMDFfaW9jdGxfdjRsMihzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0KLQljYXNlIFZJRElPQ19RVUVSWUNBUDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfcXVlcnljYXAoY2FtLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19lbnVtaW5wdXQoY2FtLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfR19JTlBVVDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfZ19pbnB1dChjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19zX2lucHV0KGNhbSwgYXJnKTsKLQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfcXVlcnlfY3RybChjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19HX0NUUkw6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX2dfY3RybChjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX3NfY3RybChjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19DUk9QQ0FQOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19jcm9wY2FwKGNhbSwgYXJnKTsKLQotCWNhc2UgVklESU9DX0dfQ1JPUDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfZ19jcm9wKGNhbSwgYXJnKTsKLQotCWNhc2UgVklESU9DX1NfQ1JPUDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2Nfc19jcm9wKGNhbSwgYXJnKTsKLQotCWNhc2UgVklESU9DX0VOVU1fRk1UOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19lbnVtX2ZtdChjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19HX0ZNVDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfZ19mbXQoY2FtLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfVFJZX0ZNVDoKLQljYXNlIFZJRElPQ19TX0ZNVDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfdHJ5X3NfZm10KGNhbSwgY21kLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMoY2FtLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKLQkJcmV0dXJuIHpjMDMwMV92aWRpb2NfZ19qcGVnY29tcChjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19TX0pQRUdDT01QOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19zX2pwZWdjb21wKGNhbSwgYXJnKTsKLQotCWNhc2UgVklESU9DX1JFUUJVRlM6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX3JlcWJ1ZnMoY2FtLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX3F1ZXJ5YnVmKGNhbSwgYXJnKTsKLQotCWNhc2UgVklESU9DX1FCVUY6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX3FidWYoY2FtLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfRFFCVUY6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX2RxYnVmKGNhbSwgZmlscCwgYXJnKTsKLQotCWNhc2UgVklESU9DX1NUUkVBTU9OOgotCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19zdHJlYW1vbihjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX3N0cmVhbW9mZihjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19HX1BBUk06Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX2dfcGFybShjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19TX1BBUk06Ci0JCXJldHVybiB6YzAzMDFfdmlkaW9jX3NfcGFybShjYW0sIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19HX1NURDoKLQljYXNlIFZJRElPQ19TX1NURDoKLQljYXNlIFZJRElPQ19RVUVSWVNURDoKLQljYXNlIFZJRElPQ19FTlVNU1REOgotCWNhc2UgVklESU9DX1FVRVJZTUVOVToKLQljYXNlIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTOgotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCi0JfQotfQotCi0KLXN0YXRpYyBsb25nIHpjMDMwMV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB6YzAzMDFfZGV2aWNlICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCWludCBlcnIgPSAwOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3BfbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7Ci0JCURCRygxLCAiRGV2aWNlIG5vdCBwcmVzZW50Iik7Ci0JCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7Ci0JCURCRygxLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCAiCi0JCSAgICAgICAiYWdhaW4uIik7Ci0JCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlWNExEQkcoMywgInpjMDMwMSIsIGNtZCk7Ci0KLQllcnIgPSB6YzAzMDFfaW9jdGxfdjRsMihmaWxwLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0KLQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB6YzAzMDFfZm9wcyA9IHsKLQkub3duZXIgPSAgIFRISVNfTU9EVUxFLAotCS5vcGVuID0gICAgemMwMzAxX29wZW4sCi0JLnJlbGVhc2UgPSB6YzAzMDFfcmVsZWFzZSwKLQkuaW9jdGwgPSAgIHpjMDMwMV9pb2N0bCwKLQkucmVhZCA9ICAgIHpjMDMwMV9yZWFkLAotCS5wb2xsID0gICAgemMwMzAxX3BvbGwsCi0JLm1tYXAgPSAgICB6YzAzMDFfbW1hcCwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotemMwMzAxX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSogaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQqIGlkKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtOwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X25yOwotCXVuc2lnbmVkIGludCBpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKCEoY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpjMDMwMV9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2FtLT51c2JkZXYgPSB1ZGV2OwotCi0JaWYgKCEoY2FtLT5jb250cm9sX2J1ZmZlciA9IGt6YWxsb2MoNCwgR0ZQX0tFUk5FTCkpKSB7Ci0JCURCRygxLCAia21hbGxvYygpIGZhaWxlZCIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKCEoY2FtLT52NGxkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKSkpIHsKLQkJREJHKDEsICJ2aWRlb19kZXZpY2VfYWxsb2MoKSBmYWlsZWQiKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsOwotCX0KLQotCURCRygyLCAiWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwIGRldGVjdGVkICIKLQkgICAgICAgIih2aWQvcGlkIDB4JTA0WDoweCUwNFgpIixpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOwotCi0JZm9yICAoaSA9IDA7IHpjMDMwMV9zZW5zb3JfdGFibGVbaV07IGkrKykgewotCQllcnIgPSB6YzAzMDFfc2Vuc29yX3RhYmxlW2ldKGNhbSk7Ci0JCWlmICghZXJyKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFlcnIpCi0JCURCRygyLCAiJXMgaW1hZ2Ugc2Vuc29yIGRldGVjdGVkIiwgY2FtLT5zZW5zb3IubmFtZSk7Ci0JZWxzZSB7Ci0JCURCRygxLCAiTm8gc3VwcG9ydGVkIGltYWdlIHNlbnNvciBkZXRlY3RlZCIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKHpjMDMwMV9pbml0KGNhbSkpIHsKLQkJREJHKDEsICJJbml0aWFsaXphdGlvbiBmYWlsZWQuIEkgd2lsbCByZXRyeSBvbiBvcGVuKCkuIik7Ci0JCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7Ci0JfQotCi0Jc3RyY3B5KGNhbS0+djRsZGV2LT5uYW1lLCAiWkMwMzAxW1BdIFBDIENhbWVyYSIpOwotCWNhbS0+djRsZGV2LT5mb3BzID0gJnpjMDMwMV9mb3BzOwotCWNhbS0+djRsZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7Ci0JY2FtLT52NGxkZXYtPnBhcmVudCA9ICZ1ZGV2LT5kZXY7Ci0JdmlkZW9fc2V0X2RydmRhdGEoY2FtLT52NGxkZXYsIGNhbSk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmNhbS0+cHJvYmUpOwotCi0JZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAotCQkJCSAgICB2aWRlb19ucltkZXZfbnJdKTsKLQlpZiAoZXJyKSB7Ci0JCURCRygxLCAiVjRMMiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCQlpZiAoZXJyID09IC1FTkZJTEUgJiYgdmlkZW9fbnJbZGV2X25yXSA9PSAtMSkKLQkJCURCRygxLCAiRnJlZSAvZGV2L3ZpZGVvWCBub2RlIG5vdCBmb3VuZCIpOwotCQl2aWRlb19ucltkZXZfbnJdID0gLTE7Ci0JCWRldl9uciA9IChkZXZfbnIgPCBaQzAzMDFfTUFYX0RFVklDRVMtMSkgPyBkZXZfbnIrMSA6IDA7Ci0JCWNvbXBsZXRlX2FsbCgmY2FtLT5wcm9iZSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlEQkcoMiwgIlY0TDIgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgJXMiLAotCSAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGNhbS0+djRsZGV2KSk7Ci0KLQljYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgPSBmb3JjZV9tdW5tYXBbZGV2X25yXTsKLQljYW0tPm1vZHVsZV9wYXJhbS5mcmFtZV90aW1lb3V0ID0gZnJhbWVfdGltZW91dFtkZXZfbnJdOwotCi0JZGV2X25yID0gKGRldl9uciA8IFpDMDMwMV9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKLQotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FtKTsKLQlrcmVmX2luaXQoJmNhbS0+a3JlZik7Ci0JdXNiX2dldF9kZXYoY2FtLT51c2JkZXYpOwotCi0JY29tcGxldGVfYWxsKCZjYW0tPnByb2JlKTsKLQotCXJldHVybiAwOwotCi1mYWlsOgotCWlmIChjYW0pIHsKLQkJa2ZyZWUoY2FtLT5jb250cm9sX2J1ZmZlcik7Ci0JCWlmIChjYW0tPnY0bGRldikKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGNhbS0+djRsZGV2KTsKLQkJa2ZyZWUoY2FtKTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgdm9pZCB6YzAzMDFfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UqIGludGYpCi17Ci0Jc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbTsKLQotCWRvd25fd3JpdGUoJnpjMDMwMV9kZXZfbG9jayk7Ci0KLQljYW0gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCi0JREJHKDIsICJEaXNjb25uZWN0aW5nICVzLi4uIiwgY2FtLT52NGxkZXYtPm5hbWUpOwotCi0JaWYgKGNhbS0+dXNlcnMpIHsKLQkJREJHKDIsICJEZXZpY2UgJXMgaXMgb3BlbiEgRGVyZWdpc3RyYXRpb24gYW5kICIKLQkJICAgICAgICJtZW1vcnkgZGVhbGxvY2F0aW9uIGFyZSBkZWZlcnJlZC4iLAotCQkgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShjYW0tPnY0bGRldikpOwotCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwotCQl6YzAzMDFfc3RvcF90cmFuc2ZlcihjYW0pOwotCQljYW0tPnN0YXRlIHw9IERFVl9ESVNDT05ORUNURUQ7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X2ZyYW1lKTsKLQkJd2FrZV91cCgmY2FtLT53YWl0X3N0cmVhbSk7Ci0JfSBlbHNlCi0JCWNhbS0+c3RhdGUgfD0gREVWX0RJU0NPTk5FQ1RFRDsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmNhbS0+d2FpdF9vcGVuKTsKLQotCWtyZWZfcHV0KCZjYW0tPmtyZWYsIHpjMDMwMV9yZWxlYXNlX3Jlc291cmNlcyk7Ci0KLQl1cF93cml0ZSgmemMwMzAxX2Rldl9sb2NrKTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgemMwMzAxX3VzYl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAgICAgICAiemMwMzAxIiwKLQkuaWRfdGFibGUgPSAgIHpjMDMwMV9pZF90YWJsZSwKLQkucHJvYmUgPSAgICAgIHpjMDMwMV91c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSB6YzAzMDFfdXNiX2Rpc2Nvbm5lY3QsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19pbml0IHpjMDMwMV9tb2R1bGVfaW5pdCh2b2lkKQotewotCWludCBlcnIgPSAwOwotCi0JS0RCRygyLCBaQzAzMDFfTU9EVUxFX05BTUUgIiB2IiBaQzAzMDFfTU9EVUxFX1ZFUlNJT04pOwotCUtEQkcoMywgWkMwMzAxX01PRFVMRV9BVVRIT1IpOwotCi0JaWYgKChlcnIgPSB1c2JfcmVnaXN0ZXIoJnpjMDMwMV91c2JfZHJpdmVyKSkpCi0JCUtEQkcoMSwgInVzYl9yZWdpc3RlcigpIGZhaWxlZCIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgemMwMzAxX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JdXNiX2RlcmVnaXN0ZXIoJnpjMDMwMV91c2JfZHJpdmVyKTsKLX0KLQotCi1tb2R1bGVfaW5pdCh6YzAzMDFfbW9kdWxlX2luaXQpOwotbW9kdWxlX2V4aXQoemMwMzAxX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9wYXMyMDJiY2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9wYXMyMDJiY2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMGRmYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGFzMjAyYmNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGx1Zy1pbiBmb3IgUEFTMjAyQkNCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFpDMDMwMSBJbWFnZSAgICAgICAgKgotICogUHJvY2Vzc29yIGFuZCBDb250cm9sIENoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogSW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHRoZSBaQzAzMDFbUF0gaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggKgotICogZHJpdmVyIG1haW50YWluZWQgYnkgTWljaGVsIFhoYWFyZCA8bXhoYWFyZEBtYWdpYy5mcj4gICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgIE5PVEU6IFNlbnNvciBjb250cm9scyBhcmUgZGlzYWJsZWQgZm9yIG5vdywgYmVjb3VzZSBjaGFuZ2luZyB0aGVtIHdoaWxlCi0JIHN0cmVhbWluZyBzb21ldGltZXMgcmVzdWx0cyBpbiBvdXQtb2Ytc3luYyB2aWRlbyBmcmFtZXMuIFdlJ2xsIHVzZQotCSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiwgdW50aWwgd2Uga25vdyBob3cgdG8gc3RvcCBhbmQgc3RhcnQgdmlkZW8KLQkgaW4gdGhlIGNoaXAuIEhvd2V2ZXIsIHRoZSBpbWFnZSBxdWFsaXR5IHN0aWxsIGxvb2tzIGdvb2QgdW5kZXIgdmFyaW91cwotCSBsaWdodCBjb25kaXRpb25zLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAiemMwMzAxX3NlbnNvci5oIgotCi0KLXN0YXRpYyBzdHJ1Y3QgemMwMzAxX3NlbnNvciBwYXMyMDJiY2I7Ci0KLQotc3RhdGljIGludCBwYXMyMDJiY2JfaW5pdChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtKQotewotCWludCBlcnIgPSAwOwotCi0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDIsIDB4MDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAzLCAweDAyKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwNCwgMHg4MCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDUsIDB4MDEpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDA2LCAweEUwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA5OCwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOUEsIDB4MDMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTFBLCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExQywgMHgwMyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOUIsIDB4MDEpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDlDLCAweEU2KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA5RCwgMHgwMik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOUUsIDB4ODYpOwotCi0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDAyLCAweDAyKTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MEEsIDB4MDEpOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwQiwgMHgwMSk7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDBELCAweDAwKTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MTIsIDB4MDUpOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgxMywgMHg2Myk7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDE1LCAweDcwKTsKLQotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTAxLCAweEI3KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwMCwgMHgwRCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODksIDB4MDYpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFELCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDNSwgMHgwMyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQ0IsIDB4MTMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMjUwLCAweDA4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDMwMSwgMHgwOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOEQsIDB4NzApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDA4LCAweDAzKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDNiwgMHgwNCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQ0IsIDB4MDcpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTIwLCAweDExKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEyMSwgMHgzNyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMjIsIDB4NTgpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTIzLCAweDc5KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEyNCwgMHg5MSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMjUsIDB4QTYpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTI2LCAweEI4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEyNywgMHhDNyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMjgsIDB4RDMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTI5LCAweERFKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEyQSwgMHhFNik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMkIsIDB4RUQpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTJDLCAweEYzKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEyRCwgMHhGOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMkUsIDB4RkIpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTJGLCAweEZGKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEzMCwgMHgyNik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMzEsIDB4MjMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTMyLCAweDIwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEzMywgMHgxQyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMzQsIDB4MTYpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTM1LCAweDEzKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEzNiwgMHgxMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMzcsIDB4MEQpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTM4LCAweDBCKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEzOSwgMHgwOSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxM0EsIDB4MDcpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTNCLCAweDA2KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEzQywgMHgwNSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxM0QsIDB4MDQpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTNFLCAweDAzKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEzRiwgMHgwMik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEEsIDB4NEMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBCLCAweEY1KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQywgMHhGRik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEQsIDB4RjkpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBFLCAweDUxKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRiwgMHhGNSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTAsIDB4RkIpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTExLCAweEVEKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMiwgMHg1Rik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODAsIDB4MDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDE5LCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA4NywgMHgyMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwODgsIDB4MjEpOwotCi0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDIwLCAweDAyKTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MjEsIDB4MUIpOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwMywgMHg0NCk7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDBFLCAweDAxKTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MEYsIDB4MDApOwotCi0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQTksIDB4MTQpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFBLCAweDI0KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5MCwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTEsIDB4MDIpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTkyLCAweDFCKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5NSwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTYsIDB4MDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTk3LCAweDREKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4QywgMHgxMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOEYsIDB4MjApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDFELCAweDQ0KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxRSwgMHg2Rik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMUYsIDB4QUQpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDIwLCAweEVCKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA4NywgMHgwRik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwODgsIDB4MEUpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTgwLCAweDQwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5MiwgMHgxQik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTEsIDB4MDIpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTkwLCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExNiwgMHgxRCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTcsIDB4NDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTE4LCAweDk5KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4MCwgMHg0Mik7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTYsIDB4MUQpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTE3LCAweDQwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExOCwgMHg5OSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDcsIDB4MDApOwotCi0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDExLCAweDAxKTsKLQotCW1zbGVlcCgxMDApOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgaW50IHBhczIwMmJjYl9nZXRfY3RybChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLAotCQkJICAgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKLXsKLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJewotCQkJaW50IHIxID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgwNCwgMSksCi0JCQkgICAgcjIgPSB6YzAzMDFfaTJjX3JlYWQoY2FtLCAweDA1LCAxKTsKLQkJCWlmIChyMSA8IDAgfHwgcjIgPCAwKQotCQkJCXJldHVybiAtRUlPOwotCQkJY3RybC0+dmFsdWUgPSAocjEgPDwgNikgfCAocjIgJiAweDNmKTsKLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgwOSwgMSkpIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSAmPSAweDBmOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHpjMDMwMV9pMmNfcmVhZChjYW0sIDB4MDcsIDEpKSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgJj0gMHgwZjsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgxMCwgMSkpIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSAmPSAweDFmOwotCQlyZXR1cm4gMDsKLQljYXNlIFpDMDMwMV9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgwOCwgMSkpIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSAmPSAweDBmOwotCQlyZXR1cm4gMDsKLQljYXNlIFpDMDMwMV9WNEwyX0NJRF9EQUNfTUFHTklUVURFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgwYywgMSkpIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLQotc3RhdGljIGludCBwYXMyMDJiY2Jfc2V0X2N0cmwoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCi17Ci0JaW50IGVyciA9IDA7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDA0LCBjdHJsLT52YWx1ZSA+PiA2KTsKLQkJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDA1LCBjdHJsLT52YWx1ZSAmIDB4M2YpOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDksIGN0cmwtPnZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwNywgY3RybC0+dmFsdWUpOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgxMCwgY3RybC0+dmFsdWUpOwotCQlicmVhazsKLQljYXNlIFpDMDMwMV9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDgsIGN0cmwtPnZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBaQzAzMDFfVjRMMl9DSURfREFDX01BR05JVFVERToKLQkJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDBjLCBjdHJsLT52YWx1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MTEsIDB4MDEpOwotCi0JcmV0dXJuIGVyciA/IC1FSU8gOiAwOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgemMwMzAxX3NlbnNvciBwYXMyMDJiY2IgPSB7Ci0JLm5hbWUgPSAiUEFTMjAyQkNCIiwKLQkuaW5pdCA9ICZwYXMyMDJiY2JfaW5pdCwKLQkucWN0cmwgPSB7Ci0JCXsKLQkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAotCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAotCQkJLm1pbmltdW0gPSAweDAxZTUsCi0JCQkubWF4aW11bSA9IDB4M2ZmZiwKLQkJCS5zdGVwID0gMHgwMDAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxZTUsCi0JCQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKLQkJfSwKLQkJewotCQkJLmlkID0gVjRMMl9DSURfR0FJTiwKLQkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJCS5uYW1lID0gImdsb2JhbCBnYWluIiwKLQkJCS5taW5pbXVtID0gMHgwMCwKLQkJCS5tYXhpbXVtID0gMHgxZiwKLQkJCS5zdGVwID0gMHgwMSwKLQkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwYywKLQkJCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAotCQl9LAotCQl7Ci0JCQkuaWQgPSBaQzAzMDFfVjRMMl9DSURfREFDX01BR05JVFVERSwKLQkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJCS5uYW1lID0gIkRBQyBtYWduaXR1ZGUiLAotCQkJLm1pbmltdW0gPSAweDAwLAotCQkJLm1heGltdW0gPSAweGZmLAotCQkJLnN0ZXAgPSAweDAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAotCQkJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCi0JCX0sCi0JCXsKLQkJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAotCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkJLm5hbWUgPSAicmVkIGJhbGFuY2UiLAotCQkJLm1pbmltdW0gPSAweDAwLAotCQkJLm1heGltdW0gPSAweDBmLAotCQkJLnN0ZXAgPSAweDAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxLAotCQkJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCi0JCX0sCi0JCXsKLQkJCS5pZCA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKLQkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJCS5uYW1lID0gImJsdWUgYmFsYW5jZSIsCi0JCQkubWluaW11bSA9IDB4MDAsCi0JCQkubWF4aW11bSA9IDB4MGYsCi0JCQkuc3RlcCA9IDB4MDEsCi0JCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDUsCi0JCQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKLQkJfSwKLQkJewotCQkJLmlkID0gWkMwMzAxX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UsCi0JCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCQkubmFtZSA9ICJncmVlbiBiYWxhbmNlIiwKLQkJCS5taW5pbXVtID0gMHgwMCwKLQkJCS5tYXhpbXVtID0gMHgwZiwKLQkJCS5zdGVwID0gMHgwMSwKLQkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKLQkJCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAotCQl9LAotCX0sCi0JLmdldF9jdHJsID0gJnBhczIwMmJjYl9nZXRfY3RybCwKLQkuc2V0X2N0cmwgPSAmcGFzMjAyYmNiX3NldF9jdHJsLAotCS5jcm9wY2FwID0gewotCQkuYm91bmRzID0gewotCQkJLmxlZnQgPSAwLAotCQkJLnRvcCA9IDAsCi0JCQkud2lkdGggPSA2NDAsCi0JCQkuaGVpZ2h0ID0gNDgwLAotCQl9LAotCQkuZGVmcmVjdCA9IHsKLQkJCS5sZWZ0ID0gMCwKLQkJCS50b3AgPSAwLAotCQkJLndpZHRoID0gNjQwLAotCQkJLmhlaWdodCA9IDQ4MCwKLQkJfSwKLQl9LAotCS5waXhfZm9ybWF0ID0gewotCQkud2lkdGggPSA2NDAsCi0JCS5oZWlnaHQgPSA0ODAsCi0JCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9KUEVHLAotCQkucHJpdiA9IDgsCi0JCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JfSwKLX07Ci0KLQotaW50IHpjMDMwMV9wcm9iZV9wYXMyMDJiY2Ioc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSkKLXsKLQlpbnQgcjAgPSAwLCByMSA9IDAsIGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IHBpZCA9IDA7Ci0KLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgwMSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MGUpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAxLCAweDAxKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwMyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTIsIDB4MDEpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDhkLCAweDA4KTsKLQotCW1zbGVlcCgxMCk7Ci0KLQlyMCA9IHpjMDMwMV9pMmNfcmVhZChjYW0sIDB4MDAsIDEpOwotCXIxID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgwMSwgMSk7Ci0KLQlpZiAocjAgPCAwIHx8IHIxIDwgMCB8fCBlcnIpCi0JCXJldHVybiAtRUlPOwotCi0JcGlkID0gKHIwIDw8IDQpIHwgKChyMSAmIDB4ZjApID4+IDQpOwotCWlmIChwaWQgIT0gMHgwMTcpCi0JCXJldHVybiAtRU5PREVWOwotCi0JemMwMzAxX2F0dGFjaF9zZW5zb3IoY2FtLCAmcGFzMjAyYmNiKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BiMDMzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BiMDMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTE5YWJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9wYjAzMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQbHVnLWluIGZvciBQQi0wMzMwIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFpDMDMwMVAgSW1hZ2UgICAgICAgICAqCi0gKiBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBJbml0aWFsaXphdGlvbiB2YWx1ZXMgb2YgdGhlIFpDMDMwMVtQXSBoYXZlIGJlZW4gdGFrZW4gZnJvbSB0aGUgU1BDQTVYWCAqCi0gKiBkcml2ZXIgbWFpbnRhaW5lZCBieSBNaWNoZWwgWGhhYXJkIDxteGhhYXJkQG1hZ2ljLmZyPiAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJ6YzAzMDFfc2Vuc29yLmgiCi0KLQotc3RhdGljIHN0cnVjdCB6YzAzMDFfc2Vuc29yIHBiMDMzMDsKLQotCi1zdGF0aWMgaW50IHBiMDMzMF9pbml0KHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pCi17Ci0JaW50IGVyciA9IDA7Ci0KLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgwMSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDgsIDB4MDMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEwLCAweDBBKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwMiwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDMsIDB4MDIpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDA0LCAweDgwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwNSwgMHgwMSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDYsIDB4RTApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAxLCAweDAxKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwNSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTIsIDB4MDcpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDk4LCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA5QSwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMUEsIDB4MDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTFDLCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwNSk7Ci0KLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDEsIDB4MDAwNik7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDAyLCAweDAwMTEpOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwMywgMHgwMUU3KTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDQsIDB4MDI4Nyk7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDA2LCAweDAwMDMpOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwNywgMHgzMDAyKTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MjAsIDB4MTEwMCk7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDJGLCAweEY3QjApOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgzMCwgMHgwMDA1KTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MzEsIDB4MDAwMCk7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDM0LCAweDAxMDApOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgzNSwgMHgwMDYwKTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4M0QsIDB4MDY4Rik7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDQwLCAweDAxRTApOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHg1OCwgMHgwMDc4KTsKLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4NjIsIDB4MDQxMSk7Ci0KLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDA4NywgMHgxMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMDEsIDB4MzcpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDA1KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwMCwgMHgwRCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODksIDB4MDYpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFELCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDNSwgMHgwMyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQ0IsIDB4MTMpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMjUwLCAweDA4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDMwMSwgMHgwOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQTgsIDB4NjApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMThELCAweDZDKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBRCwgMHgwOSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQUUsIDB4MTUpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBBLCAweDUwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQiwgMHhGOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEMsIDB4RjgpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBELCAweEY4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRSwgMHg1MCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEYsIDB4RjgpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTEwLCAweEY4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMSwgMHhGOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTIsIDB4NTApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDA4LCAweDAzKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDNiwgMHgwOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQ0IsIDB4MEYpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBBLCAweDUwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQiwgMHhGOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEMsIDB4RjgpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBELCAweEY4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRSwgMHg1MCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEYsIDB4RjgpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTEwLCAweEY4KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMSwgMHhGOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTIsIDB4NTApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTgwLCAweDAwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxOSwgMHgwMCk7Ci0KLQllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDUsIDB4MDA2Nik7Ci0JZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDA5LCAweDAyQjIpOwotCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgxMCwgMHgwMDAyKTsKLQotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTFELCAweDYwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5MCwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTEsIDB4MDcpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTkyLCAweDhDKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5NSwgMHgwMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTYsIDB4MDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTk3LCAweDhBKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4QywgMHgxMCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOEYsIDB4MjApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUE5LCAweDE0KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBQSwgMHgyNCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMUQsIDB4RDcpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDFFLCAweEYwKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxRiwgMHhGOCk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMjAsIDB4RkYpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFELCAweDA5KTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBRSwgMHgxNSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODAsIDB4NDApOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTgwLCAweDQyKTsKLQotCW1zbGVlcCgxMDApOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHpjMDMwMV9zZW5zb3IgcGIwMzMwID0gewotCS5uYW1lID0gIlBCLTAzMzAiLAotCS5pbml0ID0gJnBiMDMzMF9pbml0LAotCS5jcm9wY2FwID0gewotCQkuYm91bmRzID0gewotCQkJLmxlZnQgPSAwLAotCQkJLnRvcCA9IDAsCi0JCQkud2lkdGggPSA2NDAsCi0JCQkuaGVpZ2h0ID0gNDgwLAotCQl9LAotCQkuZGVmcmVjdCA9IHsKLQkJCS5sZWZ0ID0gMCwKLQkJCS50b3AgPSAwLAotCQkJLndpZHRoID0gNjQwLAotCQkJLmhlaWdodCA9IDQ4MCwKLQkJfSwKLQl9LAotCS5waXhfZm9ybWF0ID0gewotCQkud2lkdGggPSA2NDAsCi0JCS5oZWlnaHQgPSA0ODAsCi0JCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9KUEVHLAotCQkucHJpdiA9IDgsCi0JCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JfSwKLX07Ci0KLQotaW50IHpjMDMwMV9wcm9iZV9wYjAzMzAoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSkKLXsKLQlpbnQgcjAsIGVyciA9IDA7Ci0KLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgwMSk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MGEpOwotCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAxLCAweDAxKTsKLQllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwMyk7Ci0JZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTIsIDB4MDEpOwotCi0JbXNsZWVwKDEwKTsKLQotCXIwID0gemMwMzAxX2kyY19yZWFkKGNhbSwgMHgwMCwgMik7Ci0KLQlpZiAocjAgPCAwIHx8IGVycikKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAocjAgIT0gMHg4MjQzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXpjMDMwMV9hdHRhY2hfc2Vuc29yKGNhbSwgJnBiMDMzMCk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9zZW5zb3IuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9zZW5zb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlNzgzYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfc2Vuc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQVBJIGZvciBpbWFnZSBzZW5zb3JzIGNvbm5lY3RlZCB0byB0aGUgWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgICAgKgotICogQ29udHJvbCBDaGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfWkMwMzAxX1NFTlNPUl9IXwotI2RlZmluZSBfWkMwMzAxX1NFTlNPUl9IXwotCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotc3RydWN0IHpjMDMwMV9kZXZpY2U7Ci1zdHJ1Y3QgemMwMzAxX3NlbnNvcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gaW50IHpjMDMwMV9wcm9iZV9wYXMyMDJiY2Ioc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSk7Ci1leHRlcm4gaW50IHpjMDMwMV9wcm9iZV9wYjAzMzAoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSk7Ci0KLSNkZWZpbmUgWkMwMzAxX1NFTlNPUl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS8qIFdlYWsgZGV0ZWN0aW9ucyBtdXN0IGdvIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBpbnQgKCp6YzAzMDFfc2Vuc29yX3RhYmxlW10pKHN0cnVjdCB6YzAzMDFfZGV2aWNlKikgPSB7ICAgICAgICAgICAgICAgIFwKLQkmemMwMzAxX3Byb2JlX3BhczIwMmJjYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSZ6YzAzMDFfcHJvYmVfcGIwMzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgemMwMzAxX2RldmljZSoKLXpjMDMwMV9tYXRjaF9pZChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwotCi1leHRlcm4gdm9pZAotemMwMzAxX2F0dGFjaF9zZW5zb3Ioc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSwgc3RydWN0IHpjMDMwMV9zZW5zb3IqIHNlbnNvcik7Ci0KLSNkZWZpbmUgWkMwMzAxX1VTQl9ERVZJQ0UodmVuZCwgcHJvZCwgaW50Y2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkuaWRWZW5kb3IgPSAodmVuZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS5pZFByb2R1Y3QgPSAocHJvZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLmJJbnRlcmZhY2VDbGFzcyA9IChpbnRjbGFzcykKLQotI2lmICFkZWZpbmVkIENPTkZJR19VU0JfR1NQQ0FfWkMzWFggJiYgIWRlZmluZWQgQ09ORklHX1VTQl9HU1BDQV9aQzNYWF9NT0RVTEUKLSNkZWZpbmUgWkMwMzAxX0lEX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCB6YzAzMDFfaWRfdGFibGVbXSA9ICB7ICAgICAgICAgICAgICAgICAgICAgIFwKLQl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQ2ZCwgMHgwOGFlLCAweGZmKSwgfSwgLyogUEFTMjAyICovICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwYWM4LCAweDMwM2IsIDB4ZmYpLCB9LCAvKiBQQi0wMzMwICovICAgICAgICAgICBcCi0JeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX07Ci0jZWxzZQotI2RlZmluZSBaQzAzMDFfSURfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHpjMDMwMV9pZF90YWJsZVtdID0gIHsgICAgICAgICAgICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDIgKi8gICAgICAgICAgICBcCi0JeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX07Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gaW50IHpjMDMwMV93cml0ZV9yZWcoc3RydWN0IHpjMDMwMV9kZXZpY2UqLCB1MTYgaW5kZXgsIHUxNiB2YWx1ZSk7Ci1leHRlcm4gaW50IHpjMDMwMV9yZWFkX3JlZyhzdHJ1Y3QgemMwMzAxX2RldmljZSosIHUxNiBpbmRleCk7Ci1leHRlcm4gaW50IHpjMDMwMV9pMmNfd3JpdGUoc3RydWN0IHpjMDMwMV9kZXZpY2UqLCB1MTYgYWRkcmVzcywgdTE2IHZhbHVlKTsKLWV4dGVybiBpbnQgemMwMzAxX2kyY19yZWFkKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiwgdTE2IGFkZHJlc3MsIHU4IGxlbmd0aCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBaQzAzMDFfTUFYX0NUUkxTIChWNEwyX0NJRF9MQVNUUDEgLSBWNEwyX0NJRF9CQVNFICsgMTApCi0jZGVmaW5lIFpDMDMwMV9WNEwyX0NJRF9EQUNfTUFHTklUVURFIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQotI2RlZmluZSBaQzAzMDFfVjRMMl9DSURfR1JFRU5fQkFMQU5DRSAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKLQotc3RydWN0IHpjMDMwMV9zZW5zb3IgewotCWNoYXIgbmFtZVszMl07Ci0KLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcWN0cmxbWkMwMzAxX01BWF9DVFJMU107Ci0Jc3RydWN0IHY0bDJfY3JvcGNhcCBjcm9wY2FwOwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgcGl4X2Zvcm1hdDsKLQotCWludCAoKmluaXQpKHN0cnVjdCB6YzAzMDFfZGV2aWNlKik7Ci0JaW50ICgqZ2V0X2N0cmwpKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiwgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCk7Ci0JaW50ICgqc2V0X2N0cmwpKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiwKLQkJCWNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpOwotCWludCAoKnNldF9jcm9wKShzdHJ1Y3QgemMwMzAxX2RldmljZSosIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpOwotCi0JLyogUHJpdmF0ZSAqLwotCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBfcWN0cmxbWkMwMzAxX01BWF9DVFJMU107Ci0Jc3RydWN0IHY0bDJfcmVjdCBfcmVjdDsKLX07Ci0KLSNlbmRpZiAvKiBfWkMwMzAxX1NFTlNPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi92aWRlb2NvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3ZpZGVvY29kZWMuYwppbmRleCBjZjI0OTU2Li5jMDEwNzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3ZpZGVvY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3ZpZGVvY29kZWMuYwpAQCAtMTA3LDE1ICsxMDcsMTQgQEAKIAkJCWlmICghdHJ5X21vZHVsZV9nZXQoaC0+Y29kZWMtPm93bmVyKSkKIAkJCQlyZXR1cm4gTlVMTDsKIAotCQkJY29kZWMgPQotCQkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJCQljb2RlYyA9IGttZW1kdXAoaC0+Y29kZWMsIHNpemVvZihzdHJ1Y3QgdmlkZW9jb2RlYyksCisJCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKCFjb2RlYykgewogCQkJCWRwcmludGsoMSwKIAkJCQkJS0VSTl9FUlIKIAkJCQkJInZpZGVvY29kZWNfYXR0YWNoOiBubyBtZW1cbiIpOwogCQkJCWdvdG8gb3V0X21vZHVsZV9wdXQ7CiAJCQl9Ci0JCQltZW1jcHkoY29kZWMsIGgtPmNvZGVjLCBzaXplb2Yoc3RydWN0IHZpZGVvY29kZWMpKTsKIAogCQkJc25wcmludGYoY29kZWMtPm5hbWUsIHNpemVvZihjb2RlYy0+bmFtZSksCiAJCQkJICIlc1slZF0iLCBjb2RlYy0+bmFtZSwgaC0+YXR0YWNoZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbi5oCmluZGV4IDg5OTdhZGQuLjMwN2U4NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW4uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmgKQEAgLTM5MSw3ICszOTEsNyBAQAogCiAJc3RydWN0IG11dGV4IHJlc291cmNlX2xvY2s7CS8qIHByZXZlbnQgZXZpbCBzdHVmZiAqLwogCi0JdTggaW5pdGlhbGl6ZWQ7CQkvKiBmbGFnIGlmIHpvcmFuIGhhcyBiZWVuIGNvcnJlY3RseSBpbml0YWxpemVkICovCisJdTggaW5pdGlhbGl6ZWQ7CQkvKiBmbGFnIGlmIHpvcmFuIGhhcyBiZWVuIGNvcnJlY3RseSBpbml0aWFsaXplZCAqLwogCWludCB1c2VyOwkJLyogbnVtYmVyIG9mIGN1cnJlbnQgdXNlcnMgKi8KIAlzdHJ1Y3QgY2FyZF9pbmZvIGNhcmQ7CiAJc3RydWN0IHR2bm9ybSAqdGltaW5nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZGV2aWNlLmMKaW5kZXggZTZhZDRiMi4uNmY4NDZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RldmljZS5jCkBAIC00ODQsNyArNDg0LDcgQEAKIAkJCQl6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQpOwogCiAJCS8qIFN0YXJ0IGFuZCBsZW5ndGggb2YgZWFjaCBsaW5lIE1VU1QgYmUgNC1ieXRlIGFsaWduZWQuCi0JCSAqIFRoaXMgc2hvdWxkIGJlIGFsbHJlYWR5IGNoZWNrZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHRoaXMgcm91dGluZS4KKwkJICogVGhpcyBzaG91bGQgYmUgYWxyZWFkeSBjaGVja2VkIGJlZm9yZSB0aGUgY2FsbCB0byB0aGlzIHJvdXRpbmUuCiAJCSAqIEFsbCBlcnJvciBtZXNzYWdlcyBhcmUgaW50ZXJuYWwgZHJpdmVyIGNoZWNraW5nIG9ubHkhICovCiAKIAkJLyogdmlkZW8gZGlzcGxheSB0b3AgYW5kIGJvdHRvbSByZWdpc3RlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjA1MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDUwLmMKaW5kZXggNjM5ZGQ4Ny4uZTE5ODU2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDUwLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCiAgICBDb3VsZCBiZSB2YXJpYWJsZSwgYnV0IHVudGlsIGl0J3Mgbm90IG5lZWRlZCBpdCB0aGV5IGFyZSBqdXN0IGZpeGVkIHRvIHNhdmUKICAgIG1lbW9yeS4gT3RoZXJ3aXNlIGV4cGFuZCB6cjM2MDUwIHN0cnVjdHVyZSB3aXRoIGFycmF5cywgcHVzaCB0aGUgdmFsdWVzIHRvCi0gICBpdCBhbmQgaW5pdGFsaXplIGZyb20gdGhlcmUsIGFzIGUuZy4gdGhlIGxpbnV4IHpyMzYwNTcvNjAgZHJpdmVyIGRvZXMgaXQuCisgICBpdCBhbmQgaW5pdGlhbGl6ZSBmcm9tIHRoZXJlLCBhcyBlLmcuIHRoZSBsaW51eCB6cjM2MDU3LzYwIGRyaXZlciBkb2VzIGl0LgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiBzdGF0aWMgY29uc3QgY2hhciB6cjM2MDUwX2RxdFsweDg2XSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjA2MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDYwLmMKaW5kZXggMDA4NzQ2Zi4uNWU0ZjU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDYwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDYwLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAgICBDb3VsZCBiZSB2YXJpYWJsZSwgYnV0IHVudGlsIGl0J3Mgbm90IG5lZWRlZCBpdCB0aGV5IGFyZSBqdXN0IGZpeGVkIHRvIHNhdmUKICAgIG1lbW9yeS4gT3RoZXJ3aXNlIGV4cGFuZCB6cjM2MDYwIHN0cnVjdHVyZSB3aXRoIGFycmF5cywgcHVzaCB0aGUgdmFsdWVzIHRvCi0gICBpdCBhbmQgaW5pdGFsaXplIGZyb20gdGhlcmUsIGFzIGUuZy4gdGhlIGxpbnV4IHpyMzYwNTcvNjAgZHJpdmVyIGRvZXMgaXQuCisgICBpdCBhbmQgaW5pdGlhbGl6ZSBmcm9tIHRoZXJlLCBhcyBlLmcuIHRoZSBsaW51eCB6cjM2MDU3LzYwIGRyaXZlciBkb2VzIGl0LgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiBzdGF0aWMgY29uc3QgY2hhciB6cjM2MDYwX2RxdFsweDg2XSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKaW5kZXggYTZhNTcwMS4uYjg4YTI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKQEAgLTExNSw2ICsxMTUsNyBAQAogCSIgYW5kIGhhbHQgRmlybXdhcmUgb24gZmF1bHQgLSAoZGVmYXVsdD0wKSIpOwogCiAKK3N0YXRpYyBjaGFyCU1wdENhbGxiYWNrc05hbWVbTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTXVs1MF07CiAKICNpZmRlZiBNRkNOVAogc3RhdGljIGludCBtZmNvdW50ZXIgPSAwOwpAQCAtMjEzLDcgKzIxNCw3IEBACiBzdGF0aWMgdm9pZAltcHRfaW9jc3RhdHVzX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGlvY19zdGF0dXMsIE1QVF9GUkFNRV9IRFIgKm1mKTsKIHN0YXRpYyB2b2lkCW1wdF9mY19sb2dfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgbG9nX2luZm8pOwogc3RhdGljIHZvaWQJbXB0X3NwaV9sb2dfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgbG9nX2luZm8pOwotc3RhdGljIHZvaWQJbXB0X3Nhc19sb2dfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgbG9nX2luZm8pOworc3RhdGljIHZvaWQJbXB0X3Nhc19sb2dfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgbG9nX2luZm8gLCB1OCBjYl9pZHgpOwogc3RhdGljIGludAltcHRfcmVhZF9pb2NfcGdfMyhNUFRfQURBUFRFUiAqaW9jKTsKIHN0YXRpYyB2b2lkCW1wdF9pbmFjdGl2ZV9yYWlkX2xpc3RfZnJlZShNUFRfQURBUFRFUiAqaW9jKTsKIApAQCAtNDkwLDcgKzQ5MSw3IEBACiAJCWVsc2UgaWYgKGlvYy0+YnVzX3R5cGUgPT0gU1BJKQogCQkJbXB0X3NwaV9sb2dfaW5mbyhpb2MsIGxvZ19pbmZvKTsKIAkJZWxzZSBpZiAoaW9jLT5idXNfdHlwZSA9PSBTQVMpCi0JCQltcHRfc2FzX2xvZ19pbmZvKGlvYywgbG9nX2luZm8pOworCQkJbXB0X3Nhc19sb2dfaW5mbyhpb2MsIGxvZ19pbmZvLCBjYl9pZHgpOwogCX0KIAogCWlmIChpb2Nfc3RhdCAmIE1QSV9JT0NTVEFUVVNfTUFTSykKQEAgLTY0NCw3ICs2NDUsNyBAQAogICoJY29uc2lkZXJlZCBhbiBlcnJvciBieSB0aGUgY2FsbGVyLgogICovCiB1OAotbXB0X3JlZ2lzdGVyKE1QVF9DQUxMQkFDSyBjYmZ1bmMsIE1QVF9EUklWRVJfQ0xBU1MgZGNsYXNzKQorbXB0X3JlZ2lzdGVyKE1QVF9DQUxMQkFDSyBjYmZ1bmMsIE1QVF9EUklWRVJfQ0xBU1MgZGNsYXNzLCBjaGFyICpmdW5jX25hbWUpCiB7CiAJdTggY2JfaWR4OwogCWxhc3RfZHJ2X2lkeCA9IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUzsKQEAgLTY1OSw2ICs2NjAsOCBAQAogCQkJTXB0RHJpdmVyQ2xhc3NbY2JfaWR4XSA9IGRjbGFzczsKIAkJCU1wdEV2SGFuZGxlcnNbY2JfaWR4XSA9IE5VTEw7CiAJCQlsYXN0X2Rydl9pZHggPSBjYl9pZHg7CisJCQltZW1jcHkoTXB0Q2FsbGJhY2tzTmFtZVtjYl9pZHhdLCBmdW5jX25hbWUsCisJCQkgICAgc3RybGVuKGZ1bmNfbmFtZSkgPiA1MCA/IDUwIDogc3RybGVuKGZ1bmNfbmFtZSkpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNjMyLDYgKzE2MzUsNyBAQAogCQl9IGVsc2UgewogCQkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIm5vIHN1aXRhYmxlIERNQSBtYXNrIGZvciAlc1xuIiwKIAkJCSAgICBpb2MtPm5hbWUsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgaW9jLT5iYXJzKTsKIAkJCXJldHVybiByOwogCQl9CiAJfSBlbHNlIHsKQEAgLTE2NDUsNiArMTY0OSw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAibm8gc3VpdGFibGUgRE1BIG1hc2sgZm9yICVzXG4iLAogCQkJICAgIGlvYy0+bmFtZSwgcGNpX25hbWUocGRldikpOworCQkJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCBpb2MtPmJhcnMpOwogCQkJcmV0dXJuIHI7CiAJCX0KIAl9CkBAIC0xNjc1LDYgKzE2ODAsNyBAQAogCWlmIChtZW0gPT0gTlVMTCkgewogCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICI6IEVSUk9SIC0gVW5hYmxlIHRvIG1hcCBhZGFwdGVyIgogCQkJIiBtZW1vcnkhXG4iLCBpb2MtPm5hbWUpOworCQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIGlvYy0+YmFycyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpb2MtPm1lbW1hcCA9IG1lbTsKQEAgLTE3NzAsNyArMTc3Niw2IEBACiAJaW9jLT5yZXFfc3ogPSBNUFRfREVGQVVMVF9GUkFNRV9TSVpFOwkJLyogYXZvaWQgZGl2IGJ5IHplcm8hICovCiAJaW9jLT5yZXBseV9zeiA9IE1QVF9SRVBMWV9GUkFNRV9TSVpFOwogCi0JaW9jLT5wY2lkZXYgPSBwZGV2OwogCiAJc3Bpbl9sb2NrX2luaXQoJmlvYy0+dGFza21nbXRfbG9jayk7CiAJbXV0ZXhfaW5pdCgmaW9jLT5pbnRlcm5hbF9jbWRzLm11dGV4KTsKQEAgLTE3OTQsNyArMTc5OSw3IEBACiAJaW9jLT5zaCA9IE5VTEw7CiAJaW9jLT5jYWNoZWRfZncgPSBOVUxMOwogCi0JLyogSW5pdGlsaXplIFNDU0kgQ29uZmlnIERhdGEgc3RydWN0dXJlCisJLyogSW5pdGlhbGl6ZSBTQ1NJIENvbmZpZyBEYXRhIHN0cnVjdHVyZQogCSAqLwogCW1lbXNldCgmaW9jLT5zcGlfZGF0YSwgMCwgc2l6ZW9mKFNwaUNmZ0RhdGEpKTsKIApAQCAtMTkxMyw2ICsxOTE4LDkgQEAKIAkJaW9jLT5tc2lfZW5hYmxlID0gMDsKIAkJYnJlYWs7CiAJfQorCisJaW9jLT5md19ldmVudHNfb2ZmID0gMTsKKwogCWlmIChpb2MtPmVycmF0YV9mbGFnXzEwNjQpCiAJCXBjaV9kaXNhYmxlX2lvX2FjY2VzcyhwZGV2KTsKIApAQCAtMjA1MSw3ICsyMDU5LDYgQEAKIAogCW1wdF9hZGFwdGVyX2Rpc3Bvc2UoaW9jKTsKIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNDcxLDcgKzI0NzgsNyBAQAogCWlmICgocmV0ID09IDApICYmIChyZWFzb24gPT0gTVBUX0hPU1RFVkVOVF9JT0NfQlJJTkdVUCkpIHsKIAogCQkvKgotCQkgKiBJbml0YWxpemUgbGluayBsaXN0IGZvciBpbmFjdGl2ZSByYWlkIHZvbHVtZXMuCisJCSAqIEluaXRpYWxpemUgbGluayBsaXN0IGZvciBpbmFjdGl2ZSByYWlkIHZvbHVtZXMuCiAJCSAqLwogCQltdXRleF9pbml0KCZpb2MtPnJhaWRfZGF0YS5pbmFjdGl2ZV9saXN0X211dGV4KTsKIAkJSU5JVF9MSVNUX0hFQUQoJmlvYy0+cmFpZF9kYXRhLmluYWN0aXZlX2xpc3QpOwpAQCAtNTA2Miw4ICs1MDY5LDkgQEAKIAkJaWYgKGlvYy0+bXB0YmFzZV9jbWRzLnN0YXR1cyAmIE1QVF9NR01UX1NUQVRVU19ESURfSU9DUkVTRVQpCiAJCQlnb3RvIG91dDsKIAkJaWYgKCF0aW1lbGVmdCkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJc3N1aW5nIFJlc2V0IGZyb20gJXMhIVxuIiwKLQkJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCQkgICAgICAgIklzc3VpbmcgUmVzZXQgZnJvbSAlcyEhLCBkb29yYmVsbD0weCUwOHhcbiIsCisJCQkgICAgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgbXB0X0dldElvY1N0YXRlKGlvYywgMCkpOwogCQkJbXB0X1NvZnRfSGFyZF9SZXNldEhhbmRsZXIoaW9jLCBDQU5fU0xFRVApOwogCQkJbXB0X2ZyZWVfbXNnX2ZyYW1lKGlvYywgbWYpOwogCQl9CkBAIC02NDU0LDggKzY0NjIsOSBAQAogCW11dGV4X3VubG9jaygmaW9jLT5tcHRiYXNlX2NtZHMubXV0ZXgpOwogCWlmIChpc3N1ZV9oYXJkX3Jlc2V0KSB7CiAJCWlzc3VlX2hhcmRfcmVzZXQgPSAwOwotCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiSXNzdWluZyBSZXNldCBmcm9tICVzISFcbiIsCi0JCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJICAgICAgICJJc3N1aW5nIFJlc2V0IGZyb20gJXMhISwgZG9vcmJlbGw9MHglMDh4XG4iLAorCQkgICAgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgbXB0X0dldElvY1N0YXRlKGlvYywgMCkpOwogCQlpZiAocmV0cnlfY291bnQgPT0gMCkgewogCQkJaWYgKG1wdF9Tb2Z0X0hhcmRfUmVzZXRIYW5kbGVyKGlvYywgQ0FOX1NMRUVQKSAhPSAwKQogCQkJCXJldHJ5X2NvdW50Kys7CkBAIC02OTcxLDYgKzY5ODAsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+dGFza21nbXRfbG9jaywgZmxhZ3MpOwogCWlmIChpb2MtPnRhc2ttZ210X2luX3Byb2dyZXNzKSB7CisJCWlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT50YXNrbWdtdF9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC03MTQ0LDcgKzcxNTQsOCBAQAogCXJjID0gbXB0X2RvX2lvY19yZWNvdmVyeShpb2MsIE1QVF9IT1NURVZFTlRfSU9DX1JFQ09WRVIsIHNsZWVwRmxhZyk7CiAJaWYgKHJjICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTQotCQkgICAgIjogV0FSTklORyAtICglZCkgQ2Fubm90IHJlY292ZXIgJXNcbiIsIHJjLCBpb2MtPm5hbWUpOworCQkgICAgICAgIjogV0FSTklORyAtICglZCkgQ2Fubm90IHJlY292ZXIgJXMsIGRvb3JiZWxsPTB4JTA4eFxuIiwKKwkJICAgICAgIHJjLCBpb2MtPm5hbWUsIG1wdF9HZXRJb2NTdGF0ZShpb2MsIDApKTsKIAl9IGVsc2UgewogCQlpZiAoaW9jLT5oYXJkX3Jlc2V0cyA8IC0xKQogCQkJaW9jLT5oYXJkX3Jlc2V0cysrOwpAQCAtNzk5Nyw3ICs4MDA4LDcgQEAKICAqCVJlZmVyIHRvIGxzaS9tcGlfbG9nX3Nhcy5oLgogICoqLwogc3RhdGljIHZvaWQKLW1wdF9zYXNfbG9nX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGxvZ19pbmZvKQorbXB0X3Nhc19sb2dfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgbG9nX2luZm8sIHU4IGNiX2lkeCkKIHsKIHVuaW9uIGxvZ2luZm9fdHlwZSB7CiAJdTMyCWxvZ2luZm87CkBAIC04MDUxLDIxICs4MDYyLDIyIEBACiAJaWYgKHN1Yl9jb2RlX2Rlc2MgIT0gTlVMTCkKIAkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQKIAkJCSJMb2dJbmZvKDB4JTA4eCk6IE9yaWdpbmF0b3I9eyVzfSwgQ29kZT17JXN9LCIKLQkJCSIgU3ViQ29kZT17JXN9XG4iLAorCQkJIiBTdWJDb2RlPXslc30gY2JfaWR4ICVzXG4iLAogCQkJaW9jLT5uYW1lLCBsb2dfaW5mbywgb3JpZ2luYXRvcl9kZXNjLCBjb2RlX2Rlc2MsCi0JCQlzdWJfY29kZV9kZXNjKTsKKwkJCXN1Yl9jb2RlX2Rlc2MsIE1wdENhbGxiYWNrc05hbWVbY2JfaWR4XSk7CiAJZWxzZSBpZiAoY29kZV9kZXNjICE9IE5VTEwpCiAJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UCiAJCQkiTG9nSW5mbygweCUwOHgpOiBPcmlnaW5hdG9yPXslc30sIENvZGU9eyVzfSwiCi0JCQkiIFN1YkNvZGUoMHglMDR4KVxuIiwKKwkJCSIgU3ViQ29kZSgweCUwNHgpIGNiX2lkeCAlc1xuIiwKIAkJCWlvYy0+bmFtZSwgbG9nX2luZm8sIG9yaWdpbmF0b3JfZGVzYywgY29kZV9kZXNjLAotCQkJc2FzX2xvZ2luZm8uZHcuc3ViY29kZSk7CisJCQlzYXNfbG9naW5mby5kdy5zdWJjb2RlLCBNcHRDYWxsYmFja3NOYW1lW2NiX2lkeF0pOwogCWVsc2UKIAkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQKIAkJCSJMb2dJbmZvKDB4JTA4eCk6IE9yaWdpbmF0b3I9eyVzfSwgQ29kZT0oMHglMDJ4KSwiCi0JCQkiIFN1YkNvZGUoMHglMDR4KVxuIiwKKwkJCSIgU3ViQ29kZSgweCUwNHgpIGNiX2lkeCAlc1xuIiwKIAkJCWlvYy0+bmFtZSwgbG9nX2luZm8sIG9yaWdpbmF0b3JfZGVzYywKLQkJCXNhc19sb2dpbmZvLmR3LmNvZGUsIHNhc19sb2dpbmZvLmR3LnN1YmNvZGUpOworCQkJc2FzX2xvZ2luZm8uZHcuY29kZSwgc2FzX2xvZ2luZm8uZHcuc3ViY29kZSwKKwkJCU1wdENhbGxiYWNrc05hbWVbY2JfaWR4XSk7CiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KQEAgLTg0MzAsNyArODQ0Miw4IEBACiAJLyogIFJlZ2lzdGVyIG91cnNlbHZlcyAobXB0YmFzZSkgaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZQogCSAqICBFdmVudE5vdGlmaWNhdGlvbiBoYW5kbGluZy4KIAkgKi8KLQltcHRfYmFzZV9pbmRleCA9IG1wdF9yZWdpc3RlcihtcHRiYXNlX3JlcGx5LCBNUFRCQVNFX0RSSVZFUik7CisJbXB0X2Jhc2VfaW5kZXggPSBtcHRfcmVnaXN0ZXIobXB0YmFzZV9yZXBseSwgTVBUQkFTRV9EUklWRVIsCisJICAgICJtcHRiYXNlX3JlcGx5Iik7CiAKIAkvKiBSZWdpc3RlciBmb3IgaGFyZCByZXNldCBoYW5kbGluZyBjYWxsYmFja3MuCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCmluZGV4IGI2MTNlYjMuLjIzZWQzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCkBAIC03Niw4ICs3Niw4IEBACiAjZGVmaW5lIENPUFlSSUdIVAkiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggIiBNT0RVTEVBVVRIT1IKICNlbmRpZgogCi0jZGVmaW5lIE1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgkiMy4wNC4xNSIKLSNkZWZpbmUgTVBUX0xJTlVYX1BBQ0tBR0VfTkFNRQkJIkAoIyltcHRsaW51eC0zLjA0LjE1IgorI2RlZmluZSBNUFRfTElOVVhfVkVSU0lPTl9DT01NT04JIjMuMDQuMTciCisjZGVmaW5lIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUJCSJAKCMpbXB0bGludXgtMy4wNC4xNyIKICNkZWZpbmUgV0hBVF9NQUdJQ19TVFJJTkcJCSJAIiAiKCIgIiMiICIpIgogCiAjZGVmaW5lIHNob3dfbXB0bW9kX3ZlcihzLHZlcikgIFwKQEAgLTM5Niw2ICszOTYsOCBAQAogCXU4CQkJIHJhaWRWb2x1bWU7CS8qIHNldCwgaWYgUkFJRCBWb2x1bWUgKi8KIAl1OAkJCSB0eXBlOwkJLyogYnl0ZSAwIG9mIElucXVpcnkgZGF0YSAqLwogCXU4CQkJIGRlbGV0ZWQ7CS8qIHRhcmdldCBpbiBwcm9jZXNzIG9mIGJlaW5nIHJlbW92ZWQgKi8KKwl1OAkJCSBpbkRNRDsJCS8qIGN1cnJlbnRseSBpbiB0aGUgZGV2aWNlCisJCQkJCQkgICByZW1vdmFsIGRlbGF5IHRpbWVyICovCiAJdTMyCQkJIG51bV9sdW5zOwogfSBWaXJ0VGFyZ2V0OwogCkBAIC01ODAsNiArNTgyLDcgQEAKIHR5cGVkZWYgdm9pZCAoKk1QVF9BRERfU0dFKSh2b2lkICpwQWRkciwgdTMyIGZsYWdzbGVuZ3RoLCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKIHR5cGVkZWYgdm9pZCAoKk1QVF9BRERfQ0hBSU4pKHZvaWQgKnBBZGRyLCB1OCBuZXh0LCB1MTYgbGVuZ3RoLAogCQlkbWFfYWRkcl90IGRtYV9hZGRyKTsKK3R5cGVkZWYgdm9pZCAoKk1QVF9TQ0hFRFVMRV9UQVJHRVRfUkVTRVQpKHZvaWQgKmlvYyk7CiAKIC8qCiAgKiAgQWRhcHRlciBTdHJ1Y3R1cmUgLSBwY2lfZGV2IHNwZWNpZmljLiBNYXhpbXVtOiBNUFRfTUFYX0FEQVBURVJTCkBAIC02MDEsNyArNjA0LDcgQEAKIAl1MTYJCQkgbnZkYXRhX3ZlcnNpb25fZGVmYXVsdDsKIAlpbnQJCQkgZGVidWdfbGV2ZWw7CiAJdTgJCQkgaW9fbWlzc2luZ19kZWxheTsKLQl1OAkJCSBkZXZpY2VfbWlzc2luZ19kZWxheTsKKwl1MTYJCQkgZGV2aWNlX21pc3NpbmdfZGVsYXk7CiAJU1lTSUZfUkVHUyBfX2lvbWVtCSpjaGlwOwkJLyogPT0gYzg4MTcwMDAgKG1tYXApICovCiAJU1lTSUZfUkVHUyBfX2lvbWVtCSpwaW9fY2hpcDsJLyogUHJvZ3JhbW1lZCBJTyAoZG93bmxvYWRib290KSAqLwogCXU4CQkJIGJ1c190eXBlOwpAQCAtNzM4LDYgKzc0MSw3IEBACiAJaW50CQkJIHRhc2ttZ210X2luX3Byb2dyZXNzOwogCXU4CQkJIHRhc2ttZ210X3F1aWVzY2VfaW87CiAJdTgJCQkgaW9jX3Jlc2V0X2luX3Byb2dyZXNzOworCU1QVF9TQ0hFRFVMRV9UQVJHRVRfUkVTRVQgc2NoZWR1bGVfdGFyZ2V0X3Jlc2V0OwogCXN0cnVjdCB3b3JrX3N0cnVjdAkgc2FzX3BlcnNpc3RfdGFzazsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdAkgZmNfc2V0dXBfcmVzZXRfd29yazsKQEAgLTkyMiw3ICs5MjYsOCBAQAogZXh0ZXJuIGludAkgbXB0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50CSBtcHRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNlbmRpZgotZXh0ZXJuIHU4CSBtcHRfcmVnaXN0ZXIoTVBUX0NBTExCQUNLIGNiZnVuYywgTVBUX0RSSVZFUl9DTEFTUyBkY2xhc3MpOworZXh0ZXJuIHU4CSBtcHRfcmVnaXN0ZXIoTVBUX0NBTExCQUNLIGNiZnVuYywgTVBUX0RSSVZFUl9DTEFTUyBkY2xhc3MsCisJCWNoYXIgKmZ1bmNfbmFtZSk7CiBleHRlcm4gdm9pZAkgbXB0X2RlcmVnaXN0ZXIodTggY2JfaWR4KTsKIGV4dGVybiBpbnQJIG1wdF9ldmVudF9yZWdpc3Rlcih1OCBjYl9pZHgsIE1QVF9FVkhBTkRMRVIgZXZfY2JmdW5jKTsKIGV4dGVybiB2b2lkCSBtcHRfZXZlbnRfZGVyZWdpc3Rlcih1OCBjYl9pZHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKaW5kZXggZjA2YjI5MS4uZDhkZGZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCkBAIC0yNjEsMTAgKzI2MSwxNiBAQAogCS8qIFdlIGFyZSBkb25lLCBpc3N1ZSB3YWtlIHVwCiAJICovCiAJaWYgKGlvYy0+aW9jdGxfY21kcy5zdGF0dXMgJiBNUFRfTUdNVF9TVEFUVVNfUEVORElORykgewotCQlpZiAocmVxLT51Lmhkci5GdW5jdGlvbiA9PSBNUElfRlVOQ1RJT05fU0NTSV9UQVNLX01HTVQpCisJCWlmIChyZXEtPnUuaGRyLkZ1bmN0aW9uID09IE1QSV9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVCkgewogCQkJbXB0X2NsZWFyX3Rhc2ttZ210X2luX3Byb2dyZXNzX2ZsYWcoaW9jKTsKLQkJaW9jLT5pb2N0bF9jbWRzLnN0YXR1cyAmPSB+TVBUX01HTVRfU1RBVFVTX1BFTkRJTkc7Ci0JCWNvbXBsZXRlKCZpb2MtPmlvY3RsX2NtZHMuZG9uZSk7CisJCQlpb2MtPmlvY3RsX2NtZHMuc3RhdHVzICY9IH5NUFRfTUdNVF9TVEFUVVNfUEVORElORzsKKwkJCWNvbXBsZXRlKCZpb2MtPmlvY3RsX2NtZHMuZG9uZSk7CisJCQlpZiAoaW9jLT5idXNfdHlwZSA9PSBTQVMpCisJCQkJaW9jLT5zY2hlZHVsZV90YXJnZXRfcmVzZXQoaW9jKTsKKwkJfSBlbHNlIHsKKwkJCWlvYy0+aW9jdGxfY21kcy5zdGF0dXMgJj0gfk1QVF9NR01UX1NUQVRVU19QRU5ESU5HOworCQkJY29tcGxldGUoJmlvYy0+aW9jdGxfY21kcy5kb25lKTsKKwkJfQogCX0KIAogIG91dF9jb250aW51YXRpb246CkBAIC0yOTgsNiArMzA0LDggQEAKIAkJbXB0X2NsZWFyX3Rhc2ttZ210X2luX3Byb2dyZXNzX2ZsYWcoaW9jKTsKIAkJaW9jLT50YXNrbWdtdF9jbWRzLnN0YXR1cyAmPSB+TVBUX01HTVRfU1RBVFVTX1BFTkRJTkc7CiAJCWNvbXBsZXRlKCZpb2MtPnRhc2ttZ210X2NtZHMuZG9uZSk7CisJCWlmIChpb2MtPmJ1c190eXBlID09IFNBUykKKwkJCWlvYy0+c2NoZWR1bGVfdGFyZ2V0X3Jlc2V0KGlvYyk7CiAJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk0Niw5ICs5NTQsMTIgQEAKIAkJCW1wdF9mcmVlX21zZ19mcmFtZShpb2NwLCBtZik7CiAJCQlnb3RvIGZ3ZGxfb3V0OwogCQl9Ci0JCWlmICghdGltZWxlZnQpCisJCWlmICghdGltZWxlZnQpIHsKKwkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCQkgICAgICAgIkZXIGRvd25sb2FkIHRpbWVvdXQsIGRvb3JiZWxsPTB4JTA4eFxuIiwKKwkJCSAgICAgICBpb2NwLT5uYW1lLCBtcHRfR2V0SW9jU3RhdGUoaW9jcCwgMCkpOwogCQkJbXB0Y3RsX3RpbWVvdXRfZXhwaXJlZChpb2NwLCBtZik7Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlnb3RvIHJldHJ5X3dhaXQ7CiAJCWdvdG8gZndkbF9vdXQ7CiAJfQpAQCAtMjI5Myw2ICsyMzA0LDEwIEBACiAJCQlnb3RvIGRvbmVfZnJlZV9tZW07CiAJCX0KIAkJaWYgKCF0aW1lbGVmdCkgeworCQkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCSAgICAgICAibXB0IGNtZCB0aW1lb3V0LCBkb29yYmVsbD0weCUwOHgiCisJCQkgICAgICAgIiBmdW5jdGlvbj0weCV4XG4iLAorCQkJICAgICAgIGlvYy0+bmFtZSwgbXB0X0dldElvY1N0YXRlKGlvYywgMCksIGZ1bmN0aW9uKTsKIAkJCWlmIChmdW5jdGlvbiA9PSBNUElfRlVOQ1RJT05fU0NTSV9UQVNLX01HTVQpCiAJCQkJbXV0ZXhfdW5sb2NrKCZpb2MtPnRhc2ttZ210X2NtZHMubXV0ZXgpOwogCQkJbXB0Y3RsX3RpbWVvdXRfZXhwaXJlZChpb2MsIG1mKTsKQEAgLTI2MDAsOSArMjYxNSwxMiBAQAogCQkJbXB0X2ZyZWVfbXNnX2ZyYW1lKGlvYywgbWYpOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJaWYgKCF0aW1lbGVmdCkKKwkJaWYgKCF0aW1lbGVmdCkgeworCQkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCSAgICAgICAiSE9TVCBJTkZPIGNvbW1hbmQgdGltZW91dCwgZG9vcmJlbGw9MHglMDh4XG4iLAorCQkJICAgICAgIGlvYy0+bmFtZSwgbXB0X0dldElvY1N0YXRlKGlvYywgMCkpOwogCQkJbXB0Y3RsX3RpbWVvdXRfZXhwaXJlZChpb2MsIG1mKTsKLQkJZWxzZQorCQl9IGVsc2UKIAkJCWdvdG8gcmV0cnlfd2FpdDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzAwMCw3ICszMDE4LDggQEAKIAkgKiAgSW5zdGFsbCBvdXIgaGFuZGxlcgogCSAqLwogCSsrd2hlcmU7Ci0JbXB0Y3RsX2lkID0gbXB0X3JlZ2lzdGVyKG1wdGN0bF9yZXBseSwgTVBUQ1RMX0RSSVZFUik7CisJbXB0Y3RsX2lkID0gbXB0X3JlZ2lzdGVyKG1wdGN0bF9yZXBseSwgTVBUQ1RMX0RSSVZFUiwKKwkgICAgIm1wdGN0bF9yZXBseSIpOwogCWlmICghbXB0Y3RsX2lkIHx8IG1wdGN0bF9pZCA+PSBNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SOiBGYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBGdXNpb24gTVBUIGJhc2UgZHJpdmVyXG4iKTsKIAkJbWlzY19kZXJlZ2lzdGVyKCZtcHRjdGxfbWlzY2Rldik7CkBAIC0zMDA4LDcgKzMwMjcsOCBAQAogCQlnb3RvIG91dF9mYWlsOwogCX0KIAotCW1wdGN0bF90YXNrbWdtdF9pZCA9IG1wdF9yZWdpc3RlcihtcHRjdGxfdGFza21nbXRfcmVwbHksIE1QVENUTF9EUklWRVIpOworCW1wdGN0bF90YXNrbWdtdF9pZCA9IG1wdF9yZWdpc3RlcihtcHRjdGxfdGFza21nbXRfcmVwbHksIE1QVENUTF9EUklWRVIsCisJICAgICJtcHRjdGxfdGFza21nbXRfcmVwbHkiKTsKIAlpZiAoIW1wdGN0bF90YXNrbWdtdF9pZCB8fCBtcHRjdGxfdGFza21nbXRfaWQgPj0gTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTKSB7CiAJCXByaW50ayhLRVJOX0VSUiBNWU5BTSAiOiBFUlJPUjogRmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggRnVzaW9uIE1QVCBiYXNlIGRyaXZlclxuIik7CiAJCW1wdF9kZXJlZ2lzdGVyKG1wdGN0bF9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggYjVmMDNhZC4uZTE1MjIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtMTQ3Miw5ICsxNDcyLDEyIEBACiAJaWYgKCFtcHRmY190cmFuc3BvcnRfdGVtcGxhdGUpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbXB0ZmNEb25lQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX2lvX2RvbmUsIE1QVEZDX0RSSVZFUik7Ci0JbXB0ZmNUYXNrQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3Rhc2ttZ210X2NvbXBsZXRlLCBNUFRGQ19EUklWRVIpOwotCW1wdGZjSW50ZXJuYWxDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlLCBNUFRGQ19EUklWRVIpOworCW1wdGZjRG9uZUN0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF9pb19kb25lLCBNUFRGQ19EUklWRVIsCisJICAgICJtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUiKTsKKwltcHRmY1Rhc2tDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUsIE1QVEZDX0RSSVZFUiwKKwkgICAgIm1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZSIpOworCW1wdGZjSW50ZXJuYWxDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlLCBNUFRGQ19EUklWRVIsCisJICAgICJtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUiKTsKIAogCW1wdF9ldmVudF9yZWdpc3RlcihtcHRmY0RvbmVDdHgsIG1wdGZjX2V2ZW50X3Byb2Nlc3MpOwogCW1wdF9yZXNldF9yZWdpc3RlcihtcHRmY0RvbmVDdHgsIG1wdGZjX2lvY19yZXNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwppbmRleCA0ZmE5NjY1Li5jYmU5NjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKQEAgLTE0NTIsNyArMTQ1Miw5IEBACiB7CiAJc2hvd19tcHRtb2RfdmVyKExBTkFNRSwgTEFOVkVSKTsKIAotCWlmICgoTGFuQ3R4ID0gbXB0X3JlZ2lzdGVyKGxhbl9yZXBseSwgTVBUTEFOX0RSSVZFUikpIDw9IDApIHsKKwlMYW5DdHggPSBtcHRfcmVnaXN0ZXIobGFuX3JlcGx5LCBNUFRMQU5fRFJJVkVSLAorCQkJCSJsYW5fcmVwbHkiKTsKKwlpZiAoTGFuQ3R4IDw9IDApIHsKIAkJcHJpbnRrIChLRVJOX0VSUiBNWU5BTSAiOiBGYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBNUFQgYmFzZSBkcml2ZXJcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCmluZGV4IGFjMDAwZTguLjgzYTUxMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfc2FzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KIAogI2luY2x1ZGUgIm1wdGJhc2UuaCIKQEAgLTEyNiw2ICsxMjcsNyBAQAogc3RhdGljIHZvaWQgbXB0c2FzX2Jyb2FkY2FzdF9wcmltYXRpdmVfd29yayhzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQpOwogc3RhdGljIHZvaWQgbXB0c2FzX2hhbmRsZV9xdWV1ZV9mdWxsX2V2ZW50KHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCk7CiBzdGF0aWMgdm9pZCBtcHRzYXNfdm9sdW1lX2RlbGV0ZShNUFRfQURBUFRFUiAqaW9jLCB1OCBpZCk7Cit2b2lkCW1wdHNhc19zY2hlZHVsZV90YXJnZXRfcmVzZXQodm9pZCAqaW9jKTsKIAogc3RhdGljIHZvaWQgbXB0c2FzX3ByaW50X3BoeV9kYXRhKE1QVF9BREFQVEVSICppb2MsCiAJCQkJCU1QSV9TQVNfSU9fVU5JVDBfUEhZX0RBVEEgKnBoeV9kYXRhKQpAQCAtMTEzOSw2ICsxMTQxLDQ0IEBACiB9CiAKIC8qKgorICogbXB0c2FzX3NjaGVkdWxlX3RhcmdldF9yZXNldC0gc2VuZCBwZW5kaW5nIHRhcmdldCByZXNldAorICogQGlvY3A6IHBlciBhZGFwdGVyIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWxldGUgc2NoZWR1bGVkIHRhcmdldCByZXNldCBmcm9tIHRoZSBsaXN0IGFuZAorICogdHJ5IHRvIHNlbmQgbmV4dCB0YXJnZXQgcmVzZXQuIFRoaXMgd2lsbCBiZSBjYWxsZWQgZnJvbSBjb21wbGV0aW9uCisgKiBjb250ZXh0IG9mIGFueSBUYXNrIG1hbmFnbWVudCBjb21tYW5kLgorICovCisKK3ZvaWQKK21wdHNhc19zY2hlZHVsZV90YXJnZXRfcmVzZXQodm9pZCAqaW9jcCkKK3sKKwlNUFRfQURBUFRFUiAqaW9jID0gKE1QVF9BREFQVEVSICopKGlvY3ApOworCU1QVF9TQ1NJX0hPU1QJKmhkID0gc2hvc3RfcHJpdihpb2MtPnNoKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmhkLT50YXJnZXRfcmVzZXRfbGlzdDsKKwlzdHJ1Y3QgbXB0c2FzX3RhcmdldF9yZXNldF9ldmVudAkqdGFyZ2V0X3Jlc2V0X2xpc3Q7CisJdTgJCWlkLCBjaGFubmVsOworCS8qCisJICogaXNzdWUgdGFyZ2V0IHJlc2V0IHRvIG5leHQgZGV2aWNlIGluIHRoZSBxdWV1ZQorCSAqLworCisJaGVhZCA9ICZoZC0+dGFyZ2V0X3Jlc2V0X2xpc3Q7CisJaWYgKGxpc3RfZW1wdHkoaGVhZCkpCisJCXJldHVybjsKKworCXRhcmdldF9yZXNldF9saXN0ID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LAorCQlzdHJ1Y3QgbXB0c2FzX3RhcmdldF9yZXNldF9ldmVudCwgbGlzdCk7CisKKwlpZCA9IHRhcmdldF9yZXNldF9saXN0LT5zYXNfZXZlbnRfZGF0YS5UYXJnZXRJRDsKKwljaGFubmVsID0gdGFyZ2V0X3Jlc2V0X2xpc3QtPnNhc19ldmVudF9kYXRhLkJ1czsKKwl0YXJnZXRfcmVzZXRfbGlzdC0+dGltZV9jb3VudCA9IGppZmZpZXM7CisKKwlpZiAobXB0c2FzX3RhcmdldF9yZXNldChpb2MsIGNoYW5uZWwsIGlkKSkKKwkJdGFyZ2V0X3Jlc2V0X2xpc3QtPnRhcmdldF9yZXNldF9pc3N1ZWQgPSAxOworCXJldHVybjsKK30KKworCisvKioKICAqCW1wdHNhc190YXNrbWdtdF9jb21wbGV0ZSAtIGNvbXBsZXRlIFNBUyB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKgpAQCAtMTIyMiwyOCArMTI2MiwxMiBAQAogCSAqIGVuYWJsZSB3b3JrIHF1ZXVlIHRvIHJlbW92ZSBkZXZpY2UgZnJvbSB1cHBlciBsYXllcnMKIAkgKi8KIAlsaXN0X2RlbCgmdGFyZ2V0X3Jlc2V0X2xpc3QtPmxpc3QpOwotCWlmICgobXB0c2FzX2ZpbmRfdnRhcmdldChpb2MsIGNoYW5uZWwsIGlkKSkgJiYgIWlvYy0+ZndfZXZlbnRzX29mZikKKwlpZiAoIWlvYy0+ZndfZXZlbnRzX29mZikKIAkJbXB0c2FzX3F1ZXVlX2RldmljZV9kZWxldGUoaW9jLAogCQkJJnRhcmdldF9yZXNldF9saXN0LT5zYXNfZXZlbnRfZGF0YSk7CiAKIAotCS8qCi0JICogaXNzdWUgdGFyZ2V0IHJlc2V0IHRvIG5leHQgZGV2aWNlIGluIHRoZSBxdWV1ZQotCSAqLwotCi0JaGVhZCA9ICZoZC0+dGFyZ2V0X3Jlc2V0X2xpc3Q7Ci0JaWYgKGxpc3RfZW1wdHkoaGVhZCkpCi0JCXJldHVybiAxOwotCi0JdGFyZ2V0X3Jlc2V0X2xpc3QgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBtcHRzYXNfdGFyZ2V0X3Jlc2V0X2V2ZW50LAotCSAgICBsaXN0KTsKLQotCWlkID0gdGFyZ2V0X3Jlc2V0X2xpc3QtPnNhc19ldmVudF9kYXRhLlRhcmdldElEOwotCWNoYW5uZWwgPSB0YXJnZXRfcmVzZXRfbGlzdC0+c2FzX2V2ZW50X2RhdGEuQnVzOwotCXRhcmdldF9yZXNldF9saXN0LT50aW1lX2NvdW50ID0gamlmZmllczsKLQotCWlmIChtcHRzYXNfdGFyZ2V0X3Jlc2V0KGlvYywgY2hhbm5lbCwgaWQpKQotCQl0YXJnZXRfcmVzZXRfbGlzdC0+dGFyZ2V0X3Jlc2V0X2lzc3VlZCA9IDE7CisJaW9jLT5zY2hlZHVsZV90YXJnZXRfcmVzZXQoaW9jKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTg4OSw2ICsxOTEzLDQ4IEBACiAJcmV0dXJuIG1wdHNjc2loX3FjbWQoU0NwbnQsZG9uZSk7CiB9CiAKKy8qKgorICoJbXB0c2FzX21wdHNhc19laF90aW1lZF9vdXQgLSByZXNldHMgdGhlIHNjc2lfY21uZCB0aW1lb3V0CisgKgkJaWYgdGhlIGRldmljZSB1bmRlciBxdWVzdGlvbiBpcyBjdXJyZW50bHkgaW4gdGhlCisgKgkJZGV2aWNlIHJlbW92YWwgZGVsYXkuCisgKglAc2M6IHNjc2kgY29tbWFuZCB0aGF0IHRoZSBtaWRsYXllciBpcyBhYm91dCB0byB0aW1lIG91dAorICoKKyAqKi8KK3N0YXRpYyBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gbXB0c2FzX2VoX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK3sKKwlNUFRfU0NTSV9IT1NUICpoZDsKKwlNUFRfQURBUFRFUiAgICppb2M7CisJVmlydERldmljZSAgICAqdmRldmljZTsKKwllbnVtIGJsa19laF90aW1lcl9yZXR1cm4gcmMgPSBCTEtfRUhfTk9UX0hBTkRMRUQ7CisKKwloZCA9IHNob3N0X3ByaXYoc2MtPmRldmljZS0+aG9zdCk7CisJaWYgKGhkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6ICVzOiBDYW4ndCBsb2NhdGUgaG9zdCEgKHNjPSVwKVxuIiwKKwkJICAgIF9fZnVuY19fLCBzYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpb2MgPSBoZC0+aW9jOworCWlmIChpb2MtPmJ1c190eXBlICE9IFNBUykgeworCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogJXM6IFdyb25nIGJ1cyB0eXBlIChzYz0lcClcbiIsCisJCSAgICBfX2Z1bmNfXywgc2MpOworCQlnb3RvIGRvbmU7CisJfQorCisJdmRldmljZSA9IHNjLT5kZXZpY2UtPmhvc3RkYXRhOworCWlmICh2ZGV2aWNlICYmIHZkZXZpY2UtPnZ0YXJnZXQgJiYgKHZkZXZpY2UtPnZ0YXJnZXQtPmluRE1ECisJCXx8IHZkZXZpY2UtPnZ0YXJnZXQtPmRlbGV0ZWQpKSB7CisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICI6ICVzOiB0YXJnZXQgcmVtb3ZlZCAiCisJCSAgICAib3IgaW4gZGV2aWNlIHJlbW92YWwgZGVsYXkgKHNjPSVwKVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIHNjKSk7CisJCXJjID0gQkxLX0VIX1JFU0VUX1RJTUVSOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByYzsKK30KKwogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtcHRzYXNfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKQEAgLTIzNjQsNyArMjQzMCw3IEBACiAJU2FzSU9Vbml0UGFnZTFfdCAqYnVmZmVyOwogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlpbnQgZXJyb3I7Ci0JdTE2IGRldmljZV9taXNzaW5nX2RlbGF5OworCXU4IGRldmljZV9taXNzaW5nX2RlbGF5OwogCiAJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihDb25maWdFeHRlbmRlZFBhZ2VIZWFkZXJfdCkpOwogCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoQ09ORklHUEFSTVMpKTsKQEAgLTI0MDEsNyArMjQ2Nyw3IEBACiAKIAlpb2MtPmlvX21pc3NpbmdfZGVsYXkgID0KIAkgICAgbGUxNl90b19jcHUoYnVmZmVyLT5JT0RldmljZU1pc3NpbmdEZWxheSk7Ci0JZGV2aWNlX21pc3NpbmdfZGVsYXkgPSBsZTE2X3RvX2NwdShidWZmZXItPlJlcG9ydERldmljZU1pc3NpbmdEZWxheSk7CisJZGV2aWNlX21pc3NpbmdfZGVsYXkgPSBidWZmZXItPlJlcG9ydERldmljZU1pc3NpbmdEZWxheTsKIAlpb2MtPmRldmljZV9taXNzaW5nX2RlbGF5ID0gKGRldmljZV9taXNzaW5nX2RlbGF5ICYgTVBJX1NBU19JT1VOSVQxX1JFUE9SVF9NSVNTSU5HX1VOSVRfMTYpID8KIAkgICAgKGRldmljZV9taXNzaW5nX2RlbGF5ICYgTVBJX1NBU19JT1VOSVQxX1JFUE9SVF9NSVNTSU5HX1RJTUVPVVRfTUFTSykgKiAxNiA6CiAJICAgIGRldmljZV9taXNzaW5nX2RlbGF5ICYgTVBJX1NBU19JT1VOSVQxX1JFUE9SVF9NSVNTSU5HX1RJTUVPVVRfTUFTSzsKQEAgLTI1NDksNiArMjYxNSw3IEBACiAJZGV2aWNlX2luZm8tPnNhc19hZGRyZXNzID0gbGU2NF90b19jcHUoc2FzX2FkZHJlc3MpOwogCWRldmljZV9pbmZvLT5kZXZpY2VfaW5mbyA9CiAJICAgIGxlMzJfdG9fY3B1KGJ1ZmZlci0+RGV2aWNlSW5mbyk7CisJZGV2aWNlX2luZm8tPmZsYWdzID0gbGUxNl90b19jcHUoYnVmZmVyLT5GbGFncyk7CiAKICBvdXRfZnJlZV9jb25zaXN0ZW50OgogCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGhkci5FeHRQYWdlTGVuZ3RoICogNCwKQEAgLTI5NjAsNiArMzAyNyw3IEBACiAJc3RydWN0IHNhc19waHkgKnBoeTsKIAlzdHJ1Y3Qgc2FzX3BvcnQgKnBvcnQ7CiAJaW50IGVycm9yID0gMDsKKwlWaXJ0VGFyZ2V0ICp2dGFyZ2V0OwogCiAJaWYgKCFkZXYpIHsKIAkJZXJyb3IgPSAtRU5PREVWOwpAQCAtMzE4Miw2ICszMjUwLDE2IEBACiAJCQkJCXJwaHlfdG9fZXhwYW5kZXJfZGV2aWNlKHJwaHkpKTsKIAl9CiAKKwkvKiBJZiB0aGUgZGV2aWNlIGV4aXN0cyx2ZXJpZnkgaXQgd2Fzbid0IHByZXZpb3VzbHkgZmxhZ2dlZAorCWFzIGEgbWlzc2luZyBkZXZpY2UuICBJZiBzbywgY2xlYXIgaXQgKi8KKwl2dGFyZ2V0ID0gbXB0c2FzX2ZpbmRfdnRhcmdldChpb2MsCisJICAgIHBoeV9pbmZvLT5hdHRhY2hlZC5jaGFubmVsLAorCSAgICBwaHlfaW5mby0+YXR0YWNoZWQuaWQpOworCWlmICh2dGFyZ2V0ICYmIHZ0YXJnZXQtPmluRE1EKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkRldmljZSByZXR1cm5lZCwgdW5zZXR0aW5nIGluRE1EXG4iKTsKKwkJdnRhcmdldC0+aW5ETUQgPSAwOworCX0KKwogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zNjM1LDkgKzM3MTMsNDIgQEAKIAkJICAgIE1QSV9TQVNfSU9VTklUMF9SQVRFX0ZBSUxFRF9TUEVFRF9ORUdPVElBVElPTikKIAkJCXBoeV9pbmZvLT5waHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPQogCQkJICAgIFNBU19MSU5LX1JBVEVfRkFJTEVEOwotCQllbHNlCisJCWVsc2UgewogCQkJcGh5X2luZm8tPnBoeS0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9CiAJCQkgICAgU0FTX0xJTktfUkFURV9VTktOT1dOOworCQkJaWYgKGlvYy0+ZGV2aWNlX21pc3NpbmdfZGVsYXkgJiYKKwkJCSAgICBtcHRzYXNfaXNfZW5kX2RldmljZSgmcGh5X2luZm8tPmF0dGFjaGVkKSkgeworCQkJCXN0cnVjdCBzY3NpX2RldmljZQkJKnNkZXY7CisJCQkJVmlydERldmljZQkJCSp2ZGV2aWNlOworCQkJCXU4CWNoYW5uZWwsIGlkOworCQkJCWlkID0gcGh5X2luZm8tPmF0dGFjaGVkLmlkOworCQkJCWNoYW5uZWwgPSBwaHlfaW5mby0+YXR0YWNoZWQuY2hhbm5lbDsKKwkJCQlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJIkxpbmsgZG93biBmb3IgZndfaWQgJWQ6ZndfY2hhbm5lbCAlZFxuIiwKKwkJCQkgICAgaW9jLT5uYW1lLCBwaHlfaW5mby0+YXR0YWNoZWQuaWQsCisJCQkJICAgIHBoeV9pbmZvLT5hdHRhY2hlZC5jaGFubmVsKSk7CisKKwkJCQlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2RldiwgaW9jLT5zaCkgeworCQkJCQl2ZGV2aWNlID0gc2Rldi0+aG9zdGRhdGE7CisJCQkJCWlmICgodmRldmljZSA9PSBOVUxMKSB8fAorCQkJCQkJKHZkZXZpY2UtPnZ0YXJnZXQgPT0gTlVMTCkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKCh2ZGV2aWNlLT52dGFyZ2V0LT50ZmxhZ3MgJgorCQkJCQkgICAgTVBUX1RBUkdFVF9GTEFHU19SQUlEX0NPTVBPTkVOVCB8fAorCQkJCQkgICAgdmRldmljZS0+dnRhcmdldC0+cmFpZFZvbHVtZSkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKHZkZXZpY2UtPnZ0YXJnZXQtPmlkID09IGlkICYmCisJCQkJCQl2ZGV2aWNlLT52dGFyZ2V0LT5jaGFubmVsID09CisJCQkJCQljaGFubmVsKQorCQkJCQkJZGV2dHByaW50ayhpb2MsCisJCQkJCQlwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJCSJTREVWIE9VVFNUQU5ESU5HIENNRFMiCisJCQkJCQkiJWRcbiIsIGlvYy0+bmFtZSwKKwkJCQkJCXNkZXYtPmRldmljZV9idXN5KSk7CisJCQkJfQorCisJCQl9CisJCX0KIAl9CiAgb3V0OgogCW1wdHNhc19mcmVlX2Z3X2V2ZW50KGlvYywgZndfZXZlbnQpOwpAQCAtMzg0MCw2ICszOTUxLDEzIEBACiAJCSAgICAgIE1QSV9TQVNfREVWSUNFX0lORk9fU0FUQV9ERVZJQ0UpKSA9PSAwKQogCQkJY29udGludWU7CiAKKwkJLyogSWYgdGhlcmUgaXMgbm8gRlcgQl9UIG1hcHBpbmcgZm9yIHRoaXMgZGV2aWNlIHRoZW4gY29udGludWUKKwkJICogKi8KKwkJaWYgKCEoc2FzX2RldmljZS5mbGFncyAmIE1QSV9TQVNfREVWSUNFMF9GTEFHU19ERVZJQ0VfUFJFU0VOVCkKKwkJCXx8ICEoc2FzX2RldmljZS5mbGFncyAmCisJCQlNUElfU0FTX0RFVklDRTBfRkxBR1NfREVWSUNFX01BUFBFRCkpCisJCQljb250aW51ZTsKKwogCQlwaHlfaW5mbyA9IG1wdHNhc19yZWZyZXNoaW5nX2RldmljZV9oYW5kbGVzKGlvYywgJnNhc19kZXZpY2UpOwogCQlpZiAoIXBoeV9pbmZvKQogCQkJY29udGludWU7CkBAIC00MTQ5LDYgKzQyNjcsMTQgQEAKIAkJCXBoeXNfZGlzay5QaHlzRGlza0lEKSkKIAkJCWNvbnRpbnVlOwogCisJCS8qIElmIHRoZXJlIGlzIG5vIEZXIEJfVCBtYXBwaW5nIGZvciB0aGlzIGRldmljZSB0aGVuIGNvbnRpbnVlCisJCSAqICovCisJCWlmICghKHNhc19kZXZpY2UuZmxhZ3MgJiBNUElfU0FTX0RFVklDRTBfRkxBR1NfREVWSUNFX1BSRVNFTlQpCisJCQl8fCAhKHNhc19kZXZpY2UuZmxhZ3MgJgorCQkJTVBJX1NBU19ERVZJQ0UwX0ZMQUdTX0RFVklDRV9NQVBQRUQpKQorCQkJY29udGludWU7CisKKwogCQlwaHlfaW5mbyA9IG1wdHNhc19maW5kX3BoeWluZm9fYnlfc2FzX2FkZHJlc3MoaW9jLAogCQkgICAgc2FzX2RldmljZS5zYXNfYWRkcmVzcyk7CiAJCW1wdHNhc19hZGRfZW5kX2RldmljZShpb2MsIHBoeV9pbmZvKTsKQEAgLTQxNzEsNiArNDI5Nyw3IEBACiAJc3RydWN0IG1wdHNhc19kZXZpbmZvIHNhc19kZXZpY2U7CiAJVmlydFRhcmdldCAqdnRhcmdldDsKIAlpbnQgaTsKKwlzdHJ1Y3QgbXB0c2FzX3BvcnRpbmZvICpwb3J0X2luZm87CiAKIAlzd2l0Y2ggKGhvdF9wbHVnX2luZm8tPmV2ZW50X3R5cGUpIHsKIApAQCAtNDE5OSwxMiArNDMyNiw0NyBAQAogCQkgICAgKGhvdF9wbHVnX2luZm8tPmNoYW5uZWwgPDwgOCkgKwogCQkgICAgaG90X3BsdWdfaW5mby0+aWQpOwogCisJCS8qIElmIHRoZXJlIGlzIG5vIEZXIEJfVCBtYXBwaW5nIGZvciB0aGlzIGRldmljZSB0aGVuIGJyZWFrCisJCSAqICovCisJCWlmICghKHNhc19kZXZpY2UuZmxhZ3MgJiBNUElfU0FTX0RFVklDRTBfRkxBR1NfREVWSUNFX1BSRVNFTlQpCisJCQl8fCAhKHNhc19kZXZpY2UuZmxhZ3MgJgorCQkJTVBJX1NBU19ERVZJQ0UwX0ZMQUdTX0RFVklDRV9NQVBQRUQpKQorCQkJYnJlYWs7CisKIAkJaWYgKCFzYXNfZGV2aWNlLmhhbmRsZSkKIAkJCXJldHVybjsKIAogCQlwaHlfaW5mbyA9IG1wdHNhc19yZWZyZXNoaW5nX2RldmljZV9oYW5kbGVzKGlvYywgJnNhc19kZXZpY2UpOwotCQlpZiAoIXBoeV9pbmZvKQorCQkvKiBPbmx5IEZvciBTQVRBIERldmljZSBBREQgKi8KKwkJaWYgKCFwaHlfaW5mbyAmJiAoc2FzX2RldmljZS5kZXZpY2VfaW5mbyAmCisJCQkJTVBJX1NBU19ERVZJQ0VfSU5GT19TQVRBX0RFVklDRSkpIHsKKwkJCWRldnRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkiJXMgJWQgU0FUQSBIT1QgUExVRzogIgorCQkJCSJwYXJlbnQgaGFuZGxlIG9mIGRldmljZSAleFxuIiwgaW9jLT5uYW1lLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgc2FzX2RldmljZS5oYW5kbGVfcGFyZW50KSk7CisJCQlwb3J0X2luZm8gPSBtcHRzYXNfZmluZF9wb3J0aW5mb19ieV9oYW5kbGUoaW9jLAorCQkJCXNhc19kZXZpY2UuaGFuZGxlX3BhcmVudCk7CisKKwkJCWlmIChwb3J0X2luZm8gPT0gaW9jLT5oYmFfcG9ydF9pbmZvKQorCQkJCW1wdHNhc19wcm9iZV9oYmFfcGh5cyhpb2MpOworCQkJZWxzZSBpZiAocG9ydF9pbmZvKQorCQkJCW1wdHNhc19leHBhbmRlcl9yZWZyZXNoKGlvYywgcG9ydF9pbmZvKTsKKwkJCWVsc2UgeworCQkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAorCQkJCQkiJXMgJWQgcG9ydCBpbmZvIGlzIE5VTExcbiIsCisJCQkJCWlvYy0+bmFtZSwgX19mdW5jX18sIF9fTElORV9fKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwaHlfaW5mbyA9IG1wdHNhc19yZWZyZXNoaW5nX2RldmljZV9oYW5kbGVzCisJCQkJKGlvYywgJnNhc19kZXZpY2UpOworCQl9CisKKwkJaWYgKCFwaHlfaW5mbykgeworCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCisJCQkJIiVzICVkIHBoeSBpbmZvIGlzIE5VTExcbiIsCisJCQkJaW9jLT5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18pKTsKIAkJCWJyZWFrOworCQl9CiAKIAkJaWYgKG1wdHNhc19nZXRfcnBoeShwaHlfaW5mbykpCiAJCQlicmVhazsKQEAgLTQyNDEsNiArNDQwMywxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQkvKiBJZiB0aGVyZSBpcyBubyBGVyBCX1QgbWFwcGluZyBmb3IgdGhpcyBkZXZpY2UgdGhlbiBicmVhaworCQkgKiAqLworCQlpZiAoIShzYXNfZGV2aWNlLmZsYWdzICYgTVBJX1NBU19ERVZJQ0UwX0ZMQUdTX0RFVklDRV9QUkVTRU5UKQorCQkJfHwgIShzYXNfZGV2aWNlLmZsYWdzICYKKwkJCU1QSV9TQVNfREVWSUNFMF9GTEFHU19ERVZJQ0VfTUFQUEVEKSkKKwkJCWJyZWFrOworCiAJCXBoeV9pbmZvID0gbXB0c2FzX2ZpbmRfcGh5aW5mb19ieV9zYXNfYWRkcmVzcygKIAkJICAgIGlvYywgc2FzX2RldmljZS5zYXNfYWRkcmVzcyk7CiAKQEAgLTQyOTQsNiArNDQ2MywxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQkvKiBJZiB0aGVyZSBpcyBubyBGVyBCX1QgbWFwcGluZyBmb3IgdGhpcyBkZXZpY2UgdGhlbiBicmVhaworCQkgKiAqLworCQlpZiAoIShzYXNfZGV2aWNlLmZsYWdzICYgTVBJX1NBU19ERVZJQ0UwX0ZMQUdTX0RFVklDRV9QUkVTRU5UKQorCQkJfHwgIShzYXNfZGV2aWNlLmZsYWdzICYKKwkJCU1QSV9TQVNfREVWSUNFMF9GTEFHU19ERVZJQ0VfTUFQUEVEKSkKKwkJCWJyZWFrOworCiAJCXBoeV9pbmZvID0gbXB0c2FzX2ZpbmRfcGh5aW5mb19ieV9zYXNfYWRkcmVzcyhpb2MsCiAJCQkJc2FzX2RldmljZS5zYXNfYWRkcmVzcyk7CiAJCWlmICghcGh5X2luZm8pIHsKQEAgLTQ3MjcsOCArNDkwMyw5IEBACiAJbXV0ZXhfdW5sb2NrKCZpb2MtPnRhc2ttZ210X2NtZHMubXV0ZXgpOwogCiAJaWYgKGlzc3VlX3Jlc2V0KSB7Ci0JCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJJc3N1aW5nIFJlc2V0IGZyb20gJXMhIVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAorCQkgICAgICAgIklzc3VpbmcgUmVzZXQgZnJvbSAlcyEhIGRvb3JiZWxsPTB4JTA4eFxuIiwKKwkJICAgICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIG1wdF9HZXRJb2NTdGF0ZShpb2MsIDApKTsKIAkJbXB0X1NvZnRfSGFyZF9SZXNldEhhbmRsZXIoaW9jLCBDQU5fU0xFRVApOwogCX0KIAltcHRzYXNfZnJlZV9md19ldmVudChpb2MsIGZ3X2V2ZW50KTsKQEAgLTQ4MTYsMTIgKzQ5OTMsNDcgQEAKIAl7CiAJCUVWRU5UX0RBVEFfU0FTX0RFVklDRV9TVEFUVVNfQ0hBTkdFICpzYXNfZXZlbnRfZGF0YSA9CiAJCSAgICAoRVZFTlRfREFUQV9TQVNfREVWSUNFX1NUQVRVU19DSEFOR0UgKilyZXBseS0+RGF0YTsKKwkJdTE2CWlvY19zdGF0OworCQlpb2Nfc3RhdCA9IGxlMTZfdG9fY3B1KHJlcGx5LT5JT0NTdGF0dXMpOwogCiAJCWlmIChzYXNfZXZlbnRfZGF0YS0+UmVhc29uQ29kZSA9PQogCQkgICAgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19OT1RfUkVTUE9ORElORykgewogCQkJbXB0c2FzX3RhcmdldF9yZXNldF9xdWV1ZShpb2MsIHNhc19ldmVudF9kYXRhKTsKIAkJCXJldHVybiAwOwogCQl9CisJCWlmIChzYXNfZXZlbnRfZGF0YS0+UmVhc29uQ29kZSA9PQorCQkJTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19JTlRFUk5BTF9ERVZJQ0VfUkVTRVQgJiYKKwkJCWlvYy0+ZGV2aWNlX21pc3NpbmdfZGVsYXkgJiYKKwkJCShpb2Nfc3RhdCAmIE1QSV9JT0NTVEFUVVNfRkxBR19MT0dfSU5GT19BVkFJTEFCTEUpKSB7CisJCQlWaXJ0VGFyZ2V0ICp2dGFyZ2V0ID0gTlVMTDsKKwkJCXU4CQlpZCwgY2hhbm5lbDsKKwkJCXUzMgkgbG9nX2luZm8gPSBsZTMyX3RvX2NwdShyZXBseS0+SU9DTG9nSW5mbyk7CisKKwkJCWlkID0gc2FzX2V2ZW50X2RhdGEtPlRhcmdldElEOworCQkJY2hhbm5lbCA9IHNhc19ldmVudF9kYXRhLT5CdXM7CisKKwkJCXZ0YXJnZXQgPSBtcHRzYXNfZmluZF92dGFyZ2V0KGlvYywgY2hhbm5lbCwgaWQpOworCQkJaWYgKHZ0YXJnZXQpIHsKKwkJCQlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJICAgICJMb2dJbmZvICgweCV4KSBhdmFpbGFibGUgZm9yICIKKwkJCQkgICAiSU5URVJOQUxfREVWSUNFX1JFU0VUIgorCQkJCSAgICJmd19pZCAlZCBmd19jaGFubmVsICVkXG4iLCBpb2MtPm5hbWUsCisJCQkJICAgbG9nX2luZm8sIGlkLCBjaGFubmVsKSk7CisJCQkJaWYgKHZ0YXJnZXQtPnJhaWRWb2x1bWUpIHsKKwkJCQkJZGV2dHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAorCQkJCQkiU2tpcHBpbmcgUmFpZCBWb2x1bWUgZm9yIGluRE1EXG4iLAorCQkJCQlpb2MtPm5hbWUpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCSJTZXR0aW5nIGRldmljZSBmbGFnIGluRE1EXG4iLAorCQkJCQlpb2MtPm5hbWUpKTsKKwkJCQkJdnRhcmdldC0+aW5ETUQgPSAxOworCQkJCX0KKworCQkJfQorCisJCX0KKwogCQlicmVhazsKIAl9CiAJY2FzZSBNUElfRVZFTlRfU0FTX0VYUEFOREVSX1NUQVRVU19DSEFOR0U6CkBAIC00OTI0LDcgKzUxMzYsNyBAQAogCWlvYy0+RG9uZUN0eCA9IG1wdHNhc0RvbmVDdHg7CiAJaW9jLT5UYXNrQ3R4ID0gbXB0c2FzVGFza0N0eDsKIAlpb2MtPkludGVybmFsQ3R4ID0gbXB0c2FzSW50ZXJuYWxDdHg7Ci0KKwlpb2MtPnNjaGVkdWxlX3RhcmdldF9yZXNldCA9ICZtcHRzYXNfc2NoZWR1bGVfdGFyZ2V0X3Jlc2V0OwogCS8qICBBZGRlZCBzYW5pdHkgY2hlY2sgb24gcmVhZGluZXNzIG9mIHRoZSBNUFQgYWRhcHRlci4KIAkgKi8KIAlpZiAoaW9jLT5sYXN0X3N0YXRlICE9IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKQEAgLTUxNTQsMTQgKzUzNjYsMjAgQEAKIAkgICAgc2FzX2F0dGFjaF90cmFuc3BvcnQoJm1wdHNhc190cmFuc3BvcnRfZnVuY3Rpb25zKTsKIAlpZiAoIW1wdHNhc190cmFuc3BvcnRfdGVtcGxhdGUpCiAJCXJldHVybiAtRU5PREVWOworCW1wdHNhc190cmFuc3BvcnRfdGVtcGxhdGUtPmVoX3RpbWVkX291dCA9IG1wdHNhc19laF90aW1lZF9vdXQ7CiAKLQltcHRzYXNEb25lQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX2lvX2RvbmUsIE1QVFNBU19EUklWRVIpOwotCW1wdHNhc1Rhc2tDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUsIE1QVFNBU19EUklWRVIpOworCW1wdHNhc0RvbmVDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfaW9fZG9uZSwgTVBUU0FTX0RSSVZFUiwKKwkgICAgIm1wdHNjc2loX2lvX2RvbmUiKTsKKwltcHRzYXNUYXNrQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3Rhc2ttZ210X2NvbXBsZXRlLCBNUFRTQVNfRFJJVkVSLAorCSAgICAibXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUiKTsKIAltcHRzYXNJbnRlcm5hbEN0eCA9Ci0JCW1wdF9yZWdpc3RlcihtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUsIE1QVFNBU19EUklWRVIpOwotCW1wdHNhc01nbXRDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2FzX21nbXRfZG9uZSwgTVBUU0FTX0RSSVZFUik7CisJCW1wdF9yZWdpc3RlcihtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUsIE1QVFNBU19EUklWRVIsCisJCSAgICAibXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlIik7CisJbXB0c2FzTWdtdEN0eCA9IG1wdF9yZWdpc3RlcihtcHRzYXNfbWdtdF9kb25lLCBNUFRTQVNfRFJJVkVSLAorCSAgICAibXB0c2FzX21nbXRfZG9uZSIpOwogCW1wdHNhc0RldmljZVJlc2V0Q3R4ID0KLQkJbXB0X3JlZ2lzdGVyKG1wdHNhc190YXNrbWdtdF9jb21wbGV0ZSwgTVBUU0FTX0RSSVZFUik7CisJCW1wdF9yZWdpc3RlcihtcHRzYXNfdGFza21nbXRfY29tcGxldGUsIE1QVFNBU19EUklWRVIsCisJCSAgICAibXB0c2FzX3Rhc2ttZ210X2NvbXBsZXRlIik7CiAKIAltcHRfZXZlbnRfcmVnaXN0ZXIobXB0c2FzRG9uZUN0eCwgbXB0c2FzX2V2ZW50X3Byb2Nlc3MpOwogCW1wdF9yZXNldF9yZWdpc3RlcihtcHRzYXNEb25lQ3R4LCBtcHRzYXNfaW9jX3Jlc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5oCmluZGV4IDdiMjQ5ZWQuLjU3ZTg2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuaApAQCAtMTQwLDYgKzE0MCw3IEBACiAJdTY0CXNhc19hZGRyZXNzOyAgICAvKiBXV04gb2YgdGhpcyBkZXZpY2UsCiAJCQkJICAgU0FUQSBpcyBhc3NpZ25lZCBieSBIQkEsZXhwYW5kZXIgKi8KIAl1MzIJZGV2aWNlX2luZm87CS8qIGJpdGZpZWxkIGRldGFpbGVkIGluZm8gYWJvdXQgdGhpcyBkZXZpY2UgKi8KKwl1MTYJZmxhZ3M7CQkvKiBzYXMgZGV2aWNlIHBnMCBmbGFncyAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwppbmRleCA1YzUzNjI0Li41OWI4ZjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCkBAIC02NjQsNiArNjY0LDcgQEAKIAkJdTMyCSBsb2dfaW5mbzsKIAogCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShwU2NzaVJlcGx5LT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOworCiAJCXNjc2lfc3RhdGUgPSBwU2NzaVJlcGx5LT5TQ1NJU3RhdGU7CiAJCXNjc2lfc3RhdHVzID0gcFNjc2lSZXBseS0+U0NTSVN0YXR1czsKIAkJeGZlcl9jbnQgPSBsZTMyX3RvX2NwdShwU2NzaVJlcGx5LT5UcmFuc2ZlckNvdW50KTsKQEAgLTczOCwxMyArNzM5LDM2IEBACiAKIAkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9DX1RFUk1JTkFURUQ6CQkvKiAweDAwNEIgKi8KIAkJCWlmICggaW9jLT5idXNfdHlwZSA9PSBTQVMgKSB7Ci0JCQkJdTE2IGlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShwU2NzaVJlcGx5LT5JT0NTdGF0dXMpOwotCQkJCWlmIChpb2Nfc3RhdHVzICYgTVBJX0lPQ1NUQVRVU19GTEFHX0xPR19JTkZPX0FWQUlMQUJMRSkgewotCQkJCQlpZiAoKGxvZ19pbmZvICYgU0FTX0xPR0lORk9fTUFTSykKLQkJCQkJICAgID09IFNBU19MT0dJTkZPX05FWFVTX0xPU1MpIHsKLQkJCQkJCXNjLT5yZXN1bHQgPSAoRElEX0JVU19CVVNZIDw8IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9CisJCQkJdTE2IGlvY19zdGF0dXMgPQorCQkJCSAgICBsZTE2X3RvX2NwdShwU2NzaVJlcGx5LT5JT0NTdGF0dXMpOworCQkJCWlmICgoaW9jX3N0YXR1cyAmCisJCQkJCU1QSV9JT0NTVEFUVVNfRkxBR19MT0dfSU5GT19BVkFJTEFCTEUpCisJCQkJCSYmCisJCQkJCSgobG9nX2luZm8gJiBTQVNfTE9HSU5GT19NQVNLKSA9PQorCQkJCQlTQVNfTE9HSU5GT19ORVhVU19MT1NTKSkgeworCQkJCQkJVmlydERldmljZSAqdmRldmljZSA9CisJCQkJCQlzYy0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCQkJCQkgICAgLyogZmxhZyB0aGUgZGV2aWNlIGFzIGJlaW5nIGluCisJCQkJCSAgICAgKiBkZXZpY2UgcmVtb3ZhbCBkZWxheSBzbyB3ZSBjYW4KKwkJCQkJICAgICAqIG5vdGlmeSB0aGUgbWlkbGF5ZXIgdG8gaG9sZCBvZmYKKwkJCQkJICAgICAqIG9uIHRpbWVvdXQgZWggKi8KKwkJCQkJCWlmICh2ZGV2aWNlICYmIHZkZXZpY2UtPgorCQkJCQkJCXZ0YXJnZXQgJiYKKwkJCQkJCQl2ZGV2aWNlLT52dGFyZ2V0LT4KKwkJCQkJCQlyYWlkVm9sdW1lKQorCQkJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJCQkiU2tpcHBpbmcgUmFpZCBWb2x1bWUiCisJCQkJCQkJImZvciBpbkRNRFxuIik7CisJCQkJCQllbHNlIGlmICh2ZGV2aWNlICYmCisJCQkJCQkJdmRldmljZS0+dnRhcmdldCkKKwkJCQkJCQl2ZGV2aWNlLT52dGFyZ2V0LT4KKwkJCQkJCQkJaW5ETUQgPSAxOworCisJCQkJCSAgICBzYy0+cmVzdWx0ID0KKwkJCQkJCSAgICAoRElEX1RSQU5TUE9SVF9ESVNSVVBURUQKKwkJCQkJCSAgICA8PCAxNik7CisJCQkJCSAgICBicmVhazsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGlvYy0+YnVzX3R5cGUgPT0gRkMpIHsKIAkJCQkvKgpAQCAtMTcwNCw4ICsxNzI4LDkgQEAKIAogCUNMRUFSX01HTVRfU1RBVFVTKGlvYy0+dGFza21nbXRfY21kcy5zdGF0dXMpCiAJaWYgKGlzc3VlX2hhcmRfcmVzZXQpIHsKLQkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIklzc3VpbmcgUmVzZXQgZnJvbSAlcyEhXG4iLAotCQkJaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCSAgICAgICAiSXNzdWluZyBSZXNldCBmcm9tICVzISEgZG9vcmJlbGw9MHglMDh4XG4iLAorCQkgICAgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgbXB0X0dldElvY1N0YXRlKGlvYywgMCkpOwogCQlyZXR2YWwgPSBtcHRfU29mdF9IYXJkX1Jlc2V0SGFuZGxlcihpb2MsIENBTl9TTEVFUCk7CiAJCW1wdF9mcmVlX21zZ19mcmFtZShpb2MsIG1mKTsKIAl9CkBAIC0yMTMyLDYgKzIxNTcsOCBAQAogCQltcHRfY2xlYXJfdGFza21nbXRfaW5fcHJvZ3Jlc3NfZmxhZyhpb2MpOwogCQlpb2MtPnRhc2ttZ210X2NtZHMuc3RhdHVzICY9IH5NUFRfTUdNVF9TVEFUVVNfUEVORElORzsKIAkJY29tcGxldGUoJmlvYy0+dGFza21nbXRfY21kcy5kb25lKTsKKwkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU0FTKQorCQkJaW9jLT5zY2hlZHVsZV90YXJnZXRfcmVzZXQoaW9jKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtMjQ1OSw2ICsyNDg2LDggQEAKIAkJaW9jLT5uYW1lLHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQsIHNkZXYtPnNpbXBsZV90YWdzLAogCQlzZGV2LT5vcmRlcmVkX3RhZ3MpKTsKIAorCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50IChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCA1MTIgLSAxKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zMDQ1LDggKzMwNzQsMTEgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWlmICghdGltZWxlZnQpIHsKLQkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJJc3N1aW5nIFJlc2V0IGZyb20gJXMhIVxuIiwKLQkJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCQkgICAgICAgIklzc3VpbmcgUmVzZXQgZnJvbSAlcyEhIGRvb3JiZWxsPTB4JTA4eGgiCisJCQkgICAgICAgIiBjbWQ9MHglMDJ4XG4iLAorCQkJICAgICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIG1wdF9HZXRJb2NTdGF0ZShpb2MsIDApLAorCQkJICAgICAgIGNtZCk7CiAJCQltcHRfU29mdF9IYXJkX1Jlc2V0SGFuZGxlcihpb2MsIENBTl9TTEVFUCk7CiAJCQltcHRfZnJlZV9tc2dfZnJhbWUoaW9jLCBtZik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCmluZGV4IDFhYmFhNWQuLjBlMjgwMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwpAQCAtMTU1MSw5ICsxNTUxLDEyIEBACiAJaWYgKCFtcHRzcGlfdHJhbnNwb3J0X3RlbXBsYXRlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW1wdHNwaURvbmVDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfaW9fZG9uZSwgTVBUU1BJX0RSSVZFUik7Ci0JbXB0c3BpVGFza0N0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF90YXNrbWdtdF9jb21wbGV0ZSwgTVBUU1BJX0RSSVZFUik7Ci0JbXB0c3BpSW50ZXJuYWxDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlLCBNUFRTUElfRFJJVkVSKTsKKwltcHRzcGlEb25lQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX2lvX2RvbmUsIE1QVFNQSV9EUklWRVIsCisJICAgICJtcHRzY3NpaF9pb19kb25lIik7CisJbXB0c3BpVGFza0N0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF90YXNrbWdtdF9jb21wbGV0ZSwgTVBUU1BJX0RSSVZFUiwKKwkgICAgIm1wdHNjc2loX3Rhc2ttZ210X2NvbXBsZXRlIik7CisJbXB0c3BpSW50ZXJuYWxDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlLAorCSAgICBNUFRTUElfRFJJVkVSLCAibXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlIik7CiAKIAltcHRfZXZlbnRfcmVnaXN0ZXIobXB0c3BpRG9uZUN0eCwgbXB0c3BpX2V2ZW50X3Byb2Nlc3MpOwogCW1wdF9yZXNldF9yZWdpc3RlcihtcHRzcGlEb25lQ3R4LCBtcHRzcGlfaW9jX3Jlc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggNWI5YmE0OC4uNDg4ZjI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTM1Myw2ICszNTMsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZtd2FyZV9iYWxsb29uLgogCitjb25maWcgQVJNX0NIQVJMQ0QKKwlib29sICJBUk0gTHRkLiBDaGFyYWN0ZXIgTENEIERyaXZlciIKKwlkZXBlbmRzIG9uIFBMQVRfVkVSU0FUSUxFCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIGNoYXJhY3RlciBMQ0QgZm91bmQgb24gdGhlIEFSTSBMdGQuCisJICBWZXJzYXRpbGUgYW5kIFJlYWxWaWV3IFBsYXRmb3JtIEJhc2Vib2FyZHMuIEl0IGRvZXNuJ3QgZG8KKwkgIHZlcnkgbXVjaCBtb3JlIHRoYW4gZGlzcGxheSB0aGUgdGV4dCAiQVJNIExpbnV4IiBvbiB0aGUgZmlyc3QKKwkgIGxpbmUgYW5kIHRoZSBMaW51eCB2ZXJzaW9uIG9uIHRoZSBzZWNvbmQgbGluZSwgYnV0IHRoYXQncworCSAgc3RpbGwgdXNlZnVsLgorCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9jMnBvcnQvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL2VlcHJvbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvY2I3MTAvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA2ZWQwNmExLi42NzU1MmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC0zMSwzICszMSw0IEBACiBvYmoteQkJCQkrPSBlZXByb20vCiBvYmoteQkJCQkrPSBjYjcxMC8KIG9iai0kKENPTkZJR19WTVdBUkVfQkFMTE9PTikJKz0gdm13YXJlX2JhbGxvb24ubworb2JqLSQoQ09ORklHX0FSTV9DSEFSTENEKQkrPSBhcm0tY2hhcmxjZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXJtLWNoYXJsY2QuYyBiL2RyaXZlcnMvbWlzYy9hcm0tY2hhcmxjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzg3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYXJtLWNoYXJsY2QuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIG9uLWJvYXJkIGNoYXJhY3RlciBMQ0QgZm91bmQgb24gc29tZSBBUk0gcmVmZXJlbmNlIGJvYXJkcworICogVGhpcyBpcyBiYXNpY2FsbHkgYW4gSGl0YWNoaSBIRDQ0NzgwIExDRCB3aXRoIGEgY3VzdG9tIElQIGJsb2NrIHRvIGRyaXZlIGl0CisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hENDQ3ODBfQ2hhcmFjdGVyX0xDRAorICogQ3VycmVudGx5IGl0IHdpbGwganVzdCBkaXNwbGF5IHRoZSB0ZXh0ICJBUk0gTGludXgiIGFuZCB0aGUgbGludXggdmVyc2lvbgorICoKKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDx0cmlhZEBkZi5sdGguc2U+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KKworI2RlZmluZSBEUklWRVJOQU1FICJhcm0tY2hhcmxjZCIKKyNkZWZpbmUgQ0hBUkxDRF9USU1FT1VUIChtc2Vjc190b19qaWZmaWVzKDEwMDApKQorCisvKiBPZmZzZXRzIHRvIHJlZ2lzdGVycyAqLworI2RlZmluZSBDSEFSX0NPTQkweDAwVQorI2RlZmluZSBDSEFSX0RBVAkweDA0VQorI2RlZmluZSBDSEFSX1JECQkweDA4VQorI2RlZmluZSBDSEFSX1JBVwkweDBDVQorI2RlZmluZSBDSEFSX01BU0sJMHgxMFUKKyNkZWZpbmUgQ0hBUl9TVEFUCTB4MTRVCisKKyNkZWZpbmUgQ0hBUl9SQVdfQ0xFQVIJMHgwMDAwMDAwMFUKKyNkZWZpbmUgQ0hBUl9SQVdfVkFMSUQJMHgwMDAwMDEwMFUKKworLyogSGl0YWNoaSBIRDQ0NzgwIGRpc3BsYXkgY29tbWFuZHMgKi8KKyNkZWZpbmUgSERfQ0xFQVIJCQkweDAxVQorI2RlZmluZSBIRF9IT01FCQkJCTB4MDJVCisjZGVmaW5lIEhEX0VOVFJZTU9ERQkJCTB4MDRVCisjZGVmaW5lIEhEX0VOVFJZTU9ERV9JTkNSRU1FTlQJCTB4MDJVCisjZGVmaW5lIEhEX0VOVFJZTU9ERV9TSElGVAkJMHgwMVUKKyNkZWZpbmUgSERfRElTUENUUkwJCQkweDA4VQorI2RlZmluZSBIRF9ESVNQQ1RSTF9PTgkJCTB4MDRVCisjZGVmaW5lIEhEX0RJU1BDVFJMX0NVUlNPUl9PTgkJMHgwMlUKKyNkZWZpbmUgSERfRElTUENUUkxfQ1VSU09SX0JMSU5LCTB4MDFVCisjZGVmaW5lIEhEX0NSU1JfU0hJRlQJCQkweDEwVQorI2RlZmluZSBIRF9DUlNSX1NISUZUX0RJU1BMQVkJCTB4MDhVCisjZGVmaW5lIEhEX0NSU1JfU0hJRlRfRElTUExBWV9SSUdIVAkweDA0VQorI2RlZmluZSBIRF9GVU5DU0VUCQkJMHgyMFUKKyNkZWZpbmUgSERfRlVOQ1NFVF84QklUCQkJMHgxMFUKKyNkZWZpbmUgSERfRlVOQ1NFVF8yX0xJTkVTCQkweDA4VQorI2RlZmluZSBIRF9GVU5DU0VUX0ZPTlRfNVgxMAkJMHgwNFUKKyNkZWZpbmUgSERfU0VUX0NHUkFNCQkJMHg0MFUKKyNkZWZpbmUgSERfU0VUX0REUkFNCQkJMHg4MFUKKyNkZWZpbmUgSERfQlVTWV9GTEFHCQkJMHg4MFUKKworLyoqCisgKiBAZGV2OiBhIHBvaW50ZXIgYmFjayB0byBjb250YWluaW5nIGRldmljZQorICogQHBoeWJhc2U6IHRoZSBvZmZzZXQgdG8gdGhlIGNvbnRyb2xsZXIgaW4gcGh5c2ljYWwgbWVtb3J5CisgKiBAcGh5c2l6ZTogdGhlIHNpemUgb2YgdGhlIHBoeXNpY2FsIHBhZ2UKKyAqIEB2aXJ0YmFzZTogdGhlIG9mZnNldCB0byB0aGUgY29udHJvbGxlciBpbiB2aXJ0dWFsIG1lbW9yeQorICogQGlycTogcmVzZXJ2ZWQgaW50ZXJydXB0IG51bWJlcgorICogQGNvbXBsZXRlOiBjb21wbGV0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGxhc3QgTENEIGNvbW1hbmQKKyAqLworc3RydWN0IGNoYXJsY2QgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1MzIgcGh5YmFzZTsKKwl1MzIgcGh5c2l6ZTsKKwl2b2lkIF9faW9tZW0gKnZpcnRiYXNlOworCWludCBpcnE7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X3dvcms7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgY2hhcmxjZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2hhcmxjZCAqbGNkID0gZGF0YTsKKwl1OCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChsY2QtPnZpcnRiYXNlICsgQ0hBUl9TVEFUKSAmIDB4MDE7CisJLyogQ2xlYXIgSVJRICovCisJd3JpdGVsKENIQVJfUkFXX0NMRUFSLCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9SQVcpOworCWlmIChzdGF0dXMpCisJCWNvbXBsZXRlKCZsY2QtPmNvbXBsZXRlKTsKKwllbHNlCisJCWRldl9pbmZvKGxjZC0+ZGV2LCAiU3B1cmlvdXMgSVJRICglMDJ4KVxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIHZvaWQgY2hhcmxjZF93YWl0X2NvbXBsZXRlX2lycShzdHJ1Y3QgY2hhcmxjZCAqbGNkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmbGNkLT5jb21wbGV0ZSwKKwkJCQkJCQlDSEFSTENEX1RJTUVPVVQpOworCS8qIERpc2FibGUgSVJRIGFmdGVyIGNvbXBsZXRpb24gKi8KKwl3cml0ZWwoMHgwMCwgbGNkLT52aXJ0YmFzZSArIENIQVJfTUFTSyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGxjZC0+ZGV2LAorCQkJIndhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCkgIgorCQkJInJldHVybmVkICVkIHdhaXRpbmcgZm9yIHJlYWR5XG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJaWYgKHJldCA9PSAwKSB7CisJCWRldl9lcnIobGNkLT5kZXYsICJjaGFybGNkIGNvbnRyb2xsZXIgdGltZWQgb3V0ICIKKwkJCSJ3YWl0aW5nIGZvciByZWFkeVxuIik7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB1OCBjaGFybGNkXzRiaXRfcmVhZF9jaGFyKHN0cnVjdCBjaGFybGNkICpsY2QpCit7CisJdTggZGF0YTsKKwl1MzIgdmFsOworCWludCBpOworCisJLyogSWYgd2UgY2FuLCB1c2UgYW4gSVJRIHRvIHdhaXQgZm9yIHRoZSBkYXRhLCBlbHNlIHBvbGwgKi8KKwlpZiAobGNkLT5pcnEgPj0gMCkKKwkJY2hhcmxjZF93YWl0X2NvbXBsZXRlX2lycShsY2QpOworCWVsc2UgeworCQlpID0gMDsKKwkJdmFsID0gMDsKKwkJd2hpbGUgKCEodmFsICYgQ0hBUl9SQVdfVkFMSUQpICYmIGkgPCAxMCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQl2YWwgPSByZWFkbChsY2QtPnZpcnRiYXNlICsgQ0hBUl9SQVcpOworCQkJaSsrOworCQl9CisKKwkJd3JpdGVsKENIQVJfUkFXX0NMRUFSLCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9SQVcpOworCX0KKwltc2xlZXAoMSk7CisKKwkvKiBSZWFkIHRoZSA0IGhpZ2ggYml0cyBvZiB0aGUgZGF0YSAqLworCWRhdGEgPSByZWFkbChsY2QtPnZpcnRiYXNlICsgQ0hBUl9SRCkgJiAweGYwOworCisJLyoKKwkgKiBUaGUgc2Vjb25kIHJlYWQgZm9yIHRoZSBsb3cgYml0cyBkb2VzIG5vdCB0cmlnZ2VyIGFuIElSUQorCSAqIHNvIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHBvbGwgZm9yIHRoZSA0IGxvd2VyIGJpdHMKKwkgKi8KKwlpID0gMDsKKwl2YWwgPSAwOworCXdoaWxlICghKHZhbCAmIENIQVJfUkFXX1ZBTElEKSAmJiBpIDwgMTApIHsKKwkJdWRlbGF5KDEwMCk7CisJCXZhbCA9IHJlYWRsKGxjZC0+dmlydGJhc2UgKyBDSEFSX1JBVyk7CisJCWkrKzsKKwl9CisJd3JpdGVsKENIQVJfUkFXX0NMRUFSLCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9SQVcpOworCW1zbGVlcCgxKTsKKworCS8qIFJlYWQgdGhlIDQgbG93IGJpdHMgb2YgdGhlIGRhdGEgKi8KKwlkYXRhIHw9IChyZWFkbChsY2QtPnZpcnRiYXNlICsgQ0hBUl9SRCkgPj4gNCkgJiAweDBmOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBib29sIGNoYXJsY2RfNGJpdF9yZWFkX2JmKHN0cnVjdCBjaGFybGNkICpsY2QpCit7CisJaWYgKGxjZC0+aXJxID49IDApIHsKKwkJLyoKKwkJICogSWYgd2UnbGwgdXNlIElSUXMgdG8gd2FpdCBmb3IgdGhlIGJ1c3lmbGFnLCBjbGVhciBhbnkKKwkJICogcGVuZGluZyBmbGFnIGFuZCBlbmFibGUgSVJRCisJCSAqLworCQl3cml0ZWwoQ0hBUl9SQVdfQ0xFQVIsIGxjZC0+dmlydGJhc2UgKyBDSEFSX1JBVyk7CisJCWluaXRfY29tcGxldGlvbigmbGNkLT5jb21wbGV0ZSk7CisJCXdyaXRlbCgweDAxLCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9NQVNLKTsKKwl9CisJcmVhZGwobGNkLT52aXJ0YmFzZSArIENIQVJfQ09NKTsKKwlyZXR1cm4gY2hhcmxjZF80Yml0X3JlYWRfY2hhcihsY2QpICYgSERfQlVTWV9GTEFHID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjaGFybGNkXzRiaXRfd2FpdF9idXN5KHN0cnVjdCBjaGFybGNkICpsY2QpCit7CisJaW50IHJldHJpZXMgPSA1MDsKKworCXVkZWxheSgxMDApOworCXdoaWxlIChjaGFybGNkXzRiaXRfcmVhZF9iZihsY2QpICYmIHJldHJpZXMpCisJCXJldHJpZXMtLTsKKwlpZiAoIXJldHJpZXMpCisJCWRldl9lcnIobGNkLT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGJ1c3lmbGFnXG4iKTsKK30KKworc3RhdGljIHZvaWQgY2hhcmxjZF80Yml0X2NvbW1hbmQoc3RydWN0IGNoYXJsY2QgKmxjZCwgdTggY21kKQoreworCXUzMiBjbWRsbyA9IChjbWQgPDwgNCkgJiAweGYwOworCXUzMiBjbWRoaSA9IChjbWQgJiAweGYwKTsKKworCXdyaXRlbChjbWRoaSwgbGNkLT52aXJ0YmFzZSArIENIQVJfQ09NKTsKKwl1ZGVsYXkoMTApOworCXdyaXRlbChjbWRsbywgbGNkLT52aXJ0YmFzZSArIENIQVJfQ09NKTsKKwljaGFybGNkXzRiaXRfd2FpdF9idXN5KGxjZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYXJsY2RfNGJpdF9jaGFyKHN0cnVjdCBjaGFybGNkICpsY2QsIHU4IGNoKQoreworCXUzMiBjaGxvID0gKGNoIDw8IDQpICYgMHhmMDsKKwl1MzIgY2hoaSA9IChjaCAmIDB4ZjApOworCisJd3JpdGVsKGNoaGksIGxjZC0+dmlydGJhc2UgKyBDSEFSX0RBVCk7CisJdWRlbGF5KDEwKTsKKwl3cml0ZWwoY2hsbywgbGNkLT52aXJ0YmFzZSArIENIQVJfREFUKTsKKwljaGFybGNkXzRiaXRfd2FpdF9idXN5KGxjZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYXJsY2RfNGJpdF9wcmludChzdHJ1Y3QgY2hhcmxjZCAqbGNkLCBpbnQgbGluZSwgY29uc3QgY2hhciAqc3RyKQoreworCXU4IG9mZnNldDsKKwlpbnQgaTsKKworCS8qCisJICogV2Ugc3VwcG9ydCBsaW5lIDAsIDEKKwkgKiBMaW5lIDEgcnVucyBmcm9tIDB4MDAuLjB4MjcKKwkgKiBMaW5lIDIgcnVucyBmcm9tIDB4MjguLjB4NGYKKwkgKi8KKwlpZiAobGluZSA9PSAwKQorCQlvZmZzZXQgPSAwOworCWVsc2UgaWYgKGxpbmUgPT0gMSkKKwkJb2Zmc2V0ID0gMHgyODsKKwllbHNlCisJCXJldHVybjsKKworCS8qIFNldCBvZmZzZXQgKi8KKwljaGFybGNkXzRiaXRfY29tbWFuZChsY2QsIEhEX1NFVF9ERFJBTSB8IG9mZnNldCk7CisKKwkvKiBTZW5kIHN0cmluZyAqLworCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oc3RyKSAmJiBpIDwgMHgyODsgaSsrKQorCQljaGFybGNkXzRiaXRfY2hhcihsY2QsIHN0cltpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYXJsY2RfNGJpdF9pbml0KHN0cnVjdCBjaGFybGNkICpsY2QpCit7CisJLyogVGhlc2UgY29tbWFuZHMgY2Fubm90IGJlIGNoZWNrZWQgd2l0aCB0aGUgYnVzeSBmbGFnICovCisJd3JpdGVsKEhEX0ZVTkNTRVQgfCBIRF9GVU5DU0VUXzhCSVQsIGxjZC0+dmlydGJhc2UgKyBDSEFSX0NPTSk7CisJbXNsZWVwKDUpOworCXdyaXRlbChIRF9GVU5DU0VUIHwgSERfRlVOQ1NFVF84QklULCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9DT00pOworCXVkZWxheSgxMDApOworCXdyaXRlbChIRF9GVU5DU0VUIHwgSERfRlVOQ1NFVF84QklULCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9DT00pOworCXVkZWxheSgxMDApOworCS8qIEdvIHRvIDRiaXQgbW9kZSAqLworCXdyaXRlbChIRF9GVU5DU0VULCBsY2QtPnZpcnRiYXNlICsgQ0hBUl9DT00pOworCXVkZWxheSgxMDApOworCS8qCisJICogNGJpdCBtb2RlLCAyIGxpbmVzLCA1eDggZm9udCwgYWZ0ZXIgdGhpcyB0aGUgbnVtYmVyIG9mIGxpbmVzCisJICogYW5kIHRoZSBmb250IGNhbm5vdCBiZSBjaGFuZ2VkIHVudGlsIHRoZSBuZXh0IGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisJICovCisJY2hhcmxjZF80Yml0X2NvbW1hbmQobGNkLCBIRF9GVU5DU0VUIHwgSERfRlVOQ1NFVF8yX0xJTkVTKTsKKwljaGFybGNkXzRiaXRfY29tbWFuZChsY2QsIEhEX0RJU1BDVFJMIHwgSERfRElTUENUUkxfT04pOworCWNoYXJsY2RfNGJpdF9jb21tYW5kKGxjZCwgSERfRU5UUllNT0RFIHwgSERfRU5UUllNT0RFX0lOQ1JFTUVOVCk7CisJY2hhcmxjZF80Yml0X2NvbW1hbmQobGNkLCBIRF9DTEVBUik7CisJY2hhcmxjZF80Yml0X2NvbW1hbmQobGNkLCBIRF9IT01FKTsKKwkvKiBQdXQgc29tZXRoaW5nIHVzZWZ1bCBpbiB0aGUgZGlzcGxheSAqLworCWNoYXJsY2RfNGJpdF9wcmludChsY2QsIDAsICJBUk0gTGludXgiKTsKKwljaGFybGNkXzRiaXRfcHJpbnQobGNkLCAxLCBVVFNfUkVMRUFTRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYXJsY2RfaW5pdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2hhcmxjZCAqbGNkID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjaGFybGNkLCBpbml0X3dvcmsud29yayk7CisKKwljaGFybGNkXzRiaXRfaW5pdChsY2QpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjaGFybGNkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2hhcmxjZCAqbGNkOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJbGNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYXJsY2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxjZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsY2QtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X25vX3Jlc291cmNlOworCX0KKwlsY2QtPnBoeWJhc2UgPSByZXMtPnN0YXJ0OworCWxjZC0+cGh5c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24obGNkLT5waHliYXNlLCBsY2QtPnBoeXNpemUsCisJCQkgICAgICAgRFJJVkVSTkFNRSkgPT0gTlVMTCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X25vX21lbXJlZ2lvbjsKKwl9CisKKwlsY2QtPnZpcnRiYXNlID0gaW9yZW1hcChsY2QtPnBoeWJhc2UsIGxjZC0+cGh5c2l6ZSk7CisJaWYgKCFsY2QtPnZpcnRiYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3JlbWFwOworCX0KKworCWxjZC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkvKiBJZiBubyBJUlEgaXMgc3VwcGxpZWQsIHdlJ2xsIHN1cnZpdmUgd2l0aG91dCBpdCAqLworCWlmIChsY2QtPmlycSA+PSAwKSB7CisJCWlmIChyZXF1ZXN0X2lycShsY2QtPmlycSwgY2hhcmxjZF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQkJRFJJVkVSTkFNRSwgbGNkKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X25vX2lycTsKKwkJfQorCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGxjZCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGRpc3BsYXkgaW4gYSBkZWxheWVkIHdvcmssIGJlY2F1c2UKKwkgKiBpdCBpcyBWRVJZIHNsb3cgYW5kIHdvdWxkIHNsb3cgZG93biB0aGUgYm9vdCBvZiB0aGUgc3lzdGVtLgorCSAqLworCUlOSVRfREVMQVlFRF9XT1JLKCZsY2QtPmluaXRfd29yaywgY2hhcmxjZF9pbml0X3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbGNkLT5pbml0X3dvcmssIDApOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImluaXRhbGl6ZWQgQVJNIGNoYXJhY3RlciBMQ0QgYXQgJTA4eFxuIiwKKwkJbGNkLT5waHliYXNlKTsKKworCXJldHVybiAwOworCitvdXRfbm9faXJxOgorCWlvdW5tYXAobGNkLT52aXJ0YmFzZSk7CitvdXRfbm9fcmVtYXA6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CitvdXRfbm9fbWVtcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihsY2QtPnBoeWJhc2UsIFNaXzRLKTsKK291dF9ub19yZXNvdXJjZToKKwlrZnJlZShsY2QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGNoYXJsY2RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNoYXJsY2QgKmxjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGxjZCkgeworCQlmcmVlX2lycShsY2QtPmlycSwgbGNkKTsKKwkJaW91bm1hcChsY2QtPnZpcnRiYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGxjZC0+cGh5YmFzZSwgbGNkLT5waHlzaXplKTsKKwkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJCWtmcmVlKGxjZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hhcmxjZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGNoYXJsY2QgKmxjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogUG93ZXIgdGhlIGRpc3BsYXkgb2ZmICovCisJY2hhcmxjZF80Yml0X2NvbW1hbmQobGNkLCBIRF9ESVNQQ1RSTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hhcmxjZF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgY2hhcmxjZCAqbGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBUdXJuIHRoZSBkaXNwbGF5IGJhY2sgb24gKi8KKwljaGFybGNkXzRiaXRfY29tbWFuZChsY2QsIEhEX0RJU1BDVFJMIHwgSERfRElTUENUUkxfT04pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgY2hhcmxjZF9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBjaGFybGNkX3N1c3BlbmQsCisJLnJlc3VtZSA9IGNoYXJsY2RfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2hhcmxjZF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJOQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gJmNoYXJsY2RfcG1fb3BzLAorCX0sCisJLnJlbW92ZSA9IF9fZXhpdF9wKGNoYXJsY2RfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNoYXJsY2RfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmNoYXJsY2RfZHJpdmVyLCBjaGFybGNkX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNoYXJsY2RfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjaGFybGNkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNoYXJsY2RfaW5pdCk7Cittb2R1bGVfZXhpdChjaGFybGNkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJMaW51cyBXYWxsZWlqIDx0cmlhZEBkZi5sdGguc2U+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFSTSBDaGFyYWN0ZXIgTENEIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jIGIvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jCmluZGV4IDQ4Yzg0YTUuLjAwZTVmY2FjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYwpAQCAtMjg1LDggKzI4NSwxMSBAQAogCWNkZXYtPmdyb3VwcyA9IGVuY2xvc3VyZV9ncm91cHM7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoY2Rldik7Ci0JaWYgKGVycikKLQkJRVJSX1BUUihlcnIpOworCWlmIChlcnIpIHsKKwkJZWNvbXAtPm51bWJlciA9IC0xOworCQlwdXRfZGV2aWNlKGNkZXYpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KIAogCXJldHVybiBlY29tcDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwppbmRleCBmMDZkMDZlLi5kMjVlMjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCkBAIC00MzIsMyArNDMyLDEyIEBACiAJICBUaGlzIHNlbGVjdHMgdGhlIE1NQyBIb3N0IEludGVyZmFjZSBjb250cm9sZXIgKE1NQ0lGKS4KIAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTU1DSUYgaW4gc2g3NzI0L3NoNzc1Ny9zaDczNzIuCisKK2NvbmZpZyBNTUNfSlo0NzQwCisJdHJpc3RhdGUgIkpaNDc0MCBTRC9NdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQUNIX0paNDc0MAorCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyBzdXBwb3J0IGZvciB0aGUgU0QvTU1DIGNvbnRyb2xsZXIgb24gSW5nZW5pYyBKWjQ3NDAKKwkgIFNvQ3MuCisJICBJZiB5b3UgaGF2ZSBhIGJvYXJkIGJhc2VkIG9uIHN1Y2ggYSBTb0MgYW5kIHdpdGggYSBTRC9NTUMgc2xvdCwKKwkgIHNheSBZIG9yIE0gaGVyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvTWFrZWZpbGUgYi9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlCmluZGV4IGUzMGMyZWUuLmY0ZTUzYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9NYWtlZmlsZQpAQCAtMzYsNiArMzYsNyBAQAogb2JqLSQoQ09ORklHX01NQ19WSUFfU0RNTUMpCSs9IHZpYS1zZG1tYy5vCiBvYmotJChDT05GSUdfU0RIX0JGSU4pCQkrPSBiZmluX3NkaC5vCiBvYmotJChDT05GSUdfTU1DX1NIX01NQ0lGKQkrPSBzaF9tbWNpZi5vCitvYmotJChDT05GSUdfTU1DX0paNDc0MCkJKz0gano0NzQwX21tYy5vCiAKIG9iai0kKENPTkZJR19NTUNfU0RIQ0lfT0YpCSs9IHNkaGNpLW9mLm8KIHNkaGNpLW9mLXkJCQkJOj0gc2RoY2ktb2YtY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2p6NDc0MF9tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvano0NzQwX21tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGY5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21tYy9ob3N0L2p6NDc0MF9tbWMuYwpAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICogIEpaNDc0MCBTRC9NTUMgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2p6NDc0MF9tbWMuaD4KKworI2RlZmluZSBKWl9SRUdfTU1DX1NUUlBDTAkweDAwCisjZGVmaW5lIEpaX1JFR19NTUNfU1RBVFVTCTB4MDQKKyNkZWZpbmUgSlpfUkVHX01NQ19DTEtSVAkweDA4CisjZGVmaW5lIEpaX1JFR19NTUNfQ01EQVQJMHgwQworI2RlZmluZSBKWl9SRUdfTU1DX1JFU1RPCTB4MTAKKyNkZWZpbmUgSlpfUkVHX01NQ19SRFRPCQkweDE0CisjZGVmaW5lIEpaX1JFR19NTUNfQkxLTEVOCTB4MTgKKyNkZWZpbmUgSlpfUkVHX01NQ19OT0IJCTB4MUMKKyNkZWZpbmUgSlpfUkVHX01NQ19TTk9CCQkweDIwCisjZGVmaW5lIEpaX1JFR19NTUNfSU1BU0sJMHgyNAorI2RlZmluZSBKWl9SRUdfTU1DX0lSRUcJCTB4MjgKKyNkZWZpbmUgSlpfUkVHX01NQ19DTUQJCTB4MkMKKyNkZWZpbmUgSlpfUkVHX01NQ19BUkcJCTB4MzAKKyNkZWZpbmUgSlpfUkVHX01NQ19SRVNQX0ZJRk8JMHgzNAorI2RlZmluZSBKWl9SRUdfTU1DX1JYRklGTwkweDM4CisjZGVmaW5lIEpaX1JFR19NTUNfVFhGSUZPCTB4M0MKKworI2RlZmluZSBKWl9NTUNfU1RSUENMX0VYSVRfTVVMVElQTEUgQklUKDcpCisjZGVmaW5lIEpaX01NQ19TVFJQQ0xfRVhJVF9UUkFOU0ZFUiBCSVQoNikKKyNkZWZpbmUgSlpfTU1DX1NUUlBDTF9TVEFSVF9SRUFEV0FJVCBCSVQoNSkKKyNkZWZpbmUgSlpfTU1DX1NUUlBDTF9TVE9QX1JFQURXQUlUIEJJVCg0KQorI2RlZmluZSBKWl9NTUNfU1RSUENMX1JFU0VUIEJJVCgzKQorI2RlZmluZSBKWl9NTUNfU1RSUENMX1NUQVJUX09QIEJJVCgyKQorI2RlZmluZSBKWl9NTUNfU1RSUENMX0NMT0NLX0NPTlRST0wgKEJJVCgxKSB8IEJJVCgwKSkKKyNkZWZpbmUgSlpfTU1DX1NUUlBDTF9DTE9DS19TVE9QIEJJVCgwKQorI2RlZmluZSBKWl9NTUNfU1RSUENMX0NMT0NLX1NUQVJUIEJJVCgxKQorCisKKyNkZWZpbmUgSlpfTU1DX1NUQVRVU19JU19SRVNFVFRJTkcgQklUKDE1KQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX1NESU9fSU5UX0FDVElWRSBCSVQoMTQpCisjZGVmaW5lIEpaX01NQ19TVEFUVVNfUFJHX0RPTkUgQklUKDEzKQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX0RBVEFfVFJBTl9ET05FIEJJVCgxMikKKyNkZWZpbmUgSlpfTU1DX1NUQVRVU19FTkRfQ01EX1JFUyBCSVQoMTEpCisjZGVmaW5lIEpaX01NQ19TVEFUVVNfREFUQV9GSUZPX0FGVUxMIEJJVCgxMCkKKyNkZWZpbmUgSlpfTU1DX1NUQVRVU19JU19SRUFEV0FJVCBCSVQoOSkKKyNkZWZpbmUgSlpfTU1DX1NUQVRVU19DTEtfRU4gQklUKDgpCisjZGVmaW5lIEpaX01NQ19TVEFUVVNfREFUQV9GSUZPX0ZVTEwgQklUKDcpCisjZGVmaW5lIEpaX01NQ19TVEFUVVNfREFUQV9GSUZPX0VNUFRZIEJJVCg2KQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX0NSQ19SRVNfRVJSIEJJVCg1KQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX0NSQ19SRUFEX0VSUk9SIEJJVCg0KQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX1RJTUVPVVRfV1JJVEUgQklUKDMpCisjZGVmaW5lIEpaX01NQ19TVEFUVVNfQ1JDX1dSSVRFX0VSUk9SIEJJVCgyKQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX1RJTUVPVVRfUkVTIEJJVCgxKQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX1RJTUVPVVRfUkVBRCBCSVQoMCkKKworI2RlZmluZSBKWl9NTUNfU1RBVFVTX1JFQURfRVJST1JfTUFTSyAoQklUKDQpIHwgQklUKDApKQorI2RlZmluZSBKWl9NTUNfU1RBVFVTX1dSSVRFX0VSUk9SX01BU0sgKEJJVCgzKSB8IEJJVCgyKSkKKworCisjZGVmaW5lIEpaX01NQ19DTURBVF9JT19BQk9SVCBCSVQoMTEpCisjZGVmaW5lIEpaX01NQ19DTURBVF9CVVNfV0lEVEhfNEJJVCBCSVQoMTApCisjZGVmaW5lIEpaX01NQ19DTURBVF9ETUFfRU4gQklUKDgpCisjZGVmaW5lIEpaX01NQ19DTURBVF9JTklUIEJJVCg3KQorI2RlZmluZSBKWl9NTUNfQ01EQVRfQlVTWSBCSVQoNikKKyNkZWZpbmUgSlpfTU1DX0NNREFUX1NUUkVBTSBCSVQoNSkKKyNkZWZpbmUgSlpfTU1DX0NNREFUX1dSSVRFIEJJVCg0KQorI2RlZmluZSBKWl9NTUNfQ01EQVRfREFUQV9FTiBCSVQoMykKKyNkZWZpbmUgSlpfTU1DX0NNREFUX1JFU1BPTlNFX0ZPUk1BVCAoQklUKDIpIHwgQklUKDEpIHwgQklUKDApKQorI2RlZmluZSBKWl9NTUNfQ01EQVRfUlNQX1IxIDEKKyNkZWZpbmUgSlpfTU1DX0NNREFUX1JTUF9SMiAyCisjZGVmaW5lIEpaX01NQ19DTURBVF9SU1BfUjMgMworCisjZGVmaW5lIEpaX01NQ19JUlFfU0RJTyBCSVQoNykKKyNkZWZpbmUgSlpfTU1DX0lSUV9UWEZJRk9fV1JfUkVRIEJJVCg2KQorI2RlZmluZSBKWl9NTUNfSVJRX1JYRklGT19SRF9SRVEgQklUKDUpCisjZGVmaW5lIEpaX01NQ19JUlFfRU5EX0NNRF9SRVMgQklUKDIpCisjZGVmaW5lIEpaX01NQ19JUlFfUFJHX0RPTkUgQklUKDEpCisjZGVmaW5lIEpaX01NQ19JUlFfREFUQV9UUkFOX0RPTkUgQklUKDApCisKKworI2RlZmluZSBKWl9NTUNfQ0xLX1JBVEUgMjQwMDAwMDAKKworZW51bSBqejQ3NDBfbW1jX3N0YXRlIHsKKwlKWjQ3NDBfTU1DX1NUQVRFX1JFQURfUkVTUE9OU0UsCisJSlo0NzQwX01NQ19TVEFURV9UUkFOU0ZFUl9EQVRBLAorCUpaNDc0MF9NTUNfU1RBVEVfU0VORF9TVE9QLAorCUpaNDc0MF9NTUNfU1RBVEVfRE9ORSwKK307CisKK3N0cnVjdCBqejQ3NDBfbW1jX2hvc3QgeworCXN0cnVjdCBtbWNfaG9zdCAqbW1jOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGp6NDc0MF9tbWNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGNsayAqY2xrOworCisJaW50IGlycTsKKwlpbnQgY2FyZF9kZXRlY3RfaXJxOworCisJc3RydWN0IHJlc291cmNlICptZW07CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kOworCisJdW5zaWduZWQgbG9uZyB3YWl0aW5nOworCisJdWludDMyX3QgY21kYXQ7CisKKwl1aW50MTZfdCBpcnFfbWFzazsKKworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXRfdGltZXI7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBtaXRlcjsKKwllbnVtIGp6NDc0MF9tbWNfc3RhdGUgc3RhdGU7Cit9OworCitzdGF0aWMgdm9pZCBqejQ3NDBfbW1jX3NldF9pcnFfZW5hYmxlZChzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0LAorCXVuc2lnbmVkIGludCBpcnEsIGJvb2wgZW5hYmxlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZW5hYmxlZCkKKwkJaG9zdC0+aXJxX21hc2sgJj0gfmlycTsKKwllbHNlCisJCWhvc3QtPmlycV9tYXNrIHw9IGlycTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwl3cml0ZXcoaG9zdC0+aXJxX21hc2ssIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0lNQVNLKTsKK30KKworc3RhdGljIHZvaWQgano0NzQwX21tY19jbG9ja19lbmFibGUoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCwKKwlib29sIHN0YXJ0X3RyYW5zZmVyKQoreworCXVpbnQxNl90IHZhbCA9IEpaX01NQ19TVFJQQ0xfQ0xPQ0tfU1RBUlQ7CisKKwlpZiAoc3RhcnRfdHJhbnNmZXIpCisJCXZhbCB8PSBKWl9NTUNfU1RSUENMX1NUQVJUX09QOworCisJd3JpdGV3KHZhbCwgaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfU1RSUENMKTsKK30KKworc3RhdGljIHZvaWQgano0NzQwX21tY19jbG9ja19kaXNhYmxlKHN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKmhvc3QpCit7CisJdWludDMyX3Qgc3RhdHVzOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsKKworCXdyaXRldyhKWl9NTUNfU1RSUENMX0NMT0NLX1NUT1AsIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1NUUlBDTCk7CisJZG8geworCQlzdGF0dXMgPSByZWFkbChob3N0LT5iYXNlICsgSlpfUkVHX01NQ19TVEFUVVMpOworCX0gd2hpbGUgKHN0YXR1cyAmIEpaX01NQ19TVEFUVVNfQ0xLX0VOICYmIC0tdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGp6NDc0MF9tbWNfcmVzZXQoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCkKK3sKKwl1aW50MzJfdCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwOworCisJd3JpdGV3KEpaX01NQ19TVFJQQ0xfUkVTRVQsIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1NUUlBDTCk7CisJdWRlbGF5KDEwKTsKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWRsKGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1NUQVRVUyk7CisJfSB3aGlsZSAoc3RhdHVzICYgSlpfTU1DX1NUQVRVU19JU19SRVNFVFRJTkcgJiYgLS10aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQgano0NzQwX21tY19yZXF1ZXN0X2RvbmUoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcTsKKworCXJlcSA9IGhvc3QtPnJlcTsKKwlob3N0LT5yZXEgPSBOVUxMOworCisJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIHJlcSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgano0NzQwX21tY19wb2xsX2lycShzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0LAorCXVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAweDgwMDsKKwl1aW50MTZfdCBzdGF0dXM7CisKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWR3KGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0lSRUcpOworCX0gd2hpbGUgKCEoc3RhdHVzICYgaXJxKSAmJiAtLXRpbWVvdXQpOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworCQlzZXRfYml0KDAsICZob3N0LT53YWl0aW5nKTsKKwkJbW9kX3RpbWVyKCZob3N0LT50aW1lb3V0X3RpbWVyLCBqaWZmaWVzICsgNSpIWik7CisJCWp6NDc0MF9tbWNfc2V0X2lycV9lbmFibGVkKGhvc3QsIGlycSwgdHJ1ZSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgano0NzQwX21tY190cmFuc2Zlcl9jaGVja19zdGF0ZShzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0LAorCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZGwoaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfU1RBVFVTKTsKKwlpZiAoc3RhdHVzICYgSlpfTU1DX1NUQVRVU19XUklURV9FUlJPUl9NQVNLKSB7CisJCWlmIChzdGF0dXMgJiAoSlpfTU1DX1NUQVRVU19USU1FT1VUX1dSSVRFKSkgeworCQkJaG9zdC0+cmVxLT5jbWQtPmVycm9yID0gLUVUSU1FRE9VVDsKKwkJCWRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKKwkJfSBlbHNlIHsKKwkJCWhvc3QtPnJlcS0+Y21kLT5lcnJvciA9IC1FSU87CisJCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCX0KKwl9Cit9CisKK3N0YXRpYyBib29sIGp6NDc0MF9tbWNfd3JpdGVfZGF0YShzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0LAorCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyICptaXRlciA9ICZob3N0LT5taXRlcjsKKwl2b2lkIF9faW9tZW0gKmZpZm9fYWRkciA9IGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1RYRklGTzsKKwl1aW50MzJfdCAqYnVmOworCWJvb2wgdGltZW91dDsKKwlzaXplX3QgaSwgajsKKworCXdoaWxlIChzZ19taXRlcl9uZXh0KG1pdGVyKSkgeworCQlidWYgPSBtaXRlci0+YWRkcjsKKwkJaSA9IG1pdGVyLT5sZW5ndGggLyA0OworCQlqID0gaSAvIDg7CisJCWkgPSBpICYgMHg3OworCQl3aGlsZSAoaikgeworCQkJdGltZW91dCA9IGp6NDc0MF9tbWNfcG9sbF9pcnEoaG9zdCwgSlpfTU1DX0lSUV9UWEZJRk9fV1JfUkVRKTsKKwkJCWlmICh1bmxpa2VseSh0aW1lb3V0KSkKKwkJCQlnb3RvIHBvbGxfdGltZW91dDsKKworCQkJd3JpdGVsKGJ1ZlswXSwgZmlmb19hZGRyKTsKKwkJCXdyaXRlbChidWZbMV0sIGZpZm9fYWRkcik7CisJCQl3cml0ZWwoYnVmWzJdLCBmaWZvX2FkZHIpOworCQkJd3JpdGVsKGJ1ZlszXSwgZmlmb19hZGRyKTsKKwkJCXdyaXRlbChidWZbNF0sIGZpZm9fYWRkcik7CisJCQl3cml0ZWwoYnVmWzVdLCBmaWZvX2FkZHIpOworCQkJd3JpdGVsKGJ1Zls2XSwgZmlmb19hZGRyKTsKKwkJCXdyaXRlbChidWZbN10sIGZpZm9fYWRkcik7CisJCQlidWYgKz0gODsKKwkJCS0tajsKKwkJfQorCQlpZiAodW5saWtlbHkoaSkpIHsKKwkJCXRpbWVvdXQgPSBqejQ3NDBfbW1jX3BvbGxfaXJxKGhvc3QsIEpaX01NQ19JUlFfVFhGSUZPX1dSX1JFUSk7CisJCQlpZiAodW5saWtlbHkodGltZW91dCkpCisJCQkJZ290byBwb2xsX3RpbWVvdXQ7CisKKwkJCXdoaWxlIChpKSB7CisJCQkJd3JpdGVsKCpidWYsIGZpZm9fYWRkcik7CisJCQkJKytidWY7CisJCQkJLS1pOworCQkJfQorCQl9CisJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBtaXRlci0+bGVuZ3RoOworCX0KKwlzZ19taXRlcl9zdG9wKG1pdGVyKTsKKworCXJldHVybiBmYWxzZTsKKworcG9sbF90aW1lb3V0OgorCW1pdGVyLT5jb25zdW1lZCA9ICh2b2lkICopYnVmIC0gbWl0ZXItPmFkZHI7CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG1pdGVyLT5jb25zdW1lZDsKKwlzZ19taXRlcl9zdG9wKG1pdGVyKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBqejQ3NDBfbW1jX3JlYWRfZGF0YShzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0LAorCQkJCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyICptaXRlciA9ICZob3N0LT5taXRlcjsKKwl2b2lkIF9faW9tZW0gKmZpZm9fYWRkciA9IGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1JYRklGTzsKKwl1aW50MzJfdCAqYnVmOworCXVpbnQzMl90IGQ7CisJdWludDE2X3Qgc3RhdHVzOworCXNpemVfdCBpLCBqOworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCisJd2hpbGUgKHNnX21pdGVyX25leHQobWl0ZXIpKSB7CisJCWJ1ZiA9IG1pdGVyLT5hZGRyOworCQlpID0gbWl0ZXItPmxlbmd0aDsKKwkJaiA9IGkgLyAzMjsKKwkJaSA9IGkgJiAweDFmOworCQl3aGlsZSAoaikgeworCQkJdGltZW91dCA9IGp6NDc0MF9tbWNfcG9sbF9pcnEoaG9zdCwgSlpfTU1DX0lSUV9SWEZJRk9fUkRfUkVRKTsKKwkJCWlmICh1bmxpa2VseSh0aW1lb3V0KSkKKwkJCQlnb3RvIHBvbGxfdGltZW91dDsKKworCQkJYnVmWzBdID0gcmVhZGwoZmlmb19hZGRyKTsKKwkJCWJ1ZlsxXSA9IHJlYWRsKGZpZm9fYWRkcik7CisJCQlidWZbMl0gPSByZWFkbChmaWZvX2FkZHIpOworCQkJYnVmWzNdID0gcmVhZGwoZmlmb19hZGRyKTsKKwkJCWJ1Zls0XSA9IHJlYWRsKGZpZm9fYWRkcik7CisJCQlidWZbNV0gPSByZWFkbChmaWZvX2FkZHIpOworCQkJYnVmWzZdID0gcmVhZGwoZmlmb19hZGRyKTsKKwkJCWJ1Zls3XSA9IHJlYWRsKGZpZm9fYWRkcik7CisKKwkJCWJ1ZiArPSA4OworCQkJLS1qOworCQl9CisKKwkJaWYgKHVubGlrZWx5KGkpKSB7CisJCQl0aW1lb3V0ID0gano0NzQwX21tY19wb2xsX2lycShob3N0LCBKWl9NTUNfSVJRX1JYRklGT19SRF9SRVEpOworCQkJaWYgKHVubGlrZWx5KHRpbWVvdXQpKQorCQkJCWdvdG8gcG9sbF90aW1lb3V0OworCisJCQl3aGlsZSAoaSA+PSA0KSB7CisJCQkJKmJ1ZisrID0gcmVhZGwoZmlmb19hZGRyKTsKKwkJCQlpIC09IDQ7CisJCQl9CisJCQlpZiAodW5saWtlbHkoaSA+IDApKSB7CisJCQkJZCA9IHJlYWRsKGZpZm9fYWRkcik7CisJCQkJbWVtY3B5KGJ1ZiwgJmQsIGkpOworCQkJfQorCQl9CisJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBtaXRlci0+bGVuZ3RoOworCisJCS8qIFRoaXMgY2FuIGdvIGF3YXkgb25jZSBNSVBTIGltcGxlbWVudHMKKwkJICogZmx1c2hfa2VybmVsX2RjYWNoZV9wYWdlICovCisJCWZsdXNoX2RjYWNoZV9wYWdlKG1pdGVyLT5wYWdlKTsKKwl9CisJc2dfbWl0ZXJfc3RvcChtaXRlcik7CisKKwkvKiBGb3Igd2hhdGV2ZXIgcmVhc29uIHRoZXJlIGlzIHNvbWV0aW1lIG9uZSB3b3JkIG1vcmUgaW4gdGhlIGZpZm8gdGhlbgorCSAqIHJlcXVlc3RlZCAqLworCXRpbWVvdXQgPSAxMDAwOworCXN0YXR1cyA9IHJlYWRsKGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1NUQVRVUyk7CisJd2hpbGUgKCEoc3RhdHVzICYgSlpfTU1DX1NUQVRVU19EQVRBX0ZJRk9fRU1QVFkpICYmIC0tdGltZW91dCkgeworCQlkID0gcmVhZGwoZmlmb19hZGRyKTsKKwkJc3RhdHVzID0gcmVhZGwoaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfU1RBVFVTKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CisKK3BvbGxfdGltZW91dDoKKwltaXRlci0+Y29uc3VtZWQgPSAodm9pZCAqKWJ1ZiAtIG1pdGVyLT5hZGRyOworCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBtaXRlci0+Y29uc3VtZWQ7CisJc2dfbWl0ZXJfc3RvcChtaXRlcik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgano0NzQwX21tY190aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0ID0gKHN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKilkYXRhOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmhvc3QtPndhaXRpbmcpKQorCQlyZXR1cm47CisKKwlqejQ3NDBfbW1jX3NldF9pcnFfZW5hYmxlZChob3N0LCBKWl9NTUNfSVJRX0VORF9DTURfUkVTLCBmYWxzZSk7CisKKwlob3N0LT5yZXEtPmNtZC0+ZXJyb3IgPSAtRVRJTUVET1VUOworCWp6NDc0MF9tbWNfcmVxdWVzdF9kb25lKGhvc3QpOworfQorCitzdGF0aWMgdm9pZCBqejQ3NDBfbW1jX3JlYWRfcmVzcG9uc2Uoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCwKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKK3sKKwlpbnQgaTsKKwl1aW50MTZfdCB0bXA7CisJdm9pZCBfX2lvbWVtICpmaWZvX2FkZHIgPSBob3N0LT5iYXNlICsgSlpfUkVHX01NQ19SRVNQX0ZJRk87CisKKwlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KSB7CisJCXRtcCA9IHJlYWR3KGZpZm9fYWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCWNtZC0+cmVzcFtpXSA9IHRtcCA8PCAyNDsKKwkJCXRtcCA9IHJlYWR3KGZpZm9fYWRkcik7CisJCQljbWQtPnJlc3BbaV0gfD0gdG1wIDw8IDg7CisJCQl0bXAgPSByZWFkdyhmaWZvX2FkZHIpOworCQkJY21kLT5yZXNwW2ldIHw9IHRtcCA+PiA4OworCQl9CisJfSBlbHNlIHsKKwkJY21kLT5yZXNwWzBdID0gcmVhZHcoZmlmb19hZGRyKSA8PCAyNDsKKwkJY21kLT5yZXNwWzBdIHw9IHJlYWR3KGZpZm9fYWRkcikgPDwgODsKKwkJY21kLT5yZXNwWzBdIHw9IHJlYWR3KGZpZm9fYWRkcikgJiAweGZmOworCX0KK30KKworc3RhdGljIHZvaWQgano0NzQwX21tY19zZW5kX2NvbW1hbmQoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCwKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKK3sKKwl1aW50MzJfdCBjbWRhdCA9IGhvc3QtPmNtZGF0OworCisJaG9zdC0+Y21kYXQgJj0gfkpaX01NQ19DTURBVF9JTklUOworCWp6NDc0MF9tbWNfY2xvY2tfZGlzYWJsZShob3N0KTsKKworCWhvc3QtPmNtZCA9IGNtZDsKKworCWlmIChjbWQtPmZsYWdzICYgTU1DX1JTUF9CVVNZKQorCQljbWRhdCB8PSBKWl9NTUNfQ01EQVRfQlVTWTsKKworCXN3aXRjaCAobW1jX3Jlc3BfdHlwZShjbWQpKSB7CisJY2FzZSBNTUNfUlNQX1IxQjoKKwljYXNlIE1NQ19SU1BfUjE6CisJCWNtZGF0IHw9IEpaX01NQ19DTURBVF9SU1BfUjE7CisJCWJyZWFrOworCWNhc2UgTU1DX1JTUF9SMjoKKwkJY21kYXQgfD0gSlpfTU1DX0NNREFUX1JTUF9SMjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfUlNQX1IzOgorCQljbWRhdCB8PSBKWl9NTUNfQ01EQVRfUlNQX1IzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoY21kLT5kYXRhKSB7CisJCWNtZGF0IHw9IEpaX01NQ19DTURBVF9EQVRBX0VOOworCQlpZiAoY21kLT5kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJY21kYXQgfD0gSlpfTU1DX0NNREFUX1dSSVRFOworCQlpZiAoY21kLT5kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1NUUkVBTSkKKwkJCWNtZGF0IHw9IEpaX01NQ19DTURBVF9TVFJFQU07CisKKwkJd3JpdGV3KGNtZC0+ZGF0YS0+Ymxrc3osIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0JMS0xFTik7CisJCXdyaXRldyhjbWQtPmRhdGEtPmJsb2NrcywgaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfTk9CKTsKKwl9CisKKwl3cml0ZWIoY21kLT5vcGNvZGUsIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0NNRCk7CisJd3JpdGVsKGNtZC0+YXJnLCBob3N0LT5iYXNlICsgSlpfUkVHX01NQ19BUkcpOworCXdyaXRlbChjbWRhdCwgaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfQ01EQVQpOworCisJano0NzQwX21tY19jbG9ja19lbmFibGUoaG9zdCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGp6X21tY19wcmVwYXJlX2RhdGFfdHJhbnNmZXIoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IGhvc3QtPnJlcS0+Y21kOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IGNtZC0+ZGF0YTsKKwlpbnQgZGlyZWN0aW9uOworCisJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKKwkJZGlyZWN0aW9uID0gU0dfTUlURVJfVE9fU0c7CisJZWxzZQorCQlkaXJlY3Rpb24gPSBTR19NSVRFUl9GUk9NX1NHOworCisJc2dfbWl0ZXJfc3RhcnQoJmhvc3QtPm1pdGVyLCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24pOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBqel9tbWNfaXJxX3dvcmtlcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0ID0gKHN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKilkZXZpZDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IGhvc3QtPnJlcS0+Y21kOworCXN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxID0gaG9zdC0+cmVxOworCWJvb2wgdGltZW91dCA9IGZhbHNlOworCisJaWYgKGNtZC0+ZXJyb3IpCisJCWhvc3QtPnN0YXRlID0gSlo0NzQwX01NQ19TVEFURV9ET05FOworCisJc3dpdGNoIChob3N0LT5zdGF0ZSkgeworCWNhc2UgSlo0NzQwX01NQ19TVEFURV9SRUFEX1JFU1BPTlNFOgorCQlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfUFJFU0VOVCkKKwkJCWp6NDc0MF9tbWNfcmVhZF9yZXNwb25zZShob3N0LCBjbWQpOworCisJCWlmICghY21kLT5kYXRhKQorCQkJYnJlYWs7CisKKwkJanpfbW1jX3ByZXBhcmVfZGF0YV90cmFuc2Zlcihob3N0KTsKKworCWNhc2UgSlo0NzQwX01NQ19TVEFURV9UUkFOU0ZFUl9EQVRBOgorCQlpZiAoY21kLT5kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCisJCQl0aW1lb3V0ID0gano0NzQwX21tY19yZWFkX2RhdGEoaG9zdCwgY21kLT5kYXRhKTsKKwkJZWxzZQorCQkJdGltZW91dCA9IGp6NDc0MF9tbWNfd3JpdGVfZGF0YShob3N0LCBjbWQtPmRhdGEpOworCisJCWlmICh1bmxpa2VseSh0aW1lb3V0KSkgeworCQkJaG9zdC0+c3RhdGUgPSBKWjQ3NDBfTU1DX1NUQVRFX1RSQU5TRkVSX0RBVEE7CisJCQlicmVhazsKKwkJfQorCisJCWp6NDc0MF9tbWNfdHJhbnNmZXJfY2hlY2tfc3RhdGUoaG9zdCwgY21kLT5kYXRhKTsKKworCQl0aW1lb3V0ID0gano0NzQwX21tY19wb2xsX2lycShob3N0LCBKWl9NTUNfSVJRX0RBVEFfVFJBTl9ET05FKTsKKwkJaWYgKHVubGlrZWx5KHRpbWVvdXQpKSB7CisJCQlob3N0LT5zdGF0ZSA9IEpaNDc0MF9NTUNfU1RBVEVfU0VORF9TVE9QOworCQkJYnJlYWs7CisJCX0KKwkJd3JpdGV3KEpaX01NQ19JUlFfREFUQV9UUkFOX0RPTkUsIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0lSRUcpOworCisJY2FzZSBKWjQ3NDBfTU1DX1NUQVRFX1NFTkRfU1RPUDoKKwkJaWYgKCFyZXEtPnN0b3ApCisJCQlicmVhazsKKworCQlqejQ3NDBfbW1jX3NlbmRfY29tbWFuZChob3N0LCByZXEtPnN0b3ApOworCisJCXRpbWVvdXQgPSBqejQ3NDBfbW1jX3BvbGxfaXJxKGhvc3QsIEpaX01NQ19JUlFfUFJHX0RPTkUpOworCQlpZiAodGltZW91dCkgeworCQkJaG9zdC0+c3RhdGUgPSBKWjQ3NDBfTU1DX1NUQVRFX0RPTkU7CisJCQlicmVhazsKKwkJfQorCWNhc2UgSlo0NzQwX01NQ19TVEFURV9ET05FOgorCQlicmVhazsKKwl9CisKKwlpZiAoIXRpbWVvdXQpCisJCWp6NDc0MF9tbWNfcmVxdWVzdF9kb25lKGhvc3QpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QganpfbW1jX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0ID0gZGV2aWQ7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQgPSBob3N0LT5jbWQ7CisJdWludDE2X3QgaXJxX3JlZywgc3RhdHVzLCB0bXA7CisKKwlpcnFfcmVnID0gcmVhZHcoaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfSVJFRyk7CisKKwl0bXAgPSBpcnFfcmVnOworCWlycV9yZWcgJj0gfmhvc3QtPmlycV9tYXNrOworCisJdG1wICY9IH4oSlpfTU1DX0lSUV9UWEZJRk9fV1JfUkVRIHwgSlpfTU1DX0lSUV9SWEZJRk9fUkRfUkVRIHwKKwkJSlpfTU1DX0lSUV9QUkdfRE9ORSB8IEpaX01NQ19JUlFfREFUQV9UUkFOX0RPTkUpOworCisJaWYgKHRtcCAhPSBpcnFfcmVnKQorCQl3cml0ZXcodG1wICYgfmlycV9yZWcsIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0lSRUcpOworCisJaWYgKGlycV9yZWcgJiBKWl9NTUNfSVJRX1NESU8pIHsKKwkJd3JpdGV3KEpaX01NQ19JUlFfU0RJTywgaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfSVJFRyk7CisJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdC0+bW1jKTsKKwkJaXJxX3JlZyAmPSB+SlpfTU1DX0lSUV9TRElPOworCX0KKworCWlmIChob3N0LT5yZXEgJiYgY21kICYmIGlycV9yZWcpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmaG9zdC0+d2FpdGluZykpIHsKKwkJCWRlbF90aW1lcigmaG9zdC0+dGltZW91dF90aW1lcik7CisKKwkJCXN0YXR1cyA9IHJlYWRsKGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX1NUQVRVUyk7CisKKwkJCWlmIChzdGF0dXMgJiBKWl9NTUNfU1RBVFVTX1RJTUVPVVRfUkVTKSB7CisJCQkJCWNtZC0+ZXJyb3IgPSAtRVRJTUVET1VUOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBKWl9NTUNfU1RBVFVTX0NSQ19SRVNfRVJSKSB7CisJCQkJCWNtZC0+ZXJyb3IgPSAtRUlPOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAoSlpfTU1DX1NUQVRVU19DUkNfUkVBRF9FUlJPUiB8CisJCQkJICAgIEpaX01NQ19TVEFUVVNfQ1JDX1dSSVRFX0VSUk9SKSkgeworCQkJCQlpZiAoY21kLT5kYXRhKQorCQkJCQkJCWNtZC0+ZGF0YS0+ZXJyb3IgPSAtRUlPOworCQkJCQljbWQtPmVycm9yID0gLUVJTzsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgKEpaX01NQ19TVEFUVVNfQ1JDX1JFQURfRVJST1IgfAorCQkJCQlKWl9NTUNfU1RBVFVTX0NSQ19XUklURV9FUlJPUikpIHsKKwkJCQkJaWYgKGNtZC0+ZGF0YSkKKwkJCQkJCQljbWQtPmRhdGEtPmVycm9yID0gLUVJTzsKKwkJCQkJY21kLT5lcnJvciA9IC1FSU87CisJCQl9CisKKwkJCWp6NDc0MF9tbWNfc2V0X2lycV9lbmFibGVkKGhvc3QsIGlycV9yZWcsIGZhbHNlKTsKKwkJCXdyaXRldyhpcnFfcmVnLCBob3N0LT5iYXNlICsgSlpfUkVHX01NQ19JUkVHKTsKKworCQkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBqejQ3NDBfbW1jX3NldF9jbG9ja19yYXRlKHN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKmhvc3QsIGludCByYXRlKQoreworCWludCBkaXYgPSAwOworCWludCByZWFsX3JhdGU7CisKKwlqejQ3NDBfbW1jX2Nsb2NrX2Rpc2FibGUoaG9zdCk7CisJY2xrX3NldF9yYXRlKGhvc3QtPmNsaywgSlpfTU1DX0NMS19SQVRFKTsKKworCXJlYWxfcmF0ZSA9IGNsa19nZXRfcmF0ZShob3N0LT5jbGspOworCisJd2hpbGUgKHJlYWxfcmF0ZSA+IHJhdGUgJiYgZGl2IDwgNykgeworCQkrK2RpdjsKKwkJcmVhbF9yYXRlID4+PSAxOworCX0KKworCXdyaXRldyhkaXYsIGhvc3QtPmJhc2UgKyBKWl9SRUdfTU1DX0NMS1JUKTsKKwlyZXR1cm4gcmVhbF9yYXRlOworfQorCitzdGF0aWMgdm9pZCBqejQ3NDBfbW1jX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCisJaG9zdC0+cmVxID0gcmVxOworCisJd3JpdGV3KDB4ZmZmZiwgaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfSVJFRyk7CisKKwl3cml0ZXcoSlpfTU1DX0lSUV9FTkRfQ01EX1JFUywgaG9zdC0+YmFzZSArIEpaX1JFR19NTUNfSVJFRyk7CisJano0NzQwX21tY19zZXRfaXJxX2VuYWJsZWQoaG9zdCwgSlpfTU1DX0lSUV9FTkRfQ01EX1JFUywgdHJ1ZSk7CisKKwlob3N0LT5zdGF0ZSA9IEpaNDc0MF9NTUNfU1RBVEVfUkVBRF9SRVNQT05TRTsKKwlzZXRfYml0KDAsICZob3N0LT53YWl0aW5nKTsKKwltb2RfdGltZXIoJmhvc3QtPnRpbWVvdXRfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKKwlqejQ3NDBfbW1jX3NlbmRfY29tbWFuZChob3N0LCByZXEtPmNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGp6NDc0MF9tbWNfc2V0X2lvcyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlpZiAoaW9zLT5jbG9jaykKKwkJano0NzQwX21tY19zZXRfY2xvY2tfcmF0ZShob3N0LCBpb3MtPmNsb2NrKTsKKworCXN3aXRjaCAoaW9zLT5wb3dlcl9tb2RlKSB7CisJY2FzZSBNTUNfUE9XRVJfVVA6CisJCWp6NDc0MF9tbWNfcmVzZXQoaG9zdCk7CisJCWlmIChncGlvX2lzX3ZhbGlkKGhvc3QtPnBkYXRhLT5ncGlvX3Bvd2VyKSkKKwkJCWdwaW9fc2V0X3ZhbHVlKGhvc3QtPnBkYXRhLT5ncGlvX3Bvd2VyLAorCQkJCQkhaG9zdC0+cGRhdGEtPnBvd2VyX2FjdGl2ZV9sb3cpOworCQlob3N0LT5jbWRhdCB8PSBKWl9NTUNfQ01EQVRfSU5JVDsKKwkJY2xrX2VuYWJsZShob3N0LT5jbGspOworCQlicmVhazsKKwljYXNlIE1NQ19QT1dFUl9PTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGdwaW9faXNfdmFsaWQoaG9zdC0+cGRhdGEtPmdwaW9fcG93ZXIpKQorCQkJZ3Bpb19zZXRfdmFsdWUoaG9zdC0+cGRhdGEtPmdwaW9fcG93ZXIsCisJCQkJCWhvc3QtPnBkYXRhLT5wb3dlcl9hY3RpdmVfbG93KTsKKwkJY2xrX2Rpc2FibGUoaG9zdC0+Y2xrKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpb3MtPmJ1c193aWR0aCkgeworCWNhc2UgTU1DX0JVU19XSURUSF8xOgorCQlob3N0LT5jbWRhdCAmPSB+SlpfTU1DX0NNREFUX0JVU19XSURUSF80QklUOworCQlicmVhazsKKwljYXNlIE1NQ19CVVNfV0lEVEhfNDoKKwkJaG9zdC0+Y21kYXQgfD0gSlpfTU1DX0NNREFUX0JVU19XSURUSF80QklUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgano0NzQwX21tY19nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKGhvc3QtPnBkYXRhLT5ncGlvX3JlYWRfb25seSkpCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKGhvc3QtPnBkYXRhLT5ncGlvX3JlYWRfb25seSkgXgorCQlob3N0LT5wZGF0YS0+cmVhZF9vbmx5X2FjdGl2ZV9sb3c7Cit9CisKK3N0YXRpYyBpbnQgano0NzQwX21tY19nZXRfY2Qoc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKGhvc3QtPnBkYXRhLT5ncGlvX2NhcmRfZGV0ZWN0KSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoaG9zdC0+cGRhdGEtPmdwaW9fY2FyZF9kZXRlY3QpIF4KKwkJCWhvc3QtPnBkYXRhLT5jYXJkX2RldGVjdF9hY3RpdmVfbG93OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgano0NzQwX21tY19jYXJkX2RldGVjdF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCA9IGRldmlkOworCisJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCBIWiAvIDIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBqejQ3NDBfbW1jX2VuYWJsZV9zZGlvX2lycShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlqejQ3NDBfbW1jX3NldF9pcnFfZW5hYmxlZChob3N0LCBKWl9NTUNfSVJRX1NESU8sIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGp6NDc0MF9tbWNfb3BzID0geworCS5yZXF1ZXN0CT0gano0NzQwX21tY19yZXF1ZXN0LAorCS5zZXRfaW9zCT0gano0NzQwX21tY19zZXRfaW9zLAorCS5nZXRfcm8JCT0gano0NzQwX21tY19nZXRfcm8sCisJLmdldF9jZAkJPSBqejQ3NDBfbW1jX2dldF9jZCwKKwkuZW5hYmxlX3NkaW9faXJxID0gano0NzQwX21tY19lbmFibGVfc2Rpb19pcnEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGp6X2dwaW9fYnVsa19yZXF1ZXN0IGp6NDc0MF9tbWNfcGluc1tdID0geworCUpaX0dQSU9fQlVMS19QSU4oTVNDX0NNRCksCisJSlpfR1BJT19CVUxLX1BJTihNU0NfQ0xLKSwKKwlKWl9HUElPX0JVTEtfUElOKE1TQ19EQVRBMCksCisJSlpfR1BJT19CVUxLX1BJTihNU0NfREFUQTEpLAorCUpaX0dQSU9fQlVMS19QSU4oTVNDX0RBVEEyKSwKKwlKWl9HUElPX0JVTEtfUElOKE1TQ19EQVRBMyksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBqejQ3NDBfbW1jX3JlcXVlc3RfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBncGlvLAorCWNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgb3V0cHV0LCBpbnQgdmFsdWUpCit7CisJaW50IHJldDsKKworCWlmICghZ3Bpb19pc192YWxpZChncGlvKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgbmFtZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0ICVzIGdwaW86ICVkXG4iLCBuYW1lLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChvdXRwdXQpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBqejQ3NDBfbW1jX3JlcXVlc3RfZ3Bpb3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBqejQ3NDBfbW1jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGp6NDc0MF9tbWNfcmVxdWVzdF9ncGlvKCZwZGV2LT5kZXYsIHBkYXRhLT5ncGlvX2NhcmRfZGV0ZWN0LAorCQkJIk1NQyBkZXRlY3QgY2hhbmdlIiwgZmFsc2UsIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gano0NzQwX21tY19yZXF1ZXN0X2dwaW8oJnBkZXYtPmRldiwgcGRhdGEtPmdwaW9fcmVhZF9vbmx5LAorCQkJIk1NQyByZWFkIG9ubHkiLCBmYWxzZSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9ncGlvX2NhcmRfZGV0ZWN0OworCisJcmV0ID0gano0NzQwX21tY19yZXF1ZXN0X2dwaW8oJnBkZXYtPmRldiwgcGRhdGEtPmdwaW9fcG93ZXIsCisJCQkiTU1DIHJlYWQgb25seSIsIHRydWUsIHBkYXRhLT5wb3dlcl9hY3RpdmVfbG93KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2dwaW9fcmVhZF9vbmx5OworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2dwaW9fcmVhZF9vbmx5OgorCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX3JlYWRfb25seSkpCisJCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb19yZWFkX29ubHkpOworZXJyX2ZyZWVfZ3Bpb19jYXJkX2RldGVjdDoKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19jYXJkX2RldGVjdCkpCisJCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb19jYXJkX2RldGVjdCk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgano0NzQwX21tY19yZXF1ZXN0X2NkX2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGp6NDc0MF9tbWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19jYXJkX2RldGVjdCkpCisJCXJldHVybiAwOworCisJaG9zdC0+Y2FyZF9kZXRlY3RfaXJxID0gZ3Bpb190b19pcnEocGRhdGEtPmdwaW9fY2FyZF9kZXRlY3QpOworCWlmIChob3N0LT5jYXJkX2RldGVjdF9pcnEgPCAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGNhcmQgZGV0ZWN0IGlycVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiByZXF1ZXN0X2lycShob3N0LT5jYXJkX2RldGVjdF9pcnEsIGp6NDc0MF9tbWNfY2FyZF9kZXRlY3RfaXJxLAorCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJIk1NQyBjYXJkIGRldGVjdCIsIGhvc3QpOworfQorCitzdGF0aWMgdm9pZCBqejQ3NDBfbW1jX2ZyZWVfZ3Bpb3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcG93ZXIpKQorCQlncGlvX2ZyZWUocGRhdGEtPmdwaW9fcG93ZXIpOworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX3JlYWRfb25seSkpCisJCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb19yZWFkX29ubHkpOworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX2NhcmRfZGV0ZWN0KSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX2NhcmRfZGV0ZWN0KTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3Qgano0NzQwX21tY19udW1fcGlucyhzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0KQoreworCXNpemVfdCBudW1fcGlucyA9IEFSUkFZX1NJWkUoano0NzQwX21tY19waW5zKTsKKwlpZiAoaG9zdC0+cGRhdGEgJiYgaG9zdC0+cGRhdGEtPmRhdGFfMWJpdCkKKwkJbnVtX3BpbnMgLT0gMzsKKworCXJldHVybiBudW1fcGluczsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgano0NzQwX21tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlKiBwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IG1tY19ob3N0ICptbWM7CisJc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdDsKKwlzdHJ1Y3Qgano0NzQwX21tY19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltbWMgPSBtbWNfYWxsb2NfaG9zdChzaXplb2Yoc3RydWN0IGp6NDc0MF9tbWNfaG9zdCksICZwZGV2LT5kZXYpOworCWlmICghbW1jKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvYyBtbWMgaG9zdCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlob3N0LT5wZGF0YSA9IHBkYXRhOworCisJaG9zdC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaG9zdC0+aXJxIDwgMCkgeworCQlyZXQgPSBob3N0LT5pcnE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGxhdGZvcm0gaXJxOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9ob3N0OworCX0KKworCWhvc3QtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1tYyIpOworCWlmICghaG9zdC0+Y2xrKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgbW1jIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfZnJlZV9ob3N0OworCX0KKworCWhvc3QtPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFob3N0LT5tZW0pIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBiYXNlIHBsYXRmb3JtIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX2Nsa19wdXQ7CisJfQorCisJaG9zdC0+bWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKGhvc3QtPm1lbS0+c3RhcnQsCisJCQkJCXJlc291cmNlX3NpemUoaG9zdC0+bWVtKSwgcGRldi0+bmFtZSk7CisJaWYgKCFob3N0LT5tZW0pIHsKKwkJcmV0ID0gLUVCVVNZOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBiYXNlIG1lbW9yeSByZWdpb25cbiIpOworCQlnb3RvIGVycl9jbGtfcHV0OworCX0KKworCWhvc3QtPmJhc2UgPSBpb3JlbWFwX25vY2FjaGUoaG9zdC0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShob3N0LT5tZW0pKTsKKwlpZiAoIWhvc3QtPmJhc2UpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBiYXNlIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisKKwlyZXQgPSBqel9ncGlvX2J1bGtfcmVxdWVzdChqejQ3NDBfbW1jX3BpbnMsIGp6NDc0MF9tbWNfbnVtX3BpbnMoaG9zdCkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgbW1jIHBpbnM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCXJldCA9IGp6NDc0MF9tbWNfcmVxdWVzdF9ncGlvcyhwZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9ncGlvX2J1bGtfZnJlZTsKKworCW1tYy0+b3BzID0gJmp6NDc0MF9tbWNfb3BzOworCW1tYy0+Zl9taW4gPSBKWl9NTUNfQ0xLX1JBVEUgLyAxMjg7CisJbW1jLT5mX21heCA9IEpaX01NQ19DTEtfUkFURTsKKwltbWMtPm9jcl9hdmFpbCA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OworCW1tYy0+Y2FwcyA9IChwZGF0YSAmJiBwZGF0YS0+ZGF0YV8xYml0KSA/IDAgOiBNTUNfQ0FQXzRfQklUX0RBVEE7CisJbW1jLT5jYXBzIHw9IE1NQ19DQVBfU0RJT19JUlE7CisKKwltbWMtPm1heF9ibGtfc2l6ZSA9ICgxIDw8IDEwKSAtIDE7CisJbW1jLT5tYXhfYmxrX2NvdW50ID0gKDEgPDwgMTUpIC0gMTsKKwltbWMtPm1heF9yZXFfc2l6ZSA9IG1tYy0+bWF4X2Jsa19zaXplICogbW1jLT5tYXhfYmxrX2NvdW50OworCisJbW1jLT5tYXhfcGh5c19zZWdzID0gMTI4OworCW1tYy0+bWF4X2h3X3NlZ3MgPSAxMjg7CisJbW1jLT5tYXhfc2VnX3NpemUgPSBtbWMtPm1heF9yZXFfc2l6ZTsKKworCWhvc3QtPm1tYyA9IG1tYzsKKwlob3N0LT5wZGV2ID0gcGRldjsKKwlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CisJaG9zdC0+aXJxX21hc2sgPSAweGZmZmY7CisKKwlyZXQgPSBqejQ3NDBfbW1jX3JlcXVlc3RfY2RfaXJxKHBkZXYsIGhvc3QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgY2FyZCBkZXRlY3QgaXJxXG4iKTsKKwkJZ290byBlcnJfZnJlZV9ncGlvczsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShob3N0LT5pcnEsIGp6X21tY19pcnEsIGp6X21tY19pcnFfd29ya2VyLCAwLAorCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGhvc3QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9jYXJkX2RldGVjdF9pcnE7CisJfQorCisJano0NzQwX21tY19yZXNldChob3N0KTsKKwlqejQ3NDBfbW1jX2Nsb2NrX2Rpc2FibGUoaG9zdCk7CisJc2V0dXBfdGltZXIoJmhvc3QtPnRpbWVvdXRfdGltZXIsIGp6NDc0MF9tbWNfdGltZW91dCwKKwkJCSh1bnNpZ25lZCBsb25nKWhvc3QpOworCS8qIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hlbiBpdCB0aW1lcyBvdXQsIGl0IGp1c3QgbmVlZHMgdG8gdGltZW91dC4gKi8KKwlzZXRfdGltZXJfc2xhY2soJmhvc3QtPnRpbWVvdXRfdGltZXIsIEhaKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCXJldCA9IG1tY19hZGRfaG9zdChtbWMpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIG1tYyBob3N0OiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCWRldl9pbmZvKCZwZGV2LT5kZXYsICJKWiBTRC9NTUMgY2FyZCBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CitlcnJfZnJlZV9jYXJkX2RldGVjdF9pcnE6CisJaWYgKGhvc3QtPmNhcmRfZGV0ZWN0X2lycSA+PSAwKQorCQlmcmVlX2lycShob3N0LT5jYXJkX2RldGVjdF9pcnEsIGhvc3QpOworZXJyX2ZyZWVfZ3Bpb3M6CisJano0NzQwX21tY19mcmVlX2dwaW9zKHBkZXYpOworZXJyX2dwaW9fYnVsa19mcmVlOgorCWp6X2dwaW9fYnVsa19mcmVlKGp6NDc0MF9tbWNfcGlucywgano0NzQwX21tY19udW1fcGlucyhob3N0KSk7CitlcnJfaW91bm1hcDoKKwlpb3VubWFwKGhvc3QtPmJhc2UpOworZXJyX3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24oaG9zdC0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShob3N0LT5tZW0pKTsKK2Vycl9jbGtfcHV0OgorCWNsa19wdXQoaG9zdC0+Y2xrKTsKK2Vycl9mcmVlX2hvc3Q6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJbW1jX2ZyZWVfaG9zdChtbWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgano0NzQwX21tY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgano0NzQwX21tY19ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZWxfdGltZXJfc3luYygmaG9zdC0+dGltZW91dF90aW1lcik7CisJano0NzQwX21tY19zZXRfaXJxX2VuYWJsZWQoaG9zdCwgMHhmZiwgZmFsc2UpOworCWp6NDc0MF9tbWNfcmVzZXQoaG9zdCk7CisKKwltbWNfcmVtb3ZlX2hvc3QoaG9zdC0+bW1jKTsKKworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJaWYgKGhvc3QtPmNhcmRfZGV0ZWN0X2lycSA+PSAwKQorCQlmcmVlX2lycShob3N0LT5jYXJkX2RldGVjdF9pcnEsIGhvc3QpOworCisJano0NzQwX21tY19mcmVlX2dwaW9zKHBkZXYpOworCWp6X2dwaW9fYnVsa19mcmVlKGp6NDc0MF9tbWNfcGlucywgano0NzQwX21tY19udW1fcGlucyhob3N0KSk7CisKKwlpb3VubWFwKGhvc3QtPmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihob3N0LT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGhvc3QtPm1lbSkpOworCisJY2xrX3B1dChob3N0LT5jbGspOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJbW1jX2ZyZWVfaG9zdChob3N0LT5tbWMpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBqejQ3NDBfbW1jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBqejQ3NDBfbW1jX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCW1tY19zdXNwZW5kX2hvc3QoaG9zdC0+bW1jKTsKKworCWp6X2dwaW9fYnVsa19zdXNwZW5kKGp6NDc0MF9tbWNfcGlucywgano0NzQwX21tY19udW1fcGlucyhob3N0KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqejQ3NDBfbW1jX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGp6NDc0MF9tbWNfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJanpfZ3Bpb19idWxrX3Jlc3VtZShqejQ3NDBfbW1jX3BpbnMsIGp6NDc0MF9tbWNfbnVtX3BpbnMoaG9zdCkpOworCisJbW1jX3Jlc3VtZV9ob3N0KGhvc3QtPm1tYyk7CisKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgano0NzQwX21tY19wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBqejQ3NDBfbW1jX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBqejQ3NDBfbW1jX3Jlc3VtZSwKKwkucG93ZXJvZmYJPSBqejQ3NDBfbW1jX3N1c3BlbmQsCisJLnJlc3RvcmUJPSBqejQ3NDBfbW1jX3Jlc3VtZSwKK307CisKKyNkZWZpbmUgSlo0NzQwX01NQ19QTV9PUFMgKCZqejQ3NDBfbW1jX3BtX29wcykKKyNlbHNlCisjZGVmaW5lIEpaNDc0MF9NTUNfUE1fT1BTIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqejQ3NDBfbW1jX2RyaXZlciA9IHsKKwkucHJvYmUgPSBqejQ3NDBfbW1jX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChqejQ3NDBfbW1jX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiano0NzQwLW1tYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSBKWjQ3NDBfTU1DX1BNX09QUywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgano0NzQwX21tY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmano0NzQwX21tY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoano0NzQwX21tY19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGp6NDc0MF9tbWNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZqejQ3NDBfbW1jX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChqejQ3NDBfbW1jX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkpaNDc0MCBTRC9NTUMgY29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYwppbmRleCBhZDg0N2EyLi43YjBmM2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYwpAQCAtMTUzMywxMiArMTUzMywyMCBAQAogCXJldHVybiAwOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtbWNfc3BpX29mX21hdGNoX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1tYy1zcGktc2xvdCIsIH0sCit9OworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtbWNfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9CQkibW1jX3NwaSIsCiAJCS5idXMgPQkJJnNwaV9idXNfdHlwZSwKIAkJLm93bmVyID0JVEhJU19NT0RVTEUsCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCisJCS5vZl9tYXRjaF90YWJsZSA9IG1tY19zcGlfb2ZfbWF0Y2hfdGFibGUsCisjZW5kaWYKIAl9LAogCS5wcm9iZSA9CW1tY19zcGlfcHJvYmUsCiAJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKG1tY19zcGlfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKaW5kZXggNDkxN2FmOS4uODQwYjMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CkBAIC0zNywxMiArMzYsMzkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBmbWF4ID0gNTE1NjMzOwogCisvKioKKyAqIHN0cnVjdCB2YXJpYW50X2RhdGEgLSBNTUNJIHZhcmlhbnQtc3BlY2lmaWMgcXVpcmtzCisgKiBAY2xrcmVnOiBkZWZhdWx0IHZhbHVlIGZvciBNQ0lDTE9DSyByZWdpc3RlcgorICogQGNsa3JlZ19lbmFibGU6IGVuYWJsZSB2YWx1ZSBmb3IgTU1DSUNMT0NLIHJlZ2lzdGVyCisgKiBAZGF0YWxlbmd0aF9iaXRzOiBudW1iZXIgb2YgYml0cyBpbiB0aGUgTU1DSURBVEFMRU5HVEggcmVnaXN0ZXIKKyAqLworc3RydWN0IHZhcmlhbnRfZGF0YSB7CisJdW5zaWduZWQgaW50CQljbGtyZWc7CisJdW5zaWduZWQgaW50CQljbGtyZWdfZW5hYmxlOworCXVuc2lnbmVkIGludAkJZGF0YWxlbmd0aF9iaXRzOworfTsKKworc3RhdGljIHN0cnVjdCB2YXJpYW50X2RhdGEgdmFyaWFudF9hcm0gPSB7CisJLmRhdGFsZW5ndGhfYml0cwk9IDE2LAorfTsKKworc3RhdGljIHN0cnVjdCB2YXJpYW50X2RhdGEgdmFyaWFudF91MzAwID0geworCS5jbGtyZWdfZW5hYmxlCQk9IDEgPDwgMTMsIC8qIEhXRkNFTiAqLworCS5kYXRhbGVuZ3RoX2JpdHMJPSAxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmFyaWFudF9kYXRhIHZhcmlhbnRfdXg1MDAgPSB7CisJLmNsa3JlZwkJCT0gTUNJX0NMS19FTkFCTEUsCisJLmNsa3JlZ19lbmFibGUJCT0gMSA8PCAxNCwgLyogSFdGQ0VOICovCisJLmRhdGFsZW5ndGhfYml0cwk9IDI0LAorfTsKIC8qCiAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggaG9zdC0+bG9jayBoZWxkCiAgKi8KIHN0YXRpYyB2b2lkIG1tY2lfc2V0X2Nsa3JlZyhzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgZGVzaXJlZCkKIHsKLQl1MzIgY2xrID0gMDsKKwlzdHJ1Y3QgdmFyaWFudF9kYXRhICp2YXJpYW50ID0gaG9zdC0+dmFyaWFudDsKKwl1MzIgY2xrID0gdmFyaWFudC0+Y2xrcmVnOwogCiAJaWYgKGRlc2lyZWQpIHsKIAkJaWYgKGRlc2lyZWQgPj0gaG9zdC0+bWNsaykgewpAQCAtNTQsOCArODAsOCBAQAogCQkJCWNsayA9IDI1NTsKIAkJCWhvc3QtPmNjbGsgPSBob3N0LT5tY2xrIC8gKDIgKiAoY2xrICsgMSkpOwogCQl9Ci0JCWlmIChob3N0LT5od19kZXNpZ25lciA9PSBBTUJBX1ZFTkRPUl9TVCkKLQkJCWNsayB8PSBNQ0lfU1RfRkNFTjsgLyogQnVnIGZpeCBpbiBTVCBJUCBibG9jayAqLworCisJCWNsayB8PSB2YXJpYW50LT5jbGtyZWdfZW5hYmxlOwogCQljbGsgfD0gTUNJX0NMS19FTkFCTEU7CiAJCS8qIFRoaXMgaGFzbid0IHByb3ZlbiB0byBiZSB3b3J0aHdoaWxlICovCiAJCS8qIGNsayB8PSBNQ0lfQ0xLX1BXUlNBVkU7ICovCkBAIC05OCw2ICsxMjQsMTggQEAKIAlob3N0LT5kYXRhID0gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgbW1jaV9pbml0X3NnKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBTR19NSVRFUl9BVE9NSUM7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQorCQlmbGFncyB8PSBTR19NSVRFUl9UT19TRzsKKwllbHNlCisJCWZsYWdzIHw9IFNHX01JVEVSX0ZST01fU0c7CisKKwlzZ19taXRlcl9zdGFydCgmaG9zdC0+c2dfbWl0ZXIsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sIGZsYWdzKTsKK30KKwogc3RhdGljIHZvaWQgbW1jaV9zdGFydF9kYXRhKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgZGF0YWN0cmwsIHRpbWVvdXQsIGlycW1hc2s7CkBAIC0xMDksNyArMTQ3LDcgQEAKIAkJZGF0YS0+Ymxrc3osIGRhdGEtPmJsb2NrcywgZGF0YS0+ZmxhZ3MpOwogCiAJaG9zdC0+ZGF0YSA9IGRhdGE7Ci0JaG9zdC0+c2l6ZSA9IGRhdGEtPmJsa3N6OworCWhvc3QtPnNpemUgPSBkYXRhLT5ibGtzeiAqIGRhdGEtPmJsb2NrczsKIAlob3N0LT5kYXRhX3hmZXJlZCA9IDA7CiAKIAltbWNpX2luaXRfc2coaG9zdCwgZGF0YSk7CkBAIC0yMTAsOCArMjQ4LDE3IEBACiAJCSAqIFdlIGhpdCBhbiBlcnJvciBjb25kaXRpb24uICBFbnN1cmUgdGhhdCBhbnkgZGF0YQogCQkgKiBwYXJ0aWFsbHkgd3JpdHRlbiB0byBhIHBhZ2UgaXMgcHJvcGVybHkgY29oZXJlbnQuCiAJCSAqLwotCQlpZiAoaG9zdC0+c2dfbGVuICYmIGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKLQkJCWZsdXNoX2RjYWNoZV9wYWdlKHNnX3BhZ2UoaG9zdC0+c2dfcHRyKSk7CisJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpIHsKKwkJCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgKnNnX21pdGVyID0gJmhvc3QtPnNnX21pdGVyOworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJaWYgKHNnX21pdGVyX25leHQoc2dfbWl0ZXIpKSB7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc2dfbWl0ZXItPnBhZ2UpOworCQkJCXNnX21pdGVyX3N0b3Aoc2dfbWl0ZXIpOworCQkJfQorCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CiAJfQogCWlmIChzdGF0dXMgJiBNQ0lfREFUQUVORCkgewogCQltbWNpX3N0b3BfZGF0YShob3N0KTsKQEAgLTMxNCwxNSArMzYxLDE4IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbW1jaV9waW9faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0ID0gZGV2X2lkOworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgKnNnX21pdGVyID0gJmhvc3QtPnNnX21pdGVyOwogCXZvaWQgX19pb21lbSAqYmFzZSA9IGhvc3QtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgc3RhdHVzOwogCiAJc3RhdHVzID0gcmVhZGwoYmFzZSArIE1NQ0lTVEFUVVMpOwogCiAJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJpcnExIChwaW8pICUwOHhcbiIsIHN0YXR1cyk7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKIAlkbyB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXVuc2lnbmVkIGludCByZW1haW4sIGxlbjsKIAkJY2hhciAqYnVmZmVyOwogCkBAIC0zMzYsMTEgKzM4NiwxMSBAQAogCQlpZiAoIShzdGF0dXMgJiAoTUNJX1RYRklGT0hBTEZFTVBUWXxNQ0lfUlhEQVRBQVZMQkwpKSkKIAkJCWJyZWFrOwogCi0JCS8qCi0JCSAqIE1hcCB0aGUgY3VycmVudCBzY2F0dGVyIGJ1ZmZlci4KLQkJICovCi0JCWJ1ZmZlciA9IG1tY2lfa21hcF9hdG9taWMoaG9zdCwgJmZsYWdzKSArIGhvc3QtPnNnX29mZjsKLQkJcmVtYWluID0gaG9zdC0+c2dfcHRyLT5sZW5ndGggLSBob3N0LT5zZ19vZmY7CisJCWlmICghc2dfbWl0ZXJfbmV4dChzZ19taXRlcikpCisJCQlicmVhazsKKworCQlidWZmZXIgPSBzZ19taXRlci0+YWRkcjsKKwkJcmVtYWluID0gc2dfbWl0ZXItPmxlbmd0aDsKIAogCQlsZW4gPSAwOwogCQlpZiAoc3RhdHVzICYgTUNJX1JYQUNUSVZFKQpAQCAtMzQ4LDMxICszOTgsMjQgQEAKIAkJaWYgKHN0YXR1cyAmIE1DSV9UWEFDVElWRSkKIAkJCWxlbiA9IG1tY2lfcGlvX3dyaXRlKGhvc3QsIGJ1ZmZlciwgcmVtYWluLCBzdGF0dXMpOwogCi0JCS8qCi0JCSAqIFVubWFwIHRoZSBidWZmZXIuCi0JCSAqLwotCQltbWNpX2t1bm1hcF9hdG9taWMoaG9zdCwgYnVmZmVyLCAmZmxhZ3MpOworCQlzZ19taXRlci0+Y29uc3VtZWQgPSBsZW47CiAKLQkJaG9zdC0+c2dfb2ZmICs9IGxlbjsKIAkJaG9zdC0+c2l6ZSAtPSBsZW47CiAJCXJlbWFpbiAtPSBsZW47CiAKIAkJaWYgKHJlbWFpbikKIAkJCWJyZWFrOwogCi0JCS8qCi0JCSAqIElmIHdlIHdlcmUgcmVhZGluZywgYW5kIHdlIGhhdmUgY29tcGxldGVkIHRoaXMKLQkJICogcGFnZSwgZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FjaGUgaXMgY29oZXJlbnQuCi0JCSAqLwogCQlpZiAoc3RhdHVzICYgTUNJX1JYQUNUSVZFKQotCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc2dfcGFnZShob3N0LT5zZ19wdHIpKTsKLQotCQlpZiAoIW1tY2lfbmV4dF9zZyhob3N0KSkKLQkJCWJyZWFrOworCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc2dfbWl0ZXItPnBhZ2UpOwogCiAJCXN0YXR1cyA9IHJlYWRsKGJhc2UgKyBNTUNJU1RBVFVTKTsKIAl9IHdoaWxlICgxKTsKIAorCXNnX21pdGVyX3N0b3Aoc2dfbWl0ZXIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCiAJLyoKIAkgKiBJZiB3ZSdyZSBuZWFyaW5nIHRoZSBlbmQgb2YgdGhlIHJlYWQsIHN3aXRjaCB0bwogCSAqICJhbnkgZGF0YSBhdmFpbGFibGUiIG1vZGUuCkBAIC00NzcsMTYgKzUyMCw5IEBACiAJCQkvKiBUaGlzIGltcGxpY2l0bHkgZW5hYmxlcyB0aGUgcmVndWxhdG9yICovCiAJCQltbWNfcmVndWxhdG9yX3NldF9vY3IoaG9zdC0+dmNjLCBpb3MtPnZkZCk7CiAjZW5kaWYKLQkJLyoKLQkJICogVGhlIHRyYW5zbGF0ZV92ZGQgZnVuY3Rpb24gaXMgbm90IHVzZWQgaWYgeW91IGhhdmUKLQkJICogYW4gZXh0ZXJuYWwgcmVndWxhdG9yLCBvciB5b3VyIGRlc2lnbiBpcyByZWFsbHkgd2VpcmQuCi0JCSAqIFVzaW5nIGl0IHdvdWxkIG1lYW4gc2VuZGluZyBpbiBwb3dlciBjb250cm9sIEJPVEggdXNpbmcKLQkJICogYSByZWd1bGF0b3IgQU5EIHRoZSA0IE1NQ0lQV1IgYml0cy4gSWYgd2UgZG9uJ3QgaGF2ZQotCQkgKiBhIHJlZ3VsYXRvciwgd2UgbWlnaHQgaGF2ZSBzb21lIG90aGVyIHBsYXRmb3JtIHNwZWNpZmljCi0JCSAqIHBvd2VyIGNvbnRyb2wgYmVoaW5kIHRoaXMgdHJhbnNsYXRlIGZ1bmN0aW9uLgotCQkgKi8KLQkJaWYgKCFob3N0LT52Y2MgJiYgaG9zdC0+cGxhdC0+dHJhbnNsYXRlX3ZkZCkKLQkJCXB3ciB8PSBob3N0LT5wbGF0LT50cmFuc2xhdGVfdmRkKG1tY19kZXYobW1jKSwgaW9zLT52ZGQpOworCQlpZiAoaG9zdC0+cGxhdC0+dmRkX2hhbmRsZXIpCisJCQlwd3IgfD0gaG9zdC0+cGxhdC0+dmRkX2hhbmRsZXIobW1jX2RldihtbWMpLCBpb3MtPnZkZCwKKwkJCQkJCSAgICAgICBpb3MtPnBvd2VyX21vZGUpOwogCQkvKiBUaGUgU1QgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIHRoaXMsIGZhbGwgdGhyb3VnaCB0byBQT1dFUl9PTiAqLwogCQlpZiAoaG9zdC0+aHdfZGVzaWduZXIgIT0gQU1CQV9WRU5ET1JfU1QpIHsKIAkJCXB3ciB8PSBNQ0lfUFdSX1VQOwpAQCAtNTM5LDkgKzU3NSwxMyBAQAogCWlmIChob3N0LT5ncGlvX2NkID09IC1FTk9TWVMpCiAJCXN0YXR1cyA9IGhvc3QtPnBsYXQtPnN0YXR1cyhtbWNfZGV2KGhvc3QtPm1tYykpOwogCWVsc2UKLQkJc3RhdHVzID0gZ3Bpb19nZXRfdmFsdWUoaG9zdC0+Z3Bpb19jZCk7CisJCXN0YXR1cyA9ICFncGlvX2dldF92YWx1ZShob3N0LT5ncGlvX2NkKTsKIAotCXJldHVybiAhc3RhdHVzOworCS8qCisJICogVXNlIHBvc2l0aXZlIGxvZ2ljIHRocm91Z2hvdXQgLSBzdGF0dXMgaXMgemVybyBmb3Igbm8gY2FyZCwKKwkgKiBub24temVybyBmb3IgY2FyZCBpbnNlcnRlZC4KKwkgKi8KKwlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBtbWNpX29wcyA9IHsKQEAgLTU1MSwyMSArNTkxLDEwIEBACiAJLmdldF9jZAkJPSBtbWNpX2dldF9jZCwKIH07CiAKLXN0YXRpYyB2b2lkIG1tY2lfY2hlY2tfc3RhdHVzKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0ID0gKHN0cnVjdCBtbWNpX2hvc3QgKilkYXRhOwotCXVuc2lnbmVkIGludCBzdGF0dXMgPSBtbWNpX2dldF9jZChob3N0LT5tbWMpOwotCi0JaWYgKHN0YXR1cyBeIGhvc3QtPm9sZHN0YXQpCi0JCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgMCk7Ci0KLQlob3N0LT5vbGRzdGF0ID0gc3RhdHVzOwotCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyBIWik7Ci19Ci0KIHN0YXRpYyBpbnQgX19kZXZpbml0IG1tY2lfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIHN0cnVjdCBhbWJhX2lkICppZCkKIHsKIAlzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdmFyaWFudF9kYXRhICp2YXJpYW50ID0gaWQtPmRhdGE7CiAJc3RydWN0IG1tY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKIAlpbnQgcmV0OwpAQCAtNjA5LDYgKzYzOCw3IEBACiAJCWdvdG8gY2xrX2ZyZWU7CiAKIAlob3N0LT5wbGF0ID0gcGxhdDsKKwlob3N0LT52YXJpYW50ID0gdmFyaWFudDsKIAlob3N0LT5tY2xrID0gY2xrX2dldF9yYXRlKGhvc3QtPmNsayk7CiAJLyoKIAkgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIG1jbGsgaXMgbWF4IDEwMCBNSHosCkBAIC02NjksNiArNjk5LDcgQEAKIAlpZiAoaG9zdC0+dmNjID09IE5VTEwpCiAJCW1tYy0+b2NyX2F2YWlsID0gcGxhdC0+b2NyX21hc2s7CiAJbW1jLT5jYXBzID0gcGxhdC0+Y2FwYWJpbGl0aWVzOworCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQX05FRURTX1BPTEw7CiAKIAkvKgogCSAqIFdlIGNhbiBkbyBTR0lPCkBAIC02NzcsMTAgKzcwOCwxMSBAQAogCW1tYy0+bWF4X3BoeXNfc2VncyA9IE5SX1NHOwogCiAJLyoKLQkgKiBTaW5jZSB3ZSBvbmx5IGhhdmUgYSAxNi1iaXQgZGF0YSBsZW5ndGggcmVnaXN0ZXIsIHdlIG11c3QKLQkgKiBlbnN1cmUgdGhhdCB3ZSBkb24ndCBleGNlZWQgMl4xNi0xIGJ5dGVzIGluIGEgc2luZ2xlIHJlcXVlc3QuCisJICogU2luY2Ugb25seSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJpdHMgYXJlIHZhbGlkIGluIHRoZSBkYXRhIGxlbmd0aAorCSAqIHJlZ2lzdGVyLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHdlIGRvbid0IGV4Y2VlZCAyXm51bS0xIGJ5dGVzIGluIGEKKwkgKiBzaW5nbGUgcmVxdWVzdC4KIAkgKi8KLQltbWMtPm1heF9yZXFfc2l6ZSA9IDY1NTM1OworCW1tYy0+bWF4X3JlcV9zaXplID0gKDEgPDwgdmFyaWFudC0+ZGF0YWxlbmd0aF9iaXRzKSAtIDE7CiAKIAkvKgogCSAqIFNldCB0aGUgbWF4aW11bSBzZWdtZW50IHNpemUuICBTaW5jZSB3ZSBhcmVuJ3QgZG9pbmcgRE1BCkBAIC03MzQsNyArNzY2LDYgQEAKIAl3cml0ZWwoTUNJX0lSUUVOQUJMRSwgaG9zdC0+YmFzZSArIE1NQ0lNQVNLMCk7CiAKIAlhbWJhX3NldF9kcnZkYXRhKGRldiwgbW1jKTsKLQlob3N0LT5vbGRzdGF0ID0gbW1jaV9nZXRfY2QoaG9zdC0+bW1jKTsKIAogCW1tY19hZGRfaG9zdChtbWMpOwogCkBAIC03NDIsMTIgKzc3Myw2IEBACiAJCW1tY19ob3N0bmFtZShtbWMpLCBhbWJhX3JldihkZXYpLCBhbWJhX2NvbmZpZyhkZXYpLAogCQkodW5zaWduZWQgbG9uZyBsb25nKWRldi0+cmVzLnN0YXJ0LCBkZXYtPmlycVswXSwgZGV2LT5pcnFbMV0pOwogCi0JaW5pdF90aW1lcigmaG9zdC0+dGltZXIpOwotCWhvc3QtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylob3N0OwotCWhvc3QtPnRpbWVyLmZ1bmN0aW9uID0gbW1jaV9jaGVja19zdGF0dXM7Ci0JaG9zdC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKLQlhZGRfdGltZXIoJmhvc3QtPnRpbWVyKTsKLQogCXJldHVybiAwOwogCiAgaXJxMF9mcmVlOgpAQCAtNzgxLDggKzgwNiw2IEBACiAJaWYgKG1tYykgewogCQlzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAotCQlkZWxfdGltZXJfc3luYygmaG9zdC0+dGltZXIpOwotCiAJCW1tY19yZW1vdmVfaG9zdChtbWMpOwogCiAJCXdyaXRlbCgwLCBob3N0LT5iYXNlICsgTU1DSU1BU0swKTsKQEAgLTg1NiwxOSArODc5LDI4IEBACiAJewogCQkuaWQJPSAweDAwMDQxMTgwLAogCQkubWFzawk9IDB4MDAwZmZmZmYsCisJCS5kYXRhCT0gJnZhcmlhbnRfYXJtLAogCX0sCiAJewogCQkuaWQJPSAweDAwMDQxMTgxLAogCQkubWFzawk9IDB4MDAwZmZmZmYsCisJCS5kYXRhCT0gJnZhcmlhbnRfYXJtLAogCX0sCiAJLyogU1QgTWljcm8gdmFyaWFudHMgKi8KIAl7CiAJCS5pZCAgICAgPSAweDAwMTgwMTgwLAogCQkubWFzayAgID0gMHgwMGZmZmZmZiwKKwkJLmRhdGEJPSAmdmFyaWFudF91MzAwLAogCX0sCiAJewogCQkuaWQgICAgID0gMHgwMDI4MDE4MCwKIAkJLm1hc2sgICA9IDB4MDBmZmZmZmYsCisJCS5kYXRhCT0gJnZhcmlhbnRfdTMwMCwKKwl9LAorCXsKKwkJLmlkICAgICA9IDB4MDA0ODAxODAsCisJCS5tYXNrICAgPSAweDAwZmZmZmZmLAorCQkuZGF0YQk9ICZ2YXJpYW50X3V4NTAwLAogCX0sCiAJeyAwLCAwIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmggYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuaAppbmRleCBkNzcwNjJlLi42ODk3MGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuaApAQCAtMjgsOCArMjgsNiBAQAogI2RlZmluZSBNQ0lfNEJJVF9CVVMJCSgxIDw8IDExKQogLyogOGJpdCB3aWRlIGJ1c2VzIHN1cHBvcnRlZCBpbiBTVCBNaWNybyB2ZXJzaW9ucyAqLwogI2RlZmluZSBNQ0lfU1RfOEJJVF9CVVMJCSgxIDw8IDEyKQotLyogSFcgZmxvdyBjb250cm9sIG9uIHRoZSBTVCBNaWNybyB2ZXJzaW9uICovCi0jZGVmaW5lIE1DSV9TVF9GQ0VOCQkoMSA8PCAxMykKIAogI2RlZmluZSBNTUNJQVJHVU1FTlQJCTB4MDA4CiAjZGVmaW5lIE1NQ0lDT01NQU5ECQkweDAwYwpAQCAtMTQ1LDYgKzE0Myw3IEBACiAjZGVmaW5lIE5SX1NHCQkxNgogCiBzdHJ1Y3QgY2xrOworc3RydWN0IHZhcmlhbnRfZGF0YTsKIAogc3RydWN0IG1tY2lfaG9zdCB7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKQEAgLTE2NCw2ICsxNjMsNyBAQAogCXVuc2lnbmVkIGludAkJY2NsazsKIAl1MzIJCQlwd3I7CiAJc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwlzdHJ1Y3QgdmFyaWFudF9kYXRhCSp2YXJpYW50OwogCiAJdTgJCQlod19kZXNpZ25lcjsKIAl1OAkJCWh3X3JldmlzaW9uOjQ7CkBAIC0xNzEsNDIgKzE3MSw5IEBACiAJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CiAJdW5zaWduZWQgaW50CQlvbGRzdGF0OwogCi0JdW5zaWduZWQgaW50CQlzZ19sZW47Ci0KIAkvKiBwaW8gc3R1ZmYgKi8KLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnX3B0cjsKLQl1bnNpZ25lZCBpbnQJCXNnX29mZjsKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyCXNnX21pdGVyOwogCXVuc2lnbmVkIGludAkJc2l6ZTsKIAlzdHJ1Y3QgcmVndWxhdG9yCSp2Y2M7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbW1jaV9pbml0X3NnKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKLXsKLQkvKgotCSAqIElkZWFsbHksIHdlIHdhbnQgdGhlIGhpZ2hlciBsZXZlbHMgdG8gcGFzcyB1cyBhIHNjYXR0ZXIgbGlzdC4KLQkgKi8KLQlob3N0LT5zZ19sZW4gPSBkYXRhLT5zZ19sZW47Ci0JaG9zdC0+c2dfcHRyID0gZGF0YS0+c2c7Ci0JaG9zdC0+c2dfb2ZmID0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbW1jaV9uZXh0X3NnKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QpCi17Ci0JaG9zdC0+c2dfcHRyKys7Ci0JaG9zdC0+c2dfb2ZmID0gMDsKLQlyZXR1cm4gLS1ob3N0LT5zZ19sZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciAqbW1jaV9rbWFwX2F0b21pYyhzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2dfcHRyOwotCi0JbG9jYWxfaXJxX3NhdmUoKmZsYWdzKTsKLQlyZXR1cm4ga21hcF9hdG9taWMoc2dfcGFnZShzZyksIEtNX0JJT19TUkNfSVJRKSArIHNnLT5vZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtbWNpX2t1bm1hcF9hdG9taWMoc3RydWN0IG1tY2lfaG9zdCAqaG9zdCwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlrdW5tYXBfYXRvbWljKGJ1ZmZlciwgS01fQklPX1NSQ19JUlEpOwotCWxvY2FsX2lycV9yZXN0b3JlKCpmbGFncyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYwppbmRleCBkOWQ0YTcyLi4zNTBmNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKQEAgLTExOSw2ICsxMTksNyBAQAogCWludAkJCWRldGVjdF9pcnE7CiAJaW50CQkJZG1hOwogCWludAkJCWRvX2RtYTsKKwlpbnQJCQlkZWZhdWx0X2lycV9tYXNrOwogCWludAkJCXVzZV9zZGlvOwogCXVuc2lnbmVkIGludAkJcG93ZXJfbW9kZTsKIAlzdHJ1Y3QgaW14bW1jX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwpAQCAtMjI4LDcgKzIyOSw3IEBACiBzdGF0aWMgaW50IG14Y21jaV9zdGFydF9jbWQoc3RydWN0IG14Y21jaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwKIAkJdW5zaWduZWQgaW50IGNtZGF0KQogewotCXUzMiBpbnRfY250cjsKKwl1MzIgaW50X2NudHIgPSBob3N0LT5kZWZhdWx0X2lycV9tYXNrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlXQVJOX09OKGhvc3QtPmNtZCAhPSBOVUxMKTsKQEAgLTI3NSw3ICsyNzYsNyBAQAogc3RhdGljIHZvaWQgbXhjbWNpX2ZpbmlzaF9yZXF1ZXN0KHN0cnVjdCBteGNtY2lfaG9zdCAqaG9zdCwKIAkJc3RydWN0IG1tY19yZXF1ZXN0ICpyZXEpCiB7Ci0JdTMyIGludF9jbnRyID0gMDsKKwl1MzIgaW50X2NudHIgPSBob3N0LT5kZWZhdWx0X2lycV9tYXNrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwpAQCAtNTg1LDYgKzU4Niw5IEBACiAJCSAgKHN0YXQgJiAoU1RBVFVTX0RBVEFfVFJBTlNfRE9ORSB8IFNUQVRVU19XUklURV9PUF9ET05FKSkpCiAJCW14Y21jaV9kYXRhX2RvbmUoaG9zdCwgc3RhdCk7CiAjZW5kaWYKKwlpZiAoaG9zdC0+ZGVmYXVsdF9pcnFfbWFzayAmJgorCQkgIChzdGF0ICYgKFNUQVRVU19DQVJEX0lOU0VSVElPTiB8IFNUQVRVU19DQVJEX1JFTU9WQUwpKSkKKwkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCBtc2Vjc190b19qaWZmaWVzKDIwMCkpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtODA5LDYgKzgxMywxMiBAQAogCWVsc2UKIAkJbW1jLT5vY3JfYXZhaWwgPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNDsKIAorCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+ZGF0M19jYXJkX2RldGVjdCkKKwkJaG9zdC0+ZGVmYXVsdF9pcnFfbWFzayA9CisJCQlJTlRfQ0FSRF9JTlNFUlRJT05fRU4gfCBJTlRfQ0FSRF9SRU1PVkFMX0VOOworCWVsc2UKKwkJaG9zdC0+ZGVmYXVsdF9pcnFfbWFzayA9IDA7CisKIAlob3N0LT5yZXMgPSByOwogCWhvc3QtPmlycSA9IGlycTsKIApAQCAtODM1LDcgKzg0NSw3IEBACiAJLyogcmVjb21tZW5kZWQgaW4gZGF0YSBzaGVldCAqLwogCXdyaXRldygweDJkYjQsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX1JFQURfVE8pOwogCi0Jd3JpdGVsKDAsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX0lOVF9DTlRSKTsKKwl3cml0ZWwoaG9zdC0+ZGVmYXVsdF9pcnFfbWFzaywgaG9zdC0+YmFzZSArIE1NQ19SRUdfSU5UX0NOVFIpOwogCiAjaWZkZWYgSEFTX0RNQQogCWhvc3QtPmRtYSA9IGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvKERSSVZFUl9OQU1FLCBETUFfUFJJT19MT1cpOwpAQCAtOTI2LDQzICs5MzYsNDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBteGNtY2lfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgbXhjbWNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBteGNtY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAobW1jKQogCQlyZXQgPSBtbWNfc3VzcGVuZF9ob3N0KG1tYyk7CisJY2xrX2Rpc2FibGUoaG9zdC0+Y2xrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXhjbWNpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG14Y21jaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgbXhjbWNpX2hvc3QgKmhvc3Q7CisJc3RydWN0IG1tY19ob3N0ICptbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXhjbWNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwogCWludCByZXQgPSAwOwogCi0JaWYgKG1tYykgewotCQlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwljbGtfZW5hYmxlKGhvc3QtPmNsayk7CisJaWYgKG1tYykKIAkJcmV0ID0gbW1jX3Jlc3VtZV9ob3N0KG1tYyk7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KLSNlbHNlCi0jZGVmaW5lIG14Y21jaV9zdXNwZW5kICBOVUxMCi0jZGVmaW5lIG14Y21jaV9yZXN1bWUgICBOVUxMCi0jZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBteGNtY2lfcG1fb3BzID0geworCS5zdXNwZW5kCT0gbXhjbWNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBteGNtY2lfcmVzdW1lLAorfTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteGNtY2lfZHJpdmVyID0gewogCS5wcm9iZQkJPSBteGNtY2lfcHJvYmUsCiAJLnJlbW92ZQkJPSBteGNtY2lfcmVtb3ZlLAotCS5zdXNwZW5kCT0gbXhjbWNpX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBteGNtY2lfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmbXhjbWNpX3BtX29wcywKKyNlbmRpZgogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZHJpY29oX2NzLmMKaW5kZXggZTc1MDdhZi4uN2FhNjViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZHJpY29oX2NzLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZHJpY29oX2NzLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IGYyMmJjOWYuLjY2MjlkMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTMyMSw3ICszMjEsNyBAQAogCiBjb25maWcgTVREX1JFRFdPT0QKIAl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZXMgbWFwcGVkIG9uIElCTSBSZWR3b29kIgotCWRlcGVuZHMgb24gTVREX0NGSSAmJiAoIFJFRFdPT0RfNCB8fCBSRURXT09EXzUgfHwgUkVEV09PRF82ICkKKwlkZXBlbmRzIG9uIE1URF9DRkkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHJvdXRpbmVzIGZvciB0aGUgZmxhc2ggY2hpcHMgb24gdGhlIElCTQogCSAgUmVkd29vZCBib2FyZC4gSWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIGJvYXJkcyBhbmQgd291bGQgbGlrZSB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKaW5kZXggZTY5OWU2YS4uZTljYTViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpAQCAtMTAzLDcgKzEwMiw3IEBACiB7CiAJc3RydWN0IHBjbWNpYW10ZF9kZXYgKmRldiA9IChzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqKW1hcC0+bWFwX3ByaXZfMTsKIAl3aW5kb3dfaGFuZGxlX3Qgd2luID0gKHdpbmRvd19oYW5kbGVfdCltYXAtPm1hcF9wcml2XzI7Ci0JbWVtcmVxX3QgbXJxOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJaW50IHJldDsKIAogCWlmICghcGNtY2lhX2Rldl9wcmVzZW50KGRldi0+cF9kZXYpKSB7CkBAIC0xMTEsMTUgKzExMCwxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQltcnEuQ2FyZE9mZnNldCA9IHRvICYgfihkZXYtPndpbl9zaXplLTEpOwotCWlmKG1ycS5DYXJkT2Zmc2V0ICE9IGRldi0+b2Zmc2V0KSB7CisJb2Zmc2V0ID0gdG8gJiB+KGRldi0+d2luX3NpemUtMSk7CisJaWYgKG9mZnNldCAhPSBkZXYtPm9mZnNldCkgewogCQlERUJVRygyLCAiUmVtYXBwaW5nIHdpbmRvdyBmcm9tIDB4JTguOHggdG8gMHglOC44eCIsCi0JCSAgICAgIGRldi0+b2Zmc2V0LCBtcnEuQ2FyZE9mZnNldCk7Ci0JCW1ycS5QYWdlID0gMDsKLQkJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShkZXYtPnBfZGV2LCB3aW4sICZtcnEpOworCQkgICAgICBkZXYtPm9mZnNldCwgb2Zmc2V0KTsKKwkJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShkZXYtPnBfZGV2LCB3aW4sIG9mZnNldCk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXJldHVybiBOVUxMOwotCQlkZXYtPm9mZnNldCA9IG1ycS5DYXJkT2Zmc2V0OworCQlkZXYtPm9mZnNldCA9IG9mZnNldDsKIAl9CiAJcmV0dXJuIGRldi0+d2luX2Jhc2UgKyAodG8gJiAoZGV2LT53aW5fc2l6ZS0xKSk7CiB9CkBAIC0zNDYsNyArMzQ0LDYgQEAKIAkJCWlvdW5tYXAoZGV2LT53aW5fYmFzZSk7CiAJCQlkZXYtPndpbl9iYXNlID0gTlVMTDsKIAkJfQotCQlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluaywgbGluay0+d2luKTsKIAl9CiAJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9yZWR3b29kLmMgYi9kcml2ZXJzL210ZC9tYXBzL3JlZHdvb2QuYwppbmRleCA5MzNjMGI2Li5kMmM5ZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3JlZHdvb2QuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3JlZHdvb2QuYwpAQCAtMjIsOCArMjIsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpZiAhZGVmaW5lZCAoQ09ORklHX1JFRFdPT0RfNikKLQogI2RlZmluZSBXSU5ET1dfQUREUiAweGZmYzAwMDAwCiAjZGVmaW5lIFdJTkRPV19TSVpFIDB4MDA0MDAwMDAKIApAQCAtNjksNDcgKzY3LDYgQEAKIAl9CiB9OwogCi0jZWxzZSAvKiBDT05GSUdfUkVEV09PRF82ICovCi0vKiBGSVhNRTogdGhlIHdpbmRvdyBpcyBiaWdnZXIgLSBhcm1pbiAqLwotI2RlZmluZSBXSU5ET1dfQUREUiAweGZmODAwMDAwCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4MDA4MDAwMDAKLQotI2RlZmluZSBSV19QQVJUMF9PRgkwCi0jZGVmaW5lIFJXX1BBUlQwX1NaCTB4NDAwMDAwCS8qIDQgTWlCIGRhdGEgKi8KLSNkZWZpbmUgUldfUEFSVDFfT0YJUldfUEFSVDBfT0YgKyBSV19QQVJUMF9TWgotI2RlZmluZSBSV19QQVJUMV9TWgkweDEwMDAwCQkvKiA2NEsgVlBEICovCi0jZGVmaW5lIFJXX1BBUlQyX09GCVJXX1BBUlQxX09GICsgUldfUEFSVDFfU1oKLSNkZWZpbmUgUldfUEFSVDJfU1oJMHg0MDAwMDAgLSAoMHgxMDAwMCArIDB4MjAwMDApCi0jZGVmaW5lIFJXX1BBUlQzX09GCVJXX1BBUlQyX09GICsgUldfUEFSVDJfU1oKLSNkZWZpbmUgUldfUEFSVDNfU1oJMHgyMDAwMAotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcmVkd29vZF9mbGFzaF9wYXJ0aXRpb25zW10gPSB7Ci0JewotCQkubmFtZSA9ICJSZWR3b29kIGZpbGVzeXN0ZW0iLAotCQkub2Zmc2V0ID0gUldfUEFSVDBfT0YsCi0JCS5zaXplID0gUldfUEFSVDBfU1oKLQl9LAotCXsKLQkJLm5hbWUgPSAiUmVkd29vZCBPcGVuQklPUyBWaXRhbCBQcm9kdWN0IERhdGEiLAotCQkub2Zmc2V0ID0gUldfUEFSVDFfT0YsCi0JCS5zaXplID0gUldfUEFSVDFfU1osCi0JCS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRQkvKiBmb3JjZSByZWFkLW9ubHkgKi8KLQl9LAotCXsKLQkJLm5hbWUgPSAiUmVkd29vZCBrZXJuZWwiLAotCQkub2Zmc2V0ID0gUldfUEFSVDJfT0YsCi0JCS5zaXplID0gUldfUEFSVDJfU1oKLQl9LAotCXsKLQkJLm5hbWUgPSAiUmVkd29vZCBPcGVuQklPUyIsCi0JCS5vZmZzZXQgPSBSV19QQVJUM19PRiwKLQkJLnNpemUgPSBSV19QQVJUM19TWiwKLQkJLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFCS8qIGZvcmNlIHJlYWQtb25seSAqLwotCX0KLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfUkVEV09PRF82ICovCi0KIHN0cnVjdCBtYXBfaW5mbyByZWR3b29kX2ZsYXNoX21hcCA9IHsKIAkubmFtZSA9ICJJQk0gUmVkd29vZCIsCiAJLnNpemUgPSBXSU5ET1dfU0laRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zdW5fdWZsYXNoLmMKaW5kZXggMDM5MWMyNS4uODk4NDIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zdW5fdWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zdW5fdWZsYXNoLmMKQEAgLTE2MCwxMiArMTYwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHVmbGFzaF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmdWZsYXNoX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ1Zmxhc2hfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVmbGFzaF9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnVmbGFzaF9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ1Zmxhc2hfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodWZsYXNoX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IGZmYzM3MjAuLjM2MmQxNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKQEAgLTUyNiw0ICs1MjYsMTAgQEAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgTkFORCBGbGFzaCBvbiBldmFsdWF0aW9uIGJvYXJkIGJhc2VkCiAJICBvbiB3OTBwOTEwIC8gTlVDOXh4LgogCitjb25maWcgTVREX05BTkRfSlo0NzQwCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIEpaNDc0MCBTb0MgTkFORCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKKwloZWxwCisJCUVuYWJsZXMgc3VwcG9ydCBmb3IgTkFORCBGbGFzaCBvbiBKWjQ3NDAgU29DIGJhc2VkIGJvYXJkcy4KKwogZW5kaWYgIyBNVERfTkFORApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKaW5kZXggZThhYjg4NC4uYWM4M2RjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC00Niw1ICs0Niw2IEBACiBvYmotJChDT05GSUdfTVREX05BTkRfQkNNX1VNSSkJCSs9IGJjbV91bWlfbmFuZC5vIG5hbmRfYmNtX3VtaS5vCiBvYmotJChDT05GSUdfTVREX05BTkRfTVBDNTEyMV9ORkMpCSs9IG1wYzUxMjFfbmZjLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9SSUNPSCkJCSs9IHI4NTIubworb2JqLSQoQ09ORklHX01URF9OQU5EX0paNDc0MCkJCSs9IGp6NDc0MF9uYW5kLm8KIAogbmFuZC1vYmpzIDo9IG5hbmRfYmFzZS5vIG5hbmRfYmJ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZGVuYWxpLmMgYi9kcml2ZXJzL210ZC9uYW5kL2RlbmFsaS5jCmluZGV4IGNhMDM0MjguLjNkZmRhOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZGVuYWxpLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9kZW5hbGkuYwpAQCAtMTgzNiw3ICsxODM2LDcgQEAKIAkucGF0dGVybiA9IG1pcnJvcl9wYXR0ZXJuLAogfTsKIAotLyogaW5pdGFsaXplIGRyaXZlciBkYXRhIHN0cnVjdHVyZXMgKi8KKy8qIGluaXRpYWxpemUgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyAqLwogdm9pZCBkZW5hbGlfZHJ2X2luaXQoc3RydWN0IGRlbmFsaV9uYW5kX2luZm8gKmRlbmFsaSkKIHsKIAlkZW5hbGktPmlkeCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2p6NDc0MF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2p6NDc0MF9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczNDNmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvano0NzQwX25hbmQuYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgSlo0NzQwIFNvQyBOQU5EIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvano0NzQwX25hbmQuaD4KKworI2RlZmluZSBKWl9SRUdfTkFORF9DVFJMCTB4NTAKKyNkZWZpbmUgSlpfUkVHX05BTkRfRUNDX0NUUkwJMHgxMDAKKyNkZWZpbmUgSlpfUkVHX05BTkRfREFUQQkweDEwNAorI2RlZmluZSBKWl9SRUdfTkFORF9QQVIwCTB4MTA4CisjZGVmaW5lIEpaX1JFR19OQU5EX1BBUjEJMHgxMEMKKyNkZWZpbmUgSlpfUkVHX05BTkRfUEFSMgkweDExMAorI2RlZmluZSBKWl9SRUdfTkFORF9JUlFfU1RBVAkweDExNAorI2RlZmluZSBKWl9SRUdfTkFORF9JUlFfQ1RSTAkweDExOAorI2RlZmluZSBKWl9SRUdfTkFORF9FUlIoeCkJKDB4MTFDICsgKCh4KSA8PCAyKSkKKworI2RlZmluZSBKWl9OQU5EX0VDQ19DVFJMX1BBUl9SRUFEWQlCSVQoNCkKKyNkZWZpbmUgSlpfTkFORF9FQ0NfQ1RSTF9FTkNPRElORwlCSVQoMykKKyNkZWZpbmUgSlpfTkFORF9FQ0NfQ1RSTF9SUwkJQklUKDIpCisjZGVmaW5lIEpaX05BTkRfRUNDX0NUUkxfUkVTRVQJCUJJVCgxKQorI2RlZmluZSBKWl9OQU5EX0VDQ19DVFJMX0VOQUJMRQkJQklUKDApCisKKyNkZWZpbmUgSlpfTkFORF9TVEFUVVNfRVJSX0NPVU5UCShCSVQoMzEpIHwgQklUKDMwKSB8IEJJVCgyOSkpCisjZGVmaW5lIEpaX05BTkRfU1RBVFVTX1BBRF9GSU5JU0gJQklUKDQpCisjZGVmaW5lIEpaX05BTkRfU1RBVFVTX0RFQ19GSU5JU0gJQklUKDMpCisjZGVmaW5lIEpaX05BTkRfU1RBVFVTX0VOQ19GSU5JU0gJQklUKDIpCisjZGVmaW5lIEpaX05BTkRfU1RBVFVTX1VOQ09SX0VSUk9SCUJJVCgxKQorI2RlZmluZSBKWl9OQU5EX1NUQVRVU19FUlJPUgkJQklUKDApCisKKyNkZWZpbmUgSlpfTkFORF9DVFJMX0VOQUJMRV9DSElQKHgpIEJJVCgoeCkgPDwgMSkKKyNkZWZpbmUgSlpfTkFORF9DVFJMX0FTU0VSVF9DSElQKHgpIEJJVCgoKHgpIDw8IDEpICsgMSkKKworI2RlZmluZSBKWl9OQU5EX01FTV9BRERSX09GRlNFVCAweDEwMDAwCisjZGVmaW5lIEpaX05BTkRfTUVNX0NNRF9PRkZTRVQgMHgwODAwMAorCitzdHJ1Y3QganpfbmFuZCB7CisJc3RydWN0IG10ZF9pbmZvIG10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCisJdm9pZCBfX2lvbWVtICpiYW5rX2Jhc2U7CisJc3RydWN0IHJlc291cmNlICpiYW5rX21lbTsKKworCXN0cnVjdCBqel9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWJvb2wgaXNfcmVhZGluZzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGp6X25hbmQgKm10ZF90b19qel9uYW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXJldHVybiBjb250YWluZXJfb2YobXRkLCBzdHJ1Y3QganpfbmFuZCwgbXRkKTsKK30KKworc3RhdGljIHZvaWQganpfbmFuZF9jbWRfY3RybChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGRhdCwgdW5zaWduZWQgaW50IGN0cmwpCit7CisJc3RydWN0IGp6X25hbmQgKm5hbmQgPSBtdGRfdG9fanpfbmFuZChtdGQpOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJdWludDMyX3QgcmVnOworCisJaWYgKGN0cmwgJiBOQU5EX0NUUkxfQ0hBTkdFKSB7CisJCUJVR19PTigoY3RybCAmIE5BTkRfQUxFKSAmJiAoY3RybCAmIE5BTkRfQ0xFKSk7CisJCWlmIChjdHJsICYgTkFORF9BTEUpCisJCQljaGlwLT5JT19BRERSX1cgPSBuYW5kLT5iYW5rX2Jhc2UgKyBKWl9OQU5EX01FTV9BRERSX09GRlNFVDsKKwkJZWxzZSBpZiAoY3RybCAmIE5BTkRfQ0xFKQorCQkJY2hpcC0+SU9fQUREUl9XID0gbmFuZC0+YmFua19iYXNlICsgSlpfTkFORF9NRU1fQ01EX09GRlNFVDsKKwkJZWxzZQorCQkJY2hpcC0+SU9fQUREUl9XID0gbmFuZC0+YmFua19iYXNlOworCisJCXJlZyA9IHJlYWRsKG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9DVFJMKTsKKwkJaWYgKGN0cmwgJiBOQU5EX05DRSkKKwkJCXJlZyB8PSBKWl9OQU5EX0NUUkxfQVNTRVJUX0NISVAoMCk7CisJCWVsc2UKKwkJCXJlZyAmPSB+SlpfTkFORF9DVFJMX0FTU0VSVF9DSElQKDApOworCQl3cml0ZWwocmVnLCBuYW5kLT5iYXNlICsgSlpfUkVHX05BTkRfQ1RSTCk7CisJfQorCWlmIChkYXQgIT0gTkFORF9DTURfTk9ORSkKKwkJd3JpdGViKGRhdCwgY2hpcC0+SU9fQUREUl9XKTsKK30KKworc3RhdGljIGludCBqel9uYW5kX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QganpfbmFuZCAqbmFuZCA9IG10ZF90b19qel9uYW5kKG10ZCk7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKG5hbmQtPnBkYXRhLT5idXN5X2dwaW8pOworfQorCitzdGF0aWMgdm9pZCBqel9uYW5kX2h3Y3RsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QganpfbmFuZCAqbmFuZCA9IG10ZF90b19qel9uYW5kKG10ZCk7CisJdWludDMyX3QgcmVnOworCisJd3JpdGVsKDAsIG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9JUlFfU1RBVCk7CisJcmVnID0gcmVhZGwobmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX0VDQ19DVFJMKTsKKworCXJlZyB8PSBKWl9OQU5EX0VDQ19DVFJMX1JFU0VUOworCXJlZyB8PSBKWl9OQU5EX0VDQ19DVFJMX0VOQUJMRTsKKwlyZWcgfD0gSlpfTkFORF9FQ0NfQ1RSTF9SUzsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTkFORF9FQ0NfUkVBRDoKKwkJcmVnICY9IH5KWl9OQU5EX0VDQ19DVFJMX0VOQ09ESU5HOworCQluYW5kLT5pc19yZWFkaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0VDQ19XUklURToKKwkJcmVnIHw9IEpaX05BTkRfRUNDX0NUUkxfRU5DT0RJTkc7CisJCW5hbmQtPmlzX3JlYWRpbmcgPSBmYWxzZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJd3JpdGVsKHJlZywgbmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX0VDQ19DVFJMKTsKK30KKworc3RhdGljIGludCBqel9uYW5kX2NhbGN1bGF0ZV9lY2NfcnMoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVpbnQ4X3QgKmRhdCwKKwl1aW50OF90ICplY2NfY29kZSkKK3sKKwlzdHJ1Y3QganpfbmFuZCAqbmFuZCA9IG10ZF90b19qel9uYW5kKG10ZCk7CisJdWludDMyX3QgcmVnLCBzdGF0dXM7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwOworCXN0YXRpYyB1aW50OF90IGVtcHR5X2Jsb2NrX2VjY1tdID0gezB4Y2QsIDB4OWQsIDB4OTAsIDB4NTgsIDB4ZjQsCisJCQkJCQkweDhiLCAweGZmLCAweGI3LCAweDZmfTsKKworCWlmIChuYW5kLT5pc19yZWFkaW5nKQorCQlyZXR1cm4gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gcmVhZGwobmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX0lSUV9TVEFUKTsKKwl9IHdoaWxlICghKHN0YXR1cyAmIEpaX05BTkRfU1RBVFVTX0VOQ19GSU5JU0gpICYmIC0tdGltZW91dCk7CisKKwlpZiAodGltZW91dCA9PSAwKQorCSAgICByZXR1cm4gLTE7CisKKwlyZWcgPSByZWFkbChuYW5kLT5iYXNlICsgSlpfUkVHX05BTkRfRUNDX0NUUkwpOworCXJlZyAmPSB+SlpfTkFORF9FQ0NfQ1RSTF9FTkFCTEU7CisJd3JpdGVsKHJlZywgbmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX0VDQ19DVFJMKTsKKworCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpCisJCWVjY19jb2RlW2ldID0gcmVhZGIobmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX1BBUjAgKyBpKTsKKworCS8qIElmIHRoZSB3cml0dGVuIGRhdGEgaXMgY29tcGxldGx5IDB4ZmYsIHdlIGFsc28gd2FudCB0byB3cml0ZSAweGZmIGFzCisJICogZWNjLCBvdGhlcndpc2Ugd2Ugd2lsbCBnZXQgaW4gdHJvdWJsZSB3aGVuIGRvaW5nIHN1YnBhZ2Ugd3JpdGVzLiAqLworCWlmIChtZW1jbXAoZWNjX2NvZGUsIGVtcHR5X2Jsb2NrX2VjYywgOSkgPT0gMCkKKwkJbWVtc2V0KGVjY19jb2RlLCAweGZmLCA5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqel9uYW5kX2NvcnJlY3RfZGF0YSh1aW50OF90ICpkYXQsIGludCBpbmRleCwgaW50IG1hc2spCit7CisJaW50IG9mZnNldCA9IGluZGV4ICYgMHg3OworCXVpbnQxNl90IGRhdGE7CisKKwlpbmRleCArPSAoaW5kZXggPj4gMyk7CisKKwlkYXRhID0gZGF0W2luZGV4XTsKKwlkYXRhIHw9IGRhdFtpbmRleCsxXSA8PCA4OworCisJbWFzayBePSAoZGF0YSA+PiBvZmZzZXQpICYgMHgxZmY7CisJZGF0YSAmPSB+KDB4MWZmIDw8IG9mZnNldCk7CisJZGF0YSB8PSAobWFzayA8PCBvZmZzZXQpOworCisJZGF0W2luZGV4XSA9IGRhdGEgJiAweGZmOworCWRhdFtpbmRleCsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIGludCBqel9uYW5kX2NvcnJlY3RfZWNjX3JzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpkYXQsCisJdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKQoreworCXN0cnVjdCBqel9uYW5kICpuYW5kID0gbXRkX3RvX2p6X25hbmQobXRkKTsKKwlpbnQgaSwgZXJyb3JfY291bnQsIGluZGV4OworCXVpbnQzMl90IHJlZywgc3RhdHVzLCBlcnJvcjsKKwl1aW50MzJfdCB0OworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsKKworCXQgPSByZWFkX2VjY1swXTsKKworCWlmICh0ID09IDB4ZmYpIHsKKwkJZm9yIChpID0gMTsgaSA8IDk7ICsraSkKKwkJCXQgJj0gcmVhZF9lY2NbaV07CisKKwkJdCAmPSBkYXRbMF07CisJCXQgJj0gZGF0W25hbmQtPmNoaXAuZWNjLnNpemUgLyAyXTsKKwkJdCAmPSBkYXRbbmFuZC0+Y2hpcC5lY2Muc2l6ZSAtIDFdOworCisJCWlmICh0ID09IDB4ZmYpIHsKKwkJCWZvciAoaSA9IDE7IGkgPCBuYW5kLT5jaGlwLmVjYy5zaXplIC0gMTsgKytpKQorCQkJCXQgJj0gZGF0W2ldOworCQkJaWYgKHQgPT0gMHhmZikKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpCisJCXdyaXRlYihyZWFkX2VjY1tpXSwgbmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX1BBUjAgKyBpKTsKKworCXJlZyA9IHJlYWRsKG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9FQ0NfQ1RSTCk7CisJcmVnIHw9IEpaX05BTkRfRUNDX0NUUkxfUEFSX1JFQURZOworCXdyaXRlbChyZWcsIG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9FQ0NfQ1RSTCk7CisKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWRsKG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9JUlFfU1RBVCk7CisJfSB3aGlsZSAoIShzdGF0dXMgJiBKWl9OQU5EX1NUQVRVU19ERUNfRklOSVNIKSAmJiAtLXRpbWVvdXQpOworCisJaWYgKHRpbWVvdXQgPT0gMCkKKwkgICAgcmV0dXJuIC0xOworCisJcmVnID0gcmVhZGwobmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX0VDQ19DVFJMKTsKKwlyZWcgJj0gfkpaX05BTkRfRUNDX0NUUkxfRU5BQkxFOworCXdyaXRlbChyZWcsIG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9FQ0NfQ1RSTCk7CisKKwlpZiAoc3RhdHVzICYgSlpfTkFORF9TVEFUVVNfRVJST1IpIHsKKwkJaWYgKHN0YXR1cyAmIEpaX05BTkRfU1RBVFVTX1VOQ09SX0VSUk9SKQorCQkJcmV0dXJuIC0xOworCisJCWVycm9yX2NvdW50ID0gKHN0YXR1cyAmIEpaX05BTkRfU1RBVFVTX0VSUl9DT1VOVCkgPj4gMjk7CisKKwkJZm9yIChpID0gMDsgaSA8IGVycm9yX2NvdW50OyArK2kpIHsKKwkJCWVycm9yID0gcmVhZGwobmFuZC0+YmFzZSArIEpaX1JFR19OQU5EX0VSUihpKSk7CisJCQlpbmRleCA9ICgoZXJyb3IgPj4gMTYpICYgMHgxZmYpIC0gMTsKKwkJCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgNTEyKQorCQkJCWp6X25hbmRfY29ycmVjdF9kYXRhKGRhdCwgaW5kZXgsIGVycm9yICYgMHgxZmYpOworCQl9CisKKwkJcmV0dXJuIGVycm9yX2NvdW50OworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIENvcHkgcGFzdGUgb2YgbmFuZF9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0IGV4Y2VwdCBmb3IgZGlmZmVyZW50IGVjY3BvcworICogaGFuZGxpbmcuIFRoZSBlY2MgYXJlYSBpcyBmb3IgNGsgY2hpcHMgNzIgYnl0ZXMgbG9uZyBhbmQgdGh1cyBkb2VzIG5vdCBmaXQKKyAqIGludG8gdGhlIGVjY3BvcyBhcnJheS4gKi8KK3N0YXRpYyBpbnQganpfbmFuZF9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCit7CisJaW50IGksIGVjY3NpemUgPSBjaGlwLT5lY2Muc2l6ZTsKKwlpbnQgZWNjYnl0ZXMgPSBjaGlwLT5lY2MuYnl0ZXM7CisJaW50IGVjY3N0ZXBzID0gY2hpcC0+ZWNjLnN0ZXBzOworCXVpbnQ4X3QgKnAgPSBidWY7CisJdW5zaWduZWQgaW50IGVjY19vZmZzZXQgPSBjaGlwLT5wYWdlX3NoaWZ0OworCisJLyogUmVhZCB0aGUgT09CIGFyZWEgZmlyc3QgKi8KKwljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVBRE9PQiwgMCwgcGFnZSk7CisJY2hpcC0+cmVhZF9idWYobXRkLCBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNpemUpOworCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgMCwgcGFnZSk7CisKKwlmb3IgKGkgPSBlY2Nfb2Zmc2V0OyBlY2NzdGVwczsgZWNjc3RlcHMtLSwgaSArPSBlY2NieXRlcywgcCArPSBlY2NzaXplKSB7CisJCWludCBzdGF0OworCisJCWNoaXAtPmVjYy5od2N0bChtdGQsIE5BTkRfRUNDX1JFQUQpOworCQljaGlwLT5yZWFkX2J1ZihtdGQsIHAsIGVjY3NpemUpOworCisJCXN0YXQgPSBjaGlwLT5lY2MuY29ycmVjdChtdGQsIHAsICZjaGlwLT5vb2JfcG9pW2ldLCBOVUxMKTsKKwkJaWYgKHN0YXQgPCAwKQorCQkJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7CisJCWVsc2UKKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSBzdGF0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ29weS1hbmQtcGFzdGUgb2YgbmFuZF93cml0ZV9wYWdlX2h3ZWNjIHdpdGggZGlmZmVyZW50IGVjY3BvcyBoYW5kbGluZy4gKi8KK3N0YXRpYyB2b2lkIGp6X25hbmRfd3JpdGVfcGFnZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBjb25zdCB1aW50OF90ICpidWYpCit7CisJaW50IGksIGVjY3NpemUgPSBjaGlwLT5lY2Muc2l6ZTsKKwlpbnQgZWNjYnl0ZXMgPSBjaGlwLT5lY2MuYnl0ZXM7CisJaW50IGVjY3N0ZXBzID0gY2hpcC0+ZWNjLnN0ZXBzOworCWNvbnN0IHVpbnQ4X3QgKnAgPSBidWY7CisJdW5zaWduZWQgaW50IGVjY19vZmZzZXQgPSBjaGlwLT5wYWdlX3NoaWZ0OworCisJZm9yIChpID0gZWNjX29mZnNldDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0sIGkgKz0gZWNjYnl0ZXMsIHAgKz0gZWNjc2l6ZSkgeworCQljaGlwLT5lY2MuaHdjdGwobXRkLCBOQU5EX0VDQ19XUklURSk7CisJCWNoaXAtPndyaXRlX2J1ZihtdGQsIHAsIGVjY3NpemUpOworCQljaGlwLT5lY2MuY2FsY3VsYXRlKG10ZCwgcCwgJmNoaXAtPm9vYl9wb2lbaV0pOworCX0KKworCWNoaXAtPndyaXRlX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyJjbWRsaW5lIiwgTlVMTH07CisjZW5kaWYKKworc3RhdGljIGludCBqel9uYW5kX2lvcmVtYXBfcmVzb3VyY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcmVzb3VyY2UgKipyZXMsIHZvaWQgX19pb21lbSAqKmJhc2UpCit7CisJaW50IHJldDsKKworCSpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKKwlpZiAoISpyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSAlcyBtZW1vcnlcbiIsIG5hbWUpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyOworCX0KKworCSpyZXMgPSByZXF1ZXN0X21lbV9yZWdpb24oKCpyZXMpLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgqcmVzKSwKKwkJCQlwZGV2LT5uYW1lKTsKKwlpZiAoISpyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgJXMgbWVtb3J5IHJlZ2lvblxuIiwgbmFtZSk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJKmJhc2UgPSBpb3JlbWFwKCgqcmVzKS0+c3RhcnQsIHJlc291cmNlX3NpemUoKnJlcykpOworCWlmICghKmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgJXMgbWVtb3J5IHJlZ2lvblxuIiwgbmFtZSk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW07CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24oKCpyZXMpLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgqcmVzKSk7CitlcnI6CisJKnJlcyA9IE5VTEw7CisJKmJhc2UgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGp6X25hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBqel9uYW5kICpuYW5kOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXA7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJc3RydWN0IGp6X25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9uX2luZm87CisJaW50IG51bV9wYXJ0aXRpb25zID0gMDsKKyNlbmRpZgorCisJbmFuZCA9IGt6YWxsb2Moc2l6ZW9mKCpuYW5kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW5kKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGp6X25hbmRfaW9yZW1hcF9yZXNvdXJjZShwZGV2LCAibW1pbyIsICZuYW5kLT5tZW0sICZuYW5kLT5iYXNlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCXJldCA9IGp6X25hbmRfaW9yZW1hcF9yZXNvdXJjZShwZGV2LCAiYmFuayIsICZuYW5kLT5iYW5rX21lbSwKKwkJCSZuYW5kLT5iYW5rX2Jhc2UpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2lvdW5tYXBfbW1pbzsKKworCWlmIChwZGF0YSAmJiBncGlvX2lzX3ZhbGlkKHBkYXRhLT5idXN5X2dwaW8pKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+YnVzeV9ncGlvLCAiTkFORCBidXN5IHBpbiIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXF1ZXN0IGJ1c3kgZ3BpbyAlZDogJWRcbiIsCisJCQkJcGRhdGEtPmJ1c3lfZ3BpbywgcmV0KTsKKwkJCWdvdG8gZXJyX2lvdW5tYXBfbWVtOworCQl9CisJfQorCisJbXRkCQk9ICZuYW5kLT5tdGQ7CisJY2hpcAkJPSAmbmFuZC0+Y2hpcDsKKwltdGQtPnByaXYJPSBjaGlwOworCW10ZC0+b3duZXIJPSBUSElTX01PRFVMRTsKKwltdGQtPm5hbWUJPSAiano0NzQwLW5hbmQiOworCisJY2hpcC0+ZWNjLmh3Y3RsCQk9IGp6X25hbmRfaHdjdGw7CisJY2hpcC0+ZWNjLmNhbGN1bGF0ZQk9IGp6X25hbmRfY2FsY3VsYXRlX2VjY19yczsKKwljaGlwLT5lY2MuY29ycmVjdAk9IGp6X25hbmRfY29ycmVjdF9lY2NfcnM7CisJY2hpcC0+ZWNjLm1vZGUJCT0gTkFORF9FQ0NfSFdfT09CX0ZJUlNUOworCWNoaXAtPmVjYy5zaXplCQk9IDUxMjsKKwljaGlwLT5lY2MuYnl0ZXMJCT0gOTsKKworCWNoaXAtPmVjYy5yZWFkX3BhZ2UJPSBqel9uYW5kX3JlYWRfcGFnZV9od2VjY19vb2JfZmlyc3Q7CisJY2hpcC0+ZWNjLndyaXRlX3BhZ2UJPSBqel9uYW5kX3dyaXRlX3BhZ2VfaHdlY2M7CisKKwlpZiAocGRhdGEpCisJCWNoaXAtPmVjYy5sYXlvdXQgPSBwZGF0YS0+ZWNjX2xheW91dDsKKworCWNoaXAtPmNoaXBfZGVsYXkgPSA1MDsKKwljaGlwLT5jbWRfY3RybCA9IGp6X25hbmRfY21kX2N0cmw7CisKKwlpZiAocGRhdGEgJiYgZ3Bpb19pc192YWxpZChwZGF0YS0+YnVzeV9ncGlvKSkKKwkJY2hpcC0+ZGV2X3JlYWR5ID0ganpfbmFuZF9kZXZfcmVhZHk7CisKKwljaGlwLT5JT19BRERSX1IgPSBuYW5kLT5iYW5rX2Jhc2U7CisJY2hpcC0+SU9fQUREUl9XID0gbmFuZC0+YmFua19iYXNlOworCisJbmFuZC0+cGRhdGEgPSBwZGF0YTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBuYW5kKTsKKworCXdyaXRlbChKWl9OQU5EX0NUUkxfRU5BQkxFX0NISVAoMCksIG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9DVFJMKTsKKworCXJldCA9IG5hbmRfc2Nhbl9pZGVudChtdGQsIDEsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAgIkZhaWxlZCB0byBzY2FuIG5hbmRcbiIpOworCQlnb3RvIGVycl9ncGlvX2ZyZWU7CisJfQorCisJaWYgKHBkYXRhICYmIHBkYXRhLT5pZGVudF9jYWxsYmFjaykgeworCQlwZGF0YS0+aWRlbnRfY2FsbGJhY2socGRldiwgY2hpcCwgJnBkYXRhLT5wYXJ0aXRpb25zLAorCQkJCQkmcGRhdGEtPm51bV9wYXJ0aXRpb25zKTsKKwl9CisKKwlyZXQgPSBuYW5kX3NjYW5fdGFpbChtdGQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAgIkZhaWxlZCB0byBzY2FuIG5hbmRcbiIpOworCQlnb3RvIGVycl9ncGlvX2ZyZWU7CisJfQorCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisjaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCisJbnVtX3BhcnRpdGlvbnMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRfcHJvYmVzLAorCQkJCQkJJnBhcnRpdGlvbl9pbmZvLCAwKTsKKyNlbmRpZgorCWlmIChudW1fcGFydGl0aW9ucyA8PSAwICYmIHBkYXRhKSB7CisJCW51bV9wYXJ0aXRpb25zID0gcGRhdGEtPm51bV9wYXJ0aXRpb25zOworCQlwYXJ0aXRpb25faW5mbyA9IHBkYXRhLT5wYXJ0aXRpb25zOworCX0KKworCWlmIChudW1fcGFydGl0aW9ucyA+IDApCisJCXJldCA9IGFkZF9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRpdGlvbl9pbmZvLCBudW1fcGFydGl0aW9ucyk7CisJZWxzZQorI2VuZGlmCisJcmV0ID0gYWRkX210ZF9kZXZpY2UobXRkKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBtdGQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfbmFuZF9yZWxlYXNlOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBKWjQ3NDAgTkFORCBkcml2ZXJcbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9uYW5kX3JlbGVhc2U6CisJbmFuZF9yZWxlYXNlKCZuYW5kLT5tdGQpOworZXJyX2dwaW9fZnJlZToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlncGlvX2ZyZWUocGRhdGEtPmJ1c3lfZ3Bpbyk7CitlcnJfaW91bm1hcF9tZW06CisJaW91bm1hcChuYW5kLT5iYW5rX2Jhc2UpOworZXJyX2lvdW5tYXBfbW1pbzoKKwlpb3VubWFwKG5hbmQtPmJhc2UpOworZXJyX2ZyZWU6CisJa2ZyZWUobmFuZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQganpfbmFuZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QganpfbmFuZCAqbmFuZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbmFuZF9yZWxlYXNlKCZuYW5kLT5tdGQpOworCisJLyogRGVhc3NlcnQgYW5kIGRpc2FibGUgYWxsIGNoaXBzICovCisJd3JpdGVsKDAsIG5hbmQtPmJhc2UgKyBKWl9SRUdfTkFORF9DVFJMKTsKKworCWlvdW5tYXAobmFuZC0+YmFua19iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obmFuZC0+YmFua19tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG5hbmQtPmJhbmtfbWVtKSk7CisJaW91bm1hcChuYW5kLT5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obmFuZC0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShuYW5kLT5tZW0pKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKG5hbmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIganpfbmFuZF9kcml2ZXIgPSB7CisJLnByb2JlID0ganpfbmFuZF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoanpfbmFuZF9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImp6NDc0MC1uYW5kIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGp6X25hbmRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmp6X25hbmRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGp6X25hbmRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqel9uYW5kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmanpfbmFuZF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoanpfbmFuZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5BTkQgY29udHJvbGxlciBkcml2ZXIgZm9yIEpaNDc0MCBTb0MiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06ano0NzQwLW5hbmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYwppbmRleCA4MmU5NDM4Li4wZDc2YjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCkBAIC02MjMsOCArNjIzLDcgQEAKIAkJZWxzZQogCQkJaG9zdC0+YnVmX3N0YXJ0ID0gY29sdW1uICsgbXRkLT53cml0ZXNpemU7CiAKLQkJaWYgKG10ZC0+d3JpdGVzaXplID4gNTEyKQotCQkJY29tbWFuZCA9IE5BTkRfQ01EX1JFQUQwOyAvKiBvbmx5IFJFQUQwIGlzIHZhbGlkICovCisJCWNvbW1hbmQgPSBOQU5EX0NNRF9SRUFEMDsgLyogb25seSBSRUFEMCBpcyB2YWxpZCAqLwogCiAJCXNlbmRfY21kKGhvc3QsIGNvbW1hbmQsIGZhbHNlKTsKIAkJbXhjX2RvX2FkZHJfY3ljbGUobXRkLCBjb2x1bW4sIHBhZ2VfYWRkcik7CkBAIC02MzksMzEgKzYzOCwxMSBAQAogCQlicmVhazsKIAogCWNhc2UgTkFORF9DTURfU0VRSU46Ci0JCWlmIChjb2x1bW4gPj0gbXRkLT53cml0ZXNpemUpIHsKLQkJCS8qCi0JCQkgKiBGSVhNRTogYmVmb3JlIHNlbmQgU0VRSU4gY29tbWFuZCBmb3Igd3JpdGUgT09CLAotCQkJICogV2UgbXVzdCByZWFkIG9uZSBwYWdlIG91dC4KLQkJCSAqIEZvciBLOUYxR1hYIGhhcyBubyBSRUFEMSBjb21tYW5kIHRvIHNldCBjdXJyZW50IEhXCi0JCQkgKiBwb2ludGVyIHRvIHNwYXJlIGFyZWEsIHdlIG11c3Qgd3JpdGUgdGhlIHdob2xlIHBhZ2UKLQkJCSAqIGluY2x1ZGluZyBPT0IgdG9nZXRoZXIuCi0JCQkgKi8KLQkJCWlmIChtdGQtPndyaXRlc2l6ZSA+IDUxMikKLQkJCQkvKiBjYWxsIG91cnNlbGYgdG8gcmVhZCBhIHBhZ2UgKi8KLQkJCQlteGNfbmFuZF9jb21tYW5kKG10ZCwgTkFORF9DTURfUkVBRDAsIDAsCi0JCQkJCQlwYWdlX2FkZHIpOworCQlpZiAoY29sdW1uID49IG10ZC0+d3JpdGVzaXplKQorCQkJLyogY2FsbCBvdXJzZWxmIHRvIHJlYWQgYSBwYWdlICovCisJCQlteGNfbmFuZF9jb21tYW5kKG10ZCwgTkFORF9DTURfUkVBRDAsIDAsIHBhZ2VfYWRkcik7CiAKLQkJCWhvc3QtPmJ1Zl9zdGFydCA9IGNvbHVtbjsKLQotCQkJLyogU2V0IHByb2dyYW0gcG9pbnRlciB0byBzcGFyZSByZWdpb24gKi8KLQkJCWlmIChtdGQtPndyaXRlc2l6ZSA9PSA1MTIpCi0JCQkJc2VuZF9jbWQoaG9zdCwgTkFORF9DTURfUkVBRE9PQiwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaG9zdC0+YnVmX3N0YXJ0ID0gY29sdW1uOwotCi0JCQkvKiBTZXQgcHJvZ3JhbSBwb2ludGVyIHRvIHBhZ2Ugc3RhcnQgKi8KLQkJCWlmIChtdGQtPndyaXRlc2l6ZSA9PSA1MTIpCi0JCQkJc2VuZF9jbWQoaG9zdCwgTkFORF9DTURfUkVBRDAsIGZhbHNlKTsKLQkJfQorCQlob3N0LT5idWZfc3RhcnQgPSBjb2x1bW47CiAKIAkJc2VuZF9jbWQoaG9zdCwgY29tbWFuZCwgZmFsc2UpOwogCQlteGNfZG9fYWRkcl9jeWNsZShtdGQsIGNvbHVtbiwgcGFnZV9hZGRyKTsKQEAgLTg1Myw2ICs4MzIsOCBAQAogCSAgICBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRfcHJvYmVzLCAmaG9zdC0+cGFydHMsIDApOwogCWlmIChucl9wYXJ0cyA+IDApCiAJCWFkZF9tdGRfcGFydGl0aW9ucyhtdGQsIGhvc3QtPnBhcnRzLCBucl9wYXJ0cyk7CisJZWxzZSBpZiAocGRhdGEtPnBhcnRzKQorCQlhZGRfbXRkX3BhcnRpdGlvbnMobXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CiAJZWxzZQogI2VuZGlmCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwppbmRleCAxM2IwNWNiLi43OGFlODk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYworKysgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwpAQCAtNTkzLDYgKzU5Myw3IEBACiAJdWJpLT5nb29kX3BlYl9jb3VudCA9IHViaS0+cGViX2NvdW50IC0gdWJpLT5iYWRfcGViX2NvdW50OwogCXViaS0+bWF4X2VjID0gc2ktPm1heF9lYzsKIAl1YmktPm1lYW5fZWMgPSBzaS0+bWVhbl9lYzsKKwl1YmlfbXNnKCJtYXguIHNlcXVlbmNlIG51bWJlcjogICAgICAgJWxsdSIsIHNpLT5tYXhfc3FudW0pOwogCiAJZXJyID0gdWJpX3JlYWRfdm9sdW1lX3RhYmxlKHViaSwgc2kpOwogCWlmIChlcnIpCkBAIC05ODEsNyArOTgyLDcgQEAKIAl1YmlfbXNnKCJudW1iZXIgb2YgUEVCcyByZXNlcnZlZCBmb3IgYmFkIFBFQiBoYW5kbGluZzogJWQiLAogCQl1YmktPmJlYl9yc3ZkX3BlYnMpOwogCXViaV9tc2coIm1heC9tZWFuIGVyYXNlIGNvdW50ZXI6ICVkLyVkIiwgdWJpLT5tYXhfZWMsIHViaS0+bWVhbl9lYyk7Ci0JdWJpX21zZygiaW1hZ2Ugc2VxdWVuY2UgbnVtYmVyOiAlZCIsIHViaS0+aW1hZ2Vfc2VxKTsKKwl1YmlfbXNnKCJpbWFnZSBzZXF1ZW5jZSBudW1iZXI6ICAlZCIsIHViaS0+aW1hZ2Vfc2VxKTsKIAogCS8qCiAJICogVGhlIGJlbG93IGxvY2sgbWFrZXMgc3VyZSB3ZSBkbyBub3QgcmFjZSB3aXRoICd1YmlfdGhyZWFkKCknIHdoaWNoCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvZWJhLmMgYi9kcml2ZXJzL210ZC91YmkvZWJhLmMKaW5kZXggOWY4N2M5OS4uZmU3NDc0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2ViYS5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwpAQCAtNDE4LDcgKzQxOCw4IEBACiAJCQkJICogbWF5IHRyeSB0byByZWNvdmVyIGRhdGEuIEZJWE1FOiBidXQgdGhpcyBpcwogCQkJCSAqIG5vdCBpbXBsZW1lbnRlZC4KIAkJCQkgKi8KLQkJCQlpZiAoZXJyID09IFVCSV9JT19CQURfVklEX0hEUikgeworCQkJCWlmIChlcnIgPT0gVUJJX0lPX0JBRF9IRFJfUkVBRCB8fAorCQkJCSAgICBlcnIgPT0gVUJJX0lPX0JBRF9IRFIpIHsKIAkJCQkJdWJpX3dhcm4oImNvcnJ1cHRlZCBWSUQgaGVhZGVyIGF0IFBFQiAiCiAJCQkJCQkgIiVkLCBMRUIgJWQ6JWQiLCBwbnVtLCB2b2xfaWQsCiAJCQkJCQkgbG51bSk7CkBAIC05NjEsOCArOTYyLDggQEAKICAqLwogc3RhdGljIGludCBpc19lcnJvcl9zYW5lKGludCBlcnIpCiB7Ci0JaWYgKGVyciA9PSAtRUlPIHx8IGVyciA9PSAtRU5PTUVNIHx8IGVyciA9PSBVQklfSU9fQkFEX1ZJRF9IRFIgfHwKLQkgICAgZXJyID09IC1FVElNRURPVVQpCisJaWYgKGVyciA9PSAtRUlPIHx8IGVyciA9PSAtRU5PTUVNIHx8IGVyciA9PSBVQklfSU9fQkFEX0hEUiB8fAorCSAgICBlcnIgPT0gVUJJX0lPX0JBRF9IRFJfUkVBRCB8fCBlcnIgPT0gLUVUSU1FRE9VVCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CkBAIC0xMTY1LDYgKzExNjYsNDQgQEAKIH0KIAogLyoqCisgKiBwcmludF9yc3ZkX3dhcm5pbmcgLSB3YXJuIGFib3V0IG5vdCBoYXZpbmcgZW5vdWdoIHJlc2VydmVkIFBFQnMuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yICd1YmlfZWJhX2luaXRfc2NhbigpJyB3aGljaCBpcyBjYWxsZWQgd2hlbiBVQkkKKyAqIGNhbm5vdCByZXNlcnZlIGVub3VnaCBQRUJzIGZvciBiYWQgYmxvY2sgaGFuZGxpbmcuIFRoaXMgZnVuY3Rpb24gbWFrZXMgYQorICogZGVjaXNpb24gd2hldGhlciB3ZSBoYXZlIHRvIHByaW50IGEgd2FybmluZyBvciBub3QuIFRoZSBhbGdvcml0aG0gaXMgYXMKKyAqIGZvbGxvd3M6CisgKiAgIG8gaWYgdGhpcyBpcyBhIG5ldyBVQkkgaW1hZ2UsIHRoZW4ganVzdCBwcmludCB0aGUgd2FybmluZworICogICBvIGlmIHRoaXMgaXMgYW4gVUJJIGltYWdlIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3Igc29tZSB0aW1lLCBwcmludAorICogICAgIGEgd2FybmluZyBvbmx5IGlmIHdlIGNhbiByZXNlcnZlIGxlc3MgdGhhbiAxMCUgb2YgdGhlIGV4cGVjdGVkIGFtb3VudCBvZgorICogICAgIHRoZSByZXNlcnZlZCBQRUIuCisgKgorICogVGhlIGlkZWEgaXMgdGhhdCB3aGVuIFVCSSBpcyB1c2VkLCBQRUJzIGJlY29tZSBiYWQsIGFuZCB0aGUgcmVzZXJ2ZWQgcG9vbAorICogb2YgUEVCcyBiZWNvbWVzIHNtYWxsZXIsIHdoaWNoIGlzIG5vcm1hbCBhbmQgd2UgZG8gbm90IHdhbnQgdG8gc2NhcmUgdXNlcnMKKyAqIHdpdGggYSB3YXJuaW5nIGV2ZXJ5IHRpbWUgdGhleSBhdHRhY2ggdGhlIE1URCBkZXZpY2UuIFRoaXMgd2FzIGFuIGlzc3VlCisgKiByZXBvcnRlZCBieSByZWFsIHVzZXJzLgorICovCitzdGF0aWMgdm9pZCBwcmludF9yc3ZkX3dhcm5pbmcoc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCSAgICAgICBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpCit7CisJLyoKKwkgKiBUaGUgMSA8PCAxOCAoMjU2S2lCKSBudW1iZXIgaXMgcGlja2VkIHJhbmRvbWx5LCBqdXN0IGEgcmVhc29uYWJseQorCSAqIGxhcmdlIG51bWJlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG5ld2x5IGZsYXNoZWQgYW5kIHVzZWQgaW1hZ2VzLgorCSAqLworCWlmIChzaS0+bWF4X3NxbnVtID4gKDEgPDwgMTgpKSB7CisJCWludCBtaW4gPSB1YmktPmJlYl9yc3ZkX2xldmVsIC8gMTA7CisKKwkJaWYgKCFtaW4pCisJCQltaW4gPSAxOworCQlpZiAodWJpLT5iZWJfcnN2ZF9wZWJzID4gbWluKQorCQkJcmV0dXJuOworCX0KKworCXViaV93YXJuKCJjYW5ub3QgcmVzZXJ2ZSBlbm91Z2ggUEVCcyBmb3IgYmFkIFBFQiBoYW5kbGluZywgcmVzZXJ2ZWQgJWQsIgorCQkgIiBuZWVkICVkIiwgdWJpLT5iZWJfcnN2ZF9wZWJzLCB1YmktPmJlYl9yc3ZkX2xldmVsKTsKK30KKworLyoqCiAgKiB1YmlfZWJhX2luaXRfc2NhbiAtIGluaXRpYWxpemUgdGhlIEVCQSBzdWItc3lzdGVtIHVzaW5nIHNjYW5uaW5nIGluZm9ybWF0aW9uLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KQEAgLTEyMzYsOSArMTI3NSw3IEBACiAJCWlmICh1YmktPmF2YWlsX3BlYnMgPCB1YmktPmJlYl9yc3ZkX2xldmVsKSB7CiAJCQkvKiBObyBlbm91Z2ggZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyAqLwogCQkJdWJpLT5iZWJfcnN2ZF9wZWJzID0gdWJpLT5hdmFpbF9wZWJzOwotCQkJdWJpX3dhcm4oImNhbm5vdCByZXNlcnZlIGVub3VnaCBQRUJzIGZvciBiYWQgUEVCICIKLQkJCQkgImhhbmRsaW5nLCByZXNlcnZlZCAlZCwgbmVlZCAlZCIsCi0JCQkJIHViaS0+YmViX3JzdmRfcGVicywgdWJpLT5iZWJfcnN2ZF9sZXZlbCk7CisJCQlwcmludF9yc3ZkX3dhcm5pbmcodWJpLCBzaSk7CiAJCX0gZWxzZQogCQkJdWJpLT5iZWJfcnN2ZF9wZWJzID0gdWJpLT5iZWJfcnN2ZF9sZXZlbDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2lvLmMgYi9kcml2ZXJzL210ZC91YmkvaW8uYwppbmRleCA0Yjk3OWUzLi4zMzJmOTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvaW8uYworKysgYi9kcml2ZXJzL210ZC91YmkvaW8uYwpAQCAtMTUwLDYgKzE1MCw4IEBACiByZXRyeToKIAllcnIgPSB1YmktPm10ZC0+cmVhZCh1YmktPm10ZCwgYWRkciwgbGVuLCAmcmVhZCwgYnVmKTsKIAlpZiAoZXJyKSB7CisJCWNvbnN0IGNoYXIgKmVycnN0ciA9IChlcnIgPT0gLUVCQURNU0cpID8gIiAoRUNDIGVycm9yKSIgOiAiIjsKKwogCQlpZiAoZXJyID09IC1FVUNMRUFOKSB7CiAJCQkvKgogCQkJICogLUVVQ0xFQU4gaXMgcmVwb3J0ZWQgaWYgdGhlcmUgd2FzIGEgYml0LWZsaXAgd2hpY2gKQEAgLTE2NSwxNSArMTY3LDE1IEBACiAJCX0KIAogCQlpZiAocmVhZCAhPSBsZW4gJiYgcmV0cmllcysrIDwgVUJJX0lPX1JFVFJJRVMpIHsKLQkJCWRiZ19pbygiZXJyb3IgJWQgd2hpbGUgcmVhZGluZyAlZCBieXRlcyBmcm9tIFBFQiAlZDolZCwiCisJCQlkYmdfaW8oImVycm9yICVkJXMgd2hpbGUgcmVhZGluZyAlZCBieXRlcyBmcm9tIFBFQiAlZDolZCwiCiAJCQkgICAgICAgIiByZWFkIG9ubHkgJXpkIGJ5dGVzLCByZXRyeSIsCi0JCQkgICAgICAgZXJyLCBsZW4sIHBudW0sIG9mZnNldCwgcmVhZCk7CisJCQkgICAgICAgZXJyLCBlcnJzdHIsIGxlbiwgcG51bSwgb2Zmc2V0LCByZWFkKTsKIAkJCXlpZWxkKCk7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKLQkJdWJpX2VycigiZXJyb3IgJWQgd2hpbGUgcmVhZGluZyAlZCBieXRlcyBmcm9tIFBFQiAlZDolZCwgIgotCQkJInJlYWQgJXpkIGJ5dGVzIiwgZXJyLCBsZW4sIHBudW0sIG9mZnNldCwgcmVhZCk7CisJCXViaV9lcnIoImVycm9yICVkJXMgd2hpbGUgcmVhZGluZyAlZCBieXRlcyBmcm9tIFBFQiAlZDolZCwgIgorCQkJInJlYWQgJXpkIGJ5dGVzIiwgZXJyLCBlcnJzdHIsIGxlbiwgcG51bSwgb2Zmc2V0LCByZWFkKTsKIAkJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CiAKIAkJLyoKQEAgLTUxNSw3ICs1MTcsNyBAQAogCSAqIEluIHRoaXMgY2FzZSB3ZSBwcm9iYWJseSBhbnl3YXkgaGF2ZSBnYXJiYWdlIGluIHRoaXMgUEVCLgogCSAqLwogCWVycjEgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgcG51bSwgJnZpZF9oZHIsIDApOwotCWlmIChlcnIxID09IFVCSV9JT19CQURfVklEX0hEUikKKwlpZiAoZXJyMSA9PSBVQklfSU9fQkFEX0hEUl9SRUFEIHx8IGVycjEgPT0gVUJJX0lPX0JBRF9IRFIpCiAJCS8qCiAJCSAqIFRoZSBWSUQgaGVhZGVyIGlzIGNvcnJ1cHRlZCwgc28gd2UgY2FuIHNhZmVseSBlcmFzZSB0aGlzCiAJCSAqIFBFQiBhbmQgbm90IGFmcmFpZCB0aGF0IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHZhbGlkIFBFQiBpbgpAQCAtNzA5LDcgKzcxMSw3IEBACiAgKiBvICVVQklfSU9fQklURkxJUFMgaWYgdGhlIENSQyBpcyBjb3JyZWN0LCBidXQgYml0LWZsaXBzIHdlcmUgZGV0ZWN0ZWQKICAqICAgYW5kIGNvcnJlY3RlZCBieSB0aGUgZmxhc2ggZHJpdmVyOyB0aGlzIGlzIGhhcm1sZXNzIGJ1dCBtYXkgaW5kaWNhdGUgdGhhdAogICogICB0aGlzIGVyYXNlYmxvY2sgbWF5IGJlY29tZSBiYWQgc29vbiAoYnV0IG1heSBiZSBub3QpOwotICogbyAlVUJJX0lPX0JBRF9FQ19IRFIgaWYgdGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIGlzIGNvcnJ1cHRlZCAoYSBDUkMgZXJyb3IpOworICogbyAlVUJJX0lPX0JBRF9IRFIgaWYgdGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIGlzIGNvcnJ1cHRlZCAoYSBDUkMgZXJyb3IpOwogICogbyAlVUJJX0lPX1BFQl9FTVBUWSBpZiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBlbXB0eTsKICAqIG8gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwpAQCAtNzM2LDIzICs3MzgsMjEgQEAKIAkJICogaGVhZGVyIGlzIHN0aWxsIE9LLCB3ZSBqdXN0IHJlcG9ydCB0aGlzIGFzIHRoZXJlIHdhcyBhCiAJCSAqIGJpdC1mbGlwLgogCQkgKi8KLQkJcmVhZF9lcnIgPSBlcnI7CisJCWlmIChlcnIgPT0gLUVCQURNU0cpCisJCQlyZWFkX2VyciA9IFVCSV9JT19CQURfSERSX1JFQUQ7CiAJfQogCiAJbWFnaWMgPSBiZTMyX3RvX2NwdShlY19oZHItPm1hZ2ljKTsKIAlpZiAobWFnaWMgIT0gVUJJX0VDX0hEUl9NQUdJQykgeworCQlpZiAocmVhZF9lcnIpCisJCQlyZXR1cm4gcmVhZF9lcnI7CisKIAkJLyoKIAkJICogVGhlIG1hZ2ljIGZpZWxkIGlzIHdyb25nLiBMZXQncyBjaGVjayBpZiB3ZSBoYXZlIHJlYWQgYWxsCiAJCSAqIDB4RkYuIElmIHllcywgdGhpcyBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGFzc3VtZWQgdG8gYmUKIAkJICogZW1wdHkuCi0JCSAqCi0JCSAqIEJ1dCBpZiB0aGVyZSB3YXMgYSByZWFkIGVycm9yLCB3ZSBkbyBub3QgdGVzdCBpdCBmb3IgYWxsCi0JCSAqIDB4RkZzLiBFdmVuIGlmIGl0IGRvZXMgY29udGFpbiBhbGwgMHhGRnMsIHRoaXMgZXJyb3IKLQkJICogaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIGlzIHN0aWxsIHdyb25nIHdpdGggdGhpcyBwaHlzaWNhbAotCQkgKiBlcmFzZWJsb2NrIGFuZCB3ZSBhbnl3YXkgY2Fubm90IHRyZWF0IGl0IGFzIGVtcHR5LgogCQkgKi8KLQkJaWYgKHJlYWRfZXJyICE9IC1FQkFETVNHICYmCi0JCSAgICBjaGVja19wYXR0ZXJuKGVjX2hkciwgMHhGRiwgVUJJX0VDX0hEUl9TSVpFKSkgeworCQlpZiAoY2hlY2tfcGF0dGVybihlY19oZHIsIDB4RkYsIFVCSV9FQ19IRFJfU0laRSkpIHsKIAkJCS8qIFRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIHN1cHBvc2VkbHkgZW1wdHkgKi8KIAkJCWlmICh2ZXJib3NlKQogCQkJCXViaV93YXJuKCJubyBFQyBoZWFkZXIgZm91bmQgYXQgUEVCICVkLCAiCkBAIC03NzQsNyArNzc0LDcgQEAKIAkJfSBlbHNlIGlmIChVQklfSU9fREVCVUcpCiAJCQlkYmdfbXNnKCJiYWQgbWFnaWMgbnVtYmVyIGF0IFBFQiAlZDogJTA4eCBpbnN0ZWFkIG9mICIKIAkJCQkiJTA4eCIsIHBudW0sIG1hZ2ljLCBVQklfRUNfSERSX01BR0lDKTsKLQkJcmV0dXJuIFVCSV9JT19CQURfRUNfSERSOworCQlyZXR1cm4gVUJJX0lPX0JBRF9IRFI7CiAJfQogCiAJY3JjID0gY3JjMzIoVUJJX0NSQzMyX0lOSVQsIGVjX2hkciwgVUJJX0VDX0hEUl9TSVpFX0NSQyk7CkBAIC03ODgsNyArNzg4LDcgQEAKIAkJfSBlbHNlIGlmIChVQklfSU9fREVCVUcpCiAJCQlkYmdfbXNnKCJiYWQgRUMgaGVhZGVyIENSQyBhdCBQRUIgJWQsIGNhbGN1bGF0ZWQgIgogCQkJCSIlIzA4eCwgcmVhZCAlIzA4eCIsIHBudW0sIGNyYywgaGRyX2NyYyk7Ci0JCXJldHVybiBVQklfSU9fQkFEX0VDX0hEUjsKKwkJcmV0dXJuIHJlYWRfZXJyID86IFVCSV9JT19CQURfSERSOwogCX0KIAogCS8qIEFuZCBvZiBjb3Vyc2UgdmFsaWRhdGUgd2hhdCBoYXMganVzdCBiZWVuIHJlYWQgZnJvbSB0aGUgbWVkaWEgKi8KQEAgLTc5OCw2ICs3OTgsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgJS1FQkFETVNHLCBidXQgdGhlIGhlYWRlciBDUkMgaXMgc3RpbGwgT0ssIHJlcG9ydCBhYm91dAorCSAqIGEgYml0LWZsaXAgdG8gZm9yY2Ugc2NydWJiaW5nIG9uIHRoaXMgUEVCLgorCSAqLwogCXJldHVybiByZWFkX2VyciA/IFVCSV9JT19CSVRGTElQUyA6IDA7CiB9CiAKQEAgLTk3Nyw3ICs5ODEsNyBAQAogICogbyAlVUJJX0lPX0JJVEZMSVBTIGlmIHRoZSBDUkMgaXMgY29ycmVjdCwgYnV0IGJpdC1mbGlwcyB3ZXJlIGRldGVjdGVkCiAgKiAgIGFuZCBjb3JyZWN0ZWQgYnkgdGhlIGZsYXNoIGRyaXZlcjsgdGhpcyBpcyBoYXJtbGVzcyBidXQgbWF5IGluZGljYXRlIHRoYXQKICAqICAgdGhpcyBlcmFzZWJsb2NrIG1heSBiZWNvbWUgYmFkIHNvb247Ci0gKiBvICVVQklfSU9fQkFEX1ZJRF9IRFIgaWYgdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBpcyBjb3JydXB0ZWQgKGEgQ1JDCisgKiBvICVVQklfSU9fQkFEX0hEUiBpZiB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIGlzIGNvcnJ1cHRlZCAoYSBDUkMKICAqICAgZXJyb3IgZGV0ZWN0ZWQpOwogICogbyAlVUJJX0lPX1BFQl9GUkVFIGlmIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGZyZWUgKGkuZS4sIHRoZXJlIGlzIG5vIFZJRAogICogICBoZWFkZXIgdGhlcmUpOwpAQCAtMTAwOCwyMiArMTAxMiwyMCBAQAogCQkgKiBDUkMgY2hlY2stc3VtIGFuZCB3ZSB3aWxsIGlkZW50aWZ5IHRoaXMuIElmIHRoZSBWSUQgaGVhZGVyIGlzCiAJCSAqIHN0aWxsIE9LLCB3ZSBqdXN0IHJlcG9ydCB0aGlzIGFzIHRoZXJlIHdhcyBhIGJpdC1mbGlwLgogCQkgKi8KLQkJcmVhZF9lcnIgPSBlcnI7CisJCWlmIChlcnIgPT0gLUVCQURNU0cpCisJCQlyZWFkX2VyciA9IFVCSV9JT19CQURfSERSX1JFQUQ7CiAJfQogCiAJbWFnaWMgPSBiZTMyX3RvX2NwdSh2aWRfaGRyLT5tYWdpYyk7CiAJaWYgKG1hZ2ljICE9IFVCSV9WSURfSERSX01BR0lDKSB7CisJCWlmIChyZWFkX2VycikKKwkJCXJldHVybiByZWFkX2VycjsKKwogCQkvKgogCQkgKiBJZiB3ZSBoYXZlIHJlYWQgYWxsIDB4RkYgYnl0ZXMsIHRoZSBWSUQgaGVhZGVyIHByb2JhYmx5IGRvZXMKIAkJICogbm90IGV4aXN0IGFuZCB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBhc3N1bWVkIHRvIGJlIGZyZWUuCi0JCSAqCi0JCSAqIEJ1dCBpZiB0aGVyZSB3YXMgYSByZWFkIGVycm9yLCB3ZSBkbyBub3QgdGVzdCB0aGUgZGF0YSBmb3IKLQkJICogMHhGRnMuIEV2ZW4gaWYgaXQgZG9lcyBjb250YWluIGFsbCAweEZGcywgdGhpcyBlcnJvcgotCQkgKiBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgaXMgc3RpbGwgd3Jvbmcgd2l0aCB0aGlzIHBoeXNpY2FsCi0JCSAqIGVyYXNlYmxvY2sgYW5kIGl0IGNhbm5vdCBiZSByZWdhcmRlZCBhcyBmcmVlLgogCQkgKi8KLQkJaWYgKHJlYWRfZXJyICE9IC1FQkFETVNHICYmCi0JCSAgICBjaGVja19wYXR0ZXJuKHZpZF9oZHIsIDB4RkYsIFVCSV9WSURfSERSX1NJWkUpKSB7CisJCWlmIChjaGVja19wYXR0ZXJuKHZpZF9oZHIsIDB4RkYsIFVCSV9WSURfSERSX1NJWkUpKSB7CiAJCQkvKiBUaGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBzdXBwb3NlZGx5IGZyZWUgKi8KIAkJCWlmICh2ZXJib3NlKQogCQkJCXViaV93YXJuKCJubyBWSUQgaGVhZGVyIGZvdW5kIGF0IFBFQiAlZCwgIgpAQCAtMTA0NSw3ICsxMDQ3LDcgQEAKIAkJfSBlbHNlIGlmIChVQklfSU9fREVCVUcpCiAJCQlkYmdfbXNnKCJiYWQgbWFnaWMgbnVtYmVyIGF0IFBFQiAlZDogJTA4eCBpbnN0ZWFkIG9mICIKIAkJCQkiJTA4eCIsIHBudW0sIG1hZ2ljLCBVQklfVklEX0hEUl9NQUdJQyk7Ci0JCXJldHVybiBVQklfSU9fQkFEX1ZJRF9IRFI7CisJCXJldHVybiBVQklfSU9fQkFEX0hEUjsKIAl9CiAKIAljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgdmlkX2hkciwgVUJJX1ZJRF9IRFJfU0laRV9DUkMpOwpAQCAtMTA1OSw3ICsxMDYxLDcgQEAKIAkJfSBlbHNlIGlmIChVQklfSU9fREVCVUcpCiAJCQlkYmdfbXNnKCJiYWQgQ1JDIGF0IFBFQiAlZCwgY2FsY3VsYXRlZCAlIzA4eCwgIgogCQkJCSJyZWFkICUjMDh4IiwgcG51bSwgY3JjLCBoZHJfY3JjKTsKLQkJcmV0dXJuIFVCSV9JT19CQURfVklEX0hEUjsKKwkJcmV0dXJuIHJlYWRfZXJyID86IFVCSV9JT19CQURfSERSOwogCX0KIAogCS8qIFZhbGlkYXRlIHRoZSBWSUQgaGVhZGVyIHRoYXQgd2UgaGF2ZSBqdXN0IHJlYWQgKi8KQEAgLTEwNjksNiArMTA3MSwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIHJlYWQgZXJyb3IgKCUtRUJBRE1TRyksIGJ1dCB0aGUgaGVhZGVyIENSQyBpcyBzdGlsbAorCSAqIE9LLCByZXBvcnQgYWJvdXQgYSBiaXQtZmxpcCB0byBmb3JjZSBzY3J1YmJpbmcgb24gdGhpcyBQRUIuCisJICovCiAJcmV0dXJuIHJlYWRfZXJyID8gVUJJX0lPX0JJVEZMSVBTIDogMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKaW5kZXggYWVkMTlmMy4uMzcyYTE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYworKysgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSAidWJpLmgiCiAKICNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19QQVJBTk9JRApAQCAtNzIsMTYgKzczLDE5IEBACiB7CiAJc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViOwogCi0JaWYgKGxpc3QgPT0gJnNpLT5mcmVlKQorCWlmIChsaXN0ID09ICZzaS0+ZnJlZSkgewogCQlkYmdfYmxkKCJhZGQgdG8gZnJlZTogUEVCICVkLCBFQyAlZCIsIHBudW0sIGVjKTsKLQllbHNlIGlmIChsaXN0ID09ICZzaS0+ZXJhc2UpCisJCXNpLT5mcmVlX3BlYl9jb3VudCArPSAxOworCX0gZWxzZSBpZiAobGlzdCA9PSAmc2ktPmVyYXNlKSB7CiAJCWRiZ19ibGQoImFkZCB0byBlcmFzZTogUEVCICVkLCBFQyAlZCIsIHBudW0sIGVjKTsKLQllbHNlIGlmIChsaXN0ID09ICZzaS0+Y29ycikgeworCQlzaS0+ZXJhc2VfcGViX2NvdW50ICs9IDE7CisJfSBlbHNlIGlmIChsaXN0ID09ICZzaS0+Y29ycikgewogCQlkYmdfYmxkKCJhZGQgdG8gY29ycnVwdGVkOiBQRUIgJWQsIEVDICVkIiwgcG51bSwgZWMpOwotCQlzaS0+Y29ycl9jb3VudCArPSAxOwotCX0gZWxzZSBpZiAobGlzdCA9PSAmc2ktPmFsaWVuKQorCQlzaS0+Y29ycl9wZWJfY291bnQgKz0gMTsKKwl9IGVsc2UgaWYgKGxpc3QgPT0gJnNpLT5hbGllbikgewogCQlkYmdfYmxkKCJhZGQgdG8gYWxpZW46IFBFQiAlZCwgRUMgJWQiLCBwbnVtLCBlYyk7Ci0JZWxzZQorCQlzaS0+YWxpZW5fcGViX2NvdW50ICs9IDE7CisJfSBlbHNlCiAJCUJVRygpOwogCiAJc2ViID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHViaV9zY2FuX2xlYiksIEdGUF9LRVJORUwpOwpAQCAtNTE3LDYgKzUyMSw3IEBACiAJc3YtPmxlYl9jb3VudCArPSAxOwogCXJiX2xpbmtfbm9kZSgmc2ViLT51LnJiLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmc2ViLT51LnJiLCAmc3YtPnJvb3QpOworCXNpLT51c2VkX3BlYl9jb3VudCArPSAxOwogCXJldHVybiAwOwogfQogCkBAIC03NDUsMTkgKzc1MCwxNyBAQAogCQliaXRmbGlwcyA9IDE7CiAJZWxzZSBpZiAoZXJyID09IFVCSV9JT19QRUJfRU1QVFkpCiAJCXJldHVybiBhZGRfdG9fbGlzdChzaSwgcG51bSwgVUJJX1NDQU5fVU5LTk9XTl9FQywgJnNpLT5lcmFzZSk7Ci0JZWxzZSBpZiAoZXJyID09IFVCSV9JT19CQURfRUNfSERSKSB7CisJZWxzZSBpZiAoZXJyID09IFVCSV9JT19CQURfSERSX1JFQUQgfHwgZXJyID09IFVCSV9JT19CQURfSERSKSB7CiAJCS8qCiAJCSAqIFdlIGhhdmUgdG8gYWxzbyBsb29rIGF0IHRoZSBWSUQgaGVhZGVyLCBwb3NzaWJseSBpdCBpcyBub3QKIAkJICogY29ycnVwdGVkLiBTZXQgJWJpdGZsaXBzIGZsYWcgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIFBFQiBiZQogCQkgKiBtb3ZlZCBhbmQgRUMgYmUgcmUtY3JlYXRlZC4KIAkJICovCi0JCWVjX2NvcnIgPSAxOworCQllY19jb3JyID0gZXJyOwogCQllYyA9IFVCSV9TQ0FOX1VOS05PV05fRUM7CiAJCWJpdGZsaXBzID0gMTsKIAl9CiAKLQlzaS0+aXNfZW1wdHkgPSAwOwotCiAJaWYgKCFlY19jb3JyKSB7CiAJCWludCBpbWFnZV9zZXE7CiAKQEAgLTgxMyw5ICs4MTYsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAllbHNlIGlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKQogCQliaXRmbGlwcyA9IDE7Ci0JZWxzZSBpZiAoZXJyID09IFVCSV9JT19CQURfVklEX0hEUiB8fAorCWVsc2UgaWYgKGVyciA9PSBVQklfSU9fQkFEX0hEUl9SRUFEIHx8IGVyciA9PSBVQklfSU9fQkFEX0hEUiB8fAogCQkgKGVyciA9PSBVQklfSU9fUEVCX0ZSRUUgJiYgZWNfY29ycikpIHsKIAkJLyogVklEIGhlYWRlciBpcyBjb3JydXB0ZWQgKi8KKwkJaWYgKGVyciA9PSBVQklfSU9fQkFEX0hEUl9SRUFEIHx8CisJCSAgICBlY19jb3JyID09IFVCSV9JT19CQURfSERSX1JFQUQpCisJCQlzaS0+cmVhZF9lcnJfY291bnQgKz0gMTsKIAkJZXJyID0gYWRkX3RvX2xpc3Qoc2ksIHBudW0sIGVjLCAmc2ktPmNvcnIpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTgzNiwxMSArODQyLDExIEBACiAJCXN3aXRjaCAodmlkaC0+Y29tcGF0KSB7CiAJCWNhc2UgVUJJX0NPTVBBVF9ERUxFVEU6CiAJCQl1YmlfbXNnKCJcImRlbGV0ZVwiIGNvbXBhdGlibGUgaW50ZXJuYWwgdm9sdW1lICVkOiVkIgotCQkJCSIgZm91bmQsIHJlbW92ZSBpdCIsIHZvbF9pZCwgbG51bSk7CisJCQkJIiBmb3VuZCwgd2lsbCByZW1vdmUgaXQiLCB2b2xfaWQsIGxudW0pOwogCQkJZXJyID0gYWRkX3RvX2xpc3Qoc2ksIHBudW0sIGVjLCAmc2ktPmNvcnIpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gMDsKIAogCQljYXNlIFVCSV9DT01QQVRfUk86CiAJCQl1YmlfbXNnKCJyZWFkLW9ubHkgY29tcGF0aWJsZSBpbnRlcm5hbCB2b2x1bWUgJWQ6JWQiCkBAIC04NTUsNyArODYxLDYgQEAKIAkJCWVyciA9IGFkZF90b19saXN0KHNpLCBwbnVtLCBlYywgJnNpLT5hbGllbik7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7Ci0JCQlzaS0+YWxpZW5fcGViX2NvdW50ICs9IDE7CiAJCQlyZXR1cm4gMDsKIAogCQljYXNlIFVCSV9DT01QQVRfUkVKRUNUOgpAQCAtODg2LDYgKzg5MSw4NSBAQAogfQogCiAvKioKKyAqIGNoZWNrX3doYXRfd2VfaGF2ZSAtIGNoZWNrIHdoYXQgUEVCIHdlcmUgZm91bmQgYnkgc2Nhbm5pbmcuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHNpOiBzY2FubmluZyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBsb29rIHdoYXQgUEVCcyB3ZXJlIGZvdW5kIGJ5CisgKiBzY2FubmluZywgYW5kIGRlY2lkZXMgd2hldGhlciB0aGUgZmxhc2ggaXMgZW1wdHkgYW5kIHNob3VsZCBiZSBmb3JtYXR0ZWQgYW5kCisgKiB3aGV0aGVyIHRoZXJlIGFyZSB0b28gbWFueSBjb3JydXB0ZWQgUEVCcyBhbmQgd2Ugc2hvdWxkIG5vdCBhdHRhY2ggdGhpcworICogTVREIGRldmljZS4gUmV0dXJucyB6ZXJvIGlmIHdlIHNob3VsZCBwcm9jZWVkIHdpdGggYXR0YWNoaW5nIHRoZSBNVEQgZGV2aWNlLAorICogYW5kICUtRUlOVkFMIGlmIHdlIHNob3VsZCBub3QuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfd2hhdF93ZV9oYXZlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSkKK3sKKwlzdHJ1Y3QgdWJpX3NjYW5fbGViICpzZWI7CisJaW50IG1heF9jb3JyOworCisJbWF4X2NvcnIgPSB1YmktPnBlYl9jb3VudCAtIHNpLT5iYWRfcGViX2NvdW50IC0gc2ktPmFsaWVuX3BlYl9jb3VudDsKKwltYXhfY29yciA9IG1heF9jb3JyIC8gMjAgPzogODsKKworCS8qCisJICogRmV3IGNvcnJ1cHRlZCBQRUJzIGFyZSBub3QgYSBwcm9ibGVtIGFuZCBtYXkgYmUganVzdCBhIHJlc3VsdCBvZgorCSAqIHVuY2xlYW4gcmVib290cy4gSG93ZXZlciwgbWFueSBvZiB0aGVtIG1heSBpbmRpY2F0ZSBzb21lIHByb2JsZW1zCisJICogd2l0aCB0aGUgZmxhc2ggSFcgb3IgZHJpdmVyLgorCSAqLworCWlmIChzaS0+Y29ycl9wZWJfY291bnQgPj0gOCkgeworCQl1Ymlfd2FybigiJWQgUEVCcyBhcmUgY29ycnVwdGVkIiwgc2ktPmNvcnJfcGViX2NvdW50KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29ycnVwdGVkIFBFQnMgYXJlOiIpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlYiwgJnNpLT5jb3JyLCB1Lmxpc3QpCisJCQlwcmludGsoS0VSTl9DT05UICIgJWQiLCBzZWItPnBudW0pOworCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCisJCS8qCisJCSAqIElmIHRvbyBtYW55IFBFQnMgYXJlIGNvcnJ1cHRlZCwgd2UgcmVmdXNlIGF0dGFjaGluZywKKwkJICogb3RoZXJ3aXNlLCBvbmx5IHByaW50IGEgd2FybmluZy4KKwkJICovCisJCWlmIChzaS0+Y29ycl9wZWJfY291bnQgPj0gbWF4X2NvcnIpIHsKKwkJCXViaV9lcnIoInRvbyBtYW55IGNvcnJ1cHRlZCBQRUJzLCByZWZ1c2luZyB0aGlzIGRldmljZSIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoc2ktPmZyZWVfcGViX2NvdW50ICsgc2ktPnVzZWRfcGViX2NvdW50ICsKKwkgICAgc2ktPmFsaWVuX3BlYl9jb3VudCA9PSAwKSB7CisJCS8qIE5vIFVCSS1mb3JtYXR0ZWQgZXJhc2VibG9ja3Mgd2VyZSBmb3VuZCAqLworCQlpZiAoc2ktPmNvcnJfcGViX2NvdW50ID09IHNpLT5yZWFkX2Vycl9jb3VudCAmJgorCQkgICAgc2ktPmNvcnJfcGViX2NvdW50IDwgOCkgeworCQkJLyogTm8gb3IganVzdCBmZXcgY29ycnVwdGVkIFBFQnMsIGFuZCBhbGwgb2YgdGhlbSBoYWQgYQorCQkJICogcmVhZCBlcnJvci4gV2UgYXNzdW1lIHRoYXQgdGhvc2UgYXJlIGJhZCBQRUJzLCB3aGljaAorCQkJICogd2VyZSBqdXN0IG5vdCBtYXJrZWQgYXMgYmFkIHNvIGZhci4KKwkJCSAqCisJCQkgKiBUaGlzIHBpZWNlIG9mIGNvZGUgYmFzaWNhbGx5IHRyaWVzIHRvIGRpc3Rpbmd1aXNoCisJCQkgKiBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgMiBzaXR1YXRpb25zOgorCQkJICoKKwkJCSAqIDEuIEZsYXNoIGlzIGVtcHR5LCBidXQgdGhlcmUgYXJlIGZldyBiYWQgUEVCcywgd2hpY2gKKwkJCSAqICAgIGFyZSBub3QgbWFya2VkIGFzIGJhZCBzbyBmYXIsIGFuZCB3aGljaCB3ZXJlIHJlYWQKKwkJCSAqICAgIHdpdGggZXJyb3IuIFdlIHdhbnQgdG8gZ28gYWhlYWQgYW5kIGZvcm1hdCB0aGlzCisJCQkgKiAgICBmbGFzaC4gV2hpbGUgZm9ybWF0aW5nLCB0aGUgZmF1bHR5IFBFQnMgd2lsbAorCQkJICogICAgcHJvYmFibHkgYmUgbWFya2VkIGFzIGJhZC4KKwkJCSAqCisJCQkgKiAyLiBGbGFzaCBwcm9iYWJseSBjb250YWlucyBub24tVUJJIGRhdGEgYW5kIHdlIGRvCisJCQkgKiBub3Qgd2FudCB0byBmb3JtYXQgaXQgYW5kIGRlc3Ryb3kgcG9zc2libHkgbmVlZGVkCisJCQkgKiBkYXRhIChlLmcuLCBjb25zaWRlciB0aGUgY2FzZSB3aGVuIHRoZSBib290bG9hZGVyCisJCQkgKiBNVEQgcGFydGl0aW9uIHdhcyBhY2NpZGVudGFsbHkgZmVkIHRvIFVCSSkuCisJCQkgKi8KKwkJCXNpLT5pc19lbXB0eSA9IDE7CisJCQl1YmlfbXNnKCJlbXB0eSBNVEQgZGV2aWNlIGRldGVjdGVkIik7CisJCQlnZXRfcmFuZG9tX2J5dGVzKCZ1YmktPmltYWdlX3NlcSwgc2l6ZW9mKHViaS0+aW1hZ2Vfc2VxKSk7CisJCX0gZWxzZSB7CisJCQl1YmlfZXJyKCJNVEQgZGV2aWNlIHBvc3NpYmx5IGNvbnRhaW5zIG5vbi1VQkkgZGF0YSwgIgorCQkJCSJyZWZ1c2luZyBpdCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoc2ktPmNvcnJfcGViX2NvdW50ID4gMCkKKwkJdWJpX21zZygiY29ycnVwdGVkIFBFQnMgd2lsbCBiZSBmb3JtYXR0ZWQiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiB1Ymlfc2NhbiAtIHNjYW4gYW4gTVREIGRldmljZS4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CiAgKgpAQCAtOTA5LDcgKzk5Myw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJnNpLT5lcmFzZSk7CiAJSU5JVF9MSVNUX0hFQUQoJnNpLT5hbGllbik7CiAJc2ktPnZvbHVtZXMgPSBSQl9ST09UOwotCXNpLT5pc19lbXB0eSA9IDE7CiAKIAllcnIgPSAtRU5PTUVNOwogCWVjaCA9IGt6YWxsb2ModWJpLT5lY19oZHJfYWxzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTkzNSwyMSArMTAxOCw5IEBACiAJaWYgKHNpLT5lY19jb3VudCkKIAkJc2ktPm1lYW5fZWMgPSBkaXZfdTY0KHNpLT5lY19zdW0sIHNpLT5lY19jb3VudCk7CiAKLQlpZiAoc2ktPmlzX2VtcHR5KQotCQl1YmlfbXNnKCJlbXB0eSBNVEQgZGV2aWNlIGRldGVjdGVkIik7Ci0KLQkvKgotCSAqIEZldyBjb3JydXB0ZWQgUEVCcyBhcmUgbm90IGEgcHJvYmxlbSBhbmQgbWF5IGJlIGp1c3QgYSByZXN1bHQgb2YKLQkgKiB1bmNsZWFuIHJlYm9vdHMuIEhvd2V2ZXIsIG1hbnkgb2YgdGhlbSBtYXkgaW5kaWNhdGUgc29tZSBwcm9ibGVtcwotCSAqIHdpdGggdGhlIGZsYXNoIEhXIG9yIGRyaXZlci4gUHJpbnQgYSB3YXJuaW5nIGluIHRoaXMgY2FzZS4KLQkgKi8KLQlpZiAoc2ktPmNvcnJfY291bnQgPj0gOCB8fCBzaS0+Y29ycl9jb3VudCA+PSB1YmktPnBlYl9jb3VudCAvIDQpIHsKLQkJdWJpX3dhcm4oIiVkIFBFQnMgYXJlIGNvcnJ1cHRlZCIsIHNpLT5jb3JyX2NvdW50KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29ycnVwdGVkIFBFQnMgYXJlOiIpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlYiwgJnNpLT5jb3JyLCB1Lmxpc3QpCi0JCQlwcmludGsoS0VSTl9DT05UICIgJWQiLCBzZWItPnBudW0pOwotCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwotCX0KKwllcnIgPSBjaGVja193aGF0X3dlX2hhdmUodWJpLCBzaSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdmlkaDsKIAogCS8qCiAJICogSW4gY2FzZSBvZiB1bmtub3duIGVyYXNlIGNvdW50ZXIgd2UgdXNlIHRoZSBtZWFuIGVyYXNlIGNvdW50ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmggYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5oCmluZGV4IGZmMTc5YWQuLjI1NzZhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmgKKysrIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uaApAQCAtOTEsMTAgKzkxLDE2IEBACiAgKiBAZXJhc2U6IGxpc3Qgb2YgcGh5c2ljYWwgZXJhc2VibG9ja3Mgd2hpY2ggaGF2ZSB0byBiZSBlcmFzZWQKICAqIEBhbGllbjogbGlzdCBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyB3aGljaCBzaG91bGQgbm90IGJlIHVzZWQgYnkgVUJJIChlLmcuLAogICogICAgICAgICB0aG9zZSBiZWxvbmdpbmcgdG8gInByZXNlcnZlIi1jb21wYXRpYmxlIGludGVybmFsIHZvbHVtZXMpCisgKiBAdXNlZF9wZWJfY291bnQ6IGNvdW50IG9mIHVzZWQgUEVCcworICogQGNvcnJfcGViX2NvdW50OiBjb3VudCBvZiBQRUJzIGluIHRoZSBAY29yciBsaXN0CisgKiBAcmVhZF9lcnJfY291bnQ6IGNvdW50IG9mIFBFQnMgcmVhZCB3aXRoIGVycm9yICglVUJJX0lPX0JBRF9IRFJfUkVBRCB3YXMKKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuZWQpCisgKiBAZnJlZV9wZWJfY291bnQ6IGNvdW50IG9mIFBFQnMgaW4gdGhlIEBmcmVlIGxpc3QKKyAqIEBlcmFzZV9wZWJfY291bnQ6IGNvdW50IG9mIFBFQnMgaW4gdGhlIEBlcmFzZSBsaXN0CisgKiBAYWxpZW5fcGViX2NvdW50OiBjb3VudCBvZiBQRUJzIGluIHRoZSBAYWxpZW4gbGlzdAogICogQGJhZF9wZWJfY291bnQ6IGNvdW50IG9mIGJhZCBwaHlzaWNhbCBlcmFzZWJsb2NrcwogICogQHZvbHNfZm91bmQ6IG51bWJlciBvZiB2b2x1bWVzIGZvdW5kIGR1cmluZyBzY2FubmluZwogICogQGhpZ2hlc3Rfdm9sX2lkOiBoaWdoZXN0IHZvbHVtZSBJRAotICogQGFsaWVuX3BlYl9jb3VudDogY291bnQgb2YgcGh5c2ljYWwgZXJhc2VibG9ja3MgaW4gdGhlIEBhbGllbiBsaXN0CiAgKiBAaXNfZW1wdHk6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBNVEQgZGV2aWNlIGlzIGVtcHR5IG9yIG5vdAogICogQG1pbl9lYzogbG93ZXN0IGVyYXNlIGNvdW50ZXIgdmFsdWUKICAqIEBtYXhfZWM6IGhpZ2hlc3QgZXJhc2UgY291bnRlciB2YWx1ZQpAQCAtMTAyLDcgKzEwOCw2IEBACiAgKiBAbWVhbl9lYzogbWVhbiBlcmFzZSBjb3VudGVyIHZhbHVlCiAgKiBAZWNfc3VtOiBhIHRlbXBvcmFyeSB2YXJpYWJsZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgQG1lYW5fZWMKICAqIEBlY19jb3VudDogYSB0ZW1wb3JhcnkgdmFyaWFibGUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIEBtZWFuX2VjCi0gKiBAY29ycl9jb3VudDogY291bnQgb2YgY29ycnVwdGVkIFBFQnMKICAqCiAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSByZXN1bHQgb2Ygc2Nhbm5pbmcgYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVyCiAgKiBVQkkgc3ViLXN5c3RlbXMgdG8gYnVpbGQgZmluYWwgVUJJIGRhdGEgc3RydWN0dXJlcywgZnVydGhlciBlcnJvci1yZWNvdmVyeQpAQCAtMTE0LDEwICsxMTksMTUgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWU7CiAJc3RydWN0IGxpc3RfaGVhZCBlcmFzZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFsaWVuOworCWludCB1c2VkX3BlYl9jb3VudDsKKwlpbnQgY29ycl9wZWJfY291bnQ7CisJaW50IHJlYWRfZXJyX2NvdW50OworCWludCBmcmVlX3BlYl9jb3VudDsKKwlpbnQgZXJhc2VfcGViX2NvdW50OworCWludCBhbGllbl9wZWJfY291bnQ7CiAJaW50IGJhZF9wZWJfY291bnQ7CiAJaW50IHZvbHNfZm91bmQ7CiAJaW50IGhpZ2hlc3Rfdm9sX2lkOwotCWludCBhbGllbl9wZWJfY291bnQ7CiAJaW50IGlzX2VtcHR5OwogCWludCBtaW5fZWM7CiAJaW50IG1heF9lYzsKQEAgLTEyNSw3ICsxMzUsNiBAQAogCWludCBtZWFuX2VjOwogCXVpbnQ2NF90IGVjX3N1bTsKIAlpbnQgZWNfY291bnQ7Ci0JaW50IGNvcnJfY291bnQ7CiB9OwogCiBzdHJ1Y3QgdWJpX2RldmljZTsKQEAgLTEzNSw3ICsxNDQsNyBAQAogICogdWJpX3NjYW5fbW92ZV90b19saXN0IC0gbW92ZSBhIFBFQiBmcm9tIHRoZSB2b2x1bWUgdHJlZSB0byBhIGxpc3QuCiAgKgogICogQHN2OiB2b2x1bWUgc2Nhbm5pbmcgaW5mb3JtYXRpb24KLSAqIEBzZWI6IHNjYW5uaW5nIGVyYXNlYmxvY2sgaW5mcHJtYXRpb24KKyAqIEBzZWI6IHNjYW5uaW5nIGVyYXNlYmxvY2sgaW5mb3JtYXRpb24KICAqIEBsaXN0OiB0aGUgbGlzdCB0byBtb3ZlIHRvCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1Ymlfc2Nhbl9tb3ZlX3RvX2xpc3Qoc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3YsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdWJpLmggYi9kcml2ZXJzL210ZC91YmkvdWJpLmgKaW5kZXggYTYzN2YwMi4uMDM1OWUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ViaS5oCisrKyBiL2RyaXZlcnMvbXRkL3ViaS91YmkuaApAQCAtODksMTYgKzg5LDE2IEBACiAgKiAgICAgICAgICAgICAgICAgICAlMHhGRiBieXRlcwogICogVUJJX0lPX1BFQl9GUkVFOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBmcmVlLCBpLmUuIGl0IGNvbnRhaW5zIG9ubHkgYQogICogICAgICAgICAgICAgICAgICB2YWxpZCBlcmFzZSBjb3VudGVyIGhlYWRlciwgYW5kIHRoZSByZXN0IGFyZSAlMHhGRiBieXRlcwotICogVUJJX0lPX0JBRF9FQ19IRFI6IHRoZSBlcmFzZSBjb3VudGVyIGhlYWRlciBpcyBjb3JydXB0ZWQgKGJhZCBtYWdpYyBvciBDUkMpCi0gKiBVQklfSU9fQkFEX1ZJRF9IRFI6IHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgaXMgY29ycnVwdGVkIChiYWQgbWFnaWMgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgQ1JDKQorICogVUJJX0lPX0JBRF9IRFI6IHRoZSBFQyBvciBWSUQgaGVhZGVyIGlzIGNvcnJ1cHRlZCAoYmFkIG1hZ2ljIG9yIENSQykKKyAqIFVCSV9JT19CQURfSERSX1JFQUQ6IHRoZSBzYW1lIGFzICVVQklfSU9fQkFEX0hEUiwgYnV0IGFsc28gdGhlcmUgd2FzIGEgcmVhZAorICogCQkJZXJyb3IgcmVwb3J0ZWQgYnkgdGhlIGZsYXNoIGRyaXZlcgogICogVUJJX0lPX0JJVEZMSVBTOiBiaXQtZmxpcHMgd2VyZSBkZXRlY3RlZCBhbmQgY29ycmVjdGVkCiAgKi8KIGVudW0gewogCVVCSV9JT19QRUJfRU1QVFkgPSAxLAogCVVCSV9JT19QRUJfRlJFRSwKLQlVQklfSU9fQkFEX0VDX0hEUiwKLQlVQklfSU9fQkFEX1ZJRF9IRFIsCisJVUJJX0lPX0JBRF9IRFIsCisJVUJJX0lPX0JBRF9IRFJfUkVBRCwKIAlVQklfSU9fQklURkxJUFMKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTI3LmMgYi9kcml2ZXJzL25ldC8zYzUyNy5jCmluZGV4IDM4Mzk1ZGYuLjcwNzA1ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTI3LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1MjcuYwpAQCAtNzI5LDE0ICs3MjksMTQgQEAKICAqCW1jMzJfbG9hZF9yeF9yaW5nCS0JbG9hZCB0aGUgcmluZyBvZiByZWNlaXZlIGJ1ZmZlcnMKICAqCUBkZXY6IDNjNTI3IHRvIGJ1aWxkIHRoZSByaW5nIGZvcgogICoKLSAqCVRoaXMgaW5pdGFsaXNlcyB0aGUgb24tY2FyZCBhbmQgZHJpdmVyIGRhdGFzdHJ1Y3R1cmVzIHRvCisgKglUaGlzIGluaXRpYWxpc2VzIHRoZSBvbi1jYXJkIGFuZCBkcml2ZXIgZGF0YXN0cnVjdHVyZXMgdG8KICAqCXRoZSBwb2ludCB3aGVyZSBtYzMyX3N0YXJ0X3RyYW5zY2VpdmVyKCkgY2FuIGJlIGNhbGxlZC4KICAqCiAgKglUaGUgY2FyZCBzZXRzIHVwIHRoZSByZWNlaXZlIHJpbmcgZm9yIHVzLiBXZSBhcmUgcmVxdWlyZWQgdG8gdXNlIHRoZQogICoJcmluZyBpdCBwcm92aWRlcywgYWx0aG91Z2ggdGhlIHNpemUgb2YgdGhlIHJpbmcgaXMgY29uZmlndXJhYmxlLgogICoKICAqIAlXZSBhbGxvY2F0ZSBhbiBza19idWZmIGZvciBlYWNoIHJpbmcgZW50cnkgaW4gdHVybiBhbmQKLSAqIAlpbml0YWxpc2UgaXRzIGhvdXNlLWtlZXBpbmcgaW5mby4gQXQgdGhlIHNhbWUgdGltZSwgd2UgcmVhZAorICogCWluaXRpYWxpc2UgaXRzIGhvdXNlLWtlZXBpbmcgaW5mby4gQXQgdGhlIHNhbWUgdGltZSwgd2UgcmVhZAogICogCWVhY2ggJ25leHQnIHBvaW50ZXIgaW4gb3VyIHJ4X3JpbmcgYXJyYXkuIFRoaXMgcmVkdWNlcyBzbG93CiAgKiAJc2hhcmVkLW1lbW9yeSByZWFkcyBhbmQgbWFrZXMgaXQgZWFzeSB0byBhY2Nlc3MgcHJlZGVjZXNzb3IKICAqIAlkZXNjcmlwdG9ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTI3LmggYi9kcml2ZXJzL25ldC8zYzUyNy5oCmluZGV4IDc1ZTI4ZmUuLmQ2OTNiOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTI3LmgKKysrIGIvZHJpdmVycy9uZXQvM2M1MjcuaApAQCAtMzQsNyArMzQsNyBAQAogewogIAl1MTYgbWJveDsKICAJdTE2IGRhdGFbMV07Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBza2JfaGVhZGVyCiB7CkBAIC00Myw3ICs0Myw3IEBACiAJdTE2IG5leHQ7CS8qIERvIG5vdCBjaGFuZ2UhICovCiAJdTE2IGxlbmd0aDsKIAl1MzIgZGF0YTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1jMzJfc3RhdHMKIHsKQEAgLTY4LDcgKzY4LDcgQEAKIAl1MzIgZGF0YUFbNl07CiAJdTE2IGRhdGFCWzVdOwogCXUzMiBkYXRhQ1sxNF07Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgU1RBVFVTX01BU0sJMHgwRgogI2RlZmluZSBDT01QTEVURUQJKDE8PDcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzU5eC5jIGIvZHJpdmVycy9uZXQvM2M1OXguYwppbmRleCBkNzU4MDNlLi5jNzU0ZDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzU5eC5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKQEAgLTQzNSw3ICs0MzUsNiBAQAogICAgRmlyc3QgdGhlIHdpbmRvd3MuICBUaGVyZSBhcmUgZWlnaHQgcmVnaXN0ZXIgd2luZG93cywgd2l0aCB0aGUgY29tbWFuZAogICAgYW5kIHN0YXR1cyByZWdpc3RlcnMgYXZhaWxhYmxlIGluIGVhY2guCiAgICAqLwotI2RlZmluZSBFTDNXSU5ET1cod2luX251bSkgaW93cml0ZTE2KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKICNkZWZpbmUgRUwzX0NNRCAweDBlCiAjZGVmaW5lIEVMM19TVEFUVVMgMHgwZQogCkBAIC02NDUsMTAgKzY0NCw1MSBAQAogCXUxNiBkZWZlcnJlZDsJCQkJCQkvKiBSZXNlbmQgdGhlc2UgaW50ZXJydXB0cyB3aGVuIHdlCiAJCQkJCQkJCQkJICogYmFsZSBmcm9tIHRoZSBJU1IgKi8KIAl1MTYgaW9fc2l6ZTsJCQkJCQkvKiBTaXplIG9mIFBDSSByZWdpb24gKGZvciByZWxlYXNlX3JlZ2lvbikgKi8KLQlzcGlubG9ja190IGxvY2s7CQkJCQkvKiBTZXJpYWxpc2UgYWNjZXNzIHRvIGRldmljZSAmIGl0cyB2b3J0ZXhfcHJpdmF0ZSAqLwotCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CQkJCS8qIE1JSSBsaWIgaG9va3MvaW5mbyAqLworCisJLyogU2VyaWFsaXNlcyBhY2Nlc3MgdG8gaGFyZHdhcmUgb3RoZXIgdGhhbiBNSUkgYW5kIHZhcmlhYmxlcyBiZWxvdy4KKwkgKiBUaGUgbG9jayBoaWVyYXJjaHkgaXMgcnRubF9sb2NrID4gbG9jayA+IG1paV9sb2NrID4gd2luZG93X2xvY2suICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJc3BpbmxvY2tfdCBtaWlfbG9jazsJCS8qIFNlcmlhbGlzZXMgYWNjZXNzIHRvIE1JSSAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CQkvKiBNSUkgbGliIGhvb2tzL2luZm8gKi8KKwlzcGlubG9ja190IHdpbmRvd19sb2NrOwkJLyogU2VyaWFsaXNlcyBhY2Nlc3MgdG8gd2luZG93ZWQgcmVncyAqLworCWludCB3aW5kb3c7CQkJLyogUmVnaXN0ZXIgd2luZG93ICovCiB9OwogCitzdGF0aWMgdm9pZCB3aW5kb3dfc2V0KHN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAsIGludCB3aW5kb3cpCit7CisJaWYgKHdpbmRvdyAhPSB2cC0+d2luZG93KSB7CisJCWlvd3JpdGUxNihTZWxlY3RXaW5kb3cgKyB3aW5kb3csIHZwLT5pb2FkZHIgKyBFTDNfQ01EKTsKKwkJdnAtPndpbmRvdyA9IHdpbmRvdzsKKwl9Cit9CisKKyNkZWZpbmUgREVGSU5FX1dJTkRPV19JTyhzaXplKQkJCQkJCVwKK3N0YXRpYyB1ICMjIHNpemUJCQkJCQkJXAord2luZG93X3JlYWQgIyMgc2l6ZShzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwLCBpbnQgd2luZG93LCBpbnQgYWRkcikJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJCVwKKwl1ICMjIHNpemUgcmV0OwkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT53aW5kb3dfbG9jaywgZmxhZ3MpOwkJCVwKKwl3aW5kb3dfc2V0KHZwLCB3aW5kb3cpOwkJCQkJCVwKKwlyZXQgPSBpb3JlYWQgIyMgc2l6ZSh2cC0+aW9hZGRyICsgYWRkcik7CQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT53aW5kb3dfbG9jaywgZmxhZ3MpOwkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgdm9pZAkJCQkJCQkJXAord2luZG93X3dyaXRlICMjIHNpemUoc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCwgdSAjIyBzaXplIHZhbHVlLAlcCisJCSAgICAgaW50IHdpbmRvdywgaW50IGFkZHIpCQkJCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT53aW5kb3dfbG9jaywgZmxhZ3MpOwkJCVwKKwl3aW5kb3dfc2V0KHZwLCB3aW5kb3cpOwkJCQkJCVwKKwlpb3dyaXRlICMjIHNpemUodmFsdWUsIHZwLT5pb2FkZHIgKyBhZGRyKTsJCQlcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPndpbmRvd19sb2NrLCBmbGFncyk7CQlcCit9CitERUZJTkVfV0lORE9XX0lPKDgpCitERUZJTkVfV0lORE9XX0lPKDE2KQorREVGSU5FX1dJTkRPV19JTygzMikKKwogI2lmZGVmIENPTkZJR19QQ0kKICNkZWZpbmUgREVWSUNFX1BDSShkZXYpICgoKGRldiktPmJ1cyA9PSAmcGNpX2J1c190eXBlKSA/IHRvX3BjaV9kZXYoKGRldikpIDogTlVMTCkKICNlbHNlCkBAIC03MTEsNyArNzUxLDcgQEAKIHN0YXRpYyBpbnQgdm9ydGV4X3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgdm9ydGV4X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbmFsKTsKIHN0YXRpYyBpbnQgdm9ydGV4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBtZGlvX3N5bmModm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBiaXRzKTsKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwLCBpbnQgYml0cyk7CiBzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOwogc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqdnAsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKIHN0YXRpYyB2b2lkIHZvcnRleF90aW1lcih1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC05ODAsMTAgKzEwMjAsMTYgQEAKIAlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgcGNpX2JhciwgMCk7CiAJaWYgKCFpb2FkZHIpIC8qIElmIG1hcHBpbmcgZmFpbHMsIGZhbGwtYmFjayB0byBCQVIgMC4uLiAqLwogCQlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCXJjID0gdm9ydGV4X3Byb2JlMSgmcGRldi0+ZGV2LCBpb2FkZHIsIHBkZXYtPmlycSwKIAkJCSAgIGVudC0+ZHJpdmVyX2RhdGEsIHVuaXQpOwogCWlmIChyYyA8IDApIHsKKwkJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMTE5LDYgKzExNjUsNyBAQAogCXZwLT5oYXNfbndheSA9ICh2Y2ktPmRydl9mbGFncyAmIEhBU19OV0FZKSA/IDEgOiAwOwogCXZwLT5pb19zaXplID0gdmNpLT5pb19zaXplOwogCXZwLT5jYXJkX2lkeCA9IGNhcmRfaWR4OworCXZwLT53aW5kb3cgPSAtMTsKIAogCS8qIG1vZHVsZSBsaXN0IG9ubHkgZm9yIENvbXBhcSBkZXZpY2UgKi8KIAlpZiAoZ2VuZGV2ID09IE5VTEwpIHsKQEAgLTExNTQsNiArMTIwMSw4IEBACiAJfQogCiAJc3Bpbl9sb2NrX2luaXQoJnZwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdnAtPm1paV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdnAtPndpbmRvd19sb2NrKTsKIAl2cC0+Z2VuZGV2ID0gZ2VuZGV2OwogCXZwLT5taWkuZGV2ID0gZGV2OwogCXZwLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOwpAQCAtMTIwNSw3ICsxMjU0LDYgQEAKIAl2cC0+bWlpLmZvcmNlX21lZGlhID0gdnAtPmZ1bGxfZHVwbGV4OwogCXZwLT5vcHRpb25zID0gb3B0aW9uOwogCS8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHRoZSBFRVBST00uICovCi0JRUwzV0lORE9XKDApOwogCXsKIAkJaW50IGJhc2U7CiAKQEAgLTEyMTgsMTQgKzEyNjYsMTUgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDsgaSsrKSB7CiAJCQlpbnQgdGltZXI7Ci0JCQlpb3dyaXRlMTYoYmFzZSArIGksIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJCQl3aW5kb3dfd3JpdGUxNih2cCwgYmFzZSArIGksIDAsIFduMEVlcHJvbUNtZCk7CiAJCQkvKiBQYXVzZSBmb3IgYXQgbGVhc3QgMTYyIHVzLiBmb3IgdGhlIHJlYWQgdG8gdGFrZSBwbGFjZS4gKi8KIAkJCWZvciAodGltZXIgPSAxMDsgdGltZXIgPj0gMDsgdGltZXItLSkgewogCQkJCXVkZWxheSgxNjIpOwotCQkJCWlmICgoaW9yZWFkMTYoaW9hZGRyICsgV24wRWVwcm9tQ21kKSAmIDB4ODAwMCkgPT0gMCkKKwkJCQlpZiAoKHdpbmRvd19yZWFkMTYodnAsIDAsIFduMEVlcHJvbUNtZCkgJgorCQkJCSAgICAgMHg4MDAwKSA9PSAwKQogCQkJCQlicmVhazsKIAkJCX0KLQkJCWVlcHJvbVtpXSA9IGlvcmVhZDE2KGlvYWRkciArIFduMEVlcHJvbURhdGEpOworCQkJZWVwcm9tW2ldID0gd2luZG93X3JlYWQxNih2cCwgMCwgV24wRWVwcm9tRGF0YSk7CiAJCX0KIAl9CiAJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkrKykKQEAgLTEyNTAsOSArMTI5OSw4IEBACiAJCXByX2VycigiKioqIEVFUFJPTSBNQUMgYWRkcmVzcyBpcyBpbnZhbGlkLlxuIik7CiAJCWdvdG8gZnJlZV9yaW5nOwkvKiBXaXRoIGV2ZXJ5IHBhY2sgKi8KIAl9Ci0JRUwzV0lORE9XKDIpOwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCQl3aW5kb3dfd3JpdGU4KHZwLCBkZXYtPmRldl9hZGRyW2ldLCAyLCBpKTsKIAogCWlmIChwcmludF9pbmZvKQogCQlwcl9jb250KCIsIElSUSAlZFxuIiwgZGV2LT5pcnEpOwpAQCAtMTI2MSw4ICsxMzA5LDcgQEAKIAkJcHJfd2FybmluZygiICoqKiBXYXJuaW5nOiBJUlEgJWQgaXMgdW5saWtlbHkgdG8gd29yayEgKioqXG4iLAogCQkJICAgZGV2LT5pcnEpOwogCi0JRUwzV0lORE9XKDQpOwotCXN0ZXAgPSAoaW9yZWFkOChpb2FkZHIgKyBXbjRfTmV0RGlhZykgJiAweDFlKSA+PiAxOworCXN0ZXAgPSAod2luZG93X3JlYWQ4KHZwLCA0LCBXbjRfTmV0RGlhZykgJiAweDFlKSA+PiAxOwogCWlmIChwcmludF9pbmZvKSB7CiAJCXByX2luZm8oIiAgcHJvZHVjdCBjb2RlICUwMnglMDJ4IHJldiAlMDJ4LiVkIGRhdGUgJTAyZC0lMDJkLSUwMmRcbiIsCiAJCQllZXByb21bNl0mMHhmZiwgZWVwcm9tWzZdPj44LCBlZXByb21bMHgxNF0sCkBAIC0xMjg1LDE3ICsxMzMyLDE1IEBACiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCiAJCQkJdnAtPmNiX2ZuX2Jhc2UpOwogCQl9Ci0JCUVMM1dJTkRPVygyKTsKIAotCQluID0gaW9yZWFkMTYoaW9hZGRyICsgV24yX1Jlc2V0T3B0aW9ucykgJiB+MHg0MDEwOworCQluID0gd2luZG93X3JlYWQxNih2cCwgMiwgV24yX1Jlc2V0T3B0aW9ucykgJiB+MHg0MDEwOwogCQlpZiAodnAtPmRydl9mbGFncyAmIElOVkVSVF9MRURfUFdSKQogCQkJbiB8PSAweDEwOwogCQlpZiAodnAtPmRydl9mbGFncyAmIElOVkVSVF9NSUlfUFdSKQogCQkJbiB8PSAweDQwMDA7Ci0JCWlvd3JpdGUxNihuLCBpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIG4sIDIsIFduMl9SZXNldE9wdGlvbnMpOwogCQlpZiAodnAtPmRydl9mbGFncyAmIFdOT19YQ1ZSX1BXUikgewotCQkJRUwzV0lORE9XKDApOwotCQkJaW93cml0ZTE2KDB4MDgwMCwgaW9hZGRyKTsKKwkJCXdpbmRvd193cml0ZTE2KHZwLCAweDA4MDAsIDAsIDApOwogCQl9CiAJfQogCkBAIC0xMzEzLDE0ICsxMzU4LDEzIEBACiAJewogCQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJhbV9zcGxpdFtdID0geyI1OjMiLCAiMzoxIiwgIjE6MSIsICIzOjUifTsKIAkJdW5zaWduZWQgaW50IGNvbmZpZzsKLQkJRUwzV0lORE9XKDMpOwotCQl2cC0+YXZhaWxhYmxlX21lZGlhID0gaW9yZWFkMTYoaW9hZGRyICsgV24zX09wdGlvbnMpOworCQl2cC0+YXZhaWxhYmxlX21lZGlhID0gd2luZG93X3JlYWQxNih2cCwgMywgV24zX09wdGlvbnMpOwogCQlpZiAoKHZwLT5hdmFpbGFibGVfbWVkaWEgJiAweGZmKSA9PSAwKQkJLyogQnJva2VuIDNjOTE2ICovCiAJCQl2cC0+YXZhaWxhYmxlX21lZGlhID0gMHg0MDsKLQkJY29uZmlnID0gaW9yZWFkMzIoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCWNvbmZpZyA9IHdpbmRvd19yZWFkMzIodnAsIDMsIFduM19Db25maWcpOwogCQlpZiAocHJpbnRfaW5mbykgewogCQkJcHJfZGVidWcoIiAgSW50ZXJuYWwgY29uZmlnIHJlZ2lzdGVyIGlzICU0LjR4LCB0cmFuc2NlaXZlcnMgJSN4LlxuIiwKLQkJCQljb25maWcsIGlvcmVhZDE2KGlvYWRkciArIFduM19PcHRpb25zKSk7CisJCQkJY29uZmlnLCB3aW5kb3dfcmVhZDE2KHZwLCAzLCBXbjNfT3B0aW9ucykpOwogCQkJcHJfaW5mbygiICAlZEsgJXMtd2lkZSBSQU0gJXMgUng6VHggc3BsaXQsICVzJXMgaW50ZXJmYWNlLlxuIiwKIAkJCQkgICA4IDw8IFJBTV9TSVpFKGNvbmZpZyksCiAJCQkJICAgUkFNX1dJRFRIKGNvbmZpZykgPyAid29yZCIgOiAiYnl0ZSIsCkBAIC0xMzQ2LDExICsxMzkwLDEwIEBACiAJaWYgKCh2cC0+YXZhaWxhYmxlX21lZGlhICYgMHg0MCkgfHwgKHZjaS0+ZHJ2X2ZsYWdzICYgSEFTX05XQVkpIHx8CiAJCWRldi0+aWZfcG9ydCA9PSBYQ1ZSX01JSSB8fCBkZXYtPmlmX3BvcnQgPT0gWENWUl9OV0FZKSB7CiAJCWludCBwaHksIHBoeV9pZHggPSAwOwotCQlFTDNXSU5ET1coNCk7CiAJCW1paV9wcmVhbWJsZV9yZXF1aXJlZCsrOwogCQlpZiAodnAtPmRydl9mbGFncyAmIEVYVFJBX1BSRUFNQkxFKQogCQkJbWlpX3ByZWFtYmxlX3JlcXVpcmVkKys7Ci0JCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKwkJbWRpb19zeW5jKHZwLCAzMik7CiAJCW1kaW9fcmVhZChkZXYsIDI0LCBNSUlfQk1TUik7CiAJCWZvciAocGh5ID0gMDsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IDE7IHBoeSsrKSB7CiAJCQlpbnQgbWlpX3N0YXR1cywgcGh5eDsKQEAgLTE0NzgsMTggKzE1MjEsMTcgQEAKIHZvcnRleF9zZXRfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7Ci0Jdm9pZCBfX2lvbWVtICppb2FkZHIgPSB2cC0+aW9hZGRyOwogCiAJcHJfaW5mbygiJXM6ICBzZXR0aW5nICVzLWR1cGxleC5cbiIsCiAJCWRldi0+bmFtZSwgKHZwLT5mdWxsX2R1cGxleCkgPyAiZnVsbCIgOiAiaGFsZiIpOwogCi0JRUwzV0lORE9XKDMpOwogCS8qIFNldCB0aGUgZnVsbC1kdXBsZXggYml0LiAqLwotCWlvd3JpdGUxNigoKHZwLT5pbmZvMSAmIDB4ODAwMCkgfHwgdnAtPmZ1bGxfZHVwbGV4ID8gMHgyMCA6IDApIHwKLQkJIAkodnAtPmxhcmdlX2ZyYW1lcyA/IDB4NDAgOiAwKSB8Ci0JCQkoKHZwLT5mdWxsX2R1cGxleCAmJiB2cC0+Zmxvd19jdHJsICYmIHZwLT5wYXJ0bmVyX2Zsb3dfY3RybCkgPwotCQkJCQkweDEwMCA6IDApLAotCQkJaW9hZGRyICsgV24zX01BQ19DdHJsKTsKKwl3aW5kb3dfd3JpdGUxNih2cCwKKwkJICAgICAgICgodnAtPmluZm8xICYgMHg4MDAwKSB8fCB2cC0+ZnVsbF9kdXBsZXggPyAweDIwIDogMCkgfAorCQkgICAgICAgKHZwLT5sYXJnZV9mcmFtZXMgPyAweDQwIDogMCkgfAorCQkgICAgICAgKCh2cC0+ZnVsbF9kdXBsZXggJiYgdnAtPmZsb3dfY3RybCAmJiB2cC0+cGFydG5lcl9mbG93X2N0cmwpID8KKwkJCTB4MTAwIDogMCksCisJCSAgICAgICAzLCBXbjNfTUFDX0N0cmwpOwogfQogCiBzdGF0aWMgdm9pZCB2b3J0ZXhfY2hlY2tfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGluaXQpCkBAIC0xNTI5LDggKzE1NzEsNyBAQAogCX0KIAogCS8qIEJlZm9yZSBpbml0aWFsaXppbmcgc2VsZWN0IHRoZSBhY3RpdmUgbWVkaWEgcG9ydC4gKi8KLQlFTDNXSU5ET1coMyk7Ci0JY29uZmlnID0gaW9yZWFkMzIoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJY29uZmlnID0gd2luZG93X3JlYWQzMih2cCwgMywgV24zX0NvbmZpZyk7CiAKIAlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKIAkJcHJfaW5mbygiJXM6IE1lZGlhIG92ZXJyaWRlIHRvIHRyYW5zY2VpdmVyICVkICglcykuXG4iLApAQCAtMTU3NywxMCArMTYxOCw5IEBACiAJY29uZmlnID0gQkZJTlMoY29uZmlnLCBkZXYtPmlmX3BvcnQsIDIwLCA0KTsKIAlpZiAodm9ydGV4X2RlYnVnID4gNikKIAkJcHJfZGVidWcoInZvcnRleF91cCgpOiB3cml0aW5nIDB4JXggdG8gSW50ZXJuYWxDb25maWdcbiIsIGNvbmZpZyk7Ci0JaW93cml0ZTMyKGNvbmZpZywgaW9hZGRyICsgV24zX0NvbmZpZyk7CisJd2luZG93X3dyaXRlMzIodnAsIGNvbmZpZywgMywgV24zX0NvbmZpZyk7CiAKIAlpZiAoZGV2LT5pZl9wb3J0ID09IFhDVlJfTUlJIHx8IGRldi0+aWZfcG9ydCA9PSBYQ1ZSX05XQVkpIHsKLQkJRUwzV0lORE9XKDQpOwogCQltaWlfcmVnMSA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCBNSUlfQk1TUik7CiAJCW1paV9yZWc1ID0gbWRpb19yZWFkKGRldiwgdnAtPnBoeXNbMF0sIE1JSV9MUEEpOwogCQl2cC0+cGFydG5lcl9mbG93X2N0cmwgPSAoKG1paV9yZWc1ICYgMHgwNDAwKSAhPSAwKTsKQEAgLTE2MDEsNTEgKzE2NDEsNDYgQEAKIAlpb3dyaXRlMTYoU2V0U3RhdHVzRW5iIHwgMHgwMCwgaW9hZGRyICsgRUwzX0NNRCk7CiAKIAlpZiAodm9ydGV4X2RlYnVnID4gMSkgewotCQlFTDNXSU5ET1coNCk7CiAJCXByX2RlYnVnKCIlczogdm9ydGV4X3VwKCkgaXJxICVkIG1lZGlhIHN0YXR1cyAlNC40eC5cbiIsCi0JCQkgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBpb3JlYWQxNihpb2FkZHIgKyBXbjRfTWVkaWEpKTsKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIHdpbmRvd19yZWFkMTYodnAsIDQsIFduNF9NZWRpYSkpOwogCX0KIAogCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGFuZCBtYXNrIGluIHdpbmRvdyAyIGVhY2ggdGltZSBvcGVuZWQuICovCi0JRUwzV0lORE9XKDIpOwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCQl3aW5kb3dfd3JpdGU4KHZwLCBkZXYtPmRldl9hZGRyW2ldLCAyLCBpKTsKIAlmb3IgKDsgaSA8IDEyOyBpKz0yKQotCQlpb3dyaXRlMTYoMCwgaW9hZGRyICsgaSk7CisJCXdpbmRvd193cml0ZTE2KHZwLCAwLCAyLCBpKTsKIAogCWlmICh2cC0+Y2JfZm5fYmFzZSkgewotCQl1bnNpZ25lZCBzaG9ydCBuID0gaW9yZWFkMTYoaW9hZGRyICsgV24yX1Jlc2V0T3B0aW9ucykgJiB+MHg0MDEwOworCQl1bnNpZ25lZCBzaG9ydCBuID0gd2luZG93X3JlYWQxNih2cCwgMiwgV24yX1Jlc2V0T3B0aW9ucykgJiB+MHg0MDEwOwogCQlpZiAodnAtPmRydl9mbGFncyAmIElOVkVSVF9MRURfUFdSKQogCQkJbiB8PSAweDEwOwogCQlpZiAodnAtPmRydl9mbGFncyAmIElOVkVSVF9NSUlfUFdSKQogCQkJbiB8PSAweDQwMDA7Ci0JCWlvd3JpdGUxNihuLCBpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIG4sIDIsIFduMl9SZXNldE9wdGlvbnMpOwogCX0KIAogCWlmIChkZXYtPmlmX3BvcnQgPT0gWENWUl8xMGJhc2UyKQogCQkvKiBTdGFydCB0aGUgdGhpbm5ldCB0cmFuc2NlaXZlci4gV2Ugc2hvdWxkIHJlYWxseSB3YWl0IDUwbXMuLi4qLwogCQlpb3dyaXRlMTYoU3RhcnRDb2F4LCBpb2FkZHIgKyBFTDNfQ01EKTsKIAlpZiAoZGV2LT5pZl9wb3J0ICE9IFhDVlJfTldBWSkgewotCQlFTDNXSU5ET1coNCk7Ci0JCWlvd3JpdGUxNigoaW9yZWFkMTYoaW9hZGRyICsgV240X01lZGlhKSAmIH4oTWVkaWFfMTBUUHxNZWRpYV9TUUUpKSB8Ci0JCQkgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWVkaWFfYml0cywgaW9hZGRyICsgV240X01lZGlhKTsKKwkJd2luZG93X3dyaXRlMTYodnAsCisJCQkgICAgICAgKHdpbmRvd19yZWFkMTYodnAsIDQsIFduNF9NZWRpYSkgJgorCQkJCX4oTWVkaWFfMTBUUHxNZWRpYV9TUUUpKSB8CisJCQkgICAgICAgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWVkaWFfYml0cywKKwkJCSAgICAgICA0LCBXbjRfTWVkaWEpOwogCX0KIAogCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCiAJaW93cml0ZTE2KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7Ci0JRUwzV0lORE9XKDYpOwogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotCQlpb3JlYWQ4KGlvYWRkciArIGkpOwotCWlvcmVhZDE2KGlvYWRkciArIDEwKTsKLQlpb3JlYWQxNihpb2FkZHIgKyAxMik7CisJCXdpbmRvd19yZWFkOCh2cCwgNiwgaSk7CisJd2luZG93X3JlYWQxNih2cCwgNiwgMTApOworCXdpbmRvd19yZWFkMTYodnAsIDYsIDEyKTsKIAkvKiBOZXc6IE9uIHRoZSBWb3J0ZXggd2UgbXVzdCBhbHNvIGNsZWFyIHRoZSBCYWRTU0QgY291bnRlci4gKi8KLQlFTDNXSU5ET1coNCk7Ci0JaW9yZWFkOChpb2FkZHIgKyAxMik7CisJd2luZG93X3JlYWQ4KHZwLCA0LCAxMik7CiAJLyogLi5hbmQgb24gdGhlIEJvb21lcmFuZyB3ZSBlbmFibGUgdGhlIGV4dHJhIHN0YXRpc3RpY3MgYml0cy4gKi8KLQlpb3dyaXRlMTYoMHgwMDQwLCBpb2FkZHIgKyBXbjRfTmV0RGlhZyk7Ci0KLQkvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDcgZm9yIG5vcm1hbCB1c2UuICovCi0JRUwzV0lORE9XKDcpOworCXdpbmRvd193cml0ZTE2KHZwLCAweDAwNDAsIDQsIFduNF9OZXREaWFnKTsKIAogCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3J4KSB7IC8qIEJvb21lcmFuZyBidXMgbWFzdGVyLiAqLwogCQl2cC0+Y3VyX3J4ID0gdnAtPmRpcnR5X3J4ID0gMDsKQEAgLTE3NjMsNyArMTc5OCw3IEBACiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB2cC0+aW9hZGRyOwogCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKIAlpbnQgb2sgPSAwOwotCWludCBtZWRpYV9zdGF0dXMsIG9sZF93aW5kb3c7CisJaW50IG1lZGlhX3N0YXR1czsKIAogCWlmICh2b3J0ZXhfZGVidWcgPiAyKSB7CiAJCXByX2RlYnVnKCIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2sgaGFwcGVuZWQsICVzLlxuIiwKQEAgLTE3NzEsMTAgKzE4MDYsNyBAQAogCQlwcl9kZWJ1ZygiZGV2LT53YXRjaGRvZ190aW1lbz0lZFxuIiwgZGV2LT53YXRjaGRvZ190aW1lbyk7CiAJfQogCi0JZGlzYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7Ci0Jb2xkX3dpbmRvdyA9IGlvcmVhZDE2KGlvYWRkciArIEVMM19DTUQpID4+IDEzOwotCUVMM1dJTkRPVyg0KTsKLQltZWRpYV9zdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBXbjRfTWVkaWEpOworCW1lZGlhX3N0YXR1cyA9IHdpbmRvd19yZWFkMTYodnAsIDQsIFduNF9NZWRpYSk7CiAJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKIAljYXNlIFhDVlJfMTBiYXNlVDogIGNhc2UgWENWUl8xMDBiYXNlVHg6ICBjYXNlIFhDVlJfMTAwYmFzZUZ4OgogCQlpZiAobWVkaWFfc3RhdHVzICYgTWVkaWFfTG5rQmVhdCkgewpAQCAtMTc5NCwxMCArMTgyNiw3IEBACiAJY2FzZSBYQ1ZSX01JSTogY2FzZSBYQ1ZSX05XQVk6CiAJCXsKIAkJCW9rID0gMTsKLQkJCS8qIEludGVycnVwdHMgYXJlIGFscmVhZHkgZGlzYWJsZWQgKi8KLQkJCXNwaW5fbG9jaygmdnAtPmxvY2spOwogCQkJdm9ydGV4X2NoZWNrX21lZGlhKGRldiwgMCk7Ci0JCQlzcGluX3VubG9jaygmdnAtPmxvY2spOwogCQl9CiAJCWJyZWFrOwogCSAgZGVmYXVsdDoJCQkJCS8qIE90aGVyIG1lZGlhIHR5cGVzIGhhbmRsZWQgYnkgVHggdGltZW91dHMuICovCkBAIC0xODE2LDYgKzE4NDUsOCBAQAogCWlmICghb2spIHsKIAkJdW5zaWduZWQgaW50IGNvbmZpZzsKIAorCQlzcGluX2xvY2tfaXJxKCZ2cC0+bG9jayk7CisKIAkJZG8gewogCQkJZGV2LT5pZl9wb3J0ID0gbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmV4dDsKIAkJfSB3aGlsZSAoICEgKHZwLT5hdmFpbGFibGVfbWVkaWEgJiBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5tYXNrKSk7CkBAIC0xODMwLDE5ICsxODYxLDIyIEBACiAJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CiAJCQluZXh0X3RpY2sgPSBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS53YWl0OwogCQl9Ci0JCWlvd3JpdGUxNigobWVkaWFfc3RhdHVzICYgfihNZWRpYV8xMFRQfE1lZGlhX1NRRSkpIHwKLQkJCSBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5tZWRpYV9iaXRzLCBpb2FkZHIgKyBXbjRfTWVkaWEpOworCQl3aW5kb3dfd3JpdGUxNih2cCwKKwkJCSAgICAgICAobWVkaWFfc3RhdHVzICYgfihNZWRpYV8xMFRQfE1lZGlhX1NRRSkpIHwKKwkJCSAgICAgICBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5tZWRpYV9iaXRzLAorCQkJICAgICAgIDQsIFduNF9NZWRpYSk7CiAKLQkJRUwzV0lORE9XKDMpOwotCQljb25maWcgPSBpb3JlYWQzMihpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKwkJY29uZmlnID0gd2luZG93X3JlYWQzMih2cCwgMywgV24zX0NvbmZpZyk7CiAJCWNvbmZpZyA9IEJGSU5TKGNvbmZpZywgZGV2LT5pZl9wb3J0LCAyMCwgNCk7Ci0JCWlvd3JpdGUzMihjb25maWcsIGlvYWRkciArIFduM19Db25maWcpOworCQl3aW5kb3dfd3JpdGUzMih2cCwgY29uZmlnLCAzLCBXbjNfQ29uZmlnKTsKIAogCQlpb3dyaXRlMTYoZGV2LT5pZl9wb3J0ID09IFhDVlJfMTBiYXNlMiA/IFN0YXJ0Q29heCA6IFN0b3BDb2F4LAogCQkJIGlvYWRkciArIEVMM19DTUQpOwogCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKIAkJCXByX2RlYnVnKCJ3cm90ZSAweCUwOHggdG8gV24zX0NvbmZpZ1xuIiwgY29uZmlnKTsKIAkJLyogQUtQTTogRklYTUU6IFNob3VsZCByZXNldCBSeCAmIFR4IGhlcmUuICBQNjAgb2YgM2M5MHhjLnBkZiAqLworCisJCXNwaW5fdW5sb2NrX2lycSgmdnAtPmxvY2spOwogCX0KIAogbGVhdmVfbWVkaWFfYWxvbmU6CkBAIC0xODUwLDggKzE4ODQsNiBAQAogCSAgcHJfZGVidWcoIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgZmluaXNoZWQsICVzLlxuIiwKIAkJCSBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOwogCi0JRUwzV0lORE9XKG9sZF93aW5kb3cpOwotCWVuYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7CiAJbW9kX3RpbWVyKCZ2cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKIAlpZiAodnAtPmRlZmVycmVkKQogCQlpb3dyaXRlMTYoRmFrZUludHIsIGlvYWRkciArIEVMM19DTUQpOwpAQCAtMTg2NSwxMiArMTg5NywxMSBAQAogCXByX2VycigiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eC5cbiIsCiAJCSAgIGRldi0+bmFtZSwgaW9yZWFkOChpb2FkZHIgKyBUeFN0YXR1cyksCiAJCSAgIGlvcmVhZDE2KGlvYWRkciArIEVMM19TVEFUVVMpKTsKLQlFTDNXSU5ET1coNCk7CiAJcHJfZXJyKCIgIGRpYWdub3N0aWNzOiBuZXQgJTA0eCBtZWRpYSAlMDR4IGRtYSAlMDh4IGZpZm8gJTA0eFxuIiwKLQkJCWlvcmVhZDE2KGlvYWRkciArIFduNF9OZXREaWFnKSwKLQkJCWlvcmVhZDE2KGlvYWRkciArIFduNF9NZWRpYSksCisJCQl3aW5kb3dfcmVhZDE2KHZwLCA0LCBXbjRfTmV0RGlhZyksCisJCQl3aW5kb3dfcmVhZDE2KHZwLCA0LCBXbjRfTWVkaWEpLAogCQkJaW9yZWFkMzIoaW9hZGRyICsgUGt0U3RhdHVzKSwKLQkJCWlvcmVhZDE2KGlvYWRkciArIFduNF9GSUZPRGlhZykpOworCQkJd2luZG93X3JlYWQxNih2cCwgNCwgV240X0ZJRk9EaWFnKSk7CiAJLyogU2xpZ2h0IGNvZGUgYmxvYXQgdG8gYmUgdXNlciBmcmllbmRseS4gKi8KIAlpZiAoKGlvcmVhZDgoaW9hZGRyICsgVHhTdGF0dXMpICYgMHg4OCkgPT0gMHg4OCkKIAkJcHJfZXJyKCIlczogVHJhbnNtaXR0ZXIgZW5jb3VudGVyZWQgMTYgY29sbGlzaW9ucyAtLSIKQEAgLTE5MTcsOSArMTk0OCw2IEBACiAJLyogSXNzdWUgVHggRW5hYmxlICovCiAJaW93cml0ZTE2KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsgLyogcHJldmVudCB0eCB0aW1lb3V0ICovCi0KLQkvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDcgZm9yIG5vcm1hbCB1c2UuICovCi0JRUwzV0lORE9XKDcpOwogfQogCiAvKgpAQCAtMTk4MCwxMCArMjAwOCwxMCBAQAogCQkJaW9yZWFkMTYoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBTdGF0c0Z1bGwpIHsKIAkJCXByX3dhcm5pbmcoIiVzOiBVcGRhdGluZyBzdGF0aXN0aWNzIGZhaWxlZCwgZGlzYWJsaW5nICIKIAkJCQkgICAic3RhdHMgYXMgYW4gaW50ZXJydXB0IHNvdXJjZS5cbiIsIGRldi0+bmFtZSk7Ci0JCQlFTDNXSU5ET1coNSk7Ci0JCQlpb3dyaXRlMTYoU2V0SW50ckVuYiB8IChpb3JlYWQxNihpb2FkZHIgKyAxMCkgJiB+U3RhdHNGdWxsKSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlpb3dyaXRlMTYoU2V0SW50ckVuYiB8CisJCQkJICAod2luZG93X3JlYWQxNih2cCwgNSwgMTApICYgflN0YXRzRnVsbCksCisJCQkJICBpb2FkZHIgKyBFTDNfQ01EKTsKIAkJCXZwLT5pbnRyX2VuYWJsZSAmPSB+U3RhdHNGdWxsOwotCQkJRUwzV0lORE9XKDcpOwogCQkJRG9uZURpZFRoYXQrKzsKIAkJfQogCX0KQEAgLTE5OTMsOCArMjAyMSw3IEBACiAJfQogCWlmIChzdGF0dXMgJiBIb3N0RXJyb3IpIHsKIAkJdTE2IGZpZm9fZGlhZzsKLQkJRUwzV0lORE9XKDQpOwotCQlmaWZvX2RpYWcgPSBpb3JlYWQxNihpb2FkZHIgKyBXbjRfRklGT0RpYWcpOworCQlmaWZvX2RpYWcgPSB3aW5kb3dfcmVhZDE2KHZwLCA0LCBXbjRfRklGT0RpYWcpOwogCQlwcl9lcnIoIiVzOiBIb3N0IGVycm9yLCBGSUZPIGRpYWdub3N0aWMgcmVnaXN0ZXIgJTQuNHguXG4iLAogCQkJICAgZGV2LT5uYW1lLCBmaWZvX2RpYWcpOwogCQkvKiBBZGFwdGVyIGZhaWx1cmUgcmVxdWlyZXMgVHgvUnggcmVzZXQgYW5kIHJlaW5pdC4gKi8KQEAgLTIwNDMsOSArMjA3MCwxMyBAQAogCWlmICh2cC0+YnVzX21hc3RlcikgewogCQkvKiBTZXQgdGhlIGJ1cy1tYXN0ZXIgY29udHJvbGxlciB0byB0cmFuc2ZlciB0aGUgcGFja2V0LiAqLwogCQlpbnQgbGVuID0gKHNrYi0+bGVuICsgMykgJiB+MzsKLQkJaW93cml0ZTMyKHZwLT50eF9za2JfZG1hID0gcGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSwKLQkJCQlpb2FkZHIgKyBXbjdfTWFzdGVyQWRkcik7CisJCXZwLT50eF9za2JfZG1hID0gcGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwgbGVuLAorCQkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCXNwaW5fbG9ja19pcnEoJnZwLT53aW5kb3dfbG9jayk7CisJCXdpbmRvd19zZXQodnAsIDcpOworCQlpb3dyaXRlMzIodnAtPnR4X3NrYl9kbWEsIGlvYWRkciArIFduN19NYXN0ZXJBZGRyKTsKIAkJaW93cml0ZTE2KGxlbiwgaW9hZGRyICsgV243X01hc3Rlckxlbik7CisJCXNwaW5fdW5sb2NrX2lycSgmdnAtPndpbmRvd19sb2NrKTsKIAkJdnAtPnR4X3NrYiA9IHNrYjsKIAkJaW93cml0ZTE2KFN0YXJ0RE1BRG93biwgaW9hZGRyICsgRUwzX0NNRCk7CiAJCS8qIG5ldGlmX3dha2VfcXVldWUoKSB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgRE1BRG9uZSBpbnRlcnJ1cHQuICovCkBAIC0yMjE3LDYgKzIyNDgsOSBAQAogCQlwcl9kZWJ1ZygiJXM6IGludGVycnVwdCwgc3RhdHVzICU0LjR4LCBsYXRlbmN5ICVkIHRpY2tzLlxuIiwKIAkJCSAgIGRldi0+bmFtZSwgc3RhdHVzLCBpb3JlYWQ4KGlvYWRkciArIFRpbWVyKSk7CiAKKwlzcGluX2xvY2soJnZwLT53aW5kb3dfbG9jayk7CisJd2luZG93X3NldCh2cCwgNyk7CisKIAlkbyB7CiAJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQogCQkJCXByX2RlYnVnKCIlczogSW4gaW50ZXJydXB0IGxvb3AsIHN0YXR1cyAlNC40eC5cbiIsCkBAIC0yMjc1LDYgKzIzMDksOCBAQAogCQlpb3dyaXRlMTYoQWNrSW50ciB8IEludFJlcSB8IEludExhdGNoLCBpb2FkZHIgKyBFTDNfQ01EKTsKIAl9IHdoaWxlICgoc3RhdHVzID0gaW9yZWFkMTYoaW9hZGRyICsgRUwzX1NUQVRVUykpICYgKEludExhdGNoIHwgUnhDb21wbGV0ZSkpOwogCisJc3Bpbl91bmxvY2soJnZwLT53aW5kb3dfbG9jayk7CisKIAlpZiAodm9ydGV4X2RlYnVnID4gNCkKIAkJcHJfZGVidWcoIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKIAkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKQEAgLTI3NjAsODUgKzI3OTYsNTggQEAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyh2b2lkIF9faW9tZW0gKmlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgb2xkX3dpbmRvdyA9IGlvcmVhZDE2KGlvYWRkciArIEVMM19DTUQpOwogCi0JaWYgKG9sZF93aW5kb3cgPT0gMHhmZmZmKQkvKiBDaGlwIHN1c3BlbmRlZCBvciBlamVjdGVkLiAqLwotCQlyZXR1cm47CiAJLyogVW5saWtlIHRoZSAzYzV4OSB3ZSBuZWVkIG5vdCB0dXJuIG9mZiBzdGF0cyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCiAJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCi0JRUwzV0lORE9XKDYpOwotCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMJCSs9IGlvcmVhZDgoaW9hZGRyICsgMCk7Ci0JZGV2LT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCQkrPSBpb3JlYWQ4KGlvYWRkciArIDEpOwotCWRldi0+c3RhdHMudHhfd2luZG93X2Vycm9ycwkJKz0gaW9yZWFkOChpb2FkZHIgKyA0KTsKLQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzCQkrPSBpb3JlYWQ4KGlvYWRkciArIDUpOwotCWRldi0+c3RhdHMudHhfcGFja2V0cwkJCSs9IGlvcmVhZDgoaW9hZGRyICsgNik7Ci0JZGV2LT5zdGF0cy50eF9wYWNrZXRzCQkJKz0gKGlvcmVhZDgoaW9hZGRyICsgOSkmMHgzMCkgPDwgNDsKLQkvKiBSeCBwYWNrZXRzCSovCQkJaW9yZWFkOChpb2FkZHIgKyA3KTsgICAvKiBNdXN0IHJlYWQgdG8gY2xlYXIgKi8KKwlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzCQkrPSB3aW5kb3dfcmVhZDgodnAsIDYsIDApOworCWRldi0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycwkJKz0gd2luZG93X3JlYWQ4KHZwLCA2LCAxKTsKKwlkZXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMJCSs9IHdpbmRvd19yZWFkOCh2cCwgNiwgNCk7CisJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycwkJKz0gd2luZG93X3JlYWQ4KHZwLCA2LCA1KTsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMJCQkrPSB3aW5kb3dfcmVhZDgodnAsIDYsIDYpOworCWRldi0+c3RhdHMudHhfcGFja2V0cwkJCSs9ICh3aW5kb3dfcmVhZDgodnAsIDYsIDkpICYKKwkJCQkJCSAgICAweDMwKSA8PCA0OworCS8qIFJ4IHBhY2tldHMJKi8JCQl3aW5kb3dfcmVhZDgodnAsIDYsIDcpOyAgIC8qIE11c3QgcmVhZCB0byBjbGVhciAqLwogCS8qIERvbid0IGJvdGhlciB3aXRoIHJlZ2lzdGVyIDksIGFuIGV4dGVuc2lvbiBvZiByZWdpc3RlcnMgNiY3LgogCSAgIElmIHdlIGRvIHVzZSB0aGUgNiY3IHZhbHVlcyB0aGUgYXRvbWljIHVwZGF0ZSBhc3N1bXB0aW9uIGFib3ZlCiAJICAgaXMgaW52YWxpZC4gKi8KLQlkZXYtPnN0YXRzLnJ4X2J5dGVzIAkJCSs9IGlvcmVhZDE2KGlvYWRkciArIDEwKTsKLQlkZXYtPnN0YXRzLnR4X2J5dGVzIAkJCSs9IGlvcmVhZDE2KGlvYWRkciArIDEyKTsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzIAkJCSs9IHdpbmRvd19yZWFkMTYodnAsIDYsIDEwKTsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzIAkJCSs9IHdpbmRvd19yZWFkMTYodnAsIDYsIDEyKTsKIAkvKiBFeHRyYSBzdGF0cyBmb3IgZ2V0X2V0aHRvb2xfc3RhdHMoKSAqLwotCXZwLT54c3RhdHMudHhfbXVsdGlwbGVfY29sbGlzaW9ucwkrPSBpb3JlYWQ4KGlvYWRkciArIDIpOwotCXZwLT54c3RhdHMudHhfc2luZ2xlX2NvbGxpc2lvbnMgICAgICAgICArPSBpb3JlYWQ4KGlvYWRkciArIDMpOwotCXZwLT54c3RhdHMudHhfZGVmZXJyZWQJCQkrPSBpb3JlYWQ4KGlvYWRkciArIDgpOwotCUVMM1dJTkRPVyg0KTsKLQl2cC0+eHN0YXRzLnJ4X2JhZF9zc2QJCQkrPSBpb3JlYWQ4KGlvYWRkciArIDEyKTsKKwl2cC0+eHN0YXRzLnR4X211bHRpcGxlX2NvbGxpc2lvbnMJKz0gd2luZG93X3JlYWQ4KHZwLCA2LCAyKTsKKwl2cC0+eHN0YXRzLnR4X3NpbmdsZV9jb2xsaXNpb25zICAgICAgICAgKz0gd2luZG93X3JlYWQ4KHZwLCA2LCAzKTsKKwl2cC0+eHN0YXRzLnR4X2RlZmVycmVkCQkJKz0gd2luZG93X3JlYWQ4KHZwLCA2LCA4KTsKKwl2cC0+eHN0YXRzLnJ4X2JhZF9zc2QJCQkrPSB3aW5kb3dfcmVhZDgodnAsIDQsIDEyKTsKIAogCWRldi0+c3RhdHMuY29sbGlzaW9ucyA9IHZwLT54c3RhdHMudHhfbXVsdGlwbGVfY29sbGlzaW9ucwogCQkrIHZwLT54c3RhdHMudHhfc2luZ2xlX2NvbGxpc2lvbnMKIAkJKyB2cC0+eHN0YXRzLnR4X21heF9jb2xsaXNpb25zOwogCiAJewotCQl1OCB1cCA9IGlvcmVhZDgoaW9hZGRyICsgMTMpOworCQl1OCB1cCA9IHdpbmRvd19yZWFkOCh2cCwgNCwgMTMpOwogCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9ICh1cCAmIDB4MGYpIDw8IDE2OwogCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9ICh1cCAmIDB4ZjApIDw8IDEyOwogCX0KLQotCUVMM1dJTkRPVyhvbGRfd2luZG93ID4+IDEzKTsKIH0KIAogc3RhdGljIGludCB2b3J0ZXhfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdnAtPmlvYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOwotCUVMM1dJTkRPVyg0KTsKLQlyYyA9IG1paV9ud2F5X3Jlc3RhcnQoJnZwLT5taWkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZ2cC0+bWlpKTsKIH0KIAogc3RhdGljIGludCB2b3J0ZXhfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdnAtPmlvYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOwotCUVMM1dJTkRPVyg0KTsKLQlyYyA9IG1paV9ldGh0b29sX2dzZXQoJnZwLT5taWksIGNtZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJnZwLT5taWksIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgdm9ydGV4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHZwLT5pb2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKLQlFTDNXSU5ET1coNCk7Ci0JcmMgPSBtaWlfZXRodG9vbF9zc2V0KCZ2cC0+bWlpLCBjbWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBtaWlfZXRodG9vbF9zc2V0KCZ2cC0+bWlpLCBjbWQpOwogfQogCiBzdGF0aWMgdTMyIHZvcnRleF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI5MDksNiArMjkxOCwzNiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgdm9ydGV4X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmdnAtPmxvY2spOworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9NQUdJQzsKKworCXdvbC0+d29sb3B0cyA9IDA7CisJaWYgKHZwLT5lbmFibGVfd29sKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKwlzcGluX3VubG9ja19pcnEoJnZwLT5sb2NrKTsKK30KKworc3RhdGljIGludCB2b3J0ZXhfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKHdvbC0+d29sb3B0cyAmIH5XQUtFX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJnZwLT5sb2NrKTsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJdnAtPmVuYWJsZV93b2wgPSAxOworCWVsc2UKKwkJdnAtPmVuYWJsZV93b2wgPSAwOworCWFjcGlfc2V0X1dPTChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmdnAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdm9ydGV4X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSB2b3J0ZXhfZ2V0X2RydmluZm8sCiAJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSB2b3J0ZXhfZ2V0X3N0cmluZ3MsCkBAIC0yOTIwLDYgKzI5NTksOCBAQAogCS5zZXRfc2V0dGluZ3MgICAgICAgICAgID0gdm9ydGV4X3NldF9zZXR0aW5ncywKIAkuZ2V0X2xpbmsgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLm53YXlfcmVzZXQgICAgICAgICAgICAgPSB2b3J0ZXhfbndheV9yZXNldCwKKwkuZ2V0X3dvbCAgICAgICAgICAgICAgICA9IHZvcnRleF9nZXRfd29sLAorCS5zZXRfd29sICAgICAgICAgICAgICAgID0gdm9ydGV4X3NldF93b2wsCiB9OwogCiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtMjkzMCw3ICsyOTcxLDYgQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdnAtPmlvYWRkcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXBjaV9wb3dlcl90IHN0YXRlID0gMDsKIApAQCAtMjk0Miw3ICsyOTgyLDYgQEAKIAlpZihzdGF0ZSAhPSAwKQogCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKFZPUlRFWF9QQ0kodnApLCBQQ0lfRDApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOwotCUVMM1dJTkRPVyg0KTsKIAllcnIgPSBnZW5lcmljX21paV9pb2N0bCgmdnAtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOwogCWlmKHN0YXRlICE9IDApCkBAIC0yOTg1LDggKzMwMjQsNiBAQAogc3RhdGljIHZvaWQgc2V0XzgwMjFxX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHZwLT5pb2FkZHI7Ci0JaW50IG9sZF93aW5kb3cgPSBpb3JlYWQxNihpb2FkZHIgKyBFTDNfQ01EKTsKIAlpbnQgbWFjX2N0cmw7CiAKIAlpZiAoKHZwLT5kcnZfZmxhZ3MmSVNfQ1lDTE9ORSkgfHwgKHZwLT5kcnZfZmxhZ3MmSVNfVE9STkFETykpIHsKQEAgLTI5OTcsMjggKzMwMzQsMjMgQEAKIAkJaWYgKGVuYWJsZSkKIAkJCW1heF9wa3Rfc2l6ZSArPSA0OwkvKiA4MDIuMVEgVkxBTiB0YWcgKi8KIAotCQlFTDNXSU5ET1coMyk7Ci0JCWlvd3JpdGUxNihtYXhfcGt0X3NpemUsIGlvYWRkcitXbjNfTWF4UGt0U2l6ZSk7CisJCXdpbmRvd193cml0ZTE2KHZwLCBtYXhfcGt0X3NpemUsIDMsIFduM19NYXhQa3RTaXplKTsKIAogCQkvKiBzZXQgVmxhbkV0aGVyVHlwZSB0byBsZXQgdGhlIGhhcmR3YXJlIGNoZWNrc3VtbWluZwogCQkgICB0cmVhdCB0YWdnZWQgZnJhbWVzIGNvcnJlY3RseSAqLwotCQlFTDNXSU5ET1coNyk7Ci0JCWlvd3JpdGUxNihWTEFOX0VUSEVSX1RZUEUsIGlvYWRkcitXbjdfVmxhbkV0aGVyVHlwZSk7CisJCXdpbmRvd193cml0ZTE2KHZwLCBWTEFOX0VUSEVSX1RZUEUsIDcsIFduN19WbGFuRXRoZXJUeXBlKTsKIAl9IGVsc2UgewogCQkvKiBvbiBvbGRlciBjYXJkcyB3ZSBoYXZlIHRvIGVuYWJsZSBsYXJnZSBmcmFtZXMgKi8KIAogCQl2cC0+bGFyZ2VfZnJhbWVzID0gZGV2LT5tdHUgPiAxNTAwIHx8IGVuYWJsZTsKIAotCQlFTDNXSU5ET1coMyk7Ci0JCW1hY19jdHJsID0gaW9yZWFkMTYoaW9hZGRyK1duM19NQUNfQ3RybCk7CisJCW1hY19jdHJsID0gd2luZG93X3JlYWQxNih2cCwgMywgV24zX01BQ19DdHJsKTsKIAkJaWYgKHZwLT5sYXJnZV9mcmFtZXMpCiAJCQltYWNfY3RybCB8PSAweDQwOwogCQllbHNlCiAJCQltYWNfY3RybCAmPSB+MHg0MDsKLQkJaW93cml0ZTE2KG1hY19jdHJsLCBpb2FkZHIrV24zX01BQ19DdHJsKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIG1hY19jdHJsLCAzLCBXbjNfTUFDX0N0cmwpOwogCX0KLQotCUVMM1dJTkRPVyhvbGRfd2luZG93KTsKIH0KICNlbHNlCiAKQEAgLTMwMzcsNyArMzA2OSwxMCBAQAogLyogVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQogICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCiAgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMuICovCi0jZGVmaW5lIG1kaW9fZGVsYXkoKSBpb3JlYWQzMihtZGlvX2FkZHIpCitzdGF0aWMgdm9pZCBtZGlvX2RlbGF5KHN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnApCit7CisJd2luZG93X3JlYWQzMih2cCwgNCwgV240X1BoeXNpY2FsTWdtdCk7Cit9CiAKICNkZWZpbmUgTURJT19TSElGVF9DTEsJMHgwMQogI2RlZmluZSBNRElPX0RJUl9XUklURQkweDA0CkBAIC0zMDQ4LDE2ICszMDgzLDE1IEBACiAKIC8qIEdlbmVyYXRlIHRoZSBwcmVhbWJsZSByZXF1aXJlZCBmb3IgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gYW5kCiAgICBhIGZldyBvbGRlciB0cmFuc2NlaXZlcnMuICovCi1zdGF0aWMgdm9pZCBtZGlvX3N5bmModm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBiaXRzKQorc3RhdGljIHZvaWQgbWRpb19zeW5jKHN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAsIGludCBiaXRzKQogewotCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gaW9hZGRyICsgV240X1BoeXNpY2FsTWdtdDsKLQogCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KIAl3aGlsZSAoLS0gYml0cyA+PSAwKSB7Ci0JCWlvd3JpdGUxNihNRElPX0RBVEFfV1JJVEUxLCBtZGlvX2FkZHIpOwotCQltZGlvX2RlbGF5KCk7Ci0JCWlvd3JpdGUxNihNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7Ci0JCW1kaW9fZGVsYXkoKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIE1ESU9fREFUQV9XUklURTEsIDQsIFduNF9QaHlzaWNhbE1nbXQpOworCQltZGlvX2RlbGF5KHZwKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywKKwkJCSAgICAgICA0LCBXbjRfUGh5c2ljYWxNZ210KTsKKwkJbWRpb19kZWxheSh2cCk7CiAJfQogfQogCkBAIC0zMDY1LDU5ICszMDk5LDcwIEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7Ci0Jdm9pZCBfX2lvbWVtICppb2FkZHIgPSB2cC0+aW9hZGRyOwogCWludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKIAl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKLQl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwlzcGluX2xvY2tfYmgoJnZwLT5taWlfbG9jayk7CiAKIAlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQotCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisJCW1kaW9fc3luYyh2cCwgMzIpOwogCiAJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KIAlmb3IgKGkgPSAxNDsgaSA+PSAwOyBpLS0pIHsKIAkJaW50IGRhdGF2YWwgPSAocmVhZF9jbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOwotCQlpb3dyaXRlMTYoZGF0YXZhbCwgbWRpb19hZGRyKTsKLQkJbWRpb19kZWxheSgpOwotCQlpb3dyaXRlMTYoZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOwotCQltZGlvX2RlbGF5KCk7CisJCXdpbmRvd193cml0ZTE2KHZwLCBkYXRhdmFsLCA0LCBXbjRfUGh5c2ljYWxNZ210KTsKKwkJbWRpb19kZWxheSh2cCk7CisJCXdpbmRvd193cml0ZTE2KHZwLCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssCisJCQkgICAgICAgNCwgV240X1BoeXNpY2FsTWdtdCk7CisJCW1kaW9fZGVsYXkodnApOwogCX0KIAkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLwogCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7Ci0JCWlvd3JpdGUxNihNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKLQkJbWRpb19kZWxheSgpOwotCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQxNihtZGlvX2FkZHIpICYgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOwotCQlpb3dyaXRlMTYoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKLQkJbWRpb19kZWxheSgpOworCQl3aW5kb3dfd3JpdGUxNih2cCwgTURJT19FTkJfSU4sIDQsIFduNF9QaHlzaWNhbE1nbXQpOworCQltZGlvX2RlbGF5KHZwKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8CisJCQkoKHdpbmRvd19yZWFkMTYodnAsIDQsIFduNF9QaHlzaWNhbE1nbXQpICYKKwkJCSAgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOworCQl3aW5kb3dfd3JpdGUxNih2cCwgTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywKKwkJCSAgICAgICA0LCBXbjRfUGh5c2ljYWxNZ210KTsKKwkJbWRpb19kZWxheSh2cCk7CiAJfQorCisJc3Bpbl91bmxvY2tfYmgoJnZwLT5taWlfbG9jayk7CisKIAlyZXR1cm4gcmV0dmFsICYgMHgyMDAwMCA/IDB4ZmZmZiA6IHJldHZhbD4+MSAmIDB4ZmZmZjsKIH0KIAogc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHZwLT5pb2FkZHI7CiAJaW50IHdyaXRlX2NtZCA9IDB4NTAwMjAwMDAgfCAocGh5X2lkIDw8IDIzKSB8IChsb2NhdGlvbiA8PCAxOCkgfCB2YWx1ZTsKLQl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CiAJaW50IGk7CiAKKwlzcGluX2xvY2tfYmgoJnZwLT5taWlfbG9jayk7CisKIAlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQotCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisJCW1kaW9fc3luYyh2cCwgMzIpOwogCiAJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCiAJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CiAJCWludCBkYXRhdmFsID0gKHdyaXRlX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7Ci0JCWlvd3JpdGUxNihkYXRhdmFsLCBtZGlvX2FkZHIpOwotCQltZGlvX2RlbGF5KCk7Ci0JCWlvd3JpdGUxNihkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7Ci0JCW1kaW9fZGVsYXkoKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIGRhdGF2YWwsIDQsIFduNF9QaHlzaWNhbE1nbXQpOworCQltZGlvX2RlbGF5KHZwKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywKKwkJCSAgICAgICA0LCBXbjRfUGh5c2ljYWxNZ210KTsKKwkJbWRpb19kZWxheSh2cCk7CiAJfQogCS8qIExlYXZlIHRoZSBpbnRlcmZhY2UgaWRsZS4gKi8KIAlmb3IgKGkgPSAxOyBpID49IDA7IGktLSkgewotCQlpb3dyaXRlMTYoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7Ci0JCW1kaW9fZGVsYXkoKTsKLQkJaW93cml0ZTE2KE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7Ci0JCW1kaW9fZGVsYXkoKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIE1ESU9fRU5CX0lOLCA0LCBXbjRfUGh5c2ljYWxNZ210KTsKKwkJbWRpb19kZWxheSh2cCk7CisJCXdpbmRvd193cml0ZTE2KHZwLCBNRElPX0VOQl9JTiB8IE1ESU9fU0hJRlRfQ0xLLAorCQkJICAgICAgIDQsIFduNF9QaHlzaWNhbE1nbXQpOworCQltZGlvX2RlbGF5KHZwKTsKIAl9CisKKwlzcGluX3VubG9ja19iaCgmdnAtPm1paV9sb2NrKTsKIH0KIAogLyogQUNQSTogQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlLiAqLwpAQCAtMzEzMSw4ICszMTc2LDcgQEAKIAogCWlmICh2cC0+ZW5hYmxlX3dvbCkgewogCQkvKiBQb3dlciB1cCBvbjogMT09RG93bmxvYWRlZCBGaWx0ZXIsIDI9PU1hZ2ljIFBhY2tldHMsIDQ9PUxpbmsgU3RhdHVzLiAqLwotCQlFTDNXSU5ET1coNyk7Ci0JCWlvd3JpdGUxNigyLCBpb2FkZHIgKyAweDBjKTsKKwkJd2luZG93X3dyaXRlMTYodnAsIDIsIDcsIDB4MGMpOwogCQkvKiBUaGUgUnhGaWx0ZXIgbXVzdCBhY2NlcHQgdGhlIFdPTCBmcmFtZXMuICovCiAJCWlvd3JpdGUxNihTZXRSeEZpbHRlcnxSeFN0YXRpb258UnhNdWx0aWNhc3R8UnhCcm9hZGNhc3QsIGlvYWRkciArIEVMM19DTUQpOwogCQlpb3dyaXRlMTYoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOWNwLmMgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwppbmRleCAyODRhNWY0Li40YTRmNmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJX19sZTMyCQkJcnhfb2tfbWNhc3Q7CiAJX19sZTE2CQkJdHhfYWJvcnQ7CiAJX19sZTE2CQkJdHhfdW5kZXJydW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNwX2V4dHJhX3N0YXRzIHsKIAl1bnNpZ25lZCBsb25nCQlyeF9mcmFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwppbmRleCA5N2Q4MDY4Li5mNTE2NmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5dG9vLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCkBAIC02NjIsNyArNjYyLDcgQEAKIC8qIHJlYWQgTU1JTyByZWdpc3RlciAqLwogI2RlZmluZSBSVExfUjgocmVnKQkJaW9yZWFkOCAoaW9hZGRyICsgKHJlZykpCiAjZGVmaW5lIFJUTF9SMTYocmVnKQkJaW9yZWFkMTYgKGlvYWRkciArIChyZWcpKQotI2RlZmluZSBSVExfUjMyKHJlZykJCSgodW5zaWduZWQgbG9uZykgaW9yZWFkMzIgKGlvYWRkciArIChyZWcpKSkKKyNkZWZpbmUgUlRMX1IzMihyZWcpCQlpb3JlYWQzMiAoaW9hZGRyICsgKHJlZykpCiAKIAogc3RhdGljIGNvbnN0IHUxNiBydGw4MTM5X2ludHJfbWFzayA9CkBAIC04NjIsNyArODYyLDcgQEAKIAkvKiBpZiB1bmtub3duIGNoaXAsIGFzc3VtZSBhcnJheSBlbGVtZW50ICMwLCBvcmlnaW5hbCBSVEwtODEzOSBpbiB0aGlzIGNhc2UgKi8KIAlpID0gMDsKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJ1bmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgUlRMLTgxMzlcbiIpOwotCWRldl9kYmcoJnBkZXYtPmRldiwgIlR4Q29uZmlnID0gMHglbHhcbiIsIFJUTF9SMzIgKFR4Q29uZmlnKSk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiVHhDb25maWcgPSAweCV4XG4iLCBSVExfUjMyIChUeENvbmZpZykpOwogCXRwLT5jaGlwc2V0ID0gMDsKIAogbWF0Y2g6CkBAIC0xNjQzLDcgKzE2NDMsNyBAQAogCW5ldGRldl9kYmcoZGV2LCAiVHggcXVldWUgc3RhcnQgZW50cnkgJWxkICBkaXJ0eSBlbnRyeSAlbGRcbiIsCiAJCSAgIHRwLT5jdXJfdHgsIHRwLT5kaXJ0eV90eCk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspCi0JCW5ldGRldl9kYmcoZGV2LCAiVHggZGVzY3JpcHRvciAlZCBpcyAlMDhseCVzXG4iLAorCQluZXRkZXZfZGJnKGRldiwgIlR4IGRlc2NyaXB0b3IgJWQgaXMgJTA4eCVzXG4iLAogCQkJICAgaSwgUlRMX1IzMihUeFN0YXR1czAgKyAoaSAqIDQpKSwKIAkJCSAgIGkgPT0gdHAtPmRpcnR5X3R4ICUgTlVNX1RYX0RFU0MgPwogCQkJICAgIiAocXVldWUgaGVhZCkiIDogIiIpOwpAQCAtMjQ4Nyw3ICsyNDg3LDcgQEAKIAlpbnQgcnhfbW9kZTsKIAl1MzIgdG1wOwogCi0JbmV0ZGV2X2RiZyhkZXYsICJydGw4MTM5X3NldF9yeF9tb2RlKCUwNHgpIGRvbmUgLS0gUnggY29uZmlnICUwOGx4XG4iLAorCW5ldGRldl9kYmcoZGV2LCAicnRsODEzOV9zZXRfcnhfbW9kZSglMDR4KSBkb25lIC0tIFJ4IGNvbmZpZyAlMDh4XG4iLAogCQkgICBkZXYtPmZsYWdzLCBSVExfUjMyKFJ4Q29uZmlnKSk7CiAKIAkvKiBOb3RlOiBkbyBub3QgcmVvcmRlciwgR0NDIGlzIGNsZXZlciBhYm91dCBjb21tb24gc3RhdGVtZW50cy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgyNTk2LmMgYi9kcml2ZXJzL25ldC84MjU5Ni5jCmluZGV4IGRkOGRjMTUuLmUyYzljNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvODI1OTYuYwpAQCAtNTI1LDcgKzUyNSwyMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpNTk2X3JiZCAqcmJkOworCWludCBpOworCisJZm9yIChpID0gMCwgcmJkID0gbHAtPnJiZHM7IGkgPCByeF9yaW5nX3NpemU7IGkrKywgcmJkKyspIHsKKwkJaWYgKHJiZC0+c2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJZGV2X2tmcmVlX3NrYihyYmQtPnNrYik7CisJCXJiZC0+c2tiID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5tbF9wcml2OwogCWludCBpOwpAQCAtNTM3LDggKzU1MSwxMSBAQAogCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOwogCi0JCWlmIChza2IgPT0gTlVMTCkKLQkJCXBhbmljKCI4MjU5NjogYWxsb2Nfc2tiKCkgZmFpbGVkIik7CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKIAkJc2tiLT5kZXYgPSBkZXY7CiAJCXJiZC0+dl9uZXh0ID0gcmJkKzE7CiAJCXJiZC0+Yl9uZXh0ID0gV1NXQVByYmQodmlydF90b19idXMocmJkKzEpKTsKQEAgLTU3NCwxOSArNTkxLDggQEAKIAlyZmQtPnZfbmV4dCA9IGxwLT5yZmRzOwogCXJmZC0+Yl9uZXh0ID0gV1NXQVByZmQodmlydF90b19idXMobHAtPnJmZHMpKTsKIAlyZmQtPmNtZCA9IENNRF9FT0x8Q01EX0ZMRVg7Ci19CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpNTk2X3JiZCAqcmJkOwotCWludCBpOwotCi0JZm9yIChpID0gMCwgcmJkID0gbHAtPnJiZHM7IGkgPCByeF9yaW5nX3NpemU7IGkrKywgcmJkKyspIHsKLQkJaWYgKHJiZC0+c2tiID09IE5VTEwpCi0JCQlicmVhazsKLQkJZGV2X2tmcmVlX3NrYihyYmQtPnNrYik7Ci0JfQorCXJldHVybiAwOwogfQogCiAKQEAgLTEwMDksMjAgKzEwMTUsMzUgQEAKIAl9CiAjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCiAJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgewotCQlpZiAocmVxdWVzdF9pcnEoMHg1NiwgaTU5Nl9lcnJvciwgMCwgImk4MjU5Nl9lcnJvciIsIGRldikpCi0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJaWYgKHJlcXVlc3RfaXJxKDB4NTYsIGk1OTZfZXJyb3IsIDAsICJpODI1OTZfZXJyb3IiLCBkZXYpKSB7CisJCQlyZXMgPSAtRUFHQUlOOworCQkJZ290byBlcnJfaXJxX2RldjsKKwkJfQogCX0KICNlbmRpZgotCWluaXRfcnhfYnVmcyhkZXYpOworCXJlcyA9IGluaXRfcnhfYnVmcyhkZXYpOworCWlmIChyZXMpCisJCWdvdG8gZXJyX2lycV81NjsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKLQkvKiBJbml0aWFsaXplIHRoZSA4MjU5NiBtZW1vcnkgKi8KIAlpZiAoaW5pdF9pNTk2X21lbShkZXYpKSB7CiAJCXJlcyA9IC1FQUdBSU47Ci0JCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlnb3RvIGVycl9xdWV1ZTsKIAl9CiAKKwlyZXR1cm4gMDsKKworZXJyX3F1ZXVlOgorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZW1vdmVfcnhfYnVmcyhkZXYpOworZXJyX2lycV81NjoKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlmcmVlX2lycSgweDU2LCBkZXYpOworZXJyX2lycV9kZXY6CisjZW5kaWYKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE0ODgsNiArMTUwOSw5IEBACiAJfQogI2VuZGlmCiAKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlmcmVlX2lycSgweDU2LCBkZXYpOworI2VuZGlmCiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggY2UyZmNkZC4uNWE2ODk1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC00ODQsNyArNDg0LDcgQEAKIAogY29uZmlnIE1JUFNfQVUxWDAwX0VORVQKIAl0cmlzdGF0ZSAiTUlQUyBBVTEwMDAgRXRoZXJuZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPQ19BVTFYMDAKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQogCXNlbGVjdCBQSFlMSUIKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCkBAIC01MzAsMTQgKzUzMCwxNSBAQAogCWRlcGVuZHMgb24gU1VQRVJIICYmIFwKIAkJKENQVV9TVUJUWVBFX1NINzcxMCB8fCBDUFVfU1VCVFlQRV9TSDc3MTIgfHwgXAogCQkgQ1BVX1NVQlRZUEVfU0g3NzYzIHx8IENQVV9TVUJUWVBFX1NINzYxOSB8fCBcCi0JCSBDUFVfU1VCVFlQRV9TSDc3MjQpCisJCSBDUFVfU1VCVFlQRV9TSDc3MjQgfHwgQ1BVX1NVQlRZUEVfU0g3NzU3KQogCXNlbGVjdCBDUkMzMgogCXNlbGVjdCBNSUkKIAlzZWxlY3QgTURJT19CSVRCQU5HCiAJc2VsZWN0IFBIWUxJQgogCWhlbHAKIAkgIFJlbmVzYXMgU3VwZXJIIEV0aGVybmV0IGRldmljZSBkcml2ZXIuCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0IFNINzcxMCwgU0g3NzEyLCBTSDc3NjMsIFNINzYxOSwgYW5kIFNINzcyNC4KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRpbmcgQ1BVcyBhcmU6CisJCS0gU0g3NzEwLCBTSDc3MTIsIFNINzc2MywgU0g3NjE5LCBTSDc3MjQsIGFuZCBTSDc3NTcuCiAKIGNvbmZpZyBTVU5MQU5DRQogCXRyaXN0YXRlICJTdW4gTEFOQ0Ugc3VwcG9ydCIKQEAgLTkxMyw3ICs5MTQsNyBAQAogCXRyaXN0YXRlICJTTUMgOTFDOXgvOTFDMXh4eCBzdXBwb3J0IgogCXNlbGVjdCBDUkMzMgogCXNlbGVjdCBNSUkKLQlkZXBlbmRzIG9uIEFSTSB8fCBSRURXT09EXzUgfHwgUkVEV09PRF82IHx8IE0zMlIgfHwgU1VQRVJIIHx8IFwKKwlkZXBlbmRzIG9uIEFSTSB8fCBNMzJSIHx8IFNVUEVSSCB8fCBcCiAJCU1JUFMgfHwgQkxBQ0tGSU4gfHwgTU4xMDMwMCB8fCBDT0xERklSRQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIFNNQydzIDkxeCBzZXJpZXMgb2YgRXRoZXJuZXQgY2hpcHNldHMsCkBAIC0xNDYzLDcgKzE0NjQsNyBAQAogY29uZmlnIENTODl4MAogCXRyaXN0YXRlICJDUzg5eDAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgTUFDSF9JWERQMjM1MSBcCi0JCXx8IEFSQ0hfSVhEUDJYMDEgfHwgQVJDSF9QTlgwMTBYIHx8IE1BQ0hfTVgzMUFEUykKKwkJfHwgQVJDSF9JWERQMlgwMSB8fCBNQUNIX01YMzFBRFMpCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuIElmIHlvdSBoYXZlIGEKIAkgIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQgdGhlCkBAIC0xNDc3LDcgKzE0NzgsNyBAQAogY29uZmlnIENTODl4MF9OT05JU0FfSVJRCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gQ1M4OXgwICE9IG4KLQlkZXBlbmRzIG9uIE1BQ0hfSVhEUDIzNTEgfHwgQVJDSF9JWERQMlgwMSB8fCBBUkNIX1BOWDAxMFggfHwgTUFDSF9NWDMxQURTCisJZGVwZW5kcyBvbiBNQUNIX0lYRFAyMzUxIHx8IEFSQ0hfSVhEUDJYMDEgfHwgTUFDSF9NWDMxQURTCiAKIGNvbmZpZyBUQzM1ODE1CiAJdHJpc3RhdGUgIlRPU0hJQkEgVEMzNTgxNSBFdGhlcm5ldCBzdXBwb3J0IgpAQCAtMTY1OSw2ICsxNjYwLDcgQEAKIAlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCiAJc2VsZWN0IENSQzMyCiAJc2VsZWN0IE1JSQorCXNlbGVjdCBQSFlMSUIKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgUjYwNDAgRmFzdCBFdGhlcm5ldCBNQUNzIGZvdW5kIGluIHRoZQogCSAgdGhlIFJEQyBSLTMyMXggU3lzdGVtLW9uLWNoaXBzLgpAQCAtMTc0OCwxMSArMTc1MCwxMiBAQAogCSAgUGxlYXNlIGVtYWlsIGZlZWRiYWNrIHRvIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+LgogCiBjb25maWcgS1M4ODQyCi0JdHJpc3RhdGUgIk1pY3JlbCBLU1o4ODQyIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJdHJpc3RhdGUgIk1pY3JlbCBLU1o4ODQxLzQyIHdpdGggZ2VuZXJpYyBidXMgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIERNQV9FTkdJTkUKIAloZWxwCi0JICBUaGlzIHBsYXRmb3JtIGRyaXZlciBpcyBmb3IgTWljcmVsIEtTWjg4NDIgLyBLUzg4NDIKLQkgIDItcG9ydCBldGhlcm5ldCBzd2l0Y2ggY2hpcCAobWFuYWdlZCwgVkxBTiwgUW9TKS4KKwkgVGhpcyBwbGF0Zm9ybSBkcml2ZXIgaXMgZm9yIEtTWjg4NDEoMS1wb3J0KSAvIEtTODg0MigyLXBvcnQpCisJIGV0aGVybmV0IHN3aXRjaCBjaGlwIChtYW5hZ2VkLCBWTEFOLCBRb1MpIGZyb20gTWljcmVsIG9yCisJIFRpbWJlcmRhbGUoRlBHQSkuCiAKIGNvbmZpZyBLUzg4NTEKICAgICAgICB0cmlzdGF0ZSAiTWljcmVsIEtTODg1MSBTUEkiCkBAIC0yNjAxLDYgKzI2MDQsMjkgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUgY2hvb3NlIE0gaGVyZTsgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgY3hnYjQuCiAKK2NvbmZpZyBDSEVMU0lPX1Q0VkZfREVQRU5EUworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBQQ0kgJiYgSU5FVAorCWRlZmF1bHQgeQorCitjb25maWcgQ0hFTFNJT19UNFZGCisJdHJpc3RhdGUgIkNoZWxzaW8gQ29tbXVuaWNhdGlvbnMgVDQgVmlydHVhbCBGdW5jdGlvbiBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ0hFTFNJT19UNFZGX0RFUEVORFMKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBDaGVsc2lvIFQ0LWJhc2VkIGdpZ2FiaXQgYW5kIDEwR2IgRXRoZXJuZXQKKwkgIGFkYXB0ZXJzIHdpdGggUENJLUUgU1ItSU9WIFZpcnR1YWwgRnVuY3Rpb25zLgorCisJICBGb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBDaGVsc2lvIGFuZCBvdXIgcHJvZHVjdHMsIHZpc2l0CisJICBvdXIgd2Vic2l0ZSBhdCA8aHR0cDovL3d3dy5jaGVsc2lvLmNvbT4uCisKKwkgIEZvciBjdXN0b21lciBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgb3VyIGN1c3RvbWVyIHN1cHBvcnQgcGFnZSBhdAorCSAgPGh0dHA6Ly93d3cuY2hlbHNpby5jb20vc3VwcG9ydC5odG0+LgorCisJICBQbGVhc2Ugc2VuZCBmZWVkYmFjayB0byA8bGludXgtYnVnc0BjaGVsc2lvLmNvbT4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUgY2hvb3NlIE0gaGVyZTsgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgY3hnYjR2Zi4KKwogY29uZmlnIEVIRUEKIAl0cmlzdGF0ZSAiZUhFQSBFdGhlcm5ldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSUJNRUJVUyAmJiBJTkVUICYmIFNQQVJTRU1FTQpAQCAtMjYxNCw3ICsyNjQwLDYgQEAKIGNvbmZpZyBFTklDCiAJdHJpc3RhdGUgIkNpc2NvIFZJQyBFdGhlcm5ldCBOSUMgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBJTkVUCi0Jc2VsZWN0IElORVRfTFJPCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciB0aGUgQ2lzY28gVklDIEV0aGVybmV0IGNhcmQuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggMGEwNTEyYS4uNTZlOGMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19DSEVMU0lPX1QxKSArPSBjaGVsc2lvLwogb2JqLSQoQ09ORklHX0NIRUxTSU9fVDMpICs9IGN4Z2IzLwogb2JqLSQoQ09ORklHX0NIRUxTSU9fVDQpICs9IGN4Z2I0Lworb2JqLSQoQ09ORklHX0NIRUxTSU9fVDRWRikgKz0gY3hnYjR2Zi8KIG9iai0kKENPTkZJR19FSEVBKSArPSBlaGVhLwogb2JqLSQoQ09ORklHX0NBTikgKz0gY2FuLwogb2JqLSQoQ09ORklHX0JPTkRJTkcpICs9IGJvbmRpbmcvCkBAIC04Myw4ICs4NCw3IEBACiBvYmotJChDT05GSUdfVElHT04zKSArPSB0ZzMubwogb2JqLSQoQ09ORklHX0JOWDIpICs9IGJueDIubwogb2JqLSQoQ09ORklHX0NOSUMpICs9IGNuaWMubwotb2JqLSQoQ09ORklHX0JOWDJYKSArPSBibngyeC5vCi1ibngyeC1vYmpzIDo9IGJueDJ4X21haW4ubyBibngyeF9saW5rLm8KK29iai0kKENPTkZJR19CTlgyWCkgKz0gYm54MngvCiBzcGlkZXJuZXQteSArPSBzcGlkZXJfbmV0Lm8gc3BpZGVyX25ldF9ldGh0b29sLm8KIG9iai0kKENPTkZJR19TUElERVJfTkVUKSArPSBzcGlkZXJuZXQubyBzdW5nZW1fcGh5Lm8KIG9iai0kKENPTkZJR19HRUxJQ19ORVQpICs9IHBzM19nZWxpYy5vCkBAIC0yNzUsNyArMjc1LDcgQEAKIG9iai0kKENPTkZJR19VU0JfWkQxMjAxKSAgICAgICAgKz0gdXNiLwogb2JqLSQoQ09ORklHX1VTQl9JUEhFVEgpICAgICAgICArPSB1c2IvCiAKLW9iai15ICs9IHdpcmVsZXNzLworb2JqLSQoQ09ORklHX1dMQU4pICs9IHdpcmVsZXNzLwogb2JqLSQoQ09ORklHX05FVF9UVUxJUCkgKz0gdHVsaXAvCiBvYmotJChDT05GSUdfSEFNUkFESU8pICs9IGhhbXJhZGlvLwogb2JqLSQoQ09ORklHX0lSREEpICs9IGlyZGEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9TcGFjZS5jIGIvZHJpdmVycy9uZXQvU3BhY2UuYwppbmRleCAzYjc5YzZjLi45YmI0MDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9TcGFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKQEAgLTIxOCwxMiArMjE4LDYgQEAKICNpZmRlZiBDT05GSUdfRUwxCQkvKiAzYzUwMSAqLwogCXtlbDFfcHJvYmUsIDB9LAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1dBVkVMQU4JCS8qIFdhdmVMQU4gKi8KLQl7d2F2ZWxhbl9wcm9iZSwgMH0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJMQU4JCS8qIEFpcm9uZXQgKi8KLQl7YXJsYW5fcHJvYmUsIDB9LAotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VMMTYJCS8qIDNjNTA3ICovCiAJe2VsMTZfcHJvYmUsIDB9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCmluZGV4IGI5MTE1YTcuLjUxODFlOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjMzIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKIAlpZiAocmV0dmFsKSB7CiAJCXByaW50ayAoIiBub3RoaW5nISBVbmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKLQkJZ290byBvdXQxOworCQlnb3RvIG91dDsKIAl9CiAKIAlwcmludGsoIiBJUlEgJWQsICVzIHBvcnRcbiIsIGRldi0+aXJxLCBwb3J0X25hbWVbZGV2LT5pZl9wb3J0XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCmluZGV4IDc5NjM2ZWUuLjAzNjJjOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCkBAIC04MCw3ICs4MCw3IEBACiAJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCiAgICAgICAgICAgICAgICAgcHJpbnRrKHZlcnNpb24pOwogCi0JLyogSW5pdGFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCiAJZGV2LT5uZXRkZXZfb3BzID0gJmlwZGRwX25ldGRldl9vcHM7CiAKICAgICAgICAgZGV2LT50eXBlID0gQVJQSFJEX0lQRERQOyAgICAgICAJLyogSVAgb3ZlciBERFAgdHVubmVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NhcG1vZGUuYwppbmRleCAzNTU3OTdmLi40MmZjZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jYXBtb2RlLmMKQEAgLTM3LDY5ICszNyw2IEBACiAKICNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBjYXAgbW9kZSAoYGMnKSBlbmNhcHN1bGF0aW9uIHN1cHBvcnQgbG9hZGVkLlxuIgogCi0KLXN0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCi0JICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXVuc2lnbmVkIHNob3J0IHR5cGUsCi0JCQl1aW50OF90IGRhZGRyKTsKLXN0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCi0JCSAgICAgIGludCBidWZudW0pOwotc3RhdGljIGludCBhY2tfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFja2VkKTsKLQotCi1zdGF0aWMgc3RydWN0IEFyY1Byb3RvIGNhcG1vZGVfcHJvdG8gPQotewotCSdyJywKLQlYTVRVLAotCTAsCi0gICAgICAgCXJ4LAotCWJ1aWxkX2hlYWRlciwKLQlwcmVwYXJlX3R4LAotCU5VTEwsCi0JYWNrX3R4Ci19OwotCi0KLXN0YXRpYyB2b2lkIGFyY25ldF9jYXBfaW5pdCh2b2lkKQotewotCWludCBjb3VudDsKLQotCWZvciAoY291bnQgPSAxOyBjb3VudCA8PSA4OyBjb3VudCsrKQotCQlpZiAoYXJjX3Byb3RvX21hcFtjb3VudF0gPT0gYXJjX3Byb3RvX2RlZmF1bHQpCi0JCQlhcmNfcHJvdG9fbWFwW2NvdW50XSA9ICZjYXBtb2RlX3Byb3RvOwotCi0JLyogZm9yIGNhcCBtb2RlLCB3ZSBvbmx5IHNldCB0aGUgYmNhc3QgcHJvdG8gaWYgdGhlcmUncyBubyBiZXR0ZXIgb25lICovCi0JaWYgKGFyY19iY2FzdF9wcm90byA9PSBhcmNfcHJvdG9fZGVmYXVsdCkKLQkJYXJjX2JjYXN0X3Byb3RvID0gJmNhcG1vZGVfcHJvdG87Ci0KLQlhcmNfcHJvdG9fZGVmYXVsdCA9ICZjYXBtb2RlX3Byb3RvOwotCWFyY19yYXdfcHJvdG8gPSAmY2FwbW9kZV9wcm90bzsKLX0KLQotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IGNhcG1vZGVfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlwcmludGsoVkVSU0lPTik7Ci0JYXJjbmV0X2NhcF9pbml0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjYXBtb2RlX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JYXJjbmV0X3VucmVnaXN0ZXJfcHJvdG8oJmNhcG1vZGVfcHJvdG8pOwotfQotbW9kdWxlX2luaXQoY2FwbW9kZV9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChjYXBtb2RlX21vZHVsZV9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwotCi0KLQogLyogcGFja2V0IHJlY2VpdmVyICovCiBzdGF0aWMgdm9pZCByeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAogCSAgICAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpCkBAIC0yMzEsNjUgKzE2OCwxMDcgQEAKIAlCVUdNU0coRF9EVVJJTkcsICJwcmVwYXJlX3R4OiBsZW5ndGg9JWQgb2ZzPSVkXG4iLAogCSAgICAgICBsZW5ndGgsb2ZzKTsKIAotCS8vIENvcHkgdGhlIGFyY25ldC1oZWFkZXIgKyB0aGUgcHJvdG9jb2wgYnl0ZSBkb3duOgorCS8qIENvcHkgdGhlIGFyY25ldC1oZWFkZXIgKyB0aGUgcHJvdG9jb2wgYnl0ZSBkb3duOiAqLwogCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIDAsIGhhcmQsIEFSQ19IRFJfU0laRSk7CiAJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzLCAmcGt0LT5zb2Z0LmNhcC5wcm90bywKIAkJCSAgICBzaXplb2YocGt0LT5zb2Z0LmNhcC5wcm90bykpOwogCi0JLy8gU2tpcCB0aGUgZXh0cmEgaW50ZWdlciB3ZSBoYXZlIHdyaXR0ZW4gaW50byBpdCBhcyBhIGNvb2tpZQotCS8vIGJ1dCB3cml0ZSB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZToKKwkvKiBTa2lwIHRoZSBleHRyYSBpbnRlZ2VyIHdlIGhhdmUgd3JpdHRlbiBpbnRvIGl0IGFzIGEgY29va2llCisJICAgYnV0IHdyaXRlIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlOiAqLwogCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIG9mcysxLAogCQkJICAgICgodW5zaWduZWQgY2hhciopJnBrdC0+c29mdC5jYXAubWVzKSxsZW5ndGgtMSk7CiAKIAlscC0+bGFzdGxvYWRfZGVzdCA9IGhhcmQtPmRlc3Q7CiAKLQlyZXR1cm4gMTsJCS8qIGRvbmUgKi8KKwlyZXR1cm4gMTsJLyogZG9uZSAqLwogfQogCi0KIHN0YXRpYyBpbnQgYWNrX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhY2tlZCkKIHsKLSAgc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotICBzdHJ1Y3Qgc2tfYnVmZiAqYWNrc2tiOwotICBzdHJ1Y3QgYXJjaGRyICphY2twa3Q7Ci0gIGludCBsZW5ndGg9c2l6ZW9mKHN0cnVjdCBhcmNfY2FwKTsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKmFja3NrYjsKKwlzdHJ1Y3QgYXJjaGRyICphY2twa3Q7CisJaW50IGxlbmd0aD1zaXplb2Yoc3RydWN0IGFyY19jYXApOwogCi0gIEJVR01TRyhEX0RVUklORywgImNhcG1vZGU6IGFja190eDogcHJvdG9jb2w6ICV4OiByZXN1bHQ6ICVkXG4iLAotCSBscC0+b3V0Z29pbmcuc2tiLT5wcm90b2NvbCwgYWNrZWQpOworCUJVR01TRyhEX0RVUklORywgImNhcG1vZGU6IGFja190eDogcHJvdG9jb2w6ICV4OiByZXN1bHQ6ICVkXG4iLAorCQlscC0+b3V0Z29pbmcuc2tiLT5wcm90b2NvbCwgYWNrZWQpOwogCi0gIEJVR0xWTChEX1NLQikgYXJjbmV0X2R1bXBfc2tiKGRldiwgbHAtPm91dGdvaW5nLnNrYiwgImFja190eCIpOworCUJVR0xWTChEX1NLQikgYXJjbmV0X2R1bXBfc2tiKGRldiwgbHAtPm91dGdvaW5nLnNrYiwgImFja190eCIpOwogCi0gIC8qIE5vdyBhbGxvYyBhIHNrYiB0byBzZW5kIGJhY2sgdXAgdGhyb3VnaCB0aGUgbGF5ZXJzOiAqLwotICBhY2tza2IgPSBhbGxvY19za2IobGVuZ3RoICsgQVJDX0hEUl9TSVpFICwgR0ZQX0FUT01JQyk7Ci0gIGlmIChhY2tza2IgPT0gTlVMTCkgewotCSAgQlVHTVNHKERfTk9STUFMLCAiTWVtb3J5IHNxdWVlemUsIGNhbid0IGFja25vd2xlZGdlLlxuIik7Ci0JICBnb3RvIGZyZWVfb3V0c2tiOwotICB9CisJLyogTm93IGFsbG9jIGEgc2tiIHRvIHNlbmQgYmFjayB1cCB0aHJvdWdoIHRoZSBsYXllcnM6ICovCisJYWNrc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIEFSQ19IRFJfU0laRSAsIEdGUF9BVE9NSUMpOworCWlmIChhY2tza2IgPT0gTlVMTCkgeworCQlCVUdNU0coRF9OT1JNQUwsICJNZW1vcnkgc3F1ZWV6ZSwgY2FuJ3QgYWNrbm93bGVkZ2UuXG4iKTsKKwkJZ290byBmcmVlX291dHNrYjsKKwl9CiAKLSAgc2tiX3B1dChhY2tza2IsIGxlbmd0aCArIEFSQ19IRFJfU0laRSApOwotICBhY2tza2ItPmRldiA9IGRldjsKKwlza2JfcHV0KGFja3NrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFICk7CisJYWNrc2tiLT5kZXYgPSBkZXY7CiAKLSAgc2tiX3Jlc2V0X21hY19oZWFkZXIoYWNrc2tiKTsKLSAgYWNrcGt0ID0gKHN0cnVjdCBhcmNoZHIgKilza2JfbWFjX2hlYWRlcihhY2tza2IpOwotICAvKiBza2JfcHVsbChhY2tza2IsIEFSQ19IRFJfU0laRSk7ICovCisJc2tiX3Jlc2V0X21hY19oZWFkZXIoYWNrc2tiKTsKKwlhY2twa3QgPSAoc3RydWN0IGFyY2hkciAqKXNrYl9tYWNfaGVhZGVyKGFja3NrYik7CisJLyogc2tiX3B1bGwoYWNrc2tiLCBBUkNfSERSX1NJWkUpOyAqLwogCisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShscC0+b3V0Z29pbmcuc2tiLCBhY2twa3QsCisJCQkJICBBUkNfSERSX1NJWkUgKyBzaXplb2Yoc3RydWN0IGFyY19jYXApKTsKKwlhY2twa3QtPnNvZnQuY2FwLnByb3RvID0gMDsgLyogdXNpbmcgcHJvdG9jb2wgMCBmb3IgYWNrbm93bGVkZ2UgKi8KKwlhY2twa3QtPnNvZnQuY2FwLm1lcy5hY2s9YWNrZWQ7CiAKLSAgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShscC0+b3V0Z29pbmcuc2tiLCBhY2twa3QsCi0JCUFSQ19IRFJfU0laRSArIHNpemVvZihzdHJ1Y3QgYXJjX2NhcCkpOwotICBhY2twa3QtPnNvZnQuY2FwLnByb3RvPTA7IC8qIHVzaW5nIHByb3RvY29sIDAgZm9yIGFja25vd2xlZGdlICovCi0gIGFja3BrdC0+c29mdC5jYXAubWVzLmFjaz1hY2tlZDsKKwlCVUdNU0coRF9QUk9UTywgIkFja2tub3dsZWRnZSBmb3IgY2FwIHBhY2tldCAleC5cbiIsCisJCQkqKChpbnQqKSZhY2twa3QtPnNvZnQuY2FwLmNvb2tpZVswXSkpOwogCi0gIEJVR01TRyhEX1BST1RPLCAiQWNra25vd2xlZGdlIGZvciBjYXAgcGFja2V0ICV4LlxuIiwKLQkgKigoaW50KikmYWNrcGt0LT5zb2Z0LmNhcC5jb29raWVbMF0pKTsKKwlhY2tza2ItPnByb3RvY29sID0gY3B1X3RvX2JlMTYoRVRIX1BfQVJDTkVUKTsKIAotICBhY2tza2ItPnByb3RvY29sID0gY3B1X3RvX2JlMTYoRVRIX1BfQVJDTkVUKTsKKwlCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIGFja3NrYiwgImFja190eF9yZWN2Iik7CisJbmV0aWZfcngoYWNrc2tiKTsKIAotICBCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIGFja3NrYiwgImFja190eF9yZWN2Iik7Ci0gIG5ldGlmX3J4KGFja3NrYik7CitmcmVlX291dHNrYjoKKwlkZXZfa2ZyZWVfc2tiX2lycShscC0+b3V0Z29pbmcuc2tiKTsKKwlscC0+b3V0Z29pbmcucHJvdG8gPSBOVUxMOyAvKiBXZSBhcmUgYWx3YXlzIGZpbmlzaGVkIHdoZW4gaW4gdGhpcyBwcm90b2NvbCAqLwogCi0gZnJlZV9vdXRza2I6Ci0gIGRldl9rZnJlZV9za2JfaXJxKGxwLT5vdXRnb2luZy5za2IpOwotICBscC0+b3V0Z29pbmcucHJvdG8gPSBOVUxMOyAvKiBXZSBhcmUgYWx3YXlzIGZpbmlzaGVkIHdoZW4gaW4gdGhpcyBwcm90b2NvbCAqLwotCi0gIHJldHVybiAwOworCXJldHVybiAwOwogfQorCitzdGF0aWMgc3RydWN0IEFyY1Byb3RvIGNhcG1vZGVfcHJvdG8gPQoreworCSdyJywKKwlYTVRVLAorCTAsCisJcngsCisJYnVpbGRfaGVhZGVyLAorCXByZXBhcmVfdHgsCisJTlVMTCwKKwlhY2tfdHgKK307CisKK3N0YXRpYyB2b2lkIGFyY25ldF9jYXBfaW5pdCh2b2lkKQoreworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAxOyBjb3VudCA8PSA4OyBjb3VudCsrKQorCQlpZiAoYXJjX3Byb3RvX21hcFtjb3VudF0gPT0gYXJjX3Byb3RvX2RlZmF1bHQpCisJCQlhcmNfcHJvdG9fbWFwW2NvdW50XSA9ICZjYXBtb2RlX3Byb3RvOworCisJLyogZm9yIGNhcCBtb2RlLCB3ZSBvbmx5IHNldCB0aGUgYmNhc3QgcHJvdG8gaWYgdGhlcmUncyBubyBiZXR0ZXIgb25lICovCisJaWYgKGFyY19iY2FzdF9wcm90byA9PSBhcmNfcHJvdG9fZGVmYXVsdCkKKwkJYXJjX2JjYXN0X3Byb3RvID0gJmNhcG1vZGVfcHJvdG87CisKKwlhcmNfcHJvdG9fZGVmYXVsdCA9ICZjYXBtb2RlX3Byb3RvOworCWFyY19yYXdfcHJvdG8gPSAmY2FwbW9kZV9wcm90bzsKK30KKworc3RhdGljIGludCBfX2luaXQgY2FwbW9kZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXByaW50ayhWRVJTSU9OKTsKKwlhcmNuZXRfY2FwX2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNhcG1vZGVfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlhcmNuZXRfdW5yZWdpc3Rlcl9wcm90bygmY2FwbW9kZV9wcm90byk7Cit9Cittb2R1bGVfaW5pdChjYXBtb2RlX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGNhcG1vZGVfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtaXNhLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtaXNhLmMKaW5kZXggMDQwMmRhMy4uMzcyNzI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLWlzYS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1pc2EuYwpAQCAtOTAsMTQgKzkwLDE0IEBACiAJCW91dGIoMCwgX0lOVE1BU0spOwogCQlkZXYtPmlycSA9IHByb2JlX2lycV9vZmYoYWlycW1hc2spOwogCi0JCWlmIChkZXYtPmlycSA8PSAwKSB7CisJCWlmICgoaW50KWRldi0+aXJxIDw9IDApIHsKIAkJCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIkF1dG9wcm9iZSBJUlEgZmFpbGVkIGZpcnN0IHRpbWVcbiIpOwogCQkJYWlycW1hc2sgPSBwcm9iZV9pcnFfb24oKTsKIAkJCW91dGIoTk9SWGZsYWcsIF9JTlRNQVNLKTsKIAkJCXVkZWxheSg1KTsKIAkJCW91dGIoMCwgX0lOVE1BU0spOwogCQkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGFpcnFtYXNrKTsKLQkJCWlmIChkZXYtPmlycSA8PSAwKSB7CisJCQlpZiAoKGludClkZXYtPmlycSA8PSAwKSB7CiAJCQkJQlVHTVNHKERfTk9STUFMLCAiQXV0b3Byb2JlIElSUSBmYWlsZWQuXG4iKTsKIAkJCQllcnIgPSAtRU5PREVWOwogCQkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkwaW8uYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MGlvLmMKaW5kZXggNGNiNDAxOC4uZWIyNzk3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkwaW8uYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tOTBpby5jCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJb3V0YigwLCBfSU5UTUFTSyk7CiAJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihhaXJxbWFzayk7CiAKLQkJaWYgKGRldi0+aXJxIDw9IDApIHsKKwkJaWYgKChpbnQpZGV2LT5pcnEgPD0gMCkgewogCQkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiQXV0b3Byb2JlIElSUSBmYWlsZWRcbiIpOwogCQkJZ290byBlcnJfb3V0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vaXhwNHh4X2V0aC5jIGIvZHJpdmVycy9uZXQvYXJtL2l4cDR4eF9ldGguYwppbmRleCAyNGRmMDMyLi40ZjFjYzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vaXhwNHh4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9peHA0eHhfZXRoLmMKQEAgLTczOCw2ICs3MzgsMTcgQEAKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCXU4IGRpZmZzW0VUSF9BTEVOXSwgKmFkZHI7CiAJaW50IGk7CisJc3RhdGljIGNvbnN0IHU4IGFsbG11bHRpW10gPSB7IDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCQlfX3Jhd193cml0ZWwoYWxsbXVsdGlbaV0sICZwb3J0LT5yZWdzLT5tY2FzdF9hZGRyW2ldKTsKKwkJCV9fcmF3X3dyaXRlbChhbGxtdWx0aVtpXSwgJnBvcnQtPnJlZ3MtPm1jYXN0X21hc2tbaV0pOworCQl9CisJCV9fcmF3X3dyaXRlbChERUZBVUxUX1JYX0NOVFJMMCB8IFJYX0NOVFJMMF9BRERSX0ZMVFJfRU4sCisJCQkmcG9ydC0+cmVncy0+cnhfY29udHJvbFswXSk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgfHwgbmV0ZGV2X21jX2VtcHR5KGRldikpIHsKIAkJX19yYXdfd3JpdGVsKERFRkFVTFRfUlhfQ05UUkwwICYgflJYX0NOVFJMMF9BRERSX0ZMVFJfRU4sCkBAIC03NzEsNyArNzgyLDggQEAKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwb3J0LT5waHlkZXYsIGlmX21paShyZXEpLCBjbWQpOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwocG9ydC0+cGh5ZGV2LCByZXEsIGNtZCk7CiB9CiAKIC8qIGV0aHRvb2wgc3VwcG9ydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL3c5MHA5MTBfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2FybS93OTBwOTEwX2V0aGVyLmMKaW5kZXggMmU4NTI0Ni4uNDU0NWQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL3c5MHA5MTBfZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9hcm0vdzkwcDkxMF9ldGhlci5jCkBAIC04MjIsNiArODIyLDkgQEAKIAl3OTBwOTEwX3NldF9nbG9iYWxfbWFjY21kKGRldik7CiAJdzkwcDkxMF9lbmFibGVfcngoZGV2LCAxKTsKIAorCWNsa19lbmFibGUoZXRoZXItPnJtaWljbGspOworCWNsa19lbmFibGUoZXRoZXItPmNsayk7CisKIAlldGhlci0+cnhfcGFja2V0cyA9IDB4MDsKIAlldGhlci0+cnhfYnl0ZXMgPSAweDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0MTcwMC5jIGIvZHJpdmVycy9uZXQvYXQxNzAwLmMKaW5kZXggOTMxODVmNS4uODk4NzY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXQxNzAwLmMKKysrIGIvZHJpdmVycy9uZXQvYXQxNzAwLmMKQEAgLTgxMSwxMCArODExLDggQEAKIAkvKiBObyBzdGF0aXN0aWMgY291bnRlcnMgb24gdGhlIGNoaXAgdG8gdXBkYXRlLiAqLwogCiAJLyogRGlzYWJsZSB0aGUgSVJRIG9uIGJvYXJkcyBvZiBmbXYxOHggd2hlcmUgaXQgaXMgZmVhc2libGUuICovCi0JaWYgKGxwLT5qdW1wZXJlZCkgeworCWlmIChscC0+anVtcGVyZWQpCiAJCW91dGIoMHgwMCwgaW9hZGRyICsgSU9DT05GSUcxKTsKLQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JfQogCiAJLyogUG93ZXItZG93biB0aGUgY2hpcC4gIEdyZWVuLCBncmVlbiwgZ3JlZW4hICovCiAJb3V0YigweDAwLCBpb2FkZHIgKyBDT05GSUdfMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxYy5oIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWMuaAppbmRleCA4NGFlOTA1Li41MmFiYmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxYy5oCisrKyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjLmgKQEAgLTczLDcgKzczLDggQEAKICNkZWZpbmUgRlVMTF9EVVBMRVggICAgICAgIDIKIAogI2RlZmluZSBBVF9SWF9CVUZfU0laRQkJKEVUSF9GUkFNRV9MRU4gKyBWTEFOX0hMRU4gKyBFVEhfRkNTX0xFTikKLSNkZWZpbmUgTUFYX0pVTUJPX0ZSQU1FX1NJWkUgCSg5KjEwMjQpCisjZGVmaW5lIE1BWF9KVU1CT19GUkFNRV9TSVpFCSg2KjEwMjQpCisjZGVmaW5lIE1BWF9UU09fRlJBTUVfU0laRSAgICAgICg3KjEwMjQpCiAjZGVmaW5lIE1BWF9UWF9PRkZMT0FEX1RIUkVTSAkoOSoxMDI0KQogCiAjZGVmaW5lIEFUX01BWF9SRUNFSVZFX1FVRVVFICAgIDQKQEAgLTg3LDEwICs4OCwxMSBAQAogI2RlZmluZSBBVF9NQVhfSU5UX1dPUksJCTUKICNkZWZpbmUgQVRfVFdTSV9FRVBST01fVElNRU9VVCAJMTAwCiAjZGVmaW5lIEFUX0hXX01BWF9JRExFX0RFTEFZIAkxMAotI2RlZmluZSBBVF9TVVNQRU5EX0xJTktfVElNRU9VVCAyOAorI2RlZmluZSBBVF9TVVNQRU5EX0xJTktfVElNRU9VVCAxMDAKIAogI2RlZmluZSBBVF9BU1BNX0wwU19USU1FUgk2CiAjZGVmaW5lIEFUX0FTUE1fTDFfVElNRVIJMTIKKyNkZWZpbmUgQVRfTENLREVUX1RJTUVSCQkxMgogCiAjZGVmaW5lIEFUTDFDX1BDSUVfTDBTX0wxX0RJU0FCTEUgCTB4MDEKICNkZWZpbmUgQVRMMUNfUENJRV9QSFlfUkVTRVQJCTB4MDIKQEAgLTMxNiw2ICszMTgsNyBAQAogCWF0aHJfbDJjX2IsCiAJYXRocl9sMmNfYjIsCiAJYXRocl9sMWQsCisJYXRocl9sMWRfMiwKIH07CiAKIGVudW0gYXRsMWNfdHJhbnNfcXVldWUgewpAQCAtMzkyLDYgKzM5NSw4IEBACiAJdTE2IHN1YnN5c3RlbV9pZDsKIAl1MTYgc3Vic3lzdGVtX3ZlbmRvcl9pZDsKIAl1OCByZXZpc2lvbl9pZDsKKwl1MTYgcGh5X2lkMTsKKwl1MTYgcGh5X2lkMjsKIAogCXUzMiBpbnRyX21hc2s7CiAJdTggZG1hd19kbHlfY250OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfaHcuYyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX2h3LmMKaW5kZXggZjEzODlkNi4uZDg1MDFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19ody5jCkBAIC0zNyw2ICszNyw5IEBACiAJaWYgKGRhdGEgJiBUV1NJX0RFQlVHX0RFVl9FWElTVCkKIAkJcmV0dXJuIDE7CiAKKwlBVF9SRUFEX1JFRyhodywgUkVHX01BU1RFUl9DVFJMLCAmZGF0YSk7CisJaWYgKGRhdGEgJiBNQVNURVJfQ1RSTF9PVFBfU0VMKQorCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjksNiArNzIsOCBAQAogCXUzMiBpOwogCXUzMiBvdHBfY3RybF9kYXRhOwogCXUzMiB0d3NpX2N0cmxfZGF0YTsKKwl1MzIgbHRzc21fY3RybF9kYXRhOworCXUzMiB3b2xfZGF0YTsKIAl1OCAgZXRoX2FkZHJbRVRIX0FMRU5dOwogCXUxNiBwaHlfZGF0YTsKIAlib29sIHJhaXNlX3ZvbCA9IGZhbHNlOwpAQCAtMTA0LDYgKzEwOSwxNSBAQAogCQkJdWRlbGF5KDIwKTsKIAkJCXJhaXNlX3ZvbCA9IHRydWU7CiAJCX0KKwkJLyogY2xvc2Ugb3BlbiBiaXQgb2YgUmVhZE9ubHkqLworCQlBVF9SRUFEX1JFRyhodywgUkVHX0xUU1NNX0lEX0NUUkwsICZsdHNzbV9jdHJsX2RhdGEpOworCQlsdHNzbV9jdHJsX2RhdGEgJj0gfkxUU1NNX0lEX0VOX1dSTzsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTFRTU01fSURfQ1RSTCwgbHRzc21fY3RybF9kYXRhKTsKKworCQkvKiBjbGVhciBhbnkgV09MIHNldHRpbmdzICovCisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1dPTF9DVFJMLCAwKTsKKwkJQVRfUkVBRF9SRUcoaHcsIFJFR19XT0xfQ1RSTCwgJndvbF9kYXRhKTsKKwogCiAJCUFUX1JFQURfUkVHKGh3LCBSRUdfVFdTSV9DVFJMLCAmdHdzaV9jdHJsX2RhdGEpOwogCQl0d3NpX2N0cmxfZGF0YSB8PSBUV1NJX0NUUkxfU1dfTERTVEFSVDsKQEAgLTExOSwxNyArMTMzLDE1IEBACiAJfQogCS8qIERpc2FibGUgT1RQX0NMSyAqLwogCWlmICgoaHctPm5pY190eXBlID09IGF0aHJfbDFjIHx8IGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyYykpIHsKLQkJaWYgKG90cF9jdHJsX2RhdGEgJiBPVFBfQ1RSTF9DTEtfRU4pIHsKLQkJCW90cF9jdHJsX2RhdGEgJj0gfk9UUF9DVFJMX0NMS19FTjsKLQkJCUFUX1dSSVRFX1JFRyhodywgUkVHX09UUF9DVFJMLCBvdHBfY3RybF9kYXRhKTsKLQkJCUFUX1dSSVRFX0ZMVVNIKGh3KTsKLQkJCW1zbGVlcCgxKTsKLQkJfQorCQlvdHBfY3RybF9kYXRhICY9IH5PVFBfQ1RSTF9DTEtfRU47CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX09UUF9DVFJMLCBvdHBfY3RybF9kYXRhKTsKKwkJbXNsZWVwKDEpOwogCX0KIAlpZiAocmFpc2Vfdm9sKSB7CiAJCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYiB8fAogCQkgICAgaHctPm5pY190eXBlID09IGF0aHJfbDJjX2IyIHx8Ci0JCSAgICBody0+bmljX3R5cGUgPT0gYXRocl9sMWQpIHsKKwkJICAgIGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZCB8fAorCQkgICAgaHctPm5pY190eXBlID09IGF0aHJfbDFkXzIpIHsKIAkJCWF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfQUREUiwgMHgwMCk7CiAJCQlpZiAoYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsICZwaHlfZGF0YSkpCiAJCQkJZ290byBvdXQ7CkBAIC00NTYsMTQgKzQ2OCwyMiBAQAogCiAJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iIHx8CiAJICAgIGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iMiB8fAotCSAgICBody0+bmljX3R5cGUgPT0gYXRocl9sMWQpIHsKKwkgICAgaHctPm5pY190eXBlID09IGF0aHJfbDFkIHx8CisJICAgIGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZF8yKSB7CiAJCWF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfQUREUiwgMHgzQik7CiAJCWF0bDFjX3JlYWRfcGh5X3JlZyhodywgTUlJX0RCR19EQVRBLCAmcGh5X2RhdGEpOwogCQlhdGwxY193cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsIHBoeV9kYXRhICYgMHhGRkY3KTsKIAkJbXNsZWVwKDIwKTsKIAl9Ci0KLQkvKkVuYWJsZSBQSFkgTGlua0NoYW5nZSBJbnRlcnJ1cHQgKi8KKwlpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDFkKSB7CisJCWF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfQUREUiwgMHgyOSk7CisJCWF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfREFUQSwgMHg5MjlEKTsKKwl9CisJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxYyB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYjIKKwkJfHwgaHctPm5pY190eXBlID09IGF0aHJfbDJjIHx8IGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyYykgeworCQlhdGwxY193cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDB4MjkpOworCQlhdGwxY193cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsIDB4QjZERCk7CisJfQogCWVyciA9IGF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9JRVIsIG1paV9pZXJfZGF0YSk7CiAJaWYgKGVycikgewogCQlpZiAobmV0aWZfbXNnX2h3KGFkYXB0ZXIpKQpAQCAtNDgyLDEyICs1MDIsMTAgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJaW50IHJldF92YWw7CiAJdTE2IG1paV9ibWNyX2RhdGEgPSBCTUNSX1JFU0VUOwotCXUxNiBwaHlfaWQxLCBwaHlfaWQyOwogCi0JaWYgKChhdGwxY19yZWFkX3BoeV9yZWcoaHcsIE1JSV9QSFlTSUQxLCAmcGh5X2lkMSkgIT0gMCkgfHwKLQkJKGF0bDFjX3JlYWRfcGh5X3JlZyhodywgTUlJX1BIWVNJRDIsICZwaHlfaWQyKSAhPSAwKSkgewotCQkJaWYgKG5ldGlmX21zZ19saW5rKGFkYXB0ZXIpKQotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIGdldCBwaHkgSURcbiIpOworCWlmICgoYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfUEhZU0lEMSwgJmh3LT5waHlfaWQxKSAhPSAwKSB8fAorCQkoYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfUEhZU0lEMiwgJmh3LT5waHlfaWQyKSAhPSAwKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBnZXQgcGh5IElEXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CkBAIC01NzIsNiArNTkwLDY1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBhdGwxY19waHlfcG93ZXJfc2F2aW5nKHN0cnVjdCBhdGwxY19odyAqaHcpCit7CisJc3RydWN0IGF0bDFjX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFjX2FkYXB0ZXIgKilody0+YWRhcHRlcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IHJldCA9IDA7CisJdTE2IGF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCXUxNiBzYXZlX2F1dG9uZWdfYWR2ZXJ0aXNlZDsKKwl1MTYgcGh5X2RhdGE7CisJdTE2IG1paV9scGFfZGF0YTsKKwl1MTYgc3BlZWQgPSBTUEVFRF8wOworCXUxNiBkdXBsZXggPSBGVUxMX0RVUExFWDsKKwlpbnQgaTsKKworCWF0bDFjX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlpZiAocGh5X2RhdGEgJiBCTVNSX0xTVEFUVVMpIHsKKwkJYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfTFBBLCAmbWlpX2xwYV9kYXRhKTsKKwkJaWYgKG1paV9scGFfZGF0YSAmIExQQV8xMEZVTEwpCisJCQlhdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwkJZWxzZSBpZiAobWlpX2xwYV9kYXRhICYgTFBBXzEwSEFMRikKKwkJCWF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCQllbHNlIGlmIChtaWlfbHBhX2RhdGEgJiBMUEFfMTAwSEFMRikKKwkJCWF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwkJZWxzZSBpZiAobWlpX2xwYV9kYXRhICYgTFBBXzEwMEZVTEwpCisJCQlhdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisKKwkJc2F2ZV9hdXRvbmVnX2FkdmVydGlzZWQgPSBody0+YXV0b25lZ19hZHZlcnRpc2VkOworCQlody0+cGh5X2NvbmZpZ3VyZWQgPSBmYWxzZTsKKwkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IGF1dG9uZWdfYWR2ZXJ0aXNlZDsKKwkJaWYgKGF0bDFjX3Jlc3RhcnRfYXV0b25lZyhodykgIT0gMCkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicGh5IGF1dG9uZWcgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC0xOworCQl9CisJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBzYXZlX2F1dG9uZWdfYWR2ZXJ0aXNlZDsKKworCQlpZiAobWlpX2xwYV9kYXRhKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVRfU1VTUEVORF9MSU5LX1RJTUVPVVQ7IGkrKykgeworCQkJCW1kZWxheSgxMDApOworCQkJCWF0bDFjX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJCQkJYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwkJCQlpZiAocGh5X2RhdGEgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCQkJaWYgKGF0bDFjX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsCisJCQkJCQkJCQkmZHVwbGV4KSAhPSAwKQorCQkJCQkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJCQkJCSJnZXQgc3BlZWQgYW5kIGR1cGxleCBmYWlsZWRcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzcGVlZCA9IFNQRUVEXzEwOworCQlkdXBsZXggPSBIQUxGX0RVUExFWDsKKwl9CisJYWRhcHRlci0+bGlua19zcGVlZCA9IHNwZWVkOworCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gZHVwbGV4OworCisJcmV0dXJuIHJldDsKK30KKwogaW50IGF0bDFjX3Jlc3RhcnRfYXV0b25lZyhzdHJ1Y3QgYXRsMWNfaHcgKmh3KQogewogCWludCBlcnIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfaHcuaCBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX2h3LmgKaW5kZXggMWVlYjNlZC4uM2RkNjc1OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfaHcuaApAQCAtNDIsNyArNDIsNyBAQAogaW50IGF0bDFjX3BoeV9pbml0KHN0cnVjdCBhdGwxY19odyAqaHcpOwogaW50IGF0bDFjX2NoZWNrX2VlcHJvbV9leGlzdChzdHJ1Y3QgYXRsMWNfaHcgKmh3KTsKIGludCBhdGwxY19yZXN0YXJ0X2F1dG9uZWcoc3RydWN0IGF0bDFjX2h3ICpodyk7Ci0KK2ludCBhdGwxY19waHlfcG93ZXJfc2F2aW5nKHN0cnVjdCBhdGwxY19odyAqaHcpOwogLyogcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBSRUdfREVWSUNFX0NBUCAgICAgICAgICAgICAgCTB4NUMKICNkZWZpbmUgREVWSUNFX0NBUF9NQVhfUEFZTE9BRF9NQVNLICAgICAweDcKQEAgLTEyMCw2ICsxMjAsMTIgQEAKICNkZWZpbmUgUkVHX1BDSUVfUEhZTUlTQwkgICAgCTB4MTAwMAogI2RlZmluZSBQQ0lFX1BIWU1JU0NfRk9SQ0VfUkNWX0RFVAkweDQKIAorI2RlZmluZSBSRUdfUENJRV9QSFlNSVNDMgkJMHgxMDA0CisjZGVmaW5lIFBDSUVfUEhZTUlTQzJfU0VSREVTX0NEUl9NQVNLCTB4MworI2RlZmluZSBQQ0lFX1BIWU1JU0MyX1NFUkRFU19DRFJfU0hJRlQJMTYKKyNkZWZpbmUgUENJRV9QSFlNSVNDMl9TRVJERVNfVEhfTUFTSwkweDMKKyNkZWZpbmUgUENJRV9QSFlNSVNDMl9TRVJERVNfVEhfU0hJRlQJMTgKKwogI2RlZmluZSBSRUdfVFdTSV9ERUJVRwkJCTB4MTEwOAogI2RlZmluZSBUV1NJX0RFQlVHX0RFVl9FWElTVAkJMHgyMDAwMDAwMAogCkBAIC0xNTAsMjQgKzE1NiwyOCBAQAogI2RlZmluZSBQTV9DVFJMX0FTUE1fTDBTX0VOCQkweDAwMDAxMDAwCiAjZGVmaW5lIFBNX0NUUkxfQ0xLX1NXSF9MMQkJMHgwMDAwMjAwMAogI2RlZmluZSBQTV9DVFJMX0NMS19QV01fVkVSMV8xCQkweDAwMDA0MDAwCi0jZGVmaW5lIFBNX0NUUkxfUENJRV9SRUNWCQkweDAwMDA4MDAwCisjZGVmaW5lIFBNX0NUUkxfUkNWUl9XVF9USU1FUgkJMHgwMDAwODAwMAogI2RlZmluZSBQTV9DVFJMX0wxX0VOVFJZX1RJTUVSX01BU0sJMHhGCiAjZGVmaW5lIFBNX0NUUkxfTDFfRU5UUllfVElNRVJfU0hJRlQJMTYKICNkZWZpbmUgUE1fQ1RSTF9QTV9SRVFfVElNRVJfTUFTSwkweEYKICNkZWZpbmUgUE1fQ1RSTF9QTV9SRVFfVElNRVJfU0hJRlQJMjAKLSNkZWZpbmUgUE1fQ1RSTF9MQ0tERVRfVElNRVJfTUFTSwkweDNGCisjZGVmaW5lIFBNX0NUUkxfTENLREVUX1RJTUVSX01BU0sJMHhGCiAjZGVmaW5lIFBNX0NUUkxfTENLREVUX1RJTUVSX1NISUZUCTI0CiAjZGVmaW5lIFBNX0NUUkxfRU5fQlVGU19SWF9MMFMJCTB4MTAwMDAwMDAKICNkZWZpbmUgUE1fQ1RSTF9TQV9ETFlfRU4JCTB4MjAwMDAwMDAKICNkZWZpbmUgUE1fQ1RSTF9NQUNfQVNQTV9DSEsJCTB4NDAwMDAwMDAKICNkZWZpbmUgUE1fQ1RSTF9IT1RSU1QJCQkweDgwMDAwMDAwCiAKKyNkZWZpbmUgUkVHX0xUU1NNX0lEX0NUUkwJCTB4MTJGQworI2RlZmluZSBMVFNTTV9JRF9FTl9XUk8JCQkweDEwMDAKIC8qIFNlbGVuZSBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBSRUdfTUFTVEVSX0NUUkwJCQkweDE0MDAKICNkZWZpbmUgTUFTVEVSX0NUUkxfU09GVF9SU1QgICAgICAgICAgICAweDEKICNkZWZpbmUgTUFTVEVSX0NUUkxfVEVTVF9NT0RFX01BU0sJMHgzCiAjZGVmaW5lIE1BU1RFUl9DVFJMX1RFU1RfTU9ERV9TSElGVAkyCiAjZGVmaW5lIE1BU1RFUl9DVFJMX0JFUlRfU1RBUlQJCTB4MTAKKyNkZWZpbmUgTUFTVEVSX0NUUkxfT09CX0RJU19PRkYJCTB4NDAKKyNkZWZpbmUgTUFTVEVSX0NUUkxfU0FfVElNRVJfRU4JCTB4ODAKICNkZWZpbmUgTUFTVEVSX0NUUkxfTVRJTUVSX0VOICAgICAgICAgICAweDEwMAogI2RlZmluZSBNQVNURVJfQ1RSTF9NQU5VQUxfSU5UICAgICAgICAgIDB4MjAwCiAjZGVmaW5lIE1BU1RFUl9DVFJMX1RYX0lUSU1FUl9FTgkweDQwMApAQCAtMjIwLDYgKzIzMCwxMiBAQAogCQlHUEhZX0NUUkxfUFdET1dOX0hXCXxcCiAJCUdQSFlfQ1RSTF9QSFlfSUREUSkKIAorI2RlZmluZSBHUEhZX0NUUkxfUE9XRVJfU0FWSU5HICgJXAorCQlHUEhZX0NUUkxfU0VMX0FOQV9SU1QJfFwKKwkJR1BIWV9DVFJMX0hJQl9FTgl8XAorCQlHUEhZX0NUUkxfSElCX1BVTFNFCXxcCisJCUdQSFlfQ1RSTF9QV0RPV05fSFcJfFwKKwkJR1BIWV9DVFJMX1BIWV9JRERRKQogLyogQmxvY2sgSURMRSBTdGF0dXMgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUkVHX0lETEVfU1RBVFVTICAJCTB4MTQxMAogI2RlZmluZSBJRExFX1NUQVRVU19NQVNLCQkweDAwRkYKQEAgLTI4Nyw2ICszMDMsMTQgQEAKICNkZWZpbmUgU0VSREVTX0xPQ0tfREVURUNUICAgICAgICAgIAkweDEgIC8qIFNlckRlcyBsb2NrIGRldGVjdGVkLiBUaGlzIHNpZ25hbAogCQkJCQkgICAgICAqIGNvbWVzIGZyb20gQW5hbG9nIFNlckRlcyAqLwogI2RlZmluZSBTRVJERVNfTE9DS19ERVRFQ1RfRU4gICAgICAgCTB4MiAgLyogMTogRW5hYmxlIFNlckRlcyBMb2NrIGRldGVjdCBmdW5jdGlvbiAqLworI2RlZmluZSBTRVJERVNfTE9DS19TVFNfU0VMRkJfUExMX1NISUZUIDB4RQorI2RlZmluZSBTRVJERVNfTE9DS19TVFNfU0VMRkJfUExMX01BU0sgIDB4MworI2RlZmluZSBTRVJERVNfT1ZDTEtfMThfMjUJCTB4MAorI2RlZmluZSBTRVJERVNfT1ZDTEtfMTJfMTgJCTB4MQorI2RlZmluZSBTRVJERVNfT1ZDTEtfMF80CQkweDIKKyNkZWZpbmUgU0VSREVTX09WQ0xLXzRfMTIJCTB4MworI2RlZmluZSBTRVJERVNfTUFDX0NMS19TTE9XRE9XTgkJMHgyMDAwMAorI2RlZmluZSBTRVJERVNfUFlIX0NMS19TTE9XRE9XTgkJMHg0MDAwMAogCiAvKiBNQUMgQ29udHJvbCBSZWdpc3RlciAgKi8KICNkZWZpbmUgUkVHX01BQ19DVFJMICAgICAgICAgCQkweDE0ODAKQEAgLTY5Myw2ICs3MTcsMjEgQEAKICNkZWZpbmUgUkVHX01BQ19UWF9TVEFUVVNfQklOIAkJMHgxNzYwCiAjZGVmaW5lIFJFR19NQUNfVFhfU1RBVFVTX0VORCAJCTB4MTdjMAogCisjZGVmaW5lIFJFR19DTEtfR0FUSU5HX0NUUkwJCTB4MTgxNAorI2RlZmluZSBDTEtfR0FUSU5HX0RNQVdfRU4JCTB4MDAwMQorI2RlZmluZSBDTEtfR0FUSU5HX0RNQVJfRU4JCTB4MDAwMgorI2RlZmluZSBDTEtfR0FUSU5HX1RYUV9FTgkJMHgwMDA0CisjZGVmaW5lIENMS19HQVRJTkdfUlhRX0VOCQkweDAwMDgKKyNkZWZpbmUgQ0xLX0dBVElOR19UWE1BQ19FTgkJMHgwMDEwCisjZGVmaW5lIENMS19HQVRJTkdfUlhNQUNfRU4JCTB4MDAyMAorCisjZGVmaW5lIENMS19HQVRJTkdfRU5fQUxMCShDTEtfR0FUSU5HX0RNQVdfRU4gfFwKKwkJCQkgQ0xLX0dBVElOR19ETUFSX0VOIHxcCisJCQkJIENMS19HQVRJTkdfVFhRX0VOICB8XAorCQkJCSBDTEtfR0FUSU5HX1JYUV9FTiAgfFwKKwkJCQkgQ0xLX0dBVElOR19UWE1BQ19FTnxcCisJCQkJIENMS19HQVRJTkdfUlhNQUNfRU4pCisKIC8qIERFQlVHIEFERFIgKi8KICNkZWZpbmUgUkVHX0RFQlVHX0RBVEEwIAkJMHgxOTAwCiAjZGVmaW5lIFJFR19ERUJVR19EQVRBMSAJCTB4MTkwNApAQCAtNzM0LDYgKzc3MywxMCBAQAogCiAjZGVmaW5lIE1JSV9QSFlTSUQxCQkJMHgwMgogI2RlZmluZSBNSUlfUEhZU0lEMgkJCTB4MDMKKyNkZWZpbmUgTDFEX01QV19QSFlJRDEJCQkweEQwMUMgIC8qIFY3ICovCisjZGVmaW5lIEwxRF9NUFdfUEhZSUQyCQkJMHhEMDFEICAvKiBWMS1WNiAqLworI2RlZmluZSBMMURfTVBXX1BIWUlEMwkJCTB4RDAxRSAgLyogVjggKi8KKwogCiAvKiBBdXRvbmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgTUlJX0FEVkVSVElTRQkJCTB4MDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYwppbmRleCAxYzNjMDQ2Li5jN2I4ZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfbWFpbi5jCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlICJhdGwxYy5oIgogCi0jZGVmaW5lIEFUTDFDX0RSVl9WRVJTSU9OICIxLjAuMC4yLU5BUEkiCisjZGVmaW5lIEFUTDFDX0RSVl9WRVJTSU9OICIxLjAuMS4wLU5BUEkiCiBjaGFyIGF0bDFjX2RyaXZlcl9uYW1lW10gPSAiYXRsMWMiOwogY2hhciBhdGwxY19kcml2ZXJfdmVyc2lvbltdID0gQVRMMUNfRFJWX1ZFUlNJT047CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRUQU5TSUNfTDJDICAgICAgMHgxMDYyCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19MMkNfQgkweDIwNjAgLyogQVI4MTUyIHYxLjEgRmFzdCAxMC8xMDAgKi8KICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0wyQ19CMgkweDIwNjIgLyogQVI4MTUyIHYyLjAgRmFzdCAxMC8xMDAgKi8KICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0wxRAkweDEwNzMgLyogQVI4MTUxIHYxLjAgR2lnYWJpdCAxMDAwICovCi0KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0wxRF8yXzAJMHgxMDgzIC8qIEFSODE1MSB2Mi4wIEdpZ2FiaXQgMTAwMCAqLwogI2RlZmluZSBMMkNCX1YxMAkJCTB4YzAKICNkZWZpbmUgTDJDQl9WMTEJCQkweGMxCiAKQEAgLTk3LDcgKzk3LDI4IEBACiAKIHN0YXRpYyBjb25zdCB1MzIgYXRsMWNfZGVmYXVsdF9tc2cgPSBORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwKIAlORVRJRl9NU0dfTElOSyB8IE5FVElGX01TR19USU1FUiB8IE5FVElGX01TR19JRkRPV04gfCBORVRJRl9NU0dfSUZVUDsKK3N0YXRpYyB2b2lkIGF0bDFjX3BjaWVfcGF0Y2goc3RydWN0IGF0bDFjX2h3ICpodykKK3sKKwl1MzIgZGF0YTsKIAorCUFUX1JFQURfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDLCAmZGF0YSk7CisJZGF0YSB8PSBQQ0lFX1BIWU1JU0NfRk9SQ0VfUkNWX0RFVDsKKwlBVF9XUklURV9SRUcoaHcsIFJFR19QQ0lFX1BIWU1JU0MsIGRhdGEpOworCisJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iICYmIGh3LT5yZXZpc2lvbl9pZCA9PSBMMkNCX1YxMCkgeworCQlBVF9SRUFEX1JFRyhodywgUkVHX1BDSUVfUEhZTUlTQzIsICZkYXRhKTsKKworCQlkYXRhICY9IH4oUENJRV9QSFlNSVNDMl9TRVJERVNfQ0RSX01BU0sgPDwKKwkJCVBDSUVfUEhZTUlTQzJfU0VSREVTX0NEUl9TSElGVCk7CisJCWRhdGEgfD0gMyA8PCBQQ0lFX1BIWU1JU0MyX1NFUkRFU19DRFJfU0hJRlQ7CisJCWRhdGEgJj0gfihQQ0lFX1BIWU1JU0MyX1NFUkRFU19USF9NQVNLIDw8CisJCQlQQ0lFX1BIWU1JU0MyX1NFUkRFU19USF9TSElGVCk7CisJCWRhdGEgfD0gMyA8PCBQQ0lFX1BIWU1JU0MyX1NFUkRFU19USF9TSElGVDsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDMiwgZGF0YSk7CisJfQorfQorCisvKiBGSVhNRTogbm8gbmVlZCBhbnkgbW9yZSA/ICovCiAvKgogICogYXRsMWNfaW5pdF9wY2llIC0gaW5pdCBQQ0lFIG1vZHVsZQogICovCkBAIC0xMjcsNiArMTQ4LDExIEBACiAJZGF0YSAmPSB+UENJRV9VQ19TRVJWUklUWV9GQ1A7CiAJQVRfV1JJVEVfUkVHKGh3LCBSRUdfUENJRV9VQ19TRVZFUklUWSwgZGF0YSk7CiAKKwlBVF9SRUFEX1JFRyhodywgUkVHX0xUU1NNX0lEX0NUUkwsICZkYXRhKTsKKwlkYXRhICY9IH5MVFNTTV9JRF9FTl9XUk87CisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTFRTU01fSURfQ1RSTCwgZGF0YSk7CisKKwlhdGwxY19wY2llX3BhdGNoKGh3KTsKIAlpZiAoZmxhZyAmIEFUTDFDX1BDSUVfTDBTX0wxX0RJU0FCTEUpCiAJCWF0bDFjX2Rpc2FibGVfbDBzX2wxKGh3KTsKIAlpZiAoZmxhZyAmIEFUTDFDX1BDSUVfUEhZX1JFU0VUKQpAQCAtMTM1LDcgKzE2MSw3IEBACiAJCUFUX1dSSVRFX1JFRyhodywgUkVHX0dQSFlfQ1RSTCwKIAkJCUdQSFlfQ1RSTF9ERUZBVUxUIHwgR1BIWV9DVFJMX0VYVF9SRVNFVCk7CiAKLQltc2xlZXAoMSk7CisJbXNsZWVwKDUpOwogfQogCiAvKgpAQCAtMTU5LDYgKzE4NSw3IEBACiB7CiAJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CiAJQVRfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkVHX0lNUiwgMCk7CisJQVRfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkVHX0lTUiwgSVNSX0RJU19JTlQpOwogCUFUX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CiAJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CiB9CkBAIC0yMzEsMTUgKzI1OCwxNSBAQAogCiAJaWYgKChwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykgPT0gMCkgewogCQkvKiBsaW5rIGRvd24gKi8KLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewotCQkJaHctPmhpYmVybmF0ZSA9IHRydWU7Ci0JCQlpZiAoYXRsMWNfc3RvcF9tYWMoaHcpICE9IDApCi0JCQkJaWYgKG5ldGlmX21zZ19odyhhZGFwdGVyKSkKLQkJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKLQkJCQkJCSJzdG9wIG1hYyBmYWlsZWRcbiIpOwotCQkJYXRsMWNfc2V0X2FzcG0oaHcsIGZhbHNlKTsKLQkJfQorCQlody0+aGliZXJuYXRlID0gdHJ1ZTsKKwkJaWYgKGF0bDFjX3N0b3BfbWFjKGh3KSAhPSAwKQorCQkJaWYgKG5ldGlmX21zZ19odyhhZGFwdGVyKSkKKwkJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAic3RvcCBtYWMgZmFpbGVkXG4iKTsKKwkJYXRsMWNfc2V0X2FzcG0oaHcsIGZhbHNlKTsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQlhdGwxY19waHlfcmVzZXQoaHcpOworCQlhdGwxY19waHlfaW5pdCgmYWRhcHRlci0+aHcpOwogCX0gZWxzZSB7CiAJCS8qIExpbmsgVXAgKi8KIAkJaHctPmhpYmVybmF0ZSA9IGZhbHNlOwpAQCAtMzA4LDYgKzMzNSw3IEBACiAJbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCiAJaWYgKGFkYXB0ZXItPndvcmtfZXZlbnQgJiBBVEwxQ19XT1JLX0VWRU5UX1JFU0VUKSB7CisJCWFkYXB0ZXItPndvcmtfZXZlbnQgJj0gfkFUTDFDX1dPUktfRVZFTlRfUkVTRVQ7CiAJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKIAkJYXRsMWNfZG93bihhZGFwdGVyKTsKIAkJYXRsMWNfdXAoYWRhcHRlcik7CkBAIC0zMTUsOCArMzQzLDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYWRhcHRlci0+d29ya19ldmVudCAmIEFUTDFDX1dPUktfRVZFTlRfTElOS19DSEFOR0UpCisJaWYgKGFkYXB0ZXItPndvcmtfZXZlbnQgJiBBVEwxQ19XT1JLX0VWRU5UX0xJTktfQ0hBTkdFKSB7CisJCWFkYXB0ZXItPndvcmtfZXZlbnQgJj0gfkFUTDFDX1dPUktfRVZFTlRfTElOS19DSEFOR0U7CiAJCWF0bDFjX2NoZWNrX2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCX0KKwlyZXR1cm47CiB9CiAKIApAQCAtNDc2LDYgKzUwNywxMyBAQAogCQluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAJCWFkYXB0ZXItPmh3Lm1heF9mcmFtZV9zaXplID0gbmV3X210dTsKIAkJYXRsMWNfc2V0X3J4YnVmc2l6ZShhZGFwdGVyLCBuZXRkZXYpOworCQlpZiAobmV3X210dSA+IE1BWF9UU09fRlJBTUVfU0laRSkgeworCQkJYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisJCQlhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCQkJYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzY7CisJCX0KIAkJYXRsMWNfZG93bihhZGFwdGVyKTsKIAkJYXRsMWNfdXAoYWRhcHRlcik7CiAJCWNsZWFyX2JpdChfX0FUX1JFU0VUVElORywgJmFkYXB0ZXItPmZsYWdzKTsKQEAgLTYxMyw2ICs2NTEsOSBAQAogCWNhc2UgUENJX0RFVklDRV9JRF9BVEhFUk9TX0wxRDoKIAkJaHctPm5pY190eXBlID0gYXRocl9sMWQ7CiAJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9BVEhFUk9TX0wxRF8yXzA6CisJCWh3LT5uaWNfdHlwZSA9IGF0aHJfbDFkXzI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTYyNyw5ICs2NjgsNyBAQAogCUFUX1JFQURfUkVHKGh3LCBSRUdfUEhZX1NUQVRVUywgJnBoeV9zdGF0dXNfZGF0YSk7CiAJQVRfUkVBRF9SRUcoaHcsIFJFR19MSU5LX0NUUkwsICZsaW5rX2N0cmxfZGF0YSk7CiAKLQlody0+Y3RybF9mbGFncyA9IEFUTDFDX0lOVFJfQ0xFQVJfT05fUkVBRCB8Ci0JCQkgQVRMMUNfSU5UUl9NT0RSVF9FTkFCTEUgIHwKLQkJCSBBVEwxQ19SWF9JUFY2X0NIS1NVTQkgIHwKKwlody0+Y3RybF9mbGFncyA9IEFUTDFDX0lOVFJfTU9EUlRfRU5BQkxFICB8CiAJCQkgQVRMMUNfVFhRX01PREVfRU5IQU5DRTsKIAlpZiAobGlua19jdHJsX2RhdGEgJiBMSU5LX0NUUkxfTDBTX0VOKQogCQlody0+Y3RybF9mbGFncyB8PSBBVEwxQ19BU1BNX0wwU19TVVBQT1JUOwpAQCAtNjM3LDEyICs2NzYsMTIgQEAKIAkJaHctPmN0cmxfZmxhZ3MgfD0gQVRMMUNfQVNQTV9MMV9TVVBQT1JUOwogCWlmIChsaW5rX2N0cmxfZGF0YSAmIExJTktfQ1RSTF9FWFRfU1lOQykKIAkJaHctPmN0cmxfZmxhZ3MgfD0gQVRMMUNfTElOS19FWFRfU1lOQzsKKwlody0+Y3RybF9mbGFncyB8PSBBVEwxQ19BU1BNX0NUUkxfTU9OOwogCiAJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxYyB8fAotCSAgICBody0+bmljX3R5cGUgPT0gYXRocl9sMWQpIHsKLQkJaHctPmN0cmxfZmxhZ3MgfD0gQVRMMUNfQVNQTV9DVFJMX01PTjsKKwkgICAgaHctPm5pY190eXBlID09IGF0aHJfbDFkIHx8CisJICAgIGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZF8yKQogCQlody0+bGlua19jYXBfZmxhZ3MgfD0gQVRMMUNfTElOS19DQVBfMTAwME07Ci0JfQogCXJldHVybiAwOwogfQogLyoKQEAgLTY1Nyw2ICs2OTYsOCBAQAogewogCXN0cnVjdCBhdGwxY19odyAqaHcgICA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3QgcGNpX2RldgkqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdTMyIHJldmlzaW9uOworCiAKIAlhZGFwdGVyLT53b2wgPSAwOwogCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOwpAQCAtNjY5LDcgKzcxMCw4IEBACiAJaHctPmRldmljZV9pZCA9IHBkZXYtPmRldmljZTsKIAlody0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CiAJaHctPnN1YnN5c3RlbV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7Ci0KKwlBVF9SRUFEX1JFRyhodywgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOworCWh3LT5yZXZpc2lvbl9pZCA9IHJldmlzaW9uICYgMHhGRjsKIAkvKiBiZWZvcmUgbGluayB1cCwgd2UgYXNzdW1lIGhpYmVybmF0ZSBpcyB0cnVlICovCiAJaHctPmhpYmVybmF0ZSA9IHRydWU7CiAJaHctPm1lZGlhX3R5cGUgPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SOwpAQCAtOTc0LDYgKzEwMTYsNyBAQAogCXN0cnVjdCBhdGwxY19jbWIgKmNtYiA9IChzdHJ1Y3QgYXRsMWNfY21iICopICZhZGFwdGVyLT5jbWI7CiAJc3RydWN0IGF0bDFjX3NtYiAqc21iID0gKHN0cnVjdCBhdGwxY19zbWIgKikgJmFkYXB0ZXItPnNtYjsKIAlpbnQgaTsKKwl1MzIgZGF0YTsKIAogCS8qIFRQRCAqLwogCUFUX1dSSVRFX1JFRyhodywgUkVHX1RYX0JBU0VfQUREUl9ISSwKQEAgLTEwMTcsNiArMTA2MCwyMyBAQAogCQkJKHUzMikoKHNtYi0+ZG1hICYgQVRfRE1BX0hJX0FERFJfTUFTSykgPj4gMzIpKTsKIAlBVF9XUklURV9SRUcoaHcsIFJFR19TTUJfQkFTRV9BRERSX0xPLAogCQkJKHUzMikoc21iLT5kbWEgJiBBVF9ETUFfTE9fQUREUl9NQVNLKSk7CisJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iKSB7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1NSQU1fUlhGX0xFTiwgMHgwMmEwTCk7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1NSQU1fVFhGX0xFTiwgMHgwMTAwTCk7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1NSQU1fUlhGX0FERFIsIDB4MDI5ZjAwMDBMKTsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfU1JBTV9SRkQwX0lORk8sIDB4MDJiZjAyYTBMKTsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfU1JBTV9UWEZfQUREUiwgMHgwM2JmMDJjMEwpOworCQlBVF9XUklURV9SRUcoaHcsIFJFR19TUkFNX1RSRF9BRERSLCAweDAzZGYwM2MwTCk7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX1RYRl9XQVRFUl9NQVJLLCAwKTsJLyogVFggd2F0ZXJtYXJrLCB0byBlbnRlciBsMSBzdGF0ZS4qLworCQlBVF9XUklURV9SRUcoaHcsIFJFR19SWERfRE1BX0NUUkwsIDApOwkJLyogUlhEIHRocmVzaG9sZC4qLworCX0KKwlpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDJjX2IgfHwgaHctPm5pY190eXBlID09IGF0aHJfbDFkXzIpIHsKKwkJCS8qIFBvd2VyIFNhdmluZyBmb3IgTDJjX0IgKi8KKwkJQVRfUkVBRF9SRUcoaHcsIFJFR19TRVJERVNfTE9DSywgJmRhdGEpOworCQlkYXRhIHw9IFNFUkRFU19NQUNfQ0xLX1NMT1dET1dOOworCQlkYXRhIHw9IFNFUkRFU19QWUhfQ0xLX1NMT1dET1dOOworCQlBVF9XUklURV9SRUcoaHcsIFJFR19TRVJERVNfTE9DSywgZGF0YSk7CisJfQogCS8qIExvYWQgYWxsIG9mIGJhc2UgYWRkcmVzcyBhYm92ZSAqLwogCUFUX1dSSVRFX1JFRyhodywgUkVHX0xPQURfUFRSLCAxKTsKIH0KQEAgLTEwMjksNiArMTA4OSw3IEBACiAJdTE2IHR4X29mZmxvYWRfdGhyZXNoOwogCXUzMiB0eHFfY3RybF9kYXRhOwogCXUzMiBleHRyYV9zaXplID0gMDsgICAgIC8qIEp1bWJvIGZyYW1lIHRocmVzaG9sZCBpbiBRV09SRCB1bml0ICovCisJdTMyIG1heF9wYXlfbG9hZF9kYXRhOwogCiAJZXh0cmFfc2l6ZSA9IEVUSF9ITEVOICsgVkxBTl9ITEVOICsgRVRIX0ZDU19MRU47CiAJdHhfb2ZmbG9hZF90aHJlc2ggPSBNQVhfVFhfT0ZGTE9BRF9USFJFU0g7CkBAIC0xMDQ2LDggKzExMDcsMTEgQEAKIAkJCVRYUV9OVU1fVFBEX0JVUlNUX1NISUZUOwogCWlmIChody0+Y3RybF9mbGFncyAmIEFUTDFDX1RYUV9NT0RFX0VOSEFOQ0UpCiAJCXR4cV9jdHJsX2RhdGEgfD0gVFhRX0NUUkxfRU5IX01PREU7Ci0JdHhxX2N0cmxfZGF0YSB8PSAoYXRsMWNfcGF5X2xvYWRfc2l6ZVtody0+ZG1hcl9ibG9ja10gJgorCW1heF9wYXlfbG9hZF9kYXRhID0gKGF0bDFjX3BheV9sb2FkX3NpemVbaHctPmRtYXJfYmxvY2tdICYKIAkJCVRYUV9UWEZfQlVSU1RfTlVNX01BU0spIDw8IFRYUV9UWEZfQlVSU1RfTlVNX1NISUZUOworCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYiB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYjIpCisJCW1heF9wYXlfbG9hZF9kYXRhID4+PSAxOworCXR4cV9jdHJsX2RhdGEgfD0gbWF4X3BheV9sb2FkX2RhdGE7CiAKIAlBVF9XUklURV9SRUcoaHcsIFJFR19UWFFfQ1RSTCwgdHhxX2N0cmxfZGF0YSk7CiB9CkBAIC0xMDc4LDcgKzExNDIsNyBAQAogCXJ4cV9jdHJsX2RhdGEgfD0gKGh3LT5yc3NfaGFzaF9iaXRzICYgUlNTX0hBU0hfQklUU19NQVNLKSA8PAogCQkJUlNTX0hBU0hfQklUU19TSElGVDsKIAlpZiAoaHctPmN0cmxfZmxhZ3MgJiBBVEwxQ19BU1BNX0NUUkxfTU9OKQotCQlyeHFfY3RybF9kYXRhIHw9IChBU1BNX1RIUlVQVVRfTElNSVRfMTAwTSAmCisJCXJ4cV9jdHJsX2RhdGEgfD0gKEFTUE1fVEhSVVBVVF9MSU1JVF8xTSAmCiAJCQlBU1BNX1RIUlVQVVRfTElNSVRfTUFTSykgPDwgQVNQTV9USFJVUFVUX0xJTUlUX1NISUZUOwogCiAJQVRfV1JJVEVfUkVHKGh3LCBSRUdfUlhRX0NUUkwsIHJ4cV9jdHJsX2RhdGEpOwpAQCAtMTE5OCwyMSArMTI2MiwyMyBAQAogewogCXN0cnVjdCBhdGwxY19hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxY19hZGFwdGVyICopaHctPmFkYXB0ZXI7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCWludCByZXQ7CisJdTMyIG1hc3Rlcl9jdHJsX2RhdGEgPSAwOwogCiAJQVRfV1JJVEVfUkVHKGh3LCBSRUdfSU1SLCAwKTsKIAlBVF9XUklURV9SRUcoaHcsIFJFR19JU1IsIElTUl9ESVNfSU5UKTsKIAotCXJldCA9IGF0bDFjX3N0b3BfbWFjKGh3KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWF0bDFjX3N0b3BfbWFjKGh3KTsKIAkvKgogCSAqIElzc3VlIFNvZnQgUmVzZXQgdG8gdGhlIE1BQy4gIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCdzCiAJICogdHJhbnNtaXQsIHJlY2VpdmUsIERNQS4gIEl0IHdpbGwgbm90IGVmZmVjdAogCSAqIHRoZSBjdXJyZW50IFBDSSBjb25maWd1cmF0aW9uLiAgVGhlIGdsb2JhbCByZXNldCBiaXQgaXMgc2VsZi0KIAkgKiBjbGVhcmluZywgYW5kIHNob3VsZCBjbGVhciB3aXRoaW4gYSBtaWNyb3NlY29uZC4KIAkgKi8KLQlBVF9XUklURV9SRUdXKGh3LCBSRUdfTUFTVEVSX0NUUkwsIE1BU1RFUl9DVFJMX1NPRlRfUlNUKTsKKwlBVF9SRUFEX1JFRyhodywgUkVHX01BU1RFUl9DVFJMLCAmbWFzdGVyX2N0cmxfZGF0YSk7CisJbWFzdGVyX2N0cmxfZGF0YSB8PSBNQVNURVJfQ1RSTF9PT0JfRElTX09GRjsKKwlBVF9XUklURV9SRUdXKGh3LCBSRUdfTUFTVEVSX0NUUkwsICgobWFzdGVyX2N0cmxfZGF0YSB8IE1BU1RFUl9DVFJMX1NPRlRfUlNUKQorCQkJJiAweEZGRkYpKTsKKwogCUFUX1dSSVRFX0ZMVVNIKGh3KTsKIAltc2xlZXAoMTApOwogCS8qIFdhaXQgYXQgbGVhc3QgMTBtcyBmb3IgQWxsIG1vZHVsZSB0byBiZSBJZGxlICovCkBAIC0xMjUzLDQyICsxMzE5LDM5IEBACiB7CiAJdTMyIHBtX2N0cmxfZGF0YTsKIAl1MzIgbGlua19jdHJsX2RhdGE7CisJdTMyIGxpbmtfbDFfdGltZXIgPSAweEY7CiAKIAlBVF9SRUFEX1JFRyhodywgUkVHX1BNX0NUUkwsICZwbV9jdHJsX2RhdGEpOwogCUFUX1JFQURfUkVHKGh3LCBSRUdfTElOS19DVFJMLCAmbGlua19jdHJsX2RhdGEpOwotCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9TRVJERVNfUERfRVhfTDE7CiAKKwlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfU0VSREVTX1BEX0VYX0wxOwogCXBtX2N0cmxfZGF0YSAmPSAgfihQTV9DVFJMX0wxX0VOVFJZX1RJTUVSX01BU0sgPDwKIAkJCVBNX0NUUkxfTDFfRU5UUllfVElNRVJfU0hJRlQpOwogCXBtX2N0cmxfZGF0YSAmPSB+KFBNX0NUUkxfTENLREVUX1RJTUVSX01BU0sgPDwKLQkJCSAgUE1fQ1RSTF9MQ0tERVRfVElNRVJfU0hJRlQpOworCQkJUE1fQ1RSTF9MQ0tERVRfVElNRVJfU0hJRlQpOworCXBtX2N0cmxfZGF0YSB8PSBBVF9MQ0tERVRfVElNRVIJPDwgUE1fQ1RSTF9MQ0tERVRfVElNRVJfU0hJRlQ7CiAKLQlwbV9jdHJsX2RhdGEgfD0gUE1fQ1RSTF9NQUNfQVNQTV9DSEs7Ci0JcG1fY3RybF9kYXRhICY9IH5QTV9DVFJMX0FTUE1fTDFfRU47Ci0JcG1fY3RybF9kYXRhIHw9IFBNX0NUUkxfUkJFUl9FTjsKLQlwbV9jdHJsX2RhdGEgfD0gUE1fQ1RSTF9TREVTX0VOOwotCi0JaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iIHx8Ci0JICAgIGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZCB8fAotCSAgICBody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYjIpIHsKKwlpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDJjX2IgfHwgaHctPm5pY190eXBlID09IGF0aHJfbDFkIHx8CisJCWh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iMiB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMWRfMikgewogCQlsaW5rX2N0cmxfZGF0YSAmPSB+TElOS19DVFJMX0VYVF9TWU5DOwogCQlpZiAoIShody0+Y3RybF9mbGFncyAmIEFUTDFDX0FQU19NT0RFX0VOQUJMRSkpIHsKLQkJCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYiAmJgotCQkJICAgIGh3LT5yZXZpc2lvbl9pZCA9PSBMMkNCX1YxMCkKKwkJCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYiAmJiBody0+cmV2aXNpb25faWQgPT0gTDJDQl9WMTApCiAJCQkJbGlua19jdHJsX2RhdGEgfD0gTElOS19DVFJMX0VYVF9TWU5DOwogCQl9CiAKIAkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTElOS19DVFJMLCBsaW5rX2N0cmxfZGF0YSk7CiAKLQkJcG1fY3RybF9kYXRhIHw9IFBNX0NUUkxfUENJRV9SRUNWOwotCQlwbV9jdHJsX2RhdGEgfD0gQVRfQVNQTV9MMV9USU1FUiA8PCBQTV9DVFJMX1BNX1JFUV9USU1FUl9TSElGVDsKLQkJcG1fY3RybF9kYXRhICY9IH5QTV9DVFJMX0VOX0JVRlNfUlhfTDBTOworCQlwbV9jdHJsX2RhdGEgfD0gUE1fQ1RSTF9SQ1ZSX1dUX1RJTUVSOworCQlwbV9jdHJsX2RhdGEgJj0gfihQTV9DVFJMX1BNX1JFUV9USU1FUl9NQVNLIDw8CisJCQlQTV9DVFJMX1BNX1JFUV9USU1FUl9TSElGVCk7CisJCXBtX2N0cmxfZGF0YSB8PSBBVF9BU1BNX0wxX1RJTUVSIDw8CisJCQlQTV9DVFJMX1BNX1JFUV9USU1FUl9TSElGVDsKIAkJcG1fY3RybF9kYXRhICY9IH5QTV9DVFJMX1NBX0RMWV9FTjsKIAkJcG1fY3RybF9kYXRhICY9IH5QTV9DVFJMX0hPVFJTVDsKIAkJcG1fY3RybF9kYXRhIHw9IDEgPDwgUE1fQ1RSTF9MMV9FTlRSWV9USU1FUl9TSElGVDsKIAkJcG1fY3RybF9kYXRhIHw9IFBNX0NUUkxfU0VSREVTX1BEX0VYX0wxOwogCX0KLQorCXBtX2N0cmxfZGF0YSB8PSBQTV9DVFJMX01BQ19BU1BNX0NISzsKIAlpZiAobGlua3VwKSB7CiAJCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9BU1BNX0wxX0VOOwogCQlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfQVNQTV9MMFNfRU47CkBAIC0xMjk3LDI3ICsxMzYwLDI2IEBACiAJCWlmIChody0+Y3RybF9mbGFncyAmIEFUTDFDX0FTUE1fTDBTX1NVUFBPUlQpCiAJCQlwbV9jdHJsX2RhdGEgfD0gUE1fQ1RSTF9BU1BNX0wwU19FTjsKIAotCQlpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDJjX2IgfHwKLQkJICAgIGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZCB8fAotCQkgICAgaHctPm5pY190eXBlID09IGF0aHJfbDJjX2IyKSB7CisJCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYiB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMWQgfHwKKwkJCWh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iMiB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMWRfMikgewogCQkJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iKQogCQkJCWlmICghKGh3LT5jdHJsX2ZsYWdzICYgQVRMMUNfQVBTX01PREVfRU5BQkxFKSkKLQkJCQkJcG1fY3RybF9kYXRhICY9IFBNX0NUUkxfQVNQTV9MMFNfRU47CisJCQkJCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9BU1BNX0wwU19FTjsKIAkJCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9TRVJERVNfTDFfRU47CiAJCQlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfU0VSREVTX1BMTF9MMV9FTjsKIAkJCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9TRVJERVNfQlVEU19SWF9MMV9FTjsKIAkJCXBtX2N0cmxfZGF0YSB8PSBQTV9DVFJMX0NMS19TV0hfTDE7Ci0JCQlpZiAoaHctPmFkYXB0ZXItPmxpbmtfc3BlZWQgPT0gU1BFRURfMTAwIHx8Ci0JCQkgICAgaHctPmFkYXB0ZXItPmxpbmtfc3BlZWQgPT0gU1BFRURfMTAwMCkgewotCQkJCXBtX2N0cmxfZGF0YSAmPQotCQkJCQl+KFBNX0NUUkxfTDFfRU5UUllfVElNRVJfTUFTSyA8PAotCQkJCQkgIFBNX0NUUkxfTDFfRU5UUllfVElNRVJfU0hJRlQpOwotCQkJCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMWQpCi0JCQkJCXBtX2N0cmxfZGF0YSB8PSAweEYgPDwKLQkJCQkJCVBNX0NUUkxfTDFfRU5UUllfVElNRVJfU0hJRlQ7Ci0JCQkJZWxzZQotCQkJCQlwbV9jdHJsX2RhdGEgfD0gNyA8PAotCQkJCQkJUE1fQ1RSTF9MMV9FTlRSWV9USU1FUl9TSElGVDsKKwkJaWYgKGh3LT5hZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMCB8fAorCQkJCWh3LT5hZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJCQlwbV9jdHJsX2RhdGEgJj0gIH4oUE1fQ1RSTF9MMV9FTlRSWV9USU1FUl9NQVNLIDw8CisJCQkJCVBNX0NUUkxfTDFfRU5UUllfVElNRVJfU0hJRlQpOworCQkJCWlmIChody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYikKKwkJCQkJbGlua19sMV90aW1lciA9IDc7CisJCQkJZWxzZSBpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDJjX2IyIHx8CisJCQkJCWh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZF8yKQorCQkJCQlsaW5rX2wxX3RpbWVyID0gNDsKKwkJCQlwbV9jdHJsX2RhdGEgfD0gbGlua19sMV90aW1lciA8PAorCQkJCQlQTV9DVFJMX0wxX0VOVFJZX1RJTUVSX1NISUZUOwogCQkJfQogCQl9IGVsc2UgewogCQkJcG1fY3RybF9kYXRhIHw9IFBNX0NUUkxfU0VSREVTX0wxX0VOOwpAQCAtMTMyNiwyNCArMTM4OCwxMiBAQAogCQkJcG1fY3RybF9kYXRhICY9IH5QTV9DVFJMX0NMS19TV0hfTDE7CiAJCQlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfQVNQTV9MMFNfRU47CiAJCQlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfQVNQTV9MMV9FTjsKLQkJfQotCQlhdGwxY193cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDB4MjkpOwotCQlpZiAoaHctPmFkYXB0ZXItPmxpbmtfc3BlZWQgPT0gU1BFRURfMTApCi0JCQlpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDFkKQotCQkJCWF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfQUREUiwgMHhCNjlEKTsKLQkJCWVsc2UKLQkJCQlhdGwxY193cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsIDB4QjZERCk7Ci0JCWVsc2UgaWYgKGh3LT5hZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMCkKLQkJCWF0bDFjX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfREFUQSwgMHhCMkREKTsKLQkJZWxzZQotCQkJYXRsMWNfd3JpdGVfcGh5X3JlZyhodywgTUlJX0RCR19EQVRBLCAweDk2REQpOwogCisJCX0KIAl9IGVsc2UgewotCQlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfU0VSREVTX0JVRFNfUlhfTDFfRU47CiAJCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9TRVJERVNfTDFfRU47CiAJCXBtX2N0cmxfZGF0YSAmPSB+UE1fQ1RSTF9BU1BNX0wwU19FTjsKIAkJcG1fY3RybF9kYXRhICY9IH5QTV9DVFJMX1NFUkRFU19QTExfTDFfRU47Ci0KIAkJcG1fY3RybF9kYXRhIHw9IFBNX0NUUkxfQ0xLX1NXSF9MMTsKIAogCQlpZiAoaHctPmN0cmxfZmxhZ3MgJiBBVEwxQ19BU1BNX0wxX1NVUFBPUlQpCkBAIC0xMzUxLDggKzE0MDEsOSBAQAogCQllbHNlCiAJCQlwbV9jdHJsX2RhdGEgJj0gflBNX0NUUkxfQVNQTV9MMV9FTjsKIAl9Ci0KIAlBVF9XUklURV9SRUcoaHcsIFJFR19QTV9DVFJMLCBwbV9jdHJsX2RhdGEpOworCisJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBhdGwxY19zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMWNfYWRhcHRlciAqYWRhcHRlcikKQEAgLTEzOTEsNyArMTQ0Miw4IEBACiAJCW1hY19jdHJsX2RhdGEgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOwogCiAJbWFjX2N0cmxfZGF0YSB8PSBNQUNfQ1RSTF9TSU5HTEVfUEFVU0VfRU47Ci0JaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wxZCB8fCBody0+bmljX3R5cGUgPT0gYXRocl9sMmNfYjIpIHsKKwlpZiAoaHctPm5pY190eXBlID09IGF0aHJfbDFkIHx8IGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iMiB8fAorCSAgICBody0+bmljX3R5cGUgPT0gYXRocl9sMWRfMikgewogCQltYWNfY3RybF9kYXRhIHw9IE1BQ19DVFJMX1NQRUVEX01PREVfU1c7CiAJCW1hY19jdHJsX2RhdGEgfD0gTUFDX0NUUkxfSEFTSF9BTEdfQ1JDMzI7CiAJfQpAQCAtMTQwOSw2ICsxNDYxLDcgQEAKIAlzdHJ1Y3QgYXRsMWNfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBtYXN0ZXJfY3RybF9kYXRhID0gMDsKIAl1MzIgaW50cl9tb2RydF9kYXRhOworCXUzMiBkYXRhOwogCiAJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwogCUFUX1dSSVRFX1JFRyhodywgUkVHX0lTUiwgMHhGRkZGRkZGRik7CkBAIC0xNDE4LDYgKzE0NzEsMTUgQEAKIAkgKiBIVyB3aWxsIGVuYWJsZSBzZWxmIHRvIGFzc2VydCBpbnRlcnJ1cHQgZXZlbnQgdG8gc3lzdGVtIGFmdGVyCiAJICogd2FpdGluZyB4LXRpbWUgZm9yIHNvZnR3YXJlIHRvIG5vdGlmeSBpdCBhY2NlcHQgaW50ZXJydXB0LgogCSAqLworCisJZGF0YSA9IENMS19HQVRJTkdfRU5fQUxMOworCWlmIChody0+Y3RybF9mbGFncyAmIEFUTDFDX0NMS19HQVRJTkdfRU4pIHsKKwkJaWYgKGh3LT5uaWNfdHlwZSA9PSBhdGhyX2wyY19iKQorCQkJZGF0YSAmPSB+Q0xLX0dBVElOR19SWE1BQ19FTjsKKwl9IGVsc2UKKwkJZGF0YSA9IDA7CisJQVRfV1JJVEVfUkVHKGh3LCBSRUdfQ0xLX0dBVElOR19DVFJMLCBkYXRhKTsKKwogCUFUX1dSSVRFX1JFRyhodywgUkVHX0lOVF9SRVRSSUdfVElNRVIsCiAJCWh3LT5pY3QgJiBJTlRfUkVUUklHX1RJTUVSX01BU0spOwogCkBAIC0xNDM2LDYgKzE0OTgsNyBAQAogCWlmIChody0+Y3RybF9mbGFncyAmIEFUTDFDX0lOVFJfQ0xFQVJfT05fUkVBRCkKIAkJbWFzdGVyX2N0cmxfZGF0YSB8PSBNQVNURVJfQ1RSTF9JTlRfUkRDTFI7CiAKKwltYXN0ZXJfY3RybF9kYXRhIHw9IE1BU1RFUl9DVFJMX1NBX1RJTUVSX0VOOwogCUFUX1dSSVRFX1JFRyhodywgUkVHX01BU1RFUl9DVFJMLCBtYXN0ZXJfY3RybF9kYXRhKTsKIAogCWlmIChody0+Y3RybF9mbGFncyAmIEFUTDFDX0NNQl9FTkFCTEUpIHsKQEAgLTE2MjQsMTEgKzE2ODcsOSBAQAogCQkJCQkiYXRsMWMgaGFyZHdhcmUgZXJyb3IgKHN0YXR1cyA9IDB4JXgpXG4iLAogCQkJCQlzdGF0dXMgJiBJU1JfRVJST1IpOwogCQkJLyogcmVzZXQgTUFDICovCi0JCQlody0+aW50cl9tYXNrICY9IH5JU1JfRVJST1I7Ci0JCQlBVF9XUklURV9SRUcoaHcsIFJFR19JTVIsIGh3LT5pbnRyX21hc2spOwogCQkJYWRhcHRlci0+d29ya19ldmVudCB8PSBBVEwxQ19XT1JLX0VWRU5UX1JFU0VUOwogCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+Y29tbW9uX3Rhc2spOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJCX0KIAogCQlpZiAoc3RhdHVzICYgSVNSX09WRVIpCkBAIC0yMzAzLDcgKzIzNjQsNiBAQAogCW5hcGlfZGlzYWJsZSgmYWRhcHRlci0+bmFwaSk7CiAJYXRsMWNfaXJxX2Rpc2FibGUoYWRhcHRlcik7CiAJYXRsMWNfZnJlZV9pcnEoYWRhcHRlcik7Ci0JQVRfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkVHX0lTUiwgSVNSX0RJU19JTlQpOwogCS8qIHJlc2V0IE1BQyB0byBkaXNhYmxlIGFsbCBSWC9UWCAqLwogCWF0bDFjX3Jlc2V0X21hYygmYWRhcHRlci0+aHcpOwogCW1zbGVlcCgxKTsKQEAgLTIzODcsNzkgKzI0NDcsNjggQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdGwxY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgYXRsMWNfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiBjdHJsOwotCXUzMiBtYWNfY3RybF9kYXRhOwotCXUzMiBtYXN0ZXJfY3RybF9kYXRhOworCXUzMiBtYWNfY3RybF9kYXRhID0gMDsKKwl1MzIgbWFzdGVyX2N0cmxfZGF0YSA9IDA7CiAJdTMyIHdvbF9jdHJsX2RhdGEgPSAwOwotCXUxNiBtaWlfYm1zcl9kYXRhOwotCXUxNiBzYXZlX2F1dG9uZWdfYWR2ZXJ0aXNlZDsKLQl1MTYgbWlpX2ludHJfc3RhdHVzX2RhdGE7CisJdTE2IG1paV9pbnRyX3N0YXR1c19kYXRhID0gMDsKIAl1MzIgd3VmYyA9IGFkYXB0ZXItPndvbDsKLQl1MzIgaTsKIAlpbnQgcmV0dmFsID0gMDsKIAorCWF0bDFjX2Rpc2FibGVfbDBzX2wxKGh3KTsKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCVdBUk5fT04odGVzdF9iaXQoX19BVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncykpOwogCQlhdGwxY19kb3duKGFkYXB0ZXIpOwogCX0KIAluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7Ci0JYXRsMWNfZGlzYWJsZV9sMHNfbDEoaHcpOwogCXJldHZhbCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JaWYgKHd1ZmMpIHsKLQkJQVRfUkVBRF9SRUcoaHcsIFJFR19NQVNURVJfQ1RSTCwgJm1hc3Rlcl9jdHJsX2RhdGEpOwotCQltYXN0ZXJfY3RybF9kYXRhICY9IH5NQVNURVJfQ1RSTF9DTEtfU0VMX0RJUzsKIAotCQkvKiBnZXQgbGluayBzdGF0dXMgKi8KLQkJYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSZtaWlfYm1zcl9kYXRhKTsKLQkJYXRsMWNfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSZtaWlfYm1zcl9kYXRhKTsKLQkJc2F2ZV9hdXRvbmVnX2FkdmVydGlzZWQgPSBody0+YXV0b25lZ19hZHZlcnRpc2VkOwotCQlody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7Ci0JCWlmIChhdGwxY19yZXN0YXJ0X2F1dG9uZWcoaHcpICE9IDApCi0JCQlpZiAobmV0aWZfbXNnX2xpbmsoYWRhcHRlcikpCi0JCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInBoeSBhdXRvbmVnIGZhaWxlZFxuIik7Ci0JCWh3LT5waHlfY29uZmlndXJlZCA9IGZhbHNlOyAvKiByZS1pbml0IFBIWSB3aGVuIHJlc3VtZSAqLwotCQlody0+YXV0b25lZ19hZHZlcnRpc2VkID0gc2F2ZV9hdXRvbmVnX2FkdmVydGlzZWQ7CisJaWYgKHd1ZmMpCisJCWlmIChhdGwxY19waHlfcG93ZXJfc2F2aW5nKGh3KSAhPSAwKQorCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicGh5IHBvd2VyIHNhdmluZyBmYWlsZWQiKTsKKworCUFUX1JFQURfUkVHKGh3LCBSRUdfTUFTVEVSX0NUUkwsICZtYXN0ZXJfY3RybF9kYXRhKTsKKwlBVF9SRUFEX1JFRyhodywgUkVHX01BQ19DVFJMLCAmbWFjX2N0cmxfZGF0YSk7CisKKwltYXN0ZXJfY3RybF9kYXRhICY9IH5NQVNURVJfQ1RSTF9DTEtfU0VMX0RJUzsKKwltYWNfY3RybF9kYXRhICY9IH4oTUFDX0NUUkxfUFJNTEVOX01BU0sgPDwgTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKKwltYWNfY3RybF9kYXRhIHw9ICgoKHUzMilhZGFwdGVyLT5ody5wcmVhbWJsZV9sZW4gJgorCQkJTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8CisJCQlNQUNfQ1RSTF9QUk1MRU5fU0hJRlQpOworCW1hY19jdHJsX2RhdGEgJj0gfihNQUNfQ1RSTF9TUEVFRF9NQVNLIDw8IE1BQ19DVFJMX1NQRUVEX1NISUZUKTsKKwltYWNfY3RybF9kYXRhICY9IH5NQUNfQ1RSTF9EVVBMWDsKKworCWlmICh3dWZjKSB7CisJCW1hY19jdHJsX2RhdGEgfD0gTUFDX0NUUkxfUlhfRU47CisJCWlmIChhZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMDAgfHwKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPT0gU1BFRURfMCkgeworCQkJbWFjX2N0cmxfZGF0YSB8PSBhdGwxY19tYWNfc3BlZWRfMTAwMCA8PAorCQkJCQlNQUNfQ1RSTF9TUEVFRF9TSElGVDsKKwkJCW1hY19jdHJsX2RhdGEgfD0gTUFDX0NUUkxfRFVQTFg7CisJCX0gZWxzZQorCQkJbWFjX2N0cmxfZGF0YSB8PSBhdGwxY19tYWNfc3BlZWRfMTBfMTAwIDw8CisJCQkJCU1BQ19DVFJMX1NQRUVEX1NISUZUOworCisJCWlmIChhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCW1hY19jdHJsX2RhdGEgfD0gTUFDX0NUUkxfRFVQTFg7CisKIAkJLyogdHVybiBvbiBtYWdpYyBwYWNrZXQgd29sICovCiAJCWlmICh3dWZjICYgQVRfV1VGQ19NQUcpCi0JCQl3b2xfY3RybF9kYXRhID0gV09MX01BR0lDX0VOIHwgV09MX01BR0lDX1BNRV9FTjsKKwkJCXdvbF9jdHJsX2RhdGEgfD0gV09MX01BR0lDX0VOIHwgV09MX01BR0lDX1BNRV9FTjsKIAogCQlpZiAod3VmYyAmIEFUX1dVRkNfTE5LQykgewotCQkJZm9yIChpID0gMDsgaSA8IEFUX1NVU1BFTkRfTElOS19USU1FT1VUOyBpKyspIHsKLQkJCQltc2xlZXAoMTAwKTsKLQkJCQlhdGwxY19yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLAotCQkJCQkodTE2ICopJm1paV9ibXNyX2RhdGEpOwotCQkJCWlmIChtaWlfYm1zcl9kYXRhICYgQk1TUl9MU1RBVFVTKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgobWlpX2Jtc3JfZGF0YSAmIEJNU1JfTFNUQVRVUykgPT0gMCkKLQkJCQlpZiAobmV0aWZfbXNnX2xpbmsoYWRhcHRlcikpCi0JCQkJCWRldl93YXJuKCZwZGV2LT5kZXYsCi0JCQkJCQkiJXM6IExpbmsgbWF5IGNoYW5nZSIKLQkJCQkJCSJ3aGVuIHN1c3BlbmRcbiIsCi0JCQkJCQlhdGwxY19kcml2ZXJfbmFtZSk7CiAJCQl3b2xfY3RybF9kYXRhIHw9ICBXT0xfTElOS19DSEdfRU4gfCBXT0xfTElOS19DSEdfUE1FX0VOOwogCQkJLyogb25seSBsaW5rIHVwIGNhbiB3YWtlIHVwICovCiAJCQlpZiAoYXRsMWNfd3JpdGVfcGh5X3JlZyhodywgTUlJX0lFUiwgSUVSX0xJTktfVVApICE9IDApIHsKLQkJCQlpZiAobmV0aWZfbXNnX2xpbmsoYWRhcHRlcikpCi0JCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkJCSIlczogcmVhZCB3cml0ZSBwaHkgIgotCQkJCQkJInJlZ2lzdGVyIGZhaWxlZC5cbiIsCi0JCQkJCQlhdGwxY19kcml2ZXJfbmFtZSk7Ci0JCQkJZ290byB3b2xfZGlzOworCQkJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiByZWFkIHdyaXRlIHBoeSAiCisJCQkJCQkgICJyZWdpc3RlciBmYWlsZWQuXG4iLAorCQkJCQkJICBhdGwxY19kcml2ZXJfbmFtZSk7CiAJCQl9CiAJCX0KIAkJLyogY2xlYXIgcGh5IGludGVycnVwdCAqLwogCQlhdGwxY19yZWFkX3BoeV9yZWcoaHcsIE1JSV9JU1IsICZtaWlfaW50cl9zdGF0dXNfZGF0YSk7CiAJCS8qIENvbmZpZyBNQUMgQ3RybCByZWdpc3RlciAqLwotCQltYWNfY3RybF9kYXRhID0gTUFDX0NUUkxfUlhfRU47Ci0JCS8qIHNldCB0byAxMC8xMDBNIGhhbHQgZHVwbGV4ICovCi0JCW1hY19jdHJsX2RhdGEgfD0gYXRsMWNfbWFjX3NwZWVkXzEwXzEwMCA8PCBNQUNfQ1RSTF9TUEVFRF9TSElGVDsKLQkJbWFjX2N0cmxfZGF0YSB8PSAoKCh1MzIpYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuICYKLQkJCQkgTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8Ci0JCQkJIE1BQ19DVFJMX1BSTUxFTl9TSElGVCk7Ci0KIAkJaWYgKGFkYXB0ZXItPnZsZ3JwKQogCQkJbWFjX2N0cmxfZGF0YSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKIApAQCAtMjQ2NywzNyArMjUxNiwzMCBAQAogCQlpZiAod3VmYyAmIEFUX1dVRkNfTUFHKQogCQkJbWFjX2N0cmxfZGF0YSB8PSBNQUNfQ1RSTF9CQ19FTjsKIAotCQlpZiAobmV0aWZfbXNnX2h3KGFkYXB0ZXIpKQotCQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJCSIlczogc3VzcGVuZCBNQUM9MHgleFxuIiwKLQkJCQlhdGwxY19kcml2ZXJfbmFtZSwgbWFjX2N0cmxfZGF0YSk7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogc3VzcGVuZCBNQUM9MHgleFxuIiwKKwkJCWF0bDFjX2RyaXZlcl9uYW1lLCBtYWNfY3RybF9kYXRhKTsKIAkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfTUFTVEVSX0NUUkwsIG1hc3Rlcl9jdHJsX2RhdGEpOwogCQlBVF9XUklURV9SRUcoaHcsIFJFR19XT0xfQ1RSTCwgd29sX2N0cmxfZGF0YSk7CiAJCUFUX1dSSVRFX1JFRyhodywgUkVHX01BQ19DVFJMLCBtYWNfY3RybF9kYXRhKTsKIAogCQkvKiBwY2llIHBhdGNoICovCi0JCUFUX1JFQURfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDLCAmY3RybCk7Ci0JCWN0cmwgfD0gUENJRV9QSFlNSVNDX0ZPUkNFX1JDVl9ERVQ7Ci0JCUFUX1dSSVRFX1JFRyhodywgUkVHX1BDSUVfUEhZTUlTQywgY3RybCk7CisJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmcGRldi0+ZGV2LCAxKTsKIAotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDEpOwotCQlnb3RvIHN1c3BlbmRfZXhpdDsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfR1BIWV9DVFJMLCBHUEhZX0NUUkxfREVGQVVMVCB8CisJCQlHUEhZX0NUUkxfRVhUX1JFU0VUKTsKKwkJcGNpX3ByZXBhcmVfdG9fc2xlZXAocGRldik7CisJfSBlbHNlIHsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfR1BIWV9DVFJMLCBHUEhZX0NUUkxfUE9XRVJfU0FWSU5HKTsKKwkJbWFzdGVyX2N0cmxfZGF0YSB8PSBNQVNURVJfQ1RSTF9DTEtfU0VMX0RJUzsKKwkJbWFjX2N0cmxfZGF0YSB8PSBhdGwxY19tYWNfc3BlZWRfMTBfMTAwIDw8IE1BQ19DVFJMX1NQRUVEX1NISUZUOworCQltYWNfY3RybF9kYXRhIHw9IE1BQ19DVFJMX0RVUExYOworCQlBVF9XUklURV9SRUcoaHcsIFJFR19NQVNURVJfQ1RSTCwgbWFzdGVyX2N0cmxfZGF0YSk7CisJCUFUX1dSSVRFX1JFRyhodywgUkVHX01BQ19DVFJMLCBtYWNfY3RybF9kYXRhKTsKKwkJQVRfV1JJVEVfUkVHKGh3LCBSRUdfV09MX0NUUkwsIDApOworCQlody0+cGh5X2NvbmZpZ3VyZWQgPSBmYWxzZTsgLyogcmUtaW5pdCBQSFkgd2hlbiByZXN1bWUgKi8KKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCAwKTsKIAl9Ci13b2xfZGlzOgotCi0JLyogV09MIGRpc2FibGVkICovCi0JQVRfV1JJVEVfUkVHKGh3LCBSRUdfV09MX0NUUkwsIDApOwotCi0JLyogcGNpZSBwYXRjaCAqLwotCUFUX1JFQURfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDLCAmY3RybCk7Ci0JY3RybCB8PSBQQ0lFX1BIWU1JU0NfRk9SQ0VfUkNWX0RFVDsKLQlBVF9XUklURV9SRUcoaHcsIFJFR19QQ0lFX1BIWU1JU0MsIGN0cmwpOwotCi0JYXRsMWNfcGh5X2Rpc2FibGUoaHcpOwotCWh3LT5waHlfY29uZmlndXJlZCA9IGZhbHNlOyAvKiByZS1pbml0IFBIWSB3aGVuIHJlc3VtZSAqLwotCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCAwKTsKLXN1c3BlbmRfZXhpdDoKIAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKQEAgLTI1MTYsOSArMjU1OCwxOSBAQAogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKIAogCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19XT0xfQ1RSTCwgMCk7CisJYXRsMWNfcmVzZXRfcGNpZSgmYWRhcHRlci0+aHcsIEFUTDFDX1BDSUVfTDBTX0wxX0RJU0FCTEUgfAorCQkJQVRMMUNfUENJRV9QSFlfUkVTRVQpOwogCiAJYXRsMWNfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odyk7CiAJYXRsMWNfcmVzZXRfbWFjKCZhZGFwdGVyLT5odyk7CisJYXRsMWNfcGh5X2luaXQoJmFkYXB0ZXItPmh3KTsKKworI2lmIDAKKwlBVF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19QTV9DVFJMU1RBVCwgJnBtX2RhdGEpOworCXBtX2RhdGEgJj0gflBNX0NUUkxTVEFUX1BNRV9FTjsKKwlBVF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfUE1fQ1RSTFNUQVQsIHBtX2RhdGEpOworI2VuZGlmCisKIAluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJYXRsMWNfdXAoYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGx4L2F0bDEuaCBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5oCmluZGV4IDE0NjM3MmYuLjljMGRkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5oCisrKyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5oCkBAIC00MzYsOCArNDM2LDggQEAKIAlfX2xlMTYgYnVmX2xlbjsJCS8qIFNpemUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyIGluIGhvc3QgbWVtb3J5ICovCiAJdTE2IGNvYWxlc2U7CQkvKiBVcGRhdGUgY29uc3VtZXIgaW5kZXggdG8gaG9zdCBhZnRlciB0aGUKIAkJCQkgKiByZWNlcHRpb24gb2YgdGhpcyBmcmFtZSAqLwotCS8qIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpcyByZXF1aXJlZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJLyogX19wYWNrZWQgaXMgcmVxdWlyZWQgKi8KK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBUaGUgTDEgdHJhbnNtaXQgcGFja2V0IGRlc2NyaXB0b3IgaXMgY29tcHJpc2VkIG9mIGZvdXIgMzItYml0IHdvcmRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCmluZGV4IGVjZTYxMjguLjE1YWU2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKQEAgLTEwNCwxNCArMTA0LDYgQEAKICAqIGNvbXBsZXRlIGltbWVkaWF0ZWx5LgogICovCiAKLS8qIFRoZXNlIGFkZHJlc3NlcyBhcmUgb25seSB1c2VkIGlmIHlhbW9uIGRvZXNuJ3QgdGVsbCB1cyB3aGF0Ci0gKiB0aGUgbWFjIGFkZHJlc3MgaXMsIGFuZCB0aGUgbWFjIGFkZHJlc3MgaXMgbm90IHBhc3NlZCBvbiB0aGUKLSAqIGNvbW1hbmQgbGluZS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXUxMDAwX21hY19hZGRyWzZdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwMCwgMHg1MCwgMHhjMiwgMHgwYywgMHgzMCwgMHgwMAotfTsKLQogc3RydWN0IGF1MTAwMF9wcml2YXRlICphdV9tYWNzW05VTV9FVEhfSU5URVJGQUNFU107CiAKIC8qCkBAIC05NzgsNyArOTcwLDcgQEAKIAlpZiAoIWF1cC0+cGh5X2RldikKIAkJcmV0dXJuIC1FSU5WQUw7IC8qIFBIWSBub3QgY29udHJvbGxhYmxlICovCiAKLQlyZXR1cm4gcGh5X21paV9pb2N0bChhdXAtPnBoeV9kZXYsIGlmX21paShycSksIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwoYXVwLT5waHlfZGV2LCBycSwgY21kKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBhdTEwMDBfbmV0ZGV2X29wcyA9IHsKQEAgLTEwMDIsNyArOTk0LDYgQEAKIAlkYl9kZXN0X3QgKnBEQiwgKnBEQmZyZWU7CiAJaW50IGlycSwgaSwgZXJyID0gMDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmJhc2UsICptYWNlbjsKLQljaGFyIGV0aGFkZHJbNl07CiAKIAliYXNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIWJhc2UpIHsKQEAgLTEwNzksMjQgKzEwNzAsMTMgQEAKIAl9CiAJYXVwLT5tYWNfaWQgPSBwZGV2LT5pZDsKIAotCWlmIChwZGV2LT5pZCA9PSAwKSB7Ci0JCWlmIChwcm9tX2dldF9ldGhlcm5ldF9hZGRyKGV0aGFkZHIpID09IDApCi0JCQltZW1jcHkoYXUxMDAwX21hY19hZGRyLCBldGhhZGRyLCBzaXplb2YoYXUxMDAwX21hY19hZGRyKSk7Ci0JCWVsc2UgewotCQkJbmV0ZGV2X2luZm8oZGV2LCAiTm8gTUFDIGFkZHJlc3MgZm91bmRcbiIpOwotCQkJCS8qIFVzZSB0aGUgaGFyZCBjb2RlZCBNQUMgYWRkcmVzc2VzICovCi0JCX0KLQorCWlmIChwZGV2LT5pZCA9PSAwKQogCQlhdTEwMDBfc2V0dXBfaHdfcmluZ3MoYXVwLCBNQUMwX1JYX0RNQV9BRERSLCBNQUMwX1RYX0RNQV9BRERSKTsKLQl9IGVsc2UgaWYgKHBkZXYtPmlkID09IDEpCisJZWxzZSBpZiAocGRldi0+aWQgPT0gMSkKIAkJYXUxMDAwX3NldHVwX2h3X3JpbmdzKGF1cCwgTUFDMV9SWF9ETUFfQUREUiwgTUFDMV9UWF9ETUFfQUREUik7CiAKLQkvKgotCSAqIEFzc2lnbiB0byB0aGUgRXRoZXJuZXQgcG9ydHMgdHdvIGNvbnNlY3V0aXZlIE1BQyBhZGRyZXNzZXMKLQkgKiB0byBtYXRjaCB0aG9zZSB0aGF0IGFyZSBwcmludGVkIG9uIHRoZWlyIHN0aWNrZXJzCi0JICovCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF1MTAwMF9tYWNfYWRkciwgc2l6ZW9mKGF1MTAwMF9tYWNfYWRkcikpOwotCWRldi0+ZGV2X2FkZHJbNV0gKz0gcGRldi0+aWQ7CisJLyogc2V0IGEgcmFuZG9tIE1BQyBub3cgaW4gY2FzZSBwbGF0Zm9ybV9kYXRhIGRvZXNuJ3QgcHJvdmlkZSBvbmUgKi8KKwlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKIAogCSphdXAtPmVuYWJsZSA9IDA7CiAJYXVwLT5tYWNfZW5hYmxlZCA9IDA7CkBAIC0xMTA2LDYgKzEwODYsOSBAQAogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm1fZGF0YSBwYXNzZWQsIFBIWSBzZWFyY2ggb24gTUFDMFxuIik7CiAJCWF1cC0+cGh5MV9zZWFyY2hfbWFjMCA9IDE7CiAJfSBlbHNlIHsKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIocGQtPm1hYykpCisJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGQtPm1hYywgNik7CisKIAkJYXVwLT5waHlfc3RhdGljX2NvbmZpZyA9IHBkLT5waHlfc3RhdGljX2NvbmZpZzsKIAkJYXVwLT5waHlfc2VhcmNoX2hpZ2hlc3RfYWRkciA9IHBkLT5waHlfc2VhcmNoX2hpZ2hlc3RfYWRkcjsKIAkJYXVwLT5waHkxX3NlYXJjaF9tYWMwID0gcGQtPnBoeTFfc2VhcmNoX21hYzA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9heDg4Nzk2LmMgYi9kcml2ZXJzL25ldC9heDg4Nzk2LmMKaW5kZXggNTVjOTk1OC4uMjBlOTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXg4ODc5Ni5jCisrKyBiL2RyaXZlcnMvbmV0L2F4ODg3OTYuYwpAQCAtNDgxLDggKzQ4MSwxMCBAQAogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gYXhfZWlfb3BlbihkZXYpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiB0dXJuIHRoZSBwaHkgb24gKGlmIHR1cm5lZCBvZmYpICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggMjkzZjljMS4uMzc2MTdhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTEzNSw3ICsxMzUsNiBAQAogCiBzdGF0aWMgdm9pZCBiNDRfaW5pdF9odyhzdHJ1Y3QgYjQ0ICosIGludCk7CiAKLXN0YXRpYyBpbnQgZG1hX2Rlc2NfYWxpZ25fbWFzazsKIHN0YXRpYyBpbnQgZG1hX2Rlc2Nfc3luY19zaXplOwogc3RhdGljIGludCBpbnN0YW5jZTsKIApAQCAtMTUwLDkgKzE0OSw4IEBACiAJCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlzc2JfZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc2RldiwgZG1hX2Jhc2UsCi0JCQkJCSAgICAgb2Zmc2V0ICYgZG1hX2Rlc2NfYWxpZ25fbWFzaywKLQkJCQkJICAgICBkbWFfZGVzY19zeW5jX3NpemUsIGRpcik7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc2Rldi0+ZG1hX2RldiwgZG1hX2Jhc2UgKyBvZmZzZXQsCisJCQkJICAgZG1hX2Rlc2Nfc3luY19zaXplLCBkaXIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYjQ0X3N5bmNfZG1hX2Rlc2NfZm9yX2NwdShzdHJ1Y3Qgc3NiX2RldmljZSAqc2RldiwKQEAgLTE2MCw5ICsxNTgsOCBAQAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlzc2JfZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc2RldiwgZG1hX2Jhc2UsCi0JCQkJCSAgb2Zmc2V0ICYgZG1hX2Rlc2NfYWxpZ25fbWFzaywKLQkJCQkJICBkbWFfZGVzY19zeW5jX3NpemUsIGRpcik7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc2Rldi0+ZG1hX2RldiwgZG1hX2Jhc2UgKyBvZmZzZXQsCisJCQkJZG1hX2Rlc2Nfc3luY19zaXplLCBkaXIpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYnIzMihjb25zdCBzdHJ1Y3QgYjQ0ICpicCwgdW5zaWduZWQgbG9uZyByZWcpCkBAIC02MDgsMTAgKzYwNSwxMCBAQAogCiAJCUJVR19PTihza2IgPT0gTlVMTCk7CiAKLQkJc3NiX2RtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYsCi0JCQkJICAgICBycC0+bWFwcGluZywKLQkJCQkgICAgIHNrYi0+bGVuLAotCQkJCSAgICAgRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYtPmRtYV9kZXYsCisJCQkJIHJwLT5tYXBwaW5nLAorCQkJCSBza2ItPmxlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CiAJCXJwLT5za2IgPSBOVUxMOwogCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCX0KQEAgLTY0OCwyOSArNjQ1LDI5IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1hcHBpbmcgPSBzc2JfZG1hX21hcF9zaW5nbGUoYnAtPnNkZXYsIHNrYi0+ZGF0YSwKLQkJCQkgICAgIFJYX1BLVF9CVUZfU1osCi0JCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpOworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShicC0+c2Rldi0+ZG1hX2Rldiwgc2tiLT5kYXRhLAorCQkJCSBSWF9QS1RfQlVGX1NaLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCiAJLyogSGFyZHdhcmUgYnVnIHdvcmstYXJvdW5kLCB0aGUgY2hpcCBpcyB1bmFibGUgdG8gZG8gUENJIERNQQogCSAgIHRvL2Zyb20gYW55dGhpbmcgYWJvdmUgMUdCIDotKCAqLwotCWlmIChzc2JfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnNkZXYsIG1hcHBpbmcpIHx8CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGJwLT5zZGV2LT5kbWFfZGV2LCBtYXBwaW5nKSB8fAogCQltYXBwaW5nICsgUlhfUEtUX0JVRl9TWiA+IERNQV9CSVRfTUFTSygzMCkpIHsKIAkJLyogU2lnaC4uLiAqLwotCQlpZiAoIXNzYl9kbWFfbWFwcGluZ19lcnJvcihicC0+c2RldiwgbWFwcGluZykpCi0JCQlzc2JfZG1hX3VubWFwX3NpbmdsZShicC0+c2RldiwgbWFwcGluZywKKwkJaWYgKCFkbWFfbWFwcGluZ19lcnJvcihicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZykpCisJCQlkbWFfdW5tYXBfc2luZ2xlKGJwLT5zZGV2LT5kbWFfZGV2LCBtYXBwaW5nLAogCQkJCQkgICAgIFJYX1BLVF9CVUZfU1osIERNQV9GUk9NX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBSWF9QS1RfQlVGX1NaLCBHRlBfQVRPTUlDfEdGUF9ETUEpOwogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJbWFwcGluZyA9IHNzYl9kbWFfbWFwX3NpbmdsZShicC0+c2Rldiwgc2tiLT5kYXRhLAotCQkJCQkgICAgIFJYX1BLVF9CVUZfU1osCi0JCQkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKHNzYl9kbWFfbWFwcGluZ19lcnJvcihicC0+c2RldiwgbWFwcGluZykgfHwKLQkJCW1hcHBpbmcgKyBSWF9QS1RfQlVGX1NaID4gRE1BX0JJVF9NQVNLKDMwKSkgewotCQkJaWYgKCFzc2JfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnNkZXYsIG1hcHBpbmcpKQotCQkJCXNzYl9kbWFfdW5tYXBfc2luZ2xlKGJwLT5zZGV2LCBtYXBwaW5nLCBSWF9QS1RfQlVGX1NaLERNQV9GUk9NX0RFVklDRSk7CisJCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShicC0+c2Rldi0+ZG1hX2Rldiwgc2tiLT5kYXRhLAorCQkJCQkgUlhfUEtUX0JVRl9TWiwKKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZykgfHwKKwkJICAgIG1hcHBpbmcgKyBSWF9QS1RfQlVGX1NaID4gRE1BX0JJVF9NQVNLKDMwKSkgeworCQkJaWYgKCFkbWFfbWFwcGluZ19lcnJvcihicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZykpCisJCQkJZG1hX3VubWFwX3NpbmdsZShicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZywgUlhfUEtUX0JVRl9TWixETUFfRlJPTV9ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC03NDUsOSArNzQyLDkgQEAKIAkJCQkJICAgICBkZXN0X2lkeCAqIHNpemVvZigqZGVzdF9kZXNjKSwKIAkJCQkJICAgICBETUFfQklESVJFQ1RJT05BTCk7CiAKLQlzc2JfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoYnAtPnNkZXYsIGRlc3RfbWFwLT5tYXBwaW5nLAotCQkJCSAgICAgICBSWF9QS1RfQlVGX1NaLAotCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5zZGV2LT5kbWFfZGV2LCBkZXN0X21hcC0+bWFwcGluZywKKwkJCQkgICBSWF9QS1RfQlVGX1NaLAorCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7CiB9CiAKIHN0YXRpYyBpbnQgYjQ0X3J4KHN0cnVjdCBiNDQgKmJwLCBpbnQgYnVkZ2V0KQpAQCAtNzY3LDkgKzc2NCw5IEBACiAJCXN0cnVjdCByeF9oZWFkZXIgKnJoOwogCQl1MTYgbGVuOwogCi0JCXNzYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShicC0+c2RldiwgbWFwLAotCQkJCQkgICAgUlhfUEtUX0JVRl9TWiwKLQkJCQkJICAgIERNQV9GUk9NX0RFVklDRSk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGJwLT5zZGV2LT5kbWFfZGV2LCBtYXAsCisJCQkJCVJYX1BLVF9CVUZfU1osCisJCQkJCURNQV9GUk9NX0RFVklDRSk7CiAJCXJoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgc2tiLT5kYXRhOwogCQlsZW4gPSBsZTE2X3RvX2NwdShyaC0+bGVuKTsKIAkJaWYgKChsZW4gPiAoUlhfUEtUX0JVRl9TWiAtIFJYX1BLVF9PRkZTRVQpKSB8fApAQCAtODAxLDggKzc5OCw4IEBACiAJCQlza2Jfc2l6ZSA9IGI0NF9hbGxvY19yeF9za2IoYnAsIGNvbnMsIGJwLT5yeF9wcm9kKTsKIAkJCWlmIChza2Jfc2l6ZSA8IDApCiAJCQkJZ290byBkcm9wX2l0OwotCQkJc3NiX2RtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYsIG1hcCwKLQkJCQkJICAgICBza2Jfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYtPmRtYV9kZXYsIG1hcCwKKwkJCQkJIHNrYl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJLyogTGVhdmUgb3V0IHJ4X2hlYWRlciAqLwogCQkJc2tiX3B1dChza2IsIGxlbiArIFJYX1BLVF9PRkZTRVQpOwogCQkJc2tiX3B1bGwoc2tiLCBSWF9QS1RfT0ZGU0VUKTsKQEAgLTk1NCwyNCArOTUxLDI0IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQltYXBwaW5nID0gc3NiX2RtYV9tYXBfc2luZ2xlKGJwLT5zZGV2LCBza2ItPmRhdGEsIGxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JaWYgKHNzYl9kbWFfbWFwcGluZ19lcnJvcihicC0+c2RldiwgbWFwcGluZykgfHwgbWFwcGluZyArIGxlbiA+IERNQV9CSVRfTUFTSygzMCkpIHsKKwltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoYnAtPnNkZXYtPmRtYV9kZXYsIHNrYi0+ZGF0YSwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYnAtPnNkZXYtPmRtYV9kZXYsIG1hcHBpbmcpIHx8IG1hcHBpbmcgKyBsZW4gPiBETUFfQklUX01BU0soMzApKSB7CiAJCXN0cnVjdCBza19idWZmICpib3VuY2Vfc2tiOwogCiAJCS8qIENoaXAgY2FuJ3QgaGFuZGxlIERNQSB0by9mcm9tID4xR0IsIHVzZSBib3VuY2UgYnVmZmVyICovCi0JCWlmICghc3NiX2RtYV9tYXBwaW5nX2Vycm9yKGJwLT5zZGV2LCBtYXBwaW5nKSkKLQkJCXNzYl9kbWFfdW5tYXBfc2luZ2xlKGJwLT5zZGV2LCBtYXBwaW5nLCBsZW4sCisJCWlmICghZG1hX21hcHBpbmdfZXJyb3IoYnAtPnNkZXYtPmRtYV9kZXYsIG1hcHBpbmcpKQorCQkJZG1hX3VubWFwX3NpbmdsZShicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZywgbGVuLAogCQkJCQkgICAgIERNQV9UT19ERVZJQ0UpOwogCiAJCWJvdW5jZV9za2IgPSBfX25ldGRldl9hbGxvY19za2IoZGV2LCBsZW4sIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKIAkJaWYgKCFib3VuY2Vfc2tiKQogCQkJZ290byBlcnJfb3V0OwogCi0JCW1hcHBpbmcgPSBzc2JfZG1hX21hcF9zaW5nbGUoYnAtPnNkZXYsIGJvdW5jZV9za2ItPmRhdGEsCi0JCQkJCSAgICAgbGVuLCBETUFfVE9fREVWSUNFKTsKLQkJaWYgKHNzYl9kbWFfbWFwcGluZ19lcnJvcihicC0+c2RldiwgbWFwcGluZykgfHwgbWFwcGluZyArIGxlbiA+IERNQV9CSVRfTUFTSygzMCkpIHsKLQkJCWlmICghc3NiX2RtYV9tYXBwaW5nX2Vycm9yKGJwLT5zZGV2LCBtYXBwaW5nKSkKLQkJCQlzc2JfZG1hX3VubWFwX3NpbmdsZShicC0+c2RldiwgbWFwcGluZywKKwkJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKGJwLT5zZGV2LT5kbWFfZGV2LCBib3VuY2Vfc2tiLT5kYXRhLAorCQkJCQkgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGJwLT5zZGV2LT5kbWFfZGV2LCBtYXBwaW5nKSB8fCBtYXBwaW5nICsgbGVuID4gRE1BX0JJVF9NQVNLKDMwKSkgeworCQkJaWYgKCFkbWFfbWFwcGluZ19lcnJvcihicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZykpCisJCQkJZG1hX3VubWFwX3NpbmdsZShicC0+c2Rldi0+ZG1hX2RldiwgbWFwcGluZywKIAkJCQkJCSAgICAgbGVuLCBETUFfVE9fREVWSUNFKTsKIAkJCWRldl9rZnJlZV9za2JfYW55KGJvdW5jZV9za2IpOwogCQkJZ290byBlcnJfb3V0OwpAQCAtMTA2OCw4ICsxMDY1LDggQEAKIAogCQlpZiAocnAtPnNrYiA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCXNzYl9kbWFfdW5tYXBfc2luZ2xlKGJwLT5zZGV2LCBycC0+bWFwcGluZywgUlhfUEtUX0JVRl9TWiwKLQkJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYtPmRtYV9kZXYsIHJwLT5tYXBwaW5nLCBSWF9QS1RfQlVGX1NaLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShycC0+c2tiKTsKIAkJcnAtPnNrYiA9IE5VTEw7CiAJfQpAQCAtMTA4MCw4ICsxMDc3LDggQEAKIAogCQlpZiAocnAtPnNrYiA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCXNzYl9kbWFfdW5tYXBfc2luZ2xlKGJwLT5zZGV2LCBycC0+bWFwcGluZywgcnAtPnNrYi0+bGVuLAotCQkJCSAgICAgRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYtPmRtYV9kZXYsIHJwLT5tYXBwaW5nLCBycC0+c2tiLT5sZW4sCisJCQkJIERNQV9UT19ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShycC0+c2tiKTsKIAkJcnAtPnNrYiA9IE5VTEw7CiAJfQpAQCAtMTEwMywxNCArMTEwMCwxMiBAQAogCW1lbXNldChicC0+dHhfcmluZywgMCwgQjQ0X1RYX1JJTkdfQllURVMpOwogCiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1JYX1JJTkdfSEFDSykKLQkJc3NiX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5zZGV2LCBicC0+cnhfcmluZ19kbWEsCi0JCQkJCSAgICAgICBETUFfVEFCTEVfQllURVMsCi0JCQkJCSAgICAgICBETUFfQklESVJFQ1RJT05BTCk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5zZGV2LT5kbWFfZGV2LCBicC0+cnhfcmluZ19kbWEsCisJCQkJCSAgIERNQV9UQUJMRV9CWVRFUywgRE1BX0JJRElSRUNUSU9OQUwpOwogCiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1RYX1JJTkdfSEFDSykKLQkJc3NiX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5zZGV2LCBicC0+dHhfcmluZ19kbWEsCi0JCQkJCSAgICAgICBETUFfVEFCTEVfQllURVMsCi0JCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoYnAtPnNkZXYtPmRtYV9kZXYsIGJwLT50eF9yaW5nX2RtYSwKKwkJCQkJICAgRE1BX1RBQkxFX0JZVEVTLCBETUFfVE9fREVWSUNFKTsKIAogCWZvciAoaSA9IDA7IGkgPCBicC0+cnhfcGVuZGluZzsgaSsrKSB7CiAJCWlmIChiNDRfYWxsb2Nfcnhfc2tiKGJwLCAtMSwgaSkgPCAwKQpAQCAtMTEzMCwyNyArMTEyNSwyMyBAQAogCWJwLT50eF9idWZmZXJzID0gTlVMTDsKIAlpZiAoYnAtPnJ4X3JpbmcpIHsKIAkJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1JYX1JJTkdfSEFDSykgewotCQkJc3NiX2RtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYsIGJwLT5yeF9yaW5nX2RtYSwKLQkJCQkJICAgICBETUFfVEFCTEVfQllURVMsCi0JCQkJCSAgICAgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJZG1hX3VubWFwX3NpbmdsZShicC0+c2Rldi0+ZG1hX2RldiwgYnAtPnJ4X3JpbmdfZG1hLAorCQkJCQkgRE1BX1RBQkxFX0JZVEVTLCBETUFfQklESVJFQ1RJT05BTCk7CiAJCQlrZnJlZShicC0+cnhfcmluZyk7CiAJCX0gZWxzZQotCQkJc3NiX2RtYV9mcmVlX2NvbnNpc3RlbnQoYnAtPnNkZXYsIERNQV9UQUJMRV9CWVRFUywKLQkJCQkJCWJwLT5yeF9yaW5nLCBicC0+cnhfcmluZ19kbWEsCi0JCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGJwLT5zZGV2LT5kbWFfZGV2LCBETUFfVEFCTEVfQllURVMsCisJCQkJCSAgYnAtPnJ4X3JpbmcsIGJwLT5yeF9yaW5nX2RtYSk7CiAJCWJwLT5yeF9yaW5nID0gTlVMTDsKIAkJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19SWF9SSU5HX0hBQ0s7CiAJfQogCWlmIChicC0+dHhfcmluZykgewogCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfVFhfUklOR19IQUNLKSB7Ci0JCQlzc2JfZG1hX3VubWFwX3NpbmdsZShicC0+c2RldiwgYnAtPnR4X3JpbmdfZG1hLAotCQkJCQkgICAgIERNQV9UQUJMRV9CWVRFUywKLQkJCQkJICAgICBETUFfVE9fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYnAtPnNkZXYtPmRtYV9kZXYsIGJwLT50eF9yaW5nX2RtYSwKKwkJCQkJIERNQV9UQUJMRV9CWVRFUywgRE1BX1RPX0RFVklDRSk7CiAJCQlrZnJlZShicC0+dHhfcmluZyk7CiAJCX0gZWxzZQotCQkJc3NiX2RtYV9mcmVlX2NvbnNpc3RlbnQoYnAtPnNkZXYsIERNQV9UQUJMRV9CWVRFUywKLQkJCQkJCWJwLT50eF9yaW5nLCBicC0+dHhfcmluZ19kbWEsCi0JCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGJwLT5zZGV2LT5kbWFfZGV2LCBETUFfVEFCTEVfQllURVMsCisJCQkJCSAgYnAtPnR4X3JpbmcsIGJwLT50eF9yaW5nX2RtYSk7CiAJCWJwLT50eF9yaW5nID0gTlVMTDsKIAkJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19UWF9SSU5HX0hBQ0s7CiAJfQpAQCAtMTE3NSw3ICsxMTY2LDggQEAKIAkJZ290byBvdXRfZXJyOwogCiAJc2l6ZSA9IERNQV9UQUJMRV9CWVRFUzsKLQlicC0+cnhfcmluZyA9IHNzYl9kbWFfYWxsb2NfY29uc2lzdGVudChicC0+c2Rldiwgc2l6ZSwgJmJwLT5yeF9yaW5nX2RtYSwgZ2ZwKTsKKwlicC0+cnhfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudChicC0+c2Rldi0+ZG1hX2Rldiwgc2l6ZSwKKwkJCQkJICZicC0+cnhfcmluZ19kbWEsIGdmcCk7CiAJaWYgKCFicC0+cnhfcmluZykgewogCQkvKiBBbGxvY2F0aW9uIG1heSBoYXZlIGZhaWxlZCBkdWUgdG8gcGNpX2FsbG9jX2NvbnNpc3RlbnQKIAkJICAgaW5zaXN0aW5nIG9uIHVzZSBvZiBHRlBfRE1BLCB3aGljaCBpcyBtb3JlIHJlc3RyaWN0aXZlCkBAIC0xMTg3LDExICsxMTc5LDExIEBACiAJCWlmICghcnhfcmluZykKIAkJCWdvdG8gb3V0X2VycjsKIAotCQlyeF9yaW5nX2RtYSA9IHNzYl9kbWFfbWFwX3NpbmdsZShicC0+c2RldiwgcnhfcmluZywKLQkJCQkJCSBETUFfVEFCTEVfQllURVMsCi0JCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCQlyeF9yaW5nX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGJwLT5zZGV2LT5kbWFfZGV2LCByeF9yaW5nLAorCQkJCQkgICAgIERNQV9UQUJMRV9CWVRFUywKKwkJCQkJICAgICBETUFfQklESVJFQ1RJT05BTCk7CiAKLQkJaWYgKHNzYl9kbWFfbWFwcGluZ19lcnJvcihicC0+c2RldiwgcnhfcmluZ19kbWEpIHx8CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihicC0+c2Rldi0+ZG1hX2RldiwgcnhfcmluZ19kbWEpIHx8CiAJCQlyeF9yaW5nX2RtYSArIHNpemUgPiBETUFfQklUX01BU0soMzApKSB7CiAJCQlrZnJlZShyeF9yaW5nKTsKIAkJCWdvdG8gb3V0X2VycjsKQEAgLTEyMDIsNyArMTE5NCw4IEBACiAJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19SWF9SSU5HX0hBQ0s7CiAJfQogCi0JYnAtPnR4X3JpbmcgPSBzc2JfZG1hX2FsbG9jX2NvbnNpc3RlbnQoYnAtPnNkZXYsIHNpemUsICZicC0+dHhfcmluZ19kbWEsIGdmcCk7CisJYnAtPnR4X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoYnAtPnNkZXYtPmRtYV9kZXYsIHNpemUsCisJCQkJCSAmYnAtPnR4X3JpbmdfZG1hLCBnZnApOwogCWlmICghYnAtPnR4X3JpbmcpIHsKIAkJLyogQWxsb2NhdGlvbiBtYXkgaGF2ZSBmYWlsZWQgZHVlIHRvIHNzYl9kbWFfYWxsb2NfY29uc2lzdGVudAogCQkgICBpbnNpc3Rpbmcgb24gdXNlIG9mIEdGUF9ETUEsIHdoaWNoIGlzIG1vcmUgcmVzdHJpY3RpdmUKQEAgLTEyMTQsMTEgKzEyMDcsMTEgQEAKIAkJaWYgKCF0eF9yaW5nKQogCQkJZ290byBvdXRfZXJyOwogCi0JCXR4X3JpbmdfZG1hID0gc3NiX2RtYV9tYXBfc2luZ2xlKGJwLT5zZGV2LCB0eF9yaW5nLAotCQkJICAgICAgICAgICAgICAgICAgICBETUFfVEFCTEVfQllURVMsCi0JCQkgICAgICAgICAgICAgICAgICAgIERNQV9UT19ERVZJQ0UpOworCQl0eF9yaW5nX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGJwLT5zZGV2LT5kbWFfZGV2LCB0eF9yaW5nLAorCQkJCQkgICAgIERNQV9UQUJMRV9CWVRFUywKKwkJCQkJICAgICBETUFfVE9fREVWSUNFKTsKIAotCQlpZiAoc3NiX2RtYV9tYXBwaW5nX2Vycm9yKGJwLT5zZGV2LCB0eF9yaW5nX2RtYSkgfHwKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGJwLT5zZGV2LT5kbWFfZGV2LCB0eF9yaW5nX2RtYSkgfHwKIAkJCXR4X3JpbmdfZG1hICsgc2l6ZSA+IERNQV9CSVRfTUFTSygzMCkpIHsKIAkJCWtmcmVlKHR4X3JpbmcpOwogCQkJZ290byBvdXRfZXJyOwpAQCAtMjE3NiwxMiArMjE2OSwxNCBAQAogCQkJIkZhaWxlZCB0byBwb3dlcnVwIHRoZSBidXNcbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CiAJfQotCWVyciA9IHNzYl9kbWFfc2V0X21hc2soc2RldiwgRE1BX0JJVF9NQVNLKDMwKSk7Ci0JaWYgKGVycikgeworCisJaWYgKGRtYV9zZXRfbWFzayhzZGV2LT5kbWFfZGV2LCBETUFfQklUX01BU0soMzApKSB8fAorCSAgICBkbWFfc2V0X2NvaGVyZW50X21hc2soc2Rldi0+ZG1hX2RldiwgRE1BX0JJVF9NQVNLKDMwKSkpIHsKIAkJZGV2X2VycihzZGV2LT5kZXYsCiAJCQkiUmVxdWlyZWQgMzBCSVQgRE1BIG1hc2sgdW5zdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbVxuIik7CiAJCWdvdG8gZXJyX291dF9wb3dlcmRvd247CiAJfQorCiAJZXJyID0gYjQ0X2dldF9pbnZhcmlhbnRzKGJwKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoc2Rldi0+ZGV2LApAQCAtMjM0NCw3ICsyMzM5LDYgQEAKIAlpbnQgZXJyOwogCiAJLyogU2V0dXAgcGFyYW1hdGVycyBmb3Igc3luY2luZyBSWC9UWCBETUEgZGVzY3JpcHRvcnMgKi8KLQlkbWFfZGVzY19hbGlnbl9tYXNrID0gfihkbWFfZGVzY19hbGlnbl9zaXplIC0gMSk7CiAJZG1hX2Rlc2Nfc3luY19zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBkbWFfZGVzY19hbGlnbl9zaXplLCBzaXplb2Yoc3RydWN0IGRtYV9kZXNjKSk7CiAKIAllcnIgPSBiNDRfcGNpX2luaXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JjbTYzeHhfZW5ldC5jIGIvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMKaW5kZXggZmFmNWFkZC4uMGQyYzVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAJaWYgKHByaXYtPmhhc19waHkpIHsKIAkJaWYgKCFwcml2LT5waHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOworCQlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIHJxLCBjbWQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlLmggYi9kcml2ZXJzL25ldC9iZW5ldC9iZS5oCmluZGV4IGI0NmJlNDkuLjk5MTk3YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlLmgKKysrIGIvZHJpdmVycy9uZXQvYmVuZXQvYmUuaApAQCAtMzMsNyArMzMsNyBAQAogCiAjaW5jbHVkZSAiYmVfaHcuaCIKIAotI2RlZmluZSBEUlZfVkVSCQkJIjIuMTAyLjE0N3UiCisjZGVmaW5lIERSVl9WRVIJCQkiMi4xMDMuMTc1dSIKICNkZWZpbmUgRFJWX05BTUUJCSJiZTJuZXQiCiAjZGVmaW5lIEJFX05BTUUJCQkiU2VydmVyRW5naW5lcyBCbGFkZUVuZ2luZTIgMTBHYnBzIE5JQyIKICNkZWZpbmUgQkUzX05BTUUJCSJTZXJ2ZXJFbmdpbmVzIEJsYWRlRW5naW5lMyAxMEdicHMgTklDIgpAQCAtMjIwLDcgKzIyMCwxNiBAQAogCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gcGFnZV9pbmZvX3RibFtSWF9RX0xFTl07CiB9OwogCitzdHJ1Y3QgYmVfdmZfY2ZnIHsKKwl1bnNpZ25lZCBjaGFyIHZmX21hY19hZGRyW0VUSF9BTEVOXTsKKwl1MzIgdmZfaWZfaGFuZGxlOworCXUzMiB2Zl9wbWFjX2lkOworCXUxNiB2Zl92bGFuX3RhZzsKKwl1MzIgdmZfdHhfcmF0ZTsKK307CisKICNkZWZpbmUgQkVfTlVNX01TSVhfVkVDVE9SUwkJMgkvKiAxIGVhY2ggZm9yIFR4IGFuZCBSeCAqLworI2RlZmluZSBCRV9JTlZBTElEX1BNQUNfSUQJCTB4ZmZmZmZmZmYKIHN0cnVjdCBiZV9hZGFwdGVyIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwpAQCAtMjc2LDIzICsyODUsMjYgQEAKIAl1MzIgcG9ydF9udW07CiAJYm9vbCBwcm9taXNjdW91czsKIAlib29sIHdvbDsKLQl1MzIgY2FwOworCXUzMiBmdW5jdGlvbl9tb2RlOwogCXUzMiByeF9mYzsJCS8qIFJ4IGZsb3cgY29udHJvbCAqLwogCXUzMiB0eF9mYzsJCS8qIFR4IGZsb3cgY29udHJvbCAqLworCWJvb2wgdWVfZGV0ZWN0ZWQ7CisJYm9vbCBzdGF0c19pb2N0bF9zZW50OwogCWludCBsaW5rX3NwZWVkOwogCXU4IHBvcnRfdHlwZTsKIAl1OCB0cmFuc2NlaXZlcjsKKwl1OCBhdXRvbmVnOwogCXU4IGdlbmVyYXRpb247CQkvKiBCbGFkZUVuZ2luZSBBU0lDIGdlbmVyYXRpb24gKi8KIAl1MzIgZmxhc2hfc3RhdHVzOwogCXN0cnVjdCBjb21wbGV0aW9uIGZsYXNoX2NvbXBsOwogCiAJYm9vbCBzcmlvdl9lbmFibGVkOwotCXUzMiB2Zl9pZl9oYW5kbGVbQkVfTUFYX1ZGXTsKLQl1MzIgdmZfcG1hY19pZFtCRV9NQVhfVkZdOworCXN0cnVjdCBiZV92Zl9jZmcgdmZfY2ZnW0JFX01BWF9WRl07CiAJdTggYmFzZV9lcV9pZDsKKwl1OCBpc192aXJ0Zm47CiB9OwogCi0jZGVmaW5lIGJlX3BoeXNmbihhZGFwdGVyKSAoIWFkYXB0ZXItPnBkZXYtPmlzX3ZpcnRmbikKKyNkZWZpbmUgYmVfcGh5c2ZuKGFkYXB0ZXIpICghYWRhcHRlci0+aXNfdmlydGZuKQogCiAvKiBCbGFkZUVuZ2luZSBHZW5lcmF0aW9uIG51bWJlcnMgKi8KICNkZWZpbmUgQkVfR0VOMiAyCkBAIC0zOTIsNiArNDA0LDE1IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGJlX2NoZWNrX3NyaW92X2ZuX3R5cGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTggZGF0YTsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhZGFwdGVyLT5wZGV2LCAweEZFLCAweEFBKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhZGFwdGVyLT5wZGV2LCAweEZFLCAmZGF0YSk7CisJYWRhcHRlci0+aXNfdmlydGZuID0gKGRhdGEgIT0gMHhBQSk7Cit9CisKIGV4dGVybiB2b2lkIGJlX2NxX25vdGlmeShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTE2IHFpZCwgYm9vbCBhcm0sCiAJCXUxNiBudW1fcG9wcGVkKTsKIGV4dGVybiB2b2lkIGJlX2xpbmtfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBsaW5rX3VwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuYyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuYwppbmRleCBiOWFkNzk5Li4zZDMwNTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5jCkBAIC0yNSw2ICsyNSw4IEBACiAKIAl2YWwgfD0gbWNjcS0+aWQgJiBEQl9NQ0NRX1JJTkdfSURfTUFTSzsKIAl2YWwgfD0gMSA8PCBEQl9NQ0NRX05VTV9QT1NURURfU0hJRlQ7CisKKwl3bWIoKTsKIAlpb3dyaXRlMzIodmFsLCBhZGFwdGVyLT5kYiArIERCX01DQ1FfT0ZGU0VUKTsKIH0KIApAQCAtNzMsOCArNzUsMTAgQEAKIAkJCWJlX2R3c19sZV90b19jcHUoJnJlc3AtPmh3X3N0YXRzLAogCQkJCQkJc2l6ZW9mKHJlc3AtPmh3X3N0YXRzKSk7CiAJCQluZXRkZXZfc3RhdHNfdXBkYXRlKGFkYXB0ZXIpOworCQkJYWRhcHRlci0+c3RhdHNfaW9jdGxfc2VudCA9IGZhbHNlOwogCQl9Ci0JfSBlbHNlIGlmIChjb21wbF9zdGF0dXMgIT0gTUNDX1NUQVRVU19OT1RfU1VQUE9SVEVEKSB7CisJfSBlbHNlIGlmICgoY29tcGxfc3RhdHVzICE9IE1DQ19TVEFUVVNfTk9UX1NVUFBPUlRFRCkgJiYKKwkJICAgKGNvbXBsLT50YWcwICE9IE9QQ09ERV9DT01NT05fTlRXS19NQUNfUVVFUlkpKSB7CiAJCWV4dGRfc3RhdHVzID0gKGNvbXBsLT5zdGF0dXMgPj4gQ1FFX1NUQVRVU19FWFREX1NISUZUKSAmCiAJCQkJQ1FFX1NUQVRVU19FWFREX01BU0s7CiAJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCkBAIC0xODYsNyArMTkwLDcgQEAKIAogc3RhdGljIGludCBiZV9tYm94X2RiX3JlYWR5X3dhaXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgX19pb21lbSAqZGIpCiB7Ci0JaW50IGNudCA9IDAsIHdhaXQgPSA1OworCWludCBtc2VjcyA9IDA7CiAJdTMyIHJlYWR5OwogCiAJZG8gewpAQCAtMjAxLDE1ICsyMDUsMTUgQEAKIAkJaWYgKHJlYWR5KQogCQkJYnJlYWs7CiAKLQkJaWYgKGNudCA+IDQwMDAwMDApIHsKKwkJaWYgKG1zZWNzID4gNDAwMCkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAibWJveCBwb2xsIHRpbWVkIG91dFxuIik7CisJCQliZV9kdW1wX3VlKGFkYXB0ZXIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKLQkJaWYgKGNudCA+IDUwKQotCQkJd2FpdCA9IDIwMDsKLQkJY250ICs9IHdhaXQ7Ci0JCXVkZWxheSh3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEpKTsKKwkJbXNlY3MrKzsKIAl9IHdoaWxlICh0cnVlKTsKIAogCXJldHVybiAwOwpAQCAtOTQ4LDYgKzk1Miw3IEBACiAJc2dlLT5sZW4gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLT5zaXplKTsKIAogCWJlX21jY19ub3RpZnkoYWRhcHRlcik7CisJYWRhcHRlci0+c3RhdHNfaW9jdGxfc2VudCA9IHRydWU7CiAKIGVycjoKIAlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOwpAQCAtMTI1Niw3ICsxMjYxLDcgQEAKIH0KIAogLyogVXNlcyBtYm94ICovCi1pbnQgYmVfY21kX3F1ZXJ5X2Z3X2NmZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyICpwb3J0X251bSwgdTMyICpjYXApCitpbnQgYmVfY21kX3F1ZXJ5X2Z3X2NmZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyICpwb3J0X251bSwgdTMyICptb2RlKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfcXVlcnlfZndfY2ZnICpyZXE7CkBAIC0xMjc3LDcgKzEyODIsNyBAQAogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBiZV9jbWRfcmVzcF9xdWVyeV9md19jZmcgKnJlc3AgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CiAJCSpwb3J0X251bSA9IGxlMzJfdG9fY3B1KHJlc3AtPnBoeXNfcG9ydCk7Ci0JCSpjYXAgPSBsZTMyX3RvX2NwdShyZXNwLT5mdW5jdGlvbl9jYXApOworCQkqbW9kZSA9IGxlMzJfdG9fY3B1KHJlc3AtPmZ1bmN0aW9uX21vZGUpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5tYm94X2xvY2spOwpAQCAtMTY5NCwzICsxNjk5LDcxIEBACiAJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQorCitpbnQgYmVfY21kX2dldF9waHlfaW5mbyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX2RtYV9tZW0gKmNtZCkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9waHlfaW5mbyAqcmVxOworCXN0cnVjdCBiZV9zZ2UgKnNnZTsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmVxID0gY21kLT52YTsKKwlzZ2UgPSBub25lbWJlZGRlZF9zZ2wod3JiKTsKKworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgZmFsc2UsIDEsCisJCQkJT1BDT0RFX0NPTU1PTl9HRVRfUEhZX0RFVEFJTFMpOworCisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQlPUENPREVfQ09NTU9OX0dFVF9QSFlfREVUQUlMUywKKwkJCXNpemVvZigqcmVxKSk7CisKKwlzZ2UtPnBhX2hpID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhjbWQtPmRtYSkpOworCXNnZS0+cGFfbG8gPSBjcHVfdG9fbGUzMihjbWQtPmRtYSAmIDB4RkZGRkZGRkYpOworCXNnZS0+bGVuID0gY3B1X3RvX2xlMzIoY21kLT5zaXplKTsKKworCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKK2VycjoKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBiZV9jbWRfc2V0X3FvcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGJwcywgdTMyIGRvbWFpbikKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCXN0cnVjdCBiZV9jbWRfcmVxX3NldF9xb3MgKnJlcTsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwLAorCQkJCU9QQ09ERV9DT01NT05fU0VUX1FPUyk7CisKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCU9QQ09ERV9DT01NT05fU0VUX1FPUywgc2l6ZW9mKCpyZXEpKTsKKworCXJlcS0+aGRyLmRvbWFpbiA9IGRvbWFpbjsKKwlyZXEtPnZhbGlkX2JpdHMgPSBCRV9RT1NfQklUU19OSUM7CisJcmVxLT5tYXhfYnBzX25pYyA9IGJwczsKKworCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKKworZXJyOgorCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuaCBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuaAppbmRleCA3NjNkYzE5Li5iZGMxMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmgKKysrIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5oCkBAIC0xMjQsNiArMTI0LDcgQEAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9DUV9DUkVBVEUJCQkJMTIKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FUV9DUkVBVEUJCQkJMTMKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NQ0NfQ1JFQVRFICAgICAgICAJCTIxCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX1FPUwkJCQkyOAogI2RlZmluZSBPUENPREVfQ09NTU9OX1NFRVBST01fUkVBRAkJCTMwCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19SWF9GSUxURVIgICAgCQkzNAogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9GV19WRVJTSU9OCQkJMzUKQEAgLTE0NCw2ICsxNDUsNyBAQAogI2RlZmluZSBPUENPREVfQ09NTU9OX0VOQUJMRV9ESVNBQkxFX0JFQUNPTgkJNjkKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfQkVBQ09OX1NUQVRFCQkJNzAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRUFEX1RSQU5TUkVDVl9EQVRBCQk3MworI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9QSFlfREVUQUlMUwkJCTEwMgogCiAjZGVmaW5lIE9QQ09ERV9FVEhfQUNQSV9DT05GSUcJCQkJMgogI2RlZmluZSBPUENPREVfRVRIX1BST01JU0NVT1VTCQkJCTMKQEAgLTc0Nyw3ICs3NDksNyBAQAogCXUzMiBiZV9jb25maWdfbnVtYmVyOwogCXUzMiBhc2ljX3JldmlzaW9uOwogCXUzMiBwaHlzX3BvcnQ7Ci0JdTMyIGZ1bmN0aW9uX2NhcDsKKwl1MzIgZnVuY3Rpb25fbW9kZTsKIAl1MzIgcnN2ZFsyNl07CiB9OwogCkBAIC04NjksNiArODcxLDQ2IEBACiAJdTggc2VlcHJvbV9kYXRhW0JFX1JFQURfU0VFUFJPTV9MRU5dOwogfTsKIAorZW51bSB7CisJUEhZX1RZUEVfQ1g0XzEwR0IgPSAwLAorCVBIWV9UWVBFX1hGUF8xMEdCLAorCVBIWV9UWVBFX1NGUF8xR0IsCisJUEhZX1RZUEVfU0ZQX1BMVVNfMTBHQiwKKwlQSFlfVFlQRV9LUl8xMEdCLAorCVBIWV9UWVBFX0tYNF8xMEdCLAorCVBIWV9UWVBFX0JBU0VUXzEwR0IsCisJUEhZX1RZUEVfQkFTRVRfMUdCLAorCVBIWV9UWVBFX0RJU0FCTEVEID0gMjU1Cit9OworCitzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfcGh5X2luZm8geworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTggcnN2ZDBbMjRdOworfTsKK3N0cnVjdCBiZV9jbWRfcmVzcF9nZXRfcGh5X2luZm8geworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTE2IHBoeV90eXBlOworCXUxNiBpbnRlcmZhY2VfdHlwZTsKKwl1MzIgbWlzY19wYXJhbXM7CisJdTMyIGZ1dHVyZV91c2VbNF07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKiogU2V0IFFPUyAqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCRV9RT1NfQklUU19OSUMJCQkJMQorCitzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfcW9zIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUzMiB2YWxpZF9iaXRzOworCXUzMiBtYXhfYnBzX25pYzsKKwl1MzIgcnN2ZFs3XTsKK307CisKK3N0cnVjdCBiZV9jbWRfcmVzcF9zZXRfcW9zIHsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyIGhkcjsKKwl1MzIgcnN2ZDsKK307CisKIGV4dGVybiBpbnQgYmVfcGNpX2ZudW1fZ2V0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiBpbnQgYmVfY21kX1BPU1Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGludCBiZV9jbWRfbWFjX2FkZHJfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKQEAgLTk0Nyw0ICs5ODksOCBAQAogCQkJCXN0cnVjdCBiZV9kbWFfbWVtICpub25lbWJfY21kKTsKIGV4dGVybiBpbnQgYmVfY21kX3NldF9sb29wYmFjayhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggcG9ydF9udW0sCiAJCQkJdTggbG9vcGJhY2tfdHlwZSwgdTggZW5hYmxlKTsKK2V4dGVybiBpbnQgYmVfY21kX2dldF9waHlfaW5mbyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJc3RydWN0IGJlX2RtYV9tZW0gKmNtZCk7CitleHRlcm4gaW50IGJlX2NtZF9zZXRfcW9zKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgYnBzLCB1MzIgZG9tYWluKTsKK2V4dGVybiB2b2lkIGJlX2R1bXBfdWUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9ldGh0b29sLmMKaW5kZXggMjAwZTk4NS4uY2QxNjI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2V0aHRvb2wuYwpAQCAtMzE0LDE1ICszMTQsMTkgQEAKIHN0YXRpYyBpbnQgYmVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTggbWFjX3NwZWVkID0gMCwgY29ubmVjdG9yID0gMDsKKwlzdHJ1Y3QgYmVfZG1hX21lbSBwaHlfY21kOworCXN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfcGh5X2luZm8gKnJlc3A7CisJdTggbWFjX3NwZWVkID0gMDsKIAl1MTYgbGlua19zcGVlZCA9IDA7CiAJYm9vbCBsaW5rX3VwID0gZmFsc2U7CiAJaW50IHN0YXR1czsKKwl1MTYgaW50Zl90eXBlOwogCi0JaWYgKGFkYXB0ZXItPmxpbmtfc3BlZWQgPCAwKSB7CisJaWYgKChhZGFwdGVyLT5saW5rX3NwZWVkIDwgMCkgfHwgKCEobmV0ZGV2LT5mbGFncyAmIElGRl9VUCkpKSB7CiAJCXN0YXR1cyA9IGJlX2NtZF9saW5rX3N0YXR1c19xdWVyeShhZGFwdGVyLCAmbGlua191cCwKIAkJCQkJCSZtYWNfc3BlZWQsICZsaW5rX3NwZWVkKTsKIAorCQliZV9saW5rX3N0YXR1c191cGRhdGUoYWRhcHRlciwgbGlua191cCk7CiAJCS8qIGxpbmtfc3BlZWQgaXMgaW4gdW5pdHMgb2YgMTAgTWJwcyAqLwogCQlpZiAobGlua19zcGVlZCkgewogCQkJZWNtZC0+c3BlZWQgPSBsaW5rX3NwZWVkKjEwOwpAQCAtMzM3LDQwICszNDEsNTcgQEAKIAkJCX0KIAkJfQogCi0JCXN0YXR1cyA9IGJlX2NtZF9yZWFkX3BvcnRfdHlwZShhZGFwdGVyLCBhZGFwdGVyLT5wb3J0X251bSwKLQkJCQkJCSZjb25uZWN0b3IpOworCQlwaHlfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXFfZ2V0X3BoeV9pbmZvKTsKKwkJcGh5X2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBoeV9jbWQuc2l6ZSwKKwkJCQkJJnBoeV9jbWQuZG1hKTsKKwkJaWYgKCFwaHlfY21kLnZhKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHVyZVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlzdGF0dXMgPSBiZV9jbWRfZ2V0X3BoeV9pbmZvKGFkYXB0ZXIsICZwaHlfY21kKTsKIAkJaWYgKCFzdGF0dXMpIHsKLQkJCXN3aXRjaCAoY29ubmVjdG9yKSB7Ci0JCQljYXNlIDc6CisJCQlyZXNwID0gKHN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfcGh5X2luZm8gKikgcGh5X2NtZC52YTsKKwkJCWludGZfdHlwZSA9IGxlMTZfdG9fY3B1KHJlc3AtPmludGVyZmFjZV90eXBlKTsKKworCQkJc3dpdGNoIChpbnRmX3R5cGUpIHsKKwkJCWNhc2UgUEhZX1RZUEVfWEZQXzEwR0I6CisJCQljYXNlIFBIWV9UWVBFX1NGUF8xR0I6CisJCQljYXNlIFBIWV9UWVBFX1NGUF9QTFVTXzEwR0I6CiAJCQkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7Ci0JCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOwotCQkJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7Ci0JCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwogCQkJCWJyZWFrOwogCQkJfQotCQl9IGVsc2UgewotCQkJZWNtZC0+cG9ydCA9IFBPUlRfQVVJOworCisJCQlzd2l0Y2ggKGludGZfdHlwZSkgeworCQkJY2FzZSBQSFlfVFlQRV9LUl8xMEdCOgorCQkJY2FzZSBQSFlfVFlQRV9LWDRfMTBHQjoKKwkJCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CiAJCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAKIAkJLyogU2F2ZSBmb3IgZnV0dXJlIHVzZSAqLwogCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gZWNtZC0+c3BlZWQ7CiAJCWFkYXB0ZXItPnBvcnRfdHlwZSA9IGVjbWQtPnBvcnQ7CiAJCWFkYXB0ZXItPnRyYW5zY2VpdmVyID0gZWNtZC0+dHJhbnNjZWl2ZXI7CisJCWFkYXB0ZXItPmF1dG9uZWcgPSBlY21kLT5hdXRvbmVnOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBoeV9jbWQuc2l6ZSwKKwkJCQkJcGh5X2NtZC52YSwgcGh5X2NtZC5kbWEpOwogCX0gZWxzZSB7CiAJCWVjbWQtPnNwZWVkID0gYWRhcHRlci0+bGlua19zcGVlZDsKIAkJZWNtZC0+cG9ydCA9IGFkYXB0ZXItPnBvcnRfdHlwZTsKIAkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBhZGFwdGVyLT50cmFuc2NlaXZlcjsKKwkJZWNtZC0+YXV0b25lZyA9IGFkYXB0ZXItPmF1dG9uZWc7CiAJfQogCiAJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKIAllY21kLT5waHlfYWRkcmVzcyA9IGFkYXB0ZXItPnBvcnRfbnVtOwogCXN3aXRjaCAoZWNtZC0+cG9ydCkgewogCWNhc2UgUE9SVF9GSUJSRToKQEAgLTM4NCw2ICs0MDUsMTMgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKGVjbWQtPmF1dG9uZWcpIHsKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9BdXRvbmVnOworCQllY21kLT5hZHZlcnRpc2luZyB8PSAoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCUFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9ody5oIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfaHcuaAppbmRleCAwNjMwMjZkLi41ZDM4MDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2h3LmgKQEAgLTUyLDEwICs1MiwyMCBAQAogICovCiAjZGVmaW5lIE1FTUJBUl9DVFJMX0lOVF9DVFJMX0hPU1RJTlRSX01BU0sJKDEgPDwgMjkpIC8qIGJpdCAyOSAqLwogCi0vKioqKioqKioqIFBvd2VyIG1hbmFnbWVudCAoV09MKSAqKioqKioqKioqLworLyoqKioqKioqKiBQb3dlciBtYW5hZ2VtZW50IChXT0wpICoqKioqKioqKiovCiAjZGVmaW5lIFBDSUNGR19QTV9DT05UUk9MX09GRlNFVAkJMHg0NAogI2RlZmluZSBQQ0lDRkdfUE1fQ09OVFJPTF9NQVNLCQkJMHgxMDgJLyogYml0cyAzICYgOCAqLwogCisvKioqKioqKioqIE9ubGluZSBDb250cm9sIFJlZ2lzdGVycyAqKioqKioqLworI2RlZmluZSBQQ0lDRkdfT05MSU5FMAkJCQkweEIwCisjZGVmaW5lIFBDSUNGR19PTkxJTkUxCQkJCTB4QjQKKworLyoqKioqKioqKiBVRSBTdGF0dXMgYW5kIE1hc2sgUmVnaXN0ZXJzICoqKi8KKyNkZWZpbmUgUENJQ0ZHX1VFX1NUQVRVU19MT1cJCQkweEEwCisjZGVmaW5lIFBDSUNGR19VRV9TVEFUVVNfSElHSAkJCTB4QTQKKyNkZWZpbmUgUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTSwkJMHhBOAorI2RlZmluZSBQQ0lDRkdfVUVfU1RBVFVTX0hJX01BU0sJCTB4QUMKKwogLyoqKioqKioqKiBJU1IwIFJlZ2lzdGVyIG9mZnNldCAqKioqKioqKioqLwogI2RlZmluZSBDRVZfSVNSMF9PRkZTRVQgCQkJMHhDMTgKICNkZWZpbmUgQ0VWX0lTUl9TSVpFCQkJCTQKQEAgLTE5Miw3ICsyMDIsNyBAQAogCXU4IGV2ZW50OwogCXU4IGNyYzsKIAl1OCBmb3J3YXJkOwotCXU4IGlwc2VjOworCXU4IGxzbzY7CiAJdTggbWdtdDsKIAl1OCBpcGNzOwogCXU4IHVkcGNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jCmluZGV4IDU0YjE0MjcuLjc0ZTE0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9tYWluLmMKQEAgLTQwLDYgKzQwLDc2IEBACiAJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVfZGV2X2lkcyk7CisvKiBVRSBTdGF0dXMgTG93IENTUiAqLworc3RhdGljIGNoYXIgKnVlX3N0YXR1c19sb3dfZGVzY1tdID0geworCSJDRVYiLAorCSJDVFgiLAorCSJEQlVGIiwKKwkiRVJYIiwKKwkiSG9zdCIsCisJIk1QVSIsCisJIk5ETUEiLAorCSJQVEMgIiwKKwkiUkRNQSAiLAorCSJSWEYgIiwKKwkiUlhJUFMgIiwKKwkiUlhVTFAwICIsCisJIlJYVUxQMSAiLAorCSJSWFVMUDIgIiwKKwkiVElNICIsCisJIlRQT1NUICIsCisJIlRQUkUgIiwKKwkiVFhJUFMgIiwKKwkiVFhVTFAwICIsCisJIlRYVUxQMSAiLAorCSJVQyAiLAorCSJXRE1BICIsCisJIlRYVUxQMiAiLAorCSJIT1NUMSAiLAorCSJQMF9PQl9MSU5LICIsCisJIlAxX09CX0xJTksgIiwKKwkiSE9TVF9HUElPICIsCisJIk1CT1ggIiwKKwkiQVhHTUFDMCIsCisJIkFYR01BQzEiLAorCSJKVEFHIiwKKwkiTVBVX0lOVFBFTkQiCit9OworLyogVUUgU3RhdHVzIEhpZ2ggQ1NSICovCitzdGF0aWMgY2hhciAqdWVfc3RhdHVzX2hpX2Rlc2NbXSA9IHsKKwkiTFBDTUVNSE9TVCIsCisJIk1HTVRfTUFDIiwKKwkiUENTME9OTElORSIsCisJIk1QVV9JUkFNIiwKKwkiUENTMU9OTElORSIsCisJIlBDVEwwIiwKKwkiUENUTDEiLAorCSJQTUVNIiwKKwkiUlIiLAorCSJUWFBCIiwKKwkiUlhQUCIsCisJIlhBVUkiLAorCSJUWFAiLAorCSJBUk0iLAorCSJJUEMiLAorCSJIT1NUMiIsCisJIkhPU1QzIiwKKwkiSE9TVDQiLAorCSJIT1NUNSIsCisJIkhPU1Q2IiwKKwkiSE9TVDciLAorCSJIT1NUOCIsCisJIkhPU1Q5IiwKKwkiTkVUQyIKKwkiVW5rbm93biIsCisJIlVua25vd24iLAorCSJVbmtub3duIiwKKwkiVW5rbm93biIsCisJIlVua25vd24iLAorCSJVbmtub3duIiwKKwkiVW5rbm93biIsCisJIlVua25vd24iCit9OwogCiBzdGF0aWMgdm9pZCBiZV9xdWV1ZV9mcmVlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSkKIHsKQEAgLTg5LDYgKzE1OSw4IEBACiAJdTMyIHZhbCA9IDA7CiAJdmFsIHw9IHFpZCAmIERCX1JRX1JJTkdfSURfTUFTSzsKIAl2YWwgfD0gcG9zdGVkIDw8IERCX1JRX05VTV9QT1NURURfU0hJRlQ7CisKKwl3bWIoKTsKIAlpb3dyaXRlMzIodmFsLCBhZGFwdGVyLT5kYiArIERCX1JRX09GRlNFVCk7CiB9CiAKQEAgLTk3LDYgKzE2OSw4IEBACiAJdTMyIHZhbCA9IDA7CiAJdmFsIHw9IHFpZCAmIERCX1RYVUxQX1JJTkdfSURfTUFTSzsKIAl2YWwgfD0gKHBvc3RlZCAmIERCX1RYVUxQX05VTV9QT1NURURfTUFTSykgPDwgREJfVFhVTFBfTlVNX1BPU1RFRF9TSElGVDsKKworCXdtYigpOwogCWlvd3JpdGUzMih2YWwsIGFkYXB0ZXItPmRiICsgREJfVFhVTFAxX09GRlNFVCk7CiB9CiAKQEAgLTM3MywxMCArNDQ3LDEyIEBACiAKIAlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9oZHJfd3JiLCBjcmMsIGhkciwgMSk7CiAKLQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2VncyA+IDEgJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgeworCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfaGRyX3dyYiwgbHNvLCBoZHIsIDEpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9oZHJfd3JiLCBsc29fbXNzLAogCQkJaGRyLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKKwkJaWYgKHNrYl9pc19nc29fdjYoc2tiKSkKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX2hkcl93cmIsIGxzbzYsIGhkciwgMSk7CiAJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCWlmIChpc190Y3BfcGt0KHNrYikpCiAJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9oZHJfd3JiLCB0Y3BjcywgaGRyLCAxKTsKQEAgLTU0NiwxMSArNjIyLDE4IEBACiAgKiBBIG1heCBvZiA2NCAoQkVfTlVNX1ZMQU5TX1NVUFBPUlRFRCkgdmxhbnMgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gQkUuCiAgKiBJZiB0aGUgdXNlciBjb25maWd1cmVzIG1vcmUsIHBsYWNlIEJFIGluIHZsYW4gcHJvbWlzY3VvdXMgbW9kZS4KICAqLwotc3RhdGljIGludCBiZV92aWRfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBiZV92aWRfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBib29sIHZmLCB1MzIgdmZfbnVtKQogewogCXUxNiB2dGFnW0JFX05VTV9WTEFOU19TVVBQT1JURURdOwogCXUxNiBudGFncyA9IDAsIGk7CiAJaW50IHN0YXR1cyA9IDA7CisJdTMyIGlmX2hhbmRsZTsKKworCWlmICh2ZikgeworCQlpZl9oYW5kbGUgPSBhZGFwdGVyLT52Zl9jZmdbdmZfbnVtXS52Zl9pZl9oYW5kbGU7CisJCXZ0YWdbMF0gPSBjcHVfdG9fbGUxNihhZGFwdGVyLT52Zl9jZmdbdmZfbnVtXS52Zl92bGFuX3RhZyk7CisJCXN0YXR1cyA9IGJlX2NtZF92bGFuX2NvbmZpZyhhZGFwdGVyLCBpZl9oYW5kbGUsIHZ0YWcsIDEsIDEsIDApOworCX0KIAogCWlmIChhZGFwdGVyLT52bGFuc19hZGRlZCA8PSBhZGFwdGVyLT5tYXhfdmxhbnMpICB7CiAJCS8qIENvbnN0cnVjdCBWTEFOIFRhYmxlIHRvIGdpdmUgdG8gSFcgKi8KQEAgLTU2Niw2ICs2NDksNyBAQAogCQlzdGF0dXMgPSBiZV9jbWRfdmxhbl9jb25maWcoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLAogCQkJCQlOVUxMLCAwLCAxLCAxKTsKIAl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC01ODYsMjcgKzY3MCwyOCBAQAogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAorCWFkYXB0ZXItPnZsYW5zX2FkZGVkKys7CiAJaWYgKCFiZV9waHlzZm4oYWRhcHRlcikpCiAJCXJldHVybjsKIAogCWFkYXB0ZXItPnZsYW5fdGFnW3ZpZF0gPSAxOwotCWFkYXB0ZXItPnZsYW5zX2FkZGVkKys7CiAJaWYgKGFkYXB0ZXItPnZsYW5zX2FkZGVkIDw9IChhZGFwdGVyLT5tYXhfdmxhbnMgKyAxKSkKLQkJYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKKwkJYmVfdmlkX2NvbmZpZyhhZGFwdGVyLCBmYWxzZSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAorCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07CisJdmxhbl9ncm91cF9zZXRfZGV2aWNlKGFkYXB0ZXItPnZsYW5fZ3JwLCB2aWQsIE5VTEwpOworCiAJaWYgKCFiZV9waHlzZm4oYWRhcHRlcikpCiAJCXJldHVybjsKIAogCWFkYXB0ZXItPnZsYW5fdGFnW3ZpZF0gPSAwOwotCXZsYW5fZ3JvdXBfc2V0X2RldmljZShhZGFwdGVyLT52bGFuX2dycCwgdmlkLCBOVUxMKTsKLQlhZGFwdGVyLT52bGFuc19hZGRlZC0tOwogCWlmIChhZGFwdGVyLT52bGFuc19hZGRlZCA8PSBhZGFwdGVyLT5tYXhfdmxhbnMpCi0JCWJlX3ZpZF9jb25maWcoYWRhcHRlcik7CisJCWJlX3ZpZF9jb25maWcoYWRhcHRlciwgZmFsc2UsIDApOwogfQogCiBzdGF0aWMgdm9pZCBiZV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKQEAgLTY1MCwxNCArNzM1LDkzIEBACiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1hYykgfHwgKHZmID49IG51bV92ZnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT52Zl9pZl9oYW5kbGVbdmZdLAotCQkJCWFkYXB0ZXItPnZmX3BtYWNfaWRbdmZdKTsKKwlpZiAoYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9wbWFjX2lkICE9IEJFX0lOVkFMSURfUE1BQ19JRCkKKwkJc3RhdHVzID0gYmVfY21kX3BtYWNfZGVsKGFkYXB0ZXIsCisJCQkJCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfaWZfaGFuZGxlLAorCQkJCQlhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3BtYWNfaWQpOwogCi0Jc3RhdHVzID0gYmVfY21kX3BtYWNfYWRkKGFkYXB0ZXIsIG1hYywgYWRhcHRlci0+dmZfaWZfaGFuZGxlW3ZmXSwKLQkJCQkmYWRhcHRlci0+dmZfcG1hY19pZFt2Zl0pOwotCWlmICghc3RhdHVzKQorCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLCBtYWMsCisJCQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9pZl9oYW5kbGUsCisJCQkJJmFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfcG1hY19pZCk7CisKKwlpZiAoc3RhdHVzKQogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJNQUMgJXBNIHNldCBvbiBWRiAlZCBGYWlsZWRcbiIsCiAJCQkJbWFjLCB2Zik7CisJZWxzZQorCQltZW1jcHkoYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9tYWNfYWRkciwgbWFjLCBFVEhfQUxFTik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJlX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAorCQkJc3RydWN0IGlmbGFfdmZfaW5mbyAqdmkpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKCFhZGFwdGVyLT5zcmlvdl9lbmFibGVkKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHZmID49IG51bV92ZnMpCisJCXJldHVybiAtRUlOVkFMOworCisJdmktPnZmID0gdmY7CisJdmktPnR4X3JhdGUgPSBhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3R4X3JhdGU7CisJdmktPnZsYW4gPSBhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3ZsYW5fdGFnOworCXZpLT5xb3MgPSAwOworCW1lbWNweSgmdmktPm1hYywgYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9tYWNfYWRkciwgRVRIX0FMRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCWludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcykKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoIWFkYXB0ZXItPnNyaW92X2VuYWJsZWQpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoKHZmID49IG51bV92ZnMpIHx8ICh2bGFuID4gNDA5NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZsYW4pIHsKKwkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl92bGFuX3RhZyA9IHZsYW47CisJCWFkYXB0ZXItPnZsYW5zX2FkZGVkKys7CisJfSBlbHNlIHsKKwkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl92bGFuX3RhZyA9IDA7CisJCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07CisJfQorCisJc3RhdHVzID0gYmVfdmlkX2NvbmZpZyhhZGFwdGVyLCB0cnVlLCB2Zik7CisKKwlpZiAoc3RhdHVzKQorCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJWTEFOICVkIGNvbmZpZyBvbiBWRiAlZCBmYWlsZWRcbiIsIHZsYW4sIHZmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJlX3NldF92Zl90eF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQlpbnQgdmYsIGludCByYXRlKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghYWRhcHRlci0+c3Jpb3ZfZW5hYmxlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICgodmYgPj0gbnVtX3ZmcykgfHwgKHJhdGUgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmF0ZSA+IDEwMDAwKQorCQlyYXRlID0gMTAwMDA7CisKKwlhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3R4X3JhdGUgPSByYXRlOworCXN0YXR1cyA9IGJlX2NtZF9zZXRfcW9zKGFkYXB0ZXIsIHJhdGUgLyAxMCwgdmYpOworCisJaWYgKHN0YXR1cykKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkidHggcmF0ZSAlZCBvbiBWRiAlZCBmYWlsZWRcbiIsIHJhdGUsIHZmKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC04NjksNyArMTAzMyw3IEBACiAKIAkvKiB2bGFuZiBjb3VsZCBiZSB3cm9uZ2x5IHNldCBpbiBzb21lIGNhcmRzLgogCSAqIGlnbm9yZSBpZiB2dG0gaXMgbm90IHNldCAqLwotCWlmICgoYWRhcHRlci0+Y2FwICYgMHg0MDApICYmICF2dG0pCisJaWYgKChhZGFwdGVyLT5mdW5jdGlvbl9tb2RlICYgMHg0MDApICYmICF2dG0pCiAJCXZsYW5mID0gMDsKIAogCWlmICh1bmxpa2VseSh2bGFuZikpIHsKQEAgLTkwOSw3ICsxMDczLDcgQEAKIAogCS8qIHZsYW5mIGNvdWxkIGJlIHdyb25nbHkgc2V0IGluIHNvbWUgY2FyZHMuCiAJICogaWdub3JlIGlmIHZ0bSBpcyBub3Qgc2V0ICovCi0JaWYgKChhZGFwdGVyLT5jYXAgJiAweDQwMCkgJiYgIXZ0bSkKKwlpZiAoKGFkYXB0ZXItPmZ1bmN0aW9uX21vZGUgJiAweDQwMCkgJiYgIXZ0bSkKIAkJdmxhbmYgPSAwOwogCiAJc2tiID0gbmFwaV9nZXRfZnJhZ3MoJmVxX29iai0+bmFwaSk7CkBAIC05NzEsNiArMTEzNSw3IEBACiAJaWYgKHJ4Y3AtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbCwgdmFsaWQpIC8gMzJdID09IDApCiAJCXJldHVybiBOVUxMOwogCisJcm1iKCk7CiAJYmVfZHdzX2xlX3RvX2NwdShyeGNwLCBzaXplb2YoKnJ4Y3ApKTsKIAogCXF1ZXVlX3RhaWxfaW5jKCZhZGFwdGVyLT5yeF9vYmouY3EpOwpAQCAtMTA2NCw2ICsxMjI5LDcgQEAKIAlpZiAodHhjcC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXRoX3R4X2NvbXBsLCB2YWxpZCkgLyAzMl0gPT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKKwlybWIoKTsKIAliZV9kd3NfbGVfdG9fY3B1KHR4Y3AsIHNpemVvZigqdHhjcCkpOwogCiAJdHhjcC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXRoX3R4X2NvbXBsLCB2YWxpZCkgLyAzMl0gPSAwOwpAQCAtMTExMSw2ICsxMjc3LDcgQEAKIAlpZiAoIWVxZS0+ZXZ0KQogCQlyZXR1cm4gTlVMTDsKIAorCXJtYigpOwogCWVxZS0+ZXZ0ID0gbGUzMl90b19jcHUoZXFlLT5ldnQpOwogCXF1ZXVlX3RhaWxfaW5jKCZlcV9vYmotPnEpOwogCXJldHVybiBlcWU7CkBAIC0xNTc2LDEyICsxNzQzLDY2IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBiZV9kZXRlY3RfdWUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIG9ubGluZTAgPSAwLCBvbmxpbmUxID0gMDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBQQ0lDRkdfT05MSU5FMCwgJm9ubGluZTApOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIFBDSUNGR19PTkxJTkUxLCAmb25saW5lMSk7CisKKwlpZiAoIW9ubGluZTAgfHwgIW9ubGluZTEpIHsKKwkJYWRhcHRlci0+dWVfZGV0ZWN0ZWQgPSB0cnVlOworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiVUUgRGV0ZWN0ZWQhISBvbmxpbmUwPSVkIG9ubGluZTE9JWRcbiIsCisJCQlvbmxpbmUwLCBvbmxpbmUxKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGJlX2R1bXBfdWUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHVlX3N0YXR1c19sbywgdWVfc3RhdHVzX2hpLCB1ZV9zdGF0dXNfbG9fbWFzaywgdWVfc3RhdHVzX2hpX21hc2s7CisJdTMyIGk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKKwkJCQlQQ0lDRkdfVUVfU1RBVFVTX0xPVywgJnVlX3N0YXR1c19sbyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCisJCQkJUENJQ0ZHX1VFX1NUQVRVU19ISUdILCAmdWVfc3RhdHVzX2hpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKKwkJCQlQQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLLCAmdWVfc3RhdHVzX2xvX21hc2spOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAorCQkJCVBDSUNGR19VRV9TVEFUVVNfSElfTUFTSywgJnVlX3N0YXR1c19oaV9tYXNrKTsKKworCXVlX3N0YXR1c19sbyA9ICh1ZV9zdGF0dXNfbG8gJiAofnVlX3N0YXR1c19sb19tYXNrKSk7CisJdWVfc3RhdHVzX2hpID0gKHVlX3N0YXR1c19oaSAmICh+dWVfc3RhdHVzX2hpX21hc2spKTsKKworCWlmICh1ZV9zdGF0dXNfbG8pIHsKKwkJZm9yIChpID0gMDsgdWVfc3RhdHVzX2xvOyB1ZV9zdGF0dXNfbG8gPj49IDEsIGkrKykgeworCQkJaWYgKHVlX3N0YXR1c19sbyAmIDEpCisJCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJVRTogJXMgYml0IHNldFxuIiwgdWVfc3RhdHVzX2xvd19kZXNjW2ldKTsKKwkJfQorCX0KKwlpZiAodWVfc3RhdHVzX2hpKSB7CisJCWZvciAoaSA9IDA7IHVlX3N0YXR1c19oaTsgdWVfc3RhdHVzX2hpID4+PSAxLCBpKyspIHsKKwkJCWlmICh1ZV9zdGF0dXNfaGkgJiAxKQorCQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiVUU6ICVzIGJpdCBzZXRcbiIsIHVlX3N0YXR1c19oaV9kZXNjW2ldKTsKKwkJfQorCX0KKworfQorCiBzdGF0aWMgdm9pZCBiZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZV9hZGFwdGVyLCB3b3JrLndvcmspOwogCi0JYmVfY21kX2dldF9zdGF0cyhhZGFwdGVyLCAmYWRhcHRlci0+c3RhdHMuY21kKTsKKwlpZiAoIWFkYXB0ZXItPnN0YXRzX2lvY3RsX3NlbnQpCisJCWJlX2NtZF9nZXRfc3RhdHMoYWRhcHRlciwgJmFkYXB0ZXItPnN0YXRzLmNtZCk7CiAKIAkvKiBTZXQgRVEgZGVsYXkgKi8KIAliZV9yeF9lcWRfdXBkYXRlKGFkYXB0ZXIpOwpAQCAtMTU5Myw2ICsxODE0LDEwIEBACiAJCWFkYXB0ZXItPnJ4X3Bvc3Rfc3RhcnZlZCA9IGZhbHNlOwogCQliZV9wb3N0X3J4X2ZyYWdzKGFkYXB0ZXIpOwogCX0KKwlpZiAoIWFkYXB0ZXItPnVlX2RldGVjdGVkKSB7CisJCWlmIChiZV9kZXRlY3RfdWUoYWRhcHRlcikpCisJCQliZV9kdW1wX3VlKGFkYXB0ZXIpOworCX0KIAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWRhcHRlci0+d29yaywgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiB9CkBAIC0xNjIwLDkgKzE4NDUsMTEgQEAKIAogc3RhdGljIHZvaWQgYmVfc3Jpb3ZfZW5hYmxlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogeworCWJlX2NoZWNrX3NyaW92X2ZuX3R5cGUoYWRhcHRlcik7CiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKLQlpbnQgc3RhdHVzOwogCWlmIChiZV9waHlzZm4oYWRhcHRlcikgJiYgbnVtX3ZmcykgeworCQlpbnQgc3RhdHVzOworCiAJCXN0YXR1cyA9IHBjaV9lbmFibGVfc3Jpb3YoYWRhcHRlci0+cGRldiwgbnVtX3Zmcyk7CiAJCWFkYXB0ZXItPnNyaW92X2VuYWJsZWQgPSBzdGF0dXMgPyBmYWxzZSA6IHRydWU7CiAJfQpAQCAtMTczNSw2ICsxOTYyLDQ0IEBACiAJYWRhcHRlci0+aXNyX3JlZ2lzdGVyZWQgPSBmYWxzZTsKIH0KIAorc3RhdGljIGludCBiZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfZXFfb2JqICpyeF9lcSA9ICZhZGFwdGVyLT5yeF9lcTsKKwlzdHJ1Y3QgYmVfZXFfb2JqICp0eF9lcSA9ICZhZGFwdGVyLT50eF9lcTsKKwlpbnQgdmVjOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZhZGFwdGVyLT53b3JrKTsKKworCWJlX2FzeW5jX21jY19kaXNhYmxlKGFkYXB0ZXIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJYWRhcHRlci0+bGlua191cCA9IGZhbHNlOworCisJYmVfaW50cl9zZXQoYWRhcHRlciwgZmFsc2UpOworCisJaWYgKGFkYXB0ZXItPm1zaXhfZW5hYmxlZCkgeworCQl2ZWMgPSBiZV9tc2l4X3ZlY19nZXQoYWRhcHRlciwgdHhfZXEtPnEuaWQpOworCQlzeW5jaHJvbml6ZV9pcnEodmVjKTsKKwkJdmVjID0gYmVfbXNpeF92ZWNfZ2V0KGFkYXB0ZXIsIHJ4X2VxLT5xLmlkKTsKKwkJc3luY2hyb25pemVfaXJxKHZlYyk7CisJfSBlbHNlIHsKKwkJc3luY2hyb25pemVfaXJxKG5ldGRldi0+aXJxKTsKKwl9CisJYmVfaXJxX3VucmVnaXN0ZXIoYWRhcHRlcik7CisKKwluYXBpX2Rpc2FibGUoJnJ4X2VxLT5uYXBpKTsKKwluYXBpX2Rpc2FibGUoJnR4X2VxLT5uYXBpKTsKKworCS8qIFdhaXQgZm9yIGFsbCBwZW5kaW5nIHR4IGNvbXBsZXRpb25zIHRvIGFycml2ZSBzbyB0aGF0CisJICogYWxsIHR4IHNrYnMgYXJlIGZyZWVkLgorCSAqLworCWJlX3R4X2NvbXBsX2NsZWFuKGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTE3NjUsMjcgKzIwMzAsMjkgQEAKIAkvKiBOb3cgdGhhdCBpbnRlcnJ1cHRzIGFyZSBvbiB3ZSBjYW4gcHJvY2VzcyBhc3luYyBtY2MgKi8KIAliZV9hc3luY19tY2NfZW5hYmxlKGFkYXB0ZXIpOwogCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOworCiAJc3RhdHVzID0gYmVfY21kX2xpbmtfc3RhdHVzX3F1ZXJ5KGFkYXB0ZXIsICZsaW5rX3VwLCAmbWFjX3NwZWVkLAogCQkJJmxpbmtfc3BlZWQpOwogCWlmIChzdGF0dXMpCi0JCWdvdG8gcmV0X3N0czsKKwkJZ290byBlcnI7CiAJYmVfbGlua19zdGF0dXNfdXBkYXRlKGFkYXB0ZXIsIGxpbmtfdXApOwogCi0JaWYgKGJlX3BoeXNmbihhZGFwdGVyKSkKLQkJc3RhdHVzID0gYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIHJldF9zdHM7Ci0KIAlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7CisJCXN0YXR1cyA9IGJlX3ZpZF9jb25maWcoYWRhcHRlciwgZmFsc2UsIDApOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBlcnI7CisKIAkJc3RhdHVzID0gYmVfY21kX3NldF9mbG93X2NvbnRyb2woYWRhcHRlciwKIAkJCQlhZGFwdGVyLT50eF9mYywgYWRhcHRlci0+cnhfZmMpOwogCQlpZiAoc3RhdHVzKQotCQkJZ290byByZXRfc3RzOworCQkJZ290byBlcnI7CiAJfQogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwotcmV0X3N0czoKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiAwOworZXJyOgorCWJlX2Nsb3NlKGFkYXB0ZXItPm5ldGRldik7CisJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbnQgYmVfc2V0dXBfd29sKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSkKQEAgLTE4NTMsMTMgKzIxMjAsMTUgQEAKIAkJCWNhcF9mbGFncyA9IGVuX2ZsYWdzID0gQkVfSUZfRkxBR1NfVU5UQUdHRUQKIAkJCQkJfCBCRV9JRl9GTEFHU19CUk9BRENBU1Q7CiAJCQlzdGF0dXMgPSBiZV9jbWRfaWZfY3JlYXRlKGFkYXB0ZXIsIGNhcF9mbGFncywgZW5fZmxhZ3MsCi0JCQkJCW1hYywgdHJ1ZSwgJmFkYXB0ZXItPnZmX2lmX2hhbmRsZVt2Zl0sCisJCQkJCW1hYywgdHJ1ZSwKKwkJCQkJJmFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfaWZfaGFuZGxlLAogCQkJCQlOVUxMLCB2ZisxKTsKIAkJCWlmIChzdGF0dXMpIHsKIAkJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIkludGVyZmFjZSBDcmVhdGUgZmFpbGVkIGZvciBWRiAlZFxuIiwgdmYpOwogCQkJCWdvdG8gaWZfZGVzdHJveTsKIAkJCX0KKwkJCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfcG1hY19pZCA9IEJFX0lOVkFMSURfUE1BQ19JRDsKIAkJCXZmKys7CiAJCX0KIAl9IGVsc2UgaWYgKCFiZV9waHlzZm4oYWRhcHRlcikpIHsKQEAgLTE4OTMsOCArMjE2Miw5IEBACiAJYmVfdHhfcXVldWVzX2Rlc3Ryb3koYWRhcHRlcik7CiBpZl9kZXN0cm95OgogCWZvciAodmYgPSAwOyB2ZiA8IG51bV92ZnM7IHZmKyspCi0JCWlmIChhZGFwdGVyLT52Zl9pZl9oYW5kbGVbdmZdKQotCQkJYmVfY21kX2lmX2Rlc3Ryb3koYWRhcHRlciwgYWRhcHRlci0+dmZfaWZfaGFuZGxlW3ZmXSk7CisJCWlmIChhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX2lmX2hhbmRsZSkKKwkJCWJlX2NtZF9pZl9kZXN0cm95KGFkYXB0ZXIsCisJCQkJCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfaWZfaGFuZGxlKTsKIAliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUpOwogZG9fbm9uZToKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTkxMyw0MyArMjE4Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGJlX2VxX29iaiAqcnhfZXEgPSAmYWRhcHRlci0+cnhfZXE7Ci0Jc3RydWN0IGJlX2VxX29iaiAqdHhfZXEgPSAmYWRhcHRlci0+dHhfZXE7Ci0JaW50IHZlYzsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWRhcHRlci0+d29yayk7Ci0KLQliZV9hc3luY19tY2NfZGlzYWJsZShhZGFwdGVyKTsKLQotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCWFkYXB0ZXItPmxpbmtfdXAgPSBmYWxzZTsKLQotCWJlX2ludHJfc2V0KGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChhZGFwdGVyLT5tc2l4X2VuYWJsZWQpIHsKLQkJdmVjID0gYmVfbXNpeF92ZWNfZ2V0KGFkYXB0ZXIsIHR4X2VxLT5xLmlkKTsKLQkJc3luY2hyb25pemVfaXJxKHZlYyk7Ci0JCXZlYyA9IGJlX21zaXhfdmVjX2dldChhZGFwdGVyLCByeF9lcS0+cS5pZCk7Ci0JCXN5bmNocm9uaXplX2lycSh2ZWMpOwotCX0gZWxzZSB7Ci0JCXN5bmNocm9uaXplX2lycShuZXRkZXYtPmlycSk7Ci0JfQotCWJlX2lycV91bnJlZ2lzdGVyKGFkYXB0ZXIpOwotCi0JbmFwaV9kaXNhYmxlKCZyeF9lcS0+bmFwaSk7Ci0JbmFwaV9kaXNhYmxlKCZ0eF9lcS0+bmFwaSk7Ci0KLQkvKiBXYWl0IGZvciBhbGwgcGVuZGluZyB0eCBjb21wbGV0aW9ucyB0byBhcnJpdmUgc28gdGhhdAotCSAqIGFsbCB0eCBza2JzIGFyZSBmcmVlZC4KLQkgKi8KLQliZV90eF9jb21wbF9jbGVhbihhZGFwdGVyKTsKLQotCXJldHVybiAwOwotfQogCiAjZGVmaW5lIEZXX0ZJTEVfSERSX1NJR04gCSJTZXJ2ZXJFbmdpbmVzIENvcnAuICIKIGNoYXIgZmxhc2hfY29va2llWzJdWzE2XSA9CXsiKioqIFNFIEZMQVMiLApAQCAtMjE3NCw3ICsyNDA3LDEwIEBACiAJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYmVfdmxhbl9yZWdpc3RlciwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IGJlX3ZsYW5fYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBiZV92bGFuX3JlbV92aWQsCi0JLm5kb19zZXRfdmZfbWFjCQk9IGJlX3NldF92Zl9tYWMKKwkubmRvX3NldF92Zl9tYWMJCT0gYmVfc2V0X3ZmX21hYywKKwkubmRvX3NldF92Zl92bGFuCT0gYmVfc2V0X3ZmX3ZsYW4sCisJLm5kb19zZXRfdmZfdHhfcmF0ZQk9IGJlX3NldF92Zl90eF9yYXRlLAorCS5uZG9fZ2V0X3ZmX2NvbmZpZwk9IGJlX2dldF92Zl9jb25maWcKIH07CiAKIHN0YXRpYyB2b2lkIGJlX25ldGRldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC0yMTgzLDcgKzI0MTksNyBAQAogCiAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9UU08gfAogCQlORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSIHwgTkVUSUZfRl9IV19DU1VNIHwKLQkJTkVUSUZfRl9HUk87CisJCU5FVElGX0ZfR1JPIHwgTkVUSUZfRl9UU082OwogCiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX1RTTyB8IE5FVElGX0ZfSFdfQ1NVTTsKIApAQCAtMjM5Myw3ICsyNjI5LDcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCXN0YXR1cyA9IGJlX2NtZF9xdWVyeV9md19jZmcoYWRhcHRlciwKLQkJCQkmYWRhcHRlci0+cG9ydF9udW0sICZhZGFwdGVyLT5jYXApOworCQkJCSZhZGFwdGVyLT5wb3J0X251bSwgJmFkYXB0ZXItPmZ1bmN0aW9uX21vZGUpOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAKQEAgLTI0MTMsNyArMjY0OSw3IEBACiAJCW1lbWNweShhZGFwdGVyLT5uZXRkZXYtPnBlcm1fYWRkciwgbWFjLCBFVEhfQUxFTik7CiAJfQogCi0JaWYgKGFkYXB0ZXItPmNhcCAmIDB4NDAwKQorCWlmIChhZGFwdGVyLT5mdW5jdGlvbl9tb2RlICYgMHg0MDApCiAJCWFkYXB0ZXItPm1heF92bGFucyA9IEJFX05VTV9WTEFOU19TVVBQT1JURUQvNDsKIAllbHNlCiAJCWFkYXB0ZXItPm1heF92bGFucyA9IEJFX05VTV9WTEFOU19TVVBQT1JURUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZmluX21hYy5jIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuYwppbmRleCAzNjhmMzMzLi4wMTI2MTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKQEAgLTkyMiw2MSArOTIyLDczIEBACiAjIGRlZmluZSBiZmluX3R4X2h3dHN0YW1wKGRldiwgc2tiKQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGFkanVzdF90eF9saXN0KHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgX3R4X3JlY2xhaW1fc2tiKHZvaWQpCiB7Ci0JaW50IHRpbWVvdXRfY250ID0gTUFYX1RJTUVPVVRfQ05UOwotCi0JaWYgKHR4X2xpc3RfaGVhZC0+c3RhdHVzLnN0YXR1c193b3JkICE9IDAgJiYKLQkgICAgY3VycmVudF90eF9wdHIgIT0gdHhfbGlzdF9oZWFkKSB7Ci0JCWdvdG8gYWRqdXN0X2hlYWQ7CS8qIHJlbGVhc2VkIHNvbWV0aGluZywganVzdCByZXR1cm47ICovCi0JfQotCi0JLyoKLQkgKiBpZiBub3RoaW5nIHJlbGVhc2VkLCBjaGVjayB3YWl0IGNvbmRpdGlvbgotCSAqIGN1cnJlbnQncyBuZXh0IGNhbiBub3QgYmUgdGhlIGhlYWQsCi0JICogb3RoZXJ3aXNlIHRoZSBkbWEgd2lsbCBub3Qgc3RvcCBhcyB3ZSB3YW50Ci0JICovCi0JaWYgKGN1cnJlbnRfdHhfcHRyLT5uZXh0LT5uZXh0ID09IHR4X2xpc3RfaGVhZCkgewotCQl3aGlsZSAodHhfbGlzdF9oZWFkLT5zdGF0dXMuc3RhdHVzX3dvcmQgPT0gMCkgewotCQkJdWRlbGF5KDEwKTsKLQkJCWlmICh0eF9saXN0X2hlYWQtPnN0YXR1cy5zdGF0dXNfd29yZCAhPSAwIHx8Ci0JCQkgICAgIShiZmluX3JlYWRfRE1BMl9JUlFfU1RBVFVTKCkgJiBETUFfUlVOKSkgewotCQkJCWdvdG8gYWRqdXN0X2hlYWQ7Ci0JCQl9Ci0JCQlpZiAodGltZW91dF9jbnQtLSA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKLQkJCQkiOiB3YWl0IGZvciBhZGp1c3QgdHggbGlzdCBoZWFkIHRpbWVvdXRcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICh0eF9saXN0X2hlYWQtPnN0YXR1cy5zdGF0dXNfd29yZCAhPSAwKSB7Ci0JCQlnb3RvIGFkanVzdF9oZWFkOwotCQl9Ci0JfQotCi0JcmV0dXJuOwotCi1hZGp1c3RfaGVhZDoKIAlkbyB7CiAJCXR4X2xpc3RfaGVhZC0+ZGVzY19hLmNvbmZpZyAmPSB+RE1BRU47CiAJCXR4X2xpc3RfaGVhZC0+c3RhdHVzLnN0YXR1c193b3JkID0gMDsKIAkJaWYgKHR4X2xpc3RfaGVhZC0+c2tiKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHR4X2xpc3RfaGVhZC0+c2tiKTsKIAkJCXR4X2xpc3RfaGVhZC0+c2tiID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQotCQkJICAgICAgICI6IG5vIHNrX2J1ZmYgaW4gYSB0cmFuc21pdHRlZCBmcmFtZSFcbiIpOwogCQl9CiAJCXR4X2xpc3RfaGVhZCA9IHR4X2xpc3RfaGVhZC0+bmV4dDsKLQl9IHdoaWxlICh0eF9saXN0X2hlYWQtPnN0YXR1cy5zdGF0dXNfd29yZCAhPSAwICYmCi0JCSBjdXJyZW50X3R4X3B0ciAhPSB0eF9saXN0X2hlYWQpOwotCXJldHVybjsKIAorCX0gd2hpbGUgKHR4X2xpc3RfaGVhZC0+c3RhdHVzLnN0YXR1c193b3JkICE9IDApOworfQorCitzdGF0aWMgdm9pZCB0eF9yZWNsYWltX3NrYihzdHJ1Y3QgYmZpbl9tYWNfbG9jYWwgKmxwKQoreworCWludCB0aW1lb3V0X2NudCA9IE1BWF9USU1FT1VUX0NOVDsKKworCWlmICh0eF9saXN0X2hlYWQtPnN0YXR1cy5zdGF0dXNfd29yZCAhPSAwKQorCQlfdHhfcmVjbGFpbV9za2IoKTsKKworCWlmIChjdXJyZW50X3R4X3B0ci0+bmV4dCA9PSB0eF9saXN0X2hlYWQpIHsKKwkJd2hpbGUgKHR4X2xpc3RfaGVhZC0+c3RhdHVzLnN0YXR1c193b3JkID09IDApIHsKKwkJCS8qIHNsb3cgZG93biBwb2xsaW5nIHRvIGF2b2lkIHRvbyBtYW55IHF1ZXVlIHN0b3AuICovCisJCQl1ZGVsYXkoMTApOworCQkJLyogcmVjbGFpbSBza2IgaWYgRE1BIGlzIG5vdCBydW5uaW5nLiAqLworCQkJaWYgKCEoYmZpbl9yZWFkX0RNQTJfSVJRX1NUQVRVUygpICYgRE1BX1JVTikpCisJCQkJYnJlYWs7CisJCQlpZiAodGltZW91dF9jbnQtLSA8IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGltZW91dF9jbnQgPj0gMCkKKwkJCV90eF9yZWNsYWltX3NrYigpOworCQllbHNlCisJCQluZXRpZl9zdG9wX3F1ZXVlKGxwLT5uZGV2KTsKKwl9CisKKwlpZiAoY3VycmVudF90eF9wdHItPm5leHQgIT0gdHhfbGlzdF9oZWFkICYmCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQobHAtPm5kZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGxwLT5uZGV2KTsKKworCWlmICh0eF9saXN0X2hlYWQgIT0gY3VycmVudF90eF9wdHIpIHsKKwkJLyogc2hvcnRlbiB0aGUgdGltZXIgaW50ZXJ2YWwgaWYgdHggcXVldWUgaXMgc3RvcHBlZCAqLworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChscC0+bmRldikpCisJCQlscC0+dHhfcmVjbGFpbV90aW1lci5leHBpcmVzID0KKwkJCQlqaWZmaWVzICsgKFRYX1JFQ0xBSU1fSklGRklFUyA+PiA0KTsKKwkJZWxzZQorCQkJbHAtPnR4X3JlY2xhaW1fdGltZXIuZXhwaXJlcyA9CisJCQkJamlmZmllcyArIFRYX1JFQ0xBSU1fSklGRklFUzsKKworCQltb2RfdGltZXIoJmxwLT50eF9yZWNsYWltX3RpbWVyLAorCQkJbHAtPnR4X3JlY2xhaW1fdGltZXIuZXhwaXJlcyk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0eF9yZWNsYWltX3NrYl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgbHApCit7CisJdHhfcmVjbGFpbV9za2IoKHN0cnVjdCBiZmluX21hY19sb2NhbCAqKWxwKTsKIH0KIAogc3RhdGljIGludCBiZmluX21hY19oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBiZmluX21hY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiAqZGF0YTsKIAl1MzIgZGF0YV9hbGlnbiA9ICh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEpICYgMHgzOwogCXVuaW9uIHNrYl9zaGFyZWRfdHggKnNodHggPSBza2JfdHgoc2tiKTsKQEAgLTEwMDksOCArMTAyMSw2IEBACiAJCQlza2ItPmxlbik7CiAJCWN1cnJlbnRfdHhfcHRyLT5kZXNjX2Euc3RhcnRfYWRkciA9CiAJCQkodTMyKWN1cnJlbnRfdHhfcHRyLT5wYWNrZXQ7Ci0JCWlmIChjdXJyZW50X3R4X3B0ci0+c3RhdHVzLnN0YXR1c193b3JkICE9IDApCi0JCQljdXJyZW50X3R4X3B0ci0+c3RhdHVzLnN0YXR1c193b3JkID0gMDsKIAkJYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKAogCQkJKHUzMiljdXJyZW50X3R4X3B0ci0+cGFja2V0LAogCQkJKHUzMikoY3VycmVudF90eF9wdHItPnBhY2tldCArIHNrYi0+bGVuICsgMikpOwpAQCAtMTAyMiw2ICsxMDMyLDkgQEAKIAkgKi8KIAlTU1lOQygpOwogCisJLyogYWx3YXlzIGNsZWFyIHN0YXR1cyBidWZmZXIgYmVmb3JlIHN0YXJ0IHR4IGRtYSAqLworCWN1cnJlbnRfdHhfcHRyLT5zdGF0dXMuc3RhdHVzX3dvcmQgPSAwOworCiAJLyogZW5hYmxlIHRoaXMgcGFja2V0J3MgZG1hICovCiAJY3VycmVudF90eF9wdHItPmRlc2NfYS5jb25maWcgfD0gRE1BRU47CiAKQEAgLTEwMzcsMTMgKzEwNTAsMTQgQEAKIAliZmluX3dyaXRlX0VNQUNfT1BNT0RFKGJmaW5fcmVhZF9FTUFDX09QTU9ERSgpIHwgVEUpOwogCiBvdXQ6Ci0JYWRqdXN0X3R4X2xpc3QoKTsKLQogCWJmaW5fdHhfaHd0c3RhbXAoZGV2LCBza2IpOwogCiAJY3VycmVudF90eF9wdHIgPSBjdXJyZW50X3R4X3B0ci0+bmV4dDsKIAlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IChza2ItPmxlbik7CisKKwl0eF9yZWNsYWltX3NrYihscCk7CisKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCkBAIC0xMTY3LDggKzExODEsMTEgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgYmZpbl9tYWNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBiZmluX21hY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJZGlzYWJsZV9pcnEoSVJRX01BQ19SWCk7CiAJYmZpbl9tYWNfaW50ZXJydXB0KElSUV9NQUNfUlgsIGRldik7CisJdHhfcmVjbGFpbV9za2IobHApOwogCWVuYWJsZV9pcnEoSVJRX01BQ19SWCk7CiB9CiAjZW5kaWYJCQkJLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KQEAgLTEyMzIsMTIgKzEyNDksMjcgQEAKIC8qIE91ciB3YXRjaGRvZyB0aW1lZCBvdXQuIENhbGxlZCBieSB0aGUgbmV0d29ya2luZyBsYXllciAqLwogc3RhdGljIHZvaWQgYmZpbl9tYWNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBiZmluX21hY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJcHJfZGVidWcoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAliZmluX21hY19kaXNhYmxlKCk7CiAKLQkvKiByZXNldCB0eCBxdWV1ZSAqLwotCXR4X2xpc3RfdGFpbCA9IHR4X2xpc3RfaGVhZC0+bmV4dDsKKwlkZWxfdGltZXIoJmxwLT50eF9yZWNsYWltX3RpbWVyKTsKKworCS8qIHJlc2V0IHR4IHF1ZXVlIGFuZCBmcmVlIHNrYiAqLworCXdoaWxlICh0eF9saXN0X2hlYWQgIT0gY3VycmVudF90eF9wdHIpIHsKKwkJdHhfbGlzdF9oZWFkLT5kZXNjX2EuY29uZmlnICY9IH5ETUFFTjsKKwkJdHhfbGlzdF9oZWFkLT5zdGF0dXMuc3RhdHVzX3dvcmQgPSAwOworCQlpZiAodHhfbGlzdF9oZWFkLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2IodHhfbGlzdF9oZWFkLT5za2IpOworCQkJdHhfbGlzdF9oZWFkLT5za2IgPSBOVUxMOworCQl9CisJCXR4X2xpc3RfaGVhZCA9IHR4X2xpc3RfaGVhZC0+bmV4dDsKKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChscC0+bmRldikpCisJCW5ldGlmX3dha2VfcXVldWUobHAtPm5kZXYpOwogCiAJYmZpbl9tYWNfZW5hYmxlKCk7CiAKQEAgLTE0MzAsNiArMTQ2Miw3IEBACiAJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CiAJbHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlscC0+bmRldiA9IG5kZXY7CiAKIAkvKiBHcmFiIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgTUFDICovCiAJKihfX2xlMzIgKikgKCYobmRldi0+ZGV2X2FkZHJbMF0pKSA9IGNwdV90b19sZTMyKGJmaW5fcmVhZF9FTUFDX0FERFJMTygpKTsKQEAgLTE0ODUsNiArMTUxOCwxMCBAQAogCW5kZXYtPm5ldGRldl9vcHMgPSAmYmZpbl9tYWNfbmV0ZGV2X29wczsKIAluZGV2LT5ldGh0b29sX29wcyA9ICZiZmluX21hY19ldGh0b29sX29wczsKIAorCWluaXRfdGltZXIoJmxwLT50eF9yZWNsYWltX3RpbWVyKTsKKwlscC0+dHhfcmVjbGFpbV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbHA7CisJbHAtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24gPSB0eF9yZWNsYWltX3NrYl90aW1lb3V0OworCiAJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKIAogCS8qIG5vdywgZW5hYmxlIGludGVycnVwdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmggYi9kcml2ZXJzL25ldC9iZmluX21hYy5oCmluZGV4IDFhZTdiODIuLjA0ZTQwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuaApAQCAtMTMsOSArMTMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRfdHN0YW1wLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lY29tcGFyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAKICNkZWZpbmUgQkZJTl9NQUNfQ1NVTV9PRkZMT0FECiAKKyNkZWZpbmUgVFhfUkVDTEFJTV9KSUZGSUVTIChIWiAvIDUpCisKIHN0cnVjdCBkbWFfZGVzY3JpcHRvciB7CiAJc3RydWN0IGRtYV9kZXNjcmlwdG9yICpuZXh0X2RtYV9kZXNjOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKQEAgLTY4LDYgKzcxLDggQEAKIAogCWludCB3b2w7CQkvKiBXYWtlIE9uIExhbiAqLwogCWludCBpcnFfd2FrZV9yZXF1ZXN0ZWQ7CisJc3RydWN0IHRpbWVyX2xpc3QgdHhfcmVjbGFpbV90aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCS8qIE1JSSBhbmQgUEhZIHN0dWZmcyAqLwogCWludCBvbGRfbGluazsgICAgICAgICAgLyogdXNlZCBieSBiZjUzN19hZGp1c3RfbGluayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5jIGIvZHJpdmVycy9uZXQvYm54Mi5jCmluZGV4IDExNzQzMjIuLmU2YTgwM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ibngyLmMKQEAgLTU4LDggKzU4LDggQEAKICNpbmNsdWRlICJibngyX2Z3LmgiCiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MiIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIyLjAuMTUiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiTWF5IDQsIDIwMTAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi4wLjE3IgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bHkgMTgsIDIwMTAiCiAjZGVmaW5lIEZXX01JUFNfRklMRV8wNgkJImJueDIvYm54Mi1taXBzLTA2LTUuMC4wLmo2LmZ3IgogI2RlZmluZSBGV19SVjJQX0ZJTEVfMDYJCSJibngyL2JueDItcnYycC0wNi01LjAuMC5qMy5mdyIKICNkZWZpbmUgRldfTUlQU19GSUxFXzA5CQkiYm54Mi9ibngyLW1pcHMtMDktNS4wLjAuajE1LmZ3IgpAQCAtMjUzLDcgKzI1Myw4IEBACiB7CiAJdTMyIGRpZmY7CiAKLQlzbXBfbWIoKTsKKwkvKiBUZWxsIGNvbXBpbGVyIHRvIGZldGNoIHR4X3Byb2QgYW5kIHR4X2NvbnMgZnJvbSBtZW1vcnkuICovCisJYmFycmllcigpOwogCiAJLyogVGhlIHJpbmcgdXNlcyAyNTYgaW5kaWNlcyBmb3IgMjU1IGVudHJpZXMsIG9uZSBvZiB0aGVtCiAJICogbmVlZHMgdG8gYmUgc2tpcHBlZC4KQEAgLTY5Miw5ICs2OTMsOSBAQAogCQlzdHJ1Y3QgYm54Ml90eF9yaW5nX2luZm8gKnR4ciA9ICZibmFwaS0+dHhfcmluZzsKIAogCQlpZiAodHhyLT50eF9kZXNjX3JpbmcpIHsKLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnAtPnBkZXYsIFRYQkRfUklOR19TSVpFLAotCQkJCQkgICAgdHhyLT50eF9kZXNjX3JpbmcsCi0JCQkJCSAgICB0eHItPnR4X2Rlc2NfbWFwcGluZyk7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgVFhCRF9SSU5HX1NJWkUsCisJCQkJCSAgdHhyLT50eF9kZXNjX3JpbmcsCisJCQkJCSAgdHhyLT50eF9kZXNjX21hcHBpbmcpOwogCQkJdHhyLT50eF9kZXNjX3JpbmcgPSBOVUxMOwogCQl9CiAJCWtmcmVlKHR4ci0+dHhfYnVmX3JpbmcpOwpAQCAtNzE0LDkgKzcxNSw5IEBACiAKIAkJZm9yIChqID0gMDsgaiA8IGJwLT5yeF9tYXhfcmluZzsgaisrKSB7CiAJCQlpZiAocnhyLT5yeF9kZXNjX3Jpbmdbal0pCi0JCQkJcGNpX2ZyZWVfY29uc2lzdGVudChicC0+cGRldiwgUlhCRF9SSU5HX1NJWkUsCi0JCQkJCQkgICAgcnhyLT5yeF9kZXNjX3Jpbmdbal0sCi0JCQkJCQkgICAgcnhyLT5yeF9kZXNjX21hcHBpbmdbal0pOworCQkJCWRtYV9mcmVlX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBSWEJEX1JJTkdfU0laRSwKKwkJCQkJCSAgcnhyLT5yeF9kZXNjX3Jpbmdbal0sCisJCQkJCQkgIHJ4ci0+cnhfZGVzY19tYXBwaW5nW2pdKTsKIAkJCXJ4ci0+cnhfZGVzY19yaW5nW2pdID0gTlVMTDsKIAkJfQogCQl2ZnJlZShyeHItPnJ4X2J1Zl9yaW5nKTsKQEAgLTcyNCw5ICs3MjUsOSBAQAogCiAJCWZvciAoaiA9IDA7IGogPCBicC0+cnhfbWF4X3BnX3Jpbmc7IGorKykgewogCQkJaWYgKHJ4ci0+cnhfcGdfZGVzY19yaW5nW2pdKQotCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnAtPnBkZXYsIFJYQkRfUklOR19TSVpFLAotCQkJCQkJICAgIHJ4ci0+cnhfcGdfZGVzY19yaW5nW2pdLAotCQkJCQkJICAgIHJ4ci0+cnhfcGdfZGVzY19tYXBwaW5nW2pdKTsKKwkJCQlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgUlhCRF9SSU5HX1NJWkUsCisJCQkJCQkgIHJ4ci0+cnhfcGdfZGVzY19yaW5nW2pdLAorCQkJCQkJICByeHItPnJ4X3BnX2Rlc2NfbWFwcGluZ1tqXSk7CiAJCQlyeHItPnJ4X3BnX2Rlc2NfcmluZ1tqXSA9IE5VTEw7CiAJCX0KIAkJdmZyZWUocnhyLT5yeF9wZ19yaW5nKTsKQEAgLTc0OCw4ICs3NDksOCBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJdHhyLT50eF9kZXNjX3JpbmcgPQotCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoYnAtPnBkZXYsIFRYQkRfUklOR19TSVpFLAotCQkJCQkgICAgICZ0eHItPnR4X2Rlc2NfbWFwcGluZyk7CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIFRYQkRfUklOR19TSVpFLAorCQkJCQkgICAmdHhyLT50eF9kZXNjX21hcHBpbmcsIEdGUF9LRVJORUwpOwogCQlpZiAodHhyLT50eF9kZXNjX3JpbmcgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTc3Niw4ICs3NzcsMTAgQEAKIAogCQlmb3IgKGogPSAwOyBqIDwgYnAtPnJ4X21heF9yaW5nOyBqKyspIHsKIAkJCXJ4ci0+cnhfZGVzY19yaW5nW2pdID0KLQkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChicC0+cGRldiwgUlhCRF9SSU5HX1NJWkUsCi0JCQkJCQkgICAgICZyeHItPnJ4X2Rlc2NfbWFwcGluZ1tqXSk7CisJCQkJZG1hX2FsbG9jX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LAorCQkJCQkJICAgUlhCRF9SSU5HX1NJWkUsCisJCQkJCQkgICAmcnhyLT5yeF9kZXNjX21hcHBpbmdbal0sCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJCWlmIChyeHItPnJ4X2Rlc2NfcmluZ1tqXSA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwogCkBAIC03OTUsOCArNzk4LDEwIEBACiAKIAkJZm9yIChqID0gMDsgaiA8IGJwLT5yeF9tYXhfcGdfcmluZzsgaisrKSB7CiAJCQlyeHItPnJ4X3BnX2Rlc2NfcmluZ1tqXSA9Ci0JCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoYnAtPnBkZXYsIFJYQkRfUklOR19TSVpFLAotCQkJCQkJJnJ4ci0+cnhfcGdfZGVzY19tYXBwaW5nW2pdKTsKKwkJCQlkbWFfYWxsb2NfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsCisJCQkJCQkgICBSWEJEX1JJTkdfU0laRSwKKwkJCQkJCSAgICZyeHItPnJ4X3BnX2Rlc2NfbWFwcGluZ1tqXSwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOwogCQkJaWYgKHJ4ci0+cnhfcGdfZGVzY19yaW5nW2pdID09IE5VTEwpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTgxNiwxNiArODIxLDE2IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgYnAtPmN0eF9wYWdlczsgaSsrKSB7CiAJCWlmIChicC0+Y3R4X2Jsa1tpXSkgewotCQkJcGNpX2ZyZWVfY29uc2lzdGVudChicC0+cGRldiwgQkNNX1BBR0VfU0laRSwKLQkJCQkJICAgIGJwLT5jdHhfYmxrW2ldLAotCQkJCQkgICAgYnAtPmN0eF9ibGtfbWFwcGluZ1tpXSk7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgQkNNX1BBR0VfU0laRSwKKwkJCQkJICBicC0+Y3R4X2Jsa1tpXSwKKwkJCQkJICBicC0+Y3R4X2Jsa19tYXBwaW5nW2ldKTsKIAkJCWJwLT5jdHhfYmxrW2ldID0gTlVMTDsKIAkJfQogCX0KIAlpZiAoYm5hcGktPnN0YXR1c19ibGsubXNpKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnAtPnBkZXYsIGJwLT5zdGF0dXNfc3RhdHNfc2l6ZSwKLQkJCQkgICAgYm5hcGktPnN0YXR1c19ibGsubXNpLAotCQkJCSAgICBicC0+c3RhdHVzX2Jsa19tYXBwaW5nKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIGJwLT5zdGF0dXNfc3RhdHNfc2l6ZSwKKwkJCQkgIGJuYXBpLT5zdGF0dXNfYmxrLm1zaSwKKwkJCQkgIGJwLT5zdGF0dXNfYmxrX21hcHBpbmcpOwogCQlibmFwaS0+c3RhdHVzX2Jsay5tc2kgPSBOVUxMOwogCQlicC0+c3RhdHNfYmxrID0gTlVMTDsKIAl9CkBAIC04NDYsOCArODUxLDggQEAKIAlicC0+c3RhdHVzX3N0YXRzX3NpemUgPSBzdGF0dXNfYmxrX3NpemUgKwogCQkJCXNpemVvZihzdHJ1Y3Qgc3RhdGlzdGljc19ibG9jayk7CiAKLQlzdGF0dXNfYmxrID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYnAtPnBkZXYsIGJwLT5zdGF0dXNfc3RhdHNfc2l6ZSwKLQkJCQkJICAmYnAtPnN0YXR1c19ibGtfbWFwcGluZyk7CisJc3RhdHVzX2JsayA9IGRtYV9hbGxvY19jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgYnAtPnN0YXR1c19zdGF0c19zaXplLAorCQkJCQkmYnAtPnN0YXR1c19ibGtfbWFwcGluZywgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXR1c19ibGsgPT0gTlVMTCkKIAkJZ290byBhbGxvY19tZW1fZXJyOwogCkBAIC04NjAsNyArODY1LDcgQEAKIAlibmFwaS0+aHdfcnhfY29uc19wdHIgPQogCQkmYm5hcGktPnN0YXR1c19ibGsubXNpLT5zdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgwOwogCWlmIChicC0+ZmxhZ3MgJiBCTlgyX0ZMQUdfTVNJWF9DQVApIHsKLQkJZm9yIChpID0gMTsgaSA8IEJOWDJfTUFYX01TSVhfVkVDOyBpKyspIHsKKwkJZm9yIChpID0gMTsgaSA8IGJwLT5pcnFfbnZlY3M7IGkrKykgewogCQkJc3RydWN0IHN0YXR1c19ibG9ja19tc2l4ICpzYmxrOwogCiAJCQlibmFwaSA9ICZicC0+Ym54Ml9uYXBpW2ldOwpAQCAtODg1LDkgKzg5MCwxMCBAQAogCQlpZiAoYnAtPmN0eF9wYWdlcyA9PSAwKQogCQkJYnAtPmN0eF9wYWdlcyA9IDE7CiAJCWZvciAoaSA9IDA7IGkgPCBicC0+Y3R4X3BhZ2VzOyBpKyspIHsKLQkJCWJwLT5jdHhfYmxrW2ldID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYnAtPnBkZXYsCisJCQlicC0+Y3R4X2Jsa1tpXSA9IGRtYV9hbGxvY19jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwKIAkJCQkJCUJDTV9QQUdFX1NJWkUsCi0JCQkJCQkmYnAtPmN0eF9ibGtfbWFwcGluZ1tpXSk7CisJCQkJCQkmYnAtPmN0eF9ibGtfbWFwcGluZ1tpXSwKKwkJCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKGJwLT5jdHhfYmxrW2ldID09IE5VTEwpCiAJCQkJZ290byBhbGxvY19tZW1fZXJyOwogCQl9CkBAIC0xNDQ2LDcgKzE0NTIsOCBAQAogc3RhdGljIHZvaWQKIGJueDJfZW5hYmxlX2ZvcmNlZF8yZzUoc3RydWN0IGJueDIgKmJwKQogewotCXUzMiBibWNyOworCXUzMiB1bmluaXRpYWxpemVkX3ZhcihibWNyKTsKKwlpbnQgZXJyOwogCiAJaWYgKCEoYnAtPnBoeV9mbGFncyAmIEJOWDJfUEhZX0ZMQUdfMl81R19DQVBBQkxFKSkKIAkJcmV0dXJuOwpAQCAtMTQ1NiwyMiArMTQ2MywyOCBAQAogCiAJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk5YMl9CTEtfQUREUiwKIAkJCSAgICAgICBNSUlfQk5YMl9CTEtfQUREUl9TRVJERVNfRElHKTsKLQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JOWDJfU0VSREVTX0RJR19NSVNDMSwgJnZhbCk7Ci0JCXZhbCAmPSB+TUlJX0JOWDJfU0RfTUlTQzFfRk9SQ0VfTVNLOwotCQl2YWwgfD0gTUlJX0JOWDJfU0RfTUlTQzFfRk9SQ0UgfCBNSUlfQk5YMl9TRF9NSVNDMV9GT1JDRV8yXzVHOwotCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JOWDJfU0VSREVTX0RJR19NSVNDMSwgdmFsKTsKKwkJaWYgKCFibngyX3JlYWRfcGh5KGJwLCBNSUlfQk5YMl9TRVJERVNfRElHX01JU0MxLCAmdmFsKSkgeworCQkJdmFsICY9IH5NSUlfQk5YMl9TRF9NSVNDMV9GT1JDRV9NU0s7CisJCQl2YWwgfD0gTUlJX0JOWDJfU0RfTUlTQzFfRk9SQ0UgfAorCQkJCU1JSV9CTlgyX1NEX01JU0MxX0ZPUkNFXzJfNUc7CisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JOWDJfU0VSREVTX0RJR19NSVNDMSwgdmFsKTsKKwkJfQogCiAJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk5YMl9CTEtfQUREUiwKIAkJCSAgICAgICBNSUlfQk5YMl9CTEtfQUREUl9DT01CT19JRUVFQjApOwotCQlibngyX3JlYWRfcGh5KGJwLCBicC0+bWlpX2JtY3IsICZibWNyKTsKKwkJZXJyID0gYm54Ml9yZWFkX3BoeShicCwgYnAtPm1paV9ibWNyLCAmYm1jcik7CiAKIAl9IGVsc2UgaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA4KSB7Ci0JCWJueDJfcmVhZF9waHkoYnAsIGJwLT5taWlfYm1jciwgJmJtY3IpOwotCQlibWNyIHw9IEJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMDsKKwkJZXJyID0gYm54Ml9yZWFkX3BoeShicCwgYnAtPm1paV9ibWNyLCAmYm1jcik7CisJCWlmICghZXJyKQorCQkJYm1jciB8PSBCQ001NzA4U19CTUNSX0ZPUkNFXzI1MDA7CiAJfSBlbHNlIHsKIAkJcmV0dXJuOwogCX0KIAorCWlmIChlcnIpCisJCXJldHVybjsKKwogCWlmIChicC0+YXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpIHsKIAkJYm1jciAmPSB+Qk1DUl9BTkVOQUJMRTsKIAkJaWYgKGJwLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQpAQCAtMTQ4Myw3ICsxNDk2LDggQEAKIHN0YXRpYyB2b2lkCiBibngyX2Rpc2FibGVfZm9yY2VkXzJnNShzdHJ1Y3QgYm54MiAqYnApCiB7Ci0JdTMyIGJtY3I7CisJdTMyIHVuaW5pdGlhbGl6ZWRfdmFyKGJtY3IpOworCWludCBlcnI7CiAKIAlpZiAoIShicC0+cGh5X2ZsYWdzICYgQk5YMl9QSFlfRkxBR18yXzVHX0NBUEFCTEUpKQogCQlyZXR1cm47CkBAIC0xNDkzLDIxICsxNTA3LDI2IEBACiAKIAkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTlgyX0JMS19BRERSLAogCQkJICAgICAgIE1JSV9CTlgyX0JMS19BRERSX1NFUkRFU19ESUcpOwotCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk5YMl9TRVJERVNfRElHX01JU0MxLCAmdmFsKTsKLQkJdmFsICY9IH5NSUlfQk5YMl9TRF9NSVNDMV9GT1JDRTsKLQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTlgyX1NFUkRFU19ESUdfTUlTQzEsIHZhbCk7CisJCWlmICghYm54Ml9yZWFkX3BoeShicCwgTUlJX0JOWDJfU0VSREVTX0RJR19NSVNDMSwgJnZhbCkpIHsKKwkJCXZhbCAmPSB+TUlJX0JOWDJfU0RfTUlTQzFfRk9SQ0U7CisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JOWDJfU0VSREVTX0RJR19NSVNDMSwgdmFsKTsKKwkJfQogCiAJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk5YMl9CTEtfQUREUiwKIAkJCSAgICAgICBNSUlfQk5YMl9CTEtfQUREUl9DT01CT19JRUVFQjApOwotCQlibngyX3JlYWRfcGh5KGJwLCBicC0+bWlpX2JtY3IsICZibWNyKTsKKwkJZXJyID0gYm54Ml9yZWFkX3BoeShicCwgYnAtPm1paV9ibWNyLCAmYm1jcik7CiAKIAl9IGVsc2UgaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA4KSB7Ci0JCWJueDJfcmVhZF9waHkoYnAsIGJwLT5taWlfYm1jciwgJmJtY3IpOwotCQlibWNyICY9IH5CQ001NzA4U19CTUNSX0ZPUkNFXzI1MDA7CisJCWVyciA9IGJueDJfcmVhZF9waHkoYnAsIGJwLT5taWlfYm1jciwgJmJtY3IpOworCQlpZiAoIWVycikKKwkJCWJtY3IgJj0gfkJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMDsKIAl9IGVsc2UgewogCQlyZXR1cm47CiAJfQogCisJaWYgKGVycikKKwkJcmV0dXJuOworCiAJaWYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkKIAkJYm1jciB8PSBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKIAlibngyX3dyaXRlX3BoeShicCwgYnAtPm1paV9ibWNyLCBibWNyKTsKQEAgLTI2NTEsMTkgKzI2NzAsMTkgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWJueDJfYWxsb2NfcnhfcGFnZShzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBibngyX3J4X3JpbmdfaW5mbyAqcnhyLCB1MTYgaW5kZXgpCitibngyX2FsbG9jX3J4X3BhZ2Uoc3RydWN0IGJueDIgKmJwLCBzdHJ1Y3QgYm54Ml9yeF9yaW5nX2luZm8gKnJ4ciwgdTE2IGluZGV4LCBnZnBfdCBnZnApCiB7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCXN0cnVjdCBzd19wZyAqcnhfcGcgPSAmcnhyLT5yeF9wZ19yaW5nW2luZGV4XTsKIAlzdHJ1Y3QgcnhfYmQgKnJ4YmQgPQogCQkmcnhyLT5yeF9wZ19kZXNjX3JpbmdbUlhfUklORyhpbmRleCldW1JYX0lEWChpbmRleCldOwotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwKTsKIAogCWlmICghcGFnZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWFwcGluZyA9IHBjaV9tYXBfcGFnZShicC0+cGRldiwgcGFnZSwgMCwgUEFHRV9TSVpFLAorCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSwKIAkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnBkZXYsIG1hcHBpbmcpKSB7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZicC0+cGRldi0+ZGV2LCBtYXBwaW5nKSkgewogCQlfX2ZyZWVfcGFnZShwYWdlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjY4NCwxNSArMjcwMywxNSBAQAogCWlmICghcGFnZSkKIAkJcmV0dXJuOwogCi0JcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsIGRtYV91bm1hcF9hZGRyKHJ4X3BnLCBtYXBwaW5nKSwgUEFHRV9TSVpFLAotCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlkbWFfdW5tYXBfcGFnZSgmYnAtPnBkZXYtPmRldiwgZG1hX3VubWFwX2FkZHIocnhfcGcsIG1hcHBpbmcpLAorCQkgICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJX19mcmVlX3BhZ2UocGFnZSk7CiAJcnhfcGctPnBhZ2UgPSBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotYm54Ml9hbGxvY19yeF9za2Ioc3RydWN0IGJueDIgKmJwLCBzdHJ1Y3QgYm54Ml9yeF9yaW5nX2luZm8gKnJ4ciwgdTE2IGluZGV4KQorYm54Ml9hbGxvY19yeF9za2Ioc3RydWN0IGJueDIgKmJwLCBzdHJ1Y3QgYm54Ml9yeF9yaW5nX2luZm8gKnJ4ciwgdTE2IGluZGV4LCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgc3dfYmQgKnJ4X2J1ZiA9ICZyeHItPnJ4X2J1Zl9yaW5nW2luZGV4XTsKQEAgLTI3MDAsNyArMjcxOSw3IEBACiAJc3RydWN0IHJ4X2JkICpyeGJkID0gJnJ4ci0+cnhfZGVzY19yaW5nW1JYX1JJTkcoaW5kZXgpXVtSWF9JRFgoaW5kZXgpXTsKIAl1bnNpZ25lZCBsb25nIGFsaWduOwogCi0Jc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBicC0+cnhfYnVmX3NpemUpOworCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBicC0+cnhfYnVmX3NpemUsIGdmcCk7CiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI3MDgsOSArMjcyNyw5IEBACiAJaWYgKHVubGlrZWx5KChhbGlnbiA9ICh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEgJiAoQk5YMl9SWF9BTElHTiAtIDEpKSkpCiAJCXNrYl9yZXNlcnZlKHNrYiwgQk5YMl9SWF9BTElHTiAtIGFsaWduKTsKIAotCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShicC0+cGRldiwgc2tiLT5kYXRhLCBicC0+cnhfYnVmX3VzZV9zaXplLAotCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnBkZXYsIG1hcHBpbmcpKSB7CisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsIGJwLT5yeF9idWZfdXNlX3NpemUsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZicC0+cGRldi0+ZGV2LCBtYXBwaW5nKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI4MTYsNyArMjgzNSw3IEBACiAJCQl9CiAJCX0KIAotCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LCBkbWFfdW5tYXBfYWRkcih0eF9idWYsIG1hcHBpbmcpLAorCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBkbWFfdW5tYXBfYWRkcih0eF9idWYsIG1hcHBpbmcpLAogCQkJc2tiX2hlYWRsZW4oc2tiKSwgUENJX0RNQV9UT0RFVklDRSk7CiAKIAkJdHhfYnVmLT5za2IgPSBOVUxMOwpAQCAtMjgyNSw3ICsyODQ0LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IGxhc3Q7IGkrKykgewogCQkJc3dfY29ucyA9IE5FWFRfVFhfQkQoc3dfY29ucyk7CiAKLQkJCXBjaV91bm1hcF9wYWdlKGJwLT5wZGV2LAorCQkJZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsCiAJCQkJZG1hX3VubWFwX2FkZHIoCiAJCQkJCSZ0eHItPnR4X2J1Zl9yaW5nW1RYX1JJTkdfSURYKHN3X2NvbnMpXSwKIAkJCQkJbWFwcGluZyksCkBAIC0yOTMyLDcgKzI5NTEsNyBAQAogCWNvbnNfcnhfYnVmID0gJnJ4ci0+cnhfYnVmX3JpbmdbY29uc107CiAJcHJvZF9yeF9idWYgPSAmcnhyLT5yeF9idWZfcmluZ1twcm9kXTsKIAotCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShicC0+cGRldiwKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmYnAtPnBkZXYtPmRldiwKIAkJZG1hX3VubWFwX2FkZHIoY29uc19yeF9idWYsIG1hcHBpbmcpLAogCQlCTlgyX1JYX09GRlNFVCArIEJOWDJfUlhfQ09QWV9USFJFU0gsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKQEAgLTI5NjEsNyArMjk4MCw3IEBACiAJaW50IGVycjsKIAl1MTYgcHJvZCA9IHJpbmdfaWR4ICYgMHhmZmZmOwogCi0JZXJyID0gYm54Ml9hbGxvY19yeF9za2IoYnAsIHJ4ciwgcHJvZCk7CisJZXJyID0gYm54Ml9hbGxvY19yeF9za2IoYnAsIHJ4ciwgcHJvZCwgR0ZQX0FUT01JQyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJYm54Ml9yZXVzZV9yeF9za2IoYnAsIHJ4ciwgc2tiLCAodTE2KSAocmluZ19pZHggPj4gMTYpLCBwcm9kKTsKIAkJaWYgKGhkcl9sZW4pIHsKQEAgLTI5NzQsNyArMjk5Myw3IEBACiAJfQogCiAJc2tiX3Jlc2VydmUoc2tiLCBCTlgyX1JYX09GRlNFVCk7Ci0JcGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwgZG1hX2FkZHIsIGJwLT5yeF9idWZfdXNlX3NpemUsCisJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgZG1hX2FkZHIsIGJwLT5yeF9idWZfdXNlX3NpemUsCiAJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWlmIChoZHJfbGVuID09IDApIHsKQEAgLTMwMjYsNyArMzA0NSw4IEBACiAJCQlyeF9wZy0+cGFnZSA9IE5VTEw7CiAKIAkJCWVyciA9IGJueDJfYWxsb2NfcnhfcGFnZShicCwgcnhyLAotCQkJCQkJIFJYX1BHX1JJTkdfSURYKHBnX3Byb2QpKTsKKwkJCQkJCSBSWF9QR19SSU5HX0lEWChwZ19wcm9kKSwKKwkJCQkJCSBHRlBfQVRPTUlDKTsKIAkJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkJcnhyLT5yeF9wZ19jb25zID0gcGdfY29uczsKIAkJCQlyeHItPnJ4X3BnX3Byb2QgPSBwZ19wcm9kOwpAQCAtMzAzNSw3ICszMDU1LDcgQEAKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCi0JCQlwY2lfdW5tYXBfcGFnZShicC0+cGRldiwgbWFwcGluZ19vbGQsCisJCQlkbWFfdW5tYXBfcGFnZSgmYnAtPnBkZXYtPmRldiwgbWFwcGluZ19vbGQsCiAJCQkJICAgICAgIFBBR0VfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQkJZnJhZ19zaXplIC09IGZyYWdfbGVuOwpAQCAtMzEwNiw3ICszMTI2LDcgQEAKIAogCQlkbWFfYWRkciA9IGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyk7CiAKLQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGJwLT5wZGV2LCBkbWFfYWRkciwKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmJwLT5wZGV2LT5kZXYsIGRtYV9hZGRyLAogCQkJQk5YMl9SWF9PRkZTRVQgKyBCTlgyX1JYX0NPUFlfVEhSRVNILAogCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIApAQCAtMzIwNiw2ICszMjI2LDEwIEBACiAJCQkJCSAgICAgIEwyX0ZIRFJfRVJST1JTX1VEUF9YU1VNKSkgPT0gMCkpCiAJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJfQorCQlpZiAoKGJwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpICYmCisJCSAgICAoKHN0YXR1cyAmIEwyX0ZIRFJfU1RBVFVTX1VTRV9SWEhBU0gpID09CisJCSAgICAgTDJfRkhEUl9TVEFUVVNfVVNFX1JYSEFTSCkpCisJCQlza2ItPnJ4aGFzaCA9IHJ4X2hkci0+bDJfZmhkcl9oYXNoOwogCiAJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBibmFwaSAtICZicC0+Ym54Ml9uYXBpWzBdKTsKIApAQCAtNTE2Miw3ICs1MTg2LDcgQEAKIAogCXJpbmdfcHJvZCA9IHByb2QgPSByeHItPnJ4X3BnX3Byb2Q7CiAJZm9yIChpID0gMDsgaSA8IGJwLT5yeF9wZ19yaW5nX3NpemU7IGkrKykgewotCQlpZiAoYm54Ml9hbGxvY19yeF9wYWdlKGJwLCByeHIsIHJpbmdfcHJvZCkgPCAwKSB7CisJCWlmIChibngyX2FsbG9jX3J4X3BhZ2UoYnAsIHJ4ciwgcmluZ19wcm9kLCBHRlBfS0VSTkVMKSA8IDApIHsKIAkJCW5ldGRldl93YXJuKGJwLT5kZXYsICJpbml0J2VkIHJ4IHBhZ2UgcmluZyAlZCB3aXRoICVkLyVkIHBhZ2VzIG9ubHlcbiIsCiAJCQkJICAgIHJpbmdfbnVtLCBpLCBicC0+cnhfcGdfcmluZ19zaXplKTsKIAkJCWJyZWFrOwpAQCAtNTE3NCw3ICs1MTk4LDcgQEAKIAogCXJpbmdfcHJvZCA9IHByb2QgPSByeHItPnJ4X3Byb2Q7CiAJZm9yIChpID0gMDsgaSA8IGJwLT5yeF9yaW5nX3NpemU7IGkrKykgewotCQlpZiAoYm54Ml9hbGxvY19yeF9za2IoYnAsIHJ4ciwgcmluZ19wcm9kKSA8IDApIHsKKwkJaWYgKGJueDJfYWxsb2Nfcnhfc2tiKGJwLCByeHIsIHJpbmdfcHJvZCwgR0ZQX0tFUk5FTCkgPCAwKSB7CiAJCQluZXRkZXZfd2FybihicC0+ZGV2LCAiaW5pdCdlZCByeCByaW5nICVkIHdpdGggJWQvJWQgc2ticyBvbmx5XG4iLAogCQkJCSAgICByaW5nX251bSwgaSwgYnAtPnJ4X3Jpbmdfc2l6ZSk7CiAJCQlicmVhazsKQEAgLTUzMjAsNyArNTM0NCw3IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsCisJCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LAogCQkJCQkgZG1hX3VubWFwX2FkZHIodHhfYnVmLCBtYXBwaW5nKSwKIAkJCQkJIHNrYl9oZWFkbGVuKHNrYiksCiAJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKQEAgLTUzMzEsNyArNTM1NSw3IEBACiAJCQlqKys7CiAJCQlmb3IgKGsgPSAwOyBrIDwgbGFzdDsgaysrLCBqKyspIHsKIAkJCQl0eF9idWYgPSAmdHhyLT50eF9idWZfcmluZ1tUWF9SSU5HX0lEWChqKV07Ci0JCQkJcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsCisJCQkJZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsCiAJCQkJCWRtYV91bm1hcF9hZGRyKHR4X2J1ZiwgbWFwcGluZyksCiAJCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nba10uc2l6ZSwKIAkJCQkJUENJX0RNQV9UT0RFVklDRSk7CkBAIC01MzYxLDcgKzUzODUsNyBAQAogCQkJaWYgKHNrYiA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCi0JCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LAorCQkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKIAkJCQkJIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCiAJCQkJCSBicC0+cnhfYnVmX3VzZV9zaXplLAogCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTU3MTQsOSArNTczOCw5IEBACiAJZm9yIChpID0gMTQ7IGkgPCBwa3Rfc2l6ZTsgaSsrKQogCQlwYWNrZXRbaV0gPSAodW5zaWduZWQgY2hhcikgKGkgJiAweGZmKTsKIAotCW1hcCA9IHBjaV9tYXBfc2luZ2xlKGJwLT5wZGV2LCBza2ItPmRhdGEsIHBrdF9zaXplLAotCQlQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGJwLT5wZGV2LCBtYXApKSB7CisJbWFwID0gZG1hX21hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwgcGt0X3NpemUsCisJCQkgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTU3NTQsNyArNTc3OCw3IEBACiAKIAl1ZGVsYXkoNSk7CiAKLQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LCBtYXAsIHBrdF9zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBtYXAsIHBrdF9zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlpZiAoYm54Ml9nZXRfaHdfdHhfY29ucyh0eF9uYXBpKSAhPSB0eHItPnR4X3Byb2QpCkBAIC01NzcxLDcgKzU3OTUsNyBAQAogCXJ4X2hkciA9IHJ4X2J1Zi0+ZGVzYzsKIAlza2JfcmVzZXJ2ZShyeF9za2IsIEJOWDJfUlhfT0ZGU0VUKTsKIAotCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShicC0+cGRldiwKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgmYnAtPnBkZXYtPmRldiwKIAkJZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKIAkJYnAtPnJ4X2J1Zl9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCkBAIC02MTI5LDcgKzYxNTMsNyBAQAogc3RhdGljIHZvaWQKIGJueDJfZW5hYmxlX21zaXgoc3RydWN0IGJueDIgKmJwLCBpbnQgbXNpeF92ZWNzKQogewotCWludCBpLCByYzsKKwlpbnQgaSwgdG90YWxfdmVjcywgcmM7CiAJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRbQk5YMl9NQVhfTVNJWF9WRUNdOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OwogCWNvbnN0IGludCBsZW4gPSBzaXplb2YoYnAtPmlycV90YmxbMF0ubmFtZSk7CkBAIC02MTQ4LDEzICs2MTcyLDI5IEBACiAJCW1zaXhfZW50W2ldLnZlY3RvciA9IDA7CiAJfQogCi0JcmMgPSBwY2lfZW5hYmxlX21zaXgoYnAtPnBkZXYsIG1zaXhfZW50LCBCTlgyX01BWF9NU0lYX1ZFQyk7CisJdG90YWxfdmVjcyA9IG1zaXhfdmVjczsKKyNpZmRlZiBCQ01fQ05JQworCXRvdGFsX3ZlY3MrKzsKKyNlbmRpZgorCXJjID0gLUVOT1NQQzsKKwl3aGlsZSAodG90YWxfdmVjcyA+PSBCTlgyX01JTl9NU0lYX1ZFQykgeworCQlyYyA9IHBjaV9lbmFibGVfbXNpeChicC0+cGRldiwgbXNpeF9lbnQsIHRvdGFsX3ZlY3MpOworCQlpZiAocmMgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAocmMgPiAwKQorCQkJdG90YWxfdmVjcyA9IHJjOworCX0KKwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm47CiAKKwltc2l4X3ZlY3MgPSB0b3RhbF92ZWNzOworI2lmZGVmIEJDTV9DTklDCisJbXNpeF92ZWNzLS07CisjZW5kaWYKIAlicC0+aXJxX252ZWNzID0gbXNpeF92ZWNzOwogCWJwLT5mbGFncyB8PSBCTlgyX0ZMQUdfVVNJTkdfTVNJWCB8IEJOWDJfRkxBR19PTkVfU0hPVF9NU0k7Ci0JZm9yIChpID0gMDsgaSA8IEJOWDJfTUFYX01TSVhfVkVDOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdG90YWxfdmVjczsgaSsrKSB7CiAJCWJwLT5pcnFfdGJsW2ldLnZlY3RvciA9IG1zaXhfZW50W2ldLnZlY3RvcjsKIAkJc25wcmludGYoYnAtPmlycV90YmxbaV0ubmFtZSwgbGVuLCAiJXMtJWQiLCBkZXYtPm5hbWUsIGkpOwogCQlicC0+aXJxX3RibFtpXS5oYW5kbGVyID0gYm54Ml9tc2lfMXNob3Q7CkBAIC02MTcyLDcgKzYyMTIsNyBAQAogCWJwLT5pcnFfbnZlY3MgPSAxOwogCWJwLT5pcnFfdGJsWzBdLnZlY3RvciA9IGJwLT5wZGV2LT5pcnE7CiAKLQlpZiAoKGJwLT5mbGFncyAmIEJOWDJfRkxBR19NU0lYX0NBUCkgJiYgIWRpc19tc2kgJiYgY3B1cyA+IDEpCisJaWYgKChicC0+ZmxhZ3MgJiBCTlgyX0ZMQUdfTVNJWF9DQVApICYmICFkaXNfbXNpKQogCQlibngyX2VuYWJsZV9tc2l4KGJwLCBtc2l4X3ZlY3MpOwogCiAJaWYgKChicC0+ZmxhZ3MgJiBCTlgyX0ZMQUdfTVNJX0NBUCkgJiYgIWRpc19tc2kgJiYKQEAgLTYyOTYsOSArNjMzNiwxNCBAQAogYm54Ml9kdW1wX3N0YXRlKHN0cnVjdCBibngyICpicCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKLQl1MzIgbWNwX3AwLCBtY3BfcDE7CisJdTMyIG1jcF9wMCwgbWNwX3AxLCB2YWwxLCB2YWwyOwogCi0JbmV0ZGV2X2VycihkZXYsICJERUJVRzogaW50cl9zZW1bJXhdXG4iLCBhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnZhbDEpOworCW5ldGRldl9lcnIoZGV2LCAiREVCVUc6IGludHJfc2VtWyV4XSBQQ0lfQ01EWyUwOHhdXG4iLAorCQkgICBhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSwgdmFsMSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBicC0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZ2YWwxKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnAtPnBkZXYsIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHLCAmdmFsMik7CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogUENJX1BNWyUwOHhdIFBDSV9NSVNDX0NGR1slMDh4XVxuIiwgdmFsMSwgdmFsMik7CiAJbmV0ZGV2X2VycihkZXYsICJERUJVRzogRU1BQ19UWF9TVEFUVVNbJTA4eF0gRU1BQ19SWF9TVEFUVVNbJTA4eF1cbiIsCiAJCSAgIFJFR19SRChicCwgQk5YMl9FTUFDX1RYX1NUQVRVUyksCiAJCSAgIFJFR19SRChicCwgQk5YMl9FTUFDX1JYX1NUQVRVUykpOwpAQCAtNjQzNCw4ICs2NDc5LDggQEAKIAl9IGVsc2UKIAkJbXNzID0gMDsKIAotCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShicC0+cGRldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnBkZXYsIG1hcHBpbmcpKSB7CisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZicC0+cGRldi0+ZGV2LCBtYXBwaW5nKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQpAQCAtNjQ2Myw5ICs2NTA4LDkgQEAKIAkJdHhiZCA9ICZ0eHItPnR4X2Rlc2NfcmluZ1tyaW5nX3Byb2RdOwogCiAJCWxlbiA9IGZyYWctPnNpemU7Ci0JCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoYnAtPnBkZXYsIGZyYWctPnBhZ2UsIGZyYWctPnBhZ2Vfb2Zmc2V0LAotCQkJbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihicC0+cGRldiwgbWFwcGluZykpCisJCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIGZyYWctPnBhZ2UsIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmJwLT5wZGV2LT5kZXYsIG1hcHBpbmcpKQogCQkJZ290byBkbWFfZXJyb3I7CiAJCWRtYV91bm1hcF9hZGRyX3NldCgmdHhyLT50eF9idWZfcmluZ1tyaW5nX3Byb2RdLCBtYXBwaW5nLAogCQkJCSAgIG1hcHBpbmcpOwpAQCAtNjQ5MCw2ICs2NTM1LDEzIEBACiAKIAlpZiAodW5saWtlbHkoYm54Ml90eF9hdmFpbChicCwgdHhyKSA8PSBNQVhfU0tCX0ZSQUdTKSkgewogCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisKKwkJLyogbmV0aWZfdHhfc3RvcF9xdWV1ZSgpIG11c3QgYmUgZG9uZSBiZWZvcmUgY2hlY2tpbmcKKwkJICogdHggaW5kZXggaW4gYm54Ml90eF9hdmFpbCgpIGJlbG93LCBiZWNhdXNlIGluCisJCSAqIGJueDJfdHhfaW50KCksIHdlIHVwZGF0ZSB0eCBpbmRleCBiZWZvcmUgY2hlY2tpbmcgZm9yCisJCSAqIG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoKS4KKwkJICovCisJCXNtcF9tYigpOwogCQlpZiAoYm54Ml90eF9hdmFpbChicCwgdHhyKSA+IGJwLT50eF93YWtlX3RocmVzaCkKIAkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKIAl9CkBAIC02NTA0LDcgKzY1NTYsNyBAQAogCXJpbmdfcHJvZCA9IFRYX1JJTkdfSURYKHByb2QpOwogCXR4X2J1ZiA9ICZ0eHItPnR4X2J1Zl9yaW5nW3JpbmdfcHJvZF07CiAJdHhfYnVmLT5za2IgPSBOVUxMOwotCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIGRtYV91bm1hcF9hZGRyKHR4X2J1ZiwgbWFwcGluZyksCisJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgZG1hX3VubWFwX2FkZHIodHhfYnVmLCBtYXBwaW5nKSwKIAkJCSBza2JfaGVhZGxlbihza2IpLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCS8qIHVubWFwIHJlbWFpbmluZyBtYXBwZWQgcGFnZXMgKi8KQEAgLTY1MTIsNyArNjU2NCw3IEBACiAJCXByb2QgPSBORVhUX1RYX0JEKHByb2QpOwogCQlyaW5nX3Byb2QgPSBUWF9SSU5HX0lEWChwcm9kKTsKIAkJdHhfYnVmID0gJnR4ci0+dHhfYnVmX3JpbmdbcmluZ19wcm9kXTsKLQkJcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsIGRtYV91bm1hcF9hZGRyKHR4X2J1ZiwgbWFwcGluZyksCisJCWRtYV91bm1hcF9wYWdlKCZicC0+cGRldi0+ZGV2LCBkbWFfdW5tYXBfYWRkcih0eF9idWYsIG1hcHBpbmcpLAogCQkJICAgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSwKIAkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAl9CkBAIC02NTY3LDM2ICs2NjE5LDI1IEBACiAJCXRlbXBfc3RhdHNbaV0gKz0gaHdfc3RhdHNbaV07CiB9CiAKLSNkZWZpbmUgR0VUXzY0QklUX05FVF9TVEFUUzY0KGN0cikJCQkJXAotCSh1bnNpZ25lZCBsb25nKSAoKHVuc2lnbmVkIGxvbmcpIChjdHIjI19oaSkgPDwgMzIpICsJXAotCSh1bnNpZ25lZCBsb25nKSAoY3RyIyNfbG8pCisjZGVmaW5lIEdFVF82NEJJVF9ORVRfU1RBVFM2NChjdHIpCQlcCisJKCgodTY0KSAoY3RyIyNfaGkpIDw8IDMyKSArICh1NjQpIChjdHIjI19sbykpCiAKLSNkZWZpbmUgR0VUXzY0QklUX05FVF9TVEFUUzMyKGN0cikJCQkJXAotCShjdHIjI19sbykKLQotI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQogI2RlZmluZSBHRVRfNjRCSVRfTkVUX1NUQVRTKGN0cikJCQkJXAogCUdFVF82NEJJVF9ORVRfU1RBVFM2NChicC0+c3RhdHNfYmxrLT5jdHIpICsJCVwKIAlHRVRfNjRCSVRfTkVUX1NUQVRTNjQoYnAtPnRlbXBfc3RhdHNfYmxrLT5jdHIpCi0jZWxzZQotI2RlZmluZSBHRVRfNjRCSVRfTkVUX1NUQVRTKGN0cikJCQkJXAotCUdFVF82NEJJVF9ORVRfU1RBVFMzMihicC0+c3RhdHNfYmxrLT5jdHIpICsJCVwKLQlHRVRfNjRCSVRfTkVUX1NUQVRTMzIoYnAtPnRlbXBfc3RhdHNfYmxrLT5jdHIpCi0jZW5kaWYKIAogI2RlZmluZSBHRVRfMzJCSVRfTkVUX1NUQVRTKGN0cikJCQkJXAogCSh1bnNpZ25lZCBsb25nKSAoYnAtPnN0YXRzX2Jsay0+Y3RyICsJCQlcCiAJCQkgYnAtPnRlbXBfc3RhdHNfYmxrLT5jdHIpCiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1ibngyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqCitibngyX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqbmV0X3N0YXRzKQogewogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9zdGF0cyA9ICZkZXYtPnN0YXRzOwogCi0JaWYgKGJwLT5zdGF0c19ibGsgPT0gTlVMTCkgeworCWlmIChicC0+c3RhdHNfYmxrID09IE5VTEwpCiAJCXJldHVybiBuZXRfc3RhdHM7Ci0JfQorCiAJbmV0X3N0YXRzLT5yeF9wYWNrZXRzID0KIAkJR0VUXzY0QklUX05FVF9TVEFUUyhzdGF0X0lmSENJblVjYXN0UGt0cykgKwogCQlHRVRfNjRCSVRfTkVUX1NUQVRTKHN0YXRfSWZIQ0luTXVsdGljYXN0UGt0cykgKwpAQCAtNjYxNCw3ICs2NjU1LDcgQEAKIAkJR0VUXzY0QklUX05FVF9TVEFUUyhzdGF0X0lmSENPdXRPY3RldHMpOwogCiAJbmV0X3N0YXRzLT5tdWx0aWNhc3QgPQotCQlHRVRfNjRCSVRfTkVUX1NUQVRTKHN0YXRfSWZIQ091dE11bHRpY2FzdFBrdHMpOworCQlHRVRfNjRCSVRfTkVUX1NUQVRTKHN0YXRfSWZIQ0luTXVsdGljYXN0UGt0cyk7CiAKIAluZXRfc3RhdHMtPmNvbGxpc2lvbnMgPQogCQlHRVRfMzJCSVRfTkVUX1NUQVRTKHN0YXRfRXRoZXJTdGF0c0NvbGxpc2lvbnMpOwpAQCAtNzU0NSw2ICs3NTg2LDEyIEBACiAJCXJldHVybiAoZXRodG9vbF9vcF9zZXRfdHhfY3N1bShkZXYsIGRhdGEpKTsKIH0KIAorc3RhdGljIGludAorYm54Ml9zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKGRldiwgZGF0YSwgRVRIX0ZMQUdfUlhIQVNIKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBibngyX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gYm54Ml9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSBibngyX3NldF9zZXR0aW5ncywKQEAgLTc1NzQsNiArNzYyMSw4IEBACiAJLnBoeXNfaWQJCT0gYm54Ml9waHlzX2lkLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGJueDJfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9zc2V0X2NvdW50CQk9IGJueDJfZ2V0X3NzZXRfY291bnQsCisJLnNldF9mbGFncwkJPSBibngyX3NldF9mbGFncywKKwkuZ2V0X2ZsYWdzCQk9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzLAogfTsKIAogLyogQ2FsbGVkIHdpdGggcnRubF9sb2NrICovCkBAIC04MjU5LDcgKzgzMDgsNyBAQAogCS5uZG9fb3BlbgkJPSBibngyX29wZW4sCiAJLm5kb19zdGFydF94bWl0CQk9IGJueDJfc3RhcnRfeG1pdCwKIAkubmRvX3N0b3AJCT0gYm54Ml9jbG9zZSwKLQkubmRvX2dldF9zdGF0cwkJPSBibngyX2dldF9zdGF0cywKKwkubmRvX2dldF9zdGF0czY0CT0gYm54Ml9nZXRfc3RhdHM2NCwKIAkubmRvX3NldF9yeF9tb2RlCT0gYm54Ml9zZXRfcnhfbW9kZSwKIAkubmRvX2RvX2lvY3RsCQk9IGJueDJfaW9jdGwsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCkBAIC04MzIwLDcgKzgzNjksOCBAQAogCW1lbWNweShkZXYtPmRldl9hZGRyLCBicC0+bWFjX2FkZHIsIDYpOwogCW1lbWNweShkZXYtPnBlcm1fYWRkciwgYnAtPm1hY19hZGRyLCA2KTsKIAotCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfR1JPOworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfR1JPIHwKKwkJCSBORVRJRl9GX1JYSEFTSDsKIAl2bGFuX2ZlYXR1cmVzX2FkZChkZXYsIE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0cpOwogCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgewogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBWNl9DU1VNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5oIGIvZHJpdmVycy9uZXQvYm54Mi5oCmluZGV4IGRkYWEzZmMuLjIxMDRjMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuaAorKysgYi9kcml2ZXJzL25ldC9ibngyLmgKQEAgLTI5NSw2ICsyOTUsOSBAQAogCQkjZGVmaW5lIEwyX0ZIRFJfRVJST1JTX1RDUF9YU1VNCQkoMTw8MjgpCiAJCSNkZWZpbmUgTDJfRkhEUl9FUlJPUlNfVURQX1hTVU0JCSgxPDwzMSkKIAorCQkjZGVmaW5lIEwyX0ZIRFJfU1RBVFVTX1VTRV9SWEhBU0gJXAorCQkJKEwyX0ZIRFJfU1RBVFVTX1RDUF9TRUdNRU5UIHwgTDJfRkhEUl9TVEFUVVNfUlNTX0hBU0gpCisKIAl1MzIgbDJfZmhkcl9oYXNoOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCXUxNiBsMl9maGRyX3BrdF9sZW47CkBAIC02NjM0LDkgKzY2MzcsMTIgQEAKIAogI2RlZmluZSBCTlgyX01BWF9NU0lYX0hXX1ZFQwk5CiAjZGVmaW5lIEJOWDJfTUFYX01TSVhfVkVDCTkKLSNkZWZpbmUgQk5YMl9CQVNFX1ZFQwkJMAotI2RlZmluZSBCTlgyX1RYX1ZFQwkJMQotI2RlZmluZSBCTlgyX1RYX0lOVF9OVU0JKEJOWDJfVFhfVkVDIDw8IEJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01EX0lOVF9OVU1fU0hJRlQpCisjaWZkZWYgQkNNX0NOSUMKKyNkZWZpbmUgQk5YMl9NSU5fTVNJWF9WRUMJMgorI2Vsc2UKKyNkZWZpbmUgQk5YMl9NSU5fTVNJWF9WRUMJMQorI2VuZGlmCisKIAogc3RydWN0IGJueDJfaXJxIHsKIAlpcnFfaGFuZGxlcl90CWhhbmRsZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC5oIGIvZHJpdmVycy9uZXQvYm54MnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMjM2OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NiArMCwwIEBACi0vKiBibngyeC5oOiBCcm9hZGNvbSBFdmVyZXN0IG5ldHdvcmsgZHJpdmVyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+Ci0gKiBXcml0dGVuIGJ5OiBFbGllemVyIFRhbWlyCi0gKiBCYXNlZCBvbiBjb2RlIGZyb20gTWljaGFlbCBDaGFuJ3MgYm54MiBkcml2ZXIKLSAqLwotCi0jaWZuZGVmIEJOWDJYX0gKLSNkZWZpbmUgQk5YMlhfSAotCi0vKiBjb21waWxhdGlvbiB0aW1lIGZsYWdzICovCi0KLS8qIGRlZmluZSB0aGlzIHRvIG1ha2UgdGhlIGRyaXZlciBmcmVlemUgb24gZXJyb3IgdG8gYWxsb3cgZ2V0dGluZyBkZWJ1ZyBpbmZvCi0gKiAoeW91IHdpbGwgbmVlZCB0byByZWJvb3QgYWZ0ZXJ3YXJkcykgKi8KLS8qICNkZWZpbmUgQk5YMlhfU1RPUF9PTl9FUlJPUiAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCi0jZGVmaW5lIEJDTV9WTEFOCQkJMQotI2VuZGlmCi0KLSNkZWZpbmUgQk5YMlhfTVVMVElfUVVFVUUKLQotI2RlZmluZSBCTlgyWF9ORVdfTkFQSQotCi0KLQotI2lmIGRlZmluZWQoQ09ORklHX0NOSUMpIHx8IGRlZmluZWQoQ09ORklHX0NOSUNfTU9EVUxFKQotI2RlZmluZSBCQ01fQ05JQyAxCi0jaW5jbHVkZSAiY25pY19pZi5oIgotI2VuZGlmCi0KLQotI2lmZGVmIEJDTV9DTklDCi0jZGVmaW5lIEJOWDJYX01JTl9NU0lYX1ZFQ19DTlQgMwotI2RlZmluZSBCTlgyWF9NU0lYX1ZFQ19GUF9TVEFSVCAyCi0jZWxzZQotI2RlZmluZSBCTlgyWF9NSU5fTVNJWF9WRUNfQ05UIDIKLSNkZWZpbmUgQk5YMlhfTVNJWF9WRUNfRlBfU1RBUlQgMQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9tZGlvLmg+Ci0jaW5jbHVkZSAiYm54MnhfcmVnLmgiCi0jaW5jbHVkZSAiYm54MnhfZndfZGVmcy5oIgotI2luY2x1ZGUgImJueDJ4X2hzaS5oIgotI2luY2x1ZGUgImJueDJ4X2xpbmsuaCIKLQotLyogZXJyb3IvZGVidWcgcHJpbnRzICovCi0KLSNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MngiCi0KLS8qIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHkgb2ZmICovCi0jZGVmaW5lIEJOWDJYX01TR19PRkYJCQkwCi0jZGVmaW5lIEJOWDJYX01TR19NQ1AJCQkweDAxMDAwMCAvKiB3YXM6IE5FVElGX01TR19IVyAqLwotI2RlZmluZSBCTlgyWF9NU0dfU1RBVFMJCQkweDAyMDAwMCAvKiB3YXM6IE5FVElGX01TR19USU1FUiAqLwotI2RlZmluZSBCTlgyWF9NU0dfTlZNCQkJMHgwNDAwMDAgLyogd2FzOiBORVRJRl9NU0dfSFcgKi8KLSNkZWZpbmUgQk5YMlhfTVNHX0RNQUUJCQkweDA4MDAwMCAvKiB3YXM6IE5FVElGX01TR19IVyAqLwotI2RlZmluZSBCTlgyWF9NU0dfU1AJCQkweDEwMDAwMCAvKiB3YXM6IE5FVElGX01TR19JTlRSICovCi0jZGVmaW5lIEJOWDJYX01TR19GUAkJCTB4MjAwMDAwIC8qIHdhczogTkVUSUZfTVNHX0lOVFIgKi8KLQotI2RlZmluZSBEUF9MRVZFTAkJCUtFUk5fTk9USUNFCS8qIHdhczogS0VSTl9ERUJVRyAqLwotCi0vKiByZWd1bGFyIGRlYnVnIHByaW50ICovCi0jZGVmaW5lIERQKF9fbWFzaywgX19mbXQsIF9fYXJncy4uLikJCQkJXAotZG8gewkJCQkJCQkJXAotCWlmIChicC0+bXNnX2VuYWJsZSAmIChfX21hc2spKQkJCQlcCi0JCXByaW50ayhEUF9MRVZFTCAiWyVzOiVkKCVzKV0iIF9fZm10LAkJXAotCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLAkJCVwKLQkJICAgICAgIGJwLT5kZXYgPyAoYnAtPmRldi0+bmFtZSkgOiAiPyIsCQlcCi0JCSAgICAgICAjI19fYXJncyk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIGVycm9ycyBkZWJ1ZyBwcmludCAqLwotI2RlZmluZSBCTlgyWF9EQkdfRVJSKF9fZm10LCBfX2FyZ3MuLi4pCQkJCVwKLWRvIHsJCQkJCQkJCVwKLQlpZiAobmV0aWZfbXNnX3Byb2JlKGJwKSkJCQkJXAotCQlwcl9lcnIoIlslczolZCglcyldIiBfX2ZtdCwJCQlcCi0JCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sCQkJXAotCQkgICAgICAgYnAtPmRldiA/IChicC0+ZGV2LT5uYW1lKSA6ICI/IiwJCVwKLQkJICAgICAgICMjX19hcmdzKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotLyogZm9yIGVycm9ycyAobmV2ZXIgbWFza2VkKSAqLwotI2RlZmluZSBCTlgyWF9FUlIoX19mbXQsIF9fYXJncy4uLikJCQkJXAotZG8gewkJCQkJCQkJXAotCXByX2VycigiWyVzOiVkKCVzKV0iIF9fZm10LAkJCQlcCi0JICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywJCQkJXAotCSAgICAgICBicC0+ZGV2ID8gKGJwLT5kZXYtPm5hbWUpIDogIj8iLAkJCVwKLQkgICAgICAgIyNfX2FyZ3MpOwkJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQk5YMlhfRVJST1IoX19mbXQsIF9fYXJncy4uLikgZG8geyBcCi0JcHJfZXJyKCJbJXM6JWRdIiBfX2ZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjI19fYXJncyk7IFwKLQl9IHdoaWxlICgwKQotCi0KLS8qIGJlZm9yZSB3ZSBoYXZlIGEgZGV2LT5uYW1lIHVzZSBkZXZfaW5mbygpICovCi0jZGVmaW5lIEJOWDJYX0RFVl9JTkZPKF9fZm10LCBfX2FyZ3MuLi4pCQkJIFwKLWRvIHsJCQkJCQkJCSBcCi0JaWYgKG5ldGlmX21zZ19wcm9iZShicCkpCQkJCSBcCi0JCWRldl9pbmZvKCZicC0+cGRldi0+ZGV2LCBfX2ZtdCwgIyNfX2FyZ3MpOwkgXAotfSB3aGlsZSAoMCkKLQotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotI2RlZmluZSBibngyeF9wYW5pYygpIGRvIHsgXAotCQlicC0+cGFuaWMgPSAxOyBcCi0JCUJOWDJYX0VSUigiZHJpdmVyIGFzc2VydFxuIik7IFwKLQkJYm54MnhfaW50X2Rpc2FibGUoYnApOyBcCi0JCWJueDJ4X3BhbmljX2R1bXAoYnApOyBcCi0JfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIGJueDJ4X3BhbmljKCkgZG8geyBcCi0JCWJwLT5wYW5pYyA9IDE7IFwKLQkJQk5YMlhfRVJSKCJkcml2ZXIgYXNzZXJ0XG4iKTsgXAotCQlibngyeF9wYW5pY19kdW1wKGJwKTsgXAotCX0gd2hpbGUgKDApCi0jZW5kaWYKLQotCi0jZGVmaW5lIFU2NF9MTyh4KQkJCSh1MzIpKCgodTY0KSh4KSkgJiAweGZmZmZmZmZmKQotI2RlZmluZSBVNjRfSEkoeCkJCQkodTMyKSgoKHU2NCkoeCkpID4+IDMyKQotI2RlZmluZSBISUxPX1U2NChoaSwgbG8pCQkoKCgodTY0KShoaSkpIDw8IDMyKSArIChsbykpCi0KLQotI2RlZmluZSBSRUdfQUREUihicCwgb2Zmc2V0KQkJKGJwLT5yZWd2aWV3ICsgb2Zmc2V0KQotCi0jZGVmaW5lIFJFR19SRChicCwgb2Zmc2V0KQkJcmVhZGwoUkVHX0FERFIoYnAsIG9mZnNldCkpCi0jZGVmaW5lIFJFR19SRDgoYnAsIG9mZnNldCkJCXJlYWRiKFJFR19BRERSKGJwLCBvZmZzZXQpKQotCi0jZGVmaW5lIFJFR19XUihicCwgb2Zmc2V0LCB2YWwpCQl3cml0ZWwoKHUzMil2YWwsIFJFR19BRERSKGJwLCBvZmZzZXQpKQotI2RlZmluZSBSRUdfV1I4KGJwLCBvZmZzZXQsIHZhbCkJd3JpdGViKCh1OCl2YWwsIFJFR19BRERSKGJwLCBvZmZzZXQpKQotI2RlZmluZSBSRUdfV1IxNihicCwgb2Zmc2V0LCB2YWwpCXdyaXRldygodTE2KXZhbCwgUkVHX0FERFIoYnAsIG9mZnNldCkpCi0KLSNkZWZpbmUgUkVHX1JEX0lORChicCwgb2Zmc2V0KQkJYm54MnhfcmVnX3JkX2luZChicCwgb2Zmc2V0KQotI2RlZmluZSBSRUdfV1JfSU5EKGJwLCBvZmZzZXQsIHZhbCkJYm54MnhfcmVnX3dyX2luZChicCwgb2Zmc2V0LCB2YWwpCi0KLSNkZWZpbmUgUkVHX1JEX0RNQUUoYnAsIG9mZnNldCwgdmFscCwgbGVuMzIpIFwKLQlkbyB7IFwKLQkJYm54MnhfcmVhZF9kbWFlKGJwLCBvZmZzZXQsIGxlbjMyKTtcCi0JCW1lbWNweSh2YWxwLCBibngyeF9zcChicCwgd2JfZGF0YVswXSksIChsZW4zMikgKiA0KTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgUkVHX1dSX0RNQUUoYnAsIG9mZnNldCwgdmFscCwgbGVuMzIpIFwKLQlkbyB7IFwKLQkJbWVtY3B5KGJueDJ4X3NwKGJwLCB3Yl9kYXRhWzBdKSwgdmFscCwgKGxlbjMyKSAqIDQpOyBcCi0JCWJueDJ4X3dyaXRlX2RtYWUoYnAsIGJueDJ4X3NwX21hcHBpbmcoYnAsIHdiX2RhdGEpLCBcCi0JCQkJIG9mZnNldCwgbGVuMzIpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBWSVJUX1dSX0RNQUVfTEVOKGJwLCBkYXRhLCBhZGRyLCBsZW4zMiwgbGUzMl9zd2FwKSBcCi0JZG8geyBcCi0JCW1lbWNweShHVU5aSVBfQlVGKGJwKSwgZGF0YSwgKGxlbjMyKSAqIDQpOyBcCi0JCWJueDJ4X3dyaXRlX2JpZ19idWZfd2IoYnAsIGFkZHIsIGxlbjMyKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0hNRU1fQUREUihicCwgZmllbGQpCQkoYnAtPmNvbW1vbi5zaG1lbV9iYXNlICsgXAotCQkJCQkgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZmllbGQpKQotI2RlZmluZSBTSE1FTV9SRChicCwgZmllbGQpCQlSRUdfUkQoYnAsIFNITUVNX0FERFIoYnAsIGZpZWxkKSkKLSNkZWZpbmUgU0hNRU1fV1IoYnAsIGZpZWxkLCB2YWwpCVJFR19XUihicCwgU0hNRU1fQUREUihicCwgZmllbGQpLCB2YWwpCi0KLSNkZWZpbmUgU0hNRU0yX0FERFIoYnAsIGZpZWxkKQkJKGJwLT5jb21tb24uc2htZW0yX2Jhc2UgKyBcCi0JCQkJCSBvZmZzZXRvZihzdHJ1Y3Qgc2htZW0yX3JlZ2lvbiwgZmllbGQpKQotI2RlZmluZSBTSE1FTTJfUkQoYnAsIGZpZWxkKQkJUkVHX1JEKGJwLCBTSE1FTTJfQUREUihicCwgZmllbGQpKQotI2RlZmluZSBTSE1FTTJfV1IoYnAsIGZpZWxkLCB2YWwpCVJFR19XUihicCwgU0hNRU0yX0FERFIoYnAsIGZpZWxkKSwgdmFsKQotCi0jZGVmaW5lIE1GX0NGR19SRChicCwgZmllbGQpCQlTSE1FTV9SRChicCwgbWZfY2ZnLmZpZWxkKQotI2RlZmluZSBNRl9DRkdfV1IoYnAsIGZpZWxkLCB2YWwpCVNITUVNX1dSKGJwLCBtZl9jZmcuZmllbGQsIHZhbCkKLQotI2RlZmluZSBFTUFDX1JEKGJwLCByZWcpCQlSRUdfUkQoYnAsIGVtYWNfYmFzZSArIHJlZykKLSNkZWZpbmUgRU1BQ19XUihicCwgcmVnLCB2YWwpCQlSRUdfV1IoYnAsIGVtYWNfYmFzZSArIHJlZywgdmFsKQotCi0jZGVmaW5lIEFFVV9JTl9BVFROX0JJVFNfUFhQUENJQ0xPQ0tDTElFTlRfUEFSSVRZX0VSUk9SIFwKLQlBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9QQVJJVFlfRVJST1IKLQotCi0vKiBmYXN0IHBhdGggKi8KLQotc3RydWN0IHN3X3J4X2JkIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwotCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsKLX07Ci0KLXN0cnVjdCBzd190eF9iZCB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQl1MTYJCWZpcnN0X2JkOwotCXU4CQlmbGFnczsKLS8qIFNldCBvbiB0aGUgZmlyc3QgQkQgZGVzY3JpcHRvciB3aGVuIHRoZXJlIGlzIGEgc3BsaXQgQkQgKi8KLSNkZWZpbmUgQk5YMlhfVFNPX1NQTElUX0JECQkoMTw8MCkKLX07Ci0KLXN0cnVjdCBzd19yeF9wYWdlIHsKLQlzdHJ1Y3QgcGFnZQkqcGFnZTsKLQlERUZJTkVfRE1BX1VOTUFQX0FERFIobWFwcGluZyk7Ci19OwotCi11bmlvbiBkYl9wcm9kIHsKLQlzdHJ1Y3QgZG9vcmJlbGxfc2V0X3Byb2QgZGF0YTsKLQl1MzIJCXJhdzsKLX07Ci0KLQotLyogTUMgaHNpICovCi0jZGVmaW5lIEJDTV9QQUdFX1NISUZUCQkJMTIKLSNkZWZpbmUgQkNNX1BBR0VfU0laRQkJCSgxIDw8IEJDTV9QQUdFX1NISUZUKQotI2RlZmluZSBCQ01fUEFHRV9NQVNLCQkJKH4oQkNNX1BBR0VfU0laRSAtIDEpKQotI2RlZmluZSBCQ01fUEFHRV9BTElHTihhZGRyKQkoKChhZGRyKSArIEJDTV9QQUdFX1NJWkUgLSAxKSAmIEJDTV9QQUdFX01BU0spCi0KLSNkZWZpbmUgUEFHRVNfUEVSX1NHRV9TSElGVAkJMAotI2RlZmluZSBQQUdFU19QRVJfU0dFCQkJKDEgPDwgUEFHRVNfUEVSX1NHRV9TSElGVCkKLSNkZWZpbmUgU0dFX1BBR0VfU0laRQkJCVBBR0VfU0laRQotI2RlZmluZSBTR0VfUEFHRV9TSElGVAkJCVBBR0VfU0hJRlQKLSNkZWZpbmUgU0dFX1BBR0VfQUxJR04oYWRkcikJCVBBR0VfQUxJR04oKHR5cGVvZihQQUdFX1NJWkUpKShhZGRyKSkKLQotLyogU0dFIHJpbmcgcmVsYXRlZCBtYWNyb3MgKi8KLSNkZWZpbmUgTlVNX1JYX1NHRV9QQUdFUwkJMgotI2RlZmluZSBSWF9TR0VfQ05UCQkoQkNNX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZXRoX3J4X3NnZSkpCi0jZGVmaW5lIE1BWF9SWF9TR0VfQ05UCQkJKFJYX1NHRV9DTlQgLSAyKQotLyogUlhfU0dFX0NOVCBpcyBwcm9taXNlZCB0byBiZSBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgUlhfU0dFX01BU0sJCQkoUlhfU0dFX0NOVCAtIDEpCi0jZGVmaW5lIE5VTV9SWF9TR0UJCQkoUlhfU0dFX0NOVCAqIE5VTV9SWF9TR0VfUEFHRVMpCi0jZGVmaW5lIE1BWF9SWF9TR0UJCQkoTlVNX1JYX1NHRSAtIDEpCi0jZGVmaW5lIE5FWFRfU0dFX0lEWCh4KQkJKCgoKHgpICYgUlhfU0dFX01BU0spID09IFwKLQkJCQkgIChNQVhfUlhfU0dFX0NOVCAtIDEpKSA/ICh4KSArIDMgOiAoeCkgKyAxKQotI2RlZmluZSBSWF9TR0UoeCkJCQkoKHgpICYgTUFYX1JYX1NHRSkKLQotLyogU0dFIHByb2R1Y2VyIG1hc2sgcmVsYXRlZCBtYWNyb3MgKi8KLS8qIE51bWJlciBvZiBiaXRzIGluIG9uZSBzZ2VfbWFzayBhcnJheSBlbGVtZW50ICovCi0jZGVmaW5lIFJYX1NHRV9NQVNLX0VMRU1fU1oJCTY0Ci0jZGVmaW5lIFJYX1NHRV9NQVNLX0VMRU1fU0hJRlQJCTYKLSNkZWZpbmUgUlhfU0dFX01BU0tfRUxFTV9NQVNLCQkoKHU2NClSWF9TR0VfTUFTS19FTEVNX1NaIC0gMSkKLQotLyogQ3JlYXRlcyBhIGJpdG1hc2sgb2YgYWxsIG9uZXMgaW4gbGVzcyBzaWduaWZpY2FudCBiaXRzLgotICAgaWR4IC0gaW5kZXggb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSBjcmVhdGVkIG1hc2sgKi8KLSNkZWZpbmUgUlhfU0dFX09ORVNfTUFTSyhpZHgpIFwKLQkJKCgodTY0KTB4MSA8PCAoKChpZHgpICYgUlhfU0dFX01BU0tfRUxFTV9NQVNLKSArIDEpKSAtIDEpCi0jZGVmaW5lIFJYX1NHRV9NQVNLX0VMRU1fT05FX01BU0sJKCh1NjQpKH4wKSkKLQotLyogTnVtYmVyIG9mIHU2NCBlbGVtZW50cyBpbiBTR0UgbWFzayBhcnJheSAqLwotI2RlZmluZSBSWF9TR0VfTUFTS19MRU4JCQkoKE5VTV9SWF9TR0VfUEFHRVMgKiBSWF9TR0VfQ05UKSAvIFwKLQkJCQkJIFJYX1NHRV9NQVNLX0VMRU1fU1opCi0jZGVmaW5lIFJYX1NHRV9NQVNLX0xFTl9NQVNLCQkoUlhfU0dFX01BU0tfTEVOIC0gMSkKLSNkZWZpbmUgTkVYVF9TR0VfTUFTS19FTEVNKGVsKQkJKCgoZWwpICsgMSkgJiBSWF9TR0VfTUFTS19MRU5fTUFTSykKLQotCi1zdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMgewotCXUzMiB0b3RhbF9ieXRlc19yZWNlaXZlZF9oaTsKLQl1MzIgdG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG87Ci0JdTMyIHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpOwotCXUzMiB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbzsKLQl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOwotCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87Ci0JdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOwotCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKLQl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7Ci0JdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOwotCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7Ci0JdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKLQl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7Ci0JdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOwotCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKLQl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87Ci0JdTMyIHZhbGlkX2J5dGVzX3JlY2VpdmVkX2hpOwotCXUzMiB2YWxpZF9ieXRlc19yZWNlaXZlZF9sbzsKLQotCXUzMiBlcnJvcl9ieXRlc19yZWNlaXZlZF9oaTsKLQl1MzIgZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG87Ci0JdTMyIGV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpOwotCXUzMiBldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19sbzsKLQl1MzIgbm9fYnVmZl9kaXNjYXJkX2hpOwotCXUzMiBub19idWZmX2Rpc2NhcmRfbG87Ci0KLQl1MzIgZHJpdmVyX3hvZmY7Ci0JdTMyIHJ4X2Vycl9kaXNjYXJkX3BrdDsKLQl1MzIgcnhfc2tiX2FsbG9jX2ZhaWxlZDsKLQl1MzIgaHdfY3N1bV9lcnI7Ci19OwotCi0jZGVmaW5lIEJOWDJYX05VTV9RX1NUQVRTCQkxMwotI2RlZmluZSBRX1NUQVRTX09GRlNFVDMyKHN0YXRfbmFtZSkgXAotCQkJKG9mZnNldG9mKHN0cnVjdCBibngyeF9ldGhfcV9zdGF0cywgc3RhdF9uYW1lKSAvIDQpCi0KLXN0cnVjdCBibngyeF9mYXN0cGF0aCB7Ci0KLQlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKLQlzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2sgKnN0YXR1c19ibGs7Ci0JZG1hX2FkZHJfdAkJc3RhdHVzX2Jsa19tYXBwaW5nOwotCi0Jc3RydWN0IHN3X3R4X2JkCQkqdHhfYnVmX3Jpbmc7Ci0KLQl1bmlvbiBldGhfdHhfYmRfdHlwZXMJKnR4X2Rlc2NfcmluZzsKLQlkbWFfYWRkcl90CQl0eF9kZXNjX21hcHBpbmc7Ci0KLQlzdHJ1Y3Qgc3dfcnhfYmQJCSpyeF9idWZfcmluZzsJLyogQkRzIG1hcHBpbmdzIHJpbmcgKi8KLQlzdHJ1Y3Qgc3dfcnhfcGFnZQkqcnhfcGFnZV9yaW5nOwkvKiBTR0UgcGFnZXMgbWFwcGluZ3MgcmluZyAqLwotCi0Jc3RydWN0IGV0aF9yeF9iZAkqcnhfZGVzY19yaW5nOwotCWRtYV9hZGRyX3QJCXJ4X2Rlc2NfbWFwcGluZzsKLQotCXVuaW9uIGV0aF9yeF9jcWUJKnJ4X2NvbXBfcmluZzsKLQlkbWFfYWRkcl90CQlyeF9jb21wX21hcHBpbmc7Ci0KLQkvKiBTR0UgcmluZyAqLwotCXN0cnVjdCBldGhfcnhfc2dlCSpyeF9zZ2VfcmluZzsKLQlkbWFfYWRkcl90CQlyeF9zZ2VfbWFwcGluZzsKLQotCXU2NAkJCXNnZV9tYXNrW1JYX1NHRV9NQVNLX0xFTl07Ci0KLQlpbnQJCQlzdGF0ZTsKLSNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfQ0xPU0VECQkwCi0jZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX0lSUQkJMHg4MDAwMAotI2RlZmluZSBCTlgyWF9GUF9TVEFURV9PUEVOSU5HCQkweDkwMDAwCi0jZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX09QRU4JCTB4YTAwMDAKLSNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfSEFMVElORwkJMHhiMDAwMAotI2RlZmluZSBCTlgyWF9GUF9TVEFURV9IQUxURUQJCTB4YzAwMDAKLQotCXU4CQkJaW5kZXg7CS8qIG51bWJlciBpbiBmcCBhcnJheSAqLwotCXU4CQkJY2xfaWQ7CS8qIGV0aCBjbGllbnQgaWQgKi8KLQl1OAkJCXNiX2lkOwkvKiBzdGF0dXMgYmxvY2sgbnVtYmVyIGluIEhXICovCi0KLQl1bmlvbiBkYl9wcm9kCQl0eF9kYjsKLQotCXUxNgkJCXR4X3BrdF9wcm9kOwotCXUxNgkJCXR4X3BrdF9jb25zOwotCXUxNgkJCXR4X2JkX3Byb2Q7Ci0JdTE2CQkJdHhfYmRfY29uczsKLQlfX2xlMTYJCQkqdHhfY29uc19zYjsKLQotCV9fbGUxNgkJCWZwX2NfaWR4OwotCV9fbGUxNgkJCWZwX3VfaWR4OwotCi0JdTE2CQkJcnhfYmRfcHJvZDsKLQl1MTYJCQlyeF9iZF9jb25zOwotCXUxNgkJCXJ4X2NvbXBfcHJvZDsKLQl1MTYJCQlyeF9jb21wX2NvbnM7Ci0JdTE2CQkJcnhfc2dlX3Byb2Q7Ci0JLyogVGhlIGxhc3QgbWF4aW1hbCBjb21wbGV0ZWQgU0dFICovCi0JdTE2CQkJbGFzdF9tYXhfc2dlOwotCV9fbGUxNgkJCSpyeF9jb25zX3NiOwotCV9fbGUxNgkJCSpyeF9iZF9jb25zX3NiOwotCi0KLQl1bnNpZ25lZCBsb25nCQl0eF9wa3QsCi0JCQkJcnhfcGt0LAotCQkJCXJ4X2NhbGxzOwotCi0JLyogVFBBIHJlbGF0ZWQgKi8KLQlzdHJ1Y3Qgc3dfcnhfYmQJCXRwYV9wb29sW0VUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxSF07Ci0JdTgJCQl0cGFfc3RhdGVbRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIXTsKLSNkZWZpbmUgQk5YMlhfVFBBX1NUQVJUCQkJMQotI2RlZmluZSBCTlgyWF9UUEFfU1RPUAkJCTIKLQl1OAkJCWRpc2FibGVfdHBhOwotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQl1NjQJCQl0cGFfcXVldWVfdXNlZDsKLSNlbmRpZgotCi0Jc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzIG9sZF90Y2xpZW50OwotCXN0cnVjdCB1c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyBvbGRfdWNsaWVudDsKLQlzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgb2xkX3hjbGllbnQ7Ci0Jc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzIGV0aF9xX3N0YXRzOwotCi0JLyogVGhlIHNpemUgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nOgotCSAgICAgc2l6ZW9mIG5hbWUgZmllbGQgZnJvbSBuZXRkZXYgc3RydWN0dXJlICsKLQkgICAgIDQgKCctWHgtJyBzdHJpbmcpICsKLQkgICAgIDQgKGZvciB0aGUgZGlnaXRzIGFuZCB0byBtYWtlIGl0IERXT1JEIGFsaWduZWQpICovCi0jZGVmaW5lIEZQX05BTUVfU0laRQkJKHNpemVvZigoKHN0cnVjdCBuZXRfZGV2aWNlICopMCktPm5hbWUpICsgOCkKLQljaGFyCQkJbmFtZVtGUF9OQU1FX1NJWkVdOwotCXN0cnVjdCBibngyeAkJKmJwOyAvKiBwYXJlbnQgKi8KLX07Ci0KLSNkZWZpbmUgYm54MnhfZnAoYnAsIG5yLCB2YXIpCQkoYnAtPmZwW25yXS52YXIpCi0KLQotLyogTUMgaHNpICovCi0jZGVmaW5lIE1BWF9GRVRDSF9CRAkJCTEzCS8qIEhXIG1heCBCRHMgcGVyIHBhY2tldCAqLwotI2RlZmluZSBSWF9DT1BZX1RIUkVTSAkJCTkyCi0KLSNkZWZpbmUgTlVNX1RYX1JJTkdTCQkJMTYKLSNkZWZpbmUgVFhfREVTQ19DTlQJCShCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHVuaW9uIGV0aF90eF9iZF90eXBlcykpCi0jZGVmaW5lIE1BWF9UWF9ERVNDX0NOVAkJCShUWF9ERVNDX0NOVCAtIDEpCi0jZGVmaW5lIE5VTV9UWF9CRAkJCShUWF9ERVNDX0NOVCAqIE5VTV9UWF9SSU5HUykKLSNkZWZpbmUgTUFYX1RYX0JECQkJKE5VTV9UWF9CRCAtIDEpCi0jZGVmaW5lIE1BWF9UWF9BVkFJTAkJCShNQVhfVFhfREVTQ19DTlQgKiBOVU1fVFhfUklOR1MgLSAyKQotI2RlZmluZSBORVhUX1RYX0lEWCh4KQkJKCgoKHgpICYgTUFYX1RYX0RFU0NfQ05UKSA9PSBcCi0JCQkJICAoTUFYX1RYX0RFU0NfQ05UIC0gMSkpID8gKHgpICsgMiA6ICh4KSArIDEpCi0jZGVmaW5lIFRYX0JEKHgpCQkJKCh4KSAmIE1BWF9UWF9CRCkKLSNkZWZpbmUgVFhfQkRfUE9GRih4KQkJCSgoeCkgJiBNQVhfVFhfREVTQ19DTlQpCi0KLS8qIFRoZSBSWCBCRCByaW5nIGlzIHNwZWNpYWwsIGVhY2ggYmQgaXMgOCBieXRlcyBidXQgdGhlIGxhc3Qgb25lIGlzIDE2ICovCi0jZGVmaW5lIE5VTV9SWF9SSU5HUwkJCTgKLSNkZWZpbmUgUlhfREVTQ19DTlQJCShCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBldGhfcnhfYmQpKQotI2RlZmluZSBNQVhfUlhfREVTQ19DTlQJCQkoUlhfREVTQ19DTlQgLSAyKQotI2RlZmluZSBSWF9ERVNDX01BU0sJCQkoUlhfREVTQ19DTlQgLSAxKQotI2RlZmluZSBOVU1fUlhfQkQJCQkoUlhfREVTQ19DTlQgKiBOVU1fUlhfUklOR1MpCi0jZGVmaW5lIE1BWF9SWF9CRAkJCShOVU1fUlhfQkQgLSAxKQotI2RlZmluZSBNQVhfUlhfQVZBSUwJCQkoTUFYX1JYX0RFU0NfQ05UICogTlVNX1JYX1JJTkdTIC0gMikKLSNkZWZpbmUgTkVYVF9SWF9JRFgoeCkJCSgoKCh4KSAmIFJYX0RFU0NfTUFTSykgPT0gXAotCQkJCSAgKE1BWF9SWF9ERVNDX0NOVCAtIDEpKSA/ICh4KSArIDMgOiAoeCkgKyAxKQotI2RlZmluZSBSWF9CRCh4KQkJCSgoeCkgJiBNQVhfUlhfQkQpCi0KLS8qIEFzIGxvbmcgYXMgQ1FFIGlzIDQgdGltZXMgYmlnZ2VyIHRoYW4gQkQgZW50cnkgd2UgaGF2ZSB0byBhbGxvY2F0ZQotICAgNCB0aW1lcyBtb3JlIHBhZ2VzIGZvciBDUSByaW5nIGluIG9yZGVyIHRvIGtlZXAgaXQgYmFsYW5jZWQgd2l0aAotICAgQkQgcmluZyAqLwotI2RlZmluZSBOVU1fUkNRX1JJTkdTCQkJKE5VTV9SWF9SSU5HUyAqIDQpCi0jZGVmaW5lIFJDUV9ERVNDX0NOVAkJKEJDTV9QQUdFX1NJWkUgLyBzaXplb2YodW5pb24gZXRoX3J4X2NxZSkpCi0jZGVmaW5lIE1BWF9SQ1FfREVTQ19DTlQJCShSQ1FfREVTQ19DTlQgLSAxKQotI2RlZmluZSBOVU1fUkNRX0JECQkJKFJDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MpCi0jZGVmaW5lIE1BWF9SQ1FfQkQJCQkoTlVNX1JDUV9CRCAtIDEpCi0jZGVmaW5lIE1BWF9SQ1FfQVZBSUwJCQkoTUFYX1JDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MgLSAyKQotI2RlZmluZSBORVhUX1JDUV9JRFgoeCkJCSgoKCh4KSAmIE1BWF9SQ1FfREVTQ19DTlQpID09IFwKLQkJCQkgIChNQVhfUkNRX0RFU0NfQ05UIC0gMSkpID8gKHgpICsgMiA6ICh4KSArIDEpCi0jZGVmaW5lIFJDUV9CRCh4KQkJCSgoeCkgJiBNQVhfUkNRX0JEKQotCi0KLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBkZXRlcm1pbmluZyBvZiBsYXN0X21heCAqLwotI2RlZmluZSBTVUJfUzE2KGEsIGIpCQkJKHMxNikoKHMxNikoYSkgLSAoczE2KShiKSkKLQotI2RlZmluZSBfX1NHRV9NQVNLX1NFVF9CSVQoZWwsIGJpdCkgXAotCWRvIHsgXAotCQllbCA9ICgoZWwpIHwgKCh1NjQpMHgxIDw8IChiaXQpKSk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fU0dFX01BU0tfQ0xFQVJfQklUKGVsLCBiaXQpIFwKLQlkbyB7IFwKLQkJZWwgPSAoKGVsKSAmICh+KCh1NjQpMHgxIDw8IChiaXQpKSkpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTR0VfTUFTS19TRVRfQklUKGZwLCBpZHgpIFwKLQlfX1NHRV9NQVNLX1NFVF9CSVQoZnAtPnNnZV9tYXNrWyhpZHgpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlRdLCBcCi0JCQkgICAoKGlkeCkgJiBSWF9TR0VfTUFTS19FTEVNX01BU0spKQotCi0jZGVmaW5lIFNHRV9NQVNLX0NMRUFSX0JJVChmcCwgaWR4KSBcCi0JX19TR0VfTUFTS19DTEVBUl9CSVQoZnAtPnNnZV9tYXNrWyhpZHgpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlRdLCBcCi0JCQkgICAgICgoaWR4KSAmIFJYX1NHRV9NQVNLX0VMRU1fTUFTSykpCi0KLQotLyogdXNlZCBvbiBhIENJRCByZWNlaXZlZCBmcm9tIHRoZSBIVyAqLwotI2RlZmluZSBTV19DSUQoeCkJCQkobGUzMl90b19jcHUoeCkgJiBcCi0JCQkJCSAoQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX0NJRCA+PiA3KSkKLSNkZWZpbmUgQ1FFX0NNRCh4KQkJCShsZTMyX3RvX2NwdSh4KSA+PiBcCi0JCQkJCUNPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9DTURfSURfU0hJRlQpCi0KLSNkZWZpbmUgQkRfVU5NQVBfQUREUihiZCkJCUhJTE9fVTY0KGxlMzJfdG9fY3B1KChiZCktPmFkZHJfaGkpLCBcCi0JCQkJCQkgbGUzMl90b19jcHUoKGJkKS0+YWRkcl9sbykpCi0jZGVmaW5lIEJEX1VOTUFQX0xFTihiZCkJCShsZTE2X3RvX2NwdSgoYmQpLT5uYnl0ZXMpKQotCi0KLSNkZWZpbmUgRFBNX1RSSUdFUl9UWVBFCQkJMHg0MAotI2RlZmluZSBET09SQkVMTChicCwgY2lkLCB2YWwpIFwKLQlkbyB7IFwKLQkJd3JpdGVsKCh1MzIpKHZhbCksIGJwLT5kb29yYmVsbHMgKyAoQkNNX1BBR0VfU0laRSAqIChjaWQpKSArIFwKLQkJICAgICAgIERQTV9UUklHRVJfVFlQRSk7IFwKLQl9IHdoaWxlICgwKQotCi0KLS8qIFRYIENTVU0gaGVscGVycyAqLwotI2RlZmluZSBTS0JfQ1NfT0ZGKHNrYikJCShvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjaykgLSBcCi0JCQkJIHNrYi0+Y3N1bV9vZmZzZXQpCi0jZGVmaW5lIFNLQl9DUyhza2IpCQkoKih1MTYgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIFwKLQkJCQkJICBza2ItPmNzdW1fb2Zmc2V0KSkKLQotI2RlZmluZSBwYmRfdGNwX2ZsYWdzKHNrYikJKG50b2hsKHRjcF9mbGFnX3dvcmQodGNwX2hkcihza2IpKSk+PjE2ICYgMHhmZikKLQotI2RlZmluZSBYTUlUX1BMQUlOCQkJMAotI2RlZmluZSBYTUlUX0NTVU1fVjQJCQkweDEKLSNkZWZpbmUgWE1JVF9DU1VNX1Y2CQkJMHgyCi0jZGVmaW5lIFhNSVRfQ1NVTV9UQ1AJCQkweDQKLSNkZWZpbmUgWE1JVF9HU09fVjQJCQkweDgKLSNkZWZpbmUgWE1JVF9HU09fVjYJCQkweDEwCi0KLSNkZWZpbmUgWE1JVF9DU1VNCQkJKFhNSVRfQ1NVTV9WNCB8IFhNSVRfQ1NVTV9WNikKLSNkZWZpbmUgWE1JVF9HU08JCQkoWE1JVF9HU09fVjQgfCBYTUlUX0dTT19WNikKLQotCi0vKiBzdHVmZiBhZGRlZCB0byBtYWtlIHRoZSBjb2RlIGZpdCA4MENvbCAqLwotCi0jZGVmaW5lIENRRV9UWVBFKGNxZV9mcF9mbGFncykJKChjcWVfZnBfZmxhZ3MpICYgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfVFlQRSkKLQotI2RlZmluZSBUUEFfVFlQRV9TVEFSVAkJCUVUSF9GQVNUX1BBVEhfUlhfQ1FFX1NUQVJUX0ZMRwotI2RlZmluZSBUUEFfVFlQRV9FTkQJCQlFVEhfRkFTVF9QQVRIX1JYX0NRRV9FTkRfRkxHCi0jZGVmaW5lIFRQQV9UWVBFKGNxZV9mcF9mbGFncykJCSgoY3FlX2ZwX2ZsYWdzKSAmIFwKLQkJCQkJIChUUEFfVFlQRV9TVEFSVCB8IFRQQV9UWVBFX0VORCkpCi0KLSNkZWZpbmUgRVRIX1JYX0VSUk9SX0ZBTEdTCQlFVEhfRkFTVF9QQVRIX1JYX0NRRV9QSFlfREVDT0RFX0VSUl9GTEcKLQotI2RlZmluZSBCTlgyWF9JUF9DU1VNX0VSUihjcWUpIFwKLQkJCSghKChjcWUpLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncyAmIFwKLQkJCSAgIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0lQX1hTVU1fTk9fVkFMSURBVElPTl9GTEcpICYmIFwKLQkJCSAoKGNxZSktPmZhc3RfcGF0aF9jcWUudHlwZV9lcnJvcl9mbGFncyAmIFwKLQkJCSAgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfSVBfQkFEX1hTVU1fRkxHKSkKLQotI2RlZmluZSBCTlgyWF9MNF9DU1VNX0VSUihjcWUpIFwKLQkJCSghKChjcWUpLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncyAmIFwKLQkJCSAgIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0w0X1hTVU1fTk9fVkFMSURBVElPTl9GTEcpICYmIFwKLQkJCSAoKGNxZSktPmZhc3RfcGF0aF9jcWUudHlwZV9lcnJvcl9mbGFncyAmIFwKLQkJCSAgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfTDRfQkFEX1hTVU1fRkxHKSkKLQotI2RlZmluZSBCTlgyWF9SWF9DU1VNX09LKGNxZSkgXAotCQkJKCEoQk5YMlhfTDRfQ1NVTV9FUlIoY3FlKSB8fCBCTlgyWF9JUF9DU1VNX0VSUihjcWUpKSkKLQotI2RlZmluZSBCTlgyWF9QUlNfRkxBR19PVkVSRVRIX0lQVjQoZmxhZ3MpIFwKLQkJCQkoKChsZTE2X3RvX2NwdShmbGFncykgJiBcCi0JCQkJICAgUEFSU0lOR19GTEFHU19PVkVSX0VUSEVSTkVUX1BST1RPQ09MKSA+PiBcCi0JCQkJICBQQVJTSU5HX0ZMQUdTX09WRVJfRVRIRVJORVRfUFJPVE9DT0xfU0hJRlQpIFwKLQkJCQkgPT0gUFJTX0ZMQUdfT1ZFUkVUSF9JUFY0KQotI2RlZmluZSBCTlgyWF9SWF9TVU1fRklYKGNxZSkgXAotCUJOWDJYX1BSU19GTEFHX09WRVJFVEhfSVBWNChjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykKLQotCi0jZGVmaW5lIEZQX1VTQl9GVU5DX09GRgkJCSgyICsgMipIQ19VU1RPUk1fU0JfTlVNX0lORElDRVMpCi0jZGVmaW5lIEZQX0NTQl9GVU5DX09GRgkJCSgyICsgMipIQ19DU1RPUk1fU0JfTlVNX0lORElDRVMpCi0KLSNkZWZpbmUgVV9TQl9FVEhfUlhfQ1FfSU5ERVgJCUhDX0lOREVYX1VfRVRIX1JYX0NRX0NPTlMKLSNkZWZpbmUgVV9TQl9FVEhfUlhfQkRfSU5ERVgJCUhDX0lOREVYX1VfRVRIX1JYX0JEX0NPTlMKLSNkZWZpbmUgQ19TQl9FVEhfVFhfQ1FfSU5ERVgJCUhDX0lOREVYX0NfRVRIX1RYX0NRX0NPTlMKLQotI2RlZmluZSBCTlgyWF9SWF9TQl9JTkRFWCBcCi0JKCZmcC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suaW5kZXhfdmFsdWVzW1VfU0JfRVRIX1JYX0NRX0lOREVYXSkKLQotI2RlZmluZSBCTlgyWF9SWF9TQl9CRF9JTkRFWCBcCi0JKCZmcC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suaW5kZXhfdmFsdWVzW1VfU0JfRVRIX1JYX0JEX0lOREVYXSkKLQotI2RlZmluZSBCTlgyWF9SWF9TQl9JTkRFWF9OVU0gXAotCQkoKChVX1NCX0VUSF9SWF9DUV9JTkRFWCA8PCBcCi0JCSAgIFVTVE9STV9FVEhfU1RfQ09OVEVYVF9DT05GSUdfQ1FFX1NCX0lOREVYX05VTUJFUl9TSElGVCkgJiBcCi0JCSAgVVNUT1JNX0VUSF9TVF9DT05URVhUX0NPTkZJR19DUUVfU0JfSU5ERVhfTlVNQkVSKSB8IFwKLQkJICgoVV9TQl9FVEhfUlhfQkRfSU5ERVggPDwgXAotCQkgICBVU1RPUk1fRVRIX1NUX0NPTlRFWFRfQ09ORklHX0JEX1NCX0lOREVYX05VTUJFUl9TSElGVCkgJiBcCi0JCSAgVVNUT1JNX0VUSF9TVF9DT05URVhUX0NPTkZJR19CRF9TQl9JTkRFWF9OVU1CRVIpKQotCi0jZGVmaW5lIEJOWDJYX1RYX1NCX0lOREVYIFwKLQkoJmZwLT5zdGF0dXNfYmxrLT5jX3N0YXR1c19ibG9jay5pbmRleF92YWx1ZXNbQ19TQl9FVEhfVFhfQ1FfSU5ERVhdKQotCi0KLS8qIGVuZCBvZiBmYXN0IHBhdGggKi8KLQotLyogY29tbW9uICovCi0KLXN0cnVjdCBibngyeF9jb21tb24gewotCi0JdTMyCQkJY2hpcF9pZDsKLS8qIGNoaXAgbnVtOjE2LTMxLCByZXY6MTItMTUsIG1ldGFsOjQtMTEsIGJvbmRfaWQ6MC0zICovCi0jZGVmaW5lIENISVBfSUQoYnApCQkJKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4ZmZmZmZmZjApCi0KLSNkZWZpbmUgQ0hJUF9OVU0oYnApCQkJKGJwLT5jb21tb24uY2hpcF9pZCA+PiAxNikKLSNkZWZpbmUgQ0hJUF9OVU1fNTc3MTAJCQkweDE2NGUKLSNkZWZpbmUgQ0hJUF9OVU1fNTc3MTEJCQkweDE2NGYKLSNkZWZpbmUgQ0hJUF9OVU1fNTc3MTFFCQkJMHgxNjUwCi0jZGVmaW5lIENISVBfSVNfRTEoYnApCQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzcxMCkKLSNkZWZpbmUgQ0hJUF9JU181NzcxMShicCkJCShDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTc3MTEpCi0jZGVmaW5lIENISVBfSVNfNTc3MTFFKGJwKQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzcxMUUpCi0jZGVmaW5lIENISVBfSVNfRTFIKGJwKQkJCShDSElQX0lTXzU3NzExKGJwKSB8fCBcCi0JCQkJCSBDSElQX0lTXzU3NzExRShicCkpCi0jZGVmaW5lIElTX0UxSF9PRkZTRVQJCQlDSElQX0lTX0UxSChicCkKLQotI2RlZmluZSBDSElQX1JFVihicCkJCQkoYnAtPmNvbW1vbi5jaGlwX2lkICYgMHgwMDAwZjAwMCkKLSNkZWZpbmUgQ0hJUF9SRVZfQXgJCQkweDAwMDAwMDAwCi0vKiBhc3N1bWUgbWF4aW11bSA1IHJldmlzaW9ucyAqLwotI2RlZmluZSBDSElQX1JFVl9JU19TTE9XKGJwKQkJKENISVBfUkVWKGJwKSA+IDB4MDAwMDUwMDApCi0vKiBFbXVsIHZlcnNpb25zIGFyZSBBPT4weGUsIEI9PjB4YywgQz0+MHhhLCBEPT44LCBFPT42ICovCi0jZGVmaW5lIENISVBfUkVWX0lTX0VNVUwoYnApCQkoKENISVBfUkVWX0lTX1NMT1coYnApKSAmJiBcCi0JCQkJCSAhKENISVBfUkVWKGJwKSAmIDB4MDAwMDEwMDApKQotLyogRlBHQSB2ZXJzaW9ucyBhcmUgQT0+MHhmLCBCPT4weGQsIEM9PjB4YiwgRD0+OSwgRT0+NyAqLwotI2RlZmluZSBDSElQX1JFVl9JU19GUEdBKGJwKQkJKChDSElQX1JFVl9JU19TTE9XKGJwKSkgJiYgXAotCQkJCQkgKENISVBfUkVWKGJwKSAmIDB4MDAwMDEwMDApKQotCi0jZGVmaW5lIENISVBfVElNRShicCkJCQkoKENISVBfUkVWX0lTX0VNVUwoYnApKSA/IDIwMDAgOiBcCi0JCQkJCSgoQ0hJUF9SRVZfSVNfRlBHQShicCkpID8gMjAwIDogMSkpCi0KLSNkZWZpbmUgQ0hJUF9NRVRBTChicCkJCQkoYnAtPmNvbW1vbi5jaGlwX2lkICYgMHgwMDAwMGZmMCkKLSNkZWZpbmUgQ0hJUF9CT05EX0lEKGJwKQkJKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4MDAwMDAwMGYpCi0KLQlpbnQJCQlmbGFzaF9zaXplOwotI2RlZmluZSBOVlJBTV8xTUJfU0laRQkJCTB4MjAwMDAJLyogMU0gYml0IGluIGJ5dGVzICovCi0jZGVmaW5lIE5WUkFNX1RJTUVPVVRfQ09VTlQJCTMwMDAwCi0jZGVmaW5lIE5WUkFNX1BBR0VfU0laRQkJCTI1NgotCi0JdTMyCQkJc2htZW1fYmFzZTsKLQl1MzIJCQlzaG1lbTJfYmFzZTsKLQotCXUzMgkJCWh3X2NvbmZpZzsKLQotCXUzMgkJCWJjX3ZlcjsKLX07Ci0KLQotLyogZW5kIG9mIGNvbW1vbiAqLwotCi0vKiBwb3J0ICovCi0KLXN0cnVjdCBuaWdfc3RhdHMgewotCXUzMiBicmJfZGlzY2FyZDsKLQl1MzIgYnJiX3BhY2tldDsKLQl1MzIgYnJiX3RydW5jYXRlOwotCXUzMiBmbG93X2N0cmxfZGlzY2FyZDsKLQl1MzIgZmxvd19jdHJsX29jdGV0czsKLQl1MzIgZmxvd19jdHJsX3BhY2tldDsKLQl1MzIgbW5nX2Rpc2NhcmQ7Ci0JdTMyIG1uZ19vY3RldF9pbnA7Ci0JdTMyIG1uZ19vY3RldF9vdXQ7Ci0JdTMyIG1uZ19wYWNrZXRfaW5wOwotCXUzMiBtbmdfcGFja2V0X291dDsKLQl1MzIgcGJmX29jdGV0czsKLQl1MzIgcGJmX3BhY2tldDsKLQl1MzIgc2FmY19pbnA7Ci0JdTMyIGVncmVzc19tYWNfcGt0MF9sbzsKLQl1MzIgZWdyZXNzX21hY19wa3QwX2hpOwotCXUzMiBlZ3Jlc3NfbWFjX3BrdDFfbG87Ci0JdTMyIGVncmVzc19tYWNfcGt0MV9oaTsKLX07Ci0KLXN0cnVjdCBibngyeF9wb3J0IHsKLQl1MzIJCQlwbWY7Ci0KLQl1MzIJCQlsaW5rX2NvbmZpZzsKLQotCXUzMgkJCXN1cHBvcnRlZDsKLS8qIGxpbmsgc2V0dGluZ3MgLSBtaXNzaW5nIGRlZmluZXMgKi8KLSNkZWZpbmUgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsCSgxIDw8IDE1KQotCi0JdTMyCQkJYWR2ZXJ0aXNpbmc7Ci0vKiBsaW5rIHNldHRpbmdzIC0gbWlzc2luZyBkZWZpbmVzICovCi0jZGVmaW5lIEFEVkVSVElTRURfMjUwMGJhc2VYX0Z1bGwJKDEgPDwgMTUpCi0KLQl1MzIJCQlwaHlfYWRkcjsKLQotCS8qIHVzZWQgdG8gc3luY2hyb25pemUgcGh5IGFjY2Vzc2VzICovCi0Jc3RydWN0IG11dGV4CQlwaHlfbXV0ZXg7Ci0JaW50CQkJbmVlZF9od19sb2NrOwotCi0JdTMyCQkJcG9ydF9zdHg7Ci0KLQlzdHJ1Y3QgbmlnX3N0YXRzCW9sZF9uaWdfc3RhdHM7Ci19OwotCi0vKiBlbmQgb2YgcG9ydCAqLwotCi0KLWVudW0gYm54Mnhfc3RhdHNfZXZlbnQgewotCVNUQVRTX0VWRU5UX1BNRiA9IDAsCi0JU1RBVFNfRVZFTlRfTElOS19VUCwKLQlTVEFUU19FVkVOVF9VUERBVEUsCi0JU1RBVFNfRVZFTlRfU1RPUCwKLQlTVEFUU19FVkVOVF9NQVgKLX07Ci0KLWVudW0gYm54Mnhfc3RhdHNfc3RhdGUgewotCVNUQVRTX1NUQVRFX0RJU0FCTEVEID0gMCwKLQlTVEFUU19TVEFURV9FTkFCTEVELAotCVNUQVRTX1NUQVRFX01BWAotfTsKLQotc3RydWN0IGJueDJ4X2V0aF9zdGF0cyB7Ci0JdTMyIHRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpOwotCXUzMiB0b3RhbF9ieXRlc19yZWNlaXZlZF9sbzsKLQl1MzIgdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGk7Ci0JdTMyIHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvOwotCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7Ci0JdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKLQl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7Ci0JdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOwotCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaTsKLQl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87Ci0JdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKLQl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOwotCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKLQl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87Ci0JdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpOwotCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKLQl1MzIgdmFsaWRfYnl0ZXNfcmVjZWl2ZWRfaGk7Ci0JdTMyIHZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvOwotCi0JdTMyIGVycm9yX2J5dGVzX3JlY2VpdmVkX2hpOwotCXUzMiBlcnJvcl9ieXRlc19yZWNlaXZlZF9sbzsKLQl1MzIgZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGk7Ci0JdTMyIGV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2xvOwotCXUzMiBub19idWZmX2Rpc2NhcmRfaGk7Ci0JdTMyIG5vX2J1ZmZfZGlzY2FyZF9sbzsKLQotCXUzMiByeF9zdGF0X2lmaGNpbmJhZG9jdGV0c19oaTsKLQl1MzIgcnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfbG87Ci0JdTMyIHR4X3N0YXRfaWZoY291dGJhZG9jdGV0c19oaTsKLQl1MzIgdHhfc3RhdF9pZmhjb3V0YmFkb2N0ZXRzX2xvOwotCXUzMiByeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9yc19oaTsKLQl1MzIgcnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnNfbG87Ci0JdTMyIHJ4X3N0YXRfZG90M3N0YXRzYWxpZ25tZW50ZXJyb3JzX2hpOwotCXUzMiByeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19sbzsKLQl1MzIgcnhfc3RhdF9kb3Qzc3RhdHNjYXJyaWVyc2Vuc2VlcnJvcnNfaGk7Ci0JdTMyIHJ4X3N0YXRfZG90M3N0YXRzY2FycmllcnNlbnNlZXJyb3JzX2xvOwotCXUzMiByeF9zdGF0X2ZhbHNlY2FycmllcmVycm9yc19oaTsKLQl1MzIgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnNfbG87Ci0JdTMyIHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHNfaGk7Ci0JdTMyIHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHNfbG87Ci0JdTMyIHJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZ19oaTsKLQl1MzIgcnhfc3RhdF9kb3Qzc3RhdHNmcmFtZXN0b29sb25nX2xvOwotCXUzMiByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHNfaGk7Ci0JdTMyIHJ4X3N0YXRfZXRoZXJzdGF0c2ZyYWdtZW50c19sbzsKLQl1MzIgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVyc19oaTsKLQl1MzIgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVyc19sbzsKLQl1MzIgcnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWRfaGk7Ci0JdTMyIHJ4X3N0YXRfbWFjY29udHJvbGZyYW1lc3JlY2VpdmVkX2xvOwotCXUzMiByeF9zdGF0X2JtYWNfeHBmX2hpOwotCXUzMiByeF9zdGF0X2JtYWNfeHBmX2xvOwotCXUzMiByeF9zdGF0X2JtYWNfeGNmX2hpOwotCXUzMiByeF9zdGF0X2JtYWNfeGNmX2xvOwotCXUzMiByeF9zdGF0X3hvZmZzdGF0ZWVudGVyZWRfaGk7Ci0JdTMyIHJ4X3N0YXRfeG9mZnN0YXRlZW50ZXJlZF9sbzsKLQl1MzIgcnhfc3RhdF94b25wYXVzZWZyYW1lc3JlY2VpdmVkX2hpOwotCXUzMiByeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWRfbG87Ci0JdTMyIHJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWRfaGk7Ci0JdTMyIHJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWRfbG87Ci0JdTMyIHR4X3N0YXRfb3V0eG9uc2VudF9oaTsKLQl1MzIgdHhfc3RhdF9vdXR4b25zZW50X2xvOwotCXUzMiB0eF9zdGF0X291dHhvZmZzZW50X2hpOwotCXUzMiB0eF9zdGF0X291dHhvZmZzZW50X2xvOwotCXUzMiB0eF9zdGF0X2Zsb3djb250cm9sZG9uZV9oaTsKLQl1MzIgdHhfc3RhdF9mbG93Y29udHJvbGRvbmVfbG87Ci0JdTMyIHR4X3N0YXRfZXRoZXJzdGF0c2NvbGxpc2lvbnNfaGk7Ci0JdTMyIHR4X3N0YXRfZXRoZXJzdGF0c2NvbGxpc2lvbnNfbG87Ci0JdTMyIHR4X3N0YXRfZG90M3N0YXRzc2luZ2xlY29sbGlzaW9uZnJhbWVzX2hpOwotCXUzMiB0eF9zdGF0X2RvdDNzdGF0c3NpbmdsZWNvbGxpc2lvbmZyYW1lc19sbzsKLQl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lc19oaTsKLQl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lc19sbzsKLQl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNkZWZlcnJlZHRyYW5zbWlzc2lvbnNfaGk7Ci0JdTMyIHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zX2xvOwotCXUzMiB0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfaGk7Ci0JdTMyIHR4X3N0YXRfZG90M3N0YXRzZXhjZXNzaXZlY29sbGlzaW9uc19sbzsKLQl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uc19oaTsKLQl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uc19sbzsKLQl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzX2hpOwotCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjRvY3RldHNfbG87Ci0JdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NW9jdGV0c3RvMTI3b2N0ZXRzX2hpOwotCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjVvY3RldHN0bzEyN29jdGV0c19sbzsKLQl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzX2hpOwotCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTI4b2N0ZXRzdG8yNTVvY3RldHNfbG87Ci0JdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMyNTZvY3RldHN0bzUxMW9jdGV0c19oaTsKLQl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzX2xvOwotCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzX2hpOwotCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzX2xvOwotCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0c19oaTsKLQl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHNfbG87Ci0JdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19oaTsKLQl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2xvOwotCXUzMiB0eF9zdGF0X2JtYWNfMjA0N19oaTsKLQl1MzIgdHhfc3RhdF9ibWFjXzIwNDdfbG87Ci0JdTMyIHR4X3N0YXRfYm1hY180MDk1X2hpOwotCXUzMiB0eF9zdGF0X2JtYWNfNDA5NV9sbzsKLQl1MzIgdHhfc3RhdF9ibWFjXzkyMTZfaGk7Ci0JdTMyIHR4X3N0YXRfYm1hY185MjE2X2xvOwotCXUzMiB0eF9zdGF0X2JtYWNfMTYzODNfaGk7Ci0JdTMyIHR4X3N0YXRfYm1hY18xNjM4M19sbzsKLQl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzX2hpOwotCXUzMiB0eF9zdGF0X2RvdDNzdGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnNfbG87Ci0JdTMyIHR4X3N0YXRfYm1hY191ZmxfaGk7Ci0JdTMyIHR4X3N0YXRfYm1hY191ZmxfbG87Ci0KLQl1MzIgcGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpOwotCXUzMiBwYXVzZV9mcmFtZXNfcmVjZWl2ZWRfbG87Ci0JdTMyIHBhdXNlX2ZyYW1lc19zZW50X2hpOwotCXUzMiBwYXVzZV9mcmFtZXNfc2VudF9sbzsKLQotCXUzMiBldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHNfaGk7Ci0JdTMyIGV0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0c19sbzsKLQl1MzIgZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19oaTsKLQl1MzIgZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19sbzsKLQotCXUzMiBicmJfZHJvcF9oaTsKLQl1MzIgYnJiX2Ryb3BfbG87Ci0JdTMyIGJyYl90cnVuY2F0ZV9oaTsKLQl1MzIgYnJiX3RydW5jYXRlX2xvOwotCi0JdTMyIG1hY19maWx0ZXJfZGlzY2FyZDsKLQl1MzIgeHhvdmVyZmxvd19kaXNjYXJkOwotCXUzMiBicmJfdHJ1bmNhdGVfZGlzY2FyZDsKLQl1MzIgbWFjX2Rpc2NhcmQ7Ci0KLQl1MzIgZHJpdmVyX3hvZmY7Ci0JdTMyIHJ4X2Vycl9kaXNjYXJkX3BrdDsKLQl1MzIgcnhfc2tiX2FsbG9jX2ZhaWxlZDsKLQl1MzIgaHdfY3N1bV9lcnI7Ci0KLQl1MzIgbmlnX3RpbWVyX21heDsKLX07Ci0KLSNkZWZpbmUgQk5YMlhfTlVNX1NUQVRTCQkJNDMKLSNkZWZpbmUgU1RBVFNfT0ZGU0VUMzIoc3RhdF9uYW1lKSBcCi0JCQkob2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2V0aF9zdGF0cywgc3RhdF9uYW1lKSAvIDQpCi0KLQotI2lmZGVmIEJDTV9DTklDCi0jZGVmaW5lIE1BWF9DT05URVhUCQkJMTUKLSNlbHNlCi0jZGVmaW5lIE1BWF9DT05URVhUCQkJMTYKLSNlbmRpZgotCi11bmlvbiBjZHVfY29udGV4dCB7Ci0Jc3RydWN0IGV0aF9jb250ZXh0IGV0aDsKLQljaGFyIHBhZFsxMDI0XTsKLX07Ci0KLSNkZWZpbmUgTUFYX0RNQUVfQwkJCTgKLQotLyogRE1BIG1lbW9yeSBub3QgdXNlZCBpbiBmYXN0cGF0aCAqLwotc3RydWN0IGJueDJ4X3Nsb3dwYXRoIHsKLQl1bmlvbiBjZHVfY29udGV4dAkJY29udGV4dFtNQVhfQ09OVEVYVF07Ci0Jc3RydWN0IGV0aF9zdGF0c19xdWVyeQkJZndfc3RhdHM7Ci0Jc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZAltYWNfY29uZmlnOwotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQJbWNhc3RfY29uZmlnOwotCi0JLyogdXNlZCBieSBkbWFlIGNvbW1hbmQgZXhlY3V0ZXIgKi8KLQlzdHJ1Y3QgZG1hZV9jb21tYW5kCQlkbWFlW01BWF9ETUFFX0NdOwotCi0JdTMyCQkJCXN0YXRzX2NvbXA7Ci0JdW5pb24gbWFjX3N0YXRzCQkJbWFjX3N0YXRzOwotCXN0cnVjdCBuaWdfc3RhdHMJCW5pZ19zdGF0czsKLQlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzCQlwb3J0X3N0YXRzOwotCXN0cnVjdCBob3N0X2Z1bmNfc3RhdHMJCWZ1bmNfc3RhdHM7Ci0Jc3RydWN0IGhvc3RfZnVuY19zdGF0cwkJZnVuY19zdGF0c19iYXNlOwotCi0JdTMyCQkJCXdiX2NvbXA7Ci0JdTMyCQkJCXdiX2RhdGFbNF07Ci19OwotCi0jZGVmaW5lIGJueDJ4X3NwKGJwLCB2YXIpCQkoJmJwLT5zbG93cGF0aC0+dmFyKQotI2RlZmluZSBibngyeF9zcF9tYXBwaW5nKGJwLCB2YXIpIFwKLQkJKGJwLT5zbG93cGF0aF9tYXBwaW5nICsgb2Zmc2V0b2Yoc3RydWN0IGJueDJ4X3Nsb3dwYXRoLCB2YXIpKQotCi0KLS8qIGF0dG4gZ3JvdXAgd2lyaW5nICovCi0jZGVmaW5lIE1BWF9EWU5BTUlDX0FUVE5fR1JQUwkJOAotCi1zdHJ1Y3QgYXR0bl9yb3V0ZSB7Ci0JdTMyCXNpZ1s0XTsKLX07Ci0KLXR5cGVkZWYgZW51bSB7Ci0JQk5YMlhfUkVDT1ZFUllfRE9ORSwKLQlCTlgyWF9SRUNPVkVSWV9JTklULAotCUJOWDJYX1JFQ09WRVJZX1dBSVQsCi19IGJueDJ4X3JlY292ZXJ5X3N0YXRlX3Q7Ci0KLXN0cnVjdCBibngyeCB7Ci0JLyogRmllbGRzIHVzZWQgaW4gdGhlIHR4IGFuZCBpbnRyL25hcGkgcGVyZm9ybWFuY2UgcGF0aHMKLQkgKiBhcmUgZ3JvdXBlZCB0b2dldGhlciBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KLQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGgJZnBbTUFYX0NPTlRFWFRdOwotCXZvaWQgX19pb21lbQkJKnJlZ3ZpZXc7Ci0Jdm9pZCBfX2lvbWVtCQkqZG9vcmJlbGxzOwotI2lmZGVmIEJDTV9DTklDCi0jZGVmaW5lIEJOWDJYX0RCX1NJWkUJCSgxOCpCQ01fUEFHRV9TSVpFKQotI2Vsc2UKLSNkZWZpbmUgQk5YMlhfREJfU0laRQkJKDE2KkJDTV9QQUdFX1NJWkUpCi0jZW5kaWYKLQotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci0Jc3RydWN0IHBjaV9kZXYJCSpwZGV2OwotCi0JYXRvbWljX3QJCWludHJfc2VtOwotCi0JYm54MnhfcmVjb3Zlcnlfc3RhdGVfdAlyZWNvdmVyeV9zdGF0ZTsKLQlpbnQJCQlpc19sZWFkZXI7Ci0jaWZkZWYgQkNNX0NOSUMKLQlzdHJ1Y3QgbXNpeF9lbnRyeQltc2l4X3RhYmxlW01BWF9DT05URVhUKzJdOwotI2Vsc2UKLQlzdHJ1Y3QgbXNpeF9lbnRyeQltc2l4X3RhYmxlW01BWF9DT05URVhUKzFdOwotI2VuZGlmCi0jZGVmaW5lIElOVF9NT0RFX0lOVHgJCQkxCi0jZGVmaW5lIElOVF9NT0RFX01TSQkJCTIKLQotCWludAkJCXR4X3Jpbmdfc2l6ZTsKLQotI2lmZGVmIEJDTV9WTEFOCi0Jc3RydWN0IHZsYW5fZ3JvdXAJKnZsZ3JwOwotI2VuZGlmCi0KLQl1MzIJCQlyeF9jc3VtOwotCXUzMgkJCXJ4X2J1Zl9zaXplOwotI2RlZmluZSBFVEhfT1ZSRUhFQUQJCQkoRVRIX0hMRU4gKyA4KQkvKiA4IGZvciBDUkMgKyBWTEFOICovCi0jZGVmaW5lIEVUSF9NSU5fUEFDS0VUX1NJWkUJCTYwCi0jZGVmaW5lIEVUSF9NQVhfUEFDS0VUX1NJWkUJCTE1MDAKLSNkZWZpbmUgRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRQk5NjAwCi0KLQkvKiBNYXggc3VwcG9ydGVkIGFsaWdubWVudCBpcyAyNTYgKDggc2hpZnQpICovCi0jZGVmaW5lIEJOWDJYX1JYX0FMSUdOX1NISUZUCQkoKEwxX0NBQ0hFX1NISUZUIDwgOCkgPyBcCi0JCQkJCSBMMV9DQUNIRV9TSElGVCA6IDgpCi0jZGVmaW5lIEJOWDJYX1JYX0FMSUdOCQkJKDEgPDwgQk5YMlhfUlhfQUxJR05fU0hJRlQpCi0KLQlzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrICpkZWZfc3RhdHVzX2JsazsKLSNkZWZpbmUgREVGX1NCX0lECQkJMTYKLQlfX2xlMTYJCQlkZWZfY19pZHg7Ci0JX19sZTE2CQkJZGVmX3VfaWR4OwotCV9fbGUxNgkJCWRlZl94X2lkeDsKLQlfX2xlMTYJCQlkZWZfdF9pZHg7Ci0JX19sZTE2CQkJZGVmX2F0dF9pZHg7Ci0JdTMyCQkJYXR0bl9zdGF0ZTsKLQlzdHJ1Y3QgYXR0bl9yb3V0ZQlhdHRuX2dyb3VwW01BWF9EWU5BTUlDX0FUVE5fR1JQU107Ci0KLQkvKiBzbG93IHBhdGggcmluZyAqLwotCXN0cnVjdCBldGhfc3BlCQkqc3BxOwotCWRtYV9hZGRyX3QJCXNwcV9tYXBwaW5nOwotCXUxNgkJCXNwcV9wcm9kX2lkeDsKLQlzdHJ1Y3QgZXRoX3NwZQkJKnNwcV9wcm9kX2JkOwotCXN0cnVjdCBldGhfc3BlCQkqc3BxX2xhc3RfYmQ7Ci0JX19sZTE2CQkJKmRzYl9zcF9wcm9kOwotCXUxNgkJCXNwcV9sZWZ0OyAvKiBzZXJpYWxpemUgc3BxICovCi0JLyogdXNlZCB0byBzeW5jaHJvbml6ZSBzcHEgYWNjZXNzZXMgKi8KLQlzcGlubG9ja190CQlzcHFfbG9jazsKLQotCS8qIEZsYWdzIGZvciBtYXJraW5nIHRoYXQgdGhlcmUgaXMgYSBTVEFUX1FVRVJZIG9yCi0JICAgU0VUX01BQyByYW1yb2QgcGVuZGluZyAqLwotCWludAkJCXN0YXRzX3BlbmRpbmc7Ci0JaW50CQkJc2V0X21hY19wZW5kaW5nOwotCi0JLyogRW5kIG9mIGZpZWxkcyB1c2VkIGluIHRoZSBwZXJmb3JtYW5jZSBjb2RlIHBhdGhzICovCi0KLQlpbnQJCQlwYW5pYzsKLQlpbnQJCQltc2dfZW5hYmxlOwotCi0JdTMyCQkJZmxhZ3M7Ci0jZGVmaW5lIFBDSVhfRkxBRwkJCTEKLSNkZWZpbmUgUENJXzMyQklUX0ZMQUcJCQkyCi0jZGVmaW5lIE9ORV9QT1JUX0ZMQUcJCQk0Ci0jZGVmaW5lIE5PX1dPTF9GTEFHCQkJOAotI2RlZmluZSBVU0lOR19EQUNfRkxBRwkJCTB4MTAKLSNkZWZpbmUgVVNJTkdfTVNJWF9GTEFHCQkJMHgyMAotI2RlZmluZSBVU0lOR19NU0lfRkxBRwkJCTB4NDAKLSNkZWZpbmUgVFBBX0VOQUJMRV9GTEFHCQkJMHg4MAotI2RlZmluZSBOT19NQ1BfRkxBRwkJCTB4MTAwCi0jZGVmaW5lIEJQX05PTUNQKGJwKQkJCShicC0+ZmxhZ3MgJiBOT19NQ1BfRkxBRykKLSNkZWZpbmUgSFdfVkxBTl9UWF9GTEFHCQkJMHg0MDAKLSNkZWZpbmUgSFdfVkxBTl9SWF9GTEFHCQkJMHg4MDAKLSNkZWZpbmUgTUZfRlVOQ19ESVMJCQkweDEwMDAKLQotCWludAkJCWZ1bmM7Ci0jZGVmaW5lIEJQX1BPUlQoYnApCQkJKGJwLT5mdW5jICUgUE9SVF9NQVgpCi0jZGVmaW5lIEJQX0ZVTkMoYnApCQkJKGJwLT5mdW5jKQotI2RlZmluZSBCUF9FMUhWTihicCkJCQkoYnAtPmZ1bmMgPj4gMSkKLSNkZWZpbmUgQlBfTF9JRChicCkJCQkoQlBfRTFIVk4oYnApIDw8IDIpCi0KLSNpZmRlZiBCQ01fQ05JQwotI2RlZmluZSBCQ01fQ05JQ19DSURfU1RBUlQJCTE2Ci0jZGVmaW5lIEJDTV9JU0NTSV9FVEhfQ0xfSUQJCTE3Ci0jZW5kaWYKLQotCWludAkJCXBtX2NhcDsKLQlpbnQJCQlwY2llX2NhcDsKLQlpbnQJCQltcnJzOwotCi0Jc3RydWN0IGRlbGF5ZWRfd29yawlzcF90YXNrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsJcmVzZXRfdGFzazsKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKLQlpbnQJCQljdXJyZW50X2ludGVydmFsOwotCi0JdTE2CQkJZndfc2VxOwotCXUxNgkJCWZ3X2Rydl9wdWxzZV93cl9zZXE7Ci0JdTMyCQkJZnVuY19zdHg7Ci0KLQlzdHJ1Y3QgbGlua19wYXJhbXMJbGlua19wYXJhbXM7Ci0Jc3RydWN0IGxpbmtfdmFycwlsaW5rX3ZhcnM7Ci0Jc3RydWN0IG1kaW9faWZfaW5mbwltZGlvOwotCi0Jc3RydWN0IGJueDJ4X2NvbW1vbgljb21tb247Ci0Jc3RydWN0IGJueDJ4X3BvcnQJcG9ydDsKLQotCXN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCBjbW5nOwotCXUzMgkJCXZuX3dlaWdodF9zdW07Ci0KLQl1MzIJCQltZl9jb25maWc7Ci0JdTE2CQkJZTFob3Y7Ci0JdTgJCQllMWhtZjsKLSNkZWZpbmUgSVNfRTFITUYoYnApCQkJKGJwLT5lMWhtZiAhPSAwKQotCi0JdTgJCQl3b2w7Ci0KLQlpbnQJCQlyeF9yaW5nX3NpemU7Ci0KLQl1MTYJCQl0eF9xdWlja19jb25zX3RyaXBfaW50OwotCXUxNgkJCXR4X3F1aWNrX2NvbnNfdHJpcDsKLQl1MTYJCQl0eF90aWNrc19pbnQ7Ci0JdTE2CQkJdHhfdGlja3M7Ci0KLQl1MTYJCQlyeF9xdWlja19jb25zX3RyaXBfaW50OwotCXUxNgkJCXJ4X3F1aWNrX2NvbnNfdHJpcDsKLQl1MTYJCQlyeF90aWNrc19pbnQ7Ci0JdTE2CQkJcnhfdGlja3M7Ci0vKiBNYXhpbWFsIGNvYWxlc2NpbmcgdGltZW91dCBpbiB1cyAqLwotI2RlZmluZSBCTlgyWF9NQVhfQ09BTEVTQ0VfVE9VVAkJKDB4ZjAqMTIpCi0KLQl1MzIJCQlsaW5fY250OwotCi0JaW50CQkJc3RhdGU7Ci0jZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NFRAkJMAotI2RlZmluZSBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X0xPQUQJMHgxMDAwCi0jZGVmaW5lIEJOWDJYX1NUQVRFX09QRU5JTkdfV0FJVDRfUE9SVAkweDIwMDAKLSNkZWZpbmUgQk5YMlhfU1RBVEVfT1BFTgkJMHgzMDAwCi0jZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfSEFMVAkweDQwMDAKLSNkZWZpbmUgQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9ERUxFVEUgMHg1MDAwCi0jZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfVU5MT0FEIDB4NjAwMAotI2RlZmluZSBCTlgyWF9TVEFURV9ESUFHCQkweGUwMDAKLSNkZWZpbmUgQk5YMlhfU1RBVEVfRVJST1IJCTB4ZjAwMAotCi0JaW50CQkJbXVsdGlfbW9kZTsKLQlpbnQJCQludW1fcXVldWVzOwotCi0JdTMyCQkJcnhfbW9kZTsKLSNkZWZpbmUgQk5YMlhfUlhfTU9ERV9OT05FCQkwCi0jZGVmaW5lIEJOWDJYX1JYX01PREVfTk9STUFMCQkxCi0jZGVmaW5lIEJOWDJYX1JYX01PREVfQUxMTVVMVEkJCTIKLSNkZWZpbmUgQk5YMlhfUlhfTU9ERV9QUk9NSVNDCQkzCi0jZGVmaW5lIEJOWDJYX01BWF9NVUxUSUNBU1QJCTY0Ci0jZGVmaW5lIEJOWDJYX01BWF9FTVVMX01VTFRJCQkxNgotCi0JdTMyIAkJCXJ4X21vZGVfY2xfbWFzazsKLQotCWRtYV9hZGRyX3QJCWRlZl9zdGF0dXNfYmxrX21hcHBpbmc7Ci0KLQlzdHJ1Y3QgYm54Mnhfc2xvd3BhdGgJKnNsb3dwYXRoOwotCWRtYV9hZGRyX3QJCXNsb3dwYXRoX21hcHBpbmc7Ci0KLQlpbnQJCQlkcm9wbGVzc19mYzsKLQotI2lmZGVmIEJDTV9DTklDCi0JdTMyCQkJY25pY19mbGFnczsKLSNkZWZpbmUgQk5YMlhfQ05JQ19GTEFHX01BQ19TRVQJCTEKLQotCXZvaWQJCQkqdDE7Ci0JZG1hX2FkZHJfdAkJdDFfbWFwcGluZzsKLQl2b2lkCQkJKnQyOwotCWRtYV9hZGRyX3QJCXQyX21hcHBpbmc7Ci0Jdm9pZAkJCSp0aW1lcnM7Ci0JZG1hX2FkZHJfdAkJdGltZXJzX21hcHBpbmc7Ci0Jdm9pZAkJCSpxbTsKLQlkbWFfYWRkcl90CQlxbV9tYXBwaW5nOwotCXN0cnVjdCBjbmljX29wcwkJKmNuaWNfb3BzOwotCXZvaWQJCQkqY25pY19kYXRhOwotCXUzMgkJCWNuaWNfdGFnOwotCXN0cnVjdCBjbmljX2V0aF9kZXYJY25pY19ldGhfZGV2OwotCXN0cnVjdCBob3N0X3N0YXR1c19ibG9jayAqY25pY19zYjsKLQlkbWFfYWRkcl90CQljbmljX3NiX21hcHBpbmc7Ci0jZGVmaW5lIENOSUNfU0JfSUQoYnApCQkJQlBfTF9JRChicCkKLQlzdHJ1Y3QgZXRoX3NwZQkJKmNuaWNfa3dxOwotCXN0cnVjdCBldGhfc3BlCQkqY25pY19rd3FfcHJvZDsKLQlzdHJ1Y3QgZXRoX3NwZQkJKmNuaWNfa3dxX2NvbnM7Ci0Jc3RydWN0IGV0aF9zcGUJCSpjbmljX2t3cV9sYXN0OwotCXUxNgkJCWNuaWNfa3dxX3BlbmRpbmc7Ci0JdTE2CQkJY25pY19zcHFfcGVuZGluZzsKLQlzdHJ1Y3QgbXV0ZXgJCWNuaWNfbXV0ZXg7Ci0JdTgJCQlpc2NzaV9tYWNbNl07Ci0jZW5kaWYKLQotCWludAkJCWRtYWVfcmVhZHk7Ci0JLyogdXNlZCB0byBzeW5jaHJvbml6ZSBkbWFlIGFjY2Vzc2VzICovCi0Jc3RydWN0IG11dGV4CQlkbWFlX211dGV4OwotCi0JLyogdXNlZCB0byBwcm90ZWN0IHRoZSBGVyBtYWlsIGJveCAqLwotCXN0cnVjdCBtdXRleAkJZndfbWJfbXV0ZXg7Ci0KLQkvKiB1c2VkIHRvIHN5bmNocm9uaXplIHN0YXRzIGNvbGxlY3RpbmcgKi8KLQlpbnQJCQlzdGF0c19zdGF0ZTsKLQkvKiB1c2VkIGJ5IGRtYWUgY29tbWFuZCBsb2FkZXIgKi8KLQlzdHJ1Y3QgZG1hZV9jb21tYW5kCXN0YXRzX2RtYWU7Ci0JaW50CQkJZXhlY3V0ZXJfaWR4OwotCi0JdTE2CQkJc3RhdHNfY291bnRlcjsKLQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzCWV0aF9zdGF0czsKLQotCXN0cnVjdCB6X3N0cmVhbV9zCSpzdHJtOwotCXZvaWQJCQkqZ3VuemlwX2J1ZjsKLQlkbWFfYWRkcl90CQlndW56aXBfbWFwcGluZzsKLQlpbnQJCQlndW56aXBfb3V0bGVuOwotI2RlZmluZSBGV19CVUZfU0laRQkJCTB4ODAwMAotI2RlZmluZSBHVU5aSVBfQlVGKGJwKQkJCShicC0+Z3VuemlwX2J1ZikKLSNkZWZpbmUgR1VOWklQX1BIWVMoYnApCQkJKGJwLT5ndW56aXBfbWFwcGluZykKLSNkZWZpbmUgR1VOWklQX09VVExFTihicCkJCShicC0+Z3VuemlwX291dGxlbikKLQotCXN0cnVjdCByYXdfb3AJCSppbml0X29wczsKLQkvKiBJbml0IGJsb2NrcyBvZmZzZXRzIGluc2lkZSBpbml0X29wcyAqLwotCXUxNgkJCSppbml0X29wc19vZmZzZXRzOwotCS8qIERhdGEgYmxvYiAtIGhhcyAzMiBiaXQgZ3JhbnVsYXJpdHkgKi8KLQl1MzIJCQkqaW5pdF9kYXRhOwotCS8qIFppcHBlZCBQUkFNIGJsb2JzIC0gcmF3IGRhdGEgKi8KLQljb25zdCB1OAkJKnRzZW1faW50X3RhYmxlX2RhdGE7Ci0JY29uc3QgdTgJCSp0c2VtX3ByYW1fZGF0YTsKLQljb25zdCB1OAkJKnVzZW1faW50X3RhYmxlX2RhdGE7Ci0JY29uc3QgdTgJCSp1c2VtX3ByYW1fZGF0YTsKLQljb25zdCB1OAkJKnhzZW1faW50X3RhYmxlX2RhdGE7Ci0JY29uc3QgdTgJCSp4c2VtX3ByYW1fZGF0YTsKLQljb25zdCB1OAkJKmNzZW1faW50X3RhYmxlX2RhdGE7Ci0JY29uc3QgdTgJCSpjc2VtX3ByYW1fZGF0YTsKLSNkZWZpbmUgSU5JVF9PUFMoYnApCQkJKGJwLT5pbml0X29wcykKLSNkZWZpbmUgSU5JVF9PUFNfT0ZGU0VUUyhicCkJCShicC0+aW5pdF9vcHNfb2Zmc2V0cykKLSNkZWZpbmUgSU5JVF9EQVRBKGJwKQkJCShicC0+aW5pdF9kYXRhKQotI2RlZmluZSBJTklUX1RTRU1fSU5UX1RBQkxFX0RBVEEoYnApCShicC0+dHNlbV9pbnRfdGFibGVfZGF0YSkKLSNkZWZpbmUgSU5JVF9UU0VNX1BSQU1fREFUQShicCkJCShicC0+dHNlbV9wcmFtX2RhdGEpCi0jZGVmaW5lIElOSVRfVVNFTV9JTlRfVEFCTEVfREFUQShicCkJKGJwLT51c2VtX2ludF90YWJsZV9kYXRhKQotI2RlZmluZSBJTklUX1VTRU1fUFJBTV9EQVRBKGJwKQkJKGJwLT51c2VtX3ByYW1fZGF0YSkKLSNkZWZpbmUgSU5JVF9YU0VNX0lOVF9UQUJMRV9EQVRBKGJwKQkoYnAtPnhzZW1faW50X3RhYmxlX2RhdGEpCi0jZGVmaW5lIElOSVRfWFNFTV9QUkFNX0RBVEEoYnApCQkoYnAtPnhzZW1fcHJhbV9kYXRhKQotI2RlZmluZSBJTklUX0NTRU1fSU5UX1RBQkxFX0RBVEEoYnApCShicC0+Y3NlbV9pbnRfdGFibGVfZGF0YSkKLSNkZWZpbmUgSU5JVF9DU0VNX1BSQU1fREFUQShicCkJCShicC0+Y3NlbV9wcmFtX2RhdGEpCi0KLQljaGFyCQkJZndfdmVyWzMyXTsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUJKmZpcm13YXJlOwotfTsKLQotCi0jZGVmaW5lIEJOWDJYX01BWF9RVUVVRVMoYnApCShJU19FMUhNRihicCkgPyAoTUFYX0NPTlRFWFQvRTFIVk5fTUFYKSBcCi0JCQkJCSAgICAgIDogTUFYX0NPTlRFWFQpCi0jZGVmaW5lIEJOWDJYX05VTV9RVUVVRVMoYnApCShicC0+bnVtX3F1ZXVlcykKLSNkZWZpbmUgaXNfbXVsdGkoYnApCQkoQk5YMlhfTlVNX1FVRVVFUyhicCkgPiAxKQotCi0jZGVmaW5lIGZvcl9lYWNoX3F1ZXVlKGJwLCB2YXIpIFwKLQkJCWZvciAodmFyID0gMDsgdmFyIDwgQk5YMlhfTlVNX1FVRVVFUyhicCk7IHZhcisrKQotI2RlZmluZSBmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCB2YXIpIFwKLQkJCWZvciAodmFyID0gMTsgdmFyIDwgQk5YMlhfTlVNX1FVRVVFUyhicCk7IHZhcisrKQotCi0KLXZvaWQgYm54MnhfcmVhZF9kbWFlKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzcmNfYWRkciwgdTMyIGxlbjMyKTsKLXZvaWQgYm54Mnhfd3JpdGVfZG1hZShzdHJ1Y3QgYm54MnggKmJwLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgZHN0X2FkZHIsCi0JCSAgICAgIHUzMiBsZW4zMik7Ci1pbnQgYm54MnhfZ2V0X2dwaW8oc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1OCBwb3J0KTsKLWludCBibngyeF9zZXRfZ3BpbyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZ3Bpb19udW0sIHUzMiBtb2RlLCB1OCBwb3J0KTsKLWludCBibngyeF9zZXRfZ3Bpb19pbnQoc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCk7Ci11MzIgYm54MnhfZndfY29tbWFuZChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgY29tbWFuZCk7Ci12b2lkIGJueDJ4X3JlZ193cl9pbmQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIHUzMiB2YWwpOwotdm9pZCBibngyeF93cml0ZV9kbWFlX3BoeXNfbGVuKHN0cnVjdCBibngyeCAqYnAsIGRtYV9hZGRyX3QgcGh5c19hZGRyLAotCQkJICAgICAgIHUzMiBhZGRyLCB1MzIgbGVuKTsKLQotc3RhdGljIGlubGluZSB1MzIgcmVnX3BvbGwoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywgdTMyIGV4cGVjdGVkLCBpbnQgbXMsCi0JCQkgICBpbnQgd2FpdCkKLXsKLQl1MzIgdmFsOwotCi0JZG8gewotCQl2YWwgPSBSRUdfUkQoYnAsIHJlZyk7Ci0JCWlmICh2YWwgPT0gZXhwZWN0ZWQpCi0JCQlicmVhazsKLQkJbXMgLT0gd2FpdDsKLQkJbXNsZWVwKHdhaXQpOwotCi0JfSB3aGlsZSAobXMgPiAwKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLQotLyogbG9hZC91bmxvYWQgbW9kZSAqLwotI2RlZmluZSBMT0FEX05PUk1BTAkJCTAKLSNkZWZpbmUgTE9BRF9PUEVOCQkJMQotI2RlZmluZSBMT0FEX0RJQUcJCQkyCi0jZGVmaW5lIFVOTE9BRF9OT1JNQUwJCQkwCi0jZGVmaW5lIFVOTE9BRF9DTE9TRQkJCTEKLSNkZWZpbmUgVU5MT0FEX1JFQ09WRVJZICAgICAgICAgICAgICAgICAyCi0KLQotLyogRE1BRSBjb21tYW5kIGRlZmluZXMgKi8KLSNkZWZpbmUgRE1BRV9DTURfU1JDX1BDSQkJMAotI2RlZmluZSBETUFFX0NNRF9TUkNfR1JDCQlETUFFX0NPTU1BTkRfU1JDCi0KLSNkZWZpbmUgRE1BRV9DTURfRFNUX1BDSQkJKDEgPDwgRE1BRV9DT01NQU5EX0RTVF9TSElGVCkKLSNkZWZpbmUgRE1BRV9DTURfRFNUX0dSQwkJKDIgPDwgRE1BRV9DT01NQU5EX0RTVF9TSElGVCkKLQotI2RlZmluZSBETUFFX0NNRF9DX0RTVF9QQ0kJCTAKLSNkZWZpbmUgRE1BRV9DTURfQ19EU1RfR1JDCQkoMSA8PCBETUFFX0NPTU1BTkRfQ19EU1RfU0hJRlQpCi0KLSNkZWZpbmUgRE1BRV9DTURfQ19FTkFCTEUJCURNQUVfQ09NTUFORF9DX1RZUEVfRU5BQkxFCi0KLSNkZWZpbmUgRE1BRV9DTURfRU5ESUFOSVRZX05PX1NXQVAJKDAgPDwgRE1BRV9DT01NQU5EX0VORElBTklUWV9TSElGVCkKLSNkZWZpbmUgRE1BRV9DTURfRU5ESUFOSVRZX0JfU1dBUAkoMSA8PCBETUFFX0NPTU1BTkRfRU5ESUFOSVRZX1NISUZUKQotI2RlZmluZSBETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUAkoMiA8PCBETUFFX0NPTU1BTkRfRU5ESUFOSVRZX1NISUZUKQotI2RlZmluZSBETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQCSgzIDw8IERNQUVfQ09NTUFORF9FTkRJQU5JVFlfU0hJRlQpCi0KLSNkZWZpbmUgRE1BRV9DTURfUE9SVF8wCQkJMAotI2RlZmluZSBETUFFX0NNRF9QT1JUXzEJCQlETUFFX0NPTU1BTkRfUE9SVAotCi0jZGVmaW5lIERNQUVfQ01EX1NSQ19SRVNFVAkJRE1BRV9DT01NQU5EX1NSQ19SRVNFVAotI2RlZmluZSBETUFFX0NNRF9EU1RfUkVTRVQJCURNQUVfQ09NTUFORF9EU1RfUkVTRVQKLSNkZWZpbmUgRE1BRV9DTURfRTFIVk5fU0hJRlQJCURNQUVfQ09NTUFORF9FMUhWTl9TSElGVAotCi0jZGVmaW5lIERNQUVfTEVOMzJfUkRfTUFYCQkweDgwCi0jZGVmaW5lIERNQUVfTEVOMzJfV1JfTUFYKGJwKQkJKENISVBfSVNfRTEoYnApID8gMHg0MDAgOiAweDIwMDApCi0KLSNkZWZpbmUgRE1BRV9DT01QX1ZBTAkJCTB4ZTBkMGQwYWUKLQotI2RlZmluZSBNQVhfRE1BRV9DX1BFUl9QT1JUCQk4Ci0jZGVmaW5lIElOSVRfRE1BRV9DKGJwKQkJCShCUF9QT1JUKGJwKSAqIE1BWF9ETUFFX0NfUEVSX1BPUlQgKyBcCi0JCQkJCSBCUF9FMUhWTihicCkpCi0jZGVmaW5lIFBNRl9ETUFFX0MoYnApCQkJKEJQX1BPUlQoYnApICogTUFYX0RNQUVfQ19QRVJfUE9SVCArIFwKLQkJCQkJIEUxSFZOX01BWCkKLQotCi0vKiBQQ0lFIGxpbmsgYW5kIHNwZWVkICovCi0jZGVmaW5lIFBDSUNGR19MSU5LX1dJRFRICQkweDFmMDAwMDAKLSNkZWZpbmUgUENJQ0ZHX0xJTktfV0lEVEhfU0hJRlQJCTIwCi0jZGVmaW5lIFBDSUNGR19MSU5LX1NQRUVECQkweGYwMDAwCi0jZGVmaW5lIFBDSUNGR19MSU5LX1NQRUVEX1NISUZUCQkxNgotCi0KLSNkZWZpbmUgQk5YMlhfTlVNX1RFU1RTCQkJNwotCi0jZGVmaW5lIEJOWDJYX1BIWV9MT09QQkFDSwkJMAotI2RlZmluZSBCTlgyWF9NQUNfTE9PUEJBQ0sJCTEKLSNkZWZpbmUgQk5YMlhfUEhZX0xPT1BCQUNLX0ZBSUxFRAkxCi0jZGVmaW5lIEJOWDJYX01BQ19MT09QQkFDS19GQUlMRUQJMgotI2RlZmluZSBCTlgyWF9MT09QQkFDS19GQUlMRUQJCShCTlgyWF9NQUNfTE9PUEJBQ0tfRkFJTEVEIHwgXAotCQkJCQkgQk5YMlhfUEhZX0xPT1BCQUNLX0ZBSUxFRCkKLQotCi0jZGVmaW5lIFNUUk9NX0FTU0VSVF9BUlJBWV9TSVpFCQk1MAotCi0KLS8qIG11c3QgYmUgdXNlZCBvbiBhIENJRCBiZWZvcmUgcGxhY2luZyBpdCBvbiBhIEhXIHJpbmcgKi8KLSNkZWZpbmUgSFdfQ0lEKGJwLCB4KQkJCSgoQlBfUE9SVChicCkgPDwgMjMpIHwgXAotCQkJCQkgKEJQX0UxSFZOKGJwKSA8PCAxNykgfCAoeCkpCi0KLSNkZWZpbmUgU1BfREVTQ19DTlQJCShCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBldGhfc3BlKSkKLSNkZWZpbmUgTUFYX1NQX0RFU0NfQ05UCQkJKFNQX0RFU0NfQ05UIC0gMSkKLQotCi0jZGVmaW5lIEJOWDJYX0JUUgkJCTEKLSNkZWZpbmUgTUFYX1NQUV9QRU5ESU5HCQkJOAotCi0KLS8qIENNTkcgY29uc3RhbnRzCi0gICBkZXJpdmVkIGZyb20gbGFiIGV4cGVyaW1lbnRzLCBhbmQgbm90IGZyb20gc3lzdGVtIHNwZWMgY2FsY3VsYXRpb25zICEhISAqLwotI2RlZmluZSBERUZfTUlOX1JBVEUJCQkxMDAKLS8qIHJlc29sdXRpb24gb2YgdGhlIHJhdGUgc2hhcGluZyB0aW1lciAtIDEwMCB1c2VjICovCi0jZGVmaW5lIFJTX1BFUklPRElDX1RJTUVPVVRfVVNFQwkxMDAKLS8qIHJlc29sdXRpb24gb2YgZmFpcm5lc3MgYWxnb3JpdGhtIGluIHVzZWNzIC0KLSAgIGNvZWZmaWNpZW50IGZvciBjYWxjdWxhdGluZyB0aGUgYWN0dWFsIHQgZmFpciAqLwotI2RlZmluZSBUX0ZBSVJfQ09FRgkJCTEwMDAwMDAwCi0vKiBudW1iZXIgb2YgYnl0ZXMgaW4gc2luZ2xlIFFNIGFyYml0cmF0aW9uIGN5Y2xlIC0KLSAgIGNvZWZmaWNpZW50IGZvciBjYWxjdWxhdGluZyB0aGUgZmFpcm5lc3MgdGltZXIgKi8KLSNkZWZpbmUgUU1fQVJCX0JZVEVTCQkJNDAwMDAKLSNkZWZpbmUgRkFJUl9NRU0JCQkyCi0KLQotI2RlZmluZSBBVFROX05JR19GT1JfRlVOQwkJKDFMIDw8IDgpCi0jZGVmaW5lIEFUVE5fU1dfVElNRVJfNF9GVU5DCQkoMUwgPDwgOSkKLSNkZWZpbmUgR1BJT18yX0ZVTkMJCQkoMUwgPDwgMTApCi0jZGVmaW5lIEdQSU9fM19GVU5DCQkJKDFMIDw8IDExKQotI2RlZmluZSBHUElPXzRfRlVOQwkJCSgxTCA8PCAxMikKLSNkZWZpbmUgQVRUTl9HRU5FUkFMX0FUVE5fMQkJKDFMIDw8IDEzKQotI2RlZmluZSBBVFROX0dFTkVSQUxfQVRUTl8yCQkoMUwgPDwgMTQpCi0jZGVmaW5lIEFUVE5fR0VORVJBTF9BVFROXzMJCSgxTCA8PCAxNSkKLSNkZWZpbmUgQVRUTl9HRU5FUkFMX0FUVE5fNAkJKDFMIDw8IDEzKQotI2RlZmluZSBBVFROX0dFTkVSQUxfQVRUTl81CQkoMUwgPDwgMTQpCi0jZGVmaW5lIEFUVE5fR0VORVJBTF9BVFROXzYJCSgxTCA8PCAxNSkKLQotI2RlZmluZSBBVFROX0hBUkRfV0lSRURfTUFTSwkJMHhmZjAwCi0jZGVmaW5lIEFUVEVOVElPTl9JRAkJCTQKLQotCi0vKiBzdHVmZiBhZGRlZCB0byBtYWtlIHRoZSBjb2RlIGZpdCA4MENvbCAqLwotCi0jZGVmaW5lIEJOWDJYX1BNRl9MSU5LX0FTU0VSVCBcCi0JR0VORVJBTF9BVFRFTl9PRkZTRVQoTElOS19TWU5DX0FUVEVOVElPTl9CSVRfRlVOQ18wICsgQlBfRlVOQyhicCkpCi0KLSNkZWZpbmUgQk5YMlhfTUNfQVNTRVJUX0JJVFMgXAotCShHRU5FUkFMX0FUVEVOX09GRlNFVChUU1RPUk1fRkFUQUxfQVNTRVJUX0FUVEVOVElPTl9CSVQpIHwgXAotCSBHRU5FUkFMX0FUVEVOX09GRlNFVChVU1RPUk1fRkFUQUxfQVNTRVJUX0FUVEVOVElPTl9CSVQpIHwgXAotCSBHRU5FUkFMX0FUVEVOX09GRlNFVChDU1RPUk1fRkFUQUxfQVNTRVJUX0FUVEVOVElPTl9CSVQpIHwgXAotCSBHRU5FUkFMX0FUVEVOX09GRlNFVChYU1RPUk1fRkFUQUxfQVNTRVJUX0FUVEVOVElPTl9CSVQpKQotCi0jZGVmaW5lIEJOWDJYX01DUF9BU1NFUlQgXAotCUdFTkVSQUxfQVRURU5fT0ZGU0VUKE1DUF9GQVRBTF9BU1NFUlRfQVRURU5USU9OX0JJVCkKLQotI2RlZmluZSBCTlgyWF9HUkNfVElNRU9VVAlHRU5FUkFMX0FUVEVOX09GRlNFVChMQVRDSEVEX0FUVE5fVElNRU9VVF9HUkMpCi0jZGVmaW5lIEJOWDJYX0dSQ19SU1YJCShHRU5FUkFMX0FUVEVOX09GRlNFVChMQVRDSEVEX0FUVE5fUkJDUikgfCBcCi0JCQkJIEdFTkVSQUxfQVRURU5fT0ZGU0VUKExBVENIRURfQVRUTl9SQkNUKSB8IFwKLQkJCQkgR0VORVJBTF9BVFRFTl9PRkZTRVQoTEFUQ0hFRF9BVFROX1JCQ04pIHwgXAotCQkJCSBHRU5FUkFMX0FUVEVOX09GRlNFVChMQVRDSEVEX0FUVE5fUkJDVSkgfCBcCi0JCQkJIEdFTkVSQUxfQVRURU5fT0ZGU0VUKExBVENIRURfQVRUTl9SQkNQKSB8IFwKLQkJCQkgR0VORVJBTF9BVFRFTl9PRkZTRVQoTEFUQ0hFRF9BVFROX1JTVkRfR1JDKSkKLQotI2RlZmluZSBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzAgXAotCQkJCShBRVVfSU5QVVRTX0FUVE5fQklUU19UU0RNX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVENNX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfSFdfSU5URVJSVVBUIHwgXAotCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkZfSFdfSU5URVJSVVBUKQotI2RlZmluZSBIV19QUlRZX0FTU0VSVF9TRVRfMAkoQUVVX0lOUFVUU19BVFROX0JJVFNfQlJCX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfUEFSU0VSX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNETV9QQVJJVFlfRVJST1IgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1NFQVJDSEVSX1BBUklUWV9FUlJPUiB8XAotCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19UU0VNSV9QQVJJVFlfRVJST1IpCi0jZGVmaW5lIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMSBcCi0JCQkJKEFFVV9JTlBVVFNfQVRUTl9CSVRTX1FNX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVElNRVJTX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNETV9IV19JTlRFUlJVUFQgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hDTV9IV19JTlRFUlJVUFQgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRU1JX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNETV9IV19JTlRFUlJVUFQgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VDTV9IV19JTlRFUlJVUFQgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRU1JX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVVBCX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NETV9IV19JTlRFUlJVUFQgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NDTV9IV19JTlRFUlJVUFQpCi0jZGVmaW5lIEhXX1BSVFlfQVNTRVJUX1NFVF8xCShBRVVfSU5QVVRTX0FUVE5fQklUU19QQkNMSUVOVF9QQVJJVFlfRVJST1IgfFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfUU1fUEFSSVRZX0VSUk9SIHwgXAotCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0RNX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNFTUlfUEFSSVRZX0VSUk9SIHwgXAotCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19ET09SQkVMTFFfUEFSSVRZX0VSUk9SIHxcCi0JCQkgICAgIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1ZBVVhfUENJX0NPUkVfUEFSSVRZX0VSUk9SIHxcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RFQlVHX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNETV9QQVJJVFlfRVJST1IgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRU1JX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVVBCX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NETV9QQVJJVFlfRVJST1IpCi0jZGVmaW5lIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMiBcCi0JCQkJKEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRU1JX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0RVX0hXX0lOVEVSUlVQVCB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfRE1BRV9IV19JTlRFUlJVUFQgfCBcCi0JCQlBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9IV19JTlRFUlJVUFQgfFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfTUlTQ19IV19JTlRFUlJVUFQpCi0jZGVmaW5lIEhXX1BSVFlfQVNTRVJUX1NFVF8yCShBRVVfSU5QVVRTX0FUVE5fQklUU19DU0VNSV9QQVJJVFlfRVJST1IgfCBcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BYUF9QQVJJVFlfRVJST1IgfCBcCi0JCQlBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9QQVJJVFlfRVJST1IgfFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0ZDX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0RVX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfSUdVX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfTUlTQ19QQVJJVFlfRVJST1IpCi0KLSNkZWZpbmUgSFdfUFJUWV9BU1NFUlRfU0VUXzMgKEFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1JPTV9QQVJJVFkgfCBcCi0JCUFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1VNUF9SWF9QQVJJVFkgfCBcCi0JCUFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1VNUF9UWF9QQVJJVFkgfCBcCi0JCUFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1NDUEFEX1BBUklUWSkKLQotI2RlZmluZSBSU1NfRkxBR1MoYnApIFwKLQkJKFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9DQVBBQklMSVRZIHwgXAotCQkgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X1RDUF9DQVBBQklMSVRZIHwgXAotCQkgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X0NBUEFCSUxJVFkgfCBcCi0JCSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjZfVENQX0NBUEFCSUxJVFkgfCBcCi0JCSAoYnAtPm11bHRpX21vZGUgPDwgXAotCQkgIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfTU9ERV9TSElGVCkpCi0jZGVmaW5lIE1VTFRJX01BU0sJCQkweDdmCi0KLQotI2RlZmluZSBERUZfVVNCX0ZVTkNfT0ZGCQkoMiArIDIqSENfVVNUT1JNX0RFRl9TQl9OVU1fSU5ESUNFUykKLSNkZWZpbmUgREVGX0NTQl9GVU5DX09GRgkJKDIgKyAyKkhDX0NTVE9STV9ERUZfU0JfTlVNX0lORElDRVMpCi0jZGVmaW5lIERFRl9YU0JfRlVOQ19PRkYJCSgyICsgMipIQ19YU1RPUk1fREVGX1NCX05VTV9JTkRJQ0VTKQotI2RlZmluZSBERUZfVFNCX0ZVTkNfT0ZGCQkoMiArIDIqSENfVFNUT1JNX0RFRl9TQl9OVU1fSU5ESUNFUykKLQotI2RlZmluZSBDX0RFRl9TQl9TUF9JTkRFWAkJSENfSU5ERVhfREVGX0NfRVRIX1NMT1dfUEFUSAotCi0jZGVmaW5lIEJOWDJYX1NQX0RTQl9JTkRFWCBcCi0oJmJwLT5kZWZfc3RhdHVzX2Jsay0+Y19kZWZfc3RhdHVzX2Jsb2NrLmluZGV4X3ZhbHVlc1tDX0RFRl9TQl9TUF9JTkRFWF0pCi0KLQotI2RlZmluZSBDQU1fSVNfSU5WQUxJRCh4KSBcCi0oeC50YXJnZXRfdGFibGVfZW50cnkuZmxhZ3MgPT0gVFNUT1JNX0NBTV9UQVJHRVRfVEFCTEVfRU5UUllfQUNUSU9OX1RZUEUpCi0KLSNkZWZpbmUgQ0FNX0lOVkFMSURBVEUoeCkgXAotCSh4LnRhcmdldF90YWJsZV9lbnRyeS5mbGFncyA9IFRTVE9STV9DQU1fVEFSR0VUX1RBQkxFX0VOVFJZX0FDVElPTl9UWVBFKQotCi0KLS8qIE51bWJlciBvZiB1MzIgZWxlbWVudHMgaW4gTUMgaGFzaCBhcnJheSAqLwotI2RlZmluZSBNQ19IQVNIX1NJWkUJCQk4Ci0jZGVmaW5lIE1DX0hBU0hfT0ZGU0VUKGJwLCBpKQkJKEJBUl9UU1RST1JNX0lOVE1FTSArIFwKLQlUU1RPUk1fQVBQUk9YSU1BVEVfTUFUQ0hfTVVMVElDQVNUX0ZJTFRFUklOR19PRkZTRVQoQlBfRlVOQyhicCkpICsgaSo0KQotCi0KLSNpZm5kZWYgUFhQMl9SRUdfUFhQMl9JTlRfU1RTCi0jZGVmaW5lIFBYUDJfUkVHX1BYUDJfSU5UX1NUUwkJUFhQMl9SRUdfUFhQMl9JTlRfU1RTXzAKLSNlbmRpZgotCi0jZGVmaW5lIEJOWDJYX1ZQRF9MRU4JCQkxMjgKLSNkZWZpbmUgVkVORE9SX0lEX0xFTgkJCTQKLQotLyogTUlTQ19SRUdfUkVTRVRfUkVHIC0gdGhpcyBpcyBoZXJlIGZvciB0aGUgaHNpIHRvIHdvcmsgZG9uJ3QgdG91Y2ggKi8KLQotI2VuZGlmIC8qIGJueDJ4LmggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYm54MngvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0YWZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgQnJvYWRjb20gMTAtR2lnYWJpdCBldGhlcm5ldCBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0JOWDJYKSArPSBibngyeC5vCisKK2JueDJ4LW9ianMgOj0gYm54MnhfbWFpbi5vIGJueDJ4X2xpbmsubyBibngyeF9jbW4ubyBibngyeF9ldGh0b29sLm8gYm54Mnhfc3RhdHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnguaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZjljOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4LmgKQEAgLTAsMCArMSwxMTk3IEBACisvKiBibngyeC5oOiBCcm9hZGNvbSBFdmVyZXN0IG5ldHdvcmsgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1haW50YWluZWQgYnk6IEVpbG9uIEdyZWVuc3RlaW4gPGVpbG9uZ0Bicm9hZGNvbS5jb20+CisgKiBXcml0dGVuIGJ5OiBFbGllemVyIFRhbWlyCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gTWljaGFlbCBDaGFuJ3MgYm54MiBkcml2ZXIKKyAqLworCisjaWZuZGVmIEJOWDJYX0gKKyNkZWZpbmUgQk5YMlhfSAorCisvKiBjb21waWxhdGlvbiB0aW1lIGZsYWdzICovCisKKy8qIGRlZmluZSB0aGlzIHRvIG1ha2UgdGhlIGRyaXZlciBmcmVlemUgb24gZXJyb3IgdG8gYWxsb3cgZ2V0dGluZyBkZWJ1ZyBpbmZvCisgKiAoeW91IHdpbGwgbmVlZCB0byByZWJvb3QgYWZ0ZXJ3YXJkcykgKi8KKy8qICNkZWZpbmUgQk5YMlhfU1RPUF9PTl9FUlJPUiAqLworCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiAgICAgICIxLjUyLjUzLTMiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURSAgICAgICIyMDEwLzE4LzA0IgorI2RlZmluZSBCTlgyWF9CQ19WRVIgICAgICAgICAgICAweDA0MDIwMAorCisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjZGVmaW5lIEJDTV9WTEFOCQkJMQorI2VuZGlmCisKKyNkZWZpbmUgQk5YMlhfTVVMVElfUVVFVUUKKworI2RlZmluZSBCTlgyWF9ORVdfTkFQSQorCisKKworI2lmIGRlZmluZWQoQ09ORklHX0NOSUMpIHx8IGRlZmluZWQoQ09ORklHX0NOSUNfTU9EVUxFKQorI2RlZmluZSBCQ01fQ05JQyAxCisjaW5jbHVkZSAiLi4vY25pY19pZi5oIgorI2VuZGlmCisKKworI2lmZGVmIEJDTV9DTklDCisjZGVmaW5lIEJOWDJYX01JTl9NU0lYX1ZFQ19DTlQgMworI2RlZmluZSBCTlgyWF9NU0lYX1ZFQ19GUF9TVEFSVCAyCisjZWxzZQorI2RlZmluZSBCTlgyWF9NSU5fTVNJWF9WRUNfQ05UIDIKKyNkZWZpbmUgQk5YMlhfTVNJWF9WRUNfRlBfU1RBUlQgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAiYm54MnhfcmVnLmgiCisjaW5jbHVkZSAiYm54MnhfZndfZGVmcy5oIgorI2luY2x1ZGUgImJueDJ4X2hzaS5oIgorI2luY2x1ZGUgImJueDJ4X2xpbmsuaCIKKyNpbmNsdWRlICJibngyeF9zdGF0cy5oIgorCisvKiBlcnJvci9kZWJ1ZyBwcmludHMgKi8KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyeCIKKworLyogZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIGN1cnJlbnRseSBvZmYgKi8KKyNkZWZpbmUgQk5YMlhfTVNHX09GRgkJCTAKKyNkZWZpbmUgQk5YMlhfTVNHX01DUAkJCTB4MDEwMDAwIC8qIHdhczogTkVUSUZfTVNHX0hXICovCisjZGVmaW5lIEJOWDJYX01TR19TVEFUUwkJCTB4MDIwMDAwIC8qIHdhczogTkVUSUZfTVNHX1RJTUVSICovCisjZGVmaW5lIEJOWDJYX01TR19OVk0JCQkweDA0MDAwMCAvKiB3YXM6IE5FVElGX01TR19IVyAqLworI2RlZmluZSBCTlgyWF9NU0dfRE1BRQkJCTB4MDgwMDAwIC8qIHdhczogTkVUSUZfTVNHX0hXICovCisjZGVmaW5lIEJOWDJYX01TR19TUAkJCTB4MTAwMDAwIC8qIHdhczogTkVUSUZfTVNHX0lOVFIgKi8KKyNkZWZpbmUgQk5YMlhfTVNHX0ZQCQkJMHgyMDAwMDAgLyogd2FzOiBORVRJRl9NU0dfSU5UUiAqLworCisjZGVmaW5lIERQX0xFVkVMCQkJS0VSTl9OT1RJQ0UJLyogd2FzOiBLRVJOX0RFQlVHICovCisKKy8qIHJlZ3VsYXIgZGVidWcgcHJpbnQgKi8KKyNkZWZpbmUgRFAoX19tYXNrLCBfX2ZtdCwgX19hcmdzLi4uKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKGJwLT5tc2dfZW5hYmxlICYgKF9fbWFzaykpCQkJCVwKKwkJcHJpbnRrKERQX0xFVkVMICJbJXM6JWQoJXMpXSIgX19mbXQsCQlcCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sCQkJXAorCQkgICAgICAgYnAtPmRldiA/IChicC0+ZGV2LT5uYW1lKSA6ICI/IiwJCVwKKwkJICAgICAgICMjX19hcmdzKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyogZXJyb3JzIGRlYnVnIHByaW50ICovCisjZGVmaW5lIEJOWDJYX0RCR19FUlIoX19mbXQsIF9fYXJncy4uLikJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmIChuZXRpZl9tc2dfcHJvYmUoYnApKQkJCQlcCisJCXByX2VycigiWyVzOiVkKCVzKV0iIF9fZm10LAkJCVwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywJCQlcCisJCSAgICAgICBicC0+ZGV2ID8gKGJwLT5kZXYtPm5hbWUpIDogIj8iLAkJXAorCQkgICAgICAgIyNfX2FyZ3MpOwkJCQlcCit9IHdoaWxlICgwKQorCisvKiBmb3IgZXJyb3JzIChuZXZlciBtYXNrZWQpICovCisjZGVmaW5lIEJOWDJYX0VSUihfX2ZtdCwgX19hcmdzLi4uKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJcHJfZXJyKCJbJXM6JWQoJXMpXSIgX19mbXQsCQkJCVwKKwkgICAgICAgX19mdW5jX18sIF9fTElORV9fLAkJCQlcCisJICAgICAgIGJwLT5kZXYgPyAoYnAtPmRldi0+bmFtZSkgOiAiPyIsCQkJXAorCSAgICAgICAjI19fYXJncyk7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBCTlgyWF9FUlJPUihfX2ZtdCwgX19hcmdzLi4uKSBkbyB7IFwKKwlwcl9lcnIoIlslczolZF0iIF9fZm10LCBfX2Z1bmNfXywgX19MSU5FX18sICMjX19hcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKworLyogYmVmb3JlIHdlIGhhdmUgYSBkZXYtPm5hbWUgdXNlIGRldl9pbmZvKCkgKi8KKyNkZWZpbmUgQk5YMlhfREVWX0lORk8oX19mbXQsIF9fYXJncy4uLikJCQkgXAorZG8gewkJCQkJCQkJIFwKKwlpZiAobmV0aWZfbXNnX3Byb2JlKGJwKSkJCQkJIFwKKwkJZGV2X2luZm8oJmJwLT5wZGV2LT5kZXYsIF9fZm10LCAjI19fYXJncyk7CSBcCit9IHdoaWxlICgwKQorCit2b2lkIGJueDJ4X3BhbmljX2R1bXAoc3RydWN0IGJueDJ4ICpicCk7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisjZGVmaW5lIGJueDJ4X3BhbmljKCkgZG8geyBcCisJCWJwLT5wYW5pYyA9IDE7IFwKKwkJQk5YMlhfRVJSKCJkcml2ZXIgYXNzZXJ0XG4iKTsgXAorCQlibngyeF9pbnRfZGlzYWJsZShicCk7IFwKKwkJYm54MnhfcGFuaWNfZHVtcChicCk7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgYm54MnhfcGFuaWMoKSBkbyB7IFwKKwkJYnAtPnBhbmljID0gMTsgXAorCQlCTlgyWF9FUlIoImRyaXZlciBhc3NlcnRcbiIpOyBcCisJCWJueDJ4X3BhbmljX2R1bXAoYnApOyBcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKyNkZWZpbmUgVTY0X0xPKHgpCQkJKHUzMikoKCh1NjQpKHgpKSAmIDB4ZmZmZmZmZmYpCisjZGVmaW5lIFU2NF9ISSh4KQkJCSh1MzIpKCgodTY0KSh4KSkgPj4gMzIpCisjZGVmaW5lIEhJTE9fVTY0KGhpLCBsbykJCSgoKCh1NjQpKGhpKSkgPDwgMzIpICsgKGxvKSkKKworCisjZGVmaW5lIFJFR19BRERSKGJwLCBvZmZzZXQpCQkoYnAtPnJlZ3ZpZXcgKyBvZmZzZXQpCisKKyNkZWZpbmUgUkVHX1JEKGJwLCBvZmZzZXQpCQlyZWFkbChSRUdfQUREUihicCwgb2Zmc2V0KSkKKyNkZWZpbmUgUkVHX1JEOChicCwgb2Zmc2V0KQkJcmVhZGIoUkVHX0FERFIoYnAsIG9mZnNldCkpCisKKyNkZWZpbmUgUkVHX1dSKGJwLCBvZmZzZXQsIHZhbCkJCXdyaXRlbCgodTMyKXZhbCwgUkVHX0FERFIoYnAsIG9mZnNldCkpCisjZGVmaW5lIFJFR19XUjgoYnAsIG9mZnNldCwgdmFsKQl3cml0ZWIoKHU4KXZhbCwgUkVHX0FERFIoYnAsIG9mZnNldCkpCisjZGVmaW5lIFJFR19XUjE2KGJwLCBvZmZzZXQsIHZhbCkJd3JpdGV3KCh1MTYpdmFsLCBSRUdfQUREUihicCwgb2Zmc2V0KSkKKworI2RlZmluZSBSRUdfUkRfSU5EKGJwLCBvZmZzZXQpCQlibngyeF9yZWdfcmRfaW5kKGJwLCBvZmZzZXQpCisjZGVmaW5lIFJFR19XUl9JTkQoYnAsIG9mZnNldCwgdmFsKQlibngyeF9yZWdfd3JfaW5kKGJwLCBvZmZzZXQsIHZhbCkKKworI2RlZmluZSBSRUdfUkRfRE1BRShicCwgb2Zmc2V0LCB2YWxwLCBsZW4zMikgXAorCWRvIHsgXAorCQlibngyeF9yZWFkX2RtYWUoYnAsIG9mZnNldCwgbGVuMzIpO1wKKwkJbWVtY3B5KHZhbHAsIGJueDJ4X3NwKGJwLCB3Yl9kYXRhWzBdKSwgKGxlbjMyKSAqIDQpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBSRUdfV1JfRE1BRShicCwgb2Zmc2V0LCB2YWxwLCBsZW4zMikgXAorCWRvIHsgXAorCQltZW1jcHkoYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pLCB2YWxwLCAobGVuMzIpICogNCk7IFwKKwkJYm54Mnhfd3JpdGVfZG1hZShicCwgYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfZGF0YSksIFwKKwkJCQkgb2Zmc2V0LCBsZW4zMik7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFZJUlRfV1JfRE1BRV9MRU4oYnAsIGRhdGEsIGFkZHIsIGxlbjMyLCBsZTMyX3N3YXApIFwKKwlkbyB7IFwKKwkJbWVtY3B5KEdVTlpJUF9CVUYoYnApLCBkYXRhLCAobGVuMzIpICogNCk7IFwKKwkJYm54Mnhfd3JpdGVfYmlnX2J1Zl93YihicCwgYWRkciwgbGVuMzIpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSE1FTV9BRERSKGJwLCBmaWVsZCkJCShicC0+Y29tbW9uLnNobWVtX2Jhc2UgKyBcCisJCQkJCSBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBmaWVsZCkpCisjZGVmaW5lIFNITUVNX1JEKGJwLCBmaWVsZCkJCVJFR19SRChicCwgU0hNRU1fQUREUihicCwgZmllbGQpKQorI2RlZmluZSBTSE1FTV9XUihicCwgZmllbGQsIHZhbCkJUkVHX1dSKGJwLCBTSE1FTV9BRERSKGJwLCBmaWVsZCksIHZhbCkKKworI2RlZmluZSBTSE1FTTJfQUREUihicCwgZmllbGQpCQkoYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSArIFwKKwkJCQkJIG9mZnNldG9mKHN0cnVjdCBzaG1lbTJfcmVnaW9uLCBmaWVsZCkpCisjZGVmaW5lIFNITUVNMl9SRChicCwgZmllbGQpCQlSRUdfUkQoYnAsIFNITUVNMl9BRERSKGJwLCBmaWVsZCkpCisjZGVmaW5lIFNITUVNMl9XUihicCwgZmllbGQsIHZhbCkJUkVHX1dSKGJwLCBTSE1FTTJfQUREUihicCwgZmllbGQpLCB2YWwpCisKKyNkZWZpbmUgTUZfQ0ZHX1JEKGJwLCBmaWVsZCkJCVNITUVNX1JEKGJwLCBtZl9jZmcuZmllbGQpCisjZGVmaW5lIE1GX0NGR19XUihicCwgZmllbGQsIHZhbCkJU0hNRU1fV1IoYnAsIG1mX2NmZy5maWVsZCwgdmFsKQorCisjZGVmaW5lIEVNQUNfUkQoYnAsIHJlZykJCVJFR19SRChicCwgZW1hY19iYXNlICsgcmVnKQorI2RlZmluZSBFTUFDX1dSKGJwLCByZWcsIHZhbCkJCVJFR19XUihicCwgZW1hY19iYXNlICsgcmVnLCB2YWwpCisKKyNkZWZpbmUgQUVVX0lOX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9QQVJJVFlfRVJST1IgXAorCUFFVV9JTlBVVFNfQVRUTl9CSVRTX1BYUFBDSUNMT0NLQ0xJRU5UX1BBUklUWV9FUlJPUgorCisKKy8qIGZhc3QgcGF0aCAqLworCitzdHJ1Y3Qgc3dfcnhfYmQgeworCXN0cnVjdCBza19idWZmCSpza2I7CisJREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOworfTsKKworc3RydWN0IHN3X3R4X2JkIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCXUxNgkJZmlyc3RfYmQ7CisJdTgJCWZsYWdzOworLyogU2V0IG9uIHRoZSBmaXJzdCBCRCBkZXNjcmlwdG9yIHdoZW4gdGhlcmUgaXMgYSBzcGxpdCBCRCAqLworI2RlZmluZSBCTlgyWF9UU09fU1BMSVRfQkQJCSgxPDwwKQorfTsKKworc3RydWN0IHN3X3J4X3BhZ2UgeworCXN0cnVjdCBwYWdlCSpwYWdlOworCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsKK307CisKK3VuaW9uIGRiX3Byb2QgeworCXN0cnVjdCBkb29yYmVsbF9zZXRfcHJvZCBkYXRhOworCXUzMgkJcmF3OworfTsKKworCisvKiBNQyBoc2kgKi8KKyNkZWZpbmUgQkNNX1BBR0VfU0hJRlQJCQkxMgorI2RlZmluZSBCQ01fUEFHRV9TSVpFCQkJKDEgPDwgQkNNX1BBR0VfU0hJRlQpCisjZGVmaW5lIEJDTV9QQUdFX01BU0sJCQkofihCQ01fUEFHRV9TSVpFIC0gMSkpCisjZGVmaW5lIEJDTV9QQUdFX0FMSUdOKGFkZHIpCSgoKGFkZHIpICsgQkNNX1BBR0VfU0laRSAtIDEpICYgQkNNX1BBR0VfTUFTSykKKworI2RlZmluZSBQQUdFU19QRVJfU0dFX1NISUZUCQkwCisjZGVmaW5lIFBBR0VTX1BFUl9TR0UJCQkoMSA8PCBQQUdFU19QRVJfU0dFX1NISUZUKQorI2RlZmluZSBTR0VfUEFHRV9TSVpFCQkJUEFHRV9TSVpFCisjZGVmaW5lIFNHRV9QQUdFX1NISUZUCQkJUEFHRV9TSElGVAorI2RlZmluZSBTR0VfUEFHRV9BTElHTihhZGRyKQkJUEFHRV9BTElHTigodHlwZW9mKFBBR0VfU0laRSkpKGFkZHIpKQorCisvKiBTR0UgcmluZyByZWxhdGVkIG1hY3JvcyAqLworI2RlZmluZSBOVU1fUlhfU0dFX1BBR0VTCQkyCisjZGVmaW5lIFJYX1NHRV9DTlQJCShCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBldGhfcnhfc2dlKSkKKyNkZWZpbmUgTUFYX1JYX1NHRV9DTlQJCQkoUlhfU0dFX0NOVCAtIDIpCisvKiBSWF9TR0VfQ05UIGlzIHByb21pc2VkIHRvIGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBSWF9TR0VfTUFTSwkJCShSWF9TR0VfQ05UIC0gMSkKKyNkZWZpbmUgTlVNX1JYX1NHRQkJCShSWF9TR0VfQ05UICogTlVNX1JYX1NHRV9QQUdFUykKKyNkZWZpbmUgTUFYX1JYX1NHRQkJCShOVU1fUlhfU0dFIC0gMSkKKyNkZWZpbmUgTkVYVF9TR0VfSURYKHgpCQkoKCgoeCkgJiBSWF9TR0VfTUFTSykgPT0gXAorCQkJCSAgKE1BWF9SWF9TR0VfQ05UIC0gMSkpID8gKHgpICsgMyA6ICh4KSArIDEpCisjZGVmaW5lIFJYX1NHRSh4KQkJCSgoeCkgJiBNQVhfUlhfU0dFKQorCisvKiBTR0UgcHJvZHVjZXIgbWFzayByZWxhdGVkIG1hY3JvcyAqLworLyogTnVtYmVyIG9mIGJpdHMgaW4gb25lIHNnZV9tYXNrIGFycmF5IGVsZW1lbnQgKi8KKyNkZWZpbmUgUlhfU0dFX01BU0tfRUxFTV9TWgkJNjQKKyNkZWZpbmUgUlhfU0dFX01BU0tfRUxFTV9TSElGVAkJNgorI2RlZmluZSBSWF9TR0VfTUFTS19FTEVNX01BU0sJCSgodTY0KVJYX1NHRV9NQVNLX0VMRU1fU1ogLSAxKQorCisvKiBDcmVhdGVzIGEgYml0bWFzayBvZiBhbGwgb25lcyBpbiBsZXNzIHNpZ25pZmljYW50IGJpdHMuCisgICBpZHggLSBpbmRleCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIGNyZWF0ZWQgbWFzayAqLworI2RlZmluZSBSWF9TR0VfT05FU19NQVNLKGlkeCkgXAorCQkoKCh1NjQpMHgxIDw8ICgoKGlkeCkgJiBSWF9TR0VfTUFTS19FTEVNX01BU0spICsgMSkpIC0gMSkKKyNkZWZpbmUgUlhfU0dFX01BU0tfRUxFTV9PTkVfTUFTSwkoKHU2NCkofjApKQorCisvKiBOdW1iZXIgb2YgdTY0IGVsZW1lbnRzIGluIFNHRSBtYXNrIGFycmF5ICovCisjZGVmaW5lIFJYX1NHRV9NQVNLX0xFTgkJCSgoTlVNX1JYX1NHRV9QQUdFUyAqIFJYX1NHRV9DTlQpIC8gXAorCQkJCQkgUlhfU0dFX01BU0tfRUxFTV9TWikKKyNkZWZpbmUgUlhfU0dFX01BU0tfTEVOX01BU0sJCShSWF9TR0VfTUFTS19MRU4gLSAxKQorI2RlZmluZSBORVhUX1NHRV9NQVNLX0VMRU0oZWwpCQkoKChlbCkgKyAxKSAmIFJYX1NHRV9NQVNLX0xFTl9NQVNLKQorCisKK3N0cnVjdCBibngyeF9mYXN0cGF0aCB7CisKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKKwlzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2sgKnN0YXR1c19ibGs7CisJZG1hX2FkZHJfdAkJc3RhdHVzX2Jsa19tYXBwaW5nOworCisJc3RydWN0IHN3X3R4X2JkCQkqdHhfYnVmX3Jpbmc7CisKKwl1bmlvbiBldGhfdHhfYmRfdHlwZXMJKnR4X2Rlc2NfcmluZzsKKwlkbWFfYWRkcl90CQl0eF9kZXNjX21hcHBpbmc7CisKKwlzdHJ1Y3Qgc3dfcnhfYmQJCSpyeF9idWZfcmluZzsJLyogQkRzIG1hcHBpbmdzIHJpbmcgKi8KKwlzdHJ1Y3Qgc3dfcnhfcGFnZQkqcnhfcGFnZV9yaW5nOwkvKiBTR0UgcGFnZXMgbWFwcGluZ3MgcmluZyAqLworCisJc3RydWN0IGV0aF9yeF9iZAkqcnhfZGVzY19yaW5nOworCWRtYV9hZGRyX3QJCXJ4X2Rlc2NfbWFwcGluZzsKKworCXVuaW9uIGV0aF9yeF9jcWUJKnJ4X2NvbXBfcmluZzsKKwlkbWFfYWRkcl90CQlyeF9jb21wX21hcHBpbmc7CisKKwkvKiBTR0UgcmluZyAqLworCXN0cnVjdCBldGhfcnhfc2dlCSpyeF9zZ2VfcmluZzsKKwlkbWFfYWRkcl90CQlyeF9zZ2VfbWFwcGluZzsKKworCXU2NAkJCXNnZV9tYXNrW1JYX1NHRV9NQVNLX0xFTl07CisKKwlpbnQJCQlzdGF0ZTsKKyNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfQ0xPU0VECQkwCisjZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX0lSUQkJMHg4MDAwMAorI2RlZmluZSBCTlgyWF9GUF9TVEFURV9PUEVOSU5HCQkweDkwMDAwCisjZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX09QRU4JCTB4YTAwMDAKKyNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfSEFMVElORwkJMHhiMDAwMAorI2RlZmluZSBCTlgyWF9GUF9TVEFURV9IQUxURUQJCTB4YzAwMDAKKworCXU4CQkJaW5kZXg7CS8qIG51bWJlciBpbiBmcCBhcnJheSAqLworCXU4CQkJY2xfaWQ7CS8qIGV0aCBjbGllbnQgaWQgKi8KKwl1OAkJCXNiX2lkOwkvKiBzdGF0dXMgYmxvY2sgbnVtYmVyIGluIEhXICovCisKKwl1bmlvbiBkYl9wcm9kCQl0eF9kYjsKKworCXUxNgkJCXR4X3BrdF9wcm9kOworCXUxNgkJCXR4X3BrdF9jb25zOworCXUxNgkJCXR4X2JkX3Byb2Q7CisJdTE2CQkJdHhfYmRfY29uczsKKwlfX2xlMTYJCQkqdHhfY29uc19zYjsKKworCV9fbGUxNgkJCWZwX2NfaWR4OworCV9fbGUxNgkJCWZwX3VfaWR4OworCisJdTE2CQkJcnhfYmRfcHJvZDsKKwl1MTYJCQlyeF9iZF9jb25zOworCXUxNgkJCXJ4X2NvbXBfcHJvZDsKKwl1MTYJCQlyeF9jb21wX2NvbnM7CisJdTE2CQkJcnhfc2dlX3Byb2Q7CisJLyogVGhlIGxhc3QgbWF4aW1hbCBjb21wbGV0ZWQgU0dFICovCisJdTE2CQkJbGFzdF9tYXhfc2dlOworCV9fbGUxNgkJCSpyeF9jb25zX3NiOworCV9fbGUxNgkJCSpyeF9iZF9jb25zX3NiOworCisKKwl1bnNpZ25lZCBsb25nCQl0eF9wa3QsCisJCQkJcnhfcGt0LAorCQkJCXJ4X2NhbGxzOworCisJLyogVFBBIHJlbGF0ZWQgKi8KKwlzdHJ1Y3Qgc3dfcnhfYmQJCXRwYV9wb29sW0VUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxSF07CisJdTgJCQl0cGFfc3RhdGVbRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIXTsKKyNkZWZpbmUgQk5YMlhfVFBBX1NUQVJUCQkJMQorI2RlZmluZSBCTlgyWF9UUEFfU1RPUAkJCTIKKwl1OAkJCWRpc2FibGVfdHBhOworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwl1NjQJCQl0cGFfcXVldWVfdXNlZDsKKyNlbmRpZgorCisJc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzIG9sZF90Y2xpZW50OworCXN0cnVjdCB1c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyBvbGRfdWNsaWVudDsKKwlzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgb2xkX3hjbGllbnQ7CisJc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzIGV0aF9xX3N0YXRzOworCisJLyogVGhlIHNpemUgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nOgorCSAgICAgc2l6ZW9mIG5hbWUgZmllbGQgZnJvbSBuZXRkZXYgc3RydWN0dXJlICsKKwkgICAgIDQgKCctWHgtJyBzdHJpbmcpICsKKwkgICAgIDQgKGZvciB0aGUgZGlnaXRzIGFuZCB0byBtYWtlIGl0IERXT1JEIGFsaWduZWQpICovCisjZGVmaW5lIEZQX05BTUVfU0laRQkJKHNpemVvZigoKHN0cnVjdCBuZXRfZGV2aWNlICopMCktPm5hbWUpICsgOCkKKwljaGFyCQkJbmFtZVtGUF9OQU1FX1NJWkVdOworCXN0cnVjdCBibngyeAkJKmJwOyAvKiBwYXJlbnQgKi8KK307CisKKyNkZWZpbmUgYm54MnhfZnAoYnAsIG5yLCB2YXIpCQkoYnAtPmZwW25yXS52YXIpCisKKworLyogTUMgaHNpICovCisjZGVmaW5lIE1BWF9GRVRDSF9CRAkJCTEzCS8qIEhXIG1heCBCRHMgcGVyIHBhY2tldCAqLworI2RlZmluZSBSWF9DT1BZX1RIUkVTSAkJCTkyCisKKyNkZWZpbmUgTlVNX1RYX1JJTkdTCQkJMTYKKyNkZWZpbmUgVFhfREVTQ19DTlQJCShCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHVuaW9uIGV0aF90eF9iZF90eXBlcykpCisjZGVmaW5lIE1BWF9UWF9ERVNDX0NOVAkJCShUWF9ERVNDX0NOVCAtIDEpCisjZGVmaW5lIE5VTV9UWF9CRAkJCShUWF9ERVNDX0NOVCAqIE5VTV9UWF9SSU5HUykKKyNkZWZpbmUgTUFYX1RYX0JECQkJKE5VTV9UWF9CRCAtIDEpCisjZGVmaW5lIE1BWF9UWF9BVkFJTAkJCShNQVhfVFhfREVTQ19DTlQgKiBOVU1fVFhfUklOR1MgLSAyKQorI2RlZmluZSBORVhUX1RYX0lEWCh4KQkJKCgoKHgpICYgTUFYX1RYX0RFU0NfQ05UKSA9PSBcCisJCQkJICAoTUFYX1RYX0RFU0NfQ05UIC0gMSkpID8gKHgpICsgMiA6ICh4KSArIDEpCisjZGVmaW5lIFRYX0JEKHgpCQkJKCh4KSAmIE1BWF9UWF9CRCkKKyNkZWZpbmUgVFhfQkRfUE9GRih4KQkJCSgoeCkgJiBNQVhfVFhfREVTQ19DTlQpCisKKy8qIFRoZSBSWCBCRCByaW5nIGlzIHNwZWNpYWwsIGVhY2ggYmQgaXMgOCBieXRlcyBidXQgdGhlIGxhc3Qgb25lIGlzIDE2ICovCisjZGVmaW5lIE5VTV9SWF9SSU5HUwkJCTgKKyNkZWZpbmUgUlhfREVTQ19DTlQJCShCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBldGhfcnhfYmQpKQorI2RlZmluZSBNQVhfUlhfREVTQ19DTlQJCQkoUlhfREVTQ19DTlQgLSAyKQorI2RlZmluZSBSWF9ERVNDX01BU0sJCQkoUlhfREVTQ19DTlQgLSAxKQorI2RlZmluZSBOVU1fUlhfQkQJCQkoUlhfREVTQ19DTlQgKiBOVU1fUlhfUklOR1MpCisjZGVmaW5lIE1BWF9SWF9CRAkJCShOVU1fUlhfQkQgLSAxKQorI2RlZmluZSBNQVhfUlhfQVZBSUwJCQkoTUFYX1JYX0RFU0NfQ05UICogTlVNX1JYX1JJTkdTIC0gMikKKyNkZWZpbmUgTkVYVF9SWF9JRFgoeCkJCSgoKCh4KSAmIFJYX0RFU0NfTUFTSykgPT0gXAorCQkJCSAgKE1BWF9SWF9ERVNDX0NOVCAtIDEpKSA/ICh4KSArIDMgOiAoeCkgKyAxKQorI2RlZmluZSBSWF9CRCh4KQkJCSgoeCkgJiBNQVhfUlhfQkQpCisKKy8qIEFzIGxvbmcgYXMgQ1FFIGlzIDQgdGltZXMgYmlnZ2VyIHRoYW4gQkQgZW50cnkgd2UgaGF2ZSB0byBhbGxvY2F0ZQorICAgNCB0aW1lcyBtb3JlIHBhZ2VzIGZvciBDUSByaW5nIGluIG9yZGVyIHRvIGtlZXAgaXQgYmFsYW5jZWQgd2l0aAorICAgQkQgcmluZyAqLworI2RlZmluZSBOVU1fUkNRX1JJTkdTCQkJKE5VTV9SWF9SSU5HUyAqIDQpCisjZGVmaW5lIFJDUV9ERVNDX0NOVAkJKEJDTV9QQUdFX1NJWkUgLyBzaXplb2YodW5pb24gZXRoX3J4X2NxZSkpCisjZGVmaW5lIE1BWF9SQ1FfREVTQ19DTlQJCShSQ1FfREVTQ19DTlQgLSAxKQorI2RlZmluZSBOVU1fUkNRX0JECQkJKFJDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MpCisjZGVmaW5lIE1BWF9SQ1FfQkQJCQkoTlVNX1JDUV9CRCAtIDEpCisjZGVmaW5lIE1BWF9SQ1FfQVZBSUwJCQkoTUFYX1JDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MgLSAyKQorI2RlZmluZSBORVhUX1JDUV9JRFgoeCkJCSgoKCh4KSAmIE1BWF9SQ1FfREVTQ19DTlQpID09IFwKKwkJCQkgIChNQVhfUkNRX0RFU0NfQ05UIC0gMSkpID8gKHgpICsgMiA6ICh4KSArIDEpCisjZGVmaW5lIFJDUV9CRCh4KQkJCSgoeCkgJiBNQVhfUkNRX0JEKQorCisKKy8qIFRoaXMgaXMgbmVlZGVkIGZvciBkZXRlcm1pbmluZyBvZiBsYXN0X21heCAqLworI2RlZmluZSBTVUJfUzE2KGEsIGIpCQkJKHMxNikoKHMxNikoYSkgLSAoczE2KShiKSkKKworI2RlZmluZSBfX1NHRV9NQVNLX1NFVF9CSVQoZWwsIGJpdCkgXAorCWRvIHsgXAorCQllbCA9ICgoZWwpIHwgKCh1NjQpMHgxIDw8IChiaXQpKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fU0dFX01BU0tfQ0xFQVJfQklUKGVsLCBiaXQpIFwKKwlkbyB7IFwKKwkJZWwgPSAoKGVsKSAmICh+KCh1NjQpMHgxIDw8IChiaXQpKSkpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTR0VfTUFTS19TRVRfQklUKGZwLCBpZHgpIFwKKwlfX1NHRV9NQVNLX1NFVF9CSVQoZnAtPnNnZV9tYXNrWyhpZHgpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlRdLCBcCisJCQkgICAoKGlkeCkgJiBSWF9TR0VfTUFTS19FTEVNX01BU0spKQorCisjZGVmaW5lIFNHRV9NQVNLX0NMRUFSX0JJVChmcCwgaWR4KSBcCisJX19TR0VfTUFTS19DTEVBUl9CSVQoZnAtPnNnZV9tYXNrWyhpZHgpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlRdLCBcCisJCQkgICAgICgoaWR4KSAmIFJYX1NHRV9NQVNLX0VMRU1fTUFTSykpCisKKworLyogdXNlZCBvbiBhIENJRCByZWNlaXZlZCBmcm9tIHRoZSBIVyAqLworI2RlZmluZSBTV19DSUQoeCkJCQkobGUzMl90b19jcHUoeCkgJiBcCisJCQkJCSAoQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX0NJRCA+PiA3KSkKKyNkZWZpbmUgQ1FFX0NNRCh4KQkJCShsZTMyX3RvX2NwdSh4KSA+PiBcCisJCQkJCUNPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9DTURfSURfU0hJRlQpCisKKyNkZWZpbmUgQkRfVU5NQVBfQUREUihiZCkJCUhJTE9fVTY0KGxlMzJfdG9fY3B1KChiZCktPmFkZHJfaGkpLCBcCisJCQkJCQkgbGUzMl90b19jcHUoKGJkKS0+YWRkcl9sbykpCisjZGVmaW5lIEJEX1VOTUFQX0xFTihiZCkJCShsZTE2X3RvX2NwdSgoYmQpLT5uYnl0ZXMpKQorCisKKyNkZWZpbmUgRFBNX1RSSUdFUl9UWVBFCQkJMHg0MAorI2RlZmluZSBET09SQkVMTChicCwgY2lkLCB2YWwpIFwKKwlkbyB7IFwKKwkJd3JpdGVsKCh1MzIpKHZhbCksIGJwLT5kb29yYmVsbHMgKyAoQkNNX1BBR0VfU0laRSAqIChjaWQpKSArIFwKKwkJICAgICAgIERQTV9UUklHRVJfVFlQRSk7IFwKKwl9IHdoaWxlICgwKQorCisKKy8qIFRYIENTVU0gaGVscGVycyAqLworI2RlZmluZSBTS0JfQ1NfT0ZGKHNrYikJCShvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjaykgLSBcCisJCQkJIHNrYi0+Y3N1bV9vZmZzZXQpCisjZGVmaW5lIFNLQl9DUyhza2IpCQkoKih1MTYgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIFwKKwkJCQkJICBza2ItPmNzdW1fb2Zmc2V0KSkKKworI2RlZmluZSBwYmRfdGNwX2ZsYWdzKHNrYikJKG50b2hsKHRjcF9mbGFnX3dvcmQodGNwX2hkcihza2IpKSk+PjE2ICYgMHhmZikKKworI2RlZmluZSBYTUlUX1BMQUlOCQkJMAorI2RlZmluZSBYTUlUX0NTVU1fVjQJCQkweDEKKyNkZWZpbmUgWE1JVF9DU1VNX1Y2CQkJMHgyCisjZGVmaW5lIFhNSVRfQ1NVTV9UQ1AJCQkweDQKKyNkZWZpbmUgWE1JVF9HU09fVjQJCQkweDgKKyNkZWZpbmUgWE1JVF9HU09fVjYJCQkweDEwCisKKyNkZWZpbmUgWE1JVF9DU1VNCQkJKFhNSVRfQ1NVTV9WNCB8IFhNSVRfQ1NVTV9WNikKKyNkZWZpbmUgWE1JVF9HU08JCQkoWE1JVF9HU09fVjQgfCBYTUlUX0dTT19WNikKKworCisvKiBzdHVmZiBhZGRlZCB0byBtYWtlIHRoZSBjb2RlIGZpdCA4MENvbCAqLworCisjZGVmaW5lIENRRV9UWVBFKGNxZV9mcF9mbGFncykJKChjcWVfZnBfZmxhZ3MpICYgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfVFlQRSkKKworI2RlZmluZSBUUEFfVFlQRV9TVEFSVAkJCUVUSF9GQVNUX1BBVEhfUlhfQ1FFX1NUQVJUX0ZMRworI2RlZmluZSBUUEFfVFlQRV9FTkQJCQlFVEhfRkFTVF9QQVRIX1JYX0NRRV9FTkRfRkxHCisjZGVmaW5lIFRQQV9UWVBFKGNxZV9mcF9mbGFncykJCSgoY3FlX2ZwX2ZsYWdzKSAmIFwKKwkJCQkJIChUUEFfVFlQRV9TVEFSVCB8IFRQQV9UWVBFX0VORCkpCisKKyNkZWZpbmUgRVRIX1JYX0VSUk9SX0ZBTEdTCQlFVEhfRkFTVF9QQVRIX1JYX0NRRV9QSFlfREVDT0RFX0VSUl9GTEcKKworI2RlZmluZSBCTlgyWF9JUF9DU1VNX0VSUihjcWUpIFwKKwkJCSghKChjcWUpLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncyAmIFwKKwkJCSAgIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0lQX1hTVU1fTk9fVkFMSURBVElPTl9GTEcpICYmIFwKKwkJCSAoKGNxZSktPmZhc3RfcGF0aF9jcWUudHlwZV9lcnJvcl9mbGFncyAmIFwKKwkJCSAgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfSVBfQkFEX1hTVU1fRkxHKSkKKworI2RlZmluZSBCTlgyWF9MNF9DU1VNX0VSUihjcWUpIFwKKwkJCSghKChjcWUpLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncyAmIFwKKwkJCSAgIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0w0X1hTVU1fTk9fVkFMSURBVElPTl9GTEcpICYmIFwKKwkJCSAoKGNxZSktPmZhc3RfcGF0aF9jcWUudHlwZV9lcnJvcl9mbGFncyAmIFwKKwkJCSAgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfTDRfQkFEX1hTVU1fRkxHKSkKKworI2RlZmluZSBCTlgyWF9SWF9DU1VNX09LKGNxZSkgXAorCQkJKCEoQk5YMlhfTDRfQ1NVTV9FUlIoY3FlKSB8fCBCTlgyWF9JUF9DU1VNX0VSUihjcWUpKSkKKworI2RlZmluZSBCTlgyWF9QUlNfRkxBR19PVkVSRVRIX0lQVjQoZmxhZ3MpIFwKKwkJCQkoKChsZTE2X3RvX2NwdShmbGFncykgJiBcCisJCQkJICAgUEFSU0lOR19GTEFHU19PVkVSX0VUSEVSTkVUX1BST1RPQ09MKSA+PiBcCisJCQkJICBQQVJTSU5HX0ZMQUdTX09WRVJfRVRIRVJORVRfUFJPVE9DT0xfU0hJRlQpIFwKKwkJCQkgPT0gUFJTX0ZMQUdfT1ZFUkVUSF9JUFY0KQorI2RlZmluZSBCTlgyWF9SWF9TVU1fRklYKGNxZSkgXAorCUJOWDJYX1BSU19GTEFHX09WRVJFVEhfSVBWNChjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykKKworCisjZGVmaW5lIEZQX1VTQl9GVU5DX09GRgkJCSgyICsgMipIQ19VU1RPUk1fU0JfTlVNX0lORElDRVMpCisjZGVmaW5lIEZQX0NTQl9GVU5DX09GRgkJCSgyICsgMipIQ19DU1RPUk1fU0JfTlVNX0lORElDRVMpCisKKyNkZWZpbmUgVV9TQl9FVEhfUlhfQ1FfSU5ERVgJCUhDX0lOREVYX1VfRVRIX1JYX0NRX0NPTlMKKyNkZWZpbmUgVV9TQl9FVEhfUlhfQkRfSU5ERVgJCUhDX0lOREVYX1VfRVRIX1JYX0JEX0NPTlMKKyNkZWZpbmUgQ19TQl9FVEhfVFhfQ1FfSU5ERVgJCUhDX0lOREVYX0NfRVRIX1RYX0NRX0NPTlMKKworI2RlZmluZSBCTlgyWF9SWF9TQl9JTkRFWCBcCisJKCZmcC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suaW5kZXhfdmFsdWVzW1VfU0JfRVRIX1JYX0NRX0lOREVYXSkKKworI2RlZmluZSBCTlgyWF9SWF9TQl9CRF9JTkRFWCBcCisJKCZmcC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suaW5kZXhfdmFsdWVzW1VfU0JfRVRIX1JYX0JEX0lOREVYXSkKKworI2RlZmluZSBCTlgyWF9SWF9TQl9JTkRFWF9OVU0gXAorCQkoKChVX1NCX0VUSF9SWF9DUV9JTkRFWCA8PCBcCisJCSAgIFVTVE9STV9FVEhfU1RfQ09OVEVYVF9DT05GSUdfQ1FFX1NCX0lOREVYX05VTUJFUl9TSElGVCkgJiBcCisJCSAgVVNUT1JNX0VUSF9TVF9DT05URVhUX0NPTkZJR19DUUVfU0JfSU5ERVhfTlVNQkVSKSB8IFwKKwkJICgoVV9TQl9FVEhfUlhfQkRfSU5ERVggPDwgXAorCQkgICBVU1RPUk1fRVRIX1NUX0NPTlRFWFRfQ09ORklHX0JEX1NCX0lOREVYX05VTUJFUl9TSElGVCkgJiBcCisJCSAgVVNUT1JNX0VUSF9TVF9DT05URVhUX0NPTkZJR19CRF9TQl9JTkRFWF9OVU1CRVIpKQorCisjZGVmaW5lIEJOWDJYX1RYX1NCX0lOREVYIFwKKwkoJmZwLT5zdGF0dXNfYmxrLT5jX3N0YXR1c19ibG9jay5pbmRleF92YWx1ZXNbQ19TQl9FVEhfVFhfQ1FfSU5ERVhdKQorCisKKy8qIGVuZCBvZiBmYXN0IHBhdGggKi8KKworLyogY29tbW9uICovCisKK3N0cnVjdCBibngyeF9jb21tb24geworCisJdTMyCQkJY2hpcF9pZDsKKy8qIGNoaXAgbnVtOjE2LTMxLCByZXY6MTItMTUsIG1ldGFsOjQtMTEsIGJvbmRfaWQ6MC0zICovCisjZGVmaW5lIENISVBfSUQoYnApCQkJKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4ZmZmZmZmZjApCisKKyNkZWZpbmUgQ0hJUF9OVU0oYnApCQkJKGJwLT5jb21tb24uY2hpcF9pZCA+PiAxNikKKyNkZWZpbmUgQ0hJUF9OVU1fNTc3MTAJCQkweDE2NGUKKyNkZWZpbmUgQ0hJUF9OVU1fNTc3MTEJCQkweDE2NGYKKyNkZWZpbmUgQ0hJUF9OVU1fNTc3MTFFCQkJMHgxNjUwCisjZGVmaW5lIENISVBfSVNfRTEoYnApCQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzcxMCkKKyNkZWZpbmUgQ0hJUF9JU181NzcxMShicCkJCShDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTc3MTEpCisjZGVmaW5lIENISVBfSVNfNTc3MTFFKGJwKQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzcxMUUpCisjZGVmaW5lIENISVBfSVNfRTFIKGJwKQkJCShDSElQX0lTXzU3NzExKGJwKSB8fCBcCisJCQkJCSBDSElQX0lTXzU3NzExRShicCkpCisjZGVmaW5lIElTX0UxSF9PRkZTRVQJCQlDSElQX0lTX0UxSChicCkKKworI2RlZmluZSBDSElQX1JFVihicCkJCQkoYnAtPmNvbW1vbi5jaGlwX2lkICYgMHgwMDAwZjAwMCkKKyNkZWZpbmUgQ0hJUF9SRVZfQXgJCQkweDAwMDAwMDAwCisvKiBhc3N1bWUgbWF4aW11bSA1IHJldmlzaW9ucyAqLworI2RlZmluZSBDSElQX1JFVl9JU19TTE9XKGJwKQkJKENISVBfUkVWKGJwKSA+IDB4MDAwMDUwMDApCisvKiBFbXVsIHZlcnNpb25zIGFyZSBBPT4weGUsIEI9PjB4YywgQz0+MHhhLCBEPT44LCBFPT42ICovCisjZGVmaW5lIENISVBfUkVWX0lTX0VNVUwoYnApCQkoKENISVBfUkVWX0lTX1NMT1coYnApKSAmJiBcCisJCQkJCSAhKENISVBfUkVWKGJwKSAmIDB4MDAwMDEwMDApKQorLyogRlBHQSB2ZXJzaW9ucyBhcmUgQT0+MHhmLCBCPT4weGQsIEM9PjB4YiwgRD0+OSwgRT0+NyAqLworI2RlZmluZSBDSElQX1JFVl9JU19GUEdBKGJwKQkJKChDSElQX1JFVl9JU19TTE9XKGJwKSkgJiYgXAorCQkJCQkgKENISVBfUkVWKGJwKSAmIDB4MDAwMDEwMDApKQorCisjZGVmaW5lIENISVBfVElNRShicCkJCQkoKENISVBfUkVWX0lTX0VNVUwoYnApKSA/IDIwMDAgOiBcCisJCQkJCSgoQ0hJUF9SRVZfSVNfRlBHQShicCkpID8gMjAwIDogMSkpCisKKyNkZWZpbmUgQ0hJUF9NRVRBTChicCkJCQkoYnAtPmNvbW1vbi5jaGlwX2lkICYgMHgwMDAwMGZmMCkKKyNkZWZpbmUgQ0hJUF9CT05EX0lEKGJwKQkJKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4MDAwMDAwMGYpCisKKwlpbnQJCQlmbGFzaF9zaXplOworI2RlZmluZSBOVlJBTV8xTUJfU0laRQkJCTB4MjAwMDAJLyogMU0gYml0IGluIGJ5dGVzICovCisjZGVmaW5lIE5WUkFNX1RJTUVPVVRfQ09VTlQJCTMwMDAwCisjZGVmaW5lIE5WUkFNX1BBR0VfU0laRQkJCTI1NgorCisJdTMyCQkJc2htZW1fYmFzZTsKKwl1MzIJCQlzaG1lbTJfYmFzZTsKKworCXUzMgkJCWh3X2NvbmZpZzsKKworCXUzMgkJCWJjX3ZlcjsKK307CisKKworLyogZW5kIG9mIGNvbW1vbiAqLworCisvKiBwb3J0ICovCisKK3N0cnVjdCBibngyeF9wb3J0IHsKKwl1MzIJCQlwbWY7CisKKwl1MzIJCQlsaW5rX2NvbmZpZzsKKworCXUzMgkJCXN1cHBvcnRlZDsKKy8qIGxpbmsgc2V0dGluZ3MgLSBtaXNzaW5nIGRlZmluZXMgKi8KKyNkZWZpbmUgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsCSgxIDw8IDE1KQorCisJdTMyCQkJYWR2ZXJ0aXNpbmc7CisvKiBsaW5rIHNldHRpbmdzIC0gbWlzc2luZyBkZWZpbmVzICovCisjZGVmaW5lIEFEVkVSVElTRURfMjUwMGJhc2VYX0Z1bGwJKDEgPDwgMTUpCisKKwl1MzIJCQlwaHlfYWRkcjsKKworCS8qIHVzZWQgdG8gc3luY2hyb25pemUgcGh5IGFjY2Vzc2VzICovCisJc3RydWN0IG11dGV4CQlwaHlfbXV0ZXg7CisJaW50CQkJbmVlZF9od19sb2NrOworCisJdTMyCQkJcG9ydF9zdHg7CisKKwlzdHJ1Y3QgbmlnX3N0YXRzCW9sZF9uaWdfc3RhdHM7Cit9OworCisvKiBlbmQgb2YgcG9ydCAqLworCisKKworI2lmZGVmIEJDTV9DTklDCisjZGVmaW5lIE1BWF9DT05URVhUCQkJMTUKKyNlbHNlCisjZGVmaW5lIE1BWF9DT05URVhUCQkJMTYKKyNlbmRpZgorCit1bmlvbiBjZHVfY29udGV4dCB7CisJc3RydWN0IGV0aF9jb250ZXh0IGV0aDsKKwljaGFyIHBhZFsxMDI0XTsKK307CisKKyNkZWZpbmUgTUFYX0RNQUVfQwkJCTgKKworLyogRE1BIG1lbW9yeSBub3QgdXNlZCBpbiBmYXN0cGF0aCAqLworc3RydWN0IGJueDJ4X3Nsb3dwYXRoIHsKKwl1bmlvbiBjZHVfY29udGV4dAkJY29udGV4dFtNQVhfQ09OVEVYVF07CisJc3RydWN0IGV0aF9zdGF0c19xdWVyeQkJZndfc3RhdHM7CisJc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZAltYWNfY29uZmlnOworCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQJbWNhc3RfY29uZmlnOworCisJLyogdXNlZCBieSBkbWFlIGNvbW1hbmQgZXhlY3V0ZXIgKi8KKwlzdHJ1Y3QgZG1hZV9jb21tYW5kCQlkbWFlW01BWF9ETUFFX0NdOworCisJdTMyCQkJCXN0YXRzX2NvbXA7CisJdW5pb24gbWFjX3N0YXRzCQkJbWFjX3N0YXRzOworCXN0cnVjdCBuaWdfc3RhdHMJCW5pZ19zdGF0czsKKwlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzCQlwb3J0X3N0YXRzOworCXN0cnVjdCBob3N0X2Z1bmNfc3RhdHMJCWZ1bmNfc3RhdHM7CisJc3RydWN0IGhvc3RfZnVuY19zdGF0cwkJZnVuY19zdGF0c19iYXNlOworCisJdTMyCQkJCXdiX2NvbXA7CisJdTMyCQkJCXdiX2RhdGFbNF07Cit9OworCisjZGVmaW5lIGJueDJ4X3NwKGJwLCB2YXIpCQkoJmJwLT5zbG93cGF0aC0+dmFyKQorI2RlZmluZSBibngyeF9zcF9tYXBwaW5nKGJwLCB2YXIpIFwKKwkJKGJwLT5zbG93cGF0aF9tYXBwaW5nICsgb2Zmc2V0b2Yoc3RydWN0IGJueDJ4X3Nsb3dwYXRoLCB2YXIpKQorCisKKy8qIGF0dG4gZ3JvdXAgd2lyaW5nICovCisjZGVmaW5lIE1BWF9EWU5BTUlDX0FUVE5fR1JQUwkJOAorCitzdHJ1Y3QgYXR0bl9yb3V0ZSB7CisJdTMyCXNpZ1s0XTsKK307CisKK3R5cGVkZWYgZW51bSB7CisJQk5YMlhfUkVDT1ZFUllfRE9ORSwKKwlCTlgyWF9SRUNPVkVSWV9JTklULAorCUJOWDJYX1JFQ09WRVJZX1dBSVQsCit9IGJueDJ4X3JlY292ZXJ5X3N0YXRlX3Q7CisKK3N0cnVjdCBibngyeCB7CisJLyogRmllbGRzIHVzZWQgaW4gdGhlIHR4IGFuZCBpbnRyL25hcGkgcGVyZm9ybWFuY2UgcGF0aHMKKwkgKiBhcmUgZ3JvdXBlZCB0b2dldGhlciBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUKKwkgKi8KKwlzdHJ1Y3QgYm54MnhfZmFzdHBhdGgJZnBbTUFYX0NPTlRFWFRdOworCXZvaWQgX19pb21lbQkJKnJlZ3ZpZXc7CisJdm9pZCBfX2lvbWVtCQkqZG9vcmJlbGxzOworI2lmZGVmIEJDTV9DTklDCisjZGVmaW5lIEJOWDJYX0RCX1NJWkUJCSgxOCpCQ01fUEFHRV9TSVpFKQorI2Vsc2UKKyNkZWZpbmUgQk5YMlhfREJfU0laRQkJKDE2KkJDTV9QQUdFX1NJWkUpCisjZW5kaWYKKworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCisJYXRvbWljX3QJCWludHJfc2VtOworCisJYm54MnhfcmVjb3Zlcnlfc3RhdGVfdAlyZWNvdmVyeV9zdGF0ZTsKKwlpbnQJCQlpc19sZWFkZXI7CisjaWZkZWYgQkNNX0NOSUMKKwlzdHJ1Y3QgbXNpeF9lbnRyeQltc2l4X3RhYmxlW01BWF9DT05URVhUKzJdOworI2Vsc2UKKwlzdHJ1Y3QgbXNpeF9lbnRyeQltc2l4X3RhYmxlW01BWF9DT05URVhUKzFdOworI2VuZGlmCisjZGVmaW5lIElOVF9NT0RFX0lOVHgJCQkxCisjZGVmaW5lIElOVF9NT0RFX01TSQkJCTIKKworCWludAkJCXR4X3Jpbmdfc2l6ZTsKKworI2lmZGVmIEJDTV9WTEFOCisJc3RydWN0IHZsYW5fZ3JvdXAJKnZsZ3JwOworI2VuZGlmCisKKwl1MzIJCQlyeF9jc3VtOworCXUzMgkJCXJ4X2J1Zl9zaXplOworI2RlZmluZSBFVEhfT1ZSRUhFQUQJCQkoRVRIX0hMRU4gKyA4KQkvKiA4IGZvciBDUkMgKyBWTEFOICovCisjZGVmaW5lIEVUSF9NSU5fUEFDS0VUX1NJWkUJCTYwCisjZGVmaW5lIEVUSF9NQVhfUEFDS0VUX1NJWkUJCTE1MDAKKyNkZWZpbmUgRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRQk5NjAwCisKKwkvKiBNYXggc3VwcG9ydGVkIGFsaWdubWVudCBpcyAyNTYgKDggc2hpZnQpICovCisjZGVmaW5lIEJOWDJYX1JYX0FMSUdOX1NISUZUCQkoKEwxX0NBQ0hFX1NISUZUIDwgOCkgPyBcCisJCQkJCSBMMV9DQUNIRV9TSElGVCA6IDgpCisjZGVmaW5lIEJOWDJYX1JYX0FMSUdOCQkJKDEgPDwgQk5YMlhfUlhfQUxJR05fU0hJRlQpCisKKwlzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrICpkZWZfc3RhdHVzX2JsazsKKyNkZWZpbmUgREVGX1NCX0lECQkJMTYKKwlfX2xlMTYJCQlkZWZfY19pZHg7CisJX19sZTE2CQkJZGVmX3VfaWR4OworCV9fbGUxNgkJCWRlZl94X2lkeDsKKwlfX2xlMTYJCQlkZWZfdF9pZHg7CisJX19sZTE2CQkJZGVmX2F0dF9pZHg7CisJdTMyCQkJYXR0bl9zdGF0ZTsKKwlzdHJ1Y3QgYXR0bl9yb3V0ZQlhdHRuX2dyb3VwW01BWF9EWU5BTUlDX0FUVE5fR1JQU107CisKKwkvKiBzbG93IHBhdGggcmluZyAqLworCXN0cnVjdCBldGhfc3BlCQkqc3BxOworCWRtYV9hZGRyX3QJCXNwcV9tYXBwaW5nOworCXUxNgkJCXNwcV9wcm9kX2lkeDsKKwlzdHJ1Y3QgZXRoX3NwZQkJKnNwcV9wcm9kX2JkOworCXN0cnVjdCBldGhfc3BlCQkqc3BxX2xhc3RfYmQ7CisJX19sZTE2CQkJKmRzYl9zcF9wcm9kOworCXUxNgkJCXNwcV9sZWZ0OyAvKiBzZXJpYWxpemUgc3BxICovCisJLyogdXNlZCB0byBzeW5jaHJvbml6ZSBzcHEgYWNjZXNzZXMgKi8KKwlzcGlubG9ja190CQlzcHFfbG9jazsKKworCS8qIEZsYWdzIGZvciBtYXJraW5nIHRoYXQgdGhlcmUgaXMgYSBTVEFUX1FVRVJZIG9yCisJICAgU0VUX01BQyByYW1yb2QgcGVuZGluZyAqLworCWludAkJCXN0YXRzX3BlbmRpbmc7CisJaW50CQkJc2V0X21hY19wZW5kaW5nOworCisJLyogRW5kIG9mIGZpZWxkcyB1c2VkIGluIHRoZSBwZXJmb3JtYW5jZSBjb2RlIHBhdGhzICovCisKKwlpbnQJCQlwYW5pYzsKKwlpbnQJCQltc2dfZW5hYmxlOworCisJdTMyCQkJZmxhZ3M7CisjZGVmaW5lIFBDSVhfRkxBRwkJCTEKKyNkZWZpbmUgUENJXzMyQklUX0ZMQUcJCQkyCisjZGVmaW5lIE9ORV9QT1JUX0ZMQUcJCQk0CisjZGVmaW5lIE5PX1dPTF9GTEFHCQkJOAorI2RlZmluZSBVU0lOR19EQUNfRkxBRwkJCTB4MTAKKyNkZWZpbmUgVVNJTkdfTVNJWF9GTEFHCQkJMHgyMAorI2RlZmluZSBVU0lOR19NU0lfRkxBRwkJCTB4NDAKKyNkZWZpbmUgVFBBX0VOQUJMRV9GTEFHCQkJMHg4MAorI2RlZmluZSBOT19NQ1BfRkxBRwkJCTB4MTAwCisjZGVmaW5lIEJQX05PTUNQKGJwKQkJCShicC0+ZmxhZ3MgJiBOT19NQ1BfRkxBRykKKyNkZWZpbmUgSFdfVkxBTl9UWF9GTEFHCQkJMHg0MDAKKyNkZWZpbmUgSFdfVkxBTl9SWF9GTEFHCQkJMHg4MDAKKyNkZWZpbmUgTUZfRlVOQ19ESVMJCQkweDEwMDAKKworCWludAkJCWZ1bmM7CisjZGVmaW5lIEJQX1BPUlQoYnApCQkJKGJwLT5mdW5jICUgUE9SVF9NQVgpCisjZGVmaW5lIEJQX0ZVTkMoYnApCQkJKGJwLT5mdW5jKQorI2RlZmluZSBCUF9FMUhWTihicCkJCQkoYnAtPmZ1bmMgPj4gMSkKKyNkZWZpbmUgQlBfTF9JRChicCkJCQkoQlBfRTFIVk4oYnApIDw8IDIpCisKKyNpZmRlZiBCQ01fQ05JQworI2RlZmluZSBCQ01fQ05JQ19DSURfU1RBUlQJCTE2CisjZGVmaW5lIEJDTV9JU0NTSV9FVEhfQ0xfSUQJCTE3CisjZW5kaWYKKworCWludAkJCXBtX2NhcDsKKwlpbnQJCQlwY2llX2NhcDsKKwlpbnQJCQltcnJzOworCisJc3RydWN0IGRlbGF5ZWRfd29yawlzcF90YXNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsJcmVzZXRfdGFzazsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlpbnQJCQljdXJyZW50X2ludGVydmFsOworCisJdTE2CQkJZndfc2VxOworCXUxNgkJCWZ3X2Rydl9wdWxzZV93cl9zZXE7CisJdTMyCQkJZnVuY19zdHg7CisKKwlzdHJ1Y3QgbGlua19wYXJhbXMJbGlua19wYXJhbXM7CisJc3RydWN0IGxpbmtfdmFycwlsaW5rX3ZhcnM7CisJc3RydWN0IG1kaW9faWZfaW5mbwltZGlvOworCisJc3RydWN0IGJueDJ4X2NvbW1vbgljb21tb247CisJc3RydWN0IGJueDJ4X3BvcnQJcG9ydDsKKworCXN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCBjbW5nOworCXUzMgkJCXZuX3dlaWdodF9zdW07CisKKwl1MzIJCQltZl9jb25maWc7CisJdTE2CQkJZTFob3Y7CisJdTgJCQllMWhtZjsKKyNkZWZpbmUgSVNfRTFITUYoYnApCQkJKGJwLT5lMWhtZiAhPSAwKQorCisJdTgJCQl3b2w7CisKKwlpbnQJCQlyeF9yaW5nX3NpemU7CisKKwl1MTYJCQl0eF9xdWlja19jb25zX3RyaXBfaW50OworCXUxNgkJCXR4X3F1aWNrX2NvbnNfdHJpcDsKKwl1MTYJCQl0eF90aWNrc19pbnQ7CisJdTE2CQkJdHhfdGlja3M7CisKKwl1MTYJCQlyeF9xdWlja19jb25zX3RyaXBfaW50OworCXUxNgkJCXJ4X3F1aWNrX2NvbnNfdHJpcDsKKwl1MTYJCQlyeF90aWNrc19pbnQ7CisJdTE2CQkJcnhfdGlja3M7CisvKiBNYXhpbWFsIGNvYWxlc2NpbmcgdGltZW91dCBpbiB1cyAqLworI2RlZmluZSBCTlgyWF9NQVhfQ09BTEVTQ0VfVE9VVAkJKDB4ZjAqMTIpCisKKwl1MzIJCQlsaW5fY250OworCisJaW50CQkJc3RhdGU7CisjZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NFRAkJMAorI2RlZmluZSBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X0xPQUQJMHgxMDAwCisjZGVmaW5lIEJOWDJYX1NUQVRFX09QRU5JTkdfV0FJVDRfUE9SVAkweDIwMDAKKyNkZWZpbmUgQk5YMlhfU1RBVEVfT1BFTgkJMHgzMDAwCisjZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfSEFMVAkweDQwMDAKKyNkZWZpbmUgQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9ERUxFVEUgMHg1MDAwCisjZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfVU5MT0FEIDB4NjAwMAorI2RlZmluZSBCTlgyWF9TVEFURV9ESUFHCQkweGUwMDAKKyNkZWZpbmUgQk5YMlhfU1RBVEVfRVJST1IJCTB4ZjAwMAorCisJaW50CQkJbXVsdGlfbW9kZTsKKwlpbnQJCQludW1fcXVldWVzOworCWludAkJCWRpc2FibGVfdHBhOworCWludAkJCWludF9tb2RlOworCisJdTMyCQkJcnhfbW9kZTsKKyNkZWZpbmUgQk5YMlhfUlhfTU9ERV9OT05FCQkwCisjZGVmaW5lIEJOWDJYX1JYX01PREVfTk9STUFMCQkxCisjZGVmaW5lIEJOWDJYX1JYX01PREVfQUxMTVVMVEkJCTIKKyNkZWZpbmUgQk5YMlhfUlhfTU9ERV9QUk9NSVNDCQkzCisjZGVmaW5lIEJOWDJYX01BWF9NVUxUSUNBU1QJCTY0CisjZGVmaW5lIEJOWDJYX01BWF9FTVVMX01VTFRJCQkxNgorCisJdTMyIAkJCXJ4X21vZGVfY2xfbWFzazsKKworCWRtYV9hZGRyX3QJCWRlZl9zdGF0dXNfYmxrX21hcHBpbmc7CisKKwlzdHJ1Y3QgYm54Mnhfc2xvd3BhdGgJKnNsb3dwYXRoOworCWRtYV9hZGRyX3QJCXNsb3dwYXRoX21hcHBpbmc7CisKKwlpbnQJCQlkcm9wbGVzc19mYzsKKworI2lmZGVmIEJDTV9DTklDCisJdTMyCQkJY25pY19mbGFnczsKKyNkZWZpbmUgQk5YMlhfQ05JQ19GTEFHX01BQ19TRVQJCTEKKworCXZvaWQJCQkqdDE7CisJZG1hX2FkZHJfdAkJdDFfbWFwcGluZzsKKwl2b2lkCQkJKnQyOworCWRtYV9hZGRyX3QJCXQyX21hcHBpbmc7CisJdm9pZAkJCSp0aW1lcnM7CisJZG1hX2FkZHJfdAkJdGltZXJzX21hcHBpbmc7CisJdm9pZAkJCSpxbTsKKwlkbWFfYWRkcl90CQlxbV9tYXBwaW5nOworCXN0cnVjdCBjbmljX29wcwkJKmNuaWNfb3BzOworCXZvaWQJCQkqY25pY19kYXRhOworCXUzMgkJCWNuaWNfdGFnOworCXN0cnVjdCBjbmljX2V0aF9kZXYJY25pY19ldGhfZGV2OworCXN0cnVjdCBob3N0X3N0YXR1c19ibG9jayAqY25pY19zYjsKKwlkbWFfYWRkcl90CQljbmljX3NiX21hcHBpbmc7CisjZGVmaW5lIENOSUNfU0JfSUQoYnApCQkJQlBfTF9JRChicCkKKwlzdHJ1Y3QgZXRoX3NwZQkJKmNuaWNfa3dxOworCXN0cnVjdCBldGhfc3BlCQkqY25pY19rd3FfcHJvZDsKKwlzdHJ1Y3QgZXRoX3NwZQkJKmNuaWNfa3dxX2NvbnM7CisJc3RydWN0IGV0aF9zcGUJCSpjbmljX2t3cV9sYXN0OworCXUxNgkJCWNuaWNfa3dxX3BlbmRpbmc7CisJdTE2CQkJY25pY19zcHFfcGVuZGluZzsKKwlzdHJ1Y3QgbXV0ZXgJCWNuaWNfbXV0ZXg7CisJdTgJCQlpc2NzaV9tYWNbNl07CisjZW5kaWYKKworCWludAkJCWRtYWVfcmVhZHk7CisJLyogdXNlZCB0byBzeW5jaHJvbml6ZSBkbWFlIGFjY2Vzc2VzICovCisJc3RydWN0IG11dGV4CQlkbWFlX211dGV4OworCisJLyogdXNlZCB0byBwcm90ZWN0IHRoZSBGVyBtYWlsIGJveCAqLworCXN0cnVjdCBtdXRleAkJZndfbWJfbXV0ZXg7CisKKwkvKiB1c2VkIHRvIHN5bmNocm9uaXplIHN0YXRzIGNvbGxlY3RpbmcgKi8KKwlpbnQJCQlzdGF0c19zdGF0ZTsKKworCS8qIHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBjb25jdXJyZW50IHRocmVhZHMgc3RhdGlzdGljcyBoYW5kbGluZyAqLworCXNwaW5sb2NrX3QJCXN0YXRzX2xvY2s7CisKKwkvKiB1c2VkIGJ5IGRtYWUgY29tbWFuZCBsb2FkZXIgKi8KKwlzdHJ1Y3QgZG1hZV9jb21tYW5kCXN0YXRzX2RtYWU7CisJaW50CQkJZXhlY3V0ZXJfaWR4OworCisJdTE2CQkJc3RhdHNfY291bnRlcjsKKwlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzCWV0aF9zdGF0czsKKworCXN0cnVjdCB6X3N0cmVhbV9zCSpzdHJtOworCXZvaWQJCQkqZ3VuemlwX2J1ZjsKKwlkbWFfYWRkcl90CQlndW56aXBfbWFwcGluZzsKKwlpbnQJCQlndW56aXBfb3V0bGVuOworI2RlZmluZSBGV19CVUZfU0laRQkJCTB4ODAwMAorI2RlZmluZSBHVU5aSVBfQlVGKGJwKQkJCShicC0+Z3VuemlwX2J1ZikKKyNkZWZpbmUgR1VOWklQX1BIWVMoYnApCQkJKGJwLT5ndW56aXBfbWFwcGluZykKKyNkZWZpbmUgR1VOWklQX09VVExFTihicCkJCShicC0+Z3VuemlwX291dGxlbikKKworCXN0cnVjdCByYXdfb3AJCSppbml0X29wczsKKwkvKiBJbml0IGJsb2NrcyBvZmZzZXRzIGluc2lkZSBpbml0X29wcyAqLworCXUxNgkJCSppbml0X29wc19vZmZzZXRzOworCS8qIERhdGEgYmxvYiAtIGhhcyAzMiBiaXQgZ3JhbnVsYXJpdHkgKi8KKwl1MzIJCQkqaW5pdF9kYXRhOworCS8qIFppcHBlZCBQUkFNIGJsb2JzIC0gcmF3IGRhdGEgKi8KKwljb25zdCB1OAkJKnRzZW1faW50X3RhYmxlX2RhdGE7CisJY29uc3QgdTgJCSp0c2VtX3ByYW1fZGF0YTsKKwljb25zdCB1OAkJKnVzZW1faW50X3RhYmxlX2RhdGE7CisJY29uc3QgdTgJCSp1c2VtX3ByYW1fZGF0YTsKKwljb25zdCB1OAkJKnhzZW1faW50X3RhYmxlX2RhdGE7CisJY29uc3QgdTgJCSp4c2VtX3ByYW1fZGF0YTsKKwljb25zdCB1OAkJKmNzZW1faW50X3RhYmxlX2RhdGE7CisJY29uc3QgdTgJCSpjc2VtX3ByYW1fZGF0YTsKKyNkZWZpbmUgSU5JVF9PUFMoYnApCQkJKGJwLT5pbml0X29wcykKKyNkZWZpbmUgSU5JVF9PUFNfT0ZGU0VUUyhicCkJCShicC0+aW5pdF9vcHNfb2Zmc2V0cykKKyNkZWZpbmUgSU5JVF9EQVRBKGJwKQkJCShicC0+aW5pdF9kYXRhKQorI2RlZmluZSBJTklUX1RTRU1fSU5UX1RBQkxFX0RBVEEoYnApCShicC0+dHNlbV9pbnRfdGFibGVfZGF0YSkKKyNkZWZpbmUgSU5JVF9UU0VNX1BSQU1fREFUQShicCkJCShicC0+dHNlbV9wcmFtX2RhdGEpCisjZGVmaW5lIElOSVRfVVNFTV9JTlRfVEFCTEVfREFUQShicCkJKGJwLT51c2VtX2ludF90YWJsZV9kYXRhKQorI2RlZmluZSBJTklUX1VTRU1fUFJBTV9EQVRBKGJwKQkJKGJwLT51c2VtX3ByYW1fZGF0YSkKKyNkZWZpbmUgSU5JVF9YU0VNX0lOVF9UQUJMRV9EQVRBKGJwKQkoYnAtPnhzZW1faW50X3RhYmxlX2RhdGEpCisjZGVmaW5lIElOSVRfWFNFTV9QUkFNX0RBVEEoYnApCQkoYnAtPnhzZW1fcHJhbV9kYXRhKQorI2RlZmluZSBJTklUX0NTRU1fSU5UX1RBQkxFX0RBVEEoYnApCShicC0+Y3NlbV9pbnRfdGFibGVfZGF0YSkKKyNkZWZpbmUgSU5JVF9DU0VNX1BSQU1fREFUQShicCkJCShicC0+Y3NlbV9wcmFtX2RhdGEpCisKKwljaGFyCQkJZndfdmVyWzMyXTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUJKmZpcm13YXJlOworfTsKKworCisjZGVmaW5lIEJOWDJYX01BWF9RVUVVRVMoYnApCShJU19FMUhNRihicCkgPyAoTUFYX0NPTlRFWFQvRTFIVk5fTUFYKSBcCisJCQkJCSAgICAgIDogTUFYX0NPTlRFWFQpCisjZGVmaW5lIEJOWDJYX05VTV9RVUVVRVMoYnApCShicC0+bnVtX3F1ZXVlcykKKyNkZWZpbmUgaXNfbXVsdGkoYnApCQkoQk5YMlhfTlVNX1FVRVVFUyhicCkgPiAxKQorCisjZGVmaW5lIGZvcl9lYWNoX3F1ZXVlKGJwLCB2YXIpIFwKKwkJCWZvciAodmFyID0gMDsgdmFyIDwgQk5YMlhfTlVNX1FVRVVFUyhicCk7IHZhcisrKQorI2RlZmluZSBmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCB2YXIpIFwKKwkJCWZvciAodmFyID0gMTsgdmFyIDwgQk5YMlhfTlVNX1FVRVVFUyhicCk7IHZhcisrKQorCisKK3ZvaWQgYm54MnhfcmVhZF9kbWFlKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzcmNfYWRkciwgdTMyIGxlbjMyKTsKK3ZvaWQgYm54Mnhfd3JpdGVfZG1hZShzdHJ1Y3QgYm54MnggKmJwLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgZHN0X2FkZHIsCisJCSAgICAgIHUzMiBsZW4zMik7CitpbnQgYm54MnhfZ2V0X2dwaW8oc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1OCBwb3J0KTsKK2ludCBibngyeF9zZXRfZ3BpbyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZ3Bpb19udW0sIHUzMiBtb2RlLCB1OCBwb3J0KTsKK2ludCBibngyeF9zZXRfZ3Bpb19pbnQoc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCk7Cit1MzIgYm54MnhfZndfY29tbWFuZChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgY29tbWFuZCk7Cit2b2lkIGJueDJ4X3JlZ193cl9pbmQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIHUzMiB2YWwpOwordm9pZCBibngyeF93cml0ZV9kbWFlX3BoeXNfbGVuKHN0cnVjdCBibngyeCAqYnAsIGRtYV9hZGRyX3QgcGh5c19hZGRyLAorCQkJICAgICAgIHUzMiBhZGRyLCB1MzIgbGVuKTsKK3ZvaWQgYm54MnhfY2FsY19mY19hZHYoc3RydWN0IGJueDJ4ICpicCk7CitpbnQgYm54Mnhfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY29tbWFuZCwgaW50IGNpZCwKKwkJICB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjb21tb24pOwordm9pZCBibngyeF91cGRhdGVfY29hbGVzY2Uoc3RydWN0IGJueDJ4ICpicCk7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlZ19wb2xsKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZWcsIHUzMiBleHBlY3RlZCwgaW50IG1zLAorCQkJICAgaW50IHdhaXQpCit7CisJdTMyIHZhbDsKKworCWRvIHsKKwkJdmFsID0gUkVHX1JEKGJwLCByZWcpOworCQlpZiAodmFsID09IGV4cGVjdGVkKQorCQkJYnJlYWs7CisJCW1zIC09IHdhaXQ7CisJCW1zbGVlcCh3YWl0KTsKKworCX0gd2hpbGUgKG1zID4gMCk7CisKKwlyZXR1cm4gdmFsOworfQorCisKKy8qIGxvYWQvdW5sb2FkIG1vZGUgKi8KKyNkZWZpbmUgTE9BRF9OT1JNQUwJCQkwCisjZGVmaW5lIExPQURfT1BFTgkJCTEKKyNkZWZpbmUgTE9BRF9ESUFHCQkJMgorI2RlZmluZSBVTkxPQURfTk9STUFMCQkJMAorI2RlZmluZSBVTkxPQURfQ0xPU0UJCQkxCisjZGVmaW5lIFVOTE9BRF9SRUNPVkVSWSAgICAgICAgICAgICAgICAgMgorCisKKy8qIERNQUUgY29tbWFuZCBkZWZpbmVzICovCisjZGVmaW5lIERNQUVfQ01EX1NSQ19QQ0kJCTAKKyNkZWZpbmUgRE1BRV9DTURfU1JDX0dSQwkJRE1BRV9DT01NQU5EX1NSQworCisjZGVmaW5lIERNQUVfQ01EX0RTVF9QQ0kJCSgxIDw8IERNQUVfQ09NTUFORF9EU1RfU0hJRlQpCisjZGVmaW5lIERNQUVfQ01EX0RTVF9HUkMJCSgyIDw8IERNQUVfQ09NTUFORF9EU1RfU0hJRlQpCisKKyNkZWZpbmUgRE1BRV9DTURfQ19EU1RfUENJCQkwCisjZGVmaW5lIERNQUVfQ01EX0NfRFNUX0dSQwkJKDEgPDwgRE1BRV9DT01NQU5EX0NfRFNUX1NISUZUKQorCisjZGVmaW5lIERNQUVfQ01EX0NfRU5BQkxFCQlETUFFX0NPTU1BTkRfQ19UWVBFX0VOQUJMRQorCisjZGVmaW5lIERNQUVfQ01EX0VORElBTklUWV9OT19TV0FQCSgwIDw8IERNQUVfQ09NTUFORF9FTkRJQU5JVFlfU0hJRlQpCisjZGVmaW5lIERNQUVfQ01EX0VORElBTklUWV9CX1NXQVAJKDEgPDwgRE1BRV9DT01NQU5EX0VORElBTklUWV9TSElGVCkKKyNkZWZpbmUgRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAJKDIgPDwgRE1BRV9DT01NQU5EX0VORElBTklUWV9TSElGVCkKKyNkZWZpbmUgRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUAkoMyA8PCBETUFFX0NPTU1BTkRfRU5ESUFOSVRZX1NISUZUKQorCisjZGVmaW5lIERNQUVfQ01EX1BPUlRfMAkJCTAKKyNkZWZpbmUgRE1BRV9DTURfUE9SVF8xCQkJRE1BRV9DT01NQU5EX1BPUlQKKworI2RlZmluZSBETUFFX0NNRF9TUkNfUkVTRVQJCURNQUVfQ09NTUFORF9TUkNfUkVTRVQKKyNkZWZpbmUgRE1BRV9DTURfRFNUX1JFU0VUCQlETUFFX0NPTU1BTkRfRFNUX1JFU0VUCisjZGVmaW5lIERNQUVfQ01EX0UxSFZOX1NISUZUCQlETUFFX0NPTU1BTkRfRTFIVk5fU0hJRlQKKworI2RlZmluZSBETUFFX0xFTjMyX1JEX01BWAkJMHg4MAorI2RlZmluZSBETUFFX0xFTjMyX1dSX01BWChicCkJCShDSElQX0lTX0UxKGJwKSA/IDB4NDAwIDogMHgyMDAwKQorCisjZGVmaW5lIERNQUVfQ09NUF9WQUwJCQkweGUwZDBkMGFlCisKKyNkZWZpbmUgTUFYX0RNQUVfQ19QRVJfUE9SVAkJOAorI2RlZmluZSBJTklUX0RNQUVfQyhicCkJCQkoQlBfUE9SVChicCkgKiBNQVhfRE1BRV9DX1BFUl9QT1JUICsgXAorCQkJCQkgQlBfRTFIVk4oYnApKQorI2RlZmluZSBQTUZfRE1BRV9DKGJwKQkJCShCUF9QT1JUKGJwKSAqIE1BWF9ETUFFX0NfUEVSX1BPUlQgKyBcCisJCQkJCSBFMUhWTl9NQVgpCisKKworLyogUENJRSBsaW5rIGFuZCBzcGVlZCAqLworI2RlZmluZSBQQ0lDRkdfTElOS19XSURUSAkJMHgxZjAwMDAwCisjZGVmaW5lIFBDSUNGR19MSU5LX1dJRFRIX1NISUZUCQkyMAorI2RlZmluZSBQQ0lDRkdfTElOS19TUEVFRAkJMHhmMDAwMAorI2RlZmluZSBQQ0lDRkdfTElOS19TUEVFRF9TSElGVAkJMTYKKworCisjZGVmaW5lIEJOWDJYX05VTV9URVNUUwkJCTcKKworI2RlZmluZSBCTlgyWF9QSFlfTE9PUEJBQ0sJCTAKKyNkZWZpbmUgQk5YMlhfTUFDX0xPT1BCQUNLCQkxCisjZGVmaW5lIEJOWDJYX1BIWV9MT09QQkFDS19GQUlMRUQJMQorI2RlZmluZSBCTlgyWF9NQUNfTE9PUEJBQ0tfRkFJTEVECTIKKyNkZWZpbmUgQk5YMlhfTE9PUEJBQ0tfRkFJTEVECQkoQk5YMlhfTUFDX0xPT1BCQUNLX0ZBSUxFRCB8IFwKKwkJCQkJIEJOWDJYX1BIWV9MT09QQkFDS19GQUlMRUQpCisKKworI2RlZmluZSBTVFJPTV9BU1NFUlRfQVJSQVlfU0laRQkJNTAKKworCisvKiBtdXN0IGJlIHVzZWQgb24gYSBDSUQgYmVmb3JlIHBsYWNpbmcgaXQgb24gYSBIVyByaW5nICovCisjZGVmaW5lIEhXX0NJRChicCwgeCkJCQkoKEJQX1BPUlQoYnApIDw8IDIzKSB8IFwKKwkJCQkJIChCUF9FMUhWTihicCkgPDwgMTcpIHwgKHgpKQorCisjZGVmaW5lIFNQX0RFU0NfQ05UCQkoQkNNX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZXRoX3NwZSkpCisjZGVmaW5lIE1BWF9TUF9ERVNDX0NOVAkJCShTUF9ERVNDX0NOVCAtIDEpCisKKworI2RlZmluZSBCTlgyWF9CVFIJCQkxCisjZGVmaW5lIE1BWF9TUFFfUEVORElORwkJCTgKKworCisvKiBDTU5HIGNvbnN0YW50cworICAgZGVyaXZlZCBmcm9tIGxhYiBleHBlcmltZW50cywgYW5kIG5vdCBmcm9tIHN5c3RlbSBzcGVjIGNhbGN1bGF0aW9ucyAhISEgKi8KKyNkZWZpbmUgREVGX01JTl9SQVRFCQkJMTAwCisvKiByZXNvbHV0aW9uIG9mIHRoZSByYXRlIHNoYXBpbmcgdGltZXIgLSAxMDAgdXNlYyAqLworI2RlZmluZSBSU19QRVJJT0RJQ19USU1FT1VUX1VTRUMJMTAwCisvKiByZXNvbHV0aW9uIG9mIGZhaXJuZXNzIGFsZ29yaXRobSBpbiB1c2VjcyAtCisgICBjb2VmZmljaWVudCBmb3IgY2FsY3VsYXRpbmcgdGhlIGFjdHVhbCB0IGZhaXIgKi8KKyNkZWZpbmUgVF9GQUlSX0NPRUYJCQkxMDAwMDAwMAorLyogbnVtYmVyIG9mIGJ5dGVzIGluIHNpbmdsZSBRTSBhcmJpdHJhdGlvbiBjeWNsZSAtCisgICBjb2VmZmljaWVudCBmb3IgY2FsY3VsYXRpbmcgdGhlIGZhaXJuZXNzIHRpbWVyICovCisjZGVmaW5lIFFNX0FSQl9CWVRFUwkJCTQwMDAwCisjZGVmaW5lIEZBSVJfTUVNCQkJMgorCisKKyNkZWZpbmUgQVRUTl9OSUdfRk9SX0ZVTkMJCSgxTCA8PCA4KQorI2RlZmluZSBBVFROX1NXX1RJTUVSXzRfRlVOQwkJKDFMIDw8IDkpCisjZGVmaW5lIEdQSU9fMl9GVU5DCQkJKDFMIDw8IDEwKQorI2RlZmluZSBHUElPXzNfRlVOQwkJCSgxTCA8PCAxMSkKKyNkZWZpbmUgR1BJT180X0ZVTkMJCQkoMUwgPDwgMTIpCisjZGVmaW5lIEFUVE5fR0VORVJBTF9BVFROXzEJCSgxTCA8PCAxMykKKyNkZWZpbmUgQVRUTl9HRU5FUkFMX0FUVE5fMgkJKDFMIDw8IDE0KQorI2RlZmluZSBBVFROX0dFTkVSQUxfQVRUTl8zCQkoMUwgPDwgMTUpCisjZGVmaW5lIEFUVE5fR0VORVJBTF9BVFROXzQJCSgxTCA8PCAxMykKKyNkZWZpbmUgQVRUTl9HRU5FUkFMX0FUVE5fNQkJKDFMIDw8IDE0KQorI2RlZmluZSBBVFROX0dFTkVSQUxfQVRUTl82CQkoMUwgPDwgMTUpCisKKyNkZWZpbmUgQVRUTl9IQVJEX1dJUkVEX01BU0sJCTB4ZmYwMAorI2RlZmluZSBBVFRFTlRJT05fSUQJCQk0CisKKworLyogc3R1ZmYgYWRkZWQgdG8gbWFrZSB0aGUgY29kZSBmaXQgODBDb2wgKi8KKworI2RlZmluZSBCTlgyWF9QTUZfTElOS19BU1NFUlQgXAorCUdFTkVSQUxfQVRURU5fT0ZGU0VUKExJTktfU1lOQ19BVFRFTlRJT05fQklUX0ZVTkNfMCArIEJQX0ZVTkMoYnApKQorCisjZGVmaW5lIEJOWDJYX01DX0FTU0VSVF9CSVRTIFwKKwkoR0VORVJBTF9BVFRFTl9PRkZTRVQoVFNUT1JNX0ZBVEFMX0FTU0VSVF9BVFRFTlRJT05fQklUKSB8IFwKKwkgR0VORVJBTF9BVFRFTl9PRkZTRVQoVVNUT1JNX0ZBVEFMX0FTU0VSVF9BVFRFTlRJT05fQklUKSB8IFwKKwkgR0VORVJBTF9BVFRFTl9PRkZTRVQoQ1NUT1JNX0ZBVEFMX0FTU0VSVF9BVFRFTlRJT05fQklUKSB8IFwKKwkgR0VORVJBTF9BVFRFTl9PRkZTRVQoWFNUT1JNX0ZBVEFMX0FTU0VSVF9BVFRFTlRJT05fQklUKSkKKworI2RlZmluZSBCTlgyWF9NQ1BfQVNTRVJUIFwKKwlHRU5FUkFMX0FUVEVOX09GRlNFVChNQ1BfRkFUQUxfQVNTRVJUX0FUVEVOVElPTl9CSVQpCisKKyNkZWZpbmUgQk5YMlhfR1JDX1RJTUVPVVQJR0VORVJBTF9BVFRFTl9PRkZTRVQoTEFUQ0hFRF9BVFROX1RJTUVPVVRfR1JDKQorI2RlZmluZSBCTlgyWF9HUkNfUlNWCQkoR0VORVJBTF9BVFRFTl9PRkZTRVQoTEFUQ0hFRF9BVFROX1JCQ1IpIHwgXAorCQkJCSBHRU5FUkFMX0FUVEVOX09GRlNFVChMQVRDSEVEX0FUVE5fUkJDVCkgfCBcCisJCQkJIEdFTkVSQUxfQVRURU5fT0ZGU0VUKExBVENIRURfQVRUTl9SQkNOKSB8IFwKKwkJCQkgR0VORVJBTF9BVFRFTl9PRkZTRVQoTEFUQ0hFRF9BVFROX1JCQ1UpIHwgXAorCQkJCSBHRU5FUkFMX0FUVEVOX09GRlNFVChMQVRDSEVEX0FUVE5fUkJDUCkgfCBcCisJCQkJIEdFTkVSQUxfQVRURU5fT0ZGU0VUKExBVENIRURfQVRUTl9SU1ZEX0dSQykpCisKKyNkZWZpbmUgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8wIFwKKwkJCQkoQUVVX0lOUFVUU19BVFROX0JJVFNfVFNETV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RDTV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRU1JX0hXX0lOVEVSUlVQVCB8IFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfUEJGX0hXX0lOVEVSUlVQVCkKKyNkZWZpbmUgSFdfUFJUWV9BU1NFUlRfU0VUXzAJKEFFVV9JTlBVVFNfQVRUTl9CSVRTX0JSQl9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BBUlNFUl9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRE1fUEFSSVRZX0VSUk9SIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19TRUFSQ0hFUl9QQVJJVFlfRVJST1IgfFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfUEFSSVRZX0VSUk9SKQorI2RlZmluZSBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzEgXAorCQkJCShBRVVfSU5QVVRTX0FUVE5fQklUU19RTV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RJTUVSU19IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRE1fSFdfSU5URVJSVVBUIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19YQ01fSFdfSU5URVJSVVBUIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0VNSV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRE1fSFdfSU5URVJSVVBUIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19VQ01fSFdfSU5URVJSVVBUIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0VNSV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VQQl9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fSFdfSU5URVJSVVBUIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19DQ01fSFdfSU5URVJSVVBUKQorI2RlZmluZSBIV19QUlRZX0FTU0VSVF9TRVRfMQkoQUVVX0lOUFVUU19BVFROX0JJVFNfUEJDTElFTlRfUEFSSVRZX0VSUk9SIHxcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1FNX1BBUklUWV9FUlJPUiB8IFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNETV9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRU1JX1BBUklUWV9FUlJPUiB8IFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfRE9PUkJFTExRX1BBUklUWV9FUlJPUiB8XAorCQkJICAgICBBRVVfSU5QVVRTX0FUVE5fQklUU19WQVVYX1BDSV9DT1JFX1BBUklUWV9FUlJPUiB8XAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19ERUJVR19QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRE1fUEFSSVRZX0VSUk9SIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0VNSV9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VQQl9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fUEFSSVRZX0VSUk9SKQorI2RlZmluZSBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzIgXAorCQkJCShBRVVfSU5QVVRTX0FUVE5fQklUU19DU0VNSV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NEVV9IV19JTlRFUlJVUFQgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RNQUVfSFdfSU5URVJSVVBUIHwgXAorCQkJQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQUENJQ0xPQ0tDTElFTlRfSFdfSU5URVJSVVBUIHxcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01JU0NfSFdfSU5URVJSVVBUKQorI2RlZmluZSBIV19QUlRZX0FTU0VSVF9TRVRfMgkoQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NFTUlfUEFSSVRZX0VSUk9SIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBfUEFSSVRZX0VSUk9SIHwgXAorCQkJQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQUENJQ0xPQ0tDTElFTlRfUEFSSVRZX0VSUk9SIHxcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NGQ19QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NEVV9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0lHVV9QQVJJVFlfRVJST1IgfCBcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01JU0NfUEFSSVRZX0VSUk9SKQorCisjZGVmaW5lIEhXX1BSVFlfQVNTRVJUX1NFVF8zIChBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9ST01fUEFSSVRZIHwgXAorCQlBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9VTVBfUlhfUEFSSVRZIHwgXAorCQlBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9VTVBfVFhfUEFSSVRZIHwgXAorCQlBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9TQ1BBRF9QQVJJVFkpCisKKyNkZWZpbmUgUlNTX0ZMQUdTKGJwKSBcCisJCShUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjRfQ0FQQUJJTElUWSB8IFwKKwkJIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9UQ1BfQ0FQQUJJTElUWSB8IFwKKwkJIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNl9DQVBBQklMSVRZIHwgXAorCQkgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X1RDUF9DQVBBQklMSVRZIHwgXAorCQkgKGJwLT5tdWx0aV9tb2RlIDw8IFwKKwkJICBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX01PREVfU0hJRlQpKQorI2RlZmluZSBNVUxUSV9NQVNLCQkJMHg3ZgorCisKKyNkZWZpbmUgREVGX1VTQl9GVU5DX09GRgkJKDIgKyAyKkhDX1VTVE9STV9ERUZfU0JfTlVNX0lORElDRVMpCisjZGVmaW5lIERFRl9DU0JfRlVOQ19PRkYJCSgyICsgMipIQ19DU1RPUk1fREVGX1NCX05VTV9JTkRJQ0VTKQorI2RlZmluZSBERUZfWFNCX0ZVTkNfT0ZGCQkoMiArIDIqSENfWFNUT1JNX0RFRl9TQl9OVU1fSU5ESUNFUykKKyNkZWZpbmUgREVGX1RTQl9GVU5DX09GRgkJKDIgKyAyKkhDX1RTVE9STV9ERUZfU0JfTlVNX0lORElDRVMpCisKKyNkZWZpbmUgQ19ERUZfU0JfU1BfSU5ERVgJCUhDX0lOREVYX0RFRl9DX0VUSF9TTE9XX1BBVEgKKworI2RlZmluZSBCTlgyWF9TUF9EU0JfSU5ERVggXAorKCZicC0+ZGVmX3N0YXR1c19ibGstPmNfZGVmX3N0YXR1c19ibG9jay5pbmRleF92YWx1ZXNbQ19ERUZfU0JfU1BfSU5ERVhdKQorCisKKyNkZWZpbmUgQ0FNX0lTX0lOVkFMSUQoeCkgXAorKHgudGFyZ2V0X3RhYmxlX2VudHJ5LmZsYWdzID09IFRTVE9STV9DQU1fVEFSR0VUX1RBQkxFX0VOVFJZX0FDVElPTl9UWVBFKQorCisjZGVmaW5lIENBTV9JTlZBTElEQVRFKHgpIFwKKwkoeC50YXJnZXRfdGFibGVfZW50cnkuZmxhZ3MgPSBUU1RPUk1fQ0FNX1RBUkdFVF9UQUJMRV9FTlRSWV9BQ1RJT05fVFlQRSkKKworCisvKiBOdW1iZXIgb2YgdTMyIGVsZW1lbnRzIGluIE1DIGhhc2ggYXJyYXkgKi8KKyNkZWZpbmUgTUNfSEFTSF9TSVpFCQkJOAorI2RlZmluZSBNQ19IQVNIX09GRlNFVChicCwgaSkJCShCQVJfVFNUUk9STV9JTlRNRU0gKyBcCisJVFNUT1JNX0FQUFJPWElNQVRFX01BVENIX01VTFRJQ0FTVF9GSUxURVJJTkdfT0ZGU0VUKEJQX0ZVTkMoYnApKSArIGkqNCkKKworCisjaWZuZGVmIFBYUDJfUkVHX1BYUDJfSU5UX1NUUworI2RlZmluZSBQWFAyX1JFR19QWFAyX0lOVF9TVFMJCVBYUDJfUkVHX1BYUDJfSU5UX1NUU18wCisjZW5kaWYKKworI2RlZmluZSBCTlgyWF9WUERfTEVOCQkJMTI4CisjZGVmaW5lIFZFTkRPUl9JRF9MRU4JCQk0CisKKyNpZmRlZiBCTlgyWF9NQUlOCisjZGVmaW5lIEJOWDJYX0VYVEVSTgorI2Vsc2UKKyNkZWZpbmUgQk5YMlhfRVhURVJOIGV4dGVybgorI2VuZGlmCisKK0JOWDJYX0VYVEVSTiBpbnQgbG9hZF9jb3VudFszXTsgLyogMC1jb21tb24sIDEtcG9ydDAsIDItcG9ydDEgKi8KKworLyogTUlTQ19SRUdfUkVTRVRfUkVHIC0gdGhpcyBpcyBoZXJlIGZvciB0aGUgaHNpIHRvIHdvcmsgZG9uJ3QgdG91Y2ggKi8KKworZXh0ZXJuIHZvaWQgYm54Mnhfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworCit2b2lkIGJueDJ4X3Bvc3RfZG1hZShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgZG1hZV9jb21tYW5kICpkbWFlLCBpbnQgaWR4KTsKKworI2VuZGlmIC8qIGJueDJ4LmggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2Ntbi5jIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfY21uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2Ntbi5jCkBAIC0wLDAgKzEsMjI1MiBAQAorLyogYm54MnhfY21uLmM6IEJyb2FkY29tIEV2ZXJlc3QgbmV0d29yayBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IEVsaWV6ZXIgVGFtaXIKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNaWNoYWVsIENoYW4ncyBibngyIGRyaXZlcgorICogVURQIENTVU0gZXJyYXRhIHdvcmthcm91bmQgYnkgQXJpayBHZW5kZWxtYW4KKyAqIFNsb3dwYXRoIGFuZCBmYXN0cGF0aCByZXdvcmsgYnkgVmxhZGlzbGF2IFpvbG90YXJvdgorICogU3RhdGlzdGljcyBhbmQgTGluayBtYW5hZ2VtZW50IGJ5IFlpdGNoYWsgR2VydG5lcgorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KKyNpbmNsdWRlICJibngyeF9jbW4uaCIKKworI2lmZGVmIEJDTV9WTEFOCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgYm54MnhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpOworCisvKiBmcmVlIHNrYiBpbiB0aGUgcGFja2V0IHJpbmcgYXQgcG9zIGlkeAorICogcmV0dXJuIGlkeCBvZiBsYXN0IGJkIGZyZWVkCisgKi8KK3N0YXRpYyB1MTYgYm54MnhfZnJlZV90eF9wa3Qoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKKwkJCSAgICAgdTE2IGlkeCkKK3sKKwlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZiA9ICZmcC0+dHhfYnVmX3JpbmdbaWR4XTsKKwlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICp0eF9zdGFydF9iZDsKKwlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9kYXRhX2JkOworCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9idWYtPnNrYjsKKwl1MTYgYmRfaWR4ID0gVFhfQkQodHhfYnVmLT5maXJzdF9iZCksIG5ld19jb25zOworCWludCBuYmQ7CisKKwkvKiBwcmVmZXRjaCBza2IgZW5kIHBvaW50ZXIgdG8gc3BlZWR1cCBkZXZfa2ZyZWVfc2tiKCkgKi8KKwlwcmVmZXRjaCgmc2tiLT5lbmQpOworCisJRFAoQk5YMlhfTVNHX09GRiwgInBrdF9pZHggJWQgIGJ1ZmYgQCglcCktPnNrYiAlcFxuIiwKKwkgICBpZHgsIHR4X2J1Ziwgc2tiKTsKKworCS8qIHVubWFwIGZpcnN0IGJkICovCisJRFAoQk5YMlhfTVNHX09GRiwgImZyZWUgYmRfaWR4ICVkXG4iLCBiZF9pZHgpOworCXR4X3N0YXJ0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfaWR4XS5zdGFydF9iZDsKKwlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBCRF9VTk1BUF9BRERSKHR4X3N0YXJ0X2JkKSwKKwkJCSBCRF9VTk1BUF9MRU4odHhfc3RhcnRfYmQpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCW5iZCA9IGxlMTZfdG9fY3B1KHR4X3N0YXJ0X2JkLT5uYmQpIC0gMTsKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKChuYmQgLSAxKSA+IChNQVhfU0tCX0ZSQUdTICsgMikpIHsKKwkJQk5YMlhfRVJSKCJCQUQgbmJkIVxuIik7CisJCWJueDJ4X3BhbmljKCk7CisJfQorI2VuZGlmCisJbmV3X2NvbnMgPSBuYmQgKyB0eF9idWYtPmZpcnN0X2JkOworCisJLyogR2V0IHRoZSBuZXh0IGJkICovCisJYmRfaWR4ID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfaWR4KSk7CisKKwkvKiBTa2lwIGEgcGFyc2UgYmQuLi4gKi8KKwktLW5iZDsKKwliZF9pZHggPSBUWF9CRChORVhUX1RYX0lEWChiZF9pZHgpKTsKKworCS8qIC4uLmFuZCB0aGUgVFNPIHNwbGl0IGhlYWRlciBiZCBzaW5jZSB0aGV5IGhhdmUgbm8gbWFwcGluZyAqLworCWlmICh0eF9idWYtPmZsYWdzICYgQk5YMlhfVFNPX1NQTElUX0JEKSB7CisJCS0tbmJkOworCQliZF9pZHggPSBUWF9CRChORVhUX1RYX0lEWChiZF9pZHgpKTsKKwl9CisKKwkvKiBub3cgZnJlZSBmcmFncyAqLworCXdoaWxlIChuYmQgPiAwKSB7CisKKwkJRFAoQk5YMlhfTVNHX09GRiwgImZyZWUgZnJhZyBiZF9pZHggJWRcbiIsIGJkX2lkeCk7CisJCXR4X2RhdGFfYmQgPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9pZHhdLnJlZ19iZDsKKwkJZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIEJEX1VOTUFQX0FERFIodHhfZGF0YV9iZCksCisJCQkgICAgICAgQkRfVU5NQVBfTEVOKHR4X2RhdGFfYmQpLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKC0tbmJkKQorCQkJYmRfaWR4ID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfaWR4KSk7CisJfQorCisJLyogcmVsZWFzZSBza2IgKi8KKwlXQVJOX09OKCFza2IpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl0eF9idWYtPmZpcnN0X2JkID0gMDsKKwl0eF9idWYtPnNrYiA9IE5VTEw7CisKKwlyZXR1cm4gbmV3X2NvbnM7Cit9CisKK2ludCBibngyeF90eF9pbnQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwl1MTYgaHdfY29ucywgc3dfY29ucywgYmRfY29ucyA9IGZwLT50eF9iZF9jb25zOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoYnAtPmRldiwgZnAtPmluZGV4KTsKKwlod19jb25zID0gbGUxNl90b19jcHUoKmZwLT50eF9jb25zX3NiKTsKKwlzd19jb25zID0gZnAtPnR4X3BrdF9jb25zOworCisJd2hpbGUgKHN3X2NvbnMgIT0gaHdfY29ucykgeworCQl1MTYgcGt0X2NvbnM7CisKKwkJcGt0X2NvbnMgPSBUWF9CRChzd19jb25zKTsKKworCQkvKiBwcmVmZXRjaChicC0+dHhfYnVmX3JpbmdbcGt0X2NvbnNdLnNrYik7ICovCisKKwkJRFAoTkVUSUZfTVNHX1RYX0RPTkUsICJod19jb25zICV1ICBzd19jb25zICV1ICBwa3RfY29ucyAldVxuIiwKKwkJICAgaHdfY29ucywgc3dfY29ucywgcGt0X2NvbnMpOworCisvKgkJaWYgKE5FWFRfVFhfSURYKHN3X2NvbnMpICE9IGh3X2NvbnMpIHsKKwkJCXJtYigpOworCQkJcHJlZmV0Y2goZnAtPnR4X2J1Zl9yaW5nW05FWFRfVFhfSURYKHN3X2NvbnMpXS5za2IpOworCQl9CisqLworCQliZF9jb25zID0gYm54MnhfZnJlZV90eF9wa3QoYnAsIGZwLCBwa3RfY29ucyk7CisJCXN3X2NvbnMrKzsKKwl9CisKKwlmcC0+dHhfcGt0X2NvbnMgPSBzd19jb25zOworCWZwLT50eF9iZF9jb25zID0gYmRfY29uczsKKworCS8qIE5lZWQgdG8gbWFrZSB0aGUgdHhfYmRfY29ucyB1cGRhdGUgdmlzaWJsZSB0byBzdGFydF94bWl0KCkKKwkgKiBiZWZvcmUgY2hlY2tpbmcgZm9yIG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoKS4gIFdpdGhvdXQgdGhlCisJICogbWVtb3J5IGJhcnJpZXIsIHRoZXJlIGlzIGEgc21hbGwgcG9zc2liaWxpdHkgdGhhdAorCSAqIHN0YXJ0X3htaXQoKSB3aWxsIG1pc3MgaXQgYW5kIGNhdXNlIHRoZSBxdWV1ZSB0byBiZSBzdG9wcGVkCisJICogZm9yZXZlci4KKwkgKi8KKwlzbXBfbWIoKTsKKworCS8qIFRCRCBuZWVkIGEgdGhyZXNoPyAqLworCWlmICh1bmxpa2VseShuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkpKSB7CisJCS8qIFRha2luZyB0eF9sb2NrKCkgaXMgbmVlZGVkIHRvIHByZXZlbnQgcmVlbmFibGluZyB0aGUgcXVldWUKKwkJICogd2hpbGUgaXQncyBlbXB0eS4gVGhpcyBjb3VsZCBoYXZlIGhhcHBlbiBpZiByeF9hY3Rpb24oKSBnZXRzCisJCSAqIHN1c3BlbmRlZCBpbiBibngyeF90eF9pbnQoKSBhZnRlciB0aGUgY29uZGl0aW9uIGJlZm9yZQorCQkgKiBuZXRpZl90eF93YWtlX3F1ZXVlKCksIHdoaWxlIHR4X2FjdGlvbiAoYm54Mnhfc3RhcnRfeG1pdCgpKToKKwkJICoKKwkJICogc3RvcHMgdGhlIHF1ZXVlLT5zZWVzIGZyZXNoIHR4X2JkX2NvbnMtPnJlbGVhc2VzIHRoZSBxdWV1ZS0+CisJCSAqIHNlbmRzIHNvbWUgcGFja2V0cyBjb25zdW1pbmcgdGhlIHdob2xlIHF1ZXVlIGFnYWluLT4KKwkJICogc3RvcHMgdGhlIHF1ZXVlCisJCSAqLworCisJCV9fbmV0aWZfdHhfbG9jayh0eHEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwkJaWYgKChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkpICYmCisJCSAgICAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pICYmCisJCSAgICAoYm54MnhfdHhfYXZhaWwoZnApID49IE1BWF9TS0JfRlJBR1MgKyAzKSkKKwkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKKworCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9sYXN0X21heF9zZ2Uoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKKwkJCQkJICAgICB1MTYgaWR4KQoreworCXUxNiBsYXN0X21heCA9IGZwLT5sYXN0X21heF9zZ2U7CisKKwlpZiAoU1VCX1MxNihpZHgsIGxhc3RfbWF4KSA+IDApCisJCWZwLT5sYXN0X21heF9zZ2UgPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9zZ2VfcHJvZChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAorCQkJCSAgc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlICpmcF9jcWUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKKwl1MTYgc2dlX2xlbiA9IFNHRV9QQUdFX0FMSUdOKGxlMTZfdG9fY3B1KGZwX2NxZS0+cGt0X2xlbikgLQorCQkJCSAgICAgbGUxNl90b19jcHUoZnBfY3FlLT5sZW5fb25fYmQpKSA+PgorCQkgICAgICBTR0VfUEFHRV9TSElGVDsKKwl1MTYgbGFzdF9tYXgsIGxhc3RfZWxlbSwgZmlyc3RfZWxlbTsKKwl1MTYgZGVsdGEgPSAwOworCXUxNiBpOworCisJaWYgKCFzZ2VfbGVuKQorCQlyZXR1cm47CisKKwkvKiBGaXJzdCBtYXJrIGFsbCB1c2VkIHBhZ2VzICovCisJZm9yIChpID0gMDsgaSA8IHNnZV9sZW47IGkrKykKKwkJU0dFX01BU0tfQ0xFQVJfQklUKGZwLCBSWF9TR0UobGUxNl90b19jcHUoZnBfY3FlLT5zZ2xbaV0pKSk7CisKKwlEUChORVRJRl9NU0dfUlhfU1RBVFVTLCAiZnBfY3FlLT5zZ2xbJWRdID0gJWRcbiIsCisJICAgc2dlX2xlbiAtIDEsIGxlMTZfdG9fY3B1KGZwX2NxZS0+c2dsW3NnZV9sZW4gLSAxXSkpOworCisJLyogSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgbGFzdCBTR0UgaW5kZXggaXMgdGhlIGJpZ2dlc3QgKi8KKwlwcmVmZXRjaCgodm9pZCAqKShmcC0+c2dlX21hc2spKTsKKwlibngyeF91cGRhdGVfbGFzdF9tYXhfc2dlKGZwLCBsZTE2X3RvX2NwdShmcF9jcWUtPnNnbFtzZ2VfbGVuIC0gMV0pKTsKKworCWxhc3RfbWF4ID0gUlhfU0dFKGZwLT5sYXN0X21heF9zZ2UpOworCWxhc3RfZWxlbSA9IGxhc3RfbWF4ID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlQ7CisJZmlyc3RfZWxlbSA9IFJYX1NHRShmcC0+cnhfc2dlX3Byb2QpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlQ7CisKKwkvKiBJZiByaW5nIGlzIG5vdCBmdWxsICovCisJaWYgKGxhc3RfZWxlbSArIDEgIT0gZmlyc3RfZWxlbSkKKwkJbGFzdF9lbGVtKys7CisKKwkvKiBOb3cgdXBkYXRlIHRoZSBwcm9kICovCisJZm9yIChpID0gZmlyc3RfZWxlbTsgaSAhPSBsYXN0X2VsZW07IGkgPSBORVhUX1NHRV9NQVNLX0VMRU0oaSkpIHsKKwkJaWYgKGxpa2VseShmcC0+c2dlX21hc2tbaV0pKQorCQkJYnJlYWs7CisKKwkJZnAtPnNnZV9tYXNrW2ldID0gUlhfU0dFX01BU0tfRUxFTV9PTkVfTUFTSzsKKwkJZGVsdGEgKz0gUlhfU0dFX01BU0tfRUxFTV9TWjsKKwl9CisKKwlpZiAoZGVsdGEgPiAwKSB7CisJCWZwLT5yeF9zZ2VfcHJvZCArPSBkZWx0YTsKKwkJLyogY2xlYXIgcGFnZS1lbmQgZW50cmllcyAqLworCQlibngyeF9jbGVhcl9zZ2VfbWFza19uZXh0X2VsZW1zKGZwKTsKKwl9CisKKwlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAorCSAgICJmcC0+bGFzdF9tYXhfc2dlID0gJWQgIGZwLT5yeF9zZ2VfcHJvZCA9ICVkXG4iLAorCSAgIGZwLT5sYXN0X21heF9zZ2UsIGZwLT5yeF9zZ2VfcHJvZCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3RwYV9zdGFydChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCB1MTYgcXVldWUsCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7CisJc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107CisJc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07CisJc3RydWN0IGV0aF9yeF9iZCAqcHJvZF9iZCA9ICZmcC0+cnhfZGVzY19yaW5nW3Byb2RdOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCS8qIG1vdmUgZW1wdHkgc2tiIGZyb20gcG9vbCB0byBwcm9kIGFuZCBtYXAgaXQgKi8KKwlwcm9kX3J4X2J1Zi0+c2tiID0gZnAtPnRwYV9wb29sW3F1ZXVlXS5za2I7CisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBmcC0+dHBhX3Bvb2xbcXVldWVdLnNrYi0+ZGF0YSwKKwkJCQkgYnAtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCWRtYV91bm1hcF9hZGRyX3NldChwcm9kX3J4X2J1ZiwgbWFwcGluZywgbWFwcGluZyk7CisKKwkvKiBtb3ZlIHBhcnRpYWwgc2tiIGZyb20gY29ucyB0byBwb29sIChkb24ndCB1bm1hcCB5ZXQpICovCisJZnAtPnRwYV9wb29sW3F1ZXVlXSA9ICpjb25zX3J4X2J1ZjsKKworCS8qIG1hcmsgYmluIHN0YXRlIGFzIHN0YXJ0IC0gcHJpbnQgZXJyb3IgaWYgY3VycmVudCBzdGF0ZSAhPSBzdG9wICovCisJaWYgKGZwLT50cGFfc3RhdGVbcXVldWVdICE9IEJOWDJYX1RQQV9TVE9QKQorCQlCTlgyWF9FUlIoInN0YXJ0IG9mIGJpbiBub3QgaW4gc3RvcCBbJWRdXG4iLCBxdWV1ZSk7CisKKwlmcC0+dHBhX3N0YXRlW3F1ZXVlXSA9IEJOWDJYX1RQQV9TVEFSVDsKKworCS8qIHBvaW50IHByb2RfYmQgdG8gbmV3IHNrYiAqLworCXByb2RfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOworCXByb2RfYmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihVNjRfTE8obWFwcGluZykpOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCWZwLT50cGFfcXVldWVfdXNlZCB8PSAoMSA8PCBxdWV1ZSk7CisjaWZkZWYgX0FTTV9HRU5FUklDX0lOVF9MNjRfSAorCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJmcC0+dHBhX3F1ZXVlX3VzZWQgPSAweCVseFxuIiwKKyNlbHNlCisJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgImZwLT50cGFfcXVldWVfdXNlZCA9IDB4JWxseFxuIiwKKyNlbmRpZgorCSAgIGZwLT50cGFfcXVldWVfdXNlZCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBibngyeF9maWxsX2ZyYWdfc2tiKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF9jcWUgKmZwX2NxZSwKKwkJCSAgICAgICB1MTYgY3FlX2lkeCkKK3sKKwlzdHJ1Y3Qgc3dfcnhfcGFnZSAqcnhfcGcsIG9sZF9yeF9wZzsKKwl1MTYgbGVuX29uX2JkID0gbGUxNl90b19jcHUoZnBfY3FlLT5sZW5fb25fYmQpOworCXUzMiBpLCBmcmFnX2xlbiwgZnJhZ19zaXplLCBwYWdlczsKKwlpbnQgZXJyOworCWludCBqOworCisJZnJhZ19zaXplID0gbGUxNl90b19jcHUoZnBfY3FlLT5wa3RfbGVuKSAtIGxlbl9vbl9iZDsKKwlwYWdlcyA9IFNHRV9QQUdFX0FMSUdOKGZyYWdfc2l6ZSkgPj4gU0dFX1BBR0VfU0hJRlQ7CisKKwkvKiBUaGlzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBlbmFibGUgZm9yd2FyZGluZyBzdXBwb3J0ICovCisJaWYgKGZyYWdfc2l6ZSkKKwkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IG1pbigodTMyKVNHRV9QQUdFX1NJWkUsCisJCQkJCSAgICAgICBtYXgoZnJhZ19zaXplLCAodTMyKWxlbl9vbl9iZCkpOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCWlmIChwYWdlcyA+IG1pbl90KHUzMiwgOCwgTUFYX1NLQl9GUkFHUykqU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFKSB7CisJCUJOWDJYX0VSUigiU0dMIGxlbmd0aCBpcyB0b28gbG9uZzogJWQuIENRRSBpbmRleCBpcyAlZFxuIiwKKwkJCSAgcGFnZXMsIGNxZV9pZHgpOworCQlCTlgyWF9FUlIoImZwX2NxZS0+cGt0X2xlbiA9ICVkICBmcF9jcWUtPmxlbl9vbl9iZCA9ICVkXG4iLAorCQkJICBmcF9jcWUtPnBrdF9sZW4sIGxlbl9vbl9iZCk7CisJCWJueDJ4X3BhbmljKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbmRpZgorCisJLyogUnVuIHRocm91Z2ggdGhlIFNHTCBhbmQgY29tcG9zZSB0aGUgZnJhZ21lbnRlZCBza2IgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHBhZ2VzOyBpICs9IFBBR0VTX1BFUl9TR0UsIGorKykgeworCQl1MTYgc2dlX2lkeCA9IFJYX1NHRShsZTE2X3RvX2NwdShmcF9jcWUtPnNnbFtqXSkpOworCisJCS8qIEZXIGdpdmVzIHRoZSBpbmRpY2VzIG9mIHRoZSBTR0UgYXMgaWYgdGhlIHJpbmcgaXMgYW4gYXJyYXkKKwkJICAgKG1lYW5pbmcgdGhhdCAibmV4dCIgZWxlbWVudCB3aWxsIGNvbnN1bWUgMiBpbmRpY2VzKSAqLworCQlmcmFnX2xlbiA9IG1pbihmcmFnX3NpemUsICh1MzIpKFNHRV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSkpOworCQlyeF9wZyA9ICZmcC0+cnhfcGFnZV9yaW5nW3NnZV9pZHhdOworCQlvbGRfcnhfcGcgPSAqcnhfcGc7CisKKwkJLyogSWYgd2UgZmFpbCB0byBhbGxvY2F0ZSBhIHN1YnN0aXR1dGUgcGFnZSwgd2Ugc2ltcGx5IHN0b3AKKwkJICAgd2hlcmUgd2UgYXJlIGFuZCBkcm9wIHRoZSB3aG9sZSBwYWNrZXQgKi8KKwkJZXJyID0gYm54MnhfYWxsb2Nfcnhfc2dlKGJwLCBmcCwgc2dlX2lkeCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIFVubWFwIHRoZSBwYWdlIGFzIHdlIHIgZ29pbmcgdG8gcGFzcyBpdCB0byB0aGUgc3RhY2sgKi8KKwkJZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsCisJCQkgICAgICAgZG1hX3VubWFwX2FkZHIoJm9sZF9yeF9wZywgbWFwcGluZyksCisJCQkgICAgICAgU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCS8qIEFkZCBvbmUgZnJhZyBhbmQgdXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIHNrYiAqLworCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBqLCBvbGRfcnhfcGcucGFnZSwgMCwgZnJhZ19sZW4pOworCisJCXNrYi0+ZGF0YV9sZW4gKz0gZnJhZ19sZW47CisJCXNrYi0+dHJ1ZXNpemUgKz0gZnJhZ19sZW47CisJCXNrYi0+bGVuICs9IGZyYWdfbGVuOworCisJCWZyYWdfc2l6ZSAtPSBmcmFnX2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfdHBhX3N0b3Aoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKKwkJCSAgIHUxNiBxdWV1ZSwgaW50IHBhZCwgaW50IGxlbiwgdW5pb24gZXRoX3J4X2NxZSAqY3FlLAorCQkJICAgdTE2IGNxZV9pZHgpCit7CisJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnRwYV9wb29sW3F1ZXVlXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7CisJLyogYWxsb2MgbmV3IHNrYiAqLworCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBicC0+cnhfYnVmX3NpemUpOworCisJLyogVW5tYXAgc2tiIGluIHRoZSBwb29sIGFueXdheSwgYXMgd2UgYXJlIGdvaW5nIHRvIGNoYW5nZQorCSAgIHBvb2wgZW50cnkgc3RhdHVzIHRvIEJOWDJYX1RQQV9TVE9QIGV2ZW4gaWYgbmV3IHNrYiBhbGxvY2F0aW9uCisJICAgZmFpbHMuICovCisJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKKwkJCSBicC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAobGlrZWx5KG5ld19za2IpKSB7CisJCS8qIGZpeCBpcCB4c3VtIGFuZCBnaXZlIGl0IHRvIHRoZSBzdGFjayAqLworCQkvKiAobm8gbmVlZCB0byBtYXAgdGhlIG5ldyBza2IpICovCisjaWZkZWYgQkNNX1ZMQU4KKwkJaW50IGlzX3ZsYW5fY3FlID0KKwkJCShsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykgJgorCQkJIFBBUlNJTkdfRkxBR1NfVkxBTik7CisJCWludCBpc19ub3RfaHdhY2NlbF92bGFuX2NxZSA9CisJCQkoaXNfdmxhbl9jcWUgJiYgKCEoYnAtPmZsYWdzICYgSFdfVkxBTl9SWF9GTEFHKSkpOworI2VuZGlmCisKKwkJcHJlZmV0Y2goc2tiKTsKKwkJcHJlZmV0Y2goKChjaGFyICopKHNrYikpICsgMTI4KTsKKworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkJaWYgKHBhZCArIGxlbiA+IGJwLT5yeF9idWZfc2l6ZSkgeworCQkJQk5YMlhfRVJSKCJza2JfcHV0IGlzIGFib3V0IHRvIGZhaWwuLi4gICIKKwkJCQkgICJwYWQgJWQgIGxlbiAlZCAgcnhfYnVmX3NpemUgJWRcbiIsCisJCQkJICBwYWQsIGxlbiwgYnAtPnJ4X2J1Zl9zaXplKTsKKwkJCWJueDJ4X3BhbmljKCk7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZgorCisJCXNrYl9yZXNlcnZlKHNrYiwgcGFkKTsKKwkJc2tiX3B1dChza2IsIGxlbik7CisKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYnAtPmRldik7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwkJeworCQkJc3RydWN0IGlwaGRyICppcGg7CisKKwkJCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisjaWZkZWYgQkNNX1ZMQU4KKwkJCS8qIElmIHRoZXJlIGlzIG5vIFJ4IFZMQU4gb2ZmbG9hZGluZyAtCisJCQkgICB0YWtlIFZMQU4gdGFnIGludG8gYW4gYWNjb3VudCAqLworCQkJaWYgKHVubGlrZWx5KGlzX25vdF9od2FjY2VsX3ZsYW5fY3FlKSkKKwkJCQlpcGggPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKWlwaCArIFZMQU5fSExFTik7CisjZW5kaWYKKwkJCWlwaC0+Y2hlY2sgPSAwOworCQkJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodTggKilpcGgsIGlwaC0+aWhsKTsKKwkJfQorCisJCWlmICghYm54MnhfZmlsbF9mcmFnX3NrYihicCwgZnAsIHNrYiwKKwkJCQkJICZjcWUtPmZhc3RfcGF0aF9jcWUsIGNxZV9pZHgpKSB7CisjaWZkZWYgQkNNX1ZMQU4KKwkJCWlmICgoYnAtPnZsZ3JwICE9IE5VTEwpICYmIGlzX3ZsYW5fY3FlICYmCisJCQkgICAgKCFpc19ub3RfaHdhY2NlbF92bGFuX2NxZSkpCisJCQkJdmxhbl9ncm9fcmVjZWl2ZSgmZnAtPm5hcGksIGJwLT52bGdycCwKKwkJCQkJCSBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUuCisJCQkJCQkJICAgICB2bGFuX3RhZyksIHNrYik7CisJCQllbHNlCisjZW5kaWYKKwkJCQluYXBpX2dyb19yZWNlaXZlKCZmcC0+bmFwaSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBhZ2VzIgorCQkJICAgIiAtIGRyb3BwaW5nIHBhY2tldCFcbiIpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisKKworCQkvKiBwdXQgbmV3IHNrYiBpbiBiaW4gKi8KKwkJZnAtPnRwYV9wb29sW3F1ZXVlXS5za2IgPSBuZXdfc2tiOworCisJfSBlbHNlIHsKKwkJLyogZWxzZSBkcm9wIHRoZSBwYWNrZXQgYW5kIGtlZXAgdGhlIGJ1ZmZlciBpbiB0aGUgYmluICovCisJCURQKE5FVElGX01TR19SWF9TVEFUVVMsCisJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHNrYiAtIGRyb3BwaW5nIHBhY2tldCFcbiIpOworCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOworCX0KKworCWZwLT50cGFfc3RhdGVbcXVldWVdID0gQk5YMlhfVFBBX1NUT1A7Cit9CisKKy8qIFNldCBUb2VwbGl0eiBoYXNoIHZhbHVlIGluIHRoZSBza2IgdXNpbmcgdGhlIHZhbHVlIGZyb20gdGhlCisgKiBDUUUgKGNhbGN1bGF0ZWQgYnkgSFcpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3NrYl9yeGhhc2goc3RydWN0IGJueDJ4ICpicCwgdW5pb24gZXRoX3J4X2NxZSAqY3FlLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFNldCBUb2VwbGl0eiBoYXNoIGZyb20gQ1FFICovCisJaWYgKChicC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKSAmJgorCSAgICAoY3FlLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncyAmCisJICAgICBFVEhfRkFTVF9QQVRIX1JYX0NRRV9SU1NfSEFTSF9GTEcpKQorCQlza2ItPnJ4aGFzaCA9CisJCWxlMzJfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5yc3NfaGFzaF9yZXN1bHQpOworfQorCitpbnQgYm54MnhfcnhfaW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIGludCBidWRnZXQpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKKwl1MTYgYmRfY29ucywgYmRfcHJvZCwgYmRfcHJvZF9mdywgY29tcF9yaW5nX2NvbnM7CisJdTE2IGh3X2NvbXBfY29ucywgc3dfY29tcF9jb25zLCBzd19jb21wX3Byb2Q7CisJaW50IHJ4X3BrdCA9IDA7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCXJldHVybiAwOworI2VuZGlmCisKKwkvKiBDUSAibmV4dCBlbGVtZW50IiBpcyBvZiB0aGUgc2l6ZSBvZiB0aGUgcmVndWxhciBlbGVtZW50LAorCSAgIHRoYXQncyB3aHkgaXQncyBvayBoZXJlICovCisJaHdfY29tcF9jb25zID0gbGUxNl90b19jcHUoKmZwLT5yeF9jb25zX3NiKTsKKwlpZiAoKGh3X2NvbXBfY29ucyAmIE1BWF9SQ1FfREVTQ19DTlQpID09IE1BWF9SQ1FfREVTQ19DTlQpCisJCWh3X2NvbXBfY29ucysrOworCisJYmRfY29ucyA9IGZwLT5yeF9iZF9jb25zOworCWJkX3Byb2QgPSBmcC0+cnhfYmRfcHJvZDsKKwliZF9wcm9kX2Z3ID0gYmRfcHJvZDsKKwlzd19jb21wX2NvbnMgPSBmcC0+cnhfY29tcF9jb25zOworCXN3X2NvbXBfcHJvZCA9IGZwLT5yeF9jb21wX3Byb2Q7CisKKwkvKiBNZW1vcnkgYmFycmllciBuZWNlc3NhcnkgYXMgc3BlY3VsYXRpdmUgcmVhZHMgb2YgdGhlIHJ4CisJICogYnVmZmVyIGNhbiBiZSBhaGVhZCBvZiB0aGUgaW5kZXggaW4gdGhlIHN0YXR1cyBibG9jaworCSAqLworCXJtYigpOworCisJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKKwkgICAicXVldWVbJWRdOiAgaHdfY29tcF9jb25zICV1ICBzd19jb21wX2NvbnMgJXVcbiIsCisJICAgZnAtPmluZGV4LCBod19jb21wX2NvbnMsIHN3X2NvbXBfY29ucyk7CisKKwl3aGlsZSAoc3dfY29tcF9jb25zICE9IGh3X2NvbXBfY29ucykgeworCQlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZiA9IE5VTEw7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuaW9uIGV0aF9yeF9jcWUgKmNxZTsKKwkJdTggY3FlX2ZwX2ZsYWdzOworCQl1MTYgbGVuLCBwYWQ7CisKKwkJY29tcF9yaW5nX2NvbnMgPSBSQ1FfQkQoc3dfY29tcF9jb25zKTsKKwkJYmRfcHJvZCA9IFJYX0JEKGJkX3Byb2QpOworCQliZF9jb25zID0gUlhfQkQoYmRfY29ucyk7CisKKwkJLyogUHJlZmV0Y2ggdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgQkQgZGVzY3JpcHRvcgorCQkgICBhdCBwcm9kdWNlcidzIGluZGV4LiBJdCB3aWxsIGJlIG5lZWRlZCB3aGVuIG5ldyBza2IgaXMKKwkJICAgYWxsb2NhdGVkICovCisJCXByZWZldGNoKCh2b2lkICopKFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpCisJCQkJCSAgICAgKCZmcC0+cnhfZGVzY19yaW5nW2JkX3Byb2RdKSkgLQorCQkJCSAgUEFHRV9TSVpFICsgMSkpOworCisJCWNxZSA9ICZmcC0+cnhfY29tcF9yaW5nW2NvbXBfcmluZ19jb25zXTsKKwkJY3FlX2ZwX2ZsYWdzID0gY3FlLT5mYXN0X3BhdGhfY3FlLnR5cGVfZXJyb3JfZmxhZ3M7CisKKwkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgIkNRRSB0eXBlICV4ICBlcnIgJXggIHN0YXR1cyAleCIKKwkJICAgIiAgcXVldWUgJXggIHZsYW4gJXggIGxlbiAldVxuIiwgQ1FFX1RZUEUoY3FlX2ZwX2ZsYWdzKSwKKwkJICAgY3FlX2ZwX2ZsYWdzLCBjcWUtPmZhc3RfcGF0aF9jcWUuc3RhdHVzX2ZsYWdzLAorCQkgICBsZTMyX3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucnNzX2hhc2hfcmVzdWx0KSwKKwkJICAgbGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnZsYW5fdGFnKSwKKwkJICAgbGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnBrdF9sZW4pKTsKKworCQkvKiBpcyB0aGlzIGEgc2xvd3BhdGggbXNnPyAqLworCQlpZiAodW5saWtlbHkoQ1FFX1RZUEUoY3FlX2ZwX2ZsYWdzKSkpIHsKKwkJCWJueDJ4X3NwX2V2ZW50KGZwLCBjcWUpOworCQkJZ290byBuZXh0X2NxZTsKKworCQkvKiB0aGlzIGlzIGFuIHJ4IHBhY2tldCAqLworCQl9IGVsc2UgeworCQkJcnhfYnVmID0gJmZwLT5yeF9idWZfcmluZ1tiZF9jb25zXTsKKwkJCXNrYiA9IHJ4X2J1Zi0+c2tiOworCQkJcHJlZmV0Y2goc2tiKTsKKwkJCWxlbiA9IGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wa3RfbGVuKTsKKwkJCXBhZCA9IGNxZS0+ZmFzdF9wYXRoX2NxZS5wbGFjZW1lbnRfb2Zmc2V0OworCisJCQkvKiBJZiBDUUUgaXMgbWFya2VkIGJvdGggVFBBX1NUQVJUIGFuZCBUUEFfRU5ECisJCQkgICBpdCBpcyBhIG5vbi1UUEEgQ1FFICovCisJCQlpZiAoKCFmcC0+ZGlzYWJsZV90cGEpICYmCisJCQkgICAgKFRQQV9UWVBFKGNxZV9mcF9mbGFncykgIT0KKwkJCQkJKFRQQV9UWVBFX1NUQVJUIHwgVFBBX1RZUEVfRU5EKSkpIHsKKwkJCQl1MTYgcXVldWUgPSBjcWUtPmZhc3RfcGF0aF9jcWUucXVldWVfaW5kZXg7CisKKwkJCQlpZiAoVFBBX1RZUEUoY3FlX2ZwX2ZsYWdzKSA9PSBUUEFfVFlQRV9TVEFSVCkgeworCQkJCQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAorCQkJCQkgICAiY2FsbGluZyB0cGFfc3RhcnQgb24gcXVldWUgJWRcbiIsCisJCQkJCSAgIHF1ZXVlKTsKKworCQkJCQlibngyeF90cGFfc3RhcnQoZnAsIHF1ZXVlLCBza2IsCisJCQkJCQkJYmRfY29ucywgYmRfcHJvZCk7CisKKwkJCQkJLyogU2V0IFRvZXBsaXR6IGhhc2ggZm9yIGFuIExSTyBza2IgKi8KKwkJCQkJYm54Mnhfc2V0X3NrYl9yeGhhc2goYnAsIGNxZSwgc2tiKTsKKworCQkJCQlnb3RvIG5leHRfcng7CisJCQkJfQorCisJCQkJaWYgKFRQQV9UWVBFKGNxZV9mcF9mbGFncykgPT0gVFBBX1RZUEVfRU5EKSB7CisJCQkJCURQKE5FVElGX01TR19SWF9TVEFUVVMsCisJCQkJCSAgICJjYWxsaW5nIHRwYV9zdG9wIG9uIHF1ZXVlICVkXG4iLAorCQkJCQkgICBxdWV1ZSk7CisKKwkJCQkJaWYgKCFCTlgyWF9SWF9TVU1fRklYKGNxZSkpCisJCQkJCQlCTlgyWF9FUlIoIlNUT1Agb24gbm9uZSBUQ1AgIgorCQkJCQkJCSAgImRhdGFcbiIpOworCisJCQkJCS8qIFRoaXMgaXMgYSBzaXplIG9mIHRoZSBsaW5lYXIgZGF0YQorCQkJCQkgICBvbiB0aGlzIHNrYiAqLworCQkJCQlsZW4gPSBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUuCisJCQkJCQkJCWxlbl9vbl9iZCk7CisJCQkJCWJueDJ4X3RwYV9zdG9wKGJwLCBmcCwgcXVldWUsIHBhZCwKKwkJCQkJCSAgICBsZW4sIGNxZSwgY29tcF9yaW5nX2NvbnMpOworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkJCQkJaWYgKGJwLT5wYW5pYykKKwkJCQkJCXJldHVybiAwOworI2VuZGlmCisKKwkJCQkJYm54MnhfdXBkYXRlX3NnZV9wcm9kKGZwLAorCQkJCQkJCSZjcWUtPmZhc3RfcGF0aF9jcWUpOworCQkJCQlnb3RvIG5leHRfY3FlOworCQkJCX0KKwkJCX0KKworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoJmJwLT5wZGV2LT5kZXYsCisJCQkJCWRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCisJCQkJCQkgICBwYWQgKyBSWF9DT1BZX1RIUkVTSCwKKwkJCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7CisJCQlwcmVmZXRjaCgoKGNoYXIgKikoc2tiKSkgKyAxMjgpOworCisJCQkvKiBpcyB0aGlzIGFuIGVycm9yIHBhY2tldD8gKi8KKwkJCWlmICh1bmxpa2VseShjcWVfZnBfZmxhZ3MgJiBFVEhfUlhfRVJST1JfRkFMR1MpKSB7CisJCQkJRFAoTkVUSUZfTVNHX1JYX0VSUiwKKwkJCQkgICAiRVJST1IgIGZsYWdzICV4ICByeCBwYWNrZXQgJXVcbiIsCisJCQkJICAgY3FlX2ZwX2ZsYWdzLCBzd19jb21wX2NvbnMpOworCQkJCWZwLT5ldGhfcV9zdGF0cy5yeF9lcnJfZGlzY2FyZF9wa3QrKzsKKwkJCQlnb3RvIHJldXNlX3J4OworCQkJfQorCisJCQkvKiBTaW5jZSB3ZSBkb24ndCBoYXZlIGEganVtYm8gcmluZworCQkJICogY29weSBzbWFsbCBwYWNrZXRzIGlmIG10dSA+IDE1MDAKKwkJCSAqLworCQkJaWYgKChicC0+ZGV2LT5tdHUgPiBFVEhfTUFYX1BBQ0tFVF9TSVpFKSAmJgorCQkJICAgIChsZW4gPD0gUlhfQ09QWV9USFJFU0gpKSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJCQluZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LAorCQkJCQkJCSAgIGxlbiArIHBhZCk7CisJCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCQlEUChORVRJRl9NU0dfUlhfRVJSLAorCQkJCQkgICAiRVJST1IgIHBhY2tldCBkcm9wcGVkICIKKwkJCQkJICAgImJlY2F1c2Ugb2YgYWxsb2MgZmFpbHVyZVxuIik7CisJCQkJCWZwLT5ldGhfcV9zdGF0cy5yeF9za2JfYWxsb2NfZmFpbGVkKys7CisJCQkJCWdvdG8gcmV1c2Vfcng7CisJCQkJfQorCisJCQkJLyogYWxpZ25lZCBjb3B5ICovCisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBwYWQsCisJCQkJCQkgICAgbmV3X3NrYi0+ZGF0YSArIHBhZCwgbGVuKTsKKwkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBwYWQpOworCQkJCXNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKworCQkJCWJueDJ4X3JldXNlX3J4X3NrYihmcCwgc2tiLCBiZF9jb25zLCBiZF9wcm9kKTsKKworCQkJCXNrYiA9IG5ld19za2I7CisKKwkJCX0gZWxzZQorCQkJaWYgKGxpa2VseShibngyeF9hbGxvY19yeF9za2IoYnAsIGZwLCBiZF9wcm9kKSA9PSAwKSkgeworCQkJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsCisJCQkJCWRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCisJCQkJCQkgYnAtPnJ4X2J1Zl9zaXplLAorCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBwYWQpOworCQkJCXNrYl9wdXQoc2tiLCBsZW4pOworCisJCQl9IGVsc2UgeworCQkJCURQKE5FVElGX01TR19SWF9FUlIsCisJCQkJICAgIkVSUk9SICBwYWNrZXQgZHJvcHBlZCBiZWNhdXNlICIKKwkJCQkgICAib2YgYWxsb2MgZmFpbHVyZVxuIik7CisJCQkJZnAtPmV0aF9xX3N0YXRzLnJ4X3NrYl9hbGxvY19mYWlsZWQrKzsKK3JldXNlX3J4OgorCQkJCWJueDJ4X3JldXNlX3J4X3NrYihmcCwgc2tiLCBiZF9jb25zLCBiZF9wcm9kKTsKKwkJCQlnb3RvIG5leHRfcng7CisJCQl9CisKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCisJCQkvKiBTZXQgVG9lcGxpdHogaGFzaCBmb3IgYSBub25lLUxSTyBza2IgKi8KKwkJCWJueDJ4X3NldF9za2JfcnhoYXNoKGJwLCBjcWUsIHNrYik7CisKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCWlmIChicC0+cnhfY3N1bSkgeworCQkJCWlmIChsaWtlbHkoQk5YMlhfUlhfQ1NVTV9PSyhjcWUpKSkKKwkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQllbHNlCisJCQkJCWZwLT5ldGhfcV9zdGF0cy5od19jc3VtX2VycisrOworCQkJfQorCQl9CisKKwkJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIGZwLT5pbmRleCk7CisKKyNpZmRlZiBCQ01fVkxBTgorCQlpZiAoKGJwLT52bGdycCAhPSBOVUxMKSAmJiAoYnAtPmZsYWdzICYgSFdfVkxBTl9SWF9GTEFHKSAmJgorCQkgICAgKGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wYXJzX2ZsYWdzLmZsYWdzKSAmCisJCSAgICAgUEFSU0lOR19GTEFHU19WTEFOKSkKKwkJCXZsYW5fZ3JvX3JlY2VpdmUoJmZwLT5uYXBpLCBicC0+dmxncnAsCisJCQkJbGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnZsYW5fdGFnKSwgc2tiKTsKKwkJZWxzZQorI2VuZGlmCisJCQluYXBpX2dyb19yZWNlaXZlKCZmcC0+bmFwaSwgc2tiKTsKKworCituZXh0X3J4OgorCQlyeF9idWYtPnNrYiA9IE5VTEw7CisKKwkJYmRfY29ucyA9IE5FWFRfUlhfSURYKGJkX2NvbnMpOworCQliZF9wcm9kID0gTkVYVF9SWF9JRFgoYmRfcHJvZCk7CisJCWJkX3Byb2RfZncgPSBORVhUX1JYX0lEWChiZF9wcm9kX2Z3KTsKKwkJcnhfcGt0Kys7CituZXh0X2NxZToKKwkJc3dfY29tcF9wcm9kID0gTkVYVF9SQ1FfSURYKHN3X2NvbXBfcHJvZCk7CisJCXN3X2NvbXBfY29ucyA9IE5FWFRfUkNRX0lEWChzd19jb21wX2NvbnMpOworCisJCWlmIChyeF9wa3QgPT0gYnVkZ2V0KQorCQkJYnJlYWs7CisJfSAvKiB3aGlsZSAqLworCisJZnAtPnJ4X2JkX2NvbnMgPSBiZF9jb25zOworCWZwLT5yeF9iZF9wcm9kID0gYmRfcHJvZF9mdzsKKwlmcC0+cnhfY29tcF9jb25zID0gc3dfY29tcF9jb25zOworCWZwLT5yeF9jb21wX3Byb2QgPSBzd19jb21wX3Byb2Q7CisKKwkvKiBVcGRhdGUgcHJvZHVjZXJzICovCisJYm54MnhfdXBkYXRlX3J4X3Byb2QoYnAsIGZwLCBiZF9wcm9kX2Z3LCBzd19jb21wX3Byb2QsCisJCQkgICAgIGZwLT5yeF9zZ2VfcHJvZCk7CisKKwlmcC0+cnhfcGt0ICs9IHJ4X3BrdDsKKwlmcC0+cnhfY2FsbHMrKzsKKworCXJldHVybiByeF9wa3Q7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibngyeF9tc2l4X2ZwX2ludChpbnQgaXJxLCB2b2lkICpmcF9jb29raWUpCit7CisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9IGZwX2Nvb2tpZTsKKwlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOworCisJLyogUmV0dXJuIGhlcmUgaWYgaW50ZXJydXB0IGlzIGRpc2FibGVkICovCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZicC0+aW50cl9zZW0pICE9IDApKSB7CisJCURQKE5FVElGX01TR19JTlRSLCAiY2FsbGVkIGJ1dCBpbnRyX3NlbSBub3QgMCwgcmV0dXJuaW5nXG4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCURQKEJOWDJYX01TR19GUCwgImdvdCBhbiBNU0ktWCBpbnRlcnJ1cHQgb24gSURYOlNCIFslZDolZF1cbiIsCisJICAgZnAtPmluZGV4LCBmcC0+c2JfaWQpOworCWJueDJ4X2Fja19zYihicCwgZnAtPnNiX2lkLCBVU1RPUk1fSUQsIDAsIElHVV9JTlRfRElTQUJMRSwgMCk7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCXJldHVybiBJUlFfSEFORExFRDsKKyNlbmRpZgorCisJLyogSGFuZGxlIFJ4IGFuZCBUeCBhY2NvcmRpbmcgdG8gTVNJLVggdmVjdG9yICovCisJcHJlZmV0Y2goZnAtPnJ4X2NvbnNfc2IpOworCXByZWZldGNoKGZwLT50eF9jb25zX3NiKTsKKwlwcmVmZXRjaCgmZnAtPnN0YXR1c19ibGstPnVfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleCk7CisJcHJlZmV0Y2goJmZwLT5zdGF0dXNfYmxrLT5jX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpOworCW5hcGlfc2NoZWR1bGUoJmJueDJ4X2ZwKGJwLCBmcC0+aW5kZXgsIG5hcGkpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiBIVyBMb2NrIGZvciBzaGFyZWQgZHVhbCBwb3J0IFBIWXMgKi8KK3ZvaWQgYm54MnhfYWNxdWlyZV9waHlfbG9jayhzdHJ1Y3QgYm54MnggKmJwKQoreworCW11dGV4X2xvY2soJmJwLT5wb3J0LnBoeV9tdXRleCk7CisKKwlpZiAoYnAtPnBvcnQubmVlZF9od19sb2NrKQorCQlibngyeF9hY3F1aXJlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfTURJTyk7Cit9CisKK3ZvaWQgYm54MnhfcmVsZWFzZV9waHlfbG9jayhzdHJ1Y3QgYm54MnggKmJwKQoreworCWlmIChicC0+cG9ydC5uZWVkX2h3X2xvY2spCisJCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9NRElPKTsKKworCW11dGV4X3VubG9jaygmYnAtPnBvcnQucGh5X211dGV4KTsKK30KKwordm9pZCBibngyeF9saW5rX3JlcG9ydChzdHJ1Y3QgYm54MnggKmJwKQoreworCWlmIChicC0+ZmxhZ3MgJiBNRl9GVU5DX0RJUykgeworCQluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKKwkJbmV0ZGV2X2VycihicC0+ZGV2LCAiTklDIExpbmsgaXMgRG93blxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYnAtPmxpbmtfdmFycy5saW5rX3VwKSB7CisJCXUxNiBsaW5lX3NwZWVkOworCisJCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikKKwkJCW5ldGlmX2NhcnJpZXJfb24oYnAtPmRldik7CisJCW5ldGRldl9pbmZvKGJwLT5kZXYsICJOSUMgTGluayBpcyBVcCwgIik7CisKKwkJbGluZV9zcGVlZCA9IGJwLT5saW5rX3ZhcnMubGluZV9zcGVlZDsKKwkJaWYgKElTX0UxSE1GKGJwKSkgeworCQkJdTE2IHZuX21heF9yYXRlOworCisJCQl2bl9tYXhfcmF0ZSA9CisJCQkJKChicC0+bWZfY29uZmlnICYgRlVOQ19NRl9DRkdfTUFYX0JXX01BU0spID4+CisJCQkJIEZVTkNfTUZfQ0ZHX01BWF9CV19TSElGVCkgKiAxMDA7CisJCQlpZiAodm5fbWF4X3JhdGUgPCBsaW5lX3NwZWVkKQorCQkJCWxpbmVfc3BlZWQgPSB2bl9tYXhfcmF0ZTsKKwkJfQorCQlwcl9jb250KCIlZCBNYnBzICIsIGxpbmVfc3BlZWQpOworCisJCWlmIChicC0+bGlua192YXJzLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCXByX2NvbnQoImZ1bGwgZHVwbGV4Iik7CisJCWVsc2UKKwkJCXByX2NvbnQoImhhbGYgZHVwbGV4Iik7CisKKwkJaWYgKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICE9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FKSB7CisJCQlpZiAoYnAtPmxpbmtfdmFycy5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfUlgpIHsKKwkJCQlwcl9jb250KCIsIHJlY2VpdmUgIik7CisJCQkJaWYgKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICYKKwkJCQkgICAgQk5YMlhfRkxPV19DVFJMX1RYKQorCQkJCQlwcl9jb250KCImIHRyYW5zbWl0ICIpOworCQkJfSBlbHNlIHsKKwkJCQlwcl9jb250KCIsIHRyYW5zbWl0ICIpOworCQkJfQorCQkJcHJfY29udCgiZmxvdyBjb250cm9sIE9OIik7CisJCX0KKwkJcHJfY29udCgiXG4iKTsKKworCX0gZWxzZSB7IC8qIGxpbmtfZG93biAqLworCQluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKKwkJbmV0ZGV2X2VycihicC0+ZGV2LCAiTklDIExpbmsgaXMgRG93blxuIik7CisJfQorfQorCit2b2lkIGJueDJ4X2luaXRfcnhfcmluZ3Moc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCWludCBtYXhfYWdnX3F1ZXVlcyA9IENISVBfSVNfRTEoYnApID8gRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTEgOgorCQkJCQkgICAgICBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUg7CisJdTE2IHJpbmdfcHJvZCwgY3FlX3JpbmdfcHJvZDsKKwlpbnQgaSwgajsKKworCWJwLT5yeF9idWZfc2l6ZSA9IGJwLT5kZXYtPm10dSArIEVUSF9PVlJFSEVBRCArIEJOWDJYX1JYX0FMSUdOOworCURQKE5FVElGX01TR19JRlVQLAorCSAgICJtdHUgJWQgIHJ4X2J1Zl9zaXplICVkXG4iLCBicC0+ZGV2LT5tdHUsIGJwLT5yeF9idWZfc2l6ZSk7CisKKwlpZiAoYnAtPmZsYWdzICYgVFBBX0VOQUJMRV9GTEFHKSB7CisKKwkJZm9yX2VhY2hfcXVldWUoYnAsIGopIHsKKwkJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2pdOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2FnZ19xdWV1ZXM7IGkrKykgeworCQkJCWZwLT50cGFfcG9vbFtpXS5za2IgPQorCQkJCSAgIG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwgYnAtPnJ4X2J1Zl9zaXplKTsKKwkJCQlpZiAoIWZwLT50cGFfcG9vbFtpXS5za2IpIHsKKwkJCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgVFBBICIKKwkJCQkJCSAgInNrYiBwb29sIGZvciBxdWV1ZVslZF0gLSAiCisJCQkJCQkgICJkaXNhYmxpbmcgVFBBIG9uIHRoaXMgIgorCQkJCQkJICAicXVldWUhXG4iLCBqKTsKKwkJCQkJYm54MnhfZnJlZV90cGFfcG9vbChicCwgZnAsIGkpOworCQkJCQlmcC0+ZGlzYWJsZV90cGEgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZG1hX3VubWFwX2FkZHJfc2V0KChzdHJ1Y3Qgc3dfcnhfYmQgKikKKwkJCQkJCQkmYnAtPmZwLT50cGFfcG9vbFtpXSwKKwkJCQkJCSAgIG1hcHBpbmcsIDApOworCQkJCWZwLT50cGFfc3RhdGVbaV0gPSBCTlgyWF9UUEFfU1RPUDsKKwkJCX0KKwkJfQorCX0KKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBqKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2pdOworCisJCWZwLT5yeF9iZF9jb25zID0gMDsKKwkJZnAtPnJ4X2NvbnNfc2IgPSBCTlgyWF9SWF9TQl9JTkRFWDsKKwkJZnAtPnJ4X2JkX2NvbnNfc2IgPSBCTlgyWF9SWF9TQl9CRF9JTkRFWDsKKworCQkvKiAibmV4dCBwYWdlIiBlbGVtZW50cyBpbml0aWFsaXphdGlvbiAqLworCQkvKiBTR0UgcmluZyAqLworCQlmb3IgKGkgPSAxOyBpIDw9IE5VTV9SWF9TR0VfUEFHRVM7IGkrKykgeworCQkJc3RydWN0IGV0aF9yeF9zZ2UgKnNnZTsKKworCQkJc2dlID0gJmZwLT5yeF9zZ2VfcmluZ1tSWF9TR0VfQ05UICogaSAtIDJdOworCQkJc2dlLT5hZGRyX2hpID0KKwkJCQljcHVfdG9fbGUzMihVNjRfSEkoZnAtPnJ4X3NnZV9tYXBwaW5nICsKKwkJCQkJQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SWF9TR0VfUEFHRVMpKSk7CisJCQlzZ2UtPmFkZHJfbG8gPQorCQkJCWNwdV90b19sZTMyKFU2NF9MTyhmcC0+cnhfc2dlX21hcHBpbmcgKworCQkJCQlCQ01fUEFHRV9TSVpFKihpICUgTlVNX1JYX1NHRV9QQUdFUykpKTsKKwkJfQorCisJCWJueDJ4X2luaXRfc2dlX3JpbmdfYml0X21hc2soZnApOworCisJCS8qIFJYIEJEIHJpbmcgKi8KKwkJZm9yIChpID0gMTsgaSA8PSBOVU1fUlhfUklOR1M7IGkrKykgeworCQkJc3RydWN0IGV0aF9yeF9iZCAqcnhfYmQ7CisKKwkJCXJ4X2JkID0gJmZwLT5yeF9kZXNjX3JpbmdbUlhfREVTQ19DTlQgKiBpIC0gMl07CisJCQlyeF9iZC0+YWRkcl9oaSA9CisJCQkJY3B1X3RvX2xlMzIoVTY0X0hJKGZwLT5yeF9kZXNjX21hcHBpbmcgKworCQkJCQkgICAgQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SWF9SSU5HUykpKTsKKwkJCXJ4X2JkLT5hZGRyX2xvID0KKwkJCQljcHVfdG9fbGUzMihVNjRfTE8oZnAtPnJ4X2Rlc2NfbWFwcGluZyArCisJCQkJCSAgICBCQ01fUEFHRV9TSVpFKihpICUgTlVNX1JYX1JJTkdTKSkpOworCQl9CisKKwkJLyogQ1EgcmluZyAqLworCQlmb3IgKGkgPSAxOyBpIDw9IE5VTV9SQ1FfUklOR1M7IGkrKykgeworCQkJc3RydWN0IGV0aF9yeF9jcWVfbmV4dF9wYWdlICpuZXh0cGc7CisKKwkJCW5leHRwZyA9IChzdHJ1Y3QgZXRoX3J4X2NxZV9uZXh0X3BhZ2UgKikKKwkJCQkmZnAtPnJ4X2NvbXBfcmluZ1tSQ1FfREVTQ19DTlQgKiBpIC0gMV07CisJCQluZXh0cGctPmFkZHJfaGkgPQorCQkJCWNwdV90b19sZTMyKFU2NF9ISShmcC0+cnhfY29tcF9tYXBwaW5nICsKKwkJCQkJICAgQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SQ1FfUklOR1MpKSk7CisJCQluZXh0cGctPmFkZHJfbG8gPQorCQkJCWNwdV90b19sZTMyKFU2NF9MTyhmcC0+cnhfY29tcF9tYXBwaW5nICsKKwkJCQkJICAgQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SQ1FfUklOR1MpKSk7CisJCX0KKworCQkvKiBBbGxvY2F0ZSBTR0VzIGFuZCBpbml0aWFsaXplIHRoZSByaW5nIGVsZW1lbnRzICovCisJCWZvciAoaSA9IDAsIHJpbmdfcHJvZCA9IDA7CisJCSAgICAgaSA8IE1BWF9SWF9TR0VfQ05UKk5VTV9SWF9TR0VfUEFHRVM7IGkrKykgeworCisJCQlpZiAoYm54MnhfYWxsb2Nfcnhfc2dlKGJwLCBmcCwgcmluZ19wcm9kKSA8IDApIHsKKwkJCQlCTlgyWF9FUlIoIndhcyBvbmx5IGFibGUgdG8gYWxsb2NhdGUgIgorCQkJCQkgICIlZCByeCBzZ2VzXG4iLCBpKTsKKwkJCQlCTlgyWF9FUlIoImRpc2FibGluZyBUUEEgZm9yIHF1ZXVlWyVkXVxuIiwgaik7CisJCQkJLyogQ2xlYW51cCBhbHJlYWR5IGFsbG9jYXRlZCBlbGVtZW50cyAqLworCQkJCWJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKGJwLCBmcCwgcmluZ19wcm9kKTsKKwkJCQlibngyeF9mcmVlX3RwYV9wb29sKGJwLCBmcCwgbWF4X2FnZ19xdWV1ZXMpOworCQkJCWZwLT5kaXNhYmxlX3RwYSA9IDE7CisJCQkJcmluZ19wcm9kID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJpbmdfcHJvZCA9IE5FWFRfU0dFX0lEWChyaW5nX3Byb2QpOworCQl9CisJCWZwLT5yeF9zZ2VfcHJvZCA9IHJpbmdfcHJvZDsKKworCQkvKiBBbGxvY2F0ZSBCRHMgYW5kIGluaXRpYWxpemUgQkQgcmluZyAqLworCQlmcC0+cnhfY29tcF9jb25zID0gMDsKKwkJY3FlX3JpbmdfcHJvZCA9IHJpbmdfcHJvZCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBicC0+cnhfcmluZ19zaXplOyBpKyspIHsKKwkJCWlmIChibngyeF9hbGxvY19yeF9za2IoYnAsIGZwLCByaW5nX3Byb2QpIDwgMCkgeworCQkJCUJOWDJYX0VSUigid2FzIG9ubHkgYWJsZSB0byBhbGxvY2F0ZSAiCisJCQkJCSAgIiVkIHJ4IHNrYnMgb24gcXVldWVbJWRdXG4iLCBpLCBqKTsKKwkJCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJcmluZ19wcm9kID0gTkVYVF9SWF9JRFgocmluZ19wcm9kKTsKKwkJCWNxZV9yaW5nX3Byb2QgPSBORVhUX1JDUV9JRFgoY3FlX3JpbmdfcHJvZCk7CisJCQlXQVJOX09OKHJpbmdfcHJvZCA8PSBpKTsKKwkJfQorCisJCWZwLT5yeF9iZF9wcm9kID0gcmluZ19wcm9kOworCQkvKiBtdXN0IG5vdCBoYXZlIG1vcmUgYXZhaWxhYmxlIENRRXMgdGhhbiBCRHMgKi8KKwkJZnAtPnJ4X2NvbXBfcHJvZCA9IG1pbl90KHUxNiwgTlVNX1JDUV9SSU5HUypSQ1FfREVTQ19DTlQsCisJCQkJCSBjcWVfcmluZ19wcm9kKTsKKwkJZnAtPnJ4X3BrdCA9IGZwLT5yeF9jYWxscyA9IDA7CisKKwkJLyogV2FybmluZyEKKwkJICogdGhpcyB3aWxsIGdlbmVyYXRlIGFuIGludGVycnVwdCAodG8gdGhlIFRTVE9STSkKKwkJICogbXVzdCBvbmx5IGJlIGRvbmUgYWZ0ZXIgY2hpcCBpcyBpbml0aWFsaXplZAorCQkgKi8KKwkJYm54MnhfdXBkYXRlX3J4X3Byb2QoYnAsIGZwLCByaW5nX3Byb2QsIGZwLT5yeF9jb21wX3Byb2QsCisJCQkJICAgICBmcC0+cnhfc2dlX3Byb2QpOworCQlpZiAoaiAhPSAwKQorCQkJY29udGludWU7CisKKwkJUkVHX1dSKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkgICAgICAgVVNUT1JNX01FTV9XT1JLQVJPVU5EX0FERFJFU1NfT0ZGU0VUKGZ1bmMpLAorCQkgICAgICAgVTY0X0xPKGZwLT5yeF9jb21wX21hcHBpbmcpKTsKKwkJUkVHX1dSKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkgICAgICAgVVNUT1JNX01FTV9XT1JLQVJPVU5EX0FERFJFU1NfT0ZGU0VUKGZ1bmMpICsgNCwKKwkJICAgICAgIFU2NF9ISShmcC0+cnhfY29tcF9tYXBwaW5nKSk7CisJfQorfQorc3RhdGljIHZvaWQgYm54MnhfZnJlZV90eF9za2JzKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKKworCQl1MTYgYmRfY29ucyA9IGZwLT50eF9iZF9jb25zOworCQl1MTYgc3dfcHJvZCA9IGZwLT50eF9wa3RfcHJvZDsKKwkJdTE2IHN3X2NvbnMgPSBmcC0+dHhfcGt0X2NvbnM7CisKKwkJd2hpbGUgKHN3X2NvbnMgIT0gc3dfcHJvZCkgeworCQkJYmRfY29ucyA9IGJueDJ4X2ZyZWVfdHhfcGt0KGJwLCBmcCwgVFhfQkQoc3dfY29ucykpOworCQkJc3dfY29ucysrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9mcmVlX3J4X3NrYnMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaSwgajsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBqKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2pdOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQkQ7IGkrKykgeworCQkJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnJ4X2J1Zl9yaW5nW2ldOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4X2J1Zi0+c2tiOworCisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsCisJCQkJCSBkbWFfdW5tYXBfYWRkcihyeF9idWYsIG1hcHBpbmcpLAorCQkJCQkgYnAtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCQlyeF9idWYtPnNrYiA9IE5VTEw7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJaWYgKCFmcC0+ZGlzYWJsZV90cGEpCisJCQlibngyeF9mcmVlX3RwYV9wb29sKGJwLCBmcCwgQ0hJUF9JU19FMShicCkgPworCQkJCQkgICAgRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTEgOgorCQkJCQkgICAgRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIKTsKKwl9Cit9CisKK3ZvaWQgYm54MnhfZnJlZV9za2JzKHN0cnVjdCBibngyeCAqYnApCit7CisJYm54MnhfZnJlZV90eF9za2JzKGJwKTsKKwlibngyeF9mcmVlX3J4X3NrYnMoYnApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9mcmVlX21zaXhfaXJxcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpLCBvZmZzZXQgPSAxOworCisJZnJlZV9pcnEoYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yLCBicC0+ZGV2KTsKKwlEUChORVRJRl9NU0dfSUZET1dOLCAicmVsZWFzZWQgc3AgaXJxICglZClcbiIsCisJICAgYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yKTsKKworI2lmZGVmIEJDTV9DTklDCisJb2Zmc2V0Kys7CisjZW5kaWYKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlEUChORVRJRl9NU0dfSUZET1dOLCAiYWJvdXQgdG8gcmVsZWFzZSBmcCAjJWQtPiVkIGlycSAgIgorCQkgICAic3RhdGUgJXhcbiIsIGksIGJwLT5tc2l4X3RhYmxlW2kgKyBvZmZzZXRdLnZlY3RvciwKKwkJICAgYm54MnhfZnAoYnAsIGksIHN0YXRlKSk7CisKKwkJZnJlZV9pcnEoYnAtPm1zaXhfdGFibGVbaSArIG9mZnNldF0udmVjdG9yLCAmYnAtPmZwW2ldKTsKKwl9Cit9CisKK3ZvaWQgYm54MnhfZnJlZV9pcnEoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBkaXNhYmxlX29ubHkpCit7CisJaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgeworCQlpZiAoIWRpc2FibGVfb25seSkKKwkJCWJueDJ4X2ZyZWVfbXNpeF9pcnFzKGJwKTsKKwkJcGNpX2Rpc2FibGVfbXNpeChicC0+cGRldik7CisJCWJwLT5mbGFncyAmPSB+VVNJTkdfTVNJWF9GTEFHOworCisJfSBlbHNlIGlmIChicC0+ZmxhZ3MgJiBVU0lOR19NU0lfRkxBRykgeworCQlpZiAoIWRpc2FibGVfb25seSkKKwkJCWZyZWVfaXJxKGJwLT5wZGV2LT5pcnEsIGJwLT5kZXYpOworCQlwY2lfZGlzYWJsZV9tc2koYnAtPnBkZXYpOworCQlicC0+ZmxhZ3MgJj0gflVTSU5HX01TSV9GTEFHOworCisJfSBlbHNlIGlmICghZGlzYWJsZV9vbmx5KQorCQlmcmVlX2lycShicC0+cGRldi0+aXJxLCBicC0+ZGV2KTsKK30KKworc3RhdGljIGludCBibngyeF9lbmFibGVfbXNpeChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpLCByYywgb2Zmc2V0ID0gMTsKKwlpbnQgaWd1X3ZlYyA9IDA7CisKKwlicC0+bXNpeF90YWJsZVswXS5lbnRyeSA9IGlndV92ZWM7CisJRFAoTkVUSUZfTVNHX0lGVVAsICJtc2l4X3RhYmxlWzBdLmVudHJ5ID0gJWQgKHNsb3dwYXRoKVxuIiwgaWd1X3ZlYyk7CisKKyNpZmRlZiBCQ01fQ05JQworCWlndV92ZWMgPSBCUF9MX0lEKGJwKSArIG9mZnNldDsKKwlicC0+bXNpeF90YWJsZVsxXS5lbnRyeSA9IGlndV92ZWM7CisJRFAoTkVUSUZfTVNHX0lGVVAsICJtc2l4X3RhYmxlWzFdLmVudHJ5ID0gJWQgKENOSUMpXG4iLCBpZ3VfdmVjKTsKKwlvZmZzZXQrKzsKKyNlbmRpZgorCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCWlndV92ZWMgPSBCUF9MX0lEKGJwKSArIG9mZnNldCArIGk7CisJCWJwLT5tc2l4X3RhYmxlW2kgKyBvZmZzZXRdLmVudHJ5ID0gaWd1X3ZlYzsKKwkJRFAoTkVUSUZfTVNHX0lGVVAsICJtc2l4X3RhYmxlWyVkXS5lbnRyeSA9ICVkICIKKwkJICAgIihmYXN0cGF0aCAjJXUpXG4iLCBpICsgb2Zmc2V0LCBpZ3VfdmVjLCBpKTsKKwl9CisKKwlyYyA9IHBjaV9lbmFibGVfbXNpeChicC0+cGRldiwgJmJwLT5tc2l4X3RhYmxlWzBdLAorCQkJICAgICBCTlgyWF9OVU1fUVVFVUVTKGJwKSArIG9mZnNldCk7CisKKwkvKgorCSAqIHJlY29uZmlndXJlIG51bWJlciBvZiB0eC9yeCBxdWV1ZXMgYWNjb3JkaW5nIHRvIGF2YWlsYWJsZQorCSAqIE1TSS1YIHZlY3RvcnMKKwkgKi8KKwlpZiAocmMgPj0gQk5YMlhfTUlOX01TSVhfVkVDX0NOVCkgeworCQkvKiB2ZWN0b3JzIGF2YWlsYWJsZSBmb3IgRlAgKi8KKwkJaW50IGZwX3ZlYyA9IHJjIC0gQk5YMlhfTVNJWF9WRUNfRlBfU1RBUlQ7CisKKwkJRFAoTkVUSUZfTVNHX0lGVVAsCisJCSAgICJUcnlpbmcgdG8gdXNlIGxlc3MgTVNJLVggdmVjdG9yczogJWRcbiIsIHJjKTsKKworCQlyYyA9IHBjaV9lbmFibGVfbXNpeChicC0+cGRldiwgJmJwLT5tc2l4X3RhYmxlWzBdLCByYyk7CisKKwkJaWYgKHJjKSB7CisJCQlEUChORVRJRl9NU0dfSUZVUCwKKwkJCSAgICJNU0ktWCBpcyBub3QgYXR0YWluYWJsZSAgcmMgJWRcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWJwLT5udW1fcXVldWVzID0gbWluKGJwLT5udW1fcXVldWVzLCBmcF92ZWMpOworCisJCURQKE5FVElGX01TR19JRlVQLCAiTmV3IHF1ZXVlIGNvbmZpZ3VyYXRpb24gc2V0OiAlZFxuIiwKKwkJCQkgIGJwLT5udW1fcXVldWVzKTsKKwl9IGVsc2UgaWYgKHJjKSB7CisJCURQKE5FVElGX01TR19JRlVQLCAiTVNJLVggaXMgbm90IGF0dGFpbmFibGUgIHJjICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlicC0+ZmxhZ3MgfD0gVVNJTkdfTVNJWF9GTEFHOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcmVxX21zaXhfaXJxcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpLCByYywgb2Zmc2V0ID0gMTsKKworCXJjID0gcmVxdWVzdF9pcnEoYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yLCBibngyeF9tc2l4X3NwX2ludCwgMCwKKwkJCSBicC0+ZGV2LT5uYW1lLCBicC0+ZGV2KTsKKwlpZiAocmMpIHsKKwkJQk5YMlhfRVJSKCJyZXF1ZXN0IHNwIGlycSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworI2lmZGVmIEJDTV9DTklDCisJb2Zmc2V0Kys7CisjZW5kaWYKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKKwkJc25wcmludGYoZnAtPm5hbWUsIHNpemVvZihmcC0+bmFtZSksICIlcy1mcC0lZCIsCisJCQkgYnAtPmRldi0+bmFtZSwgaSk7CisKKwkJcmMgPSByZXF1ZXN0X2lycShicC0+bXNpeF90YWJsZVtpICsgb2Zmc2V0XS52ZWN0b3IsCisJCQkJIGJueDJ4X21zaXhfZnBfaW50LCAwLCBmcC0+bmFtZSwgZnApOworCQlpZiAocmMpIHsKKwkJCUJOWDJYX0VSUigicmVxdWVzdCBmcCAjJWQgaXJxIGZhaWxlZCAgcmMgJWRcbiIsIGksIHJjKTsKKwkJCWJueDJ4X2ZyZWVfbXNpeF9pcnFzKGJwKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlmcC0+c3RhdGUgPSBCTlgyWF9GUF9TVEFURV9JUlE7CisJfQorCisJaSA9IEJOWDJYX05VTV9RVUVVRVMoYnApOworCW5ldGRldl9pbmZvKGJwLT5kZXYsICJ1c2luZyBNU0ktWCAgSVJRczogc3AgJWQgIGZwWyVkXSAlZCIKKwkgICAgICAgIiAuLi4gZnBbJWRdICVkXG4iLAorCSAgICAgICBicC0+bXNpeF90YWJsZVswXS52ZWN0b3IsCisJICAgICAgIDAsIGJwLT5tc2l4X3RhYmxlW29mZnNldF0udmVjdG9yLAorCSAgICAgICBpIC0gMSwgYnAtPm1zaXhfdGFibGVbb2Zmc2V0ICsgaSAtIDFdLnZlY3Rvcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9lbmFibGVfbXNpKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfZW5hYmxlX21zaShicC0+cGRldik7CisJaWYgKHJjKSB7CisJCURQKE5FVElGX01TR19JRlVQLCAiTVNJIGlzIG5vdCBhdHRhaW5hYmxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlicC0+ZmxhZ3MgfD0gVVNJTkdfTVNJX0ZMQUc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9yZXFfaXJxKHN0cnVjdCBibngyeCAqYnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlpZiAoYnAtPmZsYWdzICYgVVNJTkdfTVNJX0ZMQUcpCisJCWZsYWdzID0gMDsKKwllbHNlCisJCWZsYWdzID0gSVJRRl9TSEFSRUQ7CisKKwlyYyA9IHJlcXVlc3RfaXJxKGJwLT5wZGV2LT5pcnEsIGJueDJ4X2ludGVycnVwdCwgZmxhZ3MsCisJCQkgYnAtPmRldi0+bmFtZSwgYnAtPmRldik7CisJaWYgKCFyYykKKwkJYm54MnhfZnAoYnAsIDAsIHN0YXRlKSA9IEJOWDJYX0ZQX1NUQVRFX0lSUTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54MnhfbmFwaV9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQorCQluYXBpX2VuYWJsZSgmYm54MnhfZnAoYnAsIGksIG5hcGkpKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfbmFwaV9kaXNhYmxlKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJbmFwaV9kaXNhYmxlKCZibngyeF9mcChicCwgaSwgbmFwaSkpOworfQorCit2b2lkIGJueDJ4X25ldGlmX3N0YXJ0KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGludHJfc2VtOworCisJaW50cl9zZW0gPSBhdG9taWNfZGVjX2FuZF90ZXN0KCZicC0+aW50cl9zZW0pOworCXNtcF93bWIoKTsgLyogRW5zdXJlIHRoYXQgYnAtPmludHJfc2VtIHVwZGF0ZSBpcyBTTVAtc2FmZSAqLworCisJaWYgKGludHJfc2VtKSB7CisJCWlmIChuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKSB7CisJCQlibngyeF9uYXBpX2VuYWJsZShicCk7CisJCQlibngyeF9pbnRfZW5hYmxlKGJwKTsKKwkJCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikKKwkJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoYnAtPmRldik7CisJCX0KKwl9Cit9CisKK3ZvaWQgYm54MnhfbmV0aWZfc3RvcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZGlzYWJsZV9odykKK3sKKwlibngyeF9pbnRfZGlzYWJsZV9zeW5jKGJwLCBkaXNhYmxlX2h3KTsKKwlibngyeF9uYXBpX2Rpc2FibGUoYnApOworCW5ldGlmX3R4X2Rpc2FibGUoYnAtPmRldik7Cit9CitzdGF0aWMgaW50IGJueDJ4X3NldF9udW1fcXVldWVzKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoYnAtPmludF9tb2RlKSB7CisJY2FzZSBJTlRfTU9ERV9JTlR4OgorCWNhc2UgSU5UX01PREVfTVNJOgorCQlicC0+bnVtX3F1ZXVlcyA9IDE7CisJCURQKE5FVElGX01TR19JRlVQLCAic2V0IG51bWJlciBvZiBxdWV1ZXMgdG8gMVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNldCBudW1iZXIgb2YgcXVldWVzIGFjY29yZGluZyB0byBicC0+bXVsdGlfbW9kZSB2YWx1ZSAqLworCQlibngyeF9zZXRfbnVtX3F1ZXVlc19tc2l4KGJwKTsKKworCQlEUChORVRJRl9NU0dfSUZVUCwgInNldCBudW1iZXIgb2YgcXVldWVzIHRvICVkXG4iLAorCQkgICBicC0+bnVtX3F1ZXVlcyk7CisKKwkJLyogaWYgd2UgY2FuJ3QgdXNlIE1TSS1YIHdlIG9ubHkgbmVlZCBvbmUgZnAsCisJCSAqIHNvIHRyeSB0byBlbmFibGUgTVNJLVggd2l0aCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBmcCdzCisJCSAqIGFuZCBmYWxsYmFjayB0byBNU0kgb3IgbGVnYWN5IElOVHggd2l0aCBvbmUgZnAKKwkJICovCisJCXJjID0gYm54MnhfZW5hYmxlX21zaXgoYnApOworCQlpZiAocmMpCisJCQkvKiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICovCisJCQlicC0+bnVtX3F1ZXVlcyA9IDE7CisJCWJyZWFrOworCX0KKwlicC0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSBicC0+bnVtX3F1ZXVlczsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggcnRubF9sb2NrICovCitpbnQgYm54MnhfbmljX2xvYWQoc3RydWN0IGJueDJ4ICpicCwgaW50IGxvYWRfbW9kZSkKK3sKKwl1MzIgbG9hZF9jb2RlOworCWludCBpLCByYzsKKworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKKwkJcmV0dXJuIC1FUEVSTTsKKyNlbmRpZgorCisJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9MT0FEOworCisJcmMgPSBibngyeF9zZXRfbnVtX3F1ZXVlcyhicCk7CisKKwlpZiAoYm54MnhfYWxsb2NfbWVtKGJwKSkgeworCQlibngyeF9mcmVlX2lycShicCwgdHJ1ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQorCQlibngyeF9mcChicCwgaSwgZGlzYWJsZV90cGEpID0KKwkJCQkJKChicC0+ZmxhZ3MgJiBUUEFfRU5BQkxFX0ZMQUcpID09IDApOworCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpCisJCW5ldGlmX25hcGlfYWRkKGJwLT5kZXYsICZibngyeF9mcChicCwgaSwgbmFwaSksCisJCQkgICAgICAgYm54MnhfcG9sbCwgMTI4KTsKKworCWJueDJ4X25hcGlfZW5hYmxlKGJwKTsKKworCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpIHsKKwkJcmMgPSBibngyeF9yZXFfbXNpeF9pcnFzKGJwKTsKKwkJaWYgKHJjKSB7CisJCQlibngyeF9mcmVlX2lycShicCwgdHJ1ZSk7CisJCQlnb3RvIGxvYWRfZXJyb3IxOworCQl9CisJfSBlbHNlIHsKKwkJLyogRmFsbCB0byBJTlR4IGlmIGZhaWxlZCB0byBlbmFibGUgTVNJLVggZHVlIHRvIGxhY2sgb2YKKwkJICAgbWVtb3J5IChpbiBibngyeF9zZXRfbnVtX3F1ZXVlcygpKSAqLworCQlpZiAoKHJjICE9IC1FTk9NRU0pICYmIChicC0+aW50X21vZGUgIT0gSU5UX01PREVfSU5UeCkpCisJCQlibngyeF9lbmFibGVfbXNpKGJwKTsKKwkJYm54MnhfYWNrX2ludChicCk7CisJCXJjID0gYm54MnhfcmVxX2lycShicCk7CisJCWlmIChyYykgeworCQkJQk5YMlhfRVJSKCJJUlEgcmVxdWVzdCBmYWlsZWQgIHJjICVkLCBhYm9ydGluZ1xuIiwgcmMpOworCQkJYm54MnhfZnJlZV9pcnEoYnAsIHRydWUpOworCQkJZ290byBsb2FkX2Vycm9yMTsKKwkJfQorCQlpZiAoYnAtPmZsYWdzICYgVVNJTkdfTVNJX0ZMQUcpIHsKKwkJCWJwLT5kZXYtPmlycSA9IGJwLT5wZGV2LT5pcnE7CisJCQluZXRkZXZfaW5mbyhicC0+ZGV2LCAidXNpbmcgTVNJICBJUlEgJWRcbiIsCisJCQkJICAgIGJwLT5wZGV2LT5pcnEpOworCQl9CisJfQorCisJLyogU2VuZCBMT0FEX1JFUVVFU1QgY29tbWFuZCB0byBNQ1AKKwkgICBSZXR1cm5zIHRoZSB0eXBlIG9mIExPQUQgY29tbWFuZDoKKwkgICBpZiBpdCBpcyB0aGUgZmlyc3QgcG9ydCB0byBiZSBpbml0aWFsaXplZAorCSAgIGNvbW1vbiBibG9ja3Mgc2hvdWxkIGJlIGluaXRpYWxpemVkLCBvdGhlcndpc2UgLSBub3QKKwkqLworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCWxvYWRfY29kZSA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9MT0FEX1JFUSk7CisJCWlmICghbG9hZF9jb2RlKSB7CisJCQlCTlgyWF9FUlIoIk1DUCByZXNwb25zZSBmYWlsdXJlLCBhYm9ydGluZ1xuIik7CisJCQlyYyA9IC1FQlVTWTsKKwkJCWdvdG8gbG9hZF9lcnJvcjI7CisJCX0KKwkJaWYgKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9SRUZVU0VEKSB7CisJCQlyYyA9IC1FQlVTWTsgLyogb3RoZXIgcG9ydCBpbiBkaWFnbm9zdGljIG1vZGUgKi8KKwkJCWdvdG8gbG9hZF9lcnJvcjI7CisJCX0KKworCX0gZWxzZSB7CisJCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisKKwkJRFAoTkVUSUZfTVNHX0lGVVAsICJOTyBNQ1AgLSBsb2FkIGNvdW50cyAgICAgICVkLCAlZCwgJWRcbiIsCisJCSAgIGxvYWRfY291bnRbMF0sIGxvYWRfY291bnRbMV0sIGxvYWRfY291bnRbMl0pOworCQlsb2FkX2NvdW50WzBdKys7CisJCWxvYWRfY291bnRbMSArIHBvcnRdKys7CisJCURQKE5FVElGX01TR19JRlVQLCAiTk8gTUNQIC0gbmV3IGxvYWQgY291bnRzICAlZCwgJWQsICVkXG4iLAorCQkgICBsb2FkX2NvdW50WzBdLCBsb2FkX2NvdW50WzFdLCBsb2FkX2NvdW50WzJdKTsKKwkJaWYgKGxvYWRfY291bnRbMF0gPT0gMSkKKwkJCWxvYWRfY29kZSA9IEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTjsKKwkJZWxzZSBpZiAobG9hZF9jb3VudFsxICsgcG9ydF0gPT0gMSkKKwkJCWxvYWRfY29kZSA9IEZXX01TR19DT0RFX0RSVl9MT0FEX1BPUlQ7CisJCWVsc2UKKwkJCWxvYWRfY29kZSA9IEZXX01TR19DT0RFX0RSVl9MT0FEX0ZVTkNUSU9OOworCX0KKworCWlmICgobG9hZF9jb2RlID09IEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTikgfHwKKwkgICAgKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9QT1JUKSkKKwkJYnAtPnBvcnQucG1mID0gMTsKKwllbHNlCisJCWJwLT5wb3J0LnBtZiA9IDA7CisJRFAoTkVUSUZfTVNHX0xJTkssICJwbWYgJWRcbiIsIGJwLT5wb3J0LnBtZik7CisKKwkvKiBJbml0aWFsaXplIEhXICovCisJcmMgPSBibngyeF9pbml0X2h3KGJwLCBsb2FkX2NvZGUpOworCWlmIChyYykgeworCQlCTlgyWF9FUlIoIkhXIGluaXQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CisJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9MT0FEX0RPTkUpOworCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfTUNQKTsKKwkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FKTsKKwkJZ290byBsb2FkX2Vycm9yMjsKKwl9CisKKwkvKiBTZXR1cCBOSUMgaW50ZXJuYWxzIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworCWJueDJ4X25pY19pbml0KGJwLCBsb2FkX2NvZGUpOworCisJaWYgKChsb2FkX2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OKSAmJgorCSAgICAoYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSkpCisJCVNITUVNMl9XUihicCwgZGNjX3N1cHBvcnQsCisJCQkgIChTSE1FTV9EQ0NfU1VQUE9SVF9ESVNBQkxFX0VOQUJMRV9QRl9UTFYgfAorCQkJICAgU0hNRU1fRENDX1NVUFBPUlRfQkFORFdJRFRIX0FMTE9DQVRJT05fVExWKSk7CisKKwkvKiBTZW5kIExPQURfRE9ORSBjb21tYW5kIHRvIE1DUCAqLworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCWxvYWRfY29kZSA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9MT0FEX0RPTkUpOworCQlpZiAoIWxvYWRfY29kZSkgeworCQkJQk5YMlhfRVJSKCJNQ1AgcmVzcG9uc2UgZmFpbHVyZSwgYWJvcnRpbmdcbiIpOworCQkJcmMgPSAtRUJVU1k7CisJCQlnb3RvIGxvYWRfZXJyb3IzOworCQl9CisJfQorCisJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9QT1JUOworCisJcmMgPSBibngyeF9zZXR1cF9sZWFkaW5nKGJwKTsKKwlpZiAocmMpIHsKKwkJQk5YMlhfRVJSKCJTZXR1cCBsZWFkaW5nIGZhaWxlZCFcbiIpOworI2lmbmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJCWdvdG8gbG9hZF9lcnJvcjM7CisjZWxzZQorCQlicC0+cGFuaWMgPSAxOworCQlyZXR1cm4gLUVCVVNZOworI2VuZGlmCisJfQorCisJaWYgKENISVBfSVNfRTFIKGJwKSkKKwkJaWYgKGJwLT5tZl9jb25maWcgJiBGVU5DX01GX0NGR19GVU5DX0RJU0FCTEVEKSB7CisJCQlEUChORVRJRl9NU0dfSUZVUCwgIm1mX2NmZyBmdW5jdGlvbiBkaXNhYmxlZFxuIik7CisJCQlicC0+ZmxhZ3MgfD0gTUZfRlVOQ19ESVM7CisJCX0KKworCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikgeworI2lmZGVmIEJDTV9DTklDCisJCS8qIEVuYWJsZSBUaW1lciBzY2FuICovCisJCVJFR19XUihicCwgVE1fUkVHX0VOX0xJTkVBUjBfVElNRVIgKyBCUF9QT1JUKGJwKSo0LCAxKTsKKyNlbmRpZgorCQlmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCBpKSB7CisJCQlyYyA9IGJueDJ4X3NldHVwX211bHRpKGJwLCBpKTsKKwkJCWlmIChyYykKKyNpZmRlZiBCQ01fQ05JQworCQkJCWdvdG8gbG9hZF9lcnJvcjQ7CisjZWxzZQorCQkJCWdvdG8gbG9hZF9lcnJvcjM7CisjZW5kaWYKKwkJfQorCisJCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJCWJueDJ4X3NldF9ldGhfbWFjX2FkZHJfZTEoYnAsIDEpOworCQllbHNlCisJCQlibngyeF9zZXRfZXRoX21hY19hZGRyX2UxaChicCwgMSk7CisjaWZkZWYgQkNNX0NOSUMKKwkJLyogU2V0IGlTQ1NJIEwyIE1BQyAqLworCQltdXRleF9sb2NrKCZicC0+Y25pY19tdXRleCk7CisJCWlmIChicC0+Y25pY19ldGhfZGV2LmRydl9zdGF0ZSAmIENOSUNfRFJWX1NUQVRFX1JFR0QpIHsKKwkJCWJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoYnAsIDEpOworCQkJYnAtPmNuaWNfZmxhZ3MgfD0gQk5YMlhfQ05JQ19GTEFHX01BQ19TRVQ7CisJCQlibngyeF9pbml0X3NiKGJwLCBicC0+Y25pY19zYiwgYnAtPmNuaWNfc2JfbWFwcGluZywKKwkJCQkgICAgICBDTklDX1NCX0lEKGJwKSk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZicC0+Y25pY19tdXRleCk7CisjZW5kaWYKKwl9CisKKwlpZiAoYnAtPnBvcnQucG1mKQorCQlibngyeF9pbml0aWFsX3BoeV9pbml0KGJwLCBsb2FkX21vZGUpOworCisJLyogU3RhcnQgZmFzdCBwYXRoICovCisJc3dpdGNoIChsb2FkX21vZGUpIHsKKwljYXNlIExPQURfTk9STUFMOgorCQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pIHsKKwkJCS8qIFR4IHF1ZXVlIHNob3VsZCBiZSBvbmx5IHJlZW5hYmxlZCAqLworCQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKGJwLT5kZXYpOworCQl9CisJCS8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgZmlsdGVyLiAqLworCQlibngyeF9zZXRfcnhfbW9kZShicC0+ZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIExPQURfT1BFTjoKKwkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhicC0+ZGV2KTsKKwkJaWYgKGJwLT5zdGF0ZSAhPSBCTlgyWF9TVEFURV9PUEVOKQorCQkJbmV0aWZfdHhfZGlzYWJsZShicC0+ZGV2KTsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBmaWx0ZXIuICovCisJCWJueDJ4X3NldF9yeF9tb2RlKGJwLT5kZXYpOworCQlicmVhazsKKworCWNhc2UgTE9BRF9ESUFHOgorCQkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGZpbHRlci4gKi8KKwkJYm54Mnhfc2V0X3J4X21vZGUoYnAtPmRldik7CisJCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0RJQUc7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKCFicC0+cG9ydC5wbWYpCisJCWJueDJ4X19saW5rX3N0YXR1c191cGRhdGUoYnApOworCisJLyogc3RhcnQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZicC0+dGltZXIsIGppZmZpZXMgKyBicC0+Y3VycmVudF9pbnRlcnZhbCk7CisKKyNpZmRlZiBCQ01fQ05JQworCWJueDJ4X3NldHVwX2NuaWNfaXJxX2luZm8oYnApOworCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikKKwkJYm54MnhfY25pY19ub3RpZnkoYnAsIENOSUNfQ1RMX1NUQVJUX0NNRCk7CisjZW5kaWYKKwlibngyeF9pbmNfbG9hZF9jbnQoYnApOworCisJcmV0dXJuIDA7CisKKyNpZmRlZiBCQ01fQ05JQworbG9hZF9lcnJvcjQ6CisJLyogRGlzYWJsZSBUaW1lciBzY2FuICovCisJUkVHX1dSKGJwLCBUTV9SRUdfRU5fTElORUFSMF9USU1FUiArIEJQX1BPUlQoYnApKjQsIDApOworI2VuZGlmCitsb2FkX2Vycm9yMzoKKwlibngyeF9pbnRfZGlzYWJsZV9zeW5jKGJwLCAxKTsKKwlpZiAoIUJQX05PTUNQKGJwKSkgeworCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfTUNQKTsKKwkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FKTsKKwl9CisJYnAtPnBvcnQucG1mID0gMDsKKwkvKiBGcmVlIFNLQnMsIFNHRXMsIFRQQSBwb29sIGFuZCBkcml2ZXIgaW50ZXJuYWxzICovCisJYm54MnhfZnJlZV9za2JzKGJwKTsKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJYm54MnhfZnJlZV9yeF9zZ2VfcmFuZ2UoYnAsIGJwLT5mcCArIGksIE5VTV9SWF9TR0UpOworbG9hZF9lcnJvcjI6CisJLyogUmVsZWFzZSBJUlFzICovCisJYm54MnhfZnJlZV9pcnEoYnAsIGZhbHNlKTsKK2xvYWRfZXJyb3IxOgorCWJueDJ4X25hcGlfZGlzYWJsZShicCk7CisJZm9yX2VhY2hfcXVldWUoYnAsIGkpCisJCW5ldGlmX25hcGlfZGVsKCZibngyeF9mcChicCwgaSwgbmFwaSkpOworCWJueDJ4X2ZyZWVfbWVtKGJwKTsKKworCXJldHVybiByYzsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KK2ludCBibngyeF9uaWNfdW5sb2FkKHN0cnVjdCBibngyeCAqYnAsIGludCB1bmxvYWRfbW9kZSkKK3sKKwlpbnQgaTsKKworCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfQ0xPU0VEKSB7CisJCS8qIEludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkIC0gbm90aGluZyB0byByZWNvdmVyICovCisJCWJwLT5yZWNvdmVyeV9zdGF0ZSA9IEJOWDJYX1JFQ09WRVJZX0RPTkU7CisJCWJwLT5pc19sZWFkZXIgPSAwOworCQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfUkVTRVJWRURfMDgpOworCQlzbXBfd21iKCk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgQkNNX0NOSUMKKwlibngyeF9jbmljX25vdGlmeShicCwgQ05JQ19DVExfU1RPUF9DTUQpOworI2VuZGlmCisJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9IQUxUOworCisJLyogU2V0ICJkcm9wIGFsbCIgKi8KKwlicC0+cnhfbW9kZSA9IEJOWDJYX1JYX01PREVfTk9ORTsKKwlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7CisKKwkvKiBEaXNhYmxlIEhXIGludGVycnVwdHMsIE5BUEkgYW5kIFR4ICovCisJYm54MnhfbmV0aWZfc3RvcChicCwgMSk7CisJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7CisKKwlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKKwlTSE1FTV9XUihicCwgZnVuY19tYltCUF9GVU5DKGJwKV0uZHJ2X3B1bHNlX21iLAorCQkgKERSVl9QVUxTRV9BTFdBWVNfQUxJVkUgfCBicC0+ZndfZHJ2X3B1bHNlX3dyX3NlcSkpOworCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfU1RPUCk7CisKKwkvKiBSZWxlYXNlIElSUXMgKi8KKwlibngyeF9mcmVlX2lycShicCwgZmFsc2UpOworCisJLyogQ2xlYW51cCB0aGUgY2hpcCBpZiBuZWVkZWQgKi8KKwlpZiAodW5sb2FkX21vZGUgIT0gVU5MT0FEX1JFQ09WRVJZKQorCQlibngyeF9jaGlwX2NsZWFudXAoYnAsIHVubG9hZF9tb2RlKTsKKworCWJwLT5wb3J0LnBtZiA9IDA7CisKKwkvKiBGcmVlIFNLQnMsIFNHRXMsIFRQQSBwb29sIGFuZCBkcml2ZXIgaW50ZXJuYWxzICovCisJYm54MnhfZnJlZV9za2JzKGJwKTsKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJYm54MnhfZnJlZV9yeF9zZ2VfcmFuZ2UoYnAsIGJwLT5mcCArIGksIE5VTV9SWF9TR0UpOworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQorCQluZXRpZl9uYXBpX2RlbCgmYm54MnhfZnAoYnAsIGksIG5hcGkpKTsKKwlibngyeF9mcmVlX21lbShicCk7CisKKwlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TRUQ7CisKKwkvKiBUaGUgbGFzdCBkcml2ZXIgbXVzdCBkaXNhYmxlIGEgImNsb3NlIHRoZSBnYXRlIiBpZiB0aGVyZSBpcyBubworCSAqIHBhcml0eSBhdHRlbnRpb24gb3IgInByb2Nlc3Mga2lsbCIgcGVuZGluZy4KKwkgKi8KKwlpZiAoKCFibngyeF9kZWNfbG9hZF9jbnQoYnApKSAmJiAoIWJueDJ4X2Noa19wYXJpdHlfYXR0bihicCkpICYmCisJICAgIGJueDJ4X3Jlc2V0X2lzX2RvbmUoYnApKQorCQlibngyeF9kaXNhYmxlX2Nsb3NlX3RoZV9nYXRlKGJwKTsKKworCS8qIFJlc2V0IE1DUCBtYWlsIGJveCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbiBnb2luZyByZWNvdmVyeSAqLworCWlmICh1bmxvYWRfbW9kZSA9PSBVTkxPQURfUkVDT1ZFUlkpCisJCWJwLT5md19zZXEgPSAwOworCisJcmV0dXJuIDA7Cit9CitpbnQgYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBibngyeCAqYnAsIHBjaV9wb3dlcl90IHN0YXRlKQoreworCXUxNiBwbWNzcjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJwLT5wZGV2LCBicC0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZwbWNzcik7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBQQ0lfRDA6CisJCXBjaV93cml0ZV9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBtX2NhcCArIFBDSV9QTV9DVFJMLAorCQkJCSAgICAgICgocG1jc3IgJiB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSykgfAorCQkJCSAgICAgICBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTKSk7CisKKwkJaWYgKHBtY3NyICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSykKKwkJCS8qIGRlbGF5IHJlcXVpcmVkIGR1cmluZyB0cmFuc2l0aW9uIG91dCBvZiBEM2hvdCAqLworCQkJbXNsZWVwKDIwKTsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9EM2hvdDoKKwkJLyogSWYgdGhlcmUgYXJlIG90aGVyIGNsaWVudHMgYWJvdmUgZG9uJ3QKKwkJICAgc2h1dCBkb3duIHRoZSBwb3dlciAqLworCQlpZiAoYXRvbWljX3JlYWQoJmJwLT5wZGV2LT5lbmFibGVfY250KSAhPSAxKQorCQkJcmV0dXJuIDA7CisJCS8qIERvbid0IHNodXQgZG93biB0aGUgcG93ZXIgZm9yIGVtdWxhdGlvbiBhbmQgRlBHQSAqLworCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCQlyZXR1cm4gMDsKKworCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwkJcG1jc3IgfD0gMzsKKworCQlpZiAoYnAtPndvbCkKKwkJCXBtY3NyIHw9IFBDSV9QTV9DVFJMX1BNRV9FTkFCTEU7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJwLT5wZGV2LCBicC0+cG1fY2FwICsgUENJX1BNX0NUUkwsCisJCQkJICAgICAgcG1jc3IpOworCisJCS8qIE5vIG1vcmUgbWVtb3J5IGFjY2VzcyBhZnRlciB0aGlzIHBvaW50IHVudGlsCisJCSogZGV2aWNlIGlzIGJyb3VnaHQgYmFjayB0byBEMC4KKwkJKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCisvKgorICogbmV0X2RldmljZSBzZXJ2aWNlIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgYm54MnhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJaW50IHdvcmtfZG9uZSA9IDA7CisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgYm54MnhfZmFzdHBhdGgsCisJCQkJCQkgbmFwaSk7CisJc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKKworCXdoaWxlICgxKSB7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkgeworCQkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJCXJldHVybiAwOworCQl9CisjZW5kaWYKKworCQlpZiAoYm54MnhfaGFzX3R4X3dvcmsoZnApKQorCQkJYm54MnhfdHhfaW50KGZwKTsKKworCQlpZiAoYm54MnhfaGFzX3J4X3dvcmsoZnApKSB7CisJCQl3b3JrX2RvbmUgKz0gYm54MnhfcnhfaW50KGZwLCBidWRnZXQgLSB3b3JrX2RvbmUpOworCisJCQkvKiBtdXN0IG5vdCBjb21wbGV0ZSBpZiB3ZSBjb25zdW1lZCBmdWxsIGJ1ZGdldCAqLworCQkJaWYgKHdvcmtfZG9uZSA+PSBidWRnZXQpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBGYWxsIG91dCBmcm9tIHRoZSBOQVBJIGxvb3AgaWYgbmVlZGVkICovCisJCWlmICghKGJueDJ4X2hhc19yeF93b3JrKGZwKSB8fCBibngyeF9oYXNfdHhfd29yayhmcCkpKSB7CisJCQlibngyeF91cGRhdGVfZnBzYl9pZHgoZnApOworCQkvKiBibngyeF9oYXNfcnhfd29yaygpIHJlYWRzIHRoZSBzdGF0dXMgYmxvY2ssIHRodXMgd2UgbmVlZAorCQkgKiB0byBlbnN1cmUgdGhhdCBzdGF0dXMgYmxvY2sgaW5kaWNlcyBoYXZlIGJlZW4gYWN0dWFsbHkgcmVhZAorCQkgKiAoYm54MnhfdXBkYXRlX2Zwc2JfaWR4KSBwcmlvciB0byB0aGlzIGNoZWNrCisJCSAqIChibngyeF9oYXNfcnhfd29yaykgc28gdGhhdCB3ZSB3b24ndCB3cml0ZSB0aGUgIm5ld2VyIgorCQkgKiB2YWx1ZSBvZiB0aGUgc3RhdHVzIGJsb2NrIHRvIElHVSAoaWYgdGhlcmUgd2FzIGEgRE1BIHJpZ2h0CisJCSAqIGFmdGVyIGJueDJ4X2hhc19yeF93b3JrIGFuZCBpZiB0aGVyZSBpcyBubyBybWIsIHRoZSBtZW1vcnkKKwkJICogcmVhZGluZyAoYm54MnhfdXBkYXRlX2Zwc2JfaWR4KSBtYXkgYmUgcG9zdHBvbmVkIHRvIHJpZ2h0CisJCSAqIGJlZm9yZSBibngyeF9hY2tfc2IpLiBJbiB0aGlzIGNhc2UgdGhlcmUgd2lsbCBuZXZlciBiZQorCQkgKiBhbm90aGVyIGludGVycnVwdCB1bnRpbCB0aGVyZSBpcyBhbm90aGVyIHVwZGF0ZSBvZiB0aGUKKwkJICogc3RhdHVzIGJsb2NrLCB3aGlsZSB0aGVyZSBpcyBzdGlsbCB1bmhhbmRsZWQgd29yay4KKwkJICovCisJCQlybWIoKTsKKworCQkJaWYgKCEoYm54MnhfaGFzX3J4X3dvcmsoZnApIHx8IGJueDJ4X2hhc190eF93b3JrKGZwKSkpIHsKKwkJCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisJCQkJYm54MnhfYWNrX3NiKGJwLCBmcC0+c2JfaWQsIENTVE9STV9JRCwKKwkJCQkJICAgICBsZTE2X3RvX2NwdShmcC0+ZnBfY19pZHgpLAorCQkJCQkgICAgIElHVV9JTlRfTk9QLCAxKTsKKwkJCQlibngyeF9hY2tfc2IoYnAsIGZwLT5zYl9pZCwgVVNUT1JNX0lELAorCQkJCQkgICAgIGxlMTZfdG9fY3B1KGZwLT5mcF91X2lkeCksCisJCQkJCSAgICAgSUdVX0lOVF9FTkFCTEUsIDEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworCisvKiB3ZSBzcGxpdCB0aGUgZmlyc3QgQkQgaW50byBoZWFkZXJzIGFuZCBkYXRhIEJEcworICogdG8gZWFzZSB0aGUgcGFpbiBvZiBvdXIgZmVsbG93IG1pY3JvY29kZSBlbmdpbmVlcnMKKyAqIHdlIHVzZSBvbmUgbWFwcGluZyBmb3IgYm90aCBCRHMKKyAqIFNvIGZhciB0aGlzIGhhcyBvbmx5IGJlZW4gb2JzZXJ2ZWQgdG8gaGFwcGVuCisgKiBpbiBPdGhlciBPcGVyYXRpbmcgU3lzdGVtcyhUTSkKKyAqLworc3RhdGljIG5vaW5saW5lIHUxNiBibngyeF90eF9zcGxpdChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQkJICAgc3RydWN0IHN3X3R4X2JkICp0eF9idWYsCisJCQkJICAgc3RydWN0IGV0aF90eF9zdGFydF9iZCAqKnR4X2JkLCB1MTYgaGxlbiwKKwkJCQkgICB1MTYgYmRfcHJvZCwgaW50IG5iZCkKK3sKKwlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICpoX3R4X2JkID0gKnR4X2JkOworCXN0cnVjdCBldGhfdHhfYmQgKmRfdHhfYmQ7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCWludCBvbGRfbGVuID0gbGUxNl90b19jcHUoaF90eF9iZC0+bmJ5dGVzKTsKKworCS8qIGZpcnN0IGZpeCBmaXJzdCBCRCAqLworCWhfdHhfYmQtPm5iZCA9IGNwdV90b19sZTE2KG5iZCk7CisJaF90eF9iZC0+bmJ5dGVzID0gY3B1X3RvX2xlMTYoaGxlbik7CisKKwlEUChORVRJRl9NU0dfVFhfUVVFVUVELAkiVFNPIHNwbGl0IGhlYWRlciBzaXplIGlzICVkICIKKwkgICAiKCV4OiV4KSBuYmQgJWRcbiIsIGhfdHhfYmQtPm5ieXRlcywgaF90eF9iZC0+YWRkcl9oaSwKKwkgICBoX3R4X2JkLT5hZGRyX2xvLCBoX3R4X2JkLT5uYmQpOworCisJLyogbm93IGdldCBhIG5ldyBkYXRhIEJECisJICogKGFmdGVyIHRoZSBwYmQpIGFuZCBmaWxsIGl0ICovCisJYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKKwlkX3R4X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucmVnX2JkOworCisJbWFwcGluZyA9IEhJTE9fVTY0KGxlMzJfdG9fY3B1KGhfdHhfYmQtPmFkZHJfaGkpLAorCQkJICAgbGUzMl90b19jcHUoaF90eF9iZC0+YWRkcl9sbykpICsgaGxlbjsKKworCWRfdHhfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOworCWRfdHhfYmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihVNjRfTE8obWFwcGluZykpOworCWRfdHhfYmQtPm5ieXRlcyA9IGNwdV90b19sZTE2KG9sZF9sZW4gLSBobGVuKTsKKworCS8qIHRoaXMgbWFya3MgdGhlIEJEIGFzIG9uZSB0aGF0IGhhcyBubyBpbmRpdmlkdWFsIG1hcHBpbmcgKi8KKwl0eF9idWYtPmZsYWdzIHw9IEJOWDJYX1RTT19TUExJVF9CRDsKKworCURQKE5FVElGX01TR19UWF9RVUVVRUQsCisJICAgIlRTTyBzcGxpdCBkYXRhIHNpemUgaXMgJWQgKCV4OiV4KVxuIiwKKwkgICBkX3R4X2JkLT5uYnl0ZXMsIGRfdHhfYmQtPmFkZHJfaGksIGRfdHhfYmQtPmFkZHJfbG8pOworCisJLyogdXBkYXRlIHR4X2JkICovCisJKnR4X2JkID0gKHN0cnVjdCBldGhfdHhfc3RhcnRfYmQgKilkX3R4X2JkOworCisJcmV0dXJuIGJkX3Byb2Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGJueDJ4X2NzdW1fZml4KHVuc2lnbmVkIGNoYXIgKnRfaGVhZGVyLCB1MTYgY3N1bSwgczggZml4KQoreworCWlmIChmaXggPiAwKQorCQljc3VtID0gKHUxNikgfmNzdW1fZm9sZChjc3VtX3N1Yihjc3VtLAorCQkJCWNzdW1fcGFydGlhbCh0X2hlYWRlciAtIGZpeCwgZml4LCAwKSkpOworCisJZWxzZSBpZiAoZml4IDwgMCkKKwkJY3N1bSA9ICh1MTYpIH5jc3VtX2ZvbGQoY3N1bV9hZGQoY3N1bSwKKwkJCQljc3VtX3BhcnRpYWwodF9oZWFkZXIsIC1maXgsIDApKSk7CisKKwlyZXR1cm4gc3dhYjE2KGNzdW0pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBibngyeF94bWl0X3R5cGUoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgcmM7CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJcmMgPSBYTUlUX1BMQUlOOworCisJZWxzZSB7CisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCQlyYyA9IFhNSVRfQ1NVTV9WNjsKKwkJCWlmIChpcHY2X2hkcihza2IpLT5uZXh0aGRyID09IElQUFJPVE9fVENQKQorCQkJCXJjIHw9IFhNSVRfQ1NVTV9UQ1A7CisKKwkJfSBlbHNlIHsKKwkJCXJjID0gWE1JVF9DU1VNX1Y0OworCQkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCQlyYyB8PSBYTUlUX0NTVU1fVENQOworCQl9CisJfQorCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY0KQorCQlyYyB8PSAoWE1JVF9HU09fVjQgfCBYTUlUX0NTVU1fVjQgfCBYTUlUX0NTVU1fVENQKTsKKworCWVsc2UgaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2KQorCQlyYyB8PSAoWE1JVF9HU09fVjYgfCBYTUlUX0NTVU1fVENQIHwgWE1JVF9DU1VNX1Y2KTsKKworCXJldHVybiByYzsKK30KKworI2lmIChNQVhfU0tCX0ZSQUdTID49IE1BWF9GRVRDSF9CRCAtIDMpCisvKiBjaGVjayBpZiBwYWNrZXQgcmVxdWlyZXMgbGluZWFyaXphdGlvbiAocGFja2V0IGlzIHRvbyBmcmFnbWVudGVkKQorICAgbm8gbmVlZCB0byBjaGVjayBmcmFnbWVudGF0aW9uIGlmIHBhZ2Ugc2l6ZSA+IDhLICh0aGVyZSB3aWxsIGJlIG5vCisgICB2aW9sYXRpb24gdG8gRlcgcmVzdHJpY3Rpb25zKSAqLworc3RhdGljIGludCBibngyeF9wa3RfcmVxX2xpbihzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICB1MzIgeG1pdF90eXBlKQoreworCWludCB0b19jb3B5ID0gMDsKKwlpbnQgaGxlbiA9IDA7CisJaW50IGZpcnN0X2JkX3N6ID0gMDsKKworCS8qIDMgPSAxIChmb3IgbGluZWFyIGRhdGEgQkQpICsgMiAoZm9yIFBCRCBhbmQgbGFzdCBCRCkgKi8KKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+PSAoTUFYX0ZFVENIX0JEIC0gMykpIHsKKworCQlpZiAoeG1pdF90eXBlICYgWE1JVF9HU08pIHsKKwkJCXVuc2lnbmVkIHNob3J0IGxzb19tc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCQkJLyogQ2hlY2sgaWYgTFNPIHBhY2tldCBuZWVkcyB0byBiZSBjb3BpZWQ6CisJCQkgICAzID0gMSAoZm9yIGhlYWRlcnMgQkQpICsgMiAoZm9yIFBCRCBhbmQgbGFzdCBCRCkgKi8KKwkJCWludCB3bmRfc2l6ZSA9IE1BWF9GRVRDSF9CRCAtIDM7CisJCQkvKiBOdW1iZXIgb2Ygd2luZG93cyB0byBjaGVjayAqLworCQkJaW50IG51bV93bmRzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAtIHduZF9zaXplOworCQkJaW50IHduZF9pZHggPSAwOworCQkJaW50IGZyYWdfaWR4ID0gMDsKKwkJCXUzMiB3bmRfc3VtID0gMDsKKworCQkJLyogSGVhZGVycyBsZW5ndGggKi8KKwkJCWhsZW4gPSAoaW50KShza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5kYXRhKSArCisJCQkJdGNwX2hkcmxlbihza2IpOworCisJCQkvKiBBbW91bnQgb2YgZGF0YSAody9vIGhlYWRlcnMpIG9uIGxpbmVhciBwYXJ0IG9mIFNLQiovCisJCQlmaXJzdF9iZF9zeiA9IHNrYl9oZWFkbGVuKHNrYikgLSBobGVuOworCisJCQl3bmRfc3VtICA9IGZpcnN0X2JkX3N6OworCisJCQkvKiBDYWxjdWxhdGUgdGhlIGZpcnN0IHN1bSAtIGl0J3Mgc3BlY2lhbCAqLworCQkJZm9yIChmcmFnX2lkeCA9IDA7IGZyYWdfaWR4IDwgd25kX3NpemUgLSAxOyBmcmFnX2lkeCsrKQorCQkJCXduZF9zdW0gKz0KKwkJCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnX2lkeF0uc2l6ZTsKKworCQkJLyogSWYgdGhlcmUgd2FzIGRhdGEgb24gbGluZWFyIHNrYiBkYXRhIC0gY2hlY2sgaXQgKi8KKwkJCWlmIChmaXJzdF9iZF9zeiA+IDApIHsKKwkJCQlpZiAodW5saWtlbHkod25kX3N1bSA8IGxzb19tc3MpKSB7CisJCQkJCXRvX2NvcHkgPSAxOworCQkJCQlnb3RvIGV4aXRfbGJsOworCQkJCX0KKworCQkJCXduZF9zdW0gLT0gZmlyc3RfYmRfc3o7CisJCQl9CisKKwkJCS8qIE90aGVycyBhcmUgZWFzaWVyOiBydW4gdGhyb3VnaCB0aGUgZnJhZyBsaXN0IGFuZAorCQkJICAgY2hlY2sgYWxsIHdpbmRvd3MgKi8KKwkJCWZvciAod25kX2lkeCA9IDA7IHduZF9pZHggPD0gbnVtX3duZHM7IHduZF9pZHgrKykgeworCQkJCXduZF9zdW0gKz0KKwkJCSAgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1t3bmRfaWR4ICsgd25kX3NpemUgLSAxXS5zaXplOworCisJCQkJaWYgKHVubGlrZWx5KHduZF9zdW0gPCBsc29fbXNzKSkgeworCQkJCQl0b19jb3B5ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXduZF9zdW0gLT0KKwkJCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1t3bmRfaWR4XS5zaXplOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogaW4gbm9uLUxTTyB0b28gZnJhZ21lbnRlZCBwYWNrZXQgc2hvdWxkIGFsd2F5cworCQkJICAgYmUgbGluZWFyaXplZCAqLworCQkJdG9fY29weSA9IDE7CisJCX0KKwl9CisKK2V4aXRfbGJsOgorCWlmICh1bmxpa2VseSh0b19jb3B5KSkKKwkJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwKKwkJICAgIkxpbmVhcml6YXRpb24gSVMgUkVRVUlSRUQgZm9yICVzIHBhY2tldC4gIgorCQkgICAibnVtX2ZyYWdzICVkICBobGVuICVkICBmaXJzdF9iZF9zeiAlZFxuIiwKKwkJICAgKHhtaXRfdHlwZSAmIFhNSVRfR1NPKSA/ICJMU08iIDogIm5vbi1MU08iLAorCQkgICBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLCBobGVuLCBmaXJzdF9iZF9zeik7CisKKwlyZXR1cm4gdG9fY29weTsKK30KKyNlbmRpZgorCisvKiBjYWxsZWQgd2l0aCBuZXRpZl90eF9sb2NrCisgKiBibngyeF90eF9pbnQoKSBydW5zIHdpdGhvdXQgbmV0aWZfdHhfbG9jayB1bmxlc3MgaXQgbmVlZHMgdG8gY2FsbAorICogbmV0aWZfd2FrZV9xdWV1ZSgpCisgKi8KK25ldGRldl90eF90IGJueDJ4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZjsKKwlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICp0eF9zdGFydF9iZDsKKwlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9kYXRhX2JkLCAqdG90YWxfcGt0X2JkID0gTlVMTDsKKwlzdHJ1Y3QgZXRoX3R4X3BhcnNlX2JkICpwYmQgPSBOVUxMOworCXUxNiBwa3RfcHJvZCwgYmRfcHJvZDsKKwlpbnQgbmJkLCBmcF9pbmRleDsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTMyIHhtaXRfdHlwZSA9IGJueDJ4X3htaXRfdHlwZShicCwgc2tiKTsKKwlpbnQgaTsKKwl1OCBobGVuID0gMDsKKwlfX2xlMTYgcGt0X3NpemUgPSAwOworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwl1OCBtYWNfdHlwZSA9IFVOSUNBU1RfQUREUkVTUzsKKworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworI2VuZGlmCisKKwlmcF9pbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBmcF9pbmRleCk7CisKKwlmcCA9ICZicC0+ZnBbZnBfaW5kZXhdOworCisJaWYgKHVubGlrZWx5KGJueDJ4X3R4X2F2YWlsKGZwKSA8IChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMykpKSB7CisJCWZwLT5ldGhfcV9zdGF0cy5kcml2ZXJfeG9mZisrOworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisJCUJOWDJYX0VSUigiQlVHISBUeCByaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgIlNLQjogc3VtbWVkICV4ICBwcm90b2NvbCAleCAgcHJvdG9jb2woJXgsJXgpIgorCSAgICIgIGdzbyB0eXBlICV4ICB4bWl0X3R5cGUgJXhcbiIsCisJICAgc2tiLT5pcF9zdW1tZWQsIHNrYi0+cHJvdG9jb2wsIGlwdjZfaGRyKHNrYiktPm5leHRoZHIsCisJICAgaXBfaGRyKHNrYiktPnByb3RvY29sLCBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlLCB4bWl0X3R5cGUpOworCisJZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisKKwkvKiBzZXQgZmxhZyBhY2NvcmRpbmcgdG8gcGFja2V0IHR5cGUgKFVOSUNBU1RfQUREUkVTUyBpcyBkZWZhdWx0KSovCisJaWYgKHVubGlrZWx5KGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0KSkpIHsKKwkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0KSkKKwkJCW1hY190eXBlID0gQlJPQURDQVNUX0FERFJFU1M7CisJCWVsc2UKKwkJCW1hY190eXBlID0gTVVMVElDQVNUX0FERFJFU1M7CisJfQorCisjaWYgKE1BWF9TS0JfRlJBR1MgPj0gTUFYX0ZFVENIX0JEIC0gMykKKwkvKiBGaXJzdCwgY2hlY2sgaWYgd2UgbmVlZCB0byBsaW5lYXJpemUgdGhlIHNrYiAoZHVlIHRvIEZXCisJICAgcmVzdHJpY3Rpb25zKS4gTm8gbmVlZCB0byBjaGVjayBmcmFnbWVudGF0aW9uIGlmIHBhZ2Ugc2l6ZSA+IDhLCisJICAgKHRoZXJlIHdpbGwgYmUgbm8gdmlvbGF0aW9uIHRvIEZXIHJlc3RyaWN0aW9ucykgKi8KKwlpZiAoYm54MnhfcGt0X3JlcV9saW4oYnAsIHNrYiwgeG1pdF90eXBlKSkgeworCQkvKiBTdGF0aXN0aWNzIG9mIGxpbmVhcml6YXRpb24gKi8KKwkJYnAtPmxpbl9jbnQrKzsKKwkJaWYgKHNrYl9saW5lYXJpemUoc2tiKSAhPSAwKSB7CisJCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiU0tCIGxpbmVhcml6YXRpb24gZmFpbGVkIC0gIgorCQkJICAgInNpbGVudGx5IGRyb3BwaW5nIHRoaXMgU0tCXG4iKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gTkVUREVWX1RYX09LOworCQl9CisJfQorI2VuZGlmCisKKwkvKgorCVBsZWFzZSByZWFkIGNhcmVmdWxseS4gRmlyc3Qgd2UgdXNlIG9uZSBCRCB3aGljaCB3ZSBtYXJrIGFzIHN0YXJ0LAorCXRoZW4gd2UgaGF2ZSBhIHBhcnNpbmcgaW5mbyBCRCAodXNlZCBmb3IgVFNPIG9yIHhzdW0pLAorCWFuZCBvbmx5IHRoZW4gd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgVFNPIEJEcy4KKwkoZG9uJ3QgZm9yZ2V0IHRvIG1hcmsgdGhlIGxhc3Qgb25lIGFzIGxhc3QsCisJYW5kIHRvIHVubWFwIG9ubHkgQUZURVIgeW91IHdyaXRlIHRvIHRoZSBCRCAuLi4pCisJQW5kIGFib3ZlIGFsbCwgYWxsIHBkYiBzaXplcyBhcmUgaW4gd29yZHMgLSBOT1QgRFdPUkRTIQorCSovCisKKwlwa3RfcHJvZCA9IGZwLT50eF9wa3RfcHJvZCsrOworCWJkX3Byb2QgPSBUWF9CRChmcC0+dHhfYmRfcHJvZCk7CisKKwkvKiBnZXQgYSB0eF9idWYgYW5kIGZpcnN0IEJEICovCisJdHhfYnVmID0gJmZwLT50eF9idWZfcmluZ1tUWF9CRChwa3RfcHJvZCldOworCXR4X3N0YXJ0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0uc3RhcnRfYmQ7CisKKwl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgPSBFVEhfVFhfQkRfRkxBR1NfU1RBUlRfQkQ7CisJdHhfc3RhcnRfYmQtPmdlbmVyYWxfZGF0YSA9ICAobWFjX3R5cGUgPDwKKwkJCQkJRVRIX1RYX1NUQVJUX0JEX0VUSF9BRERSX1RZUEVfU0hJRlQpOworCS8qIGhlYWRlciBuYmQgKi8KKwl0eF9zdGFydF9iZC0+Z2VuZXJhbF9kYXRhIHw9ICgxIDw8IEVUSF9UWF9TVEFSVF9CRF9IRFJfTkJEU19TSElGVCk7CisKKwkvKiByZW1lbWJlciB0aGUgZmlyc3QgQkQgb2YgdGhlIHBhY2tldCAqLworCXR4X2J1Zi0+Zmlyc3RfYmQgPSBmcC0+dHhfYmRfcHJvZDsKKwl0eF9idWYtPnNrYiA9IHNrYjsKKwl0eF9idWYtPmZsYWdzID0gMDsKKworCURQKE5FVElGX01TR19UWF9RVUVVRUQsCisJICAgInNlbmRpbmcgcGt0ICV1IEAlcCAgbmV4dF9pZHggJXUgIGJkICV1IEAlcFxuIiwKKwkgICBwa3RfcHJvZCwgdHhfYnVmLCBmcC0+dHhfcGt0X3Byb2QsIGJkX3Byb2QsIHR4X3N0YXJ0X2JkKTsKKworI2lmZGVmIEJDTV9WTEFOCisJaWYgKChicC0+dmxncnAgIT0gTlVMTCkgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpICYmCisJICAgIChicC0+ZmxhZ3MgJiBIV19WTEFOX1RYX0ZMQUcpKSB7CisJCXR4X3N0YXJ0X2JkLT52bGFuID0gY3B1X3RvX2xlMTYodmxhbl90eF90YWdfZ2V0KHNrYikpOworCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0gRVRIX1RYX0JEX0ZMQUdTX1ZMQU5fVEFHOworCX0gZWxzZQorI2VuZGlmCisJCXR4X3N0YXJ0X2JkLT52bGFuID0gY3B1X3RvX2xlMTYocGt0X3Byb2QpOworCisJLyogdHVybiBvbiBwYXJzaW5nIGFuZCBnZXQgYSBCRCAqLworCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CisJcGJkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucGFyc2VfYmQ7CisKKwltZW1zZXQocGJkLCAwLCBzaXplb2Yoc3RydWN0IGV0aF90eF9wYXJzZV9iZCkpOworCisJaWYgKHhtaXRfdHlwZSAmIFhNSVRfQ1NVTSkgeworCQlobGVuID0gKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiLT5kYXRhKSAvIDI7CisKKwkJLyogZm9yIG5vdyBOUyBmbGFnIGlzIG5vdCB1c2VkIGluIExpbnV4ICovCisJCXBiZC0+Z2xvYmFsX2RhdGEgPQorCQkJKGhsZW4gfCAoKHNrYi0+cHJvdG9jb2wgPT0gY3B1X3RvX2JlMTYoRVRIX1BfODAyMVEpKSA8PAorCQkJCSBFVEhfVFhfUEFSU0VfQkRfTExDX1NOQVBfRU5fU0hJRlQpKTsKKworCQlwYmQtPmlwX2hsZW4gPSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtCisJCQkJc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpIC8gMjsKKworCQlobGVuICs9IHBiZC0+aXBfaGxlbiArIHRjcF9oZHJsZW4oc2tiKSAvIDI7CisKKwkJcGJkLT50b3RhbF9obGVuID0gY3B1X3RvX2xlMTYoaGxlbik7CisJCWhsZW4gPSBobGVuKjI7CisKKwkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9IEVUSF9UWF9CRF9GTEFHU19MNF9DU1VNOworCisJCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU1fVjQpCisJCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0KKwkJCQkJCUVUSF9UWF9CRF9GTEFHU19JUF9DU1VNOworCQllbHNlCisJCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0KKwkJCQkJCUVUSF9UWF9CRF9GTEFHU19JUFY2OworCisJCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU1fVENQKSB7CisJCQlwYmQtPnRjcF9wc2V1ZG9fY3N1bSA9IHN3YWIxNih0Y3BfaGRyKHNrYiktPmNoZWNrKTsKKworCQl9IGVsc2UgeworCQkJczggZml4ID0gU0tCX0NTX09GRihza2IpOyAvKiBzaWduZWQhICovCisKKwkJCXBiZC0+Z2xvYmFsX2RhdGEgfD0gRVRIX1RYX1BBUlNFX0JEX1VEUF9DU19GTEc7CisKKwkJCURQKE5FVElGX01TR19UWF9RVUVVRUQsCisJCQkgICAiaGxlbiAlZCAgZml4ICVkICBjc3VtIGJlZm9yZSBmaXggJXhcbiIsCisJCQkgICBsZTE2X3RvX2NwdShwYmQtPnRvdGFsX2hsZW4pLCBmaXgsIFNLQl9DUyhza2IpKTsKKworCQkJLyogSFcgYnVnOiBmaXh1cCB0aGUgQ1NVTSAqLworCQkJcGJkLT50Y3BfcHNldWRvX2NzdW0gPQorCQkJCWJueDJ4X2NzdW1fZml4KHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQkJCSAgICAgICBTS0JfQ1Moc2tiKSwgZml4KTsKKworCQkJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgImNzdW0gYWZ0ZXIgZml4ICV4XG4iLAorCQkJICAgcGJkLT50Y3BfcHNldWRvX2NzdW0pOworCQl9CisJfQorCisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCisJdHhfc3RhcnRfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOworCXR4X3N0YXJ0X2JkLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIoVTY0X0xPKG1hcHBpbmcpKTsKKwluYmQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMjsgLyogc3RhcnRfYmQgKyBwYmQgKyBmcmFncyAqLworCXR4X3N0YXJ0X2JkLT5uYmQgPSBjcHVfdG9fbGUxNihuYmQpOworCXR4X3N0YXJ0X2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihza2JfaGVhZGxlbihza2IpKTsKKwlwa3Rfc2l6ZSA9IHR4X3N0YXJ0X2JkLT5uYnl0ZXM7CisKKwlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiZmlyc3QgYmQgQCVwICBhZGRyICgleDoleCkgIG5iZCAlZCIKKwkgICAiICBuYnl0ZXMgJWQgIGZsYWdzICV4ICB2bGFuICV4XG4iLAorCSAgIHR4X3N0YXJ0X2JkLCB0eF9zdGFydF9iZC0+YWRkcl9oaSwgdHhfc3RhcnRfYmQtPmFkZHJfbG8sCisJICAgbGUxNl90b19jcHUodHhfc3RhcnRfYmQtPm5iZCksIGxlMTZfdG9fY3B1KHR4X3N0YXJ0X2JkLT5uYnl0ZXMpLAorCSAgIHR4X3N0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCwgbGUxNl90b19jcHUodHhfc3RhcnRfYmQtPnZsYW4pKTsKKworCWlmICh4bWl0X3R5cGUgJiBYTUlUX0dTTykgeworCisJCURQKE5FVElGX01TR19UWF9RVUVVRUQsCisJCSAgICJUU08gcGFja2V0IGxlbiAlZCAgaGxlbiAlZCAgdG90YWwgbGVuICVkICB0c28gc2l6ZSAlZFxuIiwKKwkJICAgc2tiLT5sZW4sIGhsZW4sIHNrYl9oZWFkbGVuKHNrYiksCisJCSAgIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOworCisJCXR4X3N0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBFVEhfVFhfQkRfRkxBR1NfU1dfTFNPOworCisJCWlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpID4gaGxlbikpCisJCQliZF9wcm9kID0gYm54MnhfdHhfc3BsaXQoYnAsIGZwLCB0eF9idWYsICZ0eF9zdGFydF9iZCwKKwkJCQkJCSBobGVuLCBiZF9wcm9kLCArK25iZCk7CisKKwkJcGJkLT5sc29fbXNzID0gY3B1X3RvX2xlMTYoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7CisJCXBiZC0+dGNwX3NlbmRfc2VxID0gc3dhYjMyKHRjcF9oZHIoc2tiKS0+c2VxKTsKKwkJcGJkLT50Y3BfZmxhZ3MgPSBwYmRfdGNwX2ZsYWdzKHNrYik7CisKKwkJaWYgKHhtaXRfdHlwZSAmIFhNSVRfR1NPX1Y0KSB7CisJCQlwYmQtPmlwX2lkID0gc3dhYjE2KGlwX2hkcihza2IpLT5pZCk7CisJCQlwYmQtPnRjcF9wc2V1ZG9fY3N1bSA9CisJCQkJc3dhYjE2KH5jc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkJICBpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkJICAwLCBJUFBST1RPX1RDUCwgMCkpOworCisJCX0gZWxzZQorCQkJcGJkLT50Y3BfcHNldWRvX2NzdW0gPQorCQkJCXN3YWIxNih+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCQkmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkJMCwgSVBQUk9UT19UQ1AsIDApKTsKKworCQlwYmQtPmdsb2JhbF9kYXRhIHw9IEVUSF9UWF9QQVJTRV9CRF9QU0VVRE9fQ1NfV0lUSE9VVF9MRU47CisJfQorCXR4X2RhdGFfYmQgPSAoc3RydWN0IGV0aF90eF9iZCAqKXR4X3N0YXJ0X2JkOworCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKKwkJdHhfZGF0YV9iZCA9ICZmcC0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnJlZ19iZDsKKwkJaWYgKHRvdGFsX3BrdF9iZCA9PSBOVUxMKQorCQkJdG90YWxfcGt0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucmVnX2JkOworCisJCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIGZyYWctPnBhZ2UsCisJCQkJICAgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCSAgICAgICBmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKworCQl0eF9kYXRhX2JkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKKwkJdHhfZGF0YV9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7CisJCXR4X2RhdGFfYmQtPm5ieXRlcyA9IGNwdV90b19sZTE2KGZyYWctPnNpemUpOworCQlsZTE2X2FkZF9jcHUoJnBrdF9zaXplLCBmcmFnLT5zaXplKTsKKworCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELAorCQkgICAiZnJhZyAlZCAgYmQgQCVwICBhZGRyICgleDoleCkgIG5ieXRlcyAlZFxuIiwKKwkJICAgaSwgdHhfZGF0YV9iZCwgdHhfZGF0YV9iZC0+YWRkcl9oaSwgdHhfZGF0YV9iZC0+YWRkcl9sbywKKwkJICAgbGUxNl90b19jcHUodHhfZGF0YV9iZC0+bmJ5dGVzKSk7CisJfQorCisJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgImxhc3QgYmQgQCVwXG4iLCB0eF9kYXRhX2JkKTsKKworCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CisKKwkvKiBub3cgc2VuZCBhIHR4IGRvb3JiZWxsLCBjb3VudGluZyB0aGUgbmV4dCBCRAorCSAqIGlmIHRoZSBwYWNrZXQgY29udGFpbnMgb3IgZW5kcyB3aXRoIGl0CisJICovCisJaWYgKFRYX0JEX1BPRkYoYmRfcHJvZCkgPCBuYmQpCisJCW5iZCsrOworCisJaWYgKHRvdGFsX3BrdF9iZCAhPSBOVUxMKQorCQl0b3RhbF9wa3RfYmQtPnRvdGFsX3BrdF9ieXRlcyA9IHBrdF9zaXplOworCisJaWYgKHBiZCkKKwkJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwKKwkJICAgIlBCRCBAJXAgIGlwX2RhdGEgJXggIGlwX2hsZW4gJXUgIGlwX2lkICV1ICBsc29fbXNzICV1IgorCQkgICAiICB0Y3BfZmxhZ3MgJXggIHhzdW0gJXggIHNlcSAldSAgaGxlbiAldVxuIiwKKwkJICAgcGJkLCBwYmQtPmdsb2JhbF9kYXRhLCBwYmQtPmlwX2hsZW4sIHBiZC0+aXBfaWQsCisJCSAgIHBiZC0+bHNvX21zcywgcGJkLT50Y3BfZmxhZ3MsIHBiZC0+dGNwX3BzZXVkb19jc3VtLAorCQkgICBwYmQtPnRjcF9zZW5kX3NlcSwgbGUxNl90b19jcHUocGJkLT50b3RhbF9obGVuKSk7CisKKwlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiZG9vcmJlbGw6IG5iZCAlZCAgYmQgJXVcbiIsIG5iZCwgYmRfcHJvZCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBCRCBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBwcm9kdWNlcgorCSAqIHNpbmNlIEZXIG1pZ2h0IHJlYWQgdGhlIEJEIHJpZ2h0IGFmdGVyIHRoZSBwcm9kdWNlciBpcyB1cGRhdGVkLgorCSAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzIHN1Y2gKKwkgKiBhcyBJQS02NC4gVGhlIGZvbGxvd2luZyBiYXJyaWVyIGlzIGFsc28gbWFuZGF0b3J5IHNpbmNlIEZXIHdpbGwKKwkgKiBhc3N1bWVzIHBhY2tldHMgbXVzdCBoYXZlIEJEcy4KKwkgKi8KKwl3bWIoKTsKKworCWZwLT50eF9kYi5kYXRhLnByb2QgKz0gbmJkOworCWJhcnJpZXIoKTsKKwlET09SQkVMTChicCwgZnAtPmluZGV4LCBmcC0+dHhfZGIucmF3KTsKKworCW1taW93YigpOworCisJZnAtPnR4X2JkX3Byb2QgKz0gbmJkOworCisJaWYgKHVubGlrZWx5KGJueDJ4X3R4X2F2YWlsKGZwKSA8IE1BWF9TS0JfRlJBR1MgKyAzKSkgeworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisKKwkJLyogcGFpcmVkIG1lbW9yeSBiYXJyaWVyIGlzIGluIGJueDJ4X3R4X2ludCgpLCB3ZSBoYXZlIHRvIGtlZXAKKwkJICogb3JkZXJpbmcgb2Ygc2V0X2JpdCgpIGluIG5ldGlmX3R4X3N0b3BfcXVldWUoKSBhbmQgcmVhZCBvZgorCQkgKiBmcC0+YmRfdHhfY29ucyAqLworCQlzbXBfbWIoKTsKKworCQlmcC0+ZXRoX3Ffc3RhdHMuZHJpdmVyX3hvZmYrKzsKKwkJaWYgKGJueDJ4X3R4X2F2YWlsKGZwKSA+PSBNQVhfU0tCX0ZSQUdTICsgMykKKwkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKKwl9CisJZnAtPnR4X3BrdCsrOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKy8qIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLworaW50IGJueDJ4X2NoYW5nZV9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoKHU4ICopKGFkZHItPnNhX2RhdGEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlpZiAoQ0hJUF9JU19FMShicCkpCisJCQlibngyeF9zZXRfZXRoX21hY19hZGRyX2UxKGJwLCAxKTsKKwkJZWxzZQorCQkJYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMWgoYnAsIDEpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KK2ludCBibngyeF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYyA9IDA7CisKKwlpZiAoYnAtPnJlY292ZXJ5X3N0YXRlICE9IEJOWDJYX1JFQ09WRVJZX0RPTkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIYW5kbGluZyBwYXJpdHkgZXJyb3IgcmVjb3ZlcnkuIFRyeSBhZ2FpbiBsYXRlclxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmICgobmV3X210dSA+IEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUpIHx8CisJICAgICgobmV3X210dSArIEVUSF9ITEVOKSA8IEVUSF9NSU5fUEFDS0VUX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoaXMgZG9lcyBub3QgcmFjZSB3aXRoIHBhY2tldCBhbGxvY2F0aW9uCisJICogYmVjYXVzZSB0aGUgYWN0dWFsIGFsbG9jIHNpemUgaXMKKwkgKiBvbmx5IHVwZGF0ZWQgYXMgcGFydCBvZiBsb2FkCisJICovCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKKwkJcmMgPSBibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOworCX0KKworCXJldHVybiByYzsKK30KKwordm9pZCBibngyeF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKCFicC0+cGFuaWMpCisJCWJueDJ4X3BhbmljKCk7CisjZW5kaWYKKwkvKiBUaGlzIGFsbG93cyB0aGUgbmV0aWYgdG8gYmUgc2h1dGRvd24gZ3JhY2VmdWxseSBiZWZvcmUgcmVzZXR0aW5nICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cmVzZXRfdGFzaywgMCk7Cit9CisKKyNpZmRlZiBCQ01fVkxBTgorLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCit2b2lkIGJueDJ4X3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnApCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlicC0+dmxncnAgPSB2bGdycDsKKworCS8qIFNldCBmbGFncyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyAqLworCWJwLT5mbGFncyAmPSB+KEhXX1ZMQU5fUlhfRkxBRyB8IEhXX1ZMQU5fVFhfRkxBRyk7CisKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkKKwkJYnAtPmZsYWdzIHw9IEhXX1ZMQU5fVFhfRkxBRzsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlicC0+ZmxhZ3MgfD0gSFdfVkxBTl9SWF9GTEFHOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYm54Mnhfc2V0X2NsaWVudF9jb25maWcoYnApOworfQorCisjZW5kaWYKK2ludCBibngyeF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYm54MnggKmJwOworCisJaWYgKCFkZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQkFEIG5ldCBkZXZpY2UgZnJvbSBibngyeF9pbml0X29uZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlydG5sX2xvY2soKTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX0NMT1NFKTsKKworCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcnRubF91bmxvY2soKTsKKworCXJldHVybiAwOworfQorCitpbnQgYm54MnhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGJueDJ4ICpicDsKKwlpbnQgcmM7CisKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCQUQgbmV0IGRldmljZSBmcm9tIGJueDJ4X2luaXRfb25lXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChicC0+cmVjb3Zlcnlfc3RhdGUgIT0gQk5YMlhfUkVDT1ZFUllfRE9ORSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhhbmRsaW5nIHBhcml0eSBlcnJvciByZWNvdmVyeS4gVHJ5IGFnYWluIGxhdGVyXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcnRubF9sb2NrKCk7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKworCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QwKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlyYyA9IGJueDJ4X25pY19sb2FkKGJwLCBMT0FEX09QRU4pOworCisJcnRubF91bmxvY2soKTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2Ntbi5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfY21uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5NzliMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2Ntbi5oCkBAIC0wLDAgKzEsNjUyIEBACisvKiBibngyeF9jbW4uaDogQnJvYWRjb20gRXZlcmVzdCBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgorICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCisgKiBVRFAgQ1NVTSBlcnJhdGEgd29ya2Fyb3VuZCBieSBBcmlrIEdlbmRlbG1hbgorICogU2xvd3BhdGggYW5kIGZhc3RwYXRoIHJld29yayBieSBWbGFkaXNsYXYgWm9sb3Rhcm92CisgKiBTdGF0aXN0aWNzIGFuZCBMaW5rIG1hbmFnZW1lbnQgYnkgWWl0Y2hhayBHZXJ0bmVyCisgKgorICovCisjaWZuZGVmIEJOWDJYX0NNTl9ICisjZGVmaW5lIEJOWDJYX0NNTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisKKyNpbmNsdWRlICJibngyeC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBGdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggZHJpdmVyIHZlcnNpb24KKyAqLworCisvKioKKyAqIEluaXRpYWxpemUgbGluayBwYXJhbWV0ZXJzIHN0cnVjdHVyZSB2YXJpYWJsZXMuCisgKgorICogQHBhcmFtIGJwCisgKiBAcGFyYW0gbG9hZF9tb2RlCisgKgorICogQHJldHVybiB1OAorICovCit1OCBibngyeF9pbml0aWFsX3BoeV9pbml0KHN0cnVjdCBibngyeCAqYnAsIGludCBsb2FkX21vZGUpOworCisvKioKKyAqIENvbmZpZ3VyZSBodyBhY2NvcmRpbmcgdG8gbGluayBwYXJhbWV0ZXJzIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gYnAKKyAqLwordm9pZCBibngyeF9saW5rX3NldChzdHJ1Y3QgYm54MnggKmJwKTsKKworLyoqCisgKiBRdWVyeSBsaW5rIHN0YXR1cworICoKKyAqIEBwYXJhbSBicAorICoKKyAqIEByZXR1cm4gMCAtIGxpbmsgaXMgVVAKKyAqLwordTggYm54MnhfbGlua190ZXN0KHN0cnVjdCBibngyeCAqYnApOworCisvKioKKyAqIEhhbmRsZXMgbGluayBzdGF0dXMgY2hhbmdlCisgKgorICogQHBhcmFtIGJwCisgKi8KK3ZvaWQgYm54MnhfX2xpbmtfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKTsKKworLyoqCisgKiBNU0ktWCBzbG93cGF0aCBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqIEBwYXJhbSBpcnEKKyAqIEBwYXJhbSBkZXZfaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIGlycXJldHVybl90CisgKi8KK2lycXJldHVybl90IGJueDJ4X21zaXhfc3BfaW50KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CisKKy8qKgorICogbm9uIE1TSS1YIGludGVycnVwdCBoYW5kbGVyCisgKgorICogQHBhcmFtIGlycQorICogQHBhcmFtIGRldl9pbnN0YW5jZQorICoKKyAqIEByZXR1cm4gaXJxcmV0dXJuX3QKKyAqLworaXJxcmV0dXJuX3QgYm54MnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CisjaWZkZWYgQkNNX0NOSUMKKworLyoqCisgKiBTZW5kIGNvbW1hbmQgdG8gY25pYyBkcml2ZXIKKyAqCisgKiBAcGFyYW0gYnAKKyAqIEBwYXJhbSBjbWQKKyAqLworaW50IGJueDJ4X2NuaWNfbm90aWZ5KHN0cnVjdCBibngyeCAqYnAsIGludCBjbWQpOworCisvKioKKyAqIFByb3ZpZGVzIGNuaWMgaW5mb3JtYXRpb24gZm9yIHByb3BlciBpbnRlcnJ1cHQgaGFuZGxpbmcKKyAqCisgKiBAcGFyYW0gYnAKKyAqLwordm9pZCBibngyeF9zZXR1cF9jbmljX2lycV9pbmZvKHN0cnVjdCBibngyeCAqYnApOworI2VuZGlmCisKKy8qKgorICogRW5hYmxlIEhXIGludGVycnVwdHMuCisgKgorICogQHBhcmFtIGJwCisgKi8KK3ZvaWQgYm54MnhfaW50X2VuYWJsZShzdHJ1Y3QgYm54MnggKmJwKTsKKworLyoqCisgKiBEaXNhYmxlIGludGVycnVwdHMuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubworICogSVNScyBvciBTUCBEUENzIChzcF90YXNrKSBhcmUgcnVubmluZyBhZnRlciBpdCByZXR1cm5zLgorICoKKyAqIEBwYXJhbSBicAorICogQHBhcmFtIGRpc2FibGVfaHcgaWYgdHJ1ZSwgZGlzYWJsZSBIVyBpbnRlcnJ1cHRzLgorICovCit2b2lkIGJueDJ4X2ludF9kaXNhYmxlX3N5bmMoc3RydWN0IGJueDJ4ICpicCwgaW50IGRpc2FibGVfaHcpOworCisvKioKKyAqIEluaXQgSFcgYmxvY2tzIGFjY29yZGluZyB0byBjdXJyZW50IGluaXRpYWxpemF0aW9uIHN0YWdlOgorICogQ09NTU9OLCBQT1JUIG9yIEZVTkNUSU9OLgorICoKKyAqIEBwYXJhbSBicAorICogQHBhcmFtIGxvYWRfY29kZTogQ09NTU9OLCBQT1JUIG9yIEZVTkNUSU9OCisgKgorICogQHJldHVybiBpbnQKKyAqLworaW50IGJueDJ4X2luaXRfaHcoc3RydWN0IGJueDJ4ICpicCwgdTMyIGxvYWRfY29kZSk7CisKKy8qKgorICogSW5pdCBkcml2ZXIgaW50ZXJuYWxzOgorICogIC0gcmluZ3MKKyAqICAtIHN0YXR1cyBibG9ja3MKKyAqICAtIGV0Yy4KKyAqCisgKiBAcGFyYW0gYnAKKyAqIEBwYXJhbSBsb2FkX2NvZGUgQ09NTU9OLCBQT1JUIG9yIEZVTkNUSU9OCisgKi8KK3ZvaWQgYm54MnhfbmljX2luaXQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGxvYWRfY29kZSk7CisKKy8qKgorICogQWxsb2NhdGUgZHJpdmVyJ3MgbWVtb3J5LgorICoKKyAqIEBwYXJhbSBicAorICoKKyAqIEByZXR1cm4gaW50CisgKi8KK2ludCBibngyeF9hbGxvY19tZW0oc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogUmVsZWFzZSBkcml2ZXIncyBtZW1vcnkuCisgKgorICogQHBhcmFtIGJwCisgKi8KK3ZvaWQgYm54MnhfZnJlZV9tZW0oc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogQnJpbmcgdXAgYSBsZWFkaW5nICh0aGUgZmlyc3QpIGV0aCBDbGllbnQuCisgKgorICogQHBhcmFtIGJwCisgKgorICogQHJldHVybiBpbnQKKyAqLworaW50IGJueDJ4X3NldHVwX2xlYWRpbmcoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogU2V0dXAgbm9uLWxlYWRpbmcgZXRoIENsaWVudC4KKyAqCisgKiBAcGFyYW0gYnAKKyAqIEBwYXJhbSBmcAorICoKKyAqIEByZXR1cm4gaW50CisgKi8KK2ludCBibngyeF9zZXR1cF9tdWx0aShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgaW5kZXgpOworCisvKioKKyAqIFNldCBudW1iZXIgb2YgcXV1ZXVzIGFjY29yZGluZyB0byBtb2RlIGFuZCBudW1iZXIgb2YgYXZhaWxhYmxlCisgKiBtc2kteCB2ZWN0b3JzCisgKgorICogQHBhcmFtIGJwCisgKgorICovCit2b2lkIGJueDJ4X3NldF9udW1fcXVldWVzX21zaXgoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogQ2xlYW51cCBjaGlwIGludGVybmFsczoKKyAqIC0gQ2xlYW51cCBNQUMgY29uZmlndXJhdGlvbi4KKyAqIC0gQ2xvc2UgY2xpZW50cy4KKyAqIC0gZXRjLgorICoKKyAqIEBwYXJhbSBicAorICogQHBhcmFtIHVubG9hZF9tb2RlCisgKi8KK3ZvaWQgYm54MnhfY2hpcF9jbGVhbnVwKHN0cnVjdCBibngyeCAqYnAsIGludCB1bmxvYWRfbW9kZSk7CisKKy8qKgorICogQWNxdWlyZSBIVyBsb2NrLgorICoKKyAqIEBwYXJhbSBicAorICogQHBhcmFtIHJlc291cmNlIFJlc291cmNlIGJpdCB3aGljaCB3YXMgbG9ja2VkCisgKgorICogQHJldHVybiBpbnQKKyAqLworaW50IGJueDJ4X2FjcXVpcmVfaHdfbG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzb3VyY2UpOworCisvKioKKyAqIFJlbGVhc2UgSFcgbG9jay4KKyAqCisgKiBAcGFyYW0gYnAgZHJpdmVyIGhhbmRsZQorICogQHBhcmFtIHJlc291cmNlIFJlc291cmNlIGJpdCB3aGljaCB3YXMgbG9ja2VkCisgKgorICogQHJldHVybiBpbnQKKyAqLworaW50IGJueDJ4X3JlbGVhc2VfaHdfbG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzb3VyY2UpOworCisvKioKKyAqIENvbmZpZ3VyZSBldGggTUFDIGFkZHJlc3MgaW4gdGhlIEhXIGFjY29yZGluZyB0byB0aGUgdmFsdWUgaW4KKyAqIG5ldGRldi0+ZGV2X2FkZHIgZm9yIDU3NzExCisgKgorICogQHBhcmFtIGJwIGRyaXZlciBoYW5kbGUKKyAqIEBwYXJhbSBzZXQKKyAqLwordm9pZCBibngyeF9zZXRfZXRoX21hY19hZGRyX2UxaChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0KTsKKworLyoqCisgKiBDb25maWd1cmUgZXRoIE1BQyBhZGRyZXNzIGluIHRoZSBIVyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIGluCisgKiBuZXRkZXYtPmRldl9hZGRyIGZvciA1NzcxMAorICoKKyAqIEBwYXJhbSBicCBkcml2ZXIgaGFuZGxlCisgKiBAcGFyYW0gc2V0CisgKi8KK3ZvaWQgYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0KTsKKworI2lmZGVmIEJDTV9DTklDCisvKioKKyAqIFNldCBpU0NTSSBNQUMocykgYXQgdGhlIG5leHQgZW50aWVzIGluIHRoZSBDQU0gYWZ0ZXIgdGhlIEVUSAorICogTUFDKHMpLiBUaGUgZnVuY3Rpb24gd2lsbCB3YWl0IHVudGlsIHRoZSByYW1yb2QgY29tcGxldGlvbgorICogcmV0dXJucy4KKyAqCisgKiBAcGFyYW0gYnAgZHJpdmVyIGhhbmRsZQorICogQHBhcmFtIHNldCBzZXQgb3IgY2xlYXIgdGhlIENBTSBlbnRyeQorICoKKyAqIEByZXR1cm4gMCBpZiBjdXNzZXNzLCAtRU5PREVWIGlmIHJhbXJvZCBkb2Vzbid0IHJldHVybi4KKyAqLworaW50IGJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCk7CisjZW5kaWYKKworLyoqCisgKiBJbml0aWFsaXplIHN0YXR1cyBibG9jayBpbiBGVyBhbmQgSFcKKyAqCisgKiBAcGFyYW0gYnAgZHJpdmVyIGhhbmRsZQorICogQHBhcmFtIHNiIGhvc3Rfc3RhdHVzX2Jsb2NrCisgKiBAcGFyYW0gZG1hX2FkZHJfdCBtYXBwaW5nCisgKiBAcGFyYW0gaW50IHNiX2lkCisgKi8KK3ZvaWQgYm54MnhfaW5pdF9zYihzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2sgKnNiLAorCQkJICBkbWFfYWRkcl90IG1hcHBpbmcsIGludCBzYl9pZCk7CisKKy8qKgorICogUmVjb25maWd1cmUgRlcvSFcgYWNjb3JkaW5nIHRvIGRldi0+ZmxhZ3MgcnggbW9kZQorICoKKyAqIEBwYXJhbSBkZXYgbmV0X2RldmljZQorICoKKyAqLwordm9pZCBibngyeF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqCisgKiBDb25maWd1cmUgTUFDIGZpbHRlcmluZyBydWxlcyBpbiBhIEZXLgorICoKKyAqIEBwYXJhbSBicCBkcml2ZXIgaGFuZGxlCisgKi8KK3ZvaWQgYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qIFBhcml0eSBlcnJvcnMgcmVsYXRlZCAqLwordm9pZCBibngyeF9pbmNfbG9hZF9jbnQoc3RydWN0IGJueDJ4ICpicCk7Cit1MzIgYm54MnhfZGVjX2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApOworYm9vbCBibngyeF9jaGtfcGFyaXR5X2F0dG4oc3RydWN0IGJueDJ4ICpicCk7Citib29sIGJueDJ4X3Jlc2V0X2lzX2RvbmUoc3RydWN0IGJueDJ4ICpicCk7Cit2b2lkIGJueDJ4X2Rpc2FibGVfY2xvc2VfdGhlX2dhdGUoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogUGVyZm9ybSBzdGF0aXN0aWNzIGhhbmRsaW5nIGFjY29yZGluZyB0byBldmVudAorICoKKyAqIEBwYXJhbSBicCBkcml2ZXIgaGFuZGxlCisgKiBAcGFyYW0gZXZlbiB0Ym54Mnhfc3RhdHNfZXZlbnQKKyAqLwordm9pZCBibngyeF9zdGF0c19oYW5kbGUoc3RydWN0IGJueDJ4ICpicCwgZW51bSBibngyeF9zdGF0c19ldmVudCBldmVudCk7CisKKy8qKgorICogQ29uZmlndXJlcyBGVyB3aXRoIGNsaWVudCBwYXJhbXRlcmVzIChsaWtlIEhXIFZMQU4gcmVtb3ZhbCkKKyAqIGZvciBlYWNoIGFjdGl2ZSBjbGllbnQuCisgKgorICogQHBhcmFtIGJwCisgKi8KK3ZvaWQgYm54Mnhfc2V0X2NsaWVudF9jb25maWcoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogSGFuZGxlIHNwIGV2ZW50cworICoKKyAqIEBwYXJhbSBmcCBmYXN0cGF0aCBoYW5kbGUgZm9yIHRoZSBldmVudAorICogQHBhcmFtIHJyX2NxZSBldGhfcnhfY3FlCisgKi8KK3ZvaWQgYm54Mnhfc3BfZXZlbnQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgIHVuaW9uIGV0aF9yeF9jcWUgKnJyX2NxZSk7CisKKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9mcHNiX2lkeChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQoreworCXN0cnVjdCBob3N0X3N0YXR1c19ibG9jayAqZnBzYiA9IGZwLT5zdGF0dXNfYmxrOworCisJYmFycmllcigpOyAvKiBzdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiB0byBieSB0aGUgY2hpcCAqLworCWZwLT5mcF9jX2lkeCA9IGZwc2ItPmNfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleDsKKwlmcC0+ZnBfdV9pZHggPSBmcHNiLT51X3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF91cGRhdGVfcnhfcHJvZChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAorCQkJCQl1MTYgYmRfcHJvZCwgdTE2IHJ4X2NvbXBfcHJvZCwKKwkJCQkJdTE2IHJ4X3NnZV9wcm9kKQoreworCXN0cnVjdCB1c3Rvcm1fZXRoX3J4X3Byb2R1Y2VycyByeF9wcm9kcyA9IHswfTsKKwlpbnQgaTsKKworCS8qIFVwZGF0ZSBwcm9kdWNlcnMgKi8KKwlyeF9wcm9kcy5iZF9wcm9kID0gYmRfcHJvZDsKKwlyeF9wcm9kcy5jcWVfcHJvZCA9IHJ4X2NvbXBfcHJvZDsKKwlyeF9wcm9kcy5zZ2VfcHJvZCA9IHJ4X3NnZV9wcm9kOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgQkQgYW5kIFNHRSBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZQorCSAqIHByb2R1Y2VycyBzaW5jZSBGVyBtaWdodCByZWFkIHRoZSBCRC9TR0UgcmlnaHQgYWZ0ZXIgdGhlIHByb2R1Y2VyCisJICogaXMgdXBkYXRlZC4KKwkgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocyBzdWNoCisJICogYXMgSUEtNjQuIFRoZSBmb2xsb3dpbmcgYmFycmllciBpcyBhbHNvIG1hbmRhdG9yeSBzaW5jZSBGVyB3aWxsCisJICogYXNzdW1lcyBCRHMgbXVzdCBoYXZlIGJ1ZmZlcnMuCisJICovCisJd21iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB1c3Rvcm1fZXRoX3J4X3Byb2R1Y2VycykvNDsgaSsrKQorCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCisJCSAgICAgICBVU1RPUk1fUlhfUFJPRFNfT0ZGU0VUKEJQX1BPUlQoYnApLCBmcC0+Y2xfaWQpICsgaSo0LAorCQkgICAgICAgKCh1MzIgKikmcnhfcHJvZHMpW2ldKTsKKworCW1taW93YigpOyAvKiBrZWVwIHByb2QgdXBkYXRlcyBvcmRlcmVkICovCisKKwlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAorCSAgICJxdWV1ZVslZF06ICB3cm90ZSAgYmRfcHJvZCAldSAgY3FlX3Byb2QgJXUgIHNnZV9wcm9kICV1XG4iLAorCSAgIGZwLT5pbmRleCwgYmRfcHJvZCwgcnhfY29tcF9wcm9kLCByeF9zZ2VfcHJvZCk7Cit9CisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfYWNrX3NiKHN0cnVjdCBibngyeCAqYnAsIHU4IHNiX2lkLAorCQkJCXU4IHN0b3JtLCB1MTYgaW5kZXgsIHU4IG9wLCB1OCB1cGRhdGUpCit7CisJdTMyIGhjX2FkZHIgPSAoSENfUkVHX0NPTU1BTkRfUkVHICsgQlBfUE9SVChicCkqMzIgKworCQkgICAgICAgQ09NTUFORF9SRUdfSU5UX0FDSyk7CisJc3RydWN0IGlndV9hY2tfcmVnaXN0ZXIgaWd1X2FjazsKKworCWlndV9hY2suc3RhdHVzX2Jsb2NrX2luZGV4ID0gaW5kZXg7CisJaWd1X2Fjay5zYl9pZF9hbmRfZmxhZ3MgPQorCQkJKChzYl9pZCA8PCBJR1VfQUNLX1JFR0lTVEVSX1NUQVRVU19CTE9DS19JRF9TSElGVCkgfAorCQkJIChzdG9ybSA8PCBJR1VfQUNLX1JFR0lTVEVSX1NUT1JNX0lEX1NISUZUKSB8CisJCQkgKHVwZGF0ZSA8PCBJR1VfQUNLX1JFR0lTVEVSX1VQREFURV9JTkRFWF9TSElGVCkgfAorCQkJIChvcCA8PCBJR1VfQUNLX1JFR0lTVEVSX0lOVEVSUlVQVF9NT0RFX1NISUZUKSk7CisKKwlEUChCTlgyWF9NU0dfT0ZGLCAid3JpdGUgMHglMDh4IHRvIEhDIGFkZHIgMHgleFxuIiwKKwkgICAoKih1MzIgKikmaWd1X2FjayksIGhjX2FkZHIpOworCVJFR19XUihicCwgaGNfYWRkciwgKCoodTMyICopJmlndV9hY2spKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IEFDSyBpcyB3cml0dGVuICovCisJbW1pb3diKCk7CisJYmFycmllcigpOworfQorc3RhdGljIGlubGluZSB1MTYgYm54MnhfYWNrX2ludChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBoY19hZGRyID0gKEhDX1JFR19DT01NQU5EX1JFRyArIEJQX1BPUlQoYnApKjMyICsKKwkJICAgICAgIENPTU1BTkRfUkVHX1NJTURfTUFTSyk7CisJdTMyIHJlc3VsdCA9IFJFR19SRChicCwgaGNfYWRkcik7CisKKwlEUChCTlgyWF9NU0dfT0ZGLCAicmVhZCAweCUwOHggZnJvbSBIQyBhZGRyIDB4JXhcbiIsCisJICAgcmVzdWx0LCBoY19hZGRyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBmYXN0IHBhdGggc2VydmljZSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBibngyeF9oYXNfdHhfd29ya191bmxvYWQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwkvKiBUZWxsIGNvbXBpbGVyIHRoYXQgY29uc3VtZXIgYW5kIHByb2R1Y2VyIGNhbiBjaGFuZ2UgKi8KKwliYXJyaWVyKCk7CisJcmV0dXJuIChmcC0+dHhfcGt0X3Byb2QgIT0gZnAtPnR4X3BrdF9jb25zKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgYm54MnhfdHhfYXZhaWwoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlzMTYgdXNlZDsKKwl1MTYgcHJvZDsKKwl1MTYgY29uczsKKworCXByb2QgPSBmcC0+dHhfYmRfcHJvZDsKKwljb25zID0gZnAtPnR4X2JkX2NvbnM7CisKKwkvKiBOVU1fVFhfUklOR1MgPSBudW1iZXIgb2YgIm5leHQtcGFnZSIgZW50cmllcworCSAgIEl0IHdpbGwgYmUgdXNlZCBhcyBhIHRocmVzaG9sZCAqLworCXVzZWQgPSBTVUJfUzE2KHByb2QsIGNvbnMpICsgKHMxNilOVU1fVFhfUklOR1M7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJV0FSTl9PTih1c2VkIDwgMCk7CisJV0FSTl9PTih1c2VkID4gZnAtPmJwLT50eF9yaW5nX3NpemUpOworCVdBUk5fT04oKGZwLT5icC0+dHhfcmluZ19zaXplIC0gdXNlZCkgPiBNQVhfVFhfQVZBSUwpOworI2VuZGlmCisKKwlyZXR1cm4gKHMxNikoZnAtPmJwLT50eF9yaW5nX3NpemUpIC0gdXNlZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfaGFzX3R4X3dvcmsoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwl1MTYgaHdfY29uczsKKworCS8qIFRlbGwgY29tcGlsZXIgdGhhdCBzdGF0dXMgYmxvY2sgZmllbGRzIGNhbiBjaGFuZ2UgKi8KKwliYXJyaWVyKCk7CisJaHdfY29ucyA9IGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYik7CisJcmV0dXJuIGh3X2NvbnMgIT0gZnAtPnR4X3BrdF9jb25zOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZnJlZV9yeF9zZ2Uoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3Qgc3dfcnhfcGFnZSAqc3dfYnVmID0gJmZwLT5yeF9wYWdlX3JpbmdbaW5kZXhdOworCXN0cnVjdCBwYWdlICpwYWdlID0gc3dfYnVmLT5wYWdlOworCXN0cnVjdCBldGhfcnhfc2dlICpzZ2UgPSAmZnAtPnJ4X3NnZV9yaW5nW2luZGV4XTsKKworCS8qIFNraXAgIm5leHQgcGFnZSIgZWxlbWVudHMgKi8KKwlpZiAoIXBhZ2UpCisJCXJldHVybjsKKworCWRtYV91bm1hcF9wYWdlKCZicC0+cGRldi0+ZGV2LCBkbWFfdW5tYXBfYWRkcihzd19idWYsIG1hcHBpbmcpLAorCQkgICAgICAgU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCV9fZnJlZV9wYWdlcyhwYWdlLCBQQUdFU19QRVJfU0dFX1NISUZUKTsKKworCXN3X2J1Zi0+cGFnZSA9IE5VTEw7CisJc2dlLT5hZGRyX2hpID0gMDsKKwlzZ2UtPmFkZHJfbG8gPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZnJlZV9yeF9zZ2VfcmFuZ2Uoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgaW50IGxhc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKQorCQlibngyeF9mcmVlX3J4X3NnZShicCwgZnAsIGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBibngyeF9hbGxvY19yeF9zZ2Uoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9BVE9NSUMsIFBBR0VTX1BFUl9TR0VfU0hJRlQpOworCXN0cnVjdCBzd19yeF9wYWdlICpzd19idWYgPSAmZnAtPnJ4X3BhZ2VfcmluZ1tpbmRleF07CisJc3RydWN0IGV0aF9yeF9zZ2UgKnNnZSA9ICZmcC0+cnhfc2dlX3JpbmdbaW5kZXhdOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIHBhZ2UsIDAsCisJCQkgICAgICAgU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CisJCV9fZnJlZV9wYWdlcyhwYWdlLCBQQUdFU19QRVJfU0dFX1NISUZUKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3dfYnVmLT5wYWdlID0gcGFnZTsKKwlkbWFfdW5tYXBfYWRkcl9zZXQoc3dfYnVmLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCXNnZS0+YWRkcl9oaSA9IGNwdV90b19sZTMyKFU2NF9ISShtYXBwaW5nKSk7CisJc2dlLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIoVTY0X0xPKG1hcHBpbmcpKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgYm54MnhfYWxsb2Nfcnhfc2tiKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbaW5kZXhdOworCXN0cnVjdCBldGhfcnhfYmQgKnJ4X2JkID0gJmZwLT5yeF9kZXNjX3JpbmdbaW5kZXhdOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCXNrYiA9IG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwgYnAtPnJ4X2J1Zl9zaXplKTsKKwlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgc2tiLT5kYXRhLCBicC0+cnhfYnVmX3NpemUsCisJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZicC0+cGRldi0+ZGV2LCBtYXBwaW5nKSkpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyeF9idWYtPnNrYiA9IHNrYjsKKwlkbWFfdW5tYXBfYWRkcl9zZXQocnhfYnVmLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCXJ4X2JkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKKwlyeF9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogbm90ZSB0aGF0IHdlIGFyZSBub3QgYWxsb2NhdGluZyBhIG5ldyBza2IsCisgKiB3ZSBhcmUganVzdCBtb3Zpbmcgb25lIGZyb20gY29ucyB0byBwcm9kCisgKiB3ZSBhcmUgbm90IGNyZWF0aW5nIGEgbmV3IG1hcHBpbmcsCisgKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvciBkbWFfbWFwcGluZ19lcnJvcigpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfcmV1c2Vfcnhfc2tiKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7CisJc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107CisJc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07CisJc3RydWN0IGV0aF9yeF9iZCAqY29uc19iZCA9ICZmcC0+cnhfZGVzY19yaW5nW2NvbnNdOworCXN0cnVjdCBldGhfcnhfYmQgKnByb2RfYmQgPSAmZnAtPnJ4X2Rlc2NfcmluZ1twcm9kXTsKKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZicC0+cGRldi0+ZGV2LAorCQkJCSAgIGRtYV91bm1hcF9hZGRyKGNvbnNfcnhfYnVmLCBtYXBwaW5nKSwKKwkJCQkgICBSWF9DT1BZX1RIUkVTSCwgRE1BX0ZST01fREVWSUNFKTsKKworCXByb2RfcnhfYnVmLT5za2IgPSBjb25zX3J4X2J1Zi0+c2tiOworCWRtYV91bm1hcF9hZGRyX3NldChwcm9kX3J4X2J1ZiwgbWFwcGluZywKKwkJCSAgIGRtYV91bm1hcF9hZGRyKGNvbnNfcnhfYnVmLCBtYXBwaW5nKSk7CisJKnByb2RfYmQgPSAqY29uc19iZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2NsZWFyX3NnZV9tYXNrX25leHRfZWxlbXMoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDE7IGkgPD0gTlVNX1JYX1NHRV9QQUdFUzsgaSsrKSB7CisJCWludCBpZHggPSBSWF9TR0VfQ05UICogaSAtIDE7CisKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJU0dFX01BU0tfQ0xFQVJfQklUKGZwLCBpZHgpOworCQkJaWR4LS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X3NnZV9yaW5nX2JpdF9tYXNrKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCit7CisJLyogU2V0IHRoZSBtYXNrIHRvIGFsbCAxLXM6IGl0J3MgZmFzdGVyIHRvIGNvbXBhcmUgdG8gMCB0aGFuIHRvIDB4Zi1zICovCisJbWVtc2V0KGZwLT5zZ2VfbWFzaywgMHhmZiwKKwkgICAgICAgKE5VTV9SWF9TR0UgPj4gUlhfU0dFX01BU0tfRUxFTV9TSElGVCkqc2l6ZW9mKHU2NCkpOworCisJLyogQ2xlYXIgdGhlIHR3byBsYXN0IGluZGljZXMgaW4gdGhlIHBhZ2UgdG8gMToKKwkgICB0aGVzZSBhcmUgdGhlIGluZGljZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSAibmV4dCIgZWxlbWVudCwKKwkgICBoZW5jZSB3aWxsIG5ldmVyIGJlIGluZGljYXRlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbQorCSAgIHRoZSBjYWxjdWxhdGlvbnMuICovCisJYm54MnhfY2xlYXJfc2dlX21hc2tfbmV4dF9lbGVtcyhmcCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZnJlZV90cGFfcG9vbChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCBpbnQgbGFzdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKKwkJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmKGZwLT50cGFfcG9vbFtpXSk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSByeF9idWYtPnNrYjsKKworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCURQKE5FVElGX01TR19JRkRPV04sICJ0cGEgYmluICVkIGVtcHR5IG9uIGZyZWVcbiIsIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZnAtPnRwYV9zdGF0ZVtpXSA9PSBCTlgyWF9UUEFfU1RBUlQpCisJCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LAorCQkJCQkgZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKKwkJCQkJIGJwLT5yeF9idWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJ4X2J1Zi0+c2tiID0gTlVMTDsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2luaXRfdHhfcmluZyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpLCBqOworCisJZm9yX2VhY2hfcXVldWUoYnAsIGopIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbal07CisKKwkJZm9yIChpID0gMTsgaSA8PSBOVU1fVFhfUklOR1M7IGkrKykgeworCQkJc3RydWN0IGV0aF90eF9uZXh0X2JkICp0eF9uZXh0X2JkID0KKwkJCQkmZnAtPnR4X2Rlc2NfcmluZ1tUWF9ERVNDX0NOVCAqIGkgLSAxXS5uZXh0X2JkOworCisJCQl0eF9uZXh0X2JkLT5hZGRyX2hpID0KKwkJCQljcHVfdG9fbGUzMihVNjRfSEkoZnAtPnR4X2Rlc2NfbWFwcGluZyArCisJCQkJCSAgICBCQ01fUEFHRV9TSVpFKihpICUgTlVNX1RYX1JJTkdTKSkpOworCQkJdHhfbmV4dF9iZC0+YWRkcl9sbyA9CisJCQkJY3B1X3RvX2xlMzIoVTY0X0xPKGZwLT50eF9kZXNjX21hcHBpbmcgKworCQkJCQkgICAgQkNNX1BBR0VfU0laRSooaSAlIE5VTV9UWF9SSU5HUykpKTsKKwkJfQorCisJCWZwLT50eF9kYi5kYXRhLmhlYWRlci5oZWFkZXIgPSBET09SQkVMTF9IRFJfREJfVFlQRTsKKwkJZnAtPnR4X2RiLmRhdGEuemVyb19maWxsMSA9IDA7CisJCWZwLT50eF9kYi5kYXRhLnByb2QgPSAwOworCisJCWZwLT50eF9wa3RfcHJvZCA9IDA7CisJCWZwLT50eF9wa3RfY29ucyA9IDA7CisJCWZwLT50eF9iZF9wcm9kID0gMDsKKwkJZnAtPnR4X2JkX2NvbnMgPSAwOworCQlmcC0+dHhfY29uc19zYiA9IEJOWDJYX1RYX1NCX0lOREVYOworCQlmcC0+dHhfcGt0ID0gMDsKKwl9Cit9CitzdGF0aWMgaW5saW5lIGludCBibngyeF9oYXNfcnhfd29yayhzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQoreworCXUxNiByeF9jb25zX3NiOworCisJLyogVGVsbCBjb21waWxlciB0aGF0IHN0YXR1cyBibG9jayBmaWVsZHMgY2FuIGNoYW5nZSAqLworCWJhcnJpZXIoKTsKKwlyeF9jb25zX3NiID0gbGUxNl90b19jcHUoKmZwLT5yeF9jb25zX3NiKTsKKwlpZiAoKHJ4X2NvbnNfc2IgJiBNQVhfUkNRX0RFU0NfQ05UKSA9PSBNQVhfUkNRX0RFU0NfQ05UKQorCQlyeF9jb25zX3NiKys7CisJcmV0dXJuIChmcC0+cnhfY29tcF9jb25zICE9IHJ4X2NvbnNfc2IpOworfQorCisvKiBIVyBMb2NrIGZvciBzaGFyZWQgZHVhbCBwb3J0IFBIWXMgKi8KK3ZvaWQgYm54MnhfYWNxdWlyZV9waHlfbG9jayhzdHJ1Y3QgYm54MnggKmJwKTsKK3ZvaWQgYm54MnhfcmVsZWFzZV9waHlfbG9jayhzdHJ1Y3QgYm54MnggKmJwKTsKKwordm9pZCBibngyeF9saW5rX3JlcG9ydChzdHJ1Y3QgYm54MnggKmJwKTsKK2ludCBibngyeF9yeF9pbnQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgaW50IGJ1ZGdldCk7CitpbnQgYm54MnhfdHhfaW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApOwordm9pZCBibngyeF9pbml0X3J4X3JpbmdzKHN0cnVjdCBibngyeCAqYnApOworbmV0ZGV2X3R4X3QgYm54Mnhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworaW50IGJueDJ4X2NoYW5nZV9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKTsKK3ZvaWQgYm54MnhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgYm54Mnhfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnApOwordm9pZCBibngyeF9uZXRpZl9zdGFydChzdHJ1Y3QgYm54MnggKmJwKTsKK3ZvaWQgYm54MnhfbmV0aWZfc3RvcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZGlzYWJsZV9odyk7Cit2b2lkIGJueDJ4X2ZyZWVfaXJxKHN0cnVjdCBibngyeCAqYnAsIGJvb2wgZGlzYWJsZV9vbmx5KTsKK2ludCBibngyeF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworaW50IGJueDJ4X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Cit2b2lkIGJueDJ4X2ZyZWVfc2ticyhzdHJ1Y3QgYm54MnggKmJwKTsKK2ludCBibngyeF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK2ludCBibngyeF9uaWNfdW5sb2FkKHN0cnVjdCBibngyeCAqYnAsIGludCB1bmxvYWRfbW9kZSk7CitpbnQgYm54MnhfbmljX2xvYWQoc3RydWN0IGJueDJ4ICpicCwgaW50IGxvYWRfbW9kZSk7CitpbnQgYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBibngyeCAqYnAsIHBjaV9wb3dlcl90IHN0YXRlKTsKKworI2VuZGlmIC8qIEJOWDJYX0NNTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeF9kdW1wLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9kdW1wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbmV0L2JueDJ4X2R1bXAuaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvYm54MngvYm54MnhfZHVtcC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3NWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2V0aHRvb2wuYwpAQCAtMCwwICsxLDE5NzEgQEAKKy8qIGJueDJ4X2V0aHRvb2wuYzogQnJvYWRjb20gRXZlcmVzdCBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgorICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCisgKiBVRFAgQ1NVTSBlcnJhdGEgd29ya2Fyb3VuZCBieSBBcmlrIEdlbmRlbG1hbgorICogU2xvd3BhdGggYW5kIGZhc3RwYXRoIHJld29yayBieSBWbGFkaXNsYXYgWm9sb3Rhcm92CisgKiBTdGF0aXN0aWNzIGFuZCBMaW5rIG1hbmFnZW1lbnQgYnkgWWl0Y2hhayBHZXJ0bmVyCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisKKyNpbmNsdWRlICJibngyeC5oIgorI2luY2x1ZGUgImJueDJ4X2Ntbi5oIgorI2luY2x1ZGUgImJueDJ4X2R1bXAuaCIKKworCitzdGF0aWMgaW50IGJueDJ4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNtZC0+c3VwcG9ydGVkID0gYnAtPnBvcnQuc3VwcG9ydGVkOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSBicC0+cG9ydC5hZHZlcnRpc2luZzsKKworCWlmICgoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pICYmCisJICAgICEoYnAtPmZsYWdzICYgTUZfRlVOQ19ESVMpICYmCisJICAgIChicC0+bGlua192YXJzLmxpbmtfdXApKSB7CisJCWNtZC0+c3BlZWQgPSBicC0+bGlua192YXJzLmxpbmVfc3BlZWQ7CisJCWNtZC0+ZHVwbGV4ID0gYnAtPmxpbmtfdmFycy5kdXBsZXg7CisJCWlmIChJU19FMUhNRihicCkpIHsKKwkJCXUxNiB2bl9tYXhfcmF0ZTsKKworCQkJdm5fbWF4X3JhdGUgPQorCQkJCSgoYnAtPm1mX2NvbmZpZyAmIEZVTkNfTUZfQ0ZHX01BWF9CV19NQVNLKSA+PgorCQkJCUZVTkNfTUZfQ0ZHX01BWF9CV19TSElGVCkgKiAxMDA7CisJCQlpZiAodm5fbWF4X3JhdGUgPCBjbWQtPnNwZWVkKQorCQkJCWNtZC0+c3BlZWQgPSB2bl9tYXhfcmF0ZTsKKwkJfQorCX0gZWxzZSB7CisJCWNtZC0+c3BlZWQgPSAtMTsKKwkJY21kLT5kdXBsZXggPSAtMTsKKwl9CisKKwlpZiAoYnAtPmxpbmtfcGFyYW1zLnN3aXRjaF9jZmcgPT0gU1dJVENIX0NGR18xMEcpIHsKKwkJdTMyIGV4dF9waHlfdHlwZSA9CisJCQlYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1OgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDY6CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCQkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMToKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxOgorCQkJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRToKKwkJCUJOWDJYX0VSUigiWEdYUyBQSFkgRmFpbHVyZSBkZXRlY3RlZCAweCV4XG4iLAorCQkJCSAgYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEUChORVRJRl9NU0dfTElOSywgIkJBRCBYR1hTIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCisJCQkgICBicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJY21kLT5wb3J0ID0gUE9SVF9UUDsKKworCWNtZC0+cGh5X2FkZHJlc3MgPSBicC0+bWRpby5wcnRhZDsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKworCWlmIChicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpCisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCWVsc2UKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisKKwlEUChORVRJRl9NU0dfTElOSywgImV0aHRvb2xfY21kOiBjbWQgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBzdXBwb3J0ZWQgMHgleCAgYWR2ZXJ0aXNpbmcgMHgleCAgc3BlZWQgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBkdXBsZXggJWQgIHBvcnQgJWQgIHBoeV9hZGRyZXNzICVkICB0cmFuc2NlaXZlciAlZFxuIgorCSAgIERQX0xFVkVMICIgIGF1dG9uZWcgJWQgIG1heHR4cGt0ICVkICBtYXhyeHBrdCAlZFxuIiwKKwkgICBjbWQtPmNtZCwgY21kLT5zdXBwb3J0ZWQsIGNtZC0+YWR2ZXJ0aXNpbmcsIGNtZC0+c3BlZWQsCisJICAgY21kLT5kdXBsZXgsIGNtZC0+cG9ydCwgY21kLT5waHlfYWRkcmVzcywgY21kLT50cmFuc2NlaXZlciwKKwkgICBjbWQtPmF1dG9uZWcsIGNtZC0+bWF4dHhwa3QsIGNtZC0+bWF4cnhwa3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBhZHZlcnRpc2luZzsKKworCWlmIChJU19FMUhNRihicCkpCisJCXJldHVybiAwOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJldGh0b29sX2NtZDogY21kICVkXG4iCisJICAgRFBfTEVWRUwgIiAgc3VwcG9ydGVkIDB4JXggIGFkdmVydGlzaW5nIDB4JXggIHNwZWVkICVkXG4iCisJICAgRFBfTEVWRUwgIiAgZHVwbGV4ICVkICBwb3J0ICVkICBwaHlfYWRkcmVzcyAlZCAgdHJhbnNjZWl2ZXIgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBhdXRvbmVnICVkICBtYXh0eHBrdCAlZCAgbWF4cnhwa3QgJWRcbiIsCisJICAgY21kLT5jbWQsIGNtZC0+c3VwcG9ydGVkLCBjbWQtPmFkdmVydGlzaW5nLCBjbWQtPnNwZWVkLAorCSAgIGNtZC0+ZHVwbGV4LCBjbWQtPnBvcnQsIGNtZC0+cGh5X2FkZHJlc3MsIGNtZC0+dHJhbnNjZWl2ZXIsCisJICAgY21kLT5hdXRvbmVnLCBjbWQtPm1heHR4cGt0LCBjbWQtPm1heHJ4cGt0KTsKKworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkF1dG9uZWcgbm90IHN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIGFkdmVydGlzZSB0aGUgcmVxdWVzdGVkIHNwZWVkIGFuZCBkdXBsZXggaWYgc3VwcG9ydGVkICovCisJCWNtZC0+YWR2ZXJ0aXNpbmcgJj0gYnAtPnBvcnQuc3VwcG9ydGVkOworCisJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEX0FVVE9fTkVHOworCQlicC0+bGlua19wYXJhbXMucmVxX2R1cGxleCA9IERVUExFWF9GVUxMOworCQlicC0+cG9ydC5hZHZlcnRpc2luZyB8PSAoQURWRVJUSVNFRF9BdXRvbmVnIHwKKwkJCQkJIGNtZC0+YWR2ZXJ0aXNpbmcpOworCisJfSBlbHNlIHsgLyogZm9yY2VkIHNwZWVkICovCisJCS8qIGFkdmVydGlzZSB0aGUgcmVxdWVzdGVkIHNwZWVkIGFuZCBkdXBsZXggaWYgc3VwcG9ydGVkICovCisJCXN3aXRjaCAoY21kLT5zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwOgorCQkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCQkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkICYKKwkJCQkgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSkgeworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJICAgIjEwTSBmdWxsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlhZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkICYKKwkJCQkgICAgICBTVVBQT1JURURfMTBiYXNlVF9IYWxmKSkgeworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJICAgIjEwTSBoYWxmIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlhZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTAwOgorCQkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCQkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkICYKKwkJCQkJCVNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsKSkgeworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJICAgIjEwME0gZnVsbCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIEFEVkVSVElTRURfVFApOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWQgJgorCQkJCQkJU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYpKSB7CisJCQkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCQkgICAiMTAwTSBoYWxmIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlhZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgICAgQURWRVJUSVNFRF9UUCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIjFHIGhhbGYgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIjFHIGZ1bGwgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMjUwMDoKKwkJCWlmIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkgeworCQkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCSAgICIyLjVHIGhhbGYgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkgICAiMi41RyBmdWxsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlhZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzI1MDBiYXNlWF9GdWxsIHwKKwkJCQkgICAgICAgQURWRVJUSVNFRF9UUCk7CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDAwOgorCQkJaWYgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICIxMEcgaGFsZiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIjEwRyBmdWxsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlhZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJICAgICAgIEFEVkVSVElTRURfRklCUkUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiVW5zdXBwb3J0ZWQgc3BlZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBjbWQtPnNwZWVkOworCQlicC0+bGlua19wYXJhbXMucmVxX2R1cGxleCA9IGNtZC0+ZHVwbGV4OworCQlicC0+cG9ydC5hZHZlcnRpc2luZyA9IGFkdmVydGlzaW5nOworCX0KKworCURQKE5FVElGX01TR19MSU5LLCAicmVxX2xpbmVfc3BlZWQgJWRcbiIKKwkgICBEUF9MRVZFTCAiICByZXFfZHVwbGV4ICVkICBhZHZlcnRpc2luZyAweCV4XG4iLAorCSAgIGJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCwgYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXgsCisJICAgYnAtPnBvcnQuYWR2ZXJ0aXNpbmcpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOworCQlibngyeF9saW5rX3NldChicCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSVNfRTFfT05MSU5FKGluZm8pCSgoKGluZm8pICYgUklfRTFfT05MSU5FKSA9PSBSSV9FMV9PTkxJTkUpCisjZGVmaW5lIElTX0UxSF9PTkxJTkUoaW5mbykJKCgoaW5mbykgJiBSSV9FMUhfT05MSU5FKSA9PSBSSV9FMUhfT05MSU5FKQorCitzdGF0aWMgaW50IGJueDJ4X2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZWdkdW1wX2xlbiA9IDA7CisJaW50IGk7CisKKwlpZiAoQ0hJUF9JU19FMShicCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJFR1NfQ09VTlQ7IGkrKykKKwkJCWlmIChJU19FMV9PTkxJTkUocmVnX2FkZHJzW2ldLmluZm8pKQorCQkJCXJlZ2R1bXBfbGVuICs9IHJlZ19hZGRyc1tpXS5zaXplOworCisJCWZvciAoaSA9IDA7IGkgPCBXUkVHU19DT1VOVF9FMTsgaSsrKQorCQkJaWYgKElTX0UxX09OTElORSh3cmVnX2FkZHJzX2UxW2ldLmluZm8pKQorCQkJCXJlZ2R1bXBfbGVuICs9IHdyZWdfYWRkcnNfZTFbaV0uc2l6ZSAqCisJCQkJCSgxICsgd3JlZ19hZGRyc19lMVtpXS5yZWFkX3JlZ3NfY291bnQpOworCisJfSBlbHNlIHsgLyogRTFIICovCisJCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCisJCQlpZiAoSVNfRTFIX09OTElORShyZWdfYWRkcnNbaV0uaW5mbykpCisJCQkJcmVnZHVtcF9sZW4gKz0gcmVnX2FkZHJzW2ldLnNpemU7CisKKwkJZm9yIChpID0gMDsgaSA8IFdSRUdTX0NPVU5UX0UxSDsgaSsrKQorCQkJaWYgKElTX0UxSF9PTkxJTkUod3JlZ19hZGRyc19lMWhbaV0uaW5mbykpCisJCQkJcmVnZHVtcF9sZW4gKz0gd3JlZ19hZGRyc19lMWhbaV0uc2l6ZSAqCisJCQkJCSgxICsgd3JlZ19hZGRyc19lMWhbaV0ucmVhZF9yZWdzX2NvdW50KTsKKwl9CisJcmVnZHVtcF9sZW4gKj0gNDsKKwlyZWdkdW1wX2xlbiArPSBzaXplb2Yoc3RydWN0IGR1bXBfaGRyKTsKKworCXJldHVybiByZWdkdW1wX2xlbjsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKl9wKQoreworCXUzMiAqcCA9IF9wLCBpLCBqOworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkdW1wX2hkciBkdW1wX2hkciA9IHswfTsKKworCXJlZ3MtPnZlcnNpb24gPSAwOworCW1lbXNldChwLCAwLCByZWdzLT5sZW4pOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQlyZXR1cm47CisKKwlkdW1wX2hkci5oZHJfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGR1bXBfaGRyKSAvIDQpIC0gMTsKKwlkdW1wX2hkci5kdW1wX3NpZ24gPSBkdW1wX3NpZ25fYWxsOworCWR1bXBfaGRyLnhzdG9ybV93YWl0cCA9IFJFR19SRChicCwgWFNUT1JNX1dBSVRQX0FERFIpOworCWR1bXBfaGRyLnRzdG9ybV93YWl0cCA9IFJFR19SRChicCwgVFNUT1JNX1dBSVRQX0FERFIpOworCWR1bXBfaGRyLnVzdG9ybV93YWl0cCA9IFJFR19SRChicCwgVVNUT1JNX1dBSVRQX0FERFIpOworCWR1bXBfaGRyLmNzdG9ybV93YWl0cCA9IFJFR19SRChicCwgQ1NUT1JNX1dBSVRQX0FERFIpOworCWR1bXBfaGRyLmluZm8gPSBDSElQX0lTX0UxKGJwKSA/IFJJX0UxX09OTElORSA6IFJJX0UxSF9PTkxJTkU7CisKKwltZW1jcHkocCwgJmR1bXBfaGRyLCBzaXplb2Yoc3RydWN0IGR1bXBfaGRyKSk7CisJcCArPSBkdW1wX2hkci5oZHJfc2l6ZSArIDE7CisKKwlpZiAoQ0hJUF9JU19FMShicCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJFR1NfQ09VTlQ7IGkrKykKKwkJCWlmIChJU19FMV9PTkxJTkUocmVnX2FkZHJzW2ldLmluZm8pKQorCQkJCWZvciAoaiA9IDA7IGogPCByZWdfYWRkcnNbaV0uc2l6ZTsgaisrKQorCQkJCQkqcCsrID0gUkVHX1JEKGJwLAorCQkJCQkJICAgICAgcmVnX2FkZHJzW2ldLmFkZHIgKyBqKjQpOworCisJfSBlbHNlIHsgLyogRTFIICovCisJCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCisJCQlpZiAoSVNfRTFIX09OTElORShyZWdfYWRkcnNbaV0uaW5mbykpCisJCQkJZm9yIChqID0gMDsgaiA8IHJlZ19hZGRyc1tpXS5zaXplOyBqKyspCisJCQkJCSpwKysgPSBSRUdfUkQoYnAsCisJCQkJCQkgICAgICByZWdfYWRkcnNbaV0uYWRkciArIGoqNCk7CisJfQorfQorCisjZGVmaW5lIFBIWV9GV19WRVJfTEVOCQkJMTAKKworc3RhdGljIHZvaWQgYm54MnhfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdTggcGh5X2Z3X3ZlcltQSFlfRldfVkVSX0xFTl07CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworCisJcGh5X2Z3X3ZlclswXSA9ICdcMCc7CisJaWYgKGJwLT5wb3J0LnBtZikgeworCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKKwkJYm54MnhfZ2V0X2V4dF9waHlfZndfdmVyc2lvbigmYnAtPmxpbmtfcGFyYW1zLAorCQkJCQkgICAgIChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfQ0xPU0VEKSwKKwkJCQkJICAgICBwaHlfZndfdmVyLCBQSFlfRldfVkVSX0xFTik7CisJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCX0KKworCXN0cm5jcHkoaW5mby0+ZndfdmVyc2lvbiwgYnAtPmZ3X3ZlciwgMzIpOworCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24gKyBzdHJsZW4oYnAtPmZ3X3ZlciksIDMyIC0gc3RybGVuKGJwLT5md192ZXIpLAorCQkgImJjICVkLiVkLiVkJXMlcyIsCisJCSAoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmMDAwMCkgPj4gMTYsCisJCSAoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmMDApID4+IDgsCisJCSAoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmKSwKKwkJICgocGh5X2Z3X3ZlclswXSAhPSAnXDAnKSA/ICIgcGh5ICIgOiAiIiksIHBoeV9md192ZXIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYnAtPnBkZXYpKTsKKwlpbmZvLT5uX3N0YXRzID0gQk5YMlhfTlVNX1NUQVRTOworCWluZm8tPnRlc3RpbmZvX2xlbiA9IEJOWDJYX05VTV9URVNUUzsKKwlpbmZvLT5lZWR1bXBfbGVuID0gYnAtPmNvbW1vbi5mbGFzaF9zaXplOworCWluZm8tPnJlZ2R1bXBfbGVuID0gYm54MnhfZ2V0X3JlZ3NfbGVuKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJwLT5mbGFncyAmIE5PX1dPTF9GTEFHKSB7CisJCXdvbC0+c3VwcG9ydGVkID0gMDsKKwkJd29sLT53b2xvcHRzID0gMDsKKwl9IGVsc2UgeworCQl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfTUFHSUM7CisJCWlmIChicC0+d29sKQorCQkJd29sLT53b2xvcHRzID0gV0FLRV9NQUdJQzsKKwkJZWxzZQorCQkJd29sLT53b2xvcHRzID0gMDsKKwl9CisJbWVtc2V0KCZ3b2wtPnNvcGFzcywgMCwgc2l6ZW9mKHdvbC0+c29wYXNzKSk7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAod29sLT53b2xvcHRzICYgfldBS0VfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpIHsKKwkJaWYgKGJwLT5mbGFncyAmIE5PX1dPTF9GTEFHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJYnAtPndvbCA9IDE7CisJfSBlbHNlCisJCWJwLT53b2wgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYm54MnhfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gYnAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJYnAtPm1zZ19lbmFibGUgPSBsZXZlbDsKK30KKworc3RhdGljIGludCBibngyeF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWJwLT5wb3J0LnBtZikKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfU1RPUCk7CisJCWJueDJ4X2xpbmtfc2V0KGJwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBibngyeF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJwLT5mbGFncyAmIE1GX0ZVTkNfRElTKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBicC0+bGlua192YXJzLmxpbmtfdXA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBicC0+Y29tbW9uLmZsYXNoX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfYWNxdWlyZV9udnJhbV9sb2NrKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgY291bnQsIGk7CisJdTMyIHZhbCA9IDA7CisKKwkvKiBhZGp1c3QgdGltZW91dCBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KKwljb3VudCA9IE5WUkFNX1RJTUVPVVRfQ09VTlQ7CisJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQorCQljb3VudCAqPSAxMDA7CisKKwkvKiByZXF1ZXN0IGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fU1dfQVJCLAorCSAgICAgICAoTUNQUl9OVk1fU1dfQVJCX0FSQl9SRVFfU0VUMSA8PCBwb3J0KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQqMTA7IGkrKykgeworCQl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9OVk1fU1dfQVJCKTsKKwkJaWYgKHZhbCAmIChNQ1BSX05WTV9TV19BUkJfQVJCX0FSQjEgPDwgcG9ydCkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoNSk7CisJfQorCisJaWYgKCEodmFsICYgKE1DUFJfTlZNX1NXX0FSQl9BUkJfQVJCMSA8PCBwb3J0KSkpIHsKKwkJRFAoQk5YMlhfTVNHX05WTSwgImNhbm5vdCBnZXQgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcmVsZWFzZV9udnJhbV9sb2NrKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgY291bnQsIGk7CisJdTMyIHZhbCA9IDA7CisKKwkvKiBhZGp1c3QgdGltZW91dCBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KKwljb3VudCA9IE5WUkFNX1RJTUVPVVRfQ09VTlQ7CisJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQorCQljb3VudCAqPSAxMDA7CisKKwkvKiByZWxpbnF1aXNoIG52cmFtIGludGVyZmFjZSAqLworCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9TV19BUkIsCisJICAgICAgIChNQ1BSX05WTV9TV19BUkJfQVJCX1JFUV9DTFIxIDw8IHBvcnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudCoxMDsgaSsrKSB7CisJCXZhbCA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX05WTV9TV19BUkIpOworCQlpZiAoISh2YWwgJiAoTUNQUl9OVk1fU1dfQVJCX0FSQl9BUkIxIDw8IHBvcnQpKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSg1KTsKKwl9CisKKwlpZiAodmFsICYgKE1DUFJfTlZNX1NXX0FSQl9BUkJfQVJCMSA8PCBwb3J0KSkgeworCQlEUChCTlgyWF9NU0dfTlZNLCAiY2Fubm90IGZyZWUgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2VuYWJsZV9udnJhbV9hY2Nlc3Moc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUpOworCisJLyogZW5hYmxlIGJvdGggYml0cywgZXZlbiBvbiByZWFkICovCisJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUsCisJICAgICAgICh2YWwgfCBNQ1BSX05WTV9BQ0NFU1NfRU5BQkxFX0VOIHwKKwkJICAgICAgTUNQUl9OVk1fQUNDRVNTX0VOQUJMRV9XUl9FTikpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9kaXNhYmxlX252cmFtX2FjY2VzcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQUNDRVNTX0VOQUJMRSk7CisKKwkvKiBkaXNhYmxlIGJvdGggYml0cywgZXZlbiBhZnRlciByZWFkICovCisJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUsCisJICAgICAgICh2YWwgJiB+KE1DUFJfTlZNX0FDQ0VTU19FTkFCTEVfRU4gfAorCQkJTUNQUl9OVk1fQUNDRVNTX0VOQUJMRV9XUl9FTikpKTsKK30KKworc3RhdGljIGludCBibngyeF9udnJhbV9yZWFkX2R3b3JkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIF9fYmUzMiAqcmV0X3ZhbCwKKwkJCQkgIHUzMiBjbWRfZmxhZ3MpCit7CisJaW50IGNvdW50LCBpLCByYzsKKwl1MzIgdmFsOworCisJLyogYnVpbGQgdGhlIGNvbW1hbmQgd29yZCAqLworCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0RPSVQ7CisKKwkvKiBuZWVkIHRvIGNsZWFyIERPTkUgYml0IHNlcGFyYXRlbHkgKi8KKwlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQ09NTUFORCwgTUNQUl9OVk1fQ09NTUFORF9ET05FKTsKKworCS8qIGFkZHJlc3Mgb2YgdGhlIE5WUkFNIHRvIHJlYWQgZnJvbSAqLworCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9BRERSLAorCSAgICAgICAob2Zmc2V0ICYgTUNQUl9OVk1fQUREUl9OVk1fQUREUl9WQUxVRSkpOworCisJLyogaXNzdWUgYSByZWFkIGNvbW1hbmQgKi8KKwlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQ09NTUFORCwgY21kX2ZsYWdzKTsKKworCS8qIGFkanVzdCB0aW1lb3V0IGZvciBlbXVsYXRpb24vRlBHQSAqLworCWNvdW50ID0gTlZSQU1fVElNRU9VVF9DT1VOVDsKKwlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCWNvdW50ICo9IDEwMDsKKworCS8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkqcmV0X3ZhbCA9IDA7CisJcmMgPSAtRUJVU1k7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdWRlbGF5KDUpOworCQl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQ09NTUFORCk7CisKKwkJaWYgKHZhbCAmIE1DUFJfTlZNX0NPTU1BTkRfRE9ORSkgeworCQkJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX1JFQUQpOworCQkJLyogd2UgcmVhZCBudnJhbSBkYXRhIGluIGNwdSBvcmRlcgorCQkJICogYnV0IGV0aHRvb2wgc2VlcyBpdCBhcyBhbiBhcnJheSBvZiBieXRlcworCQkJICogY29udmVydGluZyB0byBiaWctZW5kaWFuIHdpbGwgZG8gdGhlIHdvcmsgKi8KKwkJCSpyZXRfdmFsID0gY3B1X3RvX2JlMzIodmFsKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4X252cmFtX3JlYWQoc3RydWN0IGJueDJ4ICpicCwgdTMyIG9mZnNldCwgdTggKnJldF9idWYsCisJCQkgICAgaW50IGJ1Zl9zaXplKQoreworCWludCByYzsKKwl1MzIgY21kX2ZsYWdzOworCV9fYmUzMiB2YWw7CisKKwlpZiAoKG9mZnNldCAmIDB4MDMpIHx8IChidWZfc2l6ZSAmIDB4MDMpIHx8IChidWZfc2l6ZSA9PSAwKSkgeworCQlEUChCTlgyWF9NU0dfTlZNLAorCQkgICAiSW52YWxpZCBwYXJhbWV0ZXI6IG9mZnNldCAweCV4ICBidWZfc2l6ZSAweCV4XG4iLAorCQkgICBvZmZzZXQsIGJ1Zl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9mZnNldCArIGJ1Zl9zaXplID4gYnAtPmNvbW1vbi5mbGFzaF9zaXplKSB7CisJCURQKEJOWDJYX01TR19OVk0sICJJbnZhbGlkIHBhcmFtZXRlcjogb2Zmc2V0ICgweCV4KSArIgorCQkJCSAgIiBidWZfc2l6ZSAoMHgleCkgPiBmbGFzaF9zaXplICgweCV4KVxuIiwKKwkJICAgb2Zmc2V0LCBidWZfc2l6ZSwgYnAtPmNvbW1vbi5mbGFzaF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVxdWVzdCBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJcmMgPSBibngyeF9hY3F1aXJlX252cmFtX2xvY2soYnApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogZW5hYmxlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlibngyeF9lbmFibGVfbnZyYW1fYWNjZXNzKGJwKTsKKworCS8qIHJlYWQgdGhlIGZpcnN0IHdvcmQocykgKi8KKwljbWRfZmxhZ3MgPSBNQ1BSX05WTV9DT01NQU5EX0ZJUlNUOworCXdoaWxlICgoYnVmX3NpemUgPiBzaXplb2YodTMyKSkgJiYgKHJjID09IDApKSB7CisJCXJjID0gYm54MnhfbnZyYW1fcmVhZF9kd29yZChicCwgb2Zmc2V0LCAmdmFsLCBjbWRfZmxhZ3MpOworCQltZW1jcHkocmV0X2J1ZiwgJnZhbCwgNCk7CisKKwkJLyogYWR2YW5jZSB0byB0aGUgbmV4dCBkd29yZCAqLworCQlvZmZzZXQgKz0gc2l6ZW9mKHUzMik7CisJCXJldF9idWYgKz0gc2l6ZW9mKHUzMik7CisJCWJ1Zl9zaXplIC09IHNpemVvZih1MzIpOworCQljbWRfZmxhZ3MgPSAwOworCX0KKworCWlmIChyYyA9PSAwKSB7CisJCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0xBU1Q7CisJCXJjID0gYm54MnhfbnZyYW1fcmVhZF9kd29yZChicCwgb2Zmc2V0LCAmdmFsLCBjbWRfZmxhZ3MpOworCQltZW1jcHkocmV0X2J1ZiwgJnZhbCwgNCk7CisJfQorCisJLyogZGlzYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJYm54MnhfZGlzYWJsZV9udnJhbV9hY2Nlc3MoYnApOworCWJueDJ4X3JlbGVhc2VfbnZyYW1fbG9jayhicCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZWVidWYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJRFAoQk5YMlhfTVNHX05WTSwgImV0aHRvb2xfZWVwcm9tOiBjbWQgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBtYWdpYyAweCV4ICBvZmZzZXQgMHgleCAoJWQpICBsZW4gMHgleCAoJWQpXG4iLAorCSAgIGVlcHJvbS0+Y21kLCBlZXByb20tPm1hZ2ljLCBlZXByb20tPm9mZnNldCwgZWVwcm9tLT5vZmZzZXQsCisJICAgZWVwcm9tLT5sZW4sIGVlcHJvbS0+bGVuKTsKKworCS8qIHBhcmFtZXRlcnMgYWxyZWFkeSB2YWxpZGF0ZWQgaW4gZXRodG9vbF9nZXRfZWVwcm9tICovCisKKwlyYyA9IGJueDJ4X252cmFtX3JlYWQoYnAsIGVlcHJvbS0+b2Zmc2V0LCBlZWJ1ZiwgZWVwcm9tLT5sZW4pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4X252cmFtX3dyaXRlX2R3b3JkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIHUzMiB2YWwsCisJCQkJICAgdTMyIGNtZF9mbGFncykKK3sKKwlpbnQgY291bnQsIGksIHJjOworCisJLyogYnVpbGQgdGhlIGNvbW1hbmQgd29yZCAqLworCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0RPSVQgfCBNQ1BSX05WTV9DT01NQU5EX1dSOworCisJLyogbmVlZCB0byBjbGVhciBET05FIGJpdCBzZXBhcmF0ZWx5ICovCisJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQsIE1DUFJfTlZNX0NPTU1BTkRfRE9ORSk7CisKKwkvKiB3cml0ZSB0aGUgZGF0YSAqLworCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9XUklURSwgdmFsKTsKKworCS8qIGFkZHJlc3Mgb2YgdGhlIE5WUkFNIHRvIHdyaXRlIHRvICovCisJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0FERFIsCisJICAgICAgIChvZmZzZXQgJiBNQ1BSX05WTV9BRERSX05WTV9BRERSX1ZBTFVFKSk7CisKKwkvKiBpc3N1ZSB0aGUgd3JpdGUgY29tbWFuZCAqLworCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9DT01NQU5ELCBjbWRfZmxhZ3MpOworCisJLyogYWRqdXN0IHRpbWVvdXQgZm9yIGVtdWxhdGlvbi9GUEdBICovCisJY291bnQgPSBOVlJBTV9USU1FT1VUX0NPVU5UOworCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKKwkJY291bnQgKj0gMTAwOworCisJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCXJjID0gLUVCVVNZOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVkZWxheSg1KTsKKwkJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQpOworCQlpZiAodmFsICYgTUNQUl9OVk1fQ09NTUFORF9ET05FKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworI2RlZmluZSBCWVRFX09GRlNFVChvZmZzZXQpCQkoOCAqIChvZmZzZXQgJiAweDAzKSkKKworc3RhdGljIGludCBibngyeF9udnJhbV93cml0ZTEoc3RydWN0IGJueDJ4ICpicCwgdTMyIG9mZnNldCwgdTggKmRhdGFfYnVmLAorCQkJICAgICAgaW50IGJ1Zl9zaXplKQoreworCWludCByYzsKKwl1MzIgY21kX2ZsYWdzOworCXUzMiBhbGlnbl9vZmZzZXQ7CisJX19iZTMyIHZhbDsKKworCWlmIChvZmZzZXQgKyBidWZfc2l6ZSA+IGJwLT5jb21tb24uZmxhc2hfc2l6ZSkgeworCQlEUChCTlgyWF9NU0dfTlZNLCAiSW52YWxpZCBwYXJhbWV0ZXI6IG9mZnNldCAoMHgleCkgKyIKKwkJCQkgICIgYnVmX3NpemUgKDB4JXgpID4gZmxhc2hfc2l6ZSAoMHgleClcbiIsCisJCSAgIG9mZnNldCwgYnVmX3NpemUsIGJwLT5jb21tb24uZmxhc2hfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlcXVlc3QgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLworCXJjID0gYm54MnhfYWNxdWlyZV9udnJhbV9sb2NrKGJwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIGVuYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJYm54MnhfZW5hYmxlX252cmFtX2FjY2VzcyhicCk7CisKKwljbWRfZmxhZ3MgPSAoTUNQUl9OVk1fQ09NTUFORF9GSVJTVCB8IE1DUFJfTlZNX0NPTU1BTkRfTEFTVCk7CisJYWxpZ25fb2Zmc2V0ID0gKG9mZnNldCAmIH4weDAzKTsKKwlyYyA9IGJueDJ4X252cmFtX3JlYWRfZHdvcmQoYnAsIGFsaWduX29mZnNldCwgJnZhbCwgY21kX2ZsYWdzKTsKKworCWlmIChyYyA9PSAwKSB7CisJCXZhbCAmPSB+KDB4ZmYgPDwgQllURV9PRkZTRVQob2Zmc2V0KSk7CisJCXZhbCB8PSAoKmRhdGFfYnVmIDw8IEJZVEVfT0ZGU0VUKG9mZnNldCkpOworCisJCS8qIG52cmFtIGRhdGEgaXMgcmV0dXJuZWQgYXMgYW4gYXJyYXkgb2YgYnl0ZXMKKwkJICogY29udmVydCBpdCBiYWNrIHRvIGNwdSBvcmRlciAqLworCQl2YWwgPSBiZTMyX3RvX2NwdSh2YWwpOworCisJCXJjID0gYm54MnhfbnZyYW1fd3JpdGVfZHdvcmQoYnAsIGFsaWduX29mZnNldCwgdmFsLAorCQkJCQkgICAgIGNtZF9mbGFncyk7CisJfQorCisJLyogZGlzYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJYm54MnhfZGlzYWJsZV9udnJhbV9hY2Nlc3MoYnApOworCWJueDJ4X3JlbGVhc2VfbnZyYW1fbG9jayhicCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfbnZyYW1fd3JpdGUoc3RydWN0IGJueDJ4ICpicCwgdTMyIG9mZnNldCwgdTggKmRhdGFfYnVmLAorCQkJICAgICBpbnQgYnVmX3NpemUpCit7CisJaW50IHJjOworCXUzMiBjbWRfZmxhZ3M7CisJdTMyIHZhbDsKKwl1MzIgd3JpdHRlbl9zb19mYXI7CisKKwlpZiAoYnVmX3NpemUgPT0gMSkJLyogZXRodG9vbCAqLworCQlyZXR1cm4gYm54MnhfbnZyYW1fd3JpdGUxKGJwLCBvZmZzZXQsIGRhdGFfYnVmLCBidWZfc2l6ZSk7CisKKwlpZiAoKG9mZnNldCAmIDB4MDMpIHx8IChidWZfc2l6ZSAmIDB4MDMpIHx8IChidWZfc2l6ZSA9PSAwKSkgeworCQlEUChCTlgyWF9NU0dfTlZNLAorCQkgICAiSW52YWxpZCBwYXJhbWV0ZXI6IG9mZnNldCAweCV4ICBidWZfc2l6ZSAweCV4XG4iLAorCQkgICBvZmZzZXQsIGJ1Zl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9mZnNldCArIGJ1Zl9zaXplID4gYnAtPmNvbW1vbi5mbGFzaF9zaXplKSB7CisJCURQKEJOWDJYX01TR19OVk0sICJJbnZhbGlkIHBhcmFtZXRlcjogb2Zmc2V0ICgweCV4KSArIgorCQkJCSAgIiBidWZfc2l6ZSAoMHgleCkgPiBmbGFzaF9zaXplICgweCV4KVxuIiwKKwkJICAgb2Zmc2V0LCBidWZfc2l6ZSwgYnAtPmNvbW1vbi5mbGFzaF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVxdWVzdCBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJcmMgPSBibngyeF9hY3F1aXJlX252cmFtX2xvY2soYnApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogZW5hYmxlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlibngyeF9lbmFibGVfbnZyYW1fYWNjZXNzKGJwKTsKKworCXdyaXR0ZW5fc29fZmFyID0gMDsKKwljbWRfZmxhZ3MgPSBNQ1BSX05WTV9DT01NQU5EX0ZJUlNUOworCXdoaWxlICgod3JpdHRlbl9zb19mYXIgPCBidWZfc2l6ZSkgJiYgKHJjID09IDApKSB7CisJCWlmICh3cml0dGVuX3NvX2ZhciA9PSAoYnVmX3NpemUgLSBzaXplb2YodTMyKSkpCisJCQljbWRfZmxhZ3MgfD0gTUNQUl9OVk1fQ09NTUFORF9MQVNUOworCQllbHNlIGlmICgoKG9mZnNldCArIDQpICUgTlZSQU1fUEFHRV9TSVpFKSA9PSAwKQorCQkJY21kX2ZsYWdzIHw9IE1DUFJfTlZNX0NPTU1BTkRfTEFTVDsKKwkJZWxzZSBpZiAoKG9mZnNldCAlIE5WUkFNX1BBR0VfU0laRSkgPT0gMCkKKwkJCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0ZJUlNUOworCisJCW1lbWNweSgmdmFsLCBkYXRhX2J1ZiwgNCk7CisKKwkJcmMgPSBibngyeF9udnJhbV93cml0ZV9kd29yZChicCwgb2Zmc2V0LCB2YWwsIGNtZF9mbGFncyk7CisKKwkJLyogYWR2YW5jZSB0byB0aGUgbmV4dCBkd29yZCAqLworCQlvZmZzZXQgKz0gc2l6ZW9mKHUzMik7CisJCWRhdGFfYnVmICs9IHNpemVvZih1MzIpOworCQl3cml0dGVuX3NvX2ZhciArPSBzaXplb2YodTMyKTsKKwkJY21kX2ZsYWdzID0gMDsKKwl9CisKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlibngyeF9kaXNhYmxlX252cmFtX2FjY2VzcyhicCk7CisJYm54MnhfcmVsZWFzZV9udnJhbV9sb2NrKGJwKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICplZWJ1ZikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCByYyA9IDA7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlEUChCTlgyWF9NU0dfTlZNLCAiZXRodG9vbF9lZXByb206IGNtZCAlZFxuIgorCSAgIERQX0xFVkVMICIgIG1hZ2ljIDB4JXggIG9mZnNldCAweCV4ICglZCkgIGxlbiAweCV4ICglZClcbiIsCisJICAgZWVwcm9tLT5jbWQsIGVlcHJvbS0+bWFnaWMsIGVlcHJvbS0+b2Zmc2V0LCBlZXByb20tPm9mZnNldCwKKwkgICBlZXByb20tPmxlbiwgZWVwcm9tLT5sZW4pOworCisJLyogcGFyYW1ldGVycyBhbHJlYWR5IHZhbGlkYXRlZCBpbiBldGh0b29sX3NldF9lZXByb20gKi8KKworCS8qIFBIWSBlZXByb20gY2FuIGJlIGFjY2Vzc2VkIG9ubHkgYnkgdGhlIFBNRiAqLworCWlmICgoZWVwcm9tLT5tYWdpYyA+PSAweDUwNDg1OTAwKSAmJiAoZWVwcm9tLT5tYWdpYyA8PSAweDUwNDg1OUZGKSAmJgorCSAgICAhYnAtPnBvcnQucG1mKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlZXByb20tPm1hZ2ljID09IDB4NTA0ODU5NTApIHsKKwkJLyogJ1BIWVAnICgweDUwNDg1OTUwKTogcHJlcGFyZSBwaHkgZm9yIEZXIHVwZ3JhZGUgKi8KKwkJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9TVE9QKTsKKworCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKKwkJcmMgfD0gYm54MnhfbGlua19yZXNldCgmYnAtPmxpbmtfcGFyYW1zLAorCQkJCSAgICAgICAmYnAtPmxpbmtfdmFycywgMCk7CisJCWlmIChYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpID09CisJCQkJCVBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDEpCisJCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18wLAorCQkJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX0hJR0gsIHBvcnQpOworCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKKwkJYm54MnhfbGlua19yZXBvcnQoYnApOworCisJfSBlbHNlIGlmIChlZXByb20tPm1hZ2ljID09IDB4NTA0ODU5NTIpIHsKKwkJLyogJ1BIWVInICgweDUwNDg1OTUyKTogcmUtaW5pdCBsaW5rIGFmdGVyIEZXIHVwZ3JhZGUgKi8KKwkJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKSB7CisJCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKKwkJCXJjIHw9IGJueDJ4X2xpbmtfcmVzZXQoJmJwLT5saW5rX3BhcmFtcywKKwkJCQkJICAgICAgICZicC0+bGlua192YXJzLCAxKTsKKworCQkJcmMgfD0gYm54MnhfcGh5X2luaXQoJmJwLT5saW5rX3BhcmFtcywKKwkJCQkJICAgICAmYnAtPmxpbmtfdmFycyk7CisJCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKKwkJCWJueDJ4X2NhbGNfZmNfYWR2KGJwKTsKKwkJfQorCX0gZWxzZSBpZiAoZWVwcm9tLT5tYWdpYyA9PSAweDUzOTg1OTQzKSB7CisJCS8qICdQSFlDJyAoMHg1Mzk4NTk0Myk6IFBIWSBGVyB1cGdyYWRlIGNvbXBsZXRlZCAqLworCQlpZiAoWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKSA9PQorCQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxKSB7CisJCQl1OCBleHRfcGh5X2FkZHIgPQorCQkJICAgICBYR1hTX0VYVF9QSFlfQUREUihicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCisJCQkvKiBEU1AgUmVtb3ZlIERvd25sb2FkIE1vZGUgKi8KKwkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzAsCisJCQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fTE9XLCBwb3J0KTsKKworCQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7CisKKwkJCWJueDJ4X3NmeDcxMDFfc3Bfc3dfcmVzZXQoYnAsIHBvcnQsIGV4dF9waHlfYWRkcik7CisKKwkJCS8qIHdhaXQgMC41IHNlYyB0byBhbGxvdyBpdCB0byBydW4gKi8KKwkJCW1zbGVlcCg1MDApOworCQkJYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgcG9ydCk7CisJCQltc2xlZXAoNTAwKTsKKwkJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCQl9CisJfSBlbHNlCisJCXJjID0gYm54MnhfbnZyYW1fd3JpdGUoYnAsIGVlcHJvbS0+b2Zmc2V0LCBlZWJ1ZiwgZWVwcm9tLT5sZW4pOworCisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCBibngyeF9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbWVtc2V0KGNvYWwsIDAsIHNpemVvZihzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSkpOworCisJY29hbC0+cnhfY29hbGVzY2VfdXNlY3MgPSBicC0+cnhfdGlja3M7CisJY29hbC0+dHhfY29hbGVzY2VfdXNlY3MgPSBicC0+dHhfdGlja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJYnAtPnJ4X3RpY2tzID0gKHUxNiljb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKKwlpZiAoYnAtPnJ4X3RpY2tzID4gQk5YMlhfTUFYX0NPQUxFU0NFX1RPVVQpCisJCWJwLT5yeF90aWNrcyA9IEJOWDJYX01BWF9DT0FMRVNDRV9UT1VUOworCisJYnAtPnR4X3RpY2tzID0gKHUxNiljb2FsLT50eF9jb2FsZXNjZV91c2VjczsKKwlpZiAoYnAtPnR4X3RpY2tzID4gQk5YMlhfTUFYX0NPQUxFU0NFX1RPVVQpCisJCWJwLT50eF90aWNrcyA9IEJOWDJYX01BWF9DT0FMRVNDRV9UT1VUOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYm54MnhfdXBkYXRlX2NvYWxlc2NlKGJwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibngyeF9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWVyaW5nLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9BVkFJTDsKKwllcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJZXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKworCWVyaW5nLT5yeF9wZW5kaW5nID0gYnAtPnJ4X3Jpbmdfc2l6ZTsKKwllcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwllcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IDA7CisKKwllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBNQVhfVFhfQVZBSUw7CisJZXJpbmctPnR4X3BlbmRpbmcgPSBicC0+dHhfcmluZ19zaXplOworfQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYyA9IDA7CisKKwlpZiAoYnAtPnJlY292ZXJ5X3N0YXRlICE9IEJOWDJYX1JFQ09WRVJZX0RPTkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIYW5kbGluZyBwYXJpdHkgZXJyb3IgcmVjb3ZlcnkuIFRyeSBhZ2FpbiBsYXRlclxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmICgoZXJpbmctPnJ4X3BlbmRpbmcgPiBNQVhfUlhfQVZBSUwpIHx8CisJICAgIChlcmluZy0+dHhfcGVuZGluZyA+IE1BWF9UWF9BVkFJTCkgfHwKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5nIDw9IE1BWF9TS0JfRlJBR1MgKyA0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlicC0+cnhfcmluZ19zaXplID0gZXJpbmctPnJ4X3BlbmRpbmc7CisJYnAtPnR4X3Jpbmdfc2l6ZSA9IGVyaW5nLT50eF9wZW5kaW5nOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKKwkJcmMgPSBibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZXBhdXNlLT5hdXRvbmVnID0gKGJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID09CisJCQkgICBCTlgyWF9GTE9XX0NUUkxfQVVUTykgJiYKKwkJCSAgKGJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRyk7CisKKwllcGF1c2UtPnJ4X3BhdXNlID0gKChicC0+bGlua192YXJzLmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9SWCkgPT0KKwkJCSAgICBCTlgyWF9GTE9XX0NUUkxfUlgpOworCWVwYXVzZS0+dHhfcGF1c2UgPSAoKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKSA9PQorCQkJICAgIEJOWDJYX0ZMT1dfQ1RSTF9UWCk7CisKKwlEUChORVRJRl9NU0dfTElOSywgImV0aHRvb2xfcGF1c2VwYXJhbTogY21kICVkXG4iCisJICAgRFBfTEVWRUwgIiAgYXV0b25lZyAlZCAgcnhfcGF1c2UgJWQgIHR4X3BhdXNlICVkXG4iLAorCSAgIGVwYXVzZS0+Y21kLCBlcGF1c2UtPmF1dG9uZWcsIGVwYXVzZS0+cnhfcGF1c2UsIGVwYXVzZS0+dHhfcGF1c2UpOworfQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKElTX0UxSE1GKGJwKSkKKwkJcmV0dXJuIDA7CisKKwlEUChORVRJRl9NU0dfTElOSywgImV0aHRvb2xfcGF1c2VwYXJhbTogY21kICVkXG4iCisJICAgRFBfTEVWRUwgIiAgYXV0b25lZyAlZCAgcnhfcGF1c2UgJWQgIHR4X3BhdXNlICVkXG4iLAorCSAgIGVwYXVzZS0+Y21kLCBlcGF1c2UtPmF1dG9uZWcsIGVwYXVzZS0+cnhfcGF1c2UsIGVwYXVzZS0+dHhfcGF1c2UpOworCisJYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfQVVUTzsKKworCWlmIChlcGF1c2UtPnJ4X3BhdXNlKQorCQlicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCB8PSBCTlgyWF9GTE9XX0NUUkxfUlg7CisKKwlpZiAoZXBhdXNlLT50eF9wYXVzZSkKKwkJYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgfD0gQk5YMlhfRkxPV19DVFJMX1RYOworCisJaWYgKGJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID09IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKQorCQlicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOworCisJaWYgKGVwYXVzZS0+YXV0b25lZykgeworCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfQXV0b25lZykpIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiYXV0b25lZyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX0FVVE87CisJfQorCisJRFAoTkVUSUZfTVNHX0xJTkssCisJICAgInJlcV9mbG93X2N0cmwgMHgleFxuIiwgYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOworCQlibngyeF9saW5rX3NldChicCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjaGFuZ2VkID0gMDsKKwlpbnQgcmMgPSAwOworCisJaWYgKGRhdGEgJiB+KEVUSF9GTEFHX0xSTyB8IEVUSF9GTEFHX1JYSEFTSCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiBUcnkgYWdhaW4gbGF0ZXJcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBUUEEgcmVxdWlyZXMgUnggQ1NVTSBvZmZsb2FkaW5nICovCisJaWYgKChkYXRhICYgRVRIX0ZMQUdfTFJPKSAmJiBicC0+cnhfY3N1bSkgeworCQlpZiAoIWJwLT5kaXNhYmxlX3RwYSkgeworCQkJaWYgKCEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSkgeworCQkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CisJCQkJYnAtPmZsYWdzIHw9IFRQQV9FTkFCTEVfRkxBRzsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pIHsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9MUk87CisJCWJwLT5mbGFncyAmPSB+VFBBX0VOQUJMRV9GTEFHOworCQljaGFuZ2VkID0gMTsKKwl9CisKKwlpZiAoZGF0YSAmIEVUSF9GTEFHX1JYSEFTSCkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1JYSEFTSDsKKwllbHNlCisJCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfUlhIQVNIOworCisJaWYgKGNoYW5nZWQgJiYgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWJueDJ4X25pY191bmxvYWQoYnAsIFVOTE9BRF9OT1JNQUwpOworCQlyYyA9IGJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIGJueDJ4X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gYnAtPnJ4X2NzdW07Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjID0gMDsKKworCWlmIChicC0+cmVjb3Zlcnlfc3RhdGUgIT0gQk5YMlhfUkVDT1ZFUllfRE9ORSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhhbmRsaW5nIHBhcml0eSBlcnJvciByZWNvdmVyeS4gVHJ5IGFnYWluIGxhdGVyXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJYnAtPnJ4X2NzdW0gPSBkYXRhOworCisJLyogRGlzYWJsZSBUUEEsIHdoZW4gUnggQ1NVTSBpcyBkaXNhYmxlZC4gT3RoZXJ3aXNlIGFsbAorCSAgIFRQQSdlZCBwYWNrZXRzIHdpbGwgYmUgZGlzY2FyZGVkIGR1ZSB0byB3cm9uZyBUQ1AgQ1NVTSAqLworCWlmICghZGF0YSkgeworCQl1MzIgZmxhZ3MgPSBldGh0b29sX29wX2dldF9mbGFncyhkZXYpOworCisJCXJjID0gYm54Mnhfc2V0X2ZsYWdzKGRldiwgKGZsYWdzICYgfkVUSF9GTEFHX0xSTykpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCWlmIChkYXRhKSB7CisJCWRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU09fRUNOKTsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzY7CisJfSBlbHNlIHsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+KE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU09fRUNOKTsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU082OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljaGFyIHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOworfSBibngyeF90ZXN0c19zdHJfYXJyW0JOWDJYX05VTV9URVNUU10gPSB7CisJeyAicmVnaXN0ZXJfdGVzdCAob2ZmbGluZSkiIH0sCisJeyAibWVtb3J5X3Rlc3QgKG9mZmxpbmUpIiB9LAorCXsgImxvb3BiYWNrX3Rlc3QgKG9mZmxpbmUpIiB9LAorCXsgIm52cmFtX3Rlc3QgKG9ubGluZSkiIH0sCisJeyAiaW50ZXJydXB0X3Rlc3QgKG9ubGluZSkiIH0sCisJeyAibGlua190ZXN0IChvbmxpbmUpIiB9LAorCXsgImlkbGUgY2hlY2sgKG9ubGluZSkiIH0KK307CisKK3N0YXRpYyBpbnQgYm54MnhfdGVzdF9yZWdpc3RlcnMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaWR4LCBpLCByYyA9IC1FTk9ERVY7CisJdTMyIHdyX3ZhbCA9IDA7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdTMyIG9mZnNldDA7CisJCXUzMiBvZmZzZXQxOworCQl1MzIgbWFzazsKKwl9IHJlZ190YmxbXSA9IHsKKy8qIDAgKi8JCXsgQlJCMV9SRUdfUEFVU0VfTE9XX1RIUkVTSE9MRF8wLCAgICAgIDQsIDB4MDAwMDAzZmYgfSwKKwkJeyBET1JRX1JFR19EQl9BRERSMCwgICAgICAgICAgICAgICAgICAgNCwgMHhmZmZmZmZmZiB9LAorCQl7IEhDX1JFR19BR0dfSU5UXzAsICAgICAgICAgICAgICAgICAgICA0LCAweDAwMDAwM2ZmIH0sCisJCXsgUEJGX1JFR19NQUNfSUYwX0VOQUJMRSwgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKKwkJeyBQQkZfUkVHX1AwX0lOSVRfQ1JELCAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDdmZiB9LAorCQl7IFBSU19SRUdfQ0lEX1BPUlRfMCwgICAgICAgICAgICAgICAgICA0LCAweDAwZmZmZmZmIH0sCisJCXsgUFhQMl9SRUdfUFNXUlFfQ0RVMF9MMlAsICAgICAgICAgICAgIDQsIDB4MDAwZmZmZmYgfSwKKwkJeyBQWFAyX1JFR19SUV9DRFUwX0VGSVJTVF9NRU1fQUREUiwgICAgOCwgMHgwMDAzZmZmZiB9LAorCQl7IFBYUDJfUkVHX1BTV1JRX1RNMF9MMlAsICAgICAgICAgICAgICA0LCAweDAwMGZmZmZmIH0sCisJCXsgUFhQMl9SRUdfUlFfVVNETTBfRUZJUlNUX01FTV9BRERSLCAgIDgsIDB4MDAwM2ZmZmYgfSwKKy8qIDEwICovCXsgUFhQMl9SRUdfUFNXUlFfVFNETTBfTDJQLCAgICAgICAgICAgIDQsIDB4MDAwZmZmZmYgfSwKKwkJeyBRTV9SRUdfQ09OTk5VTV8wLCAgICAgICAgICAgICAgICAgICAgNCwgMHgwMDBmZmZmZiB9LAorCQl7IFRNX1JFR19MSU4wX01BWF9BQ1RJVkVfQ0lELCAgICAgICAgICA0LCAweDAwMDNmZmZmIH0sCisJCXsgU1JDX1JFR19LRVlSU1MwXzAsICAgICAgICAgICAgICAgICAgNDAsIDB4ZmZmZmZmZmYgfSwKKwkJeyBTUkNfUkVHX0tFWVJTUzBfNywgICAgICAgICAgICAgICAgICA0MCwgMHhmZmZmZmZmZiB9LAorCQl7IFhDTV9SRUdfV1VfREFfU0VUX1RNUl9DTlRfRkxHX0NNRDAwLCA0LCAweDAwMDAwMDAxIH0sCisJCXsgWENNX1JFR19XVV9EQV9DTlRfQ01EMDAsICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDMgfSwKKwkJeyBYQ01fUkVHX0dMQl9ERUxfQUNLX01BWF9DTlRfMCwgICAgICAgNCwgMHgwMDAwMDBmZiB9LAorCQl7IE5JR19SRUdfTExIMF9UX0JJVCwgICAgICAgICAgICAgICAgICA0LCAweDAwMDAwMDAxIH0sCisJCXsgTklHX1JFR19FTUFDMF9JTl9FTiwgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKKy8qIDIwICovCXsgTklHX1JFR19CTUFDMF9JTl9FTiwgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKKwkJeyBOSUdfUkVHX1hDTTBfT1VUX0VOLCAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMSB9LAorCQl7IE5JR19SRUdfQlJCMF9PVVRfRU4sICAgICAgICAgICAgICAgICA0LCAweDAwMDAwMDAxIH0sCisJCXsgTklHX1JFR19MTEgwX1hDTV9NQVNLLCAgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDcgfSwKKwkJeyBOSUdfUkVHX0xMSDBfQUNQSV9QQVRfNl9MRU4sICAgICAgICA2OCwgMHgwMDAwMDBmZiB9LAorCQl7IE5JR19SRUdfTExIMF9BQ1BJX1BBVF8wX0NSQywgICAgICAgIDY4LCAweGZmZmZmZmZmIH0sCisJCXsgTklHX1JFR19MTEgwX0RFU1RfTUFDXzBfMCwgICAgICAgICAxNjAsIDB4ZmZmZmZmZmYgfSwKKwkJeyBOSUdfUkVHX0xMSDBfREVTVF9JUF8wXzEsICAgICAgICAgIDE2MCwgMHhmZmZmZmZmZiB9LAorCQl7IE5JR19SRUdfTExIMF9JUFY0X0lQVjZfMCwgICAgICAgICAgMTYwLCAweDAwMDAwMDAxIH0sCisJCXsgTklHX1JFR19MTEgwX0RFU1RfVURQXzAsICAgICAgICAgICAxNjAsIDB4MDAwMGZmZmYgfSwKKy8qIDMwICovCXsgTklHX1JFR19MTEgwX0RFU1RfVENQXzAsICAgICAgICAgICAxNjAsIDB4MDAwMGZmZmYgfSwKKwkJeyBOSUdfUkVHX0xMSDBfVkxBTl9JRF8wLCAgICAgICAgICAgIDE2MCwgMHgwMDAwMGZmZiB9LAorCQl7IE5JR19SRUdfWEdYU19TRVJERVMwX01PREVfU0VMLCAgICAgICA0LCAweDAwMDAwMDAxIH0sCisJCXsgTklHX1JFR19MRURfQ09OVFJPTF9PVkVSUklERV9UUkFGRklDX1AwLCA0LCAweDAwMDAwMDAxIH0sCisJCXsgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwLCAgICAgIDQsIDB4MDdmZmZmZmYgfSwKKwkJeyBOSUdfUkVHX1hHWFMwX0NUUkxfRVhUUkVNT1RFTURJT1NULCAyNCwgMHgwMDAwMDAwMSB9LAorCQl7IE5JR19SRUdfU0VSREVTMF9DVFJMX1BIWV9BRERSLCAgICAgIDE2LCAweDAwMDAwMDFmIH0sCisKKwkJeyAweGZmZmZmZmZmLCAwLCAweDAwMDAwMDAwIH0KKwl9OworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBSZXBlYXQgdGhlIHRlc3QgdHdpY2U6CisJICAgRmlyc3QgYnkgd3JpdGluZyAweDAwMDAwMDAwLCBzZWNvbmQgYnkgd3JpdGluZyAweGZmZmZmZmZmICovCisJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykgeworCisJCXN3aXRjaCAoaWR4KSB7CisJCWNhc2UgMDoKKwkJCXdyX3ZhbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJd3JfdmFsID0gMHhmZmZmZmZmZjsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpID0gMDsgcmVnX3RibFtpXS5vZmZzZXQwICE9IDB4ZmZmZmZmZmY7IGkrKykgeworCQkJdTMyIG9mZnNldCwgbWFzaywgc2F2ZV92YWwsIHZhbDsKKworCQkJb2Zmc2V0ID0gcmVnX3RibFtpXS5vZmZzZXQwICsgcG9ydCpyZWdfdGJsW2ldLm9mZnNldDE7CisJCQltYXNrID0gcmVnX3RibFtpXS5tYXNrOworCisJCQlzYXZlX3ZhbCA9IFJFR19SRChicCwgb2Zmc2V0KTsKKworCQkJUkVHX1dSKGJwLCBvZmZzZXQsICh3cl92YWwgJiBtYXNrKSk7CisJCQl2YWwgPSBSRUdfUkQoYnAsIG9mZnNldCk7CisKKwkJCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KKwkJCVJFR19XUihicCwgb2Zmc2V0LCBzYXZlX3ZhbCk7CisKKwkJCS8qIHZlcmlmeSB2YWx1ZSBpcyBhcyBleHBlY3RlZCAqLworCQkJaWYgKCh2YWwgJiBtYXNrKSAhPSAod3JfdmFsICYgbWFzaykpIHsKKwkJCQlEUChORVRJRl9NU0dfUFJPQkUsCisJCQkJICAgIm9mZnNldCAweCV4OiB2YWwgMHgleCAhPSAweCV4IG1hc2sgMHgleFxuIiwKKwkJCQkgICBvZmZzZXQsIHZhbCwgd3JfdmFsLCBtYXNrKTsKKwkJCQlnb3RvIHRlc3RfcmVnX2V4aXQ7CisJCQl9CisJCX0KKwl9CisKKwlyYyA9IDA7CisKK3Rlc3RfcmVnX2V4aXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4X3Rlc3RfbWVtb3J5KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGksIGosIHJjID0gLUVOT0RFVjsKKwl1MzIgdmFsOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1MzIgb2Zmc2V0OworCQlpbnQgc2l6ZTsKKwl9IG1lbV90YmxbXSA9IHsKKwkJeyBDQ01fUkVHX1hYX0RFU0NSX1RBQkxFLCAgIENDTV9SRUdfWFhfREVTQ1JfVEFCTEVfU0laRSB9LAorCQl7IENGQ19SRUdfQUNUSVZJVFlfQ09VTlRFUiwgQ0ZDX1JFR19BQ1RJVklUWV9DT1VOVEVSX1NJWkUgfSwKKwkJeyBDRkNfUkVHX0xJTktfTElTVCwgICAgICAgIENGQ19SRUdfTElOS19MSVNUX1NJWkUgfSwKKwkJeyBETUFFX1JFR19DTURfTUVNLCAgICAgICAgIERNQUVfUkVHX0NNRF9NRU1fU0laRSB9LAorCQl7IFRDTV9SRUdfWFhfREVTQ1JfVEFCTEUsICAgVENNX1JFR19YWF9ERVNDUl9UQUJMRV9TSVpFIH0sCisJCXsgVUNNX1JFR19YWF9ERVNDUl9UQUJMRSwgICBVQ01fUkVHX1hYX0RFU0NSX1RBQkxFX1NJWkUgfSwKKwkJeyBYQ01fUkVHX1hYX0RFU0NSX1RBQkxFLCAgIFhDTV9SRUdfWFhfREVTQ1JfVEFCTEVfU0laRSB9LAorCisJCXsgMHhmZmZmZmZmZiwgMCB9CisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJY2hhciAqbmFtZTsKKwkJdTMyIG9mZnNldDsKKwkJdTMyIGUxX21hc2s7CisJCXUzMiBlMWhfbWFzazsKKwl9IHBydHlfdGJsW10gPSB7CisJCXsgIkNDTV9QUlRZX1NUUyIsICBDQ01fUkVHX0NDTV9QUlRZX1NUUywgICAweDNmZmMwLCAwIH0sCisJCXsgIkNGQ19QUlRZX1NUUyIsICBDRkNfUkVHX0NGQ19QUlRZX1NUUywgICAweDIsICAgICAweDIgfSwKKwkJeyAiRE1BRV9QUlRZX1NUUyIsIERNQUVfUkVHX0RNQUVfUFJUWV9TVFMsIDAsICAgICAgIDAgfSwKKwkJeyAiVENNX1BSVFlfU1RTIiwgIFRDTV9SRUdfVENNX1BSVFlfU1RTLCAgIDB4M2ZmYzAsIDAgfSwKKwkJeyAiVUNNX1BSVFlfU1RTIiwgIFVDTV9SRUdfVUNNX1BSVFlfU1RTLCAgIDB4M2ZmYzAsIDAgfSwKKwkJeyAiWENNX1BSVFlfU1RTIiwgIFhDTV9SRUdfWENNX1BSVFlfU1RTLCAgIDB4M2ZmYzEsIDAgfSwKKworCQl7IE5VTEwsIDB4ZmZmZmZmZmYsIDAsIDAgfQorCX07CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCisJCXJldHVybiByYzsKKworCS8qIEdvIHRocm91Z2ggYWxsIHRoZSBtZW1vcmllcyAqLworCWZvciAoaSA9IDA7IG1lbV90YmxbaV0ub2Zmc2V0ICE9IDB4ZmZmZmZmZmY7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IG1lbV90YmxbaV0uc2l6ZTsgaisrKQorCQkJUkVHX1JEKGJwLCBtZW1fdGJsW2ldLm9mZnNldCArIGoqNCk7CisKKwkvKiBDaGVjayB0aGUgcGFyaXR5IHN0YXR1cyAqLworCWZvciAoaSA9IDA7IHBydHlfdGJsW2ldLm9mZnNldCAhPSAweGZmZmZmZmZmOyBpKyspIHsKKwkJdmFsID0gUkVHX1JEKGJwLCBwcnR5X3RibFtpXS5vZmZzZXQpOworCQlpZiAoKENISVBfSVNfRTEoYnApICYmICh2YWwgJiB+KHBydHlfdGJsW2ldLmUxX21hc2spKSkgfHwKKwkJICAgIChDSElQX0lTX0UxSChicCkgJiYgKHZhbCAmIH4ocHJ0eV90YmxbaV0uZTFoX21hc2spKSkpIHsKKwkJCURQKE5FVElGX01TR19IVywKKwkJCSAgICIlcyBpcyAweCV4XG4iLCBwcnR5X3RibFtpXS5uYW1lLCB2YWwpOworCQkJZ290byB0ZXN0X21lbV9leGl0OworCQl9CisJfQorCisJcmMgPSAwOworCit0ZXN0X21lbV9leGl0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FpdF9mb3JfbGluayhzdHJ1Y3QgYm54MnggKmJwLCB1OCBsaW5rX3VwKQoreworCWludCBjbnQgPSAxMDAwOworCisJaWYgKGxpbmtfdXApCisJCXdoaWxlIChibngyeF9saW5rX3Rlc3QoYnApICYmIGNudC0tKQorCQkJbXNsZWVwKDEwKTsKK30KKworc3RhdGljIGludCBibngyeF9ydW5fbG9vcGJhY2soc3RydWN0IGJueDJ4ICpicCwgaW50IGxvb3BiYWNrX21vZGUsIHU4IGxpbmtfdXApCit7CisJdW5zaWduZWQgaW50IHBrdF9zaXplLCBudW1fcGt0cywgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldDsKKwlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwX3J4ID0gJmJwLT5mcFswXTsKKwlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwX3R4ID0gJmJwLT5mcFswXTsKKwl1MTYgdHhfc3RhcnRfaWR4LCB0eF9pZHg7CisJdTE2IHJ4X3N0YXJ0X2lkeCwgcnhfaWR4OworCXUxNiBwa3RfcHJvZCwgYmRfcHJvZDsKKwlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZjsKKwlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICp0eF9zdGFydF9iZDsKKwlzdHJ1Y3QgZXRoX3R4X3BhcnNlX2JkICpwYmQgPSBOVUxMOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwl1bmlvbiBldGhfcnhfY3FlICpjcWU7CisJdTggY3FlX2ZwX2ZsYWdzOworCXN0cnVjdCBzd19yeF9iZCAqcnhfYnVmOworCXUxNiBsZW47CisJaW50IHJjID0gLUVOT0RFVjsKKworCS8qIGNoZWNrIHRoZSBsb29wYmFjayBtb2RlICovCisJc3dpdGNoIChsb29wYmFja19tb2RlKSB7CisJY2FzZSBCTlgyWF9QSFlfTE9PUEJBQ0s6CisJCWlmIChicC0+bGlua19wYXJhbXMubG9vcGJhY2tfbW9kZSAhPSBMT09QQkFDS19YR1hTXzEwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQk5YMlhfTUFDX0xPT1BCQUNLOgorCQlicC0+bGlua19wYXJhbXMubG9vcGJhY2tfbW9kZSA9IExPT1BCQUNLX0JNQUM7CisJCWJueDJ4X3BoeV9pbml0KCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcHJlcGFyZSB0aGUgbG9vcGJhY2sgcGFja2V0ICovCisJcGt0X3NpemUgPSAoKChicC0+ZGV2LT5tdHUgPCBFVEhfTUFYX1BBQ0tFVF9TSVpFKSA/CisJCSAgICAgYnAtPmRldi0+bXR1IDogRVRIX01BWF9QQUNLRVRfU0laRSkgKyBFVEhfSExFTik7CisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBicC0+cnhfYnVmX3NpemUpOworCWlmICghc2tiKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byB0ZXN0X2xvb3BiYWNrX2V4aXQ7CisJfQorCXBhY2tldCA9IHNrYl9wdXQoc2tiLCBwa3Rfc2l6ZSk7CisJbWVtY3B5KHBhY2tldCwgYnAtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1zZXQocGFja2V0ICsgRVRIX0FMRU4sIDAsIEVUSF9BTEVOKTsKKwltZW1zZXQocGFja2V0ICsgMipFVEhfQUxFTiwgMHg3NywgKEVUSF9ITEVOIC0gMipFVEhfQUxFTikpOworCWZvciAoaSA9IEVUSF9ITEVOOyBpIDwgcGt0X3NpemU7IGkrKykKKwkJcGFja2V0W2ldID0gKHVuc2lnbmVkIGNoYXIpIChpICYgMHhmZik7CisKKwkvKiBzZW5kIHRoZSBsb29wYmFjayBwYWNrZXQgKi8KKwludW1fcGt0cyA9IDA7CisJdHhfc3RhcnRfaWR4ID0gbGUxNl90b19jcHUoKmZwX3R4LT50eF9jb25zX3NiKTsKKwlyeF9zdGFydF9pZHggPSBsZTE2X3RvX2NwdSgqZnBfcngtPnJ4X2NvbnNfc2IpOworCisJcGt0X3Byb2QgPSBmcF90eC0+dHhfcGt0X3Byb2QrKzsKKwl0eF9idWYgPSAmZnBfdHgtPnR4X2J1Zl9yaW5nW1RYX0JEKHBrdF9wcm9kKV07CisJdHhfYnVmLT5maXJzdF9iZCA9IGZwX3R4LT50eF9iZF9wcm9kOworCXR4X2J1Zi0+c2tiID0gc2tiOworCXR4X2J1Zi0+ZmxhZ3MgPSAwOworCisJYmRfcHJvZCA9IFRYX0JEKGZwX3R4LT50eF9iZF9wcm9kKTsKKwl0eF9zdGFydF9iZCA9ICZmcF90eC0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnN0YXJ0X2JkOworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgc2tiLT5kYXRhLAorCQkJCSBza2JfaGVhZGxlbihza2IpLCBETUFfVE9fREVWSUNFKTsKKwl0eF9zdGFydF9iZC0+YWRkcl9oaSA9IGNwdV90b19sZTMyKFU2NF9ISShtYXBwaW5nKSk7CisJdHhfc3RhcnRfYmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihVNjRfTE8obWFwcGluZykpOworCXR4X3N0YXJ0X2JkLT5uYmQgPSBjcHVfdG9fbGUxNigyKTsgLyogc3RhcnQgKyBwYmQgKi8KKwl0eF9zdGFydF9iZC0+bmJ5dGVzID0gY3B1X3RvX2xlMTYoc2tiX2hlYWRsZW4oc2tiKSk7CisJdHhfc3RhcnRfYmQtPnZsYW4gPSBjcHVfdG9fbGUxNihwa3RfcHJvZCk7CisJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkID0gRVRIX1RYX0JEX0ZMQUdTX1NUQVJUX0JEOworCXR4X3N0YXJ0X2JkLT5nZW5lcmFsX2RhdGEgPSAoKFVOSUNBU1RfQUREUkVTUyA8PAorCQkJCUVUSF9UWF9TVEFSVF9CRF9FVEhfQUREUl9UWVBFX1NISUZUKSB8IDEpOworCisJLyogdHVybiBvbiBwYXJzaW5nIGFuZCBnZXQgYSBCRCAqLworCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CisJcGJkID0gJmZwX3R4LT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucGFyc2VfYmQ7CisKKwltZW1zZXQocGJkLCAwLCBzaXplb2Yoc3RydWN0IGV0aF90eF9wYXJzZV9iZCkpOworCisJd21iKCk7CisKKwlmcF90eC0+dHhfZGIuZGF0YS5wcm9kICs9IDI7CisJYmFycmllcigpOworCURPT1JCRUxMKGJwLCBmcF90eC0+aW5kZXgsIGZwX3R4LT50eF9kYi5yYXcpOworCisJbW1pb3diKCk7CisKKwludW1fcGt0cysrOworCWZwX3R4LT50eF9iZF9wcm9kICs9IDI7IC8qIHN0YXJ0ICsgcGJkICovCisKKwl1ZGVsYXkoMTAwKTsKKworCXR4X2lkeCA9IGxlMTZfdG9fY3B1KCpmcF90eC0+dHhfY29uc19zYik7CisJaWYgKHR4X2lkeCAhPSB0eF9zdGFydF9pZHggKyBudW1fcGt0cykKKwkJZ290byB0ZXN0X2xvb3BiYWNrX2V4aXQ7CisKKwlyeF9pZHggPSBsZTE2X3RvX2NwdSgqZnBfcngtPnJ4X2NvbnNfc2IpOworCWlmIChyeF9pZHggIT0gcnhfc3RhcnRfaWR4ICsgbnVtX3BrdHMpCisJCWdvdG8gdGVzdF9sb29wYmFja19leGl0OworCisJY3FlID0gJmZwX3J4LT5yeF9jb21wX3JpbmdbUkNRX0JEKGZwX3J4LT5yeF9jb21wX2NvbnMpXTsKKwljcWVfZnBfZmxhZ3MgPSBjcWUtPmZhc3RfcGF0aF9jcWUudHlwZV9lcnJvcl9mbGFnczsKKwlpZiAoQ1FFX1RZUEUoY3FlX2ZwX2ZsYWdzKSB8fCAoY3FlX2ZwX2ZsYWdzICYgRVRIX1JYX0VSUk9SX0ZBTEdTKSkKKwkJZ290byB0ZXN0X2xvb3BiYWNrX3J4X2V4aXQ7CisKKwlsZW4gPSBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGt0X2xlbik7CisJaWYgKGxlbiAhPSBwa3Rfc2l6ZSkKKwkJZ290byB0ZXN0X2xvb3BiYWNrX3J4X2V4aXQ7CisKKwlyeF9idWYgPSAmZnBfcngtPnJ4X2J1Zl9yaW5nW1JYX0JEKGZwX3J4LT5yeF9iZF9jb25zKV07CisJc2tiID0gcnhfYnVmLT5za2I7CisJc2tiX3Jlc2VydmUoc2tiLCBjcWUtPmZhc3RfcGF0aF9jcWUucGxhY2VtZW50X29mZnNldCk7CisJZm9yIChpID0gRVRIX0hMRU47IGkgPCBwa3Rfc2l6ZTsgaSsrKQorCQlpZiAoKihza2ItPmRhdGEgKyBpKSAhPSAodW5zaWduZWQgY2hhcikgKGkgJiAweGZmKSkKKwkJCWdvdG8gdGVzdF9sb29wYmFja19yeF9leGl0OworCisJcmMgPSAwOworCit0ZXN0X2xvb3BiYWNrX3J4X2V4aXQ6CisKKwlmcF9yeC0+cnhfYmRfY29ucyA9IE5FWFRfUlhfSURYKGZwX3J4LT5yeF9iZF9jb25zKTsKKwlmcF9yeC0+cnhfYmRfcHJvZCA9IE5FWFRfUlhfSURYKGZwX3J4LT5yeF9iZF9wcm9kKTsKKwlmcF9yeC0+cnhfY29tcF9jb25zID0gTkVYVF9SQ1FfSURYKGZwX3J4LT5yeF9jb21wX2NvbnMpOworCWZwX3J4LT5yeF9jb21wX3Byb2QgPSBORVhUX1JDUV9JRFgoZnBfcngtPnJ4X2NvbXBfcHJvZCk7CisKKwkvKiBVcGRhdGUgcHJvZHVjZXJzICovCisJYm54MnhfdXBkYXRlX3J4X3Byb2QoYnAsIGZwX3J4LCBmcF9yeC0+cnhfYmRfcHJvZCwgZnBfcngtPnJ4X2NvbXBfcHJvZCwKKwkJCSAgICAgZnBfcngtPnJ4X3NnZV9wcm9kKTsKKwordGVzdF9sb29wYmFja19leGl0OgorCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gTE9PUEJBQ0tfTk9ORTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF90ZXN0X2xvb3BiYWNrKHN0cnVjdCBibngyeCAqYnAsIHU4IGxpbmtfdXApCit7CisJaW50IHJjID0gMCwgcmVzOworCisJaWYgKEJQX05PTUNQKGJwKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQlyZXR1cm4gQk5YMlhfTE9PUEJBQ0tfRkFJTEVEOworCisJYm54MnhfbmV0aWZfc3RvcChicCwgMSk7CisJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7CisKKwlyZXMgPSBibngyeF9ydW5fbG9vcGJhY2soYnAsIEJOWDJYX1BIWV9MT09QQkFDSywgbGlua191cCk7CisJaWYgKHJlcykgeworCQlEUChORVRJRl9NU0dfUFJPQkUsICIgIFBIWSBsb29wYmFjayBmYWlsZWQgIChyZXMgJWQpXG4iLCByZXMpOworCQlyYyB8PSBCTlgyWF9QSFlfTE9PUEJBQ0tfRkFJTEVEOworCX0KKworCXJlcyA9IGJueDJ4X3J1bl9sb29wYmFjayhicCwgQk5YMlhfTUFDX0xPT1BCQUNLLCBsaW5rX3VwKTsKKwlpZiAocmVzKSB7CisJCURQKE5FVElGX01TR19QUk9CRSwgIiAgTUFDIGxvb3BiYWNrIGZhaWxlZCAgKHJlcyAlZClcbiIsIHJlcyk7CisJCXJjIHw9IEJOWDJYX01BQ19MT09QQkFDS19GQUlMRUQ7CisJfQorCisJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7CisJYm54MnhfbmV0aWZfc3RhcnQoYnApOworCisJcmV0dXJuIHJjOworfQorCisjZGVmaW5lIENSQzMyX1JFU0lEVUFMCQkJMHhkZWJiMjBlMworCitzdGF0aWMgaW50IGJueDJ4X3Rlc3RfbnZyYW0oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJaW50IG9mZnNldDsKKwkJaW50IHNpemU7CisJfSBudnJhbV90YmxbXSA9IHsKKwkJeyAgICAgMCwgIDB4MTQgfSwgLyogYm9vdHN0cmFwICovCisJCXsgIDB4MTQsICAweGVjIH0sIC8qIGRpciAqLworCQl7IDB4MTAwLCAweDM1MCB9LCAvKiBtYW51Zl9pbmZvICovCisJCXsgMHg0NTAsICAweGYwIH0sIC8qIGZlYXR1cmVfaW5mbyAqLworCQl7IDB4NjQwLCAgMHg2NCB9LCAvKiB1cGdyYWRlX2tleV9pbmZvICovCisJCXsgMHg2YTQsICAweDY0IH0sCisJCXsgMHg3MDgsICAweDcwIH0sIC8qIG1hbnVmX2tleV9pbmZvICovCisJCXsgMHg3NzgsICAweDcwIH0sCisJCXsgICAgIDAsICAgICAwIH0KKwl9OworCV9fYmUzMiBidWZbMHgzNTAgLyA0XTsKKwl1OCAqZGF0YSA9ICh1OCAqKWJ1ZjsKKwlpbnQgaSwgcmM7CisJdTMyIG1hZ2ljLCBjcmM7CisKKwlpZiAoQlBfTk9NQ1AoYnApKQorCQlyZXR1cm4gMDsKKworCXJjID0gYm54MnhfbnZyYW1fcmVhZChicCwgMCwgZGF0YSwgNCk7CisJaWYgKHJjKSB7CisJCURQKE5FVElGX01TR19QUk9CRSwgIm1hZ2ljIHZhbHVlIHJlYWQgKHJjICVkKVxuIiwgcmMpOworCQlnb3RvIHRlc3RfbnZyYW1fZXhpdDsKKwl9CisKKwltYWdpYyA9IGJlMzJfdG9fY3B1KGJ1ZlswXSk7CisJaWYgKG1hZ2ljICE9IDB4NjY5OTU1YWEpIHsKKwkJRFAoTkVUSUZfTVNHX1BST0JFLCAibWFnaWMgdmFsdWUgKDB4JTA4eClcbiIsIG1hZ2ljKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIHRlc3RfbnZyYW1fZXhpdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBudnJhbV90YmxbaV0uc2l6ZTsgaSsrKSB7CisKKwkJcmMgPSBibngyeF9udnJhbV9yZWFkKGJwLCBudnJhbV90YmxbaV0ub2Zmc2V0LCBkYXRhLAorCQkJCSAgICAgIG52cmFtX3RibFtpXS5zaXplKTsKKwkJaWYgKHJjKSB7CisJCQlEUChORVRJRl9NU0dfUFJPQkUsCisJCQkgICAibnZyYW1fdGJsWyVkXSByZWFkIGRhdGEgKHJjICVkKVxuIiwgaSwgcmMpOworCQkJZ290byB0ZXN0X252cmFtX2V4aXQ7CisJCX0KKworCQljcmMgPSBldGhlcl9jcmNfbGUobnZyYW1fdGJsW2ldLnNpemUsIGRhdGEpOworCQlpZiAoY3JjICE9IENSQzMyX1JFU0lEVUFMKSB7CisJCQlEUChORVRJRl9NU0dfUFJPQkUsCisJCQkgICAibnZyYW1fdGJsWyVkXSBjcmMgdmFsdWUgKDB4JTA4eClcbiIsIGksIGNyYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIHRlc3RfbnZyYW1fZXhpdDsKKwkJfQorCX0KKwordGVzdF9udnJhbV9leGl0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF90ZXN0X2ludHIoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcgPSBibngyeF9zcChicCwgbWFjX2NvbmZpZyk7CisJaW50IGksIHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNvbmZpZy0+aGRyLmxlbmd0aCA9IDA7CisJaWYgKENISVBfSVNfRTEoYnApKQorCQkvKiB1c2UgbGFzdCB1bmljYXN0IGVudHJpZXMgKi8KKwkJY29uZmlnLT5oZHIub2Zmc2V0ID0gKEJQX1BPUlQoYnApID8gNjMgOiAzMSk7CisJZWxzZQorCQljb25maWctPmhkci5vZmZzZXQgPSBCUF9GVU5DKGJwKTsKKwljb25maWctPmhkci5jbGllbnRfaWQgPSBicC0+ZnAtPmNsX2lkOworCWNvbmZpZy0+aGRyLnJlc2VydmVkMSA9IDA7CisKKwlicC0+c2V0X21hY19wZW5kaW5nKys7CisJc21wX3dtYigpOworCXJjID0gYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQywgMCwKKwkJCSAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksCisJCQkgICBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX2NvbmZpZykpLCAwKTsKKwlpZiAocmMgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJaWYgKCFicC0+c2V0X21hY19wZW5kaW5nKQorCQkJCWJyZWFrOworCQkJc21wX3JtYigpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQl9CisJCWlmIChpID09IDEwKQorCQkJcmMgPSAtRU5PREVWOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRlc3QsIHU2NCAqYnVmKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiBUcnkgYWdhaW4gbGF0ZXJcbiIpOworCQlldGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKHU2NCkgKiBCTlgyWF9OVU1fVEVTVFMpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKworCS8qIG9mZmxpbmUgdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gTUYgbW9kZSAqLworCWlmIChJU19FMUhNRihicCkpCisJCWV0ZXN0LT5mbGFncyAmPSB+RVRIX1RFU1RfRkxfT0ZGTElORTsKKworCWlmIChldGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CisJCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJCXUzMiB2YWw7CisJCXU4IGxpbmtfdXA7CisKKwkJLyogc2F2ZSBjdXJyZW50IHZhbHVlIG9mIGlucHV0IGVuYWJsZSBmb3IgVFggcG9ydCBJRiAqLworCQl2YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfRUdSRVNTX1VNUDBfSU5fRU4gKyBwb3J0KjQpOworCQkvKiBkaXNhYmxlIGlucHV0IGZvciBUWCBwb3J0IElGICovCisJCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfVU1QMF9JTl9FTiArIHBvcnQqNCwgMCk7CisKKwkJbGlua191cCA9IChibngyeF9saW5rX3Rlc3QoYnApID09IDApOworCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKKwkJYm54MnhfbmljX2xvYWQoYnAsIExPQURfRElBRyk7CisJCS8qIHdhaXQgdW50aWwgbGluayBzdGF0ZSBpcyByZXN0b3JlZCAqLworCQlibngyeF93YWl0X2Zvcl9saW5rKGJwLCBsaW5rX3VwKTsKKworCQlpZiAoYm54MnhfdGVzdF9yZWdpc3RlcnMoYnApICE9IDApIHsKKwkJCWJ1ZlswXSA9IDE7CisJCQlldGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCQl9CisJCWlmIChibngyeF90ZXN0X21lbW9yeShicCkgIT0gMCkgeworCQkJYnVmWzFdID0gMTsKKwkJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisJCX0KKwkJYnVmWzJdID0gYm54MnhfdGVzdF9sb29wYmFjayhicCwgbGlua191cCk7CisJCWlmIChidWZbMl0gIT0gMCkKKwkJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX05PUk1BTCk7CisKKwkJLyogcmVzdG9yZSBpbnB1dCBmb3IgVFggcG9ydCBJRiAqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX1VNUDBfSU5fRU4gKyBwb3J0KjQsIHZhbCk7CisKKwkJYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKTsKKwkJLyogd2FpdCB1bnRpbCBsaW5rIHN0YXRlIGlzIHJlc3RvcmVkICovCisJCWJueDJ4X3dhaXRfZm9yX2xpbmsoYnAsIGxpbmtfdXApOworCX0KKwlpZiAoYm54MnhfdGVzdF9udnJhbShicCkgIT0gMCkgeworCQlidWZbM10gPSAxOworCQlldGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCX0KKwlpZiAoYm54MnhfdGVzdF9pbnRyKGJwKSAhPSAwKSB7CisJCWJ1Zls0XSA9IDE7CisJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisJfQorCWlmIChicC0+cG9ydC5wbWYpCisJCWlmIChibngyeF9saW5rX3Rlc3QoYnApICE9IDApIHsKKwkJCWJ1Zls1XSA9IDE7CisJCQlldGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCQl9CisKKyNpZmRlZiBCTlgyWF9FWFRSQV9ERUJVRworCWJueDJ4X3BhbmljX2R1bXAoYnApOworI2VuZGlmCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWxvbmcgb2Zmc2V0OworCWludCBzaXplOworCXU4IHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOworfSBibngyeF9xX3N0YXRzX2FycltCTlgyWF9OVU1fUV9TVEFUU10gPSB7CisvKiAxICovCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF9ieXRlc19yZWNlaXZlZF9oaSksIDgsICJbJWRdOiByeF9ieXRlcyIgfSwKKwl7IFFfU1RBVFNfT0ZGU0VUMzIoZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGkpLAorCQkJCQkJOCwgIlslZF06IHJ4X2Vycm9yX2J5dGVzIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkpLAorCQkJCQkJOCwgIlslZF06IHJ4X3VjYXN0X3BhY2tldHMiIH0sCisJeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKKwkJCQkJCTgsICJbJWRdOiByeF9tY2FzdF9wYWNrZXRzIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSksCisJCQkJCQk4LCAiWyVkXTogcnhfYmNhc3RfcGFja2V0cyIgfSwKKwl7IFFfU1RBVFNfT0ZGU0VUMzIobm9fYnVmZl9kaXNjYXJkX2hpKSwJOCwgIlslZF06IHJ4X2Rpc2NhcmRzIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMihyeF9lcnJfZGlzY2FyZF9wa3QpLAorCQkJCQkgNCwgIlslZF06IHJ4X3BoeV9pcF9lcnJfZGlzY2FyZHMifSwKKwl7IFFfU1RBVFNfT0ZGU0VUMzIocnhfc2tiX2FsbG9jX2ZhaWxlZCksCisJCQkJCSA0LCAiWyVkXTogcnhfc2tiX2FsbG9jX2Rpc2NhcmQiIH0sCisJeyBRX1NUQVRTX09GRlNFVDMyKGh3X2NzdW1fZXJyKSwgNCwgIlslZF06IHJ4X2NzdW1fb2ZmbG9hZF9lcnJvcnMiIH0sCisKKy8qIDEwICoveyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpKSwJOCwgIlslZF06IHR4X2J5dGVzIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAorCQkJCQkJOCwgIlslZF06IHR4X3VjYXN0X3BhY2tldHMiIH0sCisJeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKKwkJCQkJCTgsICJbJWRdOiB0eF9tY2FzdF9wYWNrZXRzIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSksCisJCQkJCQk4LCAiWyVkXTogdHhfYmNhc3RfcGFja2V0cyIgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJbG9uZyBvZmZzZXQ7CisJaW50IHNpemU7CisJdTMyIGZsYWdzOworI2RlZmluZSBTVEFUU19GTEFHU19QT1JUCQkxCisjZGVmaW5lIFNUQVRTX0ZMQUdTX0ZVTkMJCTIKKyNkZWZpbmUgU1RBVFNfRkxBR1NfQk9USAkJKFNUQVRTX0ZMQUdTX0ZVTkMgfCBTVEFUU19GTEFHU19QT1JUKQorCXU4IHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOworfSBibngyeF9zdGF0c19hcnJbQk5YMlhfTlVNX1NUQVRTXSA9IHsKKy8qIDEgKi8JeyBTVEFUU19PRkZTRVQzMih0b3RhbF9ieXRlc19yZWNlaXZlZF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X2J5dGVzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIoZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX0JPVEgsICJyeF9lcnJvcl9ieXRlcyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X3VjYXN0X3BhY2tldHMiIH0sCisJeyBTVEFUU19PRkZTRVQzMih0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X21jYXN0X3BhY2tldHMiIH0sCisJeyBTVEFUU19PRkZTRVQzMih0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X2JjYXN0X3BhY2tldHMiIH0sCisJeyBTVEFUU19PRkZTRVQzMihyeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9yc19oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X2NyY19lcnJvcnMiIH0sCisJeyBTVEFUU19PRkZTRVQzMihyeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X2FsaWduX2Vycm9ycyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHNfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF91bmRlcnNpemVfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKGV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfb3ZlcnNpemVfcGFja2V0cyIgfSwKKy8qIDEwICoveyBTVEFUU19PRkZTRVQzMihyeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHNfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9mcmFnbWVudHMiIH0sCisJeyBTVEFUU19PRkZTRVQzMihyeF9zdGF0X2V0aGVyc3RhdHNqYWJiZXJzX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfamFiYmVycyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKG5vX2J1ZmZfZGlzY2FyZF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X2Rpc2NhcmRzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIobWFjX2ZpbHRlcl9kaXNjYXJkKSwKKwkJCQk0LCBTVEFUU19GTEFHU19QT1JULCAicnhfZmlsdGVyZWRfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHh4b3ZlcmZsb3dfZGlzY2FyZCksCisJCQkJNCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X2Z3X2Rpc2NhcmRzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIoYnJiX2Ryb3BfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9icmJfZGlzY2FyZCIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKGJyYl90cnVuY2F0ZV9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X2JyYl90cnVuY2F0ZSIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHBhdXNlX2ZyYW1lc19yZWNlaXZlZF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X3BhdXNlX2ZyYW1lcyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfbWFjY29udHJvbGZyYW1lc3JlY2VpdmVkX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfbWFjX2N0cmxfZnJhbWVzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIobmlnX3RpbWVyX21heCksCisJCQk0LCBTVEFUU19GTEFHU19QT1JULCAicnhfY29uc3RhbnRfcGF1c2VfZXZlbnRzIiB9LAorLyogMjAgKi97IFNUQVRTX09GRlNFVDMyKHJ4X2Vycl9kaXNjYXJkX3BrdCksCisJCQkJNCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X3BoeV9pcF9lcnJfZGlzY2FyZHMifSwKKwl7IFNUQVRTX09GRlNFVDMyKHJ4X3NrYl9hbGxvY19mYWlsZWQpLAorCQkJCTQsIFNUQVRTX0ZMQUdTX0JPVEgsICJyeF9za2JfYWxsb2NfZGlzY2FyZCIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKGh3X2NzdW1fZXJyKSwKKwkJCQk0LCBTVEFUU19GTEFHU19CT1RILCAicnhfY3N1bV9vZmZsb2FkX2Vycm9ycyIgfSwKKworCXsgU1RBVFNfT0ZGU0VUMzIodG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX0JPVEgsICJ0eF9ieXRlcyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfaWZoY291dGJhZG9jdGV0c19oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4X2Vycm9yX2J5dGVzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIodG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAidHhfdWNhc3RfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAidHhfbWNhc3RfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAidHhfYmNhc3RfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9yc19oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4X21hY19lcnJvcnMiIH0sCisJeyBTVEFUU19PRkZTRVQzMihyeF9zdGF0X2RvdDNzdGF0c2NhcnJpZXJzZW5zZWVycm9yc19oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4X2NhcnJpZXJfZXJyb3JzIiB9LAorLyogMzAgKi97IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZG90M3N0YXRzc2luZ2xlY29sbGlzaW9uZnJhbWVzX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfc2luZ2xlX2NvbGxpc2lvbnMiIH0sCisJeyBTVEFUU19PRkZTRVQzMih0eF9zdGF0X2RvdDNzdGF0c211bHRpcGxlY29sbGlzaW9uZnJhbWVzX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfbXVsdGlfY29sbGlzaW9ucyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfZGVmZXJyZWQiIH0sCisJeyBTVEFUU19PRkZTRVQzMih0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF9leGNlc3NfY29sbGlzaW9ucyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZG90M3N0YXRzbGF0ZWNvbGxpc2lvbnNfaGkpLAorCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF9sYXRlX2NvbGxpc2lvbnMiIH0sCisJeyBTVEFUU19PRkZTRVQzMih0eF9zdGF0X2V0aGVyc3RhdHNjb2xsaXNpb25zX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfdG90YWxfY29sbGlzaW9ucyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NG9jdGV0c19oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4XzY0X2J5dGVfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NW9jdGV0c3RvMTI3b2N0ZXRzX2hpKSwKKwkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF82NV90b18xMjdfYnl0ZV9wYWNrZXRzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzX2hpKSwKKwkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF8xMjhfdG9fMjU1X2J5dGVfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMyNTZvY3RldHN0bzUxMW9jdGV0c19oaSksCisJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfMjU2X3RvXzUxMV9ieXRlX3BhY2tldHMiIH0sCisvKiA0MCAqL3sgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0c19oaSksCisJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfNTEyX3RvXzEwMjNfYnl0ZV9wYWNrZXRzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIoZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzX2hpKSwKKwkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF8xMDI0X3RvXzE1MjJfYnl0ZV9wYWNrZXRzIiB9LAorCXsgU1RBVFNfT0ZGU0VUMzIoZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19oaSksCisJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfMTUyM190b185MDIyX2J5dGVfcGFja2V0cyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHBhdXNlX2ZyYW1lc19zZW50X2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfcGF1c2VfZnJhbWVzIiB9Cit9OworCisjZGVmaW5lIElTX1BPUlRfU1RBVChpKSBcCisJKChibngyeF9zdGF0c19hcnJbaV0uZmxhZ3MgJiBTVEFUU19GTEFHU19CT1RIKSA9PSBTVEFUU19GTEFHU19QT1JUKQorI2RlZmluZSBJU19GVU5DX1NUQVQoaSkJCShibngyeF9zdGF0c19hcnJbaV0uZmxhZ3MgJiBTVEFUU19GTEFHU19GVU5DKQorI2RlZmluZSBJU19FMUhNRl9NT0RFX1NUQVQoYnApIFwKKwkJCShJU19FMUhNRihicCkgJiYgIShicC0+bXNnX2VuYWJsZSAmIEJOWDJYX01TR19TVEFUUykpCisKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0cmluZ3NldCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaSwgbnVtX3N0YXRzOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJaWYgKGlzX211bHRpKGJwKSkgeworCQkJbnVtX3N0YXRzID0gQk5YMlhfTlVNX1FfU1RBVFMgKiBicC0+bnVtX3F1ZXVlczsKKwkJCWlmICghSVNfRTFITUZfTU9ERV9TVEFUKGJwKSkKKwkJCQludW1fc3RhdHMgKz0gQk5YMlhfTlVNX1NUQVRTOworCQl9IGVsc2UgeworCQkJaWYgKElTX0UxSE1GX01PREVfU1RBVChicCkpIHsKKwkJCQludW1fc3RhdHMgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCBCTlgyWF9OVU1fU1RBVFM7IGkrKykKKwkJCQkJaWYgKElTX0ZVTkNfU1RBVChpKSkKKwkJCQkJCW51bV9zdGF0cysrOworCQkJfSBlbHNlCisJCQkJbnVtX3N0YXRzID0gQk5YMlhfTlVNX1NUQVRTOworCQl9CisJCXJldHVybiBudW1fc3RhdHM7CisKKwljYXNlIEVUSF9TU19URVNUOgorCQlyZXR1cm4gQk5YMlhfTlVNX1RFU1RTOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpLCBqLCBrOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJaWYgKGlzX211bHRpKGJwKSkgeworCQkJayA9IDA7CisJCQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQkJCWZvciAoaiA9IDA7IGogPCBCTlgyWF9OVU1fUV9TVEFUUzsgaisrKQorCQkJCQlzcHJpbnRmKGJ1ZiArIChrICsgaikqRVRIX0dTVFJJTkdfTEVOLAorCQkJCQkJYm54MnhfcV9zdGF0c19hcnJbal0uc3RyaW5nLCBpKTsKKwkJCQlrICs9IEJOWDJYX05VTV9RX1NUQVRTOworCQkJfQorCQkJaWYgKElTX0UxSE1GX01PREVfU1RBVChicCkpCisJCQkJYnJlYWs7CisJCQlmb3IgKGogPSAwOyBqIDwgQk5YMlhfTlVNX1NUQVRTOyBqKyspCisJCQkJc3RyY3B5KGJ1ZiArIChrICsgaikqRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAgICAgICBibngyeF9zdGF0c19hcnJbal0uc3RyaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgQk5YMlhfTlVNX1NUQVRTOyBpKyspIHsKKwkJCQlpZiAoSVNfRTFITUZfTU9ERV9TVEFUKGJwKSAmJiBJU19QT1JUX1NUQVQoaSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXN0cmNweShidWYgKyBqKkVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgICAgICAgYm54Mnhfc3RhdHNfYXJyW2ldLnN0cmluZyk7CisJCQkJaisrOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBFVEhfU1NfVEVTVDoKKwkJbWVtY3B5KGJ1ZiwgYm54MnhfdGVzdHNfc3RyX2Fyciwgc2l6ZW9mKGJueDJ4X3Rlc3RzX3N0cl9hcnIpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqYnVmKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiAqaHdfc3RhdHMsICpvZmZzZXQ7CisJaW50IGksIGosIGs7CisKKwlpZiAoaXNfbXVsdGkoYnApKSB7CisJCWsgPSAwOworCQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQkJaHdfc3RhdHMgPSAodTMyICopJmJwLT5mcFtpXS5ldGhfcV9zdGF0czsKKwkJCWZvciAoaiA9IDA7IGogPCBCTlgyWF9OVU1fUV9TVEFUUzsgaisrKSB7CisJCQkJaWYgKGJueDJ4X3Ffc3RhdHNfYXJyW2pdLnNpemUgPT0gMCkgeworCQkJCQkvKiBza2lwIHRoaXMgY291bnRlciAqLworCQkJCQlidWZbayArIGpdID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCW9mZnNldCA9IChod19zdGF0cyArCisJCQkJCSAgYm54MnhfcV9zdGF0c19hcnJbal0ub2Zmc2V0KTsKKwkJCQlpZiAoYm54MnhfcV9zdGF0c19hcnJbal0uc2l6ZSA9PSA0KSB7CisJCQkJCS8qIDQtYnl0ZSBjb3VudGVyICovCisJCQkJCWJ1ZltrICsgal0gPSAodTY0KSAqb2Zmc2V0OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogOC1ieXRlIGNvdW50ZXIgKi8KKwkJCQlidWZbayArIGpdID0gSElMT19VNjQoKm9mZnNldCwgKihvZmZzZXQgKyAxKSk7CisJCQl9CisJCQlrICs9IEJOWDJYX05VTV9RX1NUQVRTOworCQl9CisJCWlmIChJU19FMUhNRl9NT0RFX1NUQVQoYnApKQorCQkJcmV0dXJuOworCQlod19zdGF0cyA9ICh1MzIgKikmYnAtPmV0aF9zdGF0czsKKwkJZm9yIChqID0gMDsgaiA8IEJOWDJYX05VTV9TVEFUUzsgaisrKSB7CisJCQlpZiAoYm54Mnhfc3RhdHNfYXJyW2pdLnNpemUgPT0gMCkgeworCQkJCS8qIHNraXAgdGhpcyBjb3VudGVyICovCisJCQkJYnVmW2sgKyBqXSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlvZmZzZXQgPSAoaHdfc3RhdHMgKyBibngyeF9zdGF0c19hcnJbal0ub2Zmc2V0KTsKKwkJCWlmIChibngyeF9zdGF0c19hcnJbal0uc2l6ZSA9PSA0KSB7CisJCQkJLyogNC1ieXRlIGNvdW50ZXIgKi8KKwkJCQlidWZbayArIGpdID0gKHU2NCkgKm9mZnNldDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIDgtYnl0ZSBjb3VudGVyICovCisJCQlidWZbayArIGpdID0gSElMT19VNjQoKm9mZnNldCwgKihvZmZzZXQgKyAxKSk7CisJCX0KKwl9IGVsc2UgeworCQlod19zdGF0cyA9ICh1MzIgKikmYnAtPmV0aF9zdGF0czsKKwkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBCTlgyWF9OVU1fU1RBVFM7IGkrKykgeworCQkJaWYgKElTX0UxSE1GX01PREVfU1RBVChicCkgJiYgSVNfUE9SVF9TVEFUKGkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGJueDJ4X3N0YXRzX2FycltpXS5zaXplID09IDApIHsKKwkJCQkvKiBza2lwIHRoaXMgY291bnRlciAqLworCQkJCWJ1ZltqXSA9IDA7CisJCQkJaisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJb2Zmc2V0ID0gKGh3X3N0YXRzICsgYm54Mnhfc3RhdHNfYXJyW2ldLm9mZnNldCk7CisJCQlpZiAoYm54Mnhfc3RhdHNfYXJyW2ldLnNpemUgPT0gNCkgeworCQkJCS8qIDQtYnl0ZSBjb3VudGVyICovCisJCQkJYnVmW2pdID0gKHU2NCkgKm9mZnNldDsKKwkJCQlqKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiA4LWJ5dGUgY291bnRlciAqLworCQkJYnVmW2pdID0gSElMT19VNjQoKm9mZnNldCwgKihvZmZzZXQgKyAxKSk7CisJCQlqKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCWlmICghYnAtPnBvcnQucG1mKQorCQlyZXR1cm4gMDsKKworCWlmIChkYXRhID09IDApCisJCWRhdGEgPSAyOworCisJZm9yIChpID0gMDsgaSA8IChkYXRhICogMik7IGkrKykgeworCQlpZiAoKGkgJSAyKSA9PSAwKQorCQkJYm54Mnhfc2V0X2xlZCgmYnAtPmxpbmtfcGFyYW1zLCBMRURfTU9ERV9PUEVSLAorCQkJCSAgICAgIFNQRUVEXzEwMDApOworCQllbHNlCisJCQlibngyeF9zZXRfbGVkKCZicC0+bGlua19wYXJhbXMsIExFRF9NT0RFX09GRiwgMCk7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoNTAwKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGJwLT5saW5rX3ZhcnMubGlua191cCkKKwkJYm54Mnhfc2V0X2xlZCgmYnAtPmxpbmtfcGFyYW1zLCBMRURfTU9ERV9PUEVSLAorCQkJICAgICAgYnAtPmxpbmtfdmFycy5saW5lX3NwZWVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJueDJ4X2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gYm54MnhfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYm54Mnhfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBibngyeF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCQk9IGJueDJ4X2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MJCT0gYm54MnhfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gYm54MnhfZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSBibngyeF9zZXRfd29sLAorCS5nZXRfbXNnbGV2ZWwJCT0gYm54MnhfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gYm54Mnhfc2V0X21zZ2xldmVsLAorCS5ud2F5X3Jlc2V0CQk9IGJueDJ4X253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IGJueDJ4X2dldF9saW5rLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBibngyeF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbQkJPSBibngyeF9nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IGJueDJ4X3NldF9lZXByb20sCisJLmdldF9jb2FsZXNjZQkJPSBibngyeF9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZQkJPSBibngyeF9zZXRfY29hbGVzY2UsCisJLmdldF9yaW5ncGFyYW0JCT0gYm54MnhfZ2V0X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbQkJPSBibngyeF9zZXRfcmluZ3BhcmFtLAorCS5nZXRfcGF1c2VwYXJhbQkJPSBibngyeF9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0JCT0gYm54Mnhfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtCQk9IGJueDJ4X2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bQkJPSBibngyeF9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9zZXRfdHhfaHdfY3N1bSwKKwkuc2V0X2ZsYWdzCQk9IGJueDJ4X3NldF9mbGFncywKKwkuZ2V0X2ZsYWdzCQk9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cJCQk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbwkJPSBibngyeF9zZXRfdHNvLAorCS5zZWxmX3Rlc3QJCT0gYm54Mnhfc2VsZl90ZXN0LAorCS5nZXRfc3NldF9jb3VudAkJPSBibngyeF9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJCT0gYm54MnhfZ2V0X3N0cmluZ3MsCisJLnBoeXNfaWQJCT0gYm54MnhfcGh5c19pZCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBibngyeF9nZXRfZXRodG9vbF9zdGF0cywKK307CisKK3ZvaWQgYm54Mnhfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmJueDJ4X2V0aHRvb2xfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X2Z3X2RlZnMuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2Z3X2RlZnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9uZXQvYm54MnhfZndfZGVmcy5oCnJlbmFtZSB0byBkcml2ZXJzL25ldC9ibngyeC9ibngyeF9md19kZWZzLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X2Z3X2ZpbGVfaGRyLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9md19maWxlX2hkci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC9ibngyeF9md19maWxlX2hkci5oCnJlbmFtZSB0byBkcml2ZXJzL25ldC9ibngyeC9ibngyeF9md19maWxlX2hkci5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeF9oc2kuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2hzaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC9ibngyeF9oc2kuaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvYm54MngvYm54MnhfaHNpLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X2luaXQuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2luaXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9uZXQvYm54MnhfaW5pdC5oCnJlbmFtZSB0byBkcml2ZXJzL25ldC9ibngyeC9ibngyeF9pbml0LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X2luaXRfb3BzLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9pbml0X29wcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC9ibngyeF9pbml0X29wcy5oCnJlbmFtZSB0byBkcml2ZXJzL25ldC9ibngyeC9ibngyeF9pbml0X29wcy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4M2UzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2xpbmsuYwpAQCAtMCwwICsxLDY3MzUgQEAKKy8qIENvcHlyaWdodCAyMDA4LTIwMDkgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHRvIHlvdQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGF2YWlsYWJsZQorICogYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwgKHRoZSAiR1BMIikuCisgKgorICogTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUgdGhpcworICogc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhCisgKiBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbgorICogY29uc2VudC4KKyAqCisgKiBXcml0dGVuIGJ5IFlhbml2IFJvc25lcgorICoKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlICJibngyeC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVUSF9ITEVOCQkJMTQKKyNkZWZpbmUgRVRIX09WUkVIRUFECQkoRVRIX0hMRU4gKyA4KS8qIDggZm9yIENSQyArIFZMQU4qLworI2RlZmluZSBFVEhfTUlOX1BBQ0tFVF9TSVpFCQk2MAorI2RlZmluZSBFVEhfTUFYX1BBQ0tFVF9TSVpFCQkxNTAwCisjZGVmaW5lIEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUJOTYwMAorI2RlZmluZSBNRElPX0FDQ0VTU19USU1FT1VUCQkxMDAwCisjZGVmaW5lIEJNQUNfQ09OVFJPTF9SWF9FTkFCTEUJMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCVNob3J0Y3V0IGRlZmluaXRpb25zCQkgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE5JR19MQVRDSF9CQ19FTkFCTEVfTUlfSU5UIDAKKworI2RlZmluZSBOSUdfU1RBVFVTX0VNQUMwX01JX0lOVCBcCisJCU5JR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwX1JFR19TVEFUVVNfRU1BQzBfTUlTQ19NSV9JTlQKKyNkZWZpbmUgTklHX1NUQVRVU19YR1hTMF9MSU5LMTBHIFwKKwkJTklHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDBfUkVHX1NUQVRVU19YR1hTMF9MSU5LMTBHCisjZGVmaW5lIE5JR19TVEFUVVNfWEdYUzBfTElOS19TVEFUVVMgXAorCQlOSUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMF9SRUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTCisjZGVmaW5lIE5JR19TVEFUVVNfWEdYUzBfTElOS19TVEFUVVNfU0laRSBcCisJCU5JR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwX1JFR19TVEFUVVNfWEdYUzBfTElOS19TVEFUVVNfU0laRQorI2RlZmluZSBOSUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVMgXAorCQlOSUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMF9SRUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVMKKyNkZWZpbmUgTklHX01BU0tfTUlfSU5UIFwKKwkJTklHX01BU0tfSU5URVJSVVBUX1BPUlQwX1JFR19NQVNLX0VNQUMwX01JU0NfTUlfSU5UCisjZGVmaW5lIE5JR19NQVNLX1hHWFMwX0xJTksxMEcgXAorCQlOSUdfTUFTS19JTlRFUlJVUFRfUE9SVDBfUkVHX01BU0tfWEdYUzBfTElOSzEwRworI2RlZmluZSBOSUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUyBcCisJCU5JR19NQVNLX0lOVEVSUlVQVF9QT1JUMF9SRUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUworI2RlZmluZSBOSUdfTUFTS19TRVJERVMwX0xJTktfU1RBVFVTIFwKKwkJTklHX01BU0tfSU5URVJSVVBUX1BPUlQwX1JFR19NQVNLX1NFUkRFUzBfTElOS19TVEFUVVMKKworI2RlZmluZSBNRElPX0FOX0NMNzNfT1JfMzdfQ09NUExFVEUgXAorCQkoTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQ0w3M19BVVRPTkVHX0NPTVBMRVRFIHwgXAorCQkgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQ0wzN19BVVRPTkVHX0NPTVBMRVRFKQorCisjZGVmaW5lIFhHWFNfUkVTRVRfQklUUyBcCisJKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9YR1hTMF9SU1RCX0hXIHwgICBcCisJIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9YR1hTMF9JRERRIHwgICAgICBcCisJIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9YR1hTMF9QV1JEV04gfCAgICBcCisJIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9YR1hTMF9QV1JEV05fU0QgfCBcCisJIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9YR1hTMF9UWERfRklGT19SU1RCKQorCisjZGVmaW5lIFNFUkRFU19SRVNFVF9CSVRTIFwKKwkoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzNfTUlTQ19OSUdfTVVYX1NFUkRFUzBfUlNUQl9IVyB8IFwKKwkgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzNfTUlTQ19OSUdfTVVYX1NFUkRFUzBfSUREUSB8ICAgIFwKKwkgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzNfTUlTQ19OSUdfTVVYX1NFUkRFUzBfUFdSRFdOIHwgIFwKKwkgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzNfTUlTQ19OSUdfTVVYX1NFUkRFUzBfUFdSRFdOX1NEKQorCisjZGVmaW5lIEFVVE9ORUdfQ0wzNwkJU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfQ0wzNworI2RlZmluZSBBVVRPTkVHX0NMNzMJCVNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX0NMNzMKKyNkZWZpbmUgQVVUT05FR19CQU0gCQlTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9CQU0KKyNkZWZpbmUgQVVUT05FR19QQVJBTExFTCBcCisJCQkJU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfUEFSQUxMRUxfREVURUNUSU9OCisjZGVmaW5lIEFVVE9ORUdfU0dNSUlfRklCRVJfQVVUT0RFVCBcCisJCQkJU0hBUkVEX0hXX0NGR19BTl9FTl9TR01JSV9GSUJFUl9BVVRPX0RFVEVDVAorI2RlZmluZSBBVVRPTkVHX1JFTU9URV9QSFkJU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfUkVNT1RFX1BIWQorCisjZGVmaW5lIEdQX1NUQVRVU19QQVVTRV9SU09MVVRJT05fVFhTSURFIFwKKwkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX1BBVVNFX1JTT0xVVElPTl9UWFNJREUKKyNkZWZpbmUgR1BfU1RBVFVTX1BBVVNFX1JTT0xVVElPTl9SWFNJREUgXAorCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfUEFVU0VfUlNPTFVUSU9OX1JYU0lERQorI2RlZmluZSBHUF9TVEFUVVNfU1BFRURfTUFTSyBcCisJCQlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfTUFTSworI2RlZmluZSBHUF9TVEFUVVNfMTBNCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xME0KKyNkZWZpbmUgR1BfU1RBVFVTXzEwME0JTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwME0KKyNkZWZpbmUgR1BfU1RBVFVTXzFHCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xRworI2RlZmluZSBHUF9TVEFUVVNfMl81RwlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMl81RworI2RlZmluZSBHUF9TVEFUVVNfNUcJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzVHCisjZGVmaW5lIEdQX1NUQVRVU182RwlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfNkcKKyNkZWZpbmUgR1BfU1RBVFVTXzEwR19ISUcgXAorCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19ISUcKKyNkZWZpbmUgR1BfU1RBVFVTXzEwR19DWDQgXAorCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19DWDQKKyNkZWZpbmUgR1BfU1RBVFVTXzEyR19ISUcgXAorCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEyR19ISUcKKyNkZWZpbmUgR1BfU1RBVFVTXzEyXzVHIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMl81RworI2RlZmluZSBHUF9TVEFUVVNfMTNHCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xM0cKKyNkZWZpbmUgR1BfU1RBVFVTXzE1RwlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTVHCisjZGVmaW5lIEdQX1NUQVRVU18xNkcJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzE2RworI2RlZmluZSBHUF9TVEFUVVNfMUdfS1ggTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzFHX0tYCisjZGVmaW5lIEdQX1NUQVRVU18xMEdfS1g0IFwKKwkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMEdfS1g0CisKKyNkZWZpbmUgTElOS18xMFRIRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBUSEQKKyNkZWZpbmUgTElOS18xMFRGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBURkQKKyNkZWZpbmUgTElOS18xMDBUWEhECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFRYSEQKKyNkZWZpbmUgTElOS18xMDBUNAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTAwVDQKKyNkZWZpbmUgTElOS18xMDBUWEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFRYRkQKKyNkZWZpbmUgTElOS18xMDAwVEhECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMDBUSEQKKyNkZWZpbmUgTElOS18xMDAwVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMDBURkQKKyNkZWZpbmUgTElOS18xMDAwWEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMDBYRkQKKyNkZWZpbmUgTElOS18yNTAwVEhECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzI1MDBUSEQKKyNkZWZpbmUgTElOS18yNTAwVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzI1MDBURkQKKyNkZWZpbmUgTElOS18yNTAwWEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzI1MDBYRkQKKyNkZWZpbmUgTElOS18xMEdURkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwR1RGRAorI2RlZmluZSBMSU5LXzEwR1hGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBHWEZECisjZGVmaW5lIExJTktfMTJHVEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMkdURkQKKyNkZWZpbmUgTElOS18xMkdYRkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEyR1hGRAorI2RlZmluZSBMSU5LXzEyXzVHVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEyXzVHVEZECisjZGVmaW5lIExJTktfMTJfNUdYRkQJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTJfNUdYRkQKKyNkZWZpbmUgTElOS18xM0dURkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEzR1RGRAorI2RlZmluZSBMSU5LXzEzR1hGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTNHWEZECisjZGVmaW5lIExJTktfMTVHVEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xNUdURkQKKyNkZWZpbmUgTElOS18xNUdYRkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzE1R1hGRAorI2RlZmluZSBMSU5LXzE2R1RGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTZHVEZECisjZGVmaW5lIExJTktfMTZHWEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xNkdYRkQKKworI2RlZmluZSBQSFlfWEdYU19GTEFHCQkJMHgxCisjZGVmaW5lIFBIWV9TR01JSV9GTEFHCQkJMHgyCisjZGVmaW5lIFBIWV9TRVJERVNfRkxBRwkJCTB4NAorCisvKiAqLworI2RlZmluZSBTRlBfRUVQUk9NX0NPTl9UWVBFX0FERFIJCTB4MgorCSNkZWZpbmUgU0ZQX0VFUFJPTV9DT05fVFlQRV9WQUxfTEMgCQkweDcKKwkjZGVmaW5lIFNGUF9FRVBST01fQ09OX1RZUEVfVkFMX0NPUFBFUgkweDIxCisKKworI2RlZmluZSBTRlBfRUVQUk9NX0NPTVBfQ09ERV9BRERSCQkweDMKKwkjZGVmaW5lIFNGUF9FRVBST01fQ09NUF9DT0RFX1NSX01BU0sJKDE8PDQpCisJI2RlZmluZSBTRlBfRUVQUk9NX0NPTVBfQ09ERV9MUl9NQVNLCSgxPDw1KQorCSNkZWZpbmUgU0ZQX0VFUFJPTV9DT01QX0NPREVfTFJNX01BU0sJKDE8PDYpCisKKyNkZWZpbmUgU0ZQX0VFUFJPTV9GQ19UWF9URUNIX0FERFIJCTB4OAorCSNkZWZpbmUgU0ZQX0VFUFJPTV9GQ19UWF9URUNIX0JJVE1BU0tfQ09QUEVSX1BBU1NJVkUgMHg0CisJI2RlZmluZSBTRlBfRUVQUk9NX0ZDX1RYX1RFQ0hfQklUTUFTS19DT1BQRVJfQUNUSVZFCSAweDgKKworI2RlZmluZSBTRlBfRUVQUk9NX09QVElPTlNfQUREUiAJCTB4NDAKKwkjZGVmaW5lIFNGUF9FRVBST01fT1BUSU9OU19MSU5FQVJfUlhfT1VUX01BU0sgMHgxCisjZGVmaW5lIFNGUF9FRVBST01fT1BUSU9OU19TSVpFIAkJMgorCisjZGVmaW5lIEVEQ19NT0RFX0xJTkVBUgkgCQkJMHgwMDIyCisjZGVmaW5lIEVEQ19NT0RFX0xJTUlUSU5HCSAJCQkweDAwNDQKKyNkZWZpbmUgRURDX01PREVfUEFTU0lWRV9EQUMgCQkJMHgwMDU1CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENMNDVfV1JfT1ZFUl9DTDIyKF9icCwgX3BvcnQsIF9waHlfYWRkciwgX2JhbmssIF9hZGRyLCBfdmFsKSBcCisJYm54MnhfY2w0NV93cml0ZShfYnAsIF9wb3J0LCAwLCBfcGh5X2FkZHIsIFwKKwkJREVGQVVMVF9QSFlfREVWX0FERFIsIFwKKwkJKF9iYW5rICsgKF9hZGRyICYgMHhmKSksIFwKKwkJX3ZhbCkKKworI2RlZmluZSBDTDQ1X1JEX09WRVJfQ0wyMihfYnAsIF9wb3J0LCBfcGh5X2FkZHIsIF9iYW5rLCBfYWRkciwgX3ZhbCkgXAorCWJueDJ4X2NsNDVfcmVhZChfYnAsIF9wb3J0LCAwLCBfcGh5X2FkZHIsIFwKKwkJREVGQVVMVF9QSFlfREVWX0FERFIsIFwKKwkJKF9iYW5rICsgKF9hZGRyICYgMHhmKSksIFwKKwkJX3ZhbCkKKworc3RhdGljIHZvaWQgYm54Mnhfc2V0X3NlcmRlc19hY2Nlc3Moc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIGVtYWNfYmFzZSA9IChwYXJhbXMtPnBvcnQpID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CisKKwkvKiBTZXQgQ2xhdXNlIDIyICovCisJUkVHX1dSKGJwLCBOSUdfUkVHX1NFUkRFUzBfQ1RSTF9NRF9TVCArIHBhcmFtcy0+cG9ydCoweDEwLCAxKTsKKwlSRUdfV1IoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTURJT19DT01NLCAweDI0NWY4MDAwKTsKKwl1ZGVsYXkoNTAwKTsKKwlSRUdfV1IoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTURJT19DT01NLCAweDI0NWQwMDBmKTsKKwl1ZGVsYXkoNTAwKTsKKwkgLyogU2V0IENsYXVzZSA0NSAqLworCVJFR19XUihicCwgTklHX1JFR19TRVJERVMwX0NUUkxfTURfU1QgKyBwYXJhbXMtPnBvcnQqMHgxMCwgMCk7Cit9CitzdGF0aWMgdm9pZCBibngyeF9zZXRfcGh5X21kaW8oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IHBoeV9mbGFncykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKworCWlmIChwaHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCVJFR19XUihicCwgTklHX1JFR19YR1hTMF9DVFJMX01EX1NUICsKKwkJCSAgIHBhcmFtcy0+cG9ydCoweDE4LCAwKTsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFMwX0NUUkxfTURfREVWQUQgKyBwYXJhbXMtPnBvcnQqMHgxOCwKKwkJCSAgIERFRkFVTFRfUEhZX0RFVl9BRERSKTsKKwl9IGVsc2UgeworCQlibngyeF9zZXRfc2VyZGVzX2FjY2VzcyhwYXJhbXMpOworCisJCVJFR19XUihicCwgTklHX1JFR19TRVJERVMwX0NUUkxfTURfREVWQUQgKworCQkJICAgcGFyYW1zLT5wb3J0KjB4MTAsCisJCQkgICBERUZBVUxUX1BIWV9ERVZfQUREUik7CisJfQorfQorCitzdGF0aWMgdTMyIGJueDJ4X2JpdHNfZW4oc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbCA9IFJFR19SRChicCwgcmVnKTsKKworCXZhbCB8PSBiaXRzOworCVJFR19XUihicCwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1MzIgYm54MnhfYml0c19kaXMoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbCA9IFJFR19SRChicCwgcmVnKTsKKworCXZhbCAmPSB+Yml0czsKKwlSRUdfV1IoYnAsIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBibngyeF9lbWFjX2luaXQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCS8qIHJlc2V0IGFuZCB1bnJlc2V0IHRoZSBlbWFjIGNvcmUgKi8KKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CisJdTMyIHZhbDsKKwl1MTYgdGltZW91dDsKKworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCisJCSAgIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzBfSEFSRF9DT1JFIDw8IHBvcnQpKTsKKwl1ZGVsYXkoNSk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9TRVQsCisJCSAgIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzBfSEFSRF9DT1JFIDw8IHBvcnQpKTsKKworCS8qIGluaXQgZW1hYyAtIHVzZSByZWFkLW1vZGlmeS13cml0ZSAqLworCS8qIHNlbGYgY2xlYXIgcmVzZXQgKi8KKwl2YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTU9ERSk7CisJRU1BQ19XUihicCwgRU1BQ19SRUdfRU1BQ19NT0RFLCAodmFsIHwgRU1BQ19NT0RFX1JFU0VUKSk7CisKKwl0aW1lb3V0ID0gMjAwOworCWRvIHsKKwkJdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01PREUpOworCQlEUChORVRJRl9NU0dfTElOSywgIkVNQUMgcmVzZXQgcmVnIGlzICV1XG4iLCB2YWwpOworCQlpZiAoIXRpbWVvdXQpIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiRU1BQyB0aW1lb3V0IVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJdGltZW91dC0tOworCX0gd2hpbGUgKHZhbCAmIEVNQUNfTU9ERV9SRVNFVCk7CisKKwkvKiBTZXQgbWFjIGFkZHJlc3MgKi8KKwl2YWwgPSAoKHBhcmFtcy0+bWFjX2FkZHJbMF0gPDwgOCkgfAorCQlwYXJhbXMtPm1hY19hZGRyWzFdKTsKKwlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01BQ19NQVRDSCwgdmFsKTsKKworCXZhbCA9ICgocGFyYW1zLT5tYWNfYWRkclsyXSA8PCAyNCkgfAorCSAgICAgICAocGFyYW1zLT5tYWNfYWRkclszXSA8PCAxNikgfAorCSAgICAgICAocGFyYW1zLT5tYWNfYWRkcls0XSA8PCA4KSB8CisJCXBhcmFtcy0+bWFjX2FkZHJbNV0pOworCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTUFDX01BVENIICsgNCwgdmFsKTsKK30KKworc3RhdGljIHU4IGJueDJ4X2VtYWNfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLCB1OCBsYikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CisJdTMyIHZhbDsKKworCURQKE5FVElGX01TR19MSU5LLCAiZW5hYmxpbmcgRU1BQ1xuIik7CisKKwkvKiBlbmFibGUgZW1hYyBhbmQgbm90IGJtYWMgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX1BPUlQgKyBwb3J0KjQsIDEpOworCisJLyogZm9yIHBhbGFkaXVtICovCisJaWYgKENISVBfUkVWX0lTX0VNVUwoYnApKSB7CisJCS8qIFVzZSBsYW5lIDEgKG9mIGxhbmVzIDAtMykgKi8KKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfTEFORV9TRUxfUDAgKyBwb3J0KjQsIDEpOworCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYU19TRVJERVMwX01PREVfU0VMICsKKwkJCSAgICBwb3J0KjQsIDEpOworCX0KKwkvKiBmb3IgZnBnYSAqLworCWVsc2UKKworCWlmIChDSElQX1JFVl9JU19GUEdBKGJwKSkgeworCQkvKiBVc2UgbGFuZSAxIChvZiBsYW5lcyAwLTMpICovCisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZW1hY19lbmFibGU6IFNldHRpbmcgRlBHQVxuIik7CisKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfTEFORV9TRUxfUDAgKyBwb3J0KjQsIDEpOworCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYU19TRVJERVMwX01PREVfU0VMICsgcG9ydCo0LAorCQkJICAgIDApOworCX0gZWxzZQorCS8qIEFTSUMgKi8KKwlpZiAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQl1MzIgc2VyX2xhbmUgPSAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgorCQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX01BU0spID4+CisJCQkgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfU0hJRlQpOworCisJCURQKE5FVElGX01TR19MSU5LLCAiWEdYU1xuIik7CisJCS8qIHNlbGVjdCB0aGUgbWFzdGVyIGxhbmVzIChvdXQgb2YgMC0zKSAqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYU19MQU5FX1NFTF9QMCArCisJCQkgICBwb3J0KjQsIHNlcl9sYW5lKTsKKwkJLyogc2VsZWN0IFhHWFMgKi8KKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArCisJCQkgICBwb3J0KjQsIDEpOworCisJfSBlbHNlIHsgLyogU2VyRGVzICovCisJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVzXG4iKTsKKwkJLyogc2VsZWN0IFNlckRlcyAqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYU19TRVJERVMwX01PREVfU0VMICsKKwkJCSAgIHBvcnQqNCwgMCk7CisJfQorCisJYm54MnhfYml0c19lbihicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19SWF9NT0RFLAorCQkgICAgRU1BQ19SWF9NT0RFX1JFU0VUKTsKKwlibngyeF9iaXRzX2VuKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX1RYX01PREUsCisJCSAgICBFTUFDX1RYX01PREVfUkVTRVQpOworCisJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKSB7CisJCS8qIGNvbmZpZyBHTUlJIG1vZGUgKi8KKwkJdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01PREUpOworCQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01PREUsCisJCQkgICAgKHZhbCB8IEVNQUNfTU9ERV9QT1JUX0dNSUkpKTsKKwl9IGVsc2UgeyAvKiBBU0lDICovCisJCS8qIHBhdXNlIGVuYWJsZS9kaXNhYmxlICovCisJCWJueDJ4X2JpdHNfZGlzKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX1JYX01PREUsCisJCQkgICAgICAgRU1BQ19SWF9NT0RFX0ZMT1dfRU4pOworCQlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1JYKQorCQkJYm54MnhfYml0c19lbihicCwgZW1hY19iYXNlICsKKwkJCQkgICAgRU1BQ19SRUdfRU1BQ19SWF9NT0RFLAorCQkJCSAgICBFTUFDX1JYX01PREVfRkxPV19FTik7CisKKwkJYm54MnhfYml0c19kaXMoYnAsICBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX1RYX01PREUsCisJCQkgICAgIChFTUFDX1RYX01PREVfRVhUX1BBVVNFX0VOIHwKKwkJCSAgICAgIEVNQUNfVFhfTU9ERV9GTE9XX0VOKSk7CisJCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfVFgpCisJCQlibngyeF9iaXRzX2VuKGJwLCBlbWFjX2Jhc2UgKworCQkJCSAgICBFTUFDX1JFR19FTUFDX1RYX01PREUsCisJCQkJICAgKEVNQUNfVFhfTU9ERV9FWFRfUEFVU0VfRU4gfAorCQkJCSAgICBFTUFDX1RYX01PREVfRkxPV19FTikpOworCX0KKworCS8qIEtFRVBfVkxBTl9UQUcsIHByb21pc2N1b3VzICovCisJdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX1JYX01PREUpOworCXZhbCB8PSBFTUFDX1JYX01PREVfS0VFUF9WTEFOX1RBRyB8IEVNQUNfUlhfTU9ERV9QUk9NSVNDVU9VUzsKKwlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX1JYX01PREUsIHZhbCk7CisKKwkvKiBTZXQgTG9vcGJhY2sgKi8KKwl2YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTU9ERSk7CisJaWYgKGxiKQorCQl2YWwgfD0gMHg4MTA7CisJZWxzZQorCQl2YWwgJj0gfjB4ODEwOworCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTU9ERSwgdmFsKTsKKworCS8qIGVuYWJsZSBlbWFjICovCisJUkVHX1dSKGJwLCBOSUdfUkVHX05JR19FTUFDMF9FTiArIHBvcnQqNCwgMSk7CisKKwkvKiBlbmFibGUgZW1hYyBmb3IganVtYm8gcGFja2V0cyAqLworCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfUlhfTVRVX1NJWkUsCisJCShFTUFDX1JYX01UVV9TSVpFX0pVTUJPX0VOQSB8CisJCSAoRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRSArIEVUSF9PVlJFSEVBRCkpKTsKKworCS8qIHN0cmlwIENSQyAqLworCVJFR19XUihicCwgTklHX1JFR19OSUdfSU5HUkVTU19FTUFDMF9OT19DUkMgKyBwb3J0KjQsIDB4MSk7CisKKwkvKiBkaXNhYmxlIHRoZSBOSUcgaW4vb3V0IHRvIHRoZSBibWFjICovCisJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX0lOX0VOICsgcG9ydCo0LCAweDApOworCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIDB4MCk7CisJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX09VVF9FTiArIHBvcnQqNCwgMHgwKTsKKworCS8qIGVuYWJsZSB0aGUgTklHIGluL291dCB0byB0aGUgZW1hYyAqLworCVJFR19XUihicCwgTklHX1JFR19FTUFDMF9JTl9FTiArIHBvcnQqNCwgMHgxKTsKKwl2YWwgPSAwOworCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfVFgpCisJCXZhbCA9IDE7CisKKwlSRUdfV1IoYnAsIE5JR19SRUdfRU1BQzBfUEFVU0VfT1VUX0VOICsgcG9ydCo0LCB2YWwpOworCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfT1VUX0VOICsgcG9ydCo0LCAweDEpOworCisJaWYgKENISVBfUkVWX0lTX0VNVUwoYnApKSB7CisJCS8qIHRha2UgdGhlIEJpZ01hYyBvdXQgb2YgcmVzZXQgKi8KKwkJUkVHX1dSKGJwLAorCQkJICAgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAorCQkJICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9CTUFDMCA8PCBwb3J0KSk7CisKKwkJLyogZW5hYmxlIGFjY2VzcyBmb3IgYm1hYyByZWdpc3RlcnMgKi8KKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX1JFR1NfT1VUX0VOICsgcG9ydCo0LCAweDEpOworCX0gZWxzZQorCQlSRUdfV1IoYnAsIE5JR19SRUdfQk1BQzBfUkVHU19PVVRfRU4gKyBwb3J0KjQsIDB4MCk7CisKKwl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0VNQUM7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdTggYm54MnhfYm1hY19lbmFibGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCQkgIHU4IGlzX2xiKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTMyIGJtYWNfYWRkciA9IHBvcnQgPyBOSUdfUkVHX0lOR1JFU1NfQk1BQzFfTUVNIDoKKwkJCSAgICAgICBOSUdfUkVHX0lOR1JFU1NfQk1BQzBfTUVNOworCXUzMiB3Yl9kYXRhWzJdOworCXUzMiB2YWw7CisKKwlEUChORVRJRl9NU0dfTElOSywgIkVuYWJsaW5nIEJpZ01BQ1xuIik7CisJLyogcmVzZXQgYW5kIHVucmVzZXQgdGhlIEJpZ01hYyAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCisJICAgICAgIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcG9ydCkpOworCW1zbGVlcCgxKTsKKworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAorCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKKworCS8qIGVuYWJsZSBhY2Nlc3MgZm9yIGJtYWMgcmVnaXN0ZXJzICovCisJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX1JFR1NfT1VUX0VOICsgcG9ydCo0LCAweDEpOworCisJLyogWEdYUyBjb250cm9sICovCisJd2JfZGF0YVswXSA9IDB4M2M7CisJd2JfZGF0YVsxXSA9IDA7CisJUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArCisJCSAgICAgIEJJR01BQ19SRUdJU1RFUl9CTUFDX1hHWFNfQ09OVFJPTCwKKwkJICAgICAgd2JfZGF0YSwgMik7CisKKwkvKiB0eCBNQUMgU0EgKi8KKwl3Yl9kYXRhWzBdID0gKChwYXJhbXMtPm1hY19hZGRyWzJdIDw8IDI0KSB8CisJCSAgICAgICAocGFyYW1zLT5tYWNfYWRkclszXSA8PCAxNikgfAorCQkgICAgICAgKHBhcmFtcy0+bWFjX2FkZHJbNF0gPDwgOCkgfAorCQkJcGFyYW1zLT5tYWNfYWRkcls1XSk7CisJd2JfZGF0YVsxXSA9ICgocGFyYW1zLT5tYWNfYWRkclswXSA8PCA4KSB8CisJCQlwYXJhbXMtPm1hY19hZGRyWzFdKTsKKwlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1RYX1NPVVJDRV9BRERSLAorCQkgICAgd2JfZGF0YSwgMik7CisKKwkvKiB0eCBjb250cm9sICovCisJdmFsID0gMHhjMDsKKwlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQorCQl2YWwgfD0gMHg4MDAwMDA7CisJd2JfZGF0YVswXSA9IHZhbDsKKwl3Yl9kYXRhWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1RYX0NPTlRST0wsCisJCQl3Yl9kYXRhLCAyKTsKKworCS8qIG1hYyBjb250cm9sICovCisJdmFsID0gMHgzOworCWlmIChpc19sYikgeworCQl2YWwgfD0gMHg0OworCQlEUChORVRJRl9NU0dfTElOSywgImVuYWJsZSBibWFjIGxvb3BiYWNrXG4iKTsKKwl9CisJd2JfZGF0YVswXSA9IHZhbDsKKwl3Yl9kYXRhWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX0JNQUNfQ09OVFJPTCwKKwkJICAgIHdiX2RhdGEsIDIpOworCisJLyogc2V0IHJ4IG10dSAqLworCXdiX2RhdGFbMF0gPSBFVEhfTUFYX0pVTUJPX1BBQ0tFVF9TSVpFICsgRVRIX09WUkVIRUFEOworCXdiX2RhdGFbMV0gPSAwOworCVJFR19XUl9ETUFFKGJwLCBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfUlhfTUFYX1NJWkUsCisJCQl3Yl9kYXRhLCAyKTsKKworCS8qIHJ4IGNvbnRyb2wgc2V0IHRvIGRvbid0IHN0cmlwIGNyYyAqLworCXZhbCA9IDB4MTQ7CisJaWYgKHZhcnMtPmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9SWCkKKwkJdmFsIHw9IDB4MjA7CisJd2JfZGF0YVswXSA9IHZhbDsKKwl3Yl9kYXRhWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1JYX0NPTlRST0wsCisJCQl3Yl9kYXRhLCAyKTsKKworCS8qIHNldCB0eCBtdHUgKi8KKwl3Yl9kYXRhWzBdID0gRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRSArIEVUSF9PVlJFSEVBRDsKKwl3Yl9kYXRhWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1RYX01BWF9TSVpFLAorCQkJd2JfZGF0YSwgMik7CisKKwkvKiBzZXQgY250IG1heCBzaXplICovCisJd2JfZGF0YVswXSA9IEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUgKyBFVEhfT1ZSRUhFQUQ7CisJd2JfZGF0YVsxXSA9IDA7CisJUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9DTlRfTUFYX1NJWkUsCisJCSAgICB3Yl9kYXRhLCAyKTsKKworCS8qIGNvbmZpZ3VyZSBzYWZjICovCisJd2JfZGF0YVswXSA9IDB4MTAwMDIwMDsKKwl3Yl9kYXRhWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1JYX0xMRkNfTVNHX0ZMRFMsCisJCSAgICB3Yl9kYXRhLCAyKTsKKwkvKiBmaXggZm9yIGVtdWxhdGlvbiAqLworCWlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkgeworCQl3Yl9kYXRhWzBdID0gMHhmMDAwOworCQl3Yl9kYXRhWzFdID0gMDsKKwkJUkVHX1dSX0RNQUUoYnAsCisJCQkgICAgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1RYX1BBVVNFX1RIUkVTSE9MRCwKKwkJCSAgICB3Yl9kYXRhLCAyKTsKKwl9CisKKwlSRUdfV1IoYnAsIE5JR19SRUdfWEdYU19TRVJERVMwX01PREVfU0VMICsgcG9ydCo0LCAweDEpOworCVJFR19XUihicCwgTklHX1JFR19YR1hTX0xBTkVfU0VMX1AwICsgcG9ydCo0LCAweDApOworCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfUE9SVCArIHBvcnQqNCwgMHgwKTsKKwl2YWwgPSAwOworCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfVFgpCisJCXZhbCA9IDE7CisJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX1BBVVNFX09VVF9FTiArIHBvcnQqNCwgdmFsKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMHgwKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfRU1BQzBfSU5fRU4gKyBwb3J0KjQsIDB4MCk7CisJUkVHX1dSKGJwLCBOSUdfUkVHX0VNQUMwX1BBVVNFX09VVF9FTiArIHBvcnQqNCwgMHgwKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfQk1BQzBfSU5fRU4gKyBwb3J0KjQsIDB4MSk7CisJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX09VVF9FTiArIHBvcnQqNCwgMHgxKTsKKworCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfQk1BQzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfcGh5X2RlYXNzZXJ0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1OCBwaHlfZmxhZ3MpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIHZhbDsKKworCWlmIChwaHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfcGh5X2RlYXNzZXJ0OlhHWFNcbiIpOworCQl2YWwgPSBYR1hTX1JFU0VUX0JJVFM7CisKKwl9IGVsc2UgeyAvKiBTZXJEZXMgKi8KKwkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9waHlfZGVhc3NlcnQ6U2VyRGVzXG4iKTsKKwkJdmFsID0gU0VSREVTX1JFU0VUX0JJVFM7CisJfQorCisJdmFsID0gdmFsIDw8IChwYXJhbXMtPnBvcnQqMTYpOworCisJLyogcmVzZXQgYW5kIHVucmVzZXQgdGhlIFNlckRlcy9YR1hTICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19DTEVBUiwKKwkJICAgIHZhbCk7CisJdWRlbGF5KDUwMCk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19TRVQsCisJCSAgICB2YWwpOworCWJueDJ4X3NldF9waHlfbWRpbyhwYXJhbXMsIHBoeV9mbGFncyk7Cit9CisKK3ZvaWQgYm54MnhfbGlua19zdGF0dXNfdXBkYXRlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgICAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBsaW5rXzEwZzsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCisJaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSAgU1dJVENIX0NGR18xRykKKwkJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1NFUkRFU19GTEFHOworCWVsc2UKKwkJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1hHWFNfRkxBRzsKKwl2YXJzLT5saW5rX3N0YXR1cyA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCQkgICBwb3J0X21iW3BvcnRdLmxpbmtfc3RhdHVzKSk7CisKKwl2YXJzLT5saW5rX3VwID0gKHZhcnMtPmxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfTElOS19VUCk7CisKKwlpZiAodmFycy0+bGlua191cCkgeworCQlEUChORVRJRl9NU0dfTElOSywgInBoeSBsaW5rIHVwXG4iKTsKKworCQl2YXJzLT5waHlfbGlua191cCA9IDE7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQlzd2l0Y2ggKHZhcnMtPmxpbmtfc3RhdHVzICYKKwkJCQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF9NQVNLKSB7CisJCQljYXNlIExJTktfMTBUSEQ6CisJCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQkJLyogZmFsbCB0aHJ1ICovCisJCQljYXNlIExJTktfMTBURkQ6CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJCWJyZWFrOworCisJCQljYXNlIExJTktfMTAwVFhIRDoKKwkJCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCQkvKiBmYWxsIHRocnUgKi8KKwkJCWNhc2UgTElOS18xMDBUNDoKKwkJCWNhc2UgTElOS18xMDBUWEZEOgorCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTElOS18xMDAwVEhEOgorCQkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQkJCS8qIGZhbGwgdGhydSAqLworCQkJY2FzZSBMSU5LXzEwMDBURkQ6CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTElOS18yNTAwVEhEOgorCQkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQkJCS8qIGZhbGwgdGhydSAqLworCQkJY2FzZSBMSU5LXzI1MDBURkQ6CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzI1MDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTElOS18xMEdURkQ6CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQkJCWJyZWFrOworCisJCQljYXNlIExJTktfMTJHVEZEOgorCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMjAwMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBMSU5LXzEyXzVHVEZEOgorCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMjUwMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBMSU5LXzEzR1RGRDoKKwkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTMwMDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTElOS18xNUdURkQ6CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzE1MDAwOworCQkJCWJyZWFrOworCisJCQljYXNlIExJTktfMTZHVEZEOgorCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xNjAwMDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX1RYX0ZMT1dfQ09OVFJPTF9FTkFCTEVEKQorCQkJdmFycy0+Zmxvd19jdHJsIHw9IEJOWDJYX0ZMT1dfQ1RSTF9UWDsKKwkJZWxzZQorCQkJdmFycy0+Zmxvd19jdHJsICY9IH5CTlgyWF9GTE9XX0NUUkxfVFg7CisKKwkJaWYgKHZhcnMtPmxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfUlhfRkxPV19DT05UUk9MX0VOQUJMRUQpCisJCQl2YXJzLT5mbG93X2N0cmwgfD0gQk5YMlhfRkxPV19DVFJMX1JYOworCQllbHNlCisJCQl2YXJzLT5mbG93X2N0cmwgJj0gfkJOWDJYX0ZMT1dfQ1RSTF9SWDsKKworCQlpZiAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgJiYKKwkJCSAgICAoKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTApIHx8CisJCQkgICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMCkpKSB7CisJCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9TR01JSV9GTEFHOworCQkJfSBlbHNlIHsKKwkJCQl2YXJzLT5waHlfZmxhZ3MgJj0gflBIWV9TR01JSV9GTEFHOworCQkJfQorCQl9CisKKwkJLyogYW55dGhpbmcgMTAgYW5kIG92ZXIgdXNlcyB0aGUgYm1hYyAqLworCQlsaW5rXzEwZyA9ICgodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgfHwKKwkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMjAwMCkgfHwKKwkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMjUwMCkgfHwKKwkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMzAwMCkgfHwKKwkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xNTAwMCkgfHwKKwkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xNjAwMCkpOworCQlpZiAobGlua18xMGcpCisJCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0JNQUM7CisJCWVsc2UKKwkJCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfRU1BQzsKKworCX0gZWxzZSB7IC8qIGxpbmsgZG93biAqLworCQlEUChORVRJRl9NU0dfTElOSywgInBoeSBsaW5rIGRvd25cbiIpOworCisJCXZhcnMtPnBoeV9saW5rX3VwID0gMDsKKworCQl2YXJzLT5saW5lX3NwZWVkID0gMDsKKwkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOworCisJCS8qIGluZGljYXRlIG5vIG1hYyBhY3RpdmUgKi8KKwkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9OT05FOworCX0KKworCURQKE5FVElGX01TR19MSU5LLCAibGlua19zdGF0dXMgMHgleCAgcGh5X2xpbmtfdXAgJXhcbiIsCisJCSB2YXJzLT5saW5rX3N0YXR1cywgdmFycy0+cGh5X2xpbmtfdXApOworCURQKE5FVElGX01TR19MSU5LLCAibGluZV9zcGVlZCAleCAgZHVwbGV4ICV4ICBmbG93X2N0cmwgMHgleFxuIiwKKwkJIHZhcnMtPmxpbmVfc3BlZWQsIHZhcnMtPmR1cGxleCwgdmFycy0+Zmxvd19jdHJsKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfdXBkYXRlX21uZyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTMyIGxpbmtfc3RhdHVzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCisJUkVHX1dSKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJICAgIHBvcnRfbWJbcGFyYW1zLT5wb3J0XS5saW5rX3N0YXR1cyksCisJCQlsaW5rX3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2JtYWNfcnhfZGlzYWJsZShzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0KQoreworCXUzMiBibWFjX2FkZHIgPSBwb3J0ID8gTklHX1JFR19JTkdSRVNTX0JNQUMxX01FTSA6CisJCU5JR19SRUdfSU5HUkVTU19CTUFDMF9NRU07CisJdTMyIHdiX2RhdGFbMl07CisJdTMyIG5pZ19ibWFjX2VuYWJsZSA9IFJFR19SRChicCwgTklHX1JFR19CTUFDMF9SRUdTX09VVF9FTiArIHBvcnQqNCk7CisKKwkvKiBPbmx5IGlmIHRoZSBibWFjIGlzIG91dCBvZiByZXNldCAqLworCWlmIChSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKSAmCisJCQkoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpICYmCisJICAgIG5pZ19ibWFjX2VuYWJsZSkgeworCisJCS8qIENsZWFyIFJ4IEVuYWJsZSBiaXQgaW4gQk1BQ19DT05UUk9MIHJlZ2lzdGVyICovCisJCVJFR19SRF9ETUFFKGJwLCBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfQk1BQ19DT05UUk9MLAorCQkJICAgIHdiX2RhdGEsIDIpOworCQl3Yl9kYXRhWzBdICY9IH5CTUFDX0NPTlRST0xfUlhfRU5BQkxFOworCQlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX0JNQUNfQ09OVFJPTCwKKwkJCSAgICB3Yl9kYXRhLCAyKTsKKworCQltc2xlZXAoMSk7CisJfQorfQorCitzdGF0aWMgdTggYm54MnhfcGJmX3VwZGF0ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTMyIGZsb3dfY3RybCwKKwkJCSB1MzIgbGluZV9zcGVlZCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBpbml0X2NyZCwgY3JkOworCXUzMiBjb3VudCA9IDEwMDA7CisKKwkvKiBkaXNhYmxlIHBvcnQgKi8KKwlSRUdfV1IoYnAsIFBCRl9SRUdfRElTQUJMRV9ORVdfVEFTS19QUk9DX1AwICsgcG9ydCo0LCAweDEpOworCisJLyogd2FpdCBmb3IgaW5pdCBjcmVkaXQgKi8KKwlpbml0X2NyZCA9IFJFR19SRChicCwgUEJGX1JFR19QMF9JTklUX0NSRCArIHBvcnQqNCk7CisJY3JkID0gUkVHX1JEKGJwLCBQQkZfUkVHX1AwX0NSRURJVCArIHBvcnQqOCk7CisJRFAoTkVUSUZfTVNHX0xJTkssICJpbml0X2NyZCAweCV4ICBjcmQgMHgleFxuIiwgaW5pdF9jcmQsIGNyZCk7CisKKwl3aGlsZSAoKGluaXRfY3JkICE9IGNyZCkgJiYgY291bnQpIHsKKwkJbXNsZWVwKDUpOworCisJCWNyZCA9IFJFR19SRChicCwgUEJGX1JFR19QMF9DUkVESVQgKyBwb3J0KjgpOworCQljb3VudC0tOworCX0KKwljcmQgPSBSRUdfUkQoYnAsIFBCRl9SRUdfUDBfQ1JFRElUICsgcG9ydCo4KTsKKwlpZiAoaW5pdF9jcmQgIT0gY3JkKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiQlVHISBpbml0X2NyZCAweCV4ICE9IGNyZCAweCV4XG4iLAorCQkJICBpbml0X2NyZCwgY3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9SWCB8fAorCSAgICBsaW5lX3NwZWVkID09IFNQRUVEXzEwIHx8CisJICAgIGxpbmVfc3BlZWQgPT0gU1BFRURfMTAwIHx8CisJICAgIGxpbmVfc3BlZWQgPT0gU1BFRURfMTAwMCB8fAorCSAgICBsaW5lX3NwZWVkID09IFNQRUVEXzI1MDApIHsKKwkJUkVHX1dSKGJwLCBQQkZfUkVHX1AwX1BBVVNFX0VOQUJMRSArIHBvcnQqNCwgMSk7CisJCS8qIHVwZGF0ZSB0aHJlc2hvbGQgKi8KKwkJUkVHX1dSKGJwLCBQQkZfUkVHX1AwX0FSQl9USFJTSCArIHBvcnQqNCwgMCk7CisJCS8qIHVwZGF0ZSBpbml0IGNyZWRpdCAqLworCQlpbml0X2NyZCA9IDc3ODsgCS8qICg4MDAtMTgtNCkgKi8KKworCX0gZWxzZSB7CisJCXUzMiB0aHJlc2ggPSAoRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRSArCisJCQkgICAgICBFVEhfT1ZSRUhFQUQpLzE2OworCQlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfUEFVU0VfRU5BQkxFICsgcG9ydCo0LCAwKTsKKwkJLyogdXBkYXRlIHRocmVzaG9sZCAqLworCQlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfQVJCX1RIUlNIICsgcG9ydCo0LCB0aHJlc2gpOworCQkvKiB1cGRhdGUgaW5pdCBjcmVkaXQgKi8KKwkJc3dpdGNoIChsaW5lX3NwZWVkKSB7CisJCWNhc2UgU1BFRURfMTAwMDA6CisJCQlpbml0X2NyZCA9IHRocmVzaCArIDU1MyAtIDIyOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVFRF8xMjAwMDoKKwkJCWluaXRfY3JkID0gdGhyZXNoICsgNjY0IC0gMjI7CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEzMDAwOgorCQkJaW5pdF9jcmQgPSB0aHJlc2ggKyA3NDIgLSAyMjsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTYwMDA6CisJCQlpbml0X2NyZCA9IHRocmVzaCArIDc3OCAtIDIyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUChORVRJRl9NU0dfTElOSywgIkludmFsaWQgbGluZV9zcGVlZCAweCV4XG4iLAorCQkJCSAgbGluZV9zcGVlZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfSU5JVF9DUkQgKyBwb3J0KjQsIGluaXRfY3JkKTsKKwlEUChORVRJRl9NU0dfTElOSywgIlBCRiB1cGRhdGVkIHRvIHNwZWVkICVkIGNyZWRpdCAlZFxuIiwKKwkJIGxpbmVfc3BlZWQsIGluaXRfY3JkKTsKKworCS8qIHByb2JlIHRoZSBjcmVkaXQgY2hhbmdlcyAqLworCVJFR19XUihicCwgUEJGX1JFR19JTklUX1AwICsgcG9ydCo0LCAweDEpOworCW1zbGVlcCg1KTsKKwlSRUdfV1IoYnAsIFBCRl9SRUdfSU5JVF9QMCArIHBvcnQqNCwgMHgwKTsKKworCS8qIGVuYWJsZSBwb3J0ICovCisJUkVHX1dSKGJwLCBQQkZfUkVHX0RJU0FCTEVfTkVXX1RBU0tfUFJPQ19QMCArIHBvcnQqNCwgMHgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBibngyeF9nZXRfZW1hY19iYXNlKHN0cnVjdCBibngyeCAqYnAsIHUzMiBleHRfcGh5X3R5cGUsIHU4IHBvcnQpCit7CisJdTMyIGVtYWNfYmFzZTsKKworCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyOgorCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJCS8qIEFsbCBNREMvTURJTyBpcyBkaXJlY3RlZCB0aHJvdWdoIHNpbmdsZSBFTUFDICovCisJCWlmIChSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKSkKKwkJCWVtYWNfYmFzZSA9IEdSQ0JBU0VfRU1BQzA7CisJCWVsc2UKKwkJCWVtYWNfYmFzZSA9IEdSQ0JBU0VfRU1BQzE7CisJCWJyZWFrOworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKKwkJZW1hY19iYXNlID0gKHBvcnQpID8gR1JDQkFTRV9FTUFDMCA6IEdSQ0JBU0VfRU1BQzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVtYWNfYmFzZSA9IChwb3J0KSA/IEdSQ0JBU0VfRU1BQzEgOiBHUkNCQVNFX0VNQUMwOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVtYWNfYmFzZTsKKworfQorCit1OCBibngyeF9jbDQ1X3dyaXRlKHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsIHUzMiBleHRfcGh5X3R5cGUsCisJCSAgdTggcGh5X2FkZHIsIHU4IGRldmFkLCB1MTYgcmVnLCB1MTYgdmFsKQoreworCXUzMiB0bXAsIHNhdmVkX21vZGU7CisJdTggaSwgcmMgPSAwOworCXUzMiBtZGlvX2N0cmwgPSBibngyeF9nZXRfZW1hY19iYXNlKGJwLCBleHRfcGh5X3R5cGUsIHBvcnQpOworCisJLyogc2V0IGNsYXVzZSA0NSBtb2RlLCBzbG93IGRvd24gdGhlIE1ESU8gY2xvY2sgdG8gMi41TUh6CisJICogKGEgdmFsdWUgb2YgNDk9PTB4MzEpIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgQVVUTyBwb2xsIGlzIG9mZgorCSAqLworCisJc2F2ZWRfbW9kZSA9IFJFR19SRChicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUpOworCXRtcCA9IHNhdmVkX21vZGUgJiB+KEVNQUNfTURJT19NT0RFX0FVVE9fUE9MTCB8CisJCQkgICAgIEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVCk7CisJdG1wIHw9IChFTUFDX01ESU9fTU9ERV9DTEFVU0VfNDUgfAorCQkoNDkgPDwgRU1BQ19NRElPX01PREVfQ0xPQ0tfQ05UX0JJVFNISUZUKSk7CisJUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSwgdG1wKTsKKwlSRUdfUkQoYnAsIG1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKKwl1ZGVsYXkoNDApOworCisJLyogYWRkcmVzcyAqLworCisJdG1wID0gKChwaHlfYWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgcmVnIHwKKwkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTIHwKKwkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7CisJUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdG1wKTsKKworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisKKwkJdG1wID0gUkVHX1JEKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSk7CisJCWlmICghKHRtcCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7CisJCQl1ZGVsYXkoNSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAodG1wICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkgeworCQlEUChORVRJRl9NU0dfTElOSywgIndyaXRlIHBoeSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlyYyA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJLyogZGF0YSAqLworCQl0bXAgPSAoKHBoeV9hZGRyIDw8IDIxKSB8IChkZXZhZCA8PCAxNikgfCB2YWwgfAorCQkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9XUklURV80NSB8CisJCSAgICAgICBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKTsKKwkJUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdG1wKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKworCQkJdG1wID0gUkVHX1JEKGJwLCBtZGlvX2N0cmwgKworCQkJCQkgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0pOworCQkJaWYgKCEodG1wICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkpIHsKKwkJCQl1ZGVsYXkoNSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHRtcCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAid3JpdGUgcGh5IHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwl9CisKKwkvKiBSZXN0b3JlIHRoZSBzYXZlZCBtb2RlICovCisJUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSwgc2F2ZWRfbW9kZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3U4IGJueDJ4X2NsNDVfcmVhZChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LCB1MzIgZXh0X3BoeV90eXBlLAorCQkgdTggcGh5X2FkZHIsIHU4IGRldmFkLCB1MTYgcmVnLCB1MTYgKnJldF92YWwpCit7CisJdTMyIHZhbCwgc2F2ZWRfbW9kZTsKKwl1MTYgaTsKKwl1OCByYyA9IDA7CisKKwl1MzIgbWRpb19jdHJsID0gYm54MnhfZ2V0X2VtYWNfYmFzZShicCwgZXh0X3BoeV90eXBlLCBwb3J0KTsKKwkvKiBzZXQgY2xhdXNlIDQ1IG1vZGUsIHNsb3cgZG93biB0aGUgTURJTyBjbG9jayB0byAyLjVNSHoKKwkgKiAoYSB2YWx1ZSBvZiA0OT09MHgzMSkgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBBVVRPIHBvbGwgaXMgb2ZmCisJICovCisKKwlzYXZlZF9tb2RlID0gUkVHX1JEKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJdmFsID0gc2F2ZWRfbW9kZSAmICgoRU1BQ19NRElPX01PREVfQVVUT19QT0xMIHwKKwkJCSAgICAgRU1BQ19NRElPX01PREVfQ0xPQ0tfQ05UKSk7CisJdmFsIHw9IChFTUFDX01ESU9fTU9ERV9DTEFVU0VfNDUgfAorCQkoNDlMIDw8IEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9CSVRTSElGVCkpOworCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHZhbCk7CisJUkVHX1JEKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJdWRlbGF5KDQwKTsKKworCS8qIGFkZHJlc3MgKi8KKwl2YWwgPSAoKHBoeV9hZGRyIDw8IDIxKSB8IChkZXZhZCA8PCAxNikgfCByZWcgfAorCSAgICAgICBFTUFDX01ESU9fQ09NTV9DT01NQU5EX0FERFJFU1MgfAorCSAgICAgICBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKTsKKwlSRUdfV1IoYnAsIG1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19DT01NLCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKworCQl2YWwgPSBSRUdfUkQoYnAsIG1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19DT01NKTsKKwkJaWYgKCEodmFsICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkpIHsKKwkJCXVkZWxheSg1KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh2YWwgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAicmVhZCBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKworCQkqcmV0X3ZhbCA9IDA7CisJCXJjID0gLUVGQVVMVDsKKworCX0gZWxzZSB7CisJCS8qIGRhdGEgKi8KKwkJdmFsID0gKChwaHlfYWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwKKwkJICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfUkVBRF80NSB8CisJCSAgICAgICBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKTsKKwkJUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdmFsKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKworCQkJdmFsID0gUkVHX1JEKGJwLCBtZGlvX2N0cmwgKworCQkJCQkgIEVNQUNfUkVHX0VNQUNfTURJT19DT01NKTsKKwkJCWlmICghKHZhbCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7CisJCQkJKnJldF92YWwgPSAodTE2KSh2YWwgJiBFTUFDX01ESU9fQ09NTV9EQVRBKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmFsICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJyZWFkIHBoeSByZWdpc3RlciBmYWlsZWRcbiIpOworCisJCQkqcmV0X3ZhbCA9IDA7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwl9CisKKwkvKiBSZXN0b3JlIHRoZSBzYXZlZCBtb2RlICovCisJUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSwgc2F2ZWRfbW9kZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9hZXJfbW1kKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgICAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgc2VyX2xhbmU7CisJdTE2IG9mZnNldDsKKworCXNlcl9sYW5lID0gKChwYXJhbXMtPmxhbmVfY29uZmlnICYKKwkJICAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9NQVNLKSA+PgorCQkgICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKKworCW9mZnNldCA9ICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSA/CisJCShwYXJhbXMtPnBoeV9hZGRyICsgc2VyX2xhbmUpIDogMDsKKworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19BRVJfQkxPQ0ssCisJCQkgICAgICBNRElPX0FFUl9CTE9DS19BRVJfUkVHLCAweDM4MDAgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfbWFzdGVyX2xuKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiBuZXdfbWFzdGVyX2xuLCBzZXJfbGFuZTsKKwlzZXJfbGFuZSA9ICAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgorCQkgICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX01BU0spID4+CisJCSAgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfU0hJRlQpOworCisJLyogc2V0IHRoZSBtYXN0ZXJfbG4gZm9yIEFOICovCisJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX1hHWFNfQkxPQ0syLAorCQkJICAgICAgTURJT19YR1hTX0JMT0NLMl9URVNUX01PREVfTEFORSwKKwkJCSAgICAgICZuZXdfbWFzdGVyX2xuKTsKKworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiAsCisJCQkgICAgICBNRElPX1hHWFNfQkxPQ0syX1RFU1RfTU9ERV9MQU5FLAorCQkJICAgICAgKG5ld19tYXN0ZXJfbG4gfCBzZXJfbGFuZSkpOworfQorCitzdGF0aWMgdTggYm54MnhfcmVzZXRfdW5pY29yZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgbWlpX2NvbnRyb2w7CisJdTE2IGk7CisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCisJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLCAmbWlpX2NvbnRyb2wpOworCisJLyogcmVzZXQgdGhlIHVuaWNvcmUgKi8KKwlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCisJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAorCQkJICAgICAgKG1paV9jb250cm9sIHwKKwkJCSAgICAgICBNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfUkVTRVQpKTsKKwlpZiAocGFyYW1zLT5zd2l0Y2hfY2ZnID09IFNXSVRDSF9DRkdfMUcpCisJCWJueDJ4X3NldF9zZXJkZXNfYWNjZXNzKHBhcmFtcyk7CisKKwkvKiB3YWl0IGZvciB0aGUgcmVzZXQgdG8gc2VsZiBjbGVhciAqLworCWZvciAoaSA9IDA7IGkgPCBNRElPX0FDQ0VTU19USU1FT1VUOyBpKyspIHsKKwkJdWRlbGF5KDUpOworCisJCS8qIHRoZSByZXNldCBlcmFzZWQgdGhlIHByZXZpb3VzIGJhbmsgdmFsdWUgKi8KKwkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKKwkJCSAgICAgIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsCisJCQkgICAgICAmbWlpX2NvbnRyb2wpOworCisJCWlmICghKG1paV9jb250cm9sICYgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX1JFU0VUKSkgeworCQkJdWRlbGF5KDUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlEUChORVRJRl9NU0dfTElOSywgIkJVRyEgWEdYUyBpcyBzdGlsbCBpbiByZXNldCFcbiIpOworCXJldHVybiAtRUlOVkFMOworCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9zd2FwX2xhbmVzKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCS8qIEVhY2ggdHdvIGJpdHMgcmVwcmVzZW50cyBhIGxhbmUgbnVtYmVyOgorCSAgIE5vIHN3YXAgaXMgMDEyMyA9PiAweDFiIG5vIG5lZWQgdG8gZW5hYmxlIHRoZSBzd2FwICovCisJdTE2IHNlcl9sYW5lLCByeF9sYW5lX3N3YXAsIHR4X2xhbmVfc3dhcDsKKworCXNlcl9sYW5lID0gKChwYXJhbXMtPmxhbmVfY29uZmlnICYKKwkJCSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9NQVNLKSA+PgorCQkJUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfU0hJRlQpOworCXJ4X2xhbmVfc3dhcCA9ICgocGFyYW1zLT5sYW5lX2NvbmZpZyAmCisJCQkgICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfUlhfTUFTSykgPj4KKwkJCSAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1JYX1NISUZUKTsKKwl0eF9sYW5lX3N3YXAgPSAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgorCQkJICAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1RYX01BU0spID4+CisJCQkgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19UWF9TSElGVCk7CisKKwlpZiAocnhfbGFuZV9zd2FwICE9IDB4MWIpIHsKKwkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJCSAgICBNRElPX1JFR19CQU5LX1hHWFNfQkxPQ0syLAorCQkJCSAgICBNRElPX1hHWFNfQkxPQ0syX1JYX0xOX1NXQVAsCisJCQkJICAgIChyeF9sYW5lX3N3YXAgfAorCQkJCSAgICBNRElPX1hHWFNfQkxPQ0syX1JYX0xOX1NXQVBfRU5BQkxFIHwKKwkJCQkgICAgTURJT19YR1hTX0JMT0NLMl9SWF9MTl9TV0FQX0ZPUkNFX0VOQUJMRSkpOworCX0gZWxzZSB7CisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1JFR19CQU5LX1hHWFNfQkxPQ0syLAorCQkJCSAgICAgIE1ESU9fWEdYU19CTE9DSzJfUlhfTE5fU1dBUCwgMCk7CisJfQorCisJaWYgKHR4X2xhbmVfc3dhcCAhPSAweDFiKSB7CisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1JFR19CQU5LX1hHWFNfQkxPQ0syLAorCQkJCSAgICAgIE1ESU9fWEdYU19CTE9DSzJfVFhfTE5fU1dBUCwKKwkJCQkgICAgICAodHhfbGFuZV9zd2FwIHwKKwkJCQkgICAgICAgTURJT19YR1hTX0JMT0NLMl9UWF9MTl9TV0FQX0VOQUJMRSkpOworCX0gZWxzZSB7CisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1JFR19CQU5LX1hHWFNfQkxPQ0syLAorCQkJCSAgICAgIE1ESU9fWEdYU19CTE9DSzJfVFhfTE5fU1dBUCwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfcGFyYWxsZWxfZGV0ZWN0aW9uKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgICB1OCAgICAgICAJIHBoeV9mbGFncykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgY29udHJvbDI7CisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCisJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDIsCisJCQkgICAgICAmY29udHJvbDIpOworCWlmIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykKKwkJY29udHJvbDIgfD0gTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wyX1BSTF9EVF9FTjsKKwllbHNlCisJCWNvbnRyb2wyICY9IH5NRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDJfUFJMX0RUX0VOOworCURQKE5FVElGX01TR19MSU5LLCAicGFyYW1zLT5zcGVlZF9jYXBfbWFzayA9IDB4JXgsIGNvbnRyb2wyID0gMHgleFxuIiwKKwkJcGFyYW1zLT5zcGVlZF9jYXBfbWFzaywgY29udHJvbDIpOworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19TRVJERVNfRElHSVRBTCwKKwkJCSAgICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMiwKKwkJCSAgICAgIGNvbnRyb2wyKTsKKworCWlmICgocGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgJiYKKwkgICAgIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYKKwkJICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBHKSkgeworCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFNcbiIpOworCisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQlNRElPX1JFR19CQU5LXzEwR19QQVJBTExFTF9ERVRFQ1QsCisJCQkJTURJT18xMEdfUEFSQUxMRUxfREVURUNUX1BBUl9ERVRfMTBHX0xJTkssCisJCQkJTURJT18xMEdfUEFSQUxMRUxfREVURUNUX1BBUl9ERVRfMTBHX0xJTktfQ05UKTsKKworCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJTURJT19SRUdfQkFOS18xMEdfUEFSQUxMRUxfREVURUNULAorCQkJCU1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19DT05UUk9MLAorCQkJCSZjb250cm9sMik7CisKKworCQljb250cm9sMiB8PQorCQkgICAgTURJT18xMEdfUEFSQUxMRUxfREVURUNUX1BBUl9ERVRfMTBHX0NPTlRST0xfUEFSREVUMTBHX0VOOworCisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQlNRElPX1JFR19CQU5LXzEwR19QQVJBTExFTF9ERVRFQ1QsCisJCQkJTURJT18xMEdfUEFSQUxMRUxfREVURUNUX1BBUl9ERVRfMTBHX0NPTlRST0wsCisJCQkJY29udHJvbDIpOworCisJCS8qIERpc2FibGUgcGFyYWxsZWwgZGV0ZWN0aW9uIG9mIEhpRyAqLworCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiwKKwkJCQlNRElPX1hHWFNfQkxPQ0syX1VOSUNPUkVfTU9ERV8xMEcsCisJCQkJTURJT19YR1hTX0JMT0NLMl9VTklDT1JFX01PREVfMTBHX0NYNF9YR1hTIHwKKwkJCQlNRElPX1hHWFNfQkxPQ0syX1VOSUNPUkVfTU9ERV8xMEdfSElHSUdfWEdYUyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfYXV0b25lZyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJICAgIHU4IGVuYWJsZV9jbDczKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiByZWdfdmFsOworCisJLyogQ0wzNyBBdXRvbmVnICovCisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCisJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLCAmcmVnX3ZhbCk7CisKKwkvKiBDTDM3IEF1dG9uZWcgRW5hYmxlZCAqLworCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKQorCQlyZWdfdmFsIHw9IE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9BTl9FTjsKKwllbHNlIC8qIENMMzcgQXV0b25lZyBEaXNhYmxlZCAqLworCQlyZWdfdmFsICY9IH4oTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0FOX0VOIHwKKwkJCSAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX1JFU1RBUlRfQU4pOworCisJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAorCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwgcmVnX3ZhbCk7CisKKwkvKiBFbmFibGUvRGlzYWJsZSBBdXRvZGV0ZWN0aW9uICovCisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCisJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDEsICZyZWdfdmFsKTsKKwlyZWdfdmFsICY9IH4oTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX1NJR05BTF9ERVRFQ1RfRU4gfAorCQkgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0lOVkVSVF9TSUdOQUxfREVURUNUKTsKKwlyZWdfdmFsIHw9IE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9GSUJFUl9NT0RFOworCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKQorCQlyZWdfdmFsIHw9IE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9BVVRPREVUOworCWVsc2UKKwkJcmVnX3ZhbCAmPSB+TURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0FVVE9ERVQ7CisKKwlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCisJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDEsIHJlZ192YWwpOworCisJLyogRW5hYmxlIFRldG9uSUkgYW5kIEJBTSBhdXRvbmVnICovCisJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX0JBTV9ORVhUX1BBR0UsCisJCQkgICAgICBNRElPX0JBTV9ORVhUX1BBR0VfTVA1X05FWFRfUEFHRV9DVFJMLAorCQkJICAmcmVnX3ZhbCk7CisJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpIHsKKwkJLyogRW5hYmxlIEJBTSBhbmVnIE1vZGUgYW5kIFRldG9uSUkgYW5lZyBNb2RlICovCisJCXJlZ192YWwgfD0gKE1ESU9fQkFNX05FWFRfUEFHRV9NUDVfTkVYVF9QQUdFX0NUUkxfQkFNX01PREUgfAorCQkJICAgIE1ESU9fQkFNX05FWFRfUEFHRV9NUDVfTkVYVF9QQUdFX0NUUkxfVEVUT05fQU4pOworCX0gZWxzZSB7CisJCS8qIFRldG9uSUkgYW5kIEJBTSBBdXRvbmVnIERpc2FibGVkICovCisJCXJlZ192YWwgJj0gfihNRElPX0JBTV9ORVhUX1BBR0VfTVA1X05FWFRfUEFHRV9DVFJMX0JBTV9NT0RFIHwKKwkJCSAgICAgTURJT19CQU1fTkVYVF9QQUdFX01QNV9ORVhUX1BBR0VfQ1RSTF9URVRPTl9BTik7CisJfQorCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19CQU1fTkVYVF9QQUdFLAorCQkJICAgICAgTURJT19CQU1fTkVYVF9QQUdFX01QNV9ORVhUX1BBR0VfQ1RSTCwKKwkJCSAgICAgIHJlZ192YWwpOworCisJaWYgKGVuYWJsZV9jbDczKSB7CisJCS8qIEVuYWJsZSBDbDczIEZTTSBzdGF0dXMgYml0cyAqLworCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX1VTRVJCMCwKKwkJCQkgICAgTURJT19DTDczX1VTRVJCMF9DTDczX1VDVFJMLAorCQkJCSAgICAgIDB4ZSk7CisKKwkJLyogRW5hYmxlIEJBTSBTdGF0aW9uIE1hbmFnZXIqLworCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJcGFyYW1zLT5waHlfYWRkciwKKwkJCU1ESU9fUkVHX0JBTktfQ0w3M19VU0VSQjAsCisJCQlNRElPX0NMNzNfVVNFUkIwX0NMNzNfQkFNX0NUUkwxLAorCQkJTURJT19DTDczX1VTRVJCMF9DTDczX0JBTV9DVFJMMV9CQU1fRU4gfAorCQkJTURJT19DTDczX1VTRVJCMF9DTDczX0JBTV9DVFJMMV9CQU1fU1RBVElPTl9NTkdSX0VOIHwKKwkJCU1ESU9fQ0w3M19VU0VSQjBfQ0w3M19CQU1fQ1RSTDFfQkFNX05QX0FGVEVSX0JQX0VOKTsKKworCQkvKiBBZHZlcnRpc2UgQ0w3MyBsaW5rIHNwZWVkcyAqLworCQkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMSwKKwkJCQkJICAgICAgTURJT19DTDczX0lFRUVCMV9BTl9BRFYyLAorCQkJCQkgICAgICAmcmVnX3ZhbCk7CisJCWlmIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYKKwkJICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBHKQorCQkJcmVnX3ZhbCB8PSBNRElPX0NMNzNfSUVFRUIxX0FOX0FEVjJfQURWUl8xMEdfS1g0OworCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCisJCSAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHKQorCQkJcmVnX3ZhbCB8PSBNRElPX0NMNzNfSUVFRUIxX0FOX0FEVjJfQURWUl8xMDAwTV9LWDsKKworCQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMSwKKwkJCQkJICAgICAgTURJT19DTDczX0lFRUVCMV9BTl9BRFYyLAorCQkJCSAgICAgIHJlZ192YWwpOworCisJCS8qIENMNzMgQXV0b25lZyBFbmFibGVkICovCisJCXJlZ192YWwgPSBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTF9BTl9FTjsKKworCX0gZWxzZSAvKiBDTDczIEF1dG9uZWcgRGlzYWJsZWQgKi8KKwkJcmVnX3ZhbCA9IDA7CisKKwlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjAsCisJCQkgICAgICBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCwgcmVnX3ZhbCk7Cit9CisKKy8qIHByb2dyYW0gU2VyRGVzLCBmb3JjZWQgc3BlZWQgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3Byb2dyYW1fc2VyZGVzKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHJlZ192YWw7CisKKwkvKiBwcm9ncmFtIGR1cGxleCwgZGlzYWJsZSBhdXRvbmVnIGFuZCBzZ21paSovCisJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAorCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwgJnJlZ192YWwpOworCXJlZ192YWwgJj0gfihNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfRlVMTF9EVVBMRVggfAorCQkgICAgIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9BTl9FTiB8CisJCSAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX01BTl9TR01JSV9TUF9NQVNLKTsKKwlpZiAocGFyYW1zLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQlyZWdfdmFsIHw9IE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9GVUxMX0RVUExFWDsKKwlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCisJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLCByZWdfdmFsKTsKKworCS8qIHByb2dyYW0gc3BlZWQKKwkgICAtIG5lZWRlZCBvbmx5IGlmIHRoZSBzcGVlZCBpcyBncmVhdGVyIHRoYW4gMUcgKDIuNUcgb3IgMTBHKSAqLworCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAorCQkJCSAgICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfTUlTQzEsICZyZWdfdmFsKTsKKwkvKiBjbGVhcmluZyB0aGUgc3BlZWQgdmFsdWUgYmVmb3JlIHNldHRpbmcgdGhlIHJpZ2h0IHNwZWVkICovCisJRFAoTkVUSUZfTVNHX0xJTkssICJNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMID0gMHgleFxuIiwgcmVnX3ZhbCk7CisKKwlyZWdfdmFsICY9IH4oTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF9NQVNLIHwKKwkJICAgICBNRElPX1NFUkRFU19ESUdJVEFMX01JU0MxX0ZPUkNFX1NQRUVEX1NFTCk7CisKKwlpZiAoISgodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSB8fAorCSAgICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMCkgfHwKKwkgICAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMCkpKSB7CisKKwkJcmVnX3ZhbCB8PSAoTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9SRUZDTEtfU0VMXzE1Nl8yNU0gfAorCQkJICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfTUlTQzFfRk9SQ0VfU1BFRURfU0VMKTsKKwkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTAwMDApCisJCQlyZWdfdmFsIHw9CisJCQkJTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF8xMEdfQ1g0OworCQlpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMzAwMCkKKwkJCXJlZ192YWwgfD0KKwkJCQlNRElPX1NFUkRFU19ESUdJVEFMX01JU0MxX0ZPUkNFX1NQRUVEXzEzRzsKKwl9CisKKwlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgTURJT19SRUdfQkFOS19TRVJERVNfRElHSVRBTCwKKwkJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX01JU0MxLCByZWdfdmFsKTsKKworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfYnJjbV9jbDM3X2FkdmVydGlzbWVudChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgdmFsID0gMDsKKworCS8qIGNvbmZpZ3VyZSB0aGUgNDggYml0cyBmb3IgQkFNIEFOICovCisKKwkvKiBzZXQgZXh0ZW5kZWQgY2FwYWJpbGl0aWVzICovCisJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJiBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzJfNUcpCisJCXZhbCB8PSBNRElPX09WRVJfMUdfVVAxXzJfNUc7CisJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJiBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwRykKKwkJdmFsIHw9IE1ESU9fT1ZFUl8xR19VUDFfMTBHOworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19PVkVSXzFHLAorCQkJICAgICAgTURJT19PVkVSXzFHX1VQMSwgdmFsKTsKKworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19PVkVSXzFHLAorCQkJICAgICAgTURJT19PVkVSXzFHX1VQMywgMHg0MDApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9jYWxjX2llZWVfYW5lZ19hZHYoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUxNiAqaWVlZV9mYykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwkqaWVlZV9mYyA9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX0ZVTExfRFVQTEVYOworCS8qIHJlc29sdmUgcGF1c2UgbW9kZSBhbmQgYWR2ZXJ0aXNlbWVudAorCSAqIFBsZWFzZSByZWZlciB0byBUYWJsZSAyOEItMyBvZiB0aGUgODAyLjNhYi0xOTk5IHNwZWMgKi8KKworCXN3aXRjaCAocGFyYW1zLT5yZXFfZmxvd19jdHJsKSB7CisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfQVVUTzoKKwkJaWYgKHBhcmFtcy0+cmVxX2ZjX2F1dG9fYWR2ID09IEJOWDJYX0ZMT1dfQ1RSTF9CT1RIKSB7CisJCQkqaWVlZV9mYyB8PQorCQkJICAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIOworCQl9IGVsc2UgeworCQkJKmllZWVfZmMgfD0KKwkJICAgICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfVFg6CisJCSppZWVlX2ZjIHw9CisJCSAgICAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOworCQlicmVhazsKKworCWNhc2UgQk5YMlhfRkxPV19DVFJMX1JYOgorCWNhc2UgQk5YMlhfRkxPV19DVFJMX0JPVEg6CisJCSppZWVlX2ZjIHw9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEg7CisJCWJyZWFrOworCisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfTk9ORToKKwlkZWZhdWx0OgorCQkqaWVlZV9mYyB8PSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9OT05FOworCQlicmVhazsKKwl9CisJRFAoTkVUSUZfTVNHX0xJTkssICJpZWVlX2ZjID0gMHgleFxuIiwgKmllZWVfZmMpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzbWVudChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICAgdTE2IGllZWVfZmMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHZhbDsKKwkvKiBmb3IgQU4sIHdlIGFyZSBhbHdheXMgcHVibGlzaGluZyBmdWxsIGR1cGxleCAqLworCisJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAorCQkJICAgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFYsIGllZWVfZmMpOworCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMSwKKwkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMSwgJnZhbCk7CisJdmFsICY9IH5NRElPX0NMNzNfSUVFRUIxX0FOX0FEVjFfUEFVU0VfQk9USDsKKwl2YWwgfD0gKChpZWVlX2ZjPDwzKSAmIE1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMV9QQVVTRV9NQVNLKTsKKwlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjEsCisJCQkgICAgICBNRElPX0NMNzNfSUVFRUIxX0FOX0FEVjEsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3Jlc3RhcnRfYXV0b25lZyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggZW5hYmxlX2NsNzMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IG1paV9jb250cm9sOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9yZXN0YXJ0X2F1dG9uZWdcbiIpOworCS8qIEVuYWJsZSBhbmQgcmVzdGFydCBCQU0vQ0wzNyBhbmVnICovCisKKwlpZiAoZW5hYmxlX2NsNzMpIHsKKwkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjAsCisJCQkJICAgICAgTURJT19DTDczX0lFRUVCMF9DTDczX0FOX0NPTlRST0wsCisJCQkJICAgICAgJm1paV9jb250cm9sKTsKKworCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCXBhcmFtcy0+cGh5X2FkZHIsCisJCQkJTURJT19SRUdfQkFOS19DTDczX0lFRUVCMCwKKwkJCQlNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCwKKwkJCQkobWlpX2NvbnRyb2wgfAorCQkJCU1ESU9fQ0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MX0FOX0VOIHwKKwkJCQlNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTF9SRVNUQVJUX0FOKSk7CisJfSBlbHNlIHsKKworCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKKwkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAorCQkJCSAgICAgICZtaWlfY29udHJvbCk7CisJCURQKE5FVElGX01TR19MSU5LLAorCQkJICJibngyeF9yZXN0YXJ0X2F1dG9uZWcgbWlpX2NvbnRyb2wgYmVmb3JlID0gMHgleFxuIiwKKwkJCSBtaWlfY29udHJvbCk7CisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAorCQkJCSAgICAgIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsCisJCQkJICAgICAgKG1paV9jb250cm9sIHwKKwkJCQkgICAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0FOX0VOIHwKKwkJCQkgICAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX1JFU1RBUlRfQU4pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRpYWxpemVfc2dtaWlfcHJvY2VzcyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IGNvbnRyb2wxOworCisJLyogaW4gU0dNSUkgbW9kZSwgdGhlIHVuaWNvcmUgaXMgYWx3YXlzIHNsYXZlICovCisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCisJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDEsCisJCSAgICAgICZjb250cm9sMSk7CisJY29udHJvbDEgfD0gTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0lOVkVSVF9TSUdOQUxfREVURUNUOworCS8qIHNldCBzZ21paSBtb2RlIChhbmQgbm90IGZpYmVyKSAqLworCWNvbnRyb2wxICY9IH4oTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0ZJQkVSX01PREUgfAorCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDFfQVVUT0RFVCB8CisJCSAgICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9NU1RSX01PREUpOworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19TRVJERVNfRElHSVRBTCwKKwkJCSAgICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMSwKKwkJCSAgICAgIGNvbnRyb2wxKTsKKworCS8qIGlmIGZvcmNlZCBzcGVlZCAqLworCWlmICghKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpKSB7CisJCS8qIHNldCBzcGVlZCwgZGlzYWJsZSBhdXRvbmVnICovCisJCXUxNiBtaWlfY29udHJvbDsKKworCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKKwkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAorCQkJCSAgICAgICZtaWlfY29udHJvbCk7CisJCW1paV9jb250cm9sICY9IH4oTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0FOX0VOIHwKKwkJCQkgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX01BTl9TR01JSV9TUF9NQVNLfAorCQkJCSBNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfRlVMTF9EVVBMRVgpOworCisJCXN3aXRjaCAodmFycy0+bGluZV9zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwMDoKKwkJCW1paV9jb250cm9sIHw9CisJCQkJTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX01BTl9TR01JSV9TUF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJbWlpX2NvbnRyb2wgfD0KKwkJCQlNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfTUFOX1NHTUlJX1NQXzEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCS8qIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2V0IGZvciAxME0gKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaW52YWxpZCBzcGVlZCBmb3IgU0dNSUkgKi8KKwkJCURQKE5FVElGX01TR19MSU5LLCAiSW52YWxpZCBsaW5lX3NwZWVkIDB4JXhcbiIsCisJCQkJICB2YXJzLT5saW5lX3NwZWVkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogc2V0dGluZyB0aGUgZnVsbCBkdXBsZXggKi8KKwkJaWYgKHBhcmFtcy0+cmVxX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCW1paV9jb250cm9sIHw9CisJCQkJTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0ZVTExfRFVQTEVYOworCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKKwkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAorCQkJCSAgICAgIG1paV9jb250cm9sKTsKKworCX0gZWxzZSB7IC8qIEFOIG1vZGUgKi8KKwkJLyogZW5hYmxlIGFuZCByZXN0YXJ0IEFOICovCisJCWJueDJ4X3Jlc3RhcnRfYXV0b25lZyhwYXJhbXMsIDApOworCX0KK30KKworCisvKgorICogbGluayBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIHZvaWQgYm54MnhfcGF1c2VfcmVzb2x2ZShzdHJ1Y3QgbGlua192YXJzICp2YXJzLCB1MzIgcGF1c2VfcmVzdWx0KQorewkJCQkJCS8qICBMRAkgICAgTFAJICovCisJc3dpdGNoIChwYXVzZV9yZXN1bHQpIHsgCQkvKiBBU1lNIFAgQVNZTSBQICovCisJY2FzZSAweGI6ICAgICAgIAkJCS8qICAgMSAgMCAgIDEgIDEgKi8KKwkJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX1RYOworCQlicmVhazsKKworCWNhc2UgMHhlOiAgICAgICAJCQkvKiAgIDEgIDEgICAxICAwICovCisJCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9SWDsKKwkJYnJlYWs7CisKKwljYXNlIDB4NTogICAgICAgCQkJLyogICAwICAxICAgMCAgMSAqLworCWNhc2UgMHg3OiAgICAgICAJCQkvKiAgIDAgIDEgICAxICAxICovCisJY2FzZSAweGQ6ICAgICAgIAkJCS8qICAgMSAgMSAgIDAgIDEgKi8KKwljYXNlIDB4ZjogICAgICAgCQkJLyogICAxICAxICAgMSAgMSAqLworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfQk9USDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB1OCBibngyeF9leHRfcGh5X3Jlc29sdmVfZmMoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IGV4dF9waHlfYWRkcjsKKwl1MTYgbGRfcGF1c2U7CQkvKiBsb2NhbCAqLworCXUxNiBscF9wYXVzZTsJCS8qIGxpbmsgcGFydG5lciAqLworCXUxNiBhbl9jb21wbGV0ZTsJLyogQU4gY29tcGxldGUgKi8KKwl1MTYgcGF1c2VfcmVzdWx0OworCXU4IHJldCA9IDA7CisJdTMyIGV4dF9waHlfdHlwZTsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCWV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCS8qIHJlYWQgdHdpY2UgKi8KKworCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKKwkJICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCSAgICAgIE1ESU9fQU5fUkVHX1NUQVRVUywgJmFuX2NvbXBsZXRlKTsKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICBNRElPX0FOX0RFVkFELAorCQkgICAgICBNRElPX0FOX1JFR19TVEFUVVMsICZhbl9jb21wbGV0ZSk7CisKKwlpZiAoYW5fY29tcGxldGUgJiBNRElPX0FOX1JFR19TVEFUVVNfQU5fQ09NUExFVEUpIHsKKwkJcmV0ID0gMTsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJCSAgICAgIE1ESU9fQU5fUkVHX0FEVl9QQVVTRSwgJmxkX3BhdXNlKTsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJCSAgICAgIE1ESU9fQU5fUkVHX0xQX0FVVE9fTkVHLCAmbHBfcGF1c2UpOworCQlwYXVzZV9yZXN1bHQgPSAobGRfcGF1c2UgJgorCQkJCU1ESU9fQU5fUkVHX0FEVl9QQVVTRV9NQVNLKSA+PiA4OworCQlwYXVzZV9yZXN1bHQgfD0gKGxwX3BhdXNlICYKKwkJCQkgTURJT19BTl9SRUdfQURWX1BBVVNFX01BU0spID4+IDEwOworCQlEUChORVRJRl9NU0dfTElOSywgIkV4dCBQSFkgcGF1c2UgcmVzdWx0IDB4JXhcbiIsCisJCSAgIHBhdXNlX3Jlc3VsdCk7CisJCWJueDJ4X3BhdXNlX3Jlc29sdmUodmFycywgcGF1c2VfcmVzdWx0KTsKKwkJaWYgKHZhcnMtPmZsb3dfY3RybCA9PSBCTlgyWF9GTE9XX0NUUkxfTk9ORSAmJgorCQkgICAgIGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczKSB7CisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX0FOX0RFVkFELAorCQkJCSAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTEQsICZsZF9wYXVzZSk7CisKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJICAgICAgTURJT19BTl9SRUdfQ0wzN19GQ19MUCwgJmxwX3BhdXNlKTsKKwkJCXBhdXNlX3Jlc3VsdCA9IChsZF9wYXVzZSAmCisJCQkJTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USCkgPj4gNTsKKwkJCXBhdXNlX3Jlc3VsdCB8PSAobHBfcGF1c2UgJgorCQkJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpID4+IDc7CisKKwkJCWJueDJ4X3BhdXNlX3Jlc29sdmUodmFycywgcGF1c2VfcmVzdWx0KTsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiRXh0IFBIWSBDTDM3IHBhdXNlIHJlc3VsdCAweCV4XG4iLAorCQkJCSBwYXVzZV9yZXN1bHQpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1OCBibngyeF9kaXJlY3RfcGFyYWxsZWxfZGV0ZWN0X3VzZWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHBkXzEwZywgc3RhdHVzMl8xMDAweDsKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCisJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfU1RBVFVTMiwKKwkJCSAgICAgICZzdGF0dXMyXzEwMDB4KTsKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCisJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfU1RBVFVTMiwKKwkJCSAgICAgICZzdGF0dXMyXzEwMDB4KTsKKwlpZiAoc3RhdHVzMl8xMDAweCAmIE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9TVEFUVVMyX0FOX0RJU0FCTEVEKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiMUcgcGFyYWxsZWwgZGV0ZWN0IGxpbmsgb24gcG9ydCAlZFxuIiwKKwkJCSBwYXJhbXMtPnBvcnQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfMTBHX1BBUkFMTEVMX0RFVEVDVCwKKwkJCSAgICAgIE1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19TVEFUVVMsCisJCQkgICAgICAmcGRfMTBnKTsKKworCWlmIChwZF8xMGcgJiBNRElPXzEwR19QQVJBTExFTF9ERVRFQ1RfUEFSX0RFVF8xMEdfU1RBVFVTX1BEX0xJTkspIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICIxMEcgcGFyYWxsZWwgZGV0ZWN0IGxpbmsgb24gcG9ydCAlZFxuIiwKKwkJCSBwYXJhbXMtPnBvcnQpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2Zsb3dfY3RybF9yZXNvbHZlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKKwkJCQkgIHUzMiBncF9zdGF0dXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IGxkX3BhdXNlOyAgIC8qIGxvY2FsIGRyaXZlciAqLworCXUxNiBscF9wYXVzZTsgICAvKiBsaW5rIHBhcnRuZXIgKi8KKwl1MTYgcGF1c2VfcmVzdWx0OworCisJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX05PTkU7CisKKwkvKiByZXNvbHZlIGZyb20gZ3Bfc3RhdHVzIGluIGNhc2Ugb2YgQU4gY29tcGxldGUgYW5kIG5vdCBzZ21paSAqLworCWlmICgocGFyYW1zLT5yZXFfZmxvd19jdHJsID09IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKSAmJgorCSAgICAoZ3Bfc3RhdHVzICYgTURJT19BTl9DTDczX09SXzM3X0NPTVBMRVRFKSAmJgorCSAgICAoISh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfU0dNSUlfRkxBRykpICYmCisJICAgIChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSA9PQorCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKSkgeworCQlpZiAoYm54MnhfZGlyZWN0X3BhcmFsbGVsX2RldGVjdF91c2VkKHBhcmFtcykpIHsKKwkJCXZhcnMtPmZsb3dfY3RybCA9IHBhcmFtcy0+cmVxX2ZjX2F1dG9fYWR2OworCQkJcmV0dXJuOworCQl9CisJCWlmICgoZ3Bfc3RhdHVzICYKKwkJICAgIChNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9DTDczX0FVVE9ORUdfQ09NUExFVEUgfAorCQkgICAgIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0NMNzNfTVJfTFBfTlBfQU5fQUJMRSkpID09CisJCSAgICAoTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQ0w3M19BVVRPTkVHX0NPTVBMRVRFIHwKKwkJICAgICBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9DTDczX01SX0xQX05QX0FOX0FCTEUpKSB7CisKKwkJCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjEsCisJCQkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMSwKKwkJCQkJICAgICAgJmxkX3BhdXNlKTsKKwkJCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkJICAgICBNRElPX1JFR19CQU5LX0NMNzNfSUVFRUIxLAorCQkJCQkgICAgIE1ESU9fQ0w3M19JRUVFQjFfQU5fTFBfQURWMSwKKwkJCQkJICAgICAmbHBfcGF1c2UpOworCQkJcGF1c2VfcmVzdWx0ID0gKGxkX3BhdXNlICYKKwkJCQkJTURJT19DTDczX0lFRUVCMV9BTl9BRFYxX1BBVVNFX01BU0spCisJCQkJCT4+IDg7CisJCQlwYXVzZV9yZXN1bHQgfD0gKGxwX3BhdXNlICYKKwkJCQkJTURJT19DTDczX0lFRUVCMV9BTl9MUF9BRFYxX1BBVVNFX01BU0spCisJCQkJCT4+IDEwOworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJwYXVzZV9yZXN1bHQgQ0w3MyAweCV4XG4iLAorCQkJCSBwYXVzZV9yZXN1bHQpOworCQl9IGVsc2UgeworCisJCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAorCQkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEViwKKwkJCQkJICAgICAgJmxkX3BhdXNlKTsKKwkJCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAorCQkJICAgICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfTElOS19QQVJUTkVSX0FCSUxJVFkxLAorCQkJICAgICAgICZscF9wYXVzZSk7CisJCQlwYXVzZV9yZXN1bHQgPSAobGRfcGF1c2UgJgorCQkJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX01BU0spPj41OworCQkJcGF1c2VfcmVzdWx0IHw9IChscF9wYXVzZSAmCisJCQkJIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX01BU0spPj43OworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJwYXVzZV9yZXN1bHQgQ0wzNyAweCV4XG4iLAorCQkJCSBwYXVzZV9yZXN1bHQpOworCQl9CisJCWJueDJ4X3BhdXNlX3Jlc29sdmUodmFycywgcGF1c2VfcmVzdWx0KTsKKwl9IGVsc2UgaWYgKChwYXJhbXMtPnJlcV9mbG93X2N0cmwgPT0gQk5YMlhfRkxPV19DVFJMX0FVVE8pICYmCisJCSAgIChibngyeF9leHRfcGh5X3Jlc29sdmVfZmMocGFyYW1zLCB2YXJzKSkpIHsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmIChwYXJhbXMtPnJlcV9mbG93X2N0cmwgPT0gQk5YMlhfRkxPV19DVFJMX0FVVE8pCisJCQl2YXJzLT5mbG93X2N0cmwgPSBwYXJhbXMtPnJlcV9mY19hdXRvX2FkdjsKKwkJZWxzZQorCQkJdmFycy0+Zmxvd19jdHJsID0gcGFyYW1zLT5yZXFfZmxvd19jdHJsOworCX0KKwlEUChORVRJRl9NU0dfTElOSywgImZsb3dfY3RybCAweCV4XG4iLCB2YXJzLT5mbG93X2N0cmwpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9jaGVja19mYWxsYmFja190b19jbDM3KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiByeF9zdGF0dXMsIHVzdGF0X3ZhbCwgY2wzN19mc21fcmVjaWV2ZWQ7CisJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9jaGVja19mYWxsYmFja190b19jbDM3XG4iKTsKKwkvKiBTdGVwIDE6IE1ha2Ugc3VyZSBzaWduYWwgaXMgZGV0ZWN0ZWQgKi8KKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfUlgwLAorCQkJICAgICAgTURJT19SWDBfUlhfU1RBVFVTLAorCQkJICAgICAgJnJ4X3N0YXR1cyk7CisJaWYgKChyeF9zdGF0dXMgJiBNRElPX1JYMF9SWF9TVEFUVVNfU0lHREVUKSAhPQorCSAgICAoTURJT19SWDBfUlhfU1RBVFVTX1NJR0RFVCkpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTaWduYWwgaXMgbm90IGRldGVjdGVkLiBSZXN0b3JpbmcgQ0w3My4iCisJCQkgICAgICJyeF9zdGF0dXMoMHg4MGIwKSA9IDB4JXhcbiIsIHJ4X3N0YXR1cyk7CisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1JFR19CQU5LX0NMNzNfSUVFRUIwLAorCQkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MLAorCQkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MX0FOX0VOKTsKKwkJcmV0dXJuOworCX0KKwkvKiBTdGVwIDI6IENoZWNrIENMNzMgc3RhdGUgbWFjaGluZSAqLworCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX1VTRVJCMCwKKwkJCSAgICAgIE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19VU1RBVDEsCisJCQkgICAgICAmdXN0YXRfdmFsKTsKKwlpZiAoKHVzdGF0X3ZhbCAmCisJICAgICAoTURJT19DTDczX1VTRVJCMF9DTDczX1VTVEFUMV9MSU5LX1NUQVRVU19DSEVDSyB8CisJICAgICAgTURJT19DTDczX1VTRVJCMF9DTDczX1VTVEFUMV9BTl9HT09EX0NIRUNLX0JBTTM3KSkgIT0KKwkgICAgKE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19VU1RBVDFfTElOS19TVEFUVVNfQ0hFQ0sgfAorCSAgICAgIE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19VU1RBVDFfQU5fR09PRF9DSEVDS19CQU0zNykpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJDTDczIHN0YXRlLW1hY2hpbmUgaXMgbm90IHN0YWJsZS4gIgorCQkJICAgICAidXN0YXRfdmFsKDB4ODM3MSkgPSAweCV4XG4iLCB1c3RhdF92YWwpOworCQlyZXR1cm47CisJfQorCS8qIFN0ZXAgMzogQ2hlY2sgQ0wzNyBNZXNzYWdlIFBhZ2VzIHJlY2VpdmVkIHRvIGluZGljYXRlIExQCisJc3VwcG9ydHMgb25seSBDTDM3ICovCisJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX1JFTU9URV9QSFksCisJCQkgICAgICBNRElPX1JFTU9URV9QSFlfTUlTQ19SWF9TVEFUVVMsCisJCQkgICAgICAmY2wzN19mc21fcmVjaWV2ZWQpOworCWlmICgoY2wzN19mc21fcmVjaWV2ZWQgJgorCSAgICAgKE1ESU9fUkVNT1RFX1BIWV9NSVNDX1JYX1NUQVRVU19DTDM3X0ZTTV9SRUNFSVZFRF9PVkVSMUdfTVNHIHwKKwkgICAgIE1ESU9fUkVNT1RFX1BIWV9NSVNDX1JYX1NUQVRVU19DTDM3X0ZTTV9SRUNFSVZFRF9CUkNNX09VSV9NU0cpKSAhPQorCSAgICAoTURJT19SRU1PVEVfUEhZX01JU0NfUlhfU1RBVFVTX0NMMzdfRlNNX1JFQ0VJVkVEX09WRVIxR19NU0cgfAorCSAgICAgIE1ESU9fUkVNT1RFX1BIWV9NSVNDX1JYX1NUQVRVU19DTDM3X0ZTTV9SRUNFSVZFRF9CUkNNX09VSV9NU0cpKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiTm8gQ0wzNyBGU00gd2VyZSByZWNlaXZlZC4gIgorCQkJICAgICAibWlzY19yeF9zdGF0dXMoMHg4MzMwKSA9IDB4JXhcbiIsCisJCQkgY2wzN19mc21fcmVjaWV2ZWQpOworCQlyZXR1cm47CisJfQorCS8qIFRoZSBjb21iaW5lZCBjbDM3L2NsNzMgZnNtIHN0YXRlIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhhdCB3ZSBhcmUKKwljb25uZWN0ZWQgdG8gYSBkZXZpY2Ugd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBjbDczLCBidXQgZG9lcyBzdXBwb3J0CisJY2wzNyBCQU0uIEluIHRoaXMgY2FzZSB3ZSBkaXNhYmxlIGNsNzMgYW5kIHJlc3RhcnQgY2wzNyBhdXRvLW5lZyAqLworCS8qIERpc2FibGUgQ0w3MyAqLworCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMCwKKwkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MLAorCQkJICAgICAgMCk7CisJLyogUmVzdGFydCBDTDM3IGF1dG9uZWcgKi8KKwlibngyeF9yZXN0YXJ0X2F1dG9uZWcocGFyYW1zLCAwKTsKKwlEUChORVRJRl9NU0dfTElOSywgIkRpc2FibGluZyBDTDczLCBhbmQgcmVzdGFydGluZyBDTDM3IGF1dG9uZWdcbiIpOworfQorc3RhdGljIHU4IGJueDJ4X2xpbmtfc2V0dGluZ3Nfc3RhdHVzKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCQkJICAgdTMyIGdwX3N0YXR1cywKKwkJCQkgICB1OCBleHRfcGh5X2xpbmtfdXApCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IG5ld19saW5lX3NwZWVkOworCXU4IHJjID0gMDsKKwl2YXJzLT5saW5rX3N0YXR1cyA9IDA7CisKKwlpZiAoZ3Bfc3RhdHVzICYgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfTElOS19TVEFUVVMpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayB1cCBncF9zdGF0dXM9MHgleFxuIiwKKwkJCSBncF9zdGF0dXMpOworCisJCXZhcnMtPnBoeV9saW5rX3VwID0gMTsKKwkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfTElOS19VUDsKKworCQlpZiAoZ3Bfc3RhdHVzICYgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfRFVQTEVYX1NUQVRVUykKKwkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCQlibngyeF9mbG93X2N0cmxfcmVzb2x2ZShwYXJhbXMsIHZhcnMsIGdwX3N0YXR1cyk7CisKKwkJc3dpdGNoIChncF9zdGF0dXMgJiBHUF9TVEFUVVNfU1BFRURfTUFTSykgeworCQljYXNlIEdQX1NUQVRVU18xME06CisJCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwVEZEOworCQkJZWxzZQorCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTBUSEQ7CisJCQlicmVhazsKKworCQljYXNlIEdQX1NUQVRVU18xMDBNOgorCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQlpZiAodmFycy0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTAwVFhGRDsKKwkJCWVsc2UKKwkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwMFRYSEQ7CisJCQlicmVhazsKKworCQljYXNlIEdQX1NUQVRVU18xRzoKKwkJY2FzZSBHUF9TVEFUVVNfMUdfS1g6CisJCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlpZiAodmFycy0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTAwMFRGRDsKKwkJCWVsc2UKKwkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwMDBUSEQ7CisJCQlicmVhazsKKworCQljYXNlIEdQX1NUQVRVU18yXzVHOgorCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8yNTAwOworCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzI1MDBURkQ7CisJCQllbHNlCisJCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18yNTAwVEhEOworCQkJYnJlYWs7CisKKwkJY2FzZSBHUF9TVEFUVVNfNUc6CisJCWNhc2UgR1BfU1RBVFVTXzZHOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICJsaW5rIHNwZWVkIHVuc3VwcG9ydGVkICBncF9zdGF0dXMgMHgleFxuIiwKKwkJCQkgIGdwX3N0YXR1cyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXNlIEdQX1NUQVRVU18xMEdfS1g0OgorCQljYXNlIEdQX1NUQVRVU18xMEdfSElHOgorCQljYXNlIEdQX1NUQVRVU18xMEdfQ1g0OgorCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTBHVEZEOworCQkJYnJlYWs7CisKKwkJY2FzZSBHUF9TVEFUVVNfMTJHX0hJRzoKKwkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTIwMDA7CisJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEyR1RGRDsKKwkJCWJyZWFrOworCisJCWNhc2UgR1BfU1RBVFVTXzEyXzVHOgorCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMjUwMDsKKwkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTJfNUdURkQ7CisJCQlicmVhazsKKworCQljYXNlIEdQX1NUQVRVU18xM0c6CisJCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEzMDAwOworCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xM0dURkQ7CisJCQlicmVhazsKKworCQljYXNlIEdQX1NUQVRVU18xNUc6CisJCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzE1MDAwOworCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xNUdURkQ7CisJCQlicmVhazsKKworCQljYXNlIEdQX1NUQVRVU18xNkc6CisJCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzE2MDAwOworCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xNkdURkQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICAibGluayBzcGVlZCB1bnN1cHBvcnRlZCBncF9zdGF0dXMgMHgleFxuIiwKKwkJCQkgIGdwX3N0YXR1cyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFVwb24gbGluayBzcGVlZCBjaGFuZ2Ugc2V0IHRoZSBOSUcgaW50byBkcmFpbiBtb2RlLgorCQlDb21lcyB0byBkZWFscyB3aXRoIHBvc3NpYmxlIEZJRk8gZ2xpdGNoIGR1ZSB0byBjbGsgY2hhbmdlCisJCXdoZW4gc3BlZWQgaXMgZGVjcmVhc2VkIHdpdGhvdXQgbGluayBkb3duIGluZGljYXRvciAqLworCQlpZiAobmV3X2xpbmVfc3BlZWQgIT0gdmFycy0+bGluZV9zcGVlZCkgeworCQkJaWYgKFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpICE9CisJCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCAmJgorCQkJICAgIGV4dF9waHlfbGlua191cCkgeworCQkJCURQKE5FVElGX01TR19MSU5LLCAiSW50ZXJuYWwgbGluayBzcGVlZCAlZCBpcyIKKwkJCQkJICAgICIgZGlmZmVyZW50IHRoYW4gdGhlIGV4dGVybmFsIgorCQkJCQkgICAgIiBsaW5rIHNwZWVkICVkXG4iLCBuZXdfbGluZV9zcGVlZCwKKwkJCQkJICB2YXJzLT5saW5lX3NwZWVkKTsKKwkJCQl2YXJzLT5waHlfbGlua191cCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFCisJCQkJICAgICsgcGFyYW1zLT5wb3J0KjQsIDApOworCQkJbXNsZWVwKDEpOworCQl9CisJCXZhcnMtPmxpbmVfc3BlZWQgPSBuZXdfbGluZV9zcGVlZDsKKwkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfU0VSREVTX0xJTks7CisKKwkJaWYgKChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgorCQkgICAgKChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSA9PQorCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgfHwKKwkJICAgIChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSA9PQorCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDUpIHx8CisJCSAgICAoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykgPT0KKwkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2KSB8fAorCQkgICAgKFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpID09CisJCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNikpKSB7CisJCQl2YXJzLT5hdXRvbmVnID0gQVVUT19ORUdfRU5BQkxFRDsKKworCQkJaWYgKGdwX3N0YXR1cyAmIE1ESU9fQU5fQ0w3M19PUl8zN19DT01QTEVURSkgeworCQkJCXZhcnMtPmF1dG9uZWcgfD0gQVVUT19ORUdfQ09NUExFVEU7CisJCQkJdmFycy0+bGlua19zdGF0dXMgfD0KKwkJCQkJTElOS19TVEFUVVNfQVVUT19ORUdPVElBVEVfQ09NUExFVEU7CisJCQl9CisKKwkJCXZhcnMtPmF1dG9uZWcgfD0gQVVUT19ORUdfUEFSQUxMRUxfREVURUNUSU9OX1VTRUQ7CisJCQl2YXJzLT5saW5rX3N0YXR1cyB8PQorCQkJCUxJTktfU1RBVFVTX1BBUkFMTEVMX0RFVEVDVElPTl9VU0VEOworCisJCX0KKwkJaWYgKHZhcnMtPmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9UWCkKKwkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9CisJCQkJTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0VOQUJMRUQ7CisKKwkJaWYgKHZhcnMtPmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9SWCkKKwkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9CisJCQkJTElOS19TVEFUVVNfUlhfRkxPV19DT05UUk9MX0VOQUJMRUQ7CisKKwl9IGVsc2UgeyAvKiBsaW5rX2Rvd24gKi8KKwkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayBkb3duXG4iKTsKKworCQl2YXJzLT5waHlfbGlua191cCA9IDA7CisKKwkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOworCQl2YXJzLT5hdXRvbmVnID0gQVVUT19ORUdfRElTQUJMRUQ7CisJCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfTk9ORTsKKworCQlpZiAoKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpICYmCisJCSAgICAoKFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpID09CisJCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKSkpIHsKKwkJCS8qIENoZWNrIHNpZ25hbCBpcyBkZXRlY3RlZCAqLworCQkJYm54MnhfY2hlY2tfZmFsbGJhY2tfdG9fY2wzNyhwYXJhbXMpOworCQl9CisJfQorCisJRFAoTkVUSUZfTVNHX0xJTkssICJncF9zdGF0dXMgMHgleCAgcGh5X2xpbmtfdXAgJXggbGluZV9zcGVlZCAleFxuIiwKKwkJIGdwX3N0YXR1cywgdmFycy0+cGh5X2xpbmtfdXAsIHZhcnMtPmxpbmVfc3BlZWQpOworCURQKE5FVElGX01TR19MSU5LLCAiZHVwbGV4ICV4ICBmbG93X2N0cmwgMHgleCIKKwkJICIgYXV0b25lZyAweCV4XG4iLAorCQkgdmFycy0+ZHVwbGV4LAorCQkgdmFycy0+Zmxvd19jdHJsLCB2YXJzLT5hdXRvbmVnKTsKKwlEUChORVRJRl9NU0dfTElOSywgImxpbmtfc3RhdHVzIDB4JXhcbiIsIHZhcnMtPmxpbmtfc3RhdHVzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2V0X2dtaWlfdHhfZHJpdmVyKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiBscF91cDI7CisJdTE2IHR4X2RyaXZlcjsKKwl1MTYgYmFuazsKKworCS8qIHJlYWQgcHJlY29tcCAqLworCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgTURJT19SRUdfQkFOS19PVkVSXzFHLAorCQkJICAgICAgTURJT19PVkVSXzFHX0xQX1VQMiwgJmxwX3VwMik7CisKKwkvKiBiaXRzIFsxMDo3XSBhdCBscF91cDIsIHBvc2l0aW9uZWQgYXQgWzE1OjEyXSAqLworCWxwX3VwMiA9ICgoKGxwX3VwMiAmIE1ESU9fT1ZFUl8xR19MUF9VUDJfUFJFRU1QSEFTSVNfTUFTSykgPj4KKwkJICAgTURJT19PVkVSXzFHX0xQX1VQMl9QUkVFTVBIQVNJU19TSElGVCkgPDwKKwkJICBNRElPX1RYMF9UWF9EUklWRVJfUFJFRU1QSEFTSVNfU0hJRlQpOworCisJaWYgKGxwX3VwMiA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGJhbmsgPSBNRElPX1JFR19CQU5LX1RYMDsgYmFuayA8PSBNRElPX1JFR19CQU5LX1RYMzsKKwkgICAgICBiYW5rICs9IChNRElPX1JFR19CQU5LX1RYMSAtIE1ESU9fUkVHX0JBTktfVFgwKSkgeworCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgYmFuaywKKwkJCQkgICAgICBNRElPX1RYMF9UWF9EUklWRVIsICZ0eF9kcml2ZXIpOworCisJCS8qIHJlcGxhY2UgdHhfZHJpdmVyIGJpdHMgWzE1OjEyXSAqLworCQlpZiAobHBfdXAyICE9CisJCSAgICAodHhfZHJpdmVyICYgTURJT19UWDBfVFhfRFJJVkVSX1BSRUVNUEhBU0lTX01BU0spKSB7CisJCQl0eF9kcml2ZXIgJj0gfk1ESU9fVFgwX1RYX0RSSVZFUl9QUkVFTVBIQVNJU19NQVNLOworCQkJdHhfZHJpdmVyIHw9IGxwX3VwMjsKKwkJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJCSAgICAgIGJhbmssCisJCQkJCSAgICAgIE1ESU9fVFgwX1RYX0RSSVZFUiwgdHhfZHJpdmVyKTsKKwkJfQorCX0KK30KKworc3RhdGljIHU4IGJueDJ4X2VtYWNfcHJvZ3JhbShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgIHUzMiBsaW5lX3NwZWVkLCB1MzIgZHVwbGV4KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTE2IG1vZGUgPSAwOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJzZXR0aW5nIGxpbmsgc3BlZWQgJiBkdXBsZXhcbiIpOworCWJueDJ4X2JpdHNfZGlzKGJwLCBHUkNCQVNFX0VNQUMwICsgcG9ydCoweDQwMCArCisJCSAgICAgRU1BQ19SRUdfRU1BQ19NT0RFLAorCQkgICAgIChFTUFDX01PREVfMjVHX01PREUgfAorCQkgICAgIEVNQUNfTU9ERV9QT1JUX01JSV8xME0gfAorCQkgICAgIEVNQUNfTU9ERV9IQUxGX0RVUExFWCkpOworCXN3aXRjaCAobGluZV9zcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJCW1vZGUgfD0gRU1BQ19NT0RFX1BPUlRfTUlJXzEwTTsKKwkJYnJlYWs7CisKKwljYXNlIFNQRUVEXzEwMDoKKwkJbW9kZSB8PSBFTUFDX01PREVfUE9SVF9NSUk7CisJCWJyZWFrOworCisJY2FzZSBTUEVFRF8xMDAwOgorCQltb2RlIHw9IEVNQUNfTU9ERV9QT1JUX0dNSUk7CisJCWJyZWFrOworCisJY2FzZSBTUEVFRF8yNTAwOgorCQltb2RlIHw9IChFTUFDX01PREVfMjVHX01PREUgfCBFTUFDX01PREVfUE9SVF9HTUlJKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiAxMEcgbm90IHZhbGlkIGZvciBFTUFDICovCisJCURQKE5FVElGX01TR19MSU5LLCAiSW52YWxpZCBsaW5lX3NwZWVkIDB4JXhcbiIsIGxpbmVfc3BlZWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQltb2RlIHw9IEVNQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlibngyeF9iaXRzX2VuKGJwLAorCQkgICAgR1JDQkFTRV9FTUFDMCArIHBvcnQqMHg0MDAgKyBFTUFDX1JFR19FTUFDX01PREUsCisJCSAgICBtb2RlKTsKKworCWJueDJ4X3NldF9sZWQocGFyYW1zLCBMRURfTU9ERV9PUEVSLCBsaW5lX3NwZWVkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAJCSAgICAgRXh0ZXJuYWwgUGh5IHNlY3Rpb24gICAgICAgCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJueDJ4X2V4dF9waHlfaHdfcmVzZXQoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCkKK3sKKwlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18xLAorCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XLCBwb3J0KTsKKwltc2xlZXAoMSk7CisJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMSwKKwkJICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2V4dF9waHlfcmVzZXQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICAgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIGV4dF9waHlfdHlwZTsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKworCURQKE5FVElGX01TR19MSU5LLCAiUG9ydCAleDogYm54MnhfZXh0X3BoeV9yZXNldFxuIiwgcGFyYW1zLT5wb3J0KTsKKwlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkvKiBUaGUgUEhZIHJlc2V0IGlzIGNvbnRyb2xlZCBieSBHUElPIDEKKwkgKiBHaXZlIGl0IDFtcyBvZiByZXNldCBwdWxzZQorCSAqLworCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisKKwkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgRGlyZWN0XG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIDg3MDUvODcwNlxuIik7CisKKwkJCS8qIFJlc3RvcmUgbm9ybWFsIHBvd2VyIG1vZGUqLworCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKKwkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAorCQkJCQkgIHBhcmFtcy0+cG9ydCk7CisKKwkJCS8qIEhXIHJlc2V0ICovCisJCQlibngyeF9leHRfcGh5X2h3X3Jlc2V0KGJwLCBwYXJhbXMtPnBvcnQpOworCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsIDB4YTA0MCk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6CisKKwkJCS8qIFJlc3RvcmUgbm9ybWFsIHBvd2VyIG1vZGUqLworCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKKwkJCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAorCQkJCQkgIHBhcmFtcy0+cG9ydCk7CisKKwkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzEsCisJCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwKKwkJCQkJICBwYXJhbXMtPnBvcnQpOworCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCisJCQkJICAgICAgIDE8PDE1KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4MDcyXG4iKTsKKworCQkJLyogVW5zZXQgTG93IFBvd2VyIE1vZGUgYW5kIFNXIHJlc2V0ICovCisJCQkvKiBSZXN0b3JlIG5vcm1hbCBwb3dlciBtb2RlKi8KKwkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCisJCQkJICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwKKwkJCQkJICBwYXJhbXMtPnBvcnQpOworCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCisJCQkJICAgICAgIDE8PDE1KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4MDczXG4iKTsKKworCQkJLyogUmVzdG9yZSBub3JtYWwgcG93ZXIgbW9kZSovCisJCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAorCQkJCSAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsCisJCQkJCSAgcGFyYW1zLT5wb3J0KTsKKworCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMSwKKwkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAorCQkJCQkgIHBhcmFtcy0+cG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgU0ZYNzEwMVxuIik7CisKKwkJCS8qIFJlc3RvcmUgbm9ybWFsIHBvd2VyIG1vZGUqLworCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKKwkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAorCQkJCQkgIHBhcmFtcy0+cG9ydCk7CisKKwkJCS8qIEhXIHJlc2V0ICovCisJCQlibngyeF9leHRfcGh5X2h3X3Jlc2V0KGJwLCBwYXJhbXMtPnBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxOgorCQkJLyogUmVzdG9yZSBub3JtYWwgcG93ZXIgbW9kZSovCisJCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAorCQkJCSAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsCisJCQkJCSAgcGFyYW1zLT5wb3J0KTsKKworCQkJLyogSFcgcmVzZXQgKi8KKwkJCWJueDJ4X2V4dF9waHlfaHdfcmVzZXQoYnAsIHBhcmFtcy0+cG9ydCk7CisKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwKKwkJCQkgICAgICAgMTw8MTUpOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MjM6CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIFBIWSBGYWlsdXJlIGRldGVjdGVkXG4iKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEUChORVRJRl9NU0dfTElOSywgIkJBRCBYR1hTIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCisJCQkgICBwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgeyAvKiBTZXJEZXMgKi8KKwkJZXh0X3BoeV90eXBlID0gU0VSREVTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKKwkJY2FzZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVzIERpcmVjdFxuIik7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfQkNNNTQ4MjoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVzIDU0ODJcbiIpOworCQkJYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgcGFyYW1zLT5wb3J0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEUChORVRJRl9NU0dfTElOSywgIkJBRCBTZXJEZXMgZXh0X3BoeV9jb25maWcgMHgleFxuIiwKKwkJCQkgcGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAorCQkJCSAgICB1MzIgc2htZW1fYmFzZSwgdTMyIHNwaXJvbV92ZXIpCit7CisJRFAoTkVUSUZfTVNHX0xJTkssICJGVyB2ZXJzaW9uIDB4JXg6MHgleCBmb3IgcG9ydCAlZFxuIiwKKwkJICh1MTYpKHNwaXJvbV92ZXI+PjE2KSwgKHUxNilzcGlyb21fdmVyLCBwb3J0KTsKKwlSRUdfV1IoYnAsIHNobWVtX2Jhc2UgKworCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJICAgIHBvcnRfbWJbcG9ydF0uZXh0X3BoeV9md192ZXJzaW9uKSwKKwkJCXNwaXJvbV92ZXIpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zYXZlX2JjbV9zcGlyb21fdmVyKHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsCisJCQkJICAgIHUzMiBleHRfcGh5X3R5cGUsIHU4IGV4dF9waHlfYWRkciwKKwkJCQkgICAgdTMyIHNobWVtX2Jhc2UpCit7CisJdTE2IGZ3X3ZlcjEsIGZ3X3ZlcjI7CisKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgTURJT19QTUFfUkVHX1JPTV9WRVIxLCAmZndfdmVyMSk7CisJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCisJCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMiwgJmZ3X3ZlcjIpOworCWJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oYnAsIHBvcnQsIHNobWVtX2Jhc2UsCisJCQkJKHUzMikoZndfdmVyMTw8MTYgfCBmd192ZXIyKSk7Cit9CisKKworc3RhdGljIHZvaWQgYm54Mnhfc2F2ZV84NDgxX3NwaXJvbV92ZXJzaW9uKHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsCisJCQkJCSB1OCBleHRfcGh5X2FkZHIsIHUzMiBzaG1lbV9iYXNlKQoreworCXUxNiB2YWwsIGZ3X3ZlcjEsIGZ3X3ZlcjIsIGNudDsKKwkvKiBGb3IgdGhlIDMyIGJpdHMgcmVnaXN0ZXJzIGluIDg0ODEsIGFjY2VzcyB2aWEgTURJTzJBUk0gaW50ZXJmYWNlLiovCisJLyogKDEpIHNldCByZWdpc3RlciAweGMyMDBfMDAxNChTUElfQlJJREdFX0NUUkxfMikgdG8gMHgwMzAwMDAwMCAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIDB4QTgxOSwgMHgwMDE0KTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgMHhBODFBLAorCQkgICAgICAgMHhjMjAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgMHhBODFCLAorCQkgICAgICAgMHgwMDAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgMHhBODFDLAorCQkgICAgICAgMHgwMzAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgMHhBODE3LAorCQkgICAgICAgMHgwMDA5KTsKKworCWZvciAoY250ID0gMDsgY250IDwgMTAwOyBjbnQrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAorCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICAweEE4MTgsCisJCQkgICAgICAmdmFsKTsKKwkJaWYgKHZhbCAmIDEpCisJCQlicmVhazsKKwkJdWRlbGF5KDUpOworCX0KKwlpZiAoY250ID09IDEwMCkgeworCQlEUChORVRJRl9NU0dfTElOSywgIlVuYWJsZSB0byByZWFkIDg0ODEgcGh5IGZ3IHZlcnNpb24oMSlcbiIpOworCQlibngyeF9zYXZlX3NwaXJvbV92ZXJzaW9uKGJwLCBwb3J0LAorCQkJCQlzaG1lbV9iYXNlLCAwKTsKKwkJcmV0dXJuOworCX0KKworCisJLyogMikgcmVhZCByZWdpc3RlciAweGMyMDBfMDAwMCAoU1BJX0ZXX1NUQVRVUykgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCisJCSAgICAgICAweEE4MTksIDB4MDAwMCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCisJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgMHhBODFBLCAweGMyMDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIDB4QTgxNywgMHgwMDBBKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDsgY250KyspIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKKwkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgMHhBODE4LAorCQkJICAgICAgJnZhbCk7CisJCWlmICh2YWwgJiAxKQorCQkJYnJlYWs7CisJCXVkZWxheSg1KTsKKwl9CisJaWYgKGNudCA9PSAxMDApIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJVbmFibGUgdG8gcmVhZCA4NDgxIHBoeSBmdyB2ZXJzaW9uKDIpXG4iKTsKKwkJYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihicCwgcG9ydCwKKwkJCQkJc2htZW1fYmFzZSwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBsb3dlciAxNiBiaXRzIG9mIHRoZSByZWdpc3RlciBTUElfRldfU1RBVFVTICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAorCQkgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAweEE4MUIsCisJCSAgICAgICZmd192ZXIxKTsKKwkvKiB1cHBlciAxNiBiaXRzIG9mIHJlZ2lzdGVyIFNQSV9GV19TVEFUVVMgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgIDB4QTgxQywKKwkJICAgICAgJmZ3X3ZlcjIpOworCisJYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihicCwgcG9ydCwKKwkJCQlzaG1lbV9iYXNlLCAoZndfdmVyMjw8MTYpIHwgZndfdmVyMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2JjbTgwNzJfZXh0ZXJuYWxfcm9tX2Jvb3Qoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwkvKiBOZWVkIHRvIHdhaXQgMjAwbXMgYWZ0ZXIgcmVzZXQgKi8KKwltc2xlZXAoMjAwKTsKKwkvKiBCb290IHBvcnQgZnJvbSBleHRlcm5hbCBST00KKwkgKiBTZXQgc2VyX2Jvb3RfY3RsIGJpdCBpbiB0aGUgTUlTQ19DVFJMMSByZWdpc3RlcgorCSAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkJICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwxLCAweDAwMDEpOworCisJLyogUmVzZXQgaW50ZXJuYWwgbWljcm9wcm9jZXNzb3IgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJCSAgTURJT19QTUFfREVWQUQsCisJCQkgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKKwkJCSAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9SRVNFVF9JTlRFUk5BTF9NUCk7CisJLyogc2V0IG1pY3JvIHJlc2V0ID0gMCAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkJICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKKwkJCSAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkxfUk9NX01JQ1JPX1JFU0VUKTsKKwkvKiBSZXNldCBpbnRlcm5hbCBtaWNyb3Byb2Nlc3NvciAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkJICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAorCQkJICBNRElPX1BNQV9SRUdfR0VOX0NUUkxfUk9NX1JFU0VUX0lOVEVSTkFMX01QKTsKKwkvKiB3YWl0IGZvciAxMDBtcyBmb3IgY29kZSBkb3dubG9hZCB2aWEgU1BJIHBvcnQgKi8KKwltc2xlZXAoMTAwKTsKKworCS8qIENsZWFyIHNlcl9ib290X2N0bCBiaXQgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJCSAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICBNRElPX1BNQV9SRUdfTUlTQ19DVFJMMSwgMHgwMDAwKTsKKwkvKiBXYWl0IDEwMG1zICovCisJbXNsZWVwKDEwMCk7CisKKwlibngyeF9zYXZlX2JjbV9zcGlyb21fdmVyKGJwLCBwb3J0LAorCQkJCWV4dF9waHlfdHlwZSwKKwkJCQlleHRfcGh5X2FkZHIsCisJCQkJcGFyYW1zLT5zaG1lbV9iYXNlKTsKK30KKworc3RhdGljIHU4IGJueDJ4XzgwNzNfaXNfc25yX25lZWRlZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwkvKiBUaGlzIGlzIG9ubHkgcmVxdWlyZWQgZm9yIDgwNzNBMSwgdmVyc2lvbiAxMDIgb25seSAqLworCisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJdTE2IHZhbDsKKworCS8qIFJlYWQgODA3MyBIVyByZXZpc2lvbiovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgIE1ESU9fUE1BX1JFR184MDczX0NISVBfUkVWLCAmdmFsKTsKKworCWlmICh2YWwgIT0gMSkgeworCQkvKiBObyBuZWVkIHRvIHdvcmthcm91bmQgaW4gODA3MyBBMSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgTURJT19QTUFfUkVHX1JPTV9WRVIyLCAmdmFsKTsKKworCS8qIFNOUiBzaG91bGQgYmUgYXBwbGllZCBvbmx5IGZvciB2ZXJzaW9uIDB4MTAyICovCisJaWYgKHZhbCAhPSAweDEwMikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHU4IGJueDJ4X2JjbTgwNzNfeGF1aV93YShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MTYgdmFsLCBjbnQsIGNudDEgOworCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgIE1ESU9fUE1BX1JFR184MDczX0NISVBfUkVWLCAmdmFsKTsKKworCWlmICh2YWwgPiAwKSB7CisJCS8qIE5vIG5lZWQgdG8gd29ya2Fyb3VuZCBpbiA4MDczIEExICovCisJCXJldHVybiAwOworCX0KKwkvKiBYQVVJIHdvcmthcm91bmQgaW4gODA3MyBBMDogKi8KKworCS8qIEFmdGVyIGxvYWRpbmcgdGhlIGJvb3QgUk9NIGFuZCByZXN0YXJ0aW5nIEF1dG9uZWcsCisJcG9sbCBEZXYxLCBSZWcgJEM4MjA6ICovCisKKwlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDA7IGNudCsrKSB7CisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgTURJT19QTUFfUkVHXzgwNzNfU1BFRURfTElOS19TVEFUVVMsCisJCQkgICAgICAmdmFsKTsKKwkJICAvKiBJZiBiaXQgWzE0XSA9IDAgb3IgYml0IFsxM10gPSAwLCBjb250aW51ZSBvbiB3aXRoCisJCSAgIHN5c3RlbSBpbml0aWFsaXphdGlvbiAoWEFVSSB3b3JrLWFyb3VuZCBub3QgcmVxdWlyZWQsCisJCSAgICBhcyB0aGVzZSBiaXRzIGluZGljYXRlIDIuNUcgb3IgMUcgbGluayB1cCkuICovCisJCWlmICghKHZhbCAmICgxPDwxNCkpIHx8ICEodmFsICYgKDE8PDEzKSkpIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEFVSSB3b3JrLWFyb3VuZCBub3QgcmVxdWlyZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoISh2YWwgJiAoMTw8MTUpKSkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJjbGMgYml0IDE1IHdlbnQgb2ZmXG4iKTsKKwkJCSAvKiBJZiBiaXQgMTUgaXMgMCwgdGhlbiBwb2xsIERldjEsIFJlZyAkQzg0MSB1bnRpbAorCQkJICBpdCdzIE1TQiAoYml0IDE1KSBnb2VzIHRvIDEgKGluZGljYXRpbmcgdGhhdCB0aGUKKwkJCSAgWEFVSSB3b3JrYXJvdW5kIGhhcyBjb21wbGV0ZWQpLAorCQkJICB0aGVuIGNvbnRpbnVlIG9uIHdpdGggc3lzdGVtIGluaXRpYWxpemF0aW9uLiovCisJCQlmb3IgKGNudDEgPSAwOyBjbnQxIDwgMTAwMDsgY250MSsrKSB7CisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCVBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCQkJCWV4dF9waHlfYWRkciwKKwkJCQkJTURJT19QTUFfREVWQUQsCisJCQkJCU1ESU9fUE1BX1JFR184MDczX1hBVUlfV0EsICZ2YWwpOworCQkJCWlmICh2YWwgJiAoMTw8MTUpKSB7CisJCQkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCQkgICJYQVVJIHdvcmthcm91bmQgaGFzIGNvbXBsZXRlZFxuIik7CisJCQkJCXJldHVybiAwOworCQkJCSB9CisJCQkJIG1zbGVlcCgzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgzKTsKKwl9CisJRFAoTkVUSUZfTVNHX0xJTkssICJXYXJuaW5nOiBYQVVJIHdvcmstYXJvdW5kIHRpbWVvdXQgISEhXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfYmNtODA3M19iY204NzI3X2V4dGVybmFsX3JvbV9ib290KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsCisJCQkJCQkgIHU4IGV4dF9waHlfYWRkciwKKwkJCQkJCSAgdTMyIGV4dF9waHlfdHlwZSwKKwkJCQkJCSAgdTMyIHNobWVtX2Jhc2UpCit7CisJLyogQm9vdCBwb3J0IGZyb20gZXh0ZXJuYWwgUk9NICAqLworCS8qIEVEQyBncnN0ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAorCQkgICAgICAgMHgwMDAxKTsKKworCS8qIHVjb2RlIHJlYm9vdCBhbmQgcnN0ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAorCQkgICAgICAgMHgwMDhjKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwxLCAweDAwMDEpOworCisJLyogUmVzZXQgaW50ZXJuYWwgbWljcm9wcm9jZXNzb3IgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkwsCisJCSAgICAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkxfUk9NX01JQ1JPX1JFU0VUKTsKKworCS8qIFJlbGVhc2Ugc3JzdCBiaXQgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkwsCisJCSAgICAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkxfUk9NX1JFU0VUX0lOVEVSTkFMX01QKTsKKworCS8qIHdhaXQgZm9yIDEwMG1zIGZvciBjb2RlIGRvd25sb2FkIHZpYSBTUEkgcG9ydCAqLworCW1zbGVlcCgxMDApOworCisJLyogQ2xlYXIgc2VyX2Jvb3RfY3RsIGJpdCAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwxLCAweDAwMDApOworCisJYm54Mnhfc2F2ZV9iY21fc3Bpcm9tX3ZlcihicCwgcG9ydCwKKwkJCQlleHRfcGh5X3R5cGUsCisJCQkJZXh0X3BoeV9hZGRyLAorCQkJCXNobWVtX2Jhc2UpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9iY204MDczX2V4dGVybmFsX3JvbV9ib290KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsCisJCQkJCSAgdTggZXh0X3BoeV9hZGRyLAorCQkJCQkgIHUzMiBzaG1lbV9iYXNlKQoreworCWJueDJ4X2JjbTgwNzNfYmNtODcyN19leHRlcm5hbF9yb21fYm9vdChicCwgcG9ydCwgZXh0X3BoeV9hZGRyLAorCQkJCQkgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCQkJIHNobWVtX2Jhc2UpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9iY204NzI3X2V4dGVybmFsX3JvbV9ib290KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsCisJCQkJCSAgdTggZXh0X3BoeV9hZGRyLAorCQkJCQkgIHUzMiBzaG1lbV9iYXNlKQoreworCWJueDJ4X2JjbTgwNzNfYmNtODcyN19leHRlcm5hbF9yb21fYm9vdChicCwgcG9ydCwgZXh0X3BoeV9hZGRyLAorCQkJCQkgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKKwkJCQkJIHNobWVtX2Jhc2UpOworCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2JjbTg3MjZfZXh0ZXJuYWxfcm9tX2Jvb3Qoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwkvKiBOZWVkIHRvIHdhaXQgMTAwbXMgYWZ0ZXIgcmVzZXQgKi8KKwltc2xlZXAoMTAwKTsKKworCS8qIE1pY3JvIGNvbnRyb2xsZXIgcmUtYm9vdCAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkwsCisJCSAgICAgICAweDAxOEIpOworCisJLyogU2V0IHNvZnQgcmVzZXQgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9NSUNST19SRVNFVCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX01JU0NfQ1RSTDEsIDB4MDAwMSk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9SRVNFVF9JTlRFUk5BTF9NUCk7CisKKwkvKiB3YWl0IGZvciAxNTBtcyBmb3IgbWljcm9jb2RlIGxvYWQgKi8KKwltc2xlZXAoMTUwKTsKKworCS8qIERpc2FibGUgc2VyaWFsIGJvb3QgY29udHJvbCwgdHJpc3RhdGVzIHBpbnMgU1NfTiwgU0NLLCBNT1NJLCBNSVNPICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwxLCAweDAwMDApOworCisJbXNsZWVwKDIwMCk7CisJYm54Mnhfc2F2ZV9iY21fc3Bpcm9tX3ZlcihicCwgcG9ydCwKKwkJCQlleHRfcGh5X3R5cGUsCisJCQkJZXh0X3BoeV9hZGRyLAorCQkJCXBhcmFtcy0+c2htZW1fYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwKKwkJCQkgICAgdTMyIGV4dF9waHlfdHlwZSwgdTggZXh0X3BoeV9hZGRyLAorCQkJCSAgICB1OCB0eF9lbikKK3sKKwl1MTYgdmFsOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIHRyYW5zbWl0dGVyIHR4X2VuPSV4IGZvciBwb3J0ICV4XG4iLAorCQkgdHhfZW4sIHBvcnQpOworCS8qIERpc2FibGUvRW5hYmxlIHRyYW5zbWl0dGVyICggVFggbGFzZXIgb2YgdGhlIFNGUCsgbW9kdWxlLikqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKKwkJICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsCisJCSAgICAgICZ2YWwpOworCisJaWYgKHR4X2VuKQorCQl2YWwgJj0gfigxPDwxNSk7CisJZWxzZQorCQl2YWwgfD0gKDE8PDE1KTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKKwkJICAgICAgIHZhbCk7Cit9CisKK3N0YXRpYyB1OCBibngyeF84NzI2X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgdTE2IGFkZHIsIHU4IGJ5dGVfY250LCB1OCAqb19idWYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHZhbCA9IDA7CisJdTE2IGk7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwlpZiAoYnl0ZV9jbnQgPiAxNikgeworCQlEUChORVRJRl9NU0dfTElOSywgIlJlYWRpbmcgZnJvbSBlZXByb20gaXMiCisJCQkgICAgIiBpcyBsaW1pdGVkIHRvIDB4ZlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBTZXQgdGhlIHJlYWQgY29tbWFuZCBieXRlIGNvdW50ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9CWVRFX0NOVCwKKwkJICAgICAgIChieXRlX2NudCB8IDB4YTAwMCkpOworCisJLyogU2V0IHRoZSByZWFkIGNvbW1hbmQgYWRkcmVzcyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfTUVNX0FERFIsCisJCSAgICAgICBhZGRyKTsKKworCS8qIEFjdGl2YXRlIHJlYWQgY29tbWFuZCAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTCwKKwkJICAgICAgIDB4MmMwZik7CisKKwkvKiBXYWl0IHVwIHRvIDUwMHVzIGZvciBjb21tYW5kIGNvbXBsZXRlIHN0YXR1cyAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTCwgJnZhbCk7CisJCWlmICgodmFsICYgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMX1NUQVRVU19NQVNLKSA9PQorCQkgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9TVEFUVVNfQ09NUExFVEUpCisJCQlicmVhazsKKwkJdWRlbGF5KDUpOworCX0KKworCWlmICgodmFsICYgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMX1NUQVRVU19NQVNLKSAhPQorCQkgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9TVEFUVVNfQ09NUExFVEUpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkgIkdvdCBiYWQgc3RhdHVzIDB4JXggd2hlbiByZWFkaW5nIGZyb20gU0ZQKyBFRVBST01cbiIsCisJCQkgKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSZWFkIHRoZSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZV9jbnQ7IGkrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR184NzI2X1RXT19XSVJFX0RBVEFfQlVGICsgaSwgJnZhbCk7CisJCW9fYnVmW2ldID0gKHU4KSh2YWwgJiBNRElPX1BNQV9SRUdfODcyNl9UV09fV0lSRV9EQVRBX01BU0spOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTCwgJnZhbCk7CisJCWlmICgodmFsICYgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMX1NUQVRVU19NQVNLKSA9PQorCQkgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9TVEFUVVNfSURMRSkKKwkJCXJldHVybiAwOzsKKwkJbXNsZWVwKDEpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHU4IGJueDJ4Xzg3MjdfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICB1MTYgYWRkciwgdTggYnl0ZV9jbnQsIHU4ICpvX2J1ZikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgdmFsLCBpOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCisJaWYgKGJ5dGVfY250ID4gMTYpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJSZWFkaW5nIGZyb20gZWVwcm9tIGlzIgorCQkJICAgICIgaXMgbGltaXRlZCB0byAweGZcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBOZWVkIHRvIHJlYWQgZnJvbSAxLjgwMDAgdG8gY2xlYXIgaXQgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTCwKKwkJICAgICAgJnZhbCk7CisKKwkvKiBTZXQgdGhlIHJlYWQgY29tbWFuZCBieXRlIGNvdW50ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9CWVRFX0NOVCwKKwkJICAgICAgICgoYnl0ZV9jbnQgPCAyKSA/IDIgOiBieXRlX2NudCkpOworCisJLyogU2V0IHRoZSByZWFkIGNvbW1hbmQgYWRkcmVzcyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfTUVNX0FERFIsCisJCSAgICAgICBhZGRyKTsKKwkvKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICAweDgwMDQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfODcyN19UV09fV0lSRV9EQVRBX0JVRik7CisKKwkvKiBBY3RpdmF0ZSByZWFkIGNvbW1hbmQgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsCisJCSAgICAgICAweDgwMDIpOworCS8qIFdhaXQgYXBwcm9wcmlhdGUgdGltZSBmb3IgdHdvLXdpcmUgY29tbWFuZCB0byBmaW5pc2ggYmVmb3JlCisJcG9sbGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJbXNsZWVwKDEpOworCisJLyogV2FpdCB1cCB0byA1MDB1cyBmb3IgY29tbWFuZCBjb21wbGV0ZSBzdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsICZ2YWwpOworCQlpZiAoKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykgPT0KKwkJICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfU1RBVFVTX0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXVkZWxheSg1KTsKKwl9CisKKwlpZiAoKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykgIT0KKwkJICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfU1RBVFVTX0NPTVBMRVRFKSB7CisJCURQKE5FVElGX01TR19MSU5LLAorCQkJICJHb3QgYmFkIHN0YXR1cyAweCV4IHdoZW4gcmVhZGluZyBmcm9tIFNGUCsgRUVQUk9NXG4iLAorCQkJICh2YWwgJiBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkxfU1RBVFVTX01BU0spKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVhZCB0aGUgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IGJ5dGVfY250OyBpKyspIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICBNRElPX1BNQV9SRUdfODcyN19UV09fV0lSRV9EQVRBX0JVRiArIGksICZ2YWwpOworCQlvX2J1ZltpXSA9ICh1OCkodmFsICYgTURJT19QTUFfUkVHXzg3MjdfVFdPX1dJUkVfREFUQV9NQVNLKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsICZ2YWwpOworCQlpZiAoKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykgPT0KKwkJICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfU1RBVFVTX0lETEUpCisJCQlyZXR1cm4gMDs7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordTggYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTE2IGFkZHIsCisJCQkJICAgICB1OCBieXRlX2NudCwgdTggKm9fYnVmKQoreworCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKworCWlmIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNikKKwkJcmV0dXJuIGJueDJ4Xzg3MjZfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsIGFkZHIsCisJCQkJCQkgICAgICAgYnl0ZV9jbnQsIG9fYnVmKTsKKwllbHNlIGlmIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNykKKwkJcmV0dXJuIGJueDJ4Xzg3MjdfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsIGFkZHIsCisJCQkJCQkgICAgICAgYnl0ZV9jbnQsIG9fYnVmKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHU4IGJueDJ4X2dldF9lZGNfbW9kZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHUxNiAqZWRjX21vZGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggdmFsLCBjaGVja19saW1pdGluZ19tb2RlID0gMDsKKwkqZWRjX21vZGUgPSBFRENfTU9ERV9MSU1JVElORzsKKworCS8qIEZpcnN0IGNoZWNrIGZvciBjb3BwZXIgY2FibGUgKi8KKwlpZiAoYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsCisJCQkJICAgICAgIFNGUF9FRVBST01fQ09OX1RZUEVfQUREUiwKKwkJCQkgICAgICAgMSwKKwkJCQkgICAgICAgJnZhbCkgIT0gMCkgeworCQlEUChORVRJRl9NU0dfTElOSywgIkZhaWxlZCB0byByZWFkIGZyb20gU0ZQKyBtb2R1bGUgRUVQUk9NXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIFNGUF9FRVBST01fQ09OX1RZUEVfVkFMX0NPUFBFUjoKKwl7CisJCXU4IGNvcHBlcl9tb2R1bGVfdHlwZTsKKworCQkvKiBDaGVjayBpZiBpdHMgYWN0aXZlIGNhYmxlKCBpbmNsdWRlcyBTRlArIG1vZHVsZSkKKwkJb2YgcGFzc2l2ZSBjYWJsZSovCisJCWlmIChibngyeF9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tKHBhcmFtcywKKwkJCQkJICAgICAgIFNGUF9FRVBST01fRkNfVFhfVEVDSF9BRERSLAorCQkJCQkgICAgICAgMSwKKwkJCQkJICAgICAgICZjb3BwZXJfbW9kdWxlX3R5cGUpICE9CisJCSAgICAwKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkiRmFpbGVkIHRvIHJlYWQgY29wcGVyLWNhYmxlLXR5cGUiCisJCQkJIiBmcm9tIFNGUCsgRUVQUk9NXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNvcHBlcl9tb2R1bGVfdHlwZSAmCisJCSAgICBTRlBfRUVQUk9NX0ZDX1RYX1RFQ0hfQklUTUFTS19DT1BQRVJfQUNUSVZFKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkFjdGl2ZSBDb3BwZXIgY2FibGUgZGV0ZWN0ZWRcbiIpOworCQkJY2hlY2tfbGltaXRpbmdfbW9kZSA9IDE7CisJCX0gZWxzZSBpZiAoY29wcGVyX21vZHVsZV90eXBlICYKKwkJCVNGUF9FRVBST01fRkNfVFhfVEVDSF9CSVRNQVNLX0NPUFBFUl9QQVNTSVZFKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJQYXNzaXZlIENvcHBlciIKKwkJCQkJICAgICIgY2FibGUgZGV0ZWN0ZWRcbiIpOworCQkJCSplZGNfbW9kZSA9CisJCQkJICAgICAgRURDX01PREVfUEFTU0lWRV9EQUM7CisJCX0gZWxzZSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIlVua25vd24gY29wcGVyLWNhYmxlLSIKKwkJCQkgICAgICJ0eXBlIDB4JXggISEhXG4iLCBjb3BwZXJfbW9kdWxlX3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU0ZQX0VFUFJPTV9DT05fVFlQRV9WQUxfTEM6CisJCURQKE5FVElGX01TR19MSU5LLCAiT3B0aWMgbW9kdWxlIGRldGVjdGVkXG4iKTsKKwkJY2hlY2tfbGltaXRpbmdfbW9kZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURQKE5FVElGX01TR19MSU5LLCAiVW5hYmxlIHRvIGRldGVybWluZSBtb2R1bGUgdHlwZSAweCV4ICEhIVxuIiwKKwkJCSB2YWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hlY2tfbGltaXRpbmdfbW9kZSkgeworCQl1OCBvcHRpb25zW1NGUF9FRVBST01fT1BUSU9OU19TSVpFXTsKKwkJaWYgKGJueDJ4X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGFyYW1zLAorCQkJCQkgICAgICAgU0ZQX0VFUFJPTV9PUFRJT05TX0FERFIsCisJCQkJCSAgICAgICBTRlBfRUVQUk9NX09QVElPTlNfU0laRSwKKwkJCQkJICAgICAgIG9wdGlvbnMpICE9IDApIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiRmFpbGVkIHRvIHJlYWQgT3B0aW9uIgorCQkJCSIgZmllbGQgZnJvbSBtb2R1bGUgRUVQUk9NXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgob3B0aW9uc1swXSAmIFNGUF9FRVBST01fT1BUSU9OU19MSU5FQVJfUlhfT1VUX01BU0spKQorCQkJKmVkY19tb2RlID0gRURDX01PREVfTElORUFSOworCQllbHNlCisJCQkqZWRjX21vZGUgPSBFRENfTU9ERV9MSU1JVElORzsKKwl9CisJRFAoTkVUSUZfTVNHX0xJTkssICJFREMgbW9kZSBpcyBzZXQgdG8gMHgleFxuIiwgKmVkY19tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWFkIHRoZSByZWxldmFudCBmaWVsZCBmcm9tIHRoZSBtb2R1bGUgKCBTRlArICksCisJYW5kIHZlcmlmeSBpdCBpcyBjb21wbGlhbnQgd2l0aCB0aGlzIGJvYXJkICovCitzdGF0aWMgdTggYm54MnhfdmVyaWZ5X3NmcF9tb2R1bGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIHZhbDsKKwl1MzIgZndfcmVzcDsKKwljaGFyIHZlbmRvcl9uYW1lW1NGUF9FRVBST01fVkVORE9SX05BTUVfU0laRSsxXTsKKwljaGFyIHZlbmRvcl9wbltTRlBfRUVQUk9NX1BBUlRfTk9fU0laRSsxXTsKKworCXZhbCA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCSBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBkZXZfaW5mby4KKwkJCQkgIHBvcnRfZmVhdHVyZV9jb25maWdbcGFyYW1zLT5wb3J0XS5jb25maWcpKTsKKwlpZiAoKHZhbCAmIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9NQVNLKSA9PQorCSAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTk9fRU5GT1JDRU1FTlQpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJOT1QgZW5mb3JjaW5nIG1vZHVsZSB2ZXJpZmljYXRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBc2sgdGhlIEZXIHRvIHZhbGlkYXRlIHRoZSBtb2R1bGUgKi8KKwlpZiAoIShwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKKwkgICAgICBGRUFUVVJFX0NPTkZJR19CQ19TVVBQT1JUU19PUFRfTURMX1ZSRlkpKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiRlcgZG9lcyBub3Qgc3VwcG9ydCBPUFQgTURMICIKKwkJCSAgICAidmVyaWZpY2F0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZndfcmVzcCA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9WUkZZX09QVF9NREwpOworCWlmIChmd19yZXNwID09IEZXX01TR19DT0RFX1ZSRllfT1BUX01ETF9TVUNDRVNTKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiQXBwcm92ZWQgbW9kdWxlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZm9ybWF0IHRoZSB3YXJuaW5nIG1lc3NhZ2UgKi8KKwlpZiAoYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsCisJCQkJICAgICAgIFNGUF9FRVBST01fVkVORE9SX05BTUVfQUREUiwKKwkJCQkgICAgICAgU0ZQX0VFUFJPTV9WRU5ET1JfTkFNRV9TSVpFLAorCQkJCSAgICAgICAodTggKil2ZW5kb3JfbmFtZSkpCisJCXZlbmRvcl9uYW1lWzBdID0gJ1wwJzsKKwllbHNlCisJCXZlbmRvcl9uYW1lW1NGUF9FRVBST01fVkVORE9SX05BTUVfU0laRV0gPSAnXDAnOworCWlmIChibngyeF9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tKHBhcmFtcywKKwkJCQkgICAgICAgU0ZQX0VFUFJPTV9QQVJUX05PX0FERFIsCisJCQkJICAgICAgIFNGUF9FRVBST01fUEFSVF9OT19TSVpFLAorCQkJCSAgICAgICAodTggKil2ZW5kb3JfcG4pKQorCQl2ZW5kb3JfcG5bMF0gPSAnXDAnOworCWVsc2UKKwkJdmVuZG9yX3BuW1NGUF9FRVBST01fUEFSVF9OT19TSVpFXSA9ICdcMCc7CisKKwluZXRkZXZfaW5mbyhicC0+ZGV2LCAiV2FybmluZzogVW5xdWFsaWZpZWQgU0ZQKyBtb2R1bGUgZGV0ZWN0ZWQsIFBvcnQgJWQgZnJvbSAlcyBwYXJ0IG51bWJlciAlc1xuIiwKKwkJICAgIHBhcmFtcy0+cG9ydCwgdmVuZG9yX25hbWUsIHZlbmRvcl9wbik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB1OCBibngyeF9iY204NzI2X3NldF9saW1pdGluZ19tb2RlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQl1MTYgZWRjX21vZGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MTYgY3VyX2xpbWl0aW5nX21vZGU7CisKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMiwKKwkJICAgICAgJmN1cl9saW1pdGluZ19tb2RlKTsKKwlEUChORVRJRl9NU0dfTElOSywgIkN1cnJlbnQgTGltaXRpbmcgbW9kZSBpcyAweCV4XG4iLAorCQkgY3VyX2xpbWl0aW5nX21vZGUpOworCisJaWYgKGVkY19tb2RlID09IEVEQ19NT0RFX0xJTUlUSU5HKSB7CisJCURQKE5FVElGX01TR19MSU5LLAorCQkJICJTZXR0aW5nIExJTUlUSU5HIE1PREVcbiIpOworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsCisJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMiwKKwkJCSAgICAgICBFRENfTU9ERV9MSU1JVElORyk7CisJfSBlbHNlIHsgLyogTFJNIG1vZGUgKCBkZWZhdWx0ICkqLworCisJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBMUk0gTU9ERVxuIik7CisKKwkJLyogQ2hhbmdpbmcgdG8gTFJNIG1vZGUgdGFrZXMgcXVpdGUgZmV3IHNlY29uZHMuCisJCVNvIGRvIGl0IG9ubHkgaWYgY3VycmVudCBtb2RlIGlzIGxpbWl0aW5nCisJCSggZGVmYXVsdCBpcyBMUk0gKSovCisJCWlmIChjdXJfbGltaXRpbmdfbW9kZSAhPSBFRENfTU9ERV9MSU1JVElORykKKwkJCXJldHVybiAwOworCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNiwKKwkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICAgTURJT19QTUFfUkVHX0xSTV9NT0RFLAorCQkJICAgICAgIDApOworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsCisJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMiwKKwkJCSAgICAgICAweDEyOCk7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNiwKKwkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICAgTURJT19QTUFfUkVHX01JU0NfQ1RSTDAsCisJCQkgICAgICAgMHg0MDA4KTsKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2LAorCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgICBNRElPX1BNQV9SRUdfTFJNX01PREUsCisJCQkgICAgICAgMHhhYWFhKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBibngyeF9iY204NzI3X3NldF9saW1pdGluZ19tb2RlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQl1MTYgZWRjX21vZGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1MTYgcGh5X2lkZW50aWZpZXI7CisJdTE2IHJvbV92ZXIyX3ZhbDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKworCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKKwkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKKwkJICAgICAgICZwaHlfaWRlbnRpZmllcik7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLAorCQkgICAgICAgKHBoeV9pZGVudGlmaWVyICYgfigxPDw5KSkpOworCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAorCQkgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjIsCisJCSAgICAgICZyb21fdmVyMl92YWwpOworCS8qIEtlZXAgdGhlIE1TQiA4LWJpdHMsIGFuZCBzZXQgdGhlIExTQiA4LWJpdHMgd2l0aCB0aGUgZWRjX21vZGUgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX1JPTV9WRVIyLAorCQkgICAgICAgKHJvbV92ZXIyX3ZhbCAmIDB4ZmYwMCkgfCAoZWRjX21vZGUgJiAweDAwZmYpKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsCisJCSAgICAgICAocGh5X2lkZW50aWZpZXIgfCAoMTw8OSkpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1OCBibngyeF93YWl0X2Zvcl9zZnBfbW9kdWxlX2luaXRpYWxpemVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXU4IHZhbDsKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgdGltZW91dDsKKwkvKiBJbml0aWFsaXphdGlvbiB0aW1lIGFmdGVyIGhvdC1wbHVnIG1heSB0YWtlIHVwIHRvIDMwMG1zIGZvciBzb21lCisJcGh5cyB0eXBlICggZS5nLiBKRFNVICkgKi8KKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgNjA7IHRpbWVvdXQrKykgeworCQlpZiAoYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsIDEsIDEsICZ2YWwpCisJCSAgICA9PSAwKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIlNGUCsgbW9kdWxlIGluaXRpYWxpemF0aW9uICIKKwkJCQkgICAgICJ0b29rICVkIG1zXG4iLCB0aW1lb3V0ICogNSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltc2xlZXAoNSk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBibngyeF84NzI3X3Bvd2VyX21vZHVsZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICB1OCBleHRfcGh5X2FkZHIsIHU4IGlzX3Bvd2VyX3VwKSB7CisJLyogTWFrZSBzdXJlIEdQSU9zIGFyZSBub3QgdXNpbmcgZm9yIExFRCBtb2RlICovCisJdTE2IHZhbDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCS8qCisJICogSW4gdGhlIEdQSU8gcmVnaXN0ZXIsIGJpdCA0IGlzIHVzZSB0byBkZXRlbWluZSBpZiB0aGUgR1BJT3MgYXJlCisJICogb3BlcmF0aW5nIGFzIElOUFVUIG9yIGFzIE9VVFBVVC4gQml0IDEgaXMgZm9yIGlucHV0LCBhbmQgMCBmb3IKKwkgKiBvdXRwdXQKKwkgKiBCaXRzIDAtMSBkZXRlcm1pbmUgdGhlIGdwaW9zIHZhbHVlIGZvciBPVVRQVVQgaW4gY2FzZSBiaXQgNCB2YWwgaXMgMAorCSAqIEJpdHMgOC05IGRldGVybWluZSB0aGUgZ3Bpb3MgdmFsdWUgZm9yIElOUFVUIGluIGNhc2UgYml0IDQgdmFsIGlzIDEKKwkgKiB3aGVyZSB0aGUgMXN0IGJpdCBpcyB0aGUgb3Zlci1jdXJyZW50KG9ubHkgaW5wdXQpLCBhbmQgMm5kIGJpdCBpcworCSAqIGZvciBwb3dlciggb25seSBvdXRwdXQgKQorCSovCisKKwkvKgorCSAqIEluIGNhc2Ugb2YgTk9DIGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIHBvd2VyIGlzIHVwLCBzZXQgR1BJTyBjb250cm9sCisJICogIGFzIGlucHV0IHRvIGVuYWJsZSBsaXN0ZW5pbmcgb2Ygb3Zlci1jdXJyZW50IGluZGljYXRpb24KKwkgKi8KKworCWlmICghKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgorCSAgICAgIEZFQVRVUkVfQ09ORklHX0JDTTg3MjdfTk9DKSAmJiBpc19wb3dlcl91cCkKKwkJdmFsID0gKDE8PDQpOworCWVsc2UKKwkJLyoKKwkJICogU2V0IEdQSU8gY29udHJvbCB0byBPVVRQVVQsIGFuZCBzZXQgdGhlIHBvd2VyIGJpdAorCQkgKiB0byBhY2NvcmRpbmcgdG8gdGhlIGlzX3Bvd2VyX3VwCisJCSAqLworCQl2YWwgPSAoKCEoaXNfcG93ZXJfdXApKSA8PCAxKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfODcyN19HUElPX0NUUkwsCisJCSAgICAgICB2YWwpOworfQorCitzdGF0aWMgdTggYm54Mnhfc2ZwX21vZHVsZV9kZXRlY3Rpb24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IGVkY19tb2RlOworCXU4IHJjID0gMDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJdTMyIHZhbCA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCisJCQkJICAgICBwb3J0X2ZlYXR1cmVfY29uZmlnW3BhcmFtcy0+cG9ydF0uY29uZmlnKSk7CisKKwlEUChORVRJRl9NU0dfTElOSywgIlNGUCsgbW9kdWxlIHBsdWdnZWQgaW4vb3V0IGRldGVjdGVkIG9uIHBvcnQgJWRcbiIsCisJCSBwYXJhbXMtPnBvcnQpOworCisJaWYgKGJueDJ4X2dldF9lZGNfbW9kZShwYXJhbXMsICZlZGNfbW9kZSkgIT0gMCkgeworCQlEUChORVRJRl9NU0dfTElOSywgIkZhaWxlZCB0byBnZXQgdmFsaWQgbW9kdWxlIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKGJueDJ4X3ZlcmlmeV9zZnBfbW9kdWxlKHBhcmFtcykgIT0KKwkJICAgMCkgeworCQkvKiBjaGVjayBTRlArIG1vZHVsZSBjb21wYXRpYmlsaXR5ICovCisJCURQKE5FVElGX01TR19MSU5LLCAiTW9kdWxlIHZlcmlmaWNhdGlvbiBmYWlsZWQhIVxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJLyogVHVybiBvbiBmYXVsdCBtb2R1bGUtZGV0ZWN0ZWQgbGVkICovCisJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzAsCisJCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX0hJR0gsCisJCQkJICBwYXJhbXMtPnBvcnQpOworCQlpZiAoKGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3KSAmJgorCQkgICAgKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KKwkJICAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfUE9XRVJfRE9XTikpIHsKKwkJCS8qIFNodXRkb3duIFNGUCsgbW9kdWxlICovCisJCQlEUChORVRJRl9NU0dfTElOSywgIlNodXRkb3duIFNGUCsgbW9kdWxlISFcbiIpOworCQkJYm54MnhfODcyN19wb3dlcl9tb2R1bGUoYnAsIHBhcmFtcywKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLCAwKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFR1cm4gb2ZmIGZhdWx0IG1vZHVsZS1kZXRlY3RlZCBsZWQgKi8KKwkJRFAoTkVUSUZfTVNHX0xJTkssICJUdXJuIG9mZiBmYXVsdCBtb2R1bGUtZGV0ZWN0ZWQgbGVkXG4iKTsKKwkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMCwKKwkJCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX0xPVywKKwkJCQkJICBwYXJhbXMtPnBvcnQpOworCX0KKworCS8qIHBvd2VyIHVwIHRoZSBTRlAgbW9kdWxlICovCisJaWYgKGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3KQorCQlibngyeF84NzI3X3Bvd2VyX21vZHVsZShicCwgcGFyYW1zLCBleHRfcGh5X2FkZHIsIDEpOworCisJLyogQ2hlY2sgYW5kIHNldCBsaW1pdGluZyBtb2RlIC8gTFJNIG1vZGUgb24gODcyNi4KKwlPbiA4NzI3IGl0IGlzIGRvbmUgYXV0b21hdGljYWxseSAqLworCWlmIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNikKKwkJYm54MnhfYmNtODcyNl9zZXRfbGltaXRpbmdfbW9kZShwYXJhbXMsIGVkY19tb2RlKTsKKwllbHNlCisJCWJueDJ4X2JjbTg3Mjdfc2V0X2xpbWl0aW5nX21vZGUocGFyYW1zLCBlZGNfbW9kZSk7CisJLyoKKwkgKiBFbmFibGUgdHJhbnNtaXQgZm9yIHRoaXMgbW9kdWxlIGlmIHRoZSBtb2R1bGUgaXMgYXBwcm92ZWQsIG9yCisJICogaWYgdW5hcHByb3ZlZCBtb2R1bGVzIHNob3VsZCBhbHNvIGVuYWJsZSB0aGUgVHggbGFzZXIKKwkgKi8KKwlpZiAocmMgPT0gMCB8fAorCSAgICAodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spICE9CisJICAgIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9ESVNBQkxFX1RYX0xBU0VSKQorCQlibngyeF9zZnBfc2V0X3RyYW5zbWl0dGVyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCWV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLCAxKTsKKwllbHNlCisJCWJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsIDApOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIGJueDJ4X2hhbmRsZV9tb2R1bGVfZGV0ZWN0X2ludChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgZ3Bpb192YWw7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKworCS8qIFNldCB2YWxpZCBtb2R1bGUgbGVkIG9mZiAqLworCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzAsCisJCQkgIE1JU0NfUkVHSVNURVJTX0dQSU9fSElHSCwKKwkJCSAgcGFyYW1zLT5wb3J0KTsKKworCS8qIEdldCBjdXJyZW50IGdwaW8gdmFsIHJlZmVsZWN0aW5nIG1vZHVsZSBwbHVnZ2VkIGluIC8gb3V0Ki8KKwlncGlvX3ZhbCA9IGJueDJ4X2dldF9ncGlvKGJwLCAgTUlTQ19SRUdJU1RFUlNfR1BJT18zLCBwb3J0KTsKKworCS8qIENhbGwgdGhlIGhhbmRsaW5nIGZ1bmN0aW9uIGluIGNhc2UgbW9kdWxlIGlzIGRldGVjdGVkICovCisJaWYgKGdwaW9fdmFsID09IDApIHsKKworCQlibngyeF9zZXRfZ3Bpb19pbnQoYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKKwkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX0lOVF9PVVRQVVRfQ0xSLAorCQkJCSAgICAgIHBvcnQpOworCisJCWlmIChibngyeF93YWl0X2Zvcl9zZnBfbW9kdWxlX2luaXRpYWxpemVkKHBhcmFtcykgPT0KKwkJICAgIDApCisJCQlibngyeF9zZnBfbW9kdWxlX2RldGVjdGlvbihwYXJhbXMpOworCQllbHNlCisJCQlEUChORVRJRl9NU0dfTElOSywgIlNGUCsgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZFxuIik7CisJfSBlbHNlIHsKKwkJdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwkJdTMyIGV4dF9waHlfdHlwZSA9CisJCQlYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJdTMyIHZhbCA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sIGRldl9pbmZvLgorCQkJCQkgICAgICBwb3J0X2ZlYXR1cmVfY29uZmlnW3BhcmFtcy0+cG9ydF0uCisJCQkJCSAgICAgIGNvbmZpZykpOworCisJCWJueDJ4X3NldF9ncGlvX2ludChicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18zLAorCQkJCSAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX09VVFBVVF9TRVQsCisJCQkJICAgICAgcG9ydCk7CisJCS8qIE1vZHVsZSB3YXMgcGx1Z2dlZCBvdXQuICovCisJCS8qIERpc2FibGUgdHJhbnNtaXQgZm9yIHRoaXMgbW9kdWxlICovCisJCWlmICgodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spID09CisJCSAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfRElTQUJMRV9UWF9MQVNFUikKKwkJCWJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJCWV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2JjbTgwN3hfZm9yY2VfMTBHKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCisJLyogRm9yY2UgS1Igb3IgS1ggKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCisJCSAgICAgICAweDIwNDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfMTBHX0NUUkwyLAorCQkgICAgICAgMHgwMDBiKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0JDTV9DVFJMLAorCQkgICAgICAgMHgwMDAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCSAgICAgICBNRElPX0FOX1JFR19DVFJMLAorCQkgICAgICAgMHgwMDAwKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfYmNtODA3M19zZXRfeGF1aV9sb3dfcG93ZXJfbW9kZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUxNiB2YWw7CisJdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgIE1ESU9fUE1BX1JFR184MDczX0NISVBfUkVWLCAmdmFsKTsKKworCWlmICh2YWwgPT0gMCkgeworCQkvKiBNdXN0bid0IHNldCBsb3cgcG93ZXIgbW9kZSBpbiA4MDczIEEwICovCisJCXJldHVybjsKKwl9CisKKwkvKiBEaXNhYmxlIFBMTCBzZXF1ZW5jZXIgKHVzZSByZWFkLW1vZGlmeS13cml0ZSB0byBjbGVhciBiaXQgMTMpICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fWFNfREVWQUQsCisJCSAgICAgICBNRElPX1hTX1BMTF9TRVFVRU5DRVIsICZ2YWwpOworCXZhbCAmPSB+KDE8PDEzKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fWFNfREVWQUQsIE1ESU9fWFNfUExMX1NFUVVFTkNFUiwgdmFsKTsKKworCS8qIFBMTCBjb250cm9scyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MDVFLCAweDEwNzcpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MDVELCAweDAwMDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MDVDLCAweDAzMEIpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MDVCLCAweDEyNDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MDVBLCAweDI0OTApOworCisJLyogVHggQ29udHJvbHMgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODBBNywgMHgwQzc0KTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODBBNiwgMHg5MDQxKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODBBNSwgMHg0NjQwKTsKKworCS8qIFJ4IENvbnRyb2xzICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1hTX0RFVkFELCAweDgwRkUsIDB4MDFDNCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1hTX0RFVkFELCAweDgwRkQsIDB4OTI0OSk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1hTX0RFVkFELCAweDgwRkMsIDB4MjAxNSk7CisKKwkvKiBFbmFibGUgUExMIHNlcXVlbmNlciAgKHVzZSByZWFkLW1vZGlmeS13cml0ZSB0byBzZXQgYml0IDEzKSAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1hTX0RFVkFELAorCQkgICAgICAgTURJT19YU19QTExfU0VRVUVOQ0VSLCAmdmFsKTsKKwl2YWwgfD0gKDE8PDEzKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fWFNfREVWQUQsIE1ESU9fWFNfUExMX1NFUVVFTkNFUiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfODA3M19zZXRfcGF1c2VfY2wzNyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IGNsMzdfdmFsOworCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKworCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJICAgICAgTURJT19BTl9SRUdfQ0wzN19GQ19MRCwgJmNsMzdfdmFsKTsKKworCWNsMzdfdmFsICY9IH5NRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIOworCS8qIFBsZWFzZSByZWZlciB0byBUYWJsZSAyOEItMyBvZiA4MDIuM2FiLTE5OTkgc3BlYy4gKi8KKworCWlmICgodmFycy0+aWVlZV9mYyAmCisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX1NZTU1FVFJJQykgPT0KKwkgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfU1lNTUVUUklDKSB7CisJCWNsMzdfdmFsIHw9ICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9TWU1NRVRSSUM7CisJfQorCWlmICgodmFycy0+aWVlZV9mYyAmCisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUMpID09CisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUMpIHsKKwkJY2wzN192YWwgfD0gIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUM7CisJfQorCWlmICgodmFycy0+aWVlZV9mYyAmCisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpID09CisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpIHsKKwkJY2wzN192YWwgfD0gTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDsKKwl9CisJRFAoTkVUSUZfTVNHX0xJTkssCisJCSAiRXh0IHBoeSBBTiBhZHZlcnRpemUgY2wzNyAweCV4XG4iLCBjbDM3X3ZhbCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkgICAgICAgTURJT19BTl9SRUdfQ0wzN19GQ19MRCwgY2wzN192YWwpOworCW1zbGVlcCg1MDApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9leHRfcGh5X3NldF9wYXVzZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHZhbDsKKwl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwkvKiByZWFkIG1vZGlmeSB3cml0ZSBwYXVzZSBhZHZlcnRpemluZyAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJICAgICAgTURJT19BTl9SRUdfQURWX1BBVVNFLCAmdmFsKTsKKworCXZhbCAmPSB+TURJT19BTl9SRUdfQURWX1BBVVNFX0JPVEg7CisKKwkvKiBQbGVhc2UgcmVmZXIgdG8gVGFibGUgMjhCLTMgb2YgODAyLjNhYi0xOTk5IHNwZWMuICovCisKKwlpZiAoKHZhcnMtPmllZWVfZmMgJgorCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDKSA9PQorCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDKSB7CisJCXZhbCB8PSAgTURJT19BTl9SRUdfQURWX1BBVVNFX0FTWU1NRVRSSUM7CisJfQorCWlmICgodmFycy0+aWVlZV9mYyAmCisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpID09CisJICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpIHsKKwkJdmFsIHw9CisJCSBNRElPX0FOX1JFR19BRFZfUEFVU0VfUEFVU0U7CisJfQorCURQKE5FVElGX01TR19MSU5LLAorCQkgIkV4dCBwaHkgQU4gYWR2ZXJ0aXplIDB4JXhcbiIsIHZhbCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJICAgICAgIE1ESU9fQU5fUkVHX0FEVl9QQVVTRSwgdmFsKTsKK30KK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9wcmVlbXBoYXNpcyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwl1MTYgYmFuaywgaSA9IDA7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwlmb3IgKGJhbmsgPSBNRElPX1JFR19CQU5LX1JYMCwgaSA9IDA7IGJhbmsgPD0gTURJT19SRUdfQkFOS19SWDM7CisJICAgICAgYmFuayArPSAoTURJT19SRUdfQkFOS19SWDEtTURJT19SRUdfQkFOS19SWDApLCBpKyspIHsKKwkJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJCSAgICAgIGJhbmssCisJCQkJCSAgICAgIE1ESU9fUlgwX1JYX0VRX0JPT1NULAorCQkJCQkgICAgICBwYXJhbXMtPnhneHNfY29uZmlnX3J4W2ldKTsKKwl9CisKKwlmb3IgKGJhbmsgPSBNRElPX1JFR19CQU5LX1RYMCwgaSA9IDA7IGJhbmsgPD0gTURJT19SRUdfQkFOS19UWDM7CisJCSAgICAgIGJhbmsgKz0gKE1ESU9fUkVHX0JBTktfVFgxIC0gTURJT19SRUdfQkFOS19UWDApLCBpKyspIHsKKwkJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJCSAgICAgIGJhbmssCisJCQkJCSAgICAgIE1ESU9fVFgwX1RYX0RSSVZFUiwKKwkJCQkJICAgICAgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFtpXSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGJueDJ4Xzg0ODFfc2V0X2xlZDQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICB1MzIgZXh0X3BoeV90eXBlLCB1OCBleHRfcGh5X2FkZHIpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwkvKiBQSFlDX0NUTF9MRURfQ1RMICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfODQ4MV9MSU5LX1NJR05BTCwgMHhhNDgyKTsKKworCS8qIFVubWFzayBMRUQ0IGZvciAxMEcgbGluayAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfU0lHTkFMX01BU0ssICgxPDw2KSk7CisJLyogJ0ludGVycnVwdCBNYXNrJyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCSAgICAgICAweEZGRkIsIDB4RkZGRCk7Cit9CitzdGF0aWMgdm9pZCBibngyeF84NDgxX3NldF9sZWdhY3lfbGVkX21vZGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCSB1MzIgZXh0X3BoeV90eXBlLCB1OCBleHRfcGh5X2FkZHIpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwkvKiBMRUQxICgxMEcgTGluayk6IERpc2FibGUgTEVEMSB3aGVuIDEwLzEwMC8xMDAwIGxpbmsgKi8KKwkvKiBMRUQyICgxRy8xMDAvMTAgTGluayk6IEVuYWJsZSBMRUQyIHdoZW4gMTAvMTAwLzEwMDAgbGluaykgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkgICAgICAgTURJT19BTl9SRUdfODQ4MV9MRUdBQ1lfU0hBRE9XLAorCQkgICAgICAgKDE8PDE1KSB8ICgweGQgPDwgMTApIHwgKDB4Yzw8NCkgfCAweGUpOworfQorCitzdGF0aWMgdm9pZCBibngyeF84NDgxX3NldF8xMEdfbGVkX21vZGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgICAgdTMyIGV4dF9waHlfdHlwZSwgdTggZXh0X3BoeV9hZGRyKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiB2YWwxOworCisJLyogTEVEMSAoMTBHIExpbmspICovCisJLyogRW5hYmxlIGNvbnRpbnVzZSBiYXNlZCBvbiBzb3VyY2UgNygxMEctbGluaykgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfTElOS19TSUdOQUwsCisJCSAgICAgICAmdmFsMSk7CisJLyogU2V0IGJpdCAyIHRvIDAsIGFuZCBiaXRzIFsxOjBdIHRvIDEwICovCisJdmFsMSAmPSB+KCgxPDwwKSB8ICgxPDwyKSB8ICgxPDw3KSk7IC8qIENsZWFyIGJpdHMgMCwyLDcqLworCXZhbDEgfD0gKCgxPDwxKSB8ICgxPDw2KSk7IC8qIFNldCBiaXQgMSwgNiAqLworCisJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfODQ4MV9MSU5LX1NJR05BTCwKKwkJICAgICAgIHZhbDEpOworCisJLyogVW5tYXNrIExFRDEgZm9yIDEwRyBsaW5rICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgTURJT19QTUFfUkVHXzg0ODFfTEVEMV9NQVNLLAorCQkgICAgICAmdmFsMSk7CisJLyogU2V0IGJpdCAyIHRvIDAsIGFuZCBiaXRzIFsxOjBdIHRvIDEwICovCisJdmFsMSB8PSAoMTw8Nyk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfODQ4MV9MRUQxX01BU0ssCisJCSAgICAgICB2YWwxKTsKKworCS8qIExFRDIgKDFHLzEwMC8xMEcgTGluaykgKi8KKwkvKiBNYXNrIExFRDIgZm9yIDEwRyBsaW5rICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCSAgICAgICBNRElPX1BNQV9SRUdfODQ4MV9MRUQyX01BU0ssCisJCSAgICAgICAwKTsKKworCS8qIFVubWFzayBMRUQzIGZvciAxMEcgbGluayAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICBNRElPX1BNQV9SRUdfODQ4MV9MRUQzX01BU0ssCisJCSAgICAgICAweDYpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfTEVEM19CTElOSywKKwkJICAgICAgIDApOworfQorCisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWxfcGh5KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKKwkJCQkgIHU4IGVuYWJsZV9jbDczKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCisJaWYgKCEodmFycy0+cGh5X2ZsYWdzICYgUEhZX1NHTUlJX0ZMQUcpKSB7CisJCWlmICgoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykgPT0KKwkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCisJCSAgICAocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCisJCSAgICAgRkVBVFVSRV9DT05GSUdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfRU5BQkxFRCkpCisJCQlibngyeF9zZXRfcHJlZW1waGFzaXMocGFyYW1zKTsKKworCQkvKiBmb3JjZWQgc3BlZWQgcmVxdWVzdGVkPyAqLworCQlpZiAodmFycy0+bGluZV9zcGVlZCAhPSBTUEVFRF9BVVRPX05FRyB8fAorCQkgICAgKChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSA9PQorCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgJiYKKwkJCSAgcGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX0VYVCkpIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAibm90IFNHTUlJLCBubyBBTlxuIik7CisKKwkJCS8qIGRpc2FibGUgYXV0b25lZyAqLworCQkJYm54Mnhfc2V0X2F1dG9uZWcocGFyYW1zLCB2YXJzLCAwKTsKKworCQkJLyogcHJvZ3JhbSBzcGVlZCBhbmQgZHVwbGV4ICovCisJCQlibngyeF9wcm9ncmFtX3NlcmRlcyhwYXJhbXMsIHZhcnMpOworCisJCX0gZWxzZSB7IC8qIEFOX21vZGUgKi8KKwkJCURQKE5FVElGX01TR19MSU5LLCAibm90IFNHTUlJLCBBTlxuIik7CisKKwkJCS8qIEFOIGVuYWJsZWQgKi8KKwkJCWJueDJ4X3NldF9icmNtX2NsMzdfYWR2ZXJ0aXNtZW50KHBhcmFtcyk7CisKKwkJCS8qIHByb2dyYW0gZHVwbGV4ICYgcGF1c2UgYWR2ZXJ0aXNlbWVudCAoZm9yIGFuZWcpICovCisJCQlibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzbWVudChwYXJhbXMsCisJCQkJCQkgICAgICAgdmFycy0+aWVlZV9mYyk7CisKKwkJCS8qIGVuYWJsZSBhdXRvbmVnICovCisJCQlibngyeF9zZXRfYXV0b25lZyhwYXJhbXMsIHZhcnMsIGVuYWJsZV9jbDczKTsKKworCQkJLyogZW5hYmxlIGFuZCByZXN0YXJ0IEFOICovCisJCQlibngyeF9yZXN0YXJ0X2F1dG9uZWcocGFyYW1zLCBlbmFibGVfY2w3Myk7CisJCX0KKworCX0gZWxzZSB7IC8qIFNHTUlJIG1vZGUgKi8KKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTR01JSVxuIik7CisKKwkJYm54MnhfaW5pdGlhbGl6ZV9zZ21paV9wcm9jZXNzKHBhcmFtcywgdmFycyk7CisJfQorfQorCitzdGF0aWMgdTggYm54MnhfZXh0X3BoeV9pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUzMiBleHRfcGh5X3R5cGU7CisJdTggZXh0X3BoeV9hZGRyOworCXUxNiBjbnQ7CisJdTE2IGN0cmwgPSAwOworCXUxNiB2YWwgPSAwOworCXU4IHJjID0gMDsKKworCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCWV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCisJCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc29mdCByZXNldCBpcyBvZmYgKGV4cGVjdCBmb3IgdGhlIDgwNzI6CisJCSAqIGR1ZSB0byB0aGUgbG9jaywgaXQgd2lsbCBiZSBkb25lIGluc2lkZSB0aGUgc3BlY2lmaWMKKwkJICogaGFuZGxpbmcpCisJCSAqLworCQlpZiAoKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCisJCSAgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0ZBSUxVUkUpICYmCisJCSAgIChleHRfcGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTk9UX0NPTk4pICYmCisJCSAgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzIpICYmCisJCSAgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMpKSB7CisJCQkvKiBXYWl0IGZvciBzb2Z0IHJlc2V0IHRvIGdldCBjbGVhcmVkIHVwdG8gMSBzZWMgKi8KKwkJCWZvciAoY250ID0gMDsgY250IDwgMTAwMDsgY250KyspIHsKKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwgJmN0cmwpOworCQkJCWlmICghKGN0cmwgJiAoMTw8MTUpKSkKKwkJCQkJYnJlYWs7CisJCQkJbXNsZWVwKDEpOworCQkJfQorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJjb250cm9sIHJlZyAweCV4IChhZnRlciAlZCBtcylcbiIsCisJCQkJIGN0cmwsIGNudCk7CisJCX0KKworCQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA1XG4iKTsKKworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwsCisJCQkJICAgICAgIDB4ODI4OCk7CisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLAorCQkJCSAgICAgICAweDdmYmYpOworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR19DTVVfUExMX0JZUEFTUywKKwkJCQkgICAgICAgMHgwMTAwKTsKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fV0lTX0RFVkFELAorCQkJCSAgICAgICBNRElPX1dJU19SRUdfTEFTSV9DTlRMLCAweDEpOworCisJCQkvKiBCQ004NzA1IGRvZXNuJ3QgaGF2ZSBtaWNyb2NvZGUsIGhlbmNlIHRoZSAwICovCisJCQlibngyeF9zYXZlX3NwaXJvbV92ZXJzaW9uKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCQlwYXJhbXMtPnNobWVtX2Jhc2UsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2OgorCQkJLyogV2FpdCB1bnRpbCBmdyBpcyBsb2FkZWQgKi8KKwkJCWZvciAoY250ID0gMDsgY250IDwgMTAwOyBjbnQrKykgeworCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCisJCQkJCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMSwgJnZhbCk7CisJCQkJaWYgKHZhbCkKKwkJCQkJYnJlYWs7CisJCQkJbXNsZWVwKDEwKTsKKwkJCX0KKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA2IGlzIGluaXRpYWxpemVkICIKKwkJCQkiYWZ0ZXIgJWQgbXNcbiIsIGNudCk7CisJCQlpZiAoKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgorCQkJICAgICBGRUFUVVJFX0NPTkZJR19PVkVSUklERV9QUkVFTVBIQVNJU19FTkFCTEVEKSkgeworCQkJCXU4IGk7CisJCQkJdTE2IHJlZzsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCXJlZyA9IE1ESU9fWFNfODcwNl9SRUdfQkFOS19SWDAgKworCQkJCQkJaSooTURJT19YU184NzA2X1JFR19CQU5LX1JYMSAtCisJCQkJCQkgICBNRElPX1hTXzg3MDZfUkVHX0JBTktfUlgwKTsKKwkJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgICBNRElPX1hTX0RFVkFELAorCQkJCQkJICAgICAgcmVnLCAmdmFsKTsKKwkJCQkJLyogQ2xlYXIgZmlyc3QgMyBiaXRzIG9mIHRoZSBjb250cm9sICovCisJCQkJCXZhbCAmPSB+MHg3OworCQkJCQkvKiBTZXQgY29udHJvbCBiaXRzIGFjY29yZGluZyB0bworCQkJCQljb25maWd1YXRpb24gKi8KKwkJCQkJdmFsIHw9IChwYXJhbXMtPnhneHNfY29uZmlnX3J4W2ldICYKKwkJCQkJCTB4Nyk7CisJCQkJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBSWCIKKwkJCQkJCSAiRXF1YWxpemVyIHRvIEJDTTg3MDYgcmVnIDB4JXgiCisJCQkJCQkgIiA8LS0gdmFsIDB4JXhcbiIsIHJlZywgdmFsKTsKKwkJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgICAgTURJT19YU19ERVZBRCwKKwkJCQkJCSAgICAgICByZWcsIHZhbCk7CisJCQkJfQorCQkJfQorCQkJLyogRm9yY2Ugc3BlZWQgKi8KKwkJCWlmIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwMDAwKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIDg3MDYgZm9yY2UgMTBHYnBzXG4iKTsKKworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0RJR0lUQUxfQ1RSTCwKKwkJCQkJICAgICAgIDB4NDAwKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCisJCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRm9yY2UgMUdicHMgdXNpbmcgYXV0b25lZyB3aXRoIDFHCisJCQkJYWR2ZXJ0aXNtZW50ICovCisKKwkJCQkvKiBBbGxvdyBDTDM3IHRocm91Z2ggQ0w3MyAqLworCQkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA2IEF1dG9OZWdcbiIpOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0NMNzMsCisJCQkJCSAgICAgICAweDA0MGMpOworCisJCQkJLyogRW5hYmxlIEZ1bGwtRHVwbGV4IGFkdmVydGlzbWVudCBvbiBDTDM3ICovCisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTFAsCisJCQkJCSAgICAgICAweDAwMjApOworCQkJCS8qIEVuYWJsZSBDTDM3IEFOICovCisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfQU4sCisJCQkJCSAgICAgICAweDEwMDApOworCQkJCS8qIDFHIHN1cHBvcnQgKi8KKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICAgTURJT19BTl9SRUdfQURWLCAoMTw8NSkpOworCisJCQkJLyogRW5hYmxlIGNsYXVzZSA3MyBBTiAqLworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX0FOX1JFR19DVFJMLAorCQkJCQkgICAgICAgMHgxMjAwKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAorCQkJCQkgICAgICAgMHgwNDAwKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIDB4MDAwNCk7CisKKwkJCX0KKwkJCWJueDJ4X3NhdmVfYmNtX3NwaXJvbV92ZXIoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJCWV4dF9waHlfdHlwZSwKKwkJCQkJCWV4dF9waHlfYWRkciwKKwkJCQkJCXBhcmFtcy0+c2htZW1fYmFzZSk7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbml0aWFsaXppbmcgQkNNODcyNlxuIik7CisJCQlibngyeF9iY204NzI2X2V4dGVybmFsX3JvbV9ib290KHBhcmFtcyk7CisKKwkJCS8qIE5lZWQgdG8gY2FsbCBtb2R1bGUgZGV0ZWN0ZWQgb24gaW5pdGlhbGl6YXRpb24gc2luY2UKKwkJCXRoZSBtb2R1bGUgZGV0ZWN0aW9uIHRyaWdnZXJlZCBieSBhY3R1YWwgbW9kdWxlCisJCQlpbnNlcnRpb24gbWlnaHQgb2NjdXIgYmVmb3JlIGRyaXZlciBpcyBsb2FkZWQsIGFuZCB3aGVuCisJCQlkcml2ZXIgaXMgbG9hZGVkLCBpdCByZXNldCBhbGwgcmVnaXN0ZXJzLCBpbmNsdWRpbmcgdGhlCisJCQl0cmFuc21pdHRlciAqLworCQkJYm54Mnhfc2ZwX21vZHVsZV9kZXRlY3Rpb24ocGFyYW1zKTsKKworCQkJLyogU2V0IEZsb3cgY29udHJvbCAqLworCQkJYm54MnhfZXh0X3BoeV9zZXRfcGF1c2UocGFyYW1zLCB2YXJzKTsKKwkJCWlmIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMUcgZm9yY2VcbiIpOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLCAweDQwKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCisJCQkJCSAgICAgICBNRElPX1BNQV9SRUdfMTBHX0NUUkwyLCAweEQpOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIDB4NSk7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNX0NUUkwsCisJCQkJCSAgICAgICAweDQwMCk7CisJCQl9IGVsc2UgaWYgKChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09CisJCQkJICAgIFNQRUVEX0FVVE9fTkVHKSAmJgorCQkJCSAgICgocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCisJCQkJICAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHKSkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMUcgY2xhdXNlMzdcbiIpOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICAgTURJT19BTl9SRUdfQURWLCAweDIwKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfQ0w3MywgMHgwNDBjKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTEQsIDB4MDAyMCk7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0FOLCAweDEwMDApOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICAgTURJT19BTl9SRUdfQ1RSTCwgMHgxMjAwKTsKKworCQkJCS8qIEVuYWJsZSBSWC1BTEFSTSBjb250cm9sIHRvIHJlY2VpdmUKKwkJCQlpbnRlcnJ1cHQgZm9yIDFHIHNwZWVkIGNoYW5nZSAqLworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIDB4NCk7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNX0NUUkwsCisJCQkJCSAgICAgICAweDQwMCk7CisKKwkJCX0gZWxzZSB7IC8qIERlZmF1bHQgMTBHLiBTZXQgb25seSBMQVNJIGNvbnRyb2wgKi8KKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCisJCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAxKTsKKwkJCX0KKworCQkJLyogU2V0IFRYIFByZUVtcGhhc2lzIGlmIG5lZWRlZCAqLworCQkJaWYgKChwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKKwkJCSAgICAgRkVBVFVSRV9DT05GSUdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfRU5BQkxFRCkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgVFhfQ1RSTDEgMHgleCwiCisJCQkJCSAiVFhfQ1RSTDIgMHgleFxuIiwKKwkJCQkJIHBhcmFtcy0+eGd4c19jb25maWdfdHhbMF0sCisJCQkJCSBwYXJhbXMtPnhneHNfY29uZmlnX3R4WzFdKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR184NzI2X1RYX0NUUkwxLAorCQkJCQkgICAgICAgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFswXSk7CisKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR184NzI2X1RYX0NUUkwyLAorCQkJCQkgICAgICAgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFsxXSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6CisJCXsKKwkJCXUxNiB0bXAxOworCQkJdTE2IHJ4X2FsYXJtX2N0cmxfdmFsOworCQkJdTE2IGxhc2lfY3RybF92YWw7CisJCQlpZiAoZXh0X3BoeV90eXBlID09CisJCQkgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MikgeworCQkJCXJ4X2FsYXJtX2N0cmxfdmFsID0gMHg0MDA7CisJCQkJbGFzaV9jdHJsX3ZhbCA9IDB4MDAwNDsKKwkJCX0gZWxzZSB7CisJCQkJcnhfYWxhcm1fY3RybF92YWwgPSAoMTw8Mik7CisJCQkJbGFzaV9jdHJsX3ZhbCA9IDB4MDAwNDsKKwkJCX0KKworCQkJLyogZW5hYmxlIExBU0kgKi8KKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICBleHRfcGh5X3R5cGUsCisJCQkJICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAorCQkJCSAgIHJ4X2FsYXJtX2N0cmxfdmFsKTsKKworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsCisJCQkJICAgICAgIGxhc2lfY3RybF92YWwpOworCisJCQlibngyeF84MDczX3NldF9wYXVzZV9jbDM3KHBhcmFtcywgdmFycyk7CisKKwkJCWlmIChleHRfcGh5X3R5cGUgPT0KKwkJCSAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyKQorCQkJCWJueDJ4X2JjbTgwNzJfZXh0ZXJuYWxfcm9tX2Jvb3QocGFyYW1zKTsKKwkJCWVsc2UKKwkJCQkvKiBJbiBjYXNlIG9mIDgwNzMgd2l0aCBsb25nIHhhdWkgbGluZXMsCisJCQkJZG9uJ3Qgc2V0IHRoZSA4MDczIHhhdWkgbG93IHBvd2VyKi8KKwkJCQlibngyeF9iY204MDczX3NldF94YXVpX2xvd19wb3dlcl9tb2RlKHBhcmFtcyk7CisKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX004MDUxX01TR09VVF9SRUcsCisJCQkJICAgICAgJnRtcDEpOworCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnRtcDEpOworCisJCQlEUChORVRJRl9NU0dfTElOSywgIkJlZm9yZSByb20gUlhfQUxBUk0ocG9ydDEpOiIKKwkJCQkJICAgICAiMHgleFxuIiwgdG1wMSk7CisKKwkJCS8qIElmIHRoaXMgaXMgZm9yY2VkIHNwZWVkLCBzZXQgdG8gS1Igb3IgS1gKKwkJCSAqIChhbGwgb3RoZXIgYXJlIG5vdCBzdXBwb3J0ZWQpCisJCQkgKi8KKwkJCWlmIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfRVhUKSB7CisJCQkJYm54MnhfYmNtODA3eF9mb3JjZV8xMEcocGFyYW1zKTsKKwkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJIkZvcmNlZCBzcGVlZCAxMEcgb24gODA3WFxuIik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQkNNX0NUUkwsCisJCQkJCSAgICAgICAweDAwMDIpOworCQkJfQorCQkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgIT0gU1BFRURfQVVUT19ORUcpIHsKKwkJCQlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgeworCQkJCQl2YWwgPSAoMTw8Nyk7CisJCQkJfSBlbHNlIGlmIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09CisJCQkJCSAgIFNQRUVEXzI1MDApIHsKKwkJCQkJdmFsID0gKDE8PDUpOworCQkJCQkvKiBOb3RlIHRoYXQgMi41RyB3b3JrcyBvbmx5CisJCQkJCXdoZW4gdXNlZCB3aXRoIDFHIGFkdmVydGlzbWVudCAqLworCQkJCX0gZWxzZQorCQkJCQl2YWwgPSAoMTw8NSk7CisJCQl9IGVsc2UgeworCisJCQkJdmFsID0gMDsKKwkJCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCisJCQkJCVBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBHKQorCQkJCQl2YWwgfD0gKDE8PDcpOworCisJCQkJLyogTm90ZSB0aGF0IDIuNUcgd29ya3Mgb25seSB3aGVuCisJCQkJdXNlZCB3aXRoIDFHIGFkdmVydGlzbWVudCAqLworCQkJCWlmIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYKKwkJCQkJKFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcgfAorCQkJCQkgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8yXzVHKSkKKwkJCQkJdmFsIHw9ICgxPDw1KTsKKwkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJICI4MDd4IGF1dG9uZWcgdmFsID0gMHgleFxuIiwgdmFsKTsKKwkJCX0KKworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkgICAgICAgTURJT19BTl9SRUdfQURWLCB2YWwpOworCQkJaWYgKGV4dF9waHlfdHlwZSA9PQorCQkJICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMpIHsKKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgIE1ESU9fQU5fUkVHXzgwNzNfMl81RywgJnRtcDEpOworCisJCQkJaWYgKCgocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCisJCQkJICAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8yXzVHKSAmJgorCQkJCSAgICAgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0KKwkJCQkgICAgICBTUEVFRF9BVVRPX05FRykpIHx8CisJCQkJICAgIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09CisJCQkJICAgICBTUEVFRF8yNTAwKSkgeworCQkJCQl1MTYgcGh5X3ZlcjsKKwkJCQkJLyogQWxsb3cgMi41RyBmb3IgQTEgYW5kIGFib3ZlICovCisJCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCQkJIGV4dF9waHlfYWRkciwKKwkJCQkJIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgTURJT19QTUFfUkVHXzgwNzNfQ0hJUF9SRVYsICZwaHlfdmVyKTsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJBZGQgMi41R1xuIik7CisJCQkJCWlmIChwaHlfdmVyID4gMCkKKwkJCQkJCXRtcDEgfD0gMTsKKwkJCQkJZWxzZQorCQkJCQkJdG1wMSAmPSAweGZmZmU7CisJCQkJfSBlbHNlIHsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJEaXNhYmxlIDIuNUdcbiIpOworCQkJCQl0bXAxICY9IDB4ZmZmZTsKKwkJCQl9CisKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICAgTURJT19BTl9SRUdfODA3M18yXzVHLCB0bXAxKTsKKwkJCX0KKworCQkJLyogQWRkIHN1cHBvcnQgZm9yIENMMzcgKHBhc3NpdmUgbW9kZSkgSUkgKi8KKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0ZDX0xELAorCQkJCSAgICAgICAmdG1wMSk7CisKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTEQsICh0bXAxIHwKKwkJCQkgICAgICAgKChwYXJhbXMtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpID8KKwkJCQkgICAgICAgMHgyMCA6IDB4NDApKSk7CisKKwkJCS8qIEFkZCBzdXBwb3J0IGZvciBDTDM3IChwYXNzaXZlIG1vZGUpIElJSSAqLworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkgICAgICAgTURJT19BTl9SRUdfQ0wzN19BTiwgMHgxMDAwKTsKKworCQkJaWYgKGV4dF9waHlfdHlwZSA9PQorCQkJICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMpIHsKKwkJCQkvKiBUaGUgU05SIHdpbGwgaW1wcm92ZSBhYm91dCAyZGIgYnkgY2hhbmdpbmcKKwkJCQlCVyBhbmQgRkVFIG1haW4gdGFwLiBSZXN0IGNvbW1hbmRzIGFyZSBleGVjdXRlZAorCQkJCWFmdGVyIGxpbmsgaXMgdXAqLworCQkJCS8qQ2hhbmdlIEZGRSBtYWluIGN1cnNvciB0byA1IGluIEVEQyByZWdpc3RlciovCisJCQkJaWYgKGJueDJ4XzgwNzNfaXNfc25yX25lZWRlZChwYXJhbXMpKQorCQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCQkgICAgZXh0X3BoeV90eXBlLAorCQkJCQkJICAgIGV4dF9waHlfYWRkciwKKwkJCQkJCSAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJCSAgICBNRElPX1BNQV9SRUdfRURDX0ZGRV9NQUlOLAorCQkJCQkJICAgIDB4RkIwQyk7CisKKwkJCQkvKiBFbmFibGUgRkVDIChGb3J3YXJlIEVycm9yIENvcnJlY3Rpb24pCisJCQkJUmVxdWVzdCBpbiB0aGUgQU4gKi8KKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgIE1ESU9fQU5fUkVHX0FEVjIsICZ0bXAxKTsKKworCQkJCXRtcDEgfD0gKDE8PDE1KTsKKworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX0FOX1JFR19BRFYyLCB0bXAxKTsKKworCQkJfQorCisJCQlibngyeF9leHRfcGh5X3NldF9wYXVzZShwYXJhbXMsIHZhcnMpOworCisJCQkvKiBSZXN0YXJ0IGF1dG9uZWcgKi8KKwkJCW1zbGVlcCg1MDApOworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkgICAgICAgTURJT19BTl9SRUdfQ1RSTCwgMHgxMjAwKTsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODA3eCBBdXRvbmVnIFJlc3RhcnQ6ICIKKwkJCSAgICJBZHZlcnRpc2UgMUc9JXgsIDEwRz0leFxuIiwKKwkJCSAgICgodmFsICYgKDE8PDUpKSA+IDApLAorCQkJICAgKCh2YWwgJiAoMTw8NykpID4gMCkpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJCXsKKwkJCXUxNiB0bXAxOworCQkJdTE2IHJ4X2FsYXJtX2N0cmxfdmFsOworCQkJdTE2IGxhc2lfY3RybF92YWw7CisKKwkJCS8qIEVuYWJsZSBQTUQgbGluaywgTU9EX0FCU19GTFQsIGFuZCAxRyBsaW5rIGFsYXJtICovCisKKwkJCXUxNiBtb2RfYWJzOworCQkJcnhfYWxhcm1fY3RybF92YWwgPSAoMTw8MikgfCAoMTw8NSkgOworCQkJbGFzaV9jdHJsX3ZhbCA9IDB4MDAwNDsKKworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbml0aWFsaXppbmcgQkNNODcyN1xuIik7CisJCQkvKiBlbmFibGUgTEFTSSAqLworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAorCQkJCSAgICAgICByeF9hbGFybV9jdHJsX3ZhbCk7CisKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLAorCQkJCSAgICAgICBsYXNpX2N0cmxfdmFsKTsKKworCQkJLyogSW5pdGlhbGx5IGNvbmZpZ3VyZSAgTU9EX0FCUyB0byBpbnRlcnJ1cHQgd2hlbgorCQkJbW9kdWxlIGlzIHByZXNlbmNlKCBiaXQgOCkgKi8KKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLCAmbW9kX2Ficyk7CisJCQkvKiBTZXQgRURDIG9mZiBieSBzZXR0aW5nIE9QVFhMT1Mgc2lnbmFsIGlucHV0IHRvIGxvdworCQkJKGJpdCA5KS4KKwkJCVdoZW4gdGhlIEVEQyBpcyBvZmYgaXQgbG9ja3Mgb250byBhIHJlZmVyZW5jZSBjbG9jayBhbmQKKwkJCWF2b2lkcyBiZWNvbWluZyAnbG9zdCcuKi8KKwkJCW1vZF9hYnMgJj0gfigoMTw8OCkgfCAoMTw8OSkpOworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwgbW9kX2Ficyk7CisKKwkJCS8qIE1ha2UgTU9EX0FCUyBnaXZlIGludGVycnVwdCBvbiBjaGFuZ2UgKi8KKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHXzg3MjdfUENTX09QVF9DVFJMLAorCQkJCSAgICAgICZ2YWwpOworCQkJdmFsIHw9ICgxPDwxMik7CisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfUENTX09QVF9DVFJMLAorCQkJCSAgICAgICB2YWwpOworCisJCQkvKiBTZXQgODcyNyBHUElPcyB0byBpbnB1dCB0byBhbGxvdyByZWFkaW5nIGZyb20gdGhlCisJCQk4NzI3IEdQSU8wIHN0YXR1cyB3aGljaCByZWZsZWN0IFNGUCsgbW9kdWxlCisJCQlvdmVyLWN1cnJlbnQgKi8KKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR184NzI3X1BDU19PUFRfQ1RSTCwKKwkJCQkgICAgICAgJnZhbCk7CisJCQl2YWwgJj0gMHhmZjhmOyAvKiBSZXNldCBiaXRzIDQtNiAqLworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgICBNRElPX1BNQV9SRUdfODcyN19QQ1NfT1BUX0NUUkwsCisJCQkJICAgICAgIHZhbCk7CisKKwkJCWJueDJ4Xzg3MjdfcG93ZXJfbW9kdWxlKGJwLCBwYXJhbXMsIGV4dF9waHlfYWRkciwgMSk7CisJCQlibngyeF9iY204MDczX3NldF94YXVpX2xvd19wb3dlcl9tb2RlKHBhcmFtcyk7CisKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX004MDUxX01TR09VVF9SRUcsCisJCQkJICAgICAgJnRtcDEpOworCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnRtcDEpOworCisJCQkvKiBTZXQgb3B0aW9uIDFHIHNwZWVkICovCisJCQlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMUcgZm9yY2VcbiIpOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsIDB4NDApOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHXzEwR19DVFJMMiwgMHhEKTsKKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR18xMEdfQ1RSTDIsICZ0bXAxKTsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIjEuNyA9IDB4JXhcbiIsIHRtcDEpOworCisJCQl9IGVsc2UgaWYgKChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09CisJCQkJICAgIFNQRUVEX0FVVE9fTkVHKSAmJgorCQkJCSAgICgocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCisJCQkJICAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHKSkpIHsKKworCQkJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyAxRyBjbGF1c2UzN1xuIik7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX1BNQV9SRUdfODcyN19NSVNDX0NUUkwsIDApOworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICAgTURJT19BTl9SRUdfQ0wzN19BTiwgMHgxMzAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2luY2UgdGhlIDg3MjcgaGFzIG9ubHkgc2luZ2xlIHJlc2V0IHBpbiwKKwkJCQluZWVkIHRvIHNldCB0aGUgMTBHIHJlZ2lzdGVycyBhbHRob3VnaCBpdCBpcworCQkJCWRlZmF1bHQgKi8KKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NUUkwsIDB4MDAyMCk7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICAweDcsIDB4MDEwMCk7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsIDB4MjA0MCk7CisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHXzEwR19DVFJMMiwgMHgwMDA4KTsKKwkJCX0KKworCQkJLyogU2V0IDItd2lyZSB0cmFuc2ZlciByYXRlIG9mIFNGUCsgbW9kdWxlIEVFUFJPTQorCQkJICogdG8gMTAwS2h6IHNpbmNlIHNvbWUgREFDcyhkaXJlY3QgYXR0YWNoZWQgY2FibGVzKSBkbworCQkJICogbm90IHdvcmsgYXQgNDAwS2h6LgorCQkJICovCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfVFdPX1dJUkVfU0xBVkVfQUREUiwKKwkJCQkgICAgICAgMHhhMDAxKTsKKworCQkJLyogU2V0IFRYIFByZUVtcGhhc2lzIGlmIG5lZWRlZCAqLworCQkJaWYgKChwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKKwkJCSAgICAgRkVBVFVSRV9DT05GSUdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfRU5BQkxFRCkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgVFhfQ1RSTDEgMHgleCwiCisJCQkJCSAiVFhfQ1RSTDIgMHgleFxuIiwKKwkJCQkJIHBhcmFtcy0+eGd4c19jb25maWdfdHhbMF0sCisJCQkJCSBwYXJhbXMtPnhneHNfY29uZmlnX3R4WzFdKTsKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR184NzI3X1RYX0NUUkwxLAorCQkJCQkgICAgICAgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFswXSk7CisKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fUE1BX1JFR184NzI3X1RYX0NUUkwyLAorCQkJCQkgICAgICAgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFsxXSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxOgorCQl7CisJCQl1MTYgZndfdmVyMSwgZndfdmVyMjsKKwkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCSJTZXR0aW5nIHRoZSBTRlg3MTAxIExBU0kgaW5kaWNhdGlvblxuIik7CisKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAweDEpOworCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkgICJTZXR0aW5nIHRoZSBTRlg3MTAxIExFRCB0byBibGluayBvbiB0cmFmZmljXG4iKTsKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgICBNRElPX1BNQV9SRUdfNzEwN19MRURfQ05UTCwgKDE8PDMpKTsKKworCQkJYm54MnhfZXh0X3BoeV9zZXRfcGF1c2UocGFyYW1zLCB2YXJzKTsKKwkJCS8qIFJlc3RhcnQgYXV0b25lZyAqLworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX0FOX0RFVkFELAorCQkJCSAgICAgIE1ESU9fQU5fUkVHX0NUUkwsICZ2YWwpOworCQkJdmFsIHw9IDB4MjAwOworCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkgICAgICAgTURJT19BTl9SRUdfQ1RSTCwgdmFsKTsKKworCQkJLyogU2F2ZSBzcGlyb20gdmVyc2lvbiAqLworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR183MTAxX1ZFUjEsICZmd192ZXIxKTsKKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR183MTAxX1ZFUjIsICZmd192ZXIyKTsKKworCQkJYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihwYXJhbXMtPmJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCQlwYXJhbXMtPnNobWVtX2Jhc2UsCisJCQkJCQkodTMyKShmd192ZXIxPDwxNiB8IGZ3X3ZlcjIpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MToKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMzoKKwkJCS8qIFRoaXMgcGh5IHVzZXMgdGhlIE5JRyBsYXRjaCBtZWNoYW5pc20gc2luY2UgbGluaworCQkJCWluZGljYXRpb24gYXJyaXZlcyB0aHJvdWdoIGl0cyBMRUQ0IGFuZCBub3QgdmlhCisJCQkJaXRzIExBU0kgc2lnbmFsLCBzbyB3ZSBnZXQgc3RlYWR5IHNpZ25hbAorCQkJCWluc3RlYWQgb2YgY2xlYXIgb24gcmVhZCAqLworCQkJYm54MnhfYml0c19lbihicCwgTklHX1JFR19MQVRDSF9CQ18wICsgcGFyYW1zLT5wb3J0KjQsCisJCQkJICAgIDEgPDwgTklHX0xBVENIX0JDX0VOQUJMRV9NSV9JTlQpOworCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCisJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLCAweDAwMDApOworCisJCQlibngyeF84NDgxX3NldF9sZWQ0KHBhcmFtcywgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIpOworCQkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpIHsKKworCQkJCXUxNiBhdXRvbmVnX3ZhbCwgYW5fMTAwMF92YWwsIGFuXzEwXzEwMF92YWw7CisJCQkJLyogc2V0IDEwMDAgc3BlZWQgYWR2ZXJ0aXNlbWVudCAqLworCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgTURJT19BTl9SRUdfODQ4MV8xMDAwVF9DVFJMLAorCQkJCQkgICAgICAmYW5fMTAwMF92YWwpOworCisJCQkJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgorCQkJCSAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHKSB7CisJCQkJCWFuXzEwMDBfdmFsIHw9ICgxPDw4KTsKKwkJCQkJaWYgKHBhcmFtcy0+cmVxX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQkJCWFuXzEwMDBfdmFsIHw9ICgxPDw5KTsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJBZHZlcnRpc2luZyAxR1xuIik7CisJCQkJfSBlbHNlCisJCQkJCWFuXzEwMDBfdmFsICY9IH4oKDE8PDgpIHwgKDE8PDkpKTsKKworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX0FOX1JFR184NDgxXzEwMDBUX0NUUkwsCisJCQkJCSAgICAgICBhbl8xMDAwX3ZhbCk7CisKKwkJCQkvKiBzZXQgMTAwIHNwZWVkIGFkdmVydGlzZW1lbnQgKi8KKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX0FOX0FEViwKKwkJCQkJICAgICAgJmFuXzEwXzEwMF92YWwpOworCisJCQkJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgorCQkJCSAoUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMDBNX0ZVTEwgfAorCQkJCSAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMDBNX0hBTEYpKSB7CisJCQkJCWFuXzEwXzEwMF92YWwgfD0gKDE8PDcpOworCQkJCQlpZiAocGFyYW1zLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCQkJYW5fMTBfMTAwX3ZhbCB8PSAoMTw8OCk7CisJCQkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCQkJIkFkdmVydGlzaW5nIDEwME1cbiIpOworCQkJCX0gZWxzZQorCQkJCQlhbl8xMF8xMDBfdmFsICY9IH4oKDE8PDcpIHwgKDE8PDgpKTsKKworCQkJCS8qIHNldCAxMCBzcGVlZCBhZHZlcnRpc2VtZW50ICovCisJCQkJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgorCQkJCSAgKFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBNX0ZVTEwgfAorCQkJCSAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBNX0hBTEYpKSB7CisJCQkJCWFuXzEwXzEwMF92YWwgfD0gKDE8PDUpOworCQkJCQlpZiAocGFyYW1zLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCQkJYW5fMTBfMTAwX3ZhbCB8PSAoMTw8Nik7CisJCQkJCURQKE5FVElGX01TR19MSU5LLCAiQWR2ZXJ0aXNpbmcgMTBNXG4iKTsKKwkJCQkgICAgIH0KKwkJCQllbHNlCisJCQkJCWFuXzEwXzEwMF92YWwgJj0gfigoMTw8NSkgfCAoMTw8NikpOworCisJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX0FOX0FEViwKKwkJCQkJICAgICAgIGFuXzEwXzEwMF92YWwpOworCisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICBNRElPX0FOX1JFR184NDgxX0xFR0FDWV9NSUlfQ1RSTCwKKwkJCQkJICAgICAgJmF1dG9uZWdfdmFsKTsKKworCQkJCS8qIERpc2FibGUgZm9yY2VkIHNwZWVkICovCisJCQkJYXV0b25lZ192YWwgJj0gfigxPDw2fDE8PDEzKTsKKworCQkJCS8qIEVuYWJsZSBhdXRvbmVnIGFuZCByZXN0YXJ0IGF1dG9uZWcKKwkJCQlmb3IgbGVnYWN5IHNwZWVkcyAqLworCQkJCWF1dG9uZWdfdmFsIHw9ICgxPDw5fDE8PDEyKTsKKworCQkJCWlmIChwYXJhbXMtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJCWF1dG9uZWdfdmFsIHw9ICgxPDw4KTsKKwkJCQllbHNlCisJCQkJCWF1dG9uZWdfdmFsICY9IH4oMTw8OCk7CisKKwkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICAgTURJT19BTl9SRUdfODQ4MV9MRUdBQ1lfTUlJX0NUUkwsCisJCQkJCSAgICAgICBhdXRvbmVnX3ZhbCk7CisKKwkJCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCisJCQkJICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBHKSB7CisJCQkJCURQKE5FVElGX01TR19MSU5LLCAiQWR2ZXJ0aXNpbmcgMTBHXG4iKTsKKwkJCQkJLyogUmVzdGFydCBhdXRvbmVnIGZvciAxMEcqLworCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAorCQkJCSAgICAgICBNRElPX0FOX1JFR19DVFJMLCAweDMyMDApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogRm9yY2Ugc3BlZWQgKi8KKwkJCQl1MTYgYXV0b25lZ19jdHJsLCBwbWFfY3RybDsKKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX01JSV9DVFJMLAorCQkJCQkgICAgICAmYXV0b25lZ19jdHJsKTsKKworCQkJCS8qIERpc2FibGUgYXV0b25lZyAqLworCQkJCWF1dG9uZWdfY3RybCAmPSB+KDE8PDEyKTsKKworCQkJCS8qIFNldCAxMDAwIGZvcmNlICovCisJCQkJc3dpdGNoIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkKSB7CisJCQkJY2FzZSBTUEVFRF8xMDAwMDoKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCQkiVW5hYmxlIHRvIHNldCAxMEcgZm9yY2UgIVxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1BFRURfMTAwMDoKKwkJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJCSAgICAgIE1ESU9fUE1BX1JFR19DVFJMLAorCQkJCQkJICAgICAgJnBtYV9jdHJsKTsKKwkJCQkJYXV0b25lZ19jdHJsICY9IH4oMTw8MTMpOworCQkJCQlhdXRvbmVnX2N0cmwgfD0gKDE8PDYpOworCQkJCQlwbWFfY3RybCAmPSB+KDE8PDEzKTsKKwkJCQkJcG1hX2N0cmwgfD0gKDE8PDYpOworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJCSJTZXR0aW5nIDEwMDBNIGZvcmNlXG4iKTsKKwkJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCisJCQkJCQkgICAgICAgcG1hX2N0cmwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNQRUVEXzEwMDoKKwkJCQkJYXV0b25lZ19jdHJsIHw9ICgxPDwxMyk7CisJCQkJCWF1dG9uZWdfY3RybCAmPSB+KDE8PDYpOworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJCSJTZXR0aW5nIDEwME0gZm9yY2VcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNQRUVEXzEwOgorCQkJCQlhdXRvbmVnX2N0cmwgJj0gfigxPDwxMyk7CisJCQkJCWF1dG9uZWdfY3RybCAmPSB+KDE8PDYpOworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJCSJTZXR0aW5nIDEwTSBmb3JjZVxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIER1cGxleCBtb2RlICovCisJCQkJaWYgKHBhcmFtcy0+cmVxX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJCQlhdXRvbmVnX2N0cmwgfD0gKDE8PDgpOworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJCSJTZXR0aW5nIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCQl9IGVsc2UKKwkJCQkJYXV0b25lZ19jdHJsICY9IH4oMTw8OCk7CisKKwkJCQkvKiBVcGRhdGUgYXV0b25lZyBjdHJsIGFuZCBwbWEgY3RybCAqLworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgICBNRElPX0FOX1JFR184NDgxX0xFR0FDWV9NSUlfQ1RSTCwKKwkJCQkJICAgICAgIGF1dG9uZWdfY3RybCk7CisJCQl9CisKKwkJCS8qIFNhdmUgc3Bpcm9tIHZlcnNpb24gKi8KKwkJCWJueDJ4X3NhdmVfODQ4MV9zcGlyb21fdmVyc2lvbihicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkJICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgIHBhcmFtcy0+c2htZW1fYmFzZSk7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICJYR1hTIFBIWSBGYWlsdXJlIGRldGVjdGVkIDB4JXhcbiIsCisJCQkJIHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUChORVRJRl9NU0dfTElOSywgIkJBRCBYR1hTIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCisJCQkJICBwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgeyAvKiBTZXJEZXMgKi8KKworCQlleHRfcGh5X3R5cGUgPSBTRVJERVNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXJEZXMgRGlyZWN0XG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9CQ001NDgyOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXJEZXMgNTQ4MlxuIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgU2VyRGVzIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCisJCQkgICBwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54MnhfODcyN19oYW5kbGVfbW9kX2FicyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgbW9kX2FicywgcnhfYWxhcm1fc3RhdHVzOworCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCXUzMiB2YWwgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCisJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sIGRldl9pbmZvLgorCQkJCSAgICAgIHBvcnRfZmVhdHVyZV9jb25maWdbcGFyYW1zLT5wb3J0XS4KKwkJCQkgICAgICBjb25maWcpKTsKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKKwkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLCAmbW9kX2Ficyk7CisJaWYgKG1vZF9hYnMgJiAoMTw8OCkpIHsKKworCQkvKiBNb2R1bGUgaXMgYWJzZW50ICovCisJCURQKE5FVElGX01TR19MSU5LLCAiTU9EX0FCUyBpbmRpY2F0aW9uICIKKwkJCSAgICAic2hvdyBtb2R1bGUgaXMgYWJzZW50XG4iKTsKKworCQkvKiAxLiBTZXQgbW9kX2FicyB0byBkZXRlY3QgbmV4dCBtb2R1bGUKKwkJcHJlc2VuY2UgZXZlbnQKKwkJICAgMi4gU2V0IEVEQyBvZmYgYnkgc2V0dGluZyBPUFRYTE9TIHNpZ25hbCBpbnB1dCB0byBsb3cKKwkJCShiaXQgOSkuCisJCQlXaGVuIHRoZSBFREMgaXMgb2ZmIGl0IGxvY2tzIG9udG8gYSByZWZlcmVuY2UgY2xvY2sgYW5kCisJCQlhdm9pZHMgYmVjb21pbmcgJ2xvc3QnLiovCisJCW1vZF9hYnMgJj0gfigoMTw8OCl8KDE8PDkpKTsKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwgbW9kX2Ficyk7CisKKwkJLyogQ2xlYXIgUlggYWxhcm0gc2luY2UgaXQgc3RheXMgdXAgYXMgbG9uZyBhcworCQl0aGUgbW9kX2FicyB3YXNuJ3QgY2hhbmdlZCAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnJ4X2FsYXJtX3N0YXR1cyk7CisKKwl9IGVsc2UgeworCQkvKiBNb2R1bGUgaXMgcHJlc2VudCAqLworCQlEUChORVRJRl9NU0dfTElOSywgIk1PRF9BQlMgaW5kaWNhdGlvbiAiCisJCQkgICAgInNob3cgbW9kdWxlIGlzIHByZXNlbnRcbiIpOworCQkvKiBGaXJzdCB0aGluZywgZGlzYWJsZSB0cmFuc21pdHRlciwKKwkJYW5kIGlmIHRoZSBtb2R1bGUgaXMgb2ssIHRoZQorCQltb2R1bGVfZGV0ZWN0aW9uIHdpbGwgZW5hYmxlIGl0Ki8KKworCQkvKiAxLiBTZXQgbW9kX2FicyB0byBkZXRlY3QgbmV4dCBtb2R1bGUKKwkJYWJzZW50IGV2ZW50ICggYml0IDgpCisJCSAgIDIuIFJlc3RvcmUgdGhlIGRlZmF1bHQgcG9sYXJpdHkgb2YgdGhlIE9QUlhMT1Mgc2lnbmFsIGFuZAorCQl0aGlzIHNpZ25hbCB3aWxsIHRoZW4gY29ycmVjdGx5IGluZGljYXRlIHRoZSBwcmVzZW5jZSBvcgorCQlhYnNlbmNlIG9mIHRoZSBSeCBzaWduYWwuIChiaXQgOSkgKi8KKwkJbW9kX2FicyB8PSAoKDE8PDgpfCgxPDw5KSk7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwgbW9kX2Ficyk7CisKKwkJLyogQ2xlYXIgUlggYWxhcm0gc2luY2UgaXQgc3RheXMgdXAgYXMgbG9uZyBhcworCQl0aGUgbW9kX2FicyB3YXNuJ3QgY2hhbmdlZC4gVGhpcyBpcyBuZWVkIHRvIGJlIGRvbmUKKwkJYmVmb3JlIGNhbGxpbmcgdGhlIG1vZHVsZSBkZXRlY3Rpb24sIG90aGVyd2lzZSBpdCB3aWxsIGNsZWFyCisJCXRoZSBsaW5rIHVwZGF0ZSBhbGFybSAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnJ4X2FsYXJtX3N0YXR1cyk7CisKKworCQlpZiAoKHZhbCAmIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9NQVNLKSA9PQorCQkgICAgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX0RJU0FCTEVfVFhfTEFTRVIpCisJCQlibngyeF9zZnBfc2V0X3RyYW5zbWl0dGVyKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCVBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCisJCQkJCWV4dF9waHlfYWRkciwgMCk7CisKKwkJaWYgKGJueDJ4X3dhaXRfZm9yX3NmcF9tb2R1bGVfaW5pdGlhbGl6ZWQocGFyYW1zKQorCQkgICAgPT0gMCkKKwkJCWJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHBhcmFtcyk7CisJCWVsc2UKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU0ZQKyBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkXG4iKTsKKwl9CisKKwlEUChORVRJRl9NU0dfTElOSywgIjg3MjcgUlhfQUxBUk1fU1RBVFVTIDB4JXhcbiIsCisJCSByeF9hbGFybV9zdGF0dXMpOworCS8qIE5vIG5lZWQgdG8gY2hlY2sgbGluayBzdGF0dXMgaW4gY2FzZSBvZgorCW1vZHVsZSBwbHVnZ2VkIGluL291dCAqLworfQorCisKK3N0YXRpYyB1OCBibngyeF9leHRfcGh5X2lzX2xpbmtfdXAoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCQkJIHU4IGlzX21pX2ludCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgZXh0X3BoeV90eXBlOworCXU4IGV4dF9waHlfYWRkcjsKKwl1MTYgdmFsMSA9IDAsIHZhbDI7CisJdTE2IHJ4X3NkLCBwY3Nfc3RhdHVzOworCXU4IGV4dF9waHlfbGlua191cCA9IDA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKworCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCWV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgRGlyZWN0XG4iKTsKKwkJCWV4dF9waHlfbGlua191cCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODcwNVxuIik7CisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1dJU19ERVZBRCwKKwkJCQkgICAgICBNRElPX1dJU19SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODcwNSBMQVNJIHN0YXR1cyAweCV4XG4iLCB2YWwxKTsKKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19XSVNfREVWQUQsCisJCQkJICAgICAgTURJT19XSVNfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMSk7CisJCQlEUChORVRJRl9NU0dfTElOSywgIjg3MDUgTEFTSSBzdGF0dXMgMHgleFxuIiwgdmFsMSk7CisKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9TRCwgJnJ4X3NkKTsKKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgMSwKKwkJCQkgICAgICAweGM4MDksICZ2YWwxKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIDEsCisJCQkJICAgICAgMHhjODA5LCAmdmFsMSk7CisKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODcwNSAxLmM4MDkgdmFsPTB4JXhcbiIsIHZhbDEpOworCQkJZXh0X3BoeV9saW5rX3VwID0gKChyeF9zZCAmIDB4MSkgJiYgKHZhbDEgJiAoMTw8OSkpICYmCisJCQkJCSAgICgodmFsMSAmICgxPDw4KSkgPT0gMCkpOworCQkJaWYgKGV4dF9waHlfbGlua191cCkKKwkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDY6CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA2Lzg3MjZcbiIpOworCQkJLyogQ2xlYXIgUlggQWxhcm0qLworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwKKwkJCQkgICAgICAmdmFsMik7CisJCQkvKiBjbGVhciBMQVNJIGluZGljYXRpb24qLworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19MQVNJX1NUQVRVUywKKwkJCQkgICAgICAmdmFsMSk7CisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLAorCQkJCSAgICAgICZ2YWwyKTsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODcwNi84NzI2IExBU0kgc3RhdHVzIDB4JXgtLT4iCisJCQkJICAgICAiMHgleFxuIiwgdmFsMSwgdmFsMik7CisKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfUlhfU0QsCisJCQkJICAgICAgJnJ4X3NkKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUENTX0RFVkFELCBNRElPX1BDU19SRUdfU1RBVFVTLAorCQkJCSAgICAgICZwY3Nfc3RhdHVzKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsIE1ESU9fQU5fUkVHX0xJTktfU1RBVFVTLAorCQkJCSAgICAgICZ2YWwyKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsIE1ESU9fQU5fUkVHX0xJTktfU1RBVFVTLAorCQkJCSAgICAgICZ2YWwyKTsKKworCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzA2Lzg3MjYgcnhfc2QgMHgleCIKKwkJCSAgICIgIHBjc19zdGF0dXMgMHgleCAxR2JwcyBsaW5rX3N0YXR1cyAweCV4XG4iLAorCQkJICAgcnhfc2QsIHBjc19zdGF0dXMsIHZhbDIpOworCQkJLyogbGluayBpcyB1cCBpZiBib3RoIGJpdCAwIG9mIHBtZF9yeF9zZCBhbmQKKwkJCSAqIGJpdCAwIG9mIHBjc19zdGF0dXMgYXJlIHNldCwgb3IgaWYgdGhlIGF1dG9uZWcgYml0CisJCQkgICAxIGlzIHNldAorCQkJICovCisJCQlleHRfcGh5X2xpbmtfdXAgPSAoKHJ4X3NkICYgcGNzX3N0YXR1cyAmIDB4MSkgfHwKKwkJCQkJICAgKHZhbDIgJiAoMTw8MSkpKTsKKwkJCWlmIChleHRfcGh5X2xpbmtfdXApIHsKKwkJCQlpZiAoZXh0X3BoeV90eXBlID09CisJCQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2KSB7CisJCQkJCS8qIElmIHRyYW5zbWl0dGVyIGlzIGRpc2FibGVkLAorCQkJCQlpZ25vcmUgZmFsc2UgbGluayB1cCBpbmRpY2F0aW9uICovCisJCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkJICAgZXh0X3BoeV90eXBlLAorCQkJCQkJICAgZXh0X3BoeV9hZGRyLAorCQkJCQkJICAgTURJT19QTUFfREVWQUQsCisJCQkJCQkgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsCisJCQkJCQkgICAmdmFsMSk7CisJCQkJCWlmICh2YWwxICYgKDE8PDE1KSkgeworCQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJUeCBpcyAiCisJCQkJCQkJICAgICJkaXNhYmxlZFxuIik7CisJCQkJCQlleHRfcGh5X2xpbmtfdXAgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHZhbDIgJiAoMTw8MSkpCisJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJCWVsc2UKKwkJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCQl7CisJCQl1MTYgbGlua19zdGF0dXMgPSAwOworCQkJdTE2IHJ4X2FsYXJtX3N0YXR1czsKKwkJCS8qIENoZWNrIHRoZSBMQVNJICovCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnJ4X2FsYXJtX3N0YXR1cyk7CisKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODcyNyBSWF9BTEFSTV9TVEFUVVMgMHgleFxuIiwKKwkJCQkgcnhfYWxhcm1fc3RhdHVzKTsKKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKKworCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICI4NzI3IExBU0kgc3RhdHVzIDB4JXhcbiIsCisJCQkJIHZhbDEpOworCisJCQkvKiBDbGVhciBNU0ctT1VUICovCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19NODA1MV9NU0dPVVRfUkVHLAorCQkJCSAgICAgICZ2YWwxKTsKKworCQkJLyoKKwkJCSAqIElmIGEgbW9kdWxlIGlzIHByZXNlbnQgYW5kIHRoZXJlIGlzIG5lZWQgdG8gY2hlY2sKKwkJCSAqIGZvciBvdmVyIGN1cnJlbnQKKwkJCSAqLworCQkJaWYgKCEocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCisJCQkgICAgICBGRUFUVVJFX0NPTkZJR19CQ004NzI3X05PQykgJiYKKwkJCSAgICAhKHJ4X2FsYXJtX3N0YXR1cyAmICgxPDw1KSkpIHsKKwkJCQkvKiBDaGVjayBvdmVyLWN1cnJlbnQgdXNpbmcgODcyNyBHUElPMCBpbnB1dCovCisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgTURJT19QTUFfUkVHXzg3MjdfR1BJT19DVFJMLAorCQkJCQkgICAgICAmdmFsMSk7CisKKwkJCQlpZiAoKHZhbDEgJiAoMTw8OCkpID09IDApIHsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzI3IFBvd2VyIGZhdWx0IgorCQkJCQkJICAgICAiIGhhcyBiZWVuIGRldGVjdGVkIG9uICIKKwkJCQkJCSAgICAgInBvcnQgJWRcbiIsCisJCQkJCQkgcGFyYW1zLT5wb3J0KTsKKwkJCQkJbmV0ZGV2X2VycihicC0+ZGV2LCAiRXJyb3I6ICBQb3dlciBmYXVsdCBvbiBQb3J0ICVkIGhhcyBiZWVuIGRldGVjdGVkIGFuZCB0aGUgcG93ZXIgdG8gdGhhdCBTRlArIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIHRvIHByZXZlbnQgZmFpbHVyZSBvZiB0aGUgY2FyZC4gUGxlYXNlIHJlbW92ZSB0aGUgU0ZQKyBtb2R1bGUgYW5kIHJlc3RhcnQgdGhlIHN5c3RlbSB0byBjbGVhciB0aGlzIGVycm9yLlxuIiwKKwkJCQkJCSAgIHBhcmFtcy0+cG9ydCk7CisJCQkJCS8qCisJCQkJCSAqIERpc2FibGUgYWxsIFJYX0FMQVJNcyBleGNlcHQgZm9yCisJCQkJCSAqIG1vZF9hYnMKKwkJCQkJICovCisJCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJCSAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkJICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkJICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwKKwkJCQkJCSAgICAgKDE8PDUpKTsKKworCQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJCSAgICBleHRfcGh5X3R5cGUsCisJCQkJCQkgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkJICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkJICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKKwkJCQkJCSAgICAmdmFsMSk7CisJCQkJCS8qIFdhaXQgZm9yIG1vZHVsZV9hYnNlbnRfZXZlbnQgKi8KKwkJCQkJdmFsMSB8PSAoMTw8OCk7CisJCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJCSAgICBleHRfcGh5X3R5cGUsCisJCQkJCQkgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkJICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkJICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKKwkJCQkJCSAgICB2YWwxKTsKKwkJCQkJLyogQ2xlYXIgUlggYWxhcm0gKi8KKwkJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJCSAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwKKwkJCQkJCSAgICAgICZyeF9hbGFybV9zdGF0dXMpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IC8qIE92ZXIgY3VycmVudCBjaGVjayAqLworCisJCQkvKiBXaGVuIG1vZHVsZSBhYnNlbnQgYml0IGlzIHNldCwgY2hlY2sgbW9kdWxlICovCisJCQlpZiAocnhfYWxhcm1fc3RhdHVzICYgKDE8PDUpKSB7CisJCQkJYm54MnhfODcyN19oYW5kbGVfbW9kX2FicyhwYXJhbXMpOworCQkJCS8qIEVuYWJsZSBhbGwgbW9kX2FicyBhbmQgbGluayBkZXRlY3Rpb24gYml0cyAqLworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNX0NUUkwsCisJCQkJCSAgICAgICAoKDE8PDUpIHwgKDE8PDIpKSk7CisJCQl9CisKKwkJCS8qIElmIHRyYW5zbWl0dGVyIGlzIGRpc2FibGVkLAorCQkJaWdub3JlIGZhbHNlIGxpbmsgdXAgaW5kaWNhdGlvbiAqLworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsCisJCQkJICAgICAgJnZhbDEpOworCQkJaWYgKHZhbDEgJiAoMTw8MTUpKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJUeCBpcyBkaXNhYmxlZFxuIik7CisJCQkJZXh0X3BoeV9saW5rX3VwID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICBNRElPX1BNQV9SRUdfODA3M19TUEVFRF9MSU5LX1NUQVRVUywKKwkJCQkgICAgICAmbGlua19zdGF0dXMpOworCisJCQkvKiBCaXRzIDAuLjIgLS0+IHNwZWVkIGRldGVjdGVkLAorCQkJICAgYml0cyAxMy4uMTUtLT4gbGluayBpcyBkb3duICovCisJCQlpZiAoKGxpbmtfc3RhdHVzICYgKDE8PDIpKSAmJgorCQkJICAgICghKGxpbmtfc3RhdHVzICYgKDE8PDE1KSkpKSB7CisJCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKKwkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCQl9IGVsc2UgaWYgKChsaW5rX3N0YXR1cyAmICgxPDwwKSkgJiYKKwkJCQkgICAoIShsaW5rX3N0YXR1cyAmICgxPDwxMykpKSkgeworCQkJCWV4dF9waHlfbGlua191cCA9IDE7CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKKwkJCQkJICIgdXAgaW4gMUdcbiIsIHBhcmFtcy0+cG9ydCk7CisJCQl9IGVsc2UgeworCQkJCWV4dF9waHlfbGlua191cCA9IDA7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKKwkJCQkJICIgaXMgZG93blxuIiwgcGFyYW1zLT5wb3J0KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6CisJCXsKKwkJCXUxNiBsaW5rX3N0YXR1cyA9IDA7CisJCQl1MTYgYW4xMDAwX3N0YXR1cyA9IDA7CisKKwkJCWlmIChleHRfcGh5X3R5cGUgPT0KKwkJCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MikgeworCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QQ1NfREVWQUQsCisJCQkJICAgICAgTURJT19QQ1NfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMSk7CisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUENTX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUENTX1JFR19MQVNJX1NUQVRVUywgJnZhbDIpOworCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICI4NzB4IExBU0kgc3RhdHVzIDB4JXgtPjB4JXhcbiIsCisJCQkJICB2YWwxLCB2YWwyKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSW4gODA3MywgcG9ydDEgaXMgZGlyZWN0ZWQgdGhyb3VnaCBlbWFjMCBhbmQKKwkJCQkgKiBwb3J0MCBpcyBkaXJlY3RlZCB0aHJvdWdoIGVtYWMxCisJCQkJICovCisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMSk7CisKKwkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJICI4NzAzIExBU0kgc3RhdHVzIDB4JXhcbiIsCisJCQkJCSAgdmFsMSk7CisJCQl9CisKKwkJCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgTEFTSSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QQ1NfREVWQUQsCisJCQkJICAgICAgTURJT19QQ1NfUkVHX1NUQVRVUywgJnZhbDIpOworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkgICAgICBNRElPX1BDU19ERVZBRCwKKwkJCQkgICAgICBNRElPX1BDU19SRUdfU1RBVFVTLCAmdmFsMSk7CisJCQlEUChORVRJRl9NU0dfTElOSywgIjgwN3ggUENTIHN0YXR1cyAweCV4LT4weCV4XG4iLAorCQkJICAgdmFsMiwgdmFsMSk7CisJCQkvKiBDbGVhciBNU0ctT1VUICovCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19NODA1MV9NU0dPVVRfUkVHLAorCQkJCSAgICAgICZ2YWwxKTsKKworCQkJLyogQ2hlY2sgdGhlIExBU0kgKi8KKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNLCAmdmFsMik7CisKKwkJCURQKE5FVElGX01TR19MSU5LLCAiS1IgMHg5MDAzIDB4JXhcbiIsIHZhbDIpOworCisJCQkvKiBDaGVjayB0aGUgbGluayBzdGF0dXMgKi8KKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QQ1NfREVWQUQsCisJCQkJICAgICAgTURJT19QQ1NfUkVHX1NUQVRVUywgJnZhbDIpOworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJLUiBQQ1Mgc3RhdHVzIDB4JXhcbiIsIHZhbDIpOworCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19TVEFUVVMsICZ2YWwyKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX1NUQVRVUywgJnZhbDEpOworCQkJZXh0X3BoeV9saW5rX3VwID0gKCh2YWwxICYgNCkgPT0gNCk7CisJCQlEUChORVRJRl9NU0dfTElOSywgIlBNQV9SRUdfU1RBVFVTPTB4JXhcbiIsIHZhbDEpOworCQkJaWYgKGV4dF9waHlfdHlwZSA9PQorCQkJICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMpIHsKKworCQkJCWlmIChleHRfcGh5X2xpbmtfdXAgJiYKKwkJCQkgICAgKChwYXJhbXMtPnJlcV9saW5lX3NwZWVkICE9CisJCQkJCVNQRUVEXzEwMDAwKSkpIHsKKwkJCQkJaWYgKGJueDJ4X2JjbTgwNzNfeGF1aV93YShwYXJhbXMpCisJCQkJCSAgICAgIT0gMCkgeworCQkJCQkJZXh0X3BoeV9saW5rX3VwID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgICAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkJICAgICAgTURJT19BTl9SRUdfTElOS19TVEFUVVMsCisJCQkJCSAgICAgICZhbjEwMDBfc3RhdHVzKTsKKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgIE1ESU9fQU5fUkVHX0xJTktfU1RBVFVTLAorCQkJCQkgICAgICAmYW4xMDAwX3N0YXR1cyk7CisKKwkJCQkvKiBDaGVjayB0aGUgbGluayBzdGF0dXMgb24gMS4xLjIgKi8KKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkgICAgICBNRElPX1BNQV9SRUdfU1RBVFVTLCAmdmFsMik7CisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJICAgICAgTURJT19QTUFfUkVHX1NUQVRVUywgJnZhbDEpOworCQkJCURQKE5FVElGX01TR19MSU5LLCAiS1IgUE1BIHN0YXR1cyAweCV4LT4weCV4LCIKKwkJCQkJICAgICAiYW5fbGlua19zdGF0dXM9MHgleFxuIiwKKwkJCQkJICB2YWwyLCB2YWwxLCBhbjEwMDBfc3RhdHVzKTsKKworCQkJCWV4dF9waHlfbGlua191cCA9ICgoKHZhbDEgJiA0KSA9PSA0KSB8fAorCQkJCQkJKGFuMTAwMF9zdGF0dXMgJiAoMTw8MSkpKTsKKwkJCQlpZiAoZXh0X3BoeV9saW5rX3VwICYmCisJCQkJICAgIGJueDJ4XzgwNzNfaXNfc25yX25lZWRlZChwYXJhbXMpKSB7CisJCQkJCS8qIFRoZSBTTlIgd2lsbCBpbXByb3ZlIGFib3V0IDJkYmJ5CisJCQkJCWNoYW5naW5nIHRoZSBCVyBhbmQgRkVFIG1haW4gdGFwLiovCisKKwkJCQkJLyogVGhlIDFzdCB3cml0ZSB0byBjaGFuZ2UgRkZFIG1haW4KKwkJCQkJdGFwIGlzIHNldCBiZWZvcmUgcmVzdGFydCBBTiAqLworCQkJCQkvKiBDaGFuZ2UgUExMIEJhbmR3aWR0aCBpbiBFREMKKwkJCQkJcmVnaXN0ZXIgKi8KKwkJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkJICAgIGV4dF9waHlfYWRkciwKKwkJCQkJCSAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkJCSAgICBNRElPX1BNQV9SRUdfUExMX0JBTkRXSURUSCwKKwkJCQkJCSAgICAweDI2QkMpOworCisJCQkJCS8qIENoYW5nZSBDRFIgQmFuZHdpZHRoIGluIEVEQworCQkJCQlyZWdpc3RlciAqLworCQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJCQkgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkJICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCQkJICAgIE1ESU9fUE1BX1JFR19DRFJfQkFORFdJRFRILAorCQkJCQkJICAgIDB4MDMzMyk7CisJCQkJfQorCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAorCQkJCQkgICBleHRfcGh5X3R5cGUsCisJCQkJCSAgIGV4dF9waHlfYWRkciwKKwkJCQkJICAgTURJT19QTUFfREVWQUQsCisJCQkJCSAgIE1ESU9fUE1BX1JFR184MDczX1NQRUVEX0xJTktfU1RBVFVTLAorCQkJCQkgICAmbGlua19zdGF0dXMpOworCisJCQkJLyogQml0cyAwLi4yIC0tPiBzcGVlZCBkZXRlY3RlZCwKKwkJCQkgICBiaXRzIDEzLi4xNS0tPiBsaW5rIGlzIGRvd24gKi8KKwkJCQlpZiAoKGxpbmtfc3RhdHVzICYgKDE8PDIpKSAmJgorCQkJCSAgICAoIShsaW5rX3N0YXR1cyAmICgxPDwxNSkpKSkgeworCQkJCQlleHRfcGh5X2xpbmtfdXAgPSAxOworCQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCQkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCQkJICJwb3J0ICV4OiBFeHRlcm5hbCBsaW5rIgorCQkJCQkJICIgdXAgaW4gMTBHXG4iLCBwYXJhbXMtPnBvcnQpOworCQkJCX0gZWxzZSBpZiAoKGxpbmtfc3RhdHVzICYgKDE8PDEpKSAmJgorCQkJCQkgICAoIShsaW5rX3N0YXR1cyAmICgxPDwxNCkpKSkgeworCQkJCQlleHRfcGh5X2xpbmtfdXAgPSAxOworCQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMjUwMDsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCQkgInBvcnQgJXg6IEV4dGVybmFsIGxpbmsiCisJCQkJCQkgIiB1cCBpbiAyLjVHXG4iLCBwYXJhbXMtPnBvcnQpOworCQkJCX0gZWxzZSBpZiAoKGxpbmtfc3RhdHVzICYgKDE8PDApKSAmJgorCQkJCQkgICAoIShsaW5rX3N0YXR1cyAmICgxPDwxMykpKSkgeworCQkJCQlleHRfcGh5X2xpbmtfdXAgPSAxOworCQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCQkgInBvcnQgJXg6IEV4dGVybmFsIGxpbmsiCisJCQkJCQkgIiB1cCBpbiAxR1xuIiwgcGFyYW1zLT5wb3J0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlleHRfcGh5X2xpbmtfdXAgPSAwOworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKKwkJCQkJCSAiIGlzIGRvd25cbiIsIHBhcmFtcy0+cG9ydCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTZWUgaWYgMUcgbGluayBpcyB1cCBmb3IgdGhlIDgwNzIgKi8KKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV90eXBlLAorCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJCSAgICAgIE1ESU9fQU5fUkVHX0xJTktfU1RBVFVTLAorCQkJCQkgICAgICAmYW4xMDAwX3N0YXR1cyk7CisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICBNRElPX0FOX1JFR19MSU5LX1NUQVRVUywKKwkJCQkJICAgICAgJmFuMTAwMF9zdGF0dXMpOworCQkJCWlmIChhbjEwMDBfc3RhdHVzICYgKDE8PDEpKSB7CisJCQkJCWV4dF9waHlfbGlua191cCA9IDE7CisJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKKwkJCQkJCSAiIHVwIGluIDFHXG4iLCBwYXJhbXMtPnBvcnQpOworCQkJCX0gZWxzZSBpZiAoZXh0X3BoeV9saW5rX3VwKSB7CisJCQkJCWV4dF9waHlfbGlua191cCA9IDE7CisJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCQkgInBvcnQgJXg6IEV4dGVybmFsIGxpbmsiCisJCQkJCQkgIiB1cCBpbiAxMEdcbiIsIHBhcmFtcy0+cG9ydCk7CisJCQkJfQorCQkJfQorCisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMToKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR19MQVNJX1NUQVRVUywgJnZhbDIpOworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMSk7CisJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkgIjEwRy1iYXNlLVQgTEFTSSBzdGF0dXMgMHgleC0+MHgleFxuIiwKKwkJCQkgIHZhbDIsIHZhbDEpOworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX1NUQVRVUywgJnZhbDIpOworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkJICAgICAgTURJT19QTUFfUkVHX1NUQVRVUywgJnZhbDEpOworCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICIxMEctYmFzZS1UIFBNQSBzdGF0dXMgMHgleC0+MHgleFxuIiwKKwkJCQkgdmFsMiwgdmFsMSk7CisJCQlleHRfcGh5X2xpbmtfdXAgPSAoKHZhbDEgJiA0KSA9PSA0KTsKKwkJCS8qIGlmIGxpbmsgaXMgdXAKKwkJCSAqIHByaW50IHRoZSBBTiBvdXRjb21lIG9mIHRoZSBTRlg3MTAxIFBIWQorCQkJICovCisJCQlpZiAoZXh0X3BoeV9saW5rX3VwKSB7CisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAorCQkJCQkgICAgICBNRElPX0FOX1JFR19NQVNURVJfU1RBVFVTLAorCQkJCQkgICAgICAmdmFsMik7CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCQkgIlNGWDcxMDEgQU4gc3RhdHVzIDB4JXgtPk1hc3Rlcj0leFxuIiwKKwkJCQkJICB2YWwyLAorCQkJCQkgKHZhbDIgJiAoMTw8MTQpKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODIzOgorCQkJLyogQ2hlY2sgMTBHLUJhc2VUIGxpbmsgc3RhdHVzICovCisJCQkvKiBDaGVjayBQTUQgc2lnbmFsIG9rICovCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAorCQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKKwkJCQkJCSAgICAgIDB4RkZGQSwKKwkJCQkJCSAgICAgICZ2YWwxKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCisJCQkJICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgIE1ESU9fUE1BX1JFR184NDgxX1BNRF9TSUdOQUwsCisJCQkJICAgICAgJnZhbDIpOworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJQTURfU0lHTkFMIDEuYTgxMSA9IDB4JXhcbiIsIHZhbDIpOworCisJCQkvKiBDaGVjayBsaW5rIDEwRyAqLworCQkJaWYgKHZhbDIgJiAoMTw8MTEpKSB7CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQkJCWV4dF9waHlfbGlua191cCA9IDE7CisJCQkJYm54MnhfODQ4MV9zZXRfMTBHX2xlZF9tb2RlKHBhcmFtcywKKwkJCQkJCQkgIGV4dF9waHlfdHlwZSwKKwkJCQkJCQkgIGV4dF9waHlfYWRkcik7CisJCQl9IGVsc2UgeyAvKiBDaGVjayBMZWdhY3kgc3BlZWQgbGluayAqLworCQkJCXUxNiBsZWdhY3lfc3RhdHVzLCBsZWdhY3lfc3BlZWQ7CisKKwkJCQkvKiBFbmFibGUgZXhwYW5zaW9uIHJlZ2lzdGVyIDB4NDIKKwkJCQkoT3BlcmF0aW9uIG1vZGUgc3RhdHVzKSAqLworCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKKwkJCQkJIGV4dF9waHlfdHlwZSwKKwkJCQkJIGV4dF9waHlfYWRkciwKKwkJCQkJIE1ESU9fQU5fREVWQUQsCisJCQkJCSBNRElPX0FOX1JFR184NDgxX0VYUEFOU0lPTl9SRUdfQUNDRVNTLAorCQkJCQkgMHhmNDIpOworCisJCQkJLyogR2V0IGxlZ2FjeSBzcGVlZCBvcGVyYXRpb24gc3RhdHVzICovCisJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCisJCQkJCSAgZXh0X3BoeV90eXBlLAorCQkJCQkgIGV4dF9waHlfYWRkciwKKwkJCQkJICBNRElPX0FOX0RFVkFELAorCQkJCQkgIE1ESU9fQU5fUkVHXzg0ODFfRVhQQU5TSU9OX1JFR19SRF9SVywKKwkJCQkJICAmbGVnYWN5X3N0YXR1cyk7CisKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIkxlZ2FjeSBzcGVlZCBzdGF0dXMiCisJCQkJCSAgICAgIiA9IDB4JXhcbiIsIGxlZ2FjeV9zdGF0dXMpOworCQkJCWV4dF9waHlfbGlua191cCA9ICgobGVnYWN5X3N0YXR1cyAmICgxPDwxMSkpCisJCQkJCQkgICA9PSAoMTw8MTEpKTsKKwkJCQlpZiAoZXh0X3BoeV9saW5rX3VwKSB7CisJCQkJCWxlZ2FjeV9zcGVlZCA9IChsZWdhY3lfc3RhdHVzICYgKDM8PDkpKTsKKwkJCQkJaWYgKGxlZ2FjeV9zcGVlZCA9PSAoMDw8OSkpCisJCQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTA7CisJCQkJCWVsc2UgaWYgKGxlZ2FjeV9zcGVlZCA9PSAoMTw8OSkpCisJCQkJCQl2YXJzLT5saW5lX3NwZWVkID0KKwkJCQkJCQlTUEVFRF8xMDA7CisJCQkJCWVsc2UgaWYgKGxlZ2FjeV9zcGVlZCA9PSAoMjw8OSkpCisJCQkJCQl2YXJzLT5saW5lX3NwZWVkID0KKwkJCQkJCQlTUEVFRF8xMDAwOworCQkJCQllbHNlIC8qIFNob3VsZCBub3QgaGFwcGVuICovCisJCQkJCQl2YXJzLT5saW5lX3NwZWVkID0gMDsKKworCQkJCQlpZiAobGVnYWN5X3N0YXR1cyAmICgxPDw4KSkKKwkJCQkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQkJCQllbHNlCisJCQkJCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCQkJCQlEUChORVRJRl9NU0dfTElOSywgIkxpbmsgaXMgdXAgIgorCQkJCQkJICAgICAiaW4gJWRNYnBzLCBpc19kdXBsZXhfZnVsbCIKKwkJCQkJCSAgICAgIj0gJWRcbiIsCisJCQkJCQl2YXJzLT5saW5lX3NwZWVkLAorCQkJCQkJKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkpOworCQkJCQlibngyeF84NDgxX3NldF9sZWdhY3lfbGVkX21vZGUocGFyYW1zLAorCQkJCQkJCQkgZXh0X3BoeV90eXBlLAorCQkJCQkJCQkgZXh0X3BoeV9hZGRyKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiQkFEIFhHWFMgZXh0X3BoeV9jb25maWcgMHgleFxuIiwKKwkJCSAgIHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQkJZXh0X3BoeV9saW5rX3VwID0gMDsKKwkJCWJyZWFrOworCQl9CisJCS8qIFNldCBTR01JSSBtb2RlIGZvciBleHRlcm5hbCBwaHkgKi8KKwkJaWYgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpIHsKKwkJCWlmICh2YXJzLT5saW5lX3NwZWVkIDwgU1BFRURfMTAwMCkKKwkJCQl2YXJzLT5waHlfZmxhZ3MgfD0gUEhZX1NHTUlJX0ZMQUc7CisJCQllbHNlCisJCQkJdmFycy0+cGh5X2ZsYWdzICY9IH5QSFlfU0dNSUlfRkxBRzsKKwkJfQorCisJfSBlbHNlIHsgLyogU2VyRGVzICovCisJCWV4dF9waHlfdHlwZSA9IFNFUkRFU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyBEaXJlY3RcbiIpOworCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9CQ001NDgyOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXJEZXMgNTQ4MlxuIik7CisJCQlleHRfcGh5X2xpbmtfdXAgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLAorCQkJCSAiQkFEIFNlckRlcyBleHRfcGh5X2NvbmZpZyAweCV4XG4iLAorCQkJCSBwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJCWV4dF9waHlfbGlua191cCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBleHRfcGh5X2xpbmtfdXA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2xpbmtfaW50X2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBleHRfcGh5X3R5cGU7CisJdTMyIG1hc2s7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwkvKiBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gcmVwb3J0IG9uIGxpbmsgdXAKKwkgICBmb3IgZWl0aGVyIFhHWFMgb3IgU2VyRGVzICovCisKKwlpZiAocGFyYW1zLT5zd2l0Y2hfY2ZnID09IFNXSVRDSF9DRkdfMTBHKSB7CisJCW1hc2sgPSAoTklHX01BU0tfWEdYUzBfTElOSzEwRyB8CisJCQlOSUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUyk7CisJCURQKE5FVElGX01TR19MSU5LLCAiZW5hYmxlZCBYR1hTIGludGVycnVwdFxuIik7CisJCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQlpZiAoKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCisJCSAgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0ZBSUxVUkUpICYmCisJCSAgICAoZXh0X3BoeV90eXBlICE9CisJCQkJUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTk9UX0NPTk4pKSB7CisJCQltYXNrIHw9IE5JR19NQVNLX01JX0lOVDsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiZW5hYmxlZCBleHRlcm5hbCBwaHkgaW50XG4iKTsKKwkJfQorCisJfSBlbHNlIHsgLyogU2VyRGVzICovCisJCW1hc2sgPSBOSUdfTUFTS19TRVJERVMwX0xJTktfU1RBVFVTOworCQlEUChORVRJRl9NU0dfTElOSywgImVuYWJsZWQgU2VyRGVzIGludGVycnVwdFxuIik7CisJCWV4dF9waHlfdHlwZSA9IFNFUkRFU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJCWlmICgoZXh0X3BoeV90eXBlICE9CisJCQkJUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCisJCSAgICAoZXh0X3BoeV90eXBlICE9CisJCQkJUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9OT1RfQ09OTikpIHsKKwkJCW1hc2sgfD0gTklHX01BU0tfTUlfSU5UOworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJlbmFibGVkIGV4dGVybmFsIHBoeSBpbnRcbiIpOworCQl9CisJfQorCWJueDJ4X2JpdHNfZW4oYnAsCisJCSAgICAgIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCisJCSAgICAgIG1hc2spOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJwb3J0ICV4LCBpc194Z3hzICV4LCBpbnRfc3RhdHVzIDB4JXhcbiIsIHBvcnQsCisJCSAocGFyYW1zLT5zd2l0Y2hfY2ZnID09IFNXSVRDSF9DRkdfMTBHKSwKKwkJIFJFR19SRChicCwgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0KSk7CisJRFAoTkVUSUZfTVNHX0xJTkssICIgaW50X21hc2sgMHgleCwgTUlfSU5UICV4LCBTRVJERVNfTElOSyAleFxuIiwKKwkJIFJFR19SRChicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCksCisJCSBSRUdfUkQoYnAsIE5JR19SRUdfRU1BQzBfU1RBVFVTX01JU0NfTUlfSU5UICsgcG9ydCoweDE4KSwKKwkJIFJFR19SRChicCwgTklHX1JFR19TRVJERVMwX1NUQVRVU19MSU5LX1NUQVRVUytwb3J0KjB4M2MpKTsKKwlEUChORVRJRl9NU0dfTElOSywgIiAxMEcgJXgsIFhHWFNfTElOSyAleFxuIiwKKwkgICBSRUdfUkQoYnAsIE5JR19SRUdfWEdYUzBfU1RBVFVTX0xJTksxMEcgKyBwb3J0KjB4NjgpLAorCSAgIFJFR19SRChicCwgTklHX1JFR19YR1hTMF9TVEFUVVNfTElOS19TVEFUVVMgKyBwb3J0KjB4NjgpKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfODQ4MV9yZWFybV9sYXRjaF9zaWduYWwoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwKKwkJCQkJdTggaXNfbWlfaW50KQoreworCXUzMiBsYXRjaF9zdGF0dXMgPSAwLCBpc19taV9pbnRfc3RhdHVzOworCS8qIERpc2FibGUgdGhlIE1JIElOVCAoIGV4dGVybmFsIHBoeSBpbnQgKQorCSAqIGJ5IHdyaXRpbmcgMSB0byB0aGUgc3RhdHVzIHJlZ2lzdGVyLiBMaW5rIGRvd24gaW5kaWNhdGlvbgorCSAqIGlzIGhpZ2gtYWN0aXZlLXNpZ25hbCwgc28gaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gd3JpdGUgdGhlCisJICogc3RhdHVzIHRvIGNsZWFyIHRoZSBYT1IKKwkgKi8KKwkvKiBSZWFkIExhdGNoZWQgc2lnbmFscyAqLworCWxhdGNoX3N0YXR1cyA9IFJFR19SRChicCwKKwkJCQkgIE5JR19SRUdfTEFUQ0hfU1RBVFVTXzAgKyBwb3J0KjgpOworCWlzX21pX2ludF9zdGF0dXMgPSBSRUdfUkQoYnAsCisJCQkJICBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQpOworCURQKE5FVElGX01TR19MSU5LLCAib3JpZ2luYWxfc2lnbmFsID0gMHgleCwgbmlnX3N0YXR1cyA9IDB4JXgsIgorCQkgICAgICJsYXRjaF9zdGF0dXMgPSAweCV4XG4iLAorCQkgaXNfbWlfaW50LCBpc19taV9pbnRfc3RhdHVzLCBsYXRjaF9zdGF0dXMpOworCS8qIEhhbmRsZSBvbmx5IHRob3NlIHdpdGggbGF0Y2hlZC1zaWduYWw9dXAuKi8KKwlpZiAobGF0Y2hfc3RhdHVzICYgMSkgeworCQkvKiBGb3IgYWxsIGxhdGNoZWQtc2lnbmFsPXVwLFdyaXRlIG9yaWdpbmFsX3NpZ25hbCB0byBzdGF0dXMgKi8KKwkJaWYgKGlzX21pX2ludCkKKwkJCWJueDJ4X2JpdHNfZW4oYnAsCisJCQkJICAgIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMAorCQkJCSAgICArIHBvcnQqNCwKKwkJCQkgICAgTklHX1NUQVRVU19FTUFDMF9NSV9JTlQpOworCQllbHNlCisJCQlibngyeF9iaXRzX2RpcyhicCwKKwkJCQkgICAgIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMAorCQkJCSAgICAgKyBwb3J0KjQsCisJCQkJICAgICBOSUdfU1RBVFVTX0VNQUMwX01JX0lOVCk7CisJCS8qIEZvciBhbGwgbGF0Y2hlZC1zaWduYWw9dXAgOiBSZS1Bcm0gTGF0Y2ggc2lnbmFscyAqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfTEFUQ0hfU1RBVFVTXzAgKyBwb3J0KjgsCisJCQkgICAobGF0Y2hfc3RhdHVzICYgMHhmZmZlKSB8IChsYXRjaF9zdGF0dXMgJiAxKSk7CisJfQorfQorLyoKKyAqIGxpbmsgbWFuYWdlbWVudAorICovCitzdGF0aWMgdm9pZCBibngyeF9saW5rX2ludF9hY2soc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IGlzXzEwZywKKwkJCSAgICAgdTggaXNfbWlfaW50KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisKKwkvKiBmaXJzdCByZXNldCBhbGwgc3RhdHVzCisJICogd2UgYXNzdW1lIG9ubHkgb25lIGxpbmUgd2lsbCBiZSBjaGFuZ2UgYXQgYSB0aW1lICovCisJYm54MnhfYml0c19kaXMoYnAsIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwKKwkJICAgICAoTklHX1NUQVRVU19YR1hTMF9MSU5LMTBHIHwKKwkJICAgICAgTklHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVUyB8CisJCSAgICAgIE5JR19TVEFUVVNfU0VSREVTMF9MSU5LX1NUQVRVUykpOworCWlmICgoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykKKwkJPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSkgfHwKKwkoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykKKwkJPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MjMpKSB7CisJCWJueDJ4Xzg0ODFfcmVhcm1fbGF0Y2hfc2lnbmFsKGJwLCBwb3J0LCBpc19taV9pbnQpOworCX0KKwlpZiAodmFycy0+cGh5X2xpbmtfdXApIHsKKwkJaWYgKGlzXzEwZykgeworCQkJLyogRGlzYWJsZSB0aGUgMTBHIGxpbmsgaW50ZXJydXB0CisJCQkgKiBieSB3cml0aW5nIDEgdG8gdGhlIHN0YXR1cyByZWdpc3RlcgorCQkJICovCisJCQlEUChORVRJRl9NU0dfTElOSywgIjEwRyBYR1hTIHBoeSBsaW5rIHVwXG4iKTsKKwkJCWJueDJ4X2JpdHNfZW4oYnAsCisJCQkJICAgICAgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAorCQkJCSAgICAgIE5JR19TVEFUVVNfWEdYUzBfTElOSzEwRyk7CisKKwkJfSBlbHNlIGlmIChwYXJhbXMtPnN3aXRjaF9jZmcgPT0gU1dJVENIX0NGR18xMEcpIHsKKwkJCS8qIERpc2FibGUgdGhlIGxpbmsgaW50ZXJydXB0CisJCQkgKiBieSB3cml0aW5nIDEgdG8gdGhlIHJlbGV2YW50IGxhbmUKKwkJCSAqIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIKKwkJCSAqLworCQkJdTMyIHNlcl9sYW5lID0gKChwYXJhbXMtPmxhbmVfY29uZmlnICYKKwkJCQkgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfTUFTSykgPj4KKwkJCQkgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfU0hJRlQpOworCisJCQlEUChORVRJRl9NU0dfTElOSywgIiVkIHNwZWVkIFhHWFMgcGh5IGxpbmsgdXBcbiIsCisJCQkJIHZhcnMtPmxpbmVfc3BlZWQpOworCQkJYm54MnhfYml0c19lbihicCwKKwkJCQkgICAgICBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCisJCQkJICAgICAgKCgxIDw8IHNlcl9sYW5lKSA8PAorCQkJCSAgICAgICBOSUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTX1NJWkUpKTsKKworCQl9IGVsc2UgeyAvKiBTZXJEZXMgKi8KKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVzIHBoeSBsaW5rIHVwXG4iKTsKKwkJCS8qIERpc2FibGUgdGhlIGxpbmsgaW50ZXJydXB0CisJCQkgKiBieSB3cml0aW5nIDEgdG8gdGhlIHN0YXR1cyByZWdpc3RlcgorCQkJICovCisJCQlibngyeF9iaXRzX2VuKGJwLAorCQkJCSAgICAgIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwKKwkJCQkgICAgICBOSUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVMpOworCQl9CisKKwl9IGVsc2UgeyAvKiBsaW5rX2Rvd24gKi8KKwl9Cit9CisKK3N0YXRpYyB1OCBibngyeF9mb3JtYXRfdmVyKHUzMiBudW0sIHU4ICpzdHIsIHUxNiBsZW4pCit7CisJdTggKnN0cl9wdHIgPSBzdHI7CisJdTMyIG1hc2sgPSAweGYwMDAwMDAwOworCXU4IHNoaWZ0ID0gOCo0OworCXU4IGRpZ2l0OworCWlmIChsZW4gPCAxMCkgeworCQkvKiBOZWVkIG1vcmUgdGhhbiAxMGNoYXJzIGZvciB0aGlzIGZvcm1hdCAqLworCQkqc3RyX3B0ciA9ICdcMCc7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3aGlsZSAoc2hpZnQgPiAwKSB7CisKKwkJc2hpZnQgLT0gNDsKKwkJZGlnaXQgPSAoKG51bSAmIG1hc2spID4+IHNoaWZ0KTsKKwkJaWYgKGRpZ2l0IDwgMHhhKQorCQkJKnN0cl9wdHIgPSBkaWdpdCArICcwJzsKKwkJZWxzZQorCQkJKnN0cl9wdHIgPSBkaWdpdCAtIDB4YSArICdhJzsKKwkJc3RyX3B0cisrOworCQltYXNrID0gbWFzayA+PiA0OworCQlpZiAoc2hpZnQgPT0gNCo0KSB7CisJCQkqc3RyX3B0ciA9ICc6JzsKKwkJCXN0cl9wdHIrKzsKKwkJfQorCX0KKwkqc3RyX3B0ciA9ICdcMCc7CisJcmV0dXJuIDA7Cit9CisKK3U4IGJueDJ4X2dldF9leHRfcGh5X2Z3X3ZlcnNpb24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IGRyaXZlcl9sb2FkZWQsCisJCQkgICAgICB1OCAqdmVyc2lvbiwgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwOworCXUzMiBleHRfcGh5X3R5cGUgPSAwOworCXUzMiBzcGlyb21fdmVyID0gMDsKKwl1OCBzdGF0dXM7CisKKwlpZiAodmVyc2lvbiA9PSBOVUxMIHx8IHBhcmFtcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlicCA9IHBhcmFtcy0+YnA7CisKKwlzcGlyb21fdmVyID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJICAgIHBvcnRfbWJbcGFyYW1zLT5wb3J0XS5leHRfcGh5X2Z3X3ZlcnNpb24pKTsKKworCXN0YXR1cyA9IDA7CisJLyogcmVzZXQgdGhlIHJldHVybmVkIHZhbHVlIHRvIHplcm8gKi8KKwlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMToKKworCQlpZiAobGVuIDwgNSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZlcnNpb25bMF0gPSAoc3Bpcm9tX3ZlciAmIDB4RkYpOworCQl2ZXJzaW9uWzFdID0gKHNwaXJvbV92ZXIgJiAweEZGMDApID4+IDg7CisJCXZlcnNpb25bMl0gPSAoc3Bpcm9tX3ZlciAmIDB4RkYwMDAwKSA+PiAxNjsKKwkJdmVyc2lvblszXSA9IChzcGlyb21fdmVyICYgMHhGRjAwMDAwMCkgPj4gMjQ7CisJCXZlcnNpb25bNF0gPSAnXDAnOworCisJCWJyZWFrOworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6CisJCXN0YXR1cyA9IGJueDJ4X2Zvcm1hdF92ZXIoc3Bpcm9tX3ZlciwgdmVyc2lvbiwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxOgorCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MjM6CisJCXNwaXJvbV92ZXIgPSAoKHNwaXJvbV92ZXIgJiAweEY4MCkgPj4gNykgPDwgMTYgfAorCQkJKHNwaXJvbV92ZXIgJiAweDdGKTsKKwkJc3RhdHVzID0gYm54MnhfZm9ybWF0X3ZlcihzcGlyb21fdmVyLCB2ZXJzaW9uLCBsZW4pOworCQlicmVhazsKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6CisJCXZlcnNpb25bMF0gPSAnXDAnOworCQlicmVhazsKKworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRToKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9nZXRfZXh0X3BoeV9md192ZXJzaW9uOiIKKwkJCQkgICAgIiB0eXBlIGlzIEZBSUxVUkUhXG4iKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2V0X3hneHNfbG9vcGJhY2soc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJCSAgdTggaXNfMTBnKQoreworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwlpZiAoaXNfMTBnKSB7CisJCXUzMiBtZF9kZXZhZDsKKworCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgMTBHIGxvb3BiYWNrIGVuYWJsZVxuIik7CisKKwkJLyogY2hhbmdlIHRoZSB1bmlfcGh5X2FkZHIgaW4gdGhlIG5pZyAqLworCQltZF9kZXZhZCA9IFJFR19SRChicCwgKE5JR19SRUdfWEdYUzBfQ1RSTF9NRF9ERVZBRCArCisJCQkJCSAgcG9ydCoweDE4KSk7CisKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFMwX0NUUkxfTURfREVWQUQgKyBwb3J0KjB4MTgsIDB4NSk7CisKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgMCwKKwkJCSAgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgIDUsCisJCQkgICAgICAgKE1ESU9fUkVHX0JBTktfQUVSX0JMT0NLICsKKwkJCQkoTURJT19BRVJfQkxPQ0tfQUVSX1JFRyAmIDB4ZikpLAorCQkJICAgICAgIDB4MjgwMCk7CisKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgMCwKKwkJCSAgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJICAgICAgIDUsCisJCQkgICAgICAgKE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjAgKworCQkJCShNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCAmIDB4ZikpLAorCQkJICAgICAgIDB4NjA0MSk7CisJCW1zbGVlcCgyMDApOworCQkvKiBzZXQgYWVyIG1tZCBiYWNrICovCisJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgdmFycyk7CisKKwkJLyogYW5kIG1kX2RldmFkICovCisJCVJFR19XUihicCwgTklHX1JFR19YR1hTMF9DVFJMX01EX0RFVkFEICsgcG9ydCoweDE4LAorCQkJICAgIG1kX2RldmFkKTsKKworCX0gZWxzZSB7CisJCXUxNiBtaWlfY29udHJvbDsKKworCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgMUcgbG9vcGJhY2sgZW5hYmxlXG4iKTsKKworCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcG9ydCwKKwkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAorCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCisJCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKKwkJCQkgICAgICAmbWlpX2NvbnRyb2wpOworCisJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwb3J0LAorCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKKwkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAorCQkJCSAgICAgIChtaWlfY29udHJvbCB8CisJCQkJICAgICAgIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9MT09QQkFDSykpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBibngyeF9leHRfcGh5X2xvb3BiYWNrKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IGV4dF9waHlfYWRkcjsKKwl1MzIgZXh0X3BoeV90eXBlOworCisJaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzEwRykgeworCQlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJCS8qIENMMzcgQXV0b25lZyBFbmFibGVkICovCisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX05PVF9DT05OOgorCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJImV4dF9waHlfbG9vcGJhY2s6IFdlIHNob3VsZCBub3QgZ2V0IGhlcmVcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKKwkJCURQKE5FVElGX01TR19MSU5LLCAiZXh0X3BoeV9sb29wYmFjazogODcwNVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJleHRfcGh5X2xvb3BiYWNrOiA4NzA2XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlBNQS9QTUQgZXh0X3BoeV9sb29wYmFjazogODcyNlxuIik7CisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCisJCQkJICAgICAgIDB4MDAwMSk7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxOgorCQkJLyogU0ZYNzEwMV9YR1hTX1RFU1QxICovCisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKKwkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAorCQkJCSAgICAgICBNRElPX1hTX0RFVkFELAorCQkJCSAgICAgICBNRElPX1hTX1NGWDcxMDFfWEdYU19URVNUMSwKKwkJCQkgICAgICAgMHgxMDApOworCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJImV4dF9waHlfbG9vcGJhY2s6IHNldCBleHQgcGh5IGxvb3BiYWNrXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6CisKKwkJCWJyZWFrOworCQl9IC8qIHN3aXRjaCBleHRlcm5hbCBQSFkgdHlwZSAqLworCX0gZWxzZSB7CisJCS8qIHNlcmRlcyAqLworCQlleHRfcGh5X3R5cGUgPSBTRVJERVNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCQlleHRfcGh5X2FkZHIgPSAocGFyYW1zLT5leHRfcGh5X2NvbmZpZyAgJgorCQlQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9BRERSX01BU0spCisJCT4+IFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX0FERFJfU0hJRlQ7CisJfQorfQorCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYm54Mnhfb3ZlcnJpZGVfbGVkX3ZhbHVlIC0KKyAqCisgKiBPdmVycmlkZSB0aGUgbGVkIHZhbHVlIG9mIHRoZSByZXF1c3RlZCBsZWQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit1OCBibngyeF9vdmVycmlkZV9sZWRfdmFsdWUoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwKKwkJCSAgdTMyIGxlZF9pZHgsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCS8qIElmIHBvcnQgMCB0aGVuIHVzZSBFTUFDMCwgZWxzZSB1c2UgRU1BQzEqLworCXUzMiBlbWFjX2Jhc2UgPSAocG9ydCkgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKKworCURQKE5FVElGX01TR19MSU5LLAorCQkgImJueDJ4X292ZXJyaWRlX2xlZF92YWx1ZSgpIHBvcnQgJXggbGVkX2lkeCAlZCB2YWx1ZSAlZFxuIiwKKwkJIHBvcnQsIGxlZF9pZHgsIHZhbHVlKTsKKworCXN3aXRjaCAobGVkX2lkeCkgeworCWNhc2UgMDogLyogMTBNQiBsZWQgKi8KKwkJLyogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgTEVEIHJlZ2lzdGVyIGluCisJCXRoZSBFTUFDIGJsb2NrICovCisJCXJlZ192YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTEVEKTsKKwkJLyogU2V0IHRoZSBPVkVSUklERSBiaXQgdG8gMSAqLworCQlyZWdfdmFsIHw9IEVNQUNfTEVEX09WRVJSSURFOworCQkvKiBJZiB2YWx1ZSBpcyAxLCBzZXQgdGhlIDEwTV9PVkVSUklERSBiaXQsCisJCW90aGVyd2lzZSByZXNldCBpdC4qLworCQlyZWdfdmFsID0gKHZhbHVlID09IDEpID8gKHJlZ192YWwgfCBFTUFDX0xFRF8xME1CX09WRVJSSURFKSA6CisJCQkocmVnX3ZhbCAmIH5FTUFDX0xFRF8xME1CX09WRVJSSURFKTsKKwkJUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX0xFRCwgcmVnX3ZhbCk7CisJCWJyZWFrOworCWNhc2UgMTogLyoxMDBNQiBsZWQgICAgKi8KKwkJLypSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBMRUQgcmVnaXN0ZXIgaW4KKwkJdGhlIEVNQUMgYmxvY2sgKi8KKwkJcmVnX3ZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQpOworCQkvKiAgU2V0IHRoZSBPVkVSUklERSBiaXQgdG8gMSAqLworCQlyZWdfdmFsIHw9IEVNQUNfTEVEX09WRVJSSURFOworCQkvKiAgSWYgdmFsdWUgaXMgMSwgc2V0IHRoZSAxMDBNX09WRVJSSURFIGJpdCwKKwkJb3RoZXJ3aXNlIHJlc2V0IGl0LiovCisJCXJlZ192YWwgPSAodmFsdWUgPT0gMSkgPyAocmVnX3ZhbCB8IEVNQUNfTEVEXzEwME1CX09WRVJSSURFKSA6CisJCQkocmVnX3ZhbCAmIH5FTUFDX0xFRF8xMDBNQl9PVkVSUklERSk7CisJCVJFR19XUihicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQsIHJlZ192YWwpOworCQlicmVhazsKKwljYXNlIDI6IC8qIDEwMDBNQiBsZWQgKi8KKwkJLyogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgTEVEIHJlZ2lzdGVyIGluIHRoZQorCQlFTUFDIGJsb2NrICovCisJCXJlZ192YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTEVEKTsKKwkJLyogU2V0IHRoZSBPVkVSUklERSBiaXQgdG8gMSAqLworCQlyZWdfdmFsIHw9IEVNQUNfTEVEX09WRVJSSURFOworCQkvKiBJZiB2YWx1ZSBpcyAxLCBzZXQgdGhlIDEwMDBNX09WRVJSSURFIGJpdCwgb3RoZXJ3aXNlCisJCXJlc2V0IGl0LiAqLworCQlyZWdfdmFsID0gKHZhbHVlID09IDEpID8gKHJlZ192YWwgfCBFTUFDX0xFRF8xMDAwTUJfT1ZFUlJJREUpIDoKKwkJCShyZWdfdmFsICYgfkVNQUNfTEVEXzEwMDBNQl9PVkVSUklERSk7CisJCVJFR19XUihicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQsIHJlZ192YWwpOworCQlicmVhazsKKwljYXNlIDM6IC8qIDI1MDBNQiBsZWQgKi8KKwkJLyogIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIExFRCByZWdpc3RlciBpbiB0aGUKKwkJRU1BQyBibG9jayovCisJCXJlZ192YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTEVEKTsKKwkJLyogU2V0IHRoZSBPVkVSUklERSBiaXQgdG8gMSAqLworCQlyZWdfdmFsIHw9IEVNQUNfTEVEX09WRVJSSURFOworCQkvKiAgSWYgdmFsdWUgaXMgMSwgc2V0IHRoZSAyNTAwTV9PVkVSUklERSBiaXQsIG90aGVyd2lzZQorCQlyZXNldCBpdC4qLworCQlyZWdfdmFsID0gKHZhbHVlID09IDEpID8gKHJlZ192YWwgfCBFTUFDX0xFRF8yNTAwTUJfT1ZFUlJJREUpIDoKKwkJCShyZWdfdmFsICYgfkVNQUNfTEVEXzI1MDBNQl9PVkVSUklERSk7CisJCVJFR19XUihicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQsIHJlZ192YWwpOworCQlicmVhazsKKwljYXNlIDQ6IC8qMTBHIGxlZCAqLworCQlpZiAocG9ydCA9PSAwKSB7CisJCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEXzEwR19QMCwKKwkJCQkgICAgdmFsdWUpOworCQl9IGVsc2UgeworCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF8xMEdfUDEsCisJCQkJICAgIHZhbHVlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDU6IC8qIFRSQUZGSUMgbGVkICovCisJCS8qIEZpbmQgaWYgdGhlIHRyYWZmaWMgY29udHJvbCBpcyB2aWEgQk1BQyBvciBFTUFDICovCisJCWlmIChwb3J0ID09IDApCisJCQlyZWdfdmFsID0gUkVHX1JEKGJwLCBOSUdfUkVHX05JR19FTUFDMF9FTik7CisJCWVsc2UKKwkJCXJlZ192YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfTklHX0VNQUMxX0VOKTsKKworCQkvKiAgT3ZlcnJpZGUgdGhlIHRyYWZmaWMgbGVkIGluIHRoZSBFTUFDOiovCisJCWlmIChyZWdfdmFsID09IDEpIHsKKwkJCS8qIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIExFRCByZWdpc3RlciBpbgorCQkJdGhlIEVNQUMgYmxvY2sgKi8KKwkJCXJlZ192YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSArCisJCQkJCSAgICAgRU1BQ19SRUdfRU1BQ19MRUQpOworCQkJLyogU2V0IHRoZSBUUkFGRklDX09WRVJSSURFIGJpdCB0byAxICovCisJCQlyZWdfdmFsIHw9IEVNQUNfTEVEX09WRVJSSURFOworCQkJLyogSWYgdmFsdWUgaXMgMSwgc2V0IHRoZSBUUkFGRklDIGJpdCwgb3RoZXJ3aXNlCisJCQlyZXNldCBpdC4qLworCQkJcmVnX3ZhbCA9ICh2YWx1ZSA9PSAxKSA/IChyZWdfdmFsIHwgRU1BQ19MRURfVFJBRkZJQykgOgorCQkJCShyZWdfdmFsICYgfkVNQUNfTEVEX1RSQUZGSUMpOworCQkJUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX0xFRCwgcmVnX3ZhbCk7CisJCX0gZWxzZSB7IC8qIE92ZXJyaWRlIHRoZSB0cmFmZmljIGxlZCBpbiB0aGUgQk1BQzogKi8KKwkJCVJFR19XUihicCwgTklHX1JFR19MRURfQ09OVFJPTF9PVkVSUklERV9UUkFGRklDX1AwCisJCQkJICAgKyBwb3J0KjQsIDEpOworCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX1RSQUZGSUNfUDAgKyBwb3J0KjQsCisJCQkJICAgIHZhbHVlKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUChORVRJRl9NU0dfTElOSywKKwkJCSAiYm54Mnhfb3ZlcnJpZGVfbGVkX3ZhbHVlKCkgdW5rbm93biBsZWQgaW5kZXggJWQgIgorCQkJICIoc2hvdWxkIGJlIDAtNSlcbiIsIGxlZF9pZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit1OCBibngyeF9zZXRfbGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1OCBtb2RlLCB1MzIgc3BlZWQpCit7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1MTYgaHdfbGVkX21vZGUgPSBwYXJhbXMtPmh3X2xlZF9tb2RlOworCXU4IHJjID0gMDsKKwl1MzIgdG1wOworCXUzMiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CisJdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCURQKE5FVElGX01TR19MSU5LLCAiYm54Mnhfc2V0X2xlZDogcG9ydCAleCwgbW9kZSAlZFxuIiwgcG9ydCwgbW9kZSk7CisJRFAoTkVUSUZfTVNHX0xJTkssICJzcGVlZCAweCV4LCBod19sZWRfbW9kZSAweCV4XG4iLAorCQkgc3BlZWQsIGh3X2xlZF9tb2RlKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIExFRF9NT0RFX09GRjoKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF8xMEdfUDAgKyBwb3J0KjQsIDApOworCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX01PREVfUDAgKyBwb3J0KjQsCisJCQkgICBTSEFSRURfSFdfQ0ZHX0xFRF9NQUMxKTsKKworCQl0bXAgPSBFTUFDX1JEKGJwLCBFTUFDX1JFR19FTUFDX0xFRCk7CisJCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTEVELCAodG1wIHwgRU1BQ19MRURfT1ZFUlJJREUpKTsKKwkJYnJlYWs7CisKKwljYXNlIExFRF9NT0RFX09QRVI6CisJCWlmIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKSB7CisJCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX01PREVfUDAgKyBwb3J0KjQsIDApOworCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF8xMEdfUDAgKyBwb3J0KjQsIDEpOworCQl9IGVsc2UgeworCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9NT0RFX1AwICsgcG9ydCo0LAorCQkJCSAgIGh3X2xlZF9tb2RlKTsKKwkJfQorCisJCVJFR19XUihicCwgTklHX1JFR19MRURfQ09OVFJPTF9PVkVSUklERV9UUkFGRklDX1AwICsKKwkJCSAgIHBvcnQqNCwgMCk7CisJCS8qIFNldCBibGlua2luZyByYXRlIHRvIH4xNS45SHogKi8KKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX0JMSU5LX1JBVEVfUDAgKyBwb3J0KjQsCisJCQkgICBMRURfQkxJTktfUkFURV9WQUwpOworCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX0NPTlRST0xfQkxJTktfUkFURV9FTkFfUDAgKworCQkJICAgcG9ydCo0LCAxKTsKKwkJdG1wID0gRU1BQ19SRChicCwgRU1BQ19SRUdfRU1BQ19MRUQpOworCQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX0xFRCwKKwkJCSAgICAodG1wICYgKH5FTUFDX0xFRF9PVkVSUklERSkpKTsKKworCQlpZiAoQ0hJUF9JU19FMShicCkgJiYKKwkJICAgICgoc3BlZWQgPT0gU1BFRURfMjUwMCkgfHwKKwkJICAgICAoc3BlZWQgPT0gU1BFRURfMTAwMCkgfHwKKwkJICAgICAoc3BlZWQgPT0gU1BFRURfMTAwKSB8fAorCQkgICAgIChzcGVlZCA9PSBTUEVFRF8xMCkpKSB7CisJCQkvKiBPbiBFdmVyZXN0IDEgQXggY2hpcCB2ZXJzaW9ucyBmb3Igc3BlZWRzIGxlc3MgdGhhbgorCQkJMTBHIExFRCBzY2hlbWUgaXMgZGlmZmVyZW50ICovCisJCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX0NPTlRST0xfT1ZFUlJJREVfVFJBRkZJQ19QMAorCQkJCSAgICsgcG9ydCo0LCAxKTsKKwkJCVJFR19XUihicCwgTklHX1JFR19MRURfQ09OVFJPTF9UUkFGRklDX1AwICsKKwkJCQkgICBwb3J0KjQsIDApOworCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX0JMSU5LX1RSQUZGSUNfUDAgKworCQkJCSAgIHBvcnQqNCwgMSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54Mnhfc2V0X2xlZDogSW52YWxpZCBsZWQgbW9kZSAlZFxuIiwKKwkJCSBtb2RlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKKworfQorCit1OCBibngyeF90ZXN0X2xpbmsoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IGdwX3N0YXR1cyA9IDA7CisKKwlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAorCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKKwkJCSAgICAgIE1ESU9fUkVHX0JBTktfR1BfU1RBVFVTLAorCQkJICAgICAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzEsCisJCQkgICAgICAmZ3Bfc3RhdHVzKTsKKwkvKiBsaW5rIGlzIHVwIG9ubHkgaWYgYm90aCBsb2NhbCBwaHkgYW5kIGV4dGVybmFsIHBoeSBhcmUgdXAgKi8KKwlpZiAoKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0xJTktfU1RBVFVTKSAmJgorCSAgICBibngyeF9leHRfcGh5X2lzX2xpbmtfdXAocGFyYW1zLCB2YXJzLCAxKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVTUkNIOworfQorCitzdGF0aWMgdTggYm54MnhfbGlua19pbml0aWFsaXplKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXU4IHJjID0gMDsKKwl1OCBub25fZXh0X3BoeTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwkvKiBBY3RpdmF0ZSB0aGUgZXh0ZXJuYWwgUEhZICovCisJYm54MnhfZXh0X3BoeV9yZXNldChwYXJhbXMsIHZhcnMpOworCisJYm54Mnhfc2V0X2Flcl9tbWQocGFyYW1zLCB2YXJzKTsKKworCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKQorCQlibngyeF9zZXRfbWFzdGVyX2xuKHBhcmFtcyk7CisKKwlyYyA9IGJueDJ4X3Jlc2V0X3VuaWNvcmUocGFyYW1zKTsKKwkvKiByZXNldCB0aGUgU2VyRGVzIGFuZCB3YWl0IGZvciByZXNldCBiaXQgcmV0dXJuIGxvdyAqLworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlibngyeF9zZXRfYWVyX21tZChwYXJhbXMsIHZhcnMpOworCisJLyogc2V0dGluZyB0aGUgbWFzdGVyTG5fZGVmIGFnYWluIGFmdGVyIHRoZSByZXNldCAqLworCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCWJueDJ4X3NldF9tYXN0ZXJfbG4ocGFyYW1zKTsKKwkJYm54Mnhfc2V0X3N3YXBfbGFuZXMocGFyYW1zKTsKKwl9CisKKwlpZiAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQlpZiAoKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgJiYKKwkJICAgICgocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDApIHx8CisJCSAgICAgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTApKSkgfHwKKwkJICAgICghcGFyYW1zLT5yZXFfbGluZV9zcGVlZCAmJgorCQkgICAgIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrID49CisJCSAgICAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwTV9GVUxMKSAmJgorCQkgICAgIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrIDwKKwkJICAgICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcpCisJCSAgICAgKSkgIHsKKwkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsKKwkJfSBlbHNlIHsKKwkJCXZhcnMtPnBoeV9mbGFncyAmPSB+UEhZX1NHTUlJX0ZMQUc7CisJCX0KKwl9CisJLyogSW4gY2FzZSBvZiBleHRlcm5hbCBwaHkgZXhpc3RhbmNlLCB0aGUgbGluZSBzcGVlZCB3b3VsZCBiZSB0aGUKKwkgbGluZSBzcGVlZCBsaW5rZWQgdXAgYnkgdGhlIGV4dGVybmFsIHBoeS4gSW4gY2FzZSBpdCBpcyBkaXJlY3Qgb25seSwKKwkgIHRoZW4gdGhlIGxpbmVfc3BlZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZXF1YWwgdG8gdGhlCisJICAgcmVxX2xpbmVfc3BlZWQqLworCXZhcnMtPmxpbmVfc3BlZWQgPSBwYXJhbXMtPnJlcV9saW5lX3NwZWVkOworCisJYm54MnhfY2FsY19pZWVlX2FuZWdfYWR2KHBhcmFtcywgJnZhcnMtPmllZWVfZmMpOworCisJLyogaW5pdCBleHQgcGh5IGFuZCBlbmFibGUgbGluayBzdGF0ZSBpbnQgKi8KKwlub25fZXh0X3BoeSA9ICgoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgfHwKKwkJICAgICAgIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfWEdYU18xMCkpOworCisJaWYgKG5vbl9leHRfcGh5IHx8CisJICAgIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNSkgfHwKKwkgICAgKGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2KSB8fAorCSAgICAoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpIHx8CisJICAgIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfRVhUX1BIWSkpIHsKKwkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpCisJCQlibngyeF9zZXRfcGFyYWxsZWxfZGV0ZWN0aW9uKHBhcmFtcywgdmFycy0+cGh5X2ZsYWdzKTsKKwkJYm54MnhfaW5pdF9pbnRlcm5hbF9waHkocGFyYW1zLCB2YXJzLCBub25fZXh0X3BoeSk7CisJfQorCisJaWYgKCFub25fZXh0X3BoeSkKKwkJcmMgfD0gYm54MnhfZXh0X3BoeV9pbml0KHBhcmFtcywgdmFycyk7CisKKwlibngyeF9iaXRzX2RpcyhicCwgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAorCQkgICAgIChOSUdfU1RBVFVTX1hHWFMwX0xJTksxMEcgfAorCQkgICAgICBOSUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTIHwKKwkJICAgICAgTklHX1NUQVRVU19TRVJERVMwX0xJTktfU1RBVFVTKSk7CisKKwlyZXR1cm4gcmM7CisKK30KKworCit1OCBibngyeF9waHlfaW5pdChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgdmFsOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJQaHkgSW5pdGlhbGl6YXRpb24gc3RhcnRlZFxuIik7CisJRFAoTkVUSUZfTVNHX0xJTkssICJyZXFfc3BlZWQgJWQsIHJlcV9mbG93Y3RybCAlZFxuIiwKKwkJIHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQsIHBhcmFtcy0+cmVxX2Zsb3dfY3RybCk7CisJdmFycy0+bGlua19zdGF0dXMgPSAwOworCXZhcnMtPnBoeV9saW5rX3VwID0gMDsKKwl2YXJzLT5saW5rX3VwID0gMDsKKwl2YXJzLT5saW5lX3NwZWVkID0gMDsKKwl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX05PTkU7CisKKwlpZiAocGFyYW1zLT5zd2l0Y2hfY2ZnID09ICBTV0lUQ0hfQ0ZHXzFHKQorCQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfU0VSREVTX0ZMQUc7CisJZWxzZQorCQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfWEdYU19GTEFHOworCisJLyogZGlzYWJsZSBhdHRlbnRpb25zICovCisJYm54MnhfYml0c19kaXMoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwYXJhbXMtPnBvcnQqNCwKKwkJICAgICAgIChOSUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUyB8CisJCQlOSUdfTUFTS19YR1hTMF9MSU5LMTBHIHwKKwkJCU5JR19NQVNLX1NFUkRFUzBfTElOS19TVEFUVVMgfAorCQkJTklHX01BU0tfTUlfSU5UKSk7CisKKwlibngyeF9lbWFjX2luaXQocGFyYW1zLCB2YXJzKTsKKworCWlmIChDSElQX1JFVl9JU19GUEdBKGJwKSkgeworCisJCXZhcnMtPmxpbmtfdXAgPSAxOworCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwkJdmFycy0+bGlua19zdGF0dXMgPSAoTElOS19TVEFUVVNfTElOS19VUCB8IExJTktfMTBHVEZEKTsKKwkJLyogZW5hYmxlIG9uIEUxLjUgRlBHQSAqLworCQlpZiAoQ0hJUF9JU19FMUgoYnApKSB7CisJCQl2YXJzLT5mbG93X2N0cmwgfD0KKwkJCQkJKEJOWDJYX0ZMT1dfQ1RSTF9UWCB8CisJCQkJCSBCTlgyWF9GTE9XX0NUUkxfUlgpOworCQkJdmFycy0+bGlua19zdGF0dXMgfD0KKwkJCQkJKExJTktfU1RBVFVTX1RYX0ZMT1dfQ09OVFJPTF9FTkFCTEVEIHwKKwkJCQkJIExJTktfU1RBVFVTX1JYX0ZMT1dfQ09OVFJPTF9FTkFCTEVEKTsKKwkJfQorCisJCWJueDJ4X2VtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7CisJCWJueDJ4X3BiZl91cGRhdGUocGFyYW1zLCB2YXJzLT5mbG93X2N0cmwsIHZhcnMtPmxpbmVfc3BlZWQpOworCQkvKiBkaXNhYmxlIGRyYWluICovCisJCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwYXJhbXMtPnBvcnQqNCwgMCk7CisKKwkJLyogdXBkYXRlIHNoYXJlZCBtZW1vcnkgKi8KKwkJYm54MnhfdXBkYXRlX21uZyhwYXJhbXMsIHZhcnMtPmxpbmtfc3RhdHVzKTsKKworCQlyZXR1cm4gMDsKKworCX0gZWxzZQorCWlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkgeworCisJCXZhcnMtPmxpbmtfdXAgPSAxOworCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwkJdmFycy0+bGlua19zdGF0dXMgPSAoTElOS19TVEFUVVNfTElOS19VUCB8IExJTktfMTBHVEZEKTsKKworCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOworCisJCWJueDJ4X3BiZl91cGRhdGUocGFyYW1zLCB2YXJzLT5mbG93X2N0cmwsIHZhcnMtPmxpbmVfc3BlZWQpOworCQkvKiBEaXNhYmxlIGRyYWluICovCisJCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUKKwkJCQkgICAgKyBwYXJhbXMtPnBvcnQqNCwgMCk7CisKKwkJLyogdXBkYXRlIHNoYXJlZCBtZW1vcnkgKi8KKwkJYm54MnhfdXBkYXRlX21uZyhwYXJhbXMsIHZhcnMtPmxpbmtfc3RhdHVzKTsKKworCQlyZXR1cm4gMDsKKworCX0gZWxzZQorCWlmIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfQk1BQykgeworCisJCXZhcnMtPmxpbmtfdXAgPSAxOworCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9CTUFDOworCisJCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CisKKwkJYm54MnhfcGh5X2RlYXNzZXJ0KHBhcmFtcywgdmFycy0+cGh5X2ZsYWdzKTsKKwkJLyogc2V0IGJtYWMgbG9vcGJhY2sgKi8KKwkJYm54MnhfYm1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAxKTsKKworCQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFICsKKwkJICAgIHBhcmFtcy0+cG9ydCo0LCAwKTsKKworCX0gZWxzZSBpZiAocGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX0VNQUMpIHsKKworCQl2YXJzLT5saW5rX3VwID0gMTsKKwkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9FTUFDOworCisJCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CisKKwkJYm54MnhfcGh5X2RlYXNzZXJ0KHBhcmFtcywgdmFycy0+cGh5X2ZsYWdzKTsKKwkJLyogc2V0IGJtYWMgbG9vcGJhY2sgKi8KKwkJYm54MnhfZW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAxKTsKKwkJYm54MnhfZW1hY19wcm9ncmFtKHBhcmFtcywgdmFycy0+bGluZV9zcGVlZCwKKwkJCQkJICAgICAgdmFycy0+ZHVwbGV4KTsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArCisJCSAgICBwYXJhbXMtPnBvcnQqNCwgMCk7CisKKwl9IGVsc2UgaWYgKChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfWEdYU18xMCkgfHwKKwkJICAgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19FWFRfUEhZKSkgeworCisJCXZhcnMtPmxpbmtfdXAgPSAxOworCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKworCQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfWEdYU19GTEFHOworCisJCXZhbCA9IFJFR19SRChicCwKKwkJCQkgTklHX1JFR19YR1hTMF9DVFJMX1BIWV9BRERSKworCQkJCSBwYXJhbXMtPnBvcnQqMHgxOCk7CisJCXBhcmFtcy0+cGh5X2FkZHIgPSAodTgpdmFsOworCisJCWJueDJ4X3BoeV9kZWFzc2VydChwYXJhbXMsIHZhcnMtPnBoeV9mbGFncyk7CisJCWJueDJ4X2xpbmtfaW5pdGlhbGl6ZShwYXJhbXMsIHZhcnMpOworCisJCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfQk1BQzsKKworCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOworCisJCWlmIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfWEdYU18xMCkgeworCQkJLyogc2V0IDEwRyBYR1hTIGxvb3BiYWNrICovCisJCQlibngyeF9zZXRfeGd4c19sb29wYmFjayhwYXJhbXMsIHZhcnMsIDEpOworCQl9IGVsc2UgeworCQkJLyogc2V0IGV4dGVybmFsIHBoeSBsb29wYmFjayAqLworCQkJYm54MnhfZXh0X3BoeV9sb29wYmFjayhwYXJhbXMpOworCQl9CisJCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKworCQkJICAgIHBhcmFtcy0+cG9ydCo0LCAwKTsKKworCQlibngyeF9zZXRfbGVkKHBhcmFtcywgTEVEX01PREVfT1BFUiwgdmFycy0+bGluZV9zcGVlZCk7CisJfSBlbHNlCisJLyogTm8gbG9vcGJhY2sgKi8KKwl7CisJCWJueDJ4X3BoeV9kZWFzc2VydChwYXJhbXMsIHZhcnMtPnBoeV9mbGFncyk7CisJCXN3aXRjaCAocGFyYW1zLT5zd2l0Y2hfY2ZnKSB7CisJCWNhc2UgU1dJVENIX0NGR18xRzoKKwkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0VSREVTX0ZMQUc7CisJCQlpZiAoKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcgJgorCQkJICAgICBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX01BU0spID09CisJCQkgICAgIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfQkNNNTQ4MikgeworCQkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsKKwkJCX0KKworCQkJdmFsID0gUkVHX1JEKGJwLAorCQkJCQkgTklHX1JFR19TRVJERVMwX0NUUkxfUEhZX0FERFIrCisJCQkJCSBwYXJhbXMtPnBvcnQqMHgxMCk7CisKKwkJCXBhcmFtcy0+cGh5X2FkZHIgPSAodTgpdmFsOworCisJCQlicmVhazsKKwkJY2FzZSBTV0lUQ0hfQ0ZHXzEwRzoKKwkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfWEdYU19GTEFHOworCQkJdmFsID0gUkVHX1JEKGJwLAorCQkJCSBOSUdfUkVHX1hHWFMwX0NUUkxfUEhZX0FERFIrCisJCQkJIHBhcmFtcy0+cG9ydCoweDE4KTsKKwkJCXBhcmFtcy0+cGh5X2FkZHIgPSAodTgpdmFsOworCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiSW52YWxpZCBzd2l0Y2hfY2ZnXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCURQKE5FVElGX01TR19MSU5LLCAiUGh5IGFkZHJlc3MgPSAweCV4XG4iLCBwYXJhbXMtPnBoeV9hZGRyKTsKKworCQlibngyeF9saW5rX2luaXRpYWxpemUocGFyYW1zLCB2YXJzKTsKKwkJbXNsZWVwKDMwKTsKKwkJYm54MnhfbGlua19pbnRfZW5hYmxlKHBhcmFtcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibngyeF84NzI2X3Jlc2V0X3BoeShzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LCB1OCBleHRfcGh5X2FkZHIpCit7CisJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF84NzI2X3Jlc2V0X3BoeSBwb3J0ICVkXG4iLCBwb3J0KTsKKworCS8qIFNldCBzZXJpYWwgYm9vdCBjb250cm9sIGZvciBleHRlcm5hbCBsb2FkICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsIGV4dF9waHlfYWRkciwKKwkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLCAweDAwMDEpOworfQorCit1OCBibngyeF9saW5rX3Jlc2V0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkgIHU4IHJlc2V0X2V4dF9waHkpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIGV4dF9waHlfY29uZmlnID0gcGFyYW1zLT5leHRfcGh5X2NvbmZpZzsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShleHRfcGh5X2NvbmZpZyk7CisJdTMyIHZhbCA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCisJCQkJICAgICAgcG9ydF9mZWF0dXJlX2NvbmZpZ1twYXJhbXMtPnBvcnRdLgorCQkJCSAgICAgIGNvbmZpZykpOworCURQKE5FVElGX01TR19MSU5LLCAiUmVzZXR0aW5nIHRoZSBsaW5rIG9mIHBvcnQgJWRcbiIsIHBvcnQpOworCS8qIGRpc2FibGUgYXR0ZW50aW9ucyAqLworCXZhcnMtPmxpbmtfc3RhdHVzID0gMDsKKwlibngyeF91cGRhdGVfbW5nKHBhcmFtcywgdmFycy0+bGlua19zdGF0dXMpOworCWJueDJ4X2JpdHNfZGlzKGJwLCBOSUdfUkVHX01BU0tfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAorCQkgICAgIChOSUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUyB8CisJCSAgICAgIE5JR19NQVNLX1hHWFMwX0xJTksxMEcgfAorCQkgICAgICBOSUdfTUFTS19TRVJERVMwX0xJTktfU1RBVFVTIHwKKwkJICAgICAgTklHX01BU0tfTUlfSU5UKSk7CisKKwkvKiBhY3RpdmF0ZSBuaWcgZHJhaW4gKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFICsgcG9ydCo0LCAxKTsKKworCS8qIGRpc2FibGUgbmlnIGVncmVzcyBpbnRlcmZhY2UgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfQk1BQzBfT1VUX0VOICsgcG9ydCo0LCAwKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMCk7CisKKwkvKiBTdG9wIEJpZ01hYyByeCAqLworCWJueDJ4X2JtYWNfcnhfZGlzYWJsZShicCwgcG9ydCk7CisKKwkvKiBkaXNhYmxlIGVtYWMgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfTklHX0VNQUMwX0VOICsgcG9ydCo0LCAwKTsKKworCW1zbGVlcCgxMCk7CisJLyogVGhlIFBIWSByZXNldCBpcyBjb250cm9sZWQgYnkgR1BJTyAxCisJICogSG9sZCBpdCBhcyB2YXJzIGxvdworCSAqLworCSAvKiBjbGVhciBsaW5rIGxlZCAqLworCWJueDJ4X3NldF9sZWQocGFyYW1zLCBMRURfTU9ERV9PRkYsIDApOworCWlmIChyZXNldF9leHRfcGh5KSB7CisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJCXsKKworCQkJLyogRGlzYWJsZSBUcmFuc21pdHRlciAqLworCQkJdTggZXh0X3BoeV9hZGRyID0KKwkJCQlYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKKwkJCWlmICgodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spID09CisJCQkgICAgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX0RJU0FCTEVfVFhfTEFTRVIpCisJCQkJYm54Mnhfc2ZwX3NldF90cmFuc21pdHRlcihicCwgcG9ydCwKKwkJCQkJUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKKwkJCQkJZXh0X3BoeV9hZGRyLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyA4MDczIHBvcnQgJWQgaW50byAiCisJCQkJICJsb3cgcG93ZXIgbW9kZVxuIiwKKwkJCQkgcG9ydCk7CisJCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAorCQkJCQkgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywKKwkJCQkJICBwb3J0KTsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6CisJCXsKKwkJCXU4IGV4dF9waHlfYWRkciA9CisJCQkJWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJCQkvKiBTZXQgc29mdCByZXNldCAqLworCQkJYm54MnhfODcyNl9yZXNldF9waHkoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV9hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MjM6CisJCXsKKwkJCXU4IGV4dF9waHlfYWRkciA9CisJCQkJWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCisJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NUUkwsIDB4MDAwMCk7CisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAorCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCisJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwgMSk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJLyogSFcgcmVzZXQgKi8KKwkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzEsCisJCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XLAorCQkJCQkgIHBvcnQpOworCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKKwkJCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1csCisJCQkJCSAgcG9ydCk7CisJCQlEUChORVRJRl9NU0dfTElOSywgInJlc2V0IGV4dGVybmFsIFBIWVxuIik7CisJCX0KKwl9CisJLyogcmVzZXQgdGhlIFNlckRlcy9YR1hTICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19DTEVBUiwKKwkgICAgICAgKDB4MWZmIDw8IChwb3J0KjE2KSkpOworCisJLyogcmVzZXQgQmlnTWFjICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9DTEVBUiwKKwkgICAgICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9CTUFDMCA8PCBwb3J0KSk7CisKKwkvKiBkaXNhYmxlIG5pZyBpbmdyZXNzIGludGVyZmFjZSAqLworCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9JTl9FTiArIHBvcnQqNCwgMCk7CisJUkVHX1dSKGJwLCBOSUdfUkVHX0VNQUMwX0lOX0VOICsgcG9ydCo0LCAwKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfQk1BQzBfT1VUX0VOICsgcG9ydCo0LCAwKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMCk7CisJdmFycy0+bGlua191cCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBibngyeF91cGRhdGVfbGlua19kb3duKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKworCURQKE5FVElGX01TR19MSU5LLCAiUG9ydCAleDogTGluayBpcyBkb3duXG4iLCBwb3J0KTsKKwlibngyeF9zZXRfbGVkKHBhcmFtcywgTEVEX01PREVfT0ZGLCAwKTsKKworCS8qIGluZGljYXRlIG5vIG1hYyBhY3RpdmUgKi8KKwl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX05PTkU7CisKKwkvKiB1cGRhdGUgc2hhcmVkIG1lbW9yeSAqLworCXZhcnMtPmxpbmtfc3RhdHVzID0gMDsKKwl2YXJzLT5saW5lX3NwZWVkID0gMDsKKwlibngyeF91cGRhdGVfbW5nKHBhcmFtcywgdmFycy0+bGlua19zdGF0dXMpOworCisJLyogYWN0aXZhdGUgbmlnIGRyYWluICovCisJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArIHBvcnQqNCwgMSk7CisKKwkvKiBkaXNhYmxlIGVtYWMgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfTklHX0VNQUMwX0VOICsgcG9ydCo0LCAwKTsKKworCW1zbGVlcCgxMCk7CisKKwkvKiByZXNldCBCaWdNYWMgKi8KKwlibngyeF9ibWFjX3J4X2Rpc2FibGUoYnAsIHBhcmFtcy0+cG9ydCk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKworCQkgICBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9DTEVBUiwKKwkJICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9CTUFDMCA8PCBwb3J0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBibngyeF91cGRhdGVfbGlua191cChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKKwkJCSAgICAgdTggbGlua18xMGcsIHUzMiBncF9zdGF0dXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1OCByYyA9IDA7CisKKwl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LX1NUQVRVU19MSU5LX1VQOworCWlmIChsaW5rXzEwZykgeworCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOworCQlibngyeF9zZXRfbGVkKHBhcmFtcywgTEVEX01PREVfT1BFUiwgU1BFRURfMTAwMDApOworCX0gZWxzZSB7CisJCXJjID0gYm54MnhfZW1hY19wcm9ncmFtKHBhcmFtcywgdmFycy0+bGluZV9zcGVlZCwKKwkJCQkgICAgICB2YXJzLT5kdXBsZXgpOworCisJCWJueDJ4X2VtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7CisKKwkJLyogQU4gY29tcGxldGU/ICovCisJCWlmIChncF9zdGF0dXMgJiBNRElPX0FOX0NMNzNfT1JfMzdfQ09NUExFVEUpIHsKKwkJCWlmICghKHZhcnMtPnBoeV9mbGFncyAmCisJCQkgICAgICBQSFlfU0dNSUlfRkxBRykpCisJCQkJYm54Mnhfc2V0X2dtaWlfdHhfZHJpdmVyKHBhcmFtcyk7CisJCX0KKwl9CisKKwkvKiBQQkYgLSBsaW5rIHVwICovCisJcmMgfD0gYm54MnhfcGJmX3VwZGF0ZShwYXJhbXMsIHZhcnMtPmZsb3dfY3RybCwKKwkJCSAgICAgIHZhcnMtPmxpbmVfc3BlZWQpOworCisJLyogZGlzYWJsZSBkcmFpbiAqLworCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwb3J0KjQsIDApOworCisJLyogdXBkYXRlIHNoYXJlZCBtZW1vcnkgKi8KKwlibngyeF91cGRhdGVfbW5nKHBhcmFtcywgdmFycy0+bGlua19zdGF0dXMpOworCW1zbGVlcCgyMCk7CisJcmV0dXJuIHJjOworfQorLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2FsbGVkIHVwb24gbGluayBpbnRlcnJ1cHQgKi8KKy8qIEluIGNhc2UgdmFycy0+bGlua191cCwgZHJpdmVyIG5lZWRzIHRvCisJMS4gVXBkYXRlIHRoZSBwYmYKKwkyLiBEaXNhYmxlIGRyYWluCisJMy4gVXBkYXRlIHRoZSBzaGFyZWQgbWVtb3J5CisJNC4gSW5kaWNhdGUgbGluayB1cAorCTUuIFNldCBMRURzCisgICBPdGhlcndpc2UsCisJMS4gVXBkYXRlIHNoYXJlZCBtZW1vcnkKKwkyLiBSZXNldCBCaWdNYWMKKwkzLiBSZXBvcnQgbGluayBkb3duCisJNC4gVW5zZXQgTEVEcworKi8KK3U4IGJueDJ4X2xpbmtfdXBkYXRlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTE2IGdwX3N0YXR1czsKKwl1OCBsaW5rXzEwZzsKKwl1OCBleHRfcGh5X2xpbmtfdXAsIHJjID0gMDsKKwl1MzIgZXh0X3BoeV90eXBlOworCXU4IGlzX21pX2ludCA9IDA7CisKKwlEUChORVRJRl9NU0dfTElOSywgInBvcnQgJXgsIFhHWFM/JXgsIGludF9zdGF0dXMgMHgleFxuIiwKKwkJIHBvcnQsICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSwKKwkJIFJFR19SRChicCwgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0KSk7CisKKwlpc19taV9pbnQgPSAodTgpKFJFR19SRChicCwgTklHX1JFR19FTUFDMF9TVEFUVVNfTUlTQ19NSV9JTlQgKworCQkJCSAgICBwb3J0KjB4MTgpID4gMCk7CisJRFAoTkVUSUZfTVNHX0xJTkssICJpbnRfbWFzayAweCV4IE1JX0lOVCAleCwgU0VSREVTX0xJTksgJXhcbiIsCisJCSBSRUdfUkQoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQpLAorCQkgaXNfbWlfaW50LAorCQkgUkVHX1JEKGJwLAorCQkJICAgIE5JR19SRUdfU0VSREVTMF9TVEFUVVNfTElOS19TVEFUVVMgKyBwb3J0KjB4M2MpKTsKKworCURQKE5FVElGX01TR19MSU5LLCAiIDEwRyAleCwgWEdYU19MSU5LICV4XG4iLAorCSAgUkVHX1JEKGJwLCBOSUdfUkVHX1hHWFMwX1NUQVRVU19MSU5LMTBHICsgcG9ydCoweDY4KSwKKwkgIFJFR19SRChicCwgTklHX1JFR19YR1hTMF9TVEFUVVNfTElOS19TVEFUVVMgKyBwb3J0KjB4NjgpKTsKKworCS8qIGRpc2FibGUgZW1hYyAqLworCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOworCisJZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7CisKKwkvKiBDaGVjayBleHRlcm5hbCBsaW5rIGNoYW5nZSBvbmx5IGZvciBub24tZGlyZWN0ICovCisJZXh0X3BoeV9saW5rX3VwID0gYm54MnhfZXh0X3BoeV9pc19saW5rX3VwKHBhcmFtcywgdmFycywgaXNfbWlfaW50KTsKKworCS8qIFJlYWQgZ3Bfc3RhdHVzICovCisJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBvcnQsIHBhcmFtcy0+cGh5X2FkZHIsCisJCQkgICAgICBNRElPX1JFR19CQU5LX0dQX1NUQVRVUywKKwkJCSAgICAgIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxLAorCQkJICAgICAgJmdwX3N0YXR1cyk7CisKKwlyYyA9IGJueDJ4X2xpbmtfc2V0dGluZ3Nfc3RhdHVzKHBhcmFtcywgdmFycywgZ3Bfc3RhdHVzLAorCQkJCSAgICAgIGV4dF9waHlfbGlua191cCk7CisJaWYgKHJjICE9IDApCisJCXJldHVybiByYzsKKworCS8qIGFueXRoaW5nIDEwIGFuZCBvdmVyIHVzZXMgdGhlIGJtYWMgKi8KKwlsaW5rXzEwZyA9ICgodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgfHwKKwkJICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEyMDAwKSB8fAorCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTI1MDApIHx8CisJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMzAwMCkgfHwKKwkJICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzE1MDAwKSB8fAorCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTYwMDApKTsKKworCWJueDJ4X2xpbmtfaW50X2FjayhwYXJhbXMsIHZhcnMsIGxpbmtfMTBnLCBpc19taV9pbnQpOworCisJLyogSW4gY2FzZSBleHRlcm5hbCBwaHkgbGluayBpcyB1cCwgYW5kIGludGVybmFsIGxpbmsgaXMgZG93bgorCSggbm90IGluaXRpYWxpemVkIHlldCBwcm9iYWJseSBhZnRlciBsaW5rIGluaXRpYWxpemF0aW9uLCBpdCBuZWVkcworCXRvIGJlIGluaXRpYWxpemVkLgorCU5vdGUgdGhhdCBhZnRlciBsaW5rIGRvd24tdXAgYXMgcmVzdWx0IG9mIGNhYmxlIHBsdWcsCisJdGhlIHhneHMgbGluayB3b3VsZCBwcm9iYWJseSBiZWNvbWUgdXAgYWdhaW4gd2l0aG91dCB0aGUgbmVlZCB0bworCWluaXRpYWxpemUgaXQqLworCisJaWYgKChleHRfcGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCisJICAgIChleHRfcGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNSkgJiYKKwkgICAgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2KSAmJgorCSAgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpICYmCisJICAgIChleHRfcGh5X2xpbmtfdXAgJiYgIXZhcnMtPnBoeV9saW5rX3VwKSkKKwkJYm54MnhfaW5pdF9pbnRlcm5hbF9waHkocGFyYW1zLCB2YXJzLCAwKTsKKworCS8qIGxpbmsgaXMgdXAgb25seSBpZiBib3RoIGxvY2FsIHBoeSBhbmQgZXh0ZXJuYWwgcGh5IGFyZSB1cCAqLworCXZhcnMtPmxpbmtfdXAgPSAoZXh0X3BoeV9saW5rX3VwICYmIHZhcnMtPnBoeV9saW5rX3VwKTsKKworCWlmICh2YXJzLT5saW5rX3VwKQorCQlyYyA9IGJueDJ4X3VwZGF0ZV9saW5rX3VwKHBhcmFtcywgdmFycywgbGlua18xMGcsIGdwX3N0YXR1cyk7CisJZWxzZQorCQlyYyA9IGJueDJ4X3VwZGF0ZV9saW5rX2Rvd24ocGFyYW1zLCB2YXJzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHU4IGJueDJ4XzgwNzNfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlKQoreworCXU4IGV4dF9waHlfYWRkcltQT1JUX01BWF07CisJdTE2IHZhbDsKKwlzOCBwb3J0OworCisJLyogUEFSVDEgLSBSZXNldCBib3RoIHBoeXMgKi8KKwlmb3IgKHBvcnQgPSBQT1JUX01BWCAtIDE7IHBvcnQgPj0gUE9SVF8wOyBwb3J0LS0pIHsKKwkJLyogRXh0cmFjdCB0aGUgZXh0IHBoeSBhZGRyZXNzIGZvciB0aGUgcG9ydCAqLworCQl1MzIgZXh0X3BoeV9jb25maWcgPSBSRUdfUkQoYnAsIHNobWVtX2Jhc2UgKworCQkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkgICBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5leHRlcm5hbF9waHlfY29uZmlnKSk7CisKKwkJLyogZGlzYWJsZSBhdHRlbnRpb25zICovCisJCWJueDJ4X2JpdHNfZGlzKGJwLCBOSUdfUkVHX01BU0tfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAorCQkJICAgICAoTklHX01BU0tfWEdYUzBfTElOS19TVEFUVVMgfAorCQkJICAgICAgTklHX01BU0tfWEdYUzBfTElOSzEwRyB8CisJCQkgICAgICBOSUdfTUFTS19TRVJERVMwX0xJTktfU1RBVFVTIHwKKwkJCSAgICAgIE5JR19NQVNLX01JX0lOVCkpOworCisJCWV4dF9waHlfYWRkcltwb3J0XSA9IFhHWFNfRVhUX1BIWV9BRERSKGV4dF9waHlfY29uZmlnKTsKKworCQkvKiBOZWVkIHRvIHRha2UgdGhlIHBoeSBvdXQgb2YgbG93IHBvd2VyIG1vZGUgaW4gb3JkZXIKKwkJCXRvIHdyaXRlIHRvIGFjY2VzcyBpdHMgcmVnaXN0ZXJzICovCisJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCisJCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILCBwb3J0KTsKKworCQkvKiBSZXNldCB0aGUgcGh5ICovCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCSAgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCisJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCisJCQkgICAgICAgMTw8MTUpOworCX0KKworCS8qIEFkZCBkZWxheSBvZiAxNTBtcyBhZnRlciByZXNldCAqLworCW1zbGVlcCgxNTApOworCisJLyogUEFSVDIgLSBEb3dubG9hZCBmaXJtd2FyZSB0byBib3RoIHBoeXMgKi8KKwlmb3IgKHBvcnQgPSBQT1JUX01BWCAtIDE7IHBvcnQgPj0gUE9SVF8wOyBwb3J0LS0pIHsKKwkJdTE2IGZ3X3ZlcjE7CisKKwkJYm54MnhfYmNtODA3M19leHRlcm5hbF9yb21fYm9vdChicCwgcG9ydCwKKwkJCQkJICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLCBzaG1lbV9iYXNlKTsKKworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCQkgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMSwgJmZ3X3ZlcjEpOworCQlpZiAoZndfdmVyMSA9PSAwIHx8IGZ3X3ZlcjEgPT0gMHg0MzIxKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkgImJueDJ4XzgwNzNfY29tbW9uX2luaXRfcGh5IHBvcnQgJXg6IgorCQkJCSAiRG93bmxvYWQgZmFpbGVkLiBmdyB2ZXJzaW9uID0gMHgleFxuIiwKKwkJCQkgcG9ydCwgZndfdmVyMSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIE9ubHkgc2V0IGJpdCAxMCA9IDEgKFR4IHBvd2VyIGRvd24pICovCisJCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKKwkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCQkgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR19UWF9QT1dFUl9ET1dOLCAmdmFsKTsKKworCQkvKiBQaGFzZTEgb2YgVFhfUE9XRVJfRE9XTiByZXNldCAqLworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAorCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCisJCQkgICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLAorCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgIE1ESU9fUE1BX1JFR19UWF9QT1dFUl9ET1dOLAorCQkJICAgICAgICh2YWwgfCAxPDwxMCkpOworCX0KKworCS8qIFRvZ2dsZSBUcmFuc21pdHRlcjogUG93ZXIgZG93biBhbmQgdGhlbiB1cCB3aXRoIDYwMG1zCisJICAgZGVsYXkgYmV0d2VlbiAqLworCW1zbGVlcCg2MDApOworCisJLyogUEFSVDMgLSBjb21wbGV0ZSBUWF9QT1dFUl9ET1dOIHByb2Nlc3MsIGFuZCBzZXQgR1BJTzIgYmFjayB0byBsb3cgKi8KKwlmb3IgKHBvcnQgPSBQT1JUX01BWCAtIDE7IHBvcnQgPj0gUE9SVF8wOyBwb3J0LS0pIHsKKwkJLyogUGhhc2UyIG9mIFBPV0VSX0RPV05fUkVTRVQgKi8KKwkJLyogUmVsZWFzZSBiaXQgMTAgKFJlbGVhc2UgVHggcG93ZXIgZG93bikgKi8KKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCSAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKKwkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgTURJT19QTUFfUkVHX1RYX1BPV0VSX0RPV04sICZ2YWwpOworCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCSAgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCisJCQkgICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICAgTURJT19QTUFfUkVHX1RYX1BPV0VSX0RPV04sICh2YWwgJiAofigxPDwxMCkpKSk7CisJCW1zbGVlcCgxNSk7CisKKwkJLyogUmVhZCBtb2RpZnkgd3JpdGUgdGhlIFNQSS1ST00gdmVyc2lvbiBzZWxlY3QgcmVnaXN0ZXIgKi8KKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAorCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKKwkJCSAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKKwkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkJICAgICAgTURJT19QTUFfUkVHX0VEQ19GRkVfTUFJTiwgJnZhbCk7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAorCQkJICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLAorCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICBNRElPX1BNQV9SRUdfRURDX0ZGRV9NQUlOLCAodmFsIHwgKDE8PDEyKSkpOworCisJCS8qIHNldCBHUElPMiBiYWNrIHRvIExPVyAqLworCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAorCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XLCBwb3J0KTsKKwl9CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHU4IGJueDJ4Xzg3MjdfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlKQoreworCXU4IGV4dF9waHlfYWRkcltQT1JUX01BWF07CisJczggcG9ydCwgZmlyc3RfcG9ydCwgaTsKKwl1MzIgc3dhcF92YWwsIHN3YXBfb3ZlcnJpZGU7CisJRFAoTkVUSUZfTVNHX0xJTkssICJFeGVjdXRpbmcgQkNNODcyNyBjb21tb24gaW5pdFxuIik7CisJc3dhcF92YWwgPSBSRUdfUkQoYnAsICBOSUdfUkVHX1BPUlRfU1dBUCk7CisJc3dhcF9vdmVycmlkZSA9IFJFR19SRChicCwgIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpOworCisJYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgMSBeIChzd2FwX3ZhbCAmJiBzd2FwX292ZXJyaWRlKSk7CisJbXNsZWVwKDUpOworCisJaWYgKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpCisJCWZpcnN0X3BvcnQgPSBQT1JUXzA7CisJZWxzZQorCQlmaXJzdF9wb3J0ID0gUE9SVF8xOworCisJLyogUEFSVDEgLSBSZXNldCBib3RoIHBoeXMgKi8KKwlmb3IgKGkgPSAwLCBwb3J0ID0gZmlyc3RfcG9ydDsgaSA8IFBPUlRfTUFYOyBpKyssIHBvcnQgPSAhcG9ydCkgeworCQkvKiBFeHRyYWN0IHRoZSBleHQgcGh5IGFkZHJlc3MgZm9yIHRoZSBwb3J0ICovCisJCXUzMiBleHRfcGh5X2NvbmZpZyA9IFJFR19SRChicCwgc2htZW1fYmFzZSArCisJCQkJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCSAgIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmV4dGVybmFsX3BoeV9jb25maWcpKTsKKworCQkvKiBkaXNhYmxlIGF0dGVudGlvbnMgKi8KKwkJYm54MnhfYml0c19kaXMoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCisJCQkgICAgIChOSUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUyB8CisJCQkgICAgICBOSUdfTUFTS19YR1hTMF9MSU5LMTBHIHwKKwkJCSAgICAgIE5JR19NQVNLX1NFUkRFUzBfTElOS19TVEFUVVMgfAorCQkJICAgICAgTklHX01BU0tfTUlfSU5UKSk7CisKKwkJZXh0X3BoeV9hZGRyW3BvcnRdID0gWEdYU19FWFRfUEhZX0FERFIoZXh0X3BoeV9jb25maWcpOworCisJCS8qIFJlc2V0IHRoZSBwaHkgKi8KKwkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKKwkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAorCQkJICAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKKwkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwKKwkJCSAgICAgICAxPDwxNSk7CisJfQorCisJLyogQWRkIGRlbGF5IG9mIDE1MG1zIGFmdGVyIHJlc2V0ICovCisJbXNsZWVwKDE1MCk7CisKKwkvKiBQQVJUMiAtIERvd25sb2FkIGZpcm13YXJlIHRvIGJvdGggcGh5cyAqLworCWZvciAoaSA9IDAsIHBvcnQgPSBmaXJzdF9wb3J0OyBpIDwgUE9SVF9NQVg7IGkrKywgcG9ydCA9ICFwb3J0KSB7CisJCXUxNiBmd192ZXIxOworCisJCWJueDJ4X2JjbTg3MjdfZXh0ZXJuYWxfcm9tX2Jvb3QoYnAsIHBvcnQsCisJCQkJCSAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwgc2htZW1fYmFzZSk7CisKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LCBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAorCQkJICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLAorCQkJICAgICAgTURJT19QTUFfREVWQUQsCisJCQkgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjEsICZmd192ZXIxKTsKKwkJaWYgKGZ3X3ZlcjEgPT0gMCB8fCBmd192ZXIxID09IDB4NDMyMSkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICJibngyeF84NzI3X2NvbW1vbl9pbml0X3BoeSBwb3J0ICV4OiIKKwkJCQkgIkRvd25sb2FkIGZhaWxlZC4gZncgdmVyc2lvbiA9IDB4JXhcbiIsCisJCQkJIHBvcnQsIGZ3X3ZlcjEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdTggYm54MnhfODcyNl9jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2UpCit7CisJdTggZXh0X3BoeV9hZGRyOworCXUzMiB2YWw7CisJczggcG9ydDsKKworCS8qIFVzZSBwb3J0MSBiZWNhdXNlIG9mIHRoZSBzdGF0aWMgcG9ydC1zd2FwICovCisJLyogRW5hYmxlIHRoZSBtb2R1bGUgZGV0ZWN0aW9uIGludGVycnVwdCAqLworCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfR1BJT19FVkVOVF9FTik7CisJdmFsIHw9ICgoMTw8TUlTQ19SRUdJU1RFUlNfR1BJT18zKXwKKwkJKDE8PChNSVNDX1JFR0lTVEVSU19HUElPXzMgKyBNSVNDX1JFR0lTVEVSU19HUElPX1BPUlRfU0hJRlQpKSk7CisJUkVHX1dSKGJwLCBNSVNDX1JFR19HUElPX0VWRU5UX0VOLCB2YWwpOworCisJYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgMSk7CisJbXNsZWVwKDUpOworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBQT1JUX01BWDsgcG9ydCsrKSB7CisJCS8qIEV4dHJhY3QgdGhlIGV4dCBwaHkgYWRkcmVzcyBmb3IgdGhlIHBvcnQgKi8KKwkJdTMyIGV4dF9waHlfY29uZmlnID0gUkVHX1JEKGJwLCBzaG1lbV9iYXNlICsKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKKwkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmV4dGVybmFsX3BoeV9jb25maWcpKTsKKworCQlleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihleHRfcGh5X2NvbmZpZyk7CisJCURQKE5FVElGX01TR19MSU5LLCAiODcyNl9jb21tb25faW5pdCA6IGV4dF9waHlfYWRkciA9IDB4JXhcbiIsCisJCQkgZXh0X3BoeV9hZGRyKTsKKworCQlibngyeF84NzI2X3Jlc2V0X3BoeShicCwgcG9ydCwgZXh0X3BoeV9hZGRyKTsKKworCQkvKiBTZXQgZmF1bHQgbW9kdWxlIGRldGVjdGVkIExFRCBvbiAqLworCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18wLAorCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19ISUdILAorCQkJCSAgcG9ydCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHU4IGJueDJ4Xzg0ODIzX2NvbW1vbl9pbml0X3BoeShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgc2htZW1fYmFzZSkKK3sKKwkvKiBIVyByZXNldCAqLworCWJueDJ4X2V4dF9waHlfaHdfcmVzZXQoYnAsIDEpOworCXJldHVybiAwOworfQordTggYm54MnhfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlKQoreworCXU4IHJjID0gMDsKKwl1MzIgZXh0X3BoeV90eXBlOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJCZWdpbiBjb21tb24gcGh5IGluaXRcbiIpOworCisJLyogUmVhZCB0aGUgZXh0X3BoeV90eXBlIGZvciBhcmJpdHJhcnkgcG9ydCgwKSAqLworCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKAorCQkJUkVHX1JEKGJwLCBzaG1lbV9iYXNlICsKKwkJCSAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQkgICAgIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnWzBdLmV4dGVybmFsX3BoeV9jb25maWcpKSk7CisKKwlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKKwl7CisJCXJjID0gYm54MnhfODA3M19jb21tb25faW5pdF9waHkoYnAsIHNobWVtX2Jhc2UpOworCQlicmVhazsKKwl9CisKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3X05PQzoKKwkJcmMgPSBibngyeF84NzI3X2NvbW1vbl9pbml0X3BoeShicCwgc2htZW1fYmFzZSk7CisJCWJyZWFrOworCisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2OgorCQkvKiBHUElPMSBhZmZlY3RzIGJvdGggcG9ydHMsIHNvIHRoZXJlJ3MgbmVlZCB0byBwdWxsCisJCWl0IGZvciBzaW5nbGUgcG9ydCBhbG9uZSAqLworCQlyYyA9IGJueDJ4Xzg3MjZfY29tbW9uX2luaXRfcGh5KGJwLCBzaG1lbV9iYXNlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMzoKKwkJcmMgPSBibngyeF84NDgyM19jb21tb25faW5pdF9waHkoYnAsIHNobWVtX2Jhc2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUChORVRJRl9NU0dfTElOSywKKwkJCSAiYm54MnhfY29tbW9uX2luaXRfcGh5OiBleHRfcGh5IDB4JXggbm90IHJlcXVpcmVkXG4iLAorCQkJIGV4dF9waHlfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKwordm9pZCBibngyeF9zZng3MTAxX3NwX3N3X3Jlc2V0KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsIHU4IHBoeV9hZGRyKQoreworCXUxNiB2YWwsIGNudDsKKworCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKKwkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMSwKKwkJICAgICAgcGh5X2FkZHIsCisJCSAgICAgIE1ESU9fUE1BX0RFVkFELAorCQkgICAgICBNRElPX1BNQV9SRUdfNzEwMV9SRVNFVCwgJnZhbCk7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IDEwOyBjbnQrKykgeworCQltc2xlZXAoNTApOworCQkvKiBXcml0ZXMgYSBzZWxmLWNsZWFyaW5nIHJlc2V0ICovCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCisJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMSwKKwkJCSAgICAgICBwaHlfYWRkciwKKwkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgICBNRElPX1BNQV9SRUdfNzEwMV9SRVNFVCwKKwkJCSAgICAgICAodmFsIHwgKDE8PDE1KSkpOworCQkvKiBXYWl0IGZvciBjbGVhciAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCisJCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxLAorCQkJICAgICAgcGh5X2FkZHIsCisJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKKwkJCSAgICAgIE1ESU9fUE1BX1JFR183MTAxX1JFU0VULCAmdmFsKTsKKworCQlpZiAoKHZhbCAmICgxPDwxNSkpID09IDApCisJCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeF9saW5rLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbmV0L2JueDJ4X2xpbmsuaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvYm54MngvYm54MnhfbGluay5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlYzJiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X21haW4uYwpAQCAtMCwwICsxLDgwNDAgQEAKKy8qIGJueDJ4X21haW4uYzogQnJvYWRjb20gRXZlcmVzdCBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgorICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCisgKiBVRFAgQ1NVTSBlcnJhdGEgd29ya2Fyb3VuZCBieSBBcmlrIEdlbmRlbG1hbgorICogU2xvd3BhdGggYW5kIGZhc3RwYXRoIHJld29yayBieSBWbGFkaXNsYXYgWm9sb3Rhcm92CisgKiBTdGF0aXN0aWNzIGFuZCBMaW5rIG1hbmFnZW1lbnQgYnkgWWl0Y2hhayBHZXJ0bmVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPiAgLyogZm9yIGRldl9pbmZvKCkgKi8KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjZGVmaW5lIEJOWDJYX01BSU4KKyNpbmNsdWRlICJibngyeC5oIgorI2luY2x1ZGUgImJueDJ4X2luaXQuaCIKKyNpbmNsdWRlICJibngyeF9pbml0X29wcy5oIgorI2luY2x1ZGUgImJueDJ4X2Ntbi5oIgorCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgImJueDJ4X2Z3X2ZpbGVfaGRyLmgiCisvKiBGVyBmaWxlcyAqLworI2RlZmluZSBGV19GSUxFX1ZFUlNJT04JCQkJCVwKKwlfX3N0cmluZ2lmeShCQ01fNTcxMF9GV19NQUpPUl9WRVJTSU9OKSAiLiIJXAorCV9fc3RyaW5naWZ5KEJDTV81NzEwX0ZXX01JTk9SX1ZFUlNJT04pICIuIglcCisJX19zdHJpbmdpZnkoQkNNXzU3MTBfRldfUkVWSVNJT05fVkVSU0lPTikgIi4iCVwKKwlfX3N0cmluZ2lmeShCQ01fNTcxMF9GV19FTkdJTkVFUklOR19WRVJTSU9OKQorI2RlZmluZSBGV19GSUxFX05BTUVfRTEJCSJibngyeC1lMS0iIEZXX0ZJTEVfVkVSU0lPTiAiLmZ3IgorI2RlZmluZSBGV19GSUxFX05BTUVfRTFICSJibngyeC1lMWgtIiBGV19GSUxFX1ZFUlNJT04gIi5mdyIKKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nICovCisjZGVmaW5lIFRYX1RJTUVPVVQJCSg1KkhaKQorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJIkJyb2FkY29tIE5ldFh0cmVtZSBJSSA1NzcxeCAxMEdpZ2FiaXQgRXRoZXJuZXQgRHJpdmVyICIKKwlEUlZfTU9EVUxFX05BTUUgIiAiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiRWxpZXplciBUYW1pciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTc3MTAvNTc3MTEvNTc3MTFFIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9GSVJNV0FSRShGV19GSUxFX05BTUVfRTEpOworTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfTkFNRV9FMUgpOworCitzdGF0aWMgaW50IG11bHRpX21vZGUgPSAxOworbW9kdWxlX3BhcmFtKG11bHRpX21vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpX21vZGUsICIgTXVsdGkgcXVldWUgbW9kZSAiCisJCQkgICAgICIoMCBEaXNhYmxlOyAxIEVuYWJsZSAoZGVmYXVsdCkpIik7CisKK3N0YXRpYyBpbnQgbnVtX3F1ZXVlczsKK21vZHVsZV9wYXJhbShudW1fcXVldWVzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhudW1fcXVldWVzLCAiIE51bWJlciBvZiBxdWV1ZXMgZm9yIG11bHRpX21vZGU9MSIKKwkJCQkiIChkZWZhdWx0IGlzIGFzIGEgbnVtYmVyIG9mIENQVXMpIik7CisKK3N0YXRpYyBpbnQgZGlzYWJsZV90cGE7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV90cGEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfdHBhLCAiIERpc2FibGUgdGhlIFRQQSAoTFJPKSBmZWF0dXJlIik7CisKK3N0YXRpYyBpbnQgaW50X21vZGU7Cittb2R1bGVfcGFyYW0oaW50X21vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGludF9tb2RlLCAiIEZvcmNlIGludGVycnVwdCBtb2RlIG90aGVyIHRoZW4gTVNJLVggIgorCQkJCSIoMSBJTlQjeDsgMiBNU0kpIik7CisKK3N0YXRpYyBpbnQgZHJvcGxlc3NfZmM7Cittb2R1bGVfcGFyYW0oZHJvcGxlc3NfZmMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRyb3BsZXNzX2ZjLCAiIFBhdXNlIG9uIGV4aGF1c3RlZCBob3N0IHJpbmciKTsKKworc3RhdGljIGludCBwb2xsOworbW9kdWxlX3BhcmFtKHBvbGwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvbGwsICIgVXNlIHBvbGxpbmcgKGZvciBkZWJ1ZykiKTsKKworc3RhdGljIGludCBtcnJzID0gLTE7Cittb2R1bGVfcGFyYW0obXJycywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXJycywgIiBGb3JjZSBNYXggUmVhZCBSZXEgU2l6ZSAoMC4uMykgKGZvciBkZWJ1ZykiKTsKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIgRGVmYXVsdCBkZWJ1ZyBtc2dsZXZlbCIpOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJueDJ4X3dxOworCitlbnVtIGJueDJ4X2JvYXJkX3R5cGUgeworCUJDTTU3NzEwID0gMCwKKwlCQ001NzcxMSA9IDEsCisJQkNNNTc3MTFFID0gMiwKK307CisKKy8qIGluZGV4ZWQgYnkgYm9hcmRfdHlwZSwgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm5hbWU7Cit9IGJvYXJkX2luZm9bXSBfX2RldmluaXRkYXRhID0geworCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzcxMCBYR2IiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzExIFhHYiIgfSwKKwl7ICJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTc3MTFFIFhHYiIgfQorfTsKKworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoYm54MnhfcGNpX3RibCkgPSB7CisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc3MTApLCBCQ001NzcxMCB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfTlgyXzU3NzExKSwgQkNNNTc3MTEgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzcxMUUpLCBCQ001NzcxMUUgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJueDJ4X3BjaV90YmwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB1c2VkIG9ubHkgYXQgaW5pdAorICogbG9ja2luZyBpcyBkb25lIGJ5IG1jcAorICovCit2b2lkIGJueDJ4X3JlZ193cl9pbmQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIHUzMiB2YWwpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19BRERSRVNTLCBhZGRyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0RBVEEsIHZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19BRERSRVNTLAorCQkJICAgICAgIFBDSUNGR19WRU5ET1JfSURfT0ZGU0VUKTsKK30KKworc3RhdGljIHUzMiBibngyeF9yZWdfcmRfaW5kKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhZGRyKQoreworCXUzMiB2YWw7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FERFJFU1MsIGFkZHIpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19EQVRBLCAmdmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FERFJFU1MsCisJCQkgICAgICAgUENJQ0ZHX1ZFTkRPUl9JRF9PRkZTRVQpOworCisJcmV0dXJuIHZhbDsKK30KKworY29uc3QgdTMyIGRtYWVfcmVnX2dvX2NbXSA9IHsKKwlETUFFX1JFR19HT19DMCwgRE1BRV9SRUdfR09fQzEsIERNQUVfUkVHX0dPX0MyLCBETUFFX1JFR19HT19DMywKKwlETUFFX1JFR19HT19DNCwgRE1BRV9SRUdfR09fQzUsIERNQUVfUkVHX0dPX0M2LCBETUFFX1JFR19HT19DNywKKwlETUFFX1JFR19HT19DOCwgRE1BRV9SRUdfR09fQzksIERNQUVfUkVHX0dPX0MxMCwgRE1BRV9SRUdfR09fQzExLAorCURNQUVfUkVHX0dPX0MxMiwgRE1BRV9SRUdfR09fQzEzLCBETUFFX1JFR19HT19DMTQsIERNQUVfUkVHX0dPX0MxNQorfTsKKworLyogY29weSBjb21tYW5kIGludG8gRE1BRSBjb21tYW5kIG1lbW9yeSBhbmQgc2V0IERNQUUgY29tbWFuZCBnbyAqLwordm9pZCBibngyeF9wb3N0X2RtYWUoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGRtYWVfY29tbWFuZCAqZG1hZSwgaW50IGlkeCkKK3sKKwl1MzIgY21kX29mZnNldDsKKwlpbnQgaTsKKworCWNtZF9vZmZzZXQgPSAoRE1BRV9SRUdfQ01EX01FTSArIHNpemVvZihzdHJ1Y3QgZG1hZV9jb21tYW5kKSAqIGlkeCk7CisJZm9yIChpID0gMDsgaSA8IChzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkvNCk7IGkrKykgeworCQlSRUdfV1IoYnAsIGNtZF9vZmZzZXQgKyBpKjQsICooKCh1MzIgKilkbWFlKSArIGkpKTsKKworCQlEUChCTlgyWF9NU0dfT0ZGLCAiRE1BRSBjbWRbJWRdLiVkICgweCUwOHgpIDogMHglMDh4XG4iLAorCQkgICBpZHgsIGksIGNtZF9vZmZzZXQgKyBpKjQsICooKCh1MzIgKilkbWFlKSArIGkpKTsKKwl9CisJUkVHX1dSKGJwLCBkbWFlX3JlZ19nb19jW2lkeF0sIDEpOworfQorCit2b2lkIGJueDJ4X3dyaXRlX2RtYWUoc3RydWN0IGJueDJ4ICpicCwgZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyIGRzdF9hZGRyLAorCQkgICAgICB1MzIgbGVuMzIpCit7CisJc3RydWN0IGRtYWVfY29tbWFuZCBkbWFlOworCXUzMiAqd2JfY29tcCA9IGJueDJ4X3NwKGJwLCB3Yl9jb21wKTsKKwlpbnQgY250ID0gMjAwOworCisJaWYgKCFicC0+ZG1hZV9yZWFkeSkgeworCQl1MzIgKmRhdGEgPSBibngyeF9zcChicCwgd2JfZGF0YVswXSk7CisKKwkJRFAoQk5YMlhfTVNHX09GRiwgIkRNQUUgaXMgbm90IHJlYWR5IChkc3RfYWRkciAlMDh4ICBsZW4zMiAlZCkiCisJCSAgICIgIHVzaW5nIGluZGlyZWN0XG4iLCBkc3RfYWRkciwgbGVuMzIpOworCQlibngyeF9pbml0X2luZF93cihicCwgZHN0X2FkZHIsIGRhdGEsIGxlbjMyKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmZG1hZSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpKTsKKworCWRtYWUub3Bjb2RlID0gKERNQUVfQ01EX1NSQ19QQ0kgfCBETUFFX0NNRF9EU1RfR1JDIHwKKwkJICAgICAgIERNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJICAgICAgIERNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCSAgICAgICBETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJCSAgICAgICBETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJICAgICAgIChCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAorCQkgICAgICAgKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOworCWRtYWUuc3JjX2FkZHJfbG8gPSBVNjRfTE8oZG1hX2FkZHIpOworCWRtYWUuc3JjX2FkZHJfaGkgPSBVNjRfSEkoZG1hX2FkZHIpOworCWRtYWUuZHN0X2FkZHJfbG8gPSBkc3RfYWRkciA+PiAyOworCWRtYWUuZHN0X2FkZHJfaGkgPSAwOworCWRtYWUubGVuID0gbGVuMzI7CisJZG1hZS5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfY29tcCkpOworCWRtYWUuY29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHdiX2NvbXApKTsKKwlkbWFlLmNvbXBfdmFsID0gRE1BRV9DT01QX1ZBTDsKKworCURQKEJOWDJYX01TR19PRkYsICJETUFFOiBvcGNvZGUgMHglMDh4XG4iCisJICAgRFBfTEVWRUwgInNyY19hZGRyICBbJXg6JTA4eF0gIGxlbiBbJWQgKjRdICAiCisJCSAgICAiZHN0X2FkZHIgWyV4OiUwOHggKCUwOHgpXVxuIgorCSAgIERQX0xFVkVMICJjb21wX2FkZHIgWyV4OiUwOHhdICBjb21wX3ZhbCAweCUwOHhcbiIsCisJICAgZG1hZS5vcGNvZGUsIGRtYWUuc3JjX2FkZHJfaGksIGRtYWUuc3JjX2FkZHJfbG8sCisJICAgZG1hZS5sZW4sIGRtYWUuZHN0X2FkZHJfaGksIGRtYWUuZHN0X2FkZHJfbG8sIGRzdF9hZGRyLAorCSAgIGRtYWUuY29tcF9hZGRyX2hpLCBkbWFlLmNvbXBfYWRkcl9sbywgZG1hZS5jb21wX3ZhbCk7CisJRFAoQk5YMlhfTVNHX09GRiwgImRhdGEgWzB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eF1cbiIsCisJICAgYnAtPnNsb3dwYXRoLT53Yl9kYXRhWzBdLCBicC0+c2xvd3BhdGgtPndiX2RhdGFbMV0sCisJICAgYnAtPnNsb3dwYXRoLT53Yl9kYXRhWzJdLCBicC0+c2xvd3BhdGgtPndiX2RhdGFbM10pOworCisJbXV0ZXhfbG9jaygmYnAtPmRtYWVfbXV0ZXgpOworCisJKndiX2NvbXAgPSAwOworCisJYm54MnhfcG9zdF9kbWFlKGJwLCAmZG1hZSwgSU5JVF9ETUFFX0MoYnApKTsKKworCXVkZWxheSg1KTsKKworCXdoaWxlICgqd2JfY29tcCAhPSBETUFFX0NPTVBfVkFMKSB7CisJCURQKEJOWDJYX01TR19PRkYsICJ3Yl9jb21wIDB4JTA4eFxuIiwgKndiX2NvbXApOworCisJCWlmICghY250KSB7CisJCQlCTlgyWF9FUlIoIkRNQUUgdGltZW91dCFcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJY250LS07CisJCS8qIGFkanVzdCBkZWxheSBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KKwkJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQorCQkJbXNsZWVwKDEwMCk7CisJCWVsc2UKKwkJCXVkZWxheSg1KTsKKwl9CisKKwltdXRleF91bmxvY2soJmJwLT5kbWFlX211dGV4KTsKK30KKwordm9pZCBibngyeF9yZWFkX2RtYWUoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNyY19hZGRyLCB1MzIgbGVuMzIpCit7CisJc3RydWN0IGRtYWVfY29tbWFuZCBkbWFlOworCXUzMiAqd2JfY29tcCA9IGJueDJ4X3NwKGJwLCB3Yl9jb21wKTsKKwlpbnQgY250ID0gMjAwOworCisJaWYgKCFicC0+ZG1hZV9yZWFkeSkgeworCQl1MzIgKmRhdGEgPSBibngyeF9zcChicCwgd2JfZGF0YVswXSk7CisJCWludCBpOworCisJCURQKEJOWDJYX01TR19PRkYsICJETUFFIGlzIG5vdCByZWFkeSAoc3JjX2FkZHIgJTA4eCAgbGVuMzIgJWQpIgorCQkgICAiICB1c2luZyBpbmRpcmVjdFxuIiwgc3JjX2FkZHIsIGxlbjMyKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjMyOyBpKyspCisJCQlkYXRhW2ldID0gYm54MnhfcmVnX3JkX2luZChicCwgc3JjX2FkZHIgKyBpKjQpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZkbWFlLCAwLCBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkpOworCisJZG1hZS5vcGNvZGUgPSAoRE1BRV9DTURfU1JDX0dSQyB8IERNQUVfQ01EX0RTVF9QQ0kgfAorCQkgICAgICAgRE1BRV9DTURfQ19EU1RfUENJIHwgRE1BRV9DTURfQ19FTkFCTEUgfAorCQkgICAgICAgRE1BRV9DTURfU1JDX1JFU0VUIHwgRE1BRV9DTURfRFNUX1JFU0VUIHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJICAgICAgIERNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAorI2Vsc2UKKwkJICAgICAgIERNQUVfQ01EX0VORElBTklUWV9EV19TV0FQIHwKKyNlbmRpZgorCQkgICAgICAgKEJQX1BPUlQoYnApID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8CisJCSAgICAgICAoQlBfRTFIVk4oYnApIDw8IERNQUVfQ01EX0UxSFZOX1NISUZUKSk7CisJZG1hZS5zcmNfYWRkcl9sbyA9IHNyY19hZGRyID4+IDI7CisJZG1hZS5zcmNfYWRkcl9oaSA9IDA7CisJZG1hZS5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCB3Yl9kYXRhKSk7CisJZG1hZS5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCB3Yl9kYXRhKSk7CisJZG1hZS5sZW4gPSBsZW4zMjsKKwlkbWFlLmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCB3Yl9jb21wKSk7CisJZG1hZS5jb21wX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfY29tcCkpOworCWRtYWUuY29tcF92YWwgPSBETUFFX0NPTVBfVkFMOworCisJRFAoQk5YMlhfTVNHX09GRiwgIkRNQUU6IG9wY29kZSAweCUwOHhcbiIKKwkgICBEUF9MRVZFTCAic3JjX2FkZHIgIFsleDolMDh4XSAgbGVuIFslZCAqNF0gICIKKwkJICAgICJkc3RfYWRkciBbJXg6JTA4eCAoJTA4eCldXG4iCisJICAgRFBfTEVWRUwgImNvbXBfYWRkciBbJXg6JTA4eF0gIGNvbXBfdmFsIDB4JTA4eFxuIiwKKwkgICBkbWFlLm9wY29kZSwgZG1hZS5zcmNfYWRkcl9oaSwgZG1hZS5zcmNfYWRkcl9sbywKKwkgICBkbWFlLmxlbiwgZG1hZS5kc3RfYWRkcl9oaSwgZG1hZS5kc3RfYWRkcl9sbywgc3JjX2FkZHIsCisJICAgZG1hZS5jb21wX2FkZHJfaGksIGRtYWUuY29tcF9hZGRyX2xvLCBkbWFlLmNvbXBfdmFsKTsKKworCW11dGV4X2xvY2soJmJwLT5kbWFlX211dGV4KTsKKworCW1lbXNldChibngyeF9zcChicCwgd2JfZGF0YVswXSksIDAsIHNpemVvZih1MzIpICogNCk7CisJKndiX2NvbXAgPSAwOworCisJYm54MnhfcG9zdF9kbWFlKGJwLCAmZG1hZSwgSU5JVF9ETUFFX0MoYnApKTsKKworCXVkZWxheSg1KTsKKworCXdoaWxlICgqd2JfY29tcCAhPSBETUFFX0NPTVBfVkFMKSB7CisKKwkJaWYgKCFjbnQpIHsKKwkJCUJOWDJYX0VSUigiRE1BRSB0aW1lb3V0IVxuIik7CisJCQlicmVhazsKKwkJfQorCQljbnQtLTsKKwkJLyogYWRqdXN0IGRlbGF5IGZvciBlbXVsYXRpb24vRlBHQSAqLworCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCQltc2xlZXAoMTAwKTsKKwkJZWxzZQorCQkJdWRlbGF5KDUpOworCX0KKwlEUChCTlgyWF9NU0dfT0ZGLCAiZGF0YSBbMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XVxuIiwKKwkgICBicC0+c2xvd3BhdGgtPndiX2RhdGFbMF0sIGJwLT5zbG93cGF0aC0+d2JfZGF0YVsxXSwKKwkgICBicC0+c2xvd3BhdGgtPndiX2RhdGFbMl0sIGJwLT5zbG93cGF0aC0+d2JfZGF0YVszXSk7CisKKwltdXRleF91bmxvY2soJmJwLT5kbWFlX211dGV4KTsKK30KKwordm9pZCBibngyeF93cml0ZV9kbWFlX3BoeXNfbGVuKHN0cnVjdCBibngyeCAqYnAsIGRtYV9hZGRyX3QgcGh5c19hZGRyLAorCQkJICAgICAgIHUzMiBhZGRyLCB1MzIgbGVuKQoreworCWludCBkbWFlX3dyX21heCA9IERNQUVfTEVOMzJfV1JfTUFYKGJwKTsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCXdoaWxlIChsZW4gPiBkbWFlX3dyX21heCkgeworCQlibngyeF93cml0ZV9kbWFlKGJwLCBwaHlzX2FkZHIgKyBvZmZzZXQsCisJCQkJIGFkZHIgKyBvZmZzZXQsIGRtYWVfd3JfbWF4KTsKKwkJb2Zmc2V0ICs9IGRtYWVfd3JfbWF4ICogNDsKKwkJbGVuIC09IGRtYWVfd3JfbWF4OworCX0KKworCWJueDJ4X3dyaXRlX2RtYWUoYnAsIHBoeXNfYWRkciArIG9mZnNldCwgYWRkciArIG9mZnNldCwgbGVuKTsKK30KKworLyogdXNlZCBvbmx5IGZvciBzbG93cGF0aCBzbyBub3QgaW5saW5lZCAqLworc3RhdGljIHZvaWQgYm54Mnhfd2Jfd3Ioc3RydWN0IGJueDJ4ICpicCwgaW50IHJlZywgdTMyIHZhbF9oaSwgdTMyIHZhbF9sbykKK3sKKwl1MzIgd2Jfd3JpdGVbMl07CisKKwl3Yl93cml0ZVswXSA9IHZhbF9oaTsKKwl3Yl93cml0ZVsxXSA9IHZhbF9sbzsKKwlSRUdfV1JfRE1BRShicCwgcmVnLCB3Yl93cml0ZSwgMik7Cit9CisKKyNpZmRlZiBVU0VfV0JfUkQKK3N0YXRpYyB1NjQgYm54Mnhfd2JfcmQoc3RydWN0IGJueDJ4ICpicCwgaW50IHJlZykKK3sKKwl1MzIgd2JfZGF0YVsyXTsKKworCVJFR19SRF9ETUFFKGJwLCByZWcsIHdiX2RhdGEsIDIpOworCisJcmV0dXJuIEhJTE9fVTY0KHdiX2RhdGFbMF0sIHdiX2RhdGFbMV0pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYm54MnhfbWNfYXNzZXJ0KHN0cnVjdCBibngyeCAqYnApCit7CisJY2hhciBsYXN0X2lkeDsKKwlpbnQgaSwgcmMgPSAwOworCXUzMiByb3cwLCByb3cxLCByb3cyLCByb3czOworCisJLyogWFNUT1JNICovCisJbGFzdF9pZHggPSBSRUdfUkQ4KGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJICAgWFNUT1JNX0FTU0VSVF9MSVNUX0lOREVYX09GRlNFVCk7CisJaWYgKGxhc3RfaWR4KQorCQlCTlgyWF9FUlIoIlhTVE9STV9BU1NFUlRfTElTVF9JTkRFWCAweCV4XG4iLCBsYXN0X2lkeCk7CisKKwkvKiBwcmludCB0aGUgYXNzZXJ0cyAqLworCWZvciAoaSA9IDA7IGkgPCBTVFJPTV9BU1NFUlRfQVJSQVlfU0laRTsgaSsrKSB7CisKKwkJcm93MCA9IFJFR19SRChicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKKwkJCSAgICAgIFhTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkpOworCQlyb3cxID0gUkVHX1JEKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJICAgICAgWFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDQpOworCQlyb3cyID0gUkVHX1JEKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJICAgICAgWFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDgpOworCQlyb3czID0gUkVHX1JEKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJICAgICAgWFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDEyKTsKKworCQlpZiAocm93MCAhPSBDT01NT05fQVNNX0lOVkFMSURfQVNTRVJUX09QQ09ERSkgeworCQkJQk5YMlhfRVJSKCJYU1RPUk1fQVNTRVJUX0lOREVYIDB4JXggPSAweCUwOHgiCisJCQkJICAiIDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorCQkJCSAgaSwgcm93Mywgcm93Miwgcm93MSwgcm93MCk7CisJCQlyYysrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBUU1RPUk0gKi8KKwlsYXN0X2lkeCA9IFJFR19SRDgoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCQkgICBUU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVhfT0ZGU0VUKTsKKwlpZiAobGFzdF9pZHgpCisJCUJOWDJYX0VSUigiVFNUT1JNX0FTU0VSVF9MSVNUX0lOREVYIDB4JXhcbiIsIGxhc3RfaWR4KTsKKworCS8qIHByaW50IHRoZSBhc3NlcnRzICovCisJZm9yIChpID0gMDsgaSA8IFNUUk9NX0FTU0VSVF9BUlJBWV9TSVpFOyBpKyspIHsKKworCQlyb3cwID0gUkVHX1JEKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKworCQkJICAgICAgVFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSk7CisJCXJvdzEgPSBSRUdfUkQoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCQkgICAgICBUU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpICsgNCk7CisJCXJvdzIgPSBSRUdfUkQoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCQkgICAgICBUU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpICsgOCk7CisJCXJvdzMgPSBSRUdfUkQoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCQkgICAgICBUU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpICsgMTIpOworCisJCWlmIChyb3cwICE9IENPTU1PTl9BU01fSU5WQUxJRF9BU1NFUlRfT1BDT0RFKSB7CisJCQlCTlgyWF9FUlIoIlRTVE9STV9BU1NFUlRfSU5ERVggMHgleCA9IDB4JTA4eCIKKwkJCQkgICIgMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCisJCQkJICBpLCByb3czLCByb3cyLCByb3cxLCByb3cwKTsKKwkJCXJjKys7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENTVE9STSAqLworCWxhc3RfaWR4ID0gUkVHX1JEOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJCSAgIENTVE9STV9BU1NFUlRfTElTVF9JTkRFWF9PRkZTRVQpOworCWlmIChsYXN0X2lkeCkKKwkJQk5YMlhfRVJSKCJDU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVggMHgleFxuIiwgbGFzdF9pZHgpOworCisJLyogcHJpbnQgdGhlIGFzc2VydHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RST01fQVNTRVJUX0FSUkFZX1NJWkU7IGkrKykgeworCisJCXJvdzAgPSBSRUdfUkQoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJCQkgICAgICBDU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpKTsKKwkJcm93MSA9IFJFR19SRChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJCSAgICAgIENTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyA0KTsKKwkJcm93MiA9IFJFR19SRChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJCSAgICAgIENTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyA4KTsKKwkJcm93MyA9IFJFR19SRChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJCSAgICAgIENTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyAxMik7CisKKwkJaWYgKHJvdzAgIT0gQ09NTU9OX0FTTV9JTlZBTElEX0FTU0VSVF9PUENPREUpIHsKKwkJCUJOWDJYX0VSUigiQ1NUT1JNX0FTU0VSVF9JTkRFWCAweCV4ID0gMHglMDh4IgorCQkJCSAgIiAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKwkJCQkgIGksIHJvdzMsIHJvdzIsIHJvdzEsIHJvdzApOworCQkJcmMrKzsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVVNUT1JNICovCisJbGFzdF9pZHggPSBSRUdfUkQ4KGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkJICAgVVNUT1JNX0FTU0VSVF9MSVNUX0lOREVYX09GRlNFVCk7CisJaWYgKGxhc3RfaWR4KQorCQlCTlgyWF9FUlIoIlVTVE9STV9BU1NFUlRfTElTVF9JTkRFWCAweCV4XG4iLCBsYXN0X2lkeCk7CisKKwkvKiBwcmludCB0aGUgYXNzZXJ0cyAqLworCWZvciAoaSA9IDA7IGkgPCBTVFJPTV9BU1NFUlRfQVJSQVlfU0laRTsgaSsrKSB7CisKKwkJcm93MCA9IFJFR19SRChicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkJCSAgICAgIFVTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkpOworCQlyb3cxID0gUkVHX1JEKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkJICAgICAgVVNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDQpOworCQlyb3cyID0gUkVHX1JEKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkJICAgICAgVVNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDgpOworCQlyb3czID0gUkVHX1JEKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkJICAgICAgVVNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDEyKTsKKworCQlpZiAocm93MCAhPSBDT01NT05fQVNNX0lOVkFMSURfQVNTRVJUX09QQ09ERSkgeworCQkJQk5YMlhfRVJSKCJVU1RPUk1fQVNTRVJUX0lOREVYIDB4JXggPSAweCUwOHgiCisJCQkJICAiIDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorCQkJCSAgaSwgcm93Mywgcm93Miwgcm93MSwgcm93MCk7CisJCQlyYysrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2Z3X2R1bXAoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgYWRkcjsKKwl1MzIgbWFyaywgb2Zmc2V0OworCV9fYmUzMiBkYXRhWzldOworCWludCB3b3JkOworCisJaWYgKEJQX05PTUNQKGJwKSkgeworCQlCTlgyWF9FUlIoIk5PIE1DUCAtIGNhbiBub3QgZHVtcFxuIik7CisJCXJldHVybjsKKwl9CisKKwlhZGRyID0gYnAtPmNvbW1vbi5zaG1lbV9iYXNlIC0gMHgwODAwICsgNDsKKwltYXJrID0gUkVHX1JEKGJwLCBhZGRyKTsKKwltYXJrID0gTUNQX1JFR19NQ1BSX1NDUkFUQ0ggKyAoKG1hcmsgKyAweDMpICYgfjB4MykgLSAweDA4MDAwMDAwOworCXByX2VycigiYmVnaW4gZncgZHVtcCAobWFyayAweCV4KVxuIiwgbWFyayk7CisKKwlwcl9lcnIoIiIpOworCWZvciAob2Zmc2V0ID0gbWFyazsgb2Zmc2V0IDw9IGJwLT5jb21tb24uc2htZW1fYmFzZTsgb2Zmc2V0ICs9IDB4OCo0KSB7CisJCWZvciAod29yZCA9IDA7IHdvcmQgPCA4OyB3b3JkKyspCisJCQlkYXRhW3dvcmRdID0gaHRvbmwoUkVHX1JEKGJwLCBvZmZzZXQgKyA0KndvcmQpKTsKKwkJZGF0YVs4XSA9IDB4MDsKKwkJcHJfY29udCgiJXMiLCAoY2hhciAqKWRhdGEpOworCX0KKwlmb3IgKG9mZnNldCA9IGFkZHIgKyA0OyBvZmZzZXQgPD0gbWFyazsgb2Zmc2V0ICs9IDB4OCo0KSB7CisJCWZvciAod29yZCA9IDA7IHdvcmQgPCA4OyB3b3JkKyspCisJCQlkYXRhW3dvcmRdID0gaHRvbmwoUkVHX1JEKGJwLCBvZmZzZXQgKyA0KndvcmQpKTsKKwkJZGF0YVs4XSA9IDB4MDsKKwkJcHJfY29udCgiJXMiLCAoY2hhciAqKWRhdGEpOworCX0KKwlwcl9lcnIoImVuZCBvZiBmdyBkdW1wXG4iKTsKK30KKwordm9pZCBibngyeF9wYW5pY19kdW1wKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGk7CisJdTE2IGosIHN0YXJ0LCBlbmQ7CisKKwlicC0+c3RhdHNfc3RhdGUgPSBTVEFUU19TVEFURV9ESVNBQkxFRDsKKwlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0c19zdGF0ZSAtIERJU0FCTEVEXG4iKTsKKworCUJOWDJYX0VSUigiYmVnaW4gY3Jhc2ggZHVtcCAtLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwkvKiBJbmRpY2VzICovCisJLyogQ29tbW9uICovCisJQk5YMlhfRVJSKCJkZWZfY19pZHgoMHgleCkgIGRlZl91X2lkeCgweCV4KSAgZGVmX3hfaWR4KDB4JXgpIgorCQkgICIgIGRlZl90X2lkeCgweCV4KSAgZGVmX2F0dF9pZHgoMHgleCkgIGF0dG5fc3RhdGUoMHgleCkiCisJCSAgIiAgc3BxX3Byb2RfaWR4KDB4JXgpXG4iLAorCQkgIGJwLT5kZWZfY19pZHgsIGJwLT5kZWZfdV9pZHgsIGJwLT5kZWZfeF9pZHgsIGJwLT5kZWZfdF9pZHgsCisJCSAgYnAtPmRlZl9hdHRfaWR4LCBicC0+YXR0bl9zdGF0ZSwgYnAtPnNwcV9wcm9kX2lkeCk7CisKKwkvKiBSeCAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCisJCUJOWDJYX0VSUigiZnAlZDogcnhfYmRfcHJvZCgweCV4KSAgcnhfYmRfY29ucygweCV4KSIKKwkJCSAgIiAgKnJ4X2JkX2NvbnNfc2IoMHgleCkgIHJ4X2NvbXBfcHJvZCgweCV4KSIKKwkJCSAgIiAgcnhfY29tcF9jb25zKDB4JXgpICAqcnhfY29uc19zYigweCV4KVxuIiwKKwkJCSAgaSwgZnAtPnJ4X2JkX3Byb2QsIGZwLT5yeF9iZF9jb25zLAorCQkJICBsZTE2X3RvX2NwdSgqZnAtPnJ4X2JkX2NvbnNfc2IpLCBmcC0+cnhfY29tcF9wcm9kLAorCQkJICBmcC0+cnhfY29tcF9jb25zLCBsZTE2X3RvX2NwdSgqZnAtPnJ4X2NvbnNfc2IpKTsKKwkJQk5YMlhfRVJSKCIgICAgIHJ4X3NnZV9wcm9kKDB4JXgpICBsYXN0X21heF9zZ2UoMHgleCkiCisJCQkgICIgIGZwX3VfaWR4KDB4JXgpICpzYl91X2lkeCgweCV4KVxuIiwKKwkJCSAgZnAtPnJ4X3NnZV9wcm9kLCBmcC0+bGFzdF9tYXhfc2dlLAorCQkJICBsZTE2X3RvX2NwdShmcC0+ZnBfdV9pZHgpLAorCQkJICBmcC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4KTsKKwl9CisKKwkvKiBUeCAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCisJCUJOWDJYX0VSUigiZnAlZDogdHhfcGt0X3Byb2QoMHgleCkgIHR4X3BrdF9jb25zKDB4JXgpIgorCQkJICAiICB0eF9iZF9wcm9kKDB4JXgpICB0eF9iZF9jb25zKDB4JXgpIgorCQkJICAiICAqdHhfY29uc19zYigweCV4KVxuIiwKKwkJCSAgaSwgZnAtPnR4X3BrdF9wcm9kLCBmcC0+dHhfcGt0X2NvbnMsIGZwLT50eF9iZF9wcm9kLAorCQkJICBmcC0+dHhfYmRfY29ucywgbGUxNl90b19jcHUoKmZwLT50eF9jb25zX3NiKSk7CisJCUJOWDJYX0VSUigiICAgICBmcF9jX2lkeCgweCV4KSAgKnNiX2NfaWR4KDB4JXgpIgorCQkJICAiICB0eF9kYl9wcm9kKDB4JXgpXG4iLCBsZTE2X3RvX2NwdShmcC0+ZnBfY19pZHgpLAorCQkJICBmcC0+c3RhdHVzX2Jsay0+Y19zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4LAorCQkJICBmcC0+dHhfZGIuZGF0YS5wcm9kKTsKKwl9CisKKwkvKiBSaW5ncyAqLworCS8qIFJ4ICovCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisKKwkJc3RhcnQgPSBSWF9CRChsZTE2X3RvX2NwdSgqZnAtPnJ4X2NvbnNfc2IpIC0gMTApOworCQllbmQgPSBSWF9CRChsZTE2X3RvX2NwdSgqZnAtPnJ4X2NvbnNfc2IpICsgNTAzKTsKKwkJZm9yIChqID0gc3RhcnQ7IGogIT0gZW5kOyBqID0gUlhfQkQoaiArIDEpKSB7CisJCQl1MzIgKnJ4X2JkID0gKHUzMiAqKSZmcC0+cnhfZGVzY19yaW5nW2pdOworCQkJc3RydWN0IHN3X3J4X2JkICpzd19iZCA9ICZmcC0+cnhfYnVmX3Jpbmdbal07CisKKwkJCUJOWDJYX0VSUigiZnAlZDogcnhfYmRbJXhdPVsleDoleF0gIHN3X2JkPVslcF1cbiIsCisJCQkJICBpLCBqLCByeF9iZFsxXSwgcnhfYmRbMF0sIHN3X2JkLT5za2IpOworCQl9CisKKwkJc3RhcnQgPSBSWF9TR0UoZnAtPnJ4X3NnZV9wcm9kKTsKKwkJZW5kID0gUlhfU0dFKGZwLT5sYXN0X21heF9zZ2UpOworCQlmb3IgKGogPSBzdGFydDsgaiAhPSBlbmQ7IGogPSBSWF9TR0UoaiArIDEpKSB7CisJCQl1MzIgKnJ4X3NnZSA9ICh1MzIgKikmZnAtPnJ4X3NnZV9yaW5nW2pdOworCQkJc3RydWN0IHN3X3J4X3BhZ2UgKnN3X3BhZ2UgPSAmZnAtPnJ4X3BhZ2VfcmluZ1tqXTsKKworCQkJQk5YMlhfRVJSKCJmcCVkOiByeF9zZ2VbJXhdPVsleDoleF0gIHN3X3BhZ2U9WyVwXVxuIiwKKwkJCQkgIGksIGosIHJ4X3NnZVsxXSwgcnhfc2dlWzBdLCBzd19wYWdlLT5wYWdlKTsKKwkJfQorCisJCXN0YXJ0ID0gUkNRX0JEKGZwLT5yeF9jb21wX2NvbnMgLSAxMCk7CisJCWVuZCA9IFJDUV9CRChmcC0+cnhfY29tcF9jb25zICsgNTAzKTsKKwkJZm9yIChqID0gc3RhcnQ7IGogIT0gZW5kOyBqID0gUkNRX0JEKGogKyAxKSkgeworCQkJdTMyICpjcWUgPSAodTMyICopJmZwLT5yeF9jb21wX3Jpbmdbal07CisKKwkJCUJOWDJYX0VSUigiZnAlZDogY3FlWyV4XT1bJXg6JXg6JXg6JXhdXG4iLAorCQkJCSAgaSwgaiwgY3FlWzBdLCBjcWVbMV0sIGNxZVsyXSwgY3FlWzNdKTsKKwkJfQorCX0KKworCS8qIFR4ICovCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisKKwkJc3RhcnQgPSBUWF9CRChsZTE2X3RvX2NwdSgqZnAtPnR4X2NvbnNfc2IpIC0gMTApOworCQllbmQgPSBUWF9CRChsZTE2X3RvX2NwdSgqZnAtPnR4X2NvbnNfc2IpICsgMjQ1KTsKKwkJZm9yIChqID0gc3RhcnQ7IGogIT0gZW5kOyBqID0gVFhfQkQoaiArIDEpKSB7CisJCQlzdHJ1Y3Qgc3dfdHhfYmQgKnN3X2JkID0gJmZwLT50eF9idWZfcmluZ1tqXTsKKworCQkJQk5YMlhfRVJSKCJmcCVkOiBwYWNrZXRbJXhdPVslcCwleF1cbiIsCisJCQkJICBpLCBqLCBzd19iZC0+c2tiLCBzd19iZC0+Zmlyc3RfYmQpOworCQl9CisKKwkJc3RhcnQgPSBUWF9CRChmcC0+dHhfYmRfY29ucyAtIDEwKTsKKwkJZW5kID0gVFhfQkQoZnAtPnR4X2JkX2NvbnMgKyAyNTQpOworCQlmb3IgKGogPSBzdGFydDsgaiAhPSBlbmQ7IGogPSBUWF9CRChqICsgMSkpIHsKKwkJCXUzMiAqdHhfYmQgPSAodTMyICopJmZwLT50eF9kZXNjX3Jpbmdbal07CisKKwkJCUJOWDJYX0VSUigiZnAlZDogdHhfYmRbJXhdPVsleDoleDoleDoleF1cbiIsCisJCQkJICBpLCBqLCB0eF9iZFswXSwgdHhfYmRbMV0sIHR4X2JkWzJdLCB0eF9iZFszXSk7CisJCX0KKwl9CisKKwlibngyeF9md19kdW1wKGJwKTsKKwlibngyeF9tY19hc3NlcnQoYnApOworCUJOWDJYX0VSUigiZW5kIGNyYXNoIGR1bXAgLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfQorCit2b2lkIGJueDJ4X2ludF9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCXUzMiBhZGRyID0gcG9ydCA/IEhDX1JFR19DT05GSUdfMSA6IEhDX1JFR19DT05GSUdfMDsKKwl1MzIgdmFsID0gUkVHX1JEKGJwLCBhZGRyKTsKKwlpbnQgbXNpeCA9IChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpID8gMSA6IDA7CisJaW50IG1zaSA9IChicC0+ZmxhZ3MgJiBVU0lOR19NU0lfRkxBRykgPyAxIDogMDsKKworCWlmIChtc2l4KSB7CisJCXZhbCAmPSB+KEhDX0NPTkZJR18wX1JFR19TSU5HTEVfSVNSX0VOXzAgfAorCQkJIEhDX0NPTkZJR18wX1JFR19JTlRfTElORV9FTl8wKTsKKwkJdmFsIHw9IChIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAorCQkJSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOworCX0gZWxzZSBpZiAobXNpKSB7CisJCXZhbCAmPSB+SENfQ09ORklHXzBfUkVHX0lOVF9MSU5FX0VOXzA7CisJCXZhbCB8PSAoSENfQ09ORklHXzBfUkVHX1NJTkdMRV9JU1JfRU5fMCB8CisJCQlIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAorCQkJSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOworCX0gZWxzZSB7CisJCXZhbCB8PSAoSENfQ09ORklHXzBfUkVHX1NJTkdMRV9JU1JfRU5fMCB8CisJCQlIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAorCQkJSENfQ09ORklHXzBfUkVHX0lOVF9MSU5FX0VOXzAgfAorCQkJSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOworCisJCURQKE5FVElGX01TR19JTlRSLCAid3JpdGUgJXggdG8gSEMgJWQgKGFkZHIgMHgleClcbiIsCisJCSAgIHZhbCwgcG9ydCwgYWRkcik7CisKKwkJUkVHX1dSKGJwLCBhZGRyLCB2YWwpOworCisJCXZhbCAmPSB+SENfQ09ORklHXzBfUkVHX01TSV9NU0lYX0lOVF9FTl8wOworCX0KKworCURQKE5FVElGX01TR19JTlRSLCAid3JpdGUgJXggdG8gSEMgJWQgKGFkZHIgMHgleCkgIG1vZGUgJXNcbiIsCisJICAgdmFsLCBwb3J0LCBhZGRyLCAobXNpeCA/ICJNU0ktWCIgOiAobXNpID8gIk1TSSIgOiAiSU5UeCIpKSk7CisKKwlSRUdfV1IoYnAsIGFkZHIsIHZhbCk7CisJLyoKKwkgKiBFbnN1cmUgdGhhdCBIQ19DT05GSUcgaXMgd3JpdHRlbiBiZWZvcmUgbGVhZGluZy90cmFpbGluZyBlZGdlIGNvbmZpZworCSAqLworCW1taW93YigpOworCWJhcnJpZXIoKTsKKworCWlmIChDSElQX0lTX0UxSChicCkpIHsKKwkJLyogaW5pdCBsZWFkaW5nL3RyYWlsaW5nIGVkZ2UgKi8KKwkJaWYgKElTX0UxSE1GKGJwKSkgeworCQkJdmFsID0gKDB4ZWUwZiB8ICgxIDw8IChCUF9FMUhWTihicCkgKyA0KSkpOworCQkJaWYgKGJwLT5wb3J0LnBtZikKKwkJCQkvKiBlbmFibGUgbmlnIGFuZCBncGlvMyBhdHRlbnRpb24gKi8KKwkJCQl2YWwgfD0gMHgxMTAwOworCQl9IGVsc2UKKwkJCXZhbCA9IDB4ZmZmZjsKKworCQlSRUdfV1IoYnAsIEhDX1JFR19UUkFJTElOR19FREdFXzAgKyBwb3J0KjgsIHZhbCk7CisJCVJFR19XUihicCwgSENfUkVHX0xFQURJTkdfRURHRV8wICsgcG9ydCo4LCB2YWwpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIGluZGVlZCBlbmFibGVkIGZyb20gaGVyZSBvbiAqLworCW1taW93YigpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9pbnRfZGlzYWJsZShzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJdTMyIGFkZHIgPSBwb3J0ID8gSENfUkVHX0NPTkZJR18xIDogSENfUkVHX0NPTkZJR18wOworCXUzMiB2YWwgPSBSRUdfUkQoYnAsIGFkZHIpOworCisJdmFsICY9IH4oSENfQ09ORklHXzBfUkVHX1NJTkdMRV9JU1JfRU5fMCB8CisJCSBIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAorCQkgSENfQ09ORklHXzBfUkVHX0lOVF9MSU5FX0VOXzAgfAorCQkgSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOworCisJRFAoTkVUSUZfTVNHX0lOVFIsICJ3cml0ZSAleCB0byBIQyAlZCAoYWRkciAweCV4KVxuIiwKKwkgICB2YWwsIHBvcnQsIGFkZHIpOworCisJLyogZmx1c2ggYWxsIG91dHN0YW5kaW5nIHdyaXRlcyAqLworCW1taW93YigpOworCisJUkVHX1dSKGJwLCBhZGRyLCB2YWwpOworCWlmIChSRUdfUkQoYnAsIGFkZHIpICE9IHZhbCkKKwkJQk5YMlhfRVJSKCJCVUchIHByb3BlciB2YWwgbm90IHJlYWQgZnJvbSBJR1UhXG4iKTsKK30KKwordm9pZCBibngyeF9pbnRfZGlzYWJsZV9zeW5jKHN0cnVjdCBibngyeCAqYnAsIGludCBkaXNhYmxlX2h3KQoreworCWludCBtc2l4ID0gKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgPyAxIDogMDsKKwlpbnQgaSwgb2Zmc2V0OworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwlhdG9taWNfaW5jKCZicC0+aW50cl9zZW0pOworCXNtcF93bWIoKTsgLyogRW5zdXJlIHRoYXQgYnAtPmludHJfc2VtIHVwZGF0ZSBpcyBTTVAtc2FmZSAqLworCisJaWYgKGRpc2FibGVfaHcpCisJCS8qIHByZXZlbnQgdGhlIEhXIGZyb20gc2VuZGluZyBpbnRlcnJ1cHRzICovCisJCWJueDJ4X2ludF9kaXNhYmxlKGJwKTsKKworCS8qIG1ha2Ugc3VyZSBhbGwgSVNScyBhcmUgZG9uZSAqLworCWlmIChtc2l4KSB7CisJCXN5bmNocm9uaXplX2lycShicC0+bXNpeF90YWJsZVswXS52ZWN0b3IpOworCQlvZmZzZXQgPSAxOworI2lmZGVmIEJDTV9DTklDCisJCW9mZnNldCsrOworI2VuZGlmCisJCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQorCQkJc3luY2hyb25pemVfaXJxKGJwLT5tc2l4X3RhYmxlW2kgKyBvZmZzZXRdLnZlY3Rvcik7CisJfSBlbHNlCisJCXN5bmNocm9uaXplX2lycShicC0+cGRldi0+aXJxKTsKKworCS8qIG1ha2Ugc3VyZSBzcF90YXNrIGlzIG5vdCBydW5uaW5nICovCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYnAtPnNwX3Rhc2spOworCWZsdXNoX3dvcmtxdWV1ZShibngyeF93cSk7Cit9CisKKy8qIGZhc3QgcGF0aCAqLworCisvKgorICogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucworICovCisKKy8qIFJldHVybiB0cnVlIGlmIHN1Y2NlZWRlZCB0byBhY3F1aXJlIHRoZSBsb2NrICovCitzdGF0aWMgYm9vbCBibngyeF90cnlsb2NrX2h3X2xvY2soc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlc291cmNlKQoreworCXUzMiBsb2NrX3N0YXR1czsKKwl1MzIgcmVzb3VyY2VfYml0ID0gKDEgPDwgcmVzb3VyY2UpOworCWludCBmdW5jID0gQlBfRlVOQyhicCk7CisJdTMyIGh3X2xvY2tfY29udHJvbF9yZWc7CisKKwlEUChORVRJRl9NU0dfSFcsICJUcnlpbmcgdG8gdGFrZSBhIGxvY2sgb24gcmVzb3VyY2UgJWRcbiIsIHJlc291cmNlKTsKKworCS8qIFZhbGlkYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaXMgd2l0aGluIHJhbmdlICovCisJaWYgKHJlc291cmNlID4gSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUpIHsKKwkJRFAoTkVUSUZfTVNHX0hXLAorCQkgICAicmVzb3VyY2UoMHgleCkgPiBIV19MT0NLX01BWF9SRVNPVVJDRV9WQUxVRSgweCV4KVxuIiwKKwkJICAgcmVzb3VyY2UsIEhXX0xPQ0tfTUFYX1JFU09VUkNFX1ZBTFVFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZ1bmMgPD0gNSkKKwkJaHdfbG9ja19jb250cm9sX3JlZyA9IChNSVNDX1JFR19EUklWRVJfQ09OVFJPTF8xICsgZnVuYyo4KTsKKwllbHNlCisJCWh3X2xvY2tfY29udHJvbF9yZWcgPQorCQkJCShNSVNDX1JFR19EUklWRVJfQ09OVFJPTF83ICsgKGZ1bmMgLSA2KSo4KTsKKworCS8qIFRyeSB0byBhY3F1aXJlIHRoZSBsb2NrICovCisJUkVHX1dSKGJwLCBod19sb2NrX2NvbnRyb2xfcmVnICsgNCwgcmVzb3VyY2VfYml0KTsKKwlsb2NrX3N0YXR1cyA9IFJFR19SRChicCwgaHdfbG9ja19jb250cm9sX3JlZyk7CisJaWYgKGxvY2tfc3RhdHVzICYgcmVzb3VyY2VfYml0KQorCQlyZXR1cm4gdHJ1ZTsKKworCURQKE5FVElGX01TR19IVywgIkZhaWxlZCB0byBnZXQgYSBsb2NrIG9uIHJlc291cmNlICVkXG4iLCByZXNvdXJjZSk7CisJcmV0dXJuIGZhbHNlOworfQorCisKKyNpZmRlZiBCQ01fQ05JQworc3RhdGljIHZvaWQgYm54MnhfY25pY19jZmNfY29tcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY2lkKTsKKyNlbmRpZgorCit2b2lkIGJueDJ4X3NwX2V2ZW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQkgICB1bmlvbiBldGhfcnhfY3FlICpycl9jcWUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKKwlpbnQgY2lkID0gU1dfQ0lEKHJyX2NxZS0+cmFtcm9kX2NxZS5jb25uX2FuZF9jbWRfZGF0YSk7CisJaW50IGNvbW1hbmQgPSBDUUVfQ01EKHJyX2NxZS0+cmFtcm9kX2NxZS5jb25uX2FuZF9jbWRfZGF0YSk7CisKKwlEUChCTlgyWF9NU0dfU1AsCisJICAgImZwICVkICBjaWQgJWQgIGdvdCByYW1yb2QgIyVkICBzdGF0ZSBpcyAleCAgdHlwZSBpcyAlZFxuIiwKKwkgICBmcC0+aW5kZXgsIGNpZCwgY29tbWFuZCwgYnAtPnN0YXRlLAorCSAgIHJyX2NxZS0+cmFtcm9kX2NxZS5yYW1yb2RfdHlwZSk7CisKKwlicC0+c3BxX2xlZnQrKzsKKworCWlmIChmcC0+aW5kZXgpIHsKKwkJc3dpdGNoIChjb21tYW5kIHwgZnAtPnN0YXRlKSB7CisJCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUCB8CisJCQkJCQlCTlgyWF9GUF9TVEFURV9PUEVOSU5HKToKKwkJCURQKE5FVElGX01TR19JRlVQLCAiZ290IE1VTFRJWyVkXSBzZXR1cCByYW1yb2RcbiIsCisJCQkgICBjaWQpOworCQkJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfT1BFTjsKKwkJCWJyZWFrOworCisJCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0hBTFQgfCBCTlgyWF9GUF9TVEFURV9IQUxUSU5HKToKKwkJCURQKE5FVElGX01TR19JRkRPV04sICJnb3QgTVVMVElbJWRdIGhhbHQgcmFtcm9kXG4iLAorCQkJICAgY2lkKTsKKwkJCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0hBTFRFRDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCTlgyWF9FUlIoInVuZXhwZWN0ZWQgTUMgcmVwbHkgKCVkKSAgIgorCQkJCSAgImZwWyVkXSBzdGF0ZSBpcyAleFxuIiwKKwkJCQkgIGNvbW1hbmQsIGZwLT5pbmRleCwgZnAtPnN0YXRlKTsKKwkJCWJyZWFrOworCQl9CisJCW1iKCk7IC8qIGZvcmNlIGJueDJ4X3dhaXRfcmFtcm9kKCkgdG8gc2VlIHRoZSBjaGFuZ2UgKi8KKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoY29tbWFuZCB8IGJwLT5zdGF0ZSkgeworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1BPUlRfU0VUVVAgfCBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X1BPUlQpOgorCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBzZXR1cCByYW1yb2RcbiIpOworCQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9PUEVOOworCQlicmVhazsKKworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0hBTFQgfCBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQpOgorCQlEUChORVRJRl9NU0dfSUZET1dOLCAiZ290IGhhbHQgcmFtcm9kXG4iKTsKKwkJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9ERUxFVEU7CisJCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0hBTFRFRDsKKwkJYnJlYWs7CisKKwljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9DRkNfREVMIHwgQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9IQUxUKToKKwkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImdvdCBkZWxldGUgcmFtcm9kIGZvciBNVUxUSVslZF1cbiIsIGNpZCk7CisJCWJueDJ4X2ZwKGJwLCBjaWQsIHN0YXRlKSA9IEJOWDJYX0ZQX1NUQVRFX0NMT1NFRDsKKwkJYnJlYWs7CisKKyNpZmRlZiBCQ01fQ05JQworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0NGQ19ERUwgfCBCTlgyWF9TVEFURV9PUEVOKToKKwkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImdvdCBkZWxldGUgcmFtcm9kIGZvciBDSUQgJWRcbiIsIGNpZCk7CisJCWJueDJ4X2NuaWNfY2ZjX2NvbXAoYnAsIGNpZCk7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDIHwgQk5YMlhfU1RBVEVfT1BFTik6CisJY2FzZSAoUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQyB8IEJOWDJYX1NUQVRFX0RJQUcpOgorCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBzZXQgbWFjIHJhbXJvZFxuIik7CisJCWJwLT5zZXRfbWFjX3BlbmRpbmctLTsKKwkJc21wX3dtYigpOworCQlicmVhazsKKworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMgfCBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQpOgorCQlEUChORVRJRl9NU0dfSUZET1dOLCAiZ290ICh1bilzZXQgbWFjIHJhbXJvZFxuIik7CisJCWJwLT5zZXRfbWFjX3BlbmRpbmctLTsKKwkJc21wX3dtYigpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigidW5leHBlY3RlZCBNQyByZXBseSAoJWQpICBicC0+c3RhdGUgaXMgJXhcbiIsCisJCQkgIGNvbW1hbmQsIGJwLT5zdGF0ZSk7CisJCWJyZWFrOworCX0KKwltYigpOyAvKiBmb3JjZSBibngyeF93YWl0X3JhbXJvZCgpIHRvIHNlZSB0aGUgY2hhbmdlICovCit9CisKK2lycXJldHVybl90IGJueDJ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldl9pbnN0YW5jZSk7CisJdTE2IHN0YXR1cyA9IGJueDJ4X2Fja19pbnQoYnApOworCXUxNiBtYXNrOworCWludCBpOworCisJLyogUmV0dXJuIGhlcmUgaWYgaW50ZXJydXB0IGlzIHNoYXJlZCBhbmQgaXQncyBub3QgZm9yIHVzICovCisJaWYgKHVubGlrZWx5KHN0YXR1cyA9PSAwKSkgeworCQlEUChORVRJRl9NU0dfSU5UUiwgIm5vdCBvdXIgaW50ZXJydXB0IVxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJRFAoTkVUSUZfTVNHX0lOVFIsICJnb3QgYW4gaW50ZXJydXB0ICBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKKworCS8qIFJldHVybiBoZXJlIGlmIGludGVycnVwdCBpcyBkaXNhYmxlZCAqLworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKSkgeworCQlEUChORVRJRl9NU0dfSU5UUiwgImNhbGxlZCBidXQgaW50cl9zZW0gbm90IDAsIHJldHVybmluZ1xuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCXJldHVybiBJUlFfSEFORExFRDsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IEJOWDJYX05VTV9RVUVVRVMoYnApOyBpKyspIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisKKwkJbWFzayA9IDB4MiA8PCBmcC0+c2JfaWQ7CisJCWlmIChzdGF0dXMgJiBtYXNrKSB7CisJCQkvKiBIYW5kbGUgUnggYW5kIFR4IGFjY29yZGluZyB0byBTQiBpZCAqLworCQkJcHJlZmV0Y2goZnAtPnJ4X2NvbnNfc2IpOworCQkJcHJlZmV0Y2goJmZwLT5zdGF0dXNfYmxrLT51X3N0YXR1c19ibG9jay4KKwkJCQkJCXN0YXR1c19ibG9ja19pbmRleCk7CisJCQlwcmVmZXRjaChmcC0+dHhfY29uc19zYik7CisJCQlwcmVmZXRjaCgmZnAtPnN0YXR1c19ibGstPmNfc3RhdHVzX2Jsb2NrLgorCQkJCQkJc3RhdHVzX2Jsb2NrX2luZGV4KTsKKwkJCW5hcGlfc2NoZWR1bGUoJmJueDJ4X2ZwKGJwLCBmcC0+aW5kZXgsIG5hcGkpKTsKKwkJCXN0YXR1cyAmPSB+bWFzazsKKwkJfQorCX0KKworI2lmZGVmIEJDTV9DTklDCisJbWFzayA9IDB4MiA8PCBDTklDX1NCX0lEKGJwKTsKKwlpZiAoc3RhdHVzICYgKG1hc2sgfCAweDEpKSB7CisJCXN0cnVjdCBjbmljX29wcyAqY19vcHMgPSBOVUxMOworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJY19vcHMgPSByY3VfZGVyZWZlcmVuY2UoYnAtPmNuaWNfb3BzKTsKKwkJaWYgKGNfb3BzKQorCQkJY19vcHMtPmNuaWNfaGFuZGxlcihicC0+Y25pY19kYXRhLCBOVUxMKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJc3RhdHVzICY9IH5tYXNrOworCX0KKyNlbmRpZgorCisJaWYgKHVubGlrZWx5KHN0YXR1cyAmIDB4MSkpIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKGJueDJ4X3dxLCAmYnAtPnNwX3Rhc2ssIDApOworCisJCXN0YXR1cyAmPSB+MHgxOworCQlpZiAoIXN0YXR1cykKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJRFAoTkVUSUZfTVNHX0lOVFIsICJnb3QgYW4gdW5rbm93biBpbnRlcnJ1cHQhIChzdGF0dXMgMHgleClcbiIsCisJCSAgIHN0YXR1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGVuZCBvZiBmYXN0IHBhdGggKi8KKworCisvKiBMaW5rICovCisKKy8qCisgKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworaW50IGJueDJ4X2FjcXVpcmVfaHdfbG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzb3VyY2UpCit7CisJdTMyIGxvY2tfc3RhdHVzOworCXUzMiByZXNvdXJjZV9iaXQgPSAoMSA8PCByZXNvdXJjZSk7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwl1MzIgaHdfbG9ja19jb250cm9sX3JlZzsKKwlpbnQgY250OworCisJLyogVmFsaWRhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBpcyB3aXRoaW4gcmFuZ2UgKi8KKwlpZiAocmVzb3VyY2UgPiBIV19MT0NLX01BWF9SRVNPVVJDRV9WQUxVRSkgeworCQlEUChORVRJRl9NU0dfSFcsCisJCSAgICJyZXNvdXJjZSgweCV4KSA+IEhXX0xPQ0tfTUFYX1JFU09VUkNFX1ZBTFVFKDB4JXgpXG4iLAorCQkgICByZXNvdXJjZSwgSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZnVuYyA8PSA1KSB7CisJCWh3X2xvY2tfY29udHJvbF9yZWcgPSAoTUlTQ19SRUdfRFJJVkVSX0NPTlRST0xfMSArIGZ1bmMqOCk7CisJfSBlbHNlIHsKKwkJaHdfbG9ja19jb250cm9sX3JlZyA9CisJCQkJKE1JU0NfUkVHX0RSSVZFUl9DT05UUk9MXzcgKyAoZnVuYyAtIDYpKjgpOworCX0KKworCS8qIFZhbGlkYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbm90IGFscmVhZHkgdGFrZW4gKi8KKwlsb2NrX3N0YXR1cyA9IFJFR19SRChicCwgaHdfbG9ja19jb250cm9sX3JlZyk7CisJaWYgKGxvY2tfc3RhdHVzICYgcmVzb3VyY2VfYml0KSB7CisJCURQKE5FVElGX01TR19IVywgImxvY2tfc3RhdHVzIDB4JXggIHJlc291cmNlX2JpdCAweCV4XG4iLAorCQkgICBsb2NrX3N0YXR1cywgcmVzb3VyY2VfYml0KTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogVHJ5IGZvciA1IHNlY29uZCBldmVyeSA1bXMgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDA7IGNudCsrKSB7CisJCS8qIFRyeSB0byBhY3F1aXJlIHRoZSBsb2NrICovCisJCVJFR19XUihicCwgaHdfbG9ja19jb250cm9sX3JlZyArIDQsIHJlc291cmNlX2JpdCk7CisJCWxvY2tfc3RhdHVzID0gUkVHX1JEKGJwLCBod19sb2NrX2NvbnRyb2xfcmVnKTsKKwkJaWYgKGxvY2tfc3RhdHVzICYgcmVzb3VyY2VfYml0KQorCQkJcmV0dXJuIDA7CisKKwkJbXNsZWVwKDUpOworCX0KKwlEUChORVRJRl9NU0dfSFcsICJUaW1lb3V0XG4iKTsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworaW50IGJueDJ4X3JlbGVhc2VfaHdfbG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzb3VyY2UpCit7CisJdTMyIGxvY2tfc3RhdHVzOworCXUzMiByZXNvdXJjZV9iaXQgPSAoMSA8PCByZXNvdXJjZSk7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwl1MzIgaHdfbG9ja19jb250cm9sX3JlZzsKKworCURQKE5FVElGX01TR19IVywgIlJlbGVhc2luZyBhIGxvY2sgb24gcmVzb3VyY2UgJWRcbiIsIHJlc291cmNlKTsKKworCS8qIFZhbGlkYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaXMgd2l0aGluIHJhbmdlICovCisJaWYgKHJlc291cmNlID4gSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUpIHsKKwkJRFAoTkVUSUZfTVNHX0hXLAorCQkgICAicmVzb3VyY2UoMHgleCkgPiBIV19MT0NLX01BWF9SRVNPVVJDRV9WQUxVRSgweCV4KVxuIiwKKwkJICAgcmVzb3VyY2UsIEhXX0xPQ0tfTUFYX1JFU09VUkNFX1ZBTFVFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZ1bmMgPD0gNSkgeworCQlod19sb2NrX2NvbnRyb2xfcmVnID0gKE1JU0NfUkVHX0RSSVZFUl9DT05UUk9MXzEgKyBmdW5jKjgpOworCX0gZWxzZSB7CisJCWh3X2xvY2tfY29udHJvbF9yZWcgPQorCQkJCShNSVNDX1JFR19EUklWRVJfQ09OVFJPTF83ICsgKGZ1bmMgLSA2KSo4KTsKKwl9CisKKwkvKiBWYWxpZGF0aW5nIHRoYXQgdGhlIHJlc291cmNlIGlzIGN1cnJlbnRseSB0YWtlbiAqLworCWxvY2tfc3RhdHVzID0gUkVHX1JEKGJwLCBod19sb2NrX2NvbnRyb2xfcmVnKTsKKwlpZiAoIShsb2NrX3N0YXR1cyAmIHJlc291cmNlX2JpdCkpIHsKKwkJRFAoTkVUSUZfTVNHX0hXLCAibG9ja19zdGF0dXMgMHgleCAgcmVzb3VyY2VfYml0IDB4JXhcbiIsCisJCSAgIGxvY2tfc3RhdHVzLCByZXNvdXJjZV9iaXQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlSRUdfV1IoYnAsIGh3X2xvY2tfY29udHJvbF9yZWcsIHJlc291cmNlX2JpdCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IGJueDJ4X2dldF9ncGlvKHN0cnVjdCBibngyeCAqYnAsIGludCBncGlvX251bSwgdTggcG9ydCkKK3sKKwkvKiBUaGUgR1BJTyBzaG91bGQgYmUgc3dhcHBlZCBpZiBzd2FwIHJlZ2lzdGVyIGlzIHNldCBhbmQgYWN0aXZlICovCisJaW50IGdwaW9fcG9ydCA9IChSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKSAmJgorCQkJIFJFR19SRChicCwgTklHX1JFR19TVFJBUF9PVkVSUklERSkpIF4gcG9ydDsKKwlpbnQgZ3Bpb19zaGlmdCA9IGdwaW9fbnVtICsKKwkJCShncGlvX3BvcnQgPyBNSVNDX1JFR0lTVEVSU19HUElPX1BPUlRfU0hJRlQgOiAwKTsKKwl1MzIgZ3Bpb19tYXNrID0gKDEgPDwgZ3Bpb19zaGlmdCk7CisJdTMyIGdwaW9fcmVnOworCWludCB2YWx1ZTsKKworCWlmIChncGlvX251bSA+IE1JU0NfUkVHSVNURVJTX0dQSU9fMykgeworCQlCTlgyWF9FUlIoIkludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpb19udW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZWFkIEdQSU8gdmFsdWUgKi8KKwlncGlvX3JlZyA9IFJFR19SRChicCwgTUlTQ19SRUdfR1BJTyk7CisKKwkvKiBnZXQgdGhlIHJlcXVlc3RlZCBwaW4gdmFsdWUgKi8KKwlpZiAoKGdwaW9fcmVnICYgZ3Bpb19tYXNrKSA9PSBncGlvX21hc2spCisJCXZhbHVlID0gMTsKKwllbHNlCisJCXZhbHVlID0gMDsKKworCURQKE5FVElGX01TR19MSU5LLCAicGluICVkICB2YWx1ZSAweCV4XG4iLCBncGlvX251bSwgdmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorCitpbnQgYm54Mnhfc2V0X2dwaW8oc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCkKK3sKKwkvKiBUaGUgR1BJTyBzaG91bGQgYmUgc3dhcHBlZCBpZiBzd2FwIHJlZ2lzdGVyIGlzIHNldCBhbmQgYWN0aXZlICovCisJaW50IGdwaW9fcG9ydCA9IChSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKSAmJgorCQkJIFJFR19SRChicCwgTklHX1JFR19TVFJBUF9PVkVSUklERSkpIF4gcG9ydDsKKwlpbnQgZ3Bpb19zaGlmdCA9IGdwaW9fbnVtICsKKwkJCShncGlvX3BvcnQgPyBNSVNDX1JFR0lTVEVSU19HUElPX1BPUlRfU0hJRlQgOiAwKTsKKwl1MzIgZ3Bpb19tYXNrID0gKDEgPDwgZ3Bpb19zaGlmdCk7CisJdTMyIGdwaW9fcmVnOworCisJaWYgKGdwaW9fbnVtID4gTUlTQ19SRUdJU1RFUlNfR1BJT18zKSB7CisJCUJOWDJYX0VSUigiSW52YWxpZCBHUElPICVkXG4iLCBncGlvX251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9HUElPKTsKKwkvKiByZWFkIEdQSU8gYW5kIG1hc2sgZXhjZXB0IHRoZSBmbG9hdCBiaXRzICovCisJZ3Bpb19yZWcgPSAoUkVHX1JEKGJwLCBNSVNDX1JFR19HUElPKSAmIE1JU0NfUkVHSVNURVJTX0dQSU9fRkxPQVQpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1c6CisJCURQKE5FVElGX01TR19MSU5LLCAiU2V0IEdQSU8gJWQgKHNoaWZ0ICVkKSAtPiBvdXRwdXQgbG93XG4iLAorCQkgICBncGlvX251bSwgZ3Bpb19zaGlmdCk7CisJCS8qIGNsZWFyIEZMT0FUIGFuZCBzZXQgQ0xSICovCisJCWdwaW9fcmVnICY9IH4oZ3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fRkxPQVRfUE9TKTsKKwkJZ3Bpb19yZWcgfD0gIChncGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfR1BJT19DTFJfUE9TKTsKKwkJYnJlYWs7CisKKwljYXNlIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0g6CisJCURQKE5FVElGX01TR19MSU5LLCAiU2V0IEdQSU8gJWQgKHNoaWZ0ICVkKSAtPiBvdXRwdXQgaGlnaFxuIiwKKwkJICAgZ3Bpb19udW0sIGdwaW9fc2hpZnQpOworCQkvKiBjbGVhciBGTE9BVCBhbmQgc2V0IFNFVCAqLworCQlncGlvX3JlZyAmPSB+KGdwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0ZMT0FUX1BPUyk7CisJCWdwaW9fcmVnIHw9ICAoZ3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fU0VUX1BPUyk7CisJCWJyZWFrOworCisJY2FzZSBNSVNDX1JFR0lTVEVSU19HUElPX0lOUFVUX0hJX1o6CisJCURQKE5FVElGX01TR19MSU5LLCAiU2V0IEdQSU8gJWQgKHNoaWZ0ICVkKSAtPiBpbnB1dFxuIiwKKwkJICAgZ3Bpb19udW0sIGdwaW9fc2hpZnQpOworCQkvKiBzZXQgRkxPQVQgKi8KKwkJZ3Bpb19yZWcgfD0gKGdwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0ZMT0FUX1BPUyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJUkVHX1dSKGJwLCBNSVNDX1JFR19HUElPLCBncGlvX3JlZyk7CisJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX0dQSU8pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBibngyeF9zZXRfZ3Bpb19pbnQoc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCkKK3sKKwkvKiBUaGUgR1BJTyBzaG91bGQgYmUgc3dhcHBlZCBpZiBzd2FwIHJlZ2lzdGVyIGlzIHNldCBhbmQgYWN0aXZlICovCisJaW50IGdwaW9fcG9ydCA9IChSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKSAmJgorCQkJIFJFR19SRChicCwgTklHX1JFR19TVFJBUF9PVkVSUklERSkpIF4gcG9ydDsKKwlpbnQgZ3Bpb19zaGlmdCA9IGdwaW9fbnVtICsKKwkJCShncGlvX3BvcnQgPyBNSVNDX1JFR0lTVEVSU19HUElPX1BPUlRfU0hJRlQgOiAwKTsKKwl1MzIgZ3Bpb19tYXNrID0gKDEgPDwgZ3Bpb19zaGlmdCk7CisJdTMyIGdwaW9fcmVnOworCisJaWYgKGdwaW9fbnVtID4gTUlTQ19SRUdJU1RFUlNfR1BJT18zKSB7CisJCUJOWDJYX0VSUigiSW52YWxpZCBHUElPICVkXG4iLCBncGlvX251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9HUElPKTsKKwkvKiByZWFkIEdQSU8gaW50ICovCisJZ3Bpb19yZWcgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0dQSU9fSU5UKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfT1VUUFVUX0NMUjoKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJDbGVhciBHUElPIElOVCAlZCAoc2hpZnQgJWQpIC0+ICIKKwkJCQkgICAib3V0cHV0IGxvd1xuIiwgZ3Bpb19udW0sIGdwaW9fc2hpZnQpOworCQkvKiBjbGVhciBTRVQgYW5kIHNldCBDTFIgKi8KKwkJZ3Bpb19yZWcgJj0gfihncGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfU0VUX1BPUyk7CisJCWdwaW9fcmVnIHw9ICAoZ3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX0NMUl9QT1MpOworCQlicmVhazsKKworCWNhc2UgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfT1VUUFVUX1NFVDoKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXQgR1BJTyBJTlQgJWQgKHNoaWZ0ICVkKSAtPiAiCisJCQkJICAgIm91dHB1dCBoaWdoXG4iLCBncGlvX251bSwgZ3Bpb19zaGlmdCk7CisJCS8qIGNsZWFyIENMUiBhbmQgc2V0IFNFVCAqLworCQlncGlvX3JlZyAmPSB+KGdwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0lOVF9DTFJfUE9TKTsKKwkJZ3Bpb19yZWcgfD0gIChncGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfU0VUX1BPUyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJUkVHX1dSKGJwLCBNSVNDX1JFR19HUElPX0lOVCwgZ3Bpb19yZWcpOworCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9HUElPKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9zcGlvKHN0cnVjdCBibngyeCAqYnAsIGludCBzcGlvX251bSwgdTMyIG1vZGUpCit7CisJdTMyIHNwaW9fbWFzayA9ICgxIDw8IHNwaW9fbnVtKTsKKwl1MzIgc3Bpb19yZWc7CisKKwlpZiAoKHNwaW9fbnVtIDwgTUlTQ19SRUdJU1RFUlNfU1BJT180KSB8fAorCSAgICAoc3Bpb19udW0gPiBNSVNDX1JFR0lTVEVSU19TUElPXzcpKSB7CisJCUJOWDJYX0VSUigiSW52YWxpZCBTUElPICVkXG4iLCBzcGlvX251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9TUElPKTsKKwkvKiByZWFkIFNQSU8gYW5kIG1hc2sgZXhjZXB0IHRoZSBmbG9hdCBiaXRzICovCisJc3Bpb19yZWcgPSAoUkVHX1JEKGJwLCBNSVNDX1JFR19TUElPKSAmIE1JU0NfUkVHSVNURVJTX1NQSU9fRkxPQVQpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBNSVNDX1JFR0lTVEVSU19TUElPX09VVFBVVF9MT1c6CisJCURQKE5FVElGX01TR19MSU5LLCAiU2V0IFNQSU8gJWQgLT4gb3V0cHV0IGxvd1xuIiwgc3Bpb19udW0pOworCQkvKiBjbGVhciBGTE9BVCBhbmQgc2V0IENMUiAqLworCQlzcGlvX3JlZyAmPSB+KHNwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19TUElPX0ZMT0FUX1BPUyk7CisJCXNwaW9fcmVnIHw9ICAoc3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX1NQSU9fQ0xSX1BPUyk7CisJCWJyZWFrOworCisJY2FzZSBNSVNDX1JFR0lTVEVSU19TUElPX09VVFBVVF9ISUdIOgorCQlEUChORVRJRl9NU0dfTElOSywgIlNldCBTUElPICVkIC0+IG91dHB1dCBoaWdoXG4iLCBzcGlvX251bSk7CisJCS8qIGNsZWFyIEZMT0FUIGFuZCBzZXQgU0VUICovCisJCXNwaW9fcmVnICY9IH4oc3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX1NQSU9fRkxPQVRfUE9TKTsKKwkJc3Bpb19yZWcgfD0gIChzcGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfU1BJT19TRVRfUE9TKTsKKwkJYnJlYWs7CisKKwljYXNlIE1JU0NfUkVHSVNURVJTX1NQSU9fSU5QVVRfSElfWjoKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXQgU1BJTyAlZCAtPiBpbnB1dFxuIiwgc3Bpb19udW0pOworCQkvKiBzZXQgRkxPQVQgKi8KKwkJc3Bpb19yZWcgfD0gKHNwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19TUElPX0ZMT0FUX1BPUyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJUkVHX1dSKGJwLCBNSVNDX1JFR19TUElPLCBzcGlvX3JlZyk7CisJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1NQSU8pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYm54MnhfY2FsY19mY19hZHYoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzd2l0Y2ggKGJwLT5saW5rX3ZhcnMuaWVlZV9mYyAmCisJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX01BU0spIHsKKwljYXNlIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX05PTkU6CisJCWJwLT5wb3J0LmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF9Bc3ltX1BhdXNlIHwKKwkJCQkJICBBRFZFUlRJU0VEX1BhdXNlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEg6CisJCWJwLT5wb3J0LmFkdmVydGlzaW5nIHw9IChBRFZFUlRJU0VEX0FzeW1fUGF1c2UgfAorCQkJCQkgQURWRVJUSVNFRF9QYXVzZSk7CisJCWJyZWFrOworCisJY2FzZSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOgorCQlicC0+cG9ydC5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEX0FzeW1fUGF1c2UgfAorCQkJCQkgIEFEVkVSVElTRURfUGF1c2UpOworCQlicmVhazsKKwl9Cit9CisKKwordTggYm54MnhfaW5pdGlhbF9waHlfaW5pdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbG9hZF9tb2RlKQoreworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCXU4IHJjOworCisJCS8qIEluaXRpYWxpemUgbGluayBwYXJhbWV0ZXJzIHN0cnVjdHVyZSB2YXJpYWJsZXMgKi8KKwkJLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdHVybiBvZmYgUlggRkMgZm9yIGp1bWJvIGZyYW1lcworCQkgICBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCisJCWlmIChicC0+ZGV2LT5tdHUgPiA1MDAwKQorCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9mY19hdXRvX2FkdiA9IEJOWDJYX0ZMT1dfQ1RSTF9UWDsKKwkJZWxzZQorCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9mY19hdXRvX2FkdiA9IEJOWDJYX0ZMT1dfQ1RSTF9CT1RIOworCisJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCisJCWlmIChsb2FkX21vZGUgPT0gTE9BRF9ESUFHKQorCQkJYnAtPmxpbmtfcGFyYW1zLmxvb3BiYWNrX21vZGUgPSBMT09QQkFDS19YR1hTXzEwOworCisJCXJjID0gYm54MnhfcGh5X2luaXQoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMpOworCisJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCisJCWJueDJ4X2NhbGNfZmNfYWR2KGJwKTsKKworCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkgJiYgYnAtPmxpbmtfdmFycy5saW5rX3VwKSB7CisJCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX0xJTktfVVApOworCQkJYm54MnhfbGlua19yZXBvcnQoYnApOworCQl9CisKKwkJcmV0dXJuIHJjOworCX0KKwlCTlgyWF9FUlIoIkJvb3Rjb2RlIGlzIG1pc3NpbmcgLSBjYW4gbm90IGluaXRpYWxpemUgbGlua1xuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgYm54MnhfbGlua19zZXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpZiAoIUJQX05PTUNQKGJwKSkgeworCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKKwkJYm54MnhfcGh5X2luaXQoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMpOworCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKKworCQlibngyeF9jYWxjX2ZjX2FkdihicCk7CisJfSBlbHNlCisJCUJOWDJYX0VSUigiQm9vdGNvZGUgaXMgbWlzc2luZyAtIGNhbiBub3Qgc2V0IGxpbmtcbiIpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9fbGlua19yZXNldChzdHJ1Y3QgYm54MnggKmJwKQoreworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCQlibngyeF9saW5rX3Jlc2V0KCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzLCAxKTsKKwkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7CisJfSBlbHNlCisJCUJOWDJYX0VSUigiQm9vdGNvZGUgaXMgbWlzc2luZyAtIGNhbiBub3QgcmVzZXQgbGlua1xuIik7Cit9CisKK3U4IGJueDJ4X2xpbmtfdGVzdChzdHJ1Y3QgYm54MnggKmJwKQoreworCXU4IHJjID0gMDsKKworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCQlyYyA9IGJueDJ4X3Rlc3RfbGluaygmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7CisJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCX0gZWxzZQorCQlCTlgyWF9FUlIoIkJvb3Rjb2RlIGlzIG1pc3NpbmcgLSBjYW4gbm90IHRlc3QgbGlua1xuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfcG9ydF9taW5tYXgoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgcl9wYXJhbSA9IGJwLT5saW5rX3ZhcnMubGluZV9zcGVlZCAvIDg7CisJdTMyIGZhaXJfcGVyaW9kaWNfdGltZW91dF91c2VjOworCXUzMiB0X2ZhaXI7CisKKwltZW1zZXQoJihicC0+Y21uZy5yc192YXJzKSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfcG9ydCkpOworCW1lbXNldCgmKGJwLT5jbW5nLmZhaXJfdmFycyksIDAsIHNpemVvZihzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfcG9ydCkpOworCisJLyogMTAwIHVzZWMgaW4gU0RNIHRpY2tzID0gMjUgc2luY2UgZWFjaCB0aWNrIGlzIDQgdXNlYyAqLworCWJwLT5jbW5nLnJzX3ZhcnMucnNfcGVyaW9kaWNfdGltZW91dCA9IFJTX1BFUklPRElDX1RJTUVPVVRfVVNFQyAvIDQ7CisKKwkvKiB0aGlzIGlzIHRoZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggbm8gdGltZXIgYXJtaW5nIHdpbGwgb2NjdXIKKwkgICAxLjI1IGNvZWZmaWNpZW50IGlzIGZvciB0aGUgdGhyZXNob2xkIHRvIGJlIGEgbGl0dGxlIGJpZ2dlcgorCSAgIHRoYW4gdGhlIHJlYWwgdGltZSwgdG8gY29tcGVuc2F0ZSBmb3IgdGltZXIgaW4tYWNjdXJhY3kgKi8KKwlicC0+Y21uZy5yc192YXJzLnJzX3RocmVzaG9sZCA9CisJCQkJKFJTX1BFUklPRElDX1RJTUVPVVRfVVNFQyAqIHJfcGFyYW0gKiA1KSAvIDQ7CisKKwkvKiByZXNvbHV0aW9uIG9mIGZhaXJuZXNzIHRpbWVyICovCisJZmFpcl9wZXJpb2RpY190aW1lb3V0X3VzZWMgPSBRTV9BUkJfQllURVMgLyByX3BhcmFtOworCS8qIGZvciAxMEcgaXQgaXMgMTAwMHVzZWMuIGZvciAxRyBpdCBpcyAxMDAwMHVzZWMuICovCisJdF9mYWlyID0gVF9GQUlSX0NPRUYgLyBicC0+bGlua192YXJzLmxpbmVfc3BlZWQ7CisKKwkvKiB0aGlzIGlzIHRoZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggd2Ugd29uJ3QgYXJtIHRoZSB0aW1lciBhbnltb3JlICovCisJYnAtPmNtbmcuZmFpcl92YXJzLmZhaXJfdGhyZXNob2xkID0gUU1fQVJCX0JZVEVTOworCisJLyogd2UgbXVsdGlwbHkgYnkgMWUzLzggdG8gZ2V0IGJ5dGVzL21zZWMuCisJICAgV2UgZG9uJ3Qgd2FudCB0aGUgY3JlZGl0cyB0byBwYXNzIGEgY3JlZGl0CisJICAgb2YgdGhlIHRfZmFpcipGQUlSX01FTSAoYWxnb3JpdGhtIHJlc29sdXRpb24pICovCisJYnAtPmNtbmcuZmFpcl92YXJzLnVwcGVyX2JvdW5kID0gcl9wYXJhbSAqIHRfZmFpciAqIEZBSVJfTUVNOworCS8qIHNpbmNlIGVhY2ggdGljayBpcyA0IHVzZWMgKi8KKwlicC0+Y21uZy5mYWlyX3ZhcnMuZmFpcm5lc3NfdGltZW91dCA9IGZhaXJfcGVyaW9kaWNfdGltZW91dF91c2VjIC8gNDsKK30KKworLyogQ2FsY3VsYXRlcyB0aGUgc3VtIG9mIHZuX21pbl9yYXRlcy4KKyAgIEl0J3MgbmVlZGVkIGZvciBmdXJ0aGVyIG5vcm1hbGl6aW5nIG9mIHRoZSBtaW5fcmF0ZXMuCisgICBSZXR1cm5zOgorICAgICBzdW0gb2Ygdm5fbWluX3JhdGVzLgorICAgICAgIG9yCisgICAgIDAgLSBpZiBhbGwgdGhlIG1pbl9yYXRlcyBhcmUgMC4KKyAgICAgSW4gdGhlIGxhdGVyIGNhc2UgZmFpbmVzcyBhbGdvcml0aG0gc2hvdWxkIGJlIGRlYWN0aXZhdGVkLgorICAgICBJZiBub3QgYWxsIG1pbl9yYXRlcyBhcmUgemVybyB0aGVuIHRob3NlIHRoYXQgYXJlIHplcm9lcyB3aWxsIGJlIHNldCB0byAxLgorICovCitzdGF0aWMgdm9pZCBibngyeF9jYWxjX3ZuX3dlaWdodF9zdW0oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgYWxsX3plcm8gPSAxOworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IHZuOworCisJYnAtPnZuX3dlaWdodF9zdW0gPSAwOworCWZvciAodm4gPSBWTl8wOyB2biA8IEUxSFZOX01BWDsgdm4rKykgeworCQlpbnQgZnVuYyA9IDIqdm4gKyBwb3J0OworCQl1MzIgdm5fY2ZnID0gU0hNRU1fUkQoYnAsIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5jb25maWcpOworCQl1MzIgdm5fbWluX3JhdGUgPSAoKHZuX2NmZyAmIEZVTkNfTUZfQ0ZHX01JTl9CV19NQVNLKSA+PgorCQkJCSAgIEZVTkNfTUZfQ0ZHX01JTl9CV19TSElGVCkgKiAxMDA7CisKKwkJLyogU2tpcCBoaWRkZW4gdm5zICovCisJCWlmICh2bl9jZmcgJiBGVU5DX01GX0NGR19GVU5DX0hJREUpCisJCQljb250aW51ZTsKKworCQkvKiBJZiBtaW4gcmF0ZSBpcyB6ZXJvIC0gc2V0IGl0IHRvIDEgKi8KKwkJaWYgKCF2bl9taW5fcmF0ZSkKKwkJCXZuX21pbl9yYXRlID0gREVGX01JTl9SQVRFOworCQllbHNlCisJCQlhbGxfemVybyA9IDA7CisKKwkJYnAtPnZuX3dlaWdodF9zdW0gKz0gdm5fbWluX3JhdGU7CisJfQorCisJLyogLi4uIG9ubHkgaWYgYWxsIG1pbiByYXRlcyBhcmUgemVyb3MgLSBkaXNhYmxlIGZhaXJuZXNzICovCisJaWYgKGFsbF96ZXJvKSB7CisJCWJwLT5jbW5nLmZsYWdzLmNtbmdfZW5hYmxlcyAmPQorCQkJCQl+Q01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19WTjsKKwkJRFAoTkVUSUZfTVNHX0lGVVAsICJBbGwgTUlOIHZhbHVlcyBhcmUgemVyb2VzIgorCQkgICAiICBmYWlybmVzcyB3aWxsIGJlIGRpc2FibGVkXG4iKTsKKwl9IGVsc2UKKwkJYnAtPmNtbmcuZmxhZ3MuY21uZ19lbmFibGVzIHw9CisJCQkJCUNNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfVk47Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfdm5fbWlubWF4KHN0cnVjdCBibngyeCAqYnAsIGludCBmdW5jKQoreworCXN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfdm4gbV9yc192bjsKKwlzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfdm4gbV9mYWlyX3ZuOworCXUzMiB2bl9jZmcgPSBTSE1FTV9SRChicCwgbWZfY2ZnLmZ1bmNfbWZfY29uZmlnW2Z1bmNdLmNvbmZpZyk7CisJdTE2IHZuX21pbl9yYXRlLCB2bl9tYXhfcmF0ZTsKKwlpbnQgaTsKKworCS8qIElmIGZ1bmN0aW9uIGlzIGhpZGRlbiAtIHNldCBtaW4gYW5kIG1heCB0byB6ZXJvZXMgKi8KKwlpZiAodm5fY2ZnICYgRlVOQ19NRl9DRkdfRlVOQ19ISURFKSB7CisJCXZuX21pbl9yYXRlID0gMDsKKwkJdm5fbWF4X3JhdGUgPSAwOworCisJfSBlbHNlIHsKKwkJdm5fbWluX3JhdGUgPSAoKHZuX2NmZyAmIEZVTkNfTUZfQ0ZHX01JTl9CV19NQVNLKSA+PgorCQkJCUZVTkNfTUZfQ0ZHX01JTl9CV19TSElGVCkgKiAxMDA7CisJCS8qIElmIG1pbiByYXRlIGlzIHplcm8gLSBzZXQgaXQgdG8gMSAqLworCQlpZiAoIXZuX21pbl9yYXRlKQorCQkJdm5fbWluX3JhdGUgPSBERUZfTUlOX1JBVEU7CisJCXZuX21heF9yYXRlID0gKCh2bl9jZmcgJiBGVU5DX01GX0NGR19NQVhfQldfTUFTSykgPj4KKwkJCQlGVU5DX01GX0NGR19NQVhfQldfU0hJRlQpICogMTAwOworCX0KKwlEUChORVRJRl9NU0dfSUZVUCwKKwkgICAiZnVuYyAlZDogdm5fbWluX3JhdGUgJWQgIHZuX21heF9yYXRlICVkICB2bl93ZWlnaHRfc3VtICVkXG4iLAorCSAgIGZ1bmMsIHZuX21pbl9yYXRlLCB2bl9tYXhfcmF0ZSwgYnAtPnZuX3dlaWdodF9zdW0pOworCisJbWVtc2V0KCZtX3JzX3ZuLCAwLCBzaXplb2Yoc3RydWN0IHJhdGVfc2hhcGluZ192YXJzX3Blcl92bikpOworCW1lbXNldCgmbV9mYWlyX3ZuLCAwLCBzaXplb2Yoc3RydWN0IGZhaXJuZXNzX3ZhcnNfcGVyX3ZuKSk7CisKKwkvKiBnbG9iYWwgdm4gY291bnRlciAtIG1heGltYWwgTWJwcyBmb3IgdGhpcyB2biAqLworCW1fcnNfdm4udm5fY291bnRlci5yYXRlID0gdm5fbWF4X3JhdGU7CisKKwkvKiBxdW90YSAtIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBpbiB0aGlzIHBlcmlvZCAqLworCW1fcnNfdm4udm5fY291bnRlci5xdW90YSA9CisJCQkJKHZuX21heF9yYXRlICogUlNfUEVSSU9ESUNfVElNRU9VVF9VU0VDKSAvIDg7CisKKwlpZiAoYnAtPnZuX3dlaWdodF9zdW0pIHsKKwkJLyogY3JlZGl0IGZvciBlYWNoIHBlcmlvZCBvZiB0aGUgZmFpcm5lc3MgYWxnb3JpdGhtOgorCQkgICBudW1iZXIgb2YgYnl0ZXMgaW4gVF9GQUlSICh0aGUgdm4gc2hhcmUgdGhlIHBvcnQgcmF0ZSkuCisJCSAgIHZuX3dlaWdodF9zdW0gc2hvdWxkIG5vdCBiZSBsYXJnZXIgdGhhbiAxMDAwMCwgdGh1cworCQkgICBUX0ZBSVJfQ09FRiAvICg4ICogdm5fd2VpZ2h0X3N1bSkgd2lsbCBhbHdheXMgYmUgZ3JlYXRlcgorCQkgICB0aGFuIHplcm8gKi8KKwkJbV9mYWlyX3ZuLnZuX2NyZWRpdF9kZWx0YSA9CisJCQltYXhfdCh1MzIsICh2bl9taW5fcmF0ZSAqIChUX0ZBSVJfQ09FRiAvCisJCQkJCQkgICAoOCAqIGJwLT52bl93ZWlnaHRfc3VtKSkpLAorCQkJICAgICAgKGJwLT5jbW5nLmZhaXJfdmFycy5mYWlyX3RocmVzaG9sZCAqIDIpKTsKKwkJRFAoTkVUSUZfTVNHX0lGVVAsICJtX2ZhaXJfdm4udm5fY3JlZGl0X2RlbHRhICVkXG4iLAorCQkgICBtX2ZhaXJfdm4udm5fY3JlZGl0X2RlbHRhKTsKKwl9CisKKwkvKiBTdG9yZSBpdCB0byBpbnRlcm5hbCBtZW1vcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfdm4pLzQ7IGkrKykKKwkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkgICAgICAgWFNUT1JNX1JBVEVfU0hBUElOR19QRVJfVk5fVkFSU19PRkZTRVQoZnVuYykgKyBpICogNCwKKwkJICAgICAgICgodTMyICopKCZtX3JzX3ZuKSlbaV0pOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfdm4pLzQ7IGkrKykKKwkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkgICAgICAgWFNUT1JNX0ZBSVJORVNTX1BFUl9WTl9WQVJTX09GRlNFVChmdW5jKSArIGkgKiA0LAorCQkgICAgICAgKCh1MzIgKikoJm1fZmFpcl92bikpW2ldKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIGxpbmsgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBibngyeF9saW5rX2F0dG4oc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgcHJldl9saW5rX3N0YXR1cyA9IGJwLT5saW5rX3ZhcnMubGlua19zdGF0dXM7CisJLyogTWFrZSBzdXJlIHRoYXQgd2UgYXJlIHN5bmNlZCB3aXRoIHRoZSBjdXJyZW50IHN0YXRpc3RpY3MgKi8KKwlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOworCisJYm54MnhfbGlua191cGRhdGUoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMpOworCisJaWYgKGJwLT5saW5rX3ZhcnMubGlua191cCkgeworCisJCS8qIGRyb3BsZXNzIGZsb3cgY29udHJvbCAqLworCQlpZiAoQ0hJUF9JU19FMUgoYnApICYmIGJwLT5kcm9wbGVzc19mYykgeworCQkJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwkJCXUzMiBwYXVzZV9lbmFibGVkID0gMDsKKworCQkJaWYgKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQorCQkJCXBhdXNlX2VuYWJsZWQgPSAxOworCisJCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCisJCQkgICAgICAgVVNUT1JNX0VUSF9QQVVTRV9FTkFCTEVEX09GRlNFVChwb3J0KSwKKwkJCSAgICAgICBwYXVzZV9lbmFibGVkKTsKKwkJfQorCisJCWlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0JNQUMpIHsKKwkJCXN0cnVjdCBob3N0X3BvcnRfc3RhdHMgKnBzdGF0czsKKworCQkJcHN0YXRzID0gYm54Mnhfc3AoYnAsIHBvcnRfc3RhdHMpOworCQkJLyogcmVzZXQgb2xkIGJtYWMgc3RhdHMgKi8KKwkJCW1lbXNldCgmKHBzdGF0cy0+bWFjX3N0eFswXSksIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtYWNfc3R4KSk7CisJCX0KKwkJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKQorCQkJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9MSU5LX1VQKTsKKwl9CisKKwkvKiBpbmRpY2F0ZSBsaW5rIHN0YXR1cyBvbmx5IGlmIGxpbmsgc3RhdHVzIGFjdHVhbGx5IGNoYW5nZWQgKi8KKwlpZiAocHJldl9saW5rX3N0YXR1cyAhPSBicC0+bGlua192YXJzLmxpbmtfc3RhdHVzKQorCQlibngyeF9saW5rX3JlcG9ydChicCk7CisKKwlpZiAoSVNfRTFITUYoYnApKSB7CisJCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJCWludCBmdW5jOworCQlpbnQgdm47CisKKwkJLyogU2V0IHRoZSBhdHRlbnRpb24gdG93YXJkcyBvdGhlciBkcml2ZXJzIG9uIHRoZSBzYW1lIHBvcnQgKi8KKwkJZm9yICh2biA9IFZOXzA7IHZuIDwgRTFIVk5fTUFYOyB2bisrKSB7CisJCQlpZiAodm4gPT0gQlBfRTFIVk4oYnApKQorCQkJCWNvbnRpbnVlOworCisJCQlmdW5jID0gKCh2biA8PCAxKSB8IHBvcnQpOworCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzAgKworCQkJICAgICAgIChMSU5LX1NZTkNfQVRURU5USU9OX0JJVF9GVU5DXzAgKyBmdW5jKSo0LCAxKTsKKwkJfQorCisJCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApIHsKKwkJCWludCBpOworCisJCQkvKiBJbml0IHJhdGUgc2hhcGluZyBhbmQgZmFpcm5lc3MgY29udGV4dHMgKi8KKwkJCWJueDJ4X2luaXRfcG9ydF9taW5tYXgoYnApOworCisJCQlmb3IgKHZuID0gVk5fMDsgdm4gPCBFMUhWTl9NQVg7IHZuKyspCisJCQkJYm54MnhfaW5pdF92bl9taW5tYXgoYnAsIDIqdm4gKyBwb3J0KTsKKworCQkJLyogU3RvcmUgaXQgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisJCQlmb3IgKGkgPSAwOworCQkJICAgICBpIDwgc2l6ZW9mKHN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCkgLyA0OyBpKyspCisJCQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJCSAgWFNUT1JNX0NNTkdfUEVSX1BPUlRfVkFSU19PRkZTRVQocG9ydCkgKyBpKjQsCisJCQkJICAgICAgICgodTMyICopKCZicC0+Y21uZykpW2ldKTsKKwkJfQorCX0KK30KKwordm9pZCBibngyeF9fbGlua19zdGF0dXNfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCit7CisJaWYgKChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfT1BFTikgfHwgKGJwLT5mbGFncyAmIE1GX0ZVTkNfRElTKSkKKwkJcmV0dXJuOworCisJYm54MnhfbGlua19zdGF0dXNfdXBkYXRlKCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKKworCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApCisJCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfTElOS19VUCk7CisJZWxzZQorCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOworCisJYm54MnhfY2FsY192bl93ZWlnaHRfc3VtKGJwKTsKKworCS8qIGluZGljYXRlIGxpbmsgc3RhdHVzICovCisJYm54MnhfbGlua19yZXBvcnQoYnApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9wbWZfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwl1MzIgdmFsOworCisJYnAtPnBvcnQucG1mID0gMTsKKwlEUChORVRJRl9NU0dfTElOSywgInBtZiAlZFxuIiwgYnAtPnBvcnQucG1mKTsKKworCS8qIGVuYWJsZSBuaWcgYXR0ZW50aW9uICovCisJdmFsID0gKDB4ZmYwZiB8ICgxIDw8IChCUF9FMUhWTihicCkgKyA0KSkpOworCVJFR19XUihicCwgSENfUkVHX1RSQUlMSU5HX0VER0VfMCArIHBvcnQqOCwgdmFsKTsKKwlSRUdfV1IoYnAsIEhDX1JFR19MRUFESU5HX0VER0VfMCArIHBvcnQqOCwgdmFsKTsKKworCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfUE1GKTsKK30KKworLyogZW5kIG9mIExpbmsgKi8KKworLyogc2xvdyBwYXRoICovCisKKy8qCisgKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworLyogc2VuZCB0aGUgTUNQIGEgcmVxdWVzdCwgYmxvY2sgdW50aWwgdGhlcmUgaXMgYSByZXBseSAqLwordTMyIGJueDJ4X2Z3X2NvbW1hbmQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGNvbW1hbmQpCit7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwl1MzIgc2VxID0gKyticC0+Zndfc2VxOworCXUzMiByYyA9IDA7CisJdTMyIGNudCA9IDE7CisJdTggZGVsYXkgPSBDSElQX1JFVl9JU19TTE9XKGJwKSA/IDEwMCA6IDEwOworCisJbXV0ZXhfbG9jaygmYnAtPmZ3X21iX211dGV4KTsKKwlTSE1FTV9XUihicCwgZnVuY19tYltmdW5jXS5kcnZfbWJfaGVhZGVyLCAoY29tbWFuZCB8IHNlcSkpOworCURQKEJOWDJYX01TR19NQ1AsICJ3cm90ZSBjb21tYW5kICgleCkgdG8gRlcgTUJcbiIsIChjb21tYW5kIHwgc2VxKSk7CisKKwlkbyB7CisJCS8qIGxldCB0aGUgRlcgZG8gaXQncyBtYWdpYyAuLi4gKi8KKwkJbXNsZWVwKGRlbGF5KTsKKworCQlyYyA9IFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmZ3X21iX2hlYWRlcik7CisKKwkJLyogR2l2ZSB0aGUgRlcgdXAgdG8gNSBzZWNvbmQgKDUwMCoxMG1zKSAqLworCX0gd2hpbGUgKChzZXEgIT0gKHJjICYgRldfTVNHX1NFUV9OVU1CRVJfTUFTSykpICYmIChjbnQrKyA8IDUwMCkpOworCisJRFAoQk5YMlhfTVNHX01DUCwgIlthZnRlciAlZCBtc10gcmVhZCAoJXgpIHNlcSBpcyAoJXgpIGZyb20gRlcgTUJcbiIsCisJICAgY250KmRlbGF5LCByYywgc2VxKTsKKworCS8qIGlzIHRoaXMgYSByZXBseSB0byBvdXIgY29tbWFuZD8gKi8KKwlpZiAoc2VxID09IChyYyAmIEZXX01TR19TRVFfTlVNQkVSX01BU0spKQorCQlyYyAmPSBGV19NU0dfQ09ERV9NQVNLOworCWVsc2UgeworCQkvKiBGVyBCVUchICovCisJCUJOWDJYX0VSUigiRlcgZmFpbGVkIHRvIHJlc3BvbmQhXG4iKTsKKwkJYm54MnhfZndfZHVtcChicCk7CisJCXJjID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZicC0+ZndfbWJfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBibngyeF9lMWhfZGlzYWJsZShzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisKKwluZXRpZl90eF9kaXNhYmxlKGJwLT5kZXYpOworCisJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSDBfRlVOQ19FTiArIHBvcnQqOCwgMCk7CisKKwluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZTFoX2VuYWJsZShzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisKKwlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9GVU5DX0VOICsgcG9ydCo4LCAxKTsKKworCS8qIFR4IHF1ZXVlIHNob3VsZCBiZSBvbmx5IHJlZW5hYmxlZCAqLworCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhicC0+ZGV2KTsKKworCS8qCisJICogU2hvdWxkIG5vdCBjYWxsIG5ldGlmX2NhcnJpZXJfb24gc2luY2UgaXQgd2lsbCBiZSBjYWxsZWQgaWYgdGhlIGxpbmsKKwkgKiBpcyB1cCB3aGVuIGNoZWNraW5nIGZvciBsaW5rIHN0YXRlCisJICovCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9taW5fbWF4KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgdm4sIGk7CisKKwkvKiBJbml0IHJhdGUgc2hhcGluZyBhbmQgZmFpcm5lc3MgY29udGV4dHMgKi8KKwlibngyeF9pbml0X3BvcnRfbWlubWF4KGJwKTsKKworCWJueDJ4X2NhbGNfdm5fd2VpZ2h0X3N1bShicCk7CisKKwlmb3IgKHZuID0gVk5fMDsgdm4gPCBFMUhWTl9NQVg7IHZuKyspCisJCWJueDJ4X2luaXRfdm5fbWlubWF4KGJwLCAyKnZuICsgcG9ydCk7CisKKwlpZiAoYnAtPnBvcnQucG1mKSB7CisJCWludCBmdW5jOworCisJCS8qIFNldCB0aGUgYXR0ZW50aW9uIHRvd2FyZHMgb3RoZXIgZHJpdmVycyBvbiB0aGUgc2FtZSBwb3J0ICovCisJCWZvciAodm4gPSBWTl8wOyB2biA8IEUxSFZOX01BWDsgdm4rKykgeworCQkJaWYgKHZuID09IEJQX0UxSFZOKGJwKSkKKwkJCQljb250aW51ZTsKKworCQkJZnVuYyA9ICgodm4gPDwgMSkgfCBwb3J0KTsKKwkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8wICsKKwkJCSAgICAgICAoTElOS19TWU5DX0FUVEVOVElPTl9CSVRfRlVOQ18wICsgZnVuYykqNCwgMSk7CisJCX0KKworCQkvKiBTdG9yZSBpdCB0byBpbnRlcm5hbCBtZW1vcnkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgY21uZ19zdHJ1Y3RfcGVyX3BvcnQpIC8gNDsgaSsrKQorCQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJICAgICAgIFhTVE9STV9DTU5HX1BFUl9QT1JUX1ZBUlNfT0ZGU0VUKHBvcnQpICsgaSo0LAorCQkJICAgICAgICgodTMyICopKCZicC0+Y21uZykpW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2RjY19ldmVudChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgZGNjX2V2ZW50KQoreworCURQKEJOWDJYX01TR19NQ1AsICJkY2NfZXZlbnQgMHgleFxuIiwgZGNjX2V2ZW50KTsKKworCWlmIChkY2NfZXZlbnQgJiBEUlZfU1RBVFVTX0RDQ19ESVNBQkxFX0VOQUJMRV9QRikgeworCisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgYmVzaWRlcyB0aGUgZnVuY3Rpb24gaW5pdGlhbGl6YXRpb24KKwkJICogd2hlcmUgdGhlIGJwLT5mbGFncyBjYW4gY2hhbmdlIHNvIGl0IGlzIGRvbmUgd2l0aG91dCBhbnkKKwkJICogbG9ja3MKKwkJICovCisJCWlmIChicC0+bWZfY29uZmlnICYgRlVOQ19NRl9DRkdfRlVOQ19ESVNBQkxFRCkgeworCQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgIm1mX2NmZyBmdW5jdGlvbiBkaXNhYmxlZFxuIik7CisJCQlicC0+ZmxhZ3MgfD0gTUZfRlVOQ19ESVM7CisKKwkJCWJueDJ4X2UxaF9kaXNhYmxlKGJwKTsKKwkJfSBlbHNlIHsKKwkJCURQKE5FVElGX01TR19JRlVQLCAibWZfY2ZnIGZ1bmN0aW9uIGVuYWJsZWRcbiIpOworCQkJYnAtPmZsYWdzICY9IH5NRl9GVU5DX0RJUzsKKworCQkJYm54MnhfZTFoX2VuYWJsZShicCk7CisJCX0KKwkJZGNjX2V2ZW50ICY9IH5EUlZfU1RBVFVTX0RDQ19ESVNBQkxFX0VOQUJMRV9QRjsKKwl9CisJaWYgKGRjY19ldmVudCAmIERSVl9TVEFUVVNfRENDX0JBTkRXSURUSF9BTExPQ0FUSU9OKSB7CisKKwkJYm54MnhfdXBkYXRlX21pbl9tYXgoYnApOworCQlkY2NfZXZlbnQgJj0gfkRSVl9TVEFUVVNfRENDX0JBTkRXSURUSF9BTExPQ0FUSU9OOworCX0KKworCS8qIFJlcG9ydCByZXN1bHRzIHRvIE1DUCAqLworCWlmIChkY2NfZXZlbnQpCisJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9EQ0NfRkFJTFVSRSk7CisJZWxzZQorCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfRENDX09LKTsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgdW5kZXIgdGhlIHNwcSBsb2NrICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhfc3BlICpibngyeF9zcF9nZXRfbmV4dChzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBldGhfc3BlICpuZXh0X3NwZSA9IGJwLT5zcHFfcHJvZF9iZDsKKworCWlmIChicC0+c3BxX3Byb2RfYmQgPT0gYnAtPnNwcV9sYXN0X2JkKSB7CisJCWJwLT5zcHFfcHJvZF9iZCA9IGJwLT5zcHE7CisJCWJwLT5zcHFfcHJvZF9pZHggPSAwOworCQlEUChORVRJRl9NU0dfVElNRVIsICJlbmQgb2Ygc3BxXG4iKTsKKwl9IGVsc2UgeworCQlicC0+c3BxX3Byb2RfYmQrKzsKKwkJYnAtPnNwcV9wcm9kX2lkeCsrOworCX0KKwlyZXR1cm4gbmV4dF9zcGU7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBzcHEgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3NwX3Byb2RfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IEJEIGRhdGEgaXMgdXBkYXRlZCBiZWZvcmUgd3JpdGluZyB0aGUgcHJvZHVjZXIgKi8KKwl3bWIoKTsKKworCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX1NQUV9QUk9EX09GRlNFVChmdW5jKSwKKwkgICAgICAgYnAtPnNwcV9wcm9kX2lkeCk7CisJbW1pb3diKCk7Cit9CisKKy8qIHRoZSBzbG93IHBhdGggcXVldWUgaXMgb2RkIHNpbmNlIGNvbXBsZXRpb25zIGFycml2ZSBvbiB0aGUgZmFzdHBhdGggcmluZyAqLworaW50IGJueDJ4X3NwX3Bvc3Qoc3RydWN0IGJueDJ4ICpicCwgaW50IGNvbW1hbmQsIGludCBjaWQsCisJCQkgdTMyIGRhdGFfaGksIHUzMiBkYXRhX2xvLCBpbnQgY29tbW9uKQoreworCXN0cnVjdCBldGhfc3BlICpzcGU7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCXJldHVybiAtRUlPOworI2VuZGlmCisKKwlzcGluX2xvY2tfYmgoJmJwLT5zcHFfbG9jayk7CisKKwlpZiAoIWJwLT5zcHFfbGVmdCkgeworCQlCTlgyWF9FUlIoIkJVRyEgU1BRIHJpbmcgZnVsbCFcbiIpOworCQlzcGluX3VubG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKKwkJYm54MnhfcGFuaWMoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzcGUgPSBibngyeF9zcF9nZXRfbmV4dChicCk7CisKKwkvKiBDSUQgbmVlZHMgcG9ydCBudW1iZXIgdG8gYmUgZW5jb2RlZCBpbnQgaXQgKi8KKwlzcGUtPmhkci5jb25uX2FuZF9jbWRfZGF0YSA9CisJCQljcHVfdG9fbGUzMigoY29tbWFuZCA8PCBTUEVfSERSX0NNRF9JRF9TSElGVCkgfAorCQkJCSAgICBIV19DSUQoYnAsIGNpZCkpOworCXNwZS0+aGRyLnR5cGUgPSBjcHVfdG9fbGUxNihFVEhfQ09OTkVDVElPTl9UWVBFKTsKKwlpZiAoY29tbW9uKQorCQlzcGUtPmhkci50eXBlIHw9CisJCQljcHVfdG9fbGUxNigoMSA8PCBTUEVfSERSX0NPTU1PTl9SQU1ST0RfU0hJRlQpKTsKKworCXNwZS0+ZGF0YS5tYWNfY29uZmlnX2FkZHIuaGkgPSBjcHVfdG9fbGUzMihkYXRhX2hpKTsKKwlzcGUtPmRhdGEubWFjX2NvbmZpZ19hZGRyLmxvID0gY3B1X3RvX2xlMzIoZGF0YV9sbyk7CisKKwlicC0+c3BxX2xlZnQtLTsKKworCURQKEJOWDJYX01TR19TUC8qTkVUSUZfTVNHX1RJTUVSKi8sCisJICAgIlNQUUVbJXhdICgleDoleCkgIGNvbW1hbmQgJWQgIGh3X2NpZCAleCAgZGF0YSAoJXg6JXgpICBsZWZ0ICV4XG4iLAorCSAgIGJwLT5zcHFfcHJvZF9pZHgsICh1MzIpVTY0X0hJKGJwLT5zcHFfbWFwcGluZyksCisJICAgKHUzMikoVTY0X0xPKGJwLT5zcHFfbWFwcGluZykgKworCSAgICh2b2lkICopYnAtPnNwcV9wcm9kX2JkIC0gKHZvaWQgKilicC0+c3BxKSwgY29tbWFuZCwKKwkgICBIV19DSUQoYnAsIGNpZCksIGRhdGFfaGksIGRhdGFfbG8sIGJwLT5zcHFfbGVmdCk7CisKKwlibngyeF9zcF9wcm9kX3VwZGF0ZShicCk7CisJc3Bpbl91bmxvY2tfYmgoJmJwLT5zcHFfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGFjcXVpcmUgc3BsaXQgTUNQIGFjY2VzcyBsb2NrIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IGJueDJ4X2FjcXVpcmVfYWxyKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIGosIHZhbDsKKwlpbnQgcmMgPSAwOworCisJbWlnaHRfc2xlZXAoKTsKKwlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKSB7CisJCXZhbCA9ICgxVUwgPDwgMzEpOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUNQICsgMHg5YywgdmFsKTsKKwkJdmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX01DUCArIDB4OWMpOworCQlpZiAodmFsICYgKDFMIDw8IDMxKSkKKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKCEodmFsICYgKDFMIDw8IDMxKSkpIHsKKwkJQk5YMlhfRVJSKCJDYW5ub3QgYWNxdWlyZSBNQ1AgYWNjZXNzIGxvY2sgcmVnaXN0ZXJcbiIpOworCQlyYyA9IC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJlbGVhc2Ugc3BsaXQgTUNQIGFjY2VzcyBsb2NrIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBibngyeF9yZWxlYXNlX2FscihzdHJ1Y3QgYm54MnggKmJwKQoreworCVJFR19XUihicCwgR1JDQkFTRV9NQ1AgKyAweDljLCAwKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgYm54MnhfdXBkYXRlX2RzYl9pZHgoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrICpkZWZfc2IgPSBicC0+ZGVmX3N0YXR1c19ibGs7CisJdTE2IHJjID0gMDsKKworCWJhcnJpZXIoKTsgLyogc3RhdHVzIGJsb2NrIGlzIHdyaXR0ZW4gdG8gYnkgdGhlIGNoaXAgKi8KKwlpZiAoYnAtPmRlZl9hdHRfaWR4ICE9IGRlZl9zYi0+YXR0ZW5fc3RhdHVzX2Jsb2NrLmF0dG5fYml0c19pbmRleCkgeworCQlicC0+ZGVmX2F0dF9pZHggPSBkZWZfc2ItPmF0dGVuX3N0YXR1c19ibG9jay5hdHRuX2JpdHNfaW5kZXg7CisJCXJjIHw9IDE7CisJfQorCWlmIChicC0+ZGVmX2NfaWR4ICE9IGRlZl9zYi0+Y19kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleCkgeworCQlicC0+ZGVmX2NfaWR4ID0gZGVmX3NiLT5jX2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4OworCQlyYyB8PSAyOworCX0KKwlpZiAoYnAtPmRlZl91X2lkeCAhPSBkZWZfc2ItPnVfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpIHsKKwkJYnAtPmRlZl91X2lkeCA9IGRlZl9zYi0+dV9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleDsKKwkJcmMgfD0gNDsKKwl9CisJaWYgKGJwLT5kZWZfeF9pZHggIT0gZGVmX3NiLT54X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4KSB7CisJCWJwLT5kZWZfeF9pZHggPSBkZWZfc2ItPnhfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7CisJCXJjIHw9IDg7CisJfQorCWlmIChicC0+ZGVmX3RfaWR4ICE9IGRlZl9zYi0+dF9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleCkgeworCQlicC0+ZGVmX3RfaWR4ID0gZGVmX3NiLT50X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4OworCQlyYyB8PSAxNjsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKgorICogc2xvdyBwYXRoIHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgYm54MnhfYXR0bl9pbnRfYXNzZXJ0ZWQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFzc2VydGVkKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJdTMyIGhjX2FkZHIgPSAoSENfUkVHX0NPTU1BTkRfUkVHICsgcG9ydCozMiArCisJCSAgICAgICBDT01NQU5EX1JFR19BVFROX0JJVFNfU0VUKTsKKwl1MzIgYWV1X2FkZHIgPSBwb3J0ID8gTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzEgOgorCQkJICAgICAgTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzA7CisJdTMyIG5pZ19pbnRfbWFza19hZGRyID0gcG9ydCA/IE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDEgOgorCQkJCSAgICAgICBOSUdfUkVHX01BU0tfSU5URVJSVVBUX1BPUlQwOworCXUzMiBhZXVfbWFzazsKKwl1MzIgbmlnX21hc2sgPSAwOworCisJaWYgKGJwLT5hdHRuX3N0YXRlICYgYXNzZXJ0ZWQpCisJCUJOWDJYX0VSUigiSUdVIEVSUk9SXG4iKTsKKworCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9QT1JUMF9BVFRfTUFTSyArIHBvcnQpOworCWFldV9tYXNrID0gUkVHX1JEKGJwLCBhZXVfYWRkcik7CisKKwlEUChORVRJRl9NU0dfSFcsICJhZXVfbWFzayAleCAgbmV3bHkgYXNzZXJ0ZWQgJXhcbiIsCisJICAgYWV1X21hc2ssIGFzc2VydGVkKTsKKwlhZXVfbWFzayAmPSB+KGFzc2VydGVkICYgMHgzZmYpOworCURQKE5FVElGX01TR19IVywgIm5ldyBtYXNrICV4XG4iLCBhZXVfbWFzayk7CisKKwlSRUdfV1IoYnAsIGFldV9hZGRyLCBhZXVfbWFzayk7CisJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1BPUlQwX0FUVF9NQVNLICsgcG9ydCk7CisKKwlEUChORVRJRl9NU0dfSFcsICJhdHRuX3N0YXRlICV4XG4iLCBicC0+YXR0bl9zdGF0ZSk7CisJYnAtPmF0dG5fc3RhdGUgfD0gYXNzZXJ0ZWQ7CisJRFAoTkVUSUZfTVNHX0hXLCAibmV3IHN0YXRlICV4XG4iLCBicC0+YXR0bl9zdGF0ZSk7CisKKwlpZiAoYXNzZXJ0ZWQgJiBBVFROX0hBUkRfV0lSRURfTUFTSykgeworCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX05JR19GT1JfRlVOQykgeworCisJCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKKworCQkJLyogc2F2ZSBuaWcgaW50ZXJydXB0IG1hc2sgKi8KKwkJCW5pZ19tYXNrID0gUkVHX1JEKGJwLCBuaWdfaW50X21hc2tfYWRkcik7CisJCQlSRUdfV1IoYnAsIG5pZ19pbnRfbWFza19hZGRyLCAwKTsKKworCQkJYm54MnhfbGlua19hdHRuKGJwKTsKKworCQkJLyogaGFuZGxlIHVuaWNvcmUgYXR0bj8gKi8KKwkJfQorCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX1NXX1RJTUVSXzRfRlVOQykKKwkJCURQKE5FVElGX01TR19IVywgIkFUVE5fU1dfVElNRVJfNF9GVU5DIVxuIik7CisKKwkJaWYgKGFzc2VydGVkICYgR1BJT18yX0ZVTkMpCisJCQlEUChORVRJRl9NU0dfSFcsICJHUElPXzJfRlVOQyFcbiIpOworCisJCWlmIChhc3NlcnRlZCAmIEdQSU9fM19GVU5DKQorCQkJRFAoTkVUSUZfTVNHX0hXLCAiR1BJT18zX0ZVTkMhXG4iKTsKKworCQlpZiAoYXNzZXJ0ZWQgJiBHUElPXzRfRlVOQykKKwkJCURQKE5FVElGX01TR19IVywgIkdQSU9fNF9GVU5DIVxuIik7CisKKwkJaWYgKHBvcnQgPT0gMCkgeworCQkJaWYgKGFzc2VydGVkICYgQVRUTl9HRU5FUkFMX0FUVE5fMSkgeworCQkJCURQKE5FVElGX01TR19IVywgIkFUVE5fR0VORVJBTF9BVFROXzEhXG4iKTsKKwkJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMSwgMHgwKTsKKwkJCX0KKwkJCWlmIChhc3NlcnRlZCAmIEFUVE5fR0VORVJBTF9BVFROXzIpIHsKKwkJCQlEUChORVRJRl9NU0dfSFcsICJBVFROX0dFTkVSQUxfQVRUTl8yIVxuIik7CisJCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzIsIDB4MCk7CisJCQl9CisJCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX0dFTkVSQUxfQVRUTl8zKSB7CisJCQkJRFAoTkVUSUZfTVNHX0hXLCAiQVRUTl9HRU5FUkFMX0FUVE5fMyFcbiIpOworCQkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8zLCAweDApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGFzc2VydGVkICYgQVRUTl9HRU5FUkFMX0FUVE5fNCkgeworCQkJCURQKE5FVElGX01TR19IVywgIkFUVE5fR0VORVJBTF9BVFROXzQhXG4iKTsKKwkJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fNCwgMHgwKTsKKwkJCX0KKwkJCWlmIChhc3NlcnRlZCAmIEFUVE5fR0VORVJBTF9BVFROXzUpIHsKKwkJCQlEUChORVRJRl9NU0dfSFcsICJBVFROX0dFTkVSQUxfQVRUTl81IVxuIik7CisJCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzUsIDB4MCk7CisJCQl9CisJCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX0dFTkVSQUxfQVRUTl82KSB7CisJCQkJRFAoTkVUSUZfTVNHX0hXLCAiQVRUTl9HRU5FUkFMX0FUVE5fNiFcbiIpOworCQkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl82LCAweDApOworCQkJfQorCQl9CisKKwl9IC8qIGlmIGhhcmR3aXJlZCAqLworCisJRFAoTkVUSUZfTVNHX0hXLCAiYWJvdXQgdG8gbWFzayAweCUwOHggYXQgSEMgYWRkciAweCV4XG4iLAorCSAgIGFzc2VydGVkLCBoY19hZGRyKTsKKwlSRUdfV1IoYnAsIGhjX2FkZHIsIGFzc2VydGVkKTsKKworCS8qIG5vdyBzZXQgYmFjayB0aGUgbWFzayAqLworCWlmIChhc3NlcnRlZCAmIEFUVE5fTklHX0ZPUl9GVU5DKSB7CisJCVJFR19XUihicCwgbmlnX2ludF9tYXNrX2FkZHIsIG5pZ19tYXNrKTsKKwkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZmFuX2ZhaWx1cmUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCisJLyogbWFyayB0aGUgZmFpbHVyZSAqLworCWJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyAmPSB+UE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTUFTSzsKKwlicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcgfD0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRTsKKwlTSE1FTV9XUihicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uZXh0ZXJuYWxfcGh5X2NvbmZpZywKKwkJIGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7CisKKwkvKiBsb2cgdGhlIGZhaWx1cmUgKi8KKwluZXRkZXZfZXJyKGJwLT5kZXYsICJGYW4gRmFpbHVyZSBvbiBOZXR3b3JrIENvbnRyb2xsZXIgaGFzIGNhdXNlZCIKKwkgICAgICAgIiB0aGUgZHJpdmVyIHRvIHNodXRkb3duIHRoZSBjYXJkIHRvIHByZXZlbnQgcGVybWFuZW50IgorCSAgICAgICAiIGRhbWFnZS4gIFBsZWFzZSBjb250YWN0IE9FTSBTdXBwb3J0IGZvciBhc3Npc3RhbmNlXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQwKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhdHRuKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IHJlZ19vZmZzZXQ7CisJdTMyIHZhbCwgc3dhcF92YWwsIHN3YXBfb3ZlcnJpZGU7CisKKwlyZWdfb2Zmc2V0ID0gKHBvcnQgPyBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzFfT1VUXzAgOgorCQkJICAgICBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzBfT1VUXzApOworCisJaWYgKGF0dG4gJiBBRVVfSU5QVVRTX0FUVE5fQklUU19TUElPNSkgeworCisJCXZhbCA9IFJFR19SRChicCwgcmVnX29mZnNldCk7CisJCXZhbCAmPSB+QUVVX0lOUFVUU19BVFROX0JJVFNfU1BJTzU7CisJCVJFR19XUihicCwgcmVnX29mZnNldCwgdmFsKTsKKworCQlCTlgyWF9FUlIoIlNQSU81IGh3IGF0dGVudGlvblxuIik7CisKKwkJLyogRmFuIGZhaWx1cmUgYXR0ZW50aW9uICovCisJCXN3aXRjaCAoWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6CisJCQkvKiBMb3cgcG93ZXIgbW9kZSBpcyBjb250cm9sbGVkIGJ5IEdQSU8gMiAqLworCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKKwkJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XLCBwb3J0KTsKKwkJCS8qIFRoZSBQSFkgcmVzZXQgaXMgY29udHJvbGxlZCBieSBHUElPIDEgKi8KKwkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzEsCisJCQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywgcG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJCQkvKiBUaGUgUEhZIHJlc2V0IGlzIGNvbnRyb2xsZWQgYnkgR1BJTyAxICovCisJCQkvKiBmYWtlIHRoZSBwb3J0IG51bWJlciB0byBjYW5jZWwgdGhlIHN3YXAgZG9uZSBpbgorCQkJICAgc2V0X2dwaW8oKSAqLworCQkJc3dhcF92YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKTsKKwkJCXN3YXBfb3ZlcnJpZGUgPSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpOworCQkJcG9ydCA9IChzd2FwX3ZhbCAmJiBzd2FwX292ZXJyaWRlKSBeIDE7CisJCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18xLAorCQkJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1csIHBvcnQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJueDJ4X2Zhbl9mYWlsdXJlKGJwKTsKKwl9CisKKwlpZiAoYXR0biAmIChBRVVfSU5QVVRTX0FUVE5fQklUU19HUElPM19GVU5DVElPTl8wIHwKKwkJICAgIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzEpKSB7CisJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCQlibngyeF9oYW5kbGVfbW9kdWxlX2RldGVjdF9pbnQoJmJwLT5saW5rX3BhcmFtcyk7CisJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCX0KKworCWlmIChhdHRuICYgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8wKSB7CisKKwkJdmFsID0gUkVHX1JEKGJwLCByZWdfb2Zmc2V0KTsKKwkJdmFsICY9IH4oYXR0biAmIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMCk7CisJCVJFR19XUihicCwgcmVnX29mZnNldCwgdmFsKTsKKworCQlCTlgyWF9FUlIoIkZBVEFMIEhXIGJsb2NrIGF0dGVudGlvbiBzZXQwIDB4JXhcbiIsCisJCQkgICh1MzIpKGF0dG4gJiBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzApKTsKKwkJYm54MnhfcGFuaWMoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYXR0bikKK3sKKwl1MzIgdmFsOworCisJaWYgKGF0dG4gJiBBRVVfSU5QVVRTX0FUVE5fQklUU19ET09SQkVMTFFfSFdfSU5URVJSVVBUKSB7CisKKwkJdmFsID0gUkVHX1JEKGJwLCBET1JRX1JFR19ET1JRX0lOVF9TVFNfQ0xSKTsKKwkJQk5YMlhfRVJSKCJEQiBodyBhdHRlbnRpb24gMHgleFxuIiwgdmFsKTsKKwkJLyogRE9SUSBkaXNjYXJkIGF0dGVudGlvbiAqLworCQlpZiAodmFsICYgMHgyKQorCQkJQk5YMlhfRVJSKCJGQVRBTCBlcnJvciBmcm9tIERPUlFcbiIpOworCX0KKworCWlmIChhdHRuICYgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8xKSB7CisKKwkJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwkJaW50IHJlZ19vZmZzZXQ7CisKKwkJcmVnX29mZnNldCA9IChwb3J0ID8gTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18xX09VVF8xIDoKKwkJCQkgICAgIE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMSk7CisKKwkJdmFsID0gUkVHX1JEKGJwLCByZWdfb2Zmc2V0KTsKKwkJdmFsICY9IH4oYXR0biAmIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMSk7CisJCVJFR19XUihicCwgcmVnX29mZnNldCwgdmFsKTsKKworCQlCTlgyWF9FUlIoIkZBVEFMIEhXIGJsb2NrIGF0dGVudGlvbiBzZXQxIDB4JXhcbiIsCisJCQkgICh1MzIpKGF0dG4gJiBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzEpKTsKKwkJYm54MnhfcGFuaWMoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYXR0bikKK3sKKwl1MzIgdmFsOworCisJaWYgKGF0dG4gJiBBRVVfSU5QVVRTX0FUVE5fQklUU19DRkNfSFdfSU5URVJSVVBUKSB7CisKKwkJdmFsID0gUkVHX1JEKGJwLCBDRkNfUkVHX0NGQ19JTlRfU1RTX0NMUik7CisJCUJOWDJYX0VSUigiQ0ZDIGh3IGF0dGVudGlvbiAweCV4XG4iLCB2YWwpOworCQkvKiBDRkMgZXJyb3IgYXR0ZW50aW9uICovCisJCWlmICh2YWwgJiAweDIpCisJCQlCTlgyWF9FUlIoIkZBVEFMIGVycm9yIGZyb20gQ0ZDXG4iKTsKKwl9CisKKwlpZiAoYXR0biAmIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BYUF9IV19JTlRFUlJVUFQpIHsKKworCQl2YWwgPSBSRUdfUkQoYnAsIFBYUF9SRUdfUFhQX0lOVF9TVFNfQ0xSXzApOworCQlCTlgyWF9FUlIoIlBYUCBodyBhdHRlbnRpb24gMHgleFxuIiwgdmFsKTsKKwkJLyogUlFfVVNETURQX0ZJRk9fT1ZFUkZMT1cgKi8KKwkJaWYgKHZhbCAmIDB4MTgwMDApCisJCQlCTlgyWF9FUlIoIkZBVEFMIGVycm9yIGZyb20gUFhQXG4iKTsKKwl9CisKKwlpZiAoYXR0biAmIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMikgeworCisJCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJCWludCByZWdfb2Zmc2V0OworCisJCXJlZ19vZmZzZXQgPSAocG9ydCA/IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMV9PVVRfMiA6CisJCQkJICAgICBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzBfT1VUXzIpOworCisJCXZhbCA9IFJFR19SRChicCwgcmVnX29mZnNldCk7CisJCXZhbCAmPSB+KGF0dG4gJiBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzIpOworCQlSRUdfV1IoYnAsIHJlZ19vZmZzZXQsIHZhbCk7CisKKwkJQk5YMlhfRVJSKCJGQVRBTCBIVyBibG9jayBhdHRlbnRpb24gc2V0MiAweCV4XG4iLAorCQkJICAodTMyKShhdHRuICYgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8yKSk7CisJCWJueDJ4X3BhbmljKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfYXR0bl9pbnRfZGVhc3NlcnRlZDMoc3RydWN0IGJueDJ4ICpicCwgdTMyIGF0dG4pCit7CisJdTMyIHZhbDsKKworCWlmIChhdHRuICYgRVZFUkVTVF9HRU5fQVRUTl9JTl9VU0VfTUFTSykgeworCisJCWlmIChhdHRuICYgQk5YMlhfUE1GX0xJTktfQVNTRVJUKSB7CisJCQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCisJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMTIgKyBmdW5jKjQsIDApOworCQkJYnAtPm1mX2NvbmZpZyA9IFNITUVNX1JEKGJwLAorCQkJCQkgICBtZl9jZmcuZnVuY19tZl9jb25maWdbZnVuY10uY29uZmlnKTsKKwkJCXZhbCA9IFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmRydl9zdGF0dXMpOworCQkJaWYgKHZhbCAmIERSVl9TVEFUVVNfRENDX0VWRU5UX01BU0spCisJCQkJYm54MnhfZGNjX2V2ZW50KGJwLAorCQkJCQkgICAgKHZhbCAmIERSVl9TVEFUVVNfRENDX0VWRU5UX01BU0spKTsKKwkJCWJueDJ4X19saW5rX3N0YXR1c191cGRhdGUoYnApOworCQkJaWYgKChicC0+cG9ydC5wbWYgPT0gMCkgJiYgKHZhbCAmIERSVl9TVEFUVVNfUE1GKSkKKwkJCQlibngyeF9wbWZfdXBkYXRlKGJwKTsKKworCQl9IGVsc2UgaWYgKGF0dG4gJiBCTlgyWF9NQ19BU1NFUlRfQklUUykgeworCisJCQlCTlgyWF9FUlIoIk1DIGFzc2VydCFcbiIpOworCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzEwLCAwKTsKKwkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl85LCAwKTsKKwkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl84LCAwKTsKKwkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl83LCAwKTsKKwkJCWJueDJ4X3BhbmljKCk7CisKKwkJfSBlbHNlIGlmIChhdHRuICYgQk5YMlhfTUNQX0FTU0VSVCkgeworCisJCQlCTlgyWF9FUlIoIk1DUCBhc3NlcnQhXG4iKTsKKwkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8xMSwgMCk7CisJCQlibngyeF9md19kdW1wKGJwKTsKKworCQl9IGVsc2UKKwkJCUJOWDJYX0VSUigiVW5rbm93biBIVyBhc3NlcnQhIChhdHRuIDB4JXgpXG4iLCBhdHRuKTsKKwl9CisKKwlpZiAoYXR0biAmIEVWRVJFU1RfTEFUQ0hFRF9BVFROX0lOX1VTRV9NQVNLKSB7CisJCUJOWDJYX0VSUigiTEFUQ0hFRCBhdHRlbnRpb24gMHglMDh4IChtYXNrZWQpXG4iLCBhdHRuKTsKKwkJaWYgKGF0dG4gJiBCTlgyWF9HUkNfVElNRU9VVCkgeworCQkJdmFsID0gQ0hJUF9JU19FMUgoYnApID8KKwkJCQlSRUdfUkQoYnAsIE1JU0NfUkVHX0dSQ19USU1FT1VUX0FUVE4pIDogMDsKKwkJCUJOWDJYX0VSUigiR1JDIHRpbWUtb3V0IDB4JTA4eFxuIiwgdmFsKTsKKwkJfQorCQlpZiAoYXR0biAmIEJOWDJYX0dSQ19SU1YpIHsKKwkJCXZhbCA9IENISVBfSVNfRTFIKGJwKSA/CisJCQkJUkVHX1JEKGJwLCBNSVNDX1JFR19HUkNfUlNWX0FUVE4pIDogMDsKKwkJCUJOWDJYX0VSUigiR1JDIHJlc2VydmVkIDB4JTA4eFxuIiwgdmFsKTsKKwkJfQorCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9DTFJfTEFUQ0hfU0lHTkFMLCAweDdmZik7CisJfQorfQorCisjZGVmaW5lIEJOWDJYX01JU0NfR0VOX1JFRyAgICAgIE1JU0NfUkVHX0dFTkVSSUNfUE9SXzEKKyNkZWZpbmUgTE9BRF9DT1VOVEVSX0JJVFMJMTYgLyogTnVtYmVyIG9mIGJpdHMgZm9yIGxvYWQgY291bnRlciAqLworI2RlZmluZSBMT0FEX0NPVU5URVJfTUFTSwkoKCh1MzIpMHgxIDw8IExPQURfQ09VTlRFUl9CSVRTKSAtIDEpCisjZGVmaW5lIFJFU0VUX0RPTkVfRkxBR19NQVNLCSh+TE9BRF9DT1VOVEVSX01BU0spCisjZGVmaW5lIFJFU0VUX0RPTkVfRkxBR19TSElGVAlMT0FEX0NPVU5URVJfQklUUworI2RlZmluZSBDSElQX1BBUklUWV9TVVBQT1JURUQoYnApICAgKENISVBfSVNfRTEoYnApIHx8IENISVBfSVNfRTFIKGJwKSkKKy8qCisgKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3Jlc2V0X2RvbmUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpOworCXZhbCAmPSB+KDEgPDwgUkVTRVRfRE9ORV9GTEFHX1NISUZUKTsKKwlSRUdfV1IoYnAsIEJOWDJYX01JU0NfR0VOX1JFRywgdmFsKTsKKwliYXJyaWVyKCk7CisJbW1pb3diKCk7Cit9CisKKy8qCisgKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbAk9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKKwl2YWwgfD0gKDEgPDwgMTYpOworCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCB2YWwpOworCWJhcnJpZXIoKTsKKwltbWlvd2IoKTsKK30KKworLyoKKyAqIHNob3VsZCBiZSBydW4gdW5kZXIgcnRubCBsb2NrCisgKi8KK2Jvb2wgYm54MnhfcmVzZXRfaXNfZG9uZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWwJPSBSRUdfUkQoYnAsIEJOWDJYX01JU0NfR0VOX1JFRyk7CisJRFAoTkVUSUZfTVNHX0hXLCAiR0VOX1JFR19WQUw9MHglMDh4XG4iLCB2YWwpOworCXJldHVybiAodmFsICYgUkVTRVRfRE9ORV9GTEFHX01BU0spID8gZmFsc2UgOiB0cnVlOworfQorCisvKgorICogc2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKKyAqLworaW5saW5lIHZvaWQgYm54MnhfaW5jX2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbDEsIHZhbCA9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKKworCURQKE5FVElGX01TR19IVywgIk9sZCBHRU5fUkVHX1ZBTD0weCUwOHhcbiIsIHZhbCk7CisKKwl2YWwxID0gKCh2YWwgJiBMT0FEX0NPVU5URVJfTUFTSykgKyAxKSAmIExPQURfQ09VTlRFUl9NQVNLOworCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCAodmFsICYgUkVTRVRfRE9ORV9GTEFHX01BU0spIHwgdmFsMSk7CisJYmFycmllcigpOworCW1taW93YigpOworfQorCisvKgorICogc2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKKyAqLwordTMyIGJueDJ4X2RlY19sb2FkX2NudChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWwxLCB2YWwgPSBSRUdfUkQoYnAsIEJOWDJYX01JU0NfR0VOX1JFRyk7CisKKwlEUChORVRJRl9NU0dfSFcsICJPbGQgR0VOX1JFR19WQUw9MHglMDh4XG4iLCB2YWwpOworCisJdmFsMSA9ICgodmFsICYgTE9BRF9DT1VOVEVSX01BU0spIC0gMSkgJiBMT0FEX0NPVU5URVJfTUFTSzsKKwlSRUdfV1IoYnAsIEJOWDJYX01JU0NfR0VOX1JFRywgKHZhbCAmIFJFU0VUX0RPTkVfRkxBR19NQVNLKSB8IHZhbDEpOworCWJhcnJpZXIoKTsKKwltbWlvd2IoKTsKKworCXJldHVybiB2YWwxOworfQorCisvKgorICogc2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKKyAqLworc3RhdGljIGlubGluZSB1MzIgYm54MnhfZ2V0X2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApCit7CisJcmV0dXJuIFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKSAmIExPQURfQ09VTlRFUl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfY2xlYXJfbG9hZF9jbnQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsID0gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpOworCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCB2YWwgJiAofkxPQURfQ09VTlRFUl9NQVNLKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfcHJpbnRfbmV4dF9ibG9jayhpbnQgaWR4LCBjb25zdCBjaGFyICpibGspCit7CisJaWYgKGlkeCkKKwkJcHJfY29udCgiLCAiKTsKKwlwcl9jb250KCIlcyIsIGJsayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTAodTMyIHNpZywgaW50IHBhcl9udW0pCit7CisJaW50IGkgPSAwOworCXUzMiBjdXJfYml0ID0gMDsKKwlmb3IgKGkgPSAwOyBzaWc7IGkrKykgeworCQljdXJfYml0ID0gKCh1MzIpMHgxIDw8IGkpOworCQlpZiAoc2lnICYgY3VyX2JpdCkgeworCQkJc3dpdGNoIChjdXJfYml0KSB7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0JSQl9QQVJJVFlfRVJST1I6CisJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiQlJCIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BBUlNFUl9QQVJJVFlfRVJST1I6CisJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiUEFSU0VSIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRE1fUEFSSVRZX0VSUk9SOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlRTRE0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfU0VBUkNIRVJfUEFSSVRZX0VSUk9SOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlNFQVJDSEVSIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRU1JX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJUU0VNSSIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDbGVhciB0aGUgYml0ICovCisJCQlzaWcgJj0gfmN1cl9iaXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcGFyX251bTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MSh1MzIgc2lnLCBpbnQgcGFyX251bSkKK3sKKwlpbnQgaSA9IDA7CisJdTMyIGN1cl9iaXQgPSAwOworCWZvciAoaSA9IDA7IHNpZzsgaSsrKSB7CisJCWN1cl9iaXQgPSAoKHUzMikweDEgPDwgaSk7CisJCWlmIChzaWcgJiBjdXJfYml0KSB7CisJCQlzd2l0Y2ggKGN1cl9iaXQpIHsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfUEJDTElFTlRfUEFSSVRZX0VSUk9SOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlBCQ0xJRU5UIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1FNX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJRTSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0RNX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJYU0RNIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRU1JX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJYU0VNSSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19ET09SQkVMTFFfUEFSSVRZX0VSUk9SOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkRPT1JCRUxMUSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19WQVVYX1BDSV9DT1JFX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJWQVVYIFBDSSBDT1JFIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RFQlVHX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJERUJVRyIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0RNX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJVU0RNIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRU1JX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJVU0VNSSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VUEJfUEFSSVRZX0VSUk9SOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlVQQiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DU0RNX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJDU0RNIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIENsZWFyIHRoZSBiaXQgKi8KKwkJCXNpZyAmPSB+Y3VyX2JpdDsKKwkJfQorCX0KKworCXJldHVybiBwYXJfbnVtOworfQorCitzdGF0aWMgaW5saW5lIGludCBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkyKHUzMiBzaWcsIGludCBwYXJfbnVtKQoreworCWludCBpID0gMDsKKwl1MzIgY3VyX2JpdCA9IDA7CisJZm9yIChpID0gMDsgc2lnOyBpKyspIHsKKwkJY3VyX2JpdCA9ICgodTMyKTB4MSA8PCBpKTsKKwkJaWYgKHNpZyAmIGN1cl9iaXQpIHsKKwkJCXN3aXRjaCAoY3VyX2JpdCkgeworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DU0VNSV9QQVJJVFlfRVJST1I6CisJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiQ1NFTUkiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJQWFAiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9QQVJJVFlfRVJST1I6CisJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLAorCQkJCQkiUFhQUENJQ0xPQ0tDTElFTlQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0ZDX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJDRkMiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0RVX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJDRFUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfSUdVX1BBUklUWV9FUlJPUjoKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJJR1UiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUlTQ19QQVJJVFlfRVJST1I6CisJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUlTQyIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDbGVhciB0aGUgYml0ICovCisJCQlzaWcgJj0gfmN1cl9iaXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcGFyX251bTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5Myh1MzIgc2lnLCBpbnQgcGFyX251bSkKK3sKKwlpbnQgaSA9IDA7CisJdTMyIGN1cl9iaXQgPSAwOworCWZvciAoaSA9IDA7IHNpZzsgaSsrKSB7CisJCWN1cl9iaXQgPSAoKHUzMikweDEgPDwgaSk7CisJCWlmIChzaWcgJiBjdXJfYml0KSB7CisJCQlzd2l0Y2ggKGN1cl9iaXQpIHsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfUk9NX1BBUklUWToKKwkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJNQ1AgUk9NIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1VNUF9SWF9QQVJJVFk6CisJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUNQIFVNUCBSWCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9VTVBfVFhfUEFSSVRZOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIk1DUCBVTVAgVFgiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfU0NQQURfUEFSSVRZOgorCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIk1DUCBTQ1BBRCIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDbGVhciB0aGUgYml0ICovCisJCQlzaWcgJj0gfmN1cl9iaXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcGFyX251bTsKK30KKworc3RhdGljIGlubGluZSBib29sIGJueDJ4X3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaWcwLCB1MzIgc2lnMSwKKwkJCQkgICAgIHUzMiBzaWcyLCB1MzIgc2lnMykKK3sKKwlpZiAoKHNpZzAgJiBIV19QUlRZX0FTU0VSVF9TRVRfMCkgfHwgKHNpZzEgJiBIV19QUlRZX0FTU0VSVF9TRVRfMSkgfHwKKwkgICAgKHNpZzIgJiBIV19QUlRZX0FTU0VSVF9TRVRfMikgfHwgKHNpZzMgJiBIV19QUlRZX0FTU0VSVF9TRVRfMykpIHsKKwkJaW50IHBhcl9udW0gPSAwOworCQlEUChORVRJRl9NU0dfSFcsICJXYXMgcGFyaXR5IGVycm9yOiBIVyBibG9jayBwYXJpdHkgYXR0ZW50aW9uOiAiCisJCQkiWzBdOjB4JTA4eCBbMV06MHglMDh4ICIKKwkJCSJbMl06MHglMDh4IFszXToweCUwOHhcbiIsCisJCQkgIHNpZzAgJiBIV19QUlRZX0FTU0VSVF9TRVRfMCwKKwkJCSAgc2lnMSAmIEhXX1BSVFlfQVNTRVJUX1NFVF8xLAorCQkJICBzaWcyICYgSFdfUFJUWV9BU1NFUlRfU0VUXzIsCisJCQkgIHNpZzMgJiBIV19QUlRZX0FTU0VSVF9TRVRfMyk7CisJCXByaW50ayhLRVJOX0VSUiIlczogUGFyaXR5IGVycm9ycyBkZXRlY3RlZCBpbiBibG9ja3M6ICIsCisJCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKKwkJcGFyX251bSA9IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTAoCisJCQlzaWcwICYgSFdfUFJUWV9BU1NFUlRfU0VUXzAsIHBhcl9udW0pOworCQlwYXJfbnVtID0gYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MSgKKwkJCXNpZzEgJiBIV19QUlRZX0FTU0VSVF9TRVRfMSwgcGFyX251bSk7CisJCXBhcl9udW0gPSBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkyKAorCQkJc2lnMiAmIEhXX1BSVFlfQVNTRVJUX1NFVF8yLCBwYXJfbnVtKTsKKwkJcGFyX251bSA9IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTMoCisJCQlzaWczICYgSFdfUFJUWV9BU1NFUlRfU0VUXzMsIHBhcl9udW0pOworCQlwcmludGsoIlxuIik7CisJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgYm54MnhfY2hrX3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IGF0dG5fcm91dGUgYXR0bjsKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCisJYXR0bi5zaWdbMF0gPSBSRUdfUkQoYnAsCisJCU1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfMV9GVU5DXzAgKworCQkJICAgICBwb3J0KjQpOworCWF0dG4uc2lnWzFdID0gUkVHX1JEKGJwLAorCQlNSVNDX1JFR19BRVVfQUZURVJfSU5WRVJUXzJfRlVOQ18wICsKKwkJCSAgICAgcG9ydCo0KTsKKwlhdHRuLnNpZ1syXSA9IFJFR19SRChicCwKKwkJTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF8zX0ZVTkNfMCArCisJCQkgICAgIHBvcnQqNCk7CisJYXR0bi5zaWdbM10gPSBSRUdfUkQoYnAsCisJCU1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfNF9GVU5DXzAgKworCQkJICAgICBwb3J0KjQpOworCisJcmV0dXJuIGJueDJ4X3Bhcml0eV9hdHRuKGJwLCBhdHRuLnNpZ1swXSwgYXR0bi5zaWdbMV0sIGF0dG4uc2lnWzJdLAorCQkJCQlhdHRuLnNpZ1szXSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGRlYXNzZXJ0ZWQpCit7CisJc3RydWN0IGF0dG5fcm91dGUgYXR0biwgKmdyb3VwX21hc2s7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgaW5kZXg7CisJdTMyIHJlZ19hZGRyOworCXUzMiB2YWw7CisJdTMyIGFldV9tYXNrOworCisJLyogbmVlZCB0byB0YWtlIEhXIGxvY2sgYmVjYXVzZSBNQ1Agb3Igb3RoZXIgcG9ydCBtaWdodCBhbHNvCisJICAgdHJ5IHRvIGhhbmRsZSB0aGlzIGV2ZW50ICovCisJYm54MnhfYWNxdWlyZV9hbHIoYnApOworCisJaWYgKGJueDJ4X2Noa19wYXJpdHlfYXR0bihicCkpIHsKKwkJYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfSU5JVDsKKwkJYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKGJwKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cmVzZXRfdGFzaywgMCk7CisJCS8qIERpc2FibGUgSFcgaW50ZXJydXB0cyAqLworCQlibngyeF9pbnRfZGlzYWJsZShicCk7CisJCWJueDJ4X3JlbGVhc2VfYWxyKGJwKTsKKwkJLyogSW4gY2FzZSBvZiBwYXJpdHkgZXJyb3JzIGRvbid0IGhhbmRsZSBhdHRlbnRpb25zIHNvIHRoYXQKKwkJICogb3RoZXIgZnVuY3Rpb24gd291bGQgInNlZSIgcGFyaXR5IGVycm9ycy4KKwkJICovCisJCXJldHVybjsKKwl9CisKKwlhdHRuLnNpZ1swXSA9IFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF8xX0ZVTkNfMCArIHBvcnQqNCk7CisJYXR0bi5zaWdbMV0gPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfMl9GVU5DXzAgKyBwb3J0KjQpOworCWF0dG4uc2lnWzJdID0gUkVHX1JEKGJwLCBNSVNDX1JFR19BRVVfQUZURVJfSU5WRVJUXzNfRlVOQ18wICsgcG9ydCo0KTsKKwlhdHRuLnNpZ1szXSA9IFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF80X0ZVTkNfMCArIHBvcnQqNCk7CisJRFAoTkVUSUZfTVNHX0hXLCAiYXR0bjogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkgICBhdHRuLnNpZ1swXSwgYXR0bi5zaWdbMV0sIGF0dG4uc2lnWzJdLCBhdHRuLnNpZ1szXSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfRFlOQU1JQ19BVFROX0dSUFM7IGluZGV4KyspIHsKKwkJaWYgKGRlYXNzZXJ0ZWQgJiAoMSA8PCBpbmRleCkpIHsKKwkJCWdyb3VwX21hc2sgPSAmYnAtPmF0dG5fZ3JvdXBbaW5kZXhdOworCisJCQlEUChORVRJRl9NU0dfSFcsICJncm91cFslZF06ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkgICBpbmRleCwgZ3JvdXBfbWFzay0+c2lnWzBdLCBncm91cF9tYXNrLT5zaWdbMV0sCisJCQkgICBncm91cF9tYXNrLT5zaWdbMl0sIGdyb3VwX21hc2stPnNpZ1szXSk7CisKKwkJCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQzKGJwLAorCQkJCQlhdHRuLnNpZ1szXSAmIGdyb3VwX21hc2stPnNpZ1szXSk7CisJCQlibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMShicCwKKwkJCQkJYXR0bi5zaWdbMV0gJiBncm91cF9tYXNrLT5zaWdbMV0pOworCQkJYm54MnhfYXR0bl9pbnRfZGVhc3NlcnRlZDIoYnAsCisJCQkJCWF0dG4uc2lnWzJdICYgZ3JvdXBfbWFzay0+c2lnWzJdKTsKKwkJCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQwKGJwLAorCQkJCQlhdHRuLnNpZ1swXSAmIGdyb3VwX21hc2stPnNpZ1swXSk7CisJCX0KKwl9CisKKwlibngyeF9yZWxlYXNlX2FscihicCk7CisKKwlyZWdfYWRkciA9IChIQ19SRUdfQ09NTUFORF9SRUcgKyBwb3J0KjMyICsgQ09NTUFORF9SRUdfQVRUTl9CSVRTX0NMUik7CisKKwl2YWwgPSB+ZGVhc3NlcnRlZDsKKwlEUChORVRJRl9NU0dfSFcsICJhYm91dCB0byBtYXNrIDB4JTA4eCBhdCBIQyBhZGRyIDB4JXhcbiIsCisJICAgdmFsLCByZWdfYWRkcik7CisJUkVHX1dSKGJwLCByZWdfYWRkciwgdmFsKTsKKworCWlmICh+YnAtPmF0dG5fc3RhdGUgJiBkZWFzc2VydGVkKQorCQlCTlgyWF9FUlIoIklHVSBFUlJPUlxuIik7CisKKwlyZWdfYWRkciA9IHBvcnQgPyBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMSA6CisJCQkgIE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18wOworCisJYm54MnhfYWNxdWlyZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1BPUlQwX0FUVF9NQVNLICsgcG9ydCk7CisJYWV1X21hc2sgPSBSRUdfUkQoYnAsIHJlZ19hZGRyKTsKKworCURQKE5FVElGX01TR19IVywgImFldV9tYXNrICV4ICBuZXdseSBkZWFzc2VydGVkICV4XG4iLAorCSAgIGFldV9tYXNrLCBkZWFzc2VydGVkKTsKKwlhZXVfbWFzayB8PSAoZGVhc3NlcnRlZCAmIDB4M2ZmKTsKKwlEUChORVRJRl9NU0dfSFcsICJuZXcgbWFzayAleFxuIiwgYWV1X21hc2spOworCisJUkVHX1dSKGJwLCByZWdfYWRkciwgYWV1X21hc2spOworCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9QT1JUMF9BVFRfTUFTSyArIHBvcnQpOworCisJRFAoTkVUSUZfTVNHX0hXLCAiYXR0bl9zdGF0ZSAleFxuIiwgYnAtPmF0dG5fc3RhdGUpOworCWJwLT5hdHRuX3N0YXRlICY9IH5kZWFzc2VydGVkOworCURQKE5FVElGX01TR19IVywgIm5ldyBzdGF0ZSAleFxuIiwgYnAtPmF0dG5fc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9hdHRuX2ludChzdHJ1Y3QgYm54MnggKmJwKQoreworCS8qIHJlYWQgbG9jYWwgY29weSBvZiBiaXRzICovCisJdTMyIGF0dG5fYml0cyA9IGxlMzJfdG9fY3B1KGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLgorCQkJCQkJCQlhdHRuX2JpdHMpOworCXUzMiBhdHRuX2FjayA9IGxlMzJfdG9fY3B1KGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLgorCQkJCQkJCQlhdHRuX2JpdHNfYWNrKTsKKwl1MzIgYXR0bl9zdGF0ZSA9IGJwLT5hdHRuX3N0YXRlOworCisJLyogbG9vayBmb3IgY2hhbmdlZCBiaXRzICovCisJdTMyIGFzc2VydGVkICAgPSAgYXR0bl9iaXRzICYgfmF0dG5fYWNrICYgfmF0dG5fc3RhdGU7CisJdTMyIGRlYXNzZXJ0ZWQgPSB+YXR0bl9iaXRzICYgIGF0dG5fYWNrICYgIGF0dG5fc3RhdGU7CisKKwlEUChORVRJRl9NU0dfSFcsCisJICAgImF0dG5fYml0cyAleCAgYXR0bl9hY2sgJXggIGFzc2VydGVkICV4ICBkZWFzc2VydGVkICV4XG4iLAorCSAgIGF0dG5fYml0cywgYXR0bl9hY2ssIGFzc2VydGVkLCBkZWFzc2VydGVkKTsKKworCWlmICh+KGF0dG5fYml0cyBeIGF0dG5fYWNrKSAmIChhdHRuX2JpdHMgXiBhdHRuX3N0YXRlKSkKKwkJQk5YMlhfRVJSKCJCQUQgYXR0ZW50aW9uIHN0YXRlXG4iKTsKKworCS8qIGhhbmRsZSBiaXRzIHRoYXQgd2VyZSByYWlzZWQgKi8KKwlpZiAoYXNzZXJ0ZWQpCisJCWJueDJ4X2F0dG5faW50X2Fzc2VydGVkKGJwLCBhc3NlcnRlZCk7CisKKwlpZiAoZGVhc3NlcnRlZCkKKwkJYm54MnhfYXR0bl9pbnRfZGVhc3NlcnRlZChicCwgZGVhc3NlcnRlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueDJ4LCBzcF90YXNrLndvcmspOworCXUxNiBzdGF0dXM7CisKKwkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgKi8KKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkpIHsKKwkJRFAoTkVUSUZfTVNHX0lOVFIsICJjYWxsZWQgYnV0IGludHJfc2VtIG5vdCAwLCByZXR1cm5pbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gYm54MnhfdXBkYXRlX2RzYl9pZHgoYnApOworLyoJaWYgKHN0YXR1cyA9PSAwKQkJCQkgICAgICovCisvKgkJQk5YMlhfRVJSKCJzcHVyaW91cyBzbG93cGF0aCBpbnRlcnJ1cHQhXG4iKTsgKi8KKworCURQKE5FVElGX01TR19JTlRSLCAiZ290IGEgc2xvd3BhdGggaW50ZXJydXB0IChzdGF0dXMgMHgleClcbiIsIHN0YXR1cyk7CisKKwkvKiBIVyBhdHRlbnRpb25zICovCisJaWYgKHN0YXR1cyAmIDB4MSkgeworCQlibngyeF9hdHRuX2ludChicCk7CisJCXN0YXR1cyAmPSB+MHgxOworCX0KKworCS8qIENTdG9ybSBldmVudHM6IFNUQVRfUVVFUlkgKi8KKwlpZiAoc3RhdHVzICYgMHgyKSB7CisJCURQKEJOWDJYX01TR19TUCwgIkNTdG9ybSBldmVudHM6IFNUQVRfUVVFUllcbiIpOworCQlzdGF0dXMgJj0gfjB4MjsKKwl9CisKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJRFAoTkVUSUZfTVNHX0lOVFIsICJnb3QgYW4gdW5rbm93biBpbnRlcnJ1cHQhIChzdGF0dXMgMHgleClcbiIsCisJCSAgIHN0YXR1cyk7CisKKwlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgQVRURU5USU9OX0lELCBsZTE2X3RvX2NwdShicC0+ZGVmX2F0dF9pZHgpLAorCQkgICAgIElHVV9JTlRfTk9QLCAxKTsKKwlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgVVNUT1JNX0lELCBsZTE2X3RvX2NwdShicC0+ZGVmX3VfaWR4KSwKKwkJICAgICBJR1VfSU5UX05PUCwgMSk7CisJYm54MnhfYWNrX3NiKGJwLCBERUZfU0JfSUQsIENTVE9STV9JRCwgbGUxNl90b19jcHUoYnAtPmRlZl9jX2lkeCksCisJCSAgICAgSUdVX0lOVF9OT1AsIDEpOworCWJueDJ4X2Fja19zYihicCwgREVGX1NCX0lELCBYU1RPUk1fSUQsIGxlMTZfdG9fY3B1KGJwLT5kZWZfeF9pZHgpLAorCQkgICAgIElHVV9JTlRfTk9QLCAxKTsKKwlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgVFNUT1JNX0lELCBsZTE2X3RvX2NwdShicC0+ZGVmX3RfaWR4KSwKKwkJICAgICBJR1VfSU5UX0VOQUJMRSwgMSk7Cit9CisKK2lycXJldHVybl90IGJueDJ4X21zaXhfc3BfaW50KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogUmV0dXJuIGhlcmUgaWYgaW50ZXJydXB0IGlzIGRpc2FibGVkICovCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZicC0+aW50cl9zZW0pICE9IDApKSB7CisJCURQKE5FVElGX01TR19JTlRSLCAiY2FsbGVkIGJ1dCBpbnRyX3NlbSBub3QgMCwgcmV0dXJuaW5nXG4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWJueDJ4X2Fja19zYihicCwgREVGX1NCX0lELCBUU1RPUk1fSUQsIDAsIElHVV9JTlRfRElTQUJMRSwgMCk7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCXJldHVybiBJUlFfSEFORExFRDsKKyNlbmRpZgorCisjaWZkZWYgQkNNX0NOSUMKKwl7CisJCXN0cnVjdCBjbmljX29wcyAqY19vcHM7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQljX29wcyA9IHJjdV9kZXJlZmVyZW5jZShicC0+Y25pY19vcHMpOworCQlpZiAoY19vcHMpCisJCQljX29wcy0+Y25pY19oYW5kbGVyKGJwLT5jbmljX2RhdGEsIE5VTEwpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisjZW5kaWYKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYm54Mnhfd3EsICZicC0+c3BfdGFzaywgMCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGVuZCBvZiBzbG93IHBhdGggKi8KKworc3RhdGljIHZvaWQgYm54MnhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBibngyeCAqYnAgPSAoc3RydWN0IGJueDJ4ICopIGRhdGE7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCisJCXJldHVybjsKKworCWlmIChhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKQorCQlnb3RvIHRpbWVyX3Jlc3RhcnQ7CisKKwlpZiAocG9sbCkgeworCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFswXTsKKwkJaW50IHJjOworCisJCWJueDJ4X3R4X2ludChmcCk7CisJCXJjID0gYm54MnhfcnhfaW50KGZwLCAxMDAwKTsKKwl9CisKKwlpZiAoIUJQX05PTUNQKGJwKSkgeworCQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCQl1MzIgZHJ2X3B1bHNlOworCQl1MzIgbWNwX3B1bHNlOworCisJCSsrYnAtPmZ3X2Rydl9wdWxzZV93cl9zZXE7CisJCWJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxICY9IERSVl9QVUxTRV9TRVFfTUFTSzsKKwkJLyogVEJEIC0gYWRkIFNZU1RFTV9USU1FICovCisJCWRydl9wdWxzZSA9IGJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxOworCQlTSE1FTV9XUihicCwgZnVuY19tYltmdW5jXS5kcnZfcHVsc2VfbWIsIGRydl9wdWxzZSk7CisKKwkJbWNwX3B1bHNlID0gKFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLm1jcF9wdWxzZV9tYikgJgorCQkJICAgICBNQ1BfUFVMU0VfU0VRX01BU0spOworCQkvKiBUaGUgZGVsdGEgYmV0d2VlbiBkcml2ZXIgcHVsc2UgYW5kIG1jcCByZXNwb25zZQorCQkgKiBzaG91bGQgYmUgMSAoYmVmb3JlIG1jcCByZXNwb25zZSkgb3IgMCAoYWZ0ZXIgbWNwIHJlc3BvbnNlKQorCQkgKi8KKwkJaWYgKChkcnZfcHVsc2UgIT0gbWNwX3B1bHNlKSAmJgorCQkgICAgKGRydl9wdWxzZSAhPSAoKG1jcF9wdWxzZSArIDEpICYgTUNQX1BVTFNFX1NFUV9NQVNLKSkpIHsKKwkJCS8qIHNvbWVvbmUgbG9zdCBhIGhlYXJ0YmVhdC4uLiAqLworCQkJQk5YMlhfRVJSKCJkcnZfcHVsc2UgKDB4JXgpICE9IG1jcF9wdWxzZSAoMHgleClcbiIsCisJCQkJICBkcnZfcHVsc2UsIG1jcF9wdWxzZSk7CisJCX0KKwl9CisKKwlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pCisJCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfVVBEQVRFKTsKKwordGltZXJfcmVzdGFydDoKKwltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKK30KKworLyogZW5kIG9mIFN0YXRpc3RpY3MgKi8KKworLyogbmljIGluaXQgKi8KKworLyoKKyAqIG5pYyBpbml0IHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgYm54MnhfemVyb19zYihzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2JfaWQpCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKworCS8qICJDU1RPUk0iICovCisJYm54MnhfaW5pdF9maWxsKGJwLCBDU0VNX1JFR19GQVNUX01FTU9SWSArCisJCQlDU1RPUk1fU0JfSE9TVF9TVEFUVVNfQkxPQ0tfVV9PRkZTRVQocG9ydCwgc2JfaWQpLCAwLAorCQkJQ1NUT1JNX1NCX1NUQVRVU19CTE9DS19VX1NJWkUgLyA0KTsKKwlibngyeF9pbml0X2ZpbGwoYnAsIENTRU1fUkVHX0ZBU1RfTUVNT1JZICsKKwkJCUNTVE9STV9TQl9IT1NUX1NUQVRVU19CTE9DS19DX09GRlNFVChwb3J0LCBzYl9pZCksIDAsCisJCQlDU1RPUk1fU0JfU1RBVFVTX0JMT0NLX0NfU0laRSAvIDQpOworfQorCit2b2lkIGJueDJ4X2luaXRfc2Ioc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrICpzYiwKKwkJCSAgZG1hX2FkZHJfdCBtYXBwaW5nLCBpbnQgc2JfaWQpCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCWludCBpbmRleDsKKwl1NjQgc2VjdGlvbjsKKworCS8qIFVTVE9STSAqLworCXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X3N0YXR1c19ibG9jaywKKwkJCQkJICAgIHVfc3RhdHVzX2Jsb2NrKTsKKwlzYi0+dV9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2lkID0gc2JfaWQ7CisKKwlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJICAgICAgIENTVE9STV9TQl9IT1NUX1NCX0FERFJfVV9PRkZTRVQocG9ydCwgc2JfaWQpLCBVNjRfTE8oc2VjdGlvbikpOworCVJFR19XUihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgKChDU1RPUk1fU0JfSE9TVF9TQl9BRERSX1VfT0ZGU0VUKHBvcnQsIHNiX2lkKSkgKyA0KSwKKwkgICAgICAgVTY0X0hJKHNlY3Rpb24pKTsKKwlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBGUF9VU0JfRlVOQ19PRkYgKworCQlDU1RPUk1fU0JfSE9TVF9TVEFUVVNfQkxPQ0tfVV9PRkZTRVQocG9ydCwgc2JfaWQpLCBmdW5jKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEhDX1VTVE9STV9TQl9OVU1fSU5ESUNFUzsgaW5kZXgrKykKKwkJUkVHX1dSMTYoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJCQkgQ1NUT1JNX1NCX0hDX0RJU0FCTEVfVV9PRkZTRVQocG9ydCwgc2JfaWQsIGluZGV4KSwgMSk7CisKKwkvKiBDU1RPUk0gKi8KKwlzZWN0aW9uID0gKCh1NjQpbWFwcGluZykgKyBvZmZzZXRvZihzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2ssCisJCQkJCSAgICBjX3N0YXR1c19ibG9jayk7CisJc2ItPmNfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IHNiX2lkOworCisJUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCSAgICAgICBDU1RPUk1fU0JfSE9TVF9TQl9BRERSX0NfT0ZGU0VUKHBvcnQsIHNiX2lkKSwgVTY0X0xPKHNlY3Rpb24pKTsKKwlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJICAgICAgICgoQ1NUT1JNX1NCX0hPU1RfU0JfQUREUl9DX09GRlNFVChwb3J0LCBzYl9pZCkpICsgNCksCisJICAgICAgIFU2NF9ISShzZWN0aW9uKSk7CisJUkVHX1dSOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsgRlBfQ1NCX0ZVTkNfT0ZGICsKKwkJQ1NUT1JNX1NCX0hPU1RfU1RBVFVTX0JMT0NLX0NfT0ZGU0VUKHBvcnQsIHNiX2lkKSwgZnVuYyk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBIQ19DU1RPUk1fU0JfTlVNX0lORElDRVM7IGluZGV4KyspCisJCVJFR19XUjE2KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCQkJIENTVE9STV9TQl9IQ19ESVNBQkxFX0NfT0ZGU0VUKHBvcnQsIHNiX2lkLCBpbmRleCksIDEpOworCisJYm54MnhfYWNrX3NiKGJwLCBzYl9pZCwgQ1NUT1JNX0lELCAwLCBJR1VfSU5UX0VOQUJMRSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3plcm9fZGVmX3NiKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKworCWJueDJ4X2luaXRfZmlsbChicCwgVFNFTV9SRUdfRkFTVF9NRU1PUlkgKworCQkJVFNUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19PRkZTRVQoZnVuYyksIDAsCisJCQlzaXplb2Yoc3RydWN0IHRzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrKS80KTsKKwlibngyeF9pbml0X2ZpbGwoYnAsIENTRU1fUkVHX0ZBU1RfTUVNT1JZICsKKwkJCUNTVE9STV9ERUZfU0JfSE9TVF9TVEFUVVNfQkxPQ0tfVV9PRkZTRVQoZnVuYyksIDAsCisJCQlzaXplb2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX3UpLzQpOworCWJueDJ4X2luaXRfZmlsbChicCwgQ1NFTV9SRUdfRkFTVF9NRU1PUlkgKworCQkJQ1NUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19DX09GRlNFVChmdW5jKSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgY3N0b3JtX2RlZl9zdGF0dXNfYmxvY2tfYykvNCk7CisJYm54MnhfaW5pdF9maWxsKGJwLCBYU0VNX1JFR19GQVNUX01FTU9SWSArCisJCQlYU1RPUk1fREVGX1NCX0hPU1RfU1RBVFVTX0JMT0NLX09GRlNFVChmdW5jKSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgeHN0b3JtX2RlZl9zdGF0dXNfYmxvY2spLzQpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9pbml0X2RlZl9zYihzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICAgc3RydWN0IGhvc3RfZGVmX3N0YXR1c19ibG9jayAqZGVmX3NiLAorCQkJICAgICAgZG1hX2FkZHJfdCBtYXBwaW5nLCBpbnQgc2JfaWQpCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCWludCBpbmRleCwgdmFsLCByZWdfb2Zmc2V0OworCXU2NCBzZWN0aW9uOworCisJLyogQVRUTiAqLworCXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2ssCisJCQkJCSAgICBhdHRlbl9zdGF0dXNfYmxvY2spOworCWRlZl9zYi0+YXR0ZW5fc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IHNiX2lkOworCisJYnAtPmF0dG5fc3RhdGUgPSAwOworCisJcmVnX29mZnNldCA9IChwb3J0ID8gTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18xX09VVF8wIDoKKwkJCSAgICAgTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18wX09VVF8wKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9EWU5BTUlDX0FUVE5fR1JQUzsgaW5kZXgrKykgeworCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnWzBdID0gUkVHX1JEKGJwLAorCQkJCQkJICAgICByZWdfb2Zmc2V0ICsgMHgxMCppbmRleCk7CisJCWJwLT5hdHRuX2dyb3VwW2luZGV4XS5zaWdbMV0gPSBSRUdfUkQoYnAsCisJCQkJCSAgICAgICByZWdfb2Zmc2V0ICsgMHg0ICsgMHgxMCppbmRleCk7CisJCWJwLT5hdHRuX2dyb3VwW2luZGV4XS5zaWdbMl0gPSBSRUdfUkQoYnAsCisJCQkJCSAgICAgICByZWdfb2Zmc2V0ICsgMHg4ICsgMHgxMCppbmRleCk7CisJCWJwLT5hdHRuX2dyb3VwW2luZGV4XS5zaWdbM10gPSBSRUdfUkQoYnAsCisJCQkJCSAgICAgICByZWdfb2Zmc2V0ICsgMHhjICsgMHgxMCppbmRleCk7CisJfQorCisJcmVnX29mZnNldCA9IChwb3J0ID8gSENfUkVHX0FUVE5fTVNHMV9BRERSX0wgOgorCQkJICAgICBIQ19SRUdfQVRUTl9NU0cwX0FERFJfTCk7CisKKwlSRUdfV1IoYnAsIHJlZ19vZmZzZXQsIFU2NF9MTyhzZWN0aW9uKSk7CisJUkVHX1dSKGJwLCByZWdfb2Zmc2V0ICsgNCwgVTY0X0hJKHNlY3Rpb24pKTsKKworCXJlZ19vZmZzZXQgPSAocG9ydCA/IEhDX1JFR19BVFROX05VTV9QMSA6IEhDX1JFR19BVFROX05VTV9QMCk7CisKKwl2YWwgPSBSRUdfUkQoYnAsIHJlZ19vZmZzZXQpOworCXZhbCB8PSBzYl9pZDsKKwlSRUdfV1IoYnAsIHJlZ19vZmZzZXQsIHZhbCk7CisKKwkvKiBVU1RPUk0gKi8KKwlzZWN0aW9uID0gKCh1NjQpbWFwcGluZykgKyBvZmZzZXRvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrLAorCQkJCQkgICAgdV9kZWZfc3RhdHVzX2Jsb2NrKTsKKwlkZWZfc2ItPnVfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaWQgPSBzYl9pZDsKKworCVJFR19XUihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgQ1NUT1JNX0RFRl9TQl9IT1NUX1NCX0FERFJfVV9PRkZTRVQoZnVuYyksIFU2NF9MTyhzZWN0aW9uKSk7CisJUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCSAgICAgICAoKENTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX1VfT0ZGU0VUKGZ1bmMpKSArIDQpLAorCSAgICAgICBVNjRfSEkoc2VjdGlvbikpOworCVJFR19XUjgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArIERFRl9VU0JfRlVOQ19PRkYgKworCQlDU1RPUk1fREVGX1NCX0hPU1RfU1RBVFVTX0JMT0NLX1VfT0ZGU0VUKGZ1bmMpLCBmdW5jKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEhDX1VTVE9STV9ERUZfU0JfTlVNX0lORElDRVM7IGluZGV4KyspCisJCVJFR19XUjE2KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCQkJIENTVE9STV9ERUZfU0JfSENfRElTQUJMRV9VX09GRlNFVChmdW5jLCBpbmRleCksIDEpOworCisJLyogQ1NUT1JNICovCisJc2VjdGlvbiA9ICgodTY0KW1hcHBpbmcpICsgb2Zmc2V0b2Yoc3RydWN0IGhvc3RfZGVmX3N0YXR1c19ibG9jaywKKwkJCQkJICAgIGNfZGVmX3N0YXR1c19ibG9jayk7CisJZGVmX3NiLT5jX2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2lkID0gc2JfaWQ7CisKKwlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJICAgICAgIENTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX0NfT0ZGU0VUKGZ1bmMpLCBVNjRfTE8oc2VjdGlvbikpOworCVJFR19XUihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgKChDU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9DX09GRlNFVChmdW5jKSkgKyA0KSwKKwkgICAgICAgVTY0X0hJKHNlY3Rpb24pKTsKKwlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBERUZfQ1NCX0ZVTkNfT0ZGICsKKwkJQ1NUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19DX09GRlNFVChmdW5jKSwgZnVuYyk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBIQ19DU1RPUk1fREVGX1NCX05VTV9JTkRJQ0VTOyBpbmRleCsrKQorCQlSRUdfV1IxNihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJCSBDU1RPUk1fREVGX1NCX0hDX0RJU0FCTEVfQ19PRkZTRVQoZnVuYywgaW5kZXgpLCAxKTsKKworCS8qIFRTVE9STSAqLworCXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2ssCisJCQkJCSAgICB0X2RlZl9zdGF0dXNfYmxvY2spOworCWRlZl9zYi0+dF9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IHNiX2lkOworCisJUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKworCSAgICAgICBUU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQoZnVuYyksIFU2NF9MTyhzZWN0aW9uKSk7CisJUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKworCSAgICAgICAoKFRTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX09GRlNFVChmdW5jKSkgKyA0KSwKKwkgICAgICAgVTY0X0hJKHNlY3Rpb24pKTsKKwlSRUdfV1I4KGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKyBERUZfVFNCX0ZVTkNfT0ZGICsKKwkJVFNUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19PRkZTRVQoZnVuYyksIGZ1bmMpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSENfVFNUT1JNX0RFRl9TQl9OVU1fSU5ESUNFUzsgaW5kZXgrKykKKwkJUkVHX1dSMTYoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCQkgVFNUT1JNX0RFRl9TQl9IQ19ESVNBQkxFX09GRlNFVChmdW5jLCBpbmRleCksIDEpOworCisJLyogWFNUT1JNICovCisJc2VjdGlvbiA9ICgodTY0KW1hcHBpbmcpICsgb2Zmc2V0b2Yoc3RydWN0IGhvc3RfZGVmX3N0YXR1c19ibG9jaywKKwkJCQkJICAgIHhfZGVmX3N0YXR1c19ibG9jayk7CisJZGVmX3NiLT54X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2lkID0gc2JfaWQ7CisKKwlSRUdfV1IoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArCisJICAgICAgIFhTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX09GRlNFVChmdW5jKSwgVTY0X0xPKHNlY3Rpb24pKTsKKwlSRUdfV1IoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArCisJICAgICAgICgoWFNUT1JNX0RFRl9TQl9IT1NUX1NCX0FERFJfT0ZGU0VUKGZ1bmMpKSArIDQpLAorCSAgICAgICBVNjRfSEkoc2VjdGlvbikpOworCVJFR19XUjgoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIERFRl9YU0JfRlVOQ19PRkYgKworCQlYU1RPUk1fREVGX1NCX0hPU1RfU1RBVFVTX0JMT0NLX09GRlNFVChmdW5jKSwgZnVuYyk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBIQ19YU1RPUk1fREVGX1NCX05VTV9JTkRJQ0VTOyBpbmRleCsrKQorCQlSRUdfV1IxNihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKKwkJCSBYU1RPUk1fREVGX1NCX0hDX0RJU0FCTEVfT0ZGU0VUKGZ1bmMsIGluZGV4KSwgMSk7CisKKwlicC0+c3RhdHNfcGVuZGluZyA9IDA7CisJYnAtPnNldF9tYWNfcGVuZGluZyA9IDA7CisKKwlibngyeF9hY2tfc2IoYnAsIHNiX2lkLCBDU1RPUk1fSUQsIDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKK30KKwordm9pZCBibngyeF91cGRhdGVfY29hbGVzY2Uoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCBpOworCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJaW50IHNiX2lkID0gYnAtPmZwW2ldLnNiX2lkOworCisJCS8qIEhDX0lOREVYX1VfRVRIX1JYX0NRX0NPTlMgKi8KKwkJUkVHX1dSOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJCUNTVE9STV9TQl9IQ19USU1FT1VUX1VfT0ZGU0VUKHBvcnQsIHNiX2lkLAorCQkJCQkJICAgICAgVV9TQl9FVEhfUlhfQ1FfSU5ERVgpLAorCQkJYnAtPnJ4X3RpY2tzLyg0ICogQk5YMlhfQlRSKSk7CisJCVJFR19XUjE2KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCQkJIENTVE9STV9TQl9IQ19ESVNBQkxFX1VfT0ZGU0VUKHBvcnQsIHNiX2lkLAorCQkJCQkJICAgICAgIFVfU0JfRVRIX1JYX0NRX0lOREVYKSwKKwkJCSAoYnAtPnJ4X3RpY2tzLyg0ICogQk5YMlhfQlRSKSkgPyAwIDogMSk7CisKKwkJLyogSENfSU5ERVhfQ19FVEhfVFhfQ1FfQ09OUyAqLworCQlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCQkJQ1NUT1JNX1NCX0hDX1RJTUVPVVRfQ19PRkZTRVQocG9ydCwgc2JfaWQsCisJCQkJCQkgICAgICBDX1NCX0VUSF9UWF9DUV9JTkRFWCksCisJCQlicC0+dHhfdGlja3MvKDQgKiBCTlgyWF9CVFIpKTsKKwkJUkVHX1dSMTYoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJCQkgQ1NUT1JNX1NCX0hDX0RJU0FCTEVfQ19PRkZTRVQocG9ydCwgc2JfaWQsCisJCQkJCQkgICAgICAgQ19TQl9FVEhfVFhfQ1FfSU5ERVgpLAorCQkJIChicC0+dHhfdGlja3MvKDQgKiBCTlgyWF9CVFIpKSA/IDAgOiAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfc3BfcmluZyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBmdW5jID0gQlBfRlVOQyhicCk7CisKKwlzcGluX2xvY2tfaW5pdCgmYnAtPnNwcV9sb2NrKTsKKworCWJwLT5zcHFfbGVmdCA9IE1BWF9TUFFfUEVORElORzsKKwlicC0+c3BxX3Byb2RfaWR4ID0gMDsKKwlicC0+ZHNiX3NwX3Byb2QgPSBCTlgyWF9TUF9EU0JfSU5ERVg7CisJYnAtPnNwcV9wcm9kX2JkID0gYnAtPnNwcTsKKwlicC0+c3BxX2xhc3RfYmQgPSBicC0+c3BxX3Byb2RfYmQgKyBNQVhfU1BfREVTQ19DTlQ7CisKKwlSRUdfV1IoYnAsIFhTRU1fUkVHX0ZBU1RfTUVNT1JZICsgWFNUT1JNX1NQUV9QQUdFX0JBU0VfT0ZGU0VUKGZ1bmMpLAorCSAgICAgICBVNjRfTE8oYnAtPnNwcV9tYXBwaW5nKSk7CisJUkVHX1dSKGJwLAorCSAgICAgICBYU0VNX1JFR19GQVNUX01FTU9SWSArIFhTVE9STV9TUFFfUEFHRV9CQVNFX09GRlNFVChmdW5jKSArIDQsCisJICAgICAgIFU2NF9ISShicC0+c3BxX21hcHBpbmcpKTsKKworCVJFR19XUihicCwgWFNFTV9SRUdfRkFTVF9NRU1PUlkgKyBYU1RPUk1fU1BRX1BST0RfT0ZGU0VUKGZ1bmMpLAorCSAgICAgICBicC0+c3BxX3Byb2RfaWR4KTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfaW5pdF9jb250ZXh0KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGk7CisKKwkvKiBSeCAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBldGhfY29udGV4dCAqY29udGV4dCA9IGJueDJ4X3NwKGJwLCBjb250ZXh0W2ldLmV0aCk7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCQl1OCBjbF9pZCA9IGZwLT5jbF9pZDsKKworCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uc2JfaW5kZXhfbnVtYmVycyA9CisJCQkJCQlCTlgyWF9SWF9TQl9JTkRFWF9OVU07CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5jbGllbnRJZCA9IGNsX2lkOworCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uc3RhdHVzX2Jsb2NrX2lkID0gZnAtPnNiX2lkOworCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uZmxhZ3MgPQorCQkJKFVTVE9STV9FVEhfU1RfQ09OVEVYVF9DT05GSUdfRU5BQkxFX01DX0FMSUdOTUVOVCB8CisJCQkgVVNUT1JNX0VUSF9TVF9DT05URVhUX0NPTkZJR19FTkFCTEVfU1RBVElTVElDUyk7CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5zdGF0aXN0aWNzX2NvdW50ZXJfaWQgPQorCQkJCQkJY2xfaWQ7CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5tY19hbGlnbm1lbnRfbG9nX3NpemUgPQorCQkJCQkJQk5YMlhfUlhfQUxJR05fU0hJRlQ7CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5iZF9idWZmX3NpemUgPQorCQkJCQkJYnAtPnJ4X2J1Zl9zaXplOworCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uYmRfcGFnZV9iYXNlX2hpID0KKwkJCQkJCVU2NF9ISShmcC0+cnhfZGVzY19tYXBwaW5nKTsKKwkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLmJkX3BhZ2VfYmFzZV9sbyA9CisJCQkJCQlVNjRfTE8oZnAtPnJ4X2Rlc2NfbWFwcGluZyk7CisJCWlmICghZnAtPmRpc2FibGVfdHBhKSB7CisJCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uZmxhZ3MgfD0KKwkJCQlVU1RPUk1fRVRIX1NUX0NPTlRFWFRfQ09ORklHX0VOQUJMRV9UUEE7CisJCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uc2dlX2J1ZmZfc2l6ZSA9CisJCQkJKHUxNiltaW5fdCh1MzIsIFNHRV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSwKKwkJCQkJICAgMHhmZmZmKTsKKwkJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5zZ2VfcGFnZV9iYXNlX2hpID0KKwkJCQkJCVU2NF9ISShmcC0+cnhfc2dlX21hcHBpbmcpOworCQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLnNnZV9wYWdlX2Jhc2VfbG8gPQorCQkJCQkJVTY0X0xPKGZwLT5yeF9zZ2VfbWFwcGluZyk7CisKKwkJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5tYXhfc2dlc19mb3JfcGFja2V0ID0KKwkJCQlTR0VfUEFHRV9BTElHTihicC0+ZGV2LT5tdHUpID4+IFNHRV9QQUdFX1NISUZUOworCQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLm1heF9zZ2VzX2Zvcl9wYWNrZXQgPQorCQkJCSgoY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLgorCQkJCSAgbWF4X3NnZXNfZm9yX3BhY2tldCArIFBBR0VTX1BFUl9TR0UgLSAxKSAmCisJCQkJICh+KFBBR0VTX1BFUl9TR0UgLSAxKSkpID4+IFBBR0VTX1BFUl9TR0VfU0hJRlQ7CisJCX0KKworCQljb250ZXh0LT51c3Rvcm1fYWdfY29udGV4dC5jZHVfdXNhZ2UgPQorCQkJQ0RVX1JTUlZEX1ZBTFVFX1RZUEVfQShIV19DSUQoYnAsIGkpLAorCQkJCQkgICAgICAgQ0RVX1JFR0lPTl9OVU1CRVJfVUNNX0FHLAorCQkJCQkgICAgICAgRVRIX0NPTk5FQ1RJT05fVFlQRSk7CisKKwkJY29udGV4dC0+eHN0b3JtX2FnX2NvbnRleHQuY2R1X3Jlc2VydmVkID0KKwkJCUNEVV9SU1JWRF9WQUxVRV9UWVBFX0EoSFdfQ0lEKGJwLCBpKSwKKwkJCQkJICAgICAgIENEVV9SRUdJT05fTlVNQkVSX1hDTV9BRywKKwkJCQkJICAgICAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOworCX0KKworCS8qIFR4ICovCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisJCXN0cnVjdCBldGhfY29udGV4dCAqY29udGV4dCA9CisJCQlibngyeF9zcChicCwgY29udGV4dFtpXS5ldGgpOworCisJCWNvbnRleHQtPmNzdG9ybV9zdF9jb250ZXh0LnNiX2luZGV4X251bWJlciA9CisJCQkJCQlDX1NCX0VUSF9UWF9DUV9JTkRFWDsKKwkJY29udGV4dC0+Y3N0b3JtX3N0X2NvbnRleHQuc3RhdHVzX2Jsb2NrX2lkID0gZnAtPnNiX2lkOworCisJCWNvbnRleHQtPnhzdG9ybV9zdF9jb250ZXh0LnR4X2JkX3BhZ2VfYmFzZV9oaSA9CisJCQkJCQlVNjRfSEkoZnAtPnR4X2Rlc2NfbWFwcGluZyk7CisJCWNvbnRleHQtPnhzdG9ybV9zdF9jb250ZXh0LnR4X2JkX3BhZ2VfYmFzZV9sbyA9CisJCQkJCQlVNjRfTE8oZnAtPnR4X2Rlc2NfbWFwcGluZyk7CisJCWNvbnRleHQtPnhzdG9ybV9zdF9jb250ZXh0LnN0YXRpc3RpY3NfZGF0YSA9IChmcC0+Y2xfaWQgfAorCQkJCVhTVE9STV9FVEhfU1RfQ09OVEVYVF9TVEFUSVNUSUNTX0VOQUJMRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9pbml0X2luZF90YWJsZShzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBmdW5jID0gQlBfRlVOQyhicCk7CisJaW50IGk7CisKKwlpZiAoYnAtPm11bHRpX21vZGUgPT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKQorCQlyZXR1cm47CisKKwlEUChORVRJRl9NU0dfSUZVUCwKKwkgICAiSW5pdGlhbGl6aW5nIGluZGlyZWN0aW9uIHRhYmxlICBtdWx0aV9tb2RlICVkXG4iLCBicC0+bXVsdGlfbW9kZSk7CisJZm9yIChpID0gMDsgaSA8IFRTVE9STV9JTkRJUkVDVElPTl9UQUJMRV9TSVpFOyBpKyspCisJCVJFR19XUjgoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCQlUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfT0ZGU0VUKGZ1bmMpICsgaSwKKwkJCWJwLT5mcC0+Y2xfaWQgKyAoaSAlIGJwLT5udW1fcXVldWVzKSk7Cit9CisKK3ZvaWQgYm54Mnhfc2V0X2NsaWVudF9jb25maWcoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgdHN0b3JtX2V0aF9jbGllbnRfY29uZmlnIHRzdG9ybV9jbGllbnQgPSB7MH07CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgaTsKKworCXRzdG9ybV9jbGllbnQubXR1ID0gYnAtPmRldi0+bXR1OworCXRzdG9ybV9jbGllbnQuY29uZmlnX2ZsYWdzID0KKwkJCQkoVFNUT1JNX0VUSF9DTElFTlRfQ09ORklHX1NUQVRTSVRJQ1NfRU5BQkxFIHwKKwkJCQkgVFNUT1JNX0VUSF9DTElFTlRfQ09ORklHX0UxSE9WX1JFTV9FTkFCTEUpOworI2lmZGVmIEJDTV9WTEFOCisJaWYgKGJwLT5yeF9tb2RlICYmIGJwLT52bGdycCAmJiAoYnAtPmZsYWdzICYgSFdfVkxBTl9SWF9GTEFHKSkgeworCQl0c3Rvcm1fY2xpZW50LmNvbmZpZ19mbGFncyB8PQorCQkJCVRTVE9STV9FVEhfQ0xJRU5UX0NPTkZJR19WTEFOX1JFTV9FTkFCTEU7CisJCURQKE5FVElGX01TR19JRlVQLCAidmxhbiByZW1vdmFsIGVuYWJsZWRcbiIpOworCX0KKyNlbmRpZgorCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJdHN0b3JtX2NsaWVudC5zdGF0aXN0aWNzX2NvdW50ZXJfaWQgPSBicC0+ZnBbaV0uY2xfaWQ7CisKKwkJUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKworCQkgICAgICAgVFNUT1JNX0NMSUVOVF9DT05GSUdfT0ZGU0VUKHBvcnQsIGJwLT5mcFtpXS5jbF9pZCksCisJCSAgICAgICAoKHUzMiAqKSZ0c3Rvcm1fY2xpZW50KVswXSk7CisJCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKKwkJICAgICAgIFRTVE9STV9DTElFTlRfQ09ORklHX09GRlNFVChwb3J0LCBicC0+ZnBbaV0uY2xfaWQpICsgNCwKKwkJICAgICAgICgodTMyICopJnRzdG9ybV9jbGllbnQpWzFdKTsKKwl9CisKKwlEUChCTlgyWF9NU0dfT0ZGLCAidHN0b3JtX2NsaWVudDogMHglMDh4IDB4JTA4eFxuIiwKKwkgICAoKHUzMiAqKSZ0c3Rvcm1fY2xpZW50KVswXSwgKCh1MzIgKikmdHN0b3JtX2NsaWVudClbMV0pOworfQorCit2b2lkIGJueDJ4X3NldF9zdG9ybV9yeF9tb2RlKHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IHRzdG9ybV9ldGhfbWFjX2ZpbHRlcl9jb25maWcgdHN0b3JtX21hY19maWx0ZXIgPSB7MH07CisJaW50IG1vZGUgPSBicC0+cnhfbW9kZTsKKwlpbnQgbWFzayA9IGJwLT5yeF9tb2RlX2NsX21hc2s7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCBpOworCS8qIEFsbCBidXQgbWFuYWdlbWVudCB1bmljYXN0IHBhY2tldHMgc2hvdWxkIHBhc3MgdG8gdGhlIGhvc3QgYXMgd2VsbCAqLworCXUzMiBsbGhfbWFzayA9CisJCU5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19CUkNTVCB8CisJCU5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19NTENTVCB8CisJCU5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19WTEFOIHwKKwkJTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX05PX1ZMQU47CisKKwlEUChORVRJRl9NU0dfSUZVUCwgInJ4IG1vZGUgJWQgIG1hc2sgMHgleFxuIiwgbW9kZSwgbWFzayk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEJOWDJYX1JYX01PREVfTk9ORTogLyogbm8gUnggKi8KKwkJdHN0b3JtX21hY19maWx0ZXIudWNhc3RfZHJvcF9hbGwgPSBtYXNrOworCQl0c3Rvcm1fbWFjX2ZpbHRlci5tY2FzdF9kcm9wX2FsbCA9IG1hc2s7CisJCXRzdG9ybV9tYWNfZmlsdGVyLmJjYXN0X2Ryb3BfYWxsID0gbWFzazsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX1JYX01PREVfTk9STUFMOgorCQl0c3Rvcm1fbWFjX2ZpbHRlci5iY2FzdF9hY2NlcHRfYWxsID0gbWFzazsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX1JYX01PREVfQUxMTVVMVEk6CisJCXRzdG9ybV9tYWNfZmlsdGVyLm1jYXN0X2FjY2VwdF9hbGwgPSBtYXNrOworCQl0c3Rvcm1fbWFjX2ZpbHRlci5iY2FzdF9hY2NlcHRfYWxsID0gbWFzazsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX1JYX01PREVfUFJPTUlTQzoKKwkJdHN0b3JtX21hY19maWx0ZXIudWNhc3RfYWNjZXB0X2FsbCA9IG1hc2s7CisJCXRzdG9ybV9tYWNfZmlsdGVyLm1jYXN0X2FjY2VwdF9hbGwgPSBtYXNrOworCQl0c3Rvcm1fbWFjX2ZpbHRlci5iY2FzdF9hY2NlcHRfYWxsID0gbWFzazsKKwkJLyogcGFzcyBtYW5hZ2VtZW50IHVuaWNhc3QgcGFja2V0cyBhcyB3ZWxsICovCisJCWxsaF9tYXNrIHw9IE5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19VTkNTVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIkJBRCByeCBtb2RlICglZClcbiIsIG1vZGUpOworCQlicmVhazsKKwl9CisKKwlSRUdfV1IoYnAsCisJICAgICAgIChwb3J0ID8gTklHX1JFR19MTEgxX0JSQjFfRFJWX01BU0sgOiBOSUdfUkVHX0xMSDBfQlJCMV9EUlZfTUFTSyksCisJICAgICAgIGxsaF9tYXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IHRzdG9ybV9ldGhfbWFjX2ZpbHRlcl9jb25maWcpLzQ7IGkrKykgeworCQlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCisJCSAgICAgICBUU1RPUk1fTUFDX0ZJTFRFUl9DT05GSUdfT0ZGU0VUKGZ1bmMpICsgaSAqIDQsCisJCSAgICAgICAoKHUzMiAqKSZ0c3Rvcm1fbWFjX2ZpbHRlcilbaV0pOworCisvKgkJRFAoTkVUSUZfTVNHX0lGVVAsICJ0c3Rvcm1fbWFjX2ZpbHRlclslZF06IDB4JTA4eFxuIiwgaSwKKwkJICAgKCh1MzIgKikmdHN0b3JtX21hY19maWx0ZXIpW2ldKTsgKi8KKwl9CisKKwlpZiAobW9kZSAhPSBCTlgyWF9SWF9NT0RFX05PTkUpCisJCWJueDJ4X3NldF9jbGllbnRfY29uZmlnKGJwKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfaW5pdF9pbnRlcm5hbF9jb21tb24oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaTsKKworCS8qIFplcm8gdGhpcyBtYW51YWxseSBhcyBpdHMgaW5pdGlhbGl6YXRpb24gaXMKKwkgICBjdXJyZW50bHkgbWlzc2luZyBpbiB0aGUgaW5pdFRvb2wgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFVTVE9STV9BR0dfREFUQV9TSVpFID4+IDIpOyBpKyspCisJCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkJICAgICAgIFVTVE9STV9BR0dfREFUQV9PRkZTRVQgKyBpICogNCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWxfcG9ydChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisKKwlSRUdfV1IoYnAsCisJICAgICAgIEJBUl9DU1RST1JNX0lOVE1FTSArIENTVE9STV9IQ19CVFJfVV9PRkZTRVQocG9ydCksIEJOWDJYX0JUUik7CisJUkVHX1dSKGJwLAorCSAgICAgICBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fSENfQlRSX0NfT0ZGU0VUKHBvcnQpLCBCTlgyWF9CVFIpOworCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsgVFNUT1JNX0hDX0JUUl9PRkZTRVQocG9ydCksIEJOWDJYX0JUUik7CisJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fSENfQlRSX09GRlNFVChwb3J0KSwgQk5YMlhfQlRSKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfaW5pdF9pbnRlcm5hbF9mdW5jKHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IHRzdG9ybV9ldGhfZnVuY3Rpb25fY29tbW9uX2NvbmZpZyB0c3Rvcm1fY29uZmlnID0gezB9OworCXN0cnVjdCBzdGF0c19pbmRpY2F0aW9uX2ZsYWdzIHN0YXRzX2ZsYWdzID0gezB9OworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwlpbnQgaSwgajsKKwl1MzIgb2Zmc2V0OworCXUxNiBtYXhfYWdnX3NpemU7CisKKwl0c3Rvcm1fY29uZmlnLmNvbmZpZ19mbGFncyA9IFJTU19GTEFHUyhicCk7CisKKwlpZiAoaXNfbXVsdGkoYnApKQorCQl0c3Rvcm1fY29uZmlnLnJzc19yZXN1bHRfbWFzayA9IE1VTFRJX01BU0s7CisKKwkvKiBFbmFibGUgVFBBIGlmIG5lZWRlZCAqLworCWlmIChicC0+ZmxhZ3MgJiBUUEFfRU5BQkxFX0ZMQUcpCisJCXRzdG9ybV9jb25maWcuY29uZmlnX2ZsYWdzIHw9CisJCQlUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfRU5BQkxFX1RQQTsKKworCWlmIChJU19FMUhNRihicCkpCisJCXRzdG9ybV9jb25maWcuY29uZmlnX2ZsYWdzIHw9CisJCQkJVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX0UxSE9WX0lOX0NBTTsKKworCXRzdG9ybV9jb25maWcubGVhZGluZ19jbGllbnRfaWQgPSBCUF9MX0lEKGJwKTsKKworCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgVFNUT1JNX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfT0ZGU0VUKGZ1bmMpLAorCSAgICAgICAoKih1MzIgKikmdHN0b3JtX2NvbmZpZykpOworCisJYnAtPnJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7IC8qIG5vIHJ4IHVudGlsIGxpbmsgaXMgdXAgKi8KKwlicC0+cnhfbW9kZV9jbF9tYXNrID0gKDEgPDwgQlBfTF9JRChicCkpOworCWJueDJ4X3NldF9zdG9ybV9yeF9tb2RlKGJwKTsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXU4IGNsX2lkID0gYnAtPmZwW2ldLmNsX2lkOworCisJCS8qIHJlc2V0IHhzdG9ybSBwZXIgY2xpZW50IHN0YXRpc3RpY3MgKi8KKwkJb2Zmc2V0ID0gQkFSX1hTVFJPUk1fSU5UTUVNICsKKwkJCSBYU1RPUk1fUEVSX0NPVU5URVJfSURfU1RBVFNfT0ZGU0VUKHBvcnQsIGNsX2lkKTsKKwkJZm9yIChqID0gMDsKKwkJICAgICBqIDwgc2l6ZW9mKHN0cnVjdCB4c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykgLyA0OyBqKyspCisJCQlSRUdfV1IoYnAsIG9mZnNldCArIGoqNCwgMCk7CisKKwkJLyogcmVzZXQgdHN0b3JtIHBlciBjbGllbnQgc3RhdGlzdGljcyAqLworCQlvZmZzZXQgPSBCQVJfVFNUUk9STV9JTlRNRU0gKworCQkJIFRTVE9STV9QRVJfQ09VTlRFUl9JRF9TVEFUU19PRkZTRVQocG9ydCwgY2xfaWQpOworCQlmb3IgKGogPSAwOworCQkgICAgIGogPCBzaXplb2Yoc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzKSAvIDQ7IGorKykKKwkJCVJFR19XUihicCwgb2Zmc2V0ICsgaio0LCAwKTsKKworCQkvKiByZXNldCB1c3Rvcm0gcGVyIGNsaWVudCBzdGF0aXN0aWNzICovCisJCW9mZnNldCA9IEJBUl9VU1RST1JNX0lOVE1FTSArCisJCQkgVVNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0LCBjbF9pZCk7CisJCWZvciAoaiA9IDA7CisJCSAgICAgaiA8IHNpemVvZihzdHJ1Y3QgdXN0b3JtX3Blcl9jbGllbnRfc3RhdHMpIC8gNDsgaisrKQorCQkJUkVHX1dSKGJwLCBvZmZzZXQgKyBqKjQsIDApOworCX0KKworCS8qIEluaXQgc3RhdGlzdGljcyByZWxhdGVkIGNvbnRleHQgKi8KKwlzdGF0c19mbGFncy5jb2xsZWN0X2V0aCA9IDE7CisKKwlSRUdfV1IoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIFhTVE9STV9TVEFUU19GTEFHU19PRkZTRVQoZnVuYyksCisJICAgICAgICgodTMyICopJnN0YXRzX2ZsYWdzKVswXSk7CisJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGZ1bmMpICsgNCwKKwkgICAgICAgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzFdKTsKKworCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsgVFNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChmdW5jKSwKKwkgICAgICAgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzBdKTsKKwlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArIFRTVE9STV9TVEFUU19GTEFHU19PRkZTRVQoZnVuYykgKyA0LAorCSAgICAgICAoKHUzMiAqKSZzdGF0c19mbGFncylbMV0pOworCisJUkVHX1dSKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKyBVU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGZ1bmMpLAorCSAgICAgICAoKHUzMiAqKSZzdGF0c19mbGFncylbMF0pOworCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsgVVNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChmdW5jKSArIDQsCisJICAgICAgICgodTMyICopJnN0YXRzX2ZsYWdzKVsxXSk7CisKKwlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArIENTVE9STV9TVEFUU19GTEFHU19PRkZTRVQoZnVuYyksCisJICAgICAgICgodTMyICopJnN0YXRzX2ZsYWdzKVswXSk7CisJUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGZ1bmMpICsgNCwKKwkgICAgICAgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzFdKTsKKworCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgWFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChmdW5jKSwKKwkgICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ3X3N0YXRzKSkpOworCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgWFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChmdW5jKSArIDQsCisJICAgICAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmd19zdGF0cykpKTsKKworCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgVFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChmdW5jKSwKKwkgICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ3X3N0YXRzKSkpOworCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgVFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChmdW5jKSArIDQsCisJICAgICAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmd19zdGF0cykpKTsKKworCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgVVNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChmdW5jKSwKKwkgICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ3X3N0YXRzKSkpOworCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkgICAgICAgVVNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChmdW5jKSArIDQsCisJICAgICAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmd19zdGF0cykpKTsKKworCWlmIChDSElQX0lTX0UxSChicCkpIHsKKwkJUkVHX1dSOChicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VULAorCQkJSVNfRTFITUYoYnApKTsKKwkJUkVHX1dSOChicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsgVFNUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VULAorCQkJSVNfRTFITUYoYnApKTsKKwkJUkVHX1dSOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsgQ1NUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VULAorCQkJSVNfRTFITUYoYnApKTsKKwkJUkVHX1dSOChicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsgVVNUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VULAorCQkJSVNfRTFITUYoYnApKTsKKworCQlSRUdfV1IxNihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX0UxSE9WX09GRlNFVChmdW5jKSwKKwkJCSBicC0+ZTFob3YpOworCX0KKworCS8qIEluaXQgQ1EgcmluZyBtYXBwaW5nIGFuZCBhZ2dyZWdhdGlvbiBzaXplLCB0aGUgRlcgbGltaXQgaXMgOCBmcmFncyAqLworCW1heF9hZ2dfc2l6ZSA9IG1pbl90KHUzMiwgKG1pbl90KHUzMiwgOCwgTUFYX1NLQl9GUkFHUykgKgorCQkJCSAgIFNHRV9QQUdFX1NJWkUgKiBQQUdFU19QRVJfU0dFKSwgMHhmZmZmKTsKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKKworCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCisJCSAgICAgICBVU1RPUk1fQ1FFX1BBR0VfQkFTRV9PRkZTRVQocG9ydCwgZnAtPmNsX2lkKSwKKwkJICAgICAgIFU2NF9MTyhmcC0+cnhfY29tcF9tYXBwaW5nKSk7CisJCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkJICAgICAgIFVTVE9STV9DUUVfUEFHRV9CQVNFX09GRlNFVChwb3J0LCBmcC0+Y2xfaWQpICsgNCwKKwkJICAgICAgIFU2NF9ISShmcC0+cnhfY29tcF9tYXBwaW5nKSk7CisKKwkJLyogTmV4dCBwYWdlICovCisJCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkJICAgICAgIFVTVE9STV9DUUVfUEFHRV9ORVhUX09GRlNFVChwb3J0LCBmcC0+Y2xfaWQpLAorCQkgICAgICAgVTY0X0xPKGZwLT5yeF9jb21wX21hcHBpbmcgKyBCQ01fUEFHRV9TSVpFKSk7CisJCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKKwkJICAgICAgIFVTVE9STV9DUUVfUEFHRV9ORVhUX09GRlNFVChwb3J0LCBmcC0+Y2xfaWQpICsgNCwKKwkJICAgICAgIFU2NF9ISShmcC0+cnhfY29tcF9tYXBwaW5nICsgQkNNX1BBR0VfU0laRSkpOworCisJCVJFR19XUjE2KGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkJIFVTVE9STV9NQVhfQUdHX1NJWkVfT0ZGU0VUKHBvcnQsIGZwLT5jbF9pZCksCisJCQkgbWF4X2FnZ19zaXplKTsKKwl9CisKKwkvKiBkcm9wbGVzcyBmbG93IGNvbnRyb2wgKi8KKwlpZiAoQ0hJUF9JU19FMUgoYnApKSB7CisJCXN0cnVjdCB1c3Rvcm1fZXRoX3J4X3BhdXNlX2RhdGFfZTFoIHJ4X3BhdXNlID0gezB9OworCisJCXJ4X3BhdXNlLmJkX3Rocl9sb3cgPSAyNTA7CisJCXJ4X3BhdXNlLmNxZV90aHJfbG93ID0gMjUwOworCQlyeF9wYXVzZS5jb3MgPSAxOworCQlyeF9wYXVzZS5zZ2VfdGhyX2xvdyA9IDA7CisJCXJ4X3BhdXNlLmJkX3Rocl9oaWdoID0gMzUwOworCQlyeF9wYXVzZS5jcWVfdGhyX2hpZ2ggPSAzNTA7CisJCXJ4X3BhdXNlLnNnZV90aHJfaGlnaCA9IDA7CisKKwkJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCisJCQlpZiAoIWZwLT5kaXNhYmxlX3RwYSkgeworCQkJCXJ4X3BhdXNlLnNnZV90aHJfbG93ID0gMTUwOworCQkJCXJ4X3BhdXNlLnNnZV90aHJfaGlnaCA9IDI1MDsKKwkJCX0KKworCisJCQlvZmZzZXQgPSBCQVJfVVNUUk9STV9JTlRNRU0gKworCQkJCSBVU1RPUk1fRVRIX1JJTkdfUEFVU0VfREFUQV9PRkZTRVQocG9ydCwKKwkJCQkJCQkJICAgZnAtPmNsX2lkKTsKKwkJCWZvciAoaiA9IDA7CisJCQkgICAgIGogPCBzaXplb2Yoc3RydWN0IHVzdG9ybV9ldGhfcnhfcGF1c2VfZGF0YV9lMWgpLzQ7CisJCQkgICAgIGorKykKKwkJCQlSRUdfV1IoYnAsIG9mZnNldCArIGoqNCwKKwkJCQkgICAgICAgKCh1MzIgKikmcnhfcGF1c2UpW2pdKTsKKwkJfQorCX0KKworCW1lbXNldCgmKGJwLT5jbW5nKSwgMCwgc2l6ZW9mKHN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCkpOworCisJLyogSW5pdCByYXRlIHNoYXBpbmcgYW5kIGZhaXJuZXNzIGNvbnRleHRzICovCisJaWYgKElTX0UxSE1GKGJwKSkgeworCQlpbnQgdm47CisKKwkJLyogRHVyaW5nIGluaXQgdGhlcmUgaXMgbm8gYWN0aXZlIGxpbmsKKwkJICAgVW50aWwgbGluayBpcyB1cCwgc2V0IGxpbmsgcmF0ZSB0byAxMEdicHMgKi8KKwkJYnAtPmxpbmtfdmFycy5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCWJueDJ4X2luaXRfcG9ydF9taW5tYXgoYnApOworCisJCWlmICghQlBfTk9NQ1AoYnApKQorCQkJYnAtPm1mX2NvbmZpZyA9CisJCQkgICAgICBTSE1FTV9SRChicCwgbWZfY2ZnLmZ1bmNfbWZfY29uZmlnW2Z1bmNdLmNvbmZpZyk7CisJCWJueDJ4X2NhbGNfdm5fd2VpZ2h0X3N1bShicCk7CisKKwkJZm9yICh2biA9IFZOXzA7IHZuIDwgRTFIVk5fTUFYOyB2bisrKQorCQkJYm54MnhfaW5pdF92bl9taW5tYXgoYnAsIDIqdm4gKyBwb3J0KTsKKworCQkvKiBFbmFibGUgcmF0ZSBzaGFwaW5nIGFuZCBmYWlybmVzcyAqLworCQlicC0+Y21uZy5mbGFncy5jbW5nX2VuYWJsZXMgfD0KKwkJCQkJQ01OR19GTEFHU19QRVJfUE9SVF9SQVRFX1NIQVBJTkdfVk47CisKKwl9IGVsc2UgeworCQkvKiByYXRlIHNoYXBpbmcgYW5kIGZhaXJuZXNzIGFyZSBkaXNhYmxlZCAqLworCQlEUChORVRJRl9NU0dfSUZVUCwKKwkJICAgInNpbmdsZSBmdW5jdGlvbiBtb2RlICBtaW5tYXggd2lsbCBiZSBkaXNhYmxlZFxuIik7CisJfQorCisKKwkvKiBTdG9yZSBjbW5nIHN0cnVjdHVyZXMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisJaWYgKGJwLT5wb3J0LnBtZikKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgY21uZ19zdHJ1Y3RfcGVyX3BvcnQpIC8gNDsgaSsrKQorCQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCQkJICAgICAgIFhTVE9STV9DTU5HX1BFUl9QT1JUX1ZBUlNfT0ZGU0VUKHBvcnQpICsgaSAqIDQsCisJCQkgICAgICAgKCh1MzIgKikoJmJwLT5jbW5nKSlbaV0pOworfQorCitzdGF0aWMgdm9pZCBibngyeF9pbml0X2ludGVybmFsKHN0cnVjdCBibngyeCAqYnAsIHUzMiBsb2FkX2NvZGUpCit7CisJc3dpdGNoIChsb2FkX2NvZGUpIHsKKwljYXNlIEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTjoKKwkJYm54MnhfaW5pdF9pbnRlcm5hbF9jb21tb24oYnApOworCQkvKiBubyBicmVhayAqLworCisJY2FzZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9QT1JUOgorCQlibngyeF9pbml0X2ludGVybmFsX3BvcnQoYnApOworCQkvKiBubyBicmVhayAqLworCisJY2FzZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9GVU5DVElPTjoKKwkJYm54MnhfaW5pdF9pbnRlcm5hbF9mdW5jKGJwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIlVua25vd24gbG9hZF9jb2RlICgweCV4KSBmcm9tIE1DUFxuIiwgbG9hZF9jb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIGJueDJ4X25pY19pbml0KHN0cnVjdCBibngyeCAqYnAsIHUzMiBsb2FkX2NvZGUpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKKworCQlmcC0+YnAgPSBicDsKKwkJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfQ0xPU0VEOworCQlmcC0+aW5kZXggPSBpOworCQlmcC0+Y2xfaWQgPSBCUF9MX0lEKGJwKSArIGk7CisjaWZkZWYgQkNNX0NOSUMKKwkJZnAtPnNiX2lkID0gZnAtPmNsX2lkICsgMTsKKyNlbHNlCisJCWZwLT5zYl9pZCA9IGZwLT5jbF9pZDsKKyNlbmRpZgorCQlEUChORVRJRl9NU0dfSUZVUCwKKwkJICAgInF1ZXVlWyVkXTogIGJueDJ4X2luaXRfc2IoJXAsJXApICBjbF9pZCAlZCAgc2IgJWRcbiIsCisJCSAgIGksIGJwLCBmcC0+c3RhdHVzX2JsaywgZnAtPmNsX2lkLCBmcC0+c2JfaWQpOworCQlibngyeF9pbml0X3NiKGJwLCBmcC0+c3RhdHVzX2JsaywgZnAtPnN0YXR1c19ibGtfbWFwcGluZywKKwkJCSAgICAgIGZwLT5zYl9pZCk7CisJCWJueDJ4X3VwZGF0ZV9mcHNiX2lkeChmcCk7CisJfQorCisJLyogZW5zdXJlIHN0YXR1cyBibG9jayBpbmRpY2VzIHdlcmUgcmVhZCAqLworCXJtYigpOworCisKKwlibngyeF9pbml0X2RlZl9zYihicCwgYnAtPmRlZl9zdGF0dXNfYmxrLCBicC0+ZGVmX3N0YXR1c19ibGtfbWFwcGluZywKKwkJCSAgREVGX1NCX0lEKTsKKwlibngyeF91cGRhdGVfZHNiX2lkeChicCk7CisJYm54MnhfdXBkYXRlX2NvYWxlc2NlKGJwKTsKKwlibngyeF9pbml0X3J4X3JpbmdzKGJwKTsKKwlibngyeF9pbml0X3R4X3JpbmcoYnApOworCWJueDJ4X2luaXRfc3BfcmluZyhicCk7CisJYm54MnhfaW5pdF9jb250ZXh0KGJwKTsKKwlibngyeF9pbml0X2ludGVybmFsKGJwLCBsb2FkX2NvZGUpOworCWJueDJ4X2luaXRfaW5kX3RhYmxlKGJwKTsKKwlibngyeF9zdGF0c19pbml0KGJwKTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSByZWFkeSBmb3IgaW50ZXJydXB0cyAqLworCWF0b21pY19zZXQoJmJwLT5pbnRyX3NlbSwgMCk7CisKKwkvKiBmbHVzaCBhbGwgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMgKi8KKwltYigpOworCW1taW93YigpOworCisJYm54MnhfaW50X2VuYWJsZShicCk7CisKKwkvKiBDaGVjayBmb3IgU1BJTzUgKi8KKwlibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMChicCwKKwkJUkVHX1JEKGJwLCBNSVNDX1JFR19BRVVfQUZURVJfSU5WRVJUXzFfRlVOQ18wICsgQlBfUE9SVChicCkqNCkgJgorCQkJCSAgIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1NQSU81KTsKK30KKworLyogZW5kIG9mIG5pYyBpbml0ICovCisKKy8qCisgKiBnemlwIHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBibngyeF9ndW56aXBfaW5pdChzdHJ1Y3QgYm54MnggKmJwKQoreworCWJwLT5ndW56aXBfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBGV19CVUZfU0laRSwKKwkJCQkJICAgICZicC0+Z3VuemlwX21hcHBpbmcsIEdGUF9LRVJORUwpOworCWlmIChicC0+Z3VuemlwX2J1ZiAgPT0gTlVMTCkKKwkJZ290byBndW56aXBfbm9tZW0xOworCisJYnAtPnN0cm0gPSBrbWFsbG9jKHNpemVvZigqYnAtPnN0cm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnAtPnN0cm0gID09IE5VTEwpCisJCWdvdG8gZ3VuemlwX25vbWVtMjsKKworCWJwLT5zdHJtLT53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKGJwLT5zdHJtLT53b3Jrc3BhY2UgPT0gTlVMTCkKKwkJZ290byBndW56aXBfbm9tZW0zOworCisJcmV0dXJuIDA7CisKK2d1bnppcF9ub21lbTM6CisJa2ZyZWUoYnAtPnN0cm0pOworCWJwLT5zdHJtID0gTlVMTDsKKworZ3VuemlwX25vbWVtMjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgRldfQlVGX1NJWkUsIGJwLT5ndW56aXBfYnVmLAorCQkJICBicC0+Z3VuemlwX21hcHBpbmcpOworCWJwLT5ndW56aXBfYnVmID0gTlVMTDsKKworZ3VuemlwX25vbWVtMToKKwluZXRkZXZfZXJyKGJwLT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgZmlybXdhcmUgYnVmZmVyIGZvciIKKwkgICAgICAgIiB1bi1jb21wcmVzc2lvblxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2d1bnppcF9lbmQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlrZnJlZShicC0+c3RybS0+d29ya3NwYWNlKTsKKworCWtmcmVlKGJwLT5zdHJtKTsKKwlicC0+c3RybSA9IE5VTEw7CisKKwlpZiAoYnAtPmd1bnppcF9idWYpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIEZXX0JVRl9TSVpFLCBicC0+Z3VuemlwX2J1ZiwKKwkJCQkgIGJwLT5ndW56aXBfbWFwcGluZyk7CisJCWJwLT5ndW56aXBfYnVmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZ3VuemlwKHN0cnVjdCBibngyeCAqYnAsIGNvbnN0IHU4ICp6YnVmLCBpbnQgbGVuKQoreworCWludCBuLCByYzsKKworCS8qIGNoZWNrIGd6aXAgaGVhZGVyICovCisJaWYgKCh6YnVmWzBdICE9IDB4MWYpIHx8ICh6YnVmWzFdICE9IDB4OGIpIHx8ICh6YnVmWzJdICE9IFpfREVGTEFURUQpKSB7CisJCUJOWDJYX0VSUigiQmFkIGd6aXAgaGVhZGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbiA9IDEwOworCisjZGVmaW5lIEZOQU1FCQkJCTB4OAorCisJaWYgKHpidWZbM10gJiBGTkFNRSkKKwkJd2hpbGUgKCh6YnVmW24rK10gIT0gMCkgJiYgKG4gPCBsZW4pKTsKKworCWJwLT5zdHJtLT5uZXh0X2luID0gKHR5cGVvZihicC0+c3RybS0+bmV4dF9pbikpemJ1ZiArIG47CisJYnAtPnN0cm0tPmF2YWlsX2luID0gbGVuIC0gbjsKKwlicC0+c3RybS0+bmV4dF9vdXQgPSBicC0+Z3VuemlwX2J1ZjsKKwlicC0+c3RybS0+YXZhaWxfb3V0ID0gRldfQlVGX1NJWkU7CisKKwlyYyA9IHpsaWJfaW5mbGF0ZUluaXQyKGJwLT5zdHJtLCAtTUFYX1dCSVRTKTsKKwlpZiAocmMgIT0gWl9PSykKKwkJcmV0dXJuIHJjOworCisJcmMgPSB6bGliX2luZmxhdGUoYnAtPnN0cm0sIFpfRklOSVNIKTsKKwlpZiAoKHJjICE9IFpfT0spICYmIChyYyAhPSBaX1NUUkVBTV9FTkQpKQorCQluZXRkZXZfZXJyKGJwLT5kZXYsICJGaXJtd2FyZSBkZWNvbXByZXNzaW9uIGVycm9yOiAlc1xuIiwKKwkJCSAgIGJwLT5zdHJtLT5tc2cpOworCisJYnAtPmd1bnppcF9vdXRsZW4gPSAoRldfQlVGX1NJWkUgLSBicC0+c3RybS0+YXZhaWxfb3V0KTsKKwlpZiAoYnAtPmd1bnppcF9vdXRsZW4gJiAweDMpCisJCW5ldGRldl9lcnIoYnAtPmRldiwgIkZpcm13YXJlIGRlY29tcHJlc3Npb24gZXJyb3I6IgorCQkJCSAgICAiIGd1bnppcF9vdXRsZW4gKCVkKSBub3QgYWxpZ25lZFxuIiwKKwkJCQlicC0+Z3VuemlwX291dGxlbik7CisJYnAtPmd1bnppcF9vdXRsZW4gPj49IDI7CisKKwl6bGliX2luZmxhdGVFbmQoYnAtPnN0cm0pOworCisJaWYgKHJjID09IFpfU1RSRUFNX0VORCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIG5pYyBsb2FkL3VubG9hZCAqLworCisvKgorICogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucworICovCisKKy8qIHNlbmQgYSBOSUcgbG9vcGJhY2sgZGVidWcgcGFja2V0ICovCitzdGF0aWMgdm9pZCBibngyeF9sYl9wY2t0KHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHdiX3dyaXRlWzNdOworCisJLyogRXRoZXJuZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKwl3Yl93cml0ZVswXSA9IDB4NTU1NTU1NTU7CisJd2Jfd3JpdGVbMV0gPSAweDU1NTU1NTU1OworCXdiX3dyaXRlWzJdID0gMHgyMDsJCS8qIFNPUCAqLworCVJFR19XUl9ETUFFKGJwLCBOSUdfUkVHX0RFQlVHX1BBQ0tFVF9MQiwgd2Jfd3JpdGUsIDMpOworCisJLyogTk9OLUlQIHByb3RvY29sICovCisJd2Jfd3JpdGVbMF0gPSAweDA5MDAwMDAwOworCXdiX3dyaXRlWzFdID0gMHg1NTU1NTU1NTsKKwl3Yl93cml0ZVsyXSA9IDB4MTA7CQkvKiBFT1AsIGVvcF9idmFsaWQgPSAwICovCisJUkVHX1dSX0RNQUUoYnAsIE5JR19SRUdfREVCVUdfUEFDS0VUX0xCLCB3Yl93cml0ZSwgMyk7Cit9CisKKy8qIHNvbWUgb2YgdGhlIGludGVybmFsIG1lbW9yaWVzCisgKiBhcmUgbm90IGRpcmVjdGx5IHJlYWRhYmxlIGZyb20gdGhlIGRyaXZlcgorICogdG8gdGVzdCB0aGVtIHdlIHNlbmQgZGVidWcgcGFja2V0cworICovCitzdGF0aWMgaW50IGJueDJ4X2ludF9tZW1fdGVzdChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBmYWN0b3I7CisJaW50IGNvdW50LCBpOworCXUzMiB2YWwgPSAwOworCisJaWYgKENISVBfUkVWX0lTX0ZQR0EoYnApKQorCQlmYWN0b3IgPSAxMjA7CisJZWxzZSBpZiAoQ0hJUF9SRVZfSVNfRU1VTChicCkpCisJCWZhY3RvciA9IDIwMDsKKwllbHNlCisJCWZhY3RvciA9IDE7CisKKwlEUChORVRJRl9NU0dfSFcsICJzdGFydCBwYXJ0MVxuIik7CisKKwkvKiBEaXNhYmxlIGlucHV0cyBvZiBwYXJzZXIgbmVpZ2hib3IgYmxvY2tzICovCisJUkVHX1dSKGJwLCBUU0RNX1JFR19FTkFCTEVfSU4xLCAweDApOworCVJFR19XUihicCwgVENNX1JFR19QUlNfSUZFTiwgMHgwKTsKKwlSRUdfV1IoYnAsIENGQ19SRUdfREVCVUcwLCAweDEpOworCVJFR19XUihicCwgTklHX1JFR19QUlNfUkVRX0lOX0VOLCAweDApOworCisJLyogIFdyaXRlIDAgdG8gcGFyc2VyIGNyZWRpdHMgZm9yIENGQyBzZWFyY2ggcmVxdWVzdCAqLworCVJFR19XUihicCwgUFJTX1JFR19DRkNfU0VBUkNIX0lOSVRJQUxfQ1JFRElULCAweDApOworCisJLyogc2VuZCBFdGhlcm5ldCBwYWNrZXQgKi8KKwlibngyeF9sYl9wY2t0KGJwKTsKKworCS8qIFRPRE8gZG8gaSByZXNldCBOSUcgc3RhdGlzdGljPyAqLworCS8qIFdhaXQgdW50aWwgTklHIHJlZ2lzdGVyIHNob3dzIDEgcGFja2V0IG9mIHNpemUgMHgxMCAqLworCWNvdW50ID0gMTAwMCAqIGZhY3RvcjsKKwl3aGlsZSAoY291bnQpIHsKKworCQlibngyeF9yZWFkX2RtYWUoYnAsIE5JR19SRUdfU1RBVDJfQlJCX09DVEVULCAyKTsKKwkJdmFsID0gKmJueDJ4X3NwKGJwLCB3Yl9kYXRhWzBdKTsKKwkJaWYgKHZhbCA9PSAweDEwKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwKDEwKTsKKwkJY291bnQtLTsKKwl9CisJaWYgKHZhbCAhPSAweDEwKSB7CisJCUJOWDJYX0VSUigiTklHIHRpbWVvdXQgIHZhbCA9IDB4JXhcbiIsIHZhbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBXYWl0IHVudGlsIFBSUyByZWdpc3RlciBzaG93cyAxIHBhY2tldCAqLworCWNvdW50ID0gMTAwMCAqIGZhY3RvcjsKKwl3aGlsZSAoY291bnQpIHsKKwkJdmFsID0gUkVHX1JEKGJwLCBQUlNfUkVHX05VTV9PRl9QQUNLRVRTKTsKKwkJaWYgKHZhbCA9PSAxKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwKDEwKTsKKwkJY291bnQtLTsKKwl9CisJaWYgKHZhbCAhPSAweDEpIHsKKwkJQk5YMlhfRVJSKCJQUlMgdGltZW91dCB2YWwgPSAweCV4XG4iLCB2YWwpOworCQlyZXR1cm4gLTI7CisJfQorCisJLyogUmVzZXQgYW5kIGluaXQgQlJCLCBQUlMgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLCAweDAzKTsKKwltc2xlZXAoNTApOworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULCAweDAzKTsKKwltc2xlZXAoNTApOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJSQjFfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgUFJTX0JMT0NLLCBDT01NT05fU1RBR0UpOworCisJRFAoTkVUSUZfTVNHX0hXLCAicGFydDJcbiIpOworCisJLyogRGlzYWJsZSBpbnB1dHMgb2YgcGFyc2VyIG5laWdoYm9yIGJsb2NrcyAqLworCVJFR19XUihicCwgVFNETV9SRUdfRU5BQkxFX0lOMSwgMHgwKTsKKwlSRUdfV1IoYnAsIFRDTV9SRUdfUFJTX0lGRU4sIDB4MCk7CisJUkVHX1dSKGJwLCBDRkNfUkVHX0RFQlVHMCwgMHgxKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfUFJTX1JFUV9JTl9FTiwgMHgwKTsKKworCS8qIFdyaXRlIDAgdG8gcGFyc2VyIGNyZWRpdHMgZm9yIENGQyBzZWFyY2ggcmVxdWVzdCAqLworCVJFR19XUihicCwgUFJTX1JFR19DRkNfU0VBUkNIX0lOSVRJQUxfQ1JFRElULCAweDApOworCisJLyogc2VuZCAxMCBFdGhlcm5ldCBwYWNrZXRzICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWJueDJ4X2xiX3Bja3QoYnApOworCisJLyogV2FpdCB1bnRpbCBOSUcgcmVnaXN0ZXIgc2hvd3MgMTAgKyAxCisJICAgcGFja2V0cyBvZiBzaXplIDExKjB4MTAgPSAweGIwICovCisJY291bnQgPSAxMDAwICogZmFjdG9yOworCXdoaWxlIChjb3VudCkgeworCisJCWJueDJ4X3JlYWRfZG1hZShicCwgTklHX1JFR19TVEFUMl9CUkJfT0NURVQsIDIpOworCQl2YWwgPSAqYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOworCQlpZiAodmFsID09IDB4YjApCisJCQlicmVhazsKKworCQltc2xlZXAoMTApOworCQljb3VudC0tOworCX0KKwlpZiAodmFsICE9IDB4YjApIHsKKwkJQk5YMlhfRVJSKCJOSUcgdGltZW91dCAgdmFsID0gMHgleFxuIiwgdmFsKTsKKwkJcmV0dXJuIC0zOworCX0KKworCS8qIFdhaXQgdW50aWwgUFJTIHJlZ2lzdGVyIHNob3dzIDIgcGFja2V0cyAqLworCXZhbCA9IFJFR19SRChicCwgUFJTX1JFR19OVU1fT0ZfUEFDS0VUUyk7CisJaWYgKHZhbCAhPSAyKQorCQlCTlgyWF9FUlIoIlBSUyB0aW1lb3V0ICB2YWwgPSAweCV4XG4iLCB2YWwpOworCisJLyogV3JpdGUgMSB0byBwYXJzZXIgY3JlZGl0cyBmb3IgQ0ZDIHNlYXJjaCByZXF1ZXN0ICovCisJUkVHX1dSKGJwLCBQUlNfUkVHX0NGQ19TRUFSQ0hfSU5JVElBTF9DUkVESVQsIDB4MSk7CisKKwkvKiBXYWl0IHVudGlsIFBSUyByZWdpc3RlciBzaG93cyAzIHBhY2tldHMgKi8KKwltc2xlZXAoMTAgKiBmYWN0b3IpOworCS8qIFdhaXQgdW50aWwgTklHIHJlZ2lzdGVyIHNob3dzIDEgcGFja2V0IG9mIHNpemUgMHgxMCAqLworCXZhbCA9IFJFR19SRChicCwgUFJTX1JFR19OVU1fT0ZfUEFDS0VUUyk7CisJaWYgKHZhbCAhPSAzKQorCQlCTlgyWF9FUlIoIlBSUyB0aW1lb3V0ICB2YWwgPSAweCV4XG4iLCB2YWwpOworCisJLyogY2xlYXIgTklHIEVPUCBGSUZPICovCisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspCisJCVJFR19SRChicCwgTklHX1JFR19JTkdSRVNTX0VPUF9MQl9GSUZPKTsKKwl2YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfSU5HUkVTU19FT1BfTEJfRU1QVFkpOworCWlmICh2YWwgIT0gMSkgeworCQlCTlgyWF9FUlIoImNsZWFyIG9mIE5JRyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTQ7CisJfQorCisJLyogUmVzZXQgYW5kIGluaXQgQlJCLCBQUlMsIE5JRyAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIsIDB4MDMpOworCW1zbGVlcCg1MCk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9TRVQsIDB4MDMpOworCW1zbGVlcCg1MCk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQlJCMV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBQUlNfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisjaWZuZGVmIEJDTV9DTklDCisJLyogc2V0IE5JQyBtb2RlICovCisJUkVHX1dSKGJwLCBQUlNfUkVHX05JQ19NT0RFLCAxKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIGlucHV0cyBvZiBwYXJzZXIgbmVpZ2hib3IgYmxvY2tzICovCisJUkVHX1dSKGJwLCBUU0RNX1JFR19FTkFCTEVfSU4xLCAweDdmZmZmZmZmKTsKKwlSRUdfV1IoYnAsIFRDTV9SRUdfUFJTX0lGRU4sIDB4MSk7CisJUkVHX1dSKGJwLCBDRkNfUkVHX0RFQlVHMCwgMHgwKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfUFJTX1JFUV9JTl9FTiwgMHgxKTsKKworCURQKE5FVElGX01TR19IVywgImRvbmVcbiIpOworCisJcmV0dXJuIDA7IC8qIE9LICovCit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9ibG9ja3NfYXR0ZW50aW9uKHN0cnVjdCBibngyeCAqYnApCit7CisJUkVHX1dSKGJwLCBQWFBfUkVHX1BYUF9JTlRfTUFTS18wLCAwKTsKKwlSRUdfV1IoYnAsIFBYUF9SRUdfUFhQX0lOVF9NQVNLXzEsIDApOworCVJFR19XUihicCwgRE9SUV9SRUdfRE9SUV9JTlRfTUFTSywgMCk7CisJUkVHX1dSKGJwLCBDRkNfUkVHX0NGQ19JTlRfTUFTSywgMCk7CisJUkVHX1dSKGJwLCBRTV9SRUdfUU1fSU5UX01BU0ssIDApOworCVJFR19XUihicCwgVE1fUkVHX1RNX0lOVF9NQVNLLCAwKTsKKwlSRUdfV1IoYnAsIFhTRE1fUkVHX1hTRE1fSU5UX01BU0tfMCwgMCk7CisJUkVHX1dSKGJwLCBYU0RNX1JFR19YU0RNX0lOVF9NQVNLXzEsIDApOworCVJFR19XUihicCwgWENNX1JFR19YQ01fSU5UX01BU0ssIDApOworLyoJUkVHX1dSKGJwLCBYU0VNX1JFR19YU0VNX0lOVF9NQVNLXzAsIDApOyAqLworLyoJUkVHX1dSKGJwLCBYU0VNX1JFR19YU0VNX0lOVF9NQVNLXzEsIDApOyAqLworCVJFR19XUihicCwgVVNETV9SRUdfVVNETV9JTlRfTUFTS18wLCAwKTsKKwlSRUdfV1IoYnAsIFVTRE1fUkVHX1VTRE1fSU5UX01BU0tfMSwgMCk7CisJUkVHX1dSKGJwLCBVQ01fUkVHX1VDTV9JTlRfTUFTSywgMCk7CisvKglSRUdfV1IoYnAsIFVTRU1fUkVHX1VTRU1fSU5UX01BU0tfMCwgMCk7ICovCisvKglSRUdfV1IoYnAsIFVTRU1fUkVHX1VTRU1fSU5UX01BU0tfMSwgMCk7ICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX1VQQiArIFBCX1JFR19QQl9JTlRfTUFTSywgMCk7CisJUkVHX1dSKGJwLCBDU0RNX1JFR19DU0RNX0lOVF9NQVNLXzAsIDApOworCVJFR19XUihicCwgQ1NETV9SRUdfQ1NETV9JTlRfTUFTS18xLCAwKTsKKwlSRUdfV1IoYnAsIENDTV9SRUdfQ0NNX0lOVF9NQVNLLCAwKTsKKy8qCVJFR19XUihicCwgQ1NFTV9SRUdfQ1NFTV9JTlRfTUFTS18wLCAwKTsgKi8KKy8qCVJFR19XUihicCwgQ1NFTV9SRUdfQ1NFTV9JTlRfTUFTS18xLCAwKTsgKi8KKwlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkpCisJCVJFR19XUihicCwgUFhQMl9SRUdfUFhQMl9JTlRfTUFTS18wLCAweDU4MDAwMCk7CisJZWxzZQorCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BYUDJfSU5UX01BU0tfMCwgMHg0ODAwMDApOworCVJFR19XUihicCwgVFNETV9SRUdfVFNETV9JTlRfTUFTS18wLCAwKTsKKwlSRUdfV1IoYnAsIFRTRE1fUkVHX1RTRE1fSU5UX01BU0tfMSwgMCk7CisJUkVHX1dSKGJwLCBUQ01fUkVHX1RDTV9JTlRfTUFTSywgMCk7CisvKglSRUdfV1IoYnAsIFRTRU1fUkVHX1RTRU1fSU5UX01BU0tfMCwgMCk7ICovCisvKglSRUdfV1IoYnAsIFRTRU1fUkVHX1RTRU1fSU5UX01BU0tfMSwgMCk7ICovCisJUkVHX1dSKGJwLCBDRFVfUkVHX0NEVV9JTlRfTUFTSywgMCk7CisJUkVHX1dSKGJwLCBETUFFX1JFR19ETUFFX0lOVF9NQVNLLCAwKTsKKy8qCVJFR19XUihicCwgTUlTQ19SRUdfTUlTQ19JTlRfTUFTSywgMCk7ICovCisJUkVHX1dSKGJwLCBQQkZfUkVHX1BCRl9JTlRfTUFTSywgMFgxOCk7CQkvKiBiaXQgMyw0IG1hc2tlZCAqLworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MzIgYWRkcjsKKwl1MzIgbWFzazsKK30gYm54MnhfcGFyaXR5X21hc2tbXSA9IHsKKwl7UFhQX1JFR19QWFBfUFJUWV9NQVNLLCAweGZmZmZmZmZmfSwKKwl7UFhQMl9SRUdfUFhQMl9QUlRZX01BU0tfMCwgMHhmZmZmZmZmZn0sCisJe1BYUDJfUkVHX1BYUDJfUFJUWV9NQVNLXzEsIDB4ZmZmZmZmZmZ9LAorCXtIQ19SRUdfSENfUFJUWV9NQVNLLCAweGZmZmZmZmZmfSwKKwl7TUlTQ19SRUdfTUlTQ19QUlRZX01BU0ssIDB4ZmZmZmZmZmZ9LAorCXtRTV9SRUdfUU1fUFJUWV9NQVNLLCAweDB9LAorCXtET1JRX1JFR19ET1JRX1BSVFlfTUFTSywgMHgwfSwKKwl7R1JDQkFTRV9VUEIgKyBQQl9SRUdfUEJfUFJUWV9NQVNLLCAweDB9LAorCXtHUkNCQVNFX1hQQiArIFBCX1JFR19QQl9QUlRZX01BU0ssIDB4MH0sCisJe1NSQ19SRUdfU1JDX1BSVFlfTUFTSywgMHg0fSwgLyogYml0IDIgKi8KKwl7Q0RVX1JFR19DRFVfUFJUWV9NQVNLLCAweDB9LAorCXtDRkNfUkVHX0NGQ19QUlRZX01BU0ssIDB4MH0sCisJe0RCR19SRUdfREJHX1BSVFlfTUFTSywgMHgwfSwKKwl7RE1BRV9SRUdfRE1BRV9QUlRZX01BU0ssIDB4MH0sCisJe0JSQjFfUkVHX0JSQjFfUFJUWV9NQVNLLCAweDB9LAorCXtQUlNfUkVHX1BSU19QUlRZX01BU0ssICgxPDw2KX0sLyogYml0IDYgKi8KKwl7VFNETV9SRUdfVFNETV9QUlRZX01BU0ssIDB4MTh9LC8qIGJpdCAzLDQgKi8KKwl7Q1NETV9SRUdfQ1NETV9QUlRZX01BU0ssIDB4OH0sCS8qIGJpdCAzICovCisJe1VTRE1fUkVHX1VTRE1fUFJUWV9NQVNLLCAweDM4fSwvKiBiaXQgMyw0LDUgKi8KKwl7WFNETV9SRUdfWFNETV9QUlRZX01BU0ssIDB4OH0sCS8qIGJpdCAzICovCisJe1RTRU1fUkVHX1RTRU1fUFJUWV9NQVNLXzAsIDB4MH0sCisJe1RTRU1fUkVHX1RTRU1fUFJUWV9NQVNLXzEsIDB4MH0sCisJe1VTRU1fUkVHX1VTRU1fUFJUWV9NQVNLXzAsIDB4MH0sCisJe1VTRU1fUkVHX1VTRU1fUFJUWV9NQVNLXzEsIDB4MH0sCisJe0NTRU1fUkVHX0NTRU1fUFJUWV9NQVNLXzAsIDB4MH0sCisJe0NTRU1fUkVHX0NTRU1fUFJUWV9NQVNLXzEsIDB4MH0sCisJe1hTRU1fUkVHX1hTRU1fUFJUWV9NQVNLXzAsIDB4MH0sCisJe1hTRU1fUkVHX1hTRU1fUFJUWV9NQVNLXzEsIDB4MH0KK307CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9ibG9ja3NfcGFyaXR5KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGksIG1hc2tfYXJyX2xlbiA9CisJCXNpemVvZihibngyeF9wYXJpdHlfbWFzaykvKHNpemVvZihibngyeF9wYXJpdHlfbWFza1swXSkpOworCisJZm9yIChpID0gMDsgaSA8IG1hc2tfYXJyX2xlbjsgaSsrKQorCQlSRUdfV1IoYnAsIGJueDJ4X3Bhcml0eV9tYXNrW2ldLmFkZHIsCisJCQlibngyeF9wYXJpdHlfbWFza1tpXS5tYXNrKTsKK30KKworCitzdGF0aWMgdm9pZCBibngyeF9yZXNldF9jb21tb24oc3RydWN0IGJueDJ4ICpicCkKK3sKKwkvKiByZXNldF9jb21tb24gKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLAorCSAgICAgICAweGQzZmZmZjdmKTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLCAweDE0MDMpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9pbml0X3B4cChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUxNiBkZXZjdGw7CisJaW50IHJfb3JkZXIsIHdfb3JkZXI7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChicC0+cGRldiwKKwkJCSAgICAgYnAtPnBjaWVfY2FwICsgUENJX0VYUF9ERVZDVEwsICZkZXZjdGwpOworCURQKE5FVElGX01TR19IVywgInJlYWQgMHgleCBmcm9tIGRldmN0bFxuIiwgZGV2Y3RsKTsKKwl3X29yZGVyID0gKChkZXZjdGwgJiBQQ0lfRVhQX0RFVkNUTF9QQVlMT0FEKSA+PiA1KTsKKwlpZiAoYnAtPm1ycnMgPT0gLTEpCisJCXJfb3JkZXIgPSAoKGRldmN0bCAmIFBDSV9FWFBfREVWQ1RMX1JFQURSUSkgPj4gMTIpOworCWVsc2UgeworCQlEUChORVRJRl9NU0dfSFcsICJmb3JjZSByZWFkIG9yZGVyIHRvICVkXG4iLCBicC0+bXJycyk7CisJCXJfb3JkZXIgPSBicC0+bXJyczsKKwl9CisKKwlibngyeF9pbml0X3B4cF9hcmIoYnAsIHJfb3JkZXIsIHdfb3JkZXIpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXR1cF9mYW5fZmFpbHVyZV9kZXRlY3Rpb24oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaXNfcmVxdWlyZWQ7CisJdTMyIHZhbDsKKwlpbnQgcG9ydDsKKworCWlmIChCUF9OT01DUChicCkpCisJCXJldHVybjsKKworCWlzX3JlcXVpcmVkID0gMDsKKwl2YWwgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5jb25maWcyKSAmCisJICAgICAgU0hBUkVEX0hXX0NGR19GQU5fRkFJTFVSRV9NQVNLOworCisJaWYgKHZhbCA9PSBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX0VOQUJMRUQpCisJCWlzX3JlcXVpcmVkID0gMTsKKworCS8qCisJICogVGhlIGZhbiBmYWlsdXJlIG1lY2hhbmlzbSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIFBIWSB0eXBlIHNpbmNlCisJICogdGhlIHBvd2VyIGNvbnN1bXB0aW9uIG9mIHRoZSBib2FyZCBpcyBhZmZlY3RlZCBieSB0aGUgUEhZLiBDdXJyZW50bHksCisJICogZmFuIGlzIHJlcXVpcmVkIGZvciBtb3N0IGRlc2lnbnMgd2l0aCBTRlg3MTAxLCBCQ004NzI3IGFuZCBCQ004NDgxLgorCSAqLworCWVsc2UgaWYgKHZhbCA9PSBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX1BIWV9UWVBFKQorCQlmb3IgKHBvcnQgPSBQT1JUXzA7IHBvcnQgPCBQT1JUX01BWDsgcG9ydCsrKSB7CisJCQl1MzIgcGh5X3R5cGUgPQorCQkJCVNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS4KKwkJCQkJIGV4dGVybmFsX3BoeV9jb25maWcpICYKKwkJCQlQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9NQVNLOworCQkJaXNfcmVxdWlyZWQgfD0KKwkJCQkoKHBoeV90eXBlID09CisJCQkJICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxKSB8fAorCQkJCSAocGh5X3R5cGUgPT0KKwkJCQkgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcpIHx8CisJCQkJIChwaHlfdHlwZSA9PQorCQkJCSAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSkpOworCQl9CisKKwlEUChORVRJRl9NU0dfSFcsICJmYW4gZGV0ZWN0aW9uIHNldHRpbmc6ICVkXG4iLCBpc19yZXF1aXJlZCk7CisKKwlpZiAoaXNfcmVxdWlyZWQgPT0gMCkKKwkJcmV0dXJuOworCisJLyogRmFuIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5IFNQSU8gNSAqLworCWJueDJ4X3NldF9zcGlvKGJwLCBNSVNDX1JFR0lTVEVSU19TUElPXzUsCisJCSAgICAgICBNSVNDX1JFR0lTVEVSU19TUElPX0lOUFVUX0hJX1opOworCisJLyogc2V0IHRvIGFjdGl2ZSBsb3cgbW9kZSAqLworCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfU1BJT19JTlQpOworCXZhbCB8PSAoKDEgPDwgTUlTQ19SRUdJU1RFUlNfU1BJT181KSA8PAorCQkJCQlNSVNDX1JFR0lTVEVSU19TUElPX0lOVF9PTERfU0VUX1BPUyk7CisJUkVHX1dSKGJwLCBNSVNDX1JFR19TUElPX0lOVCwgdmFsKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHQgdG8gc2lnbmFsIHRoZSBJR1UgKi8KKwl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1NQSU9fRVZFTlRfRU4pOworCXZhbCB8PSAoMSA8PCBNSVNDX1JFR0lTVEVSU19TUElPXzUpOworCVJFR19XUihicCwgTUlTQ19SRUdfU1BJT19FVkVOVF9FTiwgdmFsKTsKK30KKworc3RhdGljIGludCBibngyeF9pbml0X2NvbW1vbihzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWwsIGk7CisjaWZkZWYgQkNNX0NOSUMKKwl1MzIgd2Jfd3JpdGVbMl07CisjZW5kaWYKKworCURQKEJOWDJYX01TR19NQ1AsICJzdGFydGluZyBjb21tb24gaW5pdCAgZnVuYyAlZFxuIiwgQlBfRlVOQyhicCkpOworCisJYm54MnhfcmVzZXRfY29tbW9uKGJwKTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1NFVCwgMHhmZmZmZmZmZik7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9TRVQsIDB4ZmZmYyk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBNSVNDX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWlmIChDSElQX0lTX0UxSChicCkpCisJCVJFR19XUihicCwgTUlTQ19SRUdfRTFITUZfTU9ERSwgSVNfRTFITUYoYnApKTsKKworCVJFR19XUihicCwgTUlTQ19SRUdfTENQTExfQ1RSTF9SRUdfMiwgMHgxMDApOworCW1zbGVlcCgzMCk7CisJUkVHX1dSKGJwLCBNSVNDX1JFR19MQ1BMTF9DVFJMX1JFR18yLCAweDApOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgUFhQX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWlmIChDSElQX0lTX0UxKGJwKSkgeworCQkvKiBlbmFibGUgSFcgaW50ZXJydXB0IGZyb20gUFhQIG9uIFVTRE0gb3ZlcmZsb3cKKwkJICAgYml0IDE2IG9uIElOVF9NQVNLXzAgKi8KKwkJUkVHX1dSKGJwLCBQWFBfUkVHX1BYUF9JTlRfTUFTS18wLCAwKTsKKwl9CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFAyX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfcHhwKGJwKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCVJFR19XUihicCwgUFhQMl9SRUdfUlFfUU1fRU5ESUFOX00sIDEpOworCVJFR19XUihicCwgUFhQMl9SRUdfUlFfVE1fRU5ESUFOX00sIDEpOworCVJFR19XUihicCwgUFhQMl9SRUdfUlFfU1JDX0VORElBTl9NLCAxKTsKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0NEVV9FTkRJQU5fTSwgMSk7CisJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9EQkdfRU5ESUFOX00sIDEpOworCS8qIG1ha2Ugc3VyZSB0aGlzIHZhbHVlIGlzIDAgKi8KKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0hDX0VORElBTl9NLCAwKTsKKworLyoJUkVHX1dSKGJwLCBQWFAyX1JFR19SRF9QQkZfU1dBUF9NT0RFLCAxKTsgKi8KKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX1FNX1NXQVBfTU9ERSwgMSk7CisJUkVHX1dSKGJwLCBQWFAyX1JFR19SRF9UTV9TV0FQX01PREUsIDEpOworCVJFR19XUihicCwgUFhQMl9SRUdfUkRfU1JDX1NXQVBfTU9ERSwgMSk7CisJUkVHX1dSKGJwLCBQWFAyX1JFR19SRF9DRFVSRF9TV0FQX01PREUsIDEpOworI2VuZGlmCisKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0NEVV9QX1NJWkUsIDIpOworI2lmZGVmIEJDTV9DTklDCisJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9UTV9QX1NJWkUsIDUpOworCVJFR19XUihicCwgUFhQMl9SRUdfUlFfUU1fUF9TSVpFLCA1KTsKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1NSQ19QX1NJWkUsIDUpOworI2VuZGlmCisKKwlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkgJiYgQ0hJUF9JU19FMUgoYnApKQorCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BHTF9UQUdTX0xJTUlULCAweDEpOworCisJLyogbGV0IHRoZSBIVyBkbyBpdCdzIG1hZ2ljIC4uLiAqLworCW1zbGVlcCgxMDApOworCS8qIGZpbmlzaCBQWFAgaW5pdCAqLworCXZhbCA9IFJFR19SRChicCwgUFhQMl9SRUdfUlFfQ0ZHX0RPTkUpOworCWlmICh2YWwgIT0gMSkgeworCQlCTlgyWF9FUlIoIlBYUDIgQ0ZHIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXZhbCA9IFJFR19SRChicCwgUFhQMl9SRUdfUkRfSU5JVF9ET05FKTsKKwlpZiAodmFsICE9IDEpIHsKKwkJQk5YMlhfRVJSKCJQWFAyIFJEX0lOSVQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0RJU0FCTEVfSU5QVVRTLCAwKTsKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX0RJU0FCTEVfSU5QVVRTLCAwKTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIERNQUVfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisKKwkvKiBjbGVhbiB0aGUgRE1BRSBtZW1vcnkgKi8KKwlicC0+ZG1hZV9yZWFkeSA9IDE7CisJYm54MnhfaW5pdF9maWxsKGJwLCBUU0VNX1JFR19QUkFNLCAwLCA4KTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIFRDTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBVQ01fQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQ0NNX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIFhDTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKworCWJueDJ4X3JlYWRfZG1hZShicCwgWFNFTV9SRUdfUEFTU0lWRV9CVUZGRVIsIDMpOworCWJueDJ4X3JlYWRfZG1hZShicCwgQ1NFTV9SRUdfUEFTU0lWRV9CVUZGRVIsIDMpOworCWJueDJ4X3JlYWRfZG1hZShicCwgVFNFTV9SRUdfUEFTU0lWRV9CVUZGRVIsIDMpOworCWJueDJ4X3JlYWRfZG1hZShicCwgVVNFTV9SRUdfUEFTU0lWRV9CVUZGRVIsIDMpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgUU1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisKKyNpZmRlZiBCQ01fQ05JQworCXdiX3dyaXRlWzBdID0gMDsKKwl3Yl93cml0ZVsxXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJUkVHX1dSKGJwLCBRTV9SRUdfQkFTRUFERFIgKyBpKjQsIDEwMjQgKiA0ICogKGklMTYpKTsKKwkJYm54MnhfaW5pdF9pbmRfd3IoYnAsIFFNX1JFR19QVFJUQkwgKyBpKjgsIHdiX3dyaXRlLCAyKTsKKworCQlpZiAoQ0hJUF9JU19FMUgoYnApKSB7CisJCQlSRUdfV1IoYnAsIFFNX1JFR19CQVNFQUREUl9FWFRfQSArIGkqNCwgMTAyNCo0KihpJTE2KSk7CisJCQlibngyeF9pbml0X2luZF93cihicCwgUU1fUkVHX1BUUlRCTF9FWFRfQSArIGkqOCwKKwkJCQkJICB3Yl93cml0ZSwgMik7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBzb2Z0IHJlc2V0IHB1bHNlICovCisJUkVHX1dSKGJwLCBRTV9SRUdfU09GVF9SRVNFVCwgMSk7CisJUkVHX1dSKGJwLCBRTV9SRUdfU09GVF9SRVNFVCwgMCk7CisKKyNpZmRlZiBCQ01fQ05JQworCWJueDJ4X2luaXRfYmxvY2soYnAsIFRJTUVSU19CTE9DSywgQ09NTU9OX1NUQUdFKTsKKyNlbmRpZgorCisJYm54MnhfaW5pdF9ibG9jayhicCwgRFFfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJUkVHX1dSKGJwLCBET1JRX1JFR19EUE1fQ0lEX09GU1QsIEJDTV9QQUdFX1NISUZUKTsKKwlpZiAoIUNISVBfUkVWX0lTX1NMT1coYnApKSB7CisJCS8qIGVuYWJsZSBodyBpbnRlcnJ1cHQgZnJvbSBkb29yYmVsbCBRICovCisJCVJFR19XUihicCwgRE9SUV9SRUdfRE9SUV9JTlRfTUFTSywgMCk7CisJfQorCisJYm54MnhfaW5pdF9ibG9jayhicCwgQlJCMV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBQUlNfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJUkVHX1dSKGJwLCBQUlNfUkVHX0FfUFJTVV8yMCwgMHhmKTsKKyNpZm5kZWYgQkNNX0NOSUMKKwkvKiBzZXQgTklDIG1vZGUgKi8KKwlSRUdfV1IoYnAsIFBSU19SRUdfTklDX01PREUsIDEpOworI2VuZGlmCisJaWYgKENISVBfSVNfRTFIKGJwKSkKKwkJUkVHX1dSKGJwLCBQUlNfUkVHX0UxSE9WX01PREUsIElTX0UxSE1GKGJwKSk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBUU0RNX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRE1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgVVNETV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBYU0RNX0JMT0NLLCBDT01NT05fU1RBR0UpOworCisJYm54MnhfaW5pdF9maWxsKGJwLCBUU0VNX1JFR19GQVNUX01FTU9SWSwgMCwgU1RPUk1fSU5UTUVNX1NJWkUoYnApKTsKKwlibngyeF9pbml0X2ZpbGwoYnAsIFVTRU1fUkVHX0ZBU1RfTUVNT1JZLCAwLCBTVE9STV9JTlRNRU1fU0laRShicCkpOworCWJueDJ4X2luaXRfZmlsbChicCwgQ1NFTV9SRUdfRkFTVF9NRU1PUlksIDAsIFNUT1JNX0lOVE1FTV9TSVpFKGJwKSk7CisJYm54MnhfaW5pdF9maWxsKGJwLCBYU0VNX1JFR19GQVNUX01FTU9SWSwgMCwgU1RPUk1fSU5UTUVNX1NJWkUoYnApKTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRU1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgVVNFTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBDU0VNX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisKKwkvKiBzeW5jIHNlbWkgcnRjICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9DTEVBUiwKKwkgICAgICAgMHg4MDAwMDAwMCk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9TRVQsCisJICAgICAgIDB4ODAwMDAwMDApOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgVVBCX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIFhQQl9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBQQkZfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisKKwlSRUdfV1IoYnAsIFNSQ19SRUdfU09GVF9SU1QsIDEpOworCWZvciAoaSA9IFNSQ19SRUdfS0VZUlNTMF8wOyBpIDw9IFNSQ19SRUdfS0VZUlNTMV85OyBpICs9IDQpCisJCVJFR19XUihicCwgaSwgcmFuZG9tMzIoKSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgU1JDSF9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKyNpZmRlZiBCQ01fQ05JQworCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfMCwgMHg2MzI4NTY3Mik7CisJUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF8xLCAweDI0YjhmMmNjKTsKKwlSRUdfV1IoYnAsIFNSQ19SRUdfS0VZU0VBUkNIXzIsIDB4MjIzYWVmOWIpOworCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfMywgMHgyNjAwMWUzYSk7CisJUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF80LCAweDdhZTkxMTE2KTsKKwlSRUdfV1IoYnAsIFNSQ19SRUdfS0VZU0VBUkNIXzUsIDB4NWNlNTIzMGIpOworCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfNiwgMHgyOThkOGFkZik7CisJUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF83LCAweDZlYjBmZjA5KTsKKwlSRUdfV1IoYnAsIFNSQ19SRUdfS0VZU0VBUkNIXzgsIDB4MTgzMGY4MmYpOworCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfOSwgMHgwMWU0NmJlNyk7CisjZW5kaWYKKwlSRUdfV1IoYnAsIFNSQ19SRUdfU09GVF9SU1QsIDApOworCisJaWYgKHNpemVvZih1bmlvbiBjZHVfY29udGV4dCkgIT0gMTAyNCkKKwkJLyogd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IGEgY29udGV4dCBpcyAxMDI0IGJ5dGVzICovCisJCWRldl9hbGVydCgmYnAtPnBkZXYtPmRldiwgInBsZWFzZSBhZGp1c3QgdGhlIHNpemUgIgorCQkJCQkgICJvZiBjZHVfY29udGV4dCglbGQpXG4iLAorCQkJIChsb25nKXNpemVvZih1bmlvbiBjZHVfY29udGV4dCkpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgQ0RVX0JMT0NLLCBDT01NT05fU1RBR0UpOworCXZhbCA9ICg0IDw8IDI0KSArICgwIDw8IDEyKSArIDEwMjQ7CisJUkVHX1dSKGJwLCBDRFVfUkVHX0NEVV9HTE9CQUxfUEFSQU1TLCB2YWwpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgQ0ZDX0JMT0NLLCBDT01NT05fU1RBR0UpOworCVJFR19XUihicCwgQ0ZDX1JFR19JTklUX1JFRywgMHg3RkYpOworCS8qIGVuYWJsZSBjb250ZXh0IHZhbGlkYXRpb24gaW50ZXJydXB0IGZyb20gQ0ZDICovCisJUkVHX1dSKGJwLCBDRkNfUkVHX0NGQ19JTlRfTUFTSywgMCk7CisKKwkvKiBzZXQgdGhlIHRocmVzaG9sZHMgdG8gcHJldmVudCBDRkMvQ0RVIHJhY2UgKi8KKwlSRUdfV1IoYnAsIENGQ19SRUdfREVCVUcwLCAweDIwMDIwMDAwKTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIEhDX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQUVVX0JMT0NLLCBDT01NT05fU1RBR0UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgUFhQQ1NfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJLyogUmVzZXQgUENJRSBlcnJvcnMgZm9yIGRlYnVnICovCisJUkVHX1dSKGJwLCAweDI4MTQsIDB4ZmZmZmZmZmYpOworCVJFR19XUihicCwgMHgzODIwLCAweGZmZmZmZmZmKTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMwX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMxX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIERCVV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBEQkdfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBOSUdfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJaWYgKENISVBfSVNfRTFIKGJwKSkgeworCQlSRUdfV1IoYnAsIE5JR19SRUdfTExIX01GX01PREUsIElTX0UxSE1GKGJwKSk7CisJCVJFR19XUihicCwgTklHX1JFR19MTEhfRTFIT1ZfTU9ERSwgSVNfRTFITUYoYnApKTsKKwl9CisKKwlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCW1zbGVlcCgyMDApOworCisJLyogZmluaXNoIENGQyBpbml0ICovCisJdmFsID0gcmVnX3BvbGwoYnAsIENGQ19SRUdfTExfSU5JVF9ET05FLCAxLCAxMDAsIDEwKTsKKwlpZiAodmFsICE9IDEpIHsKKwkJQk5YMlhfRVJSKCJDRkMgTExfSU5JVCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwl2YWwgPSByZWdfcG9sbChicCwgQ0ZDX1JFR19BQ19JTklUX0RPTkUsIDEsIDEwMCwgMTApOworCWlmICh2YWwgIT0gMSkgeworCQlCTlgyWF9FUlIoIkNGQyBBQ19JTklUIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXZhbCA9IHJlZ19wb2xsKGJwLCBDRkNfUkVHX0NBTV9JTklUX0RPTkUsIDEsIDEwMCwgMTApOworCWlmICh2YWwgIT0gMSkgeworCQlCTlgyWF9FUlIoIkNGQyBDQU1fSU5JVCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlSRUdfV1IoYnAsIENGQ19SRUdfREVCVUcwLCAwKTsKKworCS8qIHJlYWQgTklHIHN0YXRpc3RpYworCSAgIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBmaXJzdCB1cCBzaW5jZSBwb3dlcnVwICovCisJYm54MnhfcmVhZF9kbWFlKGJwLCBOSUdfUkVHX1NUQVQyX0JSQl9PQ1RFVCwgMik7CisJdmFsID0gKmJueDJ4X3NwKGJwLCB3Yl9kYXRhWzBdKTsKKworCS8qIGRvIGludGVybmFsIG1lbW9yeSBzZWxmIHRlc3QgKi8KKwlpZiAoKENISVBfSVNfRTEoYnApKSAmJiAodmFsID09IDApICYmIGJueDJ4X2ludF9tZW1fdGVzdChicCkpIHsKKwkJQk5YMlhfRVJSKCJpbnRlcm5hbCBtZW0gc2VsZiB0ZXN0IGZhaWxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc3dpdGNoIChYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpKSB7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyOgorCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCQlicC0+cG9ydC5uZWVkX2h3X2xvY2sgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWJueDJ4X3NldHVwX2Zhbl9mYWlsdXJlX2RldGVjdGlvbihicCk7CisKKwkvKiBjbGVhciBQWFAyIGF0dGVudGlvbnMgKi8KKwlSRUdfUkQoYnAsIFBYUDJfUkVHX1BYUDJfSU5UX1NUU19DTFJfMCk7CisKKwllbmFibGVfYmxvY2tzX2F0dGVudGlvbihicCk7CisJaWYgKENISVBfUEFSSVRZX1NVUFBPUlRFRChicCkpCisJCWVuYWJsZV9ibG9ja3NfcGFyaXR5KGJwKTsKKworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCQlibngyeF9jb21tb25faW5pdF9waHkoYnAsIGJwLT5jb21tb24uc2htZW1fYmFzZSk7CisJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCX0gZWxzZQorCQlCTlgyWF9FUlIoIkJvb3Rjb2RlIGlzIG1pc3NpbmcgLSBjYW4gbm90IGluaXRpYWxpemUgbGlua1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9pbml0X3BvcnQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCBpbml0X3N0YWdlID0gcG9ydCA/IFBPUlQxX1NUQUdFIDogUE9SVDBfU1RBR0U7CisJdTMyIGxvdywgaGlnaDsKKwl1MzIgdmFsOworCisJRFAoQk5YMlhfTVNHX01DUCwgInN0YXJ0aW5nIHBvcnQgaW5pdCAgcG9ydCAlZFxuIiwgcG9ydCk7CisKKwlSRUdfV1IoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsIDApOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgUFhQX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFAyX0JMT0NLLCBpbml0X3N0YWdlKTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIFRDTV9CTE9DSywgaW5pdF9zdGFnZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgVUNNX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBDQ01fQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIFhDTV9CTE9DSywgaW5pdF9zdGFnZSk7CisKKyNpZmRlZiBCQ01fQ05JQworCVJFR19XUihicCwgUU1fUkVHX0NPTk5OVU1fMCArIHBvcnQqNCwgMTAyNC8xNiAtIDEpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgVElNRVJTX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlSRUdfV1IoYnAsIFRNX1JFR19MSU4wX1NDQU5fVElNRSArIHBvcnQqNCwgMjApOworCVJFR19XUihicCwgVE1fUkVHX0xJTjBfTUFYX0FDVElWRV9DSUQgKyBwb3J0KjQsIDMxKTsKKyNlbmRpZgorCisJYm54MnhfaW5pdF9ibG9jayhicCwgRFFfQkxPQ0ssIGluaXRfc3RhZ2UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgQlJCMV9CTE9DSywgaW5pdF9zdGFnZSk7CisJaWYgKENISVBfUkVWX0lTX1NMT1coYnApICYmICFDSElQX0lTX0UxSChicCkpIHsKKwkJLyogbm8gcGF1c2UgZm9yIGVtdWxhdGlvbiBhbmQgRlBHQSAqLworCQlsb3cgPSAwOworCQloaWdoID0gNTEzOworCX0gZWxzZSB7CisJCWlmIChJU19FMUhNRihicCkpCisJCQlsb3cgPSAoKGJwLT5mbGFncyAmIE9ORV9QT1JUX0ZMQUcpID8gMTYwIDogMjQ2KTsKKwkJZWxzZSBpZiAoYnAtPmRldi0+bXR1ID4gNDA5NikgeworCQkJaWYgKGJwLT5mbGFncyAmIE9ORV9QT1JUX0ZMQUcpCisJCQkJbG93ID0gMTYwOworCQkJZWxzZSB7CisJCQkJdmFsID0gYnAtPmRldi0+bXR1OworCQkJCS8qICgyNCoxMDI0ICsgdmFsKjQpLzI1NiAqLworCQkJCWxvdyA9IDk2ICsgKHZhbC82NCkgKyAoKHZhbCAlIDY0KSA/IDEgOiAwKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlsb3cgPSAoKGJwLT5mbGFncyAmIE9ORV9QT1JUX0ZMQUcpID8gODAgOiAxNjApOworCQloaWdoID0gbG93ICsgNTY7CS8qIDE0KjEwMjQvMjU2ICovCisJfQorCVJFR19XUihicCwgQlJCMV9SRUdfUEFVU0VfTE9XX1RIUkVTSE9MRF8wICsgcG9ydCo0LCBsb3cpOworCVJFR19XUihicCwgQlJCMV9SRUdfUEFVU0VfSElHSF9USFJFU0hPTERfMCArIHBvcnQqNCwgaGlnaCk7CisKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIFBSU19CTE9DSywgaW5pdF9zdGFnZSk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBUU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBDU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBVU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBYU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKKworCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIFVTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgVVBCX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBYUEJfQkxPQ0ssIGluaXRfc3RhZ2UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgUEJGX0JMT0NLLCBpbml0X3N0YWdlKTsKKworCS8qIGNvbmZpZ3VyZSBQQkYgdG8gd29yayB3aXRob3V0IFBBVVNFIG10dSA5MDAwICovCisJUkVHX1dSKGJwLCBQQkZfUkVHX1AwX1BBVVNFX0VOQUJMRSArIHBvcnQqNCwgMCk7CisKKwkvKiB1cGRhdGUgdGhyZXNob2xkICovCisJUkVHX1dSKGJwLCBQQkZfUkVHX1AwX0FSQl9USFJTSCArIHBvcnQqNCwgKDkwNDAvMTYpKTsKKwkvKiB1cGRhdGUgaW5pdCBjcmVkaXQgKi8KKwlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfSU5JVF9DUkQgKyBwb3J0KjQsICg5MDQwLzE2KSArIDU1MyAtIDIyKTsKKworCS8qIHByb2JlIGNoYW5nZXMgKi8KKwlSRUdfV1IoYnAsIFBCRl9SRUdfSU5JVF9QMCArIHBvcnQqNCwgMSk7CisJbXNsZWVwKDUpOworCVJFR19XUihicCwgUEJGX1JFR19JTklUX1AwICsgcG9ydCo0LCAwKTsKKworI2lmZGVmIEJDTV9DTklDCisJYm54MnhfaW5pdF9ibG9jayhicCwgU1JDSF9CTE9DSywgaW5pdF9zdGFnZSk7CisjZW5kaWYKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBDRFVfQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIENGQ19CTE9DSywgaW5pdF9zdGFnZSk7CisKKwlpZiAoQ0hJUF9JU19FMShicCkpIHsKKwkJUkVHX1dSKGJwLCBIQ19SRUdfTEVBRElOR19FREdFXzAgKyBwb3J0KjgsIDApOworCQlSRUdfV1IoYnAsIEhDX1JFR19UUkFJTElOR19FREdFXzAgKyBwb3J0KjgsIDApOworCX0KKwlibngyeF9pbml0X2Jsb2NrKGJwLCBIQ19CTE9DSywgaW5pdF9zdGFnZSk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBNSVNDX0FFVV9CTE9DSywgaW5pdF9zdGFnZSk7CisJLyogaW5pdCBhZXVfbWFza19hdHRuX2Z1bmNfMC8xOgorCSAqICAtIFNGIG1vZGU6IGJpdHMgMy03IGFyZSBtYXNrZWQuIG9ubHkgYml0cyAwLTIgYXJlIGluIHVzZQorCSAqICAtIE1GIG1vZGU6IGJpdCAzIGlzIG1hc2tlZC4gYml0cyAwLTIgYXJlIGluIHVzZSBhcyBpbiBTRgorCSAqICAgICAgICAgICAgIGJpdHMgNC03IGFyZSB1c2VkIGZvciAicGVyIHZuIGdyb3VwIGF0dGVudGlvbiIgKi8KKwlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18wICsgcG9ydCo0LAorCSAgICAgICAoSVNfRTFITUYoYnApID8gMHhGNyA6IDB4NykpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgUFhQQ1NfQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMwX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBFTUFDMV9CTE9DSywgaW5pdF9zdGFnZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgREJVX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBEQkdfQkxPQ0ssIGluaXRfc3RhZ2UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgTklHX0JMT0NLLCBpbml0X3N0YWdlKTsKKworCVJFR19XUihicCwgTklHX1JFR19YR1hTX1NFUkRFUzBfTU9ERV9TRUwgKyBwb3J0KjQsIDEpOworCisJaWYgKENISVBfSVNfRTFIKGJwKSkgeworCQkvKiAweDIgZGlzYWJsZSBlMWhvdiwgMHgxIGVuYWJsZSAqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX01GICsgcG9ydCo0LAorCQkgICAgICAgKElTX0UxSE1GKGJwKSA/IDB4MSA6IDB4MikpOworCisJCXsKKwkJCVJFR19XUihicCwgTklHX1JFR19MTEZDX0VOQUJMRV8wICsgcG9ydCo0LCAwKTsKKwkJCVJFR19XUihicCwgTklHX1JFR19MTEZDX09VVF9FTl8wICsgcG9ydCo0LCAwKTsKKwkJCVJFR19XUihicCwgTklHX1JFR19QQVVTRV9FTkFCTEVfMCArIHBvcnQqNCwgMSk7CisJCX0KKwl9CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBNQ1BfQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIERNQUVfQkxPQ0ssIGluaXRfc3RhZ2UpOworCisJc3dpdGNoIChYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpKSB7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2OgorCQl7CisJCXUzMiBzd2FwX3ZhbCwgc3dhcF9vdmVycmlkZSwgYWV1X2dwaW9fbWFzaywgb2Zmc2V0OworCisJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzMsCisJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlBVVF9ISV9aLCBwb3J0KTsKKworCQkvKiBUaGUgR1BJTyBzaG91bGQgYmUgc3dhcHBlZCBpZiB0aGUgc3dhcCByZWdpc3RlciBpcworCQkgICBzZXQgYW5kIGFjdGl2ZSAqLworCQlzd2FwX3ZhbCA9IFJFR19SRChicCwgTklHX1JFR19QT1JUX1NXQVApOworCQlzd2FwX292ZXJyaWRlID0gUkVHX1JEKGJwLCBOSUdfUkVHX1NUUkFQX09WRVJSSURFKTsKKworCQkvKiBTZWxlY3QgZnVuY3Rpb24gdXBvbiBwb3J0LXN3YXAgY29uZmlndXJhdGlvbiAqLworCQlpZiAocG9ydCA9PSAwKSB7CisJCQlvZmZzZXQgPSBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzBfT1VUXzA7CisJCQlhZXVfZ3Bpb19tYXNrID0gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpID8KKwkJCQlBRVVfSU5QVVRTX0FUVE5fQklUU19HUElPM19GVU5DVElPTl8xIDoKKwkJCQlBRVVfSU5QVVRTX0FUVE5fQklUU19HUElPM19GVU5DVElPTl8wOworCQl9IGVsc2UgeworCQkJb2Zmc2V0ID0gTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18xX09VVF8wOworCQkJYWV1X2dwaW9fbWFzayA9IChzd2FwX3ZhbCAmJiBzd2FwX292ZXJyaWRlKSA/CisJCQkJQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMCA6CisJCQkJQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMTsKKwkJfQorCQl2YWwgPSBSRUdfUkQoYnAsIG9mZnNldCk7CisJCS8qIGFkZCBHUElPMyB0byBncm91cCAqLworCQl2YWwgfD0gYWV1X2dwaW9fbWFzazsKKwkJUkVHX1dSKGJwLCBvZmZzZXQsIHZhbCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCQkvKiBhZGQgU1BJTyA1IHRvIGdyb3VwIDAgKi8KKwkJeworCQl1MzIgcmVnX2FkZHIgPSAocG9ydCA/IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMV9PVVRfMCA6CisJCQkJICAgICAgIE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMCk7CisJCXZhbCA9IFJFR19SRChicCwgcmVnX2FkZHIpOworCQl2YWwgfD0gQUVVX0lOUFVUU19BVFROX0JJVFNfU1BJTzU7CisJCVJFR19XUihicCwgcmVnX2FkZHIsIHZhbCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlibngyeF9fbGlua19yZXNldChicCk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBJTFRfUEVSX0ZVTkMJCSg3NjgvMikKKyNkZWZpbmUgRlVOQ19JTFRfQkFTRShmdW5jKQkoZnVuYyAqIElMVF9QRVJfRlVOQykKKy8qIHRoZSBwaHlzIGFkZHJlc3MgaXMgc2hpZnRlZCByaWdodCAxMiBiaXRzIGFuZCBoYXMgYW4gYWRkZWQKKyAgIDE9dmFsaWQgYml0IGFkZGVkIHRvIHRoZSA1M3JkIGJpdAorICAgdGhlbiBzaW5jZSB0aGlzIGlzIGEgd2lkZSByZWdpc3RlcihUTSkKKyAgIHdlIHNwbGl0IGl0IGludG8gdHdvIDMyIGJpdCB3cml0ZXMKKyAqLworI2RlZmluZSBPTkNISVBfQUREUjEoeCkJCSgodTMyKSgoKHU2NCl4ID4+IDEyKSAmIDB4RkZGRkZGRkYpKQorI2RlZmluZSBPTkNISVBfQUREUjIoeCkJCSgodTMyKSgoMSA8PCAyMCkgfCAoKHU2NCl4ID4+IDQ0KSkpCisjZGVmaW5lIFBYUF9PTkVfSUxUKHgpCQkoKCh4KSA8PCAxMCkgfCB4KQorI2RlZmluZSBQWFBfSUxUX1JBTkdFKGYsIGwpCSgoKGwpIDw8IDEwKSB8IGYpCisKKyNpZmRlZiBCQ01fQ05JQworI2RlZmluZSBDTklDX0lMVF9MSU5FUwkJMTI3CisjZGVmaW5lIENOSUNfQ1RYX1BFUl9JTFQJMTYKKyNlbHNlCisjZGVmaW5lIENOSUNfSUxUX0xJTkVTCQkwCisjZW5kaWYKKworc3RhdGljIHZvaWQgYm54MnhfaWx0X3dyKHN0cnVjdCBibngyeCAqYnAsIHUzMiBpbmRleCwgZG1hX2FkZHJfdCBhZGRyKQoreworCWludCByZWc7CisKKwlpZiAoQ0hJUF9JU19FMUgoYnApKQorCQlyZWcgPSBQWFAyX1JFR19SUV9PTkNISVBfQVRfQjAgKyBpbmRleCo4OworCWVsc2UgLyogRTEgKi8KKwkJcmVnID0gUFhQMl9SRUdfUlFfT05DSElQX0FUICsgaW5kZXgqODsKKworCWJueDJ4X3diX3dyKGJwLCByZWcsIE9OQ0hJUF9BRERSMShhZGRyKSwgT05DSElQX0FERFIyKGFkZHIpKTsKK30KKworc3RhdGljIGludCBibngyeF9pbml0X2Z1bmMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCBmdW5jID0gQlBfRlVOQyhicCk7CisJdTMyIGFkZHIsIHZhbDsKKwlpbnQgaTsKKworCURQKEJOWDJYX01TR19NQ1AsICJzdGFydGluZyBmdW5jIGluaXQgIGZ1bmMgJWRcbiIsIGZ1bmMpOworCisJLyogc2V0IE1TSSByZWNvbmZpZ3VyZSBjYXBhYmlsaXR5ICovCisJYWRkciA9IChwb3J0ID8gSENfUkVHX0NPTkZJR18xIDogSENfUkVHX0NPTkZJR18wKTsKKwl2YWwgPSBSRUdfUkQoYnAsIGFkZHIpOworCXZhbCB8PSBIQ19DT05GSUdfMF9SRUdfTVNJX0FUVE5fRU5fMDsKKwlSRUdfV1IoYnAsIGFkZHIsIHZhbCk7CisKKwlpID0gRlVOQ19JTFRfQkFTRShmdW5jKTsKKworCWJueDJ4X2lsdF93cihicCwgaSwgYm54Mnhfc3BfbWFwcGluZyhicCwgY29udGV4dCkpOworCWlmIChDSElQX0lTX0UxSChicCkpIHsKKwkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9DRFVfRklSU1RfSUxULCBpKTsKKwkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9DRFVfTEFTVF9JTFQsIGkgKyBDTklDX0lMVF9MSU5FUyk7CisJfSBlbHNlIC8qIEUxICovCisJCVJFR19XUihicCwgUFhQMl9SRUdfUFNXUlFfQ0RVMF9MMlAgKyBmdW5jKjQsCisJCSAgICAgICBQWFBfSUxUX1JBTkdFKGksIGkgKyBDTklDX0lMVF9MSU5FUykpOworCisjaWZkZWYgQkNNX0NOSUMKKwlpICs9IDEgKyBDTklDX0lMVF9MSU5FUzsKKwlibngyeF9pbHRfd3IoYnAsIGksIGJwLT50aW1lcnNfbWFwcGluZyk7CisJaWYgKENISVBfSVNfRTEoYnApKQorCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BTV1JRX1RNMF9MMlAgKyBmdW5jKjQsIFBYUF9PTkVfSUxUKGkpKTsKKwllbHNlIHsKKwkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9UTV9GSVJTVF9JTFQsIGkpOworCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1RNX0xBU1RfSUxULCBpKTsKKwl9CisKKwlpKys7CisJYm54MnhfaWx0X3dyKGJwLCBpLCBicC0+cW1fbWFwcGluZyk7CisJaWYgKENISVBfSVNfRTEoYnApKQorCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BTV1JRX1FNMF9MMlAgKyBmdW5jKjQsIFBYUF9PTkVfSUxUKGkpKTsKKwllbHNlIHsKKwkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9RTV9GSVJTVF9JTFQsIGkpOworCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1FNX0xBU1RfSUxULCBpKTsKKwl9CisKKwlpKys7CisJYm54MnhfaWx0X3dyKGJwLCBpLCBicC0+dDFfbWFwcGluZyk7CisJaWYgKENISVBfSVNfRTEoYnApKQorCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BTV1JRX1NSQzBfTDJQICsgZnVuYyo0LCBQWFBfT05FX0lMVChpKSk7CisJZWxzZSB7CisJCVJFR19XUihicCwgUFhQMl9SRUdfUlFfU1JDX0ZJUlNUX0lMVCwgaSk7CisJCVJFR19XUihicCwgUFhQMl9SRUdfUlFfU1JDX0xBU1RfSUxULCBpKTsKKwl9CisKKwkvKiB0ZWxsIHRoZSBzZWFyY2hlciB3aGVyZSB0aGUgVDIgdGFibGUgaXMgKi8KKwlSRUdfV1IoYnAsIFNSQ19SRUdfQ09VTlRGUkVFMCArIHBvcnQqNCwgMTYqMTAyNC82NCk7CisKKwlibngyeF93Yl93cihicCwgU1JDX1JFR19GSVJTVEZSRUUwICsgcG9ydCoxNiwKKwkJICAgIFU2NF9MTyhicC0+dDJfbWFwcGluZyksIFU2NF9ISShicC0+dDJfbWFwcGluZykpOworCisJYm54Mnhfd2Jfd3IoYnAsIFNSQ19SRUdfTEFTVEZSRUUwICsgcG9ydCoxNiwKKwkJICAgIFU2NF9MTygodTY0KWJwLT50Ml9tYXBwaW5nICsgMTYqMTAyNCAtIDY0KSwKKwkJICAgIFU2NF9ISSgodTY0KWJwLT50Ml9tYXBwaW5nICsgMTYqMTAyNCAtIDY0KSk7CisKKwlSRUdfV1IoYnAsIFNSQ19SRUdfTlVNQkVSX0hBU0hfQklUUzAgKyBwb3J0KjQsIDEwKTsKKyNlbmRpZgorCisJaWYgKENISVBfSVNfRTFIKGJwKSkgeworCQlibngyeF9pbml0X2Jsb2NrKGJwLCBNSVNDX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOworCQlibngyeF9pbml0X2Jsb2NrKGJwLCBUQ01fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisJCWJueDJ4X2luaXRfYmxvY2soYnAsIFVDTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKKwkJYm54MnhfaW5pdF9ibG9jayhicCwgQ0NNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOworCQlibngyeF9pbml0X2Jsb2NrKGJwLCBYQ01fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisJCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRU1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisJCWJueDJ4X2luaXRfYmxvY2soYnAsIFVTRU1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisJCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRU1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisJCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSDBfRlVOQ19FTiArIHBvcnQqOCwgMSk7CisJCVJFR19XUihicCwgTklHX1JFR19MTEgwX0ZVTkNfVkxBTl9JRCArIHBvcnQqOCwgYnAtPmUxaG92KTsKKwl9CisKKwkvKiBIQyBpbml0IHBlciBmdW5jdGlvbiAqLworCWlmIChDSElQX0lTX0UxSChicCkpIHsKKwkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzEyICsgZnVuYyo0LCAwKTsKKworCQlSRUdfV1IoYnAsIEhDX1JFR19MRUFESU5HX0VER0VfMCArIHBvcnQqOCwgMCk7CisJCVJFR19XUihicCwgSENfUkVHX1RSQUlMSU5HX0VER0VfMCArIHBvcnQqOCwgMCk7CisJfQorCWJueDJ4X2luaXRfYmxvY2soYnAsIEhDX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOworCisJLyogUmVzZXQgUENJRSBlcnJvcnMgZm9yIGRlYnVnICovCisJUkVHX1dSKGJwLCAweDIxMTQsIDB4ZmZmZmZmZmYpOworCVJFR19XUihicCwgMHgyMTIwLCAweGZmZmZmZmZmKTsKKworCXJldHVybiAwOworfQorCitpbnQgYm54MnhfaW5pdF9odyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgbG9hZF9jb2RlKQoreworCWludCBpLCByYyA9IDA7CisKKwlEUChCTlgyWF9NU0dfTUNQLCAiZnVuY3Rpb24gJWQgIGxvYWRfY29kZSAleFxuIiwKKwkgICBCUF9GVU5DKGJwKSwgbG9hZF9jb2RlKTsKKworCWJwLT5kbWFlX3JlYWR5ID0gMDsKKwltdXRleF9pbml0KCZicC0+ZG1hZV9tdXRleCk7CisJcmMgPSBibngyeF9ndW56aXBfaW5pdChicCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGxvYWRfY29kZSkgeworCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OOgorCQlyYyA9IGJueDJ4X2luaXRfY29tbW9uKGJwKTsKKwkJaWYgKHJjKQorCQkJZ290byBpbml0X2h3X2VycjsKKwkJLyogbm8gYnJlYWsgKi8KKworCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVDoKKwkJYnAtPmRtYWVfcmVhZHkgPSAxOworCQlyYyA9IGJueDJ4X2luaXRfcG9ydChicCk7CisJCWlmIChyYykKKwkJCWdvdG8gaW5pdF9od19lcnI7CisJCS8qIG5vIGJyZWFrICovCisKKwljYXNlIEZXX01TR19DT0RFX0RSVl9MT0FEX0ZVTkNUSU9OOgorCQlicC0+ZG1hZV9yZWFkeSA9IDE7CisJCXJjID0gYm54MnhfaW5pdF9mdW5jKGJwKTsKKwkJaWYgKHJjKQorCQkJZ290byBpbml0X2h3X2VycjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIlVua25vd24gbG9hZF9jb2RlICgweCV4KSBmcm9tIE1DUFxuIiwgbG9hZF9jb2RlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFCUF9OT01DUChicCkpIHsKKwkJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKworCQlicC0+ZndfZHJ2X3B1bHNlX3dyX3NlcSA9CisJCQkJKFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmRydl9wdWxzZV9tYikgJgorCQkJCSBEUlZfUFVMU0VfU0VRX01BU0spOworCQlEUChCTlgyWF9NU0dfTUNQLCAiZHJ2X3B1bHNlIDB4JXhcbiIsIGJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxKTsKKwl9CisKKwkvKiB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGd1bnppcCBlbmQgKi8KKwlibngyeF96ZXJvX2RlZl9zYihicCk7CisJZm9yX2VhY2hfcXVldWUoYnAsIGkpCisJCWJueDJ4X3plcm9fc2IoYnAsIEJQX0xfSUQoYnApICsgaSk7CisjaWZkZWYgQkNNX0NOSUMKKwlibngyeF96ZXJvX3NiKGJwLCBCUF9MX0lEKGJwKSArIGkpOworI2VuZGlmCisKK2luaXRfaHdfZXJyOgorCWJueDJ4X2d1bnppcF9lbmQoYnApOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIGJueDJ4X2ZyZWVfbWVtKHN0cnVjdCBibngyeCAqYnApCit7CisKKyNkZWZpbmUgQk5YMlhfUENJX0ZSRUUoeCwgeSwgc2l6ZSkgXAorCWRvIHsgXAorCQlpZiAoeCkgeyBcCisJCQlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgc2l6ZSwgeCwgeSk7IFwKKwkJCXggPSBOVUxMOyBcCisJCQl5ID0gMDsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEJOWDJYX0ZSRUUoeCkgXAorCWRvIHsgXAorCQlpZiAoeCkgeyBcCisJCQl2ZnJlZSh4KTsgXAorCQkJeCA9IE5VTEw7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworCWludCBpOworCisJLyogZmFzdHBhdGggKi8KKwkvKiBDb21tb24gKi8KKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCisJCS8qIHN0YXR1cyBibG9ja3MgKi8KKwkJQk5YMlhfUENJX0ZSRUUoYm54MnhfZnAoYnAsIGksIHN0YXR1c19ibGspLAorCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBpLCBzdGF0dXNfYmxrX21hcHBpbmcpLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2spKTsKKwl9CisJLyogUnggKi8KKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCisJCS8qIGZhc3RwYXRoIHJ4IHJpbmdzOiByeF9idWYgcnhfZGVzYyByeF9jb21wICovCisJCUJOWDJYX0ZSRUUoYm54MnhfZnAoYnAsIGksIHJ4X2J1Zl9yaW5nKSk7CisJCUJOWDJYX1BDSV9GUkVFKGJueDJ4X2ZwKGJwLCBpLCByeF9kZXNjX3JpbmcpLAorCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBpLCByeF9kZXNjX21hcHBpbmcpLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXRoX3J4X2JkKSAqIE5VTV9SWF9CRCk7CisKKwkJQk5YMlhfUENJX0ZSRUUoYm54MnhfZnAoYnAsIGksIHJ4X2NvbXBfcmluZyksCisJCQkgICAgICAgYm54MnhfZnAoYnAsIGksIHJ4X2NvbXBfbWFwcGluZyksCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSkgKgorCQkJICAgICAgIE5VTV9SQ1FfQkQpOworCisJCS8qIFNHRSByaW5nICovCisJCUJOWDJYX0ZSRUUoYm54MnhfZnAoYnAsIGksIHJ4X3BhZ2VfcmluZykpOworCQlCTlgyWF9QQ0lfRlJFRShibngyeF9mcChicCwgaSwgcnhfc2dlX3JpbmcpLAorCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBpLCByeF9zZ2VfbWFwcGluZyksCisJCQkgICAgICAgQkNNX1BBR0VfU0laRSAqIE5VTV9SWF9TR0VfUEFHRVMpOworCX0KKwkvKiBUeCAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisKKwkJLyogZmFzdHBhdGggdHggcmluZ3M6IHR4X2J1ZiB0eF9kZXNjICovCisJCUJOWDJYX0ZSRUUoYm54MnhfZnAoYnAsIGksIHR4X2J1Zl9yaW5nKSk7CisJCUJOWDJYX1BDSV9GUkVFKGJueDJ4X2ZwKGJwLCBpLCB0eF9kZXNjX3JpbmcpLAorCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBpLCB0eF9kZXNjX21hcHBpbmcpLAorCQkJICAgICAgIHNpemVvZih1bmlvbiBldGhfdHhfYmRfdHlwZXMpICogTlVNX1RYX0JEKTsKKwl9CisJLyogZW5kIG9mIGZhc3RwYXRoICovCisKKwlCTlgyWF9QQ0lfRlJFRShicC0+ZGVmX3N0YXR1c19ibGssIGJwLT5kZWZfc3RhdHVzX2Jsa19tYXBwaW5nLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2spKTsKKworCUJOWDJYX1BDSV9GUkVFKGJwLT5zbG93cGF0aCwgYnAtPnNsb3dwYXRoX21hcHBpbmcsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGJueDJ4X3Nsb3dwYXRoKSk7CisKKyNpZmRlZiBCQ01fQ05JQworCUJOWDJYX1BDSV9GUkVFKGJwLT50MSwgYnAtPnQxX21hcHBpbmcsIDY0KjEwMjQpOworCUJOWDJYX1BDSV9GUkVFKGJwLT50MiwgYnAtPnQyX21hcHBpbmcsIDE2KjEwMjQpOworCUJOWDJYX1BDSV9GUkVFKGJwLT50aW1lcnMsIGJwLT50aW1lcnNfbWFwcGluZywgOCoxMDI0KTsKKwlCTlgyWF9QQ0lfRlJFRShicC0+cW0sIGJwLT5xbV9tYXBwaW5nLCAxMjgqMTAyNCk7CisJQk5YMlhfUENJX0ZSRUUoYnAtPmNuaWNfc2IsIGJwLT5jbmljX3NiX21hcHBpbmcsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrKSk7CisjZW5kaWYKKwlCTlgyWF9QQ0lfRlJFRShicC0+c3BxLCBicC0+c3BxX21hcHBpbmcsIEJDTV9QQUdFX1NJWkUpOworCisjdW5kZWYgQk5YMlhfUENJX0ZSRUUKKyN1bmRlZiBCTlgyWF9LRlJFRQorfQorCitpbnQgYm54MnhfYWxsb2NfbWVtKHN0cnVjdCBibngyeCAqYnApCit7CisKKyNkZWZpbmUgQk5YMlhfUENJX0FMTE9DKHgsIHksIHNpemUpIFwKKwlkbyB7IFwKKwkJeCA9IGRtYV9hbGxvY19jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgc2l6ZSwgeSwgR0ZQX0tFUk5FTCk7IFwKKwkJaWYgKHggPT0gTlVMTCkgXAorCQkJZ290byBhbGxvY19tZW1fZXJyOyBcCisJCW1lbXNldCh4LCAwLCBzaXplKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQk5YMlhfQUxMT0MoeCwgc2l6ZSkgXAorCWRvIHsgXAorCQl4ID0gdm1hbGxvYyhzaXplKTsgXAorCQlpZiAoeCA9PSBOVUxMKSBcCisJCQlnb3RvIGFsbG9jX21lbV9lcnI7IFwKKwkJbWVtc2V0KHgsIDAsIHNpemUpOyBcCisJfSB3aGlsZSAoMCkKKworCWludCBpOworCisJLyogZmFzdHBhdGggKi8KKwkvKiBDb21tb24gKi8KKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlibngyeF9mcChicCwgaSwgYnApID0gYnA7CisKKwkJLyogc3RhdHVzIGJsb2NrcyAqLworCQlCTlgyWF9QQ0lfQUxMT0MoYm54MnhfZnAoYnAsIGksIHN0YXR1c19ibGspLAorCQkJCSZibngyeF9mcChicCwgaSwgc3RhdHVzX2Jsa19tYXBwaW5nKSwKKwkJCQlzaXplb2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrKSk7CisJfQorCS8qIFJ4ICovCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKworCQkvKiBmYXN0cGF0aCByeCByaW5nczogcnhfYnVmIHJ4X2Rlc2MgcnhfY29tcCAqLworCQlCTlgyWF9BTExPQyhibngyeF9mcChicCwgaSwgcnhfYnVmX3JpbmcpLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3dfcnhfYmQpICogTlVNX1JYX0JEKTsKKwkJQk5YMlhfUENJX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCByeF9kZXNjX3JpbmcpLAorCQkJCSZibngyeF9mcChicCwgaSwgcnhfZGVzY19tYXBwaW5nKSwKKwkJCQlzaXplb2Yoc3RydWN0IGV0aF9yeF9iZCkgKiBOVU1fUlhfQkQpOworCisJCUJOWDJYX1BDSV9BTExPQyhibngyeF9mcChicCwgaSwgcnhfY29tcF9yaW5nKSwKKwkJCQkmYm54MnhfZnAoYnAsIGksIHJ4X2NvbXBfbWFwcGluZyksCisJCQkJc2l6ZW9mKHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSkgKgorCQkJCU5VTV9SQ1FfQkQpOworCisJCS8qIFNHRSByaW5nICovCisJCUJOWDJYX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCByeF9wYWdlX3JpbmcpLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3dfcnhfcGFnZSkgKiBOVU1fUlhfU0dFKTsKKwkJQk5YMlhfUENJX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCByeF9zZ2VfcmluZyksCisJCQkJJmJueDJ4X2ZwKGJwLCBpLCByeF9zZ2VfbWFwcGluZyksCisJCQkJQkNNX1BBR0VfU0laRSAqIE5VTV9SWF9TR0VfUEFHRVMpOworCX0KKwkvKiBUeCAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisKKwkJLyogZmFzdHBhdGggdHggcmluZ3M6IHR4X2J1ZiB0eF9kZXNjICovCisJCUJOWDJYX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCB0eF9idWZfcmluZyksCisJCQkJc2l6ZW9mKHN0cnVjdCBzd190eF9iZCkgKiBOVU1fVFhfQkQpOworCQlCTlgyWF9QQ0lfQUxMT0MoYm54MnhfZnAoYnAsIGksIHR4X2Rlc2NfcmluZyksCisJCQkJJmJueDJ4X2ZwKGJwLCBpLCB0eF9kZXNjX21hcHBpbmcpLAorCQkJCXNpemVvZih1bmlvbiBldGhfdHhfYmRfdHlwZXMpICogTlVNX1RYX0JEKTsKKwl9CisJLyogZW5kIG9mIGZhc3RwYXRoICovCisKKwlCTlgyWF9QQ0lfQUxMT0MoYnAtPmRlZl9zdGF0dXNfYmxrLCAmYnAtPmRlZl9zdGF0dXNfYmxrX21hcHBpbmcsCisJCQlzaXplb2Yoc3RydWN0IGhvc3RfZGVmX3N0YXR1c19ibG9jaykpOworCisJQk5YMlhfUENJX0FMTE9DKGJwLT5zbG93cGF0aCwgJmJwLT5zbG93cGF0aF9tYXBwaW5nLAorCQkJc2l6ZW9mKHN0cnVjdCBibngyeF9zbG93cGF0aCkpOworCisjaWZkZWYgQkNNX0NOSUMKKwlCTlgyWF9QQ0lfQUxMT0MoYnAtPnQxLCAmYnAtPnQxX21hcHBpbmcsIDY0KjEwMjQpOworCisJLyogYWxsb2NhdGUgc2VhcmNoZXIgVDIgdGFibGUKKwkgICB3ZSBhbGxvY2F0ZSAxLzQgb2YgYWxsb2MgbnVtIGZvciBUMgorCSAgKHdoaWNoIGlzIG5vdCBlbnRlcmVkIGludG8gdGhlIElMVCkgKi8KKwlCTlgyWF9QQ0lfQUxMT0MoYnAtPnQyLCAmYnAtPnQyX21hcHBpbmcsIDE2KjEwMjQpOworCisJLyogSW5pdGlhbGl6ZSBUMiAoZm9yIDEwMjQgY29ubmVjdGlvbnMpICovCisJZm9yIChpID0gMDsgaSA8IDE2KjEwMjQ7IGkgKz0gNjQpCisJCSoodTY0ICopKChjaGFyICopYnAtPnQyICsgaSArIDU2KSA9IGJwLT50Ml9tYXBwaW5nICsgaSArIDY0OworCisJLyogVGltZXIgYmxvY2sgYXJyYXkgKDgqTUFYX0NPTk4pIHBoeXMgdW5jYWNoZWQgZm9yIG5vdyAxMDI0IGNvbm5zICovCisJQk5YMlhfUENJX0FMTE9DKGJwLT50aW1lcnMsICZicC0+dGltZXJzX21hcHBpbmcsIDgqMTAyNCk7CisKKwkvKiBRTSBxdWV1ZXMgKDEyOCpNQVhfQ09OTikgKi8KKwlCTlgyWF9QQ0lfQUxMT0MoYnAtPnFtLCAmYnAtPnFtX21hcHBpbmcsIDEyOCoxMDI0KTsKKworCUJOWDJYX1BDSV9BTExPQyhicC0+Y25pY19zYiwgJmJwLT5jbmljX3NiX21hcHBpbmcsCisJCQlzaXplb2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrKSk7CisjZW5kaWYKKworCS8qIFNsb3cgcGF0aCByaW5nICovCisJQk5YMlhfUENJX0FMTE9DKGJwLT5zcHEsICZicC0+c3BxX21hcHBpbmcsIEJDTV9QQUdFX1NJWkUpOworCisJcmV0dXJuIDA7CisKK2FsbG9jX21lbV9lcnI6CisJYm54MnhfZnJlZV9tZW0oYnApOworCXJldHVybiAtRU5PTUVNOworCisjdW5kZWYgQk5YMlhfUENJX0FMTE9DCisjdW5kZWYgQk5YMlhfQUxMT0MKK30KKworCisvKgorICogSW5pdCBzZXJ2aWNlIGZ1bmN0aW9ucworICovCisKKy8qKgorICogU2V0cyBhIE1BQyBpbiBhIENBTSBmb3IgYSBmZXcgTDIgQ2xpZW50cyBmb3IgRTEgY2hpcAorICoKKyAqIEBwYXJhbSBicCBkcml2ZXIgZGVzY3JpcHRvcgorICogQHBhcmFtIHNldCBzZXQgb3IgY2xlYXIgYW4gZW50cnkgKDEgb3IgMCkKKyAqIEBwYXJhbSBtYWMgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEgTUFDCisgKiBAcGFyYW0gY2xfYml0X3ZlYyBiaXQgdmVjdG9yIG9mIGNsaWVudHMgdG8gcmVnaXN0ZXIgYSBNQUMgZm9yCisgKiBAcGFyYW0gY2FtX29mZnNldCBvZmZzZXQgaW4gYSBDQU0gdG8gdXNlCisgKiBAcGFyYW0gd2l0aF9iY2FzdCBzZXQgYnJvYWRjYXN0IE1BQyBhcyB3ZWxsCisgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9tYWNfYWRkcl9lMV9nZW4oc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCwgdTggKm1hYywKKwkJCQkgICAgICB1MzIgY2xfYml0X3ZlYywgdTggY2FtX29mZnNldCwKKwkJCQkgICAgICB1OCB3aXRoX2JjYXN0KQoreworCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9IGJueDJ4X3NwKGJwLCBtYWNfY29uZmlnKTsKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCisJLyogQ0FNIGFsbG9jYXRpb24KKwkgKiB1bmljYXN0cyAwLTMxOnBvcnQwIDMyLTYzOnBvcnQxCisJICogbXVsdGljYXN0IDY0LTEyNzpwb3J0MCAxMjgtMTkxOnBvcnQxCisJICovCisJY29uZmlnLT5oZHIubGVuZ3RoID0gMSArICh3aXRoX2JjYXN0ID8gMSA6IDApOworCWNvbmZpZy0+aGRyLm9mZnNldCA9IGNhbV9vZmZzZXQ7CisJY29uZmlnLT5oZHIuY2xpZW50X2lkID0gMHhmZjsKKwljb25maWctPmhkci5yZXNlcnZlZDEgPSAwOworCisJLyogcHJpbWFyeSBNQUMgKi8KKwljb25maWctPmNvbmZpZ190YWJsZVswXS5jYW1fZW50cnkubXNiX21hY19hZGRyID0KKwkJCQkJc3dhYjE2KCoodTE2ICopJm1hY1swXSk7CisJY29uZmlnLT5jb25maWdfdGFibGVbMF0uY2FtX2VudHJ5Lm1pZGRsZV9tYWNfYWRkciA9CisJCQkJCXN3YWIxNigqKHUxNiAqKSZtYWNbMl0pOworCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNhbV9lbnRyeS5sc2JfbWFjX2FkZHIgPQorCQkJCQlzd2FiMTYoKih1MTYgKikmbWFjWzRdKTsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS5jYW1fZW50cnkuZmxhZ3MgPSBjcHVfdG9fbGUxNihwb3J0KTsKKwlpZiAoc2V0KQorCQljb25maWctPmNvbmZpZ190YWJsZVswXS50YXJnZXRfdGFibGVfZW50cnkuZmxhZ3MgPSAwOworCWVsc2UKKwkJQ0FNX0lOVkFMSURBVEUoY29uZmlnLT5jb25maWdfdGFibGVbMF0pOworCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLnRhcmdldF90YWJsZV9lbnRyeS5jbGllbnRzX2JpdF92ZWN0b3IgPQorCQkJCQkJY3B1X3RvX2xlMzIoY2xfYml0X3ZlYyk7CisJY29uZmlnLT5jb25maWdfdGFibGVbMF0udGFyZ2V0X3RhYmxlX2VudHJ5LnZsYW5faWQgPSAwOworCisJRFAoTkVUSUZfTVNHX0lGVVAsICIlcyBNQUMgKCUwNHg6JTA0eDolMDR4KVxuIiwKKwkgICAoc2V0ID8gInNldHRpbmciIDogImNsZWFyaW5nIiksCisJICAgY29uZmlnLT5jb25maWdfdGFibGVbMF0uY2FtX2VudHJ5Lm1zYl9tYWNfYWRkciwKKwkgICBjb25maWctPmNvbmZpZ190YWJsZVswXS5jYW1fZW50cnkubWlkZGxlX21hY19hZGRyLAorCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNhbV9lbnRyeS5sc2JfbWFjX2FkZHIpOworCisJLyogYnJvYWRjYXN0ICovCisJaWYgKHdpdGhfYmNhc3QpIHsKKwkJY29uZmlnLT5jb25maWdfdGFibGVbMV0uY2FtX2VudHJ5Lm1zYl9tYWNfYWRkciA9CisJCQljcHVfdG9fbGUxNigweGZmZmYpOworCQljb25maWctPmNvbmZpZ190YWJsZVsxXS5jYW1fZW50cnkubWlkZGxlX21hY19hZGRyID0KKwkJCWNwdV90b19sZTE2KDB4ZmZmZik7CisJCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzFdLmNhbV9lbnRyeS5sc2JfbWFjX2FkZHIgPQorCQkJY3B1X3RvX2xlMTYoMHhmZmZmKTsKKwkJY29uZmlnLT5jb25maWdfdGFibGVbMV0uY2FtX2VudHJ5LmZsYWdzID0gY3B1X3RvX2xlMTYocG9ydCk7CisJCWlmIChzZXQpCisJCQljb25maWctPmNvbmZpZ190YWJsZVsxXS50YXJnZXRfdGFibGVfZW50cnkuZmxhZ3MgPQorCQkJCQlUU1RPUk1fQ0FNX1RBUkdFVF9UQUJMRV9FTlRSWV9CUk9BRENBU1Q7CisJCWVsc2UKKwkJCUNBTV9JTlZBTElEQVRFKGNvbmZpZy0+Y29uZmlnX3RhYmxlWzFdKTsKKwkJY29uZmlnLT5jb25maWdfdGFibGVbMV0udGFyZ2V0X3RhYmxlX2VudHJ5LmNsaWVudHNfYml0X3ZlY3RvciA9CisJCQkJCQkJY3B1X3RvX2xlMzIoY2xfYml0X3ZlYyk7CisJCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzFdLnRhcmdldF90YWJsZV9lbnRyeS52bGFuX2lkID0gMDsKKwl9CisKKwlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDLCAwLAorCQkgICAgICBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX2NvbmZpZykpLAorCQkgICAgICBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX2NvbmZpZykpLCAwKTsKK30KKworLyoqCisgKiBTZXRzIGEgTUFDIGluIGEgQ0FNIGZvciBhIGZldyBMMiBDbGllbnRzIGZvciBFMUggY2hpcAorICoKKyAqIEBwYXJhbSBicCBkcml2ZXIgZGVzY3JpcHRvcgorICogQHBhcmFtIHNldCBzZXQgb3IgY2xlYXIgYW4gZW50cnkgKDEgb3IgMCkKKyAqIEBwYXJhbSBtYWMgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEgTUFDCisgKiBAcGFyYW0gY2xfYml0X3ZlYyBiaXQgdmVjdG9yIG9mIGNsaWVudHMgdG8gcmVnaXN0ZXIgYSBNQUMgZm9yCisgKiBAcGFyYW0gY2FtX29mZnNldCBvZmZzZXQgaW4gYSBDQU0gdG8gdXNlCisgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9tYWNfYWRkcl9lMWhfZ2VuKHN0cnVjdCBibngyeCAqYnAsIGludCBzZXQsIHU4ICptYWMsCisJCQkJICAgICAgIHUzMiBjbF9iaXRfdmVjLCB1OCBjYW1fb2Zmc2V0KQoreworCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWRfZTFoICpjb25maWcgPQorCQkoc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZF9lMWggKilibngyeF9zcChicCwgbWFjX2NvbmZpZyk7CisKKwljb25maWctPmhkci5sZW5ndGggPSAxOworCWNvbmZpZy0+aGRyLm9mZnNldCA9IGNhbV9vZmZzZXQ7CisJY29uZmlnLT5oZHIuY2xpZW50X2lkID0gMHhmZjsKKwljb25maWctPmhkci5yZXNlcnZlZDEgPSAwOworCisJLyogcHJpbWFyeSBNQUMgKi8KKwljb25maWctPmNvbmZpZ190YWJsZVswXS5tc2JfbWFjX2FkZHIgPQorCQkJCQlzd2FiMTYoKih1MTYgKikmbWFjWzBdKTsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS5taWRkbGVfbWFjX2FkZHIgPQorCQkJCQlzd2FiMTYoKih1MTYgKikmbWFjWzJdKTsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS5sc2JfbWFjX2FkZHIgPQorCQkJCQlzd2FiMTYoKih1MTYgKikmbWFjWzRdKTsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS5jbGllbnRzX2JpdF92ZWN0b3IgPQorCQkJCQljcHVfdG9fbGUzMihjbF9iaXRfdmVjKTsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS52bGFuX2lkID0gMDsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS5lMWhvdl9pZCA9IGNwdV90b19sZTE2KGJwLT5lMWhvdik7CisJaWYgKHNldCkKKwkJY29uZmlnLT5jb25maWdfdGFibGVbMF0uZmxhZ3MgPSBCUF9QT1JUKGJwKTsKKwllbHNlCisJCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmZsYWdzID0KKwkJCQlNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9FMUhfQUNUSU9OX1RZUEU7CisKKwlEUChORVRJRl9NU0dfSUZVUCwgIiVzIE1BQyAoJTA0eDolMDR4OiUwNHgpICBFMUhPViAlZCAgQ0xJRCBtYXNrICVkXG4iLAorCSAgIChzZXQgPyAic2V0dGluZyIgOiAiY2xlYXJpbmciKSwKKwkgICBjb25maWctPmNvbmZpZ190YWJsZVswXS5tc2JfbWFjX2FkZHIsCisJICAgY29uZmlnLT5jb25maWdfdGFibGVbMF0ubWlkZGxlX21hY19hZGRyLAorCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmxzYl9tYWNfYWRkciwgYnAtPmUxaG92LCBjbF9iaXRfdmVjKTsKKworCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMsIDAsCisJCSAgICAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksCisJCSAgICAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksIDApOworfQorCitzdGF0aWMgaW50IGJueDJ4X3dhaXRfcmFtcm9kKHN0cnVjdCBibngyeCAqYnAsIGludCBzdGF0ZSwgaW50IGlkeCwKKwkJCSAgICAgaW50ICpzdGF0ZV9wLCBpbnQgcG9sbCkKK3sKKwkvKiBjYW4gdGFrZSBhIHdoaWxlIGlmIGFueSBwb3J0IGlzIHJ1bm5pbmcgKi8KKwlpbnQgY250ID0gNTAwMDsKKworCURQKE5FVElGX01TR19JRlVQLCAiJXMgZm9yIHN0YXRlIHRvIGJlY29tZSAleCBvbiBJRFggWyVkXVxuIiwKKwkgICBwb2xsID8gInBvbGxpbmciIDogIndhaXRpbmciLCBzdGF0ZSwgaWR4KTsKKworCW1pZ2h0X3NsZWVwKCk7CisJd2hpbGUgKGNudC0tKSB7CisJCWlmIChwb2xsKSB7CisJCQlibngyeF9yeF9pbnQoYnAtPmZwLCAxMCk7CisJCQkvKiBpZiBpbmRleCBpcyBkaWZmZXJlbnQgZnJvbSAwCisJCQkgKiB0aGUgcmVwbHkgZm9yIHNvbWUgY29tbWFuZHMgd2lsbAorCQkJICogYmUgb24gdGhlIG5vbiBkZWZhdWx0IHF1ZXVlCisJCQkgKi8KKwkJCWlmIChpZHgpCisJCQkJYm54MnhfcnhfaW50KCZicC0+ZnBbaWR4XSwgMTApOworCQl9CisKKwkJbWIoKTsgLyogc3RhdGUgaXMgY2hhbmdlZCBieSBibngyeF9zcF9ldmVudCgpICovCisJCWlmICgqc3RhdGVfcCA9PSBzdGF0ZSkgeworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkJCURQKE5FVElGX01TR19JRlVQLCAiZXhpdCAgKGNudCAlZClcbiIsIDUwMDAgLSBjbnQpOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCW1zbGVlcCgxKTsKKworCQlpZiAoYnAtPnBhbmljKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJLyogdGltZW91dCEgKi8KKwlCTlgyWF9FUlIoInRpbWVvdXQgJXMgZm9yIHN0YXRlICV4IG9uIElEWCBbJWRdXG4iLAorCQkgIHBvbGwgPyAicG9sbGluZyIgOiAid2FpdGluZyIsIHN0YXRlLCBpZHgpOworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlibngyeF9wYW5pYygpOworI2VuZGlmCisKKwlyZXR1cm4gLUVCVVNZOworfQorCit2b2lkIGJueDJ4X3NldF9ldGhfbWFjX2FkZHJfZTFoKHN0cnVjdCBibngyeCAqYnAsIGludCBzZXQpCit7CisJYnAtPnNldF9tYWNfcGVuZGluZysrOworCXNtcF93bWIoKTsKKworCWJueDJ4X3NldF9tYWNfYWRkcl9lMWhfZ2VuKGJwLCBzZXQsIGJwLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICgxIDw8IGJwLT5mcC0+Y2xfaWQpLCBCUF9GVU5DKGJwKSk7CisKKwkvKiBXYWl0IGZvciBhIGNvbXBsZXRpb24gKi8KKwlibngyeF93YWl0X3JhbXJvZChicCwgMCwgMCwgJmJwLT5zZXRfbWFjX3BlbmRpbmcsIHNldCA/IDAgOiAxKTsKK30KKwordm9pZCBibngyeF9zZXRfZXRoX21hY19hZGRyX2UxKHN0cnVjdCBibngyeCAqYnAsIGludCBzZXQpCit7CisJYnAtPnNldF9tYWNfcGVuZGluZysrOworCXNtcF93bWIoKTsKKworCWJueDJ4X3NldF9tYWNfYWRkcl9lMV9nZW4oYnAsIHNldCwgYnAtPmRldi0+ZGV2X2FkZHIsCisJCQkJICAoMSA8PCBicC0+ZnAtPmNsX2lkKSwgKEJQX1BPUlQoYnApID8gMzIgOiAwKSwKKwkJCQkgIDEpOworCisJLyogV2FpdCBmb3IgYSBjb21wbGV0aW9uICovCisJYm54Mnhfd2FpdF9yYW1yb2QoYnAsIDAsIDAsICZicC0+c2V0X21hY19wZW5kaW5nLCBzZXQgPyAwIDogMSk7Cit9CisKKyNpZmRlZiBCQ01fQ05JQworLyoqCisgKiBTZXQgaVNDU0kgTUFDKHMpIGF0IHRoZSBuZXh0IGVudGllcyBpbiB0aGUgQ0FNIGFmdGVyIHRoZSBFVEgKKyAqIE1BQyhzKS4gVGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgdW50aWwgdGhlIHJhbWRvcmQgY29tcGxldGlvbgorICogcmV0dXJucy4KKyAqCisgKiBAcGFyYW0gYnAgZHJpdmVyIGhhbmRsZQorICogQHBhcmFtIHNldCBzZXQgb3IgY2xlYXIgdGhlIENBTSBlbnRyeQorICoKKyAqIEByZXR1cm4gMCBpZiBjdXNzZXNzLCAtRU5PREVWIGlmIHJhbXJvZCBkb2Vzbid0IHJldHVybi4KKyAqLworaW50IGJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCkKK3sKKwl1MzIgY2xfYml0X3ZlYyA9ICgxIDw8IEJDTV9JU0NTSV9FVEhfQ0xfSUQpOworCisJYnAtPnNldF9tYWNfcGVuZGluZysrOworCXNtcF93bWIoKTsKKworCS8qIFNlbmQgYSBTRVRfTUFDIHJhbXJvZCAqLworCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJYm54Mnhfc2V0X21hY19hZGRyX2UxX2dlbihicCwgc2V0LCBicC0+aXNjc2lfbWFjLAorCQkJCSAgY2xfYml0X3ZlYywgKEJQX1BPUlQoYnApID8gMzIgOiAwKSArIDIsCisJCQkJICAxKTsKKwllbHNlCisJCS8qIENBTSBhbGxvY2F0aW9uIGZvciBFMUgKKwkJKiB1bmljYXN0czogYnkgZnVuYyBudW1iZXIKKwkJKiBtdWx0aWNhc3Q6IDIwK0ZVTkMqMjAsIDIwIGVhY2gKKwkJKi8KKwkJYm54Mnhfc2V0X21hY19hZGRyX2UxaF9nZW4oYnAsIHNldCwgYnAtPmlzY3NpX21hYywKKwkJCQkgICBjbF9iaXRfdmVjLCBFMUhfRlVOQ19NQVggKyBCUF9GVU5DKGJwKSk7CisKKwkvKiBXYWl0IGZvciBhIGNvbXBsZXRpb24gd2hlbiBzZXR0aW5nICovCisJYm54Mnhfd2FpdF9yYW1yb2QoYnAsIDAsIDAsICZicC0+c2V0X21hY19wZW5kaW5nLCBzZXQgPyAwIDogMSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgYm54Mnhfc2V0dXBfbGVhZGluZyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCByYzsKKworCS8qIHJlc2V0IElHVSBzdGF0ZSAqLworCWJueDJ4X2Fja19zYihicCwgYnAtPmZwWzBdLnNiX2lkLCBDU1RPUk1fSUQsIDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKKworCS8qIFNFVFVQIHJhbXJvZCAqLworCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1BPUlRfU0VUVVAsIDAsIDAsIDAsIDApOworCisJLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLworCXJjID0gYm54Mnhfd2FpdF9yYW1yb2QoYnAsIEJOWDJYX1NUQVRFX09QRU4sIDAsICYoYnAtPnN0YXRlKSwgMCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBibngyeF9zZXR1cF9tdWx0aShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaW5kZXhdOworCisJLyogcmVzZXQgSUdVIHN0YXRlICovCisJYm54MnhfYWNrX3NiKGJwLCBmcC0+c2JfaWQsIENTVE9STV9JRCwgMCwgSUdVX0lOVF9FTkFCTEUsIDApOworCisJLyogU0VUVVAgcmFtcm9kICovCisJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfT1BFTklORzsKKwlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9DTElFTlRfU0VUVVAsIGluZGV4LCAwLAorCQkgICAgICBmcC0+Y2xfaWQsIDApOworCisJLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLworCXJldHVybiBibngyeF93YWl0X3JhbXJvZChicCwgQk5YMlhfRlBfU1RBVEVfT1BFTiwgaW5kZXgsCisJCQkJICYoZnAtPnN0YXRlKSwgMCk7Cit9CisKKwordm9pZCBibngyeF9zZXRfbnVtX3F1ZXVlc19tc2l4KHN0cnVjdCBibngyeCAqYnApCit7CisKKwlzd2l0Y2ggKGJwLT5tdWx0aV9tb2RlKSB7CisJY2FzZSBFVEhfUlNTX01PREVfRElTQUJMRUQ6CisJCWJwLT5udW1fcXVldWVzID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIEVUSF9SU1NfTU9ERV9SRUdVTEFSOgorCQlpZiAobnVtX3F1ZXVlcykKKwkJCWJwLT5udW1fcXVldWVzID0gbWluX3QodTMyLCBudW1fcXVldWVzLAorCQkJCQkJICBCTlgyWF9NQVhfUVVFVUVTKGJwKSk7CisJCWVsc2UKKwkJCWJwLT5udW1fcXVldWVzID0gbWluX3QodTMyLCBudW1fb25saW5lX2NwdXMoKSwKKwkJCQkJCSAgQk5YMlhfTUFYX1FVRVVFUyhicCkpOworCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJYnAtPm51bV9xdWV1ZXMgPSAxOworCQlicmVhazsKKwl9Cit9CisKKworCitzdGF0aWMgaW50IGJueDJ4X3N0b3BfbXVsdGkoc3RydWN0IGJueDJ4ICpicCwgaW50IGluZGV4KQoreworCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2luZGV4XTsKKwlpbnQgcmM7CisKKwkvKiBoYWx0IHRoZSBjb25uZWN0aW9uICovCisJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfSEFMVElORzsKKwlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9IQUxULCBpbmRleCwgMCwgZnAtPmNsX2lkLCAwKTsKKworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlyYyA9IGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9GUF9TVEFURV9IQUxURUQsIGluZGV4LAorCQkJICAgICAgICYoZnAtPnN0YXRlKSwgMSk7CisJaWYgKHJjKSAvKiB0aW1lb3V0ICovCisJCXJldHVybiByYzsKKworCS8qIGRlbGV0ZSBjZmMgZW50cnkgKi8KKwlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9DRkNfREVMLCBpbmRleCwgMCwgMCwgMSk7CisKKwkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCisJcmMgPSBibngyeF93YWl0X3JhbXJvZChicCwgQk5YMlhfRlBfU1RBVEVfQ0xPU0VELCBpbmRleCwKKwkJCSAgICAgICAmKGZwLT5zdGF0ZSksIDEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9zdG9wX2xlYWRpbmcoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlfX2xlMTYgZHNiX3NwX3Byb2RfaWR4OworCS8qIGlmIHRoZSBvdGhlciBwb3J0IGlzIGhhbmRsaW5nIHRyYWZmaWMsCisJICAgdGhpcyBjYW4gdGFrZSBhIGxvdCBvZiB0aW1lICovCisJaW50IGNudCA9IDUwMDsKKwlpbnQgcmM7CisKKwltaWdodF9zbGVlcCgpOworCisJLyogU2VuZCBIQUxUIHJhbXJvZCAqLworCWJwLT5mcFswXS5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0hBTFRJTkc7CisJYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfSEFMVCwgMCwgMCwgYnAtPmZwLT5jbF9pZCwgMCk7CisKKwkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCisJcmMgPSBibngyeF93YWl0X3JhbXJvZChicCwgQk5YMlhfRlBfU1RBVEVfSEFMVEVELCAwLAorCQkJICAgICAgICYoYnAtPmZwWzBdLnN0YXRlKSwgMSk7CisJaWYgKHJjKSAvKiB0aW1lb3V0ICovCisJCXJldHVybiByYzsKKworCWRzYl9zcF9wcm9kX2lkeCA9ICpicC0+ZHNiX3NwX3Byb2Q7CisKKwkvKiBTZW5kIFBPUlRfREVMRVRFIHJhbXJvZCAqLworCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1BPUlRfREVMLCAwLCAwLCAwLCAxKTsKKworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gdG8gYXJyaXZlIG9uIGRlZmF1bHQgc3RhdHVzIGJsb2NrCisJICAgd2UgYXJlIGdvaW5nIHRvIHJlc2V0IHRoZSBjaGlwIGFueXdheQorCSAgIHNvIHRoZXJlIGlzIG5vdCBtdWNoIHRvIGRvIGlmIHRoaXMgdGltZXMgb3V0CisJICovCisJd2hpbGUgKGRzYl9zcF9wcm9kX2lkeCA9PSAqYnAtPmRzYl9zcF9wcm9kKSB7CisJCWlmICghY250KSB7CisJCQlEUChORVRJRl9NU0dfSUZET1dOLCAidGltZW91dCB3YWl0aW5nIGZvciBwb3J0IGRlbCAiCisJCQkgICAiZHNiX3NwX3Byb2QgMHgleCAhPSBkc2Jfc3BfcHJvZF9pZHggMHgleFxuIiwKKwkJCSAgICpicC0+ZHNiX3NwX3Byb2QsIGRzYl9zcF9wcm9kX2lkeCk7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQkJYm54MnhfcGFuaWMoKTsKKyNlbmRpZgorCQkJcmMgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfQorCQljbnQtLTsKKwkJbXNsZWVwKDEpOworCQlybWIoKTsgLyogUmVmcmVzaCB0aGUgZHNiX3NwX3Byb2QgKi8KKwl9CisJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9VTkxPQUQ7CisJYnAtPmZwWzBdLnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfQ0xPU0VEOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBibngyeF9yZXNldF9mdW5jKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCWludCBiYXNlLCBpOworCisJLyogQ29uZmlndXJlIElHVSAqLworCVJFR19XUihicCwgSENfUkVHX0xFQURJTkdfRURHRV8wICsgcG9ydCo4LCAwKTsKKwlSRUdfV1IoYnAsIEhDX1JFR19UUkFJTElOR19FREdFXzAgKyBwb3J0KjgsIDApOworCisjaWZkZWYgQkNNX0NOSUMKKwkvKiBEaXNhYmxlIFRpbWVyIHNjYW4gKi8KKwlSRUdfV1IoYnAsIFRNX1JFR19FTl9MSU5FQVIwX1RJTUVSICsgcG9ydCo0LCAwKTsKKwkvKgorCSAqIFdhaXQgZm9yIGF0IGxlYXN0IDEwbXMgYW5kIHVwIHRvIDIgc2Vjb25kIGZvciB0aGUgdGltZXJzIHNjYW4gdG8KKwkgKiBjb21wbGV0ZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQltc2xlZXAoMTApOworCQlpZiAoIVJFR19SRChicCwgVE1fUkVHX0xJTjBfU0NBTl9PTiArIHBvcnQqNCkpCisJCQlicmVhazsKKwl9CisjZW5kaWYKKwkvKiBDbGVhciBJTFQgKi8KKwliYXNlID0gRlVOQ19JTFRfQkFTRShmdW5jKTsKKwlmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIElMVF9QRVJfRlVOQzsgaSsrKQorCQlibngyeF9pbHRfd3IoYnAsIGksIDApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9yZXNldF9wb3J0KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwl1MzIgdmFsOworCisJUkVHX1dSKGJwLCBOSUdfUkVHX01BU0tfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LCAwKTsKKworCS8qIERvIG5vdCByY3YgcGFja2V0cyB0byBCUkIgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9CUkIxX0RSVl9NQVNLICsgcG9ydCo0LCAweDApOworCS8qIERvIG5vdCBkaXJlY3QgcmN2IHBhY2tldHMgdGhhdCBhcmUgbm90IGZvciBNQ1AgdG8gdGhlIEJSQiAqLworCVJFR19XUihicCwgKHBvcnQgPyBOSUdfUkVHX0xMSDFfQlJCMV9OT1RfTUNQIDoKKwkJCSAgIE5JR19SRUdfTExIMF9CUkIxX05PVF9NQ1ApLCAweDApOworCisJLyogQ29uZmlndXJlIEFFVSAqLworCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzAgKyBwb3J0KjQsIDApOworCisJbXNsZWVwKDEwMCk7CisJLyogQ2hlY2sgZm9yIEJSQiBwb3J0IG9jY3VwYW5jeSAqLworCXZhbCA9IFJFR19SRChicCwgQlJCMV9SRUdfUE9SVF9OVU1fT0NDX0JMT0NLU18wICsgcG9ydCo0KTsKKwlpZiAodmFsKQorCQlEUChORVRJRl9NU0dfSUZET1dOLAorCQkgICAiQlJCMSBpcyBub3QgZW1wdHkgICVkIGJsb2NrcyBhcmUgb2NjdXBpZWRcbiIsIHZhbCk7CisKKwkvKiBUT0RPOiBDbG9zZSBEb29yYmVsbCBwb3J0PyAqLworfQorCitzdGF0aWMgdm9pZCBibngyeF9yZXNldF9jaGlwKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZXNldF9jb2RlKQoreworCURQKEJOWDJYX01TR19NQ1AsICJmdW5jdGlvbiAlZCAgcmVzZXRfY29kZSAleFxuIiwKKwkgICBCUF9GVU5DKGJwKSwgcmVzZXRfY29kZSk7CisKKwlzd2l0Y2ggKHJlc2V0X2NvZGUpIHsKKwljYXNlIEZXX01TR19DT0RFX0RSVl9VTkxPQURfQ09NTU9OOgorCQlibngyeF9yZXNldF9wb3J0KGJwKTsKKwkJYm54MnhfcmVzZXRfZnVuYyhicCk7CisJCWJueDJ4X3Jlc2V0X2NvbW1vbihicCk7CisJCWJyZWFrOworCisJY2FzZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQ6CisJCWJueDJ4X3Jlc2V0X3BvcnQoYnApOworCQlibngyeF9yZXNldF9mdW5jKGJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRlVOQ1RJT046CisJCWJueDJ4X3Jlc2V0X2Z1bmMoYnApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biByZXNldF9jb2RlICgweCV4KSBmcm9tIE1DUFxuIiwgcmVzZXRfY29kZSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBibngyeF9jaGlwX2NsZWFudXAoc3RydWN0IGJueDJ4ICpicCwgaW50IHVubG9hZF9tb2RlKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJdTMyIHJlc2V0X2NvZGUgPSAwOworCWludCBpLCBjbnQsIHJjOworCisJLyogV2FpdCB1bnRpbCB0eCBmYXN0cGF0aCB0YXNrcyBjb21wbGV0ZSAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCisJCWNudCA9IDEwMDA7CisJCXdoaWxlIChibngyeF9oYXNfdHhfd29ya191bmxvYWQoZnApKSB7CisKKwkJCWJueDJ4X3R4X2ludChmcCk7CisJCQlpZiAoIWNudCkgeworCQkJCUJOWDJYX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBxdWV1ZVslZF1cbiIsCisJCQkJCSAgaSk7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQkJCWJueDJ4X3BhbmljKCk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKyNlbHNlCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCX0KKwkJCWNudC0tOworCQkJbXNsZWVwKDEpOworCQl9CisJfQorCS8qIEdpdmUgSFcgdGltZSB0byBkaXNjYXJkIG9sZCB0eCBtZXNzYWdlcyAqLworCW1zbGVlcCgxKTsKKworCWlmIChDSElQX0lTX0UxKGJwKSkgeworCQlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcgPQorCQkJCQkJYm54Mnhfc3AoYnAsIG1jYXN0X2NvbmZpZyk7CisKKwkJYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMShicCwgMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+aGRyLmxlbmd0aDsgaSsrKQorCQkJQ0FNX0lOVkFMSURBVEUoY29uZmlnLT5jb25maWdfdGFibGVbaV0pOworCisJCWNvbmZpZy0+aGRyLmxlbmd0aCA9IGk7CisJCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKKwkJCWNvbmZpZy0+aGRyLm9mZnNldCA9IEJOWDJYX01BWF9FTVVMX01VTFRJKigxICsgcG9ydCk7CisJCWVsc2UKKwkJCWNvbmZpZy0+aGRyLm9mZnNldCA9IEJOWDJYX01BWF9NVUxUSUNBU1QqKDEgKyBwb3J0KTsKKwkJY29uZmlnLT5oZHIuY2xpZW50X2lkID0gYnAtPmZwLT5jbF9pZDsKKwkJY29uZmlnLT5oZHIucmVzZXJ2ZWQxID0gMDsKKworCQlicC0+c2V0X21hY19wZW5kaW5nKys7CisJCXNtcF93bWIoKTsKKworCQlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDLCAwLAorCQkJICAgICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X2NvbmZpZykpLAorCQkJICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X2NvbmZpZykpLCAwKTsKKworCX0gZWxzZSB7IC8qIEUxSCAqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9GVU5DX0VOICsgcG9ydCo4LCAwKTsKKworCQlibngyeF9zZXRfZXRoX21hY19hZGRyX2UxaChicCwgMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1DX0hBU0hfU0laRTsgaSsrKQorCQkJUkVHX1dSKGJwLCBNQ19IQVNIX09GRlNFVChicCwgaSksIDApOworCisJCVJFR19XUihicCwgTUlTQ19SRUdfRTFITUZfTU9ERSwgMCk7CisJfQorI2lmZGVmIEJDTV9DTklDCisJLyogQ2xlYXIgaVNDU0kgTDIgTUFDICovCisJbXV0ZXhfbG9jaygmYnAtPmNuaWNfbXV0ZXgpOworCWlmIChicC0+Y25pY19mbGFncyAmIEJOWDJYX0NOSUNfRkxBR19NQUNfU0VUKSB7CisJCWJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoYnAsIDApOworCQlicC0+Y25pY19mbGFncyAmPSB+Qk5YMlhfQ05JQ19GTEFHX01BQ19TRVQ7CisJfQorCW11dGV4X3VubG9jaygmYnAtPmNuaWNfbXV0ZXgpOworI2VuZGlmCisKKwlpZiAodW5sb2FkX21vZGUgPT0gVU5MT0FEX05PUk1BTCkKKwkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9ESVM7CisKKwllbHNlIGlmIChicC0+ZmxhZ3MgJiBOT19XT0xfRkxBRykKKwkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9NQ1A7CisKKwllbHNlIGlmIChicC0+d29sKSB7CisJCXUzMiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CisJCXU4ICptYWNfYWRkciA9IGJwLT5kZXYtPmRldl9hZGRyOworCQl1MzIgdmFsOworCQkvKiBUaGUgbWFjIGFkZHJlc3MgaXMgd3JpdHRlbiB0byBlbnRyaWVzIDEtNCB0bworCQkgICBwcmVzZXJ2ZSBlbnRyeSAwIHdoaWNoIGlzIHVzZWQgYnkgdGhlIFBNRiAqLworCQl1OCBlbnRyeSA9IChCUF9FMUhWTihicCkgKyAxKSo4OworCisJCXZhbCA9IChtYWNfYWRkclswXSA8PCA4KSB8IG1hY19hZGRyWzFdOworCQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01BQ19NQVRDSCArIGVudHJ5LCB2YWwpOworCisJCXZhbCA9IChtYWNfYWRkclsyXSA8PCAyNCkgfCAobWFjX2FkZHJbM10gPDwgMTYpIHwKKwkJICAgICAgKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07CisJCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTUFDX01BVENIICsgZW50cnkgKyA0LCB2YWwpOworCisJCXJlc2V0X2NvZGUgPSBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfRU47CisKKwl9IGVsc2UKKwkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9ESVM7CisKKwkvKiBDbG9zZSBtdWx0aSBhbmQgbGVhZGluZyBjb25uZWN0aW9ucworCSAgIENvbXBsZXRpb25zIGZvciByYW1yb2RzIGFyZSBjb2xsZWN0ZWQgaW4gYSBzeW5jaHJvbm91cyB3YXkgKi8KKwlmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCBpKQorCQlpZiAoYm54Mnhfc3RvcF9tdWx0aShicCwgaSkpCisJCQlnb3RvIHVubG9hZF9lcnJvcjsKKworCXJjID0gYm54Mnhfc3RvcF9sZWFkaW5nKGJwKTsKKwlpZiAocmMpIHsKKwkJQk5YMlhfRVJSKCJTdG9wIGxlYWRpbmcgZmFpbGVkIVxuIik7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQlyZXR1cm4gLUVCVVNZOworI2Vsc2UKKwkJZ290byB1bmxvYWRfZXJyb3I7CisjZW5kaWYKKwl9CisKK3VubG9hZF9lcnJvcjoKKwlpZiAoIUJQX05PTUNQKGJwKSkKKwkJcmVzZXRfY29kZSA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIHJlc2V0X2NvZGUpOworCWVsc2UgeworCQlEUChORVRJRl9NU0dfSUZET1dOLCAiTk8gTUNQIC0gbG9hZCBjb3VudHMgICAgICAlZCwgJWQsICVkXG4iLAorCQkgICBsb2FkX2NvdW50WzBdLCBsb2FkX2NvdW50WzFdLCBsb2FkX2NvdW50WzJdKTsKKwkJbG9hZF9jb3VudFswXS0tOworCQlsb2FkX2NvdW50WzEgKyBwb3J0XS0tOworCQlEUChORVRJRl9NU0dfSUZET1dOLCAiTk8gTUNQIC0gbmV3IGxvYWQgY291bnRzICAlZCwgJWQsICVkXG4iLAorCQkgICBsb2FkX2NvdW50WzBdLCBsb2FkX2NvdW50WzFdLCBsb2FkX2NvdW50WzJdKTsKKwkJaWYgKGxvYWRfY291bnRbMF0gPT0gMCkKKwkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTjsKKwkJZWxzZSBpZiAobG9hZF9jb3VudFsxICsgcG9ydF0gPT0gMCkKKwkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQ7CisJCWVsc2UKKwkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0ZVTkNUSU9OOworCX0KKworCWlmICgocmVzZXRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTikgfHwKKwkgICAgKHJlc2V0X2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX1VOTE9BRF9QT1JUKSkKKwkJYm54MnhfX2xpbmtfcmVzZXQoYnApOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlibngyeF9yZXNldF9jaGlwKGJwLCByZXNldF9jb2RlKTsKKworCS8qIFJlcG9ydCBVTkxPQURfRE9ORSB0byBNQ1AgKi8KKwlpZiAoIUJQX05PTUNQKGJwKSkKKwkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FKTsKKworfQorCit2b2lkIGJueDJ4X2Rpc2FibGVfY2xvc2VfdGhlX2dhdGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsOworCisJRFAoTkVUSUZfTVNHX0hXLCAiRGlzYWJsaW5nIFwiY2xvc2UgdGhlIGdhdGVzXCJcbiIpOworCisJaWYgKENISVBfSVNfRTEoYnApKSB7CisJCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJCXUzMiBhZGRyID0gcG9ydCA/IE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18xIDoKKwkJCU1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18wOworCisJCXZhbCA9IFJFR19SRChicCwgYWRkcik7CisJCXZhbCAmPSB+KDB4MzAwKTsKKwkJUkVHX1dSKGJwLCBhZGRyLCB2YWwpOworCX0gZWxzZSBpZiAoQ0hJUF9JU19FMUgoYnApKSB7CisJCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfTUFTSyk7CisJCXZhbCAmPSB+KE1JU0NfQUVVX0dFTkVSQUxfTUFTS19SRUdfQUVVX1BYUF9DTE9TRV9NQVNLIHwKKwkJCSBNSVNDX0FFVV9HRU5FUkFMX01BU0tfUkVHX0FFVV9OSUdfQ0xPU0VfTUFTSyk7CisJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfTUFTSywgdmFsKTsKKwl9Cit9CisKKworLyogQ2xvc2UgZ2F0ZXMgIzIsICMzIGFuZCAjNDogKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3NldF8yMzRfZ2F0ZXMoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBjbG9zZSkKK3sKKwl1MzIgdmFsLCBhZGRyOworCisJLyogR2F0ZXMgIzIgYW5kICM0YSBhcmUgY2xvc2VkL29wZW5lZCBmb3IgIm5vdCBFMSIgb25seSAqLworCWlmICghQ0hJUF9JU19FMShicCkpIHsKKwkJLyogIzQgKi8KKwkJdmFsID0gUkVHX1JEKGJwLCBQWFBfUkVHX0hTVF9ESVNDQVJEX0RPT1JCRUxMUyk7CisJCVJFR19XUihicCwgUFhQX1JFR19IU1RfRElTQ0FSRF9ET09SQkVMTFMsCisJCSAgICAgICBjbG9zZSA/ICh2YWwgfCAweDEpIDogKHZhbCAmICh+KHUzMikxKSkpOworCQkvKiAjMiAqLworCQl2YWwgPSBSRUdfUkQoYnAsIFBYUF9SRUdfSFNUX0RJU0NBUkRfSU5URVJOQUxfV1JJVEVTKTsKKwkJUkVHX1dSKGJwLCBQWFBfUkVHX0hTVF9ESVNDQVJEX0lOVEVSTkFMX1dSSVRFUywKKwkJICAgICAgIGNsb3NlID8gKHZhbCB8IDB4MSkgOiAodmFsICYgKH4odTMyKTEpKSk7CisJfQorCisJLyogIzMgKi8KKwlhZGRyID0gQlBfUE9SVChicCkgPyBIQ19SRUdfQ09ORklHXzEgOiBIQ19SRUdfQ09ORklHXzA7CisJdmFsID0gUkVHX1JEKGJwLCBhZGRyKTsKKwlSRUdfV1IoYnAsIGFkZHIsICghY2xvc2UpID8gKHZhbCB8IDB4MSkgOiAodmFsICYgKH4odTMyKTEpKSk7CisKKwlEUChORVRJRl9NU0dfSFcsICIlcyBnYXRlcyAjMiwgIzMgYW5kICM0XG4iLAorCQljbG9zZSA/ICJjbG9zaW5nIiA6ICJvcGVuaW5nIik7CisJbW1pb3diKCk7Cit9CisKKyNkZWZpbmUgU0hBUkVEX01GX0NMUF9NQUdJQyAgMHg4MDAwMDAwMCAvKiBgbWFnaWMnIGJpdCAqLworCitzdGF0aWMgdm9pZCBibngyeF9jbHBfcmVzZXRfcHJlcChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgKm1hZ2ljX3ZhbCkKK3sKKwkvKiBEbyBzb21lIG1hZ2ljLi4uICovCisJdTMyIHZhbCA9IE1GX0NGR19SRChicCwgc2hhcmVkX21mX2NvbmZpZy5jbHBfbWIpOworCSptYWdpY192YWwgPSB2YWwgJiBTSEFSRURfTUZfQ0xQX01BR0lDOworCU1GX0NGR19XUihicCwgc2hhcmVkX21mX2NvbmZpZy5jbHBfbWIsIHZhbCB8IFNIQVJFRF9NRl9DTFBfTUFHSUMpOworfQorCisvKiBSZXN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgYG1hZ2ljJyBiaXQuCisgKgorICogQHBhcmFtIHBkZXYgRGV2aWNlIGhhbmRsZS4KKyAqIEBwYXJhbSBtYWdpY192YWwgT2xkIHZhbHVlIG9mIHRoZSBgbWFnaWMnIGJpdC4KKyAqLworc3RhdGljIHZvaWQgYm54MnhfY2xwX3Jlc2V0X2RvbmUoc3RydWN0IGJueDJ4ICpicCwgdTMyIG1hZ2ljX3ZhbCkKK3sKKwkvKiBSZXN0b3JlIHRoZSBgbWFnaWMnIGJpdCB2YWx1ZS4uLiAqLworCS8qIHUzMiB2YWwgPSBTSE1FTV9SRChicCwgbWZfY2ZnLnNoYXJlZF9tZl9jb25maWcuY2xwX21iKTsKKwlTSE1FTV9XUihicCwgbWZfY2ZnLnNoYXJlZF9tZl9jb25maWcuY2xwX21iLAorCQkodmFsICYgKH5TSEFSRURfTUZfQ0xQX01BR0lDKSkgfCBtYWdpY192YWwpOyAqLworCXUzMiB2YWwgPSBNRl9DRkdfUkQoYnAsIHNoYXJlZF9tZl9jb25maWcuY2xwX21iKTsKKwlNRl9DRkdfV1IoYnAsIHNoYXJlZF9tZl9jb25maWcuY2xwX21iLAorCQkodmFsICYgKH5TSEFSRURfTUZfQ0xQX01BR0lDKSkgfCBtYWdpY192YWwpOworfQorCisvKiBQcmVwYXJlcyBmb3IgTUNQIHJlc2V0OiB0YWtlcyBjYXJlIG9mIENMUCBjb25maWd1cmF0aW9ucy4KKyAqCisgKiBAcGFyYW0gYnAKKyAqIEBwYXJhbSBtYWdpY192YWwgT2xkIHZhbHVlIG9mICdtYWdpYycgYml0LgorICovCitzdGF0aWMgdm9pZCBibngyeF9yZXNldF9tY3BfcHJlcChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgKm1hZ2ljX3ZhbCkKK3sKKwl1MzIgc2htZW07CisJdTMyIHZhbGlkaXR5X29mZnNldDsKKworCURQKE5FVElGX01TR19IVywgIlN0YXJ0aW5nXG4iKTsKKworCS8qIFNldCBgbWFnaWMnIGJpdCBpbiBvcmRlciB0byBzYXZlIE1GIGNvbmZpZyAqLworCWlmICghQ0hJUF9JU19FMShicCkpCisJCWJueDJ4X2NscF9yZXNldF9wcmVwKGJwLCBtYWdpY192YWwpOworCisJLyogR2V0IHNobWVtIG9mZnNldCAqLworCXNobWVtID0gUkVHX1JEKGJwLCBNSVNDX1JFR19TSEFSRURfTUVNX0FERFIpOworCXZhbGlkaXR5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sIHZhbGlkaXR5X21hcFswXSk7CisKKwkvKiBDbGVhciB2YWxpZGl0eSBtYXAgZmxhZ3MgKi8KKwlpZiAoc2htZW0gPiAwKQorCQlSRUdfV1IoYnAsIHNobWVtICsgdmFsaWRpdHlfb2Zmc2V0LCAwKTsKK30KKworI2RlZmluZSBNQ1BfVElNRU9VVCAgICAgIDUwMDAgICAvKiA1IHNlY29uZHMgKGluIG1zKSAqLworI2RlZmluZSBNQ1BfT05FX1RJTUVPVVQgIDEwMCAgICAvKiAxMDAgbXMgKi8KKworLyogV2FpdHMgZm9yIE1DUF9PTkVfVElNRU9VVCBvciBNQ1BfT05FX1RJTUVPVVQqMTAsCisgKiBkZXBlbmRpbmcgb24gdGhlIEhXIHR5cGUuCisgKgorICogQHBhcmFtIGJwCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9tY3Bfd2FpdF9vbmUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwkvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBlbXVsYXRpb24gYW5kIEZQR0EsCisJICAgd2FpdCAxMCB0aW1lcyBsb25nZXIgKi8KKwlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCW1zbGVlcChNQ1BfT05FX1RJTUVPVVQqMTApOworCWVsc2UKKwkJbXNsZWVwKE1DUF9PTkVfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcmVzZXRfbWNwX2NvbXAoc3RydWN0IGJueDJ4ICpicCwgdTMyIG1hZ2ljX3ZhbCkKK3sKKwl1MzIgc2htZW0sIGNudCwgdmFsaWRpdHlfb2Zmc2V0LCB2YWw7CisJaW50IHJjID0gMDsKKworCW1zbGVlcCgxMDApOworCisJLyogR2V0IHNobWVtIG9mZnNldCAqLworCXNobWVtID0gUkVHX1JEKGJwLCBNSVNDX1JFR19TSEFSRURfTUVNX0FERFIpOworCWlmIChzaG1lbSA9PSAwKSB7CisJCUJOWDJYX0VSUigiU2htZW0gMCByZXR1cm4gZmFpbHVyZVxuIik7CisJCXJjID0gLUVOT1RUWTsKKwkJZ290byBleGl0X2xibDsKKwl9CisKKwl2YWxpZGl0eV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCB2YWxpZGl0eV9tYXBbMF0pOworCisJLyogV2FpdCBmb3IgTUNQIHRvIGNvbWUgdXAgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IChNQ1BfVElNRU9VVCAvIE1DUF9PTkVfVElNRU9VVCk7IGNudCsrKSB7CisJCS8qIFRCRDogaXRzIGJlc3QgdG8gY2hlY2sgdmFsaWRpdHkgbWFwIG9mIGxhc3QgcG9ydC4KKwkJICogY3VycmVudGx5IGNoZWNrcyBvbiBwb3J0IDAuCisJCSAqLworCQl2YWwgPSBSRUdfUkQoYnAsIHNobWVtICsgdmFsaWRpdHlfb2Zmc2V0KTsKKwkJRFAoTkVUSUZfTVNHX0hXLCAic2htZW0gMHgleCB2YWxpZGl0eSBtYXAoMHgleCk9MHgleFxuIiwgc2htZW0sCisJCSAgIHNobWVtICsgdmFsaWRpdHlfb2Zmc2V0LCB2YWwpOworCisJCS8qIGNoZWNrIHRoYXQgc2hhcmVkIG1lbW9yeSBpcyB2YWxpZC4gKi8KKwkJaWYgKCh2YWwgJiAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1fVkFMSURJVFlfTUIpKQorCQkgICAgPT0gKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKKwkJCWJyZWFrOworCisJCWJueDJ4X21jcF93YWl0X29uZShicCk7CisJfQorCisJRFAoTkVUSUZfTVNHX0hXLCAiQ250PSVkIFNobWVtIHZhbGlkaXR5IG1hcCAweCV4XG4iLCBjbnQsIHZhbCk7CisKKwkvKiBDaGVjayB0aGF0IHNoYXJlZCBtZW1vcnkgaXMgdmFsaWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgTUNQIGlzIHVwLiAqLworCWlmICgodmFsICYgKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkgIT0KKwkgICAgKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkgeworCQlCTlgyWF9FUlIoIlNobWVtIHNpZ25hdHVyZSBub3QgcHJlc2VudC4gTUNQIGlzIG5vdCB1cCAhIVxuIik7CisJCXJjID0gLUVOT1RUWTsKKwkJZ290byBleGl0X2xibDsKKwl9CisKK2V4aXRfbGJsOgorCS8qIFJlc3RvcmUgdGhlIGBtYWdpYycgYml0IHZhbHVlICovCisJaWYgKCFDSElQX0lTX0UxKGJwKSkKKwkJYm54MnhfY2xwX3Jlc2V0X2RvbmUoYnAsIG1hZ2ljX3ZhbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3B4cF9wcmVwKHN0cnVjdCBibngyeCAqYnApCit7CisJaWYgKCFDSElQX0lTX0UxKGJwKSkgeworCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX1NUQVJUX0lOSVQsIDApOworCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1JCQ19ET05FLCAwKTsKKwkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9DRkdfRE9ORSwgMCk7CisJCW1taW93YigpOworCX0KK30KKworLyoKKyAqIFJlc2V0IHRoZSB3aG9sZSBjaGlwIGV4Y2VwdCBmb3I6CisgKiAgICAgIC0gUENJRSBjb3JlCisgKiAgICAgIC0gUENJIEdsdWUsIFBTV0hTVCwgUFhQL1BYUDIgUkYgKGFsbCBjb250cm9sbGVkIGJ5CisgKiAgICAgICAgICAgICAgb25lIHJlc2V0IGJpdCkKKyAqICAgICAgLSBJR1UKKyAqICAgICAgLSBNSVNDIChpbmNsdWRpbmcgQUVVKQorICogICAgICAtIEdSQworICogICAgICAtIFJCQ04sIFJCQ1AKKyAqLworc3RhdGljIHZvaWQgYm54MnhfcHJvY2Vzc19raWxsX2NoaXBfcmVzZXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgbm90X3Jlc2V0X21hc2sxLCByZXNldF9tYXNrMSwgbm90X3Jlc2V0X21hc2syLCByZXNldF9tYXNrMjsKKworCW5vdF9yZXNldF9tYXNrMSA9CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1JTVF9IQyB8CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1JTVF9QWFBWIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfUlNUX1BYUDsKKworCW5vdF9yZXNldF9tYXNrMiA9CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NRElPIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMwX0hBUkRfQ09SRSB8CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9FTUFDMV9IQVJEX0NPUkUgfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfTUlTQ19DT1JFIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX1JCQ04gfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfR1JDICB8CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9SRVNFVF9SRUdfSEFSRF9DT1JFIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX01DUF9OX0hBUkRfQ09SRV9SU1RfQjsKKworCXJlc2V0X21hc2sxID0gMHhmZmZmZmZmZjsKKworCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJcmVzZXRfbWFzazIgPSAweGZmZmY7CisJZWxzZQorCQlyZXNldF9tYXNrMiA9IDB4MWZmZmY7CisKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLAorCSAgICAgICByZXNldF9tYXNrMSAmICh+bm90X3Jlc2V0X21hc2sxKSk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9DTEVBUiwKKwkgICAgICAgcmVzZXRfbWFzazIgJiAofm5vdF9yZXNldF9tYXNrMikpOworCisJYmFycmllcigpOworCW1taW93YigpOworCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9TRVQsIHJlc2V0X21hc2sxKTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1NFVCwgcmVzZXRfbWFzazIpOworCW1taW93YigpOworfQorCitzdGF0aWMgaW50IGJueDJ4X3Byb2Nlc3Nfa2lsbChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBjbnQgPSAxMDAwOworCXUzMiB2YWwgPSAwOworCXUzMiBzcl9jbnQsIGJsa19jbnQsIHBvcnRfaXNfaWRsZV8wLCBwb3J0X2lzX2lkbGVfMSwgcGdsX2V4cF9yb20yOworCisKKwkvKiBFbXB0eSB0aGUgVGV0cmlzIGJ1ZmZlciwgd2FpdCBmb3IgMXMgKi8KKwlkbyB7CisJCXNyX2NudCAgPSBSRUdfUkQoYnAsIFBYUDJfUkVHX1JEX1NSX0NOVCk7CisJCWJsa19jbnQgPSBSRUdfUkQoYnAsIFBYUDJfUkVHX1JEX0JMS19DTlQpOworCQlwb3J0X2lzX2lkbGVfMCA9IFJFR19SRChicCwgUFhQMl9SRUdfUkRfUE9SVF9JU19JRExFXzApOworCQlwb3J0X2lzX2lkbGVfMSA9IFJFR19SRChicCwgUFhQMl9SRUdfUkRfUE9SVF9JU19JRExFXzEpOworCQlwZ2xfZXhwX3JvbTIgPSBSRUdfUkQoYnAsIFBYUDJfUkVHX1BHTF9FWFBfUk9NMik7CisJCWlmICgoc3JfY250ID09IDB4N2UpICYmIChibGtfY250ID09IDB4YTApICYmCisJCSAgICAoKHBvcnRfaXNfaWRsZV8wICYgMHgxKSA9PSAweDEpICYmCisJCSAgICAoKHBvcnRfaXNfaWRsZV8xICYgMHgxKSA9PSAweDEpICYmCisJCSAgICAocGdsX2V4cF9yb20yID09IDB4ZmZmZmZmZmYpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9IHdoaWxlIChjbnQtLSA+IDApOworCisJaWYgKGNudCA8PSAwKSB7CisJCURQKE5FVElGX01TR19IVywgIlRldHJpcyBidWZmZXIgZGlkbid0IGdldCBlbXB0eSBvciB0aGVyZSIKKwkJCSAgIiBhcmUgc3RpbGwiCisJCQkgICIgb3V0c3RhbmRpbmcgcmVhZCByZXF1ZXN0cyBhZnRlciAxcyFcbiIpOworCQlEUChORVRJRl9NU0dfSFcsICJzcl9jbnQ9MHglMDh4LCBibGtfY250PTB4JTA4eCwiCisJCQkgICIgcG9ydF9pc19pZGxlXzA9MHglMDh4LCIKKwkJCSAgIiBwb3J0X2lzX2lkbGVfMT0weCUwOHgsIHBnbF9leHBfcm9tMj0weCUwOHhcbiIsCisJCQkgIHNyX2NudCwgYmxrX2NudCwgcG9ydF9pc19pZGxlXzAsIHBvcnRfaXNfaWRsZV8xLAorCQkJICBwZ2xfZXhwX3JvbTIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwliYXJyaWVyKCk7CisKKwkvKiBDbG9zZSBnYXRlcyAjMiwgIzMgYW5kICM0ICovCisJYm54Mnhfc2V0XzIzNF9nYXRlcyhicCwgdHJ1ZSk7CisKKwkvKiBUQkQ6IEluZGljYXRlIHRoYXQgInByb2Nlc3Mga2lsbCIgaXMgaW4gcHJvZ3Jlc3MgdG8gTUNQICovCisKKwkvKiBDbGVhciAidW5wcmVwYXJlZCIgYml0ICovCisJUkVHX1dSKGJwLCBNSVNDX1JFR19VTlBSRVBBUkVELCAwKTsKKwliYXJyaWVyKCk7CisKKwkvKiBNYWtlIHN1cmUgYWxsIGlzIHdyaXR0ZW4gdG8gdGhlIGNoaXAgYmVmb3JlIHRoZSByZXNldCAqLworCW1taW93YigpOworCisJLyogV2FpdCBmb3IgMW1zIHRvIGVtcHR5IEdMVUUgYW5kIFBDSS1FIGNvcmUgcXVldWVzLAorCSAqIFBTV0hTVCwgR1JDIGFuZCBQU1dSRCBUZXRyaXMgYnVmZmVyLgorCSAqLworCW1zbGVlcCgxKTsKKworCS8qIFByZXBhcmUgdG8gY2hpcCByZXNldDogKi8KKwkvKiBNQ1AgKi8KKwlibngyeF9yZXNldF9tY3BfcHJlcChicCwgJnZhbCk7CisKKwkvKiBQWFAgKi8KKwlibngyeF9weHBfcHJlcChicCk7CisJYmFycmllcigpOworCisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlibngyeF9wcm9jZXNzX2tpbGxfY2hpcF9yZXNldChicCk7CisJYmFycmllcigpOworCisJLyogUmVjb3ZlciBhZnRlciByZXNldDogKi8KKwkvKiBNQ1AgKi8KKwlpZiAoYm54MnhfcmVzZXRfbWNwX2NvbXAoYnAsIHZhbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogUFhQICovCisJYm54MnhfcHhwX3ByZXAoYnApOworCisJLyogT3BlbiB0aGUgZ2F0ZXMgIzIsICMzIGFuZCAjNCAqLworCWJueDJ4X3NldF8yMzRfZ2F0ZXMoYnAsIGZhbHNlKTsKKworCS8qIFRCRDogSUdVL0FFVSBwcmVwYXJhdGlvbiBicmluZyBiYWNrIHRoZSBBRVUvSUdVIHRvIGEKKwkgKiByZXNldCBzdGF0ZSwgcmUtZW5hYmxlIGF0dGVudGlvbnMuICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9sZWFkZXJfcmVzZXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcmMgPSAwOworCS8qIFRyeSB0byByZWNvdmVyIGFmdGVyIHRoZSBmYWlsdXJlICovCisJaWYgKGJueDJ4X3Byb2Nlc3Nfa2lsbChicCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIGJhZCBoYWQgaGFwcGVuISBBaWkhXG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFtZSk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBleGl0X2xlYWRlcl9yZXNldDsKKwl9CisKKwkvKiBDbGVhciAicmVzZXQgaXMgaW4gcHJvZ3Jlc3MiIGJpdCBhbmQgdXBkYXRlIHRoZSBkcml2ZXIgc3RhdGUgKi8KKwlibngyeF9zZXRfcmVzZXRfZG9uZShicCk7CisJYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfRE9ORTsKKworZXhpdF9sZWFkZXJfcmVzZXQ6CisJYnAtPmlzX2xlYWRlciA9IDA7CisJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KTsKKwlzbXBfd21iKCk7CisJcmV0dXJuIHJjOworfQorCisvKiBBc3N1bXB0aW9uOiBydW5zIHVuZGVyIHJ0bmwgbG9jay4gVGhpcyB0b2dldGhlciB3aXRoIHRoZSBmYWN0CisgKiB0aGF0IGl0J3MgY2FsbGVkIG9ubHkgZnJvbSBibngyeF9yZXNldF90YXNrKCkgZW5zdXJlIHRoYXQgaXQKKyAqIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gbmV0aWZfcnVubmluZyhicC0+ZGV2KSBpcyBmYWxzZS4KKyAqLworc3RhdGljIHZvaWQgYm54MnhfcGFyaXR5X3JlY292ZXIoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlEUChORVRJRl9NU0dfSFcsICJIYW5kbGluZyBwYXJpdHlcbiIpOworCXdoaWxlICgxKSB7CisJCXN3aXRjaCAoYnAtPnJlY292ZXJ5X3N0YXRlKSB7CisJCWNhc2UgQk5YMlhfUkVDT1ZFUllfSU5JVDoKKwkJCURQKE5FVElGX01TR19IVywgIlN0YXRlIGlzIEJOWDJYX1JFQ09WRVJZX0lOSVRcbiIpOworCQkJLyogVHJ5IHRvIGdldCBhIExFQURFUl9MT0NLIEhXIGxvY2sgKi8KKwkJCWlmIChibngyeF90cnlsb2NrX2h3X2xvY2soYnAsCisJCQkJSFdfTE9DS19SRVNPVVJDRV9SRVNFUlZFRF8wOCkpCisJCQkJYnAtPmlzX2xlYWRlciA9IDE7CisKKwkJCS8qIFN0b3AgdGhlIGRyaXZlciAqLworCQkJLyogSWYgaW50ZXJmYWNlIGhhcyBiZWVuIHJlbW92ZWQgLSBicmVhayAqLworCQkJaWYgKGJueDJ4X25pY191bmxvYWQoYnAsIFVOTE9BRF9SRUNPVkVSWSkpCisJCQkJcmV0dXJuOworCisJCQlicC0+cmVjb3Zlcnlfc3RhdGUgPSBCTlgyWF9SRUNPVkVSWV9XQUlUOworCQkJLyogRW5zdXJlICJpc19sZWFkZXIiIGFuZCAicmVjb3Zlcnlfc3RhdGUiCisJCQkgKiAgdXBkYXRlIHZhbHVlcyBhcmUgc2VlbiBvbiBvdGhlciBDUFVzCisJCQkgKi8KKwkJCXNtcF93bWIoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQk5YMlhfUkVDT1ZFUllfV0FJVDoKKwkJCURQKE5FVElGX01TR19IVywgIlN0YXRlIGlzIEJOWDJYX1JFQ09WRVJZX1dBSVRcbiIpOworCQkJaWYgKGJwLT5pc19sZWFkZXIpIHsKKwkJCQl1MzIgbG9hZF9jb3VudGVyID0gYm54MnhfZ2V0X2xvYWRfY250KGJwKTsKKwkJCQlpZiAobG9hZF9jb3VudGVyKSB7CisJCQkJCS8qIFdhaXQgdW50aWwgYWxsIG90aGVyIGZ1bmN0aW9ucyBnZXQKKwkJCQkJICogZG93bi4KKwkJCQkJICovCisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnJlc2V0X3Rhc2ssCisJCQkJCQkJCUhaLzEwKTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIElmIGFsbCBvdGhlciBmdW5jdGlvbnMgZ290IGRvd24gLQorCQkJCQkgKiB0cnkgdG8gYnJpbmcgdGhlIGNoaXAgYmFjayB0bworCQkJCQkgKiBub3JtYWwuIEluIGFueSBjYXNlIGl0J3MgYW4gZXhpdAorCQkJCQkgKiBwb2ludCBmb3IgYSBsZWFkZXIuCisJCQkJCSAqLworCQkJCQlpZiAoYm54MnhfbGVhZGVyX3Jlc2V0KGJwKSB8fAorCQkJCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIiJXM6IFJlY292ZXJ5ICIKKwkJCQkJCSJoYXMgZmFpbGVkLiBQb3dlciBjeWNsZSBpcyAiCisJCQkJCQkibmVlZGVkLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQkJCQkvKiBEaXNjb25uZWN0IHRoaXMgZGV2aWNlICovCisJCQkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGJwLT5kZXYpOworCQkJCQkJLyogQmxvY2sgaWZ1cCBmb3IgYWxsIGZ1bmN0aW9uCisJCQkJCQkgKiBvZiB0aGlzIEFTSUMgdW50aWwKKwkJCQkJCSAqICJwcm9jZXNzIGtpbGwiIG9yIHBvd2VyCisJCQkJCQkgKiBjeWNsZS4KKwkJCQkJCSAqLworCQkJCQkJYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKGJwKTsKKwkJCQkJCS8qIFNodXQgZG93biB0aGUgcG93ZXIgKi8KKwkJCQkJCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwKKwkJCQkJCQkJUENJX0QzaG90KTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgeyAvKiBub24tbGVhZGVyICovCisJCQkJaWYgKCFibngyeF9yZXNldF9pc19kb25lKGJwKSkgeworCQkJCQkvKiBUcnkgdG8gZ2V0IGEgTEVBREVSX0xPQ0sgSFcgbG9jayBhcworCQkJCQkgKiBsb25nIGFzIGEgZm9ybWVyIGxlYWRlciBtYXkgaGF2ZQorCQkJCQkgKiBiZWVuIHVubG9hZGVkIGJ5IHRoZSB1c2VyIG9yCisJCQkJCSAqIHJlbGVhc2VkIGEgbGVhZGVyc2hpcCBieSBhbm90aGVyCisJCQkJCSAqIHJlYXNvbi4KKwkJCQkJICovCisJCQkJCWlmIChibngyeF90cnlsb2NrX2h3X2xvY2soYnAsCisJCQkJCSAgICBIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KSkgeworCQkJCQkJLyogSSdtIGEgbGVhZGVyIG5vdyEgUmVzdGFydCBhCisJCQkJCQkgKiBzd2l0Y2ggY2FzZS4KKwkJCQkJCSAqLworCQkJCQkJYnAtPmlzX2xlYWRlciA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnJlc2V0X3Rhc2ssCisJCQkJCQkJCUhaLzEwKTsKKwkJCQkJcmV0dXJuOworCisJCQkJfSBlbHNlIHsgLyogQSBsZWFkZXIgaGFzIGNvbXBsZXRlZAorCQkJCQkgICogdGhlICJwcm9jZXNzIGtpbGwiLiBJdCdzIGFuIGV4aXQKKwkJCQkJICAqIHBvaW50IGZvciBhIG5vbi1sZWFkZXIuCisJCQkJCSAgKi8KKwkJCQkJYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKTsKKwkJCQkJYnAtPnJlY292ZXJ5X3N0YXRlID0KKwkJCQkJCUJOWDJYX1JFQ09WRVJZX0RPTkU7CisJCQkJCXNtcF93bWIoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyogYm54MnhfbmljX3VubG9hZCgpIGZsdXNoZXMgdGhlIGJueDJ4X3dxLCB0aHVzIHJlc2V0IHRhc2sgaXMKKyAqIHNjaGVkdWxlZCBvbiBhIGdlbmVyYWwgcXVldWUgaW4gb3JkZXIgdG8gcHJldmVudCBhIGRlYWQgbG9jay4KKyAqLworc3RhdGljIHZvaWQgYm54MnhfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJueDJ4ICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MngsIHJlc2V0X3Rhc2sud29yayk7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJQk5YMlhfRVJSKCJyZXNldCB0YXNrIGNhbGxlZCBidXQgU1RPUF9PTl9FUlJPUiBkZWZpbmVkIgorCQkgICIgc28gcmVzZXQgbm90IGRvbmUgdG8gYWxsb3cgZGVidWcgZHVtcCxcbiIKKwkgS0VSTl9FUlIgIiB5b3Ugd2lsbCBuZWVkIHRvIHJlYm9vdCB3aGVuIGRvbmVcbiIpOworCXJldHVybjsKKyNlbmRpZgorCisJcnRubF9sb2NrKCk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCisJCWdvdG8gcmVzZXRfdGFza19leGl0OworCisJaWYgKHVubGlrZWx5KGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSkKKwkJYm54MnhfcGFyaXR5X3JlY292ZXIoYnApOworCWVsc2UgeworCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKKwkJYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKTsKKwl9CisKK3Jlc2V0X3Rhc2tfZXhpdDoKKwlydG5sX3VubG9jaygpOworfQorCisvKiBlbmQgb2YgbmljIGxvYWQvdW5sb2FkICovCisKKy8qCisgKiBJbml0IHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgYm54MnhfZ2V0X3ByZXRlbmRfcmVnKHN0cnVjdCBibngyeCAqYnAsIGludCBmdW5jKQoreworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgMDogcmV0dXJuIFBYUDJfUkVHX1BHTF9QUkVURU5EX0ZVTkNfRjA7CisJY2FzZSAxOglyZXR1cm4gUFhQMl9SRUdfUEdMX1BSRVRFTkRfRlVOQ19GMTsKKwljYXNlIDI6CXJldHVybiBQWFAyX1JFR19QR0xfUFJFVEVORF9GVU5DX0YyOworCWNhc2UgMzoJcmV0dXJuIFBYUDJfUkVHX1BHTF9QUkVURU5EX0ZVTkNfRjM7CisJY2FzZSA0OglyZXR1cm4gUFhQMl9SRUdfUEdMX1BSRVRFTkRfRlVOQ19GNDsKKwljYXNlIDU6CXJldHVybiBQWFAyX1JFR19QR0xfUFJFVEVORF9GVU5DX0Y1OworCWNhc2UgNjoJcmV0dXJuIFBYUDJfUkVHX1BHTF9QUkVURU5EX0ZVTkNfRjY7CisJY2FzZSA3OglyZXR1cm4gUFhQMl9SRUdfUEdMX1BSRVRFTkRfRlVOQ19GNzsKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIlVuc3VwcG9ydGVkIGZ1bmN0aW9uIGluZGV4OiAlZFxuIiwgZnVuYyk7CisJCXJldHVybiAodTMyKSgtMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF91bmRpX2ludF9kaXNhYmxlX2UxaChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgb3JpZ19mdW5jKQoreworCXUzMiByZWcgPSBibngyeF9nZXRfcHJldGVuZF9yZWcoYnAsIG9yaWdfZnVuYyksIG5ld192YWw7CisKKwkvKiBGbHVzaCBhbGwgb3V0c3RhbmRpbmcgd3JpdGVzICovCisJbW1pb3diKCk7CisKKwkvKiBQcmV0ZW5kIHRvIGJlIGZ1bmN0aW9uIDAgKi8KKwlSRUdfV1IoYnAsIHJlZywgMCk7CisJLyogRmx1c2ggdGhlIEdSQyB0cmFuc2FjdGlvbiAoaW4gdGhlIGNoaXApICovCisJbmV3X3ZhbCA9IFJFR19SRChicCwgcmVnKTsKKwlpZiAobmV3X3ZhbCAhPSAwKSB7CisJCUJOWDJYX0VSUigiSG1tbS4uLiBQcmV0ZW5kIHJlZ2lzdGVyIHdhc24ndCB1cGRhdGVkOiAoMCwlZCkhXG4iLAorCQkJICBuZXdfdmFsKTsKKwkJQlVHKCk7CisJfQorCisJLyogRnJvbSBub3cgd2UgYXJlIGluIHRoZSAibGlrZS1FMSIgbW9kZSAqLworCWJueDJ4X2ludF9kaXNhYmxlKGJwKTsKKworCS8qIEZsdXNoIGFsbCBvdXRzdGFuZGluZyB3cml0ZXMgKi8KKwltbWlvd2IoKTsKKworCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGZ1bnRpb24gc2V0dGluZ3MgKi8KKwlSRUdfV1IoYnAsIHJlZywgb3JpZ19mdW5jKTsKKwluZXdfdmFsID0gUkVHX1JEKGJwLCByZWcpOworCWlmIChuZXdfdmFsICE9IG9yaWdfZnVuYykgeworCQlCTlgyWF9FUlIoIkhtbW0uLi4gUHJldGVuZCByZWdpc3RlciB3YXNuJ3QgdXBkYXRlZDogKCVkLCVkKSFcbiIsCisJCQkgIG9yaWdfZnVuYywgbmV3X3ZhbCk7CisJCUJVRygpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VuZGlfaW50X2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCwgaW50IGZ1bmMpCit7CisJaWYgKENISVBfSVNfRTFIKGJwKSkKKwkJYm54MnhfdW5kaV9pbnRfZGlzYWJsZV9lMWgoYnAsIGZ1bmMpOworCWVsc2UKKwkJYm54MnhfaW50X2Rpc2FibGUoYnApOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm54MnhfdW5kaV91bmxvYWQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGRyaXZlciBhbHJlYWR5IGxvYWRlZCAqLworCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfVU5QUkVQQVJFRCk7CisJaWYgKHZhbCA9PSAweDEpIHsKKwkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIFVOREkgZHJpdmVyCisJCSAqIFVOREkgZHJpdmVyIGluaXRpYWxpemVzIENJRCBvZmZzZXQgZm9yIG5vcm1hbCBiZWxsIHRvIDB4NworCQkgKi8KKwkJYm54MnhfYWNxdWlyZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1VOREkpOworCQl2YWwgPSBSRUdfUkQoYnAsIERPUlFfUkVHX05PUk1fQ0lEX09GU1QpOworCQlpZiAodmFsID09IDB4NykgeworCQkJdTMyIHJlc2V0X2NvZGUgPSBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfRElTOworCQkJLyogc2F2ZSBvdXIgZnVuYyAqLworCQkJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwkJCXUzMiBzd2FwX2VuOworCQkJdTMyIHN3YXBfdmFsOworCisJCQkvKiBjbGVhciB0aGUgVU5ESSBpbmRpY2F0aW9uICovCisJCQlSRUdfV1IoYnAsIERPUlFfUkVHX05PUk1fQ0lEX09GU1QsIDApOworCisJCQlCTlgyWF9ERVZfSU5GTygiVU5ESSBpcyBhY3RpdmUhIHJlc2V0IGRldmljZVxuIik7CisKKwkJCS8qIHRyeSB1bmxvYWQgVU5ESSBvbiBwb3J0IDAgKi8KKwkJCWJwLT5mdW5jID0gMDsKKwkJCWJwLT5md19zZXEgPQorCQkJICAgICAgIChTSE1FTV9SRChicCwgZnVuY19tYlticC0+ZnVuY10uZHJ2X21iX2hlYWRlcikgJgorCQkJCURSVl9NU0dfU0VRX05VTUJFUl9NQVNLKTsKKwkJCXJlc2V0X2NvZGUgPSBibngyeF9md19jb21tYW5kKGJwLCByZXNldF9jb2RlKTsKKworCQkJLyogaWYgVU5ESSBpcyBsb2FkZWQgb24gdGhlIG90aGVyIHBvcnQgKi8KKwkJCWlmIChyZXNldF9jb2RlICE9IEZXX01TR19DT0RFX0RSVl9VTkxPQURfQ09NTU9OKSB7CisKKwkJCQkvKiBzZW5kICJET05FIiBmb3IgcHJldmlvdXMgdW5sb2FkICovCisJCQkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FKTsKKworCQkJCS8qIHVubG9hZCBVTkRJIG9uIHBvcnQgMSAqLworCQkJCWJwLT5mdW5jID0gMTsKKwkJCQlicC0+Zndfc2VxID0KKwkJCSAgICAgICAoU0hNRU1fUkQoYnAsIGZ1bmNfbWJbYnAtPmZ1bmNdLmRydl9tYl9oZWFkZXIpICYKKwkJCQkJRFJWX01TR19TRVFfTlVNQkVSX01BU0spOworCQkJCXJlc2V0X2NvZGUgPSBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfRElTOworCisJCQkJYm54MnhfZndfY29tbWFuZChicCwgcmVzZXRfY29kZSk7CisJCQl9CisKKwkJCS8qIG5vdyBpdCdzIHNhZmUgdG8gcmVsZWFzZSB0aGUgbG9jayAqLworCQkJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1VOREkpOworCisJCQlibngyeF91bmRpX2ludF9kaXNhYmxlKGJwLCBmdW5jKTsKKworCQkJLyogY2xvc2UgaW5wdXQgdHJhZmZpYyBhbmQgd2FpdCBmb3IgaXQgKi8KKwkJCS8qIERvIG5vdCByY3YgcGFja2V0cyB0byBCUkIgKi8KKwkJCVJFR19XUihicCwKKwkJCSAgICAgIChCUF9QT1JUKGJwKSA/IE5JR19SRUdfTExIMV9CUkIxX0RSVl9NQVNLIDoKKwkJCQkJICAgICBOSUdfUkVHX0xMSDBfQlJCMV9EUlZfTUFTSyksIDB4MCk7CisJCQkvKiBEbyBub3QgZGlyZWN0IHJjdiBwYWNrZXRzIHRoYXQgYXJlIG5vdCBmb3IgTUNQIHRvCisJCQkgKiB0aGUgQlJCICovCisJCQlSRUdfV1IoYnAsCisJCQkgICAgICAgKEJQX1BPUlQoYnApID8gTklHX1JFR19MTEgxX0JSQjFfTk9UX01DUCA6CisJCQkJCSAgICAgIE5JR19SRUdfTExIMF9CUkIxX05PVF9NQ1ApLCAweDApOworCQkJLyogY2xlYXIgQUVVICovCisJCQlSRUdfV1IoYnAsCisJCQkgICAgIChCUF9QT1JUKGJwKSA/IE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18xIDoKKwkJCQkJICAgIE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18wKSwgMCk7CisJCQltc2xlZXAoMTApOworCisJCQkvKiBzYXZlIE5JRyBwb3J0IHN3YXAgaW5mbyAqLworCQkJc3dhcF92YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKTsKKwkJCXN3YXBfZW4gPSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpOworCQkJLyogcmVzZXQgZGV2aWNlICovCisJCQlSRUdfV1IoYnAsCisJCQkgICAgICAgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIsCisJCQkgICAgICAgMHhkM2ZmZmZmZik7CisJCQlSRUdfV1IoYnAsCisJCQkgICAgICAgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCisJCQkgICAgICAgMHgxNDAzKTsKKwkJCS8qIHRha2UgdGhlIE5JRyBvdXQgb2YgcmVzZXQgYW5kIHJlc3RvcmUgc3dhcCB2YWx1ZXMgKi8KKwkJCVJFR19XUihicCwKKwkJCSAgICAgICBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9TRVQsCisJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfUlNUX05JRyk7CisJCQlSRUdfV1IoYnAsIE5JR19SRUdfUE9SVF9TV0FQLCBzd2FwX3ZhbCk7CisJCQlSRUdfV1IoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUsIHN3YXBfZW4pOworCisJCQkvKiBzZW5kIHVubG9hZCBkb25lIHRvIHRoZSBNQ1AgKi8KKwkJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9VTkxPQURfRE9ORSk7CisKKwkJCS8qIHJlc3RvcmUgb3VyIGZ1bmMgYW5kIGZ3X3NlcSAqLworCQkJYnAtPmZ1bmMgPSBmdW5jOworCQkJYnAtPmZ3X3NlcSA9CisJCQkgICAgICAgKFNITUVNX1JEKGJwLCBmdW5jX21iW2JwLT5mdW5jXS5kcnZfbWJfaGVhZGVyKSAmCisJCQkJRFJWX01TR19TRVFfTlVNQkVSX01BU0spOworCisJCX0gZWxzZQorCQkJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1VOREkpOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X2dldF9jb21tb25faHdpbmZvKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbCwgdmFsMiwgdmFsMywgdmFsNCwgaWQ7CisJdTE2IHBtYzsKKworCS8qIEdldCB0aGUgY2hpcCByZXZpc2lvbiBpZCBhbmQgbnVtYmVyLiAqLworCS8qIGNoaXAgbnVtOjE2LTMxLCByZXY6MTItMTUsIG1ldGFsOjQtMTEsIGJvbmRfaWQ6MC0zICovCisJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19DSElQX05VTSk7CisJaWQgPSAoKHZhbCAmIDB4ZmZmZikgPDwgMTYpOworCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfQ0hJUF9SRVYpOworCWlkIHw9ICgodmFsICYgMHhmKSA8PCAxMik7CisJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19DSElQX01FVEFMKTsKKwlpZCB8PSAoKHZhbCAmIDB4ZmYpIDw8IDQpOworCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfQk9ORF9JRCk7CisJaWQgfD0gKHZhbCAmIDB4Zik7CisJYnAtPmNvbW1vbi5jaGlwX2lkID0gaWQ7CisJYnAtPmxpbmtfcGFyYW1zLmNoaXBfaWQgPSBicC0+Y29tbW9uLmNoaXBfaWQ7CisJQk5YMlhfREVWX0lORk8oImNoaXAgSUQgaXMgMHgleFxuIiwgaWQpOworCisJdmFsID0gKFJFR19SRChicCwgMHgyODc0KSAmIDB4NTUpOworCWlmICgoYnAtPmNvbW1vbi5jaGlwX2lkICYgMHgxKSB8fAorCSAgICAoQ0hJUF9JU19FMShicCkgJiYgdmFsKSB8fCAoQ0hJUF9JU19FMUgoYnApICYmICh2YWwgPT0gMHg1NSkpKSB7CisJCWJwLT5mbGFncyB8PSBPTkVfUE9SVF9GTEFHOworCQlCTlgyWF9ERVZfSU5GTygic2luZ2xlIHBvcnQgZGV2aWNlXG4iKTsKKwl9CisKKwl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQ0ZHNCk7CisJYnAtPmNvbW1vbi5mbGFzaF9zaXplID0gKE5WUkFNXzFNQl9TSVpFIDw8CisJCQkJICh2YWwgJiBNQ1BSX05WTV9DRkc0X0ZMQVNIX1NJWkUpKTsKKwlCTlgyWF9ERVZfSU5GTygiZmxhc2hfc2l6ZSAweCV4ICglZClcbiIsCisJCSAgICAgICBicC0+Y29tbW9uLmZsYXNoX3NpemUsIGJwLT5jb21tb24uZmxhc2hfc2l6ZSk7CisKKwlicC0+Y29tbW9uLnNobWVtX2Jhc2UgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUik7CisJYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSA9IFJFR19SRChicCwgTUlTQ19SRUdfR0VORVJJQ19DUl8wKTsKKwlicC0+bGlua19wYXJhbXMuc2htZW1fYmFzZSA9IGJwLT5jb21tb24uc2htZW1fYmFzZTsKKwlCTlgyWF9ERVZfSU5GTygic2htZW0gb2Zmc2V0IDB4JXggIHNobWVtMiBvZmZzZXQgMHgleFxuIiwKKwkJICAgICAgIGJwLT5jb21tb24uc2htZW1fYmFzZSwgYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSk7CisKKwlpZiAoIWJwLT5jb21tb24uc2htZW1fYmFzZSB8fAorCSAgICAoYnAtPmNvbW1vbi5zaG1lbV9iYXNlIDwgMHhBMDAwMCkgfHwKKwkgICAgKGJwLT5jb21tb24uc2htZW1fYmFzZSA+PSAweEMwMDAwKSkgeworCQlCTlgyWF9ERVZfSU5GTygiTUNQIG5vdCBhY3RpdmVcbiIpOworCQlicC0+ZmxhZ3MgfD0gTk9fTUNQX0ZMQUc7CisJCXJldHVybjsKKwl9CisKKwl2YWwgPSBTSE1FTV9SRChicCwgdmFsaWRpdHlfbWFwW0JQX1BPUlQoYnApXSk7CisJaWYgKCh2YWwgJiAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1fVkFMSURJVFlfTUIpKQorCQkhPSAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1fVkFMSURJVFlfTUIpKQorCQlCTlgyWF9FUlJPUigiQkFEIE1DUCB2YWxpZGl0eSBzaWduYXR1cmVcbiIpOworCisJYnAtPmNvbW1vbi5od19jb25maWcgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5jb25maWcpOworCUJOWDJYX0RFVl9JTkZPKCJod19jb25maWcgMHglMDh4XG4iLCBicC0+Y29tbW9uLmh3X2NvbmZpZyk7CisKKwlicC0+bGlua19wYXJhbXMuaHdfbGVkX21vZGUgPSAoKGJwLT5jb21tb24uaHdfY29uZmlnICYKKwkJCQkJU0hBUkVEX0hXX0NGR19MRURfTU9ERV9NQVNLKSA+PgorCQkJCSAgICAgICBTSEFSRURfSFdfQ0ZHX0xFRF9NT0RFX1NISUZUKTsKKworCWJwLT5saW5rX3BhcmFtcy5mZWF0dXJlX2NvbmZpZ19mbGFncyA9IDA7CisJdmFsID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnNoYXJlZF9mZWF0dXJlX2NvbmZpZy5jb25maWcpOworCWlmICh2YWwgJiBTSEFSRURfRkVBVF9DRkdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfQ0ZHX0VOQUJMRUQpCisJCWJwLT5saW5rX3BhcmFtcy5mZWF0dXJlX2NvbmZpZ19mbGFncyB8PQorCQkJCUZFQVRVUkVfQ09ORklHX09WRVJSSURFX1BSRUVNUEhBU0lTX0VOQUJMRUQ7CisJZWxzZQorCQlicC0+bGlua19wYXJhbXMuZmVhdHVyZV9jb25maWdfZmxhZ3MgJj0KKwkJCQl+RkVBVFVSRV9DT05GSUdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfRU5BQkxFRDsKKworCXZhbCA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5iY19yZXYpID4+IDg7CisJYnAtPmNvbW1vbi5iY192ZXIgPSB2YWw7CisJQk5YMlhfREVWX0lORk8oImJjX3ZlciAlWFxuIiwgdmFsKTsKKwlpZiAodmFsIDwgQk5YMlhfQkNfVkVSKSB7CisJCS8qIGZvciBub3cgb25seSB3YXJuCisJCSAqIGxhdGVyIHdlIG1pZ2h0IG5lZWQgdG8gZW5mb3JjZSB0aGlzICovCisJCUJOWDJYX0VSUk9SKCJUaGlzIGRyaXZlciBuZWVkcyBiY192ZXIgJVggYnV0IGZvdW5kICVYLCAiCisJCQkgICAgInBsZWFzZSB1cGdyYWRlIEJDXG4iLCBCTlgyWF9CQ19WRVIsIHZhbCk7CisJfQorCWJwLT5saW5rX3BhcmFtcy5mZWF0dXJlX2NvbmZpZ19mbGFncyB8PQorCQkodmFsID49IFJFUV9CQ19WRVJfNF9WUkZZX09QVF9NREwpID8KKwkJRkVBVFVSRV9DT05GSUdfQkNfU1VQUE9SVFNfT1BUX01ETF9WUkZZIDogMDsKKworCWlmIChCUF9FMUhWTihicCkgPT0gMCkgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBtX2NhcCArIFBDSV9QTV9QTUMsICZwbWMpOworCQlicC0+ZmxhZ3MgfD0gKHBtYyAmIFBDSV9QTV9DQVBfUE1FX0QzY29sZCkgPyAwIDogTk9fV09MX0ZMQUc7CisJfSBlbHNlIHsKKwkJLyogbm8gV09MIGNhcGFiaWxpdHkgZm9yIEUxSFZOICE9IDAgKi8KKwkJYnAtPmZsYWdzIHw9IE5PX1dPTF9GTEFHOworCX0KKwlCTlgyWF9ERVZfSU5GTygiJXNXb0wgY2FwYWJsZVxuIiwKKwkJICAgICAgIChicC0+ZmxhZ3MgJiBOT19XT0xfRkxBRykgPyAibm90ICIgOiAiIik7CisKKwl2YWwgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5wYXJ0X251bSk7CisJdmFsMiA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5zaGFyZWRfaHdfY29uZmlnLnBhcnRfbnVtWzRdKTsKKwl2YWwzID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnNoYXJlZF9od19jb25maWcucGFydF9udW1bOF0pOworCXZhbDQgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5wYXJ0X251bVsxMl0pOworCisJZGV2X2luZm8oJmJwLT5wZGV2LT5kZXYsICJwYXJ0IG51bWJlciAlWC0lWC0lWC0lWFxuIiwKKwkJIHZhbCwgdmFsMiwgdmFsMywgdmFsNCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9saW5rX3NldHRpbmdzX3N1cHBvcnRlZChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQkJICAgIHUzMiBzd2l0Y2hfY2ZnKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJdTMyIGV4dF9waHlfdHlwZTsKKworCXN3aXRjaCAoc3dpdGNoX2NmZykgeworCWNhc2UgU1dJVENIX0NGR18xRzoKKwkJQk5YMlhfREVWX0lORk8oInN3aXRjaF9jZmcgMHgleCAoMUcpXG4iLCBzd2l0Y2hfY2ZnKTsKKworCQlleHRfcGh5X3R5cGUgPQorCQkJU0VSREVTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQkJQk5YMlhfREVWX0lORk8oImV4dF9waHlfdHlwZSAweCV4IChEaXJlY3QpXG4iLAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOworCisJCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9UUCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9CQ001NDgyOgorCQkJQk5YMlhfREVWX0lORk8oImV4dF9waHlfdHlwZSAweCV4ICg1NDgyKVxuIiwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsKKworCQkJYnAtPnBvcnQuc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9UUCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgIkJBRCBTZXJEZXMgZXh0X3BoeV9jb25maWcgMHgleFxuIiwKKwkJCQkgIGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7CisJCQlyZXR1cm47CisJCX0KKworCQlicC0+cG9ydC5waHlfYWRkciA9IFJFR19SRChicCwgTklHX1JFR19TRVJERVMwX0NUUkxfUEhZX0FERFIgKworCQkJCQkgICBwb3J0KjB4MTApOworCQlCTlgyWF9ERVZfSU5GTygicGh5X2FkZHIgMHgleFxuIiwgYnAtPnBvcnQucGh5X2FkZHIpOworCQlicmVhazsKKworCWNhc2UgU1dJVENIX0NGR18xMEc6CisJCUJOWDJYX0RFVl9JTkZPKCJzd2l0Y2hfY2ZnIDB4JXggKDEwRylcbiIsIHN3aXRjaF9jZmcpOworCisJCWV4dF9waHlfdHlwZSA9CisJCQlYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoRGlyZWN0KVxuIiwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsKKworCQkJYnAtPnBvcnQuc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9UUCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoODA3MilcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7CisKKwkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8CisJCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6CisJCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKDgwNzMpXG4iLAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOworCisJCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoODcwNSlcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7CisKKwkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoODcwNilcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7CisKKwkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8CisJCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6CisJCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKDg3MjYpXG4iLAorCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOworCisJCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9GSUJSRSB8CisJCQkJCSAgICAgICBTVVBQT1JURURfUGF1c2UgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCQkJQk5YMlhfREVWX0lORk8oImV4dF9waHlfdHlwZSAweCV4ICg4NzI3KVxuIiwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsKKworCQkJYnAtPnBvcnQuc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfQXV0b25lZyB8CisJCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMToKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoU0ZYNzEwMSlcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7CisKKwkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfVFAgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MToKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoQkNNODQ4MSlcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7CisKKwkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIFNVUFBPUlRFRF9UUCB8CisJCQkJCSAgICAgICBTVVBQT1JURURfQXV0b25lZyB8CisJCQkJCSAgICAgICBTVVBQT1JURURfUGF1c2UgfAorCQkJCQkgICAgICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFOgorCQkJQk5YMlhfRVJSKCJYR1hTIFBIWSBGYWlsdXJlIGRldGVjdGVkIDB4JXhcbiIsCisJCQkJICBicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAiQkFEIFhHWFMgZXh0X3BoeV9jb25maWcgMHgleFxuIiwKKwkJCQkgIGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7CisJCQlyZXR1cm47CisJCX0KKworCQlicC0+cG9ydC5waHlfYWRkciA9IFJFR19SRChicCwgTklHX1JFR19YR1hTMF9DVFJMX1BIWV9BRERSICsKKwkJCQkJICAgcG9ydCoweDE4KTsKKwkJQk5YMlhfREVWX0lORk8oInBoeV9hZGRyIDB4JXhcbiIsIGJwLT5wb3J0LnBoeV9hZGRyKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiQkFEIHN3aXRjaF9jZmcgbGlua19jb25maWcgMHgleFxuIiwKKwkJCSAgYnAtPnBvcnQubGlua19jb25maWcpOworCQlyZXR1cm47CisJfQorCWJwLT5saW5rX3BhcmFtcy5waHlfYWRkciA9IGJwLT5wb3J0LnBoeV9hZGRyOworCisJLyogbWFzayB3aGF0IHdlIHN1cHBvcnQgYWNjb3JkaW5nIHRvIHNwZWVkX2NhcF9tYXNrICovCisJaWYgKCEoYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrICYKKwkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwTV9IQUxGKSkKKwkJYnAtPnBvcnQuc3VwcG9ydGVkICY9IH5TVVBQT1JURURfMTBiYXNlVF9IYWxmOworCisJaWYgKCEoYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrICYKKwkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwTV9GVUxMKSkKKwkJYnAtPnBvcnQuc3VwcG9ydGVkICY9IH5TVVBQT1JURURfMTBiYXNlVF9GdWxsOworCisJaWYgKCEoYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrICYKKwkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fSEFMRikpCisJCWJwLT5wb3J0LnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMGJhc2VUX0hhbGY7CisKKwlpZiAoIShicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2sgJgorCQkJCVBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTAwTV9GVUxMKSkKKwkJYnAtPnBvcnQuc3VwcG9ydGVkICY9IH5TVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKworCWlmICghKGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayAmCisJCQkJCVBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcpKQorCQlicC0+cG9ydC5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAorCQkJCQlTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOworCisJaWYgKCEoYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrICYKKwkJCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8yXzVHKSkKKwkJYnAtPnBvcnQuc3VwcG9ydGVkICY9IH5TVVBQT1JURURfMjUwMGJhc2VYX0Z1bGw7CisKKwlpZiAoIShicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2sgJgorCQkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwRykpCisJCWJwLT5wb3J0LnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKworCUJOWDJYX0RFVl9JTkZPKCJzdXBwb3J0ZWQgMHgleFxuIiwgYnAtPnBvcnQuc3VwcG9ydGVkKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X2xpbmtfc2V0dGluZ3NfcmVxdWVzdGVkKHN0cnVjdCBibngyeCAqYnApCit7CisJYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCXN3aXRjaCAoYnAtPnBvcnQubGlua19jb25maWcgJiBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF9NQVNLKSB7CisJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF9BVVRPOgorCQlpZiAoYnAtPnBvcnQuc3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpIHsKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEX0FVVE9fTkVHOworCQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPSBicC0+cG9ydC5zdXBwb3J0ZWQ7CisJCX0gZWxzZSB7CisJCQl1MzIgZXh0X3BoeV90eXBlID0KKwkJCSAgICBYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOworCisJCQlpZiAoKGV4dF9waHlfdHlwZSA9PQorCQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1KSB8fAorCQkJICAgIChleHRfcGh5X3R5cGUgPT0KKwkJCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNikpIHsKKwkJCQkvKiBmb3JjZSAxMEcsIG5vIEFOICovCisJCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPQorCQkJCQkJKEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsIHwKKwkJCQkJCSBBRFZFUlRJU0VEX0ZJQlJFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgorCQkJCSAgIiAgQXV0b25lZyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCSAgYnAtPnBvcnQubGlua19jb25maWcpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fRlVMTDoKKwkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpIHsKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkJQURWRVJUSVNFRF9UUCk7CisJCX0gZWxzZSB7CisJCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCisJCQkJICAgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIsCisJCQkJICAgIGJwLT5wb3J0LmxpbmtfY29uZmlnLAorCQkJCSAgICBicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2spOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fSEFMRjoKKwkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYpIHsKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJCUFEVkVSVElTRURfVFApOworCQl9IGVsc2UgeworCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgorCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAorCQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZywKKwkJCQkgICAgYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTAwTV9GVUxMOgorCQlpZiAoYnAtPnBvcnQuc3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpIHsKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzEwMDsKKwkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCQlBRFZFUlRJU0VEX1RQKTsKKwkJfSBlbHNlIHsKKwkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKKwkJCQkgICAgIkludmFsaWQgbGlua19jb25maWcgMHgleCIKKwkJCQkgICAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKKwkJCQkgICAgYnAtPnBvcnQubGlua19jb25maWcsCisJCQkJICAgIGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwME1fSEFMRjoKKwkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmKSB7CisJCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQlicC0+bGlua19wYXJhbXMucmVxX2R1cGxleCA9IERVUExFWF9IQUxGOworCQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkJCUFEVkVSVElTRURfVFApOworCQl9IGVsc2UgeworCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgorCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAorCQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZywKKwkJCQkgICAgYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMUc6CisJCWlmIChicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpIHsKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlicC0+cG9ydC5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJCUFEVkVSVElTRURfVFApOworCQl9IGVsc2UgeworCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgorCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAorCQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZywKKwkJCQkgICAgYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMl81RzoKKwkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCkgeworCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkID0gU1BFRURfMjUwMDsKKwkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMjUwMGJhc2VYX0Z1bGwgfAorCQkJCQkJQURWRVJUSVNFRF9UUCk7CisJCX0gZWxzZSB7CisJCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCisJCQkJICAgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIsCisJCQkJICAgIGJwLT5wb3J0LmxpbmtfY29uZmlnLAorCQkJCSAgICBicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2spOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfQ1g0OgorCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBHX0tYNDoKKwljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwR19LUjoKKwkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwpIHsKKwkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCQkJQURWRVJUSVNFRF9GSUJSRSk7CisJCX0gZWxzZSB7CisJCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCisJCQkJICAgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIsCisJCQkJICAgIGJwLT5wb3J0LmxpbmtfY29uZmlnLAorCQkJCSAgICBicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2spOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJICAgICJCQUQgbGluayBzcGVlZCBsaW5rX2NvbmZpZyAweCV4XG4iLAorCQkJICAgIGJwLT5wb3J0LmxpbmtfY29uZmlnKTsKKwkJYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkID0gU1BFRURfQVVUT19ORUc7CisJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gYnAtPnBvcnQuc3VwcG9ydGVkOworCQlicmVhazsKKwl9CisKKwlicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCA9IChicC0+cG9ydC5saW5rX2NvbmZpZyAmCisJCQkJCSBQT1JUX0ZFQVRVUkVfRkxPV19DT05UUk9MX01BU0spOworCWlmICgoYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgPT0gQk5YMlhfRkxPV19DVFJMX0FVVE8pICYmCisJICAgICEoYnAtPnBvcnQuc3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpKQorCQlicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOworCisJQk5YMlhfREVWX0lORk8oInJlcV9saW5lX3NwZWVkICVkICByZXFfZHVwbGV4ICVkICByZXFfZmxvd19jdHJsIDB4JXgiCisJCSAgICAgICAiICBhZHZlcnRpc2luZyAweCV4XG4iLAorCQkgICAgICAgYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkLAorCQkgICAgICAgYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXgsCisJCSAgICAgICBicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCwgYnAtPnBvcnQuYWR2ZXJ0aXNpbmcpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm54Mnhfc2V0X21hY19idWYodTggKm1hY19idWYsIHUzMiBtYWNfbG8sIHUxNiBtYWNfaGkpCit7CisJbWFjX2hpID0gY3B1X3RvX2JlMTYobWFjX2hpKTsKKwltYWNfbG8gPSBjcHVfdG9fYmUzMihtYWNfbG8pOworCW1lbWNweShtYWNfYnVmLCAmbWFjX2hpLCBzaXplb2YobWFjX2hpKSk7CisJbWVtY3B5KG1hY19idWYgKyBzaXplb2YobWFjX2hpKSwgJm1hY19sbywgc2l6ZW9mKG1hY19sbykpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm54MnhfZ2V0X3BvcnRfaHdpbmZvKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwl1MzIgdmFsLCB2YWwyOworCXUzMiBjb25maWc7CisJdTE2IGk7CisJdTMyIGV4dF9waHlfdHlwZTsKKworCWJwLT5saW5rX3BhcmFtcy5icCA9IGJwOworCWJwLT5saW5rX3BhcmFtcy5wb3J0ID0gcG9ydDsKKworCWJwLT5saW5rX3BhcmFtcy5sYW5lX2NvbmZpZyA9CisJCVNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5sYW5lX2NvbmZpZyk7CisJYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnID0KKwkJU0hNRU1fUkQoYnAsCisJCQkgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uZXh0ZXJuYWxfcGh5X2NvbmZpZyk7CisJLyogQkNNODcyN19OT0MgPT4gQkNNODcyNyBubyBvdmVyIGN1cnJlbnQgKi8KKwlpZiAoWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKSA9PQorCSAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3X05PQykgeworCQlicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcgJj0KKwkJCX5QT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9NQVNLOworCQlicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcgfD0KKwkJCVBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc7CisJCWJwLT5saW5rX3BhcmFtcy5mZWF0dXJlX2NvbmZpZ19mbGFncyB8PQorCQkJRkVBVFVSRV9DT05GSUdfQkNNODcyN19OT0M7CisJfQorCisJYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrID0KKwkJU0hNRU1fUkQoYnAsCisJCQkgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uc3BlZWRfY2FwYWJpbGl0eV9tYXNrKTsKKworCWJwLT5wb3J0LmxpbmtfY29uZmlnID0KKwkJU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfZmVhdHVyZV9jb25maWdbcG9ydF0ubGlua19jb25maWcpOworCisJLyogR2V0IHRoZSA0IGxhbmVzIHhneHMgY29uZmlnIHJ4IGFuZCB0eCAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdmFsID0gU0hNRU1fUkQoYnAsCisJCQkgICBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS54Z3hzX2NvbmZpZ19yeFtpPDwxXSk7CisJCWJwLT5saW5rX3BhcmFtcy54Z3hzX2NvbmZpZ19yeFtpIDw8IDFdID0gKCh2YWw+PjE2KSAmIDB4ZmZmZik7CisJCWJwLT5saW5rX3BhcmFtcy54Z3hzX2NvbmZpZ19yeFsoaSA8PCAxKSArIDFdID0gKHZhbCAmIDB4ZmZmZik7CisKKwkJdmFsID0gU0hNRU1fUkQoYnAsCisJCQkgICBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS54Z3hzX2NvbmZpZ190eFtpPDwxXSk7CisJCWJwLT5saW5rX3BhcmFtcy54Z3hzX2NvbmZpZ190eFtpIDw8IDFdID0gKCh2YWw+PjE2KSAmIDB4ZmZmZik7CisJCWJwLT5saW5rX3BhcmFtcy54Z3hzX2NvbmZpZ190eFsoaSA8PCAxKSArIDFdID0gKHZhbCAmIDB4ZmZmZik7CisJfQorCisJLyogSWYgdGhlIGRldmljZSBpcyBjYXBhYmxlIG9mIFdvTCwgc2V0IHRoZSBkZWZhdWx0IHN0YXRlIGFjY29yZGluZworCSAqIHRvIHRoZSBIVworCSAqLworCWNvbmZpZyA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0X2ZlYXR1cmVfY29uZmlnW3BvcnRdLmNvbmZpZyk7CisJYnAtPndvbCA9ICghKGJwLT5mbGFncyAmIE5PX1dPTF9GTEFHKSAmJgorCQkgICAoY29uZmlnICYgUE9SVF9GRUFUVVJFX1dPTF9FTkFCTEVEKSk7CisKKwlCTlgyWF9ERVZfSU5GTygibGFuZV9jb25maWcgMHglMDh4ICBleHRfcGh5X2NvbmZpZyAweCUwOHgiCisJCSAgICAgICAiICBzcGVlZF9jYXBfbWFzayAweCUwOHggIGxpbmtfY29uZmlnIDB4JTA4eFxuIiwKKwkJICAgICAgIGJwLT5saW5rX3BhcmFtcy5sYW5lX2NvbmZpZywKKwkJICAgICAgIGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZywKKwkJICAgICAgIGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzaywgYnAtPnBvcnQubGlua19jb25maWcpOworCisJYnAtPmxpbmtfcGFyYW1zLnN3aXRjaF9jZmcgfD0gKGJwLT5wb3J0LmxpbmtfY29uZmlnICYKKwkJCQkgICAgICAgUE9SVF9GRUFUVVJFX0NPTk5FQ1RFRF9TV0lUQ0hfTUFTSyk7CisJYm54MnhfbGlua19zZXR0aW5nc19zdXBwb3J0ZWQoYnAsIGJwLT5saW5rX3BhcmFtcy5zd2l0Y2hfY2ZnKTsKKworCWJueDJ4X2xpbmtfc2V0dGluZ3NfcmVxdWVzdGVkKGJwKTsKKworCS8qCisJICogSWYgY29ubmVjdGVkIGRpcmVjdGx5LCB3b3JrIHdpdGggdGhlIGludGVybmFsIFBIWSwgb3RoZXJ3aXNlLCB3b3JrCisJICogd2l0aCB0aGUgZXh0ZXJuYWwgUEhZCisJICovCisJZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKKwlpZiAoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkKKwkJYnAtPm1kaW8ucHJ0YWQgPSBicC0+bGlua19wYXJhbXMucGh5X2FkZHI7CisKKwllbHNlIGlmICgoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0ZBSUxVUkUpICYmCisJCSAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX05PVF9DT05OKSkKKwkJYnAtPm1kaW8ucHJ0YWQgPQorCQkJWEdYU19FWFRfUEhZX0FERFIoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKKworCXZhbDIgPSBTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0ubWFjX3VwcGVyKTsKKwl2YWwgPSBTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0ubWFjX2xvd2VyKTsKKwlibngyeF9zZXRfbWFjX2J1ZihicC0+ZGV2LT5kZXZfYWRkciwgdmFsLCB2YWwyKTsKKwltZW1jcHkoYnAtPmxpbmtfcGFyYW1zLm1hY19hZGRyLCBicC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShicC0+ZGV2LT5wZXJtX2FkZHIsIGJwLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKyNpZmRlZiBCQ01fQ05JQworCXZhbDIgPSBTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uaXNjc2lfbWFjX3VwcGVyKTsKKwl2YWwgPSBTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uaXNjc2lfbWFjX2xvd2VyKTsKKwlibngyeF9zZXRfbWFjX2J1ZihicC0+aXNjc2lfbWFjLCB2YWwsIHZhbDIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2dldF9od2luZm8oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOworCXUzMiB2YWwsIHZhbDI7CisJaW50IHJjID0gMDsKKworCWJueDJ4X2dldF9jb21tb25faHdpbmZvKGJwKTsKKworCWJwLT5lMWhvdiA9IDA7CisJYnAtPmUxaG1mID0gMDsKKwlpZiAoQ0hJUF9JU19FMUgoYnApICYmICFCUF9OT01DUChicCkpIHsKKwkJYnAtPm1mX2NvbmZpZyA9CisJCQlTSE1FTV9SRChicCwgbWZfY2ZnLmZ1bmNfbWZfY29uZmlnW2Z1bmNdLmNvbmZpZyk7CisKKwkJdmFsID0gKFNITUVNX1JEKGJwLCBtZl9jZmcuZnVuY19tZl9jb25maWdbRlVOQ18wXS5lMWhvdl90YWcpICYKKwkJICAgICAgIEZVTkNfTUZfQ0ZHX0UxSE9WX1RBR19NQVNLKTsKKwkJaWYgKHZhbCAhPSBGVU5DX01GX0NGR19FMUhPVl9UQUdfREVGQVVMVCkKKwkJCWJwLT5lMWhtZiA9IDE7CisJCUJOWDJYX0RFVl9JTkZPKCIlcyBmdW5jdGlvbiBtb2RlXG4iLAorCQkJICAgICAgIElTX0UxSE1GKGJwKSA/ICJtdWx0aSIgOiAic2luZ2xlIik7CisKKwkJaWYgKElTX0UxSE1GKGJwKSkgeworCQkJdmFsID0gKFNITUVNX1JEKGJwLCBtZl9jZmcuZnVuY19tZl9jb25maWdbZnVuY10uCisJCQkJCQkJCWUxaG92X3RhZykgJgorCQkJICAgICAgIEZVTkNfTUZfQ0ZHX0UxSE9WX1RBR19NQVNLKTsKKwkJCWlmICh2YWwgIT0gRlVOQ19NRl9DRkdfRTFIT1ZfVEFHX0RFRkFVTFQpIHsKKwkJCQlicC0+ZTFob3YgPSB2YWw7CisJCQkJQk5YMlhfREVWX0lORk8oIkUxSE9WIGZvciBmdW5jICVkIGlzICVkICIKKwkJCQkJICAgICAgICIoMHglMDR4KVxuIiwKKwkJCQkJICAgICAgIGZ1bmMsIGJwLT5lMWhvdiwgYnAtPmUxaG92KTsKKwkJCX0gZWxzZSB7CisJCQkJQk5YMlhfRVJST1IoIk5vIHZhbGlkIEUxSE9WIGZvciBmdW5jICVkLCIKKwkJCQkJICAgICIgIGFib3J0aW5nXG4iLCBmdW5jKTsKKwkJCQlyYyA9IC1FUEVSTTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChCUF9FMUhWTihicCkpIHsKKwkJCQlCTlgyWF9FUlJPUigiVk4gJWQgaW4gc2luZ2xlIGZ1bmN0aW9uIG1vZGUsIgorCQkJCQkgICAgIiAgYWJvcnRpbmdcbiIsIEJQX0UxSFZOKGJwKSk7CisJCQkJcmMgPSAtRVBFUk07CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIUJQX05PTUNQKGJwKSkgeworCQlibngyeF9nZXRfcG9ydF9od2luZm8oYnApOworCisJCWJwLT5md19zZXEgPSAoU0hNRU1fUkQoYnAsIGZ1bmNfbWJbZnVuY10uZHJ2X21iX2hlYWRlcikgJgorCQkJICAgICAgRFJWX01TR19TRVFfTlVNQkVSX01BU0spOworCQlCTlgyWF9ERVZfSU5GTygiZndfc2VxIDB4JTA4eFxuIiwgYnAtPmZ3X3NlcSk7CisJfQorCisJaWYgKElTX0UxSE1GKGJwKSkgeworCQl2YWwyID0gU0hNRU1fUkQoYnAsIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5tYWNfdXBwZXIpOworCQl2YWwgPSBTSE1FTV9SRChicCwgIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5tYWNfbG93ZXIpOworCQlpZiAoKHZhbDIgIT0gRlVOQ19NRl9DRkdfVVBQRVJNQUNfREVGQVVMVCkgJiYKKwkJICAgICh2YWwgIT0gRlVOQ19NRl9DRkdfTE9XRVJNQUNfREVGQVVMVCkpIHsKKwkJCWJwLT5kZXYtPmRldl9hZGRyWzBdID0gKHU4KSh2YWwyID4+IDggJiAweGZmKTsKKwkJCWJwLT5kZXYtPmRldl9hZGRyWzFdID0gKHU4KSh2YWwyICYgMHhmZik7CisJCQlicC0+ZGV2LT5kZXZfYWRkclsyXSA9ICh1OCkodmFsID4+IDI0ICYgMHhmZik7CisJCQlicC0+ZGV2LT5kZXZfYWRkclszXSA9ICh1OCkodmFsID4+IDE2ICYgMHhmZik7CisJCQlicC0+ZGV2LT5kZXZfYWRkcls0XSA9ICh1OCkodmFsID4+IDggICYgMHhmZik7CisJCQlicC0+ZGV2LT5kZXZfYWRkcls1XSA9ICh1OCkodmFsICYgMHhmZik7CisJCQltZW1jcHkoYnAtPmxpbmtfcGFyYW1zLm1hY19hZGRyLCBicC0+ZGV2LT5kZXZfYWRkciwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCQltZW1jcHkoYnAtPmRldi0+cGVybV9hZGRyLCBicC0+ZGV2LT5kZXZfYWRkciwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCX0KKworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKEJQX05PTUNQKGJwKSkgeworCQkvKiBvbmx5IHN1cHBvc2VkIHRvIGhhcHBlbiBvbiBlbXVsYXRpb24vRlBHQSAqLworCQlCTlgyWF9FUlJPUigid2FybmluZzogcmFuZG9tIE1BQyB3b3JrYXJvdW5kIGFjdGl2ZVxuIik7CisJCXJhbmRvbV9ldGhlcl9hZGRyKGJwLT5kZXYtPmRldl9hZGRyKTsKKwkJbWVtY3B5KGJwLT5kZXYtPnBlcm1fYWRkciwgYnAtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9yZWFkX2Z3aW5mbyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBjbnQsIGksIGJsb2NrX2VuZCwgcm9kaTsKKwljaGFyIHZwZF9kYXRhW0JOWDJYX1ZQRF9MRU4rMV07CisJY2hhciBzdHJfaWRfcmVnW1ZFTkRPUl9JRF9MRU4rMV07CisJY2hhciBzdHJfaWRfY2FwW1ZFTkRPUl9JRF9MRU4rMV07CisJdTggbGVuOworCisJY250ID0gcGNpX3JlYWRfdnBkKGJwLT5wZGV2LCAwLCBCTlgyWF9WUERfTEVOLCB2cGRfZGF0YSk7CisJbWVtc2V0KGJwLT5md192ZXIsIDAsIHNpemVvZihicC0+ZndfdmVyKSk7CisKKwlpZiAoY250IDwgQk5YMlhfVlBEX0xFTikKKwkJZ290byBvdXRfbm90X2ZvdW5kOworCisJaSA9IHBjaV92cGRfZmluZF90YWcodnBkX2RhdGEsIDAsIEJOWDJYX1ZQRF9MRU4sCisJCQkgICAgIFBDSV9WUERfTFJEVF9ST19EQVRBKTsKKwlpZiAoaSA8IDApCisJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCisJYmxvY2tfZW5kID0gaSArIFBDSV9WUERfTFJEVF9UQUdfU0laRSArCisJCSAgICBwY2lfdnBkX2xyZHRfc2l6ZSgmdnBkX2RhdGFbaV0pOworCisJaSArPSBQQ0lfVlBEX0xSRFRfVEFHX1NJWkU7CisKKwlpZiAoYmxvY2tfZW5kID4gQk5YMlhfVlBEX0xFTikKKwkJZ290byBvdXRfbm90X2ZvdW5kOworCisJcm9kaSA9IHBjaV92cGRfZmluZF9pbmZvX2tleXdvcmQodnBkX2RhdGEsIGksIGJsb2NrX2VuZCwKKwkJCQkgICBQQ0lfVlBEX1JPX0tFWVdPUkRfTUZSX0lEKTsKKwlpZiAocm9kaSA8IDApCisJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCWxlbiA9IHBjaV92cGRfaW5mb19maWVsZF9zaXplKCZ2cGRfZGF0YVtyb2RpXSk7CisKKwlpZiAobGVuICE9IFZFTkRPUl9JRF9MRU4pCisJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCXJvZGkgKz0gUENJX1ZQRF9JTkZPX0ZMRF9IRFJfU0laRTsKKworCS8qIHZlbmRvciBzcGVjaWZpYyBpbmZvICovCisJc25wcmludGYoc3RyX2lkX3JlZywgVkVORE9SX0lEX0xFTiArIDEsICIlMDR4IiwgUENJX1ZFTkRPUl9JRF9ERUxMKTsKKwlzbnByaW50ZihzdHJfaWRfY2FwLCBWRU5ET1JfSURfTEVOICsgMSwgIiUwNFgiLCBQQ0lfVkVORE9SX0lEX0RFTEwpOworCWlmICghc3RybmNtcChzdHJfaWRfcmVnLCAmdnBkX2RhdGFbcm9kaV0sIFZFTkRPUl9JRF9MRU4pIHx8CisJICAgICFzdHJuY21wKHN0cl9pZF9jYXAsICZ2cGRfZGF0YVtyb2RpXSwgVkVORE9SX0lEX0xFTikpIHsKKworCQlyb2RpID0gcGNpX3ZwZF9maW5kX2luZm9fa2V5d29yZCh2cGRfZGF0YSwgaSwgYmxvY2tfZW5kLAorCQkJCQkJUENJX1ZQRF9ST19LRVlXT1JEX1ZFTkRPUjApOworCQlpZiAocm9kaSA+PSAwKSB7CisJCQlsZW4gPSBwY2lfdnBkX2luZm9fZmllbGRfc2l6ZSgmdnBkX2RhdGFbcm9kaV0pOworCisJCQlyb2RpICs9IFBDSV9WUERfSU5GT19GTERfSERSX1NJWkU7CisKKwkJCWlmIChsZW4gPCAzMiAmJiAobGVuICsgcm9kaSkgPD0gQk5YMlhfVlBEX0xFTikgeworCQkJCW1lbWNweShicC0+ZndfdmVyLCAmdnBkX2RhdGFbcm9kaV0sIGxlbik7CisJCQkJYnAtPmZ3X3ZlcltsZW5dID0gJyAnOworCQkJfQorCQl9CisJCXJldHVybjsKKwl9CitvdXRfbm90X2ZvdW5kOgorCXJldHVybjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm54MnhfaW5pdF9icChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBmdW5jID0gQlBfRlVOQyhicCk7CisJaW50IHRpbWVyX2ludGVydmFsOworCWludCByYzsKKworCS8qIERpc2FibGUgaW50ZXJydXB0IGhhbmRsaW5nIHVudGlsIEhXIGlzIGluaXRpYWxpemVkICovCisJYXRvbWljX3NldCgmYnAtPmludHJfc2VtLCAxKTsKKwlzbXBfd21iKCk7IC8qIEVuc3VyZSB0aGF0IGJwLT5pbnRyX3NlbSB1cGRhdGUgaXMgU01QLXNhZmUgKi8KKworCW11dGV4X2luaXQoJmJwLT5wb3J0LnBoeV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmYnAtPmZ3X21iX211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmYnAtPnN0YXRzX2xvY2spOworI2lmZGVmIEJDTV9DTklDCisJbXV0ZXhfaW5pdCgmYnAtPmNuaWNfbXV0ZXgpOworI2VuZGlmCisKKwlJTklUX0RFTEFZRURfV09SSygmYnAtPnNwX3Rhc2ssIGJueDJ4X3NwX3Rhc2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZicC0+cmVzZXRfdGFzaywgYm54MnhfcmVzZXRfdGFzayk7CisKKwlyYyA9IGJueDJ4X2dldF9od2luZm8oYnApOworCisJYm54MnhfcmVhZF9md2luZm8oYnApOworCS8qIG5lZWQgdG8gcmVzZXQgY2hpcCBpZiB1bmRpIHdhcyBhY3RpdmUgKi8KKwlpZiAoIUJQX05PTUNQKGJwKSkKKwkJYm54MnhfdW5kaV91bmxvYWQoYnApOworCisJaWYgKENISVBfUkVWX0lTX0ZQR0EoYnApKQorCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LCAiRlBHQSBkZXRlY3RlZFxuIik7CisKKwlpZiAoQlBfTk9NQ1AoYnApICYmIChmdW5jID09IDApKQorCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LCAiTUNQIGRpc2FibGVkLCAiCisJCQkJCSJtdXN0IGxvYWQgZGV2aWNlcyBpbiBvcmRlciFcbiIpOworCisJLyogU2V0IG11bHRpIHF1ZXVlIG1vZGUgKi8KKwlpZiAoKG11bHRpX21vZGUgIT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKSAmJgorCSAgICAoKGludF9tb2RlID09IElOVF9NT0RFX0lOVHgpIHx8IChpbnRfbW9kZSA9PSBJTlRfTU9ERV9NU0kpKSkgeworCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LCAiTXVsdGkgZGlzYWJsZWQgc2luY2UgaW50X21vZGUgIgorCQkJCQkicmVxdWVzdGVkIGlzIG5vdCBNU0ktWFxuIik7CisJCW11bHRpX21vZGUgPSBFVEhfUlNTX01PREVfRElTQUJMRUQ7CisJfQorCWJwLT5tdWx0aV9tb2RlID0gbXVsdGlfbW9kZTsKKwlicC0+aW50X21vZGUgPSBpbnRfbW9kZTsKKworCWJwLT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfR1JPOworCisJLyogU2V0IFRQQSBmbGFncyAqLworCWlmIChkaXNhYmxlX3RwYSkgeworCQlicC0+ZmxhZ3MgJj0gflRQQV9FTkFCTEVfRkxBRzsKKwkJYnAtPmRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfTFJPOworCX0gZWxzZSB7CisJCWJwLT5mbGFncyB8PSBUUEFfRU5BQkxFX0ZMQUc7CisJCWJwLT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOworCX0KKwlicC0+ZGlzYWJsZV90cGEgPSBkaXNhYmxlX3RwYTsKKworCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJYnAtPmRyb3BsZXNzX2ZjID0gMDsKKwllbHNlCisJCWJwLT5kcm9wbGVzc19mYyA9IGRyb3BsZXNzX2ZjOworCisJYnAtPm1ycnMgPSBtcnJzOworCisJYnAtPnR4X3Jpbmdfc2l6ZSA9IE1BWF9UWF9BVkFJTDsKKwlicC0+cnhfcmluZ19zaXplID0gTUFYX1JYX0FWQUlMOworCisJYnAtPnJ4X2NzdW0gPSAxOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIG51bWJlcnMgYXJlIGluIHRoZSByaWdodCBncmFudWxhcml0eSAqLworCWJwLT50eF90aWNrcyA9ICg1MCAvICg0ICogQk5YMlhfQlRSKSkgKiAoNCAqIEJOWDJYX0JUUik7CisJYnAtPnJ4X3RpY2tzID0gKDI1IC8gKDQgKiBCTlgyWF9CVFIpKSAqICg0ICogQk5YMlhfQlRSKTsKKworCXRpbWVyX2ludGVydmFsID0gKENISVBfUkVWX0lTX1NMT1coYnApID8gNSpIWiA6IEhaKTsKKwlicC0+Y3VycmVudF9pbnRlcnZhbCA9IChwb2xsID8gcG9sbCA6IHRpbWVyX2ludGVydmFsKTsKKworCWluaXRfdGltZXIoJmJwLT50aW1lcik7CisJYnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgYnAtPmN1cnJlbnRfaW50ZXJ2YWw7CisJYnAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYnA7CisJYnAtPnRpbWVyLmZ1bmN0aW9uID0gYm54MnhfdGltZXI7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCitzdGF0aWMgaW50IGJueDJ4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EMCk7CisKKwlpZiAoIWJueDJ4X3Jlc2V0X2lzX2RvbmUoYnApKSB7CisJCWRvIHsKKwkJCS8qIFJlc2V0IE1DUCBtYWlsIGJveCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbiBnb2luZworCQkJICogcmVjb3ZlcnkKKwkJCSAqLworCQkJYnAtPmZ3X3NlcSA9IDA7CisKKwkJCS8qIElmIGl0J3MgdGhlIGZpcnN0IGZ1bmN0aW9uIHRvIGxvYWQgYW5kIHJlc2V0IGRvbmUKKwkJCSAqIGlzIHN0aWxsIG5vdCBjbGVhcmVkIGl0IG1heSBtZWFuIHRoYXQuIFdlIGRvbid0CisJCQkgKiBjaGVjayB0aGUgYXR0ZW50aW9uIHN0YXRlIGhlcmUgYmVjYXVzZSBpdCBtYXkgaGF2ZQorCQkJICogYWxyZWFkeSBiZWVuIGNsZWFyZWQgYnkgYSAiY29tbW9uIiByZXNldCBidXQgd2UKKwkJCSAqIHNoZWxsIHByb2NlZWQgd2l0aCAicHJvY2VzcyBraWxsIiBhbnl3YXkuCisJCQkgKi8KKwkJCWlmICgoYm54MnhfZ2V0X2xvYWRfY250KGJwKSA9PSAwKSAmJgorCQkJCWJueDJ4X3RyeWxvY2tfaHdfbG9jayhicCwKKwkJCQlIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KSAmJgorCQkJCSghYm54MnhfbGVhZGVyX3Jlc2V0KGJwKSkpIHsKKwkJCQlEUChORVRJRl9NU0dfSFcsICJSZWNvdmVyZWQgaW4gb3BlblxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QzaG90KTsKKworCQkJcHJpbnRrKEtFUk5fRVJSIiVzOiBSZWNvdmVyeSBmbG93IGhhc24ndCBiZWVuIHByb3Blcmx5IgorCQkJIiBjb21wbGV0ZWQgeWV0LiBUcnkgYWdhaW4gbGF0ZXIuIElmIHUgc3RpbGwgc2VlIHRoaXMiCisJCQkiIG1lc3NhZ2UgYWZ0ZXIgYSBmZXcgcmV0cmllcyB0aGVuIHBvd2VyIGN5Y2xlIGlzIgorCQkJIiByZXF1aXJlZC5cbiIsIGJwLT5kZXYtPm5hbWUpOworCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSB3aGlsZSAoMCk7CisJfQorCisJYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfRE9ORTsKKworCXJldHVybiBibngyeF9uaWNfbG9hZChicCwgTE9BRF9PUEVOKTsKK30KKworLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCitzdGF0aWMgaW50IGJueDJ4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBVbmxvYWQgdGhlIGRyaXZlciwgcmVsZWFzZSBJUlFzICovCisJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX0NMT1NFKTsKKwlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVkIHdpdGggbmV0aWZfdHhfbG9jayBmcm9tIGRldl9tY2FzdC5jICovCit2b2lkIGJueDJ4X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PUk1BTDsKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCisJaWYgKGJwLT5zdGF0ZSAhPSBCTlgyWF9TVEFURV9PUEVOKSB7CisJCURQKE5FVElGX01TR19JRlVQLCAic3RhdGUgaXMgJXgsIHJldHVybmluZ1xuIiwgYnAtPnN0YXRlKTsKKwkJcmV0dXJuOworCX0KKworCURQKE5FVElGX01TR19JRlVQLCAiZGV2LT5mbGFncyA9ICV4XG4iLCBkZXYtPmZsYWdzKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX1BST01JU0M7CisKKwllbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKwkJICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBCTlgyWF9NQVhfTVVMVElDQVNUKSAmJgorCQkgIENISVBfSVNfRTEoYnApKSkKKwkJcnhfbW9kZSA9IEJOWDJYX1JYX01PREVfQUxMTVVMVEk7CisKKwllbHNlIHsgLyogc29tZSBtdWx0aWNhc3RzICovCisJCWlmIChDSElQX0lTX0UxKGJwKSkgeworCQkJaW50IGksIG9sZCwgb2Zmc2V0OworCQkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwkJCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9CisJCQkJCQlibngyeF9zcChicCwgbWNhc3RfY29uZmlnKTsKKworCQkJaSA9IDA7CisJCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisJCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uCisJCQkJCWNhbV9lbnRyeS5tc2JfbWFjX2FkZHIgPQorCQkJCQlzd2FiMTYoKih1MTYgKikmaGEtPmFkZHJbMF0pOworCQkJCWNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldLgorCQkJCQljYW1fZW50cnkubWlkZGxlX21hY19hZGRyID0KKwkJCQkJc3dhYjE2KCoodTE2ICopJmhhLT5hZGRyWzJdKTsKKwkJCQljb25maWctPmNvbmZpZ190YWJsZVtpXS4KKwkJCQkJY2FtX2VudHJ5LmxzYl9tYWNfYWRkciA9CisJCQkJCXN3YWIxNigqKHUxNiAqKSZoYS0+YWRkcls0XSk7CisJCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uY2FtX2VudHJ5LmZsYWdzID0KKwkJCQkJCQljcHVfdG9fbGUxNihwb3J0KTsKKwkJCQljb25maWctPmNvbmZpZ190YWJsZVtpXS4KKwkJCQkJdGFyZ2V0X3RhYmxlX2VudHJ5LmZsYWdzID0gMDsKKwkJCQljb25maWctPmNvbmZpZ190YWJsZVtpXS50YXJnZXRfdGFibGVfZW50cnkuCisJCQkJCWNsaWVudHNfYml0X3ZlY3RvciA9CisJCQkJCQljcHVfdG9fbGUzMigxIDw8IEJQX0xfSUQoYnApKTsKKwkJCQljb25maWctPmNvbmZpZ190YWJsZVtpXS4KKwkJCQkJdGFyZ2V0X3RhYmxlX2VudHJ5LnZsYW5faWQgPSAwOworCisJCQkJRFAoTkVUSUZfTVNHX0lGVVAsCisJCQkJICAgInNldHRpbmcgTUNBU1RbJWRdICglMDR4OiUwNHg6JTA0eClcbiIsIGksCisJCQkJICAgY29uZmlnLT5jb25maWdfdGFibGVbaV0uCisJCQkJCQljYW1fZW50cnkubXNiX21hY19hZGRyLAorCQkJCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldLgorCQkJCQkJY2FtX2VudHJ5Lm1pZGRsZV9tYWNfYWRkciwKKwkJCQkgICBjb25maWctPmNvbmZpZ190YWJsZVtpXS4KKwkJCQkJCWNhbV9lbnRyeS5sc2JfbWFjX2FkZHIpOworCQkJCWkrKzsKKwkJCX0KKwkJCW9sZCA9IGNvbmZpZy0+aGRyLmxlbmd0aDsKKwkJCWlmIChvbGQgPiBpKSB7CisJCQkJZm9yICg7IGkgPCBvbGQ7IGkrKykgeworCQkJCQlpZiAoQ0FNX0lTX0lOVkFMSUQoY29uZmlnLT4KKwkJCQkJCQkgICBjb25maWdfdGFibGVbaV0pKSB7CisJCQkJCQkvKiBhbHJlYWR5IGludmFsaWRhdGVkICovCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKiBpbnZhbGlkYXRlICovCisJCQkJCUNBTV9JTlZBTElEQVRFKGNvbmZpZy0+CisJCQkJCQkgICAgICAgY29uZmlnX3RhYmxlW2ldKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKKwkJCQlvZmZzZXQgPSBCTlgyWF9NQVhfRU1VTF9NVUxUSSooMSArIHBvcnQpOworCQkJZWxzZQorCQkJCW9mZnNldCA9IEJOWDJYX01BWF9NVUxUSUNBU1QqKDEgKyBwb3J0KTsKKworCQkJY29uZmlnLT5oZHIubGVuZ3RoID0gaTsKKwkJCWNvbmZpZy0+aGRyLm9mZnNldCA9IG9mZnNldDsKKwkJCWNvbmZpZy0+aGRyLmNsaWVudF9pZCA9IGJwLT5mcC0+Y2xfaWQ7CisJCQljb25maWctPmhkci5yZXNlcnZlZDEgPSAwOworCisJCQlicC0+c2V0X21hY19wZW5kaW5nKys7CisJCQlzbXBfd21iKCk7CisKKwkJCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMsIDAsCisJCQkJICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X2NvbmZpZykpLAorCQkJCSAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtY2FzdF9jb25maWcpKSwKKwkJCQkgICAgICAwKTsKKwkJfSBlbHNlIHsgLyogRTFIICovCisJCQkvKiBBY2NlcHQgb25lIG9yIG1vcmUgbXVsdGljYXN0cyAqLworCQkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwkJCXUzMiBtY19maWx0ZXJbTUNfSEFTSF9TSVpFXTsKKwkJCXUzMiBjcmMsIGJpdCwgcmVnaWR4OworCQkJaW50IGk7CisKKwkJCW1lbXNldChtY19maWx0ZXIsIDAsIDQgKiBNQ19IQVNIX1NJWkUpOworCisJCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisJCQkJRFAoTkVUSUZfTVNHX0lGVVAsICJBZGRpbmcgbWNhc3QgTUFDOiAlcE1cbiIsCisJCQkJICAgaGEtPmFkZHIpOworCisJCQkJY3JjID0gY3JjMzJjX2xlKDAsIGhhLT5hZGRyLCBFVEhfQUxFTik7CisJCQkJYml0ID0gKGNyYyA+PiAyNCkgJiAweGZmOworCQkJCXJlZ2lkeCA9IGJpdCA+PiA1OworCQkJCWJpdCAmPSAweDFmOworCQkJCW1jX2ZpbHRlcltyZWdpZHhdIHw9ICgxIDw8IGJpdCk7CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQ19IQVNIX1NJWkU7IGkrKykKKwkJCQlSRUdfV1IoYnAsIE1DX0hBU0hfT0ZGU0VUKGJwLCBpKSwKKwkJCQkgICAgICAgbWNfZmlsdGVyW2ldKTsKKwkJfQorCX0KKworCWJwLT5yeF9tb2RlID0gcnhfbW9kZTsKKwlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7Cit9CisKKworLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCitzdGF0aWMgaW50IGJueDJ4X21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcHJ0YWQsCisJCQkgICBpbnQgZGV2YWQsIHUxNiBhZGRyKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUxNiB2YWx1ZTsKKwlpbnQgcmM7CisJdTMyIHBoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKKworCURQKE5FVElGX01TR19MSU5LLCAibWRpb19yZWFkOiBwcnRhZCAweCV4LCBkZXZhZCAweCV4LCBhZGRyIDB4JXhcbiIsCisJICAgcHJ0YWQsIGRldmFkLCBhZGRyKTsKKworCWlmIChwcnRhZCAhPSBicC0+bWRpby5wcnRhZCkgeworCQlEUChORVRJRl9NU0dfTElOSywgInBydGFkIG1pc3NtYXRjaCAoY21kOjB4JXggIT0gYnA6MHgleClcbiIsCisJCSAgIHBydGFkLCBicC0+bWRpby5wcnRhZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoZSBIVyBleHBlY3RzIGRpZmZlcmVudCBkZXZhZCBpZiBDTDIyIGlzIHVzZWQgKi8KKwlkZXZhZCA9IChkZXZhZCA9PSBNRElPX0RFVkFEX05PTkUpID8gREVGQVVMVF9QSFlfREVWX0FERFIgOiBkZXZhZDsKKworCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCXJjID0gYm54MnhfY2w0NV9yZWFkKGJwLCBCUF9QT1JUKGJwKSwgcGh5X3R5cGUsIHBydGFkLAorCQkJICAgICBkZXZhZCwgYWRkciwgJnZhbHVlKTsKKwlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKKwlEUChORVRJRl9NU0dfTElOSywgIm1kaW9fcmVhZF92YWwgMHgleCByYyA9IDB4JXhcbiIsIHZhbHVlLCByYyk7CisKKwlpZiAoIXJjKQorCQlyYyA9IHZhbHVlOworCXJldHVybiByYzsKK30KKworLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCitzdGF0aWMgaW50IGJueDJ4X21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBydGFkLCBpbnQgZGV2YWQsCisJCQkgICAgdTE2IGFkZHIsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKKwlpbnQgcmM7CisKKwlEUChORVRJRl9NU0dfTElOSywgIm1kaW9fd3JpdGU6IHBydGFkIDB4JXgsIGRldmFkIDB4JXgsIGFkZHIgMHgleCwiCisJCQkgICAiIHZhbHVlIDB4JXhcbiIsIHBydGFkLCBkZXZhZCwgYWRkciwgdmFsdWUpOworCisJaWYgKHBydGFkICE9IGJwLT5tZGlvLnBydGFkKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAicHJ0YWQgbWlzc21hdGNoIChjbWQ6MHgleCAhPSBicDoweCV4KVxuIiwKKwkJICAgcHJ0YWQsIGJwLT5tZGlvLnBydGFkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVGhlIEhXIGV4cGVjdHMgZGlmZmVyZW50IGRldmFkIGlmIENMMjIgaXMgdXNlZCAqLworCWRldmFkID0gKGRldmFkID09IE1ESU9fREVWQURfTk9ORSkgPyBERUZBVUxUX1BIWV9ERVZfQUREUiA6IGRldmFkOworCisJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7CisJcmMgPSBibngyeF9jbDQ1X3dyaXRlKGJwLCBCUF9QT1JUKGJwKSwgZXh0X3BoeV90eXBlLCBwcnRhZCwKKwkJCSAgICAgIGRldmFkLCBhZGRyLCB2YWx1ZSk7CisJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7CisJcmV0dXJuIHJjOworfQorCisvKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KK3N0YXRpYyBpbnQgYm54MnhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptZGlvID0gaWZfbWlpKGlmcik7CisKKwlEUChORVRJRl9NU0dfTElOSywgImlvY3RsOiBwaHkgaWQgMHgleCwgcmVnIDB4JXgsIHZhbF9pbiAweCV4XG4iLAorCSAgIG1kaW8tPnBoeV9pZCwgbWRpby0+cmVnX251bSwgbWRpby0+dmFsX2luKTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBtZGlvX21paV9pb2N0bCgmYnAtPm1kaW8sIG1kaW8sIGNtZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgcG9sbF9ibngyeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGlzYWJsZV9pcnEoYnAtPnBkZXYtPmlycSk7CisJYm54MnhfaW50ZXJydXB0KGJwLT5wZGV2LT5pcnEsIGRldik7CisJZW5hYmxlX2lycShicC0+cGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJueDJ4X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGJueDJ4X29wZW4sCisJLm5kb19zdG9wCQk9IGJueDJ4X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBibngyeF9zdGFydF94bWl0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gYm54Mnhfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBibngyeF9jaGFuZ2VfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19kb19pb2N0bAkJPSBibngyeF9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gYm54MnhfY2hhbmdlX210dSwKKwkubmRvX3R4X3RpbWVvdXQJCT0gYm54MnhfdHhfdGltZW91dCwKKyNpZmRlZiBCQ01fVkxBTgorCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGJueDJ4X3ZsYW5fcnhfcmVnaXN0ZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gcG9sbF9ibngyeCwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYm54MnhfaW5pdF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicDsKKwlpbnQgcmM7CisKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWJwLT5kZXYgPSBkZXY7CisJYnAtPnBkZXYgPSBwZGV2OworCWJwLT5mbGFncyA9IDA7CisJYnAtPmZ1bmMgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCisJCQkiQ2Fubm90IGZpbmQgUENJIGRldmljZSBiYXNlIGFkZHJlc3MsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMikgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwgIkNhbm5vdCBmaW5kIHNlY29uZCBQQ0kgZGV2aWNlIgorCQkgICAgICAgIiBiYXNlIGFkZHJlc3MsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpID09IDEpIHsKKwkJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9NT0RVTEVfTkFNRSk7CisJCWlmIChyYykgeworCQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCQkiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CisJCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwkJfQorCisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwl9CisKKwlicC0+cG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwlpZiAoYnAtPnBtX2NhcCA9PSAwKSB7CisJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCisJCQkiQ2Fubm90IGZpbmQgcG93ZXIgbWFuYWdlbWVudCBjYXBhYmlsaXR5LCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2U7CisJfQorCisJYnAtPnBjaWVfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJaWYgKGJwLT5wY2llX2NhcCA9PSAwKSB7CisJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCisJCQkiQ2Fubm90IGZpbmQgUENJIEV4cHJlc3MgY2FwYWJpbGl0eSwgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dF9yZWxlYXNlOworCX0KKworCWlmIChkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSkgPT0gMCkgeworCQlicC0+ZmxhZ3MgfD0gVVNJTkdfREFDX0ZMQUc7CisJCWlmIChkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSkgIT0gMCkgeworCQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwgImRtYV9zZXRfY29oZXJlbnRfbWFzayIKKwkJCSAgICAgICAiIGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X3JlbGVhc2U7CisJCX0KKworCX0gZWxzZSBpZiAoZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpICE9IDApIHsKKwkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCSJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBETUEsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKKwl9CisKKwlkZXYtPm1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlkZXYtPmJhc2VfYWRkciA9IGRldi0+bWVtX3N0YXJ0OworCWRldi0+bWVtX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCk7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCWJwLT5yZWd2aWV3ID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOworCWlmICghYnAtPnJlZ3ZpZXcpIHsKKwkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgbWFwIHJlZ2lzdGVyIHNwYWNlLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2U7CisJfQorCisJYnAtPmRvb3JiZWxscyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCisJCQkJCW1pbl90KHU2NCwgQk5YMlhfREJfU0laRSwKKwkJCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSkpOworCWlmICghYnAtPmRvb3JiZWxscykgeworCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCBtYXAgZG9vcmJlbGwgc3BhY2UsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJfQorCisJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOworCisJLyogY2xlYW4gaW5kaXJlY3QgYWRkcmVzc2VzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19BRERSRVNTLAorCQkJICAgICAgIFBDSUNGR19WRU5ET1JfSURfT0ZGU0VUKTsKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1BHTF9BRERSXzg4X0YwICsgQlBfUE9SVChicCkqMTYsIDApOworCVJFR19XUihicCwgUFhQMl9SRUdfUEdMX0FERFJfOENfRjAgKyBCUF9QT1JUKGJwKSoxNiwgMCk7CisJUkVHX1dSKGJwLCBQWFAyX1JFR19QR0xfQUREUl85MF9GMCArIEJQX1BPUlQoYnApKjE2LCAwKTsKKwlSRUdfV1IoYnAsIFBYUDJfUkVHX1BHTF9BRERSXzk0X0YwICsgQlBfUE9SVChicCkqMTYsIDApOworCisJLyogUmVzZXQgdGhlIGxvYWQgY291bnRlciAqLworCWJueDJ4X2NsZWFyX2xvYWRfY250KGJwKTsKKworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJZGV2LT5uZXRkZXZfb3BzID0gJmJueDJ4X25ldGRldl9vcHM7CisJYm54Mnhfc2V0X2V0aHRvb2xfb3BzKGRldik7CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19EQUNfRkxBRykKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04pOworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworI2lmZGVmIEJDTV9WTEFOCisJZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYKTsKKwlicC0+ZmxhZ3MgfD0gKEhXX1ZMQU5fUlhfRkxBRyB8IEhXX1ZMQU5fVFhfRkxBRyk7CisKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19EQUNfRkxBRykKKwkJZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU09fRUNOKTsKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworI2VuZGlmCisKKwkvKiBnZXRfcG9ydF9od2luZm8oKSB3aWxsIHNldCBwcnRhZCBhbmQgbW1kcyBwcm9wZXJseSAqLworCWJwLT5tZGlvLnBydGFkID0gTURJT19QUlRBRF9OT05FOworCWJwLT5tZGlvLm1tZHMgPSAwOworCWJwLT5tZGlvLm1vZGVfc3VwcG9ydCA9IE1ESU9fU1VQUE9SVFNfQzQ1IHwgTURJT19FTVVMQVRFX0MyMjsKKwlicC0+bWRpby5kZXYgPSBkZXY7CisJYnAtPm1kaW8ubWRpb19yZWFkID0gYm54MnhfbWRpb19yZWFkOworCWJwLT5tZGlvLm1kaW9fd3JpdGUgPSBibngyeF9tZGlvX3dyaXRlOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5tYXA6CisJaWYgKGJwLT5yZWd2aWV3KSB7CisJCWlvdW5tYXAoYnAtPnJlZ3ZpZXcpOworCQlicC0+cmVndmlldyA9IE5VTEw7CisJfQorCWlmIChicC0+ZG9vcmJlbGxzKSB7CisJCWlvdW5tYXAoYnAtPmRvb3JiZWxscyk7CisJCWJwLT5kb29yYmVsbHMgPSBOVUxMOworCX0KKworZXJyX291dF9yZWxlYXNlOgorCWlmIChhdG9taWNfcmVhZCgmcGRldi0+ZW5hYmxlX2NudCkgPT0gMSkKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKK2Vycl9vdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm54MnhfZ2V0X3BjaWVfd2lkdGhfc3BlZWQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJCSBpbnQgKndpZHRoLCBpbnQgKnNwZWVkKQoreworCXUzMiB2YWwgPSBSRUdfUkQoYnAsIFBDSUNGR19PRkZTRVQgKyBQQ0lDRkdfTElOS19DT05UUk9MKTsKKworCSp3aWR0aCA9ICh2YWwgJiBQQ0lDRkdfTElOS19XSURUSCkgPj4gUENJQ0ZHX0xJTktfV0lEVEhfU0hJRlQ7CisKKwkvKiByZXR1cm4gdmFsdWUgb2YgMT0yLjVHSHogMj01R0h6ICovCisJKnNwZWVkID0gKHZhbCAmIFBDSUNGR19MSU5LX1NQRUVEKSA+PiBQQ0lDRkdfTElOS19TUEVFRF9TSElGVDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm54MnhfY2hlY2tfZmlybXdhcmUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlID0gYnAtPmZpcm13YXJlOworCXN0cnVjdCBibngyeF9md19maWxlX2hkciAqZndfaGRyOworCXN0cnVjdCBibngyeF9md19maWxlX3NlY3Rpb24gKnNlY3Rpb25zOworCXUzMiBvZmZzZXQsIGxlbiwgbnVtX29wczsKKwl1MTYgKm9wc19vZmZzZXRzOworCWludCBpOworCWNvbnN0IHU4ICpmd192ZXI7CisKKwlpZiAoZmlybXdhcmUtPnNpemUgPCBzaXplb2Yoc3RydWN0IGJueDJ4X2Z3X2ZpbGVfaGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmd19oZHIgPSAoc3RydWN0IGJueDJ4X2Z3X2ZpbGVfaGRyICopZmlybXdhcmUtPmRhdGE7CisJc2VjdGlvbnMgPSAoc3RydWN0IGJueDJ4X2Z3X2ZpbGVfc2VjdGlvbiAqKWZ3X2hkcjsKKworCS8qIE1ha2Ugc3VyZSBub25lIG9mIHRoZSBvZmZzZXRzIGFuZCBzaXplcyBtYWtlIHVzIHJlYWQgYmV5b25kCisJICogdGhlIGVuZCBvZiB0aGUgZmlybXdhcmUgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoKmZ3X2hkcikgLyBzaXplb2YoKnNlY3Rpb25zKTsgaSsrKSB7CisJCW9mZnNldCA9IGJlMzJfdG9fY3B1KHNlY3Rpb25zW2ldLm9mZnNldCk7CisJCWxlbiA9IGJlMzJfdG9fY3B1KHNlY3Rpb25zW2ldLmxlbik7CisJCWlmIChvZmZzZXQgKyBsZW4gPiBmaXJtd2FyZS0+c2l6ZSkgeworCQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCQkiU2VjdGlvbiAlZCBsZW5ndGggaXMgb3V0IG9mIGJvdW5kc1xuIiwgaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIExpa2V3aXNlIGZvciB0aGUgaW5pdF9vcHMgb2Zmc2V0cyAqLworCW9mZnNldCA9IGJlMzJfdG9fY3B1KGZ3X2hkci0+aW5pdF9vcHNfb2Zmc2V0cy5vZmZzZXQpOworCW9wc19vZmZzZXRzID0gKHUxNiAqKShmaXJtd2FyZS0+ZGF0YSArIG9mZnNldCk7CisJbnVtX29wcyA9IGJlMzJfdG9fY3B1KGZ3X2hkci0+aW5pdF9vcHMubGVuKSAvIHNpemVvZihzdHJ1Y3QgcmF3X29wKTsKKworCWZvciAoaSA9IDA7IGkgPCBiZTMyX3RvX2NwdShmd19oZHItPmluaXRfb3BzX29mZnNldHMubGVuKSAvIDI7IGkrKykgeworCQlpZiAoYmUxNl90b19jcHUob3BzX29mZnNldHNbaV0pID4gbnVtX29wcykgeworCQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCQkiU2VjdGlvbiBvZmZzZXQgJWQgaXMgb3V0IG9mIGJvdW5kc1xuIiwgaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIENoZWNrIEZXIHZlcnNpb24gKi8KKwlvZmZzZXQgPSBiZTMyX3RvX2NwdShmd19oZHItPmZ3X3ZlcnNpb24ub2Zmc2V0KTsKKwlmd192ZXIgPSBmaXJtd2FyZS0+ZGF0YSArIG9mZnNldDsKKwlpZiAoKGZ3X3ZlclswXSAhPSBCQ01fNTcxMF9GV19NQUpPUl9WRVJTSU9OKSB8fAorCSAgICAoZndfdmVyWzFdICE9IEJDTV81NzEwX0ZXX01JTk9SX1ZFUlNJT04pIHx8CisJICAgIChmd192ZXJbMl0gIT0gQkNNXzU3MTBfRldfUkVWSVNJT05fVkVSU0lPTikgfHwKKwkgICAgKGZ3X3ZlclszXSAhPSBCQ01fNTcxMF9GV19FTkdJTkVFUklOR19WRVJTSU9OKSkgeworCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAorCQkJIkJhZCBGVyB2ZXJzaW9uOiVkLiVkLiVkLiVkLiBTaG91bGQgYmUgJWQuJWQuJWQuJWRcbiIsCisJCSAgICAgICBmd192ZXJbMF0sIGZ3X3ZlclsxXSwgZndfdmVyWzJdLAorCQkgICAgICAgZndfdmVyWzNdLCBCQ01fNTcxMF9GV19NQUpPUl9WRVJTSU9OLAorCQkgICAgICAgQkNNXzU3MTBfRldfTUlOT1JfVkVSU0lPTiwKKwkJICAgICAgIEJDTV81NzEwX0ZXX1JFVklTSU9OX1ZFUlNJT04sCisJCSAgICAgICBCQ01fNTcxMF9GV19FTkdJTkVFUklOR19WRVJTSU9OKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZTMyX3RvX2NwdV9uKGNvbnN0IHU4ICpfc291cmNlLCB1OCAqX3RhcmdldCwgdTMyIG4pCit7CisJY29uc3QgX19iZTMyICpzb3VyY2UgPSAoY29uc3QgX19iZTMyICopX3NvdXJjZTsKKwl1MzIgKnRhcmdldCA9ICh1MzIgKilfdGFyZ2V0OworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IG4vNDsgaSsrKQorCQl0YXJnZXRbaV0gPSBiZTMyX3RvX2NwdShzb3VyY2VbaV0pOworfQorCisvKgorICAgT3BzIGFycmF5IGlzIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgIHtvcCg4Yml0KSwgb2Zmc2V0KDI0Yml0LCBiaWcgZW5kaWFuKSwgZGF0YSgzMmJpdCwgYmlnIGVuZGlhbil9CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9wcmVwX29wcyhjb25zdCB1OCAqX3NvdXJjZSwgdTggKl90YXJnZXQsIHUzMiBuKQoreworCWNvbnN0IF9fYmUzMiAqc291cmNlID0gKGNvbnN0IF9fYmUzMiAqKV9zb3VyY2U7CisJc3RydWN0IHJhd19vcCAqdGFyZ2V0ID0gKHN0cnVjdCByYXdfb3AgKilfdGFyZ2V0OworCXUzMiBpLCBqLCB0bXA7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG4vODsgaSsrLCBqICs9IDIpIHsKKwkJdG1wID0gYmUzMl90b19jcHUoc291cmNlW2pdKTsKKwkJdGFyZ2V0W2ldLm9wID0gKHRtcCA+PiAyNCkgJiAweGZmOworCQl0YXJnZXRbaV0ub2Zmc2V0ID0gdG1wICYgMHhmZmZmZmY7CisJCXRhcmdldFtpXS5yYXdfZGF0YSA9IGJlMzJfdG9fY3B1KHNvdXJjZVtqICsgMV0pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlMTZfdG9fY3B1X24oY29uc3QgdTggKl9zb3VyY2UsIHU4ICpfdGFyZ2V0LCB1MzIgbikKK3sKKwljb25zdCBfX2JlMTYgKnNvdXJjZSA9IChjb25zdCBfX2JlMTYgKilfc291cmNlOworCXUxNiAqdGFyZ2V0ID0gKHUxNiAqKV90YXJnZXQ7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbi8yOyBpKyspCisJCXRhcmdldFtpXSA9IGJlMTZfdG9fY3B1KHNvdXJjZVtpXSk7Cit9CisKKyNkZWZpbmUgQk5YMlhfQUxMT0NfQU5EX1NFVChhcnIsIGxibCwgZnVuYykJCQkJXAorZG8gewkJCQkJCQkJCVwKKwl1MzIgbGVuID0gYmUzMl90b19jcHUoZndfaGRyLT5hcnIubGVuKTsJCQkJXAorCWJwLT5hcnIgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CQkJCVwKKwlpZiAoIWJwLT5hcnIpIHsJCQkJCQkJXAorCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgIiNhcnIiXG4iLCBsZW4pOyBcCisJCWdvdG8gbGJsOwkJCQkJCVwKKwl9CQkJCQkJCQlcCisJZnVuYyhicC0+ZmlybXdhcmUtPmRhdGEgKyBiZTMyX3RvX2NwdShmd19oZHItPmFyci5vZmZzZXQpLAlcCisJICAgICAodTggKilicC0+YXJyLCBsZW4pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBfX2RldmluaXQgYm54MnhfaW5pdF9maXJtd2FyZShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3QgY2hhciAqZndfZmlsZV9uYW1lOworCXN0cnVjdCBibngyeF9md19maWxlX2hkciAqZndfaGRyOworCWludCByYzsKKworCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJZndfZmlsZV9uYW1lID0gRldfRklMRV9OQU1FX0UxOworCWVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkKKwkJZndfZmlsZV9uYW1lID0gRldfRklMRV9OQU1FX0UxSDsKKwllbHNlIHsKKwkJZGV2X2VycihkZXYsICJVbnN1cHBvcnRlZCBjaGlwIHJldmlzaW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2luZm8oZGV2LCAiTG9hZGluZyAlc1xuIiwgZndfZmlsZV9uYW1lKTsKKworCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmYnAtPmZpcm13YXJlLCBmd19maWxlX25hbWUsIGRldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgbG9hZCBmaXJtd2FyZSBmaWxlICVzXG4iLCBmd19maWxlX25hbWUpOworCQlnb3RvIHJlcXVlc3RfZmlybXdhcmVfZXhpdDsKKwl9CisKKwlyYyA9IGJueDJ4X2NoZWNrX2Zpcm13YXJlKGJwKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJDb3JydXB0IGZpcm13YXJlIGZpbGUgJXNcbiIsIGZ3X2ZpbGVfbmFtZSk7CisJCWdvdG8gcmVxdWVzdF9maXJtd2FyZV9leGl0OworCX0KKworCWZ3X2hkciA9IChzdHJ1Y3QgYm54MnhfZndfZmlsZV9oZHIgKilicC0+ZmlybXdhcmUtPmRhdGE7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyB0byB0aGUgaW5pdCBhcnJheXMgKi8KKwkvKiBCbG9iICovCisJQk5YMlhfQUxMT0NfQU5EX1NFVChpbml0X2RhdGEsIHJlcXVlc3RfZmlybXdhcmVfZXhpdCwgYmUzMl90b19jcHVfbik7CisKKwkvKiBPcGNvZGVzICovCisJQk5YMlhfQUxMT0NfQU5EX1NFVChpbml0X29wcywgaW5pdF9vcHNfYWxsb2NfZXJyLCBibngyeF9wcmVwX29wcyk7CisKKwkvKiBPZmZzZXRzICovCisJQk5YMlhfQUxMT0NfQU5EX1NFVChpbml0X29wc19vZmZzZXRzLCBpbml0X29mZnNldHNfYWxsb2NfZXJyLAorCQkJICAgIGJlMTZfdG9fY3B1X24pOworCisJLyogU1RPUk1zIGZpcm13YXJlICovCisJSU5JVF9UU0VNX0lOVF9UQUJMRV9EQVRBKGJwKSA9IGJwLT5maXJtd2FyZS0+ZGF0YSArCisJCQliZTMyX3RvX2NwdShmd19oZHItPnRzZW1faW50X3RhYmxlX2RhdGEub2Zmc2V0KTsKKwlJTklUX1RTRU1fUFJBTV9EQVRBKGJwKSAgICAgID0gYnAtPmZpcm13YXJlLT5kYXRhICsKKwkJCWJlMzJfdG9fY3B1KGZ3X2hkci0+dHNlbV9wcmFtX2RhdGEub2Zmc2V0KTsKKwlJTklUX1VTRU1fSU5UX1RBQkxFX0RBVEEoYnApID0gYnAtPmZpcm13YXJlLT5kYXRhICsKKwkJCWJlMzJfdG9fY3B1KGZ3X2hkci0+dXNlbV9pbnRfdGFibGVfZGF0YS5vZmZzZXQpOworCUlOSVRfVVNFTV9QUkFNX0RBVEEoYnApICAgICAgPSBicC0+ZmlybXdhcmUtPmRhdGEgKworCQkJYmUzMl90b19jcHUoZndfaGRyLT51c2VtX3ByYW1fZGF0YS5vZmZzZXQpOworCUlOSVRfWFNFTV9JTlRfVEFCTEVfREFUQShicCkgPSBicC0+ZmlybXdhcmUtPmRhdGEgKworCQkJYmUzMl90b19jcHUoZndfaGRyLT54c2VtX2ludF90YWJsZV9kYXRhLm9mZnNldCk7CisJSU5JVF9YU0VNX1BSQU1fREFUQShicCkgICAgICA9IGJwLT5maXJtd2FyZS0+ZGF0YSArCisJCQliZTMyX3RvX2NwdShmd19oZHItPnhzZW1fcHJhbV9kYXRhLm9mZnNldCk7CisJSU5JVF9DU0VNX0lOVF9UQUJMRV9EQVRBKGJwKSA9IGJwLT5maXJtd2FyZS0+ZGF0YSArCisJCQliZTMyX3RvX2NwdShmd19oZHItPmNzZW1faW50X3RhYmxlX2RhdGEub2Zmc2V0KTsKKwlJTklUX0NTRU1fUFJBTV9EQVRBKGJwKSAgICAgID0gYnAtPmZpcm13YXJlLT5kYXRhICsKKwkJCWJlMzJfdG9fY3B1KGZ3X2hkci0+Y3NlbV9wcmFtX2RhdGEub2Zmc2V0KTsKKworCXJldHVybiAwOworCitpbml0X29mZnNldHNfYWxsb2NfZXJyOgorCWtmcmVlKGJwLT5pbml0X29wcyk7Citpbml0X29wc19hbGxvY19lcnI6CisJa2ZyZWUoYnAtPmluaXRfZGF0YSk7CityZXF1ZXN0X2Zpcm13YXJlX2V4aXQ6CisJcmVsZWFzZV9maXJtd2FyZShicC0+ZmlybXdhcmUpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBibngyeCAqYnA7CisJaW50IHBjaWVfd2lkdGgsIHBjaWVfc3BlZWQ7CisJaW50IHJjOworCisJLyogZGV2IHplcm9lZCBpbiBpbml0X2V0aGVyZGV2ICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKCpicCksIE1BWF9DT05URVhUKTsKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgYWxsb2NhdGUgbmV0IGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlicC0+bXNnX2VuYWJsZSA9IGRlYnVnOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlyYyA9IGJueDJ4X2luaXRfZGV2KHBkZXYsIGRldik7CisJaWYgKHJjIDwgMCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBibngyeF9pbml0X2JwKGJwKTsKKwlpZiAocmMpCisJCWdvdG8gaW5pdF9vbmVfZXhpdDsKKworCS8qIFNldCBpbml0IGFycmF5cyAqLworCXJjID0gYm54MnhfaW5pdF9maXJtd2FyZShicCwgJnBkZXYtPmRldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIGxvYWRpbmcgZmlybXdhcmVcbiIpOworCQlnb3RvIGluaXRfb25lX2V4aXQ7CisJfQorCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIpOworCQlnb3RvIGluaXRfb25lX2V4aXQ7CisJfQorCisJYm54MnhfZ2V0X3BjaWVfd2lkdGhfc3BlZWQoYnAsICZwY2llX3dpZHRoLCAmcGNpZV9zcGVlZCk7CisJbmV0ZGV2X2luZm8oZGV2LCAiJXMgKCVjJWQpIFBDSS1FIHglZCAlcyBmb3VuZCBhdCBtZW0gJWx4LCIKKwkgICAgICAgIiBJUlEgJWQsICIsIGJvYXJkX2luZm9bZW50LT5kcml2ZXJfZGF0YV0ubmFtZSwKKwkgICAgICAgKENISVBfUkVWKGJwKSA+PiAxMikgKyAnQScsIChDSElQX01FVEFMKGJwKSA+PiA0KSwKKwkgICAgICAgcGNpZV93aWR0aCwgKHBjaWVfc3BlZWQgPT0gMikgPyAiNUdIeiAoR2VuMikiIDogIjIuNUdIeiIsCisJICAgICAgIGRldi0+YmFzZV9hZGRyLCBicC0+cGRldi0+aXJxKTsKKwlwcl9jb250KCJub2RlIGFkZHIgJXBNXG4iLCBkZXYtPmRldl9hZGRyKTsKKworCXJldHVybiAwOworCitpbml0X29uZV9leGl0OgorCWlmIChicC0+cmVndmlldykKKwkJaW91bm1hcChicC0+cmVndmlldyk7CisKKwlpZiAoYnAtPmRvb3JiZWxscykKKwkJaW91bm1hcChicC0+ZG9vcmJlbGxzKTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlpZiAoYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpID09IDEpCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYm54MnhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBibngyeCAqYnA7CisKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCQUQgbmV0IGRldmljZSBmcm9tIGJueDJ4X2luaXRfb25lXG4iKTsKKwkJcmV0dXJuOworCX0KKwlicCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJLyogTWFrZSBzdXJlIFJFU0VUIHRhc2sgaXMgbm90IHNjaGVkdWxlZCBiZWZvcmUgY29udGludWluZyAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnAtPnJlc2V0X3Rhc2spOworCisJa2ZyZWUoYnAtPmluaXRfb3BzX29mZnNldHMpOworCWtmcmVlKGJwLT5pbml0X29wcyk7CisJa2ZyZWUoYnAtPmluaXRfZGF0YSk7CisJcmVsZWFzZV9maXJtd2FyZShicC0+ZmlybXdhcmUpOworCisJaWYgKGJwLT5yZWd2aWV3KQorCQlpb3VubWFwKGJwLT5yZWd2aWV3KTsKKworCWlmIChicC0+ZG9vcmJlbGxzKQorCQlpb3VubWFwKGJwLT5kb29yYmVsbHMpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKworCWlmIChhdG9taWNfcmVhZCgmcGRldi0+ZW5hYmxlX2NudCkgPT0gMSkKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZWVoX25pY191bmxvYWQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaTsKKworCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0VSUk9SOworCisJYnAtPnJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7CisKKwlibngyeF9uZXRpZl9zdG9wKGJwLCAwKTsKKwluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZicC0+dGltZXIpOworCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOworCURQKEJOWDJYX01TR19TVEFUUywgInN0YXRzX3N0YXRlIC0gRElTQUJMRURcbiIpOworCisJLyogUmVsZWFzZSBJUlFzICovCisJYm54MnhfZnJlZV9pcnEoYnAsIGZhbHNlKTsKKworCWlmIChDSElQX0lTX0UxKGJwKSkgeworCQlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcgPQorCQkJCQkJYm54Mnhfc3AoYnAsIG1jYXN0X2NvbmZpZyk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+aGRyLmxlbmd0aDsgaSsrKQorCQkJQ0FNX0lOVkFMSURBVEUoY29uZmlnLT5jb25maWdfdGFibGVbaV0pOworCX0KKworCS8qIEZyZWUgU0tCcywgU0dFcywgVFBBIHBvb2wgYW5kIGRyaXZlciBpbnRlcm5hbHMgKi8KKwlibngyeF9mcmVlX3NrYnMoYnApOworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQorCQlibngyeF9mcmVlX3J4X3NnZV9yYW5nZShicCwgYnAtPmZwICsgaSwgTlVNX1JYX1NHRSk7CisJZm9yX2VhY2hfcXVldWUoYnAsIGkpCisJCW5ldGlmX25hcGlfZGVsKCZibngyeF9mcChicCwgaSwgbmFwaSkpOworCWJueDJ4X2ZyZWVfbWVtKGJwKTsKKworCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibngyeF9lZWhfcmVjb3ZlcihzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CisKKwltdXRleF9pbml0KCZicC0+cG9ydC5waHlfbXV0ZXgpOworCisJYnAtPmNvbW1vbi5zaG1lbV9iYXNlID0gUkVHX1JEKGJwLCBNSVNDX1JFR19TSEFSRURfTUVNX0FERFIpOworCWJwLT5saW5rX3BhcmFtcy5zaG1lbV9iYXNlID0gYnAtPmNvbW1vbi5zaG1lbV9iYXNlOworCUJOWDJYX0RFVl9JTkZPKCJzaG1lbSBvZmZzZXQgaXMgMHgleFxuIiwgYnAtPmNvbW1vbi5zaG1lbV9iYXNlKTsKKworCWlmICghYnAtPmNvbW1vbi5zaG1lbV9iYXNlIHx8CisJICAgIChicC0+Y29tbW9uLnNobWVtX2Jhc2UgPCAweEEwMDAwKSB8fAorCSAgICAoYnAtPmNvbW1vbi5zaG1lbV9iYXNlID49IDB4QzAwMDApKSB7CisJCUJOWDJYX0RFVl9JTkZPKCJNQ1Agbm90IGFjdGl2ZVxuIik7CisJCWJwLT5mbGFncyB8PSBOT19NQ1BfRkxBRzsKKwkJcmV0dXJuOworCX0KKworCXZhbCA9IFNITUVNX1JEKGJwLCB2YWxpZGl0eV9tYXBbQlBfUE9SVChicCldKTsKKwlpZiAoKHZhbCAmIChTSFJfTUVNX1ZBTElESVRZX0RFVl9JTkZPIHwgU0hSX01FTV9WQUxJRElUWV9NQikpCisJCSE9IChTSFJfTUVNX1ZBTElESVRZX0RFVl9JTkZPIHwgU0hSX01FTV9WQUxJRElUWV9NQikpCisJCUJOWDJYX0VSUigiQkFEIE1DUCB2YWxpZGl0eSBzaWduYXR1cmVcbiIpOworCisJaWYgKCFCUF9OT01DUChicCkpIHsKKwkJYnAtPmZ3X3NlcSA9IChTSE1FTV9SRChicCwgZnVuY19tYltCUF9GVU5DKGJwKV0uZHJ2X21iX2hlYWRlcikKKwkJCSAgICAgICYgRFJWX01TR19TRVFfTlVNQkVSX01BU0spOworCQlCTlgyWF9ERVZfSU5GTygiZndfc2VxIDB4JTA4eFxuIiwgYnAtPmZ3X3NlcSk7CisJfQorfQorCisvKioKKyAqIGJueDJ4X2lvX2Vycm9yX2RldGVjdGVkIC0gY2FsbGVkIHdoZW4gUENJIGVycm9yIGlzIGRldGVjdGVkCisgKiBAcGRldjogUG9pbnRlciB0byBQQ0kgZGV2aWNlCisgKiBAc3RhdGU6IFRoZSBjdXJyZW50IHBjaSBjb25uZWN0aW9uIHN0YXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSBQQ0kgYnVzIGVycm9yIGFmZmVjdGluZworICogdGhpcyBkZXZpY2UgaGFzIGJlZW4gZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGJueDJ4X2lvX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkJcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcnRubF9sb2NrKCk7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlpZiAoc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlKSB7CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCWJueDJ4X2VlaF9uaWNfdW5sb2FkKGJwKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwkvKiBSZXF1ZXN0IGEgc2xvdCByZXNldCAqLworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworfQorCisvKioKKyAqIGJueDJ4X2lvX3Nsb3RfcmVzZXQgLSBjYWxsZWQgYWZ0ZXIgdGhlIFBDSSBidXMgaGFzIGJlZW4gcmVzZXQKKyAqIEBwZGV2OiBQb2ludGVyIHRvIFBDSSBkZXZpY2UKKyAqCisgKiBSZXN0YXJ0IHRoZSBjYXJkIGZyb20gc2NyYXRjaCwgYXMgaWYgZnJvbSBhIGNvbGQtYm9vdC4KKyAqLworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgYm54MnhfaW9fc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcnRubF9sb2NrKCk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNhbm5vdCByZS1lbmFibGUgUENJIGRldmljZSBhZnRlciByZXNldFxuIik7CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOworCisJcnRubF91bmxvY2soKTsKKworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7Cit9CisKKy8qKgorICogYm54MnhfaW9fcmVzdW1lIC0gY2FsbGVkIHdoZW4gdHJhZmZpYyBjYW4gc3RhcnQgZmxvd2luZyBhZ2FpbgorICogQHBkZXY6IFBvaW50ZXIgdG8gUENJIGRldmljZQorICoKKyAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGVycm9yIHJlY292ZXJ5IGRyaXZlciB0ZWxscyB1cyB0aGF0CisgKiBpdHMgT0sgdG8gcmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X2lvX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiBUcnkgYWdhaW4gbGF0ZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJcnRubF9sb2NrKCk7CisKKwlibngyeF9lZWhfcmVjb3ZlcihicCk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcnRubF91bmxvY2soKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgYm54MnhfZXJyX2hhbmRsZXIgPSB7CisJLmVycm9yX2RldGVjdGVkID0gYm54MnhfaW9fZXJyb3JfZGV0ZWN0ZWQsCisJLnNsb3RfcmVzZXQgICAgID0gYm54MnhfaW9fc2xvdF9yZXNldCwKKwkucmVzdW1lICAgICAgICAgPSBibngyeF9pb19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYm54MnhfcGNpX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlICAgID0gYm54MnhfcGNpX3RibCwKKwkucHJvYmUgICAgICAgPSBibngyeF9pbml0X29uZSwKKwkucmVtb3ZlICAgICAgPSBfX2RldmV4aXRfcChibngyeF9yZW1vdmVfb25lKSwKKwkuc3VzcGVuZCAgICAgPSBibngyeF9zdXNwZW5kLAorCS5yZXN1bWUgICAgICA9IGJueDJ4X3Jlc3VtZSwKKwkuZXJyX2hhbmRsZXIgPSAmYm54MnhfZXJyX2hhbmRsZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBibngyeF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByX2luZm8oIiVzIiwgdmVyc2lvbik7CisKKwlibngyeF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJibngyeCIpOworCWlmIChibngyeF93cSA9PSBOVUxMKSB7CisJCXByX2VycigiQ2Fubm90IGNyZWF0ZSB3b3JrcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZibngyeF9wY2lfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ2Fubm90IHJlZ2lzdGVyIGRyaXZlclxuIik7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGJueDJ4X3dxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJueDJ4X2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJueDJ4X3BjaV9kcml2ZXIpOworCisJZGVzdHJveV93b3JrcXVldWUoYm54Mnhfd3EpOworfQorCittb2R1bGVfaW5pdChibngyeF9pbml0KTsKK21vZHVsZV9leGl0KGJueDJ4X2NsZWFudXApOworCisjaWZkZWYgQkNNX0NOSUMKKworLyogY291bnQgZGVub3RlcyB0aGUgbnVtYmVyIG9mIG5ldyBjb21wbGV0aW9ucyB3ZSBoYXZlIHNlZW4gKi8KK3N0YXRpYyB2b2lkIGJueDJ4X2NuaWNfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY291bnQpCit7CisJc3RydWN0IGV0aF9zcGUgKnNwZTsKKworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlzcGluX2xvY2tfYmgoJmJwLT5zcHFfbG9jayk7CisJYnAtPmNuaWNfc3BxX3BlbmRpbmcgLT0gY291bnQ7CisKKwlmb3IgKDsgYnAtPmNuaWNfc3BxX3BlbmRpbmcgPCBicC0+Y25pY19ldGhfZGV2Lm1heF9rd3FlX3BlbmRpbmc7CisJICAgICBicC0+Y25pY19zcHFfcGVuZGluZysrKSB7CisKKwkJaWYgKCFicC0+Y25pY19rd3FfcGVuZGluZykKKwkJCWJyZWFrOworCisJCXNwZSA9IGJueDJ4X3NwX2dldF9uZXh0KGJwKTsKKwkJKnNwZSA9ICpicC0+Y25pY19rd3FfY29uczsKKworCQlicC0+Y25pY19rd3FfcGVuZGluZy0tOworCisJCURQKE5FVElGX01TR19USU1FUiwgInBlbmRpbmcgb24gU1BRICVkLCBvbiBLV1EgJWQgY291bnQgJWRcbiIsCisJCSAgIGJwLT5jbmljX3NwcV9wZW5kaW5nLCBicC0+Y25pY19rd3FfcGVuZGluZywgY291bnQpOworCisJCWlmIChicC0+Y25pY19rd3FfY29ucyA9PSBicC0+Y25pY19rd3FfbGFzdCkKKwkJCWJwLT5jbmljX2t3cV9jb25zID0gYnAtPmNuaWNfa3dxOworCQllbHNlCisJCQlicC0+Y25pY19rd3FfY29ucysrOworCX0KKwlibngyeF9zcF9wcm9kX3VwZGF0ZShicCk7CisJc3Bpbl91bmxvY2tfYmgoJmJwLT5zcHFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfY25pY19zcF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBrd3FlXzE2ICprd3Flc1tdLCB1MzIgY291bnQpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCXJldHVybiAtRUlPOworI2VuZGlmCisKKwlzcGluX2xvY2tfYmgoJmJwLT5zcHFfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZXRoX3NwZSAqc3BlID0gKHN0cnVjdCBldGhfc3BlICopa3dxZXNbaV07CisKKwkJaWYgKGJwLT5jbmljX2t3cV9wZW5kaW5nID09IE1BWF9TUF9ERVNDX0NOVCkKKwkJCWJyZWFrOworCisJCSpicC0+Y25pY19rd3FfcHJvZCA9ICpzcGU7CisKKwkJYnAtPmNuaWNfa3dxX3BlbmRpbmcrKzsKKworCQlEUChORVRJRl9NU0dfVElNRVIsICJMNSBTUFFFICV4ICV4ICV4OiV4IHBvcyAlZFxuIiwKKwkJICAgc3BlLT5oZHIuY29ubl9hbmRfY21kX2RhdGEsIHNwZS0+aGRyLnR5cGUsCisJCSAgIHNwZS0+ZGF0YS5tYWNfY29uZmlnX2FkZHIuaGksCisJCSAgIHNwZS0+ZGF0YS5tYWNfY29uZmlnX2FkZHIubG8sCisJCSAgIGJwLT5jbmljX2t3cV9wZW5kaW5nKTsKKworCQlpZiAoYnAtPmNuaWNfa3dxX3Byb2QgPT0gYnAtPmNuaWNfa3dxX2xhc3QpCisJCQlicC0+Y25pY19rd3FfcHJvZCA9IGJwLT5jbmljX2t3cTsKKwkJZWxzZQorCQkJYnAtPmNuaWNfa3dxX3Byb2QrKzsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKKworCWlmIChicC0+Y25pY19zcHFfcGVuZGluZyA8IGJwLT5jbmljX2V0aF9kZXYubWF4X2t3cWVfcGVuZGluZykKKwkJYm54MnhfY25pY19zcF9wb3N0KGJwLCAwKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGJueDJ4X2NuaWNfY3RsX3NlbmQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGNuaWNfY3RsX2luZm8gKmN0bCkKK3sKKwlzdHJ1Y3QgY25pY19vcHMgKmNfb3BzOworCWludCByYyA9IDA7CisKKwltdXRleF9sb2NrKCZicC0+Y25pY19tdXRleCk7CisJY19vcHMgPSBicC0+Y25pY19vcHM7CisJaWYgKGNfb3BzKQorCQlyYyA9IGNfb3BzLT5jbmljX2N0bChicC0+Y25pY19kYXRhLCBjdGwpOworCW11dGV4X3VubG9jaygmYnAtPmNuaWNfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4X2NuaWNfY3RsX3NlbmRfYmgoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGNuaWNfY3RsX2luZm8gKmN0bCkKK3sKKwlzdHJ1Y3QgY25pY19vcHMgKmNfb3BzOworCWludCByYyA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJY19vcHMgPSByY3VfZGVyZWZlcmVuY2UoYnAtPmNuaWNfb3BzKTsKKwlpZiAoY19vcHMpCisJCXJjID0gY19vcHMtPmNuaWNfY3RsKGJwLT5jbmljX2RhdGEsIGN0bCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBmb3IgY29tbWFuZHMgdGhhdCBoYXZlIG5vIGRhdGEKKyAqLworaW50IGJueDJ4X2NuaWNfbm90aWZ5KHN0cnVjdCBibngyeCAqYnAsIGludCBjbWQpCit7CisJc3RydWN0IGNuaWNfY3RsX2luZm8gY3RsID0gezB9OworCisJY3RsLmNtZCA9IGNtZDsKKworCXJldHVybiBibngyeF9jbmljX2N0bF9zZW5kKGJwLCAmY3RsKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfY25pY19jZmNfY29tcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY2lkKQoreworCXN0cnVjdCBjbmljX2N0bF9pbmZvIGN0bDsKKworCS8qIGZpcnN0IHdlIHRlbGwgQ05JQyBhbmQgb25seSB0aGVuIHdlIGNvdW50IHRoaXMgYXMgYSBjb21wbGV0aW9uICovCisJY3RsLmNtZCA9IENOSUNfQ1RMX0NPTVBMRVRJT05fQ01EOworCWN0bC5kYXRhLmNvbXAuY2lkID0gY2lkOworCisJYm54MnhfY25pY19jdGxfc2VuZF9iaChicCwgJmN0bCk7CisJYm54MnhfY25pY19zcF9wb3N0KGJwLCAxKTsKK30KKworc3RhdGljIGludCBibngyeF9kcnZfY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkcnZfY3RsX2luZm8gKmN0bCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjdGwtPmNtZCkgeworCWNhc2UgRFJWX0NUTF9DVFhUQkxfV1JfQ01EOiB7CisJCXUzMiBpbmRleCA9IGN0bC0+ZGF0YS5pby5vZmZzZXQ7CisJCWRtYV9hZGRyX3QgYWRkciA9IGN0bC0+ZGF0YS5pby5kbWFfYWRkcjsKKworCQlibngyeF9pbHRfd3IoYnAsIGluZGV4LCBhZGRyKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBEUlZfQ1RMX0NPTVBMRVRJT05fQ01EOiB7CisJCWludCBjb3VudCA9IGN0bC0+ZGF0YS5jb21wLmNvbXBfY291bnQ7CisKKwkJYm54MnhfY25pY19zcF9wb3N0KGJwLCBjb3VudCk7CisJCWJyZWFrOworCX0KKworCS8qIHJ0bmxfbG9jayBpcyBoZWxkLiAgKi8KKwljYXNlIERSVl9DVExfU1RBUlRfTDJfQ01EOiB7CisJCXUzMiBjbGkgPSBjdGwtPmRhdGEucmluZy5jbGllbnRfaWQ7CisKKwkJYnAtPnJ4X21vZGVfY2xfbWFzayB8PSAoMSA8PCBjbGkpOworCQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7CisJCWJyZWFrOworCX0KKworCS8qIHJ0bmxfbG9jayBpcyBoZWxkLiAgKi8KKwljYXNlIERSVl9DVExfU1RPUF9MMl9DTUQ6IHsKKwkJdTMyIGNsaSA9IGN0bC0+ZGF0YS5yaW5nLmNsaWVudF9pZDsKKworCQlicC0+cnhfbW9kZV9jbF9tYXNrICY9IH4oMSA8PCBjbGkpOworCQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigidW5rbm93biBjb21tYW5kICV4XG4iLCBjdGwtPmNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgYm54Mnhfc2V0dXBfY25pY19pcnFfaW5mbyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBjbmljX2V0aF9kZXYgKmNwID0gJmJwLT5jbmljX2V0aF9kZXY7CisKKwlpZiAoYnAtPmZsYWdzICYgVVNJTkdfTVNJWF9GTEFHKSB7CisJCWNwLT5kcnZfc3RhdGUgfD0gQ05JQ19EUlZfU1RBVEVfVVNJTkdfTVNJWDsKKwkJY3AtPmlycV9hcnJbMF0uaXJxX2ZsYWdzIHw9IENOSUNfSVJRX0ZMX01TSVg7CisJCWNwLT5pcnFfYXJyWzBdLnZlY3RvciA9IGJwLT5tc2l4X3RhYmxlWzFdLnZlY3RvcjsKKwl9IGVsc2UgeworCQljcC0+ZHJ2X3N0YXRlICY9IH5DTklDX0RSVl9TVEFURV9VU0lOR19NU0lYOworCQljcC0+aXJxX2FyclswXS5pcnFfZmxhZ3MgJj0gfkNOSUNfSVJRX0ZMX01TSVg7CisJfQorCWNwLT5pcnFfYXJyWzBdLnN0YXR1c19ibGsgPSBicC0+Y25pY19zYjsKKwljcC0+aXJxX2FyclswXS5zdGF0dXNfYmxrX251bSA9IENOSUNfU0JfSUQoYnApOworCWNwLT5pcnFfYXJyWzFdLnN0YXR1c19ibGsgPSBicC0+ZGVmX3N0YXR1c19ibGs7CisJY3AtPmlycV9hcnJbMV0uc3RhdHVzX2Jsa19udW0gPSBERUZfU0JfSUQ7CisKKwljcC0+bnVtX2lycSA9IDI7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcmVnaXN0ZXJfY25pYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY25pY19vcHMgKm9wcywKKwkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbmljX2V0aF9kZXYgKmNwID0gJmJwLT5jbmljX2V0aF9kZXY7CisKKwlpZiAob3BzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGF0b21pY19yZWFkKCZicC0+aW50cl9zZW0pICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlicC0+Y25pY19rd3EgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicC0+Y25pY19rd3EpCisJCXJldHVybiAtRU5PTUVNOworCisJYnAtPmNuaWNfa3dxX2NvbnMgPSBicC0+Y25pY19rd3E7CisJYnAtPmNuaWNfa3dxX3Byb2QgPSBicC0+Y25pY19rd3E7CisJYnAtPmNuaWNfa3dxX2xhc3QgPSBicC0+Y25pY19rd3EgKyBNQVhfU1BfREVTQ19DTlQ7CisKKwlicC0+Y25pY19zcHFfcGVuZGluZyA9IDA7CisJYnAtPmNuaWNfa3dxX3BlbmRpbmcgPSAwOworCisJYnAtPmNuaWNfZGF0YSA9IGRhdGE7CisKKwljcC0+bnVtX2lycSA9IDA7CisJY3AtPmRydl9zdGF0ZSA9IENOSUNfRFJWX1NUQVRFX1JFR0Q7CisKKwlibngyeF9pbml0X3NiKGJwLCBicC0+Y25pY19zYiwgYnAtPmNuaWNfc2JfbWFwcGluZywgQ05JQ19TQl9JRChicCkpOworCisJYm54Mnhfc2V0dXBfY25pY19pcnFfaW5mbyhicCk7CisJYm54Mnhfc2V0X2lzY3NpX2V0aF9tYWNfYWRkcihicCwgMSk7CisJYnAtPmNuaWNfZmxhZ3MgfD0gQk5YMlhfQ05JQ19GTEFHX01BQ19TRVQ7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGJwLT5jbmljX29wcywgb3BzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJueDJ4X3VucmVnaXN0ZXJfY25pYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbmljX2V0aF9kZXYgKmNwID0gJmJwLT5jbmljX2V0aF9kZXY7CisKKwltdXRleF9sb2NrKCZicC0+Y25pY19tdXRleCk7CisJaWYgKGJwLT5jbmljX2ZsYWdzICYgQk5YMlhfQ05JQ19GTEFHX01BQ19TRVQpIHsKKwkJYnAtPmNuaWNfZmxhZ3MgJj0gfkJOWDJYX0NOSUNfRkxBR19NQUNfU0VUOworCQlibngyeF9zZXRfaXNjc2lfZXRoX21hY19hZGRyKGJwLCAwKTsKKwl9CisJY3AtPmRydl9zdGF0ZSA9IDA7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGJwLT5jbmljX29wcywgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZicC0+Y25pY19tdXRleCk7CisJc3luY2hyb25pemVfcmN1KCk7CisJa2ZyZWUoYnAtPmNuaWNfa3dxKTsKKwlicC0+Y25pY19rd3EgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjbmljX2V0aF9kZXYgKmJueDJ4X2NuaWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgY25pY19ldGhfZGV2ICpjcCA9ICZicC0+Y25pY19ldGhfZGV2OworCisJY3AtPmRydl9vd25lciA9IFRISVNfTU9EVUxFOworCWNwLT5jaGlwX2lkID0gQ0hJUF9JRChicCk7CisJY3AtPnBkZXYgPSBicC0+cGRldjsKKwljcC0+aW9fYmFzZSA9IGJwLT5yZWd2aWV3OworCWNwLT5pb19iYXNlMiA9IGJwLT5kb29yYmVsbHM7CisJY3AtPm1heF9rd3FlX3BlbmRpbmcgPSA4OworCWNwLT5jdHhfYmxrX3NpemUgPSBDTklDX0NUWF9QRVJfSUxUICogc2l6ZW9mKHVuaW9uIGNkdV9jb250ZXh0KTsKKwljcC0+Y3R4X3RibF9vZmZzZXQgPSBGVU5DX0lMVF9CQVNFKEJQX0ZVTkMoYnApKSArIDE7CisJY3AtPmN0eF90YmxfbGVuID0gQ05JQ19JTFRfTElORVM7CisJY3AtPnN0YXJ0aW5nX2NpZCA9IEJDTV9DTklDX0NJRF9TVEFSVDsKKwljcC0+ZHJ2X3N1Ym1pdF9rd3Flc18xNiA9IGJueDJ4X2NuaWNfc3BfcXVldWU7CisJY3AtPmRydl9jdGwgPSBibngyeF9kcnZfY3RsOworCWNwLT5kcnZfcmVnaXN0ZXJfY25pYyA9IGJueDJ4X3JlZ2lzdGVyX2NuaWM7CisJY3AtPmRydl91bnJlZ2lzdGVyX2NuaWMgPSBibngyeF91bnJlZ2lzdGVyX2NuaWM7CisKKwlyZXR1cm4gY3A7Cit9CitFWFBPUlRfU1lNQk9MKGJueDJ4X2NuaWNfcHJvYmUpOworCisjZW5kaWYgLyogQkNNX0NOSUMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MnhfcmVnLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9yZWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9uZXQvYm54MnhfcmVnLmgKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3JlZy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zdGF0cy5jIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ3MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuYwpAQCAtMCwwICsxLDE0MTEgQEAKKy8qIGJueDJ4X3N0YXRzLmM6IEJyb2FkY29tIEV2ZXJlc3QgbmV0d29yayBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KKyAqIFdyaXR0ZW4gYnk6IEVsaWV6ZXIgVGFtaXIKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNaWNoYWVsIENoYW4ncyBibngyIGRyaXZlcgorICogVURQIENTVU0gZXJyYXRhIHdvcmthcm91bmQgYnkgQXJpayBHZW5kZWxtYW4KKyAqIFNsb3dwYXRoIGFuZCBmYXN0cGF0aCByZXdvcmsgYnkgVmxhZGlzbGF2IFpvbG90YXJvdgorICogU3RhdGlzdGljcyBhbmQgTGluayBtYW5hZ2VtZW50IGJ5IFlpdGNoYWsgR2VydG5lcgorICoKKyAqLworICNpbmNsdWRlICJibngyeF9jbW4uaCIKKyAjaW5jbHVkZSAiYm54Mnhfc3RhdHMuaCIKKworLyogU3RhdGlzdGljcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBNYWNyb3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN1bVtoaTpsb10gKz0gYWRkW2hpOmxvXSAqLworI2RlZmluZSBBRERfNjQoc19oaSwgYV9oaSwgc19sbywgYV9sbykgXAorCWRvIHsgXAorCQlzX2xvICs9IGFfbG87IFwKKwkJc19oaSArPSBhX2hpICsgKChzX2xvIDwgYV9sbykgPyAxIDogMCk7IFwKKwl9IHdoaWxlICgwKQorCisvKiBkaWZmZXJlbmNlID0gbWludWVuZCAtIHN1YnRyYWhlbmQgKi8KKyNkZWZpbmUgRElGRl82NChkX2hpLCBtX2hpLCBzX2hpLCBkX2xvLCBtX2xvLCBzX2xvKSBcCisJZG8geyBcCisJCWlmIChtX2xvIDwgc19sbykgeyBcCisJCQkvKiB1bmRlcmZsb3cgKi8gXAorCQkJZF9oaSA9IG1faGkgLSBzX2hpOyBcCisJCQlpZiAoZF9oaSA+IDApIHsgXAorCQkJCS8qIHdlIGNhbiAnbG9hbicgMSAqLyBcCisJCQkJZF9oaS0tOyBcCisJCQkJZF9sbyA9IG1fbG8gKyAoVUlOVF9NQVggLSBzX2xvKSArIDE7IFwKKwkJCX0gZWxzZSB7IFwKKwkJCQkvKiBtX2hpIDw9IHNfaGkgKi8gXAorCQkJCWRfaGkgPSAwOyBcCisJCQkJZF9sbyA9IDA7IFwKKwkJCX0gXAorCQl9IGVsc2UgeyBcCisJCQkvKiBtX2xvID49IHNfbG8gKi8gXAorCQkJaWYgKG1faGkgPCBzX2hpKSB7IFwKKwkJCQlkX2hpID0gMDsgXAorCQkJCWRfbG8gPSAwOyBcCisJCQl9IGVsc2UgeyBcCisJCQkJLyogbV9oaSA+PSBzX2hpICovIFwKKwkJCQlkX2hpID0gbV9oaSAtIHNfaGk7IFwKKwkJCQlkX2xvID0gbV9sbyAtIHNfbG87IFwKKwkJCX0gXAorCQl9IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVQREFURV9TVEFUNjQocywgdCkgXAorCWRvIHsgXAorCQlESUZGXzY0KGRpZmYuaGksIG5ldy0+cyMjX2hpLCBwc3RhdHMtPm1hY19zdHhbMF0udCMjX2hpLCBcCisJCQlkaWZmLmxvLCBuZXctPnMjI19sbywgcHN0YXRzLT5tYWNfc3R4WzBdLnQjI19sbyk7IFwKKwkJcHN0YXRzLT5tYWNfc3R4WzBdLnQjI19oaSA9IG5ldy0+cyMjX2hpOyBcCisJCXBzdGF0cy0+bWFjX3N0eFswXS50IyNfbG8gPSBuZXctPnMjI19sbzsgXAorCQlBRERfNjQocHN0YXRzLT5tYWNfc3R4WzFdLnQjI19oaSwgZGlmZi5oaSwgXAorCQkgICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnQjI19sbywgZGlmZi5sbyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVQREFURV9TVEFUNjRfTklHKHMsIHQpIFwKKwlkbyB7IFwKKwkJRElGRl82NChkaWZmLmhpLCBuZXctPnMjI19oaSwgb2xkLT5zIyNfaGksIFwKKwkJCWRpZmYubG8sIG5ldy0+cyMjX2xvLCBvbGQtPnMjI19sbyk7IFwKKwkJQUREXzY0KGVzdGF0cy0+dCMjX2hpLCBkaWZmLmhpLCBcCisJCSAgICAgICBlc3RhdHMtPnQjI19sbywgZGlmZi5sbyk7IFwKKwl9IHdoaWxlICgwKQorCisvKiBzdW1baGk6bG9dICs9IGFkZCAqLworI2RlZmluZSBBRERfRVhURU5EXzY0KHNfaGksIHNfbG8sIGEpIFwKKwlkbyB7IFwKKwkJc19sbyArPSBhOyBcCisJCXNfaGkgKz0gKHNfbG8gPCBhKSA/IDEgOiAwOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUERBVEVfRVhURU5EX1NUQVQocykgXAorCWRvIHsgXAorCQlBRERfRVhURU5EXzY0KHBzdGF0cy0+bWFjX3N0eFsxXS5zIyNfaGksIFwKKwkJCSAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS5zIyNfbG8sIFwKKwkJCSAgICAgIG5ldy0+cyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVQREFURV9FWFRFTkRfVFNUQVQocywgdCkgXAorCWRvIHsgXAorCQlkaWZmID0gbGUzMl90b19jcHUodGNsaWVudC0+cykgLSBsZTMyX3RvX2NwdShvbGRfdGNsaWVudC0+cyk7IFwKKwkJb2xkX3RjbGllbnQtPnMgPSB0Y2xpZW50LT5zOyBcCisJCUFERF9FWFRFTkRfNjQocXN0YXRzLT50IyNfaGksIHFzdGF0cy0+dCMjX2xvLCBkaWZmKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVVBEQVRFX0VYVEVORF9VU1RBVChzLCB0KSBcCisJZG8geyBcCisJCWRpZmYgPSBsZTMyX3RvX2NwdSh1Y2xpZW50LT5zKSAtIGxlMzJfdG9fY3B1KG9sZF91Y2xpZW50LT5zKTsgXAorCQlvbGRfdWNsaWVudC0+cyA9IHVjbGllbnQtPnM7IFwKKwkJQUREX0VYVEVORF82NChxc3RhdHMtPnQjI19oaSwgcXN0YXRzLT50IyNfbG8sIGRpZmYpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUERBVEVfRVhURU5EX1hTVEFUKHMsIHQpIFwKKwlkbyB7IFwKKwkJZGlmZiA9IGxlMzJfdG9fY3B1KHhjbGllbnQtPnMpIC0gbGUzMl90b19jcHUob2xkX3hjbGllbnQtPnMpOyBcCisJCW9sZF94Y2xpZW50LT5zID0geGNsaWVudC0+czsgXAorCQlBRERfRVhURU5EXzY0KHFzdGF0cy0+dCMjX2hpLCBxc3RhdHMtPnQjI19sbywgZGlmZik7IFwKKwl9IHdoaWxlICgwKQorCisvKiBtaW51ZW5kIC09IHN1YnRyYWhlbmQgKi8KKyNkZWZpbmUgU1VCXzY0KG1faGksIHNfaGksIG1fbG8sIHNfbG8pIFwKKwlkbyB7IFwKKwkJRElGRl82NChtX2hpLCBtX2hpLCBzX2hpLCBtX2xvLCBtX2xvLCBzX2xvKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIG1pbnVlbmRbaGk6bG9dIC09IHN1YnRyYWhlbmQgKi8KKyNkZWZpbmUgU1VCX0VYVEVORF82NChtX2hpLCBtX2xvLCBzKSBcCisJZG8geyBcCisJCVNVQl82NChtX2hpLCAwLCBtX2xvLCBzKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU1VCX0VYVEVORF9VU1RBVChzLCB0KSBcCisJZG8geyBcCisJCWRpZmYgPSBsZTMyX3RvX2NwdSh1Y2xpZW50LT5zKSAtIGxlMzJfdG9fY3B1KG9sZF91Y2xpZW50LT5zKTsgXAorCQlTVUJfRVhURU5EXzY0KHFzdGF0cy0+dCMjX2hpLCBxc3RhdHMtPnQjI19sbywgZGlmZik7IFwKKwl9IHdoaWxlICgwKQorCisvKgorICogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBibngyeF9oaWxvKHUzMiAqaGlyZWYpCit7CisJdTMyIGxvID0gKihoaXJlZiArIDEpOworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQorCXUzMiBoaSA9ICpoaXJlZjsKKworCXJldHVybiBISUxPX1U2NChoaSwgbG8pOworI2Vsc2UKKwlyZXR1cm4gbG87CisjZW5kaWYKK30KKworLyoKKyAqIEluaXQgc2VydmljZSBmdW5jdGlvbnMKKyAqLworCisKK3N0YXRpYyB2b2lkIGJueDJ4X3N0b3JtX3N0YXRzX3Bvc3Qoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpZiAoIWJwLT5zdGF0c19wZW5kaW5nKSB7CisJCXN0cnVjdCBldGhfcXVlcnlfcmFtcm9kX2RhdGEgcmFtcm9kX2RhdGEgPSB7MH07CisJCWludCBpLCByYzsKKworCQlzcGluX2xvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKKworCQlyYW1yb2RfZGF0YS5kcnZfY291bnRlciA9IGJwLT5zdGF0c19jb3VudGVyKys7CisJCXJhbXJvZF9kYXRhLmNvbGxlY3RfcG9ydCA9IGJwLT5wb3J0LnBtZiA/IDEgOiAwOworCQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJCXJhbXJvZF9kYXRhLmN0cl9pZF92ZWN0b3IgfD0gKDEgPDwgYnAtPmZwW2ldLmNsX2lkKTsKKworCQlyYyA9IGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1NUQVRfUVVFUlksIDAsCisJCQkJICAgKCh1MzIgKikmcmFtcm9kX2RhdGEpWzFdLAorCQkJCSAgICgodTMyICopJnJhbXJvZF9kYXRhKVswXSwgMCk7CisJCWlmIChyYyA9PSAwKSB7CisJCQkvKiBzdGF0cyByYW1yb2QgaGFzIGl0J3Mgb3duIHNsb3Qgb24gdGhlIHNwcSAqLworCQkJYnAtPnNwcV9sZWZ0Kys7CisJCQlicC0+c3RhdHNfcGVuZGluZyA9IDE7CisJCX0KKworCQlzcGluX3VubG9ja19iaCgmYnAtPnN0YXRzX2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgYm54MnhfaHdfc3RhdHNfcG9zdChzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPnN0YXRzX2RtYWU7CisJdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOworCisJKnN0YXRzX2NvbXAgPSBETUFFX0NPTVBfVkFMOworCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKKwkJcmV0dXJuOworCisJLyogbG9hZGVyICovCisJaWYgKGJwLT5leGVjdXRlcl9pZHgpIHsKKwkJaW50IGxvYWRlcl9pZHggPSBQTUZfRE1BRV9DKGJwKTsKKworCQltZW1zZXQoZG1hZSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpKTsKKworCQlkbWFlLT5vcGNvZGUgPSAoRE1BRV9DTURfU1JDX1BDSSB8IERNQUVfQ01EX0RTVF9HUkMgfAorCQkJCURNQUVfQ01EX0NfRFNUX0dSQyB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJCQlETUFFX0NNRF9EU1RfUkVTRVQgfAorI2lmZGVmIF9fQklHX0VORElBTgorCQkJCURNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAorI2Vsc2UKKwkJCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJCQkoQlBfUE9SVChicCkgPyBETUFFX0NNRF9QT1JUXzEgOgorCQkJCQkgICAgICAgRE1BRV9DTURfUE9SVF8wKSB8CisJCQkJKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOworCQlkbWFlLT5zcmNfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBkbWFlWzBdKSk7CisJCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIGRtYWVbMF0pKTsKKwkJZG1hZS0+ZHN0X2FkZHJfbG8gPSAoRE1BRV9SRUdfQ01EX01FTSArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkgKgorCQkJCSAgICAgKGxvYWRlcl9pZHggKyAxKSkgPj4gMjsKKwkJZG1hZS0+ZHN0X2FkZHJfaGkgPSAwOworCQlkbWFlLT5sZW4gPSBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkgPj4gMjsKKwkJaWYgKENISVBfSVNfRTEoYnApKQorCQkJZG1hZS0+bGVuLS07CisJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeCArIDFdID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CisJCWRtYWUtPmNvbXBfdmFsID0gMTsKKworCQkqc3RhdHNfY29tcCA9IDA7CisJCWJueDJ4X3Bvc3RfZG1hZShicCwgZG1hZSwgbG9hZGVyX2lkeCk7CisKKwl9IGVsc2UgaWYgKGJwLT5mdW5jX3N0eCkgeworCQkqc3RhdHNfY29tcCA9IDA7CisJCWJueDJ4X3Bvc3RfZG1hZShicCwgZG1hZSwgSU5JVF9ETUFFX0MoYnApKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc3RhdHNfY29tcChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKKwlpbnQgY250ID0gMTA7CisKKwltaWdodF9zbGVlcCgpOworCXdoaWxlICgqc3RhdHNfY29tcCAhPSBETUFFX0NPTVBfVkFMKSB7CisJCWlmICghY250KSB7CisJCQlCTlgyWF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3Igc3RhdHMgZmluaXNoZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJY250LS07CisJCW1zbGVlcCgxKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTdGF0aXN0aWNzIHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfcG1mX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWU7CisJdTMyIG9wY29kZTsKKwlpbnQgbG9hZGVyX2lkeCA9IFBNRl9ETUFFX0MoYnApOworCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKKworCS8qIHNhbml0eSAqLworCWlmICghSVNfRTFITUYoYnApIHx8ICFicC0+cG9ydC5wbWYgfHwgIWJwLT5wb3J0LnBvcnRfc3R4KSB7CisJCUJOWDJYX0VSUigiQlVHIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlicC0+ZXhlY3V0ZXJfaWR4ID0gMDsKKworCW9wY29kZSA9IChETUFFX0NNRF9TUkNfR1JDIHwgRE1BRV9DTURfRFNUX1BDSSB8CisJCSAgRE1BRV9DTURfQ19FTkFCTEUgfAorCQkgIERNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCSAgRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8CisjZWxzZQorCQkgIERNQUVfQ01EX0VORElBTklUWV9EV19TV0FQIHwKKyNlbmRpZgorCQkgIChCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAorCQkgIChCUF9FMUhWTihicCkgPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKKworCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKKwlkbWFlLT5vcGNvZGUgPSAob3Bjb2RlIHwgRE1BRV9DTURfQ19EU1RfR1JDKTsKKwlkbWFlLT5zcmNfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7CisJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKKwlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBwb3J0X3N0YXRzKSk7CisJZG1hZS0+bGVuID0gRE1BRV9MRU4zMl9SRF9NQVg7CisJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOworCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CisJZG1hZS0+Y29tcF92YWwgPSAxOworCisJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCWRtYWUtPm9wY29kZSA9IChvcGNvZGUgfCBETUFFX0NNRF9DX0RTVF9QQ0kpOworCWRtYWUtPnNyY19hZGRyX2xvID0gKGJwLT5wb3J0LnBvcnRfc3R4ID4+IDIpICsgRE1BRV9MRU4zMl9SRF9NQVg7CisJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpICsKKwkJCQkgICBETUFFX0xFTjMyX1JEX01BWCAqIDQpOworCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpICsKKwkJCQkgICBETUFFX0xFTjMyX1JEX01BWCAqIDQpOworCWRtYWUtPmxlbiA9IChzaXplb2Yoc3RydWN0IGhvc3RfcG9ydF9zdGF0cykgPj4gMikgLSBETUFFX0xFTjMyX1JEX01BWDsKKwlkbWFlLT5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOworCWRtYWUtPmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CisJZG1hZS0+Y29tcF92YWwgPSBETUFFX0NPTVBfVkFMOworCisJKnN0YXRzX2NvbXAgPSAwOworCWJueDJ4X2h3X3N0YXRzX3Bvc3QoYnApOworCWJueDJ4X3N0YXRzX2NvbXAoYnApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9wb3J0X3N0YXRzX2luaXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgZG1hZV9jb21tYW5kICpkbWFlOworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IHZuID0gQlBfRTFIVk4oYnApOworCXUzMiBvcGNvZGU7CisJaW50IGxvYWRlcl9pZHggPSBQTUZfRE1BRV9DKGJwKTsKKwl1MzIgbWFjX2FkZHI7CisJdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOworCisJLyogc2FuaXR5ICovCisJaWYgKCFicC0+bGlua192YXJzLmxpbmtfdXAgfHwgIWJwLT5wb3J0LnBtZikgeworCQlCTlgyWF9FUlIoIkJVRyFcbiIpOworCQlyZXR1cm47CisJfQorCisJYnAtPmV4ZWN1dGVyX2lkeCA9IDA7CisKKwkvKiBNQ1AgKi8KKwlvcGNvZGUgPSAoRE1BRV9DTURfU1JDX1BDSSB8IERNQUVfQ01EX0RTVF9HUkMgfAorCQkgIERNQUVfQ01EX0NfRFNUX0dSQyB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJICBETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAorI2lmZGVmIF9fQklHX0VORElBTgorCQkgIERNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAorI2Vsc2UKKwkJICBETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJICAocG9ydCA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAorCQkgICh2biA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOworCisJaWYgKGJwLT5wb3J0LnBvcnRfc3R4KSB7CisKKwkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7CisJCWRtYWUtPnNyY19hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgcG9ydF9zdGF0cykpOworCQlkbWFlLT5kc3RfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7CisJCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKKwkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+Y29tcF92YWwgPSAxOworCX0KKworCWlmIChicC0+ZnVuY19zdHgpIHsKKworCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7CisJCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKKwkJZG1hZS0+c3JjX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgZnVuY19zdGF0cykpOworCQlkbWFlLT5zcmNfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzKSk7CisJCWRtYWUtPmRzdF9hZGRyX2xvID0gYnAtPmZ1bmNfc3R4ID4+IDI7CisJCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKKwkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+Y29tcF92YWwgPSAxOworCX0KKworCS8qIE1BQyAqLworCW9wY29kZSA9IChETUFFX0NNRF9TUkNfR1JDIHwgRE1BRV9DTURfRFNUX1BDSSB8CisJCSAgRE1BRV9DTURfQ19EU1RfR1JDIHwgRE1BRV9DTURfQ19FTkFCTEUgfAorCQkgIERNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCSAgRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8CisjZWxzZQorCQkgIERNQUVfQ01EX0VORElBTklUWV9EV19TV0FQIHwKKyNlbmRpZgorCQkgIChwb3J0ID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8CisJCSAgKHZuIDw8IERNQUVfQ01EX0UxSFZOX1NISUZUKSk7CisKKwlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9CTUFDKSB7CisKKwkJbWFjX2FkZHIgPSAocG9ydCA/IE5JR19SRUdfSU5HUkVTU19CTUFDMV9NRU0gOgorCQkJCSAgIE5JR19SRUdfSU5HUkVTU19CTUFDMF9NRU0pOworCisJCS8qIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUUEtUIC4uCisJCSAgIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUQllUICovCisJCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKKwkJZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOworCQlkbWFlLT5zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCisJCQkJICAgICBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCkgPj4gMjsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpKTsKKwkJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7CisJCWRtYWUtPmxlbiA9ICg4ICsgQklHTUFDX1JFR0lTVEVSX1RYX1NUQVRfR1RCWVQgLQorCQkJICAgICBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCkgPj4gMjsKKwkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOworCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCQlkbWFlLT5jb21wX3ZhbCA9IDE7CisKKwkJLyogQklHTUFDX1JFR0lTVEVSX1JYX1NUQVRfR1I2NCAuLgorCQkgICBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUklQSiAqLworCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7CisJCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKKwkJZG1hZS0+c3JjX2FkZHJfbG8gPSAobWFjX2FkZHIgKworCQkJCSAgICAgQklHTUFDX1JFR0lTVEVSX1JYX1NUQVRfR1I2NCkgPj4gMjsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3QgYm1hY19zdGF0cywgcnhfc3RhdF9ncjY0X2xvKSk7CisJCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKworCQkJCW9mZnNldG9mKHN0cnVjdCBibWFjX3N0YXRzLCByeF9zdGF0X2dyNjRfbG8pKTsKKwkJZG1hZS0+bGVuID0gKDggKyBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUklQSiAtCisJCQkgICAgIEJJR01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSNjQpID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKKwkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+Y29tcF92YWwgPSAxOworCisJfSBlbHNlIGlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0VNQUMpIHsKKworCQltYWNfYWRkciA9IChwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzApOworCisJCS8qIEVNQUNfUkVHX0VNQUNfUlhfU1RBVF9BQyAoRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDX0NPVU5UKSovCisJCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKKwkJZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOworCQlkbWFlLT5zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCisJCQkJICAgICBFTUFDX1JFR19FTUFDX1JYX1NUQVRfQUMpID4+IDI7CisJCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKKwkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7CisJCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykpOworCQlkbWFlLT5sZW4gPSBFTUFDX1JFR19FTUFDX1JYX1NUQVRfQUNfQ09VTlQ7CisJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKKwkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+Y29tcF92YWwgPSAxOworCisJCS8qIEVNQUNfUkVHX0VNQUNfUlhfU1RBVF9BQ18yOCAqLworCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7CisJCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKKwkJZG1hZS0+c3JjX2FkZHJfbG8gPSAobWFjX2FkZHIgKworCQkJCSAgICAgRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDXzI4KSA+PiAyOworCQlkbWFlLT5zcmNfYWRkcl9oaSA9IDA7CisJCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKworCQkgICAgIG9mZnNldG9mKHN0cnVjdCBlbWFjX3N0YXRzLCByeF9zdGF0X2ZhbHNlY2FycmllcmVycm9ycykpOworCQlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgZW1hY19zdGF0cywgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnMpKTsKKwkJZG1hZS0+bGVuID0gMTsKKwkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOworCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCQlkbWFlLT5jb21wX3ZhbCA9IDE7CisKKwkJLyogRU1BQ19SRUdfRU1BQ19UWF9TVEFUX0FDIChFTUFDX1JFR19FTUFDX1RYX1NUQVRfQUNfQ09VTlQpKi8KKwkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7CisJCWRtYWUtPnNyY19hZGRyX2xvID0gKG1hY19hZGRyICsKKwkJCQkgICAgIEVNQUNfUkVHX0VNQUNfVFhfU1RBVF9BQykgPj4gMjsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKKwkJCW9mZnNldG9mKHN0cnVjdCBlbWFjX3N0YXRzLCB0eF9zdGF0X2lmaGNvdXRvY3RldHMpKTsKKwkJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSArCisJCQlvZmZzZXRvZihzdHJ1Y3QgZW1hY19zdGF0cywgdHhfc3RhdF9pZmhjb3V0b2N0ZXRzKSk7CisJCWRtYWUtPmxlbiA9IEVNQUNfUkVHX0VNQUNfVFhfU1RBVF9BQ19DT1VOVDsKKwkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOworCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCQlkbWFlLT5jb21wX3ZhbCA9IDE7CisJfQorCisJLyogTklHICovCisJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKKwlkbWFlLT5zcmNfYWRkcl9sbyA9IChwb3J0ID8gTklHX1JFR19TVEFUMV9CUkJfRElTQ0FSRCA6CisJCQkJICAgIE5JR19SRUdfU1RBVDBfQlJCX0RJU0NBUkQpID4+IDI7CisJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykpOworCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykpOworCWRtYWUtPmxlbiA9IChzaXplb2Yoc3RydWN0IG5pZ19zdGF0cykgLSA0KnNpemVvZih1MzIpKSA+PiAyOworCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKKwlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCWRtYWUtPmNvbXBfdmFsID0gMTsKKworCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKKwlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7CisJZG1hZS0+c3JjX2FkZHJfbG8gPSAocG9ydCA/IE5JR19SRUdfU1RBVDFfRUdSRVNTX01BQ19QS1QwIDoKKwkJCQkgICAgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDApID4+IDI7CisJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykgKworCQkJb2Zmc2V0b2Yoc3RydWN0IG5pZ19zdGF0cywgZWdyZXNzX21hY19wa3QwX2xvKSk7CisJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCisJCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDBfbG8pKTsKKwlkbWFlLT5sZW4gPSAoMipzaXplb2YodTMyKSkgPj4gMjsKKwlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7CisJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKKwlkbWFlLT5jb21wX3ZhbCA9IDE7CisKKwlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7CisJZG1hZS0+b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19HUkMgfCBETUFFX0NNRF9EU1RfUENJIHwKKwkJCURNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJCURNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJCShwb3J0ID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8CisJCQkodm4gPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKKwlkbWFlLT5zcmNfYWRkcl9sbyA9IChwb3J0ID8gTklHX1JFR19TVEFUMV9FR1JFU1NfTUFDX1BLVDEgOgorCQkJCSAgICBOSUdfUkVHX1NUQVQwX0VHUkVTU19NQUNfUEtUMSkgPj4gMjsKKwlkbWFlLT5zcmNfYWRkcl9oaSA9IDA7CisJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCisJCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDFfbG8pKTsKKwlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBuaWdfc3RhdHMpICsKKwkJCW9mZnNldG9mKHN0cnVjdCBuaWdfc3RhdHMsIGVncmVzc19tYWNfcGt0MV9sbykpOworCWRtYWUtPmxlbiA9ICgyKnNpemVvZih1MzIpKSA+PiAyOworCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CisJZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKKwlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7CisKKwkqc3RhdHNfY29tcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2Z1bmNfc3RhdHNfaW5pdChzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPnN0YXRzX2RtYWU7CisJdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOworCisJLyogc2FuaXR5ICovCisJaWYgKCFicC0+ZnVuY19zdHgpIHsKKwkJQk5YMlhfRVJSKCJCVUchXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJwLT5leGVjdXRlcl9pZHggPSAwOworCW1lbXNldChkbWFlLCAwLCBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkpOworCisJZG1hZS0+b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19QQ0kgfCBETUFFX0NNRF9EU1RfR1JDIHwKKwkJCURNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJCURNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJCShCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAorCQkJKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOworCWRtYWUtPnNyY19hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ1bmNfc3RhdHMpKTsKKwlkbWFlLT5zcmNfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzKSk7CisJZG1hZS0+ZHN0X2FkZHJfbG8gPSBicC0+ZnVuY19zdHggPj4gMjsKKwlkbWFlLT5kc3RfYWRkcl9oaSA9IDA7CisJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpID4+IDI7CisJZG1hZS0+Y29tcF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKKwlkbWFlLT5jb21wX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOworCWRtYWUtPmNvbXBfdmFsID0gRE1BRV9DT01QX1ZBTDsKKworCSpzdGF0c19jb21wID0gMDsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfc3RhcnQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpZiAoYnAtPnBvcnQucG1mKQorCQlibngyeF9wb3J0X3N0YXRzX2luaXQoYnApOworCisJZWxzZSBpZiAoYnAtPmZ1bmNfc3R4KQorCQlibngyeF9mdW5jX3N0YXRzX2luaXQoYnApOworCisJYm54MnhfaHdfc3RhdHNfcG9zdChicCk7CisJYm54Mnhfc3Rvcm1fc3RhdHNfcG9zdChicCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX3BtZl9zdGFydChzdHJ1Y3QgYm54MnggKmJwKQoreworCWJueDJ4X3N0YXRzX2NvbXAoYnApOworCWJueDJ4X3N0YXRzX3BtZl91cGRhdGUoYnApOworCWJueDJ4X3N0YXRzX3N0YXJ0KGJwKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfcmVzdGFydChzdHJ1Y3QgYm54MnggKmJwKQoreworCWJueDJ4X3N0YXRzX2NvbXAoYnApOworCWJueDJ4X3N0YXRzX3N0YXJ0KGJwKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfYm1hY19zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgYm1hY19zdGF0cyAqbmV3ID0gYm54Mnhfc3AoYnAsIG1hY19zdGF0cy5ibWFjX3N0YXRzKTsKKwlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzICpwc3RhdHMgPSBibngyeF9zcChicCwgcG9ydF9zdGF0cyk7CisJc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gJmJwLT5ldGhfc3RhdHM7CisJc3RydWN0IHsKKwkJdTMyIGxvOworCQl1MzIgaGk7CisJfSBkaWZmOworCisJVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyZXJiLCByeF9zdGF0X2lmaGNpbmJhZG9jdGV0cyk7CisJVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyZmNzLCByeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9ycyk7CisJVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dydW5kLCByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzKTsKKwlVUERBVEVfU1RBVDY0KHJ4X3N0YXRfZ3JvdnIsIHJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZyk7CisJVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyZnJnLCByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHMpOworCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncmpiciwgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVycyk7CisJVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyeGNmLCByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZCk7CisJVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyeHBmLCByeF9zdGF0X3hvZmZzdGF0ZWVudGVyZWQpOworCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhwZiwgcnhfc3RhdF9ibWFjX3hwZik7CisJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0eHBmLCB0eF9zdGF0X291dHhvZmZzZW50KTsKKwlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3R4cGYsIHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lKTsKKwlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q2NCwgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzKTsKKwlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3QxMjcsCisJCQkJdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHMpOworCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDI1NSwKKwkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTI4b2N0ZXRzdG8yNTVvY3RldHMpOworCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDUxMSwKKwkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHMpOworCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDEwMjMsCisJCQkJdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0cyk7CisJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MTUxOCwKKwkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0cyk7CisJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MjA0NywgdHhfc3RhdF9ibWFjXzIwNDcpOworCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDQwOTUsIHR4X3N0YXRfYm1hY180MDk1KTsKKwlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q5MjE2LCB0eF9zdGF0X2JtYWNfOTIxNik7CisJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MTYzODMsIHR4X3N0YXRfYm1hY18xNjM4Myk7CisJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0ZXJyLAorCQkJCXR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9ycyk7CisJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0dWZsLCB0eF9zdGF0X2JtYWNfdWZsKTsKKworCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpID0KKwkJCQlwc3RhdHMtPm1hY19zdHhbMV0ucnhfc3RhdF9ibWFjX3hwZl9oaTsKKwllc3RhdHMtPnBhdXNlX2ZyYW1lc19yZWNlaXZlZF9sbyA9CisJCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnJ4X3N0YXRfYm1hY194cGZfbG87CisKKwllc3RhdHMtPnBhdXNlX2ZyYW1lc19zZW50X2hpID0KKwkJCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b2Zmc2VudF9oaTsKKwllc3RhdHMtPnBhdXNlX2ZyYW1lc19zZW50X2xvID0KKwkJCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b2Zmc2VudF9sbzsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZW1hY19zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgZW1hY19zdGF0cyAqbmV3ID0gYm54Mnhfc3AoYnAsIG1hY19zdGF0cy5lbWFjX3N0YXRzKTsKKwlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzICpwc3RhdHMgPSBibngyeF9zcChicCwgcG9ydF9zdGF0cyk7CisJc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gJmJwLT5ldGhfc3RhdHM7CisKKwlVUERBVEVfRVhURU5EX1NUQVQocnhfc3RhdF9pZmhjaW5iYWRvY3RldHMpOworCVVQREFURV9FWFRFTkRfU1RBVCh0eF9zdGF0X2lmaGNvdXRiYWRvY3RldHMpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9ycyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHJ4X3N0YXRfZG90M3N0YXRzYWxpZ25tZW50ZXJyb3JzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQocnhfc3RhdF9kb3Qzc3RhdHNjYXJyaWVyc2Vuc2VlcnJvcnMpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2ZhbHNlY2FycmllcmVycm9ycyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHMpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmcpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHMpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2V0aGVyc3RhdHNqYWJiZXJzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQocnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWQpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X3hvZmZzdGF0ZWVudGVyZWQpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWQpOworCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9vdXR4b25zZW50KTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9vdXR4b2Zmc2VudCk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzY29sbGlzaW9ucyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZG90M3N0YXRzc2luZ2xlY29sbGlzaW9uZnJhbWVzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lcyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNleGNlc3NpdmVjb2xsaXNpb25zKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9ucyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NG9jdGV0cyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NW9jdGV0c3RvMTI3b2N0ZXRzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0cyk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzKTsKKwlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzKTsKKworCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpID0KKwkJCXBzdGF0cy0+bWFjX3N0eFsxXS5yeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWRfaGk7CisJZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfbG8gPQorCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnJ4X3N0YXRfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZF9sbzsKKwlBRERfNjQoZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfaGksCisJICAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS5yeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkX2hpLAorCSAgICAgICBlc3RhdHMtPnBhdXNlX2ZyYW1lc19yZWNlaXZlZF9sbywKKwkgICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWRfbG8pOworCisJZXN0YXRzLT5wYXVzZV9mcmFtZXNfc2VudF9oaSA9CisJCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b25zZW50X2hpOworCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3NlbnRfbG8gPQorCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnR4X3N0YXRfb3V0eG9uc2VudF9sbzsKKwlBRERfNjQoZXN0YXRzLT5wYXVzZV9mcmFtZXNfc2VudF9oaSwKKwkgICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnR4X3N0YXRfb3V0eG9mZnNlbnRfaGksCisJICAgICAgIGVzdGF0cy0+cGF1c2VfZnJhbWVzX3NlbnRfbG8sCisJICAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS50eF9zdGF0X291dHhvZmZzZW50X2xvKTsKK30KKworc3RhdGljIGludCBibngyeF9od19zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgbmlnX3N0YXRzICpuZXcgPSBibngyeF9zcChicCwgbmlnX3N0YXRzKTsKKwlzdHJ1Y3QgbmlnX3N0YXRzICpvbGQgPSAmKGJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMpOworCXN0cnVjdCBob3N0X3BvcnRfc3RhdHMgKnBzdGF0cyA9IGJueDJ4X3NwKGJwLCBwb3J0X3N0YXRzKTsKKwlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKKwlzdHJ1Y3QgeworCQl1MzIgbG87CisJCXUzMiBoaTsKKwl9IGRpZmY7CisKKwlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9CTUFDKQorCQlibngyeF9ibWFjX3N0YXRzX3VwZGF0ZShicCk7CisKKwllbHNlIGlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0VNQUMpCisJCWJueDJ4X2VtYWNfc3RhdHNfdXBkYXRlKGJwKTsKKworCWVsc2UgeyAvKiB1bnJlYWNoZWQgKi8KKwkJQk5YMlhfRVJSKCJzdGF0cyB1cGRhdGVkIGJ5IERNQUUgYnV0IG5vIE1BQyBhY3RpdmVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJQUREX0VYVEVORF82NChwc3RhdHMtPmJyYl9kcm9wX2hpLCBwc3RhdHMtPmJyYl9kcm9wX2xvLAorCQkgICAgICBuZXctPmJyYl9kaXNjYXJkIC0gb2xkLT5icmJfZGlzY2FyZCk7CisJQUREX0VYVEVORF82NChlc3RhdHMtPmJyYl90cnVuY2F0ZV9oaSwgZXN0YXRzLT5icmJfdHJ1bmNhdGVfbG8sCisJCSAgICAgIG5ldy0+YnJiX3RydW5jYXRlIC0gb2xkLT5icmJfdHJ1bmNhdGUpOworCisJVVBEQVRFX1NUQVQ2NF9OSUcoZWdyZXNzX21hY19wa3QwLAorCQkJCQlldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHMpOworCVVQREFURV9TVEFUNjRfTklHKGVncmVzc19tYWNfcGt0MSwgZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0cyk7CisKKwltZW1jcHkob2xkLCBuZXcsIHNpemVvZihzdHJ1Y3QgbmlnX3N0YXRzKSk7CisKKwltZW1jcHkoJihlc3RhdHMtPnJ4X3N0YXRfaWZoY2luYmFkb2N0ZXRzX2hpKSwgJihwc3RhdHMtPm1hY19zdHhbMV0pLAorCSAgICAgICBzaXplb2Yoc3RydWN0IG1hY19zdHgpKTsKKwllc3RhdHMtPmJyYl9kcm9wX2hpID0gcHN0YXRzLT5icmJfZHJvcF9oaTsKKwllc3RhdHMtPmJyYl9kcm9wX2xvID0gcHN0YXRzLT5icmJfZHJvcF9sbzsKKworCXBzdGF0cy0+aG9zdF9wb3J0X3N0YXRzX3N0YXJ0ID0gKytwc3RhdHMtPmhvc3RfcG9ydF9zdGF0c19lbmQ7CisKKwlpZiAoIUJQX05PTUNQKGJwKSkgeworCQl1MzIgbmlnX3RpbWVyX21heCA9CisJCQlTSE1FTV9SRChicCwgcG9ydF9tYltCUF9QT1JUKGJwKV0uc3RhdF9uaWdfdGltZXIpOworCQlpZiAobmlnX3RpbWVyX21heCAhPSBlc3RhdHMtPm5pZ190aW1lcl9tYXgpIHsKKwkJCWVzdGF0cy0+bmlnX3RpbWVyX21heCA9IG5pZ190aW1lcl9tYXg7CisJCQlCTlgyWF9FUlIoIk5JRyB0aW1lciBtYXggKCV1KVxuIiwKKwkJCQkgIGVzdGF0cy0+bmlnX3RpbWVyX21heCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9zdG9ybV9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgZXRoX3N0YXRzX3F1ZXJ5ICpzdGF0cyA9IGJueDJ4X3NwKGJwLCBmd19zdGF0cyk7CisJc3RydWN0IHRzdG9ybV9wZXJfcG9ydF9zdGF0cyAqdHBvcnQgPQorCQkJCQkmc3RhdHMtPnRzdG9ybV9jb21tb24ucG9ydF9zdGF0aXN0aWNzOworCXN0cnVjdCBob3N0X2Z1bmNfc3RhdHMgKmZzdGF0cyA9IGJueDJ4X3NwKGJwLCBmdW5jX3N0YXRzKTsKKwlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKKwlpbnQgaTsKKwl1MTYgY3VyX3N0YXRzX2NvdW50ZXI7CisKKwkvKiBNYWtlIHN1cmUgd2UgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlcgorCSAqIHVzZWQgZm9yIHNlbmRpbmcgdGhlIGxhc3Qgc3RhdHMgcmFtcm9kLgorCSAqLworCXNwaW5fbG9ja19iaCgmYnAtPnN0YXRzX2xvY2spOworCWN1cl9zdGF0c19jb3VudGVyID0gYnAtPnN0YXRzX2NvdW50ZXIgLSAxOworCXNwaW5fdW5sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7CisKKwltZW1jcHkoJihmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKSwKKwkgICAgICAgJihibngyeF9zcChicCwgZnVuY19zdGF0c19iYXNlKS0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGkpLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGhvc3RfZnVuY19zdGF0cykgLSAyKnNpemVvZih1MzIpKTsKKwllc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2hpID0gMDsKKwllc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvID0gMDsKKwllc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpID0gMDsKKwllc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2xvID0gMDsKKwllc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZF9oaSA9IDA7CisJZXN0YXRzLT5ub19idWZmX2Rpc2NhcmRfbG8gPSAwOworCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisJCWludCBjbF9pZCA9IGZwLT5jbF9pZDsKKwkJc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzICp0Y2xpZW50ID0KKwkJCQkmc3RhdHMtPnRzdG9ybV9jb21tb24uY2xpZW50X3N0YXRpc3RpY3NbY2xfaWRdOworCQlzdHJ1Y3QgdHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgKm9sZF90Y2xpZW50ID0gJmZwLT5vbGRfdGNsaWVudDsKKwkJc3RydWN0IHVzdG9ybV9wZXJfY2xpZW50X3N0YXRzICp1Y2xpZW50ID0KKwkJCQkmc3RhdHMtPnVzdG9ybV9jb21tb24uY2xpZW50X3N0YXRpc3RpY3NbY2xfaWRdOworCQlzdHJ1Y3QgdXN0b3JtX3Blcl9jbGllbnRfc3RhdHMgKm9sZF91Y2xpZW50ID0gJmZwLT5vbGRfdWNsaWVudDsKKwkJc3RydWN0IHhzdG9ybV9wZXJfY2xpZW50X3N0YXRzICp4Y2xpZW50ID0KKwkJCQkmc3RhdHMtPnhzdG9ybV9jb21tb24uY2xpZW50X3N0YXRpc3RpY3NbY2xfaWRdOworCQlzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgKm9sZF94Y2xpZW50ID0gJmZwLT5vbGRfeGNsaWVudDsKKwkJc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzICpxc3RhdHMgPSAmZnAtPmV0aF9xX3N0YXRzOworCQl1MzIgZGlmZjsKKworCQkvKiBhcmUgc3Rvcm0gc3RhdHMgdmFsaWQ/ICovCisJCWlmIChsZTE2X3RvX2NwdSh4Y2xpZW50LT5zdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiWyVkXSBzdGF0cyBub3QgdXBkYXRlZCBieSB4c3Rvcm0iCisJCQkgICAiICB4c3Rvcm0gY291bnRlciAoMHgleCkgIT0gc3RhdHNfY291bnRlciAoMHgleClcbiIsCisJCQkgICBpLCB4Y2xpZW50LT5zdGF0c19jb3VudGVyLCBjdXJfc3RhdHNfY291bnRlciArIDEpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChsZTE2X3RvX2NwdSh0Y2xpZW50LT5zdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiWyVkXSBzdGF0cyBub3QgdXBkYXRlZCBieSB0c3Rvcm0iCisJCQkgICAiICB0c3Rvcm0gY291bnRlciAoMHgleCkgIT0gc3RhdHNfY291bnRlciAoMHgleClcbiIsCisJCQkgICBpLCB0Y2xpZW50LT5zdGF0c19jb3VudGVyLCBjdXJfc3RhdHNfY291bnRlciArIDEpOworCQkJcmV0dXJuIC0yOworCQl9CisJCWlmIChsZTE2X3RvX2NwdSh1Y2xpZW50LT5zdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiWyVkXSBzdGF0cyBub3QgdXBkYXRlZCBieSB1c3Rvcm0iCisJCQkgICAiICB1c3Rvcm0gY291bnRlciAoMHgleCkgIT0gc3RhdHNfY291bnRlciAoMHgleClcbiIsCisJCQkgICBpLCB1Y2xpZW50LT5zdGF0c19jb3VudGVyLCBjdXJfc3RhdHNfY291bnRlciArIDEpOworCQkJcmV0dXJuIC00OworCQl9CisKKwkJcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSA9CisJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfYnJvYWRjYXN0X2J5dGVzLmhpKTsKKwkJcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbyA9CisJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfYnJvYWRjYXN0X2J5dGVzLmxvKTsKKworCQlBRERfNjQocXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9tdWx0aWNhc3RfYnl0ZXMuaGkpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbywKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9tdWx0aWNhc3RfYnl0ZXMubG8pKTsKKworCQlBRERfNjQocXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl91bmljYXN0X2J5dGVzLmhpKSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCisJCSAgICAgICBsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfdW5pY2FzdF9ieXRlcy5sbykpOworCisJCVNVQl82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgbGUzMl90b19jcHUodWNsaWVudC0+YmNhc3Rfbm9fYnVmZl9ieXRlcy5oaSksCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAorCQkgICAgICAgbGUzMl90b19jcHUodWNsaWVudC0+YmNhc3Rfbm9fYnVmZl9ieXRlcy5sbykpOworCisJCVNVQl82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgbGUzMl90b19jcHUodWNsaWVudC0+bWNhc3Rfbm9fYnVmZl9ieXRlcy5oaSksCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAorCQkgICAgICAgbGUzMl90b19jcHUodWNsaWVudC0+bWNhc3Rfbm9fYnVmZl9ieXRlcy5sbykpOworCisJCVNVQl82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgbGUzMl90b19jcHUodWNsaWVudC0+dWNhc3Rfbm9fYnVmZl9ieXRlcy5oaSksCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAorCQkgICAgICAgbGUzMl90b19jcHUodWNsaWVudC0+dWNhc3Rfbm9fYnVmZl9ieXRlcy5sbykpOworCisJCXFzdGF0cy0+dmFsaWRfYnl0ZXNfcmVjZWl2ZWRfaGkgPQorCQkJCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpOworCQlxc3RhdHMtPnZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvID0KKwkJCQkJcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbzsKKworCQlxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2hpID0KKwkJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfZXJyb3JfYnl0ZXMuaGkpOworCQlxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvID0KKwkJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfZXJyb3JfYnl0ZXMubG8pOworCisJCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgcXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9oaSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCisJCSAgICAgICBxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvKTsKKworCQlVUERBVEVfRVhURU5EX1RTVEFUKHJjdl91bmljYXN0X3BrdHMsCisJCQkJCXRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZCk7CisJCVVQREFURV9FWFRFTkRfVFNUQVQocmN2X211bHRpY2FzdF9wa3RzLAorCQkJCQl0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZCk7CisJCVVQREFURV9FWFRFTkRfVFNUQVQocmN2X2Jyb2FkY2FzdF9wa3RzLAorCQkJCQl0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZCk7CisJCVVQREFURV9FWFRFTkRfVFNUQVQocGFja2V0c190b29fYmlnX2Rpc2NhcmQsCisJCQkJCWV0aGVyc3RhdHNvdmVycnNpemVwa3RzKTsKKwkJVVBEQVRFX0VYVEVORF9UU1RBVChub19idWZmX2Rpc2NhcmQsIG5vX2J1ZmZfZGlzY2FyZCk7CisKKwkJU1VCX0VYVEVORF9VU1RBVCh1Y2FzdF9ub19idWZmX3BrdHMsCisJCQkJCXRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZCk7CisJCVNVQl9FWFRFTkRfVVNUQVQobWNhc3Rfbm9fYnVmZl9wa3RzLAorCQkJCQl0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZCk7CisJCVNVQl9FWFRFTkRfVVNUQVQoYmNhc3Rfbm9fYnVmZl9wa3RzLAorCQkJCQl0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZCk7CisJCVVQREFURV9FWFRFTkRfVVNUQVQodWNhc3Rfbm9fYnVmZl9wa3RzLCBub19idWZmX2Rpc2NhcmQpOworCQlVUERBVEVfRVhURU5EX1VTVEFUKG1jYXN0X25vX2J1ZmZfcGt0cywgbm9fYnVmZl9kaXNjYXJkKTsKKwkJVVBEQVRFX0VYVEVORF9VU1RBVChiY2FzdF9ub19idWZmX3BrdHMsIG5vX2J1ZmZfZGlzY2FyZCk7CisKKwkJcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSA9CisJCQkJbGUzMl90b19jcHUoeGNsaWVudC0+dW5pY2FzdF9ieXRlc19zZW50LmhpKTsKKwkJcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbyA9CisJCQkJbGUzMl90b19jcHUoeGNsaWVudC0+dW5pY2FzdF9ieXRlc19zZW50LmxvKTsKKworCQlBRERfNjQocXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHhjbGllbnQtPm11bHRpY2FzdF9ieXRlc19zZW50LmhpKSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfbG8sCisJCSAgICAgICBsZTMyX3RvX2NwdSh4Y2xpZW50LT5tdWx0aWNhc3RfYnl0ZXNfc2VudC5sbykpOworCisJCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICAgbGUzMl90b19jcHUoeGNsaWVudC0+YnJvYWRjYXN0X2J5dGVzX3NlbnQuaGkpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbywKKwkJICAgICAgIGxlMzJfdG9fY3B1KHhjbGllbnQtPmJyb2FkY2FzdF9ieXRlc19zZW50LmxvKSk7CisKKwkJVVBEQVRFX0VYVEVORF9YU1RBVCh1bmljYXN0X3BrdHNfc2VudCwKKwkJCQkJdG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkKTsKKwkJVVBEQVRFX0VYVEVORF9YU1RBVChtdWx0aWNhc3RfcGt0c19zZW50LAorCQkJCQl0b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZCk7CisJCVVQREFURV9FWFRFTkRfWFNUQVQoYnJvYWRjYXN0X3BrdHNfc2VudCwKKwkJCQkJdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWQpOworCisJCW9sZF90Y2xpZW50LT5jaGVja3N1bV9kaXNjYXJkID0gdGNsaWVudC0+Y2hlY2tzdW1fZGlzY2FyZDsKKwkJb2xkX3RjbGllbnQtPnR0bDBfZGlzY2FyZCA9IHRjbGllbnQtPnR0bDBfZGlzY2FyZDsKKworCQlBRERfNjQoZnN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCisJCSAgICAgICBmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbyk7CisJCUFERF82NChmc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSwKKwkJICAgICAgIGZzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfbG8sCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvKTsKKwkJQUREXzY0KGZzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGksCisJCSAgICAgICBmc3RhdHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbywKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvKTsKKwkJQUREXzY0KGZzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGksCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgZnN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbywKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG8pOworCQlBRERfNjQoZnN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGksCisJCSAgICAgICBmc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9sbyk7CisJCUFERF82NChmc3RhdHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICAgZnN0YXRzLT50b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8sCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbyk7CisJCUFERF82NChmc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSwKKwkJICAgICAgIGZzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8sCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvKTsKKwkJQUREXzY0KGZzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGksCisJCSAgICAgICBxc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICAgZnN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbywKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8pOworCQlBRERfNjQoZnN0YXRzLT52YWxpZF9ieXRlc19yZWNlaXZlZF9oaSwKKwkJICAgICAgIHFzdGF0cy0+dmFsaWRfYnl0ZXNfcmVjZWl2ZWRfaGksCisJCSAgICAgICBmc3RhdHMtPnZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvLAorCQkgICAgICAgcXN0YXRzLT52YWxpZF9ieXRlc19yZWNlaXZlZF9sbyk7CisKKwkJQUREXzY0KGVzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGksCisJCSAgICAgICBxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2hpLAorCQkgICAgICAgZXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9sbywKKwkJICAgICAgIHFzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG8pOworCQlBRERfNjQoZXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaSwKKwkJICAgICAgIHFzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGksCisJCSAgICAgICBlc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2xvLAorCQkgICAgICAgcXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19sbyk7CisJCUFERF82NChlc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZF9oaSwgcXN0YXRzLT5ub19idWZmX2Rpc2NhcmRfaGksCisJCSAgICAgICBlc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZF9sbywgcXN0YXRzLT5ub19idWZmX2Rpc2NhcmRfbG8pOworCX0KKworCUFERF82NChmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAorCSAgICAgICBlc3RhdHMtPnJ4X3N0YXRfaWZoY2luYmFkb2N0ZXRzX2hpLAorCSAgICAgICBmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAorCSAgICAgICBlc3RhdHMtPnJ4X3N0YXRfaWZoY2luYmFkb2N0ZXRzX2xvKTsKKworCW1lbWNweShlc3RhdHMsICYoZnN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSksCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaG9zdF9mdW5jX3N0YXRzKSAtIDIqc2l6ZW9mKHUzMikpOworCisJQUREXzY0KGVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGksCisJICAgICAgIGVzdGF0cy0+cnhfc3RhdF9kb3Qzc3RhdHNmcmFtZXN0b29sb25nX2hpLAorCSAgICAgICBlc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2xvLAorCSAgICAgICBlc3RhdHMtPnJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZ19sbyk7CisJQUREXzY0KGVzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGksCisJICAgICAgIGVzdGF0cy0+cnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfaGksCisJICAgICAgIGVzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG8sCisJICAgICAgIGVzdGF0cy0+cnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfbG8pOworCisJaWYgKGJwLT5wb3J0LnBtZikgeworCQllc3RhdHMtPm1hY19maWx0ZXJfZGlzY2FyZCA9CisJCQkJbGUzMl90b19jcHUodHBvcnQtPm1hY19maWx0ZXJfZGlzY2FyZCk7CisJCWVzdGF0cy0+eHhvdmVyZmxvd19kaXNjYXJkID0KKwkJCQlsZTMyX3RvX2NwdSh0cG9ydC0+eHhvdmVyZmxvd19kaXNjYXJkKTsKKwkJZXN0YXRzLT5icmJfdHJ1bmNhdGVfZGlzY2FyZCA9CisJCQkJbGUzMl90b19jcHUodHBvcnQtPmJyYl90cnVuY2F0ZV9kaXNjYXJkKTsKKwkJZXN0YXRzLT5tYWNfZGlzY2FyZCA9IGxlMzJfdG9fY3B1KHRwb3J0LT5tYWNfZGlzY2FyZCk7CisJfQorCisJZnN0YXRzLT5ob3N0X2Z1bmNfc3RhdHNfc3RhcnQgPSArK2ZzdGF0cy0+aG9zdF9mdW5jX3N0YXRzX2VuZDsKKworCWJwLT5zdGF0c19wZW5kaW5nID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibngyeF9uZXRfc3RhdHNfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gJmJwLT5ldGhfc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0cyA9ICZicC0+ZGV2LT5zdGF0czsKKwlpbnQgaTsKKworCW5zdGF0cy0+cnhfcGFja2V0cyA9CisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSArCisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkpICsKKwkJYm54MnhfaGlsbygmZXN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSk7CisKKwluc3RhdHMtPnR4X3BhY2tldHMgPQorCQlibngyeF9oaWxvKCZlc3RhdHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSkgKworCQlibngyeF9oaWxvKCZlc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSArCisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpOworCisJbnN0YXRzLT5yeF9ieXRlcyA9IGJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGkpOworCisJbnN0YXRzLT50eF9ieXRlcyA9IGJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGkpOworCisJbnN0YXRzLT5yeF9kcm9wcGVkID0gZXN0YXRzLT5tYWNfZGlzY2FyZDsKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJbnN0YXRzLT5yeF9kcm9wcGVkICs9CisJCQlsZTMyX3RvX2NwdShicC0+ZnBbaV0ub2xkX3RjbGllbnQuY2hlY2tzdW1fZGlzY2FyZCk7CisKKwluc3RhdHMtPnR4X2Ryb3BwZWQgPSAwOworCisJbnN0YXRzLT5tdWx0aWNhc3QgPQorCQlibngyeF9oaWxvKCZlc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKTsKKworCW5zdGF0cy0+Y29sbGlzaW9ucyA9CisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+dHhfc3RhdF9ldGhlcnN0YXRzY29sbGlzaW9uc19oaSk7CisKKwluc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPQorCQlibngyeF9oaWxvKCZlc3RhdHMtPnJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHNfaGkpICsKKwkJYm54MnhfaGlsbygmZXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaSk7CisJbnN0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IGJueDJ4X2hpbG8oJmVzdGF0cy0+YnJiX2Ryb3BfaGkpICsKKwkJCQkgYm54MnhfaGlsbygmZXN0YXRzLT5icmJfdHJ1bmNhdGVfaGkpOworCW5zdGF0cy0+cnhfY3JjX2Vycm9ycyA9CisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+cnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnNfaGkpOworCW5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0KKwkJYm54MnhfaGlsbygmZXN0YXRzLT5yeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19oaSk7CisJbnN0YXRzLT5yeF9maWZvX2Vycm9ycyA9IGJueDJ4X2hpbG8oJmVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkX2hpKTsKKwluc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSBlc3RhdHMtPnh4b3ZlcmZsb3dfZGlzY2FyZDsKKworCW5zdGF0cy0+cnhfZXJyb3JzID0gbnN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsKKwkJCSAgICBuc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKKwkJCSAgICBuc3RhdHMtPnJ4X2NyY19lcnJvcnMgKworCQkJICAgIG5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzICsKKwkJCSAgICBuc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICsKKwkJCSAgICBuc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CisKKwluc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzID0KKwkJYm54MnhfaGlsbygmZXN0YXRzLT50eF9zdGF0X2RvdDNzdGF0c2xhdGVjb2xsaXNpb25zX2hpKSArCisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+dHhfc3RhdF9kb3Qzc3RhdHNleGNlc3NpdmVjb2xsaXNpb25zX2hpKTsKKwluc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzID0KKwkJYm54MnhfaGlsbygmZXN0YXRzLT5yeF9zdGF0X2RvdDNzdGF0c2NhcnJpZXJzZW5zZWVycm9yc19oaSk7CisJbnN0YXRzLT50eF9maWZvX2Vycm9ycyA9IDA7CisJbnN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKKwluc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgPSAwOworCisJbnN0YXRzLT50eF9lcnJvcnMgPSBuc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICsKKwkJCSAgICBuc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICsKKwkgICAgYm54MnhfaGlsbygmZXN0YXRzLT50eF9zdGF0X2RvdDNzdGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnNfaGkpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9kcnZfc3RhdHNfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gJmJwLT5ldGhfc3RhdHM7CisJaW50IGk7CisKKwllc3RhdHMtPmRyaXZlcl94b2ZmID0gMDsKKwllc3RhdHMtPnJ4X2Vycl9kaXNjYXJkX3BrdCA9IDA7CisJZXN0YXRzLT5yeF9za2JfYWxsb2NfZmFpbGVkID0gMDsKKwllc3RhdHMtPmh3X2NzdW1fZXJyID0gMDsKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkgeworCQlzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMgKnFzdGF0cyA9ICZicC0+ZnBbaV0uZXRoX3Ffc3RhdHM7CisKKwkJZXN0YXRzLT5kcml2ZXJfeG9mZiArPSBxc3RhdHMtPmRyaXZlcl94b2ZmOworCQllc3RhdHMtPnJ4X2Vycl9kaXNjYXJkX3BrdCArPSBxc3RhdHMtPnJ4X2Vycl9kaXNjYXJkX3BrdDsKKwkJZXN0YXRzLT5yeF9za2JfYWxsb2NfZmFpbGVkICs9IHFzdGF0cy0+cnhfc2tiX2FsbG9jX2ZhaWxlZDsKKwkJZXN0YXRzLT5od19jc3VtX2VyciArPSBxc3RhdHMtPmh3X2NzdW1fZXJyOworCX0KK30KKworc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOworCisJaWYgKCpzdGF0c19jb21wICE9IERNQUVfQ09NUF9WQUwpCisJCXJldHVybjsKKworCWlmIChicC0+cG9ydC5wbWYpCisJCWJueDJ4X2h3X3N0YXRzX3VwZGF0ZShicCk7CisKKwlpZiAoYm54Mnhfc3Rvcm1fc3RhdHNfdXBkYXRlKGJwKSAmJiAoYnAtPnN0YXRzX3BlbmRpbmcrKyA9PSAzKSkgeworCQlCTlgyWF9FUlIoInN0b3JtIHN0YXRzIHdlcmUgbm90IHVwZGF0ZWQgZm9yIDMgdGltZXNcbiIpOworCQlibngyeF9wYW5pYygpOworCQlyZXR1cm47CisJfQorCisJYm54MnhfbmV0X3N0YXRzX3VwZGF0ZShicCk7CisJYm54MnhfZHJ2X3N0YXRzX3VwZGF0ZShicCk7CisKKwlpZiAobmV0aWZfbXNnX3RpbWVyKGJwKSkgeworCQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKKwkJaW50IGk7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBicmIgZHJvcHMgJXUgIGJyYiB0cnVuY2F0ZSAldVxuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUsCisJCSAgICAgICBlc3RhdHMtPmJyYl9kcm9wX2xvLCBlc3RhdHMtPmJyYl90cnVuY2F0ZV9sbyk7CisKKwkJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCQkJc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzICpxc3RhdHMgPSAmZnAtPmV0aF9xX3N0YXRzOworCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IHVzYWdlKCU0dSkgICpyeF9jb25zX3NiKCV1KSIKKwkJCQkJICAiICByeCBwa3QoJWx1KSAgcnggY2FsbHMoJWx1ICVsdSlcbiIsCisJCQkgICAgICAgZnAtPm5hbWUsIChsZTE2X3RvX2NwdSgqZnAtPnJ4X2NvbnNfc2IpIC0KKwkJCSAgICAgICBmcC0+cnhfY29tcF9jb25zKSwKKwkJCSAgICAgICBsZTE2X3RvX2NwdSgqZnAtPnJ4X2NvbnNfc2IpLAorCQkJICAgICAgIGJueDJ4X2hpbG8oJnFzdGF0cy0+CisJCQkJCSAgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKKwkJCSAgICAgICBmcC0+cnhfY2FsbHMsIGZwLT5yeF9wa3QpOworCQl9CisKKwkJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCQkJc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzICpxc3RhdHMgPSAmZnAtPmV0aF9xX3N0YXRzOworCQkJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxID0KKwkJCQluZXRkZXZfZ2V0X3R4X3F1ZXVlKGJwLT5kZXYsIGkpOworCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGF2YWlsKCU0dSkgICp0eF9jb25zX3NiKCV1KSIKKwkJCQkJICAiICB0eCBwa3QoJWx1KSB0eCBjYWxscyAoJWx1KSIKKwkJCQkJICAiICAlcyAoWG9mZiBldmVudHMgJXUpXG4iLAorCQkJICAgICAgIGZwLT5uYW1lLCBibngyeF90eF9hdmFpbChmcCksCisJCQkgICAgICAgbGUxNl90b19jcHUoKmZwLT50eF9jb25zX3NiKSwKKwkJCSAgICAgICBibngyeF9oaWxvKCZxc3RhdHMtPgorCQkJCQkgIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSksCisJCQkgICAgICAgZnAtPnR4X3BrdCwKKwkJCSAgICAgICAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpID8gIlhvZmYiIDogIlhvbiIpLAorCQkJICAgICAgIHFzdGF0cy0+ZHJpdmVyX3hvZmYpOworCQl9CisJfQorCisJYm54MnhfaHdfc3RhdHNfcG9zdChicCk7CisJYm54Mnhfc3Rvcm1fc3RhdHNfcG9zdChicCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3BvcnRfc3RhdHNfc3RvcChzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWU7CisJdTMyIG9wY29kZTsKKwlpbnQgbG9hZGVyX2lkeCA9IFBNRl9ETUFFX0MoYnApOworCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKKworCWJwLT5leGVjdXRlcl9pZHggPSAwOworCisJb3Bjb2RlID0gKERNQUVfQ01EX1NSQ19QQ0kgfCBETUFFX0NNRF9EU1RfR1JDIHwKKwkJICBETUFFX0NNRF9DX0VOQUJMRSB8CisJCSAgRE1BRV9DTURfU1JDX1JFU0VUIHwgRE1BRV9DTURfRFNUX1JFU0VUIHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJICBETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJCSAgRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAorI2VuZGlmCisJCSAgKEJQX1BPUlQoYnApID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8CisJCSAgKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOworCisJaWYgKGJwLT5wb3J0LnBvcnRfc3R4KSB7CisKKwkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCQlpZiAoYnAtPmZ1bmNfc3R4KQorCQkJZG1hZS0+b3Bjb2RlID0gKG9wY29kZSB8IERNQUVfQ01EX0NfRFNUX0dSQyk7CisJCWVsc2UKKwkJCWRtYWUtPm9wY29kZSA9IChvcGNvZGUgfCBETUFFX0NNRF9DX0RTVF9QQ0kpOworCQlkbWFlLT5zcmNfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBwb3J0X3N0YXRzKSk7CisJCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKKwkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBicC0+cG9ydC5wb3J0X3N0eCA+PiAyOworCQlkbWFlLT5kc3RfYWRkcl9oaSA9IDA7CisJCWRtYWUtPmxlbiA9IHNpemVvZihzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzKSA+PiAyOworCQlpZiAoYnAtPmZ1bmNfc3R4KSB7CisJCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7CisJCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCQkJZG1hZS0+Y29tcF92YWwgPSAxOworCQl9IGVsc2UgeworCQkJZG1hZS0+Y29tcF9hZGRyX2xvID0KKwkJCQlVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOworCQkJZG1hZS0+Y29tcF9hZGRyX2hpID0KKwkJCQlVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOworCQkJZG1hZS0+Y29tcF92YWwgPSBETUFFX0NPTVBfVkFMOworCisJCQkqc3RhdHNfY29tcCA9IDA7CisJCX0KKwl9CisKKwlpZiAoYnAtPmZ1bmNfc3R4KSB7CisKKwkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCQlkbWFlLT5vcGNvZGUgPSAob3Bjb2RlIHwgRE1BRV9DTURfQ19EU1RfUENJKTsKKwkJZG1hZS0+c3JjX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgZnVuY19zdGF0cykpOworCQlkbWFlLT5zcmNfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzKSk7CisJCWRtYWUtPmRzdF9hZGRyX2xvID0gYnAtPmZ1bmNfc3R4ID4+IDI7CisJCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKKwkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CisJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CisJCWRtYWUtPmNvbXBfdmFsID0gRE1BRV9DT01QX1ZBTDsKKworCQkqc3RhdHNfY29tcCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9zdGF0c19zdG9wKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHVwZGF0ZSA9IDA7CisKKwlibngyeF9zdGF0c19jb21wKGJwKTsKKworCWlmIChicC0+cG9ydC5wbWYpCisJCXVwZGF0ZSA9IChibngyeF9od19zdGF0c191cGRhdGUoYnApID09IDApOworCisJdXBkYXRlIHw9IChibngyeF9zdG9ybV9zdGF0c191cGRhdGUoYnApID09IDApOworCisJaWYgKHVwZGF0ZSkgeworCQlibngyeF9uZXRfc3RhdHNfdXBkYXRlKGJwKTsKKworCQlpZiAoYnAtPnBvcnQucG1mKQorCQkJYm54MnhfcG9ydF9zdGF0c19zdG9wKGJwKTsKKworCQlibngyeF9od19zdGF0c19wb3N0KGJwKTsKKwkJYm54Mnhfc3RhdHNfY29tcChicCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9zdGF0c19kb19ub3RoaW5nKHN0cnVjdCBibngyeCAqYnApCit7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXZvaWQgKCphY3Rpb24pKHN0cnVjdCBibngyeCAqYnApOworCWVudW0gYm54Mnhfc3RhdHNfc3RhdGUgbmV4dF9zdGF0ZTsKK30gYm54Mnhfc3RhdHNfc3RtW1NUQVRTX1NUQVRFX01BWF1bU1RBVFNfRVZFTlRfTUFYXSA9IHsKKy8qIHN0YXRlCWV2ZW50CSovCit7CisvKiBESVNBQkxFRAlQTUYJKi8ge2JueDJ4X3N0YXRzX3BtZl91cGRhdGUsIFNUQVRTX1NUQVRFX0RJU0FCTEVEfSwKKy8qCQlMSU5LX1VQCSovIHtibngyeF9zdGF0c19zdGFydCwgICAgICBTVEFUU19TVEFURV9FTkFCTEVEfSwKKy8qCQlVUERBVEUJKi8ge2JueDJ4X3N0YXRzX2RvX25vdGhpbmcsIFNUQVRTX1NUQVRFX0RJU0FCTEVEfSwKKy8qCQlTVE9QCSovIHtibngyeF9zdGF0c19kb19ub3RoaW5nLCBTVEFUU19TVEFURV9ESVNBQkxFRH0KK30sCit7CisvKiBFTkFCTEVECVBNRgkqLyB7Ym54Mnhfc3RhdHNfcG1mX3N0YXJ0LCAgU1RBVFNfU1RBVEVfRU5BQkxFRH0sCisvKgkJTElOS19VUAkqLyB7Ym54Mnhfc3RhdHNfcmVzdGFydCwgICAgU1RBVFNfU1RBVEVfRU5BQkxFRH0sCisvKgkJVVBEQVRFCSovIHtibngyeF9zdGF0c191cGRhdGUsICAgICBTVEFUU19TVEFURV9FTkFCTEVEfSwKKy8qCQlTVE9QCSovIHtibngyeF9zdGF0c19zdG9wLCAgICAgICBTVEFUU19TVEFURV9ESVNBQkxFRH0KK30KK307CisKK3ZvaWQgYm54Mnhfc3RhdHNfaGFuZGxlKHN0cnVjdCBibngyeCAqYnAsIGVudW0gYm54Mnhfc3RhdHNfZXZlbnQgZXZlbnQpCit7CisJZW51bSBibngyeF9zdGF0c19zdGF0ZSBzdGF0ZTsKKworCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQorCQlyZXR1cm47CisKKwkvKiBQcm90ZWN0IGEgc3RhdGUgY2hhbmdlIGZsb3cgKi8KKwlzcGluX2xvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKKwlzdGF0ZSA9IGJwLT5zdGF0c19zdGF0ZTsKKwlicC0+c3RhdHNfc3RhdGUgPSBibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5uZXh0X3N0YXRlOworCXNwaW5fdW5sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7CisKKwlibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5hY3Rpb24oYnApOworCisJaWYgKChldmVudCAhPSBTVEFUU19FVkVOVF9VUERBVEUpIHx8IG5ldGlmX21zZ190aW1lcihicCkpCisJCURQKEJOWDJYX01TR19TVEFUUywgInN0YXRlICVkIC0+IGV2ZW50ICVkIC0+IHN0YXRlICVkXG4iLAorCQkgICBzdGF0ZSwgZXZlbnQsIGJwLT5zdGF0c19zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3BvcnRfc3RhdHNfYmFzZV9pbml0KHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IGRtYWVfY29tbWFuZCAqZG1hZTsKKwl1MzIgKnN0YXRzX2NvbXAgPSBibngyeF9zcChicCwgc3RhdHNfY29tcCk7CisKKwkvKiBzYW5pdHkgKi8KKwlpZiAoIWJwLT5wb3J0LnBtZiB8fCAhYnAtPnBvcnQucG9ydF9zdHgpIHsKKwkJQk5YMlhfRVJSKCJCVUchXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJwLT5leGVjdXRlcl9pZHggPSAwOworCisJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCWRtYWUtPm9wY29kZSA9IChETUFFX0NNRF9TUkNfUENJIHwgRE1BRV9DTURfRFNUX0dSQyB8CisJCQlETUFFX0NNRF9DX0RTVF9QQ0kgfCBETUFFX0NNRF9DX0VOQUJMRSB8CisJCQlETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAorI2lmZGVmIF9fQklHX0VORElBTgorCQkJRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8CisjZWxzZQorCQkJRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAorI2VuZGlmCisJCQkoQlBfUE9SVChicCkgPyBETUFFX0NNRF9QT1JUXzEgOiBETUFFX0NNRF9QT1JUXzApIHwKKwkJCShCUF9FMUhWTihicCkgPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKKwlkbWFlLT5zcmNfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBwb3J0X3N0YXRzKSk7CisJZG1hZS0+c3JjX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgcG9ydF9zdGF0cykpOworCWRtYWUtPmRzdF9hZGRyX2xvID0gYnAtPnBvcnQucG9ydF9zdHggPj4gMjsKKwlkbWFlLT5kc3RfYWRkcl9oaSA9IDA7CisJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDI7CisJZG1hZS0+Y29tcF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKKwlkbWFlLT5jb21wX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOworCWRtYWUtPmNvbXBfdmFsID0gRE1BRV9DT01QX1ZBTDsKKworCSpzdGF0c19jb21wID0gMDsKKwlibngyeF9od19zdGF0c19wb3N0KGJwKTsKKwlibngyeF9zdGF0c19jb21wKGJwKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZnVuY19zdGF0c19iYXNlX2luaXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgdm4sIHZuX21heCA9IElTX0UxSE1GKGJwKSA/IEUxSFZOX01BWCA6IEUxVk5fTUFYOworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IGZ1bmM7CisJdTMyIGZ1bmNfc3R4OworCisJLyogc2FuaXR5ICovCisJaWYgKCFicC0+cG9ydC5wbWYgfHwgIWJwLT5mdW5jX3N0eCkgeworCQlCTlgyWF9FUlIoIkJVRyFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc2F2ZSBvdXIgZnVuY19zdHggKi8KKwlmdW5jX3N0eCA9IGJwLT5mdW5jX3N0eDsKKworCWZvciAodm4gPSBWTl8wOyB2biA8IHZuX21heDsgdm4rKykgeworCQlmdW5jID0gMip2biArIHBvcnQ7CisKKwkJYnAtPmZ1bmNfc3R4ID0gU0hNRU1fUkQoYnAsIGZ1bmNfbWJbZnVuY10uZndfbWJfcGFyYW0pOworCQlibngyeF9mdW5jX3N0YXRzX2luaXQoYnApOworCQlibngyeF9od19zdGF0c19wb3N0KGJwKTsKKwkJYm54Mnhfc3RhdHNfY29tcChicCk7CisJfQorCisJLyogcmVzdG9yZSBvdXIgZnVuY19zdHggKi8KKwlicC0+ZnVuY19zdHggPSBmdW5jX3N0eDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZnVuY19zdGF0c19iYXNlX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPnN0YXRzX2RtYWU7CisJdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOworCisJLyogc2FuaXR5ICovCisJaWYgKCFicC0+ZnVuY19zdHgpIHsKKwkJQk5YMlhfRVJSKCJCVUchXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJwLT5leGVjdXRlcl9pZHggPSAwOworCW1lbXNldChkbWFlLCAwLCBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkpOworCisJZG1hZS0+b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19HUkMgfCBETUFFX0NNRF9EU1RfUENJIHwKKwkJCURNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJCURNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJCShCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAorCQkJKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOworCWRtYWUtPnNyY19hZGRyX2xvID0gYnAtPmZ1bmNfc3R4ID4+IDI7CisJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ1bmNfc3RhdHNfYmFzZSkpOworCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ1bmNfc3RhdHNfYmFzZSkpOworCWRtYWUtPmxlbiA9IHNpemVvZihzdHJ1Y3QgaG9zdF9mdW5jX3N0YXRzKSA+PiAyOworCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CisJZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKKwlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7CisKKwkqc3RhdHNfY29tcCA9IDA7CisJYm54MnhfaHdfc3RhdHNfcG9zdChicCk7CisJYm54Mnhfc3RhdHNfY29tcChicCk7Cit9CisKK3ZvaWQgYm54Mnhfc3RhdHNfaW5pdChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwlpbnQgaTsKKworCWJwLT5zdGF0c19wZW5kaW5nID0gMDsKKwlicC0+ZXhlY3V0ZXJfaWR4ID0gMDsKKwlicC0+c3RhdHNfY291bnRlciA9IDA7CisKKwkvKiBwb3J0IGFuZCBmdW5jIHN0YXRzIGZvciBtYW5hZ2VtZW50ICovCisJaWYgKCFCUF9OT01DUChicCkpIHsKKwkJYnAtPnBvcnQucG9ydF9zdHggPSBTSE1FTV9SRChicCwgcG9ydF9tYltwb3J0XS5wb3J0X3N0eCk7CisJCWJwLT5mdW5jX3N0eCA9IFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmZ3X21iX3BhcmFtKTsKKworCX0gZWxzZSB7CisJCWJwLT5wb3J0LnBvcnRfc3R4ID0gMDsKKwkJYnAtPmZ1bmNfc3R4ID0gMDsKKwl9CisJRFAoQk5YMlhfTVNHX1NUQVRTLCAicG9ydF9zdHggMHgleCAgZnVuY19zdHggMHgleFxuIiwKKwkgICBicC0+cG9ydC5wb3J0X3N0eCwgYnAtPmZ1bmNfc3R4KTsKKworCS8qIHBvcnQgc3RhdHMgKi8KKwltZW1zZXQoJihicC0+cG9ydC5vbGRfbmlnX3N0YXRzKSwgMCwgc2l6ZW9mKHN0cnVjdCBuaWdfc3RhdHMpKTsKKwlicC0+cG9ydC5vbGRfbmlnX3N0YXRzLmJyYl9kaXNjYXJkID0KKwkJCVJFR19SRChicCwgTklHX1JFR19TVEFUMF9CUkJfRElTQ0FSRCArIHBvcnQqMHgzOCk7CisJYnAtPnBvcnQub2xkX25pZ19zdGF0cy5icmJfdHJ1bmNhdGUgPQorCQkJUkVHX1JEKGJwLCBOSUdfUkVHX1NUQVQwX0JSQl9UUlVOQ0FURSArIHBvcnQqMHgzOCk7CisJUkVHX1JEX0RNQUUoYnAsIE5JR19SRUdfU1RBVDBfRUdSRVNTX01BQ19QS1QwICsgcG9ydCoweDUwLAorCQkgICAgJihicC0+cG9ydC5vbGRfbmlnX3N0YXRzLmVncmVzc19tYWNfcGt0MF9sbyksIDIpOworCVJFR19SRF9ETUFFKGJwLCBOSUdfUkVHX1NUQVQwX0VHUkVTU19NQUNfUEtUMSArIHBvcnQqMHg1MCwKKwkJICAgICYoYnAtPnBvcnQub2xkX25pZ19zdGF0cy5lZ3Jlc3NfbWFjX3BrdDFfbG8pLCAyKTsKKworCS8qIGZ1bmN0aW9uIHN0YXRzICovCisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisKKwkJbWVtc2V0KCZmcC0+b2xkX3RjbGllbnQsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzKSk7CisJCW1lbXNldCgmZnAtPm9sZF91Y2xpZW50LCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykpOworCQltZW1zZXQoJmZwLT5vbGRfeGNsaWVudCwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMpKTsKKwkJbWVtc2V0KCZmcC0+ZXRoX3Ffc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMpKTsKKwl9CisKKwltZW1zZXQoJmJwLT5kZXYtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwltZW1zZXQoJmJwLT5ldGhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzKSk7CisKKwlicC0+c3RhdHNfc3RhdGUgPSBTVEFUU19TVEFURV9ESVNBQkxFRDsKKworCWlmIChicC0+cG9ydC5wbWYpIHsKKwkJaWYgKGJwLT5wb3J0LnBvcnRfc3R4KQorCQkJYm54MnhfcG9ydF9zdGF0c19iYXNlX2luaXQoYnApOworCisJCWlmIChicC0+ZnVuY19zdHgpCisJCQlibngyeF9mdW5jX3N0YXRzX2Jhc2VfaW5pdChicCk7CisKKwl9IGVsc2UgaWYgKGJwLT5mdW5jX3N0eCkKKwkJYm54MnhfZnVuY19zdGF0c19iYXNlX3VwZGF0ZShicCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zdGF0cy5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE0ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuaApAQCAtMCwwICsxLDIzOSBAQAorLyogYm54Mnhfc3RhdHMuaDogQnJvYWRjb20gRXZlcmVzdCBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogV3JpdHRlbiBieTogRWxpZXplciBUYW1pcgorICogQmFzZWQgb24gY29kZSBmcm9tIE1pY2hhZWwgQ2hhbidzIGJueDIgZHJpdmVyCisgKi8KKworI2lmbmRlZiBCTlgyWF9TVEFUU19ICisjZGVmaW5lIEJOWDJYX1NUQVRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBibngyeF9ldGhfcV9zdGF0cyB7CisJdTMyIHRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpOworCXUzMiB0b3RhbF9ieXRlc19yZWNlaXZlZF9sbzsKKwl1MzIgdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyIHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvOworCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKKwl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOworCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaTsKKwl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87CisJdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKKwl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOworCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKKwl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87CisJdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpOworCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKKwl1MzIgdmFsaWRfYnl0ZXNfcmVjZWl2ZWRfaGk7CisJdTMyIHZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvOworCisJdTMyIGVycm9yX2J5dGVzX3JlY2VpdmVkX2hpOworCXUzMiBlcnJvcl9ieXRlc19yZWNlaXZlZF9sbzsKKwl1MzIgZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGk7CisJdTMyIGV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2xvOworCXUzMiBub19idWZmX2Rpc2NhcmRfaGk7CisJdTMyIG5vX2J1ZmZfZGlzY2FyZF9sbzsKKworCXUzMiBkcml2ZXJfeG9mZjsKKwl1MzIgcnhfZXJyX2Rpc2NhcmRfcGt0OworCXUzMiByeF9za2JfYWxsb2NfZmFpbGVkOworCXUzMiBod19jc3VtX2VycjsKK307CisKKyNkZWZpbmUgQk5YMlhfTlVNX1FfU1RBVFMJCTEzCisjZGVmaW5lIFFfU1RBVFNfT0ZGU0VUMzIoc3RhdF9uYW1lKSBcCisJCQkob2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzLCBzdGF0X25hbWUpIC8gNCkKKworc3RydWN0IG5pZ19zdGF0cyB7CisJdTMyIGJyYl9kaXNjYXJkOworCXUzMiBicmJfcGFja2V0OworCXUzMiBicmJfdHJ1bmNhdGU7CisJdTMyIGZsb3dfY3RybF9kaXNjYXJkOworCXUzMiBmbG93X2N0cmxfb2N0ZXRzOworCXUzMiBmbG93X2N0cmxfcGFja2V0OworCXUzMiBtbmdfZGlzY2FyZDsKKwl1MzIgbW5nX29jdGV0X2lucDsKKwl1MzIgbW5nX29jdGV0X291dDsKKwl1MzIgbW5nX3BhY2tldF9pbnA7CisJdTMyIG1uZ19wYWNrZXRfb3V0OworCXUzMiBwYmZfb2N0ZXRzOworCXUzMiBwYmZfcGFja2V0OworCXUzMiBzYWZjX2lucDsKKwl1MzIgZWdyZXNzX21hY19wa3QwX2xvOworCXUzMiBlZ3Jlc3NfbWFjX3BrdDBfaGk7CisJdTMyIGVncmVzc19tYWNfcGt0MV9sbzsKKwl1MzIgZWdyZXNzX21hY19wa3QxX2hpOworfTsKKworCitlbnVtIGJueDJ4X3N0YXRzX2V2ZW50IHsKKwlTVEFUU19FVkVOVF9QTUYgPSAwLAorCVNUQVRTX0VWRU5UX0xJTktfVVAsCisJU1RBVFNfRVZFTlRfVVBEQVRFLAorCVNUQVRTX0VWRU5UX1NUT1AsCisJU1RBVFNfRVZFTlRfTUFYCit9OworCitlbnVtIGJueDJ4X3N0YXRzX3N0YXRlIHsKKwlTVEFUU19TVEFURV9ESVNBQkxFRCA9IDAsCisJU1RBVFNfU1RBVEVfRU5BQkxFRCwKKwlTVEFUU19TVEFURV9NQVgKK307CisKK3N0cnVjdCBibngyeF9ldGhfc3RhdHMgeworCXUzMiB0b3RhbF9ieXRlc19yZWNlaXZlZF9oaTsKKwl1MzIgdG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG87CisJdTMyIHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpOworCXUzMiB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbzsKKwl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOworCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87CisJdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOworCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKKwl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOworCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKKwl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOworCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKKwl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87CisJdTMyIHZhbGlkX2J5dGVzX3JlY2VpdmVkX2hpOworCXUzMiB2YWxpZF9ieXRlc19yZWNlaXZlZF9sbzsKKworCXUzMiBlcnJvcl9ieXRlc19yZWNlaXZlZF9oaTsKKwl1MzIgZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG87CisJdTMyIGV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpOworCXUzMiBldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19sbzsKKwl1MzIgbm9fYnVmZl9kaXNjYXJkX2hpOworCXUzMiBub19idWZmX2Rpc2NhcmRfbG87CisKKwl1MzIgcnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfaGk7CisJdTMyIHJ4X3N0YXRfaWZoY2luYmFkb2N0ZXRzX2xvOworCXUzMiB0eF9zdGF0X2lmaGNvdXRiYWRvY3RldHNfaGk7CisJdTMyIHR4X3N0YXRfaWZoY291dGJhZG9jdGV0c19sbzsKKwl1MzIgcnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnNfaGk7CisJdTMyIHJ4X3N0YXRfZG90M3N0YXRzZmNzZXJyb3JzX2xvOworCXUzMiByeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19oaTsKKwl1MzIgcnhfc3RhdF9kb3Qzc3RhdHNhbGlnbm1lbnRlcnJvcnNfbG87CisJdTMyIHJ4X3N0YXRfZG90M3N0YXRzY2FycmllcnNlbnNlZXJyb3JzX2hpOworCXUzMiByeF9zdGF0X2RvdDNzdGF0c2NhcnJpZXJzZW5zZWVycm9yc19sbzsKKwl1MzIgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnNfaGk7CisJdTMyIHJ4X3N0YXRfZmFsc2VjYXJyaWVyZXJyb3JzX2xvOworCXUzMiByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzX2hpOworCXUzMiByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzX2xvOworCXUzMiByeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmdfaGk7CisJdTMyIHJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZ19sbzsKKwl1MzIgcnhfc3RhdF9ldGhlcnN0YXRzZnJhZ21lbnRzX2hpOworCXUzMiByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHNfbG87CisJdTMyIHJ4X3N0YXRfZXRoZXJzdGF0c2phYmJlcnNfaGk7CisJdTMyIHJ4X3N0YXRfZXRoZXJzdGF0c2phYmJlcnNfbG87CisJdTMyIHJ4X3N0YXRfbWFjY29udHJvbGZyYW1lc3JlY2VpdmVkX2hpOworCXUzMiByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZF9sbzsKKwl1MzIgcnhfc3RhdF9ibWFjX3hwZl9oaTsKKwl1MzIgcnhfc3RhdF9ibWFjX3hwZl9sbzsKKwl1MzIgcnhfc3RhdF9ibWFjX3hjZl9oaTsKKwl1MzIgcnhfc3RhdF9ibWFjX3hjZl9sbzsKKwl1MzIgcnhfc3RhdF94b2Zmc3RhdGVlbnRlcmVkX2hpOworCXUzMiByeF9zdGF0X3hvZmZzdGF0ZWVudGVyZWRfbG87CisJdTMyIHJ4X3N0YXRfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZF9oaTsKKwl1MzIgcnhfc3RhdF94b25wYXVzZWZyYW1lc3JlY2VpdmVkX2xvOworCXUzMiByeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkX2hpOworCXUzMiByeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkX2xvOworCXUzMiB0eF9zdGF0X291dHhvbnNlbnRfaGk7CisJdTMyIHR4X3N0YXRfb3V0eG9uc2VudF9sbzsKKwl1MzIgdHhfc3RhdF9vdXR4b2Zmc2VudF9oaTsKKwl1MzIgdHhfc3RhdF9vdXR4b2Zmc2VudF9sbzsKKwl1MzIgdHhfc3RhdF9mbG93Y29udHJvbGRvbmVfaGk7CisJdTMyIHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lX2xvOworCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNjb2xsaXNpb25zX2hpOworCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNjb2xsaXNpb25zX2xvOworCXUzMiB0eF9zdGF0X2RvdDNzdGF0c3NpbmdsZWNvbGxpc2lvbmZyYW1lc19oaTsKKwl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNzaW5nbGVjb2xsaXNpb25mcmFtZXNfbG87CisJdTMyIHR4X3N0YXRfZG90M3N0YXRzbXVsdGlwbGVjb2xsaXNpb25mcmFtZXNfaGk7CisJdTMyIHR4X3N0YXRfZG90M3N0YXRzbXVsdGlwbGVjb2xsaXNpb25mcmFtZXNfbG87CisJdTMyIHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zX2hpOworCXUzMiB0eF9zdGF0X2RvdDNzdGF0c2RlZmVycmVkdHJhbnNtaXNzaW9uc19sbzsKKwl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNleGNlc3NpdmVjb2xsaXNpb25zX2hpOworCXUzMiB0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfbG87CisJdTMyIHR4X3N0YXRfZG90M3N0YXRzbGF0ZWNvbGxpc2lvbnNfaGk7CisJdTMyIHR4X3N0YXRfZG90M3N0YXRzbGF0ZWNvbGxpc2lvbnNfbG87CisJdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NG9jdGV0c19oaTsKKwl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzX2xvOworCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjVvY3RldHN0bzEyN29jdGV0c19oaTsKKwl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHNfbG87CisJdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMjhvY3RldHN0bzI1NW9jdGV0c19oaTsKKwl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzX2xvOworCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHNfaGk7CisJdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMyNTZvY3RldHN0bzUxMW9jdGV0c19sbzsKKwl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0c19oaTsKKwl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0c19sbzsKKwl1MzIgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHNfaGk7CisJdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzX2xvOworCXUzMiB0eF9zdGF0X2V0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHNfaGk7CisJdTMyIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19sbzsKKwl1MzIgdHhfc3RhdF9ibWFjXzIwNDdfaGk7CisJdTMyIHR4X3N0YXRfYm1hY18yMDQ3X2xvOworCXUzMiB0eF9zdGF0X2JtYWNfNDA5NV9oaTsKKwl1MzIgdHhfc3RhdF9ibWFjXzQwOTVfbG87CisJdTMyIHR4X3N0YXRfYm1hY185MjE2X2hpOworCXUzMiB0eF9zdGF0X2JtYWNfOTIxNl9sbzsKKwl1MzIgdHhfc3RhdF9ibWFjXzE2MzgzX2hpOworCXUzMiB0eF9zdGF0X2JtYWNfMTYzODNfbG87CisJdTMyIHR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9yc19oaTsKKwl1MzIgdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzX2xvOworCXUzMiB0eF9zdGF0X2JtYWNfdWZsX2hpOworCXUzMiB0eF9zdGF0X2JtYWNfdWZsX2xvOworCisJdTMyIHBhdXNlX2ZyYW1lc19yZWNlaXZlZF9oaTsKKwl1MzIgcGF1c2VfZnJhbWVzX3JlY2VpdmVkX2xvOworCXUzMiBwYXVzZV9mcmFtZXNfc2VudF9oaTsKKwl1MzIgcGF1c2VfZnJhbWVzX3NlbnRfbG87CisKKwl1MzIgZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzX2hpOworCXUzMiBldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHNfbG87CisJdTMyIGV0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHNfaGk7CisJdTMyIGV0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHNfbG87CisKKwl1MzIgYnJiX2Ryb3BfaGk7CisJdTMyIGJyYl9kcm9wX2xvOworCXUzMiBicmJfdHJ1bmNhdGVfaGk7CisJdTMyIGJyYl90cnVuY2F0ZV9sbzsKKworCXUzMiBtYWNfZmlsdGVyX2Rpc2NhcmQ7CisJdTMyIHh4b3ZlcmZsb3dfZGlzY2FyZDsKKwl1MzIgYnJiX3RydW5jYXRlX2Rpc2NhcmQ7CisJdTMyIG1hY19kaXNjYXJkOworCisJdTMyIGRyaXZlcl94b2ZmOworCXUzMiByeF9lcnJfZGlzY2FyZF9wa3Q7CisJdTMyIHJ4X3NrYl9hbGxvY19mYWlsZWQ7CisJdTMyIGh3X2NzdW1fZXJyOworCisJdTMyIG5pZ190aW1lcl9tYXg7Cit9OworCisjZGVmaW5lIEJOWDJYX05VTV9TVEFUUwkJCTQzCisjZGVmaW5lIFNUQVRTX09GRlNFVDMyKHN0YXRfbmFtZSkgXAorCQkJKG9mZnNldG9mKHN0cnVjdCBibngyeF9ldGhfc3RhdHMsIHN0YXRfbmFtZSkgLyA0KQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgYm54Mng7CisKKwordm9pZCBibngyeF9zdGF0c19pbml0KHN0cnVjdCBibngyeCAqYnApOworCitleHRlcm4gY29uc3QgdTMyIGRtYWVfcmVnX2dvX2NbXTsKK2V4dGVybiBpbnQgYm54Mnhfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY29tbWFuZCwgaW50IGNpZCwKKwkJCSB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjb21tb24pOworCisKKyNlbmRpZiAvKiBCTlgyWF9TVEFUU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeF9saW5rLmMgYi9kcml2ZXJzL25ldC9ibngyeF9saW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzBiZTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYm54MnhfbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjczMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQotICogYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB0byB5b3UKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBhdmFpbGFibGUKLSAqIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sICh0aGUgIkdQTCIpLgotICoKLSAqIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lIHRoaXMKLSAqIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQgdW5kZXIgYQotICogbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yIHdyaXR0ZW4KLSAqIGNvbnNlbnQuCi0gKgotICogV3JpdHRlbiBieSBZYW5pdiBSb3NuZXIKLSAqCi0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0jaW5jbHVkZSAiYm54MnguaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBFVEhfSExFTgkJCTE0Ci0jZGVmaW5lIEVUSF9PVlJFSEVBRAkJKEVUSF9ITEVOICsgOCkvKiA4IGZvciBDUkMgKyBWTEFOKi8KLSNkZWZpbmUgRVRIX01JTl9QQUNLRVRfU0laRQkJNjAKLSNkZWZpbmUgRVRIX01BWF9QQUNLRVRfU0laRQkJMTUwMAotI2RlZmluZSBFVEhfTUFYX0pVTUJPX1BBQ0tFVF9TSVpFCTk2MDAKLSNkZWZpbmUgTURJT19BQ0NFU1NfVElNRU9VVAkJMTAwMAotI2RlZmluZSBCTUFDX0NPTlRST0xfUlhfRU5BQkxFCTIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoJCQlTaG9ydGN1dCBkZWZpbml0aW9ucwkJICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBOSUdfTEFUQ0hfQkNfRU5BQkxFX01JX0lOVCAwCi0KLSNkZWZpbmUgTklHX1NUQVRVU19FTUFDMF9NSV9JTlQgXAotCQlOSUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMF9SRUdfU1RBVFVTX0VNQUMwX01JU0NfTUlfSU5UCi0jZGVmaW5lIE5JR19TVEFUVVNfWEdYUzBfTElOSzEwRyBcCi0JCU5JR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwX1JFR19TVEFUVVNfWEdYUzBfTElOSzEwRwotI2RlZmluZSBOSUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTIFwKLQkJTklHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDBfUkVHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVUwotI2RlZmluZSBOSUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTX1NJWkUgXAotCQlOSUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMF9SRUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTX1NJWkUKLSNkZWZpbmUgTklHX1NUQVRVU19TRVJERVMwX0xJTktfU1RBVFVTIFwKLQkJTklHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDBfUkVHX1NUQVRVU19TRVJERVMwX0xJTktfU1RBVFVTCi0jZGVmaW5lIE5JR19NQVNLX01JX0lOVCBcCi0JCU5JR19NQVNLX0lOVEVSUlVQVF9QT1JUMF9SRUdfTUFTS19FTUFDMF9NSVNDX01JX0lOVAotI2RlZmluZSBOSUdfTUFTS19YR1hTMF9MSU5LMTBHIFwKLQkJTklHX01BU0tfSU5URVJSVVBUX1BPUlQwX1JFR19NQVNLX1hHWFMwX0xJTksxMEcKLSNkZWZpbmUgTklHX01BU0tfWEdYUzBfTElOS19TVEFUVVMgXAotCQlOSUdfTUFTS19JTlRFUlJVUFRfUE9SVDBfUkVHX01BU0tfWEdYUzBfTElOS19TVEFUVVMKLSNkZWZpbmUgTklHX01BU0tfU0VSREVTMF9MSU5LX1NUQVRVUyBcCi0JCU5JR19NQVNLX0lOVEVSUlVQVF9QT1JUMF9SRUdfTUFTS19TRVJERVMwX0xJTktfU1RBVFVTCi0KLSNkZWZpbmUgTURJT19BTl9DTDczX09SXzM3X0NPTVBMRVRFIFwKLQkJKE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0NMNzNfQVVUT05FR19DT01QTEVURSB8IFwKLQkJIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0NMMzdfQVVUT05FR19DT01QTEVURSkKLQotI2RlZmluZSBYR1hTX1JFU0VUX0JJVFMgXAotCShNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19NSVNDX05JR19NVVhfWEdYUzBfUlNUQl9IVyB8ICAgXAotCSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19NSVNDX05JR19NVVhfWEdYUzBfSUREUSB8ICAgICAgXAotCSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19NSVNDX05JR19NVVhfWEdYUzBfUFdSRFdOIHwgICAgXAotCSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19NSVNDX05JR19NVVhfWEdYUzBfUFdSRFdOX1NEIHwgXAotCSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19NSVNDX05JR19NVVhfWEdYUzBfVFhEX0ZJRk9fUlNUQikKLQotI2RlZmluZSBTRVJERVNfUkVTRVRfQklUUyBcCi0JKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9TRVJERVMwX1JTVEJfSFcgfCBcCi0JIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9TRVJERVMwX0lERFEgfCAgICBcCi0JIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9TRVJERVMwX1BXUkRXTiB8ICBcCi0JIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9TRVJERVMwX1BXUkRXTl9TRCkKLQotI2RlZmluZSBBVVRPTkVHX0NMMzcJCVNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX0NMMzcKLSNkZWZpbmUgQVVUT05FR19DTDczCQlTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9DTDczCi0jZGVmaW5lIEFVVE9ORUdfQkFNIAkJU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfQkFNCi0jZGVmaW5lIEFVVE9ORUdfUEFSQUxMRUwgXAotCQkJCVNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX1BBUkFMTEVMX0RFVEVDVElPTgotI2RlZmluZSBBVVRPTkVHX1NHTUlJX0ZJQkVSX0FVVE9ERVQgXAotCQkJCVNIQVJFRF9IV19DRkdfQU5fRU5fU0dNSUlfRklCRVJfQVVUT19ERVRFQ1QKLSNkZWZpbmUgQVVUT05FR19SRU1PVEVfUEhZCVNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX1JFTU9URV9QSFkKLQotI2RlZmluZSBHUF9TVEFUVVNfUEFVU0VfUlNPTFVUSU9OX1RYU0lERSBcCi0JCQlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9QQVVTRV9SU09MVVRJT05fVFhTSURFCi0jZGVmaW5lIEdQX1NUQVRVU19QQVVTRV9SU09MVVRJT05fUlhTSURFIFwKLQkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX1BBVVNFX1JTT0xVVElPTl9SWFNJREUKLSNkZWZpbmUgR1BfU1RBVFVTX1NQRUVEX01BU0sgXAotCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEX01BU0sKLSNkZWZpbmUgR1BfU1RBVFVTXzEwTQlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTBNCi0jZGVmaW5lIEdQX1NUQVRVU18xMDBNCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMDBNCi0jZGVmaW5lIEdQX1NUQVRVU18xRwlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMUcKLSNkZWZpbmUgR1BfU1RBVFVTXzJfNUcJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzJfNUcKLSNkZWZpbmUgR1BfU1RBVFVTXzVHCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF81RwotI2RlZmluZSBHUF9TVEFUVVNfNkcJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzZHCi0jZGVmaW5lIEdQX1NUQVRVU18xMEdfSElHIFwKLQkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMEdfSElHCi0jZGVmaW5lIEdQX1NUQVRVU18xMEdfQ1g0IFwKLQkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMEdfQ1g0Ci0jZGVmaW5lIEdQX1NUQVRVU18xMkdfSElHIFwKLQkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMkdfSElHCi0jZGVmaW5lIEdQX1NUQVRVU18xMl81RyBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTJfNUcKLSNkZWZpbmUgR1BfU1RBVFVTXzEzRwlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTNHCi0jZGVmaW5lIEdQX1NUQVRVU18xNUcJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzE1RwotI2RlZmluZSBHUF9TVEFUVVNfMTZHCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xNkcKLSNkZWZpbmUgR1BfU1RBVFVTXzFHX0tYIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xR19LWAotI2RlZmluZSBHUF9TVEFUVVNfMTBHX0tYNCBcCi0JCQlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTBHX0tYNAotCi0jZGVmaW5lIExJTktfMTBUSEQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwVEhECi0jZGVmaW5lIExJTktfMTBURkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwVEZECi0jZGVmaW5lIExJTktfMTAwVFhIRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDBUWEhECi0jZGVmaW5lIExJTktfMTAwVDQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFQ0Ci0jZGVmaW5lIExJTktfMTAwVFhGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDBUWEZECi0jZGVmaW5lIExJTktfMTAwMFRIRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwVEhECi0jZGVmaW5lIExJTktfMTAwMFRGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwVEZECi0jZGVmaW5lIExJTktfMTAwMFhGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwWEZECi0jZGVmaW5lIExJTktfMjUwMFRIRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwVEhECi0jZGVmaW5lIExJTktfMjUwMFRGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwVEZECi0jZGVmaW5lIExJTktfMjUwMFhGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwWEZECi0jZGVmaW5lIExJTktfMTBHVEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMEdURkQKLSNkZWZpbmUgTElOS18xMEdYRkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwR1hGRAotI2RlZmluZSBMSU5LXzEyR1RGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTJHVEZECi0jZGVmaW5lIExJTktfMTJHWEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMkdYRkQKLSNkZWZpbmUgTElOS18xMl81R1RGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMl81R1RGRAotI2RlZmluZSBMSU5LXzEyXzVHWEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEyXzVHWEZECi0jZGVmaW5lIExJTktfMTNHVEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xM0dURkQKLSNkZWZpbmUgTElOS18xM0dYRkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEzR1hGRAotI2RlZmluZSBMSU5LXzE1R1RGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTVHVEZECi0jZGVmaW5lIExJTktfMTVHWEZECQkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xNUdYRkQKLSNkZWZpbmUgTElOS18xNkdURkQJCQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzE2R1RGRAotI2RlZmluZSBMSU5LXzE2R1hGRAkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTZHWEZECi0KLSNkZWZpbmUgUEhZX1hHWFNfRkxBRwkJCTB4MQotI2RlZmluZSBQSFlfU0dNSUlfRkxBRwkJCTB4MgotI2RlZmluZSBQSFlfU0VSREVTX0ZMQUcJCQkweDQKLQotLyogKi8KLSNkZWZpbmUgU0ZQX0VFUFJPTV9DT05fVFlQRV9BRERSCQkweDIKLQkjZGVmaW5lIFNGUF9FRVBST01fQ09OX1RZUEVfVkFMX0xDIAkJMHg3Ci0JI2RlZmluZSBTRlBfRUVQUk9NX0NPTl9UWVBFX1ZBTF9DT1BQRVIJMHgyMQotCi0KLSNkZWZpbmUgU0ZQX0VFUFJPTV9DT01QX0NPREVfQUREUgkJMHgzCi0JI2RlZmluZSBTRlBfRUVQUk9NX0NPTVBfQ09ERV9TUl9NQVNLCSgxPDw0KQotCSNkZWZpbmUgU0ZQX0VFUFJPTV9DT01QX0NPREVfTFJfTUFTSwkoMTw8NSkKLQkjZGVmaW5lIFNGUF9FRVBST01fQ09NUF9DT0RFX0xSTV9NQVNLCSgxPDw2KQotCi0jZGVmaW5lIFNGUF9FRVBST01fRkNfVFhfVEVDSF9BRERSCQkweDgKLQkjZGVmaW5lIFNGUF9FRVBST01fRkNfVFhfVEVDSF9CSVRNQVNLX0NPUFBFUl9QQVNTSVZFIDB4NAotCSNkZWZpbmUgU0ZQX0VFUFJPTV9GQ19UWF9URUNIX0JJVE1BU0tfQ09QUEVSX0FDVElWRQkgMHg4Ci0KLSNkZWZpbmUgU0ZQX0VFUFJPTV9PUFRJT05TX0FERFIgCQkweDQwCi0JI2RlZmluZSBTRlBfRUVQUk9NX09QVElPTlNfTElORUFSX1JYX09VVF9NQVNLIDB4MQotI2RlZmluZSBTRlBfRUVQUk9NX09QVElPTlNfU0laRSAJCTIKLQotI2RlZmluZSBFRENfTU9ERV9MSU5FQVIJIAkJCTB4MDAyMgotI2RlZmluZSBFRENfTU9ERV9MSU1JVElORwkgCQkJMHgwMDQ0Ci0jZGVmaW5lIEVEQ19NT0RFX1BBU1NJVkVfREFDIAkJCTB4MDA1NQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDTDQ1X1dSX09WRVJfQ0wyMihfYnAsIF9wb3J0LCBfcGh5X2FkZHIsIF9iYW5rLCBfYWRkciwgX3ZhbCkgXAotCWJueDJ4X2NsNDVfd3JpdGUoX2JwLCBfcG9ydCwgMCwgX3BoeV9hZGRyLCBcCi0JCURFRkFVTFRfUEhZX0RFVl9BRERSLCBcCi0JCShfYmFuayArIChfYWRkciAmIDB4ZikpLCBcCi0JCV92YWwpCi0KLSNkZWZpbmUgQ0w0NV9SRF9PVkVSX0NMMjIoX2JwLCBfcG9ydCwgX3BoeV9hZGRyLCBfYmFuaywgX2FkZHIsIF92YWwpIFwKLQlibngyeF9jbDQ1X3JlYWQoX2JwLCBfcG9ydCwgMCwgX3BoeV9hZGRyLCBcCi0JCURFRkFVTFRfUEhZX0RFVl9BRERSLCBcCi0JCShfYmFuayArIChfYWRkciAmIDB4ZikpLCBcCi0JCV92YWwpCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldF9zZXJkZXNfYWNjZXNzKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiBlbWFjX2Jhc2UgPSAocGFyYW1zLT5wb3J0KSA/IEdSQ0JBU0VfRU1BQzEgOiBHUkNCQVNFX0VNQUMwOwotCi0JLyogU2V0IENsYXVzZSAyMiAqLwotCVJFR19XUihicCwgTklHX1JFR19TRVJERVMwX0NUUkxfTURfU1QgKyBwYXJhbXMtPnBvcnQqMHgxMCwgMSk7Ci0JUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgMHgyNDVmODAwMCk7Ci0JdWRlbGF5KDUwMCk7Ci0JUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgMHgyNDVkMDAwZik7Ci0JdWRlbGF5KDUwMCk7Ci0JIC8qIFNldCBDbGF1c2UgNDUgKi8KLQlSRUdfV1IoYnAsIE5JR19SRUdfU0VSREVTMF9DVFJMX01EX1NUICsgcGFyYW1zLT5wb3J0KjB4MTAsIDApOwotfQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X3BoeV9tZGlvKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1OCBwaHlfZmxhZ3MpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0KLQlpZiAocGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgewotCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYUzBfQ1RSTF9NRF9TVCArCi0JCQkgICBwYXJhbXMtPnBvcnQqMHgxOCwgMCk7Ci0JCVJFR19XUihicCwgTklHX1JFR19YR1hTMF9DVFJMX01EX0RFVkFEICsgcGFyYW1zLT5wb3J0KjB4MTgsCi0JCQkgICBERUZBVUxUX1BIWV9ERVZfQUREUik7Ci0JfSBlbHNlIHsKLQkJYm54Mnhfc2V0X3NlcmRlc19hY2Nlc3MocGFyYW1zKTsKLQotCQlSRUdfV1IoYnAsIE5JR19SRUdfU0VSREVTMF9DVFJMX01EX0RFVkFEICsKLQkJCSAgIHBhcmFtcy0+cG9ydCoweDEwLAotCQkJICAgREVGQVVMVF9QSFlfREVWX0FERFIpOwotCX0KLX0KLQotc3RhdGljIHUzMiBibngyeF9iaXRzX2VuKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZWcsIHUzMiBiaXRzKQotewotCXUzMiB2YWwgPSBSRUdfUkQoYnAsIHJlZyk7Ci0KLQl2YWwgfD0gYml0czsKLQlSRUdfV1IoYnAsIHJlZywgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdTMyIGJueDJ4X2JpdHNfZGlzKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZWcsIHUzMiBiaXRzKQotewotCXUzMiB2YWwgPSBSRUdfUkQoYnAsIHJlZyk7Ci0KLQl2YWwgJj0gfmJpdHM7Ci0JUkVHX1dSKGJwLCByZWcsIHZhbCk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZW1hY19pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQkvKiByZXNldCBhbmQgdW5yZXNldCB0aGUgZW1hYyBjb3JlICovCi0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1MzIgZW1hY19iYXNlID0gcG9ydCA/IEdSQ0JBU0VfRU1BQzEgOiBHUkNCQVNFX0VNQUMwOwotCXUzMiB2YWw7Ci0JdTE2IHRpbWVvdXQ7Ci0KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCQkgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMwX0hBUkRfQ09SRSA8PCBwb3J0KSk7Ci0JdWRlbGF5KDUpOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAotCQkgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMwX0hBUkRfQ09SRSA8PCBwb3J0KSk7Ci0KLQkvKiBpbml0IGVtYWMgLSB1c2UgcmVhZC1tb2RpZnktd3JpdGUgKi8KLQkvKiBzZWxmIGNsZWFyIHJlc2V0ICovCi0JdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01PREUpOwotCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTU9ERSwgKHZhbCB8IEVNQUNfTU9ERV9SRVNFVCkpOwotCi0JdGltZW91dCA9IDIwMDsKLQlkbyB7Ci0JCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19NT0RFKTsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJFTUFDIHJlc2V0IHJlZyBpcyAldVxuIiwgdmFsKTsKLQkJaWYgKCF0aW1lb3V0KSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIkVNQUMgdGltZW91dCFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRpbWVvdXQtLTsKLQl9IHdoaWxlICh2YWwgJiBFTUFDX01PREVfUkVTRVQpOwotCi0JLyogU2V0IG1hYyBhZGRyZXNzICovCi0JdmFsID0gKChwYXJhbXMtPm1hY19hZGRyWzBdIDw8IDgpIHwKLQkJcGFyYW1zLT5tYWNfYWRkclsxXSk7Ci0JRU1BQ19XUihicCwgRU1BQ19SRUdfRU1BQ19NQUNfTUFUQ0gsIHZhbCk7Ci0KLQl2YWwgPSAoKHBhcmFtcy0+bWFjX2FkZHJbMl0gPDwgMjQpIHwKLQkgICAgICAgKHBhcmFtcy0+bWFjX2FkZHJbM10gPDwgMTYpIHwKLQkgICAgICAgKHBhcmFtcy0+bWFjX2FkZHJbNF0gPDwgOCkgfAotCQlwYXJhbXMtPm1hY19hZGRyWzVdKTsKLQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01BQ19NQVRDSCArIDQsIHZhbCk7Ci19Ci0KLXN0YXRpYyB1OCBibngyeF9lbWFjX2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycywgdTggbGIpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1MzIgZW1hY19iYXNlID0gcG9ydCA/IEdSQ0JBU0VfRU1BQzEgOiBHUkNCQVNFX0VNQUMwOwotCXUzMiB2YWw7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgImVuYWJsaW5nIEVNQUNcbiIpOwotCi0JLyogZW5hYmxlIGVtYWMgYW5kIG5vdCBibWFjICovCi0JUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19FTUFDMF9QT1JUICsgcG9ydCo0LCAxKTsKLQotCS8qIGZvciBwYWxhZGl1bSAqLwotCWlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkgewotCQkvKiBVc2UgbGFuZSAxIChvZiBsYW5lcyAwLTMpICovCi0JCVJFR19XUihicCwgTklHX1JFR19YR1hTX0xBTkVfU0VMX1AwICsgcG9ydCo0LCAxKTsKLQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArCi0JCQkgICAgcG9ydCo0LCAxKTsKLQl9Ci0JLyogZm9yIGZwZ2EgKi8KLQllbHNlCi0KLQlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkpIHsKLQkJLyogVXNlIGxhbmUgMSAob2YgbGFuZXMgMC0zKSAqLwotCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2VtYWNfZW5hYmxlOiBTZXR0aW5nIEZQR0FcbiIpOwotCi0JCVJFR19XUihicCwgTklHX1JFR19YR1hTX0xBTkVfU0VMX1AwICsgcG9ydCo0LCAxKTsKLQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArIHBvcnQqNCwKLQkJCSAgICAwKTsKLQl9IGVsc2UKLQkvKiBBU0lDICovCi0JaWYgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsKLQkJdTMyIHNlcl9sYW5lID0gKChwYXJhbXMtPmxhbmVfY29uZmlnICYKLQkJCSAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9NQVNLKSA+PgotCQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKLQotCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFNcbiIpOwotCQkvKiBzZWxlY3QgdGhlIG1hc3RlciBsYW5lcyAob3V0IG9mIDAtMykgKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfTEFORV9TRUxfUDAgKwotCQkJICAgcG9ydCo0LCBzZXJfbGFuZSk7Ci0JCS8qIHNlbGVjdCBYR1hTICovCi0JCVJFR19XUihicCwgTklHX1JFR19YR1hTX1NFUkRFUzBfTU9ERV9TRUwgKwotCQkJICAgcG9ydCo0LCAxKTsKLQotCX0gZWxzZSB7IC8qIFNlckRlcyAqLwotCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlc1xuIik7Ci0JCS8qIHNlbGVjdCBTZXJEZXMgKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArCi0JCQkgICBwb3J0KjQsIDApOwotCX0KLQotCWJueDJ4X2JpdHNfZW4oYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfUlhfTU9ERSwKLQkJICAgIEVNQUNfUlhfTU9ERV9SRVNFVCk7Ci0JYm54MnhfYml0c19lbihicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19UWF9NT0RFLAotCQkgICAgRU1BQ19UWF9NT0RFX1JFU0VUKTsKLQotCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkgewotCQkvKiBjb25maWcgR01JSSBtb2RlICovCi0JCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19NT0RFKTsKLQkJRU1BQ19XUihicCwgRU1BQ19SRUdfRU1BQ19NT0RFLAotCQkJICAgICh2YWwgfCBFTUFDX01PREVfUE9SVF9HTUlJKSk7Ci0JfSBlbHNlIHsgLyogQVNJQyAqLwotCQkvKiBwYXVzZSBlbmFibGUvZGlzYWJsZSAqLwotCQlibngyeF9iaXRzX2RpcyhicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19SWF9NT0RFLAotCQkJICAgICAgIEVNQUNfUlhfTU9ERV9GTE9XX0VOKTsKLQkJaWYgKHZhcnMtPmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9SWCkKLQkJCWJueDJ4X2JpdHNfZW4oYnAsIGVtYWNfYmFzZSArCi0JCQkJICAgIEVNQUNfUkVHX0VNQUNfUlhfTU9ERSwKLQkJCQkgICAgRU1BQ19SWF9NT0RFX0ZMT1dfRU4pOwotCi0JCWJueDJ4X2JpdHNfZGlzKGJwLCAgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19UWF9NT0RFLAotCQkJICAgICAoRU1BQ19UWF9NT0RFX0VYVF9QQVVTRV9FTiB8Ci0JCQkgICAgICBFTUFDX1RYX01PREVfRkxPV19FTikpOwotCQlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQotCQkJYm54MnhfYml0c19lbihicCwgZW1hY19iYXNlICsKLQkJCQkgICAgRU1BQ19SRUdfRU1BQ19UWF9NT0RFLAotCQkJCSAgIChFTUFDX1RYX01PREVfRVhUX1BBVVNFX0VOIHwKLQkJCQkgICAgRU1BQ19UWF9NT0RFX0ZMT1dfRU4pKTsKLQl9Ci0KLQkvKiBLRUVQX1ZMQU5fVEFHLCBwcm9taXNjdW91cyAqLwotCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19SWF9NT0RFKTsKLQl2YWwgfD0gRU1BQ19SWF9NT0RFX0tFRVBfVkxBTl9UQUcgfCBFTUFDX1JYX01PREVfUFJPTUlTQ1VPVVM7Ci0JRU1BQ19XUihicCwgRU1BQ19SRUdfRU1BQ19SWF9NT0RFLCB2YWwpOwotCi0JLyogU2V0IExvb3BiYWNrICovCi0JdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01PREUpOwotCWlmIChsYikKLQkJdmFsIHw9IDB4ODEwOwotCWVsc2UKLQkJdmFsICY9IH4weDgxMDsKLQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01PREUsIHZhbCk7Ci0KLQkvKiBlbmFibGUgZW1hYyAqLwotCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDEpOwotCi0JLyogZW5hYmxlIGVtYWMgZm9yIGp1bWJvIHBhY2tldHMgKi8KLQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX1JYX01UVV9TSVpFLAotCQkoRU1BQ19SWF9NVFVfU0laRV9KVU1CT19FTkEgfAotCQkgKEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUgKyBFVEhfT1ZSRUhFQUQpKSk7Ci0KLQkvKiBzdHJpcCBDUkMgKi8KLQlSRUdfV1IoYnAsIE5JR19SRUdfTklHX0lOR1JFU1NfRU1BQzBfTk9fQ1JDICsgcG9ydCo0LCAweDEpOwotCi0JLyogZGlzYWJsZSB0aGUgTklHIGluL291dCB0byB0aGUgYm1hYyAqLwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9JTl9FTiArIHBvcnQqNCwgMHgwKTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfQk1BQzBfUEFVU0VfT1VUX0VOICsgcG9ydCo0LCAweDApOwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDB4MCk7Ci0KLQkvKiBlbmFibGUgdGhlIE5JRyBpbi9vdXQgdG8gdGhlIGVtYWMgKi8KLQlSRUdfV1IoYnAsIE5JR19SRUdfRU1BQzBfSU5fRU4gKyBwb3J0KjQsIDB4MSk7Ci0JdmFsID0gMDsKLQlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQotCQl2YWwgPSAxOwotCi0JUkVHX1dSKGJwLCBOSUdfUkVHX0VNQUMwX1BBVVNFX09VVF9FTiArIHBvcnQqNCwgdmFsKTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMHgxKTsKLQotCWlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkgewotCQkvKiB0YWtlIHRoZSBCaWdNYWMgb3V0IG9mIHJlc2V0ICovCi0JCVJFR19XUihicCwKLQkJCSAgIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1NFVCwKLQkJCSAgIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcG9ydCkpOwotCi0JCS8qIGVuYWJsZSBhY2Nlc3MgZm9yIGJtYWMgcmVnaXN0ZXJzICovCi0JCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9SRUdTX09VVF9FTiArIHBvcnQqNCwgMHgxKTsKLQl9IGVsc2UKLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX1JFR1NfT1VUX0VOICsgcG9ydCo0LCAweDApOwotCi0JdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9FTUFDOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIHU4IGJueDJ4X2JtYWNfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAotCQkJICB1OCBpc19sYikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCXUzMiBibWFjX2FkZHIgPSBwb3J0ID8gTklHX1JFR19JTkdSRVNTX0JNQUMxX01FTSA6Ci0JCQkgICAgICAgTklHX1JFR19JTkdSRVNTX0JNQUMwX01FTTsKLQl1MzIgd2JfZGF0YVsyXTsKLQl1MzIgdmFsOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJFbmFibGluZyBCaWdNQUNcbiIpOwotCS8qIHJlc2V0IGFuZCB1bnJlc2V0IHRoZSBCaWdNYWMgKi8KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKLQltc2xlZXAoMSk7Ci0KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1NFVCwKLQkgICAgICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9CTUFDMCA8PCBwb3J0KSk7Ci0KLQkvKiBlbmFibGUgYWNjZXNzIGZvciBibWFjIHJlZ2lzdGVycyAqLwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9SRUdTX09VVF9FTiArIHBvcnQqNCwgMHgxKTsKLQotCS8qIFhHWFMgY29udHJvbCAqLwotCXdiX2RhdGFbMF0gPSAweDNjOwotCXdiX2RhdGFbMV0gPSAwOwotCVJFR19XUl9ETUFFKGJwLCBibWFjX2FkZHIgKwotCQkgICAgICBCSUdNQUNfUkVHSVNURVJfQk1BQ19YR1hTX0NPTlRST0wsCi0JCSAgICAgIHdiX2RhdGEsIDIpOwotCi0JLyogdHggTUFDIFNBICovCi0Jd2JfZGF0YVswXSA9ICgocGFyYW1zLT5tYWNfYWRkclsyXSA8PCAyNCkgfAotCQkgICAgICAgKHBhcmFtcy0+bWFjX2FkZHJbM10gPDwgMTYpIHwKLQkJICAgICAgIChwYXJhbXMtPm1hY19hZGRyWzRdIDw8IDgpIHwKLQkJCXBhcmFtcy0+bWFjX2FkZHJbNV0pOwotCXdiX2RhdGFbMV0gPSAoKHBhcmFtcy0+bWFjX2FkZHJbMF0gPDwgOCkgfAotCQkJcGFyYW1zLT5tYWNfYWRkclsxXSk7Ci0JUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9UWF9TT1VSQ0VfQUREUiwKLQkJICAgIHdiX2RhdGEsIDIpOwotCi0JLyogdHggY29udHJvbCAqLwotCXZhbCA9IDB4YzA7Ci0JaWYgKHZhcnMtPmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9UWCkKLQkJdmFsIHw9IDB4ODAwMDAwOwotCXdiX2RhdGFbMF0gPSB2YWw7Ci0Jd2JfZGF0YVsxXSA9IDA7Ci0JUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9UWF9DT05UUk9MLAotCQkJd2JfZGF0YSwgMik7Ci0KLQkvKiBtYWMgY29udHJvbCAqLwotCXZhbCA9IDB4MzsKLQlpZiAoaXNfbGIpIHsKLQkJdmFsIHw9IDB4NDsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJlbmFibGUgYm1hYyBsb29wYmFja1xuIik7Ci0JfQotCXdiX2RhdGFbMF0gPSB2YWw7Ci0Jd2JfZGF0YVsxXSA9IDA7Ci0JUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9CTUFDX0NPTlRST0wsCi0JCSAgICB3Yl9kYXRhLCAyKTsKLQotCS8qIHNldCByeCBtdHUgKi8KLQl3Yl9kYXRhWzBdID0gRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRSArIEVUSF9PVlJFSEVBRDsKLQl3Yl9kYXRhWzFdID0gMDsKLQlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1JYX01BWF9TSVpFLAotCQkJd2JfZGF0YSwgMik7Ci0KLQkvKiByeCBjb250cm9sIHNldCB0byBkb24ndCBzdHJpcCBjcmMgKi8KLQl2YWwgPSAweDE0OwotCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfUlgpCi0JCXZhbCB8PSAweDIwOwotCXdiX2RhdGFbMF0gPSB2YWw7Ci0Jd2JfZGF0YVsxXSA9IDA7Ci0JUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9SWF9DT05UUk9MLAotCQkJd2JfZGF0YSwgMik7Ci0KLQkvKiBzZXQgdHggbXR1ICovCi0Jd2JfZGF0YVswXSA9IEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUgKyBFVEhfT1ZSRUhFQUQ7Ci0Jd2JfZGF0YVsxXSA9IDA7Ci0JUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9UWF9NQVhfU0laRSwKLQkJCXdiX2RhdGEsIDIpOwotCi0JLyogc2V0IGNudCBtYXggc2l6ZSAqLwotCXdiX2RhdGFbMF0gPSBFVEhfTUFYX0pVTUJPX1BBQ0tFVF9TSVpFICsgRVRIX09WUkVIRUFEOwotCXdiX2RhdGFbMV0gPSAwOwotCVJFR19XUl9ETUFFKGJwLCBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfQ05UX01BWF9TSVpFLAotCQkgICAgd2JfZGF0YSwgMik7Ci0KLQkvKiBjb25maWd1cmUgc2FmYyAqLwotCXdiX2RhdGFbMF0gPSAweDEwMDAyMDA7Ci0Jd2JfZGF0YVsxXSA9IDA7Ci0JUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9SWF9MTEZDX01TR19GTERTLAotCQkgICAgd2JfZGF0YSwgMik7Ci0JLyogZml4IGZvciBlbXVsYXRpb24gKi8KLQlpZiAoQ0hJUF9SRVZfSVNfRU1VTChicCkpIHsKLQkJd2JfZGF0YVswXSA9IDB4ZjAwMDsKLQkJd2JfZGF0YVsxXSA9IDA7Ci0JCVJFR19XUl9ETUFFKGJwLAotCQkJICAgIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9UWF9QQVVTRV9USFJFU0hPTEQsCi0JCQkgICAgd2JfZGF0YSwgMik7Ci0JfQotCi0JUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArIHBvcnQqNCwgMHgxKTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYU19MQU5FX1NFTF9QMCArIHBvcnQqNCwgMHgwKTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX1BPUlQgKyBwb3J0KjQsIDB4MCk7Ci0JdmFsID0gMDsKLQlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQotCQl2YWwgPSAxOwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIHZhbCk7Ci0JUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19FTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDB4MCk7Ci0JUkVHX1dSKGJwLCBOSUdfUkVHX0VNQUMwX0lOX0VOICsgcG9ydCo0LCAweDApOwotCVJFR19XUihicCwgTklHX1JFR19FTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIDB4MCk7Ci0JUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX0lOX0VOICsgcG9ydCo0LCAweDEpOwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDB4MSk7Ci0KLQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0JNQUM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3BoeV9kZWFzc2VydChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggcGh5X2ZsYWdzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiB2YWw7Ci0KLQlpZiAocGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgewotCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X3BoeV9kZWFzc2VydDpYR1hTXG4iKTsKLQkJdmFsID0gWEdYU19SRVNFVF9CSVRTOwotCi0JfSBlbHNlIHsgLyogU2VyRGVzICovCi0JCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfcGh5X2RlYXNzZXJ0OlNlckRlc1xuIik7Ci0JCXZhbCA9IFNFUkRFU19SRVNFVF9CSVRTOwotCX0KLQotCXZhbCA9IHZhbCA8PCAocGFyYW1zLT5wb3J0KjE2KTsKLQotCS8qIHJlc2V0IGFuZCB1bnJlc2V0IHRoZSBTZXJEZXMvWEdYUyAqLwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzNfQ0xFQVIsCi0JCSAgICB2YWwpOwotCXVkZWxheSg1MDApOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzNfU0VULAotCQkgICAgdmFsKTsKLQlibngyeF9zZXRfcGh5X21kaW8ocGFyYW1zLCBwaHlfZmxhZ3MpOwotfQotCi12b2lkIGJueDJ4X2xpbmtfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICBzdHJ1Y3QgbGlua192YXJzICAgKnZhcnMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggbGlua18xMGc7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQotCWlmIChwYXJhbXMtPnN3aXRjaF9jZmcgPT0gIFNXSVRDSF9DRkdfMUcpCi0JCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9TRVJERVNfRkxBRzsKLQllbHNlCi0JCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7Ci0JdmFycy0+bGlua19zdGF0dXMgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCi0JCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKLQkJCQkJICAgcG9ydF9tYltwb3J0XS5saW5rX3N0YXR1cykpOwotCi0JdmFycy0+bGlua191cCA9ICh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX0xJTktfVVApOwotCi0JaWYgKHZhcnMtPmxpbmtfdXApIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayB1cFxuIik7Ci0KLQkJdmFycy0+cGh5X2xpbmtfdXAgPSAxOwotCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJc3dpdGNoICh2YXJzLT5saW5rX3N0YXR1cyAmCi0JCQkJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfTUFTSykgewotCQkJY2FzZSBMSU5LXzEwVEhEOgotCQkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9IQUxGOwotCQkJCS8qIGZhbGwgdGhydSAqLwotCQkJY2FzZSBMSU5LXzEwVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBMSU5LXzEwMFRYSEQ6Ci0JCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0JCQkJLyogZmFsbCB0aHJ1ICovCi0JCQljYXNlIExJTktfMTAwVDQ6Ci0JCQljYXNlIExJTktfMTAwVFhGRDoKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMTAwMFRIRDoKLQkJCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQkJCQkvKiBmYWxsIHRocnUgKi8KLQkJCWNhc2UgTElOS18xMDAwVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMjUwMFRIRDoKLQkJCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQkJCQkvKiBmYWxsIHRocnUgKi8KLQkJCWNhc2UgTElOS18yNTAwVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8yNTAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMTBHVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBMSU5LXzEyR1RGRDoKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTIwMDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTElOS18xMl81R1RGRDoKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTI1MDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTElOS18xM0dURkQ6Ci0JCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEzMDAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMTVHVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xNTAwMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBMSU5LXzE2R1RGRDoKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTYwMDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodmFycy0+bGlua19zdGF0dXMgJiBMSU5LX1NUQVRVU19UWF9GTE9XX0NPTlRST0xfRU5BQkxFRCkKLQkJCXZhcnMtPmZsb3dfY3RybCB8PSBCTlgyWF9GTE9XX0NUUkxfVFg7Ci0JCWVsc2UKLQkJCXZhcnMtPmZsb3dfY3RybCAmPSB+Qk5YMlhfRkxPV19DVFJMX1RYOwotCi0JCWlmICh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX1JYX0ZMT1dfQ09OVFJPTF9FTkFCTEVEKQotCQkJdmFycy0+Zmxvd19jdHJsIHw9IEJOWDJYX0ZMT1dfQ1RSTF9SWDsKLQkJZWxzZQotCQkJdmFycy0+Zmxvd19jdHJsICY9IH5CTlgyWF9GTE9XX0NUUkxfUlg7Ci0KLQkJaWYgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsKLQkJCWlmICh2YXJzLT5saW5lX3NwZWVkICYmCi0JCQkgICAgKCh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwKSB8fAotCQkJICAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDApKSkgewotCQkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFycy0+cGh5X2ZsYWdzICY9IH5QSFlfU0dNSUlfRkxBRzsKLQkJCX0KLQkJfQotCi0JCS8qIGFueXRoaW5nIDEwIGFuZCBvdmVyIHVzZXMgdGhlIGJtYWMgKi8KLQkJbGlua18xMGcgPSAoKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTAwMDApIHx8Ci0JCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTIwMDApIHx8Ci0JCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTI1MDApIHx8Ci0JCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTMwMDApIHx8Ci0JCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTUwMDApIHx8Ci0JCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTYwMDApKTsKLQkJaWYgKGxpbmtfMTBnKQotCQkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9CTUFDOwotCQllbHNlCi0JCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0VNQUM7Ci0KLQl9IGVsc2UgeyAvKiBsaW5rIGRvd24gKi8KLQkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayBkb3duXG4iKTsKLQotCQl2YXJzLT5waHlfbGlua191cCA9IDA7Ci0KLQkJdmFycy0+bGluZV9zcGVlZCA9IDA7Ci0JCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOwotCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKLQotCQkvKiBpbmRpY2F0ZSBubyBtYWMgYWN0aXZlICovCi0JCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfTk9ORTsKLQl9Ci0KLQlEUChORVRJRl9NU0dfTElOSywgImxpbmtfc3RhdHVzIDB4JXggIHBoeV9saW5rX3VwICV4XG4iLAotCQkgdmFycy0+bGlua19zdGF0dXMsIHZhcnMtPnBoeV9saW5rX3VwKTsKLQlEUChORVRJRl9NU0dfTElOSywgImxpbmVfc3BlZWQgJXggIGR1cGxleCAleCAgZmxvd19jdHJsIDB4JXhcbiIsCi0JCSB2YXJzLT5saW5lX3NwZWVkLCB2YXJzLT5kdXBsZXgsIHZhcnMtPmZsb3dfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9tbmcoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUzMiBsaW5rX3N0YXR1cykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQotCVJFR19XUihicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKLQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKLQkJCSAgICBwb3J0X21iW3BhcmFtcy0+cG9ydF0ubGlua19zdGF0dXMpLAotCQkJbGlua19zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9ibWFjX3J4X2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCkKLXsKLQl1MzIgYm1hY19hZGRyID0gcG9ydCA/IE5JR19SRUdfSU5HUkVTU19CTUFDMV9NRU0gOgotCQlOSUdfUkVHX0lOR1JFU1NfQk1BQzBfTUVNOwotCXUzMiB3Yl9kYXRhWzJdOwotCXUzMiBuaWdfYm1hY19lbmFibGUgPSBSRUdfUkQoYnAsIE5JR19SRUdfQk1BQzBfUkVHU19PVVRfRU4gKyBwb3J0KjQpOwotCi0JLyogT25seSBpZiB0aGUgYm1hYyBpcyBvdXQgb2YgcmVzZXQgKi8KLQlpZiAoUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMikgJgotCQkJKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9CTUFDMCA8PCBwb3J0KSAmJgotCSAgICBuaWdfYm1hY19lbmFibGUpIHsKLQotCQkvKiBDbGVhciBSeCBFbmFibGUgYml0IGluIEJNQUNfQ09OVFJPTCByZWdpc3RlciAqLwotCQlSRUdfUkRfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX0JNQUNfQ09OVFJPTCwKLQkJCSAgICB3Yl9kYXRhLCAyKTsKLQkJd2JfZGF0YVswXSAmPSB+Qk1BQ19DT05UUk9MX1JYX0VOQUJMRTsKLQkJUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9CTUFDX0NPTlRST0wsCi0JCQkgICAgd2JfZGF0YSwgMik7Ci0KLQkJbXNsZWVwKDEpOwotCX0KLX0KLQotc3RhdGljIHU4IGJueDJ4X3BiZl91cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUzMiBmbG93X2N0cmwsCi0JCQkgdTMyIGxpbmVfc3BlZWQpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1MzIgaW5pdF9jcmQsIGNyZDsKLQl1MzIgY291bnQgPSAxMDAwOwotCi0JLyogZGlzYWJsZSBwb3J0ICovCi0JUkVHX1dSKGJwLCBQQkZfUkVHX0RJU0FCTEVfTkVXX1RBU0tfUFJPQ19QMCArIHBvcnQqNCwgMHgxKTsKLQotCS8qIHdhaXQgZm9yIGluaXQgY3JlZGl0ICovCi0JaW5pdF9jcmQgPSBSRUdfUkQoYnAsIFBCRl9SRUdfUDBfSU5JVF9DUkQgKyBwb3J0KjQpOwotCWNyZCA9IFJFR19SRChicCwgUEJGX1JFR19QMF9DUkVESVQgKyBwb3J0KjgpOwotCURQKE5FVElGX01TR19MSU5LLCAiaW5pdF9jcmQgMHgleCAgY3JkIDB4JXhcbiIsIGluaXRfY3JkLCBjcmQpOwotCi0Jd2hpbGUgKChpbml0X2NyZCAhPSBjcmQpICYmIGNvdW50KSB7Ci0JCW1zbGVlcCg1KTsKLQotCQljcmQgPSBSRUdfUkQoYnAsIFBCRl9SRUdfUDBfQ1JFRElUICsgcG9ydCo4KTsKLQkJY291bnQtLTsKLQl9Ci0JY3JkID0gUkVHX1JEKGJwLCBQQkZfUkVHX1AwX0NSRURJVCArIHBvcnQqOCk7Ci0JaWYgKGluaXRfY3JkICE9IGNyZCkgewotCQlEUChORVRJRl9NU0dfTElOSywgIkJVRyEgaW5pdF9jcmQgMHgleCAhPSBjcmQgMHgleFxuIiwKLQkJCSAgaW5pdF9jcmQsIGNyZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChmbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfUlggfHwKLQkgICAgbGluZV9zcGVlZCA9PSBTUEVFRF8xMCB8fAotCSAgICBsaW5lX3NwZWVkID09IFNQRUVEXzEwMCB8fAotCSAgICBsaW5lX3NwZWVkID09IFNQRUVEXzEwMDAgfHwKLQkgICAgbGluZV9zcGVlZCA9PSBTUEVFRF8yNTAwKSB7Ci0JCVJFR19XUihicCwgUEJGX1JFR19QMF9QQVVTRV9FTkFCTEUgKyBwb3J0KjQsIDEpOwotCQkvKiB1cGRhdGUgdGhyZXNob2xkICovCi0JCVJFR19XUihicCwgUEJGX1JFR19QMF9BUkJfVEhSU0ggKyBwb3J0KjQsIDApOwotCQkvKiB1cGRhdGUgaW5pdCBjcmVkaXQgKi8KLQkJaW5pdF9jcmQgPSA3Nzg7IAkvKiAoODAwLTE4LTQpICovCi0KLQl9IGVsc2UgewotCQl1MzIgdGhyZXNoID0gKEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUgKwotCQkJICAgICAgRVRIX09WUkVIRUFEKS8xNjsKLQkJUkVHX1dSKGJwLCBQQkZfUkVHX1AwX1BBVVNFX0VOQUJMRSArIHBvcnQqNCwgMCk7Ci0JCS8qIHVwZGF0ZSB0aHJlc2hvbGQgKi8KLQkJUkVHX1dSKGJwLCBQQkZfUkVHX1AwX0FSQl9USFJTSCArIHBvcnQqNCwgdGhyZXNoKTsKLQkJLyogdXBkYXRlIGluaXQgY3JlZGl0ICovCi0JCXN3aXRjaCAobGluZV9zcGVlZCkgewotCQljYXNlIFNQRUVEXzEwMDAwOgotCQkJaW5pdF9jcmQgPSB0aHJlc2ggKyA1NTMgLSAyMjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1BFRURfMTIwMDA6Ci0JCQlpbml0X2NyZCA9IHRocmVzaCArIDY2NCAtIDIyOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEVFRF8xMzAwMDoKLQkJCWluaXRfY3JkID0gdGhyZXNoICsgNzQyIC0gMjI7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUVEXzE2MDAwOgotCQkJaW5pdF9jcmQgPSB0aHJlc2ggKyA3NzggLSAyMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIGxpbmVfc3BlZWQgMHgleFxuIiwKLQkJCQkgIGxpbmVfc3BlZWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JUkVHX1dSKGJwLCBQQkZfUkVHX1AwX0lOSVRfQ1JEICsgcG9ydCo0LCBpbml0X2NyZCk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJQQkYgdXBkYXRlZCB0byBzcGVlZCAlZCBjcmVkaXQgJWRcbiIsCi0JCSBsaW5lX3NwZWVkLCBpbml0X2NyZCk7Ci0KLQkvKiBwcm9iZSB0aGUgY3JlZGl0IGNoYW5nZXMgKi8KLQlSRUdfV1IoYnAsIFBCRl9SRUdfSU5JVF9QMCArIHBvcnQqNCwgMHgxKTsKLQltc2xlZXAoNSk7Ci0JUkVHX1dSKGJwLCBQQkZfUkVHX0lOSVRfUDAgKyBwb3J0KjQsIDB4MCk7Ci0KLQkvKiBlbmFibGUgcG9ydCAqLwotCVJFR19XUihicCwgUEJGX1JFR19ESVNBQkxFX05FV19UQVNLX1BST0NfUDAgKyBwb3J0KjQsIDB4MCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgYm54MnhfZ2V0X2VtYWNfYmFzZShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgZXh0X3BoeV90eXBlLCB1OCBwb3J0KQotewotCXUzMiBlbWFjX2Jhc2U7Ci0KLQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgewotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgotCQkvKiBBbGwgTURDL01ESU8gaXMgZGlyZWN0ZWQgdGhyb3VnaCBzaW5nbGUgRU1BQyAqLwotCQlpZiAoUkVHX1JEKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCkpCi0JCQllbWFjX2Jhc2UgPSBHUkNCQVNFX0VNQUMwOwotCQllbHNlCi0JCQllbWFjX2Jhc2UgPSBHUkNCQVNFX0VNQUMxOwotCQlicmVhazsKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6Ci0JCWVtYWNfYmFzZSA9IChwb3J0KSA/IEdSQ0JBU0VfRU1BQzAgOiBHUkNCQVNFX0VNQUMxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllbWFjX2Jhc2UgPSAocG9ydCkgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBlbWFjX2Jhc2U7Ci0KLX0KLQotdTggYm54MnhfY2w0NV93cml0ZShzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LCB1MzIgZXh0X3BoeV90eXBlLAotCQkgIHU4IHBoeV9hZGRyLCB1OCBkZXZhZCwgdTE2IHJlZywgdTE2IHZhbCkKLXsKLQl1MzIgdG1wLCBzYXZlZF9tb2RlOwotCXU4IGksIHJjID0gMDsKLQl1MzIgbWRpb19jdHJsID0gYm54MnhfZ2V0X2VtYWNfYmFzZShicCwgZXh0X3BoeV90eXBlLCBwb3J0KTsKLQotCS8qIHNldCBjbGF1c2UgNDUgbW9kZSwgc2xvdyBkb3duIHRoZSBNRElPIGNsb2NrIHRvIDIuNU1IegotCSAqIChhIHZhbHVlIG9mIDQ5PT0weDMxKSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIEFVVE8gcG9sbCBpcyBvZmYKLQkgKi8KLQotCXNhdmVkX21vZGUgPSBSRUdfUkQoYnAsIG1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKLQl0bXAgPSBzYXZlZF9tb2RlICYgfihFTUFDX01ESU9fTU9ERV9BVVRPX1BPTEwgfAotCQkJICAgICBFTUFDX01ESU9fTU9ERV9DTE9DS19DTlQpOwotCXRtcCB8PSAoRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1IHwKLQkJKDQ5IDw8IEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9CSVRTSElGVCkpOwotCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHRtcCk7Ci0JUkVHX1JEKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7Ci0JdWRlbGF5KDQwKTsKLQotCS8qIGFkZHJlc3MgKi8KLQotCXRtcCA9ICgocGh5X2FkZHIgPDwgMjEpIHwgKGRldmFkIDw8IDE2KSB8IHJlZyB8Ci0JICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfQUREUkVTUyB8Ci0JICAgICAgIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpOwotCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0sIHRtcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgewotCQl1ZGVsYXkoMTApOwotCi0JCXRtcCA9IFJFR19SRChicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0pOwotCQlpZiAoISh0bXAgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSkgewotCQkJdWRlbGF5KDUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHRtcCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJ3cml0ZSBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCS8qIGRhdGEgKi8KLQkJdG1wID0gKChwaHlfYWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgdmFsIHwKLQkJICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfNDUgfAotCQkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7Ci0JCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0sIHRtcCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCXVkZWxheSgxMCk7Ci0KLQkJCXRtcCA9IFJFR19SRChicCwgbWRpb19jdHJsICsKLQkJCQkJIEVNQUNfUkVHX0VNQUNfTURJT19DT01NKTsKLQkJCWlmICghKHRtcCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7Ci0JCQkJdWRlbGF5KDUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICh0bXAgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIndyaXRlIHBoeSByZWdpc3RlciBmYWlsZWRcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JfQotCi0JLyogUmVzdG9yZSB0aGUgc2F2ZWQgbW9kZSAqLwotCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHNhdmVkX21vZGUpOwotCi0JcmV0dXJuIHJjOwotfQotCi11OCBibngyeF9jbDQ1X3JlYWQoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwgdTMyIGV4dF9waHlfdHlwZSwKLQkJIHU4IHBoeV9hZGRyLCB1OCBkZXZhZCwgdTE2IHJlZywgdTE2ICpyZXRfdmFsKQotewotCXUzMiB2YWwsIHNhdmVkX21vZGU7Ci0JdTE2IGk7Ci0JdTggcmMgPSAwOwotCi0JdTMyIG1kaW9fY3RybCA9IGJueDJ4X2dldF9lbWFjX2Jhc2UoYnAsIGV4dF9waHlfdHlwZSwgcG9ydCk7Ci0JLyogc2V0IGNsYXVzZSA0NSBtb2RlLCBzbG93IGRvd24gdGhlIE1ESU8gY2xvY2sgdG8gMi41TUh6Ci0JICogKGEgdmFsdWUgb2YgNDk9PTB4MzEpIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgQVVUTyBwb2xsIGlzIG9mZgotCSAqLwotCi0Jc2F2ZWRfbW9kZSA9IFJFR19SRChicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUpOwotCXZhbCA9IHNhdmVkX21vZGUgJiAoKEVNQUNfTURJT19NT0RFX0FVVE9fUE9MTCB8Ci0JCQkgICAgIEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVCkpOwotCXZhbCB8PSAoRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1IHwKLQkJKDQ5TCA8PCBFTUFDX01ESU9fTU9ERV9DTE9DS19DTlRfQklUU0hJRlQpKTsKLQlSRUdfV1IoYnAsIG1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCB2YWwpOwotCVJFR19SRChicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUpOwotCXVkZWxheSg0MCk7Ci0KLQkvKiBhZGRyZXNzICovCi0JdmFsID0gKChwaHlfYWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgcmVnIHwKLQkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTIHwKLQkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7Ci0JUkVHX1dSKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdmFsKTsKLQotCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0JCXVkZWxheSgxMCk7Ci0KLQkJdmFsID0gUkVHX1JEKGJwLCBtZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSk7Ci0JCWlmICghKHZhbCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7Ci0JCQl1ZGVsYXkoNSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAodmFsICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkgewotCQlEUChORVRJRl9NU0dfTElOSywgInJlYWQgcGh5IHJlZ2lzdGVyIGZhaWxlZFxuIik7Ci0KLQkJKnJldF92YWwgPSAwOwotCQlyYyA9IC1FRkFVTFQ7Ci0KLQl9IGVsc2UgewotCQkvKiBkYXRhICovCi0JCXZhbCA9ICgocGh5X2FkZHIgPDwgMjEpIHwgKGRldmFkIDw8IDE2KSB8Ci0JCSAgICAgICBFTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQURfNDUgfAotCQkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7Ci0JCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0sIHZhbCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCXVkZWxheSgxMCk7Ci0KLQkJCXZhbCA9IFJFR19SRChicCwgbWRpb19jdHJsICsKLQkJCQkJICBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSk7Ci0JCQlpZiAoISh2YWwgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSkgewotCQkJCSpyZXRfdmFsID0gKHUxNikodmFsICYgRU1BQ19NRElPX0NPTU1fREFUQSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhbCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKLQkJCURQKE5FVElGX01TR19MSU5LLCAicmVhZCBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQotCQkJKnJldF92YWwgPSAwOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JfQotCi0JLyogUmVzdG9yZSB0aGUgc2F2ZWQgbW9kZSAqLwotCVJFR19XUihicCwgbWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHNhdmVkX21vZGUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfYWVyX21tZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICBzdHJ1Y3QgbGlua192YXJzICAgKnZhcnMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTMyIHNlcl9sYW5lOwotCXUxNiBvZmZzZXQ7Ci0KLQlzZXJfbGFuZSA9ICgocGFyYW1zLT5sYW5lX2NvbmZpZyAmCi0JCSAgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfTUFTSykgPj4KLQkJICAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9TSElGVCk7Ci0KLQlvZmZzZXQgPSAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgPwotCQkocGFyYW1zLT5waHlfYWRkciArIHNlcl9sYW5lKSA6IDA7Ci0KLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQUVSX0JMT0NLLAotCQkJICAgICAgTURJT19BRVJfQkxPQ0tfQUVSX1JFRywgMHgzODAwICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X21hc3Rlcl9sbihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgbmV3X21hc3Rlcl9sbiwgc2VyX2xhbmU7Ci0Jc2VyX2xhbmUgPSAgKChwYXJhbXMtPmxhbmVfY29uZmlnICYKLQkJICAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9NQVNLKSA+PgotCQkgICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKLQotCS8qIHNldCB0aGUgbWFzdGVyX2xuIGZvciBBTiAqLwotCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiwKLQkJCSAgICAgIE1ESU9fWEdYU19CTE9DSzJfVEVTVF9NT0RFX0xBTkUsCi0JCQkgICAgICAmbmV3X21hc3Rlcl9sbik7Ci0KLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfWEdYU19CTE9DSzIgLAotCQkJICAgICAgTURJT19YR1hTX0JMT0NLMl9URVNUX01PREVfTEFORSwKLQkJCSAgICAgIChuZXdfbWFzdGVyX2xuIHwgc2VyX2xhbmUpKTsKLX0KLQotc3RhdGljIHU4IGJueDJ4X3Jlc2V0X3VuaWNvcmUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IG1paV9jb250cm9sOwotCXUxNiBpOwotCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAotCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwgJm1paV9jb250cm9sKTsKLQotCS8qIHJlc2V0IHRoZSB1bmljb3JlICovCi0JQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAotCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKLQkJCSAgICAgIChtaWlfY29udHJvbCB8Ci0JCQkgICAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX1JFU0VUKSk7Ci0JaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzFHKQotCQlibngyeF9zZXRfc2VyZGVzX2FjY2VzcyhwYXJhbXMpOwotCi0JLyogd2FpdCBmb3IgdGhlIHJlc2V0IHRvIHNlbGYgY2xlYXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTURJT19BQ0NFU1NfVElNRU9VVDsgaSsrKSB7Ci0JCXVkZWxheSg1KTsKLQotCQkvKiB0aGUgcmVzZXQgZXJhc2VkIHRoZSBwcmV2aW91cyBiYW5rIHZhbHVlICovCi0JCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCi0JCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAotCQkJICAgICAgJm1paV9jb250cm9sKTsKLQotCQlpZiAoIShtaWlfY29udHJvbCAmIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9SRVNFVCkpIHsKLQkJCXVkZWxheSg1KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJCVUchIFhHWFMgaXMgc3RpbGwgaW4gcmVzZXQhXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKLQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfc3dhcF9sYW5lcyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQkvKiBFYWNoIHR3byBiaXRzIHJlcHJlc2VudHMgYSBsYW5lIG51bWJlcjoKLQkgICBObyBzd2FwIGlzIDAxMjMgPT4gMHgxYiBubyBuZWVkIHRvIGVuYWJsZSB0aGUgc3dhcCAqLwotCXUxNiBzZXJfbGFuZSwgcnhfbGFuZV9zd2FwLCB0eF9sYW5lX3N3YXA7Ci0KLQlzZXJfbGFuZSA9ICgocGFyYW1zLT5sYW5lX2NvbmZpZyAmCi0JCQkgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfTUFTSykgPj4KLQkJCVBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKLQlyeF9sYW5lX3N3YXAgPSAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgotCQkJICAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1JYX01BU0spID4+Ci0JCQkgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19SWF9TSElGVCk7Ci0JdHhfbGFuZV9zd2FwID0gKChwYXJhbXMtPmxhbmVfY29uZmlnICYKLQkJCSAgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19UWF9NQVNLKSA+PgotCQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfVFhfU0hJRlQpOwotCi0JaWYgKHJ4X2xhbmVfc3dhcCAhPSAweDFiKSB7Ci0JCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCQkgICAgTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiwKLQkJCQkgICAgTURJT19YR1hTX0JMT0NLMl9SWF9MTl9TV0FQLAotCQkJCSAgICAocnhfbGFuZV9zd2FwIHwKLQkJCQkgICAgTURJT19YR1hTX0JMT0NLMl9SWF9MTl9TV0FQX0VOQUJMRSB8Ci0JCQkJICAgIE1ESU9fWEdYU19CTE9DSzJfUlhfTE5fU1dBUF9GT1JDRV9FTkFCTEUpKTsKLQl9IGVsc2UgewotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiwKLQkJCQkgICAgICBNRElPX1hHWFNfQkxPQ0syX1JYX0xOX1NXQVAsIDApOwotCX0KLQotCWlmICh0eF9sYW5lX3N3YXAgIT0gMHgxYikgewotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiwKLQkJCQkgICAgICBNRElPX1hHWFNfQkxPQ0syX1RYX0xOX1NXQVAsCi0JCQkJICAgICAgKHR4X2xhbmVfc3dhcCB8Ci0JCQkJICAgICAgIE1ESU9fWEdYU19CTE9DSzJfVFhfTE5fU1dBUF9FTkFCTEUpKTsKLQl9IGVsc2UgewotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19YR1hTX0JMT0NLMiwKLQkJCQkgICAgICBNRElPX1hHWFNfQkxPQ0syX1RYX0xOX1NXQVAsIDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X3BhcmFsbGVsX2RldGVjdGlvbihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgICAgICAgdTggICAgICAgCSBwaHlfZmxhZ3MpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IGNvbnRyb2wyOwotCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAotCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wyLAotCQkJICAgICAgJmNvbnRyb2wyKTsKLQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcpCi0JCWNvbnRyb2wyIHw9IE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMl9QUkxfRFRfRU47Ci0JZWxzZQotCQljb250cm9sMiAmPSB+TURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wyX1BSTF9EVF9FTjsKLQlEUChORVRJRl9NU0dfTElOSywgInBhcmFtcy0+c3BlZWRfY2FwX21hc2sgPSAweCV4LCBjb250cm9sMiA9IDB4JXhcbiIsCi0JCXBhcmFtcy0+c3BlZWRfY2FwX21hc2ssIGNvbnRyb2wyKTsKLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCi0JCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDIsCi0JCQkgICAgICBjb250cm9sMik7Ci0KLQlpZiAoKHBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpICYmCi0JICAgICAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCi0JCSAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwRykpIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTXG4iKTsKLQotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJTURJT19SRUdfQkFOS18xMEdfUEFSQUxMRUxfREVURUNULAotCQkJCU1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19MSU5LLAotCQkJCU1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19MSU5LX0NOVCk7Ci0KLQkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCU1ESU9fUkVHX0JBTktfMTBHX1BBUkFMTEVMX0RFVEVDVCwKLQkJCQlNRElPXzEwR19QQVJBTExFTF9ERVRFQ1RfUEFSX0RFVF8xMEdfQ09OVFJPTCwKLQkJCQkmY29udHJvbDIpOwotCi0KLQkJY29udHJvbDIgfD0KLQkJICAgIE1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19DT05UUk9MX1BBUkRFVDEwR19FTjsKLQotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJTURJT19SRUdfQkFOS18xMEdfUEFSQUxMRUxfREVURUNULAotCQkJCU1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19DT05UUk9MLAotCQkJCWNvbnRyb2wyKTsKLQotCQkvKiBEaXNhYmxlIHBhcmFsbGVsIGRldGVjdGlvbiBvZiBIaUcgKi8KLQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCU1ESU9fUkVHX0JBTktfWEdYU19CTE9DSzIsCi0JCQkJTURJT19YR1hTX0JMT0NLMl9VTklDT1JFX01PREVfMTBHLAotCQkJCU1ESU9fWEdYU19CTE9DSzJfVU5JQ09SRV9NT0RFXzEwR19DWDRfWEdYUyB8Ci0JCQkJTURJT19YR1hTX0JMT0NLMl9VTklDT1JFX01PREVfMTBHX0hJR0lHX1hHWFMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2F1dG9uZWcoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJCSAgICB1OCBlbmFibGVfY2w3MykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgcmVnX3ZhbDsKLQotCS8qIENMMzcgQXV0b25lZyAqLwotCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAotCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwgJnJlZ192YWwpOwotCi0JLyogQ0wzNyBBdXRvbmVnIEVuYWJsZWQgKi8KLQlpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKLQkJcmVnX3ZhbCB8PSBNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfQU5fRU47Ci0JZWxzZSAvKiBDTDM3IEF1dG9uZWcgRGlzYWJsZWQgKi8KLQkJcmVnX3ZhbCAmPSB+KE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9BTl9FTiB8Ci0JCQkgICAgIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9SRVNUQVJUX0FOKTsKLQotCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCSAgICAgIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsIHJlZ192YWwpOwotCi0JLyogRW5hYmxlL0Rpc2FibGUgQXV0b2RldGVjdGlvbiAqLwotCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAotCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxLCAmcmVnX3ZhbCk7Ci0JcmVnX3ZhbCAmPSB+KE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9TSUdOQUxfREVURUNUX0VOIHwKLQkJICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9JTlZFUlRfU0lHTkFMX0RFVEVDVCk7Ci0JcmVnX3ZhbCB8PSBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDFfRklCRVJfTU9ERTsKLQlpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKLQkJcmVnX3ZhbCB8PSBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDFfQVVUT0RFVDsKLQllbHNlCi0JCXJlZ192YWwgJj0gfk1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9BVVRPREVUOwotCi0JQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAotCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxLCByZWdfdmFsKTsKLQotCS8qIEVuYWJsZSBUZXRvbklJIGFuZCBCQU0gYXV0b25lZyAqLwotCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19CQU1fTkVYVF9QQUdFLAotCQkJICAgICAgTURJT19CQU1fTkVYVF9QQUdFX01QNV9ORVhUX1BBR0VfQ1RSTCwKLQkJCSAgJnJlZ192YWwpOwotCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSB7Ci0JCS8qIEVuYWJsZSBCQU0gYW5lZyBNb2RlIGFuZCBUZXRvbklJIGFuZWcgTW9kZSAqLwotCQlyZWdfdmFsIHw9IChNRElPX0JBTV9ORVhUX1BBR0VfTVA1X05FWFRfUEFHRV9DVFJMX0JBTV9NT0RFIHwKLQkJCSAgICBNRElPX0JBTV9ORVhUX1BBR0VfTVA1X05FWFRfUEFHRV9DVFJMX1RFVE9OX0FOKTsKLQl9IGVsc2UgewotCQkvKiBUZXRvbklJIGFuZCBCQU0gQXV0b25lZyBEaXNhYmxlZCAqLwotCQlyZWdfdmFsICY9IH4oTURJT19CQU1fTkVYVF9QQUdFX01QNV9ORVhUX1BBR0VfQ1RSTF9CQU1fTU9ERSB8Ci0JCQkgICAgIE1ESU9fQkFNX05FWFRfUEFHRV9NUDVfTkVYVF9QQUdFX0NUUkxfVEVUT05fQU4pOwotCX0KLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQkFNX05FWFRfUEFHRSwKLQkJCSAgICAgIE1ESU9fQkFNX05FWFRfUEFHRV9NUDVfTkVYVF9QQUdFX0NUUkwsCi0JCQkgICAgICByZWdfdmFsKTsKLQotCWlmIChlbmFibGVfY2w3MykgewotCQkvKiBFbmFibGUgQ2w3MyBGU00gc3RhdHVzIGJpdHMgKi8KLQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19VU0VSQjAsCi0JCQkJICAgIE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19VQ1RSTCwKLQkJCQkgICAgICAweGUpOwotCi0JCS8qIEVuYWJsZSBCQU0gU3RhdGlvbiBNYW5hZ2VyKi8KLQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCXBhcmFtcy0+cGh5X2FkZHIsCi0JCQlNRElPX1JFR19CQU5LX0NMNzNfVVNFUkIwLAotCQkJTURJT19DTDczX1VTRVJCMF9DTDczX0JBTV9DVFJMMSwKLQkJCU1ESU9fQ0w3M19VU0VSQjBfQ0w3M19CQU1fQ1RSTDFfQkFNX0VOIHwKLQkJCU1ESU9fQ0w3M19VU0VSQjBfQ0w3M19CQU1fQ1RSTDFfQkFNX1NUQVRJT05fTU5HUl9FTiB8Ci0JCQlNRElPX0NMNzNfVVNFUkIwX0NMNzNfQkFNX0NUUkwxX0JBTV9OUF9BRlRFUl9CUF9FTik7Ci0KLQkJLyogQWR2ZXJ0aXNlIENMNzMgbGluayBzcGVlZHMgKi8KLQkJCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjEsCi0JCQkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMiwKLQkJCQkJICAgICAgJnJlZ192YWwpOwotCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCi0JCSAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwRykKLQkJCXJlZ192YWwgfD0gTURJT19DTDczX0lFRUVCMV9BTl9BRFYyX0FEVlJfMTBHX0tYNDsKLQkJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgotCQkgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykKLQkJCXJlZ192YWwgfD0gTURJT19DTDczX0lFRUVCMV9BTl9BRFYyX0FEVlJfMTAwME1fS1g7Ci0KLQkJCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjEsCi0JCQkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMiwKLQkJCQkgICAgICByZWdfdmFsKTsKLQotCQkvKiBDTDczIEF1dG9uZWcgRW5hYmxlZCAqLwotCQlyZWdfdmFsID0gTURJT19DTDczX0lFRUVCMF9DTDczX0FOX0NPTlRST0xfQU5fRU47Ci0KLQl9IGVsc2UgLyogQ0w3MyBBdXRvbmVnIERpc2FibGVkICovCi0JCXJlZ192YWwgPSAwOwotCi0JQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX0NMNzNfSUVFRUIwLAotCQkJICAgICAgTURJT19DTDczX0lFRUVCMF9DTDczX0FOX0NPTlRST0wsIHJlZ192YWwpOwotfQotCi0vKiBwcm9ncmFtIFNlckRlcywgZm9yY2VkIHNwZWVkICovCi1zdGF0aWMgdm9pZCBibngyeF9wcm9ncmFtX3NlcmRlcyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiByZWdfdmFsOwotCi0JLyogcHJvZ3JhbSBkdXBsZXgsIGRpc2FibGUgYXV0b25lZyBhbmQgc2dtaWkqLwotCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCSAgICAgIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsICZyZWdfdmFsKTsKLQlyZWdfdmFsICY9IH4oTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0ZVTExfRFVQTEVYIHwKLQkJICAgICBNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfQU5fRU4gfAotCQkgICAgIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9NQU5fU0dNSUlfU1BfTUFTSyk7Ci0JaWYgKHBhcmFtcy0+cmVxX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkKLQkJcmVnX3ZhbCB8PSBNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfRlVMTF9EVVBMRVg7Ci0JQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAotCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwgcmVnX3ZhbCk7Ci0KLQkvKiBwcm9ncmFtIHNwZWVkCi0JICAgLSBuZWVkZWQgb25seSBpZiB0aGUgc3BlZWQgaXMgZ3JlYXRlciB0aGFuIDFHICgyLjVHIG9yIDEwRykgKi8KLQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19TRVJERVNfRElHSVRBTCwKLQkJCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX01JU0MxLCAmcmVnX3ZhbCk7Ci0JLyogY2xlYXJpbmcgdGhlIHNwZWVkIHZhbHVlIGJlZm9yZSBzZXR0aW5nIHRoZSByaWdodCBzcGVlZCAqLwotCURQKE5FVElGX01TR19MSU5LLCAiTURJT19SRUdfQkFOS19TRVJERVNfRElHSVRBTCA9IDB4JXhcbiIsIHJlZ192YWwpOwotCi0JcmVnX3ZhbCAmPSB+KE1ESU9fU0VSREVTX0RJR0lUQUxfTUlTQzFfRk9SQ0VfU1BFRURfTUFTSyB8Ci0JCSAgICAgTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF9TRUwpOwotCi0JaWYgKCEoKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTAwMCkgfHwKLQkgICAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDApIHx8Ci0JICAgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTApKSkgewotCi0JCXJlZ192YWwgfD0gKE1ESU9fU0VSREVTX0RJR0lUQUxfTUlTQzFfUkVGQ0xLX1NFTF8xNTZfMjVNIHwKLQkJCSAgICBNRElPX1NFUkRFU19ESUdJVEFMX01JU0MxX0ZPUkNFX1NQRUVEX1NFTCk7Ci0JCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMDAwKQotCQkJcmVnX3ZhbCB8PQotCQkJCU1ESU9fU0VSREVTX0RJR0lUQUxfTUlTQzFfRk9SQ0VfU1BFRURfMTBHX0NYNDsKLQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTMwMDApCi0JCQlyZWdfdmFsIHw9Ci0JCQkJTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF8xM0c7Ci0JfQotCi0JQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCi0JCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9NSVNDMSwgcmVnX3ZhbCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2JyY21fY2wzN19hZHZlcnRpc21lbnQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IHZhbCA9IDA7Ci0KLQkvKiBjb25maWd1cmUgdGhlIDQ4IGJpdHMgZm9yIEJBTSBBTiAqLwotCi0JLyogc2V0IGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLwotCWlmIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8yXzVHKQotCQl2YWwgfD0gTURJT19PVkVSXzFHX1VQMV8yXzVHOwotCWlmIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcpCi0JCXZhbCB8PSBNRElPX09WRVJfMUdfVVAxXzEwRzsKLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfT1ZFUl8xRywKLQkJCSAgICAgIE1ESU9fT1ZFUl8xR19VUDEsIHZhbCk7Ci0KLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfT1ZFUl8xRywKLQkJCSAgICAgIE1ESU9fT1ZFUl8xR19VUDMsIDB4NDAwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfY2FsY19pZWVlX2FuZWdfYWR2KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1MTYgKmllZWVfZmMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JKmllZWVfZmMgPSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9GVUxMX0RVUExFWDsKLQkvKiByZXNvbHZlIHBhdXNlIG1vZGUgYW5kIGFkdmVydGlzZW1lbnQKLQkgKiBQbGVhc2UgcmVmZXIgdG8gVGFibGUgMjhCLTMgb2YgdGhlIDgwMi4zYWItMTk5OSBzcGVjICovCi0KLQlzd2l0Y2ggKHBhcmFtcy0+cmVxX2Zsb3dfY3RybCkgewotCWNhc2UgQk5YMlhfRkxPV19DVFJMX0FVVE86Ci0JCWlmIChwYXJhbXMtPnJlcV9mY19hdXRvX2FkdiA9PSBCTlgyWF9GTE9XX0NUUkxfQk9USCkgewotCQkJKmllZWVfZmMgfD0KLQkJCSAgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDsKLQkJfSBlbHNlIHsKLQkJCSppZWVlX2ZjIHw9Ci0JCSAgICAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQk5YMlhfRkxPV19DVFJMX1RYOgotCQkqaWVlZV9mYyB8PQotCQkgICAgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQVNZTU1FVFJJQzsKLQkJYnJlYWs7Ci0KLQljYXNlIEJOWDJYX0ZMT1dfQ1RSTF9SWDoKLQljYXNlIEJOWDJYX0ZMT1dfQ1RSTF9CT1RIOgotCQkqaWVlZV9mYyB8PSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIOwotCQlicmVhazsKLQotCWNhc2UgQk5YMlhfRkxPV19DVFJMX05PTkU6Ci0JZGVmYXVsdDoKLQkJKmllZWVfZmMgfD0gTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfTk9ORTsKLQkJYnJlYWs7Ci0JfQotCURQKE5FVElGX01TR19MSU5LLCAiaWVlZV9mYyA9IDB4JXhcbiIsICppZWVlX2ZjKTsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2llZWVfYW5lZ19hZHZlcnRpc21lbnQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSAgIHUxNiBpZWVlX2ZjKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiB2YWw7Ci0JLyogZm9yIEFOLCB3ZSBhcmUgYWx3YXlzIHB1Ymxpc2hpbmcgZnVsbCBkdXBsZXggKi8KLQotCUNMNDVfV1JfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCSAgICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWLCBpZWVlX2ZjKTsKLQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjEsCi0JCQkgICAgICBNRElPX0NMNzNfSUVFRUIxX0FOX0FEVjEsICZ2YWwpOwotCXZhbCAmPSB+TURJT19DTDczX0lFRUVCMV9BTl9BRFYxX1BBVVNFX0JPVEg7Ci0JdmFsIHw9ICgoaWVlZV9mYzw8MykgJiBNRElPX0NMNzNfSUVFRUIxX0FOX0FEVjFfUEFVU0VfTUFTSyk7Ci0JQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX0NMNzNfSUVFRUIxLAotCQkJICAgICAgTURJT19DTDczX0lFRUVCMV9BTl9BRFYxLCB2YWwpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9yZXN0YXJ0X2F1dG9uZWcoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IGVuYWJsZV9jbDczKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBtaWlfY29udHJvbDsKLQotCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfcmVzdGFydF9hdXRvbmVnXG4iKTsKLQkvKiBFbmFibGUgYW5kIHJlc3RhcnQgQkFNL0NMMzcgYW5lZyAqLwotCi0JaWYgKGVuYWJsZV9jbDczKSB7Ci0JCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1JFR19CQU5LX0NMNzNfSUVFRUIwLAotCQkJCSAgICAgIE1ESU9fQ0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MLAotCQkJCSAgICAgICZtaWlfY29udHJvbCk7Ci0KLQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQlwYXJhbXMtPnBoeV9hZGRyLAotCQkJCU1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjAsCi0JCQkJTURJT19DTDczX0lFRUVCMF9DTDczX0FOX0NPTlRST0wsCi0JCQkJKG1paV9jb250cm9sIHwKLQkJCQlNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTF9BTl9FTiB8Ci0JCQkJTURJT19DTDczX0lFRUVCMF9DTDczX0FOX0NPTlRST0xfUkVTVEFSVF9BTikpOwotCX0gZWxzZSB7Ci0KLQkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCi0JCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKLQkJCQkgICAgICAmbWlpX2NvbnRyb2wpOwotCQlEUChORVRJRl9NU0dfTElOSywKLQkJCSAiYm54MnhfcmVzdGFydF9hdXRvbmVnIG1paV9jb250cm9sIGJlZm9yZSA9IDB4JXhcbiIsCi0JCQkgbWlpX2NvbnRyb2wpOwotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAotCQkJCSAgICAgIChtaWlfY29udHJvbCB8Ci0JCQkJICAgICAgIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9BTl9FTiB8Ci0JCQkJICAgICAgIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9SRVNUQVJUX0FOKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9pbml0aWFsaXplX3NnbWlpX3Byb2Nlc3Moc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBjb250cm9sMTsKLQotCS8qIGluIFNHTUlJIG1vZGUsIHRoZSB1bmljb3JlIGlzIGFsd2F5cyBzbGF2ZSAqLwotCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAotCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxLAotCQkgICAgICAmY29udHJvbDEpOwotCWNvbnRyb2wxIHw9IE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9JTlZFUlRfU0lHTkFMX0RFVEVDVDsKLQkvKiBzZXQgc2dtaWkgbW9kZSAoYW5kIG5vdCBmaWJlcikgKi8KLQljb250cm9sMSAmPSB+KE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMV9GSUJFUl9NT0RFIHwKLQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0FVVE9ERVQgfAotCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDFfTVNUUl9NT0RFKTsKLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwsCi0JCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDEsCi0JCQkgICAgICBjb250cm9sMSk7Ci0KLQkvKiBpZiBmb3JjZWQgc3BlZWQgKi8KLQlpZiAoISh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSkgewotCQkvKiBzZXQgc3BlZWQsIGRpc2FibGUgYXV0b25lZyAqLwotCQl1MTYgbWlpX2NvbnRyb2w7Ci0KLQkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCi0JCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKLQkJCQkgICAgICAmbWlpX2NvbnRyb2wpOwotCQltaWlfY29udHJvbCAmPSB+KE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9BTl9FTiB8Ci0JCQkJIE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9NQU5fU0dNSUlfU1BfTUFTS3wKLQkJCQkgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0ZVTExfRFVQTEVYKTsKLQotCQlzd2l0Y2ggKHZhcnMtPmxpbmVfc3BlZWQpIHsKLQkJY2FzZSBTUEVFRF8xMDA6Ci0JCQltaWlfY29udHJvbCB8PQotCQkJCU1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9NQU5fU0dNSUlfU1BfMTAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1BFRURfMTAwMDoKLQkJCW1paV9jb250cm9sIHw9Ci0JCQkJTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX01BTl9TR01JSV9TUF8xMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1BFRURfMTA6Ci0JCQkvKiB0aGVyZSBpcyBub3RoaW5nIHRvIHNldCBmb3IgMTBNICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIGludmFsaWQgc3BlZWQgZm9yIFNHTUlJICovCi0JCQlEUChORVRJRl9NU0dfTElOSywgIkludmFsaWQgbGluZV9zcGVlZCAweCV4XG4iLAotCQkJCSAgdmFycy0+bGluZV9zcGVlZCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHNldHRpbmcgdGhlIGZ1bGwgZHVwbGV4ICovCi0JCWlmIChwYXJhbXMtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQltaWlfY29udHJvbCB8PQotCQkJCU1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9GVUxMX0RVUExFWDsKLQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAsCi0JCQkJICAgICAgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKLQkJCQkgICAgICBtaWlfY29udHJvbCk7Ci0KLQl9IGVsc2UgeyAvKiBBTiBtb2RlICovCi0JCS8qIGVuYWJsZSBhbmQgcmVzdGFydCBBTiAqLwotCQlibngyeF9yZXN0YXJ0X2F1dG9uZWcocGFyYW1zLCAwKTsKLQl9Ci19Ci0KLQotLyoKLSAqIGxpbmsgbWFuYWdlbWVudAotICovCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3BhdXNlX3Jlc29sdmUoc3RydWN0IGxpbmtfdmFycyAqdmFycywgdTMyIHBhdXNlX3Jlc3VsdCkKLXsJCQkJCQkvKiAgTEQJICAgIExQCSAqLwotCXN3aXRjaCAocGF1c2VfcmVzdWx0KSB7IAkJLyogQVNZTSBQIEFTWU0gUCAqLwotCWNhc2UgMHhiOiAgICAgICAJCQkvKiAgIDEgIDAgICAxICAxICovCi0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9UWDsKLQkJYnJlYWs7Ci0KLQljYXNlIDB4ZTogICAgICAgCQkJLyogICAxICAxICAgMSAgMCAqLwotCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfUlg7Ci0JCWJyZWFrOwotCi0JY2FzZSAweDU6ICAgICAgIAkJCS8qICAgMCAgMSAgIDAgIDEgKi8KLQljYXNlIDB4NzogICAgICAgCQkJLyogICAwICAxICAgMSAgMSAqLwotCWNhc2UgMHhkOiAgICAgICAJCQkvKiAgIDEgIDEgICAwICAxICovCi0JY2FzZSAweGY6ICAgICAgIAkJCS8qICAgMSAgMSAgIDEgIDEgKi8KLQkJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX0JPVEg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdTggYm54MnhfZXh0X3BoeV9yZXNvbHZlX2ZjKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBleHRfcGh5X2FkZHI7Ci0JdTE2IGxkX3BhdXNlOwkJLyogbG9jYWwgKi8KLQl1MTYgbHBfcGF1c2U7CQkvKiBsaW5rIHBhcnRuZXIgKi8KLQl1MTYgYW5fY29tcGxldGU7CS8qIEFOIGNvbXBsZXRlICovCi0JdTE2IHBhdXNlX3Jlc3VsdDsKLQl1OCByZXQgPSAwOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQlleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkvKiByZWFkIHR3aWNlICovCi0KLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCi0JCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkgICAgICBNRElPX0FOX1JFR19TVEFUVVMsICZhbl9jb21wbGV0ZSk7Ci0JYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgTURJT19BTl9ERVZBRCwKLQkJICAgICAgTURJT19BTl9SRUdfU1RBVFVTLCAmYW5fY29tcGxldGUpOwotCi0JaWYgKGFuX2NvbXBsZXRlICYgTURJT19BTl9SRUdfU1RBVFVTX0FOX0NPTVBMRVRFKSB7Ci0JCXJldCA9IDE7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkgICAgICBNRElPX0FOX1JFR19BRFZfUEFVU0UsICZsZF9wYXVzZSk7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkgICAgICBNRElPX0FOX1JFR19MUF9BVVRPX05FRywgJmxwX3BhdXNlKTsKLQkJcGF1c2VfcmVzdWx0ID0gKGxkX3BhdXNlICYKLQkJCQlNRElPX0FOX1JFR19BRFZfUEFVU0VfTUFTSykgPj4gODsKLQkJcGF1c2VfcmVzdWx0IHw9IChscF9wYXVzZSAmCi0JCQkJIE1ESU9fQU5fUkVHX0FEVl9QQVVTRV9NQVNLKSA+PiAxMDsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJFeHQgUEhZIHBhdXNlIHJlc3VsdCAweCV4XG4iLAotCQkgICBwYXVzZV9yZXN1bHQpOwotCQlibngyeF9wYXVzZV9yZXNvbHZlKHZhcnMsIHBhdXNlX3Jlc3VsdCk7Ci0JCWlmICh2YXJzLT5mbG93X2N0cmwgPT0gQk5YMlhfRkxPV19DVFJMX05PTkUgJiYKLQkJICAgICBleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MykgewotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkgICAgICBNRElPX0FOX1JFR19DTDM3X0ZDX0xELCAmbGRfcGF1c2UpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkJCSAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTFAsICZscF9wYXVzZSk7Ci0JCQlwYXVzZV9yZXN1bHQgPSAobGRfcGF1c2UgJgotCQkJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpID4+IDU7Ci0JCQlwYXVzZV9yZXN1bHQgfD0gKGxwX3BhdXNlICYKLQkJCQlNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSA+PiA3OwotCi0JCQlibngyeF9wYXVzZV9yZXNvbHZlKHZhcnMsIHBhdXNlX3Jlc3VsdCk7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIkV4dCBQSFkgQ0wzNyBwYXVzZSByZXN1bHQgMHgleFxuIiwKLQkJCQkgcGF1c2VfcmVzdWx0KTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdTggYm54MnhfZGlyZWN0X3BhcmFsbGVsX2RldGVjdF91c2VkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBwZF8xMGcsIHN0YXR1czJfMTAwMHg7Ci0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAotCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX1NUQVRVUzIsCi0JCQkgICAgICAmc3RhdHVzMl8xMDAweCk7Ci0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1NFUkRFU19ESUdJVEFMLAotCQkJICAgICAgTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX1NUQVRVUzIsCi0JCQkgICAgICAmc3RhdHVzMl8xMDAweCk7Ci0JaWYgKHN0YXR1czJfMTAwMHggJiBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfU1RBVFVTMl9BTl9ESVNBQkxFRCkgewotCQlEUChORVRJRl9NU0dfTElOSywgIjFHIHBhcmFsbGVsIGRldGVjdCBsaW5rIG9uIHBvcnQgJWRcbiIsCi0JCQkgcGFyYW1zLT5wb3J0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LXzEwR19QQVJBTExFTF9ERVRFQ1QsCi0JCQkgICAgICBNRElPXzEwR19QQVJBTExFTF9ERVRFQ1RfUEFSX0RFVF8xMEdfU1RBVFVTLAotCQkJICAgICAgJnBkXzEwZyk7Ci0KLQlpZiAocGRfMTBnICYgTURJT18xMEdfUEFSQUxMRUxfREVURUNUX1BBUl9ERVRfMTBHX1NUQVRVU19QRF9MSU5LKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiMTBHIHBhcmFsbGVsIGRldGVjdCBsaW5rIG9uIHBvcnQgJWRcbiIsCi0JCQkgcGFyYW1zLT5wb3J0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9mbG93X2N0cmxfcmVzb2x2ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCi0JCQkJICB1MzIgZ3Bfc3RhdHVzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBsZF9wYXVzZTsgICAvKiBsb2NhbCBkcml2ZXIgKi8KLQl1MTYgbHBfcGF1c2U7ICAgLyogbGluayBwYXJ0bmVyICovCi0JdTE2IHBhdXNlX3Jlc3VsdDsKLQotCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCi0JLyogcmVzb2x2ZSBmcm9tIGdwX3N0YXR1cyBpbiBjYXNlIG9mIEFOIGNvbXBsZXRlIGFuZCBub3Qgc2dtaWkgKi8KLQlpZiAoKHBhcmFtcy0+cmVxX2Zsb3dfY3RybCA9PSBCTlgyWF9GTE9XX0NUUkxfQVVUTykgJiYKLQkgICAgKGdwX3N0YXR1cyAmIE1ESU9fQU5fQ0w3M19PUl8zN19DT01QTEVURSkgJiYKLQkgICAgKCEodmFycy0+cGh5X2ZsYWdzICYgUEhZX1NHTUlJX0ZMQUcpKSAmJgotCSAgICAoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykgPT0KLQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkpIHsKLQkJaWYgKGJueDJ4X2RpcmVjdF9wYXJhbGxlbF9kZXRlY3RfdXNlZChwYXJhbXMpKSB7Ci0JCQl2YXJzLT5mbG93X2N0cmwgPSBwYXJhbXMtPnJlcV9mY19hdXRvX2FkdjsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKGdwX3N0YXR1cyAmCi0JCSAgICAoTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQ0w3M19BVVRPTkVHX0NPTVBMRVRFIHwKLQkJICAgICBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9DTDczX01SX0xQX05QX0FOX0FCTEUpKSA9PQotCQkgICAgKE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0NMNzNfQVVUT05FR19DT01QTEVURSB8Ci0JCSAgICAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQ0w3M19NUl9MUF9OUF9BTl9BQkxFKSkgewotCi0JCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCQkgICAgICBNRElPX1JFR19CQU5LX0NMNzNfSUVFRUIxLAotCQkJCQkgICAgICBNRElPX0NMNzNfSUVFRUIxX0FOX0FEVjEsCi0JCQkJCSAgICAgICZsZF9wYXVzZSk7Ci0JCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJCSAgICAgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMSwKLQkJCQkJICAgICBNRElPX0NMNzNfSUVFRUIxX0FOX0xQX0FEVjEsCi0JCQkJCSAgICAgJmxwX3BhdXNlKTsKLQkJCXBhdXNlX3Jlc3VsdCA9IChsZF9wYXVzZSAmCi0JCQkJCU1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMV9QQVVTRV9NQVNLKQotCQkJCQk+PiA4OwotCQkJcGF1c2VfcmVzdWx0IHw9IChscF9wYXVzZSAmCi0JCQkJCU1ESU9fQ0w3M19JRUVFQjFfQU5fTFBfQURWMV9QQVVTRV9NQVNLKQotCQkJCQk+PiAxMDsKLQkJCURQKE5FVElGX01TR19MSU5LLCAicGF1c2VfcmVzdWx0IENMNzMgMHgleFxuIiwKLQkJCQkgcGF1c2VfcmVzdWx0KTsKLQkJfSBlbHNlIHsKLQotCQkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCQkJICAgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFYsCi0JCQkJCSAgICAgICZsZF9wYXVzZSk7Ci0JCQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCSAgICAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0xJTktfUEFSVE5FUl9BQklMSVRZMSwKLQkJCSAgICAgICAmbHBfcGF1c2UpOwotCQkJcGF1c2VfcmVzdWx0ID0gKGxkX3BhdXNlICYKLQkJCQlNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9NQVNLKT4+NTsKLQkJCXBhdXNlX3Jlc3VsdCB8PSAobHBfcGF1c2UgJgotCQkJCSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9NQVNLKT4+NzsKLQkJCURQKE5FVElGX01TR19MSU5LLCAicGF1c2VfcmVzdWx0IENMMzcgMHgleFxuIiwKLQkJCQkgcGF1c2VfcmVzdWx0KTsKLQkJfQotCQlibngyeF9wYXVzZV9yZXNvbHZlKHZhcnMsIHBhdXNlX3Jlc3VsdCk7Ci0JfSBlbHNlIGlmICgocGFyYW1zLT5yZXFfZmxvd19jdHJsID09IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKSAmJgotCQkgICAoYm54MnhfZXh0X3BoeV9yZXNvbHZlX2ZjKHBhcmFtcywgdmFycykpKSB7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlpZiAocGFyYW1zLT5yZXFfZmxvd19jdHJsID09IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKQotCQkJdmFycy0+Zmxvd19jdHJsID0gcGFyYW1zLT5yZXFfZmNfYXV0b19hZHY7Ci0JCWVsc2UKLQkJCXZhcnMtPmZsb3dfY3RybCA9IHBhcmFtcy0+cmVxX2Zsb3dfY3RybDsKLQl9Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJmbG93X2N0cmwgMHgleFxuIiwgdmFycy0+Zmxvd19jdHJsKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfY2hlY2tfZmFsbGJhY2tfdG9fY2wzNyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgcnhfc3RhdHVzLCB1c3RhdF92YWwsIGNsMzdfZnNtX3JlY2lldmVkOwotCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfY2hlY2tfZmFsbGJhY2tfdG9fY2wzN1xuIik7Ci0JLyogU3RlcCAxOiBNYWtlIHN1cmUgc2lnbmFsIGlzIGRldGVjdGVkICovCi0JQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1JFR19CQU5LX1JYMCwKLQkJCSAgICAgIE1ESU9fUlgwX1JYX1NUQVRVUywKLQkJCSAgICAgICZyeF9zdGF0dXMpOwotCWlmICgocnhfc3RhdHVzICYgTURJT19SWDBfUlhfU1RBVFVTX1NJR0RFVCkgIT0KLQkgICAgKE1ESU9fUlgwX1JYX1NUQVRVU19TSUdERVQpKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiU2lnbmFsIGlzIG5vdCBkZXRlY3RlZC4gUmVzdG9yaW5nIENMNzMuIgotCQkJICAgICAicnhfc3RhdHVzKDB4ODBiMCkgPSAweCV4XG4iLCByeF9zdGF0dXMpOwotCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMCwKLQkJCQkgICAgICBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCwKLQkJCQkgICAgICBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTF9BTl9FTik7Ci0JCXJldHVybjsKLQl9Ci0JLyogU3RlcCAyOiBDaGVjayBDTDczIHN0YXRlIG1hY2hpbmUgKi8KLQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19VU0VSQjAsCi0JCQkgICAgICBNRElPX0NMNzNfVVNFUkIwX0NMNzNfVVNUQVQxLAotCQkJICAgICAgJnVzdGF0X3ZhbCk7Ci0JaWYgKCh1c3RhdF92YWwgJgotCSAgICAgKE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19VU1RBVDFfTElOS19TVEFUVVNfQ0hFQ0sgfAotCSAgICAgIE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19VU1RBVDFfQU5fR09PRF9DSEVDS19CQU0zNykpICE9Ci0JICAgIChNRElPX0NMNzNfVVNFUkIwX0NMNzNfVVNUQVQxX0xJTktfU1RBVFVTX0NIRUNLIHwKLQkgICAgICBNRElPX0NMNzNfVVNFUkIwX0NMNzNfVVNUQVQxX0FOX0dPT0RfQ0hFQ0tfQkFNMzcpKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiQ0w3MyBzdGF0ZS1tYWNoaW5lIGlzIG5vdCBzdGFibGUuICIKLQkJCSAgICAgInVzdGF0X3ZhbCgweDgzNzEpID0gMHgleFxuIiwgdXN0YXRfdmFsKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBTdGVwIDM6IENoZWNrIENMMzcgTWVzc2FnZSBQYWdlcyByZWNlaXZlZCB0byBpbmRpY2F0ZSBMUAotCXN1cHBvcnRzIG9ubHkgQ0wzNyAqLwotCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19SRU1PVEVfUEhZLAotCQkJICAgICAgTURJT19SRU1PVEVfUEhZX01JU0NfUlhfU1RBVFVTLAotCQkJICAgICAgJmNsMzdfZnNtX3JlY2lldmVkKTsKLQlpZiAoKGNsMzdfZnNtX3JlY2lldmVkICYKLQkgICAgIChNRElPX1JFTU9URV9QSFlfTUlTQ19SWF9TVEFUVVNfQ0wzN19GU01fUkVDRUlWRURfT1ZFUjFHX01TRyB8Ci0JICAgICBNRElPX1JFTU9URV9QSFlfTUlTQ19SWF9TVEFUVVNfQ0wzN19GU01fUkVDRUlWRURfQlJDTV9PVUlfTVNHKSkgIT0KLQkgICAgKE1ESU9fUkVNT1RFX1BIWV9NSVNDX1JYX1NUQVRVU19DTDM3X0ZTTV9SRUNFSVZFRF9PVkVSMUdfTVNHIHwKLQkgICAgICBNRElPX1JFTU9URV9QSFlfTUlTQ19SWF9TVEFUVVNfQ0wzN19GU01fUkVDRUlWRURfQlJDTV9PVUlfTVNHKSkgewotCQlEUChORVRJRl9NU0dfTElOSywgIk5vIENMMzcgRlNNIHdlcmUgcmVjZWl2ZWQuICIKLQkJCSAgICAgIm1pc2Nfcnhfc3RhdHVzKDB4ODMzMCkgPSAweCV4XG4iLAotCQkJIGNsMzdfZnNtX3JlY2lldmVkKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBUaGUgY29tYmluZWQgY2wzNy9jbDczIGZzbSBzdGF0ZSBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoYXQgd2UgYXJlCi0JY29ubmVjdGVkIHRvIGEgZGV2aWNlIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgY2w3MywgYnV0IGRvZXMgc3VwcG9ydAotCWNsMzcgQkFNLiBJbiB0aGlzIGNhc2Ugd2UgZGlzYWJsZSBjbDczIGFuZCByZXN0YXJ0IGNsMzcgYXV0by1uZWcgKi8KLQkvKiBEaXNhYmxlIENMNzMgKi8KLQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfQ0w3M19JRUVFQjAsCi0JCQkgICAgICBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCwKLQkJCSAgICAgIDApOwotCS8qIFJlc3RhcnQgQ0wzNyBhdXRvbmVnICovCi0JYm54MnhfcmVzdGFydF9hdXRvbmVnKHBhcmFtcywgMCk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJEaXNhYmxpbmcgQ0w3MywgYW5kIHJlc3RhcnRpbmcgQ0wzNyBhdXRvbmVnXG4iKTsKLX0KLXN0YXRpYyB1OCBibngyeF9saW5rX3NldHRpbmdzX3N0YXR1cyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAotCQkJCSAgIHUzMiBncF9zdGF0dXMsCi0JCQkJICAgdTggZXh0X3BoeV9saW5rX3VwKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBuZXdfbGluZV9zcGVlZDsKLQl1OCByYyA9IDA7Ci0JdmFycy0+bGlua19zdGF0dXMgPSAwOwotCi0JaWYgKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0xJTktfU1RBVFVTKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAicGh5IGxpbmsgdXAgZ3Bfc3RhdHVzPTB4JXhcbiIsCi0JCQkgZ3Bfc3RhdHVzKTsKLQotCQl2YXJzLT5waHlfbGlua191cCA9IDE7Ci0JCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfVVA7Ci0KLQkJaWYgKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0RVUExFWF9TVEFUVVMpCi0JCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJZWxzZQotCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0KLQkJYm54MnhfZmxvd19jdHJsX3Jlc29sdmUocGFyYW1zLCB2YXJzLCBncF9zdGF0dXMpOwotCi0JCXN3aXRjaCAoZ3Bfc3RhdHVzICYgR1BfU1RBVFVTX1NQRUVEX01BU0spIHsKLQkJY2FzZSBHUF9TVEFUVVNfMTBNOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMDsKLQkJCWlmICh2YXJzLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMFRGRDsKLQkJCWVsc2UKLQkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwVEhEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMTAwTToKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTAwOwotCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKLQkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwMFRYRkQ7Ci0JCQllbHNlCi0JCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMDBUWEhEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMUc6Ci0JCWNhc2UgR1BfU1RBVFVTXzFHX0tYOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwotCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKLQkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwMDBURkQ7Ci0JCQllbHNlCi0JCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMDAwVEhEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMl81RzoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMjUwMDsKLQkJCWlmICh2YXJzLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18yNTAwVEZEOwotCQkJZWxzZQotCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMjUwMFRIRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR1BfU1RBVFVTXzVHOgotCQljYXNlIEdQX1NUQVRVU182RzoKLQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCSAibGluayBzcGVlZCB1bnN1cHBvcnRlZCAgZ3Bfc3RhdHVzIDB4JXhcbiIsCi0JCQkJICBncF9zdGF0dXMpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMTBHX0tYNDoKLQkJY2FzZSBHUF9TVEFUVVNfMTBHX0hJRzoKLQkJY2FzZSBHUF9TVEFUVVNfMTBHX0NYNDoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7Ci0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwR1RGRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR1BfU1RBVFVTXzEyR19ISUc6Ci0JCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEyMDAwOwotCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMkdURkQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEdQX1NUQVRVU18xMl81RzoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTI1MDA7Ci0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEyXzVHVEZEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMTNHOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMzAwMDsKLQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTNHVEZEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMTVHOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xNTAwMDsKLQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTVHVEZEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMTZHOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xNjAwMDsKLQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMTZHVEZEOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCSAgImxpbmsgc3BlZWQgdW5zdXBwb3J0ZWQgZ3Bfc3RhdHVzIDB4JXhcbiIsCi0JCQkJICBncF9zdGF0dXMpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBVcG9uIGxpbmsgc3BlZWQgY2hhbmdlIHNldCB0aGUgTklHIGludG8gZHJhaW4gbW9kZS4KLQkJQ29tZXMgdG8gZGVhbHMgd2l0aCBwb3NzaWJsZSBGSUZPIGdsaXRjaCBkdWUgdG8gY2xrIGNoYW5nZQotCQl3aGVuIHNwZWVkIGlzIGRlY3JlYXNlZCB3aXRob3V0IGxpbmsgZG93biBpbmRpY2F0b3IgKi8KLQkJaWYgKG5ld19saW5lX3NwZWVkICE9IHZhcnMtPmxpbmVfc3BlZWQpIHsKLQkJCWlmIChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSAhPQotCQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QgJiYKLQkJCSAgICBleHRfcGh5X2xpbmtfdXApIHsKLQkJCQlEUChORVRJRl9NU0dfTElOSywgIkludGVybmFsIGxpbmsgc3BlZWQgJWQgaXMiCi0JCQkJCSAgICAiIGRpZmZlcmVudCB0aGFuIHRoZSBleHRlcm5hbCIKLQkJCQkJICAgICIgbGluayBzcGVlZCAlZFxuIiwgbmV3X2xpbmVfc3BlZWQsCi0JCQkJCSAgdmFycy0+bGluZV9zcGVlZCk7Ci0JCQkJdmFycy0+cGh5X2xpbmtfdXAgPSAwOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERQotCQkJCSAgICArIHBhcmFtcy0+cG9ydCo0LCAwKTsKLQkJCW1zbGVlcCgxKTsKLQkJfQotCQl2YXJzLT5saW5lX3NwZWVkID0gbmV3X2xpbmVfc3BlZWQ7Ci0JCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX1NFUkRFU19MSU5LOwotCi0JCWlmICgocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykgJiYKLQkJICAgICgoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykgPT0KLQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpIHx8Ci0JCSAgICAoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykgPT0KLQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1KSB8fAotCQkgICAgKFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpID09Ci0JCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNikgfHwKLQkJICAgIChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSA9PQotCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpKSkgewotCQkJdmFycy0+YXV0b25lZyA9IEFVVE9fTkVHX0VOQUJMRUQ7Ci0KLQkJCWlmIChncF9zdGF0dXMgJiBNRElPX0FOX0NMNzNfT1JfMzdfQ09NUExFVEUpIHsKLQkJCQl2YXJzLT5hdXRvbmVnIHw9IEFVVE9fTkVHX0NPTVBMRVRFOwotCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9Ci0JCQkJCUxJTktfU1RBVFVTX0FVVE9fTkVHT1RJQVRFX0NPTVBMRVRFOwotCQkJfQotCi0JCQl2YXJzLT5hdXRvbmVnIHw9IEFVVE9fTkVHX1BBUkFMTEVMX0RFVEVDVElPTl9VU0VEOwotCQkJdmFycy0+bGlua19zdGF0dXMgfD0KLQkJCQlMSU5LX1NUQVRVU19QQVJBTExFTF9ERVRFQ1RJT05fVVNFRDsKLQotCQl9Ci0JCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfVFgpCi0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PQotCQkJCUxJTktfU1RBVFVTX1RYX0ZMT1dfQ09OVFJPTF9FTkFCTEVEOwotCi0JCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfUlgpCi0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PQotCQkJCUxJTktfU1RBVFVTX1JYX0ZMT1dfQ09OVFJPTF9FTkFCTEVEOwotCi0JfSBlbHNlIHsgLyogbGlua19kb3duICovCi0JCURQKE5FVElGX01TR19MSU5LLCAicGh5IGxpbmsgZG93blxuIik7Ci0KLQkJdmFycy0+cGh5X2xpbmtfdXAgPSAwOwotCi0JCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOwotCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKLQkJdmFycy0+YXV0b25lZyA9IEFVVE9fTkVHX0RJU0FCTEVEOwotCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX05PTkU7Ci0KLQkJaWYgKChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgotCQkgICAgKChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKSA9PQotCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkpKSB7Ci0JCQkvKiBDaGVjayBzaWduYWwgaXMgZGV0ZWN0ZWQgKi8KLQkJCWJueDJ4X2NoZWNrX2ZhbGxiYWNrX3RvX2NsMzcocGFyYW1zKTsKLQkJfQotCX0KLQotCURQKE5FVElGX01TR19MSU5LLCAiZ3Bfc3RhdHVzIDB4JXggIHBoeV9saW5rX3VwICV4IGxpbmVfc3BlZWQgJXhcbiIsCi0JCSBncF9zdGF0dXMsIHZhcnMtPnBoeV9saW5rX3VwLCB2YXJzLT5saW5lX3NwZWVkKTsKLQlEUChORVRJRl9NU0dfTElOSywgImR1cGxleCAleCAgZmxvd19jdHJsIDB4JXgiCi0JCSAiIGF1dG9uZWcgMHgleFxuIiwKLQkJIHZhcnMtPmR1cGxleCwKLQkJIHZhcnMtPmZsb3dfY3RybCwgdmFycy0+YXV0b25lZyk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJsaW5rX3N0YXR1cyAweCV4XG4iLCB2YXJzLT5saW5rX3N0YXR1cyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldF9nbWlpX3R4X2RyaXZlcihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgbHBfdXAyOwotCXUxNiB0eF9kcml2ZXI7Ci0JdTE2IGJhbms7Ci0KLQkvKiByZWFkIHByZWNvbXAgKi8KLQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfT1ZFUl8xRywKLQkJCSAgICAgIE1ESU9fT1ZFUl8xR19MUF9VUDIsICZscF91cDIpOwotCi0JLyogYml0cyBbMTA6N10gYXQgbHBfdXAyLCBwb3NpdGlvbmVkIGF0IFsxNToxMl0gKi8KLQlscF91cDIgPSAoKChscF91cDIgJiBNRElPX09WRVJfMUdfTFBfVVAyX1BSRUVNUEhBU0lTX01BU0spID4+Ci0JCSAgIE1ESU9fT1ZFUl8xR19MUF9VUDJfUFJFRU1QSEFTSVNfU0hJRlQpIDw8Ci0JCSAgTURJT19UWDBfVFhfRFJJVkVSX1BSRUVNUEhBU0lTX1NISUZUKTsKLQotCWlmIChscF91cDIgPT0gMCkKLQkJcmV0dXJuOwotCi0JZm9yIChiYW5rID0gTURJT19SRUdfQkFOS19UWDA7IGJhbmsgPD0gTURJT19SRUdfQkFOS19UWDM7Ci0JICAgICAgYmFuayArPSAoTURJT19SRUdfQkFOS19UWDEgLSBNRElPX1JFR19CQU5LX1RYMCkpIHsKLQkJQ0w0NV9SRF9PVkVSX0NMMjIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCSAgICAgIGJhbmssCi0JCQkJICAgICAgTURJT19UWDBfVFhfRFJJVkVSLCAmdHhfZHJpdmVyKTsKLQotCQkvKiByZXBsYWNlIHR4X2RyaXZlciBiaXRzIFsxNToxMl0gKi8KLQkJaWYgKGxwX3VwMiAhPQotCQkgICAgKHR4X2RyaXZlciAmIE1ESU9fVFgwX1RYX0RSSVZFUl9QUkVFTVBIQVNJU19NQVNLKSkgewotCQkJdHhfZHJpdmVyICY9IH5NRElPX1RYMF9UWF9EUklWRVJfUFJFRU1QSEFTSVNfTUFTSzsKLQkJCXR4X2RyaXZlciB8PSBscF91cDI7Ci0JCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCQkgICAgICBiYW5rLAotCQkJCQkgICAgICBNRElPX1RYMF9UWF9EUklWRVIsIHR4X2RyaXZlcik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB1OCBibngyeF9lbWFjX3Byb2dyYW0oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICB1MzIgbGluZV9zcGVlZCwgdTMyIGR1cGxleCkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCXUxNiBtb2RlID0gMDsKLQotCURQKE5FVElGX01TR19MSU5LLCAic2V0dGluZyBsaW5rIHNwZWVkICYgZHVwbGV4XG4iKTsKLQlibngyeF9iaXRzX2RpcyhicCwgR1JDQkFTRV9FTUFDMCArIHBvcnQqMHg0MDAgKwotCQkgICAgIEVNQUNfUkVHX0VNQUNfTU9ERSwKLQkJICAgICAoRU1BQ19NT0RFXzI1R19NT0RFIHwKLQkJICAgICBFTUFDX01PREVfUE9SVF9NSUlfMTBNIHwKLQkJICAgICBFTUFDX01PREVfSEFMRl9EVVBMRVgpKTsKLQlzd2l0Y2ggKGxpbmVfc3BlZWQpIHsKLQljYXNlIFNQRUVEXzEwOgotCQltb2RlIHw9IEVNQUNfTU9ERV9QT1JUX01JSV8xME07Ci0JCWJyZWFrOwotCi0JY2FzZSBTUEVFRF8xMDA6Ci0JCW1vZGUgfD0gRU1BQ19NT0RFX1BPUlRfTUlJOwotCQlicmVhazsKLQotCWNhc2UgU1BFRURfMTAwMDoKLQkJbW9kZSB8PSBFTUFDX01PREVfUE9SVF9HTUlJOwotCQlicmVhazsKLQotCWNhc2UgU1BFRURfMjUwMDoKLQkJbW9kZSB8PSAoRU1BQ19NT0RFXzI1R19NT0RFIHwgRU1BQ19NT0RFX1BPUlRfR01JSSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogMTBHIG5vdCB2YWxpZCBmb3IgRU1BQyAqLwotCQlEUChORVRJRl9NU0dfTElOSywgIkludmFsaWQgbGluZV9zcGVlZCAweCV4XG4iLCBsaW5lX3NwZWVkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGR1cGxleCA9PSBEVVBMRVhfSEFMRikKLQkJbW9kZSB8PSBFTUFDX01PREVfSEFMRl9EVVBMRVg7Ci0JYm54MnhfYml0c19lbihicCwKLQkJICAgIEdSQ0JBU0VfRU1BQzAgKyBwb3J0KjB4NDAwICsgRU1BQ19SRUdfRU1BQ19NT0RFLAotCQkgICAgbW9kZSk7Ci0KLQlibngyeF9zZXRfbGVkKHBhcmFtcywgTEVEX01PREVfT1BFUiwgbGluZV9zcGVlZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgCQkgICAgIEV4dGVybmFsIFBoeSBzZWN0aW9uICAgICAgIAkJICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBibngyeF9leHRfcGh5X2h3X3Jlc2V0KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQpCi17Ci0JYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMSwKLQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywgcG9ydCk7Ci0JbXNsZWVwKDEpOwotCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzEsCi0JCSAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsIHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9leHRfcGh5X3Jlc2V0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAgICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgIlBvcnQgJXg6IGJueDJ4X2V4dF9waHlfcmVzZXRcbiIsIHBhcmFtcy0+cG9ydCk7Ci0JZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JLyogVGhlIFBIWSByZXNldCBpcyBjb250cm9sZWQgYnkgR1BJTyAxCi0JICogR2l2ZSBpdCAxbXMgb2YgcmVzZXQgcHVsc2UKLQkgKi8KLQlpZiAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgewotCi0JCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIERpcmVjdFxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKLQkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA1Lzg3MDZcbiIpOwotCi0JCQkvKiBSZXN0b3JlIG5vcm1hbCBwb3dlciBtb2RlKi8KLQkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCi0JCQkJICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwKLQkJCQkJICBwYXJhbXMtPnBvcnQpOwotCi0JCQkvKiBIVyByZXNldCAqLwotCQkJYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgcGFyYW1zLT5wb3J0KTsKLQotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLCAweGEwNDApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2OgotCi0JCQkvKiBSZXN0b3JlIG5vcm1hbCBwb3dlciBtb2RlKi8KLQkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCi0JCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwKLQkJCQkJICBwYXJhbXMtPnBvcnQpOwotCi0JCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18xLAotCQkJCQkgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsCi0JCQkJCSAgcGFyYW1zLT5wb3J0KTsKLQotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLAotCQkJCSAgICAgICAxPDwxNSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODA3MlxuIik7Ci0KLQkJCS8qIFVuc2V0IExvdyBQb3dlciBNb2RlIGFuZCBTVyByZXNldCAqLwotCQkJLyogUmVzdG9yZSBub3JtYWwgcG93ZXIgbW9kZSovCi0JCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAotCQkJCSAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsCi0JCQkJCSAgcGFyYW1zLT5wb3J0KTsKLQotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLAotCQkJCSAgICAgICAxPDwxNSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODA3M1xuIik7Ci0KLQkJCS8qIFJlc3RvcmUgbm9ybWFsIHBvd2VyIG1vZGUqLwotCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKLQkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAotCQkJCQkgIHBhcmFtcy0+cG9ydCk7Ci0KLQkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzEsCi0JCQkJICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwKLQkJCQkJICBwYXJhbXMtPnBvcnQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxOgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIFNGWDcxMDFcbiIpOwotCi0JCQkvKiBSZXN0b3JlIG5vcm1hbCBwb3dlciBtb2RlKi8KLQkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCi0JCQkJICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwKLQkJCQkJICBwYXJhbXMtPnBvcnQpOwotCi0JCQkvKiBIVyByZXNldCAqLwotCQkJYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgcGFyYW1zLT5wb3J0KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MToKLQkJCS8qIFJlc3RvcmUgbm9ybWFsIHBvd2VyIG1vZGUqLwotCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKLQkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAotCQkJCQkgIHBhcmFtcy0+cG9ydCk7Ci0KLQkJCS8qIEhXIHJlc2V0ICovCi0JCQlibngyeF9leHRfcGh5X2h3X3Jlc2V0KGJwLCBwYXJhbXMtPnBvcnQpOwotCi0JCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsCi0JCQkJICAgICAgIDE8PDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODIzOgotCQkJYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRToKLQkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyBQSFkgRmFpbHVyZSBkZXRlY3RlZFxuIik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgWEdYUyBleHRfcGh5X2NvbmZpZyAweCV4XG4iLAotCQkJICAgcGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCQlicmVhazsKLQkJfQotCi0JfSBlbHNlIHsgLyogU2VyRGVzICovCi0JCWV4dF9waHlfdHlwZSA9IFNFUkRFU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7Ci0JCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyBEaXJlY3RcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0JDTTU0ODI6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyA1NDgyXG4iKTsKLQkJCWJueDJ4X2V4dF9waHlfaHdfcmVzZXQoYnAsIHBhcmFtcy0+cG9ydCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgU2VyRGVzIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCi0JCQkJIHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwKLQkJCQkgICAgdTMyIHNobWVtX2Jhc2UsIHUzMiBzcGlyb21fdmVyKQotewotCURQKE5FVElGX01TR19MSU5LLCAiRlcgdmVyc2lvbiAweCV4OjB4JXggZm9yIHBvcnQgJWRcbiIsCi0JCSAodTE2KShzcGlyb21fdmVyPj4xNiksICh1MTYpc3Bpcm9tX3ZlciwgcG9ydCk7Ci0JUkVHX1dSKGJwLCBzaG1lbV9iYXNlICsKLQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKLQkJCSAgICBwb3J0X21iW3BvcnRdLmV4dF9waHlfZndfdmVyc2lvbiksCi0JCQlzcGlyb21fdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2F2ZV9iY21fc3Bpcm9tX3ZlcihzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCSAgICB1MzIgZXh0X3BoeV90eXBlLCB1OCBleHRfcGh5X2FkZHIsCi0JCQkJICAgIHUzMiBzaG1lbV9iYXNlKQotewotCXUxNiBmd192ZXIxLCBmd192ZXIyOwotCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMSwgJmZ3X3ZlcjEpOwotCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjIsICZmd192ZXIyKTsKLQlibngyeF9zYXZlX3NwaXJvbV92ZXJzaW9uKGJwLCBwb3J0LCBzaG1lbV9iYXNlLAotCQkJCSh1MzIpKGZ3X3ZlcjE8PDE2IHwgZndfdmVyMikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3NhdmVfODQ4MV9zcGlyb21fdmVyc2lvbihzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQkgdTggZXh0X3BoeV9hZGRyLCB1MzIgc2htZW1fYmFzZSkKLXsKLQl1MTYgdmFsLCBmd192ZXIxLCBmd192ZXIyLCBjbnQ7Ci0JLyogRm9yIHRoZSAzMiBiaXRzIHJlZ2lzdGVycyBpbiA4NDgxLCBhY2Nlc3MgdmlhIE1ESU8yQVJNIGludGVyZmFjZS4qLwotCS8qICgxKSBzZXQgcmVnaXN0ZXIgMHhjMjAwXzAwMTQoU1BJX0JSSURHRV9DVFJMXzIpIHRvIDB4MDMwMDAwMDAgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICAweEE4MTksIDB4MDAxNCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIDB4QTgxQSwKLQkJICAgICAgIDB4YzIwMCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIDB4QTgxQiwKLQkJICAgICAgIDB4MDAwMCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIDB4QTgxQywKLQkJICAgICAgIDB4MDMwMCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIDB4QTgxNywKLQkJICAgICAgIDB4MDAwOSk7Ci0KLQlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDsgY250KyspIHsKLQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgMHhBODE4LAotCQkJICAgICAgJnZhbCk7Ci0JCWlmICh2YWwgJiAxKQotCQkJYnJlYWs7Ci0JCXVkZWxheSg1KTsKLQl9Ci0JaWYgKGNudCA9PSAxMDApIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJVbmFibGUgdG8gcmVhZCA4NDgxIHBoeSBmdyB2ZXJzaW9uKDEpXG4iKTsKLQkJYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihicCwgcG9ydCwKLQkJCQkJc2htZW1fYmFzZSwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCS8qIDIpIHJlYWQgcmVnaXN0ZXIgMHhjMjAwXzAwMDAgKFNQSV9GV19TVEFUVVMpICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgMHhBODE5LCAweDAwMDApOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIDB4QTgxQSwgMHhjMjAwKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICAweEE4MTcsIDB4MDAwQSk7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCAxMDA7IGNudCsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgIDB4QTgxOCwKLQkJCSAgICAgICZ2YWwpOwotCQlpZiAodmFsICYgMSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoNSk7Ci0JfQotCWlmIChjbnQgPT0gMTAwKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiVW5hYmxlIHRvIHJlYWQgODQ4MSBwaHkgZncgdmVyc2lvbigyKVxuIik7Ci0JCWJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oYnAsIHBvcnQsCi0JCQkJCXNobWVtX2Jhc2UsIDApOwotCQlyZXR1cm47Ci0JfQotCi0JLyogbG93ZXIgMTYgYml0cyBvZiB0aGUgcmVnaXN0ZXIgU1BJX0ZXX1NUQVRVUyAqLwotCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKLQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgMHhBODFCLAotCQkgICAgICAmZndfdmVyMSk7Ci0JLyogdXBwZXIgMTYgYml0cyBvZiByZWdpc3RlciBTUElfRldfU1RBVFVTICovCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxLAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAweEE4MUMsCi0JCSAgICAgICZmd192ZXIyKTsKLQotCWJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oYnAsIHBvcnQsCi0JCQkJc2htZW1fYmFzZSwgKGZ3X3ZlcjI8PDE2KSB8IGZ3X3ZlcjEpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9iY204MDcyX2V4dGVybmFsX3JvbV9ib290KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCi0JLyogTmVlZCB0byB3YWl0IDIwMG1zIGFmdGVyIHJlc2V0ICovCi0JbXNsZWVwKDIwMCk7Ci0JLyogQm9vdCBwb3J0IGZyb20gZXh0ZXJuYWwgUk9NCi0JICogU2V0IHNlcl9ib290X2N0bCBiaXQgaW4gdGhlIE1JU0NfQ1RSTDEgcmVnaXN0ZXIKLQkgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJCSAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICBNRElPX1BNQV9SRUdfTUlTQ19DVFJMMSwgMHgwMDAxKTsKLQotCS8qIFJlc2V0IGludGVybmFsIG1pY3JvcHJvY2Vzc29yICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCQkgIE1ESU9fUE1BX0RFVkFELAotCQkJICBNRElPX1BNQV9SRUdfR0VOX0NUUkwsCi0JCQkgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTF9ST01fUkVTRVRfSU5URVJOQUxfTVApOwotCS8qIHNldCBtaWNybyByZXNldCA9IDAgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJCSAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkwsCi0JCQkgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9NSUNST19SRVNFVCk7Ci0JLyogUmVzZXQgaW50ZXJuYWwgbWljcm9wcm9jZXNzb3IgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJCSAgTURJT19QTUFfREVWQUQsCi0JCQkgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKLQkJCSAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9SRVNFVF9JTlRFUk5BTF9NUCk7Ci0JLyogd2FpdCBmb3IgMTAwbXMgZm9yIGNvZGUgZG93bmxvYWQgdmlhIFNQSSBwb3J0ICovCi0JbXNsZWVwKDEwMCk7Ci0KLQkvKiBDbGVhciBzZXJfYm9vdF9jdGwgYml0ICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCQkgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgTURJT19QTUFfUkVHX01JU0NfQ1RSTDEsIDB4MDAwMCk7Ci0JLyogV2FpdCAxMDBtcyAqLwotCW1zbGVlcCgxMDApOwotCi0JYm54Mnhfc2F2ZV9iY21fc3Bpcm9tX3ZlcihicCwgcG9ydCwKLQkJCQlleHRfcGh5X3R5cGUsCi0JCQkJZXh0X3BoeV9hZGRyLAotCQkJCXBhcmFtcy0+c2htZW1fYmFzZSk7Ci19Ci0KLXN0YXRpYyB1OCBibngyeF84MDczX2lzX3Nucl9uZWVkZWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0JLyogVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGZvciA4MDczQTEsIHZlcnNpb24gMTAyIG9ubHkgKi8KLQotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCXUxNiB2YWw7Ci0KLQkvKiBSZWFkIDgwNzMgSFcgcmV2aXNpb24qLwotCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfODA3M19DSElQX1JFViwgJnZhbCk7Ci0KLQlpZiAodmFsICE9IDEpIHsKLQkJLyogTm8gbmVlZCB0byB3b3JrYXJvdW5kIGluIDgwNzMgQTEgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCi0JCSAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMiwgJnZhbCk7Ci0KLQkvKiBTTlIgc2hvdWxkIGJlIGFwcGxpZWQgb25seSBmb3IgdmVyc2lvbiAweDEwMiAqLwotCWlmICh2YWwgIT0gMHgxMDIpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1OCBibngyeF9iY204MDczX3hhdWlfd2Eoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTE2IHZhbCwgY250LCBjbnQxIDsKLQotCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfODA3M19DSElQX1JFViwgJnZhbCk7Ci0KLQlpZiAodmFsID4gMCkgewotCQkvKiBObyBuZWVkIHRvIHdvcmthcm91bmQgaW4gODA3MyBBMSAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogWEFVSSB3b3JrYXJvdW5kIGluIDgwNzMgQTA6ICovCi0KLQkvKiBBZnRlciBsb2FkaW5nIHRoZSBib290IFJPTSBhbmQgcmVzdGFydGluZyBBdXRvbmVnLAotCXBvbGwgRGV2MSwgUmVnICRDODIwOiAqLwotCi0JZm9yIChjbnQgPSAwOyBjbnQgPCAxMDAwOyBjbnQrKykgewotCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCi0JCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgIE1ESU9fUE1BX1JFR184MDczX1NQRUVEX0xJTktfU1RBVFVTLAotCQkJICAgICAgJnZhbCk7Ci0JCSAgLyogSWYgYml0IFsxNF0gPSAwIG9yIGJpdCBbMTNdID0gMCwgY29udGludWUgb24gd2l0aAotCQkgICBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gKFhBVUkgd29yay1hcm91bmQgbm90IHJlcXVpcmVkLAotCQkgICAgYXMgdGhlc2UgYml0cyBpbmRpY2F0ZSAyLjVHIG9yIDFHIGxpbmsgdXApLiAqLwotCQlpZiAoISh2YWwgJiAoMTw8MTQpKSB8fCAhKHZhbCAmICgxPDwxMykpKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlhBVUkgd29yay1hcm91bmQgbm90IHJlcXVpcmVkXG4iKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKCEodmFsICYgKDE8PDE1KSkpIHsKLQkJCURQKE5FVElGX01TR19MSU5LLCAiY2xjIGJpdCAxNSB3ZW50IG9mZlxuIik7Ci0JCQkgLyogSWYgYml0IDE1IGlzIDAsIHRoZW4gcG9sbCBEZXYxLCBSZWcgJEM4NDEgdW50aWwKLQkJCSAgaXQncyBNU0IgKGJpdCAxNSkgZ29lcyB0byAxIChpbmRpY2F0aW5nIHRoYXQgdGhlCi0JCQkgIFhBVUkgd29ya2Fyb3VuZCBoYXMgY29tcGxldGVkKSwKLQkJCSAgdGhlbiBjb250aW51ZSBvbiB3aXRoIHN5c3RlbSBpbml0aWFsaXphdGlvbi4qLwotCQkJZm9yIChjbnQxID0gMDsgY250MSA8IDEwMDA7IGNudDErKykgewotCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQlQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkJCQlleHRfcGh5X2FkZHIsCi0JCQkJCU1ESU9fUE1BX0RFVkFELAotCQkJCQlNRElPX1BNQV9SRUdfODA3M19YQVVJX1dBLCAmdmFsKTsKLQkJCQlpZiAodmFsICYgKDE8PDE1KSkgewotCQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJICAiWEFVSSB3b3JrYXJvdW5kIGhhcyBjb21wbGV0ZWRcbiIpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQkgfQotCQkJCSBtc2xlZXAoMyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQltc2xlZXAoMyk7Ci0JfQotCURQKE5FVElGX01TR19MSU5LLCAiV2FybmluZzogWEFVSSB3b3JrLWFyb3VuZCB0aW1lb3V0ICEhIVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2JjbTgwNzNfYmNtODcyN19leHRlcm5hbF9yb21fYm9vdChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQkJICB1OCBleHRfcGh5X2FkZHIsCi0JCQkJCQkgIHUzMiBleHRfcGh5X3R5cGUsCi0JCQkJCQkgIHUzMiBzaG1lbV9iYXNlKQotewotCS8qIEJvb3QgcG9ydCBmcm9tIGV4dGVybmFsIFJPTSAgKi8KLQkvKiBFREMgZ3JzdCAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKLQkJICAgICAgIDB4MDAwMSk7Ci0KLQkvKiB1Y29kZSByZWJvb3QgYW5kIHJzdCAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKLQkJICAgICAgIDB4MDA4Yyk7Ci0KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfTUlTQ19DVFJMMSwgMHgwMDAxKTsKLQotCS8qIFJlc2V0IGludGVybmFsIG1pY3JvcHJvY2Vzc29yICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAotCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9NSUNST19SRVNFVCk7Ci0KLQkvKiBSZWxlYXNlIHNyc3QgYml0ICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAotCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMX1JPTV9SRVNFVF9JTlRFUk5BTF9NUCk7Ci0KLQkvKiB3YWl0IGZvciAxMDBtcyBmb3IgY29kZSBkb3dubG9hZCB2aWEgU1BJIHBvcnQgKi8KLQltc2xlZXAoMTAwKTsKLQotCS8qIENsZWFyIHNlcl9ib290X2N0bCBiaXQgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfTUlTQ19DVFJMMSwgMHgwMDAwKTsKLQotCWJueDJ4X3NhdmVfYmNtX3NwaXJvbV92ZXIoYnAsIHBvcnQsCi0JCQkJZXh0X3BoeV90eXBlLAotCQkJCWV4dF9waHlfYWRkciwKLQkJCQlzaG1lbV9iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfYmNtODA3M19leHRlcm5hbF9yb21fYm9vdChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQkgIHU4IGV4dF9waHlfYWRkciwKLQkJCQkJICB1MzIgc2htZW1fYmFzZSkKLXsKLQlibngyeF9iY204MDczX2JjbTg3MjdfZXh0ZXJuYWxfcm9tX2Jvb3QoYnAsIHBvcnQsIGV4dF9waHlfYWRkciwKLQkJCQkJIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCi0JCQkJCSBzaG1lbV9iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfYmNtODcyN19leHRlcm5hbF9yb21fYm9vdChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQkgIHU4IGV4dF9waHlfYWRkciwKLQkJCQkJICB1MzIgc2htZW1fYmFzZSkKLXsKLQlibngyeF9iY204MDczX2JjbTg3MjdfZXh0ZXJuYWxfcm9tX2Jvb3QoYnAsIHBvcnQsIGV4dF9waHlfYWRkciwKLQkJCQkJIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCi0JCQkJCSBzaG1lbV9iYXNlKTsKLQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9iY204NzI2X2V4dGVybmFsX3JvbV9ib290KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCi0JLyogTmVlZCB0byB3YWl0IDEwMG1zIGFmdGVyIHJlc2V0ICovCi0JbXNsZWVwKDEwMCk7Ci0KLQkvKiBNaWNybyBjb250cm9sbGVyIHJlLWJvb3QgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHX0dFTl9DVFJMLAotCQkgICAgICAgMHgwMThCKTsKLQotCS8qIFNldCBzb2Z0IHJlc2V0ICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTF9ST01fTUlDUk9fUkVTRVQpOwotCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwxLCAweDAwMDEpOwotCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19HRU5fQ1RSTF9ST01fUkVTRVRfSU5URVJOQUxfTVApOwotCi0JLyogd2FpdCBmb3IgMTUwbXMgZm9yIG1pY3JvY29kZSBsb2FkICovCi0JbXNsZWVwKDE1MCk7Ci0KLQkvKiBEaXNhYmxlIHNlcmlhbCBib290IGNvbnRyb2wsIHRyaXN0YXRlcyBwaW5zIFNTX04sIFNDSywgTU9TSSwgTUlTTyAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfTUlTQ19DVFJMMSwgMHgwMDAwKTsKLQotCW1zbGVlcCgyMDApOwotCWJueDJ4X3NhdmVfYmNtX3NwaXJvbV92ZXIoYnAsIHBvcnQsCi0JCQkJZXh0X3BoeV90eXBlLAotCQkJCWV4dF9waHlfYWRkciwKLQkJCQlwYXJhbXMtPnNobWVtX2Jhc2UpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZnBfc2V0X3RyYW5zbWl0dGVyKHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsCi0JCQkJICAgIHUzMiBleHRfcGh5X3R5cGUsIHU4IGV4dF9waHlfYWRkciwKLQkJCQkgICAgdTggdHhfZW4pCi17Ci0JdTE2IHZhbDsKLQotCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyB0cmFuc21pdHRlciB0eF9lbj0leCBmb3IgcG9ydCAleFxuIiwKLQkJIHR4X2VuLCBwb3J0KTsKLQkvKiBEaXNhYmxlL0VuYWJsZSB0cmFuc21pdHRlciAoIFRYIGxhc2VyIG9mIHRoZSBTRlArIG1vZHVsZS4pKi8KLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCi0JCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLAotCQkgICAgICAmdmFsKTsKLQotCWlmICh0eF9lbikKLQkJdmFsICY9IH4oMTw8MTUpOwotCWVsc2UKLQkJdmFsIHw9ICgxPDwxNSk7Ci0KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsCi0JCSAgICAgICB2YWwpOwotfQotCi1zdGF0aWMgdTggYm54MnhfODcyNl9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCQkgIHUxNiBhZGRyLCB1OCBieXRlX2NudCwgdTggKm9fYnVmKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiB2YWwgPSAwOwotCXUxNiBpOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCi0JaWYgKGJ5dGVfY250ID4gMTYpIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJSZWFkaW5nIGZyb20gZWVwcm9tIGlzIgotCQkJICAgICIgaXMgbGltaXRlZCB0byAweGZcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogU2V0IHRoZSByZWFkIGNvbW1hbmQgYnl0ZSBjb3VudCAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQllURV9DTlQsCi0JCSAgICAgICAoYnl0ZV9jbnQgfCAweGEwMDApKTsKLQotCS8qIFNldCB0aGUgcmVhZCBjb21tYW5kIGFkZHJlc3MgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX01FTV9BRERSLAotCQkgICAgICAgYWRkcik7Ci0KLQkvKiBBY3RpdmF0ZSByZWFkIGNvbW1hbmQgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsCi0JCSAgICAgICAweDJjMGYpOwotCi0JLyogV2FpdCB1cCB0byA1MDB1cyBmb3IgY29tbWFuZCBjb21wbGV0ZSBzdGF0dXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsICZ2YWwpOwotCQlpZiAoKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykgPT0KLQkJICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfU1RBVFVTX0NPTVBMRVRFKQotCQkJYnJlYWs7Ci0JCXVkZWxheSg1KTsKLQl9Ci0KLQlpZiAoKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykgIT0KLQkJICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfU1RBVFVTX0NPTVBMRVRFKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLAotCQkJICJHb3QgYmFkIHN0YXR1cyAweCV4IHdoZW4gcmVhZGluZyBmcm9tIFNGUCsgRUVQUk9NXG4iLAotCQkJICh2YWwgJiBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkxfU1RBVFVTX01BU0spKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUmVhZCB0aGUgYnVmZmVyICovCi0JZm9yIChpID0gMDsgaSA8IGJ5dGVfY250OyBpKyspIHsKLQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICBNRElPX1BNQV9SRUdfODcyNl9UV09fV0lSRV9EQVRBX0JVRiArIGksICZ2YWwpOwotCQlvX2J1ZltpXSA9ICh1OCkodmFsICYgTURJT19QTUFfUkVHXzg3MjZfVFdPX1dJUkVfREFUQV9NQVNLKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsICZ2YWwpOwotCQlpZiAoKHZhbCAmIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQ1RSTF9TVEFUVVNfTUFTSykgPT0KLQkJICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfU1RBVFVTX0lETEUpCi0JCQlyZXR1cm4gMDs7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyB1OCBibngyeF84NzI3X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSAgdTE2IGFkZHIsIHU4IGJ5dGVfY250LCB1OCAqb19idWYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IHZhbCwgaTsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQotCWlmIChieXRlX2NudCA+IDE2KSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiUmVhZGluZyBmcm9tIGVlcHJvbSBpcyIKLQkJCSAgICAiIGlzIGxpbWl0ZWQgdG8gMHhmXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogTmVlZCB0byByZWFkIGZyb20gMS44MDAwIHRvIGNsZWFyIGl0ICovCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkwsCi0JCSAgICAgICZ2YWwpOwotCi0JLyogU2V0IHRoZSByZWFkIGNvbW1hbmQgYnl0ZSBjb3VudCAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19TRlBfVFdPX1dJUkVfQllURV9DTlQsCi0JCSAgICAgICAoKGJ5dGVfY250IDwgMikgPyAyIDogYnl0ZV9jbnQpKTsKLQotCS8qIFNldCB0aGUgcmVhZCBjb21tYW5kIGFkZHJlc3MgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX01FTV9BRERSLAotCQkgICAgICAgYWRkcik7Ci0JLyogU2V0IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgMHg4MDA0LAotCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfVFdPX1dJUkVfREFUQV9CVUYpOwotCi0JLyogQWN0aXZhdGUgcmVhZCBjb21tYW5kICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMLAotCQkgICAgICAgMHg4MDAyKTsKLQkvKiBXYWl0IGFwcHJvcHJpYXRlIHRpbWUgZm9yIHR3by13aXJlIGNvbW1hbmQgdG8gZmluaXNoIGJlZm9yZQotCXBvbGxpbmcgdGhlIHN0YXR1cyByZWdpc3RlciAqLwotCW1zbGVlcCgxKTsKLQotCS8qIFdhaXQgdXAgdG8gNTAwdXMgZm9yIGNvbW1hbmQgY29tcGxldGUgc3RhdHVzICovCi0JZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMLCAmdmFsKTsKLQkJaWYgKCh2YWwgJiBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkxfU1RBVFVTX01BU0spID09Ci0JCSAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX1NUQVRVU19DT01QTEVURSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoNSk7Ci0JfQotCi0JaWYgKCh2YWwgJiBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkxfU1RBVFVTX01BU0spICE9Ci0JCSAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX1NUQVRVU19DT01QTEVURSkgewotCQlEUChORVRJRl9NU0dfTElOSywKLQkJCSAiR290IGJhZCBzdGF0dXMgMHgleCB3aGVuIHJlYWRpbmcgZnJvbSBTRlArIEVFUFJPTVxuIiwKLQkJCSAodmFsICYgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMX1NUQVRVU19NQVNLKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJlYWQgdGhlIGJ1ZmZlciAqLwotCWZvciAoaSA9IDA7IGkgPCBieXRlX2NudDsgaSsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHXzg3MjdfVFdPX1dJUkVfREFUQV9CVUYgKyBpLCAmdmFsKTsKLQkJb19idWZbaV0gPSAodTgpKHZhbCAmIE1ESU9fUE1BX1JFR184NzI3X1RXT19XSVJFX0RBVEFfTUFTSyk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHX1NGUF9UV09fV0lSRV9DVFJMLCAmdmFsKTsKLQkJaWYgKCh2YWwgJiBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX0NUUkxfU1RBVFVTX01BU0spID09Ci0JCSAgICBNRElPX1BNQV9SRUdfU0ZQX1RXT19XSVJFX1NUQVRVU19JRExFKQotCQkJcmV0dXJuIDA7OwotCQltc2xlZXAoMSk7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXU4IGJueDJ4X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUxNiBhZGRyLAotCQkJCSAgICAgdTggYnl0ZV9jbnQsIHU4ICpvX2J1ZikKLXsKLQl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0KLQlpZiAoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpCi0JCXJldHVybiBibngyeF84NzI2X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGFyYW1zLCBhZGRyLAotCQkJCQkJICAgICAgIGJ5dGVfY250LCBvX2J1Zik7Ci0JZWxzZSBpZiAoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcpCi0JCXJldHVybiBibngyeF84NzI3X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGFyYW1zLCBhZGRyLAotCQkJCQkJICAgICAgIGJ5dGVfY250LCBvX2J1Zik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyB1OCBibngyeF9nZXRfZWRjX21vZGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICB1MTYgKmVkY19tb2RlKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IHZhbCwgY2hlY2tfbGltaXRpbmdfbW9kZSA9IDA7Ci0JKmVkY19tb2RlID0gRURDX01PREVfTElNSVRJTkc7Ci0KLQkvKiBGaXJzdCBjaGVjayBmb3IgY29wcGVyIGNhYmxlICovCi0JaWYgKGJueDJ4X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGFyYW1zLAotCQkJCSAgICAgICBTRlBfRUVQUk9NX0NPTl9UWVBFX0FERFIsCi0JCQkJICAgICAgIDEsCi0JCQkJICAgICAgICZ2YWwpICE9IDApIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJGYWlsZWQgdG8gcmVhZCBmcm9tIFNGUCsgbW9kdWxlIEVFUFJPTVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAodmFsKSB7Ci0JY2FzZSBTRlBfRUVQUk9NX0NPTl9UWVBFX1ZBTF9DT1BQRVI6Ci0JewotCQl1OCBjb3BwZXJfbW9kdWxlX3R5cGU7Ci0KLQkJLyogQ2hlY2sgaWYgaXRzIGFjdGl2ZSBjYWJsZSggaW5jbHVkZXMgU0ZQKyBtb2R1bGUpCi0JCW9mIHBhc3NpdmUgY2FibGUqLwotCQlpZiAoYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsCi0JCQkJCSAgICAgICBTRlBfRUVQUk9NX0ZDX1RYX1RFQ0hfQUREUiwKLQkJCQkJICAgICAgIDEsCi0JCQkJCSAgICAgICAmY29wcGVyX21vZHVsZV90eXBlKSAhPQotCQkgICAgMCkgewotCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJIkZhaWxlZCB0byByZWFkIGNvcHBlci1jYWJsZS10eXBlIgotCQkJCSIgZnJvbSBTRlArIEVFUFJPTVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChjb3BwZXJfbW9kdWxlX3R5cGUgJgotCQkgICAgU0ZQX0VFUFJPTV9GQ19UWF9URUNIX0JJVE1BU0tfQ09QUEVSX0FDVElWRSkgewotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJBY3RpdmUgQ29wcGVyIGNhYmxlIGRldGVjdGVkXG4iKTsKLQkJCWNoZWNrX2xpbWl0aW5nX21vZGUgPSAxOwotCQl9IGVsc2UgaWYgKGNvcHBlcl9tb2R1bGVfdHlwZSAmCi0JCQlTRlBfRUVQUk9NX0ZDX1RYX1RFQ0hfQklUTUFTS19DT1BQRVJfUEFTU0lWRSkgewotCQkJCURQKE5FVElGX01TR19MSU5LLCAiUGFzc2l2ZSBDb3BwZXIiCi0JCQkJCSAgICAiIGNhYmxlIGRldGVjdGVkXG4iKTsKLQkJCQkqZWRjX21vZGUgPQotCQkJCSAgICAgIEVEQ19NT0RFX1BBU1NJVkVfREFDOwotCQl9IGVsc2UgewotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJVbmtub3duIGNvcHBlci1jYWJsZS0iCi0JCQkJICAgICAidHlwZSAweCV4ICEhIVxuIiwgY29wcGVyX21vZHVsZV90eXBlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFNGUF9FRVBST01fQ09OX1RZUEVfVkFMX0xDOgotCQlEUChORVRJRl9NU0dfTElOSywgIk9wdGljIG1vZHVsZSBkZXRlY3RlZFxuIik7Ci0JCWNoZWNrX2xpbWl0aW5nX21vZGUgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEUChORVRJRl9NU0dfTElOSywgIlVuYWJsZSB0byBkZXRlcm1pbmUgbW9kdWxlIHR5cGUgMHgleCAhISFcbiIsCi0JCQkgdmFsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNoZWNrX2xpbWl0aW5nX21vZGUpIHsKLQkJdTggb3B0aW9uc1tTRlBfRUVQUk9NX09QVElPTlNfU0laRV07Ci0JCWlmIChibngyeF9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tKHBhcmFtcywKLQkJCQkJICAgICAgIFNGUF9FRVBST01fT1BUSU9OU19BRERSLAotCQkJCQkgICAgICAgU0ZQX0VFUFJPTV9PUFRJT05TX1NJWkUsCi0JCQkJCSAgICAgICBvcHRpb25zKSAhPSAwKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIkZhaWxlZCB0byByZWFkIE9wdGlvbiIKLQkJCQkiIGZpZWxkIGZyb20gbW9kdWxlIEVFUFJPTVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoKG9wdGlvbnNbMF0gJiBTRlBfRUVQUk9NX09QVElPTlNfTElORUFSX1JYX09VVF9NQVNLKSkKLQkJCSplZGNfbW9kZSA9IEVEQ19NT0RFX0xJTkVBUjsKLQkJZWxzZQotCQkJKmVkY19tb2RlID0gRURDX01PREVfTElNSVRJTkc7Ci0JfQotCURQKE5FVElGX01TR19MSU5LLCAiRURDIG1vZGUgaXMgc2V0IHRvIDB4JXhcbiIsICplZGNfbW9kZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmVhZCB0aGUgcmVsZXZhbnQgZmllbGQgZnJvbSB0aGUgbW9kdWxlICggU0ZQKyApLAotCWFuZCB2ZXJpZnkgaXQgaXMgY29tcGxpYW50IHdpdGggdGhpcyBib2FyZCAqLwotc3RhdGljIHU4IGJueDJ4X3ZlcmlmeV9zZnBfbW9kdWxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiB2YWw7Ci0JdTMyIGZ3X3Jlc3A7Ci0JY2hhciB2ZW5kb3JfbmFtZVtTRlBfRUVQUk9NX1ZFTkRPUl9OQU1FX1NJWkUrMV07Ci0JY2hhciB2ZW5kb3JfcG5bU0ZQX0VFUFJPTV9QQVJUX05PX1NJWkUrMV07Ci0KLQl2YWwgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCi0JCQkgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCi0JCQkJICBwb3J0X2ZlYXR1cmVfY29uZmlnW3BhcmFtcy0+cG9ydF0uY29uZmlnKSk7Ci0JaWYgKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KLQkgICAgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX05PX0VORk9SQ0VNRU5UKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiTk9UIGVuZm9yY2luZyBtb2R1bGUgdmVyaWZpY2F0aW9uXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogQXNrIHRoZSBGVyB0byB2YWxpZGF0ZSB0aGUgbW9kdWxlICovCi0JaWYgKCEocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCi0JICAgICAgRkVBVFVSRV9DT05GSUdfQkNfU1VQUE9SVFNfT1BUX01ETF9WUkZZKSkgewotCQlEUChORVRJRl9NU0dfTElOSywgIkZXIGRvZXMgbm90IHN1cHBvcnQgT1BUIE1ETCAiCi0JCQkgICAgInZlcmlmaWNhdGlvblxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZ3X3Jlc3AgPSBibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfVlJGWV9PUFRfTURMKTsKLQlpZiAoZndfcmVzcCA9PSBGV19NU0dfQ09ERV9WUkZZX09QVF9NRExfU1VDQ0VTUykgewotCQlEUChORVRJRl9NU0dfTElOSywgIkFwcHJvdmVkIG1vZHVsZVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGZvcm1hdCB0aGUgd2FybmluZyBtZXNzYWdlICovCi0JaWYgKGJueDJ4X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGFyYW1zLAotCQkJCSAgICAgICBTRlBfRUVQUk9NX1ZFTkRPUl9OQU1FX0FERFIsCi0JCQkJICAgICAgIFNGUF9FRVBST01fVkVORE9SX05BTUVfU0laRSwKLQkJCQkgICAgICAgKHU4ICopdmVuZG9yX25hbWUpKQotCQl2ZW5kb3JfbmFtZVswXSA9ICdcMCc7Ci0JZWxzZQotCQl2ZW5kb3JfbmFtZVtTRlBfRUVQUk9NX1ZFTkRPUl9OQU1FX1NJWkVdID0gJ1wwJzsKLQlpZiAoYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwYXJhbXMsCi0JCQkJICAgICAgIFNGUF9FRVBST01fUEFSVF9OT19BRERSLAotCQkJCSAgICAgICBTRlBfRUVQUk9NX1BBUlRfTk9fU0laRSwKLQkJCQkgICAgICAgKHU4ICopdmVuZG9yX3BuKSkKLQkJdmVuZG9yX3BuWzBdID0gJ1wwJzsKLQllbHNlCi0JCXZlbmRvcl9wbltTRlBfRUVQUk9NX1BBUlRfTk9fU0laRV0gPSAnXDAnOwotCi0JbmV0ZGV2X2luZm8oYnAtPmRldiwgIldhcm5pbmc6IFVucXVhbGlmaWVkIFNGUCsgbW9kdWxlIGRldGVjdGVkLCBQb3J0ICVkIGZyb20gJXMgcGFydCBudW1iZXIgJXNcbiIsCi0JCSAgICBwYXJhbXMtPnBvcnQsIHZlbmRvcl9uYW1lLCB2ZW5kb3JfcG4pOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdTggYm54MnhfYmNtODcyNl9zZXRfbGltaXRpbmdfbW9kZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkJdTE2IGVkY19tb2RlKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTE2IGN1cl9saW1pdGluZ19tb2RlOwotCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2LAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjIsCi0JCSAgICAgICZjdXJfbGltaXRpbmdfbW9kZSk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJDdXJyZW50IExpbWl0aW5nIG1vZGUgaXMgMHgleFxuIiwKLQkJIGN1cl9saW1pdGluZ19tb2RlKTsKLQotCWlmIChlZGNfbW9kZSA9PSBFRENfTU9ERV9MSU1JVElORykgewotCQlEUChORVRJRl9NU0dfTElOSywKLQkJCSAiU2V0dGluZyBMSU1JVElORyBNT0RFXG4iKTsKLQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2LAotCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjIsCi0JCQkgICAgICAgRURDX01PREVfTElNSVRJTkcpOwotCX0gZWxzZSB7IC8qIExSTSBtb2RlICggZGVmYXVsdCApKi8KLQotCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgTFJNIE1PREVcbiIpOwotCi0JCS8qIENoYW5naW5nIHRvIExSTSBtb2RlIHRha2VzIHF1aXRlIGZldyBzZWNvbmRzLgotCQlTbyBkbyBpdCBvbmx5IGlmIGN1cnJlbnQgbW9kZSBpcyBsaW1pdGluZwotCQkoIGRlZmF1bHQgaXMgTFJNICkqLwotCQlpZiAoY3VyX2xpbWl0aW5nX21vZGUgIT0gRURDX01PREVfTElNSVRJTkcpCi0JCQlyZXR1cm4gMDsKLQotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsCi0JCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgIE1ESU9fUE1BX1JFR19MUk1fTU9ERSwKLQkJCSAgICAgICAwKTsKLQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2LAotCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjIsCi0JCQkgICAgICAgMHgxMjgpOwotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsCi0JCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgIE1ESU9fUE1BX1JFR19NSVNDX0NUUkwwLAotCQkJICAgICAgIDB4NDAwOCk7Ci0JCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNiwKLQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICAgTURJT19QTUFfUkVHX0xSTV9NT0RFLAotCQkJICAgICAgIDB4YWFhYSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTggYm54MnhfYmNtODcyN19zZXRfbGltaXRpbmdfbW9kZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkJdTE2IGVkY19tb2RlKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTE2IHBoeV9pZGVudGlmaWVyOwotCXUxNiByb21fdmVyMl92YWw7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0KLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCi0JCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsCi0JCSAgICAgICAmcGh5X2lkZW50aWZpZXIpOwotCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKLQkJICAgICAgIChwaHlfaWRlbnRpZmllciAmIH4oMTw8OSkpKTsKLQotCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgTURJT19QTUFfUkVHX1JPTV9WRVIyLAotCQkgICAgICAmcm9tX3ZlcjJfdmFsKTsKLQkvKiBLZWVwIHRoZSBNU0IgOC1iaXRzLCBhbmQgc2V0IHRoZSBMU0IgOC1iaXRzIHdpdGggdGhlIGVkY19tb2RlICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMiwKLQkJICAgICAgIChyb21fdmVyMl92YWwgJiAweGZmMDApIHwgKGVkY19tb2RlICYgMHgwMGZmKSk7Ci0KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLAotCQkgICAgICAgKHBoeV9pZGVudGlmaWVyIHwgKDE8PDkpKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdTggYm54Mnhfd2FpdF9mb3Jfc2ZwX21vZHVsZV9pbml0aWFsaXplZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKLXsKLQl1OCB2YWw7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IHRpbWVvdXQ7Ci0JLyogSW5pdGlhbGl6YXRpb24gdGltZSBhZnRlciBob3QtcGx1ZyBtYXkgdGFrZSB1cCB0byAzMDBtcyBmb3Igc29tZQotCXBoeXMgdHlwZSAoIGUuZy4gSkRTVSApICovCi0JZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDYwOyB0aW1lb3V0KyspIHsKLQkJaWYgKGJueDJ4X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGFyYW1zLCAxLCAxLCAmdmFsKQotCQkgICAgPT0gMCkgewotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTRlArIG1vZHVsZSBpbml0aWFsaXphdGlvbiAiCi0JCQkJICAgICAidG9vayAlZCBtc1xuIiwgdGltZW91dCAqIDUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbXNsZWVwKDUpOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfODcyN19wb3dlcl9tb2R1bGUoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgdTggZXh0X3BoeV9hZGRyLCB1OCBpc19wb3dlcl91cCkgewotCS8qIE1ha2Ugc3VyZSBHUElPcyBhcmUgbm90IHVzaW5nIGZvciBMRUQgbW9kZSAqLwotCXUxNiB2YWw7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQkvKgotCSAqIEluIHRoZSBHUElPIHJlZ2lzdGVyLCBiaXQgNCBpcyB1c2UgdG8gZGV0ZW1pbmUgaWYgdGhlIEdQSU9zIGFyZQotCSAqIG9wZXJhdGluZyBhcyBJTlBVVCBvciBhcyBPVVRQVVQuIEJpdCAxIGlzIGZvciBpbnB1dCwgYW5kIDAgZm9yCi0JICogb3V0cHV0Ci0JICogQml0cyAwLTEgZGV0ZXJtaW5lIHRoZSBncGlvcyB2YWx1ZSBmb3IgT1VUUFVUIGluIGNhc2UgYml0IDQgdmFsIGlzIDAKLQkgKiBCaXRzIDgtOSBkZXRlcm1pbmUgdGhlIGdwaW9zIHZhbHVlIGZvciBJTlBVVCBpbiBjYXNlIGJpdCA0IHZhbCBpcyAxCi0JICogd2hlcmUgdGhlIDFzdCBiaXQgaXMgdGhlIG92ZXItY3VycmVudChvbmx5IGlucHV0KSwgYW5kIDJuZCBiaXQgaXMKLQkgKiBmb3IgcG93ZXIoIG9ubHkgb3V0cHV0ICkKLQkqLwotCi0JLyoKLQkgKiBJbiBjYXNlIG9mIE5PQyBmZWF0dXJlIGlzIGRpc2FibGVkIGFuZCBwb3dlciBpcyB1cCwgc2V0IEdQSU8gY29udHJvbAotCSAqICBhcyBpbnB1dCB0byBlbmFibGUgbGlzdGVuaW5nIG9mIG92ZXItY3VycmVudCBpbmRpY2F0aW9uCi0JICovCi0KLQlpZiAoIShwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKLQkgICAgICBGRUFUVVJFX0NPTkZJR19CQ004NzI3X05PQykgJiYgaXNfcG93ZXJfdXApCi0JCXZhbCA9ICgxPDw0KTsKLQllbHNlCi0JCS8qCi0JCSAqIFNldCBHUElPIGNvbnRyb2wgdG8gT1VUUFVULCBhbmQgc2V0IHRoZSBwb3dlciBiaXQKLQkJICogdG8gYWNjb3JkaW5nIHRvIHRoZSBpc19wb3dlcl91cAotCQkgKi8KLQkJdmFsID0gKCghKGlzX3Bvd2VyX3VwKSkgPDwgMSk7Ci0KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfR1BJT19DVFJMLAotCQkgICAgICAgdmFsKTsKLX0KLQotc3RhdGljIHU4IGJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBlZGNfbW9kZTsKLQl1OCByYyA9IDA7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCXUzMiB2YWwgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCi0JCQkgICAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sIGRldl9pbmZvLgotCQkJCSAgICAgcG9ydF9mZWF0dXJlX2NvbmZpZ1twYXJhbXMtPnBvcnRdLmNvbmZpZykpOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJTRlArIG1vZHVsZSBwbHVnZ2VkIGluL291dCBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLAotCQkgcGFyYW1zLT5wb3J0KTsKLQotCWlmIChibngyeF9nZXRfZWRjX21vZGUocGFyYW1zLCAmZWRjX21vZGUpICE9IDApIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJGYWlsZWQgdG8gZ2V0IHZhbGlkIG1vZHVsZSB0eXBlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmIChibngyeF92ZXJpZnlfc2ZwX21vZHVsZShwYXJhbXMpICE9Ci0JCSAgIDApIHsKLQkJLyogY2hlY2sgU0ZQKyBtb2R1bGUgY29tcGF0aWJpbGl0eSAqLwotCQlEUChORVRJRl9NU0dfTElOSywgIk1vZHVsZSB2ZXJpZmljYXRpb24gZmFpbGVkISFcbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCS8qIFR1cm4gb24gZmF1bHQgbW9kdWxlLWRldGVjdGVkIGxlZCAqLwotCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18wLAotCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19ISUdILAotCQkJCSAgcGFyYW1zLT5wb3J0KTsKLQkJaWYgKChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNykgJiYKLQkJICAgICgodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spID09Ci0JCSAgICAgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX1BPV0VSX0RPV04pKSB7Ci0JCQkvKiBTaHV0ZG93biBTRlArIG1vZHVsZSAqLwotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTaHV0ZG93biBTRlArIG1vZHVsZSEhXG4iKTsKLQkJCWJueDJ4Xzg3MjdfcG93ZXJfbW9kdWxlKGJwLCBwYXJhbXMsCi0JCQkJCSAgICAgIGV4dF9waHlfYWRkciwgMCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBUdXJuIG9mZiBmYXVsdCBtb2R1bGUtZGV0ZWN0ZWQgbGVkICovCi0JCURQKE5FVElGX01TR19MSU5LLCAiVHVybiBvZmYgZmF1bHQgbW9kdWxlLWRldGVjdGVkIGxlZFxuIik7Ci0JCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzAsCi0JCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19MT1csCi0JCQkJCSAgcGFyYW1zLT5wb3J0KTsKLQl9Ci0KLQkvKiBwb3dlciB1cCB0aGUgU0ZQIG1vZHVsZSAqLwotCWlmIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNykKLQkJYm54MnhfODcyN19wb3dlcl9tb2R1bGUoYnAsIHBhcmFtcywgZXh0X3BoeV9hZGRyLCAxKTsKLQotCS8qIENoZWNrIGFuZCBzZXQgbGltaXRpbmcgbW9kZSAvIExSTSBtb2RlIG9uIDg3MjYuCi0JT24gODcyNyBpdCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgKi8KLQlpZiAoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpCi0JCWJueDJ4X2JjbTg3MjZfc2V0X2xpbWl0aW5nX21vZGUocGFyYW1zLCBlZGNfbW9kZSk7Ci0JZWxzZQotCQlibngyeF9iY204NzI3X3NldF9saW1pdGluZ19tb2RlKHBhcmFtcywgZWRjX21vZGUpOwotCS8qCi0JICogRW5hYmxlIHRyYW5zbWl0IGZvciB0aGlzIG1vZHVsZSBpZiB0aGUgbW9kdWxlIGlzIGFwcHJvdmVkLCBvcgotCSAqIGlmIHVuYXBwcm92ZWQgbW9kdWxlcyBzaG91bGQgYWxzbyBlbmFibGUgdGhlIFR4IGxhc2VyCi0JICovCi0JaWYgKHJjID09IDAgfHwKLQkgICAgKHZhbCAmIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9NQVNLKSAhPQotCSAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfRElTQUJMRV9UWF9MQVNFUikKLQkJYm54Mnhfc2ZwX3NldF90cmFuc21pdHRlcihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQlleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwgMSk7Ci0JZWxzZQotCQlibngyeF9zZnBfc2V0X3RyYW5zbWl0dGVyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCWV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLCAwKTsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCBibngyeF9oYW5kbGVfbW9kdWxlX2RldGVjdF9pbnQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTMyIGdwaW9fdmFsOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0KLQkvKiBTZXQgdmFsaWQgbW9kdWxlIGxlZCBvZmYgKi8KLQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18wLAotCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX0hJR0gsCi0JCQkgIHBhcmFtcy0+cG9ydCk7Ci0KLQkvKiBHZXQgY3VycmVudCBncGlvIHZhbCByZWZlbGVjdGluZyBtb2R1bGUgcGx1Z2dlZCBpbiAvIG91dCovCi0JZ3Bpb192YWwgPSBibngyeF9nZXRfZ3BpbyhicCwgIE1JU0NfUkVHSVNURVJTX0dQSU9fMywgcG9ydCk7Ci0KLQkvKiBDYWxsIHRoZSBoYW5kbGluZyBmdW5jdGlvbiBpbiBjYXNlIG1vZHVsZSBpcyBkZXRlY3RlZCAqLwotCWlmIChncGlvX3ZhbCA9PSAwKSB7Ci0KLQkJYm54Mnhfc2V0X2dwaW9faW50KGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzMsCi0JCQkJICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfT1VUUFVUX0NMUiwKLQkJCQkgICAgICBwb3J0KTsKLQotCQlpZiAoYm54Mnhfd2FpdF9mb3Jfc2ZwX21vZHVsZV9pbml0aWFsaXplZChwYXJhbXMpID09Ci0JCSAgICAwKQotCQkJYm54Mnhfc2ZwX21vZHVsZV9kZXRlY3Rpb24ocGFyYW1zKTsKLQkJZWxzZQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTRlArIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWRcbiIpOwotCX0gZWxzZSB7Ci0JCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCi0JCXUzMiBleHRfcGh5X3R5cGUgPQotCQkJWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCXUzMiB2YWwgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCi0JCQkJICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBkZXZfaW5mby4KLQkJCQkJICAgICAgcG9ydF9mZWF0dXJlX2NvbmZpZ1twYXJhbXMtPnBvcnRdLgotCQkJCQkgICAgICBjb25maWcpKTsKLQotCQlibngyeF9zZXRfZ3Bpb19pbnQoYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKLQkJCQkgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX0lOVF9PVVRQVVRfU0VULAotCQkJCSAgICAgIHBvcnQpOwotCQkvKiBNb2R1bGUgd2FzIHBsdWdnZWQgb3V0LiAqLwotCQkvKiBEaXNhYmxlIHRyYW5zbWl0IGZvciB0aGlzIG1vZHVsZSAqLwotCQlpZiAoKHZhbCAmIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9NQVNLKSA9PQotCQkgICAgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX0RJU0FCTEVfVFhfTEFTRVIpCi0JCQlibngyeF9zZnBfc2V0X3RyYW5zbWl0dGVyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCQlleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwgMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9iY204MDd4X2ZvcmNlXzEwRyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQotCS8qIEZvcmNlIEtSIG9yIEtYICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLAotCQkgICAgICAgMHgyMDQwKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHXzEwR19DVFJMMiwKLQkJICAgICAgIDB4MDAwYik7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR19CQ01fQ1RSTCwKLQkJICAgICAgIDB4MDAwMCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkgICAgICAgTURJT19BTl9SRUdfQ1RSTCwKLQkJICAgICAgIDB4MDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2JjbTgwNzNfc2V0X3hhdWlfbG93X3Bvd2VyX21vZGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1MTYgdmFsOwotCXU4IGV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQotCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfODA3M19DSElQX1JFViwgJnZhbCk7Ci0KLQlpZiAodmFsID09IDApIHsKLQkJLyogTXVzdG4ndCBzZXQgbG93IHBvd2VyIG1vZGUgaW4gODA3MyBBMCAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogRGlzYWJsZSBQTEwgc2VxdWVuY2VyICh1c2UgcmVhZC1tb2RpZnktd3JpdGUgdG8gY2xlYXIgYml0IDEzKSAqLwotCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1hTX0RFVkFELAotCQkgICAgICAgTURJT19YU19QTExfU0VRVUVOQ0VSLCAmdmFsKTsKLQl2YWwgJj0gfigxPDwxMyk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1hTX0RFVkFELCBNRElPX1hTX1BMTF9TRVFVRU5DRVIsIHZhbCk7Ci0KLQkvKiBQTEwgY29udHJvbHMgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODA1RSwgMHgxMDc3KTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODA1RCwgMHgwMDAwKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODA1QywgMHgwMzBCKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODA1QiwgMHgxMjQwKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fWFNfREVWQUQsIDB4ODA1QSwgMHgyNDkwKTsKLQotCS8qIFR4IENvbnRyb2xzICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1hTX0RFVkFELCAweDgwQTcsIDB4MEM3NCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1hTX0RFVkFELCAweDgwQTYsIDB4OTA0MSk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1hTX0RFVkFELCAweDgwQTUsIDB4NDY0MCk7Ci0KLQkvKiBSeCBDb250cm9scyAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MEZFLCAweDAxQzQpOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MEZELCAweDkyNDkpOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19YU19ERVZBRCwgMHg4MEZDLCAweDIwMTUpOwotCi0JLyogRW5hYmxlIFBMTCBzZXF1ZW5jZXIgICh1c2UgcmVhZC1tb2RpZnktd3JpdGUgdG8gc2V0IGJpdCAxMykgKi8KLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19YU19ERVZBRCwKLQkJICAgICAgIE1ESU9fWFNfUExMX1NFUVVFTkNFUiwgJnZhbCk7Ci0JdmFsIHw9ICgxPDwxMyk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwgZXh0X3BoeV90eXBlLCBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1hTX0RFVkFELCBNRElPX1hTX1BMTF9TRVFVRU5DRVIsIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4XzgwNzNfc2V0X3BhdXNlX2NsMzcoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBjbDM3X3ZhbDsKLQl1OCBleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0KLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCSAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTEQsICZjbDM3X3ZhbCk7Ci0KLQljbDM3X3ZhbCAmPSB+TURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDsKLQkvKiBQbGVhc2UgcmVmZXIgdG8gVGFibGUgMjhCLTMgb2YgODAyLjNhYi0xOTk5IHNwZWMuICovCi0KLQlpZiAoKHZhcnMtPmllZWVfZmMgJgotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9TWU1NRVRSSUMpID09Ci0JICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX1NZTU1FVFJJQykgewotCQljbDM3X3ZhbCB8PSAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfU1lNTUVUUklDOwotCX0KLQlpZiAoKHZhcnMtPmllZWVfZmMgJgotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDKSA9PQotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDKSB7Ci0JCWNsMzdfdmFsIHw9ICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOwotCX0KLQlpZiAoKHZhcnMtPmllZWVfZmMgJgotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSA9PQotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSB7Ci0JCWNsMzdfdmFsIHw9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEg7Ci0JfQotCURQKE5FVElGX01TR19MSU5LLAotCQkgIkV4dCBwaHkgQU4gYWR2ZXJ0aXplIGNsMzcgMHgleFxuIiwgY2wzN192YWwpOwotCi0JYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfRkNfTEQsIGNsMzdfdmFsKTsKLQltc2xlZXAoNTAwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZXh0X3BoeV9zZXRfcGF1c2Uoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiB2YWw7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCi0JLyogcmVhZCBtb2RpZnkgd3JpdGUgcGF1c2UgYWR2ZXJ0aXppbmcgKi8KLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCSAgICAgIE1ESU9fQU5fUkVHX0FEVl9QQVVTRSwgJnZhbCk7Ci0KLQl2YWwgJj0gfk1ESU9fQU5fUkVHX0FEVl9QQVVTRV9CT1RIOwotCi0JLyogUGxlYXNlIHJlZmVyIHRvIFRhYmxlIDI4Qi0zIG9mIDgwMi4zYWItMTk5OSBzcGVjLiAqLwotCi0JaWYgKCh2YXJzLT5pZWVlX2ZjICYKLQkgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQVNZTU1FVFJJQykgPT0KLQkgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQVNZTU1FVFJJQykgewotCQl2YWwgfD0gIE1ESU9fQU5fUkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOwotCX0KLQlpZiAoKHZhcnMtPmllZWVfZmMgJgotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSA9PQotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSB7Ci0JCXZhbCB8PQotCQkgTURJT19BTl9SRUdfQURWX1BBVVNFX1BBVVNFOwotCX0KLQlEUChORVRJRl9NU0dfTElOSywKLQkJICJFeHQgcGh5IEFOIGFkdmVydGl6ZSAweCV4XG4iLCB2YWwpOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCSAgICAgICBNRElPX0FOX1JFR19BRFZfUEFVU0UsIHZhbCk7Ci19Ci1zdGF0aWMgdm9pZCBibngyeF9zZXRfcHJlZW1waGFzaXMoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0JdTE2IGJhbmssIGkgPSAwOwotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCi0JZm9yIChiYW5rID0gTURJT19SRUdfQkFOS19SWDAsIGkgPSAwOyBiYW5rIDw9IE1ESU9fUkVHX0JBTktfUlgzOwotCSAgICAgIGJhbmsgKz0gKE1ESU9fUkVHX0JBTktfUlgxLU1ESU9fUkVHX0JBTktfUlgwKSwgaSsrKSB7Ci0JCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCQkgICAgICBiYW5rLAotCQkJCQkgICAgICBNRElPX1JYMF9SWF9FUV9CT09TVCwKLQkJCQkJICAgICAgcGFyYW1zLT54Z3hzX2NvbmZpZ19yeFtpXSk7Ci0JfQotCi0JZm9yIChiYW5rID0gTURJT19SRUdfQkFOS19UWDAsIGkgPSAwOyBiYW5rIDw9IE1ESU9fUkVHX0JBTktfVFgzOwotCQkgICAgICBiYW5rICs9IChNRElPX1JFR19CQU5LX1RYMSAtIE1ESU9fUkVHX0JBTktfVFgwKSwgaSsrKSB7Ci0JCQlDTDQ1X1dSX09WRVJfQ0wyMihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJCQkgICAgICBiYW5rLAotCQkJCQkgICAgICBNRElPX1RYMF9UWF9EUklWRVIsCi0JCQkJCSAgICAgIHBhcmFtcy0+eGd4c19jb25maWdfdHhbaV0pOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBibngyeF84NDgxX3NldF9sZWQ0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgICAgdTMyIGV4dF9waHlfdHlwZSwgdTggZXh0X3BoeV9hZGRyKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCi0JLyogUEhZQ19DVExfTEVEX0NUTCAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfTElOS19TSUdOQUwsIDB4YTQ4Mik7Ci0KLQkvKiBVbm1hc2sgTEVENCBmb3IgMTBHIGxpbmsgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR184NDgxX1NJR05BTF9NQVNLLCAoMTw8NikpOwotCS8qICdJbnRlcnJ1cHQgTWFzaycgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkgICAgICAgMHhGRkZCLCAweEZGRkQpOwotfQotc3RhdGljIHZvaWQgYm54MnhfODQ4MV9zZXRfbGVnYWN5X2xlZF9tb2RlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCQkgdTMyIGV4dF9waHlfdHlwZSwgdTggZXh0X3BoeV9hZGRyKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCi0JLyogTEVEMSAoMTBHIExpbmspOiBEaXNhYmxlIExFRDEgd2hlbiAxMC8xMDAvMTAwMCBsaW5rICovCi0JLyogTEVEMiAoMUcvMTAwLzEwIExpbmspOiBFbmFibGUgTEVEMiB3aGVuIDEwLzEwMC8xMDAwIGxpbmspICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJICAgICAgIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX1NIQURPVywKLQkJICAgICAgICgxPDwxNSkgfCAoMHhkIDw8IDEwKSB8ICgweGM8PDQpIHwgMHhlKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfODQ4MV9zZXRfMTBHX2xlZF9tb2RlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICAgIHUzMiBleHRfcGh5X3R5cGUsIHU4IGV4dF9waHlfYWRkcikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgdmFsMTsKLQotCS8qIExFRDEgKDEwRyBMaW5rKSAqLwotCS8qIEVuYWJsZSBjb250aW51c2UgYmFzZWQgb24gc291cmNlIDcoMTBHLWxpbmspICovCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR184NDgxX0xJTktfU0lHTkFMLAotCQkgICAgICAgJnZhbDEpOwotCS8qIFNldCBiaXQgMiB0byAwLCBhbmQgYml0cyBbMTowXSB0byAxMCAqLwotCXZhbDEgJj0gfigoMTw8MCkgfCAoMTw8MikgfCAoMTw8NykpOyAvKiBDbGVhciBiaXRzIDAsMiw3Ki8KLQl2YWwxIHw9ICgoMTw8MSkgfCAoMTw8NikpOyAvKiBTZXQgYml0IDEsIDYgKi8KLQotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfTElOS19TSUdOQUwsCi0JCSAgICAgICB2YWwxKTsKLQotCS8qIFVubWFzayBMRUQxIGZvciAxMEcgbGluayAqLwotCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgIE1ESU9fUE1BX1JFR184NDgxX0xFRDFfTUFTSywKLQkJICAgICAgJnZhbDEpOwotCS8qIFNldCBiaXQgMiB0byAwLCBhbmQgYml0cyBbMTowXSB0byAxMCAqLwotCXZhbDEgfD0gKDE8PDcpOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfTEVEMV9NQVNLLAotCQkgICAgICAgdmFsMSk7Ci0KLQkvKiBMRUQyICgxRy8xMDAvMTBHIExpbmspICovCi0JLyogTWFzayBMRUQyIGZvciAxMEcgbGluayAqLwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHXzg0ODFfTEVEMl9NQVNLLAotCQkgICAgICAgMCk7Ci0KLQkvKiBVbm1hc2sgTEVEMyBmb3IgMTBHIGxpbmsgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgTURJT19QTUFfUkVHXzg0ODFfTEVEM19NQVNLLAotCQkgICAgICAgMHg2KTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJICAgICAgIE1ESU9fUE1BX1JFR184NDgxX0xFRDNfQkxJTkssCi0JCSAgICAgICAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X2ludGVybmFsX3BoeShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCi0JCQkJICB1OCBlbmFibGVfY2w3MykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQotCWlmICghKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9TR01JSV9GTEFHKSkgewotCQlpZiAoKFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpID09Ci0JCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKSAmJgotCQkgICAgKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgotCQkgICAgIEZFQVRVUkVfQ09ORklHX09WRVJSSURFX1BSRUVNUEhBU0lTX0VOQUJMRUQpKQotCQkJYm54Mnhfc2V0X3ByZWVtcGhhc2lzKHBhcmFtcyk7Ci0KLQkJLyogZm9yY2VkIHNwZWVkIHJlcXVlc3RlZD8gKi8KLQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgIT0gU1BFRURfQVVUT19ORUcgfHwKLQkJICAgICgoWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZykgPT0KLQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCi0JCQkgIHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19FWFQpKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIm5vdCBTR01JSSwgbm8gQU5cbiIpOwotCi0JCQkvKiBkaXNhYmxlIGF1dG9uZWcgKi8KLQkJCWJueDJ4X3NldF9hdXRvbmVnKHBhcmFtcywgdmFycywgMCk7Ci0KLQkJCS8qIHByb2dyYW0gc3BlZWQgYW5kIGR1cGxleCAqLwotCQkJYm54MnhfcHJvZ3JhbV9zZXJkZXMocGFyYW1zLCB2YXJzKTsKLQotCQl9IGVsc2UgeyAvKiBBTl9tb2RlICovCi0JCQlEUChORVRJRl9NU0dfTElOSywgIm5vdCBTR01JSSwgQU5cbiIpOwotCi0JCQkvKiBBTiBlbmFibGVkICovCi0JCQlibngyeF9zZXRfYnJjbV9jbDM3X2FkdmVydGlzbWVudChwYXJhbXMpOwotCi0JCQkvKiBwcm9ncmFtIGR1cGxleCAmIHBhdXNlIGFkdmVydGlzZW1lbnQgKGZvciBhbmVnKSAqLwotCQkJYm54Mnhfc2V0X2llZWVfYW5lZ19hZHZlcnRpc21lbnQocGFyYW1zLAotCQkJCQkJICAgICAgIHZhcnMtPmllZWVfZmMpOwotCi0JCQkvKiBlbmFibGUgYXV0b25lZyAqLwotCQkJYm54Mnhfc2V0X2F1dG9uZWcocGFyYW1zLCB2YXJzLCBlbmFibGVfY2w3Myk7Ci0KLQkJCS8qIGVuYWJsZSBhbmQgcmVzdGFydCBBTiAqLwotCQkJYm54MnhfcmVzdGFydF9hdXRvbmVnKHBhcmFtcywgZW5hYmxlX2NsNzMpOwotCQl9Ci0KLQl9IGVsc2UgeyAvKiBTR01JSSBtb2RlICovCi0JCURQKE5FVElGX01TR19MSU5LLCAiU0dNSUlcbiIpOwotCi0JCWJueDJ4X2luaXRpYWxpemVfc2dtaWlfcHJvY2VzcyhwYXJhbXMsIHZhcnMpOwotCX0KLX0KLQotc3RhdGljIHU4IGJueDJ4X2V4dF9waHlfaW5pdChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MzIgZXh0X3BoeV90eXBlOwotCXU4IGV4dF9waHlfYWRkcjsKLQl1MTYgY250OwotCXUxNiBjdHJsID0gMDsKLQl1MTYgdmFsID0gMDsKLQl1OCByYyA9IDA7Ci0KLQlpZiAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgewotCQlleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQotCQlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIHNvZnQgcmVzZXQgaXMgb2ZmIChleHBlY3QgZm9yIHRoZSA4MDcyOgotCQkgKiBkdWUgdG8gdGhlIGxvY2ssIGl0IHdpbGwgYmUgZG9uZSBpbnNpZGUgdGhlIHNwZWNpZmljCi0JCSAqIGhhbmRsaW5nKQotCQkgKi8KLQkJaWYgKChleHRfcGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKSAmJgotCQkgICAgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFKSAmJgotCQkgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX05PVF9DT05OKSAmJgotCQkgICAgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyKSAmJgotCQkgICAgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczKSkgewotCQkJLyogV2FpdCBmb3Igc29mdCByZXNldCB0byBnZXQgY2xlYXJlZCB1cHRvIDEgc2VjICovCi0JCQlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDA7IGNudCsrKSB7Ci0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgTURJT19QTUFfUkVHX0NUUkwsICZjdHJsKTsKLQkJCQlpZiAoIShjdHJsICYgKDE8PDE1KSkpCi0JCQkJCWJyZWFrOwotCQkJCW1zbGVlcCgxKTsKLQkJCX0KLQkJCURQKE5FVElGX01TR19MSU5LLCAiY29udHJvbCByZWcgMHgleCAoYWZ0ZXIgJWQgbXMpXG4iLAotCQkJCSBjdHJsLCBjbnQpOwotCQl9Ci0KLQkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODcwNVxuIik7Ci0KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTUlTQ19DVFJMLAotCQkJCSAgICAgICAweDgyODgpOwotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKLQkJCQkgICAgICAgMHg3ZmJmKTsKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ01VX1BMTF9CWVBBU1MsCi0JCQkJICAgICAgIDB4MDEwMCk7Ci0JCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX1dJU19ERVZBRCwKLQkJCQkgICAgICAgTURJT19XSVNfUkVHX0xBU0lfQ05UTCwgMHgxKTsKLQotCQkJLyogQkNNODcwNSBkb2Vzbid0IGhhdmUgbWljcm9jb2RlLCBoZW5jZSB0aGUgMCAqLwotCQkJYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkJcGFyYW1zLT5zaG1lbV9iYXNlLCAwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKLQkJCS8qIFdhaXQgdW50aWwgZncgaXMgbG9hZGVkICovCi0JCQlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDsgY250KyspIHsKLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICBNRElPX1BNQV9SRUdfUk9NX1ZFUjEsICZ2YWwpOwotCQkJCWlmICh2YWwpCi0JCQkJCWJyZWFrOwotCQkJCW1zbGVlcCgxMCk7Ci0JCQl9Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODcwNiBpcyBpbml0aWFsaXplZCAiCi0JCQkJImFmdGVyICVkIG1zXG4iLCBjbnQpOwotCQkJaWYgKChwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKLQkJCSAgICAgRkVBVFVSRV9DT05GSUdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfRU5BQkxFRCkpIHsKLQkJCQl1OCBpOwotCQkJCXUxNiByZWc7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJCQlyZWcgPSBNRElPX1hTXzg3MDZfUkVHX0JBTktfUlgwICsKLQkJCQkJCWkqKE1ESU9fWFNfODcwNl9SRUdfQkFOS19SWDEgLQotCQkJCQkJICAgTURJT19YU184NzA2X1JFR19CQU5LX1JYMCk7Ci0JCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkJICAgICAgTURJT19YU19ERVZBRCwKLQkJCQkJCSAgICAgIHJlZywgJnZhbCk7Ci0JCQkJCS8qIENsZWFyIGZpcnN0IDMgYml0cyBvZiB0aGUgY29udHJvbCAqLwotCQkJCQl2YWwgJj0gfjB4NzsKLQkJCQkJLyogU2V0IGNvbnRyb2wgYml0cyBhY2NvcmRpbmcgdG8KLQkJCQkJY29uZmlndWF0aW9uICovCi0JCQkJCXZhbCB8PSAocGFyYW1zLT54Z3hzX2NvbmZpZ19yeFtpXSAmCi0JCQkJCQkweDcpOwotCQkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgUlgiCi0JCQkJCQkgIkVxdWFsaXplciB0byBCQ004NzA2IHJlZyAweCV4IgotCQkJCQkJICIgPC0tIHZhbCAweCV4XG4iLCByZWcsIHZhbCk7Ci0JCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkJICAgICAgIE1ESU9fWFNfREVWQUQsCi0JCQkJCQkgICAgICAgcmVnLCB2YWwpOwotCQkJCX0KLQkJCX0KLQkJCS8qIEZvcmNlIHNwZWVkICovCi0JCQlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgewotCQkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA2IGZvcmNlIDEwR2Jwc1xuIik7Ci0KLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19ESUdJVEFMX0NUUkwsCi0JCQkJCSAgICAgICAweDQwMCk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0xBU0lfQ1RSTCwgMSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEZvcmNlIDFHYnBzIHVzaW5nIGF1dG9uZWcgd2l0aCAxRwotCQkJCWFkdmVydGlzbWVudCAqLwotCi0JCQkJLyogQWxsb3cgQ0wzNyB0aHJvdWdoIENMNzMgKi8KLQkJCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODcwNiBBdXRvTmVnXG4iKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgTURJT19BTl9SRUdfQ0wzN19DTDczLAotCQkJCQkgICAgICAgMHgwNDBjKTsKLQotCQkJCS8qIEVuYWJsZSBGdWxsLUR1cGxleCBhZHZlcnRpc21lbnQgb24gQ0wzNyAqLwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0ZDX0xQLAotCQkJCQkgICAgICAgMHgwMDIwKTsKLQkJCQkvKiBFbmFibGUgQ0wzNyBBTiAqLwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0FOLAotCQkJCQkgICAgICAgMHgxMDAwKTsKLQkJCQkvKiAxRyBzdXBwb3J0ICovCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0FEViwgKDE8PDUpKTsKLQotCQkJCS8qIEVuYWJsZSBjbGF1c2UgNzMgQU4gKi8KLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgTURJT19BTl9SRUdfQ1RSTCwKLQkJCQkJICAgICAgIDB4MTIwMCk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwKLQkJCQkJICAgICAgIDB4MDQwMCk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAweDAwMDQpOwotCi0JCQl9Ci0JCQlibngyeF9zYXZlX2JjbV9zcGlyb21fdmVyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCQlleHRfcGh5X3R5cGUsCi0JCQkJCQlleHRfcGh5X2FkZHIsCi0JCQkJCQlwYXJhbXMtPnNobWVtX2Jhc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKLQkJCURQKE5FVElGX01TR19MSU5LLCAiSW5pdGlhbGl6aW5nIEJDTTg3MjZcbiIpOwotCQkJYm54MnhfYmNtODcyNl9leHRlcm5hbF9yb21fYm9vdChwYXJhbXMpOwotCi0JCQkvKiBOZWVkIHRvIGNhbGwgbW9kdWxlIGRldGVjdGVkIG9uIGluaXRpYWxpemF0aW9uIHNpbmNlCi0JCQl0aGUgbW9kdWxlIGRldGVjdGlvbiB0cmlnZ2VyZWQgYnkgYWN0dWFsIG1vZHVsZQotCQkJaW5zZXJ0aW9uIG1pZ2h0IG9jY3VyIGJlZm9yZSBkcml2ZXIgaXMgbG9hZGVkLCBhbmQgd2hlbgotCQkJZHJpdmVyIGlzIGxvYWRlZCwgaXQgcmVzZXQgYWxsIHJlZ2lzdGVycywgaW5jbHVkaW5nIHRoZQotCQkJdHJhbnNtaXR0ZXIgKi8KLQkJCWJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHBhcmFtcyk7Ci0KLQkJCS8qIFNldCBGbG93IGNvbnRyb2wgKi8KLQkJCWJueDJ4X2V4dF9waHlfc2V0X3BhdXNlKHBhcmFtcywgdmFycyk7Ci0JCQlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDFHIGZvcmNlXG4iKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwgMHg0MCk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHXzEwR19DVFJMMiwgMHhEKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAweDUpOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAotCQkJCQkgICAgICAgMHg0MDApOwotCQkJfSBlbHNlIGlmICgocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PQotCQkJCSAgICBTUEVFRF9BVVRPX05FRykgJiYKLQkJCQkgICAoKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgotCQkJCSAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDFHIGNsYXVzZTM3XG4iKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0FEViwgMHgyMCk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0NMNzMsIDB4MDQwYyk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0ZDX0xELCAweDAwMjApOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgTURJT19BTl9SRUdfQ0wzN19BTiwgMHgxMDAwKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NUUkwsIDB4MTIwMCk7Ci0KLQkJCQkvKiBFbmFibGUgUlgtQUxBUk0gY29udHJvbCB0byByZWNlaXZlCi0JCQkJaW50ZXJydXB0IGZvciAxRyBzcGVlZCBjaGFuZ2UgKi8KLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAweDQpOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAotCQkJCQkgICAgICAgMHg0MDApOwotCi0JCQl9IGVsc2UgeyAvKiBEZWZhdWx0IDEwRy4gU2V0IG9ubHkgTEFTSSBjb250cm9sICovCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0xBU0lfQ1RSTCwgMSk7Ci0JCQl9Ci0KLQkJCS8qIFNldCBUWCBQcmVFbXBoYXNpcyBpZiBuZWVkZWQgKi8KLQkJCWlmICgocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCi0JCQkgICAgIEZFQVRVUkVfQ09ORklHX09WRVJSSURFX1BSRUVNUEhBU0lTX0VOQUJMRUQpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIFRYX0NUUkwxIDB4JXgsIgotCQkJCQkgIlRYX0NUUkwyIDB4JXhcbiIsCi0JCQkJCSBwYXJhbXMtPnhneHNfY29uZmlnX3R4WzBdLAotCQkJCQkgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFsxXSk7Ci0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfODcyNl9UWF9DVFJMMSwKLQkJCQkJICAgICAgIHBhcmFtcy0+eGd4c19jb25maWdfdHhbMF0pOwotCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfODcyNl9UWF9DVFJMMiwKLQkJCQkJICAgICAgIHBhcmFtcy0+eGd4c19jb25maWdfdHhbMV0pOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczOgotCQl7Ci0JCQl1MTYgdG1wMTsKLQkJCXUxNiByeF9hbGFybV9jdHJsX3ZhbDsKLQkJCXUxNiBsYXNpX2N0cmxfdmFsOwotCQkJaWYgKGV4dF9waHlfdHlwZSA9PQotCQkJICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzIpIHsKLQkJCQlyeF9hbGFybV9jdHJsX3ZhbCA9IDB4NDAwOwotCQkJCWxhc2lfY3RybF92YWwgPSAweDAwMDQ7Ci0JCQl9IGVsc2UgewotCQkJCXJ4X2FsYXJtX2N0cmxfdmFsID0gKDE8PDIpOwotCQkJCWxhc2lfY3RybF92YWwgPSAweDAwMDQ7Ci0JCQl9Ci0KLQkJCS8qIGVuYWJsZSBMQVNJICovCi0JCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgZXh0X3BoeV90eXBlLAotCQkJCSAgIGV4dF9waHlfYWRkciwKLQkJCQkgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwKLQkJCQkgICByeF9hbGFybV9jdHJsX3ZhbCk7Ci0KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLAotCQkJCSAgICAgICBsYXNpX2N0cmxfdmFsKTsKLQotCQkJYm54MnhfODA3M19zZXRfcGF1c2VfY2wzNyhwYXJhbXMsIHZhcnMpOwotCi0JCQlpZiAoZXh0X3BoeV90eXBlID09Ci0JCQkgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MikKLQkJCQlibngyeF9iY204MDcyX2V4dGVybmFsX3JvbV9ib290KHBhcmFtcyk7Ci0JCQllbHNlCi0JCQkJLyogSW4gY2FzZSBvZiA4MDczIHdpdGggbG9uZyB4YXVpIGxpbmVzLAotCQkJCWRvbid0IHNldCB0aGUgODA3MyB4YXVpIGxvdyBwb3dlciovCi0JCQkJYm54MnhfYmNtODA3M19zZXRfeGF1aV9sb3dfcG93ZXJfbW9kZShwYXJhbXMpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR19NODA1MV9NU0dPVVRfUkVHLAotCQkJCSAgICAgICZ0bXAxKTsKLQotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZ0bXAxKTsKLQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCZWZvcmUgcm9tIFJYX0FMQVJNKHBvcnQxKToiCi0JCQkJCSAgICAgIjB4JXhcbiIsIHRtcDEpOwotCi0JCQkvKiBJZiB0aGlzIGlzIGZvcmNlZCBzcGVlZCwgc2V0IHRvIEtSIG9yIEtYCi0JCQkgKiAoYWxsIG90aGVyIGFyZSBub3Qgc3VwcG9ydGVkKQotCQkJICovCi0JCQlpZiAocGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX0VYVCkgewotCQkJCWJueDJ4X2JjbTgwN3hfZm9yY2VfMTBHKHBhcmFtcyk7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCSJGb3JjZWQgc3BlZWQgMTBHIG9uIDgwN1hcbiIpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHX0JDTV9DVFJMLAotCQkJCQkgICAgICAgMHgwMDAyKTsKLQkJCX0KLQkJCWlmIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkICE9IFNQRUVEX0FVVE9fTkVHKSB7Ci0JCQkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTAwMDApIHsKLQkJCQkJdmFsID0gKDE8PDcpOwotCQkJCX0gZWxzZSBpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PQotCQkJCQkgICBTUEVFRF8yNTAwKSB7Ci0JCQkJCXZhbCA9ICgxPDw1KTsKLQkJCQkJLyogTm90ZSB0aGF0IDIuNUcgd29ya3Mgb25seQotCQkJCQl3aGVuIHVzZWQgd2l0aCAxRyBhZHZlcnRpc21lbnQgKi8KLQkJCQl9IGVsc2UKLQkJCQkJdmFsID0gKDE8PDUpOwotCQkJfSBlbHNlIHsKLQotCQkJCXZhbCA9IDA7Ci0JCQkJaWYgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgotCQkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwRykKLQkJCQkJdmFsIHw9ICgxPDw3KTsKLQotCQkJCS8qIE5vdGUgdGhhdCAyLjVHIHdvcmtzIG9ubHkgd2hlbgotCQkJCXVzZWQgd2l0aCAxRyBhZHZlcnRpc21lbnQgKi8KLQkJCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCi0JCQkJCShQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHIHwKLQkJCQkJIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMl81RykpCi0JCQkJCXZhbCB8PSAoMTw8NSk7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCSAiODA3eCBhdXRvbmVnIHZhbCA9IDB4JXhcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJICAgICAgIE1ESU9fQU5fUkVHX0FEViwgdmFsKTsKLQkJCWlmIChleHRfcGh5X3R5cGUgPT0KLQkJCSAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczKSB7Ci0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICBNRElPX0FOX1JFR184MDczXzJfNUcsICZ0bXAxKTsKLQotCQkJCWlmICgoKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgotCQkJCSAgICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMl81RykgJiYKLQkJCQkgICAgIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09Ci0JCQkJICAgICAgU1BFRURfQVVUT19ORUcpKSB8fAotCQkJCSAgICAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PQotCQkJCSAgICAgU1BFRURfMjUwMCkpIHsKLQkJCQkJdTE2IHBoeV92ZXI7Ci0JCQkJCS8qIEFsbG93IDIuNUcgZm9yIEExIGFuZCBhYm92ZSAqLwotCQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCi0JCQkJCSBleHRfcGh5X2FkZHIsCi0JCQkJCSBNRElPX1BNQV9ERVZBRCwKLQkJCQkJIE1ESU9fUE1BX1JFR184MDczX0NISVBfUkVWLCAmcGh5X3Zlcik7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLCAiQWRkIDIuNUdcbiIpOwotCQkJCQlpZiAocGh5X3ZlciA+IDApCi0JCQkJCQl0bXAxIHw9IDE7Ci0JCQkJCWVsc2UKLQkJCQkJCXRtcDEgJj0gMHhmZmZlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLCAiRGlzYWJsZSAyLjVHXG4iKTsKLQkJCQkJdG1wMSAmPSAweGZmZmU7Ci0JCQkJfQotCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHXzgwNzNfMl81RywgdG1wMSk7Ci0JCQl9Ci0KLQkJCS8qIEFkZCBzdXBwb3J0IGZvciBDTDM3IChwYXNzaXZlIG1vZGUpIElJICovCi0KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkgICAgICAgTURJT19BTl9SRUdfQ0wzN19GQ19MRCwKLQkJCQkgICAgICAgJnRtcDEpOwotCi0JCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkJCSAgICAgICBNRElPX0FOX1JFR19DTDM3X0ZDX0xELCAodG1wMSB8Ci0JCQkJICAgICAgICgocGFyYW1zLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKSA/Ci0JCQkJICAgICAgIDB4MjAgOiAweDQwKSkpOwotCi0JCQkvKiBBZGQgc3VwcG9ydCBmb3IgQ0wzNyAocGFzc2l2ZSBtb2RlKSBJSUkgKi8KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfQU4sIDB4MTAwMCk7Ci0KLQkJCWlmIChleHRfcGh5X3R5cGUgPT0KLQkJCSAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczKSB7Ci0JCQkJLyogVGhlIFNOUiB3aWxsIGltcHJvdmUgYWJvdXQgMmRiIGJ5IGNoYW5naW5nCi0JCQkJQlcgYW5kIEZFRSBtYWluIHRhcC4gUmVzdCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQKLQkJCQlhZnRlciBsaW5rIGlzIHVwKi8KLQkJCQkvKkNoYW5nZSBGRkUgbWFpbiBjdXJzb3IgdG8gNSBpbiBFREMgcmVnaXN0ZXIqLwotCQkJCWlmIChibngyeF84MDczX2lzX3Nucl9uZWVkZWQocGFyYW1zKSkKLQkJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkJICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJCSAgICBleHRfcGh5X2FkZHIsCi0JCQkJCQkgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCQkgICAgTURJT19QTUFfUkVHX0VEQ19GRkVfTUFJTiwKLQkJCQkJCSAgICAweEZCMEMpOwotCi0JCQkJLyogRW5hYmxlIEZFQyAoRm9yd2FyZSBFcnJvciBDb3JyZWN0aW9uKQotCQkJCVJlcXVlc3QgaW4gdGhlIEFOICovCi0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICBNRElPX0FOX1JFR19BRFYyLCAmdG1wMSk7Ci0KLQkJCQl0bXAxIHw9ICgxPDwxNSk7Ci0KLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgTURJT19BTl9SRUdfQURWMiwgdG1wMSk7Ci0KLQkJCX0KLQotCQkJYm54MnhfZXh0X3BoeV9zZXRfcGF1c2UocGFyYW1zLCB2YXJzKTsKLQotCQkJLyogUmVzdGFydCBhdXRvbmVnICovCi0JCQltc2xlZXAoNTAwKTsKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJICAgICAgIE1ESU9fQU5fUkVHX0NUUkwsIDB4MTIwMCk7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIjgwN3ggQXV0b25lZyBSZXN0YXJ0OiAiCi0JCQkgICAiQWR2ZXJ0aXNlIDFHPSV4LCAxMEc9JXhcbiIsCi0JCQkgICAoKHZhbCAmICgxPDw1KSkgPiAwKSwKLQkJCSAgICgodmFsICYgKDE8PDcpKSA+IDApKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgotCQl7Ci0JCQl1MTYgdG1wMTsKLQkJCXUxNiByeF9hbGFybV9jdHJsX3ZhbDsKLQkJCXUxNiBsYXNpX2N0cmxfdmFsOwotCi0JCQkvKiBFbmFibGUgUE1EIGxpbmssIE1PRF9BQlNfRkxULCBhbmQgMUcgbGluayBhbGFybSAqLwotCi0JCQl1MTYgbW9kX2FiczsKLQkJCXJ4X2FsYXJtX2N0cmxfdmFsID0gKDE8PDIpIHwgKDE8PDUpIDsKLQkJCWxhc2lfY3RybF92YWwgPSAweDAwMDQ7Ci0KLQkJCURQKE5FVElGX01TR19MSU5LLCAiSW5pdGlhbGl6aW5nIEJDTTg3MjdcbiIpOwotCQkJLyogZW5hYmxlIExBU0kgKi8KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwKLQkJCQkgICAgICAgcnhfYWxhcm1fY3RybF92YWwpOwotCi0JCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICAgTURJT19QTUFfUkVHX0xBU0lfQ1RSTCwKLQkJCQkgICAgICAgbGFzaV9jdHJsX3ZhbCk7Ci0KLQkJCS8qIEluaXRpYWxseSBjb25maWd1cmUgIE1PRF9BQlMgdG8gaW50ZXJydXB0IHdoZW4KLQkJCW1vZHVsZSBpcyBwcmVzZW5jZSggYml0IDgpICovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwgJm1vZF9hYnMpOwotCQkJLyogU2V0IEVEQyBvZmYgYnkgc2V0dGluZyBPUFRYTE9TIHNpZ25hbCBpbnB1dCB0byBsb3cKLQkJCShiaXQgOSkuCi0JCQlXaGVuIHRoZSBFREMgaXMgb2ZmIGl0IGxvY2tzIG9udG8gYSByZWZlcmVuY2UgY2xvY2sgYW5kCi0JCQlhdm9pZHMgYmVjb21pbmcgJ2xvc3QnLiovCi0JCQltb2RfYWJzICY9IH4oKDE8PDgpIHwgKDE8PDkpKTsKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsIG1vZF9hYnMpOwotCi0JCQkvKiBNYWtlIE1PRF9BQlMgZ2l2ZSBpbnRlcnJ1cHQgb24gY2hhbmdlICovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR184NzI3X1BDU19PUFRfQ1RSTCwKLQkJCQkgICAgICAmdmFsKTsKLQkJCXZhbCB8PSAoMTw8MTIpOwotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR184NzI3X1BDU19PUFRfQ1RSTCwKLQkJCQkgICAgICAgdmFsKTsKLQotCQkJLyogU2V0IDg3MjcgR1BJT3MgdG8gaW5wdXQgdG8gYWxsb3cgcmVhZGluZyBmcm9tIHRoZQotCQkJODcyNyBHUElPMCBzdGF0dXMgd2hpY2ggcmVmbGVjdCBTRlArIG1vZHVsZQotCQkJb3Zlci1jdXJyZW50ICovCi0KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfODcyN19QQ1NfT1BUX0NUUkwsCi0JCQkJICAgICAgICZ2YWwpOwotCQkJdmFsICY9IDB4ZmY4ZjsgLyogUmVzZXQgYml0cyA0LTYgKi8KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfUENTX09QVF9DVFJMLAotCQkJCSAgICAgICB2YWwpOwotCi0JCQlibngyeF84NzI3X3Bvd2VyX21vZHVsZShicCwgcGFyYW1zLCBleHRfcGh5X2FkZHIsIDEpOwotCQkJYm54MnhfYmNtODA3M19zZXRfeGF1aV9sb3dfcG93ZXJfbW9kZShwYXJhbXMpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR19NODA1MV9NU0dPVVRfUkVHLAotCQkJCSAgICAgICZ0bXAxKTsKLQotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZ0bXAxKTsKLQotCQkJLyogU2V0IG9wdGlvbiAxRyBzcGVlZCAqLwotCQkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTAwMCkgewotCi0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDFHIGZvcmNlXG4iKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLCAweDQwKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR18xMEdfQ1RSTDIsIDB4RCk7Ci0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfMTBHX0NUUkwyLCAmdG1wMSk7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICIxLjcgPSAweCV4XG4iLCB0bXAxKTsKLQotCQkJfSBlbHNlIGlmICgocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PQotCQkJCSAgICBTUEVFRF9BVVRPX05FRykgJiYKLQkJCQkgICAoKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgJgotCQkJCSAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykpKSB7Ci0KLQkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMUcgY2xhdXNlMzdcbiIpOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfTUlTQ19DVFJMLCAwKTsKLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHX0NMMzdfQU4sIDB4MTMwMCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFNpbmNlIHRoZSA4NzI3IGhhcyBvbmx5IHNpbmdsZSByZXNldCBwaW4sCi0JCQkJbmVlZCB0byBzZXQgdGhlIDEwRyByZWdpc3RlcnMgYWx0aG91Z2ggaXQgaXMKLQkJCQlkZWZhdWx0ICovCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgICBNRElPX0FOX1JFR19DVFJMLCAweDAwMjApOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgMHg3LCAweDAxMDApOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLCAweDIwNDApOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLCBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fUE1BX1JFR18xMEdfQ1RSTDIsIDB4MDAwOCk7Ci0JCQl9Ci0KLQkJCS8qIFNldCAyLXdpcmUgdHJhbnNmZXIgcmF0ZSB0byA0MDBLaHogc2luY2UgMTAwS2h6Ci0JCQlpcyBub3Qgb3BlcmF0aW9uYWwgKi8KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfODcyN19UV09fV0lSRV9TTEFWRV9BRERSLAotCQkJCSAgICAgICAweGExMDEpOwotCi0JCQkvKiBTZXQgVFggUHJlRW1waGFzaXMgaWYgbmVlZGVkICovCi0JCQlpZiAoKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgotCQkJICAgICBGRUFUVVJFX0NPTkZJR19PVkVSUklERV9QUkVFTVBIQVNJU19FTkFCTEVEKSkgewotCQkJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBUWF9DVFJMMSAweCV4LCIKLQkJCQkJICJUWF9DVFJMMiAweCV4XG4iLAotCQkJCQkgcGFyYW1zLT54Z3hzX2NvbmZpZ190eFswXSwKLQkJCQkJIHBhcmFtcy0+eGd4c19jb25maWdfdHhbMV0pOwotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfVFhfQ1RSTDEsCi0JCQkJCSAgICAgICBwYXJhbXMtPnhneHNfY29uZmlnX3R4WzBdKTsKLQotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICAgTURJT19QTUFfUkVHXzg3MjdfVFhfQ1RSTDIsCi0JCQkJCSAgICAgICBwYXJhbXMtPnhneHNfY29uZmlnX3R4WzFdKTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6Ci0JCXsKLQkJCXUxNiBmd192ZXIxLCBmd192ZXIyOwotCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJIlNldHRpbmcgdGhlIFNGWDcxMDEgTEFTSSBpbmRpY2F0aW9uXG4iKTsKLQotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIDB4MSk7Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCSAgIlNldHRpbmcgdGhlIFNGWDcxMDEgTEVEIHRvIGJsaW5rIG9uIHRyYWZmaWNcbiIpOwotCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR183MTA3X0xFRF9DTlRMLCAoMTw8MykpOwotCi0JCQlibngyeF9leHRfcGh5X3NldF9wYXVzZShwYXJhbXMsIHZhcnMpOwotCQkJLyogUmVzdGFydCBhdXRvbmVnICovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJICAgICAgTURJT19BTl9SRUdfQ1RSTCwgJnZhbCk7Ci0JCQl2YWwgfD0gMHgyMDA7Ci0JCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkJCSAgICAgICBNRElPX0FOX1JFR19DVFJMLCB2YWwpOwotCi0JCQkvKiBTYXZlIHNwaXJvbSB2ZXJzaW9uICovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHXzcxMDFfVkVSMSwgJmZ3X3ZlcjEpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHXzcxMDFfVkVSMiwgJmZ3X3ZlcjIpOwotCi0JCQlibngyeF9zYXZlX3NwaXJvbV92ZXJzaW9uKHBhcmFtcy0+YnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJCXBhcmFtcy0+c2htZW1fYmFzZSwKLQkJCQkJCSh1MzIpKGZ3X3ZlcjE8PDE2IHwgZndfdmVyMikpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxOgotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODIzOgotCQkJLyogVGhpcyBwaHkgdXNlcyB0aGUgTklHIGxhdGNoIG1lY2hhbmlzbSBzaW5jZSBsaW5rCi0JCQkJaW5kaWNhdGlvbiBhcnJpdmVzIHRocm91Z2ggaXRzIExFRDQgYW5kIG5vdCB2aWEKLQkJCQlpdHMgTEFTSSBzaWduYWwsIHNvIHdlIGdldCBzdGVhZHkgc2lnbmFsCi0JCQkJaW5zdGVhZCBvZiBjbGVhciBvbiByZWFkICovCi0JCQlibngyeF9iaXRzX2VuKGJwLCBOSUdfUkVHX0xBVENIX0JDXzAgKyBwYXJhbXMtPnBvcnQqNCwKLQkJCQkgICAgMSA8PCBOSUdfTEFUQ0hfQkNfRU5BQkxFX01JX0lOVCk7Ci0KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MSwKLQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICAgTURJT19QTUFfUkVHX0NUUkwsIDB4MDAwMCk7Ci0KLQkJCWJueDJ4Xzg0ODFfc2V0X2xlZDQocGFyYW1zLCBleHRfcGh5X3R5cGUsIGV4dF9waHlfYWRkcik7Ci0JCQlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykgewotCi0JCQkJdTE2IGF1dG9uZWdfdmFsLCBhbl8xMDAwX3ZhbCwgYW5fMTBfMTAwX3ZhbDsKLQkJCQkvKiBzZXQgMTAwMCBzcGVlZCBhZHZlcnRpc2VtZW50ICovCi0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICBNRElPX0FOX1JFR184NDgxXzEwMDBUX0NUUkwsCi0JCQkJCSAgICAgICZhbl8xMDAwX3ZhbCk7Ci0KLQkJCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCi0JCQkJICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcpIHsKLQkJCQkJYW5fMTAwMF92YWwgfD0gKDE8PDgpOwotCQkJCQlpZiAocGFyYW1zLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQotCQkJCQkJYW5fMTAwMF92YWwgfD0gKDE8PDkpOwotCQkJCQlEUChORVRJRl9NU0dfTElOSywgIkFkdmVydGlzaW5nIDFHXG4iKTsKLQkJCQl9IGVsc2UKLQkJCQkJYW5fMTAwMF92YWwgJj0gfigoMTw8OCkgfCAoMTw8OSkpOwotCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHXzg0ODFfMTAwMFRfQ1RSTCwKLQkJCQkJICAgICAgIGFuXzEwMDBfdmFsKTsKLQotCQkJCS8qIHNldCAxMDAgc3BlZWQgYWR2ZXJ0aXNlbWVudCAqLwotCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgTURJT19BTl9SRUdfODQ4MV9MRUdBQ1lfQU5fQURWLAotCQkJCQkgICAgICAmYW5fMTBfMTAwX3ZhbCk7Ci0KLQkJCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCi0JCQkJIChQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fRlVMTCB8Ci0JCQkJICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fSEFMRikpIHsKLQkJCQkJYW5fMTBfMTAwX3ZhbCB8PSAoMTw8Nyk7Ci0JCQkJCWlmIChwYXJhbXMtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQkJCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw4KTsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCQkiQWR2ZXJ0aXNpbmcgMTAwTVxuIik7Ci0JCQkJfSBlbHNlCi0JCQkJCWFuXzEwXzEwMF92YWwgJj0gfigoMTw8NykgfCAoMTw8OCkpOwotCi0JCQkJLyogc2V0IDEwIHNwZWVkIGFkdmVydGlzZW1lbnQgKi8KLQkJCQlpZiAocGFyYW1zLT5zcGVlZF9jYXBfbWFzayAmCi0JCQkJICAoUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fRlVMTCB8Ci0JCQkJICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fSEFMRikpIHsKLQkJCQkJYW5fMTBfMTAwX3ZhbCB8PSAoMTw8NSk7Ci0JCQkJCWlmIChwYXJhbXMtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQkJCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw2KTsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJBZHZlcnRpc2luZyAxME1cbiIpOwotCQkJCSAgICAgfQotCQkJCWVsc2UKLQkJCQkJYW5fMTBfMTAwX3ZhbCAmPSB+KCgxPDw1KSB8ICgxPDw2KSk7Ci0KLQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICAgTURJT19BTl9SRUdfODQ4MV9MRUdBQ1lfQU5fQURWLAotCQkJCQkgICAgICAgYW5fMTBfMTAwX3ZhbCk7Ci0KLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX01JSV9DVFJMLAotCQkJCQkgICAgICAmYXV0b25lZ192YWwpOwotCi0JCQkJLyogRGlzYWJsZSBmb3JjZWQgc3BlZWQgKi8KLQkJCQlhdXRvbmVnX3ZhbCAmPSB+KDE8PDZ8MTw8MTMpOwotCi0JCQkJLyogRW5hYmxlIGF1dG9uZWcgYW5kIHJlc3RhcnQgYXV0b25lZwotCQkJCWZvciBsZWdhY3kgc3BlZWRzICovCi0JCQkJYXV0b25lZ192YWwgfD0gKDE8PDl8MTw8MTIpOwotCi0JCQkJaWYgKHBhcmFtcy0+cmVxX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkKLQkJCQkJYXV0b25lZ192YWwgfD0gKDE8PDgpOwotCQkJCWVsc2UKLQkJCQkJYXV0b25lZ192YWwgJj0gfigxPDw4KTsKLQotCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgICBNRElPX0FOX1JFR184NDgxX0xFR0FDWV9NSUlfQ1RSTCwKLQkJCQkJICAgICAgIGF1dG9uZWdfdmFsKTsKLQotCQkJCWlmIChwYXJhbXMtPnNwZWVkX2NhcF9tYXNrICYKLQkJCQkgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcpIHsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJBZHZlcnRpc2luZyAxMEdcbiIpOwotCQkJCQkvKiBSZXN0YXJ0IGF1dG9uZWcgZm9yIDEwRyovCi0KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJICAgICAgIE1ESU9fQU5fUkVHX0NUUkwsIDB4MzIwMCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKiBGb3JjZSBzcGVlZCAqLwotCQkJCXUxNiBhdXRvbmVnX2N0cmwsIHBtYV9jdHJsOwotCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgTURJT19BTl9SRUdfODQ4MV9MRUdBQ1lfTUlJX0NUUkwsCi0JCQkJCSAgICAgICZhdXRvbmVnX2N0cmwpOwotCi0JCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCi0JCQkJYXV0b25lZ19jdHJsICY9IH4oMTw8MTIpOwotCi0JCQkJLyogU2V0IDEwMDAgZm9yY2UgKi8KLQkJCQlzd2l0Y2ggKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQpIHsKLQkJCQljYXNlIFNQRUVEXzEwMDAwOgotCQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJCSJVbmFibGUgdG8gc2V0IDEwRyBmb3JjZSAhXG4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTUEVFRF8xMDAwOgotCQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkJICAgICAgTURJT19QTUFfUkVHX0NUUkwsCi0JCQkJCQkgICAgICAmcG1hX2N0cmwpOwotCQkJCQlhdXRvbmVnX2N0cmwgJj0gfigxPDwxMyk7Ci0JCQkJCWF1dG9uZWdfY3RybCB8PSAoMTw8Nik7Ci0JCQkJCXBtYV9jdHJsICY9IH4oMTw8MTMpOwotCQkJCQlwbWFfY3RybCB8PSAoMTw8Nik7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkJIlNldHRpbmcgMTAwME0gZm9yY2VcbiIpOwotCQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwKLQkJCQkJCSAgICAgICBwbWFfY3RybCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1BFRURfMTAwOgotCQkJCQlhdXRvbmVnX2N0cmwgfD0gKDE8PDEzKTsKLQkJCQkJYXV0b25lZ19jdHJsICY9IH4oMTw8Nik7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkJIlNldHRpbmcgMTAwTSBmb3JjZVxuIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1BFRURfMTA6Ci0JCQkJCWF1dG9uZWdfY3RybCAmPSB+KDE8PDEzKTsKLQkJCQkJYXV0b25lZ19jdHJsICY9IH4oMTw8Nik7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkJIlNldHRpbmcgMTBNIGZvcmNlXG4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLyogRHVwbGV4IG1vZGUgKi8KLQkJCQlpZiAocGFyYW1zLT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKSB7Ci0JCQkJCWF1dG9uZWdfY3RybCB8PSAoMTw8OCk7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkJIlNldHRpbmcgZnVsbCBkdXBsZXhcbiIpOwotCQkJCX0gZWxzZQotCQkJCQlhdXRvbmVnX2N0cmwgJj0gfigxPDw4KTsKLQotCQkJCS8qIFVwZGF0ZSBhdXRvbmVnIGN0cmwgYW5kIHBtYSBjdHJsICovCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX01JSV9DVFJMLAotCQkJCQkgICAgICAgYXV0b25lZ19jdHJsKTsKLQkJCX0KLQotCQkJLyogU2F2ZSBzcGlyb20gdmVyc2lvbiAqLwotCQkJYm54Mnhfc2F2ZV84NDgxX3NwaXJvbV92ZXJzaW9uKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCQkgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJCSAgICAgcGFyYW1zLT5zaG1lbV9iYXNlKTsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0ZBSUxVUkU6Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkgIlhHWFMgUEhZIEZhaWx1cmUgZGV0ZWN0ZWQgMHgleFxuIiwKLQkJCQkgcGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURQKE5FVElGX01TR19MSU5LLCAiQkFEIFhHWFMgZXh0X3BoeV9jb25maWcgMHgleFxuIiwKLQkJCQkgIHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCX0gZWxzZSB7IC8qIFNlckRlcyAqLwotCi0JCWV4dF9waHlfdHlwZSA9IFNFUkRFU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7Ci0JCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyBEaXJlY3RcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0JDTTU0ODI6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyA1NDgyXG4iKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIkJBRCBTZXJEZXMgZXh0X3BoeV9jb25maWcgMHgleFxuIiwKLQkJCSAgIHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF84NzI3X2hhbmRsZV9tb2RfYWJzKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiBtb2RfYWJzLCByeF9hbGFybV9zdGF0dXM7Ci0JdTggZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JdTMyIHZhbCA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKLQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCi0JCQkJICAgICAgcG9ydF9mZWF0dXJlX2NvbmZpZ1twYXJhbXMtPnBvcnRdLgotCQkJCSAgICAgIGNvbmZpZykpOwotCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAotCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICBNRElPX1BNQV9SRUdfUEhZX0lERU5USUZJRVIsICZtb2RfYWJzKTsKLQlpZiAobW9kX2FicyAmICgxPDw4KSkgewotCi0JCS8qIE1vZHVsZSBpcyBhYnNlbnQgKi8KLQkJRFAoTkVUSUZfTVNHX0xJTkssICJNT0RfQUJTIGluZGljYXRpb24gIgotCQkJICAgICJzaG93IG1vZHVsZSBpcyBhYnNlbnRcbiIpOwotCi0JCS8qIDEuIFNldCBtb2RfYWJzIHRvIGRldGVjdCBuZXh0IG1vZHVsZQotCQlwcmVzZW5jZSBldmVudAotCQkgICAyLiBTZXQgRURDIG9mZiBieSBzZXR0aW5nIE9QVFhMT1Mgc2lnbmFsIGlucHV0IHRvIGxvdwotCQkJKGJpdCA5KS4KLQkJCVdoZW4gdGhlIEVEQyBpcyBvZmYgaXQgbG9ja3Mgb250byBhIHJlZmVyZW5jZSBjbG9jayBhbmQKLQkJCWF2b2lkcyBiZWNvbWluZyAnbG9zdCcuKi8KLQkJbW9kX2FicyAmPSB+KCgxPDw4KXwoMTw8OSkpOwotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLCBtb2RfYWJzKTsKLQotCQkvKiBDbGVhciBSWCBhbGFybSBzaW5jZSBpdCBzdGF5cyB1cCBhcyBsb25nIGFzCi0JCXRoZSBtb2RfYWJzIHdhc24ndCBjaGFuZ2VkICovCi0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNLCAmcnhfYWxhcm1fc3RhdHVzKTsKLQotCX0gZWxzZSB7Ci0JCS8qIE1vZHVsZSBpcyBwcmVzZW50ICovCi0JCURQKE5FVElGX01TR19MSU5LLCAiTU9EX0FCUyBpbmRpY2F0aW9uICIKLQkJCSAgICAic2hvdyBtb2R1bGUgaXMgcHJlc2VudFxuIik7Ci0JCS8qIEZpcnN0IHRoaW5nLCBkaXNhYmxlIHRyYW5zbWl0dGVyLAotCQlhbmQgaWYgdGhlIG1vZHVsZSBpcyBvaywgdGhlCi0JCW1vZHVsZV9kZXRlY3Rpb24gd2lsbCBlbmFibGUgaXQqLwotCi0JCS8qIDEuIFNldCBtb2RfYWJzIHRvIGRldGVjdCBuZXh0IG1vZHVsZQotCQlhYnNlbnQgZXZlbnQgKCBiaXQgOCkKLQkJICAgMi4gUmVzdG9yZSB0aGUgZGVmYXVsdCBwb2xhcml0eSBvZiB0aGUgT1BSWExPUyBzaWduYWwgYW5kCi0JCXRoaXMgc2lnbmFsIHdpbGwgdGhlbiBjb3JyZWN0bHkgaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9yCi0JCWFic2VuY2Ugb2YgdGhlIFJ4IHNpZ25hbC4gKGJpdCA5KSAqLwotCQltb2RfYWJzIHw9ICgoMTw8OCl8KDE8PDkpKTsKLQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkgICAgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLCBtb2RfYWJzKTsKLQotCQkvKiBDbGVhciBSWCBhbGFybSBzaW5jZSBpdCBzdGF5cyB1cCBhcyBsb25nIGFzCi0JCXRoZSBtb2RfYWJzIHdhc24ndCBjaGFuZ2VkLiBUaGlzIGlzIG5lZWQgdG8gYmUgZG9uZQotCQliZWZvcmUgY2FsbGluZyB0aGUgbW9kdWxlIGRldGVjdGlvbiwgb3RoZXJ3aXNlIGl0IHdpbGwgY2xlYXIKLQkJdGhlIGxpbmsgdXBkYXRlIGFsYXJtICovCi0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNLCAmcnhfYWxhcm1fc3RhdHVzKTsKLQotCi0JCWlmICgodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spID09Ci0JCSAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfRElTQUJMRV9UWF9MQVNFUikKLQkJCWJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNywKLQkJCQkJZXh0X3BoeV9hZGRyLCAwKTsKLQotCQlpZiAoYm54Mnhfd2FpdF9mb3Jfc2ZwX21vZHVsZV9pbml0aWFsaXplZChwYXJhbXMpCi0JCSAgICA9PSAwKQotCQkJYm54Mnhfc2ZwX21vZHVsZV9kZXRlY3Rpb24ocGFyYW1zKTsKLQkJZWxzZQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTRlArIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWRcbiIpOwotCX0KLQotCURQKE5FVElGX01TR19MSU5LLCAiODcyNyBSWF9BTEFSTV9TVEFUVVMgMHgleFxuIiwKLQkJIHJ4X2FsYXJtX3N0YXR1cyk7Ci0JLyogTm8gbmVlZCB0byBjaGVjayBsaW5rIHN0YXR1cyBpbiBjYXNlIG9mCi0JbW9kdWxlIHBsdWdnZWQgaW4vb3V0ICovCi19Ci0KLQotc3RhdGljIHU4IGJueDJ4X2V4dF9waHlfaXNfbGlua191cChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJCQkgdTggaXNfbWlfaW50KQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0JdTggZXh0X3BoeV9hZGRyOwotCXUxNiB2YWwxID0gMCwgdmFsMjsKLQl1MTYgcnhfc2QsIHBjc19zdGF0dXM7Ci0JdTggZXh0X3BoeV9saW5rX3VwID0gMDsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCi0JaWYgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsKLQkJZXh0X3BoeV9hZGRyID0gWEdYU19FWFRfUEhZX0FERFIocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgewotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKLQkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyBEaXJlY3RcbiIpOwotCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKLQkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA1XG4iKTsKLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fV0lTX0RFVkFELAotCQkJCSAgICAgIE1ESU9fV0lTX1JFR19MQVNJX1NUQVRVUywgJnZhbDEpOwotCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzA1IExBU0kgc3RhdHVzIDB4JXhcbiIsIHZhbDEpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1dJU19ERVZBRCwKLQkJCQkgICAgICBNRElPX1dJU19SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKLQkJCURQKE5FVElGX01TR19MSU5LLCAiODcwNSBMQVNJIHN0YXR1cyAweCV4XG4iLCB2YWwxKTsKLQotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHX1JYX1NELCAmcnhfc2QpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAxLAotCQkJCSAgICAgIDB4YzgwOSwgJnZhbDEpOwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgMSwKLQkJCQkgICAgICAweGM4MDksICZ2YWwxKTsKLQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzA1IDEuYzgwOSB2YWw9MHgleFxuIiwgdmFsMSk7Ci0JCQlleHRfcGh5X2xpbmtfdXAgPSAoKHJ4X3NkICYgMHgxKSAmJiAodmFsMSAmICgxPDw5KSkgJiYKLQkJCQkJICAgKCh2YWwxICYgKDE8PDgpKSA9PSAwKSk7Ci0JCQlpZiAoZXh0X3BoeV9saW5rX3VwKQotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIDg3MDYvODcyNlxuIik7Ci0JCQkvKiBDbGVhciBSWCBBbGFybSovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX1JYX0FMQVJNLAotCQkJCSAgICAgICZ2YWwyKTsKLQkJCS8qIGNsZWFyIExBU0kgaW5kaWNhdGlvbiovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLAotCQkJCSAgICAgICZ2YWwxKTsKLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsCi0JCQkJICAgICAgJnZhbDIpOwotCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzA2Lzg3MjYgTEFTSSBzdGF0dXMgMHgleC0tPiIKLQkJCQkgICAgICIweCV4XG4iLCB2YWwxLCB2YWwyKTsKLQotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9TRCwKLQkJCQkgICAgICAmcnhfc2QpOwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QQ1NfREVWQUQsIE1ESU9fUENTX1JFR19TVEFUVVMsCi0JCQkJICAgICAgJnBjc19zdGF0dXMpOwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19BTl9ERVZBRCwgTURJT19BTl9SRUdfTElOS19TVEFUVVMsCi0JCQkJICAgICAgJnZhbDIpOwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19BTl9ERVZBRCwgTURJT19BTl9SRUdfTElOS19TVEFUVVMsCi0JCQkJICAgICAgJnZhbDIpOwotCi0JCQlEUChORVRJRl9NU0dfTElOSywgIjg3MDYvODcyNiByeF9zZCAweCV4IgotCQkJICAgIiAgcGNzX3N0YXR1cyAweCV4IDFHYnBzIGxpbmtfc3RhdHVzIDB4JXhcbiIsCi0JCQkgICByeF9zZCwgcGNzX3N0YXR1cywgdmFsMik7Ci0JCQkvKiBsaW5rIGlzIHVwIGlmIGJvdGggYml0IDAgb2YgcG1kX3J4X3NkIGFuZAotCQkJICogYml0IDAgb2YgcGNzX3N0YXR1cyBhcmUgc2V0LCBvciBpZiB0aGUgYXV0b25lZyBiaXQKLQkJCSAgIDEgaXMgc2V0Ci0JCQkgKi8KLQkJCWV4dF9waHlfbGlua191cCA9ICgocnhfc2QgJiBwY3Nfc3RhdHVzICYgMHgxKSB8fAotCQkJCQkgICAodmFsMiAmICgxPDwxKSkpOwotCQkJaWYgKGV4dF9waHlfbGlua191cCkgewotCQkJCWlmIChleHRfcGh5X3R5cGUgPT0KLQkJCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpIHsKLQkJCQkJLyogSWYgdHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQsCi0JCQkJCWlnbm9yZSBmYWxzZSBsaW5rIHVwIGluZGljYXRpb24gKi8KLQkJCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCQkgICBleHRfcGh5X3R5cGUsCi0JCQkJCQkgICBleHRfcGh5X2FkZHIsCi0JCQkJCQkgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJCSAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKLQkJCQkJCSAgICZ2YWwxKTsKLQkJCQkJaWYgKHZhbDEgJiAoMTw8MTUpKSB7Ci0JCQkJCQlEUChORVRJRl9NU0dfTElOSywgIlR4IGlzICIKLQkJCQkJCQkgICAgImRpc2FibGVkXG4iKTsKLQkJCQkJCWV4dF9waHlfbGlua191cCA9IDA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodmFsMiAmICgxPDwxKSkKLQkJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7Ci0JCQkJZWxzZQotCQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6Ci0JCXsKLQkJCXUxNiBsaW5rX3N0YXR1cyA9IDA7Ci0JCQl1MTYgcnhfYWxhcm1fc3RhdHVzOwotCQkJLyogQ2hlY2sgdGhlIExBU0kgKi8KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNLCAmcnhfYWxhcm1fc3RhdHVzKTsKLQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzI3IFJYX0FMQVJNX1NUQVRVUyAweCV4XG4iLAotCQkJCSByeF9hbGFybV9zdGF0dXMpOwotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR19MQVNJX1NUQVRVUywgJnZhbDEpOwotCi0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkgIjg3MjcgTEFTSSBzdGF0dXMgMHgleFxuIiwKLQkJCQkgdmFsMSk7Ci0KLQkJCS8qIENsZWFyIE1TRy1PVVQgKi8KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHX004MDUxX01TR09VVF9SRUcsCi0JCQkJICAgICAgJnZhbDEpOwotCi0JCQkvKgotCQkJICogSWYgYSBtb2R1bGUgaXMgcHJlc2VudCBhbmQgdGhlcmUgaXMgbmVlZCB0byBjaGVjawotCQkJICogZm9yIG92ZXIgY3VycmVudAotCQkJICovCi0JCQlpZiAoIShwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKLQkJCSAgICAgIEZFQVRVUkVfQ09ORklHX0JDTTg3MjdfTk9DKSAmJgotCQkJICAgICEocnhfYWxhcm1fc3RhdHVzICYgKDE8PDUpKSkgewotCQkJCS8qIENoZWNrIG92ZXItY3VycmVudCB1c2luZyA4NzI3IEdQSU8wIGlucHV0Ki8KLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICBNRElPX1BNQV9SRUdfODcyN19HUElPX0NUUkwsCi0JCQkJCSAgICAgICZ2YWwxKTsKLQotCQkJCWlmICgodmFsMSAmICgxPDw4KSkgPT0gMCkgewotCQkJCQlEUChORVRJRl9NU0dfTElOSywgIjg3MjcgUG93ZXIgZmF1bHQiCi0JCQkJCQkgICAgICIgaGFzIGJlZW4gZGV0ZWN0ZWQgb24gIgotCQkJCQkJICAgICAicG9ydCAlZFxuIiwKLQkJCQkJCSBwYXJhbXMtPnBvcnQpOwotCQkJCQluZXRkZXZfZXJyKGJwLT5kZXYsICJFcnJvcjogIFBvd2VyIGZhdWx0IG9uIFBvcnQgJWQgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIHRoZSBwb3dlciB0byB0aGF0IFNGUCsgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgdG8gcHJldmVudCBmYWlsdXJlIG9mIHRoZSBjYXJkLiBQbGVhc2UgcmVtb3ZlIHRoZSBTRlArIG1vZHVsZSBhbmQgcmVzdGFydCB0aGUgc3lzdGVtIHRvIGNsZWFyIHRoaXMgZXJyb3IuXG4iLAotCQkJCQkJICAgcGFyYW1zLT5wb3J0KTsKLQkJCQkJLyoKLQkJCQkJICogRGlzYWJsZSBhbGwgUlhfQUxBUk1zIGV4Y2VwdCBmb3IKLQkJCQkJICogbW9kX2FicwotCQkJCQkgKi8KLQkJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkJICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCQkgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJCSAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCQkgICAgIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAotCQkJCQkJICAgICAoMTw8NSkpOwotCi0JCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkJICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJCSAgICBleHRfcGh5X2FkZHIsCi0JCQkJCQkgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCQkgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLAotCQkJCQkJICAgICZ2YWwxKTsKLQkJCQkJLyogV2FpdCBmb3IgbW9kdWxlX2Fic2VudF9ldmVudCAqLwotCQkJCQl2YWwxIHw9ICgxPDw4KTsKLQkJCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkJICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJCSAgICBleHRfcGh5X2FkZHIsCi0JCQkJCQkgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCQkgICAgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSLAotCQkJCQkJICAgIHZhbDEpOwotCQkJCQkvKiBDbGVhciBSWCBhbGFybSAqLwotCQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkJICAgICAgTURJT19QTUFfUkVHX1JYX0FMQVJNLAotCQkJCQkJICAgICAgJnJ4X2FsYXJtX3N0YXR1cyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gLyogT3ZlciBjdXJyZW50IGNoZWNrICovCi0KLQkJCS8qIFdoZW4gbW9kdWxlIGFic2VudCBiaXQgaXMgc2V0LCBjaGVjayBtb2R1bGUgKi8KLQkJCWlmIChyeF9hbGFybV9zdGF0dXMgJiAoMTw8NSkpIHsKLQkJCQlibngyeF84NzI3X2hhbmRsZV9tb2RfYWJzKHBhcmFtcyk7Ci0JCQkJLyogRW5hYmxlIGFsbCBtb2RfYWJzIGFuZCBsaW5rIGRldGVjdGlvbiBiaXRzICovCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwKLQkJCQkJICAgICAgICgoMTw8NSkgfCAoMTw8MikpKTsKLQkJCX0KLQotCQkJLyogSWYgdHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQsCi0JCQlpZ25vcmUgZmFsc2UgbGluayB1cCBpbmRpY2F0aW9uICovCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwKLQkJCQkgICAgICAmdmFsMSk7Ci0JCQlpZiAodmFsMSAmICgxPDwxNSkpIHsKLQkJCQlEUChORVRJRl9NU0dfTElOSywgIlR4IGlzIGRpc2FibGVkXG4iKTsKLQkJCQlleHRfcGh5X2xpbmtfdXAgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUE1BX1JFR184MDczX1NQRUVEX0xJTktfU1RBVFVTLAotCQkJCSAgICAgICZsaW5rX3N0YXR1cyk7Ci0KLQkJCS8qIEJpdHMgMC4uMiAtLT4gc3BlZWQgZGV0ZWN0ZWQsCi0JCQkgICBiaXRzIDEzLi4xNS0tPiBsaW5rIGlzIGRvd24gKi8KLQkJCWlmICgobGlua19zdGF0dXMgJiAoMTw8MikpICYmCi0JCQkgICAgKCEobGlua19zdGF0dXMgJiAoMTw8MTUpKSkpIHsKLQkJCQlleHRfcGh5X2xpbmtfdXAgPSAxOwotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJCX0gZWxzZSBpZiAoKGxpbmtfc3RhdHVzICYgKDE8PDApKSAmJgotCQkJCSAgICghKGxpbmtfc3RhdHVzICYgKDE8PDEzKSkpKSB7Ci0JCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKLQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJICJwb3J0ICV4OiBFeHRlcm5hbCBsaW5rIgotCQkJCQkgIiB1cCBpbiAxR1xuIiwgcGFyYW1zLT5wb3J0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXh0X3BoeV9saW5rX3VwID0gMDsKLQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJICJwb3J0ICV4OiBFeHRlcm5hbCBsaW5rIgotCQkJCQkgIiBpcyBkb3duXG4iLCBwYXJhbXMtPnBvcnQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKLQkJewotCQkJdTE2IGxpbmtfc3RhdHVzID0gMDsKLQkJCXUxNiBhbjEwMDBfc3RhdHVzID0gMDsKLQotCQkJaWYgKGV4dF9waHlfdHlwZSA9PQotCQkJICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyKSB7Ci0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BDU19ERVZBRCwKLQkJCQkgICAgICBNRElPX1BDU19SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QQ1NfREVWQUQsCi0JCQkJICAgICAgTURJT19QQ1NfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMik7Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkgIjg3MHggTEFTSSBzdGF0dXMgMHgleC0+MHgleFxuIiwKLQkJCQkgIHZhbDEsIHZhbDIpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBJbiA4MDczLCBwb3J0MSBpcyBkaXJlY3RlZCB0aHJvdWdoIGVtYWMwIGFuZAotCQkJCSAqIHBvcnQwIGlzIGRpcmVjdGVkIHRocm91Z2ggZW1hYzEKLQkJCQkgKi8KLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKLQotCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkgIjg3MDMgTEFTSSBzdGF0dXMgMHgleFxuIiwKLQkJCQkJICB2YWwxKTsKLQkJCX0KLQotCQkJLyogY2xlYXIgdGhlIGludGVycnVwdCBMQVNJIHN0YXR1cyByZWdpc3RlciAqLwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BDU19ERVZBRCwKLQkJCQkgICAgICBNRElPX1BDU19SRUdfU1RBVFVTLCAmdmFsMik7Ci0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCSAgICAgIE1ESU9fUENTX0RFVkFELAotCQkJCSAgICAgIE1ESU9fUENTX1JFR19TVEFUVVMsICZ2YWwxKTsKLQkJCURQKE5FVElGX01TR19MSU5LLCAiODA3eCBQQ1Mgc3RhdHVzIDB4JXgtPjB4JXhcbiIsCi0JCQkgICB2YWwyLCB2YWwxKTsKLQkJCS8qIENsZWFyIE1TRy1PVVQgKi8KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHX004MDUxX01TR09VVF9SRUcsCi0JCQkJICAgICAgJnZhbDEpOwotCi0JCQkvKiBDaGVjayB0aGUgTEFTSSAqLwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZ2YWwyKTsKLQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJLUiAweDkwMDMgMHgleFxuIiwgdmFsMik7Ci0KLQkJCS8qIENoZWNrIHRoZSBsaW5rIHN0YXR1cyAqLwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BDU19ERVZBRCwKLQkJCQkgICAgICBNRElPX1BDU19SRUdfU1RBVFVTLCAmdmFsMik7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIktSIFBDUyBzdGF0dXMgMHgleFxuIiwgdmFsMik7Ci0KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHX1NUQVRVUywgJnZhbDIpOwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfU1RBVFVTLCAmdmFsMSk7Ci0JCQlleHRfcGh5X2xpbmtfdXAgPSAoKHZhbDEgJiA0KSA9PSA0KTsKLQkJCURQKE5FVElGX01TR19MSU5LLCAiUE1BX1JFR19TVEFUVVM9MHgleFxuIiwgdmFsMSk7Ci0JCQlpZiAoZXh0X3BoeV90eXBlID09Ci0JCQkgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MykgewotCi0JCQkJaWYgKGV4dF9waHlfbGlua191cCAmJgotCQkJCSAgICAoKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQgIT0KLQkJCQkJU1BFRURfMTAwMDApKSkgewotCQkJCQlpZiAoYm54MnhfYmNtODA3M194YXVpX3dhKHBhcmFtcykKLQkJCQkJICAgICAhPSAwKSB7Ci0JCQkJCQlleHRfcGh5X2xpbmtfdXAgPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgICAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkgICAgICBNRElPX0FOX1JFR19MSU5LX1NUQVRVUywKLQkJCQkJICAgICAgJmFuMTAwMF9zdGF0dXMpOwotCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgTURJT19BTl9SRUdfTElOS19TVEFUVVMsCi0JCQkJCSAgICAgICZhbjEwMDBfc3RhdHVzKTsKLQotCQkJCS8qIENoZWNrIHRoZSBsaW5rIHN0YXR1cyBvbiAxLjEuMiAqLwotCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCSAgICAgIE1ESU9fUE1BX1JFR19TVEFUVVMsICZ2YWwyKTsKLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgICAgICBNRElPX1BNQV9SRUdfU1RBVFVTLCAmdmFsMSk7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICJLUiBQTUEgc3RhdHVzIDB4JXgtPjB4JXgsIgotCQkJCQkgICAgICJhbl9saW5rX3N0YXR1cz0weCV4XG4iLAotCQkJCQkgIHZhbDIsIHZhbDEsIGFuMTAwMF9zdGF0dXMpOwotCi0JCQkJZXh0X3BoeV9saW5rX3VwID0gKCgodmFsMSAmIDQpID09IDQpIHx8Ci0JCQkJCQkoYW4xMDAwX3N0YXR1cyAmICgxPDwxKSkpOwotCQkJCWlmIChleHRfcGh5X2xpbmtfdXAgJiYKLQkJCQkgICAgYm54MnhfODA3M19pc19zbnJfbmVlZGVkKHBhcmFtcykpIHsKLQkJCQkJLyogVGhlIFNOUiB3aWxsIGltcHJvdmUgYWJvdXQgMmRiYnkKLQkJCQkJY2hhbmdpbmcgdGhlIEJXIGFuZCBGRUUgbWFpbiB0YXAuKi8KLQotCQkJCQkvKiBUaGUgMXN0IHdyaXRlIHRvIGNoYW5nZSBGRkUgbWFpbgotCQkJCQl0YXAgaXMgc2V0IGJlZm9yZSByZXN0YXJ0IEFOICovCi0JCQkJCS8qIENoYW5nZSBQTEwgQmFuZHdpZHRoIGluIEVEQwotCQkJCQlyZWdpc3RlciAqLwotCQkJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCQkgICAgZXh0X3BoeV9hZGRyLAotCQkJCQkJICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCQkJICAgIE1ESU9fUE1BX1JFR19QTExfQkFORFdJRFRILAotCQkJCQkJICAgIDB4MjZCQyk7Ci0KLQkJCQkJLyogQ2hhbmdlIENEUiBCYW5kd2lkdGggaW4gRURDCi0JCQkJCXJlZ2lzdGVyICovCi0JCQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkJCSAgICBleHRfcGh5X2FkZHIsCi0JCQkJCQkgICAgTURJT19QTUFfREVWQUQsCi0JCQkJCQkgICAgTURJT19QTUFfUkVHX0NEUl9CQU5EV0lEVEgsCi0JCQkJCQkgICAgMHgwMzMzKTsKLQkJCQl9Ci0JCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkJCSAgIGV4dF9waHlfdHlwZSwKLQkJCQkJICAgZXh0X3BoeV9hZGRyLAotCQkJCQkgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkJICAgTURJT19QTUFfUkVHXzgwNzNfU1BFRURfTElOS19TVEFUVVMsCi0JCQkJCSAgICZsaW5rX3N0YXR1cyk7Ci0KLQkJCQkvKiBCaXRzIDAuLjIgLS0+IHNwZWVkIGRldGVjdGVkLAotCQkJCSAgIGJpdHMgMTMuLjE1LS0+IGxpbmsgaXMgZG93biAqLwotCQkJCWlmICgobGlua19zdGF0dXMgJiAoMTw8MikpICYmCi0JCQkJICAgICghKGxpbmtfc3RhdHVzICYgKDE8PDE1KSkpKSB7Ci0JCQkJCWV4dF9waHlfbGlua191cCA9IDE7Ci0JCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCQkgInBvcnQgJXg6IEV4dGVybmFsIGxpbmsiCi0JCQkJCQkgIiB1cCBpbiAxMEdcbiIsIHBhcmFtcy0+cG9ydCk7Ci0JCQkJfSBlbHNlIGlmICgobGlua19zdGF0dXMgJiAoMTw8MSkpICYmCi0JCQkJCSAgICghKGxpbmtfc3RhdHVzICYgKDE8PDE0KSkpKSB7Ci0JCQkJCWV4dF9waHlfbGlua191cCA9IDE7Ci0JCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8yNTAwOwotCQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKLQkJCQkJCSAiIHVwIGluIDIuNUdcbiIsIHBhcmFtcy0+cG9ydCk7Ci0JCQkJfSBlbHNlIGlmICgobGlua19zdGF0dXMgJiAoMTw8MCkpICYmCi0JCQkJCSAgICghKGxpbmtfc3RhdHVzICYgKDE8PDEzKSkpKSB7Ci0JCQkJCWV4dF9waHlfbGlua191cCA9IDE7Ci0JCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwotCQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKLQkJCQkJCSAiIHVwIGluIDFHXG4iLCBwYXJhbXMtPnBvcnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV4dF9waHlfbGlua191cCA9IDA7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkJICJwb3J0ICV4OiBFeHRlcm5hbCBsaW5rIgotCQkJCQkJICIgaXMgZG93blxuIiwgcGFyYW1zLT5wb3J0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qIFNlZSBpZiAxRyBsaW5rIGlzIHVwIGZvciB0aGUgODA3MiAqLwotCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgICAgICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkJICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkJICAgICAgTURJT19BTl9SRUdfTElOS19TVEFUVVMsCi0JCQkJCSAgICAgICZhbjEwMDBfc3RhdHVzKTsKLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgIE1ESU9fQU5fUkVHX0xJTktfU1RBVFVTLAotCQkJCQkgICAgICAmYW4xMDAwX3N0YXR1cyk7Ci0JCQkJaWYgKGFuMTAwMF9zdGF0dXMgJiAoMTw8MSkpIHsKLQkJCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKLQkJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7Ci0JCQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCQkJICJwb3J0ICV4OiBFeHRlcm5hbCBsaW5rIgotCQkJCQkJICIgdXAgaW4gMUdcbiIsIHBhcmFtcy0+cG9ydCk7Ci0JCQkJfSBlbHNlIGlmIChleHRfcGh5X2xpbmtfdXApIHsKLQkJCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKLQkJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOwotCQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJCSAicG9ydCAleDogRXh0ZXJuYWwgbGluayIKLQkJCQkJCSAiIHVwIGluIDEwR1xuIiwgcGFyYW1zLT5wb3J0KTsKLQkJCQl9Ci0JCQl9Ci0KLQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxOgotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMik7Ci0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKLQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCSAiMTBHLWJhc2UtVCBMQVNJIHN0YXR1cyAweCV4LT4weCV4XG4iLAotCQkJCSAgdmFsMiwgdmFsMSk7Ci0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfU1RBVFVTLCAmdmFsMik7Ci0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCQkgICAgICBNRElPX1BNQV9SRUdfU1RBVFVTLCAmdmFsMSk7Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkgIjEwRy1iYXNlLVQgUE1BIHN0YXR1cyAweCV4LT4weCV4XG4iLAotCQkJCSB2YWwyLCB2YWwxKTsKLQkJCWV4dF9waHlfbGlua191cCA9ICgodmFsMSAmIDQpID09IDQpOwotCQkJLyogaWYgbGluayBpcyB1cAotCQkJICogcHJpbnQgdGhlIEFOIG91dGNvbWUgb2YgdGhlIFNGWDcxMDEgUEhZCi0JCQkgKi8KLQkJCWlmIChleHRfcGh5X2xpbmtfdXApIHsKLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV90eXBlLAotCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCSAgICAgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgICAgIE1ESU9fQU5fUkVHX01BU1RFUl9TVEFUVVMsCi0JCQkJCSAgICAgICZ2YWwyKTsKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCSAiU0ZYNzEwMSBBTiBzdGF0dXMgMHgleC0+TWFzdGVyPSV4XG4iLAotCQkJCQkgIHZhbDIsCi0JCQkJCSAodmFsMiAmICgxPDwxNCkpKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODE6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MjM6Ci0JCQkvKiBDaGVjayAxMEctQmFzZVQgbGluayBzdGF0dXMgKi8KLQkJCS8qIENoZWNrIFBNRCBzaWduYWwgb2sgKi8KLQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X3R5cGUsCi0JCQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJCQkgICAgICBNRElPX0FOX0RFVkFELAotCQkJCQkJICAgICAgMHhGRkZBLAotCQkJCQkJICAgICAgJnZhbDEpOwotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwYXJhbXMtPnBvcnQsIGV4dF9waHlfdHlwZSwKLQkJCQkgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgTURJT19QTUFfUkVHXzg0ODFfUE1EX1NJR05BTCwKLQkJCQkgICAgICAmdmFsMik7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlBNRF9TSUdOQUwgMS5hODExID0gMHgleFxuIiwgdmFsMik7Ci0KLQkJCS8qIENoZWNrIGxpbmsgMTBHICovCi0JCQlpZiAodmFsMiAmICgxPDwxMSkpIHsKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7Ci0JCQkJZXh0X3BoeV9saW5rX3VwID0gMTsKLQkJCQlibngyeF84NDgxX3NldF8xMEdfbGVkX21vZGUocGFyYW1zLAotCQkJCQkJCSAgZXh0X3BoeV90eXBlLAotCQkJCQkJCSAgZXh0X3BoeV9hZGRyKTsKLQkJCX0gZWxzZSB7IC8qIENoZWNrIExlZ2FjeSBzcGVlZCBsaW5rICovCi0JCQkJdTE2IGxlZ2FjeV9zdGF0dXMsIGxlZ2FjeV9zcGVlZDsKLQotCQkJCS8qIEVuYWJsZSBleHBhbnNpb24gcmVnaXN0ZXIgMHg0MgotCQkJCShPcGVyYXRpb24gbW9kZSBzdGF0dXMpICovCi0JCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGFyYW1zLT5wb3J0LAotCQkJCQkgZXh0X3BoeV90eXBlLAotCQkJCQkgZXh0X3BoeV9hZGRyLAotCQkJCQkgTURJT19BTl9ERVZBRCwKLQkJCQkJIE1ESU9fQU5fUkVHXzg0ODFfRVhQQU5TSU9OX1JFR19BQ0NFU1MsCi0JCQkJCSAweGY0Mik7Ci0KLQkJCQkvKiBHZXQgbGVnYWN5IHNwZWVkIG9wZXJhdGlvbiBzdGF0dXMgKi8KLQkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBhcmFtcy0+cG9ydCwKLQkJCQkJICBleHRfcGh5X3R5cGUsCi0JCQkJCSAgZXh0X3BoeV9hZGRyLAotCQkJCQkgIE1ESU9fQU5fREVWQUQsCi0JCQkJCSAgTURJT19BTl9SRUdfODQ4MV9FWFBBTlNJT05fUkVHX1JEX1JXLAotCQkJCQkgICZsZWdhY3lfc3RhdHVzKTsKLQotCQkJCURQKE5FVElGX01TR19MSU5LLCAiTGVnYWN5IHNwZWVkIHN0YXR1cyIKLQkJCQkJICAgICAiID0gMHgleFxuIiwgbGVnYWN5X3N0YXR1cyk7Ci0JCQkJZXh0X3BoeV9saW5rX3VwID0gKChsZWdhY3lfc3RhdHVzICYgKDE8PDExKSkKLQkJCQkJCSAgID09ICgxPDwxMSkpOwotCQkJCWlmIChleHRfcGh5X2xpbmtfdXApIHsKLQkJCQkJbGVnYWN5X3NwZWVkID0gKGxlZ2FjeV9zdGF0dXMgJiAoMzw8OSkpOwotCQkJCQlpZiAobGVnYWN5X3NwZWVkID09ICgwPDw5KSkKLQkJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDsKLQkJCQkJZWxzZSBpZiAobGVnYWN5X3NwZWVkID09ICgxPDw5KSkKLQkJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPQotCQkJCQkJCVNQRUVEXzEwMDsKLQkJCQkJZWxzZSBpZiAobGVnYWN5X3NwZWVkID09ICgyPDw5KSkKLQkJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPQotCQkJCQkJCVNQRUVEXzEwMDA7Ci0JCQkJCWVsc2UgLyogU2hvdWxkIG5vdCBoYXBwZW4gKi8KLQkJCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSAwOwotCi0JCQkJCWlmIChsZWdhY3lfc3RhdHVzICYgKDE8PDgpKQotCQkJCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCQkJCWVsc2UKLQkJCQkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9IQUxGOwotCi0JCQkJCURQKE5FVElGX01TR19MSU5LLCAiTGluayBpcyB1cCAiCi0JCQkJCQkgICAgICJpbiAlZE1icHMsIGlzX2R1cGxleF9mdWxsIgotCQkJCQkJICAgICAiPSAlZFxuIiwKLQkJCQkJCXZhcnMtPmxpbmVfc3BlZWQsCi0JCQkJCQkodmFycy0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSk7Ci0JCQkJCWJueDJ4Xzg0ODFfc2V0X2xlZ2FjeV9sZWRfbW9kZShwYXJhbXMsCi0JCQkJCQkJCSBleHRfcGh5X3R5cGUsCi0JCQkJCQkJCSBleHRfcGh5X2FkZHIpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgWEdYUyBleHRfcGh5X2NvbmZpZyAweCV4XG4iLAotCQkJICAgcGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCQlleHRfcGh5X2xpbmtfdXAgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogU2V0IFNHTUlJIG1vZGUgZm9yIGV4dGVybmFsIHBoeSAqLwotCQlpZiAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgewotCQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPCBTUEVFRF8xMDAwKQotCQkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsKLQkJCWVsc2UKLQkJCQl2YXJzLT5waHlfZmxhZ3MgJj0gflBIWV9TR01JSV9GTEFHOwotCQl9Ci0KLQl9IGVsc2UgeyAvKiBTZXJEZXMgKi8KLQkJZXh0X3BoeV90eXBlID0gU0VSREVTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKLQkJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVzIERpcmVjdFxuIik7Ci0JCQlleHRfcGh5X2xpbmtfdXAgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0JDTTU0ODI6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyA1NDgyXG4iKTsKLQkJCWV4dF9waHlfbGlua191cCA9IDE7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJICJCQUQgU2VyRGVzIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCi0JCQkJIHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQkJZXh0X3BoeV9saW5rX3VwID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIGV4dF9waHlfbGlua191cDsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfbGlua19pbnRfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQotewotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTMyIGV4dF9waHlfdHlwZTsKLQl1MzIgbWFzazsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQotCS8qIHNldHRpbmcgdGhlIHN0YXR1cyB0byByZXBvcnQgb24gbGluayB1cAotCSAgIGZvciBlaXRoZXIgWEdYUyBvciBTZXJEZXMgKi8KLQotCWlmIChwYXJhbXMtPnN3aXRjaF9jZmcgPT0gU1dJVENIX0NGR18xMEcpIHsKLQkJbWFzayA9IChOSUdfTUFTS19YR1hTMF9MSU5LMTBHIHwKLQkJCU5JR19NQVNLX1hHWFMwX0xJTktfU1RBVFVTKTsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJlbmFibGVkIFhHWFMgaW50ZXJydXB0XG4iKTsKLQkJZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCWlmICgoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgJiYKLQkJICAgIChleHRfcGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRSkgJiYKLQkJICAgIChleHRfcGh5X3R5cGUgIT0KLQkJCQlQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9OT1RfQ09OTikpIHsKLQkJCW1hc2sgfD0gTklHX01BU0tfTUlfSU5UOwotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJlbmFibGVkIGV4dGVybmFsIHBoeSBpbnRcbiIpOwotCQl9Ci0KLQl9IGVsc2UgeyAvKiBTZXJEZXMgKi8KLQkJbWFzayA9IE5JR19NQVNLX1NFUkRFUzBfTElOS19TVEFUVVM7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiZW5hYmxlZCBTZXJEZXMgaW50ZXJydXB0XG4iKTsKLQkJZXh0X3BoeV90eXBlID0gU0VSREVTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkJaWYgKChleHRfcGh5X3R5cGUgIT0KLQkJCQlQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgJiYKLQkJICAgIChleHRfcGh5X3R5cGUgIT0KLQkJCQlQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX05PVF9DT05OKSkgewotCQkJbWFzayB8PSBOSUdfTUFTS19NSV9JTlQ7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgImVuYWJsZWQgZXh0ZXJuYWwgcGh5IGludFxuIik7Ci0JCX0KLQl9Ci0JYm54MnhfYml0c19lbihicCwKLQkJICAgICAgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwKLQkJICAgICAgbWFzayk7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgInBvcnQgJXgsIGlzX3hneHMgJXgsIGludF9zdGF0dXMgMHgleFxuIiwgcG9ydCwKLQkJIChwYXJhbXMtPnN3aXRjaF9jZmcgPT0gU1dJVENIX0NGR18xMEcpLAotCQkgUkVHX1JEKGJwLCBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQpKTsKLQlEUChORVRJRl9NU0dfTElOSywgIiBpbnRfbWFzayAweCV4LCBNSV9JTlQgJXgsIFNFUkRFU19MSU5LICV4XG4iLAotCQkgUkVHX1JEKGJwLCBOSUdfUkVHX01BU0tfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0KSwKLQkJIFJFR19SRChicCwgTklHX1JFR19FTUFDMF9TVEFUVVNfTUlTQ19NSV9JTlQgKyBwb3J0KjB4MTgpLAotCQkgUkVHX1JEKGJwLCBOSUdfUkVHX1NFUkRFUzBfU1RBVFVTX0xJTktfU1RBVFVTK3BvcnQqMHgzYykpOwotCURQKE5FVElGX01TR19MSU5LLCAiIDEwRyAleCwgWEdYU19MSU5LICV4XG4iLAotCSAgIFJFR19SRChicCwgTklHX1JFR19YR1hTMF9TVEFUVVNfTElOSzEwRyArIHBvcnQqMHg2OCksCi0JICAgUkVHX1JEKGJwLCBOSUdfUkVHX1hHWFMwX1NUQVRVU19MSU5LX1NUQVRVUyArIHBvcnQqMHg2OCkpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF84NDgxX3JlYXJtX2xhdGNoX3NpZ25hbChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQl1OCBpc19taV9pbnQpCi17Ci0JdTMyIGxhdGNoX3N0YXR1cyA9IDAsIGlzX21pX2ludF9zdGF0dXM7Ci0JLyogRGlzYWJsZSB0aGUgTUkgSU5UICggZXh0ZXJuYWwgcGh5IGludCApCi0JICogYnkgd3JpdGluZyAxIHRvIHRoZSBzdGF0dXMgcmVnaXN0ZXIuIExpbmsgZG93biBpbmRpY2F0aW9uCi0JICogaXMgaGlnaC1hY3RpdmUtc2lnbmFsLCBzbyBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byB3cml0ZSB0aGUKLQkgKiBzdGF0dXMgdG8gY2xlYXIgdGhlIFhPUgotCSAqLwotCS8qIFJlYWQgTGF0Y2hlZCBzaWduYWxzICovCi0JbGF0Y2hfc3RhdHVzID0gUkVHX1JEKGJwLAotCQkJCSAgTklHX1JFR19MQVRDSF9TVEFUVVNfMCArIHBvcnQqOCk7Ci0JaXNfbWlfaW50X3N0YXR1cyA9IFJFR19SRChicCwKLQkJCQkgIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJvcmlnaW5hbF9zaWduYWwgPSAweCV4LCBuaWdfc3RhdHVzID0gMHgleCwiCi0JCSAgICAgImxhdGNoX3N0YXR1cyA9IDB4JXhcbiIsCi0JCSBpc19taV9pbnQsIGlzX21pX2ludF9zdGF0dXMsIGxhdGNoX3N0YXR1cyk7Ci0JLyogSGFuZGxlIG9ubHkgdGhvc2Ugd2l0aCBsYXRjaGVkLXNpZ25hbD11cC4qLwotCWlmIChsYXRjaF9zdGF0dXMgJiAxKSB7Ci0JCS8qIEZvciBhbGwgbGF0Y2hlZC1zaWduYWw9dXAsV3JpdGUgb3JpZ2luYWxfc2lnbmFsIHRvIHN0YXR1cyAqLwotCQlpZiAoaXNfbWlfaW50KQotCQkJYm54MnhfYml0c19lbihicCwKLQkJCQkgICAgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwCi0JCQkJICAgICsgcG9ydCo0LAotCQkJCSAgICBOSUdfU1RBVFVTX0VNQUMwX01JX0lOVCk7Ci0JCWVsc2UKLQkJCWJueDJ4X2JpdHNfZGlzKGJwLAotCQkJCSAgICAgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwCi0JCQkJICAgICArIHBvcnQqNCwKLQkJCQkgICAgIE5JR19TVEFUVVNfRU1BQzBfTUlfSU5UKTsKLQkJLyogRm9yIGFsbCBsYXRjaGVkLXNpZ25hbD11cCA6IFJlLUFybSBMYXRjaCBzaWduYWxzICovCi0JCVJFR19XUihicCwgTklHX1JFR19MQVRDSF9TVEFUVVNfMCArIHBvcnQqOCwKLQkJCSAgIChsYXRjaF9zdGF0dXMgJiAweGZmZmUpIHwgKGxhdGNoX3N0YXR1cyAmIDEpKTsKLQl9Ci19Ci0vKgotICogbGluayBtYW5hZ2VtZW50Ci0gKi8KLXN0YXRpYyB2b2lkIGJueDJ4X2xpbmtfaW50X2FjayhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywgdTggaXNfMTBnLAotCQkJICAgICB1OCBpc19taV9pbnQpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQotCS8qIGZpcnN0IHJlc2V0IGFsbCBzdGF0dXMKLQkgKiB3ZSBhc3N1bWUgb25seSBvbmUgbGluZSB3aWxsIGJlIGNoYW5nZSBhdCBhIHRpbWUgKi8KLQlibngyeF9iaXRzX2RpcyhicCwgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAotCQkgICAgIChOSUdfU1RBVFVTX1hHWFMwX0xJTksxMEcgfAotCQkgICAgICBOSUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTIHwKLQkJICAgICAgTklHX1NUQVRVU19TRVJERVMwX0xJTktfU1RBVFVTKSk7Ci0JaWYgKChYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKQotCQk9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxKSB8fAotCShYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKQotCQk9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMykpIHsKLQkJYm54MnhfODQ4MV9yZWFybV9sYXRjaF9zaWduYWwoYnAsIHBvcnQsIGlzX21pX2ludCk7Ci0JfQotCWlmICh2YXJzLT5waHlfbGlua191cCkgewotCQlpZiAoaXNfMTBnKSB7Ci0JCQkvKiBEaXNhYmxlIHRoZSAxMEcgbGluayBpbnRlcnJ1cHQKLQkJCSAqIGJ5IHdyaXRpbmcgMSB0byB0aGUgc3RhdHVzIHJlZ2lzdGVyCi0JCQkgKi8KLQkJCURQKE5FVElGX01TR19MSU5LLCAiMTBHIFhHWFMgcGh5IGxpbmsgdXBcbiIpOwotCQkJYm54MnhfYml0c19lbihicCwKLQkJCQkgICAgICBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCi0JCQkJICAgICAgTklHX1NUQVRVU19YR1hTMF9MSU5LMTBHKTsKLQotCQl9IGVsc2UgaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzEwRykgewotCQkJLyogRGlzYWJsZSB0aGUgbGluayBpbnRlcnJ1cHQKLQkJCSAqIGJ5IHdyaXRpbmcgMSB0byB0aGUgcmVsZXZhbnQgbGFuZQotCQkJICogaW4gdGhlIHN0YXR1cyByZWdpc3RlcgotCQkJICovCi0JCQl1MzIgc2VyX2xhbmUgPSAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgotCQkJCSAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9NQVNLKSA+PgotCQkJCSAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9TSElGVCk7Ci0KLQkJCURQKE5FVElGX01TR19MSU5LLCAiJWQgc3BlZWQgWEdYUyBwaHkgbGluayB1cFxuIiwKLQkJCQkgdmFycy0+bGluZV9zcGVlZCk7Ci0JCQlibngyeF9iaXRzX2VuKGJwLAotCQkJCSAgICAgIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwKLQkJCQkgICAgICAoKDEgPDwgc2VyX2xhbmUpIDw8Ci0JCQkJICAgICAgIE5JR19TVEFUVVNfWEdYUzBfTElOS19TVEFUVVNfU0laRSkpOwotCi0JCX0gZWxzZSB7IC8qIFNlckRlcyAqLwotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXJEZXMgcGh5IGxpbmsgdXBcbiIpOwotCQkJLyogRGlzYWJsZSB0aGUgbGluayBpbnRlcnJ1cHQKLQkJCSAqIGJ5IHdyaXRpbmcgMSB0byB0aGUgc3RhdHVzIHJlZ2lzdGVyCi0JCQkgKi8KLQkJCWJueDJ4X2JpdHNfZW4oYnAsCi0JCQkJICAgICAgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAotCQkJCSAgICAgIE5JR19TVEFUVVNfU0VSREVTMF9MSU5LX1NUQVRVUyk7Ci0JCX0KLQotCX0gZWxzZSB7IC8qIGxpbmtfZG93biAqLwotCX0KLX0KLQotc3RhdGljIHU4IGJueDJ4X2Zvcm1hdF92ZXIodTMyIG51bSwgdTggKnN0ciwgdTE2IGxlbikKLXsKLQl1OCAqc3RyX3B0ciA9IHN0cjsKLQl1MzIgbWFzayA9IDB4ZjAwMDAwMDA7Ci0JdTggc2hpZnQgPSA4KjQ7Ci0JdTggZGlnaXQ7Ci0JaWYgKGxlbiA8IDEwKSB7Ci0JCS8qIE5lZWQgbW9yZSB0aGFuIDEwY2hhcnMgZm9yIHRoaXMgZm9ybWF0ICovCi0JCSpzdHJfcHRyID0gJ1wwJzsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXdoaWxlIChzaGlmdCA+IDApIHsKLQotCQlzaGlmdCAtPSA0OwotCQlkaWdpdCA9ICgobnVtICYgbWFzaykgPj4gc2hpZnQpOwotCQlpZiAoZGlnaXQgPCAweGEpCi0JCQkqc3RyX3B0ciA9IGRpZ2l0ICsgJzAnOwotCQllbHNlCi0JCQkqc3RyX3B0ciA9IGRpZ2l0IC0gMHhhICsgJ2EnOwotCQlzdHJfcHRyKys7Ci0JCW1hc2sgPSBtYXNrID4+IDQ7Ci0JCWlmIChzaGlmdCA9PSA0KjQpIHsKLQkJCSpzdHJfcHRyID0gJzonOwotCQkJc3RyX3B0cisrOwotCQl9Ci0JfQotCSpzdHJfcHRyID0gJ1wwJzsKLQlyZXR1cm4gMDsKLX0KLQotdTggYm54MnhfZ2V0X2V4dF9waHlfZndfdmVyc2lvbihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggZHJpdmVyX2xvYWRlZCwKLQkJCSAgICAgIHU4ICp2ZXJzaW9uLCB1MTYgbGVuKQotewotCXN0cnVjdCBibngyeCAqYnA7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IDA7Ci0JdTMyIHNwaXJvbV92ZXIgPSAwOwotCXU4IHN0YXR1czsKLQotCWlmICh2ZXJzaW9uID09IE5VTEwgfHwgcGFyYW1zID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCWJwID0gcGFyYW1zLT5icDsKLQotCXNwaXJvbV92ZXIgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCi0JCSAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCi0JCQkgICAgcG9ydF9tYltwYXJhbXMtPnBvcnRdLmV4dF9waHlfZndfdmVyc2lvbikpOwotCi0Jc3RhdHVzID0gMDsKLQkvKiByZXNldCB0aGUgcmV0dXJuZWQgdmFsdWUgdG8gemVybyAqLwotCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxOgotCi0JCWlmIChsZW4gPCA1KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJdmVyc2lvblswXSA9IChzcGlyb21fdmVyICYgMHhGRik7Ci0JCXZlcnNpb25bMV0gPSAoc3Bpcm9tX3ZlciAmIDB4RkYwMCkgPj4gODsKLQkJdmVyc2lvblsyXSA9IChzcGlyb21fdmVyICYgMHhGRjAwMDApID4+IDE2OwotCQl2ZXJzaW9uWzNdID0gKHNwaXJvbV92ZXIgJiAweEZGMDAwMDAwKSA+PiAyNDsKLQkJdmVyc2lvbls0XSA9ICdcMCc7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyOgotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MzoKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2OgotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKLQkJc3RhdHVzID0gYm54MnhfZm9ybWF0X3ZlcihzcGlyb21fdmVyLCB2ZXJzaW9uLCBsZW4pOwotCQlicmVhazsKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODE6Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMzoKLQkJc3Bpcm9tX3ZlciA9ICgoc3Bpcm9tX3ZlciAmIDB4RjgwKSA+PiA3KSA8PCAxNiB8Ci0JCQkoc3Bpcm9tX3ZlciAmIDB4N0YpOwotCQlzdGF0dXMgPSBibngyeF9mb3JtYXRfdmVyKHNwaXJvbV92ZXIsIHZlcnNpb24sIGxlbik7Ci0JCWJyZWFrOwotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKLQkJdmVyc2lvblswXSA9ICdcMCc7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFOgotCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2dldF9leHRfcGh5X2Z3X3ZlcnNpb246IgotCQkJCSAgICAiIHR5cGUgaXMgRkFJTFVSRSFcbiIpOwotCQlzdGF0dXMgPSAtRUlOVkFMOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfeGd4c19sb29wYmFjayhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCi0JCQkJICB1OCBpc18xMGcpCi17Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQotCWlmIChpc18xMGcpIHsKLQkJdTMyIG1kX2RldmFkOwotCi0JCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyAxMEcgbG9vcGJhY2sgZW5hYmxlXG4iKTsKLQotCQkvKiBjaGFuZ2UgdGhlIHVuaV9waHlfYWRkciBpbiB0aGUgbmlnICovCi0JCW1kX2RldmFkID0gUkVHX1JEKGJwLCAoTklHX1JFR19YR1hTMF9DVFJMX01EX0RFVkFEICsKLQkJCQkJICBwb3J0KjB4MTgpKTsKLQotCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYUzBfQ1RSTF9NRF9ERVZBRCArIHBvcnQqMHgxOCwgMHg1KTsKLQotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCAwLAotCQkJICAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICAgNSwKLQkJCSAgICAgICAoTURJT19SRUdfQkFOS19BRVJfQkxPQ0sgKwotCQkJCShNRElPX0FFUl9CTE9DS19BRVJfUkVHICYgMHhmKSksCi0JCQkgICAgICAgMHgyODAwKTsKLQotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LCAwLAotCQkJICAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkgICAgICAgNSwKLQkJCSAgICAgICAoTURJT19SRUdfQkFOS19DTDczX0lFRUVCMCArCi0JCQkJKE1ESU9fQ0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MICYgMHhmKSksCi0JCQkgICAgICAgMHg2MDQxKTsKLQkJbXNsZWVwKDIwMCk7Ci0JCS8qIHNldCBhZXIgbW1kIGJhY2sgKi8KLQkJYm54Mnhfc2V0X2Flcl9tbWQocGFyYW1zLCB2YXJzKTsKLQotCQkvKiBhbmQgbWRfZGV2YWQgKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFMwX0NUUkxfTURfREVWQUQgKyBwb3J0KjB4MTgsCi0JCQkgICAgbWRfZGV2YWQpOwotCi0JfSBlbHNlIHsKLQkJdTE2IG1paV9jb250cm9sOwotCi0JCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyAxRyBsb29wYmFjayBlbmFibGVcbiIpOwotCi0JCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwb3J0LAotCQkJCSAgICAgIHBhcmFtcy0+cGh5X2FkZHIsCi0JCQkJICAgICAgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCwKLQkJCQkgICAgICBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLAotCQkJCSAgICAgICZtaWlfY29udHJvbCk7Ci0KLQkJQ0w0NV9XUl9PVkVSX0NMMjIoYnAsIHBvcnQsCi0JCQkJICAgICAgcGFyYW1zLT5waHlfYWRkciwKLQkJCQkgICAgICBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwLAotCQkJCSAgICAgIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsCi0JCQkJICAgICAgKG1paV9jb250cm9sIHwKLQkJCQkgICAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0xPT1BCQUNLKSk7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIGJueDJ4X2V4dF9waHlfbG9vcGJhY2soc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggZXh0X3BoeV9hZGRyOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0KLQlpZiAocGFyYW1zLT5zd2l0Y2hfY2ZnID09IFNXSVRDSF9DRkdfMTBHKSB7Ci0JCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQlleHRfcGh5X2FkZHIgPSBYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkJLyogQ0wzNyBBdXRvbmVnIEVuYWJsZWQgKi8KLQkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTk9UX0NPTk46Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkiZXh0X3BoeV9sb29wYmFjazogV2Ugc2hvdWxkIG5vdCBnZXQgaGVyZVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJleHRfcGh5X2xvb3BiYWNrOiA4NzA1XG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDY6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgImV4dF9waHlfbG9vcGJhY2s6IDg3MDZcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKLQkJCURQKE5FVElGX01TR19MSU5LLCAiUE1BL1BNRCBleHRfcGh5X2xvb3BiYWNrOiA4NzI2XG4iKTsKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwKLQkJCQkgICAgICAgMHgwMDAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6Ci0JCQkvKiBTRlg3MTAxX1hHWFNfVEVTVDEgKi8KLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBhcmFtcy0+cG9ydCwgZXh0X3BoeV90eXBlLAotCQkJCSAgICAgICBleHRfcGh5X2FkZHIsCi0JCQkJICAgICAgIE1ESU9fWFNfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fWFNfU0ZYNzEwMV9YR1hTX1RFU1QxLAotCQkJCSAgICAgICAweDEwMCk7Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkiZXh0X3BoeV9sb29wYmFjazogc2V0IGV4dCBwaHkgbG9vcGJhY2tcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKLQotCQkJYnJlYWs7Ci0JCX0gLyogc3dpdGNoIGV4dGVybmFsIFBIWSB0eXBlICovCi0JfSBlbHNlIHsKLQkJLyogc2VyZGVzICovCi0JCWV4dF9waHlfdHlwZSA9IFNFUkRFU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0JCWV4dF9waHlfYWRkciA9IChwYXJhbXMtPmV4dF9waHlfY29uZmlnICAmCi0JCVBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX0FERFJfTUFTSykKLQkJPj4gUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfQUREUl9TSElGVDsKLQl9Ci19Ci0KLQotLyoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBibngyeF9vdmVycmlkZV9sZWRfdmFsdWUgLQotICoKLSAqIE92ZXJyaWRlIHRoZSBsZWQgdmFsdWUgb2YgdGhlIHJlcXVzdGVkIGxlZAotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXU4IGJueDJ4X292ZXJyaWRlX2xlZF92YWx1ZShzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJICB1MzIgbGVkX2lkeCwgdTMyIHZhbHVlKQotewotCXUzMiByZWdfdmFsOwotCi0JLyogSWYgcG9ydCAwIHRoZW4gdXNlIEVNQUMwLCBlbHNlIHVzZSBFTUFDMSovCi0JdTMyIGVtYWNfYmFzZSA9IChwb3J0KSA/IEdSQ0JBU0VfRU1BQzEgOiBHUkNCQVNFX0VNQUMwOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssCi0JCSAiYm54Mnhfb3ZlcnJpZGVfbGVkX3ZhbHVlKCkgcG9ydCAleCBsZWRfaWR4ICVkIHZhbHVlICVkXG4iLAotCQkgcG9ydCwgbGVkX2lkeCwgdmFsdWUpOwotCi0Jc3dpdGNoIChsZWRfaWR4KSB7Ci0JY2FzZSAwOiAvKiAxME1CIGxlZCAqLwotCQkvKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBMRUQgcmVnaXN0ZXIgaW4KLQkJdGhlIEVNQUMgYmxvY2sgKi8KLQkJcmVnX3ZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQpOwotCQkvKiBTZXQgdGhlIE9WRVJSSURFIGJpdCB0byAxICovCi0JCXJlZ192YWwgfD0gRU1BQ19MRURfT1ZFUlJJREU7Ci0JCS8qIElmIHZhbHVlIGlzIDEsIHNldCB0aGUgMTBNX09WRVJSSURFIGJpdCwKLQkJb3RoZXJ3aXNlIHJlc2V0IGl0LiovCi0JCXJlZ192YWwgPSAodmFsdWUgPT0gMSkgPyAocmVnX3ZhbCB8IEVNQUNfTEVEXzEwTUJfT1ZFUlJJREUpIDoKLQkJCShyZWdfdmFsICYgfkVNQUNfTEVEXzEwTUJfT1ZFUlJJREUpOwotCQlSRUdfV1IoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTEVELCByZWdfdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOiAvKjEwME1CIGxlZCAgICAqLwotCQkvKlJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIExFRCByZWdpc3RlciBpbgotCQl0aGUgRU1BQyBibG9jayAqLwotCQlyZWdfdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX0xFRCk7Ci0JCS8qICBTZXQgdGhlIE9WRVJSSURFIGJpdCB0byAxICovCi0JCXJlZ192YWwgfD0gRU1BQ19MRURfT1ZFUlJJREU7Ci0JCS8qICBJZiB2YWx1ZSBpcyAxLCBzZXQgdGhlIDEwME1fT1ZFUlJJREUgYml0LAotCQlvdGhlcndpc2UgcmVzZXQgaXQuKi8KLQkJcmVnX3ZhbCA9ICh2YWx1ZSA9PSAxKSA/IChyZWdfdmFsIHwgRU1BQ19MRURfMTAwTUJfT1ZFUlJJREUpIDoKLQkJCShyZWdfdmFsICYgfkVNQUNfTEVEXzEwME1CX09WRVJSSURFKTsKLQkJUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX0xFRCwgcmVnX3ZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgMjogLyogMTAwME1CIGxlZCAqLwotCQkvKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBMRUQgcmVnaXN0ZXIgaW4gdGhlCi0JCUVNQUMgYmxvY2sgKi8KLQkJcmVnX3ZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQpOwotCQkvKiBTZXQgdGhlIE9WRVJSSURFIGJpdCB0byAxICovCi0JCXJlZ192YWwgfD0gRU1BQ19MRURfT1ZFUlJJREU7Ci0JCS8qIElmIHZhbHVlIGlzIDEsIHNldCB0aGUgMTAwME1fT1ZFUlJJREUgYml0LCBvdGhlcndpc2UKLQkJcmVzZXQgaXQuICovCi0JCXJlZ192YWwgPSAodmFsdWUgPT0gMSkgPyAocmVnX3ZhbCB8IEVNQUNfTEVEXzEwMDBNQl9PVkVSUklERSkgOgotCQkJKHJlZ192YWwgJiB+RU1BQ19MRURfMTAwME1CX09WRVJSSURFKTsKLQkJUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX0xFRCwgcmVnX3ZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgMzogLyogMjUwME1CIGxlZCAqLwotCQkvKiAgUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgTEVEIHJlZ2lzdGVyIGluIHRoZQotCQlFTUFDIGJsb2NrKi8KLQkJcmVnX3ZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19MRUQpOwotCQkvKiBTZXQgdGhlIE9WRVJSSURFIGJpdCB0byAxICovCi0JCXJlZ192YWwgfD0gRU1BQ19MRURfT1ZFUlJJREU7Ci0JCS8qICBJZiB2YWx1ZSBpcyAxLCBzZXQgdGhlIDI1MDBNX09WRVJSSURFIGJpdCwgb3RoZXJ3aXNlCi0JCXJlc2V0IGl0LiovCi0JCXJlZ192YWwgPSAodmFsdWUgPT0gMSkgPyAocmVnX3ZhbCB8IEVNQUNfTEVEXzI1MDBNQl9PVkVSUklERSkgOgotCQkJKHJlZ192YWwgJiB+RU1BQ19MRURfMjUwME1CX09WRVJSSURFKTsKLQkJUkVHX1dSKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX0xFRCwgcmVnX3ZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgNDogLyoxMEcgbGVkICovCi0JCWlmIChwb3J0ID09IDApIHsKLQkJCVJFR19XUihicCwgTklHX1JFR19MRURfMTBHX1AwLAotCQkJCSAgICB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEXzEwR19QMSwKLQkJCQkgICAgdmFsdWUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgNTogLyogVFJBRkZJQyBsZWQgKi8KLQkJLyogRmluZCBpZiB0aGUgdHJhZmZpYyBjb250cm9sIGlzIHZpYSBCTUFDIG9yIEVNQUMgKi8KLQkJaWYgKHBvcnQgPT0gMCkKLQkJCXJlZ192YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfTklHX0VNQUMwX0VOKTsKLQkJZWxzZQotCQkJcmVnX3ZhbCA9IFJFR19SRChicCwgTklHX1JFR19OSUdfRU1BQzFfRU4pOwotCi0JCS8qICBPdmVycmlkZSB0aGUgdHJhZmZpYyBsZWQgaW4gdGhlIEVNQUM6Ki8KLQkJaWYgKHJlZ192YWwgPT0gMSkgewotCQkJLyogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgTEVEIHJlZ2lzdGVyIGluCi0JCQl0aGUgRU1BQyBibG9jayAqLwotCQkJcmVnX3ZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlICsKLQkJCQkJICAgICBFTUFDX1JFR19FTUFDX0xFRCk7Ci0JCQkvKiBTZXQgdGhlIFRSQUZGSUNfT1ZFUlJJREUgYml0IHRvIDEgKi8KLQkJCXJlZ192YWwgfD0gRU1BQ19MRURfT1ZFUlJJREU7Ci0JCQkvKiBJZiB2YWx1ZSBpcyAxLCBzZXQgdGhlIFRSQUZGSUMgYml0LCBvdGhlcndpc2UKLQkJCXJlc2V0IGl0LiovCi0JCQlyZWdfdmFsID0gKHZhbHVlID09IDEpID8gKHJlZ192YWwgfCBFTUFDX0xFRF9UUkFGRklDKSA6Ci0JCQkJKHJlZ192YWwgJiB+RU1BQ19MRURfVFJBRkZJQyk7Ci0JCQlSRUdfV1IoYnAsIGVtYWNfYmFzZSArIEVNQUNfUkVHX0VNQUNfTEVELCByZWdfdmFsKTsKLQkJfSBlbHNlIHsgLyogT3ZlcnJpZGUgdGhlIHRyYWZmaWMgbGVkIGluIHRoZSBCTUFDOiAqLwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX09WRVJSSURFX1RSQUZGSUNfUDAKLQkJCQkgICArIHBvcnQqNCwgMSk7Ci0JCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX0NPTlRST0xfVFJBRkZJQ19QMCArIHBvcnQqNCwKLQkJCQkgICAgdmFsdWUpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURQKE5FVElGX01TR19MSU5LLAotCQkJICJibngyeF9vdmVycmlkZV9sZWRfdmFsdWUoKSB1bmtub3duIGxlZCBpbmRleCAlZCAiCi0JCQkgIihzaG91bGQgYmUgMC01KVxuIiwgbGVkX2lkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXU4IGJueDJ4X3NldF9sZWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IG1vZGUsIHUzMiBzcGVlZCkKLXsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCXUxNiBod19sZWRfbW9kZSA9IHBhcmFtcy0+aHdfbGVkX21vZGU7Ci0JdTggcmMgPSAwOwotCXUzMiB0bXA7Ci0JdTMyIGVtYWNfYmFzZSA9IHBvcnQgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKLQl1MzIgZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUocGFyYW1zLT5leHRfcGh5X2NvbmZpZyk7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9zZXRfbGVkOiBwb3J0ICV4LCBtb2RlICVkXG4iLCBwb3J0LCBtb2RlKTsKLQlEUChORVRJRl9NU0dfTElOSywgInNwZWVkIDB4JXgsIGh3X2xlZF9tb2RlIDB4JXhcbiIsCi0JCSBzcGVlZCwgaHdfbGVkX21vZGUpOwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTEVEX01PREVfT0ZGOgotCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEXzEwR19QMCArIHBvcnQqNCwgMCk7Ci0JCVJFR19XUihicCwgTklHX1JFR19MRURfTU9ERV9QMCArIHBvcnQqNCwKLQkJCSAgIFNIQVJFRF9IV19DRkdfTEVEX01BQzEpOwotCi0JCXRtcCA9IEVNQUNfUkQoYnAsIEVNQUNfUkVHX0VNQUNfTEVEKTsKLQkJRU1BQ19XUihicCwgRU1BQ19SRUdfRU1BQ19MRUQsICh0bXAgfCBFTUFDX0xFRF9PVkVSUklERSkpOwotCQlicmVhazsKLQotCWNhc2UgTEVEX01PREVfT1BFUjoKLQkJaWYgKGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpIHsKLQkJCVJFR19XUihicCwgTklHX1JFR19MRURfTU9ERV9QMCArIHBvcnQqNCwgMCk7Ci0JCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEXzEwR19QMCArIHBvcnQqNCwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX01PREVfUDAgKyBwb3J0KjQsCi0JCQkJICAgaHdfbGVkX21vZGUpOwotCQl9Ci0KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX09WRVJSSURFX1RSQUZGSUNfUDAgKwotCQkJICAgcG9ydCo0LCAwKTsKLQkJLyogU2V0IGJsaW5raW5nIHJhdGUgdG8gfjE1LjlIeiAqLwotCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX0NPTlRST0xfQkxJTktfUkFURV9QMCArIHBvcnQqNCwKLQkJCSAgIExFRF9CTElOS19SQVRFX1ZBTCk7Ci0JCVJFR19XUihicCwgTklHX1JFR19MRURfQ09OVFJPTF9CTElOS19SQVRFX0VOQV9QMCArCi0JCQkgICBwb3J0KjQsIDEpOwotCQl0bXAgPSBFTUFDX1JEKGJwLCBFTUFDX1JFR19FTUFDX0xFRCk7Ci0JCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTEVELAotCQkJICAgICh0bXAgJiAofkVNQUNfTEVEX09WRVJSSURFKSkpOwotCi0JCWlmIChDSElQX0lTX0UxKGJwKSAmJgotCQkgICAgKChzcGVlZCA9PSBTUEVFRF8yNTAwKSB8fAotCQkgICAgIChzcGVlZCA9PSBTUEVFRF8xMDAwKSB8fAotCQkgICAgIChzcGVlZCA9PSBTUEVFRF8xMDApIHx8Ci0JCSAgICAgKHNwZWVkID09IFNQRUVEXzEwKSkpIHsKLQkJCS8qIE9uIEV2ZXJlc3QgMSBBeCBjaGlwIHZlcnNpb25zIGZvciBzcGVlZHMgbGVzcyB0aGFuCi0JCQkxMEcgTEVEIHNjaGVtZSBpcyBkaWZmZXJlbnQgKi8KLQkJCVJFR19XUihicCwgTklHX1JFR19MRURfQ09OVFJPTF9PVkVSUklERV9UUkFGRklDX1AwCi0JCQkJICAgKyBwb3J0KjQsIDEpOwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX1RSQUZGSUNfUDAgKwotCQkJCSAgIHBvcnQqNCwgMCk7Ci0JCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX0NPTlRST0xfQkxJTktfVFJBRkZJQ19QMCArCi0JCQkJICAgcG9ydCo0LCAxKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9zZXRfbGVkOiBJbnZhbGlkIGxlZCBtb2RlICVkXG4iLAotCQkJIG1vZGUpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXU4IGJueDJ4X3Rlc3RfbGluayhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgZ3Bfc3RhdHVzID0gMDsKLQotCUNMNDVfUkRfT1ZFUl9DTDIyKGJwLCBwYXJhbXMtPnBvcnQsCi0JCQkgICAgICBwYXJhbXMtPnBoeV9hZGRyLAotCQkJICAgICAgTURJT19SRUdfQkFOS19HUF9TVEFUVVMsCi0JCQkgICAgICBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMSwKLQkJCSAgICAgICZncF9zdGF0dXMpOwotCS8qIGxpbmsgaXMgdXAgb25seSBpZiBib3RoIGxvY2FsIHBoeSBhbmQgZXh0ZXJuYWwgcGh5IGFyZSB1cCAqLwotCWlmICgoZ3Bfc3RhdHVzICYgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfTElOS19TVEFUVVMpICYmCi0JICAgIGJueDJ4X2V4dF9waHlfaXNfbGlua191cChwYXJhbXMsIHZhcnMsIDEpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRVNSQ0g7Ci19Ci0KLXN0YXRpYyB1OCBibngyeF9saW5rX2luaXRpYWxpemUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTggcmMgPSAwOwotCXU4IG5vbl9leHRfcGh5OwotCXUzMiBleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQotCS8qIEFjdGl2YXRlIHRoZSBleHRlcm5hbCBQSFkgKi8KLQlibngyeF9leHRfcGh5X3Jlc2V0KHBhcmFtcywgdmFycyk7Ci0KLQlibngyeF9zZXRfYWVyX21tZChwYXJhbXMsIHZhcnMpOwotCi0JaWYgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpCi0JCWJueDJ4X3NldF9tYXN0ZXJfbG4ocGFyYW1zKTsKLQotCXJjID0gYm54MnhfcmVzZXRfdW5pY29yZShwYXJhbXMpOwotCS8qIHJlc2V0IHRoZSBTZXJEZXMgYW5kIHdhaXQgZm9yIHJlc2V0IGJpdCByZXR1cm4gbG93ICovCi0JaWYgKHJjICE9IDApCi0JCXJldHVybiByYzsKLQotCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgdmFycyk7Ci0KLQkvKiBzZXR0aW5nIHRoZSBtYXN0ZXJMbl9kZWYgYWdhaW4gYWZ0ZXIgdGhlIHJlc2V0ICovCi0JaWYgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsKLQkJYm54Mnhfc2V0X21hc3Rlcl9sbihwYXJhbXMpOwotCQlibngyeF9zZXRfc3dhcF9sYW5lcyhwYXJhbXMpOwotCX0KLQotCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7Ci0JCWlmICgocGFyYW1zLT5yZXFfbGluZV9zcGVlZCAmJgotCQkgICAgKChwYXJhbXMtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwMCkgfHwKLQkJICAgICAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMCkpKSB8fAotCQkgICAgKCFwYXJhbXMtPnJlcV9saW5lX3NwZWVkICYmCi0JCSAgICAgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgPj0KLQkJICAgICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBNX0ZVTEwpICYmCi0JCSAgICAgKHBhcmFtcy0+c3BlZWRfY2FwX21hc2sgPAotCQkgICAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykKLQkJICAgICApKSAgewotCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9TR01JSV9GTEFHOwotCQl9IGVsc2UgewotCQkJdmFycy0+cGh5X2ZsYWdzICY9IH5QSFlfU0dNSUlfRkxBRzsKLQkJfQotCX0KLQkvKiBJbiBjYXNlIG9mIGV4dGVybmFsIHBoeSBleGlzdGFuY2UsIHRoZSBsaW5lIHNwZWVkIHdvdWxkIGJlIHRoZQotCSBsaW5lIHNwZWVkIGxpbmtlZCB1cCBieSB0aGUgZXh0ZXJuYWwgcGh5LiBJbiBjYXNlIGl0IGlzIGRpcmVjdCBvbmx5LAotCSAgdGhlbiB0aGUgbGluZV9zcGVlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBlcXVhbCB0byB0aGUKLQkgICByZXFfbGluZV9zcGVlZCovCi0JdmFycy0+bGluZV9zcGVlZCA9IHBhcmFtcy0+cmVxX2xpbmVfc3BlZWQ7Ci0KLQlibngyeF9jYWxjX2llZWVfYW5lZ19hZHYocGFyYW1zLCAmdmFycy0+aWVlZV9mYyk7Ci0KLQkvKiBpbml0IGV4dCBwaHkgYW5kIGVuYWJsZSBsaW5rIHN0YXRlIGludCAqLwotCW5vbl9leHRfcGh5ID0gKChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKSB8fAotCQkgICAgICAgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR1hTXzEwKSk7Ci0KLQlpZiAobm9uX2V4dF9waHkgfHwKLQkgICAgKGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1KSB8fAotCSAgICAoZXh0X3BoeV90eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDYpIHx8Ci0JICAgIChleHRfcGh5X3R5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNikgfHwKLQkgICAgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19FWFRfUEhZKSkgewotCQlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKLQkJCWJueDJ4X3NldF9wYXJhbGxlbF9kZXRlY3Rpb24ocGFyYW1zLCB2YXJzLT5waHlfZmxhZ3MpOwotCQlibngyeF9pbml0X2ludGVybmFsX3BoeShwYXJhbXMsIHZhcnMsIG5vbl9leHRfcGh5KTsKLQl9Ci0KLQlpZiAoIW5vbl9leHRfcGh5KQotCQlyYyB8PSBibngyeF9leHRfcGh5X2luaXQocGFyYW1zLCB2YXJzKTsKLQotCWJueDJ4X2JpdHNfZGlzKGJwLCBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCi0JCSAgICAgKE5JR19TVEFUVVNfWEdYUzBfTElOSzEwRyB8Ci0JCSAgICAgIE5JR19TVEFUVVNfWEdYUzBfTElOS19TVEFUVVMgfAotCQkgICAgICBOSUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVMpKTsKLQotCXJldHVybiByYzsKLQotfQotCi0KLXU4IGJueDJ4X3BoeV9pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiB2YWw7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgIlBoeSBJbml0aWFsaXphdGlvbiBzdGFydGVkXG4iKTsKLQlEUChORVRJRl9NU0dfTElOSywgInJlcV9zcGVlZCAlZCwgcmVxX2Zsb3djdHJsICVkXG4iLAotCQkgcGFyYW1zLT5yZXFfbGluZV9zcGVlZCwgcGFyYW1zLT5yZXFfZmxvd19jdHJsKTsKLQl2YXJzLT5saW5rX3N0YXR1cyA9IDA7Ci0JdmFycy0+cGh5X2xpbmtfdXAgPSAwOwotCXZhcnMtPmxpbmtfdXAgPSAwOwotCXZhcnMtPmxpbmVfc3BlZWQgPSAwOwotCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOwotCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfTk9ORTsKLQotCWlmIChwYXJhbXMtPnN3aXRjaF9jZmcgPT0gIFNXSVRDSF9DRkdfMUcpCi0JCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9TRVJERVNfRkxBRzsKLQllbHNlCi0JCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7Ci0KLQkvKiBkaXNhYmxlIGF0dGVudGlvbnMgKi8KLQlibngyeF9iaXRzX2RpcyhicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBhcmFtcy0+cG9ydCo0LAotCQkgICAgICAgKE5JR19NQVNLX1hHWFMwX0xJTktfU1RBVFVTIHwKLQkJCU5JR19NQVNLX1hHWFMwX0xJTksxMEcgfAotCQkJTklHX01BU0tfU0VSREVTMF9MSU5LX1NUQVRVUyB8Ci0JCQlOSUdfTUFTS19NSV9JTlQpKTsKLQotCWJueDJ4X2VtYWNfaW5pdChwYXJhbXMsIHZhcnMpOwotCi0JaWYgKENISVBfUkVWX0lTX0ZQR0EoYnApKSB7Ci0KLQkJdmFycy0+bGlua191cCA9IDE7Ci0JCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCQl2YXJzLT5saW5rX3N0YXR1cyA9IChMSU5LX1NUQVRVU19MSU5LX1VQIHwgTElOS18xMEdURkQpOwotCQkvKiBlbmFibGUgb24gRTEuNSBGUEdBICovCi0JCWlmIChDSElQX0lTX0UxSChicCkpIHsKLQkJCXZhcnMtPmZsb3dfY3RybCB8PQotCQkJCQkoQk5YMlhfRkxPV19DVFJMX1RYIHwKLQkJCQkJIEJOWDJYX0ZMT1dfQ1RSTF9SWCk7Ci0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PQotCQkJCQkoTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0VOQUJMRUQgfAotCQkJCQkgTElOS19TVEFUVVNfUlhfRkxPV19DT05UUk9MX0VOQUJMRUQpOwotCQl9Ci0KLQkJYm54MnhfZW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAwKTsKLQkJYm54MnhfcGJmX3VwZGF0ZShwYXJhbXMsIHZhcnMtPmZsb3dfY3RybCwgdmFycy0+bGluZV9zcGVlZCk7Ci0JCS8qIGRpc2FibGUgZHJhaW4gKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArIHBhcmFtcy0+cG9ydCo0LCAwKTsKLQotCQkvKiB1cGRhdGUgc2hhcmVkIG1lbW9yeSAqLwotCQlibngyeF91cGRhdGVfbW5nKHBhcmFtcywgdmFycy0+bGlua19zdGF0dXMpOwotCi0JCXJldHVybiAwOwotCi0JfSBlbHNlCi0JaWYgKENISVBfUkVWX0lTX0VNVUwoYnApKSB7Ci0KLQkJdmFycy0+bGlua191cCA9IDE7Ci0JCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCQl2YXJzLT5saW5rX3N0YXR1cyA9IChMSU5LX1NUQVRVU19MSU5LX1VQIHwgTElOS18xMEdURkQpOwotCi0JCWJueDJ4X2JtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7Ci0KLQkJYm54MnhfcGJmX3VwZGF0ZShwYXJhbXMsIHZhcnMtPmZsb3dfY3RybCwgdmFycy0+bGluZV9zcGVlZCk7Ci0JCS8qIERpc2FibGUgZHJhaW4gKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERQotCQkJCSAgICArIHBhcmFtcy0+cG9ydCo0LCAwKTsKLQotCQkvKiB1cGRhdGUgc2hhcmVkIG1lbW9yeSAqLwotCQlibngyeF91cGRhdGVfbW5nKHBhcmFtcywgdmFycy0+bGlua19zdGF0dXMpOwotCi0JCXJldHVybiAwOwotCi0JfSBlbHNlCi0JaWYgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19CTUFDKSB7Ci0KLQkJdmFycy0+bGlua191cCA9IDE7Ci0JCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0JNQUM7Ci0KLQkJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1hHWFNfRkxBRzsKLQotCQlibngyeF9waHlfZGVhc3NlcnQocGFyYW1zLCB2YXJzLT5waHlfZmxhZ3MpOwotCQkvKiBzZXQgYm1hYyBsb29wYmFjayAqLwotCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDEpOwotCi0JCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKwotCQkgICAgcGFyYW1zLT5wb3J0KjQsIDApOwotCi0JfSBlbHNlIGlmIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfRU1BQykgewotCi0JCXZhcnMtPmxpbmtfdXAgPSAxOwotCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKLQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0VNQUM7Ci0KLQkJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1hHWFNfRkxBRzsKLQotCQlibngyeF9waHlfZGVhc3NlcnQocGFyYW1zLCB2YXJzLT5waHlfZmxhZ3MpOwotCQkvKiBzZXQgYm1hYyBsb29wYmFjayAqLwotCQlibngyeF9lbWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDEpOwotCQlibngyeF9lbWFjX3Byb2dyYW0ocGFyYW1zLCB2YXJzLT5saW5lX3NwZWVkLAotCQkJCQkgICAgICB2YXJzLT5kdXBsZXgpOwotCQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFICsKLQkJICAgIHBhcmFtcy0+cG9ydCo0LCAwKTsKLQotCX0gZWxzZSBpZiAoKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR1hTXzEwKSB8fAotCQkgICAocGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX0VYVF9QSFkpKSB7Ci0KLQkJdmFycy0+bGlua191cCA9IDE7Ci0JCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCi0JCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7Ci0KLQkJdmFsID0gUkVHX1JEKGJwLAotCQkJCSBOSUdfUkVHX1hHWFMwX0NUUkxfUEhZX0FERFIrCi0JCQkJIHBhcmFtcy0+cG9ydCoweDE4KTsKLQkJcGFyYW1zLT5waHlfYWRkciA9ICh1OCl2YWw7Ci0KLQkJYm54MnhfcGh5X2RlYXNzZXJ0KHBhcmFtcywgdmFycy0+cGh5X2ZsYWdzKTsKLQkJYm54MnhfbGlua19pbml0aWFsaXplKHBhcmFtcywgdmFycyk7Ci0KLQkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9CTUFDOwotCi0JCWJueDJ4X2JtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7Ci0KLQkJaWYgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR1hTXzEwKSB7Ci0JCQkvKiBzZXQgMTBHIFhHWFMgbG9vcGJhY2sgKi8KLQkJCWJueDJ4X3NldF94Z3hzX2xvb3BiYWNrKHBhcmFtcywgdmFycywgMSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzZXQgZXh0ZXJuYWwgcGh5IGxvb3BiYWNrICovCi0JCQlibngyeF9leHRfcGh5X2xvb3BiYWNrKHBhcmFtcyk7Ci0JCX0KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArCi0JCQkgICAgcGFyYW1zLT5wb3J0KjQsIDApOwotCi0JCWJueDJ4X3NldF9sZWQocGFyYW1zLCBMRURfTU9ERV9PUEVSLCB2YXJzLT5saW5lX3NwZWVkKTsKLQl9IGVsc2UKLQkvKiBObyBsb29wYmFjayAqLwotCXsKLQkJYm54MnhfcGh5X2RlYXNzZXJ0KHBhcmFtcywgdmFycy0+cGh5X2ZsYWdzKTsKLQkJc3dpdGNoIChwYXJhbXMtPnN3aXRjaF9jZmcpIHsKLQkJY2FzZSBTV0lUQ0hfQ0ZHXzFHOgotCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9TRVJERVNfRkxBRzsKLQkJCWlmICgocGFyYW1zLT5leHRfcGh5X2NvbmZpZyAmCi0JCQkgICAgIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfTUFTSykgPT0KLQkJCSAgICAgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9CQ001NDgyKSB7Ci0JCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9TR01JSV9GTEFHOwotCQkJfQotCi0JCQl2YWwgPSBSRUdfUkQoYnAsCi0JCQkJCSBOSUdfUkVHX1NFUkRFUzBfQ1RSTF9QSFlfQUREUisKLQkJCQkJIHBhcmFtcy0+cG9ydCoweDEwKTsKLQotCQkJcGFyYW1zLT5waHlfYWRkciA9ICh1OCl2YWw7Ci0KLQkJCWJyZWFrOwotCQljYXNlIFNXSVRDSF9DRkdfMTBHOgotCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9YR1hTX0ZMQUc7Ci0JCQl2YWwgPSBSRUdfUkQoYnAsCi0JCQkJIE5JR19SRUdfWEdYUzBfQ1RSTF9QSFlfQUREUisKLQkJCQkgcGFyYW1zLT5wb3J0KjB4MTgpOwotCQkJcGFyYW1zLT5waHlfYWRkciA9ICh1OCl2YWw7Ci0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIHN3aXRjaF9jZmdcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJRFAoTkVUSUZfTVNHX0xJTkssICJQaHkgYWRkcmVzcyA9IDB4JXhcbiIsIHBhcmFtcy0+cGh5X2FkZHIpOwotCi0JCWJueDJ4X2xpbmtfaW5pdGlhbGl6ZShwYXJhbXMsIHZhcnMpOwotCQltc2xlZXAoMzApOwotCQlibngyeF9saW5rX2ludF9lbmFibGUocGFyYW1zKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4Xzg3MjZfcmVzZXRfcGh5KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQsIHU4IGV4dF9waHlfYWRkcikKLXsKLQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4Xzg3MjZfcmVzZXRfcGh5IHBvcnQgJWRcbiIsIHBvcnQpOwotCi0JLyogU2V0IHNlcmlhbCBib290IGNvbnRyb2wgZm9yIGV4dGVybmFsIGxvYWQgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNiwgZXh0X3BoeV9hZGRyLAotCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgICBNRElPX1BNQV9SRUdfR0VOX0NUUkwsIDB4MDAwMSk7Ci19Ci0KLXU4IGJueDJ4X2xpbmtfcmVzZXQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCi0JCSAgdTggcmVzZXRfZXh0X3BoeSkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MzIgZXh0X3BoeV9jb25maWcgPSBwYXJhbXMtPmV4dF9waHlfY29uZmlnOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKGV4dF9waHlfY29uZmlnKTsKLQl1MzIgdmFsID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwotCQkJICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBkZXZfaW5mby4KLQkJCQkgICAgICBwb3J0X2ZlYXR1cmVfY29uZmlnW3BhcmFtcy0+cG9ydF0uCi0JCQkJICAgICAgY29uZmlnKSk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJSZXNldHRpbmcgdGhlIGxpbmsgb2YgcG9ydCAlZFxuIiwgcG9ydCk7Ci0JLyogZGlzYWJsZSBhdHRlbnRpb25zICovCi0JdmFycy0+bGlua19zdGF0dXMgPSAwOwotCWJueDJ4X3VwZGF0ZV9tbmcocGFyYW1zLCB2YXJzLT5saW5rX3N0YXR1cyk7Ci0JYm54MnhfYml0c19kaXMoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCi0JCSAgICAgKE5JR19NQVNLX1hHWFMwX0xJTktfU1RBVFVTIHwKLQkJICAgICAgTklHX01BU0tfWEdYUzBfTElOSzEwRyB8Ci0JCSAgICAgIE5JR19NQVNLX1NFUkRFUzBfTElOS19TVEFUVVMgfAotCQkgICAgICBOSUdfTUFTS19NSV9JTlQpKTsKLQotCS8qIGFjdGl2YXRlIG5pZyBkcmFpbiAqLwotCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwb3J0KjQsIDEpOwotCi0JLyogZGlzYWJsZSBuaWcgZWdyZXNzIGludGVyZmFjZSAqLwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDApOwotCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfT1VUX0VOICsgcG9ydCo0LCAwKTsKLQotCS8qIFN0b3AgQmlnTWFjIHJ4ICovCi0JYm54MnhfYm1hY19yeF9kaXNhYmxlKGJwLCBwb3J0KTsKLQotCS8qIGRpc2FibGUgZW1hYyAqLwotCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOwotCi0JbXNsZWVwKDEwKTsKLQkvKiBUaGUgUEhZIHJlc2V0IGlzIGNvbnRyb2xlZCBieSBHUElPIDEKLQkgKiBIb2xkIGl0IGFzIHZhcnMgbG93Ci0JICovCi0JIC8qIGNsZWFyIGxpbmsgbGVkICovCi0JYm54Mnhfc2V0X2xlZChwYXJhbXMsIExFRF9NT0RFX09GRiwgMCk7Ci0JaWYgKHJlc2V0X2V4dF9waHkpIHsKLQkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MjoKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNzoKLQkJewotCi0JCQkvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICovCi0JCQl1OCBleHRfcGh5X2FkZHIgPQotCQkJCVhHWFNfRVhUX1BIWV9BRERSKHBhcmFtcy0+ZXh0X3BoeV9jb25maWcpOwotCQkJaWYgKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KLQkJCSAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfRElTQUJMRV9UWF9MQVNFUikKLQkJCQlibngyeF9zZnBfc2V0X3RyYW5zbWl0dGVyKGJwLCBwb3J0LAotCQkJCQlQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAotCQkJCQlleHRfcGh5X2FkZHIsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczOgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDgwNzMgcG9ydCAlZCBpbnRvICIKLQkJCQkgImxvdyBwb3dlciBtb2RlXG4iLAotCQkJCSBwb3J0KTsKLQkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCi0JCQkJCSAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XLAotCQkJCQkgIHBvcnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKLQkJewotCQkJdTggZXh0X3BoeV9hZGRyID0KLQkJCQlYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkJCS8qIFNldCBzb2Z0IHJlc2V0ICovCi0JCQlibngyeF84NzI2X3Jlc2V0X3BoeShicCwgcGFyYW1zLT5wb3J0LCBleHRfcGh5X2FkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMzoKLQkJewotCQkJdTggZXh0X3BoeV9hZGRyID0KLQkJCQlYR1hTX0VYVF9QSFlfQUREUihwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19BTl9ERVZBRCwKLQkJCQkgICAgICAgTURJT19BTl9SRUdfQ1RSTCwgMHgwMDAwKTsKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCi0JCQkJICAgICAgIGV4dF9waHlfYWRkciwKLQkJCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLCAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBIVyByZXNldCAqLwotCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMSwKLQkJCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1csCi0JCQkJCSAgcG9ydCk7Ci0JCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAotCQkJCQkgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywKLQkJCQkJICBwb3J0KTsKLQkJCURQKE5FVElGX01TR19MSU5LLCAicmVzZXQgZXh0ZXJuYWwgUEhZXG4iKTsKLQkJfQotCX0KLQkvKiByZXNldCB0aGUgU2VyRGVzL1hHWFMgKi8KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX0NMRUFSLAotCSAgICAgICAoMHgxZmYgPDwgKHBvcnQqMTYpKSk7Ci0KLQkvKiByZXNldCBCaWdNYWMgKi8KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKLQotCS8qIGRpc2FibGUgbmlnIGluZ3Jlc3MgaW50ZXJmYWNlICovCi0JUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX0lOX0VOICsgcG9ydCo0LCAwKTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfRU1BQzBfSU5fRU4gKyBwb3J0KjQsIDApOwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDApOwotCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfT1VUX0VOICsgcG9ydCo0LCAwKTsKLQl2YXJzLT5saW5rX3VwID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU4IGJueDJ4X3VwZGF0ZV9saW5rX2Rvd24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJQb3J0ICV4OiBMaW5rIGlzIGRvd25cbiIsIHBvcnQpOwotCWJueDJ4X3NldF9sZWQocGFyYW1zLCBMRURfTU9ERV9PRkYsIDApOwotCi0JLyogaW5kaWNhdGUgbm8gbWFjIGFjdGl2ZSAqLwotCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfTk9ORTsKLQotCS8qIHVwZGF0ZSBzaGFyZWQgbWVtb3J5ICovCi0JdmFycy0+bGlua19zdGF0dXMgPSAwOwotCXZhcnMtPmxpbmVfc3BlZWQgPSAwOwotCWJueDJ4X3VwZGF0ZV9tbmcocGFyYW1zLCB2YXJzLT5saW5rX3N0YXR1cyk7Ci0KLQkvKiBhY3RpdmF0ZSBuaWcgZHJhaW4gKi8KLQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFICsgcG9ydCo0LCAxKTsKLQotCS8qIGRpc2FibGUgZW1hYyAqLwotCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOwotCi0JbXNsZWVwKDEwKTsKLQotCS8qIHJlc2V0IEJpZ01hYyAqLwotCWJueDJ4X2JtYWNfcnhfZGlzYWJsZShicCwgcGFyYW1zLT5wb3J0KTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArCi0JCSAgIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCQkgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU4IGJueDJ4X3VwZGF0ZV9saW5rX3VwKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAotCQkJICAgICB1OCBsaW5rXzEwZywgdTMyIGdwX3N0YXR1cykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwotCXU4IHJjID0gMDsKLQotCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfVVA7Ci0JaWYgKGxpbmtfMTBnKSB7Ci0JCWJueDJ4X2JtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7Ci0JCWJueDJ4X3NldF9sZWQocGFyYW1zLCBMRURfTU9ERV9PUEVSLCBTUEVFRF8xMDAwMCk7Ci0JfSBlbHNlIHsKLQkJcmMgPSBibngyeF9lbWFjX3Byb2dyYW0ocGFyYW1zLCB2YXJzLT5saW5lX3NwZWVkLAotCQkJCSAgICAgIHZhcnMtPmR1cGxleCk7Ci0KLQkJYm54MnhfZW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAwKTsKLQotCQkvKiBBTiBjb21wbGV0ZT8gKi8KLQkJaWYgKGdwX3N0YXR1cyAmIE1ESU9fQU5fQ0w3M19PUl8zN19DT01QTEVURSkgewotCQkJaWYgKCEodmFycy0+cGh5X2ZsYWdzICYKLQkJCSAgICAgIFBIWV9TR01JSV9GTEFHKSkKLQkJCQlibngyeF9zZXRfZ21paV90eF9kcml2ZXIocGFyYW1zKTsKLQkJfQotCX0KLQotCS8qIFBCRiAtIGxpbmsgdXAgKi8KLQlyYyB8PSBibngyeF9wYmZfdXBkYXRlKHBhcmFtcywgdmFycy0+Zmxvd19jdHJsLAotCQkJICAgICAgdmFycy0+bGluZV9zcGVlZCk7Ci0KLQkvKiBkaXNhYmxlIGRyYWluICovCi0JUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArIHBvcnQqNCwgMCk7Ci0KLQkvKiB1cGRhdGUgc2hhcmVkIG1lbW9yeSAqLwotCWJueDJ4X3VwZGF0ZV9tbmcocGFyYW1zLCB2YXJzLT5saW5rX3N0YXR1cyk7Ci0JbXNsZWVwKDIwKTsKLQlyZXR1cm4gcmM7Ci19Ci0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjYWxsZWQgdXBvbiBsaW5rIGludGVycnVwdCAqLwotLyogSW4gY2FzZSB2YXJzLT5saW5rX3VwLCBkcml2ZXIgbmVlZHMgdG8KLQkxLiBVcGRhdGUgdGhlIHBiZgotCTIuIERpc2FibGUgZHJhaW4KLQkzLiBVcGRhdGUgdGhlIHNoYXJlZCBtZW1vcnkKLQk0LiBJbmRpY2F0ZSBsaW5rIHVwCi0JNS4gU2V0IExFRHMKLSAgIE90aGVyd2lzZSwKLQkxLiBVcGRhdGUgc2hhcmVkIG1lbW9yeQotCTIuIFJlc2V0IEJpZ01hYwotCTMuIFJlcG9ydCBsaW5rIGRvd24KLQk0LiBVbnNldCBMRURzCi0qLwotdTggYm54MnhfbGlua191cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1MTYgZ3Bfc3RhdHVzOwotCXU4IGxpbmtfMTBnOwotCXU4IGV4dF9waHlfbGlua191cCwgcmMgPSAwOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0JdTggaXNfbWlfaW50ID0gMDsKLQotCURQKE5FVElGX01TR19MSU5LLCAicG9ydCAleCwgWEdYUz8leCwgaW50X3N0YXR1cyAweCV4XG4iLAotCQkgcG9ydCwgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpLAotCQkgUkVHX1JEKGJwLCBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQpKTsKLQotCWlzX21pX2ludCA9ICh1OCkoUkVHX1JEKGJwLCBOSUdfUkVHX0VNQUMwX1NUQVRVU19NSVNDX01JX0lOVCArCi0JCQkJICAgIHBvcnQqMHgxOCkgPiAwKTsKLQlEUChORVRJRl9NU0dfTElOSywgImludF9tYXNrIDB4JXggTUlfSU5UICV4LCBTRVJERVNfTElOSyAleFxuIiwKLQkJIFJFR19SRChicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCksCi0JCSBpc19taV9pbnQsCi0JCSBSRUdfUkQoYnAsCi0JCQkgICAgTklHX1JFR19TRVJERVMwX1NUQVRVU19MSU5LX1NUQVRVUyArIHBvcnQqMHgzYykpOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICIgMTBHICV4LCBYR1hTX0xJTksgJXhcbiIsCi0JICBSRUdfUkQoYnAsIE5JR19SRUdfWEdYUzBfU1RBVFVTX0xJTksxMEcgKyBwb3J0KjB4NjgpLAotCSAgUkVHX1JEKGJwLCBOSUdfUkVHX1hHWFMwX1NUQVRVU19MSU5LX1NUQVRVUyArIHBvcnQqMHg2OCkpOwotCi0JLyogZGlzYWJsZSBlbWFjICovCi0JUkVHX1dSKGJwLCBOSUdfUkVHX05JR19FTUFDMF9FTiArIHBvcnQqNCwgMCk7Ci0KLQlleHRfcGh5X3R5cGUgPSBYR1hTX0VYVF9QSFlfVFlQRShwYXJhbXMtPmV4dF9waHlfY29uZmlnKTsKLQotCS8qIENoZWNrIGV4dGVybmFsIGxpbmsgY2hhbmdlIG9ubHkgZm9yIG5vbi1kaXJlY3QgKi8KLQlleHRfcGh5X2xpbmtfdXAgPSBibngyeF9leHRfcGh5X2lzX2xpbmtfdXAocGFyYW1zLCB2YXJzLCBpc19taV9pbnQpOwotCi0JLyogUmVhZCBncF9zdGF0dXMgKi8KLQlDTDQ1X1JEX09WRVJfQ0wyMihicCwgcG9ydCwgcGFyYW1zLT5waHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUkVHX0JBTktfR1BfU1RBVFVTLAotCQkJICAgICAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzEsCi0JCQkgICAgICAmZ3Bfc3RhdHVzKTsKLQotCXJjID0gYm54MnhfbGlua19zZXR0aW5nc19zdGF0dXMocGFyYW1zLCB2YXJzLCBncF9zdGF0dXMsCi0JCQkJICAgICAgZXh0X3BoeV9saW5rX3VwKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JLyogYW55dGhpbmcgMTAgYW5kIG92ZXIgdXNlcyB0aGUgYm1hYyAqLwotCWxpbmtfMTBnID0gKCh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMDAwKSB8fAotCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTIwMDApIHx8Ci0JCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMjUwMCkgfHwKLQkJICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEzMDAwKSB8fAotCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTUwMDApIHx8Ci0JCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xNjAwMCkpOwotCi0JYm54MnhfbGlua19pbnRfYWNrKHBhcmFtcywgdmFycywgbGlua18xMGcsIGlzX21pX2ludCk7Ci0KLQkvKiBJbiBjYXNlIGV4dGVybmFsIHBoeSBsaW5rIGlzIHVwLCBhbmQgaW50ZXJuYWwgbGluayBpcyBkb3duCi0JKCBub3QgaW5pdGlhbGl6ZWQgeWV0IHByb2JhYmx5IGFmdGVyIGxpbmsgaW5pdGlhbGl6YXRpb24sIGl0IG5lZWRzCi0JdG8gYmUgaW5pdGlhbGl6ZWQuCi0JTm90ZSB0aGF0IGFmdGVyIGxpbmsgZG93bi11cCBhcyByZXN1bHQgb2YgY2FibGUgcGx1ZywKLQl0aGUgeGd4cyBsaW5rIHdvdWxkIHByb2JhYmx5IGJlY29tZSB1cCBhZ2FpbiB3aXRob3V0IHRoZSBuZWVkIHRvCi0JaW5pdGlhbGl6ZSBpdCovCi0KLQlpZiAoKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgJiYKLQkgICAgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1KSAmJgotCSAgICAoZXh0X3BoeV90eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDYpICYmCi0JICAgIChleHRfcGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNikgJiYKLQkgICAgKGV4dF9waHlfbGlua191cCAmJiAhdmFycy0+cGh5X2xpbmtfdXApKQotCQlibngyeF9pbml0X2ludGVybmFsX3BoeShwYXJhbXMsIHZhcnMsIDApOwotCi0JLyogbGluayBpcyB1cCBvbmx5IGlmIGJvdGggbG9jYWwgcGh5IGFuZCBleHRlcm5hbCBwaHkgYXJlIHVwICovCi0JdmFycy0+bGlua191cCA9IChleHRfcGh5X2xpbmtfdXAgJiYgdmFycy0+cGh5X2xpbmtfdXApOwotCi0JaWYgKHZhcnMtPmxpbmtfdXApCi0JCXJjID0gYm54MnhfdXBkYXRlX2xpbmtfdXAocGFyYW1zLCB2YXJzLCBsaW5rXzEwZywgZ3Bfc3RhdHVzKTsKLQllbHNlCi0JCXJjID0gYm54MnhfdXBkYXRlX2xpbmtfZG93bihwYXJhbXMsIHZhcnMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdTggYm54MnhfODA3M19jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2UpCi17Ci0JdTggZXh0X3BoeV9hZGRyW1BPUlRfTUFYXTsKLQl1MTYgdmFsOwotCXM4IHBvcnQ7Ci0KLQkvKiBQQVJUMSAtIFJlc2V0IGJvdGggcGh5cyAqLwotCWZvciAocG9ydCA9IFBPUlRfTUFYIC0gMTsgcG9ydCA+PSBQT1JUXzA7IHBvcnQtLSkgewotCQkvKiBFeHRyYWN0IHRoZSBleHQgcGh5IGFkZHJlc3MgZm9yIHRoZSBwb3J0ICovCi0JCXUzMiBleHRfcGh5X2NvbmZpZyA9IFJFR19SRChicCwgc2htZW1fYmFzZSArCi0JCQkJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCi0JCSAgIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmV4dGVybmFsX3BoeV9jb25maWcpKTsKLQotCQkvKiBkaXNhYmxlIGF0dGVudGlvbnMgKi8KLQkJYm54MnhfYml0c19kaXMoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCi0JCQkgICAgIChOSUdfTUFTS19YR1hTMF9MSU5LX1NUQVRVUyB8Ci0JCQkgICAgICBOSUdfTUFTS19YR1hTMF9MSU5LMTBHIHwKLQkJCSAgICAgIE5JR19NQVNLX1NFUkRFUzBfTElOS19TVEFUVVMgfAotCQkJICAgICAgTklHX01BU0tfTUlfSU5UKSk7Ci0KLQkJZXh0X3BoeV9hZGRyW3BvcnRdID0gWEdYU19FWFRfUEhZX0FERFIoZXh0X3BoeV9jb25maWcpOwotCi0JCS8qIE5lZWQgdG8gdGFrZSB0aGUgcGh5IG91dCBvZiBsb3cgcG93ZXIgbW9kZSBpbiBvcmRlcgotCQkJdG8gd3JpdGUgdG8gYWNjZXNzIGl0cyByZWdpc3RlcnMgKi8KLQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMiwKLQkJCQkgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsIHBvcnQpOwotCi0JCS8qIFJlc2V0IHRoZSBwaHkgKi8KLQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkJICAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKLQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgICBNRElPX1BNQV9SRUdfQ1RSTCwKLQkJCSAgICAgICAxPDwxNSk7Ci0JfQotCi0JLyogQWRkIGRlbGF5IG9mIDE1MG1zIGFmdGVyIHJlc2V0ICovCi0JbXNsZWVwKDE1MCk7Ci0KLQkvKiBQQVJUMiAtIERvd25sb2FkIGZpcm13YXJlIHRvIGJvdGggcGh5cyAqLwotCWZvciAocG9ydCA9IFBPUlRfTUFYIC0gMTsgcG9ydCA+PSBQT1JUXzA7IHBvcnQtLSkgewotCQl1MTYgZndfdmVyMTsKLQotCQlibngyeF9iY204MDczX2V4dGVybmFsX3JvbV9ib290KGJwLCBwb3J0LAotCQkJCQkgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sIHNobWVtX2Jhc2UpOwotCi0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKLQkJCSAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHX1JPTV9WRVIxLCAmZndfdmVyMSk7Ci0JCWlmIChmd192ZXIxID09IDAgfHwgZndfdmVyMSA9PSAweDQzMjEpIHsKLQkJCURQKE5FVElGX01TR19MSU5LLAotCQkJCSAiYm54MnhfODA3M19jb21tb25faW5pdF9waHkgcG9ydCAleDoiCi0JCQkJICJEb3dubG9hZCBmYWlsZWQuIGZ3IHZlcnNpb24gPSAweCV4XG4iLAotCQkJCSBwb3J0LCBmd192ZXIxKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogT25seSBzZXQgYml0IDEwID0gMSAoVHggcG93ZXIgZG93bikgKi8KLQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkJICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKLQkJCSAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHX1RYX1BPV0VSX0RPV04sICZ2YWwpOwotCi0JCS8qIFBoYXNlMSBvZiBUWF9QT1dFUl9ET1dOIHJlc2V0ICovCi0JCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBvcnQsCi0JCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKLQkJCSAgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCi0JCQkgICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICAgTURJT19QTUFfUkVHX1RYX1BPV0VSX0RPV04sCi0JCQkgICAgICAgKHZhbCB8IDE8PDEwKSk7Ci0JfQotCi0JLyogVG9nZ2xlIFRyYW5zbWl0dGVyOiBQb3dlciBkb3duIGFuZCB0aGVuIHVwIHdpdGggNjAwbXMKLQkgICBkZWxheSBiZXR3ZWVuICovCi0JbXNsZWVwKDYwMCk7Ci0KLQkvKiBQQVJUMyAtIGNvbXBsZXRlIFRYX1BPV0VSX0RPV04gcHJvY2VzcywgYW5kIHNldCBHUElPMiBiYWNrIHRvIGxvdyAqLwotCWZvciAocG9ydCA9IFBPUlRfTUFYIC0gMTsgcG9ydCA+PSBQT1JUXzA7IHBvcnQtLSkgewotCQkvKiBQaGFzZTIgb2YgUE9XRVJfRE9XTl9SRVNFVCAqLwotCQkvKiBSZWxlYXNlIGJpdCAxMCAoUmVsZWFzZSBUeCBwb3dlciBkb3duKSAqLwotCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCi0JCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkJICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLAotCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICBNRElPX1BNQV9SRUdfVFhfUE9XRVJfRE9XTiwgJnZhbCk7Ci0KLQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkJICAgICAgIGV4dF9waHlfYWRkcltwb3J0XSwKLQkJCSAgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgICBNRElPX1BNQV9SRUdfVFhfUE9XRVJfRE9XTiwgKHZhbCAmICh+KDE8PDEwKSkpKTsKLQkJbXNsZWVwKDE1KTsKLQotCQkvKiBSZWFkIG1vZGlmeSB3cml0ZSB0aGUgU1BJLVJPTSB2ZXJzaW9uIHNlbGVjdCByZWdpc3RlciAqLwotCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsCi0JCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczLAotCQkJICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLAotCQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCQkgICAgICBNRElPX1BNQV9SRUdfRURDX0ZGRV9NQUlOLCAmdmFsKTsKLQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzMsCi0JCQkgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCi0JCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgIE1ESU9fUE1BX1JFR19FRENfRkZFX01BSU4sICh2YWwgfCAoMTw8MTIpKSk7Ci0KLQkJLyogc2V0IEdQSU8yIGJhY2sgdG8gTE9XICovCi0JCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzIsCi0JCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1csIHBvcnQpOwotCX0KLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdTggYm54MnhfODcyN19jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2UpCi17Ci0JdTggZXh0X3BoeV9hZGRyW1BPUlRfTUFYXTsKLQlzOCBwb3J0LCBmaXJzdF9wb3J0LCBpOwotCXUzMiBzd2FwX3ZhbCwgc3dhcF9vdmVycmlkZTsKLQlEUChORVRJRl9NU0dfTElOSywgIkV4ZWN1dGluZyBCQ004NzI3IGNvbW1vbiBpbml0XG4iKTsKLQlzd2FwX3ZhbCA9IFJFR19SRChicCwgIE5JR19SRUdfUE9SVF9TV0FQKTsKLQlzd2FwX292ZXJyaWRlID0gUkVHX1JEKGJwLCAgTklHX1JFR19TVFJBUF9PVkVSUklERSk7Ci0KLQlibngyeF9leHRfcGh5X2h3X3Jlc2V0KGJwLCAxIF4gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpKTsKLQltc2xlZXAoNSk7Ci0KLQlpZiAoc3dhcF92YWwgJiYgc3dhcF9vdmVycmlkZSkKLQkJZmlyc3RfcG9ydCA9IFBPUlRfMDsKLQllbHNlCi0JCWZpcnN0X3BvcnQgPSBQT1JUXzE7Ci0KLQkvKiBQQVJUMSAtIFJlc2V0IGJvdGggcGh5cyAqLwotCWZvciAoaSA9IDAsIHBvcnQgPSBmaXJzdF9wb3J0OyBpIDwgUE9SVF9NQVg7IGkrKywgcG9ydCA9ICFwb3J0KSB7Ci0JCS8qIEV4dHJhY3QgdGhlIGV4dCBwaHkgYWRkcmVzcyBmb3IgdGhlIHBvcnQgKi8KLQkJdTMyIGV4dF9waHlfY29uZmlnID0gUkVHX1JEKGJwLCBzaG1lbV9iYXNlICsKLQkJCQkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKLQkJICAgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uZXh0ZXJuYWxfcGh5X2NvbmZpZykpOwotCi0JCS8qIGRpc2FibGUgYXR0ZW50aW9ucyAqLwotCQlibngyeF9iaXRzX2RpcyhicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwKLQkJCSAgICAgKE5JR19NQVNLX1hHWFMwX0xJTktfU1RBVFVTIHwKLQkJCSAgICAgIE5JR19NQVNLX1hHWFMwX0xJTksxMEcgfAotCQkJICAgICAgTklHX01BU0tfU0VSREVTMF9MSU5LX1NUQVRVUyB8Ci0JCQkgICAgICBOSUdfTUFTS19NSV9JTlQpKTsKLQotCQlleHRfcGh5X2FkZHJbcG9ydF0gPSBYR1hTX0VYVF9QSFlfQUREUihleHRfcGh5X2NvbmZpZyk7Ci0KLQkJLyogUmVzZXQgdGhlIHBoeSAqLwotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwb3J0LAotCQkJICAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCi0JCQkgICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLAotCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgIE1ESU9fUE1BX1JFR19DVFJMLAotCQkJICAgICAgIDE8PDE1KTsKLQl9Ci0KLQkvKiBBZGQgZGVsYXkgb2YgMTUwbXMgYWZ0ZXIgcmVzZXQgKi8KLQltc2xlZXAoMTUwKTsKLQotCS8qIFBBUlQyIC0gRG93bmxvYWQgZmlybXdhcmUgdG8gYm90aCBwaHlzICovCi0JZm9yIChpID0gMCwgcG9ydCA9IGZpcnN0X3BvcnQ7IGkgPCBQT1JUX01BWDsgaSsrLCBwb3J0ID0gIXBvcnQpIHsKLQkJdTE2IGZ3X3ZlcjE7Ci0KLQkJYm54MnhfYmNtODcyN19leHRlcm5hbF9yb21fYm9vdChicCwgcG9ydCwKLQkJCQkJICAgICAgZXh0X3BoeV9hZGRyW3BvcnRdLCBzaG1lbV9iYXNlKTsKLQotCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBvcnQsIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcsCi0JCQkgICAgICBleHRfcGh5X2FkZHJbcG9ydF0sCi0JCQkgICAgICBNRElPX1BNQV9ERVZBRCwKLQkJCSAgICAgIE1ESU9fUE1BX1JFR19ST01fVkVSMSwgJmZ3X3ZlcjEpOwotCQlpZiAoZndfdmVyMSA9PSAwIHx8IGZ3X3ZlcjEgPT0gMHg0MzIxKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkgImJueDJ4Xzg3MjdfY29tbW9uX2luaXRfcGh5IHBvcnQgJXg6IgotCQkJCSAiRG93bmxvYWQgZmFpbGVkLiBmdyB2ZXJzaW9uID0gMHgleFxuIiwKLQkJCQkgcG9ydCwgZndfdmVyMSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB1OCBibngyeF84NzI2X2NvbW1vbl9pbml0X3BoeShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgc2htZW1fYmFzZSkKLXsKLQl1OCBleHRfcGh5X2FkZHI7Ci0JdTMyIHZhbDsKLQlzOCBwb3J0OwotCi0JLyogVXNlIHBvcnQxIGJlY2F1c2Ugb2YgdGhlIHN0YXRpYyBwb3J0LXN3YXAgKi8KLQkvKiBFbmFibGUgdGhlIG1vZHVsZSBkZXRlY3Rpb24gaW50ZXJydXB0ICovCi0JdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19HUElPX0VWRU5UX0VOKTsKLQl2YWwgfD0gKCgxPDxNSVNDX1JFR0lTVEVSU19HUElPXzMpfAotCQkoMTw8KE1JU0NfUkVHSVNURVJTX0dQSU9fMyArIE1JU0NfUkVHSVNURVJTX0dQSU9fUE9SVF9TSElGVCkpKTsKLQlSRUdfV1IoYnAsIE1JU0NfUkVHX0dQSU9fRVZFTlRfRU4sIHZhbCk7Ci0KLQlibngyeF9leHRfcGh5X2h3X3Jlc2V0KGJwLCAxKTsKLQltc2xlZXAoNSk7Ci0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IFBPUlRfTUFYOyBwb3J0KyspIHsKLQkJLyogRXh0cmFjdCB0aGUgZXh0IHBoeSBhZGRyZXNzIGZvciB0aGUgcG9ydCAqLwotCQl1MzIgZXh0X3BoeV9jb25maWcgPSBSRUdfUkQoYnAsIHNobWVtX2Jhc2UgKwotCQkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAotCQkJZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uZXh0ZXJuYWxfcGh5X2NvbmZpZykpOwotCi0JCWV4dF9waHlfYWRkciA9IFhHWFNfRVhUX1BIWV9BRERSKGV4dF9waHlfY29uZmlnKTsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzI2X2NvbW1vbl9pbml0IDogZXh0X3BoeV9hZGRyID0gMHgleFxuIiwKLQkJCSBleHRfcGh5X2FkZHIpOwotCi0JCWJueDJ4Xzg3MjZfcmVzZXRfcGh5KGJwLCBwb3J0LCBleHRfcGh5X2FkZHIpOwotCi0JCS8qIFNldCBmYXVsdCBtb2R1bGUgZGV0ZWN0ZWQgTEVEIG9uICovCi0JCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzAsCi0JCQkJICBNSVNDX1JFR0lTVEVSU19HUElPX0hJR0gsCi0JCQkJICBwb3J0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdTggYm54MnhfODQ4MjNfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlKQotewotCS8qIEhXIHJlc2V0ICovCi0JYm54MnhfZXh0X3BoeV9od19yZXNldChicCwgMSk7Ci0JcmV0dXJuIDA7Ci19Ci11OCBibngyeF9jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2UpCi17Ci0JdTggcmMgPSAwOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgIkJlZ2luIGNvbW1vbiBwaHkgaW5pdFxuIik7Ci0KLQkvKiBSZWFkIHRoZSBleHRfcGh5X3R5cGUgZm9yIGFyYml0cmFyeSBwb3J0KDApICovCi0JZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUoCi0JCQlSRUdfUkQoYnAsIHNobWVtX2Jhc2UgKwotCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKLQkJCSAgICAgZGV2X2luZm8ucG9ydF9od19jb25maWdbMF0uZXh0ZXJuYWxfcGh5X2NvbmZpZykpKTsKLQotCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczOgotCXsKLQkJcmMgPSBibngyeF84MDczX2NvbW1vbl9pbml0X3BoeShicCwgc2htZW1fYmFzZSk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNzoKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjdfTk9DOgotCQlyYyA9IGJueDJ4Xzg3MjdfY29tbW9uX2luaXRfcGh5KGJwLCBzaG1lbV9iYXNlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6Ci0JCS8qIEdQSU8xIGFmZmVjdHMgYm90aCBwb3J0cywgc28gdGhlcmUncyBuZWVkIHRvIHB1bGwKLQkJaXQgZm9yIHNpbmdsZSBwb3J0IGFsb25lICovCi0JCXJjID0gYm54MnhfODcyNl9jb21tb25faW5pdF9waHkoYnAsIHNobWVtX2Jhc2UpOwotCQlicmVhazsKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODIzOgotCQlyYyA9IGJueDJ4Xzg0ODIzX2NvbW1vbl9pbml0X3BoeShicCwgc2htZW1fYmFzZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURQKE5FVElGX01TR19MSU5LLAotCQkJICJibngyeF9jb21tb25faW5pdF9waHk6IGV4dF9waHkgMHgleCBub3QgcmVxdWlyZWRcbiIsCi0JCQkgZXh0X3BoeV90eXBlKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIGJueDJ4X3NmeDcxMDFfc3Bfc3dfcmVzZXQoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwgdTggcGh5X2FkZHIpCi17Ci0JdTE2IHZhbCwgY250OwotCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwb3J0LAotCQkgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxLAotCQkgICAgICBwaHlfYWRkciwKLQkJICAgICAgTURJT19QTUFfREVWQUQsCi0JCSAgICAgIE1ESU9fUE1BX1JFR183MTAxX1JFU0VULCAmdmFsKTsKLQotCWZvciAoY250ID0gMDsgY250IDwgMTA7IGNudCsrKSB7Ci0JCW1zbGVlcCg1MCk7Ci0JCS8qIFdyaXRlcyBhIHNlbGYtY2xlYXJpbmcgcmVzZXQgKi8KLQkJYm54MnhfY2w0NV93cml0ZShicCwgcG9ydCwKLQkJCSAgICAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxLAotCQkJICAgICAgIHBoeV9hZGRyLAotCQkJICAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgIE1ESU9fUE1BX1JFR183MTAxX1JFU0VULAotCQkJICAgICAgICh2YWwgfCAoMTw8MTUpKSk7Ci0JCS8qIFdhaXQgZm9yIGNsZWFyICovCi0JCWJueDJ4X2NsNDVfcmVhZChicCwgcG9ydCwKLQkJCSAgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDEsCi0JCQkgICAgICBwaHlfYWRkciwKLQkJCSAgICAgIE1ESU9fUE1BX0RFVkFELAotCQkJICAgICAgTURJT19QTUFfUkVHXzcxMDFfUkVTRVQsICZ2YWwpOwotCi0JCWlmICgodmFsICYgKDE8PDE1KSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYyBiL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmZjViMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9ibngyeF9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkxNiArMCwwIEBACi0vKiBibngyeF9tYWluLmM6IEJyb2FkY29tIEV2ZXJlc3QgbmV0d29yayBkcml2ZXIuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTWFpbnRhaW5lZCBieTogRWlsb24gR3JlZW5zdGVpbiA8ZWlsb25nQGJyb2FkY29tLmNvbT4KLSAqIFdyaXR0ZW4gYnk6IEVsaWV6ZXIgVGFtaXIKLSAqIEJhc2VkIG9uIGNvZGUgZnJvbSBNaWNoYWVsIENoYW4ncyBibngyIGRyaXZlcgotICogVURQIENTVU0gZXJyYXRhIHdvcmthcm91bmQgYnkgQXJpayBHZW5kZWxtYW4KLSAqIFNsb3dwYXRoIGFuZCBmYXN0cGF0aCByZXdvcmsgYnkgVmxhZGlzbGF2IFpvbG90YXJvdgotICogU3RhdGlzdGljcyBhbmQgTGluayBtYW5hZ2VtZW50IGJ5IFlpdGNoYWsgR2VydG5lcgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4gIC8qIGZvciBkZXZfaW5mbygpICovCi0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L21paS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KLSNpbmNsdWRlIDxsaW51eC96bGliLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KLQotCi0jaW5jbHVkZSAiYm54MnguaCIKLSNpbmNsdWRlICJibngyeF9pbml0LmgiCi0jaW5jbHVkZSAiYm54MnhfaW5pdF9vcHMuaCIKLSNpbmNsdWRlICJibngyeF9kdW1wLmgiCi0KLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjUyLjUzLTEiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiMjAxMC8xOC8wNCIKLSNkZWZpbmUgQk5YMlhfQkNfVkVSCQkweDA0MDIwMAotCi0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlICJibngyeF9md19maWxlX2hkci5oIgotLyogRlcgZmlsZXMgKi8KLSNkZWZpbmUgRldfRklMRV9WRVJTSU9OCQkJCQlcCi0JX19zdHJpbmdpZnkoQkNNXzU3MTBfRldfTUFKT1JfVkVSU0lPTikgIi4iCVwKLQlfX3N0cmluZ2lmeShCQ01fNTcxMF9GV19NSU5PUl9WRVJTSU9OKSAiLiIJXAotCV9fc3RyaW5naWZ5KEJDTV81NzEwX0ZXX1JFVklTSU9OX1ZFUlNJT04pICIuIglcCi0JX19zdHJpbmdpZnkoQkNNXzU3MTBfRldfRU5HSU5FRVJJTkdfVkVSU0lPTikKLSNkZWZpbmUgRldfRklMRV9OQU1FX0UxCQkiYm54MngtZTEtIiBGV19GSUxFX1ZFUlNJT04gIi5mdyIKLSNkZWZpbmUgRldfRklMRV9OQU1FX0UxSAkiYm54MngtZTFoLSIgRldfRklMRV9WRVJTSU9OICIuZnciCi0KLS8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZyAqLwotI2RlZmluZSBUWF9USU1FT1VUCQkoNSpIWikKLQotc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQotCSJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgNTc3MXggMTBHaWdhYml0IEV0aGVybmV0IERyaXZlciAiCi0JRFJWX01PRFVMRV9OQU1FICIgIiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7Ci0KLU1PRFVMRV9BVVRIT1IoIkVsaWV6ZXIgVGFtaXIiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzEwLzU3NzExLzU3NzExRSBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7Ci1NT0RVTEVfRklSTVdBUkUoRldfRklMRV9OQU1FX0UxKTsKLU1PRFVMRV9GSVJNV0FSRShGV19GSUxFX05BTUVfRTFIKTsKLQotc3RhdGljIGludCBtdWx0aV9tb2RlID0gMTsKLW1vZHVsZV9wYXJhbShtdWx0aV9tb2RlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtdWx0aV9tb2RlLCAiIE11bHRpIHF1ZXVlIG1vZGUgIgotCQkJICAgICAiKDAgRGlzYWJsZTsgMSBFbmFibGUgKGRlZmF1bHQpKSIpOwotCi1zdGF0aWMgaW50IG51bV9xdWV1ZXM7Ci1tb2R1bGVfcGFyYW0obnVtX3F1ZXVlcywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobnVtX3F1ZXVlcywgIiBOdW1iZXIgb2YgcXVldWVzIGZvciBtdWx0aV9tb2RlPTEiCi0JCQkJIiAoZGVmYXVsdCBpcyBhcyBhIG51bWJlciBvZiBDUFVzKSIpOwotCi1zdGF0aWMgaW50IGRpc2FibGVfdHBhOwotbW9kdWxlX3BhcmFtKGRpc2FibGVfdHBhLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX3RwYSwgIiBEaXNhYmxlIHRoZSBUUEEgKExSTykgZmVhdHVyZSIpOwotCi1zdGF0aWMgaW50IGludF9tb2RlOwotbW9kdWxlX3BhcmFtKGludF9tb2RlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpbnRfbW9kZSwgIiBGb3JjZSBpbnRlcnJ1cHQgbW9kZSBvdGhlciB0aGVuIE1TSS1YICIKLQkJCQkiKDEgSU5UI3g7IDIgTVNJKSIpOwotCi1zdGF0aWMgaW50IGRyb3BsZXNzX2ZjOwotbW9kdWxlX3BhcmFtKGRyb3BsZXNzX2ZjLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkcm9wbGVzc19mYywgIiBQYXVzZSBvbiBleGhhdXN0ZWQgaG9zdCByaW5nIik7Ci0KLXN0YXRpYyBpbnQgcG9sbDsKLW1vZHVsZV9wYXJhbShwb2xsLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhwb2xsLCAiIFVzZSBwb2xsaW5nIChmb3IgZGVidWcpIik7Ci0KLXN0YXRpYyBpbnQgbXJycyA9IC0xOwotbW9kdWxlX3BhcmFtKG1ycnMsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1ycnMsICIgRm9yY2UgTWF4IFJlYWQgUmVxIFNpemUgKDAuLjMpIChmb3IgZGVidWcpIik7Ci0KLXN0YXRpYyBpbnQgZGVidWc7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiIERlZmF1bHQgZGVidWcgbXNnbGV2ZWwiKTsKLQotc3RhdGljIGludCBsb2FkX2NvdW50WzNdOyAvKiAwLWNvbW1vbiwgMS1wb3J0MCwgMi1wb3J0MSAqLwotCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJueDJ4X3dxOwotCi1lbnVtIGJueDJ4X2JvYXJkX3R5cGUgewotCUJDTTU3NzEwID0gMCwKLQlCQ001NzcxMSA9IDEsCi0JQkNNNTc3MTFFID0gMiwKLX07Ci0KLS8qIGluZGV4ZWQgYnkgYm9hcmRfdHlwZSwgYWJvdmUgKi8KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci19IGJvYXJkX2luZm9bXSBfX2RldmluaXRkYXRhID0gewotCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzcxMCBYR2IiIH0sCi0JeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzExIFhHYiIgfSwKLQl7ICJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTc3MTFFIFhHYiIgfQotfTsKLQotCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoYm54MnhfcGNpX3RibCkgPSB7Ci0JeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc3MTApLCBCQ001NzcxMCB9LAotCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfTlgyXzU3NzExKSwgQkNNNTc3MTEgfSwKLQl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzcxMUUpLCBCQ001NzcxMUUgfSwKLQl7IDAgfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJueDJ4X3BjaV90YmwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiB1c2VkIG9ubHkgYXQgaW5pdAotICogbG9ja2luZyBpcyBkb25lIGJ5IG1jcAotICovCi12b2lkIGJueDJ4X3JlZ193cl9pbmQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIHUzMiB2YWwpCi17Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19BRERSRVNTLCBhZGRyKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0RBVEEsIHZhbCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19BRERSRVNTLAotCQkJICAgICAgIFBDSUNGR19WRU5ET1JfSURfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHUzMiBibngyeF9yZWdfcmRfaW5kKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhZGRyKQotewotCXUzMiB2YWw7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FERFJFU1MsIGFkZHIpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicC0+cGRldiwgUENJQ0ZHX0dSQ19EQVRBLCAmdmFsKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FERFJFU1MsCi0JCQkgICAgICAgUENJQ0ZHX1ZFTkRPUl9JRF9PRkZTRVQpOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGNvbnN0IHUzMiBkbWFlX3JlZ19nb19jW10gPSB7Ci0JRE1BRV9SRUdfR09fQzAsIERNQUVfUkVHX0dPX0MxLCBETUFFX1JFR19HT19DMiwgRE1BRV9SRUdfR09fQzMsCi0JRE1BRV9SRUdfR09fQzQsIERNQUVfUkVHX0dPX0M1LCBETUFFX1JFR19HT19DNiwgRE1BRV9SRUdfR09fQzcsCi0JRE1BRV9SRUdfR09fQzgsIERNQUVfUkVHX0dPX0M5LCBETUFFX1JFR19HT19DMTAsIERNQUVfUkVHX0dPX0MxMSwKLQlETUFFX1JFR19HT19DMTIsIERNQUVfUkVHX0dPX0MxMywgRE1BRV9SRUdfR09fQzE0LCBETUFFX1JFR19HT19DMTUKLX07Ci0KLS8qIGNvcHkgY29tbWFuZCBpbnRvIERNQUUgY29tbWFuZCBtZW1vcnkgYW5kIHNldCBETUFFIGNvbW1hbmQgZ28gKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3Bvc3RfZG1hZShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgZG1hZV9jb21tYW5kICpkbWFlLAotCQkJICAgIGludCBpZHgpCi17Ci0JdTMyIGNtZF9vZmZzZXQ7Ci0JaW50IGk7Ci0KLQljbWRfb2Zmc2V0ID0gKERNQUVfUkVHX0NNRF9NRU0gKyBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkgKiBpZHgpOwotCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpLzQpOyBpKyspIHsKLQkJUkVHX1dSKGJwLCBjbWRfb2Zmc2V0ICsgaSo0LCAqKCgodTMyICopZG1hZSkgKyBpKSk7Ci0KLQkJRFAoQk5YMlhfTVNHX09GRiwgIkRNQUUgY21kWyVkXS4lZCAoMHglMDh4KSA6IDB4JTA4eFxuIiwKLQkJICAgaWR4LCBpLCBjbWRfb2Zmc2V0ICsgaSo0LCAqKCgodTMyICopZG1hZSkgKyBpKSk7Ci0JfQotCVJFR19XUihicCwgZG1hZV9yZWdfZ29fY1tpZHhdLCAxKTsKLX0KLQotdm9pZCBibngyeF93cml0ZV9kbWFlKHN0cnVjdCBibngyeCAqYnAsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHUzMiBkc3RfYWRkciwKLQkJICAgICAgdTMyIGxlbjMyKQotewotCXN0cnVjdCBkbWFlX2NvbW1hbmQgZG1hZTsKLQl1MzIgKndiX2NvbXAgPSBibngyeF9zcChicCwgd2JfY29tcCk7Ci0JaW50IGNudCA9IDIwMDsKLQotCWlmICghYnAtPmRtYWVfcmVhZHkpIHsKLQkJdTMyICpkYXRhID0gYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOwotCi0JCURQKEJOWDJYX01TR19PRkYsICJETUFFIGlzIG5vdCByZWFkeSAoZHN0X2FkZHIgJTA4eCAgbGVuMzIgJWQpIgotCQkgICAiICB1c2luZyBpbmRpcmVjdFxuIiwgZHN0X2FkZHIsIGxlbjMyKTsKLQkJYm54MnhfaW5pdF9pbmRfd3IoYnAsIGRzdF9hZGRyLCBkYXRhLCBsZW4zMik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1zZXQoJmRtYWUsIDAsIHNpemVvZihzdHJ1Y3QgZG1hZV9jb21tYW5kKSk7Ci0KLQlkbWFlLm9wY29kZSA9IChETUFFX0NNRF9TUkNfUENJIHwgRE1BRV9DTURfRFNUX0dSQyB8Ci0JCSAgICAgICBETUFFX0NNRF9DX0RTVF9QQ0kgfCBETUFFX0NNRF9DX0VOQUJMRSB8Ci0JCSAgICAgICBETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAotI2lmZGVmIF9fQklHX0VORElBTgotCQkgICAgICAgRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8Ci0jZWxzZQotCQkgICAgICAgRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAotI2VuZGlmCi0JCSAgICAgICAoQlBfUE9SVChicCkgPyBETUFFX0NNRF9QT1JUXzEgOiBETUFFX0NNRF9QT1JUXzApIHwKLQkJICAgICAgIChCUF9FMUhWTihicCkgPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKLQlkbWFlLnNyY19hZGRyX2xvID0gVTY0X0xPKGRtYV9hZGRyKTsKLQlkbWFlLnNyY19hZGRyX2hpID0gVTY0X0hJKGRtYV9hZGRyKTsKLQlkbWFlLmRzdF9hZGRyX2xvID0gZHN0X2FkZHIgPj4gMjsKLQlkbWFlLmRzdF9hZGRyX2hpID0gMDsKLQlkbWFlLmxlbiA9IGxlbjMyOwotCWRtYWUuY29tcF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHdiX2NvbXApKTsKLQlkbWFlLmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCB3Yl9jb21wKSk7Ci0JZG1hZS5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7Ci0KLQlEUChCTlgyWF9NU0dfT0ZGLCAiRE1BRTogb3Bjb2RlIDB4JTA4eFxuIgotCSAgIERQX0xFVkVMICJzcmNfYWRkciAgWyV4OiUwOHhdICBsZW4gWyVkICo0XSAgIgotCQkgICAgImRzdF9hZGRyIFsleDolMDh4ICglMDh4KV1cbiIKLQkgICBEUF9MRVZFTCAiY29tcF9hZGRyIFsleDolMDh4XSAgY29tcF92YWwgMHglMDh4XG4iLAotCSAgIGRtYWUub3Bjb2RlLCBkbWFlLnNyY19hZGRyX2hpLCBkbWFlLnNyY19hZGRyX2xvLAotCSAgIGRtYWUubGVuLCBkbWFlLmRzdF9hZGRyX2hpLCBkbWFlLmRzdF9hZGRyX2xvLCBkc3RfYWRkciwKLQkgICBkbWFlLmNvbXBfYWRkcl9oaSwgZG1hZS5jb21wX2FkZHJfbG8sIGRtYWUuY29tcF92YWwpOwotCURQKEJOWDJYX01TR19PRkYsICJkYXRhIFsweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhdXG4iLAotCSAgIGJwLT5zbG93cGF0aC0+d2JfZGF0YVswXSwgYnAtPnNsb3dwYXRoLT53Yl9kYXRhWzFdLAotCSAgIGJwLT5zbG93cGF0aC0+d2JfZGF0YVsyXSwgYnAtPnNsb3dwYXRoLT53Yl9kYXRhWzNdKTsKLQotCW11dGV4X2xvY2soJmJwLT5kbWFlX211dGV4KTsKLQotCSp3Yl9jb21wID0gMDsKLQotCWJueDJ4X3Bvc3RfZG1hZShicCwgJmRtYWUsIElOSVRfRE1BRV9DKGJwKSk7Ci0KLQl1ZGVsYXkoNSk7Ci0KLQl3aGlsZSAoKndiX2NvbXAgIT0gRE1BRV9DT01QX1ZBTCkgewotCQlEUChCTlgyWF9NU0dfT0ZGLCAid2JfY29tcCAweCUwOHhcbiIsICp3Yl9jb21wKTsKLQotCQlpZiAoIWNudCkgewotCQkJQk5YMlhfRVJSKCJETUFFIHRpbWVvdXQhXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNudC0tOwotCQkvKiBhZGp1c3QgZGVsYXkgZm9yIGVtdWxhdGlvbi9GUEdBICovCi0JCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJCW1zbGVlcCgxMDApOwotCQllbHNlCi0JCQl1ZGVsYXkoNSk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZicC0+ZG1hZV9tdXRleCk7Ci19Ci0KLXZvaWQgYm54MnhfcmVhZF9kbWFlKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzcmNfYWRkciwgdTMyIGxlbjMyKQotewotCXN0cnVjdCBkbWFlX2NvbW1hbmQgZG1hZTsKLQl1MzIgKndiX2NvbXAgPSBibngyeF9zcChicCwgd2JfY29tcCk7Ci0JaW50IGNudCA9IDIwMDsKLQotCWlmICghYnAtPmRtYWVfcmVhZHkpIHsKLQkJdTMyICpkYXRhID0gYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOwotCQlpbnQgaTsKLQotCQlEUChCTlgyWF9NU0dfT0ZGLCAiRE1BRSBpcyBub3QgcmVhZHkgKHNyY19hZGRyICUwOHggIGxlbjMyICVkKSIKLQkJICAgIiAgdXNpbmcgaW5kaXJlY3RcbiIsIHNyY19hZGRyLCBsZW4zMik7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW4zMjsgaSsrKQotCQkJZGF0YVtpXSA9IGJueDJ4X3JlZ19yZF9pbmQoYnAsIHNyY19hZGRyICsgaSo0KTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldCgmZG1hZSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpKTsKLQotCWRtYWUub3Bjb2RlID0gKERNQUVfQ01EX1NSQ19HUkMgfCBETUFFX0NNRF9EU1RfUENJIHwKLQkJICAgICAgIERNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKLQkJICAgICAgIERNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCSAgICAgICBETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKLSNlbHNlCi0JCSAgICAgICBETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8Ci0jZW5kaWYKLQkJICAgICAgIChCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAotCQkgICAgICAgKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOwotCWRtYWUuc3JjX2FkZHJfbG8gPSBzcmNfYWRkciA+PiAyOwotCWRtYWUuc3JjX2FkZHJfaGkgPSAwOwotCWRtYWUuZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfZGF0YSkpOwotCWRtYWUuZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfZGF0YSkpOwotCWRtYWUubGVuID0gbGVuMzI7Ci0JZG1hZS5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfY29tcCkpOwotCWRtYWUuY29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHdiX2NvbXApKTsKLQlkbWFlLmNvbXBfdmFsID0gRE1BRV9DT01QX1ZBTDsKLQotCURQKEJOWDJYX01TR19PRkYsICJETUFFOiBvcGNvZGUgMHglMDh4XG4iCi0JICAgRFBfTEVWRUwgInNyY19hZGRyICBbJXg6JTA4eF0gIGxlbiBbJWQgKjRdICAiCi0JCSAgICAiZHN0X2FkZHIgWyV4OiUwOHggKCUwOHgpXVxuIgotCSAgIERQX0xFVkVMICJjb21wX2FkZHIgWyV4OiUwOHhdICBjb21wX3ZhbCAweCUwOHhcbiIsCi0JICAgZG1hZS5vcGNvZGUsIGRtYWUuc3JjX2FkZHJfaGksIGRtYWUuc3JjX2FkZHJfbG8sCi0JICAgZG1hZS5sZW4sIGRtYWUuZHN0X2FkZHJfaGksIGRtYWUuZHN0X2FkZHJfbG8sIHNyY19hZGRyLAotCSAgIGRtYWUuY29tcF9hZGRyX2hpLCBkbWFlLmNvbXBfYWRkcl9sbywgZG1hZS5jb21wX3ZhbCk7Ci0KLQltdXRleF9sb2NrKCZicC0+ZG1hZV9tdXRleCk7Ci0KLQltZW1zZXQoYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pLCAwLCBzaXplb2YodTMyKSAqIDQpOwotCSp3Yl9jb21wID0gMDsKLQotCWJueDJ4X3Bvc3RfZG1hZShicCwgJmRtYWUsIElOSVRfRE1BRV9DKGJwKSk7Ci0KLQl1ZGVsYXkoNSk7Ci0KLQl3aGlsZSAoKndiX2NvbXAgIT0gRE1BRV9DT01QX1ZBTCkgewotCi0JCWlmICghY250KSB7Ci0JCQlCTlgyWF9FUlIoIkRNQUUgdGltZW91dCFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY250LS07Ci0JCS8qIGFkanVzdCBkZWxheSBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KLQkJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQotCQkJbXNsZWVwKDEwMCk7Ci0JCWVsc2UKLQkJCXVkZWxheSg1KTsKLQl9Ci0JRFAoQk5YMlhfTVNHX09GRiwgImRhdGEgWzB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eF1cbiIsCi0JICAgYnAtPnNsb3dwYXRoLT53Yl9kYXRhWzBdLCBicC0+c2xvd3BhdGgtPndiX2RhdGFbMV0sCi0JICAgYnAtPnNsb3dwYXRoLT53Yl9kYXRhWzJdLCBicC0+c2xvd3BhdGgtPndiX2RhdGFbM10pOwotCi0JbXV0ZXhfdW5sb2NrKCZicC0+ZG1hZV9tdXRleCk7Ci19Ci0KLXZvaWQgYm54Mnhfd3JpdGVfZG1hZV9waHlzX2xlbihzdHJ1Y3QgYm54MnggKmJwLCBkbWFfYWRkcl90IHBoeXNfYWRkciwKLQkJCSAgICAgICB1MzIgYWRkciwgdTMyIGxlbikKLXsKLQlpbnQgZG1hZV93cl9tYXggPSBETUFFX0xFTjMyX1dSX01BWChicCk7Ci0JaW50IG9mZnNldCA9IDA7Ci0KLQl3aGlsZSAobGVuID4gZG1hZV93cl9tYXgpIHsKLQkJYm54Mnhfd3JpdGVfZG1hZShicCwgcGh5c19hZGRyICsgb2Zmc2V0LAotCQkJCSBhZGRyICsgb2Zmc2V0LCBkbWFlX3dyX21heCk7Ci0JCW9mZnNldCArPSBkbWFlX3dyX21heCAqIDQ7Ci0JCWxlbiAtPSBkbWFlX3dyX21heDsKLQl9Ci0KLQlibngyeF93cml0ZV9kbWFlKGJwLCBwaHlzX2FkZHIgKyBvZmZzZXQsIGFkZHIgKyBvZmZzZXQsIGxlbik7Ci19Ci0KLS8qIHVzZWQgb25seSBmb3Igc2xvd3BhdGggc28gbm90IGlubGluZWQgKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3diX3dyKHN0cnVjdCBibngyeCAqYnAsIGludCByZWcsIHUzMiB2YWxfaGksIHUzMiB2YWxfbG8pCi17Ci0JdTMyIHdiX3dyaXRlWzJdOwotCi0Jd2Jfd3JpdGVbMF0gPSB2YWxfaGk7Ci0Jd2Jfd3JpdGVbMV0gPSB2YWxfbG87Ci0JUkVHX1dSX0RNQUUoYnAsIHJlZywgd2Jfd3JpdGUsIDIpOwotfQotCi0jaWZkZWYgVVNFX1dCX1JECi1zdGF0aWMgdTY0IGJueDJ4X3diX3JkKHN0cnVjdCBibngyeCAqYnAsIGludCByZWcpCi17Ci0JdTMyIHdiX2RhdGFbMl07Ci0KLQlSRUdfUkRfRE1BRShicCwgcmVnLCB3Yl9kYXRhLCAyKTsKLQotCXJldHVybiBISUxPX1U2NCh3Yl9kYXRhWzBdLCB3Yl9kYXRhWzFdKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGJueDJ4X21jX2Fzc2VydChzdHJ1Y3QgYm54MnggKmJwKQotewotCWNoYXIgbGFzdF9pZHg7Ci0JaW50IGksIHJjID0gMDsKLQl1MzIgcm93MCwgcm93MSwgcm93Miwgcm93MzsKLQotCS8qIFhTVE9STSAqLwotCWxhc3RfaWR4ID0gUkVHX1JEOChicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJCSAgIFhTVE9STV9BU1NFUlRfTElTVF9JTkRFWF9PRkZTRVQpOwotCWlmIChsYXN0X2lkeCkKLQkJQk5YMlhfRVJSKCJYU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVggMHgleFxuIiwgbGFzdF9pZHgpOwotCi0JLyogcHJpbnQgdGhlIGFzc2VydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgU1RST01fQVNTRVJUX0FSUkFZX1NJWkU7IGkrKykgewotCi0JCXJvdzAgPSBSRUdfUkQoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArCi0JCQkgICAgICBYU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpKTsKLQkJcm93MSA9IFJFR19SRChicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFhTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyA0KTsKLQkJcm93MiA9IFJFR19SRChicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFhTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyA4KTsKLQkJcm93MyA9IFJFR19SRChicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFhTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyAxMik7Ci0KLQkJaWYgKHJvdzAgIT0gQ09NTU9OX0FTTV9JTlZBTElEX0FTU0VSVF9PUENPREUpIHsKLQkJCUJOWDJYX0VSUigiWFNUT1JNX0FTU0VSVF9JTkRFWCAweCV4ID0gMHglMDh4IgotCQkJCSAgIiAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKLQkJCQkgIGksIHJvdzMsIHJvdzIsIHJvdzEsIHJvdzApOwotCQkJcmMrKzsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogVFNUT1JNICovCi0JbGFzdF9pZHggPSBSRUdfUkQ4KGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJICAgVFNUT1JNX0FTU0VSVF9MSVNUX0lOREVYX09GRlNFVCk7Ci0JaWYgKGxhc3RfaWR4KQotCQlCTlgyWF9FUlIoIlRTVE9STV9BU1NFUlRfTElTVF9JTkRFWCAweCV4XG4iLCBsYXN0X2lkeCk7Ci0KLQkvKiBwcmludCB0aGUgYXNzZXJ0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBTVFJPTV9BU1NFUlRfQVJSQVlfU0laRTsgaSsrKSB7Ci0KLQkJcm93MCA9IFJFR19SRChicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFRTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkpOwotCQlyb3cxID0gUkVHX1JEKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJICAgICAgVFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDQpOwotCQlyb3cyID0gUkVHX1JEKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJICAgICAgVFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDgpOwotCQlyb3czID0gUkVHX1JEKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJICAgICAgVFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSArIDEyKTsKLQotCQlpZiAocm93MCAhPSBDT01NT05fQVNNX0lOVkFMSURfQVNTRVJUX09QQ09ERSkgewotCQkJQk5YMlhfRVJSKCJUU1RPUk1fQVNTRVJUX0lOREVYIDB4JXggPSAweCUwOHgiCi0JCQkJICAiIDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAotCQkJCSAgaSwgcm93Mywgcm93Miwgcm93MSwgcm93MCk7Ci0JCQlyYysrOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBDU1RPUk0gKi8KLQlsYXN0X2lkeCA9IFJFR19SRDgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQkgICBDU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVhfT0ZGU0VUKTsKLQlpZiAobGFzdF9pZHgpCi0JCUJOWDJYX0VSUigiQ1NUT1JNX0FTU0VSVF9MSVNUX0lOREVYIDB4JXhcbiIsIGxhc3RfaWR4KTsKLQotCS8qIHByaW50IHRoZSBhc3NlcnRzICovCi0JZm9yIChpID0gMDsgaSA8IFNUUk9NX0FTU0VSVF9BUlJBWV9TSVpFOyBpKyspIHsKLQotCQlyb3cwID0gUkVHX1JEKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCQkJICAgICAgQ1NUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChpKSk7Ci0JCXJvdzEgPSBSRUdfUkQoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQkgICAgICBDU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpICsgNCk7Ci0JCXJvdzIgPSBSRUdfUkQoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQkgICAgICBDU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpICsgOCk7Ci0JCXJvdzMgPSBSRUdfUkQoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQkgICAgICBDU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpICsgMTIpOwotCi0JCWlmIChyb3cwICE9IENPTU1PTl9BU01fSU5WQUxJRF9BU1NFUlRfT1BDT0RFKSB7Ci0JCQlCTlgyWF9FUlIoIkNTVE9STV9BU1NFUlRfSU5ERVggMHgleCA9IDB4JTA4eCIKLQkJCQkgICIgMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCi0JCQkJICBpLCByb3czLCByb3cyLCByb3cxLCByb3cwKTsKLQkJCXJjKys7Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIFVTVE9STSAqLwotCWxhc3RfaWR4ID0gUkVHX1JEOChicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCSAgIFVTVE9STV9BU1NFUlRfTElTVF9JTkRFWF9PRkZTRVQpOwotCWlmIChsYXN0X2lkeCkKLQkJQk5YMlhfRVJSKCJVU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVggMHgleFxuIiwgbGFzdF9pZHgpOwotCi0JLyogcHJpbnQgdGhlIGFzc2VydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgU1RST01fQVNTRVJUX0FSUkFZX1NJWkU7IGkrKykgewotCi0JCXJvdzAgPSBSRUdfUkQoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCQkgICAgICBVU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGkpKTsKLQkJcm93MSA9IFJFR19SRChicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFVTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyA0KTsKLQkJcm93MiA9IFJFR19SRChicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFVTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyA4KTsKLQkJcm93MyA9IFJFR19SRChicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgIFVTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoaSkgKyAxMik7Ci0KLQkJaWYgKHJvdzAgIT0gQ09NTU9OX0FTTV9JTlZBTElEX0FTU0VSVF9PUENPREUpIHsKLQkJCUJOWDJYX0VSUigiVVNUT1JNX0FTU0VSVF9JTkRFWCAweCV4ID0gMHglMDh4IgotCQkJCSAgIiAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKLQkJCQkgIGksIHJvdzMsIHJvdzIsIHJvdzEsIHJvdzApOwotCQkJcmMrKzsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9md19kdW1wKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIGFkZHI7Ci0JdTMyIG1hcmssIG9mZnNldDsKLQlfX2JlMzIgZGF0YVs5XTsKLQlpbnQgd29yZDsKLQotCWlmIChCUF9OT01DUChicCkpIHsKLQkJQk5YMlhfRVJSKCJOTyBNQ1AgLSBjYW4gbm90IGR1bXBcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JYWRkciA9IGJwLT5jb21tb24uc2htZW1fYmFzZSAtIDB4MDgwMCArIDQ7Ci0JbWFyayA9IFJFR19SRChicCwgYWRkcik7Ci0JbWFyayA9IE1DUF9SRUdfTUNQUl9TQ1JBVENIICsgKChtYXJrICsgMHgzKSAmIH4weDMpIC0gMHgwODAwMDAwMDsKLQlwcl9lcnIoImJlZ2luIGZ3IGR1bXAgKG1hcmsgMHgleClcbiIsIG1hcmspOwotCi0JcHJfZXJyKCIiKTsKLQlmb3IgKG9mZnNldCA9IG1hcms7IG9mZnNldCA8PSBicC0+Y29tbW9uLnNobWVtX2Jhc2U7IG9mZnNldCArPSAweDgqNCkgewotCQlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgODsgd29yZCsrKQotCQkJZGF0YVt3b3JkXSA9IGh0b25sKFJFR19SRChicCwgb2Zmc2V0ICsgNCp3b3JkKSk7Ci0JCWRhdGFbOF0gPSAweDA7Ci0JCXByX2NvbnQoIiVzIiwgKGNoYXIgKilkYXRhKTsKLQl9Ci0JZm9yIChvZmZzZXQgPSBhZGRyICsgNDsgb2Zmc2V0IDw9IG1hcms7IG9mZnNldCArPSAweDgqNCkgewotCQlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgODsgd29yZCsrKQotCQkJZGF0YVt3b3JkXSA9IGh0b25sKFJFR19SRChicCwgb2Zmc2V0ICsgNCp3b3JkKSk7Ci0JCWRhdGFbOF0gPSAweDA7Ci0JCXByX2NvbnQoIiVzIiwgKGNoYXIgKilkYXRhKTsKLQl9Ci0JcHJfZXJyKCJlbmQgb2YgZncgZHVtcFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3BhbmljX2R1bXAoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaTsKLQl1MTYgaiwgc3RhcnQsIGVuZDsKLQotCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOwotCURQKEJOWDJYX01TR19TVEFUUywgInN0YXRzX3N0YXRlIC0gRElTQUJMRURcbiIpOwotCi0JQk5YMlhfRVJSKCJiZWdpbiBjcmFzaCBkdW1wIC0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQotCS8qIEluZGljZXMgKi8KLQkvKiBDb21tb24gKi8KLQlCTlgyWF9FUlIoImRlZl9jX2lkeCgweCV4KSAgZGVmX3VfaWR4KDB4JXgpICBkZWZfeF9pZHgoMHgleCkiCi0JCSAgIiAgZGVmX3RfaWR4KDB4JXgpICBkZWZfYXR0X2lkeCgweCV4KSAgYXR0bl9zdGF0ZSgweCV4KSIKLQkJICAiICBzcHFfcHJvZF9pZHgoMHgleClcbiIsCi0JCSAgYnAtPmRlZl9jX2lkeCwgYnAtPmRlZl91X2lkeCwgYnAtPmRlZl94X2lkeCwgYnAtPmRlZl90X2lkeCwKLQkJICBicC0+ZGVmX2F0dF9pZHgsIGJwLT5hdHRuX3N0YXRlLCBicC0+c3BxX3Byb2RfaWR4KTsKLQotCS8qIFJ4ICovCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0KLQkJQk5YMlhfRVJSKCJmcCVkOiByeF9iZF9wcm9kKDB4JXgpICByeF9iZF9jb25zKDB4JXgpIgotCQkJICAiICAqcnhfYmRfY29uc19zYigweCV4KSAgcnhfY29tcF9wcm9kKDB4JXgpIgotCQkJICAiICByeF9jb21wX2NvbnMoMHgleCkgICpyeF9jb25zX3NiKDB4JXgpXG4iLAotCQkJICBpLCBmcC0+cnhfYmRfcHJvZCwgZnAtPnJ4X2JkX2NvbnMsCi0JCQkgIGxlMTZfdG9fY3B1KCpmcC0+cnhfYmRfY29uc19zYiksIGZwLT5yeF9jb21wX3Byb2QsCi0JCQkgIGZwLT5yeF9jb21wX2NvbnMsIGxlMTZfdG9fY3B1KCpmcC0+cnhfY29uc19zYikpOwotCQlCTlgyWF9FUlIoIiAgICAgcnhfc2dlX3Byb2QoMHgleCkgIGxhc3RfbWF4X3NnZSgweCV4KSIKLQkJCSAgIiAgZnBfdV9pZHgoMHgleCkgKnNiX3VfaWR4KDB4JXgpXG4iLAotCQkJICBmcC0+cnhfc2dlX3Byb2QsIGZwLT5sYXN0X21heF9zZ2UsCi0JCQkgIGxlMTZfdG9fY3B1KGZwLT5mcF91X2lkeCksCi0JCQkgIGZwLT5zdGF0dXNfYmxrLT51X3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpOwotCX0KLQotCS8qIFR4ICovCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0KLQkJQk5YMlhfRVJSKCJmcCVkOiB0eF9wa3RfcHJvZCgweCV4KSAgdHhfcGt0X2NvbnMoMHgleCkiCi0JCQkgICIgIHR4X2JkX3Byb2QoMHgleCkgIHR4X2JkX2NvbnMoMHgleCkiCi0JCQkgICIgICp0eF9jb25zX3NiKDB4JXgpXG4iLAotCQkJICBpLCBmcC0+dHhfcGt0X3Byb2QsIGZwLT50eF9wa3RfY29ucywgZnAtPnR4X2JkX3Byb2QsCi0JCQkgIGZwLT50eF9iZF9jb25zLCBsZTE2X3RvX2NwdSgqZnAtPnR4X2NvbnNfc2IpKTsKLQkJQk5YMlhfRVJSKCIgICAgIGZwX2NfaWR4KDB4JXgpICAqc2JfY19pZHgoMHgleCkiCi0JCQkgICIgIHR4X2RiX3Byb2QoMHgleClcbiIsIGxlMTZfdG9fY3B1KGZwLT5mcF9jX2lkeCksCi0JCQkgIGZwLT5zdGF0dXNfYmxrLT5jX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgsCi0JCQkgIGZwLT50eF9kYi5kYXRhLnByb2QpOwotCX0KLQotCS8qIFJpbmdzICovCi0JLyogUnggKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQotCQlzdGFydCA9IFJYX0JEKGxlMTZfdG9fY3B1KCpmcC0+cnhfY29uc19zYikgLSAxMCk7Ci0JCWVuZCA9IFJYX0JEKGxlMTZfdG9fY3B1KCpmcC0+cnhfY29uc19zYikgKyA1MDMpOwotCQlmb3IgKGogPSBzdGFydDsgaiAhPSBlbmQ7IGogPSBSWF9CRChqICsgMSkpIHsKLQkJCXUzMiAqcnhfYmQgPSAodTMyICopJmZwLT5yeF9kZXNjX3Jpbmdbal07Ci0JCQlzdHJ1Y3Qgc3dfcnhfYmQgKnN3X2JkID0gJmZwLT5yeF9idWZfcmluZ1tqXTsKLQotCQkJQk5YMlhfRVJSKCJmcCVkOiByeF9iZFsleF09WyV4OiV4XSAgc3dfYmQ9WyVwXVxuIiwKLQkJCQkgIGksIGosIHJ4X2JkWzFdLCByeF9iZFswXSwgc3dfYmQtPnNrYik7Ci0JCX0KLQotCQlzdGFydCA9IFJYX1NHRShmcC0+cnhfc2dlX3Byb2QpOwotCQllbmQgPSBSWF9TR0UoZnAtPmxhc3RfbWF4X3NnZSk7Ci0JCWZvciAoaiA9IHN0YXJ0OyBqICE9IGVuZDsgaiA9IFJYX1NHRShqICsgMSkpIHsKLQkJCXUzMiAqcnhfc2dlID0gKHUzMiAqKSZmcC0+cnhfc2dlX3Jpbmdbal07Ci0JCQlzdHJ1Y3Qgc3dfcnhfcGFnZSAqc3dfcGFnZSA9ICZmcC0+cnhfcGFnZV9yaW5nW2pdOwotCi0JCQlCTlgyWF9FUlIoImZwJWQ6IHJ4X3NnZVsleF09WyV4OiV4XSAgc3dfcGFnZT1bJXBdXG4iLAotCQkJCSAgaSwgaiwgcnhfc2dlWzFdLCByeF9zZ2VbMF0sIHN3X3BhZ2UtPnBhZ2UpOwotCQl9Ci0KLQkJc3RhcnQgPSBSQ1FfQkQoZnAtPnJ4X2NvbXBfY29ucyAtIDEwKTsKLQkJZW5kID0gUkNRX0JEKGZwLT5yeF9jb21wX2NvbnMgKyA1MDMpOwotCQlmb3IgKGogPSBzdGFydDsgaiAhPSBlbmQ7IGogPSBSQ1FfQkQoaiArIDEpKSB7Ci0JCQl1MzIgKmNxZSA9ICh1MzIgKikmZnAtPnJ4X2NvbXBfcmluZ1tqXTsKLQotCQkJQk5YMlhfRVJSKCJmcCVkOiBjcWVbJXhdPVsleDoleDoleDoleF1cbiIsCi0JCQkJICBpLCBqLCBjcWVbMF0sIGNxZVsxXSwgY3FlWzJdLCBjcWVbM10pOwotCQl9Ci0JfQotCi0JLyogVHggKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQotCQlzdGFydCA9IFRYX0JEKGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYikgLSAxMCk7Ci0JCWVuZCA9IFRYX0JEKGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYikgKyAyNDUpOwotCQlmb3IgKGogPSBzdGFydDsgaiAhPSBlbmQ7IGogPSBUWF9CRChqICsgMSkpIHsKLQkJCXN0cnVjdCBzd190eF9iZCAqc3dfYmQgPSAmZnAtPnR4X2J1Zl9yaW5nW2pdOwotCi0JCQlCTlgyWF9FUlIoImZwJWQ6IHBhY2tldFsleF09WyVwLCV4XVxuIiwKLQkJCQkgIGksIGosIHN3X2JkLT5za2IsIHN3X2JkLT5maXJzdF9iZCk7Ci0JCX0KLQotCQlzdGFydCA9IFRYX0JEKGZwLT50eF9iZF9jb25zIC0gMTApOwotCQllbmQgPSBUWF9CRChmcC0+dHhfYmRfY29ucyArIDI1NCk7Ci0JCWZvciAoaiA9IHN0YXJ0OyBqICE9IGVuZDsgaiA9IFRYX0JEKGogKyAxKSkgewotCQkJdTMyICp0eF9iZCA9ICh1MzIgKikmZnAtPnR4X2Rlc2NfcmluZ1tqXTsKLQotCQkJQk5YMlhfRVJSKCJmcCVkOiB0eF9iZFsleF09WyV4OiV4OiV4OiV4XVxuIiwKLQkJCQkgIGksIGosIHR4X2JkWzBdLCB0eF9iZFsxXSwgdHhfYmRbMl0sIHR4X2JkWzNdKTsKLQkJfQotCX0KLQotCWJueDJ4X2Z3X2R1bXAoYnApOwotCWJueDJ4X21jX2Fzc2VydChicCk7Ci0JQk5YMlhfRVJSKCJlbmQgY3Jhc2ggZHVtcCAtLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2ludF9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCXUzMiBhZGRyID0gcG9ydCA/IEhDX1JFR19DT05GSUdfMSA6IEhDX1JFR19DT05GSUdfMDsKLQl1MzIgdmFsID0gUkVHX1JEKGJwLCBhZGRyKTsKLQlpbnQgbXNpeCA9IChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpID8gMSA6IDA7Ci0JaW50IG1zaSA9IChicC0+ZmxhZ3MgJiBVU0lOR19NU0lfRkxBRykgPyAxIDogMDsKLQotCWlmIChtc2l4KSB7Ci0JCXZhbCAmPSB+KEhDX0NPTkZJR18wX1JFR19TSU5HTEVfSVNSX0VOXzAgfAotCQkJIEhDX0NPTkZJR18wX1JFR19JTlRfTElORV9FTl8wKTsKLQkJdmFsIHw9IChIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAotCQkJSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOwotCX0gZWxzZSBpZiAobXNpKSB7Ci0JCXZhbCAmPSB+SENfQ09ORklHXzBfUkVHX0lOVF9MSU5FX0VOXzA7Ci0JCXZhbCB8PSAoSENfQ09ORklHXzBfUkVHX1NJTkdMRV9JU1JfRU5fMCB8Ci0JCQlIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAotCQkJSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOwotCX0gZWxzZSB7Ci0JCXZhbCB8PSAoSENfQ09ORklHXzBfUkVHX1NJTkdMRV9JU1JfRU5fMCB8Ci0JCQlIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAotCQkJSENfQ09ORklHXzBfUkVHX0lOVF9MSU5FX0VOXzAgfAotCQkJSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOwotCi0JCURQKE5FVElGX01TR19JTlRSLCAid3JpdGUgJXggdG8gSEMgJWQgKGFkZHIgMHgleClcbiIsCi0JCSAgIHZhbCwgcG9ydCwgYWRkcik7Ci0KLQkJUkVHX1dSKGJwLCBhZGRyLCB2YWwpOwotCi0JCXZhbCAmPSB+SENfQ09ORklHXzBfUkVHX01TSV9NU0lYX0lOVF9FTl8wOwotCX0KLQotCURQKE5FVElGX01TR19JTlRSLCAid3JpdGUgJXggdG8gSEMgJWQgKGFkZHIgMHgleCkgIG1vZGUgJXNcbiIsCi0JICAgdmFsLCBwb3J0LCBhZGRyLCAobXNpeCA/ICJNU0ktWCIgOiAobXNpID8gIk1TSSIgOiAiSU5UeCIpKSk7Ci0KLQlSRUdfV1IoYnAsIGFkZHIsIHZhbCk7Ci0JLyoKLQkgKiBFbnN1cmUgdGhhdCBIQ19DT05GSUcgaXMgd3JpdHRlbiBiZWZvcmUgbGVhZGluZy90cmFpbGluZyBlZGdlIGNvbmZpZwotCSAqLwotCW1taW93YigpOwotCWJhcnJpZXIoKTsKLQotCWlmIChDSElQX0lTX0UxSChicCkpIHsKLQkJLyogaW5pdCBsZWFkaW5nL3RyYWlsaW5nIGVkZ2UgKi8KLQkJaWYgKElTX0UxSE1GKGJwKSkgewotCQkJdmFsID0gKDB4ZWUwZiB8ICgxIDw8IChCUF9FMUhWTihicCkgKyA0KSkpOwotCQkJaWYgKGJwLT5wb3J0LnBtZikKLQkJCQkvKiBlbmFibGUgbmlnIGFuZCBncGlvMyBhdHRlbnRpb24gKi8KLQkJCQl2YWwgfD0gMHgxMTAwOwotCQl9IGVsc2UKLQkJCXZhbCA9IDB4ZmZmZjsKLQotCQlSRUdfV1IoYnAsIEhDX1JFR19UUkFJTElOR19FREdFXzAgKyBwb3J0KjgsIHZhbCk7Ci0JCVJFR19XUihicCwgSENfUkVHX0xFQURJTkdfRURHRV8wICsgcG9ydCo4LCB2YWwpOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIGluZGVlZCBlbmFibGVkIGZyb20gaGVyZSBvbiAqLwotCW1taW93YigpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9pbnRfZGlzYWJsZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JdTMyIGFkZHIgPSBwb3J0ID8gSENfUkVHX0NPTkZJR18xIDogSENfUkVHX0NPTkZJR18wOwotCXUzMiB2YWwgPSBSRUdfUkQoYnAsIGFkZHIpOwotCi0JdmFsICY9IH4oSENfQ09ORklHXzBfUkVHX1NJTkdMRV9JU1JfRU5fMCB8Ci0JCSBIQ19DT05GSUdfMF9SRUdfTVNJX01TSVhfSU5UX0VOXzAgfAotCQkgSENfQ09ORklHXzBfUkVHX0lOVF9MSU5FX0VOXzAgfAotCQkgSENfQ09ORklHXzBfUkVHX0FUVE5fQklUX0VOXzApOwotCi0JRFAoTkVUSUZfTVNHX0lOVFIsICJ3cml0ZSAleCB0byBIQyAlZCAoYWRkciAweCV4KVxuIiwKLQkgICB2YWwsIHBvcnQsIGFkZHIpOwotCi0JLyogZmx1c2ggYWxsIG91dHN0YW5kaW5nIHdyaXRlcyAqLwotCW1taW93YigpOwotCi0JUkVHX1dSKGJwLCBhZGRyLCB2YWwpOwotCWlmIChSRUdfUkQoYnAsIGFkZHIpICE9IHZhbCkKLQkJQk5YMlhfRVJSKCJCVUchIHByb3BlciB2YWwgbm90IHJlYWQgZnJvbSBJR1UhXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaW50X2Rpc2FibGVfc3luYyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZGlzYWJsZV9odykKLXsKLQlpbnQgbXNpeCA9IChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpID8gMSA6IDA7Ci0JaW50IGksIG9mZnNldDsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0IGhhbmRsaW5nICovCi0JYXRvbWljX2luYygmYnAtPmludHJfc2VtKTsKLQlzbXBfd21iKCk7IC8qIEVuc3VyZSB0aGF0IGJwLT5pbnRyX3NlbSB1cGRhdGUgaXMgU01QLXNhZmUgKi8KLQotCWlmIChkaXNhYmxlX2h3KQotCQkvKiBwcmV2ZW50IHRoZSBIVyBmcm9tIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCQlibngyeF9pbnRfZGlzYWJsZShicCk7Ci0KLQkvKiBtYWtlIHN1cmUgYWxsIElTUnMgYXJlIGRvbmUgKi8KLQlpZiAobXNpeCkgewotCQlzeW5jaHJvbml6ZV9pcnEoYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yKTsKLQkJb2Zmc2V0ID0gMTsKLSNpZmRlZiBCQ01fQ05JQwotCQlvZmZzZXQrKzsKLSNlbmRpZgotCQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQkJCXN5bmNocm9uaXplX2lycShicC0+bXNpeF90YWJsZVtpICsgb2Zmc2V0XS52ZWN0b3IpOwotCX0gZWxzZQotCQlzeW5jaHJvbml6ZV9pcnEoYnAtPnBkZXYtPmlycSk7Ci0KLQkvKiBtYWtlIHN1cmUgc3BfdGFzayBpcyBub3QgcnVubmluZyAqLwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmJwLT5zcF90YXNrKTsKLQlmbHVzaF93b3JrcXVldWUoYm54Mnhfd3EpOwotfQotCi0vKiBmYXN0IHBhdGggKi8KLQotLyoKLSAqIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMKLSAqLwotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkZWQgdG8gYWNxdWlyZSB0aGUgbG9jayAqLwotc3RhdGljIGJvb2wgYm54MnhfdHJ5bG9ja19od19sb2NrKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZXNvdXJjZSkKLXsKLQl1MzIgbG9ja19zdGF0dXM7Ci0JdTMyIHJlc291cmNlX2JpdCA9ICgxIDw8IHJlc291cmNlKTsKLQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwotCXUzMiBod19sb2NrX2NvbnRyb2xfcmVnOwotCi0JRFAoTkVUSUZfTVNHX0hXLCAiVHJ5aW5nIHRvIHRha2UgYSBsb2NrIG9uIHJlc291cmNlICVkXG4iLCByZXNvdXJjZSk7Ci0KLQkvKiBWYWxpZGF0aW5nIHRoYXQgdGhlIHJlc291cmNlIGlzIHdpdGhpbiByYW5nZSAqLwotCWlmIChyZXNvdXJjZSA+IEhXX0xPQ0tfTUFYX1JFU09VUkNFX1ZBTFVFKSB7Ci0JCURQKE5FVElGX01TR19IVywKLQkJICAgInJlc291cmNlKDB4JXgpID4gSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUoMHgleClcbiIsCi0JCSAgIHJlc291cmNlLCBIV19MT0NLX01BWF9SRVNPVVJDRV9WQUxVRSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChmdW5jIDw9IDUpCi0JCWh3X2xvY2tfY29udHJvbF9yZWcgPSAoTUlTQ19SRUdfRFJJVkVSX0NPTlRST0xfMSArIGZ1bmMqOCk7Ci0JZWxzZQotCQlod19sb2NrX2NvbnRyb2xfcmVnID0KLQkJCQkoTUlTQ19SRUdfRFJJVkVSX0NPTlRST0xfNyArIChmdW5jIC0gNikqOCk7Ci0KLQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jayAqLwotCVJFR19XUihicCwgaHdfbG9ja19jb250cm9sX3JlZyArIDQsIHJlc291cmNlX2JpdCk7Ci0JbG9ja19zdGF0dXMgPSBSRUdfUkQoYnAsIGh3X2xvY2tfY29udHJvbF9yZWcpOwotCWlmIChsb2NrX3N0YXR1cyAmIHJlc291cmNlX2JpdCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlEUChORVRJRl9NU0dfSFcsICJGYWlsZWQgdG8gZ2V0IGEgbG9jayBvbiByZXNvdXJjZSAlZFxuIiwgcmVzb3VyY2UpOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2Fja19zYihzdHJ1Y3QgYm54MnggKmJwLCB1OCBzYl9pZCwKLQkJCQl1OCBzdG9ybSwgdTE2IGluZGV4LCB1OCBvcCwgdTggdXBkYXRlKQotewotCXUzMiBoY19hZGRyID0gKEhDX1JFR19DT01NQU5EX1JFRyArIEJQX1BPUlQoYnApKjMyICsKLQkJICAgICAgIENPTU1BTkRfUkVHX0lOVF9BQ0spOwotCXN0cnVjdCBpZ3VfYWNrX3JlZ2lzdGVyIGlndV9hY2s7Ci0KLQlpZ3VfYWNrLnN0YXR1c19ibG9ja19pbmRleCA9IGluZGV4OwotCWlndV9hY2suc2JfaWRfYW5kX2ZsYWdzID0KLQkJCSgoc2JfaWQgPDwgSUdVX0FDS19SRUdJU1RFUl9TVEFUVVNfQkxPQ0tfSURfU0hJRlQpIHwKLQkJCSAoc3Rvcm0gPDwgSUdVX0FDS19SRUdJU1RFUl9TVE9STV9JRF9TSElGVCkgfAotCQkJICh1cGRhdGUgPDwgSUdVX0FDS19SRUdJU1RFUl9VUERBVEVfSU5ERVhfU0hJRlQpIHwKLQkJCSAob3AgPDwgSUdVX0FDS19SRUdJU1RFUl9JTlRFUlJVUFRfTU9ERV9TSElGVCkpOwotCi0JRFAoQk5YMlhfTVNHX09GRiwgIndyaXRlIDB4JTA4eCB0byBIQyBhZGRyIDB4JXhcbiIsCi0JICAgKCoodTMyICopJmlndV9hY2spLCBoY19hZGRyKTsKLQlSRUdfV1IoYnAsIGhjX2FkZHIsICgqKHUzMiAqKSZpZ3VfYWNrKSk7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCBBQ0sgaXMgd3JpdHRlbiAqLwotCW1taW93YigpOwotCWJhcnJpZXIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9mcHNiX2lkeChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQotewotCXN0cnVjdCBob3N0X3N0YXR1c19ibG9jayAqZnBzYiA9IGZwLT5zdGF0dXNfYmxrOwotCi0JYmFycmllcigpOyAvKiBzdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiB0byBieSB0aGUgY2hpcCAqLwotCWZwLT5mcF9jX2lkeCA9IGZwc2ItPmNfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleDsKLQlmcC0+ZnBfdV9pZHggPSBmcHNiLT51X3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7Ci19Ci0KLXN0YXRpYyB1MTYgYm54MnhfYWNrX2ludChzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiBoY19hZGRyID0gKEhDX1JFR19DT01NQU5EX1JFRyArIEJQX1BPUlQoYnApKjMyICsKLQkJICAgICAgIENPTU1BTkRfUkVHX1NJTURfTUFTSyk7Ci0JdTMyIHJlc3VsdCA9IFJFR19SRChicCwgaGNfYWRkcik7Ci0KLQlEUChCTlgyWF9NU0dfT0ZGLCAicmVhZCAweCUwOHggZnJvbSBIQyBhZGRyIDB4JXhcbiIsCi0JICAgcmVzdWx0LCBoY19hZGRyKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIGZhc3QgcGF0aCBzZXJ2aWNlIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2hhc190eF93b3JrX3VubG9hZChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQotewotCS8qIFRlbGwgY29tcGlsZXIgdGhhdCBjb25zdW1lciBhbmQgcHJvZHVjZXIgY2FuIGNoYW5nZSAqLwotCWJhcnJpZXIoKTsKLQlyZXR1cm4gKGZwLT50eF9wa3RfcHJvZCAhPSBmcC0+dHhfcGt0X2NvbnMpOwotfQotCi0vKiBmcmVlIHNrYiBpbiB0aGUgcGFja2V0IHJpbmcgYXQgcG9zIGlkeAotICogcmV0dXJuIGlkeCBvZiBsYXN0IGJkIGZyZWVkCi0gKi8KLXN0YXRpYyB1MTYgYm54MnhfZnJlZV90eF9wa3Qoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKLQkJCSAgICAgdTE2IGlkeCkKLXsKLQlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZiA9ICZmcC0+dHhfYnVmX3JpbmdbaWR4XTsKLQlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICp0eF9zdGFydF9iZDsKLQlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9kYXRhX2JkOwotCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9idWYtPnNrYjsKLQl1MTYgYmRfaWR4ID0gVFhfQkQodHhfYnVmLT5maXJzdF9iZCksIG5ld19jb25zOwotCWludCBuYmQ7Ci0KLQkvKiBwcmVmZXRjaCBza2IgZW5kIHBvaW50ZXIgdG8gc3BlZWR1cCBkZXZfa2ZyZWVfc2tiKCkgKi8KLQlwcmVmZXRjaCgmc2tiLT5lbmQpOwotCi0JRFAoQk5YMlhfTVNHX09GRiwgInBrdF9pZHggJWQgIGJ1ZmYgQCglcCktPnNrYiAlcFxuIiwKLQkgICBpZHgsIHR4X2J1Ziwgc2tiKTsKLQotCS8qIHVubWFwIGZpcnN0IGJkICovCi0JRFAoQk5YMlhfTVNHX09GRiwgImZyZWUgYmRfaWR4ICVkXG4iLCBiZF9pZHgpOwotCXR4X3N0YXJ0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfaWR4XS5zdGFydF9iZDsKLQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBCRF9VTk1BUF9BRERSKHR4X3N0YXJ0X2JkKSwKLQkJCSBCRF9VTk1BUF9MRU4odHhfc3RhcnRfYmQpLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQotCW5iZCA9IGxlMTZfdG9fY3B1KHR4X3N0YXJ0X2JkLT5uYmQpIC0gMTsKLSNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JaWYgKChuYmQgLSAxKSA+IChNQVhfU0tCX0ZSQUdTICsgMikpIHsKLQkJQk5YMlhfRVJSKCJCQUQgbmJkIVxuIik7Ci0JCWJueDJ4X3BhbmljKCk7Ci0JfQotI2VuZGlmCi0JbmV3X2NvbnMgPSBuYmQgKyB0eF9idWYtPmZpcnN0X2JkOwotCi0JLyogR2V0IHRoZSBuZXh0IGJkICovCi0JYmRfaWR4ID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfaWR4KSk7Ci0KLQkvKiBTa2lwIGEgcGFyc2UgYmQuLi4gKi8KLQktLW5iZDsKLQliZF9pZHggPSBUWF9CRChORVhUX1RYX0lEWChiZF9pZHgpKTsKLQotCS8qIC4uLmFuZCB0aGUgVFNPIHNwbGl0IGhlYWRlciBiZCBzaW5jZSB0aGV5IGhhdmUgbm8gbWFwcGluZyAqLwotCWlmICh0eF9idWYtPmZsYWdzICYgQk5YMlhfVFNPX1NQTElUX0JEKSB7Ci0JCS0tbmJkOwotCQliZF9pZHggPSBUWF9CRChORVhUX1RYX0lEWChiZF9pZHgpKTsKLQl9Ci0KLQkvKiBub3cgZnJlZSBmcmFncyAqLwotCXdoaWxlIChuYmQgPiAwKSB7Ci0KLQkJRFAoQk5YMlhfTVNHX09GRiwgImZyZWUgZnJhZyBiZF9pZHggJWRcbiIsIGJkX2lkeCk7Ci0JCXR4X2RhdGFfYmQgPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9pZHhdLnJlZ19iZDsKLQkJZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIEJEX1VOTUFQX0FERFIodHhfZGF0YV9iZCksCi0JCQkgICAgICAgQkRfVU5NQVBfTEVOKHR4X2RhdGFfYmQpLCBETUFfVE9fREVWSUNFKTsKLQkJaWYgKC0tbmJkKQotCQkJYmRfaWR4ID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfaWR4KSk7Ci0JfQotCi0JLyogcmVsZWFzZSBza2IgKi8KLQlXQVJOX09OKCFza2IpOwotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl0eF9idWYtPmZpcnN0X2JkID0gMDsKLQl0eF9idWYtPnNrYiA9IE5VTEw7Ci0KLQlyZXR1cm4gbmV3X2NvbnM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGJueDJ4X3R4X2F2YWlsKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCi17Ci0JczE2IHVzZWQ7Ci0JdTE2IHByb2Q7Ci0JdTE2IGNvbnM7Ci0KLQlwcm9kID0gZnAtPnR4X2JkX3Byb2Q7Ci0JY29ucyA9IGZwLT50eF9iZF9jb25zOwotCi0JLyogTlVNX1RYX1JJTkdTID0gbnVtYmVyIG9mICJuZXh0LXBhZ2UiIGVudHJpZXMKLQkgICBJdCB3aWxsIGJlIHVzZWQgYXMgYSB0aHJlc2hvbGQgKi8KLQl1c2VkID0gU1VCX1MxNihwcm9kLCBjb25zKSArIChzMTYpTlVNX1RYX1JJTkdTOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCVdBUk5fT04odXNlZCA8IDApOwotCVdBUk5fT04odXNlZCA+IGZwLT5icC0+dHhfcmluZ19zaXplKTsKLQlXQVJOX09OKChmcC0+YnAtPnR4X3Jpbmdfc2l6ZSAtIHVzZWQpID4gTUFYX1RYX0FWQUlMKTsKLSNlbmRpZgotCi0JcmV0dXJuIChzMTYpKGZwLT5icC0+dHhfcmluZ19zaXplKSAtIHVzZWQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2hhc190eF93b3JrKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCi17Ci0JdTE2IGh3X2NvbnM7Ci0KLQkvKiBUZWxsIGNvbXBpbGVyIHRoYXQgc3RhdHVzIGJsb2NrIGZpZWxkcyBjYW4gY2hhbmdlICovCi0JYmFycmllcigpOwotCWh3X2NvbnMgPSBsZTE2X3RvX2NwdSgqZnAtPnR4X2NvbnNfc2IpOwotCXJldHVybiBod19jb25zICE9IGZwLT50eF9wa3RfY29uczsKLX0KLQotc3RhdGljIGludCBibngyeF90eF9pbnQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOwotCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKLQl1MTYgaHdfY29ucywgc3dfY29ucywgYmRfY29ucyA9IGZwLT50eF9iZF9jb25zOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm4gLTE7Ci0jZW5kaWYKLQotCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoYnAtPmRldiwgZnAtPmluZGV4KTsKLQlod19jb25zID0gbGUxNl90b19jcHUoKmZwLT50eF9jb25zX3NiKTsKLQlzd19jb25zID0gZnAtPnR4X3BrdF9jb25zOwotCi0Jd2hpbGUgKHN3X2NvbnMgIT0gaHdfY29ucykgewotCQl1MTYgcGt0X2NvbnM7Ci0KLQkJcGt0X2NvbnMgPSBUWF9CRChzd19jb25zKTsKLQotCQkvKiBwcmVmZXRjaChicC0+dHhfYnVmX3JpbmdbcGt0X2NvbnNdLnNrYik7ICovCi0KLQkJRFAoTkVUSUZfTVNHX1RYX0RPTkUsICJod19jb25zICV1ICBzd19jb25zICV1ICBwa3RfY29ucyAldVxuIiwKLQkJICAgaHdfY29ucywgc3dfY29ucywgcGt0X2NvbnMpOwotCi0vKgkJaWYgKE5FWFRfVFhfSURYKHN3X2NvbnMpICE9IGh3X2NvbnMpIHsKLQkJCXJtYigpOwotCQkJcHJlZmV0Y2goZnAtPnR4X2J1Zl9yaW5nW05FWFRfVFhfSURYKHN3X2NvbnMpXS5za2IpOwotCQl9Ci0qLwotCQliZF9jb25zID0gYm54MnhfZnJlZV90eF9wa3QoYnAsIGZwLCBwa3RfY29ucyk7Ci0JCXN3X2NvbnMrKzsKLQl9Ci0KLQlmcC0+dHhfcGt0X2NvbnMgPSBzd19jb25zOwotCWZwLT50eF9iZF9jb25zID0gYmRfY29uczsKLQotCS8qIE5lZWQgdG8gbWFrZSB0aGUgdHhfYmRfY29ucyB1cGRhdGUgdmlzaWJsZSB0byBzdGFydF94bWl0KCkKLQkgKiBiZWZvcmUgY2hlY2tpbmcgZm9yIG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoKS4gIFdpdGhvdXQgdGhlCi0JICogbWVtb3J5IGJhcnJpZXIsIHRoZXJlIGlzIGEgc21hbGwgcG9zc2liaWxpdHkgdGhhdAotCSAqIHN0YXJ0X3htaXQoKSB3aWxsIG1pc3MgaXQgYW5kIGNhdXNlIHRoZSBxdWV1ZSB0byBiZSBzdG9wcGVkCi0JICogZm9yZXZlci4KLQkgKi8KLQlzbXBfbWIoKTsKLQotCS8qIFRCRCBuZWVkIGEgdGhyZXNoPyAqLwotCWlmICh1bmxpa2VseShuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkpKSB7Ci0JCS8qIFRha2luZyB0eF9sb2NrKCkgaXMgbmVlZGVkIHRvIHByZXZlbnQgcmVlbmFibGluZyB0aGUgcXVldWUKLQkJICogd2hpbGUgaXQncyBlbXB0eS4gVGhpcyBjb3VsZCBoYXZlIGhhcHBlbiBpZiByeF9hY3Rpb24oKSBnZXRzCi0JCSAqIHN1c3BlbmRlZCBpbiBibngyeF90eF9pbnQoKSBhZnRlciB0aGUgY29uZGl0aW9uIGJlZm9yZQotCQkgKiBuZXRpZl90eF93YWtlX3F1ZXVlKCksIHdoaWxlIHR4X2FjdGlvbiAoYm54Mnhfc3RhcnRfeG1pdCgpKToKLQkJICoKLQkJICogc3RvcHMgdGhlIHF1ZXVlLT5zZWVzIGZyZXNoIHR4X2JkX2NvbnMtPnJlbGVhc2VzIHRoZSBxdWV1ZS0+Ci0JCSAqIHNlbmRzIHNvbWUgcGFja2V0cyBjb25zdW1pbmcgdGhlIHdob2xlIHF1ZXVlIGFnYWluLT4KLQkJICogc3RvcHMgdGhlIHF1ZXVlCi0JCSAqLwotCi0JCV9fbmV0aWZfdHhfbG9jayh0eHEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KLQkJaWYgKChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkpICYmCi0JCSAgICAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pICYmCi0JCSAgICAoYm54MnhfdHhfYXZhaWwoZnApID49IE1BWF9TS0JfRlJBR1MgKyAzKSkKLQkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKLQotCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIEJDTV9DTklDCi1zdGF0aWMgdm9pZCBibngyeF9jbmljX2NmY19jb21wKHN0cnVjdCBibngyeCAqYnAsIGludCBjaWQpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3NwX2V2ZW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCi0JCQkgICB1bmlvbiBldGhfcnhfY3FlICpycl9jcWUpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKLQlpbnQgY2lkID0gU1dfQ0lEKHJyX2NxZS0+cmFtcm9kX2NxZS5jb25uX2FuZF9jbWRfZGF0YSk7Ci0JaW50IGNvbW1hbmQgPSBDUUVfQ01EKHJyX2NxZS0+cmFtcm9kX2NxZS5jb25uX2FuZF9jbWRfZGF0YSk7Ci0KLQlEUChCTlgyWF9NU0dfU1AsCi0JICAgImZwICVkICBjaWQgJWQgIGdvdCByYW1yb2QgIyVkICBzdGF0ZSBpcyAleCAgdHlwZSBpcyAlZFxuIiwKLQkgICBmcC0+aW5kZXgsIGNpZCwgY29tbWFuZCwgYnAtPnN0YXRlLAotCSAgIHJyX2NxZS0+cmFtcm9kX2NxZS5yYW1yb2RfdHlwZSk7Ci0KLQlicC0+c3BxX2xlZnQrKzsKLQotCWlmIChmcC0+aW5kZXgpIHsKLQkJc3dpdGNoIChjb21tYW5kIHwgZnAtPnN0YXRlKSB7Ci0JCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUCB8Ci0JCQkJCQlCTlgyWF9GUF9TVEFURV9PUEVOSU5HKToKLQkJCURQKE5FVElGX01TR19JRlVQLCAiZ290IE1VTFRJWyVkXSBzZXR1cCByYW1yb2RcbiIsCi0JCQkgICBjaWQpOwotCQkJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfT1BFTjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0hBTFQgfCBCTlgyWF9GUF9TVEFURV9IQUxUSU5HKToKLQkJCURQKE5FVElGX01TR19JRkRPV04sICJnb3QgTVVMVElbJWRdIGhhbHQgcmFtcm9kXG4iLAotCQkJICAgY2lkKTsKLQkJCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0hBTFRFRDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlCTlgyWF9FUlIoInVuZXhwZWN0ZWQgTUMgcmVwbHkgKCVkKSAgIgotCQkJCSAgImZwWyVkXSBzdGF0ZSBpcyAleFxuIiwKLQkJCQkgIGNvbW1hbmQsIGZwLT5pbmRleCwgZnAtPnN0YXRlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCW1iKCk7IC8qIGZvcmNlIGJueDJ4X3dhaXRfcmFtcm9kKCkgdG8gc2VlIHRoZSBjaGFuZ2UgKi8KLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoY29tbWFuZCB8IGJwLT5zdGF0ZSkgewotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1BPUlRfU0VUVVAgfCBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X1BPUlQpOgotCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBzZXR1cCByYW1yb2RcbiIpOwotCQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9PUEVOOwotCQlicmVhazsKLQotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0hBTFQgfCBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQpOgotCQlEUChORVRJRl9NU0dfSUZET1dOLCAiZ290IGhhbHQgcmFtcm9kXG4iKTsKLQkJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9ERUxFVEU7Ci0JCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0hBTFRFRDsKLQkJYnJlYWs7Ci0KLQljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9DRkNfREVMIHwgQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9IQUxUKToKLQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImdvdCBkZWxldGUgcmFtcm9kIGZvciBNVUxUSVslZF1cbiIsIGNpZCk7Ci0JCWJueDJ4X2ZwKGJwLCBjaWQsIHN0YXRlKSA9IEJOWDJYX0ZQX1NUQVRFX0NMT1NFRDsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBCQ01fQ05JQwotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0NGQ19ERUwgfCBCTlgyWF9TVEFURV9PUEVOKToKLQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImdvdCBkZWxldGUgcmFtcm9kIGZvciBDSUQgJWRcbiIsIGNpZCk7Ci0JCWJueDJ4X2NuaWNfY2ZjX2NvbXAoYnAsIGNpZCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0KLQljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDIHwgQk5YMlhfU1RBVEVfT1BFTik6Ci0JY2FzZSAoUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQyB8IEJOWDJYX1NUQVRFX0RJQUcpOgotCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBzZXQgbWFjIHJhbXJvZFxuIik7Ci0JCWJwLT5zZXRfbWFjX3BlbmRpbmctLTsKLQkJc21wX3dtYigpOwotCQlicmVhazsKLQotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMgfCBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQpOgotCQlEUChORVRJRl9NU0dfSUZET1dOLCAiZ290ICh1bilzZXQgbWFjIHJhbXJvZFxuIik7Ci0JCWJwLT5zZXRfbWFjX3BlbmRpbmctLTsKLQkJc21wX3dtYigpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJOWDJYX0VSUigidW5leHBlY3RlZCBNQyByZXBseSAoJWQpICBicC0+c3RhdGUgaXMgJXhcbiIsCi0JCQkgIGNvbW1hbmQsIGJwLT5zdGF0ZSk7Ci0JCWJyZWFrOwotCX0KLQltYigpOyAvKiBmb3JjZSBibngyeF93YWl0X3JhbXJvZCgpIHRvIHNlZSB0aGUgY2hhbmdlICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9mcmVlX3J4X3NnZShzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSAgICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgdTE2IGluZGV4KQotewotCXN0cnVjdCBzd19yeF9wYWdlICpzd19idWYgPSAmZnAtPnJ4X3BhZ2VfcmluZ1tpbmRleF07Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBzd19idWYtPnBhZ2U7Ci0Jc3RydWN0IGV0aF9yeF9zZ2UgKnNnZSA9ICZmcC0+cnhfc2dlX3JpbmdbaW5kZXhdOwotCi0JLyogU2tpcCAibmV4dCBwYWdlIiBlbGVtZW50cyAqLwotCWlmICghcGFnZSkKLQkJcmV0dXJuOwotCi0JZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIGRtYV91bm1hcF9hZGRyKHN3X2J1ZiwgbWFwcGluZyksCi0JCSAgICAgICBTR0VfUEFHRV9TSVpFKlBBR0VTX1BFUl9TR0UsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JX19mcmVlX3BhZ2VzKHBhZ2UsIFBBR0VTX1BFUl9TR0VfU0hJRlQpOwotCi0Jc3dfYnVmLT5wYWdlID0gTlVMTDsKLQlzZ2UtPmFkZHJfaGkgPSAwOwotCXNnZS0+YWRkcl9sbyA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9mcmVlX3J4X3NnZV9yYW5nZShzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQkgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCBpbnQgbGFzdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKyspCi0JCWJueDJ4X2ZyZWVfcnhfc2dlKGJwLCBmcCwgaSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2FsbG9jX3J4X3NnZShzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSAgICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgdTE2IGluZGV4KQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0FUT01JQywgUEFHRVNfUEVSX1NHRV9TSElGVCk7Ci0Jc3RydWN0IHN3X3J4X3BhZ2UgKnN3X2J1ZiA9ICZmcC0+cnhfcGFnZV9yaW5nW2luZGV4XTsKLQlzdHJ1Y3QgZXRoX3J4X3NnZSAqc2dlID0gJmZwLT5yeF9zZ2VfcmluZ1tpbmRleF07Ci0JZG1hX2FkZHJfdCBtYXBwaW5nOwotCi0JaWYgKHVubGlrZWx5KHBhZ2UgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWFwcGluZyA9IGRtYV9tYXBfcGFnZSgmYnAtPnBkZXYtPmRldiwgcGFnZSwgMCwKLQkJCSAgICAgICBTR0VfUEFHRV9TSVpFKlBBR0VTX1BFUl9TR0UsIERNQV9GUk9NX0RFVklDRSk7Ci0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZicC0+cGRldi0+ZGV2LCBtYXBwaW5nKSkpIHsKLQkJX19mcmVlX3BhZ2VzKHBhZ2UsIFBBR0VTX1BFUl9TR0VfU0hJRlQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzd19idWYtPnBhZ2UgPSBwYWdlOwotCWRtYV91bm1hcF9hZGRyX3NldChzd19idWYsIG1hcHBpbmcsIG1hcHBpbmcpOwotCi0Jc2dlLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKLQlzZ2UtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihVNjRfTE8obWFwcGluZykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2FsbG9jX3J4X3NrYihzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSAgICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgdTE2IGluZGV4KQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnJ4X2J1Zl9yaW5nW2luZGV4XTsKLQlzdHJ1Y3QgZXRoX3J4X2JkICpyeF9iZCA9ICZmcC0+cnhfZGVzY19yaW5nW2luZGV4XTsKLQlkbWFfYWRkcl90IG1hcHBpbmc7Ci0KLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGJwLT5kZXYsIGJwLT5yeF9idWZfc2l6ZSk7Ci0JaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwgYnAtPnJ4X2J1Zl9zaXplLAotCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwotCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcnhfYnVmLT5za2IgPSBza2I7Ci0JZG1hX3VubWFwX2FkZHJfc2V0KHJ4X2J1ZiwgbWFwcGluZywgbWFwcGluZyk7Ci0KLQlyeF9iZC0+YWRkcl9oaSA9IGNwdV90b19sZTMyKFU2NF9ISShtYXBwaW5nKSk7Ci0JcnhfYmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihVNjRfTE8obWFwcGluZykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIG5vdGUgdGhhdCB3ZSBhcmUgbm90IGFsbG9jYXRpbmcgYSBuZXcgc2tiLAotICogd2UgYXJlIGp1c3QgbW92aW5nIG9uZSBmcm9tIGNvbnMgdG8gcHJvZAotICogd2UgYXJlIG5vdCBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLAotICogc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgZG1hX21hcHBpbmdfZXJyb3IoKS4KLSAqLwotc3RhdGljIHZvaWQgYm54MnhfcmV1c2Vfcnhfc2tiKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7Ci0Jc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107Ci0Jc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07Ci0Jc3RydWN0IGV0aF9yeF9iZCAqY29uc19iZCA9ICZmcC0+cnhfZGVzY19yaW5nW2NvbnNdOwotCXN0cnVjdCBldGhfcnhfYmQgKnByb2RfYmQgPSAmZnAtPnJ4X2Rlc2NfcmluZ1twcm9kXTsKLQotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZicC0+cGRldi0+ZGV2LAotCQkJCSAgIGRtYV91bm1hcF9hZGRyKGNvbnNfcnhfYnVmLCBtYXBwaW5nKSwKLQkJCQkgICBSWF9DT1BZX1RIUkVTSCwgRE1BX0ZST01fREVWSUNFKTsKLQotCXByb2RfcnhfYnVmLT5za2IgPSBjb25zX3J4X2J1Zi0+c2tiOwotCWRtYV91bm1hcF9hZGRyX3NldChwcm9kX3J4X2J1ZiwgbWFwcGluZywKLQkJCSAgIGRtYV91bm1hcF9hZGRyKGNvbnNfcnhfYnVmLCBtYXBwaW5nKSk7Ci0JKnByb2RfYmQgPSAqY29uc19iZDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9sYXN0X21heF9zZ2Uoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKLQkJCQkJICAgICB1MTYgaWR4KQotewotCXUxNiBsYXN0X21heCA9IGZwLT5sYXN0X21heF9zZ2U7Ci0KLQlpZiAoU1VCX1MxNihpZHgsIGxhc3RfbWF4KSA+IDApCi0JCWZwLT5sYXN0X21heF9zZ2UgPSBpZHg7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2NsZWFyX3NnZV9tYXNrX25leHRfZWxlbXMoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IDE7IGkgPD0gTlVNX1JYX1NHRV9QQUdFUzsgaSsrKSB7Ci0JCWludCBpZHggPSBSWF9TR0VfQ05UICogaSAtIDE7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotCQkJU0dFX01BU0tfQ0xFQVJfQklUKGZwLCBpZHgpOwotCQkJaWR4LS07Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9zZ2VfcHJvZChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAotCQkJCSAgc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlICpmcF9jcWUpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKLQl1MTYgc2dlX2xlbiA9IFNHRV9QQUdFX0FMSUdOKGxlMTZfdG9fY3B1KGZwX2NxZS0+cGt0X2xlbikgLQotCQkJCSAgICAgbGUxNl90b19jcHUoZnBfY3FlLT5sZW5fb25fYmQpKSA+PgotCQkgICAgICBTR0VfUEFHRV9TSElGVDsKLQl1MTYgbGFzdF9tYXgsIGxhc3RfZWxlbSwgZmlyc3RfZWxlbTsKLQl1MTYgZGVsdGEgPSAwOwotCXUxNiBpOwotCi0JaWYgKCFzZ2VfbGVuKQotCQlyZXR1cm47Ci0KLQkvKiBGaXJzdCBtYXJrIGFsbCB1c2VkIHBhZ2VzICovCi0JZm9yIChpID0gMDsgaSA8IHNnZV9sZW47IGkrKykKLQkJU0dFX01BU0tfQ0xFQVJfQklUKGZwLCBSWF9TR0UobGUxNl90b19jcHUoZnBfY3FlLT5zZ2xbaV0pKSk7Ci0KLQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLCAiZnBfY3FlLT5zZ2xbJWRdID0gJWRcbiIsCi0JICAgc2dlX2xlbiAtIDEsIGxlMTZfdG9fY3B1KGZwX2NxZS0+c2dsW3NnZV9sZW4gLSAxXSkpOwotCi0JLyogSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgbGFzdCBTR0UgaW5kZXggaXMgdGhlIGJpZ2dlc3QgKi8KLQlwcmVmZXRjaCgodm9pZCAqKShmcC0+c2dlX21hc2spKTsKLQlibngyeF91cGRhdGVfbGFzdF9tYXhfc2dlKGZwLCBsZTE2X3RvX2NwdShmcF9jcWUtPnNnbFtzZ2VfbGVuIC0gMV0pKTsKLQotCWxhc3RfbWF4ID0gUlhfU0dFKGZwLT5sYXN0X21heF9zZ2UpOwotCWxhc3RfZWxlbSA9IGxhc3RfbWF4ID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlQ7Ci0JZmlyc3RfZWxlbSA9IFJYX1NHRShmcC0+cnhfc2dlX3Byb2QpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlQ7Ci0KLQkvKiBJZiByaW5nIGlzIG5vdCBmdWxsICovCi0JaWYgKGxhc3RfZWxlbSArIDEgIT0gZmlyc3RfZWxlbSkKLQkJbGFzdF9lbGVtKys7Ci0KLQkvKiBOb3cgdXBkYXRlIHRoZSBwcm9kICovCi0JZm9yIChpID0gZmlyc3RfZWxlbTsgaSAhPSBsYXN0X2VsZW07IGkgPSBORVhUX1NHRV9NQVNLX0VMRU0oaSkpIHsKLQkJaWYgKGxpa2VseShmcC0+c2dlX21hc2tbaV0pKQotCQkJYnJlYWs7Ci0KLQkJZnAtPnNnZV9tYXNrW2ldID0gUlhfU0dFX01BU0tfRUxFTV9PTkVfTUFTSzsKLQkJZGVsdGEgKz0gUlhfU0dFX01BU0tfRUxFTV9TWjsKLQl9Ci0KLQlpZiAoZGVsdGEgPiAwKSB7Ci0JCWZwLT5yeF9zZ2VfcHJvZCArPSBkZWx0YTsKLQkJLyogY2xlYXIgcGFnZS1lbmQgZW50cmllcyAqLwotCQlibngyeF9jbGVhcl9zZ2VfbWFza19uZXh0X2VsZW1zKGZwKTsKLQl9Ci0KLQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAotCSAgICJmcC0+bGFzdF9tYXhfc2dlID0gJWQgIGZwLT5yeF9zZ2VfcHJvZCA9ICVkXG4iLAotCSAgIGZwLT5sYXN0X21heF9zZ2UsIGZwLT5yeF9zZ2VfcHJvZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X3NnZV9yaW5nX2JpdF9tYXNrKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCi17Ci0JLyogU2V0IHRoZSBtYXNrIHRvIGFsbCAxLXM6IGl0J3MgZmFzdGVyIHRvIGNvbXBhcmUgdG8gMCB0aGFuIHRvIDB4Zi1zICovCi0JbWVtc2V0KGZwLT5zZ2VfbWFzaywgMHhmZiwKLQkgICAgICAgKE5VTV9SWF9TR0UgPj4gUlhfU0dFX01BU0tfRUxFTV9TSElGVCkqc2l6ZW9mKHU2NCkpOwotCi0JLyogQ2xlYXIgdGhlIHR3byBsYXN0IGluZGljZXMgaW4gdGhlIHBhZ2UgdG8gMToKLQkgICB0aGVzZSBhcmUgdGhlIGluZGljZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSAibmV4dCIgZWxlbWVudCwKLQkgICBoZW5jZSB3aWxsIG5ldmVyIGJlIGluZGljYXRlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbQotCSAgIHRoZSBjYWxjdWxhdGlvbnMuICovCi0JYm54MnhfY2xlYXJfc2dlX21hc2tfbmV4dF9lbGVtcyhmcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3RwYV9zdGFydChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCB1MTYgcXVldWUsCi0JCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7Ci0Jc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107Ci0Jc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07Ci0Jc3RydWN0IGV0aF9yeF9iZCAqcHJvZF9iZCA9ICZmcC0+cnhfZGVzY19yaW5nW3Byb2RdOwotCWRtYV9hZGRyX3QgbWFwcGluZzsKLQotCS8qIG1vdmUgZW1wdHkgc2tiIGZyb20gcG9vbCB0byBwcm9kIGFuZCBtYXAgaXQgKi8KLQlwcm9kX3J4X2J1Zi0+c2tiID0gZnAtPnRwYV9wb29sW3F1ZXVlXS5za2I7Ci0JbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBmcC0+dHBhX3Bvb2xbcXVldWVdLnNrYi0+ZGF0YSwKLQkJCQkgYnAtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwotCWRtYV91bm1hcF9hZGRyX3NldChwcm9kX3J4X2J1ZiwgbWFwcGluZywgbWFwcGluZyk7Ci0KLQkvKiBtb3ZlIHBhcnRpYWwgc2tiIGZyb20gY29ucyB0byBwb29sIChkb24ndCB1bm1hcCB5ZXQpICovCi0JZnAtPnRwYV9wb29sW3F1ZXVlXSA9ICpjb25zX3J4X2J1ZjsKLQotCS8qIG1hcmsgYmluIHN0YXRlIGFzIHN0YXJ0IC0gcHJpbnQgZXJyb3IgaWYgY3VycmVudCBzdGF0ZSAhPSBzdG9wICovCi0JaWYgKGZwLT50cGFfc3RhdGVbcXVldWVdICE9IEJOWDJYX1RQQV9TVE9QKQotCQlCTlgyWF9FUlIoInN0YXJ0IG9mIGJpbiBub3QgaW4gc3RvcCBbJWRdXG4iLCBxdWV1ZSk7Ci0KLQlmcC0+dHBhX3N0YXRlW3F1ZXVlXSA9IEJOWDJYX1RQQV9TVEFSVDsKLQotCS8qIHBvaW50IHByb2RfYmQgdG8gbmV3IHNrYiAqLwotCXByb2RfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOwotCXByb2RfYmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihVNjRfTE8obWFwcGluZykpOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWZwLT50cGFfcXVldWVfdXNlZCB8PSAoMSA8PCBxdWV1ZSk7Ci0jaWZkZWYgX0FTTV9HRU5FUklDX0lOVF9MNjRfSAotCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJmcC0+dHBhX3F1ZXVlX3VzZWQgPSAweCVseFxuIiwKLSNlbHNlCi0JRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgImZwLT50cGFfcXVldWVfdXNlZCA9IDB4JWxseFxuIiwKLSNlbmRpZgotCSAgIGZwLT50cGFfcXVldWVfdXNlZCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCBibngyeF9maWxsX2ZyYWdfc2tiKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF9jcWUgKmZwX2NxZSwKLQkJCSAgICAgICB1MTYgY3FlX2lkeCkKLXsKLQlzdHJ1Y3Qgc3dfcnhfcGFnZSAqcnhfcGcsIG9sZF9yeF9wZzsKLQl1MTYgbGVuX29uX2JkID0gbGUxNl90b19jcHUoZnBfY3FlLT5sZW5fb25fYmQpOwotCXUzMiBpLCBmcmFnX2xlbiwgZnJhZ19zaXplLCBwYWdlczsKLQlpbnQgZXJyOwotCWludCBqOwotCi0JZnJhZ19zaXplID0gbGUxNl90b19jcHUoZnBfY3FlLT5wa3RfbGVuKSAtIGxlbl9vbl9iZDsKLQlwYWdlcyA9IFNHRV9QQUdFX0FMSUdOKGZyYWdfc2l6ZSkgPj4gU0dFX1BBR0VfU0hJRlQ7Ci0KLQkvKiBUaGlzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBlbmFibGUgZm9yd2FyZGluZyBzdXBwb3J0ICovCi0JaWYgKGZyYWdfc2l6ZSkKLQkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IG1pbigodTMyKVNHRV9QQUdFX1NJWkUsCi0JCQkJCSAgICAgICBtYXgoZnJhZ19zaXplLCAodTMyKWxlbl9vbl9iZCkpOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmIChwYWdlcyA+IG1pbl90KHUzMiwgOCwgTUFYX1NLQl9GUkFHUykqU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFKSB7Ci0JCUJOWDJYX0VSUigiU0dMIGxlbmd0aCBpcyB0b28gbG9uZzogJWQuIENRRSBpbmRleCBpcyAlZFxuIiwKLQkJCSAgcGFnZXMsIGNxZV9pZHgpOwotCQlCTlgyWF9FUlIoImZwX2NxZS0+cGt0X2xlbiA9ICVkICBmcF9jcWUtPmxlbl9vbl9iZCA9ICVkXG4iLAotCQkJICBmcF9jcWUtPnBrdF9sZW4sIGxlbl9vbl9iZCk7Ci0JCWJueDJ4X3BhbmljKCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLSNlbmRpZgotCi0JLyogUnVuIHRocm91Z2ggdGhlIFNHTCBhbmQgY29tcG9zZSB0aGUgZnJhZ21lbnRlZCBza2IgKi8KLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHBhZ2VzOyBpICs9IFBBR0VTX1BFUl9TR0UsIGorKykgewotCQl1MTYgc2dlX2lkeCA9IFJYX1NHRShsZTE2X3RvX2NwdShmcF9jcWUtPnNnbFtqXSkpOwotCi0JCS8qIEZXIGdpdmVzIHRoZSBpbmRpY2VzIG9mIHRoZSBTR0UgYXMgaWYgdGhlIHJpbmcgaXMgYW4gYXJyYXkKLQkJICAgKG1lYW5pbmcgdGhhdCAibmV4dCIgZWxlbWVudCB3aWxsIGNvbnN1bWUgMiBpbmRpY2VzKSAqLwotCQlmcmFnX2xlbiA9IG1pbihmcmFnX3NpemUsICh1MzIpKFNHRV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSkpOwotCQlyeF9wZyA9ICZmcC0+cnhfcGFnZV9yaW5nW3NnZV9pZHhdOwotCQlvbGRfcnhfcGcgPSAqcnhfcGc7Ci0KLQkJLyogSWYgd2UgZmFpbCB0byBhbGxvY2F0ZSBhIHN1YnN0aXR1dGUgcGFnZSwgd2Ugc2ltcGx5IHN0b3AKLQkJICAgd2hlcmUgd2UgYXJlIGFuZCBkcm9wIHRoZSB3aG9sZSBwYWNrZXQgKi8KLQkJZXJyID0gYm54MnhfYWxsb2Nfcnhfc2dlKGJwLCBmcCwgc2dlX2lkeCk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JCS8qIFVubWFwIHRoZSBwYWdlIGFzIHdlIHIgZ29pbmcgdG8gcGFzcyBpdCB0byB0aGUgc3RhY2sgKi8KLQkJZG1hX3VubWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsCi0JCQkgICAgICAgZG1hX3VubWFwX2FkZHIoJm9sZF9yeF9wZywgbWFwcGluZyksCi0JCQkgICAgICAgU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFLCBETUFfRlJPTV9ERVZJQ0UpOwotCi0JCS8qIEFkZCBvbmUgZnJhZyBhbmQgdXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIHNrYiAqLwotCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBqLCBvbGRfcnhfcGcucGFnZSwgMCwgZnJhZ19sZW4pOwotCi0JCXNrYi0+ZGF0YV9sZW4gKz0gZnJhZ19sZW47Ci0JCXNrYi0+dHJ1ZXNpemUgKz0gZnJhZ19sZW47Ci0JCXNrYi0+bGVuICs9IGZyYWdfbGVuOwotCi0JCWZyYWdfc2l6ZSAtPSBmcmFnX2xlbjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfdHBhX3N0b3Aoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKLQkJCSAgIHUxNiBxdWV1ZSwgaW50IHBhZCwgaW50IGxlbiwgdW5pb24gZXRoX3J4X2NxZSAqY3FlLAotCQkJICAgdTE2IGNxZV9pZHgpCi17Ci0Jc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnRwYV9wb29sW3F1ZXVlXTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7Ci0JLyogYWxsb2MgbmV3IHNrYiAqLwotCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBicC0+cnhfYnVmX3NpemUpOwotCi0JLyogVW5tYXAgc2tiIGluIHRoZSBwb29sIGFueXdheSwgYXMgd2UgYXJlIGdvaW5nIHRvIGNoYW5nZQotCSAgIHBvb2wgZW50cnkgc3RhdHVzIHRvIEJOWDJYX1RQQV9TVE9QIGV2ZW4gaWYgbmV3IHNrYiBhbGxvY2F0aW9uCi0JICAgZmFpbHMuICovCi0JZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKLQkJCSBicC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0KLQlpZiAobGlrZWx5KG5ld19za2IpKSB7Ci0JCS8qIGZpeCBpcCB4c3VtIGFuZCBnaXZlIGl0IHRvIHRoZSBzdGFjayAqLwotCQkvKiAobm8gbmVlZCB0byBtYXAgdGhlIG5ldyBza2IpICovCi0jaWZkZWYgQkNNX1ZMQU4KLQkJaW50IGlzX3ZsYW5fY3FlID0KLQkJCShsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykgJgotCQkJIFBBUlNJTkdfRkxBR1NfVkxBTik7Ci0JCWludCBpc19ub3RfaHdhY2NlbF92bGFuX2NxZSA9Ci0JCQkoaXNfdmxhbl9jcWUgJiYgKCEoYnAtPmZsYWdzICYgSFdfVkxBTl9SWF9GTEFHKSkpOwotI2VuZGlmCi0KLQkJcHJlZmV0Y2goc2tiKTsKLQkJcHJlZmV0Y2goKChjaGFyICopKHNrYikpICsgMTI4KTsKLQotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQkJaWYgKHBhZCArIGxlbiA+IGJwLT5yeF9idWZfc2l6ZSkgewotCQkJQk5YMlhfRVJSKCJza2JfcHV0IGlzIGFib3V0IHRvIGZhaWwuLi4gICIKLQkJCQkgICJwYWQgJWQgIGxlbiAlZCAgcnhfYnVmX3NpemUgJWRcbiIsCi0JCQkJICBwYWQsIGxlbiwgYnAtPnJ4X2J1Zl9zaXplKTsKLQkJCWJueDJ4X3BhbmljKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLSNlbmRpZgotCi0JCXNrYl9yZXNlcnZlKHNrYiwgcGFkKTsKLQkJc2tiX3B1dChza2IsIGxlbik7Ci0KLQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYnAtPmRldik7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0KLQkJewotCQkJc3RydWN0IGlwaGRyICppcGg7Ci0KLQkJCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7Ci0jaWZkZWYgQkNNX1ZMQU4KLQkJCS8qIElmIHRoZXJlIGlzIG5vIFJ4IFZMQU4gb2ZmbG9hZGluZyAtCi0JCQkgICB0YWtlIFZMQU4gdGFnIGludG8gYW4gYWNjb3VudCAqLwotCQkJaWYgKHVubGlrZWx5KGlzX25vdF9od2FjY2VsX3ZsYW5fY3FlKSkKLQkJCQlpcGggPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKWlwaCArIFZMQU5fSExFTik7Ci0jZW5kaWYKLQkJCWlwaC0+Y2hlY2sgPSAwOwotCQkJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodTggKilpcGgsIGlwaC0+aWhsKTsKLQkJfQotCi0JCWlmICghYm54MnhfZmlsbF9mcmFnX3NrYihicCwgZnAsIHNrYiwKLQkJCQkJICZjcWUtPmZhc3RfcGF0aF9jcWUsIGNxZV9pZHgpKSB7Ci0jaWZkZWYgQkNNX1ZMQU4KLQkJCWlmICgoYnAtPnZsZ3JwICE9IE5VTEwpICYmIGlzX3ZsYW5fY3FlICYmCi0JCQkgICAgKCFpc19ub3RfaHdhY2NlbF92bGFuX2NxZSkpCi0JCQkJdmxhbl9ncm9fcmVjZWl2ZSgmZnAtPm5hcGksIGJwLT52bGdycCwKLQkJCQkJCSBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUuCi0JCQkJCQkJICAgICB2bGFuX3RhZyksIHNrYik7Ci0JCQllbHNlCi0jZW5kaWYKLQkJCQluYXBpX2dyb19yZWNlaXZlKCZmcC0+bmFwaSwgc2tiKTsKLQkJfSBlbHNlIHsKLQkJCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBhZ2VzIgotCQkJICAgIiAtIGRyb3BwaW5nIHBhY2tldCFcbiIpOwotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQl9Ci0KLQotCQkvKiBwdXQgbmV3IHNrYiBpbiBiaW4gKi8KLQkJZnAtPnRwYV9wb29sW3F1ZXVlXS5za2IgPSBuZXdfc2tiOwotCi0JfSBlbHNlIHsKLQkJLyogZWxzZSBkcm9wIHRoZSBwYWNrZXQgYW5kIGtlZXAgdGhlIGJ1ZmZlciBpbiB0aGUgYmluICovCi0JCURQKE5FVElGX01TR19SWF9TVEFUVVMsCi0JCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHNrYiAtIGRyb3BwaW5nIHBhY2tldCFcbiIpOwotCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOwotCX0KLQotCWZwLT50cGFfc3RhdGVbcXVldWVdID0gQk5YMlhfVFBBX1NUT1A7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF91cGRhdGVfcnhfcHJvZChzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAotCQkJCQl1MTYgYmRfcHJvZCwgdTE2IHJ4X2NvbXBfcHJvZCwKLQkJCQkJdTE2IHJ4X3NnZV9wcm9kKQotewotCXN0cnVjdCB1c3Rvcm1fZXRoX3J4X3Byb2R1Y2VycyByeF9wcm9kcyA9IHswfTsKLQlpbnQgaTsKLQotCS8qIFVwZGF0ZSBwcm9kdWNlcnMgKi8KLQlyeF9wcm9kcy5iZF9wcm9kID0gYmRfcHJvZDsKLQlyeF9wcm9kcy5jcWVfcHJvZCA9IHJ4X2NvbXBfcHJvZDsKLQlyeF9wcm9kcy5zZ2VfcHJvZCA9IHJ4X3NnZV9wcm9kOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgQkQgYW5kIFNHRSBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZQotCSAqIHByb2R1Y2VycyBzaW5jZSBGVyBtaWdodCByZWFkIHRoZSBCRC9TR0UgcmlnaHQgYWZ0ZXIgdGhlIHByb2R1Y2VyCi0JICogaXMgdXBkYXRlZC4KLQkgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocyBzdWNoCi0JICogYXMgSUEtNjQuIFRoZSBmb2xsb3dpbmcgYmFycmllciBpcyBhbHNvIG1hbmRhdG9yeSBzaW5jZSBGVyB3aWxsCi0JICogYXNzdW1lcyBCRHMgbXVzdCBoYXZlIGJ1ZmZlcnMuCi0JICovCi0Jd21iKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB1c3Rvcm1fZXRoX3J4X3Byb2R1Y2VycykvNDsgaSsrKQotCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCSAgICAgICBVU1RPUk1fUlhfUFJPRFNfT0ZGU0VUKEJQX1BPUlQoYnApLCBmcC0+Y2xfaWQpICsgaSo0LAotCQkgICAgICAgKCh1MzIgKikmcnhfcHJvZHMpW2ldKTsKLQotCW1taW93YigpOyAvKiBrZWVwIHByb2QgdXBkYXRlcyBvcmRlcmVkICovCi0KLQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAotCSAgICJxdWV1ZVslZF06ICB3cm90ZSAgYmRfcHJvZCAldSAgY3FlX3Byb2QgJXUgIHNnZV9wcm9kICV1XG4iLAotCSAgIGZwLT5pbmRleCwgYmRfcHJvZCwgcnhfY29tcF9wcm9kLCByeF9zZ2VfcHJvZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfcnhfaW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIGludCBidWRnZXQpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKLQl1MTYgYmRfY29ucywgYmRfcHJvZCwgYmRfcHJvZF9mdywgY29tcF9yaW5nX2NvbnM7Ci0JdTE2IGh3X2NvbXBfY29ucywgc3dfY29tcF9jb25zLCBzd19jb21wX3Byb2Q7Ci0JaW50IHJ4X3BrdCA9IDA7Ci0KLSNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLQkvKiBDUSAibmV4dCBlbGVtZW50IiBpcyBvZiB0aGUgc2l6ZSBvZiB0aGUgcmVndWxhciBlbGVtZW50LAotCSAgIHRoYXQncyB3aHkgaXQncyBvayBoZXJlICovCi0JaHdfY29tcF9jb25zID0gbGUxNl90b19jcHUoKmZwLT5yeF9jb25zX3NiKTsKLQlpZiAoKGh3X2NvbXBfY29ucyAmIE1BWF9SQ1FfREVTQ19DTlQpID09IE1BWF9SQ1FfREVTQ19DTlQpCi0JCWh3X2NvbXBfY29ucysrOwotCi0JYmRfY29ucyA9IGZwLT5yeF9iZF9jb25zOwotCWJkX3Byb2QgPSBmcC0+cnhfYmRfcHJvZDsKLQliZF9wcm9kX2Z3ID0gYmRfcHJvZDsKLQlzd19jb21wX2NvbnMgPSBmcC0+cnhfY29tcF9jb25zOwotCXN3X2NvbXBfcHJvZCA9IGZwLT5yeF9jb21wX3Byb2Q7Ci0KLQkvKiBNZW1vcnkgYmFycmllciBuZWNlc3NhcnkgYXMgc3BlY3VsYXRpdmUgcmVhZHMgb2YgdGhlIHJ4Ci0JICogYnVmZmVyIGNhbiBiZSBhaGVhZCBvZiB0aGUgaW5kZXggaW4gdGhlIHN0YXR1cyBibG9jawotCSAqLwotCXJtYigpOwotCi0JRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKLQkgICAicXVldWVbJWRdOiAgaHdfY29tcF9jb25zICV1ICBzd19jb21wX2NvbnMgJXVcbiIsCi0JICAgZnAtPmluZGV4LCBod19jb21wX2NvbnMsIHN3X2NvbXBfY29ucyk7Ci0KLQl3aGlsZSAoc3dfY29tcF9jb25zICE9IGh3X2NvbXBfY29ucykgewotCQlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZiA9IE5VTEw7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCXVuaW9uIGV0aF9yeF9jcWUgKmNxZTsKLQkJdTggY3FlX2ZwX2ZsYWdzLCBjcWVfZnBfc3RhdHVzX2ZsYWdzOwotCQl1MTYgbGVuLCBwYWQ7Ci0KLQkJY29tcF9yaW5nX2NvbnMgPSBSQ1FfQkQoc3dfY29tcF9jb25zKTsKLQkJYmRfcHJvZCA9IFJYX0JEKGJkX3Byb2QpOwotCQliZF9jb25zID0gUlhfQkQoYmRfY29ucyk7Ci0KLQkJLyogUHJlZmV0Y2ggdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgQkQgZGVzY3JpcHRvcgotCQkgICBhdCBwcm9kdWNlcidzIGluZGV4LiBJdCB3aWxsIGJlIG5lZWRlZCB3aGVuIG5ldyBza2IgaXMKLQkJICAgYWxsb2NhdGVkICovCi0JCXByZWZldGNoKCh2b2lkICopKFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpCi0JCQkJCSAgICAgKCZmcC0+cnhfZGVzY19yaW5nW2JkX3Byb2RdKSkgLQotCQkJCSAgUEFHRV9TSVpFICsgMSkpOwotCi0JCWNxZSA9ICZmcC0+cnhfY29tcF9yaW5nW2NvbXBfcmluZ19jb25zXTsKLQkJY3FlX2ZwX2ZsYWdzID0gY3FlLT5mYXN0X3BhdGhfY3FlLnR5cGVfZXJyb3JfZmxhZ3M7Ci0JCWNxZV9mcF9zdGF0dXNfZmxhZ3MgPSBjcWUtPmZhc3RfcGF0aF9jcWUuc3RhdHVzX2ZsYWdzOwotCi0JCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJDUUUgdHlwZSAleCAgZXJyICV4ICBzdGF0dXMgJXgiCi0JCSAgICIgIHF1ZXVlICV4ICB2bGFuICV4ICBsZW4gJXVcbiIsIENRRV9UWVBFKGNxZV9mcF9mbGFncyksCi0JCSAgIGNxZV9mcF9mbGFncywgY3FlLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncywKLQkJICAgbGUzMl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnJzc19oYXNoX3Jlc3VsdCksCi0JCSAgIGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS52bGFuX3RhZyksCi0JCSAgIGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wa3RfbGVuKSk7Ci0KLQkJLyogaXMgdGhpcyBhIHNsb3dwYXRoIG1zZz8gKi8KLQkJaWYgKHVubGlrZWx5KENRRV9UWVBFKGNxZV9mcF9mbGFncykpKSB7Ci0JCQlibngyeF9zcF9ldmVudChmcCwgY3FlKTsKLQkJCWdvdG8gbmV4dF9jcWU7Ci0KLQkJLyogdGhpcyBpcyBhbiByeCBwYWNrZXQgKi8KLQkJfSBlbHNlIHsKLQkJCXJ4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbYmRfY29uc107Ci0JCQlza2IgPSByeF9idWYtPnNrYjsKLQkJCXByZWZldGNoKHNrYik7Ci0JCQlsZW4gPSBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGt0X2xlbik7Ci0JCQlwYWQgPSBjcWUtPmZhc3RfcGF0aF9jcWUucGxhY2VtZW50X29mZnNldDsKLQotCQkJLyogSWYgQ1FFIGlzIG1hcmtlZCBib3RoIFRQQV9TVEFSVCBhbmQgVFBBX0VORAotCQkJICAgaXQgaXMgYSBub24tVFBBIENRRSAqLwotCQkJaWYgKCghZnAtPmRpc2FibGVfdHBhKSAmJgotCQkJICAgIChUUEFfVFlQRShjcWVfZnBfZmxhZ3MpICE9Ci0JCQkJCShUUEFfVFlQRV9TVEFSVCB8IFRQQV9UWVBFX0VORCkpKSB7Ci0JCQkJdTE2IHF1ZXVlID0gY3FlLT5mYXN0X3BhdGhfY3FlLnF1ZXVlX2luZGV4OwotCi0JCQkJaWYgKFRQQV9UWVBFKGNxZV9mcF9mbGFncykgPT0gVFBBX1RZUEVfU1RBUlQpIHsKLQkJCQkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKLQkJCQkJICAgImNhbGxpbmcgdHBhX3N0YXJ0IG9uIHF1ZXVlICVkXG4iLAotCQkJCQkgICBxdWV1ZSk7Ci0KLQkJCQkJYm54MnhfdHBhX3N0YXJ0KGZwLCBxdWV1ZSwgc2tiLAotCQkJCQkJCWJkX2NvbnMsIGJkX3Byb2QpOwotCQkJCQlnb3RvIG5leHRfcng7Ci0JCQkJfQotCi0JCQkJaWYgKFRQQV9UWVBFKGNxZV9mcF9mbGFncykgPT0gVFBBX1RZUEVfRU5EKSB7Ci0JCQkJCURQKE5FVElGX01TR19SWF9TVEFUVVMsCi0JCQkJCSAgICJjYWxsaW5nIHRwYV9zdG9wIG9uIHF1ZXVlICVkXG4iLAotCQkJCQkgICBxdWV1ZSk7Ci0KLQkJCQkJaWYgKCFCTlgyWF9SWF9TVU1fRklYKGNxZSkpCi0JCQkJCQlCTlgyWF9FUlIoIlNUT1Agb24gbm9uZSBUQ1AgIgotCQkJCQkJCSAgImRhdGFcbiIpOwotCi0JCQkJCS8qIFRoaXMgaXMgYSBzaXplIG9mIHRoZSBsaW5lYXIgZGF0YQotCQkJCQkgICBvbiB0aGlzIHNrYiAqLwotCQkJCQlsZW4gPSBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUuCi0JCQkJCQkJCWxlbl9vbl9iZCk7Ci0JCQkJCWJueDJ4X3RwYV9zdG9wKGJwLCBmcCwgcXVldWUsIHBhZCwKLQkJCQkJCSAgICBsZW4sIGNxZSwgY29tcF9yaW5nX2NvbnMpOwotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQkJCQkJaWYgKGJwLT5wYW5pYykKLQkJCQkJCXJldHVybiAwOwotI2VuZGlmCi0KLQkJCQkJYm54MnhfdXBkYXRlX3NnZV9wcm9kKGZwLAotCQkJCQkJCSZjcWUtPmZhc3RfcGF0aF9jcWUpOwotCQkJCQlnb3RvIG5leHRfY3FlOwotCQkJCX0KLQkJCX0KLQotCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoJmJwLT5wZGV2LT5kZXYsCi0JCQkJCWRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCi0JCQkJCQkgICBwYWQgKyBSWF9DT1BZX1RIUkVTSCwKLQkJCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7Ci0JCQlwcmVmZXRjaCgoKGNoYXIgKikoc2tiKSkgKyAxMjgpOwotCi0JCQkvKiBpcyB0aGlzIGFuIGVycm9yIHBhY2tldD8gKi8KLQkJCWlmICh1bmxpa2VseShjcWVfZnBfZmxhZ3MgJiBFVEhfUlhfRVJST1JfRkFMR1MpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX1JYX0VSUiwKLQkJCQkgICAiRVJST1IgIGZsYWdzICV4ICByeCBwYWNrZXQgJXVcbiIsCi0JCQkJICAgY3FlX2ZwX2ZsYWdzLCBzd19jb21wX2NvbnMpOwotCQkJCWZwLT5ldGhfcV9zdGF0cy5yeF9lcnJfZGlzY2FyZF9wa3QrKzsKLQkJCQlnb3RvIHJldXNlX3J4OwotCQkJfQotCi0JCQkvKiBTaW5jZSB3ZSBkb24ndCBoYXZlIGEganVtYm8gcmluZwotCQkJICogY29weSBzbWFsbCBwYWNrZXRzIGlmIG10dSA+IDE1MDAKLQkJCSAqLwotCQkJaWYgKChicC0+ZGV2LT5tdHUgPiBFVEhfTUFYX1BBQ0tFVF9TSVpFKSAmJgotCQkJICAgIChsZW4gPD0gUlhfQ09QWV9USFJFU0gpKSB7Ci0JCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7Ci0KLQkJCQluZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LAotCQkJCQkJCSAgIGxlbiArIHBhZCk7Ci0JCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgewotCQkJCQlEUChORVRJRl9NU0dfUlhfRVJSLAotCQkJCQkgICAiRVJST1IgIHBhY2tldCBkcm9wcGVkICIKLQkJCQkJICAgImJlY2F1c2Ugb2YgYWxsb2MgZmFpbHVyZVxuIik7Ci0JCQkJCWZwLT5ldGhfcV9zdGF0cy5yeF9za2JfYWxsb2NfZmFpbGVkKys7Ci0JCQkJCWdvdG8gcmV1c2Vfcng7Ci0JCQkJfQotCi0JCQkJLyogYWxpZ25lZCBjb3B5ICovCi0JCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBwYWQsCi0JCQkJCQkgICAgbmV3X3NrYi0+ZGF0YSArIHBhZCwgbGVuKTsKLQkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBwYWQpOwotCQkJCXNrYl9wdXQobmV3X3NrYiwgbGVuKTsKLQotCQkJCWJueDJ4X3JldXNlX3J4X3NrYihmcCwgc2tiLCBiZF9jb25zLCBiZF9wcm9kKTsKLQotCQkJCXNrYiA9IG5ld19za2I7Ci0KLQkJCX0gZWxzZQotCQkJaWYgKGxpa2VseShibngyeF9hbGxvY19yeF9za2IoYnAsIGZwLCBiZF9wcm9kKSA9PSAwKSkgewotCQkJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsCi0JCQkJCWRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCi0JCQkJCQkgYnAtPnJ4X2J1Zl9zaXplLAotCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7Ci0JCQkJc2tiX3Jlc2VydmUoc2tiLCBwYWQpOwotCQkJCXNrYl9wdXQoc2tiLCBsZW4pOwotCi0JCQl9IGVsc2UgewotCQkJCURQKE5FVElGX01TR19SWF9FUlIsCi0JCQkJICAgIkVSUk9SICBwYWNrZXQgZHJvcHBlZCBiZWNhdXNlICIKLQkJCQkgICAib2YgYWxsb2MgZmFpbHVyZVxuIik7Ci0JCQkJZnAtPmV0aF9xX3N0YXRzLnJ4X3NrYl9hbGxvY19mYWlsZWQrKzsKLXJldXNlX3J4OgotCQkJCWJueDJ4X3JldXNlX3J4X3NrYihmcCwgc2tiLCBiZF9jb25zLCBiZF9wcm9kKTsKLQkJCQlnb3RvIG5leHRfcng7Ci0JCQl9Ci0KLQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOwotCi0JCQlpZiAoKGJwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpICYmCi0JCQkgICAgKGNxZV9mcF9zdGF0dXNfZmxhZ3MgJgotCQkJICAgICBFVEhfRkFTVF9QQVRIX1JYX0NRRV9SU1NfSEFTSF9GTEcpKQotCQkJCXNrYi0+cnhoYXNoID0gbGUzMl90b19jcHUoCi0JCQkJICAgIGNxZS0+ZmFzdF9wYXRoX2NxZS5yc3NfaGFzaF9yZXN1bHQpOwotCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCQlpZiAoYnAtPnJ4X2NzdW0pIHsKLQkJCQlpZiAobGlrZWx5KEJOWDJYX1JYX0NTVU1fT0soY3FlKSkpCi0JCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JCQkJZWxzZQotCQkJCQlmcC0+ZXRoX3Ffc3RhdHMuaHdfY3N1bV9lcnIrKzsKLQkJCX0KLQkJfQotCi0JCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBmcC0+aW5kZXgpOwotCi0jaWZkZWYgQkNNX1ZMQU4KLQkJaWYgKChicC0+dmxncnAgIT0gTlVMTCkgJiYgKGJwLT5mbGFncyAmIEhXX1ZMQU5fUlhfRkxBRykgJiYKLQkJICAgIChsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykgJgotCQkgICAgIFBBUlNJTkdfRkxBR1NfVkxBTikpCi0JCQl2bGFuX2dyb19yZWNlaXZlKCZmcC0+bmFwaSwgYnAtPnZsZ3JwLAotCQkJCWxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS52bGFuX3RhZyksIHNrYik7Ci0JCWVsc2UKLSNlbmRpZgotCQkJbmFwaV9ncm9fcmVjZWl2ZSgmZnAtPm5hcGksIHNrYik7Ci0KLQotbmV4dF9yeDoKLQkJcnhfYnVmLT5za2IgPSBOVUxMOwotCi0JCWJkX2NvbnMgPSBORVhUX1JYX0lEWChiZF9jb25zKTsKLQkJYmRfcHJvZCA9IE5FWFRfUlhfSURYKGJkX3Byb2QpOwotCQliZF9wcm9kX2Z3ID0gTkVYVF9SWF9JRFgoYmRfcHJvZF9mdyk7Ci0JCXJ4X3BrdCsrOwotbmV4dF9jcWU6Ci0JCXN3X2NvbXBfcHJvZCA9IE5FWFRfUkNRX0lEWChzd19jb21wX3Byb2QpOwotCQlzd19jb21wX2NvbnMgPSBORVhUX1JDUV9JRFgoc3dfY29tcF9jb25zKTsKLQotCQlpZiAocnhfcGt0ID09IGJ1ZGdldCkKLQkJCWJyZWFrOwotCX0gLyogd2hpbGUgKi8KLQotCWZwLT5yeF9iZF9jb25zID0gYmRfY29uczsKLQlmcC0+cnhfYmRfcHJvZCA9IGJkX3Byb2RfZnc7Ci0JZnAtPnJ4X2NvbXBfY29ucyA9IHN3X2NvbXBfY29uczsKLQlmcC0+cnhfY29tcF9wcm9kID0gc3dfY29tcF9wcm9kOwotCi0JLyogVXBkYXRlIHByb2R1Y2VycyAqLwotCWJueDJ4X3VwZGF0ZV9yeF9wcm9kKGJwLCBmcCwgYmRfcHJvZF9mdywgc3dfY29tcF9wcm9kLAotCQkJICAgICBmcC0+cnhfc2dlX3Byb2QpOwotCi0JZnAtPnJ4X3BrdCArPSByeF9wa3Q7Ci0JZnAtPnJ4X2NhbGxzKys7Ci0KLQlyZXR1cm4gcnhfcGt0OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYm54MnhfbXNpeF9mcF9pbnQoaW50IGlycSwgdm9pZCAqZnBfY29va2llKQotewotCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSBmcF9jb29raWU7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKLQotCS8qIFJldHVybiBoZXJlIGlmIGludGVycnVwdCBpcyBkaXNhYmxlZCAqLwotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKSkgewotCQlEUChORVRJRl9NU0dfSU5UUiwgImNhbGxlZCBidXQgaW50cl9zZW0gbm90IDAsIHJldHVybmluZ1xuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlEUChCTlgyWF9NU0dfRlAsICJnb3QgYW4gTVNJLVggaW50ZXJydXB0IG9uIElEWDpTQiBbJWQ6JWRdXG4iLAotCSAgIGZwLT5pbmRleCwgZnAtPnNiX2lkKTsKLQlibngyeF9hY2tfc2IoYnAsIGZwLT5zYl9pZCwgVVNUT1JNX0lELCAwLCBJR1VfSU5UX0RJU0FCTEUsIDApOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0jZW5kaWYKLQotCS8qIEhhbmRsZSBSeCBhbmQgVHggYWNjb3JkaW5nIHRvIE1TSS1YIHZlY3RvciAqLwotCXByZWZldGNoKGZwLT5yeF9jb25zX3NiKTsKLQlwcmVmZXRjaChmcC0+dHhfY29uc19zYik7Ci0JcHJlZmV0Y2goJmZwLT5zdGF0dXNfYmxrLT51X3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpOwotCXByZWZldGNoKCZmcC0+c3RhdHVzX2Jsay0+Y19zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4KTsKLQluYXBpX3NjaGVkdWxlKCZibngyeF9mcChicCwgZnAtPmluZGV4LCBuYXBpKSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBibngyeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXZfaW5zdGFuY2UpOwotCXUxNiBzdGF0dXMgPSBibngyeF9hY2tfaW50KGJwKTsKLQl1MTYgbWFzazsKLQlpbnQgaTsKLQotCS8qIFJldHVybiBoZXJlIGlmIGludGVycnVwdCBpcyBzaGFyZWQgYW5kIGl0J3Mgbm90IGZvciB1cyAqLwotCWlmICh1bmxpa2VseShzdGF0dXMgPT0gMCkpIHsKLQkJRFAoTkVUSUZfTVNHX0lOVFIsICJub3Qgb3VyIGludGVycnVwdCFcbiIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCURQKE5FVElGX01TR19JTlRSLCAiZ290IGFuIGludGVycnVwdCAgc3RhdHVzIDB4JXhcbiIsIHN0YXR1cyk7Ci0KLQkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgKi8KLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkpIHsKLQkJRFAoTkVUSUZfTVNHX0lOVFIsICJjYWxsZWQgYnV0IGludHJfc2VtIG5vdCAwLCByZXR1cm5pbmdcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0jZW5kaWYKLQotCWZvciAoaSA9IDA7IGkgPCBCTlgyWF9OVU1fUVVFVUVTKGJwKTsgaSsrKSB7Ci0JCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOwotCi0JCW1hc2sgPSAweDIgPDwgZnAtPnNiX2lkOwotCQlpZiAoc3RhdHVzICYgbWFzaykgewotCQkJLyogSGFuZGxlIFJ4IGFuZCBUeCBhY2NvcmRpbmcgdG8gU0IgaWQgKi8KLQkJCXByZWZldGNoKGZwLT5yeF9jb25zX3NiKTsKLQkJCXByZWZldGNoKCZmcC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suCi0JCQkJCQlzdGF0dXNfYmxvY2tfaW5kZXgpOwotCQkJcHJlZmV0Y2goZnAtPnR4X2NvbnNfc2IpOwotCQkJcHJlZmV0Y2goJmZwLT5zdGF0dXNfYmxrLT5jX3N0YXR1c19ibG9jay4KLQkJCQkJCXN0YXR1c19ibG9ja19pbmRleCk7Ci0JCQluYXBpX3NjaGVkdWxlKCZibngyeF9mcChicCwgZnAtPmluZGV4LCBuYXBpKSk7Ci0JCQlzdGF0dXMgJj0gfm1hc2s7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBCQ01fQ05JQwotCW1hc2sgPSAweDIgPDwgQ05JQ19TQl9JRChicCk7Ci0JaWYgKHN0YXR1cyAmIChtYXNrIHwgMHgxKSkgewotCQlzdHJ1Y3QgY25pY19vcHMgKmNfb3BzID0gTlVMTDsKLQotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWNfb3BzID0gcmN1X2RlcmVmZXJlbmNlKGJwLT5jbmljX29wcyk7Ci0JCWlmIChjX29wcykKLQkJCWNfb3BzLT5jbmljX2hhbmRsZXIoYnAtPmNuaWNfZGF0YSwgTlVMTCk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCi0JCXN0YXR1cyAmPSB+bWFzazsKLQl9Ci0jZW5kaWYKLQotCWlmICh1bmxpa2VseShzdGF0dXMgJiAweDEpKSB7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhibngyeF93cSwgJmJwLT5zcF90YXNrLCAwKTsKLQotCQlzdGF0dXMgJj0gfjB4MTsKLQkJaWYgKCFzdGF0dXMpCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHN0YXR1cykpCi0JCURQKE5FVElGX01TR19JTlRSLCAiZ290IGFuIHVua25vd24gaW50ZXJydXB0ISAoc3RhdHVzIDB4JXgpXG4iLAotCQkgICBzdGF0dXMpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiBlbmQgb2YgZmFzdCBwYXRoICovCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX2hhbmRsZShzdHJ1Y3QgYm54MnggKmJwLCBlbnVtIGJueDJ4X3N0YXRzX2V2ZW50IGV2ZW50KTsKLQotLyogTGluayAqLwotCi0vKgotICogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyBpbnQgYm54MnhfYWNxdWlyZV9od19sb2NrKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZXNvdXJjZSkKLXsKLQl1MzIgbG9ja19zdGF0dXM7Ci0JdTMyIHJlc291cmNlX2JpdCA9ICgxIDw8IHJlc291cmNlKTsKLQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwotCXUzMiBod19sb2NrX2NvbnRyb2xfcmVnOwotCWludCBjbnQ7Ci0KLQkvKiBWYWxpZGF0aW5nIHRoYXQgdGhlIHJlc291cmNlIGlzIHdpdGhpbiByYW5nZSAqLwotCWlmIChyZXNvdXJjZSA+IEhXX0xPQ0tfTUFYX1JFU09VUkNFX1ZBTFVFKSB7Ci0JCURQKE5FVElGX01TR19IVywKLQkJICAgInJlc291cmNlKDB4JXgpID4gSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUoMHgleClcbiIsCi0JCSAgIHJlc291cmNlLCBIV19MT0NLX01BWF9SRVNPVVJDRV9WQUxVRSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChmdW5jIDw9IDUpIHsKLQkJaHdfbG9ja19jb250cm9sX3JlZyA9IChNSVNDX1JFR19EUklWRVJfQ09OVFJPTF8xICsgZnVuYyo4KTsKLQl9IGVsc2UgewotCQlod19sb2NrX2NvbnRyb2xfcmVnID0KLQkJCQkoTUlTQ19SRUdfRFJJVkVSX0NPTlRST0xfNyArIChmdW5jIC0gNikqOCk7Ci0JfQotCi0JLyogVmFsaWRhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBpcyBub3QgYWxyZWFkeSB0YWtlbiAqLwotCWxvY2tfc3RhdHVzID0gUkVHX1JEKGJwLCBod19sb2NrX2NvbnRyb2xfcmVnKTsKLQlpZiAobG9ja19zdGF0dXMgJiByZXNvdXJjZV9iaXQpIHsKLQkJRFAoTkVUSUZfTVNHX0hXLCAibG9ja19zdGF0dXMgMHgleCAgcmVzb3VyY2VfYml0IDB4JXhcbiIsCi0JCSAgIGxvY2tfc3RhdHVzLCByZXNvdXJjZV9iaXQpOwotCQlyZXR1cm4gLUVFWElTVDsKLQl9Ci0KLQkvKiBUcnkgZm9yIDUgc2Vjb25kIGV2ZXJ5IDVtcyAqLwotCWZvciAoY250ID0gMDsgY250IDwgMTAwMDsgY250KyspIHsKLQkJLyogVHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKi8KLQkJUkVHX1dSKGJwLCBod19sb2NrX2NvbnRyb2xfcmVnICsgNCwgcmVzb3VyY2VfYml0KTsKLQkJbG9ja19zdGF0dXMgPSBSRUdfUkQoYnAsIGh3X2xvY2tfY29udHJvbF9yZWcpOwotCQlpZiAobG9ja19zdGF0dXMgJiByZXNvdXJjZV9iaXQpCi0JCQlyZXR1cm4gMDsKLQotCQltc2xlZXAoNSk7Ci0JfQotCURQKE5FVElGX01TR19IVywgIlRpbWVvdXRcbiIpOwotCXJldHVybiAtRUFHQUlOOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3JlbGVhc2VfaHdfbG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzb3VyY2UpCi17Ci0JdTMyIGxvY2tfc3RhdHVzOwotCXUzMiByZXNvdXJjZV9iaXQgPSAoMSA8PCByZXNvdXJjZSk7Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQl1MzIgaHdfbG9ja19jb250cm9sX3JlZzsKLQotCURQKE5FVElGX01TR19IVywgIlJlbGVhc2luZyBhIGxvY2sgb24gcmVzb3VyY2UgJWRcbiIsIHJlc291cmNlKTsKLQotCS8qIFZhbGlkYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaXMgd2l0aGluIHJhbmdlICovCi0JaWYgKHJlc291cmNlID4gSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUpIHsKLQkJRFAoTkVUSUZfTVNHX0hXLAotCQkgICAicmVzb3VyY2UoMHgleCkgPiBIV19MT0NLX01BWF9SRVNPVVJDRV9WQUxVRSgweCV4KVxuIiwKLQkJICAgcmVzb3VyY2UsIEhXX0xPQ0tfTUFYX1JFU09VUkNFX1ZBTFVFKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGZ1bmMgPD0gNSkgewotCQlod19sb2NrX2NvbnRyb2xfcmVnID0gKE1JU0NfUkVHX0RSSVZFUl9DT05UUk9MXzEgKyBmdW5jKjgpOwotCX0gZWxzZSB7Ci0JCWh3X2xvY2tfY29udHJvbF9yZWcgPQotCQkJCShNSVNDX1JFR19EUklWRVJfQ09OVFJPTF83ICsgKGZ1bmMgLSA2KSo4KTsKLQl9Ci0KLQkvKiBWYWxpZGF0aW5nIHRoYXQgdGhlIHJlc291cmNlIGlzIGN1cnJlbnRseSB0YWtlbiAqLwotCWxvY2tfc3RhdHVzID0gUkVHX1JEKGJwLCBod19sb2NrX2NvbnRyb2xfcmVnKTsKLQlpZiAoIShsb2NrX3N0YXR1cyAmIHJlc291cmNlX2JpdCkpIHsKLQkJRFAoTkVUSUZfTVNHX0hXLCAibG9ja19zdGF0dXMgMHgleCAgcmVzb3VyY2VfYml0IDB4JXhcbiIsCi0JCSAgIGxvY2tfc3RhdHVzLCByZXNvdXJjZV9iaXQpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlSRUdfV1IoYnAsIGh3X2xvY2tfY29udHJvbF9yZWcsIHJlc291cmNlX2JpdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEhXIExvY2sgZm9yIHNoYXJlZCBkdWFsIHBvcnQgUEhZcyAqLwotc3RhdGljIHZvaWQgYm54MnhfYWNxdWlyZV9waHlfbG9jayhzdHJ1Y3QgYm54MnggKmJwKQotewotCW11dGV4X2xvY2soJmJwLT5wb3J0LnBoeV9tdXRleCk7Ci0KLQlpZiAoYnAtPnBvcnQubmVlZF9od19sb2NrKQotCQlibngyeF9hY3F1aXJlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfTURJTyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3JlbGVhc2VfcGh5X2xvY2soc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoYnAtPnBvcnQubmVlZF9od19sb2NrKQotCQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfTURJTyk7Ci0KLQltdXRleF91bmxvY2soJmJwLT5wb3J0LnBoeV9tdXRleCk7Ci19Ci0KLWludCBibngyeF9nZXRfZ3BpbyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZ3Bpb19udW0sIHU4IHBvcnQpCi17Ci0JLyogVGhlIEdQSU8gc2hvdWxkIGJlIHN3YXBwZWQgaWYgc3dhcCByZWdpc3RlciBpcyBzZXQgYW5kIGFjdGl2ZSAqLwotCWludCBncGlvX3BvcnQgPSAoUkVHX1JEKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCkgJiYKLQkJCSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpKSBeIHBvcnQ7Ci0JaW50IGdwaW9fc2hpZnQgPSBncGlvX251bSArCi0JCQkoZ3Bpb19wb3J0ID8gTUlTQ19SRUdJU1RFUlNfR1BJT19QT1JUX1NISUZUIDogMCk7Ci0JdTMyIGdwaW9fbWFzayA9ICgxIDw8IGdwaW9fc2hpZnQpOwotCXUzMiBncGlvX3JlZzsKLQlpbnQgdmFsdWU7Ci0KLQlpZiAoZ3Bpb19udW0gPiBNSVNDX1JFR0lTVEVSU19HUElPXzMpIHsKLQkJQk5YMlhfRVJSKCJJbnZhbGlkIEdQSU8gJWRcbiIsIGdwaW9fbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogcmVhZCBHUElPIHZhbHVlICovCi0JZ3Bpb19yZWcgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0dQSU8pOwotCi0JLyogZ2V0IHRoZSByZXF1ZXN0ZWQgcGluIHZhbHVlICovCi0JaWYgKChncGlvX3JlZyAmIGdwaW9fbWFzaykgPT0gZ3Bpb19tYXNrKQotCQl2YWx1ZSA9IDE7Ci0JZWxzZQotCQl2YWx1ZSA9IDA7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgInBpbiAlZCAgdmFsdWUgMHgleFxuIiwgZ3Bpb19udW0sIHZhbHVlKTsKLQotCXJldHVybiB2YWx1ZTsKLX0KLQotaW50IGJueDJ4X3NldF9ncGlvKHN0cnVjdCBibngyeCAqYnAsIGludCBncGlvX251bSwgdTMyIG1vZGUsIHU4IHBvcnQpCi17Ci0JLyogVGhlIEdQSU8gc2hvdWxkIGJlIHN3YXBwZWQgaWYgc3dhcCByZWdpc3RlciBpcyBzZXQgYW5kIGFjdGl2ZSAqLwotCWludCBncGlvX3BvcnQgPSAoUkVHX1JEKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCkgJiYKLQkJCSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpKSBeIHBvcnQ7Ci0JaW50IGdwaW9fc2hpZnQgPSBncGlvX251bSArCi0JCQkoZ3Bpb19wb3J0ID8gTUlTQ19SRUdJU1RFUlNfR1BJT19QT1JUX1NISUZUIDogMCk7Ci0JdTMyIGdwaW9fbWFzayA9ICgxIDw8IGdwaW9fc2hpZnQpOwotCXUzMiBncGlvX3JlZzsKLQotCWlmIChncGlvX251bSA+IE1JU0NfUkVHSVNURVJTX0dQSU9fMykgewotCQlCTlgyWF9FUlIoIkludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpb19udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlibngyeF9hY3F1aXJlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfR1BJTyk7Ci0JLyogcmVhZCBHUElPIGFuZCBtYXNrIGV4Y2VwdCB0aGUgZmxvYXQgYml0cyAqLwotCWdwaW9fcmVnID0gKFJFR19SRChicCwgTUlTQ19SRUdfR1BJTykgJiBNSVNDX1JFR0lTVEVSU19HUElPX0ZMT0FUKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XOgotCQlEUChORVRJRl9NU0dfTElOSywgIlNldCBHUElPICVkIChzaGlmdCAlZCkgLT4gb3V0cHV0IGxvd1xuIiwKLQkJICAgZ3Bpb19udW0sIGdwaW9fc2hpZnQpOwotCQkvKiBjbGVhciBGTE9BVCBhbmQgc2V0IENMUiAqLwotCQlncGlvX3JlZyAmPSB+KGdwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0ZMT0FUX1BPUyk7Ci0JCWdwaW9fcmVnIHw9ICAoZ3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fQ0xSX1BPUyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdIOgotCQlEUChORVRJRl9NU0dfTElOSywgIlNldCBHUElPICVkIChzaGlmdCAlZCkgLT4gb3V0cHV0IGhpZ2hcbiIsCi0JCSAgIGdwaW9fbnVtLCBncGlvX3NoaWZ0KTsKLQkJLyogY2xlYXIgRkxPQVQgYW5kIHNldCBTRVQgKi8KLQkJZ3Bpb19yZWcgJj0gfihncGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfR1BJT19GTE9BVF9QT1MpOwotCQlncGlvX3JlZyB8PSAgKGdwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19HUElPX1NFVF9QT1MpOwotCQlicmVhazsKLQotCWNhc2UgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlBVVF9ISV9aOgotCQlEUChORVRJRl9NU0dfTElOSywgIlNldCBHUElPICVkIChzaGlmdCAlZCkgLT4gaW5wdXRcbiIsCi0JCSAgIGdwaW9fbnVtLCBncGlvX3NoaWZ0KTsKLQkJLyogc2V0IEZMT0FUICovCi0JCWdwaW9fcmVnIHw9IChncGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfR1BJT19GTE9BVF9QT1MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCVJFR19XUihicCwgTUlTQ19SRUdfR1BJTywgZ3Bpb19yZWcpOwotCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9HUElPKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYm54Mnhfc2V0X2dwaW9faW50KHN0cnVjdCBibngyeCAqYnAsIGludCBncGlvX251bSwgdTMyIG1vZGUsIHU4IHBvcnQpCi17Ci0JLyogVGhlIEdQSU8gc2hvdWxkIGJlIHN3YXBwZWQgaWYgc3dhcCByZWdpc3RlciBpcyBzZXQgYW5kIGFjdGl2ZSAqLwotCWludCBncGlvX3BvcnQgPSAoUkVHX1JEKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCkgJiYKLQkJCSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpKSBeIHBvcnQ7Ci0JaW50IGdwaW9fc2hpZnQgPSBncGlvX251bSArCi0JCQkoZ3Bpb19wb3J0ID8gTUlTQ19SRUdJU1RFUlNfR1BJT19QT1JUX1NISUZUIDogMCk7Ci0JdTMyIGdwaW9fbWFzayA9ICgxIDw8IGdwaW9fc2hpZnQpOwotCXUzMiBncGlvX3JlZzsKLQotCWlmIChncGlvX251bSA+IE1JU0NfUkVHSVNURVJTX0dQSU9fMykgewotCQlCTlgyWF9FUlIoIkludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpb19udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlibngyeF9hY3F1aXJlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfR1BJTyk7Ci0JLyogcmVhZCBHUElPIGludCAqLwotCWdwaW9fcmVnID0gUkVHX1JEKGJwLCBNSVNDX1JFR19HUElPX0lOVCk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX09VVFBVVF9DTFI6Ci0JCURQKE5FVElGX01TR19MSU5LLCAiQ2xlYXIgR1BJTyBJTlQgJWQgKHNoaWZ0ICVkKSAtPiAiCi0JCQkJICAgIm91dHB1dCBsb3dcbiIsIGdwaW9fbnVtLCBncGlvX3NoaWZ0KTsKLQkJLyogY2xlYXIgU0VUIGFuZCBzZXQgQ0xSICovCi0JCWdwaW9fcmVnICY9IH4oZ3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX1NFVF9QT1MpOwotCQlncGlvX3JlZyB8PSAgKGdwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0lOVF9DTFJfUE9TKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX09VVFBVVF9TRVQ6Ci0JCURQKE5FVElGX01TR19MSU5LLCAiU2V0IEdQSU8gSU5UICVkIChzaGlmdCAlZCkgLT4gIgotCQkJCSAgICJvdXRwdXQgaGlnaFxuIiwgZ3Bpb19udW0sIGdwaW9fc2hpZnQpOwotCQkvKiBjbGVhciBDTFIgYW5kIHNldCBTRVQgKi8KLQkJZ3Bpb19yZWcgJj0gfihncGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfQ0xSX1BPUyk7Ci0JCWdwaW9fcmVnIHw9ICAoZ3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX1NFVF9QT1MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCVJFR19XUihicCwgTUlTQ19SRUdfR1BJT19JTlQsIGdwaW9fcmVnKTsKLQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfR1BJTyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBibngyeF9zZXRfc3BpbyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc3Bpb19udW0sIHUzMiBtb2RlKQotewotCXUzMiBzcGlvX21hc2sgPSAoMSA8PCBzcGlvX251bSk7Ci0JdTMyIHNwaW9fcmVnOwotCi0JaWYgKChzcGlvX251bSA8IE1JU0NfUkVHSVNURVJTX1NQSU9fNCkgfHwKLQkgICAgKHNwaW9fbnVtID4gTUlTQ19SRUdJU1RFUlNfU1BJT183KSkgewotCQlCTlgyWF9FUlIoIkludmFsaWQgU1BJTyAlZFxuIiwgc3Bpb19udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlibngyeF9hY3F1aXJlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfU1BJTyk7Ci0JLyogcmVhZCBTUElPIGFuZCBtYXNrIGV4Y2VwdCB0aGUgZmxvYXQgYml0cyAqLwotCXNwaW9fcmVnID0gKFJFR19SRChicCwgTUlTQ19SRUdfU1BJTykgJiBNSVNDX1JFR0lTVEVSU19TUElPX0ZMT0FUKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTUlTQ19SRUdJU1RFUlNfU1BJT19PVVRQVVRfTE9XOgotCQlEUChORVRJRl9NU0dfTElOSywgIlNldCBTUElPICVkIC0+IG91dHB1dCBsb3dcbiIsIHNwaW9fbnVtKTsKLQkJLyogY2xlYXIgRkxPQVQgYW5kIHNldCBDTFIgKi8KLQkJc3Bpb19yZWcgJj0gfihzcGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfU1BJT19GTE9BVF9QT1MpOwotCQlzcGlvX3JlZyB8PSAgKHNwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19TUElPX0NMUl9QT1MpOwotCQlicmVhazsKLQotCWNhc2UgTUlTQ19SRUdJU1RFUlNfU1BJT19PVVRQVVRfSElHSDoKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXQgU1BJTyAlZCAtPiBvdXRwdXQgaGlnaFxuIiwgc3Bpb19udW0pOwotCQkvKiBjbGVhciBGTE9BVCBhbmQgc2V0IFNFVCAqLwotCQlzcGlvX3JlZyAmPSB+KHNwaW9fbWFzayA8PCBNSVNDX1JFR0lTVEVSU19TUElPX0ZMT0FUX1BPUyk7Ci0JCXNwaW9fcmVnIHw9ICAoc3Bpb19tYXNrIDw8IE1JU0NfUkVHSVNURVJTX1NQSU9fU0VUX1BPUyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNSVNDX1JFR0lTVEVSU19TUElPX0lOUFVUX0hJX1o6Ci0JCURQKE5FVElGX01TR19MSU5LLCAiU2V0IFNQSU8gJWQgLT4gaW5wdXRcbiIsIHNwaW9fbnVtKTsKLQkJLyogc2V0IEZMT0FUICovCi0JCXNwaW9fcmVnIHw9IChzcGlvX21hc2sgPDwgTUlTQ19SRUdJU1RFUlNfU1BJT19GTE9BVF9QT1MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCVJFR19XUihicCwgTUlTQ19SRUdfU1BJTywgc3Bpb19yZWcpOwotCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9TUElPKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9jYWxjX2ZjX2FkdihzdHJ1Y3QgYm54MnggKmJwKQotewotCXN3aXRjaCAoYnAtPmxpbmtfdmFycy5pZWVlX2ZjICYKLQkJTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfTUFTSykgewotCWNhc2UgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfTk9ORToKLQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEX0FzeW1fUGF1c2UgfAotCQkJCQkgIEFEVkVSVElTRURfUGF1c2UpOwotCQlicmVhazsKLQotCWNhc2UgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDoKLQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgfD0gKEFEVkVSVElTRURfQXN5bV9QYXVzZSB8Ci0JCQkJCSBBRFZFUlRJU0VEX1BhdXNlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUM6Ci0JCWJwLT5wb3J0LmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicC0+cG9ydC5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfQXN5bV9QYXVzZSB8Ci0JCQkJCSAgQURWRVJUSVNFRF9QYXVzZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfbGlua19yZXBvcnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoYnAtPmZsYWdzICYgTUZfRlVOQ19ESVMpIHsKLQkJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7Ci0JCW5ldGRldl9lcnIoYnAtPmRldiwgIk5JQyBMaW5rIGlzIERvd25cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJwLT5saW5rX3ZhcnMubGlua191cCkgewotCQl1MTYgbGluZV9zcGVlZDsKLQotCQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pCi0JCQluZXRpZl9jYXJyaWVyX29uKGJwLT5kZXYpOwotCQluZXRkZXZfaW5mbyhicC0+ZGV2LCAiTklDIExpbmsgaXMgVXAsICIpOwotCi0JCWxpbmVfc3BlZWQgPSBicC0+bGlua192YXJzLmxpbmVfc3BlZWQ7Ci0JCWlmIChJU19FMUhNRihicCkpIHsKLQkJCXUxNiB2bl9tYXhfcmF0ZTsKLQotCQkJdm5fbWF4X3JhdGUgPQotCQkJCSgoYnAtPm1mX2NvbmZpZyAmIEZVTkNfTUZfQ0ZHX01BWF9CV19NQVNLKSA+PgotCQkJCSBGVU5DX01GX0NGR19NQVhfQldfU0hJRlQpICogMTAwOwotCQkJaWYgKHZuX21heF9yYXRlIDwgbGluZV9zcGVlZCkKLQkJCQlsaW5lX3NwZWVkID0gdm5fbWF4X3JhdGU7Ci0JCX0KLQkJcHJfY29udCgiJWQgTWJwcyAiLCBsaW5lX3NwZWVkKTsKLQotCQlpZiAoYnAtPmxpbmtfdmFycy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQlwcl9jb250KCJmdWxsIGR1cGxleCIpOwotCQllbHNlCi0JCQlwcl9jb250KCJoYWxmIGR1cGxleCIpOwotCi0JCWlmIChicC0+bGlua192YXJzLmZsb3dfY3RybCAhPSBCTlgyWF9GTE9XX0NUUkxfTk9ORSkgewotCQkJaWYgKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1JYKSB7Ci0JCQkJcHJfY29udCgiLCByZWNlaXZlICIpOwotCQkJCWlmIChicC0+bGlua192YXJzLmZsb3dfY3RybCAmCi0JCQkJICAgIEJOWDJYX0ZMT1dfQ1RSTF9UWCkKLQkJCQkJcHJfY29udCgiJiB0cmFuc21pdCAiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfY29udCgiLCB0cmFuc21pdCAiKTsKLQkJCX0KLQkJCXByX2NvbnQoImZsb3cgY29udHJvbCBPTiIpOwotCQl9Ci0JCXByX2NvbnQoIlxuIik7Ci0KLQl9IGVsc2UgeyAvKiBsaW5rX2Rvd24gKi8KLQkJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7Ci0JCW5ldGRldl9lcnIoYnAtPmRldiwgIk5JQyBMaW5rIGlzIERvd25cbiIpOwotCX0KLX0KLQotc3RhdGljIHU4IGJueDJ4X2luaXRpYWxfcGh5X2luaXQoc3RydWN0IGJueDJ4ICpicCwgaW50IGxvYWRfbW9kZSkKLXsKLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQl1OCByYzsKLQotCQkvKiBJbml0aWFsaXplIGxpbmsgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdmFyaWFibGVzICovCi0JCS8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHR1cm4gb2ZmIFJYIEZDIGZvciBqdW1ibyBmcmFtZXMKLQkJICAgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAqLwotCQlpZiAoYnAtPmRldi0+bXR1ID4gNTAwMCkKLQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfZmNfYXV0b19hZHYgPSBCTlgyWF9GTE9XX0NUUkxfVFg7Ci0JCWVsc2UKLQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfZmNfYXV0b19hZHYgPSBCTlgyWF9GTE9XX0NUUkxfQk9USDsKLQotCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKLQotCQlpZiAobG9hZF9tb2RlID09IExPQURfRElBRykKLQkJCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gTE9PUEJBQ0tfWEdYU18xMDsKLQotCQlyYyA9IGJueDJ4X3BoeV9pbml0KCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKLQotCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQotCQlibngyeF9jYWxjX2ZjX2FkdihicCk7Ci0KLQkJaWYgKENISVBfUkVWX0lTX1NMT1coYnApICYmIGJwLT5saW5rX3ZhcnMubGlua191cCkgewotCQkJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9MSU5LX1VQKTsKLQkJCWJueDJ4X2xpbmtfcmVwb3J0KGJwKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0JQk5YMlhfRVJSKCJCb290Y29kZSBpcyBtaXNzaW5nIC0gY2FuIG5vdCBpbml0aWFsaXplIGxpbmtcbiIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9saW5rX3NldChzdHJ1Y3QgYm54MnggKmJwKQotewotCWlmICghQlBfTk9NQ1AoYnApKSB7Ci0JCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwotCQlibngyeF9waHlfaW5pdCgmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7Ci0JCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOwotCi0JCWJueDJ4X2NhbGNfZmNfYWR2KGJwKTsKLQl9IGVsc2UKLQkJQk5YMlhfRVJSKCJCb290Y29kZSBpcyBtaXNzaW5nIC0gY2FuIG5vdCBzZXQgbGlua1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X19saW5rX3Jlc2V0KHN0cnVjdCBibngyeCAqYnApCi17Ci0JaWYgKCFCUF9OT01DUChicCkpIHsKLQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7Ci0JCWJueDJ4X2xpbmtfcmVzZXQoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMsIDEpOwotCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQl9IGVsc2UKLQkJQk5YMlhfRVJSKCJCb290Y29kZSBpcyBtaXNzaW5nIC0gY2FuIG5vdCByZXNldCBsaW5rXG4iKTsKLX0KLQotc3RhdGljIHU4IGJueDJ4X2xpbmtfdGVzdChzdHJ1Y3QgYm54MnggKmJwKQotewotCXU4IHJjID0gMDsKLQotCWlmICghQlBfTk9NQ1AoYnApKSB7Ci0JCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwotCQlyYyA9IGJueDJ4X3Rlc3RfbGluaygmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7Ci0JCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOwotCX0gZWxzZQotCQlCTlgyWF9FUlIoIkJvb3Rjb2RlIGlzIG1pc3NpbmcgLSBjYW4gbm90IHRlc3QgbGlua1xuIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfcG9ydF9taW5tYXgoc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgcl9wYXJhbSA9IGJwLT5saW5rX3ZhcnMubGluZV9zcGVlZCAvIDg7Ci0JdTMyIGZhaXJfcGVyaW9kaWNfdGltZW91dF91c2VjOwotCXUzMiB0X2ZhaXI7Ci0KLQltZW1zZXQoJihicC0+Y21uZy5yc192YXJzKSwgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfcG9ydCkpOwotCW1lbXNldCgmKGJwLT5jbW5nLmZhaXJfdmFycyksIDAsIHNpemVvZihzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfcG9ydCkpOwotCi0JLyogMTAwIHVzZWMgaW4gU0RNIHRpY2tzID0gMjUgc2luY2UgZWFjaCB0aWNrIGlzIDQgdXNlYyAqLwotCWJwLT5jbW5nLnJzX3ZhcnMucnNfcGVyaW9kaWNfdGltZW91dCA9IFJTX1BFUklPRElDX1RJTUVPVVRfVVNFQyAvIDQ7Ci0KLQkvKiB0aGlzIGlzIHRoZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggbm8gdGltZXIgYXJtaW5nIHdpbGwgb2NjdXIKLQkgICAxLjI1IGNvZWZmaWNpZW50IGlzIGZvciB0aGUgdGhyZXNob2xkIHRvIGJlIGEgbGl0dGxlIGJpZ2dlcgotCSAgIHRoYW4gdGhlIHJlYWwgdGltZSwgdG8gY29tcGVuc2F0ZSBmb3IgdGltZXIgaW4tYWNjdXJhY3kgKi8KLQlicC0+Y21uZy5yc192YXJzLnJzX3RocmVzaG9sZCA9Ci0JCQkJKFJTX1BFUklPRElDX1RJTUVPVVRfVVNFQyAqIHJfcGFyYW0gKiA1KSAvIDQ7Ci0KLQkvKiByZXNvbHV0aW9uIG9mIGZhaXJuZXNzIHRpbWVyICovCi0JZmFpcl9wZXJpb2RpY190aW1lb3V0X3VzZWMgPSBRTV9BUkJfQllURVMgLyByX3BhcmFtOwotCS8qIGZvciAxMEcgaXQgaXMgMTAwMHVzZWMuIGZvciAxRyBpdCBpcyAxMDAwMHVzZWMuICovCi0JdF9mYWlyID0gVF9GQUlSX0NPRUYgLyBicC0+bGlua192YXJzLmxpbmVfc3BlZWQ7Ci0KLQkvKiB0aGlzIGlzIHRoZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggd2Ugd29uJ3QgYXJtIHRoZSB0aW1lciBhbnltb3JlICovCi0JYnAtPmNtbmcuZmFpcl92YXJzLmZhaXJfdGhyZXNob2xkID0gUU1fQVJCX0JZVEVTOwotCi0JLyogd2UgbXVsdGlwbHkgYnkgMWUzLzggdG8gZ2V0IGJ5dGVzL21zZWMuCi0JICAgV2UgZG9uJ3Qgd2FudCB0aGUgY3JlZGl0cyB0byBwYXNzIGEgY3JlZGl0Ci0JICAgb2YgdGhlIHRfZmFpcipGQUlSX01FTSAoYWxnb3JpdGhtIHJlc29sdXRpb24pICovCi0JYnAtPmNtbmcuZmFpcl92YXJzLnVwcGVyX2JvdW5kID0gcl9wYXJhbSAqIHRfZmFpciAqIEZBSVJfTUVNOwotCS8qIHNpbmNlIGVhY2ggdGljayBpcyA0IHVzZWMgKi8KLQlicC0+Y21uZy5mYWlyX3ZhcnMuZmFpcm5lc3NfdGltZW91dCA9IGZhaXJfcGVyaW9kaWNfdGltZW91dF91c2VjIC8gNDsKLX0KLQotLyogQ2FsY3VsYXRlcyB0aGUgc3VtIG9mIHZuX21pbl9yYXRlcy4KLSAgIEl0J3MgbmVlZGVkIGZvciBmdXJ0aGVyIG5vcm1hbGl6aW5nIG9mIHRoZSBtaW5fcmF0ZXMuCi0gICBSZXR1cm5zOgotICAgICBzdW0gb2Ygdm5fbWluX3JhdGVzLgotICAgICAgIG9yCi0gICAgIDAgLSBpZiBhbGwgdGhlIG1pbl9yYXRlcyBhcmUgMC4KLSAgICAgSW4gdGhlIGxhdGVyIGNhc2UgZmFpbmVzcyBhbGdvcml0aG0gc2hvdWxkIGJlIGRlYWN0aXZhdGVkLgotICAgICBJZiBub3QgYWxsIG1pbl9yYXRlcyBhcmUgemVybyB0aGVuIHRob3NlIHRoYXQgYXJlIHplcm9lcyB3aWxsIGJlIHNldCB0byAxLgotICovCi1zdGF0aWMgdm9pZCBibngyeF9jYWxjX3ZuX3dlaWdodF9zdW0oc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgYWxsX3plcm8gPSAxOwotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IHZuOwotCi0JYnAtPnZuX3dlaWdodF9zdW0gPSAwOwotCWZvciAodm4gPSBWTl8wOyB2biA8IEUxSFZOX01BWDsgdm4rKykgewotCQlpbnQgZnVuYyA9IDIqdm4gKyBwb3J0OwotCQl1MzIgdm5fY2ZnID0gU0hNRU1fUkQoYnAsIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5jb25maWcpOwotCQl1MzIgdm5fbWluX3JhdGUgPSAoKHZuX2NmZyAmIEZVTkNfTUZfQ0ZHX01JTl9CV19NQVNLKSA+PgotCQkJCSAgIEZVTkNfTUZfQ0ZHX01JTl9CV19TSElGVCkgKiAxMDA7Ci0KLQkJLyogU2tpcCBoaWRkZW4gdm5zICovCi0JCWlmICh2bl9jZmcgJiBGVU5DX01GX0NGR19GVU5DX0hJREUpCi0JCQljb250aW51ZTsKLQotCQkvKiBJZiBtaW4gcmF0ZSBpcyB6ZXJvIC0gc2V0IGl0IHRvIDEgKi8KLQkJaWYgKCF2bl9taW5fcmF0ZSkKLQkJCXZuX21pbl9yYXRlID0gREVGX01JTl9SQVRFOwotCQllbHNlCi0JCQlhbGxfemVybyA9IDA7Ci0KLQkJYnAtPnZuX3dlaWdodF9zdW0gKz0gdm5fbWluX3JhdGU7Ci0JfQotCi0JLyogLi4uIG9ubHkgaWYgYWxsIG1pbiByYXRlcyBhcmUgemVyb3MgLSBkaXNhYmxlIGZhaXJuZXNzICovCi0JaWYgKGFsbF96ZXJvKSB7Ci0JCWJwLT5jbW5nLmZsYWdzLmNtbmdfZW5hYmxlcyAmPQotCQkJCQl+Q01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19WTjsKLQkJRFAoTkVUSUZfTVNHX0lGVVAsICJBbGwgTUlOIHZhbHVlcyBhcmUgemVyb2VzIgotCQkgICAiICBmYWlybmVzcyB3aWxsIGJlIGRpc2FibGVkXG4iKTsKLQl9IGVsc2UKLQkJYnAtPmNtbmcuZmxhZ3MuY21uZ19lbmFibGVzIHw9Ci0JCQkJCUNNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfVk47Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfdm5fbWlubWF4KHN0cnVjdCBibngyeCAqYnAsIGludCBmdW5jKQotewotCXN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfdm4gbV9yc192bjsKLQlzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfdm4gbV9mYWlyX3ZuOwotCXUzMiB2bl9jZmcgPSBTSE1FTV9SRChicCwgbWZfY2ZnLmZ1bmNfbWZfY29uZmlnW2Z1bmNdLmNvbmZpZyk7Ci0JdTE2IHZuX21pbl9yYXRlLCB2bl9tYXhfcmF0ZTsKLQlpbnQgaTsKLQotCS8qIElmIGZ1bmN0aW9uIGlzIGhpZGRlbiAtIHNldCBtaW4gYW5kIG1heCB0byB6ZXJvZXMgKi8KLQlpZiAodm5fY2ZnICYgRlVOQ19NRl9DRkdfRlVOQ19ISURFKSB7Ci0JCXZuX21pbl9yYXRlID0gMDsKLQkJdm5fbWF4X3JhdGUgPSAwOwotCi0JfSBlbHNlIHsKLQkJdm5fbWluX3JhdGUgPSAoKHZuX2NmZyAmIEZVTkNfTUZfQ0ZHX01JTl9CV19NQVNLKSA+PgotCQkJCUZVTkNfTUZfQ0ZHX01JTl9CV19TSElGVCkgKiAxMDA7Ci0JCS8qIElmIG1pbiByYXRlIGlzIHplcm8gLSBzZXQgaXQgdG8gMSAqLwotCQlpZiAoIXZuX21pbl9yYXRlKQotCQkJdm5fbWluX3JhdGUgPSBERUZfTUlOX1JBVEU7Ci0JCXZuX21heF9yYXRlID0gKCh2bl9jZmcgJiBGVU5DX01GX0NGR19NQVhfQldfTUFTSykgPj4KLQkJCQlGVU5DX01GX0NGR19NQVhfQldfU0hJRlQpICogMTAwOwotCX0KLQlEUChORVRJRl9NU0dfSUZVUCwKLQkgICAiZnVuYyAlZDogdm5fbWluX3JhdGUgJWQgIHZuX21heF9yYXRlICVkICB2bl93ZWlnaHRfc3VtICVkXG4iLAotCSAgIGZ1bmMsIHZuX21pbl9yYXRlLCB2bl9tYXhfcmF0ZSwgYnAtPnZuX3dlaWdodF9zdW0pOwotCi0JbWVtc2V0KCZtX3JzX3ZuLCAwLCBzaXplb2Yoc3RydWN0IHJhdGVfc2hhcGluZ192YXJzX3Blcl92bikpOwotCW1lbXNldCgmbV9mYWlyX3ZuLCAwLCBzaXplb2Yoc3RydWN0IGZhaXJuZXNzX3ZhcnNfcGVyX3ZuKSk7Ci0KLQkvKiBnbG9iYWwgdm4gY291bnRlciAtIG1heGltYWwgTWJwcyBmb3IgdGhpcyB2biAqLwotCW1fcnNfdm4udm5fY291bnRlci5yYXRlID0gdm5fbWF4X3JhdGU7Ci0KLQkvKiBxdW90YSAtIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBpbiB0aGlzIHBlcmlvZCAqLwotCW1fcnNfdm4udm5fY291bnRlci5xdW90YSA9Ci0JCQkJKHZuX21heF9yYXRlICogUlNfUEVSSU9ESUNfVElNRU9VVF9VU0VDKSAvIDg7Ci0KLQlpZiAoYnAtPnZuX3dlaWdodF9zdW0pIHsKLQkJLyogY3JlZGl0IGZvciBlYWNoIHBlcmlvZCBvZiB0aGUgZmFpcm5lc3MgYWxnb3JpdGhtOgotCQkgICBudW1iZXIgb2YgYnl0ZXMgaW4gVF9GQUlSICh0aGUgdm4gc2hhcmUgdGhlIHBvcnQgcmF0ZSkuCi0JCSAgIHZuX3dlaWdodF9zdW0gc2hvdWxkIG5vdCBiZSBsYXJnZXIgdGhhbiAxMDAwMCwgdGh1cwotCQkgICBUX0ZBSVJfQ09FRiAvICg4ICogdm5fd2VpZ2h0X3N1bSkgd2lsbCBhbHdheXMgYmUgZ3JlYXRlcgotCQkgICB0aGFuIHplcm8gKi8KLQkJbV9mYWlyX3ZuLnZuX2NyZWRpdF9kZWx0YSA9Ci0JCQltYXhfdCh1MzIsICh2bl9taW5fcmF0ZSAqIChUX0ZBSVJfQ09FRiAvCi0JCQkJCQkgICAoOCAqIGJwLT52bl93ZWlnaHRfc3VtKSkpLAotCQkJICAgICAgKGJwLT5jbW5nLmZhaXJfdmFycy5mYWlyX3RocmVzaG9sZCAqIDIpKTsKLQkJRFAoTkVUSUZfTVNHX0lGVVAsICJtX2ZhaXJfdm4udm5fY3JlZGl0X2RlbHRhICVkXG4iLAotCQkgICBtX2ZhaXJfdm4udm5fY3JlZGl0X2RlbHRhKTsKLQl9Ci0KLQkvKiBTdG9yZSBpdCB0byBpbnRlcm5hbCBtZW1vcnkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfdm4pLzQ7IGkrKykKLQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkgICAgICAgWFNUT1JNX1JBVEVfU0hBUElOR19QRVJfVk5fVkFSU19PRkZTRVQoZnVuYykgKyBpICogNCwKLQkJICAgICAgICgodTMyICopKCZtX3JzX3ZuKSlbaV0pOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfdm4pLzQ7IGkrKykKLQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkgICAgICAgWFNUT1JNX0ZBSVJORVNTX1BFUl9WTl9WQVJTX09GRlNFVChmdW5jKSArIGkgKiA0LAotCQkgICAgICAgKCh1MzIgKikoJm1fZmFpcl92bikpW2ldKTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIGxpbmsgaW50ZXJydXB0ICovCi1zdGF0aWMgdm9pZCBibngyeF9saW5rX2F0dG4oc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgcHJldl9saW5rX3N0YXR1cyA9IGJwLT5saW5rX3ZhcnMubGlua19zdGF0dXM7Ci0JLyogTWFrZSBzdXJlIHRoYXQgd2UgYXJlIHN5bmNlZCB3aXRoIHRoZSBjdXJyZW50IHN0YXRpc3RpY3MgKi8KLQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOwotCi0JYm54MnhfbGlua191cGRhdGUoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMpOwotCi0JaWYgKGJwLT5saW5rX3ZhcnMubGlua191cCkgewotCi0JCS8qIGRyb3BsZXNzIGZsb3cgY29udHJvbCAqLwotCQlpZiAoQ0hJUF9JU19FMUgoYnApICYmIGJwLT5kcm9wbGVzc19mYykgewotCQkJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQkJCXUzMiBwYXVzZV9lbmFibGVkID0gMDsKLQotCQkJaWYgKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQotCQkJCXBhdXNlX2VuYWJsZWQgPSAxOwotCi0JCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCQkgICAgICAgVVNUT1JNX0VUSF9QQVVTRV9FTkFCTEVEX09GRlNFVChwb3J0KSwKLQkJCSAgICAgICBwYXVzZV9lbmFibGVkKTsKLQkJfQotCi0JCWlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0JNQUMpIHsKLQkJCXN0cnVjdCBob3N0X3BvcnRfc3RhdHMgKnBzdGF0czsKLQotCQkJcHN0YXRzID0gYm54Mnhfc3AoYnAsIHBvcnRfc3RhdHMpOwotCQkJLyogcmVzZXQgb2xkIGJtYWMgc3RhdHMgKi8KLQkJCW1lbXNldCgmKHBzdGF0cy0+bWFjX3N0eFswXSksIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtYWNfc3R4KSk7Ci0JCX0KLQkJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKQotCQkJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9MSU5LX1VQKTsKLQl9Ci0KLQkvKiBpbmRpY2F0ZSBsaW5rIHN0YXR1cyBvbmx5IGlmIGxpbmsgc3RhdHVzIGFjdHVhbGx5IGNoYW5nZWQgKi8KLQlpZiAocHJldl9saW5rX3N0YXR1cyAhPSBicC0+bGlua192YXJzLmxpbmtfc3RhdHVzKQotCQlibngyeF9saW5rX3JlcG9ydChicCk7Ci0KLQlpZiAoSVNfRTFITUYoYnApKSB7Ci0JCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JCWludCBmdW5jOwotCQlpbnQgdm47Ci0KLQkJLyogU2V0IHRoZSBhdHRlbnRpb24gdG93YXJkcyBvdGhlciBkcml2ZXJzIG9uIHRoZSBzYW1lIHBvcnQgKi8KLQkJZm9yICh2biA9IFZOXzA7IHZuIDwgRTFIVk5fTUFYOyB2bisrKSB7Ci0JCQlpZiAodm4gPT0gQlBfRTFIVk4oYnApKQotCQkJCWNvbnRpbnVlOwotCi0JCQlmdW5jID0gKCh2biA8PCAxKSB8IHBvcnQpOwotCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzAgKwotCQkJICAgICAgIChMSU5LX1NZTkNfQVRURU5USU9OX0JJVF9GVU5DXzAgKyBmdW5jKSo0LCAxKTsKLQkJfQotCi0JCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApIHsKLQkJCWludCBpOwotCi0JCQkvKiBJbml0IHJhdGUgc2hhcGluZyBhbmQgZmFpcm5lc3MgY29udGV4dHMgKi8KLQkJCWJueDJ4X2luaXRfcG9ydF9taW5tYXgoYnApOwotCi0JCQlmb3IgKHZuID0gVk5fMDsgdm4gPCBFMUhWTl9NQVg7IHZuKyspCi0JCQkJYm54MnhfaW5pdF92bl9taW5tYXgoYnAsIDIqdm4gKyBwb3J0KTsKLQotCQkJLyogU3RvcmUgaXQgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0JCQlmb3IgKGkgPSAwOwotCQkJICAgICBpIDwgc2l6ZW9mKHN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCkgLyA0OyBpKyspCi0JCQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkJCSAgWFNUT1JNX0NNTkdfUEVSX1BPUlRfVkFSU19PRkZTRVQocG9ydCkgKyBpKjQsCi0JCQkJICAgICAgICgodTMyICopKCZicC0+Y21uZykpW2ldKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfX2xpbmtfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWlmICgoYnAtPnN0YXRlICE9IEJOWDJYX1NUQVRFX09QRU4pIHx8IChicC0+ZmxhZ3MgJiBNRl9GVU5DX0RJUykpCi0JCXJldHVybjsKLQotCWJueDJ4X2xpbmtfc3RhdHVzX3VwZGF0ZSgmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7Ci0KLQlpZiAoYnAtPmxpbmtfdmFycy5saW5rX3VwKQotCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX0xJTktfVVApOwotCWVsc2UKLQkJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9TVE9QKTsKLQotCWJueDJ4X2NhbGNfdm5fd2VpZ2h0X3N1bShicCk7Ci0KLQkvKiBpbmRpY2F0ZSBsaW5rIHN0YXR1cyAqLwotCWJueDJ4X2xpbmtfcmVwb3J0KGJwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfcG1mX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JdTMyIHZhbDsKLQotCWJwLT5wb3J0LnBtZiA9IDE7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJwbWYgJWRcbiIsIGJwLT5wb3J0LnBtZik7Ci0KLQkvKiBlbmFibGUgbmlnIGF0dGVudGlvbiAqLwotCXZhbCA9ICgweGZmMGYgfCAoMSA8PCAoQlBfRTFIVk4oYnApICsgNCkpKTsKLQlSRUdfV1IoYnAsIEhDX1JFR19UUkFJTElOR19FREdFXzAgKyBwb3J0KjgsIHZhbCk7Ci0JUkVHX1dSKGJwLCBIQ19SRUdfTEVBRElOR19FREdFXzAgKyBwb3J0KjgsIHZhbCk7Ci0KLQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1BNRik7Ci19Ci0KLS8qIGVuZCBvZiBMaW5rICovCi0KLS8qIHNsb3cgcGF0aCAqLwotCi0vKgotICogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucwotICovCi0KLS8qIHNlbmQgdGhlIE1DUCBhIHJlcXVlc3QsIGJsb2NrIHVudGlsIHRoZXJlIGlzIGEgcmVwbHkgKi8KLXUzMiBibngyeF9md19jb21tYW5kKHN0cnVjdCBibngyeCAqYnAsIHUzMiBjb21tYW5kKQotewotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0JdTMyIHNlcSA9ICsrYnAtPmZ3X3NlcTsKLQl1MzIgcmMgPSAwOwotCXUzMiBjbnQgPSAxOwotCXU4IGRlbGF5ID0gQ0hJUF9SRVZfSVNfU0xPVyhicCkgPyAxMDAgOiAxMDsKLQotCW11dGV4X2xvY2soJmJwLT5md19tYl9tdXRleCk7Ci0JU0hNRU1fV1IoYnAsIGZ1bmNfbWJbZnVuY10uZHJ2X21iX2hlYWRlciwgKGNvbW1hbmQgfCBzZXEpKTsKLQlEUChCTlgyWF9NU0dfTUNQLCAid3JvdGUgY29tbWFuZCAoJXgpIHRvIEZXIE1CXG4iLCAoY29tbWFuZCB8IHNlcSkpOwotCi0JZG8gewotCQkvKiBsZXQgdGhlIEZXIGRvIGl0J3MgbWFnaWMgLi4uICovCi0JCW1zbGVlcChkZWxheSk7Ci0KLQkJcmMgPSBTSE1FTV9SRChicCwgZnVuY19tYltmdW5jXS5md19tYl9oZWFkZXIpOwotCi0JCS8qIEdpdmUgdGhlIEZXIHVwIHRvIDUgc2Vjb25kICg1MDAqMTBtcykgKi8KLQl9IHdoaWxlICgoc2VxICE9IChyYyAmIEZXX01TR19TRVFfTlVNQkVSX01BU0spKSAmJiAoY250KysgPCA1MDApKTsKLQotCURQKEJOWDJYX01TR19NQ1AsICJbYWZ0ZXIgJWQgbXNdIHJlYWQgKCV4KSBzZXEgaXMgKCV4KSBmcm9tIEZXIE1CXG4iLAotCSAgIGNudCpkZWxheSwgcmMsIHNlcSk7Ci0KLQkvKiBpcyB0aGlzIGEgcmVwbHkgdG8gb3VyIGNvbW1hbmQ/ICovCi0JaWYgKHNlcSA9PSAocmMgJiBGV19NU0dfU0VRX05VTUJFUl9NQVNLKSkKLQkJcmMgJj0gRldfTVNHX0NPREVfTUFTSzsKLQllbHNlIHsKLQkJLyogRlcgQlVHISAqLwotCQlCTlgyWF9FUlIoIkZXIGZhaWxlZCB0byByZXNwb25kIVxuIik7Ci0JCWJueDJ4X2Z3X2R1bXAoYnApOwotCQlyYyA9IDA7Ci0JfQotCW11dGV4X3VubG9jaygmYnAtPmZ3X21iX211dGV4KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMWgoc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCk7Ci1zdGF0aWMgdm9pZCBibngyeF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotc3RhdGljIHZvaWQgYm54MnhfZTFoX2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCi0JbmV0aWZfdHhfZGlzYWJsZShicC0+ZGV2KTsKLQotCVJFR19XUihicCwgTklHX1JFR19MTEgwX0ZVTkNfRU4gKyBwb3J0KjgsIDApOwotCi0JbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2UxaF9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCi0JUkVHX1dSKGJwLCBOSUdfUkVHX0xMSDBfRlVOQ19FTiArIHBvcnQqOCwgMSk7Ci0KLQkvKiBUeCBxdWV1ZSBzaG91bGQgYmUgb25seSByZWVuYWJsZWQgKi8KLQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoYnAtPmRldik7Ci0KLQkvKgotCSAqIFNob3VsZCBub3QgY2FsbCBuZXRpZl9jYXJyaWVyX29uIHNpbmNlIGl0IHdpbGwgYmUgY2FsbGVkIGlmIHRoZSBsaW5rCi0JICogaXMgdXAgd2hlbiBjaGVja2luZyBmb3IgbGluayBzdGF0ZQotCSAqLwotfQotCi1zdGF0aWMgdm9pZCBibngyeF91cGRhdGVfbWluX21heChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IHZuLCBpOwotCi0JLyogSW5pdCByYXRlIHNoYXBpbmcgYW5kIGZhaXJuZXNzIGNvbnRleHRzICovCi0JYm54MnhfaW5pdF9wb3J0X21pbm1heChicCk7Ci0KLQlibngyeF9jYWxjX3ZuX3dlaWdodF9zdW0oYnApOwotCi0JZm9yICh2biA9IFZOXzA7IHZuIDwgRTFIVk5fTUFYOyB2bisrKQotCQlibngyeF9pbml0X3ZuX21pbm1heChicCwgMip2biArIHBvcnQpOwotCi0JaWYgKGJwLT5wb3J0LnBtZikgewotCQlpbnQgZnVuYzsKLQotCQkvKiBTZXQgdGhlIGF0dGVudGlvbiB0b3dhcmRzIG90aGVyIGRyaXZlcnMgb24gdGhlIHNhbWUgcG9ydCAqLwotCQlmb3IgKHZuID0gVk5fMDsgdm4gPCBFMUhWTl9NQVg7IHZuKyspIHsKLQkJCWlmICh2biA9PSBCUF9FMUhWTihicCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWZ1bmMgPSAoKHZuIDw8IDEpIHwgcG9ydCk7Ci0JCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMCArCi0JCQkgICAgICAgKExJTktfU1lOQ19BVFRFTlRJT05fQklUX0ZVTkNfMCArIGZ1bmMpKjQsIDEpOwotCQl9Ci0KLQkJLyogU3RvcmUgaXQgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGNtbmdfc3RydWN0X3Blcl9wb3J0KSAvIDQ7IGkrKykKLQkJCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgICBYU1RPUk1fQ01OR19QRVJfUE9SVF9WQVJTX09GRlNFVChwb3J0KSArIGkqNCwKLQkJCSAgICAgICAoKHUzMiAqKSgmYnAtPmNtbmcpKVtpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9kY2NfZXZlbnQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGRjY19ldmVudCkKLXsKLQlEUChCTlgyWF9NU0dfTUNQLCAiZGNjX2V2ZW50IDB4JXhcbiIsIGRjY19ldmVudCk7Ci0KLQlpZiAoZGNjX2V2ZW50ICYgRFJWX1NUQVRVU19EQ0NfRElTQUJMRV9FTkFCTEVfUEYpIHsKLQotCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGJlc2lkZXMgdGhlIGZ1bmN0aW9uIGluaXRpYWxpemF0aW9uCi0JCSAqIHdoZXJlIHRoZSBicC0+ZmxhZ3MgY2FuIGNoYW5nZSBzbyBpdCBpcyBkb25lIHdpdGhvdXQgYW55Ci0JCSAqIGxvY2tzCi0JCSAqLwotCQlpZiAoYnAtPm1mX2NvbmZpZyAmIEZVTkNfTUZfQ0ZHX0ZVTkNfRElTQUJMRUQpIHsKLQkJCURQKE5FVElGX01TR19JRkRPV04sICJtZl9jZmcgZnVuY3Rpb24gZGlzYWJsZWRcbiIpOwotCQkJYnAtPmZsYWdzIHw9IE1GX0ZVTkNfRElTOwotCi0JCQlibngyeF9lMWhfZGlzYWJsZShicCk7Ci0JCX0gZWxzZSB7Ci0JCQlEUChORVRJRl9NU0dfSUZVUCwgIm1mX2NmZyBmdW5jdGlvbiBlbmFibGVkXG4iKTsKLQkJCWJwLT5mbGFncyAmPSB+TUZfRlVOQ19ESVM7Ci0KLQkJCWJueDJ4X2UxaF9lbmFibGUoYnApOwotCQl9Ci0JCWRjY19ldmVudCAmPSB+RFJWX1NUQVRVU19EQ0NfRElTQUJMRV9FTkFCTEVfUEY7Ci0JfQotCWlmIChkY2NfZXZlbnQgJiBEUlZfU1RBVFVTX0RDQ19CQU5EV0lEVEhfQUxMT0NBVElPTikgewotCi0JCWJueDJ4X3VwZGF0ZV9taW5fbWF4KGJwKTsKLQkJZGNjX2V2ZW50ICY9IH5EUlZfU1RBVFVTX0RDQ19CQU5EV0lEVEhfQUxMT0NBVElPTjsKLQl9Ci0KLQkvKiBSZXBvcnQgcmVzdWx0cyB0byBNQ1AgKi8KLQlpZiAoZGNjX2V2ZW50KQotCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfRENDX0ZBSUxVUkUpOwotCWVsc2UKLQkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX0RDQ19PSyk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBzcHEgbG9jayAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXRoX3NwZSAqYm54Mnhfc3BfZ2V0X25leHQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgZXRoX3NwZSAqbmV4dF9zcGUgPSBicC0+c3BxX3Byb2RfYmQ7Ci0KLQlpZiAoYnAtPnNwcV9wcm9kX2JkID09IGJwLT5zcHFfbGFzdF9iZCkgewotCQlicC0+c3BxX3Byb2RfYmQgPSBicC0+c3BxOwotCQlicC0+c3BxX3Byb2RfaWR4ID0gMDsKLQkJRFAoTkVUSUZfTVNHX1RJTUVSLCAiZW5kIG9mIHNwcVxuIik7Ci0JfSBlbHNlIHsKLQkJYnAtPnNwcV9wcm9kX2JkKys7Ci0JCWJwLT5zcHFfcHJvZF9pZHgrKzsKLQl9Ci0JcmV0dXJuIG5leHRfc3BlOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB1bmRlciB0aGUgc3BxIGxvY2sgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9zcF9wcm9kX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCBCRCBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHdyaXRpbmcgdGhlIHByb2R1Y2VyICovCi0Jd21iKCk7Ci0KLQlSRUdfV1IoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIFhTVE9STV9TUFFfUFJPRF9PRkZTRVQoZnVuYyksCi0JICAgICAgIGJwLT5zcHFfcHJvZF9pZHgpOwotCW1taW93YigpOwotfQotCi0vKiB0aGUgc2xvdyBwYXRoIHF1ZXVlIGlzIG9kZCBzaW5jZSBjb21wbGV0aW9ucyBhcnJpdmUgb24gdGhlIGZhc3RwYXRoIHJpbmcgKi8KLXN0YXRpYyBpbnQgYm54Mnhfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY29tbWFuZCwgaW50IGNpZCwKLQkJCSB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjb21tb24pCi17Ci0Jc3RydWN0IGV0aF9zcGUgKnNwZTsKLQotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKLQkJcmV0dXJuIC1FSU87Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKLQotCWlmICghYnAtPnNwcV9sZWZ0KSB7Ci0JCUJOWDJYX0VSUigiQlVHISBTUFEgcmluZyBmdWxsIVxuIik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZicC0+c3BxX2xvY2spOwotCQlibngyeF9wYW5pYygpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXNwZSA9IGJueDJ4X3NwX2dldF9uZXh0KGJwKTsKLQotCS8qIENJRCBuZWVkcyBwb3J0IG51bWJlciB0byBiZSBlbmNvZGVkIGludCBpdCAqLwotCXNwZS0+aGRyLmNvbm5fYW5kX2NtZF9kYXRhID0KLQkJCWNwdV90b19sZTMyKChjb21tYW5kIDw8IFNQRV9IRFJfQ01EX0lEX1NISUZUKSB8Ci0JCQkJICAgIEhXX0NJRChicCwgY2lkKSk7Ci0Jc3BlLT5oZHIudHlwZSA9IGNwdV90b19sZTE2KEVUSF9DT05ORUNUSU9OX1RZUEUpOwotCWlmIChjb21tb24pCi0JCXNwZS0+aGRyLnR5cGUgfD0KLQkJCWNwdV90b19sZTE2KCgxIDw8IFNQRV9IRFJfQ09NTU9OX1JBTVJPRF9TSElGVCkpOwotCi0Jc3BlLT5kYXRhLm1hY19jb25maWdfYWRkci5oaSA9IGNwdV90b19sZTMyKGRhdGFfaGkpOwotCXNwZS0+ZGF0YS5tYWNfY29uZmlnX2FkZHIubG8gPSBjcHVfdG9fbGUzMihkYXRhX2xvKTsKLQotCWJwLT5zcHFfbGVmdC0tOwotCi0JRFAoQk5YMlhfTVNHX1NQLypORVRJRl9NU0dfVElNRVIqLywKLQkgICAiU1BRRVsleF0gKCV4OiV4KSAgY29tbWFuZCAlZCAgaHdfY2lkICV4ICBkYXRhICgleDoleCkgIGxlZnQgJXhcbiIsCi0JICAgYnAtPnNwcV9wcm9kX2lkeCwgKHUzMilVNjRfSEkoYnAtPnNwcV9tYXBwaW5nKSwKLQkgICAodTMyKShVNjRfTE8oYnAtPnNwcV9tYXBwaW5nKSArCi0JICAgKHZvaWQgKilicC0+c3BxX3Byb2RfYmQgLSAodm9pZCAqKWJwLT5zcHEpLCBjb21tYW5kLAotCSAgIEhXX0NJRChicCwgY2lkKSwgZGF0YV9oaSwgZGF0YV9sbywgYnAtPnNwcV9sZWZ0KTsKLQotCWJueDJ4X3NwX3Byb2RfdXBkYXRlKGJwKTsKLQlzcGluX3VubG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogYWNxdWlyZSBzcGxpdCBNQ1AgYWNjZXNzIGxvY2sgcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQgYm54MnhfYWNxdWlyZV9hbHIoc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgaiwgdmFsOwotCWludCByYyA9IDA7Ci0KLQltaWdodF9zbGVlcCgpOwotCWZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKLQkJdmFsID0gKDFVTCA8PCAzMSk7Ci0JCVJFR19XUihicCwgR1JDQkFTRV9NQ1AgKyAweDljLCB2YWwpOwotCQl2YWwgPSBSRUdfUkQoYnAsIEdSQ0JBU0VfTUNQICsgMHg5Yyk7Ci0JCWlmICh2YWwgJiAoMUwgPDwgMzEpKQotCQkJYnJlYWs7Ci0KLQkJbXNsZWVwKDUpOwotCX0KLQlpZiAoISh2YWwgJiAoMUwgPDwgMzEpKSkgewotCQlCTlgyWF9FUlIoIkNhbm5vdCBhY3F1aXJlIE1DUCBhY2Nlc3MgbG9jayByZWdpc3RlclxuIik7Ci0JCXJjID0gLUVCVVNZOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotLyogcmVsZWFzZSBzcGxpdCBNQ1AgYWNjZXNzIGxvY2sgcmVnaXN0ZXIgKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3JlbGVhc2VfYWxyKHN0cnVjdCBibngyeCAqYnApCi17Ci0JUkVHX1dSKGJwLCBHUkNCQVNFX01DUCArIDB4OWMsIDApOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBibngyeF91cGRhdGVfZHNiX2lkeChzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2sgKmRlZl9zYiA9IGJwLT5kZWZfc3RhdHVzX2JsazsKLQl1MTYgcmMgPSAwOwotCi0JYmFycmllcigpOyAvKiBzdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiB0byBieSB0aGUgY2hpcCAqLwotCWlmIChicC0+ZGVmX2F0dF9pZHggIT0gZGVmX3NiLT5hdHRlbl9zdGF0dXNfYmxvY2suYXR0bl9iaXRzX2luZGV4KSB7Ci0JCWJwLT5kZWZfYXR0X2lkeCA9IGRlZl9zYi0+YXR0ZW5fc3RhdHVzX2Jsb2NrLmF0dG5fYml0c19pbmRleDsKLQkJcmMgfD0gMTsKLQl9Ci0JaWYgKGJwLT5kZWZfY19pZHggIT0gZGVmX3NiLT5jX2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4KSB7Ci0JCWJwLT5kZWZfY19pZHggPSBkZWZfc2ItPmNfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7Ci0JCXJjIHw9IDI7Ci0JfQotCWlmIChicC0+ZGVmX3VfaWR4ICE9IGRlZl9zYi0+dV9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleCkgewotCQlicC0+ZGVmX3VfaWR4ID0gZGVmX3NiLT51X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4OwotCQlyYyB8PSA0OwotCX0KLQlpZiAoYnAtPmRlZl94X2lkeCAhPSBkZWZfc2ItPnhfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpIHsKLQkJYnAtPmRlZl94X2lkeCA9IGRlZl9zYi0+eF9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleDsKLQkJcmMgfD0gODsKLQl9Ci0JaWYgKGJwLT5kZWZfdF9pZHggIT0gZGVmX3NiLT50X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4KSB7Ci0JCWJwLT5kZWZfdF9pZHggPSBkZWZfc2ItPnRfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7Ci0JCXJjIHw9IDE2OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBzbG93IHBhdGggc2VydmljZSBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgdm9pZCBibngyeF9hdHRuX2ludF9hc3NlcnRlZChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYXNzZXJ0ZWQpCi17Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQl1MzIgaGNfYWRkciA9IChIQ19SRUdfQ09NTUFORF9SRUcgKyBwb3J0KjMyICsKLQkJICAgICAgIENPTU1BTkRfUkVHX0FUVE5fQklUU19TRVQpOwotCXUzMiBhZXVfYWRkciA9IHBvcnQgPyBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMSA6Ci0JCQkgICAgICBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMDsKLQl1MzIgbmlnX2ludF9tYXNrX2FkZHIgPSBwb3J0ID8gTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMSA6Ci0JCQkJICAgICAgIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDA7Ci0JdTMyIGFldV9tYXNrOwotCXUzMiBuaWdfbWFzayA9IDA7Ci0KLQlpZiAoYnAtPmF0dG5fc3RhdGUgJiBhc3NlcnRlZCkKLQkJQk5YMlhfRVJSKCJJR1UgRVJST1JcbiIpOwotCi0JYm54MnhfYWNxdWlyZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1BPUlQwX0FUVF9NQVNLICsgcG9ydCk7Ci0JYWV1X21hc2sgPSBSRUdfUkQoYnAsIGFldV9hZGRyKTsKLQotCURQKE5FVElGX01TR19IVywgImFldV9tYXNrICV4ICBuZXdseSBhc3NlcnRlZCAleFxuIiwKLQkgICBhZXVfbWFzaywgYXNzZXJ0ZWQpOwotCWFldV9tYXNrICY9IH4oYXNzZXJ0ZWQgJiAweDNmZik7Ci0JRFAoTkVUSUZfTVNHX0hXLCAibmV3IG1hc2sgJXhcbiIsIGFldV9tYXNrKTsKLQotCVJFR19XUihicCwgYWV1X2FkZHIsIGFldV9tYXNrKTsKLQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfUE9SVDBfQVRUX01BU0sgKyBwb3J0KTsKLQotCURQKE5FVElGX01TR19IVywgImF0dG5fc3RhdGUgJXhcbiIsIGJwLT5hdHRuX3N0YXRlKTsKLQlicC0+YXR0bl9zdGF0ZSB8PSBhc3NlcnRlZDsKLQlEUChORVRJRl9NU0dfSFcsICJuZXcgc3RhdGUgJXhcbiIsIGJwLT5hdHRuX3N0YXRlKTsKLQotCWlmIChhc3NlcnRlZCAmIEFUVE5fSEFSRF9XSVJFRF9NQVNLKSB7Ci0JCWlmIChhc3NlcnRlZCAmIEFUVE5fTklHX0ZPUl9GVU5DKSB7Ci0KLQkJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwotCi0JCQkvKiBzYXZlIG5pZyBpbnRlcnJ1cHQgbWFzayAqLwotCQkJbmlnX21hc2sgPSBSRUdfUkQoYnAsIG5pZ19pbnRfbWFza19hZGRyKTsKLQkJCVJFR19XUihicCwgbmlnX2ludF9tYXNrX2FkZHIsIDApOwotCi0JCQlibngyeF9saW5rX2F0dG4oYnApOwotCi0JCQkvKiBoYW5kbGUgdW5pY29yZSBhdHRuPyAqLwotCQl9Ci0JCWlmIChhc3NlcnRlZCAmIEFUVE5fU1dfVElNRVJfNF9GVU5DKQotCQkJRFAoTkVUSUZfTVNHX0hXLCAiQVRUTl9TV19USU1FUl80X0ZVTkMhXG4iKTsKLQotCQlpZiAoYXNzZXJ0ZWQgJiBHUElPXzJfRlVOQykKLQkJCURQKE5FVElGX01TR19IVywgIkdQSU9fMl9GVU5DIVxuIik7Ci0KLQkJaWYgKGFzc2VydGVkICYgR1BJT18zX0ZVTkMpCi0JCQlEUChORVRJRl9NU0dfSFcsICJHUElPXzNfRlVOQyFcbiIpOwotCi0JCWlmIChhc3NlcnRlZCAmIEdQSU9fNF9GVU5DKQotCQkJRFAoTkVUSUZfTVNHX0hXLCAiR1BJT180X0ZVTkMhXG4iKTsKLQotCQlpZiAocG9ydCA9PSAwKSB7Ci0JCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX0dFTkVSQUxfQVRUTl8xKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0hXLCAiQVRUTl9HRU5FUkFMX0FUVE5fMSFcbiIpOwotCQkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8xLCAweDApOwotCQkJfQotCQkJaWYgKGFzc2VydGVkICYgQVRUTl9HRU5FUkFMX0FUVE5fMikgewotCQkJCURQKE5FVElGX01TR19IVywgIkFUVE5fR0VORVJBTF9BVFROXzIhXG4iKTsKLQkJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMiwgMHgwKTsKLQkJCX0KLQkJCWlmIChhc3NlcnRlZCAmIEFUVE5fR0VORVJBTF9BVFROXzMpIHsKLQkJCQlEUChORVRJRl9NU0dfSFcsICJBVFROX0dFTkVSQUxfQVRUTl8zIVxuIik7Ci0JCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzMsIDB4MCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX0dFTkVSQUxfQVRUTl80KSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0hXLCAiQVRUTl9HRU5FUkFMX0FUVE5fNCFcbiIpOwotCQkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl80LCAweDApOwotCQkJfQotCQkJaWYgKGFzc2VydGVkICYgQVRUTl9HRU5FUkFMX0FUVE5fNSkgewotCQkJCURQKE5FVElGX01TR19IVywgIkFUVE5fR0VORVJBTF9BVFROXzUhXG4iKTsKLQkJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fNSwgMHgwKTsKLQkJCX0KLQkJCWlmIChhc3NlcnRlZCAmIEFUVE5fR0VORVJBTF9BVFROXzYpIHsKLQkJCQlEUChORVRJRl9NU0dfSFcsICJBVFROX0dFTkVSQUxfQVRUTl82IVxuIik7Ci0JCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzYsIDB4MCk7Ci0JCQl9Ci0JCX0KLQotCX0gLyogaWYgaGFyZHdpcmVkICovCi0KLQlEUChORVRJRl9NU0dfSFcsICJhYm91dCB0byBtYXNrIDB4JTA4eCBhdCBIQyBhZGRyIDB4JXhcbiIsCi0JICAgYXNzZXJ0ZWQsIGhjX2FkZHIpOwotCVJFR19XUihicCwgaGNfYWRkciwgYXNzZXJ0ZWQpOwotCi0JLyogbm93IHNldCBiYWNrIHRoZSBtYXNrICovCi0JaWYgKGFzc2VydGVkICYgQVRUTl9OSUdfRk9SX0ZVTkMpIHsKLQkJUkVHX1dSKGJwLCBuaWdfaW50X21hc2tfYWRkciwgbmlnX21hc2spOwotCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9mYW5fZmFpbHVyZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0KLQkvKiBtYXJrIHRoZSBmYWlsdXJlICovCi0JYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnICY9IH5QT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9NQVNLOwotCWJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyB8PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFOwotCVNITUVNX1dSKGJwLCBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5leHRlcm5hbF9waHlfY29uZmlnLAotCQkgYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQotCS8qIGxvZyB0aGUgZmFpbHVyZSAqLwotCW5ldGRldl9lcnIoYnAtPmRldiwgIkZhbiBGYWlsdXJlIG9uIE5ldHdvcmsgQ29udHJvbGxlciBoYXMgY2F1c2VkIgotCSAgICAgICAiIHRoZSBkcml2ZXIgdG8gc2h1dGRvd24gdGhlIGNhcmQgdG8gcHJldmVudCBwZXJtYW5lbnQiCi0JICAgICAgICIgZGFtYWdlLiAgUGxlYXNlIGNvbnRhY3QgT0VNIFN1cHBvcnQgZm9yIGFzc2lzdGFuY2VcbiIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfYXR0bl9pbnRfZGVhc3NlcnRlZDAoc3RydWN0IGJueDJ4ICpicCwgdTMyIGF0dG4pCi17Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgcmVnX29mZnNldDsKLQl1MzIgdmFsLCBzd2FwX3ZhbCwgc3dhcF9vdmVycmlkZTsKLQotCXJlZ19vZmZzZXQgPSAocG9ydCA/IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMV9PVVRfMCA6Ci0JCQkgICAgIE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMCk7Ci0KLQlpZiAoYXR0biAmIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1NQSU81KSB7Ci0KLQkJdmFsID0gUkVHX1JEKGJwLCByZWdfb2Zmc2V0KTsKLQkJdmFsICY9IH5BRVVfSU5QVVRTX0FUVE5fQklUU19TUElPNTsKLQkJUkVHX1dSKGJwLCByZWdfb2Zmc2V0LCB2YWwpOwotCi0JCUJOWDJYX0VSUigiU1BJTzUgaHcgYXR0ZW50aW9uXG4iKTsKLQotCQkvKiBGYW4gZmFpbHVyZSBhdHRlbnRpb24gKi8KLQkJc3dpdGNoIChYR1hTX0VYVF9QSFlfVFlQRShicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpKSB7Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMToKLQkJCS8qIExvdyBwb3dlciBtb2RlIGlzIGNvbnRyb2xsZWQgYnkgR1BJTyAyICovCi0JCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAotCQkJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1csIHBvcnQpOwotCQkJLyogVGhlIFBIWSByZXNldCBpcyBjb250cm9sbGVkIGJ5IEdQSU8gMSAqLwotCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMSwKLQkJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XLCBwb3J0KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNzoKLQkJCS8qIFRoZSBQSFkgcmVzZXQgaXMgY29udHJvbGxlZCBieSBHUElPIDEgKi8KLQkJCS8qIGZha2UgdGhlIHBvcnQgbnVtYmVyIHRvIGNhbmNlbCB0aGUgc3dhcCBkb25lIGluCi0JCQkgICBzZXRfZ3BpbygpICovCi0JCQlzd2FwX3ZhbCA9IFJFR19SRChicCwgTklHX1JFR19QT1JUX1NXQVApOwotCQkJc3dhcF9vdmVycmlkZSA9IFJFR19SRChicCwgTklHX1JFR19TVFJBUF9PVkVSUklERSk7Ci0JCQlwb3J0ID0gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpIF4gMTsKLQkJCWJueDJ4X3NldF9ncGlvKGJwLCBNSVNDX1JFR0lTVEVSU19HUElPXzEsCi0JCQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywgcG9ydCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYm54MnhfZmFuX2ZhaWx1cmUoYnApOwotCX0KLQotCWlmIChhdHRuICYgKEFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzAgfAotCQkgICAgQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMSkpIHsKLQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7Ci0JCWJueDJ4X2hhbmRsZV9tb2R1bGVfZGV0ZWN0X2ludCgmYnAtPmxpbmtfcGFyYW1zKTsKLQkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7Ci0JfQotCi0JaWYgKGF0dG4gJiBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzApIHsKLQotCQl2YWwgPSBSRUdfUkQoYnAsIHJlZ19vZmZzZXQpOwotCQl2YWwgJj0gfihhdHRuICYgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8wKTsKLQkJUkVHX1dSKGJwLCByZWdfb2Zmc2V0LCB2YWwpOwotCi0JCUJOWDJYX0VSUigiRkFUQUwgSFcgYmxvY2sgYXR0ZW50aW9uIHNldDAgMHgleFxuIiwKLQkJCSAgKHUzMikoYXR0biAmIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMCkpOwotCQlibngyeF9wYW5pYygpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQxKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhdHRuKQotewotCXUzMiB2YWw7Ci0KLQlpZiAoYXR0biAmIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RPT1JCRUxMUV9IV19JTlRFUlJVUFQpIHsKLQotCQl2YWwgPSBSRUdfUkQoYnAsIERPUlFfUkVHX0RPUlFfSU5UX1NUU19DTFIpOwotCQlCTlgyWF9FUlIoIkRCIGh3IGF0dGVudGlvbiAweCV4XG4iLCB2YWwpOwotCQkvKiBET1JRIGRpc2NhcmQgYXR0ZW50aW9uICovCi0JCWlmICh2YWwgJiAweDIpCi0JCQlCTlgyWF9FUlIoIkZBVEFMIGVycm9yIGZyb20gRE9SUVxuIik7Ci0JfQotCi0JaWYgKGF0dG4gJiBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzEpIHsKLQotCQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCQlpbnQgcmVnX29mZnNldDsKLQotCQlyZWdfb2Zmc2V0ID0gKHBvcnQgPyBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzFfT1VUXzEgOgotCQkJCSAgICAgTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18wX09VVF8xKTsKLQotCQl2YWwgPSBSRUdfUkQoYnAsIHJlZ19vZmZzZXQpOwotCQl2YWwgJj0gfihhdHRuICYgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8xKTsKLQkJUkVHX1dSKGJwLCByZWdfb2Zmc2V0LCB2YWwpOwotCi0JCUJOWDJYX0VSUigiRkFUQUwgSFcgYmxvY2sgYXR0ZW50aW9uIHNldDEgMHgleFxuIiwKLQkJCSAgKHUzMikoYXR0biAmIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMSkpOwotCQlibngyeF9wYW5pYygpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQyKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhdHRuKQotewotCXUzMiB2YWw7Ci0KLQlpZiAoYXR0biAmIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NGQ19IV19JTlRFUlJVUFQpIHsKLQotCQl2YWwgPSBSRUdfUkQoYnAsIENGQ19SRUdfQ0ZDX0lOVF9TVFNfQ0xSKTsKLQkJQk5YMlhfRVJSKCJDRkMgaHcgYXR0ZW50aW9uIDB4JXhcbiIsIHZhbCk7Ci0JCS8qIENGQyBlcnJvciBhdHRlbnRpb24gKi8KLQkJaWYgKHZhbCAmIDB4MikKLQkJCUJOWDJYX0VSUigiRkFUQUwgZXJyb3IgZnJvbSBDRkNcbiIpOwotCX0KLQotCWlmIChhdHRuICYgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX0hXX0lOVEVSUlVQVCkgewotCi0JCXZhbCA9IFJFR19SRChicCwgUFhQX1JFR19QWFBfSU5UX1NUU19DTFJfMCk7Ci0JCUJOWDJYX0VSUigiUFhQIGh3IGF0dGVudGlvbiAweCV4XG4iLCB2YWwpOwotCQkvKiBSUV9VU0RNRFBfRklGT19PVkVSRkxPVyAqLwotCQlpZiAodmFsICYgMHgxODAwMCkKLQkJCUJOWDJYX0VSUigiRkFUQUwgZXJyb3IgZnJvbSBQWFBcbiIpOwotCX0KLQotCWlmIChhdHRuICYgSFdfSU5URVJSVVRfQVNTRVJUX1NFVF8yKSB7Ci0KLQkJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQkJaW50IHJlZ19vZmZzZXQ7Ci0KLQkJcmVnX29mZnNldCA9IChwb3J0ID8gTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18xX09VVF8yIDoKLQkJCQkgICAgIE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMik7Ci0KLQkJdmFsID0gUkVHX1JEKGJwLCByZWdfb2Zmc2V0KTsKLQkJdmFsICY9IH4oYXR0biAmIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMik7Ci0JCVJFR19XUihicCwgcmVnX29mZnNldCwgdmFsKTsKLQotCQlCTlgyWF9FUlIoIkZBVEFMIEhXIGJsb2NrIGF0dGVudGlvbiBzZXQyIDB4JXhcbiIsCi0JCQkgICh1MzIpKGF0dG4gJiBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzIpKTsKLQkJYm54MnhfcGFuaWMoKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYXR0bikKLXsKLQl1MzIgdmFsOwotCi0JaWYgKGF0dG4gJiBFVkVSRVNUX0dFTl9BVFROX0lOX1VTRV9NQVNLKSB7Ci0KLQkJaWYgKGF0dG4gJiBCTlgyWF9QTUZfTElOS19BU1NFUlQpIHsKLQkJCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0KLQkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8xMiArIGZ1bmMqNCwgMCk7Ci0JCQlicC0+bWZfY29uZmlnID0gU0hNRU1fUkQoYnAsCi0JCQkJCSAgIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5jb25maWcpOwotCQkJdmFsID0gU0hNRU1fUkQoYnAsIGZ1bmNfbWJbZnVuY10uZHJ2X3N0YXR1cyk7Ci0JCQlpZiAodmFsICYgRFJWX1NUQVRVU19EQ0NfRVZFTlRfTUFTSykKLQkJCQlibngyeF9kY2NfZXZlbnQoYnAsCi0JCQkJCSAgICAodmFsICYgRFJWX1NUQVRVU19EQ0NfRVZFTlRfTUFTSykpOwotCQkJYm54MnhfX2xpbmtfc3RhdHVzX3VwZGF0ZShicCk7Ci0JCQlpZiAoKGJwLT5wb3J0LnBtZiA9PSAwKSAmJiAodmFsICYgRFJWX1NUQVRVU19QTUYpKQotCQkJCWJueDJ4X3BtZl91cGRhdGUoYnApOwotCi0JCX0gZWxzZSBpZiAoYXR0biAmIEJOWDJYX01DX0FTU0VSVF9CSVRTKSB7Ci0KLQkJCUJOWDJYX0VSUigiTUMgYXNzZXJ0IVxuIik7Ci0JCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMTAsIDApOwotCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzksIDApOwotCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzgsIDApOwotCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzcsIDApOwotCQkJYm54MnhfcGFuaWMoKTsKLQotCQl9IGVsc2UgaWYgKGF0dG4gJiBCTlgyWF9NQ1BfQVNTRVJUKSB7Ci0KLQkJCUJOWDJYX0VSUigiTUNQIGFzc2VydCFcbiIpOwotCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzExLCAwKTsKLQkJCWJueDJ4X2Z3X2R1bXAoYnApOwotCi0JCX0gZWxzZQotCQkJQk5YMlhfRVJSKCJVbmtub3duIEhXIGFzc2VydCEgKGF0dG4gMHgleClcbiIsIGF0dG4pOwotCX0KLQotCWlmIChhdHRuICYgRVZFUkVTVF9MQVRDSEVEX0FUVE5fSU5fVVNFX01BU0spIHsKLQkJQk5YMlhfRVJSKCJMQVRDSEVEIGF0dGVudGlvbiAweCUwOHggKG1hc2tlZClcbiIsIGF0dG4pOwotCQlpZiAoYXR0biAmIEJOWDJYX0dSQ19USU1FT1VUKSB7Ci0JCQl2YWwgPSBDSElQX0lTX0UxSChicCkgPwotCQkJCVJFR19SRChicCwgTUlTQ19SRUdfR1JDX1RJTUVPVVRfQVRUTikgOiAwOwotCQkJQk5YMlhfRVJSKCJHUkMgdGltZS1vdXQgMHglMDh4XG4iLCB2YWwpOwotCQl9Ci0JCWlmIChhdHRuICYgQk5YMlhfR1JDX1JTVikgewotCQkJdmFsID0gQ0hJUF9JU19FMUgoYnApID8KLQkJCQlSRUdfUkQoYnAsIE1JU0NfUkVHX0dSQ19SU1ZfQVRUTikgOiAwOwotCQkJQk5YMlhfRVJSKCJHUkMgcmVzZXJ2ZWQgMHglMDh4XG4iLCB2YWwpOwotCQl9Ci0JCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0NMUl9MQVRDSF9TSUdOQUwsIDB4N2ZmKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfbmljX3VubG9hZChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgdW5sb2FkX21vZGUpOwotc3RhdGljIGludCBibngyeF9uaWNfbG9hZChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbG9hZF9tb2RlKTsKLQotCi0jZGVmaW5lIEJOWDJYX01JU0NfR0VOX1JFRyAgICAgIE1JU0NfUkVHX0dFTkVSSUNfUE9SXzEKLSNkZWZpbmUgTE9BRF9DT1VOVEVSX0JJVFMJMTYgLyogTnVtYmVyIG9mIGJpdHMgZm9yIGxvYWQgY291bnRlciAqLwotI2RlZmluZSBMT0FEX0NPVU5URVJfTUFTSwkoKCh1MzIpMHgxIDw8IExPQURfQ09VTlRFUl9CSVRTKSAtIDEpCi0jZGVmaW5lIFJFU0VUX0RPTkVfRkxBR19NQVNLCSh+TE9BRF9DT1VOVEVSX01BU0spCi0jZGVmaW5lIFJFU0VUX0RPTkVfRkxBR19TSElGVAlMT0FEX0NPVU5URVJfQklUUwotI2RlZmluZSBDSElQX1BBUklUWV9TVVBQT1JURUQoYnApICAgKENISVBfSVNfRTEoYnApIHx8IENISVBfSVNfRTFIKGJwKSkKLS8qCi0gKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jawotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3Jlc2V0X2RvbmUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpOwotCXZhbCAmPSB+KDEgPDwgUkVTRVRfRE9ORV9GTEFHX1NISUZUKTsKLQlSRUdfV1IoYnAsIEJOWDJYX01JU0NfR0VOX1JFRywgdmFsKTsKLQliYXJyaWVyKCk7Ci0JbW1pb3diKCk7Ci19Ci0KLS8qCi0gKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jawotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbAk9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKLQl2YWwgfD0gKDEgPDwgMTYpOwotCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCB2YWwpOwotCWJhcnJpZXIoKTsKLQltbWlvd2IoKTsKLX0KLQotLyoKLSAqIHNob3VsZCBiZSBydW4gdW5kZXIgcnRubCBsb2NrCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBibngyeF9yZXNldF9pc19kb25lKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbAk9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKLQlEUChORVRJRl9NU0dfSFcsICJHRU5fUkVHX1ZBTD0weCUwOHhcbiIsIHZhbCk7Ci0JcmV0dXJuICh2YWwgJiBSRVNFVF9ET05FX0ZMQUdfTUFTSykgPyBmYWxzZSA6IHRydWU7Ci19Ci0KLS8qCi0gKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jawotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfaW5jX2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbDEsIHZhbCA9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKLQotCURQKE5FVElGX01TR19IVywgIk9sZCBHRU5fUkVHX1ZBTD0weCUwOHhcbiIsIHZhbCk7Ci0KLQl2YWwxID0gKCh2YWwgJiBMT0FEX0NPVU5URVJfTUFTSykgKyAxKSAmIExPQURfQ09VTlRFUl9NQVNLOwotCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCAodmFsICYgUkVTRVRfRE9ORV9GTEFHX01BU0spIHwgdmFsMSk7Ci0JYmFycmllcigpOwotCW1taW93YigpOwotfQotCi0vKgotICogc2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKLSAqLwotc3RhdGljIGlubGluZSB1MzIgYm54MnhfZGVjX2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbDEsIHZhbCA9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKLQotCURQKE5FVElGX01TR19IVywgIk9sZCBHRU5fUkVHX1ZBTD0weCUwOHhcbiIsIHZhbCk7Ci0KLQl2YWwxID0gKCh2YWwgJiBMT0FEX0NPVU5URVJfTUFTSykgLSAxKSAmIExPQURfQ09VTlRFUl9NQVNLOwotCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCAodmFsICYgUkVTRVRfRE9ORV9GTEFHX01BU0spIHwgdmFsMSk7Ci0JYmFycmllcigpOwotCW1taW93YigpOwotCi0JcmV0dXJuIHZhbDE7Ci19Ci0KLS8qCi0gKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jawotICovCi1zdGF0aWMgaW5saW5lIHUzMiBibngyeF9nZXRfbG9hZF9jbnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlyZXR1cm4gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpICYgTE9BRF9DT1VOVEVSX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9jbGVhcl9sb2FkX2NudChzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiB2YWwgPSBSRUdfUkQoYnAsIEJOWDJYX01JU0NfR0VOX1JFRyk7Ci0JUkVHX1dSKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcsIHZhbCAmICh+TE9BRF9DT1VOVEVSX01BU0spKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9wcmludF9uZXh0X2Jsb2NrKGludCBpZHgsIGNvbnN0IGNoYXIgKmJsaykKLXsKLQlpZiAoaWR4KQotCQlwcl9jb250KCIsICIpOwotCXByX2NvbnQoIiVzIiwgYmxrKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MCh1MzIgc2lnLCBpbnQgcGFyX251bSkKLXsKLQlpbnQgaSA9IDA7Ci0JdTMyIGN1cl9iaXQgPSAwOwotCWZvciAoaSA9IDA7IHNpZzsgaSsrKSB7Ci0JCWN1cl9iaXQgPSAoKHUzMikweDEgPDwgaSk7Ci0JCWlmIChzaWcgJiBjdXJfYml0KSB7Ci0JCQlzd2l0Y2ggKGN1cl9iaXQpIHsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfQlJCX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJCUkIiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfUEFSU0VSX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJQQVJTRVIiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNETV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiVFNETSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19TRUFSQ0hFUl9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiU0VBUkNIRVIiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlRTRU1JIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIENsZWFyIHRoZSBiaXQgKi8KLQkJCXNpZyAmPSB+Y3VyX2JpdDsKLQkJfQotCX0KLQotCXJldHVybiBwYXJfbnVtOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkxKHUzMiBzaWcsIGludCBwYXJfbnVtKQotewotCWludCBpID0gMDsKLQl1MzIgY3VyX2JpdCA9IDA7Ci0JZm9yIChpID0gMDsgc2lnOyBpKyspIHsKLQkJY3VyX2JpdCA9ICgodTMyKTB4MSA8PCBpKTsKLQkJaWYgKHNpZyAmIGN1cl9iaXQpIHsKLQkJCXN3aXRjaCAoY3VyX2JpdCkgewotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkNMSUVOVF9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiUEJDTElFTlQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfUU1fUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlFNIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRE1fUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlhTRE0iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNFTUlfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlhTRU1JIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RPT1JCRUxMUV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiRE9PUkJFTExRIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1ZBVVhfUENJX0NPUkVfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlZBVVggUENJIENPUkUiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfREVCVUdfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkRFQlVHIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRE1fUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlVTRE0iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNFTUlfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlVTRU1JIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VQQl9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiVVBCIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNTRE0iKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogQ2xlYXIgdGhlIGJpdCAqLwotCQkJc2lnICY9IH5jdXJfYml0OwotCQl9Ci0JfQotCi0JcmV0dXJuIHBhcl9udW07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTIodTMyIHNpZywgaW50IHBhcl9udW0pCi17Ci0JaW50IGkgPSAwOwotCXUzMiBjdXJfYml0ID0gMDsKLQlmb3IgKGkgPSAwOyBzaWc7IGkrKykgewotCQljdXJfYml0ID0gKCh1MzIpMHgxIDw8IGkpOwotCQlpZiAoc2lnICYgY3VyX2JpdCkgewotCQkJc3dpdGNoIChjdXJfYml0KSB7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRU1JX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJDU0VNSSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlBYUCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5fQVRUTl9CSVRTX1BYUFBDSUNMT0NLQ0xJRU5UX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssCi0JCQkJCSJQWFBQQ0lDTE9DS0NMSUVOVCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRkNfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNGQyIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRFVfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNEVSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19JR1VfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIklHVSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NSVNDX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJNSVNDIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIENsZWFyIHRoZSBiaXQgKi8KLQkJCXNpZyAmPSB+Y3VyX2JpdDsKLQkJfQotCX0KLQotCXJldHVybiBwYXJfbnVtOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkzKHUzMiBzaWcsIGludCBwYXJfbnVtKQotewotCWludCBpID0gMDsKLQl1MzIgY3VyX2JpdCA9IDA7Ci0JZm9yIChpID0gMDsgc2lnOyBpKyspIHsKLQkJY3VyX2JpdCA9ICgodTMyKTB4MSA8PCBpKTsKLQkJaWYgKHNpZyAmIGN1cl9iaXQpIHsKLQkJCXN3aXRjaCAoY3VyX2JpdCkgewotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9ST01fUEFSSVRZOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIk1DUCBST00iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfVU1QX1JYX1BBUklUWToKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJNQ1AgVU1QIFJYIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1VNUF9UWF9QQVJJVFk6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUNQIFVNUCBUWCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9TQ1BBRF9QQVJJVFk6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUNQIFNDUEFEIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIENsZWFyIHRoZSBiaXQgKi8KLQkJCXNpZyAmPSB+Y3VyX2JpdDsKLQkJfQotCX0KLQotCXJldHVybiBwYXJfbnVtOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgYm54MnhfcGFyaXR5X2F0dG4oc3RydWN0IGJueDJ4ICpicCwgdTMyIHNpZzAsIHUzMiBzaWcxLAotCQkJCSAgICAgdTMyIHNpZzIsIHUzMiBzaWczKQotewotCWlmICgoc2lnMCAmIEhXX1BSVFlfQVNTRVJUX1NFVF8wKSB8fCAoc2lnMSAmIEhXX1BSVFlfQVNTRVJUX1NFVF8xKSB8fAotCSAgICAoc2lnMiAmIEhXX1BSVFlfQVNTRVJUX1NFVF8yKSB8fCAoc2lnMyAmIEhXX1BSVFlfQVNTRVJUX1NFVF8zKSkgewotCQlpbnQgcGFyX251bSA9IDA7Ci0JCURQKE5FVElGX01TR19IVywgIldhcyBwYXJpdHkgZXJyb3I6IEhXIGJsb2NrIHBhcml0eSBhdHRlbnRpb246ICIKLQkJCSJbMF06MHglMDh4IFsxXToweCUwOHggIgotCQkJIlsyXToweCUwOHggWzNdOjB4JTA4eFxuIiwKLQkJCSAgc2lnMCAmIEhXX1BSVFlfQVNTRVJUX1NFVF8wLAotCQkJICBzaWcxICYgSFdfUFJUWV9BU1NFUlRfU0VUXzEsCi0JCQkgIHNpZzIgJiBIV19QUlRZX0FTU0VSVF9TRVRfMiwKLQkJCSAgc2lnMyAmIEhXX1BSVFlfQVNTRVJUX1NFVF8zKTsKLQkJcHJpbnRrKEtFUk5fRVJSIiVzOiBQYXJpdHkgZXJyb3JzIGRldGVjdGVkIGluIGJsb2NrczogIiwKLQkJICAgICAgIGJwLT5kZXYtPm5hbWUpOwotCQlwYXJfbnVtID0gYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MCgKLQkJCXNpZzAgJiBIV19QUlRZX0FTU0VSVF9TRVRfMCwgcGFyX251bSk7Ci0JCXBhcl9udW0gPSBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkxKAotCQkJc2lnMSAmIEhXX1BSVFlfQVNTRVJUX1NFVF8xLCBwYXJfbnVtKTsKLQkJcGFyX251bSA9IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTIoCi0JCQlzaWcyICYgSFdfUFJUWV9BU1NFUlRfU0VUXzIsIHBhcl9udW0pOwotCQlwYXJfbnVtID0gYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MygKLQkJCXNpZzMgJiBIV19QUlRZX0FTU0VSVF9TRVRfMywgcGFyX251bSk7Ci0JCXByaW50aygiXG4iKTsKLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgYm54MnhfY2hrX3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnApCi17Ci0Jc3RydWN0IGF0dG5fcm91dGUgYXR0bjsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCi0JYXR0bi5zaWdbMF0gPSBSRUdfUkQoYnAsCi0JCU1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfMV9GVU5DXzAgKwotCQkJICAgICBwb3J0KjQpOwotCWF0dG4uc2lnWzFdID0gUkVHX1JEKGJwLAotCQlNSVNDX1JFR19BRVVfQUZURVJfSU5WRVJUXzJfRlVOQ18wICsKLQkJCSAgICAgcG9ydCo0KTsKLQlhdHRuLnNpZ1syXSA9IFJFR19SRChicCwKLQkJTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF8zX0ZVTkNfMCArCi0JCQkgICAgIHBvcnQqNCk7Ci0JYXR0bi5zaWdbM10gPSBSRUdfUkQoYnAsCi0JCU1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfNF9GVU5DXzAgKwotCQkJICAgICBwb3J0KjQpOwotCi0JcmV0dXJuIGJueDJ4X3Bhcml0eV9hdHRuKGJwLCBhdHRuLnNpZ1swXSwgYXR0bi5zaWdbMV0sIGF0dG4uc2lnWzJdLAotCQkJCQlhdHRuLnNpZ1szXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGRlYXNzZXJ0ZWQpCi17Ci0Jc3RydWN0IGF0dG5fcm91dGUgYXR0biwgKmdyb3VwX21hc2s7Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgaW5kZXg7Ci0JdTMyIHJlZ19hZGRyOwotCXUzMiB2YWw7Ci0JdTMyIGFldV9tYXNrOwotCi0JLyogbmVlZCB0byB0YWtlIEhXIGxvY2sgYmVjYXVzZSBNQ1Agb3Igb3RoZXIgcG9ydCBtaWdodCBhbHNvCi0JICAgdHJ5IHRvIGhhbmRsZSB0aGlzIGV2ZW50ICovCi0JYm54MnhfYWNxdWlyZV9hbHIoYnApOwotCi0JaWYgKGJueDJ4X2Noa19wYXJpdHlfYXR0bihicCkpIHsKLQkJYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfSU5JVDsKLQkJYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKGJwKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cmVzZXRfdGFzaywgMCk7Ci0JCS8qIERpc2FibGUgSFcgaW50ZXJydXB0cyAqLwotCQlibngyeF9pbnRfZGlzYWJsZShicCk7Ci0JCWJueDJ4X3JlbGVhc2VfYWxyKGJwKTsKLQkJLyogSW4gY2FzZSBvZiBwYXJpdHkgZXJyb3JzIGRvbid0IGhhbmRsZSBhdHRlbnRpb25zIHNvIHRoYXQKLQkJICogb3RoZXIgZnVuY3Rpb24gd291bGQgInNlZSIgcGFyaXR5IGVycm9ycy4KLQkJICovCi0JCXJldHVybjsKLQl9Ci0KLQlhdHRuLnNpZ1swXSA9IFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF8xX0ZVTkNfMCArIHBvcnQqNCk7Ci0JYXR0bi5zaWdbMV0gPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfMl9GVU5DXzAgKyBwb3J0KjQpOwotCWF0dG4uc2lnWzJdID0gUkVHX1JEKGJwLCBNSVNDX1JFR19BRVVfQUZURVJfSU5WRVJUXzNfRlVOQ18wICsgcG9ydCo0KTsKLQlhdHRuLnNpZ1szXSA9IFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF80X0ZVTkNfMCArIHBvcnQqNCk7Ci0JRFAoTkVUSUZfTVNHX0hXLCAiYXR0bjogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkgICBhdHRuLnNpZ1swXSwgYXR0bi5zaWdbMV0sIGF0dG4uc2lnWzJdLCBhdHRuLnNpZ1szXSk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfRFlOQU1JQ19BVFROX0dSUFM7IGluZGV4KyspIHsKLQkJaWYgKGRlYXNzZXJ0ZWQgJiAoMSA8PCBpbmRleCkpIHsKLQkJCWdyb3VwX21hc2sgPSAmYnAtPmF0dG5fZ3JvdXBbaW5kZXhdOwotCi0JCQlEUChORVRJRl9NU0dfSFcsICJncm91cFslZF06ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQkgICBpbmRleCwgZ3JvdXBfbWFzay0+c2lnWzBdLCBncm91cF9tYXNrLT5zaWdbMV0sCi0JCQkgICBncm91cF9tYXNrLT5zaWdbMl0sIGdyb3VwX21hc2stPnNpZ1szXSk7Ci0KLQkJCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQzKGJwLAotCQkJCQlhdHRuLnNpZ1szXSAmIGdyb3VwX21hc2stPnNpZ1szXSk7Ci0JCQlibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMShicCwKLQkJCQkJYXR0bi5zaWdbMV0gJiBncm91cF9tYXNrLT5zaWdbMV0pOwotCQkJYm54MnhfYXR0bl9pbnRfZGVhc3NlcnRlZDIoYnAsCi0JCQkJCWF0dG4uc2lnWzJdICYgZ3JvdXBfbWFzay0+c2lnWzJdKTsKLQkJCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQwKGJwLAotCQkJCQlhdHRuLnNpZ1swXSAmIGdyb3VwX21hc2stPnNpZ1swXSk7Ci0JCX0KLQl9Ci0KLQlibngyeF9yZWxlYXNlX2FscihicCk7Ci0KLQlyZWdfYWRkciA9IChIQ19SRUdfQ09NTUFORF9SRUcgKyBwb3J0KjMyICsgQ09NTUFORF9SRUdfQVRUTl9CSVRTX0NMUik7Ci0KLQl2YWwgPSB+ZGVhc3NlcnRlZDsKLQlEUChORVRJRl9NU0dfSFcsICJhYm91dCB0byBtYXNrIDB4JTA4eCBhdCBIQyBhZGRyIDB4JXhcbiIsCi0JICAgdmFsLCByZWdfYWRkcik7Ci0JUkVHX1dSKGJwLCByZWdfYWRkciwgdmFsKTsKLQotCWlmICh+YnAtPmF0dG5fc3RhdGUgJiBkZWFzc2VydGVkKQotCQlCTlgyWF9FUlIoIklHVSBFUlJPUlxuIik7Ci0KLQlyZWdfYWRkciA9IHBvcnQgPyBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMSA6Ci0JCQkgIE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18wOwotCi0JYm54MnhfYWNxdWlyZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1BPUlQwX0FUVF9NQVNLICsgcG9ydCk7Ci0JYWV1X21hc2sgPSBSRUdfUkQoYnAsIHJlZ19hZGRyKTsKLQotCURQKE5FVElGX01TR19IVywgImFldV9tYXNrICV4ICBuZXdseSBkZWFzc2VydGVkICV4XG4iLAotCSAgIGFldV9tYXNrLCBkZWFzc2VydGVkKTsKLQlhZXVfbWFzayB8PSAoZGVhc3NlcnRlZCAmIDB4M2ZmKTsKLQlEUChORVRJRl9NU0dfSFcsICJuZXcgbWFzayAleFxuIiwgYWV1X21hc2spOwotCi0JUkVHX1dSKGJwLCByZWdfYWRkciwgYWV1X21hc2spOwotCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9QT1JUMF9BVFRfTUFTSyArIHBvcnQpOwotCi0JRFAoTkVUSUZfTVNHX0hXLCAiYXR0bl9zdGF0ZSAleFxuIiwgYnAtPmF0dG5fc3RhdGUpOwotCWJwLT5hdHRuX3N0YXRlICY9IH5kZWFzc2VydGVkOwotCURQKE5FVElGX01TR19IVywgIm5ldyBzdGF0ZSAleFxuIiwgYnAtPmF0dG5fc3RhdGUpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9hdHRuX2ludChzdHJ1Y3QgYm54MnggKmJwKQotewotCS8qIHJlYWQgbG9jYWwgY29weSBvZiBiaXRzICovCi0JdTMyIGF0dG5fYml0cyA9IGxlMzJfdG9fY3B1KGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLgotCQkJCQkJCQlhdHRuX2JpdHMpOwotCXUzMiBhdHRuX2FjayA9IGxlMzJfdG9fY3B1KGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLgotCQkJCQkJCQlhdHRuX2JpdHNfYWNrKTsKLQl1MzIgYXR0bl9zdGF0ZSA9IGJwLT5hdHRuX3N0YXRlOwotCi0JLyogbG9vayBmb3IgY2hhbmdlZCBiaXRzICovCi0JdTMyIGFzc2VydGVkICAgPSAgYXR0bl9iaXRzICYgfmF0dG5fYWNrICYgfmF0dG5fc3RhdGU7Ci0JdTMyIGRlYXNzZXJ0ZWQgPSB+YXR0bl9iaXRzICYgIGF0dG5fYWNrICYgIGF0dG5fc3RhdGU7Ci0KLQlEUChORVRJRl9NU0dfSFcsCi0JICAgImF0dG5fYml0cyAleCAgYXR0bl9hY2sgJXggIGFzc2VydGVkICV4ICBkZWFzc2VydGVkICV4XG4iLAotCSAgIGF0dG5fYml0cywgYXR0bl9hY2ssIGFzc2VydGVkLCBkZWFzc2VydGVkKTsKLQotCWlmICh+KGF0dG5fYml0cyBeIGF0dG5fYWNrKSAmIChhdHRuX2JpdHMgXiBhdHRuX3N0YXRlKSkKLQkJQk5YMlhfRVJSKCJCQUQgYXR0ZW50aW9uIHN0YXRlXG4iKTsKLQotCS8qIGhhbmRsZSBiaXRzIHRoYXQgd2VyZSByYWlzZWQgKi8KLQlpZiAoYXNzZXJ0ZWQpCi0JCWJueDJ4X2F0dG5faW50X2Fzc2VydGVkKGJwLCBhc3NlcnRlZCk7Ci0KLQlpZiAoZGVhc3NlcnRlZCkKLQkJYm54MnhfYXR0bl9pbnRfZGVhc3NlcnRlZChicCwgZGVhc3NlcnRlZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueDJ4LCBzcF90YXNrLndvcmspOwotCXUxNiBzdGF0dXM7Ci0KLQkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgKi8KLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkpIHsKLQkJRFAoTkVUSUZfTVNHX0lOVFIsICJjYWxsZWQgYnV0IGludHJfc2VtIG5vdCAwLCByZXR1cm5pbmdcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhdHVzID0gYm54MnhfdXBkYXRlX2RzYl9pZHgoYnApOwotLyoJaWYgKHN0YXR1cyA9PSAwKQkJCQkgICAgICovCi0vKgkJQk5YMlhfRVJSKCJzcHVyaW91cyBzbG93cGF0aCBpbnRlcnJ1cHQhXG4iKTsgKi8KLQotCURQKE5FVElGX01TR19JTlRSLCAiZ290IGEgc2xvd3BhdGggaW50ZXJydXB0IChzdGF0dXMgMHgleClcbiIsIHN0YXR1cyk7Ci0KLQkvKiBIVyBhdHRlbnRpb25zICovCi0JaWYgKHN0YXR1cyAmIDB4MSkgewotCQlibngyeF9hdHRuX2ludChicCk7Ci0JCXN0YXR1cyAmPSB+MHgxOwotCX0KLQotCS8qIENTdG9ybSBldmVudHM6IFNUQVRfUVVFUlkgKi8KLQlpZiAoc3RhdHVzICYgMHgyKSB7Ci0JCURQKEJOWDJYX01TR19TUCwgIkNTdG9ybSBldmVudHM6IFNUQVRfUVVFUllcbiIpOwotCQlzdGF0dXMgJj0gfjB4MjsKLQl9Ci0KLQlpZiAodW5saWtlbHkoc3RhdHVzKSkKLQkJRFAoTkVUSUZfTVNHX0lOVFIsICJnb3QgYW4gdW5rbm93biBpbnRlcnJ1cHQhIChzdGF0dXMgMHgleClcbiIsCi0JCSAgIHN0YXR1cyk7Ci0KLQlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgQVRURU5USU9OX0lELCBsZTE2X3RvX2NwdShicC0+ZGVmX2F0dF9pZHgpLAotCQkgICAgIElHVV9JTlRfTk9QLCAxKTsKLQlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgVVNUT1JNX0lELCBsZTE2X3RvX2NwdShicC0+ZGVmX3VfaWR4KSwKLQkJICAgICBJR1VfSU5UX05PUCwgMSk7Ci0JYm54MnhfYWNrX3NiKGJwLCBERUZfU0JfSUQsIENTVE9STV9JRCwgbGUxNl90b19jcHUoYnAtPmRlZl9jX2lkeCksCi0JCSAgICAgSUdVX0lOVF9OT1AsIDEpOwotCWJueDJ4X2Fja19zYihicCwgREVGX1NCX0lELCBYU1RPUk1fSUQsIGxlMTZfdG9fY3B1KGJwLT5kZWZfeF9pZHgpLAotCQkgICAgIElHVV9JTlRfTk9QLCAxKTsKLQlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgVFNUT1JNX0lELCBsZTE2X3RvX2NwdShicC0+ZGVmX3RfaWR4KSwKLQkJICAgICBJR1VfSU5UX0VOQUJMRSwgMSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBibngyeF9tc2l4X3NwX2ludChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCS8qIFJldHVybiBoZXJlIGlmIGludGVycnVwdCBpcyBkaXNhYmxlZCAqLwotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKSkgewotCQlEUChORVRJRl9NU0dfSU5UUiwgImNhbGxlZCBidXQgaW50cl9zZW0gbm90IDAsIHJldHVybmluZ1xuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgVFNUT1JNX0lELCAwLCBJR1VfSU5UX0RJU0FCTEUsIDApOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0jZW5kaWYKLQotI2lmZGVmIEJDTV9DTklDCi0JewotCQlzdHJ1Y3QgY25pY19vcHMgKmNfb3BzOwotCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJY19vcHMgPSByY3VfZGVyZWZlcmVuY2UoYnAtPmNuaWNfb3BzKTsKLQkJaWYgKGNfb3BzKQotCQkJY19vcHMtPmNuaWNfaGFuZGxlcihicC0+Y25pY19kYXRhLCBOVUxMKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQotI2VuZGlmCi0JcXVldWVfZGVsYXllZF93b3JrKGJueDJ4X3dxLCAmYnAtPnNwX3Rhc2ssIDApOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiBlbmQgb2Ygc2xvdyBwYXRoICovCi0KLS8qIFN0YXRpc3RpY3MgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFjcm9zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBzdW1baGk6bG9dICs9IGFkZFtoaTpsb10gKi8KLSNkZWZpbmUgQUREXzY0KHNfaGksIGFfaGksIHNfbG8sIGFfbG8pIFwKLQlkbyB7IFwKLQkJc19sbyArPSBhX2xvOyBcCi0JCXNfaGkgKz0gYV9oaSArICgoc19sbyA8IGFfbG8pID8gMSA6IDApOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogZGlmZmVyZW5jZSA9IG1pbnVlbmQgLSBzdWJ0cmFoZW5kICovCi0jZGVmaW5lIERJRkZfNjQoZF9oaSwgbV9oaSwgc19oaSwgZF9sbywgbV9sbywgc19sbykgXAotCWRvIHsgXAotCQlpZiAobV9sbyA8IHNfbG8pIHsgXAotCQkJLyogdW5kZXJmbG93ICovIFwKLQkJCWRfaGkgPSBtX2hpIC0gc19oaTsgXAotCQkJaWYgKGRfaGkgPiAwKSB7IFwKLQkJCQkvKiB3ZSBjYW4gJ2xvYW4nIDEgKi8gXAotCQkJCWRfaGktLTsgXAotCQkJCWRfbG8gPSBtX2xvICsgKFVJTlRfTUFYIC0gc19sbykgKyAxOyBcCi0JCQl9IGVsc2UgeyBcCi0JCQkJLyogbV9oaSA8PSBzX2hpICovIFwKLQkJCQlkX2hpID0gMDsgXAotCQkJCWRfbG8gPSAwOyBcCi0JCQl9IFwKLQkJfSBlbHNlIHsgXAotCQkJLyogbV9sbyA+PSBzX2xvICovIFwKLQkJCWlmIChtX2hpIDwgc19oaSkgeyBcCi0JCQkJZF9oaSA9IDA7IFwKLQkJCQlkX2xvID0gMDsgXAotCQkJfSBlbHNlIHsgXAotCQkJCS8qIG1faGkgPj0gc19oaSAqLyBcCi0JCQkJZF9oaSA9IG1faGkgLSBzX2hpOyBcCi0JCQkJZF9sbyA9IG1fbG8gLSBzX2xvOyBcCi0JCQl9IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVUERBVEVfU1RBVDY0KHMsIHQpIFwKLQlkbyB7IFwKLQkJRElGRl82NChkaWZmLmhpLCBuZXctPnMjI19oaSwgcHN0YXRzLT5tYWNfc3R4WzBdLnQjI19oaSwgXAotCQkJZGlmZi5sbywgbmV3LT5zIyNfbG8sIHBzdGF0cy0+bWFjX3N0eFswXS50IyNfbG8pOyBcCi0JCXBzdGF0cy0+bWFjX3N0eFswXS50IyNfaGkgPSBuZXctPnMjI19oaTsgXAotCQlwc3RhdHMtPm1hY19zdHhbMF0udCMjX2xvID0gbmV3LT5zIyNfbG87IFwKLQkJQUREXzY0KHBzdGF0cy0+bWFjX3N0eFsxXS50IyNfaGksIGRpZmYuaGksIFwKLQkJICAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS50IyNfbG8sIGRpZmYubG8pOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVUERBVEVfU1RBVDY0X05JRyhzLCB0KSBcCi0JZG8geyBcCi0JCURJRkZfNjQoZGlmZi5oaSwgbmV3LT5zIyNfaGksIG9sZC0+cyMjX2hpLCBcCi0JCQlkaWZmLmxvLCBuZXctPnMjI19sbywgb2xkLT5zIyNfbG8pOyBcCi0JCUFERF82NChlc3RhdHMtPnQjI19oaSwgZGlmZi5oaSwgXAotCQkgICAgICAgZXN0YXRzLT50IyNfbG8sIGRpZmYubG8pOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogc3VtW2hpOmxvXSArPSBhZGQgKi8KLSNkZWZpbmUgQUREX0VYVEVORF82NChzX2hpLCBzX2xvLCBhKSBcCi0JZG8geyBcCi0JCXNfbG8gKz0gYTsgXAotCQlzX2hpICs9IChzX2xvIDwgYSkgPyAxIDogMDsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVBEQVRFX0VYVEVORF9TVEFUKHMpIFwKLQlkbyB7IFwKLQkJQUREX0VYVEVORF82NChwc3RhdHMtPm1hY19zdHhbMV0ucyMjX2hpLCBcCi0JCQkgICAgICBwc3RhdHMtPm1hY19zdHhbMV0ucyMjX2xvLCBcCi0JCQkgICAgICBuZXctPnMpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVUERBVEVfRVhURU5EX1RTVEFUKHMsIHQpIFwKLQlkbyB7IFwKLQkJZGlmZiA9IGxlMzJfdG9fY3B1KHRjbGllbnQtPnMpIC0gbGUzMl90b19jcHUob2xkX3RjbGllbnQtPnMpOyBcCi0JCW9sZF90Y2xpZW50LT5zID0gdGNsaWVudC0+czsgXAotCQlBRERfRVhURU5EXzY0KHFzdGF0cy0+dCMjX2hpLCBxc3RhdHMtPnQjI19sbywgZGlmZik7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVQREFURV9FWFRFTkRfVVNUQVQocywgdCkgXAotCWRvIHsgXAotCQlkaWZmID0gbGUzMl90b19jcHUodWNsaWVudC0+cykgLSBsZTMyX3RvX2NwdShvbGRfdWNsaWVudC0+cyk7IFwKLQkJb2xkX3VjbGllbnQtPnMgPSB1Y2xpZW50LT5zOyBcCi0JCUFERF9FWFRFTkRfNjQocXN0YXRzLT50IyNfaGksIHFzdGF0cy0+dCMjX2xvLCBkaWZmKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVBEQVRFX0VYVEVORF9YU1RBVChzLCB0KSBcCi0JZG8geyBcCi0JCWRpZmYgPSBsZTMyX3RvX2NwdSh4Y2xpZW50LT5zKSAtIGxlMzJfdG9fY3B1KG9sZF94Y2xpZW50LT5zKTsgXAotCQlvbGRfeGNsaWVudC0+cyA9IHhjbGllbnQtPnM7IFwKLQkJQUREX0VYVEVORF82NChxc3RhdHMtPnQjI19oaSwgcXN0YXRzLT50IyNfbG8sIGRpZmYpOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogbWludWVuZCAtPSBzdWJ0cmFoZW5kICovCi0jZGVmaW5lIFNVQl82NChtX2hpLCBzX2hpLCBtX2xvLCBzX2xvKSBcCi0JZG8geyBcCi0JCURJRkZfNjQobV9oaSwgbV9oaSwgc19oaSwgbV9sbywgbV9sbywgc19sbyk7IFwKLQl9IHdoaWxlICgwKQotCi0vKiBtaW51ZW5kW2hpOmxvXSAtPSBzdWJ0cmFoZW5kICovCi0jZGVmaW5lIFNVQl9FWFRFTkRfNjQobV9oaSwgbV9sbywgcykgXAotCWRvIHsgXAotCQlTVUJfNjQobV9oaSwgMCwgbV9sbywgcyk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFNVQl9FWFRFTkRfVVNUQVQocywgdCkgXAotCWRvIHsgXAotCQlkaWZmID0gbGUzMl90b19jcHUodWNsaWVudC0+cykgLSBsZTMyX3RvX2NwdShvbGRfdWNsaWVudC0+cyk7IFwKLQkJU1VCX0VYVEVORF82NChxc3RhdHMtPnQjI19oaSwgcXN0YXRzLT50IyNfbG8sIGRpZmYpOyBcCi0JfSB3aGlsZSAoMCkKLQotLyoKLSAqIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgaW5saW5lIGxvbmcgYm54MnhfaGlsbyh1MzIgKmhpcmVmKQotewotCXUzMiBsbyA9ICooaGlyZWYgKyAxKTsKLSNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKLQl1MzIgaGkgPSAqaGlyZWY7Ci0KLQlyZXR1cm4gSElMT19VNjQoaGksIGxvKTsKLSNlbHNlCi0JcmV0dXJuIGxvOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBJbml0IHNlcnZpY2UgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIHZvaWQgYm54Mnhfc3Rvcm1fc3RhdHNfcG9zdChzdHJ1Y3QgYm54MnggKmJwKQotewotCWlmICghYnAtPnN0YXRzX3BlbmRpbmcpIHsKLQkJc3RydWN0IGV0aF9xdWVyeV9yYW1yb2RfZGF0YSByYW1yb2RfZGF0YSA9IHswfTsKLQkJaW50IGksIHJjOwotCi0JCXJhbXJvZF9kYXRhLmRydl9jb3VudGVyID0gYnAtPnN0YXRzX2NvdW50ZXIrKzsKLQkJcmFtcm9kX2RhdGEuY29sbGVjdF9wb3J0ID0gYnAtPnBvcnQucG1mID8gMSA6IDA7Ci0JCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQotCQkJcmFtcm9kX2RhdGEuY3RyX2lkX3ZlY3RvciB8PSAoMSA8PCBicC0+ZnBbaV0uY2xfaWQpOwotCi0JCXJjID0gYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfU1RBVF9RVUVSWSwgMCwKLQkJCQkgICAoKHUzMiAqKSZyYW1yb2RfZGF0YSlbMV0sCi0JCQkJICAgKCh1MzIgKikmcmFtcm9kX2RhdGEpWzBdLCAwKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCS8qIHN0YXRzIHJhbXJvZCBoYXMgaXQncyBvd24gc2xvdCBvbiB0aGUgc3BxICovCi0JCQlicC0+c3BxX2xlZnQrKzsKLQkJCWJwLT5zdGF0c19wZW5kaW5nID0gMTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaHdfc3RhdHNfcG9zdChzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPnN0YXRzX2RtYWU7Ci0JdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOwotCi0JKnN0YXRzX2NvbXAgPSBETUFFX0NPTVBfVkFMOwotCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJcmV0dXJuOwotCi0JLyogbG9hZGVyICovCi0JaWYgKGJwLT5leGVjdXRlcl9pZHgpIHsKLQkJaW50IGxvYWRlcl9pZHggPSBQTUZfRE1BRV9DKGJwKTsKLQotCQltZW1zZXQoZG1hZSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpKTsKLQotCQlkbWFlLT5vcGNvZGUgPSAoRE1BRV9DTURfU1JDX1BDSSB8IERNQUVfQ01EX0RTVF9HUkMgfAotCQkJCURNQUVfQ01EX0NfRFNUX0dSQyB8IERNQUVfQ01EX0NfRU5BQkxFIHwKLQkJCQlETUFFX0NNRF9EU1RfUkVTRVQgfAotI2lmZGVmIF9fQklHX0VORElBTgotCQkJCURNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAotI2Vsc2UKLQkJCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8Ci0jZW5kaWYKLQkJCQkoQlBfUE9SVChicCkgPyBETUFFX0NNRF9QT1JUXzEgOgotCQkJCQkgICAgICAgRE1BRV9DTURfUE9SVF8wKSB8Ci0JCQkJKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOwotCQlkbWFlLT5zcmNfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBkbWFlWzBdKSk7Ci0JCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIGRtYWVbMF0pKTsKLQkJZG1hZS0+ZHN0X2FkZHJfbG8gPSAoRE1BRV9SRUdfQ01EX01FTSArCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkgKgotCQkJCSAgICAgKGxvYWRlcl9pZHggKyAxKSkgPj4gMjsKLQkJZG1hZS0+ZHN0X2FkZHJfaGkgPSAwOwotCQlkbWFlLT5sZW4gPSBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkgPj4gMjsKLQkJaWYgKENISVBfSVNfRTEoYnApKQotCQkJZG1hZS0+bGVuLS07Ci0JCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeCArIDFdID4+IDI7Ci0JCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7Ci0JCWRtYWUtPmNvbXBfdmFsID0gMTsKLQotCQkqc3RhdHNfY29tcCA9IDA7Ci0JCWJueDJ4X3Bvc3RfZG1hZShicCwgZG1hZSwgbG9hZGVyX2lkeCk7Ci0KLQl9IGVsc2UgaWYgKGJwLT5mdW5jX3N0eCkgewotCQkqc3RhdHNfY29tcCA9IDA7Ci0JCWJueDJ4X3Bvc3RfZG1hZShicCwgZG1hZSwgSU5JVF9ETUFFX0MoYnApKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfc3RhdHNfY29tcChzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKLQlpbnQgY250ID0gMTA7Ci0KLQltaWdodF9zbGVlcCgpOwotCXdoaWxlICgqc3RhdHNfY29tcCAhPSBETUFFX0NPTVBfVkFMKSB7Ci0JCWlmICghY250KSB7Ci0JCQlCTlgyWF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3Igc3RhdHMgZmluaXNoZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY250LS07Ci0JCW1zbGVlcCgxKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBTdGF0aXN0aWNzIHNlcnZpY2UgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfcG1mX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWU7Ci0JdTMyIG9wY29kZTsKLQlpbnQgbG9hZGVyX2lkeCA9IFBNRl9ETUFFX0MoYnApOwotCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKLQotCS8qIHNhbml0eSAqLwotCWlmICghSVNfRTFITUYoYnApIHx8ICFicC0+cG9ydC5wbWYgfHwgIWJwLT5wb3J0LnBvcnRfc3R4KSB7Ci0JCUJOWDJYX0VSUigiQlVHIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlicC0+ZXhlY3V0ZXJfaWR4ID0gMDsKLQotCW9wY29kZSA9IChETUFFX0NNRF9TUkNfR1JDIHwgRE1BRV9DTURfRFNUX1BDSSB8Ci0JCSAgRE1BRV9DTURfQ19FTkFCTEUgfAotCQkgIERNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCSAgRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8Ci0jZWxzZQotCQkgIERNQUVfQ01EX0VORElBTklUWV9EV19TV0FQIHwKLSNlbmRpZgotCQkgIChCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAotCQkgIChCUF9FMUhWTihicCkgPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKLQotCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQlkbWFlLT5vcGNvZGUgPSAob3Bjb2RlIHwgRE1BRV9DTURfQ19EU1RfR1JDKTsKLQlkbWFlLT5zcmNfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7Ci0JZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKLQlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBwb3J0X3N0YXRzKSk7Ci0JZG1hZS0+bGVuID0gRE1BRV9MRU4zMl9SRF9NQVg7Ci0JZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOwotCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7Ci0JZG1hZS0+Y29tcF92YWwgPSAxOwotCi0JZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOwotCWRtYWUtPm9wY29kZSA9IChvcGNvZGUgfCBETUFFX0NNRF9DX0RTVF9QQ0kpOwotCWRtYWUtPnNyY19hZGRyX2xvID0gKGJwLT5wb3J0LnBvcnRfc3R4ID4+IDIpICsgRE1BRV9MRU4zMl9SRF9NQVg7Ci0JZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpICsKLQkJCQkgICBETUFFX0xFTjMyX1JEX01BWCAqIDQpOwotCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpICsKLQkJCQkgICBETUFFX0xFTjMyX1JEX01BWCAqIDQpOwotCWRtYWUtPmxlbiA9IChzaXplb2Yoc3RydWN0IGhvc3RfcG9ydF9zdGF0cykgPj4gMikgLSBETUFFX0xFTjMyX1JEX01BWDsKLQlkbWFlLT5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOwotCWRtYWUtPmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7Ci0JZG1hZS0+Y29tcF92YWwgPSBETUFFX0NPTVBfVkFMOwotCi0JKnN0YXRzX2NvbXAgPSAwOwotCWJueDJ4X2h3X3N0YXRzX3Bvc3QoYnApOwotCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9wb3J0X3N0YXRzX2luaXQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgZG1hZV9jb21tYW5kICpkbWFlOwotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IHZuID0gQlBfRTFIVk4oYnApOwotCXUzMiBvcGNvZGU7Ci0JaW50IGxvYWRlcl9pZHggPSBQTUZfRE1BRV9DKGJwKTsKLQl1MzIgbWFjX2FkZHI7Ci0JdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOwotCi0JLyogc2FuaXR5ICovCi0JaWYgKCFicC0+bGlua192YXJzLmxpbmtfdXAgfHwgIWJwLT5wb3J0LnBtZikgewotCQlCTlgyWF9FUlIoIkJVRyFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JYnAtPmV4ZWN1dGVyX2lkeCA9IDA7Ci0KLQkvKiBNQ1AgKi8KLQlvcGNvZGUgPSAoRE1BRV9DTURfU1JDX1BDSSB8IERNQUVfQ01EX0RTVF9HUkMgfAotCQkgIERNQUVfQ01EX0NfRFNUX0dSQyB8IERNQUVfQ01EX0NfRU5BQkxFIHwKLQkJICBETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAotI2lmZGVmIF9fQklHX0VORElBTgotCQkgIERNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAotI2Vsc2UKLQkJICBETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8Ci0jZW5kaWYKLQkJICAocG9ydCA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAotCQkgICh2biA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOwotCi0JaWYgKGJwLT5wb3J0LnBvcnRfc3R4KSB7Ci0KLQkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOwotCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7Ci0JCWRtYWUtPnNyY19hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKLQkJZG1hZS0+c3JjX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgcG9ydF9zdGF0cykpOwotCQlkbWFlLT5kc3RfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7Ci0JCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDI7Ci0JCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+Y29tcF92YWwgPSAxOwotCX0KLQotCWlmIChicC0+ZnVuY19zdHgpIHsKLQotCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKLQkJZG1hZS0+c3JjX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgZnVuY19zdGF0cykpOwotCQlkbWFlLT5zcmNfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzKSk7Ci0JCWRtYWUtPmRzdF9hZGRyX2xvID0gYnAtPmZ1bmNfc3R4ID4+IDI7Ci0JCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpID4+IDI7Ci0JCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+Y29tcF92YWwgPSAxOwotCX0KLQotCS8qIE1BQyAqLwotCW9wY29kZSA9IChETUFFX0NNRF9TUkNfR1JDIHwgRE1BRV9DTURfRFNUX1BDSSB8Ci0JCSAgRE1BRV9DTURfQ19EU1RfR1JDIHwgRE1BRV9DTURfQ19FTkFCTEUgfAotCQkgIERNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCSAgRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8Ci0jZWxzZQotCQkgIERNQUVfQ01EX0VORElBTklUWV9EV19TV0FQIHwKLSNlbmRpZgotCQkgIChwb3J0ID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8Ci0JCSAgKHZuIDw8IERNQUVfQ01EX0UxSFZOX1NISUZUKSk7Ci0KLQlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9CTUFDKSB7Ci0KLQkJbWFjX2FkZHIgPSAocG9ydCA/IE5JR19SRUdfSU5HUkVTU19CTUFDMV9NRU0gOgotCQkJCSAgIE5JR19SRUdfSU5HUkVTU19CTUFDMF9NRU0pOwotCi0JCS8qIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUUEtUIC4uCi0JCSAgIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUQllUICovCi0JCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQkJZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOwotCQlkbWFlLT5zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCi0JCQkJICAgICBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCkgPj4gMjsKLQkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpKTsKLQkJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7Ci0JCWRtYWUtPmxlbiA9ICg4ICsgQklHTUFDX1JFR0lTVEVSX1RYX1NUQVRfR1RCWVQgLQotCQkJICAgICBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCkgPj4gMjsKLQkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOwotCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOwotCQlkbWFlLT5jb21wX3ZhbCA9IDE7Ci0KLQkJLyogQklHTUFDX1JFR0lTVEVSX1JYX1NUQVRfR1I2NCAuLgotCQkgICBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUklQSiAqLwotCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKLQkJZG1hZS0+c3JjX2FkZHJfbG8gPSAobWFjX2FkZHIgKwotCQkJCSAgICAgQklHTUFDX1JFR0lTVEVSX1JYX1NUQVRfR1I2NCkgPj4gMjsKLQkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgYm1hY19zdGF0cywgcnhfc3RhdF9ncjY0X2xvKSk7Ci0JCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKwotCQkJCW9mZnNldG9mKHN0cnVjdCBibWFjX3N0YXRzLCByeF9zdGF0X2dyNjRfbG8pKTsKLQkJZG1hZS0+bGVuID0gKDggKyBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUklQSiAtCi0JCQkgICAgIEJJR01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSNjQpID4+IDI7Ci0JCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+Y29tcF92YWwgPSAxOwotCi0JfSBlbHNlIGlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0VNQUMpIHsKLQotCQltYWNfYWRkciA9IChwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzApOwotCi0JCS8qIEVNQUNfUkVHX0VNQUNfUlhfU1RBVF9BQyAoRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDX0NPVU5UKSovCi0JCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQkJZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOwotCQlkbWFlLT5zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCi0JCQkJICAgICBFTUFDX1JFR19FTUFDX1JYX1NUQVRfQUMpID4+IDI7Ci0JCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKLQkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7Ci0JCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykpOwotCQlkbWFlLT5sZW4gPSBFTUFDX1JFR19FTUFDX1JYX1NUQVRfQUNfQ09VTlQ7Ci0JCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+Y29tcF92YWwgPSAxOwotCi0JCS8qIEVNQUNfUkVHX0VNQUNfUlhfU1RBVF9BQ18yOCAqLwotCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKLQkJZG1hZS0+c3JjX2FkZHJfbG8gPSAobWFjX2FkZHIgKwotCQkJCSAgICAgRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDXzI4KSA+PiAyOwotCQlkbWFlLT5zcmNfYWRkcl9oaSA9IDA7Ci0JCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKwotCQkgICAgIG9mZnNldG9mKHN0cnVjdCBlbWFjX3N0YXRzLCByeF9zdGF0X2ZhbHNlY2FycmllcmVycm9ycykpOwotCQlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgZW1hY19zdGF0cywgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnMpKTsKLQkJZG1hZS0+bGVuID0gMTsKLQkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOwotCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOwotCQlkbWFlLT5jb21wX3ZhbCA9IDE7Ci0KLQkJLyogRU1BQ19SRUdfRU1BQ19UWF9TVEFUX0FDIChFTUFDX1JFR19FTUFDX1RYX1NUQVRfQUNfQ09VTlQpKi8KLQkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOwotCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7Ci0JCWRtYWUtPnNyY19hZGRyX2xvID0gKG1hY19hZGRyICsKLQkJCQkgICAgIEVNQUNfUkVHX0VNQUNfVFhfU1RBVF9BQykgPj4gMjsKLQkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJCW9mZnNldG9mKHN0cnVjdCBlbWFjX3N0YXRzLCB0eF9zdGF0X2lmaGNvdXRvY3RldHMpKTsKLQkJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSArCi0JCQlvZmZzZXRvZihzdHJ1Y3QgZW1hY19zdGF0cywgdHhfc3RhdF9pZmhjb3V0b2N0ZXRzKSk7Ci0JCWRtYWUtPmxlbiA9IEVNQUNfUkVHX0VNQUNfVFhfU1RBVF9BQ19DT1VOVDsKLQkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOwotCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOwotCQlkbWFlLT5jb21wX3ZhbCA9IDE7Ci0JfQotCi0JLyogTklHICovCi0JZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOwotCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKLQlkbWFlLT5zcmNfYWRkcl9sbyA9IChwb3J0ID8gTklHX1JFR19TVEFUMV9CUkJfRElTQ0FSRCA6Ci0JCQkJICAgIE5JR19SRUdfU1RBVDBfQlJCX0RJU0NBUkQpID4+IDI7Ci0JZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykpOwotCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykpOwotCWRtYWUtPmxlbiA9IChzaXplb2Yoc3RydWN0IG5pZ19zdGF0cykgLSA0KnNpemVvZih1MzIpKSA+PiAyOwotCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOwotCWRtYWUtPmNvbXBfdmFsID0gMTsKLQotCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7Ci0JZG1hZS0+c3JjX2FkZHJfbG8gPSAocG9ydCA/IE5JR19SRUdfU1RBVDFfRUdSRVNTX01BQ19QS1QwIDoKLQkJCQkgICAgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDApID4+IDI7Ci0JZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykgKwotCQkJb2Zmc2V0b2Yoc3RydWN0IG5pZ19zdGF0cywgZWdyZXNzX21hY19wa3QwX2xvKSk7Ci0JZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCi0JCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDBfbG8pKTsKLQlkbWFlLT5sZW4gPSAoMipzaXplb2YodTMyKSkgPj4gMjsKLQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7Ci0JZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKLQlkbWFlLT5jb21wX3ZhbCA9IDE7Ci0KLQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JZG1hZS0+b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19HUkMgfCBETUFFX0NNRF9EU1RfUENJIHwKLQkJCURNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKLQkJCURNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKLSNlbHNlCi0JCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8Ci0jZW5kaWYKLQkJCShwb3J0ID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8Ci0JCQkodm4gPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKLQlkbWFlLT5zcmNfYWRkcl9sbyA9IChwb3J0ID8gTklHX1JFR19TVEFUMV9FR1JFU1NfTUFDX1BLVDEgOgotCQkJCSAgICBOSUdfUkVHX1NUQVQwX0VHUkVTU19NQUNfUEtUMSkgPj4gMjsKLQlkbWFlLT5zcmNfYWRkcl9oaSA9IDA7Ci0JZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCi0JCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDFfbG8pKTsKLQlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBuaWdfc3RhdHMpICsKLQkJCW9mZnNldG9mKHN0cnVjdCBuaWdfc3RhdHMsIGVncmVzc19tYWNfcGt0MV9sbykpOwotCWRtYWUtPmxlbiA9ICgyKnNpemVvZih1MzIpKSA+PiAyOwotCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7Ci0JZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKLQlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7Ci0KLQkqc3RhdHNfY29tcCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2Z1bmNfc3RhdHNfaW5pdChzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPnN0YXRzX2RtYWU7Ci0JdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOwotCi0JLyogc2FuaXR5ICovCi0JaWYgKCFicC0+ZnVuY19zdHgpIHsKLQkJQk5YMlhfRVJSKCJCVUchXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWJwLT5leGVjdXRlcl9pZHggPSAwOwotCW1lbXNldChkbWFlLCAwLCBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkpOwotCi0JZG1hZS0+b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19QQ0kgfCBETUFFX0NNRF9EU1RfR1JDIHwKLQkJCURNQUVfQ01EX0NfRFNUX1BDSSB8IERNQUVfQ01EX0NfRU5BQkxFIHwKLQkJCURNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKLSNlbHNlCi0JCQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8Ci0jZW5kaWYKLQkJCShCUF9QT1JUKGJwKSA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkgfAotCQkJKEJQX0UxSFZOKGJwKSA8PCBETUFFX0NNRF9FMUhWTl9TSElGVCkpOwotCWRtYWUtPnNyY19hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ1bmNfc3RhdHMpKTsKLQlkbWFlLT5zcmNfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzKSk7Ci0JZG1hZS0+ZHN0X2FkZHJfbG8gPSBicC0+ZnVuY19zdHggPj4gMjsKLQlkbWFlLT5kc3RfYWRkcl9oaSA9IDA7Ci0JZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpID4+IDI7Ci0JZG1hZS0+Y29tcF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKLQlkbWFlLT5jb21wX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOwotCWRtYWUtPmNvbXBfdmFsID0gRE1BRV9DT01QX1ZBTDsKLQotCSpzdGF0c19jb21wID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfc3RhcnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoYnAtPnBvcnQucG1mKQotCQlibngyeF9wb3J0X3N0YXRzX2luaXQoYnApOwotCi0JZWxzZSBpZiAoYnAtPmZ1bmNfc3R4KQotCQlibngyeF9mdW5jX3N0YXRzX2luaXQoYnApOwotCi0JYm54MnhfaHdfc3RhdHNfcG9zdChicCk7Ci0JYm54Mnhfc3Rvcm1fc3RhdHNfcG9zdChicCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX3BtZl9zdGFydChzdHJ1Y3QgYm54MnggKmJwKQotewotCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotCWJueDJ4X3N0YXRzX3BtZl91cGRhdGUoYnApOwotCWJueDJ4X3N0YXRzX3N0YXJ0KGJwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfcmVzdGFydChzdHJ1Y3QgYm54MnggKmJwKQotewotCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotCWJueDJ4X3N0YXRzX3N0YXJ0KGJwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfYm1hY19zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgYm1hY19zdGF0cyAqbmV3ID0gYm54Mnhfc3AoYnAsIG1hY19zdGF0cy5ibWFjX3N0YXRzKTsKLQlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzICpwc3RhdHMgPSBibngyeF9zcChicCwgcG9ydF9zdGF0cyk7Ci0Jc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gJmJwLT5ldGhfc3RhdHM7Ci0Jc3RydWN0IHsKLQkJdTMyIGxvOwotCQl1MzIgaGk7Ci0JfSBkaWZmOwotCi0JVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyZXJiLCByeF9zdGF0X2lmaGNpbmJhZG9jdGV0cyk7Ci0JVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyZmNzLCByeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9ycyk7Ci0JVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dydW5kLCByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzKTsKLQlVUERBVEVfU1RBVDY0KHJ4X3N0YXRfZ3JvdnIsIHJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZyk7Ci0JVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyZnJnLCByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHMpOwotCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncmpiciwgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVycyk7Ci0JVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyeGNmLCByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZCk7Ci0JVVBEQVRFX1NUQVQ2NChyeF9zdGF0X2dyeHBmLCByeF9zdGF0X3hvZmZzdGF0ZWVudGVyZWQpOwotCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhwZiwgcnhfc3RhdF9ibWFjX3hwZik7Ci0JVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0eHBmLCB0eF9zdGF0X291dHhvZmZzZW50KTsKLQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3R4cGYsIHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lKTsKLQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q2NCwgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzKTsKLQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3QxMjcsCi0JCQkJdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHMpOwotCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDI1NSwKLQkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTI4b2N0ZXRzdG8yNTVvY3RldHMpOwotCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDUxMSwKLQkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHMpOwotCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDEwMjMsCi0JCQkJdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0cyk7Ci0JVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MTUxOCwKLQkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0cyk7Ci0JVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MjA0NywgdHhfc3RhdF9ibWFjXzIwNDcpOwotCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDQwOTUsIHR4X3N0YXRfYm1hY180MDk1KTsKLQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q5MjE2LCB0eF9zdGF0X2JtYWNfOTIxNik7Ci0JVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MTYzODMsIHR4X3N0YXRfYm1hY18xNjM4Myk7Ci0JVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0ZXJyLAotCQkJCXR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9ycyk7Ci0JVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0dWZsLCB0eF9zdGF0X2JtYWNfdWZsKTsKLQotCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpID0KLQkJCQlwc3RhdHMtPm1hY19zdHhbMV0ucnhfc3RhdF9ibWFjX3hwZl9oaTsKLQllc3RhdHMtPnBhdXNlX2ZyYW1lc19yZWNlaXZlZF9sbyA9Ci0JCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnJ4X3N0YXRfYm1hY194cGZfbG87Ci0KLQllc3RhdHMtPnBhdXNlX2ZyYW1lc19zZW50X2hpID0KLQkJCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b2Zmc2VudF9oaTsKLQllc3RhdHMtPnBhdXNlX2ZyYW1lc19zZW50X2xvID0KLQkJCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b2Zmc2VudF9sbzsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZW1hY19zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgZW1hY19zdGF0cyAqbmV3ID0gYm54Mnhfc3AoYnAsIG1hY19zdGF0cy5lbWFjX3N0YXRzKTsKLQlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzICpwc3RhdHMgPSBibngyeF9zcChicCwgcG9ydF9zdGF0cyk7Ci0Jc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gJmJwLT5ldGhfc3RhdHM7Ci0KLQlVUERBVEVfRVhURU5EX1NUQVQocnhfc3RhdF9pZmhjaW5iYWRvY3RldHMpOwotCVVQREFURV9FWFRFTkRfU1RBVCh0eF9zdGF0X2lmaGNvdXRiYWRvY3RldHMpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9ycyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHJ4X3N0YXRfZG90M3N0YXRzYWxpZ25tZW50ZXJyb3JzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQocnhfc3RhdF9kb3Qzc3RhdHNjYXJyaWVyc2Vuc2VlcnJvcnMpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2ZhbHNlY2FycmllcmVycm9ycyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHMpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmcpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHMpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X2V0aGVyc3RhdHNqYWJiZXJzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQocnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWQpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X3hvZmZzdGF0ZWVudGVyZWQpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWQpOwotCVVQREFURV9FWFRFTkRfU1RBVChyeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9vdXR4b25zZW50KTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9vdXR4b2Zmc2VudCk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzY29sbGlzaW9ucyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZG90M3N0YXRzc2luZ2xlY29sbGlzaW9uZnJhbWVzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lcyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNleGNlc3NpdmVjb2xsaXNpb25zKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9ucyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NG9jdGV0cyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NW9jdGV0c3RvMTI3b2N0ZXRzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0cyk7Ci0JVVBEQVRFX0VYVEVORF9TVEFUKHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzKTsKLQlVUERBVEVfRVhURU5EX1NUQVQodHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzKTsKLQotCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpID0KLQkJCXBzdGF0cy0+bWFjX3N0eFsxXS5yeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWRfaGk7Ci0JZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfbG8gPQotCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnJ4X3N0YXRfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZF9sbzsKLQlBRERfNjQoZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfaGksCi0JICAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS5yeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkX2hpLAotCSAgICAgICBlc3RhdHMtPnBhdXNlX2ZyYW1lc19yZWNlaXZlZF9sbywKLQkgICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWRfbG8pOwotCi0JZXN0YXRzLT5wYXVzZV9mcmFtZXNfc2VudF9oaSA9Ci0JCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b25zZW50X2hpOwotCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3NlbnRfbG8gPQotCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnR4X3N0YXRfb3V0eG9uc2VudF9sbzsKLQlBRERfNjQoZXN0YXRzLT5wYXVzZV9mcmFtZXNfc2VudF9oaSwKLQkgICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnR4X3N0YXRfb3V0eG9mZnNlbnRfaGksCi0JICAgICAgIGVzdGF0cy0+cGF1c2VfZnJhbWVzX3NlbnRfbG8sCi0JICAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS50eF9zdGF0X291dHhvZmZzZW50X2xvKTsKLX0KLQotc3RhdGljIGludCBibngyeF9od19zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgbmlnX3N0YXRzICpuZXcgPSBibngyeF9zcChicCwgbmlnX3N0YXRzKTsKLQlzdHJ1Y3QgbmlnX3N0YXRzICpvbGQgPSAmKGJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMpOwotCXN0cnVjdCBob3N0X3BvcnRfc3RhdHMgKnBzdGF0cyA9IGJueDJ4X3NwKGJwLCBwb3J0X3N0YXRzKTsKLQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKLQlzdHJ1Y3QgewotCQl1MzIgbG87Ci0JCXUzMiBoaTsKLQl9IGRpZmY7Ci0KLQlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9CTUFDKQotCQlibngyeF9ibWFjX3N0YXRzX3VwZGF0ZShicCk7Ci0KLQllbHNlIGlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0VNQUMpCi0JCWJueDJ4X2VtYWNfc3RhdHNfdXBkYXRlKGJwKTsKLQotCWVsc2UgeyAvKiB1bnJlYWNoZWQgKi8KLQkJQk5YMlhfRVJSKCJzdGF0cyB1cGRhdGVkIGJ5IERNQUUgYnV0IG5vIE1BQyBhY3RpdmVcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JQUREX0VYVEVORF82NChwc3RhdHMtPmJyYl9kcm9wX2hpLCBwc3RhdHMtPmJyYl9kcm9wX2xvLAotCQkgICAgICBuZXctPmJyYl9kaXNjYXJkIC0gb2xkLT5icmJfZGlzY2FyZCk7Ci0JQUREX0VYVEVORF82NChlc3RhdHMtPmJyYl90cnVuY2F0ZV9oaSwgZXN0YXRzLT5icmJfdHJ1bmNhdGVfbG8sCi0JCSAgICAgIG5ldy0+YnJiX3RydW5jYXRlIC0gb2xkLT5icmJfdHJ1bmNhdGUpOwotCi0JVVBEQVRFX1NUQVQ2NF9OSUcoZWdyZXNzX21hY19wa3QwLAotCQkJCQlldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHMpOwotCVVQREFURV9TVEFUNjRfTklHKGVncmVzc19tYWNfcGt0MSwgZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0cyk7Ci0KLQltZW1jcHkob2xkLCBuZXcsIHNpemVvZihzdHJ1Y3QgbmlnX3N0YXRzKSk7Ci0KLQltZW1jcHkoJihlc3RhdHMtPnJ4X3N0YXRfaWZoY2luYmFkb2N0ZXRzX2hpKSwgJihwc3RhdHMtPm1hY19zdHhbMV0pLAotCSAgICAgICBzaXplb2Yoc3RydWN0IG1hY19zdHgpKTsKLQllc3RhdHMtPmJyYl9kcm9wX2hpID0gcHN0YXRzLT5icmJfZHJvcF9oaTsKLQllc3RhdHMtPmJyYl9kcm9wX2xvID0gcHN0YXRzLT5icmJfZHJvcF9sbzsKLQotCXBzdGF0cy0+aG9zdF9wb3J0X3N0YXRzX3N0YXJ0ID0gKytwc3RhdHMtPmhvc3RfcG9ydF9zdGF0c19lbmQ7Ci0KLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQl1MzIgbmlnX3RpbWVyX21heCA9Ci0JCQlTSE1FTV9SRChicCwgcG9ydF9tYltCUF9QT1JUKGJwKV0uc3RhdF9uaWdfdGltZXIpOwotCQlpZiAobmlnX3RpbWVyX21heCAhPSBlc3RhdHMtPm5pZ190aW1lcl9tYXgpIHsKLQkJCWVzdGF0cy0+bmlnX3RpbWVyX21heCA9IG5pZ190aW1lcl9tYXg7Ci0JCQlCTlgyWF9FUlIoIk5JRyB0aW1lciBtYXggKCV1KVxuIiwKLQkJCQkgIGVzdGF0cy0+bmlnX3RpbWVyX21heCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBibngyeF9zdG9ybV9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgZXRoX3N0YXRzX3F1ZXJ5ICpzdGF0cyA9IGJueDJ4X3NwKGJwLCBmd19zdGF0cyk7Ci0Jc3RydWN0IHRzdG9ybV9wZXJfcG9ydF9zdGF0cyAqdHBvcnQgPQotCQkJCQkmc3RhdHMtPnRzdG9ybV9jb21tb24ucG9ydF9zdGF0aXN0aWNzOwotCXN0cnVjdCBob3N0X2Z1bmNfc3RhdHMgKmZzdGF0cyA9IGJueDJ4X3NwKGJwLCBmdW5jX3N0YXRzKTsKLQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKLQlpbnQgaTsKLQotCW1lbWNweSgmKGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGkpLAotCSAgICAgICAmKGJueDJ4X3NwKGJwLCBmdW5jX3N0YXRzX2Jhc2UpLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSksCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaG9zdF9mdW5jX3N0YXRzKSAtIDIqc2l6ZW9mKHUzMikpOwotCWVzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGkgPSAwOwotCWVzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG8gPSAwOwotCWVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGkgPSAwOwotCWVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfbG8gPSAwOwotCWVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkX2hpID0gMDsKLQllc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZF9sbyA9IDA7Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQkJaW50IGNsX2lkID0gZnAtPmNsX2lkOwotCQlzdHJ1Y3QgdHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgKnRjbGllbnQgPQotCQkJCSZzdGF0cy0+dHN0b3JtX2NvbW1vbi5jbGllbnRfc3RhdGlzdGljc1tjbF9pZF07Ci0JCXN0cnVjdCB0c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyAqb2xkX3RjbGllbnQgPSAmZnAtPm9sZF90Y2xpZW50OwotCQlzdHJ1Y3QgdXN0b3JtX3Blcl9jbGllbnRfc3RhdHMgKnVjbGllbnQgPQotCQkJCSZzdGF0cy0+dXN0b3JtX2NvbW1vbi5jbGllbnRfc3RhdGlzdGljc1tjbF9pZF07Ci0JCXN0cnVjdCB1c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyAqb2xkX3VjbGllbnQgPSAmZnAtPm9sZF91Y2xpZW50OwotCQlzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgKnhjbGllbnQgPQotCQkJCSZzdGF0cy0+eHN0b3JtX2NvbW1vbi5jbGllbnRfc3RhdGlzdGljc1tjbF9pZF07Ci0JCXN0cnVjdCB4c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyAqb2xkX3hjbGllbnQgPSAmZnAtPm9sZF94Y2xpZW50OwotCQlzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMgKnFzdGF0cyA9ICZmcC0+ZXRoX3Ffc3RhdHM7Ci0JCXUzMiBkaWZmOwotCi0JCS8qIGFyZSBzdG9ybSBzdGF0cyB2YWxpZD8gKi8KLQkJaWYgKCh1MTYpKGxlMTZfdG9fY3B1KHhjbGllbnQtPnN0YXRzX2NvdW50ZXIpICsgMSkgIT0KLQkJCQkJCQlicC0+c3RhdHNfY291bnRlcikgewotCQkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiWyVkXSBzdGF0cyBub3QgdXBkYXRlZCBieSB4c3Rvcm0iCi0JCQkgICAiICB4c3Rvcm0gY291bnRlciAoMHgleCkgIT0gc3RhdHNfY291bnRlciAoMHgleClcbiIsCi0JCQkgICBpLCB4Y2xpZW50LT5zdGF0c19jb3VudGVyLCBicC0+c3RhdHNfY291bnRlcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCh1MTYpKGxlMTZfdG9fY3B1KHRjbGllbnQtPnN0YXRzX2NvdW50ZXIpICsgMSkgIT0KLQkJCQkJCQlicC0+c3RhdHNfY291bnRlcikgewotCQkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiWyVkXSBzdGF0cyBub3QgdXBkYXRlZCBieSB0c3Rvcm0iCi0JCQkgICAiICB0c3Rvcm0gY291bnRlciAoMHgleCkgIT0gc3RhdHNfY291bnRlciAoMHgleClcbiIsCi0JCQkgICBpLCB0Y2xpZW50LT5zdGF0c19jb3VudGVyLCBicC0+c3RhdHNfY291bnRlcik7Ci0JCQlyZXR1cm4gLTI7Ci0JCX0KLQkJaWYgKCh1MTYpKGxlMTZfdG9fY3B1KHVjbGllbnQtPnN0YXRzX2NvdW50ZXIpICsgMSkgIT0KLQkJCQkJCQlicC0+c3RhdHNfY291bnRlcikgewotCQkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiWyVkXSBzdGF0cyBub3QgdXBkYXRlZCBieSB1c3Rvcm0iCi0JCQkgICAiICB1c3Rvcm0gY291bnRlciAoMHgleCkgIT0gc3RhdHNfY291bnRlciAoMHgleClcbiIsCi0JCQkgICBpLCB1Y2xpZW50LT5zdGF0c19jb3VudGVyLCBicC0+c3RhdHNfY291bnRlcik7Ci0JCQlyZXR1cm4gLTQ7Ci0JCX0KLQotCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpID0KLQkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9icm9hZGNhc3RfYnl0ZXMuaGkpOwotCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvID0KLQkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9icm9hZGNhc3RfYnl0ZXMubG8pOwotCi0JCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgbGUzMl90b19jcHUodGNsaWVudC0+cmN2X211bHRpY2FzdF9ieXRlcy5oaSksCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAotCQkgICAgICAgbGUzMl90b19jcHUodGNsaWVudC0+cmN2X211bHRpY2FzdF9ieXRlcy5sbykpOwotCi0JCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgbGUzMl90b19jcHUodGNsaWVudC0+cmN2X3VuaWNhc3RfYnl0ZXMuaGkpLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbywKLQkJICAgICAgIGxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl91bmljYXN0X2J5dGVzLmxvKSk7Ci0KLQkJU1VCXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5iY2FzdF9ub19idWZmX2J5dGVzLmhpKSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5iY2FzdF9ub19idWZmX2J5dGVzLmxvKSk7Ci0KLQkJU1VCXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5tY2FzdF9ub19idWZmX2J5dGVzLmhpKSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5tY2FzdF9ub19idWZmX2J5dGVzLmxvKSk7Ci0KLQkJU1VCXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT51Y2FzdF9ub19idWZmX2J5dGVzLmhpKSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT51Y2FzdF9ub19idWZmX2J5dGVzLmxvKSk7Ci0KLQkJcXN0YXRzLT52YWxpZF9ieXRlc19yZWNlaXZlZF9oaSA9Ci0JCQkJCXFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGk7Ci0JCXFzdGF0cy0+dmFsaWRfYnl0ZXNfcmVjZWl2ZWRfbG8gPQotCQkJCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvOwotCi0JCXFzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGkgPQotCQkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9lcnJvcl9ieXRlcy5oaSk7Ci0JCXFzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG8gPQotCQkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9lcnJvcl9ieXRlcy5sbyk7Ci0KLQkJQUREXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbywKLQkJICAgICAgIHFzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG8pOwotCi0JCVVQREFURV9FWFRFTkRfVFNUQVQocmN2X3VuaWNhc3RfcGt0cywKLQkJCQkJdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkKTsKLQkJVVBEQVRFX0VYVEVORF9UU1RBVChyY3ZfbXVsdGljYXN0X3BrdHMsCi0JCQkJCXRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkKTsKLQkJVVBEQVRFX0VYVEVORF9UU1RBVChyY3ZfYnJvYWRjYXN0X3BrdHMsCi0JCQkJCXRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkKTsKLQkJVVBEQVRFX0VYVEVORF9UU1RBVChwYWNrZXRzX3Rvb19iaWdfZGlzY2FyZCwKLQkJCQkJZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHMpOwotCQlVUERBVEVfRVhURU5EX1RTVEFUKG5vX2J1ZmZfZGlzY2FyZCwgbm9fYnVmZl9kaXNjYXJkKTsKLQotCQlTVUJfRVhURU5EX1VTVEFUKHVjYXN0X25vX2J1ZmZfcGt0cywKLQkJCQkJdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkKTsKLQkJU1VCX0VYVEVORF9VU1RBVChtY2FzdF9ub19idWZmX3BrdHMsCi0JCQkJCXRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkKTsKLQkJU1VCX0VYVEVORF9VU1RBVChiY2FzdF9ub19idWZmX3BrdHMsCi0JCQkJCXRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkKTsKLQkJVVBEQVRFX0VYVEVORF9VU1RBVCh1Y2FzdF9ub19idWZmX3BrdHMsIG5vX2J1ZmZfZGlzY2FyZCk7Ci0JCVVQREFURV9FWFRFTkRfVVNUQVQobWNhc3Rfbm9fYnVmZl9wa3RzLCBub19idWZmX2Rpc2NhcmQpOwotCQlVUERBVEVfRVhURU5EX1VTVEFUKGJjYXN0X25vX2J1ZmZfcGt0cywgbm9fYnVmZl9kaXNjYXJkKTsKLQotCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpID0KLQkJCQlsZTMyX3RvX2NwdSh4Y2xpZW50LT51bmljYXN0X2J5dGVzX3NlbnQuaGkpOwotCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvID0KLQkJCQlsZTMyX3RvX2NwdSh4Y2xpZW50LT51bmljYXN0X2J5dGVzX3NlbnQubG8pOwotCi0JCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpLAotCQkgICAgICAgbGUzMl90b19jcHUoeGNsaWVudC0+bXVsdGljYXN0X2J5dGVzX3NlbnQuaGkpLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbywKLQkJICAgICAgIGxlMzJfdG9fY3B1KHhjbGllbnQtPm11bHRpY2FzdF9ieXRlc19zZW50LmxvKSk7Ci0KLQkJQUREXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh4Y2xpZW50LT5icm9hZGNhc3RfYnl0ZXNfc2VudC5oaSksCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvLAotCQkgICAgICAgbGUzMl90b19jcHUoeGNsaWVudC0+YnJvYWRjYXN0X2J5dGVzX3NlbnQubG8pKTsKLQotCQlVUERBVEVfRVhURU5EX1hTVEFUKHVuaWNhc3RfcGt0c19zZW50LAotCQkJCQl0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWQpOwotCQlVUERBVEVfRVhURU5EX1hTVEFUKG11bHRpY2FzdF9wa3RzX3NlbnQsCi0JCQkJCXRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkKTsKLQkJVVBEQVRFX0VYVEVORF9YU1RBVChicm9hZGNhc3RfcGt0c19zZW50LAotCQkJCQl0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZCk7Ci0KLQkJb2xkX3RjbGllbnQtPmNoZWNrc3VtX2Rpc2NhcmQgPSB0Y2xpZW50LT5jaGVja3N1bV9kaXNjYXJkOwotCQlvbGRfdGNsaWVudC0+dHRsMF9kaXNjYXJkID0gdGNsaWVudC0+dHRsMF9kaXNjYXJkOwotCi0JCUFERF82NChmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSwKLQkJICAgICAgIGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvKTsKLQkJQUREXzY0KGZzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGksCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpLAotCQkgICAgICAgZnN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbywKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfbG8pOwotCQlBRERfNjQoZnN0YXRzLT50b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSwKLQkJICAgICAgIGZzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG8pOwotCQlBRERfNjQoZnN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBmc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbyk7Ci0JCUFERF82NChmc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSwKLQkJICAgICAgIGZzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvKTsKLQkJQUREXzY0KGZzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGksCi0JCSAgICAgICBmc3RhdHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbywKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvKTsKLQkJQUREXzY0KGZzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGksCi0JCSAgICAgICBxc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAotCQkgICAgICAgZnN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbywKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8pOwotCQlBRERfNjQoZnN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGksCi0JCSAgICAgICBmc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvLAotCQkgICAgICAgcXN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbyk7Ci0JCUFERF82NChmc3RhdHMtPnZhbGlkX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgcXN0YXRzLT52YWxpZF9ieXRlc19yZWNlaXZlZF9oaSwKLQkJICAgICAgIGZzdGF0cy0+dmFsaWRfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBxc3RhdHMtPnZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvKTsKLQotCQlBRERfNjQoZXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9oaSwKLQkJICAgICAgIHFzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBlc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvLAotCQkgICAgICAgcXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9sbyk7Ci0JCUFERF82NChlc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpLAotCQkgICAgICAgcXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaSwKLQkJICAgICAgIGVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfbG8sCi0JCSAgICAgICBxc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2xvKTsKLQkJQUREXzY0KGVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkX2hpLCBxc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZF9oaSwKLQkJICAgICAgIGVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkX2xvLCBxc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZF9sbyk7Ci0JfQotCi0JQUREXzY0KGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JICAgICAgIGVzdGF0cy0+cnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfaGksCi0JICAgICAgIGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JICAgICAgIGVzdGF0cy0+cnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfbG8pOwotCi0JbWVtY3B5KGVzdGF0cywgJihmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKSwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpIC0gMipzaXplb2YodTMyKSk7Ci0KLQlBRERfNjQoZXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaSwKLQkgICAgICAgZXN0YXRzLT5yeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmdfaGksCi0JICAgICAgIGVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfbG8sCi0JICAgICAgIGVzdGF0cy0+cnhfc3RhdF9kb3Qzc3RhdHNmcmFtZXN0b29sb25nX2xvKTsKLQlBRERfNjQoZXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9oaSwKLQkgICAgICAgZXN0YXRzLT5yeF9zdGF0X2lmaGNpbmJhZG9jdGV0c19oaSwKLQkgICAgICAgZXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9sbywKLQkgICAgICAgZXN0YXRzLT5yeF9zdGF0X2lmaGNpbmJhZG9jdGV0c19sbyk7Ci0KLQlpZiAoYnAtPnBvcnQucG1mKSB7Ci0JCWVzdGF0cy0+bWFjX2ZpbHRlcl9kaXNjYXJkID0KLQkJCQlsZTMyX3RvX2NwdSh0cG9ydC0+bWFjX2ZpbHRlcl9kaXNjYXJkKTsKLQkJZXN0YXRzLT54eG92ZXJmbG93X2Rpc2NhcmQgPQotCQkJCWxlMzJfdG9fY3B1KHRwb3J0LT54eG92ZXJmbG93X2Rpc2NhcmQpOwotCQllc3RhdHMtPmJyYl90cnVuY2F0ZV9kaXNjYXJkID0KLQkJCQlsZTMyX3RvX2NwdSh0cG9ydC0+YnJiX3RydW5jYXRlX2Rpc2NhcmQpOwotCQllc3RhdHMtPm1hY19kaXNjYXJkID0gbGUzMl90b19jcHUodHBvcnQtPm1hY19kaXNjYXJkKTsKLQl9Ci0KLQlmc3RhdHMtPmhvc3RfZnVuY19zdGF0c19zdGFydCA9ICsrZnN0YXRzLT5ob3N0X2Z1bmNfc3RhdHNfZW5kOwotCi0JYnAtPnN0YXRzX3BlbmRpbmcgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X25ldF9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXRzID0gJmJwLT5kZXYtPnN0YXRzOwotCWludCBpOwotCi0JbnN0YXRzLT5yeF9wYWNrZXRzID0KLQkJYm54MnhfaGlsbygmZXN0YXRzLT50b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkpICsKLQkJYm54MnhfaGlsbygmZXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSkgKwotCQlibngyeF9oaWxvKCZlc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKTsKLQotCW5zdGF0cy0+dHhfcGFja2V0cyA9Ci0JCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSArCi0JCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpICsKLQkJYm54MnhfaGlsbygmZXN0YXRzLT50b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSk7Ci0KLQluc3RhdHMtPnJ4X2J5dGVzID0gYm54MnhfaGlsbygmZXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSk7Ci0KLQluc3RhdHMtPnR4X2J5dGVzID0gYm54MnhfaGlsbygmZXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSk7Ci0KLQluc3RhdHMtPnJ4X2Ryb3BwZWQgPSBlc3RhdHMtPm1hY19kaXNjYXJkOwotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQotCQluc3RhdHMtPnJ4X2Ryb3BwZWQgKz0KLQkJCWxlMzJfdG9fY3B1KGJwLT5mcFtpXS5vbGRfdGNsaWVudC5jaGVja3N1bV9kaXNjYXJkKTsKLQotCW5zdGF0cy0+dHhfZHJvcHBlZCA9IDA7Ci0KLQluc3RhdHMtPm11bHRpY2FzdCA9Ci0JCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkpOwotCi0JbnN0YXRzLT5jb2xsaXNpb25zID0KLQkJYm54MnhfaGlsbygmZXN0YXRzLT50eF9zdGF0X2V0aGVyc3RhdHNjb2xsaXNpb25zX2hpKTsKLQotCW5zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9Ci0JCWJueDJ4X2hpbG8oJmVzdGF0cy0+cnhfc3RhdF9ldGhlcnN0YXRzdW5kZXJzaXplcGt0c19oaSkgKwotCQlibngyeF9oaWxvKCZlc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpKTsKLQluc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gYm54MnhfaGlsbygmZXN0YXRzLT5icmJfZHJvcF9oaSkgKwotCQkJCSBibngyeF9oaWxvKCZlc3RhdHMtPmJyYl90cnVuY2F0ZV9oaSk7Ci0JbnN0YXRzLT5yeF9jcmNfZXJyb3JzID0KLQkJYm54MnhfaGlsbygmZXN0YXRzLT5yeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9yc19oaSk7Ci0JbnN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPQotCQlibngyeF9oaWxvKCZlc3RhdHMtPnJ4X3N0YXRfZG90M3N0YXRzYWxpZ25tZW50ZXJyb3JzX2hpKTsKLQluc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzID0gYm54MnhfaGlsbygmZXN0YXRzLT5ub19idWZmX2Rpc2NhcmRfaGkpOwotCW5zdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyA9IGVzdGF0cy0+eHhvdmVyZmxvd19kaXNjYXJkOwotCi0JbnN0YXRzLT5yeF9lcnJvcnMgPSBuc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKwotCQkJICAgIG5zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKwotCQkJICAgIG5zdGF0cy0+cnhfY3JjX2Vycm9ycyArCi0JCQkgICAgbnN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKwotCQkJICAgIG5zdGF0cy0+cnhfZmlmb19lcnJvcnMgKwotCQkJICAgIG5zdGF0cy0+cnhfbWlzc2VkX2Vycm9yczsKLQotCW5zdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgPQotCQlibngyeF9oaWxvKCZlc3RhdHMtPnR4X3N0YXRfZG90M3N0YXRzbGF0ZWNvbGxpc2lvbnNfaGkpICsKLQkJYm54MnhfaGlsbygmZXN0YXRzLT50eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfaGkpOwotCW5zdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgPQotCQlibngyeF9oaWxvKCZlc3RhdHMtPnJ4X3N0YXRfZG90M3N0YXRzY2FycmllcnNlbnNlZXJyb3JzX2hpKTsKLQluc3RhdHMtPnR4X2ZpZm9fZXJyb3JzID0gMDsKLQluc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOwotCW5zdGF0cy0+dHhfd2luZG93X2Vycm9ycyA9IDA7Ci0KLQluc3RhdHMtPnR4X2Vycm9ycyA9IG5zdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKwotCQkJICAgIG5zdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgKwotCSAgICBibngyeF9oaWxvKCZlc3RhdHMtPnR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9yc19oaSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2Rydl9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKLQlpbnQgaTsKLQotCWVzdGF0cy0+ZHJpdmVyX3hvZmYgPSAwOwotCWVzdGF0cy0+cnhfZXJyX2Rpc2NhcmRfcGt0ID0gMDsKLQllc3RhdHMtPnJ4X3NrYl9hbGxvY19mYWlsZWQgPSAwOwotCWVzdGF0cy0+aHdfY3N1bV9lcnIgPSAwOwotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCXN0cnVjdCBibngyeF9ldGhfcV9zdGF0cyAqcXN0YXRzID0gJmJwLT5mcFtpXS5ldGhfcV9zdGF0czsKLQotCQllc3RhdHMtPmRyaXZlcl94b2ZmICs9IHFzdGF0cy0+ZHJpdmVyX3hvZmY7Ci0JCWVzdGF0cy0+cnhfZXJyX2Rpc2NhcmRfcGt0ICs9IHFzdGF0cy0+cnhfZXJyX2Rpc2NhcmRfcGt0OwotCQllc3RhdHMtPnJ4X3NrYl9hbGxvY19mYWlsZWQgKz0gcXN0YXRzLT5yeF9za2JfYWxsb2NfZmFpbGVkOwotCQllc3RhdHMtPmh3X2NzdW1fZXJyICs9IHFzdGF0cy0+aHdfY3N1bV9lcnI7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgKnN0YXRzX2NvbXAgPSBibngyeF9zcChicCwgc3RhdHNfY29tcCk7Ci0KLQlpZiAoKnN0YXRzX2NvbXAgIT0gRE1BRV9DT01QX1ZBTCkKLQkJcmV0dXJuOwotCi0JaWYgKGJwLT5wb3J0LnBtZikKLQkJYm54MnhfaHdfc3RhdHNfdXBkYXRlKGJwKTsKLQotCWlmIChibngyeF9zdG9ybV9zdGF0c191cGRhdGUoYnApICYmIChicC0+c3RhdHNfcGVuZGluZysrID09IDMpKSB7Ci0JCUJOWDJYX0VSUigic3Rvcm0gc3RhdHMgd2VyZSBub3QgdXBkYXRlZCBmb3IgMyB0aW1lc1xuIik7Ci0JCWJueDJ4X3BhbmljKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlibngyeF9uZXRfc3RhdHNfdXBkYXRlKGJwKTsKLQlibngyeF9kcnZfc3RhdHNfdXBkYXRlKGJwKTsKLQotCWlmIChuZXRpZl9tc2dfdGltZXIoYnApKSB7Ci0JCXN0cnVjdCBibngyeF9ldGhfc3RhdHMgKmVzdGF0cyA9ICZicC0+ZXRoX3N0YXRzOwotCQlpbnQgaTsKLQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJyYiBkcm9wcyAldSAgYnJiIHRydW5jYXRlICV1XG4iLAotCQkgICAgICAgYnAtPmRldi0+bmFtZSwKLQkJICAgICAgIGVzdGF0cy0+YnJiX2Ryb3BfbG8sIGVzdGF0cy0+YnJiX3RydW5jYXRlX2xvKTsKLQotCQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0JCQlzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMgKnFzdGF0cyA9ICZmcC0+ZXRoX3Ffc3RhdHM7Ci0KLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnggdXNhZ2UoJTR1KSAgKnJ4X2NvbnNfc2IoJXUpIgotCQkJCQkgICIgIHJ4IHBrdCglbHUpICByeCBjYWxscyglbHUgJWx1KVxuIiwKLQkJCSAgICAgICBmcC0+bmFtZSwgKGxlMTZfdG9fY3B1KCpmcC0+cnhfY29uc19zYikgLQotCQkJICAgICAgIGZwLT5yeF9jb21wX2NvbnMpLAotCQkJICAgICAgIGxlMTZfdG9fY3B1KCpmcC0+cnhfY29uc19zYiksCi0JCQkgICAgICAgYm54MnhfaGlsbygmcXN0YXRzLT4KLQkJCQkJICB0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkpLAotCQkJICAgICAgIGZwLT5yeF9jYWxscywgZnAtPnJ4X3BrdCk7Ci0JCX0KLQotCQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0JCQlzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMgKnFzdGF0cyA9ICZmcC0+ZXRoX3Ffc3RhdHM7Ci0JCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPQotCQkJCW5ldGRldl9nZXRfdHhfcXVldWUoYnAtPmRldiwgaSk7Ci0KLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggYXZhaWwoJTR1KSAgKnR4X2NvbnNfc2IoJXUpIgotCQkJCQkgICIgIHR4IHBrdCglbHUpIHR4IGNhbGxzICglbHUpIgotCQkJCQkgICIgICVzIChYb2ZmIGV2ZW50cyAldSlcbiIsCi0JCQkgICAgICAgZnAtPm5hbWUsIGJueDJ4X3R4X2F2YWlsKGZwKSwKLQkJCSAgICAgICBsZTE2X3RvX2NwdSgqZnAtPnR4X2NvbnNfc2IpLAotCQkJICAgICAgIGJueDJ4X2hpbG8oJnFzdGF0cy0+Ci0JCQkJCSAgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKLQkJCSAgICAgICBmcC0+dHhfcGt0LAotCQkJICAgICAgIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkgPyAiWG9mZiIgOiAiWG9uIiksCi0JCQkgICAgICAgcXN0YXRzLT5kcml2ZXJfeG9mZik7Ci0JCX0KLQl9Ci0KLQlibngyeF9od19zdGF0c19wb3N0KGJwKTsKLQlibngyeF9zdG9ybV9zdGF0c19wb3N0KGJwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfcG9ydF9zdGF0c19zdG9wKHN0cnVjdCBibngyeCAqYnApCi17Ci0Jc3RydWN0IGRtYWVfY29tbWFuZCAqZG1hZTsKLQl1MzIgb3Bjb2RlOwotCWludCBsb2FkZXJfaWR4ID0gUE1GX0RNQUVfQyhicCk7Ci0JdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOwotCi0JYnAtPmV4ZWN1dGVyX2lkeCA9IDA7Ci0KLQlvcGNvZGUgPSAoRE1BRV9DTURfU1JDX1BDSSB8IERNQUVfQ01EX0RTVF9HUkMgfAotCQkgIERNQUVfQ01EX0NfRU5BQkxFIHwKLQkJICBETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAotI2lmZGVmIF9fQklHX0VORElBTgotCQkgIERNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAotI2Vsc2UKLQkJICBETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8Ci0jZW5kaWYKLQkJICAoQlBfUE9SVChicCkgPyBETUFFX0NNRF9QT1JUXzEgOiBETUFFX0NNRF9QT1JUXzApIHwKLQkJICAoQlBfRTFIVk4oYnApIDw8IERNQUVfQ01EX0UxSFZOX1NISUZUKSk7Ci0KLQlpZiAoYnAtPnBvcnQucG9ydF9zdHgpIHsKLQotCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JCWlmIChicC0+ZnVuY19zdHgpCi0JCQlkbWFlLT5vcGNvZGUgPSAob3Bjb2RlIHwgRE1BRV9DTURfQ19EU1RfR1JDKTsKLQkJZWxzZQotCQkJZG1hZS0+b3Bjb2RlID0gKG9wY29kZSB8IERNQUVfQ01EX0NfRFNUX1BDSSk7Ci0JCWRtYWUtPnNyY19hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKLQkJZG1hZS0+c3JjX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgcG9ydF9zdGF0cykpOwotCQlkbWFlLT5kc3RfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7Ci0JCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDI7Ci0JCWlmIChicC0+ZnVuY19zdHgpIHsKLQkJCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQkJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7Ci0JCQlkbWFlLT5jb21wX3ZhbCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlkbWFlLT5jb21wX2FkZHJfbG8gPQotCQkJCVU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7Ci0JCQlkbWFlLT5jb21wX2FkZHJfaGkgPQotCQkJCVU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7Ci0JCQlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7Ci0KLQkJCSpzdGF0c19jb21wID0gMDsKLQkJfQotCX0KLQotCWlmIChicC0+ZnVuY19zdHgpIHsKLQotCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JCWRtYWUtPm9wY29kZSA9IChvcGNvZGUgfCBETUFFX0NNRF9DX0RTVF9QQ0kpOwotCQlkbWFlLT5zcmNfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzKSk7Ci0JCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIGZ1bmNfc3RhdHMpKTsKLQkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBicC0+ZnVuY19zdHggPj4gMjsKLQkJZG1hZS0+ZHN0X2FkZHJfaGkgPSAwOwotCQlkbWFlLT5sZW4gPSBzaXplb2Yoc3RydWN0IGhvc3RfZnVuY19zdGF0cykgPj4gMjsKLQkJZG1hZS0+Y29tcF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKLQkJZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKLQkJZG1hZS0+Y29tcF92YWwgPSBETUFFX0NPTVBfVkFMOwotCi0JCSpzdGF0c19jb21wID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX3N0b3Aoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgdXBkYXRlID0gMDsKLQotCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotCi0JaWYgKGJwLT5wb3J0LnBtZikKLQkJdXBkYXRlID0gKGJueDJ4X2h3X3N0YXRzX3VwZGF0ZShicCkgPT0gMCk7Ci0KLQl1cGRhdGUgfD0gKGJueDJ4X3N0b3JtX3N0YXRzX3VwZGF0ZShicCkgPT0gMCk7Ci0KLQlpZiAodXBkYXRlKSB7Ci0JCWJueDJ4X25ldF9zdGF0c191cGRhdGUoYnApOwotCi0JCWlmIChicC0+cG9ydC5wbWYpCi0JCQlibngyeF9wb3J0X3N0YXRzX3N0b3AoYnApOwotCi0JCWJueDJ4X2h3X3N0YXRzX3Bvc3QoYnApOwotCQlibngyeF9zdGF0c19jb21wKGJwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX2RvX25vdGhpbmcoc3RydWN0IGJueDJ4ICpicCkKLXsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0Jdm9pZCAoKmFjdGlvbikoc3RydWN0IGJueDJ4ICpicCk7Ci0JZW51bSBibngyeF9zdGF0c19zdGF0ZSBuZXh0X3N0YXRlOwotfSBibngyeF9zdGF0c19zdG1bU1RBVFNfU1RBVEVfTUFYXVtTVEFUU19FVkVOVF9NQVhdID0gewotLyogc3RhdGUJZXZlbnQJKi8KLXsKLS8qIERJU0FCTEVECVBNRgkqLyB7Ym54Mnhfc3RhdHNfcG1mX3VwZGF0ZSwgU1RBVFNfU1RBVEVfRElTQUJMRUR9LAotLyoJCUxJTktfVVAJKi8ge2JueDJ4X3N0YXRzX3N0YXJ0LCAgICAgIFNUQVRTX1NUQVRFX0VOQUJMRUR9LAotLyoJCVVQREFURQkqLyB7Ym54Mnhfc3RhdHNfZG9fbm90aGluZywgU1RBVFNfU1RBVEVfRElTQUJMRUR9LAotLyoJCVNUT1AJKi8ge2JueDJ4X3N0YXRzX2RvX25vdGhpbmcsIFNUQVRTX1NUQVRFX0RJU0FCTEVEfQotfSwKLXsKLS8qIEVOQUJMRUQJUE1GCSovIHtibngyeF9zdGF0c19wbWZfc3RhcnQsICBTVEFUU19TVEFURV9FTkFCTEVEfSwKLS8qCQlMSU5LX1VQCSovIHtibngyeF9zdGF0c19yZXN0YXJ0LCAgICBTVEFUU19TVEFURV9FTkFCTEVEfSwKLS8qCQlVUERBVEUJKi8ge2JueDJ4X3N0YXRzX3VwZGF0ZSwgICAgIFNUQVRTX1NUQVRFX0VOQUJMRUR9LAotLyoJCVNUT1AJKi8ge2JueDJ4X3N0YXRzX3N0b3AsICAgICAgIFNUQVRTX1NUQVRFX0RJU0FCTEVEfQotfQotfTsKLQotc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfaGFuZGxlKHN0cnVjdCBibngyeCAqYnAsIGVudW0gYm54Mnhfc3RhdHNfZXZlbnQgZXZlbnQpCi17Ci0JZW51bSBibngyeF9zdGF0c19zdGF0ZSBzdGF0ZSA9IGJwLT5zdGF0c19zdGF0ZTsKLQotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm47Ci0KLQlibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5hY3Rpb24oYnApOwotCWJwLT5zdGF0c19zdGF0ZSA9IGJueDJ4X3N0YXRzX3N0bVtzdGF0ZV1bZXZlbnRdLm5leHRfc3RhdGU7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIHN0YXRlIGhhcyBiZWVuICJjaGFuZ2VkIiAqLwotCXNtcF93bWIoKTsKLQotCWlmICgoZXZlbnQgIT0gU1RBVFNfRVZFTlRfVVBEQVRFKSB8fCBuZXRpZl9tc2dfdGltZXIoYnApKQotCQlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0ZSAlZCAtPiBldmVudCAlZCAtPiBzdGF0ZSAlZFxuIiwKLQkJICAgc3RhdGUsIGV2ZW50LCBicC0+c3RhdHNfc3RhdGUpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9wb3J0X3N0YXRzX2Jhc2VfaW5pdChzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWU7Ci0JdTMyICpzdGF0c19jb21wID0gYm54Mnhfc3AoYnAsIHN0YXRzX2NvbXApOwotCi0JLyogc2FuaXR5ICovCi0JaWYgKCFicC0+cG9ydC5wbWYgfHwgIWJwLT5wb3J0LnBvcnRfc3R4KSB7Ci0JCUJOWDJYX0VSUigiQlVHIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlicC0+ZXhlY3V0ZXJfaWR4ID0gMDsKLQotCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQlkbWFlLT5vcGNvZGUgPSAoRE1BRV9DTURfU1JDX1BDSSB8IERNQUVfQ01EX0RTVF9HUkMgfAotCQkJRE1BRV9DTURfQ19EU1RfUENJIHwgRE1BRV9DTURfQ19FTkFCTEUgfAotCQkJRE1BRV9DTURfU1JDX1JFU0VUIHwgRE1BRV9DTURfRFNUX1JFU0VUIHwKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJCURNQUVfQ01EX0VORElBTklUWV9CX0RXX1NXQVAgfAotI2Vsc2UKLQkJCURNQUVfQ01EX0VORElBTklUWV9EV19TV0FQIHwKLSNlbmRpZgotCQkJKEJQX1BPUlQoYnApID8gRE1BRV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSB8Ci0JCQkoQlBfRTFIVk4oYnApIDw8IERNQUVfQ01EX0UxSFZOX1NISUZUKSk7Ci0JZG1hZS0+c3JjX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgcG9ydF9zdGF0cykpOwotCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKLQlkbWFlLT5kc3RfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7Ci0JZG1hZS0+ZHN0X2FkZHJfaGkgPSAwOwotCWRtYWUtPmxlbiA9IHNpemVvZihzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzKSA+PiAyOwotCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7Ci0JZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKLQlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7Ci0KLQkqc3RhdHNfY29tcCA9IDA7Ci0JYm54MnhfaHdfc3RhdHNfcG9zdChicCk7Ci0JYm54Mnhfc3RhdHNfY29tcChicCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2Z1bmNfc3RhdHNfYmFzZV9pbml0KHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IHZuLCB2bl9tYXggPSBJU19FMUhNRihicCkgPyBFMUhWTl9NQVggOiBFMVZOX01BWDsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCWludCBmdW5jOwotCXUzMiBmdW5jX3N0eDsKLQotCS8qIHNhbml0eSAqLwotCWlmICghYnAtPnBvcnQucG1mIHx8ICFicC0+ZnVuY19zdHgpIHsKLQkJQk5YMlhfRVJSKCJCVUchXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHNhdmUgb3VyIGZ1bmNfc3R4ICovCi0JZnVuY19zdHggPSBicC0+ZnVuY19zdHg7Ci0KLQlmb3IgKHZuID0gVk5fMDsgdm4gPCB2bl9tYXg7IHZuKyspIHsKLQkJZnVuYyA9IDIqdm4gKyBwb3J0OwotCi0JCWJwLT5mdW5jX3N0eCA9IFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmZ3X21iX3BhcmFtKTsKLQkJYm54MnhfZnVuY19zdGF0c19pbml0KGJwKTsKLQkJYm54MnhfaHdfc3RhdHNfcG9zdChicCk7Ci0JCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotCX0KLQotCS8qIHJlc3RvcmUgb3VyIGZ1bmNfc3R4ICovCi0JYnAtPmZ1bmNfc3R4ID0gZnVuY19zdHg7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2Z1bmNfc3RhdHNfYmFzZV91cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgZG1hZV9jb21tYW5kICpkbWFlID0gJmJwLT5zdGF0c19kbWFlOwotCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKLQotCS8qIHNhbml0eSAqLwotCWlmICghYnAtPmZ1bmNfc3R4KSB7Ci0JCUJOWDJYX0VSUigiQlVHIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlicC0+ZXhlY3V0ZXJfaWR4ID0gMDsKLQltZW1zZXQoZG1hZSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpKTsKLQotCWRtYWUtPm9wY29kZSA9IChETUFFX0NNRF9TUkNfR1JDIHwgRE1BRV9DTURfRFNUX1BDSSB8Ci0JCQlETUFFX0NNRF9DX0RTVF9QQ0kgfCBETUFFX0NNRF9DX0VOQUJMRSB8Ci0JCQlETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAotI2lmZGVmIF9fQklHX0VORElBTgotCQkJRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8Ci0jZWxzZQotCQkJRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAotI2VuZGlmCi0JCQkoQlBfUE9SVChicCkgPyBETUFFX0NNRF9QT1JUXzEgOiBETUFFX0NNRF9QT1JUXzApIHwKLQkJCShCUF9FMUhWTihicCkgPDwgRE1BRV9DTURfRTFIVk5fU0hJRlQpKTsKLQlkbWFlLT5zcmNfYWRkcl9sbyA9IGJwLT5mdW5jX3N0eCA+PiAyOwotCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKLQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzX2Jhc2UpKTsKLQlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBmdW5jX3N0YXRzX2Jhc2UpKTsKLQlkbWFlLT5sZW4gPSBzaXplb2Yoc3RydWN0IGhvc3RfZnVuY19zdGF0cykgPj4gMjsKLQlkbWFlLT5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOwotCWRtYWUtPmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7Ci0JZG1hZS0+Y29tcF92YWwgPSBETUFFX0NPTVBfVkFMOwotCi0JKnN0YXRzX2NvbXAgPSAwOwotCWJueDJ4X2h3X3N0YXRzX3Bvc3QoYnApOwotCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zdGF0c19pbml0KHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwotCWludCBpOwotCi0JYnAtPnN0YXRzX3BlbmRpbmcgPSAwOwotCWJwLT5leGVjdXRlcl9pZHggPSAwOwotCWJwLT5zdGF0c19jb3VudGVyID0gMDsKLQotCS8qIHBvcnQgYW5kIGZ1bmMgc3RhdHMgZm9yIG1hbmFnZW1lbnQgKi8KLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQlicC0+cG9ydC5wb3J0X3N0eCA9IFNITUVNX1JEKGJwLCBwb3J0X21iW3BvcnRdLnBvcnRfc3R4KTsKLQkJYnAtPmZ1bmNfc3R4ID0gU0hNRU1fUkQoYnAsIGZ1bmNfbWJbZnVuY10uZndfbWJfcGFyYW0pOwotCi0JfSBlbHNlIHsKLQkJYnAtPnBvcnQucG9ydF9zdHggPSAwOwotCQlicC0+ZnVuY19zdHggPSAwOwotCX0KLQlEUChCTlgyWF9NU0dfU1RBVFMsICJwb3J0X3N0eCAweCV4ICBmdW5jX3N0eCAweCV4XG4iLAotCSAgIGJwLT5wb3J0LnBvcnRfc3R4LCBicC0+ZnVuY19zdHgpOwotCi0JLyogcG9ydCBzdGF0cyAqLwotCW1lbXNldCgmKGJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMpLCAwLCBzaXplb2Yoc3RydWN0IG5pZ19zdGF0cykpOwotCWJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMuYnJiX2Rpc2NhcmQgPQotCQkJUkVHX1JEKGJwLCBOSUdfUkVHX1NUQVQwX0JSQl9ESVNDQVJEICsgcG9ydCoweDM4KTsKLQlicC0+cG9ydC5vbGRfbmlnX3N0YXRzLmJyYl90cnVuY2F0ZSA9Ci0JCQlSRUdfUkQoYnAsIE5JR19SRUdfU1RBVDBfQlJCX1RSVU5DQVRFICsgcG9ydCoweDM4KTsKLQlSRUdfUkRfRE1BRShicCwgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDAgKyBwb3J0KjB4NTAsCi0JCSAgICAmKGJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMuZWdyZXNzX21hY19wa3QwX2xvKSwgMik7Ci0JUkVHX1JEX0RNQUUoYnAsIE5JR19SRUdfU1RBVDBfRUdSRVNTX01BQ19QS1QxICsgcG9ydCoweDUwLAotCQkgICAgJihicC0+cG9ydC5vbGRfbmlnX3N0YXRzLmVncmVzc19tYWNfcGt0MV9sbyksIDIpOwotCi0JLyogZnVuY3Rpb24gc3RhdHMgKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQotCQltZW1zZXQoJmZwLT5vbGRfdGNsaWVudCwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdHN0b3JtX3Blcl9jbGllbnRfc3RhdHMpKTsKLQkJbWVtc2V0KCZmcC0+b2xkX3VjbGllbnQsIDAsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHVzdG9ybV9wZXJfY2xpZW50X3N0YXRzKSk7Ci0JCW1lbXNldCgmZnAtPm9sZF94Y2xpZW50LCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB4c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykpOwotCQltZW1zZXQoJmZwLT5ldGhfcV9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBibngyeF9ldGhfcV9zdGF0cykpOwotCX0KLQotCW1lbXNldCgmYnAtPmRldi0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOwotCW1lbXNldCgmYnAtPmV0aF9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBibngyeF9ldGhfc3RhdHMpKTsKLQotCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOwotCi0JaWYgKGJwLT5wb3J0LnBtZikgewotCQlpZiAoYnAtPnBvcnQucG9ydF9zdHgpCi0JCQlibngyeF9wb3J0X3N0YXRzX2Jhc2VfaW5pdChicCk7Ci0KLQkJaWYgKGJwLT5mdW5jX3N0eCkKLQkJCWJueDJ4X2Z1bmNfc3RhdHNfYmFzZV9pbml0KGJwKTsKLQotCX0gZWxzZSBpZiAoYnAtPmZ1bmNfc3R4KQotCQlibngyeF9mdW5jX3N0YXRzX2Jhc2VfdXBkYXRlKGJwKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBibngyeCAqYnAgPSAoc3RydWN0IGJueDJ4ICopIGRhdGE7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCi0JCXJldHVybjsKLQotCWlmIChhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKQotCQlnb3RvIHRpbWVyX3Jlc3RhcnQ7Ci0KLQlpZiAocG9sbCkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFswXTsKLQkJaW50IHJjOwotCi0JCWJueDJ4X3R4X2ludChmcCk7Ci0JCXJjID0gYm54MnhfcnhfaW50KGZwLCAxMDAwKTsKLQl9Ci0KLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwotCQl1MzIgZHJ2X3B1bHNlOwotCQl1MzIgbWNwX3B1bHNlOwotCi0JCSsrYnAtPmZ3X2Rydl9wdWxzZV93cl9zZXE7Ci0JCWJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxICY9IERSVl9QVUxTRV9TRVFfTUFTSzsKLQkJLyogVEJEIC0gYWRkIFNZU1RFTV9USU1FICovCi0JCWRydl9wdWxzZSA9IGJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxOwotCQlTSE1FTV9XUihicCwgZnVuY19tYltmdW5jXS5kcnZfcHVsc2VfbWIsIGRydl9wdWxzZSk7Ci0KLQkJbWNwX3B1bHNlID0gKFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLm1jcF9wdWxzZV9tYikgJgotCQkJICAgICBNQ1BfUFVMU0VfU0VRX01BU0spOwotCQkvKiBUaGUgZGVsdGEgYmV0d2VlbiBkcml2ZXIgcHVsc2UgYW5kIG1jcCByZXNwb25zZQotCQkgKiBzaG91bGQgYmUgMSAoYmVmb3JlIG1jcCByZXNwb25zZSkgb3IgMCAoYWZ0ZXIgbWNwIHJlc3BvbnNlKQotCQkgKi8KLQkJaWYgKChkcnZfcHVsc2UgIT0gbWNwX3B1bHNlKSAmJgotCQkgICAgKGRydl9wdWxzZSAhPSAoKG1jcF9wdWxzZSArIDEpICYgTUNQX1BVTFNFX1NFUV9NQVNLKSkpIHsKLQkJCS8qIHNvbWVvbmUgbG9zdCBhIGhlYXJ0YmVhdC4uLiAqLwotCQkJQk5YMlhfRVJSKCJkcnZfcHVsc2UgKDB4JXgpICE9IG1jcF9wdWxzZSAoMHgleClcbiIsCi0JCQkJICBkcnZfcHVsc2UsIG1jcF9wdWxzZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pCi0JCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfVVBEQVRFKTsKLQotdGltZXJfcmVzdGFydDoKLQltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKLX0KLQotLyogZW5kIG9mIFN0YXRpc3RpY3MgKi8KLQotLyogbmljIGluaXQgKi8KLQotLyoKLSAqIG5pYyBpbml0IHNlcnZpY2UgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIHZvaWQgYm54MnhfemVyb19zYihzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2JfaWQpCi17Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQotCS8qICJDU1RPUk0iICovCi0JYm54MnhfaW5pdF9maWxsKGJwLCBDU0VNX1JFR19GQVNUX01FTU9SWSArCi0JCQlDU1RPUk1fU0JfSE9TVF9TVEFUVVNfQkxPQ0tfVV9PRkZTRVQocG9ydCwgc2JfaWQpLCAwLAotCQkJQ1NUT1JNX1NCX1NUQVRVU19CTE9DS19VX1NJWkUgLyA0KTsKLQlibngyeF9pbml0X2ZpbGwoYnAsIENTRU1fUkVHX0ZBU1RfTUVNT1JZICsKLQkJCUNTVE9STV9TQl9IT1NUX1NUQVRVU19CTE9DS19DX09GRlNFVChwb3J0LCBzYl9pZCksIDAsCi0JCQlDU1RPUk1fU0JfU1RBVFVTX0JMT0NLX0NfU0laRSAvIDQpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X3NiKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBob3N0X3N0YXR1c19ibG9jayAqc2IsCi0JCQkgIGRtYV9hZGRyX3QgbWFwcGluZywgaW50IHNiX2lkKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQlpbnQgaW5kZXg7Ci0JdTY0IHNlY3Rpb247Ci0KLQkvKiBVU1RPUk0gKi8KLQlzZWN0aW9uID0gKCh1NjQpbWFwcGluZykgKyBvZmZzZXRvZihzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2ssCi0JCQkJCSAgICB1X3N0YXR1c19ibG9jayk7Ci0Jc2ItPnVfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IHNiX2lkOwotCi0JUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCSAgICAgICBDU1RPUk1fU0JfSE9TVF9TQl9BRERSX1VfT0ZGU0VUKHBvcnQsIHNiX2lkKSwgVTY0X0xPKHNlY3Rpb24pKTsKLQlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JICAgICAgICgoQ1NUT1JNX1NCX0hPU1RfU0JfQUREUl9VX09GRlNFVChwb3J0LCBzYl9pZCkpICsgNCksCi0JICAgICAgIFU2NF9ISShzZWN0aW9uKSk7Ci0JUkVHX1dSOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsgRlBfVVNCX0ZVTkNfT0ZGICsKLQkJQ1NUT1JNX1NCX0hPU1RfU1RBVFVTX0JMT0NLX1VfT0ZGU0VUKHBvcnQsIHNiX2lkKSwgZnVuYyk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBIQ19VU1RPUk1fU0JfTlVNX0lORElDRVM7IGluZGV4KyspCi0JCVJFR19XUjE2KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCQkJIENTVE9STV9TQl9IQ19ESVNBQkxFX1VfT0ZGU0VUKHBvcnQsIHNiX2lkLCBpbmRleCksIDEpOwotCi0JLyogQ1NUT1JNICovCi0Jc2VjdGlvbiA9ICgodTY0KW1hcHBpbmcpICsgb2Zmc2V0b2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrLAotCQkJCQkgICAgY19zdGF0dXNfYmxvY2spOwotCXNiLT5jX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaWQgPSBzYl9pZDsKLQotCVJFR19XUihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkgICAgICAgQ1NUT1JNX1NCX0hPU1RfU0JfQUREUl9DX09GRlNFVChwb3J0LCBzYl9pZCksIFU2NF9MTyhzZWN0aW9uKSk7Ci0JUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCSAgICAgICAoKENTVE9STV9TQl9IT1NUX1NCX0FERFJfQ19PRkZTRVQocG9ydCwgc2JfaWQpKSArIDQpLAotCSAgICAgICBVNjRfSEkoc2VjdGlvbikpOwotCVJFR19XUjgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArIEZQX0NTQl9GVU5DX09GRiArCi0JCUNTVE9STV9TQl9IT1NUX1NUQVRVU19CTE9DS19DX09GRlNFVChwb3J0LCBzYl9pZCksIGZ1bmMpOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSENfQ1NUT1JNX1NCX05VTV9JTkRJQ0VTOyBpbmRleCsrKQotCQlSRUdfV1IxNihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJCSBDU1RPUk1fU0JfSENfRElTQUJMRV9DX09GRlNFVChwb3J0LCBzYl9pZCwgaW5kZXgpLCAxKTsKLQotCWJueDJ4X2Fja19zYihicCwgc2JfaWQsIENTVE9STV9JRCwgMCwgSUdVX0lOVF9FTkFCTEUsIDApOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF96ZXJvX2RlZl9zYihzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0KLQlibngyeF9pbml0X2ZpbGwoYnAsIFRTRU1fUkVHX0ZBU1RfTUVNT1JZICsKLQkJCVRTVE9STV9ERUZfU0JfSE9TVF9TVEFUVVNfQkxPQ0tfT0ZGU0VUKGZ1bmMpLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fZGVmX3N0YXR1c19ibG9jaykvNCk7Ci0JYm54MnhfaW5pdF9maWxsKGJwLCBDU0VNX1JFR19GQVNUX01FTU9SWSArCi0JCQlDU1RPUk1fREVGX1NCX0hPU1RfU1RBVFVTX0JMT0NLX1VfT0ZGU0VUKGZ1bmMpLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBjc3Rvcm1fZGVmX3N0YXR1c19ibG9ja191KS80KTsKLQlibngyeF9pbml0X2ZpbGwoYnAsIENTRU1fUkVHX0ZBU1RfTUVNT1JZICsKLQkJCUNTVE9STV9ERUZfU0JfSE9TVF9TVEFUVVNfQkxPQ0tfQ19PRkZTRVQoZnVuYyksIDAsCi0JCQlzaXplb2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX2MpLzQpOwotCWJueDJ4X2luaXRfZmlsbChicCwgWFNFTV9SRUdfRkFTVF9NRU1PUlkgKwotCQkJWFNUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19PRkZTRVQoZnVuYyksIDAsCi0JCQlzaXplb2Yoc3RydWN0IHhzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrKS80KTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaW5pdF9kZWZfc2Ioc3RydWN0IGJueDJ4ICpicCwKLQkJCSAgICAgIHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2sgKmRlZl9zYiwKLQkJCSAgICAgIGRtYV9hZGRyX3QgbWFwcGluZywgaW50IHNiX2lkKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQlpbnQgaW5kZXgsIHZhbCwgcmVnX29mZnNldDsKLQl1NjQgc2VjdGlvbjsKLQotCS8qIEFUVE4gKi8KLQlzZWN0aW9uID0gKCh1NjQpbWFwcGluZykgKyBvZmZzZXRvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrLAotCQkJCQkgICAgYXR0ZW5fc3RhdHVzX2Jsb2NrKTsKLQlkZWZfc2ItPmF0dGVuX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaWQgPSBzYl9pZDsKLQotCWJwLT5hdHRuX3N0YXRlID0gMDsKLQotCXJlZ19vZmZzZXQgPSAocG9ydCA/IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMV9PVVRfMCA6Ci0JCQkgICAgIE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMCk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfRFlOQU1JQ19BVFROX0dSUFM7IGluZGV4KyspIHsKLQkJYnAtPmF0dG5fZ3JvdXBbaW5kZXhdLnNpZ1swXSA9IFJFR19SRChicCwKLQkJCQkJCSAgICAgcmVnX29mZnNldCArIDB4MTAqaW5kZXgpOwotCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnWzFdID0gUkVHX1JEKGJwLAotCQkJCQkgICAgICAgcmVnX29mZnNldCArIDB4NCArIDB4MTAqaW5kZXgpOwotCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnWzJdID0gUkVHX1JEKGJwLAotCQkJCQkgICAgICAgcmVnX29mZnNldCArIDB4OCArIDB4MTAqaW5kZXgpOwotCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnWzNdID0gUkVHX1JEKGJwLAotCQkJCQkgICAgICAgcmVnX29mZnNldCArIDB4YyArIDB4MTAqaW5kZXgpOwotCX0KLQotCXJlZ19vZmZzZXQgPSAocG9ydCA/IEhDX1JFR19BVFROX01TRzFfQUREUl9MIDoKLQkJCSAgICAgSENfUkVHX0FUVE5fTVNHMF9BRERSX0wpOwotCi0JUkVHX1dSKGJwLCByZWdfb2Zmc2V0LCBVNjRfTE8oc2VjdGlvbikpOwotCVJFR19XUihicCwgcmVnX29mZnNldCArIDQsIFU2NF9ISShzZWN0aW9uKSk7Ci0KLQlyZWdfb2Zmc2V0ID0gKHBvcnQgPyBIQ19SRUdfQVRUTl9OVU1fUDEgOiBIQ19SRUdfQVRUTl9OVU1fUDApOwotCi0JdmFsID0gUkVHX1JEKGJwLCByZWdfb2Zmc2V0KTsKLQl2YWwgfD0gc2JfaWQ7Ci0JUkVHX1dSKGJwLCByZWdfb2Zmc2V0LCB2YWwpOwotCi0JLyogVVNUT1JNICovCi0Jc2VjdGlvbiA9ICgodTY0KW1hcHBpbmcpICsgb2Zmc2V0b2Yoc3RydWN0IGhvc3RfZGVmX3N0YXR1c19ibG9jaywKLQkJCQkJICAgIHVfZGVmX3N0YXR1c19ibG9jayk7Ci0JZGVmX3NiLT51X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2lkID0gc2JfaWQ7Ci0KLQlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JICAgICAgIENTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX1VfT0ZGU0VUKGZ1bmMpLCBVNjRfTE8oc2VjdGlvbikpOwotCVJFR19XUihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkgICAgICAgKChDU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9VX09GRlNFVChmdW5jKSkgKyA0KSwKLQkgICAgICAgVTY0X0hJKHNlY3Rpb24pKTsKLQlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBERUZfVVNCX0ZVTkNfT0ZGICsKLQkJQ1NUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19VX09GRlNFVChmdW5jKSwgZnVuYyk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBIQ19VU1RPUk1fREVGX1NCX05VTV9JTkRJQ0VTOyBpbmRleCsrKQotCQlSRUdfV1IxNihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJCSBDU1RPUk1fREVGX1NCX0hDX0RJU0FCTEVfVV9PRkZTRVQoZnVuYywgaW5kZXgpLCAxKTsKLQotCS8qIENTVE9STSAqLwotCXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2ssCi0JCQkJCSAgICBjX2RlZl9zdGF0dXNfYmxvY2spOwotCWRlZl9zYi0+Y19kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IHNiX2lkOwotCi0JUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCSAgICAgICBDU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9DX09GRlNFVChmdW5jKSwgVTY0X0xPKHNlY3Rpb24pKTsKLQlSRUdfV1IoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JICAgICAgICgoQ1NUT1JNX0RFRl9TQl9IT1NUX1NCX0FERFJfQ19PRkZTRVQoZnVuYykpICsgNCksCi0JICAgICAgIFU2NF9ISShzZWN0aW9uKSk7Ci0JUkVHX1dSOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsgREVGX0NTQl9GVU5DX09GRiArCi0JCUNTVE9STV9ERUZfU0JfSE9TVF9TVEFUVVNfQkxPQ0tfQ19PRkZTRVQoZnVuYyksIGZ1bmMpOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSENfQ1NUT1JNX0RFRl9TQl9OVU1fSU5ESUNFUzsgaW5kZXgrKykKLQkJUkVHX1dSMTYoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQkgQ1NUT1JNX0RFRl9TQl9IQ19ESVNBQkxFX0NfT0ZGU0VUKGZ1bmMsIGluZGV4KSwgMSk7Ci0KLQkvKiBUU1RPUk0gKi8KLQlzZWN0aW9uID0gKCh1NjQpbWFwcGluZykgKyBvZmZzZXRvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrLAotCQkJCQkgICAgdF9kZWZfc3RhdHVzX2Jsb2NrKTsKLQlkZWZfc2ItPnRfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaWQgPSBzYl9pZDsKLQotCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkgICAgICAgVFNUT1JNX0RFRl9TQl9IT1NUX1NCX0FERFJfT0ZGU0VUKGZ1bmMpLCBVNjRfTE8oc2VjdGlvbikpOwotCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkgICAgICAgKChUU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQoZnVuYykpICsgNCksCi0JICAgICAgIFU2NF9ISShzZWN0aW9uKSk7Ci0JUkVHX1dSOChicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsgREVGX1RTQl9GVU5DX09GRiArCi0JCVRTVE9STV9ERUZfU0JfSE9TVF9TVEFUVVNfQkxPQ0tfT0ZGU0VUKGZ1bmMpLCBmdW5jKTsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEhDX1RTVE9STV9ERUZfU0JfTlVNX0lORElDRVM7IGluZGV4KyspCi0JCVJFR19XUjE2KGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJIFRTVE9STV9ERUZfU0JfSENfRElTQUJMRV9PRkZTRVQoZnVuYywgaW5kZXgpLCAxKTsKLQotCS8qIFhTVE9STSAqLwotCXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2ssCi0JCQkJCSAgICB4X2RlZl9zdGF0dXNfYmxvY2spOwotCWRlZl9zYi0+eF9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IHNiX2lkOwotCi0JUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCSAgICAgICBYU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQoZnVuYyksIFU2NF9MTyhzZWN0aW9uKSk7Ci0JUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCSAgICAgICAoKFhTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX09GRlNFVChmdW5jKSkgKyA0KSwKLQkgICAgICAgVTY0X0hJKHNlY3Rpb24pKTsKLQlSRUdfV1I4KGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBERUZfWFNCX0ZVTkNfT0ZGICsKLQkJWFNUT1JNX0RFRl9TQl9IT1NUX1NUQVRVU19CTE9DS19PRkZTRVQoZnVuYyksIGZ1bmMpOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSENfWFNUT1JNX0RFRl9TQl9OVU1fSU5ESUNFUzsgaW5kZXgrKykKLQkJUkVHX1dSMTYoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArCi0JCQkgWFNUT1JNX0RFRl9TQl9IQ19ESVNBQkxFX09GRlNFVChmdW5jLCBpbmRleCksIDEpOwotCi0JYnAtPnN0YXRzX3BlbmRpbmcgPSAwOwotCWJwLT5zZXRfbWFjX3BlbmRpbmcgPSAwOwotCi0JYm54MnhfYWNrX3NiKGJwLCBzYl9pZCwgQ1NUT1JNX0lELCAwLCBJR1VfSU5UX0VOQUJMRSwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9jb2FsZXNjZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlpbnQgc2JfaWQgPSBicC0+ZnBbaV0uc2JfaWQ7Ci0KLQkJLyogSENfSU5ERVhfVV9FVEhfUlhfQ1FfQ09OUyAqLwotCQlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCQkJQ1NUT1JNX1NCX0hDX1RJTUVPVVRfVV9PRkZTRVQocG9ydCwgc2JfaWQsCi0JCQkJCQkgICAgICBVX1NCX0VUSF9SWF9DUV9JTkRFWCksCi0JCQlicC0+cnhfdGlja3MvKDQgKiBCTlgyWF9CVFIpKTsKLQkJUkVHX1dSMTYoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQkgQ1NUT1JNX1NCX0hDX0RJU0FCTEVfVV9PRkZTRVQocG9ydCwgc2JfaWQsCi0JCQkJCQkgICAgICAgVV9TQl9FVEhfUlhfQ1FfSU5ERVgpLAotCQkJIChicC0+cnhfdGlja3MvKDQgKiBCTlgyWF9CVFIpKSA/IDAgOiAxKTsKLQotCQkvKiBIQ19JTkRFWF9DX0VUSF9UWF9DUV9DT05TICovCi0JCVJFR19XUjgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQlDU1RPUk1fU0JfSENfVElNRU9VVF9DX09GRlNFVChwb3J0LCBzYl9pZCwKLQkJCQkJCSAgICAgIENfU0JfRVRIX1RYX0NRX0lOREVYKSwKLQkJCWJwLT50eF90aWNrcy8oNCAqIEJOWDJYX0JUUikpOwotCQlSRUdfV1IxNihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJCSBDU1RPUk1fU0JfSENfRElTQUJMRV9DX09GRlNFVChwb3J0LCBzYl9pZCwKLQkJCQkJCSAgICAgICBDX1NCX0VUSF9UWF9DUV9JTkRFWCksCi0JCQkgKGJwLT50eF90aWNrcy8oNCAqIEJOWDJYX0JUUikpID8gMCA6IDEpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2ZyZWVfdHBhX3Bvb2woc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICAgICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgaW50IGxhc3QpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7Ci0JCXN0cnVjdCBzd19yeF9iZCAqcnhfYnVmID0gJihmcC0+dHBhX3Bvb2xbaV0pOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7Ci0KLQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQlEUChORVRJRl9NU0dfSUZET1dOLCAidHBhIGJpbiAlZCBlbXB0eSBvbiBmcmVlXG4iLCBpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGZwLT50cGFfc3RhdGVbaV0gPT0gQk5YMlhfVFBBX1NUQVJUKQotCQkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKLQkJCQkJIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCi0JCQkJCSBicC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyeF9idWYtPnNrYiA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X3J4X3JpbmdzKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQlpbnQgbWF4X2FnZ19xdWV1ZXMgPSBDSElQX0lTX0UxKGJwKSA/IEVUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxIDoKLQkJCQkJICAgICAgRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIOwotCXUxNiByaW5nX3Byb2QsIGNxZV9yaW5nX3Byb2Q7Ci0JaW50IGksIGo7Ci0KLQlicC0+cnhfYnVmX3NpemUgPSBicC0+ZGV2LT5tdHUgKyBFVEhfT1ZSRUhFQUQgKyBCTlgyWF9SWF9BTElHTjsKLQlEUChORVRJRl9NU0dfSUZVUCwKLQkgICAibXR1ICVkICByeF9idWZfc2l6ZSAlZFxuIiwgYnAtPmRldi0+bXR1LCBicC0+cnhfYnVmX3NpemUpOwotCi0JaWYgKGJwLT5mbGFncyAmIFRQQV9FTkFCTEVfRkxBRykgewotCi0JCWZvcl9lYWNoX3F1ZXVlKGJwLCBqKSB7Ci0JCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtqXTsKLQotCQkJZm9yIChpID0gMDsgaSA8IG1heF9hZ2dfcXVldWVzOyBpKyspIHsKLQkJCQlmcC0+dHBhX3Bvb2xbaV0uc2tiID0KLQkJCQkgICBuZXRkZXZfYWxsb2Nfc2tiKGJwLT5kZXYsIGJwLT5yeF9idWZfc2l6ZSk7Ci0JCQkJaWYgKCFmcC0+dHBhX3Bvb2xbaV0uc2tiKSB7Ci0JCQkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIFRQQSAiCi0JCQkJCQkgICJza2IgcG9vbCBmb3IgcXVldWVbJWRdIC0gIgotCQkJCQkJICAiZGlzYWJsaW5nIFRQQSBvbiB0aGlzICIKLQkJCQkJCSAgInF1ZXVlIVxuIiwgaik7Ci0JCQkJCWJueDJ4X2ZyZWVfdHBhX3Bvb2woYnAsIGZwLCBpKTsKLQkJCQkJZnAtPmRpc2FibGVfdHBhID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRtYV91bm1hcF9hZGRyX3NldCgoc3RydWN0IHN3X3J4X2JkICopCi0JCQkJCQkJJmJwLT5mcC0+dHBhX3Bvb2xbaV0sCi0JCQkJCQkgICBtYXBwaW5nLCAwKTsKLQkJCQlmcC0+dHBhX3N0YXRlW2ldID0gQk5YMlhfVFBBX1NUT1A7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaikgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtqXTsKLQotCQlmcC0+cnhfYmRfY29ucyA9IDA7Ci0JCWZwLT5yeF9jb25zX3NiID0gQk5YMlhfUlhfU0JfSU5ERVg7Ci0JCWZwLT5yeF9iZF9jb25zX3NiID0gQk5YMlhfUlhfU0JfQkRfSU5ERVg7Ci0KLQkJLyogIm5leHQgcGFnZSIgZWxlbWVudHMgaW5pdGlhbGl6YXRpb24gKi8KLQkJLyogU0dFIHJpbmcgKi8KLQkJZm9yIChpID0gMTsgaSA8PSBOVU1fUlhfU0dFX1BBR0VTOyBpKyspIHsKLQkJCXN0cnVjdCBldGhfcnhfc2dlICpzZ2U7Ci0KLQkJCXNnZSA9ICZmcC0+cnhfc2dlX3JpbmdbUlhfU0dFX0NOVCAqIGkgLSAyXTsKLQkJCXNnZS0+YWRkcl9oaSA9Ci0JCQkJY3B1X3RvX2xlMzIoVTY0X0hJKGZwLT5yeF9zZ2VfbWFwcGluZyArCi0JCQkJCUJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fUlhfU0dFX1BBR0VTKSkpOwotCQkJc2dlLT5hZGRyX2xvID0KLQkJCQljcHVfdG9fbGUzMihVNjRfTE8oZnAtPnJ4X3NnZV9tYXBwaW5nICsKLQkJCQkJQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SWF9TR0VfUEFHRVMpKSk7Ci0JCX0KLQotCQlibngyeF9pbml0X3NnZV9yaW5nX2JpdF9tYXNrKGZwKTsKLQotCQkvKiBSWCBCRCByaW5nICovCi0JCWZvciAoaSA9IDE7IGkgPD0gTlVNX1JYX1JJTkdTOyBpKyspIHsKLQkJCXN0cnVjdCBldGhfcnhfYmQgKnJ4X2JkOwotCi0JCQlyeF9iZCA9ICZmcC0+cnhfZGVzY19yaW5nW1JYX0RFU0NfQ05UICogaSAtIDJdOwotCQkJcnhfYmQtPmFkZHJfaGkgPQotCQkJCWNwdV90b19sZTMyKFU2NF9ISShmcC0+cnhfZGVzY19tYXBwaW5nICsKLQkJCQkJICAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fUlhfUklOR1MpKSk7Ci0JCQlyeF9iZC0+YWRkcl9sbyA9Ci0JCQkJY3B1X3RvX2xlMzIoVTY0X0xPKGZwLT5yeF9kZXNjX21hcHBpbmcgKwotCQkJCQkgICAgQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SWF9SSU5HUykpKTsKLQkJfQotCi0JCS8qIENRIHJpbmcgKi8KLQkJZm9yIChpID0gMTsgaSA8PSBOVU1fUkNRX1JJTkdTOyBpKyspIHsKLQkJCXN0cnVjdCBldGhfcnhfY3FlX25leHRfcGFnZSAqbmV4dHBnOwotCi0JCQluZXh0cGcgPSAoc3RydWN0IGV0aF9yeF9jcWVfbmV4dF9wYWdlICopCi0JCQkJJmZwLT5yeF9jb21wX3JpbmdbUkNRX0RFU0NfQ05UICogaSAtIDFdOwotCQkJbmV4dHBnLT5hZGRyX2hpID0KLQkJCQljcHVfdG9fbGUzMihVNjRfSEkoZnAtPnJ4X2NvbXBfbWFwcGluZyArCi0JCQkJCSAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fUkNRX1JJTkdTKSkpOwotCQkJbmV4dHBnLT5hZGRyX2xvID0KLQkJCQljcHVfdG9fbGUzMihVNjRfTE8oZnAtPnJ4X2NvbXBfbWFwcGluZyArCi0JCQkJCSAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fUkNRX1JJTkdTKSkpOwotCQl9Ci0KLQkJLyogQWxsb2NhdGUgU0dFcyBhbmQgaW5pdGlhbGl6ZSB0aGUgcmluZyBlbGVtZW50cyAqLwotCQlmb3IgKGkgPSAwLCByaW5nX3Byb2QgPSAwOwotCQkgICAgIGkgPCBNQVhfUlhfU0dFX0NOVCpOVU1fUlhfU0dFX1BBR0VTOyBpKyspIHsKLQotCQkJaWYgKGJueDJ4X2FsbG9jX3J4X3NnZShicCwgZnAsIHJpbmdfcHJvZCkgPCAwKSB7Ci0JCQkJQk5YMlhfRVJSKCJ3YXMgb25seSBhYmxlIHRvIGFsbG9jYXRlICIKLQkJCQkJICAiJWQgcnggc2dlc1xuIiwgaSk7Ci0JCQkJQk5YMlhfRVJSKCJkaXNhYmxpbmcgVFBBIGZvciBxdWV1ZVslZF1cbiIsIGopOwotCQkJCS8qIENsZWFudXAgYWxyZWFkeSBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KLQkJCQlibngyeF9mcmVlX3J4X3NnZV9yYW5nZShicCwgZnAsIHJpbmdfcHJvZCk7Ci0JCQkJYm54MnhfZnJlZV90cGFfcG9vbChicCwgZnAsIG1heF9hZ2dfcXVldWVzKTsKLQkJCQlmcC0+ZGlzYWJsZV90cGEgPSAxOwotCQkJCXJpbmdfcHJvZCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyaW5nX3Byb2QgPSBORVhUX1NHRV9JRFgocmluZ19wcm9kKTsKLQkJfQotCQlmcC0+cnhfc2dlX3Byb2QgPSByaW5nX3Byb2Q7Ci0KLQkJLyogQWxsb2NhdGUgQkRzIGFuZCBpbml0aWFsaXplIEJEIHJpbmcgKi8KLQkJZnAtPnJ4X2NvbXBfY29ucyA9IDA7Ci0JCWNxZV9yaW5nX3Byb2QgPSByaW5nX3Byb2QgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgYnAtPnJ4X3Jpbmdfc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoYm54MnhfYWxsb2Nfcnhfc2tiKGJwLCBmcCwgcmluZ19wcm9kKSA8IDApIHsKLQkJCQlCTlgyWF9FUlIoIndhcyBvbmx5IGFibGUgdG8gYWxsb2NhdGUgIgotCQkJCQkgICIlZCByeCBza2JzIG9uIHF1ZXVlWyVkXVxuIiwgaSwgaik7Ci0JCQkJZnAtPmV0aF9xX3N0YXRzLnJ4X3NrYl9hbGxvY19mYWlsZWQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJpbmdfcHJvZCA9IE5FWFRfUlhfSURYKHJpbmdfcHJvZCk7Ci0JCQljcWVfcmluZ19wcm9kID0gTkVYVF9SQ1FfSURYKGNxZV9yaW5nX3Byb2QpOwotCQkJV0FSTl9PTihyaW5nX3Byb2QgPD0gaSk7Ci0JCX0KLQotCQlmcC0+cnhfYmRfcHJvZCA9IHJpbmdfcHJvZDsKLQkJLyogbXVzdCBub3QgaGF2ZSBtb3JlIGF2YWlsYWJsZSBDUUVzIHRoYW4gQkRzICovCi0JCWZwLT5yeF9jb21wX3Byb2QgPSBtaW5fdCh1MTYsIE5VTV9SQ1FfUklOR1MqUkNRX0RFU0NfQ05ULAotCQkJCQkgY3FlX3JpbmdfcHJvZCk7Ci0JCWZwLT5yeF9wa3QgPSBmcC0+cnhfY2FsbHMgPSAwOwotCi0JCS8qIFdhcm5pbmchCi0JCSAqIHRoaXMgd2lsbCBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgKHRvIHRoZSBUU1RPUk0pCi0JCSAqIG11c3Qgb25seSBiZSBkb25lIGFmdGVyIGNoaXAgaXMgaW5pdGlhbGl6ZWQKLQkJICovCi0JCWJueDJ4X3VwZGF0ZV9yeF9wcm9kKGJwLCBmcCwgcmluZ19wcm9kLCBmcC0+cnhfY29tcF9wcm9kLAotCQkJCSAgICAgZnAtPnJ4X3NnZV9wcm9kKTsKLQkJaWYgKGogIT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJICAgICAgIFVTVE9STV9NRU1fV09SS0FST1VORF9BRERSRVNTX09GRlNFVChmdW5jKSwKLQkJICAgICAgIFU2NF9MTyhmcC0+cnhfY29tcF9tYXBwaW5nKSk7Ci0JCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJICAgICAgIFVTVE9STV9NRU1fV09SS0FST1VORF9BRERSRVNTX09GRlNFVChmdW5jKSArIDQsCi0JCSAgICAgICBVNjRfSEkoZnAtPnJ4X2NvbXBfbWFwcGluZykpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaW5pdF90eF9yaW5nKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGksIGo7Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaikgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtqXTsKLQotCQlmb3IgKGkgPSAxOyBpIDw9IE5VTV9UWF9SSU5HUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgZXRoX3R4X25leHRfYmQgKnR4X25leHRfYmQgPQotCQkJCSZmcC0+dHhfZGVzY19yaW5nW1RYX0RFU0NfQ05UICogaSAtIDFdLm5leHRfYmQ7Ci0KLQkJCXR4X25leHRfYmQtPmFkZHJfaGkgPQotCQkJCWNwdV90b19sZTMyKFU2NF9ISShmcC0+dHhfZGVzY19tYXBwaW5nICsKLQkJCQkJICAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fVFhfUklOR1MpKSk7Ci0JCQl0eF9uZXh0X2JkLT5hZGRyX2xvID0KLQkJCQljcHVfdG9fbGUzMihVNjRfTE8oZnAtPnR4X2Rlc2NfbWFwcGluZyArCi0JCQkJCSAgICBCQ01fUEFHRV9TSVpFKihpICUgTlVNX1RYX1JJTkdTKSkpOwotCQl9Ci0KLQkJZnAtPnR4X2RiLmRhdGEuaGVhZGVyLmhlYWRlciA9IERPT1JCRUxMX0hEUl9EQl9UWVBFOwotCQlmcC0+dHhfZGIuZGF0YS56ZXJvX2ZpbGwxID0gMDsKLQkJZnAtPnR4X2RiLmRhdGEucHJvZCA9IDA7Ci0KLQkJZnAtPnR4X3BrdF9wcm9kID0gMDsKLQkJZnAtPnR4X3BrdF9jb25zID0gMDsKLQkJZnAtPnR4X2JkX3Byb2QgPSAwOwotCQlmcC0+dHhfYmRfY29ucyA9IDA7Ci0JCWZwLT50eF9jb25zX3NiID0gQk5YMlhfVFhfU0JfSU5ERVg7Ci0JCWZwLT50eF9wa3QgPSAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaW5pdF9zcF9yaW5nKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQotCXNwaW5fbG9ja19pbml0KCZicC0+c3BxX2xvY2spOwotCi0JYnAtPnNwcV9sZWZ0ID0gTUFYX1NQUV9QRU5ESU5HOwotCWJwLT5zcHFfcHJvZF9pZHggPSAwOwotCWJwLT5kc2Jfc3BfcHJvZCA9IEJOWDJYX1NQX0RTQl9JTkRFWDsKLQlicC0+c3BxX3Byb2RfYmQgPSBicC0+c3BxOwotCWJwLT5zcHFfbGFzdF9iZCA9IGJwLT5zcHFfcHJvZF9iZCArIE1BWF9TUF9ERVNDX0NOVDsKLQotCVJFR19XUihicCwgWFNFTV9SRUdfRkFTVF9NRU1PUlkgKyBYU1RPUk1fU1BRX1BBR0VfQkFTRV9PRkZTRVQoZnVuYyksCi0JICAgICAgIFU2NF9MTyhicC0+c3BxX21hcHBpbmcpKTsKLQlSRUdfV1IoYnAsCi0JICAgICAgIFhTRU1fUkVHX0ZBU1RfTUVNT1JZICsgWFNUT1JNX1NQUV9QQUdFX0JBU0VfT0ZGU0VUKGZ1bmMpICsgNCwKLQkgICAgICAgVTY0X0hJKGJwLT5zcHFfbWFwcGluZykpOwotCi0JUkVHX1dSKGJwLCBYU0VNX1JFR19GQVNUX01FTU9SWSArIFhTVE9STV9TUFFfUFJPRF9PRkZTRVQoZnVuYyksCi0JICAgICAgIGJwLT5zcHFfcHJvZF9pZHgpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X2NvbnRleHQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaTsKLQotCS8qIFJ4ICovCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQkJc3RydWN0IGV0aF9jb250ZXh0ICpjb250ZXh0ID0gYm54Mnhfc3AoYnAsIGNvbnRleHRbaV0uZXRoKTsKLQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0JCXU4IGNsX2lkID0gZnAtPmNsX2lkOwotCi0JCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5zYl9pbmRleF9udW1iZXJzID0KLQkJCQkJCUJOWDJYX1JYX1NCX0lOREVYX05VTTsKLQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLmNsaWVudElkID0gY2xfaWQ7Ci0JCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5zdGF0dXNfYmxvY2tfaWQgPSBmcC0+c2JfaWQ7Ci0JCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5mbGFncyA9Ci0JCQkoVVNUT1JNX0VUSF9TVF9DT05URVhUX0NPTkZJR19FTkFCTEVfTUNfQUxJR05NRU5UIHwKLQkJCSBVU1RPUk1fRVRIX1NUX0NPTlRFWFRfQ09ORklHX0VOQUJMRV9TVEFUSVNUSUNTKTsKLQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLnN0YXRpc3RpY3NfY291bnRlcl9pZCA9Ci0JCQkJCQljbF9pZDsKLQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLm1jX2FsaWdubWVudF9sb2dfc2l6ZSA9Ci0JCQkJCQlCTlgyWF9SWF9BTElHTl9TSElGVDsKLQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLmJkX2J1ZmZfc2l6ZSA9Ci0JCQkJCQlicC0+cnhfYnVmX3NpemU7Ci0JCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5iZF9wYWdlX2Jhc2VfaGkgPQotCQkJCQkJVTY0X0hJKGZwLT5yeF9kZXNjX21hcHBpbmcpOwotCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uYmRfcGFnZV9iYXNlX2xvID0KLQkJCQkJCVU2NF9MTyhmcC0+cnhfZGVzY19tYXBwaW5nKTsKLQkJaWYgKCFmcC0+ZGlzYWJsZV90cGEpIHsKLQkJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5mbGFncyB8PQotCQkJCVVTVE9STV9FVEhfU1RfQ09OVEVYVF9DT05GSUdfRU5BQkxFX1RQQTsKLQkJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5zZ2VfYnVmZl9zaXplID0KLQkJCQkodTE2KW1pbl90KHUzMiwgU0dFX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFLAotCQkJCQkgICAweGZmZmYpOwotCQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLnNnZV9wYWdlX2Jhc2VfaGkgPQotCQkJCQkJVTY0X0hJKGZwLT5yeF9zZ2VfbWFwcGluZyk7Ci0JCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uc2dlX3BhZ2VfYmFzZV9sbyA9Ci0JCQkJCQlVNjRfTE8oZnAtPnJ4X3NnZV9tYXBwaW5nKTsKLQotCQkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQuY29tbW9uLm1heF9zZ2VzX2Zvcl9wYWNrZXQgPQotCQkJCVNHRV9QQUdFX0FMSUdOKGJwLT5kZXYtPm10dSkgPj4gU0dFX1BBR0VfU0hJRlQ7Ci0JCQljb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24ubWF4X3NnZXNfZm9yX3BhY2tldCA9Ci0JCQkJKChjb250ZXh0LT51c3Rvcm1fc3RfY29udGV4dC5jb21tb24uCi0JCQkJICBtYXhfc2dlc19mb3JfcGFja2V0ICsgUEFHRVNfUEVSX1NHRSAtIDEpICYKLQkJCQkgKH4oUEFHRVNfUEVSX1NHRSAtIDEpKSkgPj4gUEFHRVNfUEVSX1NHRV9TSElGVDsKLQkJfQotCi0JCWNvbnRleHQtPnVzdG9ybV9hZ19jb250ZXh0LmNkdV91c2FnZSA9Ci0JCQlDRFVfUlNSVkRfVkFMVUVfVFlQRV9BKEhXX0NJRChicCwgaSksCi0JCQkJCSAgICAgICBDRFVfUkVHSU9OX05VTUJFUl9VQ01fQUcsCi0JCQkJCSAgICAgICBFVEhfQ09OTkVDVElPTl9UWVBFKTsKLQotCQljb250ZXh0LT54c3Rvcm1fYWdfY29udGV4dC5jZHVfcmVzZXJ2ZWQgPQotCQkJQ0RVX1JTUlZEX1ZBTFVFX1RZUEVfQShIV19DSUQoYnAsIGkpLAotCQkJCQkgICAgICAgQ0RVX1JFR0lPTl9OVU1CRVJfWENNX0FHLAotCQkJCQkgICAgICAgRVRIX0NPTk5FQ1RJT05fVFlQRSk7Ci0JfQotCi0JLyogVHggKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQkJc3RydWN0IGV0aF9jb250ZXh0ICpjb250ZXh0ID0KLQkJCWJueDJ4X3NwKGJwLCBjb250ZXh0W2ldLmV0aCk7Ci0KLQkJY29udGV4dC0+Y3N0b3JtX3N0X2NvbnRleHQuc2JfaW5kZXhfbnVtYmVyID0KLQkJCQkJCUNfU0JfRVRIX1RYX0NRX0lOREVYOwotCQljb250ZXh0LT5jc3Rvcm1fc3RfY29udGV4dC5zdGF0dXNfYmxvY2tfaWQgPSBmcC0+c2JfaWQ7Ci0KLQkJY29udGV4dC0+eHN0b3JtX3N0X2NvbnRleHQudHhfYmRfcGFnZV9iYXNlX2hpID0KLQkJCQkJCVU2NF9ISShmcC0+dHhfZGVzY19tYXBwaW5nKTsKLQkJY29udGV4dC0+eHN0b3JtX3N0X2NvbnRleHQudHhfYmRfcGFnZV9iYXNlX2xvID0KLQkJCQkJCVU2NF9MTyhmcC0+dHhfZGVzY19tYXBwaW5nKTsKLQkJY29udGV4dC0+eHN0b3JtX3N0X2NvbnRleHQuc3RhdGlzdGljc19kYXRhID0gKGZwLT5jbF9pZCB8Ci0JCQkJWFNUT1JNX0VUSF9TVF9DT05URVhUX1NUQVRJU1RJQ1NfRU5BQkxFKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW5kX3RhYmxlKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQlpbnQgaTsKLQotCWlmIChicC0+bXVsdGlfbW9kZSA9PSBFVEhfUlNTX01PREVfRElTQUJMRUQpCi0JCXJldHVybjsKLQotCURQKE5FVElGX01TR19JRlVQLAotCSAgICJJbml0aWFsaXppbmcgaW5kaXJlY3Rpb24gdGFibGUgIG11bHRpX21vZGUgJWRcbiIsIGJwLT5tdWx0aV9tb2RlKTsKLQlmb3IgKGkgPSAwOyBpIDwgVFNUT1JNX0lORElSRUNUSU9OX1RBQkxFX1NJWkU7IGkrKykKLQkJUkVHX1dSOChicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJCVRTVE9STV9JTkRJUkVDVElPTl9UQUJMRV9PRkZTRVQoZnVuYykgKyBpLAotCQkJYnAtPmZwLT5jbF9pZCArIChpICUgYnAtPm51bV9xdWV1ZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2NsaWVudF9jb25maWcoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgdHN0b3JtX2V0aF9jbGllbnRfY29uZmlnIHRzdG9ybV9jbGllbnQgPSB7MH07Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgaTsKLQotCXRzdG9ybV9jbGllbnQubXR1ID0gYnAtPmRldi0+bXR1OwotCXRzdG9ybV9jbGllbnQuY29uZmlnX2ZsYWdzID0KLQkJCQkoVFNUT1JNX0VUSF9DTElFTlRfQ09ORklHX1NUQVRTSVRJQ1NfRU5BQkxFIHwKLQkJCQkgVFNUT1JNX0VUSF9DTElFTlRfQ09ORklHX0UxSE9WX1JFTV9FTkFCTEUpOwotI2lmZGVmIEJDTV9WTEFOCi0JaWYgKGJwLT5yeF9tb2RlICYmIGJwLT52bGdycCAmJiAoYnAtPmZsYWdzICYgSFdfVkxBTl9SWF9GTEFHKSkgewotCQl0c3Rvcm1fY2xpZW50LmNvbmZpZ19mbGFncyB8PQotCQkJCVRTVE9STV9FVEhfQ0xJRU5UX0NPTkZJR19WTEFOX1JFTV9FTkFCTEU7Ci0JCURQKE5FVElGX01TR19JRlVQLCAidmxhbiByZW1vdmFsIGVuYWJsZWRcbiIpOwotCX0KLSNlbmRpZgotCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQkJdHN0b3JtX2NsaWVudC5zdGF0aXN0aWNzX2NvdW50ZXJfaWQgPSBicC0+ZnBbaV0uY2xfaWQ7Ci0KLQkJUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkgICAgICAgVFNUT1JNX0NMSUVOVF9DT05GSUdfT0ZGU0VUKHBvcnQsIGJwLT5mcFtpXS5jbF9pZCksCi0JCSAgICAgICAoKHUzMiAqKSZ0c3Rvcm1fY2xpZW50KVswXSk7Ci0JCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJICAgICAgIFRTVE9STV9DTElFTlRfQ09ORklHX09GRlNFVChwb3J0LCBicC0+ZnBbaV0uY2xfaWQpICsgNCwKLQkJICAgICAgICgodTMyICopJnRzdG9ybV9jbGllbnQpWzFdKTsKLQl9Ci0KLQlEUChCTlgyWF9NU0dfT0ZGLCAidHN0b3JtX2NsaWVudDogMHglMDh4IDB4JTA4eFxuIiwKLQkgICAoKHUzMiAqKSZ0c3Rvcm1fY2xpZW50KVswXSwgKCh1MzIgKikmdHN0b3JtX2NsaWVudClbMV0pOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCB0c3Rvcm1fZXRoX21hY19maWx0ZXJfY29uZmlnIHRzdG9ybV9tYWNfZmlsdGVyID0gezB9OwotCWludCBtb2RlID0gYnAtPnJ4X21vZGU7Ci0JaW50IG1hc2sgPSBicC0+cnhfbW9kZV9jbF9tYXNrOwotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgaTsKLQkvKiBBbGwgYnV0IG1hbmFnZW1lbnQgdW5pY2FzdCBwYWNrZXRzIHNob3VsZCBwYXNzIHRvIHRoZSBob3N0IGFzIHdlbGwgKi8KLQl1MzIgbGxoX21hc2sgPQotCQlOSUdfTExIMF9CUkIxX0RSVl9NQVNLX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfQlJDU1QgfAotCQlOSUdfTExIMF9CUkIxX0RSVl9NQVNLX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfTUxDU1QgfAotCQlOSUdfTExIMF9CUkIxX0RSVl9NQVNLX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfVkxBTiB8Ci0JCU5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19OT19WTEFOOwotCi0JRFAoTkVUSUZfTVNHX0lGVVAsICJyeCBtb2RlICVkICBtYXNrIDB4JXhcbiIsIG1vZGUsIG1hc2spOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBCTlgyWF9SWF9NT0RFX05PTkU6IC8qIG5vIFJ4ICovCi0JCXRzdG9ybV9tYWNfZmlsdGVyLnVjYXN0X2Ryb3BfYWxsID0gbWFzazsKLQkJdHN0b3JtX21hY19maWx0ZXIubWNhc3RfZHJvcF9hbGwgPSBtYXNrOwotCQl0c3Rvcm1fbWFjX2ZpbHRlci5iY2FzdF9kcm9wX2FsbCA9IG1hc2s7Ci0JCWJyZWFrOwotCi0JY2FzZSBCTlgyWF9SWF9NT0RFX05PUk1BTDoKLQkJdHN0b3JtX21hY19maWx0ZXIuYmNhc3RfYWNjZXB0X2FsbCA9IG1hc2s7Ci0JCWJyZWFrOwotCi0JY2FzZSBCTlgyWF9SWF9NT0RFX0FMTE1VTFRJOgotCQl0c3Rvcm1fbWFjX2ZpbHRlci5tY2FzdF9hY2NlcHRfYWxsID0gbWFzazsKLQkJdHN0b3JtX21hY19maWx0ZXIuYmNhc3RfYWNjZXB0X2FsbCA9IG1hc2s7Ci0JCWJyZWFrOwotCi0JY2FzZSBCTlgyWF9SWF9NT0RFX1BST01JU0M6Ci0JCXRzdG9ybV9tYWNfZmlsdGVyLnVjYXN0X2FjY2VwdF9hbGwgPSBtYXNrOwotCQl0c3Rvcm1fbWFjX2ZpbHRlci5tY2FzdF9hY2NlcHRfYWxsID0gbWFzazsKLQkJdHN0b3JtX21hY19maWx0ZXIuYmNhc3RfYWNjZXB0X2FsbCA9IG1hc2s7Ci0JCS8qIHBhc3MgbWFuYWdlbWVudCB1bmljYXN0IHBhY2tldHMgYXMgd2VsbCAqLwotCQlsbGhfbWFzayB8PSBOSUdfTExIMF9CUkIxX0RSVl9NQVNLX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfVU5DU1Q7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQk5YMlhfRVJSKCJCQUQgcnggbW9kZSAoJWQpXG4iLCBtb2RlKTsKLQkJYnJlYWs7Ci0JfQotCi0JUkVHX1dSKGJwLAotCSAgICAgICAocG9ydCA/IE5JR19SRUdfTExIMV9CUkIxX0RSVl9NQVNLIDogTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0spLAotCSAgICAgICBsbGhfbWFzayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fZXRoX21hY19maWx0ZXJfY29uZmlnKS80OyBpKyspIHsKLQkJUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkgICAgICAgVFNUT1JNX01BQ19GSUxURVJfQ09ORklHX09GRlNFVChmdW5jKSArIGkgKiA0LAotCQkgICAgICAgKCh1MzIgKikmdHN0b3JtX21hY19maWx0ZXIpW2ldKTsKLQotLyoJCURQKE5FVElGX01TR19JRlVQLCAidHN0b3JtX21hY19maWx0ZXJbJWRdOiAweCUwOHhcbiIsIGksCi0JCSAgICgodTMyICopJnRzdG9ybV9tYWNfZmlsdGVyKVtpXSk7ICovCi0JfQotCi0JaWYgKG1vZGUgIT0gQk5YMlhfUlhfTU9ERV9OT05FKQotCQlibngyeF9zZXRfY2xpZW50X2NvbmZpZyhicCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWxfY29tbW9uKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGk7Ci0KLQkvKiBaZXJvIHRoaXMgbWFudWFsbHkgYXMgaXRzIGluaXRpYWxpemF0aW9uIGlzCi0JICAgY3VycmVudGx5IG1pc3NpbmcgaW4gdGhlIGluaXRUb29sICovCi0JZm9yIChpID0gMDsgaSA8IChVU1RPUk1fQUdHX0RBVEFfU0laRSA+PiAyKTsgaSsrKQotCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCSAgICAgICBVU1RPUk1fQUdHX0RBVEFfT0ZGU0VUICsgaSAqIDQsIDApOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X2ludGVybmFsX3BvcnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCi0JUkVHX1dSKGJwLAotCSAgICAgICBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fSENfQlRSX1VfT0ZGU0VUKHBvcnQpLCBCTlgyWF9CVFIpOwotCVJFR19XUihicCwKLQkgICAgICAgQkFSX0NTVFJPUk1fSU5UTUVNICsgQ1NUT1JNX0hDX0JUUl9DX09GRlNFVChwb3J0KSwgQk5YMlhfQlRSKTsKLQlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArIFRTVE9STV9IQ19CVFJfT0ZGU0VUKHBvcnQpLCBCTlgyWF9CVFIpOwotCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX0hDX0JUUl9PRkZTRVQocG9ydCksIEJOWDJYX0JUUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWxfZnVuYyhzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCB0c3Rvcm1fZXRoX2Z1bmN0aW9uX2NvbW1vbl9jb25maWcgdHN0b3JtX2NvbmZpZyA9IHswfTsKLQlzdHJ1Y3Qgc3RhdHNfaW5kaWNhdGlvbl9mbGFncyBzdGF0c19mbGFncyA9IHswfTsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0JaW50IGksIGo7Ci0JdTMyIG9mZnNldDsKLQl1MTYgbWF4X2FnZ19zaXplOwotCi0JdHN0b3JtX2NvbmZpZy5jb25maWdfZmxhZ3MgPSBSU1NfRkxBR1MoYnApOwotCi0JaWYgKGlzX211bHRpKGJwKSkKLQkJdHN0b3JtX2NvbmZpZy5yc3NfcmVzdWx0X21hc2sgPSBNVUxUSV9NQVNLOwotCi0JLyogRW5hYmxlIFRQQSBpZiBuZWVkZWQgKi8KLQlpZiAoYnAtPmZsYWdzICYgVFBBX0VOQUJMRV9GTEFHKQotCQl0c3Rvcm1fY29uZmlnLmNvbmZpZ19mbGFncyB8PQotCQkJVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX0VOQUJMRV9UUEE7Ci0KLQlpZiAoSVNfRTFITUYoYnApKQotCQl0c3Rvcm1fY29uZmlnLmNvbmZpZ19mbGFncyB8PQotCQkJCVRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19FMUhPVl9JTl9DQU07Ci0KLQl0c3Rvcm1fY29uZmlnLmxlYWRpbmdfY2xpZW50X2lkID0gQlBfTF9JRChicCk7Ci0KLQlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFRTVE9STV9GVU5DVElPTl9DT01NT05fQ09ORklHX09GRlNFVChmdW5jKSwKLQkgICAgICAgKCoodTMyICopJnRzdG9ybV9jb25maWcpKTsKLQotCWJwLT5yeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9OT05FOyAvKiBubyByeCB1bnRpbCBsaW5rIGlzIHVwICovCi0JYnAtPnJ4X21vZGVfY2xfbWFzayA9ICgxIDw8IEJQX0xfSUQoYnApKTsKLQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQl1OCBjbF9pZCA9IGJwLT5mcFtpXS5jbF9pZDsKLQotCQkvKiByZXNldCB4c3Rvcm0gcGVyIGNsaWVudCBzdGF0aXN0aWNzICovCi0JCW9mZnNldCA9IEJBUl9YU1RST1JNX0lOVE1FTSArCi0JCQkgWFNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0LCBjbF9pZCk7Ci0JCWZvciAoaiA9IDA7Ci0JCSAgICAgaiA8IHNpemVvZihzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMpIC8gNDsgaisrKQotCQkJUkVHX1dSKGJwLCBvZmZzZXQgKyBqKjQsIDApOwotCi0JCS8qIHJlc2V0IHRzdG9ybSBwZXIgY2xpZW50IHN0YXRpc3RpY3MgKi8KLQkJb2Zmc2V0ID0gQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJCSBUU1RPUk1fUEVSX0NPVU5URVJfSURfU1RBVFNfT0ZGU0VUKHBvcnQsIGNsX2lkKTsKLQkJZm9yIChqID0gMDsKLQkJICAgICBqIDwgc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykgLyA0OyBqKyspCi0JCQlSRUdfV1IoYnAsIG9mZnNldCArIGoqNCwgMCk7Ci0KLQkJLyogcmVzZXQgdXN0b3JtIHBlciBjbGllbnQgc3RhdGlzdGljcyAqLwotCQlvZmZzZXQgPSBCQVJfVVNUUk9STV9JTlRNRU0gKwotCQkJIFVTVE9STV9QRVJfQ09VTlRFUl9JRF9TVEFUU19PRkZTRVQocG9ydCwgY2xfaWQpOwotCQlmb3IgKGogPSAwOwotCQkgICAgIGogPCBzaXplb2Yoc3RydWN0IHVzdG9ybV9wZXJfY2xpZW50X3N0YXRzKSAvIDQ7IGorKykKLQkJCVJFR19XUihicCwgb2Zmc2V0ICsgaio0LCAwKTsKLQl9Ci0KLQkvKiBJbml0IHN0YXRpc3RpY3MgcmVsYXRlZCBjb250ZXh0ICovCi0Jc3RhdHNfZmxhZ3MuY29sbGVjdF9ldGggPSAxOwotCi0JUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGZ1bmMpLAotCSAgICAgICAoKHUzMiAqKSZzdGF0c19mbGFncylbMF0pOwotCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChmdW5jKSArIDQsCi0JICAgICAgICgodTMyICopJnN0YXRzX2ZsYWdzKVsxXSk7Ci0KLQlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArIFRTVE9STV9TVEFUU19GTEFHU19PRkZTRVQoZnVuYyksCi0JICAgICAgICgodTMyICopJnN0YXRzX2ZsYWdzKVswXSk7Ci0JUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKyBUU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGZ1bmMpICsgNCwKLQkgICAgICAgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzFdKTsKLQotCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsgVVNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChmdW5jKSwKLQkgICAgICAgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzBdKTsKLQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArIFVTVE9STV9TVEFUU19GTEFHU19PRkZTRVQoZnVuYykgKyA0LAotCSAgICAgICAoKHUzMiAqKSZzdGF0c19mbGFncylbMV0pOwotCi0JUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGZ1bmMpLAotCSAgICAgICAoKHUzMiAqKSZzdGF0c19mbGFncylbMF0pOwotCVJFR19XUihicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsgQ1NUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChmdW5jKSArIDQsCi0JICAgICAgICgodTMyICopJnN0YXRzX2ZsYWdzKVsxXSk7Ci0KLQlSRUdfV1IoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFhTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQoZnVuYyksCi0JICAgICAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBmd19zdGF0cykpKTsKLQlSRUdfV1IoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFhTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQoZnVuYykgKyA0LAotCSAgICAgICBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgZndfc3RhdHMpKSk7Ci0KLQlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFRTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQoZnVuYyksCi0JICAgICAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBmd19zdGF0cykpKTsKLQlSRUdfV1IoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFRTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQoZnVuYykgKyA0LAotCSAgICAgICBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgZndfc3RhdHMpKSk7Ci0KLQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFVTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQoZnVuYyksCi0JICAgICAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBmd19zdGF0cykpKTsKLQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JICAgICAgIFVTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQoZnVuYykgKyA0LAotCSAgICAgICBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgZndfc3RhdHMpKSk7Ci0KLQlpZiAoQ0hJUF9JU19FMUgoYnApKSB7Ci0JCVJFR19XUjgoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIFhTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCwKLQkJCUlTX0UxSE1GKGJwKSk7Ci0JCVJFR19XUjgoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArIFRTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCwKLQkJCUlTX0UxSE1GKGJwKSk7Ci0JCVJFR19XUjgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArIENTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCwKLQkJCUlTX0UxSE1GKGJwKSk7Ci0JCVJFR19XUjgoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArIFVTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCwKLQkJCUlTX0UxSE1GKGJwKSk7Ci0KLQkJUkVHX1dSMTYoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIFhTVE9STV9FMUhPVl9PRkZTRVQoZnVuYyksCi0JCQkgYnAtPmUxaG92KTsKLQl9Ci0KLQkvKiBJbml0IENRIHJpbmcgbWFwcGluZyBhbmQgYWdncmVnYXRpb24gc2l6ZSwgdGhlIEZXIGxpbWl0IGlzIDggZnJhZ3MgKi8KLQltYXhfYWdnX3NpemUgPSBtaW5fdCh1MzIsIChtaW5fdCh1MzIsIDgsIE1BWF9TS0JfRlJBR1MpICoKLQkJCQkgICBTR0VfUEFHRV9TSVpFICogUEFHRVNfUEVSX1NHRSksIDB4ZmZmZik7Ci0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0KLQkJUkVHX1dSKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKwotCQkgICAgICAgVVNUT1JNX0NRRV9QQUdFX0JBU0VfT0ZGU0VUKHBvcnQsIGZwLT5jbF9pZCksCi0JCSAgICAgICBVNjRfTE8oZnAtPnJ4X2NvbXBfbWFwcGluZykpOwotCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCSAgICAgICBVU1RPUk1fQ1FFX1BBR0VfQkFTRV9PRkZTRVQocG9ydCwgZnAtPmNsX2lkKSArIDQsCi0JCSAgICAgICBVNjRfSEkoZnAtPnJ4X2NvbXBfbWFwcGluZykpOwotCi0JCS8qIE5leHQgcGFnZSAqLwotCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCSAgICAgICBVU1RPUk1fQ1FFX1BBR0VfTkVYVF9PRkZTRVQocG9ydCwgZnAtPmNsX2lkKSwKLQkJICAgICAgIFU2NF9MTyhmcC0+cnhfY29tcF9tYXBwaW5nICsgQkNNX1BBR0VfU0laRSkpOwotCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCSAgICAgICBVU1RPUk1fQ1FFX1BBR0VfTkVYVF9PRkZTRVQocG9ydCwgZnAtPmNsX2lkKSArIDQsCi0JCSAgICAgICBVNjRfSEkoZnAtPnJ4X2NvbXBfbWFwcGluZyArIEJDTV9QQUdFX1NJWkUpKTsKLQotCQlSRUdfV1IxNihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCSBVU1RPUk1fTUFYX0FHR19TSVpFX09GRlNFVChwb3J0LCBmcC0+Y2xfaWQpLAotCQkJIG1heF9hZ2dfc2l6ZSk7Ci0JfQotCi0JLyogZHJvcGxlc3MgZmxvdyBjb250cm9sICovCi0JaWYgKENISVBfSVNfRTFIKGJwKSkgewotCQlzdHJ1Y3QgdXN0b3JtX2V0aF9yeF9wYXVzZV9kYXRhX2UxaCByeF9wYXVzZSA9IHswfTsKLQotCQlyeF9wYXVzZS5iZF90aHJfbG93ID0gMjUwOwotCQlyeF9wYXVzZS5jcWVfdGhyX2xvdyA9IDI1MDsKLQkJcnhfcGF1c2UuY29zID0gMTsKLQkJcnhfcGF1c2Uuc2dlX3Rocl9sb3cgPSAwOwotCQlyeF9wYXVzZS5iZF90aHJfaGlnaCA9IDM1MDsKLQkJcnhfcGF1c2UuY3FlX3Rocl9oaWdoID0gMzUwOwotCQlyeF9wYXVzZS5zZ2VfdGhyX2hpZ2ggPSAwOwotCi0JCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQotCQkJaWYgKCFmcC0+ZGlzYWJsZV90cGEpIHsKLQkJCQlyeF9wYXVzZS5zZ2VfdGhyX2xvdyA9IDE1MDsKLQkJCQlyeF9wYXVzZS5zZ2VfdGhyX2hpZ2ggPSAyNTA7Ci0JCQl9Ci0KLQotCQkJb2Zmc2V0ID0gQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCQkgVVNUT1JNX0VUSF9SSU5HX1BBVVNFX0RBVEFfT0ZGU0VUKHBvcnQsCi0JCQkJCQkJCSAgIGZwLT5jbF9pZCk7Ci0JCQlmb3IgKGogPSAwOwotCQkJICAgICBqIDwgc2l6ZW9mKHN0cnVjdCB1c3Rvcm1fZXRoX3J4X3BhdXNlX2RhdGFfZTFoKS80OwotCQkJICAgICBqKyspCi0JCQkJUkVHX1dSKGJwLCBvZmZzZXQgKyBqKjQsCi0JCQkJICAgICAgICgodTMyICopJnJ4X3BhdXNlKVtqXSk7Ci0JCX0KLQl9Ci0KLQltZW1zZXQoJihicC0+Y21uZyksIDAsIHNpemVvZihzdHJ1Y3QgY21uZ19zdHJ1Y3RfcGVyX3BvcnQpKTsKLQotCS8qIEluaXQgcmF0ZSBzaGFwaW5nIGFuZCBmYWlybmVzcyBjb250ZXh0cyAqLwotCWlmIChJU19FMUhNRihicCkpIHsKLQkJaW50IHZuOwotCi0JCS8qIER1cmluZyBpbml0IHRoZXJlIGlzIG5vIGFjdGl2ZSBsaW5rCi0JCSAgIFVudGlsIGxpbmsgaXMgdXAsIHNldCBsaW5rIHJhdGUgdG8gMTBHYnBzICovCi0JCWJwLT5saW5rX3ZhcnMubGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOwotCQlibngyeF9pbml0X3BvcnRfbWlubWF4KGJwKTsKLQotCQlpZiAoIUJQX05PTUNQKGJwKSkKLQkJCWJwLT5tZl9jb25maWcgPQotCQkJICAgICAgU0hNRU1fUkQoYnAsIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5jb25maWcpOwotCQlibngyeF9jYWxjX3ZuX3dlaWdodF9zdW0oYnApOwotCi0JCWZvciAodm4gPSBWTl8wOyB2biA8IEUxSFZOX01BWDsgdm4rKykKLQkJCWJueDJ4X2luaXRfdm5fbWlubWF4KGJwLCAyKnZuICsgcG9ydCk7Ci0KLQkJLyogRW5hYmxlIHJhdGUgc2hhcGluZyBhbmQgZmFpcm5lc3MgKi8KLQkJYnAtPmNtbmcuZmxhZ3MuY21uZ19lbmFibGVzIHw9Ci0JCQkJCUNNTkdfRkxBR1NfUEVSX1BPUlRfUkFURV9TSEFQSU5HX1ZOOwotCi0JfSBlbHNlIHsKLQkJLyogcmF0ZSBzaGFwaW5nIGFuZCBmYWlybmVzcyBhcmUgZGlzYWJsZWQgKi8KLQkJRFAoTkVUSUZfTVNHX0lGVVAsCi0JCSAgICJzaW5nbGUgZnVuY3Rpb24gbW9kZSAgbWlubWF4IHdpbGwgYmUgZGlzYWJsZWRcbiIpOwotCX0KLQotCi0JLyogU3RvcmUgY21uZyBzdHJ1Y3R1cmVzIHRvIGludGVybmFsIG1lbW9yeSAqLwotCWlmIChicC0+cG9ydC5wbWYpCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGNtbmdfc3RydWN0X3Blcl9wb3J0KSAvIDQ7IGkrKykKLQkJCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJCSAgICAgICBYU1RPUk1fQ01OR19QRVJfUE9SVF9WQVJTX09GRlNFVChwb3J0KSArIGkgKiA0LAotCQkJICAgICAgICgodTMyICopKCZicC0+Y21uZykpW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaW5pdF9pbnRlcm5hbChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgbG9hZF9jb2RlKQotewotCXN3aXRjaCAobG9hZF9jb2RlKSB7Ci0JY2FzZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT046Ci0JCWJueDJ4X2luaXRfaW50ZXJuYWxfY29tbW9uKGJwKTsKLQkJLyogbm8gYnJlYWsgKi8KLQotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVDoKLQkJYm54MnhfaW5pdF9pbnRlcm5hbF9wb3J0KGJwKTsKLQkJLyogbm8gYnJlYWsgKi8KLQotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfRlVOQ1RJT046Ci0JCWJueDJ4X2luaXRfaW50ZXJuYWxfZnVuYyhicCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQk5YMlhfRVJSKCJVbmtub3duIGxvYWRfY29kZSAoMHgleCkgZnJvbSBNQ1BcbiIsIGxvYWRfY29kZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfbmljX2luaXQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGxvYWRfY29kZSkKLXsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOwotCi0JCWZwLT5icCA9IGJwOwotCQlmcC0+c3RhdGUgPSBCTlgyWF9GUF9TVEFURV9DTE9TRUQ7Ci0JCWZwLT5pbmRleCA9IGk7Ci0JCWZwLT5jbF9pZCA9IEJQX0xfSUQoYnApICsgaTsKLSNpZmRlZiBCQ01fQ05JQwotCQlmcC0+c2JfaWQgPSBmcC0+Y2xfaWQgKyAxOwotI2Vsc2UKLQkJZnAtPnNiX2lkID0gZnAtPmNsX2lkOwotI2VuZGlmCi0JCURQKE5FVElGX01TR19JRlVQLAotCQkgICAicXVldWVbJWRdOiAgYm54MnhfaW5pdF9zYiglcCwlcCkgIGNsX2lkICVkICBzYiAlZFxuIiwKLQkJICAgaSwgYnAsIGZwLT5zdGF0dXNfYmxrLCBmcC0+Y2xfaWQsIGZwLT5zYl9pZCk7Ci0JCWJueDJ4X2luaXRfc2IoYnAsIGZwLT5zdGF0dXNfYmxrLCBmcC0+c3RhdHVzX2Jsa19tYXBwaW5nLAotCQkJICAgICAgZnAtPnNiX2lkKTsKLQkJYm54MnhfdXBkYXRlX2Zwc2JfaWR4KGZwKTsKLQl9Ci0KLQkvKiBlbnN1cmUgc3RhdHVzIGJsb2NrIGluZGljZXMgd2VyZSByZWFkICovCi0Jcm1iKCk7Ci0KLQotCWJueDJ4X2luaXRfZGVmX3NiKGJwLCBicC0+ZGVmX3N0YXR1c19ibGssIGJwLT5kZWZfc3RhdHVzX2Jsa19tYXBwaW5nLAotCQkJICBERUZfU0JfSUQpOwotCWJueDJ4X3VwZGF0ZV9kc2JfaWR4KGJwKTsKLQlibngyeF91cGRhdGVfY29hbGVzY2UoYnApOwotCWJueDJ4X2luaXRfcnhfcmluZ3MoYnApOwotCWJueDJ4X2luaXRfdHhfcmluZyhicCk7Ci0JYm54MnhfaW5pdF9zcF9yaW5nKGJwKTsKLQlibngyeF9pbml0X2NvbnRleHQoYnApOwotCWJueDJ4X2luaXRfaW50ZXJuYWwoYnAsIGxvYWRfY29kZSk7Ci0JYm54MnhfaW5pdF9pbmRfdGFibGUoYnApOwotCWJueDJ4X3N0YXRzX2luaXQoYnApOwotCi0JLyogQXQgdGhpcyBwb2ludCwgd2UgYXJlIHJlYWR5IGZvciBpbnRlcnJ1cHRzICovCi0JYXRvbWljX3NldCgmYnAtPmludHJfc2VtLCAwKTsKLQotCS8qIGZsdXNoIGFsbCBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cyAqLwotCW1iKCk7Ci0JbW1pb3diKCk7Ci0KLQlibngyeF9pbnRfZW5hYmxlKGJwKTsKLQotCS8qIENoZWNrIGZvciBTUElPNSAqLwotCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQwKGJwLAotCQlSRUdfUkQoYnAsIE1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfMV9GVU5DXzAgKyBCUF9QT1JUKGJwKSo0KSAmCi0JCQkJICAgQUVVX0lOUFVUU19BVFROX0JJVFNfU1BJTzUpOwotfQotCi0vKiBlbmQgb2YgbmljIGluaXQgKi8KLQotLyoKLSAqIGd6aXAgc2VydmljZSBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgaW50IGJueDJ4X2d1bnppcF9pbml0KHN0cnVjdCBibngyeCAqYnApCi17Ci0JYnAtPmd1bnppcF9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIEZXX0JVRl9TSVpFLAotCQkJCQkgICAgJmJwLT5ndW56aXBfbWFwcGluZywgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJwLT5ndW56aXBfYnVmICA9PSBOVUxMKQotCQlnb3RvIGd1bnppcF9ub21lbTE7Ci0KLQlicC0+c3RybSA9IGttYWxsb2Moc2l6ZW9mKCpicC0+c3RybSksIEdGUF9LRVJORUwpOwotCWlmIChicC0+c3RybSAgPT0gTlVMTCkKLQkJZ290byBndW56aXBfbm9tZW0yOwotCi0JYnAtPnN0cm0tPndvcmtzcGFjZSA9IGttYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKLQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoYnAtPnN0cm0tPndvcmtzcGFjZSA9PSBOVUxMKQotCQlnb3RvIGd1bnppcF9ub21lbTM7Ci0KLQlyZXR1cm4gMDsKLQotZ3VuemlwX25vbWVtMzoKLQlrZnJlZShicC0+c3RybSk7Ci0JYnAtPnN0cm0gPSBOVUxMOwotCi1ndW56aXBfbm9tZW0yOgotCWRtYV9mcmVlX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBGV19CVUZfU0laRSwgYnAtPmd1bnppcF9idWYsCi0JCQkgIGJwLT5ndW56aXBfbWFwcGluZyk7Ci0JYnAtPmd1bnppcF9idWYgPSBOVUxMOwotCi1ndW56aXBfbm9tZW0xOgotCW5ldGRldl9lcnIoYnAtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgZm9yIgotCSAgICAgICAiIHVuLWNvbXByZXNzaW9uXG4iKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZ3VuemlwX2VuZChzdHJ1Y3QgYm54MnggKmJwKQotewotCWtmcmVlKGJwLT5zdHJtLT53b3Jrc3BhY2UpOwotCi0Ja2ZyZWUoYnAtPnN0cm0pOwotCWJwLT5zdHJtID0gTlVMTDsKLQotCWlmIChicC0+Z3VuemlwX2J1ZikgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgRldfQlVGX1NJWkUsIGJwLT5ndW56aXBfYnVmLAotCQkJCSAgYnAtPmd1bnppcF9tYXBwaW5nKTsKLQkJYnAtPmd1bnppcF9idWYgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCBibngyeF9ndW56aXAoc3RydWN0IGJueDJ4ICpicCwgY29uc3QgdTggKnpidWYsIGludCBsZW4pCi17Ci0JaW50IG4sIHJjOwotCi0JLyogY2hlY2sgZ3ppcCBoZWFkZXIgKi8KLQlpZiAoKHpidWZbMF0gIT0gMHgxZikgfHwgKHpidWZbMV0gIT0gMHg4YikgfHwgKHpidWZbMl0gIT0gWl9ERUZMQVRFRCkpIHsKLQkJQk5YMlhfRVJSKCJCYWQgZ3ppcCBoZWFkZXJcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQluID0gMTA7Ci0KLSNkZWZpbmUgRk5BTUUJCQkJMHg4Ci0KLQlpZiAoemJ1ZlszXSAmIEZOQU1FKQotCQl3aGlsZSAoKHpidWZbbisrXSAhPSAwKSAmJiAobiA8IGxlbikpOwotCi0JYnAtPnN0cm0tPm5leHRfaW4gPSAodHlwZW9mKGJwLT5zdHJtLT5uZXh0X2luKSl6YnVmICsgbjsKLQlicC0+c3RybS0+YXZhaWxfaW4gPSBsZW4gLSBuOwotCWJwLT5zdHJtLT5uZXh0X291dCA9IGJwLT5ndW56aXBfYnVmOwotCWJwLT5zdHJtLT5hdmFpbF9vdXQgPSBGV19CVUZfU0laRTsKLQotCXJjID0gemxpYl9pbmZsYXRlSW5pdDIoYnAtPnN0cm0sIC1NQVhfV0JJVFMpOwotCWlmIChyYyAhPSBaX09LKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHpsaWJfaW5mbGF0ZShicC0+c3RybSwgWl9GSU5JU0gpOwotCWlmICgocmMgIT0gWl9PSykgJiYgKHJjICE9IFpfU1RSRUFNX0VORCkpCi0JCW5ldGRldl9lcnIoYnAtPmRldiwgIkZpcm13YXJlIGRlY29tcHJlc3Npb24gZXJyb3I6ICVzXG4iLAotCQkJICAgYnAtPnN0cm0tPm1zZyk7Ci0KLQlicC0+Z3VuemlwX291dGxlbiA9IChGV19CVUZfU0laRSAtIGJwLT5zdHJtLT5hdmFpbF9vdXQpOwotCWlmIChicC0+Z3VuemlwX291dGxlbiAmIDB4MykKLQkJbmV0ZGV2X2VycihicC0+ZGV2LCAiRmlybXdhcmUgZGVjb21wcmVzc2lvbiBlcnJvcjoiCi0JCQkJICAgICIgZ3VuemlwX291dGxlbiAoJWQpIG5vdCBhbGlnbmVkXG4iLAotCQkJCWJwLT5ndW56aXBfb3V0bGVuKTsKLQlicC0+Z3VuemlwX291dGxlbiA+Pj0gMjsKLQotCXpsaWJfaW5mbGF0ZUVuZChicC0+c3RybSk7Ci0KLQlpZiAocmMgPT0gWl9TVFJFQU1fRU5EKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiByYzsKLX0KLQotLyogbmljIGxvYWQvdW5sb2FkICovCi0KLS8qCi0gKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCi0gKi8KLQotLyogc2VuZCBhIE5JRyBsb29wYmFjayBkZWJ1ZyBwYWNrZXQgKi8KLXN0YXRpYyB2b2lkIGJueDJ4X2xiX3Bja3Qoc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgd2Jfd3JpdGVbM107Ci0KLQkvKiBFdGhlcm5ldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyAqLwotCXdiX3dyaXRlWzBdID0gMHg1NTU1NTU1NTsKLQl3Yl93cml0ZVsxXSA9IDB4NTU1NTU1NTU7Ci0Jd2Jfd3JpdGVbMl0gPSAweDIwOwkJLyogU09QICovCi0JUkVHX1dSX0RNQUUoYnAsIE5JR19SRUdfREVCVUdfUEFDS0VUX0xCLCB3Yl93cml0ZSwgMyk7Ci0KLQkvKiBOT04tSVAgcHJvdG9jb2wgKi8KLQl3Yl93cml0ZVswXSA9IDB4MDkwMDAwMDA7Ci0Jd2Jfd3JpdGVbMV0gPSAweDU1NTU1NTU1OwotCXdiX3dyaXRlWzJdID0gMHgxMDsJCS8qIEVPUCwgZW9wX2J2YWxpZCA9IDAgKi8KLQlSRUdfV1JfRE1BRShicCwgTklHX1JFR19ERUJVR19QQUNLRVRfTEIsIHdiX3dyaXRlLCAzKTsKLX0KLQotLyogc29tZSBvZiB0aGUgaW50ZXJuYWwgbWVtb3JpZXMKLSAqIGFyZSBub3QgZGlyZWN0bHkgcmVhZGFibGUgZnJvbSB0aGUgZHJpdmVyCi0gKiB0byB0ZXN0IHRoZW0gd2Ugc2VuZCBkZWJ1ZyBwYWNrZXRzCi0gKi8KLXN0YXRpYyBpbnQgYm54MnhfaW50X21lbV90ZXN0KHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGZhY3RvcjsKLQlpbnQgY291bnQsIGk7Ci0JdTMyIHZhbCA9IDA7Ci0KLQlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkpCi0JCWZhY3RvciA9IDEyMDsKLQllbHNlIGlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkKLQkJZmFjdG9yID0gMjAwOwotCWVsc2UKLQkJZmFjdG9yID0gMTsKLQotCURQKE5FVElGX01TR19IVywgInN0YXJ0IHBhcnQxXG4iKTsKLQotCS8qIERpc2FibGUgaW5wdXRzIG9mIHBhcnNlciBuZWlnaGJvciBibG9ja3MgKi8KLQlSRUdfV1IoYnAsIFRTRE1fUkVHX0VOQUJMRV9JTjEsIDB4MCk7Ci0JUkVHX1dSKGJwLCBUQ01fUkVHX1BSU19JRkVOLCAweDApOwotCVJFR19XUihicCwgQ0ZDX1JFR19ERUJVRzAsIDB4MSk7Ci0JUkVHX1dSKGJwLCBOSUdfUkVHX1BSU19SRVFfSU5fRU4sIDB4MCk7Ci0KLQkvKiAgV3JpdGUgMCB0byBwYXJzZXIgY3JlZGl0cyBmb3IgQ0ZDIHNlYXJjaCByZXF1ZXN0ICovCi0JUkVHX1dSKGJwLCBQUlNfUkVHX0NGQ19TRUFSQ0hfSU5JVElBTF9DUkVESVQsIDB4MCk7Ci0KLQkvKiBzZW5kIEV0aGVybmV0IHBhY2tldCAqLwotCWJueDJ4X2xiX3Bja3QoYnApOwotCi0JLyogVE9ETyBkbyBpIHJlc2V0IE5JRyBzdGF0aXN0aWM/ICovCi0JLyogV2FpdCB1bnRpbCBOSUcgcmVnaXN0ZXIgc2hvd3MgMSBwYWNrZXQgb2Ygc2l6ZSAweDEwICovCi0JY291bnQgPSAxMDAwICogZmFjdG9yOwotCXdoaWxlIChjb3VudCkgewotCi0JCWJueDJ4X3JlYWRfZG1hZShicCwgTklHX1JFR19TVEFUMl9CUkJfT0NURVQsIDIpOwotCQl2YWwgPSAqYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOwotCQlpZiAodmFsID09IDB4MTApCi0JCQlicmVhazsKLQotCQltc2xlZXAoMTApOwotCQljb3VudC0tOwotCX0KLQlpZiAodmFsICE9IDB4MTApIHsKLQkJQk5YMlhfRVJSKCJOSUcgdGltZW91dCAgdmFsID0gMHgleFxuIiwgdmFsKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFdhaXQgdW50aWwgUFJTIHJlZ2lzdGVyIHNob3dzIDEgcGFja2V0ICovCi0JY291bnQgPSAxMDAwICogZmFjdG9yOwotCXdoaWxlIChjb3VudCkgewotCQl2YWwgPSBSRUdfUkQoYnAsIFBSU19SRUdfTlVNX09GX1BBQ0tFVFMpOwotCQlpZiAodmFsID09IDEpCi0JCQlicmVhazsKLQotCQltc2xlZXAoMTApOwotCQljb3VudC0tOwotCX0KLQlpZiAodmFsICE9IDB4MSkgewotCQlCTlgyWF9FUlIoIlBSUyB0aW1lb3V0IHZhbCA9IDB4JXhcbiIsIHZhbCk7Ci0JCXJldHVybiAtMjsKLQl9Ci0KLQkvKiBSZXNldCBhbmQgaW5pdCBCUkIsIFBSUyAqLwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIsIDB4MDMpOwotCW1zbGVlcCg1MCk7Ci0JUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9TRVQsIDB4MDMpOwotCW1zbGVlcCg1MCk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQlJCMV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQUlNfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0KLQlEUChORVRJRl9NU0dfSFcsICJwYXJ0MlxuIik7Ci0KLQkvKiBEaXNhYmxlIGlucHV0cyBvZiBwYXJzZXIgbmVpZ2hib3IgYmxvY2tzICovCi0JUkVHX1dSKGJwLCBUU0RNX1JFR19FTkFCTEVfSU4xLCAweDApOwotCVJFR19XUihicCwgVENNX1JFR19QUlNfSUZFTiwgMHgwKTsKLQlSRUdfV1IoYnAsIENGQ19SRUdfREVCVUcwLCAweDEpOwotCVJFR19XUihicCwgTklHX1JFR19QUlNfUkVRX0lOX0VOLCAweDApOwotCi0JLyogV3JpdGUgMCB0byBwYXJzZXIgY3JlZGl0cyBmb3IgQ0ZDIHNlYXJjaCByZXF1ZXN0ICovCi0JUkVHX1dSKGJwLCBQUlNfUkVHX0NGQ19TRUFSQ0hfSU5JVElBTF9DUkVESVQsIDB4MCk7Ci0KLQkvKiBzZW5kIDEwIEV0aGVybmV0IHBhY2tldHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQkJYm54MnhfbGJfcGNrdChicCk7Ci0KLQkvKiBXYWl0IHVudGlsIE5JRyByZWdpc3RlciBzaG93cyAxMCArIDEKLQkgICBwYWNrZXRzIG9mIHNpemUgMTEqMHgxMCA9IDB4YjAgKi8KLQljb3VudCA9IDEwMDAgKiBmYWN0b3I7Ci0Jd2hpbGUgKGNvdW50KSB7Ci0KLQkJYm54MnhfcmVhZF9kbWFlKGJwLCBOSUdfUkVHX1NUQVQyX0JSQl9PQ1RFVCwgMik7Ci0JCXZhbCA9ICpibngyeF9zcChicCwgd2JfZGF0YVswXSk7Ci0JCWlmICh2YWwgPT0gMHhiMCkKLQkJCWJyZWFrOwotCi0JCW1zbGVlcCgxMCk7Ci0JCWNvdW50LS07Ci0JfQotCWlmICh2YWwgIT0gMHhiMCkgewotCQlCTlgyWF9FUlIoIk5JRyB0aW1lb3V0ICB2YWwgPSAweCV4XG4iLCB2YWwpOwotCQlyZXR1cm4gLTM7Ci0JfQotCi0JLyogV2FpdCB1bnRpbCBQUlMgcmVnaXN0ZXIgc2hvd3MgMiBwYWNrZXRzICovCi0JdmFsID0gUkVHX1JEKGJwLCBQUlNfUkVHX05VTV9PRl9QQUNLRVRTKTsKLQlpZiAodmFsICE9IDIpCi0JCUJOWDJYX0VSUigiUFJTIHRpbWVvdXQgIHZhbCA9IDB4JXhcbiIsIHZhbCk7Ci0KLQkvKiBXcml0ZSAxIHRvIHBhcnNlciBjcmVkaXRzIGZvciBDRkMgc2VhcmNoIHJlcXVlc3QgKi8KLQlSRUdfV1IoYnAsIFBSU19SRUdfQ0ZDX1NFQVJDSF9JTklUSUFMX0NSRURJVCwgMHgxKTsKLQotCS8qIFdhaXQgdW50aWwgUFJTIHJlZ2lzdGVyIHNob3dzIDMgcGFja2V0cyAqLwotCW1zbGVlcCgxMCAqIGZhY3Rvcik7Ci0JLyogV2FpdCB1bnRpbCBOSUcgcmVnaXN0ZXIgc2hvd3MgMSBwYWNrZXQgb2Ygc2l6ZSAweDEwICovCi0JdmFsID0gUkVHX1JEKGJwLCBQUlNfUkVHX05VTV9PRl9QQUNLRVRTKTsKLQlpZiAodmFsICE9IDMpCi0JCUJOWDJYX0VSUigiUFJTIHRpbWVvdXQgIHZhbCA9IDB4JXhcbiIsIHZhbCk7Ci0KLQkvKiBjbGVhciBOSUcgRU9QIEZJRk8gKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykKLQkJUkVHX1JEKGJwLCBOSUdfUkVHX0lOR1JFU1NfRU9QX0xCX0ZJRk8pOwotCXZhbCA9IFJFR19SRChicCwgTklHX1JFR19JTkdSRVNTX0VPUF9MQl9FTVBUWSk7Ci0JaWYgKHZhbCAhPSAxKSB7Ci0JCUJOWDJYX0VSUigiY2xlYXIgb2YgTklHIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtNDsKLQl9Ci0KLQkvKiBSZXNldCBhbmQgaW5pdCBCUkIsIFBSUywgTklHICovCi0JUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9DTEVBUiwgMHgwMyk7Ci0JbXNsZWVwKDUwKTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1NFVCwgMHgwMyk7Ci0JbXNsZWVwKDUwKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBCUkIxX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBSU19CTE9DSywgQ09NTU9OX1NUQUdFKTsKLSNpZm5kZWYgQkNNX0NOSUMKLQkvKiBzZXQgTklDIG1vZGUgKi8KLQlSRUdfV1IoYnAsIFBSU19SRUdfTklDX01PREUsIDEpOwotI2VuZGlmCi0KLQkvKiBFbmFibGUgaW5wdXRzIG9mIHBhcnNlciBuZWlnaGJvciBibG9ja3MgKi8KLQlSRUdfV1IoYnAsIFRTRE1fUkVHX0VOQUJMRV9JTjEsIDB4N2ZmZmZmZmYpOwotCVJFR19XUihicCwgVENNX1JFR19QUlNfSUZFTiwgMHgxKTsKLQlSRUdfV1IoYnAsIENGQ19SRUdfREVCVUcwLCAweDApOwotCVJFR19XUihicCwgTklHX1JFR19QUlNfUkVRX0lOX0VOLCAweDEpOwotCi0JRFAoTkVUSUZfTVNHX0hXLCAiZG9uZVxuIik7Ci0KLQlyZXR1cm4gMDsgLyogT0sgKi8KLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2Jsb2Nrc19hdHRlbnRpb24oc3RydWN0IGJueDJ4ICpicCkKLXsKLQlSRUdfV1IoYnAsIFBYUF9SRUdfUFhQX0lOVF9NQVNLXzAsIDApOwotCVJFR19XUihicCwgUFhQX1JFR19QWFBfSU5UX01BU0tfMSwgMCk7Ci0JUkVHX1dSKGJwLCBET1JRX1JFR19ET1JRX0lOVF9NQVNLLCAwKTsKLQlSRUdfV1IoYnAsIENGQ19SRUdfQ0ZDX0lOVF9NQVNLLCAwKTsKLQlSRUdfV1IoYnAsIFFNX1JFR19RTV9JTlRfTUFTSywgMCk7Ci0JUkVHX1dSKGJwLCBUTV9SRUdfVE1fSU5UX01BU0ssIDApOwotCVJFR19XUihicCwgWFNETV9SRUdfWFNETV9JTlRfTUFTS18wLCAwKTsKLQlSRUdfV1IoYnAsIFhTRE1fUkVHX1hTRE1fSU5UX01BU0tfMSwgMCk7Ci0JUkVHX1dSKGJwLCBYQ01fUkVHX1hDTV9JTlRfTUFTSywgMCk7Ci0vKglSRUdfV1IoYnAsIFhTRU1fUkVHX1hTRU1fSU5UX01BU0tfMCwgMCk7ICovCi0vKglSRUdfV1IoYnAsIFhTRU1fUkVHX1hTRU1fSU5UX01BU0tfMSwgMCk7ICovCi0JUkVHX1dSKGJwLCBVU0RNX1JFR19VU0RNX0lOVF9NQVNLXzAsIDApOwotCVJFR19XUihicCwgVVNETV9SRUdfVVNETV9JTlRfTUFTS18xLCAwKTsKLQlSRUdfV1IoYnAsIFVDTV9SRUdfVUNNX0lOVF9NQVNLLCAwKTsKLS8qCVJFR19XUihicCwgVVNFTV9SRUdfVVNFTV9JTlRfTUFTS18wLCAwKTsgKi8KLS8qCVJFR19XUihicCwgVVNFTV9SRUdfVVNFTV9JTlRfTUFTS18xLCAwKTsgKi8KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfVVBCICsgUEJfUkVHX1BCX0lOVF9NQVNLLCAwKTsKLQlSRUdfV1IoYnAsIENTRE1fUkVHX0NTRE1fSU5UX01BU0tfMCwgMCk7Ci0JUkVHX1dSKGJwLCBDU0RNX1JFR19DU0RNX0lOVF9NQVNLXzEsIDApOwotCVJFR19XUihicCwgQ0NNX1JFR19DQ01fSU5UX01BU0ssIDApOwotLyoJUkVHX1dSKGJwLCBDU0VNX1JFR19DU0VNX0lOVF9NQVNLXzAsIDApOyAqLwotLyoJUkVHX1dSKGJwLCBDU0VNX1JFR19DU0VNX0lOVF9NQVNLXzEsIDApOyAqLwotCWlmIChDSElQX1JFVl9JU19GUEdBKGJwKSkKLQkJUkVHX1dSKGJwLCBQWFAyX1JFR19QWFAyX0lOVF9NQVNLXzAsIDB4NTgwMDAwKTsKLQllbHNlCi0JCVJFR19XUihicCwgUFhQMl9SRUdfUFhQMl9JTlRfTUFTS18wLCAweDQ4MDAwMCk7Ci0JUkVHX1dSKGJwLCBUU0RNX1JFR19UU0RNX0lOVF9NQVNLXzAsIDApOwotCVJFR19XUihicCwgVFNETV9SRUdfVFNETV9JTlRfTUFTS18xLCAwKTsKLQlSRUdfV1IoYnAsIFRDTV9SRUdfVENNX0lOVF9NQVNLLCAwKTsKLS8qCVJFR19XUihicCwgVFNFTV9SRUdfVFNFTV9JTlRfTUFTS18wLCAwKTsgKi8KLS8qCVJFR19XUihicCwgVFNFTV9SRUdfVFNFTV9JTlRfTUFTS18xLCAwKTsgKi8KLQlSRUdfV1IoYnAsIENEVV9SRUdfQ0RVX0lOVF9NQVNLLCAwKTsKLQlSRUdfV1IoYnAsIERNQUVfUkVHX0RNQUVfSU5UX01BU0ssIDApOwotLyoJUkVHX1dSKGJwLCBNSVNDX1JFR19NSVNDX0lOVF9NQVNLLCAwKTsgKi8KLQlSRUdfV1IoYnAsIFBCRl9SRUdfUEJGX0lOVF9NQVNLLCAwWDE4KTsJCS8qIGJpdCAzLDQgbWFza2VkICovCi19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCXUzMiBhZGRyOwotCXUzMiBtYXNrOwotfSBibngyeF9wYXJpdHlfbWFza1tdID0gewotCXtQWFBfUkVHX1BYUF9QUlRZX01BU0ssIDB4ZmZmZmZmZmZ9LAotCXtQWFAyX1JFR19QWFAyX1BSVFlfTUFTS18wLCAweGZmZmZmZmZmfSwKLQl7UFhQMl9SRUdfUFhQMl9QUlRZX01BU0tfMSwgMHhmZmZmZmZmZn0sCi0Je0hDX1JFR19IQ19QUlRZX01BU0ssIDB4ZmZmZmZmZmZ9LAotCXtNSVNDX1JFR19NSVNDX1BSVFlfTUFTSywgMHhmZmZmZmZmZn0sCi0Je1FNX1JFR19RTV9QUlRZX01BU0ssIDB4MH0sCi0Je0RPUlFfUkVHX0RPUlFfUFJUWV9NQVNLLCAweDB9LAotCXtHUkNCQVNFX1VQQiArIFBCX1JFR19QQl9QUlRZX01BU0ssIDB4MH0sCi0Je0dSQ0JBU0VfWFBCICsgUEJfUkVHX1BCX1BSVFlfTUFTSywgMHgwfSwKLQl7U1JDX1JFR19TUkNfUFJUWV9NQVNLLCAweDR9LCAvKiBiaXQgMiAqLwotCXtDRFVfUkVHX0NEVV9QUlRZX01BU0ssIDB4MH0sCi0Je0NGQ19SRUdfQ0ZDX1BSVFlfTUFTSywgMHgwfSwKLQl7REJHX1JFR19EQkdfUFJUWV9NQVNLLCAweDB9LAotCXtETUFFX1JFR19ETUFFX1BSVFlfTUFTSywgMHgwfSwKLQl7QlJCMV9SRUdfQlJCMV9QUlRZX01BU0ssIDB4MH0sCi0Je1BSU19SRUdfUFJTX1BSVFlfTUFTSywgKDE8PDYpfSwvKiBiaXQgNiAqLwotCXtUU0RNX1JFR19UU0RNX1BSVFlfTUFTSywgMHgxOH0sLyogYml0IDMsNCAqLwotCXtDU0RNX1JFR19DU0RNX1BSVFlfTUFTSywgMHg4fSwJLyogYml0IDMgKi8KLQl7VVNETV9SRUdfVVNETV9QUlRZX01BU0ssIDB4Mzh9LC8qIGJpdCAzLDQsNSAqLwotCXtYU0RNX1JFR19YU0RNX1BSVFlfTUFTSywgMHg4fSwJLyogYml0IDMgKi8KLQl7VFNFTV9SRUdfVFNFTV9QUlRZX01BU0tfMCwgMHgwfSwKLQl7VFNFTV9SRUdfVFNFTV9QUlRZX01BU0tfMSwgMHgwfSwKLQl7VVNFTV9SRUdfVVNFTV9QUlRZX01BU0tfMCwgMHgwfSwKLQl7VVNFTV9SRUdfVVNFTV9QUlRZX01BU0tfMSwgMHgwfSwKLQl7Q1NFTV9SRUdfQ1NFTV9QUlRZX01BU0tfMCwgMHgwfSwKLQl7Q1NFTV9SRUdfQ1NFTV9QUlRZX01BU0tfMSwgMHgwfSwKLQl7WFNFTV9SRUdfWFNFTV9QUlRZX01BU0tfMCwgMHgwfSwKLQl7WFNFTV9SRUdfWFNFTV9QUlRZX01BU0tfMSwgMHgwfQotfTsKLQotc3RhdGljIHZvaWQgZW5hYmxlX2Jsb2Nrc19wYXJpdHkoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaSwgbWFza19hcnJfbGVuID0KLQkJc2l6ZW9mKGJueDJ4X3Bhcml0eV9tYXNrKS8oc2l6ZW9mKGJueDJ4X3Bhcml0eV9tYXNrWzBdKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWFza19hcnJfbGVuOyBpKyspCi0JCVJFR19XUihicCwgYm54MnhfcGFyaXR5X21hc2tbaV0uYWRkciwKLQkJCWJueDJ4X3Bhcml0eV9tYXNrW2ldLm1hc2spOwotfQotCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X2NvbW1vbihzdHJ1Y3QgYm54MnggKmJwKQotewotCS8qIHJlc2V0X2NvbW1vbiAqLwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIsCi0JICAgICAgIDB4ZDNmZmZmN2YpOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsIDB4MTQwMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfcHhwKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTE2IGRldmN0bDsKLQlpbnQgcl9vcmRlciwgd19vcmRlcjsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJwLT5wZGV2LAotCQkJICAgICBicC0+cGNpZV9jYXAgKyBQQ0lfRVhQX0RFVkNUTCwgJmRldmN0bCk7Ci0JRFAoTkVUSUZfTVNHX0hXLCAicmVhZCAweCV4IGZyb20gZGV2Y3RsXG4iLCBkZXZjdGwpOwotCXdfb3JkZXIgPSAoKGRldmN0bCAmIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQpID4+IDUpOwotCWlmIChicC0+bXJycyA9PSAtMSkKLQkJcl9vcmRlciA9ICgoZGV2Y3RsICYgUENJX0VYUF9ERVZDVExfUkVBRFJRKSA+PiAxMik7Ci0JZWxzZSB7Ci0JCURQKE5FVElGX01TR19IVywgImZvcmNlIHJlYWQgb3JkZXIgdG8gJWRcbiIsIGJwLT5tcnJzKTsKLQkJcl9vcmRlciA9IGJwLT5tcnJzOwotCX0KLQotCWJueDJ4X2luaXRfcHhwX2FyYihicCwgcl9vcmRlciwgd19vcmRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldHVwX2Zhbl9mYWlsdXJlX2RldGVjdGlvbihzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpc19yZXF1aXJlZDsKLQl1MzIgdmFsOwotCWludCBwb3J0OwotCi0JaWYgKEJQX05PTUNQKGJwKSkKLQkJcmV0dXJuOwotCi0JaXNfcmVxdWlyZWQgPSAwOwotCXZhbCA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5zaGFyZWRfaHdfY29uZmlnLmNvbmZpZzIpICYKLQkgICAgICBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX01BU0s7Ci0KLQlpZiAodmFsID09IFNIQVJFRF9IV19DRkdfRkFOX0ZBSUxVUkVfRU5BQkxFRCkKLQkJaXNfcmVxdWlyZWQgPSAxOwotCi0JLyoKLQkgKiBUaGUgZmFuIGZhaWx1cmUgbWVjaGFuaXNtIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgUEhZIHR5cGUgc2luY2UKLQkgKiB0aGUgcG93ZXIgY29uc3VtcHRpb24gb2YgdGhlIGJvYXJkIGlzIGFmZmVjdGVkIGJ5IHRoZSBQSFkuIEN1cnJlbnRseSwKLQkgKiBmYW4gaXMgcmVxdWlyZWQgZm9yIG1vc3QgZGVzaWducyB3aXRoIFNGWDcxMDEsIEJDTTg3MjcgYW5kIEJDTTg0ODEuCi0JICovCi0JZWxzZSBpZiAodmFsID09IFNIQVJFRF9IV19DRkdfRkFOX0ZBSUxVUkVfUEhZX1RZUEUpCi0JCWZvciAocG9ydCA9IFBPUlRfMDsgcG9ydCA8IFBPUlRfTUFYOyBwb3J0KyspIHsKLQkJCXUzMiBwaHlfdHlwZSA9Ci0JCQkJU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLgotCQkJCQkgZXh0ZXJuYWxfcGh5X2NvbmZpZykgJgotCQkJCVBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX01BU0s7Ci0JCQlpc19yZXF1aXJlZCB8PQotCQkJCSgocGh5X3R5cGUgPT0KLQkJCQkgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDEpIHx8Ci0JCQkJIChwaHlfdHlwZSA9PQotCQkJCSAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNykgfHwKLQkJCQkgKHBoeV90eXBlID09Ci0JCQkJICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgxKSk7Ci0JCX0KLQotCURQKE5FVElGX01TR19IVywgImZhbiBkZXRlY3Rpb24gc2V0dGluZzogJWRcbiIsIGlzX3JlcXVpcmVkKTsKLQotCWlmIChpc19yZXF1aXJlZCA9PSAwKQotCQlyZXR1cm47Ci0KLQkvKiBGYW4gZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnkgU1BJTyA1ICovCi0JYm54Mnhfc2V0X3NwaW8oYnAsIE1JU0NfUkVHSVNURVJTX1NQSU9fNSwKLQkJICAgICAgIE1JU0NfUkVHSVNURVJTX1NQSU9fSU5QVVRfSElfWik7Ci0KLQkvKiBzZXQgdG8gYWN0aXZlIGxvdyBtb2RlICovCi0JdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19TUElPX0lOVCk7Ci0JdmFsIHw9ICgoMSA8PCBNSVNDX1JFR0lTVEVSU19TUElPXzUpIDw8Ci0JCQkJCU1JU0NfUkVHSVNURVJTX1NQSU9fSU5UX09MRF9TRVRfUE9TKTsKLQlSRUdfV1IoYnAsIE1JU0NfUkVHX1NQSU9fSU5ULCB2YWwpOwotCi0JLyogZW5hYmxlIGludGVycnVwdCB0byBzaWduYWwgdGhlIElHVSAqLwotCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfU1BJT19FVkVOVF9FTik7Ci0JdmFsIHw9ICgxIDw8IE1JU0NfUkVHSVNURVJTX1NQSU9fNSk7Ci0JUkVHX1dSKGJwLCBNSVNDX1JFR19TUElPX0VWRU5UX0VOLCB2YWwpOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2luaXRfY29tbW9uKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbCwgaTsKLSNpZmRlZiBCQ01fQ05JQwotCXUzMiB3Yl93cml0ZVsyXTsKLSNlbmRpZgotCi0JRFAoQk5YMlhfTVNHX01DUCwgInN0YXJ0aW5nIGNvbW1vbiBpbml0ICBmdW5jICVkXG4iLCBCUF9GVU5DKGJwKSk7Ci0KLQlibngyeF9yZXNldF9jb21tb24oYnApOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULCAweGZmZmZmZmZmKTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1NFVCwgMHhmZmZjKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JaWYgKENISVBfSVNfRTFIKGJwKSkKLQkJUkVHX1dSKGJwLCBNSVNDX1JFR19FMUhNRl9NT0RFLCBJU19FMUhNRihicCkpOwotCi0JUkVHX1dSKGJwLCBNSVNDX1JFR19MQ1BMTF9DVFJMX1JFR18yLCAweDEwMCk7Ci0JbXNsZWVwKDMwKTsKLQlSRUdfV1IoYnAsIE1JU0NfUkVHX0xDUExMX0NUUkxfUkVHXzIsIDB4MCk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFBfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JaWYgKENISVBfSVNfRTEoYnApKSB7Ci0JCS8qIGVuYWJsZSBIVyBpbnRlcnJ1cHQgZnJvbSBQWFAgb24gVVNETSBvdmVyZmxvdwotCQkgICBiaXQgMTYgb24gSU5UX01BU0tfMCAqLwotCQlSRUdfV1IoYnAsIFBYUF9SRUdfUFhQX0lOVF9NQVNLXzAsIDApOwotCX0KLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBYUDJfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9weHAoYnApOwotCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0JUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9RTV9FTkRJQU5fTSwgMSk7Ci0JUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9UTV9FTkRJQU5fTSwgMSk7Ci0JUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9TUkNfRU5ESUFOX00sIDEpOwotCVJFR19XUihicCwgUFhQMl9SRUdfUlFfQ0RVX0VORElBTl9NLCAxKTsKLQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0RCR19FTkRJQU5fTSwgMSk7Ci0JLyogbWFrZSBzdXJlIHRoaXMgdmFsdWUgaXMgMCAqLwotCVJFR19XUihicCwgUFhQMl9SRUdfUlFfSENfRU5ESUFOX00sIDApOwotCi0vKglSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX1BCRl9TV0FQX01PREUsIDEpOyAqLwotCVJFR19XUihicCwgUFhQMl9SRUdfUkRfUU1fU1dBUF9NT0RFLCAxKTsKLQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX1RNX1NXQVBfTU9ERSwgMSk7Ci0JUkVHX1dSKGJwLCBQWFAyX1JFR19SRF9TUkNfU1dBUF9NT0RFLCAxKTsKLQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX0NEVVJEX1NXQVBfTU9ERSwgMSk7Ci0jZW5kaWYKLQotCVJFR19XUihicCwgUFhQMl9SRUdfUlFfQ0RVX1BfU0laRSwgMik7Ci0jaWZkZWYgQkNNX0NOSUMKLQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1RNX1BfU0laRSwgNSk7Ci0JUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9RTV9QX1NJWkUsIDUpOwotCVJFR19XUihicCwgUFhQMl9SRUdfUlFfU1JDX1BfU0laRSwgNSk7Ci0jZW5kaWYKLQotCWlmIChDSElQX1JFVl9JU19GUEdBKGJwKSAmJiBDSElQX0lTX0UxSChicCkpCi0JCVJFR19XUihicCwgUFhQMl9SRUdfUEdMX1RBR1NfTElNSVQsIDB4MSk7Ci0KLQkvKiBsZXQgdGhlIEhXIGRvIGl0J3MgbWFnaWMgLi4uICovCi0JbXNsZWVwKDEwMCk7Ci0JLyogZmluaXNoIFBYUCBpbml0ICovCi0JdmFsID0gUkVHX1JEKGJwLCBQWFAyX1JFR19SUV9DRkdfRE9ORSk7Ci0JaWYgKHZhbCAhPSAxKSB7Ci0JCUJOWDJYX0VSUigiUFhQMiBDRkcgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JdmFsID0gUkVHX1JEKGJwLCBQWFAyX1JFR19SRF9JTklUX0RPTkUpOwotCWlmICh2YWwgIT0gMSkgewotCQlCTlgyWF9FUlIoIlBYUDIgUkRfSU5JVCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCVJFR19XUihicCwgUFhQMl9SRUdfUlFfRElTQUJMRV9JTlBVVFMsIDApOwotCVJFR19XUihicCwgUFhQMl9SRUdfUkRfRElTQUJMRV9JTlBVVFMsIDApOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgRE1BRV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQotCS8qIGNsZWFuIHRoZSBETUFFIG1lbW9yeSAqLwotCWJwLT5kbWFlX3JlYWR5ID0gMTsKLQlibngyeF9pbml0X2ZpbGwoYnAsIFRTRU1fUkVHX1BSQU0sIDAsIDgpOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVENNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFVDTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDQ01fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgWENNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCi0JYm54MnhfcmVhZF9kbWFlKGJwLCBYU0VNX1JFR19QQVNTSVZFX0JVRkZFUiwgMyk7Ci0JYm54MnhfcmVhZF9kbWFlKGJwLCBDU0VNX1JFR19QQVNTSVZFX0JVRkZFUiwgMyk7Ci0JYm54MnhfcmVhZF9kbWFlKGJwLCBUU0VNX1JFR19QQVNTSVZFX0JVRkZFUiwgMyk7Ci0JYm54MnhfcmVhZF9kbWFlKGJwLCBVU0VNX1JFR19QQVNTSVZFX0JVRkZFUiwgMyk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBRTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQotI2lmZGVmIEJDTV9DTklDCi0Jd2Jfd3JpdGVbMF0gPSAwOwotCXdiX3dyaXRlWzFdID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlSRUdfV1IoYnAsIFFNX1JFR19CQVNFQUREUiArIGkqNCwgMTAyNCAqIDQgKiAoaSUxNikpOwotCQlibngyeF9pbml0X2luZF93cihicCwgUU1fUkVHX1BUUlRCTCArIGkqOCwgd2Jfd3JpdGUsIDIpOwotCi0JCWlmIChDSElQX0lTX0UxSChicCkpIHsKLQkJCVJFR19XUihicCwgUU1fUkVHX0JBU0VBRERSX0VYVF9BICsgaSo0LCAxMDI0KjQqKGklMTYpKTsKLQkJCWJueDJ4X2luaXRfaW5kX3dyKGJwLCBRTV9SRUdfUFRSVEJMX0VYVF9BICsgaSo4LAotCQkJCQkgIHdiX3dyaXRlLCAyKTsKLQkJfQotCX0KLSNlbmRpZgotCS8qIHNvZnQgcmVzZXQgcHVsc2UgKi8KLQlSRUdfV1IoYnAsIFFNX1JFR19TT0ZUX1JFU0VULCAxKTsKLQlSRUdfV1IoYnAsIFFNX1JFR19TT0ZUX1JFU0VULCAwKTsKLQotI2lmZGVmIEJDTV9DTklDCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVElNRVJTX0JMT0NLLCBDT01NT05fU1RBR0UpOwotI2VuZGlmCi0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEUV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlSRUdfV1IoYnAsIERPUlFfUkVHX0RQTV9DSURfT0ZTVCwgQkNNX1BBR0VfU0hJRlQpOwotCWlmICghQ0hJUF9SRVZfSVNfU0xPVyhicCkpIHsKLQkJLyogZW5hYmxlIGh3IGludGVycnVwdCBmcm9tIGRvb3JiZWxsIFEgKi8KLQkJUkVHX1dSKGJwLCBET1JRX1JFR19ET1JRX0lOVF9NQVNLLCAwKTsKLQl9Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBCUkIxX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBSU19CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlSRUdfV1IoYnAsIFBSU19SRUdfQV9QUlNVXzIwLCAweGYpOwotI2lmbmRlZiBCQ01fQ05JQwotCS8qIHNldCBOSUMgbW9kZSAqLwotCVJFR19XUihicCwgUFJTX1JFR19OSUNfTU9ERSwgMSk7Ci0jZW5kaWYKLQlpZiAoQ0hJUF9JU19FMUgoYnApKQotCQlSRUdfV1IoYnAsIFBSU19SRUdfRTFIT1ZfTU9ERSwgSVNfRTFITUYoYnApKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRE1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ1NETV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVU0RNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRE1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0KLQlibngyeF9pbml0X2ZpbGwoYnAsIFRTRU1fUkVHX0ZBU1RfTUVNT1JZLCAwLCBTVE9STV9JTlRNRU1fU0laRShicCkpOwotCWJueDJ4X2luaXRfZmlsbChicCwgVVNFTV9SRUdfRkFTVF9NRU1PUlksIDAsIFNUT1JNX0lOVE1FTV9TSVpFKGJwKSk7Ci0JYm54MnhfaW5pdF9maWxsKGJwLCBDU0VNX1JFR19GQVNUX01FTU9SWSwgMCwgU1RPUk1fSU5UTUVNX1NJWkUoYnApKTsKLQlibngyeF9pbml0X2ZpbGwoYnAsIFhTRU1fUkVHX0ZBU1RfTUVNT1JZLCAwLCBTVE9STV9JTlRNRU1fU0laRShicCkpOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVFNFTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVU0VNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRU1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgWFNFTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQotCS8qIHN5bmMgc2VtaSBydGMgKi8KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLAotCSAgICAgICAweDgwMDAwMDAwKTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1NFVCwKLQkgICAgICAgMHg4MDAwMDAwMCk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVUEJfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgWFBCX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBCRl9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQotCVJFR19XUihicCwgU1JDX1JFR19TT0ZUX1JTVCwgMSk7Ci0JZm9yIChpID0gU1JDX1JFR19LRVlSU1MwXzA7IGkgPD0gU1JDX1JFR19LRVlSU1MxXzk7IGkgKz0gNCkKLQkJUkVHX1dSKGJwLCBpLCByYW5kb20zMigpKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBTUkNIX0JMT0NLLCBDT01NT05fU1RBR0UpOwotI2lmZGVmIEJDTV9DTklDCi0JUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF8wLCAweDYzMjg1NjcyKTsKLQlSRUdfV1IoYnAsIFNSQ19SRUdfS0VZU0VBUkNIXzEsIDB4MjRiOGYyY2MpOwotCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfMiwgMHgyMjNhZWY5Yik7Ci0JUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF8zLCAweDI2MDAxZTNhKTsKLQlSRUdfV1IoYnAsIFNSQ19SRUdfS0VZU0VBUkNIXzQsIDB4N2FlOTExMTYpOwotCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfNSwgMHg1Y2U1MjMwYik7Ci0JUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF82LCAweDI5OGQ4YWRmKTsKLQlSRUdfV1IoYnAsIFNSQ19SRUdfS0VZU0VBUkNIXzcsIDB4NmViMGZmMDkpOwotCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfOCwgMHgxODMwZjgyZik7Ci0JUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF85LCAweDAxZTQ2YmU3KTsKLSNlbmRpZgotCVJFR19XUihicCwgU1JDX1JFR19TT0ZUX1JTVCwgMCk7Ci0KLQlpZiAoc2l6ZW9mKHVuaW9uIGNkdV9jb250ZXh0KSAhPSAxMDI0KQotCQkvKiB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgYSBjb250ZXh0IGlzIDEwMjQgYnl0ZXMgKi8KLQkJZGV2X2FsZXJ0KCZicC0+cGRldi0+ZGV2LCAicGxlYXNlIGFkanVzdCB0aGUgc2l6ZSAiCi0JCQkJCSAgIm9mIGNkdV9jb250ZXh0KCVsZClcbiIsCi0JCQkgKGxvbmcpc2l6ZW9mKHVuaW9uIGNkdV9jb250ZXh0KSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDRFVfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JdmFsID0gKDQgPDwgMjQpICsgKDAgPDwgMTIpICsgMTAyNDsKLQlSRUdfV1IoYnAsIENEVV9SRUdfQ0RVX0dMT0JBTF9QQVJBTVMsIHZhbCk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDRkNfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JUkVHX1dSKGJwLCBDRkNfUkVHX0lOSVRfUkVHLCAweDdGRik7Ci0JLyogZW5hYmxlIGNvbnRleHQgdmFsaWRhdGlvbiBpbnRlcnJ1cHQgZnJvbSBDRkMgKi8KLQlSRUdfV1IoYnAsIENGQ19SRUdfQ0ZDX0lOVF9NQVNLLCAwKTsKLQotCS8qIHNldCB0aGUgdGhyZXNob2xkcyB0byBwcmV2ZW50IENGQy9DRFUgcmFjZSAqLwotCVJFR19XUihicCwgQ0ZDX1JFR19ERUJVRzAsIDB4MjAwMjAwMDApOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgSENfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgTUlTQ19BRVVfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFBDU19CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQkvKiBSZXNldCBQQ0lFIGVycm9ycyBmb3IgZGVidWcgKi8KLQlSRUdfV1IoYnAsIDB4MjgxNCwgMHhmZmZmZmZmZik7Ci0JUkVHX1dSKGJwLCAweDM4MjAsIDB4ZmZmZmZmZmYpOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgRU1BQzBfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgRU1BQzFfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgREJVX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERCR19CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIE5JR19CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlpZiAoQ0hJUF9JU19FMUgoYnApKSB7Ci0JCVJFR19XUihicCwgTklHX1JFR19MTEhfTUZfTU9ERSwgSVNfRTFITUYoYnApKTsKLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSF9FMUhPVl9NT0RFLCBJU19FMUhNRihicCkpOwotCX0KLQotCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJbXNsZWVwKDIwMCk7Ci0KLQkvKiBmaW5pc2ggQ0ZDIGluaXQgKi8KLQl2YWwgPSByZWdfcG9sbChicCwgQ0ZDX1JFR19MTF9JTklUX0RPTkUsIDEsIDEwMCwgMTApOwotCWlmICh2YWwgIT0gMSkgewotCQlCTlgyWF9FUlIoIkNGQyBMTF9JTklUIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCXZhbCA9IHJlZ19wb2xsKGJwLCBDRkNfUkVHX0FDX0lOSVRfRE9ORSwgMSwgMTAwLCAxMCk7Ci0JaWYgKHZhbCAhPSAxKSB7Ci0JCUJOWDJYX0VSUigiQ0ZDIEFDX0lOSVQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JdmFsID0gcmVnX3BvbGwoYnAsIENGQ19SRUdfQ0FNX0lOSVRfRE9ORSwgMSwgMTAwLCAxMCk7Ci0JaWYgKHZhbCAhPSAxKSB7Ci0JCUJOWDJYX0VSUigiQ0ZDIENBTV9JTklUIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCVJFR19XUihicCwgQ0ZDX1JFR19ERUJVRzAsIDApOwotCi0JLyogcmVhZCBOSUcgc3RhdGlzdGljCi0JICAgdG8gc2VlIGlmIHRoaXMgaXMgb3VyIGZpcnN0IHVwIHNpbmNlIHBvd2VydXAgKi8KLQlibngyeF9yZWFkX2RtYWUoYnAsIE5JR19SRUdfU1RBVDJfQlJCX09DVEVULCAyKTsKLQl2YWwgPSAqYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOwotCi0JLyogZG8gaW50ZXJuYWwgbWVtb3J5IHNlbGYgdGVzdCAqLwotCWlmICgoQ0hJUF9JU19FMShicCkpICYmICh2YWwgPT0gMCkgJiYgYm54MnhfaW50X21lbV90ZXN0KGJwKSkgewotCQlCTlgyWF9FUlIoImludGVybmFsIG1lbSBzZWxmIHRlc3QgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlzd2l0Y2ggKFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZykpIHsKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6Ci0JY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczOgotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6Ci0JCWJwLT5wb3J0Lm5lZWRfaHdfbG9jayA9IDE7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JYm54Mnhfc2V0dXBfZmFuX2ZhaWx1cmVfZGV0ZWN0aW9uKGJwKTsKLQotCS8qIGNsZWFyIFBYUDIgYXR0ZW50aW9ucyAqLwotCVJFR19SRChicCwgUFhQMl9SRUdfUFhQMl9JTlRfU1RTX0NMUl8wKTsKLQotCWVuYWJsZV9ibG9ja3NfYXR0ZW50aW9uKGJwKTsKLQlpZiAoQ0hJUF9QQVJJVFlfU1VQUE9SVEVEKGJwKSkKLQkJZW5hYmxlX2Jsb2Nrc19wYXJpdHkoYnApOwotCi0JaWYgKCFCUF9OT01DUChicCkpIHsKLQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7Ci0JCWJueDJ4X2NvbW1vbl9pbml0X3BoeShicCwgYnAtPmNvbW1vbi5zaG1lbV9iYXNlKTsKLQkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7Ci0JfSBlbHNlCi0JCUJOWDJYX0VSUigiQm9vdGNvZGUgaXMgbWlzc2luZyAtIGNhbiBub3QgaW5pdGlhbGl6ZSBsaW5rXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2luaXRfcG9ydChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGluaXRfc3RhZ2UgPSBwb3J0ID8gUE9SVDFfU1RBR0UgOiBQT1JUMF9TVEFHRTsKLQl1MzIgbG93LCBoaWdoOwotCXUzMiB2YWw7Ci0KLQlEUChCTlgyWF9NU0dfTUNQLCAic3RhcnRpbmcgcG9ydCBpbml0ICBwb3J0ICVkXG4iLCBwb3J0KTsKLQotCVJFR19XUihicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwgMCk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFBfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBYUDJfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVENNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVQ01fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIENDTV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgWENNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQotI2lmZGVmIEJDTV9DTklDCi0JUkVHX1dSKGJwLCBRTV9SRUdfQ09OTk5VTV8wICsgcG9ydCo0LCAxMDI0LzE2IC0gMSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBUSU1FUlNfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCVJFR19XUihicCwgVE1fUkVHX0xJTjBfU0NBTl9USU1FICsgcG9ydCo0LCAyMCk7Ci0JUkVHX1dSKGJwLCBUTV9SRUdfTElOMF9NQVhfQUNUSVZFX0NJRCArIHBvcnQqNCwgMzEpOwotI2VuZGlmCi0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEUV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBCUkIxX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkgJiYgIUNISVBfSVNfRTFIKGJwKSkgewotCQkvKiBubyBwYXVzZSBmb3IgZW11bGF0aW9uIGFuZCBGUEdBICovCi0JCWxvdyA9IDA7Ci0JCWhpZ2ggPSA1MTM7Ci0JfSBlbHNlIHsKLQkJaWYgKElTX0UxSE1GKGJwKSkKLQkJCWxvdyA9ICgoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykgPyAxNjAgOiAyNDYpOwotCQllbHNlIGlmIChicC0+ZGV2LT5tdHUgPiA0MDk2KSB7Ci0JCQlpZiAoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykKLQkJCQlsb3cgPSAxNjA7Ci0JCQllbHNlIHsKLQkJCQl2YWwgPSBicC0+ZGV2LT5tdHU7Ci0JCQkJLyogKDI0KjEwMjQgKyB2YWwqNCkvMjU2ICovCi0JCQkJbG93ID0gOTYgKyAodmFsLzY0KSArICgodmFsICUgNjQpID8gMSA6IDApOwotCQkJfQotCQl9IGVsc2UKLQkJCWxvdyA9ICgoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykgPyA4MCA6IDE2MCk7Ci0JCWhpZ2ggPSBsb3cgKyA1NjsJLyogMTQqMTAyNC8yNTYgKi8KLQl9Ci0JUkVHX1dSKGJwLCBCUkIxX1JFR19QQVVTRV9MT1dfVEhSRVNIT0xEXzAgKyBwb3J0KjQsIGxvdyk7Ci0JUkVHX1dSKGJwLCBCUkIxX1JFR19QQVVTRV9ISUdIX1RIUkVTSE9MRF8wICsgcG9ydCo0LCBoaWdoKTsKLQotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUFJTX0JMT0NLLCBpbml0X3N0YWdlKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRE1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRE1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFVTRE1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRE1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVFNFTV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgVVNFTV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ1NFTV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgWFNFTV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVUEJfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhQQl9CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQQkZfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCi0JLyogY29uZmlndXJlIFBCRiB0byB3b3JrIHdpdGhvdXQgUEFVU0UgbXR1IDkwMDAgKi8KLQlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfUEFVU0VfRU5BQkxFICsgcG9ydCo0LCAwKTsKLQotCS8qIHVwZGF0ZSB0aHJlc2hvbGQgKi8KLQlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfQVJCX1RIUlNIICsgcG9ydCo0LCAoOTA0MC8xNikpOwotCS8qIHVwZGF0ZSBpbml0IGNyZWRpdCAqLwotCVJFR19XUihicCwgUEJGX1JFR19QMF9JTklUX0NSRCArIHBvcnQqNCwgKDkwNDAvMTYpICsgNTUzIC0gMjIpOwotCi0JLyogcHJvYmUgY2hhbmdlcyAqLwotCVJFR19XUihicCwgUEJGX1JFR19JTklUX1AwICsgcG9ydCo0LCAxKTsKLQltc2xlZXAoNSk7Ci0JUkVHX1dSKGJwLCBQQkZfUkVHX0lOSVRfUDAgKyBwb3J0KjQsIDApOwotCi0jaWZkZWYgQkNNX0NOSUMKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBTUkNIX0JMT0NLLCBpbml0X3N0YWdlKTsKLSNlbmRpZgotCWJueDJ4X2luaXRfYmxvY2soYnAsIENEVV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ0ZDX0JMT0NLLCBpbml0X3N0YWdlKTsKLQotCWlmIChDSElQX0lTX0UxKGJwKSkgewotCQlSRUdfV1IoYnAsIEhDX1JFR19MRUFESU5HX0VER0VfMCArIHBvcnQqOCwgMCk7Ci0JCVJFR19XUihicCwgSENfUkVHX1RSQUlMSU5HX0VER0VfMCArIHBvcnQqOCwgMCk7Ci0JfQotCWJueDJ4X2luaXRfYmxvY2soYnAsIEhDX0JMT0NLLCBpbml0X3N0YWdlKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQUVVX0JMT0NLLCBpbml0X3N0YWdlKTsKLQkvKiBpbml0IGFldV9tYXNrX2F0dG5fZnVuY18wLzE6Ci0JICogIC0gU0YgbW9kZTogYml0cyAzLTcgYXJlIG1hc2tlZC4gb25seSBiaXRzIDAtMiBhcmUgaW4gdXNlCi0JICogIC0gTUYgbW9kZTogYml0IDMgaXMgbWFza2VkLiBiaXRzIDAtMiBhcmUgaW4gdXNlIGFzIGluIFNGCi0JICogICAgICAgICAgICAgYml0cyA0LTcgYXJlIHVzZWQgZm9yICJwZXIgdm4gZ3JvdXAgYXR0ZW50aW9uIiAqLwotCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzAgKyBwb3J0KjQsCi0JICAgICAgIChJU19FMUhNRihicCkgPyAweEY3IDogMHg3KSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFBDU19CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgRU1BQzBfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMxX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEQlVfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERCR19CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBOSUdfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCi0JUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArIHBvcnQqNCwgMSk7Ci0KLQlpZiAoQ0hJUF9JU19FMUgoYnApKSB7Ci0JCS8qIDB4MiBkaXNhYmxlIGUxaG92LCAweDEgZW5hYmxlICovCi0JCVJFR19XUihicCwgTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfTUYgKyBwb3J0KjQsCi0JCSAgICAgICAoSVNfRTFITUYoYnApID8gMHgxIDogMHgyKSk7Ci0KLQkJewotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMRkNfRU5BQkxFXzAgKyBwb3J0KjQsIDApOwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMRkNfT1VUX0VOXzAgKyBwb3J0KjQsIDApOwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX1BBVVNFX0VOQUJMRV8wICsgcG9ydCo0LCAxKTsKLQkJfQotCX0KLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1DUF9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgRE1BRV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlzd2l0Y2ggKFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZykpIHsKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6Ci0JCXsKLQkJdTMyIHN3YXBfdmFsLCBzd2FwX292ZXJyaWRlLCBhZXVfZ3Bpb19tYXNrLCBvZmZzZXQ7Ci0KLQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKLQkJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX0lOUFVUX0hJX1osIHBvcnQpOwotCi0JCS8qIFRoZSBHUElPIHNob3VsZCBiZSBzd2FwcGVkIGlmIHRoZSBzd2FwIHJlZ2lzdGVyIGlzCi0JCSAgIHNldCBhbmQgYWN0aXZlICovCi0JCXN3YXBfdmFsID0gUkVHX1JEKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCk7Ci0JCXN3YXBfb3ZlcnJpZGUgPSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpOwotCi0JCS8qIFNlbGVjdCBmdW5jdGlvbiB1cG9uIHBvcnQtc3dhcCBjb25maWd1cmF0aW9uICovCi0JCWlmIChwb3J0ID09IDApIHsKLQkJCW9mZnNldCA9IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMDsKLQkJCWFldV9ncGlvX21hc2sgPSAoc3dhcF92YWwgJiYgc3dhcF9vdmVycmlkZSkgPwotCQkJCUFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzEgOgotCQkJCUFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzA7Ci0JCX0gZWxzZSB7Ci0JCQlvZmZzZXQgPSBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzFfT1VUXzA7Ci0JCQlhZXVfZ3Bpb19tYXNrID0gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpID8KLQkJCQlBRVVfSU5QVVRTX0FUVE5fQklUU19HUElPM19GVU5DVElPTl8wIDoKLQkJCQlBRVVfSU5QVVRTX0FUVE5fQklUU19HUElPM19GVU5DVElPTl8xOwotCQl9Ci0JCXZhbCA9IFJFR19SRChicCwgb2Zmc2V0KTsKLQkJLyogYWRkIEdQSU8zIHRvIGdyb3VwICovCi0JCXZhbCB8PSBhZXVfZ3Bpb19tYXNrOwotCQlSRUdfV1IoYnAsIG9mZnNldCwgdmFsKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMToKLQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6Ci0JCS8qIGFkZCBTUElPIDUgdG8gZ3JvdXAgMCAqLwotCQl7Ci0JCXUzMiByZWdfYWRkciA9IChwb3J0ID8gTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18xX09VVF8wIDoKLQkJCQkgICAgICAgTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18wX09VVF8wKTsKLQkJdmFsID0gUkVHX1JEKGJwLCByZWdfYWRkcik7Ci0JCXZhbCB8PSBBRVVfSU5QVVRTX0FUVE5fQklUU19TUElPNTsKLQkJUkVHX1dSKGJwLCByZWdfYWRkciwgdmFsKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWJueDJ4X19saW5rX3Jlc2V0KGJwKTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIElMVF9QRVJfRlVOQwkJKDc2OC8yKQotI2RlZmluZSBGVU5DX0lMVF9CQVNFKGZ1bmMpCShmdW5jICogSUxUX1BFUl9GVU5DKQotLyogdGhlIHBoeXMgYWRkcmVzcyBpcyBzaGlmdGVkIHJpZ2h0IDEyIGJpdHMgYW5kIGhhcyBhbiBhZGRlZAotICAgMT12YWxpZCBiaXQgYWRkZWQgdG8gdGhlIDUzcmQgYml0Ci0gICB0aGVuIHNpbmNlIHRoaXMgaXMgYSB3aWRlIHJlZ2lzdGVyKFRNKQotICAgd2Ugc3BsaXQgaXQgaW50byB0d28gMzIgYml0IHdyaXRlcwotICovCi0jZGVmaW5lIE9OQ0hJUF9BRERSMSh4KQkJKCh1MzIpKCgodTY0KXggPj4gMTIpICYgMHhGRkZGRkZGRikpCi0jZGVmaW5lIE9OQ0hJUF9BRERSMih4KQkJKCh1MzIpKCgxIDw8IDIwKSB8ICgodTY0KXggPj4gNDQpKSkKLSNkZWZpbmUgUFhQX09ORV9JTFQoeCkJCSgoKHgpIDw8IDEwKSB8IHgpCi0jZGVmaW5lIFBYUF9JTFRfUkFOR0UoZiwgbCkJKCgobCkgPDwgMTApIHwgZikKLQotI2lmZGVmIEJDTV9DTklDCi0jZGVmaW5lIENOSUNfSUxUX0xJTkVTCQkxMjcKLSNkZWZpbmUgQ05JQ19DVFhfUEVSX0lMVAkxNgotI2Vsc2UKLSNkZWZpbmUgQ05JQ19JTFRfTElORVMJCTAKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBibngyeF9pbHRfd3Ioc3RydWN0IGJueDJ4ICpicCwgdTMyIGluZGV4LCBkbWFfYWRkcl90IGFkZHIpCi17Ci0JaW50IHJlZzsKLQotCWlmIChDSElQX0lTX0UxSChicCkpCi0JCXJlZyA9IFBYUDJfUkVHX1JRX09OQ0hJUF9BVF9CMCArIGluZGV4Kjg7Ci0JZWxzZSAvKiBFMSAqLwotCQlyZWcgPSBQWFAyX1JFR19SUV9PTkNISVBfQVQgKyBpbmRleCo4OwotCi0JYm54Mnhfd2Jfd3IoYnAsIHJlZywgT05DSElQX0FERFIxKGFkZHIpLCBPTkNISVBfQUREUjIoYWRkcikpOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2luaXRfZnVuYyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQl1MzIgYWRkciwgdmFsOwotCWludCBpOwotCi0JRFAoQk5YMlhfTVNHX01DUCwgInN0YXJ0aW5nIGZ1bmMgaW5pdCAgZnVuYyAlZFxuIiwgZnVuYyk7Ci0KLQkvKiBzZXQgTVNJIHJlY29uZmlndXJlIGNhcGFiaWxpdHkgKi8KLQlhZGRyID0gKHBvcnQgPyBIQ19SRUdfQ09ORklHXzEgOiBIQ19SRUdfQ09ORklHXzApOwotCXZhbCA9IFJFR19SRChicCwgYWRkcik7Ci0JdmFsIHw9IEhDX0NPTkZJR18wX1JFR19NU0lfQVRUTl9FTl8wOwotCVJFR19XUihicCwgYWRkciwgdmFsKTsKLQotCWkgPSBGVU5DX0lMVF9CQVNFKGZ1bmMpOwotCi0JYm54MnhfaWx0X3dyKGJwLCBpLCBibngyeF9zcF9tYXBwaW5nKGJwLCBjb250ZXh0KSk7Ci0JaWYgKENISVBfSVNfRTFIKGJwKSkgewotCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0NEVV9GSVJTVF9JTFQsIGkpOwotCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0NEVV9MQVNUX0lMVCwgaSArIENOSUNfSUxUX0xJTkVTKTsKLQl9IGVsc2UgLyogRTEgKi8KLQkJUkVHX1dSKGJwLCBQWFAyX1JFR19QU1dSUV9DRFUwX0wyUCArIGZ1bmMqNCwKLQkJICAgICAgIFBYUF9JTFRfUkFOR0UoaSwgaSArIENOSUNfSUxUX0xJTkVTKSk7Ci0KLSNpZmRlZiBCQ01fQ05JQwotCWkgKz0gMSArIENOSUNfSUxUX0xJTkVTOwotCWJueDJ4X2lsdF93cihicCwgaSwgYnAtPnRpbWVyc19tYXBwaW5nKTsKLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCVJFR19XUihicCwgUFhQMl9SRUdfUFNXUlFfVE0wX0wyUCArIGZ1bmMqNCwgUFhQX09ORV9JTFQoaSkpOwotCWVsc2UgewotCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1RNX0ZJUlNUX0lMVCwgaSk7Ci0JCVJFR19XUihicCwgUFhQMl9SRUdfUlFfVE1fTEFTVF9JTFQsIGkpOwotCX0KLQotCWkrKzsKLQlibngyeF9pbHRfd3IoYnAsIGksIGJwLT5xbV9tYXBwaW5nKTsKLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCVJFR19XUihicCwgUFhQMl9SRUdfUFNXUlFfUU0wX0wyUCArIGZ1bmMqNCwgUFhQX09ORV9JTFQoaSkpOwotCWVsc2UgewotCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1FNX0ZJUlNUX0lMVCwgaSk7Ci0JCVJFR19XUihicCwgUFhQMl9SRUdfUlFfUU1fTEFTVF9JTFQsIGkpOwotCX0KLQotCWkrKzsKLQlibngyeF9pbHRfd3IoYnAsIGksIGJwLT50MV9tYXBwaW5nKTsKLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCVJFR19XUihicCwgUFhQMl9SRUdfUFNXUlFfU1JDMF9MMlAgKyBmdW5jKjQsIFBYUF9PTkVfSUxUKGkpKTsKLQllbHNlIHsKLQkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9TUkNfRklSU1RfSUxULCBpKTsKLQkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9TUkNfTEFTVF9JTFQsIGkpOwotCX0KLQotCS8qIHRlbGwgdGhlIHNlYXJjaGVyIHdoZXJlIHRoZSBUMiB0YWJsZSBpcyAqLwotCVJFR19XUihicCwgU1JDX1JFR19DT1VOVEZSRUUwICsgcG9ydCo0LCAxNioxMDI0LzY0KTsKLQotCWJueDJ4X3diX3dyKGJwLCBTUkNfUkVHX0ZJUlNURlJFRTAgKyBwb3J0KjE2LAotCQkgICAgVTY0X0xPKGJwLT50Ml9tYXBwaW5nKSwgVTY0X0hJKGJwLT50Ml9tYXBwaW5nKSk7Ci0KLQlibngyeF93Yl93cihicCwgU1JDX1JFR19MQVNURlJFRTAgKyBwb3J0KjE2LAotCQkgICAgVTY0X0xPKCh1NjQpYnAtPnQyX21hcHBpbmcgKyAxNioxMDI0IC0gNjQpLAotCQkgICAgVTY0X0hJKCh1NjQpYnAtPnQyX21hcHBpbmcgKyAxNioxMDI0IC0gNjQpKTsKLQotCVJFR19XUihicCwgU1JDX1JFR19OVU1CRVJfSEFTSF9CSVRTMCArIHBvcnQqNCwgMTApOwotI2VuZGlmCi0KLQlpZiAoQ0hJUF9JU19FMUgoYnApKSB7Ci0JCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JCWJueDJ4X2luaXRfYmxvY2soYnAsIFRDTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgVUNNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCQlibngyeF9pbml0X2Jsb2NrKGJwLCBDQ01fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JCWJueDJ4X2luaXRfYmxvY2soYnAsIFhDTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgVFNFTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgVVNFTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgQ1NFTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgWFNFTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQotCQlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9GVU5DX0VOICsgcG9ydCo4LCAxKTsKLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSDBfRlVOQ19WTEFOX0lEICsgcG9ydCo4LCBicC0+ZTFob3YpOwotCX0KLQotCS8qIEhDIGluaXQgcGVyIGZ1bmN0aW9uICovCi0JaWYgKENISVBfSVNfRTFIKGJwKSkgewotCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMTIgKyBmdW5jKjQsIDApOwotCi0JCVJFR19XUihicCwgSENfUkVHX0xFQURJTkdfRURHRV8wICsgcG9ydCo4LCAwKTsKLQkJUkVHX1dSKGJwLCBIQ19SRUdfVFJBSUxJTkdfRURHRV8wICsgcG9ydCo4LCAwKTsKLQl9Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgSENfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0KLQkvKiBSZXNldCBQQ0lFIGVycm9ycyBmb3IgZGVidWcgKi8KLQlSRUdfV1IoYnAsIDB4MjExNCwgMHhmZmZmZmZmZik7Ci0JUkVHX1dSKGJwLCAweDIxMjAsIDB4ZmZmZmZmZmYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfaW5pdF9odyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgbG9hZF9jb2RlKQotewotCWludCBpLCByYyA9IDA7Ci0KLQlEUChCTlgyWF9NU0dfTUNQLCAiZnVuY3Rpb24gJWQgIGxvYWRfY29kZSAleFxuIiwKLQkgICBCUF9GVU5DKGJwKSwgbG9hZF9jb2RlKTsKLQotCWJwLT5kbWFlX3JlYWR5ID0gMDsKLQltdXRleF9pbml0KCZicC0+ZG1hZV9tdXRleCk7Ci0JcmMgPSBibngyeF9ndW56aXBfaW5pdChicCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlzd2l0Y2ggKGxvYWRfY29kZSkgewotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OOgotCQlyYyA9IGJueDJ4X2luaXRfY29tbW9uKGJwKTsKLQkJaWYgKHJjKQotCQkJZ290byBpbml0X2h3X2VycjsKLQkJLyogbm8gYnJlYWsgKi8KLQotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVDoKLQkJYnAtPmRtYWVfcmVhZHkgPSAxOwotCQlyYyA9IGJueDJ4X2luaXRfcG9ydChicCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gaW5pdF9od19lcnI7Ci0JCS8qIG5vIGJyZWFrICovCi0KLQljYXNlIEZXX01TR19DT0RFX0RSVl9MT0FEX0ZVTkNUSU9OOgotCQlicC0+ZG1hZV9yZWFkeSA9IDE7Ci0JCXJjID0gYm54MnhfaW5pdF9mdW5jKGJwKTsKLQkJaWYgKHJjKQotCQkJZ290byBpbml0X2h3X2VycjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCTlgyWF9FUlIoIlVua25vd24gbG9hZF9jb2RlICgweCV4KSBmcm9tIE1DUFxuIiwgbG9hZF9jb2RlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFCUF9OT01DUChicCkpIHsKLQkJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQotCQlicC0+ZndfZHJ2X3B1bHNlX3dyX3NlcSA9Ci0JCQkJKFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmRydl9wdWxzZV9tYikgJgotCQkJCSBEUlZfUFVMU0VfU0VRX01BU0spOwotCQlEUChCTlgyWF9NU0dfTUNQLCAiZHJ2X3B1bHNlIDB4JXhcbiIsIGJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxKTsKLQl9Ci0KLQkvKiB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGd1bnppcCBlbmQgKi8KLQlibngyeF96ZXJvX2RlZl9zYihicCk7Ci0JZm9yX2VhY2hfcXVldWUoYnAsIGkpCi0JCWJueDJ4X3plcm9fc2IoYnAsIEJQX0xfSUQoYnApICsgaSk7Ci0jaWZkZWYgQkNNX0NOSUMKLQlibngyeF96ZXJvX3NiKGJwLCBCUF9MX0lEKGJwKSArIGkpOwotI2VuZGlmCi0KLWluaXRfaHdfZXJyOgotCWJueDJ4X2d1bnppcF9lbmQoYnApOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9mcmVlX21lbShzdHJ1Y3QgYm54MnggKmJwKQotewotCi0jZGVmaW5lIEJOWDJYX1BDSV9GUkVFKHgsIHksIHNpemUpIFwKLQlkbyB7IFwKLQkJaWYgKHgpIHsgXAotCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIHNpemUsIHgsIHkpOyBcCi0JCQl4ID0gTlVMTDsgXAotCQkJeSA9IDA7IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBCTlgyWF9GUkVFKHgpIFwKLQlkbyB7IFwKLQkJaWYgKHgpIHsgXAotCQkJdmZyZWUoeCk7IFwKLQkJCXggPSBOVUxMOyBcCi0JCX0gXAotCX0gd2hpbGUgKDApCi0KLQlpbnQgaTsKLQotCS8qIGZhc3RwYXRoICovCi0JLyogQ29tbW9uICovCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQotCQkvKiBzdGF0dXMgYmxvY2tzICovCi0JCUJOWDJYX1BDSV9GUkVFKGJueDJ4X2ZwKGJwLCBpLCBzdGF0dXNfYmxrKSwKLQkJCSAgICAgICBibngyeF9mcChicCwgaSwgc3RhdHVzX2Jsa19tYXBwaW5nKSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrKSk7Ci0JfQotCS8qIFJ4ICovCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQotCQkvKiBmYXN0cGF0aCByeCByaW5nczogcnhfYnVmIHJ4X2Rlc2MgcnhfY29tcCAqLwotCQlCTlgyWF9GUkVFKGJueDJ4X2ZwKGJwLCBpLCByeF9idWZfcmluZykpOwotCQlCTlgyWF9QQ0lfRlJFRShibngyeF9mcChicCwgaSwgcnhfZGVzY19yaW5nKSwKLQkJCSAgICAgICBibngyeF9mcChicCwgaSwgcnhfZGVzY19tYXBwaW5nKSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGV0aF9yeF9iZCkgKiBOVU1fUlhfQkQpOwotCi0JCUJOWDJYX1BDSV9GUkVFKGJueDJ4X2ZwKGJwLCBpLCByeF9jb21wX3JpbmcpLAotCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBpLCByeF9jb21wX21hcHBpbmcpLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF9jcWUpICoKLQkJCSAgICAgICBOVU1fUkNRX0JEKTsKLQotCQkvKiBTR0UgcmluZyAqLwotCQlCTlgyWF9GUkVFKGJueDJ4X2ZwKGJwLCBpLCByeF9wYWdlX3JpbmcpKTsKLQkJQk5YMlhfUENJX0ZSRUUoYm54MnhfZnAoYnAsIGksIHJ4X3NnZV9yaW5nKSwKLQkJCSAgICAgICBibngyeF9mcChicCwgaSwgcnhfc2dlX21hcHBpbmcpLAotCQkJICAgICAgIEJDTV9QQUdFX1NJWkUgKiBOVU1fUlhfU0dFX1BBR0VTKTsKLQl9Ci0JLyogVHggKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCi0JCS8qIGZhc3RwYXRoIHR4IHJpbmdzOiB0eF9idWYgdHhfZGVzYyAqLwotCQlCTlgyWF9GUkVFKGJueDJ4X2ZwKGJwLCBpLCB0eF9idWZfcmluZykpOwotCQlCTlgyWF9QQ0lfRlJFRShibngyeF9mcChicCwgaSwgdHhfZGVzY19yaW5nKSwKLQkJCSAgICAgICBibngyeF9mcChicCwgaSwgdHhfZGVzY19tYXBwaW5nKSwKLQkJCSAgICAgICBzaXplb2YodW5pb24gZXRoX3R4X2JkX3R5cGVzKSAqIE5VTV9UWF9CRCk7Ci0JfQotCS8qIGVuZCBvZiBmYXN0cGF0aCAqLwotCi0JQk5YMlhfUENJX0ZSRUUoYnAtPmRlZl9zdGF0dXNfYmxrLCBicC0+ZGVmX3N0YXR1c19ibGtfbWFwcGluZywKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrKSk7Ci0KLQlCTlgyWF9QQ0lfRlJFRShicC0+c2xvd3BhdGgsIGJwLT5zbG93cGF0aF9tYXBwaW5nLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBibngyeF9zbG93cGF0aCkpOwotCi0jaWZkZWYgQkNNX0NOSUMKLQlCTlgyWF9QQ0lfRlJFRShicC0+dDEsIGJwLT50MV9tYXBwaW5nLCA2NCoxMDI0KTsKLQlCTlgyWF9QQ0lfRlJFRShicC0+dDIsIGJwLT50Ml9tYXBwaW5nLCAxNioxMDI0KTsKLQlCTlgyWF9QQ0lfRlJFRShicC0+dGltZXJzLCBicC0+dGltZXJzX21hcHBpbmcsIDgqMTAyNCk7Ci0JQk5YMlhfUENJX0ZSRUUoYnAtPnFtLCBicC0+cW1fbWFwcGluZywgMTI4KjEwMjQpOwotCUJOWDJYX1BDSV9GUkVFKGJwLT5jbmljX3NiLCBicC0+Y25pY19zYl9tYXBwaW5nLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBob3N0X3N0YXR1c19ibG9jaykpOwotI2VuZGlmCi0JQk5YMlhfUENJX0ZSRUUoYnAtPnNwcSwgYnAtPnNwcV9tYXBwaW5nLCBCQ01fUEFHRV9TSVpFKTsKLQotI3VuZGVmIEJOWDJYX1BDSV9GUkVFCi0jdW5kZWYgQk5YMlhfS0ZSRUUKLX0KLQotc3RhdGljIGludCBibngyeF9hbGxvY19tZW0oc3RydWN0IGJueDJ4ICpicCkKLXsKLQotI2RlZmluZSBCTlgyWF9QQ0lfQUxMT0MoeCwgeSwgc2l6ZSkgXAotCWRvIHsgXAotCQl4ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBzaXplLCB5LCBHRlBfS0VSTkVMKTsgXAotCQlpZiAoeCA9PSBOVUxMKSBcCi0JCQlnb3RvIGFsbG9jX21lbV9lcnI7IFwKLQkJbWVtc2V0KHgsIDAsIHNpemUpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBCTlgyWF9BTExPQyh4LCBzaXplKSBcCi0JZG8geyBcCi0JCXggPSB2bWFsbG9jKHNpemUpOyBcCi0JCWlmICh4ID09IE5VTEwpIFwKLQkJCWdvdG8gYWxsb2NfbWVtX2VycjsgXAotCQltZW1zZXQoeCwgMCwgc2l6ZSk7IFwKLQl9IHdoaWxlICgwKQotCi0JaW50IGk7Ci0KLQkvKiBmYXN0cGF0aCAqLwotCS8qIENvbW1vbiAqLwotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCWJueDJ4X2ZwKGJwLCBpLCBicCkgPSBicDsKLQotCQkvKiBzdGF0dXMgYmxvY2tzICovCi0JCUJOWDJYX1BDSV9BTExPQyhibngyeF9mcChicCwgaSwgc3RhdHVzX2JsayksCi0JCQkJJmJueDJ4X2ZwKGJwLCBpLCBzdGF0dXNfYmxrX21hcHBpbmcpLAotCQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2spKTsKLQl9Ci0JLyogUnggKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCi0JCS8qIGZhc3RwYXRoIHJ4IHJpbmdzOiByeF9idWYgcnhfZGVzYyByeF9jb21wICovCi0JCUJOWDJYX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCByeF9idWZfcmluZyksCi0JCQkJc2l6ZW9mKHN0cnVjdCBzd19yeF9iZCkgKiBOVU1fUlhfQkQpOwotCQlCTlgyWF9QQ0lfQUxMT0MoYm54MnhfZnAoYnAsIGksIHJ4X2Rlc2NfcmluZyksCi0JCQkJJmJueDJ4X2ZwKGJwLCBpLCByeF9kZXNjX21hcHBpbmcpLAotCQkJCXNpemVvZihzdHJ1Y3QgZXRoX3J4X2JkKSAqIE5VTV9SWF9CRCk7Ci0KLQkJQk5YMlhfUENJX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCByeF9jb21wX3JpbmcpLAotCQkJCSZibngyeF9mcChicCwgaSwgcnhfY29tcF9tYXBwaW5nKSwKLQkJCQlzaXplb2Yoc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlKSAqCi0JCQkJTlVNX1JDUV9CRCk7Ci0KLQkJLyogU0dFIHJpbmcgKi8KLQkJQk5YMlhfQUxMT0MoYm54MnhfZnAoYnAsIGksIHJ4X3BhZ2VfcmluZyksCi0JCQkJc2l6ZW9mKHN0cnVjdCBzd19yeF9wYWdlKSAqIE5VTV9SWF9TR0UpOwotCQlCTlgyWF9QQ0lfQUxMT0MoYm54MnhfZnAoYnAsIGksIHJ4X3NnZV9yaW5nKSwKLQkJCQkmYm54MnhfZnAoYnAsIGksIHJ4X3NnZV9tYXBwaW5nKSwKLQkJCQlCQ01fUEFHRV9TSVpFICogTlVNX1JYX1NHRV9QQUdFUyk7Ci0JfQotCS8qIFR4ICovCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQotCQkvKiBmYXN0cGF0aCB0eCByaW5nczogdHhfYnVmIHR4X2Rlc2MgKi8KLQkJQk5YMlhfQUxMT0MoYm54MnhfZnAoYnAsIGksIHR4X2J1Zl9yaW5nKSwKLQkJCQlzaXplb2Yoc3RydWN0IHN3X3R4X2JkKSAqIE5VTV9UWF9CRCk7Ci0JCUJOWDJYX1BDSV9BTExPQyhibngyeF9mcChicCwgaSwgdHhfZGVzY19yaW5nKSwKLQkJCQkmYm54MnhfZnAoYnAsIGksIHR4X2Rlc2NfbWFwcGluZyksCi0JCQkJc2l6ZW9mKHVuaW9uIGV0aF90eF9iZF90eXBlcykgKiBOVU1fVFhfQkQpOwotCX0KLQkvKiBlbmQgb2YgZmFzdHBhdGggKi8KLQotCUJOWDJYX1BDSV9BTExPQyhicC0+ZGVmX3N0YXR1c19ibGssICZicC0+ZGVmX3N0YXR1c19ibGtfbWFwcGluZywKLQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrKSk7Ci0KLQlCTlgyWF9QQ0lfQUxMT0MoYnAtPnNsb3dwYXRoLCAmYnAtPnNsb3dwYXRoX21hcHBpbmcsCi0JCQlzaXplb2Yoc3RydWN0IGJueDJ4X3Nsb3dwYXRoKSk7Ci0KLSNpZmRlZiBCQ01fQ05JQwotCUJOWDJYX1BDSV9BTExPQyhicC0+dDEsICZicC0+dDFfbWFwcGluZywgNjQqMTAyNCk7Ci0KLQkvKiBhbGxvY2F0ZSBzZWFyY2hlciBUMiB0YWJsZQotCSAgIHdlIGFsbG9jYXRlIDEvNCBvZiBhbGxvYyBudW0gZm9yIFQyCi0JICAod2hpY2ggaXMgbm90IGVudGVyZWQgaW50byB0aGUgSUxUKSAqLwotCUJOWDJYX1BDSV9BTExPQyhicC0+dDIsICZicC0+dDJfbWFwcGluZywgMTYqMTAyNCk7Ci0KLQkvKiBJbml0aWFsaXplIFQyIChmb3IgMTAyNCBjb25uZWN0aW9ucykgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTYqMTAyNDsgaSArPSA2NCkKLQkJKih1NjQgKikoKGNoYXIgKilicC0+dDIgKyBpICsgNTYpID0gYnAtPnQyX21hcHBpbmcgKyBpICsgNjQ7Ci0KLQkvKiBUaW1lciBibG9jayBhcnJheSAoOCpNQVhfQ09OTikgcGh5cyB1bmNhY2hlZCBmb3Igbm93IDEwMjQgY29ubnMgKi8KLQlCTlgyWF9QQ0lfQUxMT0MoYnAtPnRpbWVycywgJmJwLT50aW1lcnNfbWFwcGluZywgOCoxMDI0KTsKLQotCS8qIFFNIHF1ZXVlcyAoMTI4Kk1BWF9DT05OKSAqLwotCUJOWDJYX1BDSV9BTExPQyhicC0+cW0sICZicC0+cW1fbWFwcGluZywgMTI4KjEwMjQpOwotCi0JQk5YMlhfUENJX0FMTE9DKGJwLT5jbmljX3NiLCAmYnAtPmNuaWNfc2JfbWFwcGluZywKLQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9zdGF0dXNfYmxvY2spKTsKLSNlbmRpZgotCi0JLyogU2xvdyBwYXRoIHJpbmcgKi8KLQlCTlgyWF9QQ0lfQUxMT0MoYnAtPnNwcSwgJmJwLT5zcHFfbWFwcGluZywgQkNNX1BBR0VfU0laRSk7Ci0KLQlyZXR1cm4gMDsKLQotYWxsb2NfbWVtX2VycjoKLQlibngyeF9mcmVlX21lbShicCk7Ci0JcmV0dXJuIC1FTk9NRU07Ci0KLSN1bmRlZiBCTlgyWF9QQ0lfQUxMT0MKLSN1bmRlZiBCTlgyWF9BTExPQwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9mcmVlX3R4X3NrYnMoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOwotCi0JCXUxNiBiZF9jb25zID0gZnAtPnR4X2JkX2NvbnM7Ci0JCXUxNiBzd19wcm9kID0gZnAtPnR4X3BrdF9wcm9kOwotCQl1MTYgc3dfY29ucyA9IGZwLT50eF9wa3RfY29uczsKLQotCQl3aGlsZSAoc3dfY29ucyAhPSBzd19wcm9kKSB7Ci0JCQliZF9jb25zID0gYm54MnhfZnJlZV90eF9wa3QoYnAsIGZwLCBUWF9CRChzd19jb25zKSk7Ci0JCQlzd19jb25zKys7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfcnhfc2ticyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpLCBqOwotCi0JZm9yX2VhY2hfcXVldWUoYnAsIGopIHsKLQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbal07Ci0KLQkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CRDsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbaV07Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7Ci0KLQkJCWlmIChza2IgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKLQkJCQkJIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCi0JCQkJCSBicC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJCXJ4X2J1Zi0+c2tiID0gTlVMTDsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJfQotCQlpZiAoIWZwLT5kaXNhYmxlX3RwYSkKLQkJCWJueDJ4X2ZyZWVfdHBhX3Bvb2woYnAsIGZwLCBDSElQX0lTX0UxKGJwKSA/Ci0JCQkJCSAgICBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMSA6Ci0JCQkJCSAgICBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZnJlZV9za2JzKHN0cnVjdCBibngyeCAqYnApCi17Ci0JYm54MnhfZnJlZV90eF9za2JzKGJwKTsKLQlibngyeF9mcmVlX3J4X3NrYnMoYnApOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9mcmVlX21zaXhfaXJxcyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpLCBvZmZzZXQgPSAxOwotCi0JZnJlZV9pcnEoYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yLCBicC0+ZGV2KTsKLQlEUChORVRJRl9NU0dfSUZET1dOLCAicmVsZWFzZWQgc3AgaXJxICglZClcbiIsCi0JICAgYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yKTsKLQotI2lmZGVmIEJDTV9DTklDCi0Jb2Zmc2V0Kys7Ci0jZW5kaWYKLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlEUChORVRJRl9NU0dfSUZET1dOLCAiYWJvdXQgdG8gcmVsZWFzZSBmcCAjJWQtPiVkIGlycSAgIgotCQkgICAic3RhdGUgJXhcbiIsIGksIGJwLT5tc2l4X3RhYmxlW2kgKyBvZmZzZXRdLnZlY3RvciwKLQkJICAgYm54MnhfZnAoYnAsIGksIHN0YXRlKSk7Ci0KLQkJZnJlZV9pcnEoYnAtPm1zaXhfdGFibGVbaSArIG9mZnNldF0udmVjdG9yLCAmYnAtPmZwW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfaXJxKHN0cnVjdCBibngyeCAqYnAsIGJvb2wgZGlzYWJsZV9vbmx5KQotewotCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpIHsKLQkJaWYgKCFkaXNhYmxlX29ubHkpCi0JCQlibngyeF9mcmVlX21zaXhfaXJxcyhicCk7Ci0JCXBjaV9kaXNhYmxlX21zaXgoYnAtPnBkZXYpOwotCQlicC0+ZmxhZ3MgJj0gflVTSU5HX01TSVhfRkxBRzsKLQotCX0gZWxzZSBpZiAoYnAtPmZsYWdzICYgVVNJTkdfTVNJX0ZMQUcpIHsKLQkJaWYgKCFkaXNhYmxlX29ubHkpCi0JCQlmcmVlX2lycShicC0+cGRldi0+aXJxLCBicC0+ZGV2KTsKLQkJcGNpX2Rpc2FibGVfbXNpKGJwLT5wZGV2KTsKLQkJYnAtPmZsYWdzICY9IH5VU0lOR19NU0lfRkxBRzsKLQotCX0gZWxzZSBpZiAoIWRpc2FibGVfb25seSkKLQkJZnJlZV9pcnEoYnAtPnBkZXYtPmlycSwgYnAtPmRldik7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfZW5hYmxlX21zaXgoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaSwgcmMsIG9mZnNldCA9IDE7Ci0JaW50IGlndV92ZWMgPSAwOwotCi0JYnAtPm1zaXhfdGFibGVbMF0uZW50cnkgPSBpZ3VfdmVjOwotCURQKE5FVElGX01TR19JRlVQLCAibXNpeF90YWJsZVswXS5lbnRyeSA9ICVkIChzbG93cGF0aClcbiIsIGlndV92ZWMpOwotCi0jaWZkZWYgQkNNX0NOSUMKLQlpZ3VfdmVjID0gQlBfTF9JRChicCkgKyBvZmZzZXQ7Ci0JYnAtPm1zaXhfdGFibGVbMV0uZW50cnkgPSBpZ3VfdmVjOwotCURQKE5FVElGX01TR19JRlVQLCAibXNpeF90YWJsZVsxXS5lbnRyeSA9ICVkIChDTklDKVxuIiwgaWd1X3ZlYyk7Ci0Jb2Zmc2V0Kys7Ci0jZW5kaWYKLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewotCQlpZ3VfdmVjID0gQlBfTF9JRChicCkgKyBvZmZzZXQgKyBpOwotCQlicC0+bXNpeF90YWJsZVtpICsgb2Zmc2V0XS5lbnRyeSA9IGlndV92ZWM7Ci0JCURQKE5FVElGX01TR19JRlVQLCAibXNpeF90YWJsZVslZF0uZW50cnkgPSAlZCAiCi0JCSAgICIoZmFzdHBhdGggIyV1KVxuIiwgaSArIG9mZnNldCwgaWd1X3ZlYywgaSk7Ci0JfQotCi0JcmMgPSBwY2lfZW5hYmxlX21zaXgoYnAtPnBkZXYsICZicC0+bXNpeF90YWJsZVswXSwKLQkJCSAgICAgQk5YMlhfTlVNX1FVRVVFUyhicCkgKyBvZmZzZXQpOwotCi0JLyoKLQkgKiByZWNvbmZpZ3VyZSBudW1iZXIgb2YgdHgvcnggcXVldWVzIGFjY29yZGluZyB0byBhdmFpbGFibGUKLQkgKiBNU0ktWCB2ZWN0b3JzCi0JICovCi0JaWYgKHJjID49IEJOWDJYX01JTl9NU0lYX1ZFQ19DTlQpIHsKLQkJLyogdmVjdG9ycyBhdmFpbGFibGUgZm9yIEZQICovCi0JCWludCBmcF92ZWMgPSByYyAtIEJOWDJYX01TSVhfVkVDX0ZQX1NUQVJUOwotCi0JCURQKE5FVElGX01TR19JRlVQLAotCQkgICAiVHJ5aW5nIHRvIHVzZSBsZXNzIE1TSS1YIHZlY3RvcnM6ICVkXG4iLCByYyk7Ci0KLQkJcmMgPSBwY2lfZW5hYmxlX21zaXgoYnAtPnBkZXYsICZicC0+bXNpeF90YWJsZVswXSwgcmMpOwotCi0JCWlmIChyYykgewotCQkJRFAoTkVUSUZfTVNHX0lGVVAsCi0JCQkgICAiTVNJLVggaXMgbm90IGF0dGFpbmFibGUgIHJjICVkXG4iLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlicC0+bnVtX3F1ZXVlcyA9IG1pbihicC0+bnVtX3F1ZXVlcywgZnBfdmVjKTsKLQotCQlEUChORVRJRl9NU0dfSUZVUCwgIk5ldyBxdWV1ZSBjb25maWd1cmF0aW9uIHNldDogJWRcbiIsCi0JCQkJICBicC0+bnVtX3F1ZXVlcyk7Ci0JfSBlbHNlIGlmIChyYykgewotCQlEUChORVRJRl9NU0dfSUZVUCwgIk1TSS1YIGlzIG5vdCBhdHRhaW5hYmxlICByYyAlZFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JYnAtPmZsYWdzIHw9IFVTSU5HX01TSVhfRkxBRzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3JlcV9tc2l4X2lycXMoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaSwgcmMsIG9mZnNldCA9IDE7Ci0KLQlyYyA9IHJlcXVlc3RfaXJxKGJwLT5tc2l4X3RhYmxlWzBdLnZlY3RvciwgYm54MnhfbXNpeF9zcF9pbnQsIDAsCi0JCQkgYnAtPmRldi0+bmFtZSwgYnAtPmRldik7Ci0JaWYgKHJjKSB7Ci0JCUJOWDJYX0VSUigicmVxdWVzdCBzcCBpcnEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLSNpZmRlZiBCQ01fQ05JQwotCW9mZnNldCsrOwotI2VuZGlmCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKLQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07Ci0JCXNucHJpbnRmKGZwLT5uYW1lLCBzaXplb2YoZnAtPm5hbWUpLCAiJXMtZnAtJWQiLAotCQkJIGJwLT5kZXYtPm5hbWUsIGkpOwotCi0JCXJjID0gcmVxdWVzdF9pcnEoYnAtPm1zaXhfdGFibGVbaSArIG9mZnNldF0udmVjdG9yLAotCQkJCSBibngyeF9tc2l4X2ZwX2ludCwgMCwgZnAtPm5hbWUsIGZwKTsKLQkJaWYgKHJjKSB7Ci0JCQlCTlgyWF9FUlIoInJlcXVlc3QgZnAgIyVkIGlycSBmYWlsZWQgIHJjICVkXG4iLCBpLCByYyk7Ci0JCQlibngyeF9mcmVlX21zaXhfaXJxcyhicCk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQkJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfSVJROwotCX0KLQotCWkgPSBCTlgyWF9OVU1fUVVFVUVTKGJwKTsKLQluZXRkZXZfaW5mbyhicC0+ZGV2LCAidXNpbmcgTVNJLVggIElSUXM6IHNwICVkICBmcFslZF0gJWQiCi0JICAgICAgICIgLi4uIGZwWyVkXSAlZFxuIiwKLQkgICAgICAgYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yLAotCSAgICAgICAwLCBicC0+bXNpeF90YWJsZVtvZmZzZXRdLnZlY3RvciwKLQkgICAgICAgaSAtIDEsIGJwLT5tc2l4X3RhYmxlW29mZnNldCArIGkgLSAxXS52ZWN0b3IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfZW5hYmxlX21zaShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCByYzsKLQotCXJjID0gcGNpX2VuYWJsZV9tc2koYnAtPnBkZXYpOwotCWlmIChyYykgewotCQlEUChORVRJRl9NU0dfSUZVUCwgIk1TSSBpcyBub3QgYXR0YWluYWJsZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYnAtPmZsYWdzIHw9IFVTSU5HX01TSV9GTEFHOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfcmVxX2lycShzdHJ1Y3QgYm54MnggKmJwKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJjOwotCi0JaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSV9GTEFHKQotCQlmbGFncyA9IDA7Ci0JZWxzZQotCQlmbGFncyA9IElSUUZfU0hBUkVEOwotCi0JcmMgPSByZXF1ZXN0X2lycShicC0+cGRldi0+aXJxLCBibngyeF9pbnRlcnJ1cHQsIGZsYWdzLAotCQkJIGJwLT5kZXYtPm5hbWUsIGJwLT5kZXYpOwotCWlmICghcmMpCi0JCWJueDJ4X2ZwKGJwLCAwLCBzdGF0ZSkgPSBCTlgyWF9GUF9TVEFURV9JUlE7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X25hcGlfZW5hYmxlKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQkJbmFwaV9lbmFibGUoJmJueDJ4X2ZwKGJwLCBpLCBuYXBpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X25hcGlfZGlzYWJsZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpOwotCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpCi0JCW5hcGlfZGlzYWJsZSgmYm54MnhfZnAoYnAsIGksIG5hcGkpKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfbmV0aWZfc3RhcnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaW50cl9zZW07Ci0KLQlpbnRyX3NlbSA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJmJwLT5pbnRyX3NlbSk7Ci0Jc21wX3dtYigpOyAvKiBFbnN1cmUgdGhhdCBicC0+aW50cl9zZW0gdXBkYXRlIGlzIFNNUC1zYWZlICovCi0KLQlpZiAoaW50cl9zZW0pIHsKLQkJaWYgKG5ldGlmX3J1bm5pbmcoYnAtPmRldikpIHsKLQkJCWJueDJ4X25hcGlfZW5hYmxlKGJwKTsKLQkJCWJueDJ4X2ludF9lbmFibGUoYnApOwotCQkJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKQotCQkJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhicC0+ZGV2KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfbmV0aWZfc3RvcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZGlzYWJsZV9odykKLXsKLQlibngyeF9pbnRfZGlzYWJsZV9zeW5jKGJwLCBkaXNhYmxlX2h3KTsKLQlibngyeF9uYXBpX2Rpc2FibGUoYnApOwotCW5ldGlmX3R4X2Rpc2FibGUoYnAtPmRldik7Ci19Ci0KLS8qCi0gKiBJbml0IHNlcnZpY2UgZnVuY3Rpb25zCi0gKi8KLQotLyoqCi0gKiBTZXRzIGEgTUFDIGluIGEgQ0FNIGZvciBhIGZldyBMMiBDbGllbnRzIGZvciBFMSBjaGlwCi0gKgotICogQHBhcmFtIGJwIGRyaXZlciBkZXNjcmlwdG9yCi0gKiBAcGFyYW0gc2V0IHNldCBvciBjbGVhciBhbiBlbnRyeSAoMSBvciAwKQotICogQHBhcmFtIG1hYyBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBNQUMKLSAqIEBwYXJhbSBjbF9iaXRfdmVjIGJpdCB2ZWN0b3Igb2YgY2xpZW50cyB0byByZWdpc3RlciBhIE1BQyBmb3IKLSAqIEBwYXJhbSBjYW1fb2Zmc2V0IG9mZnNldCBpbiBhIENBTSB0byB1c2UKLSAqIEBwYXJhbSB3aXRoX2JjYXN0IHNldCBicm9hZGNhc3QgTUFDIGFzIHdlbGwKLSAqLwotc3RhdGljIHZvaWQgYm54Mnhfc2V0X21hY19hZGRyX2UxX2dlbihzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0LCB1OCAqbWFjLAotCQkJCSAgICAgIHUzMiBjbF9iaXRfdmVjLCB1OCBjYW1fb2Zmc2V0LAotCQkJCSAgICAgIHU4IHdpdGhfYmNhc3QpCi17Ci0Jc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZCAqY29uZmlnID0gYm54Mnhfc3AoYnAsIG1hY19jb25maWcpOwotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0KLQkvKiBDQU0gYWxsb2NhdGlvbgotCSAqIHVuaWNhc3RzIDAtMzE6cG9ydDAgMzItNjM6cG9ydDEKLQkgKiBtdWx0aWNhc3QgNjQtMTI3OnBvcnQwIDEyOC0xOTE6cG9ydDEKLQkgKi8KLQljb25maWctPmhkci5sZW5ndGggPSAxICsgKHdpdGhfYmNhc3QgPyAxIDogMCk7Ci0JY29uZmlnLT5oZHIub2Zmc2V0ID0gY2FtX29mZnNldDsKLQljb25maWctPmhkci5jbGllbnRfaWQgPSAweGZmOwotCWNvbmZpZy0+aGRyLnJlc2VydmVkMSA9IDA7Ci0KLQkvKiBwcmltYXJ5IE1BQyAqLwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNhbV9lbnRyeS5tc2JfbWFjX2FkZHIgPQotCQkJCQlzd2FiMTYoKih1MTYgKikmbWFjWzBdKTsKLQljb25maWctPmNvbmZpZ190YWJsZVswXS5jYW1fZW50cnkubWlkZGxlX21hY19hZGRyID0KLQkJCQkJc3dhYjE2KCoodTE2ICopJm1hY1syXSk7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0uY2FtX2VudHJ5LmxzYl9tYWNfYWRkciA9Ci0JCQkJCXN3YWIxNigqKHUxNiAqKSZtYWNbNF0pOwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNhbV9lbnRyeS5mbGFncyA9IGNwdV90b19sZTE2KHBvcnQpOwotCWlmIChzZXQpCi0JCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLnRhcmdldF90YWJsZV9lbnRyeS5mbGFncyA9IDA7Ci0JZWxzZQotCQlDQU1fSU5WQUxJREFURShjb25maWctPmNvbmZpZ190YWJsZVswXSk7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0udGFyZ2V0X3RhYmxlX2VudHJ5LmNsaWVudHNfYml0X3ZlY3RvciA9Ci0JCQkJCQljcHVfdG9fbGUzMihjbF9iaXRfdmVjKTsKLQljb25maWctPmNvbmZpZ190YWJsZVswXS50YXJnZXRfdGFibGVfZW50cnkudmxhbl9pZCA9IDA7Ci0KLQlEUChORVRJRl9NU0dfSUZVUCwgIiVzIE1BQyAoJTA0eDolMDR4OiUwNHgpXG4iLAotCSAgIChzZXQgPyAic2V0dGluZyIgOiAiY2xlYXJpbmciKSwKLQkgICBjb25maWctPmNvbmZpZ190YWJsZVswXS5jYW1fZW50cnkubXNiX21hY19hZGRyLAotCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNhbV9lbnRyeS5taWRkbGVfbWFjX2FkZHIsCi0JICAgY29uZmlnLT5jb25maWdfdGFibGVbMF0uY2FtX2VudHJ5LmxzYl9tYWNfYWRkcik7Ci0KLQkvKiBicm9hZGNhc3QgKi8KLQlpZiAod2l0aF9iY2FzdCkgewotCQljb25maWctPmNvbmZpZ190YWJsZVsxXS5jYW1fZW50cnkubXNiX21hY19hZGRyID0KLQkJCWNwdV90b19sZTE2KDB4ZmZmZik7Ci0JCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzFdLmNhbV9lbnRyeS5taWRkbGVfbWFjX2FkZHIgPQotCQkJY3B1X3RvX2xlMTYoMHhmZmZmKTsKLQkJY29uZmlnLT5jb25maWdfdGFibGVbMV0uY2FtX2VudHJ5LmxzYl9tYWNfYWRkciA9Ci0JCQljcHVfdG9fbGUxNigweGZmZmYpOwotCQljb25maWctPmNvbmZpZ190YWJsZVsxXS5jYW1fZW50cnkuZmxhZ3MgPSBjcHVfdG9fbGUxNihwb3J0KTsKLQkJaWYgKHNldCkKLQkJCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzFdLnRhcmdldF90YWJsZV9lbnRyeS5mbGFncyA9Ci0JCQkJCVRTVE9STV9DQU1fVEFSR0VUX1RBQkxFX0VOVFJZX0JST0FEQ0FTVDsKLQkJZWxzZQotCQkJQ0FNX0lOVkFMSURBVEUoY29uZmlnLT5jb25maWdfdGFibGVbMV0pOwotCQljb25maWctPmNvbmZpZ190YWJsZVsxXS50YXJnZXRfdGFibGVfZW50cnkuY2xpZW50c19iaXRfdmVjdG9yID0KLQkJCQkJCQljcHVfdG9fbGUzMihjbF9iaXRfdmVjKTsKLQkJY29uZmlnLT5jb25maWdfdGFibGVbMV0udGFyZ2V0X3RhYmxlX2VudHJ5LnZsYW5faWQgPSAwOwotCX0KLQotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMsIDAsCi0JCSAgICAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksCi0JCSAgICAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksIDApOwotfQotCi0vKioKLSAqIFNldHMgYSBNQUMgaW4gYSBDQU0gZm9yIGEgZmV3IEwyIENsaWVudHMgZm9yIEUxSCBjaGlwCi0gKgotICogQHBhcmFtIGJwIGRyaXZlciBkZXNjcmlwdG9yCi0gKiBAcGFyYW0gc2V0IHNldCBvciBjbGVhciBhbiBlbnRyeSAoMSBvciAwKQotICogQHBhcmFtIG1hYyBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBNQUMKLSAqIEBwYXJhbSBjbF9iaXRfdmVjIGJpdCB2ZWN0b3Igb2YgY2xpZW50cyB0byByZWdpc3RlciBhIE1BQyBmb3IKLSAqIEBwYXJhbSBjYW1fb2Zmc2V0IG9mZnNldCBpbiBhIENBTSB0byB1c2UKLSAqLwotc3RhdGljIHZvaWQgYm54Mnhfc2V0X21hY19hZGRyX2UxaF9nZW4oc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCwgdTggKm1hYywKLQkJCQkgICAgICAgdTMyIGNsX2JpdF92ZWMsIHU4IGNhbV9vZmZzZXQpCi17Ci0Jc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZF9lMWggKmNvbmZpZyA9Ci0JCShzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kX2UxaCAqKWJueDJ4X3NwKGJwLCBtYWNfY29uZmlnKTsKLQotCWNvbmZpZy0+aGRyLmxlbmd0aCA9IDE7Ci0JY29uZmlnLT5oZHIub2Zmc2V0ID0gY2FtX29mZnNldDsKLQljb25maWctPmhkci5jbGllbnRfaWQgPSAweGZmOwotCWNvbmZpZy0+aGRyLnJlc2VydmVkMSA9IDA7Ci0KLQkvKiBwcmltYXJ5IE1BQyAqLwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLm1zYl9tYWNfYWRkciA9Ci0JCQkJCXN3YWIxNigqKHUxNiAqKSZtYWNbMF0pOwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLm1pZGRsZV9tYWNfYWRkciA9Ci0JCQkJCXN3YWIxNigqKHUxNiAqKSZtYWNbMl0pOwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmxzYl9tYWNfYWRkciA9Ci0JCQkJCXN3YWIxNigqKHUxNiAqKSZtYWNbNF0pOwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNsaWVudHNfYml0X3ZlY3RvciA9Ci0JCQkJCWNwdV90b19sZTMyKGNsX2JpdF92ZWMpOwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLnZsYW5faWQgPSAwOwotCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmUxaG92X2lkID0gY3B1X3RvX2xlMTYoYnAtPmUxaG92KTsKLQlpZiAoc2V0KQotCQljb25maWctPmNvbmZpZ190YWJsZVswXS5mbGFncyA9IEJQX1BPUlQoYnApOwotCWVsc2UKLQkJY29uZmlnLT5jb25maWdfdGFibGVbMF0uZmxhZ3MgPQotCQkJCU1BQ19DT05GSUdVUkFUSU9OX0VOVFJZX0UxSF9BQ1RJT05fVFlQRTsKLQotCURQKE5FVElGX01TR19JRlVQLCAiJXMgTUFDICglMDR4OiUwNHg6JTA0eCkgIEUxSE9WICVkICBDTElEIG1hc2sgJWRcbiIsCi0JICAgKHNldCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIpLAotCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLm1zYl9tYWNfYWRkciwKLQkgICBjb25maWctPmNvbmZpZ190YWJsZVswXS5taWRkbGVfbWFjX2FkZHIsCi0JICAgY29uZmlnLT5jb25maWdfdGFibGVbMF0ubHNiX21hY19hZGRyLCBicC0+ZTFob3YsIGNsX2JpdF92ZWMpOwotCi0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQywgMCwKLQkJICAgICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19jb25maWcpKSwKLQkJICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19jb25maWcpKSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfd2FpdF9yYW1yb2Qoc3RydWN0IGJueDJ4ICpicCwgaW50IHN0YXRlLCBpbnQgaWR4LAotCQkJICAgICBpbnQgKnN0YXRlX3AsIGludCBwb2xsKQotewotCS8qIGNhbiB0YWtlIGEgd2hpbGUgaWYgYW55IHBvcnQgaXMgcnVubmluZyAqLwotCWludCBjbnQgPSA1MDAwOwotCi0JRFAoTkVUSUZfTVNHX0lGVVAsICIlcyBmb3Igc3RhdGUgdG8gYmVjb21lICV4IG9uIElEWCBbJWRdXG4iLAotCSAgIHBvbGwgPyAicG9sbGluZyIgOiAid2FpdGluZyIsIHN0YXRlLCBpZHgpOwotCi0JbWlnaHRfc2xlZXAoKTsKLQl3aGlsZSAoY250LS0pIHsKLQkJaWYgKHBvbGwpIHsKLQkJCWJueDJ4X3J4X2ludChicC0+ZnAsIDEwKTsKLQkJCS8qIGlmIGluZGV4IGlzIGRpZmZlcmVudCBmcm9tIDAKLQkJCSAqIHRoZSByZXBseSBmb3Igc29tZSBjb21tYW5kcyB3aWxsCi0JCQkgKiBiZSBvbiB0aGUgbm9uIGRlZmF1bHQgcXVldWUKLQkJCSAqLwotCQkJaWYgKGlkeCkKLQkJCQlibngyeF9yeF9pbnQoJmJwLT5mcFtpZHhdLCAxMCk7Ci0JCX0KLQotCQltYigpOyAvKiBzdGF0ZSBpcyBjaGFuZ2VkIGJ5IGJueDJ4X3NwX2V2ZW50KCkgKi8KLQkJaWYgKCpzdGF0ZV9wID09IHN0YXRlKSB7Ci0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQkJRFAoTkVUSUZfTVNHX0lGVVAsICJleGl0ICAoY250ICVkKVxuIiwgNTAwMCAtIGNudCk7Ci0jZW5kaWYKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJbXNsZWVwKDEpOwotCi0JCWlmIChicC0+cGFuaWMpCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiB0aW1lb3V0ISAqLwotCUJOWDJYX0VSUigidGltZW91dCAlcyBmb3Igc3RhdGUgJXggb24gSURYIFslZF1cbiIsCi0JCSAgcG9sbCA/ICJwb2xsaW5nIiA6ICJ3YWl0aW5nIiwgc3RhdGUsIGlkeCk7Ci0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWJueDJ4X3BhbmljKCk7Ci0jZW5kaWYKLQotCXJldHVybiAtRUJVU1k7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldF9ldGhfbWFjX2FkZHJfZTFoKHN0cnVjdCBibngyeCAqYnAsIGludCBzZXQpCi17Ci0JYnAtPnNldF9tYWNfcGVuZGluZysrOwotCXNtcF93bWIoKTsKLQotCWJueDJ4X3NldF9tYWNfYWRkcl9lMWhfZ2VuKGJwLCBzZXQsIGJwLT5kZXYtPmRldl9hZGRyLAotCQkJCSAgICgxIDw8IGJwLT5mcC0+Y2xfaWQpLCBCUF9GVU5DKGJwKSk7Ci0KLQkvKiBXYWl0IGZvciBhIGNvbXBsZXRpb24gKi8KLQlibngyeF93YWl0X3JhbXJvZChicCwgMCwgMCwgJmJwLT5zZXRfbWFjX3BlbmRpbmcsIHNldCA/IDAgOiAxKTsKLX0KLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0KQotewotCWJwLT5zZXRfbWFjX3BlbmRpbmcrKzsKLQlzbXBfd21iKCk7Ci0KLQlibngyeF9zZXRfbWFjX2FkZHJfZTFfZ2VuKGJwLCBzZXQsIGJwLT5kZXYtPmRldl9hZGRyLAotCQkJCSAgKDEgPDwgYnAtPmZwLT5jbF9pZCksIChCUF9QT1JUKGJwKSA/IDMyIDogMCksCi0JCQkJICAxKTsKLQotCS8qIFdhaXQgZm9yIGEgY29tcGxldGlvbiAqLwotCWJueDJ4X3dhaXRfcmFtcm9kKGJwLCAwLCAwLCAmYnAtPnNldF9tYWNfcGVuZGluZywgc2V0ID8gMCA6IDEpOwotfQotCi0jaWZkZWYgQkNNX0NOSUMKLS8qKgotICogU2V0IGlTQ1NJIE1BQyhzKSBhdCB0aGUgbmV4dCBlbnRpZXMgaW4gdGhlIENBTSBhZnRlciB0aGUgRVRICi0gKiBNQUMocykuIFRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IHVudGlsIHRoZSByYW1kb3JkIGNvbXBsZXRpb24KLSAqIHJldHVybnMuCi0gKgotICogQHBhcmFtIGJwIGRyaXZlciBoYW5kbGUKLSAqIEBwYXJhbSBzZXQgc2V0IG9yIGNsZWFyIHRoZSBDQU0gZW50cnkKLSAqCi0gKiBAcmV0dXJuIDAgaWYgY3Vzc2VzcywgLUVOT0RFViBpZiByYW1yb2QgZG9lc24ndCByZXR1cm4uCi0gKi8KLXN0YXRpYyBpbnQgYm54Mnhfc2V0X2lzY3NpX2V0aF9tYWNfYWRkcihzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0KQotewotCXUzMiBjbF9iaXRfdmVjID0gKDEgPDwgQkNNX0lTQ1NJX0VUSF9DTF9JRCk7Ci0KLQlicC0+c2V0X21hY19wZW5kaW5nKys7Ci0Jc21wX3dtYigpOwotCi0JLyogU2VuZCBhIFNFVF9NQUMgcmFtcm9kICovCi0JaWYgKENISVBfSVNfRTEoYnApKQotCQlibngyeF9zZXRfbWFjX2FkZHJfZTFfZ2VuKGJwLCBzZXQsIGJwLT5pc2NzaV9tYWMsCi0JCQkJICBjbF9iaXRfdmVjLCAoQlBfUE9SVChicCkgPyAzMiA6IDApICsgMiwKLQkJCQkgIDEpOwotCWVsc2UKLQkJLyogQ0FNIGFsbG9jYXRpb24gZm9yIEUxSAotCQkqIHVuaWNhc3RzOiBieSBmdW5jIG51bWJlcgotCQkqIG11bHRpY2FzdDogMjArRlVOQyoyMCwgMjAgZWFjaAotCQkqLwotCQlibngyeF9zZXRfbWFjX2FkZHJfZTFoX2dlbihicCwgc2V0LCBicC0+aXNjc2lfbWFjLAotCQkJCSAgIGNsX2JpdF92ZWMsIEUxSF9GVU5DX01BWCArIEJQX0ZVTkMoYnApKTsKLQotCS8qIFdhaXQgZm9yIGEgY29tcGxldGlvbiB3aGVuIHNldHRpbmcgKi8KLQlibngyeF93YWl0X3JhbXJvZChicCwgMCwgMCwgJmJwLT5zZXRfbWFjX3BlbmRpbmcsIHNldCA/IDAgOiAxKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYm54Mnhfc2V0dXBfbGVhZGluZyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCByYzsKLQotCS8qIHJlc2V0IElHVSBzdGF0ZSAqLwotCWJueDJ4X2Fja19zYihicCwgYnAtPmZwWzBdLnNiX2lkLCBDU1RPUk1fSUQsIDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKLQotCS8qIFNFVFVQIHJhbXJvZCAqLwotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1BPUlRfU0VUVVAsIDAsIDAsIDAsIDApOwotCi0JLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLwotCXJjID0gYm54Mnhfd2FpdF9yYW1yb2QoYnAsIEJOWDJYX1NUQVRFX09QRU4sIDAsICYoYnAtPnN0YXRlKSwgMCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfc2V0dXBfbXVsdGkoc3RydWN0IGJueDJ4ICpicCwgaW50IGluZGV4KQotewotCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2luZGV4XTsKLQotCS8qIHJlc2V0IElHVSBzdGF0ZSAqLwotCWJueDJ4X2Fja19zYihicCwgZnAtPnNiX2lkLCBDU1RPUk1fSUQsIDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKLQotCS8qIFNFVFVQIHJhbXJvZCAqLwotCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX09QRU5JTkc7Ci0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfQ0xJRU5UX1NFVFVQLCBpbmRleCwgMCwKLQkJICAgICAgZnAtPmNsX2lkLCAwKTsKLQotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlyZXR1cm4gYm54Mnhfd2FpdF9yYW1yb2QoYnAsIEJOWDJYX0ZQX1NUQVRFX09QRU4sIGluZGV4LAotCQkJCSAmKGZwLT5zdGF0ZSksIDApOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KTsKLQotc3RhdGljIHZvaWQgYm54Mnhfc2V0X251bV9xdWV1ZXNfbXNpeChzdHJ1Y3QgYm54MnggKmJwKQotewotCi0Jc3dpdGNoIChicC0+bXVsdGlfbW9kZSkgewotCWNhc2UgRVRIX1JTU19NT0RFX0RJU0FCTEVEOgotCQlicC0+bnVtX3F1ZXVlcyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBFVEhfUlNTX01PREVfUkVHVUxBUjoKLQkJaWYgKG51bV9xdWV1ZXMpCi0JCQlicC0+bnVtX3F1ZXVlcyA9IG1pbl90KHUzMiwgbnVtX3F1ZXVlcywKLQkJCQkJCSAgQk5YMlhfTUFYX1FVRVVFUyhicCkpOwotCQllbHNlCi0JCQlicC0+bnVtX3F1ZXVlcyA9IG1pbl90KHUzMiwgbnVtX29ubGluZV9jcHVzKCksCi0JCQkJCQkgIEJOWDJYX01BWF9RVUVVRVMoYnApKTsKLQkJYnJlYWs7Ci0KLQotCWRlZmF1bHQ6Ci0JCWJwLT5udW1fcXVldWVzID0gMTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldF9udW1fcXVldWVzKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoaW50X21vZGUpIHsKLQljYXNlIElOVF9NT0RFX0lOVHg6Ci0JY2FzZSBJTlRfTU9ERV9NU0k6Ci0JCWJwLT5udW1fcXVldWVzID0gMTsKLQkJRFAoTkVUSUZfTVNHX0lGVVAsICJzZXQgbnVtYmVyIG9mIHF1ZXVlcyB0byAxXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogU2V0IG51bWJlciBvZiBxdWV1ZXMgYWNjb3JkaW5nIHRvIGJwLT5tdWx0aV9tb2RlIHZhbHVlICovCi0JCWJueDJ4X3NldF9udW1fcXVldWVzX21zaXgoYnApOwotCi0JCURQKE5FVElGX01TR19JRlVQLCAic2V0IG51bWJlciBvZiBxdWV1ZXMgdG8gJWRcbiIsCi0JCSAgIGJwLT5udW1fcXVldWVzKTsKLQotCQkvKiBpZiB3ZSBjYW4ndCB1c2UgTVNJLVggd2Ugb25seSBuZWVkIG9uZSBmcCwKLQkJICogc28gdHJ5IHRvIGVuYWJsZSBNU0ktWCB3aXRoIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGZwJ3MKLQkJICogYW5kIGZhbGxiYWNrIHRvIE1TSSBvciBsZWdhY3kgSU5UeCB3aXRoIG9uZSBmcAotCQkgKi8KLQkJcmMgPSBibngyeF9lbmFibGVfbXNpeChicCk7Ci0JCWlmIChyYykKLQkJCS8qIGZhaWxlZCB0byBlbmFibGUgTVNJLVggKi8KLQkJCWJwLT5udW1fcXVldWVzID0gMTsKLQkJYnJlYWs7Ci0JfQotCWJwLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA9IGJwLT5udW1fcXVldWVzOwotCXJldHVybiByYzsKLX0KLQotI2lmZGVmIEJDTV9DTklDCi1zdGF0aWMgaW50IGJueDJ4X2NuaWNfbm90aWZ5KHN0cnVjdCBibngyeCAqYnAsIGludCBjbWQpOwotc3RhdGljIHZvaWQgYm54Mnhfc2V0dXBfY25pY19pcnFfaW5mbyhzdHJ1Y3QgYm54MnggKmJwKTsKLSNlbmRpZgotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLwotc3RhdGljIGludCBibngyeF9uaWNfbG9hZChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbG9hZF9tb2RlKQotewotCXUzMiBsb2FkX2NvZGU7Ci0JaW50IGksIHJjOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm4gLUVQRVJNOwotI2VuZGlmCi0KLQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X0xPQUQ7Ci0KLQlyYyA9IGJueDJ4X3NldF9udW1fcXVldWVzKGJwKTsKLQotCWlmIChibngyeF9hbGxvY19tZW0oYnApKSB7Ci0JCWJueDJ4X2ZyZWVfaXJxKGJwLCB0cnVlKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZm9yX2VhY2hfcXVldWUoYnAsIGkpCi0JCWJueDJ4X2ZwKGJwLCBpLCBkaXNhYmxlX3RwYSkgPQotCQkJCQkoKGJwLT5mbGFncyAmIFRQQV9FTkFCTEVfRkxBRykgPT0gMCk7Ci0KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQkJbmV0aWZfbmFwaV9hZGQoYnAtPmRldiwgJmJueDJ4X2ZwKGJwLCBpLCBuYXBpKSwKLQkJCSAgICAgICBibngyeF9wb2xsLCAxMjgpOwotCi0JYm54MnhfbmFwaV9lbmFibGUoYnApOwotCi0JaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgewotCQlyYyA9IGJueDJ4X3JlcV9tc2l4X2lycXMoYnApOwotCQlpZiAocmMpIHsKLQkJCWJueDJ4X2ZyZWVfaXJxKGJwLCB0cnVlKTsKLQkJCWdvdG8gbG9hZF9lcnJvcjE7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBGYWxsIHRvIElOVHggaWYgZmFpbGVkIHRvIGVuYWJsZSBNU0ktWCBkdWUgdG8gbGFjayBvZgotCQkgICBtZW1vcnkgKGluIGJueDJ4X3NldF9udW1fcXVldWVzKCkpICovCi0JCWlmICgocmMgIT0gLUVOT01FTSkgJiYgKGludF9tb2RlICE9IElOVF9NT0RFX0lOVHgpKQotCQkJYm54MnhfZW5hYmxlX21zaShicCk7Ci0JCWJueDJ4X2Fja19pbnQoYnApOwotCQlyYyA9IGJueDJ4X3JlcV9pcnEoYnApOwotCQlpZiAocmMpIHsKLQkJCUJOWDJYX0VSUigiSVJRIHJlcXVlc3QgZmFpbGVkICByYyAlZCwgYWJvcnRpbmdcbiIsIHJjKTsKLQkJCWJueDJ4X2ZyZWVfaXJxKGJwLCB0cnVlKTsKLQkJCWdvdG8gbG9hZF9lcnJvcjE7Ci0JCX0KLQkJaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSV9GTEFHKSB7Ci0JCQlicC0+ZGV2LT5pcnEgPSBicC0+cGRldi0+aXJxOwotCQkJbmV0ZGV2X2luZm8oYnAtPmRldiwgInVzaW5nIE1TSSAgSVJRICVkXG4iLAotCQkJCSAgICBicC0+cGRldi0+aXJxKTsKLQkJfQotCX0KLQotCS8qIFNlbmQgTE9BRF9SRVFVRVNUIGNvbW1hbmQgdG8gTUNQCi0JICAgUmV0dXJucyB0aGUgdHlwZSBvZiBMT0FEIGNvbW1hbmQ6Ci0JICAgaWYgaXQgaXMgdGhlIGZpcnN0IHBvcnQgdG8gYmUgaW5pdGlhbGl6ZWQKLQkgICBjb21tb24gYmxvY2tzIHNob3VsZCBiZSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIC0gbm90Ci0JKi8KLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQlsb2FkX2NvZGUgPSBibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfTE9BRF9SRVEpOwotCQlpZiAoIWxvYWRfY29kZSkgewotCQkJQk5YMlhfRVJSKCJNQ1AgcmVzcG9uc2UgZmFpbHVyZSwgYWJvcnRpbmdcbiIpOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGxvYWRfZXJyb3IyOwotCQl9Ci0JCWlmIChsb2FkX2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX0xPQURfUkVGVVNFRCkgewotCQkJcmMgPSAtRUJVU1k7IC8qIG90aGVyIHBvcnQgaW4gZGlhZ25vc3RpYyBtb2RlICovCi0JCQlnb3RvIGxvYWRfZXJyb3IyOwotCQl9Ci0KLQl9IGVsc2UgewotCQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCi0JCURQKE5FVElGX01TR19JRlVQLCAiTk8gTUNQIC0gbG9hZCBjb3VudHMgICAgICAlZCwgJWQsICVkXG4iLAotCQkgICBsb2FkX2NvdW50WzBdLCBsb2FkX2NvdW50WzFdLCBsb2FkX2NvdW50WzJdKTsKLQkJbG9hZF9jb3VudFswXSsrOwotCQlsb2FkX2NvdW50WzEgKyBwb3J0XSsrOwotCQlEUChORVRJRl9NU0dfSUZVUCwgIk5PIE1DUCAtIG5ldyBsb2FkIGNvdW50cyAgJWQsICVkLCAlZFxuIiwKLQkJICAgbG9hZF9jb3VudFswXSwgbG9hZF9jb3VudFsxXSwgbG9hZF9jb3VudFsyXSk7Ci0JCWlmIChsb2FkX2NvdW50WzBdID09IDEpCi0JCQlsb2FkX2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT047Ci0JCWVsc2UgaWYgKGxvYWRfY291bnRbMSArIHBvcnRdID09IDEpCi0JCQlsb2FkX2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfTE9BRF9QT1JUOwotCQllbHNlCi0JCQlsb2FkX2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfTE9BRF9GVU5DVElPTjsKLQl9Ci0KLQlpZiAoKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT04pIHx8Ci0JICAgIChsb2FkX2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVCkpCi0JCWJwLT5wb3J0LnBtZiA9IDE7Ci0JZWxzZQotCQlicC0+cG9ydC5wbWYgPSAwOwotCURQKE5FVElGX01TR19MSU5LLCAicG1mICVkXG4iLCBicC0+cG9ydC5wbWYpOwotCi0JLyogSW5pdGlhbGl6ZSBIVyAqLwotCXJjID0gYm54MnhfaW5pdF9odyhicCwgbG9hZF9jb2RlKTsKLQlpZiAocmMpIHsKLQkJQk5YMlhfRVJSKCJIVyBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOwotCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfTE9BRF9ET05FKTsKLQkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX01DUCk7Ci0JCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9VTkxPQURfRE9ORSk7Ci0JCWdvdG8gbG9hZF9lcnJvcjI7Ci0JfQotCi0JLyogU2V0dXAgTklDIGludGVybmFscyBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KLQlibngyeF9uaWNfaW5pdChicCwgbG9hZF9jb2RlKTsKLQotCWlmICgobG9hZF9jb2RlID09IEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTikgJiYKLQkgICAgKGJwLT5jb21tb24uc2htZW0yX2Jhc2UpKQotCQlTSE1FTTJfV1IoYnAsIGRjY19zdXBwb3J0LAotCQkJICAoU0hNRU1fRENDX1NVUFBPUlRfRElTQUJMRV9FTkFCTEVfUEZfVExWIHwKLQkJCSAgIFNITUVNX0RDQ19TVVBQT1JUX0JBTkRXSURUSF9BTExPQ0FUSU9OX1RMVikpOwotCi0JLyogU2VuZCBMT0FEX0RPTkUgY29tbWFuZCB0byBNQ1AgKi8KLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQlsb2FkX2NvZGUgPSBibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfTE9BRF9ET05FKTsKLQkJaWYgKCFsb2FkX2NvZGUpIHsKLQkJCUJOWDJYX0VSUigiTUNQIHJlc3BvbnNlIGZhaWx1cmUsIGFib3J0aW5nXG4iKTsKLQkJCXJjID0gLUVCVVNZOwotCQkJZ290byBsb2FkX2Vycm9yMzsKLQkJfQotCX0KLQotCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX09QRU5JTkdfV0FJVDRfUE9SVDsKLQotCXJjID0gYm54Mnhfc2V0dXBfbGVhZGluZyhicCk7Ci0JaWYgKHJjKSB7Ci0JCUJOWDJYX0VSUigiU2V0dXAgbGVhZGluZyBmYWlsZWQhXG4iKTsKLSNpZm5kZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQlnb3RvIGxvYWRfZXJyb3IzOwotI2Vsc2UKLQkJYnAtPnBhbmljID0gMTsKLQkJcmV0dXJuIC1FQlVTWTsKLSNlbmRpZgotCX0KLQotCWlmIChDSElQX0lTX0UxSChicCkpCi0JCWlmIChicC0+bWZfY29uZmlnICYgRlVOQ19NRl9DRkdfRlVOQ19ESVNBQkxFRCkgewotCQkJRFAoTkVUSUZfTVNHX0lGVVAsICJtZl9jZmcgZnVuY3Rpb24gZGlzYWJsZWRcbiIpOwotCQkJYnAtPmZsYWdzIHw9IE1GX0ZVTkNfRElTOwotCQl9Ci0KLQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pIHsKLSNpZmRlZiBCQ01fQ05JQwotCQkvKiBFbmFibGUgVGltZXIgc2NhbiAqLwotCQlSRUdfV1IoYnAsIFRNX1JFR19FTl9MSU5FQVIwX1RJTUVSICsgQlBfUE9SVChicCkqNCwgMSk7Ci0jZW5kaWYKLQkJZm9yX2VhY2hfbm9uZGVmYXVsdF9xdWV1ZShicCwgaSkgewotCQkJcmMgPSBibngyeF9zZXR1cF9tdWx0aShicCwgaSk7Ci0JCQlpZiAocmMpCi0jaWZkZWYgQkNNX0NOSUMKLQkJCQlnb3RvIGxvYWRfZXJyb3I0OwotI2Vsc2UKLQkJCQlnb3RvIGxvYWRfZXJyb3IzOwotI2VuZGlmCi0JCX0KLQotCQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCQlibngyeF9zZXRfZXRoX21hY19hZGRyX2UxKGJwLCAxKTsKLQkJZWxzZQotCQkJYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMWgoYnAsIDEpOwotI2lmZGVmIEJDTV9DTklDCi0JCS8qIFNldCBpU0NTSSBMMiBNQUMgKi8KLQkJbXV0ZXhfbG9jaygmYnAtPmNuaWNfbXV0ZXgpOwotCQlpZiAoYnAtPmNuaWNfZXRoX2Rldi5kcnZfc3RhdGUgJiBDTklDX0RSVl9TVEFURV9SRUdEKSB7Ci0JCQlibngyeF9zZXRfaXNjc2lfZXRoX21hY19hZGRyKGJwLCAxKTsKLQkJCWJwLT5jbmljX2ZsYWdzIHw9IEJOWDJYX0NOSUNfRkxBR19NQUNfU0VUOwotCQkJYm54MnhfaW5pdF9zYihicCwgYnAtPmNuaWNfc2IsIGJwLT5jbmljX3NiX21hcHBpbmcsCi0JCQkJICAgICAgQ05JQ19TQl9JRChicCkpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYnAtPmNuaWNfbXV0ZXgpOwotI2VuZGlmCi0JfQotCi0JaWYgKGJwLT5wb3J0LnBtZikKLQkJYm54MnhfaW5pdGlhbF9waHlfaW5pdChicCwgbG9hZF9tb2RlKTsKLQotCS8qIFN0YXJ0IGZhc3QgcGF0aCAqLwotCXN3aXRjaCAobG9hZF9tb2RlKSB7Ci0JY2FzZSBMT0FEX05PUk1BTDoKLQkJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKSB7Ci0JCQkvKiBUeCBxdWV1ZSBzaG91bGQgYmUgb25seSByZWVuYWJsZWQgKi8KLQkJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhicC0+ZGV2KTsKLQkJfQotCQkvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGZpbHRlci4gKi8KLQkJYm54Mnhfc2V0X3J4X21vZGUoYnAtPmRldik7Ci0JCWJyZWFrOwotCi0JY2FzZSBMT0FEX09QRU46Ci0JCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoYnAtPmRldik7Ci0JCWlmIChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfT1BFTikKLQkJCW5ldGlmX3R4X2Rpc2FibGUoYnAtPmRldik7Ci0JCS8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgZmlsdGVyLiAqLwotCQlibngyeF9zZXRfcnhfbW9kZShicC0+ZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIExPQURfRElBRzoKLQkJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBmaWx0ZXIuICovCi0JCWJueDJ4X3NldF9yeF9tb2RlKGJwLT5kZXYpOwotCQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9ESUFHOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghYnAtPnBvcnQucG1mKQotCQlibngyeF9fbGlua19zdGF0dXNfdXBkYXRlKGJwKTsKLQotCS8qIHN0YXJ0IHRoZSB0aW1lciAqLwotCW1vZF90aW1lcigmYnAtPnRpbWVyLCBqaWZmaWVzICsgYnAtPmN1cnJlbnRfaW50ZXJ2YWwpOwotCi0jaWZkZWYgQkNNX0NOSUMKLQlibngyeF9zZXR1cF9jbmljX2lycV9pbmZvKGJwKTsKLQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pCi0JCWJueDJ4X2NuaWNfbm90aWZ5KGJwLCBDTklDX0NUTF9TVEFSVF9DTUQpOwotI2VuZGlmCi0JYm54MnhfaW5jX2xvYWRfY250KGJwKTsKLQotCXJldHVybiAwOwotCi0jaWZkZWYgQkNNX0NOSUMKLWxvYWRfZXJyb3I0OgotCS8qIERpc2FibGUgVGltZXIgc2NhbiAqLwotCVJFR19XUihicCwgVE1fUkVHX0VOX0xJTkVBUjBfVElNRVIgKyBCUF9QT1JUKGJwKSo0LCAwKTsKLSNlbmRpZgotbG9hZF9lcnJvcjM6Ci0JYm54MnhfaW50X2Rpc2FibGVfc3luYyhicCwgMSk7Ci0JaWYgKCFCUF9OT01DUChicCkpIHsKLQkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX01DUCk7Ci0JCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9VTkxPQURfRE9ORSk7Ci0JfQotCWJwLT5wb3J0LnBtZiA9IDA7Ci0JLyogRnJlZSBTS0JzLCBTR0VzLCBUUEEgcG9vbCBhbmQgZHJpdmVyIGludGVybmFscyAqLwotCWJueDJ4X2ZyZWVfc2ticyhicCk7Ci0JZm9yX2VhY2hfcXVldWUoYnAsIGkpCi0JCWJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKGJwLCBicC0+ZnAgKyBpLCBOVU1fUlhfU0dFKTsKLWxvYWRfZXJyb3IyOgotCS8qIFJlbGVhc2UgSVJRcyAqLwotCWJueDJ4X2ZyZWVfaXJxKGJwLCBmYWxzZSk7Ci1sb2FkX2Vycm9yMToKLQlibngyeF9uYXBpX2Rpc2FibGUoYnApOwotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQotCQluZXRpZl9uYXBpX2RlbCgmYm54MnhfZnAoYnAsIGksIG5hcGkpKTsKLQlibngyeF9mcmVlX21lbShicCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfc3RvcF9tdWx0aShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaW5kZXhdOwotCWludCByYzsKLQotCS8qIGhhbHQgdGhlIGNvbm5lY3Rpb24gKi8KLQlmcC0+c3RhdGUgPSBCTlgyWF9GUF9TVEFURV9IQUxUSU5HOwotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX0hBTFQsIGluZGV4LCAwLCBmcC0+Y2xfaWQsIDApOwotCi0JLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLwotCXJjID0gYm54Mnhfd2FpdF9yYW1yb2QoYnAsIEJOWDJYX0ZQX1NUQVRFX0hBTFRFRCwgaW5kZXgsCi0JCQkgICAgICAgJihmcC0+c3RhdGUpLCAxKTsKLQlpZiAocmMpIC8qIHRpbWVvdXQgKi8KLQkJcmV0dXJuIHJjOwotCi0JLyogZGVsZXRlIGNmYyBlbnRyeSAqLwotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX0NGQ19ERUwsIGluZGV4LCAwLCAwLCAxKTsKLQotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlyYyA9IGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9GUF9TVEFURV9DTE9TRUQsIGluZGV4LAotCQkJICAgICAgICYoZnAtPnN0YXRlKSwgMSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3N0b3BfbGVhZGluZyhzdHJ1Y3QgYm54MnggKmJwKQotewotCV9fbGUxNiBkc2Jfc3BfcHJvZF9pZHg7Ci0JLyogaWYgdGhlIG90aGVyIHBvcnQgaXMgaGFuZGxpbmcgdHJhZmZpYywKLQkgICB0aGlzIGNhbiB0YWtlIGEgbG90IG9mIHRpbWUgKi8KLQlpbnQgY250ID0gNTAwOwotCWludCByYzsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQkvKiBTZW5kIEhBTFQgcmFtcm9kICovCi0JYnAtPmZwWzBdLnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfSEFMVElORzsKLQlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9IQUxULCAwLCAwLCBicC0+ZnAtPmNsX2lkLCAwKTsKLQotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlyYyA9IGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9GUF9TVEFURV9IQUxURUQsIDAsCi0JCQkgICAgICAgJihicC0+ZnBbMF0uc3RhdGUpLCAxKTsKLQlpZiAocmMpIC8qIHRpbWVvdXQgKi8KLQkJcmV0dXJuIHJjOwotCi0JZHNiX3NwX3Byb2RfaWR4ID0gKmJwLT5kc2Jfc3BfcHJvZDsKLQotCS8qIFNlbmQgUE9SVF9ERUxFVEUgcmFtcm9kICovCi0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfUE9SVF9ERUwsIDAsIDAsIDAsIDEpOwotCi0JLyogV2FpdCBmb3IgY29tcGxldGlvbiB0byBhcnJpdmUgb24gZGVmYXVsdCBzdGF0dXMgYmxvY2sKLQkgICB3ZSBhcmUgZ29pbmcgdG8gcmVzZXQgdGhlIGNoaXAgYW55d2F5Ci0JICAgc28gdGhlcmUgaXMgbm90IG11Y2ggdG8gZG8gaWYgdGhpcyB0aW1lcyBvdXQKLQkgKi8KLQl3aGlsZSAoZHNiX3NwX3Byb2RfaWR4ID09ICpicC0+ZHNiX3NwX3Byb2QpIHsKLQkJaWYgKCFjbnQpIHsKLQkJCURQKE5FVElGX01TR19JRkRPV04sICJ0aW1lb3V0IHdhaXRpbmcgZm9yIHBvcnQgZGVsICIKLQkJCSAgICJkc2Jfc3BfcHJvZCAweCV4ICE9IGRzYl9zcF9wcm9kX2lkeCAweCV4XG4iLAotCQkJICAgKmJwLT5kc2Jfc3BfcHJvZCwgZHNiX3NwX3Byb2RfaWR4KTsKLSNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JCQlibngyeF9wYW5pYygpOwotI2VuZGlmCi0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNudC0tOwotCQltc2xlZXAoMSk7Ci0JCXJtYigpOyAvKiBSZWZyZXNoIHRoZSBkc2Jfc3BfcHJvZCAqLwotCX0KLQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X1VOTE9BRDsKLQlicC0+ZnBbMF0uc3RhdGUgPSBCTlgyWF9GUF9TVEFURV9DTE9TRUQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X2Z1bmMoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0JaW50IGJhc2UsIGk7Ci0KLQkvKiBDb25maWd1cmUgSUdVICovCi0JUkVHX1dSKGJwLCBIQ19SRUdfTEVBRElOR19FREdFXzAgKyBwb3J0KjgsIDApOwotCVJFR19XUihicCwgSENfUkVHX1RSQUlMSU5HX0VER0VfMCArIHBvcnQqOCwgMCk7Ci0KLSNpZmRlZiBCQ01fQ05JQwotCS8qIERpc2FibGUgVGltZXIgc2NhbiAqLwotCVJFR19XUihicCwgVE1fUkVHX0VOX0xJTkVBUjBfVElNRVIgKyBwb3J0KjQsIDApOwotCS8qCi0JICogV2FpdCBmb3IgYXQgbGVhc3QgMTBtcyBhbmQgdXAgdG8gMiBzZWNvbmQgZm9yIHRoZSB0aW1lcnMgc2NhbiB0bwotCSAqIGNvbXBsZXRlCi0JICovCi0JZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0JCW1zbGVlcCgxMCk7Ci0JCWlmICghUkVHX1JEKGJwLCBUTV9SRUdfTElOMF9TQ0FOX09OICsgcG9ydCo0KSkKLQkJCWJyZWFrOwotCX0KLSNlbmRpZgotCS8qIENsZWFyIElMVCAqLwotCWJhc2UgPSBGVU5DX0lMVF9CQVNFKGZ1bmMpOwotCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgSUxUX1BFUl9GVU5DOyBpKyspCi0JCWJueDJ4X2lsdF93cihicCwgaSwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X3BvcnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCXUzMiB2YWw7Ci0KLQlSRUdfV1IoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsIDApOwotCi0JLyogRG8gbm90IHJjdiBwYWNrZXRzIHRvIEJSQiAqLwotCVJFR19XUihicCwgTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0sgKyBwb3J0KjQsIDB4MCk7Ci0JLyogRG8gbm90IGRpcmVjdCByY3YgcGFja2V0cyB0aGF0IGFyZSBub3QgZm9yIE1DUCB0byB0aGUgQlJCICovCi0JUkVHX1dSKGJwLCAocG9ydCA/IE5JR19SRUdfTExIMV9CUkIxX05PVF9NQ1AgOgotCQkJICAgTklHX1JFR19MTEgwX0JSQjFfTk9UX01DUCksIDB4MCk7Ci0KLQkvKiBDb25maWd1cmUgQUVVICovCi0JUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMCArIHBvcnQqNCwgMCk7Ci0KLQltc2xlZXAoMTAwKTsKLQkvKiBDaGVjayBmb3IgQlJCIHBvcnQgb2NjdXBhbmN5ICovCi0JdmFsID0gUkVHX1JEKGJwLCBCUkIxX1JFR19QT1JUX05VTV9PQ0NfQkxPQ0tTXzAgKyBwb3J0KjQpOwotCWlmICh2YWwpCi0JCURQKE5FVElGX01TR19JRkRPV04sCi0JCSAgICJCUkIxIGlzIG5vdCBlbXB0eSAgJWQgYmxvY2tzIGFyZSBvY2N1cGllZFxuIiwgdmFsKTsKLQotCS8qIFRPRE86IENsb3NlIERvb3JiZWxsIHBvcnQ/ICovCi19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X2NoaXAoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlc2V0X2NvZGUpCi17Ci0JRFAoQk5YMlhfTVNHX01DUCwgImZ1bmN0aW9uICVkICByZXNldF9jb2RlICV4XG4iLAotCSAgIEJQX0ZVTkMoYnApLCByZXNldF9jb2RlKTsKLQotCXN3aXRjaCAocmVzZXRfY29kZSkgewotCWNhc2UgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9DT01NT046Ci0JCWJueDJ4X3Jlc2V0X3BvcnQoYnApOwotCQlibngyeF9yZXNldF9mdW5jKGJwKTsKLQkJYm54MnhfcmVzZXRfY29tbW9uKGJwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEZXX01TR19DT0RFX0RSVl9VTkxPQURfUE9SVDoKLQkJYm54MnhfcmVzZXRfcG9ydChicCk7Ci0JCWJueDJ4X3Jlc2V0X2Z1bmMoYnApOwotCQlicmVhazsKLQotCWNhc2UgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9GVU5DVElPTjoKLQkJYm54MnhfcmVzZXRfZnVuYyhicCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQk5YMlhfRVJSKCJVbmtub3duIHJlc2V0X2NvZGUgKDB4JXgpIGZyb20gTUNQXG4iLCByZXNldF9jb2RlKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibngyeF9jaGlwX2NsZWFudXAoc3RydWN0IGJueDJ4ICpicCwgaW50IHVubG9hZF9tb2RlKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JdTMyIHJlc2V0X2NvZGUgPSAwOwotCWludCBpLCBjbnQsIHJjOwotCi0JLyogV2FpdCB1bnRpbCB0eCBmYXN0cGF0aCB0YXNrcyBjb21wbGV0ZSAqLwotCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOwotCi0JCWNudCA9IDEwMDA7Ci0JCXdoaWxlIChibngyeF9oYXNfdHhfd29ya191bmxvYWQoZnApKSB7Ci0KLQkJCWJueDJ4X3R4X2ludChmcCk7Ci0JCQlpZiAoIWNudCkgewotCQkJCUJOWDJYX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBxdWV1ZVslZF1cbiIsCi0JCQkJCSAgaSk7Ci0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQkJCWJueDJ4X3BhbmljKCk7Ci0JCQkJcmV0dXJuIC1FQlVTWTsKLSNlbHNlCi0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCX0KLQkJCWNudC0tOwotCQkJbXNsZWVwKDEpOwotCQl9Ci0JfQotCS8qIEdpdmUgSFcgdGltZSB0byBkaXNjYXJkIG9sZCB0eCBtZXNzYWdlcyAqLwotCW1zbGVlcCgxKTsKLQotCWlmIChDSElQX0lTX0UxKGJwKSkgewotCQlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcgPQotCQkJCQkJYm54Mnhfc3AoYnAsIG1jYXN0X2NvbmZpZyk7Ci0KLQkJYm54Mnhfc2V0X2V0aF9tYWNfYWRkcl9lMShicCwgMCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+aGRyLmxlbmd0aDsgaSsrKQotCQkJQ0FNX0lOVkFMSURBVEUoY29uZmlnLT5jb25maWdfdGFibGVbaV0pOwotCi0JCWNvbmZpZy0+aGRyLmxlbmd0aCA9IGk7Ci0JCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJCWNvbmZpZy0+aGRyLm9mZnNldCA9IEJOWDJYX01BWF9FTVVMX01VTFRJKigxICsgcG9ydCk7Ci0JCWVsc2UKLQkJCWNvbmZpZy0+aGRyLm9mZnNldCA9IEJOWDJYX01BWF9NVUxUSUNBU1QqKDEgKyBwb3J0KTsKLQkJY29uZmlnLT5oZHIuY2xpZW50X2lkID0gYnAtPmZwLT5jbF9pZDsKLQkJY29uZmlnLT5oZHIucmVzZXJ2ZWQxID0gMDsKLQotCQlicC0+c2V0X21hY19wZW5kaW5nKys7Ci0JCXNtcF93bWIoKTsKLQotCQlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDLCAwLAotCQkJICAgICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X2NvbmZpZykpLAotCQkJICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X2NvbmZpZykpLCAwKTsKLQotCX0gZWxzZSB7IC8qIEUxSCAqLwotCQlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9GVU5DX0VOICsgcG9ydCo4LCAwKTsKLQotCQlibngyeF9zZXRfZXRoX21hY19hZGRyX2UxaChicCwgMCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1DX0hBU0hfU0laRTsgaSsrKQotCQkJUkVHX1dSKGJwLCBNQ19IQVNIX09GRlNFVChicCwgaSksIDApOwotCi0JCVJFR19XUihicCwgTUlTQ19SRUdfRTFITUZfTU9ERSwgMCk7Ci0JfQotI2lmZGVmIEJDTV9DTklDCi0JLyogQ2xlYXIgaVNDU0kgTDIgTUFDICovCi0JbXV0ZXhfbG9jaygmYnAtPmNuaWNfbXV0ZXgpOwotCWlmIChicC0+Y25pY19mbGFncyAmIEJOWDJYX0NOSUNfRkxBR19NQUNfU0VUKSB7Ci0JCWJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoYnAsIDApOwotCQlicC0+Y25pY19mbGFncyAmPSB+Qk5YMlhfQ05JQ19GTEFHX01BQ19TRVQ7Ci0JfQotCW11dGV4X3VubG9jaygmYnAtPmNuaWNfbXV0ZXgpOwotI2VuZGlmCi0KLQlpZiAodW5sb2FkX21vZGUgPT0gVU5MT0FEX05PUk1BTCkKLQkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9ESVM7Ci0KLQllbHNlIGlmIChicC0+ZmxhZ3MgJiBOT19XT0xfRkxBRykKLQkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9NQ1A7Ci0KLQllbHNlIGlmIChicC0+d29sKSB7Ci0JCXUzMiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7Ci0JCXU4ICptYWNfYWRkciA9IGJwLT5kZXYtPmRldl9hZGRyOwotCQl1MzIgdmFsOwotCQkvKiBUaGUgbWFjIGFkZHJlc3MgaXMgd3JpdHRlbiB0byBlbnRyaWVzIDEtNCB0bwotCQkgICBwcmVzZXJ2ZSBlbnRyeSAwIHdoaWNoIGlzIHVzZWQgYnkgdGhlIFBNRiAqLwotCQl1OCBlbnRyeSA9IChCUF9FMUhWTihicCkgKyAxKSo4OwotCi0JCXZhbCA9IChtYWNfYWRkclswXSA8PCA4KSB8IG1hY19hZGRyWzFdOwotCQlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01BQ19NQVRDSCArIGVudHJ5LCB2YWwpOwotCi0JCXZhbCA9IChtYWNfYWRkclsyXSA8PCAyNCkgfCAobWFjX2FkZHJbM10gPDwgMTYpIHwKLQkJICAgICAgKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07Ci0JCUVNQUNfV1IoYnAsIEVNQUNfUkVHX0VNQUNfTUFDX01BVENIICsgZW50cnkgKyA0LCB2YWwpOwotCi0JCXJlc2V0X2NvZGUgPSBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfRU47Ci0KLQl9IGVsc2UKLQkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9ESVM7Ci0KLQkvKiBDbG9zZSBtdWx0aSBhbmQgbGVhZGluZyBjb25uZWN0aW9ucwotCSAgIENvbXBsZXRpb25zIGZvciByYW1yb2RzIGFyZSBjb2xsZWN0ZWQgaW4gYSBzeW5jaHJvbm91cyB3YXkgKi8KLQlmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCBpKQotCQlpZiAoYm54Mnhfc3RvcF9tdWx0aShicCwgaSkpCi0JCQlnb3RvIHVubG9hZF9lcnJvcjsKLQotCXJjID0gYm54Mnhfc3RvcF9sZWFkaW5nKGJwKTsKLQlpZiAocmMpIHsKLQkJQk5YMlhfRVJSKCJTdG9wIGxlYWRpbmcgZmFpbGVkIVxuIik7Ci0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQlyZXR1cm4gLUVCVVNZOwotI2Vsc2UKLQkJZ290byB1bmxvYWRfZXJyb3I7Ci0jZW5kaWYKLQl9Ci0KLXVubG9hZF9lcnJvcjoKLQlpZiAoIUJQX05PTUNQKGJwKSkKLQkJcmVzZXRfY29kZSA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIHJlc2V0X2NvZGUpOwotCWVsc2UgewotCQlEUChORVRJRl9NU0dfSUZET1dOLCAiTk8gTUNQIC0gbG9hZCBjb3VudHMgICAgICAlZCwgJWQsICVkXG4iLAotCQkgICBsb2FkX2NvdW50WzBdLCBsb2FkX2NvdW50WzFdLCBsb2FkX2NvdW50WzJdKTsKLQkJbG9hZF9jb3VudFswXS0tOwotCQlsb2FkX2NvdW50WzEgKyBwb3J0XS0tOwotCQlEUChORVRJRl9NU0dfSUZET1dOLCAiTk8gTUNQIC0gbmV3IGxvYWQgY291bnRzICAlZCwgJWQsICVkXG4iLAotCQkgICBsb2FkX2NvdW50WzBdLCBsb2FkX2NvdW50WzFdLCBsb2FkX2NvdW50WzJdKTsKLQkJaWYgKGxvYWRfY291bnRbMF0gPT0gMCkKLQkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTjsKLQkJZWxzZSBpZiAobG9hZF9jb3VudFsxICsgcG9ydF0gPT0gMCkKLQkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQ7Ci0JCWVsc2UKLQkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0ZVTkNUSU9OOwotCX0KLQotCWlmICgocmVzZXRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTikgfHwKLQkgICAgKHJlc2V0X2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX1VOTE9BRF9QT1JUKSkKLQkJYm54MnhfX2xpbmtfcmVzZXQoYnApOwotCi0JLyogUmVzZXQgdGhlIGNoaXAgKi8KLQlibngyeF9yZXNldF9jaGlwKGJwLCByZXNldF9jb2RlKTsKLQotCS8qIFJlcG9ydCBVTkxPQURfRE9ORSB0byBNQ1AgKi8KLQlpZiAoIUJQX05PTUNQKGJwKSkKLQkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FKTsKLQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZGlzYWJsZV9jbG9zZV90aGVfZ2F0ZShzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiB2YWw7Ci0KLQlEUChORVRJRl9NU0dfSFcsICJEaXNhYmxpbmcgXCJjbG9zZSB0aGUgZ2F0ZXNcIlxuIik7Ci0KLQlpZiAoQ0hJUF9JU19FMShicCkpIHsKLQkJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQkJdTMyIGFkZHIgPSBwb3J0ID8gTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzEgOgotCQkJTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzA7Ci0KLQkJdmFsID0gUkVHX1JEKGJwLCBhZGRyKTsKLQkJdmFsICY9IH4oMHgzMDApOwotCQlSRUdfV1IoYnAsIGFkZHIsIHZhbCk7Ci0JfSBlbHNlIGlmIChDSElQX0lTX0UxSChicCkpIHsKLQkJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9NQVNLKTsKLQkJdmFsICY9IH4oTUlTQ19BRVVfR0VORVJBTF9NQVNLX1JFR19BRVVfUFhQX0NMT1NFX01BU0sgfAotCQkJIE1JU0NfQUVVX0dFTkVSQUxfTUFTS19SRUdfQUVVX05JR19DTE9TRV9NQVNLKTsKLQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9NQVNLLCB2YWwpOwotCX0KLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KLXN0YXRpYyBpbnQgYm54MnhfbmljX3VubG9hZChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgdW5sb2FkX21vZGUpCi17Ci0JaW50IGk7Ci0KLQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX0NMT1NFRCkgewotCQkvKiBJbnRlcmZhY2UgaGFzIGJlZW4gcmVtb3ZlZCAtIG5vdGhpbmcgdG8gcmVjb3ZlciAqLwotCQlicC0+cmVjb3Zlcnlfc3RhdGUgPSBCTlgyWF9SRUNPVkVSWV9ET05FOwotCQlicC0+aXNfbGVhZGVyID0gMDsKLQkJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KTsKLQkJc21wX3dtYigpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotI2lmZGVmIEJDTV9DTklDCi0JYm54MnhfY25pY19ub3RpZnkoYnAsIENOSUNfQ1RMX1NUT1BfQ01EKTsKLSNlbmRpZgotCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfSEFMVDsKLQotCS8qIFNldCAiZHJvcCBhbGwiICovCi0JYnAtPnJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7Ci0JYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUoYnApOwotCi0JLyogRGlzYWJsZSBIVyBpbnRlcnJ1cHRzLCBOQVBJIGFuZCBUeCAqLwotCWJueDJ4X25ldGlmX3N0b3AoYnAsIDEpOwotCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOwotCi0JZGVsX3RpbWVyX3N5bmMoJmJwLT50aW1lcik7Ci0JU0hNRU1fV1IoYnAsIGZ1bmNfbWJbQlBfRlVOQyhicCldLmRydl9wdWxzZV9tYiwKLQkJIChEUlZfUFVMU0VfQUxXQVlTX0FMSVZFIHwgYnAtPmZ3X2Rydl9wdWxzZV93cl9zZXEpKTsKLQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOwotCi0JLyogUmVsZWFzZSBJUlFzICovCi0JYm54MnhfZnJlZV9pcnEoYnAsIGZhbHNlKTsKLQotCS8qIENsZWFudXAgdGhlIGNoaXAgaWYgbmVlZGVkICovCi0JaWYgKHVubG9hZF9tb2RlICE9IFVOTE9BRF9SRUNPVkVSWSkKLQkJYm54MnhfY2hpcF9jbGVhbnVwKGJwLCB1bmxvYWRfbW9kZSk7Ci0KLQlicC0+cG9ydC5wbWYgPSAwOwotCi0JLyogRnJlZSBTS0JzLCBTR0VzLCBUUEEgcG9vbCBhbmQgZHJpdmVyIGludGVybmFscyAqLwotCWJueDJ4X2ZyZWVfc2ticyhicCk7Ci0JZm9yX2VhY2hfcXVldWUoYnAsIGkpCi0JCWJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKGJwLCBicC0+ZnAgKyBpLCBOVU1fUlhfU0dFKTsKLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQkJbmV0aWZfbmFwaV9kZWwoJmJueDJ4X2ZwKGJwLCBpLCBuYXBpKSk7Ci0JYm54MnhfZnJlZV9tZW0oYnApOwotCi0JYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0VEOwotCi0JLyogVGhlIGxhc3QgZHJpdmVyIG11c3QgZGlzYWJsZSBhICJjbG9zZSB0aGUgZ2F0ZSIgaWYgdGhlcmUgaXMgbm8KLQkgKiBwYXJpdHkgYXR0ZW50aW9uIG9yICJwcm9jZXNzIGtpbGwiIHBlbmRpbmcuCi0JICovCi0JaWYgKCghYm54MnhfZGVjX2xvYWRfY250KGJwKSkgJiYgKCFibngyeF9jaGtfcGFyaXR5X2F0dG4oYnApKSAmJgotCSAgICBibngyeF9yZXNldF9pc19kb25lKGJwKSkKLQkJYm54MnhfZGlzYWJsZV9jbG9zZV90aGVfZ2F0ZShicCk7Ci0KLQkvKiBSZXNldCBNQ1AgbWFpbCBib3ggc2VxdWVuY2UgaWYgdGhlcmUgaXMgb24gZ29pbmcgcmVjb3ZlcnkgKi8KLQlpZiAodW5sb2FkX21vZGUgPT0gVU5MT0FEX1JFQ09WRVJZKQotCQlicC0+Zndfc2VxID0gMDsKLQotCXJldHVybiAwOwotfQotCi0vKiBDbG9zZSBnYXRlcyAjMiwgIzMgYW5kICM0OiAqLwotc3RhdGljIHZvaWQgYm54Mnhfc2V0XzIzNF9nYXRlcyhzdHJ1Y3QgYm54MnggKmJwLCBib29sIGNsb3NlKQotewotCXUzMiB2YWwsIGFkZHI7Ci0KLQkvKiBHYXRlcyAjMiBhbmQgIzRhIGFyZSBjbG9zZWQvb3BlbmVkIGZvciAibm90IEUxIiBvbmx5ICovCi0JaWYgKCFDSElQX0lTX0UxKGJwKSkgewotCQkvKiAjNCAqLwotCQl2YWwgPSBSRUdfUkQoYnAsIFBYUF9SRUdfSFNUX0RJU0NBUkRfRE9PUkJFTExTKTsKLQkJUkVHX1dSKGJwLCBQWFBfUkVHX0hTVF9ESVNDQVJEX0RPT1JCRUxMUywKLQkJICAgICAgIGNsb3NlID8gKHZhbCB8IDB4MSkgOiAodmFsICYgKH4odTMyKTEpKSk7Ci0JCS8qICMyICovCi0JCXZhbCA9IFJFR19SRChicCwgUFhQX1JFR19IU1RfRElTQ0FSRF9JTlRFUk5BTF9XUklURVMpOwotCQlSRUdfV1IoYnAsIFBYUF9SRUdfSFNUX0RJU0NBUkRfSU5URVJOQUxfV1JJVEVTLAotCQkgICAgICAgY2xvc2UgPyAodmFsIHwgMHgxKSA6ICh2YWwgJiAofih1MzIpMSkpKTsKLQl9Ci0KLQkvKiAjMyAqLwotCWFkZHIgPSBCUF9QT1JUKGJwKSA/IEhDX1JFR19DT05GSUdfMSA6IEhDX1JFR19DT05GSUdfMDsKLQl2YWwgPSBSRUdfUkQoYnAsIGFkZHIpOwotCVJFR19XUihicCwgYWRkciwgKCFjbG9zZSkgPyAodmFsIHwgMHgxKSA6ICh2YWwgJiAofih1MzIpMSkpKTsKLQotCURQKE5FVElGX01TR19IVywgIiVzIGdhdGVzICMyLCAjMyBhbmQgIzRcbiIsCi0JCWNsb3NlID8gImNsb3NpbmciIDogIm9wZW5pbmciKTsKLQltbWlvd2IoKTsKLX0KLQotI2RlZmluZSBTSEFSRURfTUZfQ0xQX01BR0lDICAweDgwMDAwMDAwIC8qIGBtYWdpYycgYml0ICovCi0KLXN0YXRpYyB2b2lkIGJueDJ4X2NscF9yZXNldF9wcmVwKHN0cnVjdCBibngyeCAqYnAsIHUzMiAqbWFnaWNfdmFsKQotewotCS8qIERvIHNvbWUgbWFnaWMuLi4gKi8KLQl1MzIgdmFsID0gTUZfQ0ZHX1JEKGJwLCBzaGFyZWRfbWZfY29uZmlnLmNscF9tYik7Ci0JKm1hZ2ljX3ZhbCA9IHZhbCAmIFNIQVJFRF9NRl9DTFBfTUFHSUM7Ci0JTUZfQ0ZHX1dSKGJwLCBzaGFyZWRfbWZfY29uZmlnLmNscF9tYiwgdmFsIHwgU0hBUkVEX01GX0NMUF9NQUdJQyk7Ci19Ci0KLS8qIFJlc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBgbWFnaWMnIGJpdC4KLSAqCi0gKiBAcGFyYW0gcGRldiBEZXZpY2UgaGFuZGxlLgotICogQHBhcmFtIG1hZ2ljX3ZhbCBPbGQgdmFsdWUgb2YgdGhlIGBtYWdpYycgYml0LgotICovCi1zdGF0aWMgdm9pZCBibngyeF9jbHBfcmVzZXRfZG9uZShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgbWFnaWNfdmFsKQotewotCS8qIFJlc3RvcmUgdGhlIGBtYWdpYycgYml0IHZhbHVlLi4uICovCi0JLyogdTMyIHZhbCA9IFNITUVNX1JEKGJwLCBtZl9jZmcuc2hhcmVkX21mX2NvbmZpZy5jbHBfbWIpOwotCVNITUVNX1dSKGJwLCBtZl9jZmcuc2hhcmVkX21mX2NvbmZpZy5jbHBfbWIsCi0JCSh2YWwgJiAoflNIQVJFRF9NRl9DTFBfTUFHSUMpKSB8IG1hZ2ljX3ZhbCk7ICovCi0JdTMyIHZhbCA9IE1GX0NGR19SRChicCwgc2hhcmVkX21mX2NvbmZpZy5jbHBfbWIpOwotCU1GX0NGR19XUihicCwgc2hhcmVkX21mX2NvbmZpZy5jbHBfbWIsCi0JCSh2YWwgJiAoflNIQVJFRF9NRl9DTFBfTUFHSUMpKSB8IG1hZ2ljX3ZhbCk7Ci19Ci0KLS8qIFByZXBhcmVzIGZvciBNQ1AgcmVzZXQ6IHRha2VzIGNhcmUgb2YgQ0xQIGNvbmZpZ3VyYXRpb25zLgotICoKLSAqIEBwYXJhbSBicAotICogQHBhcmFtIG1hZ2ljX3ZhbCBPbGQgdmFsdWUgb2YgJ21hZ2ljJyBiaXQuCi0gKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X21jcF9wcmVwKHN0cnVjdCBibngyeCAqYnAsIHUzMiAqbWFnaWNfdmFsKQotewotCXUzMiBzaG1lbTsKLQl1MzIgdmFsaWRpdHlfb2Zmc2V0OwotCi0JRFAoTkVUSUZfTVNHX0hXLCAiU3RhcnRpbmdcbiIpOwotCi0JLyogU2V0IGBtYWdpYycgYml0IGluIG9yZGVyIHRvIHNhdmUgTUYgY29uZmlnICovCi0JaWYgKCFDSElQX0lTX0UxKGJwKSkKLQkJYm54MnhfY2xwX3Jlc2V0X3ByZXAoYnAsIG1hZ2ljX3ZhbCk7Ci0KLQkvKiBHZXQgc2htZW0gb2Zmc2V0ICovCi0Jc2htZW0gPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUik7Ci0JdmFsaWRpdHlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgdmFsaWRpdHlfbWFwWzBdKTsKLQotCS8qIENsZWFyIHZhbGlkaXR5IG1hcCBmbGFncyAqLwotCWlmIChzaG1lbSA+IDApCi0JCVJFR19XUihicCwgc2htZW0gKyB2YWxpZGl0eV9vZmZzZXQsIDApOwotfQotCi0jZGVmaW5lIE1DUF9USU1FT1VUICAgICAgNTAwMCAgIC8qIDUgc2Vjb25kcyAoaW4gbXMpICovCi0jZGVmaW5lIE1DUF9PTkVfVElNRU9VVCAgMTAwICAgIC8qIDEwMCBtcyAqLwotCi0vKiBXYWl0cyBmb3IgTUNQX09ORV9USU1FT1VUIG9yIE1DUF9PTkVfVElNRU9VVCoxMCwKLSAqIGRlcGVuZGluZyBvbiB0aGUgSFcgdHlwZS4KLSAqCi0gKiBAcGFyYW0gYnAKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X21jcF93YWl0X29uZShzdHJ1Y3QgYm54MnggKmJwKQotewotCS8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVtdWxhdGlvbiBhbmQgRlBHQSwKLQkgICB3YWl0IDEwIHRpbWVzIGxvbmdlciAqLwotCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJbXNsZWVwKE1DUF9PTkVfVElNRU9VVCoxMCk7Ci0JZWxzZQotCQltc2xlZXAoTUNQX09ORV9USU1FT1VUKTsKLX0KLQotc3RhdGljIGludCBibngyeF9yZXNldF9tY3BfY29tcChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgbWFnaWNfdmFsKQotewotCXUzMiBzaG1lbSwgY250LCB2YWxpZGl0eV9vZmZzZXQsIHZhbDsKLQlpbnQgcmMgPSAwOwotCi0JbXNsZWVwKDEwMCk7Ci0KLQkvKiBHZXQgc2htZW0gb2Zmc2V0ICovCi0Jc2htZW0gPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUik7Ci0JaWYgKHNobWVtID09IDApIHsKLQkJQk5YMlhfRVJSKCJTaG1lbSAwIHJldHVybiBmYWlsdXJlXG4iKTsKLQkJcmMgPSAtRU5PVFRZOwotCQlnb3RvIGV4aXRfbGJsOwotCX0KLQotCXZhbGlkaXR5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sIHZhbGlkaXR5X21hcFswXSk7Ci0KLQkvKiBXYWl0IGZvciBNQ1AgdG8gY29tZSB1cCAqLwotCWZvciAoY250ID0gMDsgY250IDwgKE1DUF9USU1FT1VUIC8gTUNQX09ORV9USU1FT1VUKTsgY250KyspIHsKLQkJLyogVEJEOiBpdHMgYmVzdCB0byBjaGVjayB2YWxpZGl0eSBtYXAgb2YgbGFzdCBwb3J0LgotCQkgKiBjdXJyZW50bHkgY2hlY2tzIG9uIHBvcnQgMC4KLQkJICovCi0JCXZhbCA9IFJFR19SRChicCwgc2htZW0gKyB2YWxpZGl0eV9vZmZzZXQpOwotCQlEUChORVRJRl9NU0dfSFcsICJzaG1lbSAweCV4IHZhbGlkaXR5IG1hcCgweCV4KT0weCV4XG4iLCBzaG1lbSwKLQkJICAgc2htZW0gKyB2YWxpZGl0eV9vZmZzZXQsIHZhbCk7Ci0KLQkJLyogY2hlY2sgdGhhdCBzaGFyZWQgbWVtb3J5IGlzIHZhbGlkLiAqLwotCQlpZiAoKHZhbCAmIChTSFJfTUVNX1ZBTElESVRZX0RFVl9JTkZPIHwgU0hSX01FTV9WQUxJRElUWV9NQikpCi0JCSAgICA9PSAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1fVkFMSURJVFlfTUIpKQotCQkJYnJlYWs7Ci0KLQkJYm54MnhfbWNwX3dhaXRfb25lKGJwKTsKLQl9Ci0KLQlEUChORVRJRl9NU0dfSFcsICJDbnQ9JWQgU2htZW0gdmFsaWRpdHkgbWFwIDB4JXhcbiIsIGNudCwgdmFsKTsKLQotCS8qIENoZWNrIHRoYXQgc2hhcmVkIG1lbW9yeSBpcyB2YWxpZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBNQ1AgaXMgdXAuICovCi0JaWYgKCh2YWwgJiAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1fVkFMSURJVFlfTUIpKSAhPQotCSAgICAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1fVkFMSURJVFlfTUIpKSB7Ci0JCUJOWDJYX0VSUigiU2htZW0gc2lnbmF0dXJlIG5vdCBwcmVzZW50LiBNQ1AgaXMgbm90IHVwICEhXG4iKTsKLQkJcmMgPSAtRU5PVFRZOwotCQlnb3RvIGV4aXRfbGJsOwotCX0KLQotZXhpdF9sYmw6Ci0JLyogUmVzdG9yZSB0aGUgYG1hZ2ljJyBiaXQgdmFsdWUgKi8KLQlpZiAoIUNISVBfSVNfRTEoYnApKQotCQlibngyeF9jbHBfcmVzZXRfZG9uZShicCwgbWFnaWNfdmFsKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfcHhwX3ByZXAoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoIUNISVBfSVNfRTEoYnApKSB7Ci0JCVJFR19XUihicCwgUFhQMl9SRUdfUkRfU1RBUlRfSU5JVCwgMCk7Ci0JCVJFR19XUihicCwgUFhQMl9SRUdfUlFfUkJDX0RPTkUsIDApOwotCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0NGR19ET05FLCAwKTsKLQkJbW1pb3diKCk7Ci0JfQotfQotCi0vKgotICogUmVzZXQgdGhlIHdob2xlIGNoaXAgZXhjZXB0IGZvcjoKLSAqICAgICAgLSBQQ0lFIGNvcmUKLSAqICAgICAgLSBQQ0kgR2x1ZSwgUFNXSFNULCBQWFAvUFhQMiBSRiAoYWxsIGNvbnRyb2xsZWQgYnkKLSAqICAgICAgICAgICAgICBvbmUgcmVzZXQgYml0KQotICogICAgICAtIElHVQotICogICAgICAtIE1JU0MgKGluY2x1ZGluZyBBRVUpCi0gKiAgICAgIC0gR1JDCi0gKiAgICAgIC0gUkJDTiwgUkJDUAotICovCi1zdGF0aWMgdm9pZCBibngyeF9wcm9jZXNzX2tpbGxfY2hpcF9yZXNldChzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiBub3RfcmVzZXRfbWFzazEsIHJlc2V0X21hc2sxLCBub3RfcmVzZXRfbWFzazIsIHJlc2V0X21hc2syOwotCi0Jbm90X3Jlc2V0X21hc2sxID0KLQkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfUlNUX0hDIHwKLQkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfUlNUX1BYUFYgfAotCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9SU1RfUFhQOwotCi0Jbm90X3Jlc2V0X21hc2syID0KLQkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX01ESU8gfAotCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzBfSEFSRF9DT1JFIHwKLQkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMxX0hBUkRfQ09SRSB8Ci0JCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NSVNDX0NPUkUgfAotCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfUkJDTiB8Ci0JCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9HUkMgIHwKLQkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX01DUF9OX1JFU0VUX1JFR19IQVJEX0NPUkUgfAotCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfTUNQX05fSEFSRF9DT1JFX1JTVF9COwotCi0JcmVzZXRfbWFzazEgPSAweGZmZmZmZmZmOwotCi0JaWYgKENISVBfSVNfRTEoYnApKQotCQlyZXNldF9tYXNrMiA9IDB4ZmZmZjsKLQllbHNlCi0JCXJlc2V0X21hc2syID0gMHgxZmZmZjsKLQotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIsCi0JICAgICAgIHJlc2V0X21hc2sxICYgKH5ub3RfcmVzZXRfbWFzazEpKTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCSAgICAgICByZXNldF9tYXNrMiAmICh+bm90X3Jlc2V0X21hc2syKSk7Ci0KLQliYXJyaWVyKCk7Ci0JbW1pb3diKCk7Ci0KLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1NFVCwgcmVzZXRfbWFzazEpOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULCByZXNldF9tYXNrMik7Ci0JbW1pb3diKCk7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfcHJvY2Vzc19raWxsKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGNudCA9IDEwMDA7Ci0JdTMyIHZhbCA9IDA7Ci0JdTMyIHNyX2NudCwgYmxrX2NudCwgcG9ydF9pc19pZGxlXzAsIHBvcnRfaXNfaWRsZV8xLCBwZ2xfZXhwX3JvbTI7Ci0KLQotCS8qIEVtcHR5IHRoZSBUZXRyaXMgYnVmZmVyLCB3YWl0IGZvciAxcyAqLwotCWRvIHsKLQkJc3JfY250ICA9IFJFR19SRChicCwgUFhQMl9SRUdfUkRfU1JfQ05UKTsKLQkJYmxrX2NudCA9IFJFR19SRChicCwgUFhQMl9SRUdfUkRfQkxLX0NOVCk7Ci0JCXBvcnRfaXNfaWRsZV8wID0gUkVHX1JEKGJwLCBQWFAyX1JFR19SRF9QT1JUX0lTX0lETEVfMCk7Ci0JCXBvcnRfaXNfaWRsZV8xID0gUkVHX1JEKGJwLCBQWFAyX1JFR19SRF9QT1JUX0lTX0lETEVfMSk7Ci0JCXBnbF9leHBfcm9tMiA9IFJFR19SRChicCwgUFhQMl9SRUdfUEdMX0VYUF9ST00yKTsKLQkJaWYgKChzcl9jbnQgPT0gMHg3ZSkgJiYgKGJsa19jbnQgPT0gMHhhMCkgJiYKLQkJICAgICgocG9ydF9pc19pZGxlXzAgJiAweDEpID09IDB4MSkgJiYKLQkJICAgICgocG9ydF9pc19pZGxlXzEgJiAweDEpID09IDB4MSkgJiYKLQkJICAgIChwZ2xfZXhwX3JvbTIgPT0gMHhmZmZmZmZmZikpCi0JCQlicmVhazsKLQkJbXNsZWVwKDEpOwotCX0gd2hpbGUgKGNudC0tID4gMCk7Ci0KLQlpZiAoY250IDw9IDApIHsKLQkJRFAoTkVUSUZfTVNHX0hXLCAiVGV0cmlzIGJ1ZmZlciBkaWRuJ3QgZ2V0IGVtcHR5IG9yIHRoZXJlIgotCQkJICAiIGFyZSBzdGlsbCIKLQkJCSAgIiBvdXRzdGFuZGluZyByZWFkIHJlcXVlc3RzIGFmdGVyIDFzIVxuIik7Ci0JCURQKE5FVElGX01TR19IVywgInNyX2NudD0weCUwOHgsIGJsa19jbnQ9MHglMDh4LCIKLQkJCSAgIiBwb3J0X2lzX2lkbGVfMD0weCUwOHgsIgotCQkJICAiIHBvcnRfaXNfaWRsZV8xPTB4JTA4eCwgcGdsX2V4cF9yb20yPTB4JTA4eFxuIiwKLQkJCSAgc3JfY250LCBibGtfY250LCBwb3J0X2lzX2lkbGVfMCwgcG9ydF9pc19pZGxlXzEsCi0JCQkgIHBnbF9leHBfcm9tMik7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWJhcnJpZXIoKTsKLQotCS8qIENsb3NlIGdhdGVzICMyLCAjMyBhbmQgIzQgKi8KLQlibngyeF9zZXRfMjM0X2dhdGVzKGJwLCB0cnVlKTsKLQotCS8qIFRCRDogSW5kaWNhdGUgdGhhdCAicHJvY2VzcyBraWxsIiBpcyBpbiBwcm9ncmVzcyB0byBNQ1AgKi8KLQotCS8qIENsZWFyICJ1bnByZXBhcmVkIiBiaXQgKi8KLQlSRUdfV1IoYnAsIE1JU0NfUkVHX1VOUFJFUEFSRUQsIDApOwotCWJhcnJpZXIoKTsKLQotCS8qIE1ha2Ugc3VyZSBhbGwgaXMgd3JpdHRlbiB0byB0aGUgY2hpcCBiZWZvcmUgdGhlIHJlc2V0ICovCi0JbW1pb3diKCk7Ci0KLQkvKiBXYWl0IGZvciAxbXMgdG8gZW1wdHkgR0xVRSBhbmQgUENJLUUgY29yZSBxdWV1ZXMsCi0JICogUFNXSFNULCBHUkMgYW5kIFBTV1JEIFRldHJpcyBidWZmZXIuCi0JICovCi0JbXNsZWVwKDEpOwotCi0JLyogUHJlcGFyZSB0byBjaGlwIHJlc2V0OiAqLwotCS8qIE1DUCAqLwotCWJueDJ4X3Jlc2V0X21jcF9wcmVwKGJwLCAmdmFsKTsKLQotCS8qIFBYUCAqLwotCWJueDJ4X3B4cF9wcmVwKGJwKTsKLQliYXJyaWVyKCk7Ci0KLQkvKiByZXNldCB0aGUgY2hpcCAqLwotCWJueDJ4X3Byb2Nlc3Nfa2lsbF9jaGlwX3Jlc2V0KGJwKTsKLQliYXJyaWVyKCk7Ci0KLQkvKiBSZWNvdmVyIGFmdGVyIHJlc2V0OiAqLwotCS8qIE1DUCAqLwotCWlmIChibngyeF9yZXNldF9tY3BfY29tcChicCwgdmFsKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQkvKiBQWFAgKi8KLQlibngyeF9weHBfcHJlcChicCk7Ci0KLQkvKiBPcGVuIHRoZSBnYXRlcyAjMiwgIzMgYW5kICM0ICovCi0JYm54Mnhfc2V0XzIzNF9nYXRlcyhicCwgZmFsc2UpOwotCi0JLyogVEJEOiBJR1UvQUVVIHByZXBhcmF0aW9uIGJyaW5nIGJhY2sgdGhlIEFFVS9JR1UgdG8gYQotCSAqIHJlc2V0IHN0YXRlLCByZS1lbmFibGUgYXR0ZW50aW9ucy4gKi8KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2xlYWRlcl9yZXNldChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCByYyA9IDA7Ci0JLyogVHJ5IHRvIHJlY292ZXIgYWZ0ZXIgdGhlIGZhaWx1cmUgKi8KLQlpZiAoYm54MnhfcHJvY2Vzc19raWxsKGJwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTb21ldGhpbmcgYmFkIGhhZCBoYXBwZW4hIEFpaSFcbiIsCi0JCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKLQkJcmMgPSAtRUFHQUlOOwotCQlnb3RvIGV4aXRfbGVhZGVyX3Jlc2V0OwotCX0KLQotCS8qIENsZWFyICJyZXNldCBpcyBpbiBwcm9ncmVzcyIgYml0IGFuZCB1cGRhdGUgdGhlIGRyaXZlciBzdGF0ZSAqLwotCWJueDJ4X3NldF9yZXNldF9kb25lKGJwKTsKLQlicC0+cmVjb3Zlcnlfc3RhdGUgPSBCTlgyWF9SRUNPVkVSWV9ET05FOwotCi1leGl0X2xlYWRlcl9yZXNldDoKLQlicC0+aXNfbGVhZGVyID0gMDsKLQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfUkVTRVJWRURfMDgpOwotCXNtcF93bWIoKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBibngyeCAqYnAsIHBjaV9wb3dlcl90IHN0YXRlKTsKLQotLyogQXNzdW1wdGlvbjogcnVucyB1bmRlciBydG5sIGxvY2suIFRoaXMgdG9nZXRoZXIgd2l0aCB0aGUgZmFjdAotICogdGhhdCBpdCdzIGNhbGxlZCBvbmx5IGZyb20gYm54MnhfcmVzZXRfdGFzaygpIGVuc3VyZSB0aGF0IGl0Ci0gKiB3aWxsIG5ldmVyIGJlIGNhbGxlZCB3aGVuIG5ldGlmX3J1bm5pbmcoYnAtPmRldikgaXMgZmFsc2UuCi0gKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3Bhcml0eV9yZWNvdmVyKHN0cnVjdCBibngyeCAqYnApCi17Ci0JRFAoTkVUSUZfTVNHX0hXLCAiSGFuZGxpbmcgcGFyaXR5XG4iKTsKLQl3aGlsZSAoMSkgewotCQlzd2l0Y2ggKGJwLT5yZWNvdmVyeV9zdGF0ZSkgewotCQljYXNlIEJOWDJYX1JFQ09WRVJZX0lOSVQ6Ci0JCQlEUChORVRJRl9NU0dfSFcsICJTdGF0ZSBpcyBCTlgyWF9SRUNPVkVSWV9JTklUXG4iKTsKLQkJCS8qIFRyeSB0byBnZXQgYSBMRUFERVJfTE9DSyBIVyBsb2NrICovCi0JCQlpZiAoYm54MnhfdHJ5bG9ja19od19sb2NrKGJwLAotCQkJCUhXX0xPQ0tfUkVTT1VSQ0VfUkVTRVJWRURfMDgpKQotCQkJCWJwLT5pc19sZWFkZXIgPSAxOwotCi0JCQkvKiBTdG9wIHRoZSBkcml2ZXIgKi8KLQkJCS8qIElmIGludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkIC0gYnJlYWsgKi8KLQkJCWlmIChibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfUkVDT1ZFUlkpKQotCQkJCXJldHVybjsKLQotCQkJYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfV0FJVDsKLQkJCS8qIEVuc3VyZSAiaXNfbGVhZGVyIiBhbmQgInJlY292ZXJ5X3N0YXRlIgotCQkJICogIHVwZGF0ZSB2YWx1ZXMgYXJlIHNlZW4gb24gb3RoZXIgQ1BVcwotCQkJICovCi0JCQlzbXBfd21iKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEJOWDJYX1JFQ09WRVJZX1dBSVQ6Ci0JCQlEUChORVRJRl9NU0dfSFcsICJTdGF0ZSBpcyBCTlgyWF9SRUNPVkVSWV9XQUlUXG4iKTsKLQkJCWlmIChicC0+aXNfbGVhZGVyKSB7Ci0JCQkJdTMyIGxvYWRfY291bnRlciA9IGJueDJ4X2dldF9sb2FkX2NudChicCk7Ci0JCQkJaWYgKGxvYWRfY291bnRlcikgewotCQkJCQkvKiBXYWl0IHVudGlsIGFsbCBvdGhlciBmdW5jdGlvbnMgZ2V0Ci0JCQkJCSAqIGRvd24uCi0JCQkJCSAqLwotCQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5yZXNldF90YXNrLAotCQkJCQkJCQlIWi8xMCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBJZiBhbGwgb3RoZXIgZnVuY3Rpb25zIGdvdCBkb3duIC0KLQkJCQkJICogdHJ5IHRvIGJyaW5nIHRoZSBjaGlwIGJhY2sgdG8KLQkJCQkJICogbm9ybWFsLiBJbiBhbnkgY2FzZSBpdCdzIGFuIGV4aXQKLQkJCQkJICogcG9pbnQgZm9yIGEgbGVhZGVyLgotCQkJCQkgKi8KLQkJCQkJaWYgKGJueDJ4X2xlYWRlcl9yZXNldChicCkgfHwKLQkJCQkJYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKSkgewotCQkJCQkJcHJpbnRrKEtFUk5fRVJSIiVzOiBSZWNvdmVyeSAiCi0JCQkJCQkiaGFzIGZhaWxlZC4gUG93ZXIgY3ljbGUgaXMgIgotCQkJCQkJIm5lZWRlZC5cbiIsIGJwLT5kZXYtPm5hbWUpOwotCQkJCQkJLyogRGlzY29ubmVjdCB0aGlzIGRldmljZSAqLwotCQkJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChicC0+ZGV2KTsKLQkJCQkJCS8qIEJsb2NrIGlmdXAgZm9yIGFsbCBmdW5jdGlvbgotCQkJCQkJICogb2YgdGhpcyBBU0lDIHVudGlsCi0JCQkJCQkgKiAicHJvY2VzcyBraWxsIiBvciBwb3dlcgotCQkJCQkJICogY3ljbGUuCi0JCQkJCQkgKi8KLQkJCQkJCWJueDJ4X3NldF9yZXNldF9pbl9wcm9ncmVzcyhicCk7Ci0JCQkJCQkvKiBTaHV0IGRvd24gdGhlIHBvd2VyICovCi0JCQkJCQlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsCi0JCQkJCQkJCVBDSV9EM2hvdCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBlbHNlIHsgLyogbm9uLWxlYWRlciAqLwotCQkJCWlmICghYm54MnhfcmVzZXRfaXNfZG9uZShicCkpIHsKLQkJCQkJLyogVHJ5IHRvIGdldCBhIExFQURFUl9MT0NLIEhXIGxvY2sgYXMKLQkJCQkJICogbG9uZyBhcyBhIGZvcm1lciBsZWFkZXIgbWF5IGhhdmUKLQkJCQkJICogYmVlbiB1bmxvYWRlZCBieSB0aGUgdXNlciBvcgotCQkJCQkgKiByZWxlYXNlZCBhIGxlYWRlcnNoaXAgYnkgYW5vdGhlcgotCQkJCQkgKiByZWFzb24uCi0JCQkJCSAqLwotCQkJCQlpZiAoYm54MnhfdHJ5bG9ja19od19sb2NrKGJwLAotCQkJCQkgICAgSFdfTE9DS19SRVNPVVJDRV9SRVNFUlZFRF8wOCkpIHsKLQkJCQkJCS8qIEknbSBhIGxlYWRlciBub3chIFJlc3RhcnQgYQotCQkJCQkJICogc3dpdGNoIGNhc2UuCi0JCQkJCQkgKi8KLQkJCQkJCWJwLT5pc19sZWFkZXIgPSAxOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5yZXNldF90YXNrLAotCQkJCQkJCQlIWi8xMCk7Ci0JCQkJCXJldHVybjsKLQotCQkJCX0gZWxzZSB7IC8qIEEgbGVhZGVyIGhhcyBjb21wbGV0ZWQKLQkJCQkJICAqIHRoZSAicHJvY2VzcyBraWxsIi4gSXQncyBhbiBleGl0Ci0JCQkJCSAgKiBwb2ludCBmb3IgYSBub24tbGVhZGVyLgotCQkJCQkgICovCi0JCQkJCWJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7Ci0JCQkJCWJwLT5yZWNvdmVyeV9zdGF0ZSA9Ci0JCQkJCQlCTlgyWF9SRUNPVkVSWV9ET05FOwotCQkJCQlzbXBfd21iKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLS8qIGJueDJ4X25pY191bmxvYWQoKSBmbHVzaGVzIHRoZSBibngyeF93cSwgdGh1cyByZXNldCB0YXNrIGlzCi0gKiBzY2hlZHVsZWQgb24gYSBnZW5lcmFsIHF1ZXVlIGluIG9yZGVyIHRvIHByZXZlbnQgYSBkZWFkIGxvY2suCi0gKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueDJ4LCByZXNldF90YXNrLndvcmspOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCUJOWDJYX0VSUigicmVzZXQgdGFzayBjYWxsZWQgYnV0IFNUT1BfT05fRVJST1IgZGVmaW5lZCIKLQkJICAiIHNvIHJlc2V0IG5vdCBkb25lIHRvIGFsbG93IGRlYnVnIGR1bXAsXG4iCi0JIEtFUk5fRVJSICIgeW91IHdpbGwgbmVlZCB0byByZWJvb3Qgd2hlbiBkb25lXG4iKTsKLQlyZXR1cm47Ci0jZW5kaWYKLQotCXJ0bmxfbG9jaygpOwotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQotCQlnb3RvIHJlc2V0X3Rhc2tfZXhpdDsKLQotCWlmICh1bmxpa2VseShicC0+cmVjb3Zlcnlfc3RhdGUgIT0gQk5YMlhfUkVDT1ZFUllfRE9ORSkpCi0JCWJueDJ4X3Bhcml0eV9yZWNvdmVyKGJwKTsKLQllbHNlIHsKLQkJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX05PUk1BTCk7Ci0JCWJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7Ci0JfQotCi1yZXNldF90YXNrX2V4aXQ6Ci0JcnRubF91bmxvY2soKTsKLX0KLQotLyogZW5kIG9mIG5pYyBsb2FkL3VubG9hZCAqLwotCi0vKiBldGh0b29sX29wcyAqLwotCi0vKgotICogSW5pdCBzZXJ2aWNlIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGJueDJ4X2dldF9wcmV0ZW5kX3JlZyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZnVuYykKLXsKLQlzd2l0Y2ggKGZ1bmMpIHsKLQljYXNlIDA6IHJldHVybiBQWFAyX1JFR19QR0xfUFJFVEVORF9GVU5DX0YwOwotCWNhc2UgMToJcmV0dXJuIFBYUDJfUkVHX1BHTF9QUkVURU5EX0ZVTkNfRjE7Ci0JY2FzZSAyOglyZXR1cm4gUFhQMl9SRUdfUEdMX1BSRVRFTkRfRlVOQ19GMjsKLQljYXNlIDM6CXJldHVybiBQWFAyX1JFR19QR0xfUFJFVEVORF9GVU5DX0YzOwotCWNhc2UgNDoJcmV0dXJuIFBYUDJfUkVHX1BHTF9QUkVURU5EX0ZVTkNfRjQ7Ci0JY2FzZSA1OglyZXR1cm4gUFhQMl9SRUdfUEdMX1BSRVRFTkRfRlVOQ19GNTsKLQljYXNlIDY6CXJldHVybiBQWFAyX1JFR19QR0xfUFJFVEVORF9GVU5DX0Y2OwotCWNhc2UgNzoJcmV0dXJuIFBYUDJfUkVHX1BHTF9QUkVURU5EX0ZVTkNfRjc7Ci0JZGVmYXVsdDoKLQkJQk5YMlhfRVJSKCJVbnN1cHBvcnRlZCBmdW5jdGlvbiBpbmRleDogJWRcbiIsIGZ1bmMpOwotCQlyZXR1cm4gKHUzMikoLTEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYm54MnhfdW5kaV9pbnRfZGlzYWJsZV9lMWgoc3RydWN0IGJueDJ4ICpicCwgaW50IG9yaWdfZnVuYykKLXsKLQl1MzIgcmVnID0gYm54MnhfZ2V0X3ByZXRlbmRfcmVnKGJwLCBvcmlnX2Z1bmMpLCBuZXdfdmFsOwotCi0JLyogRmx1c2ggYWxsIG91dHN0YW5kaW5nIHdyaXRlcyAqLwotCW1taW93YigpOwotCi0JLyogUHJldGVuZCB0byBiZSBmdW5jdGlvbiAwICovCi0JUkVHX1dSKGJwLCByZWcsIDApOwotCS8qIEZsdXNoIHRoZSBHUkMgdHJhbnNhY3Rpb24gKGluIHRoZSBjaGlwKSAqLwotCW5ld192YWwgPSBSRUdfUkQoYnAsIHJlZyk7Ci0JaWYgKG5ld192YWwgIT0gMCkgewotCQlCTlgyWF9FUlIoIkhtbW0uLi4gUHJldGVuZCByZWdpc3RlciB3YXNuJ3QgdXBkYXRlZDogKDAsJWQpIVxuIiwKLQkJCSAgbmV3X3ZhbCk7Ci0JCUJVRygpOwotCX0KLQotCS8qIEZyb20gbm93IHdlIGFyZSBpbiB0aGUgImxpa2UtRTEiIG1vZGUgKi8KLQlibngyeF9pbnRfZGlzYWJsZShicCk7Ci0KLQkvKiBGbHVzaCBhbGwgb3V0c3RhbmRpbmcgd3JpdGVzICovCi0JbW1pb3diKCk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBmdW50aW9uIHNldHRpbmdzICovCi0JUkVHX1dSKGJwLCByZWcsIG9yaWdfZnVuYyk7Ci0JbmV3X3ZhbCA9IFJFR19SRChicCwgcmVnKTsKLQlpZiAobmV3X3ZhbCAhPSBvcmlnX2Z1bmMpIHsKLQkJQk5YMlhfRVJSKCJIbW1tLi4uIFByZXRlbmQgcmVnaXN0ZXIgd2Fzbid0IHVwZGF0ZWQ6ICglZCwlZCkhXG4iLAotCQkJICBvcmlnX2Z1bmMsIG5ld192YWwpOwotCQlCVUcoKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF91bmRpX2ludF9kaXNhYmxlKHN0cnVjdCBibngyeCAqYnAsIGludCBmdW5jKQotewotCWlmIChDSElQX0lTX0UxSChicCkpCi0JCWJueDJ4X3VuZGlfaW50X2Rpc2FibGVfZTFoKGJwLCBmdW5jKTsKLQllbHNlCi0JCWJueDJ4X2ludF9kaXNhYmxlKGJwKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X3VuZGlfdW5sb2FkKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbDsKLQotCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueSBkcml2ZXIgYWxyZWFkeSBsb2FkZWQgKi8KLQl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1VOUFJFUEFSRUQpOwotCWlmICh2YWwgPT0gMHgxKSB7Ci0JCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBVTkRJIGRyaXZlcgotCQkgKiBVTkRJIGRyaXZlciBpbml0aWFsaXplcyBDSUQgb2Zmc2V0IGZvciBub3JtYWwgYmVsbCB0byAweDcKLQkJICovCi0JCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9VTkRJKTsKLQkJdmFsID0gUkVHX1JEKGJwLCBET1JRX1JFR19OT1JNX0NJRF9PRlNUKTsKLQkJaWYgKHZhbCA9PSAweDcpIHsKLQkJCXUzMiByZXNldF9jb2RlID0gRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX0RJUzsKLQkJCS8qIHNhdmUgb3VyIGZ1bmMgKi8KLQkJCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0JCQl1MzIgc3dhcF9lbjsKLQkJCXUzMiBzd2FwX3ZhbDsKLQotCQkJLyogY2xlYXIgdGhlIFVOREkgaW5kaWNhdGlvbiAqLwotCQkJUkVHX1dSKGJwLCBET1JRX1JFR19OT1JNX0NJRF9PRlNULCAwKTsKLQotCQkJQk5YMlhfREVWX0lORk8oIlVOREkgaXMgYWN0aXZlISByZXNldCBkZXZpY2VcbiIpOwotCi0JCQkvKiB0cnkgdW5sb2FkIFVOREkgb24gcG9ydCAwICovCi0JCQlicC0+ZnVuYyA9IDA7Ci0JCQlicC0+Zndfc2VxID0KLQkJCSAgICAgICAoU0hNRU1fUkQoYnAsIGZ1bmNfbWJbYnAtPmZ1bmNdLmRydl9tYl9oZWFkZXIpICYKLQkJCQlEUlZfTVNHX1NFUV9OVU1CRVJfTUFTSyk7Ci0JCQlyZXNldF9jb2RlID0gYm54MnhfZndfY29tbWFuZChicCwgcmVzZXRfY29kZSk7Ci0KLQkJCS8qIGlmIFVOREkgaXMgbG9hZGVkIG9uIHRoZSBvdGhlciBwb3J0ICovCi0JCQlpZiAocmVzZXRfY29kZSAhPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTikgewotCi0JCQkJLyogc2VuZCAiRE9ORSIgZm9yIHByZXZpb3VzIHVubG9hZCAqLwotCQkJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9VTkxPQURfRE9ORSk7Ci0KLQkJCQkvKiB1bmxvYWQgVU5ESSBvbiBwb3J0IDEgKi8KLQkJCQlicC0+ZnVuYyA9IDE7Ci0JCQkJYnAtPmZ3X3NlcSA9Ci0JCQkgICAgICAgKFNITUVNX1JEKGJwLCBmdW5jX21iW2JwLT5mdW5jXS5kcnZfbWJfaGVhZGVyKSAmCi0JCQkJCURSVl9NU0dfU0VRX05VTUJFUl9NQVNLKTsKLQkJCQlyZXNldF9jb2RlID0gRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX0RJUzsKLQotCQkJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIHJlc2V0X2NvZGUpOwotCQkJfQotCi0JCQkvKiBub3cgaXQncyBzYWZlIHRvIHJlbGVhc2UgdGhlIGxvY2sgKi8KLQkJCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9VTkRJKTsKLQotCQkJYm54MnhfdW5kaV9pbnRfZGlzYWJsZShicCwgZnVuYyk7Ci0KLQkJCS8qIGNsb3NlIGlucHV0IHRyYWZmaWMgYW5kIHdhaXQgZm9yIGl0ICovCi0JCQkvKiBEbyBub3QgcmN2IHBhY2tldHMgdG8gQlJCICovCi0JCQlSRUdfV1IoYnAsCi0JCQkgICAgICAoQlBfUE9SVChicCkgPyBOSUdfUkVHX0xMSDFfQlJCMV9EUlZfTUFTSyA6Ci0JCQkJCSAgICAgTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0spLCAweDApOwotCQkJLyogRG8gbm90IGRpcmVjdCByY3YgcGFja2V0cyB0aGF0IGFyZSBub3QgZm9yIE1DUCB0bwotCQkJICogdGhlIEJSQiAqLwotCQkJUkVHX1dSKGJwLAotCQkJICAgICAgIChCUF9QT1JUKGJwKSA/IE5JR19SRUdfTExIMV9CUkIxX05PVF9NQ1AgOgotCQkJCQkgICAgICBOSUdfUkVHX0xMSDBfQlJCMV9OT1RfTUNQKSwgMHgwKTsKLQkJCS8qIGNsZWFyIEFFVSAqLwotCQkJUkVHX1dSKGJwLAotCQkJICAgICAoQlBfUE9SVChicCkgPyBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMSA6Ci0JCQkJCSAgICBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMCksIDApOwotCQkJbXNsZWVwKDEwKTsKLQotCQkJLyogc2F2ZSBOSUcgcG9ydCBzd2FwIGluZm8gKi8KLQkJCXN3YXBfdmFsID0gUkVHX1JEKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCk7Ci0JCQlzd2FwX2VuID0gUkVHX1JEKGJwLCBOSUdfUkVHX1NUUkFQX09WRVJSSURFKTsKLQkJCS8qIHJlc2V0IGRldmljZSAqLwotCQkJUkVHX1dSKGJwLAotCQkJICAgICAgIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLAotCQkJICAgICAgIDB4ZDNmZmZmZmYpOwotCQkJUkVHX1dSKGJwLAotCQkJICAgICAgIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCQkJICAgICAgIDB4MTQwMyk7Ci0JCQkvKiB0YWtlIHRoZSBOSUcgb3V0IG9mIHJlc2V0IGFuZCByZXN0b3JlIHN3YXAgdmFsdWVzICovCi0JCQlSRUdfV1IoYnAsCi0JCQkgICAgICAgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULAotCQkJICAgICAgIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1JTVF9OSUcpOwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX1BPUlRfU1dBUCwgc3dhcF92YWwpOwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX1NUUkFQX09WRVJSSURFLCBzd2FwX2VuKTsKLQotCQkJLyogc2VuZCB1bmxvYWQgZG9uZSB0byB0aGUgTUNQICovCi0JCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfVU5MT0FEX0RPTkUpOwotCi0JCQkvKiByZXN0b3JlIG91ciBmdW5jIGFuZCBmd19zZXEgKi8KLQkJCWJwLT5mdW5jID0gZnVuYzsKLQkJCWJwLT5md19zZXEgPQotCQkJICAgICAgIChTSE1FTV9SRChicCwgZnVuY19tYlticC0+ZnVuY10uZHJ2X21iX2hlYWRlcikgJgotCQkJCURSVl9NU0dfU0VRX05VTUJFUl9NQVNLKTsKLQotCQl9IGVsc2UKLQkJCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9VTkRJKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9nZXRfY29tbW9uX2h3aW5mbyhzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiB2YWwsIHZhbDIsIHZhbDMsIHZhbDQsIGlkOwotCXUxNiBwbWM7Ci0KLQkvKiBHZXQgdGhlIGNoaXAgcmV2aXNpb24gaWQgYW5kIG51bWJlci4gKi8KLQkvKiBjaGlwIG51bToxNi0zMSwgcmV2OjEyLTE1LCBtZXRhbDo0LTExLCBib25kX2lkOjAtMyAqLwotCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfQ0hJUF9OVU0pOwotCWlkID0gKCh2YWwgJiAweGZmZmYpIDw8IDE2KTsKLQl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0NISVBfUkVWKTsKLQlpZCB8PSAoKHZhbCAmIDB4ZikgPDwgMTIpOwotCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfQ0hJUF9NRVRBTCk7Ci0JaWQgfD0gKCh2YWwgJiAweGZmKSA8PCA0KTsKLQl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0JPTkRfSUQpOwotCWlkIHw9ICh2YWwgJiAweGYpOwotCWJwLT5jb21tb24uY2hpcF9pZCA9IGlkOwotCWJwLT5saW5rX3BhcmFtcy5jaGlwX2lkID0gYnAtPmNvbW1vbi5jaGlwX2lkOwotCUJOWDJYX0RFVl9JTkZPKCJjaGlwIElEIGlzIDB4JXhcbiIsIGlkKTsKLQotCXZhbCA9IChSRUdfUkQoYnAsIDB4Mjg3NCkgJiAweDU1KTsKLQlpZiAoKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4MSkgfHwKLQkgICAgKENISVBfSVNfRTEoYnApICYmIHZhbCkgfHwgKENISVBfSVNfRTFIKGJwKSAmJiAodmFsID09IDB4NTUpKSkgewotCQlicC0+ZmxhZ3MgfD0gT05FX1BPUlRfRkxBRzsKLQkJQk5YMlhfREVWX0lORk8oInNpbmdsZSBwb3J0IGRldmljZVxuIik7Ci0JfQotCi0JdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NGRzQpOwotCWJwLT5jb21tb24uZmxhc2hfc2l6ZSA9IChOVlJBTV8xTUJfU0laRSA8PAotCQkJCSAodmFsICYgTUNQUl9OVk1fQ0ZHNF9GTEFTSF9TSVpFKSk7Ci0JQk5YMlhfREVWX0lORk8oImZsYXNoX3NpemUgMHgleCAoJWQpXG4iLAotCQkgICAgICAgYnAtPmNvbW1vbi5mbGFzaF9zaXplLCBicC0+Y29tbW9uLmZsYXNoX3NpemUpOwotCi0JYnAtPmNvbW1vbi5zaG1lbV9iYXNlID0gUkVHX1JEKGJwLCBNSVNDX1JFR19TSEFSRURfTUVNX0FERFIpOwotCWJwLT5jb21tb24uc2htZW0yX2Jhc2UgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0dFTkVSSUNfQ1JfMCk7Ci0JYnAtPmxpbmtfcGFyYW1zLnNobWVtX2Jhc2UgPSBicC0+Y29tbW9uLnNobWVtX2Jhc2U7Ci0JQk5YMlhfREVWX0lORk8oInNobWVtIG9mZnNldCAweCV4ICBzaG1lbTIgb2Zmc2V0IDB4JXhcbiIsCi0JCSAgICAgICBicC0+Y29tbW9uLnNobWVtX2Jhc2UsIGJwLT5jb21tb24uc2htZW0yX2Jhc2UpOwotCi0JaWYgKCFicC0+Y29tbW9uLnNobWVtX2Jhc2UgfHwKLQkgICAgKGJwLT5jb21tb24uc2htZW1fYmFzZSA8IDB4QTAwMDApIHx8Ci0JICAgIChicC0+Y29tbW9uLnNobWVtX2Jhc2UgPj0gMHhDMDAwMCkpIHsKLQkJQk5YMlhfREVWX0lORk8oIk1DUCBub3QgYWN0aXZlXG4iKTsKLQkJYnAtPmZsYWdzIHw9IE5PX01DUF9GTEFHOwotCQlyZXR1cm47Ci0JfQotCi0JdmFsID0gU0hNRU1fUkQoYnAsIHZhbGlkaXR5X21hcFtCUF9QT1JUKGJwKV0pOwotCWlmICgodmFsICYgKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKLQkJIT0gKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKLQkJQk5YMlhfRVJST1IoIkJBRCBNQ1AgdmFsaWRpdHkgc2lnbmF0dXJlXG4iKTsKLQotCWJwLT5jb21tb24uaHdfY29uZmlnID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnNoYXJlZF9od19jb25maWcuY29uZmlnKTsKLQlCTlgyWF9ERVZfSU5GTygiaHdfY29uZmlnIDB4JTA4eFxuIiwgYnAtPmNvbW1vbi5od19jb25maWcpOwotCi0JYnAtPmxpbmtfcGFyYW1zLmh3X2xlZF9tb2RlID0gKChicC0+Y29tbW9uLmh3X2NvbmZpZyAmCi0JCQkJCVNIQVJFRF9IV19DRkdfTEVEX01PREVfTUFTSykgPj4KLQkJCQkgICAgICAgU0hBUkVEX0hXX0NGR19MRURfTU9ERV9TSElGVCk7Ci0KLQlicC0+bGlua19wYXJhbXMuZmVhdHVyZV9jb25maWdfZmxhZ3MgPSAwOwotCXZhbCA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5zaGFyZWRfZmVhdHVyZV9jb25maWcuY29uZmlnKTsKLQlpZiAodmFsICYgU0hBUkVEX0ZFQVRfQ0ZHX09WRVJSSURFX1BSRUVNUEhBU0lTX0NGR19FTkFCTEVEKQotCQlicC0+bGlua19wYXJhbXMuZmVhdHVyZV9jb25maWdfZmxhZ3MgfD0KLQkJCQlGRUFUVVJFX0NPTkZJR19PVkVSUklERV9QUkVFTVBIQVNJU19FTkFCTEVEOwotCWVsc2UKLQkJYnAtPmxpbmtfcGFyYW1zLmZlYXR1cmVfY29uZmlnX2ZsYWdzICY9Ci0JCQkJfkZFQVRVUkVfQ09ORklHX09WRVJSSURFX1BSRUVNUEhBU0lTX0VOQUJMRUQ7Ci0KLQl2YWwgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uYmNfcmV2KSA+PiA4OwotCWJwLT5jb21tb24uYmNfdmVyID0gdmFsOwotCUJOWDJYX0RFVl9JTkZPKCJiY192ZXIgJVhcbiIsIHZhbCk7Ci0JaWYgKHZhbCA8IEJOWDJYX0JDX1ZFUikgewotCQkvKiBmb3Igbm93IG9ubHkgd2FybgotCQkgKiBsYXRlciB3ZSBtaWdodCBuZWVkIHRvIGVuZm9yY2UgdGhpcyAqLwotCQlCTlgyWF9FUlJPUigiVGhpcyBkcml2ZXIgbmVlZHMgYmNfdmVyICVYIGJ1dCBmb3VuZCAlWCwgIgotCQkJICAgICJwbGVhc2UgdXBncmFkZSBCQ1xuIiwgQk5YMlhfQkNfVkVSLCB2YWwpOwotCX0KLQlicC0+bGlua19wYXJhbXMuZmVhdHVyZV9jb25maWdfZmxhZ3MgfD0KLQkJKHZhbCA+PSBSRVFfQkNfVkVSXzRfVlJGWV9PUFRfTURMKSA/Ci0JCUZFQVRVUkVfQ09ORklHX0JDX1NVUFBPUlRTX09QVF9NRExfVlJGWSA6IDA7Ci0KLQlpZiAoQlBfRTFIVk4oYnApID09IDApIHsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsIGJwLT5wbV9jYXAgKyBQQ0lfUE1fUE1DLCAmcG1jKTsKLQkJYnAtPmZsYWdzIHw9IChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EM2NvbGQpID8gMCA6IE5PX1dPTF9GTEFHOwotCX0gZWxzZSB7Ci0JCS8qIG5vIFdPTCBjYXBhYmlsaXR5IGZvciBFMUhWTiAhPSAwICovCi0JCWJwLT5mbGFncyB8PSBOT19XT0xfRkxBRzsKLQl9Ci0JQk5YMlhfREVWX0lORk8oIiVzV29MIGNhcGFibGVcbiIsCi0JCSAgICAgICAoYnAtPmZsYWdzICYgTk9fV09MX0ZMQUcpID8gIm5vdCAiIDogIiIpOwotCi0JdmFsID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnNoYXJlZF9od19jb25maWcucGFydF9udW0pOwotCXZhbDIgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5wYXJ0X251bVs0XSk7Ci0JdmFsMyA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5zaGFyZWRfaHdfY29uZmlnLnBhcnRfbnVtWzhdKTsKLQl2YWw0ID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnNoYXJlZF9od19jb25maWcucGFydF9udW1bMTJdKTsKLQotCWRldl9pbmZvKCZicC0+cGRldi0+ZGV2LCAicGFydCBudW1iZXIgJVgtJVgtJVgtJVhcbiIsCi0JCSB2YWwsIHZhbDIsIHZhbDMsIHZhbDQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYm54MnhfbGlua19zZXR0aW5nc19zdXBwb3J0ZWQoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkJCSAgICB1MzIgc3dpdGNoX2NmZykKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0KLQlzd2l0Y2ggKHN3aXRjaF9jZmcpIHsKLQljYXNlIFNXSVRDSF9DRkdfMUc6Ci0JCUJOWDJYX0RFVl9JTkZPKCJzd2l0Y2hfY2ZnIDB4JXggKDFHKVxuIiwgc3dpdGNoX2NmZyk7Ci0KLQkJZXh0X3BoeV90eXBlID0KLQkJCVNFUkRFU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKLQkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoRGlyZWN0KVxuIiwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsKLQotCQkJYnAtPnBvcnQuc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfVFAgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfQkNNNTQ4MjoKLQkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoNTQ4MilcbiIsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSk7Ci0KLQkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfVFAgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJQk5YMlhfRVJSKCJOVlJBTSBjb25maWcgZXJyb3IuICIKLQkJCQkgICJCQUQgU2VyRGVzIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCi0JCQkJICBicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYnAtPnBvcnQucGh5X2FkZHIgPSBSRUdfUkQoYnAsIE5JR19SRUdfU0VSREVTMF9DVFJMX1BIWV9BRERSICsKLQkJCQkJICAgcG9ydCoweDEwKTsKLQkJQk5YMlhfREVWX0lORk8oInBoeV9hZGRyIDB4JXhcbiIsIGJwLT5wb3J0LnBoeV9hZGRyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNXSVRDSF9DRkdfMTBHOgotCQlCTlgyWF9ERVZfSU5GTygic3dpdGNoX2NmZyAweCV4ICgxMEcpXG4iLCBzd2l0Y2hfY2ZnKTsKLQotCQlleHRfcGh5X3R5cGUgPQotCQkJWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6Ci0JCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKERpcmVjdClcbiIsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSk7Ci0KLQkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfVFAgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzI6Ci0JCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKDgwNzIpXG4iLAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOwotCi0JCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9GSUJSRSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXV0b25lZyB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfUGF1c2UgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczOgotCQkJQk5YMlhfREVWX0lORk8oImV4dF9waHlfdHlwZSAweCV4ICg4MDczKVxuIiwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsKLQotCQkJYnAtPnBvcnQuc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6Ci0JCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKDg3MDUpXG4iLAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOwotCi0JCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDY6Ci0JCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKDg3MDYpXG4iLAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOwotCi0JCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9GSUJSRSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfUGF1c2UgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2OgotCQkJQk5YMlhfREVWX0lORk8oImV4dF9waHlfdHlwZSAweCV4ICg4NzI2KVxuIiwKLQkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsKLQotCQkJYnAtPnBvcnQuc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXV0b25lZyB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfRklCUkUgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNzoKLQkJCUJOWDJYX0RFVl9JTkZPKCJleHRfcGh5X3R5cGUgMHgleCAoODcyNylcbiIsCi0JCQkJICAgICAgIGV4dF9waHlfdHlwZSk7Ci0KLQkJCWJwLT5wb3J0LnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6Ci0JCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKFNGWDcxMDEpXG4iLAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOwotCi0JCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX1RQIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9QYXVzZSB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfQXN5bV9QYXVzZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODE6Ci0JCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKEJDTTg0ODEpXG4iLAotCQkJCSAgICAgICBleHRfcGh5X3R5cGUpOwotCi0JCQlicC0+cG9ydC5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBTVVBQT1JURURfVFAgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAotCQkJCQkgICAgICAgU1VQUE9SVEVEX1BhdXNlIHwKLQkJCQkJICAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRToKLQkJCUJOWDJYX0VSUigiWEdYUyBQSFkgRmFpbHVyZSBkZXRlY3RlZCAweCV4XG4iLAotCQkJCSAgYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgotCQkJCSAgIkJBRCBYR1hTIGV4dF9waHlfY29uZmlnIDB4JXhcbiIsCi0JCQkJICBicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYnAtPnBvcnQucGh5X2FkZHIgPSBSRUdfUkQoYnAsIE5JR19SRUdfWEdYUzBfQ1RSTF9QSFlfQUREUiArCi0JCQkJCSAgIHBvcnQqMHgxOCk7Ci0JCUJOWDJYX0RFVl9JTkZPKCJwaHlfYWRkciAweCV4XG4iLCBicC0+cG9ydC5waHlfYWRkcik7Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCTlgyWF9FUlIoIkJBRCBzd2l0Y2hfY2ZnIGxpbmtfY29uZmlnIDB4JXhcbiIsCi0JCQkgIGJwLT5wb3J0LmxpbmtfY29uZmlnKTsKLQkJcmV0dXJuOwotCX0KLQlicC0+bGlua19wYXJhbXMucGh5X2FkZHIgPSBicC0+cG9ydC5waHlfYWRkcjsKLQotCS8qIG1hc2sgd2hhdCB3ZSBzdXBwb3J0IGFjY29yZGluZyB0byBzcGVlZF9jYXBfbWFzayAqLwotCWlmICghKGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayAmCi0JCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fSEFMRikpCi0JCWJwLT5wb3J0LnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwYmFzZVRfSGFsZjsKLQotCWlmICghKGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayAmCi0JCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fRlVMTCkpCi0JCWJwLT5wb3J0LnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwYmFzZVRfRnVsbDsKLQotCWlmICghKGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayAmCi0JCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMDBNX0hBTEYpKQotCQlicC0+cG9ydC5zdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmOwotCi0JaWYgKCEoYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrICYKLQkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fRlVMTCkpCi0JCWJwLT5wb3J0LnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGw7Ci0KLQlpZiAoIShicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2sgJgotCQkJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHKSkKLQkJYnAtPnBvcnQuc3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKLQkJCQkJU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKTsKLQotCWlmICghKGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayAmCi0JCQkJCVBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMl81RykpCi0JCWJwLT5wb3J0LnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsOwotCi0JaWYgKCEoYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrICYKLQkJCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcpKQotCQlicC0+cG9ydC5zdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7Ci0KLQlCTlgyWF9ERVZfSU5GTygic3VwcG9ydGVkIDB4JXhcbiIsIGJwLT5wb3J0LnN1cHBvcnRlZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9saW5rX3NldHRpbmdzX3JlcXVlc3RlZChzdHJ1Y3QgYm54MnggKmJwKQotewotCWJwLT5saW5rX3BhcmFtcy5yZXFfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0KLQlzd2l0Y2ggKGJwLT5wb3J0LmxpbmtfY29uZmlnICYgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfTUFTSykgewotCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfQVVUTzoKLQkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSB7Ci0JCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF9BVVRPX05FRzsKLQkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gYnAtPnBvcnQuc3VwcG9ydGVkOwotCQl9IGVsc2UgewotCQkJdTMyIGV4dF9waHlfdHlwZSA9Ci0JCQkgICAgWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQotCQkJaWYgKChleHRfcGh5X3R5cGUgPT0KLQkJCSAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNSkgfHwKLQkJCSAgICAoZXh0X3BoeV90eXBlID09Ci0JCQkgICAgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDYpKSB7Ci0JCQkJLyogZm9yY2UgMTBHLCBubyBBTiAqLwotCQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOwotCQkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0KLQkJCQkJCShBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCQkgQURWRVJUSVNFRF9GSUJSRSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgotCQkJCSAgIkludmFsaWQgbGlua19jb25maWcgMHgleCIKLQkJCQkgICIgIEF1dG9uZWcgbm90IHN1cHBvcnRlZFxuIiwKLQkJCQkgIGJwLT5wb3J0LmxpbmtfY29uZmlnKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBNX0ZVTEw6Ci0JCWlmIChicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSB7Ci0JCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDsKLQkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKLQkJCQkJCUFEVkVSVElTRURfVFApOwotCQl9IGVsc2UgewotCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgotCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgotCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAotCQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZywKLQkJCQkgICAgYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBNX0hBTEY6Ci0JCWlmIChicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTBiYXNlVF9IYWxmKSB7Ci0JCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDsKLQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0JCQlicC0+cG9ydC5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8Ci0JCQkJCQlBRFZFUlRJU0VEX1RQKTsKLQkJfSBlbHNlIHsKLQkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKLQkJCQkgICAgIkludmFsaWQgbGlua19jb25maWcgMHgleCIKLQkJCQkgICAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKLQkJCQkgICAgYnAtPnBvcnQubGlua19jb25maWcsCi0JCQkJICAgIGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwME1fRlVMTDoKLQkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsKSB7Ci0JCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDA7Ci0JCQlicC0+cG9ydC5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAotCQkJCQkJQURWRVJUSVNFRF9UUCk7Ci0JCX0gZWxzZSB7Ci0JCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCi0JCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCi0JCQkJICAgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIsCi0JCQkJICAgIGJwLT5wb3J0LmxpbmtfY29uZmlnLAotCQkJCSAgICBicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2spOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMDBNX0hBTEY6Ci0JCWlmIChicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwYmFzZVRfSGFsZikgewotCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkID0gU1BFRURfMTAwOwotCQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8Ci0JCQkJCQlBRFZFUlRJU0VEX1RQKTsKLQkJfSBlbHNlIHsKLQkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKLQkJCQkgICAgIkludmFsaWQgbGlua19jb25maWcgMHgleCIKLQkJCQkgICAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKLQkJCQkgICAgYnAtPnBvcnQubGlua19jb25maWcsCi0JCQkJICAgIGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzFHOgotCQlpZiAoYnAtPnBvcnQuc3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKSB7Ci0JCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwotCQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCQlBRFZFUlRJU0VEX1RQKTsKLQkJfSBlbHNlIHsKLQkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKLQkJCQkgICAgIkludmFsaWQgbGlua19jb25maWcgMHgleCIKLQkJCQkgICAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKLQkJCQkgICAgYnAtPnBvcnQubGlua19jb25maWcsCi0JCQkJICAgIGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzJfNUc6Ci0JCWlmIChicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwpIHsKLQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEXzI1MDA7Ci0JCQlicC0+cG9ydC5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzI1MDBiYXNlWF9GdWxsIHwKLQkJCQkJCUFEVkVSVElTRURfVFApOwotCQl9IGVsc2UgewotCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgotCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgotCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAotCQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZywKLQkJCQkgICAgYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBHX0NYNDoKLQljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwR19LWDQ6Ci0JY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfS1I6Ci0JCWlmIChicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsKSB7Ci0JCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKLQkJCWJwLT5wb3J0LmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsIHwKLQkJCQkJCUFEVkVSVElTRURfRklCUkUpOwotCQl9IGVsc2UgewotCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgotCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgotCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAotCQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZywKLQkJCQkgICAgYnAtPmxpbmtfcGFyYW1zLnNwZWVkX2NhcF9tYXNrKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKLQkJCSAgICAiQkFEIGxpbmsgc3BlZWQgbGlua19jb25maWcgMHgleFxuIiwKLQkJCSAgICBicC0+cG9ydC5saW5rX2NvbmZpZyk7Ci0JCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9IFNQRUVEX0FVVE9fTkVHOwotCQlicC0+cG9ydC5hZHZlcnRpc2luZyA9IGJwLT5wb3J0LnN1cHBvcnRlZDsKLQkJYnJlYWs7Ci0JfQotCi0JYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgPSAoYnAtPnBvcnQubGlua19jb25maWcgJgotCQkJCQkgUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9NQVNLKTsKLQlpZiAoKGJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID09IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKSAmJgotCSAgICAhKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSkKLQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKLQotCUJOWDJYX0RFVl9JTkZPKCJyZXFfbGluZV9zcGVlZCAlZCAgcmVxX2R1cGxleCAlZCAgcmVxX2Zsb3dfY3RybCAweCV4IgotCQkgICAgICAgIiAgYWR2ZXJ0aXNpbmcgMHgleFxuIiwKLQkJICAgICAgIGJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCwKLQkJICAgICAgIGJwLT5saW5rX3BhcmFtcy5yZXFfZHVwbGV4LAotCQkgICAgICAgYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwsIGJwLT5wb3J0LmFkdmVydGlzaW5nKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X3NldF9tYWNfYnVmKHU4ICptYWNfYnVmLCB1MzIgbWFjX2xvLCB1MTYgbWFjX2hpKQotewotCW1hY19oaSA9IGNwdV90b19iZTE2KG1hY19oaSk7Ci0JbWFjX2xvID0gY3B1X3RvX2JlMzIobWFjX2xvKTsKLQltZW1jcHkobWFjX2J1ZiwgJm1hY19oaSwgc2l6ZW9mKG1hY19oaSkpOwotCW1lbWNweShtYWNfYnVmICsgc2l6ZW9mKG1hY19oaSksICZtYWNfbG8sIHNpemVvZihtYWNfbG8pKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X2dldF9wb3J0X2h3aW5mbyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JdTMyIHZhbCwgdmFsMjsKLQl1MzIgY29uZmlnOwotCXUxNiBpOwotCXUzMiBleHRfcGh5X3R5cGU7Ci0KLQlicC0+bGlua19wYXJhbXMuYnAgPSBicDsKLQlicC0+bGlua19wYXJhbXMucG9ydCA9IHBvcnQ7Ci0KLQlicC0+bGlua19wYXJhbXMubGFuZV9jb25maWcgPQotCQlTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0ubGFuZV9jb25maWcpOwotCWJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyA9Ci0JCVNITUVNX1JEKGJwLAotCQkJIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmV4dGVybmFsX3BoeV9jb25maWcpOwotCS8qIEJDTTg3MjdfTk9DID0+IEJDTTg3Mjcgbm8gb3ZlciBjdXJyZW50ICovCi0JaWYgKFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZykgPT0KLQkgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyN19OT0MpIHsKLQkJYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnICY9Ci0JCQl+UE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTUFTSzsKLQkJYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnIHw9Ci0JCQlQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OwotCQlicC0+bGlua19wYXJhbXMuZmVhdHVyZV9jb25maWdfZmxhZ3MgfD0KLQkJCUZFQVRVUkVfQ09ORklHX0JDTTg3MjdfTk9DOwotCX0KLQotCWJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFzayA9Ci0JCVNITUVNX1JEKGJwLAotCQkJIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLnNwZWVkX2NhcGFiaWxpdHlfbWFzayk7Ci0KLQlicC0+cG9ydC5saW5rX2NvbmZpZyA9Ci0JCVNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0X2ZlYXR1cmVfY29uZmlnW3BvcnRdLmxpbmtfY29uZmlnKTsKLQotCS8qIEdldCB0aGUgNCBsYW5lcyB4Z3hzIGNvbmZpZyByeCBhbmQgdHggKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXZhbCA9IFNITUVNX1JEKGJwLAotCQkJICAgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0ueGd4c19jb25maWdfcnhbaTw8MV0pOwotCQlicC0+bGlua19wYXJhbXMueGd4c19jb25maWdfcnhbaSA8PCAxXSA9ICgodmFsPj4xNikgJiAweGZmZmYpOwotCQlicC0+bGlua19wYXJhbXMueGd4c19jb25maWdfcnhbKGkgPDwgMSkgKyAxXSA9ICh2YWwgJiAweGZmZmYpOwotCi0JCXZhbCA9IFNITUVNX1JEKGJwLAotCQkJICAgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0ueGd4c19jb25maWdfdHhbaTw8MV0pOwotCQlicC0+bGlua19wYXJhbXMueGd4c19jb25maWdfdHhbaSA8PCAxXSA9ICgodmFsPj4xNikgJiAweGZmZmYpOwotCQlicC0+bGlua19wYXJhbXMueGd4c19jb25maWdfdHhbKGkgPDwgMSkgKyAxXSA9ICh2YWwgJiAweGZmZmYpOwotCX0KLQotCS8qIElmIHRoZSBkZXZpY2UgaXMgY2FwYWJsZSBvZiBXb0wsIHNldCB0aGUgZGVmYXVsdCBzdGF0ZSBhY2NvcmRpbmcKLQkgKiB0byB0aGUgSFcKLQkgKi8KLQljb25maWcgPSBTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9mZWF0dXJlX2NvbmZpZ1twb3J0XS5jb25maWcpOwotCWJwLT53b2wgPSAoIShicC0+ZmxhZ3MgJiBOT19XT0xfRkxBRykgJiYKLQkJICAgKGNvbmZpZyAmIFBPUlRfRkVBVFVSRV9XT0xfRU5BQkxFRCkpOwotCi0JQk5YMlhfREVWX0lORk8oImxhbmVfY29uZmlnIDB4JTA4eCAgZXh0X3BoeV9jb25maWcgMHglMDh4IgotCQkgICAgICAgIiAgc3BlZWRfY2FwX21hc2sgMHglMDh4ICBsaW5rX2NvbmZpZyAweCUwOHhcbiIsCi0JCSAgICAgICBicC0+bGlua19wYXJhbXMubGFuZV9jb25maWcsCi0JCSAgICAgICBicC0+bGlua19wYXJhbXMuZXh0X3BoeV9jb25maWcsCi0JCSAgICAgICBicC0+bGlua19wYXJhbXMuc3BlZWRfY2FwX21hc2ssIGJwLT5wb3J0LmxpbmtfY29uZmlnKTsKLQotCWJwLT5saW5rX3BhcmFtcy5zd2l0Y2hfY2ZnIHw9IChicC0+cG9ydC5saW5rX2NvbmZpZyAmCi0JCQkJICAgICAgIFBPUlRfRkVBVFVSRV9DT05ORUNURURfU1dJVENIX01BU0spOwotCWJueDJ4X2xpbmtfc2V0dGluZ3Nfc3VwcG9ydGVkKGJwLCBicC0+bGlua19wYXJhbXMuc3dpdGNoX2NmZyk7Ci0KLQlibngyeF9saW5rX3NldHRpbmdzX3JlcXVlc3RlZChicCk7Ci0KLQkvKgotCSAqIElmIGNvbm5lY3RlZCBkaXJlY3RseSwgd29yayB3aXRoIHRoZSBpbnRlcm5hbCBQSFksIG90aGVyd2lzZSwgd29yawotCSAqIHdpdGggdGhlIGV4dGVybmFsIFBIWQotCSAqLwotCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7Ci0JaWYgKGV4dF9waHlfdHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpCi0JCWJwLT5tZGlvLnBydGFkID0gYnAtPmxpbmtfcGFyYW1zLnBoeV9hZGRyOwotCi0JZWxzZSBpZiAoKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFKSAmJgotCQkgKGV4dF9waHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9OT1RfQ09OTikpCi0JCWJwLT5tZGlvLnBydGFkID0KLQkJCVhHWFNfRVhUX1BIWV9BRERSKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7Ci0KLQl2YWwyID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLm1hY191cHBlcik7Ci0JdmFsID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLm1hY19sb3dlcik7Ci0JYm54Mnhfc2V0X21hY19idWYoYnAtPmRldi0+ZGV2X2FkZHIsIHZhbCwgdmFsMik7Ci0JbWVtY3B5KGJwLT5saW5rX3BhcmFtcy5tYWNfYWRkciwgYnAtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoYnAtPmRldi0+cGVybV9hZGRyLCBicC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCi0jaWZkZWYgQkNNX0NOSUMKLQl2YWwyID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmlzY3NpX21hY191cHBlcik7Ci0JdmFsID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmlzY3NpX21hY19sb3dlcik7Ci0JYm54Mnhfc2V0X21hY19idWYoYnAtPmlzY3NpX21hYywgdmFsLCB2YWwyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBibngyeF9nZXRfaHdpbmZvKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKLQl1MzIgdmFsLCB2YWwyOwotCWludCByYyA9IDA7Ci0KLQlibngyeF9nZXRfY29tbW9uX2h3aW5mbyhicCk7Ci0KLQlicC0+ZTFob3YgPSAwOwotCWJwLT5lMWhtZiA9IDA7Ci0JaWYgKENISVBfSVNfRTFIKGJwKSAmJiAhQlBfTk9NQ1AoYnApKSB7Ci0JCWJwLT5tZl9jb25maWcgPQotCQkJU0hNRU1fUkQoYnAsIG1mX2NmZy5mdW5jX21mX2NvbmZpZ1tmdW5jXS5jb25maWcpOwotCi0JCXZhbCA9IChTSE1FTV9SRChicCwgbWZfY2ZnLmZ1bmNfbWZfY29uZmlnW0ZVTkNfMF0uZTFob3ZfdGFnKSAmCi0JCSAgICAgICBGVU5DX01GX0NGR19FMUhPVl9UQUdfTUFTSyk7Ci0JCWlmICh2YWwgIT0gRlVOQ19NRl9DRkdfRTFIT1ZfVEFHX0RFRkFVTFQpCi0JCQlicC0+ZTFobWYgPSAxOwotCQlCTlgyWF9ERVZfSU5GTygiJXMgZnVuY3Rpb24gbW9kZVxuIiwKLQkJCSAgICAgICBJU19FMUhNRihicCkgPyAibXVsdGkiIDogInNpbmdsZSIpOwotCi0JCWlmIChJU19FMUhNRihicCkpIHsKLQkJCXZhbCA9IChTSE1FTV9SRChicCwgbWZfY2ZnLmZ1bmNfbWZfY29uZmlnW2Z1bmNdLgotCQkJCQkJCQllMWhvdl90YWcpICYKLQkJCSAgICAgICBGVU5DX01GX0NGR19FMUhPVl9UQUdfTUFTSyk7Ci0JCQlpZiAodmFsICE9IEZVTkNfTUZfQ0ZHX0UxSE9WX1RBR19ERUZBVUxUKSB7Ci0JCQkJYnAtPmUxaG92ID0gdmFsOwotCQkJCUJOWDJYX0RFVl9JTkZPKCJFMUhPViBmb3IgZnVuYyAlZCBpcyAlZCAiCi0JCQkJCSAgICAgICAiKDB4JTA0eClcbiIsCi0JCQkJCSAgICAgICBmdW5jLCBicC0+ZTFob3YsIGJwLT5lMWhvdik7Ci0JCQl9IGVsc2UgewotCQkJCUJOWDJYX0VSUk9SKCJObyB2YWxpZCBFMUhPViBmb3IgZnVuYyAlZCwiCi0JCQkJCSAgICAiICBhYm9ydGluZ1xuIiwgZnVuYyk7Ci0JCQkJcmMgPSAtRVBFUk07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQlBfRTFIVk4oYnApKSB7Ci0JCQkJQk5YMlhfRVJST1IoIlZOICVkIGluIHNpbmdsZSBmdW5jdGlvbiBtb2RlLCIKLQkJCQkJICAgICIgIGFib3J0aW5nXG4iLCBCUF9FMUhWTihicCkpOwotCQkJCXJjID0gLUVQRVJNOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFCUF9OT01DUChicCkpIHsKLQkJYm54MnhfZ2V0X3BvcnRfaHdpbmZvKGJwKTsKLQotCQlicC0+Zndfc2VxID0gKFNITUVNX1JEKGJwLCBmdW5jX21iW2Z1bmNdLmRydl9tYl9oZWFkZXIpICYKLQkJCSAgICAgIERSVl9NU0dfU0VRX05VTUJFUl9NQVNLKTsKLQkJQk5YMlhfREVWX0lORk8oImZ3X3NlcSAweCUwOHhcbiIsIGJwLT5md19zZXEpOwotCX0KLQotCWlmIChJU19FMUhNRihicCkpIHsKLQkJdmFsMiA9IFNITUVNX1JEKGJwLCBtZl9jZmcuZnVuY19tZl9jb25maWdbZnVuY10ubWFjX3VwcGVyKTsKLQkJdmFsID0gU0hNRU1fUkQoYnAsICBtZl9jZmcuZnVuY19tZl9jb25maWdbZnVuY10ubWFjX2xvd2VyKTsKLQkJaWYgKCh2YWwyICE9IEZVTkNfTUZfQ0ZHX1VQUEVSTUFDX0RFRkFVTFQpICYmCi0JCSAgICAodmFsICE9IEZVTkNfTUZfQ0ZHX0xPV0VSTUFDX0RFRkFVTFQpKSB7Ci0JCQlicC0+ZGV2LT5kZXZfYWRkclswXSA9ICh1OCkodmFsMiA+PiA4ICYgMHhmZik7Ci0JCQlicC0+ZGV2LT5kZXZfYWRkclsxXSA9ICh1OCkodmFsMiAmIDB4ZmYpOwotCQkJYnAtPmRldi0+ZGV2X2FkZHJbMl0gPSAodTgpKHZhbCA+PiAyNCAmIDB4ZmYpOwotCQkJYnAtPmRldi0+ZGV2X2FkZHJbM10gPSAodTgpKHZhbCA+PiAxNiAmIDB4ZmYpOwotCQkJYnAtPmRldi0+ZGV2X2FkZHJbNF0gPSAodTgpKHZhbCA+PiA4ICAmIDB4ZmYpOwotCQkJYnAtPmRldi0+ZGV2X2FkZHJbNV0gPSAodTgpKHZhbCAmIDB4ZmYpOwotCQkJbWVtY3B5KGJwLT5saW5rX3BhcmFtcy5tYWNfYWRkciwgYnAtPmRldi0+ZGV2X2FkZHIsCi0JCQkgICAgICAgRVRIX0FMRU4pOwotCQkJbWVtY3B5KGJwLT5kZXYtPnBlcm1fYWRkciwgYnAtPmRldi0+ZGV2X2FkZHIsCi0JCQkgICAgICAgRVRIX0FMRU4pOwotCQl9Ci0KLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChCUF9OT01DUChicCkpIHsKLQkJLyogb25seSBzdXBwb3NlZCB0byBoYXBwZW4gb24gZW11bGF0aW9uL0ZQR0EgKi8KLQkJQk5YMlhfRVJST1IoIndhcm5pbmc6IHJhbmRvbSBNQUMgd29ya2Fyb3VuZCBhY3RpdmVcbiIpOwotCQlyYW5kb21fZXRoZXJfYWRkcihicC0+ZGV2LT5kZXZfYWRkcik7Ci0JCW1lbWNweShicC0+ZGV2LT5wZXJtX2FkZHIsIGJwLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYm54MnhfcmVhZF9md2luZm8oc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgY250LCBpLCBibG9ja19lbmQsIHJvZGk7Ci0JY2hhciB2cGRfZGF0YVtCTlgyWF9WUERfTEVOKzFdOwotCWNoYXIgc3RyX2lkX3JlZ1tWRU5ET1JfSURfTEVOKzFdOwotCWNoYXIgc3RyX2lkX2NhcFtWRU5ET1JfSURfTEVOKzFdOwotCXU4IGxlbjsKLQotCWNudCA9IHBjaV9yZWFkX3ZwZChicC0+cGRldiwgMCwgQk5YMlhfVlBEX0xFTiwgdnBkX2RhdGEpOwotCW1lbXNldChicC0+ZndfdmVyLCAwLCBzaXplb2YoYnAtPmZ3X3ZlcikpOwotCi0JaWYgKGNudCA8IEJOWDJYX1ZQRF9MRU4pCi0JCWdvdG8gb3V0X25vdF9mb3VuZDsKLQotCWkgPSBwY2lfdnBkX2ZpbmRfdGFnKHZwZF9kYXRhLCAwLCBCTlgyWF9WUERfTEVOLAotCQkJICAgICBQQ0lfVlBEX0xSRFRfUk9fREFUQSk7Ci0JaWYgKGkgPCAwKQotCQlnb3RvIG91dF9ub3RfZm91bmQ7Ci0KLQotCWJsb2NrX2VuZCA9IGkgKyBQQ0lfVlBEX0xSRFRfVEFHX1NJWkUgKwotCQkgICAgcGNpX3ZwZF9scmR0X3NpemUoJnZwZF9kYXRhW2ldKTsKLQotCWkgKz0gUENJX1ZQRF9MUkRUX1RBR19TSVpFOwotCi0JaWYgKGJsb2NrX2VuZCA+IEJOWDJYX1ZQRF9MRU4pCi0JCWdvdG8gb3V0X25vdF9mb3VuZDsKLQotCXJvZGkgPSBwY2lfdnBkX2ZpbmRfaW5mb19rZXl3b3JkKHZwZF9kYXRhLCBpLCBibG9ja19lbmQsCi0JCQkJICAgUENJX1ZQRF9ST19LRVlXT1JEX01GUl9JRCk7Ci0JaWYgKHJvZGkgPCAwKQotCQlnb3RvIG91dF9ub3RfZm91bmQ7Ci0KLQlsZW4gPSBwY2lfdnBkX2luZm9fZmllbGRfc2l6ZSgmdnBkX2RhdGFbcm9kaV0pOwotCi0JaWYgKGxlbiAhPSBWRU5ET1JfSURfTEVOKQotCQlnb3RvIG91dF9ub3RfZm91bmQ7Ci0KLQlyb2RpICs9IFBDSV9WUERfSU5GT19GTERfSERSX1NJWkU7Ci0KLQkvKiB2ZW5kb3Igc3BlY2lmaWMgaW5mbyAqLwotCXNucHJpbnRmKHN0cl9pZF9yZWcsIFZFTkRPUl9JRF9MRU4gKyAxLCAiJTA0eCIsIFBDSV9WRU5ET1JfSURfREVMTCk7Ci0Jc25wcmludGYoc3RyX2lkX2NhcCwgVkVORE9SX0lEX0xFTiArIDEsICIlMDRYIiwgUENJX1ZFTkRPUl9JRF9ERUxMKTsKLQlpZiAoIXN0cm5jbXAoc3RyX2lkX3JlZywgJnZwZF9kYXRhW3JvZGldLCBWRU5ET1JfSURfTEVOKSB8fAotCSAgICAhc3RybmNtcChzdHJfaWRfY2FwLCAmdnBkX2RhdGFbcm9kaV0sIFZFTkRPUl9JRF9MRU4pKSB7Ci0KLQkJcm9kaSA9IHBjaV92cGRfZmluZF9pbmZvX2tleXdvcmQodnBkX2RhdGEsIGksIGJsb2NrX2VuZCwKLQkJCQkJCVBDSV9WUERfUk9fS0VZV09SRF9WRU5ET1IwKTsKLQkJaWYgKHJvZGkgPj0gMCkgewotCQkJbGVuID0gcGNpX3ZwZF9pbmZvX2ZpZWxkX3NpemUoJnZwZF9kYXRhW3JvZGldKTsKLQotCQkJcm9kaSArPSBQQ0lfVlBEX0lORk9fRkxEX0hEUl9TSVpFOwotCi0JCQlpZiAobGVuIDwgMzIgJiYgKGxlbiArIHJvZGkpIDw9IEJOWDJYX1ZQRF9MRU4pIHsKLQkJCQltZW1jcHkoYnAtPmZ3X3ZlciwgJnZwZF9kYXRhW3JvZGldLCBsZW4pOwotCQkJCWJwLT5md192ZXJbbGVuXSA9ICcgJzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotb3V0X25vdF9mb3VuZDoKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2luaXRfYnAoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwotCWludCB0aW1lcl9pbnRlcnZhbDsKLQlpbnQgcmM7Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdCBoYW5kbGluZyB1bnRpbCBIVyBpcyBpbml0aWFsaXplZCAqLwotCWF0b21pY19zZXQoJmJwLT5pbnRyX3NlbSwgMSk7Ci0Jc21wX3dtYigpOyAvKiBFbnN1cmUgdGhhdCBicC0+aW50cl9zZW0gdXBkYXRlIGlzIFNNUC1zYWZlICovCi0KLQltdXRleF9pbml0KCZicC0+cG9ydC5waHlfbXV0ZXgpOwotCW11dGV4X2luaXQoJmJwLT5md19tYl9tdXRleCk7Ci0jaWZkZWYgQkNNX0NOSUMKLQltdXRleF9pbml0KCZicC0+Y25pY19tdXRleCk7Ci0jZW5kaWYKLQotCUlOSVRfREVMQVlFRF9XT1JLKCZicC0+c3BfdGFzaywgYm54Mnhfc3BfdGFzayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5yZXNldF90YXNrLCBibngyeF9yZXNldF90YXNrKTsKLQotCXJjID0gYm54MnhfZ2V0X2h3aW5mbyhicCk7Ci0KLQlibngyeF9yZWFkX2Z3aW5mbyhicCk7Ci0JLyogbmVlZCB0byByZXNldCBjaGlwIGlmIHVuZGkgd2FzIGFjdGl2ZSAqLwotCWlmICghQlBfTk9NQ1AoYnApKQotCQlibngyeF91bmRpX3VubG9hZChicCk7Ci0KLQlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkpCi0JCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsICJGUEdBIGRldGVjdGVkXG4iKTsKLQotCWlmIChCUF9OT01DUChicCkgJiYgKGZ1bmMgPT0gMCkpCi0JCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsICJNQ1AgZGlzYWJsZWQsICIKLQkJCQkJIm11c3QgbG9hZCBkZXZpY2VzIGluIG9yZGVyIVxuIik7Ci0KLQkvKiBTZXQgbXVsdGkgcXVldWUgbW9kZSAqLwotCWlmICgobXVsdGlfbW9kZSAhPSBFVEhfUlNTX01PREVfRElTQUJMRUQpICYmCi0JICAgICgoaW50X21vZGUgPT0gSU5UX01PREVfSU5UeCkgfHwgKGludF9tb2RlID09IElOVF9NT0RFX01TSSkpKSB7Ci0JCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsICJNdWx0aSBkaXNhYmxlZCBzaW5jZSBpbnRfbW9kZSAiCi0JCQkJCSJyZXF1ZXN0ZWQgaXMgbm90IE1TSS1YXG4iKTsKLQkJbXVsdGlfbW9kZSA9IEVUSF9SU1NfTU9ERV9ESVNBQkxFRDsKLQl9Ci0JYnAtPm11bHRpX21vZGUgPSBtdWx0aV9tb2RlOwotCi0KLQlicC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0dSTzsKLQotCS8qIFNldCBUUEEgZmxhZ3MgKi8KLQlpZiAoZGlzYWJsZV90cGEpIHsKLQkJYnAtPmZsYWdzICY9IH5UUEFfRU5BQkxFX0ZMQUc7Ci0JCWJwLT5kZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0xSTzsKLQl9IGVsc2UgewotCQlicC0+ZmxhZ3MgfD0gVFBBX0VOQUJMRV9GTEFHOwotCQlicC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKLQl9Ci0KLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCWJwLT5kcm9wbGVzc19mYyA9IDA7Ci0JZWxzZQotCQlicC0+ZHJvcGxlc3NfZmMgPSBkcm9wbGVzc19mYzsKLQotCWJwLT5tcnJzID0gbXJyczsKLQotCWJwLT50eF9yaW5nX3NpemUgPSBNQVhfVFhfQVZBSUw7Ci0JYnAtPnJ4X3Jpbmdfc2l6ZSA9IE1BWF9SWF9BVkFJTDsKLQotCWJwLT5yeF9jc3VtID0gMTsKLQotCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBudW1iZXJzIGFyZSBpbiB0aGUgcmlnaHQgZ3JhbnVsYXJpdHkgKi8KLQlicC0+dHhfdGlja3MgPSAoNTAgLyAoNCAqIEJOWDJYX0JUUikpICogKDQgKiBCTlgyWF9CVFIpOwotCWJwLT5yeF90aWNrcyA9ICgyNSAvICg0ICogQk5YMlhfQlRSKSkgKiAoNCAqIEJOWDJYX0JUUik7Ci0KLQl0aW1lcl9pbnRlcnZhbCA9IChDSElQX1JFVl9JU19TTE9XKGJwKSA/IDUqSFogOiBIWik7Ci0JYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSAocG9sbCA/IHBvbGwgOiB0aW1lcl9pbnRlcnZhbCk7Ci0KLQlpbml0X3RpbWVyKCZicC0+dGltZXIpOwotCWJwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsOwotCWJwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJwOwotCWJwLT50aW1lci5mdW5jdGlvbiA9IGJueDJ4X3RpbWVyOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogZXRodG9vbCBzZXJ2aWNlIGZ1bmN0aW9ucwotICovCi0KLS8qIEFsbCBldGh0b29sIGZ1bmN0aW9ucyBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KLQotc3RhdGljIGludCBibngyeF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQljbWQtPnN1cHBvcnRlZCA9IGJwLT5wb3J0LnN1cHBvcnRlZDsKLQljbWQtPmFkdmVydGlzaW5nID0gYnAtPnBvcnQuYWR2ZXJ0aXNpbmc7Ci0KLQlpZiAoKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKSAmJgotCSAgICAhKGJwLT5mbGFncyAmIE1GX0ZVTkNfRElTKSAmJgotCSAgICAoYnAtPmxpbmtfdmFycy5saW5rX3VwKSkgewotCQljbWQtPnNwZWVkID0gYnAtPmxpbmtfdmFycy5saW5lX3NwZWVkOwotCQljbWQtPmR1cGxleCA9IGJwLT5saW5rX3ZhcnMuZHVwbGV4OwotCQlpZiAoSVNfRTFITUYoYnApKSB7Ci0JCQl1MTYgdm5fbWF4X3JhdGU7Ci0KLQkJCXZuX21heF9yYXRlID0KLQkJCQkoKGJwLT5tZl9jb25maWcgJiBGVU5DX01GX0NGR19NQVhfQldfTUFTSykgPj4KLQkJCQlGVU5DX01GX0NGR19NQVhfQldfU0hJRlQpICogMTAwOwotCQkJaWYgKHZuX21heF9yYXRlIDwgY21kLT5zcGVlZCkKLQkJCQljbWQtPnNwZWVkID0gdm5fbWF4X3JhdGU7Ci0JCX0KLQl9IGVsc2UgewotCQljbWQtPnNwZWVkID0gLTE7Ci0JCWNtZC0+ZHVwbGV4ID0gLTE7Ci0JfQotCi0JaWYgKGJwLT5saW5rX3BhcmFtcy5zd2l0Y2hfY2ZnID09IFNXSVRDSF9DRkdfMTBHKSB7Ci0JCXUzMiBleHRfcGh5X3R5cGUgPQotCQkJWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQotCQlzd2l0Y2ggKGV4dF9waHlfdHlwZSkgewotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyOgotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzM6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNToKLQkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2OgotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjY6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNzoKLQkJCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX1NGWDcxMDE6Ci0JCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MToKLQkJCWNtZC0+cG9ydCA9IFBPUlRfVFA7Ci0JCQlicmVhazsKLQotCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0ZBSUxVUkU6Ci0JCQlCTlgyWF9FUlIoIlhHWFMgUEhZIEZhaWx1cmUgZGV0ZWN0ZWQgMHgleFxuIiwKLQkJCQkgIGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgWEdYUyBleHRfcGh5X2NvbmZpZyAweCV4XG4iLAotCQkJICAgYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlCi0JCWNtZC0+cG9ydCA9IFBPUlRfVFA7Ci0KLQljbWQtPnBoeV9hZGRyZXNzID0gYnAtPm1kaW8ucHJ0YWQ7Ci0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0KLQlpZiAoYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKQotCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKLQllbHNlCi0JCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKLQotCWNtZC0+bWF4dHhwa3QgPSAwOwotCWNtZC0+bWF4cnhwa3QgPSAwOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJldGh0b29sX2NtZDogY21kICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgc3VwcG9ydGVkIDB4JXggIGFkdmVydGlzaW5nIDB4JXggIHNwZWVkICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgZHVwbGV4ICVkICBwb3J0ICVkICBwaHlfYWRkcmVzcyAlZCAgdHJhbnNjZWl2ZXIgJWRcbiIKLQkgICBEUF9MRVZFTCAiICBhdXRvbmVnICVkICBtYXh0eHBrdCAlZCAgbWF4cnhwa3QgJWRcbiIsCi0JICAgY21kLT5jbWQsIGNtZC0+c3VwcG9ydGVkLCBjbWQtPmFkdmVydGlzaW5nLCBjbWQtPnNwZWVkLAotCSAgIGNtZC0+ZHVwbGV4LCBjbWQtPnBvcnQsIGNtZC0+cGh5X2FkZHJlc3MsIGNtZC0+dHJhbnNjZWl2ZXIsCi0JICAgY21kLT5hdXRvbmVnLCBjbWQtPm1heHR4cGt0LCBjbWQtPm1heHJ4cGt0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgYWR2ZXJ0aXNpbmc7Ci0KLQlpZiAoSVNfRTFITUYoYnApKQotCQlyZXR1cm4gMDsKLQotCURQKE5FVElGX01TR19MSU5LLCAiZXRodG9vbF9jbWQ6IGNtZCAlZFxuIgotCSAgIERQX0xFVkVMICIgIHN1cHBvcnRlZCAweCV4ICBhZHZlcnRpc2luZyAweCV4ICBzcGVlZCAlZFxuIgotCSAgIERQX0xFVkVMICIgIGR1cGxleCAlZCAgcG9ydCAlZCAgcGh5X2FkZHJlc3MgJWQgIHRyYW5zY2VpdmVyICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgYXV0b25lZyAlZCAgbWF4dHhwa3QgJWQgIG1heHJ4cGt0ICVkXG4iLAotCSAgIGNtZC0+Y21kLCBjbWQtPnN1cHBvcnRlZCwgY21kLT5hZHZlcnRpc2luZywgY21kLT5zcGVlZCwKLQkgICBjbWQtPmR1cGxleCwgY21kLT5wb3J0LCBjbWQtPnBoeV9hZGRyZXNzLCBjbWQtPnRyYW5zY2VpdmVyLAotCSAgIGNtZC0+YXV0b25lZywgY21kLT5tYXh0eHBrdCwgY21kLT5tYXhyeHBrdCk7Ci0KLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7Ci0JCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSkgewotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJBdXRvbmVnIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBhZHZlcnRpc2UgdGhlIHJlcXVlc3RlZCBzcGVlZCBhbmQgZHVwbGV4IGlmIHN1cHBvcnRlZCAqLwotCQljbWQtPmFkdmVydGlzaW5nICY9IGJwLT5wb3J0LnN1cHBvcnRlZDsKLQotCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQgPSBTUEVFRF9BVVRPX05FRzsKLQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgfD0gKEFEVkVSVElTRURfQXV0b25lZyB8Ci0JCQkJCSBjbWQtPmFkdmVydGlzaW5nKTsKLQotCX0gZWxzZSB7IC8qIGZvcmNlZCBzcGVlZCAqLwotCQkvKiBhZHZlcnRpc2UgdGhlIHJlcXVlc3RlZCBzcGVlZCBhbmQgZHVwbGV4IGlmIHN1cHBvcnRlZCAqLwotCQlzd2l0Y2ggKGNtZC0+c3BlZWQpIHsKLQkJY2FzZSBTUEVFRF8xMDoKLQkJCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgewotCQkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmCi0JCQkJICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCkpIHsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCSAgICIxME0gZnVsbCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgICAgQURWRVJUSVNFRF9UUCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmCi0JCQkJICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZikpIHsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCSAgICIxME0gaGFsZiBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAotCQkJCQkgICAgICAgQURWRVJUSVNFRF9UUCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUVEXzEwMDoKLQkJCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgewotCQkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmCi0JCQkJCQlTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkpIHsKLQkJCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJCSAgICIxMDBNIGZ1bGwgbm90IHN1cHBvcnRlZFxuIik7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCWFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEoYnAtPnBvcnQuc3VwcG9ydGVkICYKLQkJCQkJCVNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmKSkgewotCQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkJICAgIjEwME0gaGFsZiBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKLQkJCQkJICAgICAgIEFEVkVSVElTRURfVFApOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEVFRF8xMDAwOgotCQkJaWYgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICIxRyBoYWxmIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICIxRyBmdWxsIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlhZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkgICAgICAgQURWRVJUSVNFRF9UUCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUVEXzI1MDA6Ci0JCQlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpIHsKLQkJCQlEUChORVRJRl9NU0dfTElOSywKLQkJCQkgICAiMi41RyBoYWxmIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkJICAgIjIuNUcgZnVsbCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8yNTAwYmFzZVhfRnVsbCB8Ci0JCQkJICAgICAgIEFEVkVSVElTRURfVFApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEVFRF8xMDAwMDoKLQkJCWlmIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkgewotCQkJCURQKE5FVElGX01TR19MSU5LLCAiMTBHIGhhbGYgbm90IHN1cHBvcnRlZFxuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWlmICghKGJwLT5wb3J0LnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0xJTkssICIxMEcgZnVsbCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCSAgICAgICBBRFZFUlRJU0VEX0ZJQlJFKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIlVuc3VwcG9ydGVkIHNwZWVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkID0gY21kLT5zcGVlZDsKLQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9kdXBsZXggPSBjbWQtPmR1cGxleDsKLQkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2luZzsKLQl9Ci0KLQlEUChORVRJRl9NU0dfTElOSywgInJlcV9saW5lX3NwZWVkICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgcmVxX2R1cGxleCAlZCAgYWR2ZXJ0aXNpbmcgMHgleFxuIiwKLQkgICBicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWQsIGJwLT5saW5rX3BhcmFtcy5yZXFfZHVwbGV4LAotCSAgIGJwLT5wb3J0LmFkdmVydGlzaW5nKTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9TVE9QKTsKLQkJYm54MnhfbGlua19zZXQoYnApOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIElTX0UxX09OTElORShpbmZvKQkoKChpbmZvKSAmIFJJX0UxX09OTElORSkgPT0gUklfRTFfT05MSU5FKQotI2RlZmluZSBJU19FMUhfT05MSU5FKGluZm8pCSgoKGluZm8pICYgUklfRTFIX09OTElORSkgPT0gUklfRTFIX09OTElORSkKLQotc3RhdGljIGludCBibngyeF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmVnZHVtcF9sZW4gPSAwOwotCWludCBpOwotCi0JaWYgKENISVBfSVNfRTEoYnApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCi0JCQlpZiAoSVNfRTFfT05MSU5FKHJlZ19hZGRyc1tpXS5pbmZvKSkKLQkJCQlyZWdkdW1wX2xlbiArPSByZWdfYWRkcnNbaV0uc2l6ZTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgV1JFR1NfQ09VTlRfRTE7IGkrKykKLQkJCWlmIChJU19FMV9PTkxJTkUod3JlZ19hZGRyc19lMVtpXS5pbmZvKSkKLQkJCQlyZWdkdW1wX2xlbiArPSB3cmVnX2FkZHJzX2UxW2ldLnNpemUgKgotCQkJCQkoMSArIHdyZWdfYWRkcnNfZTFbaV0ucmVhZF9yZWdzX2NvdW50KTsKLQotCX0gZWxzZSB7IC8qIEUxSCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgUkVHU19DT1VOVDsgaSsrKQotCQkJaWYgKElTX0UxSF9PTkxJTkUocmVnX2FkZHJzW2ldLmluZm8pKQotCQkJCXJlZ2R1bXBfbGVuICs9IHJlZ19hZGRyc1tpXS5zaXplOwotCi0JCWZvciAoaSA9IDA7IGkgPCBXUkVHU19DT1VOVF9FMUg7IGkrKykKLQkJCWlmIChJU19FMUhfT05MSU5FKHdyZWdfYWRkcnNfZTFoW2ldLmluZm8pKQotCQkJCXJlZ2R1bXBfbGVuICs9IHdyZWdfYWRkcnNfZTFoW2ldLnNpemUgKgotCQkJCQkoMSArIHdyZWdfYWRkcnNfZTFoW2ldLnJlYWRfcmVnc19jb3VudCk7Ci0JfQotCXJlZ2R1bXBfbGVuICo9IDQ7Ci0JcmVnZHVtcF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBkdW1wX2hkcik7Ci0KLQlyZXR1cm4gcmVnZHVtcF9sZW47Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpfcCkKLXsKLQl1MzIgKnAgPSBfcCwgaSwgajsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZHVtcF9oZHIgZHVtcF9oZHIgPSB7MH07Ci0KLQlyZWdzLT52ZXJzaW9uID0gMDsKLQltZW1zZXQocCwgMCwgcmVncy0+bGVuKTsKLQotCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkKLQkJcmV0dXJuOwotCi0JZHVtcF9oZHIuaGRyX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBkdW1wX2hkcikgLyA0KSAtIDE7Ci0JZHVtcF9oZHIuZHVtcF9zaWduID0gZHVtcF9zaWduX2FsbDsKLQlkdW1wX2hkci54c3Rvcm1fd2FpdHAgPSBSRUdfUkQoYnAsIFhTVE9STV9XQUlUUF9BRERSKTsKLQlkdW1wX2hkci50c3Rvcm1fd2FpdHAgPSBSRUdfUkQoYnAsIFRTVE9STV9XQUlUUF9BRERSKTsKLQlkdW1wX2hkci51c3Rvcm1fd2FpdHAgPSBSRUdfUkQoYnAsIFVTVE9STV9XQUlUUF9BRERSKTsKLQlkdW1wX2hkci5jc3Rvcm1fd2FpdHAgPSBSRUdfUkQoYnAsIENTVE9STV9XQUlUUF9BRERSKTsKLQlkdW1wX2hkci5pbmZvID0gQ0hJUF9JU19FMShicCkgPyBSSV9FMV9PTkxJTkUgOiBSSV9FMUhfT05MSU5FOwotCi0JbWVtY3B5KHAsICZkdW1wX2hkciwgc2l6ZW9mKHN0cnVjdCBkdW1wX2hkcikpOwotCXAgKz0gZHVtcF9oZHIuaGRyX3NpemUgKyAxOwotCi0JaWYgKENISVBfSVNfRTEoYnApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCi0JCQlpZiAoSVNfRTFfT05MSU5FKHJlZ19hZGRyc1tpXS5pbmZvKSkKLQkJCQlmb3IgKGogPSAwOyBqIDwgcmVnX2FkZHJzW2ldLnNpemU7IGorKykKLQkJCQkJKnArKyA9IFJFR19SRChicCwKLQkJCQkJCSAgICAgIHJlZ19hZGRyc1tpXS5hZGRyICsgaio0KTsKLQotCX0gZWxzZSB7IC8qIEUxSCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgUkVHU19DT1VOVDsgaSsrKQotCQkJaWYgKElTX0UxSF9PTkxJTkUocmVnX2FkZHJzW2ldLmluZm8pKQotCQkJCWZvciAoaiA9IDA7IGogPCByZWdfYWRkcnNbaV0uc2l6ZTsgaisrKQotCQkJCQkqcCsrID0gUkVHX1JEKGJwLAotCQkJCQkJICAgICAgcmVnX2FkZHJzW2ldLmFkZHIgKyBqKjQpOwotCX0KLX0KLQotI2RlZmluZSBQSFlfRldfVkVSX0xFTgkJCTEwCi0KLXN0YXRpYyB2b2lkIGJueDJ4X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXU4IHBoeV9md192ZXJbUEhZX0ZXX1ZFUl9MRU5dOwotCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKLQotCXBoeV9md192ZXJbMF0gPSAnXDAnOwotCWlmIChicC0+cG9ydC5wbWYpIHsKLQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7Ci0JCWJueDJ4X2dldF9leHRfcGh5X2Z3X3ZlcnNpb24oJmJwLT5saW5rX3BhcmFtcywKLQkJCQkJICAgICAoYnAtPnN0YXRlICE9IEJOWDJYX1NUQVRFX0NMT1NFRCksCi0JCQkJCSAgICAgcGh5X2Z3X3ZlciwgUEhZX0ZXX1ZFUl9MRU4pOwotCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQl9Ci0KLQlzdHJuY3B5KGluZm8tPmZ3X3ZlcnNpb24sIGJwLT5md192ZXIsIDMyKTsKLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uICsgc3RybGVuKGJwLT5md192ZXIpLCAzMiAtIHN0cmxlbihicC0+ZndfdmVyKSwKLQkJICJiYyAlZC4lZC4lZCVzJXMiLAotCQkgKGJwLT5jb21tb24uYmNfdmVyICYgMHhmZjAwMDApID4+IDE2LAotCQkgKGJwLT5jb21tb24uYmNfdmVyICYgMHhmZjAwKSA+PiA4LAotCQkgKGJwLT5jb21tb24uYmNfdmVyICYgMHhmZiksCi0JCSAoKHBoeV9md192ZXJbMF0gIT0gJ1wwJykgPyAiIHBoeSAiIDogIiIpLCBwaHlfZndfdmVyKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGJwLT5wZGV2KSk7Ci0JaW5mby0+bl9zdGF0cyA9IEJOWDJYX05VTV9TVEFUUzsKLQlpbmZvLT50ZXN0aW5mb19sZW4gPSBCTlgyWF9OVU1fVEVTVFM7Ci0JaW5mby0+ZWVkdW1wX2xlbiA9IGJwLT5jb21tb24uZmxhc2hfc2l6ZTsKLQlpbmZvLT5yZWdkdW1wX2xlbiA9IGJueDJ4X2dldF9yZWdzX2xlbihkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChicC0+ZmxhZ3MgJiBOT19XT0xfRkxBRykgewotCQl3b2wtPnN1cHBvcnRlZCA9IDA7Ci0JCXdvbC0+d29sb3B0cyA9IDA7Ci0JfSBlbHNlIHsKLQkJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX01BR0lDOwotCQlpZiAoYnAtPndvbCkKLQkJCXdvbC0+d29sb3B0cyA9IFdBS0VfTUFHSUM7Ci0JCWVsc2UKLQkJCXdvbC0+d29sb3B0cyA9IDA7Ci0JfQotCW1lbXNldCgmd29sLT5zb3Bhc3MsIDAsIHNpemVvZih3b2wtPnNvcGFzcykpOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKHdvbC0+d29sb3B0cyAmIH5XQUtFX01BR0lDKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKSB7Ci0JCWlmIChicC0+ZmxhZ3MgJiBOT19XT0xfRkxBRykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWJwLT53b2wgPSAxOwotCX0gZWxzZQotCQlicC0+d29sID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIGJueDJ4X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuIGJwLT5tc2dfZW5hYmxlOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCWJwLT5tc2dfZW5hYmxlID0gbGV2ZWw7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCFicC0+cG9ydC5wbWYpCi0JCXJldHVybiAwOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOwotCQlibngyeF9saW5rX3NldChicCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgYm54MnhfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChicC0+ZmxhZ3MgJiBNRl9GVU5DX0RJUykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYnAtPmxpbmtfdmFycy5saW5rX3VwOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlyZXR1cm4gYnAtPmNvbW1vbi5mbGFzaF9zaXplOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2FjcXVpcmVfbnZyYW1fbG9jayhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGNvdW50LCBpOwotCXUzMiB2YWwgPSAwOwotCi0JLyogYWRqdXN0IHRpbWVvdXQgZm9yIGVtdWxhdGlvbi9GUEdBICovCi0JY291bnQgPSBOVlJBTV9USU1FT1VUX0NPVU5UOwotCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJY291bnQgKj0gMTAwOwotCi0JLyogcmVxdWVzdCBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCi0JUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX1NXX0FSQiwKLQkgICAgICAgKE1DUFJfTlZNX1NXX0FSQl9BUkJfUkVRX1NFVDEgPDwgcG9ydCkpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50KjEwOyBpKyspIHsKLQkJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX1NXX0FSQik7Ci0JCWlmICh2YWwgJiAoTUNQUl9OVk1fU1dfQVJCX0FSQl9BUkIxIDw8IHBvcnQpKQotCQkJYnJlYWs7Ci0KLQkJdWRlbGF5KDUpOwotCX0KLQotCWlmICghKHZhbCAmIChNQ1BSX05WTV9TV19BUkJfQVJCX0FSQjEgPDwgcG9ydCkpKSB7Ci0JCURQKEJOWDJYX01TR19OVk0sICJjYW5ub3QgZ2V0IGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2VcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3JlbGVhc2VfbnZyYW1fbG9jayhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBwb3J0ID0gQlBfUE9SVChicCk7Ci0JaW50IGNvdW50LCBpOwotCXUzMiB2YWwgPSAwOwotCi0JLyogYWRqdXN0IHRpbWVvdXQgZm9yIGVtdWxhdGlvbi9GUEdBICovCi0JY291bnQgPSBOVlJBTV9USU1FT1VUX0NPVU5UOwotCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKLQkJY291bnQgKj0gMTAwOwotCi0JLyogcmVsaW5xdWlzaCBudnJhbSBpbnRlcmZhY2UgKi8KLQlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fU1dfQVJCLAotCSAgICAgICAoTUNQUl9OVk1fU1dfQVJCX0FSQl9SRVFfQ0xSMSA8PCBwb3J0KSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQqMTA7IGkrKykgewotCQl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9OVk1fU1dfQVJCKTsKLQkJaWYgKCEodmFsICYgKE1DUFJfTlZNX1NXX0FSQl9BUkJfQVJCMSA8PCBwb3J0KSkpCi0JCQlicmVhazsKLQotCQl1ZGVsYXkoNSk7Ci0JfQotCi0JaWYgKHZhbCAmIChNQ1BSX05WTV9TV19BUkJfQVJCX0FSQjEgPDwgcG9ydCkpIHsKLQkJRFAoQk5YMlhfTVNHX05WTSwgImNhbm5vdCBmcmVlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2VcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9lbmFibGVfbnZyYW1fYWNjZXNzKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX05WTV9BQ0NFU1NfRU5BQkxFKTsKLQotCS8qIGVuYWJsZSBib3RoIGJpdHMsIGV2ZW4gb24gcmVhZCAqLwotCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9BQ0NFU1NfRU5BQkxFLAotCSAgICAgICAodmFsIHwgTUNQUl9OVk1fQUNDRVNTX0VOQUJMRV9FTiB8Ci0JCSAgICAgIE1DUFJfTlZNX0FDQ0VTU19FTkFCTEVfV1JfRU4pKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZGlzYWJsZV9udnJhbV9hY2Nlc3Moc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUpOwotCi0JLyogZGlzYWJsZSBib3RoIGJpdHMsIGV2ZW4gYWZ0ZXIgcmVhZCAqLwotCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9BQ0NFU1NfRU5BQkxFLAotCSAgICAgICAodmFsICYgfihNQ1BSX05WTV9BQ0NFU1NfRU5BQkxFX0VOIHwKLQkJCU1DUFJfTlZNX0FDQ0VTU19FTkFCTEVfV1JfRU4pKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfbnZyYW1fcmVhZF9kd29yZChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgb2Zmc2V0LCBfX2JlMzIgKnJldF92YWwsCi0JCQkJICB1MzIgY21kX2ZsYWdzKQotewotCWludCBjb3VudCwgaSwgcmM7Ci0JdTMyIHZhbDsKLQotCS8qIGJ1aWxkIHRoZSBjb21tYW5kIHdvcmQgKi8KLQljbWRfZmxhZ3MgfD0gTUNQUl9OVk1fQ09NTUFORF9ET0lUOwotCi0JLyogbmVlZCB0byBjbGVhciBET05FIGJpdCBzZXBhcmF0ZWx5ICovCi0JUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQsIE1DUFJfTlZNX0NPTU1BTkRfRE9ORSk7Ci0KLQkvKiBhZGRyZXNzIG9mIHRoZSBOVlJBTSB0byByZWFkIGZyb20gKi8KLQlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQUREUiwKLQkgICAgICAgKG9mZnNldCAmIE1DUFJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUUpKTsKLQotCS8qIGlzc3VlIGEgcmVhZCBjb21tYW5kICovCi0JUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQsIGNtZF9mbGFncyk7Ci0KLQkvKiBhZGp1c3QgdGltZW91dCBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KLQljb3VudCA9IE5WUkFNX1RJTUVPVVRfQ09VTlQ7Ci0JaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQotCQljb3VudCAqPSAxMDA7Ci0KLQkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JKnJldF92YWwgPSAwOwotCXJjID0gLUVCVVNZOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXVkZWxheSg1KTsKLQkJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQpOwotCi0JCWlmICh2YWwgJiBNQ1BSX05WTV9DT01NQU5EX0RPTkUpIHsKLQkJCXZhbCA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX05WTV9SRUFEKTsKLQkJCS8qIHdlIHJlYWQgbnZyYW0gZGF0YSBpbiBjcHUgb3JkZXIKLQkJCSAqIGJ1dCBldGh0b29sIHNlZXMgaXQgYXMgYW4gYXJyYXkgb2YgYnl0ZXMKLQkJCSAqIGNvbnZlcnRpbmcgdG8gYmlnLWVuZGlhbiB3aWxsIGRvIHRoZSB3b3JrICovCi0JCQkqcmV0X3ZhbCA9IGNwdV90b19iZTMyKHZhbCk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBibngyeF9udnJhbV9yZWFkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIHU4ICpyZXRfYnVmLAotCQkJICAgIGludCBidWZfc2l6ZSkKLXsKLQlpbnQgcmM7Ci0JdTMyIGNtZF9mbGFnczsKLQlfX2JlMzIgdmFsOwotCi0JaWYgKChvZmZzZXQgJiAweDAzKSB8fCAoYnVmX3NpemUgJiAweDAzKSB8fCAoYnVmX3NpemUgPT0gMCkpIHsKLQkJRFAoQk5YMlhfTVNHX05WTSwKLQkJICAgIkludmFsaWQgcGFyYW1ldGVyOiBvZmZzZXQgMHgleCAgYnVmX3NpemUgMHgleFxuIiwKLQkJICAgb2Zmc2V0LCBidWZfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChvZmZzZXQgKyBidWZfc2l6ZSA+IGJwLT5jb21tb24uZmxhc2hfc2l6ZSkgewotCQlEUChCTlgyWF9NU0dfTlZNLCAiSW52YWxpZCBwYXJhbWV0ZXI6IG9mZnNldCAoMHgleCkgKyIKLQkJCQkgICIgYnVmX3NpemUgKDB4JXgpID4gZmxhc2hfc2l6ZSAoMHgleClcbiIsCi0JCSAgIG9mZnNldCwgYnVmX3NpemUsIGJwLT5jb21tb24uZmxhc2hfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIHJlcXVlc3QgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLwotCXJjID0gYm54MnhfYWNxdWlyZV9udnJhbV9sb2NrKGJwKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIGVuYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCi0JYm54MnhfZW5hYmxlX252cmFtX2FjY2VzcyhicCk7Ci0KLQkvKiByZWFkIHRoZSBmaXJzdCB3b3JkKHMpICovCi0JY21kX2ZsYWdzID0gTUNQUl9OVk1fQ09NTUFORF9GSVJTVDsKLQl3aGlsZSAoKGJ1Zl9zaXplID4gc2l6ZW9mKHUzMikpICYmIChyYyA9PSAwKSkgewotCQlyYyA9IGJueDJ4X252cmFtX3JlYWRfZHdvcmQoYnAsIG9mZnNldCwgJnZhbCwgY21kX2ZsYWdzKTsKLQkJbWVtY3B5KHJldF9idWYsICZ2YWwsIDQpOwotCi0JCS8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZHdvcmQgKi8KLQkJb2Zmc2V0ICs9IHNpemVvZih1MzIpOwotCQlyZXRfYnVmICs9IHNpemVvZih1MzIpOwotCQlidWZfc2l6ZSAtPSBzaXplb2YodTMyKTsKLQkJY21kX2ZsYWdzID0gMDsKLQl9Ci0KLQlpZiAocmMgPT0gMCkgewotCQljbWRfZmxhZ3MgfD0gTUNQUl9OVk1fQ09NTUFORF9MQVNUOwotCQlyYyA9IGJueDJ4X252cmFtX3JlYWRfZHdvcmQoYnAsIG9mZnNldCwgJnZhbCwgY21kX2ZsYWdzKTsKLQkJbWVtY3B5KHJldF9idWYsICZ2YWwsIDQpOwotCX0KLQotCS8qIGRpc2FibGUgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLwotCWJueDJ4X2Rpc2FibGVfbnZyYW1fYWNjZXNzKGJwKTsKLQlibngyeF9yZWxlYXNlX252cmFtX2xvY2soYnApOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmVlYnVmKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCByYzsKLQotCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCURQKEJOWDJYX01TR19OVk0sICJldGh0b29sX2VlcHJvbTogY21kICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgbWFnaWMgMHgleCAgb2Zmc2V0IDB4JXggKCVkKSAgbGVuIDB4JXggKCVkKVxuIiwKLQkgICBlZXByb20tPmNtZCwgZWVwcm9tLT5tYWdpYywgZWVwcm9tLT5vZmZzZXQsIGVlcHJvbS0+b2Zmc2V0LAotCSAgIGVlcHJvbS0+bGVuLCBlZXByb20tPmxlbik7Ci0KLQkvKiBwYXJhbWV0ZXJzIGFscmVhZHkgdmFsaWRhdGVkIGluIGV0aHRvb2xfZ2V0X2VlcHJvbSAqLwotCi0JcmMgPSBibngyeF9udnJhbV9yZWFkKGJwLCBlZXByb20tPm9mZnNldCwgZWVidWYsIGVlcHJvbS0+bGVuKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBibngyeF9udnJhbV93cml0ZV9kd29yZChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgb2Zmc2V0LCB1MzIgdmFsLAotCQkJCSAgIHUzMiBjbWRfZmxhZ3MpCi17Ci0JaW50IGNvdW50LCBpLCByYzsKLQotCS8qIGJ1aWxkIHRoZSBjb21tYW5kIHdvcmQgKi8KLQljbWRfZmxhZ3MgfD0gTUNQUl9OVk1fQ09NTUFORF9ET0lUIHwgTUNQUl9OVk1fQ09NTUFORF9XUjsKLQotCS8qIG5lZWQgdG8gY2xlYXIgRE9ORSBiaXQgc2VwYXJhdGVseSAqLwotCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9DT01NQU5ELCBNQ1BSX05WTV9DT01NQU5EX0RPTkUpOwotCi0JLyogd3JpdGUgdGhlIGRhdGEgKi8KLQlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fV1JJVEUsIHZhbCk7Ci0KLQkvKiBhZGRyZXNzIG9mIHRoZSBOVlJBTSB0byB3cml0ZSB0byAqLwotCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX05WTV9BRERSLAotCSAgICAgICAob2Zmc2V0ICYgTUNQUl9OVk1fQUREUl9OVk1fQUREUl9WQUxVRSkpOwotCi0JLyogaXNzdWUgdGhlIHdyaXRlIGNvbW1hbmQgKi8KLQlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9OVk1fQ09NTUFORCwgY21kX2ZsYWdzKTsKLQotCS8qIGFkanVzdCB0aW1lb3V0IGZvciBlbXVsYXRpb24vRlBHQSAqLwotCWNvdW50ID0gTlZSQU1fVElNRU9VVF9DT1VOVDsKLQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCi0JCWNvdW50ICo9IDEwMDsKLQotCS8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlyYyA9IC1FQlVTWTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl1ZGVsYXkoNSk7Ci0JCXZhbCA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX05WTV9DT01NQU5EKTsKLQkJaWYgKHZhbCAmIE1DUFJfTlZNX0NPTU1BTkRfRE9ORSkgewotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNkZWZpbmUgQllURV9PRkZTRVQob2Zmc2V0KQkJKDggKiAob2Zmc2V0ICYgMHgwMykpCi0KLXN0YXRpYyBpbnQgYm54MnhfbnZyYW1fd3JpdGUxKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIHU4ICpkYXRhX2J1ZiwKLQkJCSAgICAgIGludCBidWZfc2l6ZSkKLXsKLQlpbnQgcmM7Ci0JdTMyIGNtZF9mbGFnczsKLQl1MzIgYWxpZ25fb2Zmc2V0OwotCV9fYmUzMiB2YWw7Ci0KLQlpZiAob2Zmc2V0ICsgYnVmX3NpemUgPiBicC0+Y29tbW9uLmZsYXNoX3NpemUpIHsKLQkJRFAoQk5YMlhfTVNHX05WTSwgIkludmFsaWQgcGFyYW1ldGVyOiBvZmZzZXQgKDB4JXgpICsiCi0JCQkJICAiIGJ1Zl9zaXplICgweCV4KSA+IGZsYXNoX3NpemUgKDB4JXgpXG4iLAotCQkgICBvZmZzZXQsIGJ1Zl9zaXplLCBicC0+Y29tbW9uLmZsYXNoX3NpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiByZXF1ZXN0IGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KLQlyYyA9IGJueDJ4X2FjcXVpcmVfbnZyYW1fbG9jayhicCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBlbmFibGUgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLwotCWJueDJ4X2VuYWJsZV9udnJhbV9hY2Nlc3MoYnApOwotCi0JY21kX2ZsYWdzID0gKE1DUFJfTlZNX0NPTU1BTkRfRklSU1QgfCBNQ1BSX05WTV9DT01NQU5EX0xBU1QpOwotCWFsaWduX29mZnNldCA9IChvZmZzZXQgJiB+MHgwMyk7Ci0JcmMgPSBibngyeF9udnJhbV9yZWFkX2R3b3JkKGJwLCBhbGlnbl9vZmZzZXQsICZ2YWwsIGNtZF9mbGFncyk7Ci0KLQlpZiAocmMgPT0gMCkgewotCQl2YWwgJj0gfigweGZmIDw8IEJZVEVfT0ZGU0VUKG9mZnNldCkpOwotCQl2YWwgfD0gKCpkYXRhX2J1ZiA8PCBCWVRFX09GRlNFVChvZmZzZXQpKTsKLQotCQkvKiBudnJhbSBkYXRhIGlzIHJldHVybmVkIGFzIGFuIGFycmF5IG9mIGJ5dGVzCi0JCSAqIGNvbnZlcnQgaXQgYmFjayB0byBjcHUgb3JkZXIgKi8KLQkJdmFsID0gYmUzMl90b19jcHUodmFsKTsKLQotCQlyYyA9IGJueDJ4X252cmFtX3dyaXRlX2R3b3JkKGJwLCBhbGlnbl9vZmZzZXQsIHZhbCwKLQkJCQkJICAgICBjbWRfZmxhZ3MpOwotCX0KLQotCS8qIGRpc2FibGUgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLwotCWJueDJ4X2Rpc2FibGVfbnZyYW1fYWNjZXNzKGJwKTsKLQlibngyeF9yZWxlYXNlX252cmFtX2xvY2soYnApOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X252cmFtX3dyaXRlKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIHU4ICpkYXRhX2J1ZiwKLQkJCSAgICAgaW50IGJ1Zl9zaXplKQotewotCWludCByYzsKLQl1MzIgY21kX2ZsYWdzOwotCXUzMiB2YWw7Ci0JdTMyIHdyaXR0ZW5fc29fZmFyOwotCi0JaWYgKGJ1Zl9zaXplID09IDEpCS8qIGV0aHRvb2wgKi8KLQkJcmV0dXJuIGJueDJ4X252cmFtX3dyaXRlMShicCwgb2Zmc2V0LCBkYXRhX2J1ZiwgYnVmX3NpemUpOwotCi0JaWYgKChvZmZzZXQgJiAweDAzKSB8fCAoYnVmX3NpemUgJiAweDAzKSB8fCAoYnVmX3NpemUgPT0gMCkpIHsKLQkJRFAoQk5YMlhfTVNHX05WTSwKLQkJICAgIkludmFsaWQgcGFyYW1ldGVyOiBvZmZzZXQgMHgleCAgYnVmX3NpemUgMHgleFxuIiwKLQkJICAgb2Zmc2V0LCBidWZfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChvZmZzZXQgKyBidWZfc2l6ZSA+IGJwLT5jb21tb24uZmxhc2hfc2l6ZSkgewotCQlEUChCTlgyWF9NU0dfTlZNLCAiSW52YWxpZCBwYXJhbWV0ZXI6IG9mZnNldCAoMHgleCkgKyIKLQkJCQkgICIgYnVmX3NpemUgKDB4JXgpID4gZmxhc2hfc2l6ZSAoMHgleClcbiIsCi0JCSAgIG9mZnNldCwgYnVmX3NpemUsIGJwLT5jb21tb24uZmxhc2hfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIHJlcXVlc3QgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLwotCXJjID0gYm54MnhfYWNxdWlyZV9udnJhbV9sb2NrKGJwKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIGVuYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCi0JYm54MnhfZW5hYmxlX252cmFtX2FjY2VzcyhicCk7Ci0KLQl3cml0dGVuX3NvX2ZhciA9IDA7Ci0JY21kX2ZsYWdzID0gTUNQUl9OVk1fQ09NTUFORF9GSVJTVDsKLQl3aGlsZSAoKHdyaXR0ZW5fc29fZmFyIDwgYnVmX3NpemUpICYmIChyYyA9PSAwKSkgewotCQlpZiAod3JpdHRlbl9zb19mYXIgPT0gKGJ1Zl9zaXplIC0gc2l6ZW9mKHUzMikpKQotCQkJY21kX2ZsYWdzIHw9IE1DUFJfTlZNX0NPTU1BTkRfTEFTVDsKLQkJZWxzZSBpZiAoKChvZmZzZXQgKyA0KSAlIE5WUkFNX1BBR0VfU0laRSkgPT0gMCkKLQkJCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0xBU1Q7Ci0JCWVsc2UgaWYgKChvZmZzZXQgJSBOVlJBTV9QQUdFX1NJWkUpID09IDApCi0JCQljbWRfZmxhZ3MgfD0gTUNQUl9OVk1fQ09NTUFORF9GSVJTVDsKLQotCQltZW1jcHkoJnZhbCwgZGF0YV9idWYsIDQpOwotCi0JCXJjID0gYm54MnhfbnZyYW1fd3JpdGVfZHdvcmQoYnAsIG9mZnNldCwgdmFsLCBjbWRfZmxhZ3MpOwotCi0JCS8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZHdvcmQgKi8KLQkJb2Zmc2V0ICs9IHNpemVvZih1MzIpOwotCQlkYXRhX2J1ZiArPSBzaXplb2YodTMyKTsKLQkJd3JpdHRlbl9zb19mYXIgKz0gc2l6ZW9mKHUzMik7Ci0JCWNtZF9mbGFncyA9IDA7Ci0JfQotCi0JLyogZGlzYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCi0JYm54MnhfZGlzYWJsZV9udnJhbV9hY2Nlc3MoYnApOwotCWJueDJ4X3JlbGVhc2VfbnZyYW1fbG9jayhicCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZWVidWYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JRFAoQk5YMlhfTVNHX05WTSwgImV0aHRvb2xfZWVwcm9tOiBjbWQgJWRcbiIKLQkgICBEUF9MRVZFTCAiICBtYWdpYyAweCV4ICBvZmZzZXQgMHgleCAoJWQpICBsZW4gMHgleCAoJWQpXG4iLAotCSAgIGVlcHJvbS0+Y21kLCBlZXByb20tPm1hZ2ljLCBlZXByb20tPm9mZnNldCwgZWVwcm9tLT5vZmZzZXQsCi0JICAgZWVwcm9tLT5sZW4sIGVlcHJvbS0+bGVuKTsKLQotCS8qIHBhcmFtZXRlcnMgYWxyZWFkeSB2YWxpZGF0ZWQgaW4gZXRodG9vbF9zZXRfZWVwcm9tICovCi0KLQkvKiBQSFkgZWVwcm9tIGNhbiBiZSBhY2Nlc3NlZCBvbmx5IGJ5IHRoZSBQTUYgKi8KLQlpZiAoKGVlcHJvbS0+bWFnaWMgPj0gMHg1MDQ4NTkwMCkgJiYgKGVlcHJvbS0+bWFnaWMgPD0gMHg1MDQ4NTlGRikgJiYKLQkgICAgIWJwLT5wb3J0LnBtZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZWVwcm9tLT5tYWdpYyA9PSAweDUwNDg1OTUwKSB7Ci0JCS8qICdQSFlQJyAoMHg1MDQ4NTk1MCk6IHByZXBhcmUgcGh5IGZvciBGVyB1cGdyYWRlICovCi0JCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfU1RPUCk7Ci0KLQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7Ci0JCXJjIHw9IGJueDJ4X2xpbmtfcmVzZXQoJmJwLT5saW5rX3BhcmFtcywKLQkJCQkgICAgICAgJmJwLT5saW5rX3ZhcnMsIDApOwotCQlpZiAoWEdYU19FWFRfUEhZX1RZUEUoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKSA9PQotCQkJCQlQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxKQotCQkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMCwKLQkJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19ISUdILCBwb3J0KTsKLQkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7Ci0JCWJueDJ4X2xpbmtfcmVwb3J0KGJwKTsKLQotCX0gZWxzZSBpZiAoZWVwcm9tLT5tYWdpYyA9PSAweDUwNDg1OTUyKSB7Ci0JCS8qICdQSFlSJyAoMHg1MDQ4NTk1Mik6IHJlLWluaXQgbGluayBhZnRlciBGVyB1cGdyYWRlICovCi0JCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikgewotCQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7Ci0JCQlyYyB8PSBibngyeF9saW5rX3Jlc2V0KCZicC0+bGlua19wYXJhbXMsCi0JCQkJCSAgICAgICAmYnAtPmxpbmtfdmFycywgMSk7Ci0KLQkJCXJjIHw9IGJueDJ4X3BoeV9pbml0KCZicC0+bGlua19wYXJhbXMsCi0JCQkJCSAgICAgJmJwLT5saW5rX3ZhcnMpOwotCQkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7Ci0JCQlibngyeF9jYWxjX2ZjX2FkdihicCk7Ci0JCX0KLQl9IGVsc2UgaWYgKGVlcHJvbS0+bWFnaWMgPT0gMHg1Mzk4NTk0MykgewotCQkvKiAnUEhZQycgKDB4NTM5ODU5NDMpOiBQSFkgRlcgdXBncmFkZSBjb21wbGV0ZWQgKi8KLQkJaWYgKFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZykgPT0KLQkJCQkgICAgICAgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMSkgewotCQkJdTggZXh0X3BoeV9hZGRyID0KLQkJCSAgICAgWEdYU19FWFRfUEhZX0FERFIoYnAtPmxpbmtfcGFyYW1zLmV4dF9waHlfY29uZmlnKTsKLQotCQkJLyogRFNQIFJlbW92ZSBEb3dubG9hZCBNb2RlICovCi0JCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18wLAotCQkJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX0xPVywgcG9ydCk7Ci0KLQkJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwotCi0JCQlibngyeF9zZng3MTAxX3NwX3N3X3Jlc2V0KGJwLCBwb3J0LCBleHRfcGh5X2FkZHIpOwotCi0JCQkvKiB3YWl0IDAuNSBzZWMgdG8gYWxsb3cgaXQgdG8gcnVuICovCi0JCQltc2xlZXAoNTAwKTsKLQkJCWJueDJ4X2V4dF9waHlfaHdfcmVzZXQoYnAsIHBvcnQpOwotCQkJbXNsZWVwKDUwMCk7Ci0JCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQkJfQotCX0gZWxzZQotCQlyYyA9IGJueDJ4X252cmFtX3dyaXRlKGJwLCBlZXByb20tPm9mZnNldCwgZWVidWYsIGVlcHJvbS0+bGVuKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBibngyeF9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JbWVtc2V0KGNvYWwsIDAsIHNpemVvZihzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSkpOwotCi0JY29hbC0+cnhfY29hbGVzY2VfdXNlY3MgPSBicC0+cnhfdGlja3M7Ci0JY29hbC0+dHhfY29hbGVzY2VfdXNlY3MgPSBicC0+dHhfdGlja3M7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBibngyeF9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JYnAtPnJ4X3RpY2tzID0gKHUxNiljb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKLQlpZiAoYnAtPnJ4X3RpY2tzID4gQk5YMlhfTUFYX0NPQUxFU0NFX1RPVVQpCi0JCWJwLT5yeF90aWNrcyA9IEJOWDJYX01BWF9DT0FMRVNDRV9UT1VUOwotCi0JYnAtPnR4X3RpY2tzID0gKHUxNiljb2FsLT50eF9jb2FsZXNjZV91c2VjczsKLQlpZiAoYnAtPnR4X3RpY2tzID4gQk5YMlhfTUFYX0NPQUxFU0NFX1RPVVQpCi0JCWJwLT50eF90aWNrcyA9IEJOWDJYX01BWF9DT0FMRVNDRV9UT1VUOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJYm54MnhfdXBkYXRlX2NvYWxlc2NlKGJwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWVyaW5nLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9BVkFJTDsKLQllcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7Ci0JZXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKLQotCWVyaW5nLT5yeF9wZW5kaW5nID0gYnAtPnJ4X3Jpbmdfc2l6ZTsKLQllcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKLQllcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IDA7Ci0KLQllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBNQVhfVFhfQVZBSUw7Ci0JZXJpbmctPnR4X3BlbmRpbmcgPSBicC0+dHhfcmluZ19zaXplOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCByYyA9IDA7Ci0KLQlpZiAoYnAtPnJlY292ZXJ5X3N0YXRlICE9IEJOWDJYX1JFQ09WRVJZX0RPTkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJIYW5kbGluZyBwYXJpdHkgZXJyb3IgcmVjb3ZlcnkuIFRyeSBhZ2FpbiBsYXRlclxuIik7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWlmICgoZXJpbmctPnJ4X3BlbmRpbmcgPiBNQVhfUlhfQVZBSUwpIHx8Ci0JICAgIChlcmluZy0+dHhfcGVuZGluZyA+IE1BWF9UWF9BVkFJTCkgfHwKLQkgICAgKGVyaW5nLT50eF9wZW5kaW5nIDw9IE1BWF9TS0JfRlJBR1MgKyA0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlicC0+cnhfcmluZ19zaXplID0gZXJpbmctPnJ4X3BlbmRpbmc7Ci0JYnAtPnR4X3Jpbmdfc2l6ZSA9IGVyaW5nLT50eF9wZW5kaW5nOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKLQkJcmMgPSBibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JZXBhdXNlLT5hdXRvbmVnID0gKGJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID09Ci0JCQkgICBCTlgyWF9GTE9XX0NUUkxfQVVUTykgJiYKLQkJCSAgKGJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRyk7Ci0KLQllcGF1c2UtPnJ4X3BhdXNlID0gKChicC0+bGlua192YXJzLmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9SWCkgPT0KLQkJCSAgICBCTlgyWF9GTE9XX0NUUkxfUlgpOwotCWVwYXVzZS0+dHhfcGF1c2UgPSAoKGJwLT5saW5rX3ZhcnMuZmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKSA9PQotCQkJICAgIEJOWDJYX0ZMT1dfQ1RSTF9UWCk7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgImV0aHRvb2xfcGF1c2VwYXJhbTogY21kICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgYXV0b25lZyAlZCAgcnhfcGF1c2UgJWQgIHR4X3BhdXNlICVkXG4iLAotCSAgIGVwYXVzZS0+Y21kLCBlcGF1c2UtPmF1dG9uZWcsIGVwYXVzZS0+cnhfcGF1c2UsIGVwYXVzZS0+dHhfcGF1c2UpOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKElTX0UxSE1GKGJwKSkKLQkJcmV0dXJuIDA7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgImV0aHRvb2xfcGF1c2VwYXJhbTogY21kICVkXG4iCi0JICAgRFBfTEVWRUwgIiAgYXV0b25lZyAlZCAgcnhfcGF1c2UgJWQgIHR4X3BhdXNlICVkXG4iLAotCSAgIGVwYXVzZS0+Y21kLCBlcGF1c2UtPmF1dG9uZWcsIGVwYXVzZS0+cnhfcGF1c2UsIGVwYXVzZS0+dHhfcGF1c2UpOwotCi0JYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfQVVUTzsKLQotCWlmIChlcGF1c2UtPnJ4X3BhdXNlKQotCQlicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCB8PSBCTlgyWF9GTE9XX0NUUkxfUlg7Ci0KLQlpZiAoZXBhdXNlLT50eF9wYXVzZSkKLQkJYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwgfD0gQk5YMlhfRkxPV19DVFJMX1RYOwotCi0JaWYgKGJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID09IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKQotCQlicC0+bGlua19wYXJhbXMucmVxX2Zsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOwotCi0JaWYgKGVwYXVzZS0+YXV0b25lZykgewotCQlpZiAoIShicC0+cG9ydC5zdXBwb3J0ZWQgJiBTVVBQT1JURURfQXV0b25lZykpIHsKLQkJCURQKE5FVElGX01TR19MSU5LLCAiYXV0b25lZyBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKGJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKLQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfZmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX0FVVE87Ci0JfQotCi0JRFAoTkVUSUZfTVNHX0xJTkssCi0JICAgInJlcV9mbG93X2N0cmwgMHgleFxuIiwgYnAtPmxpbmtfcGFyYW1zLnJlcV9mbG93X2N0cmwpOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1NUT1ApOwotCQlibngyeF9saW5rX3NldChicCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYm54Mnhfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBjaGFuZ2VkID0gMDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiBUcnkgYWdhaW4gbGF0ZXJcbiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQkvKiBUUEEgcmVxdWlyZXMgUnggQ1NVTSBvZmZsb2FkaW5nICovCi0JaWYgKChkYXRhICYgRVRIX0ZMQUdfTFJPKSAmJiBicC0+cnhfY3N1bSkgewotCQlpZiAoIWRpc2FibGVfdHBhKSB7Ci0JCQlpZiAoIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pKSB7Ci0JCQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKLQkJCQlicC0+ZmxhZ3MgfD0gVFBBX0VOQUJMRV9GTEFHOwotCQkJCWNoYW5nZWQgPSAxOwotCQkJfQotCQl9IGVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgewotCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0xSTzsKLQkJYnAtPmZsYWdzICY9IH5UUEFfRU5BQkxFX0ZMQUc7Ci0JCWNoYW5nZWQgPSAxOwotCX0KLQotCWlmIChkYXRhICYgRVRIX0ZMQUdfUlhIQVNIKQotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfUlhIQVNIOwotCWVsc2UKLQkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9SWEhBU0g7Ci0KLQlpZiAoY2hhbmdlZCAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX05PUk1BTCk7Ci0JCXJjID0gYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1MzIgYm54MnhfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiBicC0+cnhfY3N1bTsKLX0KLQotc3RhdGljIGludCBibngyeF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiBUcnkgYWdhaW4gbGF0ZXJcbiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlicC0+cnhfY3N1bSA9IGRhdGE7Ci0KLQkvKiBEaXNhYmxlIFRQQSwgd2hlbiBSeCBDU1VNIGlzIGRpc2FibGVkLiBPdGhlcndpc2UgYWxsCi0JICAgVFBBJ2VkIHBhY2tldHMgd2lsbCBiZSBkaXNjYXJkZWQgZHVlIHRvIHdyb25nIFRDUCBDU1VNICovCi0JaWYgKCFkYXRhKSB7Ci0JCXUzMiBmbGFncyA9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzKGRldik7Ci0KLQkJcmMgPSBibngyeF9zZXRfZmxhZ3MoZGV2LCAoZmxhZ3MgJiB+RVRIX0ZMQUdfTFJPKSk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCi17Ci0JaWYgKGRhdGEpIHsKLQkJZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04pOwotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLQl9IGVsc2UgewotCQlkZXYtPmZlYXR1cmVzICY9IH4oTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04pOwotCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCWNoYXIgc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07Ci19IGJueDJ4X3Rlc3RzX3N0cl9hcnJbQk5YMlhfTlVNX1RFU1RTXSA9IHsKLQl7ICJyZWdpc3Rlcl90ZXN0IChvZmZsaW5lKSIgfSwKLQl7ICJtZW1vcnlfdGVzdCAob2ZmbGluZSkiIH0sCi0JeyAibG9vcGJhY2tfdGVzdCAob2ZmbGluZSkiIH0sCi0JeyAibnZyYW1fdGVzdCAob25saW5lKSIgfSwKLQl7ICJpbnRlcnJ1cHRfdGVzdCAob25saW5lKSIgfSwKLQl7ICJsaW5rX3Rlc3QgKG9ubGluZSkiIH0sCi0JeyAiaWRsZSBjaGVjayAob25saW5lKSIgfQotfTsKLQotc3RhdGljIGludCBibngyeF90ZXN0X3JlZ2lzdGVycyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpZHgsIGksIHJjID0gLUVOT0RFVjsKLQl1MzIgd3JfdmFsID0gMDsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCQl1MzIgb2Zmc2V0MDsKLQkJdTMyIG9mZnNldDE7Ci0JCXUzMiBtYXNrOwotCX0gcmVnX3RibFtdID0gewotLyogMCAqLwkJeyBCUkIxX1JFR19QQVVTRV9MT1dfVEhSRVNIT0xEXzAsICAgICAgNCwgMHgwMDAwMDNmZiB9LAotCQl7IERPUlFfUkVHX0RCX0FERFIwLCAgICAgICAgICAgICAgICAgICA0LCAweGZmZmZmZmZmIH0sCi0JCXsgSENfUkVHX0FHR19JTlRfMCwgICAgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDAzZmYgfSwKLQkJeyBQQkZfUkVHX01BQ19JRjBfRU5BQkxFLCAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMSB9LAotCQl7IFBCRl9SRUdfUDBfSU5JVF9DUkQsICAgICAgICAgICAgICAgICA0LCAweDAwMDAwN2ZmIH0sCi0JCXsgUFJTX1JFR19DSURfUE9SVF8wLCAgICAgICAgICAgICAgICAgIDQsIDB4MDBmZmZmZmYgfSwKLQkJeyBQWFAyX1JFR19QU1dSUV9DRFUwX0wyUCwgICAgICAgICAgICAgNCwgMHgwMDBmZmZmZiB9LAotCQl7IFBYUDJfUkVHX1JRX0NEVTBfRUZJUlNUX01FTV9BRERSLCAgICA4LCAweDAwMDNmZmZmIH0sCi0JCXsgUFhQMl9SRUdfUFNXUlFfVE0wX0wyUCwgICAgICAgICAgICAgIDQsIDB4MDAwZmZmZmYgfSwKLQkJeyBQWFAyX1JFR19SUV9VU0RNMF9FRklSU1RfTUVNX0FERFIsICAgOCwgMHgwMDAzZmZmZiB9LAotLyogMTAgKi8JeyBQWFAyX1JFR19QU1dSUV9UU0RNMF9MMlAsICAgICAgICAgICAgNCwgMHgwMDBmZmZmZiB9LAotCQl7IFFNX1JFR19DT05OTlVNXzAsICAgICAgICAgICAgICAgICAgICA0LCAweDAwMGZmZmZmIH0sCi0JCXsgVE1fUkVHX0xJTjBfTUFYX0FDVElWRV9DSUQsICAgICAgICAgIDQsIDB4MDAwM2ZmZmYgfSwKLQkJeyBTUkNfUkVHX0tFWVJTUzBfMCwgICAgICAgICAgICAgICAgICA0MCwgMHhmZmZmZmZmZiB9LAotCQl7IFNSQ19SRUdfS0VZUlNTMF83LCAgICAgICAgICAgICAgICAgIDQwLCAweGZmZmZmZmZmIH0sCi0JCXsgWENNX1JFR19XVV9EQV9TRVRfVE1SX0NOVF9GTEdfQ01EMDAsIDQsIDB4MDAwMDAwMDEgfSwKLQkJeyBYQ01fUkVHX1dVX0RBX0NOVF9DTUQwMCwgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMyB9LAotCQl7IFhDTV9SRUdfR0xCX0RFTF9BQ0tfTUFYX0NOVF8wLCAgICAgICA0LCAweDAwMDAwMGZmIH0sCi0JCXsgTklHX1JFR19MTEgwX1RfQklULCAgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX0VNQUMwX0lOX0VOLCAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMSB9LAotLyogMjAgKi8JeyBOSUdfUkVHX0JNQUMwX0lOX0VOLCAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMSB9LAotCQl7IE5JR19SRUdfWENNMF9PVVRfRU4sICAgICAgICAgICAgICAgICA0LCAweDAwMDAwMDAxIH0sCi0JCXsgTklHX1JFR19CUkIwX09VVF9FTiwgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX0xMSDBfWENNX01BU0ssICAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwNyB9LAotCQl7IE5JR19SRUdfTExIMF9BQ1BJX1BBVF82X0xFTiwgICAgICAgIDY4LCAweDAwMDAwMGZmIH0sCi0JCXsgTklHX1JFR19MTEgwX0FDUElfUEFUXzBfQ1JDLCAgICAgICAgNjgsIDB4ZmZmZmZmZmYgfSwKLQkJeyBOSUdfUkVHX0xMSDBfREVTVF9NQUNfMF8wLCAgICAgICAgIDE2MCwgMHhmZmZmZmZmZiB9LAotCQl7IE5JR19SRUdfTExIMF9ERVNUX0lQXzBfMSwgICAgICAgICAgMTYwLCAweGZmZmZmZmZmIH0sCi0JCXsgTklHX1JFR19MTEgwX0lQVjRfSVBWNl8wLCAgICAgICAgICAxNjAsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX0xMSDBfREVTVF9VRFBfMCwgICAgICAgICAgIDE2MCwgMHgwMDAwZmZmZiB9LAotLyogMzAgKi8JeyBOSUdfUkVHX0xMSDBfREVTVF9UQ1BfMCwgICAgICAgICAgIDE2MCwgMHgwMDAwZmZmZiB9LAotCQl7IE5JR19SRUdfTExIMF9WTEFOX0lEXzAsICAgICAgICAgICAgMTYwLCAweDAwMDAwZmZmIH0sCi0JCXsgTklHX1JFR19YR1hTX1NFUkRFUzBfTU9ERV9TRUwsICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX0xFRF9DT05UUk9MX09WRVJSSURFX1RSQUZGSUNfUDAsIDQsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAsICAgICAgNCwgMHgwN2ZmZmZmZiB9LAotCQl7IE5JR19SRUdfWEdYUzBfQ1RSTF9FWFRSRU1PVEVNRElPU1QsIDI0LCAweDAwMDAwMDAxIH0sCi0JCXsgTklHX1JFR19TRVJERVMwX0NUUkxfUEhZX0FERFIsICAgICAgMTYsIDB4MDAwMDAwMWYgfSwKLQotCQl7IDB4ZmZmZmZmZmYsIDAsIDB4MDAwMDAwMDAgfQotCX07Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCi0JCXJldHVybiByYzsKLQotCS8qIFJlcGVhdCB0aGUgdGVzdCB0d2ljZToKLQkgICBGaXJzdCBieSB3cml0aW5nIDB4MDAwMDAwMDAsIHNlY29uZCBieSB3cml0aW5nIDB4ZmZmZmZmZmYgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKSB7Ci0KLQkJc3dpdGNoIChpZHgpIHsKLQkJY2FzZSAwOgotCQkJd3JfdmFsID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl3cl92YWwgPSAweGZmZmZmZmZmOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyByZWdfdGJsW2ldLm9mZnNldDAgIT0gMHhmZmZmZmZmZjsgaSsrKSB7Ci0JCQl1MzIgb2Zmc2V0LCBtYXNrLCBzYXZlX3ZhbCwgdmFsOwotCi0JCQlvZmZzZXQgPSByZWdfdGJsW2ldLm9mZnNldDAgKyBwb3J0KnJlZ190YmxbaV0ub2Zmc2V0MTsKLQkJCW1hc2sgPSByZWdfdGJsW2ldLm1hc2s7Ci0KLQkJCXNhdmVfdmFsID0gUkVHX1JEKGJwLCBvZmZzZXQpOwotCi0JCQlSRUdfV1IoYnAsIG9mZnNldCwgKHdyX3ZhbCAmIG1hc2spKTsKLQkJCXZhbCA9IFJFR19SRChicCwgb2Zmc2V0KTsKLQotCQkJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVnaXN0ZXIncyB2YWx1ZSAqLwotCQkJUkVHX1dSKGJwLCBvZmZzZXQsIHNhdmVfdmFsKTsKLQotCQkJLyogdmVyaWZ5IHZhbHVlIGlzIGFzIGV4cGVjdGVkICovCi0JCQlpZiAoKHZhbCAmIG1hc2spICE9ICh3cl92YWwgJiBtYXNrKSkgewotCQkJCURQKE5FVElGX01TR19QUk9CRSwKLQkJCQkgICAib2Zmc2V0IDB4JXg6IHZhbCAweCV4ICE9IDB4JXggbWFzayAweCV4XG4iLAotCQkJCSAgIG9mZnNldCwgdmFsLCB3cl92YWwsIG1hc2spOwotCQkJCWdvdG8gdGVzdF9yZWdfZXhpdDsKLQkJCX0KLQkJfQotCX0KLQotCXJjID0gMDsKLQotdGVzdF9yZWdfZXhpdDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfdGVzdF9tZW1vcnkoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaSwgaiwgcmMgPSAtRU5PREVWOwotCXUzMiB2YWw7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0JCXUzMiBvZmZzZXQ7Ci0JCWludCBzaXplOwotCX0gbWVtX3RibFtdID0gewotCQl7IENDTV9SRUdfWFhfREVTQ1JfVEFCTEUsICAgQ0NNX1JFR19YWF9ERVNDUl9UQUJMRV9TSVpFIH0sCi0JCXsgQ0ZDX1JFR19BQ1RJVklUWV9DT1VOVEVSLCBDRkNfUkVHX0FDVElWSVRZX0NPVU5URVJfU0laRSB9LAotCQl7IENGQ19SRUdfTElOS19MSVNULCAgICAgICAgQ0ZDX1JFR19MSU5LX0xJU1RfU0laRSB9LAotCQl7IERNQUVfUkVHX0NNRF9NRU0sICAgICAgICAgRE1BRV9SRUdfQ01EX01FTV9TSVpFIH0sCi0JCXsgVENNX1JFR19YWF9ERVNDUl9UQUJMRSwgICBUQ01fUkVHX1hYX0RFU0NSX1RBQkxFX1NJWkUgfSwKLQkJeyBVQ01fUkVHX1hYX0RFU0NSX1RBQkxFLCAgIFVDTV9SRUdfWFhfREVTQ1JfVEFCTEVfU0laRSB9LAotCQl7IFhDTV9SRUdfWFhfREVTQ1JfVEFCTEUsICAgWENNX1JFR19YWF9ERVNDUl9UQUJMRV9TSVpFIH0sCi0KLQkJeyAweGZmZmZmZmZmLCAwIH0KLQl9OwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCQljaGFyICpuYW1lOwotCQl1MzIgb2Zmc2V0OwotCQl1MzIgZTFfbWFzazsKLQkJdTMyIGUxaF9tYXNrOwotCX0gcHJ0eV90YmxbXSA9IHsKLQkJeyAiQ0NNX1BSVFlfU1RTIiwgIENDTV9SRUdfQ0NNX1BSVFlfU1RTLCAgIDB4M2ZmYzAsIDAgfSwKLQkJeyAiQ0ZDX1BSVFlfU1RTIiwgIENGQ19SRUdfQ0ZDX1BSVFlfU1RTLCAgIDB4MiwgICAgIDB4MiB9LAotCQl7ICJETUFFX1BSVFlfU1RTIiwgRE1BRV9SRUdfRE1BRV9QUlRZX1NUUywgMCwgICAgICAgMCB9LAotCQl7ICJUQ01fUFJUWV9TVFMiLCAgVENNX1JFR19UQ01fUFJUWV9TVFMsICAgMHgzZmZjMCwgMCB9LAotCQl7ICJVQ01fUFJUWV9TVFMiLCAgVUNNX1JFR19VQ01fUFJUWV9TVFMsICAgMHgzZmZjMCwgMCB9LAotCQl7ICJYQ01fUFJUWV9TVFMiLCAgWENNX1JFR19YQ01fUFJUWV9TVFMsICAgMHgzZmZjMSwgMCB9LAotCi0JCXsgTlVMTCwgMHhmZmZmZmZmZiwgMCwgMCB9Ci0JfTsKLQotCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkKLQkJcmV0dXJuIHJjOwotCi0JLyogR28gdGhyb3VnaCBhbGwgdGhlIG1lbW9yaWVzICovCi0JZm9yIChpID0gMDsgbWVtX3RibFtpXS5vZmZzZXQgIT0gMHhmZmZmZmZmZjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgbWVtX3RibFtpXS5zaXplOyBqKyspCi0JCQlSRUdfUkQoYnAsIG1lbV90YmxbaV0ub2Zmc2V0ICsgaio0KTsKLQotCS8qIENoZWNrIHRoZSBwYXJpdHkgc3RhdHVzICovCi0JZm9yIChpID0gMDsgcHJ0eV90YmxbaV0ub2Zmc2V0ICE9IDB4ZmZmZmZmZmY7IGkrKykgewotCQl2YWwgPSBSRUdfUkQoYnAsIHBydHlfdGJsW2ldLm9mZnNldCk7Ci0JCWlmICgoQ0hJUF9JU19FMShicCkgJiYgKHZhbCAmIH4ocHJ0eV90YmxbaV0uZTFfbWFzaykpKSB8fAotCQkgICAgKENISVBfSVNfRTFIKGJwKSAmJiAodmFsICYgfihwcnR5X3RibFtpXS5lMWhfbWFzaykpKSkgewotCQkJRFAoTkVUSUZfTVNHX0hXLAotCQkJICAgIiVzIGlzIDB4JXhcbiIsIHBydHlfdGJsW2ldLm5hbWUsIHZhbCk7Ci0JCQlnb3RvIHRlc3RfbWVtX2V4aXQ7Ci0JCX0KLQl9Ci0KLQlyYyA9IDA7Ci0KLXRlc3RfbWVtX2V4aXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF93YWl0X2Zvcl9saW5rKHN0cnVjdCBibngyeCAqYnAsIHU4IGxpbmtfdXApCi17Ci0JaW50IGNudCA9IDEwMDA7Ci0KLQlpZiAobGlua191cCkKLQkJd2hpbGUgKGJueDJ4X2xpbmtfdGVzdChicCkgJiYgY250LS0pCi0JCQltc2xlZXAoMTApOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3J1bl9sb29wYmFjayhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbG9vcGJhY2tfbW9kZSwgdTggbGlua191cCkKLXsKLQl1bnNpZ25lZCBpbnQgcGt0X3NpemUsIG51bV9wa3RzLCBpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgY2hhciAqcGFja2V0OwotCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnBfcnggPSAmYnAtPmZwWzBdOwotCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnBfdHggPSAmYnAtPmZwWzBdOwotCXUxNiB0eF9zdGFydF9pZHgsIHR4X2lkeDsKLQl1MTYgcnhfc3RhcnRfaWR4LCByeF9pZHg7Ci0JdTE2IHBrdF9wcm9kLCBiZF9wcm9kOwotCXN0cnVjdCBzd190eF9iZCAqdHhfYnVmOwotCXN0cnVjdCBldGhfdHhfc3RhcnRfYmQgKnR4X3N0YXJ0X2JkOwotCXN0cnVjdCBldGhfdHhfcGFyc2VfYmQgKnBiZCA9IE5VTEw7Ci0JZG1hX2FkZHJfdCBtYXBwaW5nOwotCXVuaW9uIGV0aF9yeF9jcWUgKmNxZTsKLQl1OCBjcWVfZnBfZmxhZ3M7Ci0Jc3RydWN0IHN3X3J4X2JkICpyeF9idWY7Ci0JdTE2IGxlbjsKLQlpbnQgcmMgPSAtRU5PREVWOwotCi0JLyogY2hlY2sgdGhlIGxvb3BiYWNrIG1vZGUgKi8KLQlzd2l0Y2ggKGxvb3BiYWNrX21vZGUpIHsKLQljYXNlIEJOWDJYX1BIWV9MT09QQkFDSzoKLQkJaWYgKGJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlICE9IExPT1BCQUNLX1hHWFNfMTApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBCTlgyWF9NQUNfTE9PUEJBQ0s6Ci0JCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gTE9PUEJBQ0tfQk1BQzsKLQkJYm54MnhfcGh5X2luaXQoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBwcmVwYXJlIHRoZSBsb29wYmFjayBwYWNrZXQgKi8KLQlwa3Rfc2l6ZSA9ICgoKGJwLT5kZXYtPm10dSA8IEVUSF9NQVhfUEFDS0VUX1NJWkUpID8KLQkJICAgICBicC0+ZGV2LT5tdHUgOiBFVEhfTUFYX1BBQ0tFVF9TSVpFKSArIEVUSF9ITEVOKTsKLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGJwLT5kZXYsIGJwLT5yeF9idWZfc2l6ZSk7Ci0JaWYgKCFza2IpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHRlc3RfbG9vcGJhY2tfZXhpdDsKLQl9Ci0JcGFja2V0ID0gc2tiX3B1dChza2IsIHBrdF9zaXplKTsKLQltZW1jcHkocGFja2V0LCBicC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbXNldChwYWNrZXQgKyBFVEhfQUxFTiwgMCwgRVRIX0FMRU4pOwotCW1lbXNldChwYWNrZXQgKyAyKkVUSF9BTEVOLCAweDc3LCAoRVRIX0hMRU4gLSAyKkVUSF9BTEVOKSk7Ci0JZm9yIChpID0gRVRIX0hMRU47IGkgPCBwa3Rfc2l6ZTsgaSsrKQotCQlwYWNrZXRbaV0gPSAodW5zaWduZWQgY2hhcikgKGkgJiAweGZmKTsKLQotCS8qIHNlbmQgdGhlIGxvb3BiYWNrIHBhY2tldCAqLwotCW51bV9wa3RzID0gMDsKLQl0eF9zdGFydF9pZHggPSBsZTE2X3RvX2NwdSgqZnBfdHgtPnR4X2NvbnNfc2IpOwotCXJ4X3N0YXJ0X2lkeCA9IGxlMTZfdG9fY3B1KCpmcF9yeC0+cnhfY29uc19zYik7Ci0KLQlwa3RfcHJvZCA9IGZwX3R4LT50eF9wa3RfcHJvZCsrOwotCXR4X2J1ZiA9ICZmcF90eC0+dHhfYnVmX3JpbmdbVFhfQkQocGt0X3Byb2QpXTsKLQl0eF9idWYtPmZpcnN0X2JkID0gZnBfdHgtPnR4X2JkX3Byb2Q7Ci0JdHhfYnVmLT5za2IgPSBza2I7Ci0JdHhfYnVmLT5mbGFncyA9IDA7Ci0KLQliZF9wcm9kID0gVFhfQkQoZnBfdHgtPnR4X2JkX3Byb2QpOwotCXR4X3N0YXJ0X2JkID0gJmZwX3R4LT50eF9kZXNjX3JpbmdbYmRfcHJvZF0uc3RhcnRfYmQ7Ci0JbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCi0JCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOwotCXR4X3N0YXJ0X2JkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKLQl0eF9zdGFydF9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7Ci0JdHhfc3RhcnRfYmQtPm5iZCA9IGNwdV90b19sZTE2KDIpOyAvKiBzdGFydCArIHBiZCAqLwotCXR4X3N0YXJ0X2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihza2JfaGVhZGxlbihza2IpKTsKLQl0eF9zdGFydF9iZC0+dmxhbiA9IGNwdV90b19sZTE2KHBrdF9wcm9kKTsKLQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgPSBFVEhfVFhfQkRfRkxBR1NfU1RBUlRfQkQ7Ci0JdHhfc3RhcnRfYmQtPmdlbmVyYWxfZGF0YSA9ICgoVU5JQ0FTVF9BRERSRVNTIDw8Ci0JCQkJRVRIX1RYX1NUQVJUX0JEX0VUSF9BRERSX1RZUEVfU0hJRlQpIHwgMSk7Ci0KLQkvKiB0dXJuIG9uIHBhcnNpbmcgYW5kIGdldCBhIEJEICovCi0JYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKLQlwYmQgPSAmZnBfdHgtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5wYXJzZV9iZDsKLQotCW1lbXNldChwYmQsIDAsIHNpemVvZihzdHJ1Y3QgZXRoX3R4X3BhcnNlX2JkKSk7Ci0KLQl3bWIoKTsKLQotCWZwX3R4LT50eF9kYi5kYXRhLnByb2QgKz0gMjsKLQliYXJyaWVyKCk7Ci0JRE9PUkJFTEwoYnAsIGZwX3R4LT5pbmRleCwgZnBfdHgtPnR4X2RiLnJhdyk7Ci0KLQltbWlvd2IoKTsKLQotCW51bV9wa3RzKys7Ci0JZnBfdHgtPnR4X2JkX3Byb2QgKz0gMjsgLyogc3RhcnQgKyBwYmQgKi8KLQotCXVkZWxheSgxMDApOwotCi0JdHhfaWR4ID0gbGUxNl90b19jcHUoKmZwX3R4LT50eF9jb25zX3NiKTsKLQlpZiAodHhfaWR4ICE9IHR4X3N0YXJ0X2lkeCArIG51bV9wa3RzKQotCQlnb3RvIHRlc3RfbG9vcGJhY2tfZXhpdDsKLQotCXJ4X2lkeCA9IGxlMTZfdG9fY3B1KCpmcF9yeC0+cnhfY29uc19zYik7Ci0JaWYgKHJ4X2lkeCAhPSByeF9zdGFydF9pZHggKyBudW1fcGt0cykKLQkJZ290byB0ZXN0X2xvb3BiYWNrX2V4aXQ7Ci0KLQljcWUgPSAmZnBfcngtPnJ4X2NvbXBfcmluZ1tSQ1FfQkQoZnBfcngtPnJ4X2NvbXBfY29ucyldOwotCWNxZV9mcF9mbGFncyA9IGNxZS0+ZmFzdF9wYXRoX2NxZS50eXBlX2Vycm9yX2ZsYWdzOwotCWlmIChDUUVfVFlQRShjcWVfZnBfZmxhZ3MpIHx8IChjcWVfZnBfZmxhZ3MgJiBFVEhfUlhfRVJST1JfRkFMR1MpKQotCQlnb3RvIHRlc3RfbG9vcGJhY2tfcnhfZXhpdDsKLQotCWxlbiA9IGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wa3RfbGVuKTsKLQlpZiAobGVuICE9IHBrdF9zaXplKQotCQlnb3RvIHRlc3RfbG9vcGJhY2tfcnhfZXhpdDsKLQotCXJ4X2J1ZiA9ICZmcF9yeC0+cnhfYnVmX3JpbmdbUlhfQkQoZnBfcngtPnJ4X2JkX2NvbnMpXTsKLQlza2IgPSByeF9idWYtPnNrYjsKLQlza2JfcmVzZXJ2ZShza2IsIGNxZS0+ZmFzdF9wYXRoX2NxZS5wbGFjZW1lbnRfb2Zmc2V0KTsKLQlmb3IgKGkgPSBFVEhfSExFTjsgaSA8IHBrdF9zaXplOyBpKyspCi0JCWlmICgqKHNrYi0+ZGF0YSArIGkpICE9ICh1bnNpZ25lZCBjaGFyKSAoaSAmIDB4ZmYpKQotCQkJZ290byB0ZXN0X2xvb3BiYWNrX3J4X2V4aXQ7Ci0KLQlyYyA9IDA7Ci0KLXRlc3RfbG9vcGJhY2tfcnhfZXhpdDoKLQotCWZwX3J4LT5yeF9iZF9jb25zID0gTkVYVF9SWF9JRFgoZnBfcngtPnJ4X2JkX2NvbnMpOwotCWZwX3J4LT5yeF9iZF9wcm9kID0gTkVYVF9SWF9JRFgoZnBfcngtPnJ4X2JkX3Byb2QpOwotCWZwX3J4LT5yeF9jb21wX2NvbnMgPSBORVhUX1JDUV9JRFgoZnBfcngtPnJ4X2NvbXBfY29ucyk7Ci0JZnBfcngtPnJ4X2NvbXBfcHJvZCA9IE5FWFRfUkNRX0lEWChmcF9yeC0+cnhfY29tcF9wcm9kKTsKLQotCS8qIFVwZGF0ZSBwcm9kdWNlcnMgKi8KLQlibngyeF91cGRhdGVfcnhfcHJvZChicCwgZnBfcngsIGZwX3J4LT5yeF9iZF9wcm9kLCBmcF9yeC0+cnhfY29tcF9wcm9kLAotCQkJICAgICBmcF9yeC0+cnhfc2dlX3Byb2QpOwotCi10ZXN0X2xvb3BiYWNrX2V4aXQ6Ci0JYnAtPmxpbmtfcGFyYW1zLmxvb3BiYWNrX21vZGUgPSBMT09QQkFDS19OT05FOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3Rlc3RfbG9vcGJhY2soc3RydWN0IGJueDJ4ICpicCwgdTggbGlua191cCkKLXsKLQlpbnQgcmMgPSAwLCByZXM7Ci0KLQlpZiAoQlBfTk9NQ1AoYnApKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCi0JCXJldHVybiBCTlgyWF9MT09QQkFDS19GQUlMRUQ7Ci0KLQlibngyeF9uZXRpZl9zdG9wKGJwLCAxKTsKLQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKLQotCXJlcyA9IGJueDJ4X3J1bl9sb29wYmFjayhicCwgQk5YMlhfUEhZX0xPT1BCQUNLLCBsaW5rX3VwKTsKLQlpZiAocmVzKSB7Ci0JCURQKE5FVElGX01TR19QUk9CRSwgIiAgUEhZIGxvb3BiYWNrIGZhaWxlZCAgKHJlcyAlZClcbiIsIHJlcyk7Ci0JCXJjIHw9IEJOWDJYX1BIWV9MT09QQkFDS19GQUlMRUQ7Ci0JfQotCi0JcmVzID0gYm54MnhfcnVuX2xvb3BiYWNrKGJwLCBCTlgyWF9NQUNfTE9PUEJBQ0ssIGxpbmtfdXApOwotCWlmIChyZXMpIHsKLQkJRFAoTkVUSUZfTVNHX1BST0JFLCAiICBNQUMgbG9vcGJhY2sgZmFpbGVkICAocmVzICVkKVxuIiwgcmVzKTsKLQkJcmMgfD0gQk5YMlhfTUFDX0xPT1BCQUNLX0ZBSUxFRDsKLQl9Ci0KLQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQlibngyeF9uZXRpZl9zdGFydChicCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNkZWZpbmUgQ1JDMzJfUkVTSURVQUwJCQkweGRlYmIyMGUzCi0KLXN0YXRpYyBpbnQgYm54MnhfdGVzdF9udnJhbShzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCQlpbnQgb2Zmc2V0OwotCQlpbnQgc2l6ZTsKLQl9IG52cmFtX3RibFtdID0gewotCQl7ICAgICAwLCAgMHgxNCB9LCAvKiBib290c3RyYXAgKi8KLQkJeyAgMHgxNCwgIDB4ZWMgfSwgLyogZGlyICovCi0JCXsgMHgxMDAsIDB4MzUwIH0sIC8qIG1hbnVmX2luZm8gKi8KLQkJeyAweDQ1MCwgIDB4ZjAgfSwgLyogZmVhdHVyZV9pbmZvICovCi0JCXsgMHg2NDAsICAweDY0IH0sIC8qIHVwZ3JhZGVfa2V5X2luZm8gKi8KLQkJeyAweDZhNCwgIDB4NjQgfSwKLQkJeyAweDcwOCwgIDB4NzAgfSwgLyogbWFudWZfa2V5X2luZm8gKi8KLQkJeyAweDc3OCwgIDB4NzAgfSwKLQkJeyAgICAgMCwgICAgIDAgfQotCX07Ci0JX19iZTMyIGJ1ZlsweDM1MCAvIDRdOwotCXU4ICpkYXRhID0gKHU4ICopYnVmOwotCWludCBpLCByYzsKLQl1MzIgbWFnaWMsIGNyYzsKLQotCWlmIChCUF9OT01DUChicCkpCi0JCXJldHVybiAwOwotCi0JcmMgPSBibngyeF9udnJhbV9yZWFkKGJwLCAwLCBkYXRhLCA0KTsKLQlpZiAocmMpIHsKLQkJRFAoTkVUSUZfTVNHX1BST0JFLCAibWFnaWMgdmFsdWUgcmVhZCAocmMgJWQpXG4iLCByYyk7Ci0JCWdvdG8gdGVzdF9udnJhbV9leGl0OwotCX0KLQotCW1hZ2ljID0gYmUzMl90b19jcHUoYnVmWzBdKTsKLQlpZiAobWFnaWMgIT0gMHg2Njk5NTVhYSkgewotCQlEUChORVRJRl9NU0dfUFJPQkUsICJtYWdpYyB2YWx1ZSAoMHglMDh4KVxuIiwgbWFnaWMpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gdGVzdF9udnJhbV9leGl0OwotCX0KLQotCWZvciAoaSA9IDA7IG52cmFtX3RibFtpXS5zaXplOyBpKyspIHsKLQotCQlyYyA9IGJueDJ4X252cmFtX3JlYWQoYnAsIG52cmFtX3RibFtpXS5vZmZzZXQsIGRhdGEsCi0JCQkJICAgICAgbnZyYW1fdGJsW2ldLnNpemUpOwotCQlpZiAocmMpIHsKLQkJCURQKE5FVElGX01TR19QUk9CRSwKLQkJCSAgICJudnJhbV90YmxbJWRdIHJlYWQgZGF0YSAocmMgJWQpXG4iLCBpLCByYyk7Ci0JCQlnb3RvIHRlc3RfbnZyYW1fZXhpdDsKLQkJfQotCi0JCWNyYyA9IGV0aGVyX2NyY19sZShudnJhbV90YmxbaV0uc2l6ZSwgZGF0YSk7Ci0JCWlmIChjcmMgIT0gQ1JDMzJfUkVTSURVQUwpIHsKLQkJCURQKE5FVElGX01TR19QUk9CRSwKLQkJCSAgICJudnJhbV90YmxbJWRdIGNyYyB2YWx1ZSAoMHglMDh4KVxuIiwgaSwgY3JjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gdGVzdF9udnJhbV9leGl0OwotCQl9Ci0JfQotCi10ZXN0X252cmFtX2V4aXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3Rlc3RfaW50cihzdHJ1Y3QgYm54MnggKmJwKQotewotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9IGJueDJ4X3NwKGJwLCBtYWNfY29uZmlnKTsKLQlpbnQgaSwgcmM7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY29uZmlnLT5oZHIubGVuZ3RoID0gMDsKLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCS8qIHVzZSBsYXN0IHVuaWNhc3QgZW50cmllcyAqLwotCQljb25maWctPmhkci5vZmZzZXQgPSAoQlBfUE9SVChicCkgPyA2MyA6IDMxKTsKLQllbHNlCi0JCWNvbmZpZy0+aGRyLm9mZnNldCA9IEJQX0ZVTkMoYnApOwotCWNvbmZpZy0+aGRyLmNsaWVudF9pZCA9IGJwLT5mcC0+Y2xfaWQ7Ci0JY29uZmlnLT5oZHIucmVzZXJ2ZWQxID0gMDsKLQotCWJwLT5zZXRfbWFjX3BlbmRpbmcrKzsKLQlzbXBfd21iKCk7Ci0JcmMgPSBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDLCAwLAotCQkJICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19jb25maWcpKSwKLQkJCSAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksIDApOwotCWlmIChyYyA9PSAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpZiAoIWJwLT5zZXRfbWFjX3BlbmRpbmcpCi0JCQkJYnJlYWs7Ci0JCQlzbXBfcm1iKCk7Ci0JCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMCk7Ci0JCX0KLQkJaWYgKGkgPT0gMTApCi0JCQlyYyA9IC1FTk9ERVY7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZWxmX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF90ZXN0ICpldGVzdCwgdTY0ICpidWYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoYnAtPnJlY292ZXJ5X3N0YXRlICE9IEJOWDJYX1JFQ09WRVJZX0RPTkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJIYW5kbGluZyBwYXJpdHkgZXJyb3IgcmVjb3ZlcnkuIFRyeSBhZ2FpbiBsYXRlclxuIik7Ci0JCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YodTY0KSAqIEJOWDJYX05VTV9URVNUUyk7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuOwotCi0JLyogb2ZmbGluZSB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBNRiBtb2RlICovCi0JaWYgKElTX0UxSE1GKGJwKSkKLQkJZXRlc3QtPmZsYWdzICY9IH5FVEhfVEVTVF9GTF9PRkZMSU5FOwotCi0JaWYgKGV0ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKLQkJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQkJdTMyIHZhbDsKLQkJdTggbGlua191cDsKLQotCQkvKiBzYXZlIGN1cnJlbnQgdmFsdWUgb2YgaW5wdXQgZW5hYmxlIGZvciBUWCBwb3J0IElGICovCi0JCXZhbCA9IFJFR19SRChicCwgTklHX1JFR19FR1JFU1NfVU1QMF9JTl9FTiArIHBvcnQqNCk7Ci0JCS8qIGRpc2FibGUgaW5wdXQgZm9yIFRYIHBvcnQgSUYgKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19VTVAwX0lOX0VOICsgcG9ydCo0LCAwKTsKLQotCQlsaW5rX3VwID0gKGJueDJ4X2xpbmtfdGVzdChicCkgPT0gMCk7Ci0JCWJueDJ4X25pY191bmxvYWQoYnAsIFVOTE9BRF9OT1JNQUwpOwotCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9ESUFHKTsKLQkJLyogd2FpdCB1bnRpbCBsaW5rIHN0YXRlIGlzIHJlc3RvcmVkICovCi0JCWJueDJ4X3dhaXRfZm9yX2xpbmsoYnAsIGxpbmtfdXApOwotCi0JCWlmIChibngyeF90ZXN0X3JlZ2lzdGVycyhicCkgIT0gMCkgewotCQkJYnVmWzBdID0gMTsKLQkJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7Ci0JCX0KLQkJaWYgKGJueDJ4X3Rlc3RfbWVtb3J5KGJwKSAhPSAwKSB7Ci0JCQlidWZbMV0gPSAxOwotCQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKLQkJfQotCQlidWZbMl0gPSBibngyeF90ZXN0X2xvb3BiYWNrKGJwLCBsaW5rX3VwKTsKLQkJaWYgKGJ1ZlsyXSAhPSAwKQotCQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKLQotCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKLQotCQkvKiByZXN0b3JlIGlucHV0IGZvciBUWCBwb3J0IElGICovCi0JCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfVU1QMF9JTl9FTiArIHBvcnQqNCwgdmFsKTsKLQotCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOwotCQkvKiB3YWl0IHVudGlsIGxpbmsgc3RhdGUgaXMgcmVzdG9yZWQgKi8KLQkJYm54Mnhfd2FpdF9mb3JfbGluayhicCwgbGlua191cCk7Ci0JfQotCWlmIChibngyeF90ZXN0X252cmFtKGJwKSAhPSAwKSB7Ci0JCWJ1ZlszXSA9IDE7Ci0JCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7Ci0JfQotCWlmIChibngyeF90ZXN0X2ludHIoYnApICE9IDApIHsKLQkJYnVmWzRdID0gMTsKLQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKLQl9Ci0JaWYgKGJwLT5wb3J0LnBtZikKLQkJaWYgKGJueDJ4X2xpbmtfdGVzdChicCkgIT0gMCkgewotCQkJYnVmWzVdID0gMTsKLQkJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7Ci0JCX0KLQotI2lmZGVmIEJOWDJYX0VYVFJBX0RFQlVHCi0JYm54MnhfcGFuaWNfZHVtcChicCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0JbG9uZyBvZmZzZXQ7Ci0JaW50IHNpemU7Ci0JdTggc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07Ci19IGJueDJ4X3Ffc3RhdHNfYXJyW0JOWDJYX05VTV9RX1NUQVRTXSA9IHsKLS8qIDEgKi8JeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKSwgOCwgIlslZF06IHJ4X2J5dGVzIiB9LAotCXsgUV9TVEFUU19PRkZTRVQzMihlcnJvcl9ieXRlc19yZWNlaXZlZF9oaSksCi0JCQkJCQk4LCAiWyVkXTogcnhfZXJyb3JfYnl0ZXMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSksCi0JCQkJCQk4LCAiWyVkXTogcnhfdWNhc3RfcGFja2V0cyIgfSwKLQl7IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkpLAotCQkJCQkJOCwgIlslZF06IHJ4X21jYXN0X3BhY2tldHMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKLQkJCQkJCTgsICJbJWRdOiByeF9iY2FzdF9wYWNrZXRzIiB9LAotCXsgUV9TVEFUU19PRkZTRVQzMihub19idWZmX2Rpc2NhcmRfaGkpLAk4LCAiWyVkXTogcnhfZGlzY2FyZHMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKHJ4X2Vycl9kaXNjYXJkX3BrdCksCi0JCQkJCSA0LCAiWyVkXTogcnhfcGh5X2lwX2Vycl9kaXNjYXJkcyJ9LAotCXsgUV9TVEFUU19PRkZTRVQzMihyeF9za2JfYWxsb2NfZmFpbGVkKSwKLQkJCQkJIDQsICJbJWRdOiByeF9za2JfYWxsb2NfZGlzY2FyZCIgfSwKLQl7IFFfU1RBVFNfT0ZGU0VUMzIoaHdfY3N1bV9lcnIpLCA0LCAiWyVkXTogcnhfY3N1bV9vZmZsb2FkX2Vycm9ycyIgfSwKLQotLyogMTAgKi97IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGkpLAk4LCAiWyVkXTogdHhfYnl0ZXMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSksCi0JCQkJCQk4LCAiWyVkXTogdHhfdWNhc3RfcGFja2V0cyIgfSwKLQl7IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAotCQkJCQkJOCwgIlslZF06IHR4X21jYXN0X3BhY2tldHMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKLQkJCQkJCTgsICJbJWRdOiB0eF9iY2FzdF9wYWNrZXRzIiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQlsb25nIG9mZnNldDsKLQlpbnQgc2l6ZTsKLQl1MzIgZmxhZ3M7Ci0jZGVmaW5lIFNUQVRTX0ZMQUdTX1BPUlQJCTEKLSNkZWZpbmUgU1RBVFNfRkxBR1NfRlVOQwkJMgotI2RlZmluZSBTVEFUU19GTEFHU19CT1RICQkoU1RBVFNfRkxBR1NfRlVOQyB8IFNUQVRTX0ZMQUdTX1BPUlQpCi0JdTggc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07Ci19IGJueDJ4X3N0YXRzX2FycltCTlgyWF9OVU1fU1RBVFNdID0gewotLyogMSAqLwl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAicnhfYnl0ZXMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMihlcnJvcl9ieXRlc19yZWNlaXZlZF9oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X2Vycm9yX2J5dGVzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAicnhfdWNhc3RfcGFja2V0cyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAicnhfbWNhc3RfcGFja2V0cyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAicnhfYmNhc3RfcGFja2V0cyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfZG90M3N0YXRzZmNzZXJyb3JzX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfY3JjX2Vycm9ycyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfZG90M3N0YXRzYWxpZ25tZW50ZXJyb3JzX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfYWxpZ25fZXJyb3JzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIocnhfc3RhdF9ldGhlcnN0YXRzdW5kZXJzaXplcGt0c19oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X3VuZGVyc2l6ZV9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIoZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9vdmVyc2l6ZV9wYWNrZXRzIiB9LAotLyogMTAgKi97IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfZXRoZXJzdGF0c2ZyYWdtZW50c19oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X2ZyYWdtZW50cyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfZXRoZXJzdGF0c2phYmJlcnNfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9qYWJiZXJzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIobm9fYnVmZl9kaXNjYXJkX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAicnhfZGlzY2FyZHMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMihtYWNfZmlsdGVyX2Rpc2NhcmQpLAotCQkJCTQsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9maWx0ZXJlZF9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIoeHhvdmVyZmxvd19kaXNjYXJkKSwKLQkJCQk0LCBTVEFUU19GTEFHU19QT1JULCAicnhfZndfZGlzY2FyZHMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMihicmJfZHJvcF9oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X2JyYl9kaXNjYXJkIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIoYnJiX3RydW5jYXRlX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfYnJiX3RydW5jYXRlIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIocGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfcGF1c2VfZnJhbWVzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIocnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWRfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9tYWNfY3RybF9mcmFtZXMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMihuaWdfdGltZXJfbWF4KSwKLQkJCTQsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9jb25zdGFudF9wYXVzZV9ldmVudHMiIH0sCi0vKiAyMCAqL3sgU1RBVFNfT0ZGU0VUMzIocnhfZXJyX2Rpc2NhcmRfcGt0KSwKLQkJCQk0LCBTVEFUU19GTEFHU19CT1RILCAicnhfcGh5X2lwX2Vycl9kaXNjYXJkcyJ9LAotCXsgU1RBVFNfT0ZGU0VUMzIocnhfc2tiX2FsbG9jX2ZhaWxlZCksCi0JCQkJNCwgU1RBVFNfRkxBR1NfQk9USCwgInJ4X3NrYl9hbGxvY19kaXNjYXJkIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIoaHdfY3N1bV9lcnIpLAotCQkJCTQsIFNUQVRTX0ZMQUdTX0JPVEgsICJyeF9jc3VtX29mZmxvYWRfZXJyb3JzIiB9LAotCi0JeyBTVEFUU19PRkZTRVQzMih0b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfQk9USCwgInR4X2J5dGVzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9pZmhjb3V0YmFkb2N0ZXRzX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfZXJyb3JfYnl0ZXMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMih0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX0JPVEgsICJ0eF91Y2FzdF9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX0JPVEgsICJ0eF9tY2FzdF9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX0JPVEgsICJ0eF9iY2FzdF9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfbWFjX2Vycm9ycyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHJ4X3N0YXRfZG90M3N0YXRzY2FycmllcnNlbnNlZXJyb3JzX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfY2Fycmllcl9lcnJvcnMiIH0sCi0vKiAzMCAqL3sgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9kb3Qzc3RhdHNzaW5nbGVjb2xsaXNpb25mcmFtZXNfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF9zaW5nbGVfY29sbGlzaW9ucyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZG90M3N0YXRzbXVsdGlwbGVjb2xsaXNpb25mcmFtZXNfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF9tdWx0aV9jb2xsaXNpb25zIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9kb3Qzc3RhdHNkZWZlcnJlZHRyYW5zbWlzc2lvbnNfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF9kZWZlcnJlZCIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZG90M3N0YXRzZXhjZXNzaXZlY29sbGlzaW9uc19oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4X2V4Y2Vzc19jb2xsaXNpb25zIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uc19oaSksCi0JCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4X2xhdGVfY29sbGlzaW9ucyIgfSwKLQl7IFNUQVRTX09GRlNFVDMyKHR4X3N0YXRfZXRoZXJzdGF0c2NvbGxpc2lvbnNfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF90b3RhbF9jb2xsaXNpb25zIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzX2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfNjRfYnl0ZV9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHNfaGkpLAotCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4XzY1X3RvXzEyN19ieXRlX3BhY2tldHMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMih0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTI4b2N0ZXRzdG8yNTVvY3RldHNfaGkpLAotCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4XzEyOF90b18yNTVfYnl0ZV9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIodHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzX2hpKSwKLQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF8yNTZfdG9fNTExX2J5dGVfcGFja2V0cyIgfSwKLS8qIDQwICoveyBTVEFUU19PRkZTRVQzMih0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzX2hpKSwKLQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF81MTJfdG9fMTAyM19ieXRlX3BhY2tldHMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMihldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHNfaGkpLAotCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4XzEwMjRfdG9fMTUyMl9ieXRlX3BhY2tldHMiIH0sCi0JeyBTVEFUU19PRkZTRVQzMihldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2hpKSwKLQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF8xNTIzX3RvXzkwMjJfYnl0ZV9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIocGF1c2VfZnJhbWVzX3NlbnRfaGkpLAotCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJ0eF9wYXVzZV9mcmFtZXMiIH0KLX07Ci0KLSNkZWZpbmUgSVNfUE9SVF9TVEFUKGkpIFwKLQkoKGJueDJ4X3N0YXRzX2FycltpXS5mbGFncyAmIFNUQVRTX0ZMQUdTX0JPVEgpID09IFNUQVRTX0ZMQUdTX1BPUlQpCi0jZGVmaW5lIElTX0ZVTkNfU1RBVChpKQkJKGJueDJ4X3N0YXRzX2FycltpXS5mbGFncyAmIFNUQVRTX0ZMQUdTX0ZVTkMpCi0jZGVmaW5lIElTX0UxSE1GX01PREVfU1RBVChicCkgXAotCQkJKElTX0UxSE1GKGJwKSAmJiAhKGJwLT5tc2dfZW5hYmxlICYgQk5YMlhfTVNHX1NUQVRTKSkKLQotc3RhdGljIGludCBibngyeF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RyaW5nc2V0KQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBpLCBudW1fc3RhdHM7Ci0KLQlzd2l0Y2ggKHN0cmluZ3NldCkgewotCWNhc2UgRVRIX1NTX1NUQVRTOgotCQlpZiAoaXNfbXVsdGkoYnApKSB7Ci0JCQludW1fc3RhdHMgPSBCTlgyWF9OVU1fUV9TVEFUUyAqIGJwLT5udW1fcXVldWVzOwotCQkJaWYgKCFJU19FMUhNRl9NT0RFX1NUQVQoYnApKQotCQkJCW51bV9zdGF0cyArPSBCTlgyWF9OVU1fU1RBVFM7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoSVNfRTFITUZfTU9ERV9TVEFUKGJwKSkgewotCQkJCW51bV9zdGF0cyA9IDA7Ci0JCQkJZm9yIChpID0gMDsgaSA8IEJOWDJYX05VTV9TVEFUUzsgaSsrKQotCQkJCQlpZiAoSVNfRlVOQ19TVEFUKGkpKQotCQkJCQkJbnVtX3N0YXRzKys7Ci0JCQl9IGVsc2UKLQkJCQludW1fc3RhdHMgPSBCTlgyWF9OVU1fU1RBVFM7Ci0JCX0KLQkJcmV0dXJuIG51bV9zdGF0czsKLQotCWNhc2UgRVRIX1NTX1RFU1Q6Ci0JCXJldHVybiBCTlgyWF9OVU1fVEVTVFM7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpidWYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGksIGosIGs7Ci0KLQlzd2l0Y2ggKHN0cmluZ3NldCkgewotCWNhc2UgRVRIX1NTX1NUQVRTOgotCQlpZiAoaXNfbXVsdGkoYnApKSB7Ci0JCQlrID0gMDsKLQkJCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCQkJZm9yIChqID0gMDsgaiA8IEJOWDJYX05VTV9RX1NUQVRTOyBqKyspCi0JCQkJCXNwcmludGYoYnVmICsgKGsgKyBqKSpFVEhfR1NUUklOR19MRU4sCi0JCQkJCQlibngyeF9xX3N0YXRzX2FycltqXS5zdHJpbmcsIGkpOwotCQkJCWsgKz0gQk5YMlhfTlVNX1FfU1RBVFM7Ci0JCQl9Ci0JCQlpZiAoSVNfRTFITUZfTU9ERV9TVEFUKGJwKSkKLQkJCQlicmVhazsKLQkJCWZvciAoaiA9IDA7IGogPCBCTlgyWF9OVU1fU1RBVFM7IGorKykKLQkJCQlzdHJjcHkoYnVmICsgKGsgKyBqKSpFVEhfR1NUUklOR19MRU4sCi0JCQkJICAgICAgIGJueDJ4X3N0YXRzX2FycltqXS5zdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBCTlgyWF9OVU1fU1RBVFM7IGkrKykgewotCQkJCWlmIChJU19FMUhNRl9NT0RFX1NUQVQoYnApICYmIElTX1BPUlRfU1RBVChpKSkKLQkJCQkJY29udGludWU7Ci0JCQkJc3RyY3B5KGJ1ZiArIGoqRVRIX0dTVFJJTkdfTEVOLAotCQkJCSAgICAgICBibngyeF9zdGF0c19hcnJbaV0uc3RyaW5nKTsKLQkJCQlqKys7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEVUSF9TU19URVNUOgotCQltZW1jcHkoYnVmLCBibngyeF90ZXN0c19zdHJfYXJyLCBzaXplb2YoYm54MnhfdGVzdHNfc3RyX2FycikpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpidWYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyICpod19zdGF0cywgKm9mZnNldDsKLQlpbnQgaSwgaiwgazsKLQotCWlmIChpc19tdWx0aShicCkpIHsKLQkJayA9IDA7Ci0JCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7Ci0JCQlod19zdGF0cyA9ICh1MzIgKikmYnAtPmZwW2ldLmV0aF9xX3N0YXRzOwotCQkJZm9yIChqID0gMDsgaiA8IEJOWDJYX05VTV9RX1NUQVRTOyBqKyspIHsKLQkJCQlpZiAoYm54MnhfcV9zdGF0c19hcnJbal0uc2l6ZSA9PSAwKSB7Ci0JCQkJCS8qIHNraXAgdGhpcyBjb3VudGVyICovCi0JCQkJCWJ1ZltrICsgal0gPSAwOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJb2Zmc2V0ID0gKGh3X3N0YXRzICsKLQkJCQkJICBibngyeF9xX3N0YXRzX2FycltqXS5vZmZzZXQpOwotCQkJCWlmIChibngyeF9xX3N0YXRzX2FycltqXS5zaXplID09IDQpIHsKLQkJCQkJLyogNC1ieXRlIGNvdW50ZXIgKi8KLQkJCQkJYnVmW2sgKyBqXSA9ICh1NjQpICpvZmZzZXQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvKiA4LWJ5dGUgY291bnRlciAqLwotCQkJCWJ1ZltrICsgal0gPSBISUxPX1U2NCgqb2Zmc2V0LCAqKG9mZnNldCArIDEpKTsKLQkJCX0KLQkJCWsgKz0gQk5YMlhfTlVNX1FfU1RBVFM7Ci0JCX0KLQkJaWYgKElTX0UxSE1GX01PREVfU1RBVChicCkpCi0JCQlyZXR1cm47Ci0JCWh3X3N0YXRzID0gKHUzMiAqKSZicC0+ZXRoX3N0YXRzOwotCQlmb3IgKGogPSAwOyBqIDwgQk5YMlhfTlVNX1NUQVRTOyBqKyspIHsKLQkJCWlmIChibngyeF9zdGF0c19hcnJbal0uc2l6ZSA9PSAwKSB7Ci0JCQkJLyogc2tpcCB0aGlzIGNvdW50ZXIgKi8KLQkJCQlidWZbayArIGpdID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW9mZnNldCA9IChod19zdGF0cyArIGJueDJ4X3N0YXRzX2FycltqXS5vZmZzZXQpOwotCQkJaWYgKGJueDJ4X3N0YXRzX2FycltqXS5zaXplID09IDQpIHsKLQkJCQkvKiA0LWJ5dGUgY291bnRlciAqLwotCQkJCWJ1ZltrICsgal0gPSAodTY0KSAqb2Zmc2V0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLyogOC1ieXRlIGNvdW50ZXIgKi8KLQkJCWJ1ZltrICsgal0gPSBISUxPX1U2NCgqb2Zmc2V0LCAqKG9mZnNldCArIDEpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWh3X3N0YXRzID0gKHUzMiAqKSZicC0+ZXRoX3N0YXRzOwotCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IEJOWDJYX05VTV9TVEFUUzsgaSsrKSB7Ci0JCQlpZiAoSVNfRTFITUZfTU9ERV9TVEFUKGJwKSAmJiBJU19QT1JUX1NUQVQoaSkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYm54Mnhfc3RhdHNfYXJyW2ldLnNpemUgPT0gMCkgewotCQkJCS8qIHNraXAgdGhpcyBjb3VudGVyICovCi0JCQkJYnVmW2pdID0gMDsKLQkJCQlqKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlvZmZzZXQgPSAoaHdfc3RhdHMgKyBibngyeF9zdGF0c19hcnJbaV0ub2Zmc2V0KTsKLQkJCWlmIChibngyeF9zdGF0c19hcnJbaV0uc2l6ZSA9PSA0KSB7Ci0JCQkJLyogNC1ieXRlIGNvdW50ZXIgKi8KLQkJCQlidWZbal0gPSAodTY0KSAqb2Zmc2V0OwotCQkJCWorKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qIDgtYnl0ZSBjb3VudGVyICovCi0JCQlidWZbal0gPSBISUxPX1U2NCgqb2Zmc2V0LCAqKG9mZnNldCArIDEpKTsKLQkJCWorKzsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBibngyeF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBpOwotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCi0JCXJldHVybiAwOwotCi0JaWYgKCFicC0+cG9ydC5wbWYpCi0JCXJldHVybiAwOwotCi0JaWYgKGRhdGEgPT0gMCkKLQkJZGF0YSA9IDI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKGRhdGEgKiAyKTsgaSsrKSB7Ci0JCWlmICgoaSAlIDIpID09IDApCi0JCQlibngyeF9zZXRfbGVkKCZicC0+bGlua19wYXJhbXMsIExFRF9NT0RFX09QRVIsCi0JCQkJICAgICAgU1BFRURfMTAwMCk7Ci0JCWVsc2UKLQkJCWJueDJ4X3NldF9sZWQoJmJwLT5saW5rX3BhcmFtcywgTEVEX01PREVfT0ZGLCAwKTsKLQotCQltc2xlZXBfaW50ZXJydXB0aWJsZSg1MDApOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoYnAtPmxpbmtfdmFycy5saW5rX3VwKQotCQlibngyeF9zZXRfbGVkKCZicC0+bGlua19wYXJhbXMsIExFRF9NT0RFX09QRVIsCi0JCQkgICAgICBicC0+bGlua192YXJzLmxpbmVfc3BlZWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYm54MnhfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncwkJPSBibngyeF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBibngyeF9zZXRfc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvCQk9IGJueDJ4X2dldF9kcnZpbmZvLAotCS5nZXRfcmVnc19sZW4JCT0gYm54MnhfZ2V0X3JlZ3NfbGVuLAotCS5nZXRfcmVncwkJPSBibngyeF9nZXRfcmVncywKLQkuZ2V0X3dvbAkJPSBibngyeF9nZXRfd29sLAotCS5zZXRfd29sCQk9IGJueDJ4X3NldF93b2wsCi0JLmdldF9tc2dsZXZlbAkJPSBibngyeF9nZXRfbXNnbGV2ZWwsCi0JLnNldF9tc2dsZXZlbAkJPSBibngyeF9zZXRfbXNnbGV2ZWwsCi0JLm53YXlfcmVzZXQJCT0gYm54MnhfbndheV9yZXNldCwKLQkuZ2V0X2xpbmsJCT0gYm54MnhfZ2V0X2xpbmssCi0JLmdldF9lZXByb21fbGVuCQk9IGJueDJ4X2dldF9lZXByb21fbGVuLAotCS5nZXRfZWVwcm9tCQk9IGJueDJ4X2dldF9lZXByb20sCi0JLnNldF9lZXByb20JCT0gYm54Mnhfc2V0X2VlcHJvbSwKLQkuZ2V0X2NvYWxlc2NlCQk9IGJueDJ4X2dldF9jb2FsZXNjZSwKLQkuc2V0X2NvYWxlc2NlCQk9IGJueDJ4X3NldF9jb2FsZXNjZSwKLQkuZ2V0X3JpbmdwYXJhbQkJPSBibngyeF9nZXRfcmluZ3BhcmFtLAotCS5zZXRfcmluZ3BhcmFtCQk9IGJueDJ4X3NldF9yaW5ncGFyYW0sCi0JLmdldF9wYXVzZXBhcmFtCQk9IGJueDJ4X2dldF9wYXVzZXBhcmFtLAotCS5zZXRfcGF1c2VwYXJhbQkJPSBibngyeF9zZXRfcGF1c2VwYXJhbSwKLQkuZ2V0X3J4X2NzdW0JCT0gYm54MnhfZ2V0X3J4X2NzdW0sCi0JLnNldF9yeF9jc3VtCQk9IGJueDJ4X3NldF9yeF9jc3VtLAotCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAotCS5zZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX3NldF90eF9od19jc3VtLAotCS5zZXRfZmxhZ3MJCT0gYm54Mnhfc2V0X2ZsYWdzLAotCS5nZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCi0JLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCi0JLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAotCS5zZXRfdHNvCQk9IGJueDJ4X3NldF90c28sCi0JLnNlbGZfdGVzdAkJPSBibngyeF9zZWxmX3Rlc3QsCi0JLmdldF9zc2V0X2NvdW50CQk9IGJueDJ4X2dldF9zc2V0X2NvdW50LAotCS5nZXRfc3RyaW5ncwkJPSBibngyeF9nZXRfc3RyaW5ncywKLQkucGh5c19pZAkJPSBibngyeF9waHlzX2lkLAotCS5nZXRfZXRodG9vbF9zdGF0cwk9IGJueDJ4X2dldF9ldGh0b29sX3N0YXRzLAotfTsKLQotLyogZW5kIG9mIGV0aHRvb2xfb3BzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBibngyeCAqYnAsIHBjaV9wb3dlcl90IHN0YXRlKQotewotCXUxNiBwbWNzcjsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJwLT5wZGV2LCBicC0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZwbWNzcik7Ci0KLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBQQ0lfRDA6Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBtX2NhcCArIFBDSV9QTV9DVFJMLAotCQkJCSAgICAgICgocG1jc3IgJiB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSykgfAotCQkJCSAgICAgICBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTKSk7Ci0KLQkJaWYgKHBtY3NyICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSykKLQkJCS8qIGRlbGF5IHJlcXVpcmVkIGR1cmluZyB0cmFuc2l0aW9uIG91dCBvZiBEM2hvdCAqLwotCQkJbXNsZWVwKDIwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBDSV9EM2hvdDoKLQkJLyogSWYgdGhlcmUgYXJlIG90aGVyIGNsaWVudHMgYWJvdmUgZG9uJ3QKLQkJICAgc2h1dCBkb3duIHRoZSBwb3dlciAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmJwLT5wZGV2LT5lbmFibGVfY250KSAhPSAxKQotCQkJcmV0dXJuIDA7Ci0JCS8qIERvbid0IHNodXQgZG93biB0aGUgcG93ZXIgZm9yIGVtdWxhdGlvbiBhbmQgRlBHQSAqLwotCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCi0JCQlyZXR1cm4gMDsKLQotCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKLQkJcG1jc3IgfD0gMzsKLQotCQlpZiAoYnAtPndvbCkKLQkJCXBtY3NyIHw9IFBDSV9QTV9DVFJMX1BNRV9FTkFCTEU7Ci0KLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJwLT5wZGV2LCBicC0+cG1fY2FwICsgUENJX1BNX0NUUkwsCi0JCQkJICAgICAgcG1jc3IpOwotCi0JCS8qIE5vIG1vcmUgbWVtb3J5IGFjY2VzcyBhZnRlciB0aGlzIHBvaW50IHVudGlsCi0JCSogZGV2aWNlIGlzIGJyb3VnaHQgYmFjayB0byBEMC4KLQkJKi8KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2hhc19yeF93b3JrKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCi17Ci0JdTE2IHJ4X2NvbnNfc2I7Ci0KLQkvKiBUZWxsIGNvbXBpbGVyIHRoYXQgc3RhdHVzIGJsb2NrIGZpZWxkcyBjYW4gY2hhbmdlICovCi0JYmFycmllcigpOwotCXJ4X2NvbnNfc2IgPSBsZTE2X3RvX2NwdSgqZnAtPnJ4X2NvbnNfc2IpOwotCWlmICgocnhfY29uc19zYiAmIE1BWF9SQ1FfREVTQ19DTlQpID09IE1BWF9SQ1FfREVTQ19DTlQpCi0JCXJ4X2NvbnNfc2IrKzsKLQlyZXR1cm4gKGZwLT5yeF9jb21wX2NvbnMgIT0gcnhfY29uc19zYik7Ci19Ci0KLS8qCi0gKiBuZXRfZGV2aWNlIHNlcnZpY2UgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIGludCBibngyeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKLXsKLQlpbnQgd29ya19kb25lID0gMDsKLQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBibngyeF9mYXN0cGF0aCwKLQkJCQkJCSBuYXBpKTsKLQlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOwotCi0Jd2hpbGUgKDEpIHsKLSNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JCWlmICh1bmxpa2VseShicC0+cGFuaWMpKSB7Ci0JCQluYXBpX2NvbXBsZXRlKG5hcGkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLSNlbmRpZgotCi0JCWlmIChibngyeF9oYXNfdHhfd29yayhmcCkpCi0JCQlibngyeF90eF9pbnQoZnApOwotCi0JCWlmIChibngyeF9oYXNfcnhfd29yayhmcCkpIHsKLQkJCXdvcmtfZG9uZSArPSBibngyeF9yeF9pbnQoZnAsIGJ1ZGdldCAtIHdvcmtfZG9uZSk7Ci0KLQkJCS8qIG11c3Qgbm90IGNvbXBsZXRlIGlmIHdlIGNvbnN1bWVkIGZ1bGwgYnVkZ2V0ICovCi0JCQlpZiAod29ya19kb25lID49IGJ1ZGdldCkKLQkJCQlicmVhazsKLQkJfQotCi0JCS8qIEZhbGwgb3V0IGZyb20gdGhlIE5BUEkgbG9vcCBpZiBuZWVkZWQgKi8KLQkJaWYgKCEoYm54MnhfaGFzX3J4X3dvcmsoZnApIHx8IGJueDJ4X2hhc190eF93b3JrKGZwKSkpIHsKLQkJCWJueDJ4X3VwZGF0ZV9mcHNiX2lkeChmcCk7Ci0JCS8qIGJueDJ4X2hhc19yeF93b3JrKCkgcmVhZHMgdGhlIHN0YXR1cyBibG9jaywgdGh1cyB3ZSBuZWVkCi0JCSAqIHRvIGVuc3VyZSB0aGF0IHN0YXR1cyBibG9jayBpbmRpY2VzIGhhdmUgYmVlbiBhY3R1YWxseSByZWFkCi0JCSAqIChibngyeF91cGRhdGVfZnBzYl9pZHgpIHByaW9yIHRvIHRoaXMgY2hlY2sKLQkJICogKGJueDJ4X2hhc19yeF93b3JrKSBzbyB0aGF0IHdlIHdvbid0IHdyaXRlIHRoZSAibmV3ZXIiCi0JCSAqIHZhbHVlIG9mIHRoZSBzdGF0dXMgYmxvY2sgdG8gSUdVIChpZiB0aGVyZSB3YXMgYSBETUEgcmlnaHQKLQkJICogYWZ0ZXIgYm54MnhfaGFzX3J4X3dvcmsgYW5kIGlmIHRoZXJlIGlzIG5vIHJtYiwgdGhlIG1lbW9yeQotCQkgKiByZWFkaW5nIChibngyeF91cGRhdGVfZnBzYl9pZHgpIG1heSBiZSBwb3N0cG9uZWQgdG8gcmlnaHQKLQkJICogYmVmb3JlIGJueDJ4X2Fja19zYikuIEluIHRoaXMgY2FzZSB0aGVyZSB3aWxsIG5ldmVyIGJlCi0JCSAqIGFub3RoZXIgaW50ZXJydXB0IHVudGlsIHRoZXJlIGlzIGFub3RoZXIgdXBkYXRlIG9mIHRoZQotCQkgKiBzdGF0dXMgYmxvY2ssIHdoaWxlIHRoZXJlIGlzIHN0aWxsIHVuaGFuZGxlZCB3b3JrLgotCQkgKi8KLQkJCXJtYigpOwotCi0JCQlpZiAoIShibngyeF9oYXNfcnhfd29yayhmcCkgfHwgYm54MnhfaGFzX3R4X3dvcmsoZnApKSkgewotCQkJCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KLQkJCQlibngyeF9hY2tfc2IoYnAsIGZwLT5zYl9pZCwgQ1NUT1JNX0lELAotCQkJCQkgICAgIGxlMTZfdG9fY3B1KGZwLT5mcF9jX2lkeCksCi0JCQkJCSAgICAgSUdVX0lOVF9OT1AsIDEpOwotCQkJCWJueDJ4X2Fja19zYihicCwgZnAtPnNiX2lkLCBVU1RPUk1fSUQsCi0JCQkJCSAgICAgbGUxNl90b19jcHUoZnAtPmZwX3VfaWR4KSwKLQkJCQkJICAgICBJR1VfSU5UX0VOQUJMRSwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gd29ya19kb25lOwotfQotCi0KLS8qIHdlIHNwbGl0IHRoZSBmaXJzdCBCRCBpbnRvIGhlYWRlcnMgYW5kIGRhdGEgQkRzCi0gKiB0byBlYXNlIHRoZSBwYWluIG9mIG91ciBmZWxsb3cgbWljcm9jb2RlIGVuZ2luZWVycwotICogd2UgdXNlIG9uZSBtYXBwaW5nIGZvciBib3RoIEJEcwotICogU28gZmFyIHRoaXMgaGFzIG9ubHkgYmVlbiBvYnNlcnZlZCB0byBoYXBwZW4KLSAqIGluIE90aGVyIE9wZXJhdGluZyBTeXN0ZW1zKFRNKQotICovCi1zdGF0aWMgbm9pbmxpbmUgdTE2IGJueDJ4X3R4X3NwbGl0KHN0cnVjdCBibngyeCAqYnAsCi0JCQkJICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKLQkJCQkgICBzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZiwKLQkJCQkgICBzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICoqdHhfYmQsIHUxNiBobGVuLAotCQkJCSAgIHUxNiBiZF9wcm9kLCBpbnQgbmJkKQotewotCXN0cnVjdCBldGhfdHhfc3RhcnRfYmQgKmhfdHhfYmQgPSAqdHhfYmQ7Ci0Jc3RydWN0IGV0aF90eF9iZCAqZF90eF9iZDsKLQlkbWFfYWRkcl90IG1hcHBpbmc7Ci0JaW50IG9sZF9sZW4gPSBsZTE2X3RvX2NwdShoX3R4X2JkLT5uYnl0ZXMpOwotCi0JLyogZmlyc3QgZml4IGZpcnN0IEJEICovCi0JaF90eF9iZC0+bmJkID0gY3B1X3RvX2xlMTYobmJkKTsKLQloX3R4X2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihobGVuKTsKLQotCURQKE5FVElGX01TR19UWF9RVUVVRUQsCSJUU08gc3BsaXQgaGVhZGVyIHNpemUgaXMgJWQgIgotCSAgICIoJXg6JXgpIG5iZCAlZFxuIiwgaF90eF9iZC0+bmJ5dGVzLCBoX3R4X2JkLT5hZGRyX2hpLAotCSAgIGhfdHhfYmQtPmFkZHJfbG8sIGhfdHhfYmQtPm5iZCk7Ci0KLQkvKiBub3cgZ2V0IGEgbmV3IGRhdGEgQkQKLQkgKiAoYWZ0ZXIgdGhlIHBiZCkgYW5kIGZpbGwgaXQgKi8KLQliZF9wcm9kID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfcHJvZCkpOwotCWRfdHhfYmQgPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5yZWdfYmQ7Ci0KLQltYXBwaW5nID0gSElMT19VNjQobGUzMl90b19jcHUoaF90eF9iZC0+YWRkcl9oaSksCi0JCQkgICBsZTMyX3RvX2NwdShoX3R4X2JkLT5hZGRyX2xvKSkgKyBobGVuOwotCi0JZF90eF9iZC0+YWRkcl9oaSA9IGNwdV90b19sZTMyKFU2NF9ISShtYXBwaW5nKSk7Ci0JZF90eF9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7Ci0JZF90eF9iZC0+bmJ5dGVzID0gY3B1X3RvX2xlMTYob2xkX2xlbiAtIGhsZW4pOwotCi0JLyogdGhpcyBtYXJrcyB0aGUgQkQgYXMgb25lIHRoYXQgaGFzIG5vIGluZGl2aWR1YWwgbWFwcGluZyAqLwotCXR4X2J1Zi0+ZmxhZ3MgfD0gQk5YMlhfVFNPX1NQTElUX0JEOwotCi0JRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwKLQkgICAiVFNPIHNwbGl0IGRhdGEgc2l6ZSBpcyAlZCAoJXg6JXgpXG4iLAotCSAgIGRfdHhfYmQtPm5ieXRlcywgZF90eF9iZC0+YWRkcl9oaSwgZF90eF9iZC0+YWRkcl9sbyk7Ci0KLQkvKiB1cGRhdGUgdHhfYmQgKi8KLQkqdHhfYmQgPSAoc3RydWN0IGV0aF90eF9zdGFydF9iZCAqKWRfdHhfYmQ7Ci0KLQlyZXR1cm4gYmRfcHJvZDsKLX0KLQotc3RhdGljIGlubGluZSB1MTYgYm54MnhfY3N1bV9maXgodW5zaWduZWQgY2hhciAqdF9oZWFkZXIsIHUxNiBjc3VtLCBzOCBmaXgpCi17Ci0JaWYgKGZpeCA+IDApCi0JCWNzdW0gPSAodTE2KSB+Y3N1bV9mb2xkKGNzdW1fc3ViKGNzdW0sCi0JCQkJY3N1bV9wYXJ0aWFsKHRfaGVhZGVyIC0gZml4LCBmaXgsIDApKSk7Ci0KLQllbHNlIGlmIChmaXggPCAwKQotCQljc3VtID0gKHUxNikgfmNzdW1fZm9sZChjc3VtX2FkZChjc3VtLAotCQkJCWNzdW1fcGFydGlhbCh0X2hlYWRlciwgLWZpeCwgMCkpKTsKLQotCXJldHVybiBzd2FiMTYoY3N1bSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGJueDJ4X3htaXRfdHlwZShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXUzMiByYzsKLQotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQotCQlyYyA9IFhNSVRfUExBSU47Ci0KLQllbHNlIHsKLQkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKLQkJCXJjID0gWE1JVF9DU1VNX1Y2OwotCQkJaWYgKGlwdjZfaGRyKHNrYiktPm5leHRoZHIgPT0gSVBQUk9UT19UQ1ApCi0JCQkJcmMgfD0gWE1JVF9DU1VNX1RDUDsKLQotCQl9IGVsc2UgewotCQkJcmMgPSBYTUlUX0NTVU1fVjQ7Ci0JCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fVENQKQotCQkJCXJjIHw9IFhNSVRfQ1NVTV9UQ1A7Ci0JCX0KLQl9Ci0KLQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjQpCi0JCXJjIHw9IChYTUlUX0dTT19WNCB8IFhNSVRfQ1NVTV9WNCB8IFhNSVRfQ1NVTV9UQ1ApOwotCi0JZWxzZSBpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjYpCi0JCXJjIHw9IChYTUlUX0dTT19WNiB8IFhNSVRfQ1NVTV9UQ1AgfCBYTUlUX0NTVU1fVjYpOwotCi0JcmV0dXJuIHJjOwotfQotCi0jaWYgKE1BWF9TS0JfRlJBR1MgPj0gTUFYX0ZFVENIX0JEIC0gMykKLS8qIGNoZWNrIGlmIHBhY2tldCByZXF1aXJlcyBsaW5lYXJpemF0aW9uIChwYWNrZXQgaXMgdG9vIGZyYWdtZW50ZWQpCi0gICBubyBuZWVkIHRvIGNoZWNrIGZyYWdtZW50YXRpb24gaWYgcGFnZSBzaXplID4gOEsgKHRoZXJlIHdpbGwgYmUgbm8KLSAgIHZpb2xhdGlvbiB0byBGVyByZXN0cmljdGlvbnMpICovCi1zdGF0aWMgaW50IGJueDJ4X3BrdF9yZXFfbGluKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHUzMiB4bWl0X3R5cGUpCi17Ci0JaW50IHRvX2NvcHkgPSAwOwotCWludCBobGVuID0gMDsKLQlpbnQgZmlyc3RfYmRfc3ogPSAwOwotCi0JLyogMyA9IDEgKGZvciBsaW5lYXIgZGF0YSBCRCkgKyAyIChmb3IgUEJEIGFuZCBsYXN0IEJEKSAqLwotCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID49IChNQVhfRkVUQ0hfQkQgLSAzKSkgewotCi0JCWlmICh4bWl0X3R5cGUgJiBYTUlUX0dTTykgewotCQkJdW5zaWduZWQgc2hvcnQgbHNvX21zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7Ci0JCQkvKiBDaGVjayBpZiBMU08gcGFja2V0IG5lZWRzIHRvIGJlIGNvcGllZDoKLQkJCSAgIDMgPSAxIChmb3IgaGVhZGVycyBCRCkgKyAyIChmb3IgUEJEIGFuZCBsYXN0IEJEKSAqLwotCQkJaW50IHduZF9zaXplID0gTUFYX0ZFVENIX0JEIC0gMzsKLQkJCS8qIE51bWJlciBvZiB3aW5kb3dzIHRvIGNoZWNrICovCi0JCQlpbnQgbnVtX3duZHMgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gd25kX3NpemU7Ci0JCQlpbnQgd25kX2lkeCA9IDA7Ci0JCQlpbnQgZnJhZ19pZHggPSAwOwotCQkJdTMyIHduZF9zdW0gPSAwOwotCi0JCQkvKiBIZWFkZXJzIGxlbmd0aCAqLwotCQkJaGxlbiA9IChpbnQpKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmRhdGEpICsKLQkJCQl0Y3BfaGRybGVuKHNrYik7Ci0KLQkJCS8qIEFtb3VudCBvZiBkYXRhICh3L28gaGVhZGVycykgb24gbGluZWFyIHBhcnQgb2YgU0tCKi8KLQkJCWZpcnN0X2JkX3N6ID0gc2tiX2hlYWRsZW4oc2tiKSAtIGhsZW47Ci0KLQkJCXduZF9zdW0gID0gZmlyc3RfYmRfc3o7Ci0KLQkJCS8qIENhbGN1bGF0ZSB0aGUgZmlyc3Qgc3VtIC0gaXQncyBzcGVjaWFsICovCi0JCQlmb3IgKGZyYWdfaWR4ID0gMDsgZnJhZ19pZHggPCB3bmRfc2l6ZSAtIDE7IGZyYWdfaWR4KyspCi0JCQkJd25kX3N1bSArPQotCQkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWdfaWR4XS5zaXplOwotCi0JCQkvKiBJZiB0aGVyZSB3YXMgZGF0YSBvbiBsaW5lYXIgc2tiIGRhdGEgLSBjaGVjayBpdCAqLwotCQkJaWYgKGZpcnN0X2JkX3N6ID4gMCkgewotCQkJCWlmICh1bmxpa2VseSh3bmRfc3VtIDwgbHNvX21zcykpIHsKLQkJCQkJdG9fY29weSA9IDE7Ci0JCQkJCWdvdG8gZXhpdF9sYmw7Ci0JCQkJfQotCi0JCQkJd25kX3N1bSAtPSBmaXJzdF9iZF9zejsKLQkJCX0KLQotCQkJLyogT3RoZXJzIGFyZSBlYXNpZXI6IHJ1biB0aHJvdWdoIHRoZSBmcmFnIGxpc3QgYW5kCi0JCQkgICBjaGVjayBhbGwgd2luZG93cyAqLwotCQkJZm9yICh3bmRfaWR4ID0gMDsgd25kX2lkeCA8PSBudW1fd25kczsgd25kX2lkeCsrKSB7Ci0JCQkJd25kX3N1bSArPQotCQkJICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW3duZF9pZHggKyB3bmRfc2l6ZSAtIDFdLnNpemU7Ci0KLQkJCQlpZiAodW5saWtlbHkod25kX3N1bSA8IGxzb19tc3MpKSB7Ci0JCQkJCXRvX2NvcHkgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJd25kX3N1bSAtPQotCQkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW3duZF9pZHhdLnNpemU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBpbiBub24tTFNPIHRvbyBmcmFnbWVudGVkIHBhY2tldCBzaG91bGQgYWx3YXlzCi0JCQkgICBiZSBsaW5lYXJpemVkICovCi0JCQl0b19jb3B5ID0gMTsKLQkJfQotCX0KLQotZXhpdF9sYmw6Ci0JaWYgKHVubGlrZWx5KHRvX2NvcHkpKQotCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELAotCQkgICAiTGluZWFyaXphdGlvbiBJUyBSRVFVSVJFRCBmb3IgJXMgcGFja2V0LiAiCi0JCSAgICJudW1fZnJhZ3MgJWQgIGhsZW4gJWQgIGZpcnN0X2JkX3N6ICVkXG4iLAotCQkgICAoeG1pdF90eXBlICYgWE1JVF9HU08pID8gIkxTTyIgOiAibm9uLUxTTyIsCi0JCSAgIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MsIGhsZW4sIGZpcnN0X2JkX3N6KTsKLQotCXJldHVybiB0b19jb3B5OwotfQotI2VuZGlmCi0KLS8qIGNhbGxlZCB3aXRoIG5ldGlmX3R4X2xvY2sKLSAqIGJueDJ4X3R4X2ludCgpIHJ1bnMgd2l0aG91dCBuZXRpZl90eF9sb2NrIHVubGVzcyBpdCBuZWVkcyB0byBjYWxsCi0gKiBuZXRpZl93YWtlX3F1ZXVlKCkKLSAqLwotc3RhdGljIG5ldGRldl90eF90IGJueDJ4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwOwotCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKLQlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZjsKLQlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICp0eF9zdGFydF9iZDsKLQlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9kYXRhX2JkLCAqdG90YWxfcGt0X2JkID0gTlVMTDsKLQlzdHJ1Y3QgZXRoX3R4X3BhcnNlX2JkICpwYmQgPSBOVUxMOwotCXUxNiBwa3RfcHJvZCwgYmRfcHJvZDsKLQlpbnQgbmJkLCBmcF9pbmRleDsKLQlkbWFfYWRkcl90IG1hcHBpbmc7Ci0JdTMyIHhtaXRfdHlwZSA9IGJueDJ4X3htaXRfdHlwZShicCwgc2tiKTsKLQlpbnQgaTsKLQl1OCBobGVuID0gMDsKLQlfX2xlMTYgcGt0X3NpemUgPSAwOwotCXN0cnVjdCBldGhoZHIgKmV0aDsKLQl1OCBtYWNfdHlwZSA9IFVOSUNBU1RfQUREUkVTUzsKLQotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKLQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwotI2VuZGlmCi0KLQlmcF9pbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwotCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBmcF9pbmRleCk7Ci0KLQlmcCA9ICZicC0+ZnBbZnBfaW5kZXhdOwotCi0JaWYgKHVubGlrZWx5KGJueDJ4X3R4X2F2YWlsKGZwKSA8IChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMykpKSB7Ci0JCWZwLT5ldGhfcV9zdGF0cy5kcml2ZXJfeG9mZisrOwotCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7Ci0JCUJOWDJYX0VSUigiQlVHISBUeCByaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIpOwotCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7Ci0JfQotCi0JRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgIlNLQjogc3VtbWVkICV4ICBwcm90b2NvbCAleCAgcHJvdG9jb2woJXgsJXgpIgotCSAgICIgIGdzbyB0eXBlICV4ICB4bWl0X3R5cGUgJXhcbiIsCi0JICAgc2tiLT5pcF9zdW1tZWQsIHNrYi0+cHJvdG9jb2wsIGlwdjZfaGRyKHNrYiktPm5leHRoZHIsCi0JICAgaXBfaGRyKHNrYiktPnByb3RvY29sLCBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlLCB4bWl0X3R5cGUpOwotCi0JZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0KLQkvKiBzZXQgZmxhZyBhY2NvcmRpbmcgdG8gcGFja2V0IHR5cGUgKFVOSUNBU1RfQUREUkVTUyBpcyBkZWZhdWx0KSovCi0JaWYgKHVubGlrZWx5KGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0KSkpIHsKLQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0KSkKLQkJCW1hY190eXBlID0gQlJPQURDQVNUX0FERFJFU1M7Ci0JCWVsc2UKLQkJCW1hY190eXBlID0gTVVMVElDQVNUX0FERFJFU1M7Ci0JfQotCi0jaWYgKE1BWF9TS0JfRlJBR1MgPj0gTUFYX0ZFVENIX0JEIC0gMykKLQkvKiBGaXJzdCwgY2hlY2sgaWYgd2UgbmVlZCB0byBsaW5lYXJpemUgdGhlIHNrYiAoZHVlIHRvIEZXCi0JICAgcmVzdHJpY3Rpb25zKS4gTm8gbmVlZCB0byBjaGVjayBmcmFnbWVudGF0aW9uIGlmIHBhZ2Ugc2l6ZSA+IDhLCi0JICAgKHRoZXJlIHdpbGwgYmUgbm8gdmlvbGF0aW9uIHRvIEZXIHJlc3RyaWN0aW9ucykgKi8KLQlpZiAoYm54MnhfcGt0X3JlcV9saW4oYnAsIHNrYiwgeG1pdF90eXBlKSkgewotCQkvKiBTdGF0aXN0aWNzIG9mIGxpbmVhcml6YXRpb24gKi8KLQkJYnAtPmxpbl9jbnQrKzsKLQkJaWYgKHNrYl9saW5lYXJpemUoc2tiKSAhPSAwKSB7Ci0JCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiU0tCIGxpbmVhcml6YXRpb24gZmFpbGVkIC0gIgotCQkJICAgInNpbGVudGx5IGRyb3BwaW5nIHRoaXMgU0tCXG4iKTsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQlyZXR1cm4gTkVUREVWX1RYX09LOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKgotCVBsZWFzZSByZWFkIGNhcmVmdWxseS4gRmlyc3Qgd2UgdXNlIG9uZSBCRCB3aGljaCB3ZSBtYXJrIGFzIHN0YXJ0LAotCXRoZW4gd2UgaGF2ZSBhIHBhcnNpbmcgaW5mbyBCRCAodXNlZCBmb3IgVFNPIG9yIHhzdW0pLAotCWFuZCBvbmx5IHRoZW4gd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgVFNPIEJEcy4KLQkoZG9uJ3QgZm9yZ2V0IHRvIG1hcmsgdGhlIGxhc3Qgb25lIGFzIGxhc3QsCi0JYW5kIHRvIHVubWFwIG9ubHkgQUZURVIgeW91IHdyaXRlIHRvIHRoZSBCRCAuLi4pCi0JQW5kIGFib3ZlIGFsbCwgYWxsIHBkYiBzaXplcyBhcmUgaW4gd29yZHMgLSBOT1QgRFdPUkRTIQotCSovCi0KLQlwa3RfcHJvZCA9IGZwLT50eF9wa3RfcHJvZCsrOwotCWJkX3Byb2QgPSBUWF9CRChmcC0+dHhfYmRfcHJvZCk7Ci0KLQkvKiBnZXQgYSB0eF9idWYgYW5kIGZpcnN0IEJEICovCi0JdHhfYnVmID0gJmZwLT50eF9idWZfcmluZ1tUWF9CRChwa3RfcHJvZCldOwotCXR4X3N0YXJ0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0uc3RhcnRfYmQ7Ci0KLQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgPSBFVEhfVFhfQkRfRkxBR1NfU1RBUlRfQkQ7Ci0JdHhfc3RhcnRfYmQtPmdlbmVyYWxfZGF0YSA9ICAobWFjX3R5cGUgPDwKLQkJCQkJRVRIX1RYX1NUQVJUX0JEX0VUSF9BRERSX1RZUEVfU0hJRlQpOwotCS8qIGhlYWRlciBuYmQgKi8KLQl0eF9zdGFydF9iZC0+Z2VuZXJhbF9kYXRhIHw9ICgxIDw8IEVUSF9UWF9TVEFSVF9CRF9IRFJfTkJEU19TSElGVCk7Ci0KLQkvKiByZW1lbWJlciB0aGUgZmlyc3QgQkQgb2YgdGhlIHBhY2tldCAqLwotCXR4X2J1Zi0+Zmlyc3RfYmQgPSBmcC0+dHhfYmRfcHJvZDsKLQl0eF9idWYtPnNrYiA9IHNrYjsKLQl0eF9idWYtPmZsYWdzID0gMDsKLQotCURQKE5FVElGX01TR19UWF9RVUVVRUQsCi0JICAgInNlbmRpbmcgcGt0ICV1IEAlcCAgbmV4dF9pZHggJXUgIGJkICV1IEAlcFxuIiwKLQkgICBwa3RfcHJvZCwgdHhfYnVmLCBmcC0+dHhfcGt0X3Byb2QsIGJkX3Byb2QsIHR4X3N0YXJ0X2JkKTsKLQotI2lmZGVmIEJDTV9WTEFOCi0JaWYgKChicC0+dmxncnAgIT0gTlVMTCkgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpICYmCi0JICAgIChicC0+ZmxhZ3MgJiBIV19WTEFOX1RYX0ZMQUcpKSB7Ci0JCXR4X3N0YXJ0X2JkLT52bGFuID0gY3B1X3RvX2xlMTYodmxhbl90eF90YWdfZ2V0KHNrYikpOwotCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0gRVRIX1RYX0JEX0ZMQUdTX1ZMQU5fVEFHOwotCX0gZWxzZQotI2VuZGlmCi0JCXR4X3N0YXJ0X2JkLT52bGFuID0gY3B1X3RvX2xlMTYocGt0X3Byb2QpOwotCi0JLyogdHVybiBvbiBwYXJzaW5nIGFuZCBnZXQgYSBCRCAqLwotCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7Ci0JcGJkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucGFyc2VfYmQ7Ci0KLQltZW1zZXQocGJkLCAwLCBzaXplb2Yoc3RydWN0IGV0aF90eF9wYXJzZV9iZCkpOwotCi0JaWYgKHhtaXRfdHlwZSAmIFhNSVRfQ1NVTSkgewotCQlobGVuID0gKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiLT5kYXRhKSAvIDI7Ci0KLQkJLyogZm9yIG5vdyBOUyBmbGFnIGlzIG5vdCB1c2VkIGluIExpbnV4ICovCi0JCXBiZC0+Z2xvYmFsX2RhdGEgPQotCQkJKGhsZW4gfCAoKHNrYi0+cHJvdG9jb2wgPT0gY3B1X3RvX2JlMTYoRVRIX1BfODAyMVEpKSA8PAotCQkJCSBFVEhfVFhfUEFSU0VfQkRfTExDX1NOQVBfRU5fU0hJRlQpKTsKLQotCQlwYmQtPmlwX2hsZW4gPSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtCi0JCQkJc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpIC8gMjsKLQotCQlobGVuICs9IHBiZC0+aXBfaGxlbiArIHRjcF9oZHJsZW4oc2tiKSAvIDI7Ci0KLQkJcGJkLT50b3RhbF9obGVuID0gY3B1X3RvX2xlMTYoaGxlbik7Ci0JCWhsZW4gPSBobGVuKjI7Ci0KLQkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9IEVUSF9UWF9CRF9GTEFHU19MNF9DU1VNOwotCi0JCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU1fVjQpCi0JCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0KLQkJCQkJCUVUSF9UWF9CRF9GTEFHU19JUF9DU1VNOwotCQllbHNlCi0JCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0KLQkJCQkJCUVUSF9UWF9CRF9GTEFHU19JUFY2OwotCi0JCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU1fVENQKSB7Ci0JCQlwYmQtPnRjcF9wc2V1ZG9fY3N1bSA9IHN3YWIxNih0Y3BfaGRyKHNrYiktPmNoZWNrKTsKLQotCQl9IGVsc2UgewotCQkJczggZml4ID0gU0tCX0NTX09GRihza2IpOyAvKiBzaWduZWQhICovCi0KLQkJCXBiZC0+Z2xvYmFsX2RhdGEgfD0gRVRIX1RYX1BBUlNFX0JEX1VEUF9DU19GTEc7Ci0KLQkJCURQKE5FVElGX01TR19UWF9RVUVVRUQsCi0JCQkgICAiaGxlbiAlZCAgZml4ICVkICBjc3VtIGJlZm9yZSBmaXggJXhcbiIsCi0JCQkgICBsZTE2X3RvX2NwdShwYmQtPnRvdGFsX2hsZW4pLCBmaXgsIFNLQl9DUyhza2IpKTsKLQotCQkJLyogSFcgYnVnOiBmaXh1cCB0aGUgQ1NVTSAqLwotCQkJcGJkLT50Y3BfcHNldWRvX2NzdW0gPQotCQkJCWJueDJ4X2NzdW1fZml4KHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCi0JCQkJCSAgICAgICBTS0JfQ1Moc2tiKSwgZml4KTsKLQotCQkJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgImNzdW0gYWZ0ZXIgZml4ICV4XG4iLAotCQkJICAgcGJkLT50Y3BfcHNldWRvX2NzdW0pOwotCQl9Ci0JfQotCi0JbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCi0JCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOwotCi0JdHhfc3RhcnRfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOwotCXR4X3N0YXJ0X2JkLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIoVTY0X0xPKG1hcHBpbmcpKTsKLQluYmQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMjsgLyogc3RhcnRfYmQgKyBwYmQgKyBmcmFncyAqLwotCXR4X3N0YXJ0X2JkLT5uYmQgPSBjcHVfdG9fbGUxNihuYmQpOwotCXR4X3N0YXJ0X2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihza2JfaGVhZGxlbihza2IpKTsKLQlwa3Rfc2l6ZSA9IHR4X3N0YXJ0X2JkLT5uYnl0ZXM7Ci0KLQlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiZmlyc3QgYmQgQCVwICBhZGRyICgleDoleCkgIG5iZCAlZCIKLQkgICAiICBuYnl0ZXMgJWQgIGZsYWdzICV4ICB2bGFuICV4XG4iLAotCSAgIHR4X3N0YXJ0X2JkLCB0eF9zdGFydF9iZC0+YWRkcl9oaSwgdHhfc3RhcnRfYmQtPmFkZHJfbG8sCi0JICAgbGUxNl90b19jcHUodHhfc3RhcnRfYmQtPm5iZCksIGxlMTZfdG9fY3B1KHR4X3N0YXJ0X2JkLT5uYnl0ZXMpLAotCSAgIHR4X3N0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCwgbGUxNl90b19jcHUodHhfc3RhcnRfYmQtPnZsYW4pKTsKLQotCWlmICh4bWl0X3R5cGUgJiBYTUlUX0dTTykgewotCi0JCURQKE5FVElGX01TR19UWF9RVUVVRUQsCi0JCSAgICJUU08gcGFja2V0IGxlbiAlZCAgaGxlbiAlZCAgdG90YWwgbGVuICVkICB0c28gc2l6ZSAlZFxuIiwKLQkJICAgc2tiLT5sZW4sIGhsZW4sIHNrYl9oZWFkbGVuKHNrYiksCi0JCSAgIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOwotCi0JCXR4X3N0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBFVEhfVFhfQkRfRkxBR1NfU1dfTFNPOwotCi0JCWlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpID4gaGxlbikpCi0JCQliZF9wcm9kID0gYm54MnhfdHhfc3BsaXQoYnAsIGZwLCB0eF9idWYsICZ0eF9zdGFydF9iZCwKLQkJCQkJCSBobGVuLCBiZF9wcm9kLCArK25iZCk7Ci0KLQkJcGJkLT5sc29fbXNzID0gY3B1X3RvX2xlMTYoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7Ci0JCXBiZC0+dGNwX3NlbmRfc2VxID0gc3dhYjMyKHRjcF9oZHIoc2tiKS0+c2VxKTsKLQkJcGJkLT50Y3BfZmxhZ3MgPSBwYmRfdGNwX2ZsYWdzKHNrYik7Ci0KLQkJaWYgKHhtaXRfdHlwZSAmIFhNSVRfR1NPX1Y0KSB7Ci0JCQlwYmQtPmlwX2lkID0gc3dhYjE2KGlwX2hkcihza2IpLT5pZCk7Ci0JCQlwYmQtPnRjcF9wc2V1ZG9fY3N1bSA9Ci0JCQkJc3dhYjE2KH5jc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCi0JCQkJCQkJICBpcF9oZHIoc2tiKS0+ZGFkZHIsCi0JCQkJCQkJICAwLCBJUFBST1RPX1RDUCwgMCkpOwotCi0JCX0gZWxzZQotCQkJcGJkLT50Y3BfcHNldWRvX2NzdW0gPQotCQkJCXN3YWIxNih+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKLQkJCQkJCQkmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCi0JCQkJCQkJMCwgSVBQUk9UT19UQ1AsIDApKTsKLQotCQlwYmQtPmdsb2JhbF9kYXRhIHw9IEVUSF9UWF9QQVJTRV9CRF9QU0VVRE9fQ1NfV0lUSE9VVF9MRU47Ci0JfQotCXR4X2RhdGFfYmQgPSAoc3RydWN0IGV0aF90eF9iZCAqKXR4X3N0YXJ0X2JkOwotCi0JZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewotCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07Ci0KLQkJYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKLQkJdHhfZGF0YV9iZCA9ICZmcC0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnJlZ19iZDsKLQkJaWYgKHRvdGFsX3BrdF9iZCA9PSBOVUxMKQotCQkJdG90YWxfcGt0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucmVnX2JkOwotCi0JCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIGZyYWctPnBhZ2UsCi0JCQkJICAgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgICBmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKLQotCQl0eF9kYXRhX2JkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKLQkJdHhfZGF0YV9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7Ci0JCXR4X2RhdGFfYmQtPm5ieXRlcyA9IGNwdV90b19sZTE2KGZyYWctPnNpemUpOwotCQlsZTE2X2FkZF9jcHUoJnBrdF9zaXplLCBmcmFnLT5zaXplKTsKLQotCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELAotCQkgICAiZnJhZyAlZCAgYmQgQCVwICBhZGRyICgleDoleCkgIG5ieXRlcyAlZFxuIiwKLQkJICAgaSwgdHhfZGF0YV9iZCwgdHhfZGF0YV9iZC0+YWRkcl9oaSwgdHhfZGF0YV9iZC0+YWRkcl9sbywKLQkJICAgbGUxNl90b19jcHUodHhfZGF0YV9iZC0+bmJ5dGVzKSk7Ci0JfQotCi0JRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgImxhc3QgYmQgQCVwXG4iLCB0eF9kYXRhX2JkKTsKLQotCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7Ci0KLQkvKiBub3cgc2VuZCBhIHR4IGRvb3JiZWxsLCBjb3VudGluZyB0aGUgbmV4dCBCRAotCSAqIGlmIHRoZSBwYWNrZXQgY29udGFpbnMgb3IgZW5kcyB3aXRoIGl0Ci0JICovCi0JaWYgKFRYX0JEX1BPRkYoYmRfcHJvZCkgPCBuYmQpCi0JCW5iZCsrOwotCi0JaWYgKHRvdGFsX3BrdF9iZCAhPSBOVUxMKQotCQl0b3RhbF9wa3RfYmQtPnRvdGFsX3BrdF9ieXRlcyA9IHBrdF9zaXplOwotCi0JaWYgKHBiZCkKLQkJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwKLQkJICAgIlBCRCBAJXAgIGlwX2RhdGEgJXggIGlwX2hsZW4gJXUgIGlwX2lkICV1ICBsc29fbXNzICV1IgotCQkgICAiICB0Y3BfZmxhZ3MgJXggIHhzdW0gJXggIHNlcSAldSAgaGxlbiAldVxuIiwKLQkJICAgcGJkLCBwYmQtPmdsb2JhbF9kYXRhLCBwYmQtPmlwX2hsZW4sIHBiZC0+aXBfaWQsCi0JCSAgIHBiZC0+bHNvX21zcywgcGJkLT50Y3BfZmxhZ3MsIHBiZC0+dGNwX3BzZXVkb19jc3VtLAotCQkgICBwYmQtPnRjcF9zZW5kX3NlcSwgbGUxNl90b19jcHUocGJkLT50b3RhbF9obGVuKSk7Ci0KLQlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiZG9vcmJlbGw6IG5iZCAlZCAgYmQgJXVcbiIsIG5iZCwgYmRfcHJvZCk7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBCRCBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBwcm9kdWNlcgotCSAqIHNpbmNlIEZXIG1pZ2h0IHJlYWQgdGhlIEJEIHJpZ2h0IGFmdGVyIHRoZSBwcm9kdWNlciBpcyB1cGRhdGVkLgotCSAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzIHN1Y2gKLQkgKiBhcyBJQS02NC4gVGhlIGZvbGxvd2luZyBiYXJyaWVyIGlzIGFsc28gbWFuZGF0b3J5IHNpbmNlIEZXIHdpbGwKLQkgKiBhc3N1bWVzIHBhY2tldHMgbXVzdCBoYXZlIEJEcy4KLQkgKi8KLQl3bWIoKTsKLQotCWZwLT50eF9kYi5kYXRhLnByb2QgKz0gbmJkOwotCWJhcnJpZXIoKTsKLQlET09SQkVMTChicCwgZnAtPmluZGV4LCBmcC0+dHhfZGIucmF3KTsKLQotCW1taW93YigpOwotCi0JZnAtPnR4X2JkX3Byb2QgKz0gbmJkOwotCi0JaWYgKHVubGlrZWx5KGJueDJ4X3R4X2F2YWlsKGZwKSA8IE1BWF9TS0JfRlJBR1MgKyAzKSkgewotCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7Ci0KLQkJLyogcGFpcmVkIG1lbW9yeSBiYXJyaWVyIGlzIGluIGJueDJ4X3R4X2ludCgpLCB3ZSBoYXZlIHRvIGtlZXAKLQkJICogb3JkZXJpbmcgb2Ygc2V0X2JpdCgpIGluIG5ldGlmX3R4X3N0b3BfcXVldWUoKSBhbmQgcmVhZCBvZgotCQkgKiBmcC0+YmRfdHhfY29ucyAqLwotCQlzbXBfbWIoKTsKLQotCQlmcC0+ZXRoX3Ffc3RhdHMuZHJpdmVyX3hvZmYrKzsKLQkJaWYgKGJueDJ4X3R4X2F2YWlsKGZwKSA+PSBNQVhfU0tCX0ZSQUdTICsgMykKLQkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKLQl9Ci0JZnAtPnR4X3BrdCsrOwotCi0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLX0KLQotLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCi1zdGF0aWMgaW50IGJueDJ4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0KLQlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EMCk7Ci0KLQlpZiAoIWJueDJ4X3Jlc2V0X2lzX2RvbmUoYnApKSB7Ci0JCWRvIHsKLQkJCS8qIFJlc2V0IE1DUCBtYWlsIGJveCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbiBnb2luZwotCQkJICogcmVjb3ZlcnkKLQkJCSAqLwotCQkJYnAtPmZ3X3NlcSA9IDA7Ci0KLQkJCS8qIElmIGl0J3MgdGhlIGZpcnN0IGZ1bmN0aW9uIHRvIGxvYWQgYW5kIHJlc2V0IGRvbmUKLQkJCSAqIGlzIHN0aWxsIG5vdCBjbGVhcmVkIGl0IG1heSBtZWFuIHRoYXQuIFdlIGRvbid0Ci0JCQkgKiBjaGVjayB0aGUgYXR0ZW50aW9uIHN0YXRlIGhlcmUgYmVjYXVzZSBpdCBtYXkgaGF2ZQotCQkJICogYWxyZWFkeSBiZWVuIGNsZWFyZWQgYnkgYSAiY29tbW9uIiByZXNldCBidXQgd2UKLQkJCSAqIHNoZWxsIHByb2NlZWQgd2l0aCAicHJvY2VzcyBraWxsIiBhbnl3YXkuCi0JCQkgKi8KLQkJCWlmICgoYm54MnhfZ2V0X2xvYWRfY250KGJwKSA9PSAwKSAmJgotCQkJCWJueDJ4X3RyeWxvY2tfaHdfbG9jayhicCwKLQkJCQlIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KSAmJgotCQkJCSghYm54MnhfbGVhZGVyX3Jlc2V0KGJwKSkpIHsKLQkJCQlEUChORVRJRl9NU0dfSFcsICJSZWNvdmVyZWQgaW4gb3BlblxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QzaG90KTsKLQotCQkJcHJpbnRrKEtFUk5fRVJSIiVzOiBSZWNvdmVyeSBmbG93IGhhc24ndCBiZWVuIHByb3Blcmx5IgotCQkJIiBjb21wbGV0ZWQgeWV0LiBUcnkgYWdhaW4gbGF0ZXIuIElmIHUgc3RpbGwgc2VlIHRoaXMiCi0JCQkiIG1lc3NhZ2UgYWZ0ZXIgYSBmZXcgcmV0cmllcyB0aGVuIHBvd2VyIGN5Y2xlIGlzIgotCQkJIiByZXF1aXJlZC5cbiIsIGJwLT5kZXYtPm5hbWUpOwotCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfSB3aGlsZSAoMCk7Ci0JfQotCi0JYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfRE9ORTsKLQotCXJldHVybiBibngyeF9uaWNfbG9hZChicCwgTE9BRF9PUEVOKTsKLX0KLQotLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCi1zdGF0aWMgaW50IGJueDJ4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkvKiBVbmxvYWQgdGhlIGRyaXZlciwgcmVsZWFzZSBJUlFzICovCi0JYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX0NMT1NFKTsKLQlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EM2hvdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogY2FsbGVkIHdpdGggbmV0aWZfdHhfbG9jayBmcm9tIGRldl9tY2FzdC5jICovCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiByeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9OT1JNQUw7Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQotCWlmIChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfT1BFTikgewotCQlEUChORVRJRl9NU0dfSUZVUCwgInN0YXRlIGlzICV4LCByZXR1cm5pbmdcbiIsIGJwLT5zdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlEUChORVRJRl9NU0dfSUZVUCwgImRldi0+ZmxhZ3MgPSAleFxuIiwgZGV2LT5mbGFncyk7Ci0KLQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQlyeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9QUk9NSVNDOwotCi0JZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8Ci0JCSAoKG5ldGRldl9tY19jb3VudChkZXYpID4gQk5YMlhfTUFYX01VTFRJQ0FTVCkgJiYKLQkJICBDSElQX0lTX0UxKGJwKSkpCi0JCXJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX0FMTE1VTFRJOwotCi0JZWxzZSB7IC8qIHNvbWUgbXVsdGljYXN0cyAqLwotCQlpZiAoQ0hJUF9JU19FMShicCkpIHsKLQkJCWludCBpLCBvbGQsIG9mZnNldDsKLQkJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0JCQlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcgPQotCQkJCQkJYm54Mnhfc3AoYnAsIG1jYXN0X2NvbmZpZyk7Ci0KLQkJCWkgPSAwOwotCQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQkJCWNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldLgotCQkJCQljYW1fZW50cnkubXNiX21hY19hZGRyID0KLQkJCQkJc3dhYjE2KCoodTE2ICopJmhhLT5hZGRyWzBdKTsKLQkJCQljb25maWctPmNvbmZpZ190YWJsZVtpXS4KLQkJCQkJY2FtX2VudHJ5Lm1pZGRsZV9tYWNfYWRkciA9Ci0JCQkJCXN3YWIxNigqKHUxNiAqKSZoYS0+YWRkclsyXSk7Ci0JCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uCi0JCQkJCWNhbV9lbnRyeS5sc2JfbWFjX2FkZHIgPQotCQkJCQlzd2FiMTYoKih1MTYgKikmaGEtPmFkZHJbNF0pOwotCQkJCWNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldLmNhbV9lbnRyeS5mbGFncyA9Ci0JCQkJCQkJY3B1X3RvX2xlMTYocG9ydCk7Ci0JCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uCi0JCQkJCXRhcmdldF90YWJsZV9lbnRyeS5mbGFncyA9IDA7Ci0JCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0udGFyZ2V0X3RhYmxlX2VudHJ5LgotCQkJCQljbGllbnRzX2JpdF92ZWN0b3IgPQotCQkJCQkJY3B1X3RvX2xlMzIoMSA8PCBCUF9MX0lEKGJwKSk7Ci0JCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uCi0JCQkJCXRhcmdldF90YWJsZV9lbnRyeS52bGFuX2lkID0gMDsKLQotCQkJCURQKE5FVElGX01TR19JRlVQLAotCQkJCSAgICJzZXR0aW5nIE1DQVNUWyVkXSAoJTA0eDolMDR4OiUwNHgpXG4iLCBpLAotCQkJCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldLgotCQkJCQkJY2FtX2VudHJ5Lm1zYl9tYWNfYWRkciwKLQkJCQkgICBjb25maWctPmNvbmZpZ190YWJsZVtpXS4KLQkJCQkJCWNhbV9lbnRyeS5taWRkbGVfbWFjX2FkZHIsCi0JCQkJICAgY29uZmlnLT5jb25maWdfdGFibGVbaV0uCi0JCQkJCQljYW1fZW50cnkubHNiX21hY19hZGRyKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlvbGQgPSBjb25maWctPmhkci5sZW5ndGg7Ci0JCQlpZiAob2xkID4gaSkgewotCQkJCWZvciAoOyBpIDwgb2xkOyBpKyspIHsKLQkJCQkJaWYgKENBTV9JU19JTlZBTElEKGNvbmZpZy0+Ci0JCQkJCQkJICAgY29uZmlnX3RhYmxlW2ldKSkgewotCQkJCQkJLyogYWxyZWFkeSBpbnZhbGlkYXRlZCAqLwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLyogaW52YWxpZGF0ZSAqLwotCQkJCQlDQU1fSU5WQUxJREFURShjb25maWctPgotCQkJCQkJICAgICAgIGNvbmZpZ190YWJsZVtpXSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCi0JCQkJb2Zmc2V0ID0gQk5YMlhfTUFYX0VNVUxfTVVMVEkqKDEgKyBwb3J0KTsKLQkJCWVsc2UKLQkJCQlvZmZzZXQgPSBCTlgyWF9NQVhfTVVMVElDQVNUKigxICsgcG9ydCk7Ci0KLQkJCWNvbmZpZy0+aGRyLmxlbmd0aCA9IGk7Ci0JCQljb25maWctPmhkci5vZmZzZXQgPSBvZmZzZXQ7Ci0JCQljb25maWctPmhkci5jbGllbnRfaWQgPSBicC0+ZnAtPmNsX2lkOwotCQkJY29uZmlnLT5oZHIucmVzZXJ2ZWQxID0gMDsKLQotCQkJYnAtPnNldF9tYWNfcGVuZGluZysrOwotCQkJc21wX3dtYigpOwotCi0JCQlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDLCAwLAotCQkJCSAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtY2FzdF9jb25maWcpKSwKLQkJCQkgICBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWNhc3RfY29uZmlnKSksCi0JCQkJICAgICAgMCk7Ci0JCX0gZWxzZSB7IC8qIEUxSCAqLwotCQkJLyogQWNjZXB0IG9uZSBvciBtb3JlIG11bHRpY2FzdHMgKi8KLQkJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0JCQl1MzIgbWNfZmlsdGVyW01DX0hBU0hfU0laRV07Ci0JCQl1MzIgY3JjLCBiaXQsIHJlZ2lkeDsKLQkJCWludCBpOwotCi0JCQltZW1zZXQobWNfZmlsdGVyLCAwLCA0ICogTUNfSEFTSF9TSVpFKTsKLQotCQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQkJCURQKE5FVElGX01TR19JRlVQLCAiQWRkaW5nIG1jYXN0IE1BQzogJXBNXG4iLAotCQkJCSAgIGhhLT5hZGRyKTsKLQotCQkJCWNyYyA9IGNyYzMyY19sZSgwLCBoYS0+YWRkciwgRVRIX0FMRU4pOwotCQkJCWJpdCA9IChjcmMgPj4gMjQpICYgMHhmZjsKLQkJCQlyZWdpZHggPSBiaXQgPj4gNTsKLQkJCQliaXQgJj0gMHgxZjsKLQkJCQltY19maWx0ZXJbcmVnaWR4XSB8PSAoMSA8PCBiaXQpOwotCQkJfQotCi0JCQlmb3IgKGkgPSAwOyBpIDwgTUNfSEFTSF9TSVpFOyBpKyspCi0JCQkJUkVHX1dSKGJwLCBNQ19IQVNIX09GRlNFVChicCwgaSksCi0JCQkJICAgICAgIG1jX2ZpbHRlcltpXSk7Ci0JCX0KLQl9Ci0KLQlicC0+cnhfbW9kZSA9IHJ4X21vZGU7Ci0JYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUoYnApOwotfQotCi0vKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KLXN0YXRpYyBpbnQgYm54MnhfY2hhbmdlX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCi17Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcigodTggKikoYWRkci0+c2FfZGF0YSkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCWlmIChDSElQX0lTX0UxKGJwKSkKLQkJCWJueDJ4X3NldF9ldGhfbWFjX2FkZHJfZTEoYnAsIDEpOwotCQllbHNlCi0JCQlibngyeF9zZXRfZXRoX21hY19hZGRyX2UxaChicCwgMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLwotc3RhdGljIGludCBibngyeF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBydGFkLAotCQkJICAgaW50IGRldmFkLCB1MTYgYWRkcikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MTYgdmFsdWU7Ci0JaW50IHJjOwotCXUzMiBwaHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7Ci0KLQlEUChORVRJRl9NU0dfTElOSywgIm1kaW9fcmVhZDogcHJ0YWQgMHgleCwgZGV2YWQgMHgleCwgYWRkciAweCV4XG4iLAotCSAgIHBydGFkLCBkZXZhZCwgYWRkcik7Ci0KLQlpZiAocHJ0YWQgIT0gYnAtPm1kaW8ucHJ0YWQpIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJwcnRhZCBtaXNzbWF0Y2ggKGNtZDoweCV4ICE9IGJwOjB4JXgpXG4iLAotCQkgICBwcnRhZCwgYnAtPm1kaW8ucHJ0YWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBUaGUgSFcgZXhwZWN0cyBkaWZmZXJlbnQgZGV2YWQgaWYgQ0wyMiBpcyB1c2VkICovCi0JZGV2YWQgPSAoZGV2YWQgPT0gTURJT19ERVZBRF9OT05FKSA/IERFRkFVTFRfUEhZX0RFVl9BRERSIDogZGV2YWQ7Ci0KLQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKLQlyYyA9IGJueDJ4X2NsNDVfcmVhZChicCwgQlBfUE9SVChicCksIHBoeV90eXBlLCBwcnRhZCwKLQkJCSAgICAgZGV2YWQsIGFkZHIsICZ2YWx1ZSk7Ci0JYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJtZGlvX3JlYWRfdmFsIDB4JXggcmMgPSAweCV4XG4iLCB2YWx1ZSwgcmMpOwotCi0JaWYgKCFyYykKLQkJcmMgPSB2YWx1ZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLwotc3RhdGljIGludCBibngyeF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwcnRhZCwgaW50IGRldmFkLAotCQkJICAgIHUxNiBhZGRyLCB1MTYgdmFsdWUpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTMyIGV4dF9waHlfdHlwZSA9IFhHWFNfRVhUX1BIWV9UWVBFKGJwLT5saW5rX3BhcmFtcy5leHRfcGh5X2NvbmZpZyk7Ci0JaW50IHJjOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJtZGlvX3dyaXRlOiBwcnRhZCAweCV4LCBkZXZhZCAweCV4LCBhZGRyIDB4JXgsIgotCQkJICAgIiB2YWx1ZSAweCV4XG4iLCBwcnRhZCwgZGV2YWQsIGFkZHIsIHZhbHVlKTsKLQotCWlmIChwcnRhZCAhPSBicC0+bWRpby5wcnRhZCkgewotCQlEUChORVRJRl9NU0dfTElOSywgInBydGFkIG1pc3NtYXRjaCAoY21kOjB4JXggIT0gYnA6MHgleClcbiIsCi0JCSAgIHBydGFkLCBicC0+bWRpby5wcnRhZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFRoZSBIVyBleHBlY3RzIGRpZmZlcmVudCBkZXZhZCBpZiBDTDIyIGlzIHVzZWQgKi8KLQlkZXZhZCA9IChkZXZhZCA9PSBNRElPX0RFVkFEX05PTkUpID8gREVGQVVMVF9QSFlfREVWX0FERFIgOiBkZXZhZDsKLQotCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwotCXJjID0gYm54MnhfY2w0NV93cml0ZShicCwgQlBfUE9SVChicCksIGV4dF9waHlfdHlwZSwgcHJ0YWQsCi0JCQkgICAgICBkZXZhZCwgYWRkciwgdmFsdWUpOwotCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOwotCXJldHVybiByYzsKLX0KLQotLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCi1zdGF0aWMgaW50IGJueDJ4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWRpbyA9IGlmX21paShpZnIpOwotCi0JRFAoTkVUSUZfTVNHX0xJTkssICJpb2N0bDogcGh5IGlkIDB4JXgsIHJlZyAweCV4LCB2YWxfaW4gMHgleFxuIiwKLQkgICBtZGlvLT5waHlfaWQsIG1kaW8tPnJlZ19udW0sIG1kaW8tPnZhbF9pbik7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gbWRpb19taWlfaW9jdGwoJmJwLT5tZGlvLCBtZGlvLCBjbWQpOwotfQotCi0vKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KLXN0YXRpYyBpbnQgYm54MnhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiBUcnkgYWdhaW4gbGF0ZXJcbiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlpZiAoKG5ld19tdHUgPiBFVEhfTUFYX0pVTUJPX1BBQ0tFVF9TSVpFKSB8fAotCSAgICAoKG5ld19tdHUgKyBFVEhfSExFTikgPCBFVEhfTUlOX1BBQ0tFVF9TSVpFKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBUaGlzIGRvZXMgbm90IHJhY2Ugd2l0aCBwYWNrZXQgYWxsb2NhdGlvbgotCSAqIGJlY2F1c2UgdGhlIGFjdHVhbCBhbGxvYyBzaXplIGlzCi0JICogb25seSB1cGRhdGVkIGFzIHBhcnQgb2YgbG9hZAotCSAqLwotCWRldi0+bXR1ID0gbmV3X210dTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX05PUk1BTCk7Ci0JCXJjID0gYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQlpZiAoIWJwLT5wYW5pYykKLQkJYm54MnhfcGFuaWMoKTsKLSNlbmRpZgotCS8qIFRoaXMgYWxsb3dzIHRoZSBuZXRpZiB0byBiZSBzaHV0ZG93biBncmFjZWZ1bGx5IGJlZm9yZSByZXNldHRpbmcgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5yZXNldF90YXNrLCAwKTsKLX0KLQotI2lmZGVmIEJDTV9WTEFOCi0vKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KLXN0YXRpYyB2b2lkIGJueDJ4X3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnApCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlicC0+dmxncnAgPSB2bGdycDsKLQotCS8qIFNldCBmbGFncyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyAqLwotCWJwLT5mbGFncyAmPSB+KEhXX1ZMQU5fUlhfRkxBRyB8IEhXX1ZMQU5fVFhfRkxBRyk7Ci0KLQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkKLQkJYnAtPmZsYWdzIHw9IEhXX1ZMQU5fVFhfRkxBRzsKLQotCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQotCQlicC0+ZmxhZ3MgfD0gSFdfVkxBTl9SWF9GTEFHOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJYm54Mnhfc2V0X2NsaWVudF9jb25maWcoYnApOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi1zdGF0aWMgdm9pZCBwb2xsX2JueDJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlkaXNhYmxlX2lycShicC0+cGRldi0+aXJxKTsKLQlibngyeF9pbnRlcnJ1cHQoYnAtPnBkZXYtPmlycSwgZGV2KTsKLQllbmFibGVfaXJxKGJwLT5wZGV2LT5pcnEpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYm54MnhfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4JCT0gYm54Mnhfb3BlbiwKLQkubmRvX3N0b3AJCT0gYm54MnhfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0CQk9IGJueDJ4X3N0YXJ0X3htaXQsCi0JLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBibngyeF9zZXRfcnhfbW9kZSwKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGJueDJ4X2NoYW5nZV9tYWNfYWRkciwKLQkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX2RvX2lvY3RsCQk9IGJueDJ4X2lvY3RsLAotCS5uZG9fY2hhbmdlX210dQkJPSBibngyeF9jaGFuZ2VfbXR1LAotCS5uZG9fdHhfdGltZW91dAkJPSBibngyeF90eF90aW1lb3V0LAotI2lmZGVmIEJDTV9WTEFOCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYm54Mnhfdmxhbl9yeF9yZWdpc3RlciwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBwb2xsX2JueDJ4LAotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBibngyeF9pbml0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwOwotCWludCByYzsKLQotCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7Ci0JYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JYnAtPmRldiA9IGRldjsKLQlicC0+cGRldiA9IHBkZXY7Ci0JYnAtPmZsYWdzID0gMDsKLQlicC0+ZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKLQotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCi0JCQkiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlLCBhYm9ydGluZ1xuIik7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgZmluZCBQQ0kgZGV2aWNlIGJhc2UgYWRkcmVzcywgYWJvcnRpbmdcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dF9kaXNhYmxlOwotCX0KLQotCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LCAiQ2Fubm90IGZpbmQgc2Vjb25kIFBDSSBkZXZpY2UiCi0JCSAgICAgICAiIGJhc2UgYWRkcmVzcywgYWJvcnRpbmdcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dF9kaXNhYmxlOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmcGRldi0+ZW5hYmxlX2NudCkgPT0gMSkgewotCQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX01PRFVMRV9OQU1FKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAotCQkJCSJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKLQkJCWdvdG8gZXJyX291dF9kaXNhYmxlOwotCQl9Ci0KLQkJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCX0KLQotCWJwLT5wbV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOwotCWlmIChicC0+cG1fY2FwID09IDApIHsKLQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgZmluZCBwb3dlciBtYW5hZ2VtZW50IGNhcGFiaWxpdHksIGFib3J0aW5nXG4iKTsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKLQl9Ci0KLQlicC0+cGNpZV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlpZiAoYnAtPnBjaWVfY2FwID09IDApIHsKLQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgZmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5LCBhYm9ydGluZ1xuIik7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBlcnJfb3V0X3JlbGVhc2U7Ci0JfQotCi0JaWYgKGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSA9PSAwKSB7Ci0JCWJwLT5mbGFncyB8PSBVU0lOR19EQUNfRkxBRzsKLQkJaWYgKGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LCAiZG1hX3NldF9jb2hlcmVudF9tYXNrIgotCQkJICAgICAgICIgZmFpbGVkLCBhYm9ydGluZ1xuIik7Ci0JCQlyYyA9IC1FSU87Ci0JCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKLQkJfQotCi0JfSBlbHNlIGlmIChkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSkgIT0gMCkgewotCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAotCQkJIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IERNQSwgYWJvcnRpbmdcbiIpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gZXJyX291dF9yZWxlYXNlOwotCX0KLQotCWRldi0+bWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCWRldi0+YmFzZV9hZGRyID0gZGV2LT5tZW1fc3RhcnQ7Ci0JZGV2LT5tZW1fZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAwKTsKLQotCWRldi0+aXJxID0gcGRldi0+aXJxOwotCi0JYnAtPnJlZ3ZpZXcgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7Ci0JaWYgKCFicC0+cmVndmlldykgewotCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAotCQkJIkNhbm5vdCBtYXAgcmVnaXN0ZXIgc3BhY2UsIGFib3J0aW5nXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKLQl9Ci0KLQlicC0+ZG9vcmJlbGxzID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwKLQkJCQkJbWluX3QodTY0LCBCTlgyWF9EQl9TSVpFLAotCQkJCQkgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKSk7Ci0JaWYgKCFicC0+ZG9vcmJlbGxzKSB7Ci0JCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCi0JCQkiQ2Fubm90IG1hcCBkb29yYmVsbCBzcGFjZSwgYWJvcnRpbmdcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dF91bm1hcDsKLQl9Ci0KLQlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EMCk7Ci0KLQkvKiBjbGVhbiBpbmRpcmVjdCBhZGRyZXNzZXMgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FERFJFU1MsCi0JCQkgICAgICAgUENJQ0ZHX1ZFTkRPUl9JRF9PRkZTRVQpOwotCVJFR19XUihicCwgUFhQMl9SRUdfUEdMX0FERFJfODhfRjAgKyBCUF9QT1JUKGJwKSoxNiwgMCk7Ci0JUkVHX1dSKGJwLCBQWFAyX1JFR19QR0xfQUREUl84Q19GMCArIEJQX1BPUlQoYnApKjE2LCAwKTsKLQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BHTF9BRERSXzkwX0YwICsgQlBfUE9SVChicCkqMTYsIDApOwotCVJFR19XUihicCwgUFhQMl9SRUdfUEdMX0FERFJfOTRfRjAgKyBCUF9QT1JUKGJwKSoxNiwgMCk7Ci0KLQkvKiBSZXNldCB0aGUgbG9hZCBjb3VudGVyICovCi0JYm54MnhfY2xlYXJfbG9hZF9jbnQoYnApOwotCi0JZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0KLQlkZXYtPm5ldGRldl9vcHMgPSAmYm54MnhfbmV0ZGV2X29wczsKLQlkZXYtPmV0aHRvb2xfb3BzID0gJmJueDJ4X2V0aHRvb2xfb3BzOwotCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsKLQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKLQlpZiAoYnAtPmZsYWdzICYgVVNJTkdfREFDX0ZMQUcpCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCWRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU09fRUNOKTsKLQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLSNpZmRlZiBCQ01fVkxBTgotCWRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWCk7Ci0JYnAtPmZsYWdzIHw9IChIV19WTEFOX1JYX0ZMQUcgfCBIV19WTEFOX1RYX0ZMQUcpOwotCi0JZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7Ci0JZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKLQlpZiAoYnAtPmZsYWdzICYgVVNJTkdfREFDX0ZMQUcpCi0JCWRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7Ci0JZGV2LT52bGFuX2ZlYXR1cmVzIHw9IChORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTik7Ci0JZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLSNlbmRpZgotCi0JLyogZ2V0X3BvcnRfaHdpbmZvKCkgd2lsbCBzZXQgcHJ0YWQgYW5kIG1tZHMgcHJvcGVybHkgKi8KLQlicC0+bWRpby5wcnRhZCA9IE1ESU9fUFJUQURfTk9ORTsKLQlicC0+bWRpby5tbWRzID0gMDsKLQlicC0+bWRpby5tb2RlX3N1cHBvcnQgPSBNRElPX1NVUFBPUlRTX0M0NSB8IE1ESU9fRU1VTEFURV9DMjI7Ci0JYnAtPm1kaW8uZGV2ID0gZGV2OwotCWJwLT5tZGlvLm1kaW9fcmVhZCA9IGJueDJ4X21kaW9fcmVhZDsKLQlicC0+bWRpby5tZGlvX3dyaXRlID0gYm54MnhfbWRpb193cml0ZTsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X3VubWFwOgotCWlmIChicC0+cmVndmlldykgewotCQlpb3VubWFwKGJwLT5yZWd2aWV3KTsKLQkJYnAtPnJlZ3ZpZXcgPSBOVUxMOwotCX0KLQlpZiAoYnAtPmRvb3JiZWxscykgewotCQlpb3VubWFwKGJwLT5kb29yYmVsbHMpOwotCQlicC0+ZG9vcmJlbGxzID0gTlVMTDsKLQl9Ci0KLWVycl9vdXRfcmVsZWFzZToKLQlpZiAoYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpID09IDEpCi0JCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0KLWVycl9vdXRfZGlzYWJsZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi1lcnJfb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X2dldF9wY2llX3dpZHRoX3NwZWVkKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJCQkgaW50ICp3aWR0aCwgaW50ICpzcGVlZCkKLXsKLQl1MzIgdmFsID0gUkVHX1JEKGJwLCBQQ0lDRkdfT0ZGU0VUICsgUENJQ0ZHX0xJTktfQ09OVFJPTCk7Ci0KLQkqd2lkdGggPSAodmFsICYgUENJQ0ZHX0xJTktfV0lEVEgpID4+IFBDSUNGR19MSU5LX1dJRFRIX1NISUZUOwotCi0JLyogcmV0dXJuIHZhbHVlIG9mIDE9Mi41R0h6IDI9NUdIeiAqLwotCSpzcGVlZCA9ICh2YWwgJiBQQ0lDRkdfTElOS19TUEVFRCkgPj4gUENJQ0ZHX0xJTktfU1BFRURfU0hJRlQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2NoZWNrX2Zpcm13YXJlKHN0cnVjdCBibngyeCAqYnApCi17Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSA9IGJwLT5maXJtd2FyZTsKLQlzdHJ1Y3QgYm54MnhfZndfZmlsZV9oZHIgKmZ3X2hkcjsKLQlzdHJ1Y3QgYm54MnhfZndfZmlsZV9zZWN0aW9uICpzZWN0aW9uczsKLQl1MzIgb2Zmc2V0LCBsZW4sIG51bV9vcHM7Ci0JdTE2ICpvcHNfb2Zmc2V0czsKLQlpbnQgaTsKLQljb25zdCB1OCAqZndfdmVyOwotCi0JaWYgKGZpcm13YXJlLT5zaXplIDwgc2l6ZW9mKHN0cnVjdCBibngyeF9md19maWxlX2hkcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZndfaGRyID0gKHN0cnVjdCBibngyeF9md19maWxlX2hkciAqKWZpcm13YXJlLT5kYXRhOwotCXNlY3Rpb25zID0gKHN0cnVjdCBibngyeF9md19maWxlX3NlY3Rpb24gKilmd19oZHI7Ci0KLQkvKiBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgb2Zmc2V0cyBhbmQgc2l6ZXMgbWFrZSB1cyByZWFkIGJleW9uZAotCSAqIHRoZSBlbmQgb2YgdGhlIGZpcm13YXJlIGRhdGEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCpmd19oZHIpIC8gc2l6ZW9mKCpzZWN0aW9ucyk7IGkrKykgewotCQlvZmZzZXQgPSBiZTMyX3RvX2NwdShzZWN0aW9uc1tpXS5vZmZzZXQpOwotCQlsZW4gPSBiZTMyX3RvX2NwdShzZWN0aW9uc1tpXS5sZW4pOwotCQlpZiAob2Zmc2V0ICsgbGVuID4gZmlybXdhcmUtPnNpemUpIHsKLQkJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCi0JCQkJIlNlY3Rpb24gJWQgbGVuZ3RoIGlzIG91dCBvZiBib3VuZHNcbiIsIGkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQkvKiBMaWtld2lzZSBmb3IgdGhlIGluaXRfb3BzIG9mZnNldHMgKi8KLQlvZmZzZXQgPSBiZTMyX3RvX2NwdShmd19oZHItPmluaXRfb3BzX29mZnNldHMub2Zmc2V0KTsKLQlvcHNfb2Zmc2V0cyA9ICh1MTYgKikoZmlybXdhcmUtPmRhdGEgKyBvZmZzZXQpOwotCW51bV9vcHMgPSBiZTMyX3RvX2NwdShmd19oZHItPmluaXRfb3BzLmxlbikgLyBzaXplb2Yoc3RydWN0IHJhd19vcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmUzMl90b19jcHUoZndfaGRyLT5pbml0X29wc19vZmZzZXRzLmxlbikgLyAyOyBpKyspIHsKLQkJaWYgKGJlMTZfdG9fY3B1KG9wc19vZmZzZXRzW2ldKSA+IG51bV9vcHMpIHsKLQkJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCi0JCQkJIlNlY3Rpb24gb2Zmc2V0ICVkIGlzIG91dCBvZiBib3VuZHNcbiIsIGkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBGVyB2ZXJzaW9uICovCi0Jb2Zmc2V0ID0gYmUzMl90b19jcHUoZndfaGRyLT5md192ZXJzaW9uLm9mZnNldCk7Ci0JZndfdmVyID0gZmlybXdhcmUtPmRhdGEgKyBvZmZzZXQ7Ci0JaWYgKChmd192ZXJbMF0gIT0gQkNNXzU3MTBfRldfTUFKT1JfVkVSU0lPTikgfHwKLQkgICAgKGZ3X3ZlclsxXSAhPSBCQ01fNTcxMF9GV19NSU5PUl9WRVJTSU9OKSB8fAotCSAgICAoZndfdmVyWzJdICE9IEJDTV81NzEwX0ZXX1JFVklTSU9OX1ZFUlNJT04pIHx8Ci0JICAgIChmd192ZXJbM10gIT0gQkNNXzU3MTBfRldfRU5HSU5FRVJJTkdfVkVSU0lPTikpIHsKLQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKLQkJCSJCYWQgRlcgdmVyc2lvbjolZC4lZC4lZC4lZC4gU2hvdWxkIGJlICVkLiVkLiVkLiVkXG4iLAotCQkgICAgICAgZndfdmVyWzBdLCBmd192ZXJbMV0sIGZ3X3ZlclsyXSwKLQkJICAgICAgIGZ3X3ZlclszXSwgQkNNXzU3MTBfRldfTUFKT1JfVkVSU0lPTiwKLQkJICAgICAgIEJDTV81NzEwX0ZXX01JTk9SX1ZFUlNJT04sCi0JCSAgICAgICBCQ01fNTcxMF9GV19SRVZJU0lPTl9WRVJTSU9OLAotCQkgICAgICAgQkNNXzU3MTBfRldfRU5HSU5FRVJJTkdfVkVSU0lPTik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmUzMl90b19jcHVfbihjb25zdCB1OCAqX3NvdXJjZSwgdTggKl90YXJnZXQsIHUzMiBuKQotewotCWNvbnN0IF9fYmUzMiAqc291cmNlID0gKGNvbnN0IF9fYmUzMiAqKV9zb3VyY2U7Ci0JdTMyICp0YXJnZXQgPSAodTMyICopX3RhcmdldDsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBuLzQ7IGkrKykKLQkJdGFyZ2V0W2ldID0gYmUzMl90b19jcHUoc291cmNlW2ldKTsKLX0KLQotLyoKLSAgIE9wcyBhcnJheSBpcyBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gICB7b3AoOGJpdCksIG9mZnNldCgyNGJpdCwgYmlnIGVuZGlhbiksIGRhdGEoMzJiaXQsIGJpZyBlbmRpYW4pfQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfcHJlcF9vcHMoY29uc3QgdTggKl9zb3VyY2UsIHU4ICpfdGFyZ2V0LCB1MzIgbikKLXsKLQljb25zdCBfX2JlMzIgKnNvdXJjZSA9IChjb25zdCBfX2JlMzIgKilfc291cmNlOwotCXN0cnVjdCByYXdfb3AgKnRhcmdldCA9IChzdHJ1Y3QgcmF3X29wICopX3RhcmdldDsKLQl1MzIgaSwgaiwgdG1wOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuLzg7IGkrKywgaiArPSAyKSB7Ci0JCXRtcCA9IGJlMzJfdG9fY3B1KHNvdXJjZVtqXSk7Ci0JCXRhcmdldFtpXS5vcCA9ICh0bXAgPj4gMjQpICYgMHhmZjsKLQkJdGFyZ2V0W2ldLm9mZnNldCA9IHRtcCAmIDB4ZmZmZmZmOwotCQl0YXJnZXRbaV0ucmF3X2RhdGEgPSBiZTMyX3RvX2NwdShzb3VyY2VbaiArIDFdKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTE2X3RvX2NwdV9uKGNvbnN0IHU4ICpfc291cmNlLCB1OCAqX3RhcmdldCwgdTMyIG4pCi17Ci0JY29uc3QgX19iZTE2ICpzb3VyY2UgPSAoY29uc3QgX19iZTE2ICopX3NvdXJjZTsKLQl1MTYgKnRhcmdldCA9ICh1MTYgKilfdGFyZ2V0OwotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8IG4vMjsgaSsrKQotCQl0YXJnZXRbaV0gPSBiZTE2X3RvX2NwdShzb3VyY2VbaV0pOwotfQotCi0jZGVmaW5lIEJOWDJYX0FMTE9DX0FORF9TRVQoYXJyLCBsYmwsIGZ1bmMpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JdTMyIGxlbiA9IGJlMzJfdG9fY3B1KGZ3X2hkci0+YXJyLmxlbik7CQkJCVwKLQlicC0+YXJyID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwkJCQlcCi0JaWYgKCFicC0+YXJyKSB7CQkJCQkJCVwKLQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yICIjYXJyIlxuIiwgbGVuKTsgXAotCQlnb3RvIGxibDsJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWZ1bmMoYnAtPmZpcm13YXJlLT5kYXRhICsgYmUzMl90b19jcHUoZndfaGRyLT5hcnIub2Zmc2V0KSwJXAotCSAgICAgKHU4ICopYnAtPmFyciwgbGVuKTsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2luaXRfZmlybXdhcmUoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IGNoYXIgKmZ3X2ZpbGVfbmFtZTsKLQlzdHJ1Y3QgYm54MnhfZndfZmlsZV9oZHIgKmZ3X2hkcjsKLQlpbnQgcmM7Ci0KLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCWZ3X2ZpbGVfbmFtZSA9IEZXX0ZJTEVfTkFNRV9FMTsKLQllbHNlIGlmIChDSElQX0lTX0UxSChicCkpCi0JCWZ3X2ZpbGVfbmFtZSA9IEZXX0ZJTEVfTkFNRV9FMUg7Ci0JZWxzZSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5zdXBwb3J0ZWQgY2hpcCByZXZpc2lvblxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9pbmZvKGRldiwgIkxvYWRpbmcgJXNcbiIsIGZ3X2ZpbGVfbmFtZSk7Ci0KLQlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmJwLT5maXJtd2FyZSwgZndfZmlsZV9uYW1lLCBkZXYpOwotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIkNhbid0IGxvYWQgZmlybXdhcmUgZmlsZSAlc1xuIiwgZndfZmlsZV9uYW1lKTsKLQkJZ290byByZXF1ZXN0X2Zpcm13YXJlX2V4aXQ7Ci0JfQotCi0JcmMgPSBibngyeF9jaGVja19maXJtd2FyZShicCk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ29ycnVwdCBmaXJtd2FyZSBmaWxlICVzXG4iLCBmd19maWxlX25hbWUpOwotCQlnb3RvIHJlcXVlc3RfZmlybXdhcmVfZXhpdDsKLQl9Ci0KLQlmd19oZHIgPSAoc3RydWN0IGJueDJ4X2Z3X2ZpbGVfaGRyICopYnAtPmZpcm13YXJlLT5kYXRhOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgdG8gdGhlIGluaXQgYXJyYXlzICovCi0JLyogQmxvYiAqLwotCUJOWDJYX0FMTE9DX0FORF9TRVQoaW5pdF9kYXRhLCByZXF1ZXN0X2Zpcm13YXJlX2V4aXQsIGJlMzJfdG9fY3B1X24pOwotCi0JLyogT3Bjb2RlcyAqLwotCUJOWDJYX0FMTE9DX0FORF9TRVQoaW5pdF9vcHMsIGluaXRfb3BzX2FsbG9jX2VyciwgYm54MnhfcHJlcF9vcHMpOwotCi0JLyogT2Zmc2V0cyAqLwotCUJOWDJYX0FMTE9DX0FORF9TRVQoaW5pdF9vcHNfb2Zmc2V0cywgaW5pdF9vZmZzZXRzX2FsbG9jX2VyciwKLQkJCSAgICBiZTE2X3RvX2NwdV9uKTsKLQotCS8qIFNUT1JNcyBmaXJtd2FyZSAqLwotCUlOSVRfVFNFTV9JTlRfVEFCTEVfREFUQShicCkgPSBicC0+ZmlybXdhcmUtPmRhdGEgKwotCQkJYmUzMl90b19jcHUoZndfaGRyLT50c2VtX2ludF90YWJsZV9kYXRhLm9mZnNldCk7Ci0JSU5JVF9UU0VNX1BSQU1fREFUQShicCkgICAgICA9IGJwLT5maXJtd2FyZS0+ZGF0YSArCi0JCQliZTMyX3RvX2NwdShmd19oZHItPnRzZW1fcHJhbV9kYXRhLm9mZnNldCk7Ci0JSU5JVF9VU0VNX0lOVF9UQUJMRV9EQVRBKGJwKSA9IGJwLT5maXJtd2FyZS0+ZGF0YSArCi0JCQliZTMyX3RvX2NwdShmd19oZHItPnVzZW1faW50X3RhYmxlX2RhdGEub2Zmc2V0KTsKLQlJTklUX1VTRU1fUFJBTV9EQVRBKGJwKSAgICAgID0gYnAtPmZpcm13YXJlLT5kYXRhICsKLQkJCWJlMzJfdG9fY3B1KGZ3X2hkci0+dXNlbV9wcmFtX2RhdGEub2Zmc2V0KTsKLQlJTklUX1hTRU1fSU5UX1RBQkxFX0RBVEEoYnApID0gYnAtPmZpcm13YXJlLT5kYXRhICsKLQkJCWJlMzJfdG9fY3B1KGZ3X2hkci0+eHNlbV9pbnRfdGFibGVfZGF0YS5vZmZzZXQpOwotCUlOSVRfWFNFTV9QUkFNX0RBVEEoYnApICAgICAgPSBicC0+ZmlybXdhcmUtPmRhdGEgKwotCQkJYmUzMl90b19jcHUoZndfaGRyLT54c2VtX3ByYW1fZGF0YS5vZmZzZXQpOwotCUlOSVRfQ1NFTV9JTlRfVEFCTEVfREFUQShicCkgPSBicC0+ZmlybXdhcmUtPmRhdGEgKwotCQkJYmUzMl90b19jcHUoZndfaGRyLT5jc2VtX2ludF90YWJsZV9kYXRhLm9mZnNldCk7Ci0JSU5JVF9DU0VNX1BSQU1fREFUQShicCkgICAgICA9IGJwLT5maXJtd2FyZS0+ZGF0YSArCi0JCQliZTMyX3RvX2NwdShmd19oZHItPmNzZW1fcHJhbV9kYXRhLm9mZnNldCk7Ci0KLQlyZXR1cm4gMDsKLQotaW5pdF9vZmZzZXRzX2FsbG9jX2VycjoKLQlrZnJlZShicC0+aW5pdF9vcHMpOwotaW5pdF9vcHNfYWxsb2NfZXJyOgotCWtmcmVlKGJwLT5pbml0X2RhdGEpOwotcmVxdWVzdF9maXJtd2FyZV9leGl0OgotCXJlbGVhc2VfZmlybXdhcmUoYnAtPmZpcm13YXJlKTsKLQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBibngyeF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgYm54MnggKmJwOwotCWludCBwY2llX3dpZHRoLCBwY2llX3NwZWVkOwotCWludCByYzsKLQotCS8qIGRldiB6ZXJvZWQgaW4gaW5pdF9ldGhlcmRldiAqLwotCWRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZigqYnApLCBNQVhfQ09OVEVYVCk7Ci0JaWYgKCFkZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIG5ldCBkZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlicCA9IG5ldGRldl9wcml2KGRldik7Ci0JYnAtPm1zZ19lbmFibGUgPSBkZWJ1ZzsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwotCi0JcmMgPSBibngyeF9pbml0X2RldihwZGV2LCBkZXYpOwotCWlmIChyYyA8IDApIHsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gYm54MnhfaW5pdF9icChicCk7Ci0JaWYgKHJjKQotCQlnb3RvIGluaXRfb25lX2V4aXQ7Ci0KLQkvKiBTZXQgaW5pdCBhcnJheXMgKi8KLQlyYyA9IGJueDJ4X2luaXRfZmlybXdhcmUoYnAsICZwZGV2LT5kZXYpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBsb2FkaW5nIGZpcm13YXJlXG4iKTsKLQkJZ290byBpbml0X29uZV9leGl0OwotCX0KLQotCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKLQkJZ290byBpbml0X29uZV9leGl0OwotCX0KLQotCWJueDJ4X2dldF9wY2llX3dpZHRoX3NwZWVkKGJwLCAmcGNpZV93aWR0aCwgJnBjaWVfc3BlZWQpOwotCW5ldGRldl9pbmZvKGRldiwgIiVzICglYyVkKSBQQ0ktRSB4JWQgJXMgZm91bmQgYXQgbWVtICVseCwiCi0JICAgICAgICIgSVJRICVkLCAiLCBib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm5hbWUsCi0JICAgICAgIChDSElQX1JFVihicCkgPj4gMTIpICsgJ0EnLCAoQ0hJUF9NRVRBTChicCkgPj4gNCksCi0JICAgICAgIHBjaWVfd2lkdGgsIChwY2llX3NwZWVkID09IDIpID8gIjVHSHogKEdlbjIpIiA6ICIyLjVHSHoiLAotCSAgICAgICBkZXYtPmJhc2VfYWRkciwgYnAtPnBkZXYtPmlycSk7Ci0JcHJfY29udCgibm9kZSBhZGRyICVwTVxuIiwgZGV2LT5kZXZfYWRkcik7Ci0KLQlyZXR1cm4gMDsKLQotaW5pdF9vbmVfZXhpdDoKLQlpZiAoYnAtPnJlZ3ZpZXcpCi0JCWlvdW5tYXAoYnAtPnJlZ3ZpZXcpOwotCi0JaWYgKGJwLT5kb29yYmVsbHMpCi0JCWlvdW5tYXAoYnAtPmRvb3JiZWxscyk7Ci0KLQlmcmVlX25ldGRldihkZXYpOwotCi0JaWYgKGF0b21pY19yZWFkKCZwZGV2LT5lbmFibGVfY250KSA9PSAxKQotCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGJueDJ4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYm54MnggKmJwOwotCi0JaWYgKCFkZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQkFEIG5ldCBkZXZpY2UgZnJvbSBibngyeF9pbml0X29uZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQotCS8qIE1ha2Ugc3VyZSBSRVNFVCB0YXNrIGlzIG5vdCBzY2hlZHVsZWQgYmVmb3JlIGNvbnRpbnVpbmcgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJwLT5yZXNldF90YXNrKTsKLQotCWtmcmVlKGJwLT5pbml0X29wc19vZmZzZXRzKTsKLQlrZnJlZShicC0+aW5pdF9vcHMpOwotCWtmcmVlKGJwLT5pbml0X2RhdGEpOwotCXJlbGVhc2VfZmlybXdhcmUoYnAtPmZpcm13YXJlKTsKLQotCWlmIChicC0+cmVndmlldykKLQkJaW91bm1hcChicC0+cmVndmlldyk7Ci0KLQlpZiAoYnAtPmRvb3JiZWxscykKLQkJaW91bm1hcChicC0+ZG9vcmJlbGxzKTsKLQotCWZyZWVfbmV0ZGV2KGRldik7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpID09IDEpCi0JCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0KLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBibngyeCAqYnA7Ci0KLQlpZiAoIWRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCQUQgbmV0IGRldmljZSBmcm9tIGJueDJ4X2luaXRfb25lXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJ0bmxfbG9jaygpOwotCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQlydG5sX3VubG9jaygpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7Ci0KLQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfQ0xPU0UpOwotCi0JYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7Ci0KLQlydG5sX3VubG9jaygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGJueDJ4ICpicDsKLQlpbnQgcmM7Ci0KLQlpZiAoIWRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCQUQgbmV0IGRldmljZSBmcm9tIGJueDJ4X2luaXRfb25lXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChicC0+cmVjb3Zlcnlfc3RhdGUgIT0gQk5YMlhfUkVDT1ZFUllfRE9ORSkgewotCQlwcmludGsoS0VSTl9FUlIgIkhhbmRsaW5nIHBhcml0eSBlcnJvciByZWNvdmVyeS4gVHJ5IGFnYWluIGxhdGVyXG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JcnRubF9sb2NrKCk7Ci0KLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQotCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXJ0bmxfdW5sb2NrKCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QwKTsKLQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7Ci0KLQlyYyA9IGJueDJ4X25pY19sb2FkKGJwLCBMT0FEX09QRU4pOwotCi0JcnRubF91bmxvY2soKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBibngyeF9lZWhfbmljX3VubG9hZChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpOwotCi0JYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfRVJST1I7Ci0KLQlicC0+cnhfbW9kZSA9IEJOWDJYX1JYX01PREVfTk9ORTsKLQotCWJueDJ4X25ldGlmX3N0b3AoYnAsIDApOwotCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOwotCi0JZGVsX3RpbWVyX3N5bmMoJmJwLT50aW1lcik7Ci0JYnAtPnN0YXRzX3N0YXRlID0gU1RBVFNfU1RBVEVfRElTQUJMRUQ7Ci0JRFAoQk5YMlhfTVNHX1NUQVRTLCAic3RhdHNfc3RhdGUgLSBESVNBQkxFRFxuIik7Ci0KLQkvKiBSZWxlYXNlIElSUXMgKi8KLQlibngyeF9mcmVlX2lycShicCwgZmFsc2UpOwotCi0JaWYgKENISVBfSVNfRTEoYnApKSB7Ci0JCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9Ci0JCQkJCQlibngyeF9zcChicCwgbWNhc3RfY29uZmlnKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5oZHIubGVuZ3RoOyBpKyspCi0JCQlDQU1fSU5WQUxJREFURShjb25maWctPmNvbmZpZ190YWJsZVtpXSk7Ci0JfQotCi0JLyogRnJlZSBTS0JzLCBTR0VzLCBUUEEgcG9vbCBhbmQgZHJpdmVyIGludGVybmFscyAqLwotCWJueDJ4X2ZyZWVfc2ticyhicCk7Ci0JZm9yX2VhY2hfcXVldWUoYnAsIGkpCi0JCWJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKGJwLCBicC0+ZnAgKyBpLCBOVU1fUlhfU0dFKTsKLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQkJbmV0aWZfbmFwaV9kZWwoJmJueDJ4X2ZwKGJwLCBpLCBuYXBpKSk7Ci0JYm54MnhfZnJlZV9tZW0oYnApOwotCi0JYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0VEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2VlaF9yZWNvdmVyKHN0cnVjdCBibngyeCAqYnApCi17Ci0JdTMyIHZhbDsKLQotCW11dGV4X2luaXQoJmJwLT5wb3J0LnBoeV9tdXRleCk7Ci0KLQlicC0+Y29tbW9uLnNobWVtX2Jhc2UgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUik7Ci0JYnAtPmxpbmtfcGFyYW1zLnNobWVtX2Jhc2UgPSBicC0+Y29tbW9uLnNobWVtX2Jhc2U7Ci0JQk5YMlhfREVWX0lORk8oInNobWVtIG9mZnNldCBpcyAweCV4XG4iLCBicC0+Y29tbW9uLnNobWVtX2Jhc2UpOwotCi0JaWYgKCFicC0+Y29tbW9uLnNobWVtX2Jhc2UgfHwKLQkgICAgKGJwLT5jb21tb24uc2htZW1fYmFzZSA8IDB4QTAwMDApIHx8Ci0JICAgIChicC0+Y29tbW9uLnNobWVtX2Jhc2UgPj0gMHhDMDAwMCkpIHsKLQkJQk5YMlhfREVWX0lORk8oIk1DUCBub3QgYWN0aXZlXG4iKTsKLQkJYnAtPmZsYWdzIHw9IE5PX01DUF9GTEFHOwotCQlyZXR1cm47Ci0JfQotCi0JdmFsID0gU0hNRU1fUkQoYnAsIHZhbGlkaXR5X21hcFtCUF9QT1JUKGJwKV0pOwotCWlmICgodmFsICYgKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKLQkJIT0gKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKLQkJQk5YMlhfRVJSKCJCQUQgTUNQIHZhbGlkaXR5IHNpZ25hdHVyZVxuIik7Ci0KLQlpZiAoIUJQX05PTUNQKGJwKSkgewotCQlicC0+Zndfc2VxID0gKFNITUVNX1JEKGJwLCBmdW5jX21iW0JQX0ZVTkMoYnApXS5kcnZfbWJfaGVhZGVyKQotCQkJICAgICAgJiBEUlZfTVNHX1NFUV9OVU1CRVJfTUFTSyk7Ci0JCUJOWDJYX0RFVl9JTkZPKCJmd19zZXEgMHglMDh4XG4iLCBicC0+Zndfc2VxKTsKLQl9Ci19Ci0KLS8qKgotICogYm54MnhfaW9fZXJyb3JfZGV0ZWN0ZWQgLSBjYWxsZWQgd2hlbiBQQ0kgZXJyb3IgaXMgZGV0ZWN0ZWQKLSAqIEBwZGV2OiBQb2ludGVyIHRvIFBDSSBkZXZpY2UKLSAqIEBzdGF0ZTogVGhlIGN1cnJlbnQgcGNpIGNvbm5lY3Rpb24gc3RhdGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIFBDSSBidXMgZXJyb3IgYWZmZWN0aW5nCi0gKiB0aGlzIGRldmljZSBoYXMgYmVlbiBkZXRlY3RlZC4KLSAqLwotc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgYm54MnhfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCQlwY2lfY2hhbm5lbF9zdGF0ZV90IHN0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlydG5sX2xvY2soKTsKLQotCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKLQotCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpIHsKLQkJcnRubF91bmxvY2soKTsKLQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7Ci0JfQotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJYm54MnhfZWVoX25pY191bmxvYWQoYnApOwotCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JcnRubF91bmxvY2soKTsKLQotCS8qIFJlcXVlc3QgYSBzbG90IHJlc2V0ICovCi0JcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7Ci19Ci0KLS8qKgotICogYm54MnhfaW9fc2xvdF9yZXNldCAtIGNhbGxlZCBhZnRlciB0aGUgUENJIGJ1cyBoYXMgYmVlbiByZXNldAotICogQHBkZXY6IFBvaW50ZXIgdG8gUENJIGRldmljZQotICoKLSAqIFJlc3RhcnQgdGhlIGNhcmQgZnJvbSBzY3JhdGNoLCBhcyBpZiBmcm9tIGEgY29sZC1ib290LgotICovCi1zdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBibngyeF9pb19zbG90X3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlydG5sX2xvY2soKTsKLQotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiQ2Fubm90IHJlLWVuYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHJlc2V0XG4iKTsKLQkJcnRubF91bmxvY2soKTsKLQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQotCQlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EMCk7Ci0KLQlydG5sX3VubG9jaygpOwotCi0JcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKLX0KLQotLyoqCi0gKiBibngyeF9pb19yZXN1bWUgLSBjYWxsZWQgd2hlbiB0cmFmZmljIGNhbiBzdGFydCBmbG93aW5nIGFnYWluCi0gKiBAcGRldjogUG9pbnRlciB0byBQQ0kgZGV2aWNlCi0gKgotICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgZXJyb3IgcmVjb3ZlcnkgZHJpdmVyIHRlbGxzIHVzIHRoYXQKLSAqIGl0cyBPSyB0byByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgYm54MnhfaW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoYnAtPnJlY292ZXJ5X3N0YXRlICE9IEJOWDJYX1JFQ09WRVJZX0RPTkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJIYW5kbGluZyBwYXJpdHkgZXJyb3IgcmVjb3ZlcnkuIFRyeSBhZ2FpbiBsYXRlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlydG5sX2xvY2soKTsKLQotCWJueDJ4X2VlaF9yZWNvdmVyKGJwKTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCWJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7Ci0KLQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7Ci0KLQlydG5sX3VubG9jaygpOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBibngyeF9lcnJfaGFuZGxlciA9IHsKLQkuZXJyb3JfZGV0ZWN0ZWQgPSBibngyeF9pb19lcnJvcl9kZXRlY3RlZCwKLQkuc2xvdF9yZXNldCAgICAgPSBibngyeF9pb19zbG90X3Jlc2V0LAotCS5yZXN1bWUgICAgICAgICA9IGJueDJ4X2lvX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBibngyeF9wY2lfZHJpdmVyID0gewotCS5uYW1lICAgICAgICA9IERSVl9NT0RVTEVfTkFNRSwKLQkuaWRfdGFibGUgICAgPSBibngyeF9wY2lfdGJsLAotCS5wcm9iZSAgICAgICA9IGJueDJ4X2luaXRfb25lLAotCS5yZW1vdmUgICAgICA9IF9fZGV2ZXhpdF9wKGJueDJ4X3JlbW92ZV9vbmUpLAotCS5zdXNwZW5kICAgICA9IGJueDJ4X3N1c3BlbmQsCi0JLnJlc3VtZSAgICAgID0gYm54MnhfcmVzdW1lLAotCS5lcnJfaGFuZGxlciA9ICZibngyeF9lcnJfaGFuZGxlciwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJueDJ4X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcHJfaW5mbygiJXMiLCB2ZXJzaW9uKTsKLQotCWJueDJ4X3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJueDJ4Iik7Ci0JaWYgKGJueDJ4X3dxID09IE5VTEwpIHsKLQkJcHJfZXJyKCJDYW5ub3QgY3JlYXRlIHdvcmtxdWV1ZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJueDJ4X3BjaV9kcml2ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJDYW5ub3QgcmVnaXN0ZXIgZHJpdmVyXG4iKTsKLQkJZGVzdHJveV93b3JrcXVldWUoYm54Mnhfd3EpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYm54MnhfY2xlYW51cCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYm54MnhfcGNpX2RyaXZlcik7Ci0KLQlkZXN0cm95X3dvcmtxdWV1ZShibngyeF93cSk7Ci19Ci0KLW1vZHVsZV9pbml0KGJueDJ4X2luaXQpOwotbW9kdWxlX2V4aXQoYm54MnhfY2xlYW51cCk7Ci0KLSNpZmRlZiBCQ01fQ05JQwotCi0vKiBjb3VudCBkZW5vdGVzIHRoZSBudW1iZXIgb2YgbmV3IGNvbXBsZXRpb25zIHdlIGhhdmUgc2VlbiAqLwotc3RhdGljIHZvaWQgYm54MnhfY25pY19zcF9wb3N0KHN0cnVjdCBibngyeCAqYnAsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgZXRoX3NwZSAqc3BlOwotCi0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQotCQlyZXR1cm47Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKLQlicC0+Y25pY19zcHFfcGVuZGluZyAtPSBjb3VudDsKLQotCWZvciAoOyBicC0+Y25pY19zcHFfcGVuZGluZyA8IGJwLT5jbmljX2V0aF9kZXYubWF4X2t3cWVfcGVuZGluZzsKLQkgICAgIGJwLT5jbmljX3NwcV9wZW5kaW5nKyspIHsKLQotCQlpZiAoIWJwLT5jbmljX2t3cV9wZW5kaW5nKQotCQkJYnJlYWs7Ci0KLQkJc3BlID0gYm54Mnhfc3BfZ2V0X25leHQoYnApOwotCQkqc3BlID0gKmJwLT5jbmljX2t3cV9jb25zOwotCi0JCWJwLT5jbmljX2t3cV9wZW5kaW5nLS07Ci0KLQkJRFAoTkVUSUZfTVNHX1RJTUVSLCAicGVuZGluZyBvbiBTUFEgJWQsIG9uIEtXUSAlZCBjb3VudCAlZFxuIiwKLQkJICAgYnAtPmNuaWNfc3BxX3BlbmRpbmcsIGJwLT5jbmljX2t3cV9wZW5kaW5nLCBjb3VudCk7Ci0KLQkJaWYgKGJwLT5jbmljX2t3cV9jb25zID09IGJwLT5jbmljX2t3cV9sYXN0KQotCQkJYnAtPmNuaWNfa3dxX2NvbnMgPSBicC0+Y25pY19rd3E7Ci0JCWVsc2UKLQkJCWJwLT5jbmljX2t3cV9jb25zKys7Ci0JfQotCWJueDJ4X3NwX3Byb2RfdXBkYXRlKGJwKTsKLQlzcGluX3VubG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKLX0KLQotc3RhdGljIGludCBibngyeF9jbmljX3NwX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGt3cWVfMTYgKmt3cWVzW10sIHUzMiBjb3VudCkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgaTsKLQotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKLQkJcmV0dXJuIC1FSU87Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19iaCgmYnAtPnNwcV9sb2NrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBldGhfc3BlICpzcGUgPSAoc3RydWN0IGV0aF9zcGUgKilrd3Flc1tpXTsKLQotCQlpZiAoYnAtPmNuaWNfa3dxX3BlbmRpbmcgPT0gTUFYX1NQX0RFU0NfQ05UKQotCQkJYnJlYWs7Ci0KLQkJKmJwLT5jbmljX2t3cV9wcm9kID0gKnNwZTsKLQotCQlicC0+Y25pY19rd3FfcGVuZGluZysrOwotCi0JCURQKE5FVElGX01TR19USU1FUiwgIkw1IFNQUUUgJXggJXggJXg6JXggcG9zICVkXG4iLAotCQkgICBzcGUtPmhkci5jb25uX2FuZF9jbWRfZGF0YSwgc3BlLT5oZHIudHlwZSwKLQkJICAgc3BlLT5kYXRhLm1hY19jb25maWdfYWRkci5oaSwKLQkJICAgc3BlLT5kYXRhLm1hY19jb25maWdfYWRkci5sbywKLQkJICAgYnAtPmNuaWNfa3dxX3BlbmRpbmcpOwotCi0JCWlmIChicC0+Y25pY19rd3FfcHJvZCA9PSBicC0+Y25pY19rd3FfbGFzdCkKLQkJCWJwLT5jbmljX2t3cV9wcm9kID0gYnAtPmNuaWNfa3dxOwotCQllbHNlCi0JCQlicC0+Y25pY19rd3FfcHJvZCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZicC0+c3BxX2xvY2spOwotCi0JaWYgKGJwLT5jbmljX3NwcV9wZW5kaW5nIDwgYnAtPmNuaWNfZXRoX2Rldi5tYXhfa3dxZV9wZW5kaW5nKQotCQlibngyeF9jbmljX3NwX3Bvc3QoYnAsIDApOwotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfY25pY19jdGxfc2VuZChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgY25pY19jdGxfaW5mbyAqY3RsKQotewotCXN0cnVjdCBjbmljX29wcyAqY19vcHM7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJmJwLT5jbmljX211dGV4KTsKLQljX29wcyA9IGJwLT5jbmljX29wczsKLQlpZiAoY19vcHMpCi0JCXJjID0gY19vcHMtPmNuaWNfY3RsKGJwLT5jbmljX2RhdGEsIGN0bCk7Ci0JbXV0ZXhfdW5sb2NrKCZicC0+Y25pY19tdXRleCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYm54MnhfY25pY19jdGxfc2VuZF9iaChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgY25pY19jdGxfaW5mbyAqY3RsKQotewotCXN0cnVjdCBjbmljX29wcyAqY19vcHM7Ci0JaW50IHJjID0gMDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQljX29wcyA9IHJjdV9kZXJlZmVyZW5jZShicC0+Y25pY19vcHMpOwotCWlmIChjX29wcykKLQkJcmMgPSBjX29wcy0+Y25pY19jdGwoYnAtPmNuaWNfZGF0YSwgY3RsKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIGZvciBjb21tYW5kcyB0aGF0IGhhdmUgbm8gZGF0YQotICovCi1zdGF0aWMgaW50IGJueDJ4X2NuaWNfbm90aWZ5KHN0cnVjdCBibngyeCAqYnAsIGludCBjbWQpCi17Ci0Jc3RydWN0IGNuaWNfY3RsX2luZm8gY3RsID0gezB9OwotCi0JY3RsLmNtZCA9IGNtZDsKLQotCXJldHVybiBibngyeF9jbmljX2N0bF9zZW5kKGJwLCAmY3RsKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfY25pY19jZmNfY29tcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY2lkKQotewotCXN0cnVjdCBjbmljX2N0bF9pbmZvIGN0bDsKLQotCS8qIGZpcnN0IHdlIHRlbGwgQ05JQyBhbmQgb25seSB0aGVuIHdlIGNvdW50IHRoaXMgYXMgYSBjb21wbGV0aW9uICovCi0JY3RsLmNtZCA9IENOSUNfQ1RMX0NPTVBMRVRJT05fQ01EOwotCWN0bC5kYXRhLmNvbXAuY2lkID0gY2lkOwotCi0JYm54MnhfY25pY19jdGxfc2VuZF9iaChicCwgJmN0bCk7Ci0JYm54MnhfY25pY19zcF9wb3N0KGJwLCAxKTsKLX0KLQotc3RhdGljIGludCBibngyeF9kcnZfY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkcnZfY3RsX2luZm8gKmN0bCkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjdGwtPmNtZCkgewotCWNhc2UgRFJWX0NUTF9DVFhUQkxfV1JfQ01EOiB7Ci0JCXUzMiBpbmRleCA9IGN0bC0+ZGF0YS5pby5vZmZzZXQ7Ci0JCWRtYV9hZGRyX3QgYWRkciA9IGN0bC0+ZGF0YS5pby5kbWFfYWRkcjsKLQotCQlibngyeF9pbHRfd3IoYnAsIGluZGV4LCBhZGRyKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBEUlZfQ1RMX0NPTVBMRVRJT05fQ01EOiB7Ci0JCWludCBjb3VudCA9IGN0bC0+ZGF0YS5jb21wLmNvbXBfY291bnQ7Ci0KLQkJYm54MnhfY25pY19zcF9wb3N0KGJwLCBjb3VudCk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHJ0bmxfbG9jayBpcyBoZWxkLiAgKi8KLQljYXNlIERSVl9DVExfU1RBUlRfTDJfQ01EOiB7Ci0JCXUzMiBjbGkgPSBjdGwtPmRhdGEucmluZy5jbGllbnRfaWQ7Ci0KLQkJYnAtPnJ4X21vZGVfY2xfbWFzayB8PSAoMSA8PCBjbGkpOwotCQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHJ0bmxfbG9jayBpcyBoZWxkLiAgKi8KLQljYXNlIERSVl9DVExfU1RPUF9MMl9DTUQ6IHsKLQkJdTMyIGNsaSA9IGN0bC0+ZGF0YS5yaW5nLmNsaWVudF9pZDsKLQotCQlicC0+cnhfbW9kZV9jbF9tYXNrICY9IH4oMSA8PCBjbGkpOwotCQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCUJOWDJYX0VSUigidW5rbm93biBjb21tYW5kICV4XG4iLCBjdGwtPmNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldHVwX2NuaWNfaXJxX2luZm8oc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgY25pY19ldGhfZGV2ICpjcCA9ICZicC0+Y25pY19ldGhfZGV2OwotCi0JaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgewotCQljcC0+ZHJ2X3N0YXRlIHw9IENOSUNfRFJWX1NUQVRFX1VTSU5HX01TSVg7Ci0JCWNwLT5pcnFfYXJyWzBdLmlycV9mbGFncyB8PSBDTklDX0lSUV9GTF9NU0lYOwotCQljcC0+aXJxX2FyclswXS52ZWN0b3IgPSBicC0+bXNpeF90YWJsZVsxXS52ZWN0b3I7Ci0JfSBlbHNlIHsKLQkJY3AtPmRydl9zdGF0ZSAmPSB+Q05JQ19EUlZfU1RBVEVfVVNJTkdfTVNJWDsKLQkJY3AtPmlycV9hcnJbMF0uaXJxX2ZsYWdzICY9IH5DTklDX0lSUV9GTF9NU0lYOwotCX0KLQljcC0+aXJxX2FyclswXS5zdGF0dXNfYmxrID0gYnAtPmNuaWNfc2I7Ci0JY3AtPmlycV9hcnJbMF0uc3RhdHVzX2Jsa19udW0gPSBDTklDX1NCX0lEKGJwKTsKLQljcC0+aXJxX2FyclsxXS5zdGF0dXNfYmxrID0gYnAtPmRlZl9zdGF0dXNfYmxrOwotCWNwLT5pcnFfYXJyWzFdLnN0YXR1c19ibGtfbnVtID0gREVGX1NCX0lEOwotCi0JY3AtPm51bV9pcnEgPSAyOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3JlZ2lzdGVyX2NuaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNuaWNfb3BzICpvcHMsCi0JCQkgICAgICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgY25pY19ldGhfZGV2ICpjcCA9ICZicC0+Y25pY19ldGhfZGV2OwotCi0JaWYgKG9wcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JYnAtPmNuaWNfa3dxID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghYnAtPmNuaWNfa3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJwLT5jbmljX2t3cV9jb25zID0gYnAtPmNuaWNfa3dxOwotCWJwLT5jbmljX2t3cV9wcm9kID0gYnAtPmNuaWNfa3dxOwotCWJwLT5jbmljX2t3cV9sYXN0ID0gYnAtPmNuaWNfa3dxICsgTUFYX1NQX0RFU0NfQ05UOwotCi0JYnAtPmNuaWNfc3BxX3BlbmRpbmcgPSAwOwotCWJwLT5jbmljX2t3cV9wZW5kaW5nID0gMDsKLQotCWJwLT5jbmljX2RhdGEgPSBkYXRhOwotCi0JY3AtPm51bV9pcnEgPSAwOwotCWNwLT5kcnZfc3RhdGUgPSBDTklDX0RSVl9TVEFURV9SRUdEOwotCi0JYm54MnhfaW5pdF9zYihicCwgYnAtPmNuaWNfc2IsIGJwLT5jbmljX3NiX21hcHBpbmcsIENOSUNfU0JfSUQoYnApKTsKLQotCWJueDJ4X3NldHVwX2NuaWNfaXJxX2luZm8oYnApOwotCWJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoYnAsIDEpOwotCWJwLT5jbmljX2ZsYWdzIHw9IEJOWDJYX0NOSUNfRkxBR19NQUNfU0VUOwotCXJjdV9hc3NpZ25fcG9pbnRlcihicC0+Y25pY19vcHMsIG9wcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBibngyeF91bnJlZ2lzdGVyX2NuaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgY25pY19ldGhfZGV2ICpjcCA9ICZicC0+Y25pY19ldGhfZGV2OwotCi0JbXV0ZXhfbG9jaygmYnAtPmNuaWNfbXV0ZXgpOwotCWlmIChicC0+Y25pY19mbGFncyAmIEJOWDJYX0NOSUNfRkxBR19NQUNfU0VUKSB7Ci0JCWJwLT5jbmljX2ZsYWdzICY9IH5CTlgyWF9DTklDX0ZMQUdfTUFDX1NFVDsKLQkJYm54Mnhfc2V0X2lzY3NpX2V0aF9tYWNfYWRkcihicCwgMCk7Ci0JfQotCWNwLT5kcnZfc3RhdGUgPSAwOwotCXJjdV9hc3NpZ25fcG9pbnRlcihicC0+Y25pY19vcHMsIE5VTEwpOwotCW11dGV4X3VubG9jaygmYnAtPmNuaWNfbXV0ZXgpOwotCXN5bmNocm9uaXplX3JjdSgpOwotCWtmcmVlKGJwLT5jbmljX2t3cSk7Ci0JYnAtPmNuaWNfa3dxID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgY25pY19ldGhfZGV2ICpibngyeF9jbmljX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGNuaWNfZXRoX2RldiAqY3AgPSAmYnAtPmNuaWNfZXRoX2RldjsKLQotCWNwLT5kcnZfb3duZXIgPSBUSElTX01PRFVMRTsKLQljcC0+Y2hpcF9pZCA9IENISVBfSUQoYnApOwotCWNwLT5wZGV2ID0gYnAtPnBkZXY7Ci0JY3AtPmlvX2Jhc2UgPSBicC0+cmVndmlldzsKLQljcC0+aW9fYmFzZTIgPSBicC0+ZG9vcmJlbGxzOwotCWNwLT5tYXhfa3dxZV9wZW5kaW5nID0gODsKLQljcC0+Y3R4X2Jsa19zaXplID0gQ05JQ19DVFhfUEVSX0lMVCAqIHNpemVvZih1bmlvbiBjZHVfY29udGV4dCk7Ci0JY3AtPmN0eF90Ymxfb2Zmc2V0ID0gRlVOQ19JTFRfQkFTRShCUF9GVU5DKGJwKSkgKyAxOwotCWNwLT5jdHhfdGJsX2xlbiA9IENOSUNfSUxUX0xJTkVTOwotCWNwLT5zdGFydGluZ19jaWQgPSBCQ01fQ05JQ19DSURfU1RBUlQ7Ci0JY3AtPmRydl9zdWJtaXRfa3dxZXNfMTYgPSBibngyeF9jbmljX3NwX3F1ZXVlOwotCWNwLT5kcnZfY3RsID0gYm54MnhfZHJ2X2N0bDsKLQljcC0+ZHJ2X3JlZ2lzdGVyX2NuaWMgPSBibngyeF9yZWdpc3Rlcl9jbmljOwotCWNwLT5kcnZfdW5yZWdpc3Rlcl9jbmljID0gYm54MnhfdW5yZWdpc3Rlcl9jbmljOwotCi0JcmV0dXJuIGNwOwotfQotRVhQT1JUX1NZTUJPTChibngyeF9jbmljX3Byb2JlKTsKLQotI2VuZGlmIC8qIEJDTV9DTklDICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwppbmRleCBkZjQ4MzA3Li5jNzQ2YjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCkBAIC0yMzMsMzQgKzIzMywyNyBAQAogCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKIH0KIAorc3RhdGljIGxvbmcgbG9uZyBjb21wdXRlX2dhcChzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXJldHVybiAoczY0KSAoc2xhdmUtPnNwZWVkIDw8IDIwKSAtIC8qIENvbnZlcnQgdG8gTWVnYWJpdCBwZXIgc2VjICovCisJICAgICAgIChzNjQpIChTTEFWRV9UTEJfSU5GTyhzbGF2ZSkubG9hZCA8PCAzKTsgLyogQnl0ZXMgdG8gYml0cyAqLworfQorCiAvKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3IgcmVhZCAqLwogc3RhdGljIHN0cnVjdCBzbGF2ZSAqdGxiX2dldF9sZWFzdF9sb2FkZWRfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7CiAJc3RydWN0IHNsYXZlICpzbGF2ZSwgKmxlYXN0X2xvYWRlZDsKLQlzNjQgbWF4X2dhcDsKLQlpbnQgaSwgZm91bmQgPSAwOworCWxvbmcgbG9uZyBtYXhfZ2FwOworCWludCBpOwogCi0JLyogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBzbGF2ZSAqLwotCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKLQkJaWYgKFNMQVZFX0lTX09LKHNsYXZlKSkgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWZvdW5kKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWxlYXN0X2xvYWRlZCA9IHNsYXZlOwotCW1heF9nYXAgPSAoczY0KShzbGF2ZS0+c3BlZWQgPDwgMjApIC0gLyogQ29udmVydCB0byBNZWdhYml0IHBlciBzZWMgKi8KLQkJCShzNjQpKFNMQVZFX1RMQl9JTkZPKHNsYXZlKS5sb2FkIDw8IDMpOyAvKiBCeXRlcyB0byBiaXRzICovCisJbGVhc3RfbG9hZGVkID0gTlVMTDsKKwltYXhfZ2FwID0gTExPTkdfTUlOOwogCiAJLyogRmluZCB0aGUgc2xhdmUgd2l0aCB0aGUgbGFyZ2VzdCBnYXAgKi8KLQlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgc2xhdmUsIGksIGxlYXN0X2xvYWRlZCkgeworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKIAkJaWYgKFNMQVZFX0lTX09LKHNsYXZlKSkgewotCQkJczY0IGdhcCA9IChzNjQpKHNsYXZlLT5zcGVlZCA8PCAyMCkgLQotCQkJCQkoczY0KShTTEFWRV9UTEJfSU5GTyhzbGF2ZSkubG9hZCA8PCAzKTsKKwkJCWxvbmcgbG9uZyBnYXAgPSBjb21wdXRlX2dhcChzbGF2ZSk7CisKIAkJCWlmIChtYXhfZ2FwIDwgZ2FwKSB7CiAJCQkJbGVhc3RfbG9hZGVkID0gc2xhdmU7CiAJCQkJbWF4X2dhcCA9IGdhcDsKQEAgLTY4OSw3ICs2ODIsNyBAQAogCQkJY2xpZW50X2luZm8tPm50dCA9IDA7CiAJCX0KIAotCQlpZiAoIWxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJaWYgKGJvbmQtPnZsZ3JwKSB7CiAJCQlpZiAoIXZsYW5fZ2V0X3RhZyhza2IsICZjbGllbnRfaW5mby0+dmxhbl9pZCkpCiAJCQkJY2xpZW50X2luZm8tPnRhZyA9IDE7CiAJCX0KQEAgLTgyMiw3ICs4MTUsNyBAQAogCiAJLyppbml0aWFsaXplIHBhY2tldCB0eXBlKi8KIAlwa190eXBlLT50eXBlID0gY3B1X3RvX2JlMTYoRVRIX1BfQVJQKTsKLQlwa190eXBlLT5kZXYgPSBOVUxMOworCXBrX3R5cGUtPmRldiA9IGJvbmQtPmRldjsKIAlwa190eXBlLT5mdW5jID0gcmxiX2FycF9yZWN2OwogCiAJLyogcmVnaXN0ZXIgdG8gcmVjZWl2ZSBBUlBzICovCkBAIC05MTEsNyArOTA0LDcgQEAKIAkJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKIAkJc2tiLT5kZXYgPSBzbGF2ZS0+ZGV2OwogCi0JCWlmICghbGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQlpZiAoYm9uZC0+dmxncnApIHsKIAkJCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOwogCiAJCQl2bGFuID0gYm9uZF9uZXh0X3ZsYW4oYm9uZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9pcHY2LmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfaXB2Ni5jCmluZGV4IDk2OWZmZWQuLjEyMWIwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9pcHY2LmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2lwdjYuYwpAQCAtMTc4LDYgKzE3OCw4IEBACiAJCX0KIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgeworCQkJaWYgKCFib25kLT52bGdycCkKKwkJCQljb250aW51ZTsKIAkJCXZsYW5fZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGJvbmQtPnZsZ3JwLAogCQkJCQkJCSB2bGFuLT52bGFuX2lkKTsKIAkJCWlmICh2bGFuX2RldiA9PSBldmVudF9kZXYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCmluZGV4IGMzZDk4ZGQuLjJjYzRjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpAQCAtOTAsNiArOTAsNyBAQAogI2RlZmluZSBCT05EX0xJTktfQVJQX0lOVEVSVgkwCiAKIHN0YXRpYyBpbnQgbWF4X2JvbmRzCT0gQk9ORF9ERUZBVUxUX01BWF9CT05EUzsKK3N0YXRpYyBpbnQgdHhfcXVldWVzCT0gQk9ORF9ERUZBVUxUX1RYX1FVRVVFUzsKIHN0YXRpYyBpbnQgbnVtX2dyYXRfYXJwID0gMTsKIHN0YXRpYyBpbnQgbnVtX3Vuc29sX25hID0gMTsKIHN0YXRpYyBpbnQgbWlpbW9uCT0gQk9ORF9MSU5LX01PTl9JTlRFUlY7CkBAIC0xMDYsMTAgKzEwNywxMyBAQAogc3RhdGljIGNoYXIgKmFycF9pcF90YXJnZXRbQk9ORF9NQVhfQVJQX1RBUkdFVFNdOwogc3RhdGljIGNoYXIgKmFycF92YWxpZGF0ZTsKIHN0YXRpYyBjaGFyICpmYWlsX292ZXJfbWFjOworc3RhdGljIGludCBhbGxfc2xhdmVzX2FjdGl2ZSA9IDA7CiBzdGF0aWMgc3RydWN0IGJvbmRfcGFyYW1zIGJvbmRpbmdfZGVmYXVsdHM7CiAKIG1vZHVsZV9wYXJhbShtYXhfYm9uZHMsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9ib25kcywgIk1heCBudW1iZXIgb2YgYm9uZGVkIGRldmljZXMiKTsKK21vZHVsZV9wYXJhbSh0eF9xdWV1ZXMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3F1ZXVlcywgIk1heCBudW1iZXIgb2YgdHJhbnNtaXQgcXVldWVzIChkZWZhdWx0ID0gMTYpIik7CiBtb2R1bGVfcGFyYW0obnVtX2dyYXRfYXJwLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhudW1fZ3JhdF9hcnAsICJOdW1iZXIgb2YgZ3JhdHVpdG91cyBBUlAgcGFja2V0cyB0byBzZW5kIG9uIGZhaWxvdmVyIGV2ZW50Iik7CiBtb2R1bGVfcGFyYW0obnVtX3Vuc29sX25hLCBpbnQsIDA2NDQpOwpAQCAtMTU1LDYgKzE1OSwxMCBAQAogTU9EVUxFX1BBUk1fREVTQyhhcnBfdmFsaWRhdGUsICJ2YWxpZGF0ZSBzcmMvZHN0IG9mIEFSUCBwcm9iZXM6IG5vbmUgKGRlZmF1bHQpLCBhY3RpdmUsIGJhY2t1cCBvciBhbGwiKTsKIG1vZHVsZV9wYXJhbShmYWlsX292ZXJfbWFjLCBjaGFycCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZhaWxfb3Zlcl9tYWMsICJGb3IgYWN0aXZlLWJhY2t1cCwgZG8gbm90IHNldCBhbGwgc2xhdmVzIHRvIHRoZSBzYW1lIE1BQy4gIG5vbmUgKGRlZmF1bHQpLCBhY3RpdmUgb3IgZm9sbG93Iik7Cittb2R1bGVfcGFyYW0oYWxsX3NsYXZlc19hY3RpdmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsbF9zbGF2ZXNfYWN0aXZlLCAiS2VlcCBhbGwgZnJhbWVzIHJlY2VpdmVkIG9uIGFuIGludGVyZmFjZSIKKwkJCQkgICAgICJieSBzZXR0aW5nIGFjdGl2ZSBmbGFnIGZvciBhbGwgc2xhdmVzLiAgIgorCQkJCSAgICAgIjAgZm9yIG5ldmVyIChkZWZhdWx0KSwgMSBmb3IgYWx3YXlzLiIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTE2OCw3ICsxNzYsOSBAQAogc3RhdGljIGludCBib25kX21vZGUJPSBCT05EX01PREVfUk9VTkRST0JJTjsKIHN0YXRpYyBpbnQgeG1pdF9oYXNodHlwZSA9IEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIyOwogc3RhdGljIGludCBsYWNwX2Zhc3Q7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyBpbnQgZGlzYWJsZV9uZXRwb2xsID0gMTsKKyNlbmRpZgogCiBjb25zdCBzdHJ1Y3QgYm9uZF9wYXJtX3RibCBib25kX2xhY3BfdGJsW10gPSB7CiB7CSJzbG93IiwJCUFEX0xBQ1BfU0xPV30sCkBAIC00MTQsNiArNDI0LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB1bmluaXRpYWxpemVkX3Zhcih2bGFuX2lkKTsKIAorCS8qIFRlc3Qgdmxhbl9saXN0IG5vdCB2bGdycCB0byBjYXRjaCBhbmQgaGFuZGxlIDgwMi4xcCB0YWdzICovCiAJaWYgKCFsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpICYmCiAJICAgICEoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkgJiYKIAkgICAgdmxhbl9nZXRfdGFnKHNrYiwgJnZsYW5faWQpID09IDApIHsKQEAgLTQ3Nyw3ICs0ODgsOSBAQAogCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CiAJaW50IGk7CiAKKwl3cml0ZV9sb2NrKCZib25kLT5sb2NrKTsKIAlib25kLT52bGdycCA9IGdycDsKKwl3cml0ZV91bmxvY2soJmJvbmQtPmxvY2spOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2ID0gc2xhdmUtPmRldjsKQEAgLTU1NywxMCArNTcwLDggQEAKIAlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnNsYXZlX29wcyA9IHNsYXZlX2Rldi0+bmV0ZGV2X29wczsKIAotCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOwotCi0JaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpCi0JCWdvdG8gb3V0OworCWlmICghYm9uZC0+dmxncnApCisJCXJldHVybjsKIAogCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgJiYKIAkgICAgc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9yZWdpc3RlcikKQEAgLTU2OCwxMyArNTc5LDEwIEBACiAKIAlpZiAoIShzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikgfHwKIAkgICAgIShzbGF2ZV9vcHMtPm5kb192bGFuX3J4X2FkZF92aWQpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpCiAJCXNsYXZlX29wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZChzbGF2ZV9kZXYsIHZsYW4tPnZsYW5faWQpOwotCi1vdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYm9uZF9kZWxfdmxhbnNfZnJvbV9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwKQEAgLTU4NCwxNiArNTkyLDE2IEBACiAJc3RydWN0IHZsYW5fZW50cnkgKnZsYW47CiAJc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2OwogCi0Jd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkKLQkJZ290byBvdXQ7CisJaWYgKCFib25kLT52bGdycCkKKwkJcmV0dXJuOwogCiAJaWYgKCEoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpIHx8CiAJICAgICEoc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZCkpCiAJCWdvdG8gdW5yZWc7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgeworCQlpZiAoIXZsYW4tPnZsYW5faWQpCisJCQljb250aW51ZTsKIAkJLyogU2F2ZSBhbmQgdGhlbiByZXN0b3JlIHZsYW5fZGV2IGluIHRoZSBncnAgYXJyYXksCiAJCSAqIHNpbmNlIHRoZSBzbGF2ZSdzIGRyaXZlciBtaWdodCBjbGVhciBpdC4KIAkJICovCkBAIC02MDYsOSArNjE0LDYgQEAKIAlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpICYmCiAJICAgIHNsYXZlX29wcy0+bmRvX3ZsYW5fcnhfcmVnaXN0ZXIpCiAJCXNsYXZlX29wcy0+bmRvX3ZsYW5fcnhfcmVnaXN0ZXIoc2xhdmVfZGV2LCBOVUxMKTsKLQotb3V0OgotCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaW5rIHN0YXR1cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE0MzMsNyArMTQzOCw3IEBACiAJLyogbm8gbmVlZCB0byBsb2NrIHNpbmNlIHdlJ3JlIHByb3RlY3RlZCBieSBydG5sX2xvY2sgKi8KIAlpZiAoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEKSB7CiAJCXByX2RlYnVnKCIlczogTkVUSUZfRl9WTEFOX0NIQUxMRU5HRURcbiIsIHNsYXZlX2Rldi0+bmFtZSk7Ci0JCWlmICghbGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQlpZiAoYm9uZC0+dmxncnApIHsKIAkJCXByX2VycigiJXM6IEVycm9yOiBjYW5ub3QgZW5zbGF2ZSBWTEFOIGNoYWxsZW5nZWQgc2xhdmUgJXMgb24gVkxBTiBlbmFibGVkIGJvbmQgJXNcbiIsCiAJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSwgYm9uZF9kZXYtPm5hbWUpOwogCQkJcmV0dXJuIC1FUEVSTTsKQEAgLTE1MjIsMTYgKzE1MjcsMzIgQEAKIAkJfQogCX0KIAorCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHNsYXZlLCB0aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBtYXN0ZXIncyBoYXJkd2FyZQorCSAqIGFkZHJlc3MgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHNsYXZlJ3MuICovCisJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAwKQorCQltZW1jcHkoYm9uZC0+ZGV2LT5kZXZfYWRkciwgc2xhdmVfZGV2LT5kZXZfYWRkciwKKwkJICAgICAgIHNsYXZlX2Rldi0+YWRkcl9sZW4pOworCisKIAluZXdfc2xhdmUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2xhdmUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19zbGF2ZSkgewogCQlyZXMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl91bmRvX2ZsYWdzOwogCX0KIAotCS8qIHNhdmUgc2xhdmUncyBvcmlnaW5hbCBmbGFncyBiZWZvcmUgY2FsbGluZwotCSAqIG5ldGRldl9zZXRfbWFzdGVyIGFuZCBkZXZfb3BlbgorCS8qCisJICogU2V0IHRoZSBuZXdfc2xhdmUncyBxdWV1ZV9pZCB0byBiZSB6ZXJvLiAgUXVldWUgSUQgbWFwcGluZworCSAqIGlzIHNldCB2aWEgc3lzZnMgb3IgbW9kdWxlIG9wdGlvbiBpZiBkZXNpcmVkLgogCSAqLwotCW5ld19zbGF2ZS0+b3JpZ2luYWxfZmxhZ3MgPSBzbGF2ZV9kZXYtPmZsYWdzOworCW5ld19zbGF2ZS0+cXVldWVfaWQgPSAwOworCisJLyogU2F2ZSBzbGF2ZSdzIG9yaWdpbmFsIG10dSBhbmQgdGhlbiBzZXQgaXQgdG8gbWF0Y2ggdGhlIGJvbmQgKi8KKwluZXdfc2xhdmUtPm9yaWdpbmFsX210dSA9IHNsYXZlX2Rldi0+bXR1OworCXJlcyA9IGRldl9zZXRfbXR1KHNsYXZlX2RldiwgYm9uZC0+ZGV2LT5tdHUpOworCWlmIChyZXMpIHsKKwkJcHJfZGVidWcoIkVycm9yICVkIGNhbGxpbmcgZGV2X3NldF9tdHVcbiIsIHJlcyk7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQogCiAJLyoKIAkgKiBTYXZlIHNsYXZlJ3Mgb3JpZ2luYWwgKCJwZXJtYW5lbnQiKSBtYWMgYWRkcmVzcyBmb3IgbW9kZXMKQEAgLTE1NTAsNyArMTU3MSw3IEBACiAJCXJlcyA9IGRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmVfZGV2LCAmYWRkcik7CiAJCWlmIChyZXMpIHsKIAkJCXByX2RlYnVnKCJFcnJvciAlZCBjYWxsaW5nIHNldF9tYWNfYWRkcmVzc1xuIiwgcmVzKTsKLQkJCWdvdG8gZXJyX2ZyZWU7CisJCQlnb3RvIGVycl9yZXN0b3JlX210dTsKIAkJfQogCX0KIApAQCAtMTc5Myw2ICsxODE0LDkgQEAKIAkJZGV2X3NldF9tYWNfYWRkcmVzcyhzbGF2ZV9kZXYsICZhZGRyKTsKIAl9CiAKK2Vycl9yZXN0b3JlX210dToKKwlkZXZfc2V0X210dShzbGF2ZV9kZXYsIG5ld19zbGF2ZS0+b3JpZ2luYWxfbXR1KTsKKwogZXJyX2ZyZWU6CiAJa2ZyZWUobmV3X3NsYXZlKTsKIApAQCAtMTkxMyw3ICsxOTM3LDcgQEAKIAkJICovCiAJCW1lbXNldChib25kX2Rldi0+ZGV2X2FkZHIsIDAsIGJvbmRfZGV2LT5hZGRyX2xlbik7CiAKLQkJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJaWYgKCFib25kLT52bGdycCkgewogCQkJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOwogCQl9IGVsc2UgewogCQkJcHJfd2FybmluZygiJXM6IFdhcm5pbmc6IGNsZWFyaW5nIEhXIGFkZHJlc3Mgb2YgJXMgd2hpbGUgaXQgc3RpbGwgaGFzIFZMQU5zLlxuIiwKQEAgLTE5ODAsNiArMjAwNCw4IEBACiAJCWRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmVfZGV2LCAmYWRkcik7CiAJfQogCisJZGV2X3NldF9tdHUoc2xhdmVfZGV2LCBzbGF2ZS0+b3JpZ2luYWxfbXR1KTsKKwogCXNsYXZlX2Rldi0+cHJpdl9mbGFncyAmPSB+KElGRl9NQVNURVJfODAyM0FEIHwgSUZGX01BU1RFUl9BTEIgfAogCQkJCSAgIElGRl9TTEFWRV9JTkFDVElWRSB8IElGRl9CT05ESU5HIHwKIAkJCQkgICBJRkZfU0xBVkVfTkVFREFSUCk7CkBAIC0yMTAzLDkgKzIxMjksOSBAQAogCSAqLwogCW1lbXNldChib25kX2Rldi0+ZGV2X2FkZHIsIDAsIGJvbmRfZGV2LT5hZGRyX2xlbik7CiAKLQlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkKKwlpZiAoIWJvbmQtPnZsZ3JwKSB7CiAJCWJvbmRfZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKLQllbHNlIHsKKwl9IGVsc2UgewogCQlwcl93YXJuaW5nKCIlczogV2FybmluZzogY2xlYXJpbmcgSFcgYWRkcmVzcyBvZiAlcyB3aGlsZSBpdCBzdGlsbCBoYXMgVkxBTnMuXG4iLAogCQkJICAgYm9uZF9kZXYtPm5hbWUsIGJvbmRfZGV2LT5uYW1lKTsKIAkJcHJfd2FybmluZygiJXM6IFdoZW4gcmUtYWRkaW5nIHNsYXZlcywgbWFrZSBzdXJlIHRoZSBib25kJ3MgSFcgYWRkcmVzcyBtYXRjaGVzIGl0cyBWTEFOcycuXG4iLApAQCAtMjUzOCw3ICsyNTY0LDcgQEAKIAkJaWYgKCF0YXJnZXRzW2ldKQogCQkJYnJlYWs7CiAJCXByX2RlYnVnKCJiYXNhOiB0YXJnZXQgJXhcbiIsIHRhcmdldHNbaV0pOwotCQlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQlpZiAoIWJvbmQtPnZsZ3JwKSB7CiAJCQlwcl9kZWJ1ZygiYmFzYTogZW1wdHkgdmxhbjogYXJwX3NlbmRcbiIpOwogCQkJYm9uZF9hcnBfc2VuZChzbGF2ZS0+ZGV2LCBBUlBPUF9SRVFVRVNULCB0YXJnZXRzW2ldLAogCQkJCSAgICAgIGJvbmQtPm1hc3Rlcl9pcCwgMCk7CkBAIC0yNTY2LDcgKzI1OTIsNyBAQAogCQkvKgogCQkgKiBUaGlzIHRhcmdldCBpcyBub3Qgb24gYSBWTEFOCiAJCSAqLwotCQlpZiAocnQtPnUuZHN0LmRldiA9PSBib25kLT5kZXYpIHsKKwkJaWYgKHJ0LT5kc3QuZGV2ID09IGJvbmQtPmRldikgewogCQkJaXBfcnRfcHV0KHJ0KTsKIAkJCXByX2RlYnVnKCJiYXNhOiBydGRldiA9PSBib25kLT5kZXY6IGFycF9zZW5kXG4iKTsKIAkJCWJvbmRfYXJwX3NlbmQoc2xhdmUtPmRldiwgQVJQT1BfUkVRVUVTVCwgdGFyZ2V0c1tpXSwKQEAgLTI1NzcsNyArMjYwMyw3IEBACiAJCXZsYW5faWQgPSAwOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgewogCQkJdmxhbl9kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoYm9uZC0+dmxncnAsIHZsYW4tPnZsYW5faWQpOwotCQkJaWYgKHZsYW5fZGV2ID09IHJ0LT51LmRzdC5kZXYpIHsKKwkJCWlmICh2bGFuX2RldiA9PSBydC0+ZHN0LmRldikgewogCQkJCXZsYW5faWQgPSB2bGFuLT52bGFuX2lkOwogCQkJCXByX2RlYnVnKCJiYXNhOiB2bGFuIG1hdGNoIG9uICVzICVkXG4iLAogCQkJCSAgICAgICB2bGFuX2Rldi0+bmFtZSwgdmxhbl9pZCk7CkBAIC0yNTk1LDcgKzI2MjEsNyBAQAogCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CiAJCQlwcl93YXJuaW5nKCIlczogbm8gcGF0aCB0byBhcnBfaXBfdGFyZ2V0ICVwSTQgdmlhIHJ0LmRldiAlc1xuIiwKIAkJCQkgICBib25kLT5kZXYtPm5hbWUsICZmbC5mbDRfZHN0LAotCQkJCSAgIHJ0LT51LmRzdC5kZXYgPyBydC0+dS5kc3QuZGV2LT5uYW1lIDogIk5VTEwiKTsKKwkJCQkgICBydC0+ZHN0LmRldiA/IHJ0LT5kc3QuZGV2LT5uYW1lIDogIk5VTEwiKTsKIAkJfQogCQlpcF9ydF9wdXQocnQpOwogCX0KQEAgLTI2MjcsNiArMjY1Myw5IEBACiAJCQkJYm9uZC0+bWFzdGVyX2lwLCAwKTsKIAl9CiAKKwlpZiAoIWJvbmQtPnZsZ3JwKQorCQlyZXR1cm47CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgewogCQl2bGFuX2RldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShib25kLT52bGdycCwgdmxhbi0+dmxhbl9pZCk7CiAJCWlmICh2bGFuLT52bGFuX2lwKSB7CkBAIC0zMjc2LDYgKzMzMDUsNyBAQAogCQllbHNlCiAJCQlzZXFfcHV0cyhzZXEsICJBZ2dyZWdhdG9yIElEOiBOL0FcbiIpOwogCX0KKwlzZXFfcHJpbnRmKHNlcSwgIlNsYXZlIHF1ZXVlIElEOiAlZFxuIiwgc2xhdmUtPnF1ZXVlX2lkKTsKIH0KIAogc3RhdGljIGludCBib25kX2luZm9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCkBAIC0zNTU4LDYgKzM1ODgsOCBAQAogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpIHsKKwkJCWlmICghYm9uZC0+dmxncnApCisJCQkJY29udGludWU7CiAJCQl2bGFuX2RldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShib25kLT52bGdycCwgdmxhbi0+dmxhbl9pZCk7CiAJCQlpZiAodmxhbl9kZXYgPT0gZXZlbnRfZGV2KSB7CiAJCQkJc3dpdGNoIChldmVudCkgewpAQCAtMzc4NSw1MCArMzgxNyw0OSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJvbmRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmJvbmRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwKKwkJCQkJCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBuZXRkZXZfcHJpdihib25kX2Rldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmJvbmRfZGV2LT5zdGF0czsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBsb2NhbF9zdGF0czsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwogCWludCBpOwogCi0JbWVtc2V0KCZsb2NhbF9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CiAKIAlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3N0YXRzID0gZGV2X2dldF9zdGF0cyhzbGF2ZS0+ZGV2KTsKKwkJY29uc3Qgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzc3RhdHMgPQorCQkJZGV2X2dldF9zdGF0cyhzbGF2ZS0+ZGV2LCAmdGVtcCk7CiAKLQkJbG9jYWxfc3RhdHMucnhfcGFja2V0cyArPSBzc3RhdHMtPnJ4X3BhY2tldHM7Ci0JCWxvY2FsX3N0YXRzLnJ4X2J5dGVzICs9IHNzdGF0cy0+cnhfYnl0ZXM7Ci0JCWxvY2FsX3N0YXRzLnJ4X2Vycm9ycyArPSBzc3RhdHMtPnJ4X2Vycm9yczsKLQkJbG9jYWxfc3RhdHMucnhfZHJvcHBlZCArPSBzc3RhdHMtPnJ4X2Ryb3BwZWQ7CisJCXN0YXRzLT5yeF9wYWNrZXRzICs9IHNzdGF0cy0+cnhfcGFja2V0czsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNzdGF0cy0+cnhfYnl0ZXM7CisJCXN0YXRzLT5yeF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9lcnJvcnM7CisJCXN0YXRzLT5yeF9kcm9wcGVkICs9IHNzdGF0cy0+cnhfZHJvcHBlZDsKIAotCQlsb2NhbF9zdGF0cy50eF9wYWNrZXRzICs9IHNzdGF0cy0+dHhfcGFja2V0czsKLQkJbG9jYWxfc3RhdHMudHhfYnl0ZXMgKz0gc3N0YXRzLT50eF9ieXRlczsKLQkJbG9jYWxfc3RhdHMudHhfZXJyb3JzICs9IHNzdGF0cy0+dHhfZXJyb3JzOwotCQlsb2NhbF9zdGF0cy50eF9kcm9wcGVkICs9IHNzdGF0cy0+dHhfZHJvcHBlZDsKKwkJc3RhdHMtPnR4X3BhY2tldHMgKz0gc3N0YXRzLT50eF9wYWNrZXRzOworCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc3N0YXRzLT50eF9ieXRlczsKKwkJc3RhdHMtPnR4X2Vycm9ycyArPSBzc3RhdHMtPnR4X2Vycm9yczsKKwkJc3RhdHMtPnR4X2Ryb3BwZWQgKz0gc3N0YXRzLT50eF9kcm9wcGVkOwogCi0JCWxvY2FsX3N0YXRzLm11bHRpY2FzdCArPSBzc3RhdHMtPm11bHRpY2FzdDsKLQkJbG9jYWxfc3RhdHMuY29sbGlzaW9ucyArPSBzc3RhdHMtPmNvbGxpc2lvbnM7CisJCXN0YXRzLT5tdWx0aWNhc3QgKz0gc3N0YXRzLT5tdWx0aWNhc3Q7CisJCXN0YXRzLT5jb2xsaXNpb25zICs9IHNzdGF0cy0+Y29sbGlzaW9uczsKIAotCQlsb2NhbF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IHNzdGF0cy0+cnhfbGVuZ3RoX2Vycm9yczsKLQkJbG9jYWxfc3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gc3N0YXRzLT5yeF9vdmVyX2Vycm9yczsKLQkJbG9jYWxfc3RhdHMucnhfY3JjX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2NyY19lcnJvcnM7Ci0JCWxvY2FsX3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2ZyYW1lX2Vycm9yczsKLQkJbG9jYWxfc3RhdHMucnhfZmlmb19lcnJvcnMgKz0gc3N0YXRzLT5yeF9maWZvX2Vycm9yczsKLQkJbG9jYWxfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBzc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IHNzdGF0cy0+cnhfbGVuZ3RoX2Vycm9yczsKKwkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IHNzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7CisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IHNzdGF0cy0+cnhfY3JjX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2ZyYW1lX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+cnhfZmlmb19lcnJvcnM7CisJCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzICs9IHNzdGF0cy0+cnhfbWlzc2VkX2Vycm9yczsKIAotCQlsb2NhbF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSBzc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOwotCQlsb2NhbF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBzc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzOwotCQlsb2NhbF9zdGF0cy50eF9maWZvX2Vycm9ycyArPSBzc3RhdHMtPnR4X2ZpZm9fZXJyb3JzOwotCQlsb2NhbF9zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzICs9IHNzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9yczsKLQkJbG9jYWxfc3RhdHMudHhfd2luZG93X2Vycm9ycyArPSBzc3RhdHMtPnR4X3dpbmRvd19lcnJvcnM7CisJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArPSBzc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgKz0gc3N0YXRzLT50eF9jYXJyaWVyX2Vycm9yczsKKwkJc3RhdHMtPnR4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJCXN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzICs9IHNzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9yczsKKwkJc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgKz0gc3N0YXRzLT50eF93aW5kb3dfZXJyb3JzOwogCX0KIAotCW1lbWNweShzdGF0cywgJmxvY2FsX3N0YXRzLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKLQogCXJlYWRfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKIAogCXJldHVybiBzdGF0czsKQEAgLTQ0MTIsOSArNDQ0Myw1OSBAQAogCX0KIH0KIAorLyoKKyAqIExvb2t1cCB0aGUgc2xhdmUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHFpZAorICovCitzdGF0aWMgaW5saW5lIGludCBib25kX3NsYXZlX292ZXJyaWRlKHN0cnVjdCBib25kaW5nICpib25kLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGksIHJlcyA9IDE7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IE5VTEw7CisJc3RydWN0IHNsYXZlICpjaGVja19zbGF2ZTsKKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisKKwlpZiAoIUJPTkRfSVNfT0soYm9uZCkgfHwgIXNrYi0+cXVldWVfbWFwcGluZykKKwkJZ290byBvdXQ7CisKKwkvKiBGaW5kIG91dCBpZiBhbnkgc2xhdmVzIGhhdmUgdGhlIHNhbWUgbWFwcGluZyBhcyB0aGlzIHNrYi4gKi8KKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIGNoZWNrX3NsYXZlLCBpKSB7CisJCWlmIChjaGVja19zbGF2ZS0+cXVldWVfaWQgPT0gc2tiLT5xdWV1ZV9tYXBwaW5nKSB7CisJCQlzbGF2ZSA9IGNoZWNrX3NsYXZlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgc2xhdmUgaXNuJ3QgVVAsIHVzZSBkZWZhdWx0IHRyYW5zbWl0IHBvbGljeS4gKi8KKwlpZiAoc2xhdmUgJiYgc2xhdmUtPnF1ZXVlX2lkICYmIElTX1VQKHNsYXZlLT5kZXYpICYmCisJICAgIChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApKSB7CisJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCBzbGF2ZS0+ZGV2KTsKKwl9CisKK291dDoKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHUxNiBib25kX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qCisJICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gZXhpc3RzIHRvIGhlbHAgZGV2X3BpY2tfdHggZ2V0IHRoZSBjb3JyZWN0CisJICogZGVzdGluYXRpb24gcXVldWUuICBVc2luZyBhIGhlbHBlciBmdW5jdGlvbiBza2lwcyB0aGUgYSBjYWxsIHRvCisJICogc2tiX3R4X2hhc2ggYW5kIHdpbGwgcHV0IHRoZSBza2JzIGluIHRoZSBxdWV1ZSB3ZSBleHBlY3Qgb24gdGhlaXIKKwkgKiB3YXkgZG93biB0byB0aGUgYm9uZGluZyBkcml2ZXIuCisJICovCisJcmV0dXJuIHNrYi0+cXVldWVfbWFwcGluZzsKK30KKwogc3RhdGljIG5ldGRldl90eF90IGJvbmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWNvbnN0IHN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoVFhfUVVFVUVfT1ZFUlJJREUoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCWlmICghYm9uZF9zbGF2ZV9vdmVycmlkZShib25kLCBza2IpKQorCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CiAKIAlzd2l0Y2ggKGJvbmQtPnBhcmFtcy5tb2RlKSB7CiAJY2FzZSBCT05EX01PREVfUk9VTkRST0JJTjoKQEAgLTQ0OTksNyArNDU4MCw4IEBACiAJLm5kb19vcGVuCQk9IGJvbmRfb3BlbiwKIAkubmRvX3N0b3AJCT0gYm9uZF9jbG9zZSwKIAkubmRvX3N0YXJ0X3htaXQJCT0gYm9uZF9zdGFydF94bWl0LAotCS5uZG9fZ2V0X3N0YXRzCQk9IGJvbmRfZ2V0X3N0YXRzLAorCS5uZG9fc2VsZWN0X3F1ZXVlCT0gYm9uZF9zZWxlY3RfcXVldWUsCisJLm5kb19nZXRfc3RhdHM2NAk9IGJvbmRfZ2V0X3N0YXRzLAogCS5uZG9fZG9faW9jdGwJCT0gYm9uZF9kb19pb2N0bCwKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IGJvbmRfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fY2hhbmdlX210dQkJPSBib25kX2NoYW5nZV9tdHUsCkBAIC00NjA0LDYgKzQ2ODYsNyBAQAogc3RhdGljIHZvaWQgYm9uZF91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQogewogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoYm9uZF9kZXYpOworCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuLCAqdG1wOwogCiAJYm9uZF9uZXRwb2xsX2NsZWFudXAoYm9uZF9kZXYpOwogCkBAIC00NjE3LDYgKzQ3MDAsMTEgQEAKIAlib25kX3JlbW92ZV9wcm9jX2VudHJ5KGJvbmQpOwogCiAJX19od19hZGRyX2ZsdXNoKCZib25kLT5tY19saXN0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCB0bXAsICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgeworCQlsaXN0X2RlbCgmdmxhbi0+dmxhbl9saXN0KTsKKwkJa2ZyZWUodmxhbik7CisJfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9kdWxlIGluaXRpYWxpemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00NzY3LDYgKzQ4NTUsMjAgQEAKIAkJfQogCX0KIAorCWlmICh0eF9xdWV1ZXMgPCAxIHx8IHR4X3F1ZXVlcyA+IDI1NSkgeworCQlwcl93YXJuaW5nKCJXYXJuaW5nOiB0eF9xdWV1ZXMgKCVkKSBzaG91bGQgYmUgYmV0d2VlbiAiCisJCQkgICAiMSBhbmQgMjU1LCByZXNldHRpbmcgdG8gJWRcbiIsCisJCQkgICB0eF9xdWV1ZXMsIEJPTkRfREVGQVVMVF9UWF9RVUVVRVMpOworCQl0eF9xdWV1ZXMgPSBCT05EX0RFRkFVTFRfVFhfUVVFVUVTOworCX0KKworCWlmICgoYWxsX3NsYXZlc19hY3RpdmUgIT0gMCkgJiYgKGFsbF9zbGF2ZXNfYWN0aXZlICE9IDEpKSB7CisJCXByX3dhcm5pbmcoIldhcm5pbmc6IGFsbF9zbGF2ZXNfYWN0aXZlIG1vZHVsZSBwYXJhbWV0ZXIgKCVkKSwgIgorCQkJICAgIm5vdCBvZiB2YWxpZCB2YWx1ZSAoMC8xKSwgc28gaXQgd2FzIHNldCB0byAiCisJCQkgICAiMFxuIiwgYWxsX3NsYXZlc19hY3RpdmUpOworCQlhbGxfc2xhdmVzX2FjdGl2ZSA9IDA7CisJfQorCiAJLyogcmVzZXQgdmFsdWVzIGZvciBUTEIvQUxCICovCiAJaWYgKChib25kX21vZGUgPT0gQk9ORF9NT0RFX1RMQikgfHwKIAkgICAgKGJvbmRfbW9kZSA9PSBCT05EX01PREVfQUxCKSkgewpAQCAtNDkzNyw2ICs1MDM5LDggQEAKIAlwYXJhbXMtPnByaW1hcnlbMF0gPSAwOwogCXBhcmFtcy0+cHJpbWFyeV9yZXNlbGVjdCA9IHByaW1hcnlfcmVzZWxlY3RfdmFsdWU7CiAJcGFyYW1zLT5mYWlsX292ZXJfbWFjID0gZmFpbF9vdmVyX21hY192YWx1ZTsKKwlwYXJhbXMtPnR4X3F1ZXVlcyA9IHR4X3F1ZXVlczsKKwlwYXJhbXMtPmFsbF9zbGF2ZXNfYWN0aXZlID0gYWxsX3NsYXZlc19hY3RpdmU7CiAKIAlpZiAocHJpbWFyeSkgewogCQlzdHJuY3B5KHBhcmFtcy0+cHJpbWFyeSwgcHJpbWFyeSwgSUZOQU1TSVopOwpAQCAtNTAyMyw4ICs1MTI3LDggQEAKIAogCXJ0bmxfbG9jaygpOwogCi0JYm9uZF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBib25kaW5nKSwgbmFtZSA/IG5hbWUgOiAiIiwKLQkJCQlib25kX3NldHVwKTsKKwlib25kX2RldiA9IGFsbG9jX25ldGRldl9tcShzaXplb2Yoc3RydWN0IGJvbmRpbmcpLCBuYW1lID8gbmFtZSA6ICIiLAorCQkJCWJvbmRfc2V0dXAsIHR4X3F1ZXVlcyk7CiAJaWYgKCFib25kX2RldikgewogCQlwcl9lcnIoIiVzOiBlZWshIGNhbid0IGFsbG9jIG5ldGRldiFcbiIsIG5hbWUpOwogCQlydG5sX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwppbmRleCBiOGJlYzA4Li5jMzExYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwpAQCAtMjExLDcgKzIxMSw4IEBACiAvKgogICogU2V0IHRoZSBzbGF2ZXMgaW4gdGhlIGN1cnJlbnQgYm9uZC4gIFRoZSBib25kIGludGVyZmFjZSBtdXN0IGJlCiAgKiB1cCBmb3IgdGhpcyB0byBzdWNjZWVkLgotICogVGhpcyBmdW5jdGlvbiBpcyBsYXJnZWx5IHRoZSBzYW1lIGZsb3cgYXMgYm9uZGluZ191cGRhdGVfYm9uZHMoKS4KKyAqIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb25seSB0aGluIHdyYXBwZXIgZm9yIGJvbmRfZW5zbGF2ZSBhbmQgYm9uZF9yZWxlYXNlLgorICogQWxsIGhhcmQgd29yayBzaG91bGQgYmUgZG9uZSB0aGVyZS4KICAqLwogc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9zbGF2ZXMoc3RydWN0IGRldmljZSAqZCwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0yMTksMTAgKzIyMCw4IEBACiB7CiAJY2hhciBjb21tYW5kW0lGTkFNU0laICsgMV0gPSB7IDAsIH07CiAJY2hhciAqaWZuYW1lOwotCWludCBpLCByZXMsIGZvdW5kLCByZXQgPSBjb3VudDsKLQl1MzIgb3JpZ2luYWxfbXR1OwotCXN0cnVjdCBzbGF2ZSAqc2xhdmU7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJaW50IHJlcywgcmV0ID0gY291bnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAkvKiBRdWljayBzYW5pdHkgY2hlY2sgLS0gaXMgdGhlIGJvbmQgaW50ZXJmYWNlIHVwPyAqLwpAQCAtMjMxLDggKzIzMCw2IEBACiAJCQkgICBib25kLT5kZXYtPm5hbWUpOwogCX0KIAotCS8qIE5vdGU6ICBXZSBjYW4ndCBob2xkIGJvbmQtPmxvY2sgaGVyZSwgYXMgYm9uZF9jcmVhdGUgZ3JhYnMgaXQuICovCi0KIAlpZiAoIXJ0bmxfdHJ5bG9jaygpKQogCQlyZXR1cm4gcmVzdGFydF9zeXNjYWxsKCk7CiAKQEAgLTI0Miw5MCArMjM5LDMyIEBACiAJICAgICFkZXZfdmFsaWRfbmFtZShpZm5hbWUpKQogCQlnb3RvIGVycl9ub19jbWQ7CiAKLQlpZiAoY29tbWFuZFswXSA9PSAnKycpIHsKKwlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShkZXZfbmV0KGJvbmQtPmRldiksIGlmbmFtZSk7CisJaWYgKCFkZXYpIHsKKwkJcHJfaW5mbygiJXM6IEludGVyZmFjZSAlcyBkb2VzIG5vdCBleGlzdCFcbiIsCisJCQlib25kLT5kZXYtPm5hbWUsIGlmbmFtZSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KIAotCQkvKiBHb3QgYSBzbGF2ZSBuYW1lIGluIGlmbmFtZS4gIElzIGl0IGFscmVhZHkgaW4gdGhlIGxpc3Q/ICovCi0JCWZvdW5kID0gMDsKLQotCQlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShkZXZfbmV0KGJvbmQtPmRldiksIGlmbmFtZSk7Ci0JCWlmICghZGV2KSB7Ci0JCQlwcl9pbmZvKCIlczogSW50ZXJmYWNlICVzIGRvZXMgbm90IGV4aXN0IVxuIiwKLQkJCQlib25kLT5kZXYtPm5hbWUsIGlmbmFtZSk7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgewotCQkJcHJfZXJyKCIlczogRXJyb3I6IFVuYWJsZSB0byBlbnNsYXZlICVzIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSB1cC5cbiIsCi0JCQkgICAgICAgYm9uZC0+ZGV2LT5uYW1lLCBkZXYtPm5hbWUpOwotCQkJcmV0ID0gLUVQRVJNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlyZWFkX2xvY2soJmJvbmQtPmxvY2spOwotCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKQotCQkJaWYgKHNsYXZlLT5kZXYgPT0gZGV2KSB7Ci0JCQkJcHJfZXJyKCIlczogSW50ZXJmYWNlICVzIGlzIGFscmVhZHkgZW5zbGF2ZWQhXG4iLAotCQkJCSAgICAgICBib25kLT5kZXYtPm5hbWUsIGlmbmFtZSk7Ci0JCQkJcmV0ID0gLUVQRVJNOwotCQkJCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOwotCi0JCXByX2luZm8oIiVzOiBBZGRpbmcgc2xhdmUgJXMuXG4iLCBib25kLT5kZXYtPm5hbWUsIGlmbmFtZSk7Ci0KLQkJLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2xhdmUsIHRoZW4gd2UgbmVlZCB0byBzZXQKLQkJICAgdGhlIG1hc3RlcidzIGhhcmR3YXJlIGFkZHJlc3MgdG8gYmUgdGhlIHNhbWUgYXMgdGhlCi0JCSAgIHNsYXZlJ3MuICovCi0JCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoYm9uZC0+ZGV2LT5kZXZfYWRkcikpCi0JCQltZW1jcHkoYm9uZC0+ZGV2LT5kZXZfYWRkciwgZGV2LT5kZXZfYWRkciwKLQkJCSAgICAgICBkZXYtPmFkZHJfbGVuKTsKLQotCQkvKiBTZXQgdGhlIHNsYXZlJ3MgTVRVIHRvIG1hdGNoIHRoZSBib25kICovCi0JCW9yaWdpbmFsX210dSA9IGRldi0+bXR1OwotCQlyZXMgPSBkZXZfc2V0X210dShkZXYsIGJvbmQtPmRldi0+bXR1KTsKLQkJaWYgKHJlcykgewotCQkJcmV0ID0gcmVzOwotCQkJZ290byBvdXQ7Ci0JCX0KLQorCXN3aXRjaCAoY29tbWFuZFswXSkgeworCWNhc2UgJysnOgorCQlwcl9pbmZvKCIlczogQWRkaW5nIHNsYXZlICVzLlxuIiwgYm9uZC0+ZGV2LT5uYW1lLCBkZXYtPm5hbWUpOwogCQlyZXMgPSBib25kX2Vuc2xhdmUoYm9uZC0+ZGV2LCBkZXYpOwotCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKQotCQkJaWYgKHN0cm5pY21wKHNsYXZlLT5kZXYtPm5hbWUsIGlmbmFtZSwgSUZOQU1TSVopID09IDApCi0JCQkJc2xhdmUtPm9yaWdpbmFsX210dSA9IG9yaWdpbmFsX210dTsKLQkJaWYgKHJlcykKLQkJCXJldCA9IHJlczsKKwkJYnJlYWs7CiAKLQkJZ290byBvdXQ7CisJY2FzZSAnLSc6CisJCXByX2luZm8oIiVzOiBSZW1vdmluZyBzbGF2ZSAlcy5cbiIsIGJvbmQtPmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKKwkJcmVzID0gYm9uZF9yZWxlYXNlKGJvbmQtPmRldiwgZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIGVycl9ub19jbWQ7CiAJfQogCi0JaWYgKGNvbW1hbmRbMF0gPT0gJy0nKSB7Ci0JCWRldiA9IE5VTEw7Ci0JCW9yaWdpbmFsX210dSA9IDA7Ci0JCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpCi0JCQlpZiAoc3RybmljbXAoc2xhdmUtPmRldi0+bmFtZSwgaWZuYW1lLCBJRk5BTVNJWikgPT0gMCkgewotCQkJCWRldiA9IHNsYXZlLT5kZXY7Ci0JCQkJb3JpZ2luYWxfbXR1ID0gc2xhdmUtPm9yaWdpbmFsX210dTsKLQkJCQlicmVhazsKLQkJCX0KLQkJaWYgKGRldikgewotCQkJcHJfaW5mbygiJXM6IFJlbW92aW5nIHNsYXZlICVzXG4iLAotCQkJCWJvbmQtPmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKLQkJCQlyZXMgPSBib25kX3JlbGVhc2UoYm9uZC0+ZGV2LCBkZXYpOwotCQkJaWYgKHJlcykgewotCQkJCXJldCA9IHJlczsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCS8qIHNldCB0aGUgc2xhdmUgTVRVIHRvIHRoZSBkZWZhdWx0ICovCi0JCQlkZXZfc2V0X210dShkZXYsIG9yaWdpbmFsX210dSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInVuYWJsZSB0byByZW1vdmUgbm9uLWV4aXN0ZW50IHNsYXZlICVzIGZvciBib25kICVzLlxuIiwKLQkJCSAgICAgICBpZm5hbWUsIGJvbmQtPmRldi0+bmFtZSk7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQl9Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocmVzKQorCQlyZXQgPSByZXM7CisJZ290byBvdXQ7CiAKIGVycl9ub19jbWQ6CiAJcHJfZXJyKCJubyBjb21tYW5kIGZvdW5kIGluIHNsYXZlcyBmaWxlIGZvciBib25kICVzLiBVc2UgK2lmbmFtZSBvciAtaWZuYW1lLlxuIiwKQEAgLTM3NCwxOSArMzEzLDI2IEBACiAJCSAgICAgICBib25kLT5kZXYtPm5hbWUsIChpbnQpc3RybGVuKGJ1ZikgLSAxLCBidWYpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKLQl9IGVsc2UgewotCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkKLQkJCWJvbmRfdW5zZXRfbWFzdGVyXzNhZF9mbGFncyhib25kKTsKLQotCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikKLQkJCWJvbmRfdW5zZXRfbWFzdGVyX2FsYl9mbGFncyhib25kKTsKLQotCQlib25kLT5wYXJhbXMubW9kZSA9IG5ld192YWx1ZTsKLQkJYm9uZF9zZXRfbW9kZV9vcHMoYm9uZCwgYm9uZC0+cGFyYW1zLm1vZGUpOwotCQlwcl9pbmZvKCIlczogc2V0dGluZyBtb2RlIHRvICVzICglZCkuXG4iLAotCQkJYm9uZC0+ZGV2LT5uYW1lLCBib25kX21vZGVfdGJsW25ld192YWx1ZV0ubW9kZW5hbWUsCi0JCSAgICAgICBuZXdfdmFsdWUpOwogCX0KKwlpZiAoKG5ld192YWx1ZSA9PSBCT05EX01PREVfQUxCIHx8CisJICAgICBuZXdfdmFsdWUgPT0gQk9ORF9NT0RFX1RMQikgJiYKKwkgICAgYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCkgeworCQlwcl9lcnIoIiVzOiAlcyBtb2RlIGlzIGluY29tcGF0aWJsZSB3aXRoIGFycCBtb25pdG9yaW5nLlxuIiwKKwkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgYm9uZF9tb2RlX3RibFtuZXdfdmFsdWVdLm1vZGVuYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKQorCQlib25kX3Vuc2V0X21hc3Rlcl8zYWRfZmxhZ3MoYm9uZCk7CisKKwlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikKKwkJYm9uZF91bnNldF9tYXN0ZXJfYWxiX2ZsYWdzKGJvbmQpOworCisJYm9uZC0+cGFyYW1zLm1vZGUgPSBuZXdfdmFsdWU7CisJYm9uZF9zZXRfbW9kZV9vcHMoYm9uZCwgYm9uZC0+cGFyYW1zLm1vZGUpOworCXByX2luZm8oIiVzOiBzZXR0aW5nIG1vZGUgdG8gJXMgKCVkKS5cbiIsCisJCWJvbmQtPmRldi0+bmFtZSwgYm9uZF9tb2RlX3RibFtuZXdfdmFsdWVdLm1vZGVuYW1lLAorCQluZXdfdmFsdWUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC01NzEsNyArNTE3LDEzIEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KLQorCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCIHx8CisJICAgIGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHsKKwkJcHJfaW5mbygiJXM6IEFSUCBtb25pdG9yaW5nIGNhbm5vdCBiZSB1c2VkIHdpdGggQUxCL1RMQi4gT25seSBNSUkgbW9uaXRvcmluZyBpcyBzdXBwb3J0ZWQgb24gJXMuXG4iLAorCQkJYm9uZC0+ZGV2LT5uYW1lLCBib25kLT5kZXYtPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAJcHJfaW5mbygiJXM6IFNldHRpbmcgQVJQIG1vbml0b3JpbmcgaW50ZXJ2YWwgdG8gJWQuXG4iLAogCQlib25kLT5kZXYtPm5hbWUsIG5ld192YWx1ZSk7CiAJYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCA9IG5ld192YWx1ZTsKQEAgLTE0NzIsNyArMTQyNCwxNzMgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihhZF9wYXJ0bmVyX21hYywgU19JUlVHTywgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfbWFjLCBOVUxMKTsKIAorLyoKKyAqIFNob3cgdGhlIHF1ZXVlX2lkcyBvZiB0aGUgc2xhdmVzIGluIHRoZSBjdXJyZW50IGJvbmQuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19xdWV1ZV9pZChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgaSwgcmVzID0gMDsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKKwlpZiAoIXJ0bmxfdHJ5bG9jaygpKQorCQlyZXR1cm4gcmVzdGFydF9zeXNjYWxsKCk7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKHJlcyA+IChQQUdFX1NJWkUgLSBJRk5BTVNJWiAtIDYpKSB7CisJCQkvKiBub3QgZW5vdWdoIHNwYWNlIGZvciBhbm90aGVyIGludGVyZmFjZV9uYW1lOnF1ZXVlX2lkIHBhaXIgKi8KKwkJCWlmICgoUEFHRV9TSVpFIC0gcmVzKSA+IDEwKQorCQkJCXJlcyA9IFBBR0VfU0laRSAtIDEwOworCQkJcmVzICs9IHNwcmludGYoYnVmICsgcmVzLCAiKyttb3JlKysgIik7CisJCQlicmVhazsKKwkJfQorCQlyZXMgKz0gc3ByaW50ZihidWYgKyByZXMsICIlczolZCAiLAorCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUsIHNsYXZlLT5xdWV1ZV9pZCk7CisJfQorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKKwlpZiAocmVzKQorCQlidWZbcmVzLTFdID0gJ1xuJzsgLyogZWF0IHRoZSBsZWZ0b3ZlciBzcGFjZSAqLworCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFNldCB0aGUgcXVldWVfaWRzIG9mIHRoZSAgc2xhdmVzIGluIHRoZSBjdXJyZW50IGJvbmQuICBUaGUgYm9uZAorICogaW50ZXJmYWNlIG11c3QgYmUgZW5zbGF2ZWQgZm9yIHRoaXMgdG8gd29yay4KKyAqLworc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9xdWV1ZV9pZChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICp1cGRhdGVfc2xhdmU7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOworCXUxNiBxaWQ7CisJaW50IGksIHJldCA9IGNvdW50OworCWNoYXIgKmRlbGltOworCXN0cnVjdCBuZXRfZGV2aWNlICpzZGV2ID0gTlVMTDsKKworCWlmICghcnRubF90cnlsb2NrKCkpCisJCXJldHVybiByZXN0YXJ0X3N5c2NhbGwoKTsKKworCS8qIGRlbGltIHdpbGwgcG9pbnQgdG8gcXVldWUgaWQgaWYgc3VjY2Vzc2Z1bCAqLworCWRlbGltID0gc3RyY2hyKGJ1ZmZlciwgJzonKTsKKwlpZiAoIWRlbGltKQorCQlnb3RvIGVycl9ub19jbWQ7CisKKwkvKgorCSAqIFRlcm1pbmF0ZSBzdHJpbmcgdGhhdCBwb2ludHMgdG8gZGV2aWNlIG5hbWUgYW5kIGJ1bXAgaXQKKwkgKiB1cCBvbmUsIHNvIHdlIGNhbiByZWFkIHRoZSBxdWV1ZSBpZCB0aGVyZS4KKwkgKi8KKwkqZGVsaW0gPSAnXDAnOworCWlmIChzc2NhbmYoKytkZWxpbSwgIiVoZFxuIiwgJnFpZCkgIT0gMSkKKwkJZ290byBlcnJfbm9fY21kOworCisJLyogQ2hlY2sgYnVmZmVyIGxlbmd0aCwgdmFsaWQgaWZuYW1lIGFuZCBxdWV1ZSBpZCAqLworCWlmIChzdHJsZW4oYnVmZmVyKSA+IElGTkFNU0laIHx8CisJICAgICFkZXZfdmFsaWRfbmFtZShidWZmZXIpIHx8CisJICAgIHFpZCA+IGJvbmQtPnBhcmFtcy50eF9xdWV1ZXMpCisJCWdvdG8gZXJyX25vX2NtZDsKKworCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGF0IGludGVyZmFjZSBpZiBpdCBleGlzdHMgKi8KKwlzZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoZGV2X25ldChib25kLT5kZXYpLCBidWZmZXIpOworCWlmICghc2RldikKKwkJZ290byBlcnJfbm9fY21kOworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCS8qIFNlYXJjaCBmb3IgdGhlcyBzbGF2ZSBhbmQgY2hlY2sgZm9yIGR1cGxpY2F0ZSBxaWRzICovCisJdXBkYXRlX3NsYXZlID0gTlVMTDsKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmIChzZGV2ID09IHNsYXZlLT5kZXYpCisJCQkvKgorCQkJICogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbWF0Y2hpbmcKKwkJCSAqIHNsYXZlIGZvciBkdXBzLCBzaW5jZSB3ZSdyZSBvdmVyd3JpdGluZyBpdAorCQkJICovCisJCQl1cGRhdGVfc2xhdmUgPSBzbGF2ZTsKKwkJZWxzZSBpZiAocWlkICYmIHFpZCA9PSBzbGF2ZS0+cXVldWVfaWQpIHsKKwkJCWdvdG8gZXJyX25vX2NtZF91bmxvY2s7CisJCX0KKwl9CisKKwlpZiAoIXVwZGF0ZV9zbGF2ZSkKKwkJZ290byBlcnJfbm9fY21kX3VubG9jazsKKworCS8qIEFjdHVhbGx5IHNldCB0aGUgcWlkcyBmb3IgdGhlIHNsYXZlICovCisJdXBkYXRlX3NsYXZlLT5xdWV1ZV9pZCA9IHFpZDsKKworCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK291dDoKKwlydG5sX3VubG9jaygpOworCXJldHVybiByZXQ7CisKK2Vycl9ub19jbWRfdW5sb2NrOgorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK2Vycl9ub19jbWQ6CisJcHJfaW5mbygiaW52YWxpZCBpbnB1dCBmb3IgcXVldWVfaWQgc2V0IGZvciAlcy5cbiIsCisJCWJvbmQtPmRldi0+bmFtZSk7CisJcmV0ID0gLUVQRVJNOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocXVldWVfaWQsIFNfSVJVR08gfCBTX0lXVVNSLCBib25kaW5nX3Nob3dfcXVldWVfaWQsCisJCSAgIGJvbmRpbmdfc3RvcmVfcXVldWVfaWQpOworCisKKy8qCisgKiBTaG93IGFuZCBzZXQgdGhlIGFsbF9zbGF2ZXNfYWN0aXZlIGZsYWcuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19zbGF2ZXNfYWN0aXZlKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBib25kLT5wYXJhbXMuYWxsX3NsYXZlc19hY3RpdmUpOworfQorCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX3NsYXZlc19hY3RpdmUoc3RydWN0IGRldmljZSAqZCwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpLCBuZXdfdmFsdWUsIHJldCA9IGNvdW50OworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpIHsKKwkJcHJfZXJyKCIlczogbm8gYWxsX3NsYXZlc19hY3RpdmUgdmFsdWUgc3BlY2lmaWVkLlxuIiwKKwkJICAgICAgIGJvbmQtPmRldi0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChuZXdfdmFsdWUgPT0gYm9uZC0+cGFyYW1zLmFsbF9zbGF2ZXNfYWN0aXZlKQorCQlnb3RvIG91dDsKKworCWlmICgobmV3X3ZhbHVlID09IDApIHx8IChuZXdfdmFsdWUgPT0gMSkpIHsKKwkJYm9uZC0+cGFyYW1zLmFsbF9zbGF2ZXNfYWN0aXZlID0gbmV3X3ZhbHVlOworCX0gZWxzZSB7CisJCXByX2luZm8oIiVzOiBJZ25vcmluZyBpbnZhbGlkIGFsbF9zbGF2ZXNfYWN0aXZlIHZhbHVlICVkLlxuIiwKKwkJCWJvbmQtPmRldi0+bmFtZSwgbmV3X3ZhbHVlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoc2xhdmUtPnN0YXRlID09IEJPTkRfU1RBVEVfQkFDS1VQKSB7CisJCQlpZiAobmV3X3ZhbHVlKQorCQkJCXNsYXZlLT5kZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9TTEFWRV9JTkFDVElWRTsKKwkJCWVsc2UKKwkJCQlzbGF2ZS0+ZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9TTEFWRV9JTkFDVElWRTsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxsX3NsYXZlc19hY3RpdmUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBib25kaW5nX3Nob3dfc2xhdmVzX2FjdGl2ZSwgYm9uZGluZ19zdG9yZV9zbGF2ZXNfYWN0aXZlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBlcl9ib25kX2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3NsYXZlcy5hdHRyLApAQCAtMTQ5OSw2ICsxNjE3LDggQEAKIAkmZGV2X2F0dHJfYWRfYWN0b3Jfa2V5LmF0dHIsCiAJJmRldl9hdHRyX2FkX3BhcnRuZXJfa2V5LmF0dHIsCiAJJmRldl9hdHRyX2FkX3BhcnRuZXJfbWFjLmF0dHIsCisJJmRldl9hdHRyX3F1ZXVlX2lkLmF0dHIsCisJJmRldl9hdHRyX2FsbF9zbGF2ZXNfYWN0aXZlLmF0dHIsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKaW5kZXggMmFhMzM2Ny4uYzZmZGQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlICJib25kXzNhZC5oIgogI2luY2x1ZGUgImJvbmRfYWxiLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjMuNi4wIgotI2RlZmluZSBEUlZfUkVMREFURQkiU2VwdGVtYmVyIDI2LCAyMDA5IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMy43LjAiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJKdW5lIDIsIDIwMTAiCiAjZGVmaW5lIERSVl9OQU1FCSJib25kaW5nIgogI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkV0aGVybmV0IENoYW5uZWwgQm9uZGluZyBEcml2ZXIiCiAKQEAgLTYwLDYgKzYwLDkgQEAKIAkJICgobW9kZSkgPT0gQk9ORF9NT0RFX1RMQikgICAgICAgICAgfHwJXAogCQkgKChtb2RlKSA9PSBCT05EX01PREVfQUxCKSkKIAorI2RlZmluZSBUWF9RVUVVRV9PVkVSUklERShtb2RlKQkJCQlcCisJCQkoKChtb2RlKSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB8fAlcCisJCQkgKChtb2RlKSA9PSBCT05EX01PREVfUk9VTkRST0JJTikpCiAvKgogICogTGVzcyBiYWQgd2F5IHRvIGNhbGwgaW9jdGwgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbDsgdGhpcyBuZWVkcyB0byBiZQogICogZG9uZSBzb21lIG90aGVyIHdheSB0byBnZXQgdGhlIGNhbGwgb3V0IG9mIGludGVycnVwdCBjb250ZXh0LgpAQCAtMTMxLDYgKzEzNCw4IEBACiAJY2hhciBwcmltYXJ5W0lGTkFNU0laXTsKIAlpbnQgcHJpbWFyeV9yZXNlbGVjdDsKIAlfX2JlMzIgYXJwX3RhcmdldHNbQk9ORF9NQVhfQVJQX1RBUkdFVFNdOworCWludCB0eF9xdWV1ZXM7CisJaW50IGFsbF9zbGF2ZXNfYWN0aXZlOwogfTsKIAogc3RydWN0IGJvbmRfcGFybV90YmwgewpAQCAtMTU5LDEyICsxNjQsMTIgQEAKIAlzOCAgICAgbGluazsgICAgLyogb25lIG9mIEJPTkRfTElOS19YWFhYICovCiAJczggICAgIG5ld19saW5rOwogCXM4ICAgICBzdGF0ZTsgICAvKiBvbmUgb2YgQk9ORF9TVEFURV9YWFhYICovCi0JdTMyICAgIG9yaWdpbmFsX2ZsYWdzOwogCXUzMiAgICBvcmlnaW5hbF9tdHU7CiAJdTMyICAgIGxpbmtfZmFpbHVyZV9jb3VudDsKIAl1OCAgICAgcGVybV9od2FkZHJbRVRIX0FMRU5dOwogCXUxNiAgICBzcGVlZDsKIAl1OCAgICAgZHVwbGV4OworCXUxNiAgICBxdWV1ZV9pZDsKIAlzdHJ1Y3QgYWRfc2xhdmVfaW5mbyBhZF9pbmZvOyAvKiBIVUdFIC0gYmV0dGVyIHRvIGR5bmFtaWNhbGx5IGFsbG9jICovCiAJc3RydWN0IHRsYl9zbGF2ZV9pbmZvIHRsYl9pbmZvOwogfTsKQEAgLTI5MSw3ICsyOTYsOCBAQAogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoc2xhdmUtPmRldi0+bWFzdGVyKTsKIAlpZiAoIWJvbmRfaXNfbGIoYm9uZCkpCiAJCXNsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQkFDS1VQOwotCXNsYXZlLT5kZXYtPnByaXZfZmxhZ3MgfD0gSUZGX1NMQVZFX0lOQUNUSVZFOworCWlmICghYm9uZC0+cGFyYW1zLmFsbF9zbGF2ZXNfYWN0aXZlKQorCQlzbGF2ZS0+ZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9TTEFWRV9JTkFDVElWRTsKIAlpZiAoc2xhdmVfZG9fYXJwX3ZhbGlkYXRlKGJvbmQsIHNsYXZlKSkKIAkJc2xhdmUtPmRldi0+cHJpdl9mbGFncyB8PSBJRkZfU0xBVkVfTkVFREFSUDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2NhaWYvS2NvbmZpZwppbmRleCAwYjI4ZTAxLi42MzFhNjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYWlmL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9LY29uZmlnCkBAIC0yLDE2ICsyLDMyIEBACiAjIENBSUYgcGh5c2ljYWwgZHJpdmVycwogIwogCi1pZiBDQUlGCi0KIGNvbW1lbnQgIkNBSUYgdHJhbnNwb3J0IGRyaXZlcnMiCiAKIGNvbmZpZyBDQUlGX1RUWQogCXRyaXN0YXRlICJDQUlGIFRUWSB0cmFuc3BvcnQgZHJpdmVyIgorCWRlcGVuZHMgb24gQ0FJRgogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAlUaGUgQ0FJRiBUVFkgdHJhbnNwb3J0IGRyaXZlciBpcyBhIExpbmUgRGlzY2lwbGluZSAobGRpc2MpCiAJaWRlbnRpZmllZCBhcyBOX0NBSUYuIFdoZW4gdGhpcyBsZGlzYyBpcyBvcGVuZWQgZnJvbSB1c2VyIHNwYWNlCiAJaXQgd2lsbCByZWRpcmVjdCB0aGUgVFRZJ3MgdHJhZmZpYyBpbnRvIHRoZSBDQUlGIHN0YWNrLgogCi1lbmRpZiAjIENBSUYKK2NvbmZpZyBDQUlGX1NQSV9TTEFWRQorCXRyaXN0YXRlICJDQUlGIFNQSSB0cmFuc3BvcnQgZHJpdmVyIGZvciBzbGF2ZSBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBDQUlGCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCVRoZSBDQUlGIExpbmsgbGF5ZXIgU1BJIFByb3RvY29sIGRyaXZlciBmb3IgU2xhdmUgU1BJIGludGVyZmFjZS4KKwlUaGlzIGRyaXZlciBpbXBsZW1lbnRzIGEgcGxhdGZvcm0gZHJpdmVyIHRvIGFjY29tbW9kYXRlIGZvciBhCisJcGxhdGZvcm0gc3BlY2lmaWMgU1BJIGRldmljZS4gQSBzYW1wbGUgQ0FJRiBTUEkgUGxhdGZvcm0gZGV2aWNlIGlzCisJcHJvdmlkZWQgaW4gRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NhaWYvc3BpX3BvcnRpbmcudHh0CisKK2NvbmZpZyBDQUlGX1NQSV9TWU5DCisJYm9vbCAiTmV4dCBjb21tYW5kIGFuZCBsZW5ndGggaW4gc3RhcnQgb2YgZnJhbWUiCisJZGVwZW5kcyBvbiBDQUlGX1NQSV9TTEFWRQorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlQdXR0aW5nIHRoZSBuZXh0IGNvbW1hbmQgYW5kIGxlbmd0aCBpbiB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lIGNhbgorCWhlbHAgdG8gc3luY2hyb25pemUgdG8gdGhlIG5leHQgdHJhbnNmZXIgaW4gY2FzZSBvZiBvdmVyIG9yIHVuZGVyLXJ1bnMuCisJVGhpcyBvcHRpb24gYWxzbyBuZWVkcyB0byBiZSBlbmFibGVkIG9uIHRoZSBtb2RlbS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYWlmL01ha2VmaWxlCmluZGV4IDUyYjZkMWYuLjNhMTFkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9NYWtlZmlsZQpAQCAtMSwxMiArMSwxMCBAQAotaWZlcSAoJChDT05GSUdfQ0FJRl9ERUJVRyksMSkKLUNBSUZfREJHX0ZMQUdTIDo9IC1EREVCVUcKK2lmZXEgKCQoQ09ORklHX0NBSUZfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRwogZW5kaWYKIAotS0JVSUxEX0VYVFJBX1NZTUJPTFM9bmV0L2NhaWYvTW9kdWxlLnN5bXZlcnMKLQotY2NmbGFncy15IDo9ICQoQ0FJRl9GTEFHUykgJChDQUlGX0RCR19GTEFHUykKLWNsZWFuLWRpcnM6PSAudG1wX3ZlcnNpb25zCi1jbGVhbi1maWxlczo9IE1vZHVsZS5zeW12ZXJzIG1vZHVsZXMub3JkZXIgKi5jbWQgKn4gXAotCiAjIFNlcmlhbCBpbnRlcmZhY2UKIG9iai0kKENPTkZJR19DQUlGX1RUWSkgKz0gY2FpZl9zZXJpYWwubworCisjIFNQSSBzbGF2ZSBwaHlzaWNhbCBpbnRlcmZhY2VzIG1vZHVsZQorY2ZzcGlfc2xhdmUtb2JqcyA6PSBjYWlmX3NwaS5vIGNhaWZfc3BpX3NsYXZlLm8KK29iai0kKENPTkZJR19DQUlGX1NQSV9TTEFWRSkgKz0gY2ZzcGlfc2xhdmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jCmluZGV4IDA5MjU3Y2EuLjNkZjBjMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMKQEAgLTE3NCw2ICsxNzQsNyBAQAogCXN0cnVjdCBzZXJfZGV2aWNlICpzZXI7CiAJaW50IHJldDsKIAl1OCAqcDsKKwogCXNlciA9IHR0eS0+ZGlzY19kYXRhOwogCiAJLyoKQEAgLTIyMSw2ICsyMjIsNyBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgdHR5X3dyLCBsZW4sIHJvb207CisKIAl0dHkgPSBzZXItPnR0eTsKIAlzZXItPnR4X3N0YXJ0ZWQgPSB0cnVlOwogCkBAIC0yODEsNiArMjgzLDcgQEAKIHN0YXRpYyBpbnQgY2FpZl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNlcl9kZXZpY2UgKnNlcjsKKwogCUJVR19PTihkZXYgPT0gTlVMTCk7CiAJc2VyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMjk5LDYgKzMwMiw3IEBACiBzdGF0aWMgdm9pZCBsZGlzY190eF93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3Qgc2VyX2RldmljZSAqc2VyOworCiAJc2VyID0gdHR5LT5kaXNjX2RhdGE7CiAJQlVHX09OKHNlciA9PSBOVUxMKTsKIAlCVUdfT04oc2VyLT50dHkgIT0gdHR5KTsKQEAgLTM0OCw2ICszNTIsNyBAQAogCXN0cnVjdCBzZXJfZGV2aWNlICpzZXIgPSB0dHktPmRpc2NfZGF0YTsKIAkvKiBSZW1vdmUgbWF5IGJlIGNhbGxlZCBpbnNpZGUgb3Igb3V0c2lkZSBvZiBydG5sX2xvY2sgKi8KIAlpbnQgaXNsb2NrZWQgPSBydG5sX2lzX2xvY2tlZCgpOworCiAJaWYgKCFpc2xvY2tlZCkKIAkJcnRubF9sb2NrKCk7CiAJLyogZGV2aWNlIGlzIGZyZWVkIGF1dG9tYWdpY2FsbHkgYnkgbmV0LXN5c2ZzICovCkBAIC0zNzQsNiArMzc5LDcgQEAKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfbGRpc2Modm9pZCkKIHsKIAlpbnQgcmVzdWx0OworCiAJcmVzdWx0ID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fQ0FJRiwgJmNhaWZfbGRpc2MpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCXByX2VycigiY2Fubm90IHJlZ2lzdGVyIENBSUYgbGRpc2M9JWQgZXJyPSVkXG4iLCBOX0NBSUYsCkBAIC0zOTEsMTIgKzM5NywxMiBAQAogc3RhdGljIHZvaWQgY2FpZmRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzZXJfZGV2aWNlICpzZXJkZXYgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJZGV2LT5mZWF0dXJlcyA9IDA7CiAJZGV2LT5uZXRkZXZfb3BzID0gJm5ldGRldl9vcHM7CiAJZGV2LT50eXBlID0gQVJQSFJEX0NBSUY7CiAJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKIAlkZXYtPm10dSA9IENBSUZfTUFYX01UVTsKLQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IENBSUZfTkVFREVEX0hFQURST09NOwogCWRldi0+dHhfcXVldWVfbGVuID0gMDsKIAlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzZXJkZXYtPmhlYWQpOwpAQCAtNDEwLDggKzQxNiw2IEBACiAKIHN0YXRpYyBpbnQgY2FpZl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzZXJfZGV2aWNlICpzZXI7Ci0Jc2VyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC00MjUsNiArNDI5LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNhaWZfc2VyX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OworCiAJcmV0ID0gcmVnaXN0ZXJfbGRpc2MoKTsKIAlkZWJ1Z2ZzZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJjYWlmX3NlcmlhbCIsIE5VTEwpOwogCXJldHVybiByZXQ7CkBAIC00MzUsNiArNDQwLDcgQEAKIAlzdHJ1Y3Qgc2VyX2RldmljZSAqc2VyID0gTlVMTDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgKl90bXA7CisKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgX3RtcCwgJnNlcl9saXN0KSB7CiAJCXNlciA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHNlcl9kZXZpY2UsIG5vZGUpOwogCQlkZXZfY2xvc2Uoc2VyLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NwaS5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDU4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIEFCIDIwMTAKKyAqIENvbnRhY3Q6IFNqdXIgQnJlbmRlbGFuZCAvIHNqdXIuYnJhbmRlbGFuZEBzdGVyaWNzc29uLmNvbQorICogQXV0aG9yOiAgRGFuaWVsIE1hcnRlbnNzb24gLyBEYW5pZWwuTWFydGVuc3NvbkBzdGVyaWNzc29uLmNvbQorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfbGF5ZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX3NwaS5oPgorCisjaWZuZGVmIENPTkZJR19DQUlGX1NQSV9TWU5DCisjZGVmaW5lIEZMQVZPUiAiRmxhdm91cjogVmFuaWxsYS5cbiIKKyNlbHNlCisjZGVmaW5lIEZMQVZPUiAiRmxhdm91cjogTWFzdGVyIENNRCZMRU4gYXQgc3RhcnQuXG4iCisjZW5kaWYgLyogQ09ORklHX0NBSUZfU1BJX1NZTkMgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGFuaWVsIE1hcnRlbnNzb248ZGFuaWVsLm1hcnRlbnNzb25Ac3Rlcmljc3Nvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNBSUYgU1BJIGRyaXZlciIpOworCitzdGF0aWMgaW50IHNwaV9sb29wOworbW9kdWxlX3BhcmFtKHNwaV9sb29wLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BpX2xvb3AsICJTUEkgcnVubmluZyBpbiBsb29wYmFjayBtb2RlLiIpOworCisvKiBTUEkgZnJhbWUgYWxpZ25tZW50LiAqLworbW9kdWxlX3BhcmFtKHNwaV9mcm1fYWxpZ24sIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHNwaV9mcm1fYWxpZ24sICJTUEkgZnJhbWUgYWxpZ25tZW50LiIpOworCisvKiBTUEkgcGFkZGluZyBvcHRpb25zLiAqLworbW9kdWxlX3BhcmFtKHNwaV91cF9oZWFkX2FsaWduLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzcGlfdXBfaGVhZF9hbGlnbiwgIlNQSSB1cGxpbmsgaGVhZCBhbGlnbm1lbnQuIik7CisKK21vZHVsZV9wYXJhbShzcGlfdXBfdGFpbF9hbGlnbiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BpX3VwX3RhaWxfYWxpZ24sICJTUEkgdXBsaW5rIHRhaWwgYWxpZ25tZW50LiIpOworCittb2R1bGVfcGFyYW0oc3BpX2Rvd25faGVhZF9hbGlnbiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BpX2Rvd25faGVhZF9hbGlnbiwgIlNQSSBkb3dubGluayBoZWFkIGFsaWdubWVudC4iKTsKKworbW9kdWxlX3BhcmFtKHNwaV9kb3duX3RhaWxfYWxpZ24sIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHNwaV9kb3duX3RhaWxfYWxpZ24sICJTUEkgZG93bmxpbmsgdGFpbCBhbGlnbm1lbnQuIik7CisKKyNpZmRlZiBDT05GSUdfQVJNCisjZGVmaW5lIEJZVEVfSEVYX0ZNVCAiJTAyWCIKKyNlbHNlCisjZGVmaW5lIEJZVEVfSEVYX0ZNVCAiJTAyaGhYIgorI2VuZGlmCisKKyNkZWZpbmUgU1BJX01BWF9QQVlMT0FEX1NJWkUgNDA5NgorLyoKKyAqIFRocmVzaG9sZCB2YWx1ZXMgZm9yIHRoZSBTUEkgcGFja2V0IHF1ZXVlLiBGbG93Y29udHJvbCB3aWxsIGJlIGFzc2VydGVkCisgKiB3aGVuIHRoZSBudW1iZXIgb2YgcGFja2V0cyBleGNlZWRzIEhJR0hfV0FURVJfTUFSSy4gSXQgd2lsbCBub3QgYmUKKyAqIGRlYXNzZXJ0ZWQgYmVmb3JlIHRoZSBudW1iZXIgb2YgcGFja2V0cyBkcm9wcyBiZWxvdyBMT1dfV0FURVJfTUFSSy4KKyAqLworI2RlZmluZSBMT1dfV0FURVJfTUFSSyAgIDEwMAorI2RlZmluZSBISUdIX1dBVEVSX01BUksgIChMT1dfV0FURVJfTUFSSyo1KQorCisjaWZkZWYgQ09ORklHX1VNTAorCisvKgorICogV2Ugc29tZXRpbWVzIHVzZSBVTUwgZm9yIGRlYnVnZ2luZywgYnV0IGl0IGNhbm5vdCBoYW5kbGUKKyAqIGRtYV9hbGxvY19jb2hlcmVudCBzbyB3ZSBoYXZlIHRvIHdyYXAgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZG1hX2FsbG9jKGRtYV9hZGRyX3QgKmRhZGRyKQoreworCXJldHVybiBrbWFsbG9jKFNQSV9ETUFfQlVGX0xFTiwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZnJlZSh2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUpCit7CisJa2ZyZWUoY3B1X2FkZHIpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV9hbGxvYyhkbWFfYWRkcl90ICpkYWRkcikKK3sKKwlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIFNQSV9ETUFfQlVGX0xFTiwgZGFkZHIsCisJCQkJR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZnJlZSh2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUpCit7CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgU1BJX0RNQV9CVUZfTEVOLCBjcHVfYWRkciwgaGFuZGxlKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfVU1MICovCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworI2RlZmluZSBERUJVR0ZTX0JVRl9TSVpFCTQwOTYKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRiZ2ZzX3Jvb3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcml2ZXJfZGVidWdmc19jcmVhdGUodm9pZCkKK3sKKwlkYmdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKGNmc3BpX3NwaV9kcml2ZXIuZHJpdmVyLm5hbWUsIE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJpdmVyX2RlYnVnZnNfcmVtb3ZlKHZvaWQpCit7CisJZGVidWdmc19yZW1vdmUoZGJnZnNfcm9vdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZfZGVidWdmc19yZW0oc3RydWN0IGNmc3BpICpjZnNwaSkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShjZnNwaS0+ZGJnZnNfZnJhbWUpOworCWRlYnVnZnNfcmVtb3ZlKGNmc3BpLT5kYmdmc19zdGF0ZSk7CisJZGVidWdmc19yZW1vdmUoY2ZzcGktPmRiZ2ZzX2Rpcik7Cit9CisKK3N0YXRpYyBpbnQgZGJnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkYmdmc19zdGF0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqYnVmOworCWludCBsZW4gPSAwOworCXNzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3QgY2ZzcGkgKmNmc3BpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJYnVmID0ga3phbGxvYyhERUJVR0ZTX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwkvKiBQcmludCBvdXQgZGVidWcgaW5mb3JtYXRpb24uICovCisJbGVuICs9IHNucHJpbnRmKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksCisJCQkiQ0FJRiBTUEkgZGVidWcgaW5mb3JtYXRpb246XG4iKTsKKworCWxlbiArPSBzbnByaW50ZigoYnVmICsgbGVuKSwgKERFQlVHRlNfQlVGX1NJWkUgLSBsZW4pLCBGTEFWT1IpOworCisJbGVuICs9IHNucHJpbnRmKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksCisJCQkiU1RBVEU6ICVkXG4iLCBjZnNwaS0+ZGJnX3N0YXRlKTsKKwlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSJQcmV2aW91cyBDTUQ6IDB4JXhcbiIsIGNmc3BpLT5wY21kKTsKKwlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSJDdXJyZW50IENNRDogMHgleFxuIiwgY2ZzcGktPmNtZCk7CisJbGVuICs9IHNucHJpbnRmKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksCisJCQkiUHJldmlvdXMgVFggbGVuOiAlZFxuIiwgY2ZzcGktPnR4X3BwY2tfbGVuKTsKKwlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSJQcmV2aW91cyBSWCBsZW46ICVkXG4iLCBjZnNwaS0+cnhfcHBja19sZW4pOworCWxlbiArPSBzbnByaW50ZigoYnVmICsgbGVuKSwgKERFQlVHRlNfQlVGX1NJWkUgLSBsZW4pLAorCQkJIkN1cnJlbnQgVFggbGVuOiAlZFxuIiwgY2ZzcGktPnR4X2NwY2tfbGVuKTsKKwlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSJDdXJyZW50IFJYIGxlbjogJWRcbiIsIGNmc3BpLT5yeF9jcGNrX2xlbik7CisJbGVuICs9IHNucHJpbnRmKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksCisJCQkiTmV4dCBUWCBsZW46ICVkXG4iLCBjZnNwaS0+dHhfbnBja19sZW4pOworCWxlbiArPSBzbnByaW50ZigoYnVmICsgbGVuKSwgKERFQlVHRlNfQlVGX1NJWkUgLSBsZW4pLAorCQkJIk5leHQgUlggbGVuOiAlZFxuIiwgY2ZzcGktPnJ4X25wY2tfbGVuKTsKKworCWlmIChsZW4gPiBERUJVR0ZTX0JVRl9TSVpFKQorCQlsZW4gPSBERUJVR0ZTX0JVRl9TSVpFOworCisJc2l6ZSA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgcHJpbnRfZnJhbWUoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY2hhciAqZnJtLAorCQkJICAgc2l6ZV90IGNvdW50LCBzaXplX3QgY3V0KQoreworCWludCBsZW4gPSAwOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWxlbiArPSBzbnByaW50ZigoYnVmICsgbGVuKSwgKHNpemUgLSBsZW4pLAorCQkJCQkiWzB4IiBCWVRFX0hFWF9GTVQgIl0iLAorCQkJCQlmcm1baV0pOworCQlpZiAoKGkgPT0gY3V0KSAmJiAoY291bnQgPiAoY3V0ICogMikpKSB7CisJCQkvKiBGYXN0IGZvcndhcmQuICovCisJCQlpID0gY291bnQgLSBjdXQ7CisJCQlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChzaXplIC0gbGVuKSwKKwkJCQkJIi0tLSAldSBieXRlcyBza2lwcGVkIC0tLVxuIiwKKwkJCQkJKGludCkoY291bnQgLSAoY3V0ICogMikpKTsKKwkJfQorCisJCWlmICgoIShpICUgMTApKSAmJiBpKSB7CisJCQlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCQkJIlxuIik7CisJCX0KKwl9CisJbGVuICs9IHNucHJpbnRmKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksICJcbiIpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRiZ2ZzX2ZyYW1lKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpidWY7CisJaW50IGxlbiA9IDA7CisJc3NpemVfdCBzaXplOworCXN0cnVjdCBjZnNwaSAqY2ZzcGk7CisKKwljZnNwaSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlidWYgPSBremFsbG9jKERFQlVHRlNfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKworCS8qIFByaW50IG91dCBkZWJ1ZyBpbmZvcm1hdGlvbi4gKi8KKwlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSJDdXJyZW50IGZyYW1lOlxuIik7CisKKwlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSJUeCBkYXRhIChMZW46ICVkKTpcbiIsIGNmc3BpLT50eF9jcGNrX2xlbik7CisKKwlsZW4gKz0gcHJpbnRfZnJhbWUoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKKwkJCSAgIGNmc3BpLT54ZmVyLnZhX3R4LAorCQkJICAgKGNmc3BpLT50eF9jcGNrX2xlbiArIFNQSV9DTURfU1opLCAxMDApOworCisJbGVuICs9IHNucHJpbnRmKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksCisJCQkiUnggZGF0YSAoTGVuOiAlZCk6XG4iLCBjZnNwaS0+cnhfY3Bja19sZW4pOworCisJbGVuICs9IHByaW50X2ZyYW1lKChidWYgKyBsZW4pLCAoREVCVUdGU19CVUZfU0laRSAtIGxlbiksCisJCQkgICBjZnNwaS0+eGZlci52YV9yeCwKKwkJCSAgIChjZnNwaS0+cnhfY3Bja19sZW4gKyBTUElfQ01EX1NaKSwgMTAwKTsKKworCXNpemUgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRiZ2ZzX3N0YXRlX2ZvcHMgPSB7CisJLm9wZW4gPSBkYmdmc19vcGVuLAorCS5yZWFkID0gZGJnZnNfc3RhdGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRiZ2ZzX2ZyYW1lX2ZvcHMgPSB7CisJLm9wZW4gPSBkYmdmc19vcGVuLAorCS5yZWFkID0gZGJnZnNfZnJhbWUsCisJLm93bmVyID0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZfZGVidWdmc19hZGQoc3RydWN0IGNmc3BpICpjZnNwaSkKK3sKKwljZnNwaS0+ZGJnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGNmc3BpLT5wZGV2LT5uYW1lLCBkYmdmc19yb290KTsKKwljZnNwaS0+ZGJnZnNfc3RhdGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGF0ZSIsIFNfSVJVR08sCisJCQkJCQkgY2ZzcGktPmRiZ2ZzX2RpciwgY2ZzcGksCisJCQkJCQkgJmRiZ2ZzX3N0YXRlX2ZvcHMpOworCWNmc3BpLT5kYmdmc19mcmFtZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZyYW1lIiwgU19JUlVHTywKKwkJCQkJCSBjZnNwaS0+ZGJnZnNfZGlyLCBjZnNwaSwKKwkJCQkJCSAmZGJnZnNfZnJhbWVfZm9wcyk7Cit9CisKK2lubGluZSB2b2lkIGNmc3BpX2RiZ19zdGF0ZShzdHJ1Y3QgY2ZzcGkgKmNmc3BpLCBpbnQgc3RhdGUpCit7CisJY2ZzcGktPmRiZ19zdGF0ZSA9IHN0YXRlOworfTsKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcml2ZXJfZGVidWdmc19jcmVhdGUodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRyaXZlcl9kZWJ1Z2ZzX3JlbW92ZSh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGV2X2RlYnVnZnNfYWRkKHN0cnVjdCBjZnNwaSAqY2ZzcGkpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZfZGVidWdmc19yZW0oc3RydWN0IGNmc3BpICpjZnNwaSkKK3sKK30KKworaW5saW5lIHZvaWQgY2ZzcGlfZGJnX3N0YXRlKHN0cnVjdCBjZnNwaSAqY2ZzcGksIGludCBzdGF0ZSkKK3sKK30KKyNlbmRpZgkJCQkvKiBDT05GSUdfREVCVUdfRlMgKi8KKworc3RhdGljIExJU1RfSEVBRChjZnNwaV9saXN0KTsKK3N0YXRpYyBzcGlubG9ja190IGNmc3BpX2xpc3RfbG9jazsKKworLyogU1BJIHVwbGluayBoZWFkIGFsaWdubWVudC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdXBfaGVhZF9hbGlnbihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHNwaV91cF9oZWFkX2FsaWduKTsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKHVwX2hlYWRfYWxpZ24sIFNfSVJVU1IsIHNob3dfdXBfaGVhZF9hbGlnbiwgTlVMTCk7CisKKy8qIFNQSSB1cGxpbmsgdGFpbCBhbGlnbm1lbnQuICovCitzdGF0aWMgc3NpemVfdCBzaG93X3VwX3RhaWxfYWxpZ24oc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzcGlfdXBfdGFpbF9hbGlnbik7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUih1cF90YWlsX2FsaWduLCBTX0lSVVNSLCBzaG93X3VwX3RhaWxfYWxpZ24sIE5VTEwpOworCisvKiBTUEkgZG93bmxpbmsgaGVhZCBhbGlnbm1lbnQuICovCitzdGF0aWMgc3NpemVfdCBzaG93X2Rvd25faGVhZF9hbGlnbihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHNwaV9kb3duX2hlYWRfYWxpZ24pOworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIoZG93bl9oZWFkX2FsaWduLCBTX0lSVVNSLCBzaG93X2Rvd25faGVhZF9hbGlnbiwgTlVMTCk7CisKKy8qIFNQSSBkb3dubGluayB0YWlsIGFsaWdubWVudC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZG93bl90YWlsX2FsaWduKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BpX2Rvd25fdGFpbF9hbGlnbik7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUihkb3duX3RhaWxfYWxpZ24sIFNfSVJVU1IsIHNob3dfZG93bl90YWlsX2FsaWduLCBOVUxMKTsKKworLyogU1BJIGZyYW1lIGFsaWdubWVudC4gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZnJhbWVfYWxpZ24oc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzcGlfZnJtX2FsaWduKTsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKGZyYW1lX2FsaWduLCBTX0lSVVNSLCBzaG93X2ZyYW1lX2FsaWduLCBOVUxMKTsKKworaW50IGNmc3BpX3htaXRmcm0oc3RydWN0IGNmc3BpICpjZnNwaSwgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwl1OCAqZHN0ID0gYnVmOworCWNhaWZfYXNzZXJ0KGJ1Zik7CisKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBjYWlmX3BheWxvYWRfaW5mbyAqaW5mbzsKKwkJaW50IHNwYWQgPSAwOworCQlpbnQgZXBhZDsKKworCQlza2IgPSBza2JfZGVxdWV1ZSgmY2ZzcGktPmNoZWFkKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgbGVuZ3RoIG9mIGZyYW1lIGluY2x1ZGluZyBTUEkgcGFkZGluZy4KKwkJICogVGhlIHBheWxvYWQgcG9zaXRpb24gaXMgZm91bmQgaW4gdGhlIGNvbnRyb2wgYnVmZmVyLgorCQkgKi8KKwkJaW5mbyA9IChzdHJ1Y3QgY2FpZl9wYXlsb2FkX2luZm8gKikmc2tiLT5jYjsKKworCQkvKgorCQkgKiBDb21wdXRlIGhlYWQgb2Zmc2V0IGkuZS4gbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCB0bworCQkgKiBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkIGFsaWduZWQuCisJCSAqLworCQlpZiAoc3BpX3VwX2hlYWRfYWxpZ24pIHsKKwkJCXNwYWQgPSAxICsgKChpbmZvLT5oZHJfbGVuICsgMSkgJiBzcGlfdXBfaGVhZF9hbGlnbik7CisJCQkqZHN0ID0gKHU4KShzcGFkIC0gMSk7CisJCQlkc3QgKz0gc3BhZDsKKwkJfQorCisJCS8qIENvcHkgaW4gQ0FJRiBmcmFtZS4gKi8KKwkJc2tiX2NvcHlfYml0cyhza2IsIDAsIGRzdCwgc2tiLT5sZW4pOworCQlkc3QgKz0gc2tiLT5sZW47CisJCWNmc3BpLT5uZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWNmc3BpLT5uZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQkvKgorCQkgKiBDb21wdXRlIHRhaWwgb2Zmc2V0IGkuZS4gbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCB0bworCQkgKiBnZXQgdGhlIGNvbXBsZXRlIENBSUYgZnJhbWUgYWxpZ25lZC4KKwkJICovCisJCWVwYWQgPSAoc2tiLT5sZW4gKyBzcGFkKSAmIHNwaV91cF90YWlsX2FsaWduOworCQlkc3QgKz0gZXBhZDsKKworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwl9IHdoaWxlICgoZHN0IC0gYnVmKSA8IGxlbik7CisKKwlyZXR1cm4gZHN0IC0gYnVmOworfQorCitpbnQgY2ZzcGlfeG1pdGxlbihzdHJ1Y3QgY2ZzcGkgKmNmc3BpKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCBmcm1fbGVuID0gMDsKKwlpbnQgcGt0cyA9IDA7CisKKwkvKgorCSAqIERlY29tbWl0IHByZXZpb3VzbHkgY29tbWl0ZWQgZnJhbWVzLgorCSAqIHNrYl9xdWV1ZV9zcGxpY2VfdGFpbCgmY2ZzcGktPmNoZWFkLCZjZnNwaS0+cWhlYWQpCisJICovCisJd2hpbGUgKHNrYl9wZWVrKCZjZnNwaS0+Y2hlYWQpKSB7CisJCXNrYiA9IHNrYl9kZXF1ZXVlX3RhaWwoJmNmc3BpLT5jaGVhZCk7CisJCXNrYl9xdWV1ZV9oZWFkKCZjZnNwaS0+cWhlYWQsIHNrYik7CisJfQorCisJZG8geworCQlzdHJ1Y3QgY2FpZl9wYXlsb2FkX2luZm8gKmluZm8gPSBOVUxMOworCQlpbnQgc3BhZCA9IDA7CisJCWludCBlcGFkID0gMDsKKworCQlza2IgPSBza2JfZGVxdWV1ZSgmY2ZzcGktPnFoZWFkKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgbGVuZ3RoIG9mIGZyYW1lIGluY2x1ZGluZyBTUEkgcGFkZGluZy4KKwkJICogVGhlIHBheWxvYWQgcG9zaXRpb24gaXMgZm91bmQgaW4gdGhlIGNvbnRyb2wgYnVmZmVyLgorCQkgKi8KKwkJaW5mbyA9IChzdHJ1Y3QgY2FpZl9wYXlsb2FkX2luZm8gKikmc2tiLT5jYjsKKworCQkvKgorCQkgKiBDb21wdXRlIGhlYWQgb2Zmc2V0IGkuZS4gbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCB0bworCQkgKiBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkIGFsaWduZWQuCisJCSAqLworCQlpZiAoc3BpX3VwX2hlYWRfYWxpZ24pCisJCQlzcGFkID0gMSArICgoaW5mby0+aGRyX2xlbiArIDEpICYgc3BpX3VwX2hlYWRfYWxpZ24pOworCisJCS8qCisJCSAqIENvbXB1dGUgdGFpbCBvZmZzZXQgaS5lLiBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHRvCisJCSAqIGdldCB0aGUgY29tcGxldGUgQ0FJRiBmcmFtZSBhbGlnbmVkLgorCQkgKi8KKwkJZXBhZCA9IChza2ItPmxlbiArIHNwYWQpICYgc3BpX3VwX3RhaWxfYWxpZ247CisKKwkJaWYgKChza2ItPmxlbiArIHNwYWQgKyBlcGFkICsgZnJtX2xlbikgPD0gQ0FJRl9NQVhfU1BJX0ZSQU1FKSB7CisJCQlza2JfcXVldWVfdGFpbCgmY2ZzcGktPmNoZWFkLCBza2IpOworCQkJcGt0cysrOworCQkJZnJtX2xlbiArPSBza2ItPmxlbiArIHNwYWQgKyBlcGFkOworCQl9IGVsc2UgeworCQkJLyogUHV0IGJhY2sgcGFja2V0LiAqLworCQkJc2tiX3F1ZXVlX2hlYWQoJmNmc3BpLT5xaGVhZCwgc2tiKTsKKwkJfQorCX0gd2hpbGUgKHBrdHMgPD0gQ0FJRl9NQVhfU1BJX1BLVFMpOworCisJLyoKKwkgKiBTZW5kIGZsb3cgb24gaWYgcHJldmlvdXNseSBzZW50IGZsb3cgb2ZmCisJICogYW5kIG5vdyBnbyBiZWxvdyB0aGUgbG93IHdhdGVyIG1hcmsKKwkgKi8KKwlpZiAoY2ZzcGktPmZsb3dfb2ZmX3NlbnQgJiYgY2ZzcGktPnFoZWFkLnFsZW4gPCBjZnNwaS0+cWRfbG93X21hcmsgJiYKKwkJY2ZzcGktPmNmZGV2LmZsb3djdHJsKSB7CisJCWNmc3BpLT5mbG93X29mZl9zZW50ID0gMDsKKwkJY2ZzcGktPmNmZGV2LmZsb3djdHJsKGNmc3BpLT5uZGV2LCAxKTsKKwl9CisKKwlyZXR1cm4gZnJtX2xlbjsKK30KKworc3RhdGljIHZvaWQgY2ZzcGlfc3NfY2IoYm9vbCBhc3NlcnQsIHN0cnVjdCBjZnNwaV9pZmMgKmlmYykKK3sKKwlzdHJ1Y3QgY2ZzcGkgKmNmc3BpID0gKHN0cnVjdCBjZnNwaSAqKWlmYy0+cHJpdjsKKworCWlmICghaW5faW50ZXJydXB0KCkpCisJCXNwaW5fbG9jaygmY2ZzcGktPmxvY2spOworCWlmIChhc3NlcnQpIHsKKwkJc2V0X2JpdChTUElfU1NfT04sICZjZnNwaS0+c3RhdGUpOworCQlzZXRfYml0KFNQSV9YRkVSLCAmY2ZzcGktPnN0YXRlKTsKKwl9IGVsc2UgeworCQlzZXRfYml0KFNQSV9TU19PRkYsICZjZnNwaS0+c3RhdGUpOworCX0KKwlpZiAoIWluX2ludGVycnVwdCgpKQorCQlzcGluX3VubG9jaygmY2ZzcGktPmxvY2spOworCisJLyogV2FrZSB1cCB0aGUgeGZlciB0aHJlYWQuICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjZnNwaS0+d2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIGNmc3BpX3hmZXJfZG9uZV9jYihzdHJ1Y3QgY2ZzcGlfaWZjICppZmMpCit7CisJc3RydWN0IGNmc3BpICpjZnNwaSA9IChzdHJ1Y3QgY2ZzcGkgKilpZmMtPnByaXY7CisKKwkvKiBUcmFuc2ZlciBkb25lLCBjb21wbGV0ZSB3b3JrIHF1ZXVlICovCisJY29tcGxldGUoJmNmc3BpLT5jb21wKTsKK30KKworc3RhdGljIGludCBjZnNwaV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNmc3BpICpjZnNwaSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZnNwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlza2JfcXVldWVfdGFpbCgmY2ZzcGktPnFoZWFkLCBza2IpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNmc3BpLT5sb2NrLCBmbGFncyk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNQSV9YRkVSLCAmY2ZzcGktPnN0YXRlKSkgeworCQkvKiBXYWtlIHVwIHhmZXIgdGhyZWFkLiAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNmc3BpLT53YWl0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2ZzcGktPmxvY2ssIGZsYWdzKTsKKworCS8qIFNlbmQgZmxvdyBvZmYgaWYgbnVtYmVyIG9mIGJ5dGVzIGlzIGFib3ZlIGhpZ2ggd2F0ZXIgbWFyayAqLworCWlmICghY2ZzcGktPmZsb3dfb2ZmX3NlbnQgJiYKKwkJY2ZzcGktPnFoZWFkLnFsZW4gPiBjZnNwaS0+cWRfaGlnaF9tYXJrICYmCisJCWNmc3BpLT5jZmRldi5mbG93Y3RybCkgeworCQljZnNwaS0+Zmxvd19vZmZfc2VudCA9IDE7CisJCWNmc3BpLT5jZmRldi5mbG93Y3RybChjZnNwaS0+bmRldiwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBjZnNwaV9yeGZybShzdHJ1Y3QgY2ZzcGkgKmNmc3BpLCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCXU4ICpzcmMgPSBidWY7CisKKwljYWlmX2Fzc2VydChidWYgIT0gTlVMTCk7CisKKwlkbyB7CisJCWludCByZXM7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCQlpbnQgc3BhZCA9IDA7CisJCWludCBlcGFkID0gMDsKKwkJdTggKmRzdCA9IE5VTEw7CisJCWludCBwa3RfbGVuID0gMDsKKworCQkvKgorCQkgKiBDb21wdXRlIGhlYWQgb2Zmc2V0IGkuZS4gbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIHRvCisJCSAqIGdldCB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgYWxpZ25lZC4KKwkJICovCisJCWlmIChzcGlfZG93bl9oZWFkX2FsaWduKSB7CisJCQlzcGFkID0gMSArICpzcmM7CisJCQlzcmMgKz0gc3BhZDsKKwkJfQorCisJCS8qIFJlYWQgbGVuZ3RoIG9mIENBSUYgZnJhbWUgKGxpdHRsZSBlbmRpYW4pLiAqLworCQlwa3RfbGVuID0gKnNyYzsKKwkJcGt0X2xlbiB8PSAoKCooc3JjKzEpKSA8PCA4KSAmIDB4RkYwMDsKKwkJcGt0X2xlbiArPSAyOwkvKiBBZGQgRkNTIGZpZWxkcy4gKi8KKworCQkvKiBHZXQgYSBzdWl0YWJsZSBjYWlmIHBhY2tldCBhbmQgY29weSBpbiBkYXRhLiAqLworCisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoY2ZzcGktPm5kZXYsIHBrdF9sZW4gKyAxKTsKKwkJY2FpZl9hc3NlcnQoc2tiICE9IE5VTEwpOworCisJCWRzdCA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJbWVtY3B5KGRzdCwgc3JjLCBwa3RfbGVuKTsKKwkJc3JjICs9IHBrdF9sZW47CisKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0NBSUYpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCQlza2ItPmRldiA9IGNmc3BpLT5uZGV2OworCisJCS8qCisJCSAqIFB1c2ggcmVjZWl2ZWQgcGFja2V0IHVwIHRoZSBzdGFjay4KKwkJICovCisJCWlmICghc3BpX2xvb3ApCisJCQlyZXMgPSBuZXRpZl9yeF9uaShza2IpOworCQllbHNlCisJCQlyZXMgPSBjZnNwaV94bWl0KHNrYiwgY2ZzcGktPm5kZXYpOworCisJCWlmICghcmVzKSB7CisJCQljZnNwaS0+bmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJY2ZzcGktPm5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0gZWxzZQorCQkJY2ZzcGktPm5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKworCQkvKgorCQkgKiBDb21wdXRlIHRhaWwgb2Zmc2V0IGkuZS4gbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIHRvCisJCSAqIGdldCB0aGUgY29tcGxldGUgQ0FJRiBmcmFtZSBhbGlnbmVkLgorCQkgKi8KKwkJZXBhZCA9IChwa3RfbGVuICsgc3BhZCkgJiBzcGlfZG93bl90YWlsX2FsaWduOworCQlzcmMgKz0gZXBhZDsKKwl9IHdoaWxlICgoc3JjIC0gYnVmKSA8IGxlbik7CisKKwlyZXR1cm4gc3JjIC0gYnVmOworfQorCitzdGF0aWMgaW50IGNmc3BpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ZzcGlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGNmc3BpX29wcyA9IHsKKwkubmRvX29wZW4gPSBjZnNwaV9vcGVuLAorCS5uZG9fc3RvcCA9IGNmc3BpX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCA9IGNmc3BpX3htaXQKK307CisKK3N0YXRpYyB2b2lkIGNmc3BpX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNmc3BpICpjZnNwaSA9IG5ldGRldl9wcml2KGRldik7CisJZGV2LT5mZWF0dXJlcyA9IDA7CisJZGV2LT5uZXRkZXZfb3BzID0gJmNmc3BpX29wczsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQ0FJRjsKKwlkZXYtPmZsYWdzID0gSUZGX05PQVJQIHwgSUZGX1BPSU5UT1BPSU5UOworCWRldi0+dHhfcXVldWVfbGVuID0gMDsKKwlkZXYtPm10dSA9IFNQSV9NQVhfUEFZTE9BRF9TSVpFOworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNmc3BpLT5xaGVhZCk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2ZzcGktPmNoZWFkKTsKKwljZnNwaS0+Y2ZkZXYubGlua19zZWxlY3QgPSBDQUlGX0xJTktfSElHSF9CQU5EVzsKKwljZnNwaS0+Y2ZkZXYudXNlX2ZyYWcgPSBmYWxzZTsKKwljZnNwaS0+Y2ZkZXYudXNlX3N0eCA9IGZhbHNlOworCWNmc3BpLT5jZmRldi51c2VfZmNzID0gZmFsc2U7CisJY2ZzcGktPm5kZXYgPSBkZXY7Cit9CisKK2ludCBjZnNwaV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2ZzcGkgKmNmc3BpID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgY2ZzcGlfZGV2ICpkZXY7CisJaW50IHJlczsKKwlkZXYgPSAoc3RydWN0IGNmc3BpX2RldiAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGNmc3BpKSwKKwkJCSJjZnNwaSVkIiwgY2ZzcGlfc2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNmc3BpID0gbmV0ZGV2X3ByaXYobmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwljZnNwaS0+bmRldiA9IG5kZXY7CisJY2ZzcGktPnBkZXYgPSBwZGV2OworCisJLyogU2V0IGZsb3cgaW5mbyAqLworCWNmc3BpLT5mbG93X29mZl9zZW50ID0gMDsKKwljZnNwaS0+cWRfbG93X21hcmsgPSBMT1dfV0FURVJfTUFSSzsKKwljZnNwaS0+cWRfaGlnaF9tYXJrID0gSElHSF9XQVRFUl9NQVJLOworCisJLyogQXNzaWduIHRoZSBTUEkgZGV2aWNlLiAqLworCWNmc3BpLT5kZXYgPSBkZXY7CisJLyogQXNzaWduIHRoZSBkZXZpY2UgaWZjIHRvIHRoaXMgU1BJIGludGVyZmFjZS4gKi8KKwlkZXYtPmlmYyA9ICZjZnNwaS0+aWZjOworCisJLyogQWxsb2NhdGUgRE1BIGJ1ZmZlcnMuICovCisJY2ZzcGktPnhmZXIudmFfdHggPSBkbWFfYWxsb2MoJmNmc3BpLT54ZmVyLnBhX3R4KTsKKwlpZiAoIWNmc3BpLT54ZmVyLnZhX3R4KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJDRlNQSTogZmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBUWCBidWZmZXIuXG4iKTsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZG1hX2FsbG9jX3R4OworCX0KKworCWNmc3BpLT54ZmVyLnZhX3J4ID0gZG1hX2FsbG9jKCZjZnNwaS0+eGZlci5wYV9yeCk7CisKKwlpZiAoIWNmc3BpLT54ZmVyLnZhX3J4KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJDRlNQSTogZmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBUWCBidWZmZXIuXG4iKTsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZG1hX2FsbG9jX3J4OworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHdvcmsgcXVldWUuICovCisJSU5JVF9XT1JLKCZjZnNwaS0+d29yaywgY2ZzcGlfeGZlcik7CisKKwkvKiBJbml0aWFsaXplIHNwaW4gbG9ja3MuICovCisJc3Bpbl9sb2NrX2luaXQoJmNmc3BpLT5sb2NrKTsKKworCS8qIEluaXRpYWxpemUgZmxvdyBjb250cm9sIHN0YXRlLiAqLworCWNmc3BpLT5mbG93X3N0b3AgPSBmYWxzZTsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZS4gKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjZnNwaS0+d2FpdCk7CisKKwkvKiBDcmVhdGUgd29yayB0aHJlYWQuICovCisJY2ZzcGktPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2LT5uYW1lKTsKKwlpZiAoIWNmc3BpLT53cSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDRlNQSTogZmFpbGVkIHRvIGNyZWF0ZSB3b3JrIHF1ZXVlLlxuIik7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2NyZWF0ZV93cTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHdvcmsgcXVldWUuICovCisJaW5pdF9jb21wbGV0aW9uKCZjZnNwaS0+Y29tcCk7CisKKwkvKiBDcmVhdGUgZGVidWdmcyBlbnRyaWVzLiAqLworCWRldl9kZWJ1Z2ZzX2FkZChjZnNwaSk7CisKKwkvKiBTZXQgdXAgdGhlIGlmYy4gKi8KKwljZnNwaS0+aWZjLnNzX2NiID0gY2ZzcGlfc3NfY2I7CisJY2ZzcGktPmlmYy54ZmVyX2RvbmVfY2IgPSBjZnNwaV94ZmVyX2RvbmVfY2I7CisJY2ZzcGktPmlmYy5wcml2ID0gY2ZzcGk7CisKKwkvKiBBZGQgQ0FJRiBTUEkgZGV2aWNlIHRvIGxpc3QuICovCisJc3Bpbl9sb2NrKCZjZnNwaV9saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNmc3BpLT5saXN0LCAmY2ZzcGlfbGlzdCk7CisJc3Bpbl91bmxvY2soJmNmc3BpX2xpc3RfbG9jayk7CisKKwkvKiBTY2hlZHVsZSB0aGUgd29yayBxdWV1ZS4gKi8KKwlxdWV1ZV93b3JrKGNmc3BpLT53cSwgJmNmc3BpLT53b3JrKTsKKworCS8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlLiAqLworCXJlcyA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0ZTUEk6IFJlZy4gZXJyb3I6ICVkLlxuIiwgcmVzKTsKKwkJZ290byBlcnJfbmV0X3JlZzsKKwl9CisJcmV0dXJuIHJlczsKKworIGVycl9uZXRfcmVnOgorCWRldl9kZWJ1Z2ZzX3JlbShjZnNwaSk7CisJc2V0X2JpdChTUElfVEVSTUlOQVRFLCAmY2ZzcGktPnN0YXRlKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNmc3BpLT53YWl0KTsKKwlkZXN0cm95X3dvcmtxdWV1ZShjZnNwaS0+d3EpOworIGVycl9jcmVhdGVfd3E6CisJZG1hX2ZyZWUoY2ZzcGktPnhmZXIudmFfcngsIGNmc3BpLT54ZmVyLnBhX3J4KTsKKyBlcnJfZG1hX2FsbG9jX3J4OgorCWRtYV9mcmVlKGNmc3BpLT54ZmVyLnZhX3R4LCBjZnNwaS0+eGZlci5wYV90eCk7CisgZXJyX2RtYV9hbGxvY190eDoKKwlmcmVlX25ldGRldihuZGV2KTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBjZnNwaV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm47CisJc3RydWN0IGNmc3BpICpjZnNwaSA9IE5VTEw7CisJc3RydWN0IGNmc3BpX2RldiAqZGV2OworCisJZGV2ID0gKHN0cnVjdCBjZnNwaV9kZXYgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzcGluX2xvY2soJmNmc3BpX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3Rfbm9kZSwgbiwgJmNmc3BpX2xpc3QpIHsKKwkJY2ZzcGkgPSBsaXN0X2VudHJ5KGxpc3Rfbm9kZSwgc3RydWN0IGNmc3BpLCBsaXN0KTsKKwkJLyogRmluZCB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UuICovCisJCWlmIChjZnNwaS0+ZGV2ID09IGRldikgeworCQkJLyogUmVtb3ZlIGZyb20gbGlzdC4gKi8KKwkJCWxpc3RfZGVsKGxpc3Rfbm9kZSk7CisJCQkvKiBGcmVlIERNQSBidWZmZXJzLiAqLworCQkJZG1hX2ZyZWUoY2ZzcGktPnhmZXIudmFfcngsIGNmc3BpLT54ZmVyLnBhX3J4KTsKKwkJCWRtYV9mcmVlKGNmc3BpLT54ZmVyLnZhX3R4LCBjZnNwaS0+eGZlci5wYV90eCk7CisJCQlzZXRfYml0KFNQSV9URVJNSU5BVEUsICZjZnNwaS0+c3RhdGUpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjZnNwaS0+d2FpdCk7CisJCQlkZXN0cm95X3dvcmtxdWV1ZShjZnNwaS0+d3EpOworCQkJLyogRGVzdHJveSBkZWJ1Z2ZzIGRpcmVjdG9yeSBhbmQgZmlsZXMuICovCisJCQlkZXZfZGVidWdmc19yZW0oY2ZzcGkpOworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoY2ZzcGktPm5kZXYpOworCQkJc3Bpbl91bmxvY2soJmNmc3BpX2xpc3RfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2ZzcGlfbGlzdF9sb2NrKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNmc3BpX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKm47CisJc3RydWN0IGNmc3BpICpjZnNwaSA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9ub2RlLCBuLCAmY2ZzcGlfbGlzdCkgeworCQljZnNwaSA9IGxpc3RfZW50cnkobGlzdF9ub2RlLCBzdHJ1Y3QgY2ZzcGksIGxpc3QpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihjZnNwaS0+cGRldik7CisJfQorCisJLyogRGVzdHJveSBzeXNmcyBmaWxlcy4gKi8KKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmNmc3BpX3NwaV9kcml2ZXIuZHJpdmVyLAorCQkJICAgJmRyaXZlcl9hdHRyX3VwX2hlYWRfYWxpZ24pOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmY2ZzcGlfc3BpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfdXBfdGFpbF9hbGlnbik7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZjZnNwaV9zcGlfZHJpdmVyLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl9kb3duX2hlYWRfYWxpZ24pOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmY2ZzcGlfc3BpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfZG93bl90YWlsX2FsaWduKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmNmc3BpX3NwaV9kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfZnJhbWVfYWxpZ24pOworCS8qIFVucmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLiAqLworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjZnNwaV9zcGlfZHJpdmVyKTsKKwkvKiBEZXN0cm95IGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkuICovCisJZHJpdmVyX2RlYnVnZnNfcmVtb3ZlKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNmc3BpX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCS8qIEluaXRpYWxpemUgc3BpbiBsb2NrLiAqLworCXNwaW5fbG9ja19pbml0KCZjZnNwaV9saXN0X2xvY2spOworCisJLyogUmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLiAqLworCXJlc3VsdCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY2ZzcGlfc3BpX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBwbGF0Zm9ybSBTUEkgZHJpdmVyLlxuIik7CisJCWdvdG8gZXJyX2Rldl9yZWdpc3RlcjsKKwl9CisKKwkvKiBDcmVhdGUgc3lzZnMgZmlsZXMuICovCisJcmVzdWx0ID0KKwkgICAgZHJpdmVyX2NyZWF0ZV9maWxlKCZjZnNwaV9zcGlfZHJpdmVyLmRyaXZlciwKKwkJCSAgICAgICAmZHJpdmVyX2F0dHJfdXBfaGVhZF9hbGlnbik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlN5c2ZzIGNyZWF0aW9uIGZhaWxlZCAxLlxuIik7CisJCWdvdG8gZXJyX2NyZWF0ZV91cF9oZWFkX2FsaWduOworCX0KKworCXJlc3VsdCA9CisJICAgIGRyaXZlcl9jcmVhdGVfZmlsZSgmY2ZzcGlfc3BpX2RyaXZlci5kcml2ZXIsCisJCQkgICAgICAgJmRyaXZlcl9hdHRyX3VwX3RhaWxfYWxpZ24pOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTeXNmcyBjcmVhdGlvbiBmYWlsZWQgMi5cbiIpOworCQlnb3RvIGVycl9jcmVhdGVfdXBfdGFpbF9hbGlnbjsKKwl9CisKKwlyZXN1bHQgPQorCSAgICBkcml2ZXJfY3JlYXRlX2ZpbGUoJmNmc3BpX3NwaV9kcml2ZXIuZHJpdmVyLAorCQkJICAgICAgICZkcml2ZXJfYXR0cl9kb3duX2hlYWRfYWxpZ24pOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTeXNmcyBjcmVhdGlvbiBmYWlsZWQgMy5cbiIpOworCQlnb3RvIGVycl9jcmVhdGVfZG93bl9oZWFkX2FsaWduOworCX0KKworCXJlc3VsdCA9CisJICAgIGRyaXZlcl9jcmVhdGVfZmlsZSgmY2ZzcGlfc3BpX2RyaXZlci5kcml2ZXIsCisJCQkgICAgICAgJmRyaXZlcl9hdHRyX2Rvd25fdGFpbF9hbGlnbik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlN5c2ZzIGNyZWF0aW9uIGZhaWxlZCA0LlxuIik7CisJCWdvdG8gZXJyX2NyZWF0ZV9kb3duX3RhaWxfYWxpZ247CisJfQorCisJcmVzdWx0ID0KKwkgICAgZHJpdmVyX2NyZWF0ZV9maWxlKCZjZnNwaV9zcGlfZHJpdmVyLmRyaXZlciwKKwkJCSAgICAgICAmZHJpdmVyX2F0dHJfZnJhbWVfYWxpZ24pOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTeXNmcyBjcmVhdGlvbiBmYWlsZWQgNS5cbiIpOworCQlnb3RvIGVycl9jcmVhdGVfZnJhbWVfYWxpZ247CisJfQorCWRyaXZlcl9kZWJ1Z2ZzX2NyZWF0ZSgpOworCXJldHVybiByZXN1bHQ7CisKKyBlcnJfY3JlYXRlX2ZyYW1lX2FsaWduOgorCWRyaXZlcl9yZW1vdmVfZmlsZSgmY2ZzcGlfc3BpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfZG93bl90YWlsX2FsaWduKTsKKyBlcnJfY3JlYXRlX2Rvd25fdGFpbF9hbGlnbjoKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmNmc3BpX3NwaV9kcml2ZXIuZHJpdmVyLAorCQkJICAgJmRyaXZlcl9hdHRyX2Rvd25faGVhZF9hbGlnbik7CisgZXJyX2NyZWF0ZV9kb3duX2hlYWRfYWxpZ246CisJZHJpdmVyX3JlbW92ZV9maWxlKCZjZnNwaV9zcGlfZHJpdmVyLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl91cF90YWlsX2FsaWduKTsKKyBlcnJfY3JlYXRlX3VwX3RhaWxfYWxpZ246CisJZHJpdmVyX3JlbW92ZV9maWxlKCZjZnNwaV9zcGlfZHJpdmVyLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl91cF9oZWFkX2FsaWduKTsKKyBlcnJfY3JlYXRlX3VwX2hlYWRfYWxpZ246CisgZXJyX2Rldl9yZWdpc3RlcjoKKwlyZXR1cm4gcmVzdWx0OworfQorCittb2R1bGVfaW5pdChjZnNwaV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjZnNwaV9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpX3NsYXZlLmMgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpX3NsYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3Y2NmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zcGlfc2xhdmUuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gQUIgMjAxMAorICogQ29udGFjdDogU2p1ciBCcmVuZGVsYW5kIC8gc2p1ci5icmFuZGVsYW5kQHN0ZXJpY3Nzb24uY29tCisgKiBBdXRob3I6ICBEYW5pZWwgTWFydGVuc3NvbiAvIERhbmllbC5NYXJ0ZW5zc29uQHN0ZXJpY3Nzb24uY29tCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfc3BpLmg+CisKKyNpZm5kZWYgQ09ORklHX0NBSUZfU1BJX1NZTkMKKyNkZWZpbmUgU1BJX0RBVEFfUE9TIFNQSV9DTURfU1oKK3N0YXRpYyBpbmxpbmUgaW50IGZvcndhcmRfdG9fc3BpX2NtZChzdHJ1Y3QgY2ZzcGkgKmNmc3BpKQoreworCXJldHVybiBjZnNwaS0+cnhfY3Bja19sZW47Cit9CisjZWxzZQorI2RlZmluZSBTUElfREFUQV9QT1MgMAorc3RhdGljIGlubGluZSBpbnQgZm9yd2FyZF90b19zcGlfY21kKHN0cnVjdCBjZnNwaSAqY2ZzcGkpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHNwaV9mcm1fYWxpZ24gPSAyOworaW50IHNwaV91cF9oZWFkX2FsaWduID0gMTsKK2ludCBzcGlfdXBfdGFpbF9hbGlnbjsKK2ludCBzcGlfZG93bl9oZWFkX2FsaWduID0gMzsKK2ludCBzcGlfZG93bl90YWlsX2FsaWduID0gMTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnZnNfc3RvcmVfcHJldihzdHJ1Y3QgY2ZzcGkgKmNmc3BpKQoreworCS8qIFN0b3JlIHByZXZpb3VzIGNvbW1hbmQgZm9yIGRlYnVnZ2luZyByZWFzb25zLiovCisJY2ZzcGktPnBjbWQgPSBjZnNwaS0+Y21kOworCS8qIFN0b3JlIHByZXZpb3VzIHRyYW5zZmVyLiAqLworCWNmc3BpLT50eF9wcGNrX2xlbiA9IGNmc3BpLT50eF9jcGNrX2xlbjsKKwljZnNwaS0+cnhfcHBja19sZW4gPSBjZnNwaS0+cnhfY3Bja19sZW47Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRlYnVnZnNfc3RvcmVfcHJldihzdHJ1Y3QgY2ZzcGkgKmNmc3BpKQoreworfQorI2VuZGlmCisKK3ZvaWQgY2ZzcGlfeGZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNmc3BpICpjZnNwaTsKKwl1OCAqcHRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJY2ZzcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNmc3BpLCB3b3JrKTsKKworCS8qIEluaXRpYWxpemUgc3RhdGUuICovCisJY2ZzcGktPmNtZCA9IFNQSV9DTURfRU9UOworCisJZm9yICg7OykgeworCisJCWNmc3BpX2RiZ19zdGF0ZShjZnNwaSwgQ0ZTUElfU1RBVEVfV0FJVElORyk7CisKKwkJLyogV2FpdCBmb3IgbWFzdGVyIHRhbGsgb3IgdHJhbnNtaXQgZXZlbnQuICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjZnNwaS0+d2FpdCwKKwkJCQkgdGVzdF9iaXQoU1BJX1hGRVIsICZjZnNwaS0+c3RhdGUpIHx8CisJCQkJIHRlc3RfYml0KFNQSV9URVJNSU5BVEUsICZjZnNwaS0+c3RhdGUpKTsKKworCQlpZiAodGVzdF9iaXQoU1BJX1RFUk1JTkFURSwgJmNmc3BpLT5zdGF0ZSkpCisJCQlyZXR1cm47CisKKyNpZiBDRlNQSV9EQkdfUFJFRklMTAorCQkvKiBQcmVmaWxsIGJ1ZmZlcnMgZm9yIGVhc2llciBkZWJ1Z2dpbmcuICovCisJCW1lbXNldChjZnNwaS0+eGZlci52YV90eCwgMHhGRiwgU1BJX0RNQV9CVUZfTEVOKTsKKwkJbWVtc2V0KGNmc3BpLT54ZmVyLnZhX3J4LCAweEZGLCBTUElfRE1BX0JVRl9MRU4pOworI2VuZGlmCS8qIENGU1BJX0RCR19QUkVGSUxMICovCisKKwkJY2ZzcGlfZGJnX3N0YXRlKGNmc3BpLCBDRlNQSV9TVEFURV9BV0FLRSk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBjb21taXR0ZWQgZnJhbWUuICovCisJCWlmIChjZnNwaS0+dHhfY3Bja19sZW4pIHsKKwkJCWludCBsZW47CisKKwkJCWNmc3BpX2RiZ19zdGF0ZShjZnNwaSwgQ0ZTUElfU1RBVEVfRkVUQ0hfUEtUKTsKKworCQkJLyogQ29weSBjb21taXRlZCBTUEkgZnJhbWVzIGFmdGVyIHRoZSBTUEkgaW5kaWNhdGlvbi4gKi8KKwkJCXB0ciA9ICh1OCAqKSBjZnNwaS0+eGZlci52YV90eDsKKwkJCXB0ciArPSBTUElfSU5EX1NaOworCQkJbGVuID0gY2ZzcGlfeG1pdGZybShjZnNwaSwgcHRyLCBjZnNwaS0+dHhfY3Bja19sZW4pOworCQkJV0FSTl9PTihsZW4gIT0gY2ZzcGktPnR4X2NwY2tfbGVuKTsKKwl9CisKKwkJY2ZzcGlfZGJnX3N0YXRlKGNmc3BpLCBDRlNQSV9TVEFURV9HRVRfTkVYVCk7CisKKwkJLyogR2V0IGxlbmd0aCBvZiBuZXh0IGZyYW1lIHRvIGNvbW1pdC4gKi8KKwkJY2ZzcGktPnR4X25wY2tfbGVuID0gY2ZzcGlfeG1pdGxlbihjZnNwaSk7CisKKwkJV0FSTl9PTihjZnNwaS0+dHhfbnBja19sZW4gPiBTUElfRE1BX0JVRl9MRU4pOworCisJCS8qCisJCSAqIEFkZCBpbmRpY2F0aW9uIGFuZCBsZW5ndGggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUsCisJCSAqIHVzaW5nIGxpdHRsZSBlbmRpYW4uCisJCSAqLworCQlwdHIgPSAodTggKikgY2ZzcGktPnhmZXIudmFfdHg7CisJCSpwdHIrKyA9IFNQSV9DTURfSU5EOworCQkqcHRyKysgPSAoU1BJX0NNRF9JTkQgICYgMHhGRjAwKSA+PiA4OworCQkqcHRyKysgPSBjZnNwaS0+dHhfbnBja19sZW4gJiAweDAwRkY7CisJCSpwdHIrKyA9IChjZnNwaS0+dHhfbnBja19sZW4gJiAweEZGMDApID4+IDg7CisKKwkJLyogQ2FsY3VsYXRlIGxlbmd0aCBvZiBETUFzLiAqLworCQljZnNwaS0+eGZlci50eF9kbWFfbGVuID0gY2ZzcGktPnR4X2NwY2tfbGVuICsgU1BJX0lORF9TWjsKKwkJY2ZzcGktPnhmZXIucnhfZG1hX2xlbiA9IGNmc3BpLT5yeF9jcGNrX2xlbiArIFNQSV9DTURfU1o7CisKKwkJLyogQWRkIFNQSSBUWCBmcmFtZSBhbGlnbm1lbnQgcGFkZGluZywgaWYgbmVjZXNzYXJ5LiAqLworCQlpZiAoY2ZzcGktPnR4X2NwY2tfbGVuICYmCisJCQkoY2ZzcGktPnhmZXIudHhfZG1hX2xlbiAlIHNwaV9mcm1fYWxpZ24pKSB7CisKKwkJCWNmc3BpLT54ZmVyLnR4X2RtYV9sZW4gKz0gc3BpX2ZybV9hbGlnbiAtCisJCQkgICAgKGNmc3BpLT54ZmVyLnR4X2RtYV9sZW4gJSBzcGlfZnJtX2FsaWduKTsKKwkJfQorCisJCS8qIEFkZCBTUEkgUlggZnJhbWUgYWxpZ25tZW50IHBhZGRpbmcsIGlmIG5lY2Vzc2FyeS4gKi8KKwkJaWYgKGNmc3BpLT5yeF9jcGNrX2xlbiAmJgorCQkJKGNmc3BpLT54ZmVyLnJ4X2RtYV9sZW4gJSBzcGlfZnJtX2FsaWduKSkgeworCisJCQljZnNwaS0+eGZlci5yeF9kbWFfbGVuICs9IHNwaV9mcm1fYWxpZ24gLQorCQkJICAgIChjZnNwaS0+eGZlci5yeF9kbWFfbGVuICUgc3BpX2ZybV9hbGlnbik7CisJCX0KKworCQljZnNwaV9kYmdfc3RhdGUoY2ZzcGksIENGU1BJX1NUQVRFX0lOSVRfWEZFUik7CisKKwkJLyogU3RhcnQgdHJhbnNmZXIuICovCisJCXJldCA9IGNmc3BpLT5kZXYtPmluaXRfeGZlcigmY2ZzcGktPnhmZXIsIGNmc3BpLT5kZXYpOworCQlXQVJOX09OKHJldCk7CisKKwkJY2ZzcGlfZGJnX3N0YXRlKGNmc3BpLCBDRlNQSV9TVEFURV9XQUlUX0FDVElWRSk7CisKKwkJLyoKKwkJICogVE9ETzogV2UgbWlnaHQgYmUgYWJsZSB0byBtYWtlIGFuIGFzc3VtcHRpb24gaWYgdGhpcyBpcyB0aGUKKwkJICogZmlyc3QgbG9vcC4gTWFrZSBzdXJlIHRoYXQgbWluaW11bSB0b2dnbGUgdGltZSBpcyByZXNwZWN0ZWQuCisJCSAqLworCQl1ZGVsYXkoTUlOX1RSQU5TSVRJT05fVElNRV9VU0VDKTsKKworCQljZnNwaV9kYmdfc3RhdGUoY2ZzcGksIENGU1BJX1NUQVRFX1NJR19BQ1RJVkUpOworCisJCS8qIFNpZ25hbCB0aGF0IHdlIGFyZSByZWFkeSB0byByZWNpZXZlIGRhdGEuICovCisJCWNmc3BpLT5kZXYtPnNpZ194ZmVyKHRydWUsIGNmc3BpLT5kZXYpOworCisJCWNmc3BpX2RiZ19zdGF0ZShjZnNwaSwgQ0ZTUElfU1RBVEVfV0FJVF9YRkVSX0RPTkUpOworCisJCS8qIFdhaXQgZm9yIHRyYW5zZmVyIGNvbXBsZXRpb24uICovCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNmc3BpLT5jb21wKTsKKworCQljZnNwaV9kYmdfc3RhdGUoY2ZzcGksIENGU1BJX1NUQVRFX1hGRVJfRE9ORSk7CisKKwkJaWYgKGNmc3BpLT5jbWQgPT0gU1BJX0NNRF9FT1QpIHsKKwkJCS8qCisJCQkgKiBDbGVhciB0aGUgbWFzdGVyIHRhbGsgYml0LiBBIHhmZXIgaXMgYWx3YXlzIGF0CisJCQkgKiAgbGVhc3QgdHdvIGJ1cnN0cy4KKwkJCSAqLworCQkJY2xlYXJfYml0KFNQSV9TU19PTiwgJmNmc3BpLT5zdGF0ZSk7CisJCX0KKworCQljZnNwaV9kYmdfc3RhdGUoY2ZzcGksIENGU1BJX1NUQVRFX1dBSVRfSU5BQ1RJVkUpOworCisJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtaW5pbXVtIHRvZ2dsZSB0aW1lIGlzIHJlc3BlY3RlZC4gKi8KKwkJaWYgKFNQSV9YRkVSX1RJTUVfVVNFQyhjZnNwaS0+eGZlci50eF9kbWFfbGVuLAorCQkJCQljZnNwaS0+ZGV2LT5jbGtfbWh6KSA8CisJCQlNSU5fVFJBTlNJVElPTl9USU1FX1VTRUMpIHsKKworCQkJdWRlbGF5KE1JTl9UUkFOU0lUSU9OX1RJTUVfVVNFQyAtCisJCQkJU1BJX1hGRVJfVElNRV9VU0VDCisJCQkJKGNmc3BpLT54ZmVyLnR4X2RtYV9sZW4sIGNmc3BpLT5kZXYtPmNsa19taHopKTsKKwkJfQorCisJCWNmc3BpX2RiZ19zdGF0ZShjZnNwaSwgQ0ZTUElfU1RBVEVfU0lHX0lOQUNUSVZFKTsKKworCQkvKiBEZS1hc3NlcnQgdHJhbnNmZXIgc2lnbmFsLiAqLworCQljZnNwaS0+ZGV2LT5zaWdfeGZlcihmYWxzZSwgY2ZzcGktPmRldik7CisKKwkJLyogQ2hlY2sgd2hldGhlciB3ZSByZWNlaXZlZCBhIENBSUYgcGFja2V0LiAqLworCQlpZiAoY2ZzcGktPnJ4X2NwY2tfbGVuKSB7CisJCQlpbnQgbGVuOworCisJCQljZnNwaV9kYmdfc3RhdGUoY2ZzcGksIENGU1BJX1NUQVRFX0RFTElWRVJfUEtUKTsKKworCQkJLyogUGFyc2UgU1BJIGZyYW1lLiAqLworCQkJcHRyID0gKCh1OCAqKShjZnNwaS0+eGZlci52YV9yeCArIFNQSV9EQVRBX1BPUykpOworCisJCQlsZW4gPSBjZnNwaV9yeGZybShjZnNwaSwgcHRyLCBjZnNwaS0+cnhfY3Bja19sZW4pOworCQkJV0FSTl9PTihsZW4gIT0gY2ZzcGktPnJ4X2NwY2tfbGVuKTsKKwkJfQorCisJCS8qIENoZWNrIHRoZSBuZXh0IFNQSSBjb21tYW5kIGFuZCBsZW5ndGguICovCisJCXB0ciA9ICh1OCAqKSBjZnNwaS0+eGZlci52YV9yeDsKKworCQlwdHIgKz0gZm9yd2FyZF90b19zcGlfY21kKGNmc3BpKTsKKworCQljZnNwaS0+Y21kID0gKnB0cisrOworCQljZnNwaS0+Y21kIHw9ICgoKnB0cisrKSA8PCA4KSAmIDB4RkYwMDsKKwkJY2ZzcGktPnJ4X25wY2tfbGVuID0gKnB0cisrOworCQljZnNwaS0+cnhfbnBja19sZW4gfD0gKCgqcHRyKyspIDw8IDgpICYgMHhGRjAwOworCisJCVdBUk5fT04oY2ZzcGktPnJ4X25wY2tfbGVuID4gU1BJX0RNQV9CVUZfTEVOKTsKKwkJV0FSTl9PTihjZnNwaS0+Y21kID4gU1BJX0NNRF9FT1QpOworCisJCWRlYnVnZnNfc3RvcmVfcHJldihjZnNwaSk7CisKKwkJLyogQ2hlY2sgd2hldGhlciB0aGUgbWFzdGVyIGlzc3VlZCBhbiBFT1QgY29tbWFuZC4gKi8KKwkJaWYgKGNmc3BpLT5jbWQgPT0gU1BJX0NNRF9FT1QpIHsKKwkJCS8qIFJlc2V0IHN0YXRlLiAqLworCQkJY2ZzcGktPnR4X2NwY2tfbGVuID0gMDsKKwkJCWNmc3BpLT5yeF9jcGNrX2xlbiA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBVcGRhdGUgc3RhdGUuICovCisJCQljZnNwaS0+dHhfY3Bja19sZW4gPSBjZnNwaS0+dHhfbnBja19sZW47CisJCQljZnNwaS0+cnhfY3Bja19sZW4gPSBjZnNwaS0+cnhfbnBja19sZW47CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHhmZXIgYml0LgorCQkgKiBTcGluIGxvY2sgbmVlZGVkIGZvciBwYWNrZXQgaW5zZXJ0aW9uLgorCQkgKiBUZXN0IGFuZCBjbGVhciBvZiBkaWZmZXJlbnQgYml0cworCQkgKiBhcmUgbm90IHN1cHBvcnRlZC4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjZnNwaS0+bG9jaywgZmxhZ3MpOworCQlpZiAoY2ZzcGktPmNtZCA9PSBTUElfQ01EX0VPVCAmJiAhY2ZzcGlfeG1pdGxlbihjZnNwaSkKKwkJCSYmICF0ZXN0X2JpdChTUElfU1NfT04sICZjZnNwaS0+c3RhdGUpKQorCQkJY2xlYXJfYml0KFNQSV9YRkVSLCAmY2ZzcGktPnN0YXRlKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZnNwaS0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjZnNwaV9zcGlfZHJpdmVyID0geworCS5wcm9iZSA9IGNmc3BpX3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gY2ZzcGlfc3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJjZnNwaV9zc3BpIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCAyYzUyMjdjLi45ZDllNDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtNzMsNiArNzMsMTUgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgamFuei1pY2FuMy5rby4KIAorY29uZmlnIEhBVkVfQ0FOX0ZMRVhDQU4KKwlib29sCisKK2NvbmZpZyBDQU5fRkxFWENBTgorCXRyaXN0YXRlICJTdXBwb3J0IGZvciBGcmVlc2NhbGUgRkxFWENBTiBiYXNlZCBjaGlwcyIKKwlkZXBlbmRzIG9uIENBTl9ERVYgJiYgSEFWRV9DQU5fRkxFWENBTgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBmb3IgRnJlZXNjYWxlIEZsZXhDQU4uCisKIHNvdXJjZSAiZHJpdmVycy9uZXQvY2FuL21zY2FuL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQppbmRleCA5MDQ3Y2QwLi4wMDU3NTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvY2FuL01ha2VmaWxlCkBAIC0xNiw1ICsxNiw2IEBACiBvYmotJChDT05GSUdfQ0FOX01DUDI1MVgpCSs9IG1jcDI1MXgubwogb2JqLSQoQ09ORklHX0NBTl9CRklOKQkJKz0gYmZpbl9jYW4ubwogb2JqLSQoQ09ORklHX0NBTl9KQU5aX0lDQU4zKQkrPSBqYW56LWljYW4zLm8KK29iai0kKENPTkZJR19DQU5fRkxFWENBTikJKz0gZmxleGNhbi5vCiAKIGNjZmxhZ3MtJChDT05GSUdfQ0FOX0RFQlVHX0RFVklDRVMpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDQzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCkBAIC0wLDAgKzEsMTAzMCBAQAorLyoKKyAqIGZsZXhjYW4uYyAtIEZMRVhDQU4gQ0FOIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVmFybWEgRWxlY3Ryb25pY3MgT3kKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFyYyBLbGVpbmUtQnVkZGUsIFBlbmd1dHJvbml4CisgKgorICogQmFzZWQgb24gY29kZSBvcmlnaW5hbGx5IGJ5IEFuZHJleSBWb2xrb3YgPGF2b2xrb3ZAdmFybWEtZWwuY29tPgorICoKKyAqIExJQ0VOQ0U6CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2FuL2Vycm9yLmg+CisjaW5jbHVkZSA8bGludXgvY2FuL3BsYXRmb3JtL2ZsZXhjYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJCQkiZmxleGNhbiIKKworLyogOCBmb3IgUlggZmlmbyBhbmQgMiBlcnJvciBoYW5kbGluZyAqLworI2RlZmluZSBGTEVYQ0FOX05BUElfV0VJR0hUCQkoOCArIDIpCisKKy8qIEZMRVhDQU4gbW9kdWxlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKENBTk1DUikgYml0cyAqLworI2RlZmluZSBGTEVYQ0FOX01DUl9NRElTCQlCSVQoMzEpCisjZGVmaW5lIEZMRVhDQU5fTUNSX0ZSWgkJCUJJVCgzMCkKKyNkZWZpbmUgRkxFWENBTl9NQ1JfRkVOCQkJQklUKDI5KQorI2RlZmluZSBGTEVYQ0FOX01DUl9IQUxUCQlCSVQoMjgpCisjZGVmaW5lIEZMRVhDQU5fTUNSX05PVF9SRFkJCUJJVCgyNykKKyNkZWZpbmUgRkxFWENBTl9NQ1JfV0FLX01TSwkJQklUKDI2KQorI2RlZmluZSBGTEVYQ0FOX01DUl9TT0ZUUlNUCQlCSVQoMjUpCisjZGVmaW5lIEZMRVhDQU5fTUNSX0ZSWl9BQ0sJCUJJVCgyNCkKKyNkZWZpbmUgRkxFWENBTl9NQ1JfU1VQVgkJQklUKDIzKQorI2RlZmluZSBGTEVYQ0FOX01DUl9TTEZfV0FLCQlCSVQoMjIpCisjZGVmaW5lIEZMRVhDQU5fTUNSX1dSTl9FTgkJQklUKDIxKQorI2RlZmluZSBGTEVYQ0FOX01DUl9MUE1fQUNLCQlCSVQoMjApCisjZGVmaW5lIEZMRVhDQU5fTUNSX1dBS19TUkMJCUJJVCgxOSkKKyNkZWZpbmUgRkxFWENBTl9NQ1JfRE9aRQkJQklUKDE4KQorI2RlZmluZSBGTEVYQ0FOX01DUl9TUlhfRElTCQlCSVQoMTcpCisjZGVmaW5lIEZMRVhDQU5fTUNSX0JDQwkJCUJJVCgxNikKKyNkZWZpbmUgRkxFWENBTl9NQ1JfTFBSSU9fRU4JCUJJVCgxMykKKyNkZWZpbmUgRkxFWENBTl9NQ1JfQUVOCQkJQklUKDEyKQorI2RlZmluZSBGTEVYQ0FOX01DUl9NQVhNQih4KQkJKCh4KSAmIDB4ZikKKyNkZWZpbmUgRkxFWENBTl9NQ1JfSURBTV9BCQkoMCA8PCA4KQorI2RlZmluZSBGTEVYQ0FOX01DUl9JREFNX0IJCSgxIDw8IDgpCisjZGVmaW5lIEZMRVhDQU5fTUNSX0lEQU1fQwkJKDIgPDwgOCkKKyNkZWZpbmUgRkxFWENBTl9NQ1JfSURBTV9ECQkoMyA8PCA4KQorCisvKiBGTEVYQ0FOIGNvbnRyb2wgcmVnaXN0ZXIgKENBTkNUUkwpIGJpdHMgKi8KKyNkZWZpbmUgRkxFWENBTl9DVFJMX1BSRVNESVYoeCkJCSgoKHgpICYgMHhmZikgPDwgMjQpCisjZGVmaW5lIEZMRVhDQU5fQ1RSTF9SSlcoeCkJCSgoKHgpICYgMHgwMykgPDwgMjIpCisjZGVmaW5lIEZMRVhDQU5fQ1RSTF9QU0VHMSh4KQkJKCgoeCkgJiAweDA3KSA8PCAxOSkKKyNkZWZpbmUgRkxFWENBTl9DVFJMX1BTRUcyKHgpCQkoKCh4KSAmIDB4MDcpIDw8IDE2KQorI2RlZmluZSBGTEVYQ0FOX0NUUkxfQk9GRl9NU0sJCUJJVCgxNSkKKyNkZWZpbmUgRkxFWENBTl9DVFJMX0VSUl9NU0sJCUJJVCgxNCkKKyNkZWZpbmUgRkxFWENBTl9DVFJMX0NMS19TUkMJCUJJVCgxMykKKyNkZWZpbmUgRkxFWENBTl9DVFJMX0xQQgkJQklUKDEyKQorI2RlZmluZSBGTEVYQ0FOX0NUUkxfVFdSTl9NU0sJCUJJVCgxMSkKKyNkZWZpbmUgRkxFWENBTl9DVFJMX1JXUk5fTVNLCQlCSVQoMTApCisjZGVmaW5lIEZMRVhDQU5fQ1RSTF9TTVAJCUJJVCg3KQorI2RlZmluZSBGTEVYQ0FOX0NUUkxfQk9GRl9SRUMJCUJJVCg2KQorI2RlZmluZSBGTEVYQ0FOX0NUUkxfVFNZTgkJQklUKDUpCisjZGVmaW5lIEZMRVhDQU5fQ1RSTF9MQlVGCQlCSVQoNCkKKyNkZWZpbmUgRkxFWENBTl9DVFJMX0xPTQkJQklUKDMpCisjZGVmaW5lIEZMRVhDQU5fQ1RSTF9QUk9QU0VHKHgpCQkoKHgpICYgMHgwNykKKyNkZWZpbmUgRkxFWENBTl9DVFJMX0VSUl9CVVMJCShGTEVYQ0FOX0NUUkxfRVJSX01TSykKKyNkZWZpbmUgRkxFWENBTl9DVFJMX0VSUl9TVEFURSBcCisJKEZMRVhDQU5fQ1RSTF9UV1JOX01TSyB8IEZMRVhDQU5fQ1RSTF9SV1JOX01TSyB8IFwKKwkgRkxFWENBTl9DVFJMX0JPRkZfTVNLKQorI2RlZmluZSBGTEVYQ0FOX0NUUkxfRVJSX0FMTCBcCisJKEZMRVhDQU5fQ1RSTF9FUlJfQlVTIHwgRkxFWENBTl9DVFJMX0VSUl9TVEFURSkKKworLyogRkxFWENBTiBlcnJvciBhbmQgc3RhdHVzIHJlZ2lzdGVyIChFU1IpIGJpdHMgKi8KKyNkZWZpbmUgRkxFWENBTl9FU1JfVFdSTl9JTlQJCUJJVCgxNykKKyNkZWZpbmUgRkxFWENBTl9FU1JfUldSTl9JTlQJCUJJVCgxNikKKyNkZWZpbmUgRkxFWENBTl9FU1JfQklUMV9FUlIJCUJJVCgxNSkKKyNkZWZpbmUgRkxFWENBTl9FU1JfQklUMF9FUlIJCUJJVCgxNCkKKyNkZWZpbmUgRkxFWENBTl9FU1JfQUNLX0VSUgkJQklUKDEzKQorI2RlZmluZSBGTEVYQ0FOX0VTUl9DUkNfRVJSCQlCSVQoMTIpCisjZGVmaW5lIEZMRVhDQU5fRVNSX0ZSTV9FUlIJCUJJVCgxMSkKKyNkZWZpbmUgRkxFWENBTl9FU1JfU1RGX0VSUgkJQklUKDEwKQorI2RlZmluZSBGTEVYQ0FOX0VTUl9UWF9XUk4JCUJJVCg5KQorI2RlZmluZSBGTEVYQ0FOX0VTUl9SWF9XUk4JCUJJVCg4KQorI2RlZmluZSBGTEVYQ0FOX0VTUl9JRExFCQlCSVQoNykKKyNkZWZpbmUgRkxFWENBTl9FU1JfVFhSWAkJQklUKDYpCisjZGVmaW5lIEZMRVhDQU5fRVNUX0ZMVF9DT05GX1NISUZUCSg0KQorI2RlZmluZSBGTEVYQ0FOX0VTUl9GTFRfQ09ORl9NQVNLCSgweDMgPDwgRkxFWENBTl9FU1RfRkxUX0NPTkZfU0hJRlQpCisjZGVmaW5lIEZMRVhDQU5fRVNSX0ZMVF9DT05GX0FDVElWRQkoMHgwIDw8IEZMRVhDQU5fRVNUX0ZMVF9DT05GX1NISUZUKQorI2RlZmluZSBGTEVYQ0FOX0VTUl9GTFRfQ09ORl9QQVNTSVZFCSgweDEgPDwgRkxFWENBTl9FU1RfRkxUX0NPTkZfU0hJRlQpCisjZGVmaW5lIEZMRVhDQU5fRVNSX0JPRkZfSU5UCQlCSVQoMikKKyNkZWZpbmUgRkxFWENBTl9FU1JfRVJSX0lOVAkJQklUKDEpCisjZGVmaW5lIEZMRVhDQU5fRVNSX1dBS19JTlQJCUJJVCgwKQorI2RlZmluZSBGTEVYQ0FOX0VTUl9FUlJfQlVTIFwKKwkoRkxFWENBTl9FU1JfQklUMV9FUlIgfCBGTEVYQ0FOX0VTUl9CSVQwX0VSUiB8IFwKKwkgRkxFWENBTl9FU1JfQUNLX0VSUiB8IEZMRVhDQU5fRVNSX0NSQ19FUlIgfCBcCisJIEZMRVhDQU5fRVNSX0ZSTV9FUlIgfCBGTEVYQ0FOX0VTUl9TVEZfRVJSKQorI2RlZmluZSBGTEVYQ0FOX0VTUl9FUlJfU1RBVEUgXAorCShGTEVYQ0FOX0VTUl9UV1JOX0lOVCB8IEZMRVhDQU5fRVNSX1JXUk5fSU5UIHwgRkxFWENBTl9FU1JfQk9GRl9JTlQpCisjZGVmaW5lIEZMRVhDQU5fRVNSX0VSUl9BTEwgXAorCShGTEVYQ0FOX0VTUl9FUlJfQlVTIHwgRkxFWENBTl9FU1JfRVJSX1NUQVRFKQorCisvKiBGTEVYQ0FOIGludGVycnVwdCBmbGFnIHJlZ2lzdGVyIChJRkxBRykgYml0cyAqLworI2RlZmluZSBGTEVYQ0FOX1RYX0JVRl9JRAkJOAorI2RlZmluZSBGTEVYQ0FOX0lGTEFHX0JVRih4KQkJQklUKHgpCisjZGVmaW5lIEZMRVhDQU5fSUZMQUdfUlhfRklGT19PVkVSRkxPVwlCSVQoNykKKyNkZWZpbmUgRkxFWENBTl9JRkxBR19SWF9GSUZPX1dBUk4JQklUKDYpCisjZGVmaW5lIEZMRVhDQU5fSUZMQUdfUlhfRklGT19BVkFJTEFCTEUJQklUKDUpCisjZGVmaW5lIEZMRVhDQU5fSUZMQUdfREVGQVVMVCBcCisJKEZMRVhDQU5fSUZMQUdfUlhfRklGT19PVkVSRkxPVyB8IEZMRVhDQU5fSUZMQUdfUlhfRklGT19BVkFJTEFCTEUgfCBcCisJIEZMRVhDQU5fSUZMQUdfQlVGKEZMRVhDQU5fVFhfQlVGX0lEKSkKKworLyogRkxFWENBTiBtZXNzYWdlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgRkxFWENBTl9NQl9DTlRfQ09ERSh4KQkJKCgoeCkgJiAweGYpIDw8IDI0KQorI2RlZmluZSBGTEVYQ0FOX01CX0NOVF9TUlIJCUJJVCgyMikKKyNkZWZpbmUgRkxFWENBTl9NQl9DTlRfSURFCQlCSVQoMjEpCisjZGVmaW5lIEZMRVhDQU5fTUJfQ05UX1JUUgkJQklUKDIwKQorI2RlZmluZSBGTEVYQ0FOX01CX0NOVF9MRU5HVEgoeCkJKCgoeCkgJiAweGYpIDw8IDE2KQorI2RlZmluZSBGTEVYQ0FOX01CX0NOVF9USU1FU1RBTVAoeCkJKCh4KSAmIDB4ZmZmZikKKworI2RlZmluZSBGTEVYQ0FOX01CX0NPREVfTUFTSwkJKDB4ZjBmZmZmZmYpCisKKy8qIFN0cnVjdHVyZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgKi8KK3N0cnVjdCBmbGV4Y2FuX21iIHsKKwl1MzIgY2FuX2N0cmw7CisJdTMyIGNhbl9pZDsKKwl1MzIgZGF0YVsyXTsKK307CisKKy8qIFN0cnVjdHVyZSBvZiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzICovCitzdHJ1Y3QgZmxleGNhbl9yZWdzIHsKKwl1MzIgbWNyOwkJLyogMHgwMCAqLworCXUzMiBjdHJsOwkJLyogMHgwNCAqLworCXUzMiB0aW1lcjsJCS8qIDB4MDggKi8KKwl1MzIgX3Jlc2VydmVkMTsJCS8qIDB4MGMgKi8KKwl1MzIgcnhnbWFzazsJCS8qIDB4MTAgKi8KKwl1MzIgcngxNG1hc2s7CQkvKiAweDE0ICovCisJdTMyIHJ4MTVtYXNrOwkJLyogMHgxOCAqLworCXUzMiBlY3I7CQkvKiAweDFjICovCisJdTMyIGVzcjsJCS8qIDB4MjAgKi8KKwl1MzIgaW1hc2syOwkJLyogMHgyNCAqLworCXUzMiBpbWFzazE7CQkvKiAweDI4ICovCisJdTMyIGlmbGFnMjsJCS8qIDB4MmMgKi8KKwl1MzIgaWZsYWcxOwkJLyogMHgzMCAqLworCXUzMiBfcmVzZXJ2ZWQyWzE5XTsKKwlzdHJ1Y3QgZmxleGNhbl9tYiBjYW50eGZnWzY0XTsKK307CisKK3N0cnVjdCBmbGV4Y2FuX3ByaXYgeworCXN0cnVjdCBjYW5fcHJpdiBjYW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgcmVnX2VzcjsKKwl1MzIgcmVnX2N0cmxfZGVmYXVsdDsKKworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgZmxleGNhbl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCBmbGV4Y2FuX2JpdHRpbWluZ19jb25zdCA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS50c2VnMV9taW4gPSA0LAorCS50c2VnMV9tYXggPSAxNiwKKwkudHNlZzJfbWluID0gMiwKKwkudHNlZzJfbWF4ID0gOCwKKwkuc2p3X21heCA9IDQsCisJLmJycF9taW4gPSAxLAorCS5icnBfbWF4ID0gMjU2LAorCS5icnBfaW5jID0gMSwKK307CisKKy8qCisgKiBTd3RpY2ggdHJhbnNjZWl2ZXIgb24gb3Igb2ZmCisgKi8KK3N0YXRpYyB2b2lkIGZsZXhjYW5fdHJhbnNjZWl2ZXJfc3dpdGNoKGNvbnN0IHN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYsIGludCBvbikKK3sKKwlpZiAocHJpdi0+cGRhdGEgJiYgcHJpdi0+cGRhdGEtPnRyYW5zY2VpdmVyX3N3aXRjaCkKKwkJcHJpdi0+cGRhdGEtPnRyYW5zY2VpdmVyX3N3aXRjaChvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZsZXhjYW5faGFzX2FuZF9oYW5kbGVfYmVycihjb25zdCBzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2LAorCQkJCQkgICAgICB1MzIgcmVnX2VzcikKK3sKKwlyZXR1cm4gKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV9CRVJSX1JFUE9SVElORykgJiYKKwkJKHJlZ19lc3IgJiBGTEVYQ0FOX0VTUl9FUlJfQlVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsZXhjYW5fY2hpcF9lbmFibGUoc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZmxleGNhbl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5iYXNlOworCXUzMiByZWc7CisKKwlyZWcgPSByZWFkbCgmcmVncy0+bWNyKTsKKwlyZWcgJj0gfkZMRVhDQU5fTUNSX01ESVM7CisJd3JpdGVsKHJlZywgJnJlZ3MtPm1jcik7CisKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmxleGNhbl9jaGlwX2Rpc2FibGUoc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZmxleGNhbl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5iYXNlOworCXUzMiByZWc7CisKKwlyZWcgPSByZWFkbCgmcmVncy0+bWNyKTsKKwlyZWcgfD0gRkxFWENBTl9NQ1JfTURJUzsKKwl3cml0ZWwocmVnLCAmcmVncy0+bWNyKTsKK30KKworc3RhdGljIGludCBmbGV4Y2FuX2dldF9iZXJyX2NvdW50ZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgKmJlYykKK3sKKwljb25zdCBzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZmxleGNhbl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5iYXNlOworCXUzMiByZWcgPSByZWFkbCgmcmVncy0+ZWNyKTsKKworCWJlYy0+dHhlcnIgPSAocmVnID4+IDApICYgMHhmZjsKKwliZWMtPnJ4ZXJyID0gKHJlZyA+PiA4KSAmIDB4ZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbGV4Y2FuX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwlzdHJ1Y3QgZmxleGNhbl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5iYXNlOworCXN0cnVjdCBjYW5fZnJhbWUgKmNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2ItPmRhdGE7CisJdTMyIGNhbl9pZDsKKwl1MzIgY3RybCA9IEZMRVhDQU5fTUJfQ05UX0NPREUoMHhjKSB8IChjZi0+Y2FuX2RsYyA8PCAxNik7CisKKwlpZiAoY2FuX2Ryb3BwZWRfaW52YWxpZF9za2IoZGV2LCBza2IpKQorCQlyZXR1cm4gTkVUREVWX1RYX09LOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGNmLT5jYW5faWQgJiBDQU5fRUZGX0ZMQUcpIHsKKwkJY2FuX2lkID0gY2YtPmNhbl9pZCAmIENBTl9FRkZfTUFTSzsKKwkJY3RybCB8PSBGTEVYQ0FOX01CX0NOVF9JREUgfCBGTEVYQ0FOX01CX0NOVF9TUlI7CisJfSBlbHNlIHsKKwkJY2FuX2lkID0gKGNmLT5jYW5faWQgJiBDQU5fU0ZGX01BU0spIDw8IDE4OworCX0KKworCWlmIChjZi0+Y2FuX2lkICYgQ0FOX1JUUl9GTEFHKQorCQljdHJsIHw9IEZMRVhDQU5fTUJfQ05UX1JUUjsKKworCWlmIChjZi0+Y2FuX2RsYyA+IDApIHsKKwkJdTMyIGRhdGEgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSZjZi0+ZGF0YVswXSk7CisJCXdyaXRlbChkYXRhLCAmcmVncy0+Y2FudHhmZ1tGTEVYQ0FOX1RYX0JVRl9JRF0uZGF0YVswXSk7CisJfQorCWlmIChjZi0+Y2FuX2RsYyA+IDMpIHsKKwkJdTMyIGRhdGEgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSZjZi0+ZGF0YVs0XSk7CisJCXdyaXRlbChkYXRhLCAmcmVncy0+Y2FudHhmZ1tGTEVYQ0FOX1RYX0JVRl9JRF0uZGF0YVsxXSk7CisJfQorCisJd3JpdGVsKGNhbl9pZCwgJnJlZ3MtPmNhbnR4ZmdbRkxFWENBTl9UWF9CVUZfSURdLmNhbl9pZCk7CisJd3JpdGVsKGN0cmwsICZyZWdzLT5jYW50eGZnW0ZMRVhDQU5fVFhfQlVGX0lEXS5jYW5fY3RybCk7CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCS8qIHR4X3BhY2tldHMgaXMgaW5jcmVtZW50ZWQgaW4gZmxleGNhbl9pcnEgKi8KKwlzdGF0cy0+dHhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgdm9pZCBkb19idXNfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgY2FuX2ZyYW1lICpjZiwgdTMyIHJlZ19lc3IpCit7CisJc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJ4X2Vycm9ycyA9IDAsIHR4X2Vycm9ycyA9IDA7CisKKwljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVCB8IENBTl9FUlJfQlVTRVJST1I7CisKKwlpZiAocmVnX2VzciAmIEZMRVhDQU5fRVNSX0JJVDFfRVJSKSB7CisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiQklUMV9FUlIgaXJxXG4iKTsKKwkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX0JJVDE7CisJCXR4X2Vycm9ycyA9IDE7CisJfQorCWlmIChyZWdfZXNyICYgRkxFWENBTl9FU1JfQklUMF9FUlIpIHsKKwkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJCSVQwX0VSUiBpcnFcbiIpOworCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfQklUMDsKKwkJdHhfZXJyb3JzID0gMTsKKwl9CisJaWYgKHJlZ19lc3IgJiBGTEVYQ0FOX0VTUl9BQ0tfRVJSKSB7CisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiQUNLX0VSUiBpcnFcbiIpOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQUNLOworCQljZi0+ZGF0YVszXSB8PSBDQU5fRVJSX1BST1RfTE9DX0FDSzsKKwkJdHhfZXJyb3JzID0gMTsKKwl9CisJaWYgKHJlZ19lc3IgJiBGTEVYQ0FOX0VTUl9DUkNfRVJSKSB7CisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiQ1JDX0VSUiBpcnFcbiIpOworCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfQklUOworCQljZi0+ZGF0YVszXSB8PSBDQU5fRVJSX1BST1RfTE9DX0NSQ19TRVE7CisJCXJ4X2Vycm9ycyA9IDE7CisJfQorCWlmIChyZWdfZXNyICYgRkxFWENBTl9FU1JfRlJNX0VSUikgeworCQlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgIkZSTV9FUlIgaXJxXG4iKTsKKwkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX0ZPUk07CisJCXJ4X2Vycm9ycyA9IDE7CisJfQorCWlmIChyZWdfZXNyICYgRkxFWENBTl9FU1JfU1RGX0VSUikgeworCQlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgIlNURl9FUlIgaXJxXG4iKTsKKwkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX1NUVUZGOworCQlyeF9lcnJvcnMgPSAxOworCX0KKworCXByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX2Vycm9yKys7CisJaWYgKHJ4X2Vycm9ycykKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwlpZiAodHhfZXJyb3JzKQorCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworfQorCitzdGF0aWMgaW50IGZsZXhjYW5fcG9sbF9idXNfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZWdfZXNyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisKKwlza2IgPSBhbGxvY19jYW5fZXJyX3NrYihkZXYsICZjZik7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gMDsKKworCWRvX2J1c19lcnIoZGV2LCBjZiwgcmVnX2Vzcik7CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZG9fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgY2FuX2ZyYW1lICpjZiwgZW51bSBjYW5fc3RhdGUgbmV3X3N0YXRlKQoreworCXN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjYW5fYmVycl9jb3VudGVyIGJlYzsKKworCWZsZXhjYW5fZ2V0X2JlcnJfY291bnRlcihkZXYsICZiZWMpOworCisJc3dpdGNoIChwcml2LT5jYW4uc3RhdGUpIHsKKwljYXNlIENBTl9TVEFURV9FUlJPUl9BQ1RJVkU6CisJCS8qCisJCSAqIGZyb206IEVSUk9SX0FDVElWRQorCQkgKiB0byAgOiBFUlJPUl9XQVJOSU5HLCBFUlJPUl9QQVNTSVZFLCBCVVNfT0ZGCisJCSAqID0+ICA6IHRoZXJlIHdhcyBhIHdhcm5pbmcgaW50CisJCSAqLworCQlpZiAobmV3X3N0YXRlID49IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HICYmCisJCSAgICBuZXdfc3RhdGUgPD0gQ0FOX1NUQVRFX0JVU19PRkYpIHsKKwkJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiRXJyb3IgV2FybmluZyBJUlFcbiIpOworCQkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5lcnJvcl93YXJuaW5nKys7CisKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9DUlRMOworCQkJY2YtPmRhdGFbMV0gPSAoYmVjLnR4ZXJyID4gYmVjLnJ4ZXJyKSA/CisJCQkJQ0FOX0VSUl9DUlRMX1RYX1dBUk5JTkcgOgorCQkJCUNBTl9FUlJfQ1JUTF9SWF9XQVJOSU5HOworCQl9CisJY2FzZSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzoJLyogZmFsbHRocm91Z2ggKi8KKwkJLyoKKwkJICogZnJvbTogRVJST1JfQUNUSVZFLCBFUlJPUl9XQVJOSU5HCisJCSAqIHRvICA6IEVSUk9SX1BBU1NJVkUsIEJVU19PRkYKKwkJICogPT4gIDogZXJyb3IgcGFzc2l2ZSBpbnQKKwkJICovCisJCWlmIChuZXdfc3RhdGUgPj0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUgJiYKKwkJICAgIG5ld19zdGF0ZSA8PSBDQU5fU1RBVEVfQlVTX09GRikgeworCQkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJFcnJvciBQYXNzaXZlIElSUVxuIik7CisJCQlwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3Bhc3NpdmUrKzsKKworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7CisJCQljZi0+ZGF0YVsxXSA9IChiZWMudHhlcnIgPiBiZWMucnhlcnIpID8KKwkJCQlDQU5fRVJSX0NSVExfVFhfUEFTU0lWRSA6CisJCQkJQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQU5fU1RBVEVfQlVTX09GRjoKKwkJZGV2X2VycihkZXYtPmRldi5wYXJlbnQsCisJCQkiQlVHISBoYXJkd2FyZSByZWNvdmVyZWQgYXV0b21hdGljYWxseSBmcm9tIEJVU19PRkZcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBwcm9jZXNzIHN0YXRlIGNoYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSBuZXcgc3RhdGUgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgQ0FOX1NUQVRFX0VSUk9SX0FDVElWRToKKwkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJFcnJvciBBY3RpdmVcbiIpOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsKKwkJY2YtPmRhdGFbMl0gPSBDQU5fRVJSX1BST1RfQUNUSVZFOworCQlicmVhazsKKwljYXNlIENBTl9TVEFURV9CVVNfT0ZGOgorCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOworCQljYW5fYnVzX29mZihkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZmxleGNhbl9wb2xsX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZWdfZXNyKQoreworCXN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJZW51bSBjYW5fc3RhdGUgbmV3X3N0YXRlOworCWludCBmbHQ7CisKKwlmbHQgPSByZWdfZXNyICYgRkxFWENBTl9FU1JfRkxUX0NPTkZfTUFTSzsKKwlpZiAobGlrZWx5KGZsdCA9PSBGTEVYQ0FOX0VTUl9GTFRfQ09ORl9BQ1RJVkUpKSB7CisJCWlmIChsaWtlbHkoIShyZWdfZXNyICYgKEZMRVhDQU5fRVNSX1RYX1dSTiB8CisJCQkJCUZMRVhDQU5fRVNSX1JYX1dSTikpKSkKKwkJCW5ld19zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7CisJCWVsc2UKKwkJCW5ld19zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HOworCX0gZWxzZSBpZiAodW5saWtlbHkoZmx0ID09IEZMRVhDQU5fRVNSX0ZMVF9DT05GX1BBU1NJVkUpKQorCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfUEFTU0lWRTsKKwllbHNlCisJCW5ld19zdGF0ZSA9IENBTl9TVEFURV9CVVNfT0ZGOworCisJLyogc3RhdGUgaGFzbid0IGNoYW5nZWQgKi8KKwlpZiAobGlrZWx5KG5ld19zdGF0ZSA9PSBwcml2LT5jYW4uc3RhdGUpKQorCQlyZXR1cm4gMDsKKworCXNrYiA9IGFsbG9jX2Nhbl9lcnJfc2tiKGRldiwgJmNmKTsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiAwOworCisJZG9fc3RhdGUoZGV2LCBjZiwgbmV3X3N0YXRlKTsKKwlwcml2LT5jYW4uc3RhdGUgPSBuZXdfc3RhdGU7CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmxleGNhbl9yZWFkX2ZpZm8oY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjYW5fZnJhbWUgKmNmKQoreworCWNvbnN0IHN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmbGV4Y2FuX3JlZ3MgX19pb21lbSAqcmVncyA9IHByaXYtPmJhc2U7CisJc3RydWN0IGZsZXhjYW5fbWIgX19pb21lbSAqbWIgPSAmcmVncy0+Y2FudHhmZ1swXTsKKwl1MzIgcmVnX2N0cmwsIHJlZ19pZDsKKworCXJlZ19jdHJsID0gcmVhZGwoJm1iLT5jYW5fY3RybCk7CisJcmVnX2lkID0gcmVhZGwoJm1iLT5jYW5faWQpOworCWlmIChyZWdfY3RybCAmIEZMRVhDQU5fTUJfQ05UX0lERSkKKwkJY2YtPmNhbl9pZCA9ICgocmVnX2lkID4+IDApICYgQ0FOX0VGRl9NQVNLKSB8IENBTl9FRkZfRkxBRzsKKwllbHNlCisJCWNmLT5jYW5faWQgPSAocmVnX2lkID4+IDE4KSAmIENBTl9TRkZfTUFTSzsKKworCWlmIChyZWdfY3RybCAmIEZMRVhDQU5fTUJfQ05UX1JUUikKKwkJY2YtPmNhbl9pZCB8PSBDQU5fUlRSX0ZMQUc7CisJY2YtPmNhbl9kbGMgPSBnZXRfY2FuX2RsYygocmVnX2N0cmwgPj4gMTYpICYgMHhmKTsKKworCSooX19iZTMyICopKGNmLT5kYXRhICsgMCkgPSBjcHVfdG9fYmUzMihyZWFkbCgmbWItPmRhdGFbMF0pKTsKKwkqKF9fYmUzMiAqKShjZi0+ZGF0YSArIDQpID0gY3B1X3RvX2JlMzIocmVhZGwoJm1iLT5kYXRhWzFdKSk7CisKKwkvKiBtYXJrIGFzIHJlYWQgKi8KKwl3cml0ZWwoRkxFWENBTl9JRkxBR19SWF9GSUZPX0FWQUlMQUJMRSwgJnJlZ3MtPmlmbGFnMSk7CisJcmVhZGwoJnJlZ3MtPnRpbWVyKTsKK30KKworc3RhdGljIGludCBmbGV4Y2FuX3JlYWRfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYWxsb2NfY2FuX3NrYihkZXYsICZjZik7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCXJldHVybiAwOworCX0KKworCWZsZXhjYW5fcmVhZF9maWZvKGRldiwgY2YpOworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZsZXhjYW5fcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBxdW90YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmFwaS0+ZGV2OworCWNvbnN0IHN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmbGV4Y2FuX3JlZ3MgX19pb21lbSAqcmVncyA9IHByaXYtPmJhc2U7CisJdTMyIHJlZ19pZmxhZzEsIHJlZ19lc3I7CisJaW50IHdvcmtfZG9uZSA9IDA7CisKKwkvKgorCSAqIFRoZSBlcnJvciBiaXRzIGFyZSBjbGVhcmVkIG9uIHJlYWQsCisJICogdXNlIHNhdmVkIHZhbHVlIGZyb20gaXJxIGhhbmRsZXIuCisJICovCisJcmVnX2VzciA9IHJlYWRsKCZyZWdzLT5lc3IpIHwgcHJpdi0+cmVnX2VzcjsKKworCS8qIGhhbmRsZSBzdGF0ZSBjaGFuZ2VzICovCisJd29ya19kb25lICs9IGZsZXhjYW5fcG9sbF9zdGF0ZShkZXYsIHJlZ19lc3IpOworCisJLyogaGFuZGxlIFJYLUZJRk8gKi8KKwlyZWdfaWZsYWcxID0gcmVhZGwoJnJlZ3MtPmlmbGFnMSk7CisJd2hpbGUgKHJlZ19pZmxhZzEgJiBGTEVYQ0FOX0lGTEFHX1JYX0ZJRk9fQVZBSUxBQkxFICYmCisJICAgICAgIHdvcmtfZG9uZSA8IHF1b3RhKSB7CisJCXdvcmtfZG9uZSArPSBmbGV4Y2FuX3JlYWRfZnJhbWUoZGV2KTsKKwkJcmVnX2lmbGFnMSA9IHJlYWRsKCZyZWdzLT5pZmxhZzEpOworCX0KKworCS8qIHJlcG9ydCBidXMgZXJyb3JzICovCisJaWYgKGZsZXhjYW5faGFzX2FuZF9oYW5kbGVfYmVycihwcml2LCByZWdfZXNyKSAmJiB3b3JrX2RvbmUgPCBxdW90YSkKKwkJd29ya19kb25lICs9IGZsZXhjYW5fcG9sbF9idXNfZXJyKGRldiwgcmVnX2Vzcik7CisKKwlpZiAod29ya19kb25lIDwgcXVvdGEpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJLyogZW5hYmxlIElSUXMgKi8KKwkJd3JpdGVsKEZMRVhDQU5fSUZMQUdfREVGQVVMVCwgJnJlZ3MtPmltYXNrMSk7CisJCXdyaXRlbChwcml2LT5yZWdfY3RybF9kZWZhdWx0LCAmcmVncy0+Y3RybCk7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIGlycXJldHVybl90IGZsZXhjYW5faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOworCXN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmbGV4Y2FuX3JlZ3MgX19pb21lbSAqcmVncyA9IHByaXYtPmJhc2U7CisJdTMyIHJlZ19pZmxhZzEsIHJlZ19lc3I7CisKKwlyZWdfaWZsYWcxID0gcmVhZGwoJnJlZ3MtPmlmbGFnMSk7CisJcmVnX2VzciA9IHJlYWRsKCZyZWdzLT5lc3IpOworCXdyaXRlbChGTEVYQ0FOX0VTUl9FUlJfSU5ULCAmcmVncy0+ZXNyKTsJLyogQUNLIGVyciBJUlEgKi8KKworCS8qCisJICogc2NoZWR1bGUgTkFQSSBpbiBjYXNlIG9mOgorCSAqIC0gcnggSVJRCisJICogLSBzdGF0ZSBjaGFuZ2UgSVJRCisJICogLSBidXMgZXJyb3IgSVJRIGFuZCBidXMgZXJyb3IgcmVwb3J0aW5nIGlzIGFjdGl2YXRlZAorCSAqLworCWlmICgocmVnX2lmbGFnMSAmIEZMRVhDQU5fSUZMQUdfUlhfRklGT19BVkFJTEFCTEUpIHx8CisJICAgIChyZWdfZXNyICYgRkxFWENBTl9FU1JfRVJSX1NUQVRFKSB8fAorCSAgICBmbGV4Y2FuX2hhc19hbmRfaGFuZGxlX2JlcnIocHJpdiwgcmVnX2VzcikpIHsKKwkJLyoKKwkJICogVGhlIGVycm9yIGJpdHMgYXJlIGNsZWFyZWQgb24gcmVhZCwKKwkJICogc2F2ZSB0aGVtIGZvciBsYXRlciB1c2UuCisJCSAqLworCQlwcml2LT5yZWdfZXNyID0gcmVnX2VzciAmIEZMRVhDQU5fRVNSX0VSUl9CVVM7CisJCXdyaXRlbChGTEVYQ0FOX0lGTEFHX0RFRkFVTFQgJiB+RkxFWENBTl9JRkxBR19SWF9GSUZPX0FWQUlMQUJMRSwKKwkJICAgICAgICZyZWdzLT5pbWFzazEpOworCQl3cml0ZWwocHJpdi0+cmVnX2N0cmxfZGVmYXVsdCAmIH5GTEVYQ0FOX0NUUkxfRVJSX0FMTCwKKwkJICAgICAgICZyZWdzLT5jdHJsKTsKKwkJbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaSk7CisJfQorCisJLyogRklGTyBvdmVyZmxvdyAqLworCWlmIChyZWdfaWZsYWcxICYgRkxFWENBTl9JRkxBR19SWF9GSUZPX09WRVJGTE9XKSB7CisJCXdyaXRlbChGTEVYQ0FOX0lGTEFHX1JYX0ZJRk9fT1ZFUkZMT1csICZyZWdzLT5pZmxhZzEpOworCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJfQorCisJLyogdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCAqLworCWlmIChyZWdfaWZsYWcxICYgKDEgPDwgRkxFWENBTl9UWF9CVUZfSUQpKSB7CisJCS8qIHR4X2J5dGVzIGlzIGluY3JlbWVudGVkIGluIGZsZXhjYW5fc3RhcnRfeG1pdCAqLworCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQl3cml0ZWwoKDEgPDwgRkxFWENBTl9UWF9CVUZfSUQpLCAmcmVncy0+aWZsYWcxKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZmxleGNhbl9zZXRfYml0dGltaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGNhbl9iaXR0aW1pbmcgKmJ0ID0gJnByaXYtPmNhbi5iaXR0aW1pbmc7CisJc3RydWN0IGZsZXhjYW5fcmVncyBfX2lvbWVtICpyZWdzID0gcHJpdi0+YmFzZTsKKwl1MzIgcmVnOworCisJcmVnID0gcmVhZGwoJnJlZ3MtPmN0cmwpOworCXJlZyAmPSB+KEZMRVhDQU5fQ1RSTF9QUkVTRElWKDB4ZmYpIHwKKwkJIEZMRVhDQU5fQ1RSTF9SSlcoMHgzKSB8CisJCSBGTEVYQ0FOX0NUUkxfUFNFRzEoMHg3KSB8CisJCSBGTEVYQ0FOX0NUUkxfUFNFRzIoMHg3KSB8CisJCSBGTEVYQ0FOX0NUUkxfUFJPUFNFRygweDcpIHwKKwkJIEZMRVhDQU5fQ1RSTF9MUEIgfAorCQkgRkxFWENBTl9DVFJMX1NNUCB8CisJCSBGTEVYQ0FOX0NUUkxfTE9NKTsKKworCXJlZyB8PSBGTEVYQ0FOX0NUUkxfUFJFU0RJVihidC0+YnJwIC0gMSkgfAorCQlGTEVYQ0FOX0NUUkxfUFNFRzEoYnQtPnBoYXNlX3NlZzEgLSAxKSB8CisJCUZMRVhDQU5fQ1RSTF9QU0VHMihidC0+cGhhc2Vfc2VnMiAtIDEpIHwKKwkJRkxFWENBTl9DVFJMX1JKVyhidC0+c2p3IC0gMSkgfAorCQlGTEVYQ0FOX0NUUkxfUFJPUFNFRyhidC0+cHJvcF9zZWcgLSAxKTsKKworCWlmIChwcml2LT5jYW4uY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfTE9PUEJBQ0spCisJCXJlZyB8PSBGTEVYQ0FOX0NUUkxfTFBCOworCWlmIChwcml2LT5jYW4uY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfTElTVEVOT05MWSkKKwkJcmVnIHw9IEZMRVhDQU5fQ1RSTF9MT007CisJaWYgKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV8zX1NBTVBMRVMpCisJCXJlZyB8PSBGTEVYQ0FOX0NUUkxfU01QOworCisJZGV2X2luZm8oZGV2LT5kZXYucGFyZW50LCAid3JpdGluZyBjdHJsPTB4JTA4eFxuIiwgcmVnKTsKKwl3cml0ZWwocmVnLCAmcmVncy0+Y3RybCk7CisKKwkvKiBwcmludCBjaGlwIHN0YXR1cyAqLworCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiJXM6IG1jcj0weCUwOHggY3RybD0weCUwOHhcbiIsIF9fZnVuY19fLAorCQlyZWFkbCgmcmVncy0+bWNyKSwgcmVhZGwoJnJlZ3MtPmN0cmwpKTsKK30KKworLyoKKyAqIGZsZXhjYW5fY2hpcF9zdGFydAorICoKKyAqIHRoaXMgZnVuY3Rpb25zIGlzIGVudGVyZWQgd2l0aCBjbG9ja3MgZW5hYmxlZAorICoKKyAqLworc3RhdGljIGludCBmbGV4Y2FuX2NoaXBfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZmxleGNhbl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5iYXNlOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisJdTMyIHJlZ19tY3IsIHJlZ19jdHJsOworCisJLyogZW5hYmxlIG1vZHVsZSAqLworCWZsZXhjYW5fY2hpcF9lbmFibGUocHJpdik7CisKKwkvKiBzb2Z0IHJlc2V0ICovCisJd3JpdGVsKEZMRVhDQU5fTUNSX1NPRlRSU1QsICZyZWdzLT5tY3IpOworCXVkZWxheSgxMCk7CisKKwlyZWdfbWNyID0gcmVhZGwoJnJlZ3MtPm1jcik7CisJaWYgKHJlZ19tY3IgJiBGTEVYQ0FOX01DUl9TT0ZUUlNUKSB7CisJCWRldl9lcnIoZGV2LT5kZXYucGFyZW50LAorCQkJIkZhaWxlZCB0byBzb2Z0cmVzZXQgY2FuIG1vZHVsZSAobWNyPTB4JTA4eClcbiIsCisJCQlyZWdfbWNyKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJZmxleGNhbl9zZXRfYml0dGltaW5nKGRldik7CisKKwkvKgorCSAqIE1DUgorCSAqCisJICogZW5hYmxlIGZyZWV6ZQorCSAqIGVuYWJsZSBmaWZvCisJICogaGFsdCBub3cKKwkgKiBvbmx5IHN1cGVydmlzb3IgYWNjZXNzCisJICogZW5hYmxlIHdhcm5pbmcgaW50CisJICogY2hvb3NlIGZvcm1hdCBDCisJICoKKwkgKi8KKwlyZWdfbWNyID0gcmVhZGwoJnJlZ3MtPm1jcik7CisJcmVnX21jciB8PSBGTEVYQ0FOX01DUl9GUlogfCBGTEVYQ0FOX01DUl9GRU4gfCBGTEVYQ0FOX01DUl9IQUxUIHwKKwkJRkxFWENBTl9NQ1JfU1VQViB8IEZMRVhDQU5fTUNSX1dSTl9FTiB8CisJCUZMRVhDQU5fTUNSX0lEQU1fQzsKKwlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgIiVzOiB3cml0aW5nIG1jcj0weCUwOHgiLCBfX2Z1bmNfXywgcmVnX21jcik7CisJd3JpdGVsKHJlZ19tY3IsICZyZWdzLT5tY3IpOworCisJLyoKKwkgKiBDVFJMCisJICoKKwkgKiBkaXNhYmxlIHRpbWVyIHN5bmMgZmVhdHVyZQorCSAqCisJICogZGlzYWJsZSBhdXRvIGJ1c29mZiByZWNvdmVyeQorCSAqIHRyYW5zbWl0IGxvd2VzdCBidWZmZXIgZmlyc3QKKwkgKgorCSAqIGVuYWJsZSB0eCBhbmQgcnggd2FybmluZyBpbnRlcnJ1cHQKKwkgKiBlbmFibGUgYnVzIG9mZiBpbnRlcnJ1cHQKKwkgKiAoPT0gRkxFWENBTl9DVFJMX0VSUl9TVEFURSkKKwkgKgorCSAqIF9ub3RlXzogd2UgZW5hYmxlIHRoZSAiZXJyb3IgaW50ZXJydXB0IgorCSAqIChGTEVYQ0FOX0NUUkxfRVJSX01TSyksIHRvby4gT3RoZXJ3aXNlIHdlIGRvbid0IGdldCBhbnkKKwkgKiB3YXJuaW5nIG9yIGJ1cyBwYXNzaXZlIGludGVycnVwdHMuCisJICovCisJcmVnX2N0cmwgPSByZWFkbCgmcmVncy0+Y3RybCk7CisJcmVnX2N0cmwgJj0gfkZMRVhDQU5fQ1RSTF9UU1lOOworCXJlZ19jdHJsIHw9IEZMRVhDQU5fQ1RSTF9CT0ZGX1JFQyB8IEZMRVhDQU5fQ1RSTF9MQlVGIHwKKwkJRkxFWENBTl9DVFJMX0VSUl9TVEFURSB8IEZMRVhDQU5fQ1RSTF9FUlJfTVNLOworCisJLyogc2F2ZSBmb3IgbGF0ZXIgdXNlICovCisJcHJpdi0+cmVnX2N0cmxfZGVmYXVsdCA9IHJlZ19jdHJsOworCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiJXM6IHdyaXRpbmcgY3RybD0weCUwOHgiLCBfX2Z1bmNfXywgcmVnX2N0cmwpOworCXdyaXRlbChyZWdfY3RybCwgJnJlZ3MtPmN0cmwpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVncy0+Y2FudHhmZyk7IGkrKykgeworCQl3cml0ZWwoMCwgJnJlZ3MtPmNhbnR4ZmdbaV0uY2FuX2N0cmwpOworCQl3cml0ZWwoMCwgJnJlZ3MtPmNhbnR4ZmdbaV0uY2FuX2lkKTsKKwkJd3JpdGVsKDAsICZyZWdzLT5jYW50eGZnW2ldLmRhdGFbMF0pOworCQl3cml0ZWwoMCwgJnJlZ3MtPmNhbnR4ZmdbaV0uZGF0YVsxXSk7CisKKwkJLyogcHV0IE1CIGludG8gcnggcXVldWUgKi8KKwkJd3JpdGVsKEZMRVhDQU5fTUJfQ05UX0NPREUoMHg0KSwgJnJlZ3MtPmNhbnR4ZmdbaV0uY2FuX2N0cmwpOworCX0KKworCS8qIGFjY2VwdGFuY2UgbWFzay9hY2NlcHRhbmNlIGNvZGUgKGFjY2VwdCBldmVyeXRoaW5nKSAqLworCXdyaXRlbCgweDAsICZyZWdzLT5yeGdtYXNrKTsKKwl3cml0ZWwoMHgwLCAmcmVncy0+cngxNG1hc2spOworCXdyaXRlbCgweDAsICZyZWdzLT5yeDE1bWFzayk7CisKKwlmbGV4Y2FuX3RyYW5zY2VpdmVyX3N3aXRjaChwcml2LCAxKTsKKworCS8qIHN5bmNocm9uaXplIHdpdGggdGhlIGNhbiBidXMgKi8KKwlyZWdfbWNyID0gcmVhZGwoJnJlZ3MtPm1jcik7CisJcmVnX21jciAmPSB+RkxFWENBTl9NQ1JfSEFMVDsKKwl3cml0ZWwocmVnX21jciwgJnJlZ3MtPm1jcik7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCisJLyogZW5hYmxlIEZJRk8gaW50ZXJydXB0cyAqLworCXdyaXRlbChGTEVYQ0FOX0lGTEFHX0RFRkFVTFQsICZyZWdzLT5pbWFzazEpOworCisJLyogcHJpbnQgY2hpcCBzdGF0dXMgKi8KKwlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgIiVzOiByZWFkaW5nIG1jcj0weCUwOHggY3RybD0weCUwOHhcbiIsCisJCV9fZnVuY19fLCByZWFkbCgmcmVncy0+bWNyKSwgcmVhZGwoJnJlZ3MtPmN0cmwpKTsKKworCXJldHVybiAwOworCisgb3V0OgorCWZsZXhjYW5fY2hpcF9kaXNhYmxlKHByaXYpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBmbGV4Y2FuX2NoaXBfc3RvcAorICoKKyAqIHRoaXMgZnVuY3Rpb25zIGlzIGVudGVyZWQgd2l0aCBjbG9ja3MgZW5hYmxlZAorICoKKyAqLworc3RhdGljIHZvaWQgZmxleGNhbl9jaGlwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZmxleGNhbl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBwcml2LT5iYXNlOworCXUzMiByZWc7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDAsICZyZWdzLT5pbWFzazEpOworCisJLyogRGlzYWJsZSArIGhhbHQgbW9kdWxlICovCisJcmVnID0gcmVhZGwoJnJlZ3MtPm1jcik7CisJcmVnIHw9IEZMRVhDQU5fTUNSX01ESVMgfCBGTEVYQ0FOX01DUl9IQUxUOworCXdyaXRlbChyZWcsICZyZWdzLT5tY3IpOworCisJZmxleGNhbl90cmFuc2NlaXZlcl9zd2l0Y2gocHJpdiwgMCk7CisJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX1NUT1BQRUQ7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZmxleGNhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWNsa19lbmFibGUocHJpdi0+Y2xrKTsKKworCWVyciA9IG9wZW5fY2FuZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZmxleGNhbl9pcnEsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwkvKiBzdGFydCBjaGlwIGFuZCBxdWV1aW5nICovCisJZXJyID0gZmxleGNhbl9jaGlwX3N0YXJ0KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisJbmFwaV9lbmFibGUoJnByaXYtPm5hcGkpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKKworIG91dF9jbG9zZToKKwljbG9zZV9jYW5kZXYoZGV2KTsKKyBvdXQ6CisJY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZmxleGNhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CisJZmxleGNhbl9jaGlwX3N0b3AoZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CisKKwljbG9zZV9jYW5kZXYoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsZXhjYW5fc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgZW51bSBjYW5fbW9kZSBtb2RlKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENBTl9NT0RFX1NUQVJUOgorCQllcnIgPSBmbGV4Y2FuX2NoaXBfc3RhcnQoZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBmbGV4Y2FuX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gZmxleGNhbl9vcGVuLAorCS5uZG9fc3RvcAk9IGZsZXhjYW5fY2xvc2UsCisJLm5kb19zdGFydF94bWl0CT0gZmxleGNhbl9zdGFydF94bWl0LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgcmVnaXN0ZXJfZmxleGNhbmRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmbGV4Y2FuX3JlZ3MgX19pb21lbSAqcmVncyA9IHByaXYtPmJhc2U7CisJdTMyIHJlZywgZXJyOworCisJY2xrX2VuYWJsZShwcml2LT5jbGspOworCisJLyogc2VsZWN0ICJidXMgY2xvY2siLCBjaGlwIG11c3QgYmUgZGlzYWJsZWQgKi8KKwlmbGV4Y2FuX2NoaXBfZGlzYWJsZShwcml2KTsKKwlyZWcgPSByZWFkbCgmcmVncy0+Y3RybCk7CisJcmVnIHw9IEZMRVhDQU5fQ1RSTF9DTEtfU1JDOworCXdyaXRlbChyZWcsICZyZWdzLT5jdHJsKTsKKworCWZsZXhjYW5fY2hpcF9lbmFibGUocHJpdik7CisKKwkvKiBzZXQgZnJlZXplLCBoYWx0IGFuZCBhY3RpdmF0ZSBGSUZPLCByZXN0cmljdCByZWdpc3RlciBhY2Nlc3MgKi8KKwlyZWcgPSByZWFkbCgmcmVncy0+bWNyKTsKKwlyZWcgfD0gRkxFWENBTl9NQ1JfRlJaIHwgRkxFWENBTl9NQ1JfSEFMVCB8CisJCUZMRVhDQU5fTUNSX0ZFTiB8IEZMRVhDQU5fTUNSX1NVUFY7CisJd3JpdGVsKHJlZywgJnJlZ3MtPm1jcik7CisKKwkvKgorCSAqIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgbmV3ZXIgdmVyc2lvbnMgb2YgdGhpcyBjb3JlCisJICogZmVhdHVyaW5nIGEgUlggRklGTy4gT2xkZXIgY29yZXMgZm91bmQgb24gc29tZSBDb2xkZmlyZQorCSAqIGRlcml2YXRlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCisJICovCisJcmVnID0gcmVhZGwoJnJlZ3MtPm1jcik7CisJaWYgKCEocmVnICYgRkxFWENBTl9NQ1JfRkVOKSkgeworCQlkZXZfZXJyKGRldi0+ZGV2LnBhcmVudCwKKwkJCSJDb3VsZCBub3QgZW5hYmxlIFJYIEZJRk8sIHVuc3VwcG9ydGVkIGNvcmVcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9jYW5kZXYoZGV2KTsKKworIG91dDoKKwkvKiBkaXNhYmxlIGNvcmUgYW5kIHR1cm4gb2ZmIGNsb2NrcyAqLworCWZsZXhjYW5fY2hpcF9kaXNhYmxlKHByaXYpOworCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdW5yZWdpc3Rlcl9mbGV4Y2FuZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5yZWdpc3Rlcl9jYW5kZXYoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZmxleGNhbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXJlc291cmNlX3NpemVfdCBtZW1fc2l6ZTsKKwlpbnQgZXJyLCBpcnE7CisKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBjbG9jayBkZWZpbmVkXG4iKTsKKwkJZXJyID0gUFRSX0VSUihjbGspOworCQlnb3RvIGZhaWxlZF9jbG9jazsKKwl9CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKCFtZW0gfHwgaXJxIDw9IDApIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsZWRfZ2V0OworCX0KKworCW1lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShtZW0pOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbV9zaXplLCBwZGV2LT5uYW1lKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbGVkX3JlcTsKKwl9CisKKwliYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW1fc2l6ZSk7CisJaWYgKCFiYXNlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX21hcDsKKwl9CisKKwlkZXYgPSBhbGxvY19jYW5kZXYoc2l6ZW9mKHN0cnVjdCBmbGV4Y2FuX3ByaXYpLCAwKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxlZF9hbGxvYzsKKwl9CisKKwlkZXYtPm5ldGRldl9vcHMgPSAmZmxleGNhbl9uZXRkZXZfb3BzOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZmxhZ3MgfD0gSUZGX0VDSE87IC8qIHdlIHN1cHBvcnQgbG9jYWwgZWNobyBpbiBoYXJkd2FyZSAqLworCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+Y2FuLmNsb2NrLmZyZXEgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwlwcml2LT5jYW4uYml0dGltaW5nX2NvbnN0ID0gJmZsZXhjYW5fYml0dGltaW5nX2NvbnN0OworCXByaXYtPmNhbi5kb19zZXRfbW9kZSA9IGZsZXhjYW5fc2V0X21vZGU7CisJcHJpdi0+Y2FuLmRvX2dldF9iZXJyX2NvdW50ZXIgPSBmbGV4Y2FuX2dldF9iZXJyX2NvdW50ZXI7CisJcHJpdi0+Y2FuLmN0cmxtb2RlX3N1cHBvcnRlZCA9IENBTl9DVFJMTU9ERV9MT09QQkFDSyB8CisJCUNBTl9DVFJMTU9ERV9MSVNURU5PTkxZCXwgQ0FOX0NUUkxNT0RFXzNfU0FNUExFUyB8CisJCUNBTl9DVFJMTU9ERV9CRVJSX1JFUE9SVElORzsKKwlwcml2LT5iYXNlID0gYmFzZTsKKwlwcml2LT5kZXYgPSBkZXY7CisJcHJpdi0+Y2xrID0gY2xrOworCXByaXYtPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwluZXRpZl9uYXBpX2FkZChkZXYsICZwcml2LT5uYXBpLCBmbGV4Y2FuX3BvbGwsIEZMRVhDQU5fTkFQSV9XRUlHSFQpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWVyciA9IHJlZ2lzdGVyX2ZsZXhjYW5kZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ2lzdGVyaW5nIG5ldGRldiBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZF9yZWdpc3RlcjsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV2aWNlIHJlZ2lzdGVyZWQgKHJlZ19iYXNlPSVwLCBpcnE9JWQpXG4iLAorCQkgcHJpdi0+YmFzZSwgZGV2LT5pcnEpOworCisJcmV0dXJuIDA7CisKKyBmYWlsZWRfcmVnaXN0ZXI6CisJZnJlZV9jYW5kZXYoZGV2KTsKKyBmYWlsZWRfYWxsb2M6CisJaW91bm1hcChiYXNlKTsKKyBmYWlsZWRfbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCBtZW1fc2l6ZSk7CisgZmFpbGVkX3JlcToKKwljbGtfcHV0KGNsayk7CisgZmFpbGVkX2dldDoKKyBmYWlsZWRfY2xvY2s6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZmxleGNhbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwl1bnJlZ2lzdGVyX2ZsZXhjYW5kZXYoZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX2NhbmRldihkZXYpOworCWlvdW5tYXAocHJpdi0+YmFzZSk7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCisJY2xrX3B1dChwcml2LT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZsZXhjYW5fZHJpdmVyID0geworCS5kcml2ZXIubmFtZSA9IERSVl9OQU1FLAorCS5wcm9iZSA9IGZsZXhjYW5fcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGZsZXhjYW5fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZsZXhjYW5faW5pdCh2b2lkKQoreworCXByX2luZm8oIiVzIG5ldGRldmljZSBkcml2ZXJcbiIsIERSVl9OQU1FKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmbGV4Y2FuX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmbGV4Y2FuX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZmxleGNhbl9kcml2ZXIpOworCXByX2luZm8oIiVzOiBkcml2ZXIgcmVtb3ZlZFxuIiwgRFJWX05BTUUpOworfQorCittb2R1bGVfaW5pdChmbGV4Y2FuX2luaXQpOworbW9kdWxlX2V4aXQoZmxleGNhbl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+LCAiCisJICAgICAgIk1hcmMgS2xlaW5lLUJ1ZGRlIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNBTiBwb3J0IGRyaXZlciBmb3IgZmxleGNhbiBiYXNlZCBjaGlwIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXNjYW4uaCBiL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9tc2Nhbi5oCmluZGV4IDRmZjk2NjQuLmI0M2U5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9tc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9tc2Nhbi5oCkBAIC0yMjcsNyArMjI3LDcgQEAKIAkJdTE2IHRpbWU7CQkJLyogKyAweDdjICAgICAweDNlICovCiAJfSB0eDsKIAlfTVNDQU5fUkVTRVJWRURfKDMyLCAyKTsJCS8qICsgMHg3ZSAgICAgICAgICAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjdW5kZWYgX01TQ0FOX1JFU0VSVkVEXwogI2RlZmluZSBNU0NBTl9SRUdJT04gCXNpemVvZihzdHJ1Y3QgbXNjYW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vdXNiL0tjb25maWcKaW5kZXggOTdmZjZmZS4uMDQ1MjU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvS2NvbmZpZwpAQCAtNyw0ICs3LDEwIEBACiAJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIG9uZSBjaGFubmVsIENQQy1VU0IvQVJNNyBDQU4vVVNCIGludGVyZmFjZQogCSAgZnJvbSBFTVMgRHIuIFRob21hcyBXdWVuc2NoZSAoaHR0cDovL3d3dy5lbXMtd3VlbnNjaGUuZGUpLgogCitjb25maWcgQ0FOX0VTRF9VU0IyCisgICAgICAgIHRyaXN0YXRlICJFU0QgVVNCLzIgQ0FOL1VTQiBpbnRlcmZhY2UiCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQ0FOLVVTQi8yIGludGVyZmFjZQorICAgICAgICAgIGZyb20gZXNkIGVsZWN0cm9uaWMgc3lzdGVtIGRlc2lnbiBnbWJoIChodHRwOi8vd3d3LmVzZC5ldSkuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYW4vdXNiL01ha2VmaWxlCmluZGV4IDBhZmQ1MWQuLmZjZTNjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9NYWtlZmlsZQpAQCAtMyw1ICszLDYgQEAKICMKIAogb2JqLSQoQ09ORklHX0NBTl9FTVNfVVNCKSArPSBlbXNfdXNiLm8KK29iai0kKENPTkZJR19DQU5fRVNEX1VTQjIpICs9IGVzZF91c2IyLm8KIAogY2NmbGFncy0kKENPTkZJR19DQU5fREVCVUdfREVWSUNFUykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYwppbmRleCAxZmMwODcxLi5lNzVmMWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiB9OwogCiAvKiBNYWluIG1lc3NhZ2UgdHlwZSB1c2VkIGJldHdlZW4gbGlicmFyeSBhbmQgYXBwbGljYXRpb24gKi8KLXN0cnVjdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZW1zX2NwY19tc2cgeworc3RydWN0IF9fcGFja2VkIGVtc19jcGNfbXNnIHsKIAl1OCB0eXBlOwkvKiB0eXBlIG9mIG1lc3NhZ2UgKi8KIAl1OCBsZW5ndGg7CS8qIGxlbmd0aCBvZiBkYXRhIHdpdGhpbiB1bmlvbiAnbXNnJyAqLwogCXU4IG1zZ2lkOwkvKiBjb25maXJtYXRpb24gaGFuZGxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL2VzZF91c2IyLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2VzZF91c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNTI3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvZXNkX3VzYjIuYwpAQCAtMCwwICsxLDExMzIgQEAKKy8qCisgKiBDQU4gZHJpdmVyIGZvciBlc2QgQ0FOLVVTQi8yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hdHRoaWFzIEZ1Y2hzIDxtYXR0aGlhcy5mdWNoc0Blc2QuZXU+LCBlc2QgZ21iaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZXJyb3IuaD4KKworTU9EVUxFX0FVVEhPUigiTWF0dGhpYXMgRnVjaHMgPG1hdHRoaWFzLmZ1Y2hzQGVzZC5ldT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ0FOIGRyaXZlciBmb3IgZXNkIENBTi1VU0IvMiBpbnRlcmZhY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCisjZGVmaW5lIFVTQl9FU0RHTUJIX1ZFTkRPUl9JRAkweDBhYjQKKyNkZWZpbmUgVVNCX0NBTlVTQjJfUFJPRFVDVF9JRAkweDAwMTAKKworI2RlZmluZSBFU0RfVVNCMl9DQU5fQ0xPQ0sJNjAwMDAwMDAKKyNkZWZpbmUgRVNEX1VTQjJfTUFYX05FVFMJMgorCisvKiBVU0IyIGNvbW1hbmRzICovCisjZGVmaW5lIENNRF9WRVJTSU9OCQkxIC8qIGFsc28gdXNlZCBmb3IgVkVSU0lPTl9SRVBMWSAqLworI2RlZmluZSBDTURfQ0FOX1JYCQkyIC8qIGRldmljZSB0byBob3N0IG9ubHkgKi8KKyNkZWZpbmUgQ01EX0NBTl9UWAkJMyAvKiBhbHNvIHVzZWQgZm9yIFRYX0RPTkUgKi8KKyNkZWZpbmUgQ01EX1NFVEJBVUQJCTQgLyogYWxzbyB1c2VkIGZvciBTRVRCQVVEX1JFUExZICovCisjZGVmaW5lIENNRF9UUwkJCTUgLyogYWxzbyB1c2VkIGZvciBUU19SRVBMWSAqLworI2RlZmluZSBDTURfSURBREQJCTYgLyogYWxzbyB1c2VkIGZvciBJREFERF9SRVBMWSAqLworCisvKiBlc2QgQ0FOIG1lc3NhZ2UgZmxhZ3MgLSBkbGMgZmllbGQgKi8KKyNkZWZpbmUgRVNEX1JUUgkJCTB4MTAKKworLyogZXNkIENBTiBtZXNzYWdlIGZsYWdzIC0gaWQgZmllbGQgKi8KKyNkZWZpbmUgRVNEX0VYVElECQkweDIwMDAwMDAwCisjZGVmaW5lIEVTRF9FVkVOVAkJMHg0MDAwMDAwMAorI2RlZmluZSBFU0RfSURNQVNLCQkweDFmZmZmZmZmCisKKy8qIGVzZCBDQU4gZXZlbnQgaWRzIHVzZWQgYnkgdGhpcyBkcml2ZXIgKi8KKyNkZWZpbmUgRVNEX0VWX0NBTl9FUlJPUl9FWFQJMgorCisvKiBiYXVkcmF0ZSBtZXNzYWdlIGZsYWdzICovCisjZGVmaW5lIEVTRF9VU0IyX1VCUgkJMHg4MDAwMDAwMAorI2RlZmluZSBFU0RfVVNCMl9MT00JCTB4NDAwMDAwMDAKKyNkZWZpbmUgRVNEX1VTQjJfTk9fQkFVRFJBVEUJMHg3ZmZmZmZmZgorI2RlZmluZSBFU0RfVVNCMl9UU0VHMV9NSU4JMQorI2RlZmluZSBFU0RfVVNCMl9UU0VHMV9NQVgJMTYKKyNkZWZpbmUgRVNEX1VTQjJfVFNFRzFfU0hJRlQJMTYKKyNkZWZpbmUgRVNEX1VTQjJfVFNFRzJfTUlOCTEKKyNkZWZpbmUgRVNEX1VTQjJfVFNFRzJfTUFYCTgKKyNkZWZpbmUgRVNEX1VTQjJfVFNFRzJfU0hJRlQJMjAKKyNkZWZpbmUgRVNEX1VTQjJfU0pXX01BWAk0CisjZGVmaW5lIEVTRF9VU0IyX1NKV19TSElGVAkxNAorI2RlZmluZSBFU0RfVVNCMl9CUlBfTUlOCTEKKyNkZWZpbmUgRVNEX1VTQjJfQlJQX01BWAkxMDI0CisjZGVmaW5lIEVTRF9VU0IyX0JSUF9JTkMJMQorI2RlZmluZSBFU0RfVVNCMl8zX1NBTVBMRVMJMHgwMDgwMDAwMAorCisvKiBlc2QgSURBREQgbWVzc2FnZSAqLworI2RlZmluZSBFU0RfSURfRU5BQkxFCQkweDgwCisjZGVmaW5lIEVTRF9NQVhfSURfU0VHTUVOVAk2NAorCisvKiBTSkExMDAwIEVDQyByZWdpc3RlciAoZW11bGF0ZWQgYnkgdXNiMiBmaXJtd2FyZSkgKi8KKyNkZWZpbmUgU0pBMTAwMF9FQ0NfU0VHCQkweDFGCisjZGVmaW5lIFNKQTEwMDBfRUNDX0RJUgkJMHgyMAorI2RlZmluZSBTSkExMDAwX0VDQ19FUlIJCTB4MDYKKyNkZWZpbmUgU0pBMTAwMF9FQ0NfQklUCQkweDAwCisjZGVmaW5lIFNKQTEwMDBfRUNDX0ZPUk0JMHg0MAorI2RlZmluZSBTSkExMDAwX0VDQ19TVFVGRgkweDgwCisjZGVmaW5lIFNKQTEwMDBfRUNDX01BU0sJMHhjMAorCisvKiBlc2QgYnVzIHN0YXRlIGV2ZW50IGNvZGVzICovCisjZGVmaW5lIEVTRF9CVVNTVEFURV9NQVNLCTB4YzAKKyNkZWZpbmUgRVNEX0JVU1NUQVRFX1dBUk4JMHg0MAorI2RlZmluZSBFU0RfQlVTU1RBVEVfRVJSUEFTU0lWRQkweDgwCisjZGVmaW5lIEVTRF9CVVNTVEFURV9CVVNPRkYJMHhjMAorCisjZGVmaW5lIFJYX0JVRkZFUl9TSVpFCQkxMDI0CisjZGVmaW5lIE1BWF9SWF9VUkJTCQk0CisjZGVmaW5lIE1BWF9UWF9VUkJTCQkxNiAvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKworc3RydWN0IGhlYWRlcl9tc2cgeworCXU4IGxlbjsgLyogbGVuIGlzIGFsd2F5cyB0aGUgdG90YWwgbWVzc2FnZSBsZW5ndGggaW4gMzJiaXQgd29yZHMgKi8KKwl1OCBjbWQ7CisJdTggcnN2ZFsyXTsKK307CisKK3N0cnVjdCB2ZXJzaW9uX21zZyB7CisJdTggbGVuOworCXU4IGNtZDsKKwl1OCByc3ZkOworCXU4IGZsYWdzOworCV9fbGUzMiBkcnZfdmVyc2lvbjsKK307CisKK3N0cnVjdCB2ZXJzaW9uX3JlcGx5X21zZyB7CisJdTggbGVuOworCXU4IGNtZDsKKwl1OCBuZXRzOworCXU4IGZlYXR1cmVzOworCV9fbGUzMiB2ZXJzaW9uOworCXU4IG5hbWVbMTZdOworCV9fbGUzMiByc3ZkOworCV9fbGUzMiB0czsKK307CisKK3N0cnVjdCByeF9tc2cgeworCXU4IGxlbjsKKwl1OCBjbWQ7CisJdTggbmV0OworCXU4IGRsYzsKKwlfX2xlMzIgdHM7CisJX19sZTMyIGlkOyAvKiB1cHBlciAzIGJpdHMgY29udGFpbiBmbGFncyAqLworCXU4IGRhdGFbOF07Cit9OworCitzdHJ1Y3QgdHhfbXNnIHsKKwl1OCBsZW47CisJdTggY21kOworCXU4IG5ldDsKKwl1OCBkbGM7CisJX19sZTMyIGhuZDsKKwlfX2xlMzIgaWQ7IC8qIHVwcGVyIDMgYml0cyBjb250YWluIGZsYWdzICovCisJdTggZGF0YVs4XTsKK307CisKK3N0cnVjdCB0eF9kb25lX21zZyB7CisJdTggbGVuOworCXU4IGNtZDsKKwl1OCBuZXQ7CisJdTggc3RhdHVzOworCV9fbGUzMiBobmQ7CisJX19sZTMyIHRzOworfTsKKworc3RydWN0IGlkX2ZpbHRlcl9tc2cgeworCXU4IGxlbjsKKwl1OCBjbWQ7CisJdTggbmV0OworCXU4IG9wdGlvbjsKKwlfX2xlMzIgbWFza1tFU0RfTUFYX0lEX1NFR01FTlQgKyAxXTsKK307CisKK3N0cnVjdCBzZXRfYmF1ZHJhdGVfbXNnIHsKKwl1OCBsZW47CisJdTggY21kOworCXU4IG5ldDsKKwl1OCByc3ZkOworCV9fbGUzMiBiYXVkOworfTsKKworLyogTWFpbiBtZXNzYWdlIHR5cGUgdXNlZCBiZXR3ZWVuIGxpYnJhcnkgYW5kIGFwcGxpY2F0aW9uICovCitzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGVzZF91c2IyX21zZyB7CisJdW5pb24geworCQlzdHJ1Y3QgaGVhZGVyX21zZyBoZHI7CisJCXN0cnVjdCB2ZXJzaW9uX21zZyB2ZXJzaW9uOworCQlzdHJ1Y3QgdmVyc2lvbl9yZXBseV9tc2cgdmVyc2lvbl9yZXBseTsKKwkJc3RydWN0IHJ4X21zZyByeDsKKwkJc3RydWN0IHR4X21zZyB0eDsKKwkJc3RydWN0IHR4X2RvbmVfbXNnIHR4ZG9uZTsKKwkJc3RydWN0IHNldF9iYXVkcmF0ZV9tc2cgc2V0YmF1ZDsKKwkJc3RydWN0IGlkX2ZpbHRlcl9tc2cgZmlsdGVyOworCX0gbXNnOworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGVzZF91c2IyX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoVVNCX0VTREdNQkhfVkVORE9SX0lELCBVU0JfQ0FOVVNCMl9QUk9EVUNUX0lEKX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZXNkX3VzYjJfdGFibGUpOworCitzdHJ1Y3QgZXNkX3VzYjJfbmV0X3ByaXY7CisKK3N0cnVjdCBlc2RfdHhfdXJiX2NvbnRleHQgeworCXN0cnVjdCBlc2RfdXNiMl9uZXRfcHJpdiAqcHJpdjsKKwl1MzIgZWNob19pbmRleDsKKwlpbnQgZGxjOworfTsKKworc3RydWN0IGVzZF91c2IyIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgZXNkX3VzYjJfbmV0X3ByaXYgKm5ldHNbRVNEX1VTQjJfTUFYX05FVFNdOworCisJc3RydWN0IHVzYl9hbmNob3Igcnhfc3VibWl0dGVkOworCisJaW50IG5ldF9jb3VudDsKKwl1MzIgdmVyc2lvbjsKKwlpbnQgcnhpbml0ZG9uZTsKK307CisKK3N0cnVjdCBlc2RfdXNiMl9uZXRfcHJpdiB7CisJc3RydWN0IGNhbl9wcml2IGNhbjsgLyogbXVzdCBiZSB0aGUgZmlyc3QgbWVtYmVyICovCisKKwlhdG9taWNfdCBhY3RpdmVfdHhfam9iczsKKwlzdHJ1Y3QgdXNiX2FuY2hvciB0eF9zdWJtaXR0ZWQ7CisJc3RydWN0IGVzZF90eF91cmJfY29udGV4dCB0eF9jb250ZXh0c1tNQVhfVFhfVVJCU107CisKKwlpbnQgb3Blbl90aW1lOworCXN0cnVjdCBlc2RfdXNiMiAqdXNiMjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCWludCBpbmRleDsKKwl1OCBvbGRfc3RhdGU7CisJc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgYmVjOworfTsKKworc3RhdGljIHZvaWQgZXNkX3VzYjJfcnhfZXZlbnQoc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2LAorCQkJICAgICAgc3RydWN0IGVzZF91c2IyX21zZyAqbXNnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5uZXRkZXYtPnN0YXRzOworCXN0cnVjdCBjYW5fZnJhbWUgKmNmOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGlkID0gbGUzMl90b19jcHUobXNnLT5tc2cucnguaWQpICYgRVNEX0lETUFTSzsKKworCWlmIChpZCA9PSBFU0RfRVZfQ0FOX0VSUk9SX0VYVCkgeworCQl1OCBzdGF0ZSA9IG1zZy0+bXNnLnJ4LmRhdGFbMF07CisJCXU4IGVjYyA9IG1zZy0+bXNnLnJ4LmRhdGFbMV07CisJCXU4IHR4ZXJyID0gbXNnLT5tc2cucnguZGF0YVsyXTsKKwkJdTggcnhlcnIgPSBtc2ctPm1zZy5yeC5kYXRhWzNdOworCisJCXNrYiA9IGFsbG9jX2Nhbl9lcnJfc2tiKHByaXYtPm5ldGRldiwgJmNmKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHN0YXRlICE9IHByaXYtPm9sZF9zdGF0ZSkgeworCQkJcHJpdi0+b2xkX3N0YXRlID0gc3RhdGU7CisKKwkJCXN3aXRjaCAoc3RhdGUgJiBFU0RfQlVTU1RBVEVfTUFTSykgeworCQkJY2FzZSBFU0RfQlVTU1RBVEVfQlVTT0ZGOgorCQkJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9CVVNfT0ZGOworCQkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9CVVNPRkY7CisJCQkJY2FuX2J1c19vZmYocHJpdi0+bmV0ZGV2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVNEX0JVU1NUQVRFX1dBUk46CisJCQkJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkc7CisJCQkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5lcnJvcl93YXJuaW5nKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEVTRF9CVVNTVEFURV9FUlJQQVNTSVZFOgorCQkJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOworCQkJCXByaXYtPmNhbi5jYW5fc3RhdHMuZXJyb3JfcGFzc2l2ZSsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5idXNfZXJyb3IrKzsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1QgfCBDQU5fRVJSX0JVU0VSUk9SOworCisJCQlzd2l0Y2ggKGVjYyAmIFNKQTEwMDBfRUNDX01BU0spIHsKKwkJCWNhc2UgU0pBMTAwMF9FQ0NfQklUOgorCQkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9CSVQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNKQTEwMDBfRUNDX0ZPUk06CisJCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX0ZPUk07CisJCQkJYnJlYWs7CisJCQljYXNlIFNKQTEwMDBfRUNDX1NUVUZGOgorCQkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9TVFVGRjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX1VOU1BFQzsKKwkJCQljZi0+ZGF0YVszXSA9IGVjYyAmIFNKQTEwMDBfRUNDX1NFRzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogRXJyb3Igb2NjdXJlZCBkdXJpbmcgdHJhbnNtaXNzaW9uPyAqLworCQkJaWYgKCEoZWNjICYgU0pBMTAwMF9FQ0NfRElSKSkKKwkJCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfVFg7CisKKwkJCWlmIChwcml2LT5jYW4uc3RhdGUgPT0gQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkcgfHwKKwkJCSAgICBwcml2LT5jYW4uc3RhdGUgPT0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUpIHsKKwkJCQljZi0+ZGF0YVsxXSA9ICh0eGVyciA+IHJ4ZXJyKSA/CisJCQkJCUNBTl9FUlJfQ1JUTF9UWF9QQVNTSVZFIDoKKwkJCQkJQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkU7CisJCQl9CisJCQljZi0+ZGF0YVs2XSA9IHR4ZXJyOworCQkJY2YtPmRhdGFbN10gPSByeGVycjsKKwkJfQorCisJCW5ldGlmX3J4KHNrYik7CisKKwkJcHJpdi0+YmVjLnR4ZXJyID0gdHhlcnI7CisJCXByaXYtPmJlYy5yeGVyciA9IHJ4ZXJyOworCisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzZF91c2IyX3J4X2Nhbl9tc2coc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2LAorCQkJCXN0cnVjdCBlc2RfdXNiMl9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+bmV0ZGV2LT5zdGF0czsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCXUzMiBpZDsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQocHJpdi0+bmV0ZGV2KSkKKwkJcmV0dXJuOworCisJaWQgPSBsZTMyX3RvX2NwdShtc2ctPm1zZy5yeC5pZCk7CisKKwlpZiAoaWQgJiBFU0RfRVZFTlQpIHsKKwkJZXNkX3VzYjJfcnhfZXZlbnQocHJpdiwgbXNnKTsKKwl9IGVsc2UgeworCQlza2IgPSBhbGxvY19jYW5fc2tiKHByaXYtPm5ldGRldiwgJmNmKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkJcmV0dXJuOworCQl9CisKKwkJY2YtPmNhbl9pZCA9IGlkICYgRVNEX0lETUFTSzsKKwkJY2YtPmNhbl9kbGMgPSBnZXRfY2FuX2RsYyhtc2ctPm1zZy5yeC5kbGMpOworCisJCWlmIChpZCAmIEVTRF9FWFRJRCkKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VGRl9GTEFHOworCisJCWlmIChtc2ctPm1zZy5yeC5kbGMgJiBFU0RfUlRSKSB7CisJCQljZi0+Y2FuX2lkIHw9IENBTl9SVFJfRkxBRzsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBjZi0+Y2FuX2RsYzsgaSsrKQorCQkJCWNmLT5kYXRhW2ldID0gbXNnLT5tc2cucnguZGF0YVtpXTsKKwkJfQorCisJCW5ldGlmX3J4KHNrYik7CisKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZXNkX3VzYjJfdHhfZG9uZV9tc2coc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2LAorCQkJCSBzdHJ1Y3QgZXNkX3VzYjJfbXNnICptc2cpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPm5ldGRldi0+c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlzdHJ1Y3QgZXNkX3R4X3VyYl9jb250ZXh0ICpjb250ZXh0OworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKQorCQlyZXR1cm47CisKKwljb250ZXh0ID0gJnByaXYtPnR4X2NvbnRleHRzW21zZy0+bXNnLnR4ZG9uZS5obmQgJiAoTUFYX1RYX1VSQlMgLSAxKV07CisKKwlpZiAoIW1zZy0+bXNnLnR4ZG9uZS5zdGF0dXMpIHsKKwkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IGNvbnRleHQtPmRsYzsKKwkJY2FuX2dldF9lY2hvX3NrYihuZXRkZXYsIGNvbnRleHQtPmVjaG9faW5kZXgpOworCX0gZWxzZSB7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJY2FuX2ZyZWVfZWNob19za2IobmV0ZGV2LCBjb250ZXh0LT5lY2hvX2luZGV4KTsKKwl9CisKKwkvKiBSZWxlYXNlIGNvbnRleHQgKi8KKwljb250ZXh0LT5lY2hvX2luZGV4ID0gTUFYX1RYX1VSQlM7CisJYXRvbWljX2RlYygmcHJpdi0+YWN0aXZlX3R4X2pvYnMpOworCisJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworfQorCitzdGF0aWMgdm9pZCBlc2RfdXNiMl9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBlc2RfdXNiMiAqZGV2ID0gdXJiLT5jb250ZXh0OworCWludCByZXR2YWw7CisJaW50IHBvcyA9IDA7CisJaW50IGk7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOiAvKiBzdWNjZXNzICovCisJCWJyZWFrOworCisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJZGV2X2luZm8oZGV2LT51ZGV2LT5kZXYucGFyZW50LAorCQkJICJSeCBVUkIgYWJvcnRlZCAoJWQpXG4iLCB1cmItPnN0YXR1cyk7CisJCWdvdG8gcmVzdWJtaXRfdXJiOworCX0KKworCXdoaWxlIChwb3MgPCB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJc3RydWN0IGVzZF91c2IyX21zZyAqbXNnOworCisJCW1zZyA9IChzdHJ1Y3QgZXNkX3VzYjJfbXNnICopKHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgcG9zKTsKKworCQlzd2l0Y2ggKG1zZy0+bXNnLmhkci5jbWQpIHsKKwkJY2FzZSBDTURfQ0FOX1JYOgorCQkJZXNkX3VzYjJfcnhfY2FuX21zZyhkZXYtPm5ldHNbbXNnLT5tc2cucngubmV0XSwgbXNnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX0NBTl9UWDoKKwkJCWVzZF91c2IyX3R4X2RvbmVfbXNnKGRldi0+bmV0c1ttc2ctPm1zZy50eGRvbmUubmV0XSwKKwkJCQkJICAgICBtc2cpOworCQkJYnJlYWs7CisJCX0KKworCQlwb3MgKz0gbXNnLT5tc2cuaGRyLmxlbiA8PCAyOworCisJCWlmIChwb3MgPiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCWRldl9lcnIoZGV2LT51ZGV2LT5kZXYucGFyZW50LCAiZm9ybWF0IGVycm9yXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCityZXN1Ym1pdF91cmI6CisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIDEpLAorCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlciwgUlhfQlVGRkVSX1NJWkUsCisJCQkgIGVzZF91c2IyX3JlYWRfYnVsa19jYWxsYmFjaywgZGV2KTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCA9PSAtRU5PREVWKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5ldF9jb3VudDsgaSsrKSB7CisJCQlpZiAoZGV2LT5uZXRzW2ldKQorCQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2LT5uZXRzW2ldLT5uZXRkZXYpOworCQl9CisJfSBlbHNlIGlmIChyZXR2YWwpIHsKKwkJZGV2X2VycihkZXYtPnVkZXYtPmRldi5wYXJlbnQsCisJCQkiZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIGJ1bGsgdXJiOiAlZFxuIiwgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBjYWxsYmFjayBmb3IgYnVsayBJTiB1cmIKKyAqLworc3RhdGljIHZvaWQgZXNkX3VzYjJfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGVzZF90eF91cmJfY29udGV4dCAqY29udGV4dCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZXNkX3VzYjJfbmV0X3ByaXYgKnByaXY7CisJc3RydWN0IGVzZF91c2IyICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXNkX3VzYjJfbXNnKTsKKworCVdBUk5fT04oIWNvbnRleHQpOworCisJcHJpdiA9IGNvbnRleHQtPnByaXY7CisJbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCWRldiA9IHByaXYtPnVzYjI7CisKKwkvKiBmcmVlIHVwIG91ciBhbGxvY2F0ZWQgYnVmZmVyICovCisJdXNiX2ZyZWVfY29oZXJlbnQodXJiLT5kZXYsIHNpemUsCisJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KG5ldGRldikpCisJCXJldHVybjsKKworCWlmICh1cmItPnN0YXR1cykKKwkJZGV2X2luZm8obmV0ZGV2LT5kZXYucGFyZW50LCAiVHggVVJCIGFib3J0ZWQgKCVkKVxuIiwKKwkJCSB1cmItPnN0YXR1cyk7CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19maXJtd2FyZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkKTsKKwlzdHJ1Y3QgZXNkX3VzYjIgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lZC4lZFxuIiwKKwkJICAgICAgIChkZXYtPnZlcnNpb24gPj4gMTIpICYgMHhmLAorCQkgICAgICAgKGRldi0+dmVyc2lvbiA+PiA4KSAmIDB4ZiwKKwkJICAgICAgIGRldi0+dmVyc2lvbiAmIDB4ZmYpOworfQorc3RhdGljIERFVklDRV9BVFRSKGZpcm13YXJlLCBTX0lSVUdPLCBzaG93X2Zpcm13YXJlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19oYXJkd2FyZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkKTsKKwlzdHJ1Y3QgZXNkX3VzYjIgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lZC4lZFxuIiwKKwkJICAgICAgIChkZXYtPnZlcnNpb24gPj4gMjgpICYgMHhmLAorCQkgICAgICAgKGRldi0+dmVyc2lvbiA+PiAyNCkgJiAweGYsCisJCSAgICAgICAoZGV2LT52ZXJzaW9uID4+IDE2KSAmIDB4ZmYpOworfQorc3RhdGljIERFVklDRV9BVFRSKGhhcmR3YXJlLCBTX0lSVUdPLCBzaG93X2hhcmR3YXJlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19uZXRzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZCk7CisJc3RydWN0IGVzZF91c2IyICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBkZXYtPm5ldF9jb3VudCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobmV0cywgU19JUlVHTywgc2hvd19uZXRzLCBOVUxMKTsKKworc3RhdGljIGludCBlc2RfdXNiMl9zZW5kX21zZyhzdHJ1Y3QgZXNkX3VzYjIgKmRldiwgc3RydWN0IGVzZF91c2IyX21zZyAqbXNnKQoreworCWludCBhY3R1YWxfbGVuZ3RoOworCisJcmV0dXJuIHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwgMiksCisJCQkgICAgbXNnLAorCQkJICAgIG1zZy0+bXNnLmhkci5sZW4gPDwgMiwKKwkJCSAgICAmYWN0dWFsX2xlbmd0aCwKKwkJCSAgICAxMDAwKTsKK30KKworc3RhdGljIGludCBlc2RfdXNiMl93YWl0X21zZyhzdHJ1Y3QgZXNkX3VzYjIgKmRldiwKKwkJCSAgICAgc3RydWN0IGVzZF91c2IyX21zZyAqbXNnKQoreworCWludCBhY3R1YWxfbGVuZ3RoOworCisJcmV0dXJuIHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgMSksCisJCQkgICAgbXNnLAorCQkJICAgIHNpemVvZigqbXNnKSwKKwkJCSAgICAmYWN0dWFsX2xlbmd0aCwKKwkJCSAgICAxMDAwKTsKK30KKworc3RhdGljIGludCBlc2RfdXNiMl9zZXR1cF9yeF91cmJzKHN0cnVjdCBlc2RfdXNiMiAqZGV2KQoreworCWludCBpLCBlcnIgPSAwOworCisJaWYgKGRldi0+cnhpbml0ZG9uZSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JYX1VSQlM7IGkrKykgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSBOVUxMOworCQl1OCAqYnVmID0gTlVMTDsKKworCQkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQgKi8KKwkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCWRldl93YXJuKGRldi0+dWRldi0+ZGV2LnBhcmVudCwKKwkJCQkgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsIFJYX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMLAorCQkJCQkgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCFidWYpIHsKKwkJCWRldl93YXJuKGRldi0+dWRldi0+ZGV2LnBhcmVudCwKKwkJCQkgIk5vIG1lbW9yeSBsZWZ0IGZvciBVU0IgYnVmZmVyXG4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWV1cmI7CisJCX0KKworCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIGRldi0+dWRldiwKKwkJCQkgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIDEpLAorCQkJCSAgYnVmLCBSWF9CVUZGRVJfU0laRSwKKwkJCQkgIGVzZF91c2IyX3JlYWRfYnVsa19jYWxsYmFjaywgZGV2KTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdXNiX2FuY2hvcl91cmIodXJiLCAmZGV2LT5yeF9zdWJtaXR0ZWQpOworCisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKKwkJCXVzYl9mcmVlX2NvaGVyZW50KGRldi0+dWRldiwgUlhfQlVGRkVSX1NJWkUsIGJ1ZiwKKwkJCQkJICB1cmItPnRyYW5zZmVyX2RtYSk7CisJCX0KKworZnJlZXVyYjoKKwkJLyogRHJvcCByZWZlcmVuY2UsIFVTQiBjb3JlIHdpbGwgdGFrZSBjYXJlIG9mIGZyZWVpbmcgaXQgKi8KKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwkvKiBEaWQgd2Ugc3VibWl0IGFueSBVUkJzICovCisJaWYgKGkgPT0gMCkgeworCQlkZXZfZXJyKGRldi0+dWRldi0+ZGV2LnBhcmVudCwgImNvdWxkbid0IHNldHVwIHJlYWQgVVJCc1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogV2FybiBpZiB3ZSd2ZSBjb3VsZG4ndCB0cmFuc21pdCBhbGwgdGhlIFVSQnMgKi8KKwlpZiAoaSA8IE1BWF9SWF9VUkJTKSB7CisJCWRldl93YXJuKGRldi0+dWRldi0+ZGV2LnBhcmVudCwKKwkJCSAicnggcGVyZm9ybWFuY2UgbWF5IGJlIHNsb3dcbiIpOworCX0KKworCWRldi0+cnhpbml0ZG9uZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGFydCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBlc2RfdXNiMl9zdGFydChzdHJ1Y3QgZXNkX3VzYjJfbmV0X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGVzZF91c2IyICpkZXYgPSBwcml2LT51c2IyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7CisJc3RydWN0IGVzZF91c2IyX21zZyBtc2c7CisJaW50IGVyciwgaTsKKworCS8qCisJICogRW5hYmxlIGFsbCBJRHMKKwkgKiBUaGUgSURBREQgbWVzc2FnZSB0YWtlcyB1cCB0byA2NCAzMiBiaXQgYml0bWFza3MgKDIwNDggYml0cykuCisJICogRWFjaCBiaXQgcmVwcmVzZW50cyBvbmUgMTEgYml0IENBTiBpZGVudGlmaWVyLiBBIHNldCBiaXQKKwkgKiBlbmFibGVzIHJlY2VwdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBDQU4gaWRlbnRpZmllci4gQSBjbGVhcmVkCisJICogYml0IGRpc2FibGVkIHRoaXMgaWRlbnRpZmllci4gQW4gYWRkaXRpb25hbCBiaXRtYXNrIHZhbHVlCisJICogZm9sbG93aW5nIHRoZSBDQU4gMi4wQSBiaXRzIGlzIHVzZWQgdG8gZW5hYmxlIHJlY2VwdGlvbiBvZgorCSAqIGV4dGVuZGVkIENBTiBmcmFtZXMuIE9ubHkgdGhlIExTQiBvZiB0aGlzIGZpbmFsIG1hc2sgaXMgY2hlY2tlZAorCSAqIGZvciB0aGUgY29tcGxldGUgMjkgYml0IElEIHJhbmdlLiBUaGUgSURBREQgbWVzc2FnZSBhbHNvIGFsbG93cworCSAqIGZpbHRlciBjb25maWd1cmF0aW9uIGZvciBhbiBJRCBzdWJzZXQuIEluIHRoaXMgY2FzZSB5b3UgY2FuIGFkZAorCSAqIHRoZSBudW1iZXIgb2YgdGhlIHN0YXJ0aW5nIGJpdG1hc2sgKDAuLjY0KSB0byB0aGUgZmlsdGVyLm9wdGlvbgorCSAqIGZpZWxkIGZvbGxvd2VkIGJ5IG9ubHkgc29tZSBiaXRtYXNrcy4KKwkgKi8KKwltc2cubXNnLmhkci5jbWQgPSBDTURfSURBREQ7CisJbXNnLm1zZy5oZHIubGVuID0gMiArIEVTRF9NQVhfSURfU0VHTUVOVDsKKwltc2cubXNnLmZpbHRlci5uZXQgPSBwcml2LT5pbmRleDsKKwltc2cubXNnLmZpbHRlci5vcHRpb24gPSBFU0RfSURfRU5BQkxFOyAvKiBzdGFydCB3aXRoIHNlZ21lbnQgMCAqLworCWZvciAoaSA9IDA7IGkgPCBFU0RfTUFYX0lEX1NFR01FTlQ7IGkrKykKKwkJbXNnLm1zZy5maWx0ZXIubWFza1tpXSA9IGNwdV90b19sZTMyKDB4ZmZmZmZmZmYpOworCS8qIGVuYWJsZSAyOWJpdCBleHRlbmRlZCBJRHMgKi8KKwltc2cubXNnLmZpbHRlci5tYXNrW0VTRF9NQVhfSURfU0VHTUVOVF0gPSBjcHVfdG9fbGUzMigweDAwMDAwMDAxKTsKKworCWVyciA9IGVzZF91c2IyX3NlbmRfbXNnKGRldiwgJm1zZyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWQ7CisKKwllcnIgPSBlc2RfdXNiMl9zZXR1cF9yeF91cmJzKGRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWQ7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlpZiAoZXJyID09IC1FTk9ERVYpCisJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCWRldl9lcnIobmV0ZGV2LT5kZXYucGFyZW50LCAiY291bGRuJ3Qgc3RhcnQgZGV2aWNlOiAlZFxuIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHVubGlua19hbGxfdXJicyhzdHJ1Y3QgZXNkX3VzYjIgKmRldikKK3sKKwlzdHJ1Y3QgZXNkX3VzYjJfbmV0X3ByaXYgKnByaXY7CisJaW50IGk7CisKKwl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZkZXYtPnJ4X3N1Ym1pdHRlZCk7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bmV0X2NvdW50OyBpKyspIHsKKwkJcHJpdiA9IGRldi0+bmV0c1tpXTsKKwkJaWYgKHByaXYpIHsKKwkJCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJnByaXYtPnR4X3N1Ym1pdHRlZCk7CisJCQlhdG9taWNfc2V0KCZwcml2LT5hY3RpdmVfdHhfam9icywgMCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfVVJCUzsgaSsrKQorCQkJCXByaXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBNQVhfVFhfVVJCUzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBlc2RfdXNiMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyOworCisJLyogY29tbW9uIG9wZW4gKi8KKwllcnIgPSBvcGVuX2NhbmRldihuZXRkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBmaW5hbGx5IHN0YXJ0IGRldmljZSAqLworCWVyciA9IGVzZF91c2IyX3N0YXJ0KHByaXYpOworCWlmIChlcnIpIHsKKwkJZGV2X3dhcm4obmV0ZGV2LT5kZXYucGFyZW50LAorCQkJICJjb3VsZG4ndCBzdGFydCBkZXZpY2U6ICVkXG4iLCBlcnIpOworCQljbG9zZV9jYW5kZXYobmV0ZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcml2LT5vcGVuX3RpbWUgPSBqaWZmaWVzOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbmV0ZGV2X3R4X3QgZXNkX3VzYjJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZXNkX3VzYjIgKmRldiA9IHByaXYtPnVzYjI7CisJc3RydWN0IGVzZF90eF91cmJfY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5ldGRldi0+c3RhdHM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2YgPSAoc3RydWN0IGNhbl9mcmFtZSAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgZXNkX3VzYjJfbXNnICptc2c7CisJc3RydWN0IHVyYiAqdXJiOworCXU4ICpidWY7CisJaW50IGksIGVycjsKKwlpbnQgcmV0ID0gTkVUREVWX1RYX09LOworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBlc2RfdXNiMl9tc2cpOworCisJaWYgKGNhbl9kcm9wcGVkX2ludmFsaWRfc2tiKG5ldGRldiwgc2tiKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCwgYW5kIGNvcHkgdGhlIGRhdGEgdG8gdGhlIFVSQiAqLworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKCF1cmIpIHsKKwkJZGV2X2VycihuZXRkZXYtPmRldi5wYXJlbnQsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CisJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJZ290byBub3VyYm1lbTsKKwl9CisKKwlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBzaXplLCBHRlBfQVRPTUlDLAorCQkJCSAmdXJiLT50cmFuc2Zlcl9kbWEpOworCWlmICghYnVmKSB7CisJCWRldl9lcnIobmV0ZGV2LT5kZXYucGFyZW50LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVTQiBidWZmZXJcbiIpOworCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gbm9idWZtZW07CisJfQorCisJbXNnID0gKHN0cnVjdCBlc2RfdXNiMl9tc2cgKilidWY7CisKKwltc2ctPm1zZy5oZHIubGVuID0gMzsgLyogbWluaW1hbCBsZW5ndGggKi8KKwltc2ctPm1zZy5oZHIuY21kID0gQ01EX0NBTl9UWDsKKwltc2ctPm1zZy50eC5uZXQgPSBwcml2LT5pbmRleDsKKwltc2ctPm1zZy50eC5kbGMgPSBjZi0+Y2FuX2RsYzsKKwltc2ctPm1zZy50eC5pZCA9IGNwdV90b19sZTMyKGNmLT5jYW5faWQgJiBDQU5fRVJSX01BU0spOworCisJaWYgKGNmLT5jYW5faWQgJiBDQU5fUlRSX0ZMQUcpCisJCW1zZy0+bXNnLnR4LmRsYyB8PSBFU0RfUlRSOworCisJaWYgKGNmLT5jYW5faWQgJiBDQU5fRUZGX0ZMQUcpCisJCW1zZy0+bXNnLnR4LmlkIHw9IGNwdV90b19sZTMyKEVTRF9FWFRJRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2YtPmNhbl9kbGM7IGkrKykKKwkJbXNnLT5tc2cudHguZGF0YVtpXSA9IGNmLT5kYXRhW2ldOworCisJbXNnLT5tc2cuaGRyLmxlbiArPSAoY2YtPmNhbl9kbGMgKyAzKSA+PiAyOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9VUkJTOyBpKyspIHsKKwkJaWYgKHByaXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPT0gTUFYX1RYX1VSQlMpIHsKKwkJCWNvbnRleHQgPSAmcHJpdi0+dHhfY29udGV4dHNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogVGhpcyBtYXkgbmV2ZXIgaGFwcGVuLgorCSAqLworCWlmICghY29udGV4dCkgeworCQlkZXZfd2FybihuZXRkZXYtPmRldi5wYXJlbnQsICJjb3VsZG4ndCBmaW5kIGZyZWUgY29udGV4dFxuIik7CisJCXJldCA9IE5FVERFVl9UWF9CVVNZOworCQlnb3RvIHJlbGVhc2VidWY7CisJfQorCisJY29udGV4dC0+cHJpdiA9IHByaXY7CisJY29udGV4dC0+ZWNob19pbmRleCA9IGk7CisJY29udGV4dC0+ZGxjID0gY2YtPmNhbl9kbGM7CisKKwkvKiBobmQgbXVzdCBub3QgYmUgMCAtIE1TQiBpcyBzdHJpcHBlZCBpbiB0eGRvbmUgaGFuZGxpbmcgKi8KKwltc2ctPm1zZy50eC5obmQgPSAweDgwMDAwMDAwIHwgaTsgLyogcmV0dXJuZWQgaW4gVFggZG9uZSBtZXNzYWdlICovCisKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIGRldi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwgMiksIGJ1ZiwKKwkJCSAgbXNnLT5tc2cuaGRyLmxlbiA8PCAyLAorCQkJICBlc2RfdXNiMl93cml0ZV9idWxrX2NhbGxiYWNrLCBjb250ZXh0KTsKKworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwl1c2JfYW5jaG9yX3VyYih1cmIsICZwcml2LT50eF9zdWJtaXR0ZWQpOworCisJY2FuX3B1dF9lY2hvX3NrYihza2IsIG5ldGRldiwgY29udGV4dC0+ZWNob19pbmRleCk7CisKKwlhdG9taWNfaW5jKCZwcml2LT5hY3RpdmVfdHhfam9icyk7CisKKwkvKiBTbG93IGRvd24gdHggcGF0aCAqLworCWlmIChhdG9taWNfcmVhZCgmcHJpdi0+YWN0aXZlX3R4X2pvYnMpID49IE1BWF9UWF9VUkJTKQorCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChlcnIpIHsKKwkJY2FuX2ZyZWVfZWNob19za2IobmV0ZGV2LCBjb250ZXh0LT5lY2hvX2luZGV4KTsKKworCQlhdG9taWNfZGVjKCZwcml2LT5hY3RpdmVfdHhfam9icyk7CisJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKKworCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCisJCWlmIChlcnIgPT0gLUVOT0RFVikKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwkJZWxzZQorCQkJZGV2X3dhcm4obmV0ZGV2LT5kZXYucGFyZW50LCAiZmFpbGVkIHR4X3VyYiAlZFxuIiwgZXJyKTsKKworCQlnb3RvIHJlbGVhc2VidWY7CisJfQorCisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKgorCSAqIFJlbGVhc2Ugb3VyIHJlZmVyZW5jZSB0byB0aGlzIFVSQiwgdGhlIFVTQiBjb3JlIHdpbGwgZXZlbnR1YWxseSBmcmVlCisJICogaXQgZW50aXJlbHkuCisJICovCisJdXNiX2ZyZWVfdXJiKHVyYik7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCityZWxlYXNlYnVmOgorCXVzYl9mcmVlX2NvaGVyZW50KGRldi0+dWRldiwgc2l6ZSwgYnVmLCB1cmItPnRyYW5zZmVyX2RtYSk7CisKK25vYnVmbWVtOgorCXVzYl9mcmVlX3VyYih1cmIpOworCitub3VyYm1lbToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVzZF91c2IyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZXNkX3VzYjJfbXNnIG1zZzsKKwlpbnQgaTsKKworCS8qIERpc2FibGUgYWxsIElEcyAoc2VlIGVzZF91c2IyX3N0YXJ0KCkpICovCisJbXNnLm1zZy5oZHIuY21kID0gQ01EX0lEQUREOworCW1zZy5tc2cuaGRyLmxlbiA9IDIgKyBFU0RfTUFYX0lEX1NFR01FTlQ7CisJbXNnLm1zZy5maWx0ZXIubmV0ID0gcHJpdi0+aW5kZXg7CisJbXNnLm1zZy5maWx0ZXIub3B0aW9uID0gRVNEX0lEX0VOQUJMRTsgLyogc3RhcnQgd2l0aCBzZWdtZW50IDAgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IEVTRF9NQVhfSURfU0VHTUVOVDsgaSsrKQorCQltc2cubXNnLmZpbHRlci5tYXNrW2ldID0gMDsKKwlpZiAoZXNkX3VzYjJfc2VuZF9tc2cocHJpdi0+dXNiMiwgJm1zZykgPCAwKQorCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwgInNlbmRpbmcgaWRhZGQgbWVzc2FnZSBmYWlsZWRcbiIpOworCisJLyogc2V0IENBTiBjb250cm9sbGVyIHRvIHJlc2V0IG1vZGUgKi8KKwltc2cubXNnLmhkci5sZW4gPSAyOworCW1zZy5tc2cuaGRyLmNtZCA9IENNRF9TRVRCQVVEOworCW1zZy5tc2cuc2V0YmF1ZC5uZXQgPSBwcml2LT5pbmRleDsKKwltc2cubXNnLnNldGJhdWQucnN2ZCA9IDA7CisJbXNnLm1zZy5zZXRiYXVkLmJhdWQgPSBjcHVfdG9fbGUzMihFU0RfVVNCMl9OT19CQVVEUkFURSk7CisJaWYgKGVzZF91c2IyX3NlbmRfbXNnKHByaXYtPnVzYjIsICZtc2cpIDwgMCkKKwkJZGV2X2VycihuZXRkZXYtPmRldi5wYXJlbnQsICJzZW5kaW5nIHNldGJhdWQgbWVzc2FnZSBmYWlsZWRcbiIpOworCisJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX1NUT1BQRUQ7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwljbG9zZV9jYW5kZXYobmV0ZGV2KTsKKworCXByaXYtPm9wZW5fdGltZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlc2RfdXNiMl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9IGVzZF91c2IyX29wZW4sCisJLm5kb19zdG9wID0gZXNkX3VzYjJfY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0gZXNkX3VzYjJfc3RhcnRfeG1pdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCBlc2RfdXNiMl9iaXR0aW1pbmdfY29uc3QgPSB7CisJLm5hbWUgPSAiZXNkX3VzYjIiLAorCS50c2VnMV9taW4gPSBFU0RfVVNCMl9UU0VHMV9NSU4sCisJLnRzZWcxX21heCA9IEVTRF9VU0IyX1RTRUcxX01BWCwKKwkudHNlZzJfbWluID0gRVNEX1VTQjJfVFNFRzJfTUlOLAorCS50c2VnMl9tYXggPSBFU0RfVVNCMl9UU0VHMl9NQVgsCisJLnNqd19tYXggPSBFU0RfVVNCMl9TSldfTUFYLAorCS5icnBfbWluID0gRVNEX1VTQjJfQlJQX01JTiwKKwkuYnJwX21heCA9IEVTRF9VU0IyX0JSUF9NQVgsCisJLmJycF9pbmMgPSBFU0RfVVNCMl9CUlBfSU5DLAorfTsKKworc3RhdGljIGludCBlc2RfdXNiMl9zZXRfYml0dGltaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgY2FuX2JpdHRpbWluZyAqYnQgPSAmcHJpdi0+Y2FuLmJpdHRpbWluZzsKKwlzdHJ1Y3QgZXNkX3VzYjJfbXNnIG1zZzsKKwl1MzIgY2FuYnRyOworCisJY2FuYnRyID0gRVNEX1VTQjJfVUJSOworCWNhbmJ0ciB8PSAoYnQtPmJycCAtIDEpICYgKEVTRF9VU0IyX0JSUF9NQVggLSAxKTsKKwljYW5idHIgfD0gKChidC0+c2p3IC0gMSkgJiAoRVNEX1VTQjJfU0pXX01BWCAtIDEpKQorCQk8PCBFU0RfVVNCMl9TSldfU0hJRlQ7CisJY2FuYnRyIHw9ICgoYnQtPnByb3Bfc2VnICsgYnQtPnBoYXNlX3NlZzEgLSAxKQorCQkgICAmIChFU0RfVVNCMl9UU0VHMV9NQVggLSAxKSkKKwkJPDwgRVNEX1VTQjJfVFNFRzFfU0hJRlQ7CisJY2FuYnRyIHw9ICgoYnQtPnBoYXNlX3NlZzIgLSAxKSAmIChFU0RfVVNCMl9UU0VHMl9NQVggLSAxKSkKKwkJPDwgRVNEX1VTQjJfVFNFRzJfU0hJRlQ7CisJaWYgKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV8zX1NBTVBMRVMpCisJCWNhbmJ0ciB8PSBFU0RfVVNCMl8zX1NBTVBMRVM7CisKKwltc2cubXNnLmhkci5sZW4gPSAyOworCW1zZy5tc2cuaGRyLmNtZCA9IENNRF9TRVRCQVVEOworCW1zZy5tc2cuc2V0YmF1ZC5uZXQgPSBwcml2LT5pbmRleDsKKwltc2cubXNnLnNldGJhdWQucnN2ZCA9IDA7CisJbXNnLm1zZy5zZXRiYXVkLmJhdWQgPSBjcHVfdG9fbGUzMihjYW5idHIpOworCisJZGV2X2luZm8obmV0ZGV2LT5kZXYucGFyZW50LCAic2V0dGluZyBCVFI9JSN4XG4iLCBjYW5idHIpOworCisJcmV0dXJuIGVzZF91c2IyX3NlbmRfbXNnKHByaXYtPnVzYjIsICZtc2cpOworfQorCitzdGF0aWMgaW50IGVzZF91c2IyX2dldF9iZXJyX2NvdW50ZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICAgIHN0cnVjdCBjYW5fYmVycl9jb3VudGVyICpiZWMpCit7CisJc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWJlYy0+dHhlcnIgPSBwcml2LT5iZWMudHhlcnI7CisJYmVjLT5yeGVyciA9IHByaXYtPmJlYy5yeGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzZF91c2IyX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGVudW0gY2FuX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3QgZXNkX3VzYjJfbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKCFwcml2LT5vcGVuX3RpbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDQU5fTU9ERV9TVEFSVDoKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc2RfdXNiMl9wcm9iZV9vbmVfbmV0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGVzZF91c2IyICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGVzZF91c2IyX25ldF9wcml2ICpwcml2OworCWludCBlcnIgPSAwOworCWludCBpOworCisJbmV0ZGV2ID0gYWxsb2NfY2FuZGV2KHNpemVvZigqcHJpdiksIE1BWF9UWF9VUkJTKTsKKwlpZiAoIW5ldGRldikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCBhbGxvYyBjYW5kZXZcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpbml0X3VzYl9hbmNob3IoJnByaXYtPnR4X3N1Ym1pdHRlZCk7CisJYXRvbWljX3NldCgmcHJpdi0+YWN0aXZlX3R4X2pvYnMsIDApOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9VUkJTOyBpKyspCisJCXByaXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBNQVhfVFhfVVJCUzsKKworCXByaXYtPnVzYjIgPSBkZXY7CisJcHJpdi0+bmV0ZGV2ID0gbmV0ZGV2OworCXByaXYtPmluZGV4ID0gaW5kZXg7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsKKwlwcml2LT5jYW4uY2xvY2suZnJlcSA9IEVTRF9VU0IyX0NBTl9DTE9DSzsKKwlwcml2LT5jYW4uYml0dGltaW5nX2NvbnN0ID0gJmVzZF91c2IyX2JpdHRpbWluZ19jb25zdDsKKwlwcml2LT5jYW4uZG9fc2V0X2JpdHRpbWluZyA9IGVzZF91c2IyX3NldF9iaXR0aW1pbmc7CisJcHJpdi0+Y2FuLmRvX3NldF9tb2RlID0gZXNkX3VzYjJfc2V0X21vZGU7CisJcHJpdi0+Y2FuLmRvX2dldF9iZXJyX2NvdW50ZXIgPSBlc2RfdXNiMl9nZXRfYmVycl9jb3VudGVyOworCXByaXYtPmNhbi5jdHJsbW9kZV9zdXBwb3J0ZWQgPSBDQU5fQ1RSTE1PREVfM19TQU1QTEVTOworCisJbmV0ZGV2LT5mbGFncyB8PSBJRkZfRUNITzsgLyogd2Ugc3VwcG9ydCBsb2NhbCBlY2hvICovCisKKwluZXRkZXYtPm5ldGRldl9vcHMgPSAmZXNkX3VzYjJfbmV0ZGV2X29wczsKKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJmludGYtPmRldik7CisKKwllcnIgPSByZWdpc3Rlcl9jYW5kZXYobmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJjb3VsZG4ndCByZWdpc3RlciBDQU4gZGV2aWNlOiAlZFxuIiwgZXJyKTsKKwkJZnJlZV9jYW5kZXYobmV0ZGV2KTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCWRldi0+bmV0c1tpbmRleF0gPSBwcml2OworCWRldl9pbmZvKG5ldGRldi0+ZGV2LnBhcmVudCwgImRldmljZSAlcyByZWdpc3RlcmVkXG4iLCBuZXRkZXYtPm5hbWUpOworCitkb25lOgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBwcm9iZSBmdW5jdGlvbiBmb3IgbmV3IFVTQjIgZGV2aWNlcworICoKKyAqIGNoZWNrIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIG51bWJlciBvZiBhdmFpbGFibGUKKyAqIENBTiBpbnRlcmZhY2VzCisgKi8KK3N0YXRpYyBpbnQgZXNkX3VzYjJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBlc2RfdXNiMiAqZGV2OworCXN0cnVjdCBlc2RfdXNiMl9tc2cgbXNnOworCWludCBpLCBlcnI7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCWRldi0+dWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlpbml0X3VzYl9hbmNob3IoJmRldi0+cnhfc3VibWl0dGVkKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKKworCS8qIHF1ZXJ5IG51bWJlciBvZiBDQU4gaW50ZXJmYWNlcyAobmV0cykgKi8KKwltc2cubXNnLmhkci5jbWQgPSBDTURfVkVSU0lPTjsKKwltc2cubXNnLmhkci5sZW4gPSAyOworCW1zZy5tc2cudmVyc2lvbi5yc3ZkID0gMDsKKwltc2cubXNnLnZlcnNpb24uZmxhZ3MgPSAwOworCW1zZy5tc2cudmVyc2lvbi5kcnZfdmVyc2lvbiA9IDA7CisKKwllcnIgPSBlc2RfdXNiMl9zZW5kX21zZyhkZXYsICZtc2cpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgInNlbmRpbmcgdmVyc2lvbiBtZXNzYWdlIGZhaWxlZFxuIik7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCisJZXJyID0gZXNkX3VzYjJfd2FpdF9tc2coZGV2LCAmbXNnKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJubyB2ZXJzaW9uIG1lc3NhZ2UgYW5zd2VyXG4iKTsKKwkJZ290byBmcmVlX2RldjsKKwl9CisKKwlkZXYtPm5ldF9jb3VudCA9IChpbnQpbXNnLm1zZy52ZXJzaW9uX3JlcGx5Lm5ldHM7CisJZGV2LT52ZXJzaW9uID0gbGUzMl90b19jcHUobXNnLm1zZy52ZXJzaW9uX3JlcGx5LnZlcnNpb24pOworCisJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfZmlybXdhcmUpKQorCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkiQ291bGRuJ3QgY3JlYXRlIGRldmljZSBmaWxlIGZvciBmaXJtd2FyZVxuIik7CisKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9oYXJkd2FyZSkpCisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJDb3VsZG4ndCBjcmVhdGUgZGV2aWNlIGZpbGUgZm9yIGhhcmR3YXJlXG4iKTsKKworCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX25ldHMpKQorCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkiQ291bGRuJ3QgY3JlYXRlIGRldmljZSBmaWxlIGZvciBuZXRzXG4iKTsKKworCS8qIGRvIHBlciBkZXZpY2UgcHJvYmluZyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5ldF9jb3VudDsgaSsrKQorCQllc2RfdXNiMl9wcm9iZV9vbmVfbmV0KGludGYsIGkpOworCisJcmV0dXJuIDA7CisKK2ZyZWVfZGV2OgorCWtmcmVlKGRldik7Citkb25lOgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbQorICovCitzdGF0aWMgdm9pZCBlc2RfdXNiMl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBlc2RfdXNiMiAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCWludCBpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9maXJtd2FyZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9oYXJkd2FyZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9uZXRzKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlpZiAoZGV2KSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5ldF9jb3VudDsgaSsrKSB7CisJCQlpZiAoZGV2LT5uZXRzW2ldKSB7CisJCQkJbmV0ZGV2ID0gZGV2LT5uZXRzW2ldLT5uZXRkZXY7CisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwkJCQlmcmVlX2NhbmRldihuZXRkZXYpOworCQkJfQorCQl9CisJCXVubGlua19hbGxfdXJicyhkZXYpOworCX0KK30KKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGVzZF91c2IyX2RyaXZlciA9IHsKKwkubmFtZSA9ICJlc2RfdXNiMiIsCisJLnByb2JlID0gZXNkX3VzYjJfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBlc2RfdXNiMl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IGVzZF91c2IyX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXNkX3VzYjJfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJZXJyID0gdXNiX3JlZ2lzdGVyKCZlc2RfdXNiMl9kcml2ZXIpOworCisJaWYgKGVycikgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGVzZF91c2IyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXNkX3VzYjJfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZlc2RfdXNiMl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZXNkX3VzYjJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKaW5kZXggMDRhMDNmNy4uMjhjODhlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwpAQCAtMTA3LDEyICsxMDcsNyBAQAogI2RlZmluZSBjYXNfcGFnZV91bm1hcCh4KSAgICBrdW5tYXBfYXRvbWljKCh4KSwgS01fU0tCX0RBVEFfU09GVElSUSkKICNkZWZpbmUgQ0FTX05DUFVTICAgICAgICAgICAgbnVtX29ubGluZV9jcHVzKCkKIAotI2lmZGVmIENPTkZJR19DQVNTSU5JX05BUEkKLSNkZWZpbmUgVVNFX05BUEkKLSNkZWZpbmUgY2FzX3NrYl9yZWxlYXNlKHgpICBuZXRpZl9yZWNlaXZlX3NrYih4KQotI2Vsc2UKICNkZWZpbmUgY2FzX3NrYl9yZWxlYXNlKHgpICBuZXRpZl9yeCh4KQotI2VuZGlmCiAKIC8qIHNlbGVjdCB3aGljaCBmaXJtd2FyZSB0byB1c2UgKi8KICNkZWZpbmUgVVNFX0hQX1dPUktBUk9VTkQKQEAgLTMwNjMsOSArMzA1OCw2IEBACiB7CiAJdW5zaWduZWQgY2hhciAqZSA9ICZjcC0+ZGV2LT5kZXZfYWRkclswXTsKIAlpbnQgaTsKLSNpZmRlZiBDT05GSUdfQ0FTU0lOSV9NVUxUSUNBU1RfUkVHX1dSSVRFCi0JdTMyIHJ4Y2ZnOwotI2VuZGlmCiAJY2FzX21hY19yZXNldChjcCk7CiAKIAkvKiBzZXR1cCBjb3JlIGFyYml0cmF0aW9uIHdlaWdodCByZWdpc3RlciAqLwpAQCAtMzEzMywyMyArMzEyNSw4IEBACiAJd3JpdGVsKDB4YzIwMCwgY3AtPnJlZ3MgKyBSRUdfTUFDX0FERFJOKDQzKSk7CiAJd3JpdGVsKDB4MDE4MCwgY3AtPnJlZ3MgKyBSRUdfTUFDX0FERFJOKDQ0KSk7CiAKLSNpZm5kZWYgQ09ORklHX0NBU1NJTklfTVVMVElDQVNUX1JFR19XUklURQogCWNwLT5tYWNfcnhfY2ZnID0gY2FzX3NldHVwX211bHRpY2FzdChjcCk7Ci0jZWxzZQotCS8qIFdUWjogRG8gd2hhdCBBZHJpYW4gZGlkIGluIGNhc19zZXRfbXVsdGljYXN0LiBEb2luZwotCSAqIGEgd3JpdGVsIGRvZXMgbm90IHNlZW0gdG8gYmUgbmVjZXNzYXJ5IGJlY2F1c2UgQ2Fzc2luaQotCSAqIHNlZW1zIHRvIHByZXNlcnZlIHRoZSBjb25maWd1cmF0aW9uIHdoZW4gd2UgZG8gdGhlIHJlc2V0LgotCSAqIElmIHRoZSBjaGlwIGlzIGluIHRyb3VibGUsIHRob3VnaCwgaXQgaXMgbm90IGNsZWFyIGlmIHdlCi0JICogY2FuIHJlYWxseSBjb3VudCBvbiB0aGlzIGJlaGF2aW9yLiBjYXNfc2V0X211bHRpY2FzdCB1c2VzCi0JICogc3Bpbl9sb2NrX2lycXNhdmUsIGJ1dCB3ZSBhcmUgY2FsbGVkIG9ubHkgaW4gY2FzX2luaXRfaHcgYW5kCi0JICogY2FzX2luaXRfaHcgaXMgcHJvdGVjdGVkIGJ5IGNhc19sb2NrX2FsbCwgd2hpY2ggY2FsbHMKLQkgKiBzcGluX2xvY2tfaXJxIChzbyBpdCBkb2Vzbid0IG5lZWQgdG8gc2F2ZSB0aGUgZmxhZ3MsIGFuZAotCSAqIHdlIHNob3VsZCBiZSBPSyBmb3IgdGhlIHdyaXRlbCwgYXMgdGhhdCBpcyB0aGUgb25seQotCSAqIGRpZmZlcmVuY2UpLgotCSAqLwotCWNwLT5tYWNfcnhfY2ZnID0gcnhjZmcgPSBjYXNfc2V0dXBfbXVsdGljYXN0KGNwKTsKLQl3cml0ZWwocnhjZmcsIGNwLT5yZWdzICsgUkVHX01BQ19SWF9DRkcpOwotI2VuZGlmCisKIAlzcGluX2xvY2soJmNwLT5zdGF0X2xvY2tbTl9UWF9SSU5HU10pOwogCWNhc19jbGVhcl9tYWNfZXJyKGNwKTsKIAlzcGluX3VubG9jaygmY3AtPnN0YXRfbG9ja1tOX1RYX1JJTkdTXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYXNzaW5pLmggYi9kcml2ZXJzL25ldC9jYXNzaW5pLmgKaW5kZXggZmQxN2EwMC4uZGJjNDc4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2Fzc2luaS5oCisrKyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuaApAQCAtMjg0NCwxMCArMjg0NCw2IEBACiAJYXRvbWljX3QJCXJlc2V0X3Rhc2tfcGVuZGluZ19hbGw7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19DQVNTSU5JX1FHRV9ERUJVRwotCWF0b21pY190IGludGVycnVwdF9zZWVuOyAvKiAxIGlmIGFueSBpbnRlcnJ1cHRzIGFyZSBnZXR0aW5nIHRocm91Z2ggKi8KLSNlbmRpZgotCiAJLyogTGluay1kb3duIHByb2JsZW0gd29ya2Fyb3VuZCAqLwogI2RlZmluZSBMSU5LX1RSQU5TSVRJT05fVU5LTk9XTiAJMAogI2RlZmluZSBMSU5LX1RSQU5TSVRJT05fT05fRkFJTFVSRSAJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKaW5kZXggMDM2YjJkZi4uMDkyZjMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oCkBAIC0yODYsNyArMjg2LDYgQEAKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbG9ja19tYzM7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgY2xvY2tfbWM0OwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIGVzcGlfbnBvcnRzOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGNsb2NrX2NzcGk7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgY2xvY2tfZWxtZXIwOwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIG1kaW9fbWRpZW47CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgbWRpb19tZGlpbnY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCmluZGV4IDUzYmRlMTUuLjU5OWQxNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCkBAIC0xODUsOSArMTg1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19DSEVMU0lPX1QxX0NPVUdBUgotI2luY2x1ZGUgImNzcGkuaCIKLSNlbmRpZgogI2lmZGVmIENPTkZJR19DSEVMU0lPX1QxXzFHCiAjaW5jbHVkZSAiZnBnYV9kZWZzLmgiCiAKQEAgLTI4MCw3ICsyNzcsNyBAQAogCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9QT1JUMF9NSTFfQ0ZHLCB2YWwpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV8xRykgfHwgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV9DT1VHQVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV8xRykKIC8qCiAgKiBFbG1lciBNSTEgTURJTyByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCiAgKi8KQEAgLTMxNyw3ICszMTQsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV8xRykgfHwgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV9DT1VHQVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ0hFTFNJT19UMV8xRykKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgbWkxX21kaW9fb3BzID0gewogCS5pbml0ID0gbWkxX21kaW9faW5pdCwKIAkucmVhZCA9IG1pMV9tZGlvX3JlYWQsCkBAIC03NTIsMzEgKzc0OSw2IEBACiAJCQkJCSBtb2RfZGV0ZWN0ID8gInJlbW92ZWQiIDogImluc2VydGVkIik7CiAJCX0KIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCi0JY2FzZSBDSEJUX0JPQVJEX0NPVUdBUjoKLQkJaWYgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPT0gMSkgewotCQkJaWYgKGNhdXNlICYgRUxNRVIwX0dQX0JJVDEpIHsgICAgICAgICAvKiBWaXRlc3NlIE1BQyAqLwotCQkJCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0WzBdLm1hYzsKLQkJCQltYWMtPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIobWFjKTsKLQkJCX0KLQkJCWlmIChjYXVzZSAmIEVMTUVSMF9HUF9CSVQ1KSB7ICAgICAvKiBYUEFLIE1PRF9ERVRFQ1QgKi8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBpLCBwb3J0X2JpdDsKLQotCQkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7Ci0JCQkJcG9ydF9iaXQgPSBpID8gaSArIDEgOiAwOwotCQkJCWlmICghKGNhdXNlICYgKDEgPDwgcG9ydF9iaXQpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlwaHkgPSBhZGFwdGVyLT5wb3J0W2ldLnBoeTsKLQkJCQlwaHlfY2F1c2UgPSBwaHktPm9wcy0+aW50ZXJydXB0X2hhbmRsZXIocGh5KTsKLQkJCQlpZiAocGh5X2NhdXNlICYgY3BoeV9jYXVzZV9saW5rX2NoYW5nZSkKLQkJCQkJdDFfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIGkpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotI2VuZGlmCiAJfQogCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsIGNhdXNlKTsKIAlyZXR1cm4gMDsKQEAgLTk1NSw3ICs5MjcsNiBAQAogCWNhc2UgQ0hCVF9CT0FSRF9OMTEwOgogCWNhc2UgQ0hCVF9CT0FSRF9OMjEwOgogCWNhc2UgQ0hCVF9CT0FSRF9DSFQyMTA6Ci0JY2FzZSBDSEJUX0JPQVJEX0NPVUdBUjoKIAkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOwogCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAweDgwMCk7CiAJCWJyZWFrOwpAQCAtMTAwNCwxMCArOTc1LDYgQEAKIAkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX01DNV9DT05GSUcpOwogCX0KIAotI2lmZGVmIENPTkZJR19DSEVMU0lPX1QxX0NPVUdBUgotCWlmIChhZGFwdGVyLT5jc3BpICYmIHQxX2NzcGlfaW5pdChhZGFwdGVyLT5jc3BpKSkKLQkJZ290byBvdXRfZXJyOwotI2VuZGlmCiAJaWYgKGFkYXB0ZXItPmVzcGkgJiYgdDFfZXNwaV9pbml0KGFkYXB0ZXItPmVzcGksIGJpLT5jaGlwX21hYywKIAkJCQkJICBiaS0+ZXNwaV9ucG9ydHMpKQogCQlnb3RvIG91dF9lcnI7CkBAIC0xMDYxLDEwICsxMDI4LDYgQEAKIAkJdDFfdHBfZGVzdHJveShhZGFwdGVyLT50cCk7CiAJaWYgKGFkYXB0ZXItPmVzcGkpCiAJCXQxX2VzcGlfZGVzdHJveShhZGFwdGVyLT5lc3BpKTsKLSNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV9DT1VHQVIKLQlpZiAoYWRhcHRlci0+Y3NwaSkKLQkJdDFfY3NwaV9kZXN0cm95KGFkYXB0ZXItPmNzcGkpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2xpbmtfY29uZmlnKHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMsCkBAIC0xMDg0LDE0ICsxMDQ3LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV9DT1VHQVIKLQlpZiAoYmktPmNsb2NrX2NzcGkgJiYgIShhZGFwdGVyLT5jc3BpID0gdDFfY3NwaV9jcmVhdGUoYWRhcHRlcikpKSB7Ci0JCXByX2VycigiJXM6IENTUEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAotCQkgICAgICAgYWRhcHRlci0+bmFtZSk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotI2VuZGlmCi0KIC8qCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaG9sZCB0aGUgU1cgc3RhdGUgb2YKICAqIHRoZSBUZXJtaW5hdG9yIEhXIG1vZHVsZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jbmljLmMgYi9kcml2ZXJzL25ldC9jbmljLmMKaW5kZXggODA0NzEyNi4uMDk2MTAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2NuaWMuYwpAQCAtNDAsOSArNDAsOSBAQAogCiAjaW5jbHVkZSAiY25pY19pZi5oIgogI2luY2x1ZGUgImJueDIuaCIKLSNpbmNsdWRlICJibngyeF9yZWcuaCIKLSNpbmNsdWRlICJibngyeF9md19kZWZzLmgiCi0jaW5jbHVkZSAiYm54MnhfaHNpLmgiCisjaW5jbHVkZSAiYm54MngvYm54MnhfcmVnLmgiCisjaW5jbHVkZSAiYm54MngvYm54MnhfZndfZGVmcy5oIgorI2luY2x1ZGUgImJueDJ4L2JueDJ4X2hzaS5oIgogI2luY2x1ZGUgIi4uL3Njc2kvYm54MmkvNTd4eF9pc2NzaV9jb25zdGFudHMuaCIKICNpbmNsdWRlICIuLi9zY3NpL2JueDJpLzU3eHhfaXNjc2lfaHNpLmgiCiAjaW5jbHVkZSAiY25pYy5oIgpAQCAtMjU3LDcgKzI1Nyw3IEBACiB7CiAJdTMyIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTQ1NJX1RCTF9TWjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGNwLT5tYXhfY2lkX3NwYWNlOyBpKyspIHsKIAkJaWYgKGNwLT5jdHhfdGJsW2ldLmNpZCA9PSBjaWQpIHsKIAkJCSpsNV9jaWQgPSBpOwogCQkJcmV0dXJuIDA7CkBAIC04MDQsNyArODA0LDcgQEAKIAljbmljX2ZyZWVfZG1hKGRldiwgJmNwLT5jb25uX2J1Zl9pbmZvKTsKIAljbmljX2ZyZWVfZG1hKGRldiwgJmNwLT5rd3FfaW5mbyk7CiAJY25pY19mcmVlX2RtYShkZXYsICZjcC0+a3dxXzE2X2RhdGFfaW5mbyk7Ci0JY25pY19mcmVlX2RtYShkZXYsICZjcC0+a2NxX2luZm8pOworCWNuaWNfZnJlZV9kbWEoZGV2LCAmY3AtPmtjcTEuZG1hKTsKIAlrZnJlZShjcC0+aXNjc2lfdGJsKTsKIAljcC0+aXNjc2lfdGJsID0gTlVMTDsKIAlrZnJlZShjcC0+Y3R4X3RibCk7CkBAIC04NjMsNiArODYzLDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY25pY19hbGxvY19rY3Eoc3RydWN0IGNuaWNfZGV2ICpkZXYsIHN0cnVjdCBrY3FfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyLCBpLCBpc19ibngyID0gMDsKKwlzdHJ1Y3Qga2NxZSAqKmtjcTsKKworCWlmICh0ZXN0X2JpdChDTklDX0ZfQk5YMl9DTEFTUywgJmRldi0+ZmxhZ3MpKQorCQlpc19ibngyID0gMTsKKworCWVyciA9IGNuaWNfYWxsb2NfZG1hKGRldiwgJmluZm8tPmRtYSwgS0NRX1BBR0VfQ05ULCBpc19ibngyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJa2NxID0gKHN0cnVjdCBrY3FlICoqKSBpbmZvLT5kbWEucGdfYXJyOworCWluZm8tPmtjcSA9IGtjcTsKKworCWlmIChpc19ibngyKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBLQ1FfUEFHRV9DTlQ7IGkrKykgeworCQlzdHJ1Y3QgYm54MnhfYmRfY2hhaW5fbmV4dCAqbmV4dCA9CisJCQkoc3RydWN0IGJueDJ4X2JkX2NoYWluX25leHQgKikgJmtjcVtpXVtNQVhfS0NRRV9DTlRdOworCQlpbnQgaiA9IGkgKyAxOworCisJCWlmIChqID49IEtDUV9QQUdFX0NOVCkKKwkJCWogPSAwOworCQluZXh0LT5hZGRyX2hpID0gKHU2NCkgaW5mby0+ZG1hLnBnX21hcF9hcnJbal0gPj4gMzI7CisJCW5leHQtPmFkZHJfbG8gPSBpbmZvLT5kbWEucGdfbWFwX2FycltqXSAmIDB4ZmZmZmZmZmY7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNuaWNfYWxsb2NfbDJfcmluZ3Moc3RydWN0IGNuaWNfZGV2ICpkZXYsIGludCBwYWdlcykKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKQEAgLTk1NCwxMCArOTg1LDkgQEAKIAkJZ290byBlcnJvcjsKIAljcC0+a3dxID0gKHN0cnVjdCBrd3FlICoqKSBjcC0+a3dxX2luZm8ucGdfYXJyOwogCi0JcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCAmY3AtPmtjcV9pbmZvLCBLQ1FfUEFHRV9DTlQsIDEpOworCXJldCA9IGNuaWNfYWxsb2Nfa2NxKGRldiwgJmNwLT5rY3ExKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwotCWNwLT5rY3EgPSAoc3RydWN0IGtjcWUgKiopIGNwLT5rY3FfaW5mby5wZ19hcnI7CiAKIAlyZXQgPSBjbmljX2FsbG9jX2NvbnRleHQoZGV2KTsKIAlpZiAocmV0KQpAQCAtOTgxLDE3ICsxMDExLDEwIEBACiBzdGF0aWMgaW50IGNuaWNfYWxsb2NfYm54MnhfY29udGV4dChzdHJ1Y3QgY25pY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKLQlzdHJ1Y3QgY25pY19ldGhfZGV2ICpldGhkZXYgPSBjcC0+ZXRoZGV2OwogCWludCBjdHhfYmxrX3NpemUgPSBjcC0+ZXRoZGV2LT5jdHhfYmxrX3NpemU7Ci0JaW50IHRvdGFsX21lbSwgYmxrcywgaSwgY2lkX3NwYWNlOworCWludCB0b3RhbF9tZW0sIGJsa3MsIGk7CiAKLQlpZiAoQk5YMlhfSVNDU0lfU1RBUlRfQ0lEIDwgZXRoZGV2LT5zdGFydGluZ19jaWQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2lkX3NwYWNlID0gTUFYX0lTQ1NJX1RCTF9TWiArCi0JCSAgICAoQk5YMlhfSVNDU0lfU1RBUlRfQ0lEIC0gZXRoZGV2LT5zdGFydGluZ19jaWQpOwotCi0JdG90YWxfbWVtID0gQk5YMlhfQ09OVEVYVF9NRU1fU0laRSAqIGNpZF9zcGFjZTsKKwl0b3RhbF9tZW0gPSBCTlgyWF9DT05URVhUX01FTV9TSVpFICogY3AtPm1heF9jaWRfc3BhY2U7CiAJYmxrcyA9IHRvdGFsX21lbSAvIGN0eF9ibGtfc2l6ZTsKIAlpZiAodG90YWxfbWVtICUgY3R4X2Jsa19zaXplKQogCQlibGtzKys7CkBAIC0xMDM1LDE2ICsxMDU4LDI3IEBACiBzdGF0aWMgaW50IGNuaWNfYWxsb2NfYm54MnhfcmVzYyhzdHJ1Y3QgY25pY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwlzdHJ1Y3QgY25pY19ldGhfZGV2ICpldGhkZXYgPSBjcC0+ZXRoZGV2OworCXUzMiBzdGFydF9jaWQgPSBldGhkZXYtPnN0YXJ0aW5nX2NpZDsKIAlpbnQgaSwgaiwgbiwgcmV0LCBwYWdlczsKIAlzdHJ1Y3QgY25pY19kbWEgKmt3cV8xNl9kbWEgPSAmY3AtPmt3cV8xNl9kYXRhX2luZm87CiAKKwljcC0+bWF4X2NpZF9zcGFjZSA9IE1BWF9JU0NTSV9UQkxfU1o7CisJY3AtPmlzY3NpX3N0YXJ0X2NpZCA9IHN0YXJ0X2NpZDsKKwlpZiAoc3RhcnRfY2lkIDwgQk5YMlhfSVNDU0lfU1RBUlRfQ0lEKSB7CisJCXUzMiBkZWx0YSA9IEJOWDJYX0lTQ1NJX1NUQVJUX0NJRCAtIHN0YXJ0X2NpZDsKKworCQljcC0+aXNjc2lfc3RhcnRfY2lkID0gQk5YMlhfSVNDU0lfU1RBUlRfQ0lEOworCQljcC0+bWF4X2NpZF9zcGFjZSArPSBkZWx0YTsKKwl9CisKIAljcC0+aXNjc2lfdGJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNuaWNfaXNjc2kpICogTUFYX0lTQ1NJX1RCTF9TWiwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWNwLT5pc2NzaV90YmwpCiAJCWdvdG8gZXJyb3I7CiAKIAljcC0+Y3R4X3RibCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbmljX2NvbnRleHQpICoKLQkJCQkgIE1BWF9DTklDX0w1X0NPTlRFWFQsIEdGUF9LRVJORUwpOworCQkJCWNwLT5tYXhfY2lkX3NwYWNlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNwLT5jdHhfdGJsKQogCQlnb3RvIGVycm9yOwogCkBAIC0xMDUzLDcgKzEwODcsNyBAQAogCQljcC0+Y3R4X3RibFtpXS51bHBfcHJvdG9faWQgPSBDTklDX1VMUF9JU0NTSTsKIAl9CiAKLQlwYWdlcyA9IFBBR0VfQUxJR04oTUFYX0NOSUNfTDVfQ09OVEVYVCAqIENOSUNfS1dRMTZfREFUQV9TSVpFKSAvCisJcGFnZXMgPSBQQUdFX0FMSUdOKGNwLT5tYXhfY2lkX3NwYWNlICogQ05JQ19LV1ExNl9EQVRBX1NJWkUpIC8KIAkJUEFHRV9TSVpFOwogCiAJcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCBrd3FfMTZfZG1hLCBwYWdlcywgMCk7CkBAIC0xMDYxLDcgKzEwOTUsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCW4gPSBQQUdFX1NJWkUgLyBDTklDX0tXUTE2X0RBVEFfU0laRTsKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE1BWF9JU0NTSV9UQkxfU1o7IGkrKykgeworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgY3AtPm1heF9jaWRfc3BhY2U7IGkrKykgewogCQlsb25nIG9mZiA9IENOSUNfS1dRMTZfREFUQV9TSVpFICogKGkgJSBuKTsKIAogCQljcC0+Y3R4X3RibFtpXS5rd3FlX2RhdGEgPSBrd3FfMTZfZG1hLT5wZ19hcnJbal0gKyBvZmY7CkBAIC0xMDcyLDIyICsxMTA2LDkgQEAKIAkJCWorKzsKIAl9CiAKLQlyZXQgPSBjbmljX2FsbG9jX2RtYShkZXYsICZjcC0+a2NxX2luZm8sIEtDUV9QQUdFX0NOVCwgMCk7CisJcmV0ID0gY25pY19hbGxvY19rY3EoZGV2LCAmY3AtPmtjcTEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7Ci0JY3AtPmtjcSA9IChzdHJ1Y3Qga2NxZSAqKikgY3AtPmtjcV9pbmZvLnBnX2FycjsKLQotCWZvciAoaSA9IDA7IGkgPCBLQ1FfUEFHRV9DTlQ7IGkrKykgewotCQlzdHJ1Y3QgYm54MnhfYmRfY2hhaW5fbmV4dCAqbmV4dCA9Ci0JCQkoc3RydWN0IGJueDJ4X2JkX2NoYWluX25leHQgKikKLQkJCSZjcC0+a2NxW2ldW01BWF9LQ1FFX0NOVF07Ci0JCWludCBqID0gaSArIDE7Ci0KLQkJaWYgKGogPj0gS0NRX1BBR0VfQ05UKQotCQkJaiA9IDA7Ci0JCW5leHQtPmFkZHJfaGkgPSAodTY0KSBjcC0+a2NxX2luZm8ucGdfbWFwX2FycltqXSA+PiAzMjsKLQkJbmV4dC0+YWRkcl9sbyA9IGNwLT5rY3FfaW5mby5wZ19tYXBfYXJyW2pdICYgMHhmZmZmZmZmZjsKLQl9CiAKIAlwYWdlcyA9IFBBR0VfQUxJR04oQk5YMlhfSVNDU0lfTlVNX0NPTk5FQ1RJT05TICoKIAkJCSAgIEJOWDJYX0lTQ1NJX0NPTk5fQlVGX1NJWkUpIC8gUEFHRV9TSVpFOwpAQCAtMjEyMCwxOCArMjE0MSwyMCBAQAogCXJldHVybiBpZHg7CiB9CiAKLXN0YXRpYyBpbnQgY25pY19nZXRfa2NxZXMoc3RydWN0IGNuaWNfZGV2ICpkZXYsIHUxNiBod19wcm9kLCB1MTYgKnN3X3Byb2QpCitzdGF0aWMgaW50IGNuaWNfZ2V0X2tjcWVzKHN0cnVjdCBjbmljX2RldiAqZGV2LCBzdHJ1Y3Qga2NxX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNuaWNfbG9jYWwgKmNwID0gZGV2LT5jbmljX3ByaXY7Ci0JdTE2IGksIHJpLCBsYXN0OworCXUxNiBpLCByaSwgaHdfcHJvZCwgbGFzdDsKIAlzdHJ1Y3Qga2NxZSAqa2NxZTsKIAlpbnQga2NxZV9jbnQgPSAwLCBsYXN0X2NudCA9IDA7CiAKLQlpID0gcmkgPSBsYXN0ID0gKnN3X3Byb2Q7CisJaSA9IHJpID0gbGFzdCA9IGluZm8tPnN3X3Byb2RfaWR4OwogCXJpICY9IE1BWF9LQ1FfSURYOworCWh3X3Byb2QgPSAqaW5mby0+aHdfcHJvZF9pZHhfcHRyOworCWh3X3Byb2QgPSBjcC0+aHdfaWR4KGh3X3Byb2QpOwogCiAJd2hpbGUgKChpICE9IGh3X3Byb2QpICYmIChrY3FlX2NudCA8IE1BWF9DT01QTEVURURfS0NRRSkpIHsKLQkJa2NxZSA9ICZjcC0+a2NxW0tDUV9QRyhyaSldW0tDUV9JRFgocmkpXTsKKwkJa2NxZSA9ICZpbmZvLT5rY3FbS0NRX1BHKHJpKV1bS0NRX0lEWChyaSldOwogCQljcC0+Y29tcGxldGVkX2tjcVtrY3FlX2NudCsrXSA9IGtjcWU7CiAJCWkgPSBjcC0+bmV4dF9pZHgoaSk7CiAJCXJpID0gaSAmIE1BWF9LQ1FfSURYOwpAQCAtMjE0MSw3ICsyMTY0LDcgQEAKIAkJfQogCX0KIAotCSpzd19wcm9kID0gbGFzdDsKKwlpbmZvLT5zd19wcm9kX2lkeCA9IGxhc3Q7CiAJcmV0dXJuIGxhc3RfY250OwogfQogCkBAIC0yMTg0LDYgKzIyMDcsOSBAQAogCXUxNiB0eF9jb25zID0gKmNwLT50eF9jb25zX3B0cjsKIAlpbnQgY29tcCA9IDA7CiAKKwlpZiAoIXRlc3RfYml0KENOSUNfRl9DTklDX1VQLCAmY3AtPmRldi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKIAlpZiAoY3AtPnR4X2NvbnMgIT0gdHhfY29ucyB8fCBjcC0+cnhfY29ucyAhPSByeF9jb25zKSB7CiAJCWlmICh0ZXN0X2JpdChDTklDX0xDTF9GTF9MMl9XQUlULCAmY3AtPmNuaWNfbG9jYWxfZmxhZ3MpKQogCQkJY29tcCA9IGNuaWNfbDJfY29tcGxldGlvbihjcCk7CkBAIC0yMTk3LDEwMyArMjIyMyw3OSBAQAogCQljbGVhcl9iaXQoQ05JQ19MQ0xfRkxfTDJfV0FJVCwgJmNwLT5jbmljX2xvY2FsX2ZsYWdzKTsKIH0KIAotc3RhdGljIGludCBjbmljX3NlcnZpY2VfYm54Mih2b2lkICpkYXRhLCB2b2lkICpzdGF0dXNfYmxrKQorc3RhdGljIHUzMiBjbmljX3NlcnZpY2VfYm54Ml9xdWV1ZXMoc3RydWN0IGNuaWNfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGNuaWNfZGV2ICpkZXYgPSBkYXRhOwotCXN0cnVjdCBzdGF0dXNfYmxvY2sgKnNibGsgPSBzdGF0dXNfYmxrOwogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwotCXUzMiBzdGF0dXNfaWR4ID0gc2Jsay0+c3RhdHVzX2lkeDsKLQl1MTYgaHdfcHJvZCwgc3dfcHJvZDsKKwl1MzIgc3RhdHVzX2lkeCA9ICh1MTYpICpjcC0+a2NxMS5zdGF0dXNfaWR4X3B0cjsKIAlpbnQga2NxZV9jbnQ7CiAKLQlpZiAodW5saWtlbHkoIXRlc3RfYml0KENOSUNfRl9DTklDX1VQLCAmZGV2LT5mbGFncykpKQotCQlyZXR1cm4gc3RhdHVzX2lkeDsKLQogCWNwLT5rd3FfY29uX2lkeCA9ICpjcC0+a3dxX2Nvbl9pZHhfcHRyOwogCi0JaHdfcHJvZCA9IHNibGstPnN0YXR1c19jb21wbGV0aW9uX3Byb2R1Y2VyX2luZGV4OwotCXN3X3Byb2QgPSBjcC0+a2NxX3Byb2RfaWR4OwotCXdoaWxlIChzd19wcm9kICE9IGh3X3Byb2QpIHsKLQkJa2NxZV9jbnQgPSBjbmljX2dldF9rY3FlcyhkZXYsIGh3X3Byb2QsICZzd19wcm9kKTsKLQkJaWYgKGtjcWVfY250ID09IDApCi0JCQlnb3RvIGRvbmU7CisJd2hpbGUgKChrY3FlX2NudCA9IGNuaWNfZ2V0X2tjcWVzKGRldiwgJmNwLT5rY3ExKSkpIHsKIAogCQlzZXJ2aWNlX2tjcWVzKGRldiwga2NxZV9jbnQpOwogCiAJCS8qIFRlbGwgY29tcGlsZXIgdGhhdCBzdGF0dXNfYmxrIGZpZWxkcyBjYW4gY2hhbmdlLiAqLwogCQliYXJyaWVyKCk7Ci0JCWlmIChzdGF0dXNfaWR4ICE9IHNibGstPnN0YXR1c19pZHgpIHsKLQkJCXN0YXR1c19pZHggPSBzYmxrLT5zdGF0dXNfaWR4OworCQlpZiAoc3RhdHVzX2lkeCAhPSAqY3AtPmtjcTEuc3RhdHVzX2lkeF9wdHIpIHsKKwkJCXN0YXR1c19pZHggPSAodTE2KSAqY3AtPmtjcTEuc3RhdHVzX2lkeF9wdHI7CiAJCQljcC0+a3dxX2Nvbl9pZHggPSAqY3AtPmt3cV9jb25faWR4X3B0cjsKLQkJCWh3X3Byb2QgPSBzYmxrLT5zdGF0dXNfY29tcGxldGlvbl9wcm9kdWNlcl9pbmRleDsKIAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CiAKLWRvbmU6Ci0JQ05JQ19XUjE2KGRldiwgY3AtPmtjcV9pb19hZGRyLCBzd19wcm9kKTsKLQotCWNwLT5rY3FfcHJvZF9pZHggPSBzd19wcm9kOworCUNOSUNfV1IxNihkZXYsIGNwLT5rY3ExLmlvX2FkZHIsIGNwLT5rY3ExLnN3X3Byb2RfaWR4KTsKIAogCWNuaWNfY2hrX3BrdF9yaW5ncyhjcCk7CisKIAlyZXR1cm4gc3RhdHVzX2lkeDsKIH0KIAorc3RhdGljIGludCBjbmljX3NlcnZpY2VfYm54Mih2b2lkICpkYXRhLCB2b2lkICpzdGF0dXNfYmxrKQoreworCXN0cnVjdCBjbmljX2RldiAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwl1MzIgc3RhdHVzX2lkeCA9ICpjcC0+a2NxMS5zdGF0dXNfaWR4X3B0cjsKKworCWlmICh1bmxpa2VseSghdGVzdF9iaXQoQ05JQ19GX0NOSUNfVVAsICZkZXYtPmZsYWdzKSkpCisJCXJldHVybiBzdGF0dXNfaWR4OworCisJcmV0dXJuIGNuaWNfc2VydmljZV9ibngyX3F1ZXVlcyhkZXYpOworfQorCiBzdGF0aWMgdm9pZCBjbmljX3NlcnZpY2VfYm54Ml9tc2l4KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgY25pY19kZXYgKmRldiA9IChzdHJ1Y3QgY25pY19kZXYgKikgZGF0YTsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKLQlzdHJ1Y3Qgc3RhdHVzX2Jsb2NrX21zaXggKnN0YXR1c19ibGsgPSBjcC0+c3RhdHVzX2Jsay5ibngyOwotCXUzMiBzdGF0dXNfaWR4ID0gc3RhdHVzX2Jsay0+c3RhdHVzX2lkeDsKLQl1MTYgaHdfcHJvZCwgc3dfcHJvZDsKLQlpbnQga2NxZV9jbnQ7CiAKLQljcC0+a3dxX2Nvbl9pZHggPSBzdGF0dXNfYmxrLT5zdGF0dXNfY21kX2NvbnN1bWVyX2luZGV4OworCWNwLT5sYXN0X3N0YXR1c19pZHggPSBjbmljX3NlcnZpY2VfYm54Ml9xdWV1ZXMoZGV2KTsKIAotCWh3X3Byb2QgPSBzdGF0dXNfYmxrLT5zdGF0dXNfY29tcGxldGlvbl9wcm9kdWNlcl9pbmRleDsKLQlzd19wcm9kID0gY3AtPmtjcV9wcm9kX2lkeDsKLQl3aGlsZSAoc3dfcHJvZCAhPSBod19wcm9kKSB7Ci0JCWtjcWVfY250ID0gY25pY19nZXRfa2NxZXMoZGV2LCBod19wcm9kLCAmc3dfcHJvZCk7Ci0JCWlmIChrY3FlX2NudCA9PSAwKQotCQkJZ290byBkb25lOwotCi0JCXNlcnZpY2Vfa2NxZXMoZGV2LCBrY3FlX2NudCk7Ci0KLQkJLyogVGVsbCBjb21waWxlciB0aGF0IHN0YXR1c19ibGsgZmllbGRzIGNhbiBjaGFuZ2UuICovCi0JCWJhcnJpZXIoKTsKLQkJaWYgKHN0YXR1c19pZHggIT0gc3RhdHVzX2Jsay0+c3RhdHVzX2lkeCkgewotCQkJc3RhdHVzX2lkeCA9IHN0YXR1c19ibGstPnN0YXR1c19pZHg7Ci0JCQljcC0+a3dxX2Nvbl9pZHggPSBzdGF0dXNfYmxrLT5zdGF0dXNfY21kX2NvbnN1bWVyX2luZGV4OwotCQkJaHdfcHJvZCA9IHN0YXR1c19ibGstPnN0YXR1c19jb21wbGV0aW9uX3Byb2R1Y2VyX2luZGV4OwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCX0KLQotZG9uZToKLQlDTklDX1dSMTYoZGV2LCBjcC0+a2NxX2lvX2FkZHIsIHN3X3Byb2QpOwotCWNwLT5rY3FfcHJvZF9pZHggPSBzd19wcm9kOwotCi0JY25pY19jaGtfcGt0X3JpbmdzKGNwKTsKLQotCWNwLT5sYXN0X3N0YXR1c19pZHggPSBzdGF0dXNfaWR4OwogCUNOSUNfV1IoZGV2LCBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRCwgY3AtPmludF9udW0gfAogCQlCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9JTkRFWF9WQUxJRCB8IGNwLT5sYXN0X3N0YXR1c19pZHgpOwogfQogCitzdGF0aWMgdm9pZCBjbmljX2RvaXJxKHN0cnVjdCBjbmljX2RldiAqZGV2KQoreworCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OworCXUxNiBwcm9kID0gY3AtPmtjcTEuc3dfcHJvZF9pZHggJiBNQVhfS0NRX0lEWDsKKworCWlmIChsaWtlbHkodGVzdF9iaXQoQ05JQ19GX0NOSUNfVVAsICZkZXYtPmZsYWdzKSkpIHsKKwkJcHJlZmV0Y2goY3AtPnN0YXR1c19ibGsuZ2VuKTsKKwkJcHJlZmV0Y2goJmNwLT5rY3ExLmtjcVtLQ1FfUEcocHJvZCldW0tDUV9JRFgocHJvZCldKTsKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZjcC0+Y25pY19pcnFfdGFzayk7CisJfQorfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgY25pY19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewogCXN0cnVjdCBjbmljX2RldiAqZGV2ID0gZGV2X2luc3RhbmNlOwogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwotCXUxNiBwcm9kID0gY3AtPmtjcV9wcm9kX2lkeCAmIE1BWF9LQ1FfSURYOwogCiAJaWYgKGNwLT5hY2tfaW50KQogCQljcC0+YWNrX2ludChkZXYpOwogCi0JcHJlZmV0Y2goY3AtPnN0YXR1c19ibGsuZ2VuKTsKLQlwcmVmZXRjaCgmY3AtPmtjcVtLQ1FfUEcocHJvZCldW0tDUV9JRFgocHJvZCldKTsKLQotCWlmIChsaWtlbHkodGVzdF9iaXQoQ05JQ19GX0NOSUNfVVAsICZkZXYtPmZsYWdzKSkpCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmNwLT5jbmljX2lycV90YXNrKTsKKwljbmljX2RvaXJxKGRldik7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0yMzI0LDYwICsyMzI2LDUwIEBACiAJCQkgICBJR1VfSU5UX0RJU0FCTEUsIDApOwogfQogCi1zdGF0aWMgdm9pZCBjbmljX3NlcnZpY2VfYm54MnhfYmgodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHUzMiBjbmljX3NlcnZpY2VfYm54Mnhfa2NxKHN0cnVjdCBjbmljX2RldiAqZGV2LCBzdHJ1Y3Qga2NxX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGNuaWNfZGV2ICpkZXYgPSAoc3RydWN0IGNuaWNfZGV2ICopIGRhdGE7Ci0Jc3RydWN0IGNuaWNfbG9jYWwgKmNwID0gZGV2LT5jbmljX3ByaXY7Ci0JdTE2IGh3X3Byb2QsIHN3X3Byb2Q7Ci0Jc3RydWN0IGNzdG9ybV9zdGF0dXNfYmxvY2tfYyAqc2JsayA9Ci0JCSZjcC0+c3RhdHVzX2Jsay5ibngyeC0+Y19zdGF0dXNfYmxvY2s7Ci0JdTMyIHN0YXR1c19pZHggPSBzYmxrLT5zdGF0dXNfYmxvY2tfaW5kZXg7CisJdTMyIGxhc3Rfc3RhdHVzID0gKmluZm8tPnN0YXR1c19pZHhfcHRyOwogCWludCBrY3FlX2NudDsKIAotCWlmICh1bmxpa2VseSghdGVzdF9iaXQoQ05JQ19GX0NOSUNfVVAsICZkZXYtPmZsYWdzKSkpCi0JCXJldHVybjsKLQotCWh3X3Byb2QgPSBzYmxrLT5pbmRleF92YWx1ZXNbSENfSU5ERVhfQ19JU0NTSV9FUV9DT05TXTsKLQlod19wcm9kID0gY3AtPmh3X2lkeChod19wcm9kKTsKLQlzd19wcm9kID0gY3AtPmtjcV9wcm9kX2lkeDsKLQl3aGlsZSAoc3dfcHJvZCAhPSBod19wcm9kKSB7Ci0JCWtjcWVfY250ID0gY25pY19nZXRfa2NxZXMoZGV2LCBod19wcm9kLCAmc3dfcHJvZCk7Ci0JCWlmIChrY3FlX2NudCA9PSAwKQotCQkJZ290byBkb25lOworCXdoaWxlICgoa2NxZV9jbnQgPSBjbmljX2dldF9rY3FlcyhkZXYsIGluZm8pKSkgewogCiAJCXNlcnZpY2Vfa2NxZXMoZGV2LCBrY3FlX2NudCk7CiAKIAkJLyogVGVsbCBjb21waWxlciB0aGF0IHNibGsgZmllbGRzIGNhbiBjaGFuZ2UuICovCiAJCWJhcnJpZXIoKTsKLQkJaWYgKHN0YXR1c19pZHggPT0gc2Jsay0+c3RhdHVzX2Jsb2NrX2luZGV4KQorCQlpZiAobGFzdF9zdGF0dXMgPT0gKmluZm8tPnN0YXR1c19pZHhfcHRyKQogCQkJYnJlYWs7CiAKLQkJc3RhdHVzX2lkeCA9IHNibGstPnN0YXR1c19ibG9ja19pbmRleDsKLQkJaHdfcHJvZCA9IHNibGstPmluZGV4X3ZhbHVlc1tIQ19JTkRFWF9DX0lTQ1NJX0VRX0NPTlNdOwotCQlod19wcm9kID0gY3AtPmh3X2lkeChod19wcm9kKTsKKwkJbGFzdF9zdGF0dXMgPSAqaW5mby0+c3RhdHVzX2lkeF9wdHI7CiAJfQorCXJldHVybiBsYXN0X3N0YXR1czsKK30KIAotZG9uZToKLQlDTklDX1dSMTYoZGV2LCBjcC0+a2NxX2lvX2FkZHIsIHN3X3Byb2QgKyBNQVhfS0NRX0lEWCk7CitzdGF0aWMgdm9pZCBjbmljX3NlcnZpY2VfYm54MnhfYmgodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjbmljX2RldiAqZGV2ID0gKHN0cnVjdCBjbmljX2RldiAqKSBkYXRhOworCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OworCXUzMiBzdGF0dXNfaWR4OworCisJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChDTklDX0ZfQ05JQ19VUCwgJmRldi0+ZmxhZ3MpKSkKKwkJcmV0dXJuOworCisJc3RhdHVzX2lkeCA9IGNuaWNfc2VydmljZV9ibngyeF9rY3EoZGV2LCAmY3AtPmtjcTEpOworCisJQ05JQ19XUjE2KGRldiwgY3AtPmtjcTEuaW9fYWRkciwgY3AtPmtjcTEuc3dfcHJvZF9pZHggKyBNQVhfS0NRX0lEWCk7CiAJY25pY19hY2tfYm54MnhfaW50KGRldiwgY3AtPnN0YXR1c19ibGtfbnVtLCBDU1RPUk1fSUQsCiAJCQkgICBzdGF0dXNfaWR4LCBJR1VfSU5UX0VOQUJMRSwgMSk7Ci0KLQljcC0+a2NxX3Byb2RfaWR4ID0gc3dfcHJvZDsKIH0KIAogc3RhdGljIGludCBjbmljX3NlcnZpY2VfYm54Mngodm9pZCAqZGF0YSwgdm9pZCAqc3RhdHVzX2JsaykKIHsKIAlzdHJ1Y3QgY25pY19kZXYgKmRldiA9IGRhdGE7CiAJc3RydWN0IGNuaWNfbG9jYWwgKmNwID0gZGV2LT5jbmljX3ByaXY7Ci0JdTE2IHByb2QgPSBjcC0+a2NxX3Byb2RfaWR4ICYgTUFYX0tDUV9JRFg7CiAKLQlpZiAobGlrZWx5KHRlc3RfYml0KENOSUNfRl9DTklDX1VQLCAmZGV2LT5mbGFncykpKSB7Ci0JCXByZWZldGNoKGNwLT5zdGF0dXNfYmxrLmJueDJ4KTsKLQkJcHJlZmV0Y2goJmNwLT5rY3FbS0NRX1BHKHByb2QpXVtLQ1FfSURYKHByb2QpXSk7CisJaWYgKCEoY3AtPmV0aGRldi0+ZHJ2X3N0YXRlICYgQ05JQ19EUlZfU1RBVEVfVVNJTkdfTVNJWCkpCisJCWNuaWNfZG9pcnEoZGV2KTsKIAotCQl0YXNrbGV0X3NjaGVkdWxlKCZjcC0+Y25pY19pcnFfdGFzayk7Ci0JCWNuaWNfY2hrX3BrdF9yaW5ncyhjcCk7Ci0JfQorCWNuaWNfY2hrX3BrdF9yaW5ncyhjcCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4MjQsNyArMjgxNiw3IEBACiAKIAllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KCZpbml0X25ldCwgJnJ0LCAmZmwpOwogCWlmICghZXJyKQotCQkqZHN0ID0gJnJ0LT51LmRzdDsKKwkJKmRzdCA9ICZydC0+ZHN0OwogCXJldHVybiBlcnI7CiAjZWxzZQogCXJldHVybiAtRU5FVFVOUkVBQ0g7CkBAIC0yOTk2LDcgKzI5ODgsNyBAQAogc3RhdGljIGludCBjbmljX2NtX2Fib3J0KHN0cnVjdCBjbmljX3NvY2sgKmNzaykKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBjc2stPmRldi0+Y25pY19wcml2OwotCXUzMiBvcGNvZGU7CisJdTMyIG9wY29kZSA9IEw0X0tDUUVfT1BDT0RFX1ZBTFVFX1JFU0VUX0NPTVA7CiAKIAlpZiAoIWNuaWNfaW5fdXNlKGNzaykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzAwOCwxMiArMzAwMCw5IEBACiAJICogY29ubmVjdCB3YXMgbm90IHN1Y2Nlc3NmdWwuCiAJICovCiAKLQljc2stPnN0YXRlID0gTDRfS0NRRV9PUENPREVfVkFMVUVfUkVTRVRfQ09NUDsKLQlpZiAodGVzdF9iaXQoU0tfRl9QR19PRkZMRF9DT01QTEVURSwgJmNzay0+ZmxhZ3MpKQotCQlvcGNvZGUgPSBjc2stPnN0YXRlOwotCWVsc2UKLQkJb3Bjb2RlID0gTDVDTV9SQU1ST0RfQ01EX0lEX1RFUk1JTkFURV9PRkZMT0FEOwogCWNwLT5jbG9zZV9jb25uKGNzaywgb3Bjb2RlKTsKKwlpZiAoY3NrLT5zdGF0ZSAhPSBvcGNvZGUpCisJCXJldHVybiAtRUFMUkVBRFk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwMjYsNiArMzAxNSw4IEBACiAJaWYgKGNuaWNfY2xvc2VfcHJlcChjc2spKSB7CiAJCWNzay0+c3RhdGUgPSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9DTE9TRV9DT01QOwogCQlyZXR1cm4gY25pY19jbV9jbG9zZV9yZXEoY3NrKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVBTFJFQURZOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMxNDEsMTIgKzMxMzIsNiBAQAogCQlicmVhazsKIAogCWNhc2UgTDRfS0NRRV9PUENPREVfVkFMVUVfUkVTRVRfUkVDRUlWRUQ6Ci0JCWlmICh0ZXN0X2JpdChDTklDX0ZfQk5YMl9DTEFTUywgJmRldi0+ZmxhZ3MpKSB7Ci0JCQljbmljX2NtX3VwY2FsbChjcCwgY3NrLCBvcGNvZGUpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNLX0ZfT0ZGTERfQ09NUExFVEUsICZjc2stPmZsYWdzKSkKLQkJCWNzay0+c3RhdGUgPSBvcGNvZGU7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgTDRfS0NRRV9PUENPREVfVkFMVUVfQ0xPU0VfQ09NUDoKIAljYXNlIEw0X0tDUUVfT1BDT0RFX1ZBTFVFX1JFU0VUX0NPTVA6CiAJY2FzZSBMNUNNX1JBTVJPRF9DTURfSURfU0VBUkNIRVJfREVMRVRFOgpAQCAtMzIwMiwxOSArMzE4NywyMiBAQAogCiBzdGF0aWMgaW50IGNuaWNfcmVhZHlfdG9fY2xvc2Uoc3RydWN0IGNuaWNfc29jayAqY3NrLCB1MzIgb3Bjb2RlKQogewotCWlmICgob3Bjb2RlID09IGNzay0+c3RhdGUpIHx8Ci0JICAgIChvcGNvZGUgPT0gTDRfS0NRRV9PUENPREVfVkFMVUVfUkVTRVRfUkVDRUlWRUQgJiYKLQkgICAgIGNzay0+c3RhdGUgPT0gTDRfS0NRRV9PUENPREVfVkFMVUVfQ0xPU0VfQ09NUCkpIHsKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNLX0ZfQ0xPU0lORywgJmNzay0+ZmxhZ3MpKQotCQkJcmV0dXJuIDE7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTS19GX09GRkxEX0NPTVBMRVRFLCAmY3NrLT5mbGFncykpIHsKKwkJLyogVW5zb2xpY2l0ZWQgUkVTRVRfQ09NUCBvciBSRVNFVF9SRUNFSVZFRCAqLworCQlvcGNvZGUgPSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9SRVNFVF9SRUNFSVZFRDsKKwkJY3NrLT5zdGF0ZSA9IG9wY29kZTsKIAl9Ci0JLyogNTc3MTArIG9ubHkgIHdvcmthcm91bmQgdG8gaGFuZGxlIHVuc29saWNpdGVkIFJFU0VUX0NPTVAKLQkgKiB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgbGlrZSBhIFJFU0VUIFJDVkQgbm90aWZpY2F0aW9uCi0JICogd2hpY2ggdHJpZ2dlcnMgdGhlIGNsZWFuIHVwIHByb2NlZHVyZQorCisJLyogMS4gSWYgZXZlbnQgb3Bjb2RlIG1hdGNoZXMgdGhlIGV4cGVjdGVkIGV2ZW50IGluIGNzay0+c3RhdGUKKwkgKiAyLiBJZiB0aGUgZXhwZWN0ZWQgZXZlbnQgaXMgQ0xPU0VfQ09NUCwgd2UgYWNjZXB0IGFueSBldmVudAorCSAqIDMuIElmIHRoZSBleHBlY3RlZCBldmVudCBpcyAwLCBtZWFuaW5nIHRoZSBjb25uZWN0aW9uIHdhcyBuZXZlcgorCSAqICAgIG5ldmVyIGVzdGFibGlzaGVkLCB3ZSBhY2NlcHQgdGhlIG9wY29kZSBmcm9tIGNtX2Fib3J0LgogCSAqLwotCWVsc2UgaWYgKG9wY29kZSA9PSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9SRVNFVF9DT01QKSB7CisJaWYgKG9wY29kZSA9PSBjc2stPnN0YXRlIHx8IGNzay0+c3RhdGUgPT0gMCB8fAorCSAgICBjc2stPnN0YXRlID09IEw0X0tDUUVfT1BDT0RFX1ZBTFVFX0NMT1NFX0NPTVApIHsKIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNLX0ZfQ0xPU0lORywgJmNzay0+ZmxhZ3MpKSB7Ci0JCQljc2stPnN0YXRlID0gTDRfS0NRRV9PUENPREVfVkFMVUVfUkVTRVRfUkVDRUlWRUQ7CisJCQlpZiAoY3NrLT5zdGF0ZSA9PSAwKQorCQkJCWNzay0+c3RhdGUgPSBvcGNvZGU7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KQEAgLTMyMjYsOCArMzIxNCwxNCBAQAogCXN0cnVjdCBjbmljX2RldiAqZGV2ID0gY3NrLT5kZXY7CiAJc3RydWN0IGNuaWNfbG9jYWwgKmNwID0gZGV2LT5jbmljX3ByaXY7CiAKKwlpZiAob3Bjb2RlID09IEw0X0tDUUVfT1BDT0RFX1ZBTFVFX1JFU0VUX1JFQ0VJVkVEKSB7CisJCWNuaWNfY21fdXBjYWxsKGNwLCBjc2ssIG9wY29kZSk7CisJCXJldHVybjsKKwl9CisKIAljbGVhcl9iaXQoU0tfRl9DT05ORUNUX1NUQVJULCAmY3NrLT5mbGFncyk7CiAJY25pY19jbG9zZV9jb25uKGNzayk7CisJY3NrLT5zdGF0ZSA9IG9wY29kZTsKIAljbmljX2NtX3VwY2FsbChjcCwgY3NrLCBvcGNvZGUpOwogfQogCkBAIC0zMjU3LDggKzMyNTEsMTIgQEAKIAljYXNlIEw0X0tDUUVfT1BDT0RFX1ZBTFVFX1JFU0VUX1JFQ0VJVkVEOgogCWNhc2UgTDRfS0NRRV9PUENPREVfVkFMVUVfQ0xPU0VfQ09NUDoKIAljYXNlIEw0X0tDUUVfT1BDT0RFX1ZBTFVFX1JFU0VUX0NPTVA6Ci0JCWlmIChjbmljX3JlYWR5X3RvX2Nsb3NlKGNzaywgb3Bjb2RlKSkKLQkJCWNtZCA9IEw1Q01fUkFNUk9EX0NNRF9JRF9TRUFSQ0hFUl9ERUxFVEU7CisJCWlmIChjbmljX3JlYWR5X3RvX2Nsb3NlKGNzaywgb3Bjb2RlKSkgeworCQkJaWYgKHRlc3RfYml0KFNLX0ZfUEdfT0ZGTERfQ09NUExFVEUsICZjc2stPmZsYWdzKSkKKwkJCQljbWQgPSBMNUNNX1JBTVJPRF9DTURfSURfU0VBUkNIRVJfREVMRVRFOworCQkJZWxzZQorCQkJCWNsb3NlX2NvbXBsZXRlID0gMTsKKwkJfQogCQlicmVhazsKIAljYXNlIEw1Q01fUkFNUk9EX0NNRF9JRF9TRUFSQ0hFUl9ERUxFVEU6CiAJCWNtZCA9IEw1Q01fUkFNUk9EX0NNRF9JRF9URVJNSU5BVEVfT0ZGTE9BRDsKQEAgLTM2OTQsNyArMzY5Miw3IEBACiAJc3RydWN0IGNuaWNfbG9jYWwgKmNwID0gZGV2LT5jbmljX3ByaXY7CiAJc3RydWN0IGNuaWNfZXRoX2RldiAqZXRoZGV2ID0gY3AtPmV0aGRldjsKIAlzdHJ1Y3Qgc3RhdHVzX2Jsb2NrICpzYmxrID0gY3AtPnN0YXR1c19ibGsuZ2VuOwotCXUzMiB2YWw7CisJdTMyIHZhbCwga2NxX2NpZF9hZGRyLCBrd3FfY2lkX2FkZHI7CiAJaW50IGVycjsKIAogCWNuaWNfc2V0X2JueDJfbWFjKGRldik7CkBAIC0zNzE5LDcgKzM3MTcsNyBAQAogCWNuaWNfaW5pdF9jb250ZXh0KGRldiwgS1dRX0NJRCk7CiAJY25pY19pbml0X2NvbnRleHQoZGV2LCBLQ1FfQ0lEKTsKIAotCWNwLT5rd3FfY2lkX2FkZHIgPSBHRVRfQ0lEX0FERFIoS1dRX0NJRCk7CisJa3dxX2NpZF9hZGRyID0gR0VUX0NJRF9BRERSKEtXUV9DSUQpOwogCWNwLT5rd3FfaW9fYWRkciA9IE1CX0dFVF9DSURfQUREUihLV1FfQ0lEKSArIEw1X0tSTkxRX0hPU1RfUUlEWDsKIAogCWNwLT5tYXhfa3dxX2lkeCA9IE1BWF9LV1FfSURYOwpAQCAtMzczNSw1MCArMzczMyw1OSBAQAogCS8qIEluaXRpYWxpemUgdGhlIGtlcm5lbCB3b3JrIHF1ZXVlIGNvbnRleHQuICovCiAJdmFsID0gS1JOTFFfVFlQRV9UWVBFX0tSTkxRIHwgS1JOTFFfU0laRV9UWVBFX1NJWkUgfAogCSAgICAgIChCQ01fUEFHRV9CSVRTIC0gOCkgfCBLUk5MUV9GTEFHU19RRV9TRUxGX1NFUTsKLQljbmljX2N0eF93cihkZXYsIGNwLT5rd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1RZUEUsIHZhbCk7CisJY25pY19jdHhfd3IoZGV2LCBrd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1RZUEUsIHZhbCk7CiAKIAl2YWwgPSAoQkNNX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3Qga3dxZSkgLSAxKSA8PCAxNjsKLQljbmljX2N0eF93cihkZXYsIGNwLT5rd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1FFX1NFTEZfU0VRX01BWCwgdmFsKTsKKwljbmljX2N0eF93cihkZXYsIGt3cV9jaWRfYWRkciwgTDVfS1JOTFFfUUVfU0VMRl9TRVFfTUFYLCB2YWwpOwogCiAJdmFsID0gKChCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrd3FlKSkgPDwgMTYpIHwgS1dRX1BBR0VfQ05UOwotCWNuaWNfY3R4X3dyKGRldiwgY3AtPmt3cV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfTlBBR0VTLCB2YWwpOworCWNuaWNfY3R4X3dyKGRldiwga3dxX2NpZF9hZGRyLCBMNV9LUk5MUV9QR1RCTF9OUEFHRVMsIHZhbCk7CiAKIAl2YWwgPSAodTMyKSAoKHU2NCkgY3AtPmt3cV9pbmZvLnBndGJsX21hcCA+PiAzMik7Ci0JY25pY19jdHhfd3IoZGV2LCBjcC0+a3dxX2NpZF9hZGRyLCBMNV9LUk5MUV9QR1RCTF9IQUREUl9ISSwgdmFsKTsKKwljbmljX2N0eF93cihkZXYsIGt3cV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfSEFERFJfSEksIHZhbCk7CiAKIAl2YWwgPSAodTMyKSBjcC0+a3dxX2luZm8ucGd0YmxfbWFwOwotCWNuaWNfY3R4X3dyKGRldiwgY3AtPmt3cV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfSEFERFJfTE8sIHZhbCk7CisJY25pY19jdHhfd3IoZGV2LCBrd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1BHVEJMX0hBRERSX0xPLCB2YWwpOwogCi0JY3AtPmtjcV9jaWRfYWRkciA9IEdFVF9DSURfQUREUihLQ1FfQ0lEKTsKLQljcC0+a2NxX2lvX2FkZHIgPSBNQl9HRVRfQ0lEX0FERFIoS0NRX0NJRCkgKyBMNV9LUk5MUV9IT1NUX1FJRFg7CisJa2NxX2NpZF9hZGRyID0gR0VUX0NJRF9BRERSKEtDUV9DSUQpOworCWNwLT5rY3ExLmlvX2FkZHIgPSBNQl9HRVRfQ0lEX0FERFIoS0NRX0NJRCkgKyBMNV9LUk5MUV9IT1NUX1FJRFg7CiAKLQljcC0+a2NxX3Byb2RfaWR4ID0gMDsKKwljcC0+a2NxMS5zd19wcm9kX2lkeCA9IDA7CisJY3AtPmtjcTEuaHdfcHJvZF9pZHhfcHRyID0KKwkJKHUxNiAqKSAmc2Jsay0+c3RhdHVzX2NvbXBsZXRpb25fcHJvZHVjZXJfaW5kZXg7CisKKwljcC0+a2NxMS5zdGF0dXNfaWR4X3B0ciA9ICh1MTYgKikgJnNibGstPnN0YXR1c19pZHg7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBrZXJuZWwgY29tcGxldGUgcXVldWUgY29udGV4dC4gKi8KIAl2YWwgPSBLUk5MUV9UWVBFX1RZUEVfS1JOTFEgfCBLUk5MUV9TSVpFX1RZUEVfU0laRSB8CiAJICAgICAgKEJDTV9QQUdFX0JJVFMgLSA4KSB8IEtSTkxRX0ZMQUdTX1FFX1NFTEZfU0VROwotCWNuaWNfY3R4X3dyKGRldiwgY3AtPmtjcV9jaWRfYWRkciwgTDVfS1JOTFFfVFlQRSwgdmFsKTsKKwljbmljX2N0eF93cihkZXYsIGtjcV9jaWRfYWRkciwgTDVfS1JOTFFfVFlQRSwgdmFsKTsKIAogCXZhbCA9IChCQ01fUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrY3FlKSAtIDEpIDw8IDE2OwotCWNuaWNfY3R4X3dyKGRldiwgY3AtPmtjcV9jaWRfYWRkciwgTDVfS1JOTFFfUUVfU0VMRl9TRVFfTUFYLCB2YWwpOworCWNuaWNfY3R4X3dyKGRldiwga2NxX2NpZF9hZGRyLCBMNV9LUk5MUV9RRV9TRUxGX1NFUV9NQVgsIHZhbCk7CiAKIAl2YWwgPSAoKEJDTV9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGtjcWUpKSA8PCAxNikgfCBLQ1FfUEFHRV9DTlQ7Ci0JY25pY19jdHhfd3IoZGV2LCBjcC0+a2NxX2NpZF9hZGRyLCBMNV9LUk5MUV9QR1RCTF9OUEFHRVMsIHZhbCk7CisJY25pY19jdHhfd3IoZGV2LCBrY3FfY2lkX2FkZHIsIEw1X0tSTkxRX1BHVEJMX05QQUdFUywgdmFsKTsKIAotCXZhbCA9ICh1MzIpICgodTY0KSBjcC0+a2NxX2luZm8ucGd0YmxfbWFwID4+IDMyKTsKLQljbmljX2N0eF93cihkZXYsIGNwLT5rY3FfY2lkX2FkZHIsIEw1X0tSTkxRX1BHVEJMX0hBRERSX0hJLCB2YWwpOworCXZhbCA9ICh1MzIpICgodTY0KSBjcC0+a2NxMS5kbWEucGd0YmxfbWFwID4+IDMyKTsKKwljbmljX2N0eF93cihkZXYsIGtjcV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfSEFERFJfSEksIHZhbCk7CiAKLQl2YWwgPSAodTMyKSBjcC0+a2NxX2luZm8ucGd0YmxfbWFwOwotCWNuaWNfY3R4X3dyKGRldiwgY3AtPmtjcV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfSEFERFJfTE8sIHZhbCk7CisJdmFsID0gKHUzMikgY3AtPmtjcTEuZG1hLnBndGJsX21hcDsKKwljbmljX2N0eF93cihkZXYsIGtjcV9jaWRfYWRkciwgTDVfS1JOTFFfUEdUQkxfSEFERFJfTE8sIHZhbCk7CiAKIAljcC0+aW50X251bSA9IDA7CiAJaWYgKGV0aGRldi0+ZHJ2X3N0YXRlICYgQ05JQ19EUlZfU1RBVEVfVVNJTkdfTVNJWCkgeworCQlzdHJ1Y3Qgc3RhdHVzX2Jsb2NrX21zaXggKm1zYmxrID0gY3AtPnN0YXR1c19ibGsuYm54MjsKIAkJdTMyIHNiX2lkID0gY3AtPnN0YXR1c19ibGtfbnVtOwogCQl1MzIgc2IgPSBCTlgyX0wyQ1RYX0w1X1NUQVRVU0JfTlVNKHNiX2lkKTsKIAorCQljcC0+a2NxMS5od19wcm9kX2lkeF9wdHIgPQorCQkJKHUxNiAqKSAmbXNibGstPnN0YXR1c19jb21wbGV0aW9uX3Byb2R1Y2VyX2luZGV4OworCQljcC0+a2NxMS5zdGF0dXNfaWR4X3B0ciA9ICh1MTYgKikgJm1zYmxrLT5zdGF0dXNfaWR4OworCQljcC0+a3dxX2Nvbl9pZHhfcHRyID0gKHUxNiAqKSAmbXNibGstPnN0YXR1c19jbWRfY29uc3VtZXJfaW5kZXg7CiAJCWNwLT5pbnRfbnVtID0gc2JfaWQgPDwgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5UX05VTV9TSElGVDsKLQkJY25pY19jdHhfd3IoZGV2LCBjcC0+a3dxX2NpZF9hZGRyLCBMNV9LUk5MUV9IT1NUX1FJRFgsIHNiKTsKLQkJY25pY19jdHhfd3IoZGV2LCBjcC0+a2NxX2NpZF9hZGRyLCBMNV9LUk5MUV9IT1NUX1FJRFgsIHNiKTsKKwkJY25pY19jdHhfd3IoZGV2LCBrd3FfY2lkX2FkZHIsIEw1X0tSTkxRX0hPU1RfUUlEWCwgc2IpOworCQljbmljX2N0eF93cihkZXYsIGtjcV9jaWRfYWRkciwgTDVfS1JOTFFfSE9TVF9RSURYLCBzYik7CiAJfQogCiAJLyogRW5hYmxlIENvbW1uYWQgU2NoZWR1bGVyIG5vdGlmaWNhdGlvbiB3aGVuIHdlIHdyaXRlIHRvIHRoZQpAQCAtNDEyMywzMyArNDEzMCwzOSBAQAogCXU4IHNiX2lkID0gY3AtPnN0YXR1c19ibGtfbnVtOwogCiAJcmV0ID0gY25pY19pbml0X2lkX3RibCgmY3AtPmNpZF90YmwsIE1BWF9JU0NTSV9UQkxfU1osCi0JCQkgICAgICAgQk5YMlhfSVNDU0lfU1RBUlRfQ0lEKTsKKwkJCSAgICAgICBjcC0+aXNjc2lfc3RhcnRfY2lkKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY3AtPmtjcV9pb19hZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsKKwljcC0+a2NxMS5pb19hZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsKIAkJCSAgQ1NUT1JNX0lTQ1NJX0VRX1BST0RfT0ZGU0VUKGZ1bmMsIDApOwotCWNwLT5rY3FfcHJvZF9pZHggPSAwOworCWNwLT5rY3ExLnN3X3Byb2RfaWR4ID0gMDsKKworCWNwLT5rY3ExLmh3X3Byb2RfaWR4X3B0ciA9CisJCSZjcC0+c3RhdHVzX2Jsay5ibngyeC0+Y19zdGF0dXNfYmxvY2suaW5kZXhfdmFsdWVzWworCQkJSENfSU5ERVhfQ19JU0NTSV9FUV9DT05TXTsKKwljcC0+a2NxMS5zdGF0dXNfaWR4X3B0ciA9CisJCSZjcC0+c3RhdHVzX2Jsay5ibngyeC0+Y19zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4OwogCiAJY25pY19nZXRfYm54MnhfaXNjc2lfaW5mbyhkZXYpOwogCiAJLyogT25seSAxIEVRICovCi0JQ05JQ19XUjE2KGRldiwgY3AtPmtjcV9pb19hZGRyLCBNQVhfS0NRX0lEWCk7CisJQ05JQ19XUjE2KGRldiwgY3AtPmtjcTEuaW9fYWRkciwgTUFYX0tDUV9JRFgpOwogCUNOSUNfV1IoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKwogCQlDU1RPUk1fSVNDU0lfRVFfQ09OU19PRkZTRVQoZnVuYywgMCksIDApOwogCUNOSUNfV1IoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKwogCQlDU1RPUk1fSVNDU0lfRVFfTkVYVF9QQUdFX0FERFJfT0ZGU0VUKGZ1bmMsIDApLAotCQljcC0+a2NxX2luZm8ucGdfbWFwX2FyclsxXSAmIDB4ZmZmZmZmZmYpOworCQljcC0+a2NxMS5kbWEucGdfbWFwX2FyclsxXSAmIDB4ZmZmZmZmZmYpOwogCUNOSUNfV1IoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKwogCQlDU1RPUk1fSVNDU0lfRVFfTkVYVF9QQUdFX0FERFJfT0ZGU0VUKGZ1bmMsIDApICsgNCwKLQkJKHU2NCkgY3AtPmtjcV9pbmZvLnBnX21hcF9hcnJbMV0gPj4gMzIpOworCQkodTY0KSBjcC0+a2NxMS5kbWEucGdfbWFwX2FyclsxXSA+PiAzMik7CiAJQ05JQ19XUihkZXYsIEJBUl9DU1RST1JNX0lOVE1FTSArCiAJCUNTVE9STV9JU0NTSV9FUV9ORVhUX0VRRV9BRERSX09GRlNFVChmdW5jLCAwKSwKLQkJY3AtPmtjcV9pbmZvLnBnX21hcF9hcnJbMF0gJiAweGZmZmZmZmZmKTsKKwkJY3AtPmtjcTEuZG1hLnBnX21hcF9hcnJbMF0gJiAweGZmZmZmZmZmKTsKIAlDTklDX1dSKGRldiwgQkFSX0NTVFJPUk1fSU5UTUVNICsKIAkJQ1NUT1JNX0lTQ1NJX0VRX05FWFRfRVFFX0FERFJfT0ZGU0VUKGZ1bmMsIDApICsgNCwKLQkJKHU2NCkgY3AtPmtjcV9pbmZvLnBnX21hcF9hcnJbMF0gPj4gMzIpOworCQkodTY0KSBjcC0+a2NxMS5kbWEucGdfbWFwX2FyclswXSA+PiAzMik7CiAJQ05JQ19XUjgoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKwogCQlDU1RPUk1fSVNDU0lfRVFfTkVYVF9QQUdFX0FERFJfVkFMSURfT0ZGU0VUKGZ1bmMsIDApLCAxKTsKIAlDTklDX1dSMTYoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKwpAQCAtNDM3Nyw3ICs0MzkwLDcgQEAKIAkJICAwKTsKIAlDTklDX1dSKGRldiwgQkFSX0NTVFJPUk1fSU5UTUVNICsKIAkJQ1NUT1JNX0lTQ1NJX0VRX0NPTlNfT0ZGU0VUKGNwLT5mdW5jLCAwKSwgMCk7Ci0JQ05JQ19XUjE2KGRldiwgY3AtPmtjcV9pb19hZGRyLCAwKTsKKwlDTklDX1dSMTYoZGV2LCBjcC0+a2NxMS5pb19hZGRyLCAwKTsKIAljbmljX2ZyZWVfcmVzYyhkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jbmljLmggYi9kcml2ZXJzL25ldC9jbmljLmgKaW5kZXggMDhiMTIzNS4uMjc1YzM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2NuaWMuaApAQCAtMTY5LDYgKzE2OSwxNiBAQAogCX0gcHJvdG87CiB9OwogCitzdHJ1Y3Qga2NxX2luZm8geworCXN0cnVjdCBjbmljX2RtYQlkbWE7CisJc3RydWN0IGtjcWUJKiprY3E7CisKKwl1MTYJCSpod19wcm9kX2lkeF9wdHI7CisJdTE2CQlzd19wcm9kX2lkeDsKKwl1MTYJCSpzdGF0dXNfaWR4X3B0cjsKKwl1MzIJCWlvX2FkZHI7Cit9OworCiBzdHJ1Y3QgY25pY19sb2NhbCB7CiAKIAlzcGlubG9ja190IGNuaWNfdWxwX2xvY2s7CkBAIC0yMDIsOSArMjEyLDYgQEAKIAl1MTYJCXJ4X2NvbnM7CiAJdTE2CQl0eF9jb25zOwogCi0JdTMyIGt3cV9jaWRfYWRkcjsKLQl1MzIga2NxX2NpZF9hZGRyOwotCiAJc3RydWN0IGNuaWNfZG1hCQlrd3FfaW5mbzsKIAlzdHJ1Y3Qga3dxZQkJKiprd3E7CiAKQEAgLTIxOCwxMSArMjI1LDcgQEAKIAl1MTYJCSprd3FfY29uX2lkeF9wdHI7CiAJdTE2CQlrd3FfY29uX2lkeDsKIAotCXN0cnVjdCBjbmljX2RtYQlrY3FfaW5mbzsKLQlzdHJ1Y3Qga2NxZQkqKmtjcTsKLQotCXUxNgkJa2NxX3Byb2RfaWR4OwotCXUzMgkJa2NxX2lvX2FkZHI7CisJc3RydWN0IGtjcV9pbmZvCWtjcTE7CiAKIAl1bmlvbiB7CiAJCXZvaWQJCQkJKmdlbjsKQEAgLTI0OCw4ICsyNTEsMTAgQEAKIAlzdHJ1Y3QgY25pY19pc2NzaQkqaXNjc2lfdGJsOwogCXN0cnVjdCBjbmljX2NvbnRleHQJKmN0eF90Ymw7CiAJc3RydWN0IGNuaWNfaWRfdGJsCWNpZF90Ymw7Ci0JaW50CQkJbWF4X2lzY3NpX2Nvbm47CiAJYXRvbWljX3QJCWlzY3NpX2Nvbm47CisJdTMyCQkJaXNjc2lfc3RhcnRfY2lkOworCisJdTMyCQkJbWF4X2NpZF9zcGFjZTsKIAogCS8qIHBlciBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KIAlpbnQJCQludW1faXNjc2lfdGFza3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jbmljX2lmLmggYi9kcml2ZXJzL25ldC9jbmljX2lmLmgKaW5kZXggMGM1NTE3Ny4uMzQ0Yzg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY25pY19pZi5oCisrKyBiL2RyaXZlcnMvbmV0L2NuaWNfaWYuaApAQCAtMTIsOCArMTIsOCBAQAogI2lmbmRlZiBDTklDX0lGX0gKICNkZWZpbmUgQ05JQ19JRl9ICiAKLSNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi4xLjIiCi0jZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIk1heSAyNiwgMjAxMCIKKyNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi4xLjMiCisjZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIkp1bmUgMjQsIDIwMTAiCiAKICNkZWZpbmUgQ05JQ19VTFBfUkRNQQkJMAogI2RlZmluZSBDTklDX1VMUF9JU0NTSQkJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3BtYWMuYyBiL2RyaXZlcnMvbmV0L2NwbWFjLmMKaW5kZXggMjM3ODZlZS4uZTFmNjE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3BtYWMuYworKysgYi9kcml2ZXJzL25ldC9jcG1hYy5jCkBAIC04NDYsMTEgKzg0Niw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghcHJpdi0+cGh5KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKGNtZCA9PSBTSU9DR01JSVBIWSkgfHwgKGNtZCA9PSBTSU9DR01JSVJFRykgfHwKLQkgICAgKGNtZCA9PSBTSU9DU01JSVJFRykpCi0JCXJldHVybiBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeSwgaWZfbWlpKGlmciksIGNtZCk7CiAKLQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5LCBpZnIsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgY3BtYWNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQpAQCAtOTY0LDcgKzk2MSw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocHJpdi0+cGRldiwgSU9SRVNPVVJDRV9NRU0sICJyZWdzIik7Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0LCBkZXYtPm5hbWUpKSB7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pLCBkZXYtPm5hbWUpKSB7CiAJCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlcXVlc3QgcmVnaXN0ZXJzXG4iLAogCQkJICAgICAgIGRldi0+bmFtZSk7CkBAIC05NzIsNyArOTY5LDcgQEAKIAkJZ290byBmYWlsX3Jlc2VydmU7CiAJfQogCi0JcHJpdi0+cmVncyA9IGlvcmVtYXAobWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0KTsKKwlwcml2LT5yZWdzID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwogCWlmICghcHJpdi0+cmVncykgewogCQlpZiAobmV0aWZfbXNnX2Rydihwcml2KSkKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZW1hcCByZWdpc3RlcnNcbiIsCkBAIC0xMDQ5LDcgKzEwNDYsNyBAQAogCWlvdW5tYXAocHJpdi0+cmVncyk7CiAKIGZhaWxfcmVtYXA6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbS0+ZW5kIC0gbWVtLT5zdGFydCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiAKIGZhaWxfcmVzZXJ2ZToKIAlyZXR1cm4gcmVzOwpAQCAtMTA3Nyw3ICsxMDc0LDcgQEAKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlpb3VubWFwKHByaXYtPnJlZ3MpOwogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocHJpdi0+cGRldiwgSU9SRVNPVVJDRV9NRU0sICJyZWdzIik7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIG1lbS0+ZW5kIC0gbWVtLT5zdGFydCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiAJcHJpdi0+cnhfaGVhZCA9ICZwcml2LT5kZXNjX3JpbmdbQ1BNQUNfUVVFVUVTXTsKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cmluZ19zaXplOyBpKyspIHsKIAkJaWYgKHByaXYtPnJ4X2hlYWRbaV0uc2tiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCmluZGV4IDdlMDAwMjcuLjgxNDc1Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC0xNzAyLDExICsxNzAyLDcgQEAKIAogCWlmICghY3VycmVudF9zcGVlZCkgewogCQkvKiBNYWtlIExFRCByZWQsIGxpbmsgaXMgZG93biAqLwotI2lmIGRlZmluZWQoQ09ORklHX0VUUkFYX05FVFdPUktfUkVEX09OX05PX0NPTk5FQ1RJT04pCi0JCUNSSVNfTEVEX05FVFdPUktfU0VUKENSSVNfTEVEX1JFRCk7Ci0jZWxzZQogCQlDUklTX0xFRF9ORVRXT1JLX1NFVChDUklTX0xFRF9PRkYpOwotI2VuZGlmCiAJfSBlbHNlIGlmIChsaWdodF9sZWRzKSB7CiAJCWlmIChjdXJyZW50X3NwZWVkID09IDEwKSB7CiAJCQlDUklTX0xFRF9ORVRXT1JLX1NFVChDUklTX0xFRF9PUkFOR0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmMgYi9kcml2ZXJzL25ldC9jczg5eDAuYwppbmRleCAyY2NiOWYxLi5kMzI1ZTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jczg5eDAuYworKysgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpAQCAtMTcwLDIyICsxNzAsMTIgQEAKIC8qIFRoZSBjczg5MDAgaGFzIDQgSVJRIHBpbnMsIHNvZnR3YXJlIHNlbGVjdGFibGUuIGNzODkwMF9pcnFfbWFwIG1hcHMKICAgIHRoZW0gdG8gc3lzdGVtIElSUSBudW1iZXJzLiBUaGlzIG1hcHBpbmcgaXMgY2FyZCBzcGVjaWZpYyBhbmQgaXMgc2V0IHRvCiAgICB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQ2lycnVzIEV2YWwgYm9hcmQgZm9yIHRoaXMgY2hpcC4gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9ISUNPU0g0KQotc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX191c2VkIF9faW5pdGRhdGEgPQotICAgeyAweDAzMDAsIDB9Owotc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0gezEsMCwwLDB9OwotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0lYRFAyMzUxKQogc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX191c2VkIF9faW5pdGRhdGEgPSB7SVhEUDIzNTFfVklSVF9DUzg5MDBfQkFTRSwgMH07CiBzdGF0aWMgdW5zaWduZWQgaW50IGNzODkwMF9pcnFfbWFwW10gPSB7SVJRX0lYRFAyMzUxX0NTODkwMCwgMCwgMCwgMH07CiAjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKQogc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX191c2VkIF9faW5pdGRhdGEgPSB7SVhEUDJYMDFfQ1M4OTAwX1ZJUlRfQkFTRSwgMH07CiBzdGF0aWMgdW5zaWduZWQgaW50IGNzODkwMF9pcnFfbWFwW10gPSB7SVJRX0lYRFAyWDAxX0NTODkwMCwgMCwgMCwgMH07Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jZGVmaW5lIENJUlJVU19ERUZBVUxUX0JBU0UJSU9fQUREUkVTUyhFWFRfU1RBVElDMl9zMF9CQVNFICsgMHgyMDAwMDApCS8qID0gUGh5c2ljYWwgYWRkcmVzcyAweDQ4MjAwMDAwICovCi0jZGVmaW5lIENJUlJVU19ERUZBVUxUX0lSUQlWSF9JTlRDX0lOVF9OVU1fQ0FTQ0FERURfSU5URVJSVVBUXzEgLyogRXZlbnQgaW5wdXRzIGJhbmsgMSAtIElEIDM1L2JpdCAzICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX3VzZWQgX19pbml0ZGF0YSA9IHtDSVJSVVNfREVGQVVMVF9CQVNFLCAwfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHtDSVJSVVNfREVGQVVMVF9JUlEsIDAsIDAsIDB9OwogI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9NWDMxQURTKQogI2luY2x1ZGUgPG1hY2gvYm9hcmQtbXgzMWFkcy5oPgogc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX191c2VkIF9faW5pdGRhdGEgPSB7CkBAIC0yMTgsNyArMjA4LDYgQEAKIAogLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCiBzdHJ1Y3QgbmV0X2xvY2FsIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlpbnQgY2hpcF90eXBlOwkJLyogb25lIG9mOiBDUzg5MDAsIENTODkyMCwgQ1M4OTIwTSAqLwogCWNoYXIgY2hpcF9yZXZpc2lvbjsJLyogcmV2aXNpb24gbGV0dGVyIG9mIHRoZSBjaGlwICgnQScuLi4pICovCiAJaW50IHNlbmRfY21kOwkJLyogdGhlIHByb3BlciBzZW5kIGNvbW1hbmQ6IFRYX05PVywgVFhfQUZURVJfMzgxLCBvciBUWF9BRlRFUl9BTEwgKi8KQEAgLTI1Nyw3ICsyNDYsNyBAQAogc3RhdGljIGludCBnZXRfZWVwcm9tX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpOwogc3RhdGljIGludCBnZXRfZWVwcm9tX2Nrc3VtKGludCBvZmYsIGludCBsZW4sIGludCAqYnVmZmVyKTsKIHN0YXRpYyBpbnQgc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOwotc3RhdGljIHZvaWQgY291bnRfcnhfZXJyb3JzKGludCBzdGF0dXMsIHN0cnVjdCBuZXRfbG9jYWwgKmxwKTsKK3N0YXRpYyB2b2lkIGNvdW50X3J4X2Vycm9ycyhpbnQgc3RhdHVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgbmV0X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbmRpZgpAQCAtMzcyLDE4ICszNjEsNiBAQAogewogCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7CiB9Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCi1zdGF0aWMgdTE2Ci1yZWFkd29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubykKLXsKLQlyZXR1cm4gaW53KGJhc2VfYWRkciArIChwb3J0bm8gPDwgMSkpOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB1MTYgdmFsdWUpCi17Ci0Jb3V0dyh2YWx1ZSwgYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7Ci19CiAjZWxzZQogc3RhdGljIHUxNgogcmVhZHdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8pCkBAIC01NDYsMzAgKzUyMyw2IEBACiAjZW5kaWYKICAgICAgICAgfQogCi0jaWZkZWYgQ09ORklHX0FSQ0hfUE5YMDEwWAotCWluaXRpYWxpemVfZWJpKCk7Ci0KLQkvKiBNYXAgR1BJTyByZWdpc3RlcnMgZm9yIHRoZSBwaW5zIGNvbm5lY3RlZCB0byB0aGUgQ1M4OTAwYS4gKi8KLQlpZiAobWFwX2NpcnJ1c19ncGlvKCkgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJlc2V0X2NpcnJ1cygpOwotCi0JLyogTWFwIGV2ZW50LXJvdXRlciByZWdpc3RlcnMuICovCi0JaWYgKG1hcF9ldmVudF9yb3V0ZXIoKSA8IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0JZW5hYmxlX2NpcnJ1c19pcnEoKTsKLQotCXVubWFwX2NpcnJ1c19ncGlvKCk7Ci0JdW5tYXBfZXZlbnRfcm91dGVyKCk7Ci0KLQlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKLQotCWZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykKLQkJcmVhZHJlZyhkZXYsIDApOwotI2VuZGlmCi0KIAkvKiBHcmFiIHRoZSByZWdpb24gc28gd2UgY2FuIGZpbmQgYW5vdGhlciBib2FyZCBpZiBhdXRvSVJRIGZhaWxzLiAqLwogCS8qIFdURiBpcyBnb2luZyBvbiBoZXJlPyAqLwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyICYgfjMsIE5FVENBUkRfSU9fRVhURU5ULCBEUlZfTkFNRSkpIHsKQEAgLTU3OSwxMiArNTMyLDYgQEAKIAkJZ290byBvdXQxOwogCX0KIAotI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0Ci0JLyogdHJ1bHkgcmVzZXQgdGhlIGNoaXAgKi8KLQl3cml0ZXdvcmQoaW9hZGRyLCBBRERfUE9SVCwgMHgwMTE0KTsKLQl3cml0ZXdvcmQoaW9hZGRyLCBEQVRBX1BPUlQsIDB4MDA0MCk7Ci0jZW5kaWYKLQogCS8qIGlmIHRoZXkgZ2l2ZSB1cyBhbiBvZGQgSS9PIGFkZHJlc3MsIHRoZW4gZG8gT05FIHdyaXRlIHRvCiAgICAgICAgICAgIHRoZSBhZGRyZXNzIHBvcnQsIHRvIGdldCBpdCBiYWNrIHRvIGFkZHJlc3MgemVybywgd2hlcmUgd2UKICAgICAgICAgICAgZXhwZWN0IHRvIGZpbmQgdGhlIEVJU0Egc2lnbmF0dXJlIHdvcmQuIEFuIElPIHdpdGggYSBiYXNlIG9mIDB4MwpAQCAtNjUwLDM3ICs1OTcsNiBAQAogCSAgIHRoZSBkcml2ZXIgd2lsbCBhbHdheXMgZG8gKnNvbWV0aGluZyogaW5zdGVhZCBvZiBjb21wbGFpbiB0aGF0CiAJICAgYWRhcHRlcl9jbmYgaXMgMC4gKi8KIAotI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0Ci0JaWYgKDEpIHsKLQkJLyogRm9yIHRoZSBIaUNPLlNINCBib2FyZCwgdGhpbmdzIGFyZSBkaWZmZXJlbnQ6IHdlIGRvbid0Ci0JCSAgIGhhdmUgRUVQUk9NLCBidXQgdGhlcmUgaXMgc29tZSBkYXRhIGluIGZsYXNoLCBzbyB3ZSBnbwotCQkgICBnZXQgaXQgdGhlcmUgZGlyZWN0bHkgKE1BQykuICovCi0JCV9fdTE2ICpjb25mZDsKLQkJc2hvcnQgY250OwotCQlpZiAoKCgqICh2b2xhdGlsZSBfX3UzMiAqKSAweGEwMDEzZmYwKSAmIDB4MDBmZmZmZmYpCi0JCQk9PSAweDAwNmMzMDAwKSB7Ci0JCQljb25mZCA9IChfX3UxNiopIDB4YTAwMTNmYzA7Ci0JCX0gZWxzZSB7Ci0JCQljb25mZCA9IChfX3UxNiopIDB4YTAwMWZmYzA7Ci0JCX0KLQkJY250ID0gKCpjb25mZCsrICYgMHgwMGZmKSA+PiAxOwotCQl3aGlsZSAoLS1jbnQgPiAwKSB7Ci0JCQlfX3UxNiBqID0gKmNvbmZkKys7Ci0KLQkJCXN3aXRjaCAoaiAmIDB4MGZmZikgewotCQkJY2FzZSBQUF9JQToKLQkJCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4vMjsgaSsrKSB7Ci0JCQkJCWRldi0+ZGV2X2FkZHJbaSoyXSA9IGNvbmZkW2ldICYgMHhGRjsKLQkJCQkJZGV2LT5kZXZfYWRkcltpKjIrMV0gPSBjb25mZFtpXSA+PiA4OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWogPSAoaiA+PiAxMikgKyAxOwotCQkJY29uZmQgKz0gajsKLQkJCWNudCAtPSBqOwotCQl9Ci0JfSBlbHNlCi0jZW5kaWYKIAogICAgICAgICBpZiAoKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgKEVFUFJPTV9PSyB8IEVFUFJPTV9QUkVTRU5UKSkgPT0KIAkgICAgICAoRUVQUk9NX09LfEVFUFJPTV9QUkVTRU5UKSkgewpAQCAtNzM1LDExICs2NTEsNyBAQAogICAgICAgICBwcmludGsoIlxuIik7CiAKIAkvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgYW4gRUVQUk9NIGlzIGF0dGFjaGVkLiAqLwotI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0IC8qIG5vIEVFUFJPTSBvbiBIaUNPLCBkb24ndCBoYXp6bGUgd2l0aCBpdCBoZXJlICovCi0JaWYgKDEpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJjczg5eDA6IE5vIEVFUFJPTSBvbiBIaUNPLlNINFxuIik7Ci0JfSBlbHNlCi0jZW5kaWYKKwogCWlmICgocmVhZHJlZyhkZXYsIFBQX1NlbGZTVCkgJiBFRVBST01fUFJFU0VOVCkgPT0gMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M4OXgwOiBObyBFRVBST00sIHJlbHlpbmcgb24gY29tbWFuZCBsaW5lLi4uLlxuIik7CiAJZWxzZSBpZiAoZ2V0X2VlcHJvbV9kYXRhKGRldiwgU1RBUlRfRUVQUk9NX0RBVEEsQ0hLU1VNX0xFTixlZXByb21fYnVmZikgPCAwKSB7CkBAIC05ODMsNyArODk1LDcgQEAKIAkJCWRldi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYnAsIHN0YXR1cywgbGVuZ3RoKTsKIAl9CiAJaWYgKChzdGF0dXMgJiBSWF9PSykgPT0gMCkgewotCQljb3VudF9yeF9lcnJvcnMoc3RhdHVzLCBscCk7CisJCWNvdW50X3J4X2Vycm9ycyhzdGF0dXMsIGRldik7CiAJCWdvdG8gc2tpcF90aGlzX2ZyYW1lOwogCX0KIApAQCAtOTkyLDcgKzkwNCw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCWlmIChuZXRfZGVidWcpCS8qIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBkbyB0aGlzIHRvIGEgc3RyZXNzZWQgc3lzdGVtICovCiAJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKLQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAKIAkJLyogQUtQTTogYWR2YW5jZSBicCB0byB0aGUgbmV4dCBmcmFtZSAqLwogc2tpcF90aGlzX2ZyYW1lOgpAQCAtMTAyMiw4ICs5MzQsOCBAQAogCX0KICAgICAgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKIAluZXRpZl9yeChza2IpOwotCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aDsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aDsKIH0KIAogI2VuZGlmCS8qIEFMTE9XX0RNQSAqLwpAQCAtMTI3Niw3ICsxMTg4LDYgQEAKIAlpbnQgaTsKIAlpbnQgcmV0OwogCi0jaWYgIWRlZmluZWQoQ09ORklHX1NIX0hJQ09TSDQpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpIC8qIHVzZXMgaXJxIzEsIHNvIHRoaXMgd29uJ3Qgd29yayAqLwogCWlmIChkZXYtPmlycSA8IDIpIHsKIAkJLyogQWxsb3cgaW50ZXJydXB0cyB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNoaXAgKi8KIC8qIENpcnJ1cycgcmVsZWFzZSBoYWQgdGhpczogKi8KQEAgLTEzMDUsNyArMTIxNiw2IEBACiAJCX0KIAl9CiAJZWxzZQotI2VuZGlmCiAJewogI2lmbmRlZiBDT05GSUdfQ1M4OXgwX05PTklTQV9JUlEKIAkJaWYgKCgoMSA8PCBkZXYtPmlycSkgJiBscC0+aXJxX21hcCkgPT0gMCkgewpAQCAtMTM5MSw5ICsxMzAxLDYgQEAKIAljYXNlIEFfQ05GX01FRElBXzEwQl8yOiByZXN1bHQgPSBscC0+YWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMjsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6IHJlc3VsdCA9IGxwLT5hZGFwdGVyX2NuZiAmIChBX0NORl8xMEJfVCB8IEFfQ05GX0FVSSB8IEFfQ05GXzEwQl8yKTsKICAgICAgICAgfQotI2lmZGVmIENPTkZJR19BUkNIX1BOWDAxMFgKLQlyZXN1bHQgPSBBX0NORl8xMEJfVDsKLSNlbmRpZgogICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEVFUFJPTSBpcyBjb25maWd1cmVkIGZvciB1bmF2YWlsYWJsZSBtZWRpYVxuIiwgZGV2LT5uYW1lKTsKIHJlbGVhc2VfZG1hOgpAQCAtMTU1Miw3ICsxNDU5LDcgQEAKIAkvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLwogCXdyaXRld29yZHMoZGV2LT5iYXNlX2FkZHIsIFRYX0ZSQU1FX1BPUlQsc2tiLT5kYXRhLChza2ItPmxlbisxKSA+PjEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Ci0JbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJZGV2X2tmcmVlX3NrYiAoc2tiKTsKIAogCS8qCkBAIC0xNTk4LDE4ICsxNTA1LDIzIEBACiAJCQluZXRfcngoZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlIElTUV9UUkFOU01JVFRFUl9FVkVOVDoKLQkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KIAkJCWlmICgoc3RhdHVzICYgKAlUWF9PSyB8CiAJCQkJCVRYX0xPU1RfQ1JTIHwKIAkJCQkJVFhfU1FFX0VSUk9SIHwKIAkJCQkJVFhfTEFURV9DT0wgfAogCQkJCQlUWF8xNl9DT0wpKSAhPSBUWF9PSykgewotCQkJCWlmICgoc3RhdHVzICYgVFhfT0spID09IDApIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJCQlpZiAoc3RhdHVzICYgVFhfTE9TVF9DUlMpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwotCQkJCWlmIChzdGF0dXMgJiBUWF9TUUVfRVJST1IpIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7Ci0JCQkJaWYgKHN0YXR1cyAmIFRYX0xBVEVfQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOwotCQkJCWlmIChzdGF0dXMgJiBUWF8xNl9DT0wpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmICgoc3RhdHVzICYgVFhfT0spID09IDApCisJCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRYX0xPU1RfQ1JTKQorCQkJCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRYX1NRRV9FUlJPUikKKwkJCQkJZGV2LT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRYX0xBVEVfQ09MKQorCQkJCQlkZXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVFhfMTZfQ09MKQorCQkJCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJU1FfQlVGRkVSX0VWRU5UOgpAQCAtMTY1MSwxMCArMTU2MywxMCBAQAogI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBJU1FfUlhfTUlTU19FVkVOVDoKLQkJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IChzdGF0dXMgPj42KTsKKwkJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc3RhdHVzID4+IDYpOwogCQkJYnJlYWs7CiAJCWNhc2UgSVNRX1RYX0NPTF9FVkVOVDoKLQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgPj42KTsKKwkJCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+IDYpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNjYyLDIyICsxNTc0LDI0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jb3VudF9yeF9lcnJvcnMoaW50IHN0YXR1cywgc3RydWN0IG5ldF9sb2NhbCAqbHApCitjb3VudF9yeF9lcnJvcnMoaW50IHN0YXR1cywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlscC0+c3RhdHMucnhfZXJyb3JzKys7Ci0JaWYgKHN0YXR1cyAmIFJYX1JVTlQpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JaWYgKHN0YXR1cyAmIFJYX0VYVFJBX0RBVEEpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JaWYgKHN0YXR1cyAmIFJYX0NSQ19FUlJPUikgaWYgKCEoc3RhdHVzICYgKFJYX0VYVFJBX0RBVEF8UlhfUlVOVCkpKQorCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYX1JVTlQpCisJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSWF9FWFRSQV9EQVRBKQorCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAoKHN0YXR1cyAmIFJYX0NSQ19FUlJPUikgJiYgIShzdGF0dXMgJiAoUlhfRVhUUkFfREFUQXxSWF9SVU5UKSkpCiAJCS8qIHBlciBzdHIgMTcyICovCi0JCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0JaWYgKHN0YXR1cyAmIFJYX0RSSUJCTEUpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYX0RSSUJCTEUpCisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiB9CiAKIC8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLwogc3RhdGljIHZvaWQKIG5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBzdGF0dXMsIGxlbmd0aDsKIApAQCAtMTY4Niw3ICsxNjAwLDcgQEAKIAlsZW5ndGggPSByZWFkd29yZChpb2FkZHIsIFJYX0ZSQU1FX1BPUlQpOwogCiAJaWYgKChzdGF0dXMgJiBSWF9PSykgPT0gMCkgewotCQljb3VudF9yeF9lcnJvcnMoc3RhdHVzLCBscCk7CisJCWNvdW50X3J4X2Vycm9ycyhzdGF0dXMsIGRldik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE2OTYsNyArMTYxMCw3IEBACiAjaWYgMAkJLyogQWdhaW4sIHRoaXMgc2VlbXMgYSBjcnVlbCB0aGluZyB0byBkbyAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CiAjZW5kaWYKLQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXJldHVybjsKIAl9CiAJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogbG9uZ3dvcmQgYWxpZ24gTDMgaGVhZGVyICovCkBAIC0xNzEzLDggKzE2MjcsOCBAQAogCiAgICAgICAgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CiAJbmV0aWZfcngoc2tiKTsKLQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CiB9CiAKICNpZiBBTExPV19ETUEKQEAgLTE3NjUsMTEgKzE2NzksMTEgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOwogCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLwotCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IChyZWFkcmVnKGRldiwgUFBfUnhNaXNzKSA+PiA2KTsKLQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAocmVhZHJlZyhkZXYsIFBQX1R4Q29sKSA+PiA2KTsKKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHJlYWRyZWcoZGV2LCBQUF9SeE1pc3MpID4+IDYpOworCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAocmVhZHJlZyhkZXYsIFBQX1R4Q29sKSA+PiA2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuICZscC0+c3RhdHM7CisJcmV0dXJuICZkZXYtPnN0YXRzOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NzODl4MC5oIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKaW5kZXggMjA0ZWQzNy4uOTE0MjNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3M4OXgwLmgKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKQEAgLTQzNywxMSArNDM3LDcgQEAKICNkZWZpbmUgSVJRX01BUF9FRVBST01fREFUQSAweDAwNDYgLyogIE9mZnNldCBpbnRvIGVlcHJvbSBmb3IgdGhlIElSUSBtYXAgKi8KICNkZWZpbmUgSVJRX01BUF9MRU4gMHgwMDA0IC8qICBObyBvZiBieXRlcyB0byByZWFkIGZvciB0aGUgSVJRIG1hcCAqLwogI2RlZmluZSBQTlBfSVJRX0ZSTVQgMHgwMDIyIC8qICBQTlAgc21hbGwgaXRlbSBJUlEgZm9ybWF0ICovCi0jaWZkZWYgQ09ORklHX1NIX0hJQ09TSDQKLSNkZWZpbmUgQ1M4OTAwX0lSUV9NQVAgMHgwMDAyIC8qIEhpQ08tU0g0IGJvYXJkIGhhcyBpdHMgSVJRIG9uICMxICovCi0jZWxzZQogI2RlZmluZSBDUzg5MDBfSVJRX01BUCAweDFjMjAgLyogIFRoaXMgSVJRIG1hcCBpcyBmaXhlZCAqLwotI2VuZGlmCiAKICNkZWZpbmUgQ1M4OTIwX05PX0lOVFMgMHgwRiAgIC8qICBNYXggQ1M4OTIwIGludGVycnVwdCBzZWxlY3QgIyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKaW5kZXggZTNmMWI4NS4uMDY2ZmQ1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtMjMxMSwxNSArMjMxMSw5IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdCwgdXNlcmFkZHIsIHNpemVvZih0KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJLyogQ2hlY2sgdC5sZW4gc2FuaXR5ID8gKi8KLQkJZndfZGF0YSA9IGttYWxsb2ModC5sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIWZ3X2RhdGEpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCShmd19kYXRhLCB1c2VyYWRkciArIHNpemVvZih0KSwgdC5sZW4pKSB7Ci0JCQlrZnJlZShmd19kYXRhKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJCWZ3X2RhdGEgPSBtZW1kdXBfdXNlcih1c2VyYWRkciArIHNpemVvZih0KSwgdC5sZW4pOworCQlpZiAoSVNfRVJSKGZ3X2RhdGEpKQorCQkJcmV0dXJuIFBUUl9FUlIoZndfZGF0YSk7CiAKIAkJcmV0ID0gdDNfbG9hZF9mdyhhZGFwdGVyLCBmd19kYXRhLCB0Lmxlbik7CiAJCWtmcmVlKGZ3X2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYwppbmRleCA1OTYyYjkxLi44ZmY5NmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYwpAQCAtMjAzLDE1ICsyMDMsMTEgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgbmVlZF9za2JfdW5tYXAodm9pZCkKIHsKLQkvKgotCSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gdGVsbCBpZiB0aGUgcGxhdGZvcm0gbmVlZHMgYnVmZmVyCi0JICogdW5tYXBwaW5nIGJ5IGNoZWNraW5nIGlmIERFQ0xBUkVfUENJX1VOTUFQX0FERFIgZGVmaW5lcyBhbnl0aGluZy4KLQkgKi8KLQlzdHJ1Y3QgZHVtbXkgewotCQlERUZJTkVfRE1BX1VOTUFQX0FERFIoYWRkcik7Ci0JfTsKLQotCXJldHVybiBzaXplb2Yoc3RydWN0IGR1bW15KSAhPSAwOworI2lmZGVmIENPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEUKKwlyZXR1cm4gMTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYwppbmRleCA5NWE4YmEwLi40MjdjNDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKQEAgLTY3OSwxNCArNjc5LDYgQEAKIAlyZXR1cm4gdDNfc2VlcHJvbV93cml0ZShhZGFwdGVyLCBFRVBST01fU1RBVF9BRERSLCBlbmFibGUgPyAweGMgOiAwKTsKIH0KIAotLyoKLSAqIENvbnZlcnQgYSBjaGFyYWN0ZXIgaG9sZGluZyBhIGhleCBkaWdpdCB0byBhIG51bWJlci4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBoZXgyaW50KHVuc2lnbmVkIGNoYXIgYykKLXsKLQlyZXR1cm4gaXNkaWdpdChjKSA/IGMgLSAnMCcgOiB0b3VwcGVyKGMpIC0gJ0EnICsgMTA7Ci19Ci0KIC8qKgogICoJZ2V0X3ZwZF9wYXJhbXMgLSByZWFkIFZQRCBwYXJhbWV0ZXJzIGZyb20gVlBEIEVFUFJPTQogICoJQGFkYXB0ZXI6IGFkYXB0ZXIgdG8gcmVhZApAQCAtNzI3LDE1ICs3MTksMTUgQEAKIAkJcC0+cG9ydF90eXBlWzBdID0gdXNlc194YXVpKGFkYXB0ZXIpID8gMSA6IDI7CiAJCXAtPnBvcnRfdHlwZVsxXSA9IHVzZXNfeGF1aShhZGFwdGVyKSA/IDYgOiAyOwogCX0gZWxzZSB7Ci0JCXAtPnBvcnRfdHlwZVswXSA9IGhleDJpbnQodnBkLnBvcnQwX2RhdGFbMF0pOwotCQlwLT5wb3J0X3R5cGVbMV0gPSBoZXgyaW50KHZwZC5wb3J0MV9kYXRhWzBdKTsKKwkJcC0+cG9ydF90eXBlWzBdID0gaGV4X3RvX2Jpbih2cGQucG9ydDBfZGF0YVswXSk7CisJCXAtPnBvcnRfdHlwZVsxXSA9IGhleF90b19iaW4odnBkLnBvcnQxX2RhdGFbMF0pOwogCQlwLT54YXVpY2ZnWzBdID0gc2ltcGxlX3N0cnRvdWwodnBkLnhhdWkwY2ZnX2RhdGEsIE5VTEwsIDE2KTsKIAkJcC0+eGF1aWNmZ1sxXSA9IHNpbXBsZV9zdHJ0b3VsKHZwZC54YXVpMWNmZ19kYXRhLCBOVUxMLCAxNik7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJcC0+ZXRoX2Jhc2VbaV0gPSBoZXgyaW50KHZwZC5uYV9kYXRhWzIgKiBpXSkgKiAxNiArCi0JCQkJIGhleDJpbnQodnBkLm5hX2RhdGFbMiAqIGkgKyAxXSk7CisJCXAtPmV0aF9iYXNlW2ldID0gaGV4X3RvX2Jpbih2cGQubmFfZGF0YVsyICogaV0pICogMTYgKworCQkJCSBoZXhfdG9fYmluKHZwZC5uYV9kYXRhWzIgKiBpICsgMV0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmggYi9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmgKaW5kZXggOWQwYmQ5ZC4uOGJkYTA2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3ZlcnNpb24uaApAQCAtMzUsMTAgKzM1LDEwIEBACiAjZGVmaW5lIERSVl9ERVNDICJDaGVsc2lvIFQzIE5ldHdvcmsgRHJpdmVyIgogI2RlZmluZSBEUlZfTkFNRSAiY3hnYjMiCiAvKiBEcml2ZXIgdmVyc2lvbiAqLwotI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4xLjMta28iCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjEuNC1rbyIKIAogLyogRmlybXdhcmUgdmVyc2lvbiAqLwogI2RlZmluZSBGV19WRVJTSU9OX01BSk9SIDcKLSNkZWZpbmUgRldfVkVSU0lPTl9NSU5PUiA0CisjZGVmaW5lIEZXX1ZFUlNJT05fTUlOT1IgMTAKICNkZWZpbmUgRldfVkVSU0lPTl9NSUNSTyAwCiAjZW5kaWYJCQkJLyogX19DSEVMU0lPX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjQuaCBiL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0LmgKaW5kZXggZGQxNzcwZS4uNmU1NjJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjQuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiNC9jeGdiNC5oCkBAIC0yMTksNiArMjE5LDEwIEBACiAJc3RydWN0IHZwZF9wYXJhbXMgdnBkOwogCXN0cnVjdCBwY2lfcGFyYW1zIHBjaTsKIAorCXVuc2lnbmVkIGludCBzZl9zaXplOyAgICAgICAgICAgICAvKiBzZXJpYWwgZmxhc2ggc2l6ZSBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBzZl9uc2VjOyAgICAgICAgICAgICAvKiAjIG9mIGZsYXNoIHNlY3RvcnMgKi8KKwl1bnNpZ25lZCBpbnQgc2ZfZndfc3RhcnQ7ICAgICAgICAgLyogc3RhcnQgb2YgRlcgaW1hZ2UgaW4gZmxhc2ggKi8KKwogCXVuc2lnbmVkIGludCBmd192ZXJzOwogCXVuc2lnbmVkIGludCB0cF92ZXJzOwogCXU4IGFwaV92ZXJzWzddOwpAQCAtMjkwLDcgKzI5NCw5IEBACiAJdTggICAgIHJ4X29mZmxvYWQ7ICAgICAgICAgICAgLyogQ1NPLCBldGMgKi8KIAl1OCAgICAgbnFzZXRzOyAgICAgICAgICAgICAgICAvKiAjIG9mIHFzZXRzICovCiAJdTggICAgIGZpcnN0X3FzZXQ7ICAgICAgICAgICAgLyogaW5kZXggb2YgZmlyc3QgcXNldCAqLworCXU4ICAgICByc3NfbW9kZTsKIAlzdHJ1Y3QgbGlua19jb25maWcgbGlua19jZmc7CisJdTE2ICAgKnJzczsKIH07CiAKIC8qIHBvcnRfaW5mby5yeF9vZmZsb2FkIGZsYWdzICovCkBAIC0zMDUsNyArMzExLDYgQEAKIAlGVUxMX0lOSVRfRE9ORSAgICAgPSAoMSA8PCAwKSwKIAlVU0lOR19NU0kgICAgICAgICAgPSAoMSA8PCAxKSwKIAlVU0lOR19NU0lYICAgICAgICAgPSAoMSA8PCAyKSwKLQlRVUVVRVNfQk9VTkQgICAgICAgPSAoMSA8PCAzKSwKIAlGV19PSyAgICAgICAgICAgICAgPSAoMSA8PCA0KSwKIH07CiAKQEAgLTQ3Nyw3ICs0ODIsOCBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBkZXZpY2UgKnBkZXZfZGV2OwogCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJlZF9kZXZpY2VfbWFwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZuOworCXVuc2lnbmVkIGludCBmbGFnczsKIAogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IG1zZ19lbmFibGU7CkBAIC02NDYsNiArNjUyLDcgQEAKIHZvaWQgdDRfaW50cl9jbGVhcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgdDRfc2xvd19pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCitpbnQgdDRfd2FpdF9kZXZfcmVhZHkoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwogaW50IHQ0X2xpbmtfc3RhcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBtYm94LCB1bnNpZ25lZCBpbnQgcG9ydCwKIAkJICBzdHJ1Y3QgbGlua19jb25maWcgKmxjKTsKIGludCB0NF9yZXN0YXJ0X2FuZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBtYm94LCB1bnNpZ25lZCBpbnQgcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNC9jeGdiNF9tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiNC9jeGdiNF9tYWluLmMKaW5kZXggNTgwNDViMC4uYzMyNzUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0X21haW4uYwpAQCAtNjcsNyArNjcsNyBAQAogI2luY2x1ZGUgInQ0ZndfYXBpLmgiCiAjaW5jbHVkZSAibDJ0LmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMC4wLWtvIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4zLjAta28iCiAjZGVmaW5lIERSVl9ERVNDICJDaGVsc2lvIFQ0IE5ldHdvcmsgRHJpdmVyIgogCiAvKgpAQCAtNzcsNiArNzcsNzYgQEAKICAqLwogI2RlZmluZSBNQVhfU0dFX1RJTUVSVkFMIDIwMFUKIAorI2lmZGVmIENPTkZJR19QQ0lfSU9WCisvKgorICogVmlydHVhbCBGdW5jdGlvbiBwcm92aXNpb25pbmcgY29uc3RhbnRzLiAgV2UgbmVlZCB0d28gZXh0cmEgSW5ncmVzcyBRdWV1ZXMKKyAqIHdpdGggSW50ZXJydXB0IGNhcGFiaWxpdHkgdG8gc2VydmUgYXMgdGhlIFZGJ3MgRmlybXdhcmUgRXZlbnQgUXVldWUgYW5kCisgKiBGb3J3YXJkZWQgSW50ZXJydXB0IFF1ZXVlICh3aGVuIHVzaW5nIE1TSSBtb2RlKSAtLSBuZWl0aGVyIHdpbGwgaGF2ZSBGcmVlCisgKiBMaXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlbSkuICBGb3IgZWFjaCBFdGhlcm5ldC9Db250cm9sIEVncmVzcyBRdWV1ZSBhbmQKKyAqIGZvciBlYWNoIEZyZWUgTGlzdCwgd2UgbmVlZCBhbiBFZ3Jlc3MgQ29udGV4dC4KKyAqLworZW51bSB7CisJVkZSRVNfTlBPUlRTID0gMSwJCS8qICMgb2YgInBvcnRzIiBwZXIgVkYgKi8KKwlWRlJFU19OUVNFVFMgPSAyLAkJLyogIyBvZiAiUXVldWUgU2V0cyIgcGVyIFZGICovCisKKwlWRlJFU19OVkkgPSBWRlJFU19OUE9SVFMsCS8qICMgb2YgVmlydHVhbCBJbnRlcmZhY2VzICovCisJVkZSRVNfTkVUSENUUkwgPSBWRlJFU19OUVNFVFMsCS8qICMgb2YgRVFzIHVzZWQgZm9yIEVUSCBvciBDVFJMIFFzICovCisJVkZSRVNfTklRRkxJTlQgPSBWRlJFU19OUVNFVFMrMiwvKiAjIG9mIGluZ3Jlc3MgUXMvdyBGcmVlIExpc3QocykvaW50ciAqLworCVZGUkVTX05JUSA9IDAsCQkJLyogIyBvZiBub24tZmwvaW50IGluZ3Jlc3MgcXVldWVzICovCisJVkZSRVNfTkVRID0gVkZSRVNfTlFTRVRTKjIsCS8qICMgb2YgZWdyZXNzIHF1ZXVlcyAqLworCVZGUkVTX1RDID0gMCwJCQkvKiBQQ0ktRSB0cmFmZmljIGNsYXNzICovCisJVkZSRVNfTkVYQUNURiA9IDE2LAkJLyogIyBvZiBleGFjdCBNUFMgZmlsdGVycyAqLworCisJVkZSRVNfUl9DQVBTID0gRldfQ01EX0NBUF9ETUFRfEZXX0NNRF9DQVBfVkZ8RldfQ01EX0NBUF9QT1JULAorCVZGUkVTX1dYX0NBUFMgPSBGV19DTURfQ0FQX0RNQVF8RldfQ01EX0NBUF9WRiwKK307CisKKy8qCisgKiBQcm92aWRlIGEgUG9ydCBBY2Nlc3MgUmlnaHRzIE1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgUEYvVkYuICBUaGlzIGlzIHZlcnkKKyAqIHN0YXRpYyBhbmQgbGlrZWx5IG5vdCB0byBiZSB1c2VmdWwgaW4gdGhlIGxvbmcgcnVuLiAgV2UgcmVhbGx5IG5lZWQgdG8KKyAqIGltcGxlbWVudCBzb21lIGZvcm0gb2YgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIHdoaWNoIHRoZSBmaXJtd2FyZQorICogY29udHJvbHMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGZ2ZnJlc19wbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgIHVuc2lnbmVkIGludCBwZiwgdW5zaWduZWQgaW50IHZmKQoreworCXVuc2lnbmVkIGludCBwb3J0biwgcG9ydHZlYzsKKworCS8qCisJICogR2l2ZSBQRidzIGFjY2VzcyB0byBhbGwgb2YgdGhlIHBvcnRzLgorCSAqLworCWlmICh2ZiA9PSAwKQorCQlyZXR1cm4gRldfUEZWRl9DTURfUE1BU0tfTUFTSzsKKworCS8qCisJICogRm9yIFZGcywgd2UnbGwgYXNzaWduIHRoZW0gYWNjZXNzIHRvIHRoZSBwb3J0cyBiYXNlZCBwdXJlbHkgb24gdGhlCisJICogUEYuICBXZSBhc3NpZ24gYWN0aXZlIHBvcnRzIGluIG9yZGVyLCB3cmFwcGluZyBhcm91bmQgaWYgdGhlcmUgYXJlCisJICogZmV3ZXIgYWN0aXZlIHBvcnRzIHRoYW4gUEZzOiBlLmcuIGFjdGl2ZSBwb3J0W3BmICUgbnBvcnRzXS4KKwkgKiBVbmZvcnR1bmF0ZWx5IHRoZSBhZGFwdGVyJ3MgcG9ydF9pbmZvIHN0cnVjdHMgaGF2ZW4ndCBiZWVuCisJICogaW5pdGlhbGl6ZWQgeWV0IHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGlzLgorCSAqLworCWlmIChhZGFwdGVyLT5wYXJhbXMubnBvcnRzID09IDApCisJCXJldHVybiAwOworCisJcG9ydG4gPSBwZiAlIGFkYXB0ZXItPnBhcmFtcy5ucG9ydHM7CisJcG9ydHZlYyA9IGFkYXB0ZXItPnBhcmFtcy5wb3J0dmVjOworCWZvciAoOzspIHsKKwkJLyoKKwkJICogSXNvbGF0ZSB0aGUgbG93ZXN0IHNldCBiaXQgaW4gdGhlIHBvcnQgdmVjdG9yLiAgSWYgd2UncmUgYXQKKwkJICogdGhlIHBvcnQgbnVtYmVyIHRoYXQgd2Ugd2FudCwgcmV0dXJuIHRoYXQgYXMgdGhlIHBtYXNrLgorCQkgKiBvdGhlcndpc2UgbWFzayB0aGF0IGJpdCBvdXQgb2YgdGhlIHBvcnQgdmVjdG9yIGFuZAorCQkgKiBkZWNyZW1lbnQgb3VyIHBvcnQgbnVtYmVyIC4uLgorCQkgKi8KKwkJdW5zaWduZWQgaW50IHBtYXNrID0gcG9ydHZlYyBeIChwb3J0dmVjICYgKHBvcnR2ZWMtMSkpOworCQlpZiAocG9ydG4gPT0gMCkKKwkJCXJldHVybiBwbWFzazsKKwkJcG9ydG4tLTsKKwkJcG9ydHZlYyAmPSB+cG1hc2s7CisJfQorCS8qTk9UUkVBQ0hFRCovCit9CisjZW5kaWYKKwogZW51bSB7CiAJTUVNV0lOMF9BUEVSVFVSRSA9IDY1NTM2LAogCU1FTVdJTjBfQkFTRSAgICAgPSAweDMwMDAwLApAQCAtMTAxLDEwICsxNzEsMjAgQEAKIAkJCSBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lGVVAgfFwKIAkJCSBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKIAotI2RlZmluZSBDSF9ERVZJQ0UoZGV2aWQpIHsgUENJX1ZERVZJQ0UoQ0hFTFNJTywgZGV2aWQpLCAwIH0KKyNkZWZpbmUgQ0hfREVWSUNFKGRldmlkLCBkYXRhKSB7IFBDSV9WREVWSUNFKENIRUxTSU8sIGRldmlkKSwgKGRhdGEpIH0KIAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGN4Z2I0X3BjaV90YmwpID0gewotCUNIX0RFVklDRSgweGEwMDApLCAgLyogUEUxMEsgKi8KKwlDSF9ERVZJQ0UoMHhhMDAwLCAwKSwgIC8qIFBFMTBLICovCisJQ0hfREVWSUNFKDB4NDAwMSwgMCksCisJQ0hfREVWSUNFKDB4NDAwMiwgMCksCisJQ0hfREVWSUNFKDB4NDAwMywgMCksCisJQ0hfREVWSUNFKDB4NDAwNCwgMCksCisJQ0hfREVWSUNFKDB4NDAwNSwgMCksCisJQ0hfREVWSUNFKDB4NDAwNiwgMCksCisJQ0hfREVWSUNFKDB4NDAwNywgMCksCisJQ0hfREVWSUNFKDB4NDAwOCwgMCksCisJQ0hfREVWSUNFKDB4NDAwOSwgMCksCisJQ0hfREVWSUNFKDB4NDAwYSwgMCksCiAJeyAwLCB9CiB9OwogCkBAIC0yMTYsNyArMjk2LDcgQEAKIHZvaWQgdDRfb3NfcG9ydG1vZF9jaGFuZ2VkKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwLCBpbnQgcG9ydF9pZCkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqbW9kX3N0cltdID0gewotCQlOVUxMLCAiTFIiLCAiU1IiLCAiRVIiLCAicGFzc2l2ZSBEQSIsICJhY3RpdmUgREEiCisJCU5VTEwsICJMUiIsICJTUiIsICJFUiIsICJwYXNzaXZlIERBIiwgImFjdGl2ZSBEQSIsICJMUk0iCiAJfTsKIAogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwLT5wb3J0W3BvcnRfaWRdOwpAQCAtMjI0LDcgKzMwNCw3IEBACiAKIAlpZiAocGktPm1vZF90eXBlID09IEZXX1BPUlRfTU9EX1RZUEVfTk9ORSkKIAkJbmV0ZGV2X2luZm8oZGV2LCAicG9ydCBtb2R1bGUgdW5wbHVnZ2VkXG4iKTsKLQllbHNlCisJZWxzZSBpZiAocGktPm1vZF90eXBlIDwgQVJSQVlfU0laRShtb2Rfc3RyKSkKIAkJbmV0ZGV2X2luZm8oZGV2LCAiJXMgbW9kdWxlIGluc2VydGVkXG4iLCBtb2Rfc3RyW3BpLT5tb2RfdHlwZV0pOwogfQogCkBAIC0yNDQsMTIgKzMyNCwxMyBAQAogCWludCB1Y19jbnQgPSBuZXRkZXZfdWNfY291bnQoZGV2KTsKIAlpbnQgbWNfY250ID0gbmV0ZGV2X21jX2NvdW50KGRldik7CiAJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBtYiA9IHBpLT5hZGFwdGVyLT5mbjsKIAogCS8qIGZpcnN0IGRvIHRoZSBzZWNvbmRhcnkgdW5pY2FzdCBhZGRyZXNzZXMgKi8KIAluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcihoYSwgZGV2KSB7CiAJCWFkZHJbbmFkZHIrK10gPSBoYS0+YWRkcjsKIAkJaWYgKC0tdWNfY250ID09IDAgfHwgbmFkZHIgPj0gQVJSQVlfU0laRShhZGRyKSkgewotCQkJcmV0ID0gdDRfYWxsb2NfbWFjX2ZpbHQocGktPmFkYXB0ZXIsIDAsIHBpLT52aWlkLCBmcmVlLAorCQkJcmV0ID0gdDRfYWxsb2NfbWFjX2ZpbHQocGktPmFkYXB0ZXIsIG1iLCBwaS0+dmlpZCwgZnJlZSwKIAkJCQkJbmFkZHIsIGFkZHIsIGZpbHRfaWR4LCAmdWhhc2gsIHNsZWVwKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CkBAIC0yNjMsNyArMzQ0LDcgQEAKIAluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CiAJCWFkZHJbbmFkZHIrK10gPSBoYS0+YWRkcjsKIAkJaWYgKC0tbWNfY250ID09IDAgfHwgbmFkZHIgPj0gQVJSQVlfU0laRShhZGRyKSkgewotCQkJcmV0ID0gdDRfYWxsb2NfbWFjX2ZpbHQocGktPmFkYXB0ZXIsIDAsIHBpLT52aWlkLCBmcmVlLAorCQkJcmV0ID0gdDRfYWxsb2NfbWFjX2ZpbHQocGktPmFkYXB0ZXIsIG1iLCBwaS0+dmlpZCwgZnJlZSwKIAkJCQkJbmFkZHIsIGFkZHIsIGZpbHRfaWR4LCAmbWhhc2gsIHNsZWVwKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CkBAIC0yNzMsNyArMzU0LDcgQEAKIAkJfQogCX0KIAotCXJldHVybiB0NF9zZXRfYWRkcl9oYXNoKHBpLT5hZGFwdGVyLCAwLCBwaS0+dmlpZCwgdWhhc2ggIT0gMCwKKwlyZXR1cm4gdDRfc2V0X2FkZHJfaGFzaChwaS0+YWRhcHRlciwgbWIsIHBpLT52aWlkLCB1aGFzaCAhPSAwLAogCQkJCXVoYXNoIHwgbWhhc2gsIHNsZWVwKTsKIH0KIApAQCAtMjg4LDcgKzM2OSw3IEBACiAKIAlyZXQgPSBzZXRfYWRkcl9maWx0ZXJzKGRldiwgc2xlZXBfb2spOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gdDRfc2V0X3J4bW9kZShwaS0+YWRhcHRlciwgMCwgcGktPnZpaWQsIG10dSwKKwkJcmV0ID0gdDRfc2V0X3J4bW9kZShwaS0+YWRhcHRlciwgcGktPmFkYXB0ZXItPmZuLCBwaS0+dmlpZCwgbXR1LAogCQkJCSAgICAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDEgOiAwLAogCQkJCSAgICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgPyAxIDogMCwgMSwgLTEsCiAJCQkJICAgIHNsZWVwX29rKTsKQEAgLTMwNSwxNSArMzg2LDE2IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IG1iID0gcGktPmFkYXB0ZXItPmZuOwogCiAJLyoKIAkgKiBXZSBkbyBub3Qgc2V0IGFkZHJlc3MgZmlsdGVycyBhbmQgcHJvbWlzY3VpdHkgaGVyZSwgdGhlIHN0YWNrIGRvZXMKIAkgKiB0aGF0IHN0ZXAgZXhwbGljaXRseS4KIAkgKi8KLQlyZXQgPSB0NF9zZXRfcnhtb2RlKHBpLT5hZGFwdGVyLCAwLCBwaS0+dmlpZCwgZGV2LT5tdHUsIC0xLCAtMSwgLTEsCisJcmV0ID0gdDRfc2V0X3J4bW9kZShwaS0+YWRhcHRlciwgbWIsIHBpLT52aWlkLCBkZXYtPm10dSwgLTEsIC0xLCAtMSwKIAkJCSAgICBwaS0+dmxhbl9ncnAgIT0gTlVMTCwgdHJ1ZSk7CiAJaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IHQ0X2NoYW5nZV9tYWMocGktPmFkYXB0ZXIsIDAsIHBpLT52aWlkLAorCQlyZXQgPSB0NF9jaGFuZ2VfbWFjKHBpLT5hZGFwdGVyLCBtYiwgcGktPnZpaWQsCiAJCQkJICAgIHBpLT54YWN0X2FkZHJfZmlsdCwgZGV2LT5kZXZfYWRkciwgdHJ1ZSwKIAkJCQkgICAgdHJ1ZSk7CiAJCWlmIChyZXQgPj0gMCkgewpAQCAtMzIyLDkgKzQwNCwxMCBAQAogCQl9CiAJfQogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gdDRfbGlua19zdGFydChwaS0+YWRhcHRlciwgMCwgcGktPnR4X2NoYW4sICZwaS0+bGlua19jZmcpOworCQlyZXQgPSB0NF9saW5rX3N0YXJ0KHBpLT5hZGFwdGVyLCBtYiwgcGktPnR4X2NoYW4sCisJCQkJICAgICZwaS0+bGlua19jZmcpOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gdDRfZW5hYmxlX3ZpKHBpLT5hZGFwdGVyLCAwLCBwaS0+dmlpZCwgdHJ1ZSwgdHJ1ZSk7CisJCXJldCA9IHQ0X2VuYWJsZV92aShwaS0+YWRhcHRlciwgbWIsIHBpLT52aWlkLCB0cnVlLCB0cnVlKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MjcsMzAgKzYxMCw0NyBAQAogfQogCiAvKioKKyAqCXdyaXRlX3JzcyAtIHdyaXRlIHRoZSBSU1MgdGFibGUgZm9yIGEgZ2l2ZW4gcG9ydAorICoJQHBpOiB0aGUgcG9ydAorICoJQHF1ZXVlczogYXJyYXkgb2YgcXVldWUgaW5kaWNlcyBmb3IgUlNTCisgKgorICoJU2V0cyB1cCB0aGUgcG9ydGlvbiBvZiB0aGUgSFcgUlNTIHRhYmxlIGZvciB0aGUgcG9ydCdzIFZJIHRvIGRpc3RyaWJ1dGUKKyAqCXBhY2tldHMgdG8gdGhlIFJ4IHF1ZXVlcyBpbiBAcXVldWVzLgorICovCitzdGF0aWMgaW50IHdyaXRlX3Jzcyhjb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgY29uc3QgdTE2ICpxdWV1ZXMpCit7CisJdTE2ICpyc3M7CisJaW50IGksIGVycjsKKwljb25zdCBzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnEgPSAmcGktPmFkYXB0ZXItPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXRdOworCisJcnNzID0ga21hbGxvYyhwaS0+cnNzX3NpemUgKiBzaXplb2YodTE2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyc3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbWFwIHRoZSBxdWV1ZSBpbmRpY2VzIHRvIHF1ZXVlIGlkcyAqLworCWZvciAoaSA9IDA7IGkgPCBwaS0+cnNzX3NpemU7IGkrKywgcXVldWVzKyspCisJCXJzc1tpXSA9IHFbKnF1ZXVlc10ucnNwcS5hYnNfaWQ7CisKKwllcnIgPSB0NF9jb25maWdfcnNzX3JhbmdlKHBpLT5hZGFwdGVyLCBwaS0+YWRhcHRlci0+Zm4sIHBpLT52aWlkLCAwLAorCQkJCSAgcGktPnJzc19zaXplLCByc3MsIHBpLT5yc3Nfc2l6ZSk7CisJa2ZyZWUocnNzKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKICAqCXNldHVwX3JzcyAtIGNvbmZpZ3VyZSBSU1MKICAqCUBhZGFwOiB0aGUgYWRhcHRlcgogICoKLSAqCVNldHMgdXAgUlNTIHRvIGRpc3RyaWJ1dGUgcGFja2V0cyB0byBtdWx0aXBsZSByZWNlaXZlIHF1ZXVlcy4gIFdlCi0gKgljb25maWd1cmUgdGhlIFJTUyBDUFUgbG9va3VwIHRhYmxlIHRvIGRpc3RyaWJ1dGUgdG8gdGhlIG51bWJlciBvZiBIVwotICoJcmVjZWl2ZSBxdWV1ZXMsIGFuZCB0aGUgcmVzcG9uc2UgcXVldWUgbG9va3VwIHRhYmxlIHRvIG5hcnJvdyB0aGF0Ci0gKglkb3duIHRvIHRoZSByZXNwb25zZSBxdWV1ZXMgYWN0dWFsbHkgY29uZmlndXJlZCBmb3IgZWFjaCBwb3J0LgotICoJV2UgYWx3YXlzIGNvbmZpZ3VyZSB0aGUgUlNTIG1hcHBpbmcgZm9yIGFsbCBwb3J0cyBzaW5jZSB0aGUgbWFwcGluZwotICoJdGFibGUgaGFzIHBsZW50eSBvZiBlbnRyaWVzLgorICoJU2V0cyB1cCBSU1MgZm9yIGVhY2ggcG9ydC4KICAqLwogc3RhdGljIGludCBzZXR1cF9yc3Moc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7Ci0JaW50IGksIGosIGVycjsKLQl1MTYgcnNzW01BWF9FVEhfUVNFVFNdOworCWludCBpLCBlcnI7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKIAkJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXAsIGkpOwotCQljb25zdCBzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnEgPSAmYWRhcC0+c2dlLmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF07CiAKLQkJZm9yIChqID0gMDsgaiA8IHBpLT5ucXNldHM7IGorKykKLQkJCXJzc1tqXSA9IHFbal0ucnNwcS5hYnNfaWQ7Ci0KLQkJZXJyID0gdDRfY29uZmlnX3Jzc19yYW5nZShhZGFwLCAwLCBwaS0+dmlpZCwgMCwgcGktPnJzc19zaXplLAotCQkJCQkgIHJzcywgcGktPm5xc2V0cyk7CisJCWVyciA9IHdyaXRlX3JzcyhwaSwgcGktPnJzcyk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KQEAgLTk2MywxMCArMTA2MywxMSBAQAogICogUmV0dXJuIGEgdmVyc2lvbiBudW1iZXIgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgYWRhcHRlci4gIFRoZSBzY2hlbWUgaXM6CiAgKiAtIGJpdHMgMC4uOTogY2hpcCB2ZXJzaW9uCiAgKiAtIGJpdHMgMTAuLjE1OiBjaGlwIHJldmlzaW9uCisgKiAtIGJpdHMgMTYuLjIzOiByZWdpc3RlciBkdW1wIHZlcnNpb24KICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWtfYWRhcF92ZXJzKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphcCkKIHsKLQlyZXR1cm4gNCB8IChhcC0+cGFyYW1zLnJldiA8PCAxMCk7CisJcmV0dXJuIDQgfCAoYXAtPnBhcmFtcy5yZXYgPDwgMTApIHwgKDEgPDwgMTYpOwogfQogCiBzdGF0aWMgdm9pZCByZWdfYmxvY2tfZHVtcChzdHJ1Y3QgYWRhcHRlciAqYXAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHN0YXJ0LApAQCAtMTA0MSw3ICsxMTQyLDkgQEAKIAkJMHhkZmMwLCAweGRmZTAsCiAJCTB4ZTAwMCwgMHhlYTdjLAogCQkweGYwMDAsIDB4MTExOTAsCi0JCTB4MTkwNDAsIDB4MTkxMjQsCisJCTB4MTkwNDAsIDB4MTkwNmMsCisJCTB4MTkwNzgsIDB4MTkwODAsCisJCTB4MTkwOGMsIDB4MTkxMjQsCiAJCTB4MTkxNTAsIDB4MTkxYjAsCiAJCTB4MTkxZDAsIDB4MTkxZTgsCiAJCTB4MTkyMzgsIDB4MTkyNGMsCkBAIC0xMDU0LDQ5ICsxMTU3LDQ5IEBACiAJCTB4MWExOTAsIDB4MWExYzQsCiAJCTB4MWExZmMsIDB4MWExZmMsCiAJCTB4MWUwNDAsIDB4MWUwNGMsCi0JCTB4MWUyNDAsIDB4MWUyOGMsCisJCTB4MWUyODQsIDB4MWUyOGMsCiAJCTB4MWUyYzAsIDB4MWUyYzAsCiAJCTB4MWUyZTAsIDB4MWUyZTAsCiAJCTB4MWUzMDAsIDB4MWUzODQsCiAJCTB4MWUzYzAsIDB4MWUzYzgsCiAJCTB4MWU0NDAsIDB4MWU0NGMsCi0JCTB4MWU2NDAsIDB4MWU2OGMsCisJCTB4MWU2ODQsIDB4MWU2OGMsCiAJCTB4MWU2YzAsIDB4MWU2YzAsCiAJCTB4MWU2ZTAsIDB4MWU2ZTAsCiAJCTB4MWU3MDAsIDB4MWU3ODQsCiAJCTB4MWU3YzAsIDB4MWU3YzgsCiAJCTB4MWU4NDAsIDB4MWU4NGMsCi0JCTB4MWVhNDAsIDB4MWVhOGMsCisJCTB4MWVhODQsIDB4MWVhOGMsCiAJCTB4MWVhYzAsIDB4MWVhYzAsCiAJCTB4MWVhZTAsIDB4MWVhZTAsCiAJCTB4MWViMDAsIDB4MWViODQsCiAJCTB4MWViYzAsIDB4MWViYzgsCiAJCTB4MWVjNDAsIDB4MWVjNGMsCi0JCTB4MWVlNDAsIDB4MWVlOGMsCisJCTB4MWVlODQsIDB4MWVlOGMsCiAJCTB4MWVlYzAsIDB4MWVlYzAsCiAJCTB4MWVlZTAsIDB4MWVlZTAsCiAJCTB4MWVmMDAsIDB4MWVmODQsCiAJCTB4MWVmYzAsIDB4MWVmYzgsCiAJCTB4MWYwNDAsIDB4MWYwNGMsCi0JCTB4MWYyNDAsIDB4MWYyOGMsCisJCTB4MWYyODQsIDB4MWYyOGMsCiAJCTB4MWYyYzAsIDB4MWYyYzAsCiAJCTB4MWYyZTAsIDB4MWYyZTAsCiAJCTB4MWYzMDAsIDB4MWYzODQsCiAJCTB4MWYzYzAsIDB4MWYzYzgsCiAJCTB4MWY0NDAsIDB4MWY0NGMsCi0JCTB4MWY2NDAsIDB4MWY2OGMsCisJCTB4MWY2ODQsIDB4MWY2OGMsCiAJCTB4MWY2YzAsIDB4MWY2YzAsCiAJCTB4MWY2ZTAsIDB4MWY2ZTAsCiAJCTB4MWY3MDAsIDB4MWY3ODQsCiAJCTB4MWY3YzAsIDB4MWY3YzgsCiAJCTB4MWY4NDAsIDB4MWY4NGMsCi0JCTB4MWZhNDAsIDB4MWZhOGMsCisJCTB4MWZhODQsIDB4MWZhOGMsCiAJCTB4MWZhYzAsIDB4MWZhYzAsCiAJCTB4MWZhZTAsIDB4MWZhZTAsCiAJCTB4MWZiMDAsIDB4MWZiODQsCiAJCTB4MWZiYzAsIDB4MWZiYzgsCiAJCTB4MWZjNDAsIDB4MWZjNGMsCi0JCTB4MWZlNDAsIDB4MWZlOGMsCisJCTB4MWZlODQsIDB4MWZlOGMsCiAJCTB4MWZlYzAsIDB4MWZlYzAsCiAJCTB4MWZlZTAsIDB4MWZlZTAsCiAJCTB4MWZmMDAsIDB4MWZmODQsCkBAIC0xMjE3LDE2ICsxMzIwLDE4IEBACiAJCXJldHVybiAtRUFHQUlOOwogCWlmIChwLT5saW5rX2NmZy5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl0NF9yZXN0YXJ0X2FuZWcocC0+YWRhcHRlciwgMCwgcC0+dHhfY2hhbik7CisJdDRfcmVzdGFydF9hbmVnKHAtPmFkYXB0ZXIsIHAtPmFkYXB0ZXItPmZuLCBwLT50eF9jaGFuKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpZGVudGlmeV9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQogeworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwogCWlmIChkYXRhID09IDApCiAJCWRhdGEgPSAyOyAgICAgLyogZGVmYXVsdCB0byAyIHNlY29uZHMgKi8KIAotCXJldHVybiB0NF9pZGVudGlmeV9wb3J0KG5ldGRldjJhZGFwKGRldiksIDAsIG5ldGRldjJwaW5mbyhkZXYpLT52aWlkLAorCXJldHVybiB0NF9pZGVudGlmeV9wb3J0KGFkYXAsIGFkYXAtPmZuLCBuZXRkZXYycGluZm8oZGV2KS0+dmlpZCwKIAkJCQlkYXRhICogNSk7CiB9CiAKQEAgLTEyMzQsNyArMTMzOSw4IEBACiB7CiAJdW5zaWduZWQgaW50IHYgPSAwOwogCi0JaWYgKHR5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1NHTUlJIHx8IHR5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1hBVUkpIHsKKwlpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfU0dNSUkgfHwgdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfWEZJIHx8CisJICAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1hBVUkpIHsKIAkJdiB8PSBTVVBQT1JURURfVFA7CiAJCWlmIChjYXBzICYgRldfUE9SVF9DQVBfU1BFRURfMTAwTSkKIAkJCXYgfD0gU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGw7CkBAIC0xMjUwLDcgKzEzNTYsMTAgQEAKIAkJCXYgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsOwogCX0gZWxzZSBpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfS1IpCiAJCXYgfD0gU1VQUE9SVEVEX0JhY2twbGFuZSB8IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsOwotCWVsc2UgaWYgKHR5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSKQorCWVsc2UgaWYgKHR5cGUgPT0gRldfUE9SVF9UWVBFX0JQX0FQKQorCQl2IHw9IFNVUFBPUlRFRF9CYWNrcGxhbmUgfCBTVVBQT1JURURfMTAwMDBiYXNlUl9GRUM7CisJZWxzZSBpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfRklCRVJfWEZJIHx8CisJCSB0eXBlID09IEZXX1BPUlRfVFlQRV9GSUJFUl9YQVVJIHx8IHR5cGUgPT0gRldfUE9SVF9UWVBFX1NGUCkKIAkJdiB8PSBTVVBQT1JURURfRklCUkU7CiAKIAlpZiAoY2FwcyAmIEZXX1BPUlRfQ0FQX0FORUcpCkBAIC0xMjc2LDEzICsxMzg1LDE5IEBACiAJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAocC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9CVF9TR01JSSB8fAorCSAgICBwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1hGSSB8fAogCSAgICBwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1hBVUkpCiAJCWNtZC0+cG9ydCA9IFBPUlRfVFA7Ci0JZWxzZSBpZiAocC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9GSUJFUikKKwllbHNlIGlmIChwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSX1hGSSB8fAorCQkgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9GSUJFUl9YQVVJKQogCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwotCWVsc2UgaWYgKHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfVFdJTkFYKQotCQljbWQtPnBvcnQgPSBQT1JUX0RBOwotCWVsc2UKKwllbHNlIGlmIChwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX1NGUCkgeworCQlpZiAocC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9UV0lOQVhfUEFTU0lWRSB8fAorCQkgICAgcC0+bW9kX3R5cGUgPT0gRldfUE9SVF9NT0RfVFlQRV9UV0lOQVhfQUNUSVZFKQorCQkJY21kLT5wb3J0ID0gUE9SVF9EQTsKKwkJZWxzZQorCQkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwl9IGVsc2UKIAkJY21kLT5wb3J0ID0gUE9SVF9PVEhFUjsKIAogCWlmIChwLT5tZGlvX2FkZHIgPj0gMCkgewpAQCAtMTM1Niw3ICsxNDcxLDggQEAKIAlsYy0+YXV0b25lZyA9IGNtZC0+YXV0b25lZzsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCXJldHVybiB0NF9saW5rX3N0YXJ0KHAtPmFkYXB0ZXIsIDAsIHAtPnR4X2NoYW4sIGxjKTsKKwkJcmV0dXJuIHQ0X2xpbmtfc3RhcnQocC0+YWRhcHRlciwgcC0+YWRhcHRlci0+Zm4sIHAtPnR4X2NoYW4sCisJCQkJICAgICBsYyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzODgsNyArMTUwNCw4IEBACiAJaWYgKGVwYXVzZS0+dHhfcGF1c2UpCiAJCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfVFg7CiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIHQ0X2xpbmtfc3RhcnQocC0+YWRhcHRlciwgMCwgcC0+dHhfY2hhbiwgbGMpOworCQlyZXR1cm4gdDRfbGlua19zdGFydChwLT5hZGFwdGVyLCBwLT5hZGFwdGVyLT5mbiwgcC0+dHhfY2hhbiwKKwkJCQkgICAgIGxjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUyMCw3ICsxNjM3LDggQEAKIAkJCXYgPSBGV19QQVJBTVNfTU5FTShGV19QQVJBTVNfTU5FTV9ETUFRKSB8CiAJCQkgICAgRldfUEFSQU1TX1BBUkFNX1goRldfUEFSQU1TX1BBUkFNX0RNQVFfSVFfSU5UQ05UVEhSRVNIKSB8CiAJCQkgICAgRldfUEFSQU1TX1BBUkFNX1laKHEtPmNudHh0X2lkKTsKLQkJCWVyciA9IHQ0X3NldF9wYXJhbXMoYWRhcCwgMCwgMCwgMCwgMSwgJnYsICZuZXdfaWR4KTsKKwkJCWVyciA9IHQ0X3NldF9wYXJhbXMoYWRhcCwgYWRhcC0+Zm4sIGFkYXAtPmZuLCAwLCAxLCAmdiwKKwkJCQkJICAgICZuZXdfaWR4KTsKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMTcwOCwyNyArMTgyNiwxMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjZGVmaW5lIFRTT19GTEFHUyAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfCBORVRJRl9GX1RTT19FQ04pCisKIHN0YXRpYyBpbnQgc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCiB7CiAJaWYgKHZhbHVlKQotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082OworCQlkZXYtPmZlYXR1cmVzIHw9IFRTT19GTEFHUzsKIAllbHNlCi0JCWRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNik7CisJCWRldi0+ZmVhdHVyZXMgJj0gflRTT19GTEFHUzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZsYWdzKQogewotCWlmIChmbGFncyAmIH5FVEhfRkxBR19SWEhBU0gpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gZXRodG9vbF9vcF9zZXRfZmxhZ3MoZGV2LCBmbGFncywgRVRIX0ZMQUdfUlhIQVNIKTsKK30KIAotCWlmIChmbGFncyAmIEVUSF9GTEFHX1JYSEFTSCkKLQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1JYSEFTSDsKLQllbHNlCi0JCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfUlhIQVNIOworc3RhdGljIGludCBnZXRfcnNzX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKnApCit7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBuID0gbWluX3QodW5zaWduZWQgaW50LCBwLT5zaXplLCBwaS0+cnNzX3NpemUpOworCisJcC0+c2l6ZSA9IHBpLT5yc3Nfc2l6ZTsKKwl3aGlsZSAobi0tKQorCQlwLT5yaW5nX2luZGV4W25dID0gcGktPnJzc1tuXTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZXRfcnNzX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgY29uc3Qgc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocC0+c2l6ZSAhPSBwaS0+cnNzX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBwLT5zaXplOyBpKyspCisJCWlmIChwLT5yaW5nX2luZGV4W2ldID49IHBpLT5ucXNldHMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+c2l6ZTsgaSsrKQorCQlwaS0+cnNzW2ldID0gcC0+cmluZ19pbmRleFtpXTsKKwlpZiAocGktPmFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCXJldHVybiB3cml0ZV9yc3MocGksIHBpLT5yc3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqaW5mbywKKwkJICAgICB2b2lkICpydWxlcykKK3sKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2ggKGluZm8tPmNtZCkgeworCWNhc2UgRVRIVE9PTF9HUlhGSDogeworCQl1bnNpZ25lZCBpbnQgdiA9IHBpLT5yc3NfbW9kZTsKKworCQlpbmZvLT5kYXRhID0gMDsKKwkJc3dpdGNoIChpbmZvLT5mbG93X3R5cGUpIHsKKwkJY2FzZSBUQ1BfVjRfRkxPVzoKKwkJCWlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0Rk9VUlRVUEVOKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVCB8CisJCQkJCSAgICAgUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkJZWxzZSBpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNFRXT1RVUEVOKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCWJyZWFrOworCQljYXNlIFVEUF9WNF9GTE9XOgorCQkJaWYgKCh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0Rk9VUlRVUEVOKSAmJgorCQkJICAgICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU4pKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVCB8CisJCQkJCSAgICAgUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkJZWxzZSBpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNFRXT1RVUEVOKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfVjRfRkxPVzoKKwkJY2FzZSBBSF9FU1BfVjRfRkxPVzoKKwkJY2FzZSBJUFY0X0ZMT1c6CisJCQlpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNFRXT1RVUEVOKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCWJyZWFrOworCQljYXNlIFRDUF9WNl9GTE9XOgorCQkJaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZGT1VSVFVQRU4pCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUIHwKKwkJCQkJICAgICBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCQllbHNlIGlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2VFdPVFVQRU4pCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOworCQkJYnJlYWs7CisJCWNhc2UgVURQX1Y2X0ZMT1c6CisJCQlpZiAoKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZGT1VSVFVQRU4pICYmCisJCQkgICAgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTikpCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUIHwKKwkJCQkJICAgICBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCQllbHNlIGlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2VFdPVFVQRU4pCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9WNl9GTE9XOgorCQljYXNlIEFIX0VTUF9WNl9GTE9XOgorCQljYXNlIElQVjZfRkxPVzoKKwkJCWlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2VFdPVFVQRU4pCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKKwkJaW5mby0+ZGF0YSA9IHBpLT5ucXNldHM7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgY3hnYl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzICAgICAgPSBnZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncyAgICAgID0gc2V0X3NldHRpbmdzLApAQCAtMTc2MCw2ICsxOTY1LDkgQEAKIAkuc2V0X3dvbCAgICAgICAgICAgPSBzZXRfd29sLAogCS5zZXRfdHNvICAgICAgICAgICA9IHNldF90c28sCiAJLnNldF9mbGFncyAgICAgICAgID0gc2V0X2ZsYWdzLAorCS5nZXRfcnhuZmMgICAgICAgICA9IGdldF9yeG5mYywKKwkuZ2V0X3J4ZmhfaW5kaXIgICAgPSBnZXRfcnNzX3RhYmxlLAorCS5zZXRfcnhmaF9pbmRpciAgICA9IHNldF9yc3NfdGFibGUsCiAJLmZsYXNoX2RldmljZSAgICAgID0gc2V0X2ZsYXNoLAogfTsKIApAQCAtMjMwNiw5ICsyNTE0LDExIEBACiAJbGxpLmFkYXB0ZXJfdHlwZSA9IGFkYXAtPnBhcmFtcy5yZXY7CiAJbGxpLmlzY3NpX2lvbGVuID0gTUFYUlhEQVRBX0dFVCh0NF9yZWFkX3JlZyhhZGFwLCBUUF9QQVJBX1JFRzIpKTsKIAlsbGkudWRiX2RlbnNpdHkgPSAxIDw8IFFVRVVFU1BFUlBBR0VQRjBfR0VUKAotCQkJdDRfcmVhZF9yZWcoYWRhcCwgU0dFX0VHUkVTU19RVUVVRVNfUEVSX1BBR0VfUEYpKTsKKwkJCXQ0X3JlYWRfcmVnKGFkYXAsIFNHRV9FR1JFU1NfUVVFVUVTX1BFUl9QQUdFX1BGKSA+PgorCQkJKGFkYXAtPmZuICogNCkpOwogCWxsaS51Y3FfZGVuc2l0eSA9IDEgPDwgUVVFVUVTUEVSUEFHRVBGMF9HRVQoCi0JCQl0NF9yZWFkX3JlZyhhZGFwLCBTR0VfSU5HUkVTU19RVUVVRVNfUEVSX1BBR0VfUEYpKTsKKwkJCXQ0X3JlYWRfcmVnKGFkYXAsIFNHRV9JTkdSRVNTX1FVRVVFU19QRVJfUEFHRV9QRikgPj4KKwkJCShhZGFwLT5mbiAqIDQpKTsKIAlsbGkuZ3RzX3JlZyA9IGFkYXAtPnJlZ3MgKyBNWVBGX1JFRyhTR0VfUEZfR1RTKTsKIAlsbGkuZGJfcmVnID0gYWRhcC0+cmVncyArIE1ZUEZfUkVHKFNHRV9QRl9LRE9PUkJFTEwpOwogCWxsaS5md192ZXJzID0gYWRhcC0+cGFyYW1zLmZ3X3ZlcnM7CkBAIC0yNDgzLDYgKzI2OTMsNyBAQAogCXQ0X2ludHJfZGlzYWJsZShhZGFwdGVyKTsKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT50aWRfcmVsZWFzZV90YXNrKTsKIAlhZGFwdGVyLT50aWRfcmVsZWFzZV90YXNrX2J1c3kgPSBmYWxzZTsKKwlhZGFwdGVyLT50aWRfcmVsZWFzZV9oZWFkID0gTlVMTDsKIAogCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKIAkJZnJlZV9tc2l4X3F1ZXVlX2lycXMoYWRhcHRlcik7CkBAIC0yNTExLDkgKzI3MjIsMTAgQEAKIAl9CiAKIAlkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA9IHBpLT5ucXNldHM7Ci0JbGlua19zdGFydChkZXYpOwotCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoZGV2KTsKLQlyZXR1cm4gMDsKKwllcnIgPSBsaW5rX3N0YXJ0KGRldik7CisJaWYgKCFlcnIpCisJCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGN4Z2JfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI1MjMsMTUgKzI3MzUsMTUgQEAKIAogCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhkZXYpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JcmV0dXJuIHQ0X2VuYWJsZV92aShhZGFwdGVyLCAwLCBwaS0+dmlpZCwgZmFsc2UsIGZhbHNlKTsKKwlyZXR1cm4gdDRfZW5hYmxlX3ZpKGFkYXB0ZXIsIGFkYXB0ZXItPmZuLCBwaS0+dmlpZCwgZmFsc2UsIGZhbHNlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjeGdiX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqY3hnYl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqbnMpCiB7CiAJc3RydWN0IHBvcnRfc3RhdHMgc3RhdHM7CiAJc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwLT5hZGFwdGVyOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpucyA9ICZkZXYtPnN0YXRzOwogCiAJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKIAl0NF9nZXRfcG9ydF9zdGF0cyhhZGFwdGVyLCBwLT50eF9jaGFuLCAmc3RhdHMpOwpAQCAtMjU3MCw2ICsyNzgyLDcgQEAKIAogc3RhdGljIGludCBjeGdiX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcmVxLCBpbnQgY21kKQogeworCXVuc2lnbmVkIGludCBtYm94OwogCWludCByZXQgPSAwLCBwcnRhZCwgZGV2YWQ7CiAJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKikmcmVxLT5pZnJfZGF0YTsKQEAgLTI1OTIsMTEgKzI4MDUsMTIgQEAKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAorCQltYm94ID0gcGktPmFkYXB0ZXItPmZuOwogCQlpZiAoY21kID09IFNJT0NHTUlJUkVHKQotCQkJcmV0ID0gdDRfbWRpb19yZChwaS0+YWRhcHRlciwgMCwgcHJ0YWQsIGRldmFkLAorCQkJcmV0ID0gdDRfbWRpb19yZChwaS0+YWRhcHRlciwgbWJveCwgcHJ0YWQsIGRldmFkLAogCQkJCQkgZGF0YS0+cmVnX251bSwgJmRhdGEtPnZhbF9vdXQpOwogCQllbHNlCi0JCQlyZXQgPSB0NF9tZGlvX3dyKHBpLT5hZGFwdGVyLCAwLCBwcnRhZCwgZGV2YWQsCisJCQlyZXQgPSB0NF9tZGlvX3dyKHBpLT5hZGFwdGVyLCBtYm94LCBwcnRhZCwgZGV2YWQsCiAJCQkJCSBkYXRhLT5yZWdfbnVtLCBkYXRhLT52YWxfaW4pOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjYxOCw4ICsyODMyLDggQEAKIAogCWlmIChuZXdfbXR1IDwgODEgfHwgbmV3X210dSA+IE1BWF9NVFUpICAgICAgICAgLyogYWNjb21tb2RhdGUgU0FDSyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXQgPSB0NF9zZXRfcnhtb2RlKHBpLT5hZGFwdGVyLCAwLCBwaS0+dmlpZCwgbmV3X210dSwgLTEsIC0xLCAtMSwgLTEsCi0JCQkgICAgdHJ1ZSk7CisJcmV0ID0gdDRfc2V0X3J4bW9kZShwaS0+YWRhcHRlciwgcGktPmFkYXB0ZXItPmZuLCBwaS0+dmlpZCwgbmV3X210dSwgLTEsCisJCQkgICAgLTEsIC0xLCAtMSwgdHJ1ZSk7CiAJaWYgKCFyZXQpCiAJCWRldi0+bXR1ID0gbmV3X210dTsKIAlyZXR1cm4gcmV0OwpAQCAtMjYzNCw4ICsyODQ4LDggQEAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gdDRfY2hhbmdlX21hYyhwaS0+YWRhcHRlciwgMCwgcGktPnZpaWQsIHBpLT54YWN0X2FkZHJfZmlsdCwKLQkJCSAgICBhZGRyLT5zYV9kYXRhLCB0cnVlLCB0cnVlKTsKKwlyZXQgPSB0NF9jaGFuZ2VfbWFjKHBpLT5hZGFwdGVyLCBwaS0+YWRhcHRlci0+Zm4sIHBpLT52aWlkLAorCQkJICAgIHBpLT54YWN0X2FkZHJfZmlsdCwgYWRkci0+c2FfZGF0YSwgdHJ1ZSwgdHJ1ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTI2NDksOCArMjg2Myw4IEBACiAJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJcGktPnZsYW5fZ3JwID0gZ3JwOwotCXQ0X3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIDAsIHBpLT52aWlkLCAtMSwgLTEsIC0xLCAtMSwgZ3JwICE9IE5VTEwsCi0JCSAgICAgIHRydWUpOworCXQ0X3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIHBpLT5hZGFwdGVyLT5mbiwgcGktPnZpaWQsIC0xLCAtMSwgLTEsIC0xLAorCQkgICAgICBncnAgIT0gTlVMTCwgdHJ1ZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgpAQCAtMjY3NCw3ICsyODg4LDcgQEAKIAkubmRvX29wZW4gICAgICAgICAgICAgPSBjeGdiX29wZW4sCiAJLm5kb19zdG9wICAgICAgICAgICAgID0gY3hnYl9jbG9zZSwKIAkubmRvX3N0YXJ0X3htaXQgICAgICAgPSB0NF9ldGhfeG1pdCwKLQkubmRvX2dldF9zdGF0cyAgICAgICAgPSBjeGdiX2dldF9zdGF0cywKKwkubmRvX2dldF9zdGF0czY0ICAgICAgPSBjeGdiX2dldF9zdGF0cywKIAkubmRvX3NldF9yeF9tb2RlICAgICAgPSBjeGdiX3NldF9yeG1vZGUsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MgID0gY3hnYl9zZXRfbWFjX2FkZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyICAgID0gZXRoX3ZhbGlkYXRlX2FkZHIsCkBAIC0yNzA3LDYgKzI5MjEsNzYgQEAKIAl0NF93cml0ZV9yZWcoYWRhcCwgUENJRV9NRU1fQUNDRVNTX1JFRyhQQ0lFX01FTV9BQ0NFU1NfQkFTRV9XSU4sIDIpLAogCQkgICAgIChiYXIwICsgTUVNV0lOMl9CQVNFKSB8IEJJUigwKSB8CiAJCSAgICAgV0lORE9XKGlsb2cyKE1FTVdJTjJfQVBFUlRVUkUpIC0gMTApKTsKKwlpZiAoYWRhcC0+dnJlcy5vY3Euc2l6ZSkgeworCQl1bnNpZ25lZCBpbnQgc3RhcnQsIHN6X2tiOworCisJCXN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGFkYXAtPnBkZXYsIDIpICsKKwkJCU9DUV9XSU5fT0ZGU0VUKGFkYXAtPnBkZXYsICZhZGFwLT52cmVzKTsKKwkJc3pfa2IgPSByb3VuZHVwX3Bvd19vZl90d28oYWRhcC0+dnJlcy5vY3Euc2l6ZSkgPj4gMTA7CisJCXQ0X3dyaXRlX3JlZyhhZGFwLAorCQkJICAgICBQQ0lFX01FTV9BQ0NFU1NfUkVHKFBDSUVfTUVNX0FDQ0VTU19CQVNFX1dJTiwgMyksCisJCQkgICAgIHN0YXJ0IHwgQklSKDEpIHwgV0lORE9XKGlsb2cyKHN6X2tiKSkpOworCQl0NF93cml0ZV9yZWcoYWRhcCwKKwkJCSAgICAgUENJRV9NRU1fQUNDRVNTX1JFRyhQQ0lFX01FTV9BQ0NFU1NfT0ZGU0VULCAzKSwKKwkJCSAgICAgYWRhcC0+dnJlcy5vY3Euc3RhcnQpOworCQl0NF9yZWFkX3JlZyhhZGFwLAorCQkJICAgIFBDSUVfTUVNX0FDQ0VTU19SRUcoUENJRV9NRU1fQUNDRVNTX09GRlNFVCwgMykpOworCX0KK30KKworc3RhdGljIGludCBhZGFwX2luaXQxKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgZndfY2Fwc19jb25maWdfY21kICpjKQoreworCXUzMiB2OworCWludCByZXQ7CisKKwkvKiBnZXQgZGV2aWNlIGNhcGFiaWxpdGllcyAqLworCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKwljLT5vcF90b193cml0ZSA9IGh0b25sKEZXX0NNRF9PUChGV19DQVBTX0NPTkZJR19DTUQpIHwKKwkJCSAgICAgICBGV19DTURfUkVRVUVTVCB8IEZXX0NNRF9SRUFEKTsKKwljLT5yZXR2YWxfbGVuMTYgPSBodG9ubChGV19MRU4xNigqYykpOworCXJldCA9IHQ0X3dyX21ib3goYWRhcCwgYWRhcC0+Zm4sIGMsIHNpemVvZigqYyksIGMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2VsZWN0IGNhcGFiaWxpdGllcyB3ZSdsbCBiZSB1c2luZyAqLworCWlmIChjLT5uaWNjYXBzICYgaHRvbnMoRldfQ0FQU19DT05GSUdfTklDX1ZNKSkgeworCQlpZiAoIXZmX2FjbHMpCisJCQljLT5uaWNjYXBzIF49IGh0b25zKEZXX0NBUFNfQ09ORklHX05JQ19WTSk7CisJCWVsc2UKKwkJCWMtPm5pY2NhcHMgPSBodG9ucyhGV19DQVBTX0NPTkZJR19OSUNfVk0pOworCX0gZWxzZSBpZiAodmZfYWNscykgeworCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAidmlydHVhbGl6YXRpb24gQUNMcyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiByZXQ7CisJfQorCWMtPm9wX3RvX3dyaXRlID0gaHRvbmwoRldfQ01EX09QKEZXX0NBUFNfQ09ORklHX0NNRCkgfAorCQkJICAgICAgIEZXX0NNRF9SRVFVRVNUIHwgRldfQ01EX1dSSVRFKTsKKwlyZXQgPSB0NF93cl9tYm94KGFkYXAsIGFkYXAtPmZuLCBjLCBzaXplb2YoKmMpLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHQ0X2NvbmZpZ19nbGJsX3JzcyhhZGFwLCBhZGFwLT5mbiwKKwkJCQkgRldfUlNTX0dMQl9DT05GSUdfQ01EX01PREVfQkFTSUNWSVJUVUFMLAorCQkJCSBGV19SU1NfR0xCX0NPTkZJR19DTURfVE5MTUFQRU4gfAorCQkJCSBGV19SU1NfR0xCX0NPTkZJR19DTURfVE5MQUxMTEtQKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHQ0X2NmZ19wZnZmKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwgTUFYX0VHUlEsIDY0LCBNQVhfSU5HUSwKKwkJCSAgMCwgMCwgNCwgMHhmLCAweGYsIDE2LCBGV19DTURfQ0FQX1BGLCBGV19DTURfQ0FQX1BGKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXQ0X3NnZV9pbml0KGFkYXApOworCisJLyogdHdlYWsgc29tZSBzZXR0aW5ncyAqLworCXQ0X3dyaXRlX3JlZyhhZGFwLCBUUF9TSElGVF9DTlQsIDB4NjRmODg0OSk7CisJdDRfd3JpdGVfcmVnKGFkYXAsIFVMUF9SWF9URERQX1BTWiwgSFBaMChQQUdFX1NISUZUIC0gMTIpKTsKKwl0NF93cml0ZV9yZWcoYWRhcCwgVFBfUElPX0FERFIsIFRQX0lOR1JFU1NfQ09ORklHKTsKKwl2ID0gdDRfcmVhZF9yZWcoYWRhcCwgVFBfUElPX0RBVEEpOworCXQ0X3dyaXRlX3JlZyhhZGFwLCBUUF9QSU9fREFUQSwgdiAmIH5DU1VNX0hBU19QU0VVRE9fSERSKTsKKworCS8qIGdldCBiYXNpYyBzdHVmZiBnb2luZyAqLworCXJldHVybiB0NF9lYXJseV9pbml0KGFkYXAsIGFkYXAtPmZuKTsKIH0KIAogLyoKQEAgLTI3MzQsNyArMzAxOCw3IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBjb250YWN0IEZXLCByZXF1ZXN0IG1hc3RlciAqLwotCXJldCA9IHQ0X2Z3X2hlbGxvKGFkYXAsIDAsIDAsIE1BU1RFUl9NVVNULCAmc3RhdGUpOworCXJldCA9IHQ0X2Z3X2hlbGxvKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgTUFTVEVSX01VU1QsICZzdGF0ZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgImNvdWxkIG5vdCBjb25uZWN0IHRvIEZXLCBlcnJvciAlZFxuIiwKIAkJCXJldCk7CkBAIC0yNzQyLDQ0ICszMDI2LDcgQEAKIAl9CiAKIAkvKiByZXNldCBkZXZpY2UgKi8KLQlyZXQgPSB0NF9md19yZXNldChhZGFwLCAwLCBQSU9SU1RNT0RFIHwgUElPUlNUKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBieWU7Ci0KLQkvKiBnZXQgZGV2aWNlIGNhcGFiaWxpdGllcyAqLwotCW1lbXNldCgmYywgMCwgc2l6ZW9mKGMpKTsKLQljLm9wX3RvX3dyaXRlID0gaHRvbmwoRldfQ01EX09QKEZXX0NBUFNfQ09ORklHX0NNRCkgfAotCQkJICAgICAgRldfQ01EX1JFUVVFU1QgfCBGV19DTURfUkVBRCk7Ci0JYy5yZXR2YWxfbGVuMTYgPSBodG9ubChGV19MRU4xNihjKSk7Ci0JcmV0ID0gdDRfd3JfbWJveChhZGFwLCAwLCAmYywgc2l6ZW9mKGMpLCAmYyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYnllOwotCi0JLyogc2VsZWN0IGNhcGFiaWxpdGllcyB3ZSdsbCBiZSB1c2luZyAqLwotCWlmIChjLm5pY2NhcHMgJiBodG9ucyhGV19DQVBTX0NPTkZJR19OSUNfVk0pKSB7Ci0JCWlmICghdmZfYWNscykKLQkJCWMubmljY2FwcyBePSBodG9ucyhGV19DQVBTX0NPTkZJR19OSUNfVk0pOwotCQllbHNlCi0JCQljLm5pY2NhcHMgPSBodG9ucyhGV19DQVBTX0NPTkZJR19OSUNfVk0pOwotCX0gZWxzZSBpZiAodmZfYWNscykgewotCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAidmlydHVhbGl6YXRpb24gQUNMcyBub3Qgc3VwcG9ydGVkIik7Ci0JCWdvdG8gYnllOwotCX0KLQljLm9wX3RvX3dyaXRlID0gaHRvbmwoRldfQ01EX09QKEZXX0NBUFNfQ09ORklHX0NNRCkgfAotCQkJICAgICAgRldfQ01EX1JFUVVFU1QgfCBGV19DTURfV1JJVEUpOwotCXJldCA9IHQ0X3dyX21ib3goYWRhcCwgMCwgJmMsIHNpemVvZihjKSwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYnllOwotCi0JcmV0ID0gdDRfY29uZmlnX2dsYmxfcnNzKGFkYXAsIDAsCi0JCQkJIEZXX1JTU19HTEJfQ09ORklHX0NNRF9NT0RFX0JBU0lDVklSVFVBTCwKLQkJCQkgRldfUlNTX0dMQl9DT05GSUdfQ01EX1ROTE1BUEVOIHwKLQkJCQkgRldfUlNTX0dMQl9DT05GSUdfQ01EX1ROTEFMTExLUCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYnllOwotCi0JcmV0ID0gdDRfY2ZnX3BmdmYoYWRhcCwgMCwgMCwgMCwgNjQsIDY0LCA2NCwgMCwgMCwgNCwgMHhmLCAweGYsIDE2LAotCQkJICBGV19DTURfQ0FQX1BGLCBGV19DTURfQ0FQX1BGKTsKKwlyZXQgPSB0NF9md19yZXNldChhZGFwLCBhZGFwLT5mbiwgUElPUlNUTU9ERSB8IFBJT1JTVCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gYnllOwogCkBAIC0yNzkwLDI3ICszMDM3LDMxIEBACiAJZm9yICh2ID0gMTsgdiA8IFNHRV9OQ09VTlRFUlM7IHYrKykKIAkJYWRhcC0+c2dlLmNvdW50ZXJfdmFsW3ZdID0gbWluKGludHJfY250W3YgLSAxXSwKIAkJCQkJICAgICAgIFRIUkVTSE9MRF8zX01BU0spOwotCXQ0X3NnZV9pbml0KGFkYXApOwotCi0JLyogZ2V0IGJhc2ljIHN0dWZmIGdvaW5nICovCi0JcmV0ID0gdDRfZWFybHlfaW5pdChhZGFwLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBieWU7Ci0KICNkZWZpbmUgRldfUEFSQU1fREVWKHBhcmFtKSBcCiAJKEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX0RFVikgfCBcCiAJIEZXX1BBUkFNU19QQVJBTV9YKEZXX1BBUkFNU19QQVJBTV9ERVZfIyNwYXJhbSkpCiAKKwlwYXJhbXNbMF0gPSBGV19QQVJBTV9ERVYoQ0NMSyk7CisJcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwgMSwgcGFyYW1zLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGJ5ZTsKKwlhZGFwLT5wYXJhbXMudnBkLmNjbGsgPSB2YWxbMF07CisKKwlyZXQgPSBhZGFwX2luaXQxKGFkYXAsICZjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBieWU7CisKICNkZWZpbmUgRldfUEFSQU1fUEZWRihwYXJhbSkgXAogCShGV19QQVJBTVNfTU5FTShGV19QQVJBTVNfTU5FTV9QRlZGKSB8IFwKLQkgRldfUEFSQU1TX1BBUkFNX1goRldfUEFSQU1TX1BBUkFNX1BGVkZfIyNwYXJhbSkpCisJIEZXX1BBUkFNU19QQVJBTV9YKEZXX1BBUkFNU19QQVJBTV9QRlZGXyMjcGFyYW0pIHwgXAorCSBGV19QQVJBTVNfUEFSQU1fWShhZGFwLT5mbikpCiAKIAlwYXJhbXNbMF0gPSBGV19QQVJBTV9ERVYoUE9SVFZFQyk7CiAJcGFyYW1zWzFdID0gRldfUEFSQU1fUEZWRihMMlRfU1RBUlQpOwogCXBhcmFtc1syXSA9IEZXX1BBUkFNX1BGVkYoTDJUX0VORCk7CiAJcGFyYW1zWzNdID0gRldfUEFSQU1fUEZWRihGSUxURVJfU1RBUlQpOwogCXBhcmFtc1s0XSA9IEZXX1BBUkFNX1BGVkYoRklMVEVSX0VORCk7Ci0JcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIDAsIDAsIDAsIDUsIHBhcmFtcywgdmFsKTsKKwlyZXQgPSB0NF9xdWVyeV9wYXJhbXMoYWRhcCwgYWRhcC0+Zm4sIGFkYXAtPmZuLCAwLCA1LCBwYXJhbXMsIHZhbCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gYnllOwogCXBvcnRfdmVjID0gdmFsWzBdOwpAQCAtMjgyNSw3ICszMDc2LDggQEAKIAkJcGFyYW1zWzNdID0gRldfUEFSQU1fUEZWRihURERQX1NUQVJUKTsKIAkJcGFyYW1zWzRdID0gRldfUEFSQU1fUEZWRihURERQX0VORCk7CiAJCXBhcmFtc1s1XSA9IEZXX1BBUkFNX0RFVihGTE9XQ19CVUZGSUZPX1NaKTsKLQkJcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIDAsIDAsIDAsIDYsIHBhcmFtcywgdmFsKTsKKwkJcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwgNiwgcGFyYW1zLAorCQkJCSAgICAgIHZhbCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBieWU7CiAJCWFkYXAtPnRpZHMubnRpZHMgPSB2YWxbMF07CkBAIC0yODQ0LDcgKzMwOTYsOCBAQAogCQlwYXJhbXNbM10gPSBGV19QQVJBTV9QRlZGKFJRX0VORCk7CiAJCXBhcmFtc1s0XSA9IEZXX1BBUkFNX1BGVkYoUEJMX1NUQVJUKTsKIAkJcGFyYW1zWzVdID0gRldfUEFSQU1fUEZWRihQQkxfRU5EKTsKLQkJcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIDAsIDAsIDAsIDYsIHBhcmFtcywgdmFsKTsKKwkJcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwgNiwgcGFyYW1zLAorCQkJCSAgICAgIHZhbCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBieWU7CiAJCWFkYXAtPnZyZXMuc3RhZy5zdGFydCA9IHZhbFswXTsKQEAgLTI4NTMsMTEgKzMxMDYsMjkgQEAKIAkJYWRhcC0+dnJlcy5ycS5zaXplID0gdmFsWzNdIC0gdmFsWzJdICsgMTsKIAkJYWRhcC0+dnJlcy5wYmwuc3RhcnQgPSB2YWxbNF07CiAJCWFkYXAtPnZyZXMucGJsLnNpemUgPSB2YWxbNV0gLSB2YWxbNF0gKyAxOworCisJCXBhcmFtc1swXSA9IEZXX1BBUkFNX1BGVkYoU1FSUV9TVEFSVCk7CisJCXBhcmFtc1sxXSA9IEZXX1BBUkFNX1BGVkYoU1FSUV9FTkQpOworCQlwYXJhbXNbMl0gPSBGV19QQVJBTV9QRlZGKENRX1NUQVJUKTsKKwkJcGFyYW1zWzNdID0gRldfUEFSQU1fUEZWRihDUV9FTkQpOworCQlwYXJhbXNbNF0gPSBGV19QQVJBTV9QRlZGKE9DUV9TVEFSVCk7CisJCXBhcmFtc1s1XSA9IEZXX1BBUkFNX1BGVkYoT0NRX0VORCk7CisJCXJldCA9IHQ0X3F1ZXJ5X3BhcmFtcyhhZGFwLCBhZGFwLT5mbiwgYWRhcC0+Zm4sIDAsIDYsIHBhcmFtcywKKwkJCQkgICAgICB2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gYnllOworCQlhZGFwLT52cmVzLnFwLnN0YXJ0ID0gdmFsWzBdOworCQlhZGFwLT52cmVzLnFwLnNpemUgPSB2YWxbMV0gLSB2YWxbMF0gKyAxOworCQlhZGFwLT52cmVzLmNxLnN0YXJ0ID0gdmFsWzJdOworCQlhZGFwLT52cmVzLmNxLnNpemUgPSB2YWxbM10gLSB2YWxbMl0gKyAxOworCQlhZGFwLT52cmVzLm9jcS5zdGFydCA9IHZhbFs0XTsKKwkJYWRhcC0+dnJlcy5vY3Euc2l6ZSA9IHZhbFs1XSAtIHZhbFs0XSArIDE7CiAJfQogCWlmIChjLmlzY3NpY2FwcykgewogCQlwYXJhbXNbMF0gPSBGV19QQVJBTV9QRlZGKElTQ1NJX1NUQVJUKTsKIAkJcGFyYW1zWzFdID0gRldfUEFSQU1fUEZWRihJU0NTSV9FTkQpOwotCQlyZXQgPSB0NF9xdWVyeV9wYXJhbXMoYWRhcCwgMCwgMCwgMCwgMiwgcGFyYW1zLCB2YWwpOworCQlyZXQgPSB0NF9xdWVyeV9wYXJhbXMoYWRhcCwgYWRhcC0+Zm4sIGFkYXAtPmZuLCAwLCAyLCBwYXJhbXMsCisJCQkJICAgICAgdmFsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGJ5ZTsKIAkJYWRhcC0+dnJlcy5pc2NzaS5zdGFydCA9IHZhbFswXTsKQEAgLTI4NzcsMTIgKzMxNDgsNDEgQEAKIAl0NF9sb2FkX210dXMoYWRhcCwgYWRhcC0+cGFyYW1zLm10dXMsIGFkYXAtPnBhcmFtcy5hX3duZCwKIAkJICAgICBhZGFwLT5wYXJhbXMuYl93bmQpOwogCi0JLyogdHdlYWsgc29tZSBzZXR0aW5ncyAqLwotCXQ0X3dyaXRlX3JlZyhhZGFwLCBUUF9TSElGVF9DTlQsIDB4NjRmODg0OSk7Ci0JdDRfd3JpdGVfcmVnKGFkYXAsIFVMUF9SWF9URERQX1BTWiwgSFBaMChQQUdFX1NISUZUIC0gMTIpKTsKLQl0NF93cml0ZV9yZWcoYWRhcCwgVFBfUElPX0FERFIsIFRQX0lOR1JFU1NfQ09ORklHKTsKLQl2ID0gdDRfcmVhZF9yZWcoYWRhcCwgVFBfUElPX0RBVEEpOwotCXQ0X3dyaXRlX3JlZyhhZGFwLCBUUF9QSU9fREFUQSwgdiAmIH5DU1VNX0hBU19QU0VVRE9fSERSKTsKKyNpZmRlZiBDT05GSUdfUENJX0lPVgorCS8qCisJICogUHJvdmlzaW9uIHJlc291cmNlIGxpbWl0cyBmb3IgVmlydHVhbCBGdW5jdGlvbnMuICBXZSBjdXJyZW50bHkKKwkgKiBncmFudCB0aGVtIGFsbCB0aGUgc2FtZSBzdGF0aWMgcmVzb3VyY2UgbGltaXRzIGV4Y2VwdCBmb3IgdGhlIFBvcnQKKwkgKiBBY2Nlc3MgUmlnaHRzIE1hc2sgd2hpY2ggd2UncmUgYXNzaWduaW5nIGJhc2VkIG9uIHRoZSBQRi4gIEFsbCBvZgorCSAqIHRoZSBzdGF0aWMgcHJvdmlzaW9uaW5nIHN0dWZmIGZvciBib3RoIHRoZSBQRiBhbmQgVkYgcmVhbGx5IG5lZWRzCisJICogdG8gYmUgbWFuYWdlZCBpbiBhIHBlcnNpc3RlbnQgbWFubmVyIGZvciBlYWNoIGRldmljZSB3aGljaCB0aGUKKwkgKiBmaXJtd2FyZSBjb250cm9scy4KKwkgKi8KKwl7CisJCWludCBwZiwgdmY7CisKKwkJZm9yIChwZiA9IDA7IHBmIDwgQVJSQVlfU0laRShudW1fdmYpOyBwZisrKSB7CisJCQlpZiAobnVtX3ZmW3BmXSA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBWRiBudW1iZXJpbmcgc3RhcnRzIGF0IDEhICovCisJCQlmb3IgKHZmID0gMTsgdmYgPD0gbnVtX3ZmW3BmXTsgdmYrKykgeworCQkJCXJldCA9IHQ0X2NmZ19wZnZmKGFkYXAsIGFkYXAtPmZuLCBwZiwgdmYsCisJCQkJCQkgIFZGUkVTX05FUSwgVkZSRVNfTkVUSENUUkwsCisJCQkJCQkgIFZGUkVTX05JUUZMSU5ULCBWRlJFU19OSVEsCisJCQkJCQkgIFZGUkVTX1RDLCBWRlJFU19OVkksCisJCQkJCQkgIEZXX1BGVkZfQ01EX0NNQVNLX01BU0ssCisJCQkJCQkgIHBmdmZyZXNfcG1hc2soYWRhcCwgcGYsIHZmKSwKKwkJCQkJCSAgVkZSRVNfTkVYQUNURiwKKwkJCQkJCSAgVkZSRVNfUl9DQVBTLCBWRlJFU19XWF9DQVBTKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJZGV2X3dhcm4oYWRhcC0+cGRldl9kZXYsICJmYWlsZWQgdG8gIgorCQkJCQkJICJwcm92aXNpb24gcGYvdmY9JWQvJWQ7ICIKKwkJCQkJCSAiZXJyPSVkXG4iLCBwZiwgdmYsIHJldCk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwogCXNldHVwX21lbXdpbihhZGFwKTsKIAlyZXR1cm4gMDsKIApAQCAtMjg5MiwxMCArMzE5MiwxMTQgQEAKIAkgKiBjb21tYW5kcy4KIAkgKi8KIGJ5ZToJaWYgKHJldCAhPSAtRVRJTUVET1VUICYmIHJldCAhPSAtRUlPKQotCQl0NF9md19ieWUoYWRhcCwgMCk7CisJCXQ0X2Z3X2J5ZShhZGFwLCBhZGFwLT5mbik7CiAJcmV0dXJuIHJldDsKIH0KIAorLyogRUVIIGNhbGxiYWNrcyAqLworCitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBlZWhfZXJyX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghYWRhcCkKKwkJZ290byBvdXQ7CisKKwlydG5sX2xvY2soKTsKKwlhZGFwLT5mbGFncyAmPSB+RldfT0s7CisJbm90aWZ5X3VsZHMoYWRhcCwgQ1hHQjRfU1RBVEVfU1RBUlRfUkVDT1ZFUlkpOworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcC0+cG9ydFtpXTsKKworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQljeGdiX2Rvd24oYWRhcCk7CisJcnRubF91bmxvY2soKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitvdXQ6CXJldHVybiBzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUgPworCQlQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUIDogUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKK30KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgZWVoX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgZndfY2Fwc19jb25maWdfY21kIGM7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWFkYXApIHsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOworCX0KKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVlbmFibGUgUENJIGRldmljZSBhZnRlciByZXNldFxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9jbGVhbnVwX2Flcl91bmNvcnJlY3RfZXJyb3Jfc3RhdHVzKHBkZXYpOworCisJaWYgKHQ0X3dhaXRfZGV2X3JlYWR5KGFkYXApIDwgMCkKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisJaWYgKHQ0X2Z3X2hlbGxvKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgTUFTVEVSX01VU1QsIE5VTEwpKQorCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKKwlhZGFwLT5mbGFncyB8PSBGV19PSzsKKwlpZiAoYWRhcF9pbml0MShhZGFwLCAmYykpCisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCisJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBhZGFwMnBpbmZvKGFkYXAsIGkpOworCisJCXJldCA9IHQ0X2FsbG9jX3ZpKGFkYXAsIGFkYXAtPmZuLCBwLT50eF9jaGFuLCBhZGFwLT5mbiwgMCwgMSwKKwkJCQkgIE5VTEwsIE5VTEwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCQlwLT52aWlkID0gcmV0OworCQlwLT54YWN0X2FkZHJfZmlsdCA9IC0xOworCX0KKworCXQ0X2xvYWRfbXR1cyhhZGFwLCBhZGFwLT5wYXJhbXMubXR1cywgYWRhcC0+cGFyYW1zLmFfd25kLAorCQkgICAgIGFkYXAtPnBhcmFtcy5iX3duZCk7CisJc2V0dXBfbWVtd2luKGFkYXApOworCWlmIChjeGdiX3VwKGFkYXApKQorCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOworfQorCitzdGF0aWMgdm9pZCBlZWhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFhZGFwKQorCQlyZXR1cm47CisKKwlydG5sX2xvY2soKTsKKwlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXAtPnBvcnRbaV07CisKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJbGlua19zdGFydChkZXYpOworCQkJY3hnYl9zZXRfcnhtb2RlKGRldik7CisJCX0KKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCX0KKwlydG5sX3VubG9jaygpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBjeGdiNF9lZWggPSB7CisJLmVycm9yX2RldGVjdGVkID0gZWVoX2Vycl9kZXRlY3RlZCwKKwkuc2xvdF9yZXNldCAgICAgPSBlZWhfc2xvdF9yZXNldCwKKwkucmVzdW1lICAgICAgICAgPSBlZWhfcmVzdW1lLAorfTsKKwogc3RhdGljIGlubGluZSBib29sIGlzXzEwZ19wb3J0KGNvbnN0IHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMpCiB7CiAJcmV0dXJuIChsYy0+c3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMTBHKSAhPSAwOwpAQCAtMzA3NiwxMCArMzQ4MCwyNyBAQAogCiAjdW5kZWYgRVhUUkFfVkVDUwogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3JzcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IGFkYXAycGluZm8oYWRhcCwgaSk7CisKKwkJcGktPnJzcyA9IGtjYWxsb2MocGktPnJzc19zaXplLCBzaXplb2YodTE2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGktPnJzcykKKwkJCXJldHVybiAtRU5PTUVNOworCQlmb3IgKGogPSAwOyBqIDwgcGktPnJzc19zaXplOyBqKyspCisJCQlwaS0+cnNzW2pdID0gaiAlIHBpLT5ucXNldHM7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJpbnRfcG9ydF9pbmZvKHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpiYXNlW10gPSB7Ci0JCSJSIiwgIktYNCIsICJUIiwgIktYIiwgIlQiLCAiS1IiLCAiQ1g0IgorCQkiUiBYRkkiLCAiUiBYQVVJIiwgIlQgU0dNSUkiLCAiVCBYRkkiLCAiVCBYQVVJIiwgIktYNCIsICJDWDQiLAorCQkiS1giLCAiS1IiLCAiS1IgU0ZQKyIsICJLUiBGRUMiCiAJfTsKIAogCWludCBpOwpAQCAtMzEyMSw3ICszNTQyLDMxIEBACiAJfQogfQogCi0jZGVmaW5lIFZMQU5fRkVBVCAoTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHxcCisvKgorICogRnJlZSB0aGUgZm9sbG93aW5nIHJlc291cmNlczoKKyAqIC0gbWVtb3J5IHVzZWQgZm9yIHRhYmxlcworICogLSBNU0kvTVNJLVgKKyAqIC0gbmV0IGRldmljZXMKKyAqIC0gcmVzb3VyY2VzIEZXIGlzIGhvbGRpbmcgZm9yIHVzCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfc29tZV9yZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwl0NF9mcmVlX21lbShhZGFwdGVyLT5sMnQpOworCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPnRpZHMudGlkX3RhYik7CisJZGlzYWJsZV9tc2koYWRhcHRlcik7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCWlmIChhZGFwdGVyLT5wb3J0W2ldKSB7CisJCQlrZnJlZShhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpLT5yc3MpOworCQkJZnJlZV9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXSk7CisJCX0KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGV19PSykKKwkJdDRfZndfYnllKGFkYXB0ZXIsIGFkYXB0ZXItPmZuKTsKK30KKworI2RlZmluZSBWTEFOX0ZFQVQgKE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBUU09fRkxBR1MgfCBcCiAJCSAgIE5FVElGX0ZfSVBWNl9DU1VNIHwgTkVUSUZfRl9ISUdIRE1BKQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKQEAgLTMxNDEsMTAgKzM1ODYsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQkvKiBXZSBjb250cm9sIGV2ZXJ5dGhpbmcgdGhyb3VnaCBQRiAwICovCisJLyogV2UgY29udHJvbCBldmVyeXRoaW5nIHRocm91Z2ggb25lIFBGICovCiAJZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKLQlpZiAoZnVuYyA+IDApCisJaWYgKGZ1bmMgIT0gZW50LT5kcml2ZXJfZGF0YSkgeworCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsgICAgICAgIC8qIHRvIHJlc3RvcmUgU1ItSU9WIGxhdGVyICovCiAJCWdvdG8gc3Jpb3Y7CisJfQogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGVycikgewpAQCAtMzE4Nyw2ICszNjM0LDcgQEAKIAogCWFkYXB0ZXItPnBkZXYgPSBwZGV2OwogCWFkYXB0ZXItPnBkZXZfZGV2ID0gJnBkZXYtPmRldjsKKwlhZGFwdGVyLT5mbiA9IGZ1bmM7CiAJYWRhcHRlci0+bmFtZSA9IHBjaV9uYW1lKHBkZXYpOwogCWFkYXB0ZXItPm1zZ19lbmFibGUgPSBkZmx0X21zZ19lbmFibGU7CiAJbWVtc2V0KGFkYXB0ZXItPmNoYW5fbWFwLCAweGZmLCBzaXplb2YoYWRhcHRlci0+Y2hhbl9tYXApKTsKQEAgLTMyMjUsNyArMzY3Myw3IEBACiAJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOwogCQluZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKIAotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNjsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgVFNPX0ZMQUdTOwogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNOwogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfR1JPIHwgTkVUSUZfRl9SWEhBU0ggfCBoaWdoZG1hOwogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKQEAgLTMyMzgsNyArMzY4Niw3IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOwogCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgRldfT0spIHsKLQkJZXJyID0gdDRfcG9ydF9pbml0KGFkYXB0ZXIsIDAsIDAsIDApOworCQllcnIgPSB0NF9wb3J0X2luaXQoYWRhcHRlciwgZnVuYywgZnVuYywgMCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9mcmVlX2RldjsKIAl9CkBAIC0zMjYyLDYgKzM3MTAsMTYgQEAKIAkJYWRhcHRlci0+cGFyYW1zLm9mZmxvYWQgPSAwOwogCX0KIAorCS8qIFNlZSB3aGF0IGludGVycnVwdHMgd2UnbGwgYmUgdXNpbmcgKi8KKwlpZiAobXNpID4gMSAmJiBlbmFibGVfbXNpeChhZGFwdGVyKSA9PSAwKQorCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0lYOworCWVsc2UgaWYgKG1zaSA+IDAgJiYgcGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gVVNJTkdfTVNJOworCisJZXJyID0gaW5pdF9yc3MoYWRhcHRlcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9kZXY7CisKIAkvKgogCSAqIFRoZSBjYXJkIGlzIG5vdyByZWFkeSB0byBnby4gIElmIGFueSBlcnJvcnMgb2NjdXIgZHVyaW5nIGRldmljZQogCSAqIHJlZ2lzdHJhdGlvbiB3ZSBkbyBub3QgZmFpbCB0aGUgd2hvbGUgY2FyZCBidXQgcmF0aGVyIHByb2NlZWQgb25seQpAQCAtMzI5NywxMiArMzc1NSw2IEBACiAJCXNldHVwX2RlYnVnZnMoYWRhcHRlcik7CiAJfQogCi0JLyogU2VlIHdoYXQgaW50ZXJydXB0cyB3ZSdsbCBiZSB1c2luZyAqLwotCWlmIChtc2kgPiAxICYmIGVuYWJsZV9tc2l4KGFkYXB0ZXIpID09IDApCi0JCWFkYXB0ZXItPmZsYWdzIHw9IFVTSU5HX01TSVg7Ci0JZWxzZSBpZiAobXNpID4gMCAmJiBwY2lfZW5hYmxlX21zaShwZGV2KSA9PSAwKQotCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0k7Ci0KIAlpZiAoaXNfb2ZmbG9hZChhZGFwdGVyKSkKIAkJYXR0YWNoX3VsZHMoYWRhcHRlcik7CiAKQEAgLTMzMTksMTMgKzM3NzEsNyBAQAogCXJldHVybiAwOwogCiAgb3V0X2ZyZWVfZGV2OgotCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPnRpZHMudGlkX3RhYik7Ci0JdDRfZnJlZV9tZW0oYWRhcHRlci0+bDJ0KTsKLQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCi0JCWlmIChhZGFwdGVyLT5wb3J0W2ldKQotCQkJZnJlZV9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXSk7Ci0JaWYgKGFkYXB0ZXItPmZsYWdzICYgRldfT0spCi0JCXQ0X2Z3X2J5ZShhZGFwdGVyLCAwKTsKKwlmcmVlX3NvbWVfcmVzb3VyY2VzKGFkYXB0ZXIpOwogIG91dF91bm1hcF9iYXI6CiAJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKICBvdXRfZnJlZV9hZGFwdGVyOgpAQCAtMzM2MCwxNiArMzgwNiw4IEBACiAKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCiAJCQljeGdiX2Rvd24oYWRhcHRlcik7Ci0JCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPmwydCk7Ci0JCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPnRpZHMudGlkX3RhYik7Ci0JCWRpc2FibGVfbXNpKGFkYXB0ZXIpOwogCi0JCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKLQkJCWlmIChhZGFwdGVyLT5wb3J0W2ldKQotCQkJCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0pOwotCi0JCWlmIChhZGFwdGVyLT5mbGFncyAmIEZXX09LKQotCQkJdDRfZndfYnllKGFkYXB0ZXIsIDApOworCQlmcmVlX3NvbWVfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCQlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOwogCQlrZnJlZShhZGFwdGVyKTsKIAkJcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7CkBAIC0zMzg1LDYgKzM4MjMsNyBAQAogCS5pZF90YWJsZSA9IGN4Z2I0X3BjaV90YmwsCiAJLnByb2JlICAgID0gaW5pdF9vbmUsCiAJLnJlbW92ZSAgID0gX19kZXZleGl0X3AocmVtb3ZlX29uZSksCisJLmVycl9oYW5kbGVyID0gJmN4Z2I0X2VlaCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGN4Z2I0X2luaXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNC9jeGdiNF91bGQuaCBiL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0X3VsZC5oCmluZGV4IDViOTg1NDYuLjg1ZDc0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0X3VsZC5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0X3VsZC5oCkBAIC0xODUsOCArMTg1LDE0IEBACiAJc3RydWN0IGN4Z2I0X3JhbmdlIHN0YWc7CiAJc3RydWN0IGN4Z2I0X3JhbmdlIHJxOwogCXN0cnVjdCBjeGdiNF9yYW5nZSBwYmw7CisJc3RydWN0IGN4Z2I0X3JhbmdlIHFwOworCXN0cnVjdCBjeGdiNF9yYW5nZSBjcTsKKwlzdHJ1Y3QgY3hnYjRfcmFuZ2Ugb2NxOwogfTsKIAorI2RlZmluZSBPQ1FfV0lOX09GRlNFVChwZGV2LCB2cmVzKSBcCisJKHBjaV9yZXNvdXJjZV9sZW4oKHBkZXYpLCAyKSAtIHJvdW5kdXBfcG93X29mX3R3bygodnJlcyktPm9jcS5zaXplKSkKKwogLyoKICAqIEJsb2NrIG9mIGluZm9ybWF0aW9uIHRoZSBMTEQgcHJvdmlkZXMgdG8gVUxEcyBhdHRhY2hpbmcgdG8gYSBkZXZpY2UuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2I0L2wydC5jIGIvZHJpdmVycy9uZXQvY3hnYjQvbDJ0LmMKaW5kZXggOWY5NjcyNC4uZThmMGY1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjQvbDJ0LmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjQvbDJ0LmMKQEAgLTMxMCw2ICszMTAsMTMgQEAKIAkJCW5laWdoX3JlbGVhc2UoZS0+bmVpZ2gpOwogCQkJZS0+bmVpZ2ggPSBOVUxMOwogCQl9CisJCXdoaWxlIChlLT5hcnBxX2hlYWQpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBlLT5hcnBxX2hlYWQ7CisKKwkJCWUtPmFycHFfaGVhZCA9IHNrYi0+bmV4dDsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJCWUtPmFycHFfdGFpbCA9IE5VTEw7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZlLT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjQvc2dlLmMgYi9kcml2ZXJzL25ldC9jeGdiNC9zZ2UuYwppbmRleCBkMWY4ZjIyLi5iZjM4Y2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiNC9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jeGdiNC9zZ2UuYwpAQCAtOTM4LDE2ICs5MzgsMTYgQEAKIAogCQl3ci0+b3BfaW1tZGxlbiA9IGh0b25sKEZXX1dSX09QKEZXX0VUSF9UWF9QS1RfV1IpIHwKIAkJCQkgICAgICAgRldfV1JfSU1NRExFTihzaXplb2YoKmxzbykpKTsKLQkJbHNvLT5sc29fY3RybCA9IGh0b25sKExTT19PUENPREUoQ1BMX1RYX1BLVF9MU08pIHwKLQkJCQkgICAgICBMU09fRklSU1RfU0xJQ0UgfCBMU09fTEFTVF9TTElDRSB8Ci0JCQkJICAgICAgTFNPX0lQVjYodjYpIHwKLQkJCQkgICAgICBMU09fRVRISERSX0xFTihldGhfeHRyYV9sZW4gLyA0KSB8Ci0JCQkJICAgICAgTFNPX0lQSERSX0xFTihsM2hkcl9sZW4gLyA0KSB8Ci0JCQkJICAgICAgTFNPX1RDUEhEUl9MRU4odGNwX2hkcihza2IpLT5kb2ZmKSk7Ci0JCWxzby0+aXBpZF9vZnN0ID0gaHRvbnMoMCk7Ci0JCWxzby0+bXNzID0gaHRvbnMoc3NpLT5nc29fc2l6ZSk7Ci0JCWxzby0+c2Vxbm9fb2Zmc2V0ID0gaHRvbmwoMCk7Ci0JCWxzby0+bGVuID0gaHRvbmwoc2tiLT5sZW4pOworCQlsc28tPmMubHNvX2N0cmwgPSBodG9ubChMU09fT1BDT0RFKENQTF9UWF9QS1RfTFNPKSB8CisJCQkJCUxTT19GSVJTVF9TTElDRSB8IExTT19MQVNUX1NMSUNFIHwKKwkJCQkJTFNPX0lQVjYodjYpIHwKKwkJCQkJTFNPX0VUSEhEUl9MRU4oZXRoX3h0cmFfbGVuIC8gNCkgfAorCQkJCQlMU09fSVBIRFJfTEVOKGwzaGRyX2xlbiAvIDQpIHwKKwkJCQkJTFNPX1RDUEhEUl9MRU4odGNwX2hkcihza2IpLT5kb2ZmKSk7CisJCWxzby0+Yy5pcGlkX29mc3QgPSBodG9ucygwKTsKKwkJbHNvLT5jLm1zcyA9IGh0b25zKHNzaS0+Z3NvX3NpemUpOworCQlsc28tPmMuc2Vxbm9fb2Zmc2V0ID0gaHRvbmwoMCk7CisJCWxzby0+Yy5sZW4gPSBodG9ubChza2ItPmxlbik7CiAJCWNwbCA9ICh2b2lkICopKGxzbyArIDEpOwogCQljbnRybCA9IFRYUEtUX0NTVU1fVFlQRSh2NiA/IFRYX0NTVU1fVENQSVA2IDogVFhfQ1NVTV9UQ1BJUCkgfAogCQkJVFhQS1RfSVBIRFJfTEVOKGwzaGRyX2xlbikgfApAQCAtMTU5MywxNCArMTU5MywxNSBAQAogCiAJaWYgKGNzdW1fb2sgJiYgKHBpLT5yeF9vZmZsb2FkICYgUlhfQ1NPKSAmJgogCSAgICAocGt0LT5sMmluZm8gJiBodG9ubChSWEZfVURQIHwgUlhGX1RDUCkpKSB7Ci0JCWlmICghcGt0LT5pcF9mcmFnKQorCQlpZiAoIXBrdC0+aXBfZnJhZykgewogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJZWxzZSB7CisJCQlyeHEtPnN0YXRzLnJ4X2NzbysrOworCQl9IGVsc2UgaWYgKHBrdC0+bDJpbmZvICYgaHRvbmwoUlhGX0lQKSkgewogCQkJX19zdW0xNiBjID0gKF9fZm9yY2UgX19zdW0xNilwa3QtPmNzdW07CiAJCQlza2ItPmNzdW0gPSBjc3VtX3VuZm9sZChjKTsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CisJCQlyeHEtPnN0YXRzLnJ4X2NzbysrOwogCQl9Ci0JCXJ4cS0+c3RhdHMucnhfY3NvKys7CiAJfSBlbHNlCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIApAQCAtMTcxOCw3ICsxNzE5LDcgQEAKIAkJCQkJZnJlZV9yeF9idWZzKHEtPmFkYXAsICZyeHEtPmZsLCAxKTsKIAkJCQkJcS0+b2Zmc2V0ID0gMDsKIAkJCQl9Ci0JCQkJbGVuICY9IFJTUERfTEVOOworCQkJCWxlbiA9IFJTUERfTEVOKGxlbik7CiAJCQl9CiAJCQlzaS50b3RfbGVuID0gbGVuOwogCkBAIC0xOTk4LDcgKzE5OTksNyBAQAogCW1lbXNldCgmYywgMCwgc2l6ZW9mKGMpKTsKIAljLm9wX3RvX3ZmbiA9IGh0b25sKEZXX0NNRF9PUChGV19JUV9DTUQpIHwgRldfQ01EX1JFUVVFU1QgfAogCQkJICAgIEZXX0NNRF9XUklURSB8IEZXX0NNRF9FWEVDIHwKLQkJCSAgICBGV19JUV9DTURfUEZOKDApIHwgRldfSVFfQ01EX1ZGTigwKSk7CisJCQkgICAgRldfSVFfQ01EX1BGTihhZGFwLT5mbikgfCBGV19JUV9DTURfVkZOKDApKTsKIAljLmFsbG9jX3RvX2xlbjE2ID0gaHRvbmwoRldfSVFfQ01EX0FMTE9DIHwgRldfSVFfQ01EX0lRU1RBUlQoMSkgfAogCQkJCSBGV19MRU4xNihjKSk7CiAJYy50eXBlX3RvX2lxYW5kc3RpbmRleCA9IGh0b25sKEZXX0lRX0NNRF9UWVBFKEZXX0lRX1RZUEVfRkxfSU5UX0NBUCkgfApAQCAtMjAzMCw3ICsyMDMxLDcgQEAKIAkJYy5mbDBhZGRyID0gY3B1X3RvX2JlNjQoZmwtPmFkZHIpOwogCX0KIAotCXJldCA9IHQ0X3dyX21ib3goYWRhcCwgMCwgJmMsIHNpemVvZihjKSwgJmMpOworCXJldCA9IHQ0X3dyX21ib3goYWRhcCwgYWRhcC0+Zm4sICZjLCBzaXplb2YoYyksICZjKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIApAQCAtMjEwOSw3ICsyMTEwLDcgQEAKIAltZW1zZXQoJmMsIDAsIHNpemVvZihjKSk7CiAJYy5vcF90b192Zm4gPSBodG9ubChGV19DTURfT1AoRldfRVFfRVRIX0NNRCkgfCBGV19DTURfUkVRVUVTVCB8CiAJCQkgICAgRldfQ01EX1dSSVRFIHwgRldfQ01EX0VYRUMgfAotCQkJICAgIEZXX0VRX0VUSF9DTURfUEZOKDApIHwgRldfRVFfRVRIX0NNRF9WRk4oMCkpOworCQkJICAgIEZXX0VRX0VUSF9DTURfUEZOKGFkYXAtPmZuKSB8IEZXX0VRX0VUSF9DTURfVkZOKDApKTsKIAljLmFsbG9jX3RvX2xlbjE2ID0gaHRvbmwoRldfRVFfRVRIX0NNRF9BTExPQyB8CiAJCQkJIEZXX0VRX0VUSF9DTURfRVFTVEFSVCB8IEZXX0xFTjE2KGMpKTsKIAljLnZpaWRfcGtkID0gaHRvbmwoRldfRVFfRVRIX0NNRF9WSUlEKHBpLT52aWlkKSk7CkBAIC0yMTIyLDcgKzIxMjMsNyBAQAogCQkJCSAgRldfRVFfRVRIX0NNRF9FUVNJWkUobmVudHJpZXMpKTsKIAljLmVxYWRkciA9IGNwdV90b19iZTY0KHR4cS0+cS5waHlzX2FkZHIpOwogCi0JcmV0ID0gdDRfd3JfbWJveChhZGFwLCAwLCAmYywgc2l6ZW9mKGMpLCAmYyk7CisJcmV0ID0gdDRfd3JfbWJveChhZGFwLCBhZGFwLT5mbiwgJmMsIHNpemVvZihjKSwgJmMpOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUodHhxLT5xLnNkZXNjKTsKIAkJdHhxLT5xLnNkZXNjID0gTlVMTDsKQEAgLTIxNTksNyArMjE2MCw4IEBACiAKIAljLm9wX3RvX3ZmbiA9IGh0b25sKEZXX0NNRF9PUChGV19FUV9DVFJMX0NNRCkgfCBGV19DTURfUkVRVUVTVCB8CiAJCQkgICAgRldfQ01EX1dSSVRFIHwgRldfQ01EX0VYRUMgfAotCQkJICAgIEZXX0VRX0NUUkxfQ01EX1BGTigwKSB8IEZXX0VRX0NUUkxfQ01EX1ZGTigwKSk7CisJCQkgICAgRldfRVFfQ1RSTF9DTURfUEZOKGFkYXAtPmZuKSB8CisJCQkgICAgRldfRVFfQ1RSTF9DTURfVkZOKDApKTsKIAljLmFsbG9jX3RvX2xlbjE2ID0gaHRvbmwoRldfRVFfQ1RSTF9DTURfQUxMT0MgfAogCQkJCSBGV19FUV9DVFJMX0NNRF9FUVNUQVJUIHwgRldfTEVOMTYoYykpOwogCWMuY21wbGlxaWRfZXFpZCA9IGh0b25sKEZXX0VRX0NUUkxfQ01EX0NNUExJUUlEKGNtcGxxaWQpKTsKQEAgLTIxNzMsNyArMjE3NSw3IEBACiAJCQkJICBGV19FUV9DVFJMX0NNRF9FUVNJWkUobmVudHJpZXMpKTsKIAljLmVxYWRkciA9IGNwdV90b19iZTY0KHR4cS0+cS5waHlzX2FkZHIpOwogCi0JcmV0ID0gdDRfd3JfbWJveChhZGFwLCAwLCAmYywgc2l6ZW9mKGMpLCAmYyk7CisJcmV0ID0gdDRfd3JfbWJveChhZGFwLCBhZGFwLT5mbiwgJmMsIHNpemVvZihjKSwgJmMpOwogCWlmIChyZXQpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoYWRhcC0+cGRldl9kZXYsCiAJCQkJICBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCkBAIC0yMjA5LDcgKzIyMTEsOCBAQAogCW1lbXNldCgmYywgMCwgc2l6ZW9mKGMpKTsKIAljLm9wX3RvX3ZmbiA9IGh0b25sKEZXX0NNRF9PUChGV19FUV9PRkxEX0NNRCkgfCBGV19DTURfUkVRVUVTVCB8CiAJCQkgICAgRldfQ01EX1dSSVRFIHwgRldfQ01EX0VYRUMgfAotCQkJICAgIEZXX0VRX09GTERfQ01EX1BGTigwKSB8IEZXX0VRX09GTERfQ01EX1ZGTigwKSk7CisJCQkgICAgRldfRVFfT0ZMRF9DTURfUEZOKGFkYXAtPmZuKSB8CisJCQkgICAgRldfRVFfT0ZMRF9DTURfVkZOKDApKTsKIAljLmFsbG9jX3RvX2xlbjE2ID0gaHRvbmwoRldfRVFfT0ZMRF9DTURfQUxMT0MgfAogCQkJCSBGV19FUV9PRkxEX0NNRF9FUVNUQVJUIHwgRldfTEVOMTYoYykpOwogCWMuZmV0Y2hzem1fdG9faXFpZCA9IGh0b25sKEZXX0VRX09GTERfQ01EX0hPU1RGQ01PREUoMikgfApAQCAtMjIyMSw3ICsyMjI0LDcgQEAKIAkJCQkgIEZXX0VRX09GTERfQ01EX0VRU0laRShuZW50cmllcykpOwogCWMuZXFhZGRyID0gY3B1X3RvX2JlNjQodHhxLT5xLnBoeXNfYWRkcik7CiAKLQlyZXQgPSB0NF93cl9tYm94KGFkYXAsIDAsICZjLCBzaXplb2YoYyksICZjKTsKKwlyZXQgPSB0NF93cl9tYm94KGFkYXAsIGFkYXAtPmZuLCAmYywgc2l6ZW9mKGMpLCAmYyk7CiAJaWYgKHJldCkgewogCQlrZnJlZSh0eHEtPnEuc2Rlc2MpOwogCQl0eHEtPnEuc2Rlc2MgPSBOVUxMOwpAQCAtMjI1Nyw4ICsyMjYwLDggQEAKIAl1bnNpZ25lZCBpbnQgZmxfaWQgPSBmbCA/IGZsLT5jbnR4dF9pZCA6IDB4ZmZmZjsKIAogCWFkYXAtPnNnZS5pbmdyX21hcFtycS0+Y250eHRfaWRdID0gTlVMTDsKLQl0NF9pcV9mcmVlKGFkYXAsIDAsIDAsIDAsIEZXX0lRX1RZUEVfRkxfSU5UX0NBUCwgcnEtPmNudHh0X2lkLCBmbF9pZCwKLQkJICAgMHhmZmZmKTsKKwl0NF9pcV9mcmVlKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwgRldfSVFfVFlQRV9GTF9JTlRfQ0FQLAorCQkgICBycS0+Y250eHRfaWQsIGZsX2lkLCAweGZmZmYpOwogCWRtYV9mcmVlX2NvaGVyZW50KGFkYXAtPnBkZXZfZGV2LCAocnEtPnNpemUgKyAxKSAqIHJxLT5pcWVfbGVuLAogCQkJICBycS0+ZGVzYywgcnEtPnBoeXNfYWRkcik7CiAJbmV0aWZfbmFwaV9kZWwoJnJxLT5uYXBpKTsKQEAgLTIyOTUsNyArMjI5OCw4IEBACiAJCWlmIChlcS0+cnNwcS5kZXNjKQogCQkJZnJlZV9yc3BxX2ZsKGFkYXAsICZlcS0+cnNwcSwgJmVxLT5mbCk7CiAJCWlmIChldHEtPnEuZGVzYykgewotCQkJdDRfZXRoX2VxX2ZyZWUoYWRhcCwgMCwgMCwgMCwgZXRxLT5xLmNudHh0X2lkKTsKKwkJCXQ0X2V0aF9lcV9mcmVlKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwKKwkJCQkgICAgICAgZXRxLT5xLmNudHh0X2lkKTsKIAkJCWZyZWVfdHhfZGVzYyhhZGFwLCAmZXRxLT5xLCBldHEtPnEuaW5fdXNlLCB0cnVlKTsKIAkJCWtmcmVlKGV0cS0+cS5zZGVzYyk7CiAJCQlmcmVlX3R4cShhZGFwLCAmZXRxLT5xKTsKQEAgLTIzMTgsNyArMjMyMiw4IEBACiAKIAkJaWYgKHEtPnEuZGVzYykgewogCQkJdGFza2xldF9raWxsKCZxLT5xcmVzdW1lX3Rzayk7Ci0JCQl0NF9vZmxkX2VxX2ZyZWUoYWRhcCwgMCwgMCwgMCwgcS0+cS5jbnR4dF9pZCk7CisJCQl0NF9vZmxkX2VxX2ZyZWUoYWRhcCwgYWRhcC0+Zm4sIGFkYXAtPmZuLCAwLAorCQkJCQlxLT5xLmNudHh0X2lkKTsKIAkJCWZyZWVfdHhfZGVzYyhhZGFwLCAmcS0+cSwgcS0+cS5pbl91c2UsIGZhbHNlKTsKIAkJCWtmcmVlKHEtPnEuc2Rlc2MpOwogCQkJX19za2JfcXVldWVfcHVyZ2UoJnEtPnNlbmRxKTsKQEAgLTIzMzIsNyArMjMzNyw4IEBACiAKIAkJaWYgKGNxLT5xLmRlc2MpIHsKIAkJCXRhc2tsZXRfa2lsbCgmY3EtPnFyZXN1bWVfdHNrKTsKLQkJCXQ0X2N0cmxfZXFfZnJlZShhZGFwLCAwLCAwLCAwLCBjcS0+cS5jbnR4dF9pZCk7CisJCQl0NF9jdHJsX2VxX2ZyZWUoYWRhcCwgYWRhcC0+Zm4sIGFkYXAtPmZuLCAwLAorCQkJCQljcS0+cS5jbnR4dF9pZCk7CiAJCQlfX3NrYl9xdWV1ZV9wdXJnZSgmY3EtPnNlbmRxKTsKIAkJCWZyZWVfdHhxKGFkYXAsICZjcS0+cSk7CiAJCX0KQEAgLTI0MDAsNiArMjQwNiw3IEBACiAgKi8KIHZvaWQgdDRfc2dlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7CisJdW5zaWduZWQgaW50IGksIHY7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CiAJdW5zaWduZWQgaW50IGZsX2FsaWduX2xvZyA9IGlsb2cyKEZMX0FMSUdOKTsKIApAQCAtMjQwOCw4ICsyNDE1LDEwIEBACiAJCQkgSU5HUEFEQk9VTkRBUlkoZmxfYWxpZ25fbG9nIC0gNSkgfCBQS1RTSElGVCgyKSB8CiAJCQkgUlhQS1RDUExNT0RFIHwKIAkJCSAoU1RBVF9MRU4gPT0gMTI4ID8gRUdSU1RBVFVTUEFHRVNJWkUgOiAwKSk7Ci0JdDRfc2V0X3JlZ19maWVsZChhZGFwLCBTR0VfSE9TVF9QQUdFX1NJWkUsIEhPU1RQQUdFU0laRVBGMF9NQVNLLAotCQkJIEhPU1RQQUdFU0laRVBGMChQQUdFX1NISUZUIC0gMTApKTsKKworCWZvciAoaSA9IHYgPSAwOyBpIDwgMzI7IGkgKz0gNCkKKwkJdiB8PSAoUEFHRV9TSElGVCAtIDEwKSA8PCBpOworCXQ0X3dyaXRlX3JlZyhhZGFwLCBTR0VfSE9TVF9QQUdFX1NJWkUsIHYpOwogCXQ0X3dyaXRlX3JlZyhhZGFwLCBTR0VfRkxfQlVGRkVSX1NJWkUwLCBQQUdFX1NJWkUpOwogI2lmIEZMX1BHX09SREVSID4gMAogCXQ0X3dyaXRlX3JlZyhhZGFwLCBTR0VfRkxfQlVGRkVSX1NJWkUxLCBQQUdFX1NJWkUgPDwgRkxfUEdfT1JERVIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjQvdDRfaHcuYyBiL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0X2h3LmMKaW5kZXggZGEyNzJhOS4uOWUxYTRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjQvdDRfaHcuYworKysgYi9kcml2ZXJzL25ldC9jeGdiNC90NF9ody5jCkBAIC0yMjEsNiArMjIxLDEzIEBACiAJaWYgKChzaXplICYgMTUpIHx8IHNpemUgPiBNQk9YX0xFTikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgb2ZmLWxpbmUsIGFzIGluIEVFSCwgY29tbWFuZHMgd2lsbCB0aW1lIG91dC4KKwkgKiBGYWlsIHRoZW0gZWFybHkgc28gd2UgZG9uJ3Qgd2FzdGUgdGltZSB3YWl0aW5nLgorCSAqLworCWlmIChhZGFwLT5wZGV2LT5lcnJvcl9zdGF0ZSAhPSBwY2lfY2hhbm5lbF9pb19ub3JtYWwpCisJCXJldHVybiAtRUlPOworCiAJdiA9IE1CT1dORVJfR0VUKHQ0X3JlYWRfcmVnKGFkYXAsIGN0bF9yZWcpKTsKIAlmb3IgKGkgPSAwOyB2ID09IE1CT1hfT1dORVJfTk9ORSAmJiBpIDwgMzsgaSsrKQogCQl2ID0gTUJPV05FUl9HRVQodDRfcmVhZF9yZWcoYWRhcCwgY3RsX3JlZykpOwpAQCAtNDQ5LDEyICs0NTYsMTAgQEAKIAlTRl9SRF9TVEFUVVMgICAgPSA1LCAgICAgICAgICAvKiByZWFkIHN0YXR1cyByZWdpc3RlciAqLwogCVNGX1dSX0VOQUJMRSAgICA9IDYsICAgICAgICAgIC8qIGVuYWJsZSB3cml0ZXMgKi8KIAlTRl9SRF9EQVRBX0ZBU1QgPSAweGIsICAgICAgICAvKiByZWFkIGZsYXNoICovCisJU0ZfUkRfSUQgICAgICAgID0gMHg5ZiwgICAgICAgLyogcmVhZCBJRCAqLwogCVNGX0VSQVNFX1NFQ1RPUiA9IDB4ZDgsICAgICAgIC8qIGVyYXNlIHNlY3RvciAqLwogCi0JRldfU1RBUlRfU0VDID0gOCwgICAgICAgICAgICAgLyogZmlyc3QgZmxhc2ggc2VjdG9yIGZvciBGVyAqLwotCUZXX0VORF9TRUMgPSAxNSwgICAgICAgICAgICAgIC8qIGxhc3QgZmxhc2ggc2VjdG9yIGZvciBGVyAqLwotCUZXX0lNR19TVEFSVCA9IEZXX1NUQVJUX1NFQyAqIFNGX1NFQ19TSVpFLAotCUZXX01BWF9TSVpFID0gKEZXX0VORF9TRUMgLSBGV19TVEFSVF9TRUMgKyAxKSAqIFNGX1NFQ19TSVpFLAorCUZXX01BWF9TSVpFID0gNTEyICogMTAyNCwKIH07CiAKIC8qKgpAQCAtNTU4LDcgKzU2Myw3IEBACiB7CiAJaW50IHJldDsKIAotCWlmIChhZGRyICsgbndvcmRzICogc2l6ZW9mKHUzMikgPiBTRl9TSVpFIHx8IChhZGRyICYgMykpCisJaWYgKGFkZHIgKyBud29yZHMgKiBzaXplb2YodTMyKSA+IGFkYXB0ZXItPnBhcmFtcy5zZl9zaXplIHx8IChhZGRyICYgMykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYWRkciA9IHN3YWIzMihhZGRyKSB8IFNGX1JEX0RBVEFfRkFTVDsKQEAgLTU5Niw3ICs2MDEsNyBAQAogCXUzMiBidWZbNjRdOwogCXVuc2lnbmVkIGludCBpLCBjLCBsZWZ0LCB2YWwsIG9mZnNldCA9IGFkZHIgJiAweGZmOwogCi0JaWYgKGFkZHIgPj0gU0ZfU0laRSB8fCBvZmZzZXQgKyBuID4gU0ZfUEFHRV9TSVpFKQorCWlmIChhZGRyID49IGFkYXB0ZXItPnBhcmFtcy5zZl9zaXplIHx8IG9mZnNldCArIG4gPiBTRl9QQUdFX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmFsID0gc3dhYjMyKGFkZHIpIHwgU0ZfUFJPR19QQUdFOwpAQCAtNjE0LDcgKzYxOSw3IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIHVubG9jazsKIAl9Ci0JcmV0ID0gZmxhc2hfd2FpdF9vcChhZGFwdGVyLCA1LCAxKTsKKwlyZXQgPSBmbGFzaF93YWl0X29wKGFkYXB0ZXIsIDgsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC02NDcsOSArNjUyLDggQEAKICAqLwogc3RhdGljIGludCBnZXRfZndfdmVyc2lvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyICp2ZXJzKQogewotCXJldHVybiB0NF9yZWFkX2ZsYXNoKGFkYXB0ZXIsCi0JCQkgICAgIEZXX0lNR19TVEFSVCArIG9mZnNldG9mKHN0cnVjdCBmd19oZHIsIGZ3X3ZlciksIDEsCi0JCQkgICAgIHZlcnMsIDApOworCXJldHVybiB0NF9yZWFkX2ZsYXNoKGFkYXB0ZXIsIGFkYXB0ZXItPnBhcmFtcy5zZl9md19zdGFydCArCisJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBmd19oZHIsIGZ3X3ZlciksIDEsIHZlcnMsIDApOwogfQogCiAvKioKQEAgLTY2MSw4ICs2NjUsOCBAQAogICovCiBzdGF0aWMgaW50IGdldF90cF92ZXJzaW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgKnZlcnMpCiB7Ci0JcmV0dXJuIHQ0X3JlYWRfZmxhc2goYWRhcHRlciwgRldfSU1HX1NUQVJUICsgb2Zmc2V0b2Yoc3RydWN0IGZ3X2hkciwKLQkJCQkJCQkgICAgICB0cF9taWNyb2NvZGVfdmVyKSwKKwlyZXR1cm4gdDRfcmVhZF9mbGFzaChhZGFwdGVyLCBhZGFwdGVyLT5wYXJhbXMuc2ZfZndfc3RhcnQgKworCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgZndfaGRyLCB0cF9taWNyb2NvZGVfdmVyKSwKIAkJCSAgICAgMSwgdmVycywgMCk7CiB9CiAKQEAgLTY4NCw5ICs2ODgsOSBAQAogCWlmICghcmV0KQogCQlyZXQgPSBnZXRfdHBfdmVyc2lvbihhZGFwdGVyLCAmYWRhcHRlci0+cGFyYW1zLnRwX3ZlcnMpOwogCWlmICghcmV0KQotCQlyZXQgPSB0NF9yZWFkX2ZsYXNoKGFkYXB0ZXIsCi0JCQlGV19JTUdfU1RBUlQgKyBvZmZzZXRvZihzdHJ1Y3QgZndfaGRyLCBpbnRmdmVyX25pYyksCi0JCQkyLCBhcGlfdmVycywgMSk7CisJCXJldCA9IHQ0X3JlYWRfZmxhc2goYWRhcHRlciwgYWRhcHRlci0+cGFyYW1zLnNmX2Z3X3N0YXJ0ICsKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IGZ3X2hkciwgaW50ZnZlcl9uaWMpLAorCQkJCSAgICAyLCBhcGlfdmVycywgMSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNzI2LDcgKzczMCw3IEBACiAJCWlmICgocmV0ID0gc2YxX3dyaXRlKGFkYXB0ZXIsIDEsIDAsIDEsIFNGX1dSX0VOQUJMRSkpICE9IDAgfHwKIAkJICAgIChyZXQgPSBzZjFfd3JpdGUoYWRhcHRlciwgNCwgMCwgMSwKIAkJCQkgICAgIFNGX0VSQVNFX1NFQ1RPUiB8IChzdGFydCA8PCA4KSkpICE9IDAgfHwKLQkJICAgIChyZXQgPSBmbGFzaF93YWl0X29wKGFkYXB0ZXIsIDUsIDUwMCkpICE9IDApIHsKKwkJICAgIChyZXQgPSBmbGFzaF93YWl0X29wKGFkYXB0ZXIsIDE0LCA1MDApKSAhPSAwKSB7CiAJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAogCQkJCSJlcmFzZSBvZiBmbGFzaCBzZWN0b3IgJWQgZmFpbGVkLCBlcnJvciAlZFxuIiwKIAkJCQlzdGFydCwgcmV0KTsKQEAgLTc1NCw2ICs3NTgsOSBAQAogCXU4IGZpcnN0X3BhZ2VbU0ZfUEFHRV9TSVpFXTsKIAljb25zdCB1MzIgKnAgPSAoY29uc3QgdTMyICopZndfZGF0YTsKIAljb25zdCBzdHJ1Y3QgZndfaGRyICpoZHIgPSAoY29uc3Qgc3RydWN0IGZ3X2hkciAqKWZ3X2RhdGE7CisJdW5zaWduZWQgaW50IHNmX3NlY19zaXplID0gYWRhcC0+cGFyYW1zLnNmX3NpemUgLyBhZGFwLT5wYXJhbXMuc2ZfbnNlYzsKKwl1bnNpZ25lZCBpbnQgZndfaW1nX3N0YXJ0ID0gYWRhcC0+cGFyYW1zLnNmX2Z3X3N0YXJ0OworCXVuc2lnbmVkIGludCBmd19zdGFydF9zZWMgPSBmd19pbWdfc3RhcnQgLyBzZl9zZWNfc2l6ZTsKIAogCWlmICghc2l6ZSkgewogCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAiRlcgaW1hZ2UgaGFzIG5vIGRhdGFcbiIpOwpAQCAtNzg0LDggKzc5MSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWkgPSBESVZfUk9VTkRfVVAoc2l6ZSwgU0ZfU0VDX1NJWkUpOyAgICAgICAgLyogIyBvZiBzZWN0b3JzIHNwYW5uZWQgKi8KLQlyZXQgPSB0NF9mbGFzaF9lcmFzZV9zZWN0b3JzKGFkYXAsIEZXX1NUQVJUX1NFQywgRldfU1RBUlRfU0VDICsgaSAtIDEpOworCWkgPSBESVZfUk9VTkRfVVAoc2l6ZSwgc2Zfc2VjX3NpemUpOyAgICAgICAgLyogIyBvZiBzZWN0b3JzIHNwYW5uZWQgKi8KKwlyZXQgPSB0NF9mbGFzaF9lcmFzZV9zZWN0b3JzKGFkYXAsIGZ3X3N0YXJ0X3NlYywgZndfc3RhcnRfc2VjICsgaSAtIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC03OTYsMTEgKzgwMywxMSBAQAogCSAqLwogCW1lbWNweShmaXJzdF9wYWdlLCBmd19kYXRhLCBTRl9QQUdFX1NJWkUpOwogCSgoc3RydWN0IGZ3X2hkciAqKWZpcnN0X3BhZ2UpLT5md192ZXIgPSBodG9ubCgweGZmZmZmZmZmKTsKLQlyZXQgPSB0NF93cml0ZV9mbGFzaChhZGFwLCBGV19JTUdfU1RBUlQsIFNGX1BBR0VfU0laRSwgZmlyc3RfcGFnZSk7CisJcmV0ID0gdDRfd3JpdGVfZmxhc2goYWRhcCwgZndfaW1nX3N0YXJ0LCBTRl9QQUdFX1NJWkUsIGZpcnN0X3BhZ2UpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JYWRkciA9IEZXX0lNR19TVEFSVDsKKwlhZGRyID0gZndfaW1nX3N0YXJ0OwogCWZvciAoc2l6ZSAtPSBTRl9QQUdFX1NJWkU7IHNpemU7IHNpemUgLT0gU0ZfUEFHRV9TSVpFKSB7CiAJCWFkZHIgKz0gU0ZfUEFHRV9TSVpFOwogCQlmd19kYXRhICs9IFNGX1BBR0VfU0laRTsKQEAgLTgxMCw3ICs4MTcsNyBAQAogCX0KIAogCXJldCA9IHQ0X3dyaXRlX2ZsYXNoKGFkYXAsCi0JCQkgICAgIEZXX0lNR19TVEFSVCArIG9mZnNldG9mKHN0cnVjdCBmd19oZHIsIGZ3X3ZlciksCisJCQkgICAgIGZ3X2ltZ19zdGFydCArIG9mZnNldG9mKHN0cnVjdCBmd19oZHIsIGZ3X3ZlciksCiAJCQkgICAgIHNpemVvZihoZHItPmZ3X3ZlciksIChjb25zdCB1OCAqKSZoZHItPmZ3X3Zlcik7CiBvdXQ6CiAJaWYgKHJldCkKQEAgLTExMjgsNiArMTEzNSw3IEBACiBzdGF0aWMgdm9pZCB1bHByeF9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RhdGljIHN0cnVjdCBpbnRyX2luZm8gdWxwcnhfaW50cl9pbmZvW10gPSB7CisJCXsgMHgxODAwMDAwLCAiVUxQUlggY29udGV4dCBlcnJvciIsIC0xLCAxIH0sCiAJCXsgMHg3ZmZmZmYsICJVTFBSWCBwYXJpdHkgZXJyb3IiLCAtMSwgMSB9LAogCQl7IDAgfQogCX07CkBAIC0xNDM2LDcgKzE0NDQsNyBAQAogCQl0NF9mYXRhbF9lcnIoYWRhcCk7CiB9CiAKLSNkZWZpbmUgUEZfSU5UUl9NQVNLIChQRlNXIHwgUEZDSU0pCisjZGVmaW5lIFBGX0lOVFJfTUFTSyAoUEZTVykKICNkZWZpbmUgR0xCTF9JTlRSX01BU0sgKENJTSB8IE1QUyB8IFBMIHwgUENJRSB8IE1DIHwgRURDMCB8IFwKIAkJRURDMSB8IExFIHwgVFAgfCBNQSB8IFBNX1RYIHwgUE1fUlggfCBVTFBfUlggfCBcCiAJCUNQTF9TV0lUQ0ggfCBTR0UgfCBVTFBfVFgpCkBAIC0yNTEwLDcgKzI1MTgsNyBAQAogCWMucmV0dmFsX2xlbjE2ID0gaHRvbmwoRldfTEVOMTYoYykpOwogCWMubmlxZmxpbnRfbmlxID0gaHRvbmwoRldfUEZWRl9DTURfTklRRkxJTlQocnhxaSkgfAogCQkJICAgICAgIEZXX1BGVkZfQ01EX05JUShyeHEpKTsKLQljLmNtYXNrX3RvX25lcSA9IGh0b25sKEZXX1BGVkZfQ01EX0NNQVNLKGNtYXNrKSB8CisJYy50eXBlX3RvX25lcSA9IGh0b25sKEZXX1BGVkZfQ01EX0NNQVNLKGNtYXNrKSB8CiAJCQkgICAgICAgRldfUEZWRl9DTURfUE1BU0socG1hc2spIHwKIAkJCSAgICAgICBGV19QRlZGX0NNRF9ORVEodHhxKSk7CiAJYy50Y190b19uZXhhY3RmID0gaHRvbmwoRldfUEZWRl9DTURfVEModGMpIHwgRldfUEZWRl9DTURfTlZJKHZpKSB8CkBAIC0yNTcyLDcgKzI1ODAsNyBAQAogCX0KIAlpZiAocnNzX3NpemUpCiAJCSpyc3Nfc2l6ZSA9IEZXX1ZJX0NNRF9SU1NTSVpFX0dFVChudG9ocyhjLnJzc3NpemVfcGtkKSk7Ci0JcmV0dXJuIG50b2hzKGMudmlpZF9wa2QpOworCXJldHVybiBGV19WSV9DTURfVklJRF9HRVQobnRvaHMoYy50eXBlX3ZpaWQpKTsKIH0KIAogLyoqCkBAIC0yNTk1LDcgKzI2MDMsNyBAQAogCQkJICAgIEZXX0NNRF9FWEVDIHwgRldfVklfQ01EX1BGTihwZikgfAogCQkJICAgIEZXX1ZJX0NNRF9WRk4odmYpKTsKIAljLmFsbG9jX3RvX2xlbjE2ID0gaHRvbmwoRldfVklfQ01EX0ZSRUUgfCBGV19MRU4xNihjKSk7Ci0JYy52aWlkX3BrZCA9IGh0b25zKEZXX1ZJX0NNRF9WSUlEKHZpaWQpKTsKKwljLnR5cGVfdmlpZCA9IGh0b25zKEZXX1ZJX0NNRF9WSUlEKHZpaWQpKTsKIAlyZXR1cm4gdDRfd3JfbWJveChhZGFwLCBtYm94LCAmYywgc2l6ZW9mKGMpLCAmYyk7CiB9CiAKQEAgLTMwNDUsNyArMzA1Myw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB3YWl0X2Rldl9yZWFkeShzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK2ludCB0NF93YWl0X2Rldl9yZWFkeShzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKIAlpZiAodDRfcmVhZF9yZWcoYWRhcCwgUExfV0hPQU1JKSAhPSAweGZmZmZmZmZmKQogCQlyZXR1cm4gMDsKQEAgLTMwNTMsNiArMzA2MSwzMyBAQAogCXJldHVybiB0NF9yZWFkX3JlZyhhZGFwLCBQTF9XSE9BTUkpICE9IDB4ZmZmZmZmZmYgPyAwIDogLUVJTzsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgZ2V0X2ZsYXNoX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlpbnQgcmV0OworCXUzMiBpbmZvOworCisJcmV0ID0gc2YxX3dyaXRlKGFkYXAsIDEsIDEsIDAsIFNGX1JEX0lEKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2YxX3JlYWQoYWRhcCwgMywgMCwgMSwgJmluZm8pOworCXQ0X3dyaXRlX3JlZyhhZGFwLCBTRl9PUCwgMCk7ICAgICAgICAgICAgICAgICAgICAvKiB1bmxvY2sgU0YgKi8KKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKChpbmZvICYgMHhmZikgIT0gMHgyMCkgICAgICAgICAgICAgLyogbm90IGEgTnVtb25peCBmbGFzaCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpbmZvID4+PSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2cyIG9mIHNpemUgKi8KKwlpZiAoaW5mbyA+PSAweDE0ICYmIGluZm8gPCAweDE4KQorCQlhZGFwLT5wYXJhbXMuc2ZfbnNlYyA9IDEgPDwgKGluZm8gLSAxNik7CisJZWxzZSBpZiAoaW5mbyA9PSAweDE4KQorCQlhZGFwLT5wYXJhbXMuc2ZfbnNlYyA9IDY0OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWRhcC0+cGFyYW1zLnNmX3NpemUgPSAxIDw8IGluZm87CisJYWRhcC0+cGFyYW1zLnNmX2Z3X3N0YXJ0ID0KKwkJdDRfcmVhZF9yZWcoYWRhcCwgQ0lNX0JPT1RfQ0ZHKSAmIEJPT1RBRERSX01BU0s7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICoJdDRfcHJlcF9hZGFwdGVyIC0gcHJlcGFyZSBTVyBhbmQgSFcgZm9yIG9wZXJhdGlvbgogICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCkBAIC0zMDY2LDEzICszMTAxLDE5IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHdhaXRfZGV2X3JlYWR5KGFkYXB0ZXIpOworCXJldCA9IHQ0X3dhaXRfZGV2X3JlYWR5KGFkYXB0ZXIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJZ2V0X3BjaV9tb2RlKGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMucGNpKTsKIAlhZGFwdGVyLT5wYXJhbXMucmV2ID0gdDRfcmVhZF9yZWcoYWRhcHRlciwgUExfUkVWKTsKIAorCXJldCA9IGdldF9mbGFzaF9wYXJhbXMoYWRhcHRlcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgImVycm9yICVkIGlkZW50aWZ5aW5nIGZsYXNoXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldCA9IGdldF92cGRfcGFyYW1zKGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMudnBkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTMwOTIsOCArMzEzMywxMCBAQAogCXU4IGFkZHJbNl07CiAJaW50IHJldCwgaSwgaiA9IDA7CiAJc3RydWN0IGZ3X3BvcnRfY21kIGM7CisJc3RydWN0IGZ3X3Jzc192aV9jb25maWdfY21kIHJ2YzsKIAogCW1lbXNldCgmYywgMCwgc2l6ZW9mKGMpKTsKKwltZW1zZXQoJnJ2YywgMCwgc2l6ZW9mKHJ2YykpOwogCiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CiAJCXVuc2lnbmVkIGludCByc3Nfc2l6ZTsKQEAgLTMxMjIsMTIgKzMxNjUsMjIgQEAKIAkJcC0+cnNzX3NpemUgPSByc3Nfc2l6ZTsKIAkJbWVtY3B5KGFkYXAtPnBvcnRbaV0tPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJCW1lbWNweShhZGFwLT5wb3J0W2ldLT5wZXJtX2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwkJYWRhcC0+cG9ydFtpXS0+ZGV2X2lkID0gajsKIAogCQlyZXQgPSBudG9obChjLnUuaW5mby5sc3RhdHVzX3RvX21vZHR5cGUpOwogCQlwLT5tZGlvX2FkZHIgPSAocmV0ICYgRldfUE9SVF9DTURfTURJT0NBUCkgPwogCQkJRldfUE9SVF9DTURfTURJT0FERFJfR0VUKHJldCkgOiAtMTsKIAkJcC0+cG9ydF90eXBlID0gRldfUE9SVF9DTURfUFRZUEVfR0VUKHJldCk7Ci0JCXAtPm1vZF90eXBlID0gRldfUE9SVF9DTURfTU9EVFlQRV9HRVQocmV0KTsKKwkJcC0+bW9kX3R5cGUgPSBGV19QT1JUX01PRF9UWVBFX05BOworCisJCXJ2Yy5vcF90b192aWlkID0gaHRvbmwoRldfQ01EX09QKEZXX1JTU19WSV9DT05GSUdfQ01EKSB8CisJCQkJICAgICAgIEZXX0NNRF9SRVFVRVNUIHwgRldfQ01EX1JFQUQgfAorCQkJCSAgICAgICBGV19SU1NfVklfQ09ORklHX0NNRF9WSUlEKHAtPnZpaWQpKTsKKwkJcnZjLnJldHZhbF9sZW4xNiA9IGh0b25sKEZXX0xFTjE2KHJ2YykpOworCQlyZXQgPSB0NF93cl9tYm94KGFkYXAsIG1ib3gsICZydmMsIHNpemVvZihydmMpLCAmcnZjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXAtPnJzc19tb2RlID0gbnRvaGwocnZjLnUuYmFzaWN2aXJ0dWFsLmRlZmF1bHRxX3RvX3VkcGVuKTsKIAogCQlpbml0X2xpbmtfY29uZmlnKCZwLT5saW5rX2NmZywgbnRvaHMoYy51LmluZm8ucGNhcCkpOwogCQlqKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNC90NF9ody5oIGIvZHJpdmVycy9uZXQvY3hnYjQvdDRfaHcuaAppbmRleCAwMjU2MjMyLi4xMGEwNTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiNC90NF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0X2h3LmgKQEAgLTU3LDggKzU3LDYgQEAKIAogZW51bSB7CiAJU0ZfUEFHRV9TSVpFID0gMjU2LCAgICAgICAgICAgLyogc2VyaWFsIGZsYXNoIHBhZ2Ugc2l6ZSAqLwotCVNGX1NFQ19TSVpFID0gNjQgKiAxMDI0LCAgICAgIC8qIHNlcmlhbCBmbGFzaCBzZWN0b3Igc2l6ZSAqLwotCVNGX1NJWkUgPSBTRl9TRUNfU0laRSAqIDE2LCAgIC8qIHNlcmlhbCBmbGFzaCBzaXplICovCiB9OwogCiBlbnVtIHsgUlNQX1RZUEVfRkxCVUYsIFJTUF9UWVBFX0NQTCwgUlNQX1RZUEVfSU5UUiB9OyAvKiByZXNwb25zZSBlbnRyeSB0eXBlcyAqLwpAQCAtNjksNiArNjcsNDUgQEAKIAlTR0VfTUFYX1dSX0xFTiA9IDUxMiwgICAgIC8qIG1heCBXUiBzaXplIGluIGJ5dGVzICovCiAJU0dFX05USU1FUlMgPSA2LCAgICAgICAgICAvKiAjIG9mIGludGVycnVwdCBob2xkb2ZmIHRpbWVyIHZhbHVlcyAqLwogCVNHRV9OQ09VTlRFUlMgPSA0LCAgICAgICAgLyogIyBvZiBpbnRlcnJ1cHQgcGFja2V0IGNvdW50ZXIgdmFsdWVzICovCisKKwlTR0VfVElNRVJfUlNUUlRfQ05UUiA9IDYsIC8qIHJlc3RhcnQgUlggcGFja2V0IHRocmVzaG9sZCBjb3VudGVyICovCisJU0dFX1RJTUVSX1VQRF9DSURYID0gNywgICAvKiB1cGRhdGUgY2lkeCBvbmx5ICovCisKKwlTR0VfRVFfSURYU0laRSA9IDY0LCAgICAgIC8qIGVncmVzcyBxdWV1ZSBwaWR4L2NpZHggdW5pdCBzaXplICovCisKKwlTR0VfSU5UUkRTVF9QQ0kgPSAwLCAgICAgIC8qIGludGVycnVwdCBkZXN0aW5hdGlvbiBpcyBQQ0ktRSAqLworCVNHRV9JTlRSRFNUX0lRID0gMSwgICAgICAgLyogICBkZXN0aW5hdGlvbiBpcyBhbiBpbmdyZXNzIHF1ZXVlICovCisKKwlTR0VfVVBEQVRFREVMX05PTkUgPSAwLCAgIC8qIGluZ3Jlc3MgcXVldWUgcGlkeCB1cGRhdGUgZGVsaXZlcnkgKi8KKwlTR0VfVVBEQVRFREVMX0lOVFIgPSAxLCAgIC8qICAgaW50ZXJydXB0ICovCisJU0dFX1VQREFURURFTF9TVFBHID0gMiwgICAvKiAgIHN0YXR1cyBwYWdlICovCisJU0dFX1VQREFURURFTF9CT1RIID0gMywgICAvKiAgIGludGVycnVwdCBhbmQgc3RhdHVzIHBhZ2UgKi8KKworCVNHRV9IT1NURkNNT0RFX05PTkUgPSAwLCAgLyogZWdyZXNzIHF1ZXVlIGNpZHggdXBkYXRlcyAqLworCVNHRV9IT1NURkNNT0RFX0lRID0gMSwgICAgLyogICBzZW50IHRvIGluZ3Jlc3MgcXVldWUgKi8KKwlTR0VfSE9TVEZDTU9ERV9TVFBHID0gMiwgIC8qICAgc2VudCB0byBzdGF0dXMgcGFnZSAqLworCVNHRV9IT1NURkNNT0RFX0JPVEggPSAzLCAgLyogICBpbmdyZXNzIHF1ZXVlIGFuZCBzdGF0dXMgcGFnZSAqLworCisJU0dFX0ZFVENIQlVSU1RNSU5fMTZCID0gMCwvKiBlZ3Jlc3MgcXVldWUgZGVzY3JpcHRvciBmZXRjaCBtaW5pbXVtICovCisJU0dFX0ZFVENIQlVSU1RNSU5fMzJCID0gMSwKKwlTR0VfRkVUQ0hCVVJTVE1JTl82NEIgPSAyLAorCVNHRV9GRVRDSEJVUlNUTUlOXzEyOEIgPSAzLAorCisJU0dFX0ZFVENIQlVSU1RNQVhfNjRCID0gMCwvKiBlZ3Jlc3MgcXVldWUgZGVzY3JpcHRvciBmZXRjaCBtYXhpbXVtICovCisJU0dFX0ZFVENIQlVSU1RNQVhfMTI4QiA9IDEsCisJU0dFX0ZFVENIQlVSU1RNQVhfMjU2QiA9IDIsCisJU0dFX0ZFVENIQlVSU1RNQVhfNTEyQiA9IDMsCisKKwlTR0VfQ0lEWEZMVVNIVEhSRVNIXzEgPSAwLC8qIGVncmVzcyBxdWV1ZSBjaWR4IGZsdXNoIHRocmVzaG9sZCAqLworCVNHRV9DSURYRkxVU0hUSFJFU0hfMiA9IDEsCisJU0dFX0NJRFhGTFVTSFRIUkVTSF80ID0gMiwKKwlTR0VfQ0lEWEZMVVNIVEhSRVNIXzggPSAzLAorCVNHRV9DSURYRkxVU0hUSFJFU0hfMTYgPSA0LAorCVNHRV9DSURYRkxVU0hUSFJFU0hfMzIgPSA1LAorCVNHRV9DSURYRkxVU0hUSFJFU0hfNjQgPSA2LAorCVNHRV9DSURYRkxVU0hUSFJFU0hfMTI4ID0gNywKKworCVNHRV9JTkdQQURCT1VOREFSWV9TSElGVCA9IDUsLyogaW5ncmVzcyBxdWV1ZSBwYWQgYm91bmRhcnkgKi8KIH07CiAKIHN0cnVjdCBzZ2VfcXN0YXQgeyAgICAgICAgICAgICAgICAvKiBkYXRhIHdyaXR0ZW4gdG8gU0dFIHF1ZXVlIHN0YXR1cyBlbnRyaWVzICovCkBAIC05MCwxMSArMTI3LDEzIEBACiB9OwogCiAjZGVmaW5lIFJTUERfTkVXQlVGIDB4ODAwMDAwMDBVCi0jZGVmaW5lIFJTUERfTEVOICAgIDB4N2ZmZmZmZmZVCisjZGVmaW5lIFJTUERfTEVOKHgpICgoKHgpID4+IDApICYgMHg3ZmZmZmZmZlUpCisjZGVmaW5lIFJTUERfUUlEKHgpIFJTUERfTEVOKHgpCiAKICNkZWZpbmUgUlNQRF9HRU4oeCkgICgoeCkgPj4gNykKICNkZWZpbmUgUlNQRF9UWVBFKHgpICgoKHgpID4+IDQpICYgMykKIAogI2RlZmluZSBRSU5UUl9DTlRfRU4gICAgICAgMHgxCiAjZGVmaW5lIFFJTlRSX1RJTUVSX0lEWCh4KSAoKHgpIDw8IDEpCisjZGVmaW5lIFFJTlRSX1RJTUVSX0lEWF9HRVQoeCkgKCgoeCkgPj4gMSkgJiAweDcpCiAjZW5kaWYgLyogX19UNF9IV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNC90NF9tc2cuaCBiL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0X21zZy5oCmluZGV4IDdhOTgxYjguLmE1NTBkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0X21zZy5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0X21zZy5oCkBAIC00NDMsOCArNDQzLDcgQEAKIAogI2RlZmluZSBjcGxfdHhfcGt0X3h0IGNwbF90eF9wa3QKIAotc3RydWN0IGNwbF90eF9wa3RfbHNvIHsKLQlXUl9IRFI7CitzdHJ1Y3QgY3BsX3R4X3BrdF9sc29fY29yZSB7CiAJX19iZTMyIGxzb19jdHJsOwogI2RlZmluZSBMU09fVENQSERSX0xFTih4KSAoKHgpIDw8IDApCiAjZGVmaW5lIExTT19JUEhEUl9MRU4oeCkgICgoeCkgPDwgNCkKQEAgLTQ2MCw2ICs0NTksMTIgQEAKIAkvKiBlbmNhcHN1bGF0ZWQgQ1BMIChUWF9QS1QsIFRYX1BLVF9YVCBvciBUWF9EQVRBKSBmb2xsb3dzIGhlcmUgKi8KIH07CiAKK3N0cnVjdCBjcGxfdHhfcGt0X2xzbyB7CisJV1JfSERSOworCXN0cnVjdCBjcGxfdHhfcGt0X2xzb19jb3JlIGM7CisJLyogZW5jYXBzdWxhdGVkIENQTCAoVFhfUEtULCBUWF9QS1RfWFQgb3IgVFhfREFUQSkgZm9sbG93cyBoZXJlICovCit9OworCiBzdHJ1Y3QgY3BsX2lzY3NpX2hkciB7CiAJdW5pb24gb3Bjb2RlX3RpZCBvdDsKIAlfX2JlMTYgcGR1X2xlbl9kZHA7CkBAIC01MjQsNiArNTI5LDggQEAKIAlfX2JlMzIgbDJpbmZvOwogI2RlZmluZSBSWEZfVURQICgxIDw8IDIyKQogI2RlZmluZSBSWEZfVENQICgxIDw8IDIzKQorI2RlZmluZSBSWEZfSVAgICgxIDw8IDI0KQorI2RlZmluZSBSWEZfSVA2ICgxIDw8IDI1KQogCV9fYmUxNiBoZHJfbGVuOwogCV9fYmUxNiBlcnJfdmVjOwogfTsKQEAgLTYyMyw2ICs2MzAsMTEgQEAKIAlfX2JlNjQgZGF0YVs0XTsKIH07CiAKKy8qIGNwbF9mdzZfbXNnLnR5cGUgdmFsdWVzICovCitlbnVtIHsKKwlGVzZfVFlQRV9DTURfUlBMID0gMCwKK307CisKIGVudW0gewogCVVMUF9UWF9NRU1fUkVBRCA9IDIsCiAJVUxQX1RYX01FTV9XUklURSA9IDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNC90NF9yZWdzLmggYi9kcml2ZXJzL25ldC9jeGdiNC90NF9yZWdzLmgKaW5kZXggNWVkNTY0OC4uMGFkYzViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjQvdDRfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0X3JlZ3MuaApAQCAtOTMsMTIgKzkzLDE1IEBACiAjZGVmaW5lICBQS1RTSElGVF9NQVNLICAgICAgICAgIDB4MDAwMDFjMDBVCiAjZGVmaW5lICBQS1RTSElGVF9TSElGVCAgICAgICAgIDEwCiAjZGVmaW5lICBQS1RTSElGVCh4KSAgICAgICAgICAgICgoeCkgPDwgUEtUU0hJRlRfU0hJRlQpCisjZGVmaW5lICBQS1RTSElGVF9HRVQoeCkJKCgoeCkgJiBQS1RTSElGVF9NQVNLKSA+PiBQS1RTSElGVF9TSElGVCkKICNkZWZpbmUgIElOR1BDSUVCT1VOREFSWV9NQVNLICAgMHgwMDAwMDM4MFUKICNkZWZpbmUgIElOR1BDSUVCT1VOREFSWV9TSElGVCAgNwogI2RlZmluZSAgSU5HUENJRUJPVU5EQVJZKHgpICAgICAoKHgpIDw8IElOR1BDSUVCT1VOREFSWV9TSElGVCkKICNkZWZpbmUgIElOR1BBREJPVU5EQVJZX01BU0sgICAgMHgwMDAwMDA3MFUKICNkZWZpbmUgIElOR1BBREJPVU5EQVJZX1NISUZUICAgNAogI2RlZmluZSAgSU5HUEFEQk9VTkRBUlkoeCkgICAgICAoKHgpIDw8IElOR1BBREJPVU5EQVJZX1NISUZUKQorI2RlZmluZSAgSU5HUEFEQk9VTkRBUllfR0VUKHgpCSgoKHgpICYgSU5HUEFEQk9VTkRBUllfTUFTSykgXAorCQkJCSA+PiBJTkdQQURCT1VOREFSWV9TSElGVCkKICNkZWZpbmUgIEVHUlBDSUVCT1VOREFSWV9NQVNLICAgMHgwMDAwMDAwZVUKICNkZWZpbmUgIEVHUlBDSUVCT1VOREFSWV9TSElGVCAgMQogI2RlZmluZSAgRUdSUENJRUJPVU5EQVJZKHgpICAgICAoKHgpIDw8IEVHUlBDSUVCT1VOREFSWV9TSElGVCkKQEAgLTIyOSw2ICsyMzIsNyBAQAogI2RlZmluZSAgV0lORE9XX01BU0sgICAgIDB4MDAwMDAwZmZVCiAjZGVmaW5lICBXSU5ET1dfU0hJRlQgICAgMAogI2RlZmluZSAgV0lORE9XKHgpICAgICAgICgoeCkgPDwgV0lORE9XX1NISUZUKQorI2RlZmluZSBQQ0lFX01FTV9BQ0NFU1NfT0ZGU0VUIDB4MzA2YwogCiAjZGVmaW5lIFBDSUVfQ09SRV9VVExfU1lTVEVNX0JVU19BR0VOVF9TVEFUVVMgMHg1OTA4CiAjZGVmaW5lICBSTlBQIDB4ODAwMDAwMDBVCkBAIC0zMjYsNiArMzMwLDkgQEAKIAogI2RlZmluZSBFRENfMV9CQVNFX0FERFIgMHg3OTgwCiAKKyNkZWZpbmUgQ0lNX0JPT1RfQ0ZHIDB4N2IwMAorI2RlZmluZSAgQk9PVEFERFJfTUFTSyAweGZmZmZmZjAwVQorCiAjZGVmaW5lIENJTV9QRl9NQUlMQk9YX0RBVEEgMHgyNDAKICNkZWZpbmUgQ0lNX1BGX01BSUxCT1hfQ1RSTCAweDI4MAogI2RlZmluZSAgTUJNU0dWQUxJRCAgICAgMHgwMDAwMDAwOFUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0ZndfYXBpLmggYi9kcml2ZXJzL25ldC9jeGdiNC90NGZ3X2FwaS5oCmluZGV4IDYzOTkxZDYuLjA5NjlmMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2I0L3Q0ZndfYXBpLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjQvdDRmd19hcGkuaApAQCAtNzEsNiArNzEsNyBAQAogI2RlZmluZSBGV19XUl9BVE9NSUMoeCkJICgoeCkgPDwgMjMpCiAjZGVmaW5lIEZXX1dSX0ZMVVNIKHgpICAgKCh4KSA8PCAyMikKICNkZWZpbmUgRldfV1JfQ09NUEwoeCkgICAoKHgpIDw8IDIxKQorI2RlZmluZSBGV19XUl9JTU1ETEVOX01BU0sgMHhmZgogI2RlZmluZSBGV19XUl9JTU1ETEVOKHgpICgoeCkgPDwgMCkKIAogI2RlZmluZSBGV19XUl9FUVVJUQkoMVUgPDwgMzEpCkBAIC00NDcsNyArNDQ4LDkgQEAKIAlGV19QQVJBTVNfUEFSQU1fREVWX0lOVFZFUl9SSQk9IDB4MDcsCiAJRldfUEFSQU1TX1BBUkFNX0RFVl9JTlRWRVJfSVNDU0lQRFUgPSAweDA4LAogCUZXX1BBUkFNU19QQVJBTV9ERVZfSU5UVkVSX0lTQ1NJID0gMHgwOSwKLQlGV19QQVJBTVNfUEFSQU1fREVWX0lOVFZFUl9GQ09FID0gMHgwQQorCUZXX1BBUkFNU19QQVJBTV9ERVZfSU5UVkVSX0ZDT0UgPSAweDBBLAorCUZXX1BBUkFNU19QQVJBTV9ERVZfRldSRVYgPSAweDBCLAorCUZXX1BBUkFNU19QQVJBTV9ERVZfVFBSRVYgPSAweDBDLAogfTsKIAogLyoKQEAgLTQ3NSw3ICs0NzgsMTUgQEAKIAlGV19QQVJBTVNfUEFSQU1fUEZWRl9QQkxfRU5ECT0gMHgxMiwKIAlGV19QQVJBTVNfUEFSQU1fUEZWRl9MMlRfU1RBUlQgPSAweDEzLAogCUZXX1BBUkFNU19QQVJBTV9QRlZGX0wyVF9FTkQgPSAweDE0LAorCUZXX1BBUkFNU19QQVJBTV9QRlZGX1NRUlFfU1RBUlQgPSAweDE1LAorCUZXX1BBUkFNU19QQVJBTV9QRlZGX1NRUlFfRU5ECT0gMHgxNiwKKwlGV19QQVJBTVNfUEFSQU1fUEZWRl9DUV9TVEFSVAk9IDB4MTcsCisJRldfUEFSQU1TX1BBUkFNX1BGVkZfQ1FfRU5ECT0gMHgxOCwKIAlGV19QQVJBTVNfUEFSQU1fUEZWRl9TQ0hFRENMQVNTX0VUSCA9IDB4MjAsCisJRldfUEFSQU1TX1BBUkFNX1BGVkZfVklJRCAgICAgICA9IDB4MjQsCisJRldfUEFSQU1TX1BBUkFNX1BGVkZfQ1BNQVNLICAgICA9IDB4MjUsCisJRldfUEFSQU1TX1BBUkFNX1BGVkZfT0NRX1NUQVJUICA9IDB4MjYsCisJRldfUEFSQU1TX1BBUkFNX1BGVkZfT0NRX0VORCAgICA9IDB4MjcsCiB9OwogCiAvKgpAQCAtNTEyLDcgKzUyMyw3IEBACiAJX19iZTMyIG9wX3RvX3ZmbjsKIAlfX2JlMzIgcmV0dmFsX2xlbjE2OwogCV9fYmUzMiBuaXFmbGludF9uaXE7Ci0JX19iZTMyIGNtYXNrX3RvX25lcTsKKwlfX2JlMzIgdHlwZV90b19uZXE7CiAJX19iZTMyIHRjX3RvX25leGFjdGY7CiAJX19iZTMyIHJfY2Fwc190b19uZXRoY3RybDsKIAlfX2JlMTYgbnJpY3E7CkBAIC01MjksMTEgKzU0MCwxNiBAQAogI2RlZmluZSBGV19QRlZGX0NNRF9OSVEoeCkgKCh4KSA8PCAwKQogI2RlZmluZSBGV19QRlZGX0NNRF9OSVFfR0VUKHgpICgoKHgpID4+IDApICYgMHhmZmZmZikKIAorI2RlZmluZSBGV19QRlZGX0NNRF9UWVBFICgxIDw8IDMxKQorI2RlZmluZSBGV19QRlZGX0NNRF9UWVBFX0dFVCh4KSAoKCh4KSA+PiAzMSkgJiAweDEpCisKICNkZWZpbmUgRldfUEZWRl9DTURfQ01BU0soeCkgKCh4KSA8PCAyNCkKLSNkZWZpbmUgRldfUEZWRl9DTURfQ01BU0tfR0VUKHgpICgoKHgpID4+IDI0KSAmIDB4ZikKKyNkZWZpbmUgRldfUEZWRl9DTURfQ01BU0tfTUFTSyAweGYKKyNkZWZpbmUgRldfUEZWRl9DTURfQ01BU0tfR0VUKHgpICgoKHgpID4+IDI0KSAmIEZXX1BGVkZfQ01EX0NNQVNLX01BU0spCiAKICNkZWZpbmUgRldfUEZWRl9DTURfUE1BU0soeCkgKCh4KSA8PCAyMCkKLSNkZWZpbmUgRldfUEZWRl9DTURfUE1BU0tfR0VUKHgpICgoKHgpID4+IDIwKSAmIDB4ZikKKyNkZWZpbmUgRldfUEZWRl9DTURfUE1BU0tfTUFTSyAweGYKKyNkZWZpbmUgRldfUEZWRl9DTURfUE1BU0tfR0VUKHgpICgoKHgpID4+IDIwKSAmIEZXX1BGVkZfQ01EX1BNQVNLX01BU0spCiAKICNkZWZpbmUgRldfUEZWRl9DTURfTkVRKHgpICgoeCkgPDwgMCkKICNkZWZpbmUgRldfUEZWRl9DTURfTkVRX0dFVCh4KSAoKCh4KSA+PiAwKSAmIDB4ZmZmZmYpCkBAIC02ODYsNiArNzAyLDcgQEAKICNkZWZpbmUgRldfRVFfRVRIX0NNRF9FUUlEKHgpICgoeCkgPDwgMCkKICNkZWZpbmUgRldfRVFfRVRIX0NNRF9FUUlEX0dFVCh4KSAoKCh4KSA+PiAwKSAmIDB4ZmZmZmYpCiAjZGVmaW5lIEZXX0VRX0VUSF9DTURfUEhZU0VRSUQoeCkgKCh4KSA8PCAwKQorI2RlZmluZSBGV19FUV9FVEhfQ01EX1BIWVNFUUlEX0dFVCh4KSAoKCh4KSA+PiAwKSAmIDB4ZmZmZmYpCiAKICNkZWZpbmUgRldfRVFfRVRIX0NNRF9GRVRDSFNaTSh4KSAoKHgpIDw8IDI2KQogI2RlZmluZSBGV19FUV9FVEhfQ01EX1NUQVRVU1BHTlMoeCkgKCh4KSA8PCAyNSkKQEAgLTgwNCwxNiArODIxLDE2IEBACiBzdHJ1Y3QgZndfdmlfY21kIHsKIAlfX2JlMzIgb3BfdG9fdmZuOwogCV9fYmUzMiBhbGxvY190b19sZW4xNjsKLQlfX2JlMTYgdmlpZF9wa2Q7CisJX19iZTE2IHR5cGVfdmlpZDsKIAl1OCBtYWNbNl07CiAJdTggcG9ydGlkX3BrZDsKIAl1OCBubWFjOwogCXU4IG5tYWMwWzZdOwogCV9fYmUxNiByc3NzaXplX3BrZDsKIAl1OCBubWFjMVs2XTsKLQlfX2JlMTYgcjc7CisJX19iZTE2IGlkc2lpcV9wa2Q7CiAJdTggbm1hYzJbNl07Ci0JX19iZTE2IHI4OworCV9fYmUxNiBpZHNlaXFfcGtkOwogCXU4IG5tYWMzWzZdOwogCV9fYmU2NCByOTsKIAlfX2JlNjQgcjEwOwpAQCAtODI0LDEzICs4NDEsMTYgQEAKICNkZWZpbmUgRldfVklfQ01EX0FMTE9DICgxVSA8PCAzMSkKICNkZWZpbmUgRldfVklfQ01EX0ZSRUUgKDFVIDw8IDMwKQogI2RlZmluZSBGV19WSV9DTURfVklJRCh4KSAoKHgpIDw8IDApCisjZGVmaW5lIEZXX1ZJX0NNRF9WSUlEX0dFVCh4KSAoKHgpICYgMHhmZmYpCiAjZGVmaW5lIEZXX1ZJX0NNRF9QT1JUSUQoeCkgKCh4KSA8PCA0KQorI2RlZmluZSBGV19WSV9DTURfUE9SVElEX0dFVCh4KSAoKCh4KSA+PiA0KSAmIDB4ZikKICNkZWZpbmUgRldfVklfQ01EX1JTU1NJWkVfR0VUKHgpICgoKHgpID4+IDApICYgMHg3ZmYpCiAKIC8qIFNwZWNpYWwgVklfTUFDIGNvbW1hbmQgaW5kZXggaWRzICovCiAjZGVmaW5lIEZXX1ZJX01BQ19BRERfTUFDCQkweDNGRgogI2RlZmluZSBGV19WSV9NQUNfQUREX1BFUlNJU1RfTUFDCTB4M0ZFCiAjZGVmaW5lIEZXX1ZJX01BQ19NQUNfQkFTRURfRlJFRQkweDNGRAorI2RlZmluZSBGV19DTFNfVENBTV9OVU1fRU5UUklFUwkJMzM2CiAKIGVudW0gZndfdmlfbWFjX3NtYWMgewogCUZXX1ZJX01BQ19NUFNfVENBTV9FTlRSWSwKQEAgLTg4MSw2ICs5MDEsNyBAQAogfTsKIAogI2RlZmluZSBGV19WSV9SWE1PREVfQ01EX1ZJSUQoeCkgKCh4KSA8PCAwKQorI2RlZmluZSBGV19WSV9SWE1PREVfQ01EX01UVV9NQVNLIDB4ZmZmZgogI2RlZmluZSBGV19WSV9SWE1PREVfQ01EX01UVSh4KSAoKHgpIDw8IDE2KQogI2RlZmluZSBGV19WSV9SWE1PREVfQ01EX1BST01JU0NFTl9NQVNLIDB4MwogI2RlZmluZSBGV19WSV9SWE1PREVfQ01EX1BST01JU0NFTih4KSAoKHgpIDw8IDE0KQpAQCAtMTEzNiw2ICsxMTU3LDExIEBACiAJCQlfX2JlMzIgbHN0YXR1c190b19tb2R0eXBlOwogCQkJX19iZTE2IHBjYXA7CiAJCQlfX2JlMTYgYWNhcDsKKwkJCV9fYmUxNiBtdHU7CisJCQlfX3U4ICAgY2JsbGVuOworCQkJX191OCAgIHI5OworCQkJX19iZTMyIHIxMDsKKwkJCV9fYmU2NCByMTE7CiAJCX0gaW5mbzsKIAkJc3RydWN0IGZ3X3BvcnRfcHBwIHsKIAkJCV9fYmUzMiBwcHBlbl90b19uY3NpY2g7CkBAIC0xMTYxLDYgKzExODcsNyBAQAogI2RlZmluZSBGV19QT1JUX0NNRF9QT1JUSURfR0VUKHgpICgoKHgpID4+IDApICYgMHhmKQogCiAjZGVmaW5lIEZXX1BPUlRfQ01EX0FDVElPTih4KSAoKHgpIDw8IDE2KQorI2RlZmluZSBGV19QT1JUX0NNRF9BQ1RJT05fR0VUKHgpICgoKHgpID4+IDE2KSAmIDB4ZmZmZikKIAogI2RlZmluZSBGV19QT1JUX0NNRF9DVExCRih4KSAoKHgpIDw8IDEwKQogI2RlZmluZSBGV19QT1JUX0NNRF9PVkxBTjMoeCkgKCh4KSA8PCA3KQpAQCAtMTE5NiwxNCArMTIyMywxNyBAQAogI2RlZmluZSBGV19QT1JUX0NNRF9OQ1NJQ0goeCkgKCh4KSA8PCA0KQogCiBlbnVtIGZ3X3BvcnRfdHlwZSB7Ci0JRldfUE9SVF9UWVBFX0ZJQkVSLAotCUZXX1BPUlRfVFlQRV9LWDQsCisJRldfUE9SVF9UWVBFX0ZJQkVSX1hGSSwKKwlGV19QT1JUX1RZUEVfRklCRVJfWEFVSSwKIAlGV19QT1JUX1RZUEVfQlRfU0dNSUksCi0JRldfUE9SVF9UWVBFX0tYLAorCUZXX1BPUlRfVFlQRV9CVF9YRkksCiAJRldfUE9SVF9UWVBFX0JUX1hBVUksCi0JRldfUE9SVF9UWVBFX0tSLAorCUZXX1BPUlRfVFlQRV9LWDQsCiAJRldfUE9SVF9UWVBFX0NYNCwKLQlGV19QT1JUX1RZUEVfVFdJTkFYLAorCUZXX1BPUlRfVFlQRV9LWCwKKwlGV19QT1JUX1RZUEVfS1IsCisJRldfUE9SVF9UWVBFX1NGUCwKKwlGV19QT1JUX1RZUEVfQlBfQVAsCiAKIAlGV19QT1JUX1RZUEVfTk9ORSA9IEZXX1BPUlRfQ01EX1BUWVBFX01BU0sKIH07CkBAIC0xMjEzLDYgKzEyNDMsOSBAQAogCUZXX1BPUlRfTU9EX1RZUEVfTFIsCiAJRldfUE9SVF9NT0RfVFlQRV9TUiwKIAlGV19QT1JUX01PRF9UWVBFX0VSLAorCUZXX1BPUlRfTU9EX1RZUEVfVFdJTkFYX1BBU1NJVkUsCisJRldfUE9SVF9NT0RfVFlQRV9UV0lOQVhfQUNUSVZFLAorCUZXX1BPUlRfTU9EX1RZUEVfTFJNLAogCiAJRldfUE9SVF9NT0RfVFlQRV9OT05FID0gRldfUE9SVF9DTURfTU9EVFlQRV9NQVNLCiB9OwpAQCAtMTQ2OSw2ICsxNTAyLDcgQEAKIH07CiAKICNkZWZpbmUgRldfUlNTX0dMQl9DT05GSUdfQ01EX01PREUoeCkJKCh4KSA8PCAyOCkKKyNkZWZpbmUgRldfUlNTX0dMQl9DT05GSUdfQ01EX01PREVfR0VUKHgpICgoKHgpID4+IDI4KSAmIDB4ZikKIAogI2RlZmluZSBGV19SU1NfR0xCX0NPTkZJR19DTURfTU9ERV9NQU5VQUwJMAogI2RlZmluZSBGV19SU1NfR0xCX0NPTkZJR19DTURfTU9ERV9CQVNJQ1ZJUlRVQUwJMQpAQCAtMTQ4NSwxMyArMTUxOSwxNCBAQAogCQl9IG1hbnVhbDsKIAkJc3RydWN0IGZ3X3Jzc192aV9jb25maWdfYmFzaWN2aXJ0dWFsIHsKIAkJCV9fYmUzMiByNjsKLQkJCV9fYmUzMiBkZWZhdWx0cV90b19pcDR1ZHBlbjsKKwkJCV9fYmUzMiBkZWZhdWx0cV90b191ZHBlbjsKICNkZWZpbmUgRldfUlNTX1ZJX0NPTkZJR19DTURfREVGQVVMVFEoeCkgICgoeCkgPDwgMTYpCisjZGVmaW5lIEZXX1JTU19WSV9DT05GSUdfQ01EX0RFRkFVTFRRX0dFVCh4KSAoKCh4KSA+PiAxNikgJiAweDNmZikKICNkZWZpbmUgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2Rk9VUlRVUEVOICgxVSA8PCA0KQogI2RlZmluZSBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZUV09UVVBFTiAgKDFVIDw8IDMpCiAjZGVmaW5lIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNEZPVVJUVVBFTiAoMVUgPDwgMikKICNkZWZpbmUgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0VFdPVFVQRU4gICgxVSA8PCAxKQotI2RlZmluZSBGV19SU1NfVklfQ09ORklHX0NNRF9JUDRVRFBFTiAgICAgKDFVIDw8IDApCisjZGVmaW5lIEZXX1JTU19WSV9DT05GSUdfQ01EX1VEUEVOICAgICAgICAoMVUgPDwgMCkKIAkJCV9fYmU2NCByOTsKIAkJCV9fYmU2NCByMTA7CiAJCX0gYmFzaWN2aXJ0dWFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjR2Zi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyZWUyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIENoZWxzaW8gVDQgU1ItSU9WIFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCisjCisKK29iai0kKENPTkZJR19DSEVMU0lPX1Q0VkYpICs9IGN4Z2I0dmYubworCitjeGdiNHZmLW9ianMgOj0gY3hnYjR2Zl9tYWluLm8gdDR2Zl9ody5vIHNnZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNHZmL2FkYXB0ZXIuaCBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvYWRhcHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTAxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiNHZmL2FkYXB0ZXIuaApAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IFBDSS1FIFNSLUlPViBWaXJ0dWFsIEZ1bmN0aW9uIEV0aGVybmV0CisgKiBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBkaXJlY3RseS4gIEluY2x1ZGUgdDR2Zl9jb21tb24uaCBpbnN0ZWFkLgorICovCisKKyNpZm5kZWYgX19DWEdCNFZGX0FEQVBURVJfSF9fCisjZGVmaW5lIF9fQ1hHQjRWRl9BREFQVEVSX0hfXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSAiLi4vY3hnYjQvdDRfaHcuaCIKKworLyoKKyAqIENvbnN0YW50cyBvZiB0aGUgaW1wbGVtZW50YXRpb24uCisgKi8KK2VudW0geworCU1BWF9OUE9SVFMJPSAxLAkJLyogbWF4ICMgb2YgInBvcnRzIiAqLworCU1BWF9QT1JUX1FTRVRTCT0gOCwJCS8qIG1heCAjIG9mIFF1ZXVlIFNldHMgLyAicG9ydCIgKi8KKwlNQVhfRVRIX1FTRVRTCT0gTUFYX05QT1JUUypNQVhfUE9SVF9RU0VUUywKKworCS8qCisJICogTVNJLVggaW50ZXJydXB0IGluZGV4IHVzYWdlLgorCSAqLworCU1TSVhfRlcJCT0gMCwJCS8qIE1TSS1YIGluZGV4IGZvciBmaXJtd2FyZSBRICovCisJTVNJWF9OSVFGTElOVAk9IDEsCQkvKiBNU0ktWCBpbmRleCBiYXNlIGZvciBJbmdyZXNzIFFzICovCisJTVNJWF9FWFRSQVMJPSAxLAorCU1TSVhfRU5UUklFUwk9IE1BWF9FVEhfUVNFVFMgKyBNU0lYX0VYVFJBUywKKworCS8qCisJICogVGhlIG1heGltdW0gbnVtYmVyIG9mIEluZ3Jlc3MgYW5kIEVncmVzcyBRdWV1ZXMgaXMgZGV0ZXJtaW5lZCBieQorCSAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiAiUXVldWUgU2V0cyIgd2hpY2ggd2Ugc3VwcG9ydCBwbHVzIGFueQorCSAqIGFuY2lsbGFyeSBxdWV1ZXMuICBFYWNoICJRdWV1ZSBTZXQiIHJlcXVpcmVzIG9uZSBJbmdyZXNzIFF1ZXVlCisJICogZm9yIFJYIFBhY2tldCBJbmdyZXNzIEV2ZW50IG5vdGlmaWNhdGlvbnMgYW5kIHR3byBFZ3Jlc3MgUXVldWVzIGZvcgorCSAqIGEgRnJlZSBMaXN0IGFuZCBhbiBFdGhlcm5ldCBUWCBsaXN0LgorCSAqLworCUlOR1FfRVhUUkFTCT0gMiwJCS8qIGZpcm13YXJlIGV2ZW50IHF1ZXVlIGFuZCAqLworCQkJCQkvKiAgIGZvcndhcmRlZCBpbnRlcnJ1cHRzICovCisJTUFYX0lOR1EJPSBNQVhfRVRIX1FTRVRTK0lOR1FfRVhUUkFTLAorCU1BWF9FR1JRCT0gTUFYX0VUSF9RU0VUUyoyLAorfTsKKworLyoKKyAqIEZvcndhcmQgc3RydWN0dXJlIGRlZmluaXRpb24gcmVmZXJlbmNlcy4KKyAqLworc3RydWN0IGFkYXB0ZXI7CitzdHJ1Y3Qgc2dlX2V0aF9yeHE7CitzdHJ1Y3Qgc2dlX3JzcHE7CisKKy8qCisgKiBQZXItInBvcnQiIGluZm9ybWF0aW9uLiAgVGhpcyBpcyByZWFsbHkgcGVyLVZpcnR1YWwgSW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBidXQgdGhlIHVzZSBvZiB0aGUgInBvcnQiIG5vbWFuY2xhdHVyZSBtYWtlcyBpdCBlYXNpZXIgdG8gZ28gYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4gdGhlIFBGIGFuZCBWRiBkcml2ZXJzIC4uLgorICovCitzdHJ1Y3QgcG9ydF9pbmZvIHsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsJLyogb3VyIGFkYXB0ZXIgKi8KKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CS8qIG91dCBWTEFOIGdyb3VwICovCisJdTE2IHZpaWQ7CQkJLyogdmlydHVhbCBpbnRlcmZhY2UgSUQgKi8KKwlzMTYgeGFjdF9hZGRyX2ZpbHQ7CQkvKiBpbmRleCBvZiBvdXIgTUFDIGFkZHJlc3MgZmlsdGVyICovCisJdTE2IHJzc19zaXplOwkJCS8qIHNpemUgb2YgVkkncyBSU1MgdGFibGUgc2xpY2UgKi8KKwl1OCBwaWR4OwkJCS8qIGluZGV4IGludG8gYWRhcHRlciBwb3J0W10gKi8KKwl1OCBwb3J0X2lkOwkJCS8qIHBoeXNpY2FsIHBvcnQgSUQgKi8KKwl1OCByeF9vZmZsb2FkOwkJCS8qIENTTywgZXRjLiAqLworCXU4IG5xc2V0czsJCQkvKiAjIG9mICJRdWV1ZSBTZXRzIiAqLworCXU4IGZpcnN0X3FzZXQ7CQkJLyogaW5kZXggb2YgZmlyc3QgIlF1ZXVlIFNldCIgKi8KKwlzdHJ1Y3QgbGlua19jb25maWcgbGlua19jZmc7CS8qIHBoeXNpY2FsIHBvcnQgY29uZmlndXJhdGlvbiAqLworfTsKKworLyogcG9ydF9pbmZvLnJ4X29mZmxvYWQgZmxhZ3MgKi8KK2VudW0geworCVJYX0NTTyA9IDEgPDwgMCwKK307CisKKy8qCisgKiBTY2F0dGVyIEdhdGhlciBFbmdpbmUgcmVzb3VyY2VzIGZvciB0aGUgImFkYXB0ZXIiLiAgT3VyIGluZ3Jlc3MgYW5kIGVncmVzcworICogcXVldWVzIGFyZSBvcmdhbml6ZWQgaW50byAiUXVldWUgU2V0cyIgd2l0aCBvbmUgaW5ncmVzcyBhbmQgb25lIGVncmVzcworICogcXVldWUgcGVyIFF1ZXVlIFNldC4gIFRoZXNlIFF1ZXVlIFNldHMgYXJlIGFwb3J0aW9uYWJsZSBiZXR3ZWVuIHRoZSAicG9ydHMiCisgKiAoVmlydHVhbCBJbnRlcmZhY2VzKS4gIE9uZSBleHRyYSBpbmdyZXNzIHF1ZXVlIGlzIHVzZWQgdG8gcmVjZWl2ZQorICogYXN5bmNocm9ub3VzIG1lc3NhZ2VzIGZyb20gdGhlIGZpcm13YXJlLiAgTm90ZSB0aGF0IHRoZSAiUXVldWUgSURzIiB0aGF0IHdlCisgKiB1c2UgaGVyZSBhcmUgcmVhbGx5ICJSZWxhdGl2ZSBRdWV1ZSBJRHMiIHdoaWNoIGFyZSByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZQorICogZmlybXdhcmUgY29tbWFuZCB0byBhbGxvY2F0ZSBxdWV1ZXMuICBUaGVzZSBxdWV1ZSBJRHMgYXJlIHJlbGF0aXZlIHRvIHRoZQorICogYWJzb2x1dGUgUXVldWUgSUQgYmFzZSBvZiB0aGUgc2VjdGlvbiBvZiB0aGUgUXVldWUgSUQgc3BhY2UgYWxsb2NhdGVkIHRvCisgKiB0aGUgUEYvVkYuCisgKi8KKworLyoKKyAqIFNHRSBmcmVlLWxpc3QgcXVldWUgc3RhdGUuCisgKi8KK3N0cnVjdCByeF9zd19kZXNjOworc3RydWN0IHNnZV9mbCB7CisJdW5zaWduZWQgaW50IGF2YWlsOwkJLyogIyBvZiBhdmFpbGFibGUgUlggYnVmZmVycyAqLworCXVuc2lnbmVkIGludCBwZW5kX2NyZWQ7CQkvKiBuZXcgYnVmZmVycyBzaW5jZSBsYXN0IEZMIERCIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY2lkeDsJCS8qIGNvbnN1bWVyIGluZGV4ICovCisJdW5zaWduZWQgaW50IHBpZHg7CQkvKiBwcm9kdWNlciBpbmRleCAqLworCXVuc2lnbmVkIGxvbmcgYWxsb2NfZmFpbGVkOwkvKiAjIG9mIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVzICovCisJdW5zaWduZWQgbG9uZyBsYXJnZV9hbGxvY19mYWlsZWQ7CisJdW5zaWduZWQgbG9uZyBzdGFydmluZzsJCS8qICMgb2YgdGltZXMgRkwgd2FzIGZvdW5kIHN0YXJ2aW5nICovCisKKwkvKgorCSAqIFdyaXRlLW9uY2UvaW5mcmVxdWVudGx5IGZpZWxkcy4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisKKwl1bnNpZ25lZCBpbnQgY250eHRfaWQ7CQkvKiBTR0UgcmVsYXRpdmUgUUlEIGZvciB0aGUgZnJlZSBsaXN0ICovCisJdW5zaWduZWQgaW50IGFic19pZDsJCS8qIFNHRSBhYnNvbHV0ZSBRSUQgZm9yIHRoZSBmcmVlIGxpc3QgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJCS8qIGNhcGFjaXR5IG9mIGZyZWUgbGlzdCAqLworCXN0cnVjdCByeF9zd19kZXNjICpzZGVzYzsJLyogYWRkcmVzcyBvZiBTVyBSWCBkZXNjcmlwdG9yIHJpbmcgKi8KKwlfX2JlNjQgKmRlc2M7CQkJLyogYWRkcmVzcyBvZiBIVyBSWCBkZXNjcmlwdG9yIHJpbmcgKi8KKwlkbWFfYWRkcl90IGFkZHI7CQkvKiBQQ0kgYnVzIGFkZHJlc3Mgb2YgaGFyZHdhcmUgcmluZyAqLworfTsKKworLyoKKyAqIEFuIGluZ3Jlc3MgcGFja2V0IGdhdGhlciBsaXN0LgorICovCitzdHJ1Y3QgcGt0X2dsIHsKKwlza2JfZnJhZ190IGZyYWdzW01BWF9TS0JfRlJBR1NdOworCXZvaWQgKnZhOwkJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBmaXJzdCBieXRlICovCisJdW5zaWduZWQgaW50IG5mcmFnczsJCS8qICMgb2YgZnJhZ21lbnRzICovCisJdW5zaWduZWQgaW50IHRvdF9sZW47CQkvKiB0b3RhbCBsZW5ndGggb2YgZnJhZ21lbnRzICovCit9OworCit0eXBlZGVmIGludCAoKnJzcHFfaGFuZGxlcl90KShzdHJ1Y3Qgc2dlX3JzcHEgKiwgY29uc3QgX19iZTY0ICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGt0X2dsICopOworCisvKgorICogU3RhdGUgZm9yIGFuIFNHRSBSZXNwb25zZSBRdWV1ZS4KKyAqLworc3RydWN0IHNnZV9yc3BxIHsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsJLyogTkFQSSBzY2hlZHVsaW5nIGNvbnRyb2wgKi8KKwljb25zdCBfX2JlNjQgKmN1cl9kZXNjOwkJLyogY3VycmVudCBkZXNjcmlwdG9yIGluIHF1ZXVlICovCisJdW5zaWduZWQgaW50IGNpZHg7CQkvKiBjb25zdW1lciBpbmRleCAqLworCXU4IGdlbjsJCQkJLyogY3VycmVudCBnZW5lcmF0aW9uIGJpdCAqLworCXU4IG5leHRfaW50cl9wYXJhbXM7CQkvKiBob2xkb2ZmIHBhcmFtcyBmb3IgbmV4dCBpbnRlcnJ1cHQgKi8KKwlpbnQgb2Zmc2V0OwkJCS8qIG9mZnNldCBpbnRvIGN1cnJlbnQgRkwgYnVmZmVyICovCisKKwl1bnNpZ25lZCBpbnQgdW5oYW5kbGVkX2lycXM7CS8qIGJvZ3VzIGludGVycnVwdHMgKi8KKworCS8qCisJICogV3JpdGUtb25jZS9pbmZyZXF1ZW50bHkgZmllbGRzLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKi8KKworCXU4IGludHJfcGFyYW1zOwkJCS8qIGludGVycnVwdCBob2xkb2ZmIHBhcmFtZXRlcnMgKi8KKwl1OCBwa3RjbnRfaWR4OwkJCS8qIGludGVycnVwdCBwYWNrZXQgdGhyZXNob2xkICovCisJdTggaWR4OwkJCQkvKiBxdWV1ZSBpbmRleCB3aXRoaW4gaXRzIGdyb3VwICovCisJdTE2IGNudHh0X2lkOwkJCS8qIFNHRSByZWwgUUlEIGZvciB0aGUgcmVzcG9uc2UgUSAqLworCXUxNiBhYnNfaWQ7CQkJLyogU0dFIGFicyBRSUQgZm9yIHRoZSByZXNwb25zZSBRICovCisJX19iZTY0ICpkZXNjOwkJCS8qIGFkZHJlc3Mgb2YgaGFyZHdhcmUgcmVzcG9uc2UgcmluZyAqLworCWRtYV9hZGRyX3QgcGh5c19hZGRyOwkJLyogUENJIGJ1cyBhZGRyZXNzIG9mIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgaXFlX2xlbjsJCS8qIGVudHJ5IHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJCS8qIGNhcGNpdHkgb2YgcmVzcG9uc2UgUSAqLworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOwkvKiBvdXIgYWRhcHRlciAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIGFzc29jaWF0ZWQgbmV0IGRldmljZSAqLworCXJzcHFfaGFuZGxlcl90IGhhbmRsZXI7CQkvKiB0aGUgaGFuZGxlciBmb3IgdGhpcyByZXNwb25zZSBRICovCit9OworCisvKgorICogRXRoZXJuZXQgcXVldWUgc3RhdGlzdGljcworICovCitzdHJ1Y3Qgc2dlX2V0aF9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBwa3RzOwkJLyogIyBvZiBldGhlcm5ldCBwYWNrZXRzICovCisJdW5zaWduZWQgbG9uZyBscm9fcGt0czsJCS8qICMgb2YgTFJPIHN1cGVyIHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIGxyb19tZXJnZWQ7CS8qICMgb2Ygd2lyZSBwYWNrZXRzIG1lcmdlZCBieSBMUk8gKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2NzbzsJCS8qICMgb2YgUnggY2hlY2tzdW0gb2ZmbG9hZHMgKi8KKwl1bnNpZ25lZCBsb25nIHZsYW5fZXg7CQkvKiAjIG9mIFJ4IFZMQU4gZXh0cmFjdGlvbnMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BzOwkJLyogIyBvZiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIG5vIG1lbSAqLworfTsKKworLyoKKyAqIFN0YXRlIGZvciBhbiBFdGhlcm5ldCBSZWNlaXZlIFF1ZXVlLgorICovCitzdHJ1Y3Qgc2dlX2V0aF9yeHEgeworCXN0cnVjdCBzZ2VfcnNwcSByc3BxOwkJLyogUmVzcG9uc2UgUXVldWUgKi8KKwlzdHJ1Y3Qgc2dlX2ZsIGZsOwkJLyogRnJlZSBMaXN0ICovCisJc3RydWN0IHNnZV9ldGhfc3RhdHMgc3RhdHM7CS8qIHJlY2VpdmUgc3RhdGlzdGljcyAqLworfTsKKworLyoKKyAqIFNHRSBUcmFuc21pdCBRdWV1ZSBzdGF0ZS4gIFRoaXMgY29udGFpbnMgYWxsIG9mIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgaGFyZHdhcmUgc3RhdHVzIG9mIGEgVFggUXVldWUgd2hpY2ggaXMgYSBjaXJjdWxhciByaW5nIG9mIGhhcmR3YXJlCisgKiBUWCBEZXNjcmlwdG9ycy4gIEZvciBjb252ZW5pZW5jZSwgaXQgYWxzbyBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBwYXJhbGxlbAorICogIlNvZnR3YXJlIERlc2NyaXB0b3IiIGFycmF5IGJ1dCB3ZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IGl0IGhlcmUgb3RoZXIKKyAqIHRoYW4gaXRzIHR5cGUgbmFtZS4KKyAqLworc3RydWN0IHR4X2Rlc2MgeworCS8qCisJICogRWdyZXNzIFF1ZXVlcyBhcmUgbWVhc3VyZWQgaW4gdW5pdHMgb2YgU0dFX0VRX0lEWFNJWkUgYnkgdGhlCisJICogaGFyZHdhcmU6IFNpemVzLCBQcm9kdWNlciBhbmQgQ29uc3VtZXIgaW5kaWNlcywgZXRjLgorCSAqLworCV9fYmU2NCBmbGl0W1NHRV9FUV9JRFhTSVpFL3NpemVvZihfX2JlNjQpXTsKK307CitzdHJ1Y3QgdHhfc3dfZGVzYzsKK3N0cnVjdCBzZ2VfdHhxIHsKKwl1bnNpZ25lZCBpbnQgaW5fdXNlOwkJLyogIyBvZiBpbi11c2UgVFggZGVzY3JpcHRvcnMgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJCS8qICMgb2YgZGVzY3JpcHRvcnMgKi8KKwl1bnNpZ25lZCBpbnQgY2lkeDsJCS8qIFNXIGNvbnN1bWVyIGluZGV4ICovCisJdW5zaWduZWQgaW50IHBpZHg7CQkvKiBwcm9kdWNlciBpbmRleCAqLworCXVuc2lnbmVkIGxvbmcgc3RvcHM7CQkvKiAjIG9mIHRpbWVzIHF1ZXVlIGhhcyBiZWVuIHN0b3BwZWQgKi8KKwl1bnNpZ25lZCBsb25nIHJlc3RhcnRzOwkJLyogIyBvZiBxdWV1ZSByZXN0YXJ0cyAqLworCisJLyoKKwkgKiBXcml0ZS1vbmNlL2luZnJlcXVlbnRseSBmaWVsZHMuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqLworCisJdW5zaWduZWQgaW50IGNudHh0X2lkOwkJLyogU0dFIHJlbGF0aXZlIFFJRCBmb3IgdGhlIFRYIFEgKi8KKwl1bnNpZ25lZCBpbnQgYWJzX2lkOwkJLyogU0dFIGFic29sdXRlIFFJRCBmb3IgdGhlIFRYIFEgKi8KKwlzdHJ1Y3QgdHhfZGVzYyAqZGVzYzsJCS8qIGFkZHJlc3Mgb2YgSFcgVFggZGVzY3JpcHRvciByaW5nICovCisJc3RydWN0IHR4X3N3X2Rlc2MgKnNkZXNjOwkvKiBhZGRyZXNzIG9mIFNXIFRYIGRlc2NyaXB0b3IgcmluZyAqLworCXN0cnVjdCBzZ2VfcXN0YXQgKnN0YXQ7CQkvKiBxdWV1ZSBzdGF0dXMgZW50cnkgKi8KKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsJCS8qIFBDSSBidXMgYWRkcmVzcyBvZiBoYXJkd2FyZSByaW5nICovCit9OworCisvKgorICogU3RhdGUgZm9yIGFuIEV0aGVybmV0IFRyYW5zbWl0IFF1ZXVlLgorICovCitzdHJ1Y3Qgc2dlX2V0aF90eHEgeworCXN0cnVjdCBzZ2VfdHhxIHE7CQkvKiBTR0UgVFggUXVldWUgKi8KKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CS8qIGFzc29jaWF0ZWQgbmV0ZGV2IFRYIHF1ZXVlICovCisJdW5zaWduZWQgbG9uZyB0c287CQkvKiAjIG9mIFRTTyByZXF1ZXN0cyAqLworCXVuc2lnbmVkIGxvbmcgdHhfY3NvOwkJLyogIyBvZiBUWCBjaGVja3N1bSBvZmZsb2FkcyAqLworCXVuc2lnbmVkIGxvbmcgdmxhbl9pbnM7CQkvKiAjIG9mIFRYIFZMQU4gaW5zZXJ0aW9ucyAqLworCXVuc2lnbmVkIGxvbmcgbWFwcGluZ19lcnI7CS8qICMgb2YgSS9PIE1NVSBwYWNrZXQgbWFwcGluZyBlcnJvcnMgKi8KK307CisKKy8qCisgKiBUaGUgY29tcGxldGUgc2V0IG9mIFNjYXR0ZXIvR2F0aGVyIEVuZ2luZSByZXNvdXJjZXMuCisgKi8KK3N0cnVjdCBzZ2UgeworCS8qCisJICogT3VyICJRdWV1ZSBTZXRzIiAuLi4KKwkgKi8KKwlzdHJ1Y3Qgc2dlX2V0aF90eHEgZXRodHhxW01BWF9FVEhfUVNFVFNdOworCXN0cnVjdCBzZ2VfZXRoX3J4cSBldGhyeHFbTUFYX0VUSF9RU0VUU107CisKKwkvKgorCSAqIEV4dHJhIGluZ3Jlc3MgcXVldWVzIGZvciBhc3luY2hyb25vdXMgZmlybXdhcmUgZXZlbnRzIGFuZAorCSAqIGZvcndhcmRlZCBpbnRlcnJ1cHRzICh3aGVuIGluIE1TSSBtb2RlKS4KKwkgKi8KKwlzdHJ1Y3Qgc2dlX3JzcHEgZndfZXZ0cSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCisJc3RydWN0IHNnZV9yc3BxIGludHJxIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJc3BpbmxvY2tfdCBpbnRycV9sb2NrOworCisJLyoKKwkgKiBTdGF0ZSBmb3IgbWFuYWdpbmcgInN0YXJ2aW5nIEZyZWUgTGlzdHMiIC0tIEZyZWUgTGlzdHMgd2hpY2ggaGF2ZQorCSAqIGZhbGxlbiBiZWxvdyBhIGNlcnRhaW4gdGhyZXNob2xkIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHRoZQorCSAqIGhhcmR3YXJlIGFuZCBhdHRlbXB0cyB0byByZWZpbGwgdGhlbSB1cCB0byB0aGF0IHRocmVzaG9sZCBoYXZlCisJICogZmFpbGVkLiAgV2UgaGF2ZSBhIHJlZ3VsYXIgInNsb3cgdGljayIgdGltZXIgcHJvY2VzcyB3aGljaCB3aWxsCisJICogbWFrZSBwZXJpb2RpYyBhdHRlbXB0cyB0byByZWZpbGwgdGhlc2Ugc3RhcnZpbmcgRnJlZSBMaXN0cyAuLi4KKwkgKi8KKwlERUNMQVJFX0JJVE1BUChzdGFydmluZ19mbCwgTUFYX0VHUlEpOworCXN0cnVjdCB0aW1lcl9saXN0IHJ4X3RpbWVyOworCisJLyoKKwkgKiBTdGF0ZSBmb3IgY2xlYW5pbmcgdXAgY29tcGxldGVkIFRYIGRlc2NyaXB0b3JzLgorCSAqLworCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVyOworCisJLyoKKwkgKiBXcml0ZS1vbmNlL2luZnJlcXVlbnRseSBmaWVsZHMuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqLworCisJdTE2IG1heF9ldGhxc2V0czsJCS8qICMgb2YgYXZhaWxhYmxlIEV0aGVybmV0IHF1ZXVlIHNldHMgKi8KKwl1MTYgZXRocXNldHM7CQkJLyogIyBvZiBhY3RpdmUgRXRoZXJuZXQgcXVldWUgc2V0cyAqLworCXUxNiBldGh0eHFfcm92ZXI7CQkvKiBUeCBxdWV1ZSB0byBjbGVhbiB1cCBuZXh0ICovCisJdTE2IHRpbWVyX3ZhbFtTR0VfTlRJTUVSU107CS8qIGludGVycnVwdCBob2xkb2ZmIHRpbWVyIGFycmF5ICovCisJdTggY291bnRlcl92YWxbU0dFX05DT1VOVEVSU107CS8qIGludGVycnVwdCBSWCB0aHJlc2hvbGQgYXJyYXkgKi8KKworCS8qCisJICogUmV2ZXJzZSBtYXBzIGZyb20gQWJzb2x1dGUgUXVldWUgSURzIHRvIGFzc29jaWF0ZWQgcXVldWUgcG9pbnRlcnMuCisJICogVGhlIGFic29sdXRlIFF1ZXVlIElEcyBhcmUgaW4gYSBjb21wYWN0IHJhbmdlIHdoaWNoIHN0YXJ0IGF0IGEKKwkgKiBbcG90ZW50aWFsbHkgbGFyZ2VdIEJhc2UgUXVldWUgSUQuICBXZSBwZXJmb3JtIHRoZSByZXZlcnNlIG1hcCBieQorCSAqIGZpcnN0IGNvbnZlcnRpbmcgdGhlIEFic29sdXRlIFF1ZXVlIElEIGludG8gYSBSZWxhdGl2ZSBRdWV1ZSBJRCBieQorCSAqIHN1YnRyYWN0aW5nIG9mZiB0aGUgQmFzZSBRdWV1ZSBJRCBhbmQgdGhlbiB1c2UgYSBSZWxhdGl2ZSBRdWV1ZSBJRAorCSAqIGluZGV4ZWQgdGFibGUgdG8gZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNvZnR3YXJlCisJICogcXVldWUgc3RydWN0dXJlLgorCSAqLworCXVuc2lnbmVkIGludCBlZ3JfYmFzZTsKKwl1bnNpZ25lZCBpbnQgaW5ncl9iYXNlOworCXZvaWQgKmVncl9tYXBbTUFYX0VHUlFdOworCXN0cnVjdCBzZ2VfcnNwcSAqaW5ncl9tYXBbTUFYX0lOR1FdOworfTsKKworLyoKKyAqIFV0aWxpdHkgbWFjcm9zIHRvIGNvbnZlcnQgQWJzb2x1dGUtIHRvIFJlbGF0aXZlLVF1ZXVlIGluZGljZXMgYW5kIEVncmVzcy0KKyAqIGFuZCBJbmdyZXNzLVF1ZXVlcy4gIFRoZSBFUV9NQVAoKSBhbmQgSVFfTUFQKCkgbWFjcm9zIHdoaWNoIHByb3ZpZGUKKyAqIHBvaW50ZXJzIHRvIEluZ3Jlc3MtIGFuZCBFZ3Jlc3MtUXVldWVzIGNhbiBiZSB1c2VkIGFzIGJvdGggTC0gYW5kIFItdmFsdWVzCisgKi8KKyNkZWZpbmUgRVFfSURYKHMsIGFic19pZCkgKCh1bnNpZ25lZCBpbnQpKChhYnNfaWQpIC0gKHMpLT5lZ3JfYmFzZSkpCisjZGVmaW5lIElRX0lEWChzLCBhYnNfaWQpICgodW5zaWduZWQgaW50KSgoYWJzX2lkKSAtIChzKS0+aW5ncl9iYXNlKSkKKworI2RlZmluZSBFUV9NQVAocywgYWJzX2lkKSAoKHMpLT5lZ3JfbWFwW0VRX0lEWChzLCBhYnNfaWQpXSkKKyNkZWZpbmUgSVFfTUFQKHMsIGFic19pZCkgKChzKS0+aW5ncl9tYXBbSVFfSURYKHMsIGFic19pZCldKQorCisvKgorICogTWFjcm8gdG8gaXRlcmF0ZSBhY3Jvc3MgUXVldWUgU2V0cyAoInJ4cSIgaXMgYSBoaXN0b3JpYyBtaXNub21lcikuCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfZXRocnhxKHNnZSwgaXRlcikgXAorCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAoc2dlKS0+ZXRocXNldHM7IGl0ZXIrKykKKworLyoKKyAqIFBlci0iYWRhcHRlciIgKFZpcnR1YWwgRnVuY3Rpb24pIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgYWRhcHRlciB7CisJLyogUENJIHJlc291cmNlcyAqLworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpwZGV2X2RldjsKKworCS8qICJhZGFwdGVyIiByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyZWRfZGV2aWNlX21hcDsKKwl1bnNpZ25lZCBsb25nIG9wZW5fZGV2aWNlX21hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhZGFwdGVyX3BhcmFtcyBwYXJhbXM7CisKKwkvKiBxdWV1ZSBhbmQgaW50ZXJydXB0IHJlc291cmNlcyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IHZlYzsKKwkJY2hhciBkZXNjWzIyXTsKKwl9IG1zaXhfaW5mb1tNU0lYX0VOVFJJRVNdOworCXN0cnVjdCBzZ2Ugc2dlOworCisJLyogTGludXggbmV0d29yayBkZXZpY2UgcmVzb3VyY2VzICovCisJc3RydWN0IG5ldF9kZXZpY2UgKnBvcnRbTUFYX05QT1JUU107CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbXNnX2VuYWJsZTsKKworCS8qIGRlYnVnZnMgcmVzb3VyY2VzICovCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yb290OworCisJLyogdmFyaW91cyBsb2NrcyAqLworCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKK307CisKK2VudW0geyAvKiBhZGFwdGVyIGZsYWdzICovCisJRlVMTF9JTklUX0RPTkUgICAgID0gKDFVTCA8PCAwKSwKKwlVU0lOR19NU0kgICAgICAgICAgPSAoMVVMIDw8IDEpLAorCVVTSU5HX01TSVggICAgICAgICA9ICgxVUwgPDwgMiksCisJUVVFVUVTX0JPVU5EICAgICAgID0gKDFVTCA8PCAzKSwKK307CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHJlYWQvd3JpdGUgcm91dGluZSBkZWZpbml0aW9ucyBhcmUgcmVxdWlyZWQgYnkKKyAqIHRoZSBjb21tb24gY29kZS4KKyAqLworCisvKioKKyAqIHQ0X3JlYWRfcmVnIC0gcmVhZCBhIEhXIHJlZ2lzdGVyCisgKiBAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqIEByZWdfYWRkcjogdGhlIHJlZ2lzdGVyIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIHRoZSAzMi1iaXQgdmFsdWUgb2YgdGhlIGdpdmVuIEhXIHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHUzMiB0NF9yZWFkX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIHJlZ19hZGRyKQoreworCXJldHVybiByZWFkbChhZGFwdGVyLT5yZWdzICsgcmVnX2FkZHIpOworfQorCisvKioKKyAqIHQ0X3dyaXRlX3JlZyAtIHdyaXRlIGEgSFcgcmVnaXN0ZXIKKyAqIEBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICogQHJlZ19hZGRyOiB0aGUgcmVnaXN0ZXIgYWRkcmVzcworICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKgorICogV3JpdGUgYSAzMi1iaXQgdmFsdWUgaW50byB0aGUgZ2l2ZW4gSFcgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0NF93cml0ZV9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWdfYWRkciwgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBhZGFwdGVyLT5yZWdzICsgcmVnX2FkZHIpOworfQorCisjaWZuZGVmIHJlYWRxCitzdGF0aWMgaW5saW5lIHU2NCByZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIpICsgKCh1NjQpcmVhZGwoYWRkciArIDQpIDw8IDMyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcSh1NjQgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKHZhbCwgYWRkcik7CisJd3JpdGVsKHZhbCA+PiAzMiwgYWRkciArIDQpOworfQorI2VuZGlmCisKKy8qKgorICogdDRfcmVhZF9yZWc2NCAtIHJlYWQgYSA2NC1iaXQgSFcgcmVnaXN0ZXIKKyAqIEBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICogQHJlZ19hZGRyOiB0aGUgcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIFJldHVybnMgdGhlIDY0LWJpdCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gSFcgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IHQ0X3JlYWRfcmVnNjQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWdfYWRkcikKK3sKKwlyZXR1cm4gcmVhZHEoYWRhcHRlci0+cmVncyArIHJlZ19hZGRyKTsKK30KKworLyoqCisgKiB0NF93cml0ZV9yZWc2NCAtIHdyaXRlIGEgNjQtYml0IEhXIHJlZ2lzdGVyCisgKiBAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqIEByZWdfYWRkcjogdGhlIHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEB2YWw6IHRoZSB2YWx1ZSB0byB3cml0ZQorICoKKyAqIFdyaXRlIGEgNjQtYml0IHZhbHVlIGludG8gdGhlIGdpdmVuIEhXIHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdDRfd3JpdGVfcmVnNjQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWdfYWRkciwKKwkJCQkgIHU2NCB2YWwpCit7CisJd3JpdGVxKHZhbCwgYWRhcHRlci0+cmVncyArIHJlZ19hZGRyKTsKK30KKworLyoqCisgKiBwb3J0X25hbWUgLSByZXR1cm4gdGhlIHN0cmluZyBuYW1lIG9mIGEgcG9ydAorICogQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKiBAcGlkeDogdGhlIHBvcnQgaW5kZXgKKyAqCisgKiBSZXR1cm4gdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBzZWxlY3RlZCBwb3J0LgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnBvcnRfbmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBpZHgpCit7CisJcmV0dXJuIGFkYXB0ZXItPnBvcnRbcGlkeF0tPm5hbWU7Cit9CisKKy8qKgorICogdDRfb3Nfc2V0X2h3X2FkZHIgLSBzdG9yZSBhIHBvcnQncyBNQUMgYWRkcmVzcyBpbiBTVworICogQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKiBAcGlkeDogdGhlIHBvcnQgaW5kZXgKKyAqIEBod19hZGRyOiB0aGUgRXRoZXJuZXQgYWRkcmVzcworICoKKyAqIFN0b3JlIHRoZSBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBnaXZlbiBwb3J0IGluIFNXLiAgQ2FsbGVkIGJ5IHRoZSBjb21tb24KKyAqIGNvZGUgd2hlbiBpdCByZXRyaWV2ZXMgYSBwb3J0J3MgRXRoZXJuZXQgYWRkcmVzcyBmcm9tIEVFUFJPTS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHQ0X29zX3NldF9od19hZGRyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGlkeCwKKwkJCQkgICAgIHU4IGh3X2FkZHJbXSkKK3sKKwltZW1jcHkoYWRhcHRlci0+cG9ydFtwaWR4XS0+ZGV2X2FkZHIsIGh3X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYWRhcHRlci0+cG9ydFtwaWR4XS0+cGVybV9hZGRyLCBod19hZGRyLCBFVEhfQUxFTik7Cit9CisKKy8qKgorICogbmV0ZGV2MnBpbmZvIC0gcmV0dXJuIHRoZSBwb3J0X2luZm8gc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldF9kZXZpY2UKKyAqIEBkZXY6IHRoZSBuZXRkZXYKKyAqCisgKiBSZXR1cm4gdGhlIHN0cnVjdCBwb3J0X2luZm8gYXNzb2NpYXRlZCB3aXRoIGEgbmV0X2RldmljZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0X2luZm8gKm5ldGRldjJwaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworfQorCisvKioKKyAqIGFkYXAycGluZm8gLSByZXR1cm4gdGhlIHBvcnRfaW5mbyBvZiBhIHBvcnQKKyAqIEBhZGFwOiB0aGUgYWRhcHRlcgorICogQHBpZHg6IHRoZSBwb3J0IGluZGV4CisgKgorICogUmV0dXJuIHRoZSBwb3J0X2luZm8gc3RydWN0dXJlIGZvciB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9ydF9pbmZvICphZGFwMnBpbmZvKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGlkeCkKK3sKKwlyZXR1cm4gbmV0ZGV2X3ByaXYoYWRhcHRlci0+cG9ydFtwaWR4XSk7Cit9CisKKy8qKgorICogbmV0ZGV2MmFkYXAgLSByZXR1cm4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldF9kZXZpY2UKKyAqIEBkZXY6IHRoZSBuZXRkZXYKKyAqCisgKiBSZXR1cm4gdGhlIHN0cnVjdCBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCBhIG5ldF9kZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWRhcHRlciAqbmV0ZGV2MmFkYXAoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbmV0ZGV2MnBpbmZvKGRldiktPmFkYXB0ZXI7Cit9CisKKy8qCisgKiBPUyAiQ2FsbGJhY2siIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gIFRoZXNlIGFyZSBmdW5jdGlvbnMgdGhhdCB0aGUgT1MgY29kZQorICogaXMgImNvbnRyYWN0ZWQiIHRvIHByb3ZpZGUgZm9yIHRoZSBjb21tb24gY29kZS4KKyAqLwordm9pZCB0NHZmX29zX2xpbmtfY2hhbmdlZChzdHJ1Y3QgYWRhcHRlciAqLCBpbnQsIGludCk7CisKKy8qCisgKiBTR0UgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9ucy4KKyAqLworaW50IHQ0dmZfc2dlX2FsbG9jX3J4cShzdHJ1Y3QgYWRhcHRlciAqLCBzdHJ1Y3Qgc2dlX3JzcHEgKiwgYm9vbCwKKwkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwKKwkJICAgICAgIHN0cnVjdCBzZ2VfZmwgKiwgcnNwcV9oYW5kbGVyX3QpOworaW50IHQ0dmZfc2dlX2FsbG9jX2V0aF90eHEoc3RydWN0IGFkYXB0ZXIgKiwgc3RydWN0IHNnZV9ldGhfdHhxICosCisJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICosCisJCQkgICB1bnNpZ25lZCBpbnQpOwordm9pZCB0NHZmX2ZyZWVfc2dlX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKKworaW50IHQ0dmZfZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgdDR2Zl9ldGhyeF9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqLCBjb25zdCBfX2JlNjQgKiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBwa3RfZ2wgKik7CisKK2lycV9oYW5kbGVyX3QgdDR2Zl9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKik7CitpcnFyZXR1cm5fdCB0NHZmX3NnZV9pbnRyX21zaXgoaW50LCB2b2lkICopOworCitpbnQgdDR2Zl9zZ2VfaW5pdChzdHJ1Y3QgYWRhcHRlciAqKTsKK3ZvaWQgdDR2Zl9zZ2Vfc3RhcnQoc3RydWN0IGFkYXB0ZXIgKik7Cit2b2lkIHQ0dmZfc2dlX3N0b3Aoc3RydWN0IGFkYXB0ZXIgKik7CisKKyNlbmRpZiAvKiBfX0NYR0I0VkZfQURBUFRFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjU2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCkBAIC0wLDAgKzEsMjg4OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IFBDSS1FIFNSLUlPViBWaXJ0dWFsIEZ1bmN0aW9uIEV0aGVybmV0CisgKiBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpbmNsdWRlICJ0NHZmX2NvbW1vbi5oIgorI2luY2x1ZGUgInQ0dmZfZGVmcy5oIgorCisjaW5jbHVkZSAiLi4vY3hnYjQvdDRfcmVncy5oIgorI2luY2x1ZGUgIi4uL2N4Z2I0L3Q0X21zZy5oIgorCisvKgorICogR2VuZXJpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyLgorICovCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjAuMCIKKyNkZWZpbmUgRFJWX0RFU0MgIkNoZWxzaW8gVDQgVmlydHVhbCBGdW5jdGlvbiAoVkYpIE5ldHdvcmsgRHJpdmVyIgorCisvKgorICogTW9kdWxlIFBhcmFtZXRlcnMuCisgKiA9PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogRGVmYXVsdCBldGh0b29sICJtZXNzYWdlIGxldmVsIiBmb3IgYWRhcHRlcnMuCisgKi8KKyNkZWZpbmUgREZMVF9NU0dfRU5BQkxFIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksgfCBcCisJCQkgTkVUSUZfTVNHX1RJTUVSIHwgTkVUSUZfTVNHX0lGRE9XTiB8IE5FVElGX01TR19JRlVQIHxcCisJCQkgTkVUSUZfTVNHX1JYX0VSUiB8IE5FVElGX01TR19UWF9FUlIpCisKK3N0YXRpYyBpbnQgZGZsdF9tc2dfZW5hYmxlID0gREZMVF9NU0dfRU5BQkxFOworCittb2R1bGVfcGFyYW0oZGZsdF9tc2dfZW5hYmxlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZmx0X21zZ19lbmFibGUsCisJCSAiZGVmYXVsdCBhZGFwdGVyIGV0aHRvb2wgbWVzc2FnZSBsZXZlbCBiaXRtYXAiKTsKKworLyoKKyAqIFRoZSBkcml2ZXIgdXNlcyB0aGUgYmVzdCBpbnRlcnJ1cHQgc2NoZW1lIGF2YWlsYWJsZSBvbiBhIHBsYXRmb3JtIGluIHRoZQorICogb3JkZXIgTVNJLVggdGhlbiBNU0kuICBUaGlzIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoaWNoIG9mIHRoZXNlIHNjaGVtZXMgdGhlCisgKiBkcml2ZXIgbWF5IGNvbnNpZGVyIGFzIGZvbGxvd3M6CisgKgorICogICAgIG1zaSA9IDI6IGNob29zZSBmcm9tIGFtb25nIE1TSS1YIGFuZCBNU0kKKyAqICAgICBtc2kgPSAxOiBvbmx5IGNvbnNpZGVyIE1TSSBpbnRlcnJ1cHRzCisgKgorICogTm90ZSB0aGF0IHVubGlrZSB0aGUgUGh5c2ljYWwgRnVuY3Rpb24gZHJpdmVyLCB0aGlzIFZpcnR1YWwgRnVuY3Rpb24gZHJpdmVyCisgKiBkb2VzIF9ub3RfIHN1cHBvcnQgbGVnYWN5IElOVHggaW50ZXJydXB0cyAodGhpcyBsaW1pdGF0aW9uIGlzIG1hbmRhdGVkIGJ5CisgKiB0aGUgUENJLUUgU1ItSU9WIHN0YW5kYXJkKS4KKyAqLworI2RlZmluZSBNU0lfTVNJWAkyCisjZGVmaW5lIE1TSV9NU0kJCTEKKyNkZWZpbmUgTVNJX0RFRkFVTFQJTVNJX01TSVgKKworc3RhdGljIGludCBtc2kgPSBNU0lfREVGQVVMVDsKKworbW9kdWxlX3BhcmFtKG1zaSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobXNpLCAid2hldGhlciB0byB1c2UgTVNJLVggb3IgTVNJIik7CisKKy8qCisgKiBGdW5kYW1lbnRhbCBjb25zdGFudHMuCisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworZW51bSB7CisJTUFYX1RYUV9FTlRSSUVTCQk9IDE2Mzg0LAorCU1BWF9SU1BRX0VOVFJJRVMJPSAxNjM4NCwKKwlNQVhfUlhfQlVGRkVSUwkJPSAxNjM4NCwKKworCU1JTl9UWFFfRU5UUklFUwkJPSAzMiwKKwlNSU5fUlNQUV9FTlRSSUVTCT0gMTI4LAorCU1JTl9GTF9FTlRSSUVTCQk9IDE2LAorCisJLyoKKwkgKiBGb3IgcHVycG9zZXMgb2YgbWFuaXB1bGF0aW5nIHRoZSBGcmVlIExpc3Qgc2l6ZSB3ZSBuZWVkIHRvCisJICogcmVjb2duaXplIHRoYXQgRnJlZSBMaXN0cyBhcmUgYWN0dWFsbHkgRWdyZXNzIFF1ZXVlcyAodGhlIGhvc3QKKwkgKiBwcm9kdWNlcyBmcmVlIGJ1ZmZlcnMgd2hpY2ggdGhlIGhhcmR3YXJlIGNvbnN1bWVzKSwgRWdyZXNzIFF1ZXVlcworCSAqIGluZGljZXMgYXJlIGFsbCBpbiB1bml0cyBvZiBFZ3Jlc3MgQ29udGV4dCBVbml0cyBieXRlcywgYW5kIGZyZWUKKwkgKiBsaXN0IGVudHJpZXMgYXJlIDY0LWJpdCBQQ0kgRE1BIGFkZHJlc3Nlcy4gIEFuZCBzaW5jZSB0aGUgc3RhdGUgb2YKKwkgKiB0aGUgUHJvZHVjZXIgSW5kZXggPT0gdGhlIENvbnN1bWVyIEluZGV4IGltcGxpZXMgYW4gRU1QVFkgbGlzdCwgd2UKKwkgKiBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgRWdyZXNzIFVuaXQncyB3b3J0aCBvZiBGcmVlIExpc3QgZW50cmllcworCSAqIHVudXNlZC4gIFNlZSBzZ2UuYyBmb3IgbW9yZSBkZXRhaWxzIC4uLgorCSAqLworCUVRX1VOSVQgPSBTR0VfRVFfSURYU0laRSwKKwlGTF9QRVJfRVFfVU5JVCA9IEVRX1VOSVQgLyBzaXplb2YoX19iZTY0KSwKKwlNSU5fRkxfUkVTSUQgPSBGTF9QRVJfRVFfVU5JVCwKK307CisKKy8qCisgKiBHbG9iYWwgZHJpdmVyIHN0YXRlLgorICogPT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY3hnYjR2Zl9kZWJ1Z2ZzX3Jvb3Q7CisKKy8qCisgKiBPUyAiQ2FsbGJhY2siIGZ1bmN0aW9ucy4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBUaGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgb24gdGhlIGluZGljYXRlZCAicG9ydCIgKFZpcnR1YWwgSW50ZXJmYWNlKS4KKyAqLwordm9pZCB0NHZmX29zX2xpbmtfY2hhbmdlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBpZHgsIGludCBsaW5rX29rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5wb3J0W3BpZHhdOworCisJLyoKKwkgKiBJZiB0aGUgcG9ydCBpcyBkaXNhYmxlZCBvciB0aGUgY3VycmVudCByZWNvcmRlZCAibGluayB1cCIKKwkgKiBzdGF0dXMgbWF0Y2hlcyB0aGUgbmV3IHN0YXR1cywganVzdCByZXR1cm4uCisJICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgfHwgbGlua19vayA9PSBuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCXJldHVybjsKKworCS8qCisJICogVGVsbCB0aGUgT1MgdGhhdCB0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgYW5kIHByaW50IGEgc2hvcnQKKwkgKiBpbmZvcm1hdGl2ZSBtZXNzYWdlIG9uIHRoZSBjb25zb2xlIGFib3V0IHRoZSBldmVudC4KKwkgKi8KKwlpZiAobGlua19vaykgeworCQljb25zdCBjaGFyICpzOworCQljb25zdCBjaGFyICpmYzsKKwkJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKworCQlzd2l0Y2ggKHBpLT5saW5rX2NmZy5zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwMDAwOgorCQkJcyA9ICIxMEdicHMiOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJcyA9ICIxMDAwTWJwcyI7CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDoKKwkJCXMgPSAiMTAwTWJwcyI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcyA9ICJ1bmtub3duIjsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChwaS0+bGlua19jZmcuZmMpIHsKKwkJY2FzZSBQQVVTRV9SWDoKKwkJCWZjID0gIlJYIjsKKwkJCWJyZWFrOworCisJCWNhc2UgUEFVU0VfVFg6CisJCQlmYyA9ICJUWCI7CisJCQlicmVhazsKKworCQljYXNlIFBBVVNFX1JYfFBBVVNFX1RYOgorCQkJZmMgPSAiUlgvVFgiOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWZjID0gIm5vIjsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVzLCBmdWxsLWR1cGxleCwgJXMgUEFVU0VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHMsIGZjKTsKKwl9IGVsc2UgeworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCX0KK30KKworLyoKKyAqIE5ldCBkZXZpY2Ugb3BlcmF0aW9ucy4KKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogUmVjb3JkIG91ciBuZXcgVkxBTiBHcm91cCBhbmQgZW5hYmxlL2Rpc2FibGUgaGFyZHdhcmUgVkxBTiBUYWcgZXh0cmFjdGlvbgorICogYmFzZWQgb24gd2hldGhlciB0aGUgc3BlY2lmaWVkIFZMQU4gR3JvdXAgcG9pbnRlciBpcyBOVUxMIG9yIG5vdC4KKyAqLworc3RhdGljIHZvaWQgY3hnYjR2Zl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXBpLT52bGFuX2dycCA9IGdycDsKKwl0NHZmX3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIHBpLT52aWlkLCAtMSwgLTEsIC0xLCAtMSwgZ3JwICE9IE5VTEwsIDApOworfQorCisvKgorICogUGVyZm9ybSB0aGUgTUFDIGFuZCBQSFkgYWN0aW9ucyBuZWVkZWQgdG8gZW5hYmxlIGEgInBvcnQiIChWaXJ0dWFsCisgKiBJbnRlcmZhY2UpLgorICovCitzdGF0aWMgaW50IGxpbmtfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICogV2UgZG8gbm90IHNldCBhZGRyZXNzIGZpbHRlcnMgYW5kIHByb21pc2N1aXR5IGhlcmUsIHRoZSBzdGFjayBkb2VzCisJICogdGhhdCBzdGVwIGV4cGxpY2l0bHkuCisJICovCisJcmV0ID0gdDR2Zl9zZXRfcnhtb2RlKHBpLT5hZGFwdGVyLCBwaS0+dmlpZCwgZGV2LT5tdHUsIC0xLCAtMSwgLTEsIC0xLAorCQkJICAgICAgdHJ1ZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IHQ0dmZfY2hhbmdlX21hYyhwaS0+YWRhcHRlciwgcGktPnZpaWQsCisJCQkJICAgICAgcGktPnhhY3RfYWRkcl9maWx0LCBkZXYtPmRldl9hZGRyLCB0cnVlKTsKKwkJaWYgKHJldCA+PSAwKSB7CisJCQlwaS0+eGFjdF9hZGRyX2ZpbHQgPSByZXQ7CisJCQlyZXQgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIHRvIGFjdHVhbGx5ICJzdGFydCB0aGUgbGluayIgaXRzZWxmIHNpbmNlIHRoZQorCSAqIGZpcm13YXJlIHdpbGwgZG8gdGhhdCBmb3IgdXMgd2hlbiB0aGUgZmlyc3QgVmlydHVhbCBJbnRlcmZhY2UKKwkgKiBpcyBlbmFibGVkIG9uIGEgcG9ydC4KKwkgKi8KKwlpZiAocmV0ID09IDApCisJCXJldCA9IHQ0dmZfZW5hYmxlX3ZpKHBpLT5hZGFwdGVyLCBwaS0+dmlpZCwgdHJ1ZSwgdHJ1ZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE5hbWUgdGhlIE1TSS1YIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIG5hbWVfbXNpeF92ZWNzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWludCBuYW1lbGVuID0gc2l6ZW9mKGFkYXB0ZXItPm1zaXhfaW5mb1swXS5kZXNjKSAtIDE7CisJaW50IHBpZHg7CisKKwkvKgorCSAqIEZpcm13YXJlIGV2ZW50cy4KKwkgKi8KKwlzbnByaW50ZihhZGFwdGVyLT5tc2l4X2luZm9bTVNJWF9GV10uZGVzYywgbmFtZWxlbiwKKwkJICIlcy1GV2V2ZW50cSIsIGFkYXB0ZXItPm5hbWUpOworCWFkYXB0ZXItPm1zaXhfaW5mb1tNU0lYX0ZXXS5kZXNjW25hbWVsZW5dID0gMDsKKworCS8qCisJICogRXRoZXJuZXQgcXVldWVzLgorCSAqLworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcGlkeCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcHRlci0+cG9ydFtwaWR4XTsKKwkJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpbnQgcXMsIG1zaTsKKworCQlmb3IgKHFzID0gMCwgbXNpID0gTVNJWF9OSVFGTElOVDsKKwkJICAgICBxcyA8IHBpLT5ucXNldHM7CisJCSAgICAgcXMrKywgbXNpKyspIHsKKwkJCXNucHJpbnRmKGFkYXB0ZXItPm1zaXhfaW5mb1ttc2ldLmRlc2MsIG5hbWVsZW4sCisJCQkJICIlcy0lZCIsIGRldi0+bmFtZSwgcXMpOworCQkJYWRhcHRlci0+bXNpeF9pbmZvW21zaV0uZGVzY1tuYW1lbGVuXSA9IDA7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZXF1ZXN0IGFsbCBvZiBvdXIgTVNJLVggcmVzb3VyY2VzLgorICovCitzdGF0aWMgaW50IHJlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcHRlci0+c2dlOworCWludCByeHEsIG1zaSwgZXJyOworCisJLyoKKwkgKiBGaXJtd2FyZSBldmVudHMuCisJICovCisJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9pbmZvW01TSVhfRlddLnZlYywgdDR2Zl9zZ2VfaW50cl9tc2l4LAorCQkJICAwLCBhZGFwdGVyLT5tc2l4X2luZm9bTVNJWF9GV10uZGVzYywgJnMtPmZ3X2V2dHEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIEV0aGVybmV0IHF1ZXVlcy4KKwkgKi8KKwltc2kgPSBNU0lYX05JUUZMSU5UOworCWZvcl9lYWNoX2V0aHJ4cShzLCByeHEpIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9pbmZvW21zaV0udmVjLAorCQkJCSAgdDR2Zl9zZ2VfaW50cl9tc2l4LCAwLAorCQkJCSAgYWRhcHRlci0+bXNpeF9pbmZvW21zaV0uZGVzYywKKwkJCQkgICZzLT5ldGhyeHFbcnhxXS5yc3BxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2ZyZWVfaXJxczsKKwkJbXNpKys7CisJfQorCXJldHVybiAwOworCitlcnJfZnJlZV9pcnFzOgorCXdoaWxlICgtLXJ4cSA+PSAwKQorCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2luZm9bLS1tc2ldLnZlYywgJnMtPmV0aHJ4cVtyeHFdLnJzcHEpOworCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfaW5mb1tNU0lYX0ZXXS52ZWMsICZzLT5md19ldnRxKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnJlZSBvdXIgTVNJLVggcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBmcmVlX21zaXhfcXVldWVfaXJxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKwlpbnQgcnhxLCBtc2k7CisKKwlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2luZm9bTVNJWF9GV10udmVjLCAmcy0+ZndfZXZ0cSk7CisJbXNpID0gTVNJWF9OSVFGTElOVDsKKwlmb3JfZWFjaF9ldGhyeHEocywgcnhxKQorCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2luZm9bbXNpKytdLnZlYywKKwkJCSAmcy0+ZXRocnhxW3J4cV0ucnNwcSk7Cit9CisKKy8qCisgKiBUdXJuIG9uIE5BUEkgYW5kIHN0YXJ0IHVwIGludGVycnVwdHMgb24gYSByZXNwb25zZSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgcWVuYWJsZShzdHJ1Y3Qgc2dlX3JzcHEgKnJzcHEpCit7CisJbmFwaV9lbmFibGUoJnJzcHEtPm5hcGkpOworCisJLyoKKwkgKiAwLWluY3JlbWVudCB0aGUgR29pbmcgVG8gU2xlZXAgcmVnaXN0ZXIgdG8gc3RhcnQgdGhlIHRpbWVyIGFuZAorCSAqIGVuYWJsZSBpbnRlcnJ1cHRzLgorCSAqLworCXQ0X3dyaXRlX3JlZyhyc3BxLT5hZGFwdGVyLCBUNFZGX1NHRV9CQVNFX0FERFIgKyBTR0VfVkZfR1RTLAorCQkgICAgIENJRFhJTkMoMCkgfAorCQkgICAgIFNFSU5UQVJNKHJzcHEtPmludHJfcGFyYW1zKSB8CisJCSAgICAgSU5HUkVTU1FJRChyc3BxLT5jbnR4dF9pZCkpOworfQorCisvKgorICogRW5hYmxlIE5BUEkgc2NoZWR1bGluZyBhbmQgaW50ZXJydXB0IGdlbmVyYXRpb24gZm9yIGFsbCBSZWNlaXZlIFF1ZXVlcy4KKyAqLworc3RhdGljIHZvaWQgZW5hYmxlX3J4KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWludCByeHE7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwdGVyLT5zZ2U7CisKKwlmb3JfZWFjaF9ldGhyeHEocywgcnhxKQorCQlxZW5hYmxlKCZzLT5ldGhyeHFbcnhxXS5yc3BxKTsKKwlxZW5hYmxlKCZzLT5md19ldnRxKTsKKworCS8qCisJICogVGhlIGludGVycnVwdCBxdWV1ZSBkb2Vzbid0IHVzZSBOQVBJIHNvIHdlIGRvIHRoZSAwLWluY3JlbWVudCBvZgorCSAqIGl0cyBHb2luZyBUbyBTbGVlcCByZWdpc3RlciBoZXJlIHRvIGdldCBpdCBzdGFydGVkLgorCSAqLworCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSSkKKwkJdDRfd3JpdGVfcmVnKGFkYXB0ZXIsIFQ0VkZfU0dFX0JBU0VfQUREUiArIFNHRV9WRl9HVFMsCisJCQkgICAgIENJRFhJTkMoMCkgfAorCQkJICAgICBTRUlOVEFSTShzLT5pbnRycS5pbnRyX3BhcmFtcykgfAorCQkJICAgICBJTkdSRVNTUUlEKHMtPmludHJxLmNudHh0X2lkKSk7CisKK30KKworLyoKKyAqIFdhaXQgdW50aWwgYWxsIE5BUEkgaGFuZGxlcnMgYXJlIGRlc2NoZWR1bGVkLgorICovCitzdGF0aWMgdm9pZCBxdWllc2NlX3J4KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcHRlci0+c2dlOworCWludCByeHE7CisKKwlmb3JfZWFjaF9ldGhyeHEocywgcnhxKQorCQluYXBpX2Rpc2FibGUoJnMtPmV0aHJ4cVtyeHFdLnJzcHEubmFwaSk7CisJbmFwaV9kaXNhYmxlKCZzLT5md19ldnRxLm5hcGkpOworfQorCisvKgorICogUmVzcG9uc2UgcXVldWUgaGFuZGxlciBmb3IgdGhlIGZpcm13YXJlIGV2ZW50IHF1ZXVlLgorICovCitzdGF0aWMgaW50IGZ3ZXZ0cV9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcnNwcSwgY29uc3QgX19iZTY0ICpyc3AsCisJCQkgIGNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsKQoreworCS8qCisJICogRXh0cmFjdCByZXNwb25zZSBvcGNvZGUgYW5kIGdldCBwb2ludGVyIHRvIENQTCBtZXNzYWdlIGJvZHkuCisJICovCisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSByc3BxLT5hZGFwdGVyOworCXU4IG9wY29kZSA9ICgoY29uc3Qgc3RydWN0IHJzc19oZWFkZXIgKilyc3ApLT5vcGNvZGU7CisJdm9pZCAqY3BsID0gKHZvaWQgKikocnNwICsgMSk7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQ1BMX0ZXNl9NU0c6IHsKKwkJLyoKKwkJICogV2UndmUgcmVjZWl2ZWQgYW4gYXN5bmNocm9ub3VzIG1lc3NhZ2UgZnJvbSB0aGUgZmlybXdhcmUuCisJCSAqLworCQljb25zdCBzdHJ1Y3QgY3BsX2Z3Nl9tc2cgKmZ3X21zZyA9IGNwbDsKKwkJaWYgKGZ3X21zZy0+dHlwZSA9PSBGVzZfVFlQRV9DTURfUlBMKQorCQkJdDR2Zl9oYW5kbGVfZndfcnBsKGFkYXB0ZXIsIGZ3X21zZy0+ZGF0YSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgQ1BMX1NHRV9FR1JfVVBEQVRFOiB7CisJCS8qCisJCSAqIFdlJ3ZlIHJlY2VpdmVkIGFuIEVncmVzcyBRdWV1ZSBTdGF0dXMgVXBkYXRlIG1lc3NhZ2UuICBXZQorCQkgKiBnZXQgdGhlc2UsIGlmIHRoZSBTR0UgaXMgY29uZmlndXJlZCB0byBzZW5kIHRoZXNlIHdoZW4gdGhlCisJCSAqIGZpcm13YXJlIHBhc3NlcyBjZXJ0YWluIHBvaW50cyBpbiBwcm9jZXNzaW5nIG91ciBUWAorCQkgKiBFdGhlcm5ldCBRdWV1ZSBvciBpZiB3ZSBtYWtlIGFuIGV4cGxpY2l0IHJlcXVlc3QgZm9yIG9uZS4KKwkJICogV2UgdXNlIHRoZXNlIHVwZGF0ZXMgdG8gZGV0ZXJtaW5lIHdoZW4gd2UgbWF5IG5lZWQgdG8KKwkJICogcmVzdGFydCBhIFRYIEV0aGVybmV0IFF1ZXVlIHdoaWNoIHdhcyBzdG9wcGVkIGZvciBsYWNrIG9mCisJCSAqIGZyZWUgVFggUXVldWUgRGVzY3JpcHRvcnMgLi4uCisJCSAqLworCQljb25zdCBzdHJ1Y3QgY3BsX3NnZV9lZ3JfdXBkYXRlICpwID0gKHZvaWQgKiljcGw7CisJCXVuc2lnbmVkIGludCBxaWQgPSBFR1JfUUlEKGJlMzJfdG9fY3B1KHAtPm9wY29kZV9xaWQpKTsKKwkJc3RydWN0IHNnZSAqcyA9ICZhZGFwdGVyLT5zZ2U7CisJCXN0cnVjdCBzZ2VfdHhxICp0cTsKKwkJc3RydWN0IHNnZV9ldGhfdHhxICp0eHE7CisJCXVuc2lnbmVkIGludCBlcV9pZHg7CisKKwkJLyoKKwkJICogUGVyZm9ybSBzYW5pdHkgY2hlY2tpbmcgb24gdGhlIFF1ZXVlIElEIHRvIG1ha2Ugc3VyZSBpdAorCQkgKiByZWFsbHkgcmVmZXJzIHRvIG9uZSBvZiBvdXIgVFggRXRoZXJuZXQgRWdyZXNzIFF1ZXVlcyB3aGljaAorCQkgKiBpcyBhY3RpdmUgYW5kIG1hdGNoZXMgdGhlIHF1ZXVlJ3MgSUQuICBOb25lIG9mIHRoZXNlIGVycm9yCisJCSAqIGNvbmRpdGlvbnMgc2hvdWxkIGV2ZXIgaGFwcGVuIHNvIHdlIG1heSB3YW50IHRvIGVpdGhlciBtYWtlCisJCSAqIHRoZW0gZmF0YWwgYW5kL29yIGNvbmRpdGlvbmFsaXplZCB1bmRlciBERUJVRy4KKwkJICovCisJCWVxX2lkeCA9IEVRX0lEWChzLCBxaWQpOworCQlpZiAodW5saWtlbHkoZXFfaWR4ID49IE1BWF9FR1JRKSkgeworCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkiRWdyZXNzIFVwZGF0ZSBRSUQgJWQgb3V0IG9mIHJhbmdlXG4iLCBxaWQpOworCQkJYnJlYWs7CisJCX0KKwkJdHEgPSBzLT5lZ3JfbWFwW2VxX2lkeF07CisJCWlmICh1bmxpa2VseSh0cSA9PSBOVUxMKSkgeworCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkiRWdyZXNzIFVwZGF0ZSBRSUQgJWQgVFhRPU5VTExcbiIsIHFpZCk7CisJCQlicmVhazsKKwkJfQorCQl0eHEgPSBjb250YWluZXJfb2YodHEsIHN0cnVjdCBzZ2VfZXRoX3R4cSwgcSk7CisJCWlmICh1bmxpa2VseSh0cS0+YWJzX2lkICE9IHFpZCkpIHsKKwkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkJIkVncmVzcyBVcGRhdGUgUUlEICVkIHJlZmVycyB0byBUWFEgJWRcbiIsCisJCQkJcWlkLCB0cS0+YWJzX2lkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogUmVzdGFydCBhIHN0b3BwZWQgVFggUXVldWUgd2hpY2ggaGFzIGxlc3MgdGhhbiBoYWxmIG9mIGl0cworCQkgKiBUWCByaW5nIGluIHVzZSAuLi4KKwkJICovCisJCXR4cS0+cS5yZXN0YXJ0cysrOworCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4cS0+dHhxKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCSJ1bmV4cGVjdGVkIENQTCAlI3ggb24gRlcgZXZlbnQgcXVldWVcbiIsIG9wY29kZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBTR0UgVFgvUlggcmVzcG9uc2UgcXVldWVzLiAgRGV0ZXJtaW5lIGhvdyBtYW55IHNldHMgb2YgU0dFIHF1ZXVlcworICogdG8gdXNlIGFuZCBpbml0aWFsaXplcyB0aGVtLiAgV2Ugc3VwcG9ydCBtdWx0aXBsZSAiUXVldWUgU2V0cyIgcGVyIHBvcnQgaWYKKyAqIHdlIGhhdmUgTVNJLVgsIG90aGVyd2lzZSBqdXN0IG9uZSBxdWV1ZSBzZXQgcGVyIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfc2dlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKwlpbnQgZXJyLCBwaWR4LCBtc2l4OworCisJLyoKKwkgKiBDbGVhciAiUXVldWUgU2V0IiBGcmVlIExpc3QgU3RhcnZpbmcgYW5kIFRYIFF1ZXVlIE1hcHBpbmcgRXJyb3IKKwkgKiBzdGF0ZS4KKwkgKi8KKwliaXRtYXBfemVybyhzLT5zdGFydmluZ19mbCwgTUFYX0VHUlEpOworCisJLyoKKwkgKiBJZiB3ZSdyZSB1c2luZyBNU0kgaW50ZXJydXB0IG1vZGUgd2UgbmVlZCB0byBzZXQgdXAgYSAiZm9yd2FyZGVkCisJICogaW50ZXJydXB0IiBxdWV1ZSB3aGljaCB3ZSdsbCBzZXQgdXAgd2l0aCBvdXIgTVNJIHZlY3Rvci4gIFRoZSByZXN0CisJICogb2YgdGhlIGluZ3Jlc3MgcXVldWVzIHdpbGwgYmUgc2V0IHVwIHRvIGZvcndhcmQgdGhlaXIgaW50ZXJydXB0cyB0bworCSAqIHRoaXMgcXVldWUgLi4uICBUaGlzIG11c3QgYmUgZmlyc3Qgc2luY2UgdDR2Zl9zZ2VfYWxsb2NfcnhxKCkgdXNlcworCSAqIHRoZSBpbnRycSdzIHF1ZXVlIElEIGFzIHRoZSBpbnRlcnJ1cHQgZm9yd2FyZGluZyBxdWV1ZSBmb3IgdGhlCisJICogc3Vic2VxdWVudCBjYWxscyAuLi4KKwkgKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0kpIHsKKwkJZXJyID0gdDR2Zl9zZ2VfYWxsb2NfcnhxKGFkYXB0ZXIsICZzLT5pbnRycSwgZmFsc2UsCisJCQkJCSBhZGFwdGVyLT5wb3J0WzBdLCAwLCBOVUxMLCBOVUxMKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2ZyZWVfcXVldWVzOworCX0KKworCS8qCisJICogQWxsb2NhdGUgb3VyIGluZ3Jlc3MgcXVldWUgZm9yIGFzeW5jaHJvbm91cyBmaXJtd2FyZSBtZXNzYWdlcy4KKwkgKi8KKwllcnIgPSB0NHZmX3NnZV9hbGxvY19yeHEoYWRhcHRlciwgJnMtPmZ3X2V2dHEsIHRydWUsIGFkYXB0ZXItPnBvcnRbMF0sCisJCQkJIE1TSVhfRlcsIE5VTEwsIGZ3ZXZ0cV9oYW5kbGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKworCS8qCisJICogQWxsb2NhdGUgZWFjaCAicG9ydCIncyBpbml0aWFsIFF1ZXVlIFNldHMuICBUaGVzZSBjYW4gYmUgY2hhbmdlZAorCSAqIGxhdGVyIG9uIC4uLiB1cCB0byB0aGUgcG9pbnQgd2hlcmUgYW55IGludGVyZmFjZSBvbiB0aGUgYWRhcHRlciBpcworCSAqIGJyb3VnaHQgdXAgYXQgd2hpY2ggcG9pbnQgbG90cyBvZiB0aGluZ3MgZ2V0IG5haWxlZCBkb3duCisJICogcGVybWFuZW50bHkgLi4uCisJICovCisJbXNpeCA9IE1TSVhfTklRRkxJTlQ7CisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBwaWR4KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5wb3J0W3BpZHhdOworCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJCXN0cnVjdCBzZ2VfZXRoX3J4cSAqcnhxID0gJnMtPmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF07CisJCXN0cnVjdCBzZ2VfZXRoX3R4cSAqdHhxID0gJnMtPmV0aHR4cVtwaS0+Zmlyc3RfcXNldF07CisJCWludCBxczsKKworCQlmb3IgKHFzID0gMDsgcXMgPCBwaS0+bnFzZXRzOyBxcysrLCByeHErKywgdHhxKyspIHsKKwkJCWVyciA9IHQ0dmZfc2dlX2FsbG9jX3J4cShhZGFwdGVyLCAmcnhxLT5yc3BxLCBmYWxzZSwKKwkJCQkJCSBkZXYsIG1zaXgrKywKKwkJCQkJCSAmcnhxLT5mbCwgdDR2Zl9ldGhyeF9oYW5kbGVyKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJfZnJlZV9xdWV1ZXM7CisKKwkJCWVyciA9IHQ0dmZfc2dlX2FsbG9jX2V0aF90eHEoYWRhcHRlciwgdHhxLCBkZXYsCisJCQkJCSAgICAgbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHFzKSwKKwkJCQkJICAgICBzLT5md19ldnRxLmNudHh0X2lkKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJfZnJlZV9xdWV1ZXM7CisKKwkJCXJ4cS0+cnNwcS5pZHggPSBxczsKKwkJCW1lbXNldCgmcnhxLT5zdGF0cywgMCwgc2l6ZW9mKHJ4cS0+c3RhdHMpKTsKKwkJfQorCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSByZXZlcnNlIG1hcHBpbmdzIGZvciB0aGUgcXVldWVzLgorCSAqLworCXMtPmVncl9iYXNlID0gcy0+ZXRodHhxWzBdLnEuYWJzX2lkIC0gcy0+ZXRodHhxWzBdLnEuY250eHRfaWQ7CisJcy0+aW5ncl9iYXNlID0gcy0+ZXRocnhxWzBdLnJzcHEuYWJzX2lkIC0gcy0+ZXRocnhxWzBdLnJzcHEuY250eHRfaWQ7CisJSVFfTUFQKHMsIHMtPmZ3X2V2dHEuYWJzX2lkKSA9ICZzLT5md19ldnRxOworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcGlkeCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcHRlci0+cG9ydFtwaWR4XTsKKwkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCQlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9ICZzLT5ldGhyeHFbcGktPmZpcnN0X3FzZXRdOworCQlzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cSA9ICZzLT5ldGh0eHFbcGktPmZpcnN0X3FzZXRdOworCQlpbnQgcXM7CisKKwkJZm9yIChxcyA9IDA7IHFzIDwgcGktPm5xc2V0czsgcXMrKywgcnhxKyssIHR4cSsrKSB7CisJCQlJUV9NQVAocywgcnhxLT5yc3BxLmFic19pZCkgPSAmcnhxLT5yc3BxOworCQkJRVFfTUFQKHMsIHR4cS0+cS5hYnNfaWQpID0gJnR4cS0+cTsKKworCQkJLyoKKwkJCSAqIFRoZSBGV19JUV9DTUQgZG9lc24ndCByZXR1cm4gdGhlIEFic29sdXRlIFF1ZXVlIElEcworCQkJICogZm9yIEZyZWUgTGlzdHMgYnV0IHNpbmNlIGFsbCBvZiB0aGUgRWdyZXNzIFF1ZXVlcworCQkJICogKGluY2x1ZGluZyBGcmVlIExpc3RzKSBoYXZlIFJlbGF0aXZlIFF1ZXVlIElEcworCQkJICogd2hpY2ggYXJlIGNvbXB1dGVkIGFzIEFic29sdXRlIC0gQmFzZSBRdWV1ZSBJRCwgd2UKKwkJCSAqIGNhbiBzeW50aGVzaXplIHRoZSBBYnNvbHV0ZSBRdWV1ZSBJRHMgZm9yIHRoZSBGcmVlCisJCQkgKiBMaXN0cy4gIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgd2hlbgorCQkJICogd2Ugd2FudCB0byBkdW1wIFF1ZXVlIENvbnRleHRzIHZpYSB0aGUgUEYgRHJpdmVyLgorCQkJICovCisJCQlyeHEtPmZsLmFic19pZCA9IHJ4cS0+ZmwuY250eHRfaWQgKyBzLT5lZ3JfYmFzZTsKKwkJCUVRX01BUChzLCByeHEtPmZsLmFic19pZCkgPSAmcnhxLT5mbDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfcXVldWVzOgorCXQ0dmZfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBTZXQgdXAgUmVjZWl2ZSBTaWRlIFNjYWxpbmcgKFJTUykgdG8gZGlzdHJpYnV0ZSBwYWNrZXRzIHRvIG11bHRpcGxlIHJlY2VpdmUKKyAqIHF1ZXVlcy4gIFdlIGNvbmZpZ3VyZSB0aGUgUlNTIENQVSBsb29rdXAgdGFibGUgdG8gZGlzdHJpYnV0ZSB0byB0aGUgbnVtYmVyCisgKiBvZiBIVyByZWNlaXZlIHF1ZXVlcywgYW5kIHRoZSByZXNwb25zZSBxdWV1ZSBsb29rdXAgdGFibGUgdG8gbmFycm93IHRoYXQKKyAqIGRvd24gdG8gdGhlIHJlc3BvbnNlIHF1ZXVlcyBhY3R1YWxseSBjb25maWd1cmVkIGZvciBlYWNoICJwb3J0IiAoVmlydHVhbAorICogSW50ZXJmYWNlKS4gIFdlIGFsd2F5cyBjb25maWd1cmUgdGhlIFJTUyBtYXBwaW5nIGZvciBhbGwgcG9ydHMgc2luY2UgdGhlCisgKiBtYXBwaW5nIHRhYmxlIGhhcyBwbGVudHkgb2YgZW50cmllcy4KKyAqLworc3RhdGljIGludCBzZXR1cF9yc3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHBpZHg7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIHBpZHgpIHsKKwkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIHBpZHgpOworCQlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9ICZhZGFwdGVyLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0XTsKKwkJdTE2IHJzc1tNQVhfUE9SVF9RU0VUU107CisJCWludCBxcywgZXJyOworCisJCWZvciAocXMgPSAwOyBxcyA8IHBpLT5ucXNldHM7IHFzKyspCisJCQlyc3NbcXNdID0gcnhxW3FzXS5yc3BxLmFic19pZDsKKworCQllcnIgPSB0NHZmX2NvbmZpZ19yc3NfcmFuZ2UoYWRhcHRlciwgcGktPnZpaWQsCisJCQkJCSAgICAwLCBwaS0+cnNzX3NpemUsIHJzcywgcGktPm5xc2V0cyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCS8qCisJCSAqIFBlcmZvcm0gR2xvYmFsIFJTUyBNb2RlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKwkJc3dpdGNoIChhZGFwdGVyLT5wYXJhbXMucnNzLm1vZGUpIHsKKwkJY2FzZSBGV19SU1NfR0xCX0NPTkZJR19DTURfTU9ERV9CQVNJQ1ZJUlRVQUw6CisJCQkvKgorCQkJICogSWYgVHVubmVsIEFsbCBMb29rdXAgaXNuJ3Qgc3BlY2lmaWVkIGluIHRoZSBnbG9iYWwKKwkJCSAqIFJTUyBDb25maWd1cmF0aW9uLCB0aGVuIHdlIG5lZWQgdG8gc3BlY2lmeSBhCisJCQkgKiBkZWZhdWx0IEluZ3Jlc3MgUXVldWUgZm9yIGFueSBpbmdyZXNzIHBhY2tldHMgd2hpY2gKKwkJCSAqIGFyZW4ndCBoYXNoZWQuICBXZSdsbCB1c2Ugb3VyIGZpcnN0IGluZ3Jlc3MgcXVldWUKKwkJCSAqIC4uLgorCQkJICovCisJCQlpZiAoIWFkYXB0ZXItPnBhcmFtcy5yc3MudS5iYXNpY3ZpcnR1YWwudG5sYWxsbG9va3VwKSB7CisJCQkJdW5pb24gcnNzX3ZpX2NvbmZpZyBjb25maWc7CisJCQkJZXJyID0gdDR2Zl9yZWFkX3Jzc192aV9jb25maWcoYWRhcHRlciwKKwkJCQkJCQkgICAgICBwaS0+dmlpZCwKKwkJCQkJCQkgICAgICAmY29uZmlnKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWNvbmZpZy5iYXNpY3ZpcnR1YWwuZGVmYXVsdHEgPQorCQkJCQlyeHFbMF0ucnNwcS5hYnNfaWQ7CisJCQkJZXJyID0gdDR2Zl93cml0ZV9yc3NfdmlfY29uZmlnKGFkYXB0ZXIsCisJCQkJCQkJICAgICAgIHBpLT52aWlkLAorCQkJCQkJCSAgICAgICAmY29uZmlnKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJyaW5nIHRoZSBhZGFwdGVyIHVwLiAgQ2FsbGVkIHdoZW5ldmVyIHdlIGdvIGZyb20gbm8gInBvcnRzIiBvcGVuIHRvIGhhdmluZworICogb25lIG9wZW4uICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBhY3Rpb25zIG5lY2Vzc2FyeSB0byBtYWtlIGFuIGFkYXB0ZXIKKyAqIG9wZXJhdGlvbmFsLCBzdWNoIGFzIGNvbXBsZXRpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIEhXIG1vZHVsZXMsIGFuZAorICogZW5hYmxpbmcgaW50ZXJydXB0cy4gIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJ0bmwgbG9jayBoZWxkLiAgKE5vdGUgdGhhdAorICogdGhpcyBpcyBjYWxsZWQgImN4Z2JfdXAiIGluIHRoZSBQRiBEcml2ZXIuKQorICovCitzdGF0aWMgaW50IGFkYXB0ZXJfdXAoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGVycjsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBiZWVuIGNhbGxlZCwgcGVyZm9ybSBiYXNpYworCSAqIGFkYXB0ZXIgc2V0dXAuICBPbmNlIHdlJ3ZlIGRvbmUgdGhpcywgbWFueSBvZiBvdXIgYWRhcHRlcgorCSAqIHBhcmFtZXRlcnMgY2FuIG5vIGxvbmdlciBiZSBjaGFuZ2VkIC4uLgorCSAqLworCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkgPT0gMCkgeworCQllcnIgPSBzZXR1cF9zZ2VfcXVldWVzKGFkYXB0ZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gc2V0dXBfcnNzKGFkYXB0ZXIpOworCQlpZiAoZXJyKSB7CisJCQl0NHZmX2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJbmFtZV9tc2l4X3ZlY3MoYWRhcHRlcik7CisJCWFkYXB0ZXItPmZsYWdzIHw9IEZVTExfSU5JVF9ET05FOworCX0KKworCS8qCisJICogQWNxdWlyZSBvdXIgaW50ZXJydXB0IHJlc291cmNlcy4gIFdlIG9ubHkgc3VwcG9ydCBNU0ktWCBhbmQgTVNJLgorCSAqLworCUJVR19PTigoYWRhcHRlci0+ZmxhZ3MgJiAoVVNJTkdfTVNJWHxVU0lOR19NU0kpKSA9PSAwKTsKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQllcnIgPSByZXF1ZXN0X21zaXhfcXVldWVfaXJxcyhhZGFwdGVyKTsKKwllbHNlCisJCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwKKwkJCQkgIHQ0dmZfaW50cl9oYW5kbGVyKGFkYXB0ZXIpLCAwLAorCQkJCSAgYWRhcHRlci0+bmFtZSwgYWRhcHRlcik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkLCBlcnIgJWRcbiIsCisJCQllcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogRW5hYmxlIE5BUEkgaW5ncmVzcyBwcm9jZXNzaW5nIGFuZCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwllbmFibGVfcngoYWRhcHRlcik7CisJdDR2Zl9zZ2Vfc3RhcnQoYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCcmluZyB0aGUgYWRhcHRlciBkb3duLiAgQ2FsbGVkIHdoZW5ldmVyIHRoZSBsYXN0ICJwb3J0IiAoVmlydHVhbAorICogSW50ZXJmYWNlKSBjbG9zZWQuICAoTm90ZSB0aGF0IHRoaXMgcm91dGluZSBpcyBjYWxsZWQgImN4Z2JfZG93biIgaW4gdGhlIFBGCisgKiBEcml2ZXIuKQorICovCitzdGF0aWMgdm9pZCBhZGFwdGVyX2Rvd24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyoKKwkgKiBGcmVlIGludGVycnVwdCByZXNvdXJjZXMuCisJICovCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJZnJlZV9tc2l4X3F1ZXVlX2lycXMoYWRhcHRlcik7CisJZWxzZQorCQlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGFkYXB0ZXIpOworCisJLyoKKwkgKiBXYWl0IGZvciBOQVBJIGhhbmRsZXJzIHRvIGZpbmlzaC4KKwkgKi8KKwlxdWllc2NlX3J4KGFkYXB0ZXIpOworfQorCisvKgorICogU3RhcnQgdXAgYSBuZXQgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGN4Z2I0dmZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGludGVyZmFjZSB0aGF0IHdlJ3JlIG9wZW5pbmcgb24gdGhlICJhZGFwdGVyIiwKKwkgKiBicmluZyB0aGUgImFkYXB0ZXIiIHVwIG5vdy4KKwkgKi8KKwlpZiAoYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwID09IDApIHsKKwkJZXJyID0gYWRhcHRlcl91cChhZGFwdGVyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBOb3RlIHRoYXQgdGhpcyBpbnRlcmZhY2UgaXMgdXAgYW5kIHN0YXJ0IGV2ZXJ5dGhpbmcgdXAgLi4uCisJICovCisJZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSBwaS0+bnFzZXRzOworCXNldF9iaXQocGktPnBvcnRfaWQsICZhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApOworCWxpbmtfc3RhcnQoZGV2KTsKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaHV0IGRvd24gYSBuZXQgZGV2aWNlLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCAiY3hnYl9jbG9zZSIgaW4gdGhlIFBGCisgKiBEcml2ZXIgLi4uCisgKi8KK3N0YXRpYyBpbnQgY3hnYjR2Zl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKKworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJcmV0ID0gdDR2Zl9lbmFibGVfdmkoYWRhcHRlciwgcGktPnZpaWQsIGZhbHNlLCBmYWxzZSk7CisJcGktPmxpbmtfY2ZnLmxpbmtfb2sgPSAwOworCisJY2xlYXJfYml0KHBpLT5wb3J0X2lkLCAmYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwKTsKKwlpZiAoYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwID09IDApCisJCWFkYXB0ZXJfZG93bihhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSBvdXIgYmFzaWMgc3RhdGlzdGljcyBpbnRvIHRoZSBzdGFuZGFyZCAiaWZjb25maWciIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY3hnYjR2Zl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdDR2Zl9wb3J0X3N0YXRzIHN0YXRzOworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnMgPSAmZGV2LT5zdGF0czsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKKwllcnIgPSB0NHZmX2dldF9wb3J0X3N0YXRzKGFkYXB0ZXIsIHBpLT5waWR4LCAmc3RhdHMpOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKKworCW1lbXNldChucywgMCwgc2l6ZW9mKCpucykpOworCWlmIChlcnIpCisJCXJldHVybiBuczsKKworCW5zLT50eF9ieXRlcyA9IChzdGF0cy50eF9iY2FzdF9ieXRlcyArIHN0YXRzLnR4X21jYXN0X2J5dGVzICsKKwkJCXN0YXRzLnR4X3VjYXN0X2J5dGVzICsgc3RhdHMudHhfb2ZmbG9hZF9ieXRlcyk7CisJbnMtPnR4X3BhY2tldHMgPSAoc3RhdHMudHhfYmNhc3RfZnJhbWVzICsgc3RhdHMudHhfbWNhc3RfZnJhbWVzICsKKwkJCSAgc3RhdHMudHhfdWNhc3RfZnJhbWVzICsgc3RhdHMudHhfb2ZmbG9hZF9mcmFtZXMpOworCW5zLT5yeF9ieXRlcyA9IChzdGF0cy5yeF9iY2FzdF9ieXRlcyArIHN0YXRzLnJ4X21jYXN0X2J5dGVzICsKKwkJCXN0YXRzLnJ4X3VjYXN0X2J5dGVzKTsKKwlucy0+cnhfcGFja2V0cyA9IChzdGF0cy5yeF9iY2FzdF9mcmFtZXMgKyBzdGF0cy5yeF9tY2FzdF9mcmFtZXMgKworCQkJICBzdGF0cy5yeF91Y2FzdF9mcmFtZXMpOworCW5zLT5tdWx0aWNhc3QgPSBzdGF0cy5yeF9tY2FzdF9mcmFtZXM7CisJbnMtPnR4X2Vycm9ycyA9IHN0YXRzLnR4X2Ryb3BfZnJhbWVzOworCW5zLT5yeF9lcnJvcnMgPSBzdGF0cy5yeF9lcnJfZnJhbWVzOworCisJcmV0dXJuIG5zOworfQorCisvKgorICogQ29sbGVjdCB1cCB0byBtYXhhZGRycyB3b3J0aCBvZiBhIG5ldGRldmljZSdzIHVuaWNhc3QgYWRkcmVzc2VzIGludG8gYW4KKyAqIGFycmF5IG9mIGFkZHJzcyBwb2ludGVycyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgY29sbGVjdGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb2xsZWN0X25ldGRldl91Y19saXN0X2FkZHJzKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBjb25zdCB1OCAqKmFkZHIsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF4YWRkcnMpCit7CisJdW5zaWduZWQgaW50IG5hZGRyID0gMDsKKwljb25zdCBzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCisJZm9yX2VhY2hfZGV2X2FkZHIoZGV2LCBoYSkgeworCQlhZGRyW25hZGRyKytdID0gaGEtPmFkZHI7CisJCWlmIChuYWRkciA+PSBtYXhhZGRycykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbmFkZHI7Cit9CisKKy8qCisgKiBDb2xsZWN0IHVwIHRvIG1heGFkZHJzIHdvcnRoIG9mIGEgbmV0ZGV2aWNlJ3MgbXVsdGljYXN0IGFkZHJlc3NlcyBpbnRvIGFuCisgKiBhcnJheSBvZiBhZGRyc3MgcG9pbnRlcnMgYW5kIHJldHVybiB0aGUgbnVtYmVyIGNvbGxlY3RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY29sbGVjdF9uZXRkZXZfbWNfbGlzdF9hZGRycyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgY29uc3QgdTggKiphZGRyLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1heGFkZHJzKQoreworCXVuc2lnbmVkIGludCBuYWRkciA9IDA7CisJY29uc3Qgc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKworCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKKwkJYWRkcltuYWRkcisrXSA9IGhhLT5hZGRyOworCQlpZiAobmFkZHIgPj0gbWF4YWRkcnMpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG5hZGRyOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBleGFjdCBhbmQgaGFzaCBhZGRyZXNzIGZpbHRlcnMgdG8gaGFuZGxlIGEgcG9ydCdzIG11bHRpY2FzdAorICogYW5kIHNlY29uZGFyeSB1bmljYXN0IE1BQyBhZGRyZXNzZXMuCisgKi8KK3N0YXRpYyBpbnQgc2V0X2FkZHJfZmlsdGVycyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIHNsZWVwKQoreworCXU2NCBtaGFzaCA9IDA7CisJdTY0IHVoYXNoID0gMDsKKwlib29sIGZyZWUgPSB0cnVlOworCXUxNiBmaWx0X2lkeFs3XTsKKwljb25zdCB1OCAqYWRkcls3XTsKKwlpbnQgcmV0LCBuYWRkciA9IDA7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogZmlyc3QgZG8gdGhlIHNlY29uZGFyeSB1bmljYXN0IGFkZHJlc3NlcyAqLworCW5hZGRyID0gY29sbGVjdF9uZXRkZXZfdWNfbGlzdF9hZGRycyhkZXYsIGFkZHIsIEFSUkFZX1NJWkUoYWRkcikpOworCWlmIChuYWRkciA+IDApIHsKKwkJcmV0ID0gdDR2Zl9hbGxvY19tYWNfZmlsdChwaS0+YWRhcHRlciwgcGktPnZpaWQsIGZyZWUsCisJCQkJCSAgbmFkZHIsIGFkZHIsIGZpbHRfaWR4LCAmdWhhc2gsIHNsZWVwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWZyZWUgPSBmYWxzZTsKKwl9CisKKwkvKiBuZXh0IHNldCB1cCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCW5hZGRyID0gY29sbGVjdF9uZXRkZXZfbWNfbGlzdF9hZGRycyhkZXYsIGFkZHIsIEFSUkFZX1NJWkUoYWRkcikpOworCWlmIChuYWRkciA+IDApIHsKKwkJcmV0ID0gdDR2Zl9hbGxvY19tYWNfZmlsdChwaS0+YWRhcHRlciwgcGktPnZpaWQsIGZyZWUsCisJCQkJCSAgbmFkZHIsIGFkZHIsIGZpbHRfaWR4LCAmbWhhc2gsIHNsZWVwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiB0NHZmX3NldF9hZGRyX2hhc2gocGktPmFkYXB0ZXIsIHBpLT52aWlkLCB1aGFzaCAhPSAwLAorCQkJCSAgdWhhc2ggfCBtaGFzaCwgc2xlZXApOworfQorCisvKgorICogU2V0IFJYIHByb3BlcnRpZXMgb2YgYSBwb3J0LCBzdWNoIGFzIHByb21pc2NydWl0eSwgYWRkcmVzcyBmaWx0ZXJzLCBhbmQgTVRVLgorICogSWYgQG10dSBpcyAtMSBpdCBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAqLworc3RhdGljIGludCBzZXRfcnhtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUsIGJvb2wgc2xlZXBfb2spCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXQgPSBzZXRfYWRkcl9maWx0ZXJzKGRldiwgc2xlZXBfb2spOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gdDR2Zl9zZXRfcnhtb2RlKHBpLT5hZGFwdGVyLCBwaS0+dmlpZCwgLTEsCisJCQkJICAgICAgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgIT0gMCwKKwkJCQkgICAgICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgIT0gMCwKKwkJCQkgICAgICAxLCAtMSwgc2xlZXBfb2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgcmVjZWl2ZSBtb2RlcyBvbiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBjeGdiNHZmX3NldF9yeG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiB1bmZvcnR1bmF0ZWx5IHdlIGNhbid0IHJldHVybiBlcnJvcnMgdG8gdGhlIHN0YWNrICovCisJc2V0X3J4bW9kZShkZXYsIC0xLCBmYWxzZSk7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgaW50ZXJydXB0IGhvbGRvZmYgdGltZXIgdmFsdWUgYXJyYXkgd2hpY2ggY29tZXMKKyAqIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgaG9sZG9mZiB2YWx1ZS4KKyAqLworc3RhdGljIGludCBjbG9zZXN0X3RpbWVyKGNvbnN0IHN0cnVjdCBzZ2UgKnMsIGludCB1cykKK3sKKwlpbnQgaSwgdGltZXJfaWR4ID0gMCwgbWluX2RlbHRhID0gSU5UX01BWDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnRpbWVyX3ZhbCk7IGkrKykgeworCQlpbnQgZGVsdGEgPSB1cyAtIHMtPnRpbWVyX3ZhbFtpXTsKKwkJaWYgKGRlbHRhIDwgMCkKKwkJCWRlbHRhID0gLWRlbHRhOworCQlpZiAoZGVsdGEgPCBtaW5fZGVsdGEpIHsKKwkJCW1pbl9kZWx0YSA9IGRlbHRhOworCQkJdGltZXJfaWR4ID0gaTsKKwkJfQorCX0KKwlyZXR1cm4gdGltZXJfaWR4OworfQorCitzdGF0aWMgaW50IGNsb3Nlc3RfdGhyZXMoY29uc3Qgc3RydWN0IHNnZSAqcywgaW50IHRocmVzKQoreworCWludCBpLCBkZWx0YSwgcGt0Y250X2lkeCA9IDAsIG1pbl9kZWx0YSA9IElOVF9NQVg7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5jb3VudGVyX3ZhbCk7IGkrKykgeworCQlkZWx0YSA9IHRocmVzIC0gcy0+Y291bnRlcl92YWxbaV07CisJCWlmIChkZWx0YSA8IDApCisJCQlkZWx0YSA9IC1kZWx0YTsKKwkJaWYgKGRlbHRhIDwgbWluX2RlbHRhKSB7CisJCQltaW5fZGVsdGEgPSBkZWx0YTsKKwkJCXBrdGNudF9pZHggPSBpOworCQl9CisJfQorCXJldHVybiBwa3RjbnRfaWR4OworfQorCisvKgorICogUmV0dXJuIGEgcXVldWUncyBpbnRlcnJ1cHQgaG9sZC1vZmYgdGltZSBpbiB1cy4gIDAgbWVhbnMgbm8gdGltZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXRpbWVyX3ZhbChjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnJzcHEpCit7CisJdW5zaWduZWQgaW50IHRpbWVyX2lkeCA9IFFJTlRSX1RJTUVSX0lEWF9HRVQocnNwcS0+aW50cl9wYXJhbXMpOworCisJcmV0dXJuIHRpbWVyX2lkeCA8IFNHRV9OVElNRVJTCisJCT8gYWRhcHRlci0+c2dlLnRpbWVyX3ZhbFt0aW1lcl9pZHhdCisJCTogMDsKK30KKworLyoqCisgKglzZXRfcnhxX2ludHJfcGFyYW1zIC0gc2V0IGEgcXVldWUncyBpbnRlcnJ1cHQgaG9sZG9mZiBwYXJhbWV0ZXJzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUByc3BxOiB0aGUgUlggcmVzcG9uc2UgcXVldWUKKyAqCUB1czogdGhlIGhvbGQtb2ZmIHRpbWUgaW4gdXMsIG9yIDAgdG8gZGlzYWJsZSB0aW1lcgorICoJQGNudDogdGhlIGhvbGQtb2ZmIHBhY2tldCBjb3VudCwgb3IgMCB0byBkaXNhYmxlIGNvdW50ZXIKKyAqCisgKglTZXRzIGFuIFJYIHJlc3BvbnNlIHF1ZXVlJ3MgaW50ZXJydXB0IGhvbGQtb2ZmIHRpbWUgYW5kIHBhY2tldCBjb3VudC4KKyAqCUF0IGxlYXN0IG9uZSBvZiB0aGUgdHdvIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBxdWV1ZSB0byBnZW5lcmF0ZQorICoJaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGludCBzZXRfcnhxX2ludHJfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2dlX3JzcHEgKnJzcHEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHVzLCB1bnNpZ25lZCBpbnQgY250KQoreworCXVuc2lnbmVkIGludCB0aW1lcl9pZHg7CisKKwkvKgorCSAqIElmIGJvdGggdGhlIGludGVycnVwdCBob2xkb2ZmIHRpbWVyIGFuZCBjb3VudCBhcmUgc3BlY2lmaWVkIGFzCisJICogemVybywgZGVmYXVsdCB0byBhIGhvbGRvZmYgY291bnQgb2YgMSAuLi4KKwkgKi8KKwlpZiAoKHVzIHwgY250KSA9PSAwKQorCQljbnQgPSAxOworCisJLyoKKwkgKiBJZiBhbiBpbnRlcnJ1cHQgaG9sZG9mZiBjb3VudCBoYXMgYmVlbiBzcGVjaWZpZWQsIHRoZW4gZmluZCB0aGUKKwkgKiBjbG9zZXN0IGNvbmZpZ3VyZWQgaG9sZG9mZiBjb3VudCBhbmQgdXNlIHRoYXQuICBJZiB0aGUgcmVzcG9uc2UKKwkgKiBxdWV1ZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIHRoZW4gdXBkYXRlIGl0cyBxdWV1ZSBjb250ZXh0CisJICogcGFyYW1ldGVycyAuLi4KKwkgKi8KKwlpZiAoY250KSB7CisJCWludCBlcnI7CisJCXUzMiB2LCBwa3RjbnRfaWR4OworCisJCXBrdGNudF9pZHggPSBjbG9zZXN0X3RocmVzKCZhZGFwdGVyLT5zZ2UsIGNudCk7CisJCWlmIChyc3BxLT5kZXNjICYmIHJzcHEtPnBrdGNudF9pZHggIT0gcGt0Y250X2lkeCkgeworCQkJdiA9IEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX0RNQVEpIHwKKwkJCSAgICBGV19QQVJBTVNfUEFSQU1fWCgKKwkJCQkJRldfUEFSQU1TX1BBUkFNX0RNQVFfSVFfSU5UQ05UVEhSRVNIKSB8CisJCQkgICAgRldfUEFSQU1TX1BBUkFNX1laKHJzcHEtPmNudHh0X2lkKTsKKwkJCWVyciA9IHQ0dmZfc2V0X3BhcmFtcyhhZGFwdGVyLCAxLCAmdiwgJnBrdGNudF9pZHgpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCXJzcHEtPnBrdGNudF9pZHggPSBwa3RjbnRfaWR4OworCX0KKworCS8qCisJICogQ29tcHV0ZSB0aGUgY2xvc2VzdCBob2xkb2ZmIHRpbWVyIGluZGV4IGZyb20gdGhlIHN1cHBsaWVkIGhvbGRvZmYKKwkgKiB0aW1lciB2YWx1ZS4KKwkgKi8KKwl0aW1lcl9pZHggPSAodXMgPT0gMAorCQkgICAgID8gU0dFX1RJTUVSX1JTVFJUX0NOVFIKKwkJICAgICA6IGNsb3Nlc3RfdGltZXIoJmFkYXB0ZXItPnNnZSwgdXMpKTsKKworCS8qCisJICogVXBkYXRlIHRoZSByZXNwb25zZSBxdWV1ZSdzIGludGVycnVwdCBjb2FsZXNjaW5nIHBhcmFtZXRlcnMgYW5kCisJICogcmV0dXJuIHN1Y2Nlc3MuCisJICovCisJcnNwcS0+aW50cl9wYXJhbXMgPSAoUUlOVFJfVElNRVJfSURYKHRpbWVyX2lkeCkgfAorCQkJICAgICAoY250ID4gMCA/IFFJTlRSX0NOVF9FTiA6IDApKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiBhIHZlcnNpb24gbnVtYmVyIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGFkYXB0ZXIuICBUaGUgc2NoZW1lIGlzOgorICogLSBiaXRzIDAuLjk6IGNoaXAgdmVyc2lvbgorICogLSBiaXRzIDEwLi4xNTogY2hpcCByZXZpc2lvbgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBta19hZGFwX3ZlcnMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyoKKwkgKiBDaGlwIHZlcnNpb24gNCwgcmV2aXNpb24gMHgzZiAoY3hnYjR2ZikuCisJICovCisJcmV0dXJuIDQgfCAoMHgzZiA8PCAxMCk7Cit9CisKKy8qCisgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgaW9jdGwgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBjeGdiNHZmX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwkgICAgLyoKKwkgICAgICogVGhlIFZGIERyaXZlciBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIGFueSBvZiB0aGUgb3RoZXIKKwkgICAgICogY29tbW9uIEV0aGVybmV0IGRldmljZSBpb2N0bCgpJ3MgKGxpa2UgcmVhZGluZy93cml0aW5nCisJICAgICAqIFBIWSByZWdpc3RlcnMsIGV0Yy4KKwkgICAgICovCisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGRldmljZSdzIE1UVS4KKyAqLworc3RhdGljIGludCBjeGdiNHZmX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBhY2NvbW1vZGF0ZSBTQUNLICovCisJaWYgKG5ld19tdHUgPCA4MSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB0NHZmX3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIHBpLT52aWlkLCBuZXdfbXR1LAorCQkJICAgICAgLTEsIC0xLCAtMSwgLTEsIHRydWUpOworCWlmICghcmV0KQorCQlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgZGV2aWNlcyBNQUMgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBjeGdiNHZmX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpfYWRkcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IF9hZGRyOworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB0NHZmX2NoYW5nZV9tYWMocGktPmFkYXB0ZXIsIHBpLT52aWlkLCBwaS0+eGFjdF9hZGRyX2ZpbHQsCisJCQkgICAgICBhZGRyLT5zYV9kYXRhLCB0cnVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlwaS0+eGFjdF9hZGRyX2ZpbHQgPSByZXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBUWCBRdWV1ZSBvbiB3aGljaCB0byBzZW5kIHRoZSBzcGVjaWZpZWQgc2tiLgorICovCitzdGF0aWMgdTE2IGN4Z2I0dmZfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyoKKwkgKiBYWFggRm9yIG5vdyBqdXN0IHVzZSB0aGUgZGVmYXVsdCBoYXNoIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvCisJICogWFhYIGxvb2sgYXQgb3RoZXIgcG9zc2liaWxpdGllcyAuLi4KKwkgKi8KKwlyZXR1cm4gc2tiX3R4X2hhc2goZGV2LCBza2IpOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsIGFsbCBvZiBvdXIgcmVjZWl2ZSBxdWV1ZXMuICBUaGlzIGlzIGNhbGxlZCBvdXRzaWRlIG9mIG5vcm1hbCBpbnRlcnJ1cHQKKyAqIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIGN4Z2I0dmZfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CisJCXN0cnVjdCBzZ2VfZXRoX3J4cSAqcnhxOworCQlpbnQgbnFzZXRzOworCisJCXJ4cSA9ICZhZGFwdGVyLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0XTsKKwkJZm9yIChucXNldHMgPSBwaS0+bnFzZXRzOyBucXNldHM7IG5xc2V0cy0tKSB7CisJCQl0NHZmX3NnZV9pbnRyX21zaXgoMCwgJnJ4cS0+cnNwcSk7CisJCQlyeHErKzsKKwkJfQorCX0gZWxzZQorCQl0NHZmX2ludHJfaGFuZGxlcihhZGFwdGVyKSgwLCBhZGFwdGVyKTsKK30KKyNlbmRpZgorCisvKgorICogRXRodG9vbCBvcGVyYXRpb25zLgorICogPT09PT09PT09PT09PT09PT09PQorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IGFueSBldGh0b29sIG9wZXJhdGlvbnMgd2hpY2ggY2hhbmdlIHRoZSBwaHlzaWNhbAorICogc3RhdGUgb2YgdGhlIHBvcnQgdG8gd2hpY2ggd2UncmUgbGlua2VkLgorICovCisKKy8qCisgKiBSZXR1cm4gY3VycmVudCBwb3J0IGxpbmsgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyBpbnQgY3hnYjR2Zl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwljbWQtPnN1cHBvcnRlZCA9IHBpLT5saW5rX2NmZy5zdXBwb3J0ZWQ7CisJY21kLT5hZHZlcnRpc2luZyA9IHBpLT5saW5rX2NmZy5hZHZlcnRpc2luZzsKKwljbWQtPnNwZWVkID0gbmV0aWZfY2Fycmllcl9vayhkZXYpID8gcGktPmxpbmtfY2ZnLnNwZWVkIDogLTE7CisJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCWNtZC0+cG9ydCA9IChjbWQtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9UUCkgPyBQT1JUX1RQIDogUE9SVF9GSUJSRTsKKwljbWQtPnBoeV9hZGRyZXNzID0gcGktPnBvcnRfaWQ7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJY21kLT5hdXRvbmVnID0gcGktPmxpbmtfY2ZnLmF1dG9uZWc7CisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gb3VyIGRyaXZlciBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgY3hnYjR2Zl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCisJc3RyY3B5KGRydmluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUpOworCXN0cmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh0b19wY2lfZGV2KGRldi0+ZGV2LnBhcmVudCkpKTsKKwlzbnByaW50ZihkcnZpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbiksCisJCSAiJXUuJXUuJXUuJXUsIFRQICV1LiV1LiV1LiV1IiwKKwkJIEZXX0hEUl9GV19WRVJfTUFKT1JfR0VUKGFkYXB0ZXItPnBhcmFtcy5kZXYuZndyZXYpLAorCQkgRldfSERSX0ZXX1ZFUl9NSU5PUl9HRVQoYWRhcHRlci0+cGFyYW1zLmRldi5md3JldiksCisJCSBGV19IRFJfRldfVkVSX01JQ1JPX0dFVChhZGFwdGVyLT5wYXJhbXMuZGV2LmZ3cmV2KSwKKwkJIEZXX0hEUl9GV19WRVJfQlVJTERfR0VUKGFkYXB0ZXItPnBhcmFtcy5kZXYuZndyZXYpLAorCQkgRldfSERSX0ZXX1ZFUl9NQUpPUl9HRVQoYWRhcHRlci0+cGFyYW1zLmRldi50cHJldiksCisJCSBGV19IRFJfRldfVkVSX01JTk9SX0dFVChhZGFwdGVyLT5wYXJhbXMuZGV2LnRwcmV2KSwKKwkJIEZXX0hEUl9GV19WRVJfTUlDUk9fR0VUKGFkYXB0ZXItPnBhcmFtcy5kZXYudHByZXYpLAorCQkgRldfSERSX0ZXX1ZFUl9CVUlMRF9HRVQoYWRhcHRlci0+cGFyYW1zLmRldi50cHJldikpOworfQorCisvKgorICogUmV0dXJuIGN1cnJlbnQgYWRhcHRlciBtZXNzYWdlIGxldmVsLgorICovCitzdGF0aWMgdTMyIGN4Z2I0dmZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG5ldGRldjJhZGFwKGRldiktPm1zZ19lbmFibGU7Cit9CisKKy8qCisgKiBTZXQgY3VycmVudCBhZGFwdGVyIG1lc3NhZ2UgbGV2ZWwuCisgKi8KK3N0YXRpYyB2b2lkIGN4Z2I0dmZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBtc2dsZXZlbCkKK3sKKwluZXRkZXYyYWRhcChkZXYpLT5tc2dfZW5hYmxlID0gbXNnbGV2ZWw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGRldmljZSdzIGN1cnJlbnQgUXVldWUgU2V0IHJpbmcgc2l6ZSBwYXJhbWV0ZXJzIGFsb25nIHdpdGggdGhlCisgKiBhbGxvd2VkIG1heGltdW0gdmFsdWVzLiAgU2luY2UgZXRodG9vbCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIGNvbmNlcHQgb2YKKyAqIG11bHRpLXF1ZXVlIGRldmljZXMsIHdlIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBmaXJzdCBRdWV1ZSBTZXQuCisgKi8KK3N0YXRpYyB2b2lkIGN4Z2I0dmZfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpycCkKK3sKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IHNnZSAqcyA9ICZwaS0+YWRhcHRlci0+c2dlOworCisJcnAtPnJ4X21heF9wZW5kaW5nID0gTUFYX1JYX0JVRkZFUlM7CisJcnAtPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSBNQVhfUlNQUV9FTlRSSUVTOworCXJwLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IDA7CisJcnAtPnR4X21heF9wZW5kaW5nID0gTUFYX1RYUV9FTlRSSUVTOworCisJcnAtPnJ4X3BlbmRpbmcgPSBzLT5ldGhyeHFbcGktPmZpcnN0X3FzZXRdLmZsLnNpemUgLSBNSU5fRkxfUkVTSUQ7CisJcnAtPnJ4X21pbmlfcGVuZGluZyA9IHMtPmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF0ucnNwcS5zaXplOworCXJwLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKKwlycC0+dHhfcGVuZGluZyA9IHMtPmV0aHR4cVtwaS0+Zmlyc3RfcXNldF0ucS5zaXplOworfQorCisvKgorICogU2V0IHRoZSBRdWV1ZSBTZXQgcmluZyBzaXplIHBhcmFtZXRlcnMgZm9yIHRoZSBkZXZpY2UuICBBZ2Fpbiwgc2luY2UKKyAqIGV0aHRvb2wgZG9lc24ndCBhbGxvdyBmb3IgdGhlIGNvbmNlcHQgb2YgbXVsdGlwbGUgcXVldWVzIHBlciBkZXZpY2UsIHdlJ2xsCisgKiBhcHBseSB0aGVzZSBuZXcgdmFsdWVzIGFjcm9zcyBhbGwgb2YgdGhlIFF1ZXVlIFNldHMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogZGV2aWNlIC0tIGFmdGVyIHZldHRpbmcgdGhlbSBvZiBjb3Vyc2UhCisgKi8KK3N0YXRpYyBpbnQgY3hnYjR2Zl9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnApCit7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwdGVyLT5zZ2U7CisJaW50IHFzOworCisJaWYgKHJwLT5yeF9wZW5kaW5nID4gTUFYX1JYX0JVRkZFUlMgfHwKKwkgICAgcnAtPnJ4X2p1bWJvX3BlbmRpbmcgfHwKKwkgICAgcnAtPnR4X3BlbmRpbmcgPiBNQVhfVFhRX0VOVFJJRVMgfHwKKwkgICAgcnAtPnJ4X21pbmlfcGVuZGluZyA+IE1BWF9SU1BRX0VOVFJJRVMgfHwKKwkgICAgcnAtPnJ4X21pbmlfcGVuZGluZyA8IE1JTl9SU1BRX0VOVFJJRVMgfHwKKwkgICAgcnAtPnJ4X3BlbmRpbmcgPCBNSU5fRkxfRU5UUklFUyB8fAorCSAgICBycC0+dHhfcGVuZGluZyA8IE1JTl9UWFFfRU5UUklFUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAocXMgPSBwaS0+Zmlyc3RfcXNldDsgcXMgPCBwaS0+Zmlyc3RfcXNldCArIHBpLT5ucXNldHM7IHFzKyspIHsKKwkJcy0+ZXRocnhxW3FzXS5mbC5zaXplID0gcnAtPnJ4X3BlbmRpbmcgKyBNSU5fRkxfUkVTSUQ7CisJCXMtPmV0aHJ4cVtxc10ucnNwcS5zaXplID0gcnAtPnJ4X21pbmlfcGVuZGluZzsKKwkJcy0+ZXRodHhxW3FzXS5xLnNpemUgPSBycC0+dHhfcGVuZGluZzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGludGVycnVwdCBob2xkb2ZmIHRpbWVyIGFuZCBjb3VudCBmb3IgdGhlIGZpcnN0IFF1ZXVlIFNldCBvbiB0aGUKKyAqIGRldmljZS4gIE91ciBleHRlbnNpb24gaW9jdGwoKSAodGhlIGN4Z2J0b29sIGludGVyZmFjZSkgYWxsb3dzIHRoZQorICogaW50ZXJydXB0IGhvbGRvZmYgdGltZXIgdG8gYmUgcmVhZCBvbiBhbGwgb2YgdGhlIGRldmljZSdzIFF1ZXVlIFNldHMuCisgKi8KK3N0YXRpYyBpbnQgY3hnYjR2Zl9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbGVzY2UpCit7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7CisJY29uc3Qgc3RydWN0IHNnZV9yc3BxICpyc3BxID0gJmFkYXB0ZXItPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXRdLnJzcHE7CisKKwljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MgPSBxdGltZXJfdmFsKGFkYXB0ZXIsIHJzcHEpOworCWNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9CisJCSgocnNwcS0+aW50cl9wYXJhbXMgJiBRSU5UUl9DTlRfRU4pCisJCSA/IGFkYXB0ZXItPnNnZS5jb3VudGVyX3ZhbFtyc3BxLT5wa3RjbnRfaWR4XQorCQkgOiAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgUlggaW50ZXJydXB0IGhvbGRvZmYgdGltZXIgYW5kIGNvdW50IGZvciB0aGUgZmlyc3QgUXVldWUgU2V0IG9uIHRoZQorICogaW50ZXJmYWNlLiAgT3VyIGV4dGVuc2lvbiBpb2N0bCgpICh0aGUgY3hnYnRvb2wgaW50ZXJmYWNlKSBhbGxvd3MgdXMgdG8gc2V0CisgKiB0aGUgaW50ZXJydXB0IGhvbGRvZmYgdGltZXIgb24gYW55IG9mIHRoZSBkZXZpY2UncyBRdWV1ZSBTZXRzLgorICovCitzdGF0aWMgaW50IGN4Z2I0dmZfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBpLT5hZGFwdGVyOworCisJcmV0dXJuIHNldF9yeHFfaW50cl9wYXJhbXMoYWRhcHRlciwKKwkJCQkgICAmYWRhcHRlci0+c2dlLmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF0ucnNwcSwKKwkJCQkgICBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MsCisJCQkJICAgY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKK30KKworLyoKKyAqIFJlcG9ydCBjdXJyZW50IHBvcnQgbGluayBwYXVzZSBwYXJhbWV0ZXIgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyB2b2lkIGN4Z2I0dmZfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZXBhcmFtKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXBhdXNlcGFyYW0tPmF1dG9uZWcgPSAocGktPmxpbmtfY2ZnLnJlcXVlc3RlZF9mYyAmIFBBVVNFX0FVVE9ORUcpICE9IDA7CisJcGF1c2VwYXJhbS0+cnhfcGF1c2UgPSAocGktPmxpbmtfY2ZnLmZjICYgUEFVU0VfUlgpICE9IDA7CisJcGF1c2VwYXJhbS0+dHhfcGF1c2UgPSAocGktPmxpbmtfY2ZnLmZjICYgUEFVU0VfVFgpICE9IDA7Cit9CisKKy8qCisgKiBSZXR1cm4gd2hldGhlciBSWCBDaGVja3N1bSBPZmZsb2FkaW5nIGlzIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgdTMyIGN4Z2I0dmZfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gKHBpLT5yeF9vZmZsb2FkICYgUlhfQ1NPKSAhPSAwOworfQorCisvKgorICogVHVybiBSWCBDaGVja3N1bSBPZmZsb2FkaW5nIG9uIG9yIG9mZiBmb3IgdGhlIGRldmljZS4KKyAqLworc3RhdGljIGludCBjeGdiNHZmX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBjc3VtKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChjc3VtKQorCQlwaS0+cnhfb2ZmbG9hZCB8PSBSWF9DU087CisJZWxzZQorCQlwaS0+cnhfb2ZmbG9hZCAmPSB+UlhfQ1NPOworCXJldHVybiAwOworfQorCisvKgorICogSWRlbnRpZnkgdGhlIHBvcnQgYnkgYmxpbmtpbmcgdGhlIHBvcnQncyBMRUQuCisgKi8KK3N0YXRpYyBpbnQgY3hnYjR2Zl9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBpZCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gdDR2Zl9pZGVudGlmeV9wb3J0KHBpLT5hZGFwdGVyLCBwaS0+dmlpZCwgNSk7Cit9CisKKy8qCisgKiBQb3J0IHN0YXRzIG1haW50YWluZWQgcGVyIHF1ZXVlIG9mIHRoZSBwb3J0LgorICovCitzdHJ1Y3QgcXVldWVfcG9ydF9zdGF0cyB7CisJdTY0IHRzbzsKKwl1NjQgdHhfY3N1bTsKKwl1NjQgcnhfY3N1bTsKKwl1NjQgdmxhbl9leDsKKwl1NjQgdmxhbl9pbnM7Cit9OworCisvKgorICogU3RyaW5ncyBmb3IgdGhlIEVUSF9TU19TVEFUUyBzdGF0aXN0aWNzIHNldCAoImV0aHRvb2wgLVMiKS4gIE5vdGUgdGhhdAorICogdGhlc2UgbmVlZCB0byBtYXRjaCB0aGUgb3JkZXIgb2Ygc3RhdGlzdGljcyByZXR1cm5lZCBieQorICogdDR2Zl9nZXRfcG9ydF9zdGF0cygpLgorICovCitzdGF0aWMgY29uc3QgY2hhciBzdGF0c19zdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkvKgorCSAqIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgdDR2Zl9wb3J0X3N0YXRzIHN0cnVjdHVyZS4KKwkgKi8KKwkiVHhCcm9hZGNhc3RCeXRlcyAgIiwKKwkiVHhCcm9hZGNhc3RGcmFtZXMgIiwKKwkiVHhNdWx0aWNhc3RCeXRlcyAgIiwKKwkiVHhNdWx0aWNhc3RGcmFtZXMgIiwKKwkiVHhVbmljYXN0Qnl0ZXMgICAgIiwKKwkiVHhVbmljYXN0RnJhbWVzICAgIiwKKwkiVHhEcm9wcGVkRnJhbWVzICAgIiwKKwkiVHhPZmZsb2FkQnl0ZXMgICAgIiwKKwkiVHhPZmZsb2FkRnJhbWVzICAgIiwKKwkiUnhCcm9hZGNhc3RCeXRlcyAgIiwKKwkiUnhCcm9hZGNhc3RGcmFtZXMgIiwKKwkiUnhNdWx0aWNhc3RCeXRlcyAgIiwKKwkiUnhNdWx0aWNhc3RGcmFtZXMgIiwKKwkiUnhVbmljYXN0Qnl0ZXMgICAgIiwKKwkiUnhVbmljYXN0RnJhbWVzICAgIiwKKwkiUnhFcnJvckZyYW1lcyAgICAgIiwKKworCS8qCisJICogVGhlc2UgYXJlIGFjY3VtdWxhdGVkIHBlci1xdWV1ZSBzdGF0aXN0aWNzIGFuZCBtdXN0IG1hdGNoIHRoZQorCSAqIG9yZGVyIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHF1ZXVlX3BvcnRfc3RhdHMgc3RydWN0dXJlLgorCSAqLworCSJUU08gICAgICAgICAgICAgICAiLAorCSJUeENzdW1PZmZsb2FkICAgICAiLAorCSJSeENzdW1Hb29kICAgICAgICAiLAorCSJWTEFOZXh0cmFjdGlvbnMgICAiLAorCSJWTEFOaW5zZXJ0aW9ucyAgICAiLAorfTsKKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN0YXRpc3RpY3MgaW4gdGhlIHNwZWNpZmllZCBzdGF0aXN0aWNzIHNldC4KKyAqLworc3RhdGljIGludCBjeGdiNHZmX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KQoreworCXN3aXRjaCAoc3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXR1cm4gQVJSQVlfU0laRShzdGF0c19zdHJpbmdzKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCS8qTk9UUkVBQ0hFRCovCit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHN0cmluZ3MgZm9yIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljcyBzZXQuCisgKi8KK3N0YXRpYyB2b2lkIGN4Z2I0dmZfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQl1MzIgc3NldCwKKwkJCQl1OCAqZGF0YSkKK3sKKwlzd2l0Y2ggKHNzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsIHN0YXRzX3N0cmluZ3MsIHNpemVvZihzdGF0c19zdHJpbmdzKSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFNtYWxsIHV0aWxpdHkgcm91dGluZSB0byBhY2N1bXVsYXRlIHF1ZXVlIHN0YXRpc3RpY3MgYWNyb3NzIHRoZSBxdWV1ZXMgb2YKKyAqIGEgInBvcnQiLgorICovCitzdGF0aWMgdm9pZCBjb2xsZWN0X3NnZV9wb3J0X3N0YXRzKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCSAgIHN0cnVjdCBxdWV1ZV9wb3J0X3N0YXRzICpzdGF0cykKK3sKKwljb25zdCBzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cSA9ICZhZGFwdGVyLT5zZ2UuZXRodHhxW3BpLT5maXJzdF9xc2V0XTsKKwljb25zdCBzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9ICZhZGFwdGVyLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0XTsKKwlpbnQgcXM7CisKKwltZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKwlmb3IgKHFzID0gMDsgcXMgPCBwaS0+bnFzZXRzOyBxcysrLCByeHErKywgdHhxKyspIHsKKwkJc3RhdHMtPnRzbyArPSB0eHEtPnRzbzsKKwkJc3RhdHMtPnR4X2NzdW0gKz0gdHhxLT50eF9jc287CisJCXN0YXRzLT5yeF9jc3VtICs9IHJ4cS0+c3RhdHMucnhfY3NvOworCQlzdGF0cy0+dmxhbl9leCArPSByeHEtPnN0YXRzLnZsYW5fZXg7CisJCXN0YXRzLT52bGFuX2lucyArPSB0eHEtPnZsYW5faW5zOworCX0KK30KKworLyoKKyAqIFJldHVybiB0aGUgRVRIX1NTX1NUQVRTIHN0YXRpc3RpY3Mgc2V0LgorICovCitzdGF0aWMgdm9pZCBjeGdiNHZmX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLAorCQkJCSAgICAgIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7CisJaW50IGVyciA9IHQ0dmZfZ2V0X3BvcnRfc3RhdHMoYWRhcHRlciwgcGktPnBpZHgsCisJCQkJICAgICAgKHN0cnVjdCB0NHZmX3BvcnRfc3RhdHMgKilkYXRhKTsKKwlpZiAoZXJyKQorCQltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB0NHZmX3BvcnRfc3RhdHMpKTsKKworCWRhdGEgKz0gc2l6ZW9mKHN0cnVjdCB0NHZmX3BvcnRfc3RhdHMpIC8gc2l6ZW9mKHU2NCk7CisJY29sbGVjdF9zZ2VfcG9ydF9zdGF0cyhhZGFwdGVyLCBwaSwgKHN0cnVjdCBxdWV1ZV9wb3J0X3N0YXRzICopZGF0YSk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2Ygb3VyIHJlZ2lzdGVyIG1hcC4KKyAqLworc3RhdGljIGludCBjeGdiNHZmX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBUNFZGX1JFR01BUF9TSVpFOworfQorCisvKgorICogRHVtcCBhIGJsb2NrIG9mIHJlZ2lzdGVycywgc3RhcnQgdG8gZW5kIGluY2x1c2l2ZSwgaW50byBhIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgcmVnX2Jsb2NrX2R1bXAoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKnJlZ2J1ZiwKKwkJCSAgIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCkKK3sKKwl1MzIgKmJwID0gcmVnYnVmICsgc3RhcnQgLSBUNFZGX1JFR01BUF9TVEFSVDsKKworCWZvciAoIDsgc3RhcnQgPD0gZW5kOyBzdGFydCArPSBzaXplb2YodTMyKSkgeworCQkvKgorCQkgKiBBdm9pZCByZWFkaW5nIHRoZSBNYWlsYm94IENvbnRyb2wgcmVnaXN0ZXIgc2luY2UgdGhhdAorCQkgKiBjYW4gdHJpZ2dlciBhIE1haWxib3ggT3duZXJzaGlwIEFyYml0cmF0aW9uIGN5Y2xlIGFuZAorCQkgKiBpbnRlcmZlcmUgd2l0aCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGZpcm13YXJlLgorCQkgKi8KKwkJaWYgKHN0YXJ0ID09IFQ0VkZfQ0lNX0JBU0VfQUREUiArIENJTV9WRl9FWFRfTUFJTEJPWF9DVFJMKQorCQkJKmJwKysgPSAweGZmZmY7CisJCWVsc2UKKwkJCSpicCsrID0gdDRfcmVhZF9yZWcoYWRhcHRlciwgc3RhcnQpOworCX0KK30KKworLyoKKyAqIENvcHkgb3VyIGVudGlyZSByZWdpc3RlciBtYXAgaW50byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBjeGdiNHZmX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQkgICAgIHZvaWQgKnJlZ2J1ZikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisKKwlyZWdzLT52ZXJzaW9uID0gbWtfYWRhcF92ZXJzKGFkYXB0ZXIpOworCisJLyoKKwkgKiBGaWxsIGluIHJlZ2lzdGVyIGJ1ZmZlciB3aXRoIG91ciByZWdpc3RlciBtYXAuCisJICovCisJbWVtc2V0KHJlZ2J1ZiwgMCwgVDRWRl9SRUdNQVBfU0laRSk7CisKKwlyZWdfYmxvY2tfZHVtcChhZGFwdGVyLCByZWdidWYsCisJCSAgICAgICBUNFZGX1NHRV9CQVNFX0FERFIgKyBUNFZGX01PRF9NQVBfU0dFX0ZJUlNULAorCQkgICAgICAgVDRWRl9TR0VfQkFTRV9BRERSICsgVDRWRl9NT0RfTUFQX1NHRV9MQVNUKTsKKwlyZWdfYmxvY2tfZHVtcChhZGFwdGVyLCByZWdidWYsCisJCSAgICAgICBUNFZGX01QU19CQVNFX0FERFIgKyBUNFZGX01PRF9NQVBfTVBTX0ZJUlNULAorCQkgICAgICAgVDRWRl9NUFNfQkFTRV9BRERSICsgVDRWRl9NT0RfTUFQX01QU19MQVNUKTsKKwlyZWdfYmxvY2tfZHVtcChhZGFwdGVyLCByZWdidWYsCisJCSAgICAgICBUNFZGX1BMX0JBU0VfQUREUiArIFQ0VkZfTU9EX01BUF9QTF9GSVJTVCwKKwkJICAgICAgIFQ0VkZfUExfQkFTRV9BRERSICsgVDRWRl9NT0RfTUFQX1BMX0xBU1QpOworCXJlZ19ibG9ja19kdW1wKGFkYXB0ZXIsIHJlZ2J1ZiwKKwkJICAgICAgIFQ0VkZfQ0lNX0JBU0VfQUREUiArIFQ0VkZfTU9EX01BUF9DSU1fRklSU1QsCisJCSAgICAgICBUNFZGX0NJTV9CQVNFX0FERFIgKyBUNFZGX01PRF9NQVBfQ0lNX0xBU1QpOworCisJcmVnX2Jsb2NrX2R1bXAoYWRhcHRlciwgcmVnYnVmLAorCQkgICAgICAgVDRWRl9NQkRBVEFfQkFTRV9BRERSICsgVDRWRl9NQkRBVEFfRklSU1QsCisJCSAgICAgICBUNFZGX01CREFUQV9CQVNFX0FERFIgKyBUNFZGX01CREFUQV9MQVNUKTsKK30KKworLyoKKyAqIFJlcG9ydCBjdXJyZW50IFdha2UgT24gTEFOIHNldHRpbmdzLgorICovCitzdGF0aWMgdm9pZCBjeGdiNHZmX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJd29sLT5zdXBwb3J0ZWQgPSAwOworCXdvbC0+d29sb3B0cyA9IDA7CisJbWVtc2V0KCZ3b2wtPnNvcGFzcywgMCwgc2l6ZW9mKHdvbC0+c29wYXNzKSk7Cit9CisKKy8qCisgKiBTZXQgVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkaW5nIGZlYXR1cmUgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgaW50IGN4Z2I0dmZfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdHNvKQoreworCWlmICh0c28pCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzY7CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH4oTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGN4Z2I0dmZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBjeGdiNHZmX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gY3hnYjR2Zl9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IGN4Z2I0dmZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gY3hnYjR2Zl9zZXRfbXNnbGV2ZWwsCisJLmdldF9yaW5ncGFyYW0JCT0gY3hnYjR2Zl9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtCQk9IGN4Z2I0dmZfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X2NvYWxlc2NlCQk9IGN4Z2I0dmZfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UJCT0gY3hnYjR2Zl9zZXRfY29hbGVzY2UsCisJLmdldF9wYXVzZXBhcmFtCQk9IGN4Z2I0dmZfZ2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtCQk9IGN4Z2I0dmZfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IGN4Z2I0dmZfc2V0X3J4X2NzdW0sCisJLnNldF90eF9jc3VtCQk9IGV0aHRvb2xfb3Bfc2V0X3R4X2lwdjZfY3N1bSwKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3N0cmluZ3MJCT0gY3hnYjR2Zl9nZXRfc3RyaW5ncywKKwkucGh5c19pZAkJPSBjeGdiNHZmX3BoeXNfaWQsCisJLmdldF9zc2V0X2NvdW50CQk9IGN4Z2I0dmZfZ2V0X3NzZXRfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gY3hnYjR2Zl9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3JlZ3NfbGVuCQk9IGN4Z2I0dmZfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncwkJPSBjeGdiNHZmX2dldF9yZWdzLAorCS5nZXRfd29sCQk9IGN4Z2I0dmZfZ2V0X3dvbCwKKwkuc2V0X3RzbwkJPSBjeGdiNHZmX3NldF90c28sCit9OworCisvKgorICogL3N5cy9rZXJuZWwvZGVidWcvY3hnYjR2ZiBzdXBwb3J0IGNvZGUgYW5kIGRhdGEuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogU2hvdyBTR0UgUXVldWUgU2V0IGluZm9ybWF0aW9uLiAgV2UgZGlzcGxheSBRUEwgUXVldWVzIFNldHMgcGVyIGxpbmUuCisgKi8KKyNkZWZpbmUgUVBMCTQKKworc3RhdGljIGludCBzZ2VfcWluZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHNlcS0+cHJpdmF0ZTsKKwlpbnQgZXRoX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcHRlci0+c2dlLmV0aHFzZXRzLCBRUEwpOworCWludCBxcywgciA9ICh1aW50cHRyX3QpdiAtIDE7CisKKwlpZiAocikKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKworCSNkZWZpbmUgUzMoZm10X3NwZWMsIHMsIHYpIFwKKwkJZG8ge1wKKwkJCXNlcV9wcmludGYoc2VxLCAiJS0xMnMiLCBzKTsgXAorCQkJZm9yIChxcyA9IDA7IHFzIDwgbjsgKytxcykgXAorCQkJCXNlcV9wcmludGYoc2VxLCAiICUxNiIgZm10X3NwZWMsIHYpOyBcCisJCQlzZXFfcHV0YyhzZXEsICdcbicpOyBcCisJCX0gd2hpbGUgKDApCisJI2RlZmluZSBTKHMsIHYpCQlTMygicyIsIHMsIHYpCisJI2RlZmluZSBUKHMsIHYpCQlTMygidSIsIHMsIHR4cVtxc10udikKKwkjZGVmaW5lIFIocywgdikJCVMzKCJ1IiwgcywgcnhxW3FzXS52KQorCisJaWYgKHIgPCBldGhfZW50cmllcykgeworCQljb25zdCBzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9ICZhZGFwdGVyLT5zZ2UuZXRocnhxW3IgKiBRUExdOworCQljb25zdCBzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cSA9ICZhZGFwdGVyLT5zZ2UuZXRodHhxW3IgKiBRUExdOworCQlpbnQgbiA9IG1pbihRUEwsIGFkYXB0ZXItPnNnZS5ldGhxc2V0cyAtIFFQTCAqIHIpOworCisJCVMoIlFUeXBlOiIsICJFdGhlcm5ldCIpOworCQlTKCJJbnRlcmZhY2U6IiwKKwkJICAocnhxW3FzXS5yc3BxLm5ldGRldgorCQkgICA/IHJ4cVtxc10ucnNwcS5uZXRkZXYtPm5hbWUKKwkJICAgOiAiTi9BIikpOworCQlTMygiZCIsICJQb3J0OiIsCisJCSAgIChyeHFbcXNdLnJzcHEubmV0ZGV2CisJCSAgICA/ICgoc3RydWN0IHBvcnRfaW5mbyAqKQorCQkgICAgICAgbmV0ZGV2X3ByaXYocnhxW3FzXS5yc3BxLm5ldGRldikpLT5wb3J0X2lkCisJCSAgICA6IC0xKSk7CisJCVQoIlR4USBJRDoiLCBxLmFic19pZCk7CisJCVQoIlR4USBzaXplOiIsIHEuc2l6ZSk7CisJCVQoIlR4USBpbnVzZToiLCBxLmluX3VzZSk7CisJCVQoIlR4USBQSWR4OiIsIHEucGlkeCk7CisJCVQoIlR4USBDSWR4OiIsIHEuY2lkeCk7CisJCVIoIlJzcFEgSUQ6IiwgcnNwcS5hYnNfaWQpOworCQlSKCJSc3BRIHNpemU6IiwgcnNwcS5zaXplKTsKKwkJUigiUnNwUUUgc2l6ZToiLCByc3BxLmlxZV9sZW4pOworCQlTMygidSIsICJJbnRyIGRlbGF5OiIsIHF0aW1lcl92YWwoYWRhcHRlciwgJnJ4cVtxc10ucnNwcSkpOworCQlTMygidSIsICJJbnRyIHBrdGNudDoiLAorCQkgICBhZGFwdGVyLT5zZ2UuY291bnRlcl92YWxbcnhxW3FzXS5yc3BxLnBrdGNudF9pZHhdKTsKKwkJUigiUnNwUSBDSWR4OiIsIHJzcHEuY2lkeCk7CisJCVIoIlJzcFEgR2VuOiIsIHJzcHEuZ2VuKTsKKwkJUigiRkwgSUQ6IiwgZmwuYWJzX2lkKTsKKwkJUigiRkwgc2l6ZToiLCBmbC5zaXplIC0gTUlOX0ZMX1JFU0lEKTsKKwkJUigiRkwgYXZhaWw6IiwgZmwuYXZhaWwpOworCQlSKCJGTCBQSWR4OiIsIGZsLnBpZHgpOworCQlSKCJGTCBDSWR4OiIsIGZsLmNpZHgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyIC09IGV0aF9lbnRyaWVzOworCWlmIChyID09IDApIHsKKwkJY29uc3Qgc3RydWN0IHNnZV9yc3BxICpldnRxID0gJmFkYXB0ZXItPnNnZS5md19ldnRxOworCisJCXNlcV9wcmludGYoc2VxLCAiJS0xMnMgJTE2c1xuIiwgIlFUeXBlOiIsICJGVyBldmVudCBxdWV1ZSIpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTJzICUxNnVcbiIsICJSc3BRIElEOiIsIGV2dHEtPmFic19pZCk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0xMnMgJTE2dVxuIiwgIkludHIgZGVsYXk6IiwKKwkJCSAgIHF0aW1lcl92YWwoYWRhcHRlciwgZXZ0cSkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTJzICUxNnVcbiIsICJJbnRyIHBrdGNudDoiLAorCQkJICAgYWRhcHRlci0+c2dlLmNvdW50ZXJfdmFsW2V2dHEtPnBrdGNudF9pZHhdKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTEycyAlMTZ1XG4iLCAiUnNwUSBDaWR4OiIsIGV2dHEtPmNpZHgpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTJzICUxNnVcbiIsICJSc3BRIEdlbjoiLCBldnRxLT5nZW4pOworCX0gZWxzZSBpZiAociA9PSAxKSB7CisJCWNvbnN0IHN0cnVjdCBzZ2VfcnNwcSAqaW50cnEgPSAmYWRhcHRlci0+c2dlLmludHJxOworCisJCXNlcV9wcmludGYoc2VxLCAiJS0xMnMgJTE2c1xuIiwgIlFUeXBlOiIsICJJbnRlcnJ1cHQgUXVldWUiKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTEycyAlMTZ1XG4iLCAiUnNwUSBJRDoiLCBpbnRycS0+YWJzX2lkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTEycyAlMTZ1XG4iLCAiSW50ciBkZWxheToiLAorCQkJICAgcXRpbWVyX3ZhbChhZGFwdGVyLCBpbnRycSkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTJzICUxNnVcbiIsICJJbnRyIHBrdGNudDoiLAorCQkJICAgYWRhcHRlci0+c2dlLmNvdW50ZXJfdmFsW2ludHJxLT5wa3RjbnRfaWR4XSk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0xMnMgJTE2dVxuIiwgIlJzcFEgQ2lkeDoiLCBpbnRycS0+Y2lkeCk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0xMnMgJTE2dVxuIiwgIlJzcFEgR2VuOiIsIGludHJxLT5nZW4pOworCX0KKworCSN1bmRlZiBSCisJI3VuZGVmIFQKKwkjdW5kZWYgUworCSN1bmRlZiBTMworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiAiZW50cmllcyIgaW4gb3VyICJmaWxlIi4gIFdlIGdyb3VwIHRoZSBtdWx0aS1RdWV1ZQorICogc2VjdGlvbnMgd2l0aCBRUEwgUXVldWUgU2V0cyBwZXIgImVudHJ5Ii4gIFRoZSBzZWN0aW9ucyBvZiB0aGUgb3V0cHV0IGFyZToKKyAqCisgKiAgICAgRXRoZXJuZXQgUlgvVFggUXVldWUgU2V0cworICogICAgIEZpcm13YXJlIEV2ZW50IFF1ZXVlCisgKiAgICAgRm9yd2FyZGVkIEludGVycnVwdCBRdWV1ZSAoaWYgaW4gTVNJIG1vZGUpCisgKi8KK3N0YXRpYyBpbnQgc2dlX3F1ZXVlX2VudHJpZXMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIERJVl9ST1VORF9VUChhZGFwdGVyLT5zZ2UuZXRocXNldHMsIFFQTCkgKyAxICsKKwkJKChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSSkgIT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkICpzZ2VfcXVldWVfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWludCBlbnRyaWVzID0gc2dlX3F1ZXVlX2VudHJpZXMoc2VxLT5wcml2YXRlKTsKKworCXJldHVybiAqcG9zIDwgZW50cmllcyA/ICh2b2lkICopKCh1aW50cHRyX3QpKnBvcyArIDEpIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2dlX3F1ZXVlX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7Cit9CisKK3N0YXRpYyB2b2lkICpzZ2VfcXVldWVfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJaW50IGVudHJpZXMgPSBzZ2VfcXVldWVfZW50cmllcyhzZXEtPnByaXZhdGUpOworCisJKysqcG9zOworCXJldHVybiAqcG9zIDwgZW50cmllcyA/ICh2b2lkICopKCh1aW50cHRyX3QpKnBvcyArIDEpIDogTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzZ2VfcWluZm9fc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBzZ2VfcXVldWVfc3RhcnQsCisJLm5leHQgID0gc2dlX3F1ZXVlX25leHQsCisJLnN0b3AgID0gc2dlX3F1ZXVlX3N0b3AsCisJLnNob3cgID0gc2dlX3FpbmZvX3Nob3cKK307CisKK3N0YXRpYyBpbnQgc2dlX3FpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJlcyA9IHNlcV9vcGVuKGZpbGUsICZzZ2VfcWluZm9fc2VxX29wcyk7CisKKwlpZiAoIXJlcykgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc2VxLT5wcml2YXRlID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2dlX3FpbmZvX2RlYnVnZnNfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gc2dlX3FpbmZvX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworLyoKKyAqIFNob3cgU0dFIFF1ZXVlIFNldCBzdGF0aXN0aWNzLiAgV2UgZGlzcGxheSBRUEwgUXVldWVzIFNldHMgcGVyIGxpbmUuCisgKi8KKyNkZWZpbmUgUVBMCTQKKworc3RhdGljIGludCBzZ2VfcXN0YXRzX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBzZXEtPnByaXZhdGU7CisJaW50IGV0aF9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXB0ZXItPnNnZS5ldGhxc2V0cywgUVBMKTsKKwlpbnQgcXMsIHIgPSAodWludHB0cl90KXYgLSAxOworCisJaWYgKHIpCisJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisKKwkjZGVmaW5lIFMzKGZtdCwgcywgdikgXAorCQlkbyB7IFwKKwkJCXNlcV9wcmludGYoc2VxLCAiJS0xNnMiLCBzKTsgXAorCQkJZm9yIChxcyA9IDA7IHFzIDwgbjsgKytxcykgXAorCQkJCXNlcV9wcmludGYoc2VxLCAiICU4IiBmbXQsIHYpOyBcCisJCQlzZXFfcHV0YyhzZXEsICdcbicpOyBcCisJCX0gd2hpbGUgKDApCisJI2RlZmluZSBTKHMsIHYpCQlTMygicyIsIHMsIHYpCisKKwkjZGVmaW5lIFQzKGZtdCwgcywgdikJUzMoZm10LCBzLCB0eHFbcXNdLnYpCisJI2RlZmluZSBUKHMsIHYpCQlUMygibHUiLCBzLCB2KQorCisJI2RlZmluZSBSMyhmbXQsIHMsIHYpCVMzKGZtdCwgcywgcnhxW3FzXS52KQorCSNkZWZpbmUgUihzLCB2KQkJUjMoImx1IiwgcywgdikKKworCWlmIChyIDwgZXRoX2VudHJpZXMpIHsKKwkJY29uc3Qgc3RydWN0IHNnZV9ldGhfcnhxICpyeHEgPSAmYWRhcHRlci0+c2dlLmV0aHJ4cVtyICogUVBMXTsKKwkJY29uc3Qgc3RydWN0IHNnZV9ldGhfdHhxICp0eHEgPSAmYWRhcHRlci0+c2dlLmV0aHR4cVtyICogUVBMXTsKKwkJaW50IG4gPSBtaW4oUVBMLCBhZGFwdGVyLT5zZ2UuZXRocXNldHMgLSBRUEwgKiByKTsKKworCQlTKCJRVHlwZToiLCAiRXRoZXJuZXQiKTsKKwkJUygiSW50ZXJmYWNlOiIsCisJCSAgKHJ4cVtxc10ucnNwcS5uZXRkZXYKKwkJICAgPyByeHFbcXNdLnJzcHEubmV0ZGV2LT5uYW1lCisJCSAgIDogIk4vQSIpKTsKKwkJUjMoInUiLCAiUnNwUU51bGxJbnRzOiIsIHJzcHEudW5oYW5kbGVkX2lycXMpOworCQlSKCJSeFBhY2tldHM6Iiwgc3RhdHMucGt0cyk7CisJCVIoIlJ4Q1NPOiIsIHN0YXRzLnJ4X2Nzbyk7CisJCVIoIlZMQU54dHJhY3Q6Iiwgc3RhdHMudmxhbl9leCk7CisJCVIoIkxST21lcmdlZDoiLCBzdGF0cy5scm9fbWVyZ2VkKTsKKwkJUigiTFJPcGFja2V0czoiLCBzdGF0cy5scm9fcGt0cyk7CisJCVIoIlJ4RHJvcHM6Iiwgc3RhdHMucnhfZHJvcHMpOworCQlUKCJUU086IiwgdHNvKTsKKwkJVCgiVHhDU086IiwgdHhfY3NvKTsKKwkJVCgiVkxBTmluczoiLCB2bGFuX2lucyk7CisJCVQoIlR4UUZ1bGw6IiwgcS5zdG9wcyk7CisJCVQoIlR4UVJlc3RhcnRzOiIsIHEucmVzdGFydHMpOworCQlUKCJUeE1hcEVycjoiLCBtYXBwaW5nX2Vycik7CisJCVIoIkZMQWxsb2NFcnI6IiwgZmwuYWxsb2NfZmFpbGVkKTsKKwkJUigiRkxMcmdBbGNFcnI6IiwgZmwubGFyZ2VfYWxsb2NfZmFpbGVkKTsKKwkJUigiRkxTdGFydmluZzoiLCBmbC5zdGFydmluZyk7CisJCXJldHVybiAwOworCX0KKworCXIgLT0gZXRoX2VudHJpZXM7CisJaWYgKHIgPT0gMCkgeworCQljb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKmV2dHEgPSAmYWRhcHRlci0+c2dlLmZ3X2V2dHE7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlLThzICUxNnNcbiIsICJRVHlwZToiLCAiRlcgZXZlbnQgcXVldWUiKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTE2cyAlOHVcbiIsICJSc3BRTnVsbEludHM6IiwKKwkJCSAgIGV2dHEtPnVuaGFuZGxlZF9pcnFzKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTE2cyAlOHVcbiIsICJSc3BRIENJZHg6IiwgZXZ0cS0+Y2lkeCk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0xNnMgJTh1XG4iLCAiUnNwUSBHZW46IiwgZXZ0cS0+Z2VuKTsKKwl9IGVsc2UgaWYgKHIgPT0gMSkgeworCQljb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKmludHJxID0gJmFkYXB0ZXItPnNnZS5pbnRycTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtOHMgJTE2c1xuIiwgIlFUeXBlOiIsICJJbnRlcnJ1cHQgUXVldWUiKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTE2cyAlOHVcbiIsICJSc3BRTnVsbEludHM6IiwKKwkJCSAgIGludHJxLT51bmhhbmRsZWRfaXJxcyk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0xNnMgJTh1XG4iLCAiUnNwUSBDSWR4OiIsIGludHJxLT5jaWR4KTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTE2cyAlOHVcbiIsICJSc3BRIEdlbjoiLCBpbnRycS0+Z2VuKTsKKwl9CisKKwkjdW5kZWYgUgorCSN1bmRlZiBUCisJI3VuZGVmIFMKKwkjdW5kZWYgUjMKKwkjdW5kZWYgVDMKKwkjdW5kZWYgUzMKKworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgImVudHJpZXMiIGluIG91ciAiZmlsZSIuICBXZSBncm91cCB0aGUgbXVsdGktUXVldWUKKyAqIHNlY3Rpb25zIHdpdGggUVBMIFF1ZXVlIFNldHMgcGVyICJlbnRyeSIuICBUaGUgc2VjdGlvbnMgb2YgdGhlIG91dHB1dCBhcmU6CisgKgorICogICAgIEV0aGVybmV0IFJYL1RYIFF1ZXVlIFNldHMKKyAqICAgICBGaXJtd2FyZSBFdmVudCBRdWV1ZQorICogICAgIEZvcndhcmRlZCBJbnRlcnJ1cHQgUXVldWUgKGlmIGluIE1TSSBtb2RlKQorICovCitzdGF0aWMgaW50IHNnZV9xc3RhdHNfZW50cmllcyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gRElWX1JPVU5EX1VQKGFkYXB0ZXItPnNnZS5ldGhxc2V0cywgUVBMKSArIDEgKworCQkoKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJKSAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgKnNnZV9xc3RhdHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWludCBlbnRyaWVzID0gc2dlX3FzdGF0c19lbnRyaWVzKHNlcS0+cHJpdmF0ZSk7CisKKwlyZXR1cm4gKnBvcyA8IGVudHJpZXMgPyAodm9pZCAqKSgodWludHB0cl90KSpwb3MgKyAxKSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNnZV9xc3RhdHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKK30KKworc3RhdGljIHZvaWQgKnNnZV9xc3RhdHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJaW50IGVudHJpZXMgPSBzZ2VfcXN0YXRzX2VudHJpZXMoc2VxLT5wcml2YXRlKTsKKworCSgqcG9zKSsrOworCXJldHVybiAqcG9zIDwgZW50cmllcyA/ICh2b2lkICopKCh1aW50cHRyX3QpKnBvcyArIDEpIDogTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzZ2VfcXN0YXRzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gc2dlX3FzdGF0c19zdGFydCwKKwkubmV4dCAgPSBzZ2VfcXN0YXRzX25leHQsCisJLnN0b3AgID0gc2dlX3FzdGF0c19zdG9wLAorCS5zaG93ICA9IHNnZV9xc3RhdHNfc2hvdworfTsKKworc3RhdGljIGludCBzZ2VfcXN0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJlcyA9IHNlcV9vcGVuKGZpbGUsICZzZ2VfcXN0YXRzX3NlcV9vcHMpOworCisJaWYgKHJlcyA9PSAwKSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZ2VfcXN0YXRzX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gc2dlX3FzdGF0c19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKy8qCisgKiBTaG93IFBDSS1FIFNSLUlPViBWaXJ0dWFsIEZ1bmN0aW9uIFJlc291cmNlIExpbWl0cy4KKyAqLworc3RhdGljIGludCByZXNvdXJjZXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgdmZfcmVzb3VyY2VzICp2ZnJlcyA9ICZhZGFwdGVyLT5wYXJhbXMudmZyZXM7CisKKwkjZGVmaW5lIFMoZGVzYywgZm10LCB2YXIpIFwKKwkJc2VxX3ByaW50ZihzZXEsICIlLTYwcyAiIGZtdCAiXG4iLCBcCisJCQkgICBkZXNjICIgKCIgI3ZhciAiKToiLCB2ZnJlcy0+dmFyKQorCisJUygiVmlydHVhbCBJbnRlcmZhY2VzIiwgIiVkIiwgbnZpKTsKKwlTKCJFZ3Jlc3MgUXVldWVzIiwgIiVkIiwgbmVxKTsKKwlTKCJFdGhlcm5ldCBDb250cm9sIiwgIiVkIiwgbmV0aGN0cmwpOworCVMoIkluZ3Jlc3MgUXVldWVzL3cgRnJlZSBMaXN0cy9JbnRlcnJ1cHRzIiwgIiVkIiwgbmlxZmxpbnQpOworCVMoIkluZ3Jlc3MgUXVldWVzIiwgIiVkIiwgbmlxKTsKKwlTKCJUcmFmZmljIENsYXNzIiwgIiVkIiwgdGMpOworCVMoIlBvcnQgQWNjZXNzIFJpZ2h0cyBNYXNrIiwgIiUjeCIsIHBtYXNrKTsKKwlTKCJNQUMgQWRkcmVzcyBGaWx0ZXJzIiwgIiVkIiwgbmV4YWN0Zik7CisJUygiRmlybXdhcmUgQ29tbWFuZCBSZWFkIENhcGFiaWxpdGllcyIsICIlI3giLCByX2NhcHMpOworCVMoIkZpcm13YXJlIENvbW1hbmQgV3JpdGUvRXhlY3V0ZSBDYXBhYmlsaXRpZXMiLCAiJSN4Iiwgd3hfY2Fwcyk7CisKKwkjdW5kZWYgUworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzb3VyY2VzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJlc291cmNlc19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVzb3VyY2VzX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gcmVzb3VyY2VzX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyoKKyAqIFNob3cgVmlydHVhbCBJbnRlcmZhY2VzLgorICovCitzdGF0aWMgaW50IGludGVyZmFjZXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiSW50ZXJmYWNlICBQb3J0ICAgVklJRFxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBzZXEtPnByaXZhdGU7CisJCWludCBwaWR4ID0gKHVpbnRwdHJfdCl2IC0gMjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPnBvcnRbcGlkeF07CisJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiU5cyAgJTRkICAlIzV4XG4iLAorCQkJICAgZGV2LT5uYW1lLCBwaS0+cG9ydF9pZCwgcGktPnZpaWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICppbnRlcmZhY2VzX2dldF9pZHgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGxvZmZfdCBwb3MpCit7CisJcmV0dXJuIHBvcyA8PSBhZGFwdGVyLT5wYXJhbXMubnBvcnRzCisJCT8gKHZvaWQgKikodWludHB0cl90KShwb3MgKyAxKQorCQk6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICppbnRlcmZhY2VzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gKnBvcworCQk/IGludGVyZmFjZXNfZ2V0X2lkeChzZXEtPnByaXZhdGUsICpwb3MpCisJCTogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqaW50ZXJmYWNlc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkoKnBvcykrKzsKKwlyZXR1cm4gaW50ZXJmYWNlc19nZXRfaWR4KHNlcS0+cHJpdmF0ZSwgKnBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVyZmFjZXNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpbnRlcmZhY2VzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gaW50ZXJmYWNlc19zdGFydCwKKwkubmV4dCAgPSBpbnRlcmZhY2VzX25leHQsCisJLnN0b3AgID0gaW50ZXJmYWNlc19zdG9wLAorCS5zaG93ICA9IGludGVyZmFjZXNfc2hvdworfTsKKworc3RhdGljIGludCBpbnRlcmZhY2VzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJlcyA9IHNlcV9vcGVuKGZpbGUsICZpbnRlcmZhY2VzX3NlcV9vcHMpOworCisJaWYgKHJlcyA9PSAwKSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbnRlcmZhY2VzX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gaW50ZXJmYWNlc19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKy8qCisgKiAvc3lzL2tlcm5lbC9kZWJ1Z2ZzL2N4Z2I0dmYvIGZpbGVzIGxpc3QuCisgKi8KK3N0cnVjdCBjeGdiNHZmX2RlYnVnZnNfZW50cnkgeworCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIGRlYnVnZnMgbm9kZSAqLworCW1vZGVfdCBtb2RlOwkJCS8qIGZpbGUgc3lzdGVtIG1vZGUgKi8KKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOworfTsKKworc3RhdGljIHN0cnVjdCBjeGdiNHZmX2RlYnVnZnNfZW50cnkgZGVidWdmc19maWxlc1tdID0geworCXsgInNnZV9xaW5mbyIsICBTX0lSVUdPLCAmc2dlX3FpbmZvX2RlYnVnZnNfZm9wcyB9LAorCXsgInNnZV9xc3RhdHMiLCBTX0lSVUdPLCAmc2dlX3FzdGF0c19wcm9jX2ZvcHMgfSwKKwl7ICJyZXNvdXJjZXMiLCAgU19JUlVHTywgJnJlc291cmNlc19wcm9jX2ZvcHMgfSwKKwl7ICJpbnRlcmZhY2VzIiwgU19JUlVHTywgJmludGVyZmFjZXNfcHJvY19mb3BzIH0sCit9OworCisvKgorICogTW9kdWxlIGFuZCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgY29kZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIFNldCB1cCBvdXQgL3N5cy9rZXJuZWwvZGVidWcvY3hnYjR2ZiBzdWItbm9kZXMuICBXZSBhc3N1bWUgdGhhdCB0aGUKKyAqIGRpcmVjdG9yeSAoZGVidWdmc19yb290KSBoYXMgYWxyZWFkeSBiZWVuIHNldCB1cC4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2V0dXBfZGVidWdmcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCUJVR19PTihhZGFwdGVyLT5kZWJ1Z2ZzX3Jvb3QgPT0gTlVMTCk7CisKKwkvKgorCSAqIERlYnVnZnMgc3VwcG9ydCBpcyBiZXN0IGVmZm9ydC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z2ZzX2ZpbGVzKTsgaSsrKQorCQkodm9pZClkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGRlYnVnZnNfZmlsZXNbaV0ubmFtZSwKKwkJCQkgIGRlYnVnZnNfZmlsZXNbaV0ubW9kZSwKKwkJCQkgIGFkYXB0ZXItPmRlYnVnZnNfcm9vdCwKKwkJCQkgICh2b2lkICopYWRhcHRlciwKKwkJCQkgIGRlYnVnZnNfZmlsZXNbaV0uZm9wcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRlYXIgZG93biB0aGUgL3N5cy9rZXJuZWwvZGVidWcvY3hnYjR2ZiBzdWItbm9kZXMgY3JlYXRlZCBhYm92ZS4gIFdlIGxlYXZlCisgKiBpdCB0byBvdXIgY2FsbGVyIHRvIHRlYXIgZG93biB0aGUgZGlyZWN0b3J5IChkZWJ1Z2ZzX3Jvb3QpLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY2xlYW51cF9kZWJ1Z2ZzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCUJVR19PTihhZGFwdGVyLT5kZWJ1Z2ZzX3Jvb3QgPT0gTlVMTCk7CisKKwkvKgorCSAqIFVubGlrZSBvdXIgc2lzdGVyIHJvdXRpbmUgY2xlYW51cF9wcm9jKCksIHdlIGRvbid0IG5lZWQgdG8gcmVtb3ZlCisJICogaW5kaXZpZHVhbCBlbnRyaWVzIGJlY2F1c2UgYSBjYWxsIHdpbGwgYmUgbWFkZSB0bworCSAqIGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSgpLiAgV2UganVzdCBuZWVkIHRvIGNsZWFuIHVwIGFueSBhbmNpbGxhcnkKKwkgKiBwZXJzaXN0ZW50IHN0YXRlLgorCSAqLworCS8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworLyoKKyAqIFBlcmZvcm0gZWFybHkgImFkYXB0ZXIiIGluaXRpYWxpemF0aW9uLiAgVGhpcyBpcyB3aGVyZSB3ZSBkaXNjb3ZlciB3aGF0CisgKiBhZGFwdGVyIHBhcmFtZXRlcnMgd2UncmUgZ29pbmcgdG8gYmUgdXNpbmcgYW5kIGluaXRpYWxpemUgYmFzaWMgYWRhcHRlcgorICogaGFyZHdhcmUgc3VwcG9ydC4KKyAqLworc3RhdGljIGludCBhZGFwX2luaXQwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCB2Zl9yZXNvdXJjZXMgKnZmcmVzID0gJmFkYXB0ZXItPnBhcmFtcy52ZnJlczsKKwlzdHJ1Y3Qgc2dlX3BhcmFtcyAqc2dlX3BhcmFtcyA9ICZhZGFwdGVyLT5wYXJhbXMuc2dlOworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcHRlci0+c2dlOworCXVuc2lnbmVkIGludCBldGhxc2V0czsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgZGV2aWNlIHRvIGJlY29tZSByZWFkeSBiZWZvcmUgcHJvY2VlZGluZyAuLi4KKwkgKi8KKwllcnIgPSB0NHZmX3dhaXRfZGV2X3JlYWR5KGFkYXB0ZXIpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgImRldmljZSBkaWRuJ3QgYmVjb21lIHJlYWR5OiIKKwkJCSIgZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogR3JhYiBiYXNpYyBvcGVyYXRpb25hbCBwYXJhbWV0ZXJzLiAgVGhlc2Ugd2lsbCBwcmVkb21pbmFudGx5IGhhdmUKKwkgKiBiZWVuIHNldCB1cCBieSB0aGUgUGh5c2ljYWwgRnVuY3Rpb24gRHJpdmVyIG9yIHdpbGwgYmUgaGFyZCBjb2RlZAorCSAqIGludG8gdGhlIGFkYXB0ZXIuICBXZSBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRoIHRoZW0gLi4uICBOb3RlIHRoYXQKKwkgKiB3ZSBfbXVzdF8gZ2V0IG91ciBWUEQgcGFyYW1ldGVycyBiZWZvcmUgb3VyIFNHRSBwYXJhbWV0ZXJzIGJlY2F1c2UKKwkgKiB3ZSBuZWVkIHRvIGtub3cgdGhlIGFkYXB0ZXIncyBjb3JlIGNsb2NrIGZyb20gdGhlIFZQRCBpbiBvcmRlciB0bworCSAqIHByb3Blcmx5IGRlY29kZSB0aGUgU0dFIFRpbWVyIFZhbHVlcy4KKwkgKi8KKwllcnIgPSB0NHZmX2dldF9kZXZfcGFyYW1zKGFkYXB0ZXIpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgInVuYWJsZSB0byByZXRyaWV2ZSBhZGFwdGVyIgorCQkJIiBkZXZpY2UgcGFyYW1ldGVyczogZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSB0NHZmX2dldF92cGRfcGFyYW1zKGFkYXB0ZXIpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgInVuYWJsZSB0byByZXRyaWV2ZSBhZGFwdGVyIgorCQkJIiBWUEQgcGFyYW1ldGVyczogZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSB0NHZmX2dldF9zZ2VfcGFyYW1zKGFkYXB0ZXIpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgInVuYWJsZSB0byByZXRyaWV2ZSBhZGFwdGVyIgorCQkJIiBTR0UgcGFyYW1ldGVyczogZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSB0NHZmX2dldF9yc3NfZ2xiX2NvbmZpZyhhZGFwdGVyKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsICJ1bmFibGUgdG8gcmV0cmlldmUgYWRhcHRlciIKKwkJCSIgUlNTIHBhcmFtZXRlcnM6IGVycj0lZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGFkYXB0ZXItPnBhcmFtcy5yc3MubW9kZSAhPQorCSAgICBGV19SU1NfR0xCX0NPTkZJR19DTURfTU9ERV9CQVNJQ1ZJUlRVQUwpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgInVuYWJsZSB0byBvcGVyYXRlIHdpdGggZ2xvYmFsIFJTUyIKKwkJCSIgbW9kZSAlZFxuIiwgYWRhcHRlci0+cGFyYW1zLnJzcy5tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVyciA9IHQ0dmZfc2dlX2luaXQoYWRhcHRlcik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LCAidW5hYmxlIHRvIHVzZSBhZGFwdGVyIHBhcmFtZXRlcnM6IgorCQkJIiBlcnI9JWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBSZXRyaWV2ZSBvdXIgUlggaW50ZXJydXB0IGhvbGRvZmYgdGltZXIgdmFsdWVzIGFuZCBjb3VudGVyCisJICogdGhyZXNob2xkIHZhbHVlcyBmcm9tIHRoZSBTR0UgcGFyYW1ldGVycy4KKwkgKi8KKwlzLT50aW1lcl92YWxbMF0gPSBjb3JlX3RpY2tzX3RvX3VzKGFkYXB0ZXIsCisJCVRJTUVSVkFMVUUwX0dFVChzZ2VfcGFyYW1zLT5zZ2VfdGltZXJfdmFsdWVfMF9hbmRfMSkpOworCXMtPnRpbWVyX3ZhbFsxXSA9IGNvcmVfdGlja3NfdG9fdXMoYWRhcHRlciwKKwkJVElNRVJWQUxVRTFfR0VUKHNnZV9wYXJhbXMtPnNnZV90aW1lcl92YWx1ZV8wX2FuZF8xKSk7CisJcy0+dGltZXJfdmFsWzJdID0gY29yZV90aWNrc190b191cyhhZGFwdGVyLAorCQlUSU1FUlZBTFVFMF9HRVQoc2dlX3BhcmFtcy0+c2dlX3RpbWVyX3ZhbHVlXzJfYW5kXzMpKTsKKwlzLT50aW1lcl92YWxbM10gPSBjb3JlX3RpY2tzX3RvX3VzKGFkYXB0ZXIsCisJCVRJTUVSVkFMVUUxX0dFVChzZ2VfcGFyYW1zLT5zZ2VfdGltZXJfdmFsdWVfMl9hbmRfMykpOworCXMtPnRpbWVyX3ZhbFs0XSA9IGNvcmVfdGlja3NfdG9fdXMoYWRhcHRlciwKKwkJVElNRVJWQUxVRTBfR0VUKHNnZV9wYXJhbXMtPnNnZV90aW1lcl92YWx1ZV80X2FuZF81KSk7CisJcy0+dGltZXJfdmFsWzVdID0gY29yZV90aWNrc190b191cyhhZGFwdGVyLAorCQlUSU1FUlZBTFVFMV9HRVQoc2dlX3BhcmFtcy0+c2dlX3RpbWVyX3ZhbHVlXzRfYW5kXzUpKTsKKworCXMtPmNvdW50ZXJfdmFsWzBdID0KKwkJVEhSRVNIT0xEXzBfR0VUKHNnZV9wYXJhbXMtPnNnZV9pbmdyZXNzX3J4X3RocmVzaG9sZCk7CisJcy0+Y291bnRlcl92YWxbMV0gPQorCQlUSFJFU0hPTERfMV9HRVQoc2dlX3BhcmFtcy0+c2dlX2luZ3Jlc3NfcnhfdGhyZXNob2xkKTsKKwlzLT5jb3VudGVyX3ZhbFsyXSA9CisJCVRIUkVTSE9MRF8yX0dFVChzZ2VfcGFyYW1zLT5zZ2VfaW5ncmVzc19yeF90aHJlc2hvbGQpOworCXMtPmNvdW50ZXJfdmFsWzNdID0KKwkJVEhSRVNIT0xEXzNfR0VUKHNnZV9wYXJhbXMtPnNnZV9pbmdyZXNzX3J4X3RocmVzaG9sZCk7CisKKwkvKgorCSAqIEdyYWIgb3VyIFZpcnR1YWwgSW50ZXJmYWNlIHJlc291cmNlIGFsbG9jYXRpb24sIGV4dHJhY3QgdGhlCisJICogZmVhdHVyZXMgdGhhdCB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCBkbyBhIGJpdCBvZiBzYW5pdHkgdGVzdGluZyBvbgorCSAqIHdoYXQgd2UgZGlzY292ZXIuCisJICovCisJZXJyID0gdDR2Zl9nZXRfdmZyZXMoYWRhcHRlcik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LCAidW5hYmxlIHRvIGdldCB2aXJ0dWFsIGludGVyZmFjZSIKKwkJCSIgcmVzb3VyY2VzOiBlcnI9JWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mICJwb3J0cyIgd2hpY2ggd2Ugc3VwcG9ydCBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCisJICogVmlydHVhbCBJbnRlcmZhY2VzIHdpdGggd2hpY2ggd2UndmUgYmVlbiBwcm92aXNpb25lZC4KKwkgKi8KKwlhZGFwdGVyLT5wYXJhbXMubnBvcnRzID0gdmZyZXMtPm52aTsKKwlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA+IE1BWF9OUE9SVFMpIHsKKwkJZGV2X3dhcm4oYWRhcHRlci0+cGRldl9kZXYsICJvbmx5IHVzaW5nICVkIG9mICVkIGFsbG93ZWQiCisJCQkgIiB2aXJ0dWFsIGludGVyZmFjZXNcbiIsIE1BWF9OUE9SVFMsCisJCQkgYWRhcHRlci0+cGFyYW1zLm5wb3J0cyk7CisJCWFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPSBNQVhfTlBPUlRTOworCX0KKworCS8qCisJICogV2UgbmVlZCB0byByZXNlcnZlIGEgbnVtYmVyIG9mIHRoZSBpbmdyZXNzIHF1ZXVlcyB3aXRoIEZyZWUgTGlzdAorCSAqIGFuZCBJbnRlcnJ1cHQgY2FwYWJpbGl0aWVzIGZvciBzcGVjaWFsIGludGVycnVwdCBwdXJwb3NlcyAobGlrZQorCSAqIGFzeW5jaHJvbm91cyBmaXJtd2FyZSBtZXNzYWdlcywgb3IgZm9yd2FyZGVkIGludGVycnVwdHMgaWYgd2UncmUKKwkgKiB1c2luZyBNU0kpLiAgVGhlIHJlc3Qgb2YgdGhlIEZML0ludHItY2FwYWJsZSBpbmdyZXNzIHF1ZXVlcyB3aWxsIGJlCisJICogbWF0Y2hlZCB1cCBvbmUtZm9yLW9uZSB3aXRoIEV0aGVybmV0L0NvbnRyb2wgZWdyZXNzIHF1ZXVlcyBpbiBvcmRlcgorCSAqIHRvIGZvcm0gIlF1ZXVlIFNldHMiIHdoaWNoIHdpbGwgYmUgYXBvcnRpb25lZCBiZXR3ZWVuIHRoZSAicG9ydHMiLgorCSAqIEZvciBlYWNoIFF1ZXVlIFNldCwgd2UnbGwgbmVlZCB0aGUgYWJpbGl0eSB0byBhbGxvY2F0ZSB0d28gRWdyZXNzCisJICogQ29udGV4dHMgLS0gb25lIGZvciB0aGUgSW5ncmVzcyBRdWV1ZSBGcmVlIExpc3QgYW5kIG9uZSBmb3IgdGhlIFRYCisJICogRXRoZXJuZXQgUXVldWUuCisJICovCisJZXRocXNldHMgPSB2ZnJlcy0+bmlxZmxpbnQgLSBJTkdRX0VYVFJBUzsKKwlpZiAodmZyZXMtPm5ldGhjdHJsICE9IGV0aHFzZXRzKSB7CisJCWRldl93YXJuKGFkYXB0ZXItPnBkZXZfZGV2LCAidW5lcXVhbCBudW1iZXIgb2YgW2F2YWlsYWJsZV0iCisJCQkgIiBpbmdyZXNzL2VncmVzcyBxdWV1ZXMgKCVkLyVkKTsgdXNpbmcgbWluaW11bSBmb3IiCisJCQkgIiBudW1iZXIgb2YgUXVldWUgU2V0c1xuIiwgZXRocXNldHMsIHZmcmVzLT5uZXRoY3RybCk7CisJCWV0aHFzZXRzID0gbWluKHZmcmVzLT5uZXRoY3RybCwgZXRocXNldHMpOworCX0KKwlpZiAodmZyZXMtPm5lcSA8IGV0aHFzZXRzKjIpIHsKKwkJZGV2X3dhcm4oYWRhcHRlci0+cGRldl9kZXYsICJOb3QgZW5vdWdoIEVncmVzcyBDb250ZXh0cyAoJWQpIgorCQkJICIgdG8gc3VwcG9ydCBRdWV1ZSBTZXRzICglZCk7IHJlZHVjaW5nIGFsbG93ZWQgUXVldWUiCisJCQkgIiBTZXRzXG4iLCB2ZnJlcy0+bmVxLCBldGhxc2V0cyk7CisJCWV0aHFzZXRzID0gdmZyZXMtPm5lcS8yOworCX0KKwlpZiAoZXRocXNldHMgPiBNQVhfRVRIX1FTRVRTKSB7CisJCWRldl93YXJuKGFkYXB0ZXItPnBkZXZfZGV2LCAib25seSB1c2luZyAlZCBvZiAlZCBhbGxvd2VkIFF1ZXVlIgorCQkJICIgU2V0c1xuIiwgTUFYX0VUSF9RU0VUUywgYWRhcHRlci0+c2dlLm1heF9ldGhxc2V0cyk7CisJCWV0aHFzZXRzID0gTUFYX0VUSF9RU0VUUzsKKwl9CisJaWYgKHZmcmVzLT5uaXEgIT0gMCB8fCB2ZnJlcy0+bmVxID4gZXRocXNldHMqMikgeworCQlkZXZfd2FybihhZGFwdGVyLT5wZGV2X2RldiwgInVudXNlZCByZXNvdXJjZXMgbmlxL25lcSAoJWQvJWQpIgorCQkJICIgaWdub3JlZFxuIiwgdmZyZXMtPm5pcSwgdmZyZXMtPm5lcSAtIGV0aHFzZXRzKjIpOworCX0KKwlhZGFwdGVyLT5zZ2UubWF4X2V0aHFzZXRzID0gZXRocXNldHM7CisKKwkvKgorCSAqIENoZWNrIGZvciB2YXJpb3VzIHBhcmFtZXRlciBzYW5pdHkgaXNzdWVzLiAgTW9zdCBjaGVja3Mgc2ltcGx5CisJICogcmVzdWx0IGluIHVzIHVzaW5nIGZld2VyIHJlc291cmNlcyB0aGFuIG91ciBwcm92aXNzaW9uaW5nIGJ1dCB3ZQorCSAqIGRvIG5lZWQgYXQgbGVhc3QgIG9uZSAicG9ydCIgd2l0aCB3aGljaCB0byB3b3JrIC4uLgorCSAqLworCWlmIChhZGFwdGVyLT5zZ2UubWF4X2V0aHFzZXRzIDwgYWRhcHRlci0+cGFyYW1zLm5wb3J0cykgeworCQlkZXZfd2FybihhZGFwdGVyLT5wZGV2X2RldiwgIm9ubHkgdXNpbmcgJWQgb2YgJWQgYXZhaWxhYmxlIgorCQkJICIgdmlydHVhbCBpbnRlcmZhY2VzICh0b28gZmV3IFF1ZXVlIFNldHMpXG4iLAorCQkJIGFkYXB0ZXItPnNnZS5tYXhfZXRocXNldHMsIGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMpOworCQlhZGFwdGVyLT5wYXJhbXMubnBvcnRzID0gYWRhcHRlci0+c2dlLm1heF9ldGhxc2V0czsKKwl9CisJaWYgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPT0gMCkgeworCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LCAibm8gdmlydHVhbCBpbnRlcmZhY2VzIGNvbmZpZ3VyZWQvIgorCQkJInVzYWJsZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3JzcHEoc3RydWN0IHNnZV9yc3BxICpyc3BxLCB1OCB0aW1lcl9pZHgsCisJCQkgICAgIHU4IHBrdF9jbnRfaWR4LCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlxZV9zaXplKQoreworCXJzcHEtPmludHJfcGFyYW1zID0gKFFJTlRSX1RJTUVSX0lEWCh0aW1lcl9pZHgpIHwKKwkJCSAgICAgKHBrdF9jbnRfaWR4IDwgU0dFX05DT1VOVEVSUyA/IFFJTlRSX0NOVF9FTiA6IDApKTsKKwlyc3BxLT5wa3RjbnRfaWR4ID0gKHBrdF9jbnRfaWR4IDwgU0dFX05DT1VOVEVSUworCQkJICAgID8gcGt0X2NudF9pZHgKKwkJCSAgICA6IDApOworCXJzcHEtPmlxZV9sZW4gPSBpcWVfc2l6ZTsKKwlyc3BxLT5zaXplID0gc2l6ZTsKK30KKworLyoKKyAqIFBlcmZvcm0gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIERNQSBxdWV1ZXMgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgYW5kCisgKiB0eXBlIG9mIHBvcnRzIHdlIGZvdW5kIGFuZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLiAgTW9zdCBzZXR0aW5ncyBjYW4KKyAqIGJlIG1vZGlmaWVkIGJ5IHRoZSBhZG1pbiB2aWEgZXRodG9vbCBhbmQgY3hnYnRvb2wgcHJpb3IgdG8gdGhlIGFkYXB0ZXIKKyAqIGJlaW5nIGJyb3VnaHQgdXAgZm9yIHRoZSBmaXJzdCB0aW1lLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY2ZnX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKwlpbnQgcTEwZywgbjEwZywgcWlkeCwgcGlkeCwgcXM7CisKKwkvKgorCSAqIFdlIHNob3VsZCBub3QgYmUgY2FsbGVkIHRpbGwgd2Uga25vdyBob3cgbWFueSBRdWV1ZSBTZXRzIHdlIGNhbgorCSAqIHN1cHBvcnQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBrbm93IHdoYXQga2luZAorCSAqIG9mIGludGVycnVwdHMgd2UnbGwgYmUgdXNpbmcgLi4uCisJICovCisJQlVHX09OKChhZGFwdGVyLT5mbGFncyAmIChVU0lOR19NU0lYfFVTSU5HX01TSSkpID09IDApOworCisJLyoKKwkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIDEwR2JFIFZpcnR1YWwgSW50ZXJmYWNlcyB0aGF0IHdlIGhhdmUuCisJICovCisJbjEwZyA9IDA7CisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBwaWR4KQorCQluMTBnICs9IGlzXzEwZ19wb3J0KCZhZGFwMnBpbmZvKGFkYXB0ZXIsIHBpZHgpLT5saW5rX2NmZyk7CisKKwkvKgorCSAqIFdlIGRlZmF1bHQgdG8gMSBxdWV1ZSBwZXIgbm9uLTEwRyBwb3J0IGFuZCB1cCB0byAjIG9mIGNvcmVzIHF1ZXVlcworCSAqIHBlciAxMEcgcG9ydC4KKwkgKi8KKwlpZiAobjEwZyA9PSAwKQorCQlxMTBnID0gMDsKKwllbHNlIHsKKwkJaW50IG4xZyA9IChhZGFwdGVyLT5wYXJhbXMubnBvcnRzIC0gbjEwZyk7CisJCXExMGcgPSAoYWRhcHRlci0+c2dlLm1heF9ldGhxc2V0cyAtIG4xZykgLyBuMTBnOworCQlpZiAocTEwZyA+IG51bV9vbmxpbmVfY3B1cygpKQorCQkJcTEwZyA9IG51bV9vbmxpbmVfY3B1cygpOworCX0KKworCS8qCisJICogQWxsb2NhdGUgdGhlICJRdWV1ZSBTZXRzIiB0byB0aGUgdmFyaW91cyBWaXJ0dWFsIEludGVyZmFjZXMuCisJICogVGhlIGxheW91dCB3aWxsIGJlIGVzdGFibGlzaGVkIGluIHNldHVwX3NnZV9xdWV1ZXMoKSB3aGVuIHRoZQorCSAqIGFkYXB0ZXIgaXMgYnJvdWdoIHVwIGZvciB0aGUgZmlyc3QgdGltZS4KKwkgKi8KKwlxaWR4ID0gMDsKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIHBpZHgpIHsKKwkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIHBpZHgpOworCisJCXBpLT5maXJzdF9xc2V0ID0gcWlkeDsKKwkJcGktPm5xc2V0cyA9IGlzXzEwZ19wb3J0KCZwaS0+bGlua19jZmcpID8gcTEwZyA6IDE7CisJCXFpZHggKz0gcGktPm5xc2V0czsKKwl9CisJcy0+ZXRocXNldHMgPSBxaWR4OworCisJLyoKKwkgKiBTZXQgdXAgZGVmYXVsdCBRdWV1ZSBTZXQgcGFyYW1ldGVycyAuLi4gIFN0YXJ0IG9mZiB3aXRoIHRoZQorCSAqIHNob3J0ZXN0IGludGVycnVwdCBob2xkb2ZmIHRpbWVyLgorCSAqLworCWZvciAocXMgPSAwOyBxcyA8IHMtPm1heF9ldGhxc2V0czsgcXMrKykgeworCQlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9ICZzLT5ldGhyeHFbcXNdOworCQlzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cSA9ICZzLT5ldGh0eHFbcXNdOworCisJCWluaXRfcnNwcSgmcnhxLT5yc3BxLCAwLCAwLCAxMDI0LCBMMV9DQUNIRV9CWVRFUyk7CisJCXJ4cS0+Zmwuc2l6ZSA9IDcyOworCQl0eHEtPnEuc2l6ZSA9IDEwMjQ7CisJfQorCisJLyoKKwkgKiBUaGUgZmlybXdhcmUgZXZlbnQgcXVldWUgaXMgdXNlZCBmb3IgbGluayBzdGF0ZSBjaGFuZ2VzIGFuZAorCSAqIG5vdGlmaWNhdGlvbnMgb2YgVFggRE1BIGNvbXBsZXRpb25zLgorCSAqLworCWluaXRfcnNwcSgmcy0+ZndfZXZ0cSwgU0dFX1RJTUVSX1JTVFJUX0NOVFIsIDAsIDUxMiwKKwkJICBMMV9DQUNIRV9CWVRFUyk7CisKKwkvKgorCSAqIFRoZSBmb3J3YXJkZWQgaW50ZXJydXB0IHF1ZXVlIGlzIHVzZWQgd2hlbiB3ZSdyZSBpbiBNU0kgaW50ZXJydXB0CisJICogbW9kZS4gIEluIHRoaXMgbW9kZSBhbGwgaW50ZXJydXB0cyBhc3NvY2lhdGVkIHdpdGggUlggcXVldWVzIHdpbGwKKwkgKiBiZSBmb3J3YXJkZWQgdG8gYSBzaW5nbGUgcXVldWUgd2hpY2ggd2UnbGwgYXNzb2NpYXRlIHdpdGggb3VyIE1TSQorCSAqIGludGVycnVwdCB2ZWN0b3IuICBUaGUgbWVzc2FnZXMgZHJvcHBlZCBpbiB0aGUgZm9yd2FyZGVkIGludGVycnVwdAorCSAqIHF1ZXVlIHdpbGwgaW5kaWNhdGUgd2hpY2ggaW5ncmVzcyBxdWV1ZSBuZWVkcyBzZXJ2aWNpbmcgLi4uICBUaGlzCisJICogcXVldWUgbmVlZHMgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGFsbCBvZiB0aGUgaW5ncmVzcworCSAqIHF1ZXVlcyB3aGljaCBhcmUgZm9yd2FyZGluZyB0aGVpciBpbnRlcnJ1cHQgKCsxIHRvIHByZXZlbnQgdGhlIFBJRFgKKwkgKiBmcm9tIGVxdWFsbGluZyB0aGUgQ0lEWCBpZiBldmVyeSBpbmdyZXNzIHF1ZXVlIGhhcyBhbiBvdXRzdGFuZGluZworCSAqIGludGVycnVwdCkuICBUaGUgcXVldWUgZG9lc24ndCBuZWVkIHRvIGJlIGFueSBsYXJnZXIgYmVjYXVzZSBubworCSAqIGluZ3Jlc3MgcXVldWUgd2lsbCBldmVyIGhhdmUgbW9yZSB0aGFuIG9uZSBvdXRzdGFuZGluZyBpbnRlcnJ1cHQgYXQKKwkgKiBhbnkgdGltZSAuLi4KKwkgKi8KKwlpbml0X3JzcHEoJnMtPmludHJxLCBTR0VfVElNRVJfUlNUUlRfQ05UUiwgMCwgTVNJWF9FTlRSSUVTICsgMSwKKwkJICBMMV9DQUNIRV9CWVRFUyk7Cit9CisKKy8qCisgKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBFdGhlcm5ldCBxdWV1ZXMgYWNyb3NzIGFsbCBwb3J0cyB0byBhdCBtb3N0IG4uCisgKiBuIHByb3ZpZGVzIGF0IGxlYXN0IG9uZSBxdWV1ZSBwZXIgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHJlZHVjZV9ldGhxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IG4pCit7CisJaW50IGk7CisJc3RydWN0IHBvcnRfaW5mbyAqcGk7CisKKwkvKgorCSAqIFdoaWxlIHdlIGhhdmUgdG9vIG1hbnkgYWN0aXZlIEV0aGVyIFF1ZXVlIFNldHMsIGludGVyYXRlIGFjcm9zcyB0aGUKKwkgKiAicG9ydHMiIGFuZCByZWR1Y2UgdGhlaXIgaW5kaXZpZHVhbCBRdWV1ZSBTZXQgYWxsb2NhdGlvbnMuCisJICovCisJQlVHX09OKG4gPCBhZGFwdGVyLT5wYXJhbXMubnBvcnRzKTsKKwl3aGlsZSAobiA8IGFkYXB0ZXItPnNnZS5ldGhxc2V0cykKKwkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCQlwaSA9IGFkYXAycGluZm8oYWRhcHRlciwgaSk7CisJCQlpZiAocGktPm5xc2V0cyA+IDEpIHsKKwkJCQlwaS0+bnFzZXRzLS07CisJCQkJYWRhcHRlci0+c2dlLmV0aHFzZXRzLS07CisJCQkJaWYgKGFkYXB0ZXItPnNnZS5ldGhxc2V0cyA8PSBuKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJLyoKKwkgKiBSZWFzc2lnbiB0aGUgc3RhcnRpbmcgUXVldWUgU2V0cyBmb3IgZWFjaCBvZiB0aGUgInBvcnRzIiAuLi4KKwkgKi8KKwluID0gMDsKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpOworCQlwaS0+Zmlyc3RfcXNldCA9IG47CisJCW4gKz0gcGktPm5xc2V0czsKKwl9Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIGdyYWIgZW5vdWdoIE1TSS1YIHZlY3RvcnMgdG8gY292ZXIgb3VyIGludGVycnVwdCBuZWVkcy4gIElkZWFsbHkKKyAqIHdlIGdldCBhIHNlcGFyYXRlIE1TSS1YIHZlY3RvciBmb3IgZXZlcnkgIlF1ZXVlIFNldCIgcGx1cyBhbnkgZXh0cmFzIHdlCisgKiBuZWVkLiAgTWluaW1hbGx5IHdlIG5lZWQgb25lIGZvciBldmVyeSBWaXJ0dWFsIEludGVyZmFjZSBwbHVzIHRob3NlIG5lZWRlZAorICogZm9yIG91ciAiZXh0cmFzIi4gIE5vdGUgdGhhdCB0aGlzIHByb2Nlc3MgbWF5IGxvd2VyIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICogYWxsb3dlZCBRdWV1ZSBTZXRzIC4uLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbmFibGVfbXNpeChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaSwgZXJyLCB3YW50LCBuZWVkOworCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbTVNJWF9FTlRSSUVTXTsKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKworCWZvciAoaSA9IDA7IGkgPCBNU0lYX0VOVFJJRVM7ICsraSkKKwkJZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwkvKgorCSAqIFdlIF93YW50XyBlbm91Z2ggTVNJLVggaW50ZXJydXB0cyB0byBjb3ZlciBhbGwgb2Ygb3VyICJRdWV1ZSBTZXRzIgorCSAqIHBsdXMgdGhvc2UgbmVlZGVkIGZvciBvdXIgImV4dHJhcyIgKGZvciBleGFtcGxlLCB0aGUgZmlybXdhcmUKKwkgKiBtZXNzYWdlIHF1ZXVlKS4gIFdlIF9uZWVkXyBhdCBsZWFzdCBvbmUgIlF1ZXVlIFNldCIgcGVyIFZpcnR1YWwKKwkgKiBJbnRlcmZhY2UgcGx1cyB0aG9zZSBuZWVkZWQgZm9yIG91ciAiZXh0cmFzIi4gIFNvIG5vdyB3ZSBnZXQgdG8gc2VlCisJICogaWYgdGhlIHNvbmcgaXMgcmlnaHQgLi4uCisJICovCisJd2FudCA9IHMtPm1heF9ldGhxc2V0cyArIE1TSVhfRVhUUkFTOworCW5lZWQgPSBhZGFwdGVyLT5wYXJhbXMubnBvcnRzICsgTVNJWF9FWFRSQVM7CisJd2hpbGUgKChlcnIgPSBwY2lfZW5hYmxlX21zaXgoYWRhcHRlci0+cGRldiwgZW50cmllcywgd2FudCkpID49IG5lZWQpCisJCXdhbnQgPSBlcnI7CisKKwlpZiAoZXJyID09IDApIHsKKwkJaW50IG5xc2V0cyA9IHdhbnQgLSBNU0lYX0VYVFJBUzsKKwkJaWYgKG5xc2V0cyA8IHMtPm1heF9ldGhxc2V0cykgeworCQkJZGV2X3dhcm4oYWRhcHRlci0+cGRldl9kZXYsICJvbmx5IGVub3VnaCBNU0ktWCB2ZWN0b3JzIgorCQkJCSAiIGZvciAlZCBRdWV1ZSBTZXRzXG4iLCBucXNldHMpOworCQkJcy0+bWF4X2V0aHFzZXRzID0gbnFzZXRzOworCQkJaWYgKG5xc2V0cyA8IHMtPmV0aHFzZXRzKQorCQkJCXJlZHVjZV9ldGhxcyhhZGFwdGVyLCBucXNldHMpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB3YW50OyArK2kpCisJCQlhZGFwdGVyLT5tc2l4X2luZm9baV0udmVjID0gZW50cmllc1tpXS52ZWN0b3I7CisJfSBlbHNlIGlmIChlcnIgPiAwKSB7CisJCXBjaV9kaXNhYmxlX21zaXgoYWRhcHRlci0+cGRldik7CisJCWRldl9pbmZvKGFkYXB0ZXItPnBkZXZfZGV2LCAib25seSAlZCBNU0ktWCB2ZWN0b3JzIGxlZnQsIgorCQkJICIgbm90IHVzaW5nIE1TSS1YXG4iLCBlcnIpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjeGdiNHZmX25ldGRldl9vcHMJPSB7CisJLm5kb19vcGVuCQk9IGN4Z2I0dmZfb3BlbiwKKwkubmRvX3N0b3AJCT0gY3hnYjR2Zl9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdAkJPSB0NHZmX2V0aF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGN4Z2I0dmZfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X3J4X21vZGUJPSBjeGdiNHZmX3NldF9yeG1vZGUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBjeGdiNHZmX3NldF9tYWNfYWRkciwKKwkubmRvX3NlbGVjdF9xdWV1ZQk9IGN4Z2I0dmZfc2VsZWN0X3F1ZXVlLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fZG9faW9jdGwJCT0gY3hnYjR2Zl9kb19pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gY3hnYjR2Zl9jaGFuZ2VfbXR1LAorCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGN4Z2I0dmZfdmxhbl9yeF9yZWdpc3RlciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gY3hnYjR2Zl9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKK307CisjZW5kaWYKKworLyoKKyAqICJQcm9iZSIgYSBkZXZpY2U6IGluaXRpYWxpemUgYSBkZXZpY2UgYW5kIGNvbnN0cnVjdCBhbGwga2VybmVsIGFuZCBkcml2ZXIKKyAqIHN0YXRlIG5lZWRlZCB0byBtYW5hZ2UgdGhlIGRldmljZS4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgImluaXRfb25lIiBpbgorICogdGhlIFBGIERyaXZlciAuLi4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgY3hnYjR2Zl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisKKwlpbnQgcGNpX3VzaW5nX2RhYzsKKwlpbnQgZXJyLCBwaWR4OworCXVuc2lnbmVkIGludCBwbWFzazsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJLyoKKwkgKiBWZXQgb3VyIG1vZHVsZSBwYXJhbWV0ZXJzLgorCSAqLworCWlmIChtc2kgIT0gTVNJX01TSVggJiYgbXNpICE9IE1TSV9NU0kpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYmFkIG1vZHVsZSBwYXJhbWV0ZXIgbXNpPSVkOyBtdXN0IGJlICVkIgorCQkJIiAoTVNJLVggb3IgTVNJKSBvciAlZCAoTVNJKVxuIiwgbXNpLCBNU0lfTVNJWCwKKwkJCU1TSV9NU0kpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiBQcmludCBvdXIgZHJpdmVyIGJhbm5lciB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBhCisJICogZGV2aWNlLgorCSAqLworCWlmICh2ZXJzaW9uX3ByaW50ZWQgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlcyAtIHZlcnNpb24gJXNcbiIsIERSVl9ERVNDLCBEUlZfVkVSU0lPTik7CisJCXZlcnNpb25fcHJpbnRlZCA9IDE7CisJfQorCisJLyoKKwkgKiBSZXNlcnZlIFBDSSByZXNvdXJjZXMgZm9yIHRoZSBkZXZpY2UuICBJZiB3ZSBjYW4ndCBnZXQgdGhlbSBzb21lCisJICogb3RoZXIgZHJpdmVyIG1heSBoYXZlIGFscmVhZHkgY2xhaW1lZCB0aGUgZGV2aWNlIC4uLgorCSAqLworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgS0JVSUxEX01PRE5BTUUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgZ2VuZXJpYyBQQ0kgZGV2aWNlIHN0YXRlLgorCSAqLworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb25zOworCX0KKworCS8qCisJICogU2V0IHVwIG91ciBETUEgbWFzazogdHJ5IGZvciA2NC1iaXQgYWRkcmVzcyBtYXNraW5nIGZpcnN0IGFuZAorCSAqIGZhbGwgYmFjayB0byAzMi1iaXQgaWYgd2UgY2FuJ3QgZ2V0IDY0IGJpdHMgLi4uCisJICovCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAoZXJyID09IDApIHsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gb2J0YWluIDY0LWJpdCBETUEgZm9yIgorCQkJCSIgY29oZXJlbnQgYWxsb2NhdGlvbnNcbiIpOworCQkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIpOworCQkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwkJcGNpX3VzaW5nX2RhYyA9IDA7CisJfQorCisJLyoKKwkgKiBFbmFibGUgYnVzIG1hc3RlcmluZyBmb3IgdGhlIGRldmljZSAuLi4KKwkgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qCisJICogQWxsb2NhdGUgb3VyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUgYW5kIGF0dGFjaCBpdCB0byB0aGUgZGV2aWNlLgorCSAqLworCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZigqYWRhcHRlciksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKwl9CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCWFkYXB0ZXItPnBkZXYgPSBwZGV2OworCWFkYXB0ZXItPnBkZXZfZGV2ID0gJnBkZXYtPmRldjsKKworCS8qCisJICogSW5pdGlhbGl6ZSBTTVAgZGF0YSBzeW5jaHJvbml6YXRpb24gcmVzb3VyY2VzLgorCSAqLworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKKworCS8qCisJICogTWFwIG91ciBJL08gcmVnaXN0ZXJzIGluIEJBUjAuCisJICovCisJYWRhcHRlci0+cmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwlpZiAoIWFkYXB0ZXItPnJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9hZGFwdGVyOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBhZGFwdGVyIGxldmVsIGZlYXR1cmVzLgorCSAqLworCWFkYXB0ZXItPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwlhZGFwdGVyLT5tc2dfZW5hYmxlID0gZGZsdF9tc2dfZW5hYmxlOworCWVyciA9IGFkYXBfaW5pdDAoYWRhcHRlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJfdW5tYXBfYmFyOworCisJLyoKKwkgKiBBbGxvY2F0ZSBvdXIgImFkYXB0ZXIgcG9ydHMiIGFuZCBzdGl0Y2ggZXZlcnl0aGluZyB0b2dldGhlci4KKwkgKi8KKwlwbWFzayA9IGFkYXB0ZXItPnBhcmFtcy52ZnJlcy5wbWFzazsKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIHBpZHgpIHsKKwkJaW50IHBvcnRfaWQsIHZpaWQ7CisKKwkJLyoKKwkJICogV2Ugc2ltcGxpc3RpY2FsbHkgYWxsb2NhdGUgb3VyIHZpcnR1YWwgaW50ZXJmYWNlcworCQkgKiBzZXF1ZW50aWFsbHkgYWNyb3NzIHRoZSBwb3J0IG51bWJlcnMgdG8gd2hpY2ggd2UgaGF2ZQorCQkgKiBhY2Nlc3MgcmlnaHRzLiAgVGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlIGluIHNvbWUgbWFubmVyCisJCSAqIC4uLgorCQkgKi8KKwkJaWYgKHBtYXNrID09IDApCisJCQlicmVhazsKKwkJcG9ydF9pZCA9IGZmcyhwbWFzaykgLSAxOworCQlwbWFzayAmPSB+KDEgPDwgcG9ydF9pZCk7CisJCXZpaWQgPSB0NHZmX2FsbG9jX3ZpKGFkYXB0ZXIsIHBvcnRfaWQpOworCQlpZiAodmlpZCA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBWSSBmb3IgcG9ydCAlZDoiCisJCQkJIiBlcnI9JWRcbiIsIHBvcnRfaWQsIHZpaWQpOworCQkJZXJyID0gdmlpZDsKKwkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQl9CisKKwkJLyoKKwkJICogQWxsb2NhdGUgb3VyIG5ldHdvcmsgZGV2aWNlIGFuZCBzdGl0Y2ggdGhpbmdzIHRvZ2V0aGVyLgorCQkgKi8KKwkJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBwb3J0X2luZm8pLAorCQkJCQkgICBNQVhfUE9SVF9RU0VUUyk7CisJCWlmIChuZXRkZXYgPT0gTlVMTCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIG5ldGRldiBmb3IiCisJCQkJIiBwb3J0ICVkXG4iLCBwb3J0X2lkKTsKKwkJCXQ0dmZfZnJlZV92aShhZGFwdGVyLCB2aWlkKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9mcmVlX2RldjsKKwkJfQorCQlhZGFwdGVyLT5wb3J0W3BpZHhdID0gbmV0ZGV2OworCQlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCQlwaSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJCXBpLT5hZGFwdGVyID0gYWRhcHRlcjsKKwkJcGktPnBpZHggPSBwaWR4OworCQlwaS0+cG9ydF9pZCA9IHBvcnRfaWQ7CisJCXBpLT52aWlkID0gdmlpZDsKKworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBzdGFydGluZyBzdGF0ZSBvZiBvdXIgInBvcnQiIGFuZCByZWdpc3RlcgorCQkgKiBpdC4KKwkJICovCisJCXBpLT54YWN0X2FkZHJfZmlsdCA9IC0xOworCQlwaS0+cnhfb2ZmbG9hZCA9IFJYX0NTTzsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJCW5ldGRldi0+aXJxID0gcGRldi0+aXJxOworCisJCW5ldGRldi0+ZmVhdHVyZXMgPSAoTkVUSUZfRl9TRyB8IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHwKKwkJCQkgICAgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfAorCQkJCSAgICBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlggfAorCQkJCSAgICBORVRJRl9GX0dSTyk7CisJCWlmIChwY2lfdXNpbmdfZGFjKQorCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJCW5ldGRldi0+dmxhbl9mZWF0dXJlcyA9CisJCQkobmV0ZGV2LT5mZWF0dXJlcyAmCisJCQkgfihORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlgpKTsKKworI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKKwkJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmN4Z2I0dmZfbmV0ZGV2X29wczsKKyNlbHNlCisJCW5ldGRldi0+dmxhbl9yeF9yZWdpc3RlciA9IGN4Z2I0dmZfdmxhbl9yeF9yZWdpc3RlcjsKKwkJbmV0ZGV2LT5vcGVuID0gY3hnYjR2Zl9vcGVuOworCQluZXRkZXYtPnN0b3AgPSBjeGdiNHZmX3N0b3A7CisJCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gdDR2Zl9ldGhfeG1pdDsKKwkJbmV0ZGV2LT5nZXRfc3RhdHMgPSBjeGdiNHZmX2dldF9zdGF0czsKKwkJbmV0ZGV2LT5zZXRfcnhfbW9kZSA9IGN4Z2I0dmZfc2V0X3J4bW9kZTsKKwkJbmV0ZGV2LT5kb19pb2N0bCA9IGN4Z2I0dmZfZG9faW9jdGw7CisJCW5ldGRldi0+Y2hhbmdlX210dSA9IGN4Z2I0dmZfY2hhbmdlX210dTsKKwkJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBjeGdiNHZmX3NldF9tYWNfYWRkcjsKKwkJbmV0ZGV2LT5zZWxlY3RfcXVldWUgPSBjeGdiNHZmX3NlbGVjdF9xdWV1ZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCQluZXRkZXYtPnBvbGxfY29udHJvbGxlciA9IGN4Z2I0dmZfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisjZW5kaWYKKwkJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmN4Z2I0dmZfZXRodG9vbF9vcHMpOworCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIHN0YXRlIGZvciB0aGUgcG9ydC4KKwkJICovCisJCWVyciA9IHQ0dmZfcG9ydF9pbml0KGFkYXB0ZXIsIHBpZHgpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgaW5pdGlhbGl6ZSBwb3J0ICVkXG4iLAorCQkJCXBpZHgpOworCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSAiY2FyZCIgaXMgbm93IHJlYWR5IHRvIGdvLiAgSWYgYW55IGVycm9ycyBvY2N1ciBkdXJpbmcgZGV2aWNlCisJICogcmVnaXN0cmF0aW9uIHdlIGRvIG5vdCBmYWlsIHRoZSB3aG9sZSAiY2FyZCIgYnV0IHJhdGhlciBwcm9jZWVkCisJICogb25seSB3aXRoIHRoZSBwb3J0cyB3ZSBtYW5hZ2UgdG8gcmVnaXN0ZXIgc3VjY2Vzc2Z1bGx5LiAgSG93ZXZlciB3ZQorCSAqIG11c3QgcmVnaXN0ZXIgYXQgbGVhc3Qgb25lIG5ldCBkZXZpY2UuCisJICovCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBwaWR4KSB7CisJCW5ldGRldiA9IGFkYXB0ZXItPnBvcnRbcGlkeF07CisJCWlmIChuZXRkZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UgJXMsIgorCQkJCSAiIHNraXBwaW5nXG4iLCBuZXRkZXYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlzZXRfYml0KHBpZHgsICZhZGFwdGVyLT5yZWdpc3RlcmVkX2RldmljZV9tYXApOworCX0KKwlpZiAoYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwID09IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIGFueSBuZXQgZGV2aWNlc1xuIik7CisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCX0KKworCS8qCisJICogU2V0IHVwIG91ciBkZWJ1Z2ZzIGVudHJpZXMuCisJICovCisJaWYgKGN4Z2I0dmZfZGVidWdmc19yb290KSB7CisJCWFkYXB0ZXItPmRlYnVnZnNfcm9vdCA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIocGNpX25hbWUocGRldiksCisJCQkJCSAgIGN4Z2I0dmZfZGVidWdmc19yb290KTsKKwkJaWYgKGFkYXB0ZXItPmRlYnVnZnNfcm9vdCA9PSBOVUxMKQorCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyIKKwkJCQkgIiBkaXJlY3RvcnkiKTsKKwkJZWxzZQorCQkJc2V0dXBfZGVidWdmcyhhZGFwdGVyKTsKKwl9CisKKwkvKgorCSAqIFNlZSB3aGF0IGludGVycnVwdHMgd2UnbGwgYmUgdXNpbmcuICBJZiB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8KKwkgKiB1c2UgTVNJLVggaW50ZXJydXB0cywgdHJ5IHRvIGVuYWJsZSB0aGVtIGJ1dCBmYWxsIGJhY2sgdG8gdXNpbmcKKwkgKiBNU0kgaW50ZXJydXB0cyBpZiB3ZSBjYW4ndCBlbmFibGUgTVNJLVggaW50ZXJydXB0cy4gIElmIHdlIGNhbid0CisJICogZ2V0IE1TSSBpbnRlcnJ1cHRzIHdlIGJhaWwgd2l0aCB0aGUgZXJyb3IuCisJICovCisJaWYgKG1zaSA9PSBNU0lfTVNJWCAmJiBlbmFibGVfbXNpeChhZGFwdGVyKSA9PSAwKQorCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0lYOworCWVsc2UgeworCQllcnIgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlICVzIGludGVycnVwdHM7IgorCQkJCSIgZXJyPSVkXG4iLAorCQkJCW1zaSA9PSBNU0lfTVNJWCA/ICJNU0ktWCBvciBNU0kiIDogIk1TSSIsIGVycik7CisJCQlnb3RvIGVycl9mcmVlX2RlYnVnZnM7CisJCX0KKwkJYWRhcHRlci0+ZmxhZ3MgfD0gVVNJTkdfTVNJOworCX0KKworCS8qCisJICogTm93IHRoYXQgd2Uga25vdyBob3cgbWFueSAicG9ydHMiIHdlIGhhdmUgYW5kIHdoYXQgdGhlaXIgdHlwZXMgYXJlLAorCSAqIGFuZCBob3cgbWFueSBRdWV1ZSBTZXRzIHdlIGNhbiBzdXBwb3J0LCB3ZSBjYW4gY29uZmlndXJlIG91ciBxdWV1ZQorCSAqIHJlc291cmNlcy4KKwkgKi8KKwljZmdfcXVldWVzKGFkYXB0ZXIpOworCisJLyoKKwkgKiBQcmludCBhIHNob3J0IG5vdGljZSBvbiB0aGUgZXhpc3RhbmNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBuZXcKKwkgKiBWRiBuZXR3b3JrIGRldmljZSAuLi4KKwkgKi8KKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIHBpZHgpIHsKKwkJZGV2X2luZm8oYWRhcHRlci0+cGRldl9kZXYsICIlczogQ2hlbHNpbyBWRiBOSUMgUENJZSAlc1xuIiwKKwkJCSBhZGFwdGVyLT5wb3J0W3BpZHhdLT5uYW1lLAorCQkJIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpID8gIk1TSS1YIiA6CisJCQkgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJKSAgPyAiTVNJIiA6ICIiKTsKKwl9CisKKwkvKgorCSAqIFJldHVybiBzdWNjZXNzIQorCSAqLworCXJldHVybiAwOworCisJLyoKKwkgKiBFcnJvciByZWNvdmVyeSBhbmQgZXhpdCBjb2RlLiAgVW53aW5kIHN0YXRlIHRoYXQncyBiZWVuIGNyZWF0ZWQKKwkgKiBzbyBmYXIgYW5kIHJldHVybiB0aGUgZXJyb3IuCisJICovCisKK2Vycl9mcmVlX2RlYnVnZnM6CisJaWYgKGFkYXB0ZXItPmRlYnVnZnNfcm9vdCkgeworCQljbGVhbnVwX2RlYnVnZnMoYWRhcHRlcik7CisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShhZGFwdGVyLT5kZWJ1Z2ZzX3Jvb3QpOworCX0KKworZXJyX2ZyZWVfZGV2OgorCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcGlkeCkgeworCQluZXRkZXYgPSBhZGFwdGVyLT5wb3J0W3BpZHhdOworCQlpZiAobmV0ZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGkgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCQl0NHZmX2ZyZWVfdmkoYWRhcHRlciwgcGktPnZpaWQpOworCQlpZiAodGVzdF9iaXQocGlkeCwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkpCisJCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCQlmcmVlX25ldGRldihuZXRkZXYpOworCX0KKworZXJyX3VubWFwX2JhcjoKKwlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCitlcnJfZnJlZV9hZGFwdGVyOgorCWtmcmVlKGFkYXB0ZXIpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworZXJyX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfY2xlYXJfbWFzdGVyKHBkZXYpOworCitlcnJfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiAiUmVtb3ZlIiBhIGRldmljZTogdGVhciBkb3duIGFsbCBrZXJuZWwgYW5kIGRyaXZlciBzdGF0ZSBjcmVhdGVkIGluIHRoZQorICogInByb2JlIiByb3V0aW5lIGFuZCBxdWllc2NlIHRoZSBkZXZpY2UgKGRpc2FibGUgaW50ZXJydXB0cywgZXRjLikuICAoTm90ZQorICogdGhhdCB0aGlzIGlzIGNhbGxlZCAicmVtb3ZlX29uZSIgaW4gdGhlIFBGIERyaXZlci4pCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjeGdiNHZmX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwkvKgorCSAqIFRlYXIgZG93biBkcml2ZXIgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGRldmljZS4KKwkgKi8KKwlpZiAoYWRhcHRlcikgeworCQlpbnQgcGlkeDsKKworCQkvKgorCQkgKiBTdG9wIGFsbCBvZiBvdXIgYWN0aXZpdHkuICBVbnJlZ2lzdGVyIG5ldHdvcmsgcG9ydCwKKwkJICogZGlzYWJsZSBpbnRlcnJ1cHRzLCBldGMuCisJCSAqLworCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIHBpZHgpCisJCQlpZiAodGVzdF9iaXQocGlkeCwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkpCisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+cG9ydFtwaWR4XSk7CisJCXQ0dmZfc2dlX3N0b3AoYWRhcHRlcik7CisJCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKKwkJCXBjaV9kaXNhYmxlX21zaXgoYWRhcHRlci0+cGRldik7CisJCQlhZGFwdGVyLT5mbGFncyAmPSB+VVNJTkdfTVNJWDsKKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSSkgeworCQkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCQkJYWRhcHRlci0+ZmxhZ3MgJj0gflVTSU5HX01TSTsKKwkJfQorCisJCS8qCisJCSAqIFRlYXIgZG93biBvdXIgZGVidWdmcyBlbnRyaWVzLgorCQkgKi8KKwkJaWYgKGFkYXB0ZXItPmRlYnVnZnNfcm9vdCkgeworCQkJY2xlYW51cF9kZWJ1Z2ZzKGFkYXB0ZXIpOworCQkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGFkYXB0ZXItPmRlYnVnZnNfcm9vdCk7CisJCX0KKworCQkvKgorCQkgKiBGcmVlIGFsbCBvZiB0aGUgdmFyaW91cyByZXNvdXJjZXMgd2hpY2ggd2UndmUgYWNxdWlyZWQgLi4uCisJCSAqLworCQl0NHZmX2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBwaWR4KSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+cG9ydFtwaWR4XTsKKwkJCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJCQlpZiAobmV0ZGV2ID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXBpID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwkJCXQ0dmZfZnJlZV92aShhZGFwdGVyLCBwaS0+dmlpZCk7CisJCQlmcmVlX25ldGRldihuZXRkZXYpOworCQl9CisJCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CisJCWtmcmVlKGFkYXB0ZXIpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorCisJLyoKKwkgKiBEaXNhYmxlIHRoZSBkZXZpY2UgYW5kIHJlbGVhc2UgaXRzIFBDSSByZXNvdXJjZXMuCisJICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK30KKworLyoKKyAqIFBDSSBEZXZpY2UgcmVnaXN0cmF0aW9uIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2RlZmluZSBDSF9ERVZJQ0UoZGV2aWQsIGlkeCkgXAorCXsgUENJX1ZFTkRPUl9JRF9DSEVMU0lPLCBkZXZpZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWR4IH0KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN4Z2I0dmZfcGNpX3RibFtdID0geworCUNIX0RFVklDRSgweGIwMDAsIDApLAkvKiBQRTEwSyBGUEdBICovCisJQ0hfREVWSUNFKDB4NDgwMCwgMCksCS8qIFQ0NDAtZGJnICovCisJQ0hfREVWSUNFKDB4NDgwMSwgMCksCS8qIFQ0MjAtY3IgKi8KKwlDSF9ERVZJQ0UoMHg0ODAyLCAwKSwJLyogVDQyMi1jciAqLworCXsgMCwgfQorfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDKTsKK01PRFVMRV9BVVRIT1IoIkNoZWxzaW8gQ29tbXVuaWNhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjeGdiNHZmX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3hnYjR2Zl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gS0JVSUxEX01PRE5BTUUsCisJLmlkX3RhYmxlCT0gY3hnYjR2Zl9wY2lfdGJsLAorCS5wcm9iZQkJPSBjeGdiNHZmX3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGN4Z2I0dmZfcGNpX3JlbW92ZSksCit9OworCisvKgorICogSW5pdGlhbGl6ZSBnbG9iYWwgZHJpdmVyIHN0YXRlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjeGdiNHZmX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIERlYnVnZnMgc3VwcG9ydCBpcyBvcHRpb25hbCwganVzdCB3YXJuIGlmIHRoaXMgZmFpbHMgKi8KKwljeGdiNHZmX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihLQlVJTERfTU9ETkFNRSwgTlVMTCk7CisJaWYgKCFjeGdiNHZmX2RlYnVnZnNfcm9vdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBLQlVJTERfTU9ETkFNRSAiOiBjb3VsZCBub3QgY3JlYXRlIgorCQkgICAgICAgIiBkZWJ1Z2ZzIGVudHJ5LCBjb250aW51aW5nXG4iKTsKKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4Z2I0dmZfZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZGVidWdmc19yZW1vdmUoY3hnYjR2Zl9kZWJ1Z2ZzX3Jvb3QpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUZWFyIGRvd24gZ2xvYmFsIGRyaXZlciBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGN4Z2I0dmZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN4Z2I0dmZfZHJpdmVyKTsKKwlkZWJ1Z2ZzX3JlbW92ZShjeGdiNHZmX2RlYnVnZnNfcm9vdCk7Cit9CisKK21vZHVsZV9pbml0KGN4Z2I0dmZfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoY3hnYjR2Zl9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNHZmL3NnZS5jIGIvZHJpdmVycy9uZXQvY3hnYjR2Zi9zZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjVhMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3hnYjR2Zi9zZ2UuYwpAQCAtMCwwICsxLDI0NTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBQQ0ktRSBTUi1JT1YgVmlydHVhbCBGdW5jdGlvbiBFdGhlcm5ldAorICogZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidDR2Zl9jb21tb24uaCIKKyNpbmNsdWRlICJ0NHZmX2RlZnMuaCIKKworI2luY2x1ZGUgIi4uL2N4Z2I0L3Q0X3JlZ3MuaCIKKyNpbmNsdWRlICIuLi9jeGdiNC90NGZ3X2FwaS5oIgorI2luY2x1ZGUgIi4uL2N4Z2I0L3Q0X21zZy5oIgorCisvKgorICogRGVjb2RlZCBBZGFwdGVyIFBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB1MzIgRkxfUEdfT1JERVI7CQkvKiBsYXJnZSBwYWdlIGFsbG9jYXRpb24gc2l6ZSAqLworc3RhdGljIHUzMiBTVEFUX0xFTjsJCS8qIGxlbmd0aCBvZiBzdGF0dXMgcGFnZSBhdCByaW5nIGVuZCAqLworc3RhdGljIHUzMiBQS1RTSElGVDsJCS8qIHBhZGRpbmcgYmV0d2VlbiBDUEwgYW5kIHBhY2tldCBkYXRhICovCitzdGF0aWMgdTMyIEZMX0FMSUdOOwkJLyogcmVzcG9uc2UgcXVldWUgbWVzc2FnZSBhbGlnbm1lbnQgKi8KKworLyoKKyAqIENvbnN0YW50cyAuLi4KKyAqLworZW51bSB7CisJLyoKKwkgKiBFZ3Jlc3MgUXVldWUgc2l6ZXMsIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpbmRpY2VzIGFyZSBhbGwgaW4gdW5pdHMKKwkgKiBvZiBFZ3Jlc3MgQ29udGV4dCBVbml0cyBieXRlcy4gIE5vdGUgdGhhdCBhcyBmYXIgYXMgdGhlIGhhcmR3YXJlIGlzCisJICogY29uY2VybmVkLCB0aGUgZnJlZSBsaXN0IGlzIGFuIEVncmVzcyBRdWV1ZSAodGhlIGhvc3QgcHJvZHVjZXMgZnJlZQorCSAqIGJ1ZmZlcnMgd2hpY2ggdGhlIGhhcmR3YXJlIGNvbnN1bWVzKSBhbmQgZnJlZSBsaXN0IGVudHJpZXMgYXJlCisJICogNjQtYml0IFBDSSBETUEgYWRkcmVzc2VzLgorCSAqLworCUVRX1VOSVQgPSBTR0VfRVFfSURYU0laRSwKKwlGTF9QRVJfRVFfVU5JVCA9IEVRX1VOSVQgLyBzaXplb2YoX19iZTY0KSwKKwlUWERfUEVSX0VRX1VOSVQgPSBFUV9VTklUIC8gc2l6ZW9mKF9fYmU2NCksCisKKwkvKgorCSAqIE1heCBudW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgd2UgY2xlYW4gdXAgYXQgYSB0aW1lLiAgU2hvdWxkIGJlCisJICogbW9kZXN0IGFzIGZyZWVpbmcgc2ticyBpc24ndCBjaGVhcCBhbmQgaXQgaGFwcGVucyB3aGlsZSBob2xkaW5nCisJICogbG9ja3MuICBXZSBqdXN0IG5lZWQgdG8gZnJlZSBwYWNrZXRzIGZhc3RlciB0aGFuIHRoZXkgYXJyaXZlLCB3ZQorCSAqIGV2ZW50dWFsbHkgY2F0Y2ggdXAgYW5kIGtlZXAgdGhlIGFtb3J0aXplZCBjb3N0IHJlYXNvbmFibGUuCisJICovCisJTUFYX1RYX1JFQ0xBSU0gPSAxNiwKKworCS8qCisJICogTWF4IG51bWJlciBvZiBSeCBidWZmZXJzIHdlIHJlcGxlbmlzaCBhdCBhIHRpbWUuICBBZ2FpbiBrZWVwIHRoaXMKKwkgKiBtb2Rlc3QsIGFsbG9jYXRpbmcgYnVmZmVycyBpc24ndCBjaGVhcCBlaXRoZXIuCisJICovCisJTUFYX1JYX1JFRklMTCA9IDE2LAorCisJLyoKKwkgKiBQZXJpb2Qgb2YgdGhlIFJ4IHF1ZXVlIGNoZWNrIHRpbWVyLiAgVGhpcyB0aW1lciBpcyBpbmZyZXF1ZW50IGFzIGl0CisJICogaGFzIHNvbWV0aGluZyB0byBkbyBvbmx5IHdoZW4gdGhlIHN5c3RlbSBleHBlcmllbmNlcyBzZXZlcmUgbWVtb3J5CisJICogc2hvcnRhZ2UuCisJICovCisJUlhfUUNIRUNLX1BFUklPRCA9IChIWiAvIDIpLAorCisJLyoKKwkgKiBQZXJpb2Qgb2YgdGhlIFRYIHF1ZXVlIGNoZWNrIHRpbWVyIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgVFgKKwkgKiBkZXNjcmlwdG9ycyB0byBiZSByZWNsYWltZWQgYnkgdGhlIFRYIHRpbWVyLgorCSAqLworCVRYX1FDSEVDS19QRVJJT0QgPSAoSFogLyAyKSwKKwlNQVhfVElNRVJfVFhfUkVDTEFJTSA9IDEwMCwKKworCS8qCisJICogQW4gRkwgd2l0aCA8PSBGTF9TVEFSVkVfVEhSRVMgYnVmZmVycyBpcyBzdGFydmluZyBhbmQgYSBwZXJpb2RpYworCSAqIHRpbWVyIHdpbGwgYXR0ZW1wdCB0byByZWZpbGwgaXQuCisJICovCisJRkxfU1RBUlZFX1RIUkVTID0gNCwKKworCS8qCisJICogU3VzcGVuZCBhbiBFdGhlcm5ldCBUWCBxdWV1ZSB3aXRoIGZld2VyIGF2YWlsYWJsZSBkZXNjcmlwdG9ycyB0aGFuCisJICogdGhpcy4gIFdlIGFsd2F5cyB3YW50IHRvIGhhdmUgcm9vbSBmb3IgYSBtYXhpbXVtIHNpemVkIHBhY2tldDoKKwkgKiBpbmxpbmUgaW1tZWRpYXRlIGRhdGEgKyBNQVhfU0tCX0ZSQUdTLiBUaGlzIGlzIHRoZSBzYW1lIGFzCisJICogY2FsY190eF9mbGl0cygpIGZvciBhIFRTTyBwYWNrZXQgd2l0aCBucl9mcmFncyA9PSBNQVhfU0tCX0ZSQUdTCisJICogKHNlZSB0aGF0IGZ1bmN0aW9uIGFuZCBpdHMgaGVscGVycyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKwkgKiBjYWxjdWxhdGlvbikuCisJICovCisJRVRIVFhRX01BWF9GUkFHUyA9IE1BWF9TS0JfRlJBR1MgKyAxLAorCUVUSFRYUV9NQVhfU0dMX0xFTiA9ICgoMyAqIChFVEhUWFFfTUFYX0ZSQUdTLTEpKS8yICsKKwkJCQkgICAoKEVUSFRYUV9NQVhfRlJBR1MtMSkgJiAxKSArCisJCQkJICAgMiksCisJRVRIVFhRX01BWF9IRFIgPSAoc2l6ZW9mKHN0cnVjdCBmd19ldGhfdHhfcGt0X3ZtX3dyKSArCisJCQkgIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdF9sc29fY29yZSkgKworCQkJICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3RfY29yZSkpIC8gc2l6ZW9mKF9fYmU2NCksCisJRVRIVFhRX01BWF9GTElUUyA9IEVUSFRYUV9NQVhfU0dMX0xFTiArIEVUSFRYUV9NQVhfSERSLAorCisJRVRIVFhRX1NUT1BfVEhSRVMgPSAxICsgRElWX1JPVU5EX1VQKEVUSFRYUV9NQVhfRkxJVFMsIFRYRF9QRVJfRVFfVU5JVCksCisKKwkvKgorCSAqIE1heCBUWCBkZXNjcmlwdG9yIHNwYWNlIHdlIGFsbG93IGZvciBhbiBFdGhlcm5ldCBwYWNrZXQgdG8gYmUKKwkgKiBpbmxpbmVkIGludG8gYSBXUi4gIFRoaXMgaXMgbGltaXRlZCBieSB0aGUgbWF4aW11bSB2YWx1ZSB3aGljaAorCSAqIHdlIGNhbiBzcGVjaWZ5IGZvciBpbW1lZGlhdGUgZGF0YSBpbiB0aGUgZmlybXdhcmUgRXRoZXJuZXQgVFgKKwkgKiBXb3JrIFJlcXVlc3QuCisJICovCisJTUFYX0lNTV9UWF9QS1RfTEVOID0gRldfV1JfSU1NRExFTl9NQVNLLAorCisJLyoKKwkgKiBNYXggc2l6ZSBvZiBhIFdSIHNlbnQgdGhyb3VnaCBhIGNvbnRyb2wgVFggcXVldWUuCisJICovCisJTUFYX0NUUkxfV1JfTEVOID0gMjU2LAorCisJLyoKKwkgKiBNYXhpbXVtIGFtb3VudCBvZiBkYXRhIHdoaWNoIHdlJ2xsIGV2ZXIgbmVlZCB0byBpbmxpbmUgaW50byBhCisJICogVFggcmluZzogbWF4KE1BWF9JTU1fVFhfUEtUX0xFTiwgTUFYX0NUUkxfV1JfTEVOKS4KKwkgKi8KKwlNQVhfSU1NX1RYX0xFTiA9IChNQVhfSU1NX1RYX1BLVF9MRU4gPiBNQVhfQ1RSTF9XUl9MRU4KKwkJCSAgPyBNQVhfSU1NX1RYX1BLVF9MRU4KKwkJCSAgOiBNQVhfQ1RSTF9XUl9MRU4pLAorCisJLyoKKwkgKiBGb3IgaW5jb21pbmcgcGFja2V0cyBsZXNzIHRoYW4gUlhfQ09QWV9USFJFUywgd2UgY29weSB0aGUgZGF0YSBpbnRvCisJICogYW4gc2tiIHJhdGhlciB0aGFuIHJlZmVyZW5jaW5nIHRoZSBkYXRhLiAgV2UgYWxsb2NhdGUgZW5vdWdoCisJICogaW4tbGluZSByb29tIGluIHNrYidzIHRvIGFjY29tbW9kYXRlIHB1bGxpbmcgaW4gUlhfUFVMTF9MRU4gYnl0ZXMKKwkgKiBvZiB0aGUgZGF0YSAoaGVhZGVyKS4KKwkgKi8KKwlSWF9DT1BZX1RIUkVTID0gMjU2LAorCVJYX1BVTExfTEVOID0gMTI4LAorfTsKKworLyoKKyAqIENhbid0IGRlZmluZSB0aGlzIGluIHRoZSBhYm92ZSBlbnVtIGJlY2F1c2UgUEtUU0hJRlQgaXNuJ3QgYSBjb25zdGFudCBpbgorICogdGhlIFZGIERyaXZlciAuLi4KKyAqLworI2RlZmluZSBSWF9QS1RfUFVMTF9MRU4gKFJYX1BVTExfTEVOICsgUEtUU0hJRlQpCisKKy8qCisgKiBTb2Z0d2FyZSBzdGF0ZSBwZXIgVFggZGVzY3JpcHRvci4KKyAqLworc3RydWN0IHR4X3N3X2Rlc2MgeworCXN0cnVjdCBza19idWZmICpza2I7CQkvKiBzb2NrZXQgYnVmZmVyIG9mIFRYIGRhdGEgc291cmNlICovCisJc3RydWN0IHVscHR4X3NnbCAqc2dsOwkJLyogc2NhdHRlci9nYXRoZXIgbGlzdCBpbiBUWCBRdWV1ZSAqLworfTsKKworLyoKKyAqIFNvZnR3YXJlIHN0YXRlIHBlciBSWCBGcmVlIExpc3QgZGVzY3JpcHRvci4gIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGFsbG9jYXRlZAorICogRkwgcGFnZSwgaXRzIHNpemUsIGFuZCBpdHMgUENJIERNQSBhZGRyZXNzIChpZiB0aGUgcGFnZSBpcyBtYXBwZWQpLiAgVGhlIEZMCisgKiBwYWdlIHNpemUgYW5kIGl0cyBQQ0kgRE1BIG1hcHBlZCBzdGF0ZSBhcmUgc3RvcmVkIGluIHRoZSBsb3cgYml0cyBvZiB0aGUKKyAqIFBDSSBETUEgYWRkcmVzcyBhcyBwZXIgYmVsb3cuCisgKi8KK3N0cnVjdCByeF9zd19kZXNjIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsJCS8qIEZyZWUgTGlzdCBwYWdlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CQkvKiBQQ0kgRE1BIGFkZHJlc3MgKGlmIG1hcHBlZCkgKi8KKwkJCQkJLyogICBhbmQgZmxhZ3MgKHNlZSBiZWxvdykgKi8KK307CisKKy8qCisgKiBUaGUgbG93IGJpdHMgb2Ygcnhfc3dfZGVzYy5kbWFfYWRkciBoYXZlIHNwZWNpYWwgbWVhbmluZy4gIE5vdGUgdGhhdCB0aGUKKyAqIFNHRSBhbHNvIHVzZXMgdGhlIGxvdyA0IGJpdHMgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuICBJdCB1c2VzCisgKiB0aG9zZSBiaXRzIHRvIGluZGV4IGludG8gdGhlIFNHRV9GTF9CVUZGRVJfU0laRVtpbmRleF0gcmVnaXN0ZXIgYXJyYXkuCisgKiBTaW5jZSB3ZSBvbmx5IHVzZSBTR0VfRkxfQlVGRkVSX1NJWkUwIGFuZCBTR0VfRkxfQlVGRkVSX1NJWkUxLCB0aGVzZSBsb3cgNAorICogYml0cyBjYW4gb25seSBjb250YWluIGEgMCBvciBhIDEgdG8gaW5kaWNhdGUgd2hpY2ggc2l6ZSBidWZmZXIgd2UncmUgZ2l2aW5nCisgKiB0byB0aGUgU0dFLiAgVGh1cywgb3VyIHNvZnR3YXJlIHN0YXRlIG9mICJpcyB0aGUgYnVmZmVyIG1hcHBlZCBmb3IgRE1BIiBpcworICogbWFpbnRhaW5lZCBpbiBhbiBpbnZlcnNlIHNlbnNlIHNvIHRoZSBoYXJkd2FyZSBuZXZlciBzZWVzIHRoYXQgYml0IGhpZ2guCisgKi8KK2VudW0geworCVJYX0xBUkdFX0JVRiAgICA9IDEgPDwgMCwJLyogYnVmZmVyIGlzIFNHRV9GTF9CVUZGRVJfU0laRVsxXSAqLworCVJYX1VOTUFQUEVEX0JVRiA9IDEgPDwgMSwJLyogYnVmZmVyIGlzIG5vdCBtYXBwZWQgKi8KK307CisKKy8qKgorICoJZ2V0X2J1Zl9hZGRyIC0gcmV0dXJuIERNQSBidWZmZXIgYWRkcmVzcyBvZiBzb2Z0d2FyZSBkZXNjcmlwdG9yCisgKglAc2Rlc2M6IHBvaW50ZXIgdG8gdGhlIHNvZnR3YXJlIGJ1ZmZlciBkZXNjcmlwdG9yCisgKgorICoJUmV0dXJuIHRoZSBETUEgYnVmZmVyIGFkZHJlc3Mgb2YgYSBzb2Z0d2FyZSBkZXNjcmlwdG9yIChzdHJpcHBpbmcgb3V0CisgKglvdXIgbG93LW9yZGVyIGZsYWcgYml0cykuCisgKi8KK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBnZXRfYnVmX2FkZHIoY29uc3Qgc3RydWN0IHJ4X3N3X2Rlc2MgKnNkZXNjKQoreworCXJldHVybiBzZGVzYy0+ZG1hX2FkZHIgJiB+KGRtYV9hZGRyX3QpKFJYX0xBUkdFX0JVRiB8IFJYX1VOTUFQUEVEX0JVRik7Cit9CisKKy8qKgorICoJaXNfYnVmX21hcHBlZCAtIGlzIGJ1ZmZlciBtYXBwZWQgZm9yIERNQT8KKyAqCUBzZGVzYzogcG9pbnRlciB0byB0aGUgc29mdHdhcmUgYnVmZmVyIGRlc2NyaXB0b3IKKyAqCisgKglEZXRlcm1pbmUgd2hldGhlciB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBhIHNvZnR3YXJlIGRlc2NyaXB0b3IgaW4KKyAqCW1hcHBlZCBmb3IgRE1BIG9yIG5vdC4KKyAqLworc3RhdGljIGlubGluZSBib29sIGlzX2J1Zl9tYXBwZWQoY29uc3Qgc3RydWN0IHJ4X3N3X2Rlc2MgKnNkZXNjKQoreworCXJldHVybiAhKHNkZXNjLT5kbWFfYWRkciAmIFJYX1VOTUFQUEVEX0JVRik7Cit9CisKKy8qKgorICoJbmVlZF9za2JfdW5tYXAgLSBkb2VzIHRoZSBwbGF0Zm9ybSBuZWVkIHVubWFwcGluZyBvZiBza19idWZmcz8KKyAqCisgKglSZXR1cm5zIHRydWUgaWYgdGhlIHBsYXRmcm9tIG5lZWRzIHNrX2J1ZmYgdW5tYXBwaW5nLiAgVGhlIGNvbXBpbGVyCisgKglvcHRpbWl6ZXMgYXdheSB1bmVjZXNzYXJ5IGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5lZWRfc2tiX3VubWFwKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX05FRURfRE1BX01BUF9TVEFURQorCXJldHVybiAxOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioKKyAqCXR4cV9hdmFpbCAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzbG90cyBpbiBhIFRYIHF1ZXVlCisgKglAdHE6IHRoZSBUWCBxdWV1ZQorICoKKyAqCVJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JpcHRvcnMgaW4gYSBUWCBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdHhxX2F2YWlsKGNvbnN0IHN0cnVjdCBzZ2VfdHhxICp0cSkKK3sKKwlyZXR1cm4gdHEtPnNpemUgLSAxIC0gdHEtPmluX3VzZTsKK30KKworLyoqCisgKglmbF9jYXAgLSByZXR1cm4gdGhlIGNhcGFjaXR5IG9mIGEgRnJlZSBMaXN0CisgKglAZmw6IHRoZSBGcmVlIExpc3QKKyAqCisgKglSZXR1cm5zIHRoZSBjYXBhY2l0eSBvZiBhIEZyZWUgTGlzdC4gIFRoZSBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlCisgKglzaXplIGJlY2F1c2UgYW4gRWdyZXNzIFF1ZXVlIEluZGV4IFVuaXQgd29ydGggb2YgZGVzY3JpcHRvcnMgbmVlZHMgdG8KKyAqCWJlIGxlZnQgdW5wb3B1bGF0ZWQsIG90aGVyd2lzZSB0aGUgUHJvZHVjZXIgYW5kIENvbnN1bWVyIGluZGljZXMgUElEWAorICoJYW5kIENJRFggd2lsbCBtYXRjaCBhbmQgdGhlIGhhcmR3YXJlIHdpbGwgdGhpbmsgdGhlIEZMIGlzIGVtcHR5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmbF9jYXAoY29uc3Qgc3RydWN0IHNnZV9mbCAqZmwpCit7CisJcmV0dXJuIGZsLT5zaXplIC0gRkxfUEVSX0VRX1VOSVQ7Cit9CisKKy8qKgorICoJZmxfc3RhcnZpbmcgLSByZXR1cm4gd2hldGhlciBhIEZyZWUgTGlzdCBpcyBzdGFydmluZy4KKyAqCUBmbDogdGhlIEZyZWUgTGlzdAorICoKKyAqCVRlc3RzIHNwZWNpZmllZCBGcmVlIExpc3QgdG8gc2VlIHdoZXRoZXIgdGhlIG51bWJlciBvZiBidWZmZXJzCisgKglhdmFpbGFibGUgdG8gdGhlIGhhcmR3YXJlIGhhcyBmYWxsZWQgYmVsb3cgb3VyICJzdGFydmF0aW9uIgorICoJdGhyZXNoaG9sZC4KKyAqLworc3RhdGljIGlubGluZSBib29sIGZsX3N0YXJ2aW5nKGNvbnN0IHN0cnVjdCBzZ2VfZmwgKmZsKQoreworCXJldHVybiBmbC0+YXZhaWwgLSBmbC0+cGVuZF9jcmVkIDw9IEZMX1NUQVJWRV9USFJFUzsKK30KKworLyoqCisgKgltYXBfc2tiIC0gIG1hcCBhbiBza2IgZm9yIERNQSB0byB0aGUgZGV2aWNlCisgKglAZGV2OiB0aGUgZWdyZXNzIG5ldCBkZXZpY2UKKyAqCUBza2I6IHRoZSBwYWNrZXQgdG8gbWFwCisgKglAYWRkcjogYSBwb2ludGVyIHRvIHRoZSBiYXNlIG9mIHRoZSBETUEgbWFwcGluZyBhcnJheQorICoKKyAqCU1hcCBhbiBza2IgZm9yIERNQSB0byB0aGUgZGV2aWNlIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgRE1BIGFkZHJlc3Nlcy4KKyAqLworc3RhdGljIGludCBtYXBfc2tiKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgZG1hX2FkZHJfdCAqYWRkcikKK3sKKwljb25zdCBza2JfZnJhZ190ICpmcCwgKmVuZDsKKwljb25zdCBzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaTsKKworCSphZGRyID0gZG1hX21hcF9zaW5nbGUoZGV2LCBza2ItPmRhdGEsIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsICphZGRyKSkKKwkJZ290byBvdXRfZXJyOworCisJc2kgPSBza2Jfc2hpbmZvKHNrYik7CisJZW5kID0gJnNpLT5mcmFnc1tzaS0+bnJfZnJhZ3NdOworCWZvciAoZnAgPSBzaS0+ZnJhZ3M7IGZwIDwgZW5kOyBmcCsrKSB7CisJCSorK2FkZHIgPSBkbWFfbWFwX3BhZ2UoZGV2LCBmcC0+cGFnZSwgZnAtPnBhZ2Vfb2Zmc2V0LCBmcC0+c2l6ZSwKKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsICphZGRyKSkKKwkJCWdvdG8gdW53aW5kOworCX0KKwlyZXR1cm4gMDsKKwordW53aW5kOgorCXdoaWxlIChmcC0tID4gc2ktPmZyYWdzKQorCQlkbWFfdW5tYXBfcGFnZShkZXYsICotLWFkZHIsIGZwLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYWRkclstMV0sIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCitvdXRfZXJyOgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9zZ2woc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgdWxwdHhfc2dsICpzZ2wsIGNvbnN0IHN0cnVjdCBzZ2VfdHhxICp0cSkKK3sKKwljb25zdCBzdHJ1Y3QgdWxwdHhfc2dlX3BhaXIgKnA7CisJdW5zaWduZWQgaW50IG5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwlpZiAobGlrZWx5KHNrYl9oZWFkbGVuKHNrYikpKQorCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgYmU2NF90b19jcHUoc2dsLT5hZGRyMCksCisJCQkJIGJlMzJfdG9fY3B1KHNnbC0+bGVuMCksIERNQV9UT19ERVZJQ0UpOworCWVsc2UgeworCQlkbWFfdW5tYXBfcGFnZShkZXYsIGJlNjRfdG9fY3B1KHNnbC0+YWRkcjApLAorCQkJICAgICAgIGJlMzJfdG9fY3B1KHNnbC0+bGVuMCksIERNQV9UT19ERVZJQ0UpOworCQluZnJhZ3MtLTsKKwl9CisKKwkvKgorCSAqIHRoZSBjb21wbGV4aXR5IGJlbG93IGlzIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIGEgd3JhcC1hcm91bmQKKwkgKiBpbiB0aGUgbWlkZGxlIG9mIGFuIFNHTAorCSAqLworCWZvciAocCA9IHNnbC0+c2dlOyBuZnJhZ3MgPj0gMjsgbmZyYWdzIC09IDIpIHsKKwkJaWYgKGxpa2VseSgodTggKikocCArIDEpIDw9ICh1OCAqKXRxLT5zdGF0KSkgewordW5tYXA6CisJCQlkbWFfdW5tYXBfcGFnZShkZXYsIGJlNjRfdG9fY3B1KHAtPmFkZHJbMF0pLAorCQkJCSAgICAgICBiZTMyX3RvX2NwdShwLT5sZW5bMF0pLCBETUFfVE9fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9wYWdlKGRldiwgYmU2NF90b19jcHUocC0+YWRkclsxXSksCisJCQkJICAgICAgIGJlMzJfdG9fY3B1KHAtPmxlblsxXSksIERNQV9UT19ERVZJQ0UpOworCQkJcCsrOworCQl9IGVsc2UgaWYgKCh1OCAqKXAgPT0gKHU4ICopdHEtPnN0YXQpIHsKKwkJCXAgPSAoY29uc3Qgc3RydWN0IHVscHR4X3NnZV9wYWlyICopdHEtPmRlc2M7CisJCQlnb3RvIHVubWFwOworCQl9IGVsc2UgaWYgKCh1OCAqKXAgKyA4ID09ICh1OCAqKXRxLT5zdGF0KSB7CisJCQljb25zdCBfX2JlNjQgKmFkZHIgPSAoY29uc3QgX19iZTY0ICopdHEtPmRlc2M7CisKKwkJCWRtYV91bm1hcF9wYWdlKGRldiwgYmU2NF90b19jcHUoYWRkclswXSksCisJCQkJICAgICAgIGJlMzJfdG9fY3B1KHAtPmxlblswXSksIERNQV9UT19ERVZJQ0UpOworCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCBiZTY0X3RvX2NwdShhZGRyWzFdKSwKKwkJCQkgICAgICAgYmUzMl90b19jcHUocC0+bGVuWzFdKSwgRE1BX1RPX0RFVklDRSk7CisJCQlwID0gKGNvbnN0IHN0cnVjdCB1bHB0eF9zZ2VfcGFpciAqKSZhZGRyWzJdOworCQl9IGVsc2UgeworCQkJY29uc3QgX19iZTY0ICphZGRyID0gKGNvbnN0IF9fYmU2NCAqKXRxLT5kZXNjOworCisJCQlkbWFfdW5tYXBfcGFnZShkZXYsIGJlNjRfdG9fY3B1KHAtPmFkZHJbMF0pLAorCQkJCSAgICAgICBiZTMyX3RvX2NwdShwLT5sZW5bMF0pLCBETUFfVE9fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9wYWdlKGRldiwgYmU2NF90b19jcHUoYWRkclswXSksCisJCQkJICAgICAgIGJlMzJfdG9fY3B1KHAtPmxlblsxXSksIERNQV9UT19ERVZJQ0UpOworCQkJcCA9IChjb25zdCBzdHJ1Y3QgdWxwdHhfc2dlX3BhaXIgKikmYWRkclsxXTsKKwkJfQorCX0KKwlpZiAobmZyYWdzKSB7CisJCV9fYmU2NCBhZGRyOworCisJCWlmICgodTggKilwID09ICh1OCAqKXRxLT5zdGF0KQorCQkJcCA9IChjb25zdCBzdHJ1Y3QgdWxwdHhfc2dlX3BhaXIgKil0cS0+ZGVzYzsKKwkJYWRkciA9ICgodTggKilwICsgMTYgPD0gKHU4ICopdHEtPnN0YXQKKwkJCT8gcC0+YWRkclswXQorCQkJOiAqKGNvbnN0IF9fYmU2NCAqKXRxLT5kZXNjKTsKKwkJZG1hX3VubWFwX3BhZ2UoZGV2LCBiZTY0X3RvX2NwdShhZGRyKSwgYmUzMl90b19jcHUocC0+bGVuWzBdKSwKKwkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwl9Cit9CisKKy8qKgorICoJZnJlZV90eF9kZXNjIC0gcmVjbGFpbXMgVFggZGVzY3JpcHRvcnMgYW5kIHRoZWlyIGJ1ZmZlcnMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHRxOiB0aGUgVFggcXVldWUgdG8gcmVjbGFpbSBkZXNjcmlwdG9ycyBmcm9tCisgKglAbjogdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyB0byByZWNsYWltCisgKglAdW5tYXA6IHdoZXRoZXIgdGhlIGJ1ZmZlcnMgc2hvdWxkIGJlIHVubWFwcGVkIGZvciBETUEKKyAqCisgKglSZWNsYWltcyBUWCBkZXNjcmlwdG9ycyBmcm9tIGFuIFNHRSBUWCBxdWV1ZSBhbmQgZnJlZXMgdGhlIGFzc29jaWF0ZWQKKyAqCVRYIGJ1ZmZlcnMuICBDYWxsZWQgd2l0aCB0aGUgVFggcXVldWUgbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBmcmVlX3R4X2Rlc2Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfdHhxICp0cSwKKwkJCSB1bnNpZ25lZCBpbnQgbiwgYm9vbCB1bm1hcCkKK3sKKwlzdHJ1Y3QgdHhfc3dfZGVzYyAqc2Rlc2M7CisJdW5zaWduZWQgaW50IGNpZHggPSB0cS0+Y2lkeDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5wZGV2X2RldjsKKworCWNvbnN0IGludCBuZWVkX3VubWFwID0gbmVlZF9za2JfdW5tYXAoKSAmJiB1bm1hcDsKKworCXNkZXNjID0gJnRxLT5zZGVzY1tjaWR4XTsKKwl3aGlsZSAobi0tKSB7CisJCS8qCisJCSAqIElmIHdlIGtlcHQgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIFRYIHNrYiwgd2UgbmVlZCB0bworCQkgKiB1bm1hcCBpdCBmcm9tIFBDSSBETUEgc3BhY2UgKGlmIHJlcXVpcmVkKSBhbmQgZnJlZSBpdC4KKwkJICovCisJCWlmIChzZGVzYy0+c2tiKSB7CisJCQlpZiAobmVlZF91bm1hcCkKKwkJCQl1bm1hcF9zZ2woZGV2LCBzZGVzYy0+c2tiLCBzZGVzYy0+c2dsLCB0cSk7CisJCQlrZnJlZV9za2Ioc2Rlc2MtPnNrYik7CisJCQlzZGVzYy0+c2tiID0gTlVMTDsKKwkJfQorCisJCXNkZXNjKys7CisJCWlmICgrK2NpZHggPT0gdHEtPnNpemUpIHsKKwkJCWNpZHggPSAwOworCQkJc2Rlc2MgPSB0cS0+c2Rlc2M7CisJCX0KKwl9CisJdHEtPmNpZHggPSBjaWR4OworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVjbGFpbWFibGUgZGVzY3JpcHRvcnMgaW4gYSBUWCBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmVjbGFpbWFibGUoY29uc3Qgc3RydWN0IHNnZV90eHEgKnRxKQoreworCWludCBod19jaWR4ID0gYmUxNl90b19jcHUodHEtPnN0YXQtPmNpZHgpOworCWludCByZWNsYWltYWJsZSA9IGh3X2NpZHggLSB0cS0+Y2lkeDsKKwlpZiAocmVjbGFpbWFibGUgPCAwKQorCQlyZWNsYWltYWJsZSArPSB0cS0+c2l6ZTsKKwlyZXR1cm4gcmVjbGFpbWFibGU7Cit9CisKKy8qKgorICoJcmVjbGFpbV9jb21wbGV0ZWRfdHggLSByZWNsYWltcyBjb21wbGV0ZWQgVFggZGVzY3JpcHRvcnMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHRxOiB0aGUgVFggcXVldWUgdG8gcmVjbGFpbSBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgZnJvbQorICoJQHVubWFwOiB3aGV0aGVyIHRoZSBidWZmZXJzIHNob3VsZCBiZSB1bm1hcHBlZCBmb3IgRE1BCisgKgorICoJUmVjbGFpbXMgVFggZGVzY3JpcHRvcnMgdGhhdCB0aGUgU0dFIGhhcyBpbmRpY2F0ZWQgaXQgaGFzIHByb2Nlc3NlZCwKKyAqCWFuZCBmcmVlcyB0aGUgYXNzb2NpYXRlZCBidWZmZXJzIGlmIHBvc3NpYmxlLiAgQ2FsbGVkIHdpdGggdGhlIFRYCisgKglxdWV1ZSBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWNsYWltX2NvbXBsZXRlZF90eChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJc3RydWN0IHNnZV90eHEgKnRxLAorCQkJCQlib29sIHVubWFwKQoreworCWludCBhdmFpbCA9IHJlY2xhaW1hYmxlKHRxKTsKKworCWlmIChhdmFpbCkgeworCQkvKgorCQkgKiBMaW1pdCB0aGUgYW1vdW50IG9mIGNsZWFuIHVwIHdvcmsgd2UgZG8gYXQgYSB0aW1lIHRvIGtlZXAKKwkJICogdGhlIFRYIGxvY2sgaG9sZCB0aW1lIE8oMSkuCisJCSAqLworCQlpZiAoYXZhaWwgPiBNQVhfVFhfUkVDTEFJTSkKKwkJCWF2YWlsID0gTUFYX1RYX1JFQ0xBSU07CisKKwkJZnJlZV90eF9kZXNjKGFkYXB0ZXIsIHRxLCBhdmFpbCwgdW5tYXApOworCQl0cS0+aW5fdXNlIC09IGF2YWlsOworCX0KK30KKworLyoqCisgKglnZXRfYnVmX3NpemUgLSByZXR1cm4gdGhlIHNpemUgb2YgYW4gUlggRnJlZSBMaXN0IGJ1ZmZlci4KKyAqCUBzZGVzYzogcG9pbnRlciB0byB0aGUgc29mdHdhcmUgYnVmZmVyIGRlc2NyaXB0b3IKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X2J1Zl9zaXplKGNvbnN0IHN0cnVjdCByeF9zd19kZXNjICpzZGVzYykKK3sKKwlyZXR1cm4gRkxfUEdfT1JERVIgPiAwICYmIChzZGVzYy0+ZG1hX2FkZHIgJiBSWF9MQVJHRV9CVUYpCisJCT8gKFBBR0VfU0laRSA8PCBGTF9QR19PUkRFUikKKwkJOiBQQUdFX1NJWkU7Cit9CisKKy8qKgorICoJZnJlZV9yeF9idWZzIC0gZnJlZSBSWCBidWZmZXJzIG9uIGFuIFNHRSBGcmVlIExpc3QKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQGZsOiB0aGUgU0dFIEZyZWUgTGlzdCB0byBmcmVlIGJ1ZmZlcnMgZnJvbQorICoJQG46IGhvdyBtYW55IGJ1ZmZlcnMgdG8gZnJlZQorICoKKyAqCVJlbGVhc2UgdGhlIG5leHQgQG4gYnVmZmVycyBvbiBhbiBTR0UgRnJlZSBMaXN0IFJYIHF1ZXVlLiAgIFRoZQorICoJYnVmZmVycyBtdXN0IGJlIG1hZGUgaW5hY2Nlc3NpYmxlIHRvIGhhcmR3YXJlIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqCWZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmcmVlX3J4X2J1ZnMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfZmwgKmZsLCBpbnQgbikKK3sKKwl3aGlsZSAobi0tKSB7CisJCXN0cnVjdCByeF9zd19kZXNjICpzZGVzYyA9ICZmbC0+c2Rlc2NbZmwtPmNpZHhdOworCisJCWlmIChpc19idWZfbWFwcGVkKHNkZXNjKSkKKwkJCWRtYV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXZfZGV2LCBnZXRfYnVmX2FkZHIoc2Rlc2MpLAorCQkJCSAgICAgICBnZXRfYnVmX3NpemUoc2Rlc2MpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwdXRfcGFnZShzZGVzYy0+cGFnZSk7CisJCXNkZXNjLT5wYWdlID0gTlVMTDsKKwkJaWYgKCsrZmwtPmNpZHggPT0gZmwtPnNpemUpCisJCQlmbC0+Y2lkeCA9IDA7CisJCWZsLT5hdmFpbC0tOworCX0KK30KKworLyoqCisgKgl1bm1hcF9yeF9idWYgLSB1bm1hcCB0aGUgY3VycmVudCBSWCBidWZmZXIgb24gYW4gU0dFIEZyZWUgTGlzdAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAZmw6IHRoZSBTR0UgRnJlZSBMaXN0CisgKgorICoJVW5tYXAgdGhlIGN1cnJlbnQgYnVmZmVyIG9uIGFuIFNHRSBGcmVlIExpc3QgUlggcXVldWUuICAgVGhlCisgKglidWZmZXIgbXVzdCBiZSBtYWRlIGluYWNjZXNzaWJsZSB0byBIVyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCVRoaXMgaXMgc2ltaWxhciB0byBAZnJlZV9yeF9idWZzIGFib3ZlIGJ1dCBkb2VzIG5vdCBmcmVlIHRoZSBidWZmZXIuCisgKglEbyBub3RlIHRoYXQgdGhlIEZMIHN0aWxsIGxvc2VzIGFueSBmdXJ0aGVyIGFjY2VzcyB0byB0aGUgYnVmZmVyLgorICoJVGhpcyBpcyB1c2VkIHByZWRvbWluYW50bHkgdG8gInRyYW5zZmVyIG93bmVyc2hpcCIgb2YgYW4gRkwgYnVmZmVyCisgKgl0byBhbm90aGVyIGVudGl0eSAodHlwaWNhbGx5IGFuIHNrYidzIGZyYWdtZW50IGxpc3QpLgorICovCitzdGF0aWMgdm9pZCB1bm1hcF9yeF9idWYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfZmwgKmZsKQoreworCXN0cnVjdCByeF9zd19kZXNjICpzZGVzYyA9ICZmbC0+c2Rlc2NbZmwtPmNpZHhdOworCisJaWYgKGlzX2J1Zl9tYXBwZWQoc2Rlc2MpKQorCQlkbWFfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2X2RldiwgZ2V0X2J1Zl9hZGRyKHNkZXNjKSwKKwkJCSAgICAgICBnZXRfYnVmX3NpemUoc2Rlc2MpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXNkZXNjLT5wYWdlID0gTlVMTDsKKwlpZiAoKytmbC0+Y2lkeCA9PSBmbC0+c2l6ZSkKKwkJZmwtPmNpZHggPSAwOworCWZsLT5hdmFpbC0tOworfQorCisvKioKKyAqCXJpbmdfZmxfZGIgLSByaWdoIGRvb3JiZWxsIG9uIGZyZWUgbGlzdAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAZmw6IHRoZSBGcmVlIExpc3Qgd2hvc2UgZG9vcmJlbGwgc2hvdWxkIGJlIHJ1bmcgLi4uCisgKgorICoJVGVsbCB0aGUgU2NhdHRlciBHYXRoZXIgRW5naW5lIHRoYXQgdGhlcmUgYXJlIG5ldyBmcmVlIGxpc3QgZW50cmllcworICoJYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmluZ19mbF9kYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNnZV9mbCAqZmwpCit7CisJLyoKKwkgKiBUaGUgU0dFIGtlZXBzIHRyYWNrIG9mIGl0cyBQcm9kdWNlciBhbmQgQ29uc3VtZXIgSW5kaWNlcyBpbiB0ZXJtcworCSAqIG9mIEVncmVzcyBRdWV1ZSBVbml0cyBzbyB3ZSBjYW4gb25seSB0ZWxsIGl0IGFib3V0IGludGVncmFsIG51bWJlcnMKKwkgKiBvZiBtdWx0aXBsZXMgb2YgRnJlZSBMaXN0IEVudHJpZXMgcGVyIEVncmVzcyBRdWV1ZSBVbml0cyAuLi4KKwkgKi8KKwlpZiAoZmwtPnBlbmRfY3JlZCA+PSBGTF9QRVJfRVFfVU5JVCkgeworCQl3bWIoKTsKKwkJdDRfd3JpdGVfcmVnKGFkYXB0ZXIsIFQ0VkZfU0dFX0JBU0VfQUREUiArIFNHRV9WRl9LRE9PUkJFTEwsCisJCQkgICAgIERCUFJJTyB8CisJCQkgICAgIFFJRChmbC0+Y250eHRfaWQpIHwKKwkJCSAgICAgUElEWChmbC0+cGVuZF9jcmVkIC8gRkxfUEVSX0VRX1VOSVQpKTsKKwkJZmwtPnBlbmRfY3JlZCAlPSBGTF9QRVJfRVFfVU5JVDsKKwl9Cit9CisKKy8qKgorICoJc2V0X3J4X3N3X2Rlc2MgLSBpbml0aWFsaXplIHNvZnR3YXJlIFJYIGJ1ZmZlciBkZXNjcmlwdG9yCisgKglAc2Rlc2M6IHBvaW50ZXIgdG8gdGhlIHNvZnR3b3JlIFJYIGJ1ZmZlciBkZXNjcmlwdG9yCisgKglAcGFnZTogcG9pbnRlciB0byB0aGUgcGFnZSBkYXRhIHN0cnVjdHVyZSBiYWNraW5nIHRoZSBSWCBidWZmZXIKKyAqCUBkbWFfYWRkcjogUENJIERNQSBhZGRyZXNzIChwb3NzaWJseSB3aXRoIGxvdy1iaXQgZmxhZ3MpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcnhfc3dfZGVzYyhzdHJ1Y3Qgcnhfc3dfZGVzYyAqc2Rlc2MsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlzZGVzYy0+cGFnZSA9IHBhZ2U7CisJc2Rlc2MtPmRtYV9hZGRyID0gZG1hX2FkZHI7Cit9CisKKy8qCisgKiBTdXBwb3J0IGZvciBwb2lzb25pbmcgUlggYnVmZmVycyAuLi4KKyAqLworI2RlZmluZSBQT0lTT05fQlVGX1ZBTCAtMQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG9pc29uX2J1ZihzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IHN6KQoreworI2lmIFBPSVNPTl9CVUZfVkFMID49IDAKKwltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpLCBQT0lTT05fQlVGX1ZBTCwgc3opOworI2VuZGlmCit9CisKKy8qKgorICoJcmVmaWxsX2ZsIC0gcmVmaWxsIGFuIFNHRSBSWCBidWZmZXIgcmluZworICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAZmw6IHRoZSBGcmVlIExpc3QgcmluZyB0byByZWZpbGwKKyAqCUBuOiB0aGUgbnVtYmVyIG9mIG5ldyBidWZmZXJzIHRvIGFsbG9jYXRlCisgKglAZ2ZwOiB0aGUgZ2ZwIGZsYWdzIGZvciB0aGUgYWxsb2NhdGlvbnMKKyAqCisgKgkoUmUpcG9wdWxhdGUgYW4gU0dFIGZyZWUtYnVmZmVyIHF1ZXVlIHdpdGggdXAgdG8gQG4gbmV3IHBhY2tldCBidWZmZXJzLAorICoJYWxsb2NhdGVkIHdpdGggdGhlIHN1cHBsaWVkIGdmcCBmbGFncy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhhdAorICoJQG4gZG9lcyBub3QgZXhjZWVkIHRoZSBxdWV1ZSdzIGNhcGFjaXR5IC0tIGkuZS4gKGNpZHggPT0gcGlkeCkgX0lOCisgKglFR1JFU1MgUVVFVUUgVU5JVFNfIGluZGljYXRlcyBhbiBlbXB0eSBGcmVlIExpc3QhICBSZXR1cm5zIHRoZSBudW1iZXIKKyAqCW9mIGJ1ZmZlcnMgYWxsb2NhdGVkLiAgSWYgYWZ0ZXJ3YXJkcyB0aGUgcXVldWUgaXMgZm91bmQgY3JpdGljYWxseSBsb3csCisgKgltYXJrIGl0IGFzIHN0YXJ2aW5nIGluIHRoZSBiaXRtYXAgb2Ygc3RhcnZpbmcgRkxzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJlZmlsbF9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNnZV9mbCAqZmwsCisJCQkgICAgICBpbnQgbiwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdW5zaWduZWQgaW50IGNyZWQgPSBmbC0+YXZhaWw7CisJX19iZTY0ICpkID0gJmZsLT5kZXNjW2ZsLT5waWR4XTsKKwlzdHJ1Y3Qgcnhfc3dfZGVzYyAqc2Rlc2MgPSAmZmwtPnNkZXNjW2ZsLT5waWR4XTsKKworCS8qCisJICogU2FuaXR5OiBlbnN1cmUgdGhhdCB0aGUgcmVzdWx0IG9mIGFkZGluZyBuIEZyZWUgTGlzdCBidWZmZXJzCisJICogd29uJ3QgcmVzdWx0IGluIHdyYXBwaW5nIHRoZSBTR0UncyBQcm9kdWNlciBJbmRleCBhcm91bmQgdG8KKwkgKiBpdCdzIENvbnN1bWVyIEluZGV4IHRoZXJlYnkgaW5kaWNhdGluZyBhbiBlbXB0eSBGcmVlIExpc3QgLi4uCisJICovCisJQlVHX09OKGZsLT5hdmFpbCArIG4gPiBmbC0+c2l6ZSAtIEZMX1BFUl9FUV9VTklUKTsKKworCS8qCisJICogSWYgd2Ugc3VwcG9ydCBsYXJnZSBwYWdlcywgcHJlZmVyIGxhcmdlIGJ1ZmZlcnMgYW5kIGZhaWwgb3ZlciB0bworCSAqIHNtYWxsIHBhZ2VzIGlmIHdlIGNhbid0IGFsbG9jYXRlIGxhcmdlIHBhZ2VzIHRvIHNhdGlzZnkgdGhlIHJlZmlsbC4KKwkgKiBJZiB3ZSBkb24ndCBzdXBwb3J0IGxhcmdlIHBhZ2VzLCBkcm9wIGRpcmVjdGx5IGludG8gdGhlIHNtYWxsIHBhZ2UKKwkgKiBhbGxvY2F0aW9uIGNvZGUuCisJICovCisJaWYgKEZMX1BHX09SREVSID09IDApCisJCWdvdG8gYWxsb2Nfc21hbGxfcGFnZXM7CisKKwl3aGlsZSAobikgeworCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwIHwgX19HRlBfQ09NUCB8IF9fR0ZQX05PV0FSTiwKKwkJCQkgICBGTF9QR19PUkRFUik7CisJCWlmICh1bmxpa2VseSghcGFnZSkpIHsKKwkJCS8qCisJCQkgKiBXZSd2ZSBmYWlsZWQgaW5vdXIgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhICJsYXJnZQorCQkJICogcGFnZSIuICBGYWlsIG92ZXIgdG8gdGhlICJzbWFsbCBwYWdlIiBhbGxvY2F0aW9uCisJCQkgKiBiZWxvdy4KKwkJCSAqLworCQkJZmwtPmxhcmdlX2FsbG9jX2ZhaWxlZCsrOworCQkJYnJlYWs7CisJCX0KKwkJcG9pc29uX2J1ZihwYWdlLCBQQUdFX1NJWkUgPDwgRkxfUEdfT1JERVIpOworCisJCWRtYV9hZGRyID0gZG1hX21hcF9wYWdlKGFkYXB0ZXItPnBkZXZfZGV2LCBwYWdlLCAwLAorCQkJCQlQQUdFX1NJWkUgPDwgRkxfUEdfT1JERVIsCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihhZGFwdGVyLT5wZGV2X2RldiwgZG1hX2FkZHIpKSkgeworCQkJLyoKKwkJCSAqIFdlJ3ZlIHJ1biBvdXQgb2YgRE1BIG1hcHBpbmcgc3BhY2UuICBGcmVlIHVwIHRoZQorCQkJICogYnVmZmVyIGFuZCByZXR1cm4gd2l0aCB3aGF0IHdlJ3ZlIG1hbmFnZWQgdG8gcHV0CisJCQkgKiBpbnRvIHRoZSBmcmVlIGxpc3QuICBXZSBkb24ndCB3YW50IHRvIGZhaWwgb3ZlciB0bworCQkJICogdGhlIHNtYWxsIHBhZ2UgYWxsb2NhdGlvbiBiZWxvdyBpbiB0aGlzIGNhc2UKKwkJCSAqIGJlY2F1c2UgRE1BIG1hcHBpbmcgcmVzb3VyY2VzIGFyZSB0eXBpY2FsbHkKKwkJCSAqIGNyaXRpY2FsIHJlc291cmNlcyBvbmNlIHRoZXkgYmVjb21lIHNjYXJzZS4KKwkJCSAqLworCQkJX19mcmVlX3BhZ2VzKHBhZ2UsIEZMX1BHX09SREVSKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRtYV9hZGRyIHw9IFJYX0xBUkdFX0JVRjsKKwkJKmQrKyA9IGNwdV90b19iZTY0KGRtYV9hZGRyKTsKKworCQlzZXRfcnhfc3dfZGVzYyhzZGVzYywgcGFnZSwgZG1hX2FkZHIpOworCQlzZGVzYysrOworCisJCWZsLT5hdmFpbCsrOworCQlpZiAoKytmbC0+cGlkeCA9PSBmbC0+c2l6ZSkgeworCQkJZmwtPnBpZHggPSAwOworCQkJc2Rlc2MgPSBmbC0+c2Rlc2M7CisJCQlkID0gZmwtPmRlc2M7CisJCX0KKwkJbi0tOworCX0KKworYWxsb2Nfc21hbGxfcGFnZXM6CisJd2hpbGUgKG4tLSkgeworCQlwYWdlID0gX19uZXRkZXZfYWxsb2NfcGFnZShhZGFwdGVyLT5wb3J0WzBdLAorCQkJCQkgICBnZnAgfCBfX0dGUF9OT1dBUk4pOworCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCQlmbC0+YWxsb2NfZmFpbGVkKys7CisJCQlicmVhazsKKwkJfQorCQlwb2lzb25fYnVmKHBhZ2UsIFBBR0VfU0laRSk7CisKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3BhZ2UoYWRhcHRlci0+cGRldl9kZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPnBkZXZfZGV2LCBkbWFfYWRkcikpKSB7CisJCQluZXRkZXZfZnJlZV9wYWdlKGFkYXB0ZXItPnBvcnRbMF0sIHBhZ2UpOworCQkJYnJlYWs7CisJCX0KKwkJKmQrKyA9IGNwdV90b19iZTY0KGRtYV9hZGRyKTsKKworCQlzZXRfcnhfc3dfZGVzYyhzZGVzYywgcGFnZSwgZG1hX2FkZHIpOworCQlzZGVzYysrOworCisJCWZsLT5hdmFpbCsrOworCQlpZiAoKytmbC0+cGlkeCA9PSBmbC0+c2l6ZSkgeworCQkJZmwtPnBpZHggPSAwOworCQkJc2Rlc2MgPSBmbC0+c2Rlc2M7CisJCQlkID0gZmwtPmRlc2M7CisJCX0KKwl9CisKK291dDoKKwkvKgorCSAqIFVwZGF0ZSBvdXIgYWNjb3VudGluZyBzdGF0ZSB0byBpbmNvcnBvcmF0ZSB0aGUgbmV3IEZyZWUgTGlzdAorCSAqIGJ1ZmZlcnMsIHRlbGwgdGhlIGhhcmR3YXJlIGFib3V0IHRoZW0gYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mCisJICogYnVmZXJzIHdoaWNoIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZS4KKwkgKi8KKwljcmVkID0gZmwtPmF2YWlsIC0gY3JlZDsKKwlmbC0+cGVuZF9jcmVkICs9IGNyZWQ7CisJcmluZ19mbF9kYihhZGFwdGVyLCBmbCk7CisKKwlpZiAodW5saWtlbHkoZmxfc3RhcnZpbmcoZmwpKSkgeworCQlzbXBfd21iKCk7CisJCXNldF9iaXQoZmwtPmNudHh0X2lkLCBhZGFwdGVyLT5zZ2Uuc3RhcnZpbmdfZmwpOworCX0KKworCXJldHVybiBjcmVkOworfQorCisvKgorICogUmVmaWxsIGEgRnJlZSBMaXN0IHRvIGl0cyBjYXBhY2l0eSBvciB0aGUgTWF4aW11bSBSZWZpbGwgSW5jcmVtZW50LAorICogd2hpY2hldmVyIGlzIHNtYWxsZXIgLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3JlZmlsbF9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNnZV9mbCAqZmwpCit7CisJcmVmaWxsX2ZsKGFkYXB0ZXIsIGZsLAorCQkgIG1pbigodW5zaWduZWQgaW50KU1BWF9SWF9SRUZJTEwsIGZsX2NhcChmbCkgLSBmbC0+YXZhaWwpLAorCQkgIEdGUF9BVE9NSUMpOworfQorCisvKioKKyAqCWFsbG9jX3JpbmcgLSBhbGxvY2F0ZSByZXNvdXJjZXMgZm9yIGFuIFNHRSBkZXNjcmlwdG9yIHJpbmcKKyAqCUBkZXY6IHRoZSBQQ0kgZGV2aWNlJ3MgY29yZSBkZXZpY2UKKyAqCUBuZWxlbTogdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycworICoJQGh3c2l6ZTogdGhlIHNpemUgb2YgZWFjaCBoYXJkd2FyZSBkZXNjcmlwdG9yCisgKglAc3dzaXplOiB0aGUgc2l6ZSBvZiBlYWNoIHNvZnR3YXJlIGRlc2NyaXB0b3IKKyAqCUBidXNhZGRycDogdGhlIHBoeXNpY2FsIFBDSSBidXMgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIHJpbmcKKyAqCUBzd3JpbmdwOiByZXR1cm4gYWRkcmVzcyBwb2ludGVyIGZvciBzb2Z0d2FyZSByaW5nCisgKglAc3RhdF9zaXplOiBleHRyYSBzcGFjZSBpbiBoYXJkd2FyZSByaW5nIGZvciBzdGF0dXMgaW5mb3JtYXRpb24KKyAqCisgKglBbGxvY2F0ZXMgcmVzb3VyY2VzIGZvciBhbiBTR0UgZGVzY3JpcHRvciByaW5nLCBzdWNoIGFzIFRYIHF1ZXVlcywKKyAqCWZyZWUgYnVmZmVyIGxpc3RzLCByZXNwb25zZSBxdWV1ZXMsIGV0Yy4gIEVhY2ggU0dFIHJpbmcgcmVxdWlyZXMKKyAqCXNwYWNlIGZvciBpdHMgaGFyZHdhcmUgZGVzY3JpcHRvcnMgcGx1cywgb3B0aW9uYWxseSwgc3BhY2UgZm9yIHNvZnR3YXJlCisgKglzdGF0ZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBoYXJkd2FyZSBlbnRyeSAodGhlIG1ldGFkYXRhKS4gIFRoZSBmdW5jdGlvbgorICoJcmV0dXJucyB0aHJlZSB2YWx1ZXM6IHRoZSB2aXJ0dWFsIGFkZHJlc3MgZm9yIHRoZSBoYXJkd2FyZSByaW5nICh0aGUKKyAqCXJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24pLCB0aGUgUENJIGJ1cyBhZGRyZXNzIG9mIHRoZSBoYXJkd2FyZQorICoJcmluZyAoaW4gKmJ1c2FkZHJwKSwgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBzb2Z0d2FyZSByaW5nIChpbiBzd3JpbmdwKS4KKyAqCUJvdGggdGhlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSByaW5ncyBhcmUgcmV0dXJuZWQgemVyb2VkIG91dC4KKyAqLworc3RhdGljIHZvaWQgKmFsbG9jX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3QgbmVsZW0sIHNpemVfdCBod3NpemUsCisJCQlzaXplX3Qgc3dzaXplLCBkbWFfYWRkcl90ICpidXNhZGRycCwgdm9pZCAqc3dyaW5ncCwKKwkJCXNpemVfdCBzdGF0X3NpemUpCit7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgaGFyZHdhcmUgcmluZyBhbmQgUENJIERNQSBidXMgYWRkcmVzcyBzcGFjZSBmb3Igc2FpZC4KKwkgKi8KKwlzaXplX3QgaHdsZW4gPSBuZWxlbSAqIGh3c2l6ZSArIHN0YXRfc2l6ZTsKKwl2b2lkICpod3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBod2xlbiwgYnVzYWRkcnAsIEdGUF9LRVJORUwpOworCisJaWYgKCFod3JpbmcpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBJZiB0aGUgY2FsbGVyIHdhbnRzIGEgc29mdHdhcmUgcmluZywgYWxsb2NhdGUgaXQgYW5kIHJldHVybiBhCisJICogcG9pbnRlciB0byBpdCBpbiAqc3dyaW5ncC4KKwkgKi8KKwlCVUdfT04oKHN3c2l6ZSAhPSAwKSAhPSAoc3dyaW5ncCAhPSBOVUxMKSk7CisJaWYgKHN3c2l6ZSkgeworCQl2b2lkICpzd3JpbmcgPSBrY2FsbG9jKG5lbGVtLCBzd3NpemUsIEdGUF9LRVJORUwpOworCisJCWlmICghc3dyaW5nKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGh3bGVuLCBod3JpbmcsICpidXNhZGRycCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkqKHZvaWQgKiopc3dyaW5ncCA9IHN3cmluZzsKKwl9CisKKwkvKgorCSAqIFplcm8gb3V0IHRoZSBoYXJkd2FyZSByaW5nIGFuZCByZXR1cm4gaXRzIGFkZHJlc3MgYXMgb3VyIGZ1bmN0aW9uCisJICogdmFsdWUuCisJICovCisJbWVtc2V0KGh3cmluZywgMCwgaHdsZW4pOworCXJldHVybiBod3Jpbmc7Cit9CisKKy8qKgorICoJc2dsX2xlbiAtIGNhbGN1bGF0ZXMgdGhlIHNpemUgb2YgYW4gU0dMIG9mIHRoZSBnaXZlbiBjYXBhY2l0eQorICoJQG46IHRoZSBudW1iZXIgb2YgU0dMIGVudHJpZXMKKyAqCisgKglDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZmxpdHMgKDgtYnl0ZSB1bml0cykgbmVlZGVkIGZvciBhIERpcmVjdAorICoJU2NhdHRlci9HYXRoZXIgTGlzdCB0aGF0IGNhbiBob2xkIHRoZSBnaXZlbiBudW1iZXIgb2YgZW50cmllcy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2dsX2xlbih1bnNpZ25lZCBpbnQgbikKK3sKKwkvKgorCSAqIEEgRGlyZWN0IFNjYXR0ZXIgR2F0aGVyIExpc3QgdXNlcyAzMi1iaXQgbGVuZ3RocyBhbmQgNjQtYml0IFBDSSBETUEKKwkgKiBhZGRyZXNzZXMuICBUaGUgRFNHTCBXb3JrIFJlcXVlc3Qgc3RhcnRzIG9mZiB3aXRoIGEgMzItYml0IERTR0wKKwkgKiBVTFBUWCBoZWFkZXIsIHRoZW4gTGVuZ3RoMCwgdGhlbiBBZGRyZXNzMCwgdGhlbiwgZm9yIDEgPD0gaSA8PSBOLAorCSAqIHJlcGVhdGVkIHNlcXVlbmNlcyBvZiB7IExlbmd0aFtpXSwgTGVuZ3RoW2krMV0sIEFkZHJlc3NbaV0sCisJICogQWRkcmVzc1tpKzFdIH0gKHRoaXMgZW5zdXJlcyB0aGF0IGFsbCBhZGRyZXNzZXMgYXJlIG9uIDY0LWJpdAorCSAqIGJvdW5kYXJpZXMpLiAgSWYgTiBpcyBldmVuLCB0aGVuIExlbmd0aFtOKzFdIHNob3VsZCBiZSBzZXQgdG8gMCBhbmQKKwkgKiBBZGRyZXNzW04rMV0gaXMgb21pdHRlZC4KKwkgKgorCSAqIFRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24gaW5jb3Jwb3JhdGVzIGFsbCBvZiB0aGUgYWJvdmUuICBJdCdzCisJICogc29tZXdoYXQgaGFyZCB0byBmb2xsb3cgYnV0LCBicmllZmx5OiB0aGUgIisyIiBhY2NvdW50cyBmb3IgdGhlCisJICogZmlyc3QgdHdvIGZsaXRzIHdoaWNoIGluY2x1ZGUgdGhlIERTR0wgaGVhZGVyLCBMZW5ndGgwIGFuZAorCSAqIEFkZHJlc3MwOyB0aGUgIigzKihuLTEpKS8yIiBjb3ZlcnMgdGhlIG1haW4gYm9keSBvZiBsaXN0IGVudHJpZXMgKDMKKwkgKiBmbGl0cyBmb3IgZXZlcnkgcGFpciBvZiB0aGUgcmVtYWluaW5nIE4pICsxIGlmIChuLTEpIGlzIG9kZDsgYW5kCisJICogZmluYWxseSB0aGUgIisoKG4tMSkmMSkiIGFkZHMgdGhlIG9uZSByZW1haW5pbmcgZmxpdCBuZWVkZWQgaWYKKwkgKiAobi0xKSBpcyBvZGQgLi4uCisJICovCisJbi0tOworCXJldHVybiAoMyAqIG4pIC8gMiArIChuICYgMSkgKyAyOworfQorCisvKioKKyAqCWZsaXRzX3RvX2Rlc2MgLSByZXR1cm5zIHRoZSBudW0gb2YgVFggZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiBmbGl0cworICoJQGZsaXRzOiB0aGUgbnVtYmVyIG9mIGZsaXRzCisgKgorICoJUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRYIGRlc2NyaXB0b3JzIG5lZWRlZCBmb3IgdGhlIHN1cHBsaWVkIG51bWJlcgorICoJb2YgZmxpdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZsaXRzX3RvX2Rlc2ModW5zaWduZWQgaW50IGZsaXRzKQoreworCUJVR19PTihmbGl0cyA+IFNHRV9NQVhfV1JfTEVOIC8gc2l6ZW9mKF9fYmU2NCkpOworCXJldHVybiBESVZfUk9VTkRfVVAoZmxpdHMsIFRYRF9QRVJfRVFfVU5JVCk7Cit9CisKKy8qKgorICoJaXNfZXRoX2ltbSAtIGNhbiBhbiBFdGhlcm5ldCBwYWNrZXQgYmUgc2VudCBhcyBpbW1lZGlhdGUgZGF0YT8KKyAqCUBza2I6IHRoZSBwYWNrZXQKKyAqCisgKglSZXR1cm5zIHdoZXRoZXIgYW4gRXRoZXJuZXQgcGFja2V0IGlzIHNtYWxsIGVub3VnaCB0byBmaXQgY29tcGxldGVseSBhcworICoJaW1tZWRpYXRlIGRhdGEuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2V0aF9pbW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKgorCSAqIFRoZSBWRiBEcml2ZXIgdXNlcyB0aGUgRldfRVRIX1RYX1BLVF9WTV9XUiBmaXJtd2FyZSBXb3JrIFJlcXVlc3QKKwkgKiB3aGljaCBkb2VzIG5vdCBhY2NvbW1vZGF0ZSBpbW1lZGlhdGUgZGF0YS4gIFdlIGNvdWxkIGRpa2Ugb3V0IGFsbAorCSAqIG9mIHRoZSBzdXBwb3J0IGNvZGUgZm9yIGltbWVkaWF0ZSBkYXRhIGJ1dCB0aGF0IHdvdWxkIHRpZSBvdXIgaGFuZHMKKwkgKiB0b28gbXVjaCBpZiB3ZSBldmVyIHdhbnQgdG8gZW5oYWNlIHRoZSBmaXJtd2FyZS4gIEl0IHdvdWxkIGFsc28KKwkgKiBjcmVhdGUgbW9yZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBQRiBhbmQgVkYgRHJpdmVycy4KKwkgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICoJY2FsY190eF9mbGl0cyAtIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGZsaXRzIGZvciBhIHBhY2tldCBUWCBXUgorICoJQHNrYjogdGhlIHBhY2tldAorICoKKyAqCVJldHVybnMgdGhlIG51bWJlciBvZiBmbGl0cyBuZWVkZWQgZm9yIGEgVFggV29yayBSZXF1ZXN0IGZvciB0aGUKKyAqCWdpdmVuIEV0aGVybmV0IHBhY2tldCwgaW5jbHVkaW5nIHRoZSBuZWVkZWQgV1IgYW5kIENQTCBoZWFkZXJzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX3R4X2ZsaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGZsaXRzOworCisJLyoKKwkgKiBJZiB0aGUgc2tiIGlzIHNtYWxsIGVub3VnaCwgd2UgY2FuIHB1bXAgaXQgb3V0IGFzIGEgd29yayByZXF1ZXN0CisJICogd2l0aCBvbmx5IGltbWVkaWF0ZSBkYXRhLiAgSW4gdGhhdCBjYXNlIHdlIGp1c3QgaGF2ZSB0byBoYXZlIHRoZQorCSAqIFRYIFBhY2tldCBoZWFkZXIgcGx1cyB0aGUgc2tiIGRhdGEgaW4gdGhlIFdvcmsgUmVxdWVzdC4KKwkgKi8KKwlpZiAoaXNfZXRoX2ltbShza2IpKQorCQlyZXR1cm4gRElWX1JPVU5EX1VQKHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KSwKKwkJCQkgICAgc2l6ZW9mKF9fYmU2NCkpOworCisJLyoKKwkgKiBPdGhlcndpc2UsIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gY29uc3RydWN0IGEgU2NhdHRlciBnYXRoZXIgbGlzdAorCSAqIG9mIHRoZSBza2IgYm9keSBhbmQgZnJhZ21lbnRzLiAgV2UgYWxzbyBpbmNsdWRlIHRoZSBmbGl0cyBuZWNlc3NhcnkKKwkgKiBmb3IgdGhlIFRYIFBhY2tldCBXb3JrIFJlcXVlc3QgYW5kIENQTC4gIFdlIGFsd2F5cyBoYXZlIGEgZmlybXdhcmUKKwkgKiBXcml0ZSBIZWFkZXIgKGluY29ycG9yYXRlZCBhcyBwYXJ0IG9mIHRoZSBjcGxfdHhfcGt0X2xzbyBhbmQKKwkgKiBjcGxfdHhfcGt0IHN0cnVjdHVyZXMpLCBmb2xsb3dlZCBieSBlaXRoZXIgYSBUWCBQYWNrZXQgV3JpdGUgQ1BMCisJICogbWVzc2FnZSBvciwgaWYgd2UncmUgZG9pbmcgYSBMYXJnZSBTZW5kIE9mZmxvYWQsIGFuIExTTyBDUEwgbWVzc2FnZQorCSAqIHdpdGggYW4gZW1iZWRlZCBUWCBQYWNrZXQgV3JpdGUgQ1BMIG1lc3NhZ2UuCisJICovCisJZmxpdHMgPSBzZ2xfbGVuKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKTsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKKwkJZmxpdHMgKz0gKHNpemVvZihzdHJ1Y3QgZndfZXRoX3R4X3BrdF92bV93cikgKworCQkJICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3RfbHNvX2NvcmUpICsKKwkJCSAgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0X2NvcmUpKSAvIHNpemVvZihfX2JlNjQpOworCWVsc2UKKwkJZmxpdHMgKz0gKHNpemVvZihzdHJ1Y3QgZndfZXRoX3R4X3BrdF92bV93cikgKworCQkJICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3RfY29yZSkpIC8gc2l6ZW9mKF9fYmU2NCk7CisJcmV0dXJuIGZsaXRzOworfQorCisvKioKKyAqCXdyaXRlX3NnbCAtIHBvcHVsYXRlIGEgU2NhdHRlci9HYXRoZXIgTGlzdCBmb3IgYSBwYWNrZXQKKyAqCUBza2I6IHRoZSBwYWNrZXQKKyAqCUB0cTogdGhlIFRYIHF1ZXVlIHdlIGFyZSB3cml0aW5nIGludG8KKyAqCUBzZ2w6IHN0YXJ0aW5nIGxvY2F0aW9uIGZvciB3cml0aW5nIHRoZSBTR0wKKyAqCUBlbmQ6IHBvaW50cyByaWdodCBhZnRlciB0aGUgZW5kIG9mIHRoZSBTR0wKKyAqCUBzdGFydDogc3RhcnQgb2Zmc2V0IGludG8gc2tiIG1haW4tYm9keSBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIFNHTAorICoJQGFkZHI6IHRoZSBsaXN0IG9mIERNQSBidXMgYWRkcmVzc2VzIGZvciB0aGUgU0dMIGVsZW1lbnRzCisgKgorICoJR2VuZXJhdGVzIGEgU2NhdHRlci9HYXRoZXIgTGlzdCBmb3IgdGhlIGJ1ZmZlcnMgdGhhdCBtYWtlIHVwIGEgcGFja2V0LgorICoJVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYWRlcXVhdGUgc3BhY2UgZm9yIHRoZSBTR0wgdGhhdCB3aWxsIGJlIHdyaXR0ZW4uCisgKglUaGUgU0dMIGluY2x1ZGVzIGFsbCBvZiB0aGUgcGFja2V0J3MgcGFnZSBmcmFnbWVudHMgYW5kIHRoZSBkYXRhIGluIGl0cworICoJbWFpbiBib2R5IGV4Y2VwdCBmb3IgdGhlIGZpcnN0IEBzdGFydCBieXRlcy4gIEBwb3MgbXVzdCBiZSAxNi1ieXRlCisgKglhbGlnbmVkIGFuZCB3aXRoaW4gYSBUWCBkZXNjcmlwdG9yIHdpdGggYXZhaWxhYmxlIHNwYWNlLiAgQGVuZCBwb2ludHMKKyAqCXdyaXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIFNHTCBidXQgZG9lcyBub3QgYWNjb3VudCBmb3IgYW55IHBvdGVudGlhbAorICoJd3JhcCBhcm91bmQsIGkuZS4sIEBlbmQgPiBAdHEtPnN0YXQuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3NnbChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2dlX3R4cSAqdHEsCisJCSAgICAgIHN0cnVjdCB1bHB0eF9zZ2wgKnNnbCwgdTY0ICplbmQsIHVuc2lnbmVkIGludCBzdGFydCwKKwkJICAgICAgY29uc3QgZG1hX2FkZHJfdCAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbGVuOworCXN0cnVjdCB1bHB0eF9zZ2VfcGFpciAqdG87CisJY29uc3Qgc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc2kgPSBza2Jfc2hpbmZvKHNrYik7CisJdW5zaWduZWQgaW50IG5mcmFncyA9IHNpLT5ucl9mcmFnczsKKwlzdHJ1Y3QgdWxwdHhfc2dlX3BhaXIgYnVmW01BWF9TS0JfRlJBR1MgLyAyICsgMV07CisKKwlsZW4gPSBza2JfaGVhZGxlbihza2IpIC0gc3RhcnQ7CisJaWYgKGxpa2VseShsZW4pKSB7CisJCXNnbC0+bGVuMCA9IGh0b25sKGxlbik7CisJCXNnbC0+YWRkcjAgPSBjcHVfdG9fYmU2NChhZGRyWzBdICsgc3RhcnQpOworCQluZnJhZ3MrKzsKKwl9IGVsc2UgeworCQlzZ2wtPmxlbjAgPSBodG9ubChzaS0+ZnJhZ3NbMF0uc2l6ZSk7CisJCXNnbC0+YWRkcjAgPSBjcHVfdG9fYmU2NChhZGRyWzFdKTsKKwl9CisKKwlzZ2wtPmNtZF9uc2dlID0gaHRvbmwoVUxQVFhfQ01EKFVMUF9UWF9TQ19EU0dMKSB8CisJCQkgICAgICBVTFBUWF9OU0dFKG5mcmFncykpOworCWlmIChsaWtlbHkoLS1uZnJhZ3MgPT0gMCkpCisJCXJldHVybjsKKwkvKgorCSAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgYmVsb3cgZGVhbHMgd2l0aCB0aGUgcG9zc2liaWxpdHkgd2UgaGl0IHRoZQorCSAqIGVuZCBvZiB0aGUgcXVldWUgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIHRoZSBTR0wuICBGb3IgdGhpcyBjYXNlCisJICogb25seSB3ZSBjcmVhdGUgdGhlIFNHTCBpbiBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZW4gY29weSBpdC4KKwkgKi8KKwl0byA9ICh1OCAqKWVuZCA+ICh1OCAqKXRxLT5zdGF0ID8gYnVmIDogc2dsLT5zZ2U7CisKKwlmb3IgKGkgPSAobmZyYWdzICE9IHNpLT5ucl9mcmFncyk7IG5mcmFncyA+PSAyOyBuZnJhZ3MgLT0gMiwgdG8rKykgeworCQl0by0+bGVuWzBdID0gY3B1X3RvX2JlMzIoc2ktPmZyYWdzW2ldLnNpemUpOworCQl0by0+bGVuWzFdID0gY3B1X3RvX2JlMzIoc2ktPmZyYWdzWysraV0uc2l6ZSk7CisJCXRvLT5hZGRyWzBdID0gY3B1X3RvX2JlNjQoYWRkcltpXSk7CisJCXRvLT5hZGRyWzFdID0gY3B1X3RvX2JlNjQoYWRkclsrK2ldKTsKKwl9CisJaWYgKG5mcmFncykgeworCQl0by0+bGVuWzBdID0gY3B1X3RvX2JlMzIoc2ktPmZyYWdzW2ldLnNpemUpOworCQl0by0+bGVuWzFdID0gY3B1X3RvX2JlMzIoMCk7CisJCXRvLT5hZGRyWzBdID0gY3B1X3RvX2JlNjQoYWRkcltpICsgMV0pOworCX0KKwlpZiAodW5saWtlbHkoKHU4ICopZW5kID4gKHU4ICopdHEtPnN0YXQpKSB7CisJCXVuc2lnbmVkIGludCBwYXJ0MCA9ICh1OCAqKXRxLT5zdGF0IC0gKHU4ICopc2dsLT5zZ2UsIHBhcnQxOworCisJCWlmIChsaWtlbHkocGFydDApKQorCQkJbWVtY3B5KHNnbC0+c2dlLCBidWYsIHBhcnQwKTsKKwkJcGFydDEgPSAodTggKillbmQgLSAodTggKil0cS0+c3RhdDsKKwkJbWVtY3B5KHRxLT5kZXNjLCAodTggKilidWYgKyBwYXJ0MCwgcGFydDEpOworCQllbmQgPSAodm9pZCAqKXRxLT5kZXNjICsgcGFydDE7CisJfQorCWlmICgodWludHB0cl90KWVuZCAmIDgpICAgICAgICAgICAvKiAwLXBhZCB0byBtdWx0aXBsZSBvZiAxNiAqLworCQkqKHU2NCAqKWVuZCA9IDA7Cit9CisKKy8qKgorICoJY2hlY2tfcmluZ190eF9kYiAtIGNoZWNrIGFuZCBwb3RlbnRpYWxseSByaW5nIGEgVFggcXVldWUncyBkb29yYmVsbAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAdHE6IHRoZSBUWCBxdWV1ZQorICoJQG46IG51bWJlciBvZiBuZXcgZGVzY3JpcHRvcnMgdG8gZ2l2ZSB0byBIVworICoKKyAqCVJpbmcgdGhlIGRvb3JiZWwgZm9yIGEgVFggcXVldWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByaW5nX3R4X2RiKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2dlX3R4cSAqdHEsCisJCQkgICAgICBpbnQgbikKK3sKKwkvKgorCSAqIFdhcm4gaWYgd2Ugd3JpdGUgZG9vcmJlbGxzIHdpdGggdGhlIHdyb25nIHByaW9yaXR5IGFuZCB3cml0ZQorCSAqIGRlc2NyaXB0b3JzIGJlZm9yZSB0ZWxsaW5nIEhXLgorCSAqLworCVdBUk5fT04oKFFJRCh0cS0+Y250eHRfaWQpIHwgUElEWChuKSkgJiBEQlBSSU8pOworCXdtYigpOworCXQ0X3dyaXRlX3JlZyhhZGFwdGVyLCBUNFZGX1NHRV9CQVNFX0FERFIgKyBTR0VfVkZfS0RPT1JCRUxMLAorCQkgICAgIFFJRCh0cS0+Y250eHRfaWQpIHwgUElEWChuKSk7Cit9CisKKy8qKgorICoJaW5saW5lX3R4X3NrYiAtIGlubGluZSBhIHBhY2tldCdzIGRhdGEgaW50byBUWCBkZXNjcmlwdG9ycworICoJQHNrYjogdGhlIHBhY2tldAorICoJQHRxOiB0aGUgVFggcXVldWUgd2hlcmUgdGhlIHBhY2tldCB3aWxsIGJlIGlubGluZWQKKyAqCUBwb3M6IHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBUWCBxdWV1ZSB0byBpbmxpbmUgdGhlIHBhY2tldAorICoKKyAqCUlubGluZSBhIHBhY2tldCdzIGNvbnRlbnRzIGRpcmVjdGx5IGludG8gVFggZGVzY3JpcHRvcnMsIHN0YXJ0aW5nIGF0CisgKgl0aGUgZ2l2ZW4gcG9zaXRpb24gd2l0aGluIHRoZSBUWCBETUEgcmluZy4KKyAqCU1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBvcGVyYXRpb24gaXMgZGVhbGluZyB3aXRoIHdyYXAgYXJvdW5kcworICoJaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFja2V0IHdlIHdhbnQgdG8gaW5saW5lLgorICovCitzdGF0aWMgdm9pZCBpbmxpbmVfdHhfc2tiKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBzZ2VfdHhxICp0cSwKKwkJCSAgdm9pZCAqcG9zKQoreworCXU2NCAqcDsKKwlpbnQgbGVmdCA9ICh2b2lkICopdHEtPnN0YXQgLSBwb3M7CisKKwlpZiAobGlrZWx5KHNrYi0+bGVuIDw9IGxlZnQpKSB7CisJCWlmIChsaWtlbHkoIXNrYi0+ZGF0YV9sZW4pKQorCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHBvcywgc2tiLT5sZW4pOworCQllbHNlCisJCQlza2JfY29weV9iaXRzKHNrYiwgMCwgcG9zLCBza2ItPmxlbik7CisJCXBvcyArPSBza2ItPmxlbjsKKwl9IGVsc2UgeworCQlza2JfY29weV9iaXRzKHNrYiwgMCwgcG9zLCBsZWZ0KTsKKwkJc2tiX2NvcHlfYml0cyhza2IsIGxlZnQsIHRxLT5kZXNjLCBza2ItPmxlbiAtIGxlZnQpOworCQlwb3MgPSAodm9pZCAqKXRxLT5kZXNjICsgKHNrYi0+bGVuIC0gbGVmdCk7CisJfQorCisJLyogMC1wYWQgdG8gbXVsdGlwbGUgb2YgMTYgKi8KKwlwID0gUFRSX0FMSUdOKHBvcywgOCk7CisJaWYgKCh1aW50cHRyX3QpcCAmIDgpCisJCSpwID0gMDsKK30KKworLyoKKyAqIEZpZ3VyZSBvdXQgd2hhdCBIVyBjc3VtIGEgcGFja2V0IHdhbnRzIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGNvbnRyb2wKKyAqIGJpdHMuCisgKi8KK3N0YXRpYyB1NjQgaHdjc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGNzdW1fdHlwZTsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCisJaWYgKGlwaC0+dmVyc2lvbiA9PSA0KSB7CisJCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJY3N1bV90eXBlID0gVFhfQ1NVTV9UQ1BJUDsKKwkJZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCWNzdW1fdHlwZSA9IFRYX0NTVU1fVURQSVA7CisJCWVsc2Ugeworbm9jc3VtOgorCQkJLyoKKwkJCSAqIHVua25vd24gcHJvdG9jb2wsIGRpc2FibGUgSFcgY3N1bQorCQkJICogYW5kIGhvcGUgYSBiYWQgcGFja2V0IGlzIGRldGVjdGVkCisJCQkgKi8KKwkJCXJldHVybiBUWFBLVF9MNENTVU1fRElTOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBleHRlbnNpb24gaGVhZGVycworCQkgKi8KKwkJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSAoY29uc3Qgc3RydWN0IGlwdjZoZHIgKilpcGg7CisKKwkJaWYgKGlwNmgtPm5leHRoZHIgPT0gSVBQUk9UT19UQ1ApCisJCQljc3VtX3R5cGUgPSBUWF9DU1VNX1RDUElQNjsKKwkJZWxzZSBpZiAoaXA2aC0+bmV4dGhkciA9PSBJUFBST1RPX1VEUCkKKwkJCWNzdW1fdHlwZSA9IFRYX0NTVU1fVURQSVA2OworCQllbHNlCisJCQlnb3RvIG5vY3N1bTsKKwl9CisKKwlpZiAobGlrZWx5KGNzdW1fdHlwZSA+PSBUWF9DU1VNX1RDUElQKSkKKwkJcmV0dXJuIFRYUEtUX0NTVU1fVFlQRShjc3VtX3R5cGUpIHwKKwkJCVRYUEtUX0lQSERSX0xFTihza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpIHwKKwkJCVRYUEtUX0VUSEhEUl9MRU4oc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgLSBFVEhfSExFTik7CisJZWxzZSB7CisJCWludCBzdGFydCA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisKKwkJcmV0dXJuIFRYUEtUX0NTVU1fVFlQRShjc3VtX3R5cGUpIHwKKwkJCVRYUEtUX0NTVU1fU1RBUlQoc3RhcnQpIHwKKwkJCVRYUEtUX0NTVU1fTE9DKHN0YXJ0ICsgc2tiLT5jc3VtX29mZnNldCk7CisJfQorfQorCisvKgorICogU3RvcCBhbiBFdGhlcm5ldCBUWCBxdWV1ZSBhbmQgcmVjb3JkIHRoYXQgc3RhdGUgY2hhbmdlLgorICovCitzdGF0aWMgdm9pZCB0eHFfc3RvcChzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cSkKK3sKKwluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cS0+dHhxKTsKKwl0eHEtPnEuc3RvcHMrKzsKK30KKworLyoKKyAqIEFkdmFuY2Ugb3VyIHNvZnR3YXJlIHN0YXRlIGZvciBhIFRYIHF1ZXVlIGJ5IGFkZGluZyBuIGluIHVzZSBkZXNjcmlwdG9ycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHR4cV9hZHZhbmNlKHN0cnVjdCBzZ2VfdHhxICp0cSwgdW5zaWduZWQgaW50IG4pCit7CisJdHEtPmluX3VzZSArPSBuOworCXRxLT5waWR4ICs9IG47CisJaWYgKHRxLT5waWR4ID49IHRxLT5zaXplKQorCQl0cS0+cGlkeCAtPSB0cS0+c2l6ZTsKK30KKworLyoqCisgKgl0NHZmX2V0aF94bWl0IC0gYWRkIGEgcGFja2V0IHRvIGFuIEV0aGVybmV0IFRYIHF1ZXVlCisgKglAc2tiOiB0aGUgcGFja2V0CisgKglAZGV2OiB0aGUgZWdyZXNzIG5ldCBkZXZpY2UKKyAqCisgKglBZGQgYSBwYWNrZXQgdG8gYW4gU0dFIEV0aGVybmV0IFRYIHF1ZXVlLiAgUnVucyB3aXRoIHNvZnRpcnFzIGRpc2FibGVkLgorICovCitpbnQgdDR2Zl9ldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB3cl9taWQ7CisJdTY0IGNudHJsLCAqZW5kOworCWludCBxaWR4LCBjcmVkaXRzOworCXVuc2lnbmVkIGludCBmbGl0cywgbmRlc2M7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHNnZV9ldGhfdHhxICp0eHE7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGk7CisJc3RydWN0IGZ3X2V0aF90eF9wa3Rfdm1fd3IgKndyOworCXN0cnVjdCBjcGxfdHhfcGt0X2NvcmUgKmNwbDsKKwljb25zdCBzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzc2k7CisJZG1hX2FkZHJfdCBhZGRyW01BWF9TS0JfRlJBR1MgKyAxXTsKKwljb25zdCBzaXplX3QgZndfaGRyX2NvcHlfbGVuID0gKHNpemVvZih3ci0+ZXRobWFjZHN0KSArCisJCQkJCXNpemVvZih3ci0+ZXRobWFjc3JjKSArCisJCQkJCXNpemVvZih3ci0+ZXRodHlwZSkgKworCQkJCQlzaXplb2Yod3ItPnZsYW50Y2kpKTsKKworCS8qCisJICogVGhlIGNoaXAgbWluaW11bSBwYWNrZXQgbGVuZ3RoIGlzIDEwIG9jdGV0cyBidXQgdGhlIGZpcm13YXJlCisJICogY29tbWFuZCB0aGF0IHdlIGFyZSB1c2luZyByZXF1aXJlcyB0aGF0IHdlIGNvcHkgdGhlIEV0aGVybmV0IGhlYWRlcgorCSAqIChpbmNsdWRpbmcgdGhlIFZMQU4gdGFnKSBpbnRvIHRoZSBoZWFkZXIgc28gd2UgcmVqZWN0IGFueXRoaW5nCisJICogc21hbGxlciB0aGFuIHRoYXQgLi4uCisJICovCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgZndfaGRyX2NvcHlfbGVuKSkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qCisJICogRmlndXJlIG91dCB3aGljaCBUWCBRdWV1ZSB3ZSdyZSBnb2luZyB0byB1c2UuCisJICovCisJcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCWFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKKwlxaWR4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CisJQlVHX09OKHFpZHggPj0gcGktPm5xc2V0cyk7CisJdHhxID0gJmFkYXB0ZXItPnNnZS5ldGh0eHFbcGktPmZpcnN0X3FzZXQgKyBxaWR4XTsKKworCS8qCisJICogVGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIHJlY2xhaW0gYW55IFRYIERlc2NyaXB0b3JzIHdob3NlIERNQQorCSAqIHRyYW5zZmVycyBoYXZlIGNvbXBsZXRlZC4KKwkgKi8KKwlyZWNsYWltX2NvbXBsZXRlZF90eChhZGFwdGVyLCAmdHhxLT5xLCB0cnVlKTsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZmxpdHMgYW5kIFRYIERlc2NyaXB0b3JzIHdlJ3JlIGdvaW5nIHRvCisJICogbmVlZCBhbG9uZyB3aXRoIGhvdyBtYW55IFRYIERlc2NyaXB0b3JzIHdpbGwgYmUgbGVmdCBvdmVyIGFmdGVyCisJICogd2UgaW5qZWN0IG91ciBXb3JrIFJlcXVlc3QuCisJICovCisJZmxpdHMgPSBjYWxjX3R4X2ZsaXRzKHNrYik7CisJbmRlc2MgPSBmbGl0c190b19kZXNjKGZsaXRzKTsKKwljcmVkaXRzID0gdHhxX2F2YWlsKCZ0eHEtPnEpIC0gbmRlc2M7CisKKwlpZiAodW5saWtlbHkoY3JlZGl0cyA8IDApKSB7CisJCS8qCisJCSAqIE5vdCBlbm91Z2ggcm9vbSBmb3IgdGhpcyBwYWNrZXQncyBXb3JrIFJlcXVlc3QuICBTdG9wIHRoZQorCQkgKiBUWCBRdWV1ZSBhbmQgcmV0dXJuIGEgImJ1c3kiIGNvbmRpdGlvbi4gIFRoZSBxdWV1ZSB3aWxsIGdldAorCQkgKiBzdGFydGVkIGxhdGVyIG9uIHdoZW4gdGhlIGZpcm13YXJlIGluZm9ybXMgdXMgdGhhdCBzcGFjZQorCQkgKiBoYXMgb3BlbmVkIHVwLgorCQkgKi8KKwkJdHhxX3N0b3AodHhxKTsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCSIlczogVFggcmluZyAldSBmdWxsIHdoaWxlIHF1ZXVlIGF3YWtlIVxuIiwKKwkJCWRldi0+bmFtZSwgcWlkeCk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZiAoIWlzX2V0aF9pbW0oc2tiKSAmJgorCSAgICB1bmxpa2VseShtYXBfc2tiKGFkYXB0ZXItPnBkZXZfZGV2LCBza2IsIGFkZHIpIDwgMCkpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBtYXAgdGhlIHNrYiBpbnRvIFBDSSBETUEgc3BhY2UgKGJlY2F1c2UgaXQgY2FuJ3QKKwkJICogYmUgaW4tbGluZWQgZGlyZWN0bHkgaW50byB0aGUgV29yayBSZXF1ZXN0KSBhbmQgdGhlIG1hcHBpbmcKKwkJICogb3BlcmF0aW9uIGZhaWxlZC4gIFJlY29yZCB0aGUgZXJyb3IgYW5kIGRyb3AgdGhlIHBhY2tldC4KKwkJICovCisJCXR4cS0+bWFwcGluZ19lcnIrKzsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwl3cl9taWQgPSBGV19XUl9MRU4xNihESVZfUk9VTkRfVVAoZmxpdHMsIDIpKTsKKwlpZiAodW5saWtlbHkoY3JlZGl0cyA8IEVUSFRYUV9TVE9QX1RIUkVTKSkgeworCQkvKgorCQkgKiBBZnRlciB3ZSdyZSBkb25lIGluamVjdGluZyB0aGUgV29yayBSZXF1ZXN0IGZvciB0aGlzCisJCSAqIHBhY2tldCwgd2UnbGwgYmUgYmVsb3cgb3VyICJzdG9wIHRocmVzaGhvbGQiIHNvIHN0b3AgdGhlIFRYCisJCSAqIFF1ZXVlIG5vdyBhbmQgc2NoZWR1bGUgYSByZXF1ZXN0IGZvciBhbiBTR0UgRWdyZXNzIFF1ZXVlCisJCSAqIFVwZGF0ZSBtZXNzYWdlLiAgVGhlIHF1ZXVlIHdpbGwgZ2V0IHN0YXJ0ZWQgbGF0ZXIgb24gd2hlbgorCQkgKiB0aGUgZmlybXdhcmUgcHJvY2Vzc2VzIHRoaXMgV29yayBSZXF1ZXN0IGFuZCBzZW5kcyB1cyBhbgorCQkgKiBFZ3Jlc3MgUXVldWUgU3RhdHVzIFVwZGF0ZSBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBzcGFjZQorCQkgKiBoYXMgb3BlbmVkIHVwLgorCQkgKi8KKwkJdHhxX3N0b3AodHhxKTsKKwkJd3JfbWlkIHw9IEZXX1dSX0VRVUVRIHwgRldfV1JfRVFVSVE7CisJfQorCisJLyoKKwkgKiBTdGFydCBmaWxsaW5nIGluIG91ciBXb3JrIFJlcXVlc3QuICBOb3RlIHRoYXQgd2UgZG8gX25vdF8gaGFuZGxlCisJICogdGhlIFdSIEhlYWRlciB3cmFwcGluZyBhcm91bmQgdGhlIFRYIERlc2NyaXB0b3IgUmluZy4gIElmIG91cgorCSAqIG1heGltdW0gaGVhZGVyIHNpemUgZXZlciBleGNlZWRzIG9uZSBUWCBEZXNjcmlwdG9yLCB3ZSdsbCBuZWVkIHRvCisJICogZG8gc29tZXRoaW5nIGVsc2UgaGVyZS4KKwkgKi8KKwlCVUdfT04oRElWX1JPVU5EX1VQKEVUSFRYUV9NQVhfSERSLCBUWERfUEVSX0VRX1VOSVQpID4gMSk7CisJd3IgPSAodm9pZCAqKSZ0eHEtPnEuZGVzY1t0eHEtPnEucGlkeF07CisJd3ItPmVxdWlxX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIod3JfbWlkKTsKKwl3ci0+cjNbMF0gPSBjcHVfdG9fYmU2NCgwKTsKKwl3ci0+cjNbMV0gPSBjcHVfdG9fYmU2NCgwKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgKHZvaWQgKil3ci0+ZXRobWFjZHN0LCBmd19oZHJfY29weV9sZW4pOworCWVuZCA9ICh1NjQgKil3ciArIGZsaXRzOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgTGFyZ2UgU2VuZCBPZmZsb2FkIHBhY2tldCB3ZSdsbCBwdXQgaW4gYW4gTFNPIENQTAorCSAqIG1lc3NhZ2Ugd2l0aCBhbiBlbmNhcHN1bGF0ZWQgVFggUGFja2V0IENQTCBtZXNzYWdlLiAgT3RoZXJ3aXNlIHdlCisJICoganVzdCB1c2UgYSBUWCBQYWNrZXQgQ1BMIG1lc3NhZ2UuCisJICovCisJc3NpID0gc2tiX3NoaW5mbyhza2IpOworCWlmIChzc2ktPmdzb19zaXplKSB7CisJCXN0cnVjdCBjcGxfdHhfcGt0X2xzb19jb3JlICpsc28gPSAodm9pZCAqKSh3ciArIDEpOworCQlib29sIHY2ID0gKHNzaS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2KSAhPSAwOworCQlpbnQgbDNoZHJfbGVuID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOworCQlpbnQgZXRoX3h0cmFfbGVuID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgLSBFVEhfSExFTjsKKworCQl3ci0+b3BfaW1tZGxlbiA9CisJCQljcHVfdG9fYmUzMihGV19XUl9PUChGV19FVEhfVFhfUEtUX1ZNX1dSKSB8CisJCQkJICAgIEZXX1dSX0lNTURMRU4oc2l6ZW9mKCpsc28pICsKKwkJCQkJCSAgc2l6ZW9mKCpjcGwpKSk7CisJCS8qCisJCSAqIEZpbGwgaW4gdGhlIExTTyBDUEwgbWVzc2FnZS4KKwkJICovCisJCWxzby0+bHNvX2N0cmwgPQorCQkJY3B1X3RvX2JlMzIoTFNPX09QQ09ERShDUExfVFhfUEtUX0xTTykgfAorCQkJCSAgICBMU09fRklSU1RfU0xJQ0UgfAorCQkJCSAgICBMU09fTEFTVF9TTElDRSB8CisJCQkJICAgIExTT19JUFY2KHY2KSB8CisJCQkJICAgIExTT19FVEhIRFJfTEVOKGV0aF94dHJhX2xlbi80KSB8CisJCQkJICAgIExTT19JUEhEUl9MRU4obDNoZHJfbGVuLzQpIHwKKwkJCQkgICAgTFNPX1RDUEhEUl9MRU4odGNwX2hkcihza2IpLT5kb2ZmKSk7CisJCWxzby0+aXBpZF9vZnN0ID0gY3B1X3RvX2JlMTYoMCk7CisJCWxzby0+bXNzID0gY3B1X3RvX2JlMTYoc3NpLT5nc29fc2l6ZSk7CisJCWxzby0+c2Vxbm9fb2Zmc2V0ID0gY3B1X3RvX2JlMzIoMCk7CisJCWxzby0+bGVuID0gY3B1X3RvX2JlMzIoc2tiLT5sZW4pOworCisJCS8qCisJCSAqIFNldCB1cCBUWCBQYWNrZXQgQ1BMIHBvaW50ZXIsIGNvbnRyb2wgd29yZCBhbmQgcGVyZm9ybQorCQkgKiBhY2NvdW50aW5nLgorCQkgKi8KKwkJY3BsID0gKHZvaWQgKikobHNvICsgMSk7CisJCWNudHJsID0gKFRYUEtUX0NTVU1fVFlQRSh2NiA/IFRYX0NTVU1fVENQSVA2IDogVFhfQ1NVTV9UQ1BJUCkgfAorCQkJIFRYUEtUX0lQSERSX0xFTihsM2hkcl9sZW4pIHwKKwkJCSBUWFBLVF9FVEhIRFJfTEVOKGV0aF94dHJhX2xlbikpOworCQl0eHEtPnRzbysrOworCQl0eHEtPnR4X2NzbyArPSBzc2ktPmdzb19zZWdzOworCX0gZWxzZSB7CisJCWludCBsZW47CisKKwkJbGVuID0gaXNfZXRoX2ltbShza2IpID8gc2tiLT5sZW4gKyBzaXplb2YoKmNwbCkgOiBzaXplb2YoKmNwbCk7CisJCXdyLT5vcF9pbW1kbGVuID0KKwkJCWNwdV90b19iZTMyKEZXX1dSX09QKEZXX0VUSF9UWF9QS1RfVk1fV1IpIHwKKwkJCQkgICAgRldfV1JfSU1NRExFTihsZW4pKTsKKworCQkvKgorCQkgKiBTZXQgdXAgVFggUGFja2V0IENQTCBwb2ludGVyLCBjb250cm9sIHdvcmQgYW5kIHBlcmZvcm0KKwkJICogYWNjb3VudGluZy4KKwkJICovCisJCWNwbCA9ICh2b2lkICopKHdyICsgMSk7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCQljbnRybCA9IGh3Y3N1bShza2IpIHwgVFhQS1RfSVBDU1VNX0RJUzsKKwkJCXR4cS0+dHhfY3NvKys7CisJCX0gZWxzZQorCQkJY250cmwgPSBUWFBLVF9MNENTVU1fRElTIHwgVFhQS1RfSVBDU1VNX0RJUzsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBWTEFOIHRhZyBwcmVzZW50LCBhZGQgdGhhdCB0byB0aGUgbGlzdCBvZiB0aGluZ3MgdG8KKwkgKiBkbyBpbiB0aGlzIFdvcmsgUmVxdWVzdC4KKwkgKi8KKwlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCXR4cS0+dmxhbl9pbnMrKzsKKwkJY250cmwgfD0gVFhQS1RfVkxBTl9WTEQgfCBUWFBLVF9WTEFOKHZsYW5fdHhfdGFnX2dldChza2IpKTsKKwl9CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIFRYIFBhY2tldCBDUEwgbWVzc2FnZSBoZWFkZXIuCisJICovCisJY3BsLT5jdHJsMCA9IGNwdV90b19iZTMyKFRYUEtUX09QQ09ERShDUExfVFhfUEtUX1hUKSB8CisJCQkJIFRYUEtUX0lOVEYocGktPnBvcnRfaWQpIHwKKwkJCQkgVFhQS1RfUEYoMCkpOworCWNwbC0+cGFjayA9IGNwdV90b19iZTE2KDApOworCWNwbC0+bGVuID0gY3B1X3RvX2JlMTYoc2tiLT5sZW4pOworCWNwbC0+Y3RybDEgPSBjcHVfdG9fYmU2NChjbnRybCk7CisKKyNpZmRlZiBUNF9UUkFDRQorCVQ0X1RSQUNFNShhZGFwdGVyLT50Ylt0eHEtPnEuY250eHRfaWQgJiA3XSwKKwkJICAiZXRoX3htaXQ6IG5kZXNjICV1LCBjcmVkaXRzICV1LCBwaWR4ICV1LCBsZW4gJXUsIGZyYWdzICV1IiwKKwkJICBuZGVzYywgY3JlZGl0cywgdHhxLT5xLnBpZHgsIHNrYi0+bGVuLCBzc2ktPm5yX2ZyYWdzKTsKKyNlbmRpZgorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBib2R5IG9mIHRoZSBUWCBQYWNrZXQgQ1BMIG1lc3NhZ2Ugd2l0aCBlaXRoZXIgaW4tbGluZWQKKwkgKiBkYXRhIG9yIGEgU2NhdHRlci9HYXRoZXIgTGlzdC4KKwkgKi8KKwlpZiAoaXNfZXRoX2ltbShza2IpKSB7CisJCS8qCisJCSAqIEluLWxpbmUgdGhlIHBhY2tldCdzIGRhdGEgYW5kIGZyZWUgdGhlIHNrYiBzaW5jZSB3ZSBkb24ndAorCQkgKiBuZWVkIGl0IGFueSBsb25nZXIuCisJCSAqLworCQlpbmxpbmVfdHhfc2tiKHNrYiwgJnR4cS0+cSwgY3BsICsgMSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXcml0ZSB0aGUgc2tiJ3MgU2NhdHRlci9HYXRoZXIgbGlzdCBpbnRvIHRoZSBUWCBQYWNrZXQgQ1BMCisJCSAqIG1lc3NhZ2UgYW5kIHJldGFpbiBhIHBvaW50ZXIgdG8gdGhlIHNrYiBzbyB3ZSBjYW4gZnJlZSBpdAorCQkgKiBsYXRlciB3aGVuIGl0cyBETUEgY29tcGxldGVzLiAgKFdlIHN0b3JlIHRoZSBza2IgcG9pbnRlcgorCQkgKiBpbiB0aGUgU29mdHdhcmUgRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IFRYCisJCSAqIERlc2NyaXB0b3IgdXNlZCBieSB0aGUgV29yayBSZXF1ZXN0LikKKwkJICoKKwkJICogVGhlIHJldGFpbmVkIHNrYiB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgVFgKKwkJICogRGVzY3JpcHRvcnMgYXJlIHJlY2xhaW1lZCBhZnRlciB0aGVpciBETUFzIGNvbXBsZXRlLgorCQkgKiBIb3dldmVyLCB0aGlzIGNvdWxkIHRha2UgcXVpdGUgYSB3aGlsZSBzaW5jZSwgaW4gZ2VuZXJhbCwKKwkJICogdGhlIGhhcmR3YXJlIGlzIHNldCB1cCB0byBiZSBsYXp5IGFib3V0IHNlbmRpbmcgRE1BCisJCSAqIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucyB0byB1cyBhbmQgd2UgbW9zdGx5IHBlcmZvcm0gVFgKKwkJICogcmVjbGFpbXMgaW4gdGhlIHRyYW5zbWl0IHJvdXRpbmUuCisJCSAqCisJCSAqIFRoaXMgaXMgZ29vZCBmb3IgcGVyZm9ybWFtY2UgYnV0IG1lYW5zIHRoYXQgd2UgcmVseSBvbiBuZXcKKwkJICogVFggcGFja2V0cyBhcnJpdmluZyB0byBydW4gdGhlIGRlc3RydWN0b3JzIG9mIGNvbXBsZXRlZAorCQkgKiBwYWNrZXRzLCB3aGljaCBvcGVuIHVwIHNwYWNlIGluIHRoZWlyIHNvY2tldHMnIHNlbmQgcXVldWVzLgorCQkgKiBTb21ldGltZXMgd2UgZG8gbm90IGdldCBzdWNoIG5ldyBwYWNrZXRzIGNhdXNpbmcgVFggdG8KKwkJICogc3RhbGwuICBBIHNpbmdsZSBVRFAgdHJhbnNtaXR0ZXIgaXMgYSBnb29kIGV4YW1wbGUgb2YgdGhpcworCQkgKiBzaXR1YXRpb24uICBXZSBoYXZlIGEgY2xlYW4gdXAgdGltZXIgdGhhdCBwZXJpb2RpY2FsbHkKKwkJICogcmVjbGFpbXMgY29tcGxldGVkIHBhY2tldHMgYnV0IGl0IGRvZXNuJ3QgcnVuIG9mdGVuIGVub3VnaAorCQkgKiAobm9yIGRvIHdlIHdhbnQgaXQgdG8pIHRvIHByZXZlbnQgbGVuZ3RoeSBzdGFsbHMuICBBCisJCSAqIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSBpcyB0byBydW4gdGhlIGRlc3RydWN0b3IgZWFybHksCisJCSAqIGFmdGVyIHRoZSBwYWNrZXQgaXMgcXVldWVkIGJ1dCBiZWZvcmUgaXQncyBETUFkLiAgQSBjb24gaXMKKwkJICogdGhhdCB3ZSBsaWUgdG8gc29ja2V0IG1lbW9yeSBhY2NvdW50aW5nLCBidXQgdGhlIGFtb3VudCBvZgorCQkgKiBleHRyYSBtZW1vcnkgaXMgcmVhc29uYWJsZSAobGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIFRYCisJCSAqIGRlc2NyaXB0b3JzKSwgdGhlIHBhY2tldHMgZG8gYWN0dWFsbHkgZ2V0IGZyZWVkIHF1aWNrbHkgYnkKKwkJICogbmV3IHBhY2tldHMgYWxtb3N0IGFsd2F5cywgYW5kIGZvciBwcm90b2NvbHMgbGlrZSBUQ1AgdGhhdAorCQkgKiB3YWl0IGZvciBhY2tzIHRvIHJlYWxseSBmcmVlIHVwIHRoZSBkYXRhIHRoZSBleHRyYSBtZW1vcnkKKwkJICogaXMgZXZlbiBsZXNzLiAgT24gdGhlIHBvc2l0aXZlIHNpZGUgd2UgcnVuIHRoZSBkZXN0cnVjdG9ycworCQkgKiBvbiB0aGUgc2VuZGluZyBDUFUgcmF0aGVyIHRoYW4gb24gYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQKKwkJICogY29tcGxldGluZyBDUFUsIHVzdWFsbHkgYSBnb29kIHRoaW5nLgorCQkgKgorCQkgKiBSdW4gdGhlIGRlc3RydWN0b3IgYmVmb3JlIHRlbGxpbmcgdGhlIERNQSBlbmdpbmUgYWJvdXQgdGhlCisJCSAqIHBhY2tldCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBjb21wbGV0ZSBhbmQgZ2V0IGZyZWVkCisJCSAqIHByZW1hdHVyZWx5LgorCQkgKi8KKwkJc3RydWN0IHVscHR4X3NnbCAqc2dsID0gKHN0cnVjdCB1bHB0eF9zZ2wgKikoY3BsICsgMSk7CisJCXN0cnVjdCBzZ2VfdHhxICp0cSA9ICZ0eHEtPnE7CisJCWludCBsYXN0X2Rlc2M7CisKKwkJLyoKKwkJICogSWYgdGhlIFdvcmsgUmVxdWVzdCBoZWFkZXIgd2FzIGFuIGV4YWN0IG11bHRpcGxlIG9mIG91ciBUWAorCQkgKiBEZXNjcmlwdG9yIGxlbmd0aCwgdGhlbiBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHN0YXJ0aW5nIFNHTAorCQkgKiBwb2ludGVyIGxpbmVzIHVwIGV4YWN0bHkgd2l0aCB0aGUgZW5kIG9mIG91ciBUWCBEZXNjcmlwdG9yCisJCSAqIHJpbmcuICBJZiB0aGF0J3MgdGhlIGNhc2UsIHdyYXAgYXJvdW5kIHRvIHRoZSBiZWdpbm5pbmcKKwkJICogaGVyZSAuLi4KKwkJICovCisJCWlmICh1bmxpa2VseSgodm9pZCAqKXNnbCA9PSAodm9pZCAqKXRxLT5zdGF0KSkgeworCQkJc2dsID0gKHZvaWQgKil0cS0+ZGVzYzsKKwkJCWVuZCA9ICh2b2lkICopKCh2b2lkICopdHEtPmRlc2MgKworCQkJCSAgICAgICAoKHZvaWQgKillbmQgLSAodm9pZCAqKXRxLT5zdGF0KSk7CisJCX0KKworCQl3cml0ZV9zZ2woc2tiLCB0cSwgc2dsLCBlbmQsIDAsIGFkZHIpOworCQlza2Jfb3JwaGFuKHNrYik7CisKKwkJbGFzdF9kZXNjID0gdHEtPnBpZHggKyBuZGVzYyAtIDE7CisJCWlmIChsYXN0X2Rlc2MgPj0gdHEtPnNpemUpCisJCQlsYXN0X2Rlc2MgLT0gdHEtPnNpemU7CisJCXRxLT5zZGVzY1tsYXN0X2Rlc2NdLnNrYiA9IHNrYjsKKwkJdHEtPnNkZXNjW2xhc3RfZGVzY10uc2dsID0gc2dsOworCX0KKworCS8qCisJICogQWR2YW5jZSBvdXIgaW50ZXJuYWwgVFggUXVldWUgc3RhdGUsIHRlbGwgdGhlIGhhcmR3YXJlIGFib3V0CisJICogdGhlIG5ldyBUWCBkZXNjcmlwdG9ycyBhbmQgcmV0dXJuIHN1Y2Nlc3MuCisJICovCisJdHhxX2FkdmFuY2UoJnR4cS0+cSwgbmRlc2MpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJpbmdfdHhfZGIoYWRhcHRlciwgJnR4cS0+cSwgbmRlc2MpOworCXJldHVybiBORVRERVZfVFhfT0s7CisKK291dF9mcmVlOgorCS8qCisJICogQW4gZXJyb3Igb2Ygc29tZSBzb3J0IGhhcHBlbmVkLiAgRnJlZSB0aGUgVFggc2tiIGFuZCB0ZWxsIHRoZQorCSAqIE9TIHRoYXQgd2UndmUgImRlYWx0IiB3aXRoIHRoZSBwYWNrZXQgLi4uCisJICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qKgorICoJdDR2Zl9wa3RnbF9mcmVlIC0gZnJlZSBhIHBhY2tldCBnYXRoZXIgbGlzdAorICoJQGdsOiB0aGUgZ2F0aGVyIGxpc3QKKyAqCisgKglSZWxlYXNlcyB0aGUgcGFnZXMgb2YgYSBwYWNrZXQgZ2F0aGVyIGxpc3QuICBXZSBkbyBub3Qgb3duIHRoZSBsYXN0CisgKglwYWdlIG9uIHRoZSBsaXN0IGFuZCBkbyBub3QgZnJlZSBpdC4KKyAqLwordm9pZCB0NHZmX3BrdGdsX2ZyZWUoY29uc3Qgc3RydWN0IHBrdF9nbCAqZ2wpCit7CisJaW50IGZyYWc7CisKKwlmcmFnID0gZ2wtPm5mcmFncyAtIDE7CisJd2hpbGUgKGZyYWctLSkKKwkJcHV0X3BhZ2UoZ2wtPmZyYWdzW2ZyYWddLnBhZ2UpOworfQorCisvKioKKyAqCWNvcHlfZnJhZ3MgLSBjb3B5IGZyYWdtZW50cyBmcm9tIGdhdGhlciBsaXN0IGludG8gc2tiX3NoYXJlZF9pbmZvCisgKglAc2k6IGRlc3RpbmF0aW9uIHNrYiBzaGFyZWQgaW5mbyBzdHJ1Y3R1cmUKKyAqCUBnbDogc291cmNlIGludGVybmFsIHBhY2tldCBnYXRoZXIgbGlzdAorICoJQG9mZnNldDogcGFja2V0IHN0YXJ0IG9mZnNldCBpbiBmaXJzdCBwYWdlCisgKgorICoJQ29weSBhbiBpbnRlcm5hbCBwYWNrZXQgZ2F0aGVyIGxpc3QgaW50byBhIExpbnV4IHNrYl9zaGFyZWRfaW5mbworICoJc3RydWN0dXJlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9mcmFncyhzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsLAorCQkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgbjsKKworCS8qIHVzdWFsbHkgdGhlcmUncyBqdXN0IG9uZSBmcmFnICovCisJc2ktPmZyYWdzWzBdLnBhZ2UgPSBnbC0+ZnJhZ3NbMF0ucGFnZTsKKwlzaS0+ZnJhZ3NbMF0ucGFnZV9vZmZzZXQgPSBnbC0+ZnJhZ3NbMF0ucGFnZV9vZmZzZXQgKyBvZmZzZXQ7CisJc2ktPmZyYWdzWzBdLnNpemUgPSBnbC0+ZnJhZ3NbMF0uc2l6ZSAtIG9mZnNldDsKKwlzaS0+bnJfZnJhZ3MgPSBnbC0+bmZyYWdzOworCisJbiA9IGdsLT5uZnJhZ3MgLSAxOworCWlmIChuKQorCQltZW1jcHkoJnNpLT5mcmFnc1sxXSwgJmdsLT5mcmFnc1sxXSwgbiAqIHNpemVvZihza2JfZnJhZ190KSk7CisKKwkvKiBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QgcGFnZSwgd2UgZG9uJ3Qgb3duIGl0ICovCisJZ2V0X3BhZ2UoZ2wtPmZyYWdzW25dLnBhZ2UpOworfQorCisvKioKKyAqCWRvX2dybyAtIHBlcmZvcm0gR2VuZXJpYyBSZWNlaXZlIE9mZmxvYWQgaW5ncmVzcyBwYWNrZXQgcHJvY2Vzc2luZworICoJQHJ4cTogaW5ncmVzcyBSWCBFdGhlcm5ldCBRdWV1ZQorICoJQGdsOiBnYXRoZXIgbGlzdCBmb3IgaW5ncmVzcyBwYWNrZXQKKyAqCUBwa3Q6IENQTCBoZWFkZXIgZm9yIGxhc3QgcGFja2V0IGZyYWdtZW50CisgKgorICoJUGVyZm9ybSBHZW5lcmljIFJlY2VpdmUgT2ZmbG9hZCAoR1JPKSBpbmdyZXNzIHBhY2tldCBwcm9jZXNzaW5nLgorICoJV2UgdXNlIHRoZSBzdGFuZGFyZCBMaW51eCBHUk8gaW50ZXJmYWNlcyBmb3IgdGhpcy4KKyAqLworc3RhdGljIHZvaWQgZG9fZ3JvKHN0cnVjdCBzZ2VfZXRoX3J4cSAqcnhxLCBjb25zdCBzdHJ1Y3QgcGt0X2dsICpnbCwKKwkJICAgY29uc3Qgc3RydWN0IGNwbF9yeF9wa3QgKnBrdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBuYXBpX2dldF9mcmFncygmcnhxLT5yc3BxLm5hcGkpOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQl0NHZmX3BrdGdsX2ZyZWUoZ2wpOworCQlyeHEtPnN0YXRzLnJ4X2Ryb3BzKys7CisJCXJldHVybjsKKwl9CisKKwljb3B5X2ZyYWdzKHNrYl9zaGluZm8oc2tiKSwgZ2wsIFBLVFNISUZUKTsKKwlza2ItPmxlbiA9IGdsLT50b3RfbGVuIC0gUEtUU0hJRlQ7CisJc2tiLT5kYXRhX2xlbiA9IHNrYi0+bGVuOworCXNrYi0+dHJ1ZXNpemUgKz0gc2tiLT5kYXRhX2xlbjsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCByeHEtPnJzcHEuaWR4KTsKKworCWlmICh1bmxpa2VseShwa3QtPnZsYW5fZXgpKSB7CisJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYocnhxLT5yc3BxLm5ldGRldik7CisJCXN0cnVjdCB2bGFuX2dyb3VwICpncnAgPSBwaS0+dmxhbl9ncnA7CisKKwkJcnhxLT5zdGF0cy52bGFuX2V4Kys7CisJCWlmIChsaWtlbHkoZ3JwKSkgeworCQkJcmV0ID0gdmxhbl9ncm9fZnJhZ3MoJnJ4cS0+cnNwcS5uYXBpLCBncnAsCisJCQkJCSAgICAgYmUxNl90b19jcHUocGt0LT52bGFuKSk7CisJCQlnb3RvIHN0YXRzOworCQl9CisJfQorCXJldCA9IG5hcGlfZ3JvX2ZyYWdzKCZyeHEtPnJzcHEubmFwaSk7CisKK3N0YXRzOgorCWlmIChyZXQgPT0gR1JPX0hFTEQpCisJCXJ4cS0+c3RhdHMubHJvX3BrdHMrKzsKKwllbHNlIGlmIChyZXQgPT0gR1JPX01FUkdFRCB8fCByZXQgPT0gR1JPX01FUkdFRF9GUkVFKQorCQlyeHEtPnN0YXRzLmxyb19tZXJnZWQrKzsKKwlyeHEtPnN0YXRzLnBrdHMrKzsKKwlyeHEtPnN0YXRzLnJ4X2NzbysrOworfQorCisvKioKKyAqCXQ0dmZfZXRocnhfaGFuZGxlciAtIHByb2Nlc3MgYW4gaW5ncmVzcyBldGhlcm5ldCBwYWNrZXQKKyAqCUByc3BxOiB0aGUgcmVzcG9uc2UgcXVldWUgdGhhdCByZWNlaXZlZCB0aGUgcGFja2V0CisgKglAcnNwOiB0aGUgcmVzcG9uc2UgcXVldWUgZGVzY3JpcHRvciBob2xkaW5nIHRoZSBSWF9QS1QgbWVzc2FnZQorICoJQGdsOiB0aGUgZ2F0aGVyIGxpc3Qgb2YgcGFja2V0IGZyYWdtZW50cworICoKKyAqCVByb2Nlc3MgYW4gaW5ncmVzcyBldGhlcm5ldCBwYWNrZXQgYW5kIGRlbGl2ZXIgaXQgdG8gdGhlIHN0YWNrLgorICovCitpbnQgdDR2Zl9ldGhyeF9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcnNwcSwgY29uc3QgX19iZTY0ICpyc3AsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGt0X2dsICpnbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNzaTsKKwljb25zdCBzdHJ1Y3QgY3BsX3J4X3BrdCAqcGt0ID0gKHZvaWQgKikmcnNwWzFdOworCWJvb2wgY3N1bV9vayA9IHBrdC0+Y3N1bV9jYWxjICYmICFwa3QtPmVycl92ZWM7CisJdW5zaWduZWQgaW50IGxlbiA9IGJlMTZfdG9fY3B1KHBrdC0+bGVuKTsKKwlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9IGNvbnRhaW5lcl9vZihyc3BxLCBzdHJ1Y3Qgc2dlX2V0aF9yeHEsIHJzcHEpOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgZ29vZCBUQ1AgcGFja2V0IGFuZCB3ZSBoYXZlIEdlbmVyaWMgUmVjZWl2ZSBPZmZsb2FkCisJICogZW5hYmxlZCwgaGFuZGxlIHRoZSBwYWNrZXQgaW4gdGhlIEdSTyBwYXRoLgorCSAqLworCWlmICgocGt0LT5sMmluZm8gJiBjcHVfdG9fYmUzMihSWEZfVENQKSkgJiYKKwkgICAgKHJzcHEtPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dSTykgJiYgY3N1bV9vayAmJgorCSAgICAhcGt0LT5pcF9mcmFnKSB7CisJCWRvX2dybyhyeHEsIGdsLCBwa3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBpbmdyZXNzIHBhY2tldCBpcyBzbWFsbCBlbm91Z2gsIGFsbG9jYXRlIGFuIHNrYiBsYXJnZSBlbm91Z2gKKwkgKiBmb3IgYWxsIG9mIHRoZSBkYXRhIGFuZCBjb3B5IGl0IGlubGluZS4gIE90aGVyd2lzZSwgYWxsb2NhdGUgYW4gc2tiCisJICogd2l0aCBlbm91Z2ggcm9vbSB0byBwdWxsIGluIHRoZSBoZWFkZXIgYW5kIHJlZmVyZW5jZSB0aGUgcmVzdCBvZgorCSAqIHRoZSBkYXRhIHZpYSB0aGUgc2tiIGZyYWdtZW50IGxpc3QuCisJICovCisJaWYgKGxlbiA8PSBSWF9DT1BZX1RIUkVTKSB7CisJCS8qIHNtYWxsIHBhY2tldHMgaGF2ZSBvbmx5IG9uZSBmcmFnbWVudCAqLworCQlza2IgPSBhbGxvY19za2IoZ2wtPmZyYWdzWzBdLnNpemUsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikKKwkJCWdvdG8gbm9tZW07CisJCV9fc2tiX3B1dChza2IsIGdsLT5mcmFnc1swXS5zaXplKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBnbC0+dmEsIGdsLT5mcmFnc1swXS5zaXplKTsKKwl9IGVsc2UgeworCQlza2IgPSBhbGxvY19za2IoUlhfUEtUX1BVTExfTEVOLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIG5vbWVtOworCQlfX3NrYl9wdXQoc2tiLCBSWF9QS1RfUFVMTF9MRU4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGdsLT52YSwgUlhfUEtUX1BVTExfTEVOKTsKKworCQlzc2kgPSBza2Jfc2hpbmZvKHNrYik7CisJCXNzaS0+ZnJhZ3NbMF0ucGFnZSA9IGdsLT5mcmFnc1swXS5wYWdlOworCQlzc2ktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ID0gKGdsLT5mcmFnc1swXS5wYWdlX29mZnNldCArCisJCQkJCSAgICAgUlhfUEtUX1BVTExfTEVOKTsKKwkJc3NpLT5mcmFnc1swXS5zaXplID0gZ2wtPmZyYWdzWzBdLnNpemUgLSBSWF9QS1RfUFVMTF9MRU47CisJCWlmIChnbC0+bmZyYWdzID4gMSkKKwkJCW1lbWNweSgmc3NpLT5mcmFnc1sxXSwgJmdsLT5mcmFnc1sxXSwKKwkJCSAgICAgICAoZ2wtPm5mcmFncy0xKSAqIHNpemVvZihza2JfZnJhZ190KSk7CisJCXNzaS0+bnJfZnJhZ3MgPSBnbC0+bmZyYWdzOworCQlza2ItPmxlbiA9IGxlbiArIFBLVFNISUZUOworCQlza2ItPmRhdGFfbGVuID0gc2tiLT5sZW4gLSBSWF9QS1RfUFVMTF9MRU47CisJCXNrYi0+dHJ1ZXNpemUgKz0gc2tiLT5kYXRhX2xlbjsKKworCQkvKiBHZXQgYSByZWZlcmVuY2UgZm9yIHRoZSBsYXN0IHBhZ2UsIHdlIGRvbid0IG93biBpdCAqLworCQlnZXRfcGFnZShnbC0+ZnJhZ3NbZ2wtPm5mcmFncyAtIDFdLnBhZ2UpOworCX0KKworCV9fc2tiX3B1bGwoc2tiLCBQS1RTSElGVCk7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcnNwcS0+bmV0ZGV2KTsKKwlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnNwcS0+aWR4KTsKKwlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7ICAgICAgICAgICAgICAgICAgLyogWFhYIHJlbW92ZWQgMi42LjI5ICovCisJcGkgPSBuZXRkZXZfcHJpdihza2ItPmRldik7CisJcnhxLT5zdGF0cy5wa3RzKys7CisKKwlpZiAoY3N1bV9vayAmJiAocGktPnJ4X29mZmxvYWQgJiBSWF9DU08pICYmICFwa3QtPmVycl92ZWMgJiYKKwkgICAgKGJlMzJfdG9fY3B1KHBrdC0+bDJpbmZvKSAmIChSWEZfVURQfFJYRl9UQ1ApKSkgeworCQlpZiAoIXBrdC0+aXBfZnJhZykKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWVsc2UgeworCQkJX19zdW0xNiBjID0gKF9fZm9yY2UgX19zdW0xNilwa3QtPmNzdW07CisJCQlza2ItPmNzdW0gPSBjc3VtX3VuZm9sZChjKTsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CisJCX0KKwkJcnhxLT5zdGF0cy5yeF9jc28rKzsKKwl9IGVsc2UKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJaWYgKHVubGlrZWx5KHBrdC0+dmxhbl9leCkpIHsKKwkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCA9IHBpLT52bGFuX2dycDsKKworCQlyeHEtPnN0YXRzLnZsYW5fZXgrKzsKKwkJaWYgKGxpa2VseShncnApKQorCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgZ3JwLAorCQkJCQkJIGJlMTZfdG9fY3B1KHBrdC0+dmxhbikpOworCQllbHNlCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0gZWxzZQorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJcmV0dXJuIDA7CisKK25vbWVtOgorCXQ0dmZfcGt0Z2xfZnJlZShnbCk7CisJcnhxLT5zdGF0cy5yeF9kcm9wcysrOworCXJldHVybiAwOworfQorCisvKioKKyAqCWlzX25ld19yZXNwb25zZSAtIGNoZWNrIGlmIGEgcmVzcG9uc2UgaXMgbmV3bHkgd3JpdHRlbgorICoJQHJjOiB0aGUgcmVzcG9uc2UgY29udHJvbCBkZXNjcmlwdG9yCisgKglAcnNwcTogdGhlIHJlc3BvbnNlIHF1ZXVlCisgKgorICoJUmV0dXJucyB0cnVlIGlmIGEgcmVzcG9uc2UgZGVzY3JpcHRvciBjb250YWlucyBhIHlldCB1bnByb2Nlc3NlZAorICoJcmVzcG9uc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19uZXdfcmVzcG9uc2UoY29uc3Qgc3RydWN0IHJzcF9jdHJsICpyYywKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnJzcHEpCit7CisJcmV0dXJuIFJTUERfR0VOKHJjLT50eXBlX2dlbikgPT0gcnNwcS0+Z2VuOworfQorCisvKioKKyAqCXJlc3RvcmVfcnhfYnVmcyAtIHB1dCBiYWNrIGEgcGFja2V0J3MgUlggYnVmZmVycworICoJQGdsOiB0aGUgcGFja2V0IGdhdGhlciBsaXN0CisgKglAZmw6IHRoZSBTR0UgRnJlZSBMaXN0CisgKglAbmZyYWdzOiBob3cgbWFueSBmcmFnbWVudHMgaW4gQHNpCisgKgorICoJQ2FsbGVkIHdoZW4gd2UgZmluZCBvdXQgdGhhdCB0aGUgY3VycmVudCBwYWNrZXQsIEBzaSwgY2FuJ3QgYmUKKyAqCXByb2Nlc3NlZCByaWdodCBhd2F5IGZvciBzb21lIHJlYXNvbi4gIFRoaXMgaXMgYSB2ZXJ5IHJhcmUgZXZlbnQgYW5kCisgKgl0aGVyZSdzIG5vIGVmZm9ydCB0byBtYWtlIHRoaXMgc3VzcGVuc2lvbi9yZXN1bXB0aW9uIHByb2Nlc3MKKyAqCXBhcnRpY3VsYXJseSBlZmZpY2llbnQuCisgKgorICoJV2UgaW1wbGVtZW50IHRoZSBzdXNwZW5zaW9uIGJ5IHB1dHRpbmcgYWxsIG9mIHRoZSBSWCBidWZmZXJzIGFzc29jaWF0ZWQKKyAqCXdpdGggdGhlIGN1cnJlbnQgcGFja2V0IGJhY2sgb24gdGhlIG9yaWdpbmFsIEZyZWUgTGlzdC4gIFRoZSBidWZmZXJzCisgKgloYXZlIGFscmVhZHkgYmVlbiB1bm1hcHBlZCBhbmQgYXJlIGxlZnQgdW5tYXBwZWQsIHdlIG1hcmsgdGhlbSBhcworICoJdW5tYXBwZWQgaW4gb3JkZXIgdG8gcHJldmVudCBmdXJ0aGVyIHVubWFwcGluZyBhdHRlbXB0cy4gIChFZmZlY3RpdmVseQorICoJdGhpcyBmdW5jdGlvbiB1bmRvZXMgdGhlIHNlcmllcyBvZiBAdW5tYXBfcnhfYnVmIGNhbGxzIHdoaWNoIHdlcmUgZG9uZQorICoJdG8gY3JlYXRlIHRoZSBjdXJyZW50IHBhY2tldCdzIGdhdGhlciBsaXN0LikgIFRoaXMgbGVhdmVzIHVzIHJlYWR5IHRvCisgKglyZXN0YXJ0IHByb2Nlc3Npbmcgb2YgdGhlIHBhY2tldCB0aGUgbmV4dCB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlCisgKglSWCBRdWV1ZSAuLi4KKyAqLworc3RhdGljIHZvaWQgcmVzdG9yZV9yeF9idWZzKGNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsLCBzdHJ1Y3Qgc2dlX2ZsICpmbCwKKwkJCSAgICBpbnQgZnJhZ3MpCit7CisJc3RydWN0IHJ4X3N3X2Rlc2MgKnNkZXNjOworCisJd2hpbGUgKGZyYWdzLS0pIHsKKwkJaWYgKGZsLT5jaWR4ID09IDApCisJCQlmbC0+Y2lkeCA9IGZsLT5zaXplIC0gMTsKKwkJZWxzZQorCQkJZmwtPmNpZHgtLTsKKwkJc2Rlc2MgPSAmZmwtPnNkZXNjW2ZsLT5jaWR4XTsKKwkJc2Rlc2MtPnBhZ2UgPSBnbC0+ZnJhZ3NbZnJhZ3NdLnBhZ2U7CisJCXNkZXNjLT5kbWFfYWRkciB8PSBSWF9VTk1BUFBFRF9CVUY7CisJCWZsLT5hdmFpbCsrOworCX0KK30KKworLyoqCisgKglyc3BxX25leHQgLSBhZHZhbmNlIHRvIHRoZSBuZXh0IGVudHJ5IGluIGEgcmVzcG9uc2UgcXVldWUKKyAqCUByc3BxOiB0aGUgcXVldWUKKyAqCisgKglVcGRhdGVzIHRoZSBzdGF0ZSBvZiBhIHJlc3BvbnNlIHF1ZXVlIHRvIGFkdmFuY2UgaXQgdG8gdGhlIG5leHQgZW50cnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByc3BxX25leHQoc3RydWN0IHNnZV9yc3BxICpyc3BxKQoreworCXJzcHEtPmN1cl9kZXNjID0gKHZvaWQgKilyc3BxLT5jdXJfZGVzYyArIHJzcHEtPmlxZV9sZW47CisJaWYgKHVubGlrZWx5KCsrcnNwcS0+Y2lkeCA9PSByc3BxLT5zaXplKSkgeworCQlyc3BxLT5jaWR4ID0gMDsKKwkJcnNwcS0+Z2VuIF49IDE7CisJCXJzcHEtPmN1cl9kZXNjID0gcnNwcS0+ZGVzYzsKKwl9Cit9CisKKy8qKgorICoJcHJvY2Vzc19yZXNwb25zZXMgLSBwcm9jZXNzIHJlc3BvbnNlcyBmcm9tIGFuIFNHRSByZXNwb25zZSBxdWV1ZQorICoJQHJzcHE6IHRoZSBpbmdyZXNzIHJlc3BvbnNlIHF1ZXVlIHRvIHByb2Nlc3MKKyAqCUBidWRnZXQ6IGhvdyBtYW55IHJlc3BvbnNlcyBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoaXMgcm91bmQKKyAqCisgKglQcm9jZXNzIHJlc3BvbnNlcyBmcm9tIGEgU2NhdHRlciBHYXRoZXIgRW5naW5lIHJlc3BvbnNlIHF1ZXVlIHVwIHRvCisgKgl0aGUgc3VwcGxpZWQgYnVkZ2V0LiAgUmVzcG9uc2VzIGluY2x1ZGUgcmVjZWl2ZWQgcGFja2V0cyBhcyB3ZWxsIGFzCisgKgljb250cm9sIG1lc3NhZ2VzIGZyb20gZmlybXdhcmUgb3IgaGFyZHdhcmUuCisgKgorICoJQWRkaXRpb25hbGx5IGNob29zZSB0aGUgaW50ZXJydXB0IGhvbGRvZmYgdGltZSBmb3IgdGhlIG5leHQgaW50ZXJydXB0CisgKglvbiB0aGlzIHF1ZXVlLiAgSWYgdGhlIHN5c3RlbSBpcyB1bmRlciBtZW1vcnkgc2hvcnRhZ2UgdXNlIGEgZmFpcmx5CisgKglsb25nIGRlbGF5IHRvIGhlbHAgcmVjb3ZlcnkuCisgKi8KK2ludCBwcm9jZXNzX3Jlc3BvbnNlcyhzdHJ1Y3Qgc2dlX3JzcHEgKnJzcHEsIGludCBidWRnZXQpCit7CisJc3RydWN0IHNnZV9ldGhfcnhxICpyeHEgPSBjb250YWluZXJfb2YocnNwcSwgc3RydWN0IHNnZV9ldGhfcnhxLCByc3BxKTsKKwlpbnQgYnVkZ2V0X2xlZnQgPSBidWRnZXQ7CisKKwl3aGlsZSAobGlrZWx5KGJ1ZGdldF9sZWZ0KSkgeworCQlpbnQgcmV0LCByc3BfdHlwZTsKKwkJY29uc3Qgc3RydWN0IHJzcF9jdHJsICpyYzsKKworCQlyYyA9ICh2b2lkICopcnNwcS0+Y3VyX2Rlc2MgKyAocnNwcS0+aXFlX2xlbiAtIHNpemVvZigqcmMpKTsKKwkJaWYgKCFpc19uZXdfcmVzcG9uc2UocmMsIHJzcHEpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRmlndXJlIG91dCB3aGF0IGtpbmQgb2YgcmVzcG9uc2Ugd2UndmUgcmVjZWl2ZWQgZnJvbSB0aGUKKwkJICogU0dFLgorCQkgKi8KKwkJcm1iKCk7CisJCXJzcF90eXBlID0gUlNQRF9UWVBFKHJjLT50eXBlX2dlbik7CisJCWlmIChsaWtlbHkocnNwX3R5cGUgPT0gUlNQX1RZUEVfRkxCVUYpKSB7CisJCQlza2JfZnJhZ190ICpmcDsKKwkJCXN0cnVjdCBwa3RfZ2wgZ2w7CisJCQljb25zdCBzdHJ1Y3Qgcnhfc3dfZGVzYyAqc2Rlc2M7CisJCQl1MzIgYnVmc3osIGZyYWc7CisJCQl1MzIgbGVuID0gYmUzMl90b19jcHUocmMtPnBsZGJ1Zmxlbl9xaWQpOworCisJCQkvKgorCQkJICogSWYgd2UgZ2V0IGEgIm5ldyBidWZmZXIiIG1lc3NhZ2UgZnJvbSB0aGUgU0dFIHdlCisJCQkgKiBuZWVkIHRvIG1vdmUgb24gdG8gdGhlIG5leHQgRnJlZSBMaXN0IGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKGxlbiAmIFJTUERfTkVXQlVGKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBnZXQgb25lICJuZXcgYnVmZmVyIiBtZXNzYWdlIHdoZW4gd2UKKwkJCQkgKiBmaXJzdCBzdGFydCB1cCBhIHF1ZXVlIHNvIHdlIG5lZWQgdG8gaWdub3JlCisJCQkJICogaXQgd2hlbiBvdXIgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBpcyAwLgorCQkJCSAqLworCQkJCWlmIChsaWtlbHkocnNwcS0+b2Zmc2V0ID4gMCkpIHsKKwkJCQkJZnJlZV9yeF9idWZzKHJzcHEtPmFkYXB0ZXIsICZyeHEtPmZsLAorCQkJCQkJICAgICAxKTsKKwkJCQkJcnNwcS0+b2Zmc2V0ID0gMDsKKwkJCQl9CisJCQkJbGVuID0gUlNQRF9MRU4obGVuKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEdhdGhlciBwYWNrZXQgZnJhZ21lbnRzLgorCQkJICovCisJCQlmb3IgKGZyYWcgPSAwLCBmcCA9IGdsLmZyYWdzOyAvKiovOyBmcmFnKyssIGZwKyspIHsKKwkJCQlCVUdfT04oZnJhZyA+PSBNQVhfU0tCX0ZSQUdTKTsKKwkJCQlCVUdfT04ocnhxLT5mbC5hdmFpbCA9PSAwKTsKKwkJCQlzZGVzYyA9ICZyeHEtPmZsLnNkZXNjW3J4cS0+ZmwuY2lkeF07CisJCQkJYnVmc3ogPSBnZXRfYnVmX3NpemUoc2Rlc2MpOworCQkJCWZwLT5wYWdlID0gc2Rlc2MtPnBhZ2U7CisJCQkJZnAtPnBhZ2Vfb2Zmc2V0ID0gcnNwcS0+b2Zmc2V0OworCQkJCWZwLT5zaXplID0gbWluKGJ1ZnN6LCBsZW4pOworCQkJCWxlbiAtPSBmcC0+c2l6ZTsKKwkJCQlpZiAoIWxlbikKKwkJCQkJYnJlYWs7CisJCQkJdW5tYXBfcnhfYnVmKHJzcHEtPmFkYXB0ZXIsICZyeHEtPmZsKTsKKwkJCX0KKwkJCWdsLm5mcmFncyA9IGZyYWcrMTsKKworCQkJLyoKKwkJCSAqIExhc3QgYnVmZmVyIHJlbWFpbnMgbWFwcGVkIHNvIGV4cGxpY2l0bHkgbWFrZSBpdAorCQkJICogY29oZXJlbnQgZm9yIENQVSBhY2Nlc3MgYW5kIHN0YXJ0IHByZWxvYWRpbmcgZmlyc3QKKwkJCSAqIGNhY2hlIGxpbmUgLi4uCisJCQkgKi8KKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHJzcHEtPmFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCQkJZ2V0X2J1Zl9hZGRyKHNkZXNjKSwKKwkJCQkJCWZwLT5zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJZ2wudmEgPSAocGFnZV9hZGRyZXNzKGdsLmZyYWdzWzBdLnBhZ2UpICsKKwkJCQkgZ2wuZnJhZ3NbMF0ucGFnZV9vZmZzZXQpOworCQkJcHJlZmV0Y2goZ2wudmEpOworCisJCQkvKgorCQkJICogSGFuZCB0aGUgbmV3IGluZ3Jlc3MgcGFja2V0IHRvIHRoZSBoYW5kbGVyIGZvcgorCQkJICogdGhpcyBSZXNwb25zZSBRdWV1ZS4KKwkJCSAqLworCQkJcmV0ID0gcnNwcS0+aGFuZGxlcihyc3BxLCByc3BxLT5jdXJfZGVzYywgJmdsKTsKKwkJCWlmIChsaWtlbHkocmV0ID09IDApKQorCQkJCXJzcHEtPm9mZnNldCArPSBBTElHTihmcC0+c2l6ZSwgRkxfQUxJR04pOworCQkJZWxzZQorCQkJCXJlc3RvcmVfcnhfYnVmcygmZ2wsICZyeHEtPmZsLCBmcmFnKTsKKwkJfSBlbHNlIGlmIChsaWtlbHkocnNwX3R5cGUgPT0gUlNQX1RZUEVfQ1BMKSkgeworCQkJcmV0ID0gcnNwcS0+aGFuZGxlcihyc3BxLCByc3BxLT5jdXJfZGVzYywgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlXQVJOX09OKHJzcF90eXBlID4gUlNQX1RZUEVfQ1BMKTsKKwkJCXJldCA9IDA7CisJCX0KKworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJLyoKKwkJCSAqIENvdWxkbid0IHByb2Nlc3MgZGVzY3JpcHRvciwgYmFjayBvZmYgZm9yIHJlY292ZXJ5LgorCQkJICogV2UgdXNlIHRoZSBTR0UncyBsYXN0IHRpbWVyIHdoaWNoIGhhcyB0aGUgbG9uZ2VzdAorCQkJICogaW50ZXJydXB0IGNvYWxlc2NpbmcgdmFsdWUgLi4uCisJCQkgKi8KKwkJCWNvbnN0IGludCBOT01FTV9USU1FUl9JRFggPSBTR0VfTlRJTUVSUy0xOworCQkJcnNwcS0+bmV4dF9pbnRyX3BhcmFtcyA9CisJCQkJUUlOVFJfVElNRVJfSURYKE5PTUVNX1RJTUVSX0lEWCk7CisJCQlicmVhazsKKwkJfQorCisJCXJzcHFfbmV4dChyc3BxKTsKKwkJYnVkZ2V0X2xlZnQtLTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBSZXNwb25zZSBRdWV1ZSB3aXRoIGFuIGFzc29jaWF0ZWQgRnJlZSBMaXN0IGFuZAorCSAqIGF0IGxlYXN0IHR3byBFZ3Jlc3MgUXVldWUgdW5pdHMgYXZhaWxhYmxlIGluIHRoZSBGcmVlIExpc3QKKwkgKiBmb3IgbmV3IGJ1ZmZlciBwb2ludGVycywgcmVmaWxsIHRoZSBGcmVlIExpc3QuCisJICovCisJaWYgKHJzcHEtPm9mZnNldCA+PSAwICYmCisJICAgIHJ4cS0+Zmwuc2l6ZSAtIHJ4cS0+ZmwuYXZhaWwgPj0gMipGTF9QRVJfRVFfVU5JVCkKKwkJX19yZWZpbGxfZmwocnNwcS0+YWRhcHRlciwgJnJ4cS0+ZmwpOworCXJldHVybiBidWRnZXQgLSBidWRnZXRfbGVmdDsKK30KKworLyoqCisgKgluYXBpX3J4X2hhbmRsZXIgLSB0aGUgTkFQSSBoYW5kbGVyIGZvciBSWCBwcm9jZXNzaW5nCisgKglAbmFwaTogdGhlIG5hcGkgaW5zdGFuY2UKKyAqCUBidWRnZXQ6IGhvdyBtYW55IHBhY2tldHMgd2UgY2FuIHByb2Nlc3MgaW4gdGhpcyByb3VuZAorICoKKyAqCUhhbmRsZXIgZm9yIG5ldyBkYXRhIGV2ZW50cyB3aGVuIHVzaW5nIE5BUEkuICBUaGlzIGRvZXMgbm90IG5lZWQgYW55CisgKglsb2NraW5nIG9yIHByb3RlY3Rpb24gZnJvbSBpbnRlcnJ1cHRzIGFzIGRhdGEgaW50ZXJydXB0cyBhcmUgb2ZmIGF0CisgKgl0aGlzIHBvaW50IGFuZCBvdGhlciBhZGFwdGVyIGludGVycnVwdHMgZG8gbm90IGludGVyZmVyZSAodGhlIGxhdHRlcgorICoJaW4gbm90IGEgY29uY2VybiBhdCBhbGwgd2l0aCBNU0ktWCBhcyBub24tZGF0YSBpbnRlcnJ1cHRzIHRoZW4gaGF2ZQorICoJYSBzZXBhcmF0ZSBoYW5kbGVyKS4KKyAqLworc3RhdGljIGludCBuYXBpX3J4X2hhbmRsZXIoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXVuc2lnbmVkIGludCBpbnRyX3BhcmFtczsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKnJzcHEgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IHNnZV9yc3BxLCBuYXBpKTsKKwlpbnQgd29ya19kb25lID0gcHJvY2Vzc19yZXNwb25zZXMocnNwcSwgYnVkZ2V0KTsKKworCWlmIChsaWtlbHkod29ya19kb25lIDwgYnVkZ2V0KSkgeworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQlpbnRyX3BhcmFtcyA9IHJzcHEtPm5leHRfaW50cl9wYXJhbXM7CisJCXJzcHEtPm5leHRfaW50cl9wYXJhbXMgPSByc3BxLT5pbnRyX3BhcmFtczsKKwl9IGVsc2UKKwkJaW50cl9wYXJhbXMgPSBRSU5UUl9USU1FUl9JRFgoU0dFX1RJTUVSX1VQRF9DSURYKTsKKworCWlmICh1bmxpa2VseSh3b3JrX2RvbmUgPT0gMCkpCisJCXJzcHEtPnVuaGFuZGxlZF9pcnFzKys7CisKKwl0NF93cml0ZV9yZWcocnNwcS0+YWRhcHRlciwKKwkJICAgICBUNFZGX1NHRV9CQVNFX0FERFIgKyBTR0VfVkZfR1RTLAorCQkgICAgIENJRFhJTkMod29ya19kb25lKSB8CisJCSAgICAgSU5HUkVTU1FJRCgodTMyKXJzcHEtPmNudHh0X2lkKSB8CisJCSAgICAgU0VJTlRBUk0oaW50cl9wYXJhbXMpKTsKKwlyZXR1cm4gd29ya19kb25lOworfQorCisvKgorICogVGhlIE1TSS1YIGludGVycnVwdCBoYW5kbGVyIGZvciBhbiBTR0UgcmVzcG9uc2UgcXVldWUgZm9yIHRoZSBOQVBJIGNhc2UKKyAqIChpLmUuLCByZXNwb25zZSBxdWV1ZSBzZXJ2aWNlZCBieSBOQVBJIHBvbGxpbmcpLgorICovCitpcnFyZXR1cm5fdCB0NHZmX3NnZV9pbnRyX21zaXgoaW50IGlycSwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBzZ2VfcnNwcSAqcnNwcSA9IGNvb2tpZTsKKworCW5hcGlfc2NoZWR1bGUoJnJzcHEtPm5hcGkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFByb2Nlc3MgdGhlIGluZGlyZWN0IGludGVycnVwdCBlbnRyaWVzIGluIHRoZSBpbnRlcnJ1cHQgcXVldWUgYW5kIGtpY2sgb2ZmCisgKiBOQVBJIGZvciBlYWNoIHF1ZXVlIHRoYXQgaGFzIGdlbmVyYXRlZCBhbiBlbnRyeS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwcm9jZXNzX2ludHJxKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcHRlci0+c2dlOworCXN0cnVjdCBzZ2VfcnNwcSAqaW50cnEgPSAmcy0+aW50cnE7CisJdW5zaWduZWQgaW50IHdvcmtfZG9uZTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+c2dlLmludHJxX2xvY2spOworCWZvciAod29ya19kb25lID0gMDsgOyB3b3JrX2RvbmUrKykgeworCQljb25zdCBzdHJ1Y3QgcnNwX2N0cmwgKnJjOworCQl1bnNpZ25lZCBpbnQgcWlkLCBpcV9pZHg7CisJCXN0cnVjdCBzZ2VfcnNwcSAqcnNwcTsKKworCQkvKgorCQkgKiBHcmFiIHRoZSBuZXh0IHJlc3BvbnNlIGZyb20gdGhlIGludGVycnVwdCBxdWV1ZSBhbmQgYmFpbAorCQkgKiBvdXQgaWYgaXQncyBub3QgYSBuZXcgcmVzcG9uc2UuCisJCSAqLworCQlyYyA9ICh2b2lkICopaW50cnEtPmN1cl9kZXNjICsgKGludHJxLT5pcWVfbGVuIC0gc2l6ZW9mKCpyYykpOworCQlpZiAoIWlzX25ld19yZXNwb25zZShyYywgaW50cnEpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogSWYgdGhlIHJlc3BvbnNlIGlzbid0IGEgZm9yd2FyZGVkIGludGVycnVwdCBtZXNzYWdlIGlzc3VlIGEKKwkJICogZXJyb3IgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHJlc3BvbnNlIG1lc3NhZ2UuICBUaGlzIHNob3VsZAorCQkgKiBuZXZlciBoYXBwZW4gLi4uCisJCSAqLworCQlybWIoKTsKKwkJaWYgKHVubGlrZWx5KFJTUERfVFlQRShyYy0+dHlwZV9nZW4pICE9IFJTUF9UWVBFX0lOVFIpKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCSJVbmV4cGVjdGVkIElOVFJRIHJlc3BvbnNlIHR5cGUgJWRcbiIsCisJCQkJUlNQRF9UWVBFKHJjLT50eXBlX2dlbikpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBFeHRyYWN0IHRoZSBRdWV1ZSBJRCBmcm9tIHRoZSBpbnRlcnJ1cHQgbWVzc2FnZSBhbmQgcGVyZm9ybQorCQkgKiBzYW5pdHkgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIGl0IHJlYWxseSByZWZlcnMgdG8gb25lIG9mIG91cgorCQkgKiBJbmdyZXNzIFF1ZXVlcyB3aGljaCBpcyBhY3RpdmUgYW5kIG1hdGNoZXMgdGhlIHF1ZXVlJ3MgSUQuCisJCSAqIE5vbmUgb2YgdGhlc2UgZXJyb3IgY29uZGl0aW9ucyBzaG91bGQgZXZlciBoYXBwZW4gc28gd2UgbWF5CisJCSAqIHdhbnQgdG8gZWl0aGVyIG1ha2UgdGhlbSBmYXRhbCBhbmQvb3IgY29uZGl0aW9uYWxpemVkIHVuZGVyCisJCSAqIERFQlVHLgorCQkgKi8KKwkJcWlkID0gUlNQRF9RSUQoYmUzMl90b19jcHUocmMtPnBsZGJ1Zmxlbl9xaWQpKTsKKwkJaXFfaWR4ID0gSVFfSURYKHMsIHFpZCk7CisJCWlmICh1bmxpa2VseShpcV9pZHggPj0gTUFYX0lOR1EpKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCSJJbmdyZXNzIFFJRCAlZCBvdXQgb2YgcmFuZ2VcbiIsIHFpZCk7CisJCQljb250aW51ZTsKKwkJfQorCQlyc3BxID0gcy0+aW5ncl9tYXBbaXFfaWR4XTsKKwkJaWYgKHVubGlrZWx5KHJzcHEgPT0gTlVMTCkpIHsKKwkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkJIkluZ3Jlc3MgUUlEICVkIFJTUFE9TlVMTFxuIiwgcWlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh1bmxpa2VseShyc3BxLT5hYnNfaWQgIT0gcWlkKSkgeworCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkiSW5ncmVzcyBRSUQgJWQgcmVmZXJzIHRvIFJTUFEgJWRcbiIsCisJCQkJcWlkLCByc3BxLT5hYnNfaWQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTY2hlZHVsZSBOQVBJIHByb2Nlc3Npbmcgb24gdGhlIGluZGljYXRlZCBSZXNwb25zZSBRdWV1ZQorCQkgKiBhbmQgbW92ZSBvbiB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgRm9yd2FyZGVkIEludGVycnVwdAorCQkgKiBRdWV1ZS4KKwkJICovCisJCW5hcGlfc2NoZWR1bGUoJnJzcHEtPm5hcGkpOworCQlyc3BxX25leHQoaW50cnEpOworCX0KKworCXQ0X3dyaXRlX3JlZyhhZGFwdGVyLCBUNFZGX1NHRV9CQVNFX0FERFIgKyBTR0VfVkZfR1RTLAorCQkgICAgIENJRFhJTkMod29ya19kb25lKSB8CisJCSAgICAgSU5HUkVTU1FJRChpbnRycS0+Y250eHRfaWQpIHwKKwkJICAgICBTRUlOVEFSTShpbnRycS0+aW50cl9wYXJhbXMpKTsKKworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5zZ2UuaW50cnFfbG9jayk7CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCisvKgorICogVGhlIE1TSSBpbnRlcnJ1cHQgaGFuZGxlciBoYW5kbGVzIGRhdGEgZXZlbnRzIGZyb20gU0dFIHJlc3BvbnNlIHF1ZXVlcyBhcworICogd2VsbCBhcyBlcnJvciBhbmQgb3RoZXIgYXN5bmMgZXZlbnRzIGFzIHRoZXkgYWxsIHVzZSB0aGUgc2FtZSBNU0kgdmVjdG9yLgorICovCitpcnFyZXR1cm5fdCB0NHZmX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGNvb2tpZTsKKworCXByb2Nlc3NfaW50cnEoYWRhcHRlcik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqCXQ0dmZfaW50cl9oYW5kbGVyIC0gc2VsZWN0IHRoZSB0b3AtbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVNlbGVjdHMgdGhlIHRvcC1sZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBiYXNlZCBvbiB0aGUgdHlwZSBvZiBpbnRlcnJ1cHRzCisgKgkoTVNJLVggb3IgTVNJKS4KKyAqLworaXJxX2hhbmRsZXJfdCB0NHZmX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlCVUdfT04oKGFkYXB0ZXItPmZsYWdzICYgKFVTSU5HX01TSVh8VVNJTkdfTVNJKSkgPT0gMCk7CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJcmV0dXJuIHQ0dmZfc2dlX2ludHJfbXNpeDsKKwllbHNlCisJCXJldHVybiB0NHZmX2ludHJfbXNpOworfQorCisvKioKKyAqCXNnZV9yeF90aW1lcl9jYiAtIHBlcmZvcm0gcGVyaW9kaWMgbWFpbnRlbmFuY2Ugb2YgU0dFIFJYIHF1ZXVlcworICoJQGRhdGE6IHRoZSBhZGFwdGVyCisgKgorICoJUnVucyBwZXJpb2RpY2FsbHkgZnJvbSBhIHRpbWVyIHRvIHBlcmZvcm0gbWFpbnRlbmFuY2Ugb2YgU0dFIFJYIHF1ZXVlcy4KKyAqCisgKglhKSBSZXBsZW5pc2hlcyBSWCBxdWV1ZXMgdGhhdCBoYXZlIHJ1biBvdXQgZHVlIHRvIG1lbW9yeSBzaG9ydGFnZS4KKyAqCU5vcm1hbGx5IG5ldyBSWCBidWZmZXJzIGFyZSBhZGRlZCB3aGVuIGV4aXN0aW5nIG9uZXMgYXJlIGNvbnN1bWVkIGJ1dAorICoJd2hlbiBvdXQgb2YgbWVtb3J5IGEgcXVldWUgY2FuIGJlY29tZSBlbXB0eS4gIFdlIHNjaGVkdWxlIE5BUEkgdG8gZG8KKyAqCXRoZSBhY3R1YWwgcmVmaWxsLgorICovCitzdGF0aWMgdm9pZCBzZ2VfcnhfdGltZXJfY2IodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qCisJICogU2NhbiB0aGUgIlN0YXJ2aW5nIEZyZWUgTGlzdHMiIGZsYWcgYXJyYXkgbG9va2luZyBmb3IgYW55IEZyZWUKKwkgKiBMaXN0cyBpbiBuZWVkIG9mIG1vcmUgZnJlZSBidWZmZXJzLiAgSWYgd2UgZmluZCBvbmUgYW5kIGl0J3Mgbm90CisJICogYmVpbmcgYWN0aXZlbHkgcG9sbGVkLCB0aGVuIGJ1bXAgaXRzICJzdGFydmluZyIgY291bnRlciBhbmQgYXR0ZW1wdAorCSAqIHRvIHJlZmlsbCBpdC4gIElmIHdlJ3JlIHN1Y2Nlc3NmdWwgaW4gYWRkaW5nIGVub3VnaCBidWZmZXJzIHRvIHB1c2gKKwkgKiB0aGUgRnJlZSBMaXN0IG92ZXIgdGhlIHN0YXJ2aW5nIHRocmVzaG9sZCwgdGhlbiB3ZSBjYW4gY2xlYXIgaXRzCisJICogInN0YXJ2aW5nIiBzdGF0dXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+c3RhcnZpbmdfZmwpOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBtOworCisJCWZvciAobSA9IHMtPnN0YXJ2aW5nX2ZsW2ldOyBtOyBtICY9IG0gLSAxKSB7CisJCQl1bnNpZ25lZCBpbnQgaWQgPSBfX2ZmcyhtKSArIGkgKiBCSVRTX1BFUl9MT05HOworCQkJc3RydWN0IHNnZV9mbCAqZmwgPSBzLT5lZ3JfbWFwW2lkXTsKKworCQkJY2xlYXJfYml0KGlkLCBzLT5zdGFydmluZ19mbCk7CisJCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCisJCQkvKgorCQkJICogU2luY2Ugd2UgYXJlIGFjY2Vzc2luZyBmbCB3aXRob3V0IGEgbG9jayB0aGVyZSdzIGEKKwkJCSAqIHNtYWxsIHByb2JhYmlsaXR5IG9mIGEgZmFsc2UgcG9zaXRpdmUgd2hlcmUgd2UKKwkJCSAqIHNjaGVkdWxlIG5hcGkgYnV0IHRoZSBGTCBpcyBubyBsb25nZXIgc3RhcnZpbmcuCisJCQkgKiBObyBiaWdnaWUuCisJCQkgKi8KKwkJCWlmIChmbF9zdGFydmluZyhmbCkpIHsKKwkJCQlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cTsKKworCQkJCXJ4cSA9IGNvbnRhaW5lcl9vZihmbCwgc3RydWN0IHNnZV9ldGhfcnhxLCBmbCk7CisJCQkJaWYgKG5hcGlfcmVzY2hlZHVsZSgmcnhxLT5yc3BxLm5hcGkpKQorCQkJCQlmbC0+c3RhcnZpbmcrKzsKKwkJCQllbHNlCisJCQkJCXNldF9iaXQoaWQsIHMtPnN0YXJ2aW5nX2ZsKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogUmVzY2hlZHVsZSB0aGUgbmV4dCBzY2FuIGZvciBzdGFydmluZyBGcmVlIExpc3RzIC4uLgorCSAqLworCW1vZF90aW1lcigmcy0+cnhfdGltZXIsIGppZmZpZXMgKyBSWF9RQ0hFQ0tfUEVSSU9EKTsKK30KKworLyoqCisgKglzZ2VfdHhfdGltZXJfY2IgLSBwZXJmb3JtIHBlcmlvZGljIG1haW50ZW5hbmNlIG9mIFNHRSBUeCBxdWV1ZXMKKyAqCUBkYXRhOiB0aGUgYWRhcHRlcgorICoKKyAqCVJ1bnMgcGVyaW9kaWNhbGx5IGZyb20gYSB0aW1lciB0byBwZXJmb3JtIG1haW50ZW5hbmNlIG9mIFNHRSBUWCBxdWV1ZXMuCisgKgorICoJYikgUmVjbGFpbXMgY29tcGxldGVkIFR4IHBhY2tldHMgZm9yIHRoZSBFdGhlcm5ldCBxdWV1ZXMuICBOb3JtYWxseQorICoJcGFja2V0cyBhcmUgY2xlYW5lZCB1cCBieSBuZXcgVHggcGFja2V0cywgdGhpcyB0aW1lciBjbGVhbnMgdXAgcGFja2V0cworICoJd2hlbiBubyBuZXcgcGFja2V0cyBhcmUgYmVpbmcgc3VibWl0dGVkLiAgVGhpcyBpcyBlc3NlbnRpYWwgZm9yIHBrdGdlbiwKKyAqCWF0IGxlYXN0LgorICovCitzdGF0aWMgdm9pZCBzZ2VfdHhfdGltZXJfY2IodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKwl1bnNpZ25lZCBpbnQgaSwgYnVkZ2V0OworCisJYnVkZ2V0ID0gTUFYX1RJTUVSX1RYX1JFQ0xBSU07CisJaSA9IHMtPmV0aHR4cV9yb3ZlcjsKKwlkbyB7CisJCXN0cnVjdCBzZ2VfZXRoX3R4cSAqdHhxID0gJnMtPmV0aHR4cVtpXTsKKworCQlpZiAocmVjbGFpbWFibGUoJnR4cS0+cSkgJiYgX19uZXRpZl90eF90cnlsb2NrKHR4cS0+dHhxKSkgeworCQkJaW50IGF2YWlsID0gcmVjbGFpbWFibGUoJnR4cS0+cSk7CisKKwkJCWlmIChhdmFpbCA+IGJ1ZGdldCkKKwkJCQlhdmFpbCA9IGJ1ZGdldDsKKworCQkJZnJlZV90eF9kZXNjKGFkYXB0ZXIsICZ0eHEtPnEsIGF2YWlsLCB0cnVlKTsKKwkJCXR4cS0+cS5pbl91c2UgLT0gYXZhaWw7CisJCQlfX25ldGlmX3R4X3VubG9jayh0eHEtPnR4cSk7CisKKwkJCWJ1ZGdldCAtPSBhdmFpbDsKKwkJCWlmICghYnVkZ2V0KQorCQkJCWJyZWFrOworCQl9CisKKwkJaSsrOworCQlpZiAoaSA+PSBzLT5ldGhxc2V0cykKKwkJCWkgPSAwOworCX0gd2hpbGUgKGkgIT0gcy0+ZXRodHhxX3JvdmVyKTsKKwlzLT5ldGh0eHFfcm92ZXIgPSBpOworCisJLyoKKwkgKiBJZiB3ZSBmb3VuZCB0b28gbWFueSByZWNsYWltYWJsZSBwYWNrZXRzIHNjaGVkdWxlIGEgdGltZXIgaW4gdGhlCisJICogbmVhciBmdXR1cmUgdG8gY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuICBPdGhlcndpc2UgdGhlIG5leHQgdGltZXIKKwkgKiB3aWxsIGJlIGF0IGl0cyBub3JtYWwgaW50ZXJ2YWwuCisJICovCisJbW9kX3RpbWVyKCZzLT50eF90aW1lciwgamlmZmllcyArIChidWRnZXQgPyBUWF9RQ0hFQ0tfUEVSSU9EIDogMikpOworfQorCisvKioKKyAqCXQ0dmZfc2dlX2FsbG9jX3J4cSAtIGFsbG9jYXRlIGFuIFNHRSBSWCBRdWV1ZQorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAcnNwcTogcG9pbnRlciB0byB0byB0aGUgbmV3IHJ4cSdzIFJlc3BvbnNlIFF1ZXVlIHRvIGJlIGZpbGxlZCBpbgorICoJQGlxYXN5bmNoOiBpZiAwLCBhIG5vcm1hbCByc3BxOyBpZiAxLCBhbiBhc3luY2hyb25vdXMgZXZlbnQgcXVldWUKKyAqCUBkZXY6IHRoZSBuZXR3b3JrIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyByc3BxCisgKglAaW50cl9kZXN0OiBNU0ktWCB2ZWN0b3IgaW5kZXggKG92ZXJyaWRlbiBpbiBNU0kgbW9kZSkKKyAqCUBmbDogcG9pbnRlciB0byB0aGUgbmV3IHJ4cSdzIEZyZWUgTGlzdCB0byBiZSBmaWxsZWQgaW4KKyAqCUBobmQ6IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBpbnZva2UgZm9yIHRoZSByc3BxCisgKi8KK2ludCB0NHZmX3NnZV9hbGxvY19yeHEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfcnNwcSAqcnNwcSwKKwkJICAgICAgIGJvb2wgaXFhc3luY2gsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBpbnQgaW50cl9kZXN0LAorCQkgICAgICAgc3RydWN0IHNnZV9mbCAqZmwsIHJzcHFfaGFuZGxlcl90IGhuZCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZ3X2lxX2NtZCBjbWQsIHJwbDsKKwlpbnQgcmV0LCBpcWFuZHN0LCBmbHN6ID0gMDsKKworCS8qCisJICogSWYgd2UncmUgdXNpbmcgTVNJIGludGVycnVwdHMgYW5kIHdlJ3JlIG5vdCBpbml0aWFsaXppbmcgdGhlCisJICogRm9yd2FyZGVkIEludGVycnVwdCBRdWV1ZSBpdHNlbGYsIHRoZW4gc2V0IHVwIHRoaXMgcXVldWUgZm9yCisJICogaW5kaXJlY3QgaW50ZXJydXB0cyB0byB0aGUgRm9yd2FyZGVkIEludGVycnVwdCBRdWV1ZS4gIE9idmlvdXNseQorCSAqIHRoZSBGb3J3YXJkZWQgSW50ZXJydXB0IFF1ZXVlIG11c3QgYmUgc2V0IHVwIGJlZm9yZSBhbnkgb3RoZXIKKwkgKiBpbmdyZXNzIHF1ZXVlIC4uLgorCSAqLworCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0kpICYmIHJzcHEgIT0gJmFkYXB0ZXItPnNnZS5pbnRycSkgeworCQlpcWFuZHN0ID0gU0dFX0lOVFJEU1RfSVE7CisJCWludHJfZGVzdCA9IGFkYXB0ZXItPnNnZS5pbnRycS5hYnNfaWQ7CisJfSBlbHNlCisJCWlxYW5kc3QgPSBTR0VfSU5UUkRTVF9QQ0k7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBoYXJkd2FyZSByaW5nIGZvciB0aGUgUmVzcG9uc2UgUXVldWUuICBUaGUgc2l6ZSBuZWVkcworCSAqIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYgd2hpY2ggaW5jbHVkZXMgdGhlIG1hbmRhdG9yeSBzdGF0dXMgZW50cnkKKwkgKiAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBTdGF0dXMgUGFnZSBjYXBhYmlsaXRpZXMgYXJlIGVuYWJsZWQgb3IKKwkgKiBub3QpLgorCSAqLworCXJzcHEtPnNpemUgPSByb3VuZHVwKHJzcHEtPnNpemUsIDE2KTsKKwlyc3BxLT5kZXNjID0gYWxsb2NfcmluZyhhZGFwdGVyLT5wZGV2X2RldiwgcnNwcS0+c2l6ZSwgcnNwcS0+aXFlX2xlbiwKKwkJCQkwLCAmcnNwcS0+cGh5c19hZGRyLCBOVUxMLCAwKTsKKwlpZiAoIXJzcHEtPmRlc2MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBJbmdyZXNzIFF1ZXVlIENvbW1hbmQuICBOb3RlOiBJZGVhbGx5IHRoaXMgY29kZSB3b3VsZAorCSAqIGJlIGluIHQ0dmZfaHcuYyBidXQgdGhlcmUgYXJlIHNvIG1hbnkgcGFyYW1ldGVycyBhbmQgZGVwZW5kZW5jaWVzCisJICogb24gb3VyIExpbnV4IFNHRSBzdGF0ZSB0aGF0IHdlIHdvdWxkIGVuZCB1cCBoYXZpbmcgdG8gcGFzcyB0b25zIG9mCisJICogcGFyYW1ldGVycy4gIFdlJ2xsIGhhdmUgdG8gdGhpbmsgYWJvdXQgaG93IHRoaXMgbWlnaHQgYmUgbWlncmF0ZWQKKwkgKiBpbnRvIE9TLWluZGVwZW5kZW50IGNvbW1vbiBjb2RlIC4uLgorCSAqLworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZmbiA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19JUV9DTUQpIHwKKwkJCQkgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICBGV19DTURfV1JJVEUgfAorCQkJCSAgICBGV19DTURfRVhFQyk7CisJY21kLmFsbG9jX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfSVFfQ01EX0FMTE9DIHwKKwkJCQkJIEZXX0lRX0NNRF9JUVNUQVJUKDEpIHwKKwkJCQkJIEZXX0xFTjE2KGNtZCkpOworCWNtZC50eXBlX3RvX2lxYW5kc3RpbmRleCA9CisJCWNwdV90b19iZTMyKEZXX0lRX0NNRF9UWVBFKEZXX0lRX1RZUEVfRkxfSU5UX0NBUCkgfAorCQkJICAgIEZXX0lRX0NNRF9JUUFTWU5DSChpcWFzeW5jaCkgfAorCQkJICAgIEZXX0lRX0NNRF9WSUlEKHBpLT52aWlkKSB8CisJCQkgICAgRldfSVFfQ01EX0lRQU5EU1QoaXFhbmRzdCkgfAorCQkJICAgIEZXX0lRX0NNRF9JUUFOVVMoMSkgfAorCQkJICAgIEZXX0lRX0NNRF9JUUFOVUQoU0dFX1VQREFURURFTF9JTlRSKSB8CisJCQkgICAgRldfSVFfQ01EX0lRQU5EU1RJTkRFWChpbnRyX2Rlc3QpKTsKKwljbWQuaXFkcm9wcnNzX3RvX2lxZXNpemUgPQorCQljcHVfdG9fYmUxNihGV19JUV9DTURfSVFQQ0lFQ0gocGktPnBvcnRfaWQpIHwKKwkJCSAgICBGV19JUV9DTURfSVFHVFNNT0RFIHwKKwkJCSAgICBGV19JUV9DTURfSVFJTlRDTlRUSFJFU0gocnNwcS0+cGt0Y250X2lkeCkgfAorCQkJICAgIEZXX0lRX0NNRF9JUUVTSVpFKGlsb2cyKHJzcHEtPmlxZV9sZW4pIC0gNCkpOworCWNtZC5pcXNpemUgPSBjcHVfdG9fYmUxNihyc3BxLT5zaXplKTsKKwljbWQuaXFhZGRyID0gY3B1X3RvX2JlNjQocnNwcS0+cGh5c19hZGRyKTsKKworCWlmIChmbCkgeworCQkvKgorCQkgKiBBbGxvY2F0ZSB0aGUgcmluZyBmb3IgdGhlIGhhcmR3YXJlIGZyZWUgbGlzdCAod2l0aCBzcGFjZQorCQkgKiBmb3IgaXRzIHN0YXR1cyBwYWdlKSBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIHNvZnR3YXJlCisJCSAqIGRlc2NyaXB0b3IgcmluZy4gIFRoZSBmcmVlIGxpc3Qgc2l6ZSBuZWVkcyB0byBiZSBhIG11bHRpcGxlCisJCSAqIG9mIHRoZSBFZ3Jlc3MgUXVldWUgVW5pdC4KKwkJICovCisJCWZsLT5zaXplID0gcm91bmR1cChmbC0+c2l6ZSwgRkxfUEVSX0VRX1VOSVQpOworCQlmbC0+ZGVzYyA9IGFsbG9jX3JpbmcoYWRhcHRlci0+cGRldl9kZXYsIGZsLT5zaXplLAorCQkJCSAgICAgIHNpemVvZihfX2JlNjQpLCBzaXplb2Yoc3RydWN0IHJ4X3N3X2Rlc2MpLAorCQkJCSAgICAgICZmbC0+YWRkciwgJmZsLT5zZGVzYywgU1RBVF9MRU4pOworCQlpZiAoIWZsLT5kZXNjKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGhhcmR3YXJlIGZyZWUgbGlzdCByaW5nIHBsdXMKKwkJICogc3RhdHVzIHBhZ2UgKHdoaWNoIHRoZSBTR0Ugd2lsbCBwbGFjZSBhdCB0aGUgZW5kIG9mIHRoZQorCQkgKiBmcmVlIGxpc3QgcmluZykgaW4gRWdyZXNzIFF1ZXVlIFVuaXRzLgorCQkgKi8KKwkJZmxzeiA9IChmbC0+c2l6ZSAvIEZMX1BFUl9FUV9VTklUICsKKwkJCVNUQVRfTEVOIC8gRVFfVU5JVCk7CisKKwkJLyoKKwkJICogRmlsbCBpbiBhbGwgdGhlIHJlbGV2YW50IGZpcm13YXJlIEluZ3Jlc3MgUXVldWUgQ29tbWFuZAorCQkgKiBmaWVsZHMgZm9yIHRoZSBmcmVlIGxpc3QuCisJCSAqLworCQljbWQuaXFuc190b19mbDBjb25nZW4gPQorCQkJY3B1X3RvX2JlMzIoCisJCQkJRldfSVFfQ01EX0ZMMEhPU1RGQ01PREUoU0dFX0hPU1RGQ01PREVfTk9ORSkgfAorCQkJCUZXX0lRX0NNRF9GTDBQQUNLRU4gfAorCQkJCUZXX0lRX0NNRF9GTDBQQURFTik7CisJCWNtZC5mbDBkY2Flbl90b19mbDBjaWR4ZnRocmVzaCA9CisJCQljcHVfdG9fYmUxNigKKwkJCQlGV19JUV9DTURfRkwwRkJNSU4oU0dFX0ZFVENIQlVSU1RNSU5fNjRCKSB8CisJCQkJRldfSVFfQ01EX0ZMMEZCTUFYKFNHRV9GRVRDSEJVUlNUTUFYXzUxMkIpKTsKKwkJY21kLmZsMHNpemUgPSBjcHVfdG9fYmUxNihmbHN6KTsKKwkJY21kLmZsMGFkZHIgPSBjcHVfdG9fYmU2NChmbC0+YWRkcik7CisJfQorCisJLyoKKwkgKiBJc3N1ZSB0aGUgZmlybXdhcmUgSW5ncmVzcyBRdWV1ZSBDb21tYW5kIGFuZCBleHRyYWN0IHRoZSByZXN1bHRzIGlmCisJICogaXQgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KKwkgKi8KKwlyZXQgPSB0NHZmX3dyX21ib3goYWRhcHRlciwgJmNtZCwgc2l6ZW9mKGNtZCksICZycGwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcnNwcS0+bmFwaSwgbmFwaV9yeF9oYW5kbGVyLCA2NCk7CisJcnNwcS0+Y3VyX2Rlc2MgPSByc3BxLT5kZXNjOworCXJzcHEtPmNpZHggPSAwOworCXJzcHEtPmdlbiA9IDE7CisJcnNwcS0+bmV4dF9pbnRyX3BhcmFtcyA9IHJzcHEtPmludHJfcGFyYW1zOworCXJzcHEtPmNudHh0X2lkID0gYmUxNl90b19jcHUocnBsLmlxaWQpOworCXJzcHEtPmFic19pZCA9IGJlMTZfdG9fY3B1KHJwbC5waHlzaXFpZCk7CisJcnNwcS0+c2l6ZS0tOwkJCS8qIHN1YnRyYWN0IHN0YXR1cyBlbnRyeSAqLworCXJzcHEtPmFkYXB0ZXIgPSBhZGFwdGVyOworCXJzcHEtPm5ldGRldiA9IGRldjsKKwlyc3BxLT5oYW5kbGVyID0gaG5kOworCisJLyogc2V0IG9mZnNldCB0byAtMSB0byBkaXN0aW5ndWlzaCBpbmdyZXNzIHF1ZXVlcyB3aXRob3V0IEZMICovCisJcnNwcS0+b2Zmc2V0ID0gZmwgPyAwIDogLTE7CisKKwlpZiAoZmwpIHsKKwkJZmwtPmNudHh0X2lkID0gYmUxNl90b19jcHUocnBsLmZsMGlkKTsKKwkJZmwtPmF2YWlsID0gMDsKKwkJZmwtPnBlbmRfY3JlZCA9IDA7CisJCWZsLT5waWR4ID0gMDsKKwkJZmwtPmNpZHggPSAwOworCQlmbC0+YWxsb2NfZmFpbGVkID0gMDsKKwkJZmwtPmxhcmdlX2FsbG9jX2ZhaWxlZCA9IDA7CisJCWZsLT5zdGFydmluZyA9IDA7CisJCXJlZmlsbF9mbChhZGFwdGVyLCBmbCwgZmxfY2FwKGZsKSwgR0ZQX0tFUk5FTCk7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwkvKgorCSAqIEFuIGVycm9yIG9jY3VycmVkLiAgQ2xlYW4gdXAgb3VyIHBhcnRpYWwgYWxsb2NhdGlvbiBzdGF0ZSBhbmQKKwkgKiByZXR1cm4gdGhlIGVycm9yLgorCSAqLworCWlmIChyc3BxLT5kZXNjKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFkYXB0ZXItPnBkZXZfZGV2LCByc3BxLT5zaXplICogcnNwcS0+aXFlX2xlbiwKKwkJCQkgIHJzcHEtPmRlc2MsIHJzcHEtPnBoeXNfYWRkcik7CisJCXJzcHEtPmRlc2MgPSBOVUxMOworCX0KKwlpZiAoZmwgJiYgZmwtPmRlc2MpIHsKKwkJa2ZyZWUoZmwtPnNkZXNjKTsKKwkJZmwtPnNkZXNjID0gTlVMTDsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYWRhcHRlci0+cGRldl9kZXYsIGZsc3ogKiBFUV9VTklULAorCQkJCSAgZmwtPmRlc2MsIGZsLT5hZGRyKTsKKwkJZmwtPmRlc2MgPSBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXQ0dmZfc2dlX2FsbG9jX2V0aF90eHEgLSBhbGxvY2F0ZSBhbiBTR0UgRXRoZXJuZXQgVFggUXVldWUKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHR4cTogcG9pbnRlciB0byB0aGUgbmV3IHR4cSB0byBiZSBmaWxsZWQgaW4KKyAqCUBkZXZxOiB0aGUgbmV0d29yayBUWCBxdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyB0eHEKKyAqCUBpcWlkOiB0aGUgcmVsYXRpdmUgaW5ncmVzcyBxdWV1ZSBJRCB0byB3aGljaCBldmVudHMgcmVsYXRpbmcgdG8KKyAqCQl0aGUgbmV3IHR4cSBzaG91bGQgYmUgZGlyZWN0ZWQKKyAqLworaW50IHQ0dmZfc2dlX2FsbG9jX2V0aF90eHEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfZXRoX3R4cSAqdHhxLAorCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2cSwKKwkJCSAgIHVuc2lnbmVkIGludCBpcWlkKQoreworCWludCByZXQsIG5lbnRyaWVzOworCXN0cnVjdCBmd19lcV9ldGhfY21kIGNtZCwgcnBsOworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBoYXJkd2FyZSBUWCBRdWV1ZSAoaW5jbHVkaW5nIHRoZQorCSAqIHN0YXR1cyBhZ2Ugb24gdGhlIGVuZCkgaW4gdW5pdHMgb2YgVFggRGVzY3JpcHRvcnMuCisJICovCisJbmVudHJpZXMgPSB0eHEtPnEuc2l6ZSArIFNUQVRfTEVOIC8gc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGhhcmR3YXJlIHJpbmcgZm9yIHRoZSBUWCByaW5nICh3aXRoIHNwYWNlIGZvciBpdHMKKwkgKiBzdGF0dXMgcGFnZSkgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBzb2Z0d2FyZSBkZXNjcmlwdG9yIHJpbmcuCisJICovCisJdHhxLT5xLmRlc2MgPSBhbGxvY19yaW5nKGFkYXB0ZXItPnBkZXZfZGV2LCB0eHEtPnEuc2l6ZSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0eF9zd19kZXNjKSwKKwkJCQkgJnR4cS0+cS5waHlzX2FkZHIsICZ0eHEtPnEuc2Rlc2MsIFNUQVRfTEVOKTsKKwlpZiAoIXR4cS0+cS5kZXNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogRmlsbCBpbiB0aGUgRWdyZXNzIFF1ZXVlIENvbW1hbmQuICBOb3RlOiBBcyB3aXRoIHRoZSBkaXJlY3QgdXNlIG9mCisJICogdGhlIGZpcm13YXJlIEluZ3Jlc3MgUXVldWUgQ09tbWFuZCBhYm92ZSBpbiBvdXIgUlhRIGFsbG9jYXRpb24KKwkgKiByb3V0aW5lLCBpZGVhbGx5LCB0aGlzIGNvZGUgd291bGQgYmUgaW4gdDR2Zl9ody5jLiAgQWdhaW4sIHdlJ2xsCisJICogaGF2ZSB0byBzZWUgaWYgdGhlcmUncyBzb21lIHJlYXNvbmFibGUgd2F5IHRvIHBhcmFtZXRlcml6ZSBpdAorCSAqIGludG8gdGhlIGNvbW1vbiBjb2RlIC4uLgorCSAqLworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZmbiA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19FUV9FVEhfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgRldfQ01EX1dSSVRFIHwKKwkJCQkgICAgRldfQ01EX0VYRUMpOworCWNtZC5hbGxvY190b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX0VRX0VUSF9DTURfQUxMT0MgfAorCQkJCQkgRldfRVFfRVRIX0NNRF9FUVNUQVJUIHwKKwkJCQkJIEZXX0xFTjE2KGNtZCkpOworCWNtZC52aWlkX3BrZCA9IGNwdV90b19iZTMyKEZXX0VRX0VUSF9DTURfVklJRChwaS0+dmlpZCkpOworCWNtZC5mZXRjaHN6bV90b19pcWlkID0KKwkJY3B1X3RvX2JlMzIoRldfRVFfRVRIX0NNRF9IT1NURkNNT0RFKFNHRV9IT1NURkNNT0RFX1NUUEcpIHwKKwkJCSAgICBGV19FUV9FVEhfQ01EX1BDSUVDSE4ocGktPnBvcnRfaWQpIHwKKwkJCSAgICBGV19FUV9FVEhfQ01EX0lRSUQoaXFpZCkpOworCWNtZC5kY2Flbl90b19lcXNpemUgPQorCQljcHVfdG9fYmUzMihGV19FUV9FVEhfQ01EX0ZCTUlOKFNHRV9GRVRDSEJVUlNUTUlOXzY0QikgfAorCQkJICAgIEZXX0VRX0VUSF9DTURfRkJNQVgoU0dFX0ZFVENIQlVSU1RNQVhfNTEyQikgfAorCQkJICAgIEZXX0VRX0VUSF9DTURfQ0lEWEZUSFJFU0goU0dFX0NJRFhGTFVTSFRIUkVTSF8zMikgfAorCQkJICAgIEZXX0VRX0VUSF9DTURfRVFTSVpFKG5lbnRyaWVzKSk7CisJY21kLmVxYWRkciA9IGNwdV90b19iZTY0KHR4cS0+cS5waHlzX2FkZHIpOworCisJLyoKKwkgKiBJc3N1ZSB0aGUgZmlybXdhcmUgRWdyZXNzIFF1ZXVlIENvbW1hbmQgYW5kIGV4dHJhY3QgdGhlIHJlc3VsdHMgaWYKKwkgKiBpdCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorCSAqLworCXJldCA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCk7CisJaWYgKHJldCkgeworCQkvKgorCQkgKiBUaGUgZ2lybXdhcmUgSW5ncmVzcyBRdWV1ZSBDb21tYW5kIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCisJCSAqIEZyZWUgdXAgb3VyIHBhcnRpYWwgYWxsb2NhdGlvbiBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBlcnJvci4KKwkJICovCisJCWtmcmVlKHR4cS0+cS5zZGVzYyk7CisJCXR4cS0+cS5zZGVzYyA9IE5VTEw7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCSAgbmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpLAorCQkJCSAgdHhxLT5xLmRlc2MsIHR4cS0+cS5waHlzX2FkZHIpOworCQl0eHEtPnEuZGVzYyA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCisJdHhxLT5xLmluX3VzZSA9IDA7CisJdHhxLT5xLmNpZHggPSAwOworCXR4cS0+cS5waWR4ID0gMDsKKwl0eHEtPnEuc3RhdCA9ICh2b2lkICopJnR4cS0+cS5kZXNjW3R4cS0+cS5zaXplXTsKKwl0eHEtPnEuY250eHRfaWQgPSBGV19FUV9FVEhfQ01EX0VRSURfR0VUKGJlMzJfdG9fY3B1KHJwbC5lcWlkX3BrZCkpOworCXR4cS0+cS5hYnNfaWQgPQorCQlGV19FUV9FVEhfQ01EX1BIWVNFUUlEX0dFVChiZTMyX3RvX2NwdShycGwucGh5c2VxaWRfcGtkKSk7CisJdHhxLT50eHEgPSBkZXZxOworCXR4cS0+dHNvID0gMDsKKwl0eHEtPnR4X2NzbyA9IDA7CisJdHhxLT52bGFuX2lucyA9IDA7CisJdHhxLT5xLnN0b3BzID0gMDsKKwl0eHEtPnEucmVzdGFydHMgPSAwOworCXR4cS0+bWFwcGluZ19lcnIgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSB0aGUgRE1BIG1hcCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgVFggcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfdHhxKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2dlX3R4cSAqdHEpCit7CisJZG1hX2ZyZWVfY29oZXJlbnQoYWRhcHRlci0+cGRldl9kZXYsCisJCQkgIHRxLT5zaXplICogc2l6ZW9mKCp0cS0+ZGVzYykgKyBTVEFUX0xFTiwKKwkJCSAgdHEtPmRlc2MsIHRxLT5waHlzX2FkZHIpOworCXRxLT5jbnR4dF9pZCA9IDA7CisJdHEtPnNkZXNjID0gTlVMTDsKKwl0cS0+ZGVzYyA9IE5VTEw7Cit9CisKKy8qCisgKiBGcmVlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzcG9uc2UgcXVldWUgKHBvc3NpYmx5IGluY2x1ZGluZyBhCisgKiBmcmVlIGxpc3QpLgorICovCitzdGF0aWMgdm9pZCBmcmVlX3JzcHFfZmwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfcnNwcSAqcnNwcSwKKwkJCSBzdHJ1Y3Qgc2dlX2ZsICpmbCkKK3sKKwl1bnNpZ25lZCBpbnQgZmxpZCA9IGZsID8gZmwtPmNudHh0X2lkIDogMHhmZmZmOworCisJdDR2Zl9pcV9mcmVlKGFkYXB0ZXIsIEZXX0lRX1RZUEVfRkxfSU5UX0NBUCwKKwkJICAgICByc3BxLT5jbnR4dF9pZCwgZmxpZCwgMHhmZmZmKTsKKwlkbWFfZnJlZV9jb2hlcmVudChhZGFwdGVyLT5wZGV2X2RldiwgKHJzcHEtPnNpemUgKyAxKSAqIHJzcHEtPmlxZV9sZW4sCisJCQkgIHJzcHEtPmRlc2MsIHJzcHEtPnBoeXNfYWRkcik7CisJbmV0aWZfbmFwaV9kZWwoJnJzcHEtPm5hcGkpOworCXJzcHEtPm5ldGRldiA9IE5VTEw7CisJcnNwcS0+Y250eHRfaWQgPSAwOworCXJzcHEtPmFic19pZCA9IDA7CisJcnNwcS0+ZGVzYyA9IE5VTEw7CisKKwlpZiAoZmwpIHsKKwkJZnJlZV9yeF9idWZzKGFkYXB0ZXIsIGZsLCBmbC0+YXZhaWwpOworCQlkbWFfZnJlZV9jb2hlcmVudChhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkgIGZsLT5zaXplICogc2l6ZW9mKCpmbC0+ZGVzYykgKyBTVEFUX0xFTiwKKwkJCQkgIGZsLT5kZXNjLCBmbC0+YWRkcik7CisJCWtmcmVlKGZsLT5zZGVzYyk7CisJCWZsLT5zZGVzYyA9IE5VTEw7CisJCWZsLT5jbnR4dF9pZCA9IDA7CisJCWZsLT5kZXNjID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICoJdDR2Zl9mcmVlX3NnZV9yZXNvdXJjZXMgLSBmcmVlIFNHRSByZXNvdXJjZXMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCUZyZWVzIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBTR0UgcXVldWUgc2V0cy4KKyAqLwordm9pZCB0NHZmX2ZyZWVfc2dlX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKwlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4cSA9IHMtPmV0aHJ4cTsKKwlzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cSA9IHMtPmV0aHR4cTsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKmV2dHEgPSAmcy0+ZndfZXZ0cTsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKmludHJxID0gJnMtPmludHJxOworCWludCBxczsKKworCWZvciAocXMgPSAwOyBxcyA8IGFkYXB0ZXItPnNnZS5ldGhxc2V0czsgcXMrKywgcnhxKyssIHR4cSsrKSB7CisJCWlmIChyeHEtPnJzcHEuZGVzYykKKwkJCWZyZWVfcnNwcV9mbChhZGFwdGVyLCAmcnhxLT5yc3BxLCAmcnhxLT5mbCk7CisJCWlmICh0eHEtPnEuZGVzYykgeworCQkJdDR2Zl9ldGhfZXFfZnJlZShhZGFwdGVyLCB0eHEtPnEuY250eHRfaWQpOworCQkJZnJlZV90eF9kZXNjKGFkYXB0ZXIsICZ0eHEtPnEsIHR4cS0+cS5pbl91c2UsIHRydWUpOworCQkJa2ZyZWUodHhxLT5xLnNkZXNjKTsKKwkJCWZyZWVfdHhxKGFkYXB0ZXIsICZ0eHEtPnEpOworCQl9CisJfQorCWlmIChldnRxLT5kZXNjKQorCQlmcmVlX3JzcHFfZmwoYWRhcHRlciwgZXZ0cSwgTlVMTCk7CisJaWYgKGludHJxLT5kZXNjKQorCQlmcmVlX3JzcHFfZmwoYWRhcHRlciwgaW50cnEsIE5VTEwpOworfQorCisvKioKKyAqCXQ0dmZfc2dlX3N0YXJ0IC0gZW5hYmxlIFNHRSBvcGVyYXRpb24KKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVN0YXJ0IHRhc2tsZXRzIGFuZCB0aW1lcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBETUEgZW5naW5lLgorICovCit2b2lkIHQ0dmZfc2dlX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWFkYXB0ZXItPnNnZS5ldGh0eHFfcm92ZXIgPSAwOworCW1vZF90aW1lcigmYWRhcHRlci0+c2dlLnJ4X3RpbWVyLCBqaWZmaWVzICsgUlhfUUNIRUNLX1BFUklPRCk7CisJbW9kX3RpbWVyKCZhZGFwdGVyLT5zZ2UudHhfdGltZXIsIGppZmZpZXMgKyBUWF9RQ0hFQ0tfUEVSSU9EKTsKK30KKworLyoqCisgKgl0NHZmX3NnZV9zdG9wIC0gZGlzYWJsZSBTR0Ugb3BlcmF0aW9uCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCisgKglTdG9wIHRhc2tsZXRzIGFuZCB0aW1lcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBETUEgZW5naW5lLiAgTm90ZSB0aGF0CisgKgl0aGlzIGlzIGVmZmVjdGl2ZSBvbmx5IGlmIG1lYXN1cmVzIGhhdmUgYmVlbiB0YWtlbiB0byBkaXNhYmxlIGFueSBIVworICoJZXZlbnRzIHRoYXQgbWF5IHJlc3RhcnQgdGhlbS4KKyAqLwordm9pZCB0NHZmX3NnZV9zdG9wKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcHRlci0+c2dlOworCisJaWYgKHMtPnJ4X3RpbWVyLmZ1bmN0aW9uKQorCQlkZWxfdGltZXJfc3luYygmcy0+cnhfdGltZXIpOworCWlmIChzLT50eF90aW1lci5mdW5jdGlvbikKKwkJZGVsX3RpbWVyX3N5bmMoJnMtPnR4X3RpbWVyKTsKK30KKworLyoqCisgKgl0NHZmX3NnZV9pbml0IC0gaW5pdGlhbGl6ZSBTR0UKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVBlcmZvcm1zIFNHRSBpbml0aWFsaXphdGlvbiBuZWVkZWQgZXZlcnkgdGltZSBhZnRlciBhIGNoaXAgcmVzZXQuCisgKglXZSBkbyBub3QgaW5pdGlhbGl6ZSBhbnkgb2YgdGhlIHF1ZXVlIHNldHMgaGVyZSwgaW5zdGVhZCB0aGUgZHJpdmVyCisgKgl0b3AtbGV2ZWwgbXVzdCByZXF1ZXN0IHRob3NlIGluZGl2aWR1YWxseS4gIFdlIGFsc28gZG8gbm90IGVuYWJsZSBETUEKKyAqCWhlcmUsIHRoYXQgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIHF1ZXVlcyBoYXZlIGJlZW4gc2V0IHVwLgorICovCitpbnQgdDR2Zl9zZ2VfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2dlX3BhcmFtcyAqc2dlX3BhcmFtcyA9ICZhZGFwdGVyLT5wYXJhbXMuc2dlOworCXUzMiBmbDAgPSBzZ2VfcGFyYW1zLT5zZ2VfZmxfYnVmZmVyX3NpemVbMF07CisJdTMyIGZsMSA9IHNnZV9wYXJhbXMtPnNnZV9mbF9idWZmZXJfc2l6ZVsxXTsKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKworCS8qCisJICogU3RhcnQgYnkgdmV0dGluZyB0aGUgYmFzaWMgU0dFIHBhcmFtZXRlcnMgd2hpY2ggaGF2ZSBiZWVuIHNldCB1cCBieQorCSAqIHRoZSBQaHlzaWNhbCBGdW5jdGlvbiBEcml2ZXIuICBJZGVhbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGRlYWwKKwkgKiB3aXRoIF9hbnlfIGNvbmZpZ3VyYXRpb24uICBQcmFjdGljZSBpcyBkaWZmZXJlbnQgLi4uCisJICovCisJaWYgKGZsMCAhPSBQQUdFX1NJWkUgfHwgKGZsMSAhPSAwICYmIGZsMSA8PSBmbDApKSB7CisJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsICJiYWQgU0dFIEZMIGJ1ZmZlciBzaXplcyBbJWQsICVkXVxuIiwKKwkJCWZsMCwgZmwxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoc2dlX3BhcmFtcy0+c2dlX2NvbnRyb2wgJiBSWFBLVENQTE1PREUpID09IDApIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwgImJhZCBTR0UgQ1BMIE1PREVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIE5vdyB0cmFuc2xhdGUgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyBpbnRvIG91ciBpbnRlcm5hbCBmb3Jtcy4KKwkgKi8KKwlpZiAoZmwxKQorCQlGTF9QR19PUkRFUiA9IGlsb2cyKGZsMSkgLSBQQUdFX1NISUZUOworCVNUQVRfTEVOID0gKChzZ2VfcGFyYW1zLT5zZ2VfY29udHJvbCAmIEVHUlNUQVRVU1BBR0VTSVpFKSA/IDEyOCA6IDY0KTsKKwlQS1RTSElGVCA9IFBLVFNISUZUX0dFVChzZ2VfcGFyYW1zLT5zZ2VfY29udHJvbCk7CisJRkxfQUxJR04gPSAxIDw8IChJTkdQQURCT1VOREFSWV9HRVQoc2dlX3BhcmFtcy0+c2dlX2NvbnRyb2wpICsKKwkJCSBTR0VfSU5HUEFEQk9VTkRBUllfU0hJRlQpOworCisJLyoKKwkgKiBTZXQgdXAgdGFza2xldCB0aW1lcnMuCisJICovCisJc2V0dXBfdGltZXIoJnMtPnJ4X3RpbWVyLCBzZ2VfcnhfdGltZXJfY2IsICh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZzLT50eF90aW1lciwgc2dlX3R4X3RpbWVyX2NiLCAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBGb3J3YXJkZWQgSW50ZXJydXB0IFF1ZXVlIGxvY2suCisJICovCisJc3Bpbl9sb2NrX2luaXQoJnMtPmludHJxX2xvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNHZmL3Q0dmZfY29tbW9uLmggYi9kcml2ZXJzL25ldC9jeGdiNHZmL3Q0dmZfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3YmRlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvdDR2Zl9jb21tb24uaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IFBDSS1FIFNSLUlPViBWaXJ0dWFsIEZ1bmN0aW9uIEV0aGVybmV0CisgKiBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19UNFZGX0NPTU1PTl9IX18KKyNkZWZpbmUgX19UNFZGX0NPTU1PTl9IX18KKworI2luY2x1ZGUgIi4uL2N4Z2I0L3Q0ZndfYXBpLmgiCisKKy8qCisgKiBUaGUgImxlbjE2IiBmaWVsZCBvZiBhIEZpcm13YXJlIENvbW1hbmQgU3RydWN0dXJlIC4uLgorICovCisjZGVmaW5lIEZXX0xFTjE2KGZ3X3N0cnVjdCkgRldfQ01EX0xFTjE2KHNpemVvZihmd19zdHJ1Y3QpIC8gMTYpCisKKy8qCisgKiBQZXItVkYgc3RhdGlzdGljcy4KKyAqLworc3RydWN0IHQ0dmZfcG9ydF9zdGF0cyB7CisJLyoKKwkgKiBUWCBzdGF0aXN0aWNzLgorCSAqLworCXU2NCB0eF9iY2FzdF9ieXRlczsJCS8qIGJyb2FkY2FzdCAqLworCXU2NCB0eF9iY2FzdF9mcmFtZXM7CisJdTY0IHR4X21jYXN0X2J5dGVzOwkJLyogbXVsdGljYXN0ICovCisJdTY0IHR4X21jYXN0X2ZyYW1lczsKKwl1NjQgdHhfdWNhc3RfYnl0ZXM7CQkvKiB1bmljYXN0ICovCisJdTY0IHR4X3VjYXN0X2ZyYW1lczsKKwl1NjQgdHhfZHJvcF9mcmFtZXM7CQkvKiBUWCBkcm9wcGVkIGZyYW1lcyAqLworCXU2NCB0eF9vZmZsb2FkX2J5dGVzOwkJLyogb2ZmbG9hZCAqLworCXU2NCB0eF9vZmZsb2FkX2ZyYW1lczsKKworCS8qCisJICogUlggc3RhdGlzdGljcy4KKwkgKi8KKwl1NjQgcnhfYmNhc3RfYnl0ZXM7CQkvKiBicm9hZGNhc3QgKi8KKwl1NjQgcnhfYmNhc3RfZnJhbWVzOworCXU2NCByeF9tY2FzdF9ieXRlczsJCS8qIG11bHRpY2FzdCAqLworCXU2NCByeF9tY2FzdF9mcmFtZXM7CisJdTY0IHJ4X3VjYXN0X2J5dGVzOworCXU2NCByeF91Y2FzdF9mcmFtZXM7CQkvKiB1bmljYXN0ICovCisKKwl1NjQgcnhfZXJyX2ZyYW1lczsJCS8qIFJYIGVycm9yIGZyYW1lcyAqLworfTsKKworLyoKKyAqIFBlci0icG9ydCIgKFZpcnR1YWwgSW50ZXJmYWNlKSBsaW5rIGNvbmZpZ3VyYXRpb24gLi4uCisgKi8KK3N0cnVjdCBsaW5rX2NvbmZpZyB7CisJdW5zaWduZWQgaW50ICAgc3VwcG9ydGVkOyAgICAgICAgLyogbGluayBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBpbnQgICBhZHZlcnRpc2luZzsgICAgICAvKiBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIHNob3J0IHJlcXVlc3RlZF9zcGVlZDsgIC8qIHNwZWVkIHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIHNob3J0IHNwZWVkOyAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIHNwZWVkICovCisJdW5zaWduZWQgY2hhciAgcmVxdWVzdGVkX2ZjOyAgICAgLyogZmxvdyBjb250cm9sIHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIGNoYXIgIGZjOyAgICAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIGZsb3cgY29udHJvbCAqLworCXVuc2lnbmVkIGNoYXIgIGF1dG9uZWc7ICAgICAgICAgIC8qIGF1dG9uZWdvdGlhdGluZz8gKi8KKwl1bnNpZ25lZCBjaGFyICBsaW5rX29rOyAgICAgICAgICAvKiBsaW5rIHVwPyAqLworfTsKKworZW51bSB7CisJUEFVU0VfUlggICAgICA9IDEgPDwgMCwKKwlQQVVTRV9UWCAgICAgID0gMSA8PCAxLAorCVBBVVNFX0FVVE9ORUcgPSAxIDw8IDIKK307CisKKy8qCisgKiBHZW5lcmFsIGRldmljZSBwYXJhbWV0ZXJzIC4uLgorICovCitzdHJ1Y3QgZGV2X3BhcmFtcyB7CisJdTMyIGZ3cmV2OwkJCS8qIGZpcm13YXJlIHZlcnNpb24gKi8KKwl1MzIgdHByZXY7CQkJLyogVFAgTWljcm9jb2RlIFZlcnNpb24gKi8KK307CisKKy8qCisgKiBTY2F0dGVyIEdhdGhlciBFbmdpbmUgcGFyYW1ldGVycy4gIFRoZXNlIGFyZSBhbG1vc3QgYWxsIGRldGVybWluZWQgYnkgdGhlCisgKiBQaHlzaWNhbCBGdW5jdGlvbiBEcml2ZXIuICBXZSBqdXN0IG5lZWQgdG8gZ3JhYiB0aGVtIHRvIHNlZSB3aXRoaW4gd2hpY2gKKyAqIGVudmlyb25tZW50IHdlJ3JlIHBsYXlpbmcgLi4uCisgKi8KK3N0cnVjdCBzZ2VfcGFyYW1zIHsKKwl1MzIgc2dlX2NvbnRyb2w7CQkvKiBwYWRkaW5nLCBib3VuZGFyaWVzLCBsZW5ndGhzLCBldGMuICovCisJdTMyIHNnZV9ob3N0X3BhZ2Vfc2l6ZTsJCS8qIFJETUEgcGFnZSBzaXplcyAqLworCXUzMiBzZ2VfcXVldWVzX3Blcl9wYWdlOwkvKiBSRE1BIHF1ZXVlcy9wYWdlICovCisJdTMyIHNnZV91c2VyX21vZGVfbGltaXRzOwkvKiBsaW1pdHMgZm9yIEJBUjIgdXNlciBtb2RlIGFjY2Vzc2VzICovCisJdTMyIHNnZV9mbF9idWZmZXJfc2l6ZVsxNl07CS8qIGZyZWUgbGlzdCBidWZmZXIgc2l6ZXMgKi8KKwl1MzIgc2dlX2luZ3Jlc3NfcnhfdGhyZXNob2xkOwkvKiBSWCBjb3VudGVyIGludGVycnVwdCB0aHJlc2hvbGRbNF0gKi8KKwl1MzIgc2dlX3RpbWVyX3ZhbHVlXzBfYW5kXzE7CS8qIGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyIHZhbHVlcyAqLworCXUzMiBzZ2VfdGltZXJfdmFsdWVfMl9hbmRfMzsKKwl1MzIgc2dlX3RpbWVyX3ZhbHVlXzRfYW5kXzU7Cit9OworCisvKgorICogVml0YWwgUHJvZHVjdCBEYXRhIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCB2cGRfcGFyYW1zIHsKKwl1MzIgY2NsazsJCQkvKiBDb3JlIENsb2NrIChLSHopICovCit9OworCisvKgorICogR2xvYmFsIFJlY2VpdmUgU2lkZSBTY2FsaW5nIChSU1MpIHBhcmFtZXRlcnMgaW4gaG9zdC1uYXRpdmUgZm9ybWF0LgorICovCitzdHJ1Y3QgcnNzX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IG1vZGU7CQkvKiBSU1MgbW9kZSAqLworCXVuaW9uIHsKKwkgICAgc3RydWN0IHsKKwkJaW50IHN5bm1hcGVuOjE7CQkvKiBTWU4gTWFwIEVuYWJsZSAqLworCQlpbnQgc3luNHR1cGVuaXB2NjoxOwkvKiBlbmFibGUgaGFzaGluZyA0LXR1cGxlIElQdjYgU1lOcyAqLworCQlpbnQgc3luMnR1cGVuaXB2NjoxOwkvKiBlbmFibGUgaGFzaGluZyAyLXR1cGxlIElQdjYgU1lOcyAqLworCQlpbnQgc3luNHR1cGVuaXB2NDoxOwkvKiBlbmFibGUgaGFzaGluZyA0LXR1cGxlIElQdjQgU1lOcyAqLworCQlpbnQgc3luMnR1cGVuaXB2NDoxOwkvKiBlbmFibGUgaGFzaGluZyAyLXR1cGxlIElQdjQgU1lOcyAqLworCQlpbnQgb2ZkbWFwZW46MTsJCS8qIE9mZmxvYWQgTWFwIEVuYWJsZSAqLworCQlpbnQgdG5sbWFwZW46MTsJCS8qIFR1bm5lbCBNYXAgRW5hYmxlICovCisJCWludCB0bmxhbGxsb29rdXA6MTsJLyogVHVubmVsIEFsbCBMb29rdXAgKi8KKwkJaW50IGhhc2h0b2VwbGl0ejoxOwkvKiB1c2UgVG9lcGxpdHogaGFzaCAqLworCSAgICB9IGJhc2ljdmlydHVhbDsKKwl9IHU7Cit9OworCisvKgorICogVmlydHVhbCBJbnRlcmZhY2UgUlNTIENvbmZpZ3VyYXRpb24gaW4gaG9zdC1uYXRpdmUgZm9ybWF0LgorICovCit1bmlvbiByc3NfdmlfY29uZmlnIHsKKyAgICBzdHJ1Y3QgeworCXUxNiBkZWZhdWx0cTsJCQkvKiBJbmdyZXNzIFF1ZXVlIElEIGZvciAhdG5sYWxsbG9va3VwICovCisJaW50IGlwNmZvdXJ0dXBlbjoxOwkJLyogaGFzaCA0LXR1cGxlIElQdjYgaW5ncmVzcyBwYWNrZXRzICovCisJaW50IGlwNnR3b3R1cGVuOjE7CQkvKiBoYXNoIDItdHVwbGUgSVB2NiBpbmdyZXNzIHBhY2tldHMgKi8KKwlpbnQgaXA0Zm91cnR1cGVuOjE7CQkvKiBoYXNoIDQtdHVwbGUgSVB2NCBpbmdyZXNzIHBhY2tldHMgKi8KKwlpbnQgaXA0dHdvdHVwZW46MTsJCS8qIGhhc2ggMi10dXBsZSBJUHY0IGluZ3Jlc3MgcGFja2V0cyAqLworCWludCB1ZHBlbjsJCQkvKiBoYXNoIDQtdHVwbGUgVURQIGluZ3Jlc3MgcGFja2V0cyAqLworICAgIH0gYmFzaWN2aXJ0dWFsOworfTsKKworLyoKKyAqIE1heGltdW0gcmVzb3VyY2VzIHByb3Zpc2lvbmVkIGZvciBhIFBDSSBWRi4KKyAqLworc3RydWN0IHZmX3Jlc291cmNlcyB7CisJdW5zaWduZWQgaW50IG52aTsJCS8qIE4gdmlydHVhbCBpbnRlcmZhY2VzICovCisJdW5zaWduZWQgaW50IG5lcTsJCS8qIE4gZWdyZXNzIFFzICovCisJdW5zaWduZWQgaW50IG5ldGhjdHJsOwkJLyogTiBlZ3Jlc3MgRVRIIG9yIENUUkwgUXMgKi8KKwl1bnNpZ25lZCBpbnQgbmlxZmxpbnQ7CQkvKiBOIGluZ3Jlc3MgUXMvdyBmcmVlIGxpc3QocykgJiBpbnRyICovCisJdW5zaWduZWQgaW50IG5pcTsJCS8qIE4gaW5ncmVzcyBRcyAqLworCXVuc2lnbmVkIGludCB0YzsJCS8qIFBDSS1FIHRyYWZmaWMgY2xhc3MgKi8KKwl1bnNpZ25lZCBpbnQgcG1hc2s7CQkvKiBwb3J0IGFjY2VzcyByaWdodHMgbWFzayAqLworCXVuc2lnbmVkIGludCBuZXhhY3RmOwkJLyogTiBleGFjdCBNUFMgZmlsdGVycyAqLworCXVuc2lnbmVkIGludCByX2NhcHM7CQkvKiByZWFkIGNhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIGludCB3eF9jYXBzOwkJLyogd3JpdGUvZXhlY3V0ZSBjYXBhYmlsaXRpZXMgKi8KK307CisKKy8qCisgKiBQZXItImFkYXB0ZXIiIChWaXJ0dWFsIEZ1bmN0aW9uKSBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgeworCXN0cnVjdCBkZXZfcGFyYW1zIGRldjsJCS8qIGdlbmVyYWwgZGV2aWNlIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3Qgc2dlX3BhcmFtcyBzZ2U7CQkvKiBTY2F0dGVyIEdhdGhlciBFbmdpbmUgKi8KKwlzdHJ1Y3QgdnBkX3BhcmFtcyB2cGQ7CQkvKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KKwlzdHJ1Y3QgcnNzX3BhcmFtcyByc3M7CQkvKiBSZWNlaXZlIFNpZGUgU2NhbGluZyAqLworCXN0cnVjdCB2Zl9yZXNvdXJjZXMgdmZyZXM7CS8qIFZpcnR1YWwgRnVuY3Rpb24gUmVzb3VyY2UgbGltaXRzICovCisJdTggbnBvcnRzOwkJCS8qICMgb2YgRXRoZXJuZXQgInBvcnRzIiAqLworfTsKKworI2luY2x1ZGUgImFkYXB0ZXIuaCIKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NIRUxTSU8KKyMgZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0hFTFNJTyAweDE0MjUKKyNlbmRpZgorCisjZGVmaW5lIGZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaXRlcikgXAorCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAoYWRhcHRlciktPnBhcmFtcy5ucG9ydHM7IGl0ZXIrKykKKworc3RhdGljIGlubGluZSBib29sIGlzXzEwZ19wb3J0KGNvbnN0IHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMpCit7CisJcmV0dXJuIChsYy0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCkgIT0gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY29yZV90aWNrc19wZXJfdXNlYyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gYWRhcHRlci0+cGFyYW1zLnZwZC5jY2xrIC8gMTAwMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdXNfdG9fY29yZV90aWNrcyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1cykKK3sKKwlyZXR1cm4gKHVzICogYWRhcHRlci0+cGFyYW1zLnZwZC5jY2xrKSAvIDEwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvcmVfdGlja3NfdG9fdXMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgdGlja3MpCit7CisJcmV0dXJuICh0aWNrcyAqIDEwMDApIC8gYWRhcHRlci0+cGFyYW1zLnZwZC5jY2xrOworfQorCitpbnQgdDR2Zl93cl9tYm94X2NvcmUoc3RydWN0IGFkYXB0ZXIgKiwgY29uc3Qgdm9pZCAqLCBpbnQsIHZvaWQgKiwgYm9vbCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHQ0dmZfd3JfbWJveChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgY29uc3Qgdm9pZCAqY21kLAorCQkJICAgICAgIGludCBzaXplLCB2b2lkICpycGwpCit7CisJcmV0dXJuIHQ0dmZfd3JfbWJveF9jb3JlKGFkYXB0ZXIsIGNtZCwgc2l6ZSwgcnBsLCB0cnVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdDR2Zl93cl9tYm94X25zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCB2b2lkICpjbWQsCisJCQkJICBpbnQgc2l6ZSwgdm9pZCAqcnBsKQoreworCXJldHVybiB0NHZmX3dyX21ib3hfY29yZShhZGFwdGVyLCBjbWQsIHNpemUsIHJwbCwgZmFsc2UpOworfQorCitpbnQgX19kZXZpbml0IHQ0dmZfd2FpdF9kZXZfcmVhZHkoc3RydWN0IGFkYXB0ZXIgKik7CitpbnQgX19kZXZpbml0IHQ0dmZfcG9ydF9pbml0KHN0cnVjdCBhZGFwdGVyICosIGludCk7CisKK2ludCB0NHZmX3F1ZXJ5X3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqLCB1bnNpZ25lZCBpbnQsIGNvbnN0IHUzMiAqLCB1MzIgKik7CitpbnQgdDR2Zl9zZXRfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICosIHVuc2lnbmVkIGludCwgY29uc3QgdTMyICosIGNvbnN0IHUzMiAqKTsKKworaW50IHQ0dmZfZ2V0X3NnZV9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKik7CitpbnQgdDR2Zl9nZXRfdnBkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqKTsKK2ludCB0NHZmX2dldF9kZXZfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICopOworaW50IHQ0dmZfZ2V0X3Jzc19nbGJfY29uZmlnKHN0cnVjdCBhZGFwdGVyICopOworaW50IHQ0dmZfZ2V0X3ZmcmVzKHN0cnVjdCBhZGFwdGVyICopOworCitpbnQgdDR2Zl9yZWFkX3Jzc192aV9jb25maWcoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50LAorCQkJICAgIHVuaW9uIHJzc192aV9jb25maWcgKik7CitpbnQgdDR2Zl93cml0ZV9yc3NfdmlfY29uZmlnKHN0cnVjdCBhZGFwdGVyICosIHVuc2lnbmVkIGludCwKKwkJCSAgICAgdW5pb24gcnNzX3ZpX2NvbmZpZyAqKTsKK2ludCB0NHZmX2NvbmZpZ19yc3NfcmFuZ2Uoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCBpbnQsIGludCwKKwkJCSAgY29uc3QgdTE2ICosIGludCk7CisKK2ludCB0NHZmX2FsbG9jX3ZpKHN0cnVjdCBhZGFwdGVyICosIGludCk7CitpbnQgdDR2Zl9mcmVlX3ZpKHN0cnVjdCBhZGFwdGVyICosIGludCk7CitpbnQgdDR2Zl9lbmFibGVfdmkoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCBib29sLCBib29sKTsKK2ludCB0NHZmX2lkZW50aWZ5X3BvcnQoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCitpbnQgdDR2Zl9zZXRfcnhtb2RlKHN0cnVjdCBhZGFwdGVyICosIHVuc2lnbmVkIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisJCSAgICBib29sKTsKK2ludCB0NHZmX2FsbG9jX21hY19maWx0KHN0cnVjdCBhZGFwdGVyICosIHVuc2lnbmVkIGludCwgYm9vbCwgdW5zaWduZWQgaW50LAorCQkJY29uc3QgdTggKiosIHUxNiAqLCB1NjQgKiwgYm9vbCk7CitpbnQgdDR2Zl9jaGFuZ2VfbWFjKHN0cnVjdCBhZGFwdGVyICosIHVuc2lnbmVkIGludCwgaW50LCBjb25zdCB1OCAqLCBib29sKTsKK2ludCB0NHZmX3NldF9hZGRyX2hhc2goc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCBib29sLCB1NjQsIGJvb2wpOworaW50IHQ0dmZfZ2V0X3BvcnRfc3RhdHMoc3RydWN0IGFkYXB0ZXIgKiwgaW50LCBzdHJ1Y3QgdDR2Zl9wb3J0X3N0YXRzICopOworCitpbnQgdDR2Zl9pcV9mcmVlKHN0cnVjdCBhZGFwdGVyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJCSB1bnNpZ25lZCBpbnQpOworaW50IHQ0dmZfZXRoX2VxX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50KTsKKworaW50IHQ0dmZfaGFuZGxlX2Z3X3JwbChzdHJ1Y3QgYWRhcHRlciAqLCBjb25zdCBfX2JlNjQgKik7CisKKyNlbmRpZiAvKiBfX1Q0VkZfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjR2Zi90NHZmX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvdDR2Zl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiMTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvdDR2Zl9kZWZzLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBQQ0ktRSBTUi1JT1YgVmlydHVhbCBGdW5jdGlvbiBFdGhlcm5ldAorICogZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fVDRWRl9ERUZTX0hfXworI2RlZmluZSBfX1Q0VkZfREVGU19IX18KKworI2luY2x1ZGUgIi4uL2N4Z2I0L3Q0X3JlZ3MuaCIKKworLyoKKyAqIFRoZSBWRiBSZWdpc3RlciBNYXAuCisgKgorICogVGhlIFNjYXR0ZXIgR2F0aGVyIEVuZ2luZSAoU0dFKSwgTXVsdGlwb3J0IFN1cHBvcnQgbW9kdWxlIChNUFMpLCBQSU8gTG9jYWwKKyAqIGJ1cyBtb2R1bGUgKFBMKSBhbmQgQ1BVIEludGVyZmFjZSBNb2R1bGUgKENJTSkgY29tcG9uZW50cyBhcmUgbWFwcGVkIHZpYQorICogdGhlIFNsaWNlIHRvIE1vZHVsZSBNYXAgVGFibGUgKHNlZSBiZWxvdykgaW4gdGhlIFBoeXNpY2FsIEZ1bmN0aW9uIFJlZ2lzdGVyCisgKiBNYXAuICBUaGUgTWFpbCBCb3ggRGF0YSAoTUJEQVRBKSByYW5nZSBpcyBtYXBwZWQgdmlhIHRoZSBQQ0ktRSBNYWlsYm94IEJhc2UKKyAqIGFuZCBPZmZzZXQgcmVnaXN0ZXJzIGluIHRoZSBQRiBSZWdpc3RlciBNYXAuICBUaGUgTUJEQVRBIGJhc2UgYWRkcmVzcyBpcworICogcXVpdGUgY29uc3RyYWluZWQgYXMgaXQgZGV0ZXJtaW5lcyB0aGUgTWFpbGJveCBEYXRhIGFkZHJlc3NlcyBmb3IgYm90aCBQRnMKKyAqIGFuZCBWRnMsIGFuZCB0aGVyZWZvcmUgbXVzdCBmaXQgaW4gYm90aCB0aGUgVkYgYW5kIFBGIFJlZ2lzdGVyIE1hcHMgd2l0aG91dAorICogb3ZlcmxhcHBpbmcgb3RoZXIgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFQ0VkZfU0dFX0JBU0VfQUREUgkweDAwMDAKKyNkZWZpbmUgVDRWRl9NUFNfQkFTRV9BRERSCTB4MDEwMAorI2RlZmluZSBUNFZGX1BMX0JBU0VfQUREUgkweDAyMDAKKyNkZWZpbmUgVDRWRl9NQkRBVEFfQkFTRV9BRERSCTB4MDI0MAorI2RlZmluZSBUNFZGX0NJTV9CQVNFX0FERFIJMHgwMzAwCisKKyNkZWZpbmUgVDRWRl9SRUdNQVBfU1RBUlQJMHgwMDAwCisjZGVmaW5lIFQ0VkZfUkVHTUFQX1NJWkUJMHgwNDAwCisKKy8qCisgKiBUaGVyZSdzIG5vIGhhcmR3YXJlIGxpbWl0YXRpb24gd2hpY2ggcmVxdWlyZXMgdGhhdCB0aGUgYWRkcmVzc2VzIG9mIHRoZQorICogTWFpbGJveCBEYXRhIGluIHRoZSBmaXhlZCBDSU0gUEYgbWFwIGFuZCB0aGUgcHJvZ3JhbW1hYmxlIFZGIG1hcCBtdXN0CisgKiBtYXRjaC4gIEhvd2V2ZXIsIGl0J3MgYSB1c2VmdWwgY29udmVudGlvbiAuLi4KKyAqLworI2lmIFQ0VkZfTUJEQVRBX0JBU0VfQUREUiAhPSBDSU1fUEZfTUFJTEJPWF9EQVRBCisjZXJyb3IgVDRWRl9NQkRBVEFfQkFTRV9BRERSIG11c3QgbWF0Y2ggQ0lNX1BGX01BSUxCT1hfREFUQSEKKyNlbmRpZgorCisvKgorICogVmlydHVhbCBGdW5jdGlvbiAiU2xpY2UgdG8gTW9kdWxlIE1hcCBUYWJsZSIgZGVmaW5pdGlvbnMuCisgKgorICogVGhpcyB0YWJsZSBhbGxvd3MgdXMgdG8gbWFwIHN1YnNldHMgb2YgdGhlIHZhcmlvdXMgbW9kdWxlIHJlZ2lzdGVyIHNldHMKKyAqIGludG8gdGhlIFQ0VkYgUmVnaXN0ZXIgTWFwLiAgRWFjaCB0YWJsZSBlbnRyeSBpZGVudGlmaWVzIHRoZSBpbmRleCBvZiB0aGUKKyAqIG1vZHVsZSB3aG9zZSByZWdpc3RlcnMgYXJlIGJlaW5nIG1hcHBlZCwgdGhlIG9mZnNldCB3aXRoaW4gdGhlIG1vZHVsZSdzCisgKiByZWdpc3RlciBzZXQgdGhhdCB0aGUgbWFwcGluZyBzaG91bGQgc3RhcnQgYXQsIHRoZSBsaW1pdCBvZiB0aGUgbWFwcGluZywKKyAqIGFuZCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgVDRWRiBSZWdpc3RlciBNYXAgdG8gd2hpY2ggdGhlIG1vZHVsZSdzIHJlZ2lzdGVycworICogYXJlIGJlaW5nIG1hcHBlZC4gIEFsbCBhZGRyZXNzZXMgYW5kIHF1YWx0aXRpZXMgYXJlIGluIHRlcm1zIG9mIDMyLWJpdAorICogd29yZHMuICBUaGUgImxpbWl0IiB2YWx1ZSBpcyBhbHNvIGluIHRlcm1zIG9mIDMyLWJpdCB3b3JkcyBhbmQgaXMgZXF1YWwgdG8KKyAqIHRoZSBsYXN0IGFkZHJlc3MgbWFwcGVkIGluIHRoZSBUNFZGIFJlZ2lzdGVyIE1hcCAxIChpLmUuIGl0J3MgYSAiPD0iCisgKiByZWxhdGlvbiByYXRoZXIgdGhhbiBhICI8IikuCisgKi8KKyNkZWZpbmUgVDRWRl9NT0RfTUFQKG1vZHVsZSwgaW5kZXgsIGZpcnN0LCBsYXN0KSBcCisJVDRWRl9NT0RfTUFQXyMjbW9kdWxlIyNfSU5ERVggID0gKGluZGV4KSwgXAorCVQ0VkZfTU9EX01BUF8jI21vZHVsZSMjX0ZJUlNUICA9IChmaXJzdCksIFwKKwlUNFZGX01PRF9NQVBfIyNtb2R1bGUjI19MQVNUICAgPSAobGFzdCksIFwKKwlUNFZGX01PRF9NQVBfIyNtb2R1bGUjI19PRkZTRVQgPSAoKGZpcnN0KS80KSwgXAorCVQ0VkZfTU9EX01BUF8jI21vZHVsZSMjX0JBU0UgPSBcCisJCShUNFZGXyMjbW9kdWxlIyNfQkFTRV9BRERSLzQgKyAoZmlyc3QpLzQpLCBcCisJVDRWRl9NT0RfTUFQXyMjbW9kdWxlIyNfTElNSVQgPSBcCisJCShUNFZGXyMjbW9kdWxlIyNfQkFTRV9BRERSLzQgKyAobGFzdCkvNCksCisKKyNkZWZpbmUgU0dFX1ZGX0tET09SQkVMTCAweDAKKyNkZWZpbmUgU0dFX1ZGX0dUUyAweDQKKyNkZWZpbmUgTVBTX1ZGX0NUTCAweDAKKyNkZWZpbmUgTVBTX1ZGX1NUQVRfUlhfVkZfRVJSX0ZSQU1FU19IIDB4ZmMKKyNkZWZpbmUgUExfVkZfV0hPQU1JIDB4MAorI2RlZmluZSBDSU1fVkZfRVhUX01BSUxCT1hfQ1RSTCAweDAKKyNkZWZpbmUgQ0lNX1ZGX0VYVF9NQUlMQk9YX1NUQVRVUyAweDQKKworZW51bSB7CisgICAgVDRWRl9NT0RfTUFQKFNHRSwgMiwgU0dFX1ZGX0tET09SQkVMTCwgU0dFX1ZGX0dUUykKKyAgICBUNFZGX01PRF9NQVAoTVBTLCAwLCBNUFNfVkZfQ1RMLCBNUFNfVkZfU1RBVF9SWF9WRl9FUlJfRlJBTUVTX0gpCisgICAgVDRWRl9NT0RfTUFQKFBMLCAgMywgUExfVkZfV0hPQU1JLCBQTF9WRl9XSE9BTUkpCisgICAgVDRWRl9NT0RfTUFQKENJTSwgMSwgQ0lNX1ZGX0VYVF9NQUlMQk9YX0NUUkwsIENJTV9WRl9FWFRfTUFJTEJPWF9TVEFUVVMpCit9OworCisvKgorICogVGhlcmUgaXNuJ3QgYSBTbGljZSB0byBNb2R1bGUgTWFwIFRhYmxlIGVudHJ5IGZvciB0aGUgTWFpbGJveCBEYXRhCisgKiByZWdpc3RlcnMsIGJ1dCBpdCdzIGNvbnZlbmllbnQgdG8gdXNlIHNpbWlsYXIgbmFtZXMgYXMgYWJvdmUuICBUaGVyZSBhcmUgOAorICogbGl0dGxlLWVuZGlhbiA2NC1iaXQgTWFpbGJveCBEYXRhIHJlZ2lzdGVycy4gIE5vdGUgdGhhdCB0aGUgImluc3RhbmNlcyIKKyAqIHZhbHVlIGJlbG93IGlzIGluIHRlcm1zIG9mIDMyLWJpdCB3b3JkcyB3aGljaCBtYXRjaGVzIHRoZSAid29yZCIgYWRkcmVzc2luZworICogc3BhY2Ugd2UgdXNlIGFib3ZlIGZvciB0aGUgU2xpY2UgdG8gTW9kdWxlIE1hcCBTcGFjZS4KKyAqLworI2RlZmluZSBOVU1fQ0lNX1ZGX01BSUxCT1hfREFUQV9JTlNUQU5DRVMgMTYKKworI2RlZmluZSBUNFZGX01CREFUQV9GSVJTVAkwCisjZGVmaW5lIFQ0VkZfTUJEQVRBX0xBU1QJKChOVU1fQ0lNX1ZGX01BSUxCT1hfREFUQV9JTlNUQU5DRVMtMSkqNCkKKworI2VuZGlmIC8qIF9fVDRUNFZGX0RFRlNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiNHZmL3Q0dmZfaHcuYyBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvdDR2Zl9ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWMxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiNHZmL3Q0dmZfaHcuYwpAQCAtMCwwICsxLDEzMzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBQQ0ktRSBTUi1JT1YgVmlydHVhbCBGdW5jdGlvbiBFdGhlcm5ldAorICogZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAidDR2Zl9jb21tb24uaCIKKyNpbmNsdWRlICJ0NHZmX2RlZnMuaCIKKworI2luY2x1ZGUgIi4uL2N4Z2I0L3Q0X3JlZ3MuaCIKKyNpbmNsdWRlICIuLi9jeGdiNC90NGZ3X2FwaS5oIgorCisvKgorICogV2FpdCBmb3IgdGhlIGRldmljZSB0byBiZWNvbWUgcmVhZHkgKHNpZ25pZmllZCBieSBvdXIgIndobyBhbSBJIiByZWdpc3RlcgorICogcmV0dXJuaW5nIGEgdmFsdWUgb3RoZXIgdGhhbiBhbGwgMSdzKS4gIFJldHVybiBhbiBlcnJvciBpZiBpdCBkb2Vzbid0CisgKiBiZWNvbWUgcmVhZHkgLi4uCisgKi8KK2ludCBfX2RldmluaXQgdDR2Zl93YWl0X2Rldl9yZWFkeShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwljb25zdCB1MzIgd2hvYW1pID0gVDRWRl9QTF9CQVNFX0FERFIgKyBQTF9WRl9XSE9BTUk7CisJY29uc3QgdTMyIG5vdHJlYWR5MSA9IDB4ZmZmZmZmZmY7CisJY29uc3QgdTMyIG5vdHJlYWR5MiA9IDB4ZWVlZWVlZWU7CisJdTMyIHZhbDsKKworCXZhbCA9IHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIHdob2FtaSk7CisJaWYgKHZhbCAhPSBub3RyZWFkeTEgJiYgdmFsICE9IG5vdHJlYWR5MikKKwkJcmV0dXJuIDA7CisJbXNsZWVwKDUwMCk7CisJdmFsID0gdDRfcmVhZF9yZWcoYWRhcHRlciwgd2hvYW1pKTsKKwlpZiAodmFsICE9IG5vdHJlYWR5MSAmJiB2YWwgIT0gbm90cmVhZHkyKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCisvKgorICogR2V0IHRoZSByZXBseSB0byBhIG1haWxib3ggY29tbWFuZCBhbmQgc3RvcmUgaXQgaW4gQHJwbCBpbiBiaWctZW5kaWFuIG9yZGVyCisgKiAoc2luY2UgdGhlIGZpcm13YXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgc3BlY2lmaWVkIGluIGEgYmlnLWVuZGlhbiBsYXlvdXQpLgorICovCitzdGF0aWMgdm9pZCBnZXRfbWJveF9ycGwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIF9fYmU2NCAqcnBsLCBpbnQgc2l6ZSwKKwkJCSB1MzIgbWJveF9kYXRhKQoreworCWZvciAoIDsgc2l6ZTsgc2l6ZSAtPSA4LCBtYm94X2RhdGEgKz0gOCkKKwkJKnJwbCsrID0gY3B1X3RvX2JlNjQodDRfcmVhZF9yZWc2NChhZGFwdGVyLCBtYm94X2RhdGEpKTsKK30KKworLyoKKyAqIER1bXAgY29udGVudHMgb2YgbWFpbGJveCB3aXRoIGEgbGVhZGluZyB0YWcuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBfbWJveChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgY29uc3QgY2hhciAqdGFnLCB1MzIgbWJveF9kYXRhKQoreworCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCSJtYm94ICVzOiAlbGx4ICVsbHggJWxseCAlbGx4ICVsbHggJWxseCAlbGx4ICVsbHhcbiIsIHRhZywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArICAwKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArICA4KSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArIDE2KSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArIDI0KSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArIDMyKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArIDQwKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArIDQ4KSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0NF9yZWFkX3JlZzY0KGFkYXB0ZXIsIG1ib3hfZGF0YSArIDU2KSk7Cit9CisKKy8qKgorICoJdDR2Zl93cl9tYm94X2NvcmUgLSBzZW5kIGEgY29tbWFuZCB0byBGVyB0aHJvdWdoIHRoZSBtYWlsYm94CisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBjbWQ6IHRoZSBjb21tYW5kIHRvIHdyaXRlCisgKglAc2l6ZTogY29tbWFuZCBsZW5ndGggaW4gYnl0ZXMKKyAqCUBycGw6IHdoZXJlIHRvIG9wdGlvbmFsbHkgc3RvcmUgdGhlIHJlcGx5CisgKglAc2xlZXBfb2s6IGlmIHRydWUgd2UgbWF5IHNsZWVwIHdoaWxlIGF3YWl0aW5nIGNvbW1hbmQgY29tcGxldGlvbgorICoKKyAqCVNlbmRzIHRoZSBnaXZlbiBjb21tYW5kIHRvIEZXIHRocm91Z2ggdGhlIG1haWxib3ggYW5kIHdhaXRzIGZvciB0aGUKKyAqCUZXIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQuICBJZiBAcnBsIGlzIG5vdCAlTlVMTCBpdCBpcyB1c2VkIHRvIHN0b3JlCisgKgl0aGUgRlcncyByZXBseSB0byB0aGUgY29tbWFuZC4gIFRoZSBjb21tYW5kIGFuZCBpdHMgb3B0aW9uYWwgcmVwbHkKKyAqCWFyZSBvZiB0aGUgc2FtZSBsZW5ndGguICBGVyBjYW4gdGFrZSB1cCB0byA1MDAgbXMgdG8gcmVzcG9uZC4KKyAqCUBzbGVlcF9vayBkZXRlcm1pbmVzIHdoZXRoZXIgd2UgbWF5IHNsZWVwIHdoaWxlIGF3YWl0aW5nIHRoZSByZXNwb25zZS4KKyAqCUlmIHNsZWVwaW5nIGlzIGFsbG93ZWQgd2UgdXNlIHByb2dyZXNzaXZlIGJhY2tvZmYgb3RoZXJ3aXNlIHdlIHNwaW4uCisgKgorICoJVGhlIHJldHVybiB2YWx1ZSBpcyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLiAgQQorICoJZmFpbHVyZSBjYW4gaGFwcGVuIGVpdGhlciBiZWNhdXNlIHdlIGFyZSBub3QgYWJsZSB0byBleGVjdXRlIHRoZQorICoJY29tbWFuZCBvciBGVyBleGVjdXRlcyBpdCBidXQgc2lnbmFscyBhbiBlcnJvci4gIEluIHRoZSBsYXR0ZXIgY2FzZQorICoJdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZXJyb3IgY29kZSBpbmRpY2F0ZWQgYnkgRlcgKG5lZ2F0ZWQpLgorICovCitpbnQgdDR2Zl93cl9tYm94X2NvcmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHZvaWQgKmNtZCwgaW50IHNpemUsCisJCSAgICAgIHZvaWQgKnJwbCwgYm9vbCBzbGVlcF9vaykKK3sKKwlzdGF0aWMgaW50IGRlbGF5W10gPSB7CisJCTEsIDEsIDMsIDUsIDEwLCAxMCwgMjAsIDUwLCAxMDAKKwl9OworCisJdTMyIHY7CisJaW50IGksIG1zLCBkZWxheV9pZHg7CisJY29uc3QgX19iZTY0ICpwOworCXUzMiBtYm94X2RhdGEgPSBUNFZGX01CREFUQV9CQVNFX0FERFI7CisJdTMyIG1ib3hfY3RsID0gVDRWRl9DSU1fQkFTRV9BRERSICsgQ0lNX1ZGX0VYVF9NQUlMQk9YX0NUUkw7CisKKwkvKgorCSAqIENvbW1hbmRzIG11c3QgYmUgbXVsdGlwbGVzIG9mIDE2IGJ5dGVzIGluIGxlbmd0aCBhbmQgbWF5IG5vdCBiZQorCSAqIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBNYWlsYm94IERhdGEgcmVnaXN0ZXIgYXJyYXkuCisJICovCisJaWYgKChzaXplICUgMTYpICE9IDAgfHwKKwkgICAgc2l6ZSA+IE5VTV9DSU1fVkZfTUFJTEJPWF9EQVRBX0lOU1RBTkNFUyAqIDQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBMb29wIHRyeWluZyB0byBnZXQgb3duZXJzaGlwIG9mIHRoZSBtYWlsYm94LiAgUmV0dXJuIGFuIGVycm9yCisJICogaWYgd2UgY2FuJ3QgZ2FpbiBvd25lcnNoaXAuCisJICovCisJdiA9IE1CT1dORVJfR0VUKHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIG1ib3hfY3RsKSk7CisJZm9yIChpID0gMDsgdiA9PSBNQk9YX09XTkVSX05PTkUgJiYgaSA8IDM7IGkrKykKKwkJdiA9IE1CT1dORVJfR0VUKHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIG1ib3hfY3RsKSk7CisJaWYgKHYgIT0gTUJPWF9PV05FUl9EUlYpCisJCXJldHVybiB2ID09IE1CT1hfT1dORVJfRlcgPyAtRUJVU1kgOiAtRVRJTUVET1VUOworCisJLyoKKwkgKiBXcml0ZSB0aGUgY29tbWFuZCBhcnJheSBpbnRvIHRoZSBNYWlsYm94IERhdGEgcmVnaXN0ZXIgYXJyYXkgYW5kCisJICogdHJhbnNmZXIgb3duZXJzaGlwIG9mIHRoZSBtYWlsYm94IHRvIHRoZSBmaXJtd2FyZS4KKwkgKi8KKwlmb3IgKGkgPSAwLCBwID0gY21kOyBpIDwgc2l6ZTsgaSArPSA4KQorCQl0NF93cml0ZV9yZWc2NChhZGFwdGVyLCBtYm94X2RhdGEgKyBpLCBiZTY0X3RvX2NwdSgqcCsrKSk7CisJdDRfd3JpdGVfcmVnKGFkYXB0ZXIsIG1ib3hfY3RsLAorCQkgICAgIE1CTVNHVkFMSUQgfCBNQk9XTkVSKE1CT1hfT1dORVJfRlcpKTsKKwl0NF9yZWFkX3JlZyhhZGFwdGVyLCBtYm94X2N0bCk7ICAgICAgICAgIC8qIGZsdXNoIHdyaXRlICovCisKKwkvKgorCSAqIFNwaW4gd2FpdGluZyBmb3IgZmlybXdhcmUgdG8gYWNrbm93bGVkZ2UgcHJvY2Vzc2luZyBvdXIgY29tbWFuZC4KKwkgKi8KKwlkZWxheV9pZHggPSAwOworCW1zID0gZGVsYXlbMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpICs9IG1zKSB7CisJCWlmIChzbGVlcF9vaykgeworCQkJbXMgPSBkZWxheVtkZWxheV9pZHhdOworCQkJaWYgKGRlbGF5X2lkeCA8IEFSUkFZX1NJWkUoZGVsYXkpIC0gMSkKKwkJCQlkZWxheV9pZHgrKzsKKwkJCW1zbGVlcChtcyk7CisJCX0gZWxzZQorCQkJbWRlbGF5KG1zKTsKKworCQkvKgorCQkgKiBJZiB3ZSdyZSB0aGUgb3duZXIsIHNlZSBpZiB0aGlzIGlzIHRoZSByZXBseSB3ZSB3YW50ZWQuCisJCSAqLworCQl2ID0gdDRfcmVhZF9yZWcoYWRhcHRlciwgbWJveF9jdGwpOworCQlpZiAoTUJPV05FUl9HRVQodikgPT0gTUJPWF9PV05FUl9EUlYpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgTWVzc2FnZSBWYWxpZCBiaXQgaXNuJ3Qgb24sIHJldm9rZSBvd25lcnNoaXAKKwkJCSAqIG9mIHRoZSBtYWlsYm94IGFuZCBjb250aW51ZSB3YWl0aW5nIGZvciBvdXIgcmVwbHkuCisJCQkgKi8KKwkJCWlmICgodiAmIE1CTVNHVkFMSUQpID09IDApIHsKKwkJCQl0NF93cml0ZV9yZWcoYWRhcHRlciwgbWJveF9jdGwsCisJCQkJCSAgICAgTUJPV05FUihNQk9YX09XTkVSX05PTkUpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdlIG5vdyBoYXZlIG91ciByZXBseS4gIEV4dHJhY3QgdGhlIGNvbW1hbmQgcmV0dXJuCisJCQkgKiB2YWx1ZSwgY29weSB0aGUgcmVwbHkgYmFjayB0byBvdXIgY2FsbGVyJ3MgYnVmZmVyCisJCQkgKiAoaWYgc3BlY2lmaWVkKSBhbmQgcmV2b2tlIG93bmVyc2hpcCBvZiB0aGUgbWFpbGJveC4KKwkJCSAqIFdlIHJldHVybiB0aGUgKG5lZ2F0ZWQpIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJuCisJCQkgKiBjb2RlICh0aGlzIGRlcGVuZHMgb24gRldfU1VDQ0VTUyA9PSAwKS4KKwkJCSAqLworCisJCQkvKiByZXR1cm4gdmFsdWUgaW4gbG93LW9yZGVyIGxpdHRsZS1lbmRpYW4gd29yZCAqLworCQkJdiA9IHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIG1ib3hfZGF0YSk7CisJCQlpZiAoRldfQ01EX1JFVFZBTF9HRVQodikpCisJCQkJZHVtcF9tYm94KGFkYXB0ZXIsICJGVyBFcnJvciIsIG1ib3hfZGF0YSk7CisKKwkJCWlmIChycGwpIHsKKwkJCQkvKiByZXF1ZXN0IGJpdCBpbiBoaWdoLW9yZGVyIEJFIHdvcmQgKi8KKwkJCQlXQVJOX09OKChiZTMyX3RvX2NwdSgqKGNvbnN0IHUzMiAqKWNtZCkKKwkJCQkJICYgRldfQ01EX1JFUVVFU1QpID09IDApOworCQkJCWdldF9tYm94X3JwbChhZGFwdGVyLCBycGwsIHNpemUsIG1ib3hfZGF0YSk7CisJCQkJV0FSTl9PTigoYmUzMl90b19jcHUoKih1MzIgKilycGwpCisJCQkJCSAmIEZXX0NNRF9SRVFVRVNUKSAhPSAwKTsKKwkJCX0KKwkJCXQ0X3dyaXRlX3JlZyhhZGFwdGVyLCBtYm94X2N0bCwKKwkJCQkgICAgIE1CT1dORVIoTUJPWF9PV05FUl9OT05FKSk7CisJCQlyZXR1cm4gLUZXX0NNRF9SRVRWQUxfR0VUKHYpOworCQl9CisJfQorCisJLyoKKwkgKiBXZSB0aW1lZCBvdXQuICBSZXR1cm4gdGhlIGVycm9yIC4uLgorCSAqLworCWR1bXBfbWJveChhZGFwdGVyLCAiRlcgVGltZW91dCIsIG1ib3hfZGF0YSk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICoJaGFzaF9tYWNfYWRkciAtIHJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiBhIE1BQyBhZGRyZXNzCisgKglAYWRkcjogdGhlIDQ4LWJpdCBFdGhlcm5ldCBNQUMgYWRkcmVzcworICoKKyAqCUhhc2hlcyBhIE1BQyBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgaGFzaCBmdW5jdGlvbiB1c2VkIGJ5IGhhcmR3YXJlCisgKglpbmV4YWN0IChoYXNoKSBhZGRyZXNzIG1hdGNoaW5nLgorICovCitzdGF0aWMgaW50IGhhc2hfbWFjX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisJdTMyIGEgPSAoKHUzMilhZGRyWzBdIDw8IDE2KSB8ICgodTMyKWFkZHJbMV0gPDwgOCkgfCBhZGRyWzJdOworCXUzMiBiID0gKCh1MzIpYWRkclszXSA8PCAxNikgfCAoKHUzMilhZGRyWzRdIDw8IDgpIHwgYWRkcls1XTsKKwlhIF49IGI7CisJYSBePSAoYSA+PiAxMik7CisJYSBePSAoYSA+PiA2KTsKKwlyZXR1cm4gYSAmIDB4M2Y7Cit9CisKKy8qKgorICoJaW5pdF9saW5rX2NvbmZpZyAtIGluaXRpYWxpemUgYSBsaW5rJ3MgU1cgc3RhdGUKKyAqCUBsYzogc3RydWN0dXJlIGhvbGRpbmcgdGhlIGxpbmsgc3RhdGUKKyAqCUBjYXBzOiBsaW5rIGNhcGFiaWxpdGllcworICoKKyAqCUluaXRpYWxpemVzIHRoZSBTVyBzdGF0ZSBtYWludGFpbmVkIGZvciBlYWNoIGxpbmssIGluY2x1ZGluZyB0aGUgbGluaydzCisgKgljYXBhYmlsaXRpZXMgYW5kIGRlZmF1bHQgc3BlZWQvZmxvdy1jb250cm9sL2F1dG9uZWdvdGlhdGlvbiBzZXR0aW5ncy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfbGlua19jb25maWcoc3RydWN0IGxpbmtfY29uZmlnICpsYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNhcHMpCit7CisJbGMtPnN1cHBvcnRlZCA9IGNhcHM7CisJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IDA7CisJbGMtPnNwZWVkID0gMDsKKwlsYy0+cmVxdWVzdGVkX2ZjID0gbGMtPmZjID0gUEFVU0VfUlggfCBQQVVTRV9UWDsKKwlpZiAobGMtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSB7CisJCWxjLT5hZHZlcnRpc2luZyA9IGxjLT5zdXBwb3J0ZWQ7CisJCWxjLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfQVVUT05FRzsKKwl9IGVsc2UgeworCQlsYy0+YWR2ZXJ0aXNpbmcgPSAwOworCQlsYy0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwl9Cit9CisKKy8qKgorICoJdDR2Zl9wb3J0X2luaXQgLSBpbml0aWFsaXplIHBvcnQgaGFyZHdhcmUvc29mdHdhcmUgc3RhdGUKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHBpZHg6IHRoZSBhZGFwdGVyIHBvcnQgaW5kZXgKKyAqLworaW50IF9fZGV2aW5pdCB0NHZmX3BvcnRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBpZHgpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIHBpZHgpOworCXN0cnVjdCBmd192aV9jbWQgdmlfY21kLCB2aV9ycGw7CisJc3RydWN0IGZ3X3BvcnRfY21kIHBvcnRfY21kLCBwb3J0X3JwbDsKKwlpbnQgdjsKKwl1MzIgd29yZDsKKworCS8qCisJICogRXhlY3V0ZSBhIFZJIFJlYWQgY29tbWFuZCB0byBnZXQgb3VyIFZpcnR1YWwgSW50ZXJmYWNlIGluZm9ybWF0aW9uCisJICogbGlrZSBNQUMgYWRkcmVzcywgZXRjLgorCSAqLworCW1lbXNldCgmdmlfY21kLCAwLCBzaXplb2YodmlfY21kKSk7CisJdmlfY21kLm9wX3RvX3ZmbiA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19WSV9DTUQpIHwKKwkJCQkgICAgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICAgICBGV19DTURfUkVBRCk7CisJdmlfY21kLmFsbG9jX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYodmlfY21kKSk7CisJdmlfY21kLnR5cGVfdmlpZCA9IGNwdV90b19iZTE2KEZXX1ZJX0NNRF9WSUlEKHBpLT52aWlkKSk7CisJdiA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmdmlfY21kLCBzaXplb2YodmlfY21kKSwgJnZpX3JwbCk7CisJaWYgKHYpCisJCXJldHVybiB2OworCisJQlVHX09OKHBpLT5wb3J0X2lkICE9IEZXX1ZJX0NNRF9QT1JUSURfR0VUKHZpX3JwbC5wb3J0aWRfcGtkKSk7CisJcGktPnJzc19zaXplID0gRldfVklfQ01EX1JTU1NJWkVfR0VUKGJlMTZfdG9fY3B1KHZpX3JwbC5yc3NzaXplX3BrZCkpOworCXQ0X29zX3NldF9od19hZGRyKGFkYXB0ZXIsIHBpZHgsIHZpX3JwbC5tYWMpOworCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIHJlYWQgYWNjZXNzIHRvIG91ciBwb3J0IGluZm9ybWF0aW9uLCB3ZSdyZSBkb25lCisJICogbm93LiAgT3RoZXJ3aXNlLCBleGVjdXRlIGEgUE9SVCBSZWFkIGNvbW1hbmQgdG8gZ2V0IGl0IC4uLgorCSAqLworCWlmICghKGFkYXB0ZXItPnBhcmFtcy52ZnJlcy5yX2NhcHMgJiBGV19DTURfQ0FQX1BPUlQpKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmcG9ydF9jbWQsIDAsIHNpemVvZihwb3J0X2NtZCkpOworCXBvcnRfY21kLm9wX3RvX3BvcnRpZCA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19QT1JUX0NNRCkgfAorCQkJCQkgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCQkgICAgRldfQ01EX1JFQUQgfAorCQkJCQkgICAgRldfUE9SVF9DTURfUE9SVElEKHBpLT5wb3J0X2lkKSk7CisJcG9ydF9jbWQuYWN0aW9uX3RvX2xlbjE2ID0KKwkJY3B1X3RvX2JlMzIoRldfUE9SVF9DTURfQUNUSU9OKEZXX1BPUlRfQUNUSU9OX0dFVF9QT1JUX0lORk8pIHwKKwkJCSAgICBGV19MRU4xNihwb3J0X2NtZCkpOworCXYgPSB0NHZmX3dyX21ib3goYWRhcHRlciwgJnBvcnRfY21kLCBzaXplb2YocG9ydF9jbWQpLCAmcG9ydF9ycGwpOworCWlmICh2KQorCQlyZXR1cm4gdjsKKworCXYgPSAwOworCXdvcmQgPSBiZTE2X3RvX2NwdShwb3J0X3JwbC51LmluZm8ucGNhcCk7CisJaWYgKHdvcmQgJiBGV19QT1JUX0NBUF9TUEVFRF8xMDBNKQorCQl2IHw9IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOworCWlmICh3b3JkICYgRldfUE9SVF9DQVBfU1BFRURfMUcpCisJCXYgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCWlmICh3b3JkICYgRldfUE9SVF9DQVBfU1BFRURfMTBHKQorCQl2IHw9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7CisJaWYgKHdvcmQgJiBGV19QT1JUX0NBUF9BTkVHKQorCQl2IHw9IFNVUFBPUlRFRF9BdXRvbmVnOworCWluaXRfbGlua19jb25maWcoJnBpLT5saW5rX2NmZywgdik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0NHZmX3F1ZXJ5X3BhcmFtcyAtIHF1ZXJ5IEZXIG9yIGRldmljZSBwYXJhbWV0ZXJzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBucGFyYW1zOiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqCUBwYXJhbXM6IHRoZSBwYXJhbWV0ZXIgbmFtZXMKKyAqCUB2YWxzOiB0aGUgcGFyYW1ldGVyIHZhbHVlcworICoKKyAqCVJlYWRzIHRoZSB2YWx1ZXMgb2YgZmlybXdhcmUgb3IgZGV2aWNlIHBhcmFtZXRlcnMuICBVcCB0byA3IHBhcmFtZXRlcnMKKyAqCWNhbiBiZSBxdWVyaWVkIGF0IG9uY2UuCisgKi8KK2ludCB0NHZmX3F1ZXJ5X3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IG5wYXJhbXMsCisJCSAgICAgIGNvbnN0IHUzMiAqcGFyYW1zLCB1MzIgKnZhbHMpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgZndfcGFyYW1zX2NtZCBjbWQsIHJwbDsKKwlzdHJ1Y3QgZndfcGFyYW1zX3BhcmFtICpwOworCXNpemVfdCBsZW4xNjsKKworCWlmIChucGFyYW1zID4gNykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192Zm4gPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfUEFSQU1TX0NNRCkgfAorCQkJCSAgICBGV19DTURfUkVRVUVTVCB8CisJCQkJICAgIEZXX0NNRF9SRUFEKTsKKwlsZW4xNiA9IERJVl9ST1VORF9VUChvZmZzZXRvZihzdHJ1Y3QgZndfcGFyYW1zX2NtZCwKKwkJCQkgICAgICBwYXJhbVtucGFyYW1zXS5tbmVtKSwgMTYpOworCWNtZC5yZXR2YWxfbGVuMTYgPSBjcHVfdG9fYmUzMihGV19DTURfTEVOMTYobGVuMTYpKTsKKwlmb3IgKGkgPSAwLCBwID0gJmNtZC5wYXJhbVswXTsgaSA8IG5wYXJhbXM7IGkrKywgcCsrKQorCQlwLT5tbmVtID0gaHRvbmwoKnBhcmFtcysrKTsKKworCXJldCA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCk7CisJaWYgKHJldCA9PSAwKQorCQlmb3IgKGkgPSAwLCBwID0gJnJwbC5wYXJhbVswXTsgaSA8IG5wYXJhbXM7IGkrKywgcCsrKQorCQkJKnZhbHMrKyA9IGJlMzJfdG9fY3B1KHAtPnZhbCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl0NHZmX3NldF9wYXJhbXMgLSBzZXRzIEZXIG9yIGRldmljZSBwYXJhbWV0ZXJzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBucGFyYW1zOiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqCUBwYXJhbXM6IHRoZSBwYXJhbWV0ZXIgbmFtZXMKKyAqCUB2YWxzOiB0aGUgcGFyYW1ldGVyIHZhbHVlcworICoKKyAqCVNldHMgdGhlIHZhbHVlcyBvZiBmaXJtd2FyZSBvciBkZXZpY2UgcGFyYW1ldGVycy4gIFVwIHRvIDcgcGFyYW1ldGVycworICoJY2FuIGJlIHNwZWNpZmllZCBhdCBvbmNlLgorICovCitpbnQgdDR2Zl9zZXRfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgbnBhcmFtcywKKwkJICAgIGNvbnN0IHUzMiAqcGFyYW1zLCBjb25zdCB1MzIgKnZhbHMpCit7CisJaW50IGk7CisJc3RydWN0IGZ3X3BhcmFtc19jbWQgY21kOworCXN0cnVjdCBmd19wYXJhbXNfcGFyYW0gKnA7CisJc2l6ZV90IGxlbjE2OworCisJaWYgKG5wYXJhbXMgPiA3KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZmbiA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19QQVJBTVNfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgRldfQ01EX1dSSVRFKTsKKwlsZW4xNiA9IERJVl9ST1VORF9VUChvZmZzZXRvZihzdHJ1Y3QgZndfcGFyYW1zX2NtZCwKKwkJCQkgICAgICBwYXJhbVtucGFyYW1zXSksIDE2KTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfQ01EX0xFTjE2KGxlbjE2KSk7CisJZm9yIChpID0gMCwgcCA9ICZjbWQucGFyYW1bMF07IGkgPCBucGFyYW1zOyBpKyssIHArKykgeworCQlwLT5tbmVtID0gY3B1X3RvX2JlMzIoKnBhcmFtcysrKTsKKwkJcC0+dmFsID0gY3B1X3RvX2JlMzIoKnZhbHMrKyk7CisJfQorCisJcmV0dXJuIHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgTlVMTCk7Cit9CisKKy8qKgorICoJdDR2Zl9nZXRfc2dlX3BhcmFtcyAtIHJldHJpZXZlIGFkYXB0ZXIgU2NhdHRlciBnYXRoZXIgRW5naW5lIHBhcmFtZXRlcnMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVJldHJpZXZlcyB2YXJpb3VzIGNvcmUgU0dFIHBhcmFtZXRlcnMgaW4gdGhlIGZvcm0gb2YgaGFyZHdhcmUgU0dFCisgKglyZWdpc3RlciB2YWx1ZXMuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNvZGluZyB0aGVzZSBhcworICoJbmVlZGVkLiAgVGhlIFNHRSBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gQGFkYXB0ZXItPnBhcmFtcy5zZ2UuCisgKi8KK2ludCB0NHZmX2dldF9zZ2VfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzZ2VfcGFyYW1zICpzZ2VfcGFyYW1zID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2U7CisJdTMyIHBhcmFtc1s3XSwgdmFsc1s3XTsKKwlpbnQgdjsKKworCXBhcmFtc1swXSA9IChGV19QQVJBTVNfTU5FTShGV19QQVJBTVNfTU5FTV9SRUcpIHwKKwkJICAgICBGV19QQVJBTVNfUEFSQU1fWFlaKFNHRV9DT05UUk9MKSk7CisJcGFyYW1zWzFdID0gKEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX1JFRykgfAorCQkgICAgIEZXX1BBUkFNU19QQVJBTV9YWVooU0dFX0hPU1RfUEFHRV9TSVpFKSk7CisJcGFyYW1zWzJdID0gKEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX1JFRykgfAorCQkgICAgIEZXX1BBUkFNU19QQVJBTV9YWVooU0dFX0ZMX0JVRkZFUl9TSVpFMCkpOworCXBhcmFtc1szXSA9IChGV19QQVJBTVNfTU5FTShGV19QQVJBTVNfTU5FTV9SRUcpIHwKKwkJICAgICBGV19QQVJBTVNfUEFSQU1fWFlaKFNHRV9GTF9CVUZGRVJfU0laRTEpKTsKKwlwYXJhbXNbNF0gPSAoRldfUEFSQU1TX01ORU0oRldfUEFSQU1TX01ORU1fUkVHKSB8CisJCSAgICAgRldfUEFSQU1TX1BBUkFNX1hZWihTR0VfVElNRVJfVkFMVUVfMF9BTkRfMSkpOworCXBhcmFtc1s1XSA9IChGV19QQVJBTVNfTU5FTShGV19QQVJBTVNfTU5FTV9SRUcpIHwKKwkJICAgICBGV19QQVJBTVNfUEFSQU1fWFlaKFNHRV9USU1FUl9WQUxVRV8yX0FORF8zKSk7CisJcGFyYW1zWzZdID0gKEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX1JFRykgfAorCQkgICAgIEZXX1BBUkFNU19QQVJBTV9YWVooU0dFX1RJTUVSX1ZBTFVFXzRfQU5EXzUpKTsKKwl2ID0gdDR2Zl9xdWVyeV9wYXJhbXMoYWRhcHRlciwgNywgcGFyYW1zLCB2YWxzKTsKKwlpZiAodikKKwkJcmV0dXJuIHY7CisJc2dlX3BhcmFtcy0+c2dlX2NvbnRyb2wgPSB2YWxzWzBdOworCXNnZV9wYXJhbXMtPnNnZV9ob3N0X3BhZ2Vfc2l6ZSA9IHZhbHNbMV07CisJc2dlX3BhcmFtcy0+c2dlX2ZsX2J1ZmZlcl9zaXplWzBdID0gdmFsc1syXTsKKwlzZ2VfcGFyYW1zLT5zZ2VfZmxfYnVmZmVyX3NpemVbMV0gPSB2YWxzWzNdOworCXNnZV9wYXJhbXMtPnNnZV90aW1lcl92YWx1ZV8wX2FuZF8xID0gdmFsc1s0XTsKKwlzZ2VfcGFyYW1zLT5zZ2VfdGltZXJfdmFsdWVfMl9hbmRfMyA9IHZhbHNbNV07CisJc2dlX3BhcmFtcy0+c2dlX3RpbWVyX3ZhbHVlXzRfYW5kXzUgPSB2YWxzWzZdOworCisJcGFyYW1zWzBdID0gKEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX1JFRykgfAorCQkgICAgIEZXX1BBUkFNU19QQVJBTV9YWVooU0dFX0lOR1JFU1NfUlhfVEhSRVNIT0xEKSk7CisJdiA9IHQ0dmZfcXVlcnlfcGFyYW1zKGFkYXB0ZXIsIDEsIHBhcmFtcywgdmFscyk7CisJaWYgKHYpCisJCXJldHVybiB2OworCXNnZV9wYXJhbXMtPnNnZV9pbmdyZXNzX3J4X3RocmVzaG9sZCA9IHZhbHNbMF07CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0NHZmX2dldF92cGRfcGFyYW1zIC0gcmV0cmlldmUgZGV2aWNlIFZQRCBwYXJlbWV0ZXJzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCisgKglSZXRyaXZlcyB2YXJpb3VzIGRldmljZSBWaXRhbCBQcm9kdWN0IERhdGEgcGFyYW1ldGVycy4gIFRoZSBwYXJhbWV0ZXJzCisgKglhcmUgc3RvcmVkIGluIEBhZGFwdGVyLT5wYXJhbXMudnBkLgorICovCitpbnQgdDR2Zl9nZXRfdnBkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgdnBkX3BhcmFtcyAqdnBkX3BhcmFtcyA9ICZhZGFwdGVyLT5wYXJhbXMudnBkOworCXUzMiBwYXJhbXNbN10sIHZhbHNbN107CisJaW50IHY7CisKKwlwYXJhbXNbMF0gPSAoRldfUEFSQU1TX01ORU0oRldfUEFSQU1TX01ORU1fREVWKSB8CisJCSAgICAgRldfUEFSQU1TX1BBUkFNX1goRldfUEFSQU1TX1BBUkFNX0RFVl9DQ0xLKSk7CisJdiA9IHQ0dmZfcXVlcnlfcGFyYW1zKGFkYXB0ZXIsIDEsIHBhcmFtcywgdmFscyk7CisJaWYgKHYpCisJCXJldHVybiB2OworCXZwZF9wYXJhbXMtPmNjbGsgPSB2YWxzWzBdOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdDR2Zl9nZXRfZGV2X3BhcmFtcyAtIHJldHJpZXZlIGRldmljZSBwYXJlbWV0ZXJzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCisgKglSZXRyaXZlcyB2YXJpb3VzIGRldmljZSBwYXJhbWV0ZXJzLiAgVGhlIHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbgorICoJQGFkYXB0ZXItPnBhcmFtcy5kZXYuCisgKi8KK2ludCB0NHZmX2dldF9kZXZfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBkZXZfcGFyYW1zICpkZXZfcGFyYW1zID0gJmFkYXB0ZXItPnBhcmFtcy5kZXY7CisJdTMyIHBhcmFtc1s3XSwgdmFsc1s3XTsKKwlpbnQgdjsKKworCXBhcmFtc1swXSA9IChGV19QQVJBTVNfTU5FTShGV19QQVJBTVNfTU5FTV9ERVYpIHwKKwkJICAgICBGV19QQVJBTVNfUEFSQU1fWChGV19QQVJBTVNfUEFSQU1fREVWX0ZXUkVWKSk7CisJcGFyYW1zWzFdID0gKEZXX1BBUkFNU19NTkVNKEZXX1BBUkFNU19NTkVNX0RFVikgfAorCQkgICAgIEZXX1BBUkFNU19QQVJBTV9YKEZXX1BBUkFNU19QQVJBTV9ERVZfVFBSRVYpKTsKKwl2ID0gdDR2Zl9xdWVyeV9wYXJhbXMoYWRhcHRlciwgMiwgcGFyYW1zLCB2YWxzKTsKKwlpZiAodikKKwkJcmV0dXJuIHY7CisJZGV2X3BhcmFtcy0+ZndyZXYgPSB2YWxzWzBdOworCWRldl9wYXJhbXMtPnRwcmV2ID0gdmFsc1sxXTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXQ0dmZfZ2V0X3Jzc19nbGJfY29uZmlnIC0gcmV0cmlldmUgYWRhcHRlciBSU1MgR2xvYmFsIENvbmZpZ3VyYXRpb24KKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVJldHJpZXZlcyBnbG9iYWwgUlNTIG1vZGUgYW5kIHBhcmFtZXRlcnMgd2l0aCB3aGljaCB3ZSBoYXZlIHRvIGxpdmUKKyAqCWFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgQGFkYXB0ZXIncyBSU1MgcGFyYW1ldGVycy4KKyAqLworaW50IHQ0dmZfZ2V0X3Jzc19nbGJfY29uZmlnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCByc3NfcGFyYW1zICpyc3MgPSAmYWRhcHRlci0+cGFyYW1zLnJzczsKKwlzdHJ1Y3QgZndfcnNzX2dsYl9jb25maWdfY21kIGNtZCwgcnBsOworCWludCB2OworCisJLyoKKwkgKiBFeGVjdXRlIGFuIFJTUyBHbG9iYWwgQ29uZmlndXJhdGlvbiByZWFkIGNvbW1hbmQgdG8gcmV0cmlldmUKKwkgKiBvdXIgUlNTIGNvbmZpZ3VyYXRpb24uCisJICovCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fd3JpdGUgPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfUlNTX0dMQl9DT05GSUdfQ01EKSB8CisJCQkJICAgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICAgIEZXX0NNRF9SRUFEKTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYoY21kKSk7CisJdiA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCk7CisJaWYgKHYpCisJCXJldHVybiB2OworCisJLyoKKwkgKiBUcmFuc2F0ZSB0aGUgYmlnLWVuZGlhbiBSU1MgR2xvYmFsIENvbmZpZ3VyYXRpb24gaW50byBvdXIKKwkgKiBjcHUtZW5kaWFuIGZvcm1hdCBiYXNlZCBvbiB0aGUgUlNTIG1vZGUuICBXZSBhbHNvIGRvIGZpcnN0IGxldmVsCisJICogZmlsdGVyaW5nIGF0IHRoaXMgcG9pbnQgdG8gd2VlZCBvdXQgbW9kZXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydAorCSAqIFZGIERyaXZlcnMgLi4uCisJICovCisJcnNzLT5tb2RlID0gRldfUlNTX0dMQl9DT05GSUdfQ01EX01PREVfR0VUKAorCQkJYmUzMl90b19jcHUocnBsLnUubWFudWFsLm1vZGVfcGtkKSk7CisJc3dpdGNoIChyc3MtPm1vZGUpIHsKKwljYXNlIEZXX1JTU19HTEJfQ09ORklHX0NNRF9NT0RFX0JBU0lDVklSVFVBTDogeworCQl1MzIgd29yZCA9IGJlMzJfdG9fY3B1KAorCQkJCXJwbC51LmJhc2ljdmlydHVhbC5zeW5tYXBlbl90b19oYXNodG9lcGxpdHopOworCisJCXJzcy0+dS5iYXNpY3ZpcnR1YWwuc3lubWFwZW4gPQorCQkJKCh3b3JkICYgRldfUlNTX0dMQl9DT05GSUdfQ01EX1NZTk1BUEVOKSAhPSAwKTsKKwkJcnNzLT51LmJhc2ljdmlydHVhbC5zeW40dHVwZW5pcHY2ID0KKwkJCSgod29yZCAmIEZXX1JTU19HTEJfQ09ORklHX0NNRF9TWU40VFVQRU5JUFY2KSAhPSAwKTsKKwkJcnNzLT51LmJhc2ljdmlydHVhbC5zeW4ydHVwZW5pcHY2ID0KKwkJCSgod29yZCAmIEZXX1JTU19HTEJfQ09ORklHX0NNRF9TWU4yVFVQRU5JUFY2KSAhPSAwKTsKKwkJcnNzLT51LmJhc2ljdmlydHVhbC5zeW40dHVwZW5pcHY0ID0KKwkJCSgod29yZCAmIEZXX1JTU19HTEJfQ09ORklHX0NNRF9TWU40VFVQRU5JUFY0KSAhPSAwKTsKKwkJcnNzLT51LmJhc2ljdmlydHVhbC5zeW4ydHVwZW5pcHY0ID0KKwkJCSgod29yZCAmIEZXX1JTU19HTEJfQ09ORklHX0NNRF9TWU4yVFVQRU5JUFY0KSAhPSAwKTsKKworCQlyc3MtPnUuYmFzaWN2aXJ0dWFsLm9mZG1hcGVuID0KKwkJCSgod29yZCAmIEZXX1JTU19HTEJfQ09ORklHX0NNRF9PRkRNQVBFTikgIT0gMCk7CisKKwkJcnNzLT51LmJhc2ljdmlydHVhbC50bmxtYXBlbiA9CisJCQkoKHdvcmQgJiBGV19SU1NfR0xCX0NPTkZJR19DTURfVE5MTUFQRU4pICE9IDApOworCQlyc3MtPnUuYmFzaWN2aXJ0dWFsLnRubGFsbGxvb2t1cCA9CisJCQkoKHdvcmQgICYgRldfUlNTX0dMQl9DT05GSUdfQ01EX1ROTEFMTExLUCkgIT0gMCk7CisKKwkJcnNzLT51LmJhc2ljdmlydHVhbC5oYXNodG9lcGxpdHogPQorCQkJKCh3b3JkICYgRldfUlNTX0dMQl9DT05GSUdfQ01EX0hBU0hUT0VQTElUWikgIT0gMCk7CisKKwkJLyogd2UgbmVlZCBhdCBsZWFzdCBUdW5uZWwgTWFwIEVuYWJsZSB0byBiZSBzZXQgKi8KKwkJaWYgKCFyc3MtPnUuYmFzaWN2aXJ0dWFsLnRubG1hcGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCS8qIGFsbCB1bmtub3duL3Vuc3VwcG9ydGVkIFJTUyBtb2RlcyByZXN1bHQgaW4gYW4gZXJyb3IgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdDR2Zl9nZXRfdmZyZXMgLSByZXRyaWV2ZSBWRiByZXNvdXJjZSBsaW1pdHMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVJldHJpZXZlcyBjb25maWd1cmVkIHJlc291cmNlIGxpbWl0cyBhbmQgY2FwYWJpbGl0aWVzIGZvciBhIHZpcnR1YWwKKyAqCWZ1bmN0aW9uLiAgVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBAYWRhcHRlci0+dmZyZXMuCisgKi8KK2ludCB0NHZmX2dldF92ZnJlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgdmZfcmVzb3VyY2VzICp2ZnJlcyA9ICZhZGFwdGVyLT5wYXJhbXMudmZyZXM7CisJc3RydWN0IGZ3X3BmdmZfY21kIGNtZCwgcnBsOworCWludCB2OworCXUzMiB3b3JkOworCisJLyoKKwkgKiBFeGVjdXRlIFBGVkYgUmVhZCBjb21tYW5kIHRvIGdldCBWRiByZXNvdXJjZSBsaW1pdHM7IGJhaWwgb3V0IGVhcmx5CisJICogd2l0aCBlcnJvciBvbiBjb21tYW5kIGZhaWx1cmUuCisJICovCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fdmZuID0gY3B1X3RvX2JlMzIoRldfQ01EX09QKEZXX1BGVkZfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgRldfQ01EX1JFQUQpOworCWNtZC5yZXR2YWxfbGVuMTYgPSBjcHVfdG9fYmUzMihGV19MRU4xNihjbWQpKTsKKwl2ID0gdDR2Zl93cl9tYm94KGFkYXB0ZXIsICZjbWQsIHNpemVvZihjbWQpLCAmcnBsKTsKKwlpZiAodikKKwkJcmV0dXJuIHY7CisKKwkvKgorCSAqIEV4dHJhY3QgVkYgcmVzb3VyY2UgbGltaXRzIGFuZCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwl3b3JkID0gYmUzMl90b19jcHUocnBsLm5pcWZsaW50X25pcSk7CisJdmZyZXMtPm5pcWZsaW50ID0gRldfUEZWRl9DTURfTklRRkxJTlRfR0VUKHdvcmQpOworCXZmcmVzLT5uaXEgPSBGV19QRlZGX0NNRF9OSVFfR0VUKHdvcmQpOworCisJd29yZCA9IGJlMzJfdG9fY3B1KHJwbC50eXBlX3RvX25lcSk7CisJdmZyZXMtPm5lcSA9IEZXX1BGVkZfQ01EX05FUV9HRVQod29yZCk7CisJdmZyZXMtPnBtYXNrID0gRldfUEZWRl9DTURfUE1BU0tfR0VUKHdvcmQpOworCisJd29yZCA9IGJlMzJfdG9fY3B1KHJwbC50Y190b19uZXhhY3RmKTsKKwl2ZnJlcy0+dGMgPSBGV19QRlZGX0NNRF9UQ19HRVQod29yZCk7CisJdmZyZXMtPm52aSA9IEZXX1BGVkZfQ01EX05WSV9HRVQod29yZCk7CisJdmZyZXMtPm5leGFjdGYgPSBGV19QRlZGX0NNRF9ORVhBQ1RGX0dFVCh3b3JkKTsKKworCXdvcmQgPSBiZTMyX3RvX2NwdShycGwucl9jYXBzX3RvX25ldGhjdHJsKTsKKwl2ZnJlcy0+cl9jYXBzID0gRldfUEZWRl9DTURfUl9DQVBTX0dFVCh3b3JkKTsKKwl2ZnJlcy0+d3hfY2FwcyA9IEZXX1BGVkZfQ01EX1dYX0NBUFNfR0VUKHdvcmQpOworCXZmcmVzLT5uZXRoY3RybCA9IEZXX1BGVkZfQ01EX05FVEhDVFJMX0dFVCh3b3JkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXQ0dmZfcmVhZF9yc3NfdmlfY29uZmlnIC0gcmVhZCBhIFZJJ3MgUlNTIGNvbmZpZ3VyYXRpb24KKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHZpaWQ6IFZpcnR1YWwgSW50ZXJmYWNlIElECisgKglAY29uZmlnOiBwb2ludGVyIHRvIGhvc3QtbmF0aXZlIFZJIFJTUyBDb25maWd1cmF0aW9uIGJ1ZmZlcgorICoKKyAqCVJlYWRzIHRoZSBWaXJ0dWFsIEludGVyZmFjZSdzIFJTUyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZAorICoJdHJhbnNsYXRlcyBpdCBpbnRvIENQVS1uYXRpdmUgZm9ybWF0LgorICovCitpbnQgdDR2Zl9yZWFkX3Jzc192aV9jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCB2aWlkLAorCQkJICAgIHVuaW9uIHJzc192aV9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgZndfcnNzX3ZpX2NvbmZpZ19jbWQgY21kLCBycGw7CisJaW50IHY7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192aWlkID0gY3B1X3RvX2JlMzIoRldfQ01EX09QKEZXX1JTU19WSV9DT05GSUdfQ01EKSB8CisJCQkJICAgICBGV19DTURfUkVRVUVTVCB8CisJCQkJICAgICBGV19DTURfUkVBRCB8CisJCQkJICAgICBGV19SU1NfVklfQ09ORklHX0NNRF9WSUlEKHZpaWQpKTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYoY21kKSk7CisJdiA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCk7CisJaWYgKHYpCisJCXJldHVybiB2OworCisJc3dpdGNoIChhZGFwdGVyLT5wYXJhbXMucnNzLm1vZGUpIHsKKwljYXNlIEZXX1JTU19HTEJfQ09ORklHX0NNRF9NT0RFX0JBU0lDVklSVFVBTDogeworCQl1MzIgd29yZCA9IGJlMzJfdG9fY3B1KHJwbC51LmJhc2ljdmlydHVhbC5kZWZhdWx0cV90b191ZHBlbik7CisKKwkJY29uZmlnLT5iYXNpY3ZpcnR1YWwuaXA2Zm91cnR1cGVuID0KKwkJCSgod29yZCAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNkZPVVJUVVBFTikgIT0gMCk7CisJCWNvbmZpZy0+YmFzaWN2aXJ0dWFsLmlwNnR3b3R1cGVuID0KKwkJCSgod29yZCAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNlRXT1RVUEVOKSAhPSAwKTsKKwkJY29uZmlnLT5iYXNpY3ZpcnR1YWwuaXA0Zm91cnR1cGVuID0KKwkJCSgod29yZCAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNEZPVVJUVVBFTikgIT0gMCk7CisJCWNvbmZpZy0+YmFzaWN2aXJ0dWFsLmlwNHR3b3R1cGVuID0KKwkJCSgod29yZCAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNFRXT1RVUEVOKSAhPSAwKTsKKwkJY29uZmlnLT5iYXNpY3ZpcnR1YWwudWRwZW4gPQorCQkJKCh3b3JkICYgRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU4pICE9IDApOworCQljb25maWctPmJhc2ljdmlydHVhbC5kZWZhdWx0cSA9CisJCQlGV19SU1NfVklfQ09ORklHX0NNRF9ERUZBVUxUUV9HRVQod29yZCk7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCXQ0dmZfd3JpdGVfcnNzX3ZpX2NvbmZpZyAtIHdyaXRlIGEgVkkncyBSU1MgY29uZmlndXJhdGlvbgorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAdmlpZDogVmlydHVhbCBJbnRlcmZhY2UgSUQKKyAqCUBjb25maWc6IHBvaW50ZXIgdG8gaG9zdC1uYXRpdmUgVkkgUlNTIENvbmZpZ3VyYXRpb24gYnVmZmVyCisgKgorICoJV3JpdGUgdGhlIFZpcnR1YWwgSW50ZXJmYWNlJ3MgUlNTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqCSh0cmFuc2xhdGluZyBpdCBpbnRvIGZpcm13YXJlLW5hdGl2ZSBmb3JtYXQgYmVmb3JlIHdyaXRpbmcpLgorICovCitpbnQgdDR2Zl93cml0ZV9yc3NfdmlfY29uZmlnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgdmlpZCwKKwkJCSAgICAgdW5pb24gcnNzX3ZpX2NvbmZpZyAqY29uZmlnKQoreworCXN0cnVjdCBmd19yc3NfdmlfY29uZmlnX2NtZCBjbWQsIHJwbDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZpaWQgPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfUlNTX1ZJX0NPTkZJR19DTUQpIHwKKwkJCQkgICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgIEZXX0NNRF9XUklURSB8CisJCQkJICAgICBGV19SU1NfVklfQ09ORklHX0NNRF9WSUlEKHZpaWQpKTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYoY21kKSk7CisJc3dpdGNoIChhZGFwdGVyLT5wYXJhbXMucnNzLm1vZGUpIHsKKwljYXNlIEZXX1JTU19HTEJfQ09ORklHX0NNRF9NT0RFX0JBU0lDVklSVFVBTDogeworCQl1MzIgd29yZCA9IDA7CisKKwkJaWYgKGNvbmZpZy0+YmFzaWN2aXJ0dWFsLmlwNmZvdXJ0dXBlbikKKwkJCXdvcmQgfD0gRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2Rk9VUlRVUEVOOworCQlpZiAoY29uZmlnLT5iYXNpY3ZpcnR1YWwuaXA2dHdvdHVwZW4pCisJCQl3b3JkIHw9IEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNlRXT1RVUEVOOworCQlpZiAoY29uZmlnLT5iYXNpY3ZpcnR1YWwuaXA0Zm91cnR1cGVuKQorCQkJd29yZCB8PSBGV19SU1NfVklfQ09ORklHX0NNRF9JUDRGT1VSVFVQRU47CisJCWlmIChjb25maWctPmJhc2ljdmlydHVhbC5pcDR0d290dXBlbikKKwkJCXdvcmQgfD0gRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0VFdPVFVQRU47CisJCWlmIChjb25maWctPmJhc2ljdmlydHVhbC51ZHBlbikKKwkJCXdvcmQgfD0gRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU47CisJCXdvcmQgfD0gRldfUlNTX1ZJX0NPTkZJR19DTURfREVGQVVMVFEoCisJCQkJY29uZmlnLT5iYXNpY3ZpcnR1YWwuZGVmYXVsdHEpOworCQljbWQudS5iYXNpY3ZpcnR1YWwuZGVmYXVsdHFfdG9fdWRwZW4gPSBjcHVfdG9fYmUzMih3b3JkKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCk7Cit9CisKKy8qKgorICoJdDR2Zl9jb25maWdfcnNzX3JhbmdlIC0gY29uZmlndXJlIGEgcG9ydGlvbiBvZiB0aGUgUlNTIG1hcHBpbmcgdGFibGUKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHZpaWQ6IFZpcnR1YWwgSW50ZXJmYWNlIG9mIFJTUyBUYWJsZSBTbGljZQorICoJQHN0YXJ0OiBzdGFydGluZyBlbnRyeSBpbiB0aGUgdGFibGUgdG8gd3JpdGUKKyAqCUBuOiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIHRvIHdyaXRlCisgKglAcnNwcTogdmFsdWVzIGZvciB0aGUgIlJlc3BvbnNlIFF1ZXVlIiAoSW5ncmVzcyBRdWV1ZSkgbG9va3VwIHRhYmxlCisgKglAbnJzcHE6IG51bWJlciBvZiB2YWx1ZXMgaW4gQHJzcHEKKyAqCisgKglQcm9ncmFtcyB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgVkkncyBSU1MgbWFwcGluZyB0YWJsZSB3aXRoIHRoZQorICoJcHJvdmlkZWQgdmFsdWVzLiAgSWYgQG5yc3BxIDwgQG4gdGhlIHN1cHBsaWVkIHZhbHVlcyBhcmUgdXNlZCByZXBlYXRlZGx5CisgKgl1bnRpbCB0aGUgZnVsbCB0YWJsZSByYW5nZSBpcyBwb3B1bGF0ZWQuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGUgdmFsdWVzIGluIEByc3BxIGFyZSBpbiB0aGUgcmFuZ2UgMC4uMTAyMy4KKyAqLworaW50IHQ0dmZfY29uZmlnX3Jzc19yYW5nZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHZpaWQsCisJCQkgIGludCBzdGFydCwgaW50IG4sIGNvbnN0IHUxNiAqcnNwcSwgaW50IG5yc3BxKQoreworCWNvbnN0IHUxNiAqcnNwID0gcnNwcTsKKwljb25zdCB1MTYgKnJzcF9lbmQgPSByc3BxK25yc3BxOworCXN0cnVjdCBmd19yc3NfaW5kX3RibF9jbWQgY21kOworCisJLyoKKwkgKiBJbml0aWFsaXplIGZpcm13YXJlIGNvbW1hbmQgdGVtcGxhdGUgdG8gd3JpdGUgdGhlIFJTUyB0YWJsZS4KKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192aWlkID0gY3B1X3RvX2JlMzIoRldfQ01EX09QKEZXX1JTU19JTkRfVEJMX0NNRCkgfAorCQkJCSAgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICAgRldfQ01EX1dSSVRFIHwKKwkJCQkgICAgIEZXX1JTU19JTkRfVEJMX0NNRF9WSUlEKHZpaWQpKTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYoY21kKSk7CisKKwkvKgorCSAqIEVhY2ggZmlybXdhcmUgUlNTIGNvbW1hbmQgY2FuIGFjY29tbW9kYXRlIHVwIHRvIDMyIFJTUyBJbmdyZXNzCisJICogUXVldWUgSWRlbnRpZmllcnMuICBUaGVzZSBJbmdyZXNzIFF1ZXVlIElEcyBhcmUgcGFja2VkIHRocmVlIHRvCisJICogYSAzMi1iaXQgd29yZCBhcyAxMC1iaXQgdmFsdWVzIHdpdGggdGhlIHVwcGVyIHJlbWFpbmluZyAyIGJpdHMKKwkgKiByZXNlcnZlZC4KKwkgKi8KKwl3aGlsZSAobiA+IDApIHsKKwkJX19iZTMyICpxcCA9ICZjbWQuaXEwX3RvX2lxMjsKKwkJaW50IG5xID0gbWluKG4sIDMyKTsKKwkJaW50IHJldDsKKworCQkvKgorCQkgKiBTZXQgdXAgdGhlIGZpcm13YXJlIFJTUyBjb21tYW5kIGhlYWRlciB0byBzZW5kIHRoZSBuZXh0CisJCSAqICJucSIgSW5ncmVzcyBRdWV1ZSBJRHMgdG8gdGhlIGZpcm13YXJlLgorCQkgKi8KKwkJY21kLm5pcWlkID0gY3B1X3RvX2JlMTYobnEpOworCQljbWQuc3RhcnRpZHggPSBjcHVfdG9fYmUxNihzdGFydCk7CisKKwkJLyoKKwkJICogIm5xIiBtb3JlIGRvbmUgZm9yIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsb29wLgorCQkgKi8KKwkJc3RhcnQgKz0gbnE7CisJCW4gLT0gbnE7CisKKwkJLyoKKwkJICogV2hpbGUgdGhlcmUgYXJlIHN0aWxsIEluZ3Jlc3MgUXVldWUgSURzIHRvIHN0dWZmIGludG8gdGhlCisJCSAqIGN1cnJlbnQgZmlybXdhcmUgUlNTIGNvbW1hbmQsIHJldHJpZXZlIHRoZW0gZnJvbSB0aGUKKwkJICogSW5ncmVzcyBRdWV1ZSBJRCBhcnJheSBhbmQgaW5zZXJ0IHRoZW0gaW50byB0aGUgY29tbWFuZC4KKwkJICovCisJCXdoaWxlIChucSA+IDApIHsKKwkJCS8qCisJCQkgKiBHcmFiIHVwIHRvIHRoZSBuZXh0IDMgSW5ncmVzcyBRdWV1ZSBJRHMgKHdyYXBwaW5nCisJCQkgKiBhcm91bmQgdGhlIEluZ3Jlc3MgUXVldWUgSUQgYXJyYXkgaWYgbmVjZXNzYXJ5KSBhbmQKKwkJCSAqIGluc2VydCB0aGVtIGludG8gdGhlIGZpcm13YXJlIFJTUyBjb21tYW5kIGF0IHRoZQorCQkJICogY3VycmVudCAzLXR1cGxlIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29tbWFkLgorCQkJICovCisJCQl1MTYgcWJ1ZlszXTsKKwkJCXUxNiAqcWJwID0gcWJ1ZjsKKwkJCWludCBucWJ1ZiA9IG1pbigzLCBucSk7CisKKwkJCW5xIC09IG5xYnVmOworCQkJcWJ1ZlswXSA9IHFidWZbMV0gPSBxYnVmWzJdID0gMDsKKwkJCXdoaWxlIChucWJ1ZikgeworCQkJCW5xYnVmLS07CisJCQkJKnFicCsrID0gKnJzcCsrOworCQkJCWlmIChyc3AgPj0gcnNwX2VuZCkKKwkJCQkJcnNwID0gcnNwcTsKKwkJCX0KKwkJCSpxcCsrID0gY3B1X3RvX2JlMzIoRldfUlNTX0lORF9UQkxfQ01EX0lRMChxYnVmWzBdKSB8CisJCQkJCSAgICBGV19SU1NfSU5EX1RCTF9DTURfSVExKHFidWZbMV0pIHwKKwkJCQkJICAgIEZXX1JTU19JTkRfVEJMX0NNRF9JUTIocWJ1ZlsyXSkpOworCQl9CisKKwkJLyoKKwkJICogU2VuZCB0aGlzIHBvcnRpb24gb2YgdGhlIFJSUyB0YWJsZSB1cGRhdGUgdG8gdGhlIGZpcm13YXJlOworCQkgKiBiYWlsIG91dCBvbiBhbnkgZXJyb3JzLgorCQkgKi8KKwkJcmV0ID0gdDR2Zl93cl9tYm94KGFkYXB0ZXIsICZjbWQsIHNpemVvZihjbWQpLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXQ0dmZfYWxsb2NfdmkgLSBhbGxvY2F0ZSBhIHZpcnR1YWwgaW50ZXJmYWNlIG9uIGEgcG9ydAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAcG9ydF9pZDogcGh5c2ljYWwgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIFZJCisgKgorICoJQWxsb2NhdGUgYSBuZXcgVmlydHVhbCBJbnRlcmZhY2UgYW5kIGJpbmQgaXQgdG8gdGhlIGluZGljYXRlZAorICoJcGh5c2ljYWwgcG9ydC4gIFJldHVybiB0aGUgbmV3IFZpcnR1YWwgSW50ZXJmYWNlIElkZW50aWZpZXIgb24KKyAqCXN1Y2Nlc3MsIG9yIGEgW25lZ2F0aXZlXSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50IHQ0dmZfYWxsb2Nfdmkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0X2lkKQoreworCXN0cnVjdCBmd192aV9jbWQgY21kLCBycGw7CisJaW50IHY7CisKKwkvKgorCSAqIEV4ZWN1dGUgYSBWSSBjb21tYW5kIHRvIGFsbG9jYXRlIFZpcnR1YWwgSW50ZXJmYWNlIGFuZCByZXR1cm4gaXRzCisJICogVklJRC4KKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192Zm4gPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfVklfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgRldfQ01EX1dSSVRFIHwKKwkJCQkgICAgRldfQ01EX0VYRUMpOworCWNtZC5hbGxvY190b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX0xFTjE2KGNtZCkgfAorCQkJCQkgRldfVklfQ01EX0FMTE9DKTsKKwljbWQucG9ydGlkX3BrZCA9IEZXX1ZJX0NNRF9QT1JUSUQocG9ydF9pZCk7CisJdiA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCk7CisJaWYgKHYpCisJCXJldHVybiB2OworCisJcmV0dXJuIEZXX1ZJX0NNRF9WSUlEX0dFVChiZTE2X3RvX2NwdShycGwudHlwZV92aWlkKSk7Cit9CisKKy8qKgorICoJdDR2Zl9mcmVlX3ZpIC0tIGZyZWUgYSB2aXJ0dWFsIGludGVyZmFjZQorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAdmlpZDogdGhlIHZpcnR1YWwgaW50ZXJmYWNlIGlkZW50aWZpZXIKKyAqCisgKglGcmVlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgVmlydHVhbCBJbnRlcmZhY2UuICBSZXR1cm4gYW4gZXJyb3Igb24KKyAqCWZhaWx1cmUuCisgKi8KK2ludCB0NHZmX2ZyZWVfdmkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCB2aWlkKQoreworCXN0cnVjdCBmd192aV9jbWQgY21kOworCisJLyoKKwkgKiBFeGVjdXRlIGEgVkkgY29tbWFuZCB0byBmcmVlIHRoZSBWaXJ0dWFsIEludGVyZmFjZS4KKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192Zm4gPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfVklfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgRldfQ01EX0VYRUMpOworCWNtZC5hbGxvY190b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX0xFTjE2KGNtZCkgfAorCQkJCQkgRldfVklfQ01EX0ZSRUUpOworCWNtZC50eXBlX3ZpaWQgPSBjcHVfdG9fYmUxNihGV19WSV9DTURfVklJRCh2aWlkKSk7CisJcmV0dXJuIHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgTlVMTCk7Cit9CisKKy8qKgorICoJdDR2Zl9lbmFibGVfdmkgLSBlbmFibGUvZGlzYWJsZSBhIHZpcnR1YWwgaW50ZXJmYWNlCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUB2aWlkOiB0aGUgVmlydHVhbCBJbnRlcmZhY2UgSUQKKyAqCUByeF9lbjogMT1lbmFibGUgUngsIDA9ZGlzYWJsZSBSeAorICoJQHR4X2VuOiAxPWVuYWJsZSBUeCwgMD1kaXNhYmxlIFR4CisgKgorICoJRW5hYmxlcy9kaXNhYmxlcyBhIHZpcnR1YWwgaW50ZXJmYWNlLgorICovCitpbnQgdDR2Zl9lbmFibGVfdmkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCB2aWlkLAorCQkgICBib29sIHJ4X2VuLCBib29sIHR4X2VuKQoreworCXN0cnVjdCBmd192aV9lbmFibGVfY21kIGNtZDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZpaWQgPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfVklfRU5BQkxFX0NNRCkgfAorCQkJCSAgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICAgRldfQ01EX0VYRUMgfAorCQkJCSAgICAgRldfVklfRU5BQkxFX0NNRF9WSUlEKHZpaWQpKTsKKwljbWQuaWVuX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfVklfRU5BQkxFX0NNRF9JRU4ocnhfZW4pIHwKKwkJCQkgICAgICAgRldfVklfRU5BQkxFX0NNRF9FRU4odHhfZW4pIHwKKwkJCQkgICAgICAgRldfTEVOMTYoY21kKSk7CisJcmV0dXJuIHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgTlVMTCk7Cit9CisKKy8qKgorICoJdDR2Zl9pZGVudGlmeV9wb3J0IC0gaWRlbnRpZnkgYSBWSSdzIHBvcnQgYnkgYmxpbmtpbmcgaXRzIExFRAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAdmlpZDogdGhlIFZpcnR1YWwgSW50ZXJmYWNlIElECisgKglAbmJsaW5rczogaG93IG1hbnkgdGltZXMgdG8gYmxpbmsgTEVEIGF0IDIuNSBIegorICoKKyAqCUlkZW50aWZpZXMgYSBWSSdzIHBvcnQgYnkgYmxpbmtpbmcgaXRzIExFRC4KKyAqLworaW50IHQ0dmZfaWRlbnRpZnlfcG9ydChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHZpaWQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJsaW5rcykKK3sKKwlzdHJ1Y3QgZndfdmlfZW5hYmxlX2NtZCBjbWQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192aWlkID0gY3B1X3RvX2JlMzIoRldfQ01EX09QKEZXX1ZJX0VOQUJMRV9DTUQpIHwKKwkJCQkgICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgIEZXX0NNRF9FWEVDIHwKKwkJCQkgICAgIEZXX1ZJX0VOQUJMRV9DTURfVklJRCh2aWlkKSk7CisJY21kLmllbl90b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX1ZJX0VOQUJMRV9DTURfTEVEIHwKKwkJCQkgICAgICAgRldfTEVOMTYoY21kKSk7CisJY21kLmJsaW5rZHVyID0gY3B1X3RvX2JlMTYobmJsaW5rcyk7CisJcmV0dXJuIHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgTlVMTCk7Cit9CisKKy8qKgorICoJdDR2Zl9zZXRfcnhtb2RlIC0gc2V0IFJ4IHByb3BlcnRpZXMgb2YgYSB2aXJ0dWFsIGludGVyZmFjZQorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAdmlpZDogdGhlIFZJIGlkCisgKglAbXR1OiB0aGUgbmV3IE1UVSBvciAtMSBmb3Igbm8gY2hhbmdlCisgKglAcHJvbWlzYzogMSB0byBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSwgMCB0byBkaXNhYmxlIGl0LCAtMSBubyBjaGFuZ2UKKyAqCUBhbGxfbXVsdGk6IDEgdG8gZW5hYmxlIGFsbC1tdWx0aSBtb2RlLCAwIHRvIGRpc2FibGUgaXQsIC0xIG5vIGNoYW5nZQorICoJQGJjYXN0OiAxIHRvIGVuYWJsZSBicm9hZGNhc3QgUngsIDAgdG8gZGlzYWJsZSBpdCwgLTEgbm8gY2hhbmdlCisgKglAdmxhbmV4OiAxIHRvIGVuYWJsZSBoYXJkd2FyZSBWTEFOIFRhZyBleHRyYWN0aW9uLCAwIHRvIGRpc2FibGUgaXQsCisgKgkJLTEgbm8gY2hhbmdlCisgKgorICoJU2V0cyBSeCBwcm9wZXJ0aWVzIG9mIGEgdmlydHVhbCBpbnRlcmZhY2UuCisgKi8KK2ludCB0NHZmX3NldF9yeG1vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCB2aWlkLAorCQkgICAgaW50IG10dSwgaW50IHByb21pc2MsIGludCBhbGxfbXVsdGksIGludCBiY2FzdCwgaW50IHZsYW5leCwKKwkJICAgIGJvb2wgc2xlZXBfb2spCit7CisJc3RydWN0IGZ3X3ZpX3J4bW9kZV9jbWQgY21kOworCisJLyogY29udmVydCB0byBGVyB2YWx1ZXMgKi8KKwlpZiAobXR1IDwgMCkKKwkJbXR1ID0gRldfVklfUlhNT0RFX0NNRF9NVFVfTUFTSzsKKwlpZiAocHJvbWlzYyA8IDApCisJCXByb21pc2MgPSBGV19WSV9SWE1PREVfQ01EX1BST01JU0NFTl9NQVNLOworCWlmIChhbGxfbXVsdGkgPCAwKQorCQlhbGxfbXVsdGkgPSBGV19WSV9SWE1PREVfQ01EX0FMTE1VTFRJRU5fTUFTSzsKKwlpZiAoYmNhc3QgPCAwKQorCQliY2FzdCA9IEZXX1ZJX1JYTU9ERV9DTURfQlJPQURDQVNURU5fTUFTSzsKKwlpZiAodmxhbmV4IDwgMCkKKwkJdmxhbmV4ID0gRldfVklfUlhNT0RFX0NNRF9WTEFORVhFTl9NQVNLOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fdmlpZCA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19WSV9SWE1PREVfQ01EKSB8CisJCQkJICAgICBGV19DTURfUkVRVUVTVCB8CisJCQkJICAgICBGV19DTURfV1JJVEUgfAorCQkJCSAgICAgRldfVklfUlhNT0RFX0NNRF9WSUlEKHZpaWQpKTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYoY21kKSk7CisJY21kLm10dV90b192bGFuZXhlbiA9CisJCWNwdV90b19iZTMyKEZXX1ZJX1JYTU9ERV9DTURfTVRVKG10dSkgfAorCQkJICAgIEZXX1ZJX1JYTU9ERV9DTURfUFJPTUlTQ0VOKHByb21pc2MpIHwKKwkJCSAgICBGV19WSV9SWE1PREVfQ01EX0FMTE1VTFRJRU4oYWxsX211bHRpKSB8CisJCQkgICAgRldfVklfUlhNT0RFX0NNRF9CUk9BRENBU1RFTihiY2FzdCkgfAorCQkJICAgIEZXX1ZJX1JYTU9ERV9DTURfVkxBTkVYRU4odmxhbmV4KSk7CisJcmV0dXJuIHQ0dmZfd3JfbWJveF9jb3JlKGFkYXB0ZXIsICZjbWQsIHNpemVvZihjbWQpLCBOVUxMLCBzbGVlcF9vayk7Cit9CisKKy8qKgorICoJdDR2Zl9hbGxvY19tYWNfZmlsdCAtIGFsbG9jYXRlcyBleGFjdC1tYXRjaCBmaWx0ZXJzIGZvciBNQUMgYWRkcmVzc2VzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUB2aWlkOiB0aGUgVmlydHVhbCBJbnRlcmZhY2UgSWRlbnRpZmllcgorICoJQGZyZWU6IGlmIHRydWUgYW55IGV4aXN0aW5nIGZpbHRlcnMgZm9yIHRoaXMgVkkgaWQgYXJlIGZpcnN0IHJlbW92ZWQKKyAqCUBuYWRkcjogdGhlIG51bWJlciBvZiBNQUMgYWRkcmVzc2VzIHRvIGFsbG9jYXRlIGZpbHRlcnMgZm9yICh1cCB0byA3KQorICoJQGFkZHI6IHRoZSBNQUMgYWRkcmVzcyhlcykKKyAqCUBpZHg6IHdoZXJlIHRvIHN0b3JlIHRoZSBpbmRleCBvZiBlYWNoIGFsbG9jYXRlZCBmaWx0ZXIKKyAqCUBoYXNoOiBwb2ludGVyIHRvIGhhc2ggYWRkcmVzcyBmaWx0ZXIgYml0bWFwCisgKglAc2xlZXBfb2s6IGNhbGwgaXMgYWxsb3dlZCB0byBzbGVlcAorICoKKyAqCUFsbG9jYXRlcyBhbiBleGFjdC1tYXRjaCBmaWx0ZXIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGFkZHJlc3NlcyBhbmQKKyAqCXNldHMgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWRkcmVzcy4gIElmIEBpZHggaXMgbm90ICVOVUxMIGl0IHNob3VsZAorICoJaGF2ZSBhdCBsZWFzdCBAbmFkZHIgZW50cmllcywgZWFjaCBvZiB3aGljaCB3aWxsIGJlIHNldCB0byB0aGUgaW5kZXggb2YKKyAqCXRoZSBmaWx0ZXIgYWxsb2NhdGVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBNQUMgYWRkcmVzcy4gIElmIGEgZmlsdGVyCisgKgljb3VsZCBub3QgYmUgYWxsb2NhdGVkIGZvciBhbiBhZGRyZXNzIGl0cyBpbmRleCBpcyBzZXQgdG8gMHhmZmZmLgorICoJSWYgQGhhc2ggaXMgbm90ICVOVUxMIGFkZHJlc3NlcyB0aGF0IGZhaWwgdG8gYWxsb2NhdGUgYW4gZXhhY3QgZmlsdGVyCisgKglhcmUgaGFzaGVkIGFuZCB1cGRhdGUgdGhlIGhhc2ggZmlsdGVyIGJpdG1hcCBwb2ludGVkIGF0IGJ5IEBoYXNoLgorICoKKyAqCVJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb3IgdGhlIG51bWJlciBvZiBmaWx0ZXJzIGFsbG9jYXRlZC4KKyAqLworaW50IHQ0dmZfYWxsb2NfbWFjX2ZpbHQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCB2aWlkLCBib29sIGZyZWUsCisJCQl1bnNpZ25lZCBpbnQgbmFkZHIsIGNvbnN0IHU4ICoqYWRkciwgdTE2ICppZHgsCisJCQl1NjQgKmhhc2gsIGJvb2wgc2xlZXBfb2spCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgZndfdmlfbWFjX2NtZCBjbWQsIHJwbDsKKwlzdHJ1Y3QgZndfdmlfbWFjX2V4YWN0ICpwOworCXNpemVfdCBsZW4xNjsKKworCWlmIChuYWRkciA+IEFSUkFZX1NJWkUoY21kLnUuZXhhY3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsZW4xNiA9IERJVl9ST1VORF9VUChvZmZzZXRvZihzdHJ1Y3QgZndfdmlfbWFjX2NtZCwKKwkJCQkgICAgICB1LmV4YWN0W25hZGRyXSksIDE2KTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZpaWQgPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfVklfTUFDX0NNRCkgfAorCQkJCSAgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICAgRldfQ01EX1dSSVRFIHwKKwkJCQkgICAgIChmcmVlID8gRldfQ01EX0VYRUMgOiAwKSB8CisJCQkJICAgICBGV19WSV9NQUNfQ01EX1ZJSUQodmlpZCkpOworCWNtZC5mcmVlbWFjc190b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX1ZJX01BQ19DTURfRlJFRU1BQ1MoZnJlZSkgfAorCQkJCQkgICAgRldfQ01EX0xFTjE2KGxlbjE2KSk7CisKKwlmb3IgKGkgPSAwLCBwID0gY21kLnUuZXhhY3Q7IGkgPCBuYWRkcjsgaSsrLCBwKyspIHsKKwkJcC0+dmFsaWRfdG9faWR4ID0KKwkJCWNwdV90b19iZTE2KEZXX1ZJX01BQ19DTURfVkFMSUQgfAorCQkJCSAgICBGV19WSV9NQUNfQ01EX0lEWChGV19WSV9NQUNfQUREX01BQykpOworCQltZW1jcHkocC0+bWFjYWRkciwgYWRkcltpXSwgc2l6ZW9mKHAtPm1hY2FkZHIpKTsKKwl9CisKKwlyZXQgPSB0NHZmX3dyX21ib3hfY29yZShhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJnJwbCwgc2xlZXBfb2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwLCBwID0gcnBsLnUuZXhhY3Q7IGkgPCBuYWRkcjsgaSsrLCBwKyspIHsKKwkJdTE2IGluZGV4ID0gRldfVklfTUFDX0NNRF9JRFhfR0VUKGJlMTZfdG9fY3B1KHAtPnZhbGlkX3RvX2lkeCkpOworCisJCWlmIChpZHgpCisJCQlpZHhbaV0gPSAoaW5kZXggPj0gRldfQ0xTX1RDQU1fTlVNX0VOVFJJRVMKKwkJCQkgID8gMHhmZmZmCisJCQkJICA6IGluZGV4KTsKKwkJaWYgKGluZGV4IDwgRldfQ0xTX1RDQU1fTlVNX0VOVFJJRVMpCisJCQlyZXQrKzsKKwkJZWxzZSBpZiAoaGFzaCkKKwkJCSpoYXNoIHw9ICgxIDw8IGhhc2hfbWFjX2FkZHIoYWRkcltpXSkpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXQ0dmZfY2hhbmdlX21hYyAtIG1vZGlmaWVzIHRoZSBleGFjdC1tYXRjaCBmaWx0ZXIgZm9yIGEgTUFDIGFkZHJlc3MKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHZpaWQ6IHRoZSBWaXJ0dWFsIEludGVyZmFjZSBJRAorICoJQGlkeDogaW5kZXggb2YgZXhpc3RpbmcgZmlsdGVyIGZvciBvbGQgdmFsdWUgb2YgTUFDIGFkZHJlc3MsIG9yIC0xCisgKglAYWRkcjogdGhlIG5ldyBNQUMgYWRkcmVzcyB2YWx1ZQorICoJQHBlcnNpc3Q6IGlmIGlkeCA8IDAsIHRoZSBuZXcgTUFDIGFsbG9jYXRpb24gc2hvdWxkIGJlIHBlcnNpc3RlbnQKKyAqCisgKglNb2RpZmllcyBhbiBleGFjdC1tYXRjaCBmaWx0ZXIgYW5kIHNldHMgaXQgdG8gdGhlIG5ldyBNQUMgYWRkcmVzcy4KKyAqCU5vdGUgdGhhdCBpbiBnZW5lcmFsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4KKyAqCWZpbHRlciBzbyB0aGUgZ2VuZXJpYyB3YXkgdG8gbW9kaWZ5IGFuIGFkZHJlc3MgZmlsdGVyIGlzIHRvIGZyZWUgdGhlCisgKglvbmUgYmVpbmcgdXNlZCBieSB0aGUgb2xkIGFkZHJlc3MgdmFsdWUgYW5kIGFsbG9jYXRlIGEgbmV3IGZpbHRlciBmb3IKKyAqCXRoZSBuZXcgYWRkcmVzcyB2YWx1ZS4gIEBpZHggY2FuIGJlIC0xIGlmIHRoZSBhZGRyZXNzIGlzIGEgbmV3CisgKglhZGRpdGlvbi4KKyAqCisgKglSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9yIHRoZSBpbmRleCBvZiB0aGUgZmlsdGVyIHdpdGggdGhlIG5ldworICoJTUFDIHZhbHVlLgorICovCitpbnQgdDR2Zl9jaGFuZ2VfbWFjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgdmlpZCwKKwkJICAgIGludCBpZHgsIGNvbnN0IHU4ICphZGRyLCBib29sIHBlcnNpc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZndfdmlfbWFjX2NtZCBjbWQsIHJwbDsKKwlzdHJ1Y3QgZndfdmlfbWFjX2V4YWN0ICpwID0gJmNtZC51LmV4YWN0WzBdOworCXNpemVfdCBsZW4xNiA9IERJVl9ST1VORF9VUChvZmZzZXRvZihzdHJ1Y3QgZndfdmlfbWFjX2NtZCwKKwkJCQkJICAgICB1LmV4YWN0WzFdKSwgMTYpOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgbmV3IGFsbG9jYXRpb24sIGRldGVybWluZSB3aGV0aGVyIGl0IHNob3VsZCBiZQorCSAqIHBlcnNpc3RlbnQgKGFjcm9zcyBhICJmcmVlbWFjcyIgb3BlcmF0aW9uKSBvciBub3QuCisJICovCisJaWYgKGlkeCA8IDApCisJCWlkeCA9IHBlcnNpc3QgPyBGV19WSV9NQUNfQUREX1BFUlNJU1RfTUFDIDogRldfVklfTUFDX0FERF9NQUM7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192aWlkID0gY3B1X3RvX2JlMzIoRldfQ01EX09QKEZXX1ZJX01BQ19DTUQpIHwKKwkJCQkgICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgIEZXX0NNRF9XUklURSB8CisJCQkJICAgICBGV19WSV9NQUNfQ01EX1ZJSUQodmlpZCkpOworCWNtZC5mcmVlbWFjc190b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX0NNRF9MRU4xNihsZW4xNikpOworCXAtPnZhbGlkX3RvX2lkeCA9IGNwdV90b19iZTE2KEZXX1ZJX01BQ19DTURfVkFMSUQgfAorCQkJCSAgICAgIEZXX1ZJX01BQ19DTURfSURYKGlkeCkpOworCW1lbWNweShwLT5tYWNhZGRyLCBhZGRyLCBzaXplb2YocC0+bWFjYWRkcikpOworCisJcmV0ID0gdDR2Zl93cl9tYm94KGFkYXB0ZXIsICZjbWQsIHNpemVvZihjbWQpLCAmcnBsKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcCA9ICZycGwudS5leGFjdFswXTsKKwkJcmV0ID0gRldfVklfTUFDX0NNRF9JRFhfR0VUKGJlMTZfdG9fY3B1KHAtPnZhbGlkX3RvX2lkeCkpOworCQlpZiAocmV0ID49IEZXX0NMU19UQ0FNX05VTV9FTlRSSUVTKQorCQkJcmV0ID0gLUVOT01FTTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl0NHZmX3NldF9hZGRyX2hhc2ggLSBwcm9ncmFtIHRoZSBNQUMgaW5leGFjdC1tYXRjaCBoYXNoIGZpbHRlcgorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAdmlpZDogdGhlIFZpcnR1YWwgSW50ZXJmYWNlIElkZW50aWZpZXIKKyAqCUB1Y2FzdDogd2hldGhlciB0aGUgaGFzaCBmaWx0ZXIgc2hvdWxkIGFsc28gbWF0Y2ggdW5pY2FzdCBhZGRyZXNzZXMKKyAqCUB2ZWM6IHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBoYXNoIGZpbHRlcgorICoJQHNsZWVwX29rOiBjYWxsIGlzIGFsbG93ZWQgdG8gc2xlZXAKKyAqCisgKglTZXRzIHRoZSA2NC1iaXQgaW5leGFjdC1tYXRjaCBoYXNoIGZpbHRlciBmb3IgYSB2aXJ0dWFsIGludGVyZmFjZS4KKyAqLworaW50IHQ0dmZfc2V0X2FkZHJfaGFzaChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHZpaWQsCisJCSAgICAgICBib29sIHVjYXN0LCB1NjQgdmVjLCBib29sIHNsZWVwX29rKQoreworCXN0cnVjdCBmd192aV9tYWNfY21kIGNtZDsKKwlzaXplX3QgbGVuMTYgPSBESVZfUk9VTkRfVVAob2Zmc2V0b2Yoc3RydWN0IGZ3X3ZpX21hY19jbWQsCisJCQkJCSAgICAgdS5leGFjdFswXSksIDE2KTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZpaWQgPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfVklfTUFDX0NNRCkgfAorCQkJCSAgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICAgRldfQ01EX1dSSVRFIHwKKwkJCQkgICAgIEZXX1ZJX0VOQUJMRV9DTURfVklJRCh2aWlkKSk7CisJY21kLmZyZWVtYWNzX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfVklfTUFDX0NNRF9IQVNIVkVDRU4gfAorCQkJCQkgICAgRldfVklfTUFDX0NNRF9IQVNIVU5JRU4odWNhc3QpIHwKKwkJCQkJICAgIEZXX0NNRF9MRU4xNihsZW4xNikpOworCWNtZC51Lmhhc2guaGFzaHZlYyA9IGNwdV90b19iZTY0KHZlYyk7CisJcmV0dXJuIHQ0dmZfd3JfbWJveF9jb3JlKGFkYXB0ZXIsICZjbWQsIHNpemVvZihjbWQpLCBOVUxMLCBzbGVlcF9vayk7Cit9CisKKy8qKgorICoJdDR2Zl9nZXRfcG9ydF9zdGF0cyAtIGNvbGxlY3QgInBvcnQiIHN0YXRpc3RpY3MKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHBpZHg6IHRoZSBwb3J0IGluZGV4CisgKglAczogdGhlIHN0YXRzIHN0cnVjdHVyZSB0byBmaWxsCisgKgorICoJQ29sbGVjdCBzdGF0aXN0aWNzIGZvciB0aGUgInBvcnQiJ3MgVmlydHVhbCBJbnRlcmZhY2UuCisgKi8KK2ludCB0NHZmX2dldF9wb3J0X3N0YXRzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGlkeCwKKwkJCXN0cnVjdCB0NHZmX3BvcnRfc3RhdHMgKnMpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIHBpZHgpOworCXN0cnVjdCBmd192aV9zdGF0c192ZiBmd3N0YXRzOworCXVuc2lnbmVkIGludCByZW0gPSBWSV9WRl9OVU1fU1RBVFM7CisJX19iZTY0ICpmd3NwID0gKF9fYmU2NCAqKSZmd3N0YXRzOworCisJLyoKKwkgKiBHcmFiIHRoZSBWaXJ0dWFsIEludGVyZmFjZSBzdGF0aXN0aWNzIGEgY2h1bmsgYXQgYSB0aW1lIHZpYSBtYWlsYm94CisJICogY29tbWFuZHMuICBXZSBjb3VsZCB1c2UgYSBXb3JrIFJlcXVlc3QgYW5kIGdldCBhbGwgb2YgdGhlbSBhdCBvbmNlCisJICogYnV0IHRoYXQncyBhbiBhc3luY2hyb25vdXMgaW50ZXJmYWNlIHdoaWNoIGlzIGF3a3dhcmQgdG8gdXNlLgorCSAqLworCXdoaWxlIChyZW0pIHsKKwkJdW5zaWduZWQgaW50IGl4ID0gVklfVkZfTlVNX1NUQVRTIC0gcmVtOworCQl1bnNpZ25lZCBpbnQgbnN0YXRzID0gbWluKDZVLCByZW0pOworCQlzdHJ1Y3QgZndfdmlfc3RhdHNfY21kIGNtZCwgcnBsOworCQlzaXplX3QgbGVuID0gKG9mZnNldG9mKHN0cnVjdCBmd192aV9zdGF0c19jbWQsIHUpICsKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZndfdmlfc3RhdHNfY3RsKSk7CisJCXNpemVfdCBsZW4xNiA9IERJVl9ST1VORF9VUChsZW4sIDE2KTsKKwkJaW50IHJldDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQub3BfdG9fdmlpZCA9IGNwdV90b19iZTMyKEZXX0NNRF9PUChGV19WSV9TVEFUU19DTUQpIHwKKwkJCQkJICAgICBGV19WSV9TVEFUU19DTURfVklJRChwaS0+dmlpZCkgfAorCQkJCQkgICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkJICAgICBGV19DTURfUkVBRCk7CisJCWNtZC5yZXR2YWxfbGVuMTYgPSBjcHVfdG9fYmUzMihGV19DTURfTEVOMTYobGVuMTYpKTsKKwkJY21kLnUuY3RsLm5zdGF0c19peCA9CisJCQljcHVfdG9fYmUxNihGV19WSV9TVEFUU19DTURfSVgoaXgpIHwKKwkJCQkgICAgRldfVklfU1RBVFNfQ01EX05TVEFUUyhuc3RhdHMpKTsKKwkJcmV0ID0gdDR2Zl93cl9tYm94X25zKGFkYXB0ZXIsICZjbWQsIGxlbiwgJnJwbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCW1lbWNweShmd3NwLCAmcnBsLnUuY3RsLnN0YXQwLCBzaXplb2YoX19iZTY0KSAqIG5zdGF0cyk7CisKKwkJcmVtIC09IG5zdGF0czsKKwkJZndzcCArPSBuc3RhdHM7CisJfQorCisJLyoKKwkgKiBUcmFuc2xhdGUgZmlybXdhcmUgc3RhdGlzdGljcyBpbnRvIGhvc3QgbmF0aXZlIHN0YXRpc3RpY3MuCisJICovCisJcy0+dHhfYmNhc3RfYnl0ZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X2JjYXN0X2J5dGVzKTsKKwlzLT50eF9iY2FzdF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X2JjYXN0X2ZyYW1lcyk7CisJcy0+dHhfbWNhc3RfYnl0ZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X21jYXN0X2J5dGVzKTsKKwlzLT50eF9tY2FzdF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X21jYXN0X2ZyYW1lcyk7CisJcy0+dHhfdWNhc3RfYnl0ZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X3VjYXN0X2J5dGVzKTsKKwlzLT50eF91Y2FzdF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X3VjYXN0X2ZyYW1lcyk7CisJcy0+dHhfZHJvcF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnR4X2Ryb3BfZnJhbWVzKTsKKwlzLT50eF9vZmZsb2FkX2J5dGVzID0gYmU2NF90b19jcHUoZndzdGF0cy50eF9vZmZsb2FkX2J5dGVzKTsKKwlzLT50eF9vZmZsb2FkX2ZyYW1lcyA9IGJlNjRfdG9fY3B1KGZ3c3RhdHMudHhfb2ZmbG9hZF9mcmFtZXMpOworCisJcy0+cnhfYmNhc3RfYnl0ZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnJ4X2JjYXN0X2J5dGVzKTsKKwlzLT5yeF9iY2FzdF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnJ4X2JjYXN0X2ZyYW1lcyk7CisJcy0+cnhfbWNhc3RfYnl0ZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnJ4X21jYXN0X2J5dGVzKTsKKwlzLT5yeF9tY2FzdF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnJ4X21jYXN0X2ZyYW1lcyk7CisJcy0+cnhfdWNhc3RfYnl0ZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnJ4X3VjYXN0X2J5dGVzKTsKKwlzLT5yeF91Y2FzdF9mcmFtZXMgPSBiZTY0X3RvX2NwdShmd3N0YXRzLnJ4X3VjYXN0X2ZyYW1lcyk7CisKKwlzLT5yeF9lcnJfZnJhbWVzID0gYmU2NF90b19jcHUoZndzdGF0cy5yeF9lcnJfZnJhbWVzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXQ0dmZfaXFfZnJlZSAtIGZyZWUgYW4gaW5ncmVzcyBxdWV1ZSBhbmQgaXRzIGZyZWUgbGlzdHMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQGlxdHlwZTogdGhlIGluZ3Jlc3MgcXVldWUgdHlwZSAoRldfSVFfVFlQRV9GTF9JTlRfQ0FQLCBldGMuKQorICoJQGlxaWQ6IGluZ3Jlc3MgcXVldWUgSUQKKyAqCUBmbDBpZDogRkwwIHF1ZXVlIElEIG9yIDB4ZmZmZiBpZiBubyBhdHRhY2hlZCBGTDAKKyAqCUBmbDFpZDogRkwxIHF1ZXVlIElEIG9yIDB4ZmZmZiBpZiBubyBhdHRhY2hlZCBGTDEKKyAqCisgKglGcmVlcyBhbiBpbmdyZXNzIHF1ZXVlIGFuZCBpdHMgYXNzb2NpYXRlZCBmcmVlIGxpc3RzLCBpZiBhbnkuCisgKi8KK2ludCB0NHZmX2lxX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpcXR5cGUsCisJCSB1bnNpZ25lZCBpbnQgaXFpZCwgdW5zaWduZWQgaW50IGZsMGlkLCB1bnNpZ25lZCBpbnQgZmwxaWQpCit7CisJc3RydWN0IGZ3X2lxX2NtZCBjbWQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192Zm4gPSBjcHVfdG9fYmUzMihGV19DTURfT1AoRldfSVFfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUIHwKKwkJCQkgICAgRldfQ01EX0VYRUMpOworCWNtZC5hbGxvY190b19sZW4xNiA9IGNwdV90b19iZTMyKEZXX0lRX0NNRF9GUkVFIHwKKwkJCQkJIEZXX0xFTjE2KGNtZCkpOworCWNtZC50eXBlX3RvX2lxYW5kc3RpbmRleCA9CisJCWNwdV90b19iZTMyKEZXX0lRX0NNRF9UWVBFKGlxdHlwZSkpOworCisJY21kLmlxaWQgPSBjcHVfdG9fYmUxNihpcWlkKTsKKwljbWQuZmwwaWQgPSBjcHVfdG9fYmUxNihmbDBpZCk7CisJY21kLmZsMWlkID0gY3B1X3RvX2JlMTYoZmwxaWQpOworCXJldHVybiB0NHZmX3dyX21ib3goYWRhcHRlciwgJmNtZCwgc2l6ZW9mKGNtZCksIE5VTEwpOworfQorCisvKioKKyAqCXQ0dmZfZXRoX2VxX2ZyZWUgLSBmcmVlIGFuIEV0aGVybmV0IGVncmVzcyBxdWV1ZQorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAZXFpZDogZWdyZXNzIHF1ZXVlIElECisgKgorICoJRnJlZXMgYW4gRXRoZXJuZXQgZWdyZXNzIHF1ZXVlLgorICovCitpbnQgdDR2Zl9ldGhfZXFfZnJlZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGVxaWQpCit7CisJc3RydWN0IGZ3X2VxX2V0aF9jbWQgY21kOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fdmZuID0gY3B1X3RvX2JlMzIoRldfQ01EX09QKEZXX0VRX0VUSF9DTUQpIHwKKwkJCQkgICAgRldfQ01EX1JFUVVFU1QgfAorCQkJCSAgICBGV19DTURfRVhFQyk7CisJY21kLmFsbG9jX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfRVFfRVRIX0NNRF9GUkVFIHwKKwkJCQkJIEZXX0xFTjE2KGNtZCkpOworCWNtZC5lcWlkX3BrZCA9IGNwdV90b19iZTMyKEZXX0VRX0VUSF9DTURfRVFJRChlcWlkKSk7CisJcmV0dXJuIHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgTlVMTCk7Cit9CisKKy8qKgorICoJdDR2Zl9oYW5kbGVfZndfcnBsIC0gcHJvY2VzcyBhIGZpcm13YXJlIHJlcGx5IG1lc3NhZ2UKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHJwbDogc3RhcnQgb2YgdGhlIGZpcm13YXJlIG1lc3NhZ2UKKyAqCisgKglQcm9jZXNzZXMgYSBmaXJtd2FyZSBtZXNzYWdlLCBzdWNoIGFzIGxpbmsgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzLgorICovCitpbnQgdDR2Zl9oYW5kbGVfZndfcnBsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCBfX2JlNjQgKnJwbCkKK3sKKwlzdHJ1Y3QgZndfY21kX2hkciAqY21kX2hkciA9IChzdHJ1Y3QgZndfY21kX2hkciAqKXJwbDsKKwl1OCBvcGNvZGUgPSBGV19DTURfT1BfR0VUKGJlMzJfdG9fY3B1KGNtZF9oZHItPmhpKSk7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgRldfUE9SVF9DTUQ6IHsKKwkJLyoKKwkJICogTGluay9tb2R1bGUgc3RhdGUgY2hhbmdlIG1lc3NhZ2UuCisJCSAqLworCQljb25zdCBzdHJ1Y3QgZndfcG9ydF9jbWQgKnBvcnRfY21kID0gKHZvaWQgKilycGw7CisJCXUzMiB3b3JkOworCQlpbnQgYWN0aW9uLCBwb3J0X2lkLCBsaW5rX29rLCBzcGVlZCwgZmMsIHBpZHg7CisKKwkJLyoKKwkJICogRXh0cmFjdCB2YXJpb3VzIGZpZWxkcyBmcm9tIHBvcnQgc3RhdHVzIGNoYW5nZSBtZXNzYWdlLgorCQkgKi8KKwkJYWN0aW9uID0gRldfUE9SVF9DTURfQUNUSU9OX0dFVCgKKwkJCWJlMzJfdG9fY3B1KHBvcnRfY21kLT5hY3Rpb25fdG9fbGVuMTYpKTsKKwkJaWYgKGFjdGlvbiAhPSBGV19QT1JUX0FDVElPTl9HRVRfUE9SVF9JTkZPKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCSJVbmtub3duIGZpcm13YXJlIFBPUlQgcmVwbHkgYWN0aW9uICV4XG4iLAorCQkJCWFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCisJCXBvcnRfaWQgPSBGV19QT1JUX0NNRF9QT1JUSURfR0VUKAorCQkJYmUzMl90b19jcHUocG9ydF9jbWQtPm9wX3RvX3BvcnRpZCkpOworCisJCXdvcmQgPSBiZTMyX3RvX2NwdShwb3J0X2NtZC0+dS5pbmZvLmxzdGF0dXNfdG9fbW9kdHlwZSk7CisJCWxpbmtfb2sgPSAod29yZCAmIEZXX1BPUlRfQ01EX0xTVEFUVVMpICE9IDA7CisJCXNwZWVkID0gMDsKKwkJZmMgPSAwOworCQlpZiAod29yZCAmIEZXX1BPUlRfQ01EX1JYUEFVU0UpCisJCQlmYyB8PSBQQVVTRV9SWDsKKwkJaWYgKHdvcmQgJiBGV19QT1JUX0NNRF9UWFBBVVNFKQorCQkJZmMgfD0gUEFVU0VfVFg7CisJCWlmICh3b3JkICYgRldfUE9SVF9DTURfTFNQRUVEKEZXX1BPUlRfQ0FQX1NQRUVEXzEwME0pKQorCQkJc3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UgaWYgKHdvcmQgJiBGV19QT1JUX0NNRF9MU1BFRUQoRldfUE9SVF9DQVBfU1BFRURfMUcpKQorCQkJc3BlZWQgPSBTUEVFRF8xMDAwOworCQllbHNlIGlmICh3b3JkICYgRldfUE9SVF9DTURfTFNQRUVEKEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykpCisJCQlzcGVlZCA9IFNQRUVEXzEwMDAwOworCisJCS8qCisJCSAqIFNjYW4gYWxsIG9mIG91ciAicG9ydHMiIChWaXJ0dWFsIEludGVyZmFjZXMpIGxvb2tpbmcgZm9yCisJCSAqIHRob3NlIGJvdW5kIHRvIHRoZSBwaHlzaWNhbCBwb3J0IHdoaWNoIGhhcyBjaGFuZ2VkLiAgSWYKKwkJICogb3VyIHJlY29yZGVkIHN0YXRlIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdGUsCisJCSAqIHNpZ25hbCB0aGF0IGNoYW5nZSB0byB0aGUgT1MgY29kZS4KKwkJICovCisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcGlkeCkgeworCQkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIHBpZHgpOworCQkJc3RydWN0IGxpbmtfY29uZmlnICpsYzsKKworCQkJaWYgKHBpLT5wb3J0X2lkICE9IHBvcnRfaWQpCisJCQkJY29udGludWU7CisKKwkJCWxjID0gJnBpLT5saW5rX2NmZzsKKwkJCWlmIChsaW5rX29rICE9IGxjLT5saW5rX29rIHx8IHNwZWVkICE9IGxjLT5zcGVlZCB8fAorCQkJICAgIGZjICE9IGxjLT5mYykgeworCQkJCS8qIHNvbWV0aGluZyBjaGFuZ2VkICovCisJCQkJbGMtPmxpbmtfb2sgPSBsaW5rX29rOworCQkJCWxjLT5zcGVlZCA9IHNwZWVkOworCQkJCWxjLT5mYyA9IGZjOworCQkJCXQ0dmZfb3NfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIHBpZHgsIGxpbmtfb2spOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsICJVbmtub3duIGZpcm13YXJlIHJlcGx5ICVYXG4iLAorCQkJb3Bjb2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kYXZpbmNpX2VtYWMuYyBiL2RyaXZlcnMvbmV0L2RhdmluY2lfZW1hYy5jCmluZGV4IDA4ZTgyYjEuLmQwODI0ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RhdmluY2lfZW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2RhdmluY2lfZW1hYy5jCkBAIC0yOTgsNiArMjk4LDExIEBACiAjZGVmaW5lIEVNQUNfQ1RSTF9FV0NUTAkJKDB4NCkKICNkZWZpbmUgRU1BQ19DVFJMX0VXSU5UVENOVAkoMHg4KQogCisvKiBFTUFDIERNNjQ0eCBjb250cm9sIG1vZHVsZSBtYXNrcyAqLworI2RlZmluZSBFTUFDX0RNNjQ0WF9FV0lOVENOVF9NQVNLCTB4MUZGRkYKKyNkZWZpbmUgRU1BQ19ETTY0NFhfSU5UTUlOX0lOVFZMCTB4MQorI2RlZmluZSBFTUFDX0RNNjQ0WF9JTlRNQVhfSU5UVkwJKEVNQUNfRE02NDRYX0VXSU5UQ05UX01BU0spCisKIC8qIEVNQUMgTURJTyByZWxhdGVkICovCiAvKiBNYXNrICYgQ29udHJvbCBkZWZpbmVzICovCiAjZGVmaW5lIE1ESU9fQ09OVFJPTF9DTEtESVYJKDB4RkYpCkBAIC0zMTgsOCArMzIzLDIwIEBACiAjZGVmaW5lIE1ESU9fQ09OVFJPTAkJKDB4MDQpCiAKIC8qIEVNQUMgRE02NDZYIGNvbnRyb2wgbW9kdWxlIHJlZ2lzdGVycyAqLwotI2RlZmluZSBFTUFDX0RNNjQ2WF9DTVJYSU5URU4JKDB4MTQpCi0jZGVmaW5lIEVNQUNfRE02NDZYX0NNVFhJTlRFTgkoMHgxOCkKKyNkZWZpbmUgRU1BQ19ETTY0NlhfQ01JTlRDVFJMCTB4MEMKKyNkZWZpbmUgRU1BQ19ETTY0NlhfQ01SWElOVEVOCTB4MTQKKyNkZWZpbmUgRU1BQ19ETTY0NlhfQ01UWElOVEVOCTB4MTgKKyNkZWZpbmUgRU1BQ19ETTY0NlhfQ01SWElOVE1BWAkweDcwCisjZGVmaW5lIEVNQUNfRE02NDZYX0NNVFhJTlRNQVgJMHg3NAorCisvKiBFTUFDIERNNjQ2WCBjb250cm9sIG1vZHVsZSBtYXNrcyAqLworI2RlZmluZSBFTUFDX0RNNjQ2WF9JTlRQQUNFRU4JCSgweDMgPDwgMTYpCisjZGVmaW5lIEVNQUNfRE02NDZYX0lOVFBSRVNDQUxFX01BU0sJKDB4N0ZGIDw8IDApCisjZGVmaW5lIEVNQUNfRE02NDZYX0NNSU5UTUFYX0NOVAk2MworI2RlZmluZSBFTUFDX0RNNjQ2WF9DTUlOVE1JTl9DTlQJMgorI2RlZmluZSBFTUFDX0RNNjQ2WF9DTUlOVE1BWF9JTlRWTAkoMTAwMCAvIEVNQUNfRE02NDZYX0NNSU5UTUlOX0NOVCkKKyNkZWZpbmUgRU1BQ19ETTY0NlhfQ01JTlRNSU5fSU5UVkwJKCgxMDAwIC8gRU1BQ19ETTY0NlhfQ01JTlRNQVhfQ05UKSArIDEpCisKIAogLyogRU1BQyBFT0kgY29kZXMgZm9yIEMwICovCiAjZGVmaW5lIEVNQUNfRE02NDZYX01BQ19FT0lfQzBfUlhFTgkoMHgwMSkKQEAgLTQ2OCw5ICs0ODUsMTAgQEAKIAl1MzIgZHVwbGV4OyAvKiBMaW5rIGR1cGxleDogMD1IYWxmLCAxPUZ1bGwgKi8KIAl1MzIgcnhfYnVmX3NpemU7CiAJdTMyIGlzcl9jb3VudDsKKwl1MzIgY29hbF9pbnR2bDsKKwl1MzIgYnVzX2ZyZXFfbWh6OwogCXU4IHJtaWlfZW47CiAJdTggdmVyc2lvbjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfZGV2X3N0YXRzOwogCXUzMiBtYWNfaGFzaDE7CiAJdTMyIG1hY19oYXNoMjsKIAl1MzIgbXVsdGljYXN0X2hhc2hfY250W0VNQUNfTlVNX01VTFRJQ0FTVF9CSVRTXTsKQEAgLTU0Niw5ICs1NjQsMTEgQEAKIAogCS8qIFByaW50IGltcG9ydGFudCByZWdpc3RlcnMgaW4gRU1BQyAqLwogCWRldl9pbmZvKGVtYWNfZGV2LCAiRU1BQyBCYXNpYyByZWdpc3RlcnNcbiIpOwotCWRldl9pbmZvKGVtYWNfZGV2LCAiRU1BQzogRVdDVEw6ICUwOFgsIEVXSU5UVENOVDogJTA4WFxuIiwKLQkJZW1hY19jdHJsX3JlYWQoRU1BQ19DVFJMX0VXQ1RMKSwKLQkJZW1hY19jdHJsX3JlYWQoRU1BQ19DVFJMX0VXSU5UVENOVCkpOworCWlmIChwcml2LT52ZXJzaW9uID09IEVNQUNfVkVSU0lPTl8xKSB7CisJCWRldl9pbmZvKGVtYWNfZGV2LCAiRU1BQzogRVdDVEw6ICUwOFgsIEVXSU5UVENOVDogJTA4WFxuIiwKKwkJCWVtYWNfY3RybF9yZWFkKEVNQUNfQ1RSTF9FV0NUTCksCisJCQllbWFjX2N0cmxfcmVhZChFTUFDX0NUUkxfRVdJTlRUQ05UKSk7CisJfQogCWRldl9pbmZvKGVtYWNfZGV2LCAiRU1BQzogVFhJRDogJTA4WCAlcywgUlhJRDogJTA4WCAlc1xuIiwKIAkJZW1hY19yZWFkKEVNQUNfVFhJRFZFUiksCiAJCSgoZW1hY19yZWFkKEVNQUNfVFhDT05UUk9MKSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSwKQEAgLTY5Miw2ICs3MTIsMTAzIEBACiB9CiAKIC8qKgorICogZW1hY19nZXRfY29hbGVzY2UgOiBHZXQgaW50ZXJydXB0IGNvYWxlc2NlIHNldHRpbmdzIGZvciB0aGlzIGRldmljZQorICogQG5kZXYgOiBUaGUgRGFWaW5jaSBFTUFDIG5ldHdvcmsgYWRhcHRlcgorICogQGNvYWwgOiBldGh0b29sIGNvYWxlc2NlIHNldHRpbmdzIHN0cnVjdHVyZQorICoKKyAqIEZldGNoIHRoZSBjdXJyZW50IGludGVycnVwdCBjb2FsZXNjZSBzZXR0aW5ncworICoKKyAqLworc3RhdGljIGludCBlbWFjX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbCkKK3sKKwlzdHJ1Y3QgZW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwljb2FsLT5yeF9jb2FsZXNjZV91c2VjcyA9IHByaXYtPmNvYWxfaW50dmw7CisJcmV0dXJuIDA7CisKK30KKworLyoqCisgKiBlbWFjX3NldF9jb2FsZXNjZSA6IFNldCBpbnRlcnJ1cHQgY29hbGVzY2Ugc2V0dGluZ3MgZm9yIHRoaXMgZGV2aWNlCisgKiBAbmRldiA6IFRoZSBEYVZpbmNpIEVNQUMgbmV0d29yayBhZGFwdGVyCisgKiBAY29hbCA6IGV0aHRvb2wgY29hbGVzY2Ugc2V0dGluZ3Mgc3RydWN0dXJlCisgKgorICogU2V0IGludGVycnVwdCBjb2FsZXNjZSBwYXJhbWV0ZXJzCisgKgorICovCitzdGF0aWMgaW50IGVtYWNfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsKQoreworCXN0cnVjdCBlbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgaW50X2N0cmwsIG51bV9pbnRlcnJ1cHRzID0gMDsKKwl1MzIgcHJlc2NhbGUgPSAwLCBhZGRubF9kdmRyID0gMSwgY29hbF9pbnR2bCA9IDA7CisKKwlpZiAoIWNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvYWxfaW50dmwgPSBjb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKKworCXN3aXRjaCAocHJpdi0+dmVyc2lvbikgeworCWNhc2UgRU1BQ19WRVJTSU9OXzI6CisJCWludF9jdHJsID0gIGVtYWNfY3RybF9yZWFkKEVNQUNfRE02NDZYX0NNSU5UQ1RSTCk7CisJCXByZXNjYWxlID0gcHJpdi0+YnVzX2ZyZXFfbWh6ICogNDsKKworCQlpZiAoY29hbF9pbnR2bCA8IEVNQUNfRE02NDZYX0NNSU5UTUlOX0lOVFZMKQorCQkJY29hbF9pbnR2bCA9IEVNQUNfRE02NDZYX0NNSU5UTUlOX0lOVFZMOworCisJCWlmIChjb2FsX2ludHZsID4gRU1BQ19ETTY0NlhfQ01JTlRNQVhfSU5UVkwpIHsKKwkJCS8qCisJCQkgKiBJbnRlcnJ1cHQgcGFjZXIgd29ya3Mgd2l0aCA0dXMgUHVsc2UsIHdlIGNhbgorCQkJICogdGhyb3R0bGUgZnVydGhlciBieSBkaWxhdGluZyB0aGUgNHVzIHB1bHNlLgorCQkJICovCisJCQlhZGRubF9kdmRyID0gRU1BQ19ETTY0NlhfSU5UUFJFU0NBTEVfTUFTSyAvIHByZXNjYWxlOworCisJCQlpZiAoYWRkbmxfZHZkciA+IDEpIHsKKwkJCQlwcmVzY2FsZSAqPSBhZGRubF9kdmRyOworCQkJCWlmIChjb2FsX2ludHZsID4gKEVNQUNfRE02NDZYX0NNSU5UTUFYX0lOVFZMCisJCQkJCQkJKiBhZGRubF9kdmRyKSkKKwkJCQkJY29hbF9pbnR2bCA9IChFTUFDX0RNNjQ2WF9DTUlOVE1BWF9JTlRWTAorCQkJCQkJCSogYWRkbmxfZHZkcik7CisJCQl9IGVsc2UgeworCQkJCWFkZG5sX2R2ZHIgPSAxOworCQkJCWNvYWxfaW50dmwgPSBFTUFDX0RNNjQ2WF9DTUlOVE1BWF9JTlRWTDsKKwkJCX0KKwkJfQorCisJCW51bV9pbnRlcnJ1cHRzID0gKDEwMDAgKiBhZGRubF9kdmRyKSAvIGNvYWxfaW50dmw7CisKKwkJaW50X2N0cmwgfD0gRU1BQ19ETTY0NlhfSU5UUEFDRUVOOworCQlpbnRfY3RybCAmPSAofkVNQUNfRE02NDZYX0lOVFBSRVNDQUxFX01BU0spOworCQlpbnRfY3RybCB8PSAocHJlc2NhbGUgJiBFTUFDX0RNNjQ2WF9JTlRQUkVTQ0FMRV9NQVNLKTsKKwkJZW1hY19jdHJsX3dyaXRlKEVNQUNfRE02NDZYX0NNSU5UQ1RSTCwgaW50X2N0cmwpOworCisJCWVtYWNfY3RybF93cml0ZShFTUFDX0RNNjQ2WF9DTVJYSU5UTUFYLCBudW1faW50ZXJydXB0cyk7CisJCWVtYWNfY3RybF93cml0ZShFTUFDX0RNNjQ2WF9DTVRYSU5UTUFYLCBudW1faW50ZXJydXB0cyk7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW50X2N0cmwgPSBlbWFjX2N0cmxfcmVhZChFTUFDX0NUUkxfRVdJTlRUQ05UKTsKKwkJaW50X2N0cmwgJj0gKH5FTUFDX0RNNjQ0WF9FV0lOVENOVF9NQVNLKTsKKwkJcHJlc2NhbGUgPSBjb2FsX2ludHZsICogcHJpdi0+YnVzX2ZyZXFfbWh6OworCQlpZiAocHJlc2NhbGUgPiBFTUFDX0RNNjQ0WF9FV0lOVENOVF9NQVNLKSB7CisJCQlwcmVzY2FsZSA9IEVNQUNfRE02NDRYX0VXSU5UQ05UX01BU0s7CisJCQljb2FsX2ludHZsID0gcHJlc2NhbGUgLyBwcml2LT5idXNfZnJlcV9taHo7CisJCX0KKwkJZW1hY19jdHJsX3dyaXRlKEVNQUNfQ1RSTF9FV0lOVFRDTlQsIChpbnRfY3RybCB8IHByZXNjYWxlKSk7CisKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyJTZXQgY29hbGVzY2UgdG8gJWQgdXNlY3MuXG4iLCBjb2FsX2ludHZsKTsKKwlwcml2LT5jb2FsX2ludHZsID0gY29hbF9pbnR2bDsKKworCXJldHVybiAwOworCit9CisKKworLyoqCiAgKiBldGh0b29sX29wczogRGFWaW5jaSBFTUFDIEV0aHRvb2wgc3RydWN0dXJlCiAgKgogICogRXRodG9vbCBzdXBwb3J0IGZvciBFTUFDIGFkYXB0ZXIKQEAgLTcwMiw2ICs4MTksOCBAQAogCS5nZXRfc2V0dGluZ3MgPSBlbWFjX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzID0gZW1hY19zZXRfc2V0dGluZ3MsCiAJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2NvYWxlc2NlID0gZW1hY19nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZSA9ICBlbWFjX3NldF9jb2FsZXNjZSwKIH07CiAKIC8qKgpAQCAtMTE4MCwxNiArMTI5OSwxNyBAQAogCQkJCXZvaWQgKipuZXRfZGF0YV90b2tlbnMsCiAJCQkJaW50IG51bV90b2tlbnMsIHUzMiBjaCkKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPm5kZXY7CiAJdTMyIGNudDsKIAotCWlmICh1bmxpa2VseShudW1fdG9rZW5zICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmRldikpKQotCQluZXRpZl9zdGFydF9xdWV1ZShwcml2LT5uZGV2KTsKKwlpZiAodW5saWtlbHkobnVtX3Rva2VucyAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpKSkKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CiAJZm9yIChjbnQgPSAwOyBjbnQgPCBudW1fdG9rZW5zOyBjbnQrKykgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopbmV0X2RhdGFfdG9rZW5zW2NudF07CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwotCQlwcml2LT5uZXRfZGV2X3N0YXRzLnR4X3BhY2tldHMrKzsKLQkJcHJpdi0+bmV0X2Rldl9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNDc2LDcgKzE1OTYsNyBAQAogCQkJCQkiIGVyci4gT3V0IG9mIFRYIEJEJ3MiKTsKIAkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmRldik7CiAJCX0KLQkJcHJpdi0+bmV0X2Rldl9zdGF0cy50eF9kcm9wcGVkKys7CisJCW5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIApAQCAtMTUwMSw3ICsxNjIxLDcgQEAKIAlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKIAkJZGV2X2VycihlbWFjX2RldiwgIkRhVmluY2kgRU1BQzogeG1pdCB0aW1lb3V0LCByZXN0YXJ0aW5nIFRYIik7CiAKLQlwcml2LT5uZXRfZGV2X3N0YXRzLnR4X2Vycm9ycysrOworCW5kZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCWVtYWNfaW50X2Rpc2FibGUocHJpdik7CiAJZW1hY19zdG9wX3R4Y2gocHJpdiwgRU1BQ19ERUZfVFhfQ0gpOwogCWVtYWNfY2xlYW51cF90eGNoKHByaXYsIEVNQUNfREVGX1RYX0NIKTsKQEAgLTE5MjYsMTQgKzIwNDYsMTQgQEAKIHN0YXRpYyBpbnQgZW1hY19uZXRfcnhfY2Ioc3RydWN0IGVtYWNfcHJpdiAqcHJpdiwKIAkJCSAgc3RydWN0IGVtYWNfbmV0cGt0b2JqICpuZXRfcGt0X2xpc3QpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBfc2tiOwotCXBfc2tiID0gKHN0cnVjdCBza19idWZmICopbmV0X3BrdF9saXN0LT5wa3RfdG9rZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5uZGV2OworCXN0cnVjdCBza19idWZmICpwX3NrYiA9IG5ldF9wa3RfbGlzdC0+cGt0X3Rva2VuOwogCS8qIHNldCBsZW5ndGggb2YgcGFja2V0ICovCiAJc2tiX3B1dChwX3NrYiwgbmV0X3BrdF9saXN0LT5wa3RfbGVuZ3RoKTsKIAlwX3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwX3NrYiwgcHJpdi0+bmRldik7CiAJbmV0aWZfcmVjZWl2ZV9za2IocF9za2IpOwotCXByaXYtPm5ldF9kZXZfc3RhdHMucnhfYnl0ZXMgKz0gbmV0X3BrdF9saXN0LT5wa3RfbGVuZ3RoOwotCXByaXYtPm5ldF9kZXZfc3RhdHMucnhfcGFja2V0cysrOworCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IG5ldF9wa3RfbGlzdC0+cGt0X2xlbmd0aDsKKwluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNDgsNyArMjI2OCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5uZGV2OwogCXN0cnVjdCBkZXZpY2UgKmVtYWNfZGV2ID0gJm5kZXYtPmRldjsKIAl1MzIgc3RhdHVzID0gMDsKLQl1MzIgbnVtX3BrdHMgPSAwOworCXUzMiBudW1fdHhfcGt0cyA9IDAsIG51bV9yeF9wa3RzID0gMDsKIAogCS8qIENoZWNrIGludGVycnVwdCB2ZWN0b3JzIGFuZCBjYWxsIHBhY2tldCBwcm9jZXNzaW5nICovCiAJc3RhdHVzID0gZW1hY19yZWFkKEVNQUNfTUFDSU5WRUNUT1IpOwpAQCAtMjE1OSwyNyArMjI3OSwxOSBAQAogCQltYXNrID0gRU1BQ19ETTY0NlhfTUFDX0lOX1ZFQ1RPUl9UWF9JTlRfVkVDOwogCiAJaWYgKHN0YXR1cyAmIG1hc2spIHsKLQkJbnVtX3BrdHMgPSBlbWFjX3R4X2JkcHJvYyhwcml2LCBFTUFDX0RFRl9UWF9DSCwKKwkJbnVtX3R4X3BrdHMgPSBlbWFjX3R4X2JkcHJvYyhwcml2LCBFTUFDX0RFRl9UWF9DSCwKIAkJCQkJICBFTUFDX0RFRl9UWF9NQVhfU0VSVklDRSk7CiAJfSAvKiBUWCBwcm9jZXNzaW5nICovCiAKLQlpZiAobnVtX3BrdHMpCi0JCXJldHVybiBidWRnZXQ7Ci0KIAltYXNrID0gRU1BQ19ETTY0NFhfTUFDX0lOX1ZFQ1RPUl9SWF9JTlRfVkVDOwogCiAJaWYgKHByaXYtPnZlcnNpb24gPT0gRU1BQ19WRVJTSU9OXzIpCiAJCW1hc2sgPSBFTUFDX0RNNjQ2WF9NQUNfSU5fVkVDVE9SX1JYX0lOVF9WRUM7CiAKIAlpZiAoc3RhdHVzICYgbWFzaykgewotCQludW1fcGt0cyA9IGVtYWNfcnhfYmRwcm9jKHByaXYsIEVNQUNfREVGX1JYX0NILCBidWRnZXQpOworCQludW1fcnhfcGt0cyA9IGVtYWNfcnhfYmRwcm9jKHByaXYsIEVNQUNfREVGX1JYX0NILCBidWRnZXQpOwogCX0gLyogUlggcHJvY2Vzc2luZyAqLwogCi0JaWYgKG51bV9wa3RzIDwgYnVkZ2V0KSB7Ci0JCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCWVtYWNfaW50X2VuYWJsZShwcml2KTsKLQl9Ci0KIAltYXNrID0gRU1BQ19ETTY0NFhfTUFDX0lOX1ZFQ1RPUl9IT1NUX0lOVDsKIAlpZiAocHJpdi0+dmVyc2lvbiA9PSBFTUFDX1ZFUlNJT05fMikKIAkJbWFzayA9IEVNQUNfRE02NDZYX01BQ19JTl9WRUNUT1JfSE9TVF9JTlQ7CkBAIC0yMjEwLDkgKzIzMjIsMTIgQEAKIAkJCQlkZXZfZXJyKGVtYWNfZGV2LCAiUlggSG9zdCBlcnJvciAlcyBvbiBjaD0lZFxuIiwKIAkJCQkJJmVtYWNfcnhob3N0X2VycmNvZGVzW2NhdXNlXVswXSwgY2gpOwogCQl9Ci0JfSAvKiBIb3N0IGVycm9yIHByb2Nlc3NpbmcgKi8KKwl9IGVsc2UgaWYgKG51bV9yeF9wa3RzIDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisJCWVtYWNfaW50X2VuYWJsZShwcml2KTsKKwl9CiAKLQlyZXR1cm4gbnVtX3BrdHM7CisJcmV0dXJuIG51bV9yeF9wa3RzOwogfQogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTI0MzcsNiArMjU1MiwxNCBAQAogCS8qIFN0YXJ0L0VuYWJsZSBFTUFDIGhhcmR3YXJlICovCiAJZW1hY19od19lbmFibGUocHJpdik7CiAKKwkvKiBFbmFibGUgSW50ZXJydXB0IHBhY2luZyBpZiBjb25maWd1cmVkICovCisJaWYgKHByaXYtPmNvYWxfaW50dmwgIT0gMCkgeworCQlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSBjb2FsOworCisJCWNvYWwucnhfY29hbGVzY2VfdXNlY3MgPSAocHJpdi0+Y29hbF9pbnR2bCA8PCA0KTsKKwkJZW1hY19zZXRfY29hbGVzY2UobmRldiwgJmNvYWwpOworCX0KKwogCS8qIGZpbmQgdGhlIGZpcnN0IHBoeSAqLwogCXByaXYtPnBoeWRldiA9IE5VTEw7CiAJaWYgKHByaXYtPnBoeV9tYXNrKSB7CkBAIC0yNTcwLDM5ICsyNjkzLDM5IEBACiAJZWxzZQogCQlzdGF0c19jbGVhcl9tYXNrID0gMDsKIAotCXByaXYtPm5ldF9kZXZfc3RhdHMubXVsdGljYXN0ICs9IGVtYWNfcmVhZChFTUFDX1JYTUNBU1RGUkFNRVMpOworCW5kZXYtPnN0YXRzLm11bHRpY2FzdCArPSBlbWFjX3JlYWQoRU1BQ19SWE1DQVNURlJBTUVTKTsKIAllbWFjX3dyaXRlKEVNQUNfUlhNQ0FTVEZSQU1FUywgc3RhdHNfY2xlYXJfbWFzayk7CiAKLQlwcml2LT5uZXRfZGV2X3N0YXRzLmNvbGxpc2lvbnMgKz0gKGVtYWNfcmVhZChFTUFDX1RYQ09MTElTSU9OKSArCisJbmRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAoZW1hY19yZWFkKEVNQUNfVFhDT0xMSVNJT04pICsKIAkJCQkJICAgZW1hY19yZWFkKEVNQUNfVFhTSU5HTEVDT0xMKSArCiAJCQkJCSAgIGVtYWNfcmVhZChFTUFDX1RYTVVMVElDT0xMKSk7CiAJZW1hY193cml0ZShFTUFDX1RYQ09MTElTSU9OLCBzdGF0c19jbGVhcl9tYXNrKTsKIAllbWFjX3dyaXRlKEVNQUNfVFhTSU5HTEVDT0xMLCBzdGF0c19jbGVhcl9tYXNrKTsKIAllbWFjX3dyaXRlKEVNQUNfVFhNVUxUSUNPTEwsIHN0YXRzX2NsZWFyX21hc2spOwogCi0JcHJpdi0+bmV0X2Rldl9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IChlbWFjX3JlYWQoRU1BQ19SWE9WRVJTSVpFRCkgKworCW5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gKGVtYWNfcmVhZChFTUFDX1JYT1ZFUlNJWkVEKSArCiAJCQkJCQllbWFjX3JlYWQoRU1BQ19SWEpBQkJFUikgKwogCQkJCQkJZW1hY19yZWFkKEVNQUNfUlhVTkRFUlNJWkVEKSk7CiAJZW1hY193cml0ZShFTUFDX1JYT1ZFUlNJWkVELCBzdGF0c19jbGVhcl9tYXNrKTsKIAllbWFjX3dyaXRlKEVNQUNfUlhKQUJCRVIsIHN0YXRzX2NsZWFyX21hc2spOwogCWVtYWNfd3JpdGUoRU1BQ19SWFVOREVSU0laRUQsIHN0YXRzX2NsZWFyX21hc2spOwogCi0JcHJpdi0+bmV0X2Rldl9zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSAoZW1hY19yZWFkKEVNQUNfUlhTT0ZPVkVSUlVOUykgKworCW5kZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICs9IChlbWFjX3JlYWQoRU1BQ19SWFNPRk9WRVJSVU5TKSArCiAJCQkJCSAgICAgICBlbWFjX3JlYWQoRU1BQ19SWE1PRk9WRVJSVU5TKSk7CiAJZW1hY193cml0ZShFTUFDX1JYU09GT1ZFUlJVTlMsIHN0YXRzX2NsZWFyX21hc2spOwogCWVtYWNfd3JpdGUoRU1BQ19SWE1PRk9WRVJSVU5TLCBzdGF0c19jbGVhcl9tYXNrKTsKIAotCXByaXYtPm5ldF9kZXZfc3RhdHMucnhfZmlmb19lcnJvcnMgKz0gZW1hY19yZWFkKEVNQUNfUlhETUFPVkVSUlVOUyk7CisJbmRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMgKz0gZW1hY19yZWFkKEVNQUNfUlhETUFPVkVSUlVOUyk7CiAJZW1hY193cml0ZShFTUFDX1JYRE1BT1ZFUlJVTlMsIHN0YXRzX2NsZWFyX21hc2spOwogCi0JcHJpdi0+bmV0X2Rldl9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPQorCW5kZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICs9CiAJCWVtYWNfcmVhZChFTUFDX1RYQ0FSUklFUlNFTlNFKTsKIAllbWFjX3dyaXRlKEVNQUNfVFhDQVJSSUVSU0VOU0UsIHN0YXRzX2NsZWFyX21hc2spOwogCi0JcHJpdi0+bmV0X2Rldl9zdGF0cy50eF9maWZvX2Vycm9ycyA9IGVtYWNfcmVhZChFTUFDX1RYVU5ERVJSVU4pOworCW5kZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gZW1hY19yZWFkKEVNQUNfVFhVTkRFUlJVTik7CiAJZW1hY193cml0ZShFTUFDX1RYVU5ERVJSVU4sIHN0YXRzX2NsZWFyX21hc2spOwogCi0JcmV0dXJuICZwcml2LT5uZXRfZGV2X3N0YXRzOworCXJldHVybiAmbmRldi0+c3RhdHM7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZW1hY19uZXRkZXZfb3BzID0gewpAQCAtMjY3Nyw2ICsyODAwLDkgQEAKIAlwcml2LT5pbnRfZW5hYmxlID0gcGRhdGEtPmludGVycnVwdF9lbmFibGU7CiAJcHJpdi0+aW50X2Rpc2FibGUgPSBwZGF0YS0+aW50ZXJydXB0X2Rpc2FibGU7CiAKKwlwcml2LT5jb2FsX2ludHZsID0gMDsKKwlwcml2LT5idXNfZnJlcV9taHogPSAodTMyKShlbWFjX2J1c19mcmVxdWVuY3kgLyAxMDAwMDAwKTsKKwogCWVtYWNfZGV2ID0gJm5kZXYtPmRldjsKIAkvKiBHZXQgRU1BQyBwbGF0Zm9ybSBkYXRhICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IGJmNjZlOWIuLjQ0YzA2OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtMjA2MSwxOCArMjA2MSwzNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBkZXBjYV9tb2R1bGVfaW5pdCAodm9pZCkKIHsKLSAgICAgICAgaW50IGVyciA9IDA7CisJaW50IGVyciA9IDA7CiAKICNpZmRlZiBDT05GSUdfTUNBCi0gICAgICAgIGVyciA9IG1jYV9yZWdpc3Rlcl9kcml2ZXIgKCZkZXBjYV9tY2FfZHJpdmVyKTsKKwllcnIgPSBtY2FfcmVnaXN0ZXJfZHJpdmVyKCZkZXBjYV9tY2FfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKICNlbmRpZgogI2lmZGVmIENPTkZJR19FSVNBCi0gICAgICAgIGVyciB8PSBlaXNhX2RyaXZlcl9yZWdpc3RlciAoJmRlcGNhX2Vpc2FfZHJpdmVyKTsKKwllcnIgPSBlaXNhX2RyaXZlcl9yZWdpc3RlcigmZGVwY2FfZWlzYV9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21jYTsKICNlbmRpZgotCWVyciB8PSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgKCZkZXBjYV9pc2FfZHJpdmVyKTsKLQlkZXBjYV9wbGF0Zm9ybV9wcm9iZSAoKTsKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRlcGNhX2lzYV9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2Vpc2E7CiAKLSAgICAgICAgcmV0dXJuIGVycjsKKwlkZXBjYV9wbGF0Zm9ybV9wcm9iZSgpOworCXJldHVybiAwOworCitlcnJfZWlzYToKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIoJmRlcGNhX2Vpc2FfZHJpdmVyKTsKK2Vycl9tY2E6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUNBCisJbWNhX3VucmVnaXN0ZXJfZHJpdmVyKCZkZXBjYV9tY2FfZHJpdmVyKTsKK2VycjoKKyNlbmRpZgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkZXBjYV9tb2R1bGVfZXhpdCAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jIGIvZHJpdmVycy9uZXQvZG05MDAwLmMKaW5kZXggYWJjYzgzOC4uNGZkNmIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZG05MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvZG05MDAwLmMKQEAgLTk2MSw3ICs5NjEsNyBAQAogCXU4CVJ4UGt0UmVhZHk7CiAJdTgJUnhTdGF0dXM7CiAJX19sZTE2CVJ4TGVuOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogIFJlY2VpdmVkIGEgcGFja2V0IGFuZCBwYXNzIHRvIHVwcGVyIGxheWVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbmV0LmMgYi9kcml2ZXJzL25ldC9kbmV0LmMKaW5kZXggOGIwZjUwYi4uN2MwNzU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZG5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2RuZXQuYwpAQCAtNzk3LDcgKzc5Nyw3IEBACiAJaWYgKCFwaHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRuZXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTg1NCw3ICs4NTQsNyBAQAogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYnApKTsKIAlpZiAoIWRldikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJldGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dDsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2VfbWVtOwogCX0KIAogCS8qIFRPRE86IEFjdHVhbGx5LCB3ZSBoYXZlIHNvbWUgaW50ZXJlc3RpbmcgZmVhdHVyZXMuLi4gKi8KQEAgLTkxMSw3ICs5MTEsOCBAQAogCWlmIChlcnIpCiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgUEhZIGJvYXJkIGZpeHVwLlxuIik7CiAKLQlpZiAoZG5ldF9taWlfaW5pdChicCkgIT0gMCkKKwllcnIgPSBkbmV0X21paV9pbml0KGJwKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRGF2ZSBETkVUIGF0IDB4JXAgKDB4JTA4eCkgaXJxICVkICVwTVxuIiwKQEAgLTkzNiw2ICs5MzcsOCBAQAogCWlvdW5tYXAoYnAtPnJlZ3MpOwogZXJyX291dF9mcmVlX2RldjoKIAlmcmVlX25ldGRldihkZXYpOworZXJyX291dF9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtX2Jhc2UsIG1lbV9zaXplKTsKIGVycl9vdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCmluZGV4IDQwYjYyYjQuLjk5Mjg4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaApAQCAtODYsMTIgKzg2LDEyIEBACiAvKiBUWC9SWCBkZXNjcmlwdG9yIGRlZmluZXMgKi8KICNkZWZpbmUgRTEwMDBfREVGQVVMVF9UWEQgICAgICAgICAgICAgICAgICAyNTYKICNkZWZpbmUgRTEwMDBfTUFYX1RYRCAgICAgICAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgRTEwMDBfTUlOX1RYRCAgICAgICAgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgRTEwMDBfTUlOX1RYRCAgICAgICAgICAgICAgICAgICAgICAgNDgKICNkZWZpbmUgRTEwMDBfTUFYXzgyNTQ0X1RYRCAgICAgICAgICAgICAgIDQwOTYKIAogI2RlZmluZSBFMTAwMF9ERUZBVUxUX1JYRCAgICAgICAgICAgICAgICAgIDI1NgogI2RlZmluZSBFMTAwMF9NQVhfUlhEICAgICAgICAgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBFMTAwMF9NSU5fUlhEICAgICAgICAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBFMTAwMF9NSU5fUlhEICAgICAgICAgICAgICAgICAgICAgICA0OAogI2RlZmluZSBFMTAwMF9NQVhfODI1NDRfUlhEICAgICAgICAgICAgICAgNDA5NgogCiAjZGVmaW5lIEUxMDAwX01JTl9JVFJfVVNFQ1MJCTEwIC8qIDEwMDAwMCBpcnEvc2VjICovCkBAIC0zMjQsMTggKzMyNCwyMCBAQAogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplMTAwMF9nZXRfaHdfZGV2KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogI2RlZmluZSBlX2RiZyhmb3JtYXQsIGFyZy4uLikgXAogCW5ldGRldl9kYmcoZTEwMDBfZ2V0X2h3X2RldihodyksIGZvcm1hdCwgIyMgYXJnKQotI2RlZmluZSBlX2Vycihmb3JtYXQsIGFyZy4uLikgXAotCW5ldGRldl9lcnIoYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgZV9pbmZvKGZvcm1hdCwgYXJnLi4uKSBcCi0JbmV0ZGV2X2luZm8oYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgZV93YXJuKGZvcm1hdCwgYXJnLi4uKSBcCi0JbmV0ZGV2X3dhcm4oYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgZV9ub3RpY2UoZm9ybWF0LCBhcmcuLi4pIFwKLQluZXRkZXZfbm90aWNlKGFkYXB0ZXItPm5ldGRldiwgZm9ybWF0LCAjIyBhcmcpCisjZGVmaW5lIGVfZXJyKG1zZ2x2bCwgZm9ybWF0LCBhcmcuLi4pIFwKKwluZXRpZl9lcnIoYWRhcHRlciwgbXNnbHZsLCBhZGFwdGVyLT5uZXRkZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX2luZm8obXNnbHZsLCBmb3JtYXQsIGFyZy4uLikgXAorCW5ldGlmX2luZm8oYWRhcHRlciwgbXNnbHZsLCBhZGFwdGVyLT5uZXRkZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX3dhcm4obXNnbHZsLCBmb3JtYXQsIGFyZy4uLikgXAorCW5ldGlmX3dhcm4oYWRhcHRlciwgbXNnbHZsLCBhZGFwdGVyLT5uZXRkZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX25vdGljZShtc2dsdmwsIGZvcm1hdCwgYXJnLi4uKSBcCisJbmV0aWZfbm90aWNlKGFkYXB0ZXIsIG1zZ2x2bCwgYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKICNkZWZpbmUgZV9kZXZfaW5mbyhmb3JtYXQsIGFyZy4uLikgXAogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsIGZvcm1hdCwgIyMgYXJnKQogI2RlZmluZSBlX2Rldl93YXJuKGZvcm1hdCwgYXJnLi4uKSBcCiAJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgZm9ybWF0LCAjIyBhcmcpCisjZGVmaW5lIGVfZGV2X2Vycihmb3JtYXQsIGFyZy4uLikgXAorCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgZm9ybWF0LCAjIyBhcmcpCiAKIGV4dGVybiBjaGFyIGUxMDAwX2RyaXZlcl9uYW1lW107CiBleHRlcm4gY29uc3QgY2hhciBlMTAwMF9kcml2ZXJfdmVyc2lvbltdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCmluZGV4IGQ1ZmYwMjkuLmY0ZDA5MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCiAJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU082OwogCi0JZV9pbmZvKCJUU08gaXMgJXNcbiIsIGRhdGEgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKwllX2luZm8ocHJvYmUsICJUU08gaXMgJXNcbiIsIGRhdGEgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKIAlhZGFwdGVyLT50c29fZm9yY2UgPSB0cnVlOwogCXJldHVybiAwOwogfQpAQCAtNzE0LDkgKzcxNCw5IEBACiAJCXdyaXRlbCh3cml0ZSAmIHRlc3RbaV0sIGFkZHJlc3MpOwogCQlyZWFkID0gcmVhZGwoYWRkcmVzcyk7CiAJCWlmIChyZWFkICE9ICh3cml0ZSAmIHRlc3RbaV0gJiBtYXNrKSkgewotCQkJZV9pbmZvKCJwYXR0ZXJuIHRlc3QgcmVnICUwNFggZmFpbGVkOiAiCi0JCQkgICAgICAgImdvdCAweCUwOFggZXhwZWN0ZWQgMHglMDhYXG4iLAotCQkJICAgICAgIHJlZywgcmVhZCwgKHdyaXRlICYgdGVzdFtpXSAmIG1hc2spKTsKKwkJCWVfZXJyKGRydiwgInBhdHRlcm4gdGVzdCByZWcgJTA0WCBmYWlsZWQ6ICIKKwkJCSAgICAgICJnb3QgMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwKKwkJCSAgICAgIHJlZywgcmVhZCwgKHdyaXRlICYgdGVzdFtpXSAmIG1hc2spKTsKIAkJCSpkYXRhID0gcmVnOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KQEAgLTczNCw3ICs3MzQsNyBAQAogCXdyaXRlbCh3cml0ZSAmIG1hc2ssIGFkZHJlc3MpOwogCXJlYWQgPSByZWFkbChhZGRyZXNzKTsKIAlpZiAoKHJlYWQgJiBtYXNrKSAhPSAod3JpdGUgJiBtYXNrKSkgewotCQllX2Vycigic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiAiCisJCWVfZXJyKGRydiwgInNldC9jaGVjayByZWcgJTA0WCB0ZXN0IGZhaWxlZDogIgogCQkgICAgICAiZ290IDB4JTA4WCBleHBlY3RlZCAweCUwOFhcbiIsCiAJCSAgICAgIHJlZywgKHJlYWQgJiBtYXNrKSwgKHdyaXRlICYgbWFzaykpOwogCQkqZGF0YSA9IHJlZzsKQEAgLTc3OSw3ICs3NzksNyBAQAogCWV3MzIoU1RBVFVTLCB0b2dnbGUpOwogCWFmdGVyID0gZXIzMihTVEFUVVMpICYgdG9nZ2xlOwogCWlmICh2YWx1ZSAhPSBhZnRlcikgewotCQllX2VycigiZmFpbGVkIFNUQVRVUyByZWdpc3RlciB0ZXN0IGdvdDogIgorCQllX2VycihkcnYsICJmYWlsZWQgU1RBVFVTIHJlZ2lzdGVyIHRlc3QgZ290OiAiCiAJCSAgICAgICIweCUwOFggZXhwZWN0ZWQ6IDB4JTA4WFxuIiwgYWZ0ZXIsIHZhbHVlKTsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gMTsKQEAgLTg5NCw3ICs4OTQsOCBAQAogCQkqZGF0YSA9IDE7CiAJCXJldHVybiAtMTsKIAl9Ci0JZV9pbmZvKCJ0ZXN0aW5nICVzIGludGVycnVwdFxuIiwgKHNoYXJlZF9pbnQgPyAic2hhcmVkIiA6ICJ1bnNoYXJlZCIpKTsKKwllX2luZm8oaHcsICJ0ZXN0aW5nICVzIGludGVycnVwdFxuIiwgKHNoYXJlZF9pbnQgPworCSAgICAgICAic2hhcmVkIiA6ICJ1bnNoYXJlZCIpKTsKIAogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCiAJZXczMihJTUMsIDB4RkZGRkZGRkYpOwpAQCAtMTU2MSw3ICsxNTYyLDcgQEAKIAkJdTggZm9yY2VkX3NwZWVkX2R1cGxleCA9IGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4OwogCQl1OCBhdXRvbmVnID0gaHctPmF1dG9uZWc7CiAKLQkJZV9pbmZvKCJvZmZsaW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOworCQllX2luZm8oaHcsICJvZmZsaW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOwogCiAJCS8qIExpbmsgdGVzdCBwZXJmb3JtZWQgYmVmb3JlIGhhcmR3YXJlIHJlc2V0IHNvIGF1dG9uZWcgZG9lc24ndAogCQkgKiBpbnRlcmZlcmUgd2l0aCB0ZXN0IHJlc3VsdCAqLwpAQCAtMTYwMSw3ICsxNjAyLDcgQEAKIAkJaWYgKGlmX3J1bm5pbmcpCiAJCQlkZXZfb3BlbihuZXRkZXYpOwogCX0gZWxzZSB7Ci0JCWVfaW5mbygib25saW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOworCQllX2luZm8oaHcsICJvbmxpbmUgdGVzdGluZyBzdGFydGluZ1xuIik7CiAJCS8qIE9ubGluZSB0ZXN0cyAqLwogCQlpZiAoZTEwMDBfbGlua190ZXN0KGFkYXB0ZXIsICZkYXRhWzRdKSkKIAkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CkBAIC0xNjk0LDggKzE2OTUsOCBAQAogCQl3b2wtPnN1cHBvcnRlZCAmPSB+V0FLRV9VQ0FTVDsKIAogCQlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19FWCkKLQkJCWVfZXJyKCJJbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCSAgICAgICAgImRpcmVjdGVkICh1bmljYXN0KSBmcmFtZSB3YWtlLXVwIHBhY2tldHNcbiIpOworCQkJZV9lcnIoZHJ2LCAiSW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0ZWQgIgorCQkJICAgICAgIih1bmljYXN0KSBmcmFtZSB3YWtlLXVwIHBhY2tldHNcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTE3MjYsOCArMTcyNyw4IEBACiAJc3dpdGNoIChody0+ZGV2aWNlX2lkKSB7CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzOgogCQlpZiAod29sLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkgewotCQkJZV9lcnIoIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0ICIKLQkJCSAgICAgICJkaXJlY3RlZCAodW5pY2FzdCkgZnJhbWUgd2FrZS11cCBwYWNrZXRzXG4iKTsKKwkJCWVfZXJyKGRydiwgIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdGVkICIKKwkJCSAgICAgICIodW5pY2FzdCkgZnJhbWUgd2FrZS11cCBwYWNrZXRzXG4iKTsKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCA2OGE4MDg5Li4wMjgzM2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0yNzUsNyArMjc1LDcgQEAKIAllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGhhbmRsZXIsIGlycV9mbGFncywgbmV0ZGV2LT5uYW1lLAogCSAgICAgICAgICAgICAgICAgIG5ldGRldik7CiAJaWYgKGVycikgewotCQllX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCBFcnJvcjogJWRcbiIsIGVycik7CisJCWVfZXJyKHByb2JlLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCBFcnJvcjogJWRcbiIsIGVycik7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTY1Nyw3ICs2NTcsNyBAQAogCQlldzMyKFdVQywgMCk7CiAKIAlpZiAoZTEwMDBfaW5pdF9odyhodykpCi0JCWVfZXJyKCJIYXJkd2FyZSBFcnJvclxuIik7CisJCWVfZGV2X2VycigiSGFyZHdhcmUgRXJyb3JcbiIpOwogCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKIAogCS8qIGlmIChhZGFwdGVyLT5od2ZsYWdzICYgSFdGTEFHU19QSFlfUFdSX0JJVCkgeyAqLwpAQCAtOTI1LDcgKzkyNSw3IEBACiAKIAkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCiAJaWYgKGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhodykpIHsKLQkJZV9lcnIoIkVFUFJPTSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQllX2Vycihwcm9iZSwgIkVFUFJPTSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9lZXByb207CiAJfQogCkBAIC05MzYsNyArOTM2LDcgQEAKIAogCS8qIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGlzIGdvb2QgKi8KIAlpZiAoZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKGh3KSA8IDApIHsKLQkJZV9lcnIoIlRoZSBFRVBST00gQ2hlY2tzdW0gSXMgTm90IFZhbGlkXG4iKTsKKwkJZV9lcnIocHJvYmUsICJUaGUgRUVQUk9NIENoZWNrc3VtIElzIE5vdCBWYWxpZFxuIik7CiAJCWUxMDAwX2R1bXBfZWVwcm9tKGFkYXB0ZXIpOwogCQkvKgogCQkgKiBzZXQgTUFDIGFkZHJlc3MgdG8gYWxsIHplcm9lcyB0byBpbnZhbGlkYXRlIGFuZCB0ZW1wb3JhcnkKQEAgLTk1MCwxNCArOTUwLDE0IEBACiAJfSBlbHNlIHsKIAkJLyogY29weSB0aGUgTUFDIGFkZHJlc3Mgb3V0IG9mIHRoZSBFRVBST00gKi8KIAkJaWYgKGUxMDAwX3JlYWRfbWFjX2FkZHIoaHcpKQotCQkJZV9lcnIoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKwkJCWVfZXJyKHByb2JlLCAiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOwogCX0KIAkvKiBkb24ndCBibG9jayBpbml0YWxpemF0aW9uIGhlcmUgZHVlIHRvIGJhZCBNQUMgYWRkcmVzcyAqLwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBody0+bWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOwogCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgaHctPm1hY19hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpCi0JCWVfZXJyKCJJbnZhbGlkIE1BQyBBZGRyZXNzXG4iKTsKKwkJZV9lcnIocHJvYmUsICJJbnZhbGlkIE1BQyBBZGRyZXNzXG4iKTsKIAogCWUxMDAwX2dldF9idXNfaW5mbyhodyk7CiAKQEAgLTEwNDcsNyArMTA0Nyw3IEBACiAJCWdvdG8gZXJyX3JlZ2lzdGVyOwogCiAJLyogcHJpbnQgYnVzIHR5cGUvc3BlZWQvd2lkdGggaW5mbyAqLwotCWVfaW5mbygiKFBDSSVzOiVkTUh6OiVkLWJpdCkgJXBNXG4iLAorCWVfaW5mbyhwcm9iZSwgIihQQ0klczolZE1IejolZC1iaXQpICVwTVxuIiwKIAkgICAgICAgKChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpeCkgPyAiLVgiIDogIiIpLAogCSAgICAgICAoKGh3LT5idXNfc3BlZWQgPT0gZTEwMDBfYnVzX3NwZWVkXzEzMykgPyAxMzMgOgogCQkoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfMTIwKSA/IDEyMCA6CkBAIC0xMDU5LDcgKzEwNTksNyBAQAogCS8qIGNhcnJpZXIgb2ZmIHJlcG9ydGluZyBpcyBpbXBvcnRhbnQgdG8gZXRodG9vbCBldmVuIEJFRk9SRSBvcGVuICovCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAotCWVfaW5mbygiSW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBDb25uZWN0aW9uXG4iKTsKKwllX2luZm8ocHJvYmUsICJJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIENvbm5lY3Rpb25cbiIpOwogCiAJY2FyZHNfZm91bmQrKzsKIAlyZXR1cm4gMDsKQEAgLTExNTksNyArMTE1OSw3IEBACiAJLyogaWRlbnRpZnkgdGhlIE1BQyAqLwogCiAJaWYgKGUxMDAwX3NldF9tYWNfdHlwZShodykpIHsKLQkJZV9lcnIoIlVua25vd24gTUFDIFR5cGVcbiIpOworCQllX2Vycihwcm9iZSwgIlVua25vd24gTUFDIFR5cGVcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTExOTIsNyArMTE5Miw3IEBACiAJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IDE7CiAKIAlpZiAoZTEwMDBfYWxsb2NfcXVldWVzKGFkYXB0ZXIpKSB7Ci0JCWVfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZXNcbiIpOworCQllX2Vycihwcm9iZSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTM4Niw3ICsxMzg2LDggQEAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpICogdHhkci0+Y291bnQ7CiAJdHhkci0+YnVmZmVyX2luZm8gPSB2bWFsbG9jKHNpemUpOwogCWlmICghdHhkci0+YnVmZmVyX2luZm8pIHsKLQkJZV9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQllX2Vycihwcm9iZSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBkZXNjcmlwdG9yICIKKwkJICAgICAgInJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtc2V0KHR4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKQEAgLTE0MDEsNyArMTQwMiw4IEBACiAJaWYgKCF0eGRyLT5kZXNjKSB7CiBzZXR1cF90eF9kZXNjX2RpZToKIAkJdmZyZWUodHhkci0+YnVmZmVyX2luZm8pOwotCQllX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFR4IGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCWVfZXJyKHByb2JlLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFR4IGRlc2NyaXB0b3IgIgorCQkgICAgICAicmluZ1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTQwOSw3ICsxNDExLDcgQEAKIAlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCB0eGRyLT5kZXNjLCB0eGRyLT5zaXplKSkgewogCQl2b2lkICpvbGRkZXNjID0gdHhkci0+ZGVzYzsKIAkJZG1hX2FkZHJfdCBvbGRkbWEgPSB0eGRyLT5kbWE7Ci0JCWVfZXJyKCJ0eGRyIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJXBcbiIsCisJCWVfZXJyKHR4X2VyciwgInR4ZHIgYWxpZ24gY2hlY2sgZmFpbGVkOiAldSBieXRlcyBhdCAlcFxuIiwKIAkJICAgICAgdHhkci0+c2l6ZSwgdHhkci0+ZGVzYyk7CiAJCS8qIFRyeSBhZ2Fpbiwgd2l0aG91dCBmcmVlaW5nIHRoZSBwcmV2aW91cyAqLwogCQl0eGRyLT5kZXNjID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIHR4ZHItPnNpemUsCkBAIC0xNDI3LDcgKzE0MjksNyBAQAogCQkJCQkgIHR4ZHItPmRtYSk7CiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCB0eGRyLT5zaXplLCBvbGRkZXNjLAogCQkJCQkgIG9sZGRtYSk7Ci0JCQllX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGFsaWduZWQgbWVtb3J5ICIKKwkJCWVfZXJyKHByb2JlLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGFsaWduZWQgbWVtb3J5ICIKIAkJCSAgICAgICJmb3IgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ1xuIik7CiAJCQl2ZnJlZSh0eGRyLT5idWZmZXJfaW5mbyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0NjAsNyArMTQ2Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgewogCQllcnIgPSBlMTAwMF9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnR4X3JpbmdbaV0pOwogCQlpZiAoZXJyKSB7Ci0JCQllX2VycigiQWxsb2NhdGlvbiBmb3IgVHggUXVldWUgJXUgZmFpbGVkXG4iLCBpKTsKKwkJCWVfZXJyKHByb2JlLCAiQWxsb2NhdGlvbiBmb3IgVHggUXVldWUgJXUgZmFpbGVkXG4iLCBpKTsKIAkJCWZvciAoaS0tIDsgaSA+PSAwOyBpLS0pCiAJCQkJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlciwKIAkJCQkJCQkmYWRhcHRlci0+dHhfcmluZ1tpXSk7CkBAIC0xNTgwLDcgKzE1ODIsOCBAQAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikgKiByeGRyLT5jb3VudDsKIAlyeGRyLT5idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CiAJaWYgKCFyeGRyLT5idWZmZXJfaW5mbykgewotCQllX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFJ4IGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCWVfZXJyKHByb2JlLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFJ4IGRlc2NyaXB0b3IgIgorCQkgICAgICAicmluZ1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQocnhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOwpAQCAtMTU5Niw3ICsxNTk5LDggQEAKIAkJCQkJR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXJ4ZHItPmRlc2MpIHsKLQkJZV9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBSeCBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQllX2Vycihwcm9iZSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBSeCBkZXNjcmlwdG9yICIKKwkJICAgICAgInJpbmdcbiIpOwogc2V0dXBfcnhfZGVzY19kaWU6CiAJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjA2LDcgKzE2MTAsNyBAQAogCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsIHJ4ZHItPmRlc2MsIHJ4ZHItPnNpemUpKSB7CiAJCXZvaWQgKm9sZGRlc2MgPSByeGRyLT5kZXNjOwogCQlkbWFfYWRkcl90IG9sZGRtYSA9IHJ4ZHItPmRtYTsKLQkJZV9lcnIoInJ4ZHIgYWxpZ24gY2hlY2sgZmFpbGVkOiAldSBieXRlcyBhdCAlcFxuIiwKKwkJZV9lcnIocnhfZXJyLCAicnhkciBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAogCQkgICAgICByeGRyLT5zaXplLCByeGRyLT5kZXNjKTsKIAkJLyogVHJ5IGFnYWluLCB3aXRob3V0IGZyZWVpbmcgdGhlIHByZXZpb3VzICovCiAJCXJ4ZHItPmRlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgcnhkci0+c2l6ZSwKQEAgLTE2MTUsOCArMTYxOSw4IEBACiAJCWlmICghcnhkci0+ZGVzYykgewogCQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgcnhkci0+c2l6ZSwgb2xkZGVzYywKIAkJCQkJICBvbGRkbWEpOwotCQkJZV9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBSeCBkZXNjcmlwdG9yICIKLQkJCSAgICAgICJyaW5nXG4iKTsKKwkJCWVfZXJyKHByb2JlLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFJ4ICIKKwkJCSAgICAgICJkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQkJZ290byBzZXR1cF9yeF9kZXNjX2RpZTsKIAkJfQogCkBAIC0xNjI2LDggKzE2MzAsOCBAQAogCQkJCQkgIHJ4ZHItPmRtYSk7CiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCByeGRyLT5zaXplLCBvbGRkZXNjLAogCQkJCQkgIG9sZGRtYSk7Ci0JCQllX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGFsaWduZWQgbWVtb3J5IGZvciB0aGUgUnggIgotCQkJICAgICAgImRlc2NyaXB0b3IgcmluZ1xuIik7CisJCQllX2Vycihwcm9iZSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBhbGlnbmVkIG1lbW9yeSBmb3IgIgorCQkJICAgICAgInRoZSBSeCBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQkJZ290byBzZXR1cF9yeF9kZXNjX2RpZTsKIAkJfSBlbHNlIHsKIAkJCS8qIEZyZWUgb2xkIGFsbG9jYXRpb24sIG5ldyBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsICovCkBAIC0xNjU5LDcgKzE2NjMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspIHsKIAkJZXJyID0gZTEwMDBfc2V0dXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9yaW5nW2ldKTsKIAkJaWYgKGVycikgewotCQkJZV9lcnIoIkFsbG9jYXRpb24gZm9yIFJ4IFF1ZXVlICV1IGZhaWxlZFxuIiwgaSk7CisJCQllX2Vycihwcm9iZSwgIkFsbG9jYXRpb24gZm9yIFJ4IFF1ZXVlICV1IGZhaWxlZFxuIiwgaSk7CiAJCQlmb3IgKGktLSA7IGkgPj0gMDsgaS0tKQogCQkJCWUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsCiAJCQkJCQkJJmFkYXB0ZXItPnJ4X3JpbmdbaV0pOwpAQCAtMjExMCw3ICsyMTE0LDcgQEAKIAl1MzIgKm1jYXJyYXkgPSBrY2FsbG9jKG10YV9yZWdfY291bnQsIHNpemVvZih1MzIpLCBHRlBfQVRPTUlDKTsKIAogCWlmICghbWNhcnJheSkgewotCQllX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZV9lcnIocHJvYmUsICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNjQ4LDcgKzI2NTIsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAodW5saWtlbHkobmV0X3JhdGVsaW1pdCgpKSkKLQkJCWVfd2FybigiY2hlY2tzdW1fcGFydGlhbCBwcm90bz0leCFcbiIsIHNrYi0+cHJvdG9jb2wpOworCQkJZV93YXJuKGRydiwgImNoZWNrc3VtX3BhcnRpYWwgcHJvdG89JXghXG4iLAorCQkJICAgICAgIHNrYi0+cHJvdG9jb2wpOwogCQlicmVhazsKIAl9CiAKQEAgLTI5OTIsNyArMjk5Nyw4IEBACiAJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQkJcHVsbF9zaXplID0gbWluKCh1bnNpZ25lZCBpbnQpNCwgc2tiLT5kYXRhX2xlbik7CiAJCQkJaWYgKCFfX3Bza2JfcHVsbF90YWlsKHNrYiwgcHVsbF9zaXplKSkgewotCQkJCQllX2VycigiX19wc2tiX3B1bGxfdGFpbCBmYWlsZWQuXG4iKTsKKwkJCQkJZV9lcnIoZHJ2LCAiX19wc2tiX3B1bGxfdGFpbCAiCisJCQkJCSAgICAgICJmYWlsZWQuXG4iKTsKIAkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJCQl9CkBAIC0zMTQwLDcgKzMxNDYsNyBAQAogCiAJaWYgKChtYXhfZnJhbWUgPCBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUpIHx8CiAJICAgIChtYXhfZnJhbWUgPiBNQVhfSlVNQk9fRlJBTUVfU0laRSkpIHsKLQkJZV9lcnIoIkludmFsaWQgTVRVIHNldHRpbmdcbiIpOworCQllX2Vycihwcm9iZSwgIkludmFsaWQgTVRVIHNldHRpbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMxNDgsNyArMzE1NCw3IEBACiAJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKIAljYXNlIGUxMDAwX3VuZGVmaW5lZCAuLi4gZTEwMDBfODI1NDJfcmV2Ml8xOgogCQlpZiAobWF4X2ZyYW1lID4gKEVUSF9GUkFNRV9MRU4gKyBFVEhfRkNTX0xFTikpIHsKLQkJCWVfZXJyKCJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJZV9lcnIocHJvYmUsICJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CkBAIC0zNTAwLDcgKzM1MDYsNyBAQAogCQkgICAgIShlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfVFhPRkYpKSB7CiAKIAkJCS8qIGRldGVjdGVkIFR4IHVuaXQgaGFuZyAqLwotCQkJZV9lcnIoIkRldGVjdGVkIFR4IFVuaXQgSGFuZ1xuIgorCQkJZV9lcnIoZHJ2LCAiRGV0ZWN0ZWQgVHggVW5pdCBIYW5nXG4iCiAJCQkgICAgICAiICBUeCBRdWV1ZSAgICAgICAgICAgICA8JWx1PlxuIgogCQkJICAgICAgIiAgVERIICAgICAgICAgICAgICAgICAgPCV4PlxuIgogCQkJICAgICAgIiAgVERUICAgICAgICAgICAgICAgICAgPCV4PlxuIgpAQCAtMzc0OSw3ICszNzU1LDcgQEAKIAogCQkvKiBldGggdHlwZSB0cmFucyBuZWVkcyBza2ItPmRhdGEgdG8gcG9pbnQgdG8gc29tZXRoaW5nICovCiAJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkgewotCQkJZV9lcnIoInBza2JfbWF5X3B1bGwgZmFpbGVkLlxuIik7CisJCQllX2VycihkcnYsICJwc2tiX21heV9wdWxsIGZhaWxlZC5cbiIpOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJZ290byBuZXh0X2Rlc2M7CiAJCX0KQEAgLTM4NzQsNyArMzg4MCw3IEBACiAKIAkJaWYgKGFkYXB0ZXItPmRpc2NhcmRpbmcpIHsKIAkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLwotCQkJZV9pbmZvKCJSZWNlaXZlIHBhY2tldCBjb25zdW1lZCBtdWx0aXBsZSBidWZmZXJzXG4iKTsKKwkJCWVfZGJnKCJSZWNlaXZlIHBhY2tldCBjb25zdW1lZCBtdWx0aXBsZSBidWZmZXJzXG4iKTsKIAkJCS8qIHJlY3ljbGUgKi8KIAkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CiAJCQlpZiAoc3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfRU9QKQpAQCAtMzk4Niw4ICszOTkyLDggQEAKIAkJLyogRml4IGZvciBlcnJhdGEgMjMsIGNhbid0IGNyb3NzIDY0a0IgYm91bmRhcnkgKi8KIAkJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgc2tiLT5kYXRhLCBidWZzeikpIHsKIAkJCXN0cnVjdCBza19idWZmICpvbGRza2IgPSBza2I7Ci0JCQllX2Vycigic2tiIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJXBcbiIsCi0JCQkgICAgICBidWZzeiwgc2tiLT5kYXRhKTsKKwkJCWVfZXJyKHJ4X2VyciwgInNrYiBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICIKKwkJCSAgICAgICIlcFxuIiwgYnVmc3osIHNrYi0+ZGF0YSk7CiAJCQkvKiBUcnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KIAkJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0ZGV2LCBidWZzeik7CiAJCQkvKiBGYWlsZWQgYWxsb2NhdGlvbiwgY3JpdGljYWwgZmFpbHVyZSAqLwpAQCAtNDA5NSw4ICs0MTAxLDggQEAKIAkJLyogRml4IGZvciBlcnJhdGEgMjMsIGNhbid0IGNyb3NzIDY0a0IgYm91bmRhcnkgKi8KIAkJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgc2tiLT5kYXRhLCBidWZzeikpIHsKIAkJCXN0cnVjdCBza19idWZmICpvbGRza2IgPSBza2I7Ci0JCQllX2Vycigic2tiIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJXBcbiIsCi0JCQkgICAgICBidWZzeiwgc2tiLT5kYXRhKTsKKwkJCWVfZXJyKHJ4X2VyciwgInNrYiBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICIKKwkJCSAgICAgICIlcFxuIiwgYnVmc3osIHNrYi0+ZGF0YSk7CiAJCQkvKiBUcnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KIAkJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0ZGV2LCBidWZzeik7CiAJCQkvKiBGYWlsZWQgYWxsb2NhdGlvbiwgY3JpdGljYWwgZmFpbHVyZSAqLwpAQCAtNDE0MSw4ICs0MTQ3LDggQEAKIAkJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwKIAkJCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylidWZmZXJfaW5mby0+ZG1hLAogCQkJCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuKSkgewotCQkJZV9lcnIoImRtYSBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAotCQkJICAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKKwkJCWVfZXJyKHJ4X2VyciwgImRtYSBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICIKKwkJCSAgICAgICIlcFxuIiwgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKIAkJCSAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnVmZmVyX2luZm8tPmRtYSk7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKQEAgLTQzNTUsNyArNDM2MSw3IEBACiAJaW50IHJldF92YWwgPSBwY2lfc2V0X213aShhZGFwdGVyLT5wZGV2KTsKIAogCWlmIChyZXRfdmFsKQotCQllX2VycigiRXJyb3IgaW4gc2V0dGluZyBNV0lcbiIpOworCQllX2Vycihwcm9iZSwgIkVycm9yIGluIHNldHRpbmcgTVdJXG4iKTsKIH0KIAogdm9pZCBlMTAwMF9wY2lfY2xlYXJfbXdpKHN0cnVjdCBlMTAwMF9odyAqaHcpCkBAIC00NDg2LDcgKzQ0OTIsNyBAQAogCS8qIEZpYmVyIE5JQ3Mgb25seSBhbGxvdyAxMDAwIGdicHMgRnVsbCBkdXBsZXggKi8KIAlpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCiAJCXNwZGRwbHggIT0gKFNQRUVEXzEwMDAgKyBEVVBMRVhfRlVMTCkpIHsKLQkJZV9lcnIoIlVuc3VwcG9ydGVkIFNwZWVkL0R1cGxleCBjb25maWd1cmF0aW9uXG4iKTsKKwkJZV9lcnIocHJvYmUsICJVbnN1cHBvcnRlZCBTcGVlZC9EdXBsZXggY29uZmlndXJhdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDUwOSw3ICs0NTE1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBTUEVFRF8xMDAwICsgRFVQTEVYX0hBTEY6IC8qIG5vdCBzdXBwb3J0ZWQgKi8KIAlkZWZhdWx0OgotCQllX2VycigiVW5zdXBwb3J0ZWQgU3BlZWQvRHVwbGV4IGNvbmZpZ3VyYXRpb25cbiIpOworCQllX2Vycihwcm9iZSwgIlVuc3VwcG9ydGVkIFNwZWVkL0R1cGxleCBjb25maWd1cmF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYwppbmRleCBmNjU0ZGI5Li5hNGEwZDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oIGIvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaAppbmRleCA0ZGMwMmM3Li4zMDdhNzJmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCBQUk8vMTAwMCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTM1OSw2ICszNTksNyBAQAogI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9MQ0RfV1JJVEVfRU5BQkxFICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfT0VNX1dSSVRFX0VOQUJMRSAgICAgICAweDAwMDAwMDA4CiAjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRyAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9HQVRFX1BIWV9DRkcgICAgICAgICAgIDB4MDAwMDAwODAKICNkZWZpbmUgRTEwMDBfRVhUQ05GX1NJWkVfRVhUX1BDSUVfTEVOR1RIX01BU0sgICAweDAwRkYwMDAwCiAjZGVmaW5lIEUxMDAwX0VYVENORl9TSVpFX0VYVF9QQ0lFX0xFTkdUSF9TSElGVCAgICAgICAgICAxNgogI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9FWFRfQ05GX1BPSU5URVJfTUFTSyAgIDB4MEZGRjAwMDAKQEAgLTcxNCw2ICs3MTUsNyBAQAogI2RlZmluZSBCTUUxMDAwX0VfUEhZX0lEX1IyICAweDAxNDEwQ0IxCiAjZGVmaW5lIEk4MjU3N19FX1BIWV9JRCAgICAgIDB4MDE1NDAwNTAKICNkZWZpbmUgSTgyNTc4X0VfUEhZX0lEICAgICAgMHgwMDRERDA0MAorI2RlZmluZSBJODI1NzlfRV9QSFlfSUQgICAgICAweDAxNTQwMDkwCiAKIC8qIE04OEUxMDAwIFNwZWNpZmljIFJlZ2lzdGVycyAqLwogI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19DVFJMICAgICAweDEwICAvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaAppbmRleCBjMGIzZGI0Li5mOWEzMWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xNjQsNiArMTY0LDcgQEAKIAlib2FyZF9pY2g5bGFuLAogCWJvYXJkX2ljaDEwbGFuLAogCWJvYXJkX3BjaGxhbiwKKwlib2FyZF9wY2gybGFuLAogfTsKIAogc3RydWN0IGUxMDAwX3F1ZXVlX3N0YXRzIHsKQEAgLTM0Nyw2ICszNDgsNyBAQAogCXUzMiB0ZXN0X2ljcjsKIAogCXUzMiBtc2dfZW5hYmxlOworCXVuc2lnbmVkIGludCBudW1fdmVjdG9yczsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwogCWludCBpbnRfbW9kZTsKIAl1MzIgZWlhY19tYXNrOwpAQCAtNDIxLDYgKzQyMyw4IEBACiAjZGVmaW5lIEZMQUcyX0hBU19QSFlfV0FLRVVQICAgICAgICAgICAgICAoMSA8PCAxKQogI2RlZmluZSBGTEFHMl9JU19ESVNDQVJESU5HICAgICAgICAgICAgICAgKDEgPDwgMikKICNkZWZpbmUgRkxBRzJfRElTQUJMRV9BU1BNX0wxICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEZMQUcyX0hBU19QSFlfU1RBVFMgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBGTEFHMl9IQVNfRUVFICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKIAogI2RlZmluZSBFMTAwMF9SWF9ERVNDX1BTKFIsIGkpCSAgICBcCiAJKCYoKCh1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCAqKSgoUikuZGVzYykpW2ldKSkKQEAgLTQ1OCw3ICs0NjIsNiBAQAogZXh0ZXJuIHZvaWQgZTEwMDBlX2ZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIGUxMDAwZV9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCBlMTAwMGVfdXBkYXRlX3N0YXRzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKLWV4dGVybiBib29sIGUxMDAwZV9oYXNfbGluayhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCBlMTAwMGVfc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIGUxMDAwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCBlMTAwMGVfZGlzYWJsZV9hc3BtKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MTYgc3RhdGUpOwpAQCAtNDc2LDYgKzQ3OSw3IEBACiBleHRlcm4gc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfaWNoOV9pbmZvOwogZXh0ZXJuIHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwX2ljaDEwX2luZm87CiBleHRlcm4gc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfcGNoX2luZm87CitleHRlcm4gc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfcGNoMl9pbmZvOwogZXh0ZXJuIHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwX2VzMl9pbmZvOwogCiBleHRlcm4gczMyIGUxMDAwZV9yZWFkX3BiYV9udW0oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpwYmFfbnVtKTsKQEAgLTQ5NCw2ICs0OTgsOCBAQAogZXh0ZXJuIHZvaWQgZTEwMDBlX2dpZ19kb3duc2hpZnRfd29ya2Fyb3VuZF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHZvaWQgZTEwMDBlX2Rpc2FibGVfZ2lnX3dvbF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMF9jb25maWd1cmVfazFfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGsxX2VuYWJsZSk7CitleHRlcm4gczMyIGUxMDAwX2x2X2p1bWJvX3dvcmthcm91bmRfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGVuYWJsZSk7CitleHRlcm4gdm9pZCBlMTAwMF9jb3B5X3J4X2FkZHJzX3RvX3BoeV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiBleHRlcm4gczMyIGUxMDAwZV9jaGVja19mb3JfY29wcGVyX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gczMyIGUxMDAwZV9jaGVja19mb3JfZmliZXJfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYwppbmRleCAzOGQ3OWE2Li40NWFlYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCBQUk8vMTAwMCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jCmluZGV4IDJjNTIxMjEuLjYzNTVhMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2V0aHRvb2wuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMTgsNyArMTE4LDYgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgc3RhdHVzOwogCiAJaWYgKGh3LT5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCkBAIC0xNTYsMjIgKzE1NSwyOSBAQAogCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CiAJfQogCi0Jc3RhdHVzID0gZXIzMihTVEFUVVMpOwotCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpIHsKLQkJaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwKQotCQkJZWNtZC0+c3BlZWQgPSAxMDAwOwotCQllbHNlIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKQotCQkJZWNtZC0+c3BlZWQgPSAxMDA7Ci0JCWVsc2UKLQkJCWVjbWQtPnNwZWVkID0gMTA7CisJZWNtZC0+c3BlZWQgPSAtMTsKKwllY21kLT5kdXBsZXggPSAtMTsKIAotCQlpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0ZEKQotCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWVsc2UKLQkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJZWNtZC0+c3BlZWQgPSBhZGFwdGVyLT5saW5rX3NwZWVkOworCQkJZWNtZC0+ZHVwbGV4ID0gYWRhcHRlci0+bGlua19kdXBsZXggLSAxOworCQl9CiAJfSBlbHNlIHsKLQkJZWNtZC0+c3BlZWQgPSAtMTsKLQkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJCXUzMiBzdGF0dXMgPSBlcjMyKFNUQVRVUyk7CisJCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpIHsKKwkJCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkKKwkJCQllY21kLT5zcGVlZCA9IDEwMDA7CisJCQllbHNlIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKQorCQkJCWVjbWQtPnNwZWVkID0gMTAwOworCQkJZWxzZQorCQkJCWVjbWQtPnNwZWVkID0gMTA7CisKKwkJCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfRkQpCisJCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCQllbHNlCisJCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCX0KIAl9CiAKIAllY21kLT5hdXRvbmVnID0gKChody0+cGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKQEAgLTE3OSw3ICsxODUsNyBAQAogCiAJLyogTURJLVggPT4gMjsgTURJID0+MTsgSW52YWxpZCA9PjAgKi8KIAlpZiAoKGh3LT5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYKLQkgICAgIWh3LT5tYWMuZ2V0X2xpbmtfc3RhdHVzKQorCSAgICBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpCiAJCWVjbWQtPmV0aF90cF9tZGl4ID0gaHctPnBoeS5pc19tZGl4ID8gRVRIX1RQX01ESV9YIDoKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVEhfVFBfTURJOwogCWVsc2UKQEAgLTE5MSwxOSArMTk3LDE1IEBACiBzdGF0aWMgdTMyIGUxMDAwX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBlMTAwMF9tYWNfaW5mbyAqbWFjID0gJmFkYXB0ZXItPmh3Lm1hYzsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJLyoKLQkgKiBJZiB0aGUgbGluayBpcyBub3QgcmVwb3J0ZWQgdXAgdG8gbmV0ZGV2LCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwKLQkgKiBhbmQgc28gdGhlIHBoeXNpY2FsIGxpbmsgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBsYXN0Ci0JICogbG9va2VkLiBTZXQgZ2V0X2xpbmtfc3RhdHVzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cnVlIGxpbmsKLQkgKiBzdGF0ZSBpcyBpbnRlcnJvZ2F0ZWQsIHJhdGhlciB0aGFuIHB1bGxpbmcgYSBjYWNoZWQgYW5kIHBvc3NpYmx5Ci0JICogc3RhbGUgbGluayBzdGF0ZSBmcm9tIHRoZSBkcml2ZXIuCisJICogQXZvaWQgdG91Y2hpbmcgaGFyZHdhcmUgcmVnaXN0ZXJzIHdoZW4gcG9zc2libGUsIG90aGVyd2lzZQorCSAqIGxpbmsgbmVnb3RpYXRpb24gY2FuIGdldCBtZXNzZWQgdXAgd2hlbiB1c2VyLWxldmVsIHNjcmlwdHMKKwkgKiBhcmUgcmFwaWRseSBwb2xsaW5nIHRoZSBkcml2ZXIgdG8gc2VlIGlmIGxpbmsgaXMgdXAuCiAJICovCi0JaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpCi0JCW1hYy0+Z2V0X2xpbmtfc3RhdHVzID0gMTsKLQotCXJldHVybiBlMTAwMGVfaGFzX2xpbmsoYWRhcHRlcik7CisJcmV0dXJuIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSA/IG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSA6CisJICAgICEhKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSk7CiB9CiAKIHN0YXRpYyBpbnQgZTEwMDBfc2V0X3NwZF9kcGx4KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCB1MTYgc3BkZHBseCkKQEAgLTg4MCw2ICs4ODIsNyBAQAogCXN3aXRjaCAobWFjLT50eXBlKSB7CiAJY2FzZSBlMTAwMF9pY2gxMGxhbjoKIAljYXNlIGUxMDAwX3BjaGxhbjoKKwljYXNlIGUxMDAwX3BjaDJsYW46CiAJCW1hc2sgfD0gKDEgPDwgMTgpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTI2MywzMyArMTI2NiwzNiBAQAogCiAJaHctPm1hYy5hdXRvbmVnID0gMDsKIAotCS8qIFdvcmthcm91bmQ6IEsxIG11c3QgYmUgZGlzYWJsZWQgZm9yIHN0YWJsZSAxR2JwcyBvcGVyYXRpb24gKi8KLQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikKLQkJZTEwMDBfY29uZmlndXJlX2sxX2ljaDhsYW4oaHcsIGZhbHNlKTsKKwlpZiAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKKwkJLyogZm9yY2UgMTAwLCBzZXQgbG9vcGJhY2sgKi8KKwkJZTFlX3dwaHkoaHcsIFBIWV9DT05UUk9MLCAweDYxMDApOwogCi0JaWYgKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisJCS8qIE5vdyBzZXQgdXAgdGhlIE1BQyB0byB0aGUgc2FtZSBzcGVlZC9kdXBsZXggYXMgdGhlIFBIWS4gKi8KKwkJY3RybF9yZWcgPSBlcjMyKENUUkwpOworCQljdHJsX3JlZyAmPSB+RTEwMDBfQ1RSTF9TUERfU0VMOyAvKiBDbGVhciB0aGUgc3BlZWQgc2VsIGJpdHMgKi8KKwkJY3RybF9yZWcgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgLyogU2V0IHRoZSBGb3JjZSBTcGVlZCBCaXQgKi8KKwkJCSAgICAgRTEwMDBfQ1RSTF9GUkNEUFggfCAvKiBTZXQgdGhlIEZvcmNlIER1cGxleCBCaXQgKi8KKwkJCSAgICAgRTEwMDBfQ1RSTF9TUERfMTAwIHwvKiBGb3JjZSBTcGVlZCB0byAxMDAgKi8KKwkJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLworCisJCWV3MzIoQ1RSTCwgY3RybF9yZWcpOworCQl1ZGVsYXkoNTAwKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTcGVjaWZpYyBQSFkgY29uZmlndXJhdGlvbiBmb3IgbG9vcGJhY2sgKi8KKwlzd2l0Y2ggKGh3LT5waHkudHlwZSkgeworCWNhc2UgZTEwMDBfcGh5X204ODoKIAkJLyogQXV0by1NREkvTURJWCBPZmYgKi8KIAkJZTFlX3dwaHkoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIDB4MDgwOCk7CiAJCS8qIHJlc2V0IHRvIHVwZGF0ZSBBdXRvLU1ESS9NRElYICovCiAJCWUxZV93cGh5KGh3LCBQSFlfQ09OVFJPTCwgMHg5MTQwKTsKIAkJLyogYXV0b25lZyBvZmYgKi8KIAkJZTFlX3dwaHkoaHcsIFBIWV9DT05UUk9MLCAweDgxNDApOwotCX0gZWxzZSBpZiAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKQorCQlicmVhazsKKwljYXNlIGUxMDAwX3BoeV9nZzgyNTYzOgogCQllMWVfd3BoeShodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsIDB4MUNDKTsKLQotCWN0cmxfcmVnID0gZXIzMihDVFJMKTsKLQotCXN3aXRjaCAoaHctPnBoeS50eXBlKSB7Ci0JY2FzZSBlMTAwMF9waHlfaWZlOgotCQkvKiBmb3JjZSAxMDAsIHNldCBsb29wYmFjayAqLwotCQllMWVfd3BoeShodywgUEhZX0NPTlRST0wsIDB4NjEwMCk7Ci0KLQkJLyogTm93IHNldCB1cCB0aGUgTUFDIHRvIHRoZSBzYW1lIHNwZWVkL2R1cGxleCBhcyB0aGUgUEhZLiAqLwotCQljdHJsX3JlZyAmPSB+RTEwMDBfQ1RSTF9TUERfU0VMOyAvKiBDbGVhciB0aGUgc3BlZWQgc2VsIGJpdHMgKi8KLQkJY3RybF9yZWcgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgLyogU2V0IHRoZSBGb3JjZSBTcGVlZCBCaXQgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9GUkNEUFggfCAvKiBTZXQgdGhlIEZvcmNlIER1cGxleCBCaXQgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9TUERfMTAwIHwvKiBGb3JjZSBTcGVlZCB0byAxMDAgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLwogCQlicmVhazsKIAljYXNlIGUxMDAwX3BoeV9ibToKIAkJLyogU2V0IERlZmF1bHQgTUFDIEludGVyZmFjZSBzcGVlZCB0byAxR0IgKi8KQEAgLTEzMTIsMjQgKzEzMTgsNDIgQEAKIAkJLyogU2V0IEVhcmx5IExpbmsgRW5hYmxlICovCiAJCWUxZV9ycGh5KGh3LCBQSFlfUkVHKDc2OSwgMjApLCAmcGh5X3JlZyk7CiAJCWUxZV93cGh5KGh3LCBQSFlfUkVHKDc2OSwgMjApLCBwaHlfcmVnIHwgMHgwNDAwKTsKLQkJLyogZmFsbCB0aHJvdWdoICovCisJCWJyZWFrOworCWNhc2UgZTEwMDBfcGh5XzgyNTc3OgorCWNhc2UgZTEwMDBfcGh5XzgyNTc4OgorCQkvKiBXb3JrYXJvdW5kOiBLMSBtdXN0IGJlIGRpc2FibGVkIGZvciBzdGFibGUgMUdicHMgb3BlcmF0aW9uICovCisJCWUxMDAwX2NvbmZpZ3VyZV9rMV9pY2g4bGFuKGh3LCBmYWxzZSk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfcGh5XzgyNTc5OgorCQkvKiBEaXNhYmxlIFBIWSBlbmVyZ3kgZGV0ZWN0IHBvd2VyIGRvd24gKi8KKwkJZTFlX3JwaHkoaHcsIFBIWV9SRUcoMCwgMjEpLCAmcGh5X3JlZyk7CisJCWUxZV93cGh5KGh3LCBQSFlfUkVHKDAsIDIxKSwgcGh5X3JlZyAmIH4oMSA8PCAzKSk7CisJCS8qIERpc2FibGUgZnVsbCBjaGlwIGVuZXJneSBkZXRlY3QgKi8KKwkJZTFlX3JwaHkoaHcsIFBIWV9SRUcoNzc2LCAxOCksICZwaHlfcmVnKTsKKwkJZTFlX3dwaHkoaHcsIFBIWV9SRUcoNzc2LCAxOCksIHBoeV9yZWcgfCAxKTsKKwkJLyogRW5hYmxlIGxvb3BiYWNrIG9uIHRoZSBQSFkgKi8KKyNkZWZpbmUgSTgyNTc3X1BIWV9MQktfQ1RSTCAgICAgICAgICAxOQorCQllMWVfd3BoeShodywgSTgyNTc3X1BIWV9MQktfQ1RSTCwgMHg4MDAxKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJLyogZm9yY2UgMTAwMCwgc2V0IGxvb3BiYWNrICovCi0JCWUxZV93cGh5KGh3LCBQSFlfQ09OVFJPTCwgMHg0MTQwKTsKLQkJbWRlbGF5KDI1MCk7Ci0KLQkJLyogTm93IHNldCB1cCB0aGUgTUFDIHRvIHRoZSBzYW1lIHNwZWVkL2R1cGxleCBhcyB0aGUgUEhZLiAqLwotCQljdHJsX3JlZyA9IGVyMzIoQ1RSTCk7Ci0JCWN0cmxfcmVnICY9IH5FMTAwMF9DVFJMX1NQRF9TRUw7IC8qIENsZWFyIHRoZSBzcGVlZCBzZWwgYml0cyAqLwotCQljdHJsX3JlZyB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCAvKiBTZXQgdGhlIEZvcmNlIFNwZWVkIEJpdCAqLwotCQkJICAgICBFMTAwMF9DVFJMX0ZSQ0RQWCB8IC8qIFNldCB0aGUgRm9yY2UgRHVwbGV4IEJpdCAqLwotCQkJICAgICBFMTAwMF9DVFJMX1NQRF8xMDAwIHwvKiBGb3JjZSBTcGVlZCB0byAxMDAwICovCi0JCQkgICAgIEUxMDAwX0NUUkxfRkQpOwkgLyogRm9yY2UgRHVwbGV4IHRvIEZVTEwgKi8KLQotCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0lTX0lDSCkKLQkJCWN0cmxfcmVnIHw9IEUxMDAwX0NUUkxfU0xVOwkvKiBTZXQgTGluayBVcCAqLworCQlicmVhazsKIAl9CiAKKwkvKiBmb3JjZSAxMDAwLCBzZXQgbG9vcGJhY2sgKi8KKwllMWVfd3BoeShodywgUEhZX0NPTlRST0wsIDB4NDE0MCk7CisJbWRlbGF5KDI1MCk7CisKKwkvKiBOb3cgc2V0IHVwIHRoZSBNQUMgdG8gdGhlIHNhbWUgc3BlZWQvZHVwbGV4IGFzIHRoZSBQSFkuICovCisJY3RybF9yZWcgPSBlcjMyKENUUkwpOworCWN0cmxfcmVnICY9IH5FMTAwMF9DVFJMX1NQRF9TRUw7IC8qIENsZWFyIHRoZSBzcGVlZCBzZWwgYml0cyAqLworCWN0cmxfcmVnIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IC8qIFNldCB0aGUgRm9yY2UgU3BlZWQgQml0ICovCisJCSAgICAgRTEwMDBfQ1RSTF9GUkNEUFggfCAvKiBTZXQgdGhlIEZvcmNlIER1cGxleCBCaXQgKi8KKwkJICAgICBFMTAwMF9DVFJMX1NQRF8xMDAwIHwvKiBGb3JjZSBTcGVlZCB0byAxMDAwICovCisJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLworCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19JU19JQ0gpCisJCWN0cmxfcmVnIHw9IEUxMDAwX0NUUkxfU0xVOwkvKiBTZXQgTGluayBVcCAqLworCiAJaWYgKGh3LT5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciAmJgogCSAgICBody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5X204OCkgewogCQljdHJsX3JlZyB8PSBFMTAwMF9DVFJMX0lMT1M7IC8qIEludmVydCBMb3NzIG9mIFNpZ25hbCAqLwpAQCAtMTg2OCw2ICsxODkyLDcgQEAKIAogCWlmICgoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pZmUpIHx8CiAJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSB8fAorCSAgICAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaDJsYW4pIHx8CiAJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1ODMpIHx8CiAJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpKSB7CiAJCUlOSVRfV09SSygmYWRhcHRlci0+bGVkX2JsaW5rX3Rhc2ssIGUxMDAwZV9sZWRfYmxpbmtfdGFzayk7CkBAIC0yMDI2LDcgKzIwNTEsNiBAQAogCS5nZXRfY29hbGVzY2UJCT0gZTEwMDBfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gZTEwMDBfc2V0X2NvYWxlc2NlLAogCS5nZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncwkJPSBldGh0b29sX29wX3NldF9mbGFncywKIH07CiAKIHZvaWQgZTEwMDBlX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAppbmRleCA1ZDEyMjBkLi42NmVkMDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMTcsNyArMjE3LDEwIEBACiAJRTEwMDBfU1dTTSAgICAgID0gMHgwNUI1MCwgLyogU1cgU2VtYXBob3JlICovCiAJRTEwMDBfRldTTSAgICAgID0gMHgwNUI1NCwgLyogRlcgU2VtYXBob3JlICovCiAJRTEwMDBfU1dTTTIgICAgID0gMHgwNUI1OCwgLyogRHJpdmVyLW9ubHkgU1cgc2VtYXBob3JlICovCi0JRTEwMDBfQ1JDX09GRlNFVCA9IDB4MDVGNTAsIC8qIENSQyBPZmZzZXQgcmVnaXN0ZXIgKi8KKwlFMTAwMF9GRkxUX0RCRyAgPSAweDA1RjA0LCAvKiBEZWJ1ZyBSZWdpc3RlciAqLworCUUxMDAwX1BDSF9SQUlDQ19CQVNFID0gMHgwNUY1MCwgLyogUmVjZWl2ZSBBZGRyZXNzIEluaXRpYWwgQ1JDICovCisjZGVmaW5lIEUxMDAwX1BDSF9SQUlDQyhfbikJKEUxMDAwX1BDSF9SQUlDQ19CQVNFICsgKChfbikgKiA0KSkKKyNkZWZpbmUgRTEwMDBfQ1JDX09GRlNFVAlFMTAwMF9QQ0hfUkFJQ0NfQkFTRQogCUUxMDAwX0hJQ1IgICAgICA9IDB4MDhGMDAsIC8qIEhvc3QgSW50ZXJmYWNlIENvbnRyb2wgKi8KIH07CiAKQEAgLTMwMywxMyArMzA2LDE0IEBACiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVAkweDAwMUYwMDAwCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVF9TSElGVAkxNgogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9SRU4JCTB4MDAyMDAwMDAKKyNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfQ1RSTF9PRkZTRVQJMHgxICAgIC8qIEt1bWVyYW4gQ29udHJvbCAqLwogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9ESUFHX09GRlNFVAkweDMgICAgLyogS3VtZXJhbiBEaWFnbm9zdGljICovCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX1RJTUVPVVRTCTB4NCAgICAvKiBLdW1lcmFuIFRpbWVvdXRzICovCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0lOQkFORF9QQVJBTQkweDkgICAgLyogS3VtZXJhbiBJbkJhbmQgUGFyYW1ldGVycyAqLwogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9ESUFHX05FTFBCSwkweDEwMDAgLyogTmVhcmVuZCBMb29wYmFjayBtb2RlICovCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0sxX0NPTkZJRwkweDcKLSNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfSzFfRU5BQkxFCTB4MTQwRQotI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9ESVNBQkxFCTB4MTQwMAorI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9FTkFCTEUJMHgwMDAyCisjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0hEX0NUUkwJMHgxMCAgIC8qIEt1bWVyYW4gSEQgQ29udHJvbCAqLwogCiAjZGVmaW5lIElGRV9QSFlfRVhURU5ERURfU1RBVFVTX0NPTlRST0wJMHgxMAogI2RlZmluZSBJRkVfUEhZX1NQRUNJQUxfQ09OVFJPTAkJMHgxMSAvKiAxMDBCYXNlVHggUEhZIFNwZWNpYWwgQ29udHJvbCAqLwpAQCAtMzg3LDYgKzM5MSw4IEBACiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9QQ0hfTV9IVl9MQwkJMHgxMEVCCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9QQ0hfRF9IVl9ETQkJMHgxMEVGCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9QQ0hfRF9IVl9EQwkJMHgxMEYwCisjZGVmaW5lIEUxMDAwX0RFVl9JRF9QQ0gyX0xWX0xNCQkJMHgxNTAyCisjZGVmaW5lIEUxMDAwX0RFVl9JRF9QQ0gyX0xWX1YJCQkweDE1MDMKIAogI2RlZmluZSBFMTAwMF9SRVZJU0lPTl80IDQKIApAQCAtNDA2LDYgKzQxMiw3IEBACiAJZTEwMDBfaWNoOWxhbiwKIAllMTAwMF9pY2gxMGxhbiwKIAllMTAwMF9wY2hsYW4sCisJZTEwMDBfcGNoMmxhbiwKIH07CiAKIGVudW0gZTEwMDBfbWVkaWFfdHlwZSB7CkBAIC00NDIsNiArNDQ5LDcgQEAKIAllMTAwMF9waHlfYm0sCiAJZTEwMDBfcGh5XzgyNTc4LAogCWUxMDAwX3BoeV84MjU3NywKKwllMTAwMF9waHlfODI1NzksCiB9OwogCiBlbnVtIGUxMDAwX2J1c193aWR0aCB7CkBAIC05MjksNiArOTM3LDcgQEAKIAlib29sIGttcm5fbG9ja19sb3NzX3dvcmthcm91bmRfZW5hYmxlZDsKIAlzdHJ1Y3QgZTEwMDBfc2hhZG93X3JhbSBzaGFkb3dfcmFtW0UxMDAwX0lDSDhfU0hBRE9XX1JBTV9XT1JEU107CiAJYm9vbCBudm1fazFfZW5hYmxlZDsKKwlib29sIGVlZV9kaXNhYmxlOwogfTsKIAogc3RydWN0IGUxMDAwX2h3IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCmluZGV4IGIyNTA3ZDkuLjYzOTMwZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC01Miw2ICs1Miw4IEBACiAgKiA4MjU3N0xDIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCiAgKiA4MjU3OERNIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCiAgKiA4MjU3OERDIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCisgKiA4MjU3OUxNIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCisgKiA4MjU3OVYgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KICAqLwogCiAjaW5jbHVkZSAiZTEwMDAuaCIKQEAgLTEyNiw2ICsxMjgsMTMgQEAKICNkZWZpbmUgSFZfU01CX0FERFJfUEVDX0VOICAgICAweDAyMDAKICNkZWZpbmUgSFZfU01CX0FERFJfVkFMSUQgICAgICAweDAwODAKIAorLyogUEhZIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCAqLworI2RlZmluZSBIVl9QTV9DVFJMCQlQSFlfUkVHKDc3MCwgMTcpCisKKy8qIFBIWSBMb3cgUG93ZXIgSWRsZSBDb250cm9sICovCisjZGVmaW5lIEk4MjU3OV9MUElfQ1RSTAkJCVBIWV9SRUcoNzcyLCAyMCkKKyNkZWZpbmUgSTgyNTc5X0xQSV9DVFJMX0VOQUJMRV9NQVNLCTB4NjAwMAorCiAvKiBTdHJhcHBpbmcgT3B0aW9uIFJlZ2lzdGVyIC0gUk8gKi8KICNkZWZpbmUgRTEwMDBfU1RSQVAgICAgICAgICAgICAgICAgICAgICAweDAwMDBDCiAjZGVmaW5lIEUxMDAwX1NUUkFQX1NNQlVTX0FERFJFU1NfTUFTSyAgMHgwMEZFMDAwMApAQCAtMjI2LDYgKzIzNSw4IEBACiBzdGF0aWMgdm9pZCBlMTAwMF9sYW5faW5pdF9kb25lX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyICBlMTAwMF9rMV9naWdfd29ya2Fyb3VuZF9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGxpbmspOwogc3RhdGljIHMzMiBlMTAwMF9zZXRfbWRpb19zbG93X21vZGVfaHYoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgYm9vbCBlMTAwMF9jaGVja19tbmdfbW9kZV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGJvb2wgZTEwMDBfY2hlY2tfbW5nX21vZGVfcGNobGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiBzdGF0aWMgaW5saW5lIHUxNiBfX2VyMTZmbGFzaChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJlZykKIHsKQEAgLTI3NywxMyArMjg4LDEzIEBACiAJcGh5LT5vcHMucG93ZXJfZG93biAgICAgICAgICAgPSBlMTAwMF9wb3dlcl9kb3duX3BoeV9jb3BwZXJfaWNoOGxhbjsKIAlwaHktPmF1dG9uZWdfbWFzayAgICAgICAgICAgICA9IEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQ7CiAKKwkvKgorCSAqIFRoZSBNQUMtUEhZIGludGVyY29ubmVjdCBtYXkgc3RpbGwgYmUgaW4gU01CdXMgbW9kZQorCSAqIGFmdGVyIFN4LT5TMC4gIElmIHRoZSBtYW5hZ2VhYmlsaXR5IGVuZ2luZSAoTUUpIGlzCisJICogZGlzYWJsZWQsIHRoZW4gdG9nZ2xlIHRoZSBMQU5QSFlQQyBWYWx1ZSBiaXQgdG8gZm9yY2UKKwkgKiB0aGUgaW50ZXJjb25uZWN0IHRvIFBDSWUgbW9kZS4KKwkgKi8KIAlpZiAoIShlcjMyKEZXU00pICYgRTEwMDBfSUNIX0ZXU01fRldfVkFMSUQpKSB7Ci0JCS8qCi0JCSAqIFRoZSBNQUMtUEhZIGludGVyY29ubmVjdCBtYXkgc3RpbGwgYmUgaW4gU01CdXMgbW9kZQotCQkgKiBhZnRlciBTeC0+UzAuICBUb2dnbGUgdGhlIExBTlBIWVBDIFZhbHVlIGJpdCB0byBmb3JjZQotCQkgKiB0aGUgaW50ZXJjb25uZWN0IHRvIFBDSWUgbW9kZSwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgbm8KLQkJICogZmlybXdhcmUgcHJlc2VudCBvdGhlcndpc2UgZmlybXdhcmUgd2lsbCBoYXZlIGRvbmUgaXQuCi0JCSAqLwogCQljdHJsID0gZXIzMihDVFJMKTsKIAkJY3RybCB8PSAgRTEwMDBfQ1RSTF9MQU5QSFlQQ19PVkVSUklERTsKIAkJY3RybCAmPSB+RTEwMDBfQ1RSTF9MQU5QSFlQQ19WQUxVRTsKQEAgLTMyNCw2ICszMzUsNyBAQAogCiAJc3dpdGNoIChwaHktPnR5cGUpIHsKIAljYXNlIGUxMDAwX3BoeV84MjU3NzoKKwljYXNlIGUxMDAwX3BoeV84MjU3OToKIAkJcGh5LT5vcHMuY2hlY2tfcG9sYXJpdHkgPSBlMTAwMF9jaGVja19wb2xhcml0eV84MjU3NzsKIAkJcGh5LT5vcHMuZm9yY2Vfc3BlZWRfZHVwbGV4ID0KIAkJCWUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXhfODI1Nzc7CkBAIC01MTUsNiArNTI3LDggQEAKIAljYXNlIGUxMDAwX2ljaDhsYW46CiAJY2FzZSBlMTAwMF9pY2g5bGFuOgogCWNhc2UgZTEwMDBfaWNoMTBsYW46CisJCS8qIGNoZWNrIG1hbmFnZW1lbnQgbW9kZSAqLworCQltYWMtPm9wcy5jaGVja19tbmdfbW9kZSA9IGUxMDAwX2NoZWNrX21uZ19tb2RlX2ljaDhsYW47CiAJCS8qIElEIExFRCBpbml0ICovCiAJCW1hYy0+b3BzLmlkX2xlZF9pbml0ID0gZTEwMDBlX2lkX2xlZF9pbml0OwogCQkvKiBzZXR1cCBMRUQgKi8KQEAgLTUyNiw2ICs1NDAsOSBAQAogCQltYWMtPm9wcy5sZWRfb2ZmID0gZTEwMDBfbGVkX29mZl9pY2g4bGFuOwogCQlicmVhazsKIAljYXNlIGUxMDAwX3BjaGxhbjoKKwljYXNlIGUxMDAwX3BjaDJsYW46CisJCS8qIGNoZWNrIG1hbmFnZW1lbnQgbW9kZSAqLworCQltYWMtPm9wcy5jaGVja19tbmdfbW9kZSA9IGUxMDAwX2NoZWNrX21uZ19tb2RlX3BjaGxhbjsKIAkJLyogSUQgTEVEIGluaXQgKi8KIAkJbWFjLT5vcHMuaWRfbGVkX2luaXQgPSBlMTAwMF9pZF9sZWRfaW5pdF9wY2hsYW47CiAJCS8qIHNldHVwIExFRCAqLwpAQCAtNTQ0LDEwICs1NjEsNDcgQEAKIAlpZiAobWFjLT50eXBlID09IGUxMDAwX2ljaDhsYW4pCiAJCWUxMDAwZV9zZXRfa21ybl9sb2NrX2xvc3Nfd29ya2Fyb3VuZF9pY2g4bGFuKGh3LCB0cnVlKTsKIAorCS8qIERpc2FibGUgUEhZIGNvbmZpZ3VyYXRpb24gYnkgaGFyZHdhcmUsIGNvbmZpZyBieSBzb2Z0d2FyZSAqLworCWlmIChtYWMtPnR5cGUgPT0gZTEwMDBfcGNoMmxhbikgeworCQl1MzIgZXh0Y25mX2N0cmwgPSBlcjMyKEVYVENORl9DVFJMKTsKKworCQlleHRjbmZfY3RybCB8PSBFMTAwMF9FWFRDTkZfQ1RSTF9HQVRFX1BIWV9DRkc7CisJCWV3MzIoRVhUQ05GX0NUUkwsIGV4dGNuZl9jdHJsKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogLyoqCisgKiAgZTEwMDBfc2V0X2VlZV9wY2hsYW4gLSBFbmFibGUvZGlzYWJsZSBFRUUgc3VwcG9ydAorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogIEVuYWJsZS9kaXNhYmxlIEVFRSBiYXNlZCBvbiBzZXR0aW5nIGluIGRldl9zcGVjIHN0cnVjdHVyZS4gIFRoZSBiaXRzIGluCisgKiAgdGhlIExQSSBDb250cm9sIHJlZ2lzdGVyIHdpbGwgcmVtYWluIHNldCBvbmx5IGlmL3doZW4gbGluayBpcyB1cC4KKyAqKi8KK3N0YXRpYyBzMzIgZTEwMDBfc2V0X2VlZV9wY2hsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlzMzIgcmV0X3ZhbCA9IDA7CisJdTE2IHBoeV9yZWc7CisKKwlpZiAoaHctPnBoeS50eXBlICE9IGUxMDAwX3BoeV84MjU3OSkKKwkJZ290byBvdXQ7CisKKwlyZXRfdmFsID0gZTFlX3JwaHkoaHcsIEk4MjU3OV9MUElfQ1RSTCwgJnBoeV9yZWcpOworCWlmIChyZXRfdmFsKQorCQlnb3RvIG91dDsKKworCWlmIChody0+ZGV2X3NwZWMuaWNoOGxhbi5lZWVfZGlzYWJsZSkKKwkJcGh5X3JlZyAmPSB+STgyNTc5X0xQSV9DVFJMX0VOQUJMRV9NQVNLOworCWVsc2UKKwkJcGh5X3JlZyB8PSBJODI1NzlfTFBJX0NUUkxfRU5BQkxFX01BU0s7CisKKwlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIEk4MjU3OV9MUElfQ1RSTCwgcGh5X3JlZyk7CitvdXQ6CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgogICogIGUxMDAwX2NoZWNrX2Zvcl9jb3BwZXJfbGlua19pY2g4bGFuIC0gQ2hlY2sgZm9yIGxpbmsgKENvcHBlcikKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKQEAgLTYwNCw2ICs2NTgsMTEgQEAKIAkgKi8KIAllMTAwMGVfY2hlY2tfZG93bnNoaWZ0KGh3KTsKIAorCS8qIEVuYWJsZS9EaXNhYmxlIEVFRSBhZnRlciBsaW5rIHVwICovCisJcmV0X3ZhbCA9IGUxMDAwX3NldF9lZWVfcGNobGFuKGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJZ290byBvdXQ7CisKIAkvKgogCSAqIElmIHdlIGFyZSBmb3JjaW5nIHNwZWVkL2R1cGxleCwgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIHNpbmNlCiAJICogd2UgaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgd2hldGhlciB3ZSBoYXZlIGxpbmsgb3Igbm90LgpAQCAtNjQ3LDEwICs3MDYsMTkgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKQotCQlyYyA9IGUxMDAwX2luaXRfcGh5X3BhcmFtc19wY2hsYW4oaHcpOwotCWVsc2UKKwlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgeworCWNhc2UgZTEwMDBfaWNoOGxhbjoKKwljYXNlIGUxMDAwX2ljaDlsYW46CisJY2FzZSBlMTAwMF9pY2gxMGxhbjoKIAkJcmMgPSBlMTAwMF9pbml0X3BoeV9wYXJhbXNfaWNoOGxhbihodyk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfcGNobGFuOgorCWNhc2UgZTEwMDBfcGNoMmxhbjoKKwkJcmMgPSBlMTAwMF9pbml0X3BoeV9wYXJhbXNfcGNobGFuKGh3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC02NjMsNiArNzMxLDEwIEBACiAJICAgIChhZGFwdGVyLT5ody5waHkudHlwZSA9PSBlMTAwMF9waHlfaWdwXzMpKQogCQlhZGFwdGVyLT5mbGFncyB8PSBGTEFHX0xTQ19HSUdfU1BFRURfRFJPUDsKIAorCS8qIERpc2FibGUgRUVFIGJ5IGRlZmF1bHQgdW50aWwgSUVFRTgwMi4zYXogc3BlYyBpcyBmaW5hbGl6ZWQgKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgRkxBRzJfSEFTX0VFRSkKKwkJYWRhcHRlci0+aHcuZGV2X3NwZWMuaWNoOGxhbi5lZWVfZGlzYWJsZSA9IHRydWU7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzc0LDcgKzg0Niw3IEBACiAgKiAgZTEwMDBfY2hlY2tfbW5nX21vZGVfaWNoOGxhbiAtIENoZWNrcyBtYW5hZ2VtZW50IG1vZGUKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKLSAqICBUaGlzIGNoZWNrcyBpZiB0aGUgYWRhcHRlciBoYXMgbWFuYWdlYWJpbGl0eSBlbmFibGVkLgorICogIFRoaXMgY2hlY2tzIGlmIHRoZSBhZGFwdGVyIGhhcyBhbnkgbWFuYWdlYWJpbGl0eSBlbmFibGVkLgogICogIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGVudHJ5IHBvaW50IG9ubHkgY2FsbGVkIGJ5IHJlYWQvd3JpdGUKICAqICByb3V0aW5lcyBmb3IgdGhlIFBIWSBhbmQgTlZNIHBhcnRzLgogICoqLwpAQCAtNzgzLDkgKzg1NSwyNiBAQAogCXUzMiBmd3NtOwogCiAJZndzbSA9IGVyMzIoRldTTSk7CisJcmV0dXJuIChmd3NtICYgRTEwMDBfSUNIX0ZXU01fRldfVkFMSUQpICYmCisJICAgICAgICgoZndzbSAmIEUxMDAwX0ZXU01fTU9ERV9NQVNLKSA9PQorCQkoRTEwMDBfSUNIX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZUKSk7Cit9CiAKLQlyZXR1cm4gKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgPT0KLQkJKEUxMDAwX0lDSF9NTkdfSUFNVF9NT0RFIDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCk7CisvKioKKyAqICBlMTAwMF9jaGVja19tbmdfbW9kZV9wY2hsYW4gLSBDaGVja3MgbWFuYWdlbWVudCBtb2RlCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqCisgKiAgVGhpcyBjaGVja3MgaWYgdGhlIGFkYXB0ZXIgaGFzIGlBTVQgZW5hYmxlZC4KKyAqICBUaGlzIGlzIGEgZnVuY3Rpb24gcG9pbnRlciBlbnRyeSBwb2ludCBvbmx5IGNhbGxlZCBieSByZWFkL3dyaXRlCisgKiAgcm91dGluZXMgZm9yIHRoZSBQSFkgYW5kIE5WTSBwYXJ0cy4KKyAqKi8KK3N0YXRpYyBib29sIGUxMDAwX2NoZWNrX21uZ19tb2RlX3BjaGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXUzMiBmd3NtOworCisJZndzbSA9IGVyMzIoRldTTSk7CisJcmV0dXJuIChmd3NtICYgRTEwMDBfSUNIX0ZXU01fRldfVkFMSUQpICYmCisJICAgICAgIChmd3NtICYgKEUxMDAwX0lDSF9NTkdfSUFNVF9NT0RFIDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCkpOwogfQogCiAvKioKQEAgLTgyMCwxNCArOTA5LDYgQEAKIAlzMzIgcmV0X3ZhbCA9IDA7CiAJdTE2IHdvcmRfYWRkciwgcmVnX2RhdGEsIHJlZ19hZGRyLCBwaHlfcGFnZSA9IDA7CiAKLQlpZiAoIShody0+bWFjLnR5cGUgPT0gZTEwMDBfaWNoOGxhbiAmJiBwaHktPnR5cGUgPT0gZTEwMDBfcGh5X2lncF8zKSAmJgotCQkhKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQotCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlKGh3KTsKLQlpZiAocmV0X3ZhbCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIFBIWSBmcm9tIHRoZSBOVk0gb24gSUNIIHBsYXRmb3Jtcy4gIFRoaXMKIAkgKiBpcyBuZWVkZWQgZHVlIHRvIGFuIGlzc3VlIHdoZXJlIHRoZSBOVk0gY29uZmlndXJhdGlvbiBpcwpAQCAtODM1LDEyICs5MTYsMjcgQEAKIAkgKiBUaGVyZWZvcmUsIGFmdGVyIGVhY2ggUEhZIHJlc2V0LCB3ZSB3aWxsIGxvYWQgdGhlCiAJICogY29uZmlndXJhdGlvbiBkYXRhIG91dCBvZiB0aGUgTlZNIG1hbnVhbGx5LgogCSAqLwotCWlmICgoYWRhcHRlci0+cGRldi0+ZGV2aWNlID09IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NX0FNVCkgfHwKLQkgICAgKGFkYXB0ZXItPnBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTSkgfHwKLQkgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pKQorCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CisJY2FzZSBlMTAwMF9pY2g4bGFuOgorCQlpZiAocGh5LT50eXBlICE9IGUxMDAwX3BoeV9pZ3BfMykKKwkJCXJldHVybiByZXRfdmFsOworCisJCWlmIChhZGFwdGVyLT5wZGV2LT5kZXZpY2UgPT0gRTEwMDBfREVWX0lEX0lDSDhfSUdQX0FNVCkgeworCQkJc3dfY2ZnX21hc2sgPSBFMTAwMF9GRVhUTlZNX1NXX0NPTkZJRzsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZhbGwtdGhydSAqLworCWNhc2UgZTEwMDBfcGNobGFuOgorCWNhc2UgZTEwMDBfcGNoMmxhbjoKIAkJc3dfY2ZnX21hc2sgPSBFMTAwMF9GRVhUTlZNX1NXX0NPTkZJR19JQ0g4TTsKLQllbHNlCi0JCXN3X2NmZ19tYXNrID0gRTEwMDBfRkVYVE5WTV9TV19DT05GSUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlKGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKIAlkYXRhID0gZXIzMihGRVhUTlZNKTsKIAlpZiAoIShkYXRhICYgc3dfY2ZnX21hc2spKQpAQCAtODUxLDggKzk0NywxMCBAQAogCSAqIGV4dGVuZGVkIGNvbmZpZ3VyYXRpb24gYmVmb3JlIFNXIGNvbmZpZ3VyYXRpb24KIAkgKi8KIAlkYXRhID0gZXIzMihFWFRDTkZfQ1RSTCk7Ci0JaWYgKGRhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9MQ0RfV1JJVEVfRU5BQkxFKQotCQlnb3RvIG91dDsKKwlpZiAoIShody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoMmxhbikpIHsKKwkJaWYgKGRhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9MQ0RfV1JJVEVfRU5BQkxFKQorCQkJZ290byBvdXQ7CisJfQogCiAJY25mX3NpemUgPSBlcjMyKEVYVENORl9TSVpFKTsKIAljbmZfc2l6ZSAmPSBFMTAwMF9FWFRDTkZfU0laRV9FWFRfUENJRV9MRU5HVEhfTUFTSzsKQEAgLTg2NCw3ICs5NjIsOCBAQAogCWNuZl9iYXNlX2FkZHIgPj49IEUxMDAwX0VYVENORl9DVFJMX0VYVF9DTkZfUE9JTlRFUl9TSElGVDsKIAogCWlmICghKGRhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9PRU1fV1JJVEVfRU5BQkxFKSAmJgotCSAgICAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikpIHsKKwkgICAgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSB8fAorCSAgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2gybGFuKSkpIHsKIAkJLyoKIAkJICogSFcgY29uZmlndXJlcyB0aGUgU01CdXMgYWRkcmVzcyBhbmQgTEVEcyB3aGVuIHRoZQogCQkgKiBPRU0gYW5kIExDRCBXcml0ZSBFbmFibGUgYml0cyBhcmUgc2V0IGluIHRoZSBOVk0uCkBAIC0xMDcxLDE2ICsxMTcwLDE4IEBACiAJdTMyIG1hY19yZWc7CiAJdTE2IG9lbV9yZWc7CiAKLQlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaGxhbikKKwlpZiAoKGh3LT5tYWMudHlwZSAhPSBlMTAwMF9wY2gybGFuKSAmJiAoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaGxhbikpCiAJCXJldHVybiByZXRfdmFsOwogCiAJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmUoaHcpOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAotCW1hY19yZWcgPSBlcjMyKEVYVENORl9DVFJMKTsKLQlpZiAobWFjX3JlZyAmIEUxMDAwX0VYVENORl9DVFJMX09FTV9XUklURV9FTkFCTEUpCi0JCWdvdG8gb3V0OworCWlmICghKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2gybGFuKSkgeworCQltYWNfcmVnID0gZXIzMihFWFRDTkZfQ1RSTCk7CisJCWlmIChtYWNfcmVnICYgRTEwMDBfRVhUQ05GX0NUUkxfT0VNX1dSSVRFX0VOQUJMRSkKKwkJCWdvdG8gb3V0OworCX0KIAogCW1hY19yZWcgPSBlcjMyKEZFWFROVk0pOwogCWlmICghKG1hY19yZWcgJiBFMTAwMF9GRVhUTlZNX1NXX0NPTkZJR19JQ0g4TSkpCkBAIC0xMjIxLDYgKzEzMjIsMjQzIEBACiB9CiAKIC8qKgorICogIGUxMDAwX2NvcHlfcnhfYWRkcnNfdG9fcGh5X2ljaDhsYW4gLSBDb3B5IFJ4IGFkZHJlc3NlcyBmcm9tIE1BQyB0byBQSFkKKyAqICBAaHc6ICAgcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiovCit2b2lkIGUxMDAwX2NvcHlfcnhfYWRkcnNfdG9fcGh5X2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1MzIgbWFjX3JlZzsKKwl1MTYgaTsKKworCS8qIENvcHkgYm90aCBSQUwvSCAocmFyX2VudHJ5X2NvdW50KSBhbmQgU0hSQUwvSCAoKzQpIHRvIFBIWSAqLworCWZvciAoaSA9IDA7IGkgPCAoaHctPm1hYy5yYXJfZW50cnlfY291bnQgKyA0KTsgaSsrKSB7CisJCW1hY19yZWcgPSBlcjMyKFJBTChpKSk7CisJCWUxZV93cGh5KGh3LCBCTV9SQVJfTChpKSwgKHUxNikobWFjX3JlZyAmIDB4RkZGRikpOworCQllMWVfd3BoeShodywgQk1fUkFSX00oaSksICh1MTYpKChtYWNfcmVnID4+IDE2KSAmIDB4RkZGRikpOworCQltYWNfcmVnID0gZXIzMihSQUgoaSkpOworCQllMWVfd3BoeShodywgQk1fUkFSX0goaSksICh1MTYpKG1hY19yZWcgJiAweEZGRkYpKTsKKwkJZTFlX3dwaHkoaHcsIEJNX1JBUl9DVFJMKGkpLCAodTE2KSgobWFjX3JlZyA+PiAxNikgJiAweDgwMDApKTsKKwl9Cit9CisKK3N0YXRpYyB1MzIgZTEwMDBfY2FsY19yeF9kYV9jcmModTggbWFjW10pCit7CisJdTMyIHBvbHkgPSAweEVEQjg4MzIwOwkvKiBQb2x5bm9taWFsIGZvciA4MDIuMyBDUkMgY2FsY3VsYXRpb24gKi8KKwl1MzIgaSwgaiwgbWFzaywgY3JjOworCisJY3JjID0gMHhmZmZmZmZmZjsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWNyYyA9IGNyYyBeIG1hY1tpXTsKKwkJZm9yIChqID0gODsgaiA+IDA7IGotLSkgeworCQkJbWFzayA9IChjcmMgJiAxKSAqICgtMSk7CisJCQljcmMgPSAoY3JjID4+IDEpIF4gKHBvbHkgJiBtYXNrKTsKKwkJfQorCX0KKwlyZXR1cm4gfmNyYzsKK30KKworLyoqCisgKiAgZTEwMDBfbHZfanVtYm9fd29ya2Fyb3VuZF9pY2g4bGFuIC0gcmVxdWlyZWQgZm9yIGp1bWJvIGZyYW1lIG9wZXJhdGlvbgorICogIHdpdGggODI1NzkgUEhZCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAZW5hYmxlOiBmbGFnIHRvIGVuYWJsZS9kaXNhYmxlIHdvcmthcm91bmQgd2hlbiBlbmFibGluZy9kaXNhYmxpbmcganVtYm9zCisgKiovCitzMzIgZTEwMDBfbHZfanVtYm9fd29ya2Fyb3VuZF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2wgZW5hYmxlKQoreworCXMzMiByZXRfdmFsID0gMDsKKwl1MTYgcGh5X3JlZywgZGF0YTsKKwl1MzIgbWFjX3JlZzsKKwl1MTYgaTsKKworCWlmIChody0+bWFjLnR5cGUgIT0gZTEwMDBfcGNoMmxhbikKKwkJZ290byBvdXQ7CisKKwkvKiBkaXNhYmxlIFJ4IHBhdGggd2hpbGUgZW5hYmxpbmcvZGlzYWJsaW5nIHdvcmthcm91bmQgKi8KKwllMWVfcnBoeShodywgUEhZX1JFRyg3NjksIDIwKSwgJnBoeV9yZWcpOworCXJldF92YWwgPSBlMWVfd3BoeShodywgUEhZX1JFRyg3NjksIDIwKSwgcGh5X3JlZyB8ICgxIDw8IDE0KSk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OworCisJaWYgKGVuYWJsZSkgeworCQkvKgorCQkgKiBXcml0ZSBSeCBhZGRyZXNzZXMgKHJhcl9lbnRyeV9jb3VudCBmb3IgUkFML0gsICs0IGZvcgorCQkgKiBTSFJBTC9IKSBhbmQgaW5pdGlhbCBDUkMgdmFsdWVzIHRvIHRoZSBNQUMKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCAoaHctPm1hYy5yYXJfZW50cnlfY291bnQgKyA0KTsgaSsrKSB7CisJCQl1OCBtYWNfYWRkcltFVEhfQUxFTl0gPSB7MH07CisJCQl1MzIgYWRkcl9oaWdoLCBhZGRyX2xvdzsKKworCQkJYWRkcl9oaWdoID0gZXIzMihSQUgoaSkpOworCQkJaWYgKCEoYWRkcl9oaWdoICYgRTEwMDBfUkFIX0FWKSkKKwkJCQljb250aW51ZTsKKwkJCWFkZHJfbG93ID0gZXIzMihSQUwoaSkpOworCQkJbWFjX2FkZHJbMF0gPSAoYWRkcl9sb3cgJiAweEZGKTsKKwkJCW1hY19hZGRyWzFdID0gKChhZGRyX2xvdyA+PiA4KSAmIDB4RkYpOworCQkJbWFjX2FkZHJbMl0gPSAoKGFkZHJfbG93ID4+IDE2KSAmIDB4RkYpOworCQkJbWFjX2FkZHJbM10gPSAoKGFkZHJfbG93ID4+IDI0KSAmIDB4RkYpOworCQkJbWFjX2FkZHJbNF0gPSAoYWRkcl9oaWdoICYgMHhGRik7CisJCQltYWNfYWRkcls1XSA9ICgoYWRkcl9oaWdoID4+IDgpICYgMHhGRik7CisKKwkJCWV3MzIoUENIX1JBSUNDKGkpLAorCQkJCQllMTAwMF9jYWxjX3J4X2RhX2NyYyhtYWNfYWRkcikpOworCQl9CisKKwkJLyogV3JpdGUgUnggYWRkcmVzc2VzIHRvIHRoZSBQSFkgKi8KKwkJZTEwMDBfY29weV9yeF9hZGRyc190b19waHlfaWNoOGxhbihodyk7CisKKwkJLyogRW5hYmxlIGp1bWJvIGZyYW1lIHdvcmthcm91bmQgaW4gdGhlIE1BQyAqLworCQltYWNfcmVnID0gZXIzMihGRkxUX0RCRyk7CisJCW1hY19yZWcgJj0gfigxIDw8IDE0KTsKKwkJbWFjX3JlZyB8PSAoNyA8PCAxNSk7CisJCWV3MzIoRkZMVF9EQkcsIG1hY19yZWcpOworCisJCW1hY19yZWcgPSBlcjMyKFJDVEwpOworCQltYWNfcmVnIHw9IEUxMDAwX1JDVExfU0VDUkM7CisJCWV3MzIoUkNUTCwgbWFjX3JlZyk7CisKKwkJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX2ttcm5fcmVnKGh3LAorCQkJCQkJRTEwMDBfS01STkNUUkxTVEFfQ1RSTF9PRkZTRVQsCisJCQkJCQkmZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsCisJCQkJCQlFMTAwMF9LTVJOQ1RSTFNUQV9DVFJMX09GRlNFVCwKKwkJCQkJCWRhdGEgfCAoMSA8PCAwKSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCXJldF92YWwgPSBlMTAwMGVfcmVhZF9rbXJuX3JlZyhodywKKwkJCQkJCUUxMDAwX0tNUk5DVFJMU1RBX0hEX0NUUkwsCisJCQkJCQkmZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCWRhdGEgJj0gfigweEYgPDwgOCk7CisJCWRhdGEgfD0gKDB4QiA8PCA4KTsKKwkJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9rbXJuX3JlZyhodywKKwkJCQkJCUUxMDAwX0tNUk5DVFJMU1RBX0hEX0NUUkwsCisJCQkJCQlkYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKworCQkvKiBFbmFibGUganVtYm8gZnJhbWUgd29ya2Fyb3VuZCBpbiB0aGUgUEhZICovCisJCWUxZV9ycGh5KGh3LCBQSFlfUkVHKDc2OSwgMjApLCAmZGF0YSk7CisJCXJldF92YWwgPSBlMWVfd3BoeShodywgUEhZX1JFRyg3NjksIDIwKSwgZGF0YSAmIH4oMSA8PCAxNCkpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCQllMWVfcnBoeShodywgUEhZX1JFRyg3NjksIDIzKSwgJmRhdGEpOworCQlkYXRhICY9IH4oMHg3RiA8PCA1KTsKKwkJZGF0YSB8PSAoMHgzNyA8PCA1KTsKKwkJcmV0X3ZhbCA9IGUxZV93cGh5KGh3LCBQSFlfUkVHKDc2OSwgMjMpLCBkYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKwkJZTFlX3JwaHkoaHcsIFBIWV9SRUcoNzY5LCAxNiksICZkYXRhKTsKKwkJZGF0YSAmPSB+KDEgPDwgMTMpOworCQlkYXRhIHw9ICgxIDw8IDEyKTsKKwkJcmV0X3ZhbCA9IGUxZV93cGh5KGh3LCBQSFlfUkVHKDc2OSwgMTYpLCBkYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKwkJZTFlX3JwaHkoaHcsIFBIWV9SRUcoNzc2LCAyMCksICZkYXRhKTsKKwkJZGF0YSAmPSB+KDB4M0ZGIDw8IDIpOworCQlkYXRhIHw9ICgweDFBIDw8IDIpOworCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIFBIWV9SRUcoNzc2LCAyMCksIGRhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIFBIWV9SRUcoNzc2LCAyMyksIDB4RkUwMCk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCWUxZV9ycGh5KGh3LCBIVl9QTV9DVFJMLCAmZGF0YSk7CisJCXJldF92YWwgPSBlMWVfd3BoeShodywgSFZfUE1fQ1RSTCwgZGF0YSB8ICgxIDw8IDEwKSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogV3JpdGUgTUFDIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIHRvIGgvdyBkZWZhdWx0cyAqLworCQltYWNfcmVnID0gZXIzMihGRkxUX0RCRyk7CisJCW1hY19yZWcgJj0gfigweEYgPDwgMTQpOworCQlldzMyKEZGTFRfREJHLCBtYWNfcmVnKTsKKworCQltYWNfcmVnID0gZXIzMihSQ1RMKTsKKwkJbWFjX3JlZyAmPSB+RTEwMDBfUkNUTF9TRUNSQzsKKwkJZXczMihGRkxUX0RCRywgbWFjX3JlZyk7CisKKwkJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX2ttcm5fcmVnKGh3LAorCQkJCQkJRTEwMDBfS01STkNUUkxTVEFfQ1RSTF9PRkZTRVQsCisJCQkJCQkmZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsCisJCQkJCQlFMTAwMF9LTVJOQ1RSTFNUQV9DVFJMX09GRlNFVCwKKwkJCQkJCWRhdGEgJiB+KDEgPDwgMCkpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCQlyZXRfdmFsID0gZTEwMDBlX3JlYWRfa21ybl9yZWcoaHcsCisJCQkJCQlFMTAwMF9LTVJOQ1RSTFNUQV9IRF9DVFJMLAorCQkJCQkJJmRhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCQlkYXRhICY9IH4oMHhGIDw8IDgpOworCQlkYXRhIHw9ICgweEIgPDwgOCk7CisJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsCisJCQkJCQlFMTAwMF9LTVJOQ1RSTFNUQV9IRF9DVFJMLAorCQkJCQkJZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisKKwkJLyogV3JpdGUgUEhZIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIHRvIGgvdyBkZWZhdWx0cyAqLworCQllMWVfcnBoeShodywgUEhZX1JFRyg3NjksIDIwKSwgJmRhdGEpOworCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIFBIWV9SRUcoNzY5LCAyMCksIGRhdGEgJiB+KDEgPDwgMTQpKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKwkJZTFlX3JwaHkoaHcsIFBIWV9SRUcoNzY5LCAyMyksICZkYXRhKTsKKwkJZGF0YSAmPSB+KDB4N0YgPDwgNSk7CisJCXJldF92YWwgPSBlMWVfd3BoeShodywgUEhZX1JFRyg3NjksIDIzKSwgZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCWUxZV9ycGh5KGh3LCBQSFlfUkVHKDc2OSwgMTYpLCAmZGF0YSk7CisJCWRhdGEgJj0gfigxIDw8IDEyKTsKKwkJZGF0YSB8PSAoMSA8PCAxMyk7CisJCXJldF92YWwgPSBlMWVfd3BoeShodywgUEhZX1JFRyg3NjksIDE2KSwgZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCWUxZV9ycGh5KGh3LCBQSFlfUkVHKDc3NiwgMjApLCAmZGF0YSk7CisJCWRhdGEgJj0gfigweDNGRiA8PCAyKTsKKwkJZGF0YSB8PSAoMHg4IDw8IDIpOworCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIFBIWV9SRUcoNzc2LCAyMCksIGRhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsIFBIWV9SRUcoNzc2LCAyMyksIDB4N0UwMCk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJCWUxZV9ycGh5KGh3LCBIVl9QTV9DVFJMLCAmZGF0YSk7CisJCXJldF92YWwgPSBlMWVfd3BoeShodywgSFZfUE1fQ1RSTCwgZGF0YSAmIH4oMSA8PCAxMCkpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIHJlLWVuYWJsZSBSeCBwYXRoIGFmdGVyIGVuYWJsaW5nL2Rpc2FibGluZyB3b3JrYXJvdW5kICovCisJcmV0X3ZhbCA9IGUxZV93cGh5KGh3LCBQSFlfUkVHKDc2OSwgMjApLCBwaHlfcmVnICYgfigxIDw8IDE0KSk7CisKK291dDoKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiAgZTEwMDBfbHZfcGh5X3dvcmthcm91bmRzX2ljaDhsYW4gLSBBIHNlcmllcyBvZiBQaHkgd29ya2Fyb3VuZHMgdG8gYmUKKyAqICBkb25lIGFmdGVyIGV2ZXJ5IFBIWSByZXNldC4KKyAqKi8KK3N0YXRpYyBzMzIgZTEwMDBfbHZfcGh5X3dvcmthcm91bmRzX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlzMzIgcmV0X3ZhbCA9IDA7CisKKwlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaDJsYW4pCisJCWdvdG8gb3V0OworCisJLyogU2V0IE1ESU8gc2xvdyBtb2RlIGJlZm9yZSBhbnkgb3RoZXIgTURJTyBhY2Nlc3MgKi8KKwlyZXRfdmFsID0gZTEwMDBfc2V0X21kaW9fc2xvd19tb2RlX2h2KGh3KTsKKworb3V0OgorCXJldHVybiByZXRfdmFsOworfQorCisvKioKICAqICBlMTAwMF9sYW5faW5pdF9kb25lX2ljaDhsYW4gLSBDaGVjayBmb3IgUEhZIGNvbmZpZyBjb21wbGV0aW9uCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqCkBAIC0xMjcxLDEyICsxNjA5LDE3IEBACiAJCWlmIChyZXRfdmFsKQogCQkJZ290byBvdXQ7CiAJCWJyZWFrOworCWNhc2UgZTEwMDBfcGNoMmxhbjoKKwkJcmV0X3ZhbCA9IGUxMDAwX2x2X3BoeV93b3JrYXJvdW5kc19pY2g4bGFuKGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCiAJLyogRHVtbXkgcmVhZCB0byBjbGVhciB0aGUgcGh5IHdha2V1cCBiaXQgYWZ0ZXIgbGNkIHJlc2V0ICovCi0JaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pCisJaWYgKGh3LT5tYWMudHlwZSA+PSBlMTAwMF9wY2hsYW4pCiAJCWUxZV9ycGh5KGh3LCBCTV9XVUMsICZyZWcpOwogCiAJLyogQ29uZmlndXJlIHRoZSBMQ0Qgd2l0aCB0aGUgZXh0ZW5kZWQgY29uZmlndXJhdGlvbiByZWdpb24gaW4gTlZNICovCkBAIC0yODAwLDYgKzMxNDMsNyBAQAogCiAJZXczMihGQ1RUViwgaHctPmZjLnBhdXNlX3RpbWUpOwogCWlmICgoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3OCkgfHwKKwkgICAgKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzkpIHx8CiAJICAgIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc3KSkgewogCQlldzMyKEZDUlRWX1BDSCwgaHctPmZjLnJlZnJlc2hfdGltZSk7CiAKQEAgLTI4NjMsNiArMzIwNyw3IEBACiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJYnJlYWs7CiAJY2FzZSBlMTAwMF9waHlfODI1Nzc6CisJY2FzZSBlMTAwMF9waHlfODI1Nzk6CiAJCXJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19zZXR1cF84MjU3Nyhodyk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CkBAIC0zMTE2LDIxICszNDYxLDEyIEBACiB7CiAJdTMyIHBoeV9jdHJsOwogCi0Jc3dpdGNoIChody0+bWFjLnR5cGUpIHsKLQljYXNlIGUxMDAwX2ljaDhsYW46Ci0JY2FzZSBlMTAwMF9pY2g5bGFuOgotCWNhc2UgZTEwMDBfaWNoMTBsYW46Ci0JY2FzZSBlMTAwMF9wY2hsYW46Ci0JCXBoeV9jdHJsID0gZXIzMihQSFlfQ1RSTCk7Ci0JCXBoeV9jdHJsIHw9IEUxMDAwX1BIWV9DVFJMX0QwQV9MUExVIHwKLQkJICAgICAgICAgICAgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEU7Ci0JCWV3MzIoUEhZX0NUUkwsIHBoeV9jdHJsKTsKKwlwaHlfY3RybCA9IGVyMzIoUEhZX0NUUkwpOworCXBoeV9jdHJsIHw9IEUxMDAwX1BIWV9DVFJMX0QwQV9MUExVIHwgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEU7CisJZXczMihQSFlfQ1RSTCwgcGh5X2N0cmwpOwogCi0JCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKQotCQkJZTEwMDBfcGh5X2h3X3Jlc2V0X2ljaDhsYW4oaHcpOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwlpZiAoaHctPm1hYy50eXBlID49IGUxMDAwX3BjaGxhbikKKwkJZTEwMDBfcGh5X2h3X3Jlc2V0X2ljaDhsYW4oaHcpOwogfQogCiAvKioKQEAgLTMzNzAsNiArMzcwNiw3IEBACiAKIAkvKiBDbGVhciBQSFkgc3RhdGlzdGljcyByZWdpc3RlcnMgKi8KIAlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpIHx8CisJICAgIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc5KSB8fAogCSAgICAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3NykpIHsKIAkJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIEhWX1NDQ19VUFBFUiwgJnBoeV9kYXRhKTsKIAkJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIEhWX1NDQ19MT1dFUiwgJnBoeV9kYXRhKTsKQEAgLTMzOTAsNyArMzcyNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZTEwMDBfbWFjX29wZXJhdGlvbnMgaWNoOF9tYWNfb3BzID0gewogCS5pZF9sZWRfaW5pdAkJPSBlMTAwMGVfaWRfbGVkX2luaXQsCi0JLmNoZWNrX21uZ19tb2RlCQk9IGUxMDAwX2NoZWNrX21uZ19tb2RlX2ljaDhsYW4sCisJLyogY2hlY2tfbW5nX21vZGUgZGVwZW5kZW50IG9uIG1hYyB0eXBlICovCiAJLmNoZWNrX2Zvcl9saW5rCQk9IGUxMDAwX2NoZWNrX2Zvcl9jb3BwZXJfbGlua19pY2g4bGFuLAogCS8qIGNsZWFudXBfbGVkIGRlcGVuZGVudCBvbiBtYWMgdHlwZSAqLwogCS5jbGVhcl9od19jbnRycwkJPSBlMTAwMF9jbGVhcl9od19jbnRyc19pY2g4bGFuLApAQCAtMzQ5Nyw2ICszODM0LDcgQEAKIAkJCQkgIHwgRkxBR19IQVNfSlVNQk9fRlJBTUVTCiAJCQkJICB8IEZMQUdfRElTQUJMRV9GQ19QQVVTRV9USU1FIC8qIGVycmF0YSAqLwogCQkJCSAgfCBGTEFHX0FQTUVfSU5fV1VDLAorCS5mbGFnczIJCQk9IEZMQUcyX0hBU19QSFlfU1RBVFMsCiAJLnBiYQkJCT0gMjYsCiAJLm1heF9od19mcmFtZV9zaXplCT0gNDA5NiwKIAkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c19pY2g4bGFuLApAQCAtMzUwNCwzICszODQyLDIzIEBACiAJLnBoeV9vcHMJCT0gJmljaDhfcGh5X29wcywKIAkubnZtX29wcwkJPSAmaWNoOF9udm1fb3BzLAogfTsKKworc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfcGNoMl9pbmZvID0geworCS5tYWMJCQk9IGUxMDAwX3BjaDJsYW4sCisJLmZsYWdzCQkJPSBGTEFHX0lTX0lDSAorCQkJCSAgfCBGTEFHX0hBU19XT0wKKwkJCQkgIHwgRkxBR19SWF9DU1VNX0VOQUJMRUQKKwkJCQkgIHwgRkxBR19IQVNfQ1RSTEVYVF9PTl9MT0FECisJCQkJICB8IEZMQUdfSEFTX0FNVAorCQkJCSAgfCBGTEFHX0hBU19GTEFTSAorCQkJCSAgfCBGTEFHX0hBU19KVU1CT19GUkFNRVMKKwkJCQkgIHwgRkxBR19BUE1FX0lOX1dVQywKKwkuZmxhZ3MyCQkJPSBGTEFHMl9IQVNfUEhZX1NUQVRTCisJCQkJICB8IEZMQUcyX0hBU19FRUUsCisJLnBiYQkJCT0gMTgsCisJLm1heF9od19mcmFtZV9zaXplCT0gREVGQVVMVF9KVU1CTywKKwkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c19pY2g4bGFuLAorCS5tYWNfb3BzCQk9ICZpY2g4X21hY19vcHMsCisJLnBoeV9vcHMJCT0gJmljaDhfcGh5X29wcywKKwkubnZtX29wcwkJPSAmaWNoOF9udm1fb3BzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYwppbmRleCBhOTY4ZTNhLi5kZjRhMjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvbGliLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2xpYi5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCBQUk8vMTAwMCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwppbmRleCA1N2E3ZTQxLi41MjFjNmVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC01Miw3ICs1Miw5IEBACiAKICNpbmNsdWRlICJlMTAwMC5oIgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIxLjAuMi1rNCIKKyNkZWZpbmUgRFJWX0VYVFJBVkVSU0lPTiAiLWsyIgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjIuNyIgRFJWX0VYVFJBVkVSU0lPTgogY2hhciBlMTAwMGVfZHJpdmVyX25hbWVbXSA9ICJlMTAwMGUiOwogY29uc3QgY2hhciBlMTAwMGVfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogCkBAIC02Nyw2ICs2OSw3IEBACiAJW2JvYXJkX2ljaDlsYW5dCQk9ICZlMTAwMF9pY2g5X2luZm8sCiAJW2JvYXJkX2ljaDEwbGFuXQk9ICZlMTAwMF9pY2gxMF9pbmZvLAogCVtib2FyZF9wY2hsYW5dCQk9ICZlMTAwMF9wY2hfaW5mbywKKwlbYm9hcmRfcGNoMmxhbl0JCT0gJmUxMDAwX3BjaDJfaW5mbywKIH07CiAKIHN0cnVjdCBlMTAwMF9yZWdfaW5mbyB7CkBAIC0yMjEsMTAgKzIyNCwxMCBAQAogCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW3R4X3JpbmctPm5leHRfdG9fY2xlYW5dOwogCXByaW50ayhLRVJOX0lORk8gIiAlNWQgJTVYICU1WCAlMDE2bGxYICUwNFggJTNYICUwMTZsbFhcbiIsCiAJCTAsIHR4X3JpbmctPm5leHRfdG9fdXNlLCB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuLAotCQkodTY0KWJ1ZmZlcl9pbmZvLT5kbWEsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKIAkJYnVmZmVyX2luZm8tPmxlbmd0aCwKIAkJYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2gsCi0JCSh1NjQpYnVmZmVyX2luZm8tPnRpbWVfc3RhbXApOworCQkodW5zaWduZWQgbG9uZyBsb25nKWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wKTsKIAogCS8qIFByaW50IFRYIFJpbmdzICovCiAJaWYgKCFuZXRpZl9tc2dfdHhfZG9uZShhZGFwdGVyKSkKQEAgLTI3Niw5ICsyNzksMTEgQEAKIAkJCSIlMDRYICAlM1ggJTAxNmxsWCAlcCIsCiAJCSAgICAgICAoIShsZTY0X3RvX2NwdSh1MC0+YikgJiAoMTw8MjkpKSA/ICdsJyA6CiAJCQkoKGxlNjRfdG9fY3B1KHUwLT5iKSAmICgxPDwyMCkpID8gJ2QnIDogJ2MnKSksIGksCi0JCSAgICAgICBsZTY0X3RvX2NwdSh1MC0+YSksIGxlNjRfdG9fY3B1KHUwLT5iKSwKLQkJICAgICAgICh1NjQpYnVmZmVyX2luZm8tPmRtYSwgYnVmZmVyX2luZm8tPmxlbmd0aCwKLQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoLCAodTY0KWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MC0+YSksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUwLT5iKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKKwkJICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsIGJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZmZXJfaW5mby0+dGltZV9zdGFtcCwKIAkJICAgICAgIGJ1ZmZlcl9pbmZvLT5za2IpOwogCQlpZiAoaSA9PSB0eF9yaW5nLT5uZXh0X3RvX3VzZSAmJiBpID09IHR4X3JpbmctPm5leHRfdG9fY2xlYW4pCiAJCQlwcmludGsoS0VSTl9DT05UICIgTlRDL1VcbiIpOwpAQCAtMzUzLDE5ICszNTgsMTkgQEAKIAkJCQlwcmludGsoS0VSTl9JTkZPICJSV0JbMHglMDNYXSAgICAgJTAxNmxsWCAiCiAJCQkJCSIlMDE2bGxYICUwMTZsbFggJTAxNmxsWCAiCiAJCQkJCSItLS0tLS0tLS0tLS0tLS0tICVwIiwgaSwKLQkJCQkJbGU2NF90b19jcHUodTEtPmEpLAotCQkJCQlsZTY0X3RvX2NwdSh1MS0+YiksCi0JCQkJCWxlNjRfdG9fY3B1KHUxLT5jKSwKLQkJCQkJbGU2NF90b19jcHUodTEtPmQpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5hKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YiksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmMpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5kKSwKIAkJCQkJYnVmZmVyX2luZm8tPnNrYik7CiAJCQl9IGVsc2UgewogCQkJCXByaW50ayhLRVJOX0lORk8gIlIgIFsweCUwM1hdICAgICAlMDE2bGxYICIKIAkJCQkJIiUwMTZsbFggJTAxNmxsWCAlMDE2bGxYICUwMTZsbFggJXAiLCBpLAotCQkJCQlsZTY0X3RvX2NwdSh1MS0+YSksCi0JCQkJCWxlNjRfdG9fY3B1KHUxLT5iKSwKLQkJCQkJbGU2NF90b19jcHUodTEtPmMpLAotCQkJCQlsZTY0X3RvX2NwdSh1MS0+ZCksCi0JCQkJCSh1NjQpYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YSksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmIpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5jKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+ZCksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKIAkJCQkJYnVmZmVyX2luZm8tPnNrYik7CiAKIAkJCQlpZiAobmV0aWZfbXNnX3BrdGRhdGEoYWRhcHRlcikpCkBAIC00MDIsOSArNDA3LDExIEBACiAJCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAkJCXUwID0gKHN0cnVjdCBteV91MCAqKXJ4X2Rlc2M7CiAJCQlwcmludGsoS0VSTl9JTkZPICJSbFsweCUwM1hdICAgICUwMTZsbFggJTAxNmxsWCAiCi0JCQkJIiUwMTZsbFggJXAiLAotCQkJCWksIGxlNjRfdG9fY3B1KHUwLT5hKSwgbGU2NF90b19jcHUodTAtPmIpLAotCQkJCSh1NjQpYnVmZmVyX2luZm8tPmRtYSwgYnVmZmVyX2luZm8tPnNrYik7CisJCQkJIiUwMTZsbFggJXAiLCBpLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTAtPmEpLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTAtPmIpLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKKwkJCQlidWZmZXJfaW5mby0+c2tiKTsKIAkJCWlmIChpID09IHJ4X3JpbmctPm5leHRfdG9fdXNlKQogCQkJCXByaW50ayhLRVJOX0NPTlQgIiBOVFVcbiIpOwogCQkJZWxzZSBpZiAoaSA9PSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuKQpAQCAtMTc3OCwyNSArMTc4NSwyNSBAQAogdm9pZCBlMTAwMGVfc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCBlcnI7Ci0JaW50IG51bXZlY3MsIGk7Ci0KKwlpbnQgaTsKIAogCXN3aXRjaCAoYWRhcHRlci0+aW50X21vZGUpIHsKIAljYXNlIEUxMDAwRV9JTlRfTU9ERV9NU0lYOgogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0hBU19NU0lYKSB7Ci0JCQludW12ZWNzID0gMzsgLyogUnhRMCwgVHhRMCBhbmQgb3RoZXIgKi8KLQkJCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IGtjYWxsb2MobnVtdmVjcywKKwkJCWFkYXB0ZXItPm51bV92ZWN0b3JzID0gMzsgLyogUnhRMCwgVHhRMCBhbmQgb3RoZXIgKi8KKwkJCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IGtjYWxsb2MoYWRhcHRlci0+bnVtX3ZlY3RvcnMsCiAJCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAogCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IG51bXZlY3M7IGkrKykKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZlY3RvcnM7IGkrKykKIAkJCQkJYWRhcHRlci0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAogCQkJCWVyciA9IHBjaV9lbmFibGVfbXNpeChhZGFwdGVyLT5wZGV2LAogCQkJCQkJICAgICAgYWRhcHRlci0+bXNpeF9lbnRyaWVzLAotCQkJCQkJICAgICAgbnVtdmVjcyk7Ci0JCQkJaWYgKGVyciA9PSAwKQorCQkJCQkJICAgICAgYWRhcHRlci0+bnVtX3ZlY3RvcnMpOworCQkJCWlmIChlcnIgPT0gMCkgewogCQkJCQlyZXR1cm47CisJCQkJfQogCQkJfQogCQkJLyogTVNJLVggZmFpbGVkLCBzbyBmYWxsIHRocm91Z2ggYW5kIHRyeSBNU0kgKi8KIAkJCWVfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNU0ktWCBpbnRlcnJ1cHRzLiAgIgpAQCAtMTgxOCw2ICsxODI1LDkgQEAKIAkJLyogRG9uJ3QgZG8gYW55dGhpbmc7IHRoaXMgaXMgdGhlIHN5c3RlbSBkZWZhdWx0ICovCiAJCWJyZWFrOwogCX0KKworCS8qIHN0b3JlIHRoZSBudW1iZXIgb2YgdmVjdG9ycyBiZWluZyB1c2VkICovCisJYWRhcHRlci0+bnVtX3ZlY3RvcnMgPSAxOwogfQogCiAvKioKQEAgLTE5MzksNyArMTk0OSwxNCBAQAogCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpCiAJCWV3MzIoRUlBQ184MjU3NCwgMCk7CiAJZTFlX2ZsdXNoKCk7Ci0Jc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CisKKwlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZlY3RvcnM7IGkrKykKKwkJCXN5bmNocm9uaXplX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKKwl9IGVsc2UgeworCQlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKKwl9CiB9CiAKIC8qKgpAQCAtMjcyMyw2ICsyNzQwLDE2IEBACiAJCWUxZV93cGh5KGh3LCAyMiwgcGh5X2RhdGEpOwogCX0KIAorCS8qIFdvcmthcm91bmQgU2kgZXJyYXRhIG9uIDgyNTc5IC0gY29uZmlndXJlIGp1bWJvIGZyYW1lIGZsb3cgKi8KKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaDJsYW4pIHsKKwkJczMyIHJldF92YWw7CisKKwkJaWYgKHJjdGwgJiBFMTAwMF9SQ1RMX0xQRSkKKwkJCXJldF92YWwgPSBlMTAwMF9sdl9qdW1ib193b3JrYXJvdW5kX2ljaDhsYW4oaHcsIHRydWUpOworCQllbHNlCisJCQlyZXRfdmFsID0gZTEwMDBfbHZfanVtYm9fd29ya2Fyb3VuZF9pY2g4bGFuKGh3LCBmYWxzZSk7CisJfQorCiAJLyogU2V0dXAgYnVmZmVyIHNpemVzICovCiAJcmN0bCAmPSB+RTEwMDBfUkNUTF9TWl80MDk2OwogCXJjdGwgfD0gRTEwMDBfUkNUTF9CU0VYOwpAQCAtMjc1OSw3ICsyNzg2LDcgQEAKIAkgKiBwZXIgcGFja2V0LgogCSAqLwogCXBhZ2VzID0gUEFHRV9VU0VfQ09VTlQoYWRhcHRlci0+bmV0ZGV2LT5tdHUpOwotCWlmICghKGFkYXB0ZXItPmZsYWdzICYgRkxBR19JU19JQ0gpICYmIChwYWdlcyA8PSAzKSAmJgorCWlmICghKGFkYXB0ZXItPmZsYWdzICYgRkxBR19IQVNfRVJUKSAmJiAocGFnZXMgPD0gMykgJiYKIAkgICAgKFBBR0VfU0laRSA8PSAxNjM4NCkgJiYgKHJjdGwgJiBFMTAwMF9SQ1RMX0xQRSkpCiAJCWFkYXB0ZXItPnJ4X3BzX3BhZ2VzID0gcGFnZXM7CiAJZWxzZQpAQCAtMjkwMSwxMCArMjkyOCwxMCBAQAogCQkJICogZHJvcHBlZCB0cmFuc2FjdGlvbnMuCiAJCQkgKi8KIAkJCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgKLQkJCQlhZGFwdGVyLT5uZXRkZXYtPnBtX3Fvc19yZXEsIDU1KTsKKwkJCQkmYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxLCA1NSk7CiAJCX0gZWxzZSB7CiAJCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxLAorCQkJCSZhZGFwdGVyLT5uZXRkZXYtPnBtX3Fvc19yZXEsCiAJCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwogCQl9CiAJfQpAQCAtMzExOCw3ICszMTQ1LDI3IEBACiAJICogICB3aXRoIEVSVCBzdXBwb3J0IGFzc3VtaW5nIEVSVCBzZXQgdG8gRTEwMDBfRVJUXzIwNDgpLCBvcgogCSAqIC0gdGhlIGZ1bGwgUnggRklGTyBzaXplIG1pbnVzIG9uZSBmdWxsIGZyYW1lCiAJICovCi0JaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pIHsKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0RJU0FCTEVfRkNfUEFVU0VfVElNRSkKKwkJZmMtPnBhdXNlX3RpbWUgPSAweEZGRkY7CisJZWxzZQorCQlmYy0+cGF1c2VfdGltZSA9IEUxMDAwX0ZDX1BBVVNFX1RJTUU7CisJZmMtPnNlbmRfeG9uID0gMTsKKwlmYy0+Y3VycmVudF9tb2RlID0gZmMtPnJlcXVlc3RlZF9tb2RlOworCisJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKKwlkZWZhdWx0OgorCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRkxBR19IQVNfRVJUKSAmJgorCQkgICAgKGFkYXB0ZXItPm5ldGRldi0+bXR1ID4gRVRIX0RBVEFfTEVOKSkKKwkJCWh3bSA9IG1pbigoKHBiYSA8PCAxMCkgKiA5IC8gMTApLAorCQkJCSAgKChwYmEgPDwgMTApIC0gKEUxMDAwX0VSVF8yMDQ4IDw8IDMpKSk7CisJCWVsc2UKKwkJCWh3bSA9IG1pbigoKHBiYSA8PCAxMCkgKiA5IC8gMTApLAorCQkJCSAgKChwYmEgPDwgMTApIC0gYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUpKTsKKworCQlmYy0+aGlnaF93YXRlciA9IGh3bSAmIEUxMDAwX0ZDUlRIX1JUSDsgLyogOC1ieXRlIGdyYW51bGFyaXR5ICovCisJCWZjLT5sb3dfd2F0ZXIgPSBmYy0+aGlnaF93YXRlciAtIDg7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfcGNobGFuOgogCQkvKgogCQkgKiBXb3JrYXJvdW5kIFBDSCBMT00gYWRhcHRlciBoYW5ncyB3aXRoIGNlcnRhaW4gbmV0d29yawogCQkgKiBsb2Fkcy4gIElmIGhhbmdzIHBlcnNpc3QsIHRyeSBkaXNhYmxpbmcgVHggZmxvdyBjb250cm9sLgpAQCAtMzEzMSwyNiArMzE3OCwxNSBAQAogCQkJZmMtPmxvd193YXRlciAgPSAweDMwMDA7CiAJCX0KIAkJZmMtPnJlZnJlc2hfdGltZSA9IDB4MTAwMDsKLQl9IGVsc2UgewotCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRkxBR19IQVNfRVJUKSAmJgotCQkgICAgKGFkYXB0ZXItPm5ldGRldi0+bXR1ID4gRVRIX0RBVEFfTEVOKSkKLQkJCWh3bSA9IG1pbigoKHBiYSA8PCAxMCkgKiA5IC8gMTApLAotCQkJCSAgKChwYmEgPDwgMTApIC0gKEUxMDAwX0VSVF8yMDQ4IDw8IDMpKSk7Ci0JCWVsc2UKLQkJCWh3bSA9IG1pbigoKHBiYSA8PCAxMCkgKiA5IC8gMTApLAotCQkJCSAgKChwYmEgPDwgMTApIC0gYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUpKTsKLQotCQlmYy0+aGlnaF93YXRlciA9IGh3bSAmIEUxMDAwX0ZDUlRIX1JUSDsgLyogOC1ieXRlIGdyYW51bGFyaXR5ICovCi0JCWZjLT5sb3dfd2F0ZXIgPSBmYy0+aGlnaF93YXRlciAtIDg7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfcGNoMmxhbjoKKwkJZmMtPmhpZ2hfd2F0ZXIgPSAweDA1QzIwOworCQlmYy0+bG93X3dhdGVyID0gMHgwNTA0ODsKKwkJZmMtPnBhdXNlX3RpbWUgPSAweDA2NTA7CisJCWZjLT5yZWZyZXNoX3RpbWUgPSAweDA0MDA7CisJCWJyZWFrOwogCX0KIAotCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfRElTQUJMRV9GQ19QQVVTRV9USU1FKQotCQlmYy0+cGF1c2VfdGltZSA9IDB4RkZGRjsKLQllbHNlCi0JCWZjLT5wYXVzZV90aW1lID0gRTEwMDBfRkNfUEFVU0VfVElNRTsKLQlmYy0+c2VuZF94b24gPSAxOwotCWZjLT5jdXJyZW50X21vZGUgPSBmYy0+cmVxdWVzdGVkX21vZGU7Ci0KIAkvKiBBbGxvdyB0aW1lIGZvciBwZW5kaW5nIG1hc3RlciByZXF1ZXN0cyB0byBydW4gKi8KIAltYWMtPm9wcy5yZXNldF9odyhodyk7CiAKQEAgLTMxNjIsOCArMzE5OCw2IEBACiAJCWUxMDAwX2dldF9od19jb250cm9sKGFkYXB0ZXIpOwogCiAJZXczMihXVUMsIDApOwotCWlmIChhZGFwdGVyLT5mbGFnczIgJiBGTEFHMl9IQVNfUEhZX1dBS0VVUCkKLQkJZTFlX3dwaHkoJmFkYXB0ZXItPmh3LCBCTV9XVUMsIDApOwogCiAJaWYgKG1hYy0+b3BzLmluaXRfaHcoaHcpKQogCQllX2VycigiSGFyZHdhcmUgRXJyb3JcbiIpOwpAQCAtMzE5NCwxMiArMzIyOCw2IEBACiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAotCS8qIERNQSBsYXRlbmN5IHJlcXVpcmVtZW50IHRvIHdvcmthcm91bmQgZWFybHktcmVjZWl2ZS9qdW1ibyBpc3N1ZSAqLwotCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfSEFTX0VSVCkKLQkJYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxID0KLQkJCXBtX3Fvc19hZGRfcmVxdWVzdChQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCSAgICAgICBQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0KIAkvKiBoYXJkd2FyZSBoYXMgYmVlbiByZXNldCwgd2UgbmVlZCB0byByZWxvYWQgc29tZSB0aGluZ3MgKi8KIAllMTAwMF9jb25maWd1cmUoYWRhcHRlcik7CiAKQEAgLTMyNjMsMTIgKzMyOTEsNiBAQAogCWUxMDAwX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CiAJZTEwMDBfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKIAotCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfSEFTX0VSVCkgewotCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoCi0JCQkgICAgICBhZGFwdGVyLT5uZXRkZXYtPnBtX3Fvc19yZXEpOwotCQlhZGFwdGVyLT5uZXRkZXYtPnBtX3Fvc19yZXEgPSBOVUxMOwotCX0KLQogCS8qCiAJICogVE9ETzogZm9yIHBvd2VyIG1hbmFnZW1lbnQsIHdlIGNvdWxkIGRyb3AgdGhlIGxpbmsgYW5kCiAJICogcGNpX2Rpc2FibGVfZGV2aWNlIGhlcmUuCkBAIC0zNDE5LDEzICszNDQxLDE4IEBACiAKIAkvKiBkaXNhYmxlIFNFUlIgaW4gY2FzZSB0aGUgTVNJIHdyaXRlIGNhdXNlcyBhIG1hc3RlciBhYm9ydCAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIFBDSV9DT01NQU5ELAotCQkJICAgICAgcGNpX2NtZCAmIH5QQ0lfQ09NTUFORF9TRVJSKTsKKwlpZiAocGNpX2NtZCAmIFBDSV9DT01NQU5EX1NFUlIpCisJCXBjaV93cml0ZV9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCQkgICAgICBwY2lfY21kICYgflBDSV9DT01NQU5EX1NFUlIpOwogCiAJZXJyID0gZTEwMDBfdGVzdF9tc2lfaW50ZXJydXB0KGFkYXB0ZXIpOwogCi0JLyogcmVzdG9yZSBwcmV2aW91cyBzZXR0aW5nIG9mIGNvbW1hbmQgd29yZCAqLwotCXBjaV93cml0ZV9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7CisJLyogcmUtZW5hYmxlIFNFUlIgKi8KKwlpZiAocGNpX2NtZCAmIFBDSV9DT01NQU5EX1NFUlIpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKKwkJcGNpX2NtZCB8PSBQQ0lfQ09NTUFORF9TRVJSOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOworCX0KIAogCS8qIHN1Y2Nlc3MgISAqLwogCWlmICghZXJyKQpAQCAtMzQ5OCw2ICszNTI1LDEyIEBACiAJICAgICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU4pKQogCQllMTAwMF91cGRhdGVfbW5nX3ZsYW4oYWRhcHRlcik7CiAKKwkvKiBETUEgbGF0ZW5jeSByZXF1aXJlbWVudCB0byB3b3JrYXJvdW5kIGVhcmx5LXJlY2VpdmUvanVtYm8gaXNzdWUgKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0hBU19FUlQpCisJCXBtX3Fvc19hZGRfcmVxdWVzdCgmYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxLAorCQkJCSAgIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCisJCQkJICAgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOworCiAJLyoKIAkgKiBiZWZvcmUgd2UgYWxsb2NhdGUgYW4gaW50ZXJydXB0LCB3ZSBtdXN0IGJlIHJlYWR5IHRvIGhhbmRsZSBpdC4KIAkgKiBTZXR0aW5nIERFQlVHX1NISVJRIGluIHRoZSBrZXJuZWwgbWFrZXMgaXQgZmlyZSBhbiBpbnRlcnJ1cHQKQEAgLTM2MDIsNiArMzYzNSw5IEBACiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19IQVNfQU1UKQogCQllMTAwMF9yZWxlYXNlX2h3X2NvbnRyb2woYWRhcHRlcik7CiAKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0hBU19FUlQpCisJCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxKTsKKwogCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTM2NzIsNiArMzcwOCwxMTAgQEAKIH0KIAogLyoqCisgKiBlMTAwMGVfdXBkYXRlX3BoeV9zdGF0cyAtIFVwZGF0ZSB0aGUgUEhZIHN0YXRpc3RpY3MgY291bnRlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworc3RhdGljIHZvaWQgZTEwMDBlX3VwZGF0ZV9waHlfc3RhdHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X2RhdGE7CisKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZShodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybjsKKworCWh3LT5waHkuYWRkciA9IDE7CisKKyNkZWZpbmUgSFZfUEhZX1NUQVRTX1BBR0UJNzc4CisJLyoKKwkgKiBBIHBhZ2Ugc2V0IGlzIGV4cGVuc2l2ZSBzbyBjaGVjayBpZiBhbHJlYWR5IG9uIGRlc2lyZWQgcGFnZS4KKwkgKiBJZiBub3QsIHNldCB0byB0aGUgcGFnZSB3aXRoIHRoZSBQSFkgc3RhdHVzIHJlZ2lzdGVycy4KKwkgKi8KKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkJICAgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJZ290byByZWxlYXNlOworCWlmIChwaHlfZGF0YSAhPSAoSFZfUEhZX1NUQVRTX1BBR0UgPDwgSUdQX1BBR0VfU0hJRlQpKSB7CisJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LAorCQkJCQkJICAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCQkJICAgIChIVl9QSFlfU1RBVFNfUEFHRSA8PAorCQkJCQkJICAgICBJR1BfUEFHRV9TSElGVCkpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwkvKiBSZWFkL2NsZWFyIHRoZSB1cHBlciAxNi1iaXQgcmVnaXN0ZXJzIGFuZCByZWFkL2FjY3VtdWxhdGUgbG93ZXIgKi8KKworCS8qIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgKi8KKwllMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIEhWX1NDQ19VUFBFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCisJCQkJICZwaHlfZGF0YSk7CisJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywKKwkJCQkJICAgSFZfU0NDX0xPV0VSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKKwkJCQkJICAgJnBoeV9kYXRhKTsKKwlpZiAoIXJldF92YWwpCisJCWFkYXB0ZXItPnN0YXRzLnNjYyArPSBwaHlfZGF0YTsKKworCS8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnQgKi8KKwllMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIEhWX0VDT0xfVVBQRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAorCQkJCSAmcGh5X2RhdGEpOworCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCisJCQkJCSAgIEhWX0VDT0xfTE9XRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAorCQkJCQkgICAmcGh5X2RhdGEpOworCWlmICghcmV0X3ZhbCkKKwkJYWRhcHRlci0+c3RhdHMuZWNvbCArPSBwaHlfZGF0YTsKKworCS8qIE11bHRpcGxlIENvbGxpc2lvbiBDb3VudCAqLworCWUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgSFZfTUNDX1VQUEVSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKKwkJCQkgJnBoeV9kYXRhKTsKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LAorCQkJCQkgICBIVl9NQ0NfTE9XRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAorCQkJCQkgICAmcGh5X2RhdGEpOworCWlmICghcmV0X3ZhbCkKKwkJYWRhcHRlci0+c3RhdHMubWNjICs9IHBoeV9kYXRhOworCisJLyogTGF0ZSBDb2xsaXNpb24gQ291bnQgKi8KKwllMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIEhWX0xBVEVDT0xfVVBQRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAorCQkJCSAmcGh5X2RhdGEpOworCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCisJCQkJCSAgIEhWX0xBVEVDT0xfTE9XRVIgJgorCQkJCQkgICBNQVhfUEhZX1JFR19BRERSRVNTLAorCQkJCQkgICAmcGh5X2RhdGEpOworCWlmICghcmV0X3ZhbCkKKwkJYWRhcHRlci0+c3RhdHMubGF0ZWNvbCArPSBwaHlfZGF0YTsKKworCS8qIENvbGxpc2lvbiBDb3VudCAtIGFsc28gdXNlZCBmb3IgYWRhcHRpdmUgSUZTICovCisJZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBIVl9DT0xDX1VQUEVSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKKwkJCQkgJnBoeV9kYXRhKTsKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LAorCQkJCQkgICBIVl9DT0xDX0xPV0VSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKKwkJCQkJICAgJnBoeV9kYXRhKTsKKwlpZiAoIXJldF92YWwpCisJCWh3LT5tYWMuY29sbGlzaW9uX2RlbHRhID0gcGh5X2RhdGE7CisKKwkvKiBEZWZlciBDb3VudCAqLworCWUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgSFZfRENfVVBQRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAorCQkJCSAmcGh5X2RhdGEpOworCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCisJCQkJCSAgIEhWX0RDX0xPV0VSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKKwkJCQkJICAgJnBoeV9kYXRhKTsKKwlpZiAoIXJldF92YWwpCisJCWFkYXB0ZXItPnN0YXRzLmRjICs9IHBoeV9kYXRhOworCisJLyogVHJhbnNtaXQgd2l0aCBubyBDUlMgKi8KKwllMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIEhWX1ROQ1JTX1VQUEVSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKKwkJCQkgJnBoeV9kYXRhKTsKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LAorCQkJCQkgICBIVl9UTkNSU19MT1dFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCisJCQkJCSAgICZwaHlfZGF0YSk7CisJaWYgKCFyZXRfdmFsKQorCQlhZGFwdGVyLT5zdGF0cy50bmNycyArPSBwaHlfZGF0YTsKKworcmVsZWFzZToKKwlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKK30KKworLyoqCiAgKiBlMTAwMGVfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KQEAgLTM2ODAsNyArMzgyMCw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQl1MTYgcGh5X2RhdGE7CiAKIAkvKgogCSAqIFByZXZlbnQgc3RhdHMgdXBkYXRlIHdoaWxlIGFkYXB0ZXIgaXMgYmVpbmcgcmVzZXQsIG9yIGlmIHRoZSBwY2kKQEAgLTM3MDAsMzQgKzM4MzksMjcgQEAKIAlhZGFwdGVyLT5zdGF0cy5yb2MgKz0gZXIzMihST0MpOwogCiAJYWRhcHRlci0+c3RhdHMubXBjICs9IGVyMzIoTVBDKTsKLQlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpIHx8Ci0JICAgIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc3KSkgewotCQllMWVfcnBoeShodywgSFZfU0NDX1VQUEVSLCAmcGh5X2RhdGEpOwotCQlpZiAoIWUxZV9ycGh5KGh3LCBIVl9TQ0NfTE9XRVIsICZwaHlfZGF0YSkpCi0JCQlhZGFwdGVyLT5zdGF0cy5zY2MgKz0gcGh5X2RhdGE7CiAKLQkJZTFlX3JwaHkoaHcsIEhWX0VDT0xfVVBQRVIsICZwaHlfZGF0YSk7Ci0JCWlmICghZTFlX3JwaHkoaHcsIEhWX0VDT0xfTE9XRVIsICZwaHlfZGF0YSkpCi0JCQlhZGFwdGVyLT5zdGF0cy5lY29sICs9IHBoeV9kYXRhOworCS8qIEhhbGYtZHVwbGV4IHN0YXRpc3RpY3MgKi8KKwlpZiAoYWRhcHRlci0+bGlua19kdXBsZXggPT0gSEFMRl9EVVBMRVgpIHsKKwkJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIEZMQUcyX0hBU19QSFlfU1RBVFMpIHsKKwkJCWUxMDAwZV91cGRhdGVfcGh5X3N0YXRzKGFkYXB0ZXIpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+c3RhdHMuc2NjICs9IGVyMzIoU0NDKTsKKwkJCWFkYXB0ZXItPnN0YXRzLmVjb2wgKz0gZXIzMihFQ09MKTsKKwkJCWFkYXB0ZXItPnN0YXRzLm1jYyArPSBlcjMyKE1DQyk7CisJCQlhZGFwdGVyLT5zdGF0cy5sYXRlY29sICs9IGVyMzIoTEFURUNPTCk7CisJCQlhZGFwdGVyLT5zdGF0cy5kYyArPSBlcjMyKERDKTsKIAotCQllMWVfcnBoeShodywgSFZfTUNDX1VQUEVSLCAmcGh5X2RhdGEpOwotCQlpZiAoIWUxZV9ycGh5KGh3LCBIVl9NQ0NfTE9XRVIsICZwaHlfZGF0YSkpCi0JCQlhZGFwdGVyLT5zdGF0cy5tY2MgKz0gcGh5X2RhdGE7CisJCQlody0+bWFjLmNvbGxpc2lvbl9kZWx0YSA9IGVyMzIoQ09MQyk7CiAKLQkJZTFlX3JwaHkoaHcsIEhWX0xBVEVDT0xfVVBQRVIsICZwaHlfZGF0YSk7Ci0JCWlmICghZTFlX3JwaHkoaHcsIEhWX0xBVEVDT0xfTE9XRVIsICZwaHlfZGF0YSkpCi0JCQlhZGFwdGVyLT5zdGF0cy5sYXRlY29sICs9IHBoeV9kYXRhOwotCi0JCWUxZV9ycGh5KGh3LCBIVl9EQ19VUFBFUiwgJnBoeV9kYXRhKTsKLQkJaWYgKCFlMWVfcnBoeShodywgSFZfRENfTE9XRVIsICZwaHlfZGF0YSkpCi0JCQlhZGFwdGVyLT5zdGF0cy5kYyArPSBwaHlfZGF0YTsKLQl9IGVsc2UgewotCQlhZGFwdGVyLT5zdGF0cy5zY2MgKz0gZXIzMihTQ0MpOwotCQlhZGFwdGVyLT5zdGF0cy5lY29sICs9IGVyMzIoRUNPTCk7Ci0JCWFkYXB0ZXItPnN0YXRzLm1jYyArPSBlcjMyKE1DQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmxhdGVjb2wgKz0gZXIzMihMQVRFQ09MKTsKLQkJYWRhcHRlci0+c3RhdHMuZGMgKz0gZXIzMihEQyk7CisJCQlpZiAoKGh3LT5tYWMudHlwZSAhPSBlMTAwMF84MjU3NCkgJiYKKwkJCSAgICAoaHctPm1hYy50eXBlICE9IGUxMDAwXzgyNTgzKSkKKwkJCQlhZGFwdGVyLT5zdGF0cy50bmNycyArPSBlcjMyKFROQ1JTKTsKKwkJfQorCQlhZGFwdGVyLT5zdGF0cy5jb2xjICs9IGh3LT5tYWMuY29sbGlzaW9uX2RlbHRhOwogCX0KKwogCWFkYXB0ZXItPnN0YXRzLnhvbnJ4YyArPSBlcjMyKFhPTlJYQyk7CiAJYWRhcHRlci0+c3RhdHMueG9udHhjICs9IGVyMzIoWE9OVFhDKTsKIAlhZGFwdGVyLT5zdGF0cy54b2ZmcnhjICs9IGVyMzIoWE9GRlJYQyk7CkBAIC0zNzQ1LDI4ICszODc3LDkgQEAKIAogCWh3LT5tYWMudHhfcGFja2V0X2RlbHRhID0gZXIzMihUUFQpOwogCWFkYXB0ZXItPnN0YXRzLnRwdCArPSBody0+bWFjLnR4X3BhY2tldF9kZWx0YTsKLQlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpIHx8Ci0JICAgIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc3KSkgewotCQllMWVfcnBoeShodywgSFZfQ09MQ19VUFBFUiwgJnBoeV9kYXRhKTsKLQkJaWYgKCFlMWVfcnBoeShodywgSFZfQ09MQ19MT1dFUiwgJnBoeV9kYXRhKSkKLQkJCWh3LT5tYWMuY29sbGlzaW9uX2RlbHRhID0gcGh5X2RhdGE7Ci0JfSBlbHNlIHsKLQkJaHctPm1hYy5jb2xsaXNpb25fZGVsdGEgPSBlcjMyKENPTEMpOwotCX0KLQlhZGFwdGVyLT5zdGF0cy5jb2xjICs9IGh3LT5tYWMuY29sbGlzaW9uX2RlbHRhOwogCiAJYWRhcHRlci0+c3RhdHMuYWxnbmVycmMgKz0gZXIzMihBTEdORVJSQyk7CiAJYWRhcHRlci0+c3RhdHMucnhlcnJjICs9IGVyMzIoUlhFUlJDKTsKLQlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpIHx8Ci0JICAgIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc3KSkgewotCQllMWVfcnBoeShodywgSFZfVE5DUlNfVVBQRVIsICZwaHlfZGF0YSk7Ci0JCWlmICghZTFlX3JwaHkoaHcsIEhWX1ROQ1JTX0xPV0VSLCAmcGh5X2RhdGEpKQotCQkJYWRhcHRlci0+c3RhdHMudG5jcnMgKz0gcGh5X2RhdGE7Ci0JfSBlbHNlIHsKLQkJaWYgKChody0+bWFjLnR5cGUgIT0gZTEwMDBfODI1NzQpICYmCi0JCSAgICAoaHctPm1hYy50eXBlICE9IGUxMDAwXzgyNTgzKSkKLQkJCWFkYXB0ZXItPnN0YXRzLnRuY3JzICs9IGVyMzIoVE5DUlMpOwotCX0KIAlhZGFwdGVyLT5zdGF0cy5jZXh0ZXJyICs9IGVyMzIoQ0VYVEVSUik7CiAJYWRhcHRlci0+c3RhdHMudHNjdGMgKz0gZXIzMihUU0NUQyk7CiAJYWRhcHRlci0+c3RhdHMudHNjdGZjICs9IGVyMzIoVFNDVEZDKTsKQEAgLTM4NjUsNyArMzk3OCw3IEBACiAJICAgICAgICgoY3RybCAmIEUxMDAwX0NUUkxfVEZDRSkgPyAiVFgiIDogIk5vbmUiICkpKTsKIH0KIAotYm9vbCBlMTAwMGVfaGFzX2xpbmsoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgYm9vbCBlMTAwMGVfaGFzX2xpbmsoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlib29sIGxpbmtfYWN0aXZlID0gMDsKQEAgLTQ4NDEsMTQgKzQ5NTQsNyBAQAogCWludCByZXR2YWwgPSAwOwogCiAJLyogY29weSBNQUMgUkFScyB0byBQSFkgUkFScyAqLwotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5ody5tYWMucmFyX2VudHJ5X2NvdW50OyBpKyspIHsKLQkJbWFjX3JlZyA9IGVyMzIoUkFMKGkpKTsKLQkJZTFlX3dwaHkoaHcsIEJNX1JBUl9MKGkpLCAodTE2KShtYWNfcmVnICYgMHhGRkZGKSk7Ci0JCWUxZV93cGh5KGh3LCBCTV9SQVJfTShpKSwgKHUxNikoKG1hY19yZWcgPj4gMTYpICYgMHhGRkZGKSk7Ci0JCW1hY19yZWcgPSBlcjMyKFJBSChpKSk7Ci0JCWUxZV93cGh5KGh3LCBCTV9SQVJfSChpKSwgKHUxNikobWFjX3JlZyAmIDB4RkZGRikpOwotCQllMWVfd3BoeShodywgQk1fUkFSX0NUUkwoaSksICh1MTYpKChtYWNfcmVnID4+IDE2KSAmIDB4RkZGRikpOwotCX0KKwllMTAwMF9jb3B5X3J4X2FkZHJzX3RvX3BoeV9pY2g4bGFuKGh3KTsKIAogCS8qIGNvcHkgTUFDIE1UQSB0byBQSFkgTVRBICovCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmh3Lm1hYy5tdGFfcmVnX2NvdW50OyBpKyspIHsKQEAgLTU1NTEsOCArNTY1Nyw2IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfc3dfaW5pdDsKIAotCWVyciA9IC1FSU87Ci0KIAltZW1jcHkoJmh3LT5tYWMub3BzLCBlaS0+bWFjX29wcywgc2l6ZW9mKGh3LT5tYWMub3BzKSk7CiAJbWVtY3B5KCZody0+bnZtLm9wcywgZWktPm52bV9vcHMsIHNpemVvZihody0+bnZtLm9wcykpOwogCW1lbWNweSgmaHctPnBoeS5vcHMsIGVpLT5waHlfb3BzLCBzaXplb2YoaHctPnBoeS5vcHMpKTsKQEAgLTU3MjEsMTEgKzU4MjUsOCBAQAogCiAJZTEwMDBfcHJpbnRfZGV2aWNlX2luZm8oYWRhcHRlcik7CiAKLQlpZiAocGNpX2Rldl9ydW5fd2FrZShwZGV2KSkgewotCQlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwotCX0KLQlwbV9zY2hlZHVsZV9zdXNwZW5kKCZwZGV2LT5kZXYsIE1TRUNfUEVSX1NFQyk7CisJaWYgKHBjaV9kZXZfcnVuX3dha2UocGRldikpCisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRldi0+ZGV2KTsKIAogCXJldHVybiAwOwogCkBAIC01NzcxLDggKzU4NzIsNiBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlib29sIGRvd24gPSB0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5zdGF0ZSk7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwotCiAJLyoKIAkgKiBmbHVzaF9zY2hlZHVsZWQgd29yayBtYXkgcmVzY2hlZHVsZSBvdXIgd2F0Y2hkb2cgdGFzaywgc28KIAkgKiBleHBsaWNpdGx5IGRpc2FibGUgd2F0Y2hkb2cgdGFza3MgZnJvbSBiZWluZyByZXNjaGVkdWxlZApAQCAtNTc5NywxMSArNTg5Niw4IEBACiAJCWNsZWFyX2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5zdGF0ZSk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAotCWlmIChwY2lfZGV2X3J1bl93YWtlKHBkZXYpKSB7Ci0JCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZwZGV2LT5kZXYpOwotCX0KLQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisJaWYgKHBjaV9kZXZfcnVuX3dha2UocGRldikpCisJCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZwZGV2LT5kZXYpOwogCiAJLyoKIAkgKiBSZWxlYXNlIGNvbnRyb2wgb2YgaC93IHRvIGYvdy4gIElmIGYvdyBpcyBBTVQgZW5hYmxlZCwgdGhpcwpAQCAtNTg5OSw2ICs1OTk1LDkgQEAKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfUENIX0RfSFZfRE0pLCBib2FyZF9wY2hsYW4gfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfUENIX0RfSFZfREMpLCBib2FyZF9wY2hsYW4gfSwKIAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9QQ0gyX0xWX0xNKSwgYm9hcmRfcGNoMmxhbiB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9QQ0gyX0xWX1YpLCBib2FyZF9wY2gybGFuIH0sCisKIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZTEwMDBfcGNpX3RibCk7CkBAIC01OTM1LDcgKzYwMzQsNyBAQAogCWludCByZXQ7CiAJcHJfaW5mbygiSW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBEcml2ZXIgLSAlc1xuIiwKIAkJZTEwMDBlX2RyaXZlcl92ZXJzaW9uKTsKLQlwcl9pbmZvKCJDb3B5cmlnaHQgKGMpIDE5OTkgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLlxuIik7CisJcHJfaW5mbygiQ29weXJpZ2h0IChjKSAxOTk5IC0gMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi5cbiIpOwogCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmUxMDAwX2RyaXZlcik7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGFyYW0uYwppbmRleCBhMTUwZTQ4Li4zNGFlZWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvcGFyYW0uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGFyYW0uYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKaW5kZXggYjRhYzgyZC4uM2QzZGMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgUFJPLzEwMDAgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMzE5LDYgKzIzMTksOSBAQAogCWNhc2UgSTgyNTc3X0VfUEhZX0lEOgogCQlwaHlfdHlwZSA9IGUxMDAwX3BoeV84MjU3NzsKIAkJYnJlYWs7CisJY2FzZSBJODI1NzlfRV9QSFlfSUQ6CisJCXBoeV90eXBlID0gZTEwMDBfcGh5XzgyNTc5OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwaHlfdHlwZSA9IGUxMDAwX3BoeV91bmtub3duOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IDhiOTJhY2IuLjNiZWJhNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAKIAltZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKIAotCWNiMiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCWNiMiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghY2IyKSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2IyIik7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCmluZGV4IDg4MmM1MGMuLmY2MDhhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKQEAgLTEyNiw3ICsxMjYsNyBAQAogCQkJdTggaW1tZWRpYXRlX2RhdGFbU1dRRTJfTUFYX0lNTV07CiAJCQkvKiAweGQwICovCiAJCQlzdHJ1Y3QgZWhlYV92c2dlbnRyeSBzZ19saXN0W0VIRUFfTUFYX1dRRV9TR19FTlRSSUVTLTFdOwotCQl9IGltbWRhdGFfZGVzYyBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJCX0gaW1tZGF0YV9kZXNjIF9fcGFja2VkOwogCiAJCS8qICBTZW5kIFdRRSBGb3JtYXQgMyAqLwogCQlzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9jcV9kZXNjLmggYi9kcml2ZXJzL25ldC9lbmljL2NxX2Rlc2MuaAppbmRleCAxZWIyODlmLi5kNmRkMWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL2NxX2Rlc2MuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL2NxX2Rlc2MuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9jcV9lbmV0X2Rlc2MuaCBiL2RyaXZlcnMvbmV0L2VuaWMvY3FfZW5ldF9kZXNjLmgKaW5kZXggMzM3ZDE5NC4uYzJjMDY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9jcV9lbmV0X2Rlc2MuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL2NxX2VuZXRfZGVzYy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC03Myw3ICs3MywxNiBAQAogI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkxBR1NfVFJVTkNBVEVEICAgICAgICAgICAgICgweDEgPDwgMTQpCiAjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19WTEFOX1NUUklQUEVEICAgICAgICAgKDB4MSA8PCAxNSkKIAotI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkNPRV9TT0ZfQklUUyAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX1ZMQU5fVENJX1ZMQU5fQklUUyAgICAgICAgICAxMgorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfVkxBTl9UQ0lfVkxBTl9NQVNLIFwKKwkoKDEgPDwgQ1FfRU5FVF9SUV9ERVNDX1ZMQU5fVENJX1ZMQU5fQklUUykgLSAxKQorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfVkxBTl9UQ0lfQ0ZJX01BU0sgICAgICAgICAgICgweDEgPDwgMTIpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19WTEFOX1RDSV9VU0VSX1BSSU9fQklUUyAgICAgMworI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfVkxBTl9UQ0lfVVNFUl9QUklPX01BU0sgXAorCSgoMSA8PCBDUV9FTkVUX1JRX0RFU0NfVkxBTl9UQ0lfVVNFUl9QUklPX0JJVFMpIC0gMSkKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX1ZMQU5fVENJX1VTRVJfUFJJT19TSElGVCAgICAxMworCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GQ09FX1NPRl9CSVRTICAgICAgICAgICAgICAgOAogI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkNPRV9TT0ZfTUFTSyBcCiAJKCgxIDw8IENRX0VORVRfUlFfREVTQ19GQ09FX1NPRl9CSVRTKSAtIDEpCiAjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GQ09FX0VPRl9CSVRTICAgICAgICAgICAgICAgOApAQCAtOTYsNyArMTA1LDcgQEAKIAl1OCAqdHlwZSwgdTggKmNvbG9yLCB1MTYgKnFfbnVtYmVyLCB1MTYgKmNvbXBsZXRlZF9pbmRleCwKIAl1OCAqaW5ncmVzc19wb3J0LCB1OCAqZmNvZSwgdTggKmVvcCwgdTggKnNvcCwgdTggKnJzc190eXBlLAogCXU4ICpjc3VtX25vdF9jYWxjLCB1MzIgKnJzc19oYXNoLCB1MTYgKmJ5dGVzX3dyaXR0ZW4sIHU4ICpwYWNrZXRfZXJyb3IsCi0JdTggKnZsYW5fc3RyaXBwZWQsIHUxNiAqdmxhbiwgdTE2ICpjaGVja3N1bSwgdTggKmZjb2Vfc29mLAorCXU4ICp2bGFuX3N0cmlwcGVkLCB1MTYgKnZsYW5fdGNpLCB1MTYgKmNoZWNrc3VtLCB1OCAqZmNvZV9zb2YsCiAJdTggKmZjb2VfZmNfY3JjX29rLCB1OCAqZmNvZV9lbmNfZXJyb3IsIHU4ICpmY29lX2VvZiwKIAl1OCAqdGNwX3VkcF9jc3VtX29rLCB1OCAqdWRwLCB1OCAqdGNwLCB1OCAqaXB2NF9jc3VtX29rLAogCXU4ICppcHY2LCB1OCAqaXB2NCwgdTggKmlwdjRfZnJhZ21lbnQsIHU4ICpmY3Nfb2spCkBAIC0xMzYsNyArMTQ1LDEwIEBACiAJKnZsYW5fc3RyaXBwZWQgPSAoYnl0ZXNfd3JpdHRlbl9mbGFncyAmCiAJCUNRX0VORVRfUlFfREVTQ19GTEFHU19WTEFOX1NUUklQUEVEKSA/IDEgOiAwOwogCi0JKnZsYW4gPSBsZTE2X3RvX2NwdShkZXNjLT52bGFuKTsKKwkvKgorCSAqIFRhZyBDb250cm9sIEluZm9ybWF0aW9uKDE2KSA9IHVzZXJfcHJpb3JpdHkoMykgKyBjZmkoMSkgKyB2bGFuKDEyKQorCSAqLworCSp2bGFuX3RjaSA9IGxlMTZfdG9fY3B1KGRlc2MtPnZsYW4pOwogCiAJaWYgKCpmY29lKSB7CiAJCSpmY29lX3NvZiA9ICh1OCkobGUxNl90b19jcHUoZGVzYy0+Y2hlY2tzdW1fZmNvZSkgJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9lbmljLmggYi9kcml2ZXJzL25ldC9lbmljL2VuaWMuaAppbmRleCA0NWU4NmQxLi5mMjM5YWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL2VuaWMuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL2VuaWMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjAsOCArMjAsNiBAQAogI2lmbmRlZiBfRU5JQ19IXwogI2RlZmluZSBfRU5JQ19IXwogCi0jaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KLQogI2luY2x1ZGUgInZuaWNfZW5ldC5oIgogI2luY2x1ZGUgInZuaWNfZGV2LmgiCiAjaW5jbHVkZSAidm5pY193cS5oIgpAQCAtMzQsMTIgKzMyLDggQEAKIAogI2RlZmluZSBEUlZfTkFNRQkJImVuaWMiCiAjZGVmaW5lIERSVl9ERVNDUklQVElPTgkJIkNpc2NvIFZJQyBFdGhlcm5ldCBOSUMgRHJpdmVyIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMy4xLjEtcHAiCi0jZGVmaW5lIERSVl9DT1BZUklHSFQJCSJDb3B5cmlnaHQgMjAwOC0yMDA5IENpc2NvIFN5c3RlbXMsIEluYyIKLSNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgotCi0jZGVmaW5lIEVOSUNfTFJPX01BWF9ERVNDCTgKLSNkZWZpbmUgRU5JQ19MUk9fTUFYX0FHR1IJNjQKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjQuMS4xIgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCQkiQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMiCiAKICNkZWZpbmUgRU5JQ19CQVJTX01BWAkJNgogCkBAIC0xMTYsNiArMTEwLDggQEAKIAlzcGlubG9ja190IHdxX2xvY2tbRU5JQ19XUV9NQVhdOwogCXVuc2lnbmVkIGludCB3cV9jb3VudDsKIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncm91cDsKKwl1MTYgbG9vcF9lbmFibGU7CisJdTE2IGxvb3BfdGFnOwogCiAJLyogcmVjZWl2ZSBxdWV1ZSBjYWNoZSBsaW5lIHNlY3Rpb24gKi8KIAlfX19fY2FjaGVsaW5lX2FsaWduZWQgc3RydWN0IHZuaWNfcnEgcnFbRU5JQ19SUV9NQVhdOwpAQCAtMTI0LDggKzEyMCw2IEBACiAJdTY0IHJxX3RydW5jYXRlZF9wa3RzOwogCXU2NCBycV9iYWRfZmNzOwogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwotCXN0cnVjdCBuZXRfbHJvX21nciBscm9fbWdyOwotCXN0cnVjdCBuZXRfbHJvX2Rlc2MgbHJvX2Rlc2NbRU5JQ19MUk9fTUFYX0RFU0NdOwogCiAJLyogaW50ZXJydXB0IHJlc291cmNlIGNhY2hlIGxpbmUgc2VjdGlvbiAqLwogCV9fX19jYWNoZWxpbmVfYWxpZ25lZCBzdHJ1Y3Qgdm5pY19pbnRyIGludHJbRU5JQ19JTlRSX01BWF07CkBAIC0xMzcsNCArMTMxLDkgQEAKIAl1bnNpZ25lZCBpbnQgY3FfY291bnQ7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKmVuaWNfZ2V0X2RldihzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlyZXR1cm4gJihlbmljLT5wZGV2LT5kZXYpOworfQorCiAjZW5kaWYgLyogX0VOSUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19tYWluLmMgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfbWFpbi5jCmluZGV4IGJjN2Q2YjkuLjc3YTdmODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjksMTIgKzI5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogCiAjaW5jbHVkZSAiY3FfZW5ldF9kZXNjLmgiCkBAIC0xNDUsMTUgKzE0NSwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGVuaWNfZGV2X2Z3X2luZm8oc3RydWN0IGVuaWMgKmVuaWMsCisJc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8gKipmd19pbmZvKQoreworCWludCBlcnI7CisKKwlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllcnIgPSB2bmljX2Rldl9md19pbmZvKGVuaWMtPnZkZXYsIGZ3X2luZm8pOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgdm9pZCBlbmljX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8gKmZ3X2luZm87CiAKLQlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKLQl2bmljX2Rldl9md19pbmZvKGVuaWMtPnZkZXYsICZmd19pbmZvKTsKLQlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVuaWNfZGV2X2Z3X2luZm8oZW5pYywgJmZ3X2luZm8pOwogCiAJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CiAJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKQEAgLTE5MSw2ICsyMDEsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZW5pY19kZXZfc3RhdHNfZHVtcChzdHJ1Y3QgZW5pYyAqZW5pYywgc3RydWN0IHZuaWNfc3RhdHMgKip2c3RhdHMpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IHZuaWNfZGV2X3N0YXRzX2R1bXAoZW5pYy0+dmRldiwgdnN0YXRzKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHZvaWQgZW5pY19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQogewpAQCAtMTk4LDkgKzIxOSw3IEBACiAJc3RydWN0IHZuaWNfc3RhdHMgKnZzdGF0czsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOwotCXZuaWNfZGV2X3N0YXRzX2R1bXAoZW5pYy0+dmRldiwgJnZzdGF0cyk7Ci0Jc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllbmljX2Rldl9zdGF0c19kdW1wKGVuaWMsICZ2c3RhdHMpOwogCiAJZm9yIChpID0gMDsgaSA8IGVuaWNfbl90eF9zdGF0czsgaSsrKQogCQkqKGRhdGErKykgPSAoKHU2NCAqKSZ2c3RhdHMtPnR4KVtlbmljX3R4X3N0YXRzW2ldLm9mZnNldF07CkBAIC0zNDYsNyArMzY1LDYgQEAKIAkuZ2V0X2NvYWxlc2NlID0gZW5pY19nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZSA9IGVuaWNfc2V0X2NvYWxlc2NlLAogCS5nZXRfZmxhZ3MgPSBldGh0b29sX29wX2dldF9mbGFncywKLQkuc2V0X2ZsYWdzID0gZXRodG9vbF9vcF9zZXRfZmxhZ3MsCiB9OwogCiBzdGF0aWMgdm9pZCBlbmljX2ZyZWVfd3FfYnVmKHN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHZuaWNfd3FfYnVmICpidWYpCkBAIC0zOTksMTUgKzQxNyw0MSBAQAogCWZvciAoaSA9IDA7IGkgPCBlbmljLT53cV9jb3VudDsgaSsrKSB7CiAJCWVycm9yX3N0YXR1cyA9IHZuaWNfd3FfZXJyb3Jfc3RhdHVzKCZlbmljLT53cVtpXSk7CiAJCWlmIChlcnJvcl9zdGF0dXMpCi0JCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogV1FbJWRdIGVycm9yX3N0YXR1cyAlZFxuIiwKLQkJCQllbmljLT5uZXRkZXYtPm5hbWUsIGksIGVycm9yX3N0YXR1cyk7CisJCQluZXRkZXZfZXJyKGVuaWMtPm5ldGRldiwgIldRWyVkXSBlcnJvcl9zdGF0dXMgJWRcbiIsCisJCQkJaSwgZXJyb3Jfc3RhdHVzKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+cnFfY291bnQ7IGkrKykgewogCQllcnJvcl9zdGF0dXMgPSB2bmljX3JxX2Vycm9yX3N0YXR1cygmZW5pYy0+cnFbaV0pOwogCQlpZiAoZXJyb3Jfc3RhdHVzKQotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFJRWyVkXSBlcnJvcl9zdGF0dXMgJWRcbiIsCi0JCQkJZW5pYy0+bmV0ZGV2LT5uYW1lLCBpLCBlcnJvcl9zdGF0dXMpOworCQkJbmV0ZGV2X2VycihlbmljLT5uZXRkZXYsICJSUVslZF0gZXJyb3Jfc3RhdHVzICVkXG4iLAorCQkJCWksIGVycm9yX3N0YXR1cyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmljX21zZ2x2bF9jaGVjayhzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwl1MzIgbXNnX2VuYWJsZSA9IHZuaWNfZGV2X21zZ19sdmwoZW5pYy0+dmRldik7CisKKwlpZiAobXNnX2VuYWJsZSAhPSBlbmljLT5tc2dfZW5hYmxlKSB7CisJCW5ldGRldl9pbmZvKGVuaWMtPm5ldGRldiwgIm1zZyBsdmwgY2hhbmdlZCBmcm9tIDB4JXggdG8gMHgleFxuIiwKKwkJCWVuaWMtPm1zZ19lbmFibGUsIG1zZ19lbmFibGUpOworCQllbmljLT5tc2dfZW5hYmxlID0gbXNnX2VuYWJsZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuaWNfbXR1X2NoZWNrKHN0cnVjdCBlbmljICplbmljKQoreworCXUzMiBtdHUgPSB2bmljX2Rldl9tdHUoZW5pYy0+dmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGVuaWMtPm5ldGRldjsKKworCWlmIChtdHUgJiYgbXR1ICE9IGVuaWMtPnBvcnRfbXR1KSB7CisJCWVuaWMtPnBvcnRfbXR1ID0gbXR1OworCQlpZiAobXR1IDwgbmV0ZGV2LT5tdHUpCisJCQluZXRkZXZfd2FybihuZXRkZXYsCisJCQkJImludGVyZmFjZSBNVFUgKCVkKSBzZXQgaGlnaGVyICIKKwkJCQkidGhhbiBzd2l0Y2ggcG9ydCBNVFUgKCVkKVxuIiwKKwkJCQluZXRkZXYtPm10dSwgbXR1KTsKIAl9CiB9CiAKQEAgLTQxNywzOSArNDYxLDE0IEBACiAJaW50IGNhcnJpZXJfb2sgPSBuZXRpZl9jYXJyaWVyX29rKGVuaWMtPm5ldGRldik7CiAKIAlpZiAobGlua19zdGF0dXMgJiYgIWNhcnJpZXJfb2spIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIFVQXG4iLCBlbmljLT5uZXRkZXYtPm5hbWUpOworCQluZXRkZXZfaW5mbyhlbmljLT5uZXRkZXYsICJMaW5rIFVQXG4iKTsKIAkJbmV0aWZfY2Fycmllcl9vbihlbmljLT5uZXRkZXYpOwogCX0gZWxzZSBpZiAoIWxpbmtfc3RhdHVzICYmIGNhcnJpZXJfb2spIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIERPV05cbiIsIGVuaWMtPm5ldGRldi0+bmFtZSk7CisJCW5ldGRldl9pbmZvKGVuaWMtPm5ldGRldiwgIkxpbmsgRE9XTlxuIik7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKGVuaWMtPm5ldGRldik7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBlbmljX210dV9jaGVjayhzdHJ1Y3QgZW5pYyAqZW5pYykKLXsKLQl1MzIgbXR1ID0gdm5pY19kZXZfbXR1KGVuaWMtPnZkZXYpOwotCi0JaWYgKG10dSAmJiBtdHUgIT0gZW5pYy0+cG9ydF9tdHUpIHsKLQkJZW5pYy0+cG9ydF9tdHUgPSBtdHU7Ci0JCWlmIChtdHUgPCBlbmljLT5uZXRkZXYtPm10dSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCi0JCQkJIiVzOiBpbnRlcmZhY2UgTVRVICglZCkgc2V0IGhpZ2hlciAiCi0JCQkJInRoYW4gc3dpdGNoIHBvcnQgTVRVICglZClcbiIsCi0JCQkJZW5pYy0+bmV0ZGV2LT5uYW1lLCBlbmljLT5uZXRkZXYtPm10dSwgbXR1KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVuaWNfbXNnbHZsX2NoZWNrKHN0cnVjdCBlbmljICplbmljKQotewotCXUzMiBtc2dfZW5hYmxlID0gdm5pY19kZXZfbXNnX2x2bChlbmljLT52ZGV2KTsKLQotCWlmIChtc2dfZW5hYmxlICE9IGVuaWMtPm1zZ19lbmFibGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBtc2cgbHZsIGNoYW5nZWQgZnJvbSAweCV4IHRvIDB4JXhcbiIsCi0JCQllbmljLT5uZXRkZXYtPm5hbWUsIGVuaWMtPm1zZ19lbmFibGUsIG1zZ19lbmFibGUpOwotCQllbmljLT5tc2dfZW5hYmxlID0gbXNnX2VuYWJsZTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGVuaWNfbm90aWZ5X2NoZWNrKHN0cnVjdCBlbmljICplbmljKQogewogCWVuaWNfbXNnbHZsX2NoZWNrKGVuaWMpOwpAQCAtNTc0LDcgKzU5Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl9jb250KHN0cnVjdCBlbmljICplbmljLAogCXN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQl1bnNpZ25lZCBpbnQgbGVuX2xlZnQpCisJdW5zaWduZWQgaW50IGxlbl9sZWZ0LCBpbnQgbG9vcGJhY2spCiB7CiAJc2tiX2ZyYWdfdCAqZnJhZzsKIApAQCAtNTg2LDEzICs2MDUsMTQgQEAKIAkJCQlmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKIAkJCQlQQ0lfRE1BX1RPREVWSUNFKSwKIAkJCWZyYWctPnNpemUsCi0JCQkobGVuX2xlZnQgPT0gMCkpOwkvKiBFT1A/ICovCisJCQkobGVuX2xlZnQgPT0gMCksCS8qIEVPUD8gKi8KKwkJCWxvb3BiYWNrKTsKIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl92bGFuKHN0cnVjdCBlbmljICplbmljLAogCXN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlpbnQgdmxhbl90YWdfaW5zZXJ0LCB1bnNpZ25lZCBpbnQgdmxhbl90YWcpCisJaW50IHZsYW5fdGFnX2luc2VydCwgdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgbG9vcGJhY2spCiB7CiAJdW5zaWduZWQgaW50IGhlYWRfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAl1bnNpZ25lZCBpbnQgbGVuX2xlZnQgPSBza2ItPmxlbiAtIGhlYWRfbGVuOwpAQCAtNjA4LDE1ICs2MjgsMTUgQEAKIAkJCWhlYWRfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSwKIAkJaGVhZF9sZW4sCiAJCXZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcsCi0JCWVvcCk7CisJCWVvcCwgbG9vcGJhY2spOwogCiAJaWYgKCFlb3ApCi0JCWVuaWNfcXVldWVfd3Ffc2tiX2NvbnQoZW5pYywgd3EsIHNrYiwgbGVuX2xlZnQpOworCQllbmljX3F1ZXVlX3dxX3NrYl9jb250KGVuaWMsIHdxLCBza2IsIGxlbl9sZWZ0LCBsb29wYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl9jc3VtX2w0KHN0cnVjdCBlbmljICplbmljLAogCXN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlpbnQgdmxhbl90YWdfaW5zZXJ0LCB1bnNpZ25lZCBpbnQgdmxhbl90YWcpCisJaW50IHZsYW5fdGFnX2luc2VydCwgdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgbG9vcGJhY2spCiB7CiAJdW5zaWduZWQgaW50IGhlYWRfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAl1bnNpZ25lZCBpbnQgbGVuX2xlZnQgPSBza2ItPmxlbiAtIGhlYWRfbGVuOwpAQCAtNjM2LDE1ICs2NTYsMTUgQEAKIAkJY3N1bV9vZmZzZXQsCiAJCWhkcl9sZW4sCiAJCXZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcsCi0JCWVvcCk7CisJCWVvcCwgbG9vcGJhY2spOwogCiAJaWYgKCFlb3ApCi0JCWVuaWNfcXVldWVfd3Ffc2tiX2NvbnQoZW5pYywgd3EsIHNrYiwgbGVuX2xlZnQpOworCQllbmljX3F1ZXVlX3dxX3NrYl9jb250KGVuaWMsIHdxLCBza2IsIGxlbl9sZWZ0LCBsb29wYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl90c28oc3RydWN0IGVuaWMgKmVuaWMsCiAJc3RydWN0IHZuaWNfd3EgKndxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbXNzLAotCWludCB2bGFuX3RhZ19pbnNlcnQsIHVuc2lnbmVkIGludCB2bGFuX3RhZykKKwlpbnQgdmxhbl90YWdfaW5zZXJ0LCB1bnNpZ25lZCBpbnQgdmxhbl90YWcsIGludCBsb29wYmFjaykKIHsKIAl1bnNpZ25lZCBpbnQgZnJhZ19sZW5fbGVmdCA9IHNrYl9oZWFkbGVuKHNrYik7CiAJdW5zaWduZWQgaW50IGxlbl9sZWZ0ID0gc2tiLT5sZW4gLSBmcmFnX2xlbl9sZWZ0OwpAQCAtNjgxLDcgKzcwMSw3IEBACiAJCQlsZW4sCiAJCQltc3MsIGhkcl9sZW4sCiAJCQl2bGFuX3RhZ19pbnNlcnQsIHZsYW5fdGFnLAotCQkJZW9wICYmIChsZW4gPT0gZnJhZ19sZW5fbGVmdCkpOworCQkJZW9wICYmIChsZW4gPT0gZnJhZ19sZW5fbGVmdCksIGxvb3BiYWNrKTsKIAkJZnJhZ19sZW5fbGVmdCAtPSBsZW47CiAJCW9mZnNldCArPSBsZW47CiAJfQpAQCAtNzA3LDcgKzcyNyw4IEBACiAJCQkJZG1hX2FkZHIsCiAJCQkJbGVuLAogCQkJCShsZW5fbGVmdCA9PSAwKSAmJgotCQkJCShsZW4gPT0gZnJhZ19sZW5fbGVmdCkpOwkvKiBFT1A/ICovCisJCQkJKGxlbiA9PSBmcmFnX2xlbl9sZWZ0KSwJCS8qIEVPUD8gKi8KKwkJCQlsb29wYmFjayk7CiAJCQlmcmFnX2xlbl9sZWZ0IC09IGxlbjsKIAkJCW9mZnNldCArPSBsZW47CiAJCX0KQEAgLTcyMCwyMiArNzQxLDI2IEBACiAJdW5zaWduZWQgaW50IG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJdW5zaWduZWQgaW50IHZsYW5fdGFnID0gMDsKIAlpbnQgdmxhbl90YWdfaW5zZXJ0ID0gMDsKKwlpbnQgbG9vcGJhY2sgPSAwOwogCiAJaWYgKGVuaWMtPnZsYW5fZ3JvdXAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CiAJCS8qIFZMQU4gdGFnIGZyb20gdHJ1bmtpbmcgZHJpdmVyICovCiAJCXZsYW5fdGFnX2luc2VydCA9IDE7CiAJCXZsYW5fdGFnID0gdmxhbl90eF90YWdfZ2V0KHNrYik7CisJfSBlbHNlIGlmIChlbmljLT5sb29wX2VuYWJsZSkgeworCQl2bGFuX3RhZyA9IGVuaWMtPmxvb3BfdGFnOworCQlsb29wYmFjayA9IDE7CiAJfQogCiAJaWYgKG1zcykKIAkJZW5pY19xdWV1ZV93cV9za2JfdHNvKGVuaWMsIHdxLCBza2IsIG1zcywKLQkJCXZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcpOworCQkJdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywgbG9vcGJhY2spOwogCWVsc2UgaWYJKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCiAJCWVuaWNfcXVldWVfd3Ffc2tiX2NzdW1fbDQoZW5pYywgd3EsIHNrYiwKLQkJCXZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcpOworCQkJdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywgbG9vcGJhY2spOwogCWVsc2UKIAkJZW5pY19xdWV1ZV93cV9za2JfdmxhbihlbmljLCB3cSwgc2tiLAotCQkJdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZyk7CisJCQl2bGFuX3RhZ19pbnNlcnQsIHZsYW5fdGFnLCBsb29wYmFjayk7CiB9CiAKIC8qIG5ldGlmX3R4X2xvY2sgaGVsZCwgcHJvY2VzcyBjb250ZXh0IHdpdGggQkhzIGRpc2FibGVkLCBvciBCSCAqLwpAQCAtNzY5LDggKzc5NCw3IEBACiAJICAgIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyBFTklDX0RFU0NfTUFYX1NQTElUUykgewogCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAJCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQgKi8KLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJVRyEgVHggcmluZyBmdWxsIHdoZW4gIgotCQkJInF1ZXVlIGF3YWtlIVxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihuZXRkZXYsICJCVUchIFR4IHJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuaWMtPndxX2xvY2tbMF0sIGZsYWdzKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KQEAgLTc5Miw5ICs4MTYsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfc3RhdHMgPSAmbmV0ZGV2LT5zdGF0czsKIAlzdHJ1Y3Qgdm5pY19zdGF0cyAqc3RhdHM7CiAKLQlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKLQl2bmljX2Rldl9zdGF0c19kdW1wKGVuaWMtPnZkZXYsICZzdGF0cyk7Ci0Jc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllbmljX2Rldl9zdGF0c19kdW1wKGVuaWMsICZzdGF0cyk7CiAKIAluZXRfc3RhdHMtPnR4X3BhY2tldHMgPSBzdGF0cy0+dHgudHhfZnJhbWVzX29rOwogCW5ldF9zdGF0cy0+dHhfYnl0ZXMgPSBzdGF0cy0+dHgudHhfYnl0ZXNfb2s7CkBAIC04MTIsOSArODM0LDEwIEBACiAJcmV0dXJuIG5ldF9zdGF0czsKIH0KIAotc3RhdGljIHZvaWQgZW5pY19yZXNldF9tY2FkZHJzKHN0cnVjdCBlbmljICplbmljKQorc3RhdGljIHZvaWQgZW5pY19yZXNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgZW5pYyAqZW5pYykKIHsKIAllbmljLT5tY19jb3VudCA9IDA7CisJZW5pYy0+ZmxhZ3MgPSAwOwogfQogCiBzdGF0aWMgaW50IGVuaWNfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNoYXIgKmFkZHIpCkBAIC04OTEsNiArOTE0LDQxIEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgaW50IGVuaWNfZGV2X3BhY2tldF9maWx0ZXIoc3RydWN0IGVuaWMgKmVuaWMsIGludCBkaXJlY3RlZCwKKwlpbnQgbXVsdGljYXN0LCBpbnQgYnJvYWRjYXN0LCBpbnQgcHJvbWlzYywgaW50IGFsbG11bHRpKQoreworCWludCBlcnI7CisKKwlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllcnIgPSB2bmljX2Rldl9wYWNrZXRfZmlsdGVyKGVuaWMtPnZkZXYsIGRpcmVjdGVkLAorCQltdWx0aWNhc3QsIGJyb2FkY2FzdCwgcHJvbWlzYywgYWxsbXVsdGkpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVuaWNfZGV2X2FkZF9tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IHZuaWNfZGV2X2FkZF9hZGRyKGVuaWMtPnZkZXYsIGFkZHIpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVuaWNfZGV2X2RlbF9tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IHZuaWNfZGV2X2RlbF9hZGRyKGVuaWMtPnZkZXYsIGFkZHIpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCiAvKiBuZXRpZl90eF9sb2NrIGhlbGQsIEJIcyBkaXNhYmxlZCAqLwogc3RhdGljIHZvaWQgZW5pY19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKQEAgLTkxMCwxMSArOTY4LDkgQEAKIAlpZiAobWNfY291bnQgPiBFTklDX01VTFRJQ0FTVF9QRVJGRUNUX0ZJTFRFUlMpCiAJCW1jX2NvdW50ID0gRU5JQ19NVUxUSUNBU1RfUEVSRkVDVF9GSUxURVJTOwogCi0Jc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7Ci0KIAlpZiAoZW5pYy0+ZmxhZ3MgIT0gZmxhZ3MpIHsKIAkJZW5pYy0+ZmxhZ3MgPSBmbGFnczsKLQkJdm5pY19kZXZfcGFja2V0X2ZpbHRlcihlbmljLT52ZGV2LCBkaXJlY3RlZCwKKwkJZW5pY19kZXZfcGFja2V0X2ZpbHRlcihlbmljLCBkaXJlY3RlZCwKIAkJCW11bHRpY2FzdCwgYnJvYWRjYXN0LCBwcm9taXNjLCBhbGxtdWx0aSk7CiAJfQogCkBAIC05MzcsNyArOTkzLDcgQEAKIAkJCQltY19hZGRyW2pdKSA9PSAwKQogCQkJCWJyZWFrOwogCQlpZiAoaiA9PSBtY19jb3VudCkKLQkJCWVuaWNfZGVsX211bHRpY2FzdF9hZGRyKGVuaWMsIGVuaWMtPm1jX2FkZHJbaV0pOworCQkJZW5pY19kZXZfZGVsX211bHRpY2FzdF9hZGRyKGVuaWMsIGVuaWMtPm1jX2FkZHJbaV0pOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7CkBAIC05NDYsNyArMTAwMiw3IEBACiAJCQkJZW5pYy0+bWNfYWRkcltqXSkgPT0gMCkKIAkJCQlicmVhazsKIAkJaWYgKGogPT0gZW5pYy0+bWNfY291bnQpCi0JCQllbmljX2FkZF9tdWx0aWNhc3RfYWRkcihlbmljLCBtY19hZGRyW2ldKTsKKwkJCWVuaWNfZGV2X2FkZF9tdWx0aWNhc3RfYWRkcihlbmljLCBtY19hZGRyW2ldKTsKIAl9CiAKIAkvKiBTYXZlIHRoZSBsaXN0IHRvIGNvbXBhcmUgYWdhaW5zdCBuZXh0IHRpbWUKQEAgLTk1Niw4ICsxMDEyLDYgQEAKIAkJbWVtY3B5KGVuaWMtPm1jX2FkZHJbaV0sIG1jX2FkZHJbaV0sIEVUSF9BTEVOKTsKIAogCWVuaWMtPm1jX2NvdW50ID0gbWNfY291bnQ7Ci0KLQlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOwogfQogCiAvKiBydG5sIGxvY2sgaXMgaGVsZCAqLwpAQCAtMTIyNiw3ICsxMjgwLDcgQEAKIAlzdHJ1Y3QgZW5pYyAqZW5pYyA9IHZuaWNfZGV2X3ByaXYocnEtPnZkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBlbmljLT5uZXRkZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBpbnQgbGVuID0gbmV0ZGV2LT5tdHUgKyBFVEhfSExFTjsKKwl1bnNpZ25lZCBpbnQgbGVuID0gbmV0ZGV2LT5tdHUgKyBWTEFOX0VUSF9ITEVOOwogCXVuc2lnbmVkIGludCBvc19idWZfaW5kZXggPSAwOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAKQEAgLTEyNjMsMTIgKzEzMTcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBlbmljX2Rldl9od192ZXJzaW9uKHN0cnVjdCBlbmljICplbmljLAorCWVudW0gdm5pY19kZXZfaHdfdmVyc2lvbiAqaHdfdmVyKQoreworCWludCBlcnI7CisKKwlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllcnIgPSB2bmljX2Rldl9od192ZXJzaW9uKGVuaWMtPnZkZXYsIGh3X3Zlcik7CisJc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgZW5pY19zZXRfcnFfYWxsb2NfYnVmKHN0cnVjdCBlbmljICplbmljKQogewogCWVudW0gdm5pY19kZXZfaHdfdmVyc2lvbiBod192ZXI7CiAJaW50IGVycjsKIAotCWVyciA9IHZuaWNfZGV2X2h3X3ZlcnNpb24oZW5pYy0+dmRldiwgJmh3X3Zlcik7CisJZXJyID0gZW5pY19kZXZfaHdfdmVyc2lvbihlbmljLCAmaHdfdmVyKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMjg3LDUxICsxMzUzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmljX2dldF9za2JfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKippcGhkciwKLQl2b2lkICoqdGNwaCwgdTY0ICpoZHJfZmxhZ3MsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGNxX2VuZXRfcnFfZGVzYyAqY3FfZGVzYyA9IHByaXY7Ci0JdW5zaWduZWQgaW50IGlwX2xlbjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQotCXU4IHR5cGUsIGNvbG9yLCBlb3AsIHNvcCwgaW5ncmVzc19wb3J0LCB2bGFuX3N0cmlwcGVkOwotCXU4IGZjb2UsIGZjb2Vfc29mLCBmY29lX2ZjX2NyY19vaywgZmNvZV9lbmNfZXJyb3IsIGZjb2VfZW9mOwotCXU4IHRjcF91ZHBfY3N1bV9vaywgdWRwLCB0Y3AsIGlwdjRfY3N1bV9vazsKLQl1OCBpcHY2LCBpcHY0LCBpcHY0X2ZyYWdtZW50LCBmY3Nfb2ssIHJzc190eXBlLCBjc3VtX25vdF9jYWxjOwotCXU4IHBhY2tldF9lcnJvcjsKLQl1MTYgcV9udW1iZXIsIGNvbXBsZXRlZF9pbmRleCwgYnl0ZXNfd3JpdHRlbiwgdmxhbiwgY2hlY2tzdW07Ci0JdTMyIHJzc19oYXNoOwotCi0JY3FfZW5ldF9ycV9kZXNjX2RlYyhjcV9kZXNjLAotCQkmdHlwZSwgJmNvbG9yLCAmcV9udW1iZXIsICZjb21wbGV0ZWRfaW5kZXgsCi0JCSZpbmdyZXNzX3BvcnQsICZmY29lLCAmZW9wLCAmc29wLCAmcnNzX3R5cGUsCi0JCSZjc3VtX25vdF9jYWxjLCAmcnNzX2hhc2gsICZieXRlc193cml0dGVuLAotCQkmcGFja2V0X2Vycm9yLCAmdmxhbl9zdHJpcHBlZCwgJnZsYW4sICZjaGVja3N1bSwKLQkJJmZjb2Vfc29mLCAmZmNvZV9mY19jcmNfb2ssICZmY29lX2VuY19lcnJvciwKLQkJJmZjb2VfZW9mLCAmdGNwX3VkcF9jc3VtX29rLCAmdWRwLCAmdGNwLAotCQkmaXB2NF9jc3VtX29rLCAmaXB2NiwgJmlwdjQsICZpcHY0X2ZyYWdtZW50LAotCQkmZmNzX29rKTsKLQotCWlmICghKGlwdjQgJiYgdGNwICYmICFpcHY0X2ZyYWdtZW50KSkKLQkJcmV0dXJuIC0xOwotCi0Jc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7Ci0JaXBoID0gaXBfaGRyKHNrYik7Ci0KLQlpcF9sZW4gPSBpcF9oZHJsZW4oc2tiKTsKLQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBpcF9sZW4pOwotCi0JLyogY2hlY2sgaWYgaXAgaGVhZGVyIGFuZCB0Y3AgaGVhZGVyIGFyZSBjb21wbGV0ZSAqLwotCWlmIChudG9ocyhpcGgtPnRvdF9sZW4pIDwgaXBfbGVuICsgdGNwX2hkcmxlbihza2IpKQotCQlyZXR1cm4gLTE7Ci0KLQkqaGRyX2ZsYWdzID0gTFJPX0lQVjQgfCBMUk9fVENQOwotCSp0Y3BoID0gdGNwX2hkcihza2IpOwotCSppcGhkciA9IGlwaDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBlbmljX3JxX2luZGljYXRlX2J1ZihzdHJ1Y3Qgdm5pY19ycSAqcnEsCiAJc3RydWN0IGNxX2Rlc2MgKmNxX2Rlc2MsIHN0cnVjdCB2bmljX3JxX2J1ZiAqYnVmLAogCWludCBza2lwcGVkLCB2b2lkICpvcGFxdWUpCkBAIC0xMzQ1LDcgKzEzNjYsNyBAQAogCXU4IHRjcF91ZHBfY3N1bV9vaywgdWRwLCB0Y3AsIGlwdjRfY3N1bV9vazsKIAl1OCBpcHY2LCBpcHY0LCBpcHY0X2ZyYWdtZW50LCBmY3Nfb2ssIHJzc190eXBlLCBjc3VtX25vdF9jYWxjOwogCXU4IHBhY2tldF9lcnJvcjsKLQl1MTYgcV9udW1iZXIsIGNvbXBsZXRlZF9pbmRleCwgYnl0ZXNfd3JpdHRlbiwgdmxhbiwgY2hlY2tzdW07CisJdTE2IHFfbnVtYmVyLCBjb21wbGV0ZWRfaW5kZXgsIGJ5dGVzX3dyaXR0ZW4sIHZsYW5fdGNpLCBjaGVja3N1bTsKIAl1MzIgcnNzX2hhc2g7CiAKIAlpZiAoc2tpcHBlZCkKQEAgLTEzNjAsNyArMTM4MSw3IEBACiAJCSZ0eXBlLCAmY29sb3IsICZxX251bWJlciwgJmNvbXBsZXRlZF9pbmRleCwKIAkJJmluZ3Jlc3NfcG9ydCwgJmZjb2UsICZlb3AsICZzb3AsICZyc3NfdHlwZSwKIAkJJmNzdW1fbm90X2NhbGMsICZyc3NfaGFzaCwgJmJ5dGVzX3dyaXR0ZW4sCi0JCSZwYWNrZXRfZXJyb3IsICZ2bGFuX3N0cmlwcGVkLCAmdmxhbiwgJmNoZWNrc3VtLAorCQkmcGFja2V0X2Vycm9yLCAmdmxhbl9zdHJpcHBlZCwgJnZsYW5fdGNpLCAmY2hlY2tzdW0sCiAJCSZmY29lX3NvZiwgJmZjb2VfZmNfY3JjX29rLCAmZmNvZV9lbmNfZXJyb3IsCiAJCSZmY29lX2VvZiwgJnRjcF91ZHBfY3N1bV9vaywgJnVkcCwgJnRjcCwKIAkJJmlwdjRfY3N1bV9vaywgJmlwdjYsICZpcHY0LCAmaXB2NF9mcmFnbWVudCwKQEAgLTEzOTUsMjAgKzE0MTYsMjAgQEAKIAogCQlza2ItPmRldiA9IG5ldGRldjsKIAotCQlpZiAoZW5pYy0+dmxhbl9ncm91cCAmJiB2bGFuX3N0cmlwcGVkKSB7CisJCWlmIChlbmljLT52bGFuX2dyb3VwICYmIHZsYW5fc3RyaXBwZWQgJiYKKwkJCSh2bGFuX3RjaSAmIENRX0VORVRfUlFfREVTQ19WTEFOX1RDSV9WTEFOX01BU0spKSB7CiAKLQkJCWlmICgobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSAmJiBpcHY0KQotCQkJCWxyb192bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IoJmVuaWMtPmxyb19tZ3IsCi0JCQkJCXNrYiwgZW5pYy0+dmxhbl9ncm91cCwKLQkJCQkJdmxhbiwgY3FfZGVzYyk7CisJCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfR1JPKQorCQkJCXZsYW5fZ3JvX3JlY2VpdmUoJmVuaWMtPm5hcGksIGVuaWMtPnZsYW5fZ3JvdXAsCisJCQkJCXZsYW5fdGNpLCBza2IpOwogCQkJZWxzZQogCQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsCi0JCQkJCWVuaWMtPnZsYW5fZ3JvdXAsIHZsYW4pOworCQkJCQllbmljLT52bGFuX2dyb3VwLCB2bGFuX3RjaSk7CiAKIAkJfSBlbHNlIHsKIAotCQkJaWYgKChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pICYmIGlwdjQpCi0JCQkJbHJvX3JlY2VpdmVfc2tiKCZlbmljLT5scm9fbWdyLCBza2IsIGNxX2Rlc2MpOworCQkJaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dSTykKKwkJCQluYXBpX2dyb19yZWNlaXZlKCZlbmljLT5uYXBpLCBza2IpOwogCQkJZWxzZQogCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAKQEAgLTE0MzgsNyArMTQ1OSw2IEBACiBzdGF0aWMgaW50IGVuaWNfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IGVuaWMgKmVuaWMgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGVuaWMsIG5hcGkpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBlbmljLT5uZXRkZXY7CiAJdW5zaWduZWQgaW50IHJxX3dvcmtfdG9fZG8gPSBidWRnZXQ7CiAJdW5zaWduZWQgaW50IHdxX3dvcmtfdG9fZG8gPSAtMTsgLyogbm8gbGltaXQgKi8KIAl1bnNpZ25lZCBpbnQgIHdvcmtfZG9uZSwgcnFfd29ya19kb25lLCB3cV93b3JrX2RvbmU7CkBAIC0xNDc4LDEyICsxNDk4LDkgQEAKIAlpZiAocnFfd29ya19kb25lIDwgcnFfd29ya190b19kbykgewogCiAJCS8qIFNvbWUgd29yayBkb25lLCBidXQgbm90IGVub3VnaCB0byBzdGF5IGluIHBvbGxpbmcsCi0JCSAqIGZsdXNoIGFsbCBMUk9zIGFuZCBleGl0IHBvbGxpbmcKKwkJICogZXhpdCBwb2xsaW5nCiAJCSAqLwogCi0JCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCi0JCQlscm9fZmx1c2hfYWxsKCZlbmljLT5scm9fbWdyKTsKLQogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQl2bmljX2ludHJfdW5tYXNrKCZlbmljLT5pbnRyW0VOSUNfSU5UWF9XUV9SUV0pOwogCX0KQEAgLTE0OTQsNyArMTUxMSw2IEBACiBzdGF0aWMgaW50IGVuaWNfcG9sbF9tc2l4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZW5pYyAqZW5pYyA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZW5pYywgbmFwaSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGVuaWMtPm5ldGRldjsKIAl1bnNpZ25lZCBpbnQgd29ya190b19kbyA9IGJ1ZGdldDsKIAl1bnNpZ25lZCBpbnQgd29ya19kb25lOwogCWludCBlcnI7CkBAIC0xNTI4LDEyICsxNTQ0LDkgQEAKIAlpZiAod29ya19kb25lIDwgd29ya190b19kbykgewogCiAJCS8qIFNvbWUgd29yayBkb25lLCBidXQgbm90IGVub3VnaCB0byBzdGF5IGluIHBvbGxpbmcsCi0JCSAqIGZsdXNoIGFsbCBMUk9zIGFuZCBleGl0IHBvbGxpbmcKKwkJICogZXhpdCBwb2xsaW5nCiAJCSAqLwogCi0JCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCi0JCQlscm9fZmx1c2hfYWxsKCZlbmljLT5scm9fbWdyKTsKLQogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQl2bmljX2ludHJfdW5tYXNrKCZlbmljLT5pbnRyW0VOSUNfTVNJWF9SUV0pOwogCX0KQEAgLTE2NTUsNyArMTY2OCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGVuaWNfbm90aWZ5X3NldChzdHJ1Y3QgZW5pYyAqZW5pYykKK3N0YXRpYyBpbnQgZW5pY19kZXZfbm90aWZ5X3NldChzdHJ1Y3QgZW5pYyAqZW5pYykKIHsKIAlpbnQgZXJyOwogCkBAIC0xNjc2LDYgKzE2ODksMzkgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGVuaWNfZGV2X25vdGlmeV91bnNldChzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisJZXJyID0gdm5pY19kZXZfbm90aWZ5X3Vuc2V0KGVuaWMtPnZkZXYpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVuaWNfZGV2X2VuYWJsZShzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisJZXJyID0gdm5pY19kZXZfZW5hYmxlKGVuaWMtPnZkZXYpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVuaWNfZGV2X2Rpc2FibGUoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IHZuaWNfZGV2X2Rpc2FibGUoZW5pYy0+dmRldik7CisJc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIGVuaWNfbm90aWZ5X3RpbWVyX3N0YXJ0KHN0cnVjdCBlbmljICplbmljKQogewogCXN3aXRjaCAodm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KSkgewpAQCAtMTY5NywxNiArMTc0MywxNCBAQAogCiAJZXJyID0gZW5pY19yZXF1ZXN0X2ludHIoZW5pYyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIiwKLQkJCW5ldGRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIobmV0ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JZXJyID0gZW5pY19ub3RpZnlfc2V0KGVuaWMpOworCWVyciA9IGVuaWNfZGV2X25vdGlmeV9zZXQoZW5pYyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkiJXM6IEZhaWxlZCB0byBhbGxvYyBub3RpZnkgYnVmZmVyLCBhYm9ydGluZy5cbiIsCi0JCQluZXRkZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2Mgbm90aWZ5IGJ1ZmZlciwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfaW50cjsKIAl9CiAKQEAgLTE3MTQsOSArMTc1OCw3IEBACiAJCXZuaWNfcnFfZmlsbCgmZW5pYy0+cnFbaV0sIGVuaWMtPnJxX2FsbG9jX2J1Zik7CiAJCS8qIE5lZWQgYXQgbGVhc3Qgb25lIGJ1ZmZlciBvbiByaW5nIHRvIGdldCBnb2luZyAqLwogCQlpZiAodm5pY19ycV9kZXNjX3VzZWQoJmVuaWMtPnJxW2ldKSA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJIiVzOiBVbmFibGUgdG8gYWxsb2MgcmVjZWl2ZSBidWZmZXJzLlxuIiwKLQkJCQluZXRkZXYtPm5hbWUpOworCQkJbmV0ZGV2X2VycihuZXRkZXYsICJVbmFibGUgdG8gYWxsb2MgcmVjZWl2ZSBidWZmZXJzXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9vdXRfbm90aWZ5X3Vuc2V0OwogCQl9CkBAIC0xNzMyLDkgKzE3NzQsNyBAQAogCiAJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwogCW5hcGlfZW5hYmxlKCZlbmljLT5uYXBpKTsKLQlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKLQl2bmljX2Rldl9lbmFibGUoZW5pYy0+dmRldik7Ci0Jc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllbmljX2Rldl9lbmFibGUoZW5pYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+aW50cl9jb3VudDsgaSsrKQogCQl2bmljX2ludHJfdW5tYXNrKCZlbmljLT5pbnRyW2ldKTsKQEAgLTE3NDQsOSArMTc4NCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfbm90aWZ5X3Vuc2V0OgotCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOwotCXZuaWNfZGV2X25vdGlmeV91bnNldChlbmljLT52ZGV2KTsKLQlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVuaWNfZGV2X25vdGlmeV91bnNldChlbmljKTsKIGVycl9vdXRfZnJlZV9pbnRyOgogCWVuaWNfZnJlZV9pbnRyKGVuaWMpOwogCkBAIC0xNzYwLDIwICsxNzk4LDE5IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWZvciAoaSA9IDA7IGkgPCBlbmljLT5pbnRyX2NvdW50OyBpKyspCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPmludHJfY291bnQ7IGkrKykgewogCQl2bmljX2ludHJfbWFzaygmZW5pYy0+aW50cltpXSk7CisJCSh2b2lkKXZuaWNfaW50cl9tYXNrZWQoJmVuaWMtPmludHJbaV0pOyAvKiBmbHVzaCB3cml0ZSAqLworCX0KIAogCWVuaWNfc3luY2hyb25pemVfaXJxcyhlbmljKTsKIAogCWRlbF90aW1lcl9zeW5jKCZlbmljLT5ub3RpZnlfdGltZXIpOwogCi0Jc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7Ci0Jdm5pY19kZXZfZGlzYWJsZShlbmljLT52ZGV2KTsKLQlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVuaWNfZGV2X2Rpc2FibGUoZW5pYyk7CiAJbmFwaV9kaXNhYmxlKCZlbmljLT5uYXBpKTsKIAluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKLQogCWVuaWNfZGV2X2RlbF9zdGF0aW9uX2FkZHIoZW5pYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+d3FfY291bnQ7IGkrKykgewpAQCAtMTc4Nyw5ICsxODI0LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0Jc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7Ci0Jdm5pY19kZXZfbm90aWZ5X3Vuc2V0KGVuaWMtPnZkZXYpOwotCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisJZW5pY19kZXZfbm90aWZ5X3Vuc2V0KGVuaWMpOwogCWVuaWNfZnJlZV9pbnRyKGVuaWMpOwogCiAJZm9yIChpID0gMDsgaSA8IGVuaWMtPndxX2NvdW50OyBpKyspCkBAIC0xODE4LDEwICsxODUzLDkgQEAKIAluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAKIAlpZiAobmV0ZGV2LT5tdHUgPiBlbmljLT5wb3J0X210dSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKLQkJCSIlczogaW50ZXJmYWNlIE1UVSAoJWQpIHNldCBoaWdoZXIgIgotCQkJInRoYW4gcG9ydCBNVFUgKCVkKVxuIiwKLQkJCW5ldGRldi0+bmFtZSwgbmV0ZGV2LT5tdHUsIGVuaWMtPnBvcnRfbXR1KTsKKwkJbmV0ZGV2X3dhcm4obmV0ZGV2LAorCQkJImludGVyZmFjZSBNVFUgKCVkKSBzZXQgaGlnaGVyIHRoYW4gcG9ydCBNVFUgKCVkKVxuIiwKKwkJCW5ldGRldi0+bXR1LCBlbmljLT5wb3J0X210dSk7CiAKIAlpZiAocnVubmluZykKIAkJZW5pY19vcGVuKG5ldGRldik7CkBAIC0xODk0LDIxICsxOTI4LDIxIEBACiAJZXJyID0gZW5pY19kZXZfd2FpdChlbmljLT52ZGV2LCB2bmljX2Rldl9vcGVuLAogCQl2bmljX2Rldl9vcGVuX2RvbmUsIDApOwogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCSJ2TklDIGRldmljZSBvcGVuIGZhaWxlZCwgZXJyICVkLlxuIiwgZXJyKTsKKwkJZGV2X2VycihlbmljX2dldF9kZXYoZW5pYyksICJ2TklDIGRldmljZSBvcGVuIGZhaWxlZCwgZXJyICVkXG4iLAorCQkJZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZW5pY19kZXZfc29mdF9yZXNldChzdHJ1Y3QgZW5pYyAqZW5pYykKK3N0YXRpYyBpbnQgZW5pY19kZXZfaGFuZ19yZXNldChzdHJ1Y3QgZW5pYyAqZW5pYykKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gZW5pY19kZXZfd2FpdChlbmljLT52ZGV2LCB2bmljX2Rldl9zb2Z0X3Jlc2V0LAotCQl2bmljX2Rldl9zb2Z0X3Jlc2V0X2RvbmUsIDApOworCWVyciA9IGVuaWNfZGV2X3dhaXQoZW5pYy0+dmRldiwgdm5pY19kZXZfaGFuZ19yZXNldCwKKwkJdm5pY19kZXZfaGFuZ19yZXNldF9kb25lLCAwKTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkidk5JQyBzb2Z0IHJlc2V0IGZhaWxlZCwgZXJyICVkLlxuIiwgZXJyKTsKKwkJbmV0ZGV2X2VycihlbmljLT5uZXRkZXYsICJ2TklDIGhhbmcgcmVzZXQgZmFpbGVkLCBlcnIgJWRcbiIsCisJCQllcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE5MjIsMTUgKzE5NTYsNDMgQEAKIAljb25zdCB1OCByc3NfZW5hYmxlID0gMDsKIAljb25zdCB1OCB0c29faXBpZF9zcGxpdF9lbiA9IDA7CiAJY29uc3QgdTggaWdfdmxhbl9zdHJpcF9lbiA9IDE7CisJaW50IGVycjsKIAogCS8qIEVuYWJsZSBWTEFOIHRhZyBzdHJpcHBpbmcuICBSU1Mgbm90IGVuYWJsZWQgKHlldCkuCiAJICovCiAKLQlyZXR1cm4gZW5pY19zZXRfbmljX2NmZyhlbmljLAorCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IGVuaWNfc2V0X25pY19jZmcoZW5pYywKIAkJcnNzX2RlZmF1bHRfY3B1LCByc3NfaGFzaF90eXBlLAogCQlyc3NfaGFzaF9iaXRzLCByc3NfYmFzZV9jcHUsCiAJCXJzc19lbmFibGUsIHRzb19pcGlkX3NwbGl0X2VuLAogCQlpZ192bGFuX3N0cmlwX2VuKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlbmljX2Rldl9oYW5nX25vdGlmeShzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisJZXJyID0gdm5pY19kZXZfaGFuZ19ub3RpZnkoZW5pYy0+dmRldik7CisJc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBlbmljX2Rldl9zZXRfaWdfdmxhbl9yZXdyaXRlX21vZGUoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IHZuaWNfZGV2X3NldF9pZ192bGFuX3Jld3JpdGVfbW9kZShlbmljLT52ZGV2LAorCQlJR19WTEFOX1JFV1JJVEVfTU9ERV9QUklPUklUWV9UQUdfREVGQVVMVF9WTEFOKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgZW5pY19yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xOTQyLDE2ICsyMDA0LDEzIEBACiAKIAlydG5sX2xvY2soKTsKIAotCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOwotCXZuaWNfZGV2X2hhbmdfbm90aWZ5KGVuaWMtPnZkZXYpOwotCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7Ci0KKwllbmljX2Rldl9oYW5nX25vdGlmeShlbmljKTsKIAllbmljX3N0b3AoZW5pYy0+bmV0ZGV2KTsKLQllbmljX2Rldl9zb2Z0X3Jlc2V0KGVuaWMpOwotCXZuaWNfZGV2X2luaXQoZW5pYy0+dmRldiwgMCk7Ci0JZW5pY19yZXNldF9tY2FkZHJzKGVuaWMpOworCWVuaWNfZGV2X2hhbmdfcmVzZXQoZW5pYyk7CisJZW5pY19yZXNldF9tdWx0aWNhc3RfbGlzdChlbmljKTsKIAllbmljX2luaXRfdm5pY19yZXNvdXJjZXMoZW5pYyk7CiAJZW5pY19zZXRfbmljY2ZnKGVuaWMpOworCWVuaWNfZGV2X3NldF9pZ192bGFuX3Jld3JpdGVfbW9kZShlbmljKTsKIAllbmljX29wZW4oZW5pYy0+bmV0ZGV2KTsKIAogCXJ0bmxfdW5sb2NrKCk7CkBAIC0yMDg3LDggKzIxNDYsOCBAQAogCS5uZG9fc3RhcnRfeG1pdAkJPSBlbmljX2hhcmRfc3RhcnRfeG1pdCwKIAkubmRvX2dldF9zdGF0cwkJPSBlbmljX2dldF9zdGF0cywKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IGVuaWNfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZW5pY19zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBlbmljX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZW5pY19jaGFuZ2VfbXR1LAogCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGVuaWNfdmxhbl9yeF9yZWdpc3RlciwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IGVuaWNfdmxhbl9yeF9hZGRfdmlkLApAQCAtMjEwNiw4ICsyMTY1LDIwIEBACiAJZW5pY19jbGVhcl9pbnRyX21vZGUoZW5pYyk7CiB9CiAKK3N0YXRpYyBpbnQgZW5pY19kZXZfc3RhdHNfY2xlYXIoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVyciA9IHZuaWNfZGV2X3N0YXRzX2NsZWFyKGVuaWMtPnZkZXYpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgZW5pY19kZXZfaW5pdChzdHJ1Y3QgZW5pYyAqZW5pYykKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBlbmljX2dldF9kZXYoZW5pYyk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGVuaWMtPm5ldGRldjsKIAlpbnQgZXJyOwogCkBAIC0yMTE2LDggKzIxODcsNyBAQAogCiAJZXJyID0gZW5pY19nZXRfdm5pY19jb25maWcoZW5pYyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkiR2V0IHZOSUMgY29uZmlndXJhdGlvbiBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWRldl9lcnIoZGV2LCAiR2V0IHZOSUMgY29uZmlndXJhdGlvbiBmYWlsZWQsIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTIxMzIsOSArMjIwMiw4IEBACiAKIAllcnIgPSBlbmljX3NldF9pbnRyX21vZGUoZW5pYyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkiRmFpbGVkIHRvIHNldCBpbnRyIG1vZGUgYmFzZWQgb24gcmVzb3VyY2UgIgotCQkJImNvdW50cyBhbmQgc3lzdGVtIGNhcGFiaWxpdGllcywgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGludHIgbW9kZSBiYXNlZCBvbiByZXNvdXJjZSAiCisJCQkiY291bnRzIGFuZCBzeXN0ZW0gY2FwYWJpbGl0aWVzLCBhYm9ydGluZ1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMTQzLDI0ICsyMjEyLDMyIEBACiAKIAllcnIgPSBlbmljX2FsbG9jX3ZuaWNfcmVzb3VyY2VzKGVuaWMpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJIkZhaWxlZCB0byBhbGxvYyB2TklDIHJlc291cmNlcywgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2Mgdk5JQyByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfdm5pY19yZXNvdXJjZXM7CiAJfQogCiAJZW5pY19pbml0X3ZuaWNfcmVzb3VyY2VzKGVuaWMpOwogCisJLyogQ2xlYXIgTElGIHN0YXRzCisJICovCisJZW5pY19kZXZfc3RhdHNfY2xlYXIoZW5pYyk7CisKIAllcnIgPSBlbmljX3NldF9ycV9hbGxvY19idWYoZW5pYyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkiRmFpbGVkIHRvIHNldCBSUSBidWZmZXIgYWxsb2NhdG9yLCBhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgUlEgYnVmZmVyIGFsbG9jYXRvciwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV92bmljX3Jlc291cmNlczsKIAl9CiAKIAllcnIgPSBlbmljX3NldF9uaWNjZmcoZW5pYyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkiRmFpbGVkIHRvIGNvbmZpZyBuaWMsIGFib3J0aW5nLlxuIik7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNvbmZpZyBuaWMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfdm5pY19yZXNvdXJjZXM7CisJfQorCisJZXJyID0gZW5pY19kZXZfc2V0X2lnX3ZsYW5fcmV3cml0ZV9tb2RlKGVuaWMpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihuZXRkZXYsCisJCQkiRmFpbGVkIHRvIHNldCBpbmdyZXNzIHZsYW4gcmV3cml0ZSBtb2RlLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV92bmljX3Jlc291cmNlczsKIAl9CiAKQEAgLTIxOTQsNiArMjI3MSw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBlbmljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBlbmljICplbmljOwogCWludCB1c2luZ19kYWMgPSAwOwpAQCAtMjIwNiw3ICsyMjg0LDcgQEAKIAogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZW5pYykpOwogCWlmICghbmV0ZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkV0aGVyZGV2IGFsbG9jIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJcHJfZXJyKCJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMjIxLDE3ICsyMjk5LDE1IEBACiAJLyogU2V0dXAgUENJIHJlc291cmNlcwogCSAqLwogCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2VfbWVtKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwogCX0KIAogCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJIkNhbm5vdCByZXF1ZXN0IFBDSSByZWdpb25zLCBhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCByZXF1ZXN0IFBDSSByZWdpb25zLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX291dF9kaXNhYmxlX2RldmljZTsKIAl9CiAKQEAgLTIyNDYsMjMgKzIzMjIsMjAgQEAKIAlpZiAoZXJyKSB7CiAJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCQkiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZy5cbiIpOworCQkJZGV2X2VycihkZXYsICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nXG4iKTsKIAkJCWdvdG8gZXJyX291dF9yZWxlYXNlX3JlZ2lvbnM7CiAJCX0KIAkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJIlVuYWJsZSB0byBvYnRhaW4gMzItYml0IERNQSAiCi0JCQkJImZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zLCBhYm9ydGluZy5cbiIpOworCQkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gb2J0YWluICV1LWJpdCBETUEgIgorCQkJCSJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9ucywgYWJvcnRpbmdcbiIsIDMyKTsKIAkJCWdvdG8gZXJyX291dF9yZWxlYXNlX3JlZ2lvbnM7CiAJCX0KIAl9IGVsc2UgewogCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDQwKSk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCQkiVW5hYmxlIHRvIG9idGFpbiA0MC1iaXQgRE1BICIKLQkJCQkiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMsIGFib3J0aW5nLlxuIik7CisJCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBvYnRhaW4gJXUtYml0IERNQSAiCisJCQkJImZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zLCBhYm9ydGluZ1xuIiwgNDApOwogCQkJZ290byBlcnJfb3V0X3JlbGVhc2VfcmVnaW9uczsKIAkJfQogCQl1c2luZ19kYWMgPSAxOwpAQCAtMjI3Nyw4ICsyMzUwLDcgQEAKIAkJZW5pYy0+YmFyW2ldLmxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSk7CiAJCWVuaWMtPmJhcltpXS52YWRkciA9IHBjaV9pb21hcChwZGV2LCBpLCBlbmljLT5iYXJbaV0ubGVuKTsKIAkJaWYgKCFlbmljLT5iYXJbaV0udmFkZHIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCQkiQ2Fubm90IG1lbW9yeS1tYXAgQkFSICVkLCBhYm9ydGluZy5cbiIsIGkpOworCQkJZGV2X2VycihkZXYsICJDYW5ub3QgbWVtb3J5LW1hcCBCQVIgJWQsIGFib3J0aW5nXG4iLCBpKTsKIAkJCWVyciA9IC1FTk9ERVY7CiAJCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAkJfQpAQCAtMjI5MSw4ICsyMzYzLDcgQEAKIAllbmljLT52ZGV2ID0gdm5pY19kZXZfcmVnaXN0ZXIoTlVMTCwgZW5pYywgcGRldiwgZW5pYy0+YmFyLAogCQlBUlJBWV9TSVpFKGVuaWMtPmJhcikpOwogCWlmICghZW5pYy0+dmRldikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkidk5JQyByZWdpc3RyYXRpb24gZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKGRldiwgInZOSUMgcmVnaXN0cmF0aW9uIGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAl9CkBAIC0yMzAyLDggKzIzNzMsNyBAQAogCiAJZXJyID0gZW5pY19kZXZfb3BlbihlbmljKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCSJ2TklDIGRldiBvcGVuIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJ2TklDIGRldiBvcGVuIGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl9vdXRfdm5pY191bnJlZ2lzdGVyOwogCX0KIApAQCAtMjMxNywyMyArMjM4NywzMSBAQAogCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAorCS8qIERvIG5vdCBjYWxsIGRldl9pbml0IGZvciBhIGR5bmFtaWMgdm5pYy4KKwkgKiBGb3IgYSBkeW5hbWljIHZuaWMsIGluaXRfcHJvdl9pbmZvIHdpbGwgYmUKKwkgKiBjYWxsZWQgbGF0ZXIgYnkgYW4gdXBwZXIgbGF5ZXIuCisJICovCisKIAlpZiAoIWVuaWNfaXNfZHluYW1pYyhlbmljKSkgewogCQllcnIgPSB2bmljX2Rldl9pbml0KGVuaWMtPnZkZXYsIDApOwogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJInZOSUMgZGV2IGluaXQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQkJZGV2X2VycihkZXYsICJ2TklDIGRldiBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQkJZ290byBlcnJfb3V0X2Rldl9jbG9zZTsKIAkJfQogCX0KIAorCS8qIFNldHVwIGRldmNtZCBsb2NrCisJICovCisKKwlzcGluX2xvY2tfaW5pdCgmZW5pYy0+ZGV2Y21kX2xvY2spOworCiAJZXJyID0gZW5pY19kZXZfaW5pdChlbmljKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCSJEZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKGRldiwgIkRldmljZSBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfb3V0X2Rldl9jbG9zZTsKIAl9CiAKLQkvKiBTZXR1cCBub3RpZmljYXRpb24gdGltZXIsIEhXIHJlc2V0IHRhc2ssIGFuZCBsb2NrcworCS8qIFNldHVwIG5vdGlmaWNhdGlvbiB0aW1lciwgSFcgcmVzZXQgdGFzaywgYW5kIHdxIGxvY2tzCiAJICovCiAKIAlpbml0X3RpbWVyKCZlbmljLT5ub3RpZnlfdGltZXIpOwpAQCAtMjM0NSw4ICsyNDIzLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+d3FfY291bnQ7IGkrKykKIAkJc3Bpbl9sb2NrX2luaXQoJmVuaWMtPndxX2xvY2tbaV0pOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmVuaWMtPmRldmNtZF9sb2NrKTsKLQogCS8qIFJlZ2lzdGVyIG5ldCBkZXZpY2UKIAkgKi8KIApAQCAtMjM1NSw4ICsyNDMxLDcgQEAKIAogCWVyciA9IGVuaWNfc2V0X21hY19hZGRyKG5ldGRldiwgZW5pYy0+bWFjX2FkZHIpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJIkludmFsaWQgTUFDIGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBNQUMgYWRkcmVzcywgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycl9vdXRfZGV2X2RlaW5pdDsKIAl9CiAKQEAgLTIzNzIsMzEgKzI0NDcsMjcgQEAKIAluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmVuaWNfZXRodG9vbF9vcHM7CiAKIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwlpZiAoRU5JQ19TRVRUSU5HKGVuaWMsIExPT1ApKSB7CisJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKwkJZW5pYy0+bG9vcF9lbmFibGUgPSAxOworCQllbmljLT5sb29wX3RhZyA9IGVuaWMtPmNvbmZpZy5sb29wX3RhZzsKKwkJZGV2X2luZm8oZGV2LCAibG9vcGJhY2sgdGFnPTB4JTA0eFxuIiwgZW5pYy0+bG9vcF90YWcpOworCX0KIAlpZiAoRU5JQ19TRVRUSU5HKGVuaWMsIFRYQ1NVTSkpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTTsKIAlpZiAoRU5JQ19TRVRUSU5HKGVuaWMsIFRTTykpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU08gfAogCQkJTkVUSUZfRl9UU082IHwgTkVUSUZfRl9UU09fRUNOOwogCWlmIChFTklDX1NFVFRJTkcoZW5pYywgTFJPKSkKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0dSTzsKIAlpZiAodXNpbmdfZGFjKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAogCWVuaWMtPmNzdW1fcnhfZW5hYmxlZCA9IEVOSUNfU0VUVElORyhlbmljLCBSWENTVU0pOwogCi0JZW5pYy0+bHJvX21nci5tYXhfYWdnciA9IEVOSUNfTFJPX01BWF9BR0dSOwotCWVuaWMtPmxyb19tZ3IubWF4X2Rlc2MgPSBFTklDX0xST19NQVhfREVTQzsKLQllbmljLT5scm9fbWdyLmxyb19hcnIgPSBlbmljLT5scm9fZGVzYzsKLQllbmljLT5scm9fbWdyLmdldF9za2JfaGVhZGVyID0gZW5pY19nZXRfc2tiX2hlYWRlcjsKLQllbmljLT5scm9fbWdyLmZlYXR1cmVzCT0gTFJPX0ZfTkFQSSB8IExST19GX0VYVFJBQ1RfVkxBTl9JRDsKLQllbmljLT5scm9fbWdyLmRldiA9IG5ldGRldjsKLQllbmljLT5scm9fbWdyLmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwotCWVuaWMtPmxyb19tZ3IuaXBfc3VtbWVkX2FnZ3IgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQogCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZ1xuIik7CiAJCWdvdG8gZXJyX291dF9kZXZfZGVpbml0OwogCX0KIApAQCAtMjQ1MCw3ICsyNTIxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZW5pY19pbml0X21vZHVsZSh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gUEZYICIlcywgdmVyICVzXG4iLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKKwlwcl9pbmZvKCIlcywgdmVyICVzXG4iLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKIAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlbmljX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmMgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmMKaW5kZXggOWIxODg0MC4uMjllZGU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX3Jlcy5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19yZXMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtNDYsNyArNDYsOCBAQAogCiAJZXJyID0gdm5pY19kZXZfbWFjX2FkZHIoZW5pYy0+dmRldiwgZW5pYy0+bWFjX2FkZHIpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXJyb3IgZ2V0dGluZyBNQUMgYWRkciwgJWRcbiIsIGVycik7CisJCWRldl9lcnIoZW5pY19nZXRfZGV2KGVuaWMpLAorCQkJIkVycm9yIGdldHRpbmcgTUFDIGFkZHIsICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTYsNyArNTcsNyBAQAogCQkJb2Zmc2V0b2Yoc3RydWN0IHZuaWNfZW5ldF9jb25maWcsIG0pLCBcCiAJCQlzaXplb2YoYy0+bSksICZjLT5tKTsgXAogCQlpZiAoZXJyKSB7IFwKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggXAorCQkJZGV2X2VycihlbmljX2dldF9kZXYoZW5pYyksIFwKIAkJCQkiRXJyb3IgZ2V0dGluZyAlcywgJWRcbiIsICNtLCBlcnIpOyBcCiAJCQlyZXR1cm4gZXJyOyBcCiAJCX0gXApAQCAtNjksNiArNzAsNyBAQAogCUdFVF9DT05GSUcoaW50cl90aW1lcl90eXBlKTsKIAlHRVRfQ09ORklHKGludHJfbW9kZSk7CiAJR0VUX0NPTkZJRyhpbnRyX3RpbWVyX3VzZWMpOworCUdFVF9DT05GSUcobG9vcF90YWcpOwogCiAJYy0+d3FfZGVzY19jb3VudCA9CiAJCW1pbl90KHUzMiwgRU5JQ19NQVhfV1FfREVTQ1MsCkBAIC05MiwxMCArOTQsMTAgQEAKIAkJSU5UUl9DT0FMRVNDRV9IV19UT19VU0VDKFZOSUNfSU5UUl9USU1FUl9NQVgpLAogCQljLT5pbnRyX3RpbWVyX3VzZWMpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggInZOSUMgTUFDIGFkZHIgJXBNIHdxL3JxICVkLyVkXG4iLAorCWRldl9pbmZvKGVuaWNfZ2V0X2RldihlbmljKSwgInZOSUMgTUFDIGFkZHIgJXBNIHdxL3JxICVkLyVkXG4iLAogCQllbmljLT5tYWNfYWRkciwgYy0+d3FfZGVzY19jb3VudCwgYy0+cnFfZGVzY19jb3VudCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyBQRlggInZOSUMgbXR1ICVkIGNzdW0gdHgvcnggJWQvJWQgdHNvL2xybyAlZC8lZCAiCi0JCSJpbnRyIHRpbWVyICVkIHVzZWNcbiIsCisJZGV2X2luZm8oZW5pY19nZXRfZGV2KGVuaWMpLCAidk5JQyBtdHUgJWQgY3N1bSB0eC9yeCAlZC8lZCAiCisJCSJ0c28vbHJvICVkLyVkIGludHIgdGltZXIgJWQgdXNlY1xuIiwKIAkJYy0+bXR1LCBFTklDX1NFVFRJTkcoZW5pYywgVFhDU1VNKSwKIAkJRU5JQ19TRVRUSU5HKGVuaWMsIFJYQ1NVTSksIEVOSUNfU0VUVElORyhlbmljLCBUU08pLAogCQlFTklDX1NFVFRJTkcoZW5pYywgTFJPKSwgYy0+aW50cl90aW1lcl91c2VjKTsKQEAgLTEwMywxNyArMTA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBlbmljX2FkZF9tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpCi17Ci0Jdm5pY19kZXZfYWRkX2FkZHIoZW5pYy0+dmRldiwgYWRkcik7Ci19Ci0KLXZvaWQgZW5pY19kZWxfbXVsdGljYXN0X2FkZHIoc3RydWN0IGVuaWMgKmVuaWMsIHU4ICphZGRyKQotewotCXZuaWNfZGV2X2RlbF9hZGRyKGVuaWMtPnZkZXYsIGFkZHIpOwotfQotCi12b2lkIGVuaWNfYWRkX3ZsYW4oc3RydWN0IGVuaWMgKmVuaWMsIHUxNiB2bGFuaWQpCitpbnQgZW5pY19hZGRfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywgdTE2IHZsYW5pZCkKIHsKIAl1NjQgYTAgPSB2bGFuaWQsIGExID0gMDsKIAlpbnQgd2FpdCA9IDEwMDA7CkBAIC0xMjEsMTAgKzExMywxMiBAQAogCiAJZXJyID0gdm5pY19kZXZfY21kKGVuaWMtPnZkZXYsIENNRF9WTEFOX0FERCwgJmEwLCAmYTEsIHdhaXQpOwogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IGFkZCB2bGFuIGlkLCAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihlbmljX2dldF9kZXYoZW5pYyksICJDYW4ndCBhZGQgdmxhbiBpZCwgJWRcbiIsIGVycik7CisKKwlyZXR1cm4gZXJyOwogfQogCi12b2lkIGVuaWNfZGVsX3ZsYW4oc3RydWN0IGVuaWMgKmVuaWMsIHUxNiB2bGFuaWQpCitpbnQgZW5pY19kZWxfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywgdTE2IHZsYW5pZCkKIHsKIAl1NjQgYTAgPSB2bGFuaWQsIGExID0gMDsKIAlpbnQgd2FpdCA9IDEwMDA7CkBAIC0xMzIsNyArMTI2LDkgQEAKIAogCWVyciA9IHZuaWNfZGV2X2NtZChlbmljLT52ZGV2LCBDTURfVkxBTl9ERUwsICZhMCwgJmExLCB3YWl0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBkZWxldGUgdmxhbiBpZCwgJWRcbiIsIGVycik7CisJCWRldl9lcnIoZW5pY19nZXRfZGV2KGVuaWMpLCAiQ2FuJ3QgZGVsZXRlIHZsYW4gaWQsICVkXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKIH0KIAogaW50IGVuaWNfc2V0X25pY19jZmcoc3RydWN0IGVuaWMgKmVuaWMsIHU4IHJzc19kZWZhdWx0X2NwdSwgdTggcnNzX2hhc2hfdHlwZSwKQEAgLTE5OCw4ICsxOTQsOCBAQAogCQl2bmljX2Rldl9nZXRfcmVzX2NvdW50KGVuaWMtPnZkZXYsIFJFU19UWVBFX0lOVFJfQ1RSTCksCiAJCUVOSUNfSU5UUl9NQVgpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggInZOSUMgcmVzb3VyY2VzIGF2YWlsOiAiCi0JCSJ3cSAlZCBycSAlZCBjcSAlZCBpbnRyICVkXG4iLAorCWRldl9pbmZvKGVuaWNfZ2V0X2RldihlbmljKSwKKwkJInZOSUMgcmVzb3VyY2VzIGF2YWlsOiB3cSAlZCBycSAlZCBjcSAlZCBpbnRyICVkXG4iLAogCQllbmljLT53cV9jb3VudCwgZW5pYy0+cnFfY291bnQsCiAJCWVuaWMtPmNxX2NvdW50LCBlbmljLT5pbnRyX2NvdW50KTsKIH0KQEAgLTMwNCwxMSArMzAwLDYgQEAKIAkJCWVuaWMtPmNvbmZpZy5pbnRyX3RpbWVyX3R5cGUsCiAJCQltYXNrX29uX2Fzc2VydGlvbik7CiAJfQotCi0JLyogQ2xlYXIgTElGIHN0YXRzCi0JICovCi0KLQl2bmljX2Rldl9zdGF0c19jbGVhcihlbmljLT52ZGV2KTsKIH0KIAogaW50IGVuaWNfYWxsb2Nfdm5pY19yZXNvdXJjZXMoc3RydWN0IGVuaWMgKmVuaWMpCkBAIC0zMTksMTUgKzMxMCwxNCBAQAogCiAJaW50cl9tb2RlID0gdm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJ2TklDIHJlc291cmNlcyB1c2VkOiAgIgorCWRldl9pbmZvKGVuaWNfZ2V0X2RldihlbmljKSwgInZOSUMgcmVzb3VyY2VzIHVzZWQ6ICAiCiAJCSJ3cSAlZCBycSAlZCBjcSAlZCBpbnRyICVkIGludHIgbW9kZSAlc1xuIiwKIAkJZW5pYy0+d3FfY291bnQsIGVuaWMtPnJxX2NvdW50LAogCQllbmljLT5jcV9jb3VudCwgZW5pYy0+aW50cl9jb3VudCwKIAkJaW50cl9tb2RlID09IFZOSUNfREVWX0lOVFJfTU9ERV9JTlRYID8gImxlZ2FjeSBQQ0kgSU5UeCIgOgogCQlpbnRyX21vZGUgPT0gVk5JQ19ERVZfSU5UUl9NT0RFX01TSSA/ICJNU0kiIDoKIAkJaW50cl9tb2RlID09IFZOSUNfREVWX0lOVFJfTU9ERV9NU0lYID8gIk1TSS1YIiA6Ci0JCSJ1bmtub3duIgotCQkpOworCQkidW5rbm93biIpOwogCiAJLyogQWxsb2NhdGUgcXVldWUgcmVzb3VyY2VzCiAJICovCkBAIC0zNzMsNyArMzYzLDggQEAKIAllbmljLT5sZWdhY3lfcGJhID0gdm5pY19kZXZfZ2V0X3JlcyhlbmljLT52ZGV2LAogCQlSRVNfVFlQRV9JTlRSX1BCQV9MRUdBQ1ksIDApOwogCWlmICghZW5pYy0+bGVnYWN5X3BiYSAmJiBpbnRyX21vZGUgPT0gVk5JQ19ERVZfSU5UUl9NT0RFX0lOVFgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIGhvb2sgbGVnYWN5IHBiYSByZXNvdXJjZVxuIik7CisJCWRldl9lcnIoZW5pY19nZXRfZGV2KGVuaWMpLAorCQkJIkZhaWxlZCB0byBob29rIGxlZ2FjeSBwYmEgcmVzb3VyY2VcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9vdXRfY2xlYW51cDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmggYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmgKaW5kZXggNDk0NjY0Zi4uODNiZDE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX3Jlcy5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19yZXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtNDMsNyArNDMsNyBAQAogCXZvaWQgKm9zX2J1ZiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgdW5zaWduZWQgaW50IGxlbiwKIAl1bnNpZ25lZCBpbnQgbXNzX29yX2NzdW1fb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwKIAlpbnQgdmxhbl90YWdfaW5zZXJ0LCB1bnNpZ25lZCBpbnQgdmxhbl90YWcsCi0JaW50IG9mZmxvYWRfbW9kZSwgaW50IGNxX2VudHJ5LCBpbnQgc29wLCBpbnQgZW9wKQorCWludCBvZmZsb2FkX21vZGUsIGludCBjcV9lbnRyeSwgaW50IHNvcCwgaW50IGVvcCwgaW50IGxvb3BiYWNrKQogewogCXN0cnVjdCB3cV9lbmV0X2Rlc2MgKmRlc2MgPSB2bmljX3dxX25leHRfZGVzYyh3cSk7CiAKQEAgLTU2LDYxICs1Niw2MiBAQAogCQkwLCAvKiBmY29lX2VuY2FwICovCiAJCSh1OCl2bGFuX3RhZ19pbnNlcnQsCiAJCSh1MTYpdmxhbl90YWcsCi0JCTAgLyogbG9vcGJhY2sgKi8pOworCQkodTgpbG9vcGJhY2spOwogCiAJdm5pY193cV9wb3N0KHdxLCBvc19idWYsIGRtYV9hZGRyLCBsZW4sIHNvcCwgZW9wKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGVuaWNfcXVldWVfd3FfZGVzY19jb250KHN0cnVjdCB2bmljX3dxICp3cSwKLQl2b2lkICpvc19idWYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCBlb3ApCisJdm9pZCAqb3NfYnVmLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuLAorCWludCBlb3AsIGludCBsb29wYmFjaykKIHsKIAllbmljX3F1ZXVlX3dxX2Rlc2NfZXgod3EsIG9zX2J1ZiwgZG1hX2FkZHIsIGxlbiwKIAkJMCwgMCwgMCwgMCwgMCwKLQkJZW9wLCAwIC8qICFTT1AgKi8sIGVvcCk7CisJCWVvcCwgMCAvKiAhU09QICovLCBlb3AsIGxvb3BiYWNrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGVuaWNfcXVldWVfd3FfZGVzYyhzdHJ1Y3Qgdm5pY193cSAqd3EsIHZvaWQgKm9zX2J1ZiwKIAlkbWFfYWRkcl90IGRtYV9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgdmxhbl90YWdfaW5zZXJ0LAotCXVuc2lnbmVkIGludCB2bGFuX3RhZywgaW50IGVvcCkKKwl1bnNpZ25lZCBpbnQgdmxhbl90YWcsIGludCBlb3AsIGludCBsb29wYmFjaykKIHsKIAllbmljX3F1ZXVlX3dxX2Rlc2NfZXgod3EsIG9zX2J1ZiwgZG1hX2FkZHIsIGxlbiwKIAkJMCwgMCwgdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywKIAkJV1FfRU5FVF9PRkZMT0FEX01PREVfQ1NVTSwKLQkJZW9wLCAxIC8qIFNPUCAqLywgZW9wKTsKKwkJZW9wLCAxIC8qIFNPUCAqLywgZW9wLCBsb29wYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX2Rlc2NfY3N1bShzdHJ1Y3Qgdm5pY193cSAqd3EsCiAJdm9pZCAqb3NfYnVmLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuLAogCWludCBpcF9jc3VtLCBpbnQgdGNwdWRwX2NzdW0sIGludCB2bGFuX3RhZ19pbnNlcnQsCi0JdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgZW9wKQorCXVuc2lnbmVkIGludCB2bGFuX3RhZywgaW50IGVvcCwgaW50IGxvb3BiYWNrKQogewogCWVuaWNfcXVldWVfd3FfZGVzY19leCh3cSwgb3NfYnVmLCBkbWFfYWRkciwgbGVuLAogCQkoaXBfY3N1bSA/IDEgOiAwKSArICh0Y3B1ZHBfY3N1bSA/IDIgOiAwKSwKIAkJMCwgdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywKIAkJV1FfRU5FVF9PRkZMT0FEX01PREVfQ1NVTSwKLQkJZW9wLCAxIC8qIFNPUCAqLywgZW9wKTsKKwkJZW9wLCAxIC8qIFNPUCAqLywgZW9wLCBsb29wYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX2Rlc2NfY3N1bV9sNChzdHJ1Y3Qgdm5pY193cSAqd3EsCiAJdm9pZCAqb3NfYnVmLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuLAogCXVuc2lnbmVkIGludCBjc3VtX29mZnNldCwgdW5zaWduZWQgaW50IGhkcl9sZW4sCi0JaW50IHZsYW5fdGFnX2luc2VydCwgdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgZW9wKQorCWludCB2bGFuX3RhZ19pbnNlcnQsIHVuc2lnbmVkIGludCB2bGFuX3RhZywgaW50IGVvcCwgaW50IGxvb3BiYWNrKQogewogCWVuaWNfcXVldWVfd3FfZGVzY19leCh3cSwgb3NfYnVmLCBkbWFfYWRkciwgbGVuLAogCQljc3VtX29mZnNldCwgaGRyX2xlbiwgdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywKIAkJV1FfRU5FVF9PRkZMT0FEX01PREVfQ1NVTV9MNCwKLQkJZW9wLCAxIC8qIFNPUCAqLywgZW9wKTsKKwkJZW9wLCAxIC8qIFNPUCAqLywgZW9wLCBsb29wYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX2Rlc2NfdHNvKHN0cnVjdCB2bmljX3dxICp3cSwKIAl2b2lkICpvc19idWYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHVuc2lnbmVkIGludCBsZW4sCiAJdW5zaWduZWQgaW50IG1zcywgdW5zaWduZWQgaW50IGhkcl9sZW4sIGludCB2bGFuX3RhZ19pbnNlcnQsCi0JdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgZW9wKQorCXVuc2lnbmVkIGludCB2bGFuX3RhZywgaW50IGVvcCwgaW50IGxvb3BiYWNrKQogewogCWVuaWNfcXVldWVfd3FfZGVzY19leCh3cSwgb3NfYnVmLCBkbWFfYWRkciwgbGVuLAogCQltc3MsIGhkcl9sZW4sIHZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcsCiAJCVdRX0VORVRfT0ZGTE9BRF9NT0RFX1RTTywKLQkJZW9wLCAxIC8qIFNPUCAqLywgZW9wKTsKKwkJZW9wLCAxIC8qIFNPUCAqLywgZW9wLCBsb29wYmFjayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3JxX2Rlc2Moc3RydWN0IHZuaWNfcnEgKnJxLApAQCAtMTMxLDEwICsxMzIsOCBAQAogc3RydWN0IGVuaWM7CiAKIGludCBlbmljX2dldF92bmljX2NvbmZpZyhzdHJ1Y3QgZW5pYyAqKTsKLXZvaWQgZW5pY19hZGRfbXVsdGljYXN0X2FkZHIoc3RydWN0IGVuaWMgKmVuaWMsIHU4ICphZGRyKTsKLXZvaWQgZW5pY19kZWxfbXVsdGljYXN0X2FkZHIoc3RydWN0IGVuaWMgKmVuaWMsIHU4ICphZGRyKTsKLXZvaWQgZW5pY19hZGRfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywgdTE2IHZsYW5pZCk7Ci12b2lkIGVuaWNfZGVsX3ZsYW4oc3RydWN0IGVuaWMgKmVuaWMsIHUxNiB2bGFuaWQpOworaW50IGVuaWNfYWRkX3ZsYW4oc3RydWN0IGVuaWMgKmVuaWMsIHUxNiB2bGFuaWQpOworaW50IGVuaWNfZGVsX3ZsYW4oc3RydWN0IGVuaWMgKmVuaWMsIHUxNiB2bGFuaWQpOwogaW50IGVuaWNfc2V0X25pY19jZmcoc3RydWN0IGVuaWMgKmVuaWMsIHU4IHJzc19kZWZhdWx0X2NwdSwgdTggcnNzX2hhc2hfdHlwZSwKIAl1OCByc3NfaGFzaF9iaXRzLCB1OCByc3NfYmFzZV9jcHUsIHU4IHJzc19lbmFibGUsIHU4IHRzb19pcGlkX3NwbGl0X2VuLAogCXU4IGlnX3ZsYW5fc3RyaXBfZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9ycV9lbmV0X2Rlc2MuaCBiL2RyaXZlcnMvbmV0L2VuaWMvcnFfZW5ldF9kZXNjLmgKaW5kZXggYTA2ZTY0OS4uZTZkZDMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9ycV9lbmV0X2Rlc2MuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL3JxX2VuZXRfZGVzYy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfY3EuYyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCmluZGV4IDAyMGFlNmMuLmI4NmQ2ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC00Miw3ICs0Miw3IEBACiAKIAljcS0+Y3RybCA9IHZuaWNfZGV2X2dldF9yZXModmRldiwgUkVTX1RZUEVfQ1EsIGluZGV4KTsKIAlpZiAoIWNxLT5jdHJsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGhvb2sgQ1FbJWRdIHJlc291cmNlXG4iLCBpbmRleCk7CisJCXByX2VycigiRmFpbGVkIHRvIGhvb2sgQ1FbJWRdIHJlc291cmNlXG4iLCBpbmRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2NxLmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfY3EuaAppbmRleCAxMTQ3NjNjLi41NTJkM2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfY3EuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfY3EuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5jCmluZGV4IGUwZDMzMjguLjZhNWI1NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXYuYworKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTIzLDIxICsyMywyMyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJ2bmljX3Jlc291cmNlLmgiCiAjaW5jbHVkZSAidm5pY19kZXZjbWQuaCIKICNpbmNsdWRlICJ2bmljX2Rldi5oIgogI2luY2x1ZGUgInZuaWNfc3RhdHMuaCIKIAorZW51bSB2bmljX3Byb3h5X3R5cGUgeworCVBST1hZX05PTkUsCisJUFJPWFlfQllfQkRGLAorfTsKKwogc3RydWN0IHZuaWNfcmVzIHsKIAl2b2lkIF9faW9tZW0gKnZhZGRyOwogCWRtYV9hZGRyX3QgYnVzX2FkZHI7CiAJdW5zaWduZWQgaW50IGNvdW50OwogfTsKIAotI2RlZmluZSBWTklDX0RFVl9DQVBfSU5JVAkweDAwMDEKLQogc3RydWN0IHZuaWNfZGV2IHsKIAl2b2lkICpwcml2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwpAQCAtNDgsMTMgKzUwLDE0IEBACiAJc3RydWN0IHZuaWNfZGV2Y21kX25vdGlmeSBub3RpZnlfY29weTsKIAlkbWFfYWRkcl90IG5vdGlmeV9wYTsKIAl1MzIgbm90aWZ5X3N6OwotCXUzMiAqbGlua3N0YXR1czsKIAlkbWFfYWRkcl90IGxpbmtzdGF0dXNfcGE7CiAJc3RydWN0IHZuaWNfc3RhdHMgKnN0YXRzOwogCWRtYV9hZGRyX3Qgc3RhdHNfcGE7CiAJc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8gKmZ3X2luZm87CiAJZG1hX2FkZHJfdCBmd19pbmZvX3BhOwotCXUzMiBjYXBfZmxhZ3M7CisJZW51bSB2bmljX3Byb3h5X3R5cGUgcHJveHk7CisJdTMyIHByb3h5X2luZGV4OworCXU2NCBhcmdzW1ZOSUNfREVWQ01EX05BUkdTXTsKIH07CiAKICNkZWZpbmUgVk5JQ19NQVhfUkVTX0hEUl9TSVpFIFwKQEAgLTc4LDE5ICs4MSwxOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChiYXItPmxlbiA8IFZOSUNfTUFYX1JFU19IRFJfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIgInZOSUMgQkFSMCByZXMgaGRyIGxlbmd0aCBlcnJvclxuIik7CisJCXByX2Vycigidk5JQyBCQVIwIHJlcyBoZHIgbGVuZ3RoIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmggPSBiYXItPnZhZGRyOwogCWlmICghcmgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2TklDIEJBUjAgcmVzIGhkciBub3QgbWVtLW1hcHBlZFxuIik7CisJCXByX2Vycigidk5JQyBCQVIwIHJlcyBoZHIgbm90IG1lbS1tYXBwZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaW9yZWFkMzIoJnJoLT5tYWdpYykgIT0gVk5JQ19SRVNfTUFHSUMgfHwKIAkgICAgaW9yZWFkMzIoJnJoLT52ZXJzaW9uKSAhPSBWTklDX1JFU19WRVJTSU9OKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidk5JQyBCQVIwIHJlcyBtYWdpYy92ZXJzaW9uIGVycm9yICIKKwkJcHJfZXJyKCJ2TklDIEJBUjAgcmVzIG1hZ2ljL3ZlcnNpb24gZXJyb3IgIgogCQkJImV4cCAoJWx4LyVseCkgY3VyciAoJXgvJXgpXG4iLAogCQkJVk5JQ19SRVNfTUFHSUMsIFZOSUNfUkVTX1ZFUlNJT04sCiAJCQlpb3JlYWQzMigmcmgtPm1hZ2ljKSwgaW9yZWFkMzIoJnJoLT52ZXJzaW9uKSk7CkBAIC0xMjIsNyArMTI1LDcgQEAKIAkJCS8qIGVhY2ggY291bnQgaXMgc3RyaWRlIGJ5dGVzIGxvbmcgKi8KIAkJCWxlbiA9IGNvdW50ICogVk5JQ19SRVNfU1RSSURFOwogCQkJaWYgKGxlbiArIGJhcl9vZmZzZXQgPiBiYXJbYmFyX251bV0ubGVuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJ2TklDIEJBUjAgcmVzb3VyY2UgJWQgIgorCQkJCXByX2Vycigidk5JQyBCQVIwIHJlc291cmNlICVkICIKIAkJCQkJIm91dC1vZi1ib3VuZHMsIG9mZnNldCAweCV4ICsgIgogCQkJCQkic2l6ZSAweCV4ID4gYmFyIGxlbiAweCVseFxuIiwKIAkJCQkJdHlwZSwgYmFyX29mZnNldCwKQEAgLTIyOSw4ICsyMzIsNyBAQAogCQkmcmluZy0+YmFzZV9hZGRyX3VuYWxpZ25lZCk7CiAKIAlpZiAoIXJpbmctPmRlc2NzX3VuYWxpZ25lZCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIHJpbmcgKHNpemU9JWQpLCBhYm9ydGluZ1xuIiwKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmluZyAoc2l6ZT0lZCksIGFib3J0aW5nXG4iLAogCQkJKGludClyaW5nLT5zaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjU4LDIzICsyNjAsMjggQEAKIAl9CiB9CiAKLWludCB2bmljX2Rldl9jbWQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBlbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQsCi0JdTY0ICphMCwgdTY0ICphMSwgaW50IHdhaXQpCitzdGF0aWMgaW50IF92bmljX2Rldl9jbWQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBlbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQsCisJaW50IHdhaXQpCiB7CiAJc3RydWN0IHZuaWNfZGV2Y21kIF9faW9tZW0gKmRldmNtZCA9IHZkZXYtPmRldmNtZDsKKwl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgZGVsYXk7CiAJdTMyIHN0YXR1czsKIAlpbnQgZXJyOwogCiAJc3RhdHVzID0gaW9yZWFkMzIoJmRldmNtZC0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IDB4RkZGRkZGRkYpIHsKKwkJLyogUENJLWUgdGFyZ2V0IGRldmljZSBpcyBnb25lICovCisJCXJldHVybiAtRU5PREVWOworCX0KIAlpZiAoc3RhdHVzICYgU1RBVF9CVVNZKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQnVzeSBkZXZjbWQgJWRcbiIsIF9DTURfTihjbWQpKTsKKwkJcHJfZXJyKCJCdXN5IGRldmNtZCAlZFxuIiwgX0NNRF9OKGNtZCkpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmIChfQ01EX0RJUihjbWQpICYgX0NNRF9ESVJfV1JJVEUpIHsKLQkJd3JpdGVxKCphMCwgJmRldmNtZC0+YXJnc1swXSk7Ci0JCXdyaXRlcSgqYTEsICZkZXZjbWQtPmFyZ3NbMV0pOworCQlmb3IgKGkgPSAwOyBpIDwgVk5JQ19ERVZDTURfTkFSR1M7IGkrKykKKwkJCXdyaXRlcSh2ZGV2LT5hcmdzW2ldLCAmZGV2Y21kLT5hcmdzW2ldKTsKIAkJd21iKCk7CiAJfQogCkBAIC0yODgsMzEgKzI5NSwxMTAgQEAKIAkJdWRlbGF5KDEwMCk7CiAKIAkJc3RhdHVzID0gaW9yZWFkMzIoJmRldmNtZC0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA9PSAweEZGRkZGRkZGKSB7CisJCQkvKiBQQ0ktZSB0YXJnZXQgZGV2aWNlIGlzIGdvbmUgKi8KKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKIAkJaWYgKCEoc3RhdHVzICYgU1RBVF9CVVNZKSkgewogCiAJCQlpZiAoc3RhdHVzICYgU1RBVF9FUlJPUikgewogCQkJCWVyciA9IChpbnQpcmVhZHEoJmRldmNtZC0+YXJnc1swXSk7CiAJCQkJaWYgKGVyciAhPSBFUlJfRUNNRFVOS05PV04gfHwKIAkJCQkgICAgY21kICE9IENNRF9DQVBBQklMSVRZKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVkIGRldmNtZCAlZFxuIiwKKwkJCQkJcHJfZXJyKCJFcnJvciAlZCBkZXZjbWQgJWRcbiIsCiAJCQkJCQllcnIsIF9DTURfTihjbWQpKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCiAJCQlpZiAoX0NNRF9ESVIoY21kKSAmIF9DTURfRElSX1JFQUQpIHsKIAkJCQlybWIoKTsKLQkJCQkqYTAgPSByZWFkcSgmZGV2Y21kLT5hcmdzWzBdKTsKLQkJCQkqYTEgPSByZWFkcSgmZGV2Y21kLT5hcmdzWzFdKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgVk5JQ19ERVZDTURfTkFSR1M7IGkrKykKKwkJCQkJdmRldi0+YXJnc1tpXSA9IHJlYWRxKCZkZXZjbWQtPmFyZ3NbaV0pOwogCQkJfQogCiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXByaW50ayhLRVJOX0VSUiAiVGltZWRvdXQgZGV2Y21kICVkXG4iLCBfQ01EX04oY21kKSk7CisJcHJfZXJyKCJUaW1lZG91dCBkZXZjbWQgJWRcbiIsIF9DTURfTihjbWQpKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAorc3RhdGljIGludCB2bmljX2Rldl9jbWRfcHJveHlfYnlfYmRmKHN0cnVjdCB2bmljX2RldiAqdmRldiwKKwllbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQsIHU2NCAqYTAsIHU2NCAqYTEsIGludCB3YWl0KQoreworCXUzMiBzdGF0dXM7CisJaW50IGVycjsKKworCW1lbXNldCh2ZGV2LT5hcmdzLCAwLCBzaXplb2YodmRldi0+YXJncykpOworCisJdmRldi0+YXJnc1swXSA9IHZkZXYtPnByb3h5X2luZGV4OyAvKiBiZGYgKi8KKwl2ZGV2LT5hcmdzWzFdID0gY21kOworCXZkZXYtPmFyZ3NbMl0gPSAqYTA7CisJdmRldi0+YXJnc1szXSA9ICphMTsKKworCWVyciA9IF92bmljX2Rldl9jbWQodmRldiwgQ01EX1BST1hZX0JZX0JERiwgd2FpdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXN0YXR1cyA9ICh1MzIpdmRldi0+YXJnc1swXTsKKwlpZiAoc3RhdHVzICYgU1RBVF9FUlJPUikgeworCQllcnIgPSAoaW50KXZkZXYtPmFyZ3NbMV07CisJCWlmIChlcnIgIT0gRVJSX0VDTURVTktOT1dOIHx8CisJCSAgICBjbWQgIT0gQ01EX0NBUEFCSUxJVFkpCisJCQlwcl9lcnIoIkVycm9yICVkIHByb3h5IGRldmNtZCAlZFxuIiwgZXJyLCBfQ01EX04oY21kKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJKmEwID0gdmRldi0+YXJnc1sxXTsKKwkqYTEgPSB2ZGV2LT5hcmdzWzJdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5pY19kZXZfY21kX25vX3Byb3h5KHN0cnVjdCB2bmljX2RldiAqdmRldiwKKwllbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQsIHU2NCAqYTAsIHU2NCAqYTEsIGludCB3YWl0KQoreworCWludCBlcnI7CisKKwl2ZGV2LT5hcmdzWzBdID0gKmEwOworCXZkZXYtPmFyZ3NbMV0gPSAqYTE7CisKKwllcnIgPSBfdm5pY19kZXZfY21kKHZkZXYsIGNtZCwgd2FpdCk7CisKKwkqYTAgPSB2ZGV2LT5hcmdzWzBdOworCSphMSA9IHZkZXYtPmFyZ3NbMV07CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIHZuaWNfZGV2X2NtZF9wcm94eV9ieV9iZGZfc3RhcnQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1MTYgYmRmKQoreworCXZkZXYtPnByb3h5ID0gUFJPWFlfQllfQkRGOworCXZkZXYtPnByb3h5X2luZGV4ID0gYmRmOworfQorCit2b2lkIHZuaWNfZGV2X2NtZF9wcm94eV9lbmQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoreworCXZkZXYtPnByb3h5ID0gUFJPWFlfTk9ORTsKKwl2ZGV2LT5wcm94eV9pbmRleCA9IDA7Cit9CisKK2ludCB2bmljX2Rldl9jbWQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBlbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQsCisJdTY0ICphMCwgdTY0ICphMSwgaW50IHdhaXQpCit7CisJbWVtc2V0KHZkZXYtPmFyZ3MsIDAsIHNpemVvZih2ZGV2LT5hcmdzKSk7CisKKwlzd2l0Y2ggKHZkZXYtPnByb3h5KSB7CisJY2FzZSBQUk9YWV9CWV9CREY6CisJCXJldHVybiB2bmljX2Rldl9jbWRfcHJveHlfYnlfYmRmKHZkZXYsIGNtZCwgYTAsIGExLCB3YWl0KTsKKwljYXNlIFBST1hZX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIHZuaWNfZGV2X2NtZF9ub19wcm94eSh2ZGV2LCBjbWQsIGEwLCBhMSwgd2FpdCk7CisJfQorfQorCiBzdGF0aWMgaW50IHZuaWNfZGV2X2NhcGFibGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBlbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQpCiB7CiAJdTY0IGEwID0gKHUzMiljbWQsIGExID0gMDsKQEAgLTQzMSw2ICs1MTcsMTkgQEAKIAlyZXR1cm4gdm5pY19kZXZfY21kKHZkZXYsIENNRF9FTkFCTEUsICZhMCwgJmExLCB3YWl0KTsKIH0KIAoraW50IHZuaWNfZGV2X2VuYWJsZV93YWl0KHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwl1NjQgYTAgPSAwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisKKwllcnIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX0VOQUJMRV9XQUlULCAmYTAsICZhMSwgd2FpdCk7CisJaWYgKGVyciA9PSBFUlJfRUNNRFVOS05PV04pCisJCXJldHVybiB2bmljX2Rldl9jbWQodmRldiwgQ01EX0VOQUJMRSwgJmEwLCAmYTEsIHdhaXQpOworCisJcmV0dXJuIGVycjsKK30KKwogaW50IHZuaWNfZGV2X2Rpc2FibGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQogewogCXU2NCBhMCA9IDAsIGExID0gMDsKQEAgLTQ4Niw2ICs1ODUsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHZuaWNfZGV2X2hhbmdfcmVzZXQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgYXJnKQoreworCXU2NCBhMCA9ICh1MzIpYXJnLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisKKwllcnIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX0hBTkdfUkVTRVQsICZhMCwgJmExLCB3YWl0KTsKKwlpZiAoZXJyID09IEVSUl9FQ01EVU5LTk9XTikgeworCQllcnIgPSB2bmljX2Rldl9zb2Z0X3Jlc2V0KHZkZXYsIGFyZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXJldHVybiB2bmljX2Rldl9pbml0KHZkZXYsIDApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK2ludCB2bmljX2Rldl9oYW5nX3Jlc2V0X2RvbmUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgKmRvbmUpCit7CisJdTY0IGEwID0gMCwgYTEgPSAwOworCWludCB3YWl0ID0gMTAwMDsKKwlpbnQgZXJyOworCisJKmRvbmUgPSAwOworCisJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9IQU5HX1JFU0VUX1NUQVRVUywgJmEwLCAmYTEsIHdhaXQpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSBFUlJfRUNNRFVOS05PV04pCisJCQlyZXR1cm4gdm5pY19kZXZfc29mdF9yZXNldF9kb25lKHZkZXYsIGRvbmUpOworCQlyZXR1cm4gZXJyOworCX0KKworCSpkb25lID0gKGEwID09IDApOworCisJcmV0dXJuIDA7Cit9CisKIGludCB2bmljX2Rldl9oYW5nX25vdGlmeShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCiB7CiAJdTY0IGEwLCBhMTsKQEAgLTUxMiw3ICs2NDksNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHZuaWNfZGV2X3BhY2tldF9maWx0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgZGlyZWN0ZWQsIGludCBtdWx0aWNhc3QsCitpbnQgdm5pY19kZXZfcGFja2V0X2ZpbHRlcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCBkaXJlY3RlZCwgaW50IG11bHRpY2FzdCwKIAlpbnQgYnJvYWRjYXN0LCBpbnQgcHJvbWlzYywgaW50IGFsbG11bHRpKQogewogCXU2NCBhMCwgYTEgPSAwOwpAQCAtNTI3LDcgKzY2NCwyOSBAQAogCiAJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9QQUNLRVRfRklMVEVSLCAmYTAsICZhMSwgd2FpdCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBzZXQgcGFja2V0IGZpbHRlclxuIik7CisJCXByX2VycigiQ2FuJ3Qgc2V0IHBhY2tldCBmaWx0ZXJcbiIpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IHZuaWNfZGV2X3BhY2tldF9maWx0ZXJfYWxsKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGRpcmVjdGVkLAorCWludCBtdWx0aWNhc3QsIGludCBicm9hZGNhc3QsIGludCBwcm9taXNjLCBpbnQgYWxsbXVsdGkpCit7CisJdTY0IGEwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisKKwlhMCA9IChkaXJlY3RlZCA/IENNRF9QRklMVEVSX0RJUkVDVEVEIDogMCkgfAorCSAgICAgKG11bHRpY2FzdCA/IENNRF9QRklMVEVSX01VTFRJQ0FTVCA6IDApIHwKKwkgICAgIChicm9hZGNhc3QgPyBDTURfUEZJTFRFUl9CUk9BRENBU1QgOiAwKSB8CisJICAgICAocHJvbWlzYyA/IENNRF9QRklMVEVSX1BST01JU0NVT1VTIDogMCkgfAorCSAgICAgKGFsbG11bHRpID8gQ01EX1BGSUxURVJfQUxMX01VTFRJQ0FTVCA6IDApOworCisJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9QQUNLRVRfRklMVEVSX0FMTCwgJmEwLCAmYTEsIHdhaXQpOworCWlmIChlcnIpCisJCXByX2VycigiQ2FuJ3Qgc2V0IHBhY2tldCBmaWx0ZXJcbiIpOworCisJcmV0dXJuIGVycjsKIH0KIAogaW50IHZuaWNfZGV2X2FkZF9hZGRyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTggKmFkZHIpCkBAIC01NDIsNyArNzAxLDcgQEAKIAogCWVyciA9IHZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfQUREUl9BREQsICZhMCwgJmExLCB3YWl0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGFkZCBhZGRyIFslcE1dLCAlZFxuIiwgYWRkciwgZXJyKTsKKwkJcHJfZXJyKCJDYW4ndCBhZGQgYWRkciBbJXBNXSwgJWRcbiIsIGFkZHIsIGVycik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTU5LDcgKzcxOCwyMSBAQAogCiAJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9BRERSX0RFTCwgJmEwLCAmYTEsIHdhaXQpOwogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZGVsIGFkZHIgWyVwTV0sICVkXG4iLCBhZGRyLCBlcnIpOworCQlwcl9lcnIoIkNhbid0IGRlbCBhZGRyIFslcE1dLCAlZFxuIiwgYWRkciwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCB2bmljX2Rldl9zZXRfaWdfdmxhbl9yZXdyaXRlX21vZGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXU4IGlnX3ZsYW5fcmV3cml0ZV9tb2RlKQoreworCXU2NCBhMCA9IGlnX3ZsYW5fcmV3cml0ZV9tb2RlLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisKKwllcnIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX0lHX1ZMQU5fUkVXUklURV9NT0RFLCAmYTAsICZhMSwgd2FpdCk7CisJaWYgKGVyciA9PSBFUlJfRUNNRFVOS05PV04pCisJCXJldHVybiAwOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTU3Miw4ICs3NDUsNyBAQAogCiAJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9JQVIsICZhMCwgJmExLCB3YWl0KTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByYWlzZSBJTlRSWyVkXSwgZXJyICVkXG4iLAotCQkJaW50ciwgZXJyKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmFpc2UgSU5UUlslZF0sIGVyciAlZFxuIiwgaW50ciwgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02MDQsOCArNzc2LDcgQEAKIAlkbWFfYWRkcl90IG5vdGlmeV9wYTsKIAogCWlmICh2ZGV2LT5ub3RpZnkgfHwgdmRldi0+bm90aWZ5X3BhKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm90aWZ5IGJsb2NrICVwIHN0aWxsIGFsbG9jYXRlZCIsCi0JCQl2ZGV2LT5ub3RpZnkpOworCQlwcl9lcnIoIm5vdGlmeSBibG9jayAlcCBzdGlsbCBhbGxvY2F0ZWQiLCB2ZGV2LT5ub3RpZnkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTYxOCwyMiArNzg5LDI1IEBACiAJcmV0dXJuIHZuaWNfZGV2X25vdGlmeV9zZXRjbWQodmRldiwgbm90aWZ5X2FkZHIsIG5vdGlmeV9wYSwgaW50cik7CiB9CiAKLXZvaWQgdm5pY19kZXZfbm90aWZ5X3Vuc2V0Y21kKHN0cnVjdCB2bmljX2RldiAqdmRldikKK2ludCB2bmljX2Rldl9ub3RpZnlfdW5zZXRjbWQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQogewogCXU2NCBhMCwgYTE7CiAJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CiAKIAlhMCA9IDA7ICAvKiBwYWRkciA9IDAgdG8gdW5zZXQgbm90aWZ5IGJ1ZmZlciAqLwogCWExID0gMHgwMDAwZmZmZjAwMDAwMDAwVUxMOyAvKiBpbnRyIG51bSA9IC0xIHRvIHVucmVnIGZvciBpbnRyICovCiAJYTEgKz0gc2l6ZW9mKHN0cnVjdCB2bmljX2RldmNtZF9ub3RpZnkpOwogCi0Jdm5pY19kZXZfY21kKHZkZXYsIENNRF9OT1RJRlksICZhMCwgJmExLCB3YWl0KTsKKwllcnIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX05PVElGWSwgJmEwLCAmYTEsIHdhaXQpOwogCXZkZXYtPm5vdGlmeSA9IE5VTEw7CiAJdmRldi0+bm90aWZ5X3BhID0gMDsKIAl2ZGV2LT5ub3RpZnlfc3ogPSAwOworCisJcmV0dXJuIGVycjsKIH0KIAotdm9pZCB2bmljX2Rldl9ub3RpZnlfdW5zZXQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoraW50IHZuaWNfZGV2X25vdGlmeV91bnNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCiB7CiAJaWYgKHZkZXYtPm5vdGlmeSkgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHZkZXYtPnBkZXYsCkBAIC02NDIsNyArODE2LDcgQEAKIAkJCXZkZXYtPm5vdGlmeV9wYSk7CiAJfQogCi0Jdm5pY19kZXZfbm90aWZ5X3Vuc2V0Y21kKHZkZXYpOworCXJldHVybiB2bmljX2Rldl9ub3RpZnlfdW5zZXRjbWQodmRldik7CiB9CiAKIHN0YXRpYyBpbnQgdm5pY19kZXZfbm90aWZ5X3JlYWR5KHN0cnVjdCB2bmljX2RldiAqdmRldikKQEAgLTY3MiwxMyArODQ2LDE0IEBACiAJaW50IHdhaXQgPSAxMDAwOwogCWludCByID0gMDsKIAotCWlmICh2ZGV2LT5jYXBfZmxhZ3MgJiBWTklDX0RFVl9DQVBfSU5JVCkKKwlpZiAodm5pY19kZXZfY2FwYWJsZSh2ZGV2LCBDTURfSU5JVCkpCiAJCXIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX0lOSVQsICZhMCwgJmExLCB3YWl0KTsKIAllbHNlIHsKIAkJdm5pY19kZXZfY21kKHZkZXYsIENNRF9JTklUX3YxLCAmYTAsICZhMSwgd2FpdCk7CiAJCWlmIChhMCAmIENNRF9JTklURl9ERUZBVUxUX01BQykgewotCQkJLy8gRW11bGF0ZSB0aGVzZSBmb3Igb2xkIENNRF9JTklUX3YxIHdoaWNoCi0JCQkvLyBkaWRuJ3QgcGFzcyBhMCBzbyBubyBDTURfSU5JVEZfKi4KKwkJCS8qIEVtdWxhdGUgdGhlc2UgZm9yIG9sZCBDTURfSU5JVF92MSB3aGljaAorCQkJICogZGlkbid0IHBhc3MgYTAgc28gbm8gQ01EX0lOSVRGXyouCisJCQkgKi8KIAkJCXZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfTUFDX0FERFIsICZhMCwgJmExLCB3YWl0KTsKIAkJCXZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfQUREUl9BREQsICZhMCwgJmExLCB3YWl0KTsKIAkJfQpAQCAtNzAwLDcgKzg3NSw3IEBACiAKIAkqZG9uZSA9IChhMCA9PSAwKTsKIAotCSplcnIgPSAoYTAgPT0gMCkgPyBhMSA6IDA7CisJKmVyciA9IChhMCA9PSAwKSA/IChpbnQpYTE6MDsKIAogCXJldHVybiAwOwogfQpAQCAtNzM4LDkgKzkxMyw2IEBACiAKIGludCB2bmljX2Rldl9saW5rX3N0YXR1cyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCiB7Ci0JaWYgKHZkZXYtPmxpbmtzdGF0dXMpCi0JCXJldHVybiAqdmRldi0+bGlua3N0YXR1czsKLQogCWlmICghdm5pY19kZXZfbm90aWZ5X3JlYWR5KHZkZXYpKQogCQlyZXR1cm4gMDsKIApAQCAtNzg3LDYgKzk1OSwxNCBAQAogCXJldHVybiB2ZGV2LT5ub3RpZnlfY29weS5zdGF0dXM7CiB9CiAKK3UzMiB2bmljX2Rldl91aWYoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoreworCWlmICghdm5pY19kZXZfbm90aWZ5X3JlYWR5KHZkZXYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB2ZGV2LT5ub3RpZnlfY29weS51aWY7Cit9CisKIHZvaWQgdm5pY19kZXZfc2V0X2ludHJfbW9kZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsCiAJZW51bSB2bmljX2Rldl9pbnRyX21vZGUgaW50cl9tb2RlKQogewpAQCAtODA3LDE0ICs5ODcsOSBAQAogCQkJCXNpemVvZihzdHJ1Y3Qgdm5pY19kZXZjbWRfbm90aWZ5KSwKIAkJCQl2ZGV2LT5ub3RpZnksCiAJCQkJdmRldi0+bm90aWZ5X3BhKTsKLQkJaWYgKHZkZXYtPmxpbmtzdGF0dXMpCi0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KHZkZXYtPnBkZXYsCi0JCQkJc2l6ZW9mKHUzMiksCi0JCQkJdmRldi0+bGlua3N0YXR1cywKLQkJCQl2ZGV2LT5saW5rc3RhdHVzX3BhKTsKIAkJaWYgKHZkZXYtPnN0YXRzKQogCQkJcGNpX2ZyZWVfY29uc2lzdGVudCh2ZGV2LT5wZGV2LAotCQkJCXNpemVvZihzdHJ1Y3Qgdm5pY19kZXYpLAorCQkJCXNpemVvZihzdHJ1Y3Qgdm5pY19zdGF0cyksCiAJCQkJdmRldi0+c3RhdHMsIHZkZXYtPnN0YXRzX3BhKTsKIAkJaWYgKHZkZXYtPmZ3X2luZm8pCiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHZkZXYtPnBkZXYsCkBAIC04NDQsMTEgKzEwMTksNiBAQAogCWlmICghdmRldi0+ZGV2Y21kKQogCQlnb3RvIGVycl9vdXQ7CiAKLQl2ZGV2LT5jYXBfZmxhZ3MgPSAwOwotCi0JaWYgKHZuaWNfZGV2X2NhcGFibGUodmRldiwgQ01EX0lOSVQpKQotCQl2ZGV2LT5jYXBfZmxhZ3MgfD0gVk5JQ19ERVZfQ0FQX0lOSVQ7Ci0KIAlyZXR1cm4gdmRldjsKIAogZXJyX291dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXYuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXYuaAppbmRleCBjYWNjY2UzLi4zYTYxODczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC00MSw2ICs0MSw5IEBACiB9CiAjZW5kaWYKIAorI3VuZGVmIHByX2ZtdAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiBlbnVtIHZuaWNfZGV2X2h3X3ZlcnNpb24gewogCVZOSUNfREVWX0hXX1ZFUl9VTktOT1dOLAogCVZOSUNfREVWX0hXX1ZFUl9BMSwKQEAgLTkyLDYgKzk1LDggQEAKIAlzdHJ1Y3Qgdm5pY19kZXZfcmluZyAqcmluZyk7CiBpbnQgdm5pY19kZXZfY21kKHN0cnVjdCB2bmljX2RldiAqdmRldiwgZW51bSB2bmljX2RldmNtZF9jbWQgY21kLAogCXU2NCAqYTAsIHU2NCAqYTEsIGludCB3YWl0KTsKK3ZvaWQgdm5pY19kZXZfY21kX3Byb3h5X2J5X2JkZl9zdGFydChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHUxNiBiZGYpOwordm9pZCB2bmljX2Rldl9jbWRfcHJveHlfZW5kKHN0cnVjdCB2bmljX2RldiAqdmRldik7CiBpbnQgdm5pY19kZXZfZndfaW5mbyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsCiAJc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8gKipmd19pbmZvKTsKIGludCB2bmljX2Rldl9od192ZXJzaW9uKHN0cnVjdCB2bmljX2RldiAqdmRldiwKQEAgLTEwMSw4ICsxMDYsMTAgQEAKIGludCB2bmljX2Rldl9zdGF0c19jbGVhcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwogaW50IHZuaWNfZGV2X3N0YXRzX2R1bXAoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3Qgdm5pY19zdGF0cyAqKnN0YXRzKTsKIGludCB2bmljX2Rldl9oYW5nX25vdGlmeShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwotdm9pZCB2bmljX2Rldl9wYWNrZXRfZmlsdGVyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGRpcmVjdGVkLCBpbnQgbXVsdGljYXN0LAoraW50IHZuaWNfZGV2X3BhY2tldF9maWx0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgZGlyZWN0ZWQsIGludCBtdWx0aWNhc3QsCiAJaW50IGJyb2FkY2FzdCwgaW50IHByb21pc2MsIGludCBhbGxtdWx0aSk7CitpbnQgdm5pY19kZXZfcGFja2V0X2ZpbHRlcl9hbGwoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgZGlyZWN0ZWQsCisJaW50IG11bHRpY2FzdCwgaW50IGJyb2FkY2FzdCwgaW50IHByb21pc2MsIGludCBhbGxtdWx0aSk7CiBpbnQgdm5pY19kZXZfYWRkX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcik7CiBpbnQgdm5pY19kZXZfZGVsX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcik7CiBpbnQgdm5pY19kZXZfbWFjX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqbWFjX2FkZHIpOwpAQCAtMTEwLDE2ICsxMTcsMTggQEAKIGludCB2bmljX2Rldl9ub3RpZnlfc2V0Y21kKHN0cnVjdCB2bmljX2RldiAqdmRldiwKIAl2b2lkICpub3RpZnlfYWRkciwgZG1hX2FkZHJfdCBub3RpZnlfcGEsIHUxNiBpbnRyKTsKIGludCB2bmljX2Rldl9ub3RpZnlfc2V0KHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTE2IGludHIpOwotdm9pZCB2bmljX2Rldl9ub3RpZnlfdW5zZXRjbWQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKLXZvaWQgdm5pY19kZXZfbm90aWZ5X3Vuc2V0KHN0cnVjdCB2bmljX2RldiAqdmRldik7CitpbnQgdm5pY19kZXZfbm90aWZ5X3Vuc2V0Y21kKHN0cnVjdCB2bmljX2RldiAqdmRldik7CitpbnQgdm5pY19kZXZfbm90aWZ5X3Vuc2V0KHN0cnVjdCB2bmljX2RldiAqdmRldik7CiBpbnQgdm5pY19kZXZfbGlua19zdGF0dXMoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKIHUzMiB2bmljX2Rldl9wb3J0X3NwZWVkKHN0cnVjdCB2bmljX2RldiAqdmRldik7CiB1MzIgdm5pY19kZXZfbXNnX2x2bChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwogdTMyIHZuaWNfZGV2X210dShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwogdTMyIHZuaWNfZGV2X2xpbmtfZG93bl9jbnQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKIHUzMiB2bmljX2Rldl9ub3RpZnlfc3RhdHVzKHN0cnVjdCB2bmljX2RldiAqdmRldik7Cit1MzIgdm5pY19kZXZfdWlmKHN0cnVjdCB2bmljX2RldiAqdmRldik7CiBpbnQgdm5pY19kZXZfY2xvc2Uoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKIGludCB2bmljX2Rldl9lbmFibGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK2ludCB2bmljX2Rldl9lbmFibGVfd2FpdChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwogaW50IHZuaWNfZGV2X2Rpc2FibGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKIGludCB2bmljX2Rldl9vcGVuKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGFyZyk7CiBpbnQgdm5pY19kZXZfb3Blbl9kb25lKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50ICpkb25lKTsKQEAgLTEyOSwxMCArMTM4LDE0IEBACiBpbnQgdm5pY19kZXZfZGVpbml0KHN0cnVjdCB2bmljX2RldiAqdmRldik7CiBpbnQgdm5pY19kZXZfc29mdF9yZXNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCBhcmcpOwogaW50IHZuaWNfZGV2X3NvZnRfcmVzZXRfZG9uZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCAqZG9uZSk7CitpbnQgdm5pY19kZXZfaGFuZ19yZXNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCBhcmcpOworaW50IHZuaWNfZGV2X2hhbmdfcmVzZXRfZG9uZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCAqZG9uZSk7CiB2b2lkIHZuaWNfZGV2X3NldF9pbnRyX21vZGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAogCWVudW0gdm5pY19kZXZfaW50cl9tb2RlIGludHJfbW9kZSk7CiBlbnVtIHZuaWNfZGV2X2ludHJfbW9kZSB2bmljX2Rldl9nZXRfaW50cl9tb2RlKHN0cnVjdCB2bmljX2RldiAqdmRldik7CiB2b2lkIHZuaWNfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK2ludCB2bmljX2Rldl9zZXRfaWdfdmxhbl9yZXdyaXRlX21vZGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXU4IGlnX3ZsYW5fcmV3cml0ZV9tb2RlKTsKIHN0cnVjdCB2bmljX2RldiAqdm5pY19kZXZfcmVnaXN0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAogCXZvaWQgKnByaXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgdm5pY19kZXZfYmFyICpiYXIsCiAJdW5zaWduZWQgaW50IG51bV9iYXJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXZjbWQuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXZjbWQuaAppbmRleCBkNzhiYmNjLi4yMDY2MTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2Y21kLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2RldmNtZC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC05OCw2ICs5OCw5IEBACiAJLyogc2V0IFJ4IHBhY2tldCBmaWx0ZXI6ICh1MzIpYTA9ZmlsdGVycyAoc2VlIENNRF9QRklMVEVSXyopICovCiAJQ01EX1BBQ0tFVF9GSUxURVIJPSBfQ01EQ05XKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0VORVQsIDcpLAogCisJLyogc2V0IFJ4IHBhY2tldCBmaWx0ZXIgZm9yIGFsbDogKHUzMilhMD1maWx0ZXJzIChzZWUgQ01EX1BGSUxURVJfKikgKi8KKwlDTURfUEFDS0VUX0ZJTFRFUl9BTEwgICA9IF9DTURDTlcoX0NNRF9ESVJfV1JJVEUsIF9DTURfVlRZUEVfQUxMLCA3KSwKKwogCS8qIGhhbmcgZGV0ZWN0aW9uIG5vdGlmaWNhdGlvbiAqLwogCUNNRF9IQU5HX05PVElGWSAgICAgICAgID0gX0NNREMoX0NNRF9ESVJfTk9ORSwgX0NNRF9WVFlQRV9BTEwsIDgpLAogCkBAIC0xNzEsNiArMTc0LDkgQEAKIAkvKiBlbmFibGUgdmlydHVhbCBsaW5rICovCiAJQ01EX0VOQUJMRQkJPSBfQ01EQ05XKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0FMTCwgMjgpLAogCisJLyogZW5hYmxlIHZpcnR1YWwgbGluaywgd2FpdGluZyB2YXJpYW50LiAqLworCUNNRF9FTkFCTEVfV0FJVAkJPSBfQ01EQyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9BTEwsIDI4KSwKKwogCS8qIGRpc2FibGUgdmlydHVhbCBsaW5rICovCiAJQ01EX0RJU0FCTEUJCT0gX0NNREMoX0NNRF9ESVJfTk9ORSwgX0NNRF9WVFlQRV9BTEwsIDI5KSwKIApAQCAtMjExLDYgKzIxNywyNyBAQAogCSAqIGluOiAodTE2KWEwPWludGVycnVwdCBudW1iZXIgdG8gYXNzZXJ0CiAJICovCiAJQ01EX0lBUgkJCT0gX0NNRENOVyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9BTEwsIDM4KSwKKworCS8qIGluaXRpYXRlIGhhbmdyZXNldCwgbGlrZSBzb2Z0cmVzZXQgYWZ0ZXIgaGFuZyBkZXRlY3RlZCAqLworCUNNRF9IQU5HX1JFU0VUCQk9IF9DTURDKF9DTURfRElSX05PTkUsIF9DTURfVlRZUEVfQUxMLCAzOSksCisKKwkvKiBoYW5ncmVzZXQgc3RhdHVzOgorCSAqICAgIG91dDogYTA9MCByZXNldCBjb21wbGV0ZSwgYTA9MSByZXNldCBpbiBwcm9ncmVzcyAqLworCUNNRF9IQU5HX1JFU0VUX1NUQVRVUyAgID0gX0NNREMoX0NNRF9ESVJfUkVBRCwgX0NNRF9WVFlQRV9BTEwsIDQwKSwKKworCS8qCisJICogU2V0IGh3IGluZ3Jlc3MgcGFja2V0IHZsYW4gcmV3cml0ZSBtb2RlOgorCSAqIGluOiAgKHUzMilhMD1uZXcgdmxhbiByZXdyaXRlIG1vZGUKKwkgKiBvdXQ6ICh1MzIpYTA9b2xkIHZsYW4gcmV3cml0ZSBtb2RlICovCisJQ01EX0lHX1ZMQU5fUkVXUklURV9NT0RFID0gX0NNREMoX0NNRF9ESVJfUlcsIF9DTURfVlRZUEVfRU5FVCwgNDEpLAorCisJLyoKKwkgKiBpbjogICh1MTYpYTA9YmRmIG9mIHRhcmdldCB2bmljCisJICogICAgICAodTMyKWExPWNtZCB0byBwcm94eQorCSAqICAgICAgYTItYTE1PWFyZ3MgdG8gY21kIGluIGExCisJICogb3V0OiAodTMyKWEwPXN0YXR1cyBvZiBwcm94aWVkIGNtZAorCSAqICAgICAgYTEtYTE1PW91dCBhcmdzIG9mIHByb3hpZWQgY21kICovCisJQ01EX1BST1hZX0JZX0JERiA9CV9DTURDKF9DTURfRElSX1JXLCBfQ01EX1ZUWVBFX0FMTCwgNDIpLAogfTsKIAogLyogZmxhZ3MgZm9yIENNRF9PUEVOICovCkBAIC0yMjYsNiArMjUzLDEyIEBACiAjZGVmaW5lIENNRF9QRklMVEVSX1BST01JU0NVT1VTCQkweDA4CiAjZGVmaW5lIENNRF9QRklMVEVSX0FMTF9NVUxUSUNBU1QJMHgxMAogCisvKiByZXdyaXRlIG1vZGVzIGZvciBDTURfSUdfVkxBTl9SRVdSSVRFX01PREUgKi8KKyNkZWZpbmUgSUdfVkxBTl9SRVdSSVRFX01PREVfREVGQVVMVF9UUlVOSyAgICAgICAgICAgICAgMAorI2RlZmluZSBJR19WTEFOX1JFV1JJVEVfTU9ERV9VTlRBR19ERUZBVUxUX1ZMQU4gICAgICAgICAxCisjZGVmaW5lIElHX1ZMQU5fUkVXUklURV9NT0RFX1BSSU9SSVRZX1RBR19ERUZBVUxUX1ZMQU4gIDIKKyNkZWZpbmUgSUdfVkxBTl9SRVdSSVRFX01PREVfUEFTU19USFJVICAgICAgICAgICAgICAgICAgMworCiBlbnVtIHZuaWNfZGV2Y21kX3N0YXR1cyB7CiAJU1RBVF9OT05FID0gMCwKIAlTVEFUX0JVU1kgPSAxIDw8IDAsCS8qIGNtZCBpbiBwcm9ncmVzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2VuZXQuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19lbmV0LmgKaW5kZXggOGVlYjY3NS4uM2IzMjkxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZW5ldC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0zNSw2ICszNSw3IEBACiAJdTggaW50cl9tb2RlOwogCWNoYXIgZGV2bmFtZVsxNl07CiAJdTMyIGludHJfdGltZXJfdXNlYzsKKwl1MTYgbG9vcF90YWc7CiB9OwogCiAjZGVmaW5lIFZFTkVURl9UU08JCTB4MQkvKiBUU08gZW5hYmxlZCAqLwpAQCAtNDgsNSArNDksNiBAQAogI2RlZmluZSBWRU5FVEZfUlNTSEFTSF9UQ1BJUFY2CTB4MTAwCS8qIEhhc2ggb24gVENQICsgSVB2NiBmaWVsZHMgKi8KICNkZWZpbmUgVkVORVRGX1JTU0hBU0hfSVBWNl9FWAkweDIwMAkvKiBIYXNoIG9uIElQdjYgZXh0ZW5kZWQgZmllbGRzICovCiAjZGVmaW5lIFZFTkVURl9SU1NIQVNIX1RDUElQVjZfRVggMHg0MDAJLyogSGFzaCBvbiBUQ1AgKyBJUHY2IGV4dC4gZmllbGRzICovCisjZGVmaW5lIFZFTkVURl9MT09QCQkweDgwMAkvKiBMb29wYmFjayBlbmFibGVkICovCiAKICNlbmRpZiAvKiBfVk5JQ19FTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuYwppbmRleCAzOTM0MzA5Li41MmFiNjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19pbnRyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTM5LDggKzM5LDcgQEAKIAogCWludHItPmN0cmwgPSB2bmljX2Rldl9nZXRfcmVzKHZkZXYsIFJFU19UWVBFX0lOVFJfQ1RSTCwgaW5kZXgpOwogCWlmICghaW50ci0+Y3RybCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBob29rIElOVFJbJWRdLmN0cmwgcmVzb3VyY2VcbiIsCi0JCQlpbmRleCk7CisJCXByX2VycigiRmFpbGVkIHRvIGhvb2sgSU5UUlslZF0uY3RybCByZXNvdXJjZVxuIiwgaW5kZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19pbnRyLmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5oCmluZGV4IDJmZTZjNjMuLjA5ZGMwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19pbnRyLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtNjEsNyArNjEsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2bmljX2ludHJfbWFzayhzdHJ1Y3Qgdm5pY19pbnRyICppbnRyKQogewogCWlvd3JpdGUzMigxLCAmaW50ci0+Y3RybC0+bWFzayk7Ci0JKHZvaWQpaW9yZWFkMzIoJmludHItPmN0cmwtPm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bmljX2ludHJfbWFza2VkKHN0cnVjdCB2bmljX2ludHIgKmludHIpCit7CisJcmV0dXJuIGlvcmVhZDMyKCZpbnRyLT5jdHJsLT5tYXNrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHZuaWNfaW50cl9yZXR1cm5fY3JlZGl0cyhzdHJ1Y3Qgdm5pY19pbnRyICppbnRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX25pYy5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX25pYy5oCmluZGV4IGNmODBhYjQuLjk5NWE1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19uaWMuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfbmljLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19yZXNvdXJjZS5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3Jlc291cmNlLmgKaW5kZXggYjYxYzIyYS4uODEwMjg3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3Jlc291cmNlLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3Jlc291cmNlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19ycS5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3JxLmMKaW5kZXggY2M1ODBjZi4uZGJiMmFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3JxLmMKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3JxLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTM3LDIzICszNywyMyBAQAogCXZkZXYgPSBycS0+dmRldjsKIAogCWZvciAoaSA9IDA7IGkgPCBibGtzOyBpKyspIHsKLQkJcnEtPmJ1ZnNbaV0gPSBremFsbG9jKFZOSUNfUlFfQlVGX0JMS19TWiwgR0ZQX0FUT01JQyk7CisJCXJxLT5idWZzW2ldID0ga3phbGxvYyhWTklDX1JRX0JVRl9CTEtfU1ooY291bnQpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFycS0+YnVmc1tpXSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2MgcnFfYnVmc1xuIik7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvYyBycV9idWZzXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGJsa3M7IGkrKykgewogCQlidWYgPSBycS0+YnVmc1tpXTsKLQkJZm9yIChqID0gMDsgaiA8IFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTOyBqKyspIHsKLQkJCWJ1Zi0+aW5kZXggPSBpICogVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMgKyBqOworCQlmb3IgKGogPSAwOyBqIDwgVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMoY291bnQpOyBqKyspIHsKKwkJCWJ1Zi0+aW5kZXggPSBpICogVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMoY291bnQpICsgajsKIAkJCWJ1Zi0+ZGVzYyA9ICh1OCAqKXJxLT5yaW5nLmRlc2NzICsKIAkJCQlycS0+cmluZy5kZXNjX3NpemUgKiBidWYtPmluZGV4OwogCQkJaWYgKGJ1Zi0+aW5kZXggKyAxID09IGNvdW50KSB7CiAJCQkJYnVmLT5uZXh0ID0gcnEtPmJ1ZnNbMF07CiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKGogKyAxID09IFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTKSB7CisJCQl9IGVsc2UgaWYgKGogKyAxID09IFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTKGNvdW50KSkgewogCQkJCWJ1Zi0+bmV4dCA9IHJxLT5idWZzW2kgKyAxXTsKIAkJCX0gZWxzZSB7CiAJCQkJYnVmLT5uZXh0ID0gYnVmICsgMTsKQEAgLTk0LDcgKzk0LDcgQEAKIAogCXJxLT5jdHJsID0gdm5pY19kZXZfZ2V0X3Jlcyh2ZGV2LCBSRVNfVFlQRV9SUSwgaW5kZXgpOwogCWlmICghcnEtPmN0cmwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gaG9vayBSUVslZF0gcmVzb3VyY2VcbiIsIGluZGV4KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gaG9vayBSUVslZF0gcmVzb3VyY2VcbiIsIGluZGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTksMTAgKzExOSwxMSBAQAogCXVuc2lnbmVkIGludCBlcnJvcl9pbnRlcnJ1cHRfb2Zmc2V0KQogewogCXU2NCBwYWRkcjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBycS0+cmluZy5kZXNjX2NvdW50OwogCiAJcGFkZHIgPSAodTY0KXJxLT5yaW5nLmJhc2VfYWRkciB8IFZOSUNfUEFERFJfVEFSR0VUOwogCXdyaXRlcShwYWRkciwgJnJxLT5jdHJsLT5yaW5nX2Jhc2UpOwotCWlvd3JpdGUzMihycS0+cmluZy5kZXNjX2NvdW50LCAmcnEtPmN0cmwtPnJpbmdfc2l6ZSk7CisJaW93cml0ZTMyKGNvdW50LCAmcnEtPmN0cmwtPnJpbmdfc2l6ZSk7CiAJaW93cml0ZTMyKGNxX2luZGV4LCAmcnEtPmN0cmwtPmNxX2luZGV4KTsKIAlpb3dyaXRlMzIoZXJyb3JfaW50ZXJydXB0X2VuYWJsZSwgJnJxLT5jdHJsLT5lcnJvcl9pbnRlcnJ1cHRfZW5hYmxlKTsKIAlpb3dyaXRlMzIoZXJyb3JfaW50ZXJydXB0X29mZnNldCwgJnJxLT5jdHJsLT5lcnJvcl9pbnRlcnJ1cHRfb2Zmc2V0KTsKQEAgLTEzMiw4ICsxMzMsOCBAQAogCWlvd3JpdGUzMihwb3N0ZWRfaW5kZXgsICZycS0+Y3RybC0+cG9zdGVkX2luZGV4KTsKIAogCXJxLT50b191c2UgPSBycS0+dG9fY2xlYW4gPQotCQkmcnEtPmJ1ZnNbZmV0Y2hfaW5kZXggLyBWTklDX1JRX0JVRl9CTEtfRU5UUklFU10KLQkJCVtmZXRjaF9pbmRleCAlIFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTXTsKKwkJJnJxLT5idWZzW2ZldGNoX2luZGV4IC8gVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMoY291bnQpXQorCQkJW2ZldGNoX2luZGV4ICUgVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMoY291bnQpXTsKIH0KIAogdm9pZCB2bmljX3JxX2luaXQoc3RydWN0IHZuaWNfcnEgKnJxLCB1bnNpZ25lZCBpbnQgY3FfaW5kZXgsCkBAIC0xNDUsNiArMTQ2LDExIEBACiAJLyogVXNlIGN1cnJlbnQgZmV0Y2hfaW5kZXggYXMgdGhlIHJpbmcgc3RhcnRpbmcgcG9pbnQgKi8KIAlmZXRjaF9pbmRleCA9IGlvcmVhZDMyKCZycS0+Y3RybC0+ZmV0Y2hfaW5kZXgpOwogCisJaWYgKGZldGNoX2luZGV4ID09IDB4RkZGRkZGRkYpIHsgLyogY2hlY2sgZm9yIGhhcmR3YXJlIGdvbmUgICovCisJCS8qIEhhcmR3YXJlIHN1cnByaXNlIHJlbW92YWw6IHJlc2V0IGZldGNoX2luZGV4ICovCisJCWZldGNoX2luZGV4ID0gMDsKKwl9CisKIAl2bmljX3JxX2luaXRfc3RhcnQocnEsIGNxX2luZGV4LAogCQlmZXRjaF9pbmRleCwgZmV0Y2hfaW5kZXgsCiAJCWVycm9yX2ludGVycnVwdF9lbmFibGUsCkBAIC0xNzQsNyArMTgwLDcgQEAKIAkJdWRlbGF5KDEwKTsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBkaXNhYmxlIFJRWyVkXVxuIiwgcnEtPmluZGV4KTsKKwlwcl9lcnIoIkZhaWxlZCB0byBkaXNhYmxlIFJRWyVkXVxuIiwgcnEtPmluZGV4KTsKIAogCXJldHVybiAtRVRJTUVET1VUOwogfQpAQCAtMTg0LDggKzE5MCw3IEBACiB7CiAJc3RydWN0IHZuaWNfcnFfYnVmICpidWY7CiAJdTMyIGZldGNoX2luZGV4OwotCi0JQlVHX09OKGlvcmVhZDMyKCZycS0+Y3RybC0+ZW5hYmxlKSk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gcnEtPnJpbmcuZGVzY19jb3VudDsKIAogCWJ1ZiA9IHJxLT50b19jbGVhbjsKIApAQCAtMTk5LDkgKzIwNCwxNCBAQAogCiAJLyogVXNlIGN1cnJlbnQgZmV0Y2hfaW5kZXggYXMgdGhlIHJpbmcgc3RhcnRpbmcgcG9pbnQgKi8KIAlmZXRjaF9pbmRleCA9IGlvcmVhZDMyKCZycS0+Y3RybC0+ZmV0Y2hfaW5kZXgpOworCisJaWYgKGZldGNoX2luZGV4ID09IDB4RkZGRkZGRkYpIHsgLyogY2hlY2sgZm9yIGhhcmR3YXJlIGdvbmUgICovCisJCS8qIEhhcmR3YXJlIHN1cnByaXNlIHJlbW92YWw6IHJlc2V0IGZldGNoX2luZGV4ICovCisJCWZldGNoX2luZGV4ID0gMDsKKwl9CiAJcnEtPnRvX3VzZSA9IHJxLT50b19jbGVhbiA9Ci0JCSZycS0+YnVmc1tmZXRjaF9pbmRleCAvIFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTXQotCQkJW2ZldGNoX2luZGV4ICUgVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVNdOworCQkmcnEtPmJ1ZnNbZmV0Y2hfaW5kZXggLyBWTklDX1JRX0JVRl9CTEtfRU5UUklFUyhjb3VudCldCisJCQlbZmV0Y2hfaW5kZXggJSBWTklDX1JRX0JVRl9CTEtfRU5UUklFUyhjb3VudCldOwogCWlvd3JpdGUzMihmZXRjaF9pbmRleCwgJnJxLT5jdHJsLT5wb3N0ZWRfaW5kZXgpOwogCiAJdm5pY19kZXZfY2xlYXJfZGVzY19yaW5nKCZycS0+cmluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcnEuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19ycS5oCmluZGV4IDM1ZTczNmMuLjJkYzQ4ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19ycS5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19ycS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4LCAyMDA5IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC01MiwxMiArNTIsMTYgQEAKIAl1MzIgcGFkMTA7CiB9OwogCi0vKiBCcmVhayB0aGUgdm5pY19ycV9idWYgYWxsb2NhdGlvbnMgaW50byBibG9ja3Mgb2YgNjQgZW50cmllcyAqLwotI2RlZmluZSBWTklDX1JRX0JVRl9CTEtfRU5UUklFUyA2NAotI2RlZmluZSBWTklDX1JRX0JVRl9CTEtfU1ogXAotCShWTklDX1JRX0JVRl9CTEtfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3Qgdm5pY19ycV9idWYpKQorLyogQnJlYWsgdGhlIHZuaWNfcnFfYnVmIGFsbG9jYXRpb25zIGludG8gYmxvY2tzIG9mIDMyLzY0IGVudHJpZXMgKi8KKyNkZWZpbmUgVk5JQ19SUV9CVUZfTUlOX0JMS19FTlRSSUVTIDMyCisjZGVmaW5lIFZOSUNfUlFfQlVGX0RGTFRfQkxLX0VOVFJJRVMgNjQKKyNkZWZpbmUgVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMoZW50cmllcykgXAorCSgodW5zaWduZWQgaW50KSgoZW50cmllcyA8IFZOSUNfUlFfQlVGX0RGTFRfQkxLX0VOVFJJRVMpID8gXAorCVZOSUNfUlFfQlVGX01JTl9CTEtfRU5UUklFUyA6IFZOSUNfUlFfQlVGX0RGTFRfQkxLX0VOVFJJRVMpKQorI2RlZmluZSBWTklDX1JRX0JVRl9CTEtfU1ooZW50cmllcykgXAorCShWTklDX1JRX0JVRl9CTEtfRU5UUklFUyhlbnRyaWVzKSAqIHNpemVvZihzdHJ1Y3Qgdm5pY19ycV9idWYpKQogI2RlZmluZSBWTklDX1JRX0JVRl9CTEtTX05FRURFRChlbnRyaWVzKSBcCi0JRElWX1JPVU5EX1VQKGVudHJpZXMsIFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTKQorCURJVl9ST1VORF9VUChlbnRyaWVzLCBWTklDX1JRX0JVRl9CTEtfRU5UUklFUyhlbnRyaWVzKSkKICNkZWZpbmUgVk5JQ19SUV9CVUZfQkxLU19NQVggVk5JQ19SUV9CVUZfQkxLU19ORUVERUQoNDA5NikKIAogc3RydWN0IHZuaWNfcnFfYnVmIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19yc3MuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19yc3MuaAppbmRleCA1ZmJiM2M5Li5mNjJkMTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcnNzLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3Jzcy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfc3RhdHMuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19zdGF0cy5oCmluZGV4IDlmZjk2MTQuLjc3NzUwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19zdGF0cy5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19zdGF0cy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfdmljLmMgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfdmljLmMKaW5kZXggZDc2OTc3Mi4uMTk3YzlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3ZpYy5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY192aWMuYwpAQCAtMjUsOSArMjUsMTMgQEAKIAogc3RydWN0IHZpY19wcm92aW5mbyAqdmljX3Byb3ZpbmZvX2FsbG9jKGdmcF90IGZsYWdzLCB1OCAqb3VpLCB1OCB0eXBlKQogewotCXN0cnVjdCB2aWNfcHJvdmluZm8gKnZwID0ga3phbGxvYyhWSUNfUFJPVklORk9fTUFYX0RBVEEsIGZsYWdzKTsKKwlzdHJ1Y3QgdmljX3Byb3ZpbmZvICp2cDsKIAotCWlmICghdnAgfHwgIW91aSkKKwlpZiAoIW91aSkKKwkJcmV0dXJuIE5VTEw7CisKKwl2cCA9IGt6YWxsb2MoVklDX1BST1ZJTkZPX01BWF9EQVRBLCBmbGFncyk7CisJaWYgKCF2cCkKIAkJcmV0dXJuIE5VTEw7CiAKIAltZW1jcHkodnAtPm91aSwgb3VpLCBzaXplb2YodnAtPm91aSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3ZpYy5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3ZpYy5oCmluZGV4IDA4NWMyYTI3Li43ZTQ2ZTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfdmljLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3ZpYy5oCkBAIC00NCw3ICs0NCw3IEBACiAJCXUxNiBsZW5ndGg7CiAJCXU4IHZhbHVlWzBdOwogCX0gdGx2WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFZJQ19QUk9WSU5GT19NQVhfREFUQQkJMTM4NQogI2RlZmluZSBWSUNfUFJPVklORk9fTUFYX1RMVl9EQVRBIChWSUNfUFJPVklORk9fTUFYX0RBVEEgLSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfd3EuYyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY193cS5jCmluZGV4IDEzNzhhZmIuLjEyMmUzM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY193cS5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY193cS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0zNywyMyArMzcsMjMgQEAKIAl2ZGV2ID0gd3EtPnZkZXY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYmxrczsgaSsrKSB7Ci0JCXdxLT5idWZzW2ldID0ga3phbGxvYyhWTklDX1dRX0JVRl9CTEtfU1osIEdGUF9BVE9NSUMpOworCQl3cS0+YnVmc1tpXSA9IGt6YWxsb2MoVk5JQ19XUV9CVUZfQkxLX1NaKGNvdW50KSwgR0ZQX0FUT01JQyk7CiAJCWlmICghd3EtPmJ1ZnNbaV0pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jIHdxX2J1ZnNcbiIpOworCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2Mgd3FfYnVmc1xuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBibGtzOyBpKyspIHsKIAkJYnVmID0gd3EtPmJ1ZnNbaV07Ci0JCWZvciAoaiA9IDA7IGogPCBWTklDX1dRX0JVRl9CTEtfRU5UUklFUzsgaisrKSB7Ci0JCQlidWYtPmluZGV4ID0gaSAqIFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTICsgajsKKwkJZm9yIChqID0gMDsgaiA8IFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTKGNvdW50KTsgaisrKSB7CisJCQlidWYtPmluZGV4ID0gaSAqIFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTKGNvdW50KSArIGo7CiAJCQlidWYtPmRlc2MgPSAodTggKil3cS0+cmluZy5kZXNjcyArCiAJCQkJd3EtPnJpbmcuZGVzY19zaXplICogYnVmLT5pbmRleDsKIAkJCWlmIChidWYtPmluZGV4ICsgMSA9PSBjb3VudCkgewogCQkJCWJ1Zi0+bmV4dCA9IHdxLT5idWZzWzBdOwogCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChqICsgMSA9PSBWTklDX1dRX0JVRl9CTEtfRU5UUklFUykgeworCQkJfSBlbHNlIGlmIChqICsgMSA9PSBWTklDX1dRX0JVRl9CTEtfRU5UUklFUyhjb3VudCkpIHsKIAkJCQlidWYtPm5leHQgPSB3cS0+YnVmc1tpICsgMV07CiAJCQl9IGVsc2UgewogCQkJCWJ1Zi0+bmV4dCA9IGJ1ZiArIDE7CkBAIC05NCw3ICs5NCw3IEBACiAKIAl3cS0+Y3RybCA9IHZuaWNfZGV2X2dldF9yZXModmRldiwgUkVTX1RZUEVfV1EsIGluZGV4KTsKIAlpZiAoIXdxLT5jdHJsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGhvb2sgV1FbJWRdIHJlc291cmNlXG4iLCBpbmRleCk7CisJCXByX2VycigiRmFpbGVkIHRvIGhvb2sgV1FbJWRdIHJlc291cmNlXG4iLCBpbmRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTE5LDEwICsxMTksMTEgQEAKIAl1bnNpZ25lZCBpbnQgZXJyb3JfaW50ZXJydXB0X29mZnNldCkKIHsKIAl1NjQgcGFkZHI7CisJdW5zaWduZWQgaW50IGNvdW50ID0gd3EtPnJpbmcuZGVzY19jb3VudDsKIAogCXBhZGRyID0gKHU2NCl3cS0+cmluZy5iYXNlX2FkZHIgfCBWTklDX1BBRERSX1RBUkdFVDsKIAl3cml0ZXEocGFkZHIsICZ3cS0+Y3RybC0+cmluZ19iYXNlKTsKLQlpb3dyaXRlMzIod3EtPnJpbmcuZGVzY19jb3VudCwgJndxLT5jdHJsLT5yaW5nX3NpemUpOworCWlvd3JpdGUzMihjb3VudCwgJndxLT5jdHJsLT5yaW5nX3NpemUpOwogCWlvd3JpdGUzMihmZXRjaF9pbmRleCwgJndxLT5jdHJsLT5mZXRjaF9pbmRleCk7CiAJaW93cml0ZTMyKHBvc3RlZF9pbmRleCwgJndxLT5jdHJsLT5wb3N0ZWRfaW5kZXgpOwogCWlvd3JpdGUzMihjcV9pbmRleCwgJndxLT5jdHJsLT5jcV9pbmRleCk7CkBAIC0xMzEsOCArMTMyLDggQEAKIAlpb3dyaXRlMzIoMCwgJndxLT5jdHJsLT5lcnJvcl9zdGF0dXMpOwogCiAJd3EtPnRvX3VzZSA9IHdxLT50b19jbGVhbiA9Ci0JCSZ3cS0+YnVmc1tmZXRjaF9pbmRleCAvIFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTXQotCQkJW2ZldGNoX2luZGV4ICUgVk5JQ19XUV9CVUZfQkxLX0VOVFJJRVNdOworCQkmd3EtPmJ1ZnNbZmV0Y2hfaW5kZXggLyBWTklDX1dRX0JVRl9CTEtfRU5UUklFUyhjb3VudCldCisJCQlbZmV0Y2hfaW5kZXggJSBWTklDX1dRX0JVRl9CTEtfRU5UUklFUyhjb3VudCldOwogfQogCiB2b2lkIHZuaWNfd3FfaW5pdChzdHJ1Y3Qgdm5pY193cSAqd3EsIHVuc2lnbmVkIGludCBjcV9pbmRleCwKQEAgLTE2Nyw3ICsxNjgsNyBAQAogCQl1ZGVsYXkoMTApOwogCX0KIAotCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGRpc2FibGUgV1FbJWRdXG4iLCB3cS0+aW5kZXgpOworCXByX2VycigiRmFpbGVkIHRvIGRpc2FibGUgV1FbJWRdXG4iLCB3cS0+aW5kZXgpOwogCiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CkBAIC0xNzcsOCArMTc4LDYgQEAKIHsKIAlzdHJ1Y3Qgdm5pY193cV9idWYgKmJ1ZjsKIAotCUJVR19PTihpb3JlYWQzMigmd3EtPmN0cmwtPmVuYWJsZSkpOwotCiAJYnVmID0gd3EtPnRvX2NsZWFuOwogCiAJd2hpbGUgKHZuaWNfd3FfZGVzY191c2VkKHdxKSA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY193cS5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3dxLmgKaW5kZXggOWMzNGQ0MS4uOTRhYzQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3dxLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3dxLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTYwLDEyICs2MCwxNiBAQAogCXZvaWQgKmRlc2M7CiB9OwogCi0vKiBCcmVhayB0aGUgdm5pY193cV9idWYgYWxsb2NhdGlvbnMgaW50byBibG9ja3Mgb2YgNjQgZW50cmllcyAqLwotI2RlZmluZSBWTklDX1dRX0JVRl9CTEtfRU5UUklFUyA2NAotI2RlZmluZSBWTklDX1dRX0JVRl9CTEtfU1ogXAotCShWTklDX1dRX0JVRl9CTEtfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3Qgdm5pY193cV9idWYpKQorLyogQnJlYWsgdGhlIHZuaWNfd3FfYnVmIGFsbG9jYXRpb25zIGludG8gYmxvY2tzIG9mIDMyLzY0IGVudHJpZXMgKi8KKyNkZWZpbmUgVk5JQ19XUV9CVUZfTUlOX0JMS19FTlRSSUVTIDMyCisjZGVmaW5lIFZOSUNfV1FfQlVGX0RGTFRfQkxLX0VOVFJJRVMgNjQKKyNkZWZpbmUgVk5JQ19XUV9CVUZfQkxLX0VOVFJJRVMoZW50cmllcykgXAorCSgodW5zaWduZWQgaW50KSgoZW50cmllcyA8IFZOSUNfV1FfQlVGX0RGTFRfQkxLX0VOVFJJRVMpID8gXAorCVZOSUNfV1FfQlVGX01JTl9CTEtfRU5UUklFUyA6IFZOSUNfV1FfQlVGX0RGTFRfQkxLX0VOVFJJRVMpKQorI2RlZmluZSBWTklDX1dRX0JVRl9CTEtfU1ooZW50cmllcykgXAorCShWTklDX1dRX0JVRl9CTEtfRU5UUklFUyhlbnRyaWVzKSAqIHNpemVvZihzdHJ1Y3Qgdm5pY193cV9idWYpKQogI2RlZmluZSBWTklDX1dRX0JVRl9CTEtTX05FRURFRChlbnRyaWVzKSBcCi0JRElWX1JPVU5EX1VQKGVudHJpZXMsIFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTKQorCURJVl9ST1VORF9VUChlbnRyaWVzLCBWTklDX1dRX0JVRl9CTEtfRU5UUklFUyhlbnRyaWVzKSkKICNkZWZpbmUgVk5JQ19XUV9CVUZfQkxLU19NQVggVk5JQ19XUV9CVUZfQkxLU19ORUVERUQoNDA5NikKIAogc3RydWN0IHZuaWNfd3EgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy93cV9lbmV0X2Rlc2MuaCBiL2RyaXZlcnMvbmV0L2VuaWMvd3FfZW5ldF9kZXNjLmgKaW5kZXggNDgzNTk2Yy4uYzcwMjFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy93cV9lbmV0X2Rlc2MuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL3dxX2VuZXRfZGVzYy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lcGljMTAwLmMgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKaW5kZXggNGMyNzQ2NS4uNTdjOGFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpAQCAtMjc4LDcgKzI3OCw2IEBACiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CQkJLyogUENJIGJ1cyBsb2NhdGlvbi4gKi8KIAlpbnQgY2hpcF9pZCwgY2hpcF9mbGFnczsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJCS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KIAlpbnQgdHhfdGhyZXNob2xkOwogCXVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOwpAQCAtNzcwLDcgKzc2OSw2IEBACiBzdGF0aWMgdm9pZCBlcGljX3BhdXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IG5ldGRldl9wcml2KGRldik7CiAKIAluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOwogCkBAIC03ODEsOSArNzc5LDkgQEAKIAogCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLwogCWlmIChpbncoaW9hZGRyICsgQ09NTUFORCkgIT0gMHhmZmZmKSB7Ci0JCWVwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGluYihpb2FkZHIgKyBNUENOVCk7Ci0JCWVwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iKGlvYWRkciArIEFMSUNOVCk7Ci0JCWVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGluYihpb2FkZHIgKyBDUkNDTlQpOworCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5iKGlvYWRkciArIE1QQ05UKTsKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iKGlvYWRkciArIEFMSUNOVCk7CisJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQ1JDQ05UKTsKIAl9CiAKIAkvKiBSZW1vdmUgdGhlIHBhY2tldHMgb24gdGhlIFJ4IHF1ZXVlLiAqLwpAQCAtOTAwLDcgKzg5OCw3IEBACiAJCX0KIAl9CiAJaWYgKGludyhpb2FkZHIgKyBUeFNUQVQpICYgMHgxMCkgewkJLyogVHggRklGTyB1bmRlcmZsb3cuICovCi0JCWVwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCW91dGwoUmVzdGFydFR4LCBpb2FkZHIgKyBDT01NQU5EKTsKIAl9IGVsc2UgewogCQllcGljX3Jlc3RhcnQoZGV2KTsKQEAgLTkwOCw3ICs5MDYsNyBAQAogCX0KIAogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBwcmV2ZW50IHR4IHRpbWVvdXQgKi8KLQllcC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAlpZiAoIWVwLT50eF9mdWxsKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CkBAIC0xMDE2LDcgKzEwMTQsNyBAQAogc3RhdGljIHZvaWQgZXBpY190eF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXBpY19wcml2YXRlICplcCwKIAkJCSAgaW50IHN0YXR1cykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZXAtPnN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOwogCiAjaWZuZGVmIGZpbmFsX3ZlcnNpb24KIAkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KQEAgLTEwNTMsOSArMTA1MSw5IEBACiAJCQlicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLwogCiAJCWlmIChsaWtlbHkodHhzdGF0dXMgJiAweDAwMDEpKSB7Ci0JCQllcC0+c3RhdHMuY29sbGlzaW9ucyArPSAodHhzdGF0dXMgPj4gOCkgJiAxNTsKLQkJCWVwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQllcC0+c3RhdHMudHhfYnl0ZXMgKz0gZXAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAodHhzdGF0dXMgPj4gOCkgJiAxNTsKKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBlcC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOwogCQl9IGVsc2UKIAkJCWVwaWNfdHhfZXJyb3IoZGV2LCBlcCwgdHhzdGF0dXMpOwogCkBAIC0xMTI1LDEyICsxMTIzLDEyIEBACiAJCQlnb3RvIG91dDsKIAogCQkvKiBBbHdheXMgdXBkYXRlIHRoZSBlcnJvciBjb3VudHMgdG8gYXZvaWQgb3ZlcmhlYWQgbGF0ZXIuICovCi0JCWVwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGluYihpb2FkZHIgKyBNUENOVCk7Ci0JCWVwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iKGlvYWRkciArIEFMSUNOVCk7Ci0JCWVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGluYihpb2FkZHIgKyBDUkNDTlQpOworCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5iKGlvYWRkciArIE1QQ05UKTsKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iKGlvYWRkciArIEFMSUNOVCk7CisJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQ1JDQ05UKTsKIAogCQlpZiAoc3RhdHVzICYgVHhVbmRlcnJ1bikgeyAvKiBUeCBGSUZPIHVuZGVyZmxvdy4gKi8KLQkJCWVwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQkJb3V0bChlcC0+dHhfdGhyZXNob2xkICs9IDEyOCwgaW9hZGRyICsgVHhUaHJlc2gpOwogCQkJLyogUmVzdGFydCB0aGUgdHJhbnNtaXQgcHJvY2Vzcy4gKi8KIAkJCW91dGwoUmVzdGFydFR4LCBpb2FkZHIgKyBDT01NQU5EKTsKQEAgLTExODMsMTAgKzExODEsMTAgQEAKIAkJCWlmIChzdGF0dXMgJiAweDIwMDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lIHNwYW5uZWQgIgogCQkJCQkgICAibXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU0LjR4IVxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOwotCQkJCWVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MDAwNikKIAkJCQkvKiBSeCBGcmFtZSBlcnJvcnMgYXJlIGNvdW50ZWQgaW4gaGFyZHdhcmUuICovCi0JCQkJZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCX0gZWxzZSB7CiAJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0yZS4gKi8KIAkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KQEAgLTEyMjMsOCArMTIyMSw4IEBACiAJCQl9CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQkJCWVwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQllcC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwogCQl9CiAJCXdvcmtfZG9uZSsrOwogCQllbnRyeSA9ICgrK2VwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOwpAQCAtMTI1OSw3ICsxMjU3LDcgQEAKIAlpZiAoc3RhdHVzID09IEVwaWNSZW1vdmVkKQogCQlyZXR1cm47CiAJaWYgKHN0YXR1cyAmIFJ4T3ZlcmZsb3cpIAkvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KLQkJZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCWlmIChzdGF0dXMgJiAoUnhPdmVyZmxvdyB8IFJ4RnVsbCkpCiAJCW91dHcoUnhRdWV1ZWQsIGlvYWRkciArIENPTU1BTkQpOwogfQpAQCAtMTM1NywxNyArMTM1NSwxNiBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVwaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLwotCQllcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgTVBDTlQpOwotCQllcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGluYihpb2FkZHIgKyBBTElDTlQpOwotCQllcC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQ1JDQ05UKTsKKwkJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGluYihpb2FkZHIgKyBNUENOVCk7CisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGluYihpb2FkZHIgKyBBTElDTlQpOworCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW5iKGlvYWRkciArIENSQ0NOVCk7CiAJfQogCi0JcmV0dXJuICZlcC0+c3RhdHM7CisJcmV0dXJuICZkZXYtPnN0YXRzOwogfQogCiAvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aDE2aS5jIGIvZHJpdmVycy9uZXQvZXRoMTZpLmMKaW5kZXggODc0OTczZi4uMTBlMzlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoMTZpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoMTZpLmMKQEAgLTE0NDIsOCArMTQ0MiwxMCBAQAogCQlkZXYtPmlmX3BvcnQgPSBldGgxNmlfcGFyc2VfbWVkaWF0eXBlKG1lZGlhdHlwZVt0aGlzX2Rldl0pOwogCiAJCWlmKGlvW3RoaXNfZGV2XSA9PSAwKSB7Ci0JCQlpZih0aGlzX2RldiAhPSAwKSAvKiBPbmx5IGF1dG9wcm9iZSAxc3Qgb25lICovCisJCQlpZiAodGhpc19kZXYgIT0gMCkgeyAvKiBPbmx5IGF1dG9wcm9iZSAxc3Qgb25lICovCisJCQkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJCQlicmVhazsKKwkJCX0KIAogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJldGgxNmkuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aG9jLmMgYi9kcml2ZXJzL25ldC9ldGhvYy5jCmluZGV4IDZlZDJkZjEuLjZkNjUzYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRob2MuYwpAQCAtMTgwLDkgKzE4MCw5IEBACiAgKiBAZHR5X3R4OglsYXN0IGJ1ZmZlciBhY3R1YWxseSBzZW50CiAgKiBAbnVtX3J4OgludW1iZXIgb2YgcmVjZWl2ZSBidWZmZXJzCiAgKiBAY3VyX3J4OgljdXJyZW50IHJlY2VpdmUgYnVmZmVyCisgKiBAdm1hOiAgICAgICAgcG9pbnRlciB0byBhcnJheSBvZiB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgZm9yIGJ1ZmZlcnMKICAqIEBuZXRkZXY6CXBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAbmFwaToJTkFQSSBzdHJ1Y3R1cmUKLSAqIEBzdGF0czoJbmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcwogICogQG1zZ19lbmFibGU6CWRldmljZSBzdGF0ZSBmbGFncwogICogQHJ4X2xvY2s6CXJlY2VpdmUgbG9jawogICogQGxvY2s6CWRldmljZSBsb2NrCkBAIC0yMDMsOSArMjAzLDEwIEBACiAJdW5zaWduZWQgaW50IG51bV9yeDsKIAl1bnNpZ25lZCBpbnQgY3VyX3J4OwogCisJdm9pZCoqIHZtYTsKKwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJdTMyIG1zZ19lbmFibGU7CiAKIAlzcGlubG9ja190IHJ4X2xvY2s7CkBAIC0yODUsMTggKzI4NiwyMiBAQAogCWV0aG9jX3dyaXRlKGRldiwgTU9ERVIsIG1vZGUpOwogfQogCi1zdGF0aWMgaW50IGV0aG9jX2luaXRfcmluZyhzdHJ1Y3QgZXRob2MgKmRldikKK3N0YXRpYyBpbnQgZXRob2NfaW5pdF9yaW5nKHN0cnVjdCBldGhvYyAqZGV2LCB1bnNpZ25lZCBsb25nIG1lbV9zdGFydCkKIHsKIAlzdHJ1Y3QgZXRob2NfYmQgYmQ7CiAJaW50IGk7CisJdm9pZCogdm1hOwogCiAJZGV2LT5jdXJfdHggPSAwOwogCWRldi0+ZHR5X3R4ID0gMDsKIAlkZXYtPmN1cl9yeCA9IDA7CiAKKwlldGhvY193cml0ZShkZXYsIFRYX0JEX05VTSwgZGV2LT5udW1fdHgpOworCiAJLyogc2V0dXAgdHJhbnNtaXNzaW9uIGJ1ZmZlcnMgKi8KLQliZC5hZGRyID0gdmlydF90b19waHlzKGRldi0+bWVtYmFzZSk7CisJYmQuYWRkciA9IG1lbV9zdGFydDsKIAliZC5zdGF0ID0gVFhfQkRfSVJRIHwgVFhfQkRfQ1JDOworCXZtYSA9IGRldi0+bWVtYmFzZTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV90eDsgaSsrKSB7CiAJCWlmIChpID09IGRldi0+bnVtX3R4IC0gMSkKQEAgLTMwNCw2ICszMDksOSBAQAogCiAJCWV0aG9jX3dyaXRlX2JkKGRldiwgaSwgJmJkKTsKIAkJYmQuYWRkciArPSBFVEhPQ19CVUZTSVo7CisKKwkJZGV2LT52bWFbaV0gPSB2bWE7CisJCXZtYSArPSBFVEhPQ19CVUZTSVo7CiAJfQogCiAJYmQuc3RhdCA9IFJYX0JEX0VNUFRZIHwgUlhfQkRfSVJROwpAQCAtMzE0LDYgKzMyMiw5IEBACiAKIAkJZXRob2Nfd3JpdGVfYmQoZGV2LCBkZXYtPm51bV90eCArIGksICZiZCk7CiAJCWJkLmFkZHIgKz0gRVRIT0NfQlVGU0laOworCisJCWRldi0+dm1hW2Rldi0+bnVtX3R4ICsgaV0gPSB2bWE7CisJCXZtYSArPSBFVEhPQ19CVUZTSVo7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zNTQsMzkgKzM2NSwzOSBAQAogCiAJaWYgKGJkLT5zdGF0ICYgUlhfQkRfVEwpIHsKIAkJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJSWDogZnJhbWUgdG9vIGxvbmdcbiIpOwotCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCXJldCsrOwogCX0KIAogCWlmIChiZC0+c3RhdCAmIFJYX0JEX1NGKSB7CiAJCWRldl9lcnIoJm5ldGRldi0+ZGV2LCAiUlg6IGZyYW1lIHRvbyBzaG9ydFxuIik7Ci0JCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQluZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJcmV0Kys7CiAJfQogCiAJaWYgKGJkLT5zdGF0ICYgUlhfQkRfRE4pIHsKIAkJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJSWDogZHJpYmJsZSBuaWJibGVcbiIpOwotCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQluZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCX0KIAogCWlmIChiZC0+c3RhdCAmIFJYX0JEX0NSQykgewogCQlkZXZfZXJyKCZuZXRkZXYtPmRldiwgIlJYOiB3cm9uZyBDUkNcbiIpOwotCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCXJldCsrOwogCX0KIAogCWlmIChiZC0+c3RhdCAmIFJYX0JEX09SKSB7CiAJCWRldl9lcnIoJm5ldGRldi0+ZGV2LCAiUlg6IG92ZXJydW5cbiIpOwotCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCW5ldGRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKIAkJcmV0Kys7CiAJfQogCiAJaWYgKGJkLT5zdGF0ICYgUlhfQkRfTUlTUykKLQkJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCW5ldGRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOwogCiAJaWYgKGJkLT5zdGF0ICYgUlhfQkRfTEMpIHsKIAkJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJSWDogbGF0ZSBjb2xsaXNpb25cbiIpOwotCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CiAJCXJldCsrOwogCX0KIApAQCAtNDE1LDE4ICs0MjYsMTggQEAKIAkJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oZGV2LCBzaXplKTsKIAogCQkJaWYgKGxpa2VseShza2IpKSB7Ci0JCQkJdm9pZCAqc3JjID0gcGh5c190b192aXJ0KGJkLmFkZHIpOworCQkJCXZvaWQgKnNyYyA9IHByaXYtPnZtYVtlbnRyeV07CiAJCQkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KHNrYiwgc2l6ZSksIHNyYywgc2l6ZSk7CiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gc2l6ZTsKKwkJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNpemU7CiAJCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAibG93IG9uIG1lbW9yeSAtICIKIAkJCQkJCQkicGFja2V0IGRyb3BwZWRcbiIpOwogCi0JCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC00NDcsMzAgKzQ1OCwzMCBAQAogCiAJaWYgKGJkLT5zdGF0ICYgVFhfQkRfTEMpIHsKIAkJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJUWDogbGF0ZSBjb2xsaXNpb25cbiIpOwotCQlkZXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CiAJfQogCiAJaWYgKGJkLT5zdGF0ICYgVFhfQkRfUkwpIHsKIAkJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJUWDogcmV0cmFuc21pdCBsaW1pdFxuIik7Ci0JCWRldi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOwogCX0KIAogCWlmIChiZC0+c3RhdCAmIFRYX0JEX1VSKSB7CiAJCWRldl9lcnIoJm5ldGRldi0+ZGV2LCAiVFg6IHVuZGVycnVuXG4iKTsKLQkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQluZXRkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJfQogCiAJaWYgKGJkLT5zdGF0ICYgVFhfQkRfQ1MpIHsKIAkJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJUWDogY2FycmllciBzZW5zZSBsb3N0XG4iKTsKLQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQluZXRkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJfQogCiAJaWYgKGJkLT5zdGF0ICYgVFhfQkRfU1RBVFMpCi0JCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAKLQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKGJkLT5zdGF0ID4+IDQpICYgMHhmOwotCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gYmQtPnN0YXQgPj4gMTY7Ci0JZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJbmV0ZGV2LT5zdGF0cy5jb2xsaXNpb25zICs9IChiZC0+c3RhdCA+PiA0KSAmIDB4ZjsKKwluZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGJkLT5zdGF0ID4+IDE2OworCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCXJldHVybiAwOwogfQogCkBAIC01MDEsNyArNTEyLDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGV0aG9jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOwogCXN0cnVjdCBldGhvYyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIHBlbmRpbmc7CiAKQEAgLTUxNiw3ICs1MjcsNyBAQAogCiAJaWYgKHBlbmRpbmcgJiBJTlRfTUFTS19CVVNZKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicGFja2V0IGRyb3BwZWRcbiIpOwotCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCX0KIAogCWlmIChwZW5kaW5nICYgSU5UX01BU0tfUlgpIHsKQEAgLTYwMCw4ICs2MTEsMTEgQEAKIAogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQl1MzIgc3RhdCA9IGV0aG9jX3JlYWQocHJpdiwgTUlJU1RBVFVTKTsKLQkJaWYgKCEoc3RhdCAmIE1JSVNUQVRVU19CVVNZKSkKKwkJaWYgKCEoc3RhdCAmIE1JSVNUQVRVU19CVVNZKSkgeworCQkJLyogcmVzZXQgTUlJIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKwkJCWV0aG9jX3dyaXRlKHByaXYsIE1JSUNPTU1BTkQsIDApOwogCQkJcmV0dXJuIDA7CisJCX0KIAogCQlzY2hlZHVsZSgpOwogCX0KQEAgLTYxOCwyNSArNjMyLDE2IEBACiB7CiB9CiAKLXN0YXRpYyBpbnQgZXRob2NfbWRpb19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgZXRob2NfbWRpb19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGhvYyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeTsKLQlpbnQgaTsKKwlpbnQgZXJyOwogCi0JZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgaSsrKSB7Ci0JCXBoeSA9IHByaXYtPm1kaW8tPnBoeV9tYXBbaV07Ci0JCWlmIChwaHkpIHsKLQkJCWlmIChwcml2LT5waHlfaWQgIT0gLTEpIHsKLQkJCQkvKiBhdHRhY2ggdG8gc3BlY2lmaWVkIFBIWSAqLwotCQkJCWlmIChwcml2LT5waHlfaWQgPT0gcGh5LT5hZGRyKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogYXV0b3NlbGVjdCBQSFkgaWYgbm9uZSB3YXMgc3BlY2lmaWVkICovCi0JCQkJaWYgKHBoeS0+YWRkciAhPSAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQorCWlmIChwcml2LT5waHlfaWQgIT0gLTEpIHsKKwkJcGh5ID0gcHJpdi0+bWRpby0+cGh5X21hcFtwcml2LT5waHlfaWRdOworCX0gZWxzZSB7CisJCXBoeSA9IHBoeV9maW5kX2ZpcnN0KHByaXYtPm1kaW8pOwogCX0KIAogCWlmICghcGh5KSB7CkBAIC02NDQsMTEgKzY0OSwxMSBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXBoeSA9IHBoeV9jb25uZWN0KGRldiwgZGV2X25hbWUoJnBoeS0+ZGV2KSwgZXRob2NfbWRpb19wb2xsLCAwLAorCWVyciA9IHBoeV9jb25uZWN0X2RpcmVjdChkZXYsIHBoeSwgZXRob2NfbWRpb19wb2xsLCAwLAogCQkJUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOwotCWlmIChJU19FUlIocGh5KSkgeworCWlmIChlcnIpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJjb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHBoeSk7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcHJpdi0+cGh5ID0gcGh5OwpAQCAtNjU4LDggKzY2Myw2IEBACiBzdGF0aWMgaW50IGV0aG9jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRob2MgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGludCBtaW5fdHggPSAyOwotCXVuc2lnbmVkIGludCBudW1fYmQ7CiAJaW50IHJldDsKIAogCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBldGhvY19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELApAQCAtNjY3LDE0ICs2NzAsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBUWC9SWCBidWZmZXJzLCBtYXhpbXVtIDEyOCBzdXBwb3J0ZWQgKi8KLQludW1fYmQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCTEyOCwgKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSkgLyBFVEhPQ19CVUZTSVopOwotCXByaXYtPm51bV90eCA9IG1heChtaW5fdHgsIG51bV9iZCAvIDQpOwotCXByaXYtPm51bV9yeCA9IG51bV9iZCAtIHByaXYtPm51bV90eDsKLQlldGhvY193cml0ZShwcml2LCBUWF9CRF9OVU0sIHByaXYtPm51bV90eCk7Ci0KLQlldGhvY19pbml0X3JpbmcocHJpdik7CisJZXRob2NfaW5pdF9yaW5nKHByaXYsIGRldi0+bWVtX3N0YXJ0KTsKIAlldGhvY19yZXNldChwcml2KTsKIAogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKQEAgLTczNCw3ICs3MzAsNyBAQAogCQlwaHkgPSBwcml2LT5waHk7CiAJfQogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5LCBtZGlvLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeSwgaWZyLCBjbWQpOwogfQogCiBzdGF0aWMgaW50IGV0aG9jX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKQEAgLTgxMiw4ICs4MDgsNyBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0aG9jX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGV0aG9jICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJnByaXYtPnN0YXRzOworCXJldHVybiAmZGV2LT5zdGF0czsKIH0KIAogc3RhdGljIG5ldGRldl90eF90IGV0aG9jX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTgyNCw3ICs4MTksNyBAQAogCXZvaWQgKmRlc3Q7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBFVEhPQ19CVUZTSVopKSB7Ci0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTgzOCw3ICs4MzMsNyBAQAogCWVsc2UKIAkJYmQuc3RhdCAmPSB+VFhfQkRfUEFEOwogCi0JZGVzdCA9IHBoeXNfdG9fdmlydChiZC5hZGRyKTsKKwlkZXN0ID0gcHJpdi0+dm1hW2VudHJ5XTsKIAltZW1jcHlfdG9pbyhkZXN0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCWJkLnN0YXQgJj0gfihUWF9CRF9TVEFUUyB8IFRYX0JEX0xFTl9NQVNLKTsKQEAgLTg3Niw3ICs4NzEsNyBAQAogICogZXRob2NfcHJvYmUoKSAtIGluaXRpYWxpemUgT3BlbkNvcmVzIGV0aGVybmV0IE1BQwogICogcGRldjoJcGxhdGZvcm0gZGV2aWNlCiAgKi8KLXN0YXRpYyBpbnQgZXRob2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGV0aG9jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IE5VTEw7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOwpAQCAtODg0LDYgKzg3OSw3IEBACiAJc3RydWN0IHJlc291cmNlICptZW0gPSBOVUxMOwogCXN0cnVjdCBldGhvYyAqcHJpdiA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHBoeTsKKwlpbnQgbnVtX2JkOwogCWludCByZXQgPSAwOwogCiAJLyogYWxsb2NhdGUgbmV0d29ya2luZyBkZXZpY2UgKi8KQEAgLTk2NSw3ICs5NjEsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJLyogQWxsb2NhdGUgYnVmZmVyIG1lbW9yeSAqLwotCQlwcml2LT5tZW1iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsCisJCXByaXYtPm1lbWJhc2UgPSBkbWFtX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsCiAJCQlidWZmZXJfc2l6ZSwgKHZvaWQgKikmbmV0ZGV2LT5tZW1fc3RhcnQsCiAJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKCFwcml2LT5tZW1iYXNlKSB7CkBAIC05NzgsNiArOTc0LDE4IEBACiAJCXByaXYtPmRtYV9hbGxvYyA9IGJ1ZmZlcl9zaXplOwogCX0KIAorCS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIFRYL1JYIGJ1ZmZlcnMsIG1heGltdW0gMTI4IHN1cHBvcnRlZCAqLworCW51bV9iZCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJMTI4LCAobmV0ZGV2LT5tZW1fZW5kIC0gbmV0ZGV2LT5tZW1fc3RhcnQgKyAxKSAvIEVUSE9DX0JVRlNJWik7CisJcHJpdi0+bnVtX3R4ID0gbWF4KDIsIG51bV9iZCAvIDQpOworCXByaXYtPm51bV9yeCA9IG51bV9iZCAtIHByaXYtPm51bV90eDsKKworCXByaXYtPnZtYSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBudW1fYmQqc2l6ZW9mKHZvaWQqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT52bWEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKIAkvKiBBbGxvdyB0aGUgcGxhdGZvcm0gc2V0dXAgY29kZSB0byBwYXNzIGluIGEgTUFDIGFkZHJlc3MuICovCiAJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CiAJCXN0cnVjdCBldGhvY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CkBAIC0xMDYzLDIxICsxMDcxLDYgQEAKIAlrZnJlZShwcml2LT5tZGlvLT5pcnEpOwogCW1kaW9idXNfZnJlZShwcml2LT5tZGlvKTsKIGZyZWU6Ci0JaWYgKHByaXYpIHsKLQkJaWYgKHByaXYtPmRtYV9hbGxvYykKLQkJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHByaXYtPmRtYV9hbGxvYywgcHJpdi0+bWVtYmFzZSwKLQkJCQkJICBuZXRkZXYtPm1lbV9zdGFydCk7Ci0JCWVsc2UgaWYgKHByaXYtPm1lbWJhc2UpCi0JCQlkZXZtX2lvdW5tYXAoJnBkZXYtPmRldiwgcHJpdi0+bWVtYmFzZSk7Ci0JCWlmIChwcml2LT5pb2Jhc2UpCi0JCQlkZXZtX2lvdW5tYXAoJnBkZXYtPmRldiwgcHJpdi0+aW9iYXNlKTsKLQl9Ci0JaWYgKG1lbSkKLQkJZGV2bV9yZWxlYXNlX21lbV9yZWdpb24oJnBkZXYtPmRldiwgbWVtLT5zdGFydCwKLQkJCQkJbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7Ci0JaWYgKG1taW8pCi0JCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIG1taW8tPnN0YXJ0LAotCQkJCQltbWlvLT5lbmQgLSBtbWlvLT5zdGFydCArIDEpOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTEwODcsNyArMTA4MCw3IEBACiAgKiBldGhvY19yZW1vdmUoKSAtIHNodXRkb3duIE9wZW5Db3JlcyBldGhlcm5ldCBNQUMKICAqIEBwZGV2OglwbGF0Zm9ybSBkZXZpY2UKICAqLwotc3RhdGljIGludCBldGhvY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGV0aG9jX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZXRob2MgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMTEwNCwxNyArMTA5Nyw2IEBACiAJCQlrZnJlZShwcml2LT5tZGlvLT5pcnEpOwogCQkJbWRpb2J1c19mcmVlKHByaXYtPm1kaW8pOwogCQl9Ci0JCWlmIChwcml2LT5kbWFfYWxsb2MpCi0JCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBwcml2LT5kbWFfYWxsb2MsIHByaXYtPm1lbWJhc2UsCi0JCQkJbmV0ZGV2LT5tZW1fc3RhcnQpOwotCQllbHNlIHsKLQkJCWRldm1faW91bm1hcCgmcGRldi0+ZGV2LCBwcml2LT5tZW1iYXNlKTsKLQkJCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIG5ldGRldi0+bWVtX3N0YXJ0LAotCQkJCW5ldGRldi0+bWVtX2VuZCAtIG5ldGRldi0+bWVtX3N0YXJ0ICsgMSk7Ci0JCX0KLQkJZGV2bV9pb3VubWFwKCZwZGV2LT5kZXYsIHByaXYtPmlvYmFzZSk7Ci0JCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIG5ldGRldi0+YmFzZV9hZGRyLAotCQkJcHJpdi0+aW9fcmVnaW9uX3NpemUpOwogCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCQlmcmVlX25ldGRldihuZXRkZXYpOwogCX0KQEAgLTExMzksNyArMTEyMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV0aG9jX2RyaXZlciA9IHsKIAkucHJvYmUgICA9IGV0aG9jX3Byb2JlLAotCS5yZW1vdmUgID0gZXRob2NfcmVtb3ZlLAorCS5yZW1vdmUgID0gX19kZXZleGl0X3AoZXRob2NfcmVtb3ZlKSwKIAkuc3VzcGVuZCA9IGV0aG9jX3N1c3BlbmQsCiAJLnJlc3VtZSAgPSBldGhvY19yZXN1bWUsCiAJLmRyaXZlciAgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWFsbnguYyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCmluZGV4IDE1ZjRmOGQuLmQ3ZThmNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC0zODIsOCArMzgyLDYgQEAKIAogCXNwaW5sb2NrX3QgbG9jazsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCiAJLyogTWVkaWEgbW9uaXRvcmluZyB0aW1lci4gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIApAQCAtMTIzNCw3ICsxMjMyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOwogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7IC8qIHByZXZlbnQgdHggdGltZW91dCAqLwotCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsgLyogb3IgLi5fc3RhcnRfLi4gPz8gKi8KIH0KIApAQCAtMTQ3OSwxMCArMTQ3NywxMSBAQAogCiAJCWlmIChpbnRyX3N0YXR1cyAmIENOVE9WRikgewogCQkJLyogbWlzc2VkIHBrdHMgKi8KLQkJCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjsKKwkJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPQorCQkJCWlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjsKIAogCQkJLyogY3JjIGVycm9yICovCi0JCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPQorCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9CiAJCQkgICAgKGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjAwMDApID4+IDE2OwogCQl9CiAKQEAgLTE1MTMsMzAgKzE1MTIsMzAgQEAKIAogCQkJaWYgKCEobnAtPmNydmFsdWUgJiBDUl9XX0VOSCkpIHsKIAkJCQlpZiAodHhfc3RhdHVzICYgKENTTCB8IExDIHwgRUMgfCBVREYgfCBIRikpIHsKLQkJCQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJCQlpZiAodHhfc3RhdHVzICYgRUMpCi0JCQkJCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJCWRldi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKIAkJCQkJaWYgKHR4X3N0YXR1cyAmIENTTCkKLQkJCQkJCW5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwogCQkJCQlpZiAodHhfc3RhdHVzICYgTEMpCi0JCQkJCQlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQkJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CiAJCQkJCWlmICh0eF9zdGF0dXMgJiBVREYpCi0JCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJCQkJaWYgKCh0eF9zdGF0dXMgJiBIRikgJiYgbnAtPm1paS5mdWxsX2R1cGxleCA9PSAwKQotCQkJCQkJbnAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJCQkJCWRldi0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOwogCiAJCQkJfSBlbHNlIHsKLQkJCQkJbnAtPnN0YXRzLnR4X2J5dGVzICs9CisJCQkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0KIAkJCQkJICAgICgodHhfY29udHJvbCAmIFBLVFNNYXNrKSA+PiBQS1RTU2hpZnQpOwogCi0JCQkJCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9CisJCQkJCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPQogCQkJCQkgICAgKCh0eF9zdGF0dXMgJiBOQ1JNYXNrKSA+PiBOQ1JTaGlmdCk7Ci0JCQkJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJbnAtPnN0YXRzLnR4X2J5dGVzICs9CisJCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPQogCQkJCSAgICAoKHR4X2NvbnRyb2wgJiBQS1RTTWFzaykgPj4gUEtUU1NoaWZ0KTsKLQkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJfQogCiAJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCkBAIC0xNTY0LDEwICsxNTYzLDEyIEBACiAJCQlsb25nIGRhdGE7CiAKIAkJCWRhdGEgPSBpb3JlYWQzMihpb2FkZHIgKyBUU1IpOwotCQkJbnAtPnN0YXRzLnR4X2Vycm9ycyArPSAoZGF0YSAmIDB4ZmYwMDAwMDApID4+IDI0OwotCQkJbnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IChkYXRhICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0JCQlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyArPSAoZGF0YSAmIDB4MDBmZjAwMDApID4+IDE2OwotCQkJbnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKGRhdGEgJiAweDAwMDBmZmZmKTsKKwkJCWRldi0+c3RhdHMudHhfZXJyb3JzICs9IChkYXRhICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9CisJCQkJKGRhdGEgJiAweGZmMDAwMDAwKSA+PiAyNDsKKwkJCWRldi0+c3RhdHMudHhfd2luZG93X2Vycm9ycyArPQorCQkJCShkYXRhICYgMHgwMGZmMDAwMCkgPj4gMTY7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKGRhdGEgJiAweDAwMDBmZmZmKTsKIAkJfQogCiAJCWlmICgtLWJvZ3VzY250IDwgMCkgewpAQCAtMTU5MywxMCArMTU5NCwxMSBAQAogCiAJLyogcmVhZCB0aGUgdGFsbHkgY291bnRlcnMgKi8KIAkvKiBtaXNzZWQgcGt0cyAqLwotCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjsKKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmOwogCiAJLyogY3JjIGVycm9yICovCi0JbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gKGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjAwMDApID4+IDE2OworCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyArPQorCQkoaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmMDAwMCkgPj4gMTY7CiAKIAlpZiAoZGVidWcpCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cz0lIzQuNHguXG4iLApAQCAtMTYzNSwxMyArMTYzNywxMyBAQAogCQkJCQkgICAgICAgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAogCQkJCQkgICAgICAgZGV2LT5uYW1lLCByeF9zdGF0dXMpOwogCi0JCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBlbmQgb2YgYSBwYWNrZXQuICovCisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsJLyogZW5kIG9mIGEgcGFja2V0LiAqLwogCQkJCWlmIChyeF9zdGF0dXMgJiAoTE9ORyB8IFJVTlQpKQotCQkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCQlpZiAocnhfc3RhdHVzICYgUlhFUikKLQkJCQkJbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCWlmIChyeF9zdGF0dXMgJiBDUkMpCi0JCQkJCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJfSBlbHNlIHsKIAkJCQlpbnQgbmVlZF90b19yZXNldCA9IDA7CiAJCQkJaW50IGRlc25vID0gMDsKQEAgLTE2NjcsNyArMTY2OSw3IEBACiAJCQkJaWYgKG5lZWRfdG9fcmVzZXQgPT0gMCkgewogCQkJCQlpbnQgaTsKIAotCQkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAogCQkJCQkvKiBmcmVlIGFsbCByeCBkZXNjcmlwdG9ycyByZWxhdGVkIHRoaXMgbG9uZyBwa3QgKi8KIAkJCQkJZm9yIChpID0gMDsgaSA8IGRlc25vOyArK2kpIHsKQEAgLTE3MzMsOCArMTczNSw4IEBACiAJCQl9CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJbmV0aWZfcngoc2tiKTsKLQkJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwogCQl9CiAKIAkJbnAtPmN1cl9yeCA9IG5wLT5jdXJfcngtPm5leHRfZGVzY19sb2dpY2FsOwpAQCAtMTc1NCwxMSArMTc1NiwxMyBAQAogCiAJLyogVGhlIGNoaXAgb25seSBuZWVkIHJlcG9ydCBmcmFtZSBzaWxlbnRseSBkcm9wcGVkLiAqLwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmOwotCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSAoaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmMDAwMCkgPj4gMTY7CisJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPQorCQkJaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmOworCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0KKwkJCShpb3JlYWQzMihpb2FkZHIgKyBUQUxMWSkgJiAweDdmZmYwMDAwKSA+PiAxNjsKIAl9CiAKLQlyZXR1cm4gJm5wLT5zdGF0czsKKwlyZXR1cm4gJmRldi0+c3RhdHM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjLmMgYi9kcml2ZXJzL25ldC9mZWMuYwppbmRleCBlZGZmZjkyLi43NjhiODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWMuYworKysgYi9kcml2ZXJzL25ldC9mZWMuYwpAQCAtMTE4LDYgKzExOCw4IEBACiAjZGVmaW5lIEZFQ19FTkVUX01JSQkoKHVpbnQpMHgwMDgwMDAwMCkJLyogTUlJIGludGVycnVwdCAqLwogI2RlZmluZSBGRUNfRU5FVF9FQkVSUgkoKHVpbnQpMHgwMDQwMDAwMCkJLyogU0RNQSBidXMgZXJyb3IgKi8KIAorI2RlZmluZSBGRUNfREVGQVVMVF9JTUFTSyAoRkVDX0VORVRfVFhGIHwgRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfTUlJKQorCiAvKiBUaGUgRkVDIHN0b3JlcyBkZXN0L3NyYy90eXBlLCBkYXRhLCBhbmQgY2hlY2tzdW0gZm9yIHJlY2VpdmUgcGFja2V0cy4KICAqLwogI2RlZmluZSBQS1RfTUFYQlVGX1NJWkUJCTE1MTgKQEAgLTE4Nyw2ICsxODksNyBAQAogCWludAlpbmRleDsKIAlpbnQJbGluazsKIAlpbnQJZnVsbF9kdXBsZXg7CisJc3RydWN0CWNvbXBsZXRpb24gbWRpb19kb25lOwogfTsKIAogc3RhdGljIGlycXJldHVybl90IGZlY19lbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKQEAgLTIwNSwxMiArMjA4LDEyIEBACiAjZGVmaW5lIEZFQ19NTUZSX1RBCQkoMiA8PCAxNikKICNkZWZpbmUgRkVDX01NRlJfREFUQSh2KQkodiAmIDB4ZmZmZikKIAotI2RlZmluZSBGRUNfTUlJX1RJTUVPVVQJCTEwMDAwCisjZGVmaW5lIEZFQ19NSUlfVElNRU9VVAkJMTAwMCAvKiB1cyAqLwogCiAvKiBUcmFuc21pdHRlciB0aW1lb3V0ICovCiAjZGVmaW5lIFRYX1RJTUVPVVQgKDIgKiBIWikKIAotc3RhdGljIGludAorc3RhdGljIG5ldGRldl90eF90CiBmZWNfZW5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0zMzQsNiArMzM3LDExIEBACiAJCQlyZXQgPSBJUlFfSEFORExFRDsKIAkJCWZlY19lbmV0X3R4KGRldik7CiAJCX0KKworCQlpZiAoaW50X2V2ZW50cyAmIEZFQ19FTkVUX01JSSkgeworCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCQljb21wbGV0ZSgmZmVwLT5tZGlvX2RvbmUpOworCQl9CiAJfSB3aGlsZSAoaW50X2V2ZW50cyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjA4LDE4ICs2MTYsMTMgQEAKIAkJcGh5X3ByaW50X3N0YXR1cyhwaHlfZGV2KTsKIH0KIAotLyoKLSAqIE5PVEU6IGEgTUlJIHRyYW5zYWN0aW9uIGlzIGR1cmluZyBhcm91bmQgMjUgdXMsIHNvIHBvbGxpbmcgaXQuLi4KLSAqLwogc3RhdGljIGludCBmZWNfZW5ldF9tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IG1paV9pZCwgaW50IHJlZ251bSkKIHsKIAlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gYnVzLT5wcml2OwotCWludCB0aW1lb3V0ID0gRkVDX01JSV9USU1FT1VUOworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCiAJZmVwLT5taWlfdGltZW91dCA9IDA7Ci0KLQkvKiBjbGVhciBNSUkgZW5kIG9mIHRyYW5zZmVyIGJpdCovCi0Jd3JpdGVsKEZFQ19FTkVUX01JSSwgZmVwLT5od3AgKyBGRUNfSUVWRU5UKTsKKwlpbml0X2NvbXBsZXRpb24oJmZlcC0+bWRpb19kb25lKTsKIAogCS8qIHN0YXJ0IGEgcmVhZCBvcCAqLwogCXdyaXRlbChGRUNfTU1GUl9TVCB8IEZFQ19NTUZSX09QX1JFQUQgfApAQCAtNjI3LDEzICs2MzAsMTIgQEAKIAkJRkVDX01NRlJfVEEsIGZlcC0+aHdwICsgRkVDX01JSV9EQVRBKTsKIAogCS8qIHdhaXQgZm9yIGVuZCBvZiB0cmFuc2ZlciAqLwotCXdoaWxlICghKHJlYWRsKGZlcC0+aHdwICsgRkVDX0lFVkVOVCkgJiBGRUNfRU5FVF9NSUkpKSB7Ci0JCWNwdV9yZWxheCgpOwotCQlpZiAodGltZW91dC0tIDwgMCkgewotCQkJZmVwLT5taWlfdGltZW91dCA9IDE7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkZFQzogTURJTyByZWFkIHRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZlcC0+bWRpb19kb25lLAorCQkJdXNlY3NfdG9famlmZmllcyhGRUNfTUlJX1RJTUVPVVQpKTsKKwlpZiAodGltZV9sZWZ0ID09IDApIHsKKwkJZmVwLT5taWlfdGltZW91dCA9IDE7CisJCXByaW50ayhLRVJOX0VSUiAiRkVDOiBNRElPIHJlYWQgdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAogCS8qIHJldHVybiB2YWx1ZSAqLwpAQCAtNjQ0LDEyICs2NDYsMTAgQEAKIAkJCSAgIHUxNiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gYnVzLT5wcml2OwotCWludCB0aW1lb3V0ID0gRkVDX01JSV9USU1FT1VUOworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCiAJZmVwLT5taWlfdGltZW91dCA9IDA7Ci0KLQkvKiBjbGVhciBNSUkgZW5kIG9mIHRyYW5zZmVyIGJpdCovCi0Jd3JpdGVsKEZFQ19FTkVUX01JSSwgZmVwLT5od3AgKyBGRUNfSUVWRU5UKTsKKwlpbml0X2NvbXBsZXRpb24oJmZlcC0+bWRpb19kb25lKTsKIAogCS8qIHN0YXJ0IGEgcmVhZCBvcCAqLwogCXdyaXRlbChGRUNfTU1GUl9TVCB8IEZFQ19NTUZSX09QX1JFQUQgfApAQCAtNjU4LDEzICs2NTgsMTIgQEAKIAkJZmVwLT5od3AgKyBGRUNfTUlJX0RBVEEpOwogCiAJLyogd2FpdCBmb3IgZW5kIG9mIHRyYW5zZmVyICovCi0Jd2hpbGUgKCEocmVhZGwoZmVwLT5od3AgKyBGRUNfSUVWRU5UKSAmIEZFQ19FTkVUX01JSSkpIHsKLQkJY3B1X3JlbGF4KCk7Ci0JCWlmICh0aW1lb3V0LS0gPCAwKSB7Ci0JCQlmZXAtPm1paV90aW1lb3V0ID0gMTsKLQkJCXByaW50ayhLRVJOX0VSUiAiRkVDOiBNRElPIHdyaXRlIHRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZlcC0+bWRpb19kb25lLAorCQkJdXNlY3NfdG9famlmZmllcyhGRUNfTUlJX1RJTUVPVVQpKTsKKwlpZiAodGltZV9sZWZ0ID09IDApIHsKKwkJZmVwLT5taWlfdGltZW91dCA9IDE7CisJCXByaW50ayhLRVJOX0VSUiAiRkVDOiBNRElPIHdyaXRlIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTY3OSwzMCArNjc4LDI0IEBACiB7CiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBOVUxMOwotCWludCBwaHlfYWRkcjsKKwlpbnQgcmV0OwogCiAJZmVwLT5waHlfZGV2ID0gTlVMTDsKIAogCS8qIGZpbmQgdGhlIGZpcnN0IHBoeSAqLwotCWZvciAocGh5X2FkZHIgPSAwOyBwaHlfYWRkciA8IFBIWV9NQVhfQUREUjsgcGh5X2FkZHIrKykgewotCQlpZiAoZmVwLT5taWlfYnVzLT5waHlfbWFwW3BoeV9hZGRyXSkgewotCQkJcGh5X2RldiA9IGZlcC0+bWlpX2J1cy0+cGh5X21hcFtwaHlfYWRkcl07Ci0JCQlicmVhazsKLQkJfQotCX0KLQorCXBoeV9kZXYgPSBwaHlfZmluZF9maXJzdChmZXAtPm1paV9idXMpOwogCWlmICghcGh5X2RldikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIGF0dGFjaCB0aGUgbWFjIHRvIHRoZSBwaHkgKi8KLQlwaHlfZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBkZXZfbmFtZSgmcGh5X2Rldi0+ZGV2KSwKKwlyZXQgPSBwaHlfY29ubmVjdF9kaXJlY3QoZGV2LCBwaHlfZGV2LAogCQkJICAgICAmZmVjX2VuZXRfYWRqdXN0X2xpbmssIDAsCiAJCQkgICAgIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkpOwotCWlmIChJU19FUlIocGh5X2RldikpIHsKKwlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iLCBkZXYtPm5hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihwaHlfZGV2KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiBtYXNrIHdpdGggTUFDIHN1cHBvcnRlZCBmZWF0dXJlcyAqLwpAQCAtODM0LDcgKzgyNyw3IEBACiAJaWYgKCFwaHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZlY19lbmV0X2ZyZWVfYnVmZmVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTIyMiw3ICsxMjE1LDcgQEAKIAl3cml0ZWwoMCwgZmVwLT5od3AgKyBGRUNfUl9ERVNfQUNUSVZFKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIHdlIHdpc2ggdG8gc2VydmljZSAqLwotCXdyaXRlbChGRUNfRU5FVF9UWEYgfCBGRUNfRU5FVF9SWEYsIGZlcC0+aHdwICsgRkVDX0lNQVNLKTsKKwl3cml0ZWwoRkVDX0RFRkFVTFRfSU1BU0ssIGZlcC0+aHdwICsgRkVDX0lNQVNLKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEyNDEsMTEgKzEyMzQsOCBAQAogCS8qIFdoYWNrIGEgcmVzZXQuICBXZSBzaG91bGQgd2FpdCBmb3IgdGhpcy4gKi8KIAl3cml0ZWwoMSwgZmVwLT5od3AgKyBGRUNfRUNOVFJMKTsKIAl1ZGVsYXkoMTApOwotCi0JLyogQ2xlYXIgb3V0c3RhbmRpbmcgTUlJIGNvbW1hbmQgaW50ZXJydXB0cy4gKi8KLQl3cml0ZWwoRkVDX0VORVRfTUlJLCBmZXAtPmh3cCArIEZFQ19JRVZFTlQpOwotCiAJd3JpdGVsKGZlcC0+cGh5X3NwZWVkLCBmZXAtPmh3cCArIEZFQ19NSUlfU1BFRUQpOworCXdyaXRlbChGRUNfREVGQVVMVF9JTUFTSywgZmVwLT5od3AgKyBGRUNfSU1BU0spOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdApAQCAtMTM2NSwxMCArMTM1NSwxMSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50Ci1mZWNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK2ZlY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOwogCiAJaWYgKG5kZXYpIHsKQEAgLTEzODEsOSArMTM3Miw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZlY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorZmVjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKIAogCWlmIChuZGV2KSB7CkBAIC0xMzk1LDE1ICsxMzg2LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBmZWNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gZmVjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBmZWNfcmVzdW1lLAorCS5mcmVlemUJCT0gZmVjX3N1c3BlbmQsCisJLnRoYXcJCT0gZmVjX3Jlc3VtZSwKKwkucG93ZXJvZmYJPSBmZWNfc3VzcGVuZCwKKwkucmVzdG9yZQk9IGZlY19yZXN1bWUsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZlY19kcml2ZXIgPSB7CiAJLmRyaXZlcgk9IHsKLQkJLm5hbWUgICAgPSAiZmVjIiwKLQkJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJmZWMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtCT0gJmZlY19wbV9vcHMsCisjZW5kaWYKIAl9LAotCS5wcm9iZSAgID0gZmVjX3Byb2JlLAotCS5yZW1vdmUgID0gX19kZXZleGl0X3AoZmVjX2Rydl9yZW1vdmUpLAotCS5zdXNwZW5kID0gZmVjX3N1c3BlbmQsCi0JLnJlc3VtZSAgPSBmZWNfcmVzdW1lLAorCS5wcm9iZQk9IGZlY19wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoZmVjX2Rydl9yZW1vdmUpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4LmMgYi9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eC5jCmluZGV4IDI1ZTZjYzYuLmQxYTViMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4LmMKKysrIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHguYwpAQCAtODI2LDcgKzgyNiw3IEBACiAJaWYgKCFwcml2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIGlmX21paShycSksIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtcGM1Mnh4X2ZlY19uZXRkZXZfb3BzID0gewpAQCAtODc1LDE3ICs4NzUsMjEgQEAKIAlpZiAocnYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6ICIKIAkJCQkiRXJyb3Igd2hpbGUgcGFyc2luZyBkZXZpY2Ugbm9kZSByZXNvdXJjZVxuIiApOwotCQlyZXR1cm4gcnY7CisJCWdvdG8gZXJyX25ldGRldjsKIAl9CiAJaWYgKChtZW0uZW5kIC0gbWVtLnN0YXJ0ICsgMSkgPCBzaXplb2Yoc3RydWN0IG1wYzUyeHhfZmVjKSkgewogCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUKIAkJCSIgLSBpbnZhbGlkIHJlc291cmNlIHNpemUgKCVseCA8ICV4KSwgY2hlY2sgbXBjNTJ4eF9kZXZpY2VzLmNcbiIsCiAJCQkodW5zaWduZWQgbG9uZykobWVtLmVuZCAtIG1lbS5zdGFydCArIDEpLCBzaXplb2Yoc3RydWN0IG1wYzUyeHhfZmVjKSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX25ldGRldjsKIAl9CiAKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW0uc3RhcnQsIHNpemVvZihzdHJ1Y3QgbXBjNTJ4eF9mZWMpLCBEUklWRVJfTkFNRSkpCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLnN0YXJ0LCBzaXplb2Yoc3RydWN0IG1wYzUyeHhfZmVjKSwKKwkJCQlEUklWRVJfTkFNRSkpIHsKKwkJcnYgPSAtRUJVU1k7CisJCWdvdG8gZXJyX25ldGRldjsKKwl9CiAKIAkvKiBJbml0IGV0aGVyIG5kZXYgd2l0aCB3aGF0IHdlIGhhdmUgKi8KIAluZGV2LT5uZXRkZXZfb3BzCT0gJm1wYzUyeHhfZmVjX25ldGRldl9vcHM7CkBAIC05MDEsNyArOTA1LDcgQEAKIAogCWlmICghcHJpdi0+ZmVjKSB7CiAJCXJ2ID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9lcnJvcjsKKwkJZ290byBlcnJfbWVtX3JlZ2lvbjsKIAl9CiAKIAkvKiBCZXN0Y29tbSBpbml0ICovCkBAIC05MTQsNyArOTE4LDcgQEAKIAlpZiAoIXByaXYtPnJ4X2RtYXRzayB8fCAhcHJpdi0+dHhfZG1hdHNrKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBDYW4gbm90IGluaXQgU0RNQSB0YXNrc1xuIiApOwogCQlydiA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZXJyb3I7CisJCWdvdG8gZXJyX3J4X3R4X2RtYXRzazsKIAl9CiAKIAkvKiBHZXQgdGhlIElSUSB3ZSBuZWVkIG9uZSBieSBvbmUgKi8KQEAgLTk2NiwzMyArOTcwLDI1IEBACiAKIAlydiA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKIAlpZiAocnYgPCAwKQotCQlnb3RvIHByb2JlX2Vycm9yOworCQlnb3RvIGVycl9ub2RlOwogCiAJLyogV2UncmUgZG9uZSAhICovCiAJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBuZGV2KTsKIAogCXJldHVybiAwOwogCi0KLQkvKiBFcnJvciBoYW5kbGluZyAtIGZyZWUgZXZlcnl0aGluZyB0aGF0IG1pZ2h0IGJlIGFsbG9jYXRlZCAqLwotcHJvYmVfZXJyb3I6Ci0KLQlpZiAocHJpdi0+cGh5X25vZGUpCi0JCW9mX25vZGVfcHV0KHByaXYtPnBoeV9ub2RlKTsKLQlwcml2LT5waHlfbm9kZSA9IE5VTEw7Ci0KK2Vycl9ub2RlOgorCW9mX25vZGVfcHV0KHByaXYtPnBoeV9ub2RlKTsKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKG5kZXYtPmlycSk7Ci0KK2Vycl9yeF90eF9kbWF0c2s6CiAJaWYgKHByaXYtPnJ4X2RtYXRzaykKIAkJYmNvbV9mZWNfcnhfcmVsZWFzZShwcml2LT5yeF9kbWF0c2spOwogCWlmIChwcml2LT50eF9kbWF0c2spCiAJCWJjb21fZmVjX3R4X3JlbGVhc2UocHJpdi0+dHhfZG1hdHNrKTsKLQotCWlmIChwcml2LT5mZWMpCi0JCWlvdW5tYXAocHJpdi0+ZmVjKTsKLQorCWlvdW5tYXAocHJpdi0+ZmVjKTsKK2Vycl9tZW1fcmVnaW9uOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0uc3RhcnQsIHNpemVvZihzdHJ1Y3QgbXBjNTJ4eF9mZWMpKTsKLQorZXJyX25ldGRldjoKIAlmcmVlX25ldGRldihuZGV2KTsKIAogCXJldHVybiBydjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4X3BoeS5jIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHhfcGh5LmMKaW5kZXggMDA2ZjY0ZC4uZGJhZjcyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVjX21wYzUyeHhfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHhfcGh5LmMKQEAgLTI5LDE1ICsyOSwxNCBAQAogCQlpbnQgcmVnLCB1MzIgdmFsdWUpCiB7CiAJc3RydWN0IG1wYzUyeHhfZmVjX21kaW9fcHJpdiAqcHJpdiA9IGJ1cy0+cHJpdjsKLQlzdHJ1Y3QgbXBjNTJ4eF9mZWMgX19pb21lbSAqZmVjOworCXN0cnVjdCBtcGM1Mnh4X2ZlYyBfX2lvbWVtICpmZWMgPSBwcml2LT5yZWdzOwogCWludCB0cmllcyA9IDM7CiAKIAl2YWx1ZSB8PSAocGh5X2lkIDw8IEZFQ19NSUlfREFUQV9QQV9TSElGVCkgJiBGRUNfTUlJX0RBVEFfUEFfTVNLOwogCXZhbHVlIHw9IChyZWcgPDwgRkVDX01JSV9EQVRBX1JBX1NISUZUKSAmIEZFQ19NSUlfREFUQV9SQV9NU0s7CiAKLQlmZWMgPSBwcml2LT5yZWdzOwogCW91dF9iZTMyKCZmZWMtPmlldmVudCwgRkVDX0lFVkVOVF9NSUkpOwotCW91dF9iZTMyKCZwcml2LT5yZWdzLT5taWlfZGF0YSwgdmFsdWUpOworCW91dF9iZTMyKCZmZWMtPm1paV9kYXRhLCB2YWx1ZSk7CiAKIAkvKiB3YWl0IGZvciBpdCB0byBmaW5pc2gsIHRoaXMgdGFrZXMgYWJvdXQgMjMgdXMgb24gbGl0ZTUyMDBiICovCiAJd2hpbGUgKCEoaW5fYmUzMigmZmVjLT5pZXZlbnQpICYgRkVDX0lFVkVOVF9NSUkpICYmIC0tdHJpZXMpCkBAIC00Nyw3ICs0Niw3IEBACiAJCXJldHVybiAtRVRJTUVET1VUOwogCiAJcmV0dXJuIHZhbHVlICYgRkVDX01JSV9EQVRBX09QX1JEID8KLQkJaW5fYmUzMigmcHJpdi0+cmVncy0+bWlpX2RhdGEpICYgRkVDX01JSV9EQVRBX0RBVEFNU0sgOiAwOworCQlpbl9iZTMyKCZmZWMtPm1paV9kYXRhKSAmIEZFQ19NSUlfREFUQV9EQVRBTVNLIDogMDsKIH0KIAogc3RhdGljIGludCBtcGM1Mnh4X2ZlY19tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9pZCwgaW50IHJlZykKQEAgLTY5LDkgKzY4LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2YtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBtaWlfYnVzICpidXM7CiAJc3RydWN0IG1wYzUyeHhfZmVjX21kaW9fcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzID0ge307CisJc3RydWN0IHJlc291cmNlIHJlczsKIAlpbnQgZXJyOwotCWludCBpOwogCiAJYnVzID0gbWRpb2J1c19hbGxvYygpOwogCWlmIChidXMgPT0gTlVMTCkKQEAgLTkzLDcgKzkxLDcgQEAKIAllcnIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwotCXByaXYtPnJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOworCXByaXYtPnJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYgKHByaXYtPnJlZ3MgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9mcmVlOwpAQCAtMTE4LDEwICsxMTYsNiBAQAogIG91dF91bm1hcDoKIAlpb3VubWFwKHByaXYtPnJlZ3MpOwogIG91dF9mcmVlOgotCWZvciAoaT0wOyBpPFBIWV9NQVhfQUREUjsgaSsrKQotCQlpZiAoYnVzLT5pcnFbaV0gIT0gUEhZX1BPTEwpCi0JCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGJ1cy0+aXJxW2ldKTsKLQlrZnJlZShidXMtPmlycSk7CiAJa2ZyZWUocHJpdik7CiAJbWRpb2J1c19mcmVlKGJ1cyk7CiAKQEAgLTEzMywyMyArMTI3LDE2IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJm9mLT5kZXY7CiAJc3RydWN0IG1paV9idXMgKmJ1cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBtcGM1Mnh4X2ZlY19tZGlvX3ByaXYgKnByaXYgPSBidXMtPnByaXY7Ci0JaW50IGk7CiAKIAltZGlvYnVzX3VucmVnaXN0ZXIoYnVzKTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQogCWlvdW5tYXAocHJpdi0+cmVncyk7Ci0JZm9yIChpPTA7IGk8UEhZX01BWF9BRERSOyBpKyspCi0JCWlmIChidXMtPmlycVtpXSAhPSBQSFlfUE9MTCkKLQkJCWlycV9kaXNwb3NlX21hcHBpbmcoYnVzLT5pcnFbaV0pOwogCWtmcmVlKHByaXYpOwotCWtmcmVlKGJ1cy0+aXJxKTsKIAltZGlvYnVzX2ZyZWUoYnVzKTsKIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUyeHhfZmVjX21kaW9fbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLW1kaW8iLCB9LApAQCAtMTcxLDUgKzE1OCw0IEBACiAvKiBsZXQgZmVjIGRyaXZlciBjYWxsIGl0LCBzaW5jZSB0aGlzIGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBpdCAqLwogRVhQT1JUX1NZTUJPTF9HUEwobXBjNTJ4eF9mZWNfbWRpb19kcml2ZXIpOwogCi0KIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggMjY4ZWE0ZC4uNGRhMDViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTg5LDggKzg5LDEwIEBACiAjZGVmaW5lIERFVl9IQVNfTVNJX1ggICAgICAgICAgICAgIDB4MDAwMDA4MCAgLyogZGV2aWNlIHN1cHBvcnRzIE1TSS1YICovCiAjZGVmaW5lIERFVl9IQVNfUE9XRVJfQ05UUkwgICAgICAgIDB4MDAwMDEwMCAgLyogZGV2aWNlIHN1cHBvcnRzIHBvd2VyIHNhdmluZ3MgKi8KICNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YxICAgICAgMHgwMDAwMjAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDEgKi8KLSNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YyICAgICAgMHgwMDAwNjAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDIgKi8KLSNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YzICAgICAgMHgwMDAwZTAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDMgKi8KKyNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YyICAgICAgMHgwMDAwNDAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDIgKi8KKyNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YzICAgICAgMHgwMDAwODAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDMgKi8KKyNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YxMiAgICAgMHgwMDAwNjAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDEgYW5kIDIgKi8KKyNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTX1YxMjMgICAgMHgwMDAwZTAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyB2ZXJzaW9uIDEsIDIsIGFuZCAzICovCiAjZGVmaW5lIERFVl9IQVNfVEVTVF9FWFRFTkRFRCAgICAgIDB4MDAwMTAwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGV4dGVuZGVkIGRpYWdub3N0aWMgdGVzdCAqLwogI2RlZmluZSBERVZfSEFTX01HTVRfVU5JVCAgICAgICAgICAweDAwMDIwMDAgIC8qIGRldmljZSBzdXBwb3J0cyBtYW5hZ2VtZW50IHVuaXQgKi8KICNkZWZpbmUgREVWX0hBU19DT1JSRUNUX01BQ0FERFIgICAgMHgwMDA0MDAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgY29ycmVjdCBtYWMgYWRkcmVzcyBvcmRlciAqLwpAQCAtMjQ2OCw3ICsyNDcwLDcgQEAKIAlzdHJ1Y3QgcmluZ19kZXNjX2V4KiBvcmlnX2dldF90eCA9IG5wLT5nZXRfdHguZXg7CiAKIAl3aGlsZSAoKG5wLT5nZXRfdHguZXggIT0gbnAtPnB1dF90eC5leCkgJiYKLQkgICAgICAgISgoZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+Z2V0X3R4LmV4LT5mbGFnbGVuKSkgJiBOVl9UWF9WQUxJRCkgJiYKKwkgICAgICAgISgoZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+Z2V0X3R4LmV4LT5mbGFnbGVuKSkgJiBOVl9UWDJfVkFMSUQpICYmCiAJICAgICAgICh0eF93b3JrIDwgbGltaXQpKSB7CiAKIAkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdHhfZG9uZV9vcHRpbWl6ZWQ6IGZsYWdzIDB4JXguXG4iLApAQCAtNjA2NywxMTEgKzYwNjksMTExIEBACiAJfSwKIAl7CS8qIE1DUDU1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDM3MiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19WTEFOfERFVl9IQVNfTVNJfERFVl9IQVNfTVNJX1h8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfTkVFRF9UWF9MSU1JVHxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfVkxBTnxERVZfSEFTX01TSXxERVZfSEFTX01TSV9YfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9ORUVEX1RYX0xJTUlUfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDU1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDM3MyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19WTEFOfERFVl9IQVNfTVNJfERFVl9IQVNfTVNJX1h8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfTkVFRF9UWF9MSU1JVHxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfVkxBTnxERVZfSEFTX01TSXxERVZfSEFTX01TSV9YfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9ORUVEX1RYX0xJTUlUfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDNFNSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YxMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNjEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwM0U2KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A2MSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDAzRUUpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDNFRiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YxMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwNDUwKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDA0NTEpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDY1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDQ1MiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YxMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwNDUzKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDA1NEMpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDY3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDU0RCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YxMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwNTRFKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDA1NEYpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDczIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDdEQyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A3MyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDA3REQpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNzMgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwN0RFKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YxMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDczIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDdERiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YxfERFVl9IQVNfU1RBVElTVElDU19WMTJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A3NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDA3NjApLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUMnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9QSFlfSU5JVF9GSVh8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMnxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUMnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9QSFlfSU5JVF9GSVh8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNzcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwNzYxKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMnxERVZfSEFTX1NUQVRJU1RJQ1NfVjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVDJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjJ8REVWX0hBU19TVEFUSVNUSUNTX1YxMjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVDJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDc3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MDc2MiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjJ8REVWX0hBU19TVEFUSVNUSUNTX1YzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQyfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX1BIWV9JTklUX0ZJWHxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WMTIzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQyfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX1BIWV9JTklUX0ZJWHxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A3NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDA3NjMpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YyfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUMnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9QSFlfSU5JVF9GSVh8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WMnxERVZfSEFTX1NUQVRJU1RJQ1NfVjEyM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUMnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9QSFlfSU5JVF9GSVh8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNzkgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwQUIwKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVDJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YxMjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVDJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDc5IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MEFCMSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQyfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX1BIWV9JTklUX0ZJWHxERVZfTkVFRF9NU0lfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WMTIzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVQyfERFVl9IQVNfR0VBUl9NT0RFfERFVl9ORUVEX1BIWV9JTklUX0ZJWHxERVZfTkVFRF9NU0lfRklYLAogCX0sCiAJewkvKiBNQ1A3OSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoMHgxMERFLCAweDBBQjIpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUMnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9QSFlfSU5JVF9GSVh8REVWX05FRURfTVNJX0ZJWCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjEyM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUMnxERVZfSEFTX0dFQVJfTU9ERXxERVZfTkVFRF9QSFlfSU5JVF9GSVh8REVWX05FRURfTVNJX0ZJWCwKIAl9LAogCXsJLyogTUNQNzkgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKDB4MTBERSwgMHgwQUIzKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVDJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYfERFVl9ORUVEX01TSV9GSVgsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YxMjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVDJ8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYfERFVl9ORUVEX01TSV9GSVgsCiAJfSwKIAl7CS8qIE1DUDg5IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRSgweDEwREUsIDB4MEQ3RCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WMTIzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX0hBU19HRUFSX01PREV8REVWX05FRURfUEhZX0lOSVRfRklYLAogCX0sCiAJezAsfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwppbmRleCAzMDlhMGVhLi5mMDhjZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKQEAgLTk2MywxMiArOTYzLDExIEBACiBzdGF0aWMgaW50IGZzX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paSA9IChzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKikmcnEtPmlmcl9kYXRhOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwoZmVwLT5waHlkZXYsIG1paSwgY21kKTsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChmZXAtPnBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIGV4dGVybiBpbnQgZnNfbWlpX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc2xfcHFfbWRpby5jIGIvZHJpdmVycy9uZXQvZnNsX3BxX21kaW8uYwppbmRleCBiNGM0MWQ3Li5mNTNmODUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc2xfcHFfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzbF9wcV9tZGlvLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9tZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNsX3BxX21kaW8uaCBiL2RyaXZlcnMvbmV0L2ZzbF9wcV9tZGlvLmgKaW5kZXggMWY3ZDg2NS4uYmQxN2EyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNsX3BxX21kaW8uaAorKysgYi9kcml2ZXJzL25ldC9mc2xfcHFfbWRpby5oCkBAIC0zOSw3ICszOSw3IEBACiAJdTggcmVzZXJ2ZWRbMjhdOwkvKiBTcGFjZSBob2xkZXIgKi8KIAl1MzIgdXRiaXBhcjsJCS8qIFRCSSBwaHkgYWRkcmVzcyByZWcgKG9ubHkgb24gVUNDKSAqLwogCXU4IHJlczRbMjcyOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGludCBmc2xfcHFfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0pOwogaW50IGZzbF9wcV9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0sIHUxNiB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKaW5kZXggMjhiNTNkMS4uYTFiNjMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpAQCAtODUsNiArODUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldF90c3RhbXAuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTY4NSw4ICs2ODYsOCBAQAogCQlwcml2LT5yeF9xdWV1ZVtpXSA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX3R4X3F1ZXVlczsgaSsrKSB7Ci0JCXByaXYtPnR4X3F1ZXVlW2ldID0gIChzdHJ1Y3QgZ2Zhcl9wcml2X3R4X3EgKilremFsbG9jKAotCQkJCXNpemVvZiAoc3RydWN0IGdmYXJfcHJpdl90eF9xKSwgR0ZQX0tFUk5FTCk7CisJCXByaXYtPnR4X3F1ZXVlW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdmYXJfcHJpdl90eF9xKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIXByaXYtPnR4X3F1ZXVlW2ldKSB7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byB0eF9hbGxvY19mYWlsZWQ7CkBAIC02OTgsOCArNjk5LDggQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7Ci0JCXByaXYtPnJ4X3F1ZXVlW2ldID0gKHN0cnVjdCBnZmFyX3ByaXZfcnhfcSAqKWt6YWxsb2MoCi0JCQkJCXNpemVvZiAoc3RydWN0IGdmYXJfcHJpdl9yeF9xKSwgR0ZQX0tFUk5FTCk7CisJCXByaXYtPnJ4X3F1ZXVlW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdmYXJfcHJpdl9yeF9xKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIXByaXYtPnJ4X3F1ZXVlW2ldKSB7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byByeF9hbGxvY19mYWlsZWQ7CkBAIC04NDYsNyArODQ3LDcgQEAKIAlpZiAoIXByaXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIGlmX21paShycSksIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCByZXZlcnNlX2JpdG1hcCh1bnNpZ25lZCBpbnQgYml0X21hcCwgdW5zaWduZWQgaW50IG1heF9xcykKQEAgLTkxNiw3ICs5MTcsNyBAQAogCXJxZmFyID0gY2x1c3Rlcl9lbnRyeV9wZXJfY2xhc3MocHJpdiwgcnFmYXIsIFJRRlBSX0lQVjQgfCBSUUZQUl9VRFApOwogCXJxZmFyID0gY2x1c3Rlcl9lbnRyeV9wZXJfY2xhc3MocHJpdiwgcnFmYXIsIFJRRlBSX0lQVjQgfCBSUUZQUl9UQ1ApOwogCi0JLyogY3VyX2ZpbGVyX2lkeCBpbmRpY2F0ZWQgdGhlIGZpc3J0IG5vbi1tYXNrZWQgcnVsZSAqLworCS8qIGN1cl9maWxlcl9pZHggaW5kaWNhdGVkIHRoZSBmaXJzdCBub24tbWFza2VkIHJ1bGUgKi8KIAlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcnFmYXI7CiAKIAkvKiBSZXN0IGFyZSBtYXNrZWQgcnVsZXMgKi8KQEAgLTkyOCw2ICs5MjksMzQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGdmYXJfZGV0ZWN0X2VycmF0YShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT5vZmRldi0+ZGV2OworCXVuc2lnbmVkIGludCBwdnIgPSBtZnNwcihTUFJOX1BWUik7CisJdW5zaWduZWQgaW50IHN2ciA9IG1mc3ByKFNQUk5fU1ZSKTsKKwl1bnNpZ25lZCBpbnQgbW9kID0gKHN2ciA+PiAxNikgJiAweGZmZjY7IC8qIHcvbyBFIHN1ZmZpeCAqLworCXVuc2lnbmVkIGludCByZXYgPSBzdnIgJiAweGZmZmY7CisKKwkvKiBNUEM4MzEzIFJldiAyLjAgYW5kIGhpZ2hlcjsgQWxsIE1QQzgzN3ggKi8KKwlpZiAoKHB2ciA9PSAweDgwODUwMDEwICYmIG1vZCA9PSAweDgwYjAgJiYgcmV2ID49IDB4MDAyMCkgfHwKKwkJCShwdnIgPT0gMHg4MDg2MTAxMCAmJiAobW9kICYgMHhmZmY5KSA9PSAweDgwYzApKQorCQlwcml2LT5lcnJhdGEgfD0gR0ZBUl9FUlJBVEFfNzQ7CisKKwkvKiBNUEM4MzEzIGFuZCBNUEM4Mzd4IGFsbCByZXYgKi8KKwlpZiAoKHB2ciA9PSAweDgwODUwMDEwICYmIG1vZCA9PSAweDgwYjApIHx8CisJCQkocHZyID09IDB4ODA4NjEwMTAgJiYgKG1vZCAmIDB4ZmZmOSkgPT0gMHg4MGMwKSkKKwkJcHJpdi0+ZXJyYXRhIHw9IEdGQVJfRVJSQVRBXzc2OworCisJLyogTVBDODMxMyBhbmQgTVBDODM3eCBhbGwgcmV2ICovCisJaWYgKChwdnIgPT0gMHg4MDg1MDAxMCAmJiBtb2QgPT0gMHg4MGIwKSB8fAorCQkJKHB2ciA9PSAweDgwODYxMDEwICYmIChtb2QgJiAweGZmZjkpID09IDB4ODBjMCkpCisJCXByaXYtPmVycmF0YSB8PSBHRkFSX0VSUkFUQV9BMDAyOworCisJaWYgKHByaXYtPmVycmF0YSkKKwkJZGV2X2luZm8oZGV2LCAiZW5hYmxlZCBlcnJhdGEgd29ya2Fyb3VuZHMsIGZsYWdzOiAweCV4XG4iLAorCQkJIHByaXYtPmVycmF0YSk7Cit9CisKIC8qIFNldCB1cCB0aGUgZXRoZXJuZXQgZGV2aWNlIHN0cnVjdHVyZSwgcHJpdmF0ZSBkYXRhLAogICogYW5kIGFueXRoaW5nIGVsc2Ugd2UgbmVlZCBiZWZvcmUgd2Ugc3RhcnQgKi8KIHN0YXRpYyBpbnQgZ2Zhcl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKQEAgLTk2MCw2ICs5ODksOCBAQAogCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgcHJpdik7CiAJcmVncyA9IHByaXYtPmdmYXJncnBbMF0ucmVnczsKIAorCWdmYXJfZGV0ZWN0X2VycmF0YShwcml2KTsKKwogCS8qIFN0b3AgdGhlIERNQSBlbmdpbmUgbm93LCBpbiBjYXNlIGl0IHdhcyBydW5uaW5nIGJlZm9yZSAqLwogCS8qIChUaGUgZmlybXdhcmUgY291bGQgaGF2ZSB1c2VkIGl0LCBhbmQgbGVmdCBpdCBydW5uaW5nKS4gKi8KIAlnZmFyX2hhbHQoZGV2KTsKQEAgLTk3NCw3ICsxMDA1LDEwIEBACiAJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMSwgdGVtcHZhbCk7CiAKIAkvKiBJbml0aWFsaXplIE1BQ0NGRzIuICovCi0JZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMiwgTUFDQ0ZHMl9JTklUX1NFVFRJTkdTKTsKKwl0ZW1wdmFsID0gTUFDQ0ZHMl9JTklUX1NFVFRJTkdTOworCWlmIChnZmFyX2hhc19lcnJhdGEocHJpdiwgR0ZBUl9FUlJBVEFfNzQpKQorCQl0ZW1wdmFsIHw9IE1BQ0NGRzJfSFVHRUZSQU1FIHwgTUFDQ0ZHMl9MRU5HVEhDSEVDSzsKKwlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKIAogCS8qIEluaXRpYWxpemUgRUNOVFJMICovCiAJZ2Zhcl93cml0ZSgmcmVncy0+ZWNudHJsLCBFQ05UUkxfSU5JVF9TRVRUSU5HUyk7CkBAIC0xNTQxLDYgKzE1NzUsMjkgQEAKIAlnZmFyX3dyaXRlKCZyZWdzLT5taW5mbHIsIE1JTkZMUl9JTklUX1NFVFRJTkdTKTsKIH0KIAorc3RhdGljIGludCBfX2dmYXJfaXNfcnhfaWRsZShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQoreworCXUzMiByZXM7CisKKwkvKgorCSAqIE5vcm1hbHkgVFNFQyBzaG91bGQgbm90IGhhbmcgb24gR1JTIGNvbW1hbmRzLCBzbyB3ZSBzaG91bGQKKwkgKiBhY3R1YWxseSB3YWl0IGZvciBJRVZFTlRfR1JTQyBmbGFnLgorCSAqLworCWlmIChsaWtlbHkoIWdmYXJfaGFzX2VycmF0YShwcml2LCBHRkFSX0VSUkFUQV9BMDAyKSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBSZWFkIHRoZSBlVFNFQyByZWdpc3RlciBhdCBvZmZzZXQgMHhEMUMuIElmIGJpdHMgNy0xNCBhcmUKKwkgKiB0aGUgc2FtZSBhcyBiaXRzIDIzLTMwLCB0aGUgZVRTRUMgUnggaXMgYXNzdW1lZCB0byBiZSBpZGxlCisJICogYW5kIHRoZSBSeCBjYW4gYmUgc2FmZWx5IHJlc2V0LgorCSAqLworCXJlcyA9IGdmYXJfcmVhZCgodm9pZCBfX2lvbWVtICopcHJpdi0+Z2ZhcmdycFswXS5yZWdzICsgMHhkMWMpOworCXJlcyAmPSAweDdmODA3ZjgwOworCWlmICgocmVzICYgMHhmZmZmKSA9PSAocmVzID4+IDE2KSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KIAogLyogSGFsdCB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgcXVldWVzICovCiBzdGF0aWMgdm9pZCBnZmFyX2hhbHRfbm9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNTY0LDEyICsxNjIxLDE4IEBACiAJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+ZG1hY3RybCk7CiAJaWYgKCh0ZW1wdmFsICYgKERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpKQogCSAgICAhPSAoRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUykpIHsKKwkJaW50IHJldDsKKwogCQl0ZW1wdmFsIHw9IChETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKIAkJZ2Zhcl93cml0ZSgmcmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CiAKLQkJc3Bpbl9ldmVudF90aW1lb3V0KCgoZ2Zhcl9yZWFkKCZyZWdzLT5pZXZlbnQpICYKLQkJCSAoSUVWRU5UX0dSU0MgfCBJRVZFTlRfR1RTQykpID09Ci0JCQkgKElFVkVOVF9HUlNDIHwgSUVWRU5UX0dUU0MpKSwgLTEsIDApOworCQlkbyB7CisJCQlyZXQgPSBzcGluX2V2ZW50X3RpbWVvdXQoKChnZmFyX3JlYWQoJnJlZ3MtPmlldmVudCkgJgorCQkJCSAoSUVWRU5UX0dSU0MgfCBJRVZFTlRfR1RTQykpID09CisJCQkJIChJRVZFTlRfR1JTQyB8IElFVkVOVF9HVFNDKSksIDEwMDAwMDAsIDApOworCQkJaWYgKCFyZXQgJiYgIShnZmFyX3JlYWQoJnJlZ3MtPmlldmVudCkgJiBJRVZFTlRfR1JTQykpCisJCQkJcmV0ID0gX19nZmFyX2lzX3J4X2lkbGUocHJpdik7CisJCX0gd2hpbGUgKCFyZXQpOwogCX0KIH0KIApAQCAtMTk4Nyw2ICsyMDUwLDIwIEBACiAJdW5zaWduZWQgaW50IG5yX2ZyYWdzLCBucl90eGJkcywgbGVuZ3RoOwogCXVuaW9uIHNrYl9zaGFyZWRfdHggKnNodHg7CiAKKwkvKgorCSAqIFRPRT0xIGZyYW1lcyBsYXJnZXIgdGhhbiAyNTAwIGJ5dGVzIG1heSBzZWUgZXhjZXNzIGRlbGF5cworCSAqIGJlZm9yZSBzdGFydCBvZiB0cmFuc21pc3Npb24uCisJICovCisJaWYgKHVubGlrZWx5KGdmYXJfaGFzX2VycmF0YShwcml2LCBHRkFSX0VSUkFUQV83NikgJiYKKwkJCXNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwgJiYKKwkJCXNrYi0+bGVuID4gMjUwMCkpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBza2JfY2hlY2tzdW1faGVscChza2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlycSA9IHNrYi0+cXVldWVfbWFwcGluZzsKIAl0eF9xdWV1ZSA9IHByaXYtPnR4X3F1ZXVlW3JxXTsKIAl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgcnEpOwpAQCAtMjMwMCw3ICsyMzc3LDggQEAKIAkgKiB0byBhbGxvdyBodWdlIGZyYW1lcywgYW5kIHRvIGNoZWNrIHRoZSBsZW5ndGggKi8KIAl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcyKTsKIAotCWlmIChwcml2LT5yeF9idWZmZXJfc2l6ZSA+IERFRkFVTFRfUlhfQlVGRkVSX1NJWkUpCisJaWYgKHByaXYtPnJ4X2J1ZmZlcl9zaXplID4gREVGQVVMVF9SWF9CVUZGRVJfU0laRSB8fAorCQkJZ2Zhcl9oYXNfZXJyYXRhKHByaXYsIEdGQVJfRVJSQVRBXzc0KSkKIAkJdGVtcHZhbCB8PSAoTUFDQ0ZHMl9IVUdFRlJBTUUgfCBNQUNDRkcyX0xFTkdUSENIRUNLKTsKIAllbHNlCiAJCXRlbXB2YWwgJj0gfihNQUNDRkcyX0hVR0VGUkFNRSB8IE1BQ0NGRzJfTEVOR1RIQ0hFQ0spOwpAQCAtMjM0Miw2ICsyNDIwLDE1IEBACiAJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfdGFzayk7CiB9CiAKK3N0YXRpYyB2b2lkIGdmYXJfYWxpZ25fc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogV2UgbmVlZCB0aGUgZGF0YSBidWZmZXIgdG8gYmUgYWxpZ25lZCBwcm9wZXJseS4gIFdlIHdpbGwgcmVzZXJ2ZQorCSAqIGFzIG1hbnkgYnl0ZXMgYXMgbmVlZGVkIHRvIGFsaWduIHRoZSBkYXRhIHByb3Blcmx5CisJICovCisJc2tiX3Jlc2VydmUoc2tiLCBSWEJVRl9BTElHTk1FTlQgLQorCQkoKCh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEpICYgKFJYQlVGX0FMSUdOTUVOVCAtIDEpKSk7Cit9CisKIC8qIEludGVycnVwdCBIYW5kbGVyIGZvciBUcmFuc21pdCBjb21wbGV0ZSAqLwogc3RhdGljIGludCBnZmFyX2NsZWFuX3R4X3Jpbmcoc3RydWN0IGdmYXJfcHJpdl90eF9xICp0eF9xdWV1ZSkKIHsKQEAgLTI0MjYsOSArMjUxMywxMCBAQAogCQkgKi8KIAkJaWYgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPnJ4X3JlY3ljbGUpIDwgcnhfcXVldWUtPnJ4X3Jpbmdfc2l6ZSAmJgogCQkJCXNrYl9yZWN5Y2xlX2NoZWNrKHNrYiwgcHJpdi0+cnhfYnVmZmVyX3NpemUgKwotCQkJCQlSWEJVRl9BTElHTk1FTlQpKQorCQkJCQlSWEJVRl9BTElHTk1FTlQpKSB7CisJCQlnZmFyX2FsaWduX3NrYihza2IpOwogCQkJX19za2JfcXVldWVfaGVhZCgmcHJpdi0+cnhfcmVjeWNsZSwgc2tiKTsKLQkJZWxzZQorCQl9IGVsc2UKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAKIAkJdHhfcXVldWUtPnR4X3NrYnVmZltza2JfZGlydHl0eF0gPSBOVUxMOwpAQCAtMjQ5MSwyOSArMjU3OSwyOCBAQAogCWdmYXJfaW5pdF9yeGJkcChyeF9xdWV1ZSwgYmRwLCBidWYpOwogfQogCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKiBnZmFyX2FsbG9jX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHByaXYtPnJ4X2J1ZmZlcl9zaXplICsgUlhCVUZfQUxJR05NRU5UKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlnZmFyX2FsaWduX3NrYihza2IpOworCisJcmV0dXJuIHNrYjsKK30KIAogc3RydWN0IHNrX2J1ZmYgKiBnZmFyX25ld19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1bnNpZ25lZCBpbnQgYWxpZ25hbW91bnQ7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAKIAlza2IgPSBfX3NrYl9kZXF1ZXVlKCZwcml2LT5yeF9yZWN5Y2xlKTsKIAlpZiAoIXNrYikKLQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsCi0JCQkJcHJpdi0+cnhfYnVmZmVyX3NpemUgKyBSWEJVRl9BTElHTk1FTlQpOwotCi0JaWYgKCFza2IpCi0JCXJldHVybiBOVUxMOwotCi0JYWxpZ25hbW91bnQgPSBSWEJVRl9BTElHTk1FTlQgLQotCQkoKCh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEpICYgKFJYQlVGX0FMSUdOTUVOVCAtIDEpKTsKLQotCS8qIFdlIG5lZWQgdGhlIGRhdGEgYnVmZmVyIHRvIGJlIGFsaWduZWQgcHJvcGVybHkuICBXZSB3aWxsIHJlc2VydmUKLQkgKiBhcyBtYW55IGJ5dGVzIGFzIG5lZWRlZCB0byBhbGlnbiB0aGUgZGF0YSBwcm9wZXJseQotCSAqLwotCXNrYl9yZXNlcnZlKHNrYiwgYWxpZ25hbW91bnQpOwotCUdGQVJfQ0Ioc2tiKS0+YWxpZ25hbW91bnQgPSBhbGlnbmFtb3VudDsKKwkJc2tiID0gZ2Zhcl9hbGxvY19za2IoZGV2KTsKIAogCXJldHVybiBza2I7CiB9CkBAIC0yNjY2LDE3ICsyNzUzLDggQEAKIAogCQkJaWYgKHVubGlrZWx5KCFuZXdza2IpKQogCQkJCW5ld3NrYiA9IHNrYjsKLQkJCWVsc2UgaWYgKHNrYikgewotCQkJCS8qCi0JCQkJICogV2UgbmVlZCB0byB1bi1yZXNlcnZlKCkgdGhlIHNrYiB0byB3aGF0IGl0Ci0JCQkJICogd2FzIGJlZm9yZSBnZmFyX25ld19za2IoKSByZS1hbGlnbmVkCi0JCQkJICogaXQgdG8gYW4gUlhCVUZfQUxJR05NRU5UIGJvdW5kYXJ5Ci0JCQkJICogYmVmb3JlIHdlIHB1dCB0aGUgc2tiIGJhY2sgb24gdGhlCi0JCQkJICogcmVjeWNsZSBsaXN0LgotCQkJCSAqLwotCQkJCXNrYl9yZXNlcnZlKHNrYiwgLUdGQVJfQ0Ioc2tiKS0+YWxpZ25hbW91bnQpOworCQkJZWxzZSBpZiAoc2tiKQogCQkJCV9fc2tiX3F1ZXVlX2hlYWQoJnByaXYtPnJ4X3JlY3ljbGUsIHNrYik7Ci0JCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBwYWNrZXRzICovCiAJCQlyeF9xdWV1ZS0+c3RhdHMucnhfcGFja2V0cysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCmluZGV4IGFjNGE5MmUuLjcxMDgxMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKQEAgLTEwMjUsNiArMTAyNSwxMiBAQAogCWNoYXIgaW50X25hbWVfZXJbR0ZBUl9JTlRfTkFNRV9NQVhdOwogfTsKIAorZW51bSBnZmFyX2VycmF0YSB7CisJR0ZBUl9FUlJBVEFfNzQJCT0gMHgwMSwKKwlHRkFSX0VSUkFUQV83NgkJPSAweDAyLAorCUdGQVJfRVJSQVRBX0EwMDIJPSAweDA0LAorfTsKKwogLyogU3RydWN0IHN0b2xlbiBhbG1vc3QgY29tcGxldGVseSAoYW5kIHNoYW1lbGVzc2x5KSBmcm9tIHRoZSBGQ0MgZW5ldCBzb3VyY2UKICAqIChPaywgdGhhdCdzIG5vdCBzbyB0cnVlIGFueW1vcmUsIGJ1dCB0aGVyZSBpcyBhIGZhbWlseSByZXNlbWJsZW5jZSkKICAqIFRoZSBHRkFSIGJ1ZmZlciBkZXNjcmlwdG9ycyB0cmFjayB0aGUgcmluZyBidWZmZXJzLiAgVGhlIHJ4X2JkX2Jhc2UKQEAgLTEwNDksNiArMTA1NSw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2OworCWVudW0gZ2Zhcl9lcnJhdGEgZXJyYXRhOwogCiAJc3RydWN0IGdmYXJfcHJpdl9ncnAgZ2ZhcmdycFtNQVhHUk9VUFNdOwogCXN0cnVjdCBnZmFyX3ByaXZfdHhfcSAqdHhfcXVldWVbTUFYX1RYX1FTXTsKQEAgLTExMTEsNiArMTExOCwxMiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBmdHBfcnFmcHJbTUFYX0ZJTEVSX0lEWCArIDFdOwogZXh0ZXJuIHVuc2lnbmVkIGludCBmdHBfcnFmY3JbTUFYX0ZJTEVSX0lEWCArIDFdOwogCitzdGF0aWMgaW5saW5lIGludCBnZmFyX2hhc19lcnJhdGEoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgIGVudW0gZ2Zhcl9lcnJhdGEgZXJyKQoreworCXJldHVybiBwcml2LT5lcnJhdGEgJiBlcnI7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIGdmYXJfcmVhZCh2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyKQogewogCXUzMiB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ncmV0aC5jIGIvZHJpdmVycy9uZXQvZ3JldGguYwppbmRleCAzYTAyOWQwLi40ZDA5ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ncmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2dyZXRoLmMKQEAgLTE1NTUsNyArMTU1NSw2IEBACiAJfQogCiAJLyogc2V0dXAgTkFQSSAqLwotCW1lbXNldCgmZ3JldGgtPm5hcGksIDAsIHNpemVvZihncmV0aC0+bmFwaSkpOwogCW5ldGlmX25hcGlfYWRkKGRldiwgJmdyZXRoLT5uYXBpLCBncmV0aF9wb2xsLCA2NCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwppbmRleCA2MWYyYjFjLi40OWFhYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1hY2hpLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCkBAIC00OTIsNyArNDkyLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CiAJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKIAlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLwogCS8qIEZyZXF1ZW50bHkgdXNlZCBhbmQgcGFpcmVkIHZhbHVlOiBrZWVwIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtMTAzNiw3ICsxMDM1LDcgQEAKIAkJaWYgKGVudHJ5ID49IFRYX1JJTkdfU0laRS0xKQogCQkJaG1wLT50eF9yaW5nW1RYX1JJTkdfU0laRS0xXS5zdGF0dXNfbl9sZW5ndGggfD0KIAkJCQljcHVfdG9fbGUzMihEZXNjRW5kUmluZyk7Ci0JCWhtcC0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExNjcsNyArMTE2Niw3IEBACiAKIAkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7IC8qIHByZXZlbnQgdHggdGltZW91dCAqLwotCWhtcC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAogCS8qIFJlc3RhcnQgdGhlIGNoaXAncyBUeC9SeCBwcm9jZXNzZXMgLiAqLwogCXdyaXRldygweDAwMDIsIGlvYWRkciArIFR4Q21kKTsgLyogU1RPUCBUeCAqLwpAQCAtMTQzNCw3ICsxNDMzLDcgQEAKIAkJCQkJaWYgKGVudHJ5ID49IFRYX1JJTkdfU0laRS0xKQogCQkJCQkJaG1wLT50eF9yaW5nW1RYX1JJTkdfU0laRS0xXS5zdGF0dXNfbl9sZW5ndGggfD0KIAkJCQkJCQljcHVfdG9fbGUzMihEZXNjRW5kUmluZyk7Ci0JCQkJCWhtcC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCQl9CiAJCQkJaWYgKGhtcC0+Y3VyX3R4IC0gaG1wLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDQpewogCQkJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCAqLwpAQCAtMTUyNSwxOCArMTUyNCwyMiBAQAogCQkJCSAgIGxlMzJfdG9fY3B1KGhtcC0+cnhfcmluZ1soaG1wLT5jdXJfcngrMSkgJSBSWF9SSU5HX1NJWkVdLnN0YXR1c19uX2xlbmd0aCkgJiAweGZmZmYwMDAwLAogCQkJCSAgIGxlMzJfdG9fY3B1KGhtcC0+cnhfcmluZ1soaG1wLT5jdXJfcngrMSkgJSBSWF9SSU5HX1NJWkVdLnN0YXR1c19uX2xlbmd0aCkgJiAweDAwMDBmZmZmLAogCQkJCSAgIGxlMzJfdG9fY3B1KGhtcC0+cnhfcmluZ1soaG1wLT5jdXJfcngtMSkgJSBSWF9SSU5HX1NJWkVdLnN0YXR1c19uX2xlbmd0aCkpOwotCQkJaG1wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJfSAvKiBlbHNlICBPbWl0IGZvciBwcm90b3R5cGUgZXJyYXRhPz8/ICovCiAJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMzgwMDAwKSB7CiAJCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCiAJCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDIpCiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgaGFtYWNoaV9yeCgpIFJ4IGVycm9yIHdhcyAlOC44eC5cbiIsCiAJCQkJCSAgIGZyYW1lX3N0YXR1cyk7Ci0JCQlobXAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDA2MDAwMDApIGhtcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwODAwMDApIGhtcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDEwMDAwMCkgaG1wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0JCQlpZiAoZnJhbWVfc3RhdHVzIDwgMCkgaG1wLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDA2MDAwMDApCisJCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDA4MDAwMCkKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxMDAwMDApCisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzIDwgMCkKKwkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBza19idWZmICpza2I7CiAJCQkvKiBPbWl0IENSQyAqLwpAQCAtMTY1NCw3ICsxNjU3LDcgQEAKICNlbmRpZiAgLyogUlhfQ0hFQ0tTVU0gKi8KIAogCQkJbmV0aWZfcngoc2tiKTsKLQkJCWhtcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCX0KIAkJZW50cnkgPSAoKytobXAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CiAJfQpAQCAtMTcyNCw5ICsxNzI3LDkgQEAKIAkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOwogCS8qIEhtbW1tbSwgaXQncyBub3QgY2xlYXIgaG93IHRvIHJlY292ZXIgZnJvbSBQQ0kgZmF1bHRzLiAqLwogCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyVHhQQ0lFcnIgfCBJbnRyVHhQQ0lGYXVsdCkpCi0JCWhtcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhQQ0lFcnIgfCBJbnRyUnhQQ0lGYXVsdCkpCi0JCWhtcC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogfQogCiBzdGF0aWMgaW50IGhhbWFjaGlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE4MjgsMTkgKzE4MzEsMjcgQEAKICAgICAgICAgICAgc28gSSB0aGluayBJJ2xsIGNvbW1lbnQgaXQgb3V0IGhlcmUgYW5kIHNlZSBpZiBiZXR0ZXIgdGhpbmdzCiAgICAgICAgICAgIGhhcHBlbi4KICAgICAgICAgKi8KLQkvKiBobXAtPnN0YXRzLnR4X3BhY2tldHMJPSByZWFkbChpb2FkZHIgKyAweDAwMCk7ICovCisJLyogZGV2LT5zdGF0cy50eF9wYWNrZXRzCT0gcmVhZGwoaW9hZGRyICsgMHgwMDApOyAqLwogCi0JaG1wLT5zdGF0cy5yeF9ieXRlcyA9IHJlYWRsKGlvYWRkciArIDB4MzMwKTsgLyogVG90YWwgVW5pK0JyZCtNdWx0aSAqLwotCWhtcC0+c3RhdHMudHhfYnl0ZXMgPSByZWFkbChpb2FkZHIgKyAweDNCMCk7IC8qIFRvdGFsIFVuaStCcmQrTXVsdGkgKi8KLQlobXAtPnN0YXRzLm11bHRpY2FzdAkJPSByZWFkbChpb2FkZHIgKyAweDMyMCk7IC8qIE11bHRpY2FzdCBSeCAqLworCS8qIFRvdGFsIFVuaStCcmQrTXVsdGkgKi8KKwlkZXYtPnN0YXRzLnJ4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHgzMzApOworCS8qIFRvdGFsIFVuaStCcmQrTXVsdGkgKi8KKwlkZXYtPnN0YXRzLnR4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHgzQjApOworCS8qIE11bHRpY2FzdCBSeCAqLworCWRldi0+c3RhdHMubXVsdGljYXN0ID0gcmVhZGwoaW9hZGRyICsgMHgzMjApOwogCi0JaG1wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzCT0gcmVhZGwoaW9hZGRyICsgMHgzNjgpOyAvKiBPdmVyK1VuZGVyc2l6ZWQgKi8KLQlobXAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzCT0gcmVhZGwoaW9hZGRyICsgMHgzNUMpOyAvKiBKYWJiZXIgKi8KLQlobXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMJPSByZWFkbChpb2FkZHIgKyAweDM2MCk7IC8qIEphYmJlciAqLwotCWhtcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzCT0gcmVhZGwoaW9hZGRyICsgMHgzNjQpOyAvKiBTeW1ib2wgRXJycyAqLwotCWhtcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycwk9IHJlYWRsKGlvYWRkciArIDB4MzZDKTsgLyogRHJvcHBlZCAqLworCS8qIE92ZXIrVW5kZXJzaXplZCAqLworCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4MzY4KTsKKwkvKiBKYWJiZXIgKi8KKwlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHgzNUMpOworCS8qIEphYmJlciAqLworCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4MzYwKTsKKwkvKiBTeW1ib2wgRXJycyAqLworCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHgzNjQpOworCS8qIERyb3BwZWQgKi8KKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSByZWFkbChpb2FkZHIgKyAweDM2Qyk7CiAKLQlyZXR1cm4gJmhtcC0+c3RhdHM7CisJcmV0dXJuICZkZXYtPnN0YXRzOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggNjhlNWFjOC4uMDk1YjE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0xNjgsNyArMTY4LDYgQEAKIAl1X2NoYXIgbWFjMV9tb2RlOwogCXVfY2hhciBtYWMyX21vZGU7CiAJdV9jaGFyIGhhc2hfYnl0ZXNbOF07Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAKIAkvKiBSaW5ncyBmb3IgYnVzbWFzdGVyIG1vZGU6ICovCiAJaHAxMDBfcmluZ190ICpyeHJoZWFkOwkvKiBIZWFkIChvbGRlc3QpIGluZGV4IGludG8gcnhyaW5nICovCkBAIC03MjEsOSArNzIwLDEwIEBACiAJCS8qIENvbnZlcnNpb24gdG8gbmV3IFBDSSBBUEkgOgogCQkgKiBQYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYW5kIHplcm9lZCwgbm8gbmVlZCB0byBpdCBvdXJzZWxmLgogCQkgKiBEb2Mgc2F5cyBzaG91bGQgYmUgT0sgZm9yIEVJU0EgYnVzIGFzIHdlbGwgLSBKZWFuIElJICovCi0JCWlmICgobHAtPnBhZ2VfdmFkZHJfYWxnbiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBNQVhfUklOR1NJWkUsICZwYWdlX2JhZGRyKSkgPT0gTlVMTCkgeworCQlscC0+cGFnZV92YWRkcl9hbGduID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIE1BWF9SSU5HU0laRSwgJnBhZ2VfYmFkZHIpOworCQlpZiAoIWxwLT5wYWdlX3ZhZGRyX2FsZ24pIHsKIAkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDI7CisJCQlnb3RvIG91dF9tZW1fcHRyOwogCQl9CiAJCWxwLT53aGF0ZXZlcl9vZmZzZXQgPSAoKHVfbG9uZykgcGFnZV9iYWRkcikgLSAoKHVfbG9uZykgbHAtPnBhZ2VfdmFkZHJfYWxnbik7CiAKQEAgLTc5OSw2ICs3OTksNyBAQAogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBNQVhfUklOR1NJWkUgKyAweDBmLAogCQkJCSAgICBscC0+cGFnZV92YWRkcl9hbGduLAogCQkJCSAgICB2aXJ0X3RvX3doYXRldmVyKGRldiwgbHAtPnBhZ2VfdmFkZHJfYWxnbikpOworb3V0X21lbV9wdHI6CiAJaWYgKG1lbV9wdHJfdmlydCkKIAkJaW91bm1hcChtZW1fcHRyX3ZpcnQpOwogb3V0MjoKQEAgLTEwNzEsNyArMTA3Miw3IEBACiAJaWYgKGxwLT5tb2RlID09IDEpCiAJCWhwMTAwX2luaXRfcGRscyhkZXYpOwogCi0JLyogR28gdG8gcGVyZm9ybWFuY2UgcGFnZSBhbmQgaW5pdGFsaXplIGlzciBhbmQgaW1yIHJlZ2lzdGVycyAqLworCS8qIEdvIHRvIHBlcmZvcm1hbmNlIHBhZ2UgYW5kIGluaXRpYWxpemUgaXNyIGFuZCBpbXIgcmVnaXN0ZXJzICovCiAJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CiAJaHAxMDBfb3V0dygweGZlZmUsIElSUV9NQVNLKTsJLyogbWFzayBvZmYgYWxsIGludHMgKi8KIAlocDEwMF9vdXR3KDB4ZmZmZiwgSVJRX1NUQVRVUyk7CS8qIGFjayBJUlEgKi8KQEAgLTE1ODIsOCArMTU4Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAogCS8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCi0JbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXJldHVybiBORVRERVZfVFhfT0s7CiAKQEAgLTE3NDAsOCArMTc0MSw4IEBACiAKIAlocDEwMF9vdXRiKEhQMTAwX1RYX0NNRCB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX01TVyk7CS8qIHNlbmQgcGFja2V0ICovCiAKLQlscC0+c3RhdHMudHhfcGFja2V0cysrOwotCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCWhwMTAwX2ludHNfb24oKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOwogCkBAIC0xODIyLDcgKzE4MjMsNyBAQAogCQkJcHJpbnRrKCJocDEwMDogJXM6IHJ4OiBjb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZFxuIiwKIAkJCQkJICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOwogI2VuZGlmCi0JCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCX0gZWxzZSB7CS8qIHNrYiBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkICovCiAKIAkJCXVfY2hhciAqcHRyOwpAQCAtMTg0OCw4ICsxODQ5LDggQEAKIAkJCQkJcHRyWzldLCBwdHJbMTBdLCBwdHJbMTFdKTsKICNlbmRpZgogCQkJbmV0aWZfcngoc2tiKTsKLQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwogCQl9CiAKIAkJLyogSW5kaWNhdGUgdGhlIGNhcmQgdGhhdCB3ZSBoYXZlIGdvdCB0aGUgcGFja2V0ICovCkBAIC0xODU4LDcgKzE4NTksNyBAQAogCQlzd2l0Y2ggKGhlYWRlciAmIDB4MDAwNzAwMDApIHsKIAkJY2FzZSAoSFAxMDBfTVVMVElfQUREUl9IQVNIIDw8IDE2KToKIAkJY2FzZSAoSFAxMDBfTVVMVElfQUREUl9OT19IQVNIIDw8IDE2KToKLQkJCWxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKKwkJCWRldi0+c3RhdHMubXVsdGljYXN0Kys7CiAJCQlicmVhazsKIAkJfQogCX0JCQkvKiBlbmQgb2Ygd2hpbGUodGhlcmUgYXJlIHBhY2tldHMpIGxvb3AgKi8KQEAgLTE5MzAsNyArMTkzMSw3IEBACiAJCQlpZiAocHRyLT5za2IgPT0gTlVMTCkgewogCQkJCXByaW50aygiaHAxMDA6ICVzOiByeF9ibTogc2tiIG51bGxcbiIsIGRldi0+bmFtZSk7CiAJCQkJLyogY2FuIGhhcHBlbiBpZiB3ZSBvbmx5IGFsbG9jYXRlZCByb29tIGZvciB0aGUgcGRoIGR1ZSB0byBtZW1vcnkgc2hvcnRhZ2UuICovCi0JCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCX0gZWxzZSB7CiAJCQkJc2tiX3RyaW0ocHRyLT5za2IsIHBrdF9sZW4pOwkvKiBTaG9ydGVuIGl0ICovCiAJCQkJcHRyLT5za2ItPnByb3RvY29sID0KQEAgLTE5MzgsMTQgKzE5MzksMTQgQEAKIAogCQkJCW5ldGlmX3J4KHB0ci0+c2tiKTsJLyogVXAgYW5kIGF3YXkuLi4gKi8KIAotCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwogCQkJfQogCiAJCQlzd2l0Y2ggKGhlYWRlciAmIDB4MDAwNzAwMDApIHsKIAkJCWNhc2UgKEhQMTAwX01VTFRJX0FERFJfSEFTSCA8PCAxNik6CiAJCQljYXNlIChIUDEwMF9NVUxUSV9BRERSX05PX0hBU0ggPDwgMTYpOgotCQkJCWxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKKwkJCQlkZXYtPnN0YXRzLm11bHRpY2FzdCsrOwogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTk1NCw3ICsxOTU1LDcgQEAKICNlbmRpZgogCQkJaWYgKHB0ci0+c2tiICE9IE5VTEwpCiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHRyLT5za2IpOwotCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJfQogCiAJCWxwLT5yeHJoZWFkID0gbHAtPnJ4cmhlYWQtPm5leHQ7CkBAIC0xOTkyLDE0ICsxOTkzLDEzIEBACiAJaHAxMDBfdXBkYXRlX3N0YXRzKGRldik7CiAJaHAxMDBfaW50c19vbigpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuICYobHAtPnN0YXRzKTsKKwlyZXR1cm4gJihkZXYtPnN0YXRzKTsKIH0KIAogc3RhdGljIHZvaWQgaHAxMDBfdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwogCXVfc2hvcnQgdmFsOwotCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKICNpZmRlZiBIUDEwMF9ERUJVR19CCiAJaHAxMDBfb3V0dygweDQyMTYsIFRSQUNFKTsKQEAgLTIwMDksMTQgKzIwMDksMTQgQEAKIAkvKiBOb3RlOiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNsZWFyIHdoZW4gcmVhZC4gKi8KIAlocDEwMF9wYWdlKE1BQ19DVFJMKTsKIAl2YWwgPSBocDEwMF9pbncoRFJPUFBFRCkgJiAweDBmZmY7Ci0JbHAtPnN0YXRzLnJ4X2Vycm9ycyArPSB2YWw7Ci0JbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICs9IHZhbDsKKwlkZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSB2YWw7CisJZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSB2YWw7CiAJdmFsID0gaHAxMDBfaW5iKENSQyk7Ci0JbHAtPnN0YXRzLnJ4X2Vycm9ycyArPSB2YWw7Ci0JbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gdmFsOworCWRldi0+c3RhdHMucnhfZXJyb3JzICs9IHZhbDsKKwlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gdmFsOwogCXZhbCA9IGhwMTAwX2luYihBQk9SVCk7Ci0JbHAtPnN0YXRzLnR4X2Vycm9ycyArPSB2YWw7Ci0JbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHZhbDsKKwlkZXYtPnN0YXRzLnR4X2Vycm9ycyArPSB2YWw7CisJZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSB2YWw7CiAJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CiB9CiAKQEAgLTIwMjUsNyArMjAyNSw2IEBACiAjaWZkZWYgSFAxMDBfREVCVUdfQgogCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKICNlbmRpZgotCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKICNpZmRlZiBIUDEwMF9ERUJVR19CCiAJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtMjAzNCw4ICsyMDMzLDggQEAKICNlbmRpZgogCiAJLyogTm90ZTogU3RhdGlzdGljcyBjb3VudGVycyBjbGVhciB3aGVuIHJlYWQuICovCi0JbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiB9CiAKIHN0YXRpYyB2b2lkIGhwMTAwX2NsZWFyX3N0YXRzKHN0cnVjdCBocDEwMF9wcml2YXRlICpscCwgaW50IGlvYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYwppbmRleCBiMTUwYzEwLi5lZWVjN2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCkBAIC0xMDQ1LDcgKzEwNDUsNyBAQAogCURCRyhkZXYsICJjaGFuZ2VfbXR1KCVkKSIgTkwsIG5ld19tdHUpOwogCiAJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKLQkJLyogQ2hlY2sgaWYgd2UgcmVhbGx5IG5lZWQgdG8gcmVpbml0YWxpemUgUlggcmluZyAqLworCQkvKiBDaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0byByZWluaXRpYWxpemUgUlggcmluZyAqLwogCQlpZiAoZW1hY19yeF9za2Jfc2l6ZShuZGV2LT5tdHUpICE9IGVtYWNfcnhfc2tiX3NpemUobmV3X210dSkpCiAJCQlyZXQgPSBlbWFjX3Jlc2l6ZV9yeF9yaW5nKGRldiwgbmV3X210dSk7CiAJfQpAQCAtMjMzOSwxMSArMjMzOSwxMSBAQAogCQlkZXBzW0VNQUNfREVQX01ESU9fSURYXS5waGFuZGxlID0gZGV2LT5tZGlvX3BoOwogCWlmIChkZXYtPmJsaXN0ICYmIGRldi0+Ymxpc3QgPiBlbWFjX2Jvb3RfbGlzdCkKIAkJZGVwc1tFTUFDX0RFUF9QUkVWX0lEWF0ucGhhbmRsZSA9IDB4ZmZmZmZmZmZ1OwotCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICZlbWFjX29mX2J1c19ub3RpZmllcik7CisJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJmVtYWNfb2ZfYnVzX25vdGlmaWVyKTsKIAl3YWl0X2V2ZW50X3RpbWVvdXQoZW1hY19wcm9iZV93YWl0LAogCQkJICAgZW1hY19jaGVja19kZXBzKGRldiwgZGVwcyksCiAJCQkgICBFTUFDX1BST0JFX0RFUF9USU1FT1VUKTsKLQlidXNfdW5yZWdpc3Rlcl9ub3RpZmllcigmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsICZlbWFjX29mX2J1c19ub3RpZmllcik7CisJYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmZW1hY19vZl9idXNfbm90aWZpZXIpOwogCWVyciA9IGVtYWNfY2hlY2tfZGVwcyhkZXYsIGRlcHMpID8gMCA6IC1FTk9ERVY7CiAJZm9yIChpID0gMDsgaSA8IEVNQUNfREVQX0NPVU5UOyBpKyspIHsKIAkJaWYgKGRlcHNbaV0ubm9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF84MjU3NS5jIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwXzgyNTc1LmMKaW5kZXggODY0MzhiNS4uMTg3NjIyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwXzgyNTc1LmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwXzgyNTc1LmMKQEAgLTYzLDYgKzYzLDcgQEAKIHN0YXRpYyBzMzIgIGlnYl9yZXNldF9pbml0X3NjcmlwdF84MjU3NShzdHJ1Y3QgZTEwMDBfaHcgKik7CiBzdGF0aWMgczMyICBpZ2JfcmVhZF9tYWNfYWRkcl84MjU3NShzdHJ1Y3QgZTEwMDBfaHcgKik7CiBzdGF0aWMgczMyICBpZ2Jfc2V0X3BjaWVfY29tcGxldGlvbl90aW1lb3V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHMzMiAgaWdiX3Jlc2V0X21kaWNuZmdfODI1ODAoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKIHN0YXRpYyBjb25zdCB1MTYgZTEwMDBfODI1ODBfcnhwYnNfdGFibGVbXSA9CiAJeyAzNiwgNzIsIDE0NCwgMSwgMiwgNCwgOCwgMTYsCkBAIC03MCw2ICs3MSwzNSBAQAogI2RlZmluZSBFMTAwMF84MjU4MF9SWFBCU19UQUJMRV9TSVpFIFwKIAkoc2l6ZW9mKGUxMDAwXzgyNTgwX3J4cGJzX3RhYmxlKS9zaXplb2YodTE2KSkKIAorLyoqCisgKiAgaWdiX3NnbWlpX3VzZXNfbWRpb184MjU3NSAtIERldGVybWluZSBpZiBJMkMgcGlucyBhcmUgZm9yIGV4dGVybmFsIE1ESU8KKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICoKKyAqICBDYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBJMkMgcGlucyBhcmUgYmVpbmcgdXNlZCBmb3IgSTJDIG9yIGFzIGFuCisgKiAgZXh0ZXJuYWwgTURJTyBpbnRlcmZhY2Ugc2luY2UgdGhlIHR3byBvcHRpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisgKiovCitzdGF0aWMgYm9vbCBpZ2Jfc2dtaWlfdXNlc19tZGlvXzgyNTc1KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdTMyIHJlZyA9IDA7CisJYm9vbCBleHRfbWRpbyA9IGZhbHNlOworCisJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTc1OgorCWNhc2UgZTEwMDBfODI1NzY6CisJCXJlZyA9IHJkMzIoRTEwMDBfTURJQyk7CisJCWV4dF9tZGlvID0gISEocmVnICYgRTEwMDBfTURJQ19ERVNUKTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU4MDoKKwljYXNlIGUxMDAwX2kzNTA6CisJCXJlZyA9IHJkMzIoRTEwMDBfTURJQ05GRyk7CisJCWV4dF9tZGlvID0gISEocmVnICYgRTEwMDBfTURJQ05GR19FWFRfTURJTyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXh0X21kaW87Cit9CisKIHN0YXRpYyBzMzIgaWdiX2dldF9pbnZhcmlhbnRzXzgyNTc1KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAJc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHkgPSAmaHctPnBoeTsKQEAgLTEzMCwyNyArMTYwLDE1IEBACiAJc3dpdGNoIChjdHJsX2V4dCAmIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLKSB7CiAJY2FzZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfU0dNSUk6CiAJCWRldl9zcGVjLT5zZ21paV9hY3RpdmUgPSB0cnVlOwotCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0kyQ19FTkE7CiAJCWJyZWFrOwogCWNhc2UgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFXzEwMDBCQVNFX0tYOgogCWNhc2UgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX1BDSUVfU0VSREVTOgogCQlody0+cGh5Lm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczsKLQkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9JMkNfRU5BOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQljdHJsX2V4dCAmPSB+RTEwMDBfQ1RSTF9JMkNfRU5BOwogCQlicmVhazsKIAl9CiAKLQl3cjMyKEUxMDAwX0NUUkxfRVhULCBjdHJsX2V4dCk7Ci0KLQkvKgotCSAqIGlmIHVzaW5nIGkyYyBtYWtlIGNlcnRhaW4gdGhlIE1ESUNORkcgcmVnaXN0ZXIgaXMgY2xlYXJlZCB0byBwcmV2ZW50Ci0JICogY29tbXVuaWNhdGlvbnMgZnJvbSBiZWluZyBtaXNyb3V0ZWQgdG8gdGhlIG1kaWMgcmVnaXN0ZXJzCi0JICovCi0JaWYgKChjdHJsX2V4dCAmIEUxMDAwX0NUUkxfSTJDX0VOQSkgJiYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU4MCkpCi0JCXdyMzIoRTEwMDBfTURJQ05GRywgMCk7Ci0KIAkvKiBTZXQgbXRhIHJlZ2lzdGVyIGNvdW50ICovCiAJbWFjLT5tdGFfcmVnX2NvdW50ID0gMTI4OwogCS8qIFNldCByYXIgZW50cnkgY291bnQgKi8KQEAgLTIyOCwxOSArMjQ2LDI5IEBACiAJcGh5LT5hdXRvbmVnX21hc2sgICAgICAgID0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKIAlwaHktPnJlc2V0X2RlbGF5X3VzICAgICAgPSAxMDA7CiAKKwljdHJsX2V4dCA9IHJkMzIoRTEwMDBfQ1RSTF9FWFQpOworCiAJLyogUEhZIGZ1bmN0aW9uIHBvaW50ZXJzICovCiAJaWYgKGlnYl9zZ21paV9hY3RpdmVfODI1NzUoaHcpKSB7Ci0JCXBoeS0+b3BzLnJlc2V0ICAgICAgICAgICAgICA9IGlnYl9waHlfaHdfcmVzZXRfc2dtaWlfODI1NzU7Ci0JCXBoeS0+b3BzLnJlYWRfcmVnICAgICAgICAgICA9IGlnYl9yZWFkX3BoeV9yZWdfc2dtaWlfODI1NzU7Ci0JCXBoeS0+b3BzLndyaXRlX3JlZyAgICAgICAgICA9IGlnYl93cml0ZV9waHlfcmVnX3NnbWlpXzgyNTc1OwotCX0gZWxzZSBpZiAoaHctPm1hYy50eXBlID49IGUxMDAwXzgyNTgwKSB7Ci0JCXBoeS0+b3BzLnJlc2V0ICAgICAgICAgICAgICA9IGlnYl9waHlfaHdfcmVzZXQ7Ci0JCXBoeS0+b3BzLnJlYWRfcmVnICAgICAgICAgICA9IGlnYl9yZWFkX3BoeV9yZWdfODI1ODA7Ci0JCXBoeS0+b3BzLndyaXRlX3JlZyAgICAgICAgICA9IGlnYl93cml0ZV9waHlfcmVnXzgyNTgwOworCQlwaHktPm9wcy5yZXNldCAgICAgID0gaWdiX3BoeV9od19yZXNldF9zZ21paV84MjU3NTsKKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9JMkNfRU5BOwogCX0gZWxzZSB7Ci0JCXBoeS0+b3BzLnJlc2V0ICAgICAgICAgICAgICA9IGlnYl9waHlfaHdfcmVzZXQ7Ci0JCXBoeS0+b3BzLnJlYWRfcmVnICAgICAgICAgICA9IGlnYl9yZWFkX3BoeV9yZWdfaWdwOwotCQlwaHktPm9wcy53cml0ZV9yZWcgICAgICAgICAgPSBpZ2Jfd3JpdGVfcGh5X3JlZ19pZ3A7CisJCXBoeS0+b3BzLnJlc2V0ICAgICAgPSBpZ2JfcGh5X2h3X3Jlc2V0OworCQljdHJsX2V4dCAmPSB+RTEwMDBfQ1RSTF9JMkNfRU5BOworCX0KKworCXdyMzIoRTEwMDBfQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwlpZ2JfcmVzZXRfbWRpY25mZ184MjU4MChodyk7CisKKwlpZiAoaWdiX3NnbWlpX2FjdGl2ZV84MjU3NShodykgJiYgIWlnYl9zZ21paV91c2VzX21kaW9fODI1NzUoaHcpKSB7CisJCXBoeS0+b3BzLnJlYWRfcmVnICAgPSBpZ2JfcmVhZF9waHlfcmVnX3NnbWlpXzgyNTc1OworCQlwaHktPm9wcy53cml0ZV9yZWcgID0gaWdiX3dyaXRlX3BoeV9yZWdfc2dtaWlfODI1NzU7CisJfSBlbHNlIGlmIChody0+bWFjLnR5cGUgPj0gZTEwMDBfODI1ODApIHsKKwkJcGh5LT5vcHMucmVhZF9yZWcgICA9IGlnYl9yZWFkX3BoeV9yZWdfODI1ODA7CisJCXBoeS0+b3BzLndyaXRlX3JlZyAgPSBpZ2Jfd3JpdGVfcGh5X3JlZ184MjU4MDsKKwl9IGVsc2UgeworCQlwaHktPm9wcy5yZWFkX3JlZyAgID0gaWdiX3JlYWRfcGh5X3JlZ19pZ3A7CisJCXBoeS0+b3BzLndyaXRlX3JlZyAgPSBpZ2Jfd3JpdGVfcGh5X3JlZ19pZ3A7CiAJfQogCiAJLyogc2V0IGxhbiBpZCAqLwpAQCAtMjk1LDYgKzMyMywxMCBAQAogCiAJaWYgKGh3LT5idXMuZnVuYyA9PSBFMTAwMF9GVU5DXzEpCiAJCW1hc2sgPSBFMTAwMF9TV0ZXX1BIWTFfU007CisJZWxzZSBpZiAoaHctPmJ1cy5mdW5jID09IEUxMDAwX0ZVTkNfMikKKwkJbWFzayA9IEUxMDAwX1NXRldfUEhZMl9TTTsKKwllbHNlIGlmIChody0+YnVzLmZ1bmMgPT0gRTEwMDBfRlVOQ18zKQorCQltYXNrID0gRTEwMDBfU1dGV19QSFkzX1NNOwogCiAJcmV0dXJuIGlnYl9hY3F1aXJlX3N3Zndfc3luY184MjU3NShodywgbWFzayk7CiB9CkBAIC0zMTIsNiArMzQ0LDEwIEBACiAKIAlpZiAoaHctPmJ1cy5mdW5jID09IEUxMDAwX0ZVTkNfMSkKIAkJbWFzayA9IEUxMDAwX1NXRldfUEhZMV9TTTsKKwllbHNlIGlmIChody0+YnVzLmZ1bmMgPT0gRTEwMDBfRlVOQ18yKQorCQltYXNrID0gRTEwMDBfU1dGV19QSFkyX1NNOworCWVsc2UgaWYgKGh3LT5idXMuZnVuYyA9PSBFMTAwMF9GVU5DXzMpCisJCW1hc2sgPSBFMTAwMF9TV0ZXX1BIWTNfU007CiAKIAlpZ2JfcmVsZWFzZV9zd2Z3X3N5bmNfODI1NzUoaHcsIG1hc2spOwogfQpAQCAtMzkyLDYgKzQyOCw3IEBACiAJczMyICByZXRfdmFsID0gMDsKIAl1MTYgcGh5X2lkOwogCXUzMiBjdHJsX2V4dDsKKwl1MzIgbWRpYzsKIAogCS8qCiAJICogRm9yIFNHTUlJIFBIWXMsIHdlIHRyeSB0aGUgbGlzdCBvZiBwb3NzaWJsZSBhZGRyZXNzZXMgdW50aWwKQEAgLTQwNiw2ICs0NDMsMjkgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKGlnYl9zZ21paV91c2VzX21kaW9fODI1NzUoaHcpKSB7CisJCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CisJCWNhc2UgZTEwMDBfODI1NzU6CisJCWNhc2UgZTEwMDBfODI1NzY6CisJCQltZGljID0gcmQzMihFMTAwMF9NRElDKTsKKwkJCW1kaWMgJj0gRTEwMDBfTURJQ19QSFlfTUFTSzsKKwkJCXBoeS0+YWRkciA9IG1kaWMgPj4gRTEwMDBfTURJQ19QSFlfU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSBlMTAwMF84MjU4MDoKKwkJY2FzZSBlMTAwMF9pMzUwOgorCQkJbWRpYyA9IHJkMzIoRTEwMDBfTURJQ05GRyk7CisJCQltZGljICY9IEUxMDAwX01ESUNORkdfUEhZX01BU0s7CisJCQlwaHktPmFkZHIgPSBtZGljID4+IEUxMDAwX01ESUNORkdfUEhZX1NISUZUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXRfdmFsID0gLUUxMDAwX0VSUl9QSFk7CisJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQl9CisJCXJldF92YWwgPSBpZ2JfZ2V0X3BoeV9pZChodyk7CisJCWdvdG8gb3V0OworCX0KKwogCS8qIFBvd2VyIG9uIHNnbWlpIHBoeSBpZiBpdCBpcyBkaXNhYmxlZCAqLwogCWN0cmxfZXh0ID0gcmQzMihFMTAwMF9DVFJMX0VYVCk7CiAJd3IzMihFMTAwMF9DVFJMX0VYVCwgY3RybF9leHQgJiB+RTEwMDBfQ1RSTF9FWFRfU0RQM19EQVRBKTsKQEAgLTE0OTMsNiArMTU1Myw0MyBAQAogfQogCiAvKioKKyAqICBpZ2JfcmVzZXRfbWRpY25mZ184MjU4MCAtIFJlc2V0IE1ESUNORkcgZGVzdGluYXRpb24gYW5kIGNvbV9tZGlvIGJpdHMKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICoKKyAqICBUaGlzIHJlc2V0cyB0aGUgdGhlIE1ESUNORkcuRGVzdGluYXRpb24gYW5kIE1ESUNORkcuQ29tX01ESU8gYml0cyBiYXNlZCBvbgorICogIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIEVFUFJPTS4gIFRoaXMgYWRkcmVzc2VzIGFuIGlzc3VlIGluIHdoaWNoIHRoZXNlCisgKiAgYml0cyBhcmUgbm90IHJlc3RvcmVkIGZyb20gRUVQUk9NIGFmdGVyIHJlc2V0LgorICoqLworc3RhdGljIHMzMiBpZ2JfcmVzZXRfbWRpY25mZ184MjU4MChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXMzMiByZXRfdmFsID0gMDsKKwl1MzIgbWRpY25mZzsKKwl1MTYgbnZtX2RhdGE7CisKKwlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwXzgyNTgwKQorCQlnb3RvIG91dDsKKwlpZiAoIWlnYl9zZ21paV9hY3RpdmVfODI1NzUoaHcpKQorCQlnb3RvIG91dDsKKworCXJldF92YWwgPSBody0+bnZtLm9wcy5yZWFkKGh3LCBOVk1fSU5JVF9DT05UUk9MM19QT1JUX0EgKworCQkJCSAgIE5WTV84MjU4MF9MQU5fRlVOQ19PRkZTRVQoaHctPmJ1cy5mdW5jKSwgMSwKKwkJCQkgICAmbnZtX2RhdGEpOworCWlmIChyZXRfdmFsKSB7CisJCWh3X2RiZygiTlZNIFJlYWQgRXJyb3JcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwltZGljbmZnID0gcmQzMihFMTAwMF9NRElDTkZHKTsKKwlpZiAobnZtX2RhdGEgJiBOVk1fV09SRDI0X0VYVF9NRElPKQorCQltZGljbmZnIHw9IEUxMDAwX01ESUNORkdfRVhUX01ESU87CisJaWYgKG52bV9kYXRhICYgTlZNX1dPUkQyNF9DT01fTURJTykKKwkJbWRpY25mZyB8PSBFMTAwMF9NRElDTkZHX0NPTV9NRElPOworCXdyMzIoRTEwMDBfTURJQ05GRywgbWRpY25mZyk7CitvdXQ6CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgogICogIGlnYl9yZXNldF9od184MjU4MCAtIFJlc2V0IGhhcmR3YXJlCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqCkBAIC0xNTY3LDYgKzE2NjQsMTAgQEAKIAl3cjMyKEUxMDAwX0lNQywgMHhmZmZmZmZmZik7CiAJaWNyID0gcmQzMihFMTAwMF9JQ1IpOwogCisJcmV0X3ZhbCA9IGlnYl9yZXNldF9tZGljbmZnXzgyNTgwKGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJaHdfZGJnKCJDb3VsZCBub3QgcmVzZXQgTURJQ05GRyBiYXNlZCBvbiBFRVBST01cbiIpOworCiAJLyogSW5zdGFsbCBhbnkgYWx0ZXJuYXRlIE1BQyBhZGRyZXNzIGludG8gUkFSMCAqLwogCXJldF92YWwgPSBpZ2JfY2hlY2tfYWx0X21hY19hZGRyKGh3KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2RlZmluZXMuaCBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9kZWZpbmVzLmgKaW5kZXggMjRkOWJlNi4uYmJkMmVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2RlZmluZXMuaAorKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfZGVmaW5lcy5oCkBAIC0xNjQsNiArMTY0LDggQEAKICNkZWZpbmUgRTEwMDBfU1dGV19FRVBfU00gICAweDEKICNkZWZpbmUgRTEwMDBfU1dGV19QSFkwX1NNICAweDIKICNkZWZpbmUgRTEwMDBfU1dGV19QSFkxX1NNICAweDQKKyNkZWZpbmUgRTEwMDBfU1dGV19QSFkyX1NNICAweDIwCisjZGVmaW5lIEUxMDAwX1NXRldfUEhZM19TTSAgMHg0MAogCiAvKiBGQUNUUFMgRGVmaW5pdGlvbnMgKi8KIC8qIERldmljZSBDb250cm9sICovCkBAIC00NjYsNiArNDY4LDExIEBACiAKICNkZWZpbmUgRTEwMDBfVElNSU5DQV8xNk5TX1NISUZUIDI0CiAKKyNkZWZpbmUgRTEwMDBfTURJQ05GR19FWFRfTURJTyAgICAweDgwMDAwMDAwICAgICAgLyogTURJIGV4dC9pbnQgZGVzdGluYXRpb24gKi8KKyNkZWZpbmUgRTEwMDBfTURJQ05GR19DT01fTURJTyAgICAweDQwMDAwMDAwICAgICAgLyogTURJIHNoYXJlZCB3LyBsYW4gMCAqLworI2RlZmluZSBFMTAwMF9NRElDTkZHX1BIWV9NQVNLICAgIDB4MDNFMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ05GR19QSFlfU0hJRlQgICAyMQorCiAvKiBQQ0kgRXhwcmVzcyBDb250cm9sICovCiAjZGVmaW5lIEUxMDAwX0dDUl9DTVBMX1RNT1VUX01BU0sgICAgICAgMHgwMDAwRjAwMAogI2RlZmluZSBFMTAwMF9HQ1JfQ01QTF9UTU9VVF8xMG1zICAgICAgIDB4MDAwMDEwMDAKQEAgLTU2Myw2ICs1NzAsMTAgQEAKIAogI2RlZmluZSBOVk1fODI1ODBfTEFOX0ZVTkNfT0ZGU0VUKGEpIChhID8gKDB4NDAgKyAoMHg0MCAqIGEpKSA6IDApCiAKKy8qIE1hc2sgYml0cyBmb3IgZmllbGRzIGluIFdvcmQgMHgyNCBvZiB0aGUgTlZNICovCisjZGVmaW5lIE5WTV9XT1JEMjRfQ09NX01ESU8gICAgICAgICAweDAwMDggLyogTURJTyBpbnRlcmZhY2Ugc2hhcmVkICovCisjZGVmaW5lIE5WTV9XT1JEMjRfRVhUX01ESU8gICAgICAgICAweDAwMDQgLyogTURJTyBhY2Nlc3NlcyByb3V0ZWQgZXh0ZXJuYWwgKi8KKwogLyogTWFzayBiaXRzIGZvciBmaWVsZHMgaW4gV29yZCAweDBmIG9mIHRoZSBOVk0gKi8KICNkZWZpbmUgTlZNX1dPUkQwRl9QQVVTRV9NQVNLICAgICAgIDB4MzAwMAogI2RlZmluZSBOVk1fV09SRDBGX0FTTV9ESVIgICAgICAgICAgMHgyMDAwCkBAIC02OTYsMTIgKzcwNywxNyBAQAogI2RlZmluZSBNODhFQzAxOF9FUFNDUl9ET1dOU0hJRlRfQ09VTlRFUl81WCAgICAweDA4MDAKIAogLyogTURJIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTURJQ19EQVRBX01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBFMTAwMF9NRElDX1JFR19NQVNLICAweDAwMUYwMDAwCiAjZGVmaW5lIEUxMDAwX01ESUNfUkVHX1NISUZUIDE2CisjZGVmaW5lIEUxMDAwX01ESUNfUEhZX01BU0sgIDB4MDNFMDAwMDAKICNkZWZpbmUgRTEwMDBfTURJQ19QSFlfU0hJRlQgMjEKICNkZWZpbmUgRTEwMDBfTURJQ19PUF9XUklURSAgMHgwNDAwMDAwMAogI2RlZmluZSBFMTAwMF9NRElDX09QX1JFQUQgICAweDA4MDAwMDAwCiAjZGVmaW5lIEUxMDAwX01ESUNfUkVBRFkgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19JTlRfRU4gICAgMHgyMDAwMDAwMAogI2RlZmluZSBFMTAwMF9NRElDX0VSUk9SICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfREVTVCAgICAgIDB4ODAwMDAwMDAKIAogLyogU2VyRGVzIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfR0VOX0NUTF9SRUFEWSAgICAgICAgICAgICAweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfZXRodG9vbC5jCmluZGV4IGYyZWJmOTI3Li4yNmJmNmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYwpAQCAtMTgyMywxMiArMTgyMywxMCBAQAogCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAib25saW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOwogCiAJCS8qIFBIWSBpcyBwb3dlcmVkIGRvd24gd2hlbiBpbnRlcmZhY2UgaXMgZG93biAqLwotCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlpZiAoaWZfcnVubmluZyAmJiBpZ2JfbGlua190ZXN0KGFkYXB0ZXIsICZkYXRhWzRdKSkKKwkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisJCWVsc2UKIAkJCWRhdGFbNF0gPSAwOwotCQl9IGVsc2UgewotCQkJaWYgKGlnYl9saW5rX3Rlc3QoYWRhcHRlciwgJmRhdGFbNF0pKQotCQkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7Ci0JCX0KIAogCQkvKiBPbmxpbmUgdGVzdHMgYXJlbid0IHJ1bjsgcGFzcyBieSBkZWZhdWx0ICovCiAJCWRhdGFbMF0gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwppbmRleCAzODgxOTE4Li5kZjVkY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwpAQCAtNjMwLDkgKzYzMCw2IEBACiAJCQlmb3IgKDsgaSA8IGFkYXB0ZXItPnJzc19xdWV1ZXM7IGkrKykKIAkJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLT5yZWdfaWR4ID0gcmJhc2Vfb2Zmc2V0ICsKIAkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUV9JRFhfODI1NzYoaSk7Ci0JCQlmb3IgKDsgaiA8IGFkYXB0ZXItPnJzc19xdWV1ZXM7IGorKykKLQkJCQlhZGFwdGVyLT50eF9yaW5nW2pdLT5yZWdfaWR4ID0gcmJhc2Vfb2Zmc2V0ICsKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUV9JRFhfODI1NzYoaik7CiAJCX0KIAljYXNlIGUxMDAwXzgyNTc1OgogCWNhc2UgZTEwMDBfODI1ODA6CkBAIC05OTYsNyArOTkzLDEwIEBACiAKIAkvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHF1ZXVlcy4gKi8KIAlhZGFwdGVyLT5udW1fcnhfcXVldWVzID0gYWRhcHRlci0+cnNzX3F1ZXVlczsKLQlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gYWRhcHRlci0+cnNzX3F1ZXVlczsKKwlpZiAoYWRhcHRlci0+dmZzX2FsbG9jYXRlZF9jb3VudCkKKwkJYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyA9IDE7CisJZWxzZQorCQlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gYWRhcHRlci0+cnNzX3F1ZXVlczsKIAogCS8qIHN0YXJ0IHdpdGggb25lIHZlY3RvciBmb3IgZXZlcnkgcnggcXVldWUgKi8KIAludW12ZWNzID0gYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsKQEAgLTEyOTAsNyArMTI5MCwxMyBAQAogCXdyMzIoRTEwMDBfSUFNLCAwKTsKIAl3cjMyKEUxMDAwX0lNQywgfjApOwogCXdyZmwoKTsKLQlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKKwlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3FfdmVjdG9yczsgaSsrKQorCQkJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS52ZWN0b3IpOworCX0gZWxzZSB7CisJCXN5bmNocm9uaXplX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworCX0KIH0KIAogLyoqCkBAIC0xNzIyLDYgKzE3MjgsMTUgQEAKIAl1MTYgZWVwcm9tX2FwbWVfbWFzayA9IElHQl9FRVBST01fQVBNRTsKIAl1MzIgcGFydF9udW07CiAKKwkvKiBDYXRjaCBicm9rZW4gaGFyZHdhcmUgdGhhdCBwdXQgdGhlIHdyb25nIFZGIGRldmljZSBJRCBpbgorCSAqIHRoZSBQQ0llIFNSLUlPViBjYXBhYmlsaXR5LgorCSAqLworCWlmIChwZGV2LT5pc192aXJ0Zm4pIHsKKwkJV0FSTigxLCBLRVJOX0VSUiAiJXMgKCVoeDolaHgpIHNob3VsZCBub3QgYmUgYSBWRiFcbiIsCisJCSAgICAgcGNpX25hbWUocGRldiksIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2VfbWVtKHBkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0yMDkxLDkgKzIxMDYsNiBAQAogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCi0JaWYgKGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQgPiA3KQotCQlhZGFwdGVyLT52ZnNfYWxsb2NhdGVkX2NvdW50ID0gNzsKLQogCWlmIChhZGFwdGVyLT52ZnNfYWxsb2NhdGVkX2NvdW50KSB7CiAJCWFkYXB0ZXItPnZmX2RhdGEgPSBrY2FsbG9jKGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdmZfZGF0YV9zdG9yYWdlKSwKQEAgLTIyNTgsNyArMjI3MCw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJX0lPVgogCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzYpCi0JCWFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQgPSBtYXhfdmZzOworCQlhZGFwdGVyLT52ZnNfYWxsb2NhdGVkX2NvdW50ID0gKG1heF92ZnMgPiA3KSA/IDcgOiBtYXhfdmZzOwogCiAjZW5kaWYgLyogQ09ORklHX1BDSV9JT1YgKi8KIAlhZGFwdGVyLT5yc3NfcXVldWVzID0gbWluX3QodTMyLCBJR0JfTUFYX1JYX1FVRVVFUywgbnVtX29ubGluZV9jcHVzKCkpOwpAQCAtMjcyMCwxNCArMjczMiwxNiBAQAogCX0KIAlpZ2Jfdm1tX2NvbnRyb2woYWRhcHRlcik7CiAKLQltcnFjIHw9IChFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY0IHwKLQkJIEUxMDAwX01SUUNfUlNTX0ZJRUxEX0lQVjRfVENQKTsKLQltcnFjIHw9IChFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY2IHwKLQkJIEUxMDAwX01SUUNfUlNTX0ZJRUxEX0lQVjZfVENQKTsKLQltcnFjIHw9IChFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY0X1VEUCB8Ci0JCSBFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY2X1VEUCk7Ci0JbXJxYyB8PSAoRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNl9VRFBfRVggfAotCQkgRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNl9UQ1BfRVgpOworCS8qCisJICogR2VuZXJhdGUgUlNTIGhhc2ggYmFzZWQgb24gVENQIHBvcnQgbnVtYmVycyBhbmQvb3IKKwkgKiBJUHY0L3Y2IHNyYyBhbmQgZHN0IGFkZHJlc3NlcyBzaW5jZSBVRFAgY2Fubm90IGJlCisJICogaGFzaGVkIHJlbGlhYmx5IGR1ZSB0byBJUCBmcmFnbWVudGF0aW9uCisJICovCisJbXJxYyB8PSBFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY0IHwKKwkJRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNF9UQ1AgfAorCQlFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY2IHwKKwkJRTEwMDBfTVJRQ19SU1NfRklFTERfSVBWNl9UQ1AgfAorCQlFMTAwMF9NUlFDX1JTU19GSUVMRF9JUFY2X1RDUF9FWDsKIAogCXdyMzIoRTEwMDBfTVJRQywgbXJxYyk7CiB9CkBAIC00OTc3LDYgKzQ5OTEsMTAgQEAKIAogc3RhdGljIGludCBpZ2Jfc2V0X3ZmX21hY19hZGRyKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwgdTMyICptc2csIGludCB2ZikKIHsKKwkvKgorCSAqIFRoZSBWRiBNQUMgQWRkcmVzcyBpcyBzdG9yZWQgaW4gYSBwYWNrZWQgYXJyYXkgb2YgYnl0ZXMKKwkgKiBzdGFydGluZyBhdCB0aGUgc2Vjb25kIDMyIGJpdCB3b3JkIG9mIHRoZSBtc2cgYXJyYXkKKwkgKi8KIAl1bnNpZ25lZCBjaGFyICphZGRyID0gKGNoYXIgKikmbXNnWzFdOwogCWludCBlcnIgPSAtMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9pZ2J2Zi9uZXRkZXYuYwppbmRleCA1ZTJiMmE4Li5lYzgwOGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2J2Zi9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9pZ2J2Zi9uZXRkZXYuYwpAQCAtNDgsNyArNDgsNyBAQAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4wLjAtazAiCiBjaGFyIGlnYnZmX2RyaXZlcl9uYW1lW10gPSAiaWdidmYiOwogY29uc3QgY2hhciBpZ2J2Zl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047Ci1zdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqaWdidmZfZHJpdmVyX3BtX3Fvc19yZXE7CitzdGF0aWMgc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3QgaWdidmZfZHJpdmVyX3BtX3Fvc19yZXE7CiBzdGF0aWMgY29uc3QgY2hhciBpZ2J2Zl9kcml2ZXJfc3RyaW5nW10gPQogCQkJCSJJbnRlbChSKSBWaXJ0dWFsIEZ1bmN0aW9uIE5ldHdvcmsgRHJpdmVyIjsKIHN0YXRpYyBjb25zdCBjaGFyIGlnYnZmX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4iOwpAQCAtMjc1MSw3ICsyNzUxLDcgQEAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwKIAkJCSAiUEYgc3RpbGwgaW4gcmVzZXQgc3RhdGUsIGFzc2lnbmluZyBuZXcgYWRkcmVzcy4iCiAJCQkgIiBJcyB0aGUgUEYgaW50ZXJmYWNlIHVwP1xuIik7Ci0JCXJhbmRvbV9ldGhlcl9hZGRyKGh3LT5tYWMuYWRkcik7CisJCWRldl9od19hZGRyX3JhbmRvbShhZGFwdGVyLT5uZXRkZXYsIGh3LT5tYWMuYWRkcik7CiAJfSBlbHNlIHsKIAkJZXJyID0gaHctPm1hYy5vcHMucmVhZF9tYWNfYWRkcihodyk7CiAJCWlmIChlcnIpIHsKQEAgLTI5MDIsOCArMjkwMiw4IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGlnYnZmX2NvcHlyaWdodCk7CiAKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpZ2J2Zl9kcml2ZXIpOwotCWlnYnZmX2RyaXZlcl9wbV9xb3NfcmVxID0gcG1fcW9zX2FkZF9yZXF1ZXN0KFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JICAgICAgICAgICAgICAgICAgICAgICBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CisJcG1fcW9zX2FkZF9yZXF1ZXN0KCZpZ2J2Zl9kcml2ZXJfcG1fcW9zX3JlcSwgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKKwkJCSAgIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yOTE4LDggKzI5MTgsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGlnYnZmX2V4aXRfbW9kdWxlKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpZ2J2Zl9kcml2ZXIpOwotCXBtX3Fvc19yZW1vdmVfcmVxdWVzdChpZ2J2Zl9kcml2ZXJfcG1fcW9zX3JlcSk7Ci0JaWdidmZfZHJpdmVyX3BtX3Fvc19yZXEgPSBOVUxMOworCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmaWdidmZfZHJpdmVyX3BtX3Fvc19yZXEpOwogfQogbW9kdWxlX2V4aXQoaWdidmZfZXhpdF9tb2R1bGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jIGIvZHJpdmVycy9uZXQvaW9jMy1ldGguYwppbmRleCBlM2I1ZTk0Li4wYjNmNmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTgyLDcgKzgyLDYgQEAKIAlzdHJ1Y3QgaW9jM19ldHhkICp0eHI7CiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnNbNTEyXTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tic1sxMjhdOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCWludCByeF9jaTsJCQkvKiBSWCBjb25zdW1lciBpbmRleCAqLwogCWludCByeF9waTsJCQkvKiBSWCBwcm9kdWNlciBpbmRleCAqLwogCWludCB0eF9jaTsJCQkvKiBUWCBjb25zdW1lciBpbmRleCAqLwpAQCAtNTA0LDggKzUwMyw4IEBACiAJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CiAKLQlpcC0+c3RhdHMuY29sbGlzaW9ucyArPSAoaW9jM19yX2V0Y2RjKCkgJiBFVENEQ19DT0xMQ05UX01BU0spOwotCXJldHVybiAmaXAtPnN0YXRzOworCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAoaW9jM19yX2V0Y2RjKCkgJiBFVENEQ19DT0xMQ05UX01BU0spOworCXJldHVybiAmZGV2LT5zdGF0czsKIH0KIAogc3RhdGljIHZvaWQgaW9jM190Y3B1ZHBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgaHdzdW0sIGludCBsZW4pCkBAIC01NzYsOCArNTc1LDkgQEAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlvYzNfcngoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCitzdGF0aWMgaW5saW5lIHZvaWQgaW9jM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbmV3X3NrYjsKIAlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOwogCWludCByeF9lbnRyeSwgbl9lbnRyeSwgbGVuOwpAQCAtNTk4LDEzICs1OTgsMTMgQEAKIAkJaWYgKGVyciAmIEVSWEJVRl9HT09EUEtUKSB7CiAJCQlsZW4gPSAoKHcwID4+IEVSWEJVRl9CWVRFQ05UX1NISUZUKSAmIDB4N2ZmKSAtIDQ7CiAJCQlza2JfdHJpbShza2IsIGxlbik7Ci0JCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwcml2X25ldGRldihpcCkpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAogCQkJbmV3X3NrYiA9IGlvYzNfYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghbmV3X3NrYikgewogCQkJCS8qIE91Y2gsIGRyb3AgcGFja2V0IGFuZCBqdXN0IHJlY3ljbGUgcGFja2V0CiAJCQkJICAgdG8ga2VlcCB0aGUgcmluZyBmaWxsZWQuICAqLwotCQkJCWlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJbmV3X3NrYiA9IHNrYjsKIAkJCQlnb3RvIG5leHQ7CiAJCQl9CkBAIC02MjIsMTkgKzYyMiwxOSBAQAogCQkJcnhiID0gKHN0cnVjdCBpb2MzX2VyeGJ1ZiAqKSBuZXdfc2tiLT5kYXRhOwogCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgUlhfT0ZGU0VUKTsKIAotCQkJaXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsJCS8qIFN0YXRpc3RpY3MgKi8KLQkJCWlwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsJCS8qIFN0YXRpc3RpY3MgKi8KKwkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCQl9IGVsc2UgewotIAkJCS8qIFRoZSBmcmFtZSBpcyBpbnZhbGlkIGFuZCB0aGUgc2tiIG5ldmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVkIHRoZSBuZXR3b3JrIGxheWVyIHNvIHdlIGNhbiBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN5Y2xlIGl0LiAgKi8KLSAJCQluZXdfc2tiID0gc2tiOwotIAkJCWlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCS8qIFRoZSBmcmFtZSBpcyBpbnZhbGlkIGFuZCB0aGUgc2tiIG5ldmVyCisJCQkgICByZWFjaGVkIHRoZSBuZXR3b3JrIGxheWVyIHNvIHdlIGNhbiBqdXN0CisJCQkgICByZWN5Y2xlIGl0LiAgKi8KKwkJCW5ld19za2IgPSBza2I7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQl9CiAJCWlmIChlcnIgJiBFUlhCVUZfQ1JDRVJSKQkvKiBTdGF0aXN0aWNzICovCi0JCQlpcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCWlmIChlcnIgJiBFUlhCVUZfRlJBTUVSUikKLQkJCWlwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiBuZXh0OgogCQlpcC0+cnhfc2tic1tuX2VudHJ5XSA9IG5ld19za2I7CiAJCXJ4cltuX2VudHJ5XSA9IGNwdV90b19iZTY0KGlvYzNfbWFwKHJ4YiwgMSkpOwpAQCAtNjUyLDggKzY1Miw5IEBACiAJaXAtPnJ4X2NpID0gcnhfZW50cnk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpb2MzX3R4KHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKQorc3RhdGljIGlubGluZSB2b2lkIGlvYzNfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBwYWNrZXRzLCBieXRlczsKIAlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOwogCWludCB0eF9lbnRyeSwgb19lbnRyeTsKQEAgLTY4MSwxMiArNjgyLDEyIEBACiAJCXR4X2VudHJ5ID0gKGV0Y2lyID4+IDcpICYgMTI3OwogCX0KIAotCWlwLT5zdGF0cy50eF9wYWNrZXRzICs9IHBhY2tldHM7Ci0JaXAtPnN0YXRzLnR4X2J5dGVzICs9IGJ5dGVzOworCWRldi0+c3RhdHMudHhfcGFja2V0cyArPSBwYWNrZXRzOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gYnl0ZXM7CiAJaXAtPnR4cWxlbiAtPSBwYWNrZXRzOwogCiAJaWYgKGlwLT50eHFsZW4gPCAxMjgpCi0JCW5ldGlmX3dha2VfcXVldWUocHJpdl9uZXRkZXYoaXApKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCiAJaXAtPnR4X2NpID0gb19lbnRyeTsKIAlzcGluX3VubG9jaygmaXAtPmlvYzNfbG9jayk7CkBAIC02OTksOSArNzAwLDkgQEAKICAqIHdpdGggc3VjaCBlcnJvciBpbnRlcnJ1cHRzIGlmIHNvbWV0aGluZyByZWFsbHkgZ29lcyB3cm9uZywgc28gd2UgbWlnaHQKICAqIGFsc28gY29uc2lkZXIgdG8gdGFrZSB0aGUgaW50ZXJmYWNlIGRvd24uCiAgKi8KLXN0YXRpYyB2b2lkIGlvYzNfZXJyb3Ioc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAsIHUzMiBlaXNyKQorc3RhdGljIHZvaWQgaW9jM19lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZWlzcikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdl9uZXRkZXYoaXApOworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBjaGFyICppZmFjZSA9IGRldi0+bmFtZTsKIAogCXNwaW5fbG9jaygmaXAtPmlvYzNfbG9jayk7CkBAIC03NDcsMTEgKzc0OCwxMSBAQAogCiAJaWYgKGVpc3IgJiAoRUlTUl9SWE9GTE8gfCBFSVNSX1JYQlVGT0ZMTyB8IEVJU1JfUlhNRU1FUlIgfAogCSAgICAgICAgICAgIEVJU1JfUlhQQVJFUlIgfCBFSVNSX1RYQlVGVUZMTyB8IEVJU1JfVFhNRU1FUlIpKQotCQlpb2MzX2Vycm9yKGlwLCBlaXNyKTsKKwkJaW9jM19lcnJvcihkZXYsIGVpc3IpOwogCWlmIChlaXNyICYgRUlTUl9SWFRJTUVSSU5UKQotCQlpb2MzX3J4KGlwKTsKKwkJaW9jM19yeChkZXYpOwogCWlmIChlaXNyICYgRUlTUl9UWEVYUExJQ0lUKQotCQlpb2MzX3R4KGlwKTsKKwkJaW9jM190eChkZXYpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCmluZGV4IDBkYmQxOTMuLjM2YzMwNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKQEAgLTI3Myw3ICsyNzMsNyBAQAogICBfX3U4IGNvbnRyb2w7ICAgICAgICAgICAgICAgICAvKlNsb3QgY29udHJvbC9zdGF0dXMgc2VlIGJlbG93ICovCiAgIF9fdTMyIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qU2xvdCBidWZmZXIgYWRkcmVzcyAqLwogfQotX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworX19wYWNrZWQ7CiAKICNkZWZpbmUgT0JPRV9OVEFTS1MgT0JPRV9UWFJJTkdfT0ZGU0VUX0lOX1NMT1RTCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaCBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaAppbmRleCBhYzA0NDNkLi41OGRkYjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlfX3U4ICBibUFkZGl0aW9uYWxCT0ZzOwogCV9fdTggIGJJcmRhUmF0ZVNuaWZmOwogCV9fdTggIGJNYXhVbmljYXN0TGlzdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogY2xhc3Mgc3BlY2lmaWMgaW50ZXJmYWNlIHJlcXVlc3QgdG8gZ2V0IHRoZSBJckRBLVVTQiBjbGFzcyBkZXNjcmlwdG9yCiAgKiAoNi4yLjUsIFVTQi1JckRBIGNsYXNzIHNwZWMgMS4wKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9rczk1OS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMKaW5kZXggYjU0ZDNiNC4uMTA0NjAxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9rczk1OS1zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAlfX2xlMzIgYmF1ZHJhdGU7CS8qIGJhdWQgcmF0ZSwgbGl0dGxlIGVuZGlhbiAqLwogCV9fdTggZmxhZ3M7CiAJX191OCByZXNlcnZlZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBLU19EQVRBXzVfQklUUyAweDAwCiAjZGVmaW5lIEtTX0RBVEFfNl9CSVRTIDB4MDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jCmluZGV4IDhkNzEzZWIuLjljYzE0MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9rc2RhenpsZS1zaXIuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJX19sZTMyIGJhdWRyYXRlOwkvKiBiYXVkIHJhdGUsIGxpdHRsZSBlbmRpYW4gKi8KIAlfX3U4IGZsYWdzOwogCV9fdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgS1NfREFUQV81X0JJVFMgMHgwMAogI2RlZmluZSBLU19EQVRBXzZfQklUUyAweDAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3NoX2lyZGEuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2hfaXJkYS5jCmluZGV4IDlhODI4YjAuLmVkZDU2NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2hfaXJkYS5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2hfaXJkYS5jCkBAIC03NDksNyArNzQ5LDcgQEAKIAlzdHJ1Y3Qgc2hfaXJkYV9zZWxmICpzZWxmOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWNoYXIgY2xrX25hbWVbOF07Ci0JdW5zaWduZWQgaW50IGlycTsKKwlpbnQgaXJxOwogCWludCBlcnIgPSAtRU5PTUVNOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2hfc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3NoX3Npci5jCmluZGV4IDVjNWY5OWQuLjAwYjM4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2hfc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaF9zaXIuYwpAQCAtNzA5LDcgKzcwOSw3IEBACiAJc3RydWN0IHNoX3Npcl9zZWxmICpzZWxmOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWNoYXIgY2xrX25hbWVbOF07Ci0JdW5zaWduZWQgaW50IGlycTsKKwlpbnQgaXJxOwogCWludCBlcnIgPSAtRU5PTUVNOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggZDY3ZTQ4NC4uODUwY2ExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTI4NDgsOSArMjg0OCw3IEBACiAJdW5zaWduZWQgc2hvcnQgc3NfZGV2aWNlID0gMHgwMDAwOwogCWludCByZXQgPSAwOwogCi0JZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KTsKLQotCXdoaWxlIChkZXYgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCXN0cnVjdCBzbXNjX2lyY2Nfc3Vic3lzdGVtX2NvbmZpZ3VyYXRpb24gKmNvbmY7CiAKIAkJLyoKQEAgLTI4OTksNyArMjg5Nyw2IEBACiAJCQkJCXJldCA9IC1FTk9ERVY7CiAJCQl9CiAJCX0KLQkJZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmggYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaAppbmRleCAzMDUwZDFhLi4zZjI0YTFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKQEAgLTU0NCw5ICs1NDQsOSBAQAogCQlzdHJ1Y3QgewogCQkJdTgJCWFkZHJfcmVzWzNdOwogCQkJdm9sYXRpbGUgdTgJc3RhdHVzOwkJLyogZGVzY3JpcHRvciBzdGF0dXMgKi8KLQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSByZF9zOwotCX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpIHJkX3U7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwkJfSBfX3BhY2tlZCByZF9zOworCX0gX19wYWNrZWQgcmRfdTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgcmRfYWRkcgkJcmRfdS5hZGRyCiAjZGVmaW5lIHJkX3N0YXR1cwlyZF91LnJkX3Muc3RhdHVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZS5oIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmUuaAppbmRleCBmZmFlNDgwLi45ZTE1ZWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZS5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlLmgKQEAgLTQ0LDExICs0NCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGNhLmg+CiAjZW5kaWYKIAotI2RlZmluZSBQRlggIml4Z2JlOiAiCi0jZGVmaW5lIERQUklOVEsobmxldmVsLCBrbGV2ZWwsIGZtdCwgYXJncy4uLikgXAotCSgodm9pZCkoKE5FVElGX01TR18jI25sZXZlbCAmIGFkYXB0ZXItPm1zZ19lbmFibGUpICYmIFwKLQlwcmludGsoS0VSTl8jI2tsZXZlbCBQRlggIiVzOiAlczogIiBmbXQsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgXAotCQlfX2Z1bmNfXyAsICMjIGFyZ3MpKSkKKy8qIGNvbW1vbiBwcmVmaXggdXNlZCBieSBwcl88PiBtYWNyb3MgKi8KKyN1bmRlZiBwcl9mbXQKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogLyogVFgvUlggZGVzY3JpcHRvciBkZWZpbmVzICovCiAjZGVmaW5lIElYR0JFX0RFRkFVTFRfVFhECQkgICAgNTEyCkBAIC0xMTIsNyArMTEwLDYgQEAKIAl1MTYgdmxhbnNfZW5hYmxlZDsKIAlib29sIGNsZWFyX3RvX3NlbmQ7CiAJYm9vbCBwZl9zZXRfbWFjOwotCWludCByYXI7CiAJdTE2IHBmX3ZsYW47IC8qIFdoZW4gc2V0LCBndWVzdCBWTEFOIGNvbmZpZyBub3QgYWxsb3dlZC4gKi8KIAl1MTYgcGZfcW9zOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jCmluZGV4IGE0ZTI5MDEuLjNlMDZhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYwpAQCAtMjA2LDYgKzIwNiwxNCBAQAogCXMzMiBzdGF0dXMgPSAwOwogCXUzMiBhdXRvYyA9IDA7CiAKKwkvKiBEZXRlcm1pbmUgMUcgbGluayBjYXBhYmlsaXRpZXMgb2ZmIG9mIFNGUCsgdHlwZSAqLworCWlmIChody0+cGh5LnNmcF90eXBlID09IGl4Z2JlX3NmcF90eXBlXzFnX2N1X2NvcmUwIHx8CisJICAgIGh3LT5waHkuc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTEpIHsKKwkJKnNwZWVkID0gSVhHQkVfTElOS19TUEVFRF8xR0JfRlVMTDsKKwkJKm5lZ290aWF0aW9uID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyoKIAkgKiBEZXRlcm1pbmUgbGluayBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdGhlIHN0b3JlZCB2YWx1ZSBvZiBBVVRPQywKIAkgKiB3aGljaCByZXByZXNlbnRzIEVFUFJPTSBkZWZhdWx0cy4gIElmIEFVVE9DIHZhbHVlIGhhcyBub3QgYmVlbgpAQCAtNzA3LDkgKzcxNSw4IEBACiAKIG91dDoKIAlpZiAobGlua191cCAmJiAobGlua19zcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKSkKLQkJbmV0aWZfaW5mbyhhZGFwdGVyLCBodywgYWRhcHRlci0+bmV0ZGV2LCAiU21hcnRzcGVlZCBoYXMiCi0JCQkiIGRvd25ncmFkZWQgdGhlIGxpbmsgc3BlZWQgZnJvbSB0aGUgbWF4aW11bSIKLQkJCSIgYWR2ZXJ0aXNlZFxuIik7CisJCWVfaW5mbyhodywgIlNtYXJ0c3BlZWQgaGFzIGRvd25ncmFkZWQgdGhlIGxpbmsgc3BlZWQgZnJvbSAiCisJCSAgICAgICAidGhlIG1heGltdW0gYWR2ZXJ0aXNlZFxuIik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjA4OCw2ICsyMDk1LDcgQEAKIAl1MzIgcG1hX3BtZF8xZyA9IGF1dG9jICYgSVhHQkVfQVVUT0NfMUdfUE1BX1BNRF9NQVNLOwogCXUxNiBleHRfYWJpbGl0eSA9IDA7CiAJdTggY29tcF9jb2Rlc18xMGcgPSAwOworCXU4IGNvbXBfY29kZXNfMWcgPSAwOwogCiAJaHctPnBoeS5vcHMuaWRlbnRpZnkoaHcpOwogCkBAIC0yMTY4LDExICsyMTc2LDE1IEBACiAJY2FzZSBpeGdiZV9waHlfc2ZwX2ludGVsOgogCWNhc2UgaXhnYmVfcGh5X3NmcF91bmtub3duOgogCQlody0+cGh5Lm9wcy5yZWFkX2kyY19lZXByb20oaHcsCisJCSAgICAgIElYR0JFX1NGRl8xR0JFX0NPTVBfQ09ERVMsICZjb21wX2NvZGVzXzFnKTsKKwkJaHctPnBoeS5vcHMucmVhZF9pMmNfZWVwcm9tKGh3LAogCQkgICAgICBJWEdCRV9TRkZfMTBHQkVfQ09NUF9DT0RFUywgJmNvbXBfY29kZXNfMTBnKTsKIAkJaWYgKGNvbXBfY29kZXNfMTBnICYgSVhHQkVfU0ZGXzEwR0JBU0VTUl9DQVBBQkxFKQogCQkJcGh5c2ljYWxfbGF5ZXIgPSBJWEdCRV9QSFlTSUNBTF9MQVlFUl8xMEdCQVNFX1NSOwogCQllbHNlIGlmIChjb21wX2NvZGVzXzEwZyAmIElYR0JFX1NGRl8xMEdCQVNFTFJfQ0FQQUJMRSkKIAkJCXBoeXNpY2FsX2xheWVyID0gSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTBHQkFTRV9MUjsKKwkJZWxzZSBpZiAoY29tcF9jb2Rlc18xZyAmIElYR0JFX1NGRl8xR0JBU0VUX0NBUEFCTEUpCisJCQlwaHlzaWNhbF9sYXllciA9IElYR0JFX1BIWVNJQ0FMX0xBWUVSXzEwMDBCQVNFX1Q7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaAppbmRleCAzMDgwYWZiLi41Y2YxNWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaApAQCAtMTA1LDEyICsxMDUsMjMgQEAKIAogI2RlZmluZSBJWEdCRV9XUklURV9GTFVTSChhKSBJWEdCRV9SRUFEX1JFRyhhLCBJWEdCRV9TVEFUVVMpCiAKLSNpZmRlZiBERUJVRwotZXh0ZXJuIGNoYXIgKml4Z2JlX2dldF9od19kZXZfbmFtZShzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaXhnYmVfZ2V0X2h3X2RldihzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKICNkZWZpbmUgaHdfZGJnKGh3LCBmb3JtYXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIGl4Z2JlX2dldF9od19kZXZfbmFtZShodyksICMjYXJnKQotI2Vsc2UKLSNkZWZpbmUgaHdfZGJnKGh3LCBmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQorCW5ldGRldl9kYmcoaXhnYmVfZ2V0X2h3X2RldihodyksIGZvcm1hdCwgIyNhcmcpCisjZGVmaW5lIGVfZGV2X2luZm8oZm9ybWF0LCBhcmcuLi4pIFwKKwlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCBmb3JtYXQsICMjIGFyZykKKyNkZWZpbmUgZV9kZXZfd2Fybihmb3JtYXQsIGFyZy4uLikgXAorCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX2Rldl9lcnIoZm9ybWF0LCBhcmcuLi4pIFwKKwlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX2Rldl9ub3RpY2UoZm9ybWF0LCBhcmcuLi4pIFwKKwlkZXZfbm90aWNlKCZhZGFwdGVyLT5wZGV2LT5kZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX2luZm8obXNnbHZsLCBmb3JtYXQsIGFyZy4uLikgXAorCW5ldGlmX2luZm8oYWRhcHRlciwgbXNnbHZsLCBhZGFwdGVyLT5uZXRkZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBlX2Vycihtc2dsdmwsIGZvcm1hdCwgYXJnLi4uKSBcCisJbmV0aWZfZXJyKGFkYXB0ZXIsIG1zZ2x2bCwgYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKKyNkZWZpbmUgZV93YXJuKG1zZ2x2bCwgZm9ybWF0LCBhcmcuLi4pIFwKKwluZXRpZl93YXJuKGFkYXB0ZXIsIG1zZ2x2bCwgYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKKyNkZWZpbmUgZV9jcml0KG1zZ2x2bCwgZm9ybWF0LCBhcmcuLi4pIFwKKwluZXRpZl9jcml0KGFkYXB0ZXIsIG1zZ2x2bCwgYWRhcHRlci0+bmV0ZGV2LCBmb3JtYXQsICMjIGFyZykKICNlbmRpZiAvKiBJWEdCRV9DT01NT04gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl84MjU5OS5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMKaW5kZXggNGY3YTI2YS4uMjViMDJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCSAqLwogCXJlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9NRkxDTik7CiAJcmVnICY9IH5JWEdCRV9NRkxDTl9SRkNFOwotCXJlZyB8PSBJWEdCRV9NRkxDTl9SUEZDRTsKKwlyZWcgfD0gSVhHQkVfTUZMQ05fUlBGQ0UgfCBJWEdCRV9NRkxDTl9EUEY7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NRkxDTiwgcmVnKTsKIG91dDoKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl9ubC5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiX25sLmMKaW5kZXggNzFkYTMyNS4uYjUzYjQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiX25sLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiX25sLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCkpIHsKLQkJCURQUklOVEsoRFJWLCBFUlIsICJFbmFibGUgZmFpbGVkLCBuZWVkcyBNU0ktWFxuIik7CisJCQllX2VycihkcnYsICJFbmFibGUgZmFpbGVkLCBuZWVkcyBNU0ktWFxuIik7CiAJCQllcnIgPSAxOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwppbmRleCAzYTkzYTgxLi5kY2ViYzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jCkBAIC01NCwxNCArNTQsMTQgQEAKIAkJCQlzaXplb2YoKChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqKTApLT5tKSwgXAogCQkJCW9mZnNldG9mKHN0cnVjdCBpeGdiZV9hZGFwdGVyLCBtKQogI2RlZmluZSBJWEdCRV9ORVRERVZfU1RBVChtKQlORVRERVZfU1RBVFMsIFwKLQkJCQlzaXplb2YoKChzdHJ1Y3QgbmV0X2RldmljZSAqKTApLT5tKSwgXAotCQkJCW9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlLCBtKQorCQkJCXNpemVvZigoKHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqKTApLT5tKSwgXAorCQkJCW9mZnNldG9mKHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCwgbSkKIAogc3RhdGljIHN0cnVjdCBpeGdiZV9zdGF0cyBpeGdiZV9nc3RyaW5nc19zdGF0c1tdID0gewotCXsicnhfcGFja2V0cyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnJ4X3BhY2tldHMpfSwKLQl7InR4X3BhY2tldHMiLCBJWEdCRV9ORVRERVZfU1RBVChzdGF0cy50eF9wYWNrZXRzKX0sCi0JeyJyeF9ieXRlcyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnJ4X2J5dGVzKX0sCi0JeyJ0eF9ieXRlcyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnR4X2J5dGVzKX0sCisJeyJyeF9wYWNrZXRzIiwgSVhHQkVfTkVUREVWX1NUQVQocnhfcGFja2V0cyl9LAorCXsidHhfcGFja2V0cyIsIElYR0JFX05FVERFVl9TVEFUKHR4X3BhY2tldHMpfSwKKwl7InJ4X2J5dGVzIiwgSVhHQkVfTkVUREVWX1NUQVQocnhfYnl0ZXMpfSwKKwl7InR4X2J5dGVzIiwgSVhHQkVfTkVUREVWX1NUQVQodHhfYnl0ZXMpfSwKIAl7InJ4X3BrdHNfbmljIiwgSVhHQkVfU1RBVChzdGF0cy5ncHJjKX0sCiAJeyJ0eF9wa3RzX25pYyIsIElYR0JFX1NUQVQoc3RhdHMuZ3B0Yyl9LAogCXsicnhfYnl0ZXNfbmljIiwgSVhHQkVfU1RBVChzdGF0cy5nb3JjKX0sCkBAIC02OSwyNyArNjksMjcgQEAKIAl7ImxzY19pbnQiLCBJWEdCRV9TVEFUKGxzY19pbnQpfSwKIAl7InR4X2J1c3kiLCBJWEdCRV9TVEFUKHR4X2J1c3kpfSwKIAl7Im5vbl9lb3BfZGVzY3MiLCBJWEdCRV9TVEFUKG5vbl9lb3BfZGVzY3MpfSwKLQl7InJ4X2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnJ4X2Vycm9ycyl9LAotCXsidHhfZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQoc3RhdHMudHhfZXJyb3JzKX0sCi0JeyJyeF9kcm9wcGVkIiwgSVhHQkVfTkVUREVWX1NUQVQoc3RhdHMucnhfZHJvcHBlZCl9LAotCXsidHhfZHJvcHBlZCIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnR4X2Ryb3BwZWQpfSwKLQl7Im11bHRpY2FzdCIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLm11bHRpY2FzdCl9LAorCXsicnhfZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQocnhfZXJyb3JzKX0sCisJeyJ0eF9lcnJvcnMiLCBJWEdCRV9ORVRERVZfU1RBVCh0eF9lcnJvcnMpfSwKKwl7InJ4X2Ryb3BwZWQiLCBJWEdCRV9ORVRERVZfU1RBVChyeF9kcm9wcGVkKX0sCisJeyJ0eF9kcm9wcGVkIiwgSVhHQkVfTkVUREVWX1NUQVQodHhfZHJvcHBlZCl9LAorCXsibXVsdGljYXN0IiwgSVhHQkVfTkVUREVWX1NUQVQobXVsdGljYXN0KX0sCiAJeyJicm9hZGNhc3QiLCBJWEdCRV9TVEFUKHN0YXRzLmJwcmMpfSwKIAl7InJ4X25vX2J1ZmZlcl9jb3VudCIsIElYR0JFX1NUQVQoc3RhdHMucm5iY1swXSkgfSwKLQl7ImNvbGxpc2lvbnMiLCBJWEdCRV9ORVRERVZfU1RBVChzdGF0cy5jb2xsaXNpb25zKX0sCi0JeyJyeF9vdmVyX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnJ4X292ZXJfZXJyb3JzKX0sCi0JeyJyeF9jcmNfZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQoc3RhdHMucnhfY3JjX2Vycm9ycyl9LAotCXsicnhfZnJhbWVfZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQoc3RhdHMucnhfZnJhbWVfZXJyb3JzKX0sCisJeyJjb2xsaXNpb25zIiwgSVhHQkVfTkVUREVWX1NUQVQoY29sbGlzaW9ucyl9LAorCXsicnhfb3Zlcl9lcnJvcnMiLCBJWEdCRV9ORVRERVZfU1RBVChyeF9vdmVyX2Vycm9ycyl9LAorCXsicnhfY3JjX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHJ4X2NyY19lcnJvcnMpfSwKKwl7InJ4X2ZyYW1lX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHJ4X2ZyYW1lX2Vycm9ycyl9LAogCXsiaHdfcnNjX2FnZ3JlZ2F0ZWQiLCBJWEdCRV9TVEFUKHJzY190b3RhbF9jb3VudCl9LAogCXsiaHdfcnNjX2ZsdXNoZWQiLCBJWEdCRV9TVEFUKHJzY190b3RhbF9mbHVzaCl9LAogCXsiZmRpcl9tYXRjaCIsIElYR0JFX1NUQVQoc3RhdHMuZmRpcm1hdGNoKX0sCiAJeyJmZGlyX21pc3MiLCBJWEdCRV9TVEFUKHN0YXRzLmZkaXJtaXNzKX0sCi0JeyJyeF9maWZvX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnJ4X2ZpZm9fZXJyb3JzKX0sCi0JeyJyeF9taXNzZWRfZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQoc3RhdHMucnhfbWlzc2VkX2Vycm9ycyl9LAotCXsidHhfYWJvcnRlZF9lcnJvcnMiLCBJWEdCRV9ORVRERVZfU1RBVChzdGF0cy50eF9hYm9ydGVkX2Vycm9ycyl9LAotCXsidHhfY2Fycmllcl9lcnJvcnMiLCBJWEdCRV9ORVRERVZfU1RBVChzdGF0cy50eF9jYXJyaWVyX2Vycm9ycyl9LAotCXsidHhfZmlmb19lcnJvcnMiLCBJWEdCRV9ORVRERVZfU1RBVChzdGF0cy50eF9maWZvX2Vycm9ycyl9LAotCXsidHhfaGVhcnRiZWF0X2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMpfSwKKwl7InJ4X2ZpZm9fZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQocnhfZmlmb19lcnJvcnMpfSwKKwl7InJ4X21pc3NlZF9lcnJvcnMiLCBJWEdCRV9ORVRERVZfU1RBVChyeF9taXNzZWRfZXJyb3JzKX0sCisJeyJ0eF9hYm9ydGVkX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHR4X2Fib3J0ZWRfZXJyb3JzKX0sCisJeyJ0eF9jYXJyaWVyX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHR4X2NhcnJpZXJfZXJyb3JzKX0sCisJeyJ0eF9maWZvX2Vycm9ycyIsIElYR0JFX05FVERFVl9TVEFUKHR4X2ZpZm9fZXJyb3JzKX0sCisJeyJ0eF9oZWFydGJlYXRfZXJyb3JzIiwgSVhHQkVfTkVUREVWX1NUQVQodHhfaGVhcnRiZWF0X2Vycm9ycyl9LAogCXsidHhfdGltZW91dF9jb3VudCIsIElYR0JFX1NUQVQodHhfdGltZW91dF9jb3VudCl9LAogCXsidHhfcmVzdGFydF9xdWV1ZSIsIElYR0JFX1NUQVQocmVzdGFydF9xdWV1ZSl9LAogCXsicnhfbG9uZ19sZW5ndGhfZXJyb3JzIiwgSVhHQkVfU1RBVChzdGF0cy5yb2MpfSwKQEAgLTIzNCw2ICsyMzQsMTMgQEAKIAkJY2FzZSBpeGdiZV9zZnBfdHlwZV9ub3RfcHJlc2VudDoKIAkJCWVjbWQtPnBvcnQgPSBQT1JUX05PTkU7CiAJCQlicmVhazsKKwkJY2FzZSBpeGdiZV9zZnBfdHlwZV8xZ19jdV9jb3JlMDoKKwkJY2FzZSBpeGdiZV9zZnBfdHlwZV8xZ19jdV9jb3JlMToKKwkJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCQkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX1RQOworCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCWJyZWFrOwogCQljYXNlIGl4Z2JlX3NmcF90eXBlX3Vua25vd246CiAJCWRlZmF1bHQ6CiAJCQllY21kLT5wb3J0ID0gUE9SVF9PVEhFUjsKQEAgLTI5NCw4ICszMDEsNyBAQAogCQlody0+bWFjLmF1dG90cnlfcmVzdGFydCA9IHRydWU7CiAJCWVyciA9IGh3LT5tYWMub3BzLnNldHVwX2xpbmsoaHcsIGFkdmVydGlzZWQsIHRydWUsIHRydWUpOwogCQlpZiAoZXJyKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBJTkZPLAotCQkJICAgICAgICAic2V0dXAgbGluayBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLCBlcnIpOworCQkJZV9pbmZvKHByb2JlLCAic2V0dXAgbGluayBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLCBlcnIpOwogCQkJaHctPm1hYy5vcHMuc2V0dXBfbGluayhodywgb2xkLCB0cnVlLCB0cnVlKTsKIAkJfQogCX0gZWxzZSB7CkBAIC05OTIsMTYgKzk5OCwxOCBAQAogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1NjQgKnF1ZXVlX3N0YXQ7CiAJaW50IHN0YXRfY291bnQgPSBzaXplb2Yoc3RydWN0IGl4Z2JlX3F1ZXVlX3N0YXRzKSAvIHNpemVvZih1NjQpOworCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCB0ZW1wOworCWNvbnN0IHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqbmV0X3N0YXRzOwogCWludCBqLCBrOwogCWludCBpOwogCWNoYXIgKnAgPSBOVUxMOwogCiAJaXhnYmVfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwotCWRldl9nZXRfc3RhdHMobmV0ZGV2KTsKKwluZXRfc3RhdHMgPSBkZXZfZ2V0X3N0YXRzKG5ldGRldiwgJnRlbXApOwogCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKIAkJc3dpdGNoIChpeGdiZV9nc3RyaW5nc19zdGF0c1tpXS50eXBlKSB7CiAJCWNhc2UgTkVUREVWX1NUQVRTOgotCQkJcCA9IChjaGFyICopIG5ldGRldiArCisJCQlwID0gKGNoYXIgKikgbmV0X3N0YXRzICsKIAkJCQkJaXhnYmVfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CiAJCQlicmVhazsKIAkJY2FzZSBJWEdCRV9TVEFUUzoKQEAgLTExODgsOSArMTE5Niw5IEBACiAJCXdyaXRlbCgoX3Rlc3RbcGF0XSAmIFcpLCAoYWRhcHRlci0+aHcuaHdfYWRkciArIFIpKTsgICAgICAgICAgXAogCQl2YWwgPSByZWFkbChhZGFwdGVyLT5ody5od19hZGRyICsgUik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJaWYgKHZhbCAhPSAoX3Rlc3RbcGF0XSAmIFcgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlEUFJJTlRLKERSViwgRVJSLCAicGF0dGVybiB0ZXN0IHJlZyAlMDRYIGZhaWxlZDogZ290ICJcCi0JCQkJCSAgIjB4JTA4WCBleHBlY3RlZCAweCUwOFhcbiIsICAgICAgICAgXAotCQkJCVIsIHZhbCwgKF90ZXN0W3BhdF0gJiBXICYgTSkpOyAgICAgICAgICAgICAgICBcCisJCQllX2VycihkcnYsICJwYXR0ZXJuIHRlc3QgcmVnICUwNFggZmFpbGVkOiBnb3QgIiAgIFwKKwkJCSAgICAgICIweCUwOFggZXhwZWN0ZWQgMHglMDhYXG4iLAkJICAgICAgXAorCQkJICAgICAgUiwgdmFsLCAoX3Rlc3RbcGF0XSAmIFcgJiBNKSk7ICAgICAgICAgICAgICAgIFwKIAkJCSpkYXRhID0gUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCXdyaXRlbChiZWZvcmUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSKTsgICAgICAgICAgICAgIFwKIAkJCXJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEyMDYsOCArMTIxNCw4IEBACiAJd3JpdGVsKChXICYgTSksIChhZGFwdGVyLT5ody5od19hZGRyICsgUikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl2YWwgPSByZWFkbChhZGFwdGVyLT5ody5od19hZGRyICsgUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCWlmICgoVyAmIE0pICE9ICh2YWwgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCURQUklOVEsoRFJWLCBFUlIsICJzZXQvY2hlY2sgcmVnICUwNFggdGVzdCBmYWlsZWQ6IGdvdCAweCUwOFggIlwKLQkJCQkgImV4cGVjdGVkIDB4JTA4WFxuIiwgUiwgKHZhbCAmIE0pLCAoVyAmIE0pKTsgXAorCQllX2VycihkcnYsICJzZXQvY2hlY2sgcmVnICUwNFggdGVzdCBmYWlsZWQ6IGdvdCAweCUwOFggIiAgXAorCQkgICAgICAiZXhwZWN0ZWQgMHglMDhYXG4iLCBSLCAodmFsICYgTSksIChXICYgTSkpOyAgICAgICAgXAogCQkqZGF0YSA9IFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJd3JpdGVsKGJlZm9yZSwgKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSKSk7ICAgICAgICAgICAgICAgICAgICBcCiAJCXJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTI0MCw4ICsxMjQ4LDggQEAKIAlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9TVEFUVVMsIHRvZ2dsZSk7CiAJYWZ0ZXIgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1NUQVRVUykgJiB0b2dnbGU7CiAJaWYgKHZhbHVlICE9IGFmdGVyKSB7Ci0JCURQUklOVEsoRFJWLCBFUlIsICJmYWlsZWQgU1RBVFVTIHJlZ2lzdGVyIHRlc3QgZ290OiAiCi0JCSAgICAgICAgIjB4JTA4WCBleHBlY3RlZDogMHglMDhYXG4iLCBhZnRlciwgdmFsdWUpOworCQllX2VycihkcnYsICJmYWlsZWQgU1RBVFVTIHJlZ2lzdGVyIHRlc3QgZ290OiAweCUwOFggIgorCQkgICAgICAiZXhwZWN0ZWQ6IDB4JTA4WFxuIiwgYWZ0ZXIsIHZhbHVlKTsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gMTsKIAl9CkBAIC0xMzQxLDggKzEzNDksOCBAQAogCQkqZGF0YSA9IDE7CiAJCXJldHVybiAtMTsKIAl9Ci0JRFBSSU5USyhIVywgSU5GTywgInRlc3RpbmcgJXMgaW50ZXJydXB0XG4iLAotCQkoc2hhcmVkX2ludCA/ICJzaGFyZWQiIDogInVuc2hhcmVkIikpOworCWVfaW5mbyhodywgInRlc3RpbmcgJXMgaW50ZXJydXB0XG4iLCBzaGFyZWRfaW50ID8KKwkgICAgICAgInNoYXJlZCIgOiAidW5zaGFyZWQiKTsKIAogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCiAJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlNQywgMHhGRkZGRkZGRik7CkBAIC0xODQ3LDcgKzE4NTUsNyBAQAogCWlmIChldGhfdGVzdC0+ZmxhZ3MgPT0gRVRIX1RFU1RfRkxfT0ZGTElORSkgewogCQkvKiBPZmZsaW5lIHRlc3RzICovCiAKLQkJRFBSSU5USyhIVywgSU5GTywgIm9mZmxpbmUgdGVzdGluZyBzdGFydGluZ1xuIik7CisJCWVfaW5mbyhodywgIm9mZmxpbmUgdGVzdGluZyBzdGFydGluZ1xuIik7CiAKIAkJLyogTGluayB0ZXN0IHBlcmZvcm1lZCBiZWZvcmUgaGFyZHdhcmUgcmVzZXQgc28gYXV0b25lZyBkb2Vzbid0CiAJCSAqIGludGVyZmVyZSB3aXRoIHRlc3QgcmVzdWx0ICovCkBAIC0xODgwLDE3ICsxODg4LDE3IEBACiAJCWVsc2UKIAkJCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOwogCi0JCURQUklOVEsoSFcsIElORk8sICJyZWdpc3RlciB0ZXN0aW5nIHN0YXJ0aW5nXG4iKTsKKwkJZV9pbmZvKGh3LCAicmVnaXN0ZXIgdGVzdGluZyBzdGFydGluZ1xuIik7CiAJCWlmIChpeGdiZV9yZWdfdGVzdChhZGFwdGVyLCAmZGF0YVswXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOwotCQlEUFJJTlRLKEhXLCBJTkZPLCAiZWVwcm9tIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOworCQllX2luZm8oaHcsICJlZXByb20gdGVzdGluZyBzdGFydGluZ1xuIik7CiAJCWlmIChpeGdiZV9lZXByb21fdGVzdChhZGFwdGVyLCAmZGF0YVsxXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOwotCQlEUFJJTlRLKEhXLCBJTkZPLCAiaW50ZXJydXB0IHRlc3Rpbmcgc3RhcnRpbmdcbiIpOworCQllX2luZm8oaHcsICJpbnRlcnJ1cHQgdGVzdGluZyBzdGFydGluZ1xuIik7CiAJCWlmIChpeGdiZV9pbnRyX3Rlc3QoYWRhcHRlciwgJmRhdGFbMl0pKQogCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKIApAQCAtMTg5OCwxNCArMTkwNiwxNCBAQAogCQkgKiBsb29wYmFjayBkaWFnbm9zdGljLiAqLwogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiAoSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEIHwKIAkJCQkgICAgICBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCkpIHsKLQkJCURQUklOVEsoSFcsIElORk8sICJTa2lwIE1BQyBsb29wYmFjayBkaWFnbm9zdGljIGluIFZUICIKLQkJCQkibW9kZVxuIik7CisJCQllX2luZm8oaHcsICJTa2lwIE1BQyBsb29wYmFjayBkaWFnbm9zdGljIGluIFZUICIKKwkJCSAgICAgICAibW9kZVxuIik7CiAJCQlkYXRhWzNdID0gMDsKIAkJCWdvdG8gc2tpcF9sb29wYmFjazsKIAkJfQogCiAJCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOwotCQlEUFJJTlRLKEhXLCBJTkZPLCAibG9vcGJhY2sgdGVzdGluZyBzdGFydGluZ1xuIik7CisJCWVfaW5mbyhodywgImxvb3BiYWNrIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOwogCQlpZiAoaXhnYmVfbG9vcGJhY2tfdGVzdChhZGFwdGVyLCAmZGF0YVszXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCkBAIC0xOTE2LDcgKzE5MjQsNyBAQAogCQlpZiAoaWZfcnVubmluZykKIAkJCWRldl9vcGVuKG5ldGRldik7CiAJfSBlbHNlIHsKLQkJRFBSSU5USyhIVywgSU5GTywgIm9ubGluZSB0ZXN0aW5nIHN0YXJ0aW5nXG4iKTsKKwkJZV9pbmZvKGh3LCAib25saW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOwogCQkvKiBPbmxpbmUgdGVzdHMgKi8KIAkJaWYgKGl4Z2JlX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwpAQCAtMjEzNCw4ICsyMTQyLDggQEAKIAkJCWFkYXB0ZXItPmZsYWdzMiAmPSB+SVhHQkVfRkxBRzJfUlNDX0VOQUJMRUQ7CiAJCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSB7CiAJCQkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9MUk87Ci0JCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgInJ4LXVzZWNzIHNldCB0byAwLCAiCi0JCQkJCSJkaXNhYmxpbmcgTFJPL1JTQ1xuIik7CisJCQkJZV9pbmZvKHByb2JlLCAicngtdXNlY3Mgc2V0IHRvIDAsICIKKwkJCQkgICAgICAgImRpc2FibGluZyBSU0NcbiIpOwogCQkJfQogCQkJbmVlZF9yZXNldCA9IHRydWU7CiAJCX0KQEAgLTIyMDgsOCArMjIxNiwxMSBAQAogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlib29sIG5lZWRfcmVzZXQgPSBmYWxzZTsKKwlpbnQgcmM7CiAKLQlldGh0b29sX29wX3NldF9mbGFncyhuZXRkZXYsIGRhdGEpOworCXJjID0gZXRodG9vbF9vcF9zZXRfZmxhZ3MobmV0ZGV2LCBkYXRhLCBFVEhfRkxBR19MUk8gfCBFVEhfRkxBR19OVFVQTEUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJLyogaWYgc3RhdGUgY2hhbmdlcyB3ZSBuZWVkIHRvIHVwZGF0ZSBhZGFwdGVyLT5mbGFncyBhbmQgcmVzZXQgKi8KIAlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUlNDX0NBUEFCTEUpIHsKQEAgLTIyMzAsMTAgKzIyNDEsMTAgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIGlmICghYWRhcHRlci0+cnhfaXRyX3NldHRpbmcpIHsKLQkJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfkVUSF9GTEFHX0xSTzsKKwkJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfTFJPOwogCQkJaWYgKGRhdGEgJiBFVEhfRkxBR19MUk8pCi0JCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgInJ4LXVzZWNzIHNldCB0byAwLCAiCi0JCQkJCSJMUk8vUlNDIGNhbm5vdCBiZSBlbmFibGVkLlxuIik7CisJCQkJZV9pbmZvKHByb2JlLCAicngtdXNlY3Mgc2V0IHRvIDAsICIKKwkJCQkgICAgICAgIkxSTy9SU0MgY2Fubm90IGJlIGVuYWJsZWQuXG4iKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZmNvZS5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZmNvZS5jCmluZGV4IDQ1MTgyYWIuLjA3MjMyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2Zjb2UuYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9mY29lLmMKQEAgLTI1LDcgKzI1LDYgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAjaW5jbHVkZSAiaXhnYmUuaCIKICNpZmRlZiBDT05GSUdfSVhHQkVfRENCCiAjaW5jbHVkZSAiaXhnYmVfZGNiXzgyNTk5LmgiCkBAIC0xNjUsMjAgKzE2NCwyMCBAQAogCiAJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaWYgKHhpZCA+PSBJWEdCRV9GQ09FX0REUF9NQVgpIHsKLQkJRFBSSU5USyhEUlYsIFdBUk5JTkcsICJ4aWQ9MHgleCBvdXQtb2YtcmFuZ2VcbiIsIHhpZCk7CisJCWVfd2FybihkcnYsICJ4aWQ9MHgleCBvdXQtb2YtcmFuZ2VcbiIsIHhpZCk7CiAJCXJldHVybiAwOwogCX0KIAogCWZjb2UgPSAmYWRhcHRlci0+ZmNvZTsKIAlpZiAoIWZjb2UtPnBvb2wpIHsKLQkJRFBSSU5USyhEUlYsIFdBUk5JTkcsICJ4aWQ9MHgleCBubyBkZHAgcG9vbCBmb3IgZmNvZVxuIiwgeGlkKTsKKwkJZV93YXJuKGRydiwgInhpZD0weCV4IG5vIGRkcCBwb29sIGZvciBmY29lXG4iLCB4aWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlkZHAgPSAmZmNvZS0+ZGRwW3hpZF07CiAJaWYgKGRkcC0+c2dsKSB7Ci0JCURQUklOVEsoRFJWLCBFUlIsICJ4aWQgMHgleCB3LyBub24tbnVsbCBzZ2w9JXAgbmVudHM9JWRcbiIsCi0JCQl4aWQsIGRkcC0+c2dsLCBkZHAtPnNnYyk7CisJCWVfZXJyKGRydiwgInhpZCAweCV4IHcvIG5vbi1udWxsIHNnbD0lcCBuZW50cz0lZFxuIiwKKwkJICAgICAgeGlkLCBkZHAtPnNnbCwgZGRwLT5zZ2MpOwogCQlyZXR1cm4gMDsKIAl9CiAJaXhnYmVfZmNvZV9jbGVhcl9kZHAoZGRwKTsKQEAgLTE4NiwxNCArMTg1LDE0IEBACiAJLyogc2V0dXAgZG1hIGZyb20gc2NzaSBjb21tYW5kIHNnbCAqLwogCWRtYWNvdW50ID0gcGNpX21hcF9zZyhhZGFwdGVyLT5wZGV2LCBzZ2wsIHNnYywgRE1BX0ZST01fREVWSUNFKTsKIAlpZiAoZG1hY291bnQgPT0gMCkgewotCQlEUFJJTlRLKERSViwgRVJSLCAieGlkIDB4JXggRE1BIG1hcCBlcnJvclxuIiwgeGlkKTsKKwkJZV9lcnIoZHJ2LCAieGlkIDB4JXggRE1BIG1hcCBlcnJvclxuIiwgeGlkKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogYWxsb2MgdGhlIHVkbCBmcm9tIG91ciBkZHAgcG9vbCAqLwotCWRkcC0+dWRsID0gcGNpX3Bvb2xfYWxsb2MoZmNvZS0+cG9vbCwgR0ZQX0tFUk5FTCwgJmRkcC0+dWRwKTsKKwlkZHAtPnVkbCA9IHBjaV9wb29sX2FsbG9jKGZjb2UtPnBvb2wsIEdGUF9BVE9NSUMsICZkZHAtPnVkcCk7CiAJaWYgKCFkZHAtPnVkbCkgewotCQlEUFJJTlRLKERSViwgRVJSLCAiZmFpbGVkIGFsbG9jYXRlZCBkZHAgY29udGV4dFxuIik7CisJCWVfZXJyKGRydiwgImZhaWxlZCBhbGxvY2F0ZWQgZGRwIGNvbnRleHRcbiIpOwogCQlnb3RvIG91dF9ub2RkcF91bm1hcDsKIAl9CiAJZGRwLT5zZ2wgPSBzZ2w7CkBAIC0yMDYsMTAgKzIwNSw5IEBACiAJCXdoaWxlIChsZW4pIHsKIAkJCS8qIG1heCBudW1iZXIgb2YgYnVmZmVycyBhbGxvd2VkIGluIG9uZSBERFAgY29udGV4dCAqLwogCQkJaWYgKGogPj0gSVhHQkVfQlVGRkNOVF9NQVgpIHsKLQkJCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCi0JCQkJCSAgInhpZD0leDolZCwlZCwlZDphZGRyPSVsbHggIgotCQkJCQkgICJub3QgZW5vdWdoIGRlc2NyaXB0b3JzXG4iLAotCQkJCQkgIHhpZCwgaSwgaiwgZG1hY291bnQsICh1NjQpYWRkcik7CisJCQkJZV9lcnIoZHJ2LCAieGlkPSV4OiVkLCVkLCVkOmFkZHI9JWxseCAiCisJCQkJICAgICAgIm5vdCBlbm91Z2ggZGVzY3JpcHRvcnNcbiIsCisJCQkJICAgICAgeGlkLCBpLCBqLCBkbWFjb3VudCwgKHU2NClhZGRyKTsKIAkJCQlnb3RvIG91dF9ub2RkcF9mcmVlOwogCQkJfQogCkBAIC0zODcsOCArMzg1LDggQEAKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAogCWlmIChza2JfaXNfZ3NvKHNrYikgJiYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgIT0gU0tCX0dTT19GQ09FKSkgewotCQlEUFJJTlRLKERSViwgRVJSLCAiV3JvbmcgZ3NvIHR5cGUgJWQ6ZXhwZWN0aW5nIFNLQl9HU09fRkNPRVxuIiwKLQkJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUpOworCQllX2VycihkcnYsICJXcm9uZyBnc28gdHlwZSAlZDpleHBlY3RpbmcgU0tCX0dTT19GQ09FXG4iLAorCQkgICAgICBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MTQsNyArNDEyLDcgQEAKIAkJZmNvZV9zb2ZfZW9mIHw9IElYR0JFX0FEVlRYRF9GQ09FRl9TT0Y7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCURQUklOVEsoRFJWLCBXQVJOSU5HLCAidW5rbm93biBzb2YgPSAweCV4XG4iLCBzb2YpOworCQllX3dhcm4oZHJ2LCAidW5rbm93biBzb2YgPSAweCV4XG4iLCBzb2YpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ0MSw3ICs0MzksNyBAQAogCQlmY29lX3NvZl9lb2YgfD0gSVhHQkVfQURWVFhEX0ZDT0VGX0VPRl9BOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlEUFJJTlRLKERSViwgV0FSTklORywgInVua25vd24gZW9mID0gMHgleFxuIiwgZW9mKTsKKwkJZV93YXJuKGRydiwgInVua25vd24gZW9mID0gMHgleFxuIiwgZW9mKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MTcsOCArNTE1LDcgQEAKIAkJCQkJICAgICBhZGFwdGVyLT5wZGV2LCBJWEdCRV9GQ1BUUl9NQVgsCiAJCQkJCSAgICAgSVhHQkVfRkNQVFJfQUxJR04sIFBBR0VfU0laRSk7CiAJCWlmICghZmNvZS0+cG9vbCkKLQkJCURQUklOVEsoRFJWLCBFUlIsCi0JCQkJImZhaWxlZCB0byBhbGxvY2F0ZWQgRkNvRSBERFAgcG9vbFxuIik7CisJCQllX2VycihkcnYsICJmYWlsZWQgdG8gYWxsb2NhdGVkIEZDb0UgRERQIHBvb2xcbiIpOwogCiAJCXNwaW5fbG9ja19pbml0KCZmY29lLT5sb2NrKTsKIAl9CkBAIC02MTQsNyArNjExLDcgQEAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZDT0VfRU5BQkxFRCkKIAkJZ290byBvdXRfZW5hYmxlOwogCi0JRFBSSU5USyhEUlYsIElORk8sICJFbmFibGluZyBGQ29FIG9mZmxvYWQgZmVhdHVyZXMuXG4iKTsKKwllX2luZm8oZHJ2LCAiRW5hYmxpbmcgRkNvRSBvZmZsb2FkIGZlYXR1cmVzLlxuIik7CiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJbmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChuZXRkZXYpOwogCkBAIC02MjUsOSArNjIyLDYgQEAKIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfRkNPRV9DUkM7CiAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0ZTTzsKIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfRkNPRV9NVFU7Ci0JbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfRkNPRV9DUkM7Ci0JbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfRlNPOwotCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX0ZDT0VfTVRVOwogCW5ldGRldi0+ZmNvZV9kZHBfeGlkID0gSVhHQkVfRkNPRV9ERFBfTUFYIC0gMTsKIAogCWl4Z2JlX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKQEAgLTY2MCwyNSArNjU0LDIxIEBACiAJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZDT0VfRU5BQkxFRCkpCiAJCWdvdG8gb3V0X2Rpc2FibGU7CiAKLQlEUFJJTlRLKERSViwgSU5GTywgIkRpc2FibGluZyBGQ29FIG9mZmxvYWQgZmVhdHVyZXMuXG4iKTsKKwllX2luZm8oZHJ2LCAiRGlzYWJsaW5nIEZDb0Ugb2ZmbG9hZCBmZWF0dXJlcy5cbiIpOworCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfRkNPRV9DUkM7CisJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9GU087CisJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9GQ09FX01UVTsKKwluZXRkZXYtPmZjb2VfZGRwX3hpZCA9IDA7CisJbmV0ZGV2X2ZlYXR1cmVzX2NoYW5nZShuZXRkZXYpOworCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJbmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChuZXRkZXYpOwogCiAJaXhnYmVfY2xlYXJfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKLQogCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0ZDT0VfRU5BQkxFRDsKIAlhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX0ZDT0VdLmluZGljZXMgPSAwOwotCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfRkNPRV9DUkM7Ci0JbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9GU087Ci0JbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9GQ09FX01UVTsKLQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgJj0gfk5FVElGX0ZfRkNPRV9DUkM7Ci0JbmV0ZGV2LT52bGFuX2ZlYXR1cmVzICY9IH5ORVRJRl9GX0ZTTzsKLQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgJj0gfk5FVElGX0ZfRkNPRV9NVFU7Ci0JbmV0ZGV2LT5mY29lX2RkcF94aWQgPSAwOwotCiAJaXhnYmVfY2xlYW51cF9mY29lKGFkYXB0ZXIpOwogCWl4Z2JlX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKLQluZXRkZXZfZmVhdHVyZXNfY2hhbmdlKG5ldGRldik7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQluZXRkZXYtPm5ldGRldl9vcHMtPm5kb19vcGVuKG5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKaW5kZXggN2I1ZDk3Ni4uN2Q2YTQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYwpAQCAtNTIsNyArNTIsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgaXhnYmVfZHJpdmVyX3N0cmluZ1tdID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlbChSKSAxMCBHaWdhYml0IFBDSSBFeHByZXNzIE5ldHdvcmsgRHJpdmVyIjsKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjYyLWsyIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjg0LWsyIgogY29uc3QgY2hhciBpeGdiZV9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY2hhciBpeGdiZV9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi4iOwogCkBAIC02OTYsMTkgKzY5NiwxOSBAQAogCQkvKiBkZXRlY3RlZCBUeCB1bml0IGhhbmcgKi8KIAkJdW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MgKnR4X2Rlc2M7CiAJCXR4X2Rlc2MgPSBJWEdCRV9UWF9ERVNDX0FEVigqdHhfcmluZywgZW9wKTsKLQkJRFBSSU5USyhEUlYsIEVSUiwgIkRldGVjdGVkIFR4IFVuaXQgSGFuZ1xuIgotCQkJIiAgVHggUXVldWUgICAgICAgICAgICAgPCVkPlxuIgotCQkJIiAgVERILCBURFQgICAgICAgICAgICAgPCV4PiwgPCV4PlxuIgotCQkJIiAgbmV4dF90b191c2UgICAgICAgICAgPCV4PlxuIgotCQkJIiAgbmV4dF90b19jbGVhbiAgICAgICAgPCV4PlxuIgotCQkJInR4X2J1ZmZlcl9pbmZvW25leHRfdG9fY2xlYW5dXG4iCi0JCQkiICB0aW1lX3N0YW1wICAgICAgICAgICA8JWx4PlxuIgotCQkJIiAgamlmZmllcyAgICAgICAgICAgICAgPCVseD5cbiIsCi0JCQl0eF9yaW5nLT5xdWV1ZV9pbmRleCwKLQkJCUlYR0JFX1JFQURfUkVHKGh3LCB0eF9yaW5nLT5oZWFkKSwKLQkJCUlYR0JFX1JFQURfUkVHKGh3LCB0eF9yaW5nLT50YWlsKSwKLQkJCXR4X3JpbmctPm5leHRfdG9fdXNlLCBlb3AsCi0JCQl0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tlb3BdLnRpbWVfc3RhbXAsIGppZmZpZXMpOworCQllX2VycihkcnYsICJEZXRlY3RlZCBUeCBVbml0IEhhbmdcbiIKKwkJICAgICAgIiAgVHggUXVldWUgICAgICAgICAgICAgPCVkPlxuIgorCQkgICAgICAiICBUREgsIFREVCAgICAgICAgICAgICA8JXg+LCA8JXg+XG4iCisJCSAgICAgICIgIG5leHRfdG9fdXNlICAgICAgICAgIDwleD5cbiIKKwkJICAgICAgIiAgbmV4dF90b19jbGVhbiAgICAgICAgPCV4PlxuIgorCQkgICAgICAidHhfYnVmZmVyX2luZm9bbmV4dF90b19jbGVhbl1cbiIKKwkJICAgICAgIiAgdGltZV9zdGFtcCAgICAgICAgICAgPCVseD5cbiIKKwkJICAgICAgIiAgamlmZmllcyAgICAgICAgICAgICAgPCVseD5cbiIsCisJCSAgICAgIHR4X3JpbmctPnF1ZXVlX2luZGV4LAorCQkgICAgICBJWEdCRV9SRUFEX1JFRyhodywgdHhfcmluZy0+aGVhZCksCisJCSAgICAgIElYR0JFX1JFQURfUkVHKGh3LCB0eF9yaW5nLT50YWlsKSwKKwkJICAgICAgdHhfcmluZy0+bmV4dF90b191c2UsIGVvcCwKKwkJICAgICAgdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bZW9wXS50aW1lX3N0YW1wLCBqaWZmaWVzKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC04MTIsOSArODEyLDggQEAKIAlpZiAoYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcpIHsKIAkJaWYgKGl4Z2JlX2NoZWNrX3R4X2hhbmcoYWRhcHRlciwgdHhfcmluZywgaSkpIHsKIAkJCS8qIHNjaGVkdWxlIGltbWVkaWF0ZSByZXNldCBpZiB3ZSBiZWxpZXZlIHdlIGh1bmcgKi8KLQkJCURQUklOVEsoUFJPQkUsIElORk8sCi0JCQkgICAgICAgICJ0eCBoYW5nICVkIGRldGVjdGVkLCByZXNldHRpbmcgYWRhcHRlclxuIiwKLQkJCSAgICAgICAgYWRhcHRlci0+dHhfdGltZW91dF9jb3VudCArIDEpOworCQkJZV9pbmZvKHByb2JlLCAidHggaGFuZyAlZCBkZXRlY3RlZCwgcmVzZXR0aW5nICIKKwkJCSAgICAgICAiYWRhcHRlclxuIiwgYWRhcHRlci0+dHhfdGltZW91dF9jb3VudCArIDEpOwogCQkJaXhnYmVfdHhfdGltZW91dChhZGFwdGVyLT5uZXRkZXYpOwogCQl9CiAJfQpAQCAtMTY1MywxMCArMTY1MiwxMCBAQAogCQkJCXJldHVybjsKIAkJCWJyZWFrOwogCQl9Ci0JCURQUklOVEsoRFJWLCBFUlIsICJOZXR3b3JrIGFkYXB0ZXIgaGFzIGJlZW4gc3RvcHBlZCBiZWNhdXNlIGl0ICIKLQkJICAgICAgICAiaGFzIG92ZXIgaGVhdGVkLiBSZXN0YXJ0IHRoZSBjb21wdXRlci4gSWYgdGhlIHByb2JsZW0gIgotCQkgICAgICAgICJwZXJzaXN0cywgcG93ZXIgb2ZmIHRoZSBzeXN0ZW0gYW5kIHJlcGxhY2UgdGhlICIKLQkJICAgICAgICAiYWRhcHRlclxuIik7CisJCWVfY3JpdChkcnYsICJOZXR3b3JrIGFkYXB0ZXIgaGFzIGJlZW4gc3RvcHBlZCBiZWNhdXNlIGl0IGhhcyAiCisJCSAgICAgICAib3ZlciBoZWF0ZWQuIFJlc3RhcnQgdGhlIGNvbXB1dGVyLiBJZiB0aGUgcHJvYmxlbSAiCisJCSAgICAgICAicGVyc2lzdHMsIHBvd2VyIG9mZiB0aGUgc3lzdGVtIGFuZCByZXBsYWNlIHRoZSAiCisJCSAgICAgICAiYWRhcHRlclxuIik7CiAJCS8qIHdyaXRlIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FSUNSLCBJWEdCRV9FSUNSX0dQSV9TRFAwKTsKIAl9CkBAIC0xNjY4LDcgKzE2NjcsNyBAQAogCiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkFOX0ZBSUxfQ0FQQUJMRSkgJiYKIAkgICAgKGVpY3IgJiBJWEdCRV9FSUNSX0dQSV9TRFAxKSkgewotCQlEUFJJTlRLKFBST0JFLCBDUklULCAiRmFuIGhhcyBzdG9wcGVkLCByZXBsYWNlIHRoZSBhZGFwdGVyXG4iKTsKKwkJZV9jcml0KHByb2JlLCAiRmFuIGhhcyBzdG9wcGVkLCByZXBsYWNlIHRoZSBhZGFwdGVyXG4iKTsKIAkJLyogd3JpdGUgdG8gY2xlYXIgdGhlIGludGVycnVwdCAqLwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VJQ1IsIElYR0JFX0VJQ1JfR1BJX1NEUDEpOwogCX0KQEAgLTIxNTQsOSArMjE1Myw4IEBACiAJCSAgICAgICAgICAgICAgICAgIGhhbmRsZXIsIDAsIGFkYXB0ZXItPm5hbWVbdmVjdG9yXSwKIAkJICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cV92ZWN0b3JbdmVjdG9yXSk7CiAJCWlmIChlcnIpIHsKLQkJCURQUklOVEsoUFJPQkUsIEVSUiwKLQkJCSAgICAgICAgInJlcXVlc3RfaXJxIGZhaWxlZCBmb3IgTVNJWCBpbnRlcnJ1cHQgIgotCQkJICAgICAgICAiRXJyb3I6ICVkXG4iLCBlcnIpOworCQkJZV9lcnIocHJvYmUsICJyZXF1ZXN0X2lycSBmYWlsZWQgZm9yIE1TSVggaW50ZXJydXB0ICIKKwkJCSAgICAgICJFcnJvcjogJWRcbiIsIGVycik7CiAJCQlnb3RvIGZyZWVfcXVldWVfaXJxczsKIAkJfQogCX0KQEAgLTIxNjUsOCArMjE2Myw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLAogCSAgICAgICAgICAgICAgICAgIGl4Z2JlX21zaXhfbHNjLCAwLCBhZGFwdGVyLT5uYW1lW3ZlY3Rvcl0sIG5ldGRldik7CiAJaWYgKGVycikgewotCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkicmVxdWVzdF9pcnEgZm9yIG1zaXhfbHNjIGZhaWxlZDogJWRcbiIsIGVycik7CisJCWVfZXJyKHByb2JlLCAicmVxdWVzdF9pcnEgZm9yIG1zaXhfbHNjIGZhaWxlZDogJWRcbiIsIGVycik7CiAJCWdvdG8gZnJlZV9xdWV1ZV9pcnFzOwogCX0KIApAQCAtMjM1Miw3ICsyMzQ5LDcgQEAKIAl9CiAKIAlpZiAoZXJyKQotCQlEUFJJTlRLKFBST0JFLCBFUlIsICJyZXF1ZXN0X2lycSBmYWlsZWQsIEVycm9yICVkXG4iLCBlcnIpOworCQllX2Vycihwcm9iZSwgInJlcXVlc3RfaXJxIGZhaWxlZCwgRXJyb3IgJWRcbiIsIGVycik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjQyMyw3ICsyNDIwLDcgQEAKIAltYXBfdmVjdG9yX3RvX3J4cShhZGFwdGVyLCAwLCAwKTsKIAltYXBfdmVjdG9yX3RvX3R4cShhZGFwdGVyLCAwLCAwKTsKIAotCURQUklOVEsoSFcsIElORk8sICJMZWdhY3kgaW50ZXJydXB0IElWQVIgc2V0dXAgZG9uZVxuIik7CisJZV9pbmZvKGh3LCAiTGVnYWN5IGludGVycnVwdCBJVkFSIHNldHVwIGRvbmVcbiIpOwogfQogCiAvKioKQEAgLTI4MDMsMTAgKzI4MDAsOCBAQAogCQkgICAgLyogUGVyZm9ybSBoYXNoIG9uIHRoZXNlIHBhY2tldCB0eXBlcyAqLwogCQltcnFjIHw9IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjQKIAkJICAgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY0X1RDUAotCQkgICAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjRfVURQCiAJCSAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNgotCQkgICAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjZfVENQCi0JCSAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNl9VRFA7CisJCSAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNl9UQ1A7CiAJfQogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVJRQywgbXJxYyk7CiAKQEAgLTI5OTUsNiArMjk5MCw0OCBAQAogfQogCiAvKioKKyAqIGl4Z2JlX3dyaXRlX3VjX2FkZHJfbGlzdCAtIHdyaXRlIHVuaWNhc3QgYWRkcmVzc2VzIHRvIFJBUiB0YWJsZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFdyaXRlcyB1bmljYXN0IGFkZHJlc3MgbGlzdCB0byB0aGUgUkFSIHRhYmxlLgorICogUmV0dXJuczogLUVOT01FTSBvbiBmYWlsdXJlL2luc3VmZmljaWVudCBhZGRyZXNzIHNwYWNlCisgKiAgICAgICAgICAgICAgICAwIG9uIG5vIGFkZHJlc3NlcyB3cml0dGVuCisgKiAgICAgICAgICAgICAgICBYIG9uIHdyaXRpbmcgWCBhZGRyZXNzZXMgdG8gdGhlIFJBUiB0YWJsZQorICoqLworc3RhdGljIGludCBpeGdiZV93cml0ZV91Y19hZGRyX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1bnNpZ25lZCBpbnQgdmZuID0gYWRhcHRlci0+bnVtX3ZmczsKKwl1bnNpZ25lZCBpbnQgcmFyX2VudHJpZXMgPSBody0+bWFjLm51bV9yYXJfZW50cmllcyAtICh2Zm4gKyAxKTsKKwlpbnQgY291bnQgPSAwOworCisJLyogcmV0dXJuIEVOT01FTSBpbmRpY2F0aW5nIGluc3VmZmljaWVudCBtZW1vcnkgZm9yIGFkZHJlc3NlcyAqLworCWlmIChuZXRkZXZfdWNfY291bnQobmV0ZGV2KSA+IHJhcl9lbnRyaWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghbmV0ZGV2X3VjX2VtcHR5KG5ldGRldikgJiYgcmFyX2VudHJpZXMpIHsKKwkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwkJLyogcmV0dXJuIGVycm9yIGlmIHdlIGRvIG5vdCBzdXBwb3J0IHdyaXRpbmcgdG8gUkFSIHRhYmxlICovCisJCWlmICghaHctPm1hYy5vcHMuc2V0X3JhcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW5ldGRldl9mb3JfZWFjaF91Y19hZGRyKGhhLCBuZXRkZXYpIHsKKwkJCWlmICghcmFyX2VudHJpZXMpCisJCQkJYnJlYWs7CisJCQlody0+bWFjLm9wcy5zZXRfcmFyKGh3LCByYXJfZW50cmllcy0tLCBoYS0+YWRkciwKKwkJCQkJICAgIHZmbiwgSVhHQkVfUkFIX0FWKTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisJLyogd3JpdGUgdGhlIGFkZHJlc3NlcyBpbiByZXZlcnNlIG9yZGVyIHRvIGF2b2lkIHdyaXRlIGNvbWJpbmluZyAqLworCWZvciAoOyByYXJfZW50cmllcyA+IDAgOyByYXJfZW50cmllcy0tKQorCQlody0+bWFjLm9wcy5jbGVhcl9yYXIoaHcsIHJhcl9lbnRyaWVzKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCiAgKiBpeGdiZV9zZXRfcnhfbW9kZSAtIFVuaWNhc3QsIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqCkBAIC0zMDA3LDM4ICszMDQ0LDU4IEBACiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0JdTMyIGZjdHJsOworCXUzMiBmY3RybCwgdm1vbHIgPSBJWEdCRV9WTU9MUl9CQU0gfCBJWEdCRV9WTU9MUl9BVVBFOworCWludCBjb3VudDsKIAogCS8qIENoZWNrIGZvciBQcm9taXNjdW91cyBhbmQgQWxsIE11bHRpY2FzdCBtb2RlcyAqLwogCiAJZmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkNUUkwpOwogCisJLyogY2xlYXIgdGhlIGJpdHMgd2UgYXJlIGNoYW5naW5nIHRoZSBzdGF0dXMgb2YgKi8KKwlmY3RybCAmPSB+KElYR0JFX0ZDVFJMX1VQRSB8IElYR0JFX0ZDVFJMX01QRSk7CisKIAlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCWh3LT5hZGRyX2N0cmwudXNlcl9zZXRfcHJvbWlzYyA9IHRydWU7CiAJCWZjdHJsIHw9IChJWEdCRV9GQ1RSTF9VUEUgfCBJWEdCRV9GQ1RSTF9NUEUpOworCQl2bW9sciB8PSAoSVhHQkVfVk1PTFJfUk9QRSB8IElYR0JFX1ZNT0xSX01QRSk7CiAJCS8qIGRvbid0IGhhcmR3YXJlIGZpbHRlciB2bGFucyBpbiBwcm9taXNjIG1vZGUgKi8KIAkJaXhnYmVfdmxhbl9maWx0ZXJfZGlzYWJsZShhZGFwdGVyKTsKIAl9IGVsc2UgewogCQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewogCQkJZmN0cmwgfD0gSVhHQkVfRkNUUkxfTVBFOwotCQkJZmN0cmwgJj0gfklYR0JFX0ZDVFJMX1VQRTsKLQkJfSBlbHNlIGlmICghaHctPmFkZHJfY3RybC51Y19zZXRfcHJvbWlzYykgewotCQkJZmN0cmwgJj0gfihJWEdCRV9GQ1RSTF9VUEUgfCBJWEdCRV9GQ1RSTF9NUEUpOworCQkJdm1vbHIgfD0gSVhHQkVfVk1PTFJfTVBFOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdyaXRlIGFkZHJlc3NlcyB0byB0aGUgTVRBLCBpZiB0aGUgYXR0ZW1wdCBmYWlscworCQkJICogdGhlbiB3ZSBzaG91bGQganVzdCB0dXJuIG9uIHByb21pc2NvdXMgbW9kZSBzbworCQkJICogdGhhdCB3ZSBjYW4gYXQgbGVhc3QgcmVjZWl2ZSBtdWx0aWNhc3QgdHJhZmZpYworCQkJICovCisJCQlody0+bWFjLm9wcy51cGRhdGVfbWNfYWRkcl9saXN0KGh3LCBuZXRkZXYpOworCQkJdm1vbHIgfD0gSVhHQkVfVk1PTFJfUk9NUEU7CiAJCX0KIAkJaXhnYmVfdmxhbl9maWx0ZXJfZW5hYmxlKGFkYXB0ZXIpOwogCQlody0+YWRkcl9jdHJsLnVzZXJfc2V0X3Byb21pc2MgPSBmYWxzZTsKKwkJLyoKKwkJICogV3JpdGUgYWRkcmVzc2VzIHRvIGF2YWlsYWJsZSBSQVIgcmVnaXN0ZXJzLCBpZiB0aGVyZSBpcyBub3QKKwkJICogc3VmZmljaWVudCBzcGFjZSB0byBzdG9yZSBhbGwgdGhlIGFkZHJlc3NlcyB0aGVuIGVuYWJsZQorCQkgKiB1bmljYXN0IHByb21pc2NvdXMgbW9kZQorCQkgKi8KKwkJY291bnQgPSBpeGdiZV93cml0ZV91Y19hZGRyX2xpc3QobmV0ZGV2KTsKKwkJaWYgKGNvdW50IDwgMCkgeworCQkJZmN0cmwgfD0gSVhHQkVfRkNUUkxfVVBFOworCQkJdm1vbHIgfD0gSVhHQkVfVk1PTFJfUk9QRTsKKwkJfQorCX0KKworCWlmIChhZGFwdGVyLT5udW1fdmZzKSB7CisJCWl4Z2JlX3Jlc3RvcmVfdmZfbXVsdGljYXN0cyhhZGFwdGVyKTsKKwkJdm1vbHIgfD0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZNT0xSKGFkYXB0ZXItPm51bV92ZnMpKSAmCisJCQkgfihJWEdCRV9WTU9MUl9NUEUgfCBJWEdCRV9WTU9MUl9ST01QRSB8CisJCQkgICBJWEdCRV9WTU9MUl9ST1BFKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTU9MUihhZGFwdGVyLT5udW1fdmZzKSwgdm1vbHIpOwogCX0KIAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNUUkwsIGZjdHJsKTsKLQotCS8qIHJlcHJvZ3JhbSBzZWNvbmRhcnkgdW5pY2FzdCBsaXN0ICovCi0JaHctPm1hYy5vcHMudXBkYXRlX3VjX2FkZHJfbGlzdChodywgbmV0ZGV2KTsKLQotCS8qIHJlcHJvZ3JhbSBtdWx0aWNhc3QgbGlzdCAqLwotCWh3LT5tYWMub3BzLnVwZGF0ZV9tY19hZGRyX2xpc3QoaHcsIG5ldGRldik7Ci0KLQlpZiAoYWRhcHRlci0+bnVtX3ZmcykKLQkJaXhnYmVfcmVzdG9yZV92Zl9tdWx0aWNhc3RzKGFkYXB0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9uYXBpX2VuYWJsZV9hbGwoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0zMjU3LDggKzMzMTQsOCBAQAogCQkJbXNsZWVwKDEpOwogCX0KIAlpZiAoayA+PSBJWEdCRV9NQVhfUlhfREVTQ19QT0xMKSB7Ci0JCURQUklOVEsoRFJWLCBFUlIsICJSWERDVEwuRU5BQkxFIG9uIFJ4IHF1ZXVlICVkICIKLQkJICAgICAgICAibm90IHNldCB3aXRoaW4gdGhlIHBvbGxpbmcgcGVyaW9kXG4iLCByeHIpOworCQllX2VycihkcnYsICJSWERDVEwuRU5BQkxFIG9uIFJ4IHF1ZXVlICVkIG5vdCBzZXQgd2l0aGluICIKKwkJICAgICAgInRoZSBwb2xsaW5nIHBlcmlvZFxuIiwgcnhyKTsKIAl9CiAJaXhnYmVfcmVsZWFzZV9yeF9kZXNjKCZhZGFwdGVyLT5odywgYWRhcHRlci0+cnhfcmluZ1tyeHJdLAogCSAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci0+cnhfcmluZ1tyeHJdLT5jb3VudCAtIDEpKTsKQEAgLTMzODcsOCArMzQ0NCw3IEBACiAJCQl9IHdoaWxlICgtLXdhaXRfbG9vcCAmJgogCQkJICAgICAgICAgISh0eGRjdGwgJiBJWEdCRV9UWERDVExfRU5BQkxFKSk7CiAJCQlpZiAoIXdhaXRfbG9vcCkKLQkJCQlEUFJJTlRLKERSViwgRVJSLCAiQ291bGQgbm90IGVuYWJsZSAiCi0JCQkJICAgICAgICAiVHggUXVldWUgJWRcbiIsIGopOworCQkJCWVfZXJyKGRydiwgIkNvdWxkIG5vdCBlbmFibGUgVHggUXVldWUgJWRcbiIsIGopOwogCQl9CiAJfQogCkBAIC0zNDM2LDggKzM0OTIsNyBAQAogCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkFOX0ZBSUxfQ0FQQUJMRSkgewogCQl1MzIgZXNkcCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FU0RQKTsKIAkJaWYgKGVzZHAgJiBJWEdCRV9FU0RQX1NEUDEpCi0JCQlEUFJJTlRLKERSViwgQ1JJVCwKLQkJCQkiRmFuIGhhcyBzdG9wcGVkLCByZXBsYWNlIHRoZSBhZGFwdGVyXG4iKTsKKwkJCWVfY3JpdChkcnYsICJGYW4gaGFzIHN0b3BwZWQsIHJlcGxhY2UgdGhlIGFkYXB0ZXJcbiIpOwogCX0KIAogCS8qCkBAIC0zNDY2LDcgKzM1MjEsNyBAQAogCX0gZWxzZSB7CiAJCWVyciA9IGl4Z2JlX25vbl9zZnBfbGlua19jb25maWcoaHcpOwogCQlpZiAoZXJyKQotCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAibGlua19jb25maWcgRkFJTEVEICVkXG4iLCBlcnIpOworCQkJZV9lcnIocHJvYmUsICJsaW5rX2NvbmZpZyBGQUlMRUQgJWRcbiIsIGVycik7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKQEAgLTM1MjcsMTkgKzM1ODIsMTkgQEAKIAljYXNlIElYR0JFX0VSUl9TRlBfTk9UX1BSRVNFTlQ6CiAJCWJyZWFrOwogCWNhc2UgSVhHQkVfRVJSX01BU1RFUl9SRVFVRVNUU19QRU5ESU5HOgotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJtYXN0ZXIgZGlzYWJsZSB0aW1lZCBvdXRcbiIpOworCQllX2Rldl9lcnIoIm1hc3RlciBkaXNhYmxlIHRpbWVkIG91dFxuIik7CiAJCWJyZWFrOwogCWNhc2UgSVhHQkVfRVJSX0VFUFJPTV9WRVJTSU9OOgogCQkvKiBXZSBhcmUgcnVubmluZyBvbiBhIHByZS1wcm9kdWN0aW9uIGRldmljZSwgbG9nIGEgd2FybmluZyAqLwotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiVGhpcyBkZXZpY2UgaXMgYSBwcmUtcHJvZHVjdGlvbiAiCi0JCSAgICAgICAgICJhZGFwdGVyL0xPTS4gIFBsZWFzZSBiZSBhd2FyZSB0aGVyZSBtYXkgYmUgaXNzdWVzICIKLQkJICAgICAgICAgImFzc29jaWF0ZWQgd2l0aCB5b3VyIGhhcmR3YXJlLiAgSWYgeW91IGFyZSAiCi0JCSAgICAgICAgICJleHBlcmllbmNpbmcgcHJvYmxlbXMgcGxlYXNlIGNvbnRhY3QgeW91ciBJbnRlbCBvciAiCi0JCSAgICAgICAgICJoYXJkd2FyZSByZXByZXNlbnRhdGl2ZSB3aG8gcHJvdmlkZWQgeW91IHdpdGggdGhpcyAiCi0JCSAgICAgICAgICJoYXJkd2FyZS5cbiIpOworCQllX2Rldl93YXJuKCJUaGlzIGRldmljZSBpcyBhIHByZS1wcm9kdWN0aW9uIGFkYXB0ZXIvTE9NLiAiCisJCQkgICAiUGxlYXNlIGJlIGF3YXJlIHRoZXJlIG1heSBiZSBpc3N1ZXNhc3NvY2lhdGVkIHdpdGggIgorCQkJICAgInlvdXIgaGFyZHdhcmUuICBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBwcm9ibGVtcyAiCisJCQkgICAicGxlYXNlIGNvbnRhY3QgeW91ciBJbnRlbCBvciBoYXJkd2FyZSAiCisJCQkgICAicmVwcmVzZW50YXRpdmUgd2hvIHByb3ZpZGVkIHlvdSB3aXRoIHRoaXMgIgorCQkJICAgImhhcmR3YXJlLlxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkhhcmR3YXJlIEVycm9yOiAlZFxuIiwgZXJyKTsKKwkJZV9kZXZfZXJyKCJIYXJkd2FyZSBFcnJvcjogJWRcbiIsIGVycik7CiAJfQogCiAJLyogcmVwcm9ncmFtIHRoZSBSQVJbMF0gaW4gY2FzZSB1c2VyIGNoYW5nZWQgaXQuICovCkBAIC0zOTIwLDEyICszOTc1LDEyIEBACiAJCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSAxOwogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19EQ0JfRU5BQkxFRCkgewotCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIkZDb0UgZW5hYmxlZCB3aXRoIERDQlxuIik7CisJCQllX2luZm8ocHJvYmUsICJGQ29FIGVuYWJsZWQgd2l0aCBEQ0JcbiIpOwogCQkJaXhnYmVfc2V0X2RjYl9xdWV1ZXMoYWRhcHRlcik7CiAJCX0KICNlbmRpZgogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JTU19FTkFCTEVEKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRkNvRSBlbmFibGVkIHdpdGggUlNTXG4iKTsKKwkJCWVfaW5mbyhwcm9iZSwgIkZDb0UgZW5hYmxlZCB3aXRoIFJTU1xuIik7CiAJCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSkgfHwKIAkJCSAgICAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkKIAkJCQlpeGdiZV9zZXRfZmRpcl9xdWV1ZXMoYWRhcHRlcik7CkBAIC00MDM4LDcgKzQwOTMsOCBAQAogCQkgKiBUaGlzIGp1c3QgbWVhbnMgd2UnbGwgZ28gd2l0aCBlaXRoZXIgYSBzaW5nbGUgTVNJCiAJCSAqIHZlY3RvciBvciBmYWxsIGJhY2sgdG8gbGVnYWN5IGludGVycnVwdHMuCiAJCSAqLwotCQlEUFJJTlRLKEhXLCBERUJVRywgIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0ktWCBpbnRlcnJ1cHRzXG4iKTsKKwkJbmV0aWZfcHJpbnRrKGFkYXB0ZXIsIGh3LCBLRVJOX0RFQlVHLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgTVNJLVggaW50ZXJydXB0c1xuIik7CiAJCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX01TSVhfRU5BQkxFRDsKIAkJa2ZyZWUoYWRhcHRlci0+bXNpeF9lbnRyaWVzKTsKIAkJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0gTlVMTDsKQEAgLTQ0MzUsOCArNDQ5MSw5IEBACiAJaWYgKCFlcnIpIHsKIAkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19NU0lfRU5BQkxFRDsKIAl9IGVsc2UgewotCQlEUFJJTlRLKEhXLCBERUJVRywgIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0kgaW50ZXJydXB0LCAiCi0JCSAgICAgICAgImZhbGxpbmcgYmFjayB0byBsZWdhY3kuICBFcnJvcjogJWRcbiIsIGVycik7CisJCW5ldGlmX3ByaW50ayhhZGFwdGVyLCBodywgS0VSTl9ERUJVRywgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSSBpbnRlcnJ1cHQsICIKKwkJCSAgICAgImZhbGxpbmcgYmFjayB0byBsZWdhY3kuICBFcnJvcjogJWRcbiIsIGVycik7CiAJCS8qIHJlc2V0IGVyciAqLwogCQllcnIgPSAwOwogCX0KQEAgLTQ1NTcsMjcgKzQ2MTQsMjUgQEAKIAogCWVyciA9IGl4Z2JlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKIAlpZiAoZXJyKSB7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgIlVuYWJsZSB0byBzZXR1cCBpbnRlcnJ1cHQgY2FwYWJpbGl0aWVzXG4iKTsKKwkJZV9kZXZfZXJyKCJVbmFibGUgdG8gc2V0dXAgaW50ZXJydXB0IGNhcGFiaWxpdGllc1xuIik7CiAJCWdvdG8gZXJyX3NldF9pbnRlcnJ1cHQ7CiAJfQogCiAJZXJyID0gaXhnYmVfYWxsb2NfcV92ZWN0b3JzKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKLQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWUgIgotCQkgICAgICAgICJ2ZWN0b3JzXG4iKTsKKwkJZV9kZXZfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZSB2ZWN0b3JzXG4iKTsKIAkJZ290byBlcnJfYWxsb2NfcV92ZWN0b3JzOwogCX0KIAogCWVyciA9IGl4Z2JlX2FsbG9jX3F1ZXVlcyhhZGFwdGVyKTsKIAlpZiAoZXJyKSB7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlc1xuIik7CisJCWVfZGV2X2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWVzXG4iKTsKIAkJZ290byBlcnJfYWxsb2NfcXVldWVzOwogCX0KIAotCURQUklOVEsoRFJWLCBJTkZPLCAiTXVsdGlxdWV1ZSAlczogUnggUXVldWUgY291bnQgPSAldSwgIgotCSAgICAgICAgIlR4IFF1ZXVlIGNvdW50ID0gJXVcbiIsCi0JICAgICAgICAoYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA+IDEpID8gIkVuYWJsZWQiIDoKLQkgICAgICAgICJEaXNhYmxlZCIsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOworCWVfZGV2X2luZm8oIk11bHRpcXVldWUgJXM6IFJ4IFF1ZXVlIGNvdW50ID0gJXUsIFR4IFF1ZXVlIGNvdW50ID0gJXVcbiIsCisJCSAgIChhZGFwdGVyLT5udW1fcnhfcXVldWVzID4gMSkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLAorCQkgICBhZGFwdGVyLT5udW1fcnhfcXVldWVzLCBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKIAogCXNldF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpOwogCkBAIC00NjQ4LDE1ICs0NzAzLDEzIEBACiAJCQlnb3RvIHJlc2NoZWR1bGU7CiAJCXJldCA9IGh3LT5waHkub3BzLnJlc2V0KGh3KTsKIAkJaWYgKHJldCA9PSBJWEdCRV9FUlJfU0ZQX05PVF9TVVBQT1JURUQpIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplICIKLQkJCQkiYmVjYXVzZSBhbiB1bnN1cHBvcnRlZCBTRlArIG1vZHVsZSB0eXBlICIKLQkJCQkid2FzIGRldGVjdGVkLlxuIgotCQkJCSJSZWxvYWQgdGhlIGRyaXZlciBhZnRlciBpbnN0YWxsaW5nIGEgIgotCQkJCSJzdXBwb3J0ZWQgbW9kdWxlLlxuIik7CisJCQllX2Rldl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIGJlY2F1c2UgYW4gdW5zdXBwb3J0ZWQgIgorCQkJCSAgIlNGUCsgbW9kdWxlIHR5cGUgd2FzIGRldGVjdGVkLlxuIik7CisJCQllX2Rldl9lcnIoIlJlbG9hZCB0aGUgZHJpdmVyIGFmdGVyIGluc3RhbGxpbmcgYSAiCisJCQkJICAic3VwcG9ydGVkIG1vZHVsZS5cbiIpOwogCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+bmV0ZGV2KTsKIAkJfSBlbHNlIHsKLQkJCURQUklOVEsoUFJPQkUsIElORk8sICJkZXRlY3RlZCBTRlArOiAlZFxuIiwKLQkJCSAgICAgICAgaHctPnBoeS5zZnBfdHlwZSk7CisJCQllX2luZm8ocHJvYmUsICJkZXRlY3RlZCBTRlArOiAlZFxuIiwgaHctPnBoeS5zZnBfdHlwZSk7CiAJCX0KIAkJLyogZG9uJ3QgbmVlZCB0aGlzIHJvdXRpbmUgYW55IG1vcmUgKi8KIAkJY2xlYXJfYml0KF9fSVhHQkVfU0ZQX01PRFVMRV9OT1RfRk9VTkQsICZhZGFwdGVyLT5zdGF0ZSk7CkBAIC00NzMwLDYgKzQ3ODMsNyBAQAogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAkJLyogRGVmYXVsdCB0cmFmZmljIGNsYXNzIHRvIHVzZSBmb3IgRkNvRSAqLwogCQlhZGFwdGVyLT5mY29lLnRjID0gSVhHQkVfRkNPRV9ERUZUQzsKKwkJYWRhcHRlci0+ZmNvZS51cCA9IElYR0JFX0ZDT0VfREVGVEM7CiAjZW5kaWYKICNlbmRpZiAvKiBJWEdCRV9GQ09FICovCiAJfQpAQCAtNDc4Myw3ICs0ODM3LDcgQEAKIAogCS8qIGluaXRpYWxpemUgZWVwcm9tIHBhcmFtZXRlcnMgKi8KIAlpZiAoaXhnYmVfaW5pdF9lZXByb21fcGFyYW1zX2dlbmVyaWMoaHcpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkVFUFJPTSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQllX2Rldl9lcnIoIkVFUFJPTSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTQ4MzYsOCArNDg5MCw3IEBACiBlcnI6CiAJdmZyZWUodHhfcmluZy0+dHhfYnVmZmVyX2luZm8pOwogCXR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvID0gTlVMTDsKLQlEUFJJTlRLKFBST0JFLCBFUlIsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdHJhbnNtaXQgIgotCSAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3IgcmluZ1xuIik7CisJZV9lcnIocHJvYmUsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVHggZGVzY3JpcHRvciByaW5nXG4iKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtNDg1OSw3ICs0OTEyLDcgQEAKIAkJZXJyID0gaXhnYmVfc2V0dXBfdHhfcmVzb3VyY2VzKGFkYXB0ZXIsIGFkYXB0ZXItPnR4X3JpbmdbaV0pOwogCQlpZiAoIWVycikKIAkJCWNvbnRpbnVlOwotCQlEUFJJTlRLKFBST0JFLCBFUlIsICJBbGxvY2F0aW9uIGZvciBUeCBRdWV1ZSAldSBmYWlsZWRcbiIsIGkpOworCQllX2Vycihwcm9iZSwgIkFsbG9jYXRpb24gZm9yIFR4IFF1ZXVlICV1IGZhaWxlZFxuIiwgaSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDg4NCw4ICs0OTM3LDggQEAKIAlpZiAoIXJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvKQogCQlyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CiAJaWYgKCFyeF9yaW5nLT5yeF9idWZmZXJfaW5mbykgewotCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCSAgICAgICAgInZtYWxsb2MgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRoZSByeCBkZXNjIHJpbmdcbiIpOworCQllX2Vycihwcm9iZSwgInZtYWxsb2MgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRoZSBSeCAiCisJCSAgICAgICJkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQlnb3RvIGFsbG9jX2ZhaWxlZDsKIAl9CiAJbWVtc2V0KHJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvLCAwLCBzaXplKTsKQEAgLTQ4OTgsOCArNDk1MSw4IEBACiAJCQkJCSAgICZyeF9yaW5nLT5kbWEsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFyeF9yaW5nLT5kZXNjKSB7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwKLQkJICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciB0aGUgcnggZGVzYyByaW5nXG4iKTsKKwkJZV9lcnIocHJvYmUsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRoZSBSeCAiCisJCSAgICAgICJkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQl2ZnJlZShyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyk7CiAJCWdvdG8gYWxsb2NfZmFpbGVkOwogCX0KQEAgLTQ5MzIsNyArNDk4NSw3IEBACiAJCWVyciA9IGl4Z2JlX3NldHVwX3J4X3Jlc291cmNlcyhhZGFwdGVyLCBhZGFwdGVyLT5yeF9yaW5nW2ldKTsKIAkJaWYgKCFlcnIpCiAJCQljb250aW51ZTsKLQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQWxsb2NhdGlvbiBmb3IgUnggUXVldWUgJXUgZmFpbGVkXG4iLCBpKTsKKwkJZV9lcnIocHJvYmUsICJBbGxvY2F0aW9uIGZvciBSeCBRdWV1ZSAldSBmYWlsZWRcbiIsIGkpOwogCQlicmVhazsKIAl9CiAKQEAgLTUwMzEsOCArNTA4NCw3IEBACiAJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChtYXhfZnJhbWUgPiBJWEdCRV9NQVhfSlVNQk9fRlJBTUVfU0laRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JRFBSSU5USyhQUk9CRSwgSU5GTywgImNoYW5naW5nIE1UVSBmcm9tICVkIHRvICVkXG4iLAotCSAgICAgICAgbmV0ZGV2LT5tdHUsIG5ld19tdHUpOworCWVfaW5mbyhwcm9iZSwgImNoYW5naW5nIE1UVSBmcm9tICVkIHRvICVkXG4iLCBuZXRkZXYtPm10dSwgbmV3X210dSk7CiAJLyogbXVzdCBzZXQgbmV3IE1UVSBiZWZvcmUgY2FsbGluZyBkb3duIG9yIHVwICovCiAJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OwogCkBAIC01MTQ1LDggKzUxOTcsNyBAQAogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2VfbWVtKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpeGdiZTogQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGZyb20gIgotCQkJCSJzdXNwZW5kXG4iKTsKKwkJZV9kZXZfZXJyKCJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UgZnJvbSBzdXNwZW5kXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CkBAIC01MTU1LDggKzUyMDYsNyBAQAogCiAJZXJyID0gaXhnYmVfaW5pdF9pbnRlcnJ1cHRfc2NoZW1lKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpeGdiZTogQ2Fubm90IGluaXRpYWxpemUgaW50ZXJydXB0cyBmb3IgIgotCQkgICAgICAgICAgICAgICAgImRldmljZVxuIik7CisJCWVfZGV2X2VycigiQ2Fubm90IGluaXRpYWxpemUgaW50ZXJydXB0cyBmb3IgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTU1MTcsMTAgKzU1NjcsMTAgQEAKIAllcnIgPSBody0+cGh5Lm9wcy5pZGVudGlmeV9zZnAoaHcpOwogCiAJaWYgKGVyciA9PSBJWEdCRV9FUlJfU0ZQX05PVF9TVVBQT1JURUQpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgYmVjYXVzZSAiCi0JCQkiYW4gdW5zdXBwb3J0ZWQgU0ZQKyBtb2R1bGUgdHlwZSB3YXMgZGV0ZWN0ZWQuXG4iCi0JCQkiUmVsb2FkIHRoZSBkcml2ZXIgYWZ0ZXIgaW5zdGFsbGluZyBhIHN1cHBvcnRlZCAiCi0JCQkibW9kdWxlLlxuIik7CisJCWVfZGV2X2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgYmVjYXVzZSBhbiB1bnN1cHBvcnRlZCBTRlArICIKKwkJCSAgIm1vZHVsZSB0eXBlIHdhcyBkZXRlY3RlZC5cbiIpOworCQllX2Rldl9lcnIoIlJlbG9hZCB0aGUgZHJpdmVyIGFmdGVyIGluc3RhbGxpbmcgYSBzdXBwb3J0ZWQgIgorCQkJICAibW9kdWxlLlxuIik7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPm5ldGRldik7CiAJCXJldHVybjsKIAl9CkBAIC01NTQ5LDggKzU1OTksOCBAQAogCQkJc2V0X2JpdChfX0lYR0JFX0ZESVJfSU5JVF9ET05FLAogCQkJICAgICAgICAmKGFkYXB0ZXItPnR4X3JpbmdbaV0tPnJlaW5pdF9zdGF0ZSkpOwogCX0gZWxzZSB7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwgImZhaWxlZCB0byBmaW5pc2ggRkRJUiByZS1pbml0aWFsaXphdGlvbiwgIgotCQkJImlnbm9yZWQgYWRkaW5nIEZESVIgQVRSIGZpbHRlcnNcbiIpOworCQllX2Vycihwcm9iZSwgImZhaWxlZCB0byBmaW5pc2ggRkRJUiByZS1pbml0aWFsaXphdGlvbiwgIgorCQkgICAgICAiaWdub3JlZCBhZGRpbmcgRkRJUiBBVFIgZmlsdGVyc1xuIik7CiAJfQogCS8qIERvbmUgRkRJUiBSZS1pbml0aWFsaXphdGlvbiwgZW5hYmxlIHRyYW5zbWl0cyAqLwogCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoYWRhcHRlci0+bmV0ZGV2KTsKQEAgLTU2MjEsMTYgKzU2NzEsMTQgQEAKIAkJCQlmbG93X3R4ID0gISEocm1jcyAmIElYR0JFX1JNQ1NfVEZDRV84MDJfM1gpOwogCQkJfQogCi0JCQlwcmludGsoS0VSTl9JTkZPICJpeGdiZTogJXMgTklDIExpbmsgaXMgVXAgJXMsICIKLQkJCSAgICAgICAiRmxvdyBDb250cm9sOiAlc1xuIiwKLQkJCSAgICAgICBuZXRkZXYtPm5hbWUsCisJCQllX2luZm8oZHJ2LCAiTklDIExpbmsgaXMgVXAgJXMsIEZsb3cgQ29udHJvbDogJXNcbiIsCiAJCQkgICAgICAgKGxpbmtfc3BlZWQgPT0gSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwgPwotCQkJICAgICAgICAiMTAgR2JwcyIgOgotCQkJICAgICAgICAobGlua19zcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMID8KLQkJCSAgICAgICAgICIxIEdicHMiIDogInVua25vd24gc3BlZWQiKSksCisJCQkgICAgICAgIjEwIEdicHMiIDoKKwkJCSAgICAgICAobGlua19zcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMID8KKwkJCSAgICAgICAiMSBHYnBzIiA6ICJ1bmtub3duIHNwZWVkIikpLAogCQkJICAgICAgICgoZmxvd19yeCAmJiBmbG93X3R4KSA/ICJSWC9UWCIgOgotCQkJICAgICAgICAoZmxvd19yeCA/ICJSWCIgOgotCQkJICAgICAgICAoZmxvd190eCA/ICJUWCIgOiAiTm9uZSIpKSkpOworCQkJICAgICAgIChmbG93X3J4ID8gIlJYIiA6CisJCQkgICAgICAgKGZsb3dfdHggPyAiVFgiIDogIk5vbmUiKSkpKTsKIAogCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwogCQl9IGVsc2UgewpAQCAtNTY0MSw4ICs1Njg5LDcgQEAKIAkJYWRhcHRlci0+bGlua191cCA9IGZhbHNlOwogCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gMDsKIAkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXhnYmU6ICVzIE5JQyBMaW5rIGlzIERvd25cbiIsCi0JCQkgICAgICAgbmV0ZGV2LT5uYW1lKTsKKwkJCWVfaW5mbyhkcnYsICJOSUMgTGluayBpcyBEb3duXG4iKTsKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAJCX0KIAl9CkBAIC01ODE4LDkgKzU4NjUsOSBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlpZiAodW5saWtlbHkobmV0X3JhdGVsaW1pdCgpKSkgewotCQkJCQlEUFJJTlRLKFBST0JFLCBXQVJOSU5HLAotCQkJCQkgInBhcnRpYWwgY2hlY2tzdW0gYnV0IHByb3RvPSV4IVxuIiwKLQkJCQkJIHNrYi0+cHJvdG9jb2wpOworCQkJCQllX3dhcm4ocHJvYmUsICJwYXJ0aWFsIGNoZWNrc3VtICIKKwkJCQkJICAgICAgICJidXQgcHJvdG89JXghXG4iLAorCQkJCQkgICAgICAgc2tiLT5wcm90b2NvbCk7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQpAQCAtNTkzMSw3ICs1OTc4LDcgQEAKIAlyZXR1cm4gY291bnQ7CiAKIGRtYV9lcnJvcjoKLQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUWCBETUEgbWFwIGZhaWxlZFxuIik7CisJZV9kZXZfZXJyKCJUWCBETUEgbWFwIGZhaWxlZFxuIik7CiAKIAkvKiBjbGVhciB0aW1lc3RhbXAgYW5kIGRtYSBtYXBwaW5ncyBmb3IgZmFpbGVkIHR4X2J1ZmZlcl9pbmZvIG1hcCAqLwogCXR4X2J1ZmZlcl9pbmZvLT5kbWEgPSAwOwpAQCAtNjEwMSwyMSArNjE0OCwyNiBAQAogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgdHhxID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCisjaWZkZWYgSVhHQkVfRkNPRQorCWlmICgoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9GQ09FKSkgfHwKKwkgICAgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRklQKSkpIHsKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GQ09FX0VOQUJMRUQpIHsKKwkJCXR4cSAmPSAoYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9GQ09FXS5pbmRpY2VzIC0gMSk7CisJCQl0eHEgKz0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9GQ09FXS5tYXNrOworCQkJcmV0dXJuIHR4cTsKKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpIHsKKwkJCXR4cSA9IGFkYXB0ZXItPmZjb2UudXA7CisJCQlyZXR1cm4gdHhxOworCQl9CisJfQorI2VuZGlmCisKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFKSB7CiAJCXdoaWxlICh1bmxpa2VseSh0eHEgPj0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXMpKQogCQkJdHhxIC09IGRldi0+cmVhbF9udW1fdHhfcXVldWVzOwogCQlyZXR1cm4gdHhxOwogCX0KIAotI2lmZGVmIElYR0JFX0ZDT0UKLQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GQ09FX0VOQUJMRUQpICYmCi0JICAgICgoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9GQ09FKSkgfHwKLQkgICAgIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0ZJUCkpKSkgewotCQl0eHEgJj0gKGFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfRkNPRV0uaW5kaWNlcyAtIDEpOwotCQl0eHEgKz0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9GQ09FXS5tYXNrOwotCQlyZXR1cm4gdHhxOwotCX0KLSNlbmRpZgogCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpIHsKIAkJaWYgKHNrYi0+cHJpb3JpdHkgPT0gVENfUFJJT19DT05UUk9MKQogCQkJdHhxID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9EQ0JdLmluZGljZXMtMTsKQEAgLTYxNTksMTggKzYyMTEsMTUgQEAKIAl0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZ1tza2ItPnF1ZXVlX21hcHBpbmddOwogCiAjaWZkZWYgSVhHQkVfRkNPRQotCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkNPRV9FTkFCTEVEKSB7Ci0jaWZkZWYgQ09ORklHX0lYR0JFX0RDQgotCQkvKiBmb3IgRkNvRSB3aXRoIERDQiwgd2UgZm9yY2UgdGhlIHByaW9yaXR5IHRvIHdoYXQKLQkJICogd2FzIHNwZWNpZmllZCBieSB0aGUgc3dpdGNoICovCi0JCWlmICgoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9GQ09FKSkgfHwKLQkJICAgIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0ZJUCkpKSB7Ci0JCQl0eF9mbGFncyAmPSB+KElYR0JFX1RYX0ZMQUdTX1ZMQU5fUFJJT19NQVNLCi0JCQkJICAgICAgPDwgSVhHQkVfVFhfRkxBR1NfVkxBTl9TSElGVCk7Ci0JCQl0eF9mbGFncyB8PSAoKGFkYXB0ZXItPmZjb2UudXAgPDwgMTMpCi0JCQkJICAgICA8PCBJWEdCRV9UWF9GTEFHU19WTEFOX1NISUZUKTsKLQkJfQotI2VuZGlmCisJLyogZm9yIEZDb0Ugd2l0aCBEQ0IsIHdlIGZvcmNlIHRoZSBwcmlvcml0eSB0byB3aGF0CisJICogd2FzIHNwZWNpZmllZCBieSB0aGUgc3dpdGNoICovCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GQ09FX0VOQUJMRUQgJiYKKwkgICAgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRkNPRSkgfHwKKwkgICAgIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRklQKSkpIHsKKwkJdHhfZmxhZ3MgJj0gfihJWEdCRV9UWF9GTEFHU19WTEFOX1BSSU9fTUFTSworCQkJICAgICAgPDwgSVhHQkVfVFhfRkxBR1NfVkxBTl9TSElGVCk7CisJCXR4X2ZsYWdzIHw9ICgoYWRhcHRlci0+ZmNvZS51cCA8PCAxMykKKwkJCSAgICAgIDw8IElYR0JFX1RYX0ZMQUdTX1ZMQU5fU0hJRlQpOwogCQkvKiBmbGFnIGZvciBGQ29FIG9mZmxvYWRzICovCiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0ZDT0UpKQogCQkJdHhfZmxhZ3MgfD0gSVhHQkVfVFhfRkxBR1NfRkNPRTsKQEAgLTY0MzAsOCArNjQ3OSw3IEBACiAJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEOwogCWVyciA9IHBjaV9lbmFibGVfc3Jpb3YoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+bnVtX3Zmcyk7CiAJaWYgKGVycikgewotCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgc3Jpb3Y6ICVkXG4iLCBlcnIpOworCQllX2Vycihwcm9iZSwgIkZhaWxlZCB0byBlbmFibGUgUENJIHNyaW92OiAlZFxuIiwgZXJyKTsKIAkJZ290byBlcnJfbm92ZnM7CiAJfQogCS8qIElmIGNhbGwgdG8gZW5hYmxlIFZGcyBzdWNjZWVkZWQgdGhlbiBhbGxvY2F0ZSBtZW1vcnkKQEAgLTY0NTUsOSArNjUwMyw4IEBACiAJfQogCiAJLyogT2ggb2ggKi8KLQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBWRiAiCi0JCSJEYXRhIFN0b3JhZ2UgLSBTUklPViBkaXNhYmxlZFxuIik7CisJZV9lcnIocHJvYmUsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBWRiBEYXRhIFN0b3JhZ2UgLSAiCisJICAgICAgIlNSSU9WIGRpc2FibGVkXG4iKTsKIAlwY2lfZGlzYWJsZV9zcmlvdihhZGFwdGVyLT5wZGV2KTsKIAogZXJyX25vdmZzOgpAQCAtNjQ5Miw2ICs2NTM5LDE1IEBACiAjZW5kaWYKIAl1MzIgcGFydF9udW0sIGVlYzsKIAorCS8qIENhdGNoIGJyb2tlbiBoYXJkd2FyZSB0aGF0IHB1dCB0aGUgd3JvbmcgVkYgZGV2aWNlIElEIGluCisJICogdGhlIFBDSWUgU1ItSU9WIGNhcGFiaWxpdHkuCisJICovCisJaWYgKHBkZXYtPmlzX3ZpcnRmbikgeworCQlXQVJOKDEsIEtFUk5fRVJSICIlcyAoJWh4OiVoeCkgc2hvdWxkIG5vdCBiZSBhIFZGIVxuIiwKKwkJICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTY1MDUsOCArNjU2MSw4IEBACiAJCQllcnIgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwKIAkJCQkJCSAgICBETUFfQklUX01BU0soMzIpKTsKIAkJCWlmIChlcnIpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyB1c2FibGUgRE1BICIKLQkJCQkgICAgICAgICJjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCQkiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CiAJCQkJZ290byBlcnJfZG1hOwogCQkJfQogCQl9CkBAIC02NTE3LDcgKzY1NzMsNyBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9SRVNPVVJDRV9NRU0pLCBpeGdiZV9kcml2ZXJfbmFtZSk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCSAgICAgICAgInBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMgZmFpbGVkIDB4JXhcbiIsIGVycik7CisJCQkicGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyBmYWlsZWQgMHgleFxuIiwgZXJyKTsKIAkJZ290byBlcnJfcGNpX3JlZzsKIAl9CiAKQEAgLTY2MjgsOCArNjY4NCw3IEBACiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GQU5fRkFJTF9DQVBBQkxFKSB7CiAJCXUzMiBlc2RwID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VTRFApOwogCQlpZiAoZXNkcCAmIElYR0JFX0VTRFBfU0RQMSkKLQkJCURQUklOVEsoUFJPQkUsIENSSVQsCi0JCQkJIkZhbiBoYXMgc3RvcHBlZCwgcmVwbGFjZSB0aGUgYWRhcHRlclxuIik7CisJCQllX2NyaXQocHJvYmUsICJGYW4gaGFzIHN0b3BwZWQsIHJlcGxhY2UgdGhlIGFkYXB0ZXJcbiIpOwogCX0KIAogCS8qIHJlc2V0X2h3IGZpbGxzIGluIHRoZSBwZXJtX2FkZHIgYXMgd2VsbCAqLwpAQCAtNjY0OCwxMyArNjcwMywxMyBAQAogCQkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyAoMiAqIEhaKSkpOwogCQllcnIgPSAwOwogCX0gZWxzZSBpZiAoZXJyID09IElYR0JFX0VSUl9TRlBfTk9UX1NVUFBPUlRFRCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlICIKLQkJCSJhbiB1bnN1cHBvcnRlZCBTRlArIG1vZHVsZSB0eXBlIHdhcyBkZXRlY3RlZC5cbiIKLQkJCSJSZWxvYWQgdGhlIGRyaXZlciBhZnRlciBpbnN0YWxsaW5nIGEgc3VwcG9ydGVkICIKLQkJCSJtb2R1bGUuXG4iKTsKKwkJZV9kZXZfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGFuIHVuc3VwcG9ydGVkIFNGUCsgIgorCQkJICAibW9kdWxlIHR5cGUgd2FzIGRldGVjdGVkLlxuIik7CisJCWVfZGV2X2VycigiUmVsb2FkIHRoZSBkcml2ZXIgYWZ0ZXIgaW5zdGFsbGluZyBhIHN1cHBvcnRlZCAiCisJCQkgICJtb2R1bGUuXG4iKTsKIAkJZ290byBlcnJfc3dfaW5pdDsKIAl9IGVsc2UgaWYgKGVycikgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJIVyBJbml0IGZhaWxlZDogJWRcbiIsIGVycik7CisJCWVfZGV2X2VycigiSFcgSW5pdCBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCQlnb3RvIGVycl9zd19pbml0OwogCX0KIApAQCAtNjY5OCw2ICs2NzUzLDExIEBACiAJCQkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkNPRV9DQVBBQkxFOwogCQl9CiAJfQorCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkNPRV9DQVBBQkxFKSB7CisJCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX0ZDT0VfQ1JDOworCQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9GU087CisJCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX0ZDT0VfTVRVOworCX0KICNlbmRpZiAvKiBJWEdCRV9GQ09FICovCiAJaWYgKHBjaV91c2luZ19kYWMpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwpAQCAtNjcwNyw3ICs2NzY3LDcgQEAKIAogCS8qIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGlzIGdvb2QgKi8KIAlpZiAoaHctPmVlcHJvbS5vcHMudmFsaWRhdGVfY2hlY2tzdW0oaHcsIE5VTEwpIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUaGUgRUVQUk9NIENoZWNrc3VtIElzIE5vdCBWYWxpZFxuIik7CisJCWVfZGV2X2VycigiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9lZXByb207CiAJfQpAQCAtNjcxNiw3ICs2Nzc2LDcgQEAKIAltZW1jcHkobmV0ZGV2LT5wZXJtX2FkZHIsIGh3LT5tYWMucGVybV9hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAogCWlmIChpeGdiZV92YWxpZGF0ZV9tYWNfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBNQUMgYWRkcmVzc1xuIik7CisJCWVfZGV2X2VycigiaW52YWxpZCBNQUMgYWRkcmVzc1xuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX2VlcHJvbTsKIAl9CkBAIC02NzUxLDcgKzY4MTEsNyBAQAogCWh3LT5tYWMub3BzLmdldF9idXNfaW5mbyhodyk7CiAKIAkvKiBwcmludCBidXMgdHlwZS9zcGVlZC93aWR0aCBpbmZvICovCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIihQQ0kgRXhwcmVzczolczolcykgJXBNXG4iLAorCWVfZGV2X2luZm8oIihQQ0kgRXhwcmVzczolczolcykgJXBNXG4iLAogCSAgICAgICAgKChody0+YnVzLnNwZWVkID09IGl4Z2JlX2J1c19zcGVlZF81MDAwKSA/ICI1LjBHYi9zIjoKIAkgICAgICAgICAoaHctPmJ1cy5zcGVlZCA9PSBpeGdiZV9idXNfc3BlZWRfMjUwMCkgPyAiMi41R2IvcyI6IlVua25vd24iKSwKIAkgICAgICAgICgoaHctPmJ1cy53aWR0aCA9PSBpeGdiZV9idXNfd2lkdGhfcGNpZV94OCkgPyAiV2lkdGggeDgiIDoKQEAgLTY3NjEsMjAgKzY4MjEsMjAgQEAKIAkgICAgICAgIG5ldGRldi0+ZGV2X2FkZHIpOwogCWl4Z2JlX3JlYWRfcGJhX251bV9nZW5lcmljKGh3LCAmcGFydF9udW0pOwogCWlmIChpeGdiZV9pc19zZnAoaHcpICYmIGh3LT5waHkuc2ZwX3R5cGUgIT0gaXhnYmVfc2ZwX3R5cGVfbm90X3ByZXNlbnQpCi0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJNQUM6ICVkLCBQSFk6ICVkLCBTRlArOiAlZCwgUEJBIE5vOiAlMDZ4LSUwM3hcbiIsCi0JCSAgICAgICAgIGh3LT5tYWMudHlwZSwgaHctPnBoeS50eXBlLCBody0+cGh5LnNmcF90eXBlLAotCQkgICAgICAgICAocGFydF9udW0gPj4gOCksIChwYXJ0X251bSAmIDB4ZmYpKTsKKwkJZV9kZXZfaW5mbygiTUFDOiAlZCwgUEhZOiAlZCwgU0ZQKzogJWQsICIKKwkJCSAgICJQQkEgTm86ICUwNngtJTAzeFxuIiwKKwkJCSAgIGh3LT5tYWMudHlwZSwgaHctPnBoeS50eXBlLCBody0+cGh5LnNmcF90eXBlLAorCQkJICAgKHBhcnRfbnVtID4+IDgpLCAocGFydF9udW0gJiAweGZmKSk7CiAJZWxzZQotCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTUFDOiAlZCwgUEhZOiAlZCwgUEJBIE5vOiAlMDZ4LSUwM3hcbiIsCi0JCSAgICAgICAgIGh3LT5tYWMudHlwZSwgaHctPnBoeS50eXBlLAotCQkgICAgICAgICAocGFydF9udW0gPj4gOCksIChwYXJ0X251bSAmIDB4ZmYpKTsKKwkJZV9kZXZfaW5mbygiTUFDOiAlZCwgUEhZOiAlZCwgUEJBIE5vOiAlMDZ4LSUwM3hcbiIsCisJCQkgICBody0+bWFjLnR5cGUsIGh3LT5waHkudHlwZSwKKwkJCSAgIChwYXJ0X251bSA+PiA4KSwgKHBhcnRfbnVtICYgMHhmZikpOwogCiAJaWYgKGh3LT5idXMud2lkdGggPD0gaXhnYmVfYnVzX3dpZHRoX3BjaWVfeDQpIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlBDSS1FeHByZXNzIGJhbmR3aWR0aCBhdmFpbGFibGUgZm9yICIKLQkJICAgICAgICAgInRoaXMgY2FyZCBpcyBub3Qgc3VmZmljaWVudCBmb3Igb3B0aW1hbCAiCi0JCSAgICAgICAgICJwZXJmb3JtYW5jZS5cbiIpOwotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UgYSB4OCAiCi0JCSAgICAgICAgICJQQ0ktRXhwcmVzcyBzbG90IGlzIHJlcXVpcmVkLlxuIik7CisJCWVfZGV2X3dhcm4oIlBDSS1FeHByZXNzIGJhbmR3aWR0aCBhdmFpbGFibGUgZm9yIHRoaXMgY2FyZCBpcyAiCisJCQkgICAibm90IHN1ZmZpY2llbnQgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UuXG4iKTsKKwkJZV9kZXZfd2FybigiRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UgYSB4OCBQQ0ktRXhwcmVzcyBzbG90ICIKKwkJCSAgICJpcyByZXF1aXJlZC5cbiIpOwogCX0KIAogCS8qIHNhdmUgb2ZmIEVFUFJPTSB2ZXJzaW9uIG51bWJlciAqLwpAQCAtNjc4NSwxMiArNjg0NSwxMiBAQAogCiAJaWYgKGVyciA9PSBJWEdCRV9FUlJfRUVQUk9NX1ZFUlNJT04pIHsKIAkJLyogV2UgYXJlIHJ1bm5pbmcgb24gYSBwcmUtcHJvZHVjdGlvbiBkZXZpY2UsIGxvZyBhIHdhcm5pbmcgKi8KLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlRoaXMgZGV2aWNlIGlzIGEgcHJlLXByb2R1Y3Rpb24gIgotCQkgICAgICAgICAiYWRhcHRlci9MT00uICBQbGVhc2UgYmUgYXdhcmUgdGhlcmUgbWF5IGJlIGlzc3VlcyAiCi0JCSAgICAgICAgICJhc3NvY2lhdGVkIHdpdGggeW91ciBoYXJkd2FyZS4gIElmIHlvdSBhcmUgIgotCQkgICAgICAgICAiZXhwZXJpZW5jaW5nIHByb2JsZW1zIHBsZWFzZSBjb250YWN0IHlvdXIgSW50ZWwgb3IgIgotCQkgICAgICAgICAiaGFyZHdhcmUgcmVwcmVzZW50YXRpdmUgd2hvIHByb3ZpZGVkIHlvdSB3aXRoIHRoaXMgIgotCQkgICAgICAgICAiaGFyZHdhcmUuXG4iKTsKKwkJZV9kZXZfd2FybigiVGhpcyBkZXZpY2UgaXMgYSBwcmUtcHJvZHVjdGlvbiBhZGFwdGVyL0xPTS4gIgorCQkJICAgIlBsZWFzZSBiZSBhd2FyZSB0aGVyZSBtYXkgYmUgaXNzdWVzIGFzc29jaWF0ZWQgIgorCQkJICAgIndpdGggeW91ciBoYXJkd2FyZS4gIElmIHlvdSBhcmUgZXhwZXJpZW5jaW5nICIKKwkJCSAgICJwcm9ibGVtcyBwbGVhc2UgY29udGFjdCB5b3VyIEludGVsIG9yIGhhcmR3YXJlICIKKwkJCSAgICJyZXByZXNlbnRhdGl2ZSB3aG8gcHJvdmlkZWQgeW91IHdpdGggdGhpcyAiCisJCQkgICAiaGFyZHdhcmUuXG4iKTsKIAl9CiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CkBAIC02ODEzLDggKzY4NzMsNyBAQAogCX0KICNlbmRpZgogCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCkgewotCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiSU9WIGlzIGVuYWJsZWQgd2l0aCAlZCBWRnNcbiIsCi0JCQlhZGFwdGVyLT5udW1fdmZzKTsKKwkJZV9pbmZvKHByb2JlLCAiSU9WIGlzIGVuYWJsZWQgd2l0aCAlZCBWRnNcbiIsIGFkYXB0ZXItPm51bV92ZnMpOwogCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZmczsgaSsrKQogCQkJaXhnYmVfdmZfY29uZmlndXJhdGlvbihwZGV2LCAoaSB8IDB4MTAwMDAwMDApKTsKIAl9CkBAIC02ODIyLDcgKzY4ODEsNyBAQAogCS8qIGFkZCBzYW4gbWFjIGFkZHIgdG8gbmV0ZGV2ICovCiAJaXhnYmVfYWRkX3Nhbm1hY19uZXRkZXYobmV0ZGV2KTsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbnRlbChSKSAxMCBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvblxuIik7CisJZV9kZXZfaW5mbygiSW50ZWwoUikgMTAgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb25cbiIpOwogCWNhcmRzX2ZvdW5kKys7CiAJcmV0dXJuIDA7CiAKQEAgLTY5MTIsNyArNjk3MSw3IEBACiAJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCBwY2lfc2VsZWN0X2JhcnMocGRldiwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPUkVTT1VSQ0VfTUVNKSk7CiAKLQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiY29tcGxldGVcbiIpOworCWVfZGV2X2luZm8oImNvbXBsZXRlXG4iKTsKIAogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAKQEAgLTY5NjIsOCArNzAyMSw3IEBACiAJaW50IGVycjsKIAogCWlmIChwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldikpIHsKLQkJRFBSSU5USyhQUk9CRSwgRVJSLAotCQkgICAgICAgICJDYW5ub3QgcmUtZW5hYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgcmVzZXQuXG4iKTsKKwkJZV9lcnIocHJvYmUsICJDYW5ub3QgcmUtZW5hYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgcmVzZXQuXG4iKTsKIAkJcmVzdWx0ID0gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKIAl9IGVsc2UgewogCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKQEAgLTY5NzksOCArNzAzNyw4IEBACiAKIAllcnIgPSBwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyhwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJICAicGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMgZmFpbGVkIDB4JTB4XG4iLCBlcnIpOworCQllX2Rldl9lcnIoInBjaV9jbGVhbnVwX2Flcl91bmNvcnJlY3RfZXJyb3Jfc3RhdHVzICIKKwkJCSAgImZhaWxlZCAweCUweFxuIiwgZXJyKTsKIAkJLyogbm9uLWZhdGFsLCBjb250aW51ZSAqLwogCX0KIApAQCAtNzAwMSw3ICs3MDU5LDcgQEAKIAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJaWYgKGl4Z2JlX3VwKGFkYXB0ZXIpKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiaXhnYmVfdXAgZmFpbGVkIGFmdGVyIHJlc2V0XG4iKTsKKwkJCWVfaW5mbyhwcm9iZSwgIml4Z2JlX3VwIGZhaWxlZCBhZnRlciByZXNldFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC03MDM3LDEwICs3MDk1LDkgQEAKIHN0YXRpYyBpbnQgX19pbml0IGl4Z2JlX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJldDsKLQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgLSB2ZXJzaW9uICVzXG4iLCBpeGdiZV9kcml2ZXJfbmFtZSwKLQkgICAgICAgaXhnYmVfZHJpdmVyX3N0cmluZywgaXhnYmVfZHJpdmVyX3ZlcnNpb24pOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLCBpeGdiZV9kcml2ZXJfbmFtZSwgaXhnYmVfY29weXJpZ2h0KTsKKwlwcl9pbmZvKCIlcyAtIHZlcnNpb24gJXNcbiIsIGl4Z2JlX2RyaXZlcl9zdHJpbmcsCisJCSAgIGl4Z2JlX2RyaXZlcl92ZXJzaW9uKTsKKwlwcl9pbmZvKCIlc1xuIiwgaXhnYmVfY29weXJpZ2h0KTsKIAogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0EKIAlkY2FfcmVnaXN0ZXJfbm90aWZ5KCZkY2Ffbm90aWZpZXIpOwpAQCAtNzA3OSwxOCArNzEzNiwxNyBAQAogfQogCiAjZW5kaWYgLyogQ09ORklHX0lYR0JFX0RDQSAqLwotI2lmZGVmIERFQlVHCisKIC8qKgotICogaXhnYmVfZ2V0X2h3X2Rldl9uYW1lIC0gcmV0dXJuIGRldmljZSBuYW1lIHN0cmluZworICogaXhnYmVfZ2V0X2h3X2RldiByZXR1cm4gZGV2aWNlCiAgKiB1c2VkIGJ5IGhhcmR3YXJlIGxheWVyIHRvIHByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgogICoqLwotY2hhciAqaXhnYmVfZ2V0X2h3X2Rldl9uYW1lKHN0cnVjdCBpeGdiZV9odyAqaHcpCitzdHJ1Y3QgbmV0X2RldmljZSAqaXhnYmVfZ2V0X2h3X2RldihzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7Ci0JcmV0dXJuIGFkYXB0ZXItPm5ldGRldi0+bmFtZTsKKwlyZXR1cm4gYWRhcHRlci0+bmV0ZGV2OwogfQogCi0jZW5kaWYKIG1vZHVsZV9leGl0KGl4Z2JlX2V4aXRfbW9kdWxlKTsKIAogLyogaXhnYmVfbWFpbi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9waHkuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCmluZGV4IDQ4MzI1YTUuLjZjMGQ0MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCkBAIC01NzcsNiArNTc3LDggQEAKIAkJICogNiAgICBTRlBfU1IvTFJfQ09SRTEgLSA4MjU5OS1zcGVjaWZpYwogCQkgKiA3ICAgIFNGUF9hY3RfbG10X0RBX0NPUkUwIC0gODI1OTktc3BlY2lmaWMKIAkJICogOCAgICBTRlBfYWN0X2xtdF9EQV9DT1JFMSAtIDgyNTk5LXNwZWNpZmljCisJCSAqIDkgICAgU0ZQXzFnX2N1X0NPUkUwIC0gODI1OTktc3BlY2lmaWMKKwkJICogMTAgICBTRlBfMWdfY3VfQ09SRTEgLSA4MjU5OS1zcGVjaWZpYwogCQkgKi8KIAkJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikgewogCQkJaWYgKGNhYmxlX3RlY2ggJiBJWEdCRV9TRkZfREFfUEFTU0lWRV9DQUJMRSkKQEAgLTYyNSw2ICs2MjcsMTMgQEAKIAkJCQllbHNlCiAJCQkJCWh3LT5waHkuc2ZwX3R5cGUgPQogCQkJCQkgICAgICAgICAgICAgIGl4Z2JlX3NmcF90eXBlX3NybHJfY29yZTE7CisJCQllbHNlIGlmIChjb21wX2NvZGVzXzFnICYgSVhHQkVfU0ZGXzFHQkFTRVRfQ0FQQUJMRSkKKwkJCQlpZiAoaHctPmJ1cy5sYW5faWQgPT0gMCkKKwkJCQkJaHctPnBoeS5zZnBfdHlwZSA9CisJCQkJCQlpeGdiZV9zZnBfdHlwZV8xZ19jdV9jb3JlMDsKKwkJCQllbHNlCisJCQkJCWh3LT5waHkuc2ZwX3R5cGUgPQorCQkJCQkJaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTE7CiAJCQllbHNlCiAJCQkJaHctPnBoeS5zZnBfdHlwZSA9IGl4Z2JlX3NmcF90eXBlX3Vua25vd247CiAJCX0KQEAgLTY5Niw4ICs3MDUsMTAgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJLyogMUcgU0ZQIG1vZHVsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLQkJaWYgKGNvbXBfY29kZXNfMTBnID09IDApIHsKKwkJLyogVmVyaWZ5IHN1cHBvcnRlZCAxRyBTRlAgbW9kdWxlcyAqLworCQlpZiAoY29tcF9jb2Rlc18xMGcgPT0gMCAmJgorCQkgICAgIShody0+cGh5LnNmcF90eXBlID09IGl4Z2JlX3NmcF90eXBlXzFnX2N1X2NvcmUxIHx8CisJCSAgICAgIGh3LT5waHkuc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTApKSB7CiAJCQlody0+cGh5LnR5cGUgPSBpeGdiZV9waHlfc2ZwX3Vuc3VwcG9ydGVkOwogCQkJc3RhdHVzID0gSVhHQkVfRVJSX1NGUF9OT1RfU1VQUE9SVEVEOwogCQkJZ290byBvdXQ7CkBAIC03MTEsNyArNzIyLDkgQEAKIAogCQkvKiBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgODI1OTksIG5vIG5lZWQgdG8gY2hlY2sgZm9yIE5VTEwgKi8KIAkJaHctPm1hYy5vcHMuZ2V0X2RldmljZV9jYXBzKGh3LCAmZW5mb3JjZV9zZnApOwotCQlpZiAoIShlbmZvcmNlX3NmcCAmIElYR0JFX0RFVklDRV9DQVBTX0FMTE9XX0FOWV9TRlApKSB7CisJCWlmICghKGVuZm9yY2Vfc2ZwICYgSVhHQkVfREVWSUNFX0NBUFNfQUxMT1dfQU5ZX1NGUCkgJiYKKwkJICAgICEoKGh3LT5waHkuc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTApIHx8CisJCSAgICAgIChody0+cGh5LnNmcF90eXBlID09IGl4Z2JlX3NmcF90eXBlXzFnX2N1X2NvcmUxKSkpIHsKIAkJCS8qIE1ha2Ugc3VyZSB3ZSdyZSBhIHN1cHBvcnRlZCBQSFkgdHlwZSAqLwogCQkJaWYgKGh3LT5waHkudHlwZSA9PSBpeGdiZV9waHlfc2ZwX2ludGVsKSB7CiAJCQkJc3RhdHVzID0gMDsKQEAgLTc0Miw2ICs3NTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZGF0YV9vZmZzZXQpCiB7CiAJdTE2IHNmcF9pZDsKKwl1MTYgc2ZwX3R5cGUgPSBody0+cGh5LnNmcF90eXBlOwogCiAJaWYgKGh3LT5waHkuc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfdW5rbm93bikKIAkJcmV0dXJuIElYR0JFX0VSUl9TRlBfTk9UX1NVUFBPUlRFRDsKQEAgLTc1Myw2ICs3NjcsMTcgQEAKIAkgICAgKGh3LT5waHkuc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfZGFfY3UpKQogCQlyZXR1cm4gSVhHQkVfRVJSX1NGUF9OT1RfU1VQUE9SVEVEOwogCisJLyoKKwkgKiBMaW1pdGluZyBhY3RpdmUgY2FibGVzIGFuZCAxRyBQaHlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYXMKKwkgKiBTUiBtb2R1bGVzCisJICovCisJaWYgKHNmcF90eXBlID09IGl4Z2JlX3NmcF90eXBlX2RhX2FjdF9sbXRfY29yZTAgfHwKKwkgICAgc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTApCisJCXNmcF90eXBlID0gaXhnYmVfc2ZwX3R5cGVfc3Jscl9jb3JlMDsKKwllbHNlIGlmIChzZnBfdHlwZSA9PSBpeGdiZV9zZnBfdHlwZV9kYV9hY3RfbG10X2NvcmUxIHx8CisJICAgICAgICAgc2ZwX3R5cGUgPT0gaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTEpCisJCXNmcF90eXBlID0gaXhnYmVfc2ZwX3R5cGVfc3Jscl9jb3JlMTsKKwogCS8qIFJlYWQgb2Zmc2V0IHRvIFBIWSBpbml0IGNvbnRlbnRzICovCiAJaHctPmVlcHJvbS5vcHMucmVhZChodywgSVhHQkVfUEhZX0lOSVRfT0ZGU0VUX05MLCBsaXN0X29mZnNldCk7CiAKQEAgLTc2OSw3ICs3OTQsNyBAQAogCWh3LT5lZXByb20ub3BzLnJlYWQoaHcsICpsaXN0X29mZnNldCwgJnNmcF9pZCk7CiAKIAl3aGlsZSAoc2ZwX2lkICE9IElYR0JFX1BIWV9JTklUX0VORF9OTCkgewotCQlpZiAoc2ZwX2lkID09IGh3LT5waHkuc2ZwX3R5cGUpIHsKKwkJaWYgKHNmcF9pZCA9PSBzZnBfdHlwZSkgewogCQkJKCpsaXN0X29mZnNldCkrKzsKIAkJCWh3LT5lZXByb20ub3BzLnJlYWQoaHcsICpsaXN0X29mZnNldCwgZGF0YV9vZmZzZXQpOwogCQkJaWYgKCghKmRhdGFfb2Zmc2V0KSB8fCAoKmRhdGFfb2Zmc2V0ID09IDB4RkZGRikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5oIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfcGh5LmgKaW5kZXggZWY0YmE4My4uZmIzODk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfcGh5LmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgSVhHQkVfU0ZGX0RBX1NQRUNfQUNUSVZFX0xJTUlUSU5HICAgIDB4NAogI2RlZmluZSBJWEdCRV9TRkZfMUdCQVNFU1hfQ0FQQUJMRSAgICAgICAgICAgMHgxCiAjZGVmaW5lIElYR0JFX1NGRl8xR0JBU0VMWF9DQVBBQkxFICAgICAgICAgICAweDIKKyNkZWZpbmUgSVhHQkVfU0ZGXzFHQkFTRVRfQ0FQQUJMRSAgICAgICAgICAgIDB4OAogI2RlZmluZSBJWEdCRV9TRkZfMTBHQkFTRVNSX0NBUEFCTEUgICAgICAgICAgMHgxMAogI2RlZmluZSBJWEdCRV9TRkZfMTBHQkFTRUxSX0NBUEFCTEUgICAgICAgICAgMHgyMAogI2RlZmluZSBJWEdCRV9JMkNfRUVQUk9NX1JFQURfTUFTSyAgICAgICAgICAgMHgxMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3NyaW92LmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9zcmlvdi5jCmluZGV4IGY2Y2VlOTQuLjQ5NjYxYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfc3Jpb3YuYwpAQCAtMjUsNyArMjUsNiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMTM4LDYgKzEzNyw3IEBACiBpbmxpbmUgdm9pZCBpeGdiZV92Zl9yZXNldF9ldmVudChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIHZmKQogewogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJaW50IHJhcl9lbnRyeSA9IGh3LT5tYWMubnVtX3Jhcl9lbnRyaWVzIC0gKHZmICsgMSk7CiAKIAkvKiByZXNldCBvZmZsb2FkcyB0byBkZWZhdWx0cyAqLwogCWlmIChhZGFwdGVyLT52ZmluZm9bdmZdLnBmX3ZsYW4pIHsKQEAgLTE1OSwyNiArMTU5LDE3IEBACiAJLyogRmx1c2ggYW5kIHJlc2V0IHRoZSBtdGEgd2l0aCB0aGUgbmV3IHZhbHVlcyAqLwogCWl4Z2JlX3NldF9yeF9tb2RlKGFkYXB0ZXItPm5ldGRldik7CiAKLQlpZiAoYWRhcHRlci0+dmZpbmZvW3ZmXS5yYXIgPiAwKSB7Ci0JCWFkYXB0ZXItPmh3Lm1hYy5vcHMuY2xlYXJfcmFyKCZhZGFwdGVyLT5odywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+dmZpbmZvW3ZmXS5yYXIpOwotCQlhZGFwdGVyLT52ZmluZm9bdmZdLnJhciA9IC0xOwotCX0KKwlody0+bWFjLm9wcy5jbGVhcl9yYXIoaHcsIHJhcl9lbnRyeSk7CiB9CiAKIGludCBpeGdiZV9zZXRfdmZfbWFjKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmYsIHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyKQogewogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0KLQlhZGFwdGVyLT52ZmluZm9bdmZdLnJhciA9IGh3LT5tYWMub3BzLnNldF9yYXIoaHcsIHZmICsgMSwgbWFjX2FkZHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmLCBJWEdCRV9SQUhfQVYpOwotCWlmIChhZGFwdGVyLT52ZmluZm9bdmZdLnJhciA8IDApIHsKLQkJRFBSSU5USyhEUlYsIEVSUiwgIkNvdWxkIG5vdCBzZXQgTUFDIEZpbHRlciBmb3IgVkYgJWRcbiIsIHZmKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpbnQgcmFyX2VudHJ5ID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXMgLSAodmYgKyAxKTsKIAogCW1lbWNweShhZGFwdGVyLT52ZmluZm9bdmZdLnZmX21hY19hZGRyZXNzZXMsIG1hY19hZGRyLCA2KTsKKwlody0+bWFjLm9wcy5zZXRfcmFyKGh3LCByYXJfZW50cnksIG1hY19hZGRyLCB2ZiwgSVhHQkVfUkFIX0FWKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk0LDExICsxODUsOCBAQAogCiAJaWYgKGVuYWJsZSkgewogCQlyYW5kb21fZXRoZXJfYWRkcih2Zl9tYWNfYWRkcik7Ci0JCURQUklOVEsoUFJPQkUsIElORk8sICJJT1Y6IFZGICVkIGlzIGVuYWJsZWQgIgotCQkgICAgICAgIm1hYyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKLQkJICAgICAgIHZmbiwKLQkJICAgICAgIHZmX21hY19hZGRyWzBdLCB2Zl9tYWNfYWRkclsxXSwgdmZfbWFjX2FkZHJbMl0sCi0JCSAgICAgICB2Zl9tYWNfYWRkclszXSwgdmZfbWFjX2FkZHJbNF0sIHZmX21hY19hZGRyWzVdKTsKKwkJZV9pbmZvKHByb2JlLCAiSU9WOiBWRiAlZCBpcyBlbmFibGVkIE1BQyAlcE1cbiIsCisJCSAgICAgICB2Zm4sIHZmX21hY19hZGRyKTsKIAkJLyoKIAkJICogU3RvcmUgYXdheSB0aGUgVkYgInBlcm1hbmFuZXQiIE1BQyBhZGRyZXNzLCBpdCB3aWxsIGFzawogCQkgKiBmb3IgaXQgbGF0ZXIuCkBAIC0yNDMsNyArMjMxLDcgQEAKIAlyZXR2YWwgPSBpeGdiZV9yZWFkX21ieChodywgbXNnYnVmLCBtYnhfc2l6ZSwgdmYpOwogCiAJaWYgKHJldHZhbCkKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciByZWNlaXZpbmcgbWVzc2FnZSBmcm9tIFZGXG4iKTsKKwkJcHJfZXJyKCJFcnJvciByZWNlaXZpbmcgbWVzc2FnZSBmcm9tIFZGXG4iKTsKIAogCS8qIHRoaXMgaXMgYSBtZXNzYWdlIHdlIGFscmVhZHkgcHJvY2Vzc2VkLCBkbyBub3RoaW5nICovCiAJaWYgKG1zZ2J1ZlswXSAmIChJWEdCRV9WVF9NU0dUWVBFX0FDSyB8IElYR0JFX1ZUX01TR1RZUEVfTkFDSykpCkBAIC0yNTcsNyArMjQ1LDcgQEAKIAlpZiAobXNnYnVmWzBdID09IElYR0JFX1ZGX1JFU0VUKSB7CiAJCXVuc2lnbmVkIGNoYXIgKnZmX21hYyA9IGFkYXB0ZXItPnZmaW5mb1t2Zl0udmZfbWFjX2FkZHJlc3NlczsKIAkJdTggKmFkZHIgPSAodTggKikoJm1zZ2J1ZlsxXSk7Ci0JCURQUklOVEsoUFJPQkUsIElORk8sICJWRiBSZXNldCBtc2cgcmVjZWl2ZWQgZnJvbSB2ZiAlZFxuIiwgdmYpOworCQllX2luZm8ocHJvYmUsICJWRiBSZXNldCBtc2cgcmVjZWl2ZWQgZnJvbSB2ZiAlZFxuIiwgdmYpOwogCQlhZGFwdGVyLT52ZmluZm9bdmZdLmNsZWFyX3RvX3NlbmQgPSBmYWxzZTsKIAkJaXhnYmVfdmZfcmVzZXRfbXNnKGFkYXB0ZXIsIHZmKTsKIAkJYWRhcHRlci0+dmZpbmZvW3ZmXS5jbGVhcl90b19zZW5kID0gdHJ1ZTsKQEAgLTMxMCw3ICsyOTgsNyBAQAogCQlyZXR2YWwgPSBpeGdiZV9zZXRfdmZfdmxhbihhZGFwdGVyLCBhZGQsIHZpZCwgdmYpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlEUFJJTlRLKERSViwgRVJSLCAiVW5oYW5kbGVkIE1zZyAlOC44eFxuIiwgbXNnYnVmWzBdKTsKKwkJZV9lcnIoZHJ2LCAiVW5oYW5kbGVkIE1zZyAlOC44eFxuIiwgbXNnYnVmWzBdKTsKIAkJcmV0dmFsID0gSVhHQkVfRVJSX01CWDsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oCmluZGV4IGNkZDE5OTguLjk1ODdkOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV90eXBlLmgKQEAgLTIyMTQsNiArMjIxNCw4IEBACiAJaXhnYmVfc2ZwX3R5cGVfc3Jscl9jb3JlMSA9IDYsCiAJaXhnYmVfc2ZwX3R5cGVfZGFfYWN0X2xtdF9jb3JlMCA9IDcsCiAJaXhnYmVfc2ZwX3R5cGVfZGFfYWN0X2xtdF9jb3JlMSA9IDgsCisJaXhnYmVfc2ZwX3R5cGVfMWdfY3VfY29yZTAgPSA5LAorCWl4Z2JlX3NmcF90eXBlXzFnX2N1X2NvcmUxID0gMTAsCiAJaXhnYmVfc2ZwX3R5cGVfbm90X3ByZXNlbnQgPSAweEZGRkUsCiAJaXhnYmVfc2ZwX3R5cGVfdW5rbm93biA9IDB4RkZGRgogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCmluZGV4IGExNmNmZjcuLjNlMjkxY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmV2Zi9peGdiZXZmX21haW4uYwpAQCAtMTQ2MywxOCArMTQ2MywxMCBAQAogewogCXN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnZfbmV0ZGV2OwogCiAJLyogYWRkIFZJRCB0byBmaWx0ZXIgdGFibGUgKi8KIAlpZiAoaHctPm1hYy5vcHMuc2V0X3ZmdGEpCiAJCWh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIDAsIHRydWUpOwotCS8qCi0JICogQ29weSBmZWF0dXJlIGZsYWdzIGZyb20gbmV0ZGV2IHRvIHRoZSB2bGFuIG5ldGRldiBmb3IgdGhpcyB2aWQuCi0JICogVGhpcyBhbGxvd3MgdGhpbmdzIGxpa2UgVFNPIHRvIGJ1YmJsZSBkb3duIHRvIG91ciB2bGFuIGRldmljZS4KLQkgKi8KLQl2X25ldGRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShhZGFwdGVyLT52bGdycCwgdmlkKTsKLQl2X25ldGRldi0+ZmVhdHVyZXMgfD0gYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlczsKLQl2bGFuX2dyb3VwX3NldF9kZXZpY2UoYWRhcHRlci0+dmxncnAsIHZpZCwgdl9uZXRkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZXZmX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKQEAgLTIyMjksNyArMjIyMSw3IEBACiAJaWYgKGVycikgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LAogCQkgICAgICAgICAiUEYgc3RpbGwgaW4gcmVzZXQgc3RhdGUsIGFzc2lnbmluZyBuZXcgYWRkcmVzc1xuIik7Ci0JCXJhbmRvbV9ldGhlcl9hZGRyKGh3LT5tYWMuYWRkcik7CisJCWRldl9od19hZGRyX3JhbmRvbShhZGFwdGVyLT5uZXRkZXYsIGh3LT5tYWMuYWRkcik7CiAJfSBlbHNlIHsKIAkJZXJyID0gaHctPm1hYy5vcHMuaW5pdF9odyhodyk7CiAJCWlmIChlcnIpIHsKQEAgLTI5MzUsNyArMjkyNyw4IEBACiAJc3RydWN0IGl4Z2JldmZfdHhfYnVmZmVyICp0eF9idWZmZXJfaW5mbzsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCXVuc2lnbmVkIGludCB0b3RhbCA9IHNrYi0+bGVuOwotCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwLCBzaXplLCBjb3VudCA9IDA7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDAsIHNpemU7CisJaW50IGNvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwogCXVuc2lnbmVkIGludCBmOwogCWludCBpOwpAQCAtMzQwMSw3ICszMzk0LDYgQEAKIAkvKiBzZXR1cCB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KIAllcnIgPSBpeGdiZXZmX3N3X2luaXQoYWRhcHRlcik7CiAKLSNpZmRlZiBNQVhfU0tCX0ZSQUdTCiAJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAogCQkJICAgTkVUSUZfRl9JUF9DU1VNIHwKIAkJCSAgIE5FVElGX0ZfSFdfVkxBTl9UWCB8CkBAIC0zNDExLDE2ICszNDAzLDE2IEBACiAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQVjZfQ1NVTTsKIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwogCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzY7CiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTTsKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9JUFY2X0NTVU07CiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CiAKIAlpZiAocGNpX3VzaW5nX2RhYykKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKLSNlbmRpZiAvKiBNQVhfU0tCX0ZSQUdTICovCi0KIAkvKiBUaGUgSFcgTUFDIGFkZHJlc3Mgd2FzIHNldCBhbmQvb3IgZGV0ZXJtaW5lZCBpbiBzd19pbml0ICovCiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAltZW1jcHkobmV0ZGV2LT5wZXJtX2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2phenpzb25pYy5jIGIvZHJpdmVycy9uZXQvamF6enNvbmljLmMKaW5kZXggM2U2YWFmOS4uOTQ5YzFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvamF6enNvbmljLmMKKysrIGIvZHJpdmVycy9uZXQvamF6enNvbmljLmMKQEAgLTgyLDExICs4MiwyMCBAQAogCiBzdGF0aWMgaW50IGphenpzb25pY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCiB7Ci0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzb25pY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJzb25pYyIsIGRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzb25pY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQkJInNvbmljIiwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JcmV0dXJuIHNvbmljX29wZW4oZGV2KTsKKworCXJldHZhbCA9IHNvbmljX29wZW4oZGV2KTsKKwlpZiAocmV0dmFsKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IGphenpzb25pY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQva3M4ODQyLmMgYi9kcml2ZXJzL25ldC9rczg4NDIuYwppbmRleCBmODUyYWIzLi45MjhiMmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9rczg4NDIuYworKysgYi9kcml2ZXJzL25ldC9rczg4NDIuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAvKiBTdXBwb3J0czoKICAqIFRoZSBNaWNyZWwgS1M4ODQyIGJlaGluZCB0aGUgdGltYmVyZGFsZSBGUEdBCisgKiBUaGUgZ2VudWluZSBNaWNyZWwgS1M4ODQxLzQyIGRldmljZSB3aXRoIElTQSAxNi8zMmJpdCBidXMgaW50ZXJmYWNlCiAgKi8KIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdApAQCAtMjksMTEgKzMwLDE5IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgva3M4ODQyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJrczg4NDIiCiAKIC8qIFRpbWJlcmRhbGUgc3BlY2lmaWMgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFR19USU1CX1JTVAkweDFjCisjZGVmaW5lIFJFR19USU1CX1JTVAkJMHgxYworI2RlZmluZSBSRUdfVElNQl9GSUZPCQkweDIwCisjZGVmaW5lIFJFR19USU1CX0lTUgkJMHgyNAorI2RlZmluZSBSRUdfVElNQl9JRVIJCTB4MjgKKyNkZWZpbmUgUkVHX1RJTUJfSUFSCQkweDJDCisjZGVmaW5lIFJFUV9USU1CX0RNQV9SRVNVTUUJMHgzMAogCiAvKiBLUzg4NDIgcmVnaXN0ZXJzICovCiAKQEAgLTc2LDYgKzg1LDE1IEBACiAjZGVmaW5lIElSUV9SWF9FUlJPUgkweDAwODAKICNkZWZpbmUgRU5BQkxFRF9JUlFTCShJUlFfTElOS19DSEFOR0UgfCBJUlFfVFggfCBJUlFfUlggfCBJUlFfUlhfU1RPUFBFRCB8IFwKIAkJSVJRX1RYX1NUT1BQRUQgfCBJUlFfUlhfT1ZFUlJVTiB8IElSUV9SWF9FUlJPUikKKy8qIFdoZW4gcnVubmluZyB2aWEgdGltYmVyZGFsZSBpbiBETUEgbW9kZSwgdGhlIFJYIGludGVycnVwdCBzaG91bGQgYmUKKyAgIGVuYWJsZWQgaW4gdGhlIEtTODg0MiwgYnV0IG5vdCBpbiB0aGUgRlBHQSBJUCwgc2luY2UgdGhlIElQIGhhbmRsZXMKKyAgIFJYIERNQSBpbnRlcm5hbGx5LgorICAgVFggaW50ZXJydXB0cyBhcmUgbm90IG5lZWRlZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBGUEdBIHRoZSBkcml2ZXIgaXMKKyAgIG5vdGlmaWVkIHZpYSBETUEgY2FsbGJhY2tzLgorKi8KKyNkZWZpbmUgRU5BQkxFRF9JUlFTX0RNQV9JUAkoSVJRX0xJTktfQ0hBTkdFIHwgSVJRX1JYX1NUT1BQRUQgfCBcCisJSVJRX1RYX1NUT1BQRUQgfCBJUlFfUlhfT1ZFUlJVTiB8IElSUV9SWF9FUlJPUikKKyNkZWZpbmUgRU5BQkxFRF9JUlFTX0RNQQkoRU5BQkxFRF9JUlFTX0RNQV9JUCB8IElSUV9SWCkKICNkZWZpbmUgUkVHX0lTUgkJMHgwMgogI2RlZmluZSBSRUdfUlhTUgkweDA0CiAjZGVmaW5lIFJYU1JfVkFMSUQJMHg4MDAwCkBAIC0xMTQsMTQgKzEzMiw1MyBAQAogI2RlZmluZSBSRUdfUDFDUjQJCTB4MDIKICNkZWZpbmUgUkVHX1AxU1IJCTB4MDQKIAorLyogZmxhZ3MgcGFzc2VkIGJ5IHBsYXRmb3JtX2RldmljZSBmb3IgY29uZmlndXJhdGlvbiAqLworI2RlZmluZQlNSUNSRUxfS1M4ODRYCQkweDAxCS8qIDA9VGltZWJlcmRhbGUoRlBHQSksIDE9TWljcmVsICovCisjZGVmaW5lCUtTODg0WF8xNkJJVAkJMHgwMgkvKiAgMT0xNmJpdCwgMD0zMmJpdCAqLworCisjZGVmaW5lIERNQV9CVUZGRVJfU0laRQkJMjA0OAorCitzdHJ1Y3Qga3M4ODQyX3R4X2RtYV9jdGwgeworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmFkZXNjOworCXZvaWQgKmJ1ZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJaW50IGNoYW5uZWw7Cit9OworCitzdHJ1Y3Qga3M4ODQyX3J4X2RtYV9jdGwgeworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmFkZXNjOworCXN0cnVjdCBza19idWZmICAqc2tiOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKwlpbnQgY2hhbm5lbDsKK307CisKKyNkZWZpbmUgS1M4ODQyX1VTRV9ETUEoYWRhcHRlcikgKCgoYWRhcHRlciktPmRtYV90eC5jaGFubmVsICE9IC0xKSAmJiBcCisJICgoYWRhcHRlciktPmRtYV9yeC5jaGFubmVsICE9IC0xKSkKKwogc3RydWN0IGtzODg0Ml9hZGFwdGVyIHsKIAl2b2lkIF9faW9tZW0JKmh3X2FkZHI7CiAJaW50CQlpcnE7CisJdW5zaWduZWQgbG9uZwljb25mX2ZsYWdzOwkvKiBjb3B5IG9mIHBsYXRmb3JtX2RldmljZSBjb25maWcgKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKIAlzcGlubG9ja190CWxvY2s7IC8qIHNwaW5sb2NrIHRvIGJlIGludGVycnVwdCBzYWZlICovCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGltZW91dF93b3JrOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBrczg4NDJfdHhfZG1hX2N0bAlkbWFfdHg7CisJc3RydWN0IGtzODg0Ml9yeF9kbWFfY3RsCWRtYV9yeDsKIH07CiAKK3N0YXRpYyB2b2lkIGtzODg0Ml9kbWFfcnhfY2Iodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBrczg4NDJfZG1hX3R4X2NiKHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW5saW5lIHZvaWQga3M4ODQyX3Jlc3VtZV9kbWEoc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyKQoreworCWlvd3JpdGUzMigxLCBhZGFwdGVyLT5od19hZGRyICsgUkVRX1RJTUJfRE1BX1JFU1VNRSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBrczg4NDJfc2VsZWN0X2Jhbmsoc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyLCB1MTYgYmFuaykKIHsKIAlpb3dyaXRlMTYoYmFuaywgYWRhcHRlci0+aHdfYWRkciArIFJFR19TRUxFQ1RfQkFOSyk7CkBAIC0xOTEsMTYgKzI0OCwyMSBAQAogCiBzdGF0aWMgdm9pZCBrczg4NDJfcmVzZXQoc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyKQogewotCS8qIFRoZSBLUzg4NDIgZ29lcyBoYXl3aXJlIHdoZW4gZG9pbmcgc29mdGFyZSByZXNldAotCSAqIGEgd29yayBhcm91bmQgaW4gdGhlIHRpbWJlcmRhbGUgSVAgaXMgaW1wbGVtZW50ZWQgdG8KLQkgKiBkbyBhIGhhcmR3YXJlIHJlc2V0IGluc3RlYWQKLQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAzLCAxLCBSRUdfR1JSKTsKLQltc2xlZXAoMTApOwotCWlvd3JpdGUxNigwLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX0dSUik7Ci0JKi8KLQlpb3dyaXRlMTYoMzIsIGFkYXB0ZXItPmh3X2FkZHIgKyBSRUdfU0VMRUNUX0JBTkspOwotCWlvd3JpdGUzMigweDEsIGFkYXB0ZXItPmh3X2FkZHIgKyBSRUdfVElNQl9SU1QpOwotCW1zbGVlcCgyMCk7CisJaWYgKGFkYXB0ZXItPmNvbmZfZmxhZ3MgJiBNSUNSRUxfS1M4ODRYKSB7CisJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDMsIDEsIFJFR19HUlIpOworCQltc2xlZXAoMTApOworCQlpb3dyaXRlMTYoMCwgYWRhcHRlci0+aHdfYWRkciArIFJFR19HUlIpOworCX0gZWxzZSB7CisJCS8qIFRoZSBLUzg4NDIgZ29lcyBoYXl3aXJlIHdoZW4gZG9pbmcgc29mdGFyZSByZXNldAorCQkqIGEgd29yayBhcm91bmQgaW4gdGhlIHRpbWJlcmRhbGUgSVAgaXMgaW1wbGVtZW50ZWQgdG8KKwkJKiBkbyBhIGhhcmR3YXJlIHJlc2V0IGluc3RlYWQKKwkJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMywgMSwgUkVHX0dSUik7CisJCW1zbGVlcCgxMCk7CisJCWlvd3JpdGUxNigwLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX0dSUik7CisJCSovCisJCWlvd3JpdGUzMigweDEsIGFkYXB0ZXItPmh3X2FkZHIgKyBSRUdfVElNQl9SU1QpOworCQltc2xlZXAoMjApOworCX0KIH0KIAogc3RhdGljIHZvaWQga3M4ODQyX3VwZGF0ZV9saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LApAQCAtMjY5LDggKzMzMSw2IEBACiAKIAkvKiByZXN0YXJ0IHBvcnQgYXV0by1uZWdvdGlhdGlvbiAqLwogCWtzODg0Ml9lbmFibGVfYml0cyhhZGFwdGVyLCA0OSwgMSA8PCAxMywgUkVHX1AxQ1I0KTsKLQkvKiBvbmx5IGFkdmVydGlzZSAxME1icHMgKi8KLQlrczg4NDJfY2xlYXJfYml0cyhhZGFwdGVyLCA0OSwgMyA8PCAyLCBSRUdfUDFDUjQpOwogCiAJLyogRW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLwogCWtzODg0Ml9lbmFibGVfdHgoYWRhcHRlcik7CkBAIC0yODIsOCArMzQyLDE5IEBACiAJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMTgsIDB4ZmZmZiwgUkVHX0lTUik7CiAKIAkvKiBlbmFibGUgaW50ZXJydXB0cyAqLwotCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDE4LCBFTkFCTEVEX0lSUVMsIFJFR19JRVIpOwotCisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKSB7CisJCS8qIFdoZW4gcnVubmluZyBpbiBETUEgTW9kZSB0aGUgUlggaW50ZXJydXB0IGlzIG5vdCBlbmFibGVkIGluCisJCSAgIHRpbWJlcmRhbGUgYmVjYXVzZSBSWCBkYXRhIGlzIHJlY2VpdmVkIGJ5IERNQSBjYWxsYmFja3MKKwkJICAgaXQgbXVzdCBzdGlsbCBiZSBlbmFibGVkIGluIHRoZSBLUzg4NDIgYmVjYXVzZSBpdCBpbmRpY2F0ZXMKKwkJICAgdG8gdGltYmVyZGFsZSB3aGVuIHRoZXJlIGlzIFJYIGRhdGEgZm9yIGl0J3MgRE1BIEZJRk9zICovCisJCWlvd3JpdGUxNihFTkFCTEVEX0lSUVNfRE1BX0lQLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX1RJTUJfSUVSKTsKKwkJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMTgsIEVOQUJMRURfSVJRU19ETUEsIFJFR19JRVIpOworCX0gZWxzZSB7CisJCWlmICghKGFkYXB0ZXItPmNvbmZfZmxhZ3MgJiBNSUNSRUxfS1M4ODRYKSkKKwkJCWlvd3JpdGUxNihFTkFCTEVEX0lSUVMsCisJCQkJYWRhcHRlci0+aHdfYWRkciArIFJFR19USU1CX0lFUik7CisJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDE4LCBFTkFCTEVEX0lSUVMsIFJFR19JRVIpOworCX0KIAkvKiBlbmFibGUgdGhlIHN3aXRjaCAqLwogCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDMyLCAweDEsIFJFR19TV19JRF9BTkRfRU5BQkxFKTsKIH0KQEAgLTI5NiwxMyArMzY3LDI4IEBACiAJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCiAJCWRlc3RbRVRIX0FMRU4gLSBpIC0gMV0gPSBrczg4NDJfcmVhZDgoYWRhcHRlciwgMiwgUkVHX01BUkwgKyBpKTsKIAotCS8qIG1ha2Ugc3VyZSB0aGUgc3dpdGNoIHBvcnQgdXNlcyB0aGUgc2FtZSBNQUMgYXMgdGhlIFFNVSAqLwotCW1hYyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMiwgUkVHX01BUkwpOwotCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDM5LCBtYWMsIFJFR19NQUNBUjEpOwotCW1hYyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMiwgUkVHX01BUk0pOwotCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDM5LCBtYWMsIFJFR19NQUNBUjIpOwotCW1hYyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMiwgUkVHX01BUkgpOwotCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDM5LCBtYWMsIFJFR19NQUNBUjMpOworCWlmIChhZGFwdGVyLT5jb25mX2ZsYWdzICYgTUlDUkVMX0tTODg0WCkgeworCQkvKgorCQl0aGUgc2VxdWVuY2Ugb2Ygc2F2aW5nIG1hYyBhZGRyIGJldHdlZW4gTUFDIGFuZCBTd2l0Y2ggaXMKKwkJZGlmZmVyZW50LgorCQkqLworCisJCW1hYyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMiwgUkVHX01BUkwpOworCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAzOSwgbWFjLCBSRUdfTUFDQVIzKTsKKwkJbWFjID0ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAyLCBSRUdfTUFSTSk7CisJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDM5LCBtYWMsIFJFR19NQUNBUjIpOworCQltYWMgPSBrczg4NDJfcmVhZDE2KGFkYXB0ZXIsIDIsIFJFR19NQVJIKTsKKwkJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMzksIG1hYywgUkVHX01BQ0FSMSk7CisJfSBlbHNlIHsKKworCQkvKiBtYWtlIHN1cmUgdGhlIHN3aXRjaCBwb3J0IHVzZXMgdGhlIHNhbWUgTUFDIGFzIHRoZSBRTVUgKi8KKwkJbWFjID0ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAyLCBSRUdfTUFSTCk7CisJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDM5LCBtYWMsIFJFR19NQUNBUjEpOworCQltYWMgPSBrczg4NDJfcmVhZDE2KGFkYXB0ZXIsIDIsIFJFR19NQVJNKTsKKwkJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMzksIG1hYywgUkVHX01BQ0FSMik7CisJCW1hYyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMiwgUkVHX01BUkgpOworCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAzOSwgbWFjLCBSRUdfTUFDQVIzKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGtzODg0Ml93cml0ZV9tYWNfYWRkcihzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWMpCkBAIC0zMTMsOCArMzk5LDI1IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewogCQlrczg4NDJfd3JpdGU4KGFkYXB0ZXIsIDIsIG1hY1tFVEhfQUxFTiAtIGkgLSAxXSwgUkVHX01BUkwgKyBpKTsKLQkJa3M4ODQyX3dyaXRlOChhZGFwdGVyLCAzOSwgbWFjW0VUSF9BTEVOIC0gaSAtIDFdLAotCQkJUkVHX01BQ0FSMSArIGkpOworCQlpZiAoIShhZGFwdGVyLT5jb25mX2ZsYWdzICYgTUlDUkVMX0tTODg0WCkpCisJCQlrczg4NDJfd3JpdGU4KGFkYXB0ZXIsIDM5LCBtYWNbRVRIX0FMRU4gLSBpIC0gMV0sCisJCQkJUkVHX01BQ0FSMSArIGkpOworCX0KKworCWlmIChhZGFwdGVyLT5jb25mX2ZsYWdzICYgTUlDUkVMX0tTODg0WCkgeworCQkvKgorCQl0aGUgc2VxdWVuY2Ugb2Ygc2F2aW5nIG1hYyBhZGRyIGJldHdlZW4gTUFDIGFuZCBTd2l0Y2ggaXMKKwkJZGlmZmVyZW50LgorCQkqLworCisJCXUxNiBtYWM7CisKKwkJbWFjID0ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAyLCBSRUdfTUFSTCk7CisJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDM5LCBtYWMsIFJFR19NQUNBUjMpOworCQltYWMgPSBrczg4NDJfcmVhZDE2KGFkYXB0ZXIsIDIsIFJFR19NQVJNKTsKKwkJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMzksIG1hYywgUkVHX01BQ0FSMik7CisJCW1hYyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMiwgUkVHX01BUkgpOworCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAzOSwgbWFjLCBSRUdfTUFDQVIxKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogfQpAQCAtMzI0LDE1ICs0MjcsNTkgQEAKIAlyZXR1cm4ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAxNiwgUkVHX1RYTUlSKSAmIDB4MWZmZjsKIH0KIAorc3RhdGljIGludCBrczg4NDJfdHhfZnJhbWVfZG1hKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qga3M4ODQyX3R4X2RtYV9jdGwgKmN0bCA9ICZhZGFwdGVyLT5kbWFfdHg7CisJdTggKmJ1ZiA9IGN0bC0+YnVmOworCisJaWYgKGN0bC0+YWRlc2MpIHsKKwkJbmV0ZGV2X2RiZyhuZXRkZXYsICIlczogVFggb25nb2luZ1xuIiwgX19mdW5jX18pOworCQkvKiB0cmFuc2ZlciBvbmdvaW5nICovCisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlzZ19kbWFfbGVuKCZjdGwtPnNnKSA9IHNrYi0+bGVuICsgc2l6ZW9mKHUzMik7CisKKwkvKiBjb3B5IGRhdGEgdG8gdGhlIFRYIGJ1ZmZlciAqLworCS8qIHRoZSBjb250cm9sIHdvcmQsIGVuYWJsZSBJUlEsIHBvcnQgMSBhbmQgdGhlIGxlbmd0aCAqLworCSpidWYrKyA9IDB4MDA7CisJKmJ1ZisrID0gMHgwMTsgLyogUG9ydCAxICovCisJKmJ1ZisrID0gc2tiLT5sZW4gJiAweGZmOworCSpidWYrKyA9IChza2ItPmxlbiA+PiA4KSAmIDB4ZmY7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGJ1Ziwgc2tiLT5sZW4pOworCisJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UoYWRhcHRlci0+ZGV2LAorCQlzZ19kbWFfYWRkcmVzcygmY3RsLT5zZyksIDAsIHNnX2RtYV9sZW4oJmN0bC0+c2cpLAorCQlETUFfVE9fREVWSUNFKTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNCAqLworCWlmIChzZ19kbWFfbGVuKCZjdGwtPnNnKSAlIDQpCisJCXNnX2RtYV9sZW4oJmN0bC0+c2cpICs9IDQgLSBzZ19kbWFfbGVuKCZjdGwtPnNnKSAlIDQ7CisKKwljdGwtPmFkZXNjID0gY3RsLT5jaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGN0bC0+Y2hhbiwKKwkJJmN0bC0+c2csIDEsIERNQV9UT19ERVZJQ0UsCisJCURNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCk7CisJaWYgKCFjdGwtPmFkZXNjKQorCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisKKwljdGwtPmFkZXNjLT5jYWxsYmFja19wYXJhbSA9IG5ldGRldjsKKwljdGwtPmFkZXNjLT5jYWxsYmFjayA9IGtzODg0Ml9kbWFfdHhfY2I7CisJY3RsLT5hZGVzYy0+dHhfc3VibWl0KGN0bC0+YWRlc2MpOworCisJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKIHN0YXRpYyBpbnQga3M4ODQyX3R4X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgbGVuID0gc2tiLT5sZW47Ci0JdTMyICpwdHIgPSAodTMyICopc2tiLT5kYXRhOwotCXUzMiBjdHJsOwogCi0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkiJXM6IGxlbiAldSBoZWFkICVwIGRhdGEgJXAgdGFpbCAlcCBlbmQgJXBcbiIsCisJbmV0ZGV2X2RiZyhuZXRkZXYsICIlczogbGVuICV1IGhlYWQgJXAgZGF0YSAlcCB0YWlsICVwIGVuZCAlcFxuIiwKIAkJX19mdW5jX18sIHNrYi0+bGVuLCBza2ItPmhlYWQsIHNrYi0+ZGF0YSwKIAkJc2tiX3RhaWxfcG9pbnRlcihza2IpLCBza2JfZW5kX3BvaW50ZXIoc2tiKSk7CiAKQEAgLTM0MCwxNyArNDg3LDM0IEBACiAJaWYgKGtzODg0Ml90eF9maWZvX3NwYWNlKGFkYXB0ZXIpIDwgbGVuICsgOCkKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCi0JLyogdGhlIGNvbnRyb2wgd29yZCwgZW5hYmxlIElSUSwgcG9ydCAxIGFuZCB0aGUgbGVuZ3RoICovCi0JY3RybCA9IDB4ODAwMCB8IDB4MTAwIHwgKGxlbiA8PCAxNik7Ci0Ja3M4ODQyX3dyaXRlMzIoYWRhcHRlciwgMTcsIGN0cmwsIFJFR19RTVVfREFUQV9MTyk7CisJaWYgKGFkYXB0ZXItPmNvbmZfZmxhZ3MgJiBLUzg4NFhfMTZCSVQpIHsKKwkJdTE2ICpwdHIxNiA9ICh1MTYgKilza2ItPmRhdGE7CisJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDE3LCAweDgwMDAgfCAweDEwMCwgUkVHX1FNVV9EQVRBX0xPKTsKKwkJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMTcsICh1MTYpbGVuLCBSRUdfUU1VX0RBVEFfSEkpOworCQluZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKIAotCW5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQkvKiBjb3B5IGJ1ZmZlciAqLworCQl3aGlsZSAobGVuID4gMCkgeworCQkJaW93cml0ZTE2KCpwdHIxNisrLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX1FNVV9EQVRBX0xPKTsKKwkJCWlvd3JpdGUxNigqcHRyMTYrKywgYWRhcHRlci0+aHdfYWRkciArIFJFR19RTVVfREFUQV9ISSk7CisJCQlsZW4gLT0gc2l6ZW9mKHUzMik7CisJCX0KKwl9IGVsc2UgewogCi0JLyogY29weSBidWZmZXIgKi8KLQl3aGlsZSAobGVuID4gMCkgewotCQlpb3dyaXRlMzIoKnB0ciwgYWRhcHRlci0+aHdfYWRkciArIFJFR19RTVVfREFUQV9MTyk7Ci0JCWxlbiAtPSBzaXplb2YodTMyKTsKLQkJcHRyKys7CisJCXUzMiAqcHRyID0gKHUzMiAqKXNrYi0+ZGF0YTsKKwkJdTMyIGN0cmw7CisJCS8qIHRoZSBjb250cm9sIHdvcmQsIGVuYWJsZSBJUlEsIHBvcnQgMSBhbmQgdGhlIGxlbmd0aCAqLworCQljdHJsID0gMHg4MDAwIHwgMHgxMDAgfCAobGVuIDw8IDE2KTsKKwkJa3M4ODQyX3dyaXRlMzIoYWRhcHRlciwgMTcsIGN0cmwsIFJFR19RTVVfREFUQV9MTyk7CisKKwkJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwkJLyogY29weSBidWZmZXIgKi8KKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWlvd3JpdGUzMigqcHRyLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX1FNVV9EQVRBX0xPKTsKKwkJCWxlbiAtPSBzaXplb2YodTMyKTsKKwkJCXB0cisrOworCQl9CiAJfQogCiAJLyogZW5xdWV1ZSBwYWNrZXQgKi8KQEAgLTM2MSw1NCArNTI1LDE3NCBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKK3N0YXRpYyB2b2lkIGtzODg0Ml91cGRhdGVfcnhfZXJyX2NvdW50ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzdGF0dXMpCit7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICJSWCBlcnJvciwgc3RhdHVzOiAleFxuIiwgc3RhdHVzKTsKKworCW5ldGRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYU1JfVE9PX0xPTkcpCisJCW5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSWFNSX0NSQ19FUlJPUikKKwkJbmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYU1JfUlVOVCkKKwkJbmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKK30KKworc3RhdGljIHZvaWQga3M4ODQyX3VwZGF0ZV9yeF9jb3VudGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3RhdHVzLAorCWludCBsZW4pCit7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICJSWCBwYWNrZXQsIGxlbjogJWRcbiIsIGxlbik7CisKKwluZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwluZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlpZiAoc3RhdHVzICYgUlhTUl9NVUxUSUNBU1QpCisJCW5ldGRldi0+c3RhdHMubXVsdGljYXN0Kys7Cit9CisKK3N0YXRpYyBpbnQgX19rczg4NDJfc3RhcnRfbmV3X3J4X2RtYShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGtzODg0Ml9yeF9kbWFfY3RsICpjdGwgPSAmYWRhcHRlci0+ZG1hX3J4OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmY3RsLT5zZzsKKwlpbnQgZXJyOworCisJY3RsLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgRE1BX0JVRkZFUl9TSVpFKTsKKwlpZiAoY3RsLT5za2IpIHsKKwkJc2dfaW5pdF90YWJsZShzZywgMSk7CisJCXNnX2RtYV9hZGRyZXNzKHNnKSA9IGRtYV9tYXBfc2luZ2xlKGFkYXB0ZXItPmRldiwKKwkJCWN0bC0+c2tiLT5kYXRhLCBETUFfQlVGRkVSX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWVyciA9IGRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPmRldiwgc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCXNnX2RtYV9hZGRyZXNzKHNnKSA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNnX2RtYV9sZW4oc2cpID0gRE1BX0JVRkZFUl9TSVpFOworCisJCWN0bC0+YWRlc2MgPSBjdGwtPmNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY3RsLT5jaGFuLAorCQkJc2csIDEsIERNQV9GUk9NX0RFVklDRSwKKwkJCURNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCk7CisKKwkJaWYgKCFjdGwtPmFkZXNjKQorCQkJZ290byBvdXQ7CisKKwkJY3RsLT5hZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBuZXRkZXY7CisJCWN0bC0+YWRlc2MtPmNhbGxiYWNrID0ga3M4ODQyX2RtYV9yeF9jYjsKKwkJY3RsLT5hZGVzYy0+dHhfc3VibWl0KGN0bC0+YWRlc2MpOworCX0gZWxzZSB7CisJCWVyciA9IC1FTk9NRU07CisJCXNnX2RtYV9hZGRyZXNzKHNnKSA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiBlcnI7CitvdXQ6CisJaWYgKHNnX2RtYV9hZGRyZXNzKHNnKSkKKwkJZG1hX3VubWFwX3NpbmdsZShhZGFwdGVyLT5kZXYsIHNnX2RtYV9hZGRyZXNzKHNnKSwKKwkJCURNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlzZ19kbWFfYWRkcmVzcyhzZykgPSAwOworCWlmIChjdGwtPnNrYikKKwkJZGV2X2tmcmVlX3NrYihjdGwtPnNrYik7CisKKwljdGwtPnNrYiA9IE5VTEw7CisKKwlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUiOiBGYWlsZWQgdG8gc3RhcnQgUlggRE1BOiAlZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBrczg4NDJfcnhfZnJhbWVfZG1hX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKKwlzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBrczg4NDJfcnhfZG1hX2N0bCAqY3RsID0gJmFkYXB0ZXItPmRtYV9yeDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY3RsLT5za2I7CisJZG1hX2FkZHJfdCBhZGRyID0gc2dfZG1hX2FkZHJlc3MoJmN0bC0+c2cpOworCXUzMiBzdGF0dXM7CisKKwljdGwtPmFkZXNjID0gTlVMTDsKKworCS8qIGtpY2sgbmV4dCB0cmFuc2ZlciBnb2luZyAqLworCV9fa3M4ODQyX3N0YXJ0X25ld19yeF9kbWEobmV0ZGV2KTsKKworCS8qIG5vdyBoYW5kbGUgdGhlIGRhdGEgd2UgZ290ICovCisJZG1hX3VubWFwX3NpbmdsZShhZGFwdGVyLT5kZXYsIGFkZHIsIERNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKworCXN0YXR1cyA9ICooKHUzMiAqKXNrYi0+ZGF0YSk7CisKKwluZXRkZXZfZGJnKG5ldGRldiwgIiVzIC0gcnhfZGF0YTogc3RhdHVzOiAleFxuIiwKKwkJX19mdW5jX18sIHN0YXR1cyAmIDB4ZmZmZik7CisKKwkvKiBjaGVjayB0aGUgc3RhdHVzICovCisJaWYgKChzdGF0dXMgJiBSWFNSX1ZBTElEKSAmJiAhKHN0YXR1cyAmIFJYU1JfRVJST1IpKSB7CisJCWludCBsZW4gPSAoc3RhdHVzID4+IDE2KSAmIDB4N2ZmOworCisJCWtzODg0Ml91cGRhdGVfcnhfY291bnRlcnMobmV0ZGV2LCBzdGF0dXMsIGxlbik7CisKKwkJLyogcmVzZXJ2ZSA0IGJ5dGVzIHdoaWNoIGlzIHRoZSBzdGF0dXMgd29yZCAqLworCQlza2JfcmVzZXJ2ZShza2IsIDQpOworCQlza2JfcHV0KHNrYiwgbGVuKTsKKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOworCQluZXRpZl9yeChza2IpOworCX0gZWxzZSB7CisJCWtzODg0Ml91cGRhdGVfcnhfZXJyX2NvdW50ZXJzKG5ldGRldiwgc3RhdHVzKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KK30KKwogc3RhdGljIHZvaWQga3M4ODQyX3J4X2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyKQogewotCXUzMiBzdGF0dXMgPSBrczg4NDJfcmVhZDMyKGFkYXB0ZXIsIDE3LCBSRUdfUU1VX0RBVEFfTE8pOwotCWludCBsZW4gPSAoc3RhdHVzID4+IDE2KSAmIDB4N2ZmOworCXUzMiBzdGF0dXM7CisJaW50IGxlbjsKIAotCXN0YXR1cyAmPSAweGZmZmY7Ci0KLQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcyAtIHJ4X2RhdGE6IHN0YXR1czogJXhcbiIsCi0JCV9fZnVuY19fLCBzdGF0dXMpOworCWlmIChhZGFwdGVyLT5jb25mX2ZsYWdzICYgS1M4ODRYXzE2QklUKSB7CisJCXN0YXR1cyA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMTcsIFJFR19RTVVfREFUQV9MTyk7CisJCWxlbiA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMTcsIFJFR19RTVVfREFUQV9ISSk7CisJCW5ldGRldl9kYmcobmV0ZGV2LCAiJXMgLSByeF9kYXRhOiBzdGF0dXM6ICV4XG4iLAorCQkJICAgX19mdW5jX18sIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0ga3M4ODQyX3JlYWQzMihhZGFwdGVyLCAxNywgUkVHX1FNVV9EQVRBX0xPKTsKKwkJbGVuID0gKHN0YXR1cyA+PiAxNikgJiAweDdmZjsKKwkJc3RhdHVzICY9IDB4ZmZmZjsKKwkJbmV0ZGV2X2RiZyhuZXRkZXYsICIlcyAtIHJ4X2RhdGE6IHN0YXR1czogJXhcbiIsCisJCQkgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwl9CiAKIAkvKiBjaGVjayB0aGUgc3RhdHVzICovCiAJaWYgKChzdGF0dXMgJiBSWFNSX1ZBTElEKSAmJiAhKHN0YXR1cyAmIFJYU1JfRVJST1IpKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgbGVuKTsKIAotCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcywgZ290IHBhY2thZ2UsIGxlbjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgbGVuKTsKIAkJaWYgKHNrYikgewotCQkJdTMyICpkYXRhOwogCi0JCQluZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCW5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQkJaWYgKHN0YXR1cyAmIFJYU1JfTVVMVElDQVNUKQotCQkJCW5ldGRldi0+c3RhdHMubXVsdGljYXN0Kys7CisJCQlrczg4NDJfdXBkYXRlX3J4X2NvdW50ZXJzKG5ldGRldiwgc3RhdHVzLCBsZW4pOwogCi0JCQlkYXRhID0gKHUzMiAqKXNrYl9wdXQoc2tiLCBsZW4pOworCQkJaWYgKGFkYXB0ZXItPmNvbmZfZmxhZ3MgJiBLUzg4NFhfMTZCSVQpIHsKKwkJCQl1MTYgKmRhdGExNiA9ICh1MTYgKilza2JfcHV0KHNrYiwgbGVuKTsKKwkJCQlrczg4NDJfc2VsZWN0X2JhbmsoYWRhcHRlciwgMTcpOworCQkJCXdoaWxlIChsZW4gPiAwKSB7CisJCQkJCSpkYXRhMTYrKyA9IGlvcmVhZDE2KGFkYXB0ZXItPmh3X2FkZHIgKworCQkJCQkJUkVHX1FNVV9EQVRBX0xPKTsKKwkJCQkJKmRhdGExNisrID0gaW9yZWFkMTYoYWRhcHRlci0+aHdfYWRkciArCisJCQkJCQlSRUdfUU1VX0RBVEFfSEkpOworCQkJCQlsZW4gLT0gc2l6ZW9mKHUzMik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl1MzIgKmRhdGEgPSAodTMyICopc2tiX3B1dChza2IsIGxlbik7CiAKLQkJCWtzODg0Ml9zZWxlY3RfYmFuayhhZGFwdGVyLCAxNyk7Ci0JCQl3aGlsZSAobGVuID4gMCkgewotCQkJCSpkYXRhKysgPSBpb3JlYWQzMihhZGFwdGVyLT5od19hZGRyICsKLQkJCQkJUkVHX1FNVV9EQVRBX0xPKTsKLQkJCQlsZW4gLT0gc2l6ZW9mKHUzMik7CisJCQkJa3M4ODQyX3NlbGVjdF9iYW5rKGFkYXB0ZXIsIDE3KTsKKwkJCQl3aGlsZSAobGVuID4gMCkgeworCQkJCQkqZGF0YSsrID0gaW9yZWFkMzIoYWRhcHRlci0+aHdfYWRkciArCisJCQkJCQlSRUdfUU1VX0RBVEFfTE8pOworCQkJCQlsZW4gLT0gc2l6ZW9mKHUzMik7CisJCQkJfQogCQkJfQotCiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwogCQkJbmV0aWZfcngoc2tiKTsKIAkJfSBlbHNlCiAJCQluZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQl9IGVsc2UgewotCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJSWCBlcnJvciwgc3RhdHVzOiAleFxuIiwgc3RhdHVzKTsKLQkJbmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJaWYgKHN0YXR1cyAmIFJYU1JfVE9PX0xPTkcpCi0JCQluZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJaWYgKHN0YXR1cyAmIFJYU1JfQ1JDX0VSUk9SKQotCQkJbmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBSWFNSX1JVTlQpCi0JCQluZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCX0KKwl9IGVsc2UKKwkJa3M4ODQyX3VwZGF0ZV9yeF9lcnJfY291bnRlcnMobmV0ZGV2LCBzdGF0dXMpOwogCiAJLyogc2V0IGhpZ2ggd2F0ZXJtYXJrIHRvIDNLICovCiAJa3M4ODQyX2NsZWFyX2JpdHMoYWRhcHRlciwgMCwgMSA8PCAxMiwgUkVHX1FSRkNSKTsKQEAgLTQyMyw4ICs3MDcsNyBAQAogdm9pZCBrczg4NDJfaGFuZGxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MTYgcnhfZGF0YSA9IGtzODg0Ml9yZWFkMTYoYWRhcHRlciwgMTYsIFJFR19SWE1JUikgJiAweDFmZmY7Ci0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXMgRW50cnkgLSByeF9kYXRhOiAlZFxuIiwKLQkJX19mdW5jX18sIHJ4X2RhdGEpOworCW5ldGRldl9kYmcobmV0ZGV2LCAiJXMgRW50cnkgLSByeF9kYXRhOiAlZFxuIiwgX19mdW5jX18sIHJ4X2RhdGEpOwogCXdoaWxlIChyeF9kYXRhKSB7CiAJCWtzODg0Ml9yeF9mcmFtZShuZXRkZXYsIGFkYXB0ZXIpOwogCQlyeF9kYXRhID0ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAxNiwgUkVHX1JYTUlSKSAmIDB4MWZmZjsKQEAgLTQzNCw3ICs3MTcsNyBAQAogdm9pZCBrczg4NDJfaGFuZGxlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MTYgc3IgPSBrczg4NDJfcmVhZDE2KGFkYXB0ZXIsIDE2LCBSRUdfVFhTUik7Ci0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXMgLSBlbnRyeSwgc3I6ICV4XG4iLCBfX2Z1bmNfXywgc3IpOworCW5ldGRldl9kYmcobmV0ZGV2LCAiJXMgLSBlbnRyeSwgc3I6ICV4XG4iLCBfX2Z1bmNfXywgc3IpOwogCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpCiAJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKQEAgLTQ0Myw3ICs3MjYsNyBAQAogdm9pZCBrczg4NDJfaGFuZGxlX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAlzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKIAluZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCW5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIH0KQEAgLTQ2MiwyMCArNzQ1LDMyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogCiAJaXNyID0ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAxOCwgUkVHX0lTUik7Ci0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXMgLSBJU1I6IDB4JXhcbiIsIF9fZnVuY19fLCBpc3IpOworCW5ldGRldl9kYmcobmV0ZGV2LCAiJXMgLSBJU1I6IDB4JXhcbiIsIF9fZnVuY19fLCBpc3IpOworCisJLyogd2hlbiBydW5uaW5nIGluIERNQSBtb2RlLCBkbyBub3QgYWNrIFJYIGludGVycnVwdHMsIGl0IGlzIGhhbmRsZWQKKwkgICBpbnRlcm5hbGx5IGJ5IHRpbWJlcmRhbGUsIG90aGVyd2lzZSBpdCdzIERNQSBGSUZPOnMgd291bGQgc3RvcAorCSovCisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKQorCQlpc3IgJj0gfklSUV9SWDsKIAogCS8qIEFjayAqLwogCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDE4LCBpc3IsIFJFR19JU1IpOwogCisJaWYgKCEoYWRhcHRlci0+Y29uZl9mbGFncyAmIE1JQ1JFTF9LUzg4NFgpKQorCQkvKiBBY2sgaW4gdGhlIHRpbWJlcmRhbGUgSVAgYXMgd2VsbCAqLworCQlpb3dyaXRlMzIoMHgxLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX1RJTUJfSUFSKTsKKwogCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlyZXR1cm47CiAKIAlpZiAoaXNyICYgSVJRX0xJTktfQ0hBTkdFKQogCQlrczg4NDJfdXBkYXRlX2xpbmtfc3RhdHVzKG5ldGRldiwgYWRhcHRlcik7CiAKLQlpZiAoaXNyICYgKElSUV9SWCB8IElSUV9SWF9FUlJPUikpCisJLyogc2hvdWxkIG5vdCBnZXQgSVJRX1JYIHdoZW4gcnVubmluZyBETUEgbW9kZSAqLworCWlmIChpc3IgJiAoSVJRX1JYIHwgSVJRX1JYX0VSUk9SKSAmJiAhS1M4ODQyX1VTRV9ETUEoYWRhcHRlcikpCiAJCWtzODg0Ml9oYW5kbGVfcngobmV0ZGV2LCBhZGFwdGVyKTsKIAorCS8qIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIGluIFBJTyBtb2RlICovCiAJaWYgKGlzciAmIElSUV9UWCkKIAkJa3M4ODQyX2hhbmRsZV90eChuZXRkZXYsIGFkYXB0ZXIpOwogCkBAIC00OTQsMjQgKzc4OSwzOCBAQAogCiAJLyogcmUtZW5hYmxlIGludGVycnVwdHMsIHB1dCBiYWNrIHRoZSBiYW5rIHNlbGVjdGlvbiByZWdpc3RlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0Ja3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMTgsIEVOQUJMRURfSVJRUywgUkVHX0lFUik7CisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKQorCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAxOCwgRU5BQkxFRF9JUlFTX0RNQSwgUkVHX0lFUik7CisJZWxzZQorCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAxOCwgRU5BQkxFRF9JUlFTLCBSRUdfSUVSKTsKIAlpb3dyaXRlMTYoZW50cnlfYmFuaywgYWRhcHRlci0+aHdfYWRkciArIFJFR19TRUxFQ1RfQkFOSyk7CisKKwkvKiBNYWtlIHN1cmUgdGltYmVyZGFsZSBjb250aW51ZXMgRE1BIG9wZXJhdGlvbnMsIHRoZXkgYXJlIHN0b3BwZWQgd2hpbGUKKwkgICB3ZSBhcmUgaGFuZGxpbmcgdGhlIGtzODg0MiBiZWNhdXNlIHdlIG1pZ2h0IGNoYW5nZSBiYW5rICovCisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKQorCQlrczg4NDJfcmVzdW1lX2RtYShhZGFwdGVyKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGtzODg0Ml9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCiB7Ci0Jc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyID0gZGV2aWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldmlkOworCXN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTE2IGlzcjsKIAl1MTYgZW50cnlfYmFuayA9IGlvcmVhZDE2KGFkYXB0ZXItPmh3X2FkZHIgKyBSRUdfU0VMRUNUX0JBTkspOwogCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwogCiAJaXNyID0ga3M4ODQyX3JlYWQxNihhZGFwdGVyLCAxOCwgUkVHX0lTUik7Ci0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXMgLSBJU1I6IDB4JXhcbiIsIF9fZnVuY19fLCBpc3IpOworCW5ldGRldl9kYmcobmV0ZGV2LCAiJXMgLSBJU1I6IDB4JXhcbiIsIF9fZnVuY19fLCBpc3IpOwogCiAJaWYgKGlzcikgewotCQkvKiBkaXNhYmxlIElSUSAqLwotCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAxOCwgMHgwMCwgUkVHX0lFUik7CisJCWlmIChLUzg4NDJfVVNFX0RNQShhZGFwdGVyKSkKKwkJCS8qIGRpc2FibGUgYWxsIGJ1dCBSWCBJUlEsIHNpbmNlIHRoZSBGUEdBIHJlbGllcyBvbiBpdCovCisJCQlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAxOCwgSVJRX1JYLCBSRUdfSUVSKTsKKwkJZWxzZQorCQkJLyogZGlzYWJsZSBJUlEgKi8KKwkJCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDE4LCAweDAwLCBSRUdfSUVSKTsKIAogCQkvKiBzY2hlZHVsZSB0YXNrbGV0ICovCiAJCXRhc2tsZXRfc2NoZWR1bGUoJmFkYXB0ZXItPnRhc2tsZXQpOwpAQCAtNTIxLDkgKzgzMCwxNTEgQEAKIAogCWlvd3JpdGUxNihlbnRyeV9iYW5rLCBhZGFwdGVyLT5od19hZGRyICsgUkVHX1NFTEVDVF9CQU5LKTsKIAorCS8qIEFmdGVyIGFuIGludGVycnVwdCwgdGVsbCB0aW1iZXJkYWxlIHRvIGNvbnRpbnVlIERNQSBvcGVyYXRpb25zLgorCSAgIERNQSBpcyBkaXNhYmxlZCB3aGlsZSB3ZSBhcmUgaGFuZGxpbmcgdGhlIGtzODg0MiBiZWNhdXNlIHdlIG1pZ2h0CisJICAgY2hhbmdlIGJhbmsgKi8KKwlrczg4NDJfcmVzdW1lX2RtYShhZGFwdGVyKTsKKwogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGtzODg0Ml9kbWFfcnhfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIJKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0ZGV2X2RiZyhuZXRkZXYsICJSWCBETUEgZmluaXNoZWRcbiIpOworCS8qIHNjaGVkdWxlIHRhc2tsZXQgKi8KKwlpZiAoYWRhcHRlci0+ZG1hX3J4LmFkZXNjKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZhZGFwdGVyLT5kbWFfcngudGFza2xldCk7Cit9CisKK3N0YXRpYyB2b2lkIGtzODg0Ml9kbWFfdHhfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKm5ldGRldiA9IGRhdGE7CisJc3RydWN0IGtzODg0Ml9hZGFwdGVyCQkqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGtzODg0Ml90eF9kbWFfY3RsCSpjdGwgPSAmYWRhcHRlci0+ZG1hX3R4OworCisJbmV0ZGV2X2RiZyhuZXRkZXYsICJUWCBETUEgZmluaXNoZWRcbiIpOworCisJaWYgKCFjdGwtPmFkZXNjKQorCQlyZXR1cm47CisKKwluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwljdGwtPmFkZXNjID0gTlVMTDsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpCisJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKK30KKworc3RhdGljIHZvaWQga3M4ODQyX3N0b3BfZG1hKHN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qga3M4ODQyX3R4X2RtYV9jdGwgKnR4X2N0bCA9ICZhZGFwdGVyLT5kbWFfdHg7CisJc3RydWN0IGtzODg0Ml9yeF9kbWFfY3RsICpyeF9jdGwgPSAmYWRhcHRlci0+ZG1hX3J4OworCisJdHhfY3RsLT5hZGVzYyA9IE5VTEw7CisJaWYgKHR4X2N0bC0+Y2hhbikKKwkJdHhfY3RsLT5jaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKHR4X2N0bC0+Y2hhbiwKKwkJCURNQV9URVJNSU5BVEVfQUxMLCAwKTsKKworCXJ4X2N0bC0+YWRlc2MgPSBOVUxMOworCWlmIChyeF9jdGwtPmNoYW4pCisJCXJ4X2N0bC0+Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfY29udHJvbChyeF9jdGwtPmNoYW4sCisJCQlETUFfVEVSTUlOQVRFX0FMTCwgMCk7CisKKwlpZiAoc2dfZG1hX2FkZHJlc3MoJnJ4X2N0bC0+c2cpKQorCQlkbWFfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPmRldiwgc2dfZG1hX2FkZHJlc3MoJnJ4X2N0bC0+c2cpLAorCQkJRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCXNnX2RtYV9hZGRyZXNzKCZyeF9jdGwtPnNnKSA9IDA7CisKKwlkZXZfa2ZyZWVfc2tiKHJ4X2N0bC0+c2tiKTsKKwlyeF9jdGwtPnNrYiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGtzODg0Ml9kZWFsbG9jX2RtYV9idWZzKHN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qga3M4ODQyX3R4X2RtYV9jdGwgKnR4X2N0bCA9ICZhZGFwdGVyLT5kbWFfdHg7CisJc3RydWN0IGtzODg0Ml9yeF9kbWFfY3RsICpyeF9jdGwgPSAmYWRhcHRlci0+ZG1hX3J4OworCisJa3M4ODQyX3N0b3BfZG1hKGFkYXB0ZXIpOworCisJaWYgKHR4X2N0bC0+Y2hhbikKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbCh0eF9jdGwtPmNoYW4pOworCXR4X2N0bC0+Y2hhbiA9IE5VTEw7CisKKwlpZiAocnhfY3RsLT5jaGFuKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKHJ4X2N0bC0+Y2hhbik7CisJcnhfY3RsLT5jaGFuID0gTlVMTDsKKworCXRhc2tsZXRfa2lsbCgmcnhfY3RsLT50YXNrbGV0KTsKKworCWlmIChzZ19kbWFfYWRkcmVzcygmdHhfY3RsLT5zZykpCisJCWRtYV91bm1hcF9zaW5nbGUoYWRhcHRlci0+ZGV2LCBzZ19kbWFfYWRkcmVzcygmdHhfY3RsLT5zZyksCisJCQlETUFfQlVGRkVSX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCXNnX2RtYV9hZGRyZXNzKCZ0eF9jdGwtPnNnKSA9IDA7CisKKwlrZnJlZSh0eF9jdGwtPmJ1Zik7CisJdHhfY3RsLT5idWYgPSBOVUxMOworfQorCitzdGF0aWMgYm9vbCBrczg4NDJfZG1hX2ZpbHRlcl9mbihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmZpbHRlcl9wYXJhbSkKK3sKKwlyZXR1cm4gY2hhbi0+Y2hhbl9pZCA9PSAobG9uZylmaWx0ZXJfcGFyYW07Cit9CisKK3N0YXRpYyBpbnQga3M4ODQyX2FsbG9jX2RtYV9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qga3M4ODQyX3R4X2RtYV9jdGwgKnR4X2N0bCA9ICZhZGFwdGVyLT5kbWFfdHg7CisJc3RydWN0IGtzODg0Ml9yeF9kbWFfY3RsICpyeF9jdGwgPSAmYWRhcHRlci0+ZG1hX3J4OworCWludCBlcnI7CisKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1BSSVZBVEUsIG1hc2spOworCisJc2dfaW5pdF90YWJsZSgmdHhfY3RsLT5zZywgMSk7CisKKwl0eF9jdGwtPmNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGtzODg0Ml9kbWFfZmlsdGVyX2ZuLAorCQkJCQkgICAodm9pZCAqKShsb25nKXR4X2N0bC0+Y2hhbm5lbCk7CisJaWYgKCF0eF9jdGwtPmNoYW4pIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJLyogYWxsb2NhdGUgRE1BIGJ1ZmZlciAqLworCXR4X2N0bC0+YnVmID0ga21hbGxvYyhETUFfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghdHhfY3RsLT5idWYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJc2dfZG1hX2FkZHJlc3MoJnR4X2N0bC0+c2cpID0gZG1hX21hcF9zaW5nbGUoYWRhcHRlci0+ZGV2LAorCQl0eF9jdGwtPmJ1ZiwgRE1BX0JVRkZFUl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwllcnIgPSBkbWFfbWFwcGluZ19lcnJvcihhZGFwdGVyLT5kZXYsCisJCXNnX2RtYV9hZGRyZXNzKCZ0eF9jdGwtPnNnKSk7CisJaWYgKGVycikgeworCQlzZ19kbWFfYWRkcmVzcygmdHhfY3RsLT5zZykgPSAwOworCQlnb3RvIGVycjsKKwl9CisKKwlyeF9jdGwtPmNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGtzODg0Ml9kbWFfZmlsdGVyX2ZuLAorCQkJCQkgICAodm9pZCAqKShsb25nKXJ4X2N0bC0+Y2hhbm5lbCk7CisJaWYgKCFyeF9jdGwtPmNoYW4pIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJdGFza2xldF9pbml0KCZyeF9jdGwtPnRhc2tsZXQsIGtzODg0Ml9yeF9mcmFtZV9kbWFfdGFza2xldCwKKwkJKHVuc2lnbmVkIGxvbmcpbmV0ZGV2KTsKKworCXJldHVybiAwOworZXJyOgorCWtzODg0Ml9kZWFsbG9jX2RtYV9idWZzKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CiAKIC8qIE5ldGRldmljZSBvcGVyYXRpb25zICovCiAKQEAgLTUzMiw3ICs5ODMsMjYgQEAKIAlzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBlcnI7CiAKLQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcyAtIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICIlcyAtIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoS1M4ODQyX1VTRV9ETUEoYWRhcHRlcikpIHsKKwkJZXJyID0ga3M4ODQyX2FsbG9jX2RtYV9idWZzKG5ldGRldik7CisKKwkJaWYgKCFlcnIpIHsKKwkJCS8qIHN0YXJ0IFJYIGRtYSAqLworCQkJZXJyID0gX19rczg4NDJfc3RhcnRfbmV3X3J4X2RtYShuZXRkZXYpOworCQkJaWYgKGVycikKKwkJCQlrczg4NDJfZGVhbGxvY19kbWFfYnVmcyhhZGFwdGVyKTsKKwkJfQorCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCQkiOiBGYWlsZWQgdG8gaW5pdGlhdGUgRE1BLCBydW5uaW5nIFBJT1xuIik7CisJCQlrczg4NDJfZGVhbGxvY19kbWFfYnVmcyhhZGFwdGVyKTsKKwkJCWFkYXB0ZXItPmRtYV9yeC5jaGFubmVsID0gLTE7CisJCQlhZGFwdGVyLT5kbWFfdHguY2hhbm5lbCA9IC0xOworCQl9CisJfQogCiAJLyogcmVzZXQgdGhlIEhXICovCiAJa3M4ODQyX3Jlc2V0X2h3KGFkYXB0ZXIpOwpAQCAtNTQyLDcgKzEwMTIsNyBAQAogCWtzODg0Ml91cGRhdGVfbGlua19zdGF0dXMobmV0ZGV2LCBhZGFwdGVyKTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPmlycSwga3M4ODQyX2lycSwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLAotCQlhZGFwdGVyKTsKKwkJbmV0ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIHJlcXVlc3QgSVJROiAlZDogJWRcbiIsIGFkYXB0ZXItPmlycSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKQEAgLTU1NSwxMCArMTAyNSwxNSBAQAogewogCXN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcyAtIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICIlcyAtIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT50aW1lb3V0X3dvcmspOworCisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKQorCQlrczg4NDJfZGVhbGxvY19kbWFfYnVmcyhhZGFwdGVyKTsKIAogCS8qIGZyZWUgdGhlIGlycSAqLwotCWZyZWVfaXJxKGFkYXB0ZXItPmlycSwgYWRhcHRlcik7CisJZnJlZV9pcnEoYWRhcHRlci0+aXJxLCBuZXRkZXYpOwogCiAJLyogZGlzYWJsZSB0aGUgc3dpdGNoICovCiAJa3M4ODQyX3dyaXRlMTYoYWRhcHRlciwgMzIsIDB4MCwgUkVHX1NXX0lEX0FORF9FTkFCTEUpOwpAQCAtNTcyLDcgKzEwNDcsMTggQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKKwluZXRkZXZfZGJnKG5ldGRldiwgIiVzOiBlbnRyeVxuIiwgX19mdW5jX18pOworCisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXJldCA9IGtzODg0Ml90eF9mcmFtZV9kbWEoc2tiLCBuZXRkZXYpOworCQkvKiBmb3Igbm93IG9ubHkgYWxsb3cgb25lIHRyYW5zZmVyIGF0IHRoZSB0aW1lICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJCWlmIChhZGFwdGVyLT5kbWFfdHguYWRlc2MpCisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXQgPSBrczg4NDJfdHhfZnJhbWUoc2tiLCBuZXRkZXYpOwogCkBAIC01ODgsNyArMTA3NCw3IEBACiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAljaGFyICptYWMgPSAodTggKilhZGRyLT5zYV9kYXRhOwogCi0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwpAQCAtNTk5LDE3ICsxMDg1LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGtzODg0Ml90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgdm9pZCBrczg4NDJfdHhfdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBrczg4NDJfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3M4ODQyX2FkYXB0ZXIsIHRpbWVvdXRfd29yayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAiJXM6IGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJbmV0ZGV2X2RiZyhuZXRkZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoS1M4ODQyX1VTRV9ETUEoYWRhcHRlcikpCisJCWtzODg0Ml9zdG9wX2RtYShhZGFwdGVyKTsKKwogCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwogCWtzODg0Ml93cml0ZTE2KGFkYXB0ZXIsIDE4LCAwLCBSRUdfSUVSKTsKIAlrczg4NDJfd3JpdGUxNihhZGFwdGVyLCAxOCwgMHhGRkZGLCBSRUdfSVNSKTsKKworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKIAogCWtzODg0Ml9yZXNldF9odyhhZGFwdGVyKTsKQEAgLTYxNyw2ICsxMTEyLDE4IEBACiAJa3M4ODQyX3dyaXRlX21hY19hZGRyKGFkYXB0ZXIsIG5ldGRldi0+ZGV2X2FkZHIpOwogCiAJa3M4ODQyX3VwZGF0ZV9saW5rX3N0YXR1cyhuZXRkZXYsIGFkYXB0ZXIpOworCisJaWYgKEtTODg0Ml9VU0VfRE1BKGFkYXB0ZXIpKQorCQlfX2tzODg0Ml9zdGFydF9uZXdfcnhfZG1hKG5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGtzODg0Ml90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzODg0Ml9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW5ldGRldl9kYmcobmV0ZGV2LCAiJXM6IGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisKKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50aW1lb3V0X3dvcmspOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGtzODg0Ml9uZXRkZXZfb3BzID0gewpAQCAtNjUzLDcgKzExNjAsMTEgQEAKIAlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOwogCiAJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCUlOSVRfV09SSygmYWRhcHRlci0+dGltZW91dF93b3JrLCBrczg4NDJfdHhfdGltZW91dF93b3JrKTsKIAlhZGFwdGVyLT5od19hZGRyID0gaW9yZW1hcChpb21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9tZW0pKTsKKwlhZGFwdGVyLT5jb25mX2ZsYWdzID0gaW9tZW0tPmZsYWdzOworCiAJaWYgKCFhZGFwdGVyLT5od19hZGRyKQogCQlnb3RvIGVycl9pb3JlbWFwOwogCkBAIC02NjMsNyArMTE3NCwxOCBAQAogCQlnb3RvIGVycl9nZXRfaXJxOwogCX0KIAotCWFkYXB0ZXItPnBkZXYgPSBwZGV2OworCWFkYXB0ZXItPmRldiA9IChwZGV2LT5kZXYucGFyZW50KSA/IHBkZXYtPmRldi5wYXJlbnQgOiAmcGRldi0+ZGV2OworCisJLyogRE1BIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gYWNjZXNzZWQgdmlhIHRpbWJlcmRhbGUgKi8KKwlpZiAoIShhZGFwdGVyLT5jb25mX2ZsYWdzICYgTUlDUkVMX0tTODg0WCkgJiYgcGRhdGEgJiYKKwkJKHBkYXRhLT50eF9kbWFfY2hhbm5lbCAhPSAtMSkgJiYKKwkJKHBkYXRhLT5yeF9kbWFfY2hhbm5lbCAhPSAtMSkpIHsKKwkJYWRhcHRlci0+ZG1hX3J4LmNoYW5uZWwgPSBwZGF0YS0+cnhfZG1hX2NoYW5uZWw7CisJCWFkYXB0ZXItPmRtYV90eC5jaGFubmVsID0gcGRhdGEtPnR4X2RtYV9jaGFubmVsOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPmRtYV9yeC5jaGFubmVsID0gLTE7CisJCWFkYXB0ZXItPmRtYV90eC5jaGFubmVsID0gLTE7CisJfQogCiAJdGFza2xldF9pbml0KCZhZGFwdGVyLT50YXNrbGV0LCBrczg4NDJfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpbmV0ZGV2KTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9rc3o4ODR4LmMgYi9kcml2ZXJzL25ldC9rc3o4ODR4LmMKaW5kZXggNzgwNWJiZi4uMzc1MDRhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2tzejg4NHguYworKysgYi9kcml2ZXJzL25ldC9rc3o4ODR4LmMKQEAgLTE0NTcsNyArMTQ1Nyw2IEBACiAgKiBAYWRhcHRlcjoJCUFkYXB0ZXIgZGV2aWNlIGluZm9ybWF0aW9uLgogICogQHBvcnQ6CQlQb3J0IGluZm9ybWF0aW9uLgogICogQG1vbml0b3JfdGltZV9pbmZvOglUaW1lciB0byBtb25pdG9yIHBvcnRzLgotICogQHN0YXRzOgkJTmV0d29yayBzdGF0aXN0aWNzLgogICogQHByb2Nfc2VtOgkJU2VtYXBob3JlIGZvciBwcm9jIGFjY2Vzc2luZy4KICAqIEBpZDoJCQlEZXZpY2UgSUQuCiAgKiBAbWlpX2lmOgkJTUlJIGludGVyZmFjZSBpbmZvcm1hdGlvbi4KQEAgLTE0NzEsNyArMTQ3MCw2IEBACiAJc3RydWN0IGRldl9pbmZvICphZGFwdGVyOwogCXN0cnVjdCBrc3pfcG9ydCBwb3J0OwogCXN0cnVjdCBrc3pfdGltZXJfaW5mbyBtb25pdG9yX3RpbWVyX2luZm87Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAKIAlzdHJ1Y3Qgc2VtYXBob3JlIHByb2Nfc2VtOwogCWludCBpZDsKQEAgLTQ3NTEsOCArNDc0OSw4IEBACiAJaHdfc2VuZF9wa3QoaHcpOwogCiAJLyogVXBkYXRlIHRyYW5zbWl0IHN0YXRpc3RpY3MuICovCi0JcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKIH0KIAogLyoqCkBAIC01MDMwLDcgKzUwMjgsNyBAQAogCQkvKiBza2ItPmRhdGEgIT0gc2tiLT5oZWFkICovCiAJCXNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbiArIDIpOwogCQlpZiAoIXNrYikgewotCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC01MDUwLDggKzUwNDgsOCBAQAogCQljc3VtX3ZlcmlmaWVkKHNrYik7CiAKIAkvKiBVcGRhdGUgcmVjZWl2ZSBzdGF0aXN0aWNzLiAqLwotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXRfbGVuOworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGFja2V0X2xlbjsKIAogCS8qIE5vdGlmeSB1cHBlciBsYXllciBmb3IgcmVjZWl2ZWQgcGFja2V0LiAqLwogCXJ4X3N0YXR1cyA9IG5ldGlmX3J4KHNrYik7CkBAIC01MjkxLDcgKzUyODksNyBAQAogCQl9CiAKIAkJaWYgKHVubGlrZWx5KGludF9lbmFibGUgJiBLUzg4NFhfSU5UX1JYX09WRVJSVU4pKSB7Ci0JCQlwcml2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJaHdfcmVzdW1lX3J4KGh3KTsKIAkJfQogCkBAIC01NTIyLDcgKzU1MjAsNyBAQAogCXByaXYtPnByb21pc2N1b3VzID0gMDsKIAogCS8qIFJlc2V0IGRldmljZSBzdGF0aXN0aWNzLiAqLwotCW1lbXNldCgmcHJpdi0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCW1lbXNldCgmZGV2LT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CiAJbWVtc2V0KCh2b2lkICopIHBvcnQtPmNvdW50ZXIsIDAsCiAJCShzaXplb2YodTY0KSAqIE9JRF9DT1VOVEVSX0xBU1QpKTsKIApAQCAtNTYyMiw0MiArNTYyMCw0MiBAQAogCWludCBpOwogCWludCBwOwogCi0JcHJpdi0+c3RhdHMucnhfZXJyb3JzID0gcG9ydC0+Y291bnRlcltPSURfQ09VTlRFUl9SQ1ZfRVJST1JdOwotCXByaXYtPnN0YXRzLnR4X2Vycm9ycyA9IHBvcnQtPmNvdW50ZXJbT0lEX0NPVU5URVJfWE1JVF9FUlJPUl07CisJZGV2LT5zdGF0cy5yeF9lcnJvcnMgPSBwb3J0LT5jb3VudGVyW09JRF9DT1VOVEVSX1JDVl9FUlJPUl07CisJZGV2LT5zdGF0cy50eF9lcnJvcnMgPSBwb3J0LT5jb3VudGVyW09JRF9DT1VOVEVSX1hNSVRfRVJST1JdOwogCiAJLyogUmVzZXQgdG8gemVybyB0byBhZGQgY291bnQgbGF0ZXIuICovCi0JcHJpdi0+c3RhdHMubXVsdGljYXN0ID0gMDsKLQlwcml2LT5zdGF0cy5jb2xsaXNpb25zID0gMDsKLQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKLQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsKLQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSAwOwotCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAwOworCWRldi0+c3RhdHMubXVsdGljYXN0ID0gMDsKKwlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgPSAwOworCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7CisJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsKKwlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IDA7CisJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKIAogCWZvciAoaSA9IDAsIHAgPSBwb3J0LT5maXJzdF9wb3J0OyBpIDwgcG9ydC0+bWliX3BvcnRfY250OyBpKyssIHArKykgewogCQltaWIgPSAmaHctPnBvcnRfbWliW3BdOwogCi0JCXByaXYtPnN0YXRzLm11bHRpY2FzdCArPSAodW5zaWduZWQgbG9uZykKKwkJZGV2LT5zdGF0cy5tdWx0aWNhc3QgKz0gKHVuc2lnbmVkIGxvbmcpCiAJCQltaWItPmNvdW50ZXJbTUlCX0NPVU5URVJfUlhfTVVMVElDQVNUXTsKIAotCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zICs9ICh1bnNpZ25lZCBsb25nKQorCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHVuc2lnbmVkIGxvbmcpCiAJCQltaWItPmNvdW50ZXJbTUlCX0NPVU5URVJfVFhfVE9UQUxfQ09MTElTSU9OXTsKIAotCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9ICh1bnNpZ25lZCBsb25nKSgKKwkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9ICh1bnNpZ25lZCBsb25nKSgKIAkJCW1pYi0+Y291bnRlcltNSUJfQ09VTlRFUl9SWF9VTkRFUlNJWkVdICsKIAkJCW1pYi0+Y291bnRlcltNSUJfQ09VTlRFUl9SWF9GUkFHTUVOVF0gKwogCQkJbWliLT5jb3VudGVyW01JQl9DT1VOVEVSX1JYX09WRVJTSVpFXSArCiAJCQltaWItPmNvdW50ZXJbTUlCX0NPVU5URVJfUlhfSkFCQkVSXSk7Ci0JCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gKHVuc2lnbmVkIGxvbmcpCisJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSAodW5zaWduZWQgbG9uZykKIAkJCW1pYi0+Y291bnRlcltNSUJfQ09VTlRFUl9SWF9DUkNfRVJSXTsKLQkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9ICh1bnNpZ25lZCBsb25nKSgKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gKHVuc2lnbmVkIGxvbmcpKAogCQkJbWliLT5jb3VudGVyW01JQl9DT1VOVEVSX1JYX0FMSUdOTUVOVF9FUlJdICsKIAkJCW1pYi0+Y291bnRlcltNSUJfQ09VTlRFUl9SWF9TWU1CT0xfRVJSXSk7CiAKLQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycyArPSAodW5zaWduZWQgbG9uZykKKwkJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzICs9ICh1bnNpZ25lZCBsb25nKQogCQkJbWliLT5jb3VudGVyW01JQl9DT1VOVEVSX1RYX0xBVEVfQ09MTElTSU9OXTsKIAl9CiAKLQlyZXR1cm4gJnByaXYtPnN0YXRzOworCXJldHVybiAmZGV2LT5zdGF0czsKIH0KIAogLyoqCkBAIC01NzE4LDcgKzU3MTYsNyBAQAogCQkgKiBmcm9tIHRoZSBicmlkZ2UuCiAJCSAqLwogCQlpZiAoKGh3LT5mZWF0dXJlcyAmIFNUUF9TVVBQT1JUKSAmJiAhcHJvbWlzY3VvdXMgJiYKLQkJCQlkZXYtPmJyX3BvcnQpIHsKKwkJICAgIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpKSB7CiAJCQlzdHJ1Y3Qga3N6X3N3aXRjaCAqc3cgPSBody0+a3N6X3N3aXRjaDsKIAkJCWludCBwb3J0ID0gcHJpdi0+cG9ydC5maXJzdF9wb3J0OwogCkBAIC02ODEyLDcgKzY4MTAsNyBAQAogc3RhdGljIGludCBmYXN0X2FnaW5nOwogCiAvKioKLSAqIG5ldGRldl9pbml0IC0gaW5pdGFsaXplIG5ldHdvcmsgZGV2aWNlLgorICogbmV0ZGV2X2luaXQgLSBpbml0aWFsaXplIG5ldHdvcmsgZGV2aWNlLgogICogQGRldjoJTmV0d29yayBkZXZpY2UuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbmV0d29yayBkZXZpY2UuCkBAIC02ODk2LDEzICs2ODk0LDEyIEBACiAJaSA9IGogPSBudW0gPSBnb3RfbnVtID0gMDsKIAl3aGlsZSAoaiA8IE1BQ19BRERSX0xFTikgewogCQlpZiAobWFjYWRkcltpXSkgeworCQkJaW50IGRpZ2l0OworCiAJCQlnb3RfbnVtID0gMTsKLQkJCWlmICgnMCcgPD0gbWFjYWRkcltpXSAmJiBtYWNhZGRyW2ldIDw9ICc5JykKLQkJCQludW0gPSBudW0gKiAxNiArIG1hY2FkZHJbaV0gLSAnMCc7Ci0JCQllbHNlIGlmICgnQScgPD0gbWFjYWRkcltpXSAmJiBtYWNhZGRyW2ldIDw9ICdGJykKLQkJCQludW0gPSBudW0gKiAxNiArIDEwICsgbWFjYWRkcltpXSAtICdBJzsKLQkJCWVsc2UgaWYgKCdhJyA8PSBtYWNhZGRyW2ldICYmIG1hY2FkZHJbaV0gPD0gJ2YnKQotCQkJCW51bSA9IG51bSAqIDE2ICsgMTAgKyBtYWNhZGRyW2ldIC0gJ2EnOworCQkJZGlnaXQgPSBoZXhfdG9fYmluKG1hY2FkZHJbaV0pOworCQkJaWYgKGRpZ2l0ID49IDApCisJCQkJbnVtID0gbnVtICogMTYgKyBkaWdpdDsKIAkJCWVsc2UgaWYgKCc6JyA9PSBtYWNhZGRyW2ldKQogCQkJCWdvdF9udW0gPSAyOwogCQkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKaW5kZXggMjFmOGFkYS4uZjA2Mjk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9sYW5jZS5jCkBAIC0yNDgsNyArMjQ4LDYgQEAKIAlpbnQgY3VyX3J4LCBjdXJfdHg7CQkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCiAJaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJCS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCiAJaW50IGRtYTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAl1bnNpZ25lZCBjaGFyIGNoaXBfdmVyc2lvbjsJLyogU2VlIGxhbmNlX2NoaXBfdHlwZS4gKi8KIAlzcGlubG9ja190IGRldmxvY2s7CiB9OwpAQCAtOTI1LDcgKzkyNCw3IEBACiAJcHJpbnRrICgiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU0LjR4LCByZXNldHRpbmcuXG4iLAogCQlkZXYtPm5hbWUsIGludyAoaW9hZGRyICsgTEFOQ0VfREFUQSkpOwogCW91dHcgKDB4MDAwNCwgaW9hZGRyICsgTEFOQ0VfREFUQSk7Ci0JbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAjaWZuZGVmIGZpbmFsX3ZlcnNpb24KIAlpZiAobGFuY2VfZGVidWcgPiAzKSB7CiAJCWludCBpOwpAQCAtOTg5LDcgKzk4OCw3IEBACiAKIAlscC0+dHhfcmluZ1tlbnRyeV0ubWlzYyA9IDB4MDAwMDsKIAotCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJLyogSWYgYW55IHBhcnQgb2YgdGhpcyBidWZmZXIgaXMgPjE2TSB3ZSBtdXN0IGNvcHkgaXQgdG8gYSBsb3ctbWVtb3J5CiAJICAgYnVmZmVyLiAqLwpAQCAtMTA2MiwxMyArMTA2MSwxNiBAQAogCQkJCWlmIChzdGF0dXMgJiAweDQwMDAwMDAwKSB7CiAJCQkJCS8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLwogCQkJCQlpbnQgZXJyX3N0YXR1cyA9IGxwLT50eF9yaW5nW2VudHJ5XS5taXNjOwotCQkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCQkJCWlmIChlcnJfc3RhdHVzICYgMHgwNDAwKSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKLQkJCQkJaWYgKGVycl9zdGF0dXMgJiAweDA4MDApIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwotCQkJCQlpZiAoZXJyX3N0YXR1cyAmIDB4MTAwMCkgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiAweDA0MDApCisJCQkJCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgMHgwODAwKQorCQkJCQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIDB4MTAwMCkKKwkJCQkJCWRldi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOwogCQkJCQlpZiAoZXJyX3N0YXR1cyAmIDB4NDAwMCkgewogCQkJCQkJLyogQWNrayEgIE9uIEZJRk8gZXJyb3JzIHRoZSBUeCB1bml0IGlzIHR1cm5lZCBvZmYhICovCi0JCQkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJCQkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KIAkJCQkJCXByaW50aygiJXM6IFR4IEZJRk8gZXJyb3IhIFN0YXR1cyAlNC40eC5cbiIsCiAJCQkJCQkJICAgZGV2LT5uYW1lLCBjc3IwKTsKQEAgLTEwNzcsOCArMTA3OSw4IEBACiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoc3RhdHVzICYgMHgxODAwMDAwMCkKLQkJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7Ci0JCQkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCQkJfQogCiAJCQkJLyogV2UgbXVzdCBmcmVlIHRoZSBvcmlnaW5hbCBza2IgaWYgaXQncyBub3QgYSBkYXRhLW9ubHkgY29weQpAQCAtMTEwOCw4ICsxMTEwLDEwIEBACiAJCX0KIAogCQkvKiBMb2cgbWlzYyBlcnJvcnMuICovCi0JCWlmIChjc3IwICYgMHg0MDAwKSBscC0+c3RhdHMudHhfZXJyb3JzKys7IC8qIFR4IGJhYmJsZS4gKi8KLQkJaWYgKGNzcjAgJiAweDEwMDApIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJCWlmIChjc3IwICYgMHg0MDAwKQorCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsgLyogVHggYmFiYmxlLiAqLworCQlpZiAoY3NyMCAmIDB4MTAwMCkKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLwogCQlpZiAoY3NyMCAmIDB4MDgwMCkgewogCQkJcHJpbnRrKCIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlLCBzdGF0dXMgJTQuNHguXG4iLAogCQkJCSAgIGRldi0+bmFtZSwgY3NyMCk7CkBAIC0xMTU1LDExICsxMTU5LDE1IEBACiAJCQkgICBidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCiAJCQkgICBidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuICovCiAJCQlpZiAoc3RhdHVzICYgMHgwMSkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlICovCi0JCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KLQkJCWlmIChzdGF0dXMgJiAweDIwKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgMHgxMCkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgMHgwOCkgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJCWlmIChzdGF0dXMgJiAweDA0KSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCWlmIChzdGF0dXMgJiAweDIwKQorCQkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgxMCkKKwkJCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgwOCkKKwkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA0KQorCQkJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCWxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlICY9IDB4MDNmZmZmZmY7CiAJCX0KIAkJZWxzZQpAQCAtMTE3MSw3ICsxMTc5LDcgQEAKIAkJCWlmKHBrdF9sZW48NjApCiAJCQl7CiAJCQkJcHJpbnRrKCIlczogUnVudCBwYWNrZXQhXG4iLGRldi0+bmFtZSk7Ci0JCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQl9CiAJCQllbHNlCiAJCQl7CkBAIC0xMTg1LDcgKzExOTMsNyBAQAogCiAJCQkJCWlmIChpID4gUlhfUklOR19TSVpFIC0yKQogCQkJCQl7Ci0JCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJCQlscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSB8PSAweDgwMDAwMDAwOwogCQkJCQkJbHAtPmN1cl9yeCsrOwogCQkJCQl9CkBAIC0xMTk4LDggKzEyMDYsOCBAQAogCQkJCQlwa3RfbGVuKTsKIAkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwogCQkJCW5ldGlmX3J4KHNrYik7Ci0JCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwogCQkJfQogCQl9CiAJCS8qIFRoZSBkb2NzIHNheSB0aGF0IHRoZSBidWZmZXIgbGVuZ3RoIGlzbid0IHRvdWNoZWQsIGJ1dCBBbmRyZXcgQm95ZApAQCAtMTIyNSw3ICsxMjMzLDcgQEAKIAogCWlmIChjaGlwX3RhYmxlW2xwLT5jaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfSEFTX01JU1NFRF9GUkFNRSkgewogCQlvdXR3KDExMiwgaW9hZGRyK0xBTkNFX0FERFIpOwotCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGludyhpb2FkZHIrTEFOQ0VfREFUQSk7CisJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGludyhpb2FkZHIrTEFOQ0VfREFUQSk7CiAJfQogCW91dHcoMCwgaW9hZGRyK0xBTkNFX0FERFIpOwogCkBAIC0xMjYyLDEyICsxMjcwLDEyIEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+ZGV2bG9jaywgZmxhZ3MpOwogCQlzYXZlZF9hZGRyID0gaW53KGlvYWRkcitMQU5DRV9BRERSKTsKIAkJb3V0dygxMTIsIGlvYWRkcitMQU5DRV9BRERSKTsKLQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBpbncoaW9hZGRyK0xBTkNFX0RBVEEpOworCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBpbncoaW9hZGRyK0xBTkNFX0RBVEEpOwogCQlvdXR3KHNhdmVkX2FkZHIsIGlvYWRkcitMQU5DRV9BRERSKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmRldmxvY2ssIGZsYWdzKTsKIAl9CiAKLQlyZXR1cm4gJmxwLT5zdGF0czsKKwlyZXR1cm4gJmRldi0+c3RhdHM7CiB9CiAKIC8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGxfdGVtYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvbGxfdGVtYWNfbWFpbi5jCmluZGV4IDY0NzRjNDkuLjRlZWEzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xsX3RlbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9sbF90ZW1hY19tYWluLmMKQEAgLTE5Myw2ICsxOTMsMzUgQEAKICNlbmRpZgogCiAvKioKKyAqICAqIHRlbWFjX2RtYV9iZF9yZWxlYXNlIC0gUmVsZWFzZSBidWZmZXIgZGVzY3JpcHRvciByaW5ncworICovCitzdGF0aWMgdm9pZCB0ZW1hY19kbWFfYmRfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgdGVtYWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQkRfTlVNOyBpKyspIHsKKwkJaWYgKCFscC0+cnhfc2tiW2ldKQorCQkJYnJlYWs7CisJCWVsc2UgeworCQkJZG1hX3VubWFwX3NpbmdsZShuZGV2LT5kZXYucGFyZW50LCBscC0+cnhfYmRfdltpXS5waHlzLAorCQkJCQlYVEVfTUFYX0pVTUJPX0ZSQU1FX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGxwLT5yeF9za2JbaV0pOworCQl9CisJfQorCWlmIChscC0+cnhfYmRfdikKKwkJZG1hX2ZyZWVfY29oZXJlbnQobmRldi0+ZGV2LnBhcmVudCwKKwkJCQlzaXplb2YoKmxwLT5yeF9iZF92KSAqIFJYX0JEX05VTSwKKwkJCQlscC0+cnhfYmRfdiwgbHAtPnJ4X2JkX3ApOworCWlmIChscC0+dHhfYmRfdikKKwkJZG1hX2ZyZWVfY29oZXJlbnQobmRldi0+ZGV2LnBhcmVudCwKKwkJCQlzaXplb2YoKmxwLT50eF9iZF92KSAqIFRYX0JEX05VTSwKKwkJCQlscC0+dHhfYmRfdiwgbHAtPnR4X2JkX3ApOworCWlmIChscC0+cnhfc2tiKQorCQlrZnJlZShscC0+cnhfc2tiKTsKK30KKworLyoqCiAgKiB0ZW1hY19kbWFfYmRfaW5pdCAtIFNldHVwIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmdzCiAgKi8KIHN0YXRpYyBpbnQgdGVtYWNfZG1hX2JkX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCkBAIC0yMDIsMTQgKzIzMSwyOSBAQAogCWludCBpOwogCiAJbHAtPnJ4X3NrYiA9IGt6YWxsb2Moc2l6ZW9mKCpscC0+cnhfc2tiKSAqIFJYX0JEX05VTSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscC0+cnhfc2tiKSB7CisJCWRldl9lcnIoJm5kZXYtPmRldiwKKwkJCQkiY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBETUEgUlggYnVmZmVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQogCS8qIGFsbG9jYXRlIHRoZSB0eCBhbmQgcnggcmluZyBidWZmZXIgZGVzY3JpcHRvcnMuICovCiAJLyogcmV0dXJucyBhIHZpcnR1YWwgYWRkcmVzIGFuZCBhIHBoeXNpY2FsIGFkZHJlc3MuICovCiAJbHAtPnR4X2JkX3YgPSBkbWFfYWxsb2NfY29oZXJlbnQobmRldi0+ZGV2LnBhcmVudCwKIAkJCQkJIHNpemVvZigqbHAtPnR4X2JkX3YpICogVFhfQkRfTlVNLAogCQkJCQkgJmxwLT50eF9iZF9wLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwLT50eF9iZF92KSB7CisJCWRldl9lcnIoJm5kZXYtPmRldiwKKwkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBUWCBidWZmZXIgZGVzY3JpcHRvcnMiKTsKKwkJZ290byBvdXQ7CisJfQogCWxwLT5yeF9iZF92ID0gZG1hX2FsbG9jX2NvaGVyZW50KG5kZXYtPmRldi5wYXJlbnQsCiAJCQkJCSBzaXplb2YoKmxwLT5yeF9iZF92KSAqIFJYX0JEX05VTSwKIAkJCQkJICZscC0+cnhfYmRfcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscC0+cnhfYmRfdikgeworCQlkZXZfZXJyKCZuZGV2LT5kZXYsCisJCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBETUEgUlggYnVmZmVyIGRlc2NyaXB0b3JzIik7CisJCWdvdG8gb3V0OworCX0KIAogCW1lbXNldChscC0+dHhfYmRfdiwgMCwgc2l6ZW9mKCpscC0+dHhfYmRfdikgKiBUWF9CRF9OVU0pOwogCWZvciAoaSA9IDA7IGkgPCBUWF9CRF9OVU07IGkrKykgewpAQCAtMjI3LDcgKzI3MSw3IEBACiAKIAkJaWYgKHNrYiA9PSAwKSB7CiAJCQlkZXZfZXJyKCZuZGV2LT5kZXYsICJhbGxvY19za2IgZXJyb3IgJWRcbiIsIGkpOwotCQkJcmV0dXJuIC0xOworCQkJZ290byBvdXQ7CiAJCX0KIAkJbHAtPnJ4X3NrYltpXSA9IHNrYjsKIAkJLyogcmV0dXJucyBwaHlzaWNhbCBhZGRyZXNzIG9mIHNrYi0+ZGF0YSAqLwpAQCAtMjU4LDYgKzMwMiwxMCBAQAogCWxwLT5kbWFfb3V0KGxwLCBUWF9DVVJERVNDX1BUUiwgbHAtPnR4X2JkX3ApOwogCiAJcmV0dXJuIDA7CisKK291dDoKKwl0ZW1hY19kbWFfYmRfcmVsZWFzZShuZGV2KTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDksNyArNDk3LDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi0vKiBJbml0aWxpemUgdGVtYWMgKi8KKy8qIEluaXRpYWxpemUgdGVtYWMgKi8KIHN0YXRpYyB2b2lkIHRlbWFjX2RldmljZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgdGVtYWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC01MDUsNyArNTUzLDEwIEBACiAJfQogCWxwLT5kbWFfb3V0KGxwLCBETUFfQ09OVFJPTF9SRUcsIERNQV9UQUlMX0VOQUJMRSk7CiAKLQl0ZW1hY19kbWFfYmRfaW5pdChuZGV2KTsKKwlpZiAodGVtYWNfZG1hX2JkX2luaXQobmRldikpIHsKKwkJZGV2X2VycigmbmRldi0+ZGV2LAorCQkJCSJ0ZW1hY19kZXZpY2VfcmVzZXQgZGVzY3JpcHRvciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJfQogCiAJdGVtYWNfaW5kaXJlY3Rfb3V0MzIobHAsIFhURV9SWEMwX09GRlNFVCwgMCk7CiAJdGVtYWNfaW5kaXJlY3Rfb3V0MzIobHAsIFhURV9SWEMxX09GRlNFVCwgMCk7CkBAIC04MzcsNiArODg4LDggQEAKIAkJcGh5X2Rpc2Nvbm5lY3QobHAtPnBoeV9kZXYpOwogCWxwLT5waHlfZGV2ID0gTlVMTDsKIAorCXRlbWFjX2RtYV9iZF9yZWxlYXNlKG5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg2Miw2ICs5MTUsNyBAQAogCS5uZG9fc3RvcCA9IHRlbWFjX3N0b3AsCiAJLm5kb19zdGFydF94bWl0ID0gdGVtYWNfc3RhcnRfeG1pdCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcyA9IG5ldGRldl9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLy8ubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHRlbWFjX3NldF9tdWx0aWNhc3RfbGlzdCwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyID0gdGVtYWNfcG9sbF9jb250cm9sbGVyLApAQCAtOTc4LDE5ICsxMDMyLDIyIEBACiAJCQlkZXZfZGJnKCZvcC0+ZGV2LCAiTUVNIGJhc2U6ICVwXG4iLCBscC0+c2RtYV9yZWdzKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoJm9wLT5kZXYsICJ1bmFibGUgdG8gbWFwIERNQSByZWdpc3RlcnNcbiIpOworCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJZ290byBlcnJfaW91bm1hcDsKIAkJfQogCX0KIAogCWxwLT5yeF9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJbHAtPnR4X2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAxKTsKKworCW9mX25vZGVfcHV0KG5wKTsgLyogRmluaXNoZWQgd2l0aCB0aGUgRE1BIG5vZGU7IGRyb3AgdGhlIHJlZmVyZW5jZSAqLworCiAJaWYgKChscC0+cnhfaXJxID09IE5PX0lSUSkgfHwgKGxwLT50eF9pcnEgPT0gTk9fSVJRKSkgewogCQlkZXZfZXJyKCZvcC0+ZGV2LCAiY291bGQgbm90IGRldGVybWluZSBpcnFzXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9pb3VubWFwXzI7CiAJfQogCi0Jb2Zfbm9kZV9wdXQobnApOyAvKiBGaW5pc2hlZCB3aXRoIHRoZSBETUEgbm9kZTsgZHJvcCB0aGUgcmVmZXJlbmNlICovCiAKIAkvKiBSZXRyaWV2ZSB0aGUgTUFDIGFkZHJlc3MgKi8KIAlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KG9wLT5kZXYub2Zfbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwgJnNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKaW5kZXggNzJiNzk0OS4uOWEwOTk2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYworKysgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCkBAIC01OCwxMSArNTgsMTMgQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3U2NF9zdGF0c19zeW5jLmg+CiAKIHN0cnVjdCBwY3B1X2xzdGF0cyB7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyBkcm9wczsKKwl1NjQJCQlwYWNrZXRzOworCXU2NAkJCWJ5dGVzOworCXN0cnVjdCB1NjRfc3RhdHNfc3luYwlzeW5jcDsKKwl1bnNpZ25lZCBsb25nCQlkcm9wczsKIH07CiAKIC8qCkBAIC04NiwzMSArODgsNDAgQEAKIAogCWxlbiA9IHNrYi0+bGVuOwogCWlmIChsaWtlbHkobmV0aWZfcngoc2tiKSA9PSBORVRfUlhfU1VDQ0VTUykpIHsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmbGJfc3RhdHMtPnN5bmNwKTsKIAkJbGJfc3RhdHMtPmJ5dGVzICs9IGxlbjsKIAkJbGJfc3RhdHMtPnBhY2tldHMrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmxiX3N0YXRzLT5zeW5jcCk7CiAJfSBlbHNlCiAJCWxiX3N0YXRzLT5kcm9wcysrOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsb29wYmFja19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmxvb3BiYWNrX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCWNvbnN0IHN0cnVjdCBwY3B1X2xzdGF0cyBfX3BlcmNwdSAqcGNwdV9sc3RhdHM7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7Ci0JdW5zaWduZWQgbG9uZyBieXRlcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzID0gMDsKLQl1bnNpZ25lZCBsb25nIGRyb3BzID0gMDsKKwl1NjQgYnl0ZXMgPSAwOworCXU2NCBwYWNrZXRzID0gMDsKKwl1NjQgZHJvcHMgPSAwOwogCWludCBpOwogCiAJcGNwdV9sc3RhdHMgPSAodm9pZCBfX3BlcmNwdSBfX2ZvcmNlICopZGV2LT5tbF9wcml2OwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCWNvbnN0IHN0cnVjdCBwY3B1X2xzdGF0cyAqbGJfc3RhdHM7CisJCXU2NCB0Ynl0ZXMsIHRwYWNrZXRzOworCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAKIAkJbGJfc3RhdHMgPSBwZXJfY3B1X3B0cihwY3B1X2xzdGF0cywgaSk7Ci0JCWJ5dGVzICAgKz0gbGJfc3RhdHMtPmJ5dGVzOwotCQlwYWNrZXRzICs9IGxiX3N0YXRzLT5wYWNrZXRzOworCQlkbyB7CisJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbigmbGJfc3RhdHMtPnN5bmNwKTsKKwkJCXRieXRlcyA9IGxiX3N0YXRzLT5ieXRlczsKKwkJCXRwYWNrZXRzID0gbGJfc3RhdHMtPnBhY2tldHM7CisJCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeSgmbGJfc3RhdHMtPnN5bmNwLCBzdGFydCkpOwogCQlkcm9wcyAgICs9IGxiX3N0YXRzLT5kcm9wczsKKwkJYnl0ZXMgICArPSB0Ynl0ZXM7CisJCXBhY2tldHMgKz0gdHBhY2tldHM7CiAJfQogCXN0YXRzLT5yeF9wYWNrZXRzID0gcGFja2V0czsKIAlzdGF0cy0+dHhfcGFja2V0cyA9IHBhY2tldHM7CkBAIC0xNTgsNyArMTY5LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbG9vcGJhY2tfb3BzID0gewogCS5uZG9faW5pdCAgICAgID0gbG9vcGJhY2tfZGV2X2luaXQsCiAJLm5kb19zdGFydF94bWl0PSBsb29wYmFja194bWl0LAotCS5uZG9fZ2V0X3N0YXRzID0gbG9vcGJhY2tfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQgPSBsb29wYmFja19nZXRfc3RhdHM2NCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMgYi9kcml2ZXJzL25ldC9tYWM4MzkwLmMKaW5kZXggMTEzNmM5YS4uMzgzMmZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjODM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwpAQCAtMTU3LDYgKzE1Nyw4IEBACiAjZGVmaW5lIG1lbWNweV9mcm9taW8oYSwgYiwgYykJbWVtY3B5KChhKSwgKHZvaWQgKikoYiksIChjKSkKICNkZWZpbmUgbWVtY3B5X3RvaW8oYSwgYiwgYykJbWVtY3B5KCh2b2lkICopKGEpLCAoYiksIChjKSkKIAorI2RlZmluZSBtZW1jbXBfd2l0aGlvKGEsIGIsIGMpCW1lbWNtcCgoYSksICh2b2lkICopKGIpLCAoYykpCisKIC8qIFNsb3cgU2FuZSAoMTYtYml0IGNodW5rIG1lbW9yeSByZWFkL3dyaXRlKSBDYWJsZXRyb24gdXNlcyB0aGlzICovCiBzdGF0aWMgdm9pZCBzbG93X3NhbmVfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CkBAIC0xNjQsOCArMTY2LDggQEAKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CiBzdGF0aWMgdm9pZCBzbG93X3NhbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKIAkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKLXN0YXRpYyB2b2lkIHdvcmRfbWVtY3B5X3RvY2FyZCh2b2lkICp0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCk7Ci1zdGF0aWMgdm9pZCB3b3JkX21lbWNweV9mcm9tY2FyZCh2b2lkICp0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCB3b3JkX21lbWNweV90b2NhcmQodW5zaWduZWQgbG9uZyB0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCB3b3JkX21lbWNweV9mcm9tY2FyZCh2b2lkICp0cCwgdW5zaWduZWQgbG9uZyBmcCwgaW50IGNvdW50KTsKIAogc3RhdGljIGVudW0gbWFjODM5MF90eXBlIF9faW5pdCBtYWM4MzkwX2lkZW50KHN0cnVjdCBudWJ1c19kZXYgKmRldikKIHsKQEAgLTI0NSw5ICsyNDcsOSBAQAogCXVuc2lnbmVkIGxvbmcgb3V0ZGF0YSA9IDB4QTVBMEI1QjA7CiAJdW5zaWduZWQgbG9uZyBpbmRhdGEgPSAgMHgwMDAwMDAwMDsKIAkvKiBUcnkgd3JpdGluZyAzMiBiaXRzICovCi0JbWVtY3B5KG1lbWJhc2UsICZvdXRkYXRhLCA0KTsKKwltZW1jcHlfdG9pbyhtZW1iYXNlLCAmb3V0ZGF0YSwgNCk7CiAJLyogTm93IGNvbXBhcmUgdGhlbSAqLwotCWlmIChtZW1jbXAoKGNoYXIgKikmb3V0ZGF0YSwgKGNoYXIgKiltZW1iYXNlLCA0KSA9PSAwKQorCWlmIChtZW1jbXBfd2l0aGlvKCZvdXRkYXRhLCBtZW1iYXNlLCA0KSA9PSAwKQogCQlyZXR1cm4gQUNDRVNTXzMyOwogCS8qIFdyaXRlIDE2IGJpdCBvdXRwdXQgKi8KIAl3b3JkX21lbWNweV90b2NhcmQobWVtYmFzZSwgJm91dGRhdGEsIDQpOwpAQCAtNTU0LDcgKzU1Niw3IEBACiAJY2FzZSBNQUM4MzkwX0FQUExFOgogCQlzd2l0Y2ggKG1hYzgzOTBfdGVzdGlvKGRldi0+bWVtX3N0YXJ0KSkgewogCQljYXNlIEFDQ0VTU19VTktOT1dOOgotCQkJcHJfaW5mbygiRG9uJ3Qga25vdyBob3cgdG8gYWNjZXNzIGNhcmQgbWVtb3J5IVxuIik7CisJCQlwcl9lcnIoIkRvbid0IGtub3cgaG93IHRvIGFjY2VzcyBjYXJkIG1lbW9yeSFcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQlicmVhazsKIApAQCAtNjQxLDEyICs2NDMsMTMgQEAKIAogc3RhdGljIGludCBtYWM4MzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlpbnQgZXJyOworCiAJX19laV9vcGVuKGRldik7Ci0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBfX2VpX2ludGVycnVwdCwgMCwgIjgzOTAgRXRoZXJuZXQiLCBkZXYpKSB7Ci0JCXByX2luZm8oIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0JcmV0dXJuIDA7CisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIF9fZWlfaW50ZXJydXB0LCAwLCAiODM5MCBFdGhlcm5ldCIsIGRldik7CisJaWYgKGVycikKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbWFjODM5MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNzMxLDcgKzczNCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQogewogCXVuc2lnbmVkIGxvbmcgaGRyX3N0YXJ0ID0gKHJpbmdfcGFnZSAtIFdEX1NUQVJUX1BHKTw8ODsKLQltZW1jcHlfZnJvbWlvKCh2b2lkICopaGRyLCAoY2hhciAqKWRldi0+bWVtX3N0YXJ0ICsgaGRyX3N0YXJ0LCA0KTsKKwltZW1jcHlfZnJvbWlvKGhkciwgZGV2LT5tZW1fc3RhcnQgKyBoZHJfc3RhcnQsIDQpOwogCS8qIEZpeCBlbmRpYW5uZXNzICovCiAJaGRyLT5jb3VudCA9IHN3YWIxNihoZHItPmNvdW50KTsKIH0KQEAgLTc0NSwxNCArNzQ4LDEzIEBACiAJaWYgKHhmZXJfc3RhcnQgKyBjb3VudCA+IGVpX3N0YXR1cy5ybWVtX2VuZCkgewogCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCiAJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnJtZW1fZW5kIC0geGZlcl9zdGFydDsKLQkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyB4ZmVyX2Jhc2UsCisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBkZXYtPm1lbV9zdGFydCArIHhmZXJfYmFzZSwKIAkJCSAgICAgIHNlbWlfY291bnQpOwogCQljb3VudCAtPSBzZW1pX2NvdW50OwotCQltZW1jcHlfdG9pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LAotCQkJICAgIChjaGFyICopZWlfc3RhdHVzLnJtZW1fc3RhcnQsIGNvdW50KTsKLQl9IGVsc2UgewotCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgKGNoYXIgKilkZXYtPm1lbV9zdGFydCArIHhmZXJfYmFzZSwKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBlaV9zdGF0dXMucm1lbV9zdGFydCwKIAkJCSAgICAgIGNvdW50KTsKKwl9IGVsc2UgeworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgZGV2LT5tZW1fc3RhcnQgKyB4ZmVyX2Jhc2UsIGNvdW50KTsKIAl9CiB9CiAKQEAgLTc2MSw3ICs3NjMsNyBAQAogewogCWxvbmcgc2htZW0gPSAoc3RhcnRfcGFnZSAtIFdEX1NUQVJUX1BHKTw8ODsKIAotCW1lbWNweV90b2lvKChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyBzaG1lbSwgYnVmLCBjb3VudCk7CisJbWVtY3B5X3RvaW8oZGV2LT5tZW1fc3RhcnQgKyBzaG1lbSwgYnVmLCBjb3VudCk7CiB9CiAKIC8qIGRheW5hIGJsb2NrIGlucHV0L291dHB1dCAqLwpAQCAtODEyLDcgKzgxNCw3IEBACiAJCQkJICAgaW50IHJpbmdfcGFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIGhkcl9zdGFydCA9IChyaW5nX3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDg7Ci0Jd29yZF9tZW1jcHlfZnJvbWNhcmQoaGRyLCAoY2hhciAqKWRldi0+bWVtX3N0YXJ0ICsgaGRyX3N0YXJ0LCA0KTsKKwl3b3JkX21lbWNweV9mcm9tY2FyZChoZHIsIGRldi0+bWVtX3N0YXJ0ICsgaGRyX3N0YXJ0LCA0KTsKIAkvKiBSZWdpc3RlciBlbmRpYW5pc20gLSBmaXggaGVyZSByYXRoZXIgdGhhbiA4MzkwLmMgKi8KIAloZHItPmNvdW50ID0gKGhkci0+Y291bnQmMHhGRik8PDh8KGhkci0+Y291bnQ+PjgpOwogfQpAQCAtODI2LDE1ICs4MjgsMTQgQEAKIAlpZiAoeGZlcl9zdGFydCArIGNvdW50ID4gZWlfc3RhdHVzLnJtZW1fZW5kKSB7CiAJCS8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KIAkJaW50IHNlbWlfY291bnQgPSBlaV9zdGF0dXMucm1lbV9lbmQgLSB4ZmVyX3N0YXJ0OwotCQl3b3JkX21lbWNweV9mcm9tY2FyZChza2ItPmRhdGEsCi0JCQkJICAgICAoY2hhciAqKWRldi0+bWVtX3N0YXJ0ICsgeGZlcl9iYXNlLAorCQl3b3JkX21lbWNweV9mcm9tY2FyZChza2ItPmRhdGEsIGRldi0+bWVtX3N0YXJ0ICsgeGZlcl9iYXNlLAogCQkJCSAgICAgc2VtaV9jb3VudCk7CiAJCWNvdW50IC09IHNlbWlfY291bnQ7CiAJCXdvcmRfbWVtY3B5X2Zyb21jYXJkKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsCi0JCQkJICAgICAoY2hhciAqKWVpX3N0YXR1cy5ybWVtX3N0YXJ0LCBjb3VudCk7CisJCQkJICAgICBlaV9zdGF0dXMucm1lbV9zdGFydCwgY291bnQpOwogCX0gZWxzZSB7Ci0JCXdvcmRfbWVtY3B5X2Zyb21jYXJkKHNrYi0+ZGF0YSwKLQkJCQkgICAgIChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyB4ZmVyX2Jhc2UsIGNvdW50KTsKKwkJd29yZF9tZW1jcHlfZnJvbWNhcmQoc2tiLT5kYXRhLCBkZXYtPm1lbV9zdGFydCArIHhmZXJfYmFzZSwKKwkJCQkgICAgIGNvdW50KTsKIAl9CiB9CiAKQEAgLTg0MywxMiArODQ0LDEyIEBACiB7CiAJbG9uZyBzaG1lbSA9IChzdGFydF9wYWdlIC0gV0RfU1RBUlRfUEcpPDw4OwogCi0Jd29yZF9tZW1jcHlfdG9jYXJkKChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyBzaG1lbSwgYnVmLCBjb3VudCk7CisJd29yZF9tZW1jcHlfdG9jYXJkKGRldi0+bWVtX3N0YXJ0ICsgc2htZW0sIGJ1ZiwgY291bnQpOwogfQogCi1zdGF0aWMgdm9pZCB3b3JkX21lbWNweV90b2NhcmQodm9pZCAqdHAsIGNvbnN0IHZvaWQgKmZwLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCB3b3JkX21lbWNweV90b2NhcmQodW5zaWduZWQgbG9uZyB0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCkKIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqdG8gPSB0cDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqdG8gPSAodm9pZCAqKXRwOwogCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpmcm9tID0gZnA7CiAKIAljb3VudCsrOwpAQCAtODU4LDEwICs4NTksMTAgQEAKIAkJKnRvKysgPSAqZnJvbSsrOwogfQogCi1zdGF0aWMgdm9pZCB3b3JkX21lbWNweV9mcm9tY2FyZCh2b2lkICp0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIHdvcmRfbWVtY3B5X2Zyb21jYXJkKHZvaWQgKnRwLCB1bnNpZ25lZCBsb25nIGZwLCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgc2hvcnQgKnRvID0gdHA7Ci0JY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmZyb20gPSBmcDsKKwljb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqZnJvbSA9IChjb25zdCB2b2lkICopZnA7CiAKIAljb3VudCsrOwogCWNvdW50IC89IDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWM4OXgwLmMgYi9kcml2ZXJzL25ldC9tYWM4OXgwLmMKaW5kZXggNjlmYTRlZjYuLjY2OWIzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hYzg5eDAuYworKysgYi9kcml2ZXJzL25ldC9tYWM4OXgwLmMKQEAgLTExMCw3ICsxMTAsNiBAQAogCiAvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KIHN0cnVjdCBuZXRfbG9jYWwgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCWludCBjaGlwX3R5cGU7CQkvKiBvbmUgb2Y6IENTODkwMCwgQ1M4OTIwLCBDUzg5MjBNICovCiAJY2hhciBjaGlwX3JldmlzaW9uOwkvKiByZXZpc2lvbiBsZXR0ZXIgb2YgdGhlIGNoaXAgKCdBJy4uLikgKi8KIAlpbnQgc2VuZF9jbWQ7CQkvKiB0aGUgcHJvcGVyY29tbWFuZCB1c2VkIHRvIHNlbmQgYSBwYWNrZXQuICovCkBAIC00NDQsMTMgKzQ0MywxOCBAQAogCQkJbmV0X3J4KGRldik7CiAJCQlicmVhazsKIAkJY2FzZSBJU1FfVFJBTlNNSVRURVJfRVZFTlQ6Ci0JCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0JCQlpZiAoKHN0YXR1cyAmIFRYX09LKSA9PSAwKSBscC0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgVFhfTE9TVF9DUlMpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwotCQkJaWYgKHN0YXR1cyAmIFRYX1NRRV9FUlJPUikgbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKLQkJCWlmIChzdGF0dXMgJiBUWF9MQVRFX0NPTCkgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKLQkJCWlmIChzdGF0dXMgJiBUWF8xNl9DT0wpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKChzdGF0dXMgJiBUWF9PSykgPT0gMCkKKwkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRYX0xPU1RfQ1JTKQorCQkJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBUWF9TUUVfRVJST1IpCisJCQkJZGV2LT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVFhfTEFURV9DT0wpCisJCQkJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVFhfMTZfQ09MKQorCQkJCWRldi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKIAkJCWJyZWFrOwogCQljYXNlIElTUV9CVUZGRVJfRVZFTlQ6CiAJCQlpZiAoc3RhdHVzICYgUkVBRFlfRk9SX1RYKSB7CkBAIC00NjksMTAgKzQ3MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCQkJYnJlYWs7CiAJCWNhc2UgSVNRX1JYX01JU1NfRVZFTlQ6Ci0JCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc3RhdHVzID4+Nik7CisJCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHN0YXR1cyA+PiA2KTsKIAkJCWJyZWFrOwogCQljYXNlIElTUV9UWF9DT0xfRVZFTlQ6Ci0JCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+Nik7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyA+PiA2KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNDgzLDE5ICs0ODcsMjIgQEAKIHN0YXRpYyB2b2lkCiBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgc3RhdHVzLCBsZW5ndGg7CiAKIAlzdGF0dXMgPSByZWFkcmVnKGRldiwgUFBfUnhTdGF0dXMpOwogCWlmICgoc3RhdHVzICYgUlhfT0spID09IDApIHsKLQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQlpZiAoc3RhdHVzICYgUlhfUlVOVCkgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJaWYgKHN0YXR1cyAmIFJYX0VYVFJBX0RBVEEpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBSWF9DUkNfRVJST1IpIGlmICghKHN0YXR1cyAmIChSWF9FWFRSQV9EQVRBfFJYX1JVTlQpKSkKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX1JVTlQpCisJCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSWF9FWFRSQV9EQVRBKQorCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoKHN0YXR1cyAmIFJYX0NSQ19FUlJPUikgJiYKKwkJICAgICEoc3RhdHVzICYgKFJYX0VYVFJBX0RBVEF8UlhfUlVOVCkpKQogCQkJLyogcGVyIHN0ciAxNzIgKi8KLQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBSWF9EUklCQkxFKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX0RSSUJCTEUpCisJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTA0LDcgKzUxMSw3IEBACiAJc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOwotCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuOwogCX0KIAlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKQEAgLTUxOSw4ICs1MjYsOCBAQAogCiAgICAgICAgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CiAJbmV0aWZfcngoc2tiKTsKLQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CiB9CiAKIC8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gbmV0X29wZW4oKS4gKi8KQEAgLTU0OCwxNiArNTU1LDE1IEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgogbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLwotCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IChyZWFkcmVnKGRldiwgUFBfUnhNaXNzKSA+PiA2KTsKLQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAocmVhZHJlZyhkZXYsIFBQX1R4Q29sKSA+PiA2KTsKKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHJlYWRyZWcoZGV2LCBQUF9SeE1pc3MpID4+IDYpOworCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAocmVhZHJlZyhkZXYsIFBQX1R4Q29sKSA+PiA2KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlyZXR1cm4gJmxwLT5zdGF0czsKKwlyZXR1cm4gJmRldi0+c3RhdHM7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDQwNzk3ZmIuLmZmMmYxNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJaWYgKCFwaHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbWFjYl9uZXRkZXZfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjc29uaWMuYyBiL2RyaXZlcnMvbmV0L21hY3NvbmljLmMKaW5kZXggYWRiNTRmZS4uYzkzNjc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjc29uaWMuYworKysgYi9kcml2ZXJzL25ldC9tYWNzb25pYy5jCkBAIC0xNDAsMjEgKzE0MCw0MCBAQAogCiBzdGF0aWMgaW50IG1hY3NvbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKIHsKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNvbmljX2ludGVycnVwdCwgSVJRX0ZMR19GQVNULCAic29uaWMiLCBkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7Ci0JCXJldHVybiAtRUFHQUlOOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc29uaWNfaW50ZXJydXB0LCBJUlFfRkxHX0ZBU1QsCisJCQkJInNvbmljIiwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJZ290byBlcnI7CiAJfQogCS8qIFVuZGVyIHRoZSBBL1VYIGludGVycnVwdCBzY2hlbWUsIHRoZSBvbmJvYXJkIFNPTklDIGludGVycnVwdCBjb21lcwogCSAqIGluIGF0IHByaW9yaXR5IGxldmVsIDMuIEhvd2V2ZXIsIHdlIHNvbWV0aW1lcyBnZXQgdGhlIGxldmVsIDIgaW50ZXItCiAJICogcnVwdCBhcyB3ZWxsLCB3aGljaCBtdXN0IHByZXZlbnQgcmUtZW50cmFuY2Ugb2YgdGhlIHNvbmljIGhhbmRsZXIuCiAJICovCi0JaWYgKGRldi0+aXJxID09IElSUV9BVVRPXzMpCi0JCWlmIChyZXF1ZXN0X2lycShJUlFfTlVCVVNfOSwgbWFjc29uaWNfaW50ZXJydXB0LCBJUlFfRkxHX0ZBU1QsICJzb25pYyIsIGRldikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5uYW1lLCBJUlFfTlVCVVNfOSk7Ci0JCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQkJCXJldHVybiAtRUFHQUlOOworCWlmIChkZXYtPmlycSA9PSBJUlFfQVVUT18zKSB7CisJCXJldHZhbCA9IHJlcXVlc3RfaXJxKElSUV9OVUJVU185LCBtYWNzb25pY19pbnRlcnJ1cHQsCisJCQkJCUlSUV9GTEdfRkFTVCwgInNvbmljIiwgZGV2KTsKKwkJaWYgKHJldHZhbCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLAorCQkJCQlkZXYtPm5hbWUsIElSUV9OVUJVU185KTsKKwkJCWdvdG8gZXJyX2lycTsKIAkJfQotCXJldHVybiBzb25pY19vcGVuKGRldik7CisJfQorCXJldHZhbCA9IHNvbmljX29wZW4oZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9pcnFfbnVidXM7CisJcmV0dXJuIDA7CisKK2Vycl9pcnFfbnVidXM6CisJaWYgKGRldi0+aXJxID09IElSUV9BVVRPXzMpCisJCWZyZWVfaXJxKElSUV9OVUJVU185LCBkZXYpOworZXJyX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IG1hY3NvbmljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggODdlOGQ0Yy4uMGVmMGViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtMzcsOCArMzcsMTQgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwogCXN0cnVjdCBobGlzdF9oZWFkCXZsYW5faGFzaFtNQUNWTEFOX0hBU0hfU0laRV07CiAJc3RydWN0IGxpc3RfaGVhZAl2bGFuczsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIH07CiAKKyNkZWZpbmUgbWFjdmxhbl9wb3J0X2dldF9yY3UoZGV2KSBcCisJKChzdHJ1Y3QgbWFjdmxhbl9wb3J0ICopIHJjdV9kZXJlZmVyZW5jZShkZXYtPnJ4X2hhbmRsZXJfZGF0YSkpCisjZGVmaW5lIG1hY3ZsYW5fcG9ydF9nZXQoZGV2KSAoKHN0cnVjdCBtYWN2bGFuX3BvcnQgKikgZGV2LT5yeF9oYW5kbGVyX2RhdGEpCisjZGVmaW5lIG1hY3ZsYW5fcG9ydF9leGlzdHMoZGV2KSAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX01BQ1ZMQU5fUE9SVCkKKwogc3RhdGljIHN0cnVjdCBtYWN2bGFuX2RldiAqbWFjdmxhbl9oYXNoX2xvb2t1cChjb25zdCBzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwb3J0LAogCQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKQEAgLTE0NSwxNSArMTUxLDE3IEBACiB9CiAKIC8qIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrKCkgZnJvbSBuZXRpZl9yZWNlaXZlX3NrYiAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICptYWN2bGFuX2hhbmRsZV9mcmFtZShzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwb3J0LAotCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbWFjdmxhbl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwb3J0OwogCWNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aCA9IGV0aF9oZHIoc2tiKTsKIAljb25zdCBzdHJ1Y3QgbWFjdmxhbl9kZXYgKnZsYW47CiAJY29uc3Qgc3RydWN0IG1hY3ZsYW5fZGV2ICpzcmM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCWludCByZXQgPSBORVRfUlhfRFJPUDsKIAorCXBvcnQgPSBtYWN2bGFuX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0KSkgewogCQlzcmMgPSBtYWN2bGFuX2hhc2hfbG9va3VwKHBvcnQsIGV0aC0+aF9zb3VyY2UpOwogCQlpZiAoIXNyYykKQEAgLTE4OCwxNCArMTk2LDE2IEBACiAJfQogCWxlbiA9IHNrYi0+bGVuICsgRVRIX0hMRU47CiAJc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7Ci0JbWFjdmxhbl9jb3VudF9yeCh2bGFuLCBsZW4sIHNrYiAhPSBOVUxMLCAwKTsKIAlpZiAoIXNrYikKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0OwogCiAJc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCi0Jdmxhbi0+cmVjZWl2ZShza2IpOworCXJldCA9IHZsYW4tPnJlY2VpdmUoc2tiKTsKKworb3V0OgorCW1hY3ZsYW5fY291bnRfcngodmxhbiwgbGVuLCByZXQgPT0gTkVUX1JYX1NVQ0NFU1MsIDApOwogCXJldHVybiBOVUxMOwogfQogCkBAIC00MjQsMjkgKzQzNCwzOCBAQAogCWZyZWVfcGVyY3B1KHZsYW4tPnJ4X3N0YXRzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWN2bGFuX2Rldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm1hY3ZsYW5fZGV2X2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWRldl90eHFfc3RhdHNfZm9sZChkZXYsIHN0YXRzKTsKIAogCWlmICh2bGFuLT5yeF9zdGF0cykgewotCQlzdHJ1Y3QgbWFjdmxhbl9yeF9zdGF0cyAqcCwgcnggPSB7MH07CisJCXN0cnVjdCBtYWN2bGFuX3J4X3N0YXRzICpwLCBhY2N1bSA9IHswfTsKKwkJdTY0IHJ4X3BhY2tldHMsIHJ4X2J5dGVzLCByeF9tdWx0aWNhc3Q7CisJCXVuc2lnbmVkIGludCBzdGFydDsKIAkJaW50IGk7CiAKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJCXAgPSBwZXJfY3B1X3B0cih2bGFuLT5yeF9zdGF0cywgaSk7Ci0JCQlyeC5yeF9wYWNrZXRzICs9IHAtPnJ4X3BhY2tldHM7Ci0JCQlyeC5yeF9ieXRlcyAgICs9IHAtPnJ4X2J5dGVzOwotCQkJcngucnhfZXJyb3JzICArPSBwLT5yeF9lcnJvcnM7Ci0JCQlyeC5tdWx0aWNhc3QgICs9IHAtPm11bHRpY2FzdDsKKwkJCWRvIHsKKwkJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9iaCgmcC0+c3luY3ApOworCQkJCXJ4X3BhY2tldHMJPSBwLT5yeF9wYWNrZXRzOworCQkJCXJ4X2J5dGVzCT0gcC0+cnhfYnl0ZXM7CisJCQkJcnhfbXVsdGljYXN0CT0gcC0+cnhfbXVsdGljYXN0OworCQkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2JoKCZwLT5zeW5jcCwgc3RhcnQpKTsKKwkJCWFjY3VtLnJ4X3BhY2tldHMJKz0gcnhfcGFja2V0czsKKwkJCWFjY3VtLnJ4X2J5dGVzCQkrPSByeF9ieXRlczsKKwkJCWFjY3VtLnJ4X211bHRpY2FzdAkrPSByeF9tdWx0aWNhc3Q7CisJCQkvKiByeF9lcnJvcnMgaXMgYW4gdWxvbmcsIHVwZGF0ZWQgd2l0aG91dCBzeW5jcCBwcm90ZWN0aW9uICovCisJCQlhY2N1bS5yeF9lcnJvcnMJCSs9IHAtPnJ4X2Vycm9yczsKIAkJfQotCQlzdGF0cy0+cnhfcGFja2V0cyA9IHJ4LnJ4X3BhY2tldHM7Ci0JCXN0YXRzLT5yeF9ieXRlcyAgID0gcngucnhfYnl0ZXM7Ci0JCXN0YXRzLT5yeF9lcnJvcnMgID0gcngucnhfZXJyb3JzOwotCQlzdGF0cy0+cnhfZHJvcHBlZCA9IHJ4LnJ4X2Vycm9yczsKLQkJc3RhdHMtPm11bHRpY2FzdCAgPSByeC5tdWx0aWNhc3Q7CisJCXN0YXRzLT5yeF9wYWNrZXRzID0gYWNjdW0ucnhfcGFja2V0czsKKwkJc3RhdHMtPnJ4X2J5dGVzICAgPSBhY2N1bS5yeF9ieXRlczsKKwkJc3RhdHMtPnJ4X2Vycm9ycyAgPSBhY2N1bS5yeF9lcnJvcnM7CisJCXN0YXRzLT5yeF9kcm9wcGVkID0gYWNjdW0ucnhfZXJyb3JzOworCQlzdGF0cy0+bXVsdGljYXN0ICA9IGFjY3VtLnJ4X211bHRpY2FzdDsKIAl9CiAJcmV0dXJuIHN0YXRzOwogfQpAQCAtNDk1LDExICs1MTQsMTEgQEAKIAkubmRvX2NoYW5nZV9yeF9mbGFncwk9IG1hY3ZsYW5fY2hhbmdlX3J4X2ZsYWdzLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbWFjdmxhbl9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBtYWN2bGFuX3NldF9tdWx0aWNhc3RfbGlzdCwKLQkubmRvX2dldF9zdGF0cwkJPSBtYWN2bGFuX2Rldl9nZXRfc3RhdHMsCisJLm5kb19nZXRfc3RhdHM2NAk9IG1hY3ZsYW5fZGV2X2dldF9zdGF0czY0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogfTsKIAotc3RhdGljIHZvaWQgbWFjdmxhbl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBtYWN2bGFuX2NvbW1vbl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWV0aGVyX3NldHVwKGRldik7CiAKQEAgLTUwOCw2ICs1MjcsMTIgQEAKIAlkZXYtPmRlc3RydWN0b3IJCT0gZnJlZV9uZXRkZXY7CiAJZGV2LT5oZWFkZXJfb3BzCQk9ICZtYWN2bGFuX2hhcmRfaGVhZGVyX29wcywKIAlkZXYtPmV0aHRvb2xfb3BzCT0gJm1hY3ZsYW5fZXRodG9vbF9vcHM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYWN2bGFuX2NvbW1vbl9zZXR1cCk7CisKK3N0YXRpYyB2b2lkIG1hY3ZsYW5fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltYWN2bGFuX2NvbW1vbl9zZXR1cChkZXYpOwogCWRldi0+dHhfcXVldWVfbGVuCT0gMDsKIH0KIApAQCAtNTE1LDYgKzU0MCw3IEBACiB7CiAJc3RydWN0IG1hY3ZsYW5fcG9ydCAqcG9ydDsKIAl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOwogCiAJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIgfHwgZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MjcsMTcgKzU1MywzMCBAQAogCUlOSVRfTElTVF9IRUFEKCZwb3J0LT52bGFucyk7CiAJZm9yIChpID0gMDsgaSA8IE1BQ1ZMQU5fSEFTSF9TSVpFOyBpKyspCiAJCUlOSVRfSExJU1RfSEVBRCgmcG9ydC0+dmxhbl9oYXNoW2ldKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT5tYWN2bGFuX3BvcnQsIHBvcnQpOwotCXJldHVybiAwOworCisJZXJyID0gbmV0ZGV2X3J4X2hhbmRsZXJfcmVnaXN0ZXIoZGV2LCBtYWN2bGFuX2hhbmRsZV9mcmFtZSwgcG9ydCk7CisJaWYgKGVycikKKwkJa2ZyZWUocG9ydCk7CisKKwlkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX01BQ1ZMQU5fUE9SVDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBtYWN2bGFuX3BvcnRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBtYWN2bGFuX3BvcnQgKnBvcnQ7CisKKwlwb3J0ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYWN2bGFuX3BvcnQsIHJjdSk7CisJa2ZyZWUocG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hY3ZsYW5fcG9ydF9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1hY3ZsYW5fcG9ydCAqcG9ydCA9IGRldi0+bWFjdmxhbl9wb3J0OworCXN0cnVjdCBtYWN2bGFuX3BvcnQgKnBvcnQgPSBtYWN2bGFuX3BvcnRfZ2V0KGRldik7CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT5tYWN2bGFuX3BvcnQsIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotCWtmcmVlKHBvcnQpOworCWRldi0+cHJpdl9mbGFncyAmPSB+SUZGX01BQ1ZMQU5fUE9SVDsKKwluZXRkZXZfcnhfaGFuZGxlcl91bnJlZ2lzdGVyKGRldik7CisJY2FsbF9yY3UoJnBvcnQtPnJjdSwgbWFjdmxhbl9wb3J0X3JjdV9mcmVlKTsKIH0KIAogc3RhdGljIGludCBtYWN2bGFuX3ZhbGlkYXRlKHN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKQEAgLTYxNSwxMiArNjU0LDEyIEBACiAJaWYgKCF0YltJRkxBX0FERFJFU1NdKQogCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKIAotCWlmIChsb3dlcmRldi0+bWFjdmxhbl9wb3J0ID09IE5VTEwpIHsKKwlpZiAoIW1hY3ZsYW5fcG9ydF9leGlzdHMobG93ZXJkZXYpKSB7CiAJCWVyciA9IG1hY3ZsYW5fcG9ydF9jcmVhdGUobG93ZXJkZXYpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCXBvcnQgPSBsb3dlcmRldi0+bWFjdmxhbl9wb3J0OworCXBvcnQgPSBtYWN2bGFuX3BvcnRfZ2V0KGxvd2VyZGV2KTsKIAogCXZsYW4tPmxvd2VyZGV2ID0gbG93ZXJkZXY7CiAJdmxhbi0+ZGV2ICAgICAgPSBkZXY7CkBAIC03MDUsNyArNzQ0LDYgQEAKIAkvKiBjb21tb24gZmllbGRzICovCiAJb3BzLT5wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBtYWN2bGFuX2Rldik7CiAJb3BzLT5nZXRfdHhfcXVldWVzCT0gbWFjdmxhbl9nZXRfdHhfcXVldWVzOwotCW9wcy0+c2V0dXAJCT0gbWFjdmxhbl9zZXR1cDsKIAlvcHMtPnZhbGlkYXRlCQk9IG1hY3ZsYW5fdmFsaWRhdGU7CiAJb3BzLT5tYXh0eXBlCQk9IElGTEFfTUFDVkxBTl9NQVg7CiAJb3BzLT5wb2xpY3kJCT0gbWFjdmxhbl9wb2xpY3k7CkBAIC03MTksNiArNzU3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfb3BzIG1hY3ZsYW5fbGlua19vcHMgPSB7CiAJLmtpbmQJCT0gIm1hY3ZsYW4iLAorCS5zZXR1cAkJPSBtYWN2bGFuX3NldHVwLAogCS5uZXdsaW5rCT0gbWFjdmxhbl9uZXdsaW5rLAogCS5kZWxsaW5rCT0gbWFjdmxhbl9kZWxsaW5rLAogfTsKQEAgLTczMCwxMCArNzY5LDExIEBACiAJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuLCAqbmV4dDsKIAlzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwb3J0OwogCi0JcG9ydCA9IGRldi0+bWFjdmxhbl9wb3J0OwotCWlmIChwb3J0ID09IE5VTEwpCisJaWYgKCFtYWN2bGFuX3BvcnRfZXhpc3RzKGRldikpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAorCXBvcnQgPSBtYWN2bGFuX3BvcnRfZ2V0KGRldik7CisKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBORVRERVZfQ0hBTkdFOgogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZwb3J0LT52bGFucywgbGlzdCkKQEAgLTc2NywxNCArODA3LDEyIEBACiAJaW50IGVycjsKIAogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWFjdmxhbl9ub3RpZmllcl9ibG9jayk7Ci0JbWFjdmxhbl9oYW5kbGVfZnJhbWVfaG9vayA9IG1hY3ZsYW5faGFuZGxlX2ZyYW1lOwogCiAJZXJyID0gbWFjdmxhbl9saW5rX3JlZ2lzdGVyKCZtYWN2bGFuX2xpbmtfb3BzKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnIxOwogCXJldHVybiAwOwogZXJyMToKLQltYWN2bGFuX2hhbmRsZV9mcmFtZV9ob29rID0gTlVMTDsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWFjdmxhbl9ub3RpZmllcl9ibG9jayk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTc4Miw3ICs4MjAsNiBAQAogc3RhdGljIHZvaWQgX19leGl0IG1hY3ZsYW5fY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlydG5sX2xpbmtfdW5yZWdpc3RlcigmbWFjdmxhbl9saW5rX29wcyk7Ci0JbWFjdmxhbl9oYW5kbGVfZnJhbWVfaG9vayA9IE5VTEw7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm1hY3ZsYW5fbm90aWZpZXJfYmxvY2spOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2dGFwLmMgYi9kcml2ZXJzL25ldC9tYWN2dGFwLmMKaW5kZXggYThhOTRlMi4uM2IxYzU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdnRhcC5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3Z0YXAuYwpAQCAtNTgsNyArNTgsNyBAQAogICogb25seSBoYXMgb25lIHRhcCwgdGhlIGludGVyZmFjZSBudW1iZXJzIGFzc3VyZSB0aGF0IHRoZQogICogZGV2aWNlIG5vZGVzIGFyZSB1bmlxdWUuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWFjdnRhcF9tYWpvcjsKK3N0YXRpYyBkZXZfdCBtYWN2dGFwX21ham9yOwogI2RlZmluZSBNQUNWVEFQX05VTV9ERVZTIDY1NTM2CiBzdGF0aWMgc3RydWN0IGNsYXNzICptYWN2dGFwX2NsYXNzOwogc3RhdGljIHN0cnVjdCBjZGV2IG1hY3Z0YXBfY2RldjsKQEAgLTE4MCwxMSArMTgwLDE4IEBACiB7CiAJc3RydWN0IG1hY3Z0YXBfcXVldWUgKnEgPSBtYWN2dGFwX2dldF9xdWV1ZShkZXYsIHNrYik7CiAJaWYgKCFxKQotCQlyZXR1cm4gLUVOT0xJTks7CisJCWdvdG8gZHJvcDsKKworCWlmIChza2JfcXVldWVfbGVuKCZxLT5zay5za19yZWNlaXZlX3F1ZXVlKSA+PSBkZXYtPnR4X3F1ZXVlX2xlbikKKwkJZ290byBkcm9wOwogCiAJc2tiX3F1ZXVlX3RhaWwoJnEtPnNrLnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoc2tfc2xlZXAoJnEtPnNrKSwgUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExSREJBTkQpOwotCXJldHVybiAwOworCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7CiB9CiAKIC8qCkBAIC0yMzUsOCArMjQyLDE1IEBACiAJbWFjdmxhbl9kZWxsaW5rKGRldiwgaGVhZCk7CiB9CiAKK3N0YXRpYyB2b2lkIG1hY3Z0YXBfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltYWN2bGFuX2NvbW1vbl9zZXR1cChkZXYpOworCWRldi0+dHhfcXVldWVfbGVuID0gVFVOX1JFQURRX1NJWkU7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyBtYWN2dGFwX2xpbmtfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmtpbmQJCT0gIm1hY3Z0YXAiLAorCS5zZXR1cAkJPSBtYWN2dGFwX3NldHVwLAogCS5uZXdsaW5rCT0gbWFjdnRhcF9uZXdsaW5rLAogCS5kZWxsaW5rCT0gbWFjdnRhcF9kZWxsaW5rLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvY2F0YXMuYyBiL2RyaXZlcnMvbmV0L21seDQvY2F0YXMuYwppbmRleCBmNTk5Mjk0Li42OGFhYTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2NhdGFzLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9jYXRhcy5jCkBAIC0xMDEsOCArMTAxLDggQEAKIAkJcmV0ID0gbWx4NF9yZXN0YXJ0X29uZShwcml2LT5kZXYucGRldik7CiAJCS8qICdwcml2JyBub3cgaXMgbm90IHZhbGlkICovCiAJCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9FUlIgIm1seDQgJXM6IFJlc2V0IGZhaWxlZCAoJWQpXG4iLAotCQkJCXBjaV9uYW1lKHBkZXYpLCByZXQpOworCQkJcHJfZXJyKCJtbHg0ICVzOiBSZXNldCBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcmV0KTsKIAkJZWxzZSB7CiAJCQlkZXYgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCQkJbWx4NF9kYmcoZGV2LCAiUmVzZXQgc3VjY2VlZGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9ldGh0b29sLmMKaW5kZXggZDVhZmQwMy4uYjI3NTIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lbl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9ldGh0b29sLmMKQEAgLTM4Nyw2ICszODcsNDIgQEAKIAlwYXJhbS0+dHhfcGVuZGluZyA9IG1kZXYtPnByb2ZpbGUucHJvZltwcml2LT5wb3J0XS50eF9yaW5nX3NpemU7CiB9CiAKK3N0YXRpYyBpbnQgbWx4NF9ldGh0b29sX29wX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OworCWludCByYyA9IDA7CisJaW50IGNoYW5nZWQgPSAwOworCisJaWYgKGRhdGEgJiB+RVRIX0ZMQUdfTFJPKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoZGF0YSAmIEVUSF9GTEFHX0xSTykgeworCQlpZiAobWRldi0+cHJvZmlsZS5udW1fbHJvID09IDApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWlmICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykpCisJCQljaGFuZ2VkID0gMTsKKwl9IGVsc2UgaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgeworCQljaGFuZ2VkID0gMTsKKwl9CisKKwlpZiAoY2hhbmdlZCkgeworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQltdXRleF9sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKKwkJCW1seDRfZW5fc3RvcF9wb3J0KGRldik7CisJCX0KKwkJZGV2LT5mZWF0dXJlcyBePSBORVRJRl9GX0xSTzsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJcmMgPSBtbHg0X2VuX3N0YXJ0X3BvcnQoZGV2KTsKKwkJCWlmIChyYykKKwkJCQllbl9lcnIocHJpdiwgIkZhaWxlZCB0byByZXN0YXJ0IHBvcnRcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKwogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG1seDRfZW5fZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvID0gbWx4NF9lbl9nZXRfZHJ2aW5mbywKIAkuZ2V0X3NldHRpbmdzID0gbWx4NF9lbl9nZXRfc2V0dGluZ3MsCkBAIC00MTUsNyArNDUxLDcgQEAKIAkuZ2V0X3JpbmdwYXJhbSA9IG1seDRfZW5fZ2V0X3JpbmdwYXJhbSwKIAkuc2V0X3JpbmdwYXJhbSA9IG1seDRfZW5fc2V0X3JpbmdwYXJhbSwKIAkuZ2V0X2ZsYWdzID0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncyA9IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzLAorCS5zZXRfZmxhZ3MgPSBtbHg0X2V0aHRvb2xfb3Bfc2V0X2ZsYWdzLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX21haW4uYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fbWFpbi5jCmluZGV4IGNiYWJmMTQuLjk3OTM0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fbWFpbi5jCkBAIC03OSw2ICs3OSwyOSBAQAogTUxYNF9FTl9QQVJNX0lOVChwZmNyeCwgMCwgIlByaW9yaXR5IGJhc2VkIEZsb3cgQ29udHJvbCBwb2xpY3kgb24gUlhbNzowXS4iCiAJCQkgICAiIFBlciBwcmlvcml0eSBiaXQgbWFzayIpOwogCitpbnQgZW5fcHJpbnQoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYsCisJICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJaW50IGk7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCisJdmFmLmZtdCA9IGZvcm1hdDsKKwl2YWYudmEgPSAmYXJnczsKKwlpZiAocHJpdi0+cmVnaXN0ZXJlZCkKKwkJaSA9IHByaW50aygiJXMlczogJXM6ICVwViIsCisJCQkgICBsZXZlbCwgRFJWX05BTUUsIHByaXYtPmRldi0+bmFtZSwgJnZhZik7CisJZWxzZQorCQlpID0gcHJpbnRrKCIlcyVzOiAlczogUG9ydCAlZDogJXBWIiwKKwkJCSAgIGxldmVsLCBEUlZfTkFNRSwgZGV2X25hbWUoJnByaXYtPm1kZXYtPnBkZXYtPmRldiksCisJCQkgICBwcml2LT5wb3J0LCAmdmFmKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gaTsKK30KKwogc3RhdGljIGludCBtbHg0X2VuX2dldF9wcm9maWxlKHN0cnVjdCBtbHg0X2VuX2RldiAqbWRldikKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcm9maWxlICpwYXJhbXMgPSAmbWRldi0+cHJvZmlsZTsKQEAgLTE1MiwxNSArMTc1LDExIEBACiAKIHN0YXRpYyB2b2lkICptbHg0X2VuX2FkZChzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKLQlzdGF0aWMgaW50IG1seDRfZW5fdmVyc2lvbl9wcmludGVkOwogCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldjsKIAlpbnQgaTsKIAlpbnQgZXJyOwogCi0JaWYgKCFtbHg0X2VuX3ZlcnNpb25fcHJpbnRlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIG1seDRfZW5fdmVyc2lvbik7Ci0JCW1seDRfZW5fdmVyc2lvbl9wcmludGVkKys7Ci0JfQorCXByaW50a19vbmNlKEtFUk5fSU5GTyAiJXMiLCBtbHg0X2VuX3ZlcnNpb24pOwogCiAJbWRldiA9IGt6YWxsb2Moc2l6ZW9mICptZGV2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1kZXYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9tbHg0L2VuX25ldGRldi5jCmluZGV4IDk2MTgwYzAuLmEwZDhhMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9uZXRkZXYuYwpAQCAtOTYxLDYgKzk2MSw3IEBACiAJfQogCiAJU0VUX05FVERFVl9ERVYoZGV2LCAmbWRldi0+ZGV2LT5wZGV2LT5kZXYpOworCWRldi0+ZGV2X2lkID0gIHBvcnQgLSAxOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIGRyaXZlciBwcml2YXRlIGRhdGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZXEuYyBiL2RyaXZlcnMvbmV0L21seDQvZXEuYwppbmRleCA0MjMwNTM0Li42ZDdiMmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VxLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lcS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAkJdTMyCQlyYXdbNl07CiAJCXN0cnVjdCB7CiAJCQlfX2JlMzIJY3FuOwotCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNvbXA7CisJCX0gX19wYWNrZWQgY29tcDsKIAkJc3RydWN0IHsKIAkJCXUxNglyZXNlcnZlZDE7CiAJCQlfX2JlMTYJdG9rZW47CkBAIC0xMTgsMjcgKzExOCwyNyBAQAogCQkJdTgJcmVzZXJ2ZWQzWzNdOwogCQkJdTgJc3RhdHVzOwogCQkJX19iZTY0CW91dF9wYXJhbTsKLQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBjbWQ7CisJCX0gX19wYWNrZWQgY21kOwogCQlzdHJ1Y3QgewogCQkJX19iZTMyCXFwbjsKLQkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBxcDsKKwkJfSBfX3BhY2tlZCBxcDsKIAkJc3RydWN0IHsKIAkJCV9fYmUzMglzcnFuOwotCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNycTsKKwkJfSBfX3BhY2tlZCBzcnE7CiAJCXN0cnVjdCB7CiAJCQlfX2JlMzIJY3FuOwogCQkJdTMyCXJlc2VydmVkMTsKIAkJCXU4CXJlc2VydmVkMlszXTsKIAkJCXU4CXN5bmRyb21lOwotCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNxX2VycjsKKwkJfSBfX3BhY2tlZCBjcV9lcnI7CiAJCXN0cnVjdCB7CiAJCQl1MzIJcmVzZXJ2ZWQxWzJdOwogCQkJX19iZTMyCXBvcnQ7Ci0JCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcG9ydF9jaGFuZ2U7CisJCX0gX19wYWNrZWQgcG9ydF9jaGFuZ2U7CiAJfQkJCWV2ZW50OwogCXU4CQkJcmVzZXJ2ZWQzWzNdOwogCXU4CQkJb3duZXI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIHZvaWQgZXFfc2V0X2NpKHN0cnVjdCBtbHg0X2VxICplcSwgaW50IHJlcV9ub3QpCiB7CkBAIC00NzUsMTAgKzQ3NSwxMCBAQAogCQltbHg0X2RiZyhkZXYsICJEdW1waW5nIEVRIGNvbnRleHQgJTAyeDpcbiIsIGVxLT5lcW4pOwogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgbWx4NF9lcV9jb250ZXh0KSAvIDQ7ICsraSkgewogCQkJaWYgKGkgJSA0ID09IDApCi0JCQkJcHJpbnRrKCJbJTAyeF0gIiwgaSAqIDQpOwotCQkJcHJpbnRrKCIgJTA4eCIsIGJlMzJfdG9fY3B1cChtYWlsYm94LT5idWYgKyBpICogNCkpOworCQkJCXByX2NvbnQoIlslMDJ4XSAiLCBpICogNCk7CisJCQlwcl9jb250KCIgJTA4eCIsIGJlMzJfdG9fY3B1cChtYWlsYm94LT5idWYgKyBpICogNCkpOwogCQkJaWYgKChpICsgMSkgJSA0ID09IDApCi0JCQkJcHJpbnRrKCJcbiIpOworCQkJCXByX2NvbnQoIlxuIik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbWFpbi5jIGIvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMKaW5kZXggZTNlMGQ1NC4uNTEwMmFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMKQEAgLTEwNTAsOCArMTA1MCw3IEBACiAJaW50IGVycjsKIAlpbnQgcG9ydDsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJJbml0aWFsaXppbmcgJXNcbiIsCi0JICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwlwcl9pbmZvKERSVl9OQU1FICI6IEluaXRpYWxpemluZyAlc1xuIiwgcGNpX25hbWUocGRldikpOwogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGVycikgewpAQCAtMTIxNiwxMiArMTIxNSw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtbHg0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgaW50IG1seDRfdmVyc2lvbl9wcmludGVkOwotCi0JaWYgKCFtbHg0X3ZlcnNpb25fcHJpbnRlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIG1seDRfdmVyc2lvbik7Ci0JCSsrbWx4NF92ZXJzaW9uX3ByaW50ZWQ7Ci0JfQorCXByaW50a19vbmNlKEtFUk5fSU5GTyAiJXMiLCBtbHg0X3ZlcnNpb24pOwogCiAJcmV0dXJuIF9fbWx4NF9pbml0X29uZShwZGV2LCBpZCk7CiB9CkBAIC0xMzAxLDE3ICsxMjk1LDE3IEBACiBzdGF0aWMgaW50IF9faW5pdCBtbHg0X3ZlcmlmeV9wYXJhbXModm9pZCkKIHsKIAlpZiAoKGxvZ19udW1fbWFjIDwgMCkgfHwgKGxvZ19udW1fbWFjID4gNykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWx4NF9jb3JlOiBiYWQgbnVtX21hYzogJWRcbiIsIGxvZ19udW1fbWFjKTsKKwkJcHJfd2FybmluZygibWx4NF9jb3JlOiBiYWQgbnVtX21hYzogJWRcbiIsIGxvZ19udW1fbWFjKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmICgobG9nX251bV92bGFuIDwgMCkgfHwgKGxvZ19udW1fdmxhbiA+IDcpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1seDRfY29yZTogYmFkIG51bV92bGFuOiAlZFxuIiwgbG9nX251bV92bGFuKTsKKwkJcHJfd2FybmluZygibWx4NF9jb3JlOiBiYWQgbnVtX3ZsYW46ICVkXG4iLCBsb2dfbnVtX3ZsYW4pOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKChsb2dfbXR0c19wZXJfc2VnIDwgMSkgfHwgKGxvZ19tdHRzX3Blcl9zZWcgPiA1KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtbHg0X2NvcmU6IGJhZCBsb2dfbXR0c19wZXJfc2VnOiAlZFxuIiwgbG9nX210dHNfcGVyX3NlZyk7CisJCXByX3dhcm5pbmcoIm1seDRfY29yZTogYmFkIGxvZ19tdHRzX3Blcl9zZWc6ICVkXG4iLCBsb2dfbXR0c19wZXJfc2VnKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0LmggYi9kcml2ZXJzL25ldC9tbHg0L21seDQuaAppbmRleCAxMzM0M2U4Li4wZGE1YmI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0LmgKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tbHg0LmgKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2Rvb3JiZWxsLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJIm1seDRfY29yZSIKLSNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjAxIgogI2RlZmluZSBEUlZfUkVMREFURQkiTWF5IDEsIDIwMDciCiAKQEAgLTg4LDE3ICs4NywxNyBAQAogI2VuZGlmIC8qIENPTkZJR19NTFg0X0RFQlVHICovCiAKICNkZWZpbmUgbWx4NF9kYmcobWRldiwgZm9ybWF0LCBhcmcuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAobWx4NF9kZWJ1Z19sZXZlbCkJCQkJCVwKLQkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJm1kZXYtPnBkZXYtPmRldiwgZm9ybWF0LCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKK2RvIHsJCQkJCQkJCQlcCisJaWYgKG1seDRfZGVidWdfbGV2ZWwpCQkJCQkJXAorCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNhcmcpOyBcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIG1seDRfZXJyKG1kZXYsIGZvcm1hdCwgYXJnLi4uKSBcCi0JZGV2X2VycigmbWRldi0+cGRldi0+ZGV2LCBmb3JtYXQsICMjIGFyZykKKwlkZXZfZXJyKCZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNhcmcpCiAjZGVmaW5lIG1seDRfaW5mbyhtZGV2LCBmb3JtYXQsIGFyZy4uLikgXAotCWRldl9pbmZvKCZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyMgYXJnKQorCWRldl9pbmZvKCZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNhcmcpCiAjZGVmaW5lIG1seDRfd2FybihtZGV2LCBmb3JtYXQsIGFyZy4uLikgXAotCWRldl93YXJuKCZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyMgYXJnKQorCWRldl93YXJuKCZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNhcmcpCiAKIHN0cnVjdCBtbHg0X2JpdG1hcCB7CiAJdTMyCQkJbGFzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oIGIvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmgKaW5kZXggYjU1ZTQ2Yy4uNDQ5MjEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmgKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmgKQEAgLTUyLDQwICs1Miw4IEBACiAjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjQuMS4xIgogI2RlZmluZSBEUlZfUkVMREFURQkiSnVuZSAyMDA5IgogCi0KICNkZWZpbmUgTUxYNF9FTl9NU0dfTEVWRUwJKE5FVElGX01TR19MSU5LIHwgTkVUSUZfTVNHX0lGRE9XTikKIAotI2RlZmluZSBlbl9wcmludChsZXZlbCwgcHJpdiwgZm9ybWF0LCBhcmcuLi4pCQkJXAotCXsJCQkJCQkJXAotCWlmICgocHJpdiktPnJlZ2lzdGVyZWQpCQkJCQlcCi0JCXByaW50ayhsZXZlbCAiJXM6ICVzOiAiIGZvcm1hdCwgRFJWX05BTUUsCVwKLQkJCShwcml2LT5kZXYpLT5uYW1lLCAjIyBhcmcpOwkJXAotCWVsc2UJCQkJCQkJXAotCQlwcmludGsobGV2ZWwgIiVzOiAlczogUG9ydCAlZDogIiBmb3JtYXQsCVwKLQkJCURSVl9OQU1FLCBkZXZfbmFtZSgmcHJpdi0+bWRldi0+cGRldi0+ZGV2KSwgXAotCQkJKHByaXYpLT5wb3J0LCAjIyBhcmcpOwkJCVwKLQl9Ci0KLSNkZWZpbmUgZW5fZGJnKG1sZXZlbCwgcHJpdiwgZm9ybWF0LCBhcmcuLi4pCQkJXAotCXsJCQkJCQkJXAotCWlmIChORVRJRl9NU0dfIyNtbGV2ZWwgJiBwcml2LT5tc2dfZW5hYmxlKQkJXAotCQllbl9wcmludChLRVJOX0RFQlVHLCBwcml2LCBmb3JtYXQsICMjIGFyZykJXAotCX0KLSNkZWZpbmUgZW5fd2Fybihwcml2LCBmb3JtYXQsIGFyZy4uLikJCQkJXAotCWVuX3ByaW50KEtFUk5fV0FSTklORywgcHJpdiwgZm9ybWF0LCAjIyBhcmcpCi0jZGVmaW5lIGVuX2Vycihwcml2LCBmb3JtYXQsIGFyZy4uLikJCQkJXAotCWVuX3ByaW50KEtFUk5fRVJSLCBwcml2LCBmb3JtYXQsICMjIGFyZykKLQotI2RlZmluZSBtbHg0X2VycihtZGV2LCBmb3JtYXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0VSUiAiJXMgJXM6ICIgZm9ybWF0ICwgRFJWX05BTUUgLFwKLQkJZGV2X25hbWUoJm1kZXYtPnBkZXYtPmRldikgLCAjIyBhcmcpCi0jZGVmaW5lIG1seDRfaW5mbyhtZGV2LCBmb3JtYXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX0lORk8gIiVzICVzOiAiIGZvcm1hdCAsIERSVl9OQU1FICxcCi0JCWRldl9uYW1lKCZtZGV2LT5wZGV2LT5kZXYpICwgIyMgYXJnKQotI2RlZmluZSBtbHg0X3dhcm4obWRldiwgZm9ybWF0LCBhcmcuLi4pIFwKLQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlczogIiBmb3JtYXQgLCBEUlZfTkFNRSAsXAotCQlkZXZfbmFtZSgmbWRldi0+cGRldi0+ZGV2KSAsICMjIGFyZykKLQogLyoKICAqIERldmljZSBjb25zdGFudHMKICAqLwpAQCAtNTY4LDQgKzUzNiwzNCBAQAogICogR2xvYmFscwogICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG1seDRfZW5fZXRodG9vbF9vcHM7CisKKworCisvKgorICogcHJpbnRrIC8gbG9nZ2luZyBmdW5jdGlvbnMKKyAqLworCitpbnQgZW5fcHJpbnQoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYsCisJICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCisjZGVmaW5lIGVuX2RiZyhtbGV2ZWwsIHByaXYsIGZvcm1hdCwgYXJnLi4uKQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoTkVUSUZfTVNHXyMjbWxldmVsICYgcHJpdi0+bXNnX2VuYWJsZSkJCVwKKwkJZW5fcHJpbnQoS0VSTl9ERUJVRywgcHJpdiwgZm9ybWF0LCAjI2FyZyk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIGVuX3dhcm4ocHJpdiwgZm9ybWF0LCBhcmcuLi4pCQkJXAorCWVuX3ByaW50KEtFUk5fV0FSTklORywgcHJpdiwgZm9ybWF0LCAjI2FyZykKKyNkZWZpbmUgZW5fZXJyKHByaXYsIGZvcm1hdCwgYXJnLi4uKQkJCVwKKwllbl9wcmludChLRVJOX0VSUiwgcHJpdiwgZm9ybWF0LCAjI2FyZykKKworI2RlZmluZSBtbHg0X2VycihtZGV2LCBmb3JtYXQsIGFyZy4uLikJCQlcCisJcHJfZXJyKCIlcyAlczogIiBmb3JtYXQsIERSVl9OQU1FLAkJXAorCSAgICAgICBkZXZfbmFtZSgmbWRldi0+cGRldi0+ZGV2KSwgIyNhcmcpCisjZGVmaW5lIG1seDRfaW5mbyhtZGV2LCBmb3JtYXQsIGFyZy4uLikJCQlcCisJcHJfaW5mbygiJXMgJXM6ICIgZm9ybWF0LCBEUlZfTkFNRSwJCVwKKwkJZGV2X25hbWUoJm1kZXYtPnBkZXYtPmRldiksICMjYXJnKQorI2RlZmluZSBtbHg0X3dhcm4obWRldiwgZm9ybWF0LCBhcmcuLi4pCQkJXAorCXByX3dhcm5pbmcoIiVzICVzOiAiIGZvcm1hdCwgRFJWX05BTUUsCQlcCisJCSAgIGRldl9uYW1lKCZtZGV2LT5wZGV2LT5kZXYpLCAjI2FyZykKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L21yLmMgYi9kcml2ZXJzL25ldC9tbHg0L21yLmMKaW5kZXggM2RjNjliZS4uOWMxODhiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9tci5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvbXIuYwpAQCAtNTgsNyArNTgsNyBAQAogCV9fYmUzMiBtdHRfc3o7CiAJX19iZTMyIGVudGl0eV9zaXplOwogCV9fYmUzMiBmaXJzdF9ieXRlX29mZnNldDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1MWDRfTVBUX0ZMQUdfU1dfT1dOUwkgICAgKDB4ZlVMIDw8IDI4KQogI2RlZmluZSBNTFg0X01QVF9GTEFHX0ZSRUUJICAgICgweDNVTCA8PCAyOCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCmluZGV4IDczYmI4ZWE2Li4yZDQ4OGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTE2NDAsNiArMTY0MCwxMSBAQAogCX0KIH0KIAorc3RhdGljIGludCBtdjY0M3h4X2V0aF9zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKGRldiwgZGF0YSwgRVRIX0ZMQUdfTFJPKTsKK30KKwogc3RhdGljIGludCBtdjY0M3h4X2V0aF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKIHsKIAlpZiAoc3NldCA9PSBFVEhfU1NfU1RBVFMpCkBAIC0xNjY1LDcgKzE2NzAsNyBAQAogCS5nZXRfc3RyaW5ncwkJPSBtdjY0M3h4X2V0aF9nZXRfc3RyaW5ncywKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdjY0M3h4X2V0aF9nZXRfZXRodG9vbF9zdGF0cywKIAkuZ2V0X2ZsYWdzCQk9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzLAotCS5zZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9zZXRfZmxhZ3MsCisJLnNldF9mbGFncwkJPSBtdjY0M3h4X2V0aF9zZXRfZmxhZ3MsCiAJLmdldF9zc2V0X2NvdW50CQk9IG12NjQzeHhfZXRoX2dldF9zc2V0X2NvdW50LAogfTsKIApAQCAtMjQ1Niw3ICsyNDYxLDcgQEAKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKG1wLT5waHkgIT0gTlVMTCkKLQkJcmV0dXJuIHBoeV9taWlfaW9jdGwobXAtPnBoeSwgaWZfbWlpKGlmciksIGNtZCk7CisJCXJldHVybiBwaHlfbWlpX2lvY3RsKG1wLT5waHksIGlmciwgY21kKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTI2NzAsNyArMjY3NSw4IEBACiAJICogRGV0ZWN0IGhhcmR3YXJlIHBhcmFtZXRlcnMuCiAJICovCiAJbXNwLT50X2NsayA9IChwZCAhPSBOVUxMICYmIHBkLT50X2NsayAhPSAwKSA/IHBkLT50X2NsayA6IDEzMzAwMDAwMDsKLQltc3AtPnR4X2NzdW1fbGltaXQgPSBwZC0+dHhfY3N1bV9saW1pdCA/IHBkLT50eF9jc3VtX2xpbWl0IDogOSAqIDEwMjQ7CisJbXNwLT50eF9jc3VtX2xpbWl0ID0gKHBkICE9IE5VTEwgJiYgcGQtPnR4X2NzdW1fbGltaXQpID8KKwkJCQkJcGQtPnR4X2NzdW1fbGltaXQgOiA5ICogMTAyNDsKIAlpbmZlcl9od19wYXJhbXMobXNwKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1zcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBlMGI0N2NjLi5kNzcxZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTE3MzAsOCArMTczMCw3IEBACiAJaWYgKGNzdW1fZW5hYmxlZCkKIAkJbWdwLT5jc3VtX2ZsYWcgPSBNWEdFRldfRkxBR1NfQ0tTVU07CiAJZWxzZSB7Ci0JCXUzMiBmbGFncyA9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzKG5ldGRldik7Ci0JCWVyciA9IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKG5ldGRldiwgKGZsYWdzICYgfkVUSF9GTEFHX0xSTykpOworCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0xSTzsKIAkJbWdwLT5jc3VtX2ZsYWcgPSAwOwogCiAJfQpAQCAtMTkwMCw2ICsxODk5LDExIEBACiAJcmV0dXJuIG1ncC0+bXNnX2VuYWJsZTsKIH0KIAorc3RhdGljIGludCBteXJpMTBnZV9zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHZhbHVlKQoreworCXJldHVybiBldGh0b29sX29wX3NldF9mbGFncyhuZXRkZXYsIHZhbHVlLCBFVEhfRkxBR19MUk8pOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG15cmkxMGdlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBteXJpMTBnZV9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gbXlyaTEwZ2VfZ2V0X2RydmluZm8sCkBAIC0xOTIwLDcgKzE5MjQsNyBAQAogCS5zZXRfbXNnbGV2ZWwgPSBteXJpMTBnZV9zZXRfbXNnbGV2ZWwsCiAJLmdldF9tc2dsZXZlbCA9IG15cmkxMGdlX2dldF9tc2dsZXZlbCwKIAkuZ2V0X2ZsYWdzID0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncyA9IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzCisJLnNldF9mbGFncyA9IG15cmkxMGdlX3NldF9mbGFncwogfTsKIAogc3RhdGljIGludCBteXJpMTBnZV9hbGxvY2F0ZV9yaW5ncyhzdHJ1Y3QgbXlyaTEwZ2Vfc2xpY2Vfc3RhdGUgKnNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwppbmRleCAxYTU3YzNkLi4wNGU1NTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYworKysgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAogCW1wLT5kZXYgPSBkZXY7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7Ci0JZGV2LT5pcnEgPSBvcC0+aXJxc1swXTsKKwlkZXYtPmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCWRldi0+bmV0ZGV2X29wcyA9ICZteXJpX29wczsKIAogCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyIG5vdy4gKi8KQEAgLTExNzIsMTIgKzExNzIsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgbXlyaV9zYnVzX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZteXJpX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm15cmlfc2J1c19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXlyaV9zYnVzX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmbXlyaV9zYnVzX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm15cmlfc2J1c19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChteXJpX3NidXNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggMmExN2I1MC4uYTYwMzNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtNTQ4LDcgKzU0OCw2IEBACiAJZG1hX2FkZHJfdCB0eF9kbWFbVFhfUklOR19TSVpFXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCS8qIE1lZGlhIG1vbml0b3JpbmcgdGltZXIgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAkvKiBGcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIHNvbWUgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdCAqLwpAQCAtMTkwNiw3ICsxOTA1LDcgQEAKIAllbmFibGVfaXJxKGRldi0+aXJxKTsKIAogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBwcmV2ZW50IHR4IHRpbWVvdXQgKi8KLQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKQEAgLTIwMDksNyArMjAwOCw3IEBACiAJCQkJbnAtPnR4X2RtYVtpXSwgbnAtPnR4X3NrYnVmZltpXS0+bGVuLAogCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYihucC0+dHhfc2tidWZmW2ldKTsKLQkJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJfQogCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKIAl9CkBAIC0yMTE1LDcgKzIxMTQsNyBAQAogCQl3cml0ZWwoVHhPbiwgaW9hZGRyICsgQ2hpcENtZCk7CiAJfSBlbHNlIHsKIAkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKLQkJbnAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CiAKQEAgLTIxNDAsMjAgKzIxMzksMjAgQEAKIAkJCQkJZGV2LT5uYW1lLCBucC0+ZGlydHlfdHgsCiAJCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzKSk7CiAJCWlmIChucC0+dHhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyAmIGNwdV90b19sZTMyKERlc2NQa3RPSykpIHsKLQkJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gbnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBucC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOwogCQl9IGVsc2UgeyAvKiBWYXJpb3VzIFR4IGVycm9ycyAqLwogCQkJaW50IHR4X3N0YXR1cyA9CiAJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMpOwogCQkJaWYgKHR4X3N0YXR1cyAmIChEZXNjVHhBYm9ydHxEZXNjVHhFeGNDb2xsKSkKLQkJCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJCQlpZiAodHhfc3RhdHVzICYgRGVzY1R4RklGTykKLQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCQlpZiAodHhfc3RhdHVzICYgRGVzY1R4Q2FycmllcikKLQkJCQlucC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCQlpZiAodHhfc3RhdHVzICYgRGVzY1R4T09XQ29sKQotCQkJCW5wLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7Ci0JCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQl9CiAJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsbnAtPnR4X2RtYVtlbnRyeV0sCiAJCQkJCW5wLT50eF9za2J1ZmZbZW50cnldLT5sZW4sCkBAIC0yMzAxLDcgKzIzMDAsNyBAQAogCQkJCQkJImJ1ZmZlcnMsIGVudHJ5ICUjMDh4ICIKIAkJCQkJCSJzdGF0dXMgJSMwOHguXG4iLCBkZXYtPm5hbWUsCiAJCQkJCQlucC0+Y3VyX3J4LCBkZXNjX3N0YXR1cyk7Ci0JCQkJbnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAogCQkJCS8qIFRoZSBSWCBzdGF0ZSBtYWNoaW5lIGhhcyBwcm9iYWJseQogCQkJCSAqIGxvY2tlZCB1cCBiZW5lYXRoIHVzLiAgRm9sbG93IHRoZQpAQCAtMjMyMSwxNSArMjMyMCwxNSBAQAogCiAJCQl9IGVsc2UgewogCQkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlpZiAoZGVzY19zdGF0dXMgJiAoRGVzY1J4QWJvcnR8RGVzY1J4T3ZlcikpCi0JCQkJCW5wLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAJCQkJaWYgKGRlc2Nfc3RhdHVzICYgKERlc2NSeExvbmd8RGVzY1J4UnVudCkpCi0JCQkJCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJCWlmIChkZXNjX3N0YXR1cyAmIChEZXNjUnhJbnZhbGlkfERlc2NSeEFsaWduKSkKLQkJCQkJbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCWlmIChkZXNjX3N0YXR1cyAmIERlc2NSeENSQykKLQkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQl9CiAJCX0gZWxzZSBpZiAocGt0X2xlbiA+IG5wLT5yeF9idWZfc3opIHsKIAkJCS8qIGlmIHRoaXMgaXMgdGhlIHRhaWwgb2YgYSBkb3VibGUgYnVmZmVyCkBAIC0yMzY0LDggKzIzNjMsOCBAQAogCQkJfQogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JCQlucC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJbnAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKIAkJfQogCQllbnRyeSA9ICgrK25wLT5jdXJfcngpICUgUlhfUklOR19TSVpFOwogCQlucC0+cnhfaGVhZF9kZXNjID0gJm5wLT5yeF9yaW5nW2VudHJ5XTsKQEAgLTI0MjgsMTcgKzI0MjcsMTcgQEAKIAkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFJ4IHN0YXR1cyBGSUZPIG92ZXJydW5cbiIsCiAJCQkJZGV2LT5uYW1lKTsKIAkJfQotCQlucC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKLQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJfQogCS8qIEhtbW1tbSwgaXQncyBub3QgY2xlYXIgaG93IHRvIHJlY292ZXIgZnJvbSBQQ0kgZmF1bHRzLiAqLwogCWlmIChpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUENJIGVycm9yICUjMDh4XG4iLCBkZXYtPm5hbWUsCiAJCQlpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpOwotCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKLQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlucC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKLQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAl9CiAJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKIH0KQEAgLTI0NDYsMTEgKzI0NDUsMTAgQEAKIHN0YXRpYyB2b2lkIF9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7Ci0Jc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CiAKIAkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCi0JbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMJKz0gcmVhZGwoaW9hZGRyICsgUnhDUkNFcnJzKTsKLQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSByZWFkbChpb2FkZHIgKyBSeE1pc3NlZCk7CisJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IHJlYWRsKGlvYWRkciArIFJ4Q1JDRXJycyk7CisJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IHJlYWRsKGlvYWRkciArIFJ4TWlzc2VkKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI0NjMsNyArMjQ2MSw3IEBACiAJCV9fZ2V0X3N0YXRzKGRldik7CiAJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CiAKLQlyZXR1cm4gJm5wLT5zdGF0czsKKwlyZXR1cm4gJmRldi0+c3RhdHM7CiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfY3R4LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19jdHguYwppbmRleCAzYTQxYjZhLi4xMjYxMjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19jdHguYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19jdHguYwpAQCAtMjU1LDYgKzI1NSwxOSBAQAogfQogCiBzdGF0aWMgdm9pZAorbnhfZndfY21kX3Jlc2V0X2N0eChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisKKwluZXR4ZW5faXNzdWVfY21kKGFkYXB0ZXIsIGFkYXB0ZXItPmFody5wY2lfZnVuYywgTlhIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYywgTlhfREVTVFJPWV9DVFhfUkVTRVQsIDAsCisJCQlOWF9DRFJQX0NNRF9ERVNUUk9ZX1JYX0NUWCk7CisKKwluZXR4ZW5faXNzdWVfY21kKGFkYXB0ZXIsIGFkYXB0ZXItPmFody5wY2lfZnVuYywgTlhIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYywgTlhfREVTVFJPWV9DVFhfUkVTRVQsIDAsCisJCQlOWF9DRFJQX0NNRF9ERVNUUk9ZX1RYX0NUWCk7Cit9CisKK3N0YXRpYyB2b2lkCiBueF9md19jbWRfZGVzdHJveV9yeF9jdHgoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eDsKQEAgLTY4NSw3ICs2OTgsOCBAQAogCWlmICghTlhfSVNfUkVWSVNJT05fUDIoYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKSkgewogCQlpZiAodGVzdF9hbmRfc2V0X2JpdChfX05YX0ZXX0FUVEFDSEVELCAmYWRhcHRlci0+c3RhdGUpKQogCQkJZ290byBkb25lOwotCisJCWlmIChyZXNldF9kZXZpY2VzKQorCQkJbnhfZndfY21kX3Jlc2V0X2N0eChhZGFwdGVyKTsKIAkJZXJyID0gbnhfZndfY21kX2NyZWF0ZV9yeF9jdHgoYWRhcHRlcik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXRfZnJlZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYwppbmRleCAyMGY3YzU4Li5iMzBkZTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jCkBAIC04ODcsMTIgKzg4NywxOSBAQAogCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IGh3X2xybzsKIAorCWlmIChkYXRhICYgfkVUSF9GTEFHX0xSTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoIShhZGFwdGVyLT5jYXBhYmlsaXRpZXMgJiBOWF9GV19DQVBBQklMSVRZX0hXX0xSTykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXRodG9vbF9vcF9zZXRfZmxhZ3MobmV0ZGV2LCBkYXRhKTsKLQotCWh3X2xybyA9IChkYXRhICYgRVRIX0ZMQUdfTFJPKSA/IE5FVFhFTl9OSUNfTFJPX0VOQUJMRUQgOiAwOworCWlmIChkYXRhICYgRVRIX0ZMQUdfTFJPKSB7CisJCWh3X2xybyA9IE5FVFhFTl9OSUNfTFJPX0VOQUJMRUQ7CisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CisJfSBlbHNlIHsKKwkJaHdfbHJvID0gMDsKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9MUk87CisJfQogCiAJaWYgKG5ldHhlbl9jb25maWdfaHdfbHJvKGFkYXB0ZXIsIGh3X2xybykpCiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmk1Mi5jIGIvZHJpdmVycy9uZXQvbmk1Mi5jCmluZGV4IDliZGRiNWYuLjMzNjE4ZWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uaTUyLmMKKysrIGIvZHJpdmVycy9uZXQvbmk1Mi5jCkBAIC0xODUsNyArMTg1LDYgQEAKIHN0YXRpYyB2b2lkICAgIG5pNTJfcm5yX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogc3RydWN0IHByaXYgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCWNoYXIgX19pb21lbSAqYmFzZTsKIAljaGFyIF9faW9tZW0gKm1hcHBlZDsKIAljaGFyIF9faW9tZW0gKm1lbXRvcDsKQEAgLTk3MiwxMCArOTcxLDEwIEBACiAJCQkJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBwLT5iYXNlICsgcmVhZGwoJnJiZC0+YnVmZmVyKSwgdG90bGVuKTsKIAkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCQkJbmV0aWZfcngoc2tiKTsKLQkJCQkJcC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCQlwLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RsZW47CisJCQkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHRvdGxlbjsKIAkJCQl9IGVsc2UKLQkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCX0gZWxzZSB7CiAJCQkJaW50IHJzdGF0OwogCQkJCSAvKiBmcmVlIGFsbCBSQkQncyB1bnRpbCBSQkRfTEFTVCBpcyBzZXQgKi8KQEAgLTk5MywxMiArOTkyLDEyIEBACiAJCQkJd3JpdGV3KDAsICZyYmQtPnN0YXR1cyk7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lISBsZW5ndGg6ICVkXG4iLAogCQkJCQlkZXYtPm5hbWUsIHRvdGxlbik7Ci0JCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJIH0KIAkJfSBlbHNlIHsvKiBmcmFtZSAhKG9rKSwgb25seSB3aXRoICdzYXZlLWJhZC1mcmFtZXMnICovCiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvb3BzISByZmQtZXJyb3Itc3RhdHVzOiAlMDR4XG4iLAogCQkJCWRldi0+bmFtZSwgc3RhdHVzKTsKLQkJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJfQogCQl3cml0ZWIoMCwgJnAtPnJmZF90b3AtPnN0YXRfaGlnaCk7CiAJCXdyaXRlYihSRkRfU1VTUCwgJnAtPnJmZF90b3AtPmxhc3QpOyAvKiBtYXliZSBleGNoYW5nZSBieSBSRkRfTEFTVCAqLwpAQCAtMTA0Myw3ICsxMDQyLDcgQEAKIHsKIAlzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCiAJd2FpdF9mb3Jfc2NiX2NtZChkZXYpOwkJLyogd2FpdCBmb3IgdGhlIGxhc3QgY21kLCBXQUlUXzRfRlVMTFNUQVQ/PyAqLwogCXdyaXRlYihSVUNfQUJPUlQsICZwLT5zY2ItPmNtZF9ydWMpOyAvKiB1c3VhbGx5IHRoZSBSVSBpcyBpbiB0aGUgJ25vIHJlc291cmNlJy1zdGF0ZSAuLiBhYm9ydCBpdCBub3cuICovCkBAIC0xMDc2LDI5ICsxMDc1LDI5IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHN0cmFuZ2UgLi4geG1pdC1pbnQgd2l0aG91dCBhICdDT01QTEVURSdcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoc3RhdHVzICYgU1RBVF9PSykgewotCQlwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyAmIFRDTURfTUFYQ09MTE1BU0spOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgJiBUQ01EX01BWENPTExNQVNLKTsKIAl9IGVsc2UgewotCQlwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJaWYgKHN0YXR1cyAmIFRDTURfTEFURUNPTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxhdGUgY29sbGlzaW9uIGRldGVjdGVkLlxuIiwKIAkJCQlkZXYtPm5hbWUpOwotCQkJcC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgVENNRF9OT0NBUlJJRVIpIHsKLQkJCXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBjYXJyaWVyIGRldGVjdGVkLlxuIiwKIAkJCQlkZXYtPm5hbWUpOwogCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFRDTURfTE9TVENUUykKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxvc3Mgb2YgQ1RTIGRldGVjdGVkLlxuIiwKIAkJCQlkZXYtPm5hbWUpOwogCQllbHNlIGlmIChzdGF0dXMgJiBUQ01EX1VOREVSUlVOKSB7Ci0JCQlwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIHVuZGVycnVuIGRldGVjdGVkLlxuIiwKIAkJCQlkZXYtPm5hbWUpOwogCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFRDTURfTUFYQ09MTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWF4LiBjb2xsaXNpb25zIGV4Y2VlZGVkLlxuIiwKIAkJCQlkZXYtPm5hbWUpOwotCQkJcC0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwkJCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKIAkJfQogCX0KICNpZiAoTlVNX1hNSVRfQlVGRlMgPiAxKQpAQCAtMTI4NiwxMiArMTI4NSwxMiBAQAogCW92cm4gPSByZWFkdygmcC0+c2NiLT5vdnJuX2VycnMpOwogCXdyaXRldygwLCAmcC0+c2NiLT5vdnJuX2VycnMpOwogCi0JcC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBjcmM7Ci0JcC0+c3RhdHMucnhfZmlmb19lcnJvcnMgKz0gb3ZybjsKLQlwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gYWxuOwotCXAtPnN0YXRzLnJ4X2Ryb3BwZWQgKz0gcnNjOworCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBjcmM7CisJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBvdnJuOworCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFsbjsKKwlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQgKz0gcnNjOwogCi0JcmV0dXJuICZwLT5zdGF0czsKKwlyZXR1cm4gJmRldi0+c3RhdHM7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbml1LmMgYi9kcml2ZXJzL25ldC9uaXUuYwppbmRleCA2M2U4ZTM4Li40MDRmMmQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbml1LmMKKysrIGIvZHJpdmVycy9uZXQvbml1LmMKQEAgLTI4LDEwICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2lmZGVmIENPTkZJR19TUEFSQzY0CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgIm5pdS5oIgogCkBAIC0zMzMwLDEwICszMzI3LDEyIEBACiAJZm9yICg7IChwID0gKnBwKSAhPSBOVUxMOyBwcCA9IChzdHJ1Y3QgcGFnZSAqKikgJnAtPm1hcHBpbmcpIHsKIAkJaWYgKHAtPmluZGV4ID09IGFkZHIpIHsKIAkJCSpsaW5rID0gcHA7Ci0JCQlicmVhazsKKwkJCWdvdG8gZm91bmQ7CiAJCX0KIAl9CisJQlVHKCk7CiAKK2ZvdW5kOgogCXJldHVybiBwOwogfQogCkBAIC03OTIwLDE0ICs3OTE5LDcgQEAKIAogc3RhdGljIGludCBuaXVfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQogewotCWlmIChkYXRhICYgKEVUSF9GTEFHX0xSTyB8IEVUSF9GTEFHX05UVVBMRSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmIChkYXRhICYgRVRIX0ZMQUdfUlhIQVNIKQotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfUlhIQVNIOwotCWVsc2UKLQkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9SWEhBU0g7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKGRldiwgZGF0YSwgRVRIX0ZMQUdfUlhIQVNIKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuaXVfZXRodG9vbF9vcHMgPSB7CkBAIC05MTE5LDEyICs5MTExLDEyIEBACiAJaWYgKCFpbnRfcHJvcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgb3AtPm51bV9pcnFzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgb3AtPmFyY2hkYXRhLm51bV9pcnFzOyBpKyspIHsKIAkJbGRnX251bV9tYXBbaV0gPSBpbnRfcHJvcFtpXTsKLQkJbnAtPmxkZ1tpXS5pcnEgPSBvcC0+aXJxc1tpXTsKKwkJbnAtPmxkZ1tpXS5pcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1tpXTsKIAl9CiAKLQlucC0+bnVtX2xkZyA9IG9wLT5udW1faXJxczsKKwlucC0+bnVtX2xkZyA9IG9wLT5hcmNoZGF0YS5udW1faXJxczsKIAogCXJldHVybiAwOwogI2Vsc2UKQEAgLTEwMjU0LDE0ICsxMDI0NiwxNCBAQAogCW5pdV9kZWJ1ZyA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBOSVVfTVNHX0RFRkFVTFQpOwogCiAjaWZkZWYgQ09ORklHX1NQQVJDNjQKLQllcnIgPSBvZl9yZWdpc3Rlcl9kcml2ZXIoJm5pdV9vZl9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJZXJyID0gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZuaXVfb2ZfZHJpdmVyKTsKICNlbmRpZgogCiAJaWYgKCFlcnIpIHsKIAkJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbml1X3BjaV9kcml2ZXIpOwogI2lmZGVmIENPTkZJR19TUEFSQzY0CiAJCWlmIChlcnIpCi0JCQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmbml1X29mX2RyaXZlcik7CisJCQlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbml1X29mX2RyaXZlcik7CiAjZW5kaWYKIAl9CiAKQEAgLTEwMjcyLDcgKzEwMjY0LDcgQEAKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5pdV9wY2lfZHJpdmVyKTsKICNpZmRlZiBDT05GSUdfU1BBUkM2NAotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZuaXVfb2ZfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbml1X29mX2RyaXZlcik7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbml1LmggYi9kcml2ZXJzL25ldC9uaXUuaAppbmRleCBkNjcxNTQ2Li5hNDFmYThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uaXUuaAorKysgYi9kcml2ZXJzL25ldC9uaXUuaApAQCAtMzIzNiw3ICszMjM2LDcgQEAKIAlpbnQgKCpsaW5rX3N0YXR1cykoc3RydWN0IG5pdSAqbnAsIGludCAqKTsKIH07CiAKLXN0cnVjdCBvZl9kZXZpY2U7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogc3RydWN0IG5pdSB7CiAJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CiAJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CkBAIC0zMjk3LDcgKzMyOTcsNyBAQAogCXN0cnVjdCBuaXVfdnBkCQkJdnBkOwogCXUzMgkJCQllZXByb21fbGVuOwogCi0Jc3RydWN0IG9mX2RldmljZQkJKm9wOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpvcDsKIAl2b2lkIF9faW9tZW0JCQkqdmlyX3JlZ3NfMTsKIAl2b2lkIF9faW9tZW0JCQkqdmlyX3JlZ3NfMjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKaW5kZXggZTg4ZTk3Yy4uNWEzNDg4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jCisrKyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwpAQCAtNDI0LDcgKzQyNCw2IEBACiAKIAogc3RydWN0IG5zODM4MjAgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCXU4CQkJX19pb21lbSAqYmFzZTsKIAogCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKQEAgLTkxOCw5ICs5MTcsOSBAQAogCQkJaWYgKHVubGlrZWx5KCFza2IpKQogCQkJCWdvdG8gbmV0ZGV2X21hbmdsZV9tZV9oYXJkZXJfZmFpbGVkOwogCQkJaWYgKGNtZHN0cyAmIENNRFNUU19ERVNUX01VTFRJKQotCQkJCWRldi0+c3RhdHMubXVsdGljYXN0ICsrOwotCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzICsrOwotCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQkJbmRldi0+c3RhdHMubXVsdGljYXN0Kys7CisJCQluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJCQlpZiAoKGV4dHN0cyAmIDB4MDAyYTAwMDApICYmICEoZXh0c3RzICYgMHgwMDU0MDAwMCkpIHsKIAkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQkJfSBlbHNlIHsKQEAgLTk0MCw3ICs5MzksNyBAQAogI2VuZGlmCiAJCQlpZiAoTkVUX1JYX0RST1AgPT0gcnhfcmMpIHsKIG5ldGRldl9tYW5nbGVfbWVfaGFyZGVyX2ZhaWxlZDoKLQkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQgKys7CisJCQkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJfQogCQl9IGVsc2UgewogCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC0xMDA4LDExICsxMDA3LDExIEBACiAJCWRtYV9hZGRyX3QgYWRkcjsKIAogCQlpZiAoY21kc3RzICYgQ01EU1RTX0VSUikKLQkJCWRldi0+c3RhdHMudHhfZXJyb3JzICsrOworCQkJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCWlmIChjbWRzdHMgJiBDTURTVFNfT0spCi0JCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMgKys7CisJCQluZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCWlmIChjbWRzdHMgJiBDTURTVFNfT0spCi0JCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGNtZHN0cyAmIDB4ZmZmZjsKKwkJCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IGNtZHN0cyAmIDB4ZmZmZjsKIAogCQlkcHJpbnRrKCJ0eF9kb25lX2lkeD0lZCBmcmVlX2lkeD0lZCBjbWRzdHM9JTA4eFxuIiwKIAkJCXR4X2RvbmVfaWR4LCBkZXYtPnR4X2ZyZWVfaWR4LCBjbWRzdHMpOwpAQCAtMTIxMiwyMCArMTIxMSwyMSBAQAogCiBzdGF0aWMgdm9pZCBuczgzODIwX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgbnM4MzgyMCAqZGV2KQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2LT5uZGV2OwogCXU4IF9faW9tZW0gKmJhc2UgPSBkZXYtPmJhc2U7CiAKIAkvKiB0aGUgRFA4MzgyMCB3aWxsIGZyZWV6ZSBjb3VudGVycywgc28gd2UgbmVlZCB0byByZWFkIGFsbCBvZiB0aGVtICovCi0JZGV2LT5zdGF0cy5yeF9lcnJvcnMJCSs9IHJlYWRsKGJhc2UgKyAweDYwKSAmIDB4ZmZmZjsKLQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NjQpICYgMHhmZmZmOwotCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg2OCkgJiAweGZmZmY7Ci0JZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NmMpICYgMHhmZmZmOwotCS8qZGV2LT5zdGF0cy5yeF9zeW1ib2xfZXJyb3JzICs9Ki8gcmVhZGwoYmFzZSArIDB4NzApOwotCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg3NCkgJiAweGZmZmY7Ci0JZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzCSs9IHJlYWRsKGJhc2UgKyAweDc4KSAmIDB4ZmZmZjsKLQkvKmRldi0+c3RhdHMucnhfYmFkb3Bjb2RlX2Vycm9ycyArPSAqLyByZWFkbChiYXNlICsgMHg3Yyk7Ci0JLypkZXYtPnN0YXRzLnJ4X3BhdXNlX2NvdW50ICs9ICovICByZWFkbChiYXNlICsgMHg4MCk7Ci0JLypkZXYtPnN0YXRzLnR4X3BhdXNlX2NvdW50ICs9ICovICByZWFkbChiYXNlICsgMHg4NCk7Ci0JZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg4OCkgJiAweGZmOworCW5kZXYtPnN0YXRzLnJ4X2Vycm9ycwkJKz0gcmVhZGwoYmFzZSArIDB4NjApICYgMHhmZmZmOworCW5kZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NjQpICYgMHhmZmZmOworCW5kZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NjgpICYgMHhmZmZmOworCW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg2YykgJiAweGZmZmY7CisJLypuZGV2LT5zdGF0cy5yeF9zeW1ib2xfZXJyb3JzICs9Ki8gcmVhZGwoYmFzZSArIDB4NzApOworCW5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NzQpICYgMHhmZmZmOworCW5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NzgpICYgMHhmZmZmOworCS8qbmRldi0+c3RhdHMucnhfYmFkb3Bjb2RlX2Vycm9ycyArPSAqLyByZWFkbChiYXNlICsgMHg3Yyk7CisJLypuZGV2LT5zdGF0cy5yeF9wYXVzZV9jb3VudCArPSAqLyAgcmVhZGwoYmFzZSArIDB4ODApOworCS8qbmRldi0+c3RhdHMudHhfcGF1c2VfY291bnQgKz0gKi8gIHJlYWRsKGJhc2UgKyAweDg0KTsKKwluZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg4OCkgJiAweGZmOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zODM4MjBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpAQCAtMTIzNyw3ICsxMjM3LDcgQEAKIAluczgzODIwX3VwZGF0ZV9zdGF0cyhkZXYpOwogCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOwogCi0JcmV0dXJuICZkZXYtPnN0YXRzOworCXJldHVybiAmbmRldi0+c3RhdHM7CiB9CiAKIC8qIExldCBldGh0b29sIHJldHJpZXZlIGluZm8gKi8KQEAgLTE0NjQsMTIgKzE0NjQsMTIgQEAKIAogCWlmICh1bmxpa2VseShJU1JfUlhTT1ZSICYgaXNyKSkgewogCQkvL3ByaW50aygib3ZlcnJ1bjogcnhzb3ZyXG4iKTsKLQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycyArKzsKKwkJbmRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAl9CiAKIAlpZiAodW5saWtlbHkoSVNSX1JYT1JOICYgaXNyKSkgewogCQkvL3ByaW50aygib3ZlcnJ1bjogcnhvcm5cbiIpOwotCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICsrOworCQluZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCX0KIAogCWlmICgoSVNSX1JYUkNNUCAmIGlzcikgJiYgZGV2LT5yeF9pbmZvLnVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvb2N0ZW9uL29jdGVvbl9tZ210LmMgYi9kcml2ZXJzL25ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYwppbmRleCAwMDBlNzkyLi5iMjY0ZjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYworKysgYi9kcml2ZXJzL25ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYwpAQCAtNjIwLDcgKzYyMCw3IEBACiAJaWYgKCFwLT5waHlkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocC0+cGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHAtPnBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIG9jdGVvbl9tZ210X2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBvY3Rlb25fbWdtdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgb2N0ZW9uX21nbXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19pcnE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTExMjQsNyArMTEyNCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyBpbnQgX19leGl0IG9jdGVvbl9tZ210X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgb2N0ZW9uX21nbXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIApAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlCQk9IG9jdGVvbl9tZ210X3Byb2JlLAotCS5yZW1vdmUJCT0gX19leGl0X3Aob2N0ZW9uX21nbXRfcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9jdGVvbl9tZ210X3JlbW92ZSksCiB9OwogCiBleHRlcm4gdm9pZCBvY3Rlb25fbWRpb2J1c19mb3JjZV9tb2RfZGVwZW5jZW5jeSh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKaW5kZXggMTBlZTEwNi4uYzY4M2Y3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKQEAgLTg3LDcgKzg3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC0yNzksOCArMjc4LDggQEAKIAlscC0+cF9kZXYgPSBsaW5rOwogCiAJc3Bpbl9sb2NrX2luaXQoJmxwLT53aW5kb3dfbG9jayk7Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gMzI7Ci0JbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDMyOworCWxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOwpAQCAtMzM4LDEwICszMzcsMTEgQEAKIAogCWRldl9kYmcoJmxpbmstPmRldiwgIjNjNTc0X2NvbmZpZygpXG4iKTsKIAotCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisJbGluay0+aW9fbGluZXMgPSAxNjsKKwogCWZvciAoaSA9IGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgewotCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7Ci0JCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOworCQlsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPSBqIF4gMHgzMDA7CisJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKIAkJaWYgKGkgPT0gMCkKIAkJCWJyZWFrOwogCX0KQEAgLTM1Nyw3ICszNTcsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAogCWRldi0+aXJxID0gbGluay0+aXJxOwotCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCWRldi0+YmFzZV9hZGRyID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKaW5kZXggY2U2M2MzNy4uNjFmOWNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMjE0LDggKzIxMyw4IEBACiAgICAgbHAtPnBfZGV2ID0gbGluazsKIAogICAgIHNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7Ci0gICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDE2OworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CiAKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CkBAIC0yNzgsMTIgKzI3NywxMyBAQAogCQkgICAiM0NvbSBjYXJkPz9cbiIpOwogICAgIG11bHRpID0gKGxpbmstPmNhcmRfaWQgPT0gUFJPRElEXzNDT01fM0M1NjIpOwogCisgICAgbGluay0+aW9fbGluZXMgPSAxNjsKKwogICAgIC8qIEZvciB0aGUgM2M1NjIsIHRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSB4eDAwLXh4N2YgKi8KLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OwogICAgIGZvciAoaSA9IGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgxMCkgewogCWlmIChtdWx0aSAmJiAoaiAmIDB4ODApKSBjb250aW51ZTsKLQlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7Ci0JaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaiBeIDB4MzAwOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKIAlpZiAoaSA9PSAwKQogCQlicmVhazsKICAgICB9CkBAIC0yOTksNyArMjk5LDcgQEAKIAkgICAgZ290byBmYWlsZWQ7CiAKICAgICBkZXYtPmlycSA9IGxpbmstPmlycTsKLSAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKICAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKICAgICBFTDNXSU5ET1coMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKaW5kZXggMzM1MjViZi4uNWYwNWZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlICIuLi84MzkwLmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTI2MCwyOCArMjU5LDMwIEBACiBzdGF0aWMgaW50IHRyeV9pb19wb3J0KHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogICAgIGludCBqLCByZXQ7Ci0gICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMSA9PSAzMikgewotCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisgICAgbGluay0+cmVzb3VyY2VbMV0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisgICAgaWYgKGxpbmstPnJlc291cmNlWzBdLT5lbmQgPT0gMzIpIHsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CiAJLyogZm9yIG1hc3Rlci9zbGF2ZSBtdWx0aWZ1bmN0aW9uIGNhcmRzICovCi0JaWYgKGxpbmstPmlvLk51bVBvcnRzMiA+IDApCi0JICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJaWYgKGxpbmstPnJlc291cmNlWzFdLT5lbmQgPiAwKQorCSAgICBsaW5rLT5yZXNvdXJjZVsxXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CiAgICAgfSBlbHNlIHsKIAkvKiBUaGlzIHNob3VsZCBiZSB0d28gMTYtcG9ydCB3aW5kb3dzICovCi0JbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKICAgICB9Ci0gICAgaWYgKGxpbmstPmlvLkJhc2VQb3J0MSA9PSAwKSB7Ci0JbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKyAgICBpZiAobGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID09IDApIHsKIAlmb3IgKGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgewotCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7Ci0JICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IChqIF4gMHgzMDApICsgMHgxMDsKLQkgICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKwkgICAgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaiBeIDB4MzAwOworCSAgICBsaW5rLT5yZXNvdXJjZVsxXS0+c3RhcnQgPSAoaiBeIDB4MzAwKSArIDB4MTA7CisJICAgIGxpbmstPmlvX2xpbmVzID0gMTY7CisJICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogCSAgICBpZiAocmV0ID09IDApCiAJCSAgICByZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gcmV0OwogICAgIH0gZWxzZSB7Ci0JcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogICAgIH0KIH0KIApAQCAtMzAyLDE1ICszMDMsMTUgQEAKIAkgICBuZXR3b3JrIGZ1bmN0aW9uIHdpdGggd2luZG93IDAsIGFuZCBzZXJpYWwgd2l0aCB3aW5kb3cgMSAqLwogCWlmIChpby0+bndpbiA+IDEpIHsKIAkJaSA9IChpby0+d2luWzFdLmxlbiA+IGlvLT53aW5bMF0ubGVuKTsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMS1pXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxLWldLmxlbjsKKwkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMS1pXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IGlvLT53aW5bMS1pXS5sZW47CiAJfSBlbHNlIHsKLQkJaSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCQlpID0gcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAwOwogCX0KLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpbltpXS5iYXNlOwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luW2ldLmxlbjsKLQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQlpZiAocF9kZXYtPmlvLk51bVBvcnRzMSArIHBfZGV2LT5pby5OdW1Qb3J0czIgPj0gMzIpCisJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5baV0uYmFzZTsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5baV0ubGVuOworCXBfZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCWlmIChwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCArIHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID49IDMyKQogCQlyZXR1cm4gdHJ5X2lvX3BvcnQocF9kZXYpOwogCiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0zMzMsNyArMzM0LDcgQEAKICAgICBpZiAoIWxpbmstPmlycSkKIAkgICAgZ290byBmYWlsZWQ7CiAgICAgCi0gICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMiA9PSA4KSB7CisgICAgaWYgKHJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMV0pID09IDgpIHsKIAlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKIAlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwogICAgIH0KQEAgLTM0Myw3ICszNDQsNyBAQAogCSAgICBnb3RvIGZhaWxlZDsKIAogICAgIGRldi0+aXJxID0gbGluay0+aXJxOwotICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCiAgICAgaWYgKCFnZXRfcHJvbShsaW5rKSkgewogCXByaW50ayhLRVJOX05PVElDRSAiYXhuZXRfY3M6IHRoaXMgaXMgbm90IGFuIEFYODgxOTAgY2FyZCFcbiIpOwpAQCAtMzc5LDggKzM4MCw3IEBACiAgICAgLyogTWF5YmUgUEhZIGlzIGluIHBvd2VyIGRvd24gbW9kZS4gKFBQRF9TRVQgPSAxKSAKICAgICAgICBCaXQgMiBvZiBDQ1NSIGlzIGFjdGl2ZSBsb3cuICovIAogICAgIGlmIChpID09IDMyKSB7Ci0JY29uZl9yZWdfdCByZWcgPSB7IDAsIENTX1dSSVRFLCBDSVNSRUdfQ0NTUiwgMHgwNCB9OwotIAlwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluaywgJnJlZyk7CisJcGNtY2lhX3dyaXRlX2NvbmZpZ19ieXRlKGxpbmssIENJU1JFR19DQ1NSLCAweDA0KTsKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewogCSAgICBqID0gbWRpb19yZWFkKGRldi0+YmFzZV9hZGRyICsgQVhORVRfTUlJX0VFUCwgaSwgMSk7CiAJICAgIGoyID0gbWRpb19yZWFkKGRldi0+YmFzZV9hZGRyICsgQVhORVRfTUlJX0VFUCwgaSwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCmluZGV4IDU2NDNmOTQuLjNjNDAwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTE1OSw5ICsxNTgsOCBAQAogICAgIC8qIGZpbGwgaW4gb3VyIG1vZHVsZSBwYXJhbWV0ZXJzIGFzIGRlZmF1bHRzICovCiAgICAgZGV2LT5kZXZfYWRkclswXSA9IG5vZGU7CiAKLSAgICBwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLSAgICBwX2Rldi0+aW8uTnVtUG9ydHMxID0gMTY7Ci0gICAgcF9kZXYtPmlvLklPQWRkckxpbmVzID0gMTY7CisgICAgcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IDE2OwogICAgIHBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAgICAgcF9kZXYtPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwogCkBAIC0yNDYsMjAgKzI0NCwyNCBAQAogCiAgICAgZGV2X2RiZygmbGluay0+ZGV2LCAiY29tMjAwMjBfY29uZmlnXG4iKTsKIAotICAgIGRldl9kYmcoJmxpbmstPmRldiwgImJhc2Vwb3J0MSBpcyAlWGhcbiIsIGxpbmstPmlvLkJhc2VQb3J0MSk7CisgICAgZGV2X2RiZygmbGluay0+ZGV2LCAiYmFzZXBvcnQxIGlzICVYaFxuIiwKKwkgICAgKHVuc2lnbmVkIGludCkgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0KTsKKwogICAgIGkgPSAtRU5PREVWOwotICAgIGlmICghbGluay0+aW8uQmFzZVBvcnQxKQorICAgIGxpbmstPmlvX2xpbmVzID0gMTY7CisKKyAgICBpZiAoIWxpbmstPnJlc291cmNlWzBdLT5zdGFydCkKICAgICB7CiAJZm9yIChpb2FkZHIgPSAweDEwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKQogCXsKLQkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gaW9hZGRyOwotCSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKwkgICAgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW9hZGRyOworCSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAJICAgIGlmIChpID09IDApCiAJCWJyZWFrOwogCX0KICAgICB9CiAgICAgZWxzZQotCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKICAgICAKICAgICBpZiAoaSAhPSAwKQogICAgIHsKQEAgLTI2Nyw3ICsyNjksNyBAQAogCWdvdG8gZmFpbGVkOwogICAgIH0KIAkKLSAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKICAgICBkZXZfZGJnKCZsaW5rLT5kZXYsICJnb3QgaW9hZGRyICVYaFxuIiwgaW9hZGRyKTsKIAogICAgIGRldl9kYmcoJmxpbmstPmRldiwgInJlcXVlc3QgSVJRICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKaW5kZXggN2MyN2M1MC4uOThmZmZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgpAQCAtMjQ5LDkgKzI0OCw4IEBACiAgICAgbHAtPmJhc2UgPSBOVUxMOwogCiAgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCi0gICAgbGluay0+aW8uTnVtUG9ydHMxID0gMzI7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDMyOworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKIAogICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CkBAIC0yODksMTMgKzI4NywxMyBAQAogCXsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTgsIDB4MCB9OwogCiAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCWxpbmstPmlvLkJhc2VQb3J0MiA9IHNlcmlhbF9iYXNlW2ldOwotCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JaWYgKGxpbmstPmlvLkJhc2VQb3J0MiA9PSAwKSB7Ci0JICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJbGluay0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gc2VyaWFsX2Jhc2VbaV07CisJbGluay0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWlmIChsaW5rLT5yZXNvdXJjZVsxXS0+c3RhcnQgPT0gMCkgeworCSAgICBsaW5rLT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJmbXZqMTh4X2NzOiBvdXQgb2YgcmVzb3VyY2UgZm9yIHNlcmlhbFxuIik7CiAJfQotCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAJaWYgKHJldCA9PSAwKQogCQlyZXR1cm4gcmV0OwogICAgIH0KQEAgLTMxMSwxMiArMzA5LDEyIEBACiAJMHgzODAsMHgzYzAgb25seSBmb3IgaW9wb3J0LgogICAgICovCiAgICAgZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHgzZTA7IGlvYWRkciArPSAweDIwKSB7Ci0JbGluay0+aW8uQmFzZVBvcnQxID0gaW9hZGRyOwotCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW9hZGRyOworCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogCWlmIChyZXQgPT0gMCkgewogCSAgICAvKiBjYWxjdWxhdGUgQ29uZmlnSW5kZXggdmFsdWUgKi8KIAkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IAotCQkoKGxpbmstPmlvLkJhc2VQb3J0MSAmIDB4MGYwKSA+PiAzKSB8IDB4MjI7CisJCSgobGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICYgMHgwZjApID4+IDMpIHwgMHgyMjsKIAkgICAgcmV0dXJuIHJldDsKIAl9CiAgICAgfQpAQCAtMzQ2LDYgKzM0NCw4IEBACiAKICAgICBkZXZfZGJnKCZsaW5rLT5kZXYsICJmbXZqMTh4X2NvbmZpZ1xuIik7CiAKKyAgICBsaW5rLT5pb19saW5lcyA9IDU7CisKICAgICBsZW4gPSBwY21jaWFfZ2V0X3R1cGxlKGxpbmssIENJU1RQTF9GVU5DRSwgJmJ1Zik7CiAgICAga2ZyZWUoYnVmKTsKIApAQCAtMzY0LDIwICszNjQsMjAgQEAKIAkJLyogTXVsdGlGdW5jdGlvbiBDYXJkICovCiAJCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IDB4ODAwOwogCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHg0NzsKLQkJbGluay0+aW8uTnVtUG9ydHMyID0gODsKKwkJbGluay0+cmVzb3VyY2VbMV0tPmVuZCA9IDg7CiAJICAgIH0KIAkgICAgYnJlYWs7CiAJY2FzZSBNQU5GSURfTkVDOgogCSAgICBjYXJkdHlwZSA9IE5FQzsgLyogTXVsdGlGdW5jdGlvbiBDYXJkICovCiAJICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IDB4ODAwOwogCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHg0NzsKLQkgICAgbGluay0+aW8uTnVtUG9ydHMyID0gODsKKwkgICAgbGluay0+cmVzb3VyY2VbMV0tPmVuZCA9IDg7CiAJICAgIGJyZWFrOwogCWNhc2UgTUFORklEX0tNRToKIAkgICAgY2FyZHR5cGUgPSBLTUU7IC8qIE11bHRpRnVuY3Rpb24gQ2FyZCAqLwogCSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSAweDgwMDsKIAkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NDc7Ci0JICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDg7CisJICAgIGxpbmstPnJlc291cmNlWzFdLT5lbmQgPSA4OwogCSAgICBicmVhazsKIAljYXNlIE1BTkZJRF9DT05URUM6CiAJICAgIGNhcmR0eXBlID0gQ09OVEVDOwpAQCAtNDE4LDE0ICs0MTgsMTQgQEAKIAl9CiAgICAgfQogCi0gICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMiAhPSAwKSB7CisgICAgaWYgKGxpbmstPnJlc291cmNlWzFdLT5lbmQgIT0gMCkgewogCXJldCA9IG1mY190cnlfaW9fcG9ydChsaW5rKTsKIAlpZiAocmV0ICE9IDApIGdvdG8gZmFpbGVkOwogICAgIH0gZWxzZSBpZiAoY2FyZHR5cGUgPT0gVU5HRVJNQU5OKSB7CiAJcmV0ID0gdW5nZXJtYW5uX3RyeV9pb19wb3J0KGxpbmspOwogCWlmIChyZXQgIT0gMCkgZ290byBmYWlsZWQ7CiAgICAgfSBlbHNlIHsgCi0JICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogCSAgICBpZiAocmV0KQogCQkgICAgZ290byBmYWlsZWQ7CiAgICAgfQpAQCAtNDM3LDkgKzQzNyw5IEBACiAJICAgIGdvdG8gZmFpbGVkOwogCiAgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnE7Ci0gICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKLSAgICBpZiAobGluay0+aW8uQmFzZVBvcnQyICE9IDApIHsKKyAgICBpZiAocmVzb3VyY2Vfc2l6ZShsaW5rLT5yZXNvdXJjZVsxXSkgIT0gMCkgewogCXJldCA9IGZtdmoxOHhfc2V0dXBfbWZjKGxpbmspOwogCWlmIChyZXQgIT0gMCkgZ290byBmYWlsZWQ7CiAgICAgfQpAQCAtNTQ1LDcgKzU0NSw2IEBACiBzdGF0aWMgaW50IGZtdmoxOHhfZ2V0X2h3aW5mbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaywgdV9jaGFyICpub2RlX2lkKQogewogICAgIHdpbl9yZXFfdCByZXE7Ci0gICAgbWVtcmVxX3QgbWVtOwogICAgIHVfY2hhciBfX2lvbWVtICpiYXNlOwogICAgIGludCBpLCBqOwogCkBAIC01NTgsOSArNTU3LDcgQEAKIAlyZXR1cm4gLTE7CiAKICAgICBiYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOwotICAgIG1lbS5QYWdlID0gMDsKLSAgICBtZW0uQ2FyZE9mZnNldCA9IDA7Ci0gICAgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsaW5rLT53aW4sICZtZW0pOworICAgIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbGluay0+d2luLCAwKTsKIAogICAgIC8qCiAgICAgICogIE1CSDEwMzA0IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCBmb3JtYXQKQEAgLTU5NCw3ICs1OTEsNiBAQAogc3RhdGljIGludCBmbXZqMTh4X3NldHVwX21mYyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKICAgICB3aW5fcmVxX3QgcmVxOwotICAgIG1lbXJlcV90IG1lbTsKICAgICBpbnQgaTsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICB1bnNpZ25lZCBpbnQgaW9hZGRyOwpAQCAtNjE0LDkgKzYxMCw3IEBACiAJcmV0dXJuIC0xOwogICAgIH0KIAotICAgIG1lbS5QYWdlID0gMDsKLSAgICBtZW0uQ2FyZE9mZnNldCA9IDA7Ci0gICAgaSA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbGluay0+d2luLCAmbWVtKTsKKyAgICBpID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsaW5rLT53aW4sIDApOwogICAgIGlmIChpICE9IDApIHsKIAlpb3VubWFwKGxwLT5iYXNlKTsKIAlscC0+YmFzZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCmluZGV4IDY3ZWU5ODUuLmIwZDA2YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCkBAIC01Nyw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pYm10ci5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpAQCAtMTUyLDkgKzE1MSw4IEBACiAgICAgbGluay0+cHJpdiA9IGluZm87CiAgICAgaW5mby0+dGkgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSA0OwotICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA0OwogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKICAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKQEAgLTIxMywyNiArMjExLDI2IEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKICAgICBzdHJ1Y3QgdG9rX2luZm8gKnRpID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICB3aW5fcmVxX3QgcmVxOwotICAgIG1lbXJlcV90IG1lbTsKICAgICBpbnQgaSwgcmV0OwogCiAgICAgZGV2X2RiZygmbGluay0+ZGV2LCAiaWJtdHJfY29uZmlnXG4iKTsKIAogICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDYxOworICAgIGxpbmstPmlvX2xpbmVzID0gMTY7CiAKICAgICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBQUklNQVJZIG9yIEFMVEVSTkFURS4gKi8KIAogICAgIC8qIFRyeSBQUklNQVJZIGNhcmQgYXQgMHhBMjAtMHhBMjMgKi8KLSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSAweEEyMDsKLSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKyAgICBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPSAweEEyMDsKKyAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAgICAgaWYgKGkgIT0gMCkgewogCS8qIENvdWxkbid0IGdldCAweEEyMC0weEEyMy4gIFRyeSBBTFRFUk5BVEUgYXQgMHhBMjQtMHhBMjcuICovCi0JbGluay0+aW8uQmFzZVBvcnQxID0gMHhBMjQ7Ci0JcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKwlsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPSAweEEyNDsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKICAgICByZXQgPSBwY21jaWFfcmVxdWVzdF9leGNsdXNpdmVfaXJxKGxpbmssIGlibXRyX2ludGVycnVwdCk7CiAgICAgaWYgKHJldCkKQEAgLTI1MSw5ICsyNDksNyBAQAogICAgIGlmIChyZXQpCiAJICAgIGdvdG8gZmFpbGVkOwogCi0gICAgbWVtLkNhcmRPZmZzZXQgPSBtbWlvYmFzZTsKLSAgICBtZW0uUGFnZSA9IDA7Ci0gICAgcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsaW5rLT53aW4sICZtZW0pOworICAgIHJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbGluay0+d2luLCBtbWlvYmFzZSk7CiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAgICAgdGktPm1taW8gPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CkBAIC0yNjgsMTMgKzI2NCwxMSBAQAogICAgIGlmIChyZXQpCiAJICAgIGdvdG8gZmFpbGVkOwogCi0gICAgbWVtLkNhcmRPZmZzZXQgPSBzcmFtYmFzZTsKLSAgICBtZW0uUGFnZSA9IDA7Ci0gICAgcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBpbmZvLT5zcmFtX3dpbl9oYW5kbGUsICZtZW0pOworICAgIHJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgaW5mby0+c3JhbV93aW5faGFuZGxlLCBzcmFtYmFzZSk7CiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAKLSAgICB0aS0+c3JhbV9iYXNlID0gbWVtLkNhcmRPZmZzZXQgPj4gMTI7CisgICAgdGktPnNyYW1fYmFzZSA9IHNyYW1iYXNlID4+IDEyOwogICAgIHRpLT5zcmFtX3ZpcnQgPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CiAgICAgdGktPnNyYW1fcGh5cyA9IHJlcS5CYXNlOwogCkBAIC0zMjUsNyArMzE5LDYgQEAKIAlpZiAobGluay0+d2luKSB7CiAJCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSBuZXRkZXZfcHJpdihkZXYpOwogCQlpb3VubWFwKHRpLT5tbWlvKTsKLQkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmssIGluZm8tPnNyYW1fd2luX2hhbmRsZSk7CiAJfQogCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwppbmRleCA5YjYzZGVjLi42OGYyZGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCkBAIC0xNDYsNyArMTQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC00NTksOSArNDU4LDggQEAKICAgICBsaW5rLT5wcml2ID0gZGV2OwogICAgIAogICAgIHNwaW5fbG9ja19pbml0KCZscC0+YmFua19sb2NrKTsKLSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAzMjsKLSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKKyAgICBsaW5rLT5yZXNvdXJjZVswXS0+ZW5kID0gMzI7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKQEAgLTY0NSw3ICs2NDMsOCBAQAogCiAgIGRldl9kYmcoJmxpbmstPmRldiwgIm5tY2xhbl9jb25maWdcbiIpOwogCi0gIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisgIGxpbmstPmlvX2xpbmVzID0gNTsKKyAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAgIGlmIChyZXQpCiAJICBnb3RvIGZhaWxlZDsKICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfZXhjbHVzaXZlX2lycShsaW5rLCBtYWNlX2ludGVycnVwdCk7CkBAIC02NTYsNyArNjU1LDcgQEAKIAkgIGdvdG8gZmFpbGVkOwogCiAgIGRldi0+aXJxID0gbGluay0+aXJxOwotICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAKQEAgLTc1OCwyOSArNzU3LDIwIEBACiAKICNpZiBSRVNFVF9YSUxJTlgKICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSAmbHAtPmxpbms7Ci0gIGNvbmZfcmVnX3QgcmVnOwotICB1X2xvbmcgT3JpZ0NvclZhbHVlOyAKKyAgdTggT3JpZ0NvclZhbHVlOwogCiAgIC8qIFNhdmUgb3JpZ2luYWwgQ09SIHZhbHVlICovCi0gIHJlZy5GdW5jdGlvbiA9IDA7Ci0gIHJlZy5BY3Rpb24gPSBDU19SRUFEOwotICByZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSAgcmVnLlZhbHVlID0gMDsKLSAgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmssICZyZWcpOwotICBPcmlnQ29yVmFsdWUgPSByZWcuVmFsdWU7CisgIHBjbWNpYV9yZWFkX2NvbmZpZ19ieXRlKGxpbmssIENJU1JFR19DT1IsICZPcmlnQ29yVmFsdWUpOwogCiAgIC8qIFJlc2V0IFhpbGlueCAqLwotICByZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0gIHJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOwotICBkZXZfZGJnKCZsaW5rLT5kZXYsICJubWNsYW5fcmVzZXQ6IE9yaWdDb3JWYWx1ZT0weCVsWCwgcmVzZXR0aW5nLi4uXG4iLAorICBkZXZfZGJnKCZsaW5rLT5kZXYsICJubWNsYW5fcmVzZXQ6IE9yaWdDb3JWYWx1ZT0weCV4LCByZXNldHRpbmcuLi5cbiIsCiAJT3JpZ0NvclZhbHVlKTsKLSAgcmVnLlZhbHVlID0gQ09SX1NPRlRfUkVTRVQ7Ci0gIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLCAmcmVnKTsKKyAgcGNtY2lhX3dyaXRlX2NvbmZpZ19ieXRlKGxpbmssIENJU1JFR19DT1IsIENPUl9TT0ZUX1JFU0VUKTsKICAgLyogTmVlZCB0byB3YWl0IGZvciAyMCBtcyBmb3IgUENNQ0lBIHRvIGZpbmlzaCByZXNldC4gKi8KIAogICAvKiBSZXN0b3JlIG9yaWdpbmFsIENPUiBjb25maWd1cmF0aW9uIGluZGV4ICovCi0gIHJlZy5WYWx1ZSA9IENPUl9MRVZFTF9SRVEgfCAoT3JpZ0NvclZhbHVlICYgQ09SX0NPTkZJR19NQVNLKTsKLSAgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmssICZyZWcpOworICBwY21jaWFfd3JpdGVfY29uZmlnX2J5dGUobGluaywgQ0lTUkVHX0NPUiwKKwkJCSAgKENPUl9MRVZFTF9SRVEgfCAoT3JpZ0NvclZhbHVlICYgQ09SX0NPTkZJR19NQVNLKSkpOwogICAvKiBYaWxpbnggaXMgbm93IGNvbXBsZXRlbHkgcmVzZXQgYWxvbmcgd2l0aCB0aGUgTUFDRSBjaGlwLiAqLwogICBscC0+dHhfZnJlZV9mcmFtZXM9QU0yMTUwX01BWF9UWF9GUkFNRVM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKaW5kZXggYmZkZWY3Mi4uYzNlZGZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlICIuLi84MzkwLmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTExMyw4ICsxMTIsNiBAQAogCiBzdGF0aWMgdm9pZCBwY25ldF9kZXRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKIAotc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAicGNuZXRfY3MiOwotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogdHlwZWRlZiBzdHJ1Y3QgaHdfaW5mb190IHsKQEAgLTMwNCw3ICszMDEsNiBAQAogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIHdpbl9yZXFfdCByZXE7Ci0gICAgbWVtcmVxX3QgbWVtOwogICAgIHVfY2hhciBfX2lvbWVtICpiYXNlLCAqdmlydDsKICAgICBpbnQgaSwgajsKIApAQCAtMzE3LDEwICszMTMsOCBAQAogCXJldHVybiBOVUxMOwogCiAgICAgdmlydCA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKLSAgICBtZW0uUGFnZSA9IDA7CiAgICAgZm9yIChpID0gMDsgaSA8IE5SX0lORk87IGkrKykgewotCW1lbS5DYXJkT2Zmc2V0ID0gaHdfaW5mb1tpXS5vZmZzZXQgJiB+KHJlcS5TaXplLTEpOwotCXBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbGluay0+d2luLCAmbWVtKTsKKwlwY21jaWFfbWFwX21lbV9wYWdlKGxpbmssIGxpbmstPndpbiwgaHdfaW5mb1tpXS5vZmZzZXQgJiB+KHJlcS5TaXplLTEpKTsKIAliYXNlID0gJnZpcnRbaHdfaW5mb1tpXS5vZmZzZXQgJiAocmVxLlNpemUtMSldOwogCWlmICgocmVhZGIoYmFzZSswKSA9PSBod19pbmZvW2ldLmEwKSAmJgogCSAgICAocmVhZGIoYmFzZSsyKSA9PSBod19pbmZvW2ldLmExKSAmJgpAQCAtNDgwLDI5ICs0NzQsMzEgQEAKIHN0YXRpYyBpbnQgdHJ5X2lvX3BvcnQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAgICAgaW50IGosIHJldDsKLSAgICBpZiAobGluay0+aW8uTnVtUG9ydHMxID09IDMyKSB7Ci0JbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMyID4gMCkgeworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworICAgIGxpbmstPnJlc291cmNlWzFdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworICAgIGlmIChsaW5rLT5yZXNvdXJjZVswXS0+ZW5kID09IDMyKSB7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWlmIChsaW5rLT5yZXNvdXJjZVsxXS0+ZW5kID4gMCkgewogCSAgICAvKiBmb3IgbWFzdGVyL3NsYXZlIG11bHRpZnVuY3Rpb24gY2FyZHMgKi8KLQkgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkgICAgbGluay0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCX0KICAgICB9IGVsc2UgewogCS8qIFRoaXMgc2hvdWxkIGJlIHR3byAxNi1wb3J0IHdpbmRvd3MgKi8KLQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCWxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlsaW5rLT5yZXNvdXJjZVsxXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwogICAgIH0KLSAgICBpZiAobGluay0+aW8uQmFzZVBvcnQxID09IDApIHsKLQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworICAgIGlmIChsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPT0gMCkgewogCWZvciAoaiA9IDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7Ci0JICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKLQkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gKGogXiAweDMwMCkgKyAweDEwOwotCSAgICByZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOworCSAgICBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPSBqIF4gMHgzMDA7CisJICAgIGxpbmstPnJlc291cmNlWzFdLT5zdGFydCA9IChqIF4gMHgzMDApICsgMHgxMDsKKwkgICAgbGluay0+aW9fbGluZXMgPSAxNjsKKwkgICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAJICAgIGlmIChyZXQgPT0gMCkKIAkJICAgIHJldHVybiByZXQ7CiAJfQogCXJldHVybiByZXQ7CiAgICAgfSBlbHNlIHsKLQlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAgICAgfQogfQogCkBAIC01MjMsMTggKzUxOSwxOCBAQAogCSAgIG5ldHdvcmsgZnVuY3Rpb24gd2l0aCB3aW5kb3cgMCwgYW5kIHNlcmlhbCB3aXRoIHdpbmRvdyAxICovCiAJaWYgKGlvLT5ud2luID4gMSkgewogCQlpID0gKGlvLT53aW5bMV0ubGVuID4gaW8tPndpblswXS5sZW4pOwotCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxLWldLmJhc2U7Ci0JCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzEtaV0ubGVuOworCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxLWldLmJhc2U7CisJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gaW8tPndpblsxLWldLmxlbjsKIAl9IGVsc2UgewotCQlpID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJCWkgPSBwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IDA7CiAJfQogCiAJKmhhc19zaG1lbSA9ICgoY2ZnLT5tZW0ubndpbiA9PSAxKSAmJgogCQkgICAgICAoY2ZnLT5tZW0ud2luWzBdLmxlbiA+PSAweDQwMDApKTsKLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpbltpXS5iYXNlOwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luW2ldLmxlbjsKLQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQlpZiAocF9kZXYtPmlvLk51bVBvcnRzMSArIHBfZGV2LT5pby5OdW1Qb3J0czIgPj0gMzIpCisJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5baV0uYmFzZTsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5baV0ubGVuOworCXBfZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCWlmIChwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCArIHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID49IDMyKQogCQlyZXR1cm4gdHJ5X2lvX3BvcnQocF9kZXYpOwogCiAJcmV0dXJuIDA7CkBAIC01NTcsNyArNTUzLDcgQEAKICAgICBpZiAoIWxpbmstPmlycSkKIAkgICAgZ290byBmYWlsZWQ7CiAKLSAgICBpZiAobGluay0+aW8uTnVtUG9ydHMyID09IDgpIHsKKyAgICBpZiAocmVzb3VyY2Vfc2l6ZShsaW5rLT5yZXNvdXJjZVsxXSkgPT0gOCkgewogCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwogCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CiAgICAgfQpAQCAtNTY5LDcgKzU2NSw3IEBACiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnE7Ci0gICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAgICAgaWYgKGluZm8tPmZsYWdzICYgSEFTX01JU0NfUkVHKSB7CiAJaWYgKChpZl9wb3J0ID09IDEpIHx8IChpZl9wb3J0ID09IDIpKQogCSAgICBkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OwpAQCAtOTU2LDcgKzk1Miw3IEBACiAgICAgc2V0X21pc2NfcmVnKGRldik7CiAKICAgICBvdXRiX3AoMHhGRiwgbmljX2Jhc2UgKyBFTjBfSVNSKTsgLyogQ2xlYXIgYm9ndXMgaW50ci4gKi8KLSAgICByZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaXJxX3dyYXBwZXIsIElSUUZfU0hBUkVELCBkZXZfaW5mbywgZGV2KTsKKyAgICByZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaXJxX3dyYXBwZXIsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldik7CiAgICAgaWYgKHJldCkKIAkgICAgcmV0dXJuIHJldDsKIApAQCAtMTQ2NCw3ICsxNDYwLDYgQEAKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKICAgICB3aW5fcmVxX3QgcmVxOwotICAgIG1lbXJlcV90IG1lbTsKICAgICBpbnQgaSwgd2luZG93X3NpemUsIG9mZnNldCwgcmV0OwogCiAgICAgd2luZG93X3NpemUgPSAoc3RvcF9wZyAtIHN0YXJ0X3BnKSA8PCA4OwpAQCAtMTQ4MywxMSArMTQ3OCw5IEBACiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAKLSAgICBtZW0uQ2FyZE9mZnNldCA9IChzdGFydF9wZyA8PCA4KSArIGNtX29mZnNldDsKLSAgICBvZmZzZXQgPSBtZW0uQ2FyZE9mZnNldCAlIHdpbmRvd19zaXplOwotICAgIG1lbS5DYXJkT2Zmc2V0IC09IG9mZnNldDsKLSAgICBtZW0uUGFnZSA9IDA7Ci0gICAgcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsaW5rLT53aW4sICZtZW0pOworICAgIG9mZnNldCA9IChzdGFydF9wZyA8PCA4KSArIGNtX29mZnNldDsKKyAgICBvZmZzZXQgLT0gb2Zmc2V0ICUgd2luZG93X3NpemU7CisgICAgcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsaW5rLT53aW4sIG9mZnNldCk7CiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKaW5kZXggMzA3Y2QxNy4uMzc3MzY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC0zMjUsOSArMzI0LDggQEAKICAgICBsaW5rLT5wcml2ID0gZGV2OwogCiAgICAgc3Bpbl9sb2NrX2luaXQoJnNtYy0+bG9jayk7Ci0gICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDQ7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDE2OworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAKQEAgLTQyOCwxMiArNDI2LDEzIEBACiAJCQkJdm9pZCAqcHJpdl9kYXRhKQogewogCWludCBrOwotCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGNmLT5pby53aW5bMF0uYmFzZTsKIAlmb3IgKGsgPSAwOyBrIDwgMHg0MDA7IGsgKz0gMHgxMCkgewogCQlpZiAoayAmIDB4ODApCiAJCQljb250aW51ZTsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGsgXiAweDMwMDsKLQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBrIF4gMHgzMDA7CisJCXBfZGV2LT5pb19saW5lcyA9IDE2OworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ0NCwyMSArNDQzLDIwIEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgIHdpbl9yZXFfdCByZXE7Ci0gICAgbWVtcmVxX3QgbWVtOworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CiAgICAgaW50IGk7CiAKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKICAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwotICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLSAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSA4OworICAgIGxpbmstPnJlc291cmNlWzFdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5yZXNvdXJjZVsxXS0+ZW5kID0gODsKIAogICAgIC8qIFRoZSBNZWdhaGVydHogY29tYm8gY2FyZHMgaGF2ZSBtb2RlbS1saWtlIENJUyBlbnRyaWVzLCBzbwogICAgICAgIHdlIGhhdmUgdG8gZXhwbGljaXRseSB0cnkgYSBidW5jaCBvZiBwb3J0IGNvbWJpbmF0aW9ucy4gKi8KICAgICBpZiAocGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIG1oel9tZmNfY29uZmlnX2NoZWNrLCBOVUxMKSkKIAkgICAgcmV0dXJuIC1FTk9ERVY7CiAKLSAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKIAogICAgIC8qIEFsbG9jYXRlIGEgbWVtb3J5IHdpbmRvdywgZm9yIGFjY2Vzc2luZyB0aGUgSVNSICovCiAgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9BTXxXSU5fRU5BQkxFOwpAQCAtNDY5LDExICs0NjcsOCBAQAogCSAgICByZXR1cm4gLUVOT0RFVjsKIAogICAgIHNtYy0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKLSAgICBtZW0uQ2FyZE9mZnNldCA9IG1lbS5QYWdlID0gMDsKLSAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQotCW1lbS5DYXJkT2Zmc2V0ID0gbGluay0+Y29uZi5Db25maWdCYXNlOwotICAgIGkgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmssIGxpbmstPndpbiwgJm1lbSk7Ci0KKyAgICBvZmZzZXQgPSAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKSA/IGxpbmstPmNvbmYuQ29uZmlnQmFzZSA6IDA7CisgICAgaSA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbGluay0+d2luLCBvZmZzZXQpOwogICAgIGlmICgoaSA9PSAwKSAmJgogCShzbWMtPm1hbmZpZCA9PSBNQU5GSURfTUVHQUhFUlRaKSAmJgogCShzbWMtPmNhcmRpZCA9PSBQUk9ESURfTUVHQUhFUlRaX0VNMzI4OCkpCkBAIC01NDYsNyArNTQxLDcgQEAKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CiAgICAgdW5zaWduZWQgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwotICAgIHVuc2lnbmVkIGludCBpb3VhcnQgPSBsaW5rLT5pby5CYXNlUG9ydDI7CisgICAgdW5zaWduZWQgaW50IGlvdWFydCA9IGxpbmstPnJlc291cmNlWzFdLT5zdGFydDsKIAogICAgIC8qIFNldCBVQVJUIGJhc2UgYWRkcmVzcyBhbmQgZm9yY2UgbWFwIHdpdGggQ09SIGJpdCAxICovCiAgICAgd3JpdGViKGlvdWFydCAmIDB4ZmYsICAgICAgICBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19JT0JBU0VfMCk7CkBAIC02MDIsOSArNTk3LDkgQEAKIAkJCSAgIHVuc2lnbmVkIGludCB2Y2MsCiAJCQkgICB2b2lkICpwcml2X2RhdGEpCiB7Ci0JcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJcF9kZXYtPmlvX2xpbmVzID0gY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIGludCBzbWNfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQpAQCAtNjEyLDEwICs2MDcsMTAgQEAKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBpbnQgaTsKIAotICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAxNjsKICAgICBpID0gcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHNtY19jb25maWdjaGVjaywgTlVMTCk7CiAgICAgaWYgKCFpKQotCSAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwkgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKICAgICByZXR1cm4gaTsKIH0KQEAgLTY0NywyNyArNjQyLDI3IEBACiAKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKICAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwotICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDY0OwotICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0gICAgbGluay0+aW8uTnVtUG9ydHMyID0gODsKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworICAgIGxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA2NDsKKyAgICBsaW5rLT5yZXNvdXJjZVsxXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisgICAgbGluay0+cmVzb3VyY2VbMV0tPmVuZCA9IDg7CiAKICAgICAvKiBFbmFibGUgSGFyZCBEZWNvZGUsIExBTiwgTW9kZW0gKi8KICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHgyMzsKKyAgICBsaW5rLT5pb19saW5lcyA9IDE2OwogCiAgICAgZm9yIChpID0gaiA9IDA7IGogPCA0OyBqKyspIHsKLQlsaW5rLT5pby5CYXNlUG9ydDIgPSBjb21bal07Ci0JaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJbGluay0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gY29tW2pdOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKIAlpZiAoaSA9PSAwKQogCQlicmVhazsKICAgICB9CiAgICAgaWYgKGkgIT0gMCkgewogCS8qIEZhbGxiYWNrOiB0dXJuIG9mZiBoYXJkIGRlY29kZSAqLwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDAzOwotCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJbGluay0+cmVzb3VyY2VbMV0tPmVuZCA9IDA7CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogICAgIH0KLSAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MSArIDB4MTA7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweDEwOwogICAgIHJldHVybiBpOwogfQogCkBAIC02ODQsNyArNjc5LDcgQEAKIAogCS8qIERvd25sb2FkIHRoZSBTZXZlbiBvZiBEaWFtb25kcyBmaXJtd2FyZSAqLwogCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZTsgaSsrKSB7Ci0JICAgIG91dGIoZnctPmRhdGFbaV0sIGxpbmstPmlvLkJhc2VQb3J0MSArIDIpOworCSAgICBvdXRiKGZ3LT5kYXRhW2ldLCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAyKTsKIAkgICAgdWRlbGF5KDUwKTsKIAl9CiAJcmVsZWFzZV9maXJtd2FyZShmdyk7CkBAIC03MjYsMTIgKzcyMSwxMiBAQAogCQlyZXR1cm4gcmM7CiAgICAgfSBlbHNlIGlmIChtYW5maWQgPT0gTUFORklEX09TSVRFQ0gpIHsKIAkvKiBNYWtlIHN1cmUgYm90aCBmdW5jdGlvbnMgYXJlIHBvd2VyZWQgdXAgKi8KLQlzZXRfYml0cygweDMwMCwgbGluay0+aW8uQmFzZVBvcnQxICsgT1NJVEVDSF9BVUlfUFdSKTsKKwlzZXRfYml0cygweDMwMCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgT1NJVEVDSF9BVUlfUFdSKTsKIAkvKiBOb3csIHR1cm4gb24gdGhlIGludGVycnVwdCBmb3IgYm90aCBjYXJkIGZ1bmN0aW9ucyAqLwotCXNldF9iaXRzKDB4MzAwLCBsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX1JFU0VUX0lTUik7CisJc2V0X2JpdHMoMHgzMDAsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCArIE9TSVRFQ0hfUkVTRVRfSVNSKTsKIAlkZXZfZGJnKCZsaW5rLT5kZXYsICJBVUkvUFdSOiAlNC40eCBSRVNFVC9JU1I6ICU0LjR4XG4iLAotCSAgICAgIGludyhsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX0FVSV9QV1IpLAotCSAgICAgIGludyhsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX1JFU0VUX0lTUikpOworCSAgICAgIGludyhsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyBPU0lURUNIX0FVSV9QV1IpLAorCSAgICAgIGludyhsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyBPU0lURUNIX1JFU0VUX0lTUikpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTgwNCw3ICs3OTksNyBAQAogICAgIH0KIAogICAgIC8qIFRyeSBzZXR0aW5nIGJ1cyB3aWR0aCAqLwotICAgIHdpZHRoID0gKGxpbmstPmlvLkF0dHJpYnV0ZXMxID09IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPKTsKKyAgICB3aWR0aCA9IChsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgPT0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE8pOwogICAgIHMgPSBpbmIoaW9hZGRyICsgQ09ORklHKTsKICAgICBpZiAod2lkdGgpCiAJcyB8PSBDRkdfMTZCSVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwppbmRleCBiNmMzNjQ0OC4uNGViNmY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCkBAIC04Miw3ICs4Miw2IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtNjc4LDkgKzY3Nyw5IEBACiAKIAlpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCkgewogCQlmb3IgKGlvYWRkciA9IDB4MzAwOyBpb2FkZHIgPCAweDQwMDsgaW9hZGRyICs9IDB4MTApIHsKLQkJCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW9hZGRyOwotCQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gY2YtPmlvLndpblswXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvYWRkcjsKKwkJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpKQogCQkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNjk3LDExICs2OTYsMTEgQEAKIAlpbnQgKnBhc3MgPSBwcml2X2RhdGE7CiAKIAlpZiAoY2YtPmlvLm53aW4gPiAwICYmIChjZi0+aW8ud2luWzBdLmJhc2UgJiAweGYpID09IDgpIHsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IHBfZGV2LT5pby5CYXNlUG9ydDIKKwkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+c3RhcnQKIAkJCSsgKCpwYXNzID8gKGNmLT5pbmRleCAmIDB4MjAgPyAtMjQ6OCkKIAkJCSAgIDogKGNmLT5pbmRleCAmIDB4MjAgPyAgIDg6LTI0KSk7Ci0JCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTgwOCw4ICs4MDcsNyBAQAogCWdvdG8gZmFpbHVyZTsKICAgICB9CiAKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9MTA7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKICAgICBpZiAobG9jYWwtPm1vZGVtKSB7CiAJaW50IHBhc3M7CiAKQEAgLTgxNywxNiArODE1LDE2IEBACiAJICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwogCSAgICBsaW5rLT5jb25mLlN0YXR1cyB8PSBDQ1NSX0FVRElPX0VOQTsKIAl9Ci0JbGluay0+aW8uTnVtUG9ydHMyID0gODsKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWxpbmstPnJlc291cmNlWzFdLT5lbmQgPSA4OworCWxpbmstPnJlc291cmNlWzFdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKIAlpZiAobG9jYWwtPmRpbmdvKSB7CiAJICAgIC8qIFRha2UgdGhlIE1vZGVtIElPIHBvcnQgZnJvbSB0aGUgQ0lTIGFuZCBzY2FuIGZvciBhIGZyZWUKIAkgICAgICogRXRoZXJuZXQgcG9ydCAqLwotCSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsgLyogbm8gTWFrbyBzdHVmZiBhbnltb3JlICovCisJICAgIGxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAxNjsgLyogbm8gTWFrbyBzdHVmZiBhbnltb3JlICovCiAJICAgIGlmICghcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHhpcmMycHNfY29uZmlnX21vZGVtLCBOVUxMKSkKIAkJICAgIGdvdG8gcG9ydF9mb3VuZDsKIAl9IGVsc2UgewotCSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxODsKKwkgICAgbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IDE4OwogCSAgICAvKiBXZSBkbyAyIHBhc3NlcyBoZXJlOiBUaGUgZmlyc3Qgb25lIHVzZXMgdGhlIHJlZ3VsYXIgbWFwcGluZyBhbmQKIAkgICAgICogdGhlIHNlY29uZCB0cmllcyBhZ2FpbiwgdGhlcmVieSBjb25zaWRlcmluZyB0aGF0IHRoZSAzMiBwb3J0cyBhcmUKIAkgICAgICogbWlycm9yZWQgZXZlcnkgMzIgYnl0ZXMuIEFjdHVhbGx5IHdlIHVzZSBhIG1pcnJvcmVkIHBvcnQgZm9yCkBAIC04NDEsMTQgKzgzOSwxNSBAQAogCX0KIAlwcmludGsoS05PVF9YSVJDICJubyBwb3J0cyBhdmFpbGFibGVcbiIpOwogICAgIH0gZWxzZSB7Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisJbGluay0+aW9fbGluZXMgPSAxMDsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZW5kID0gMTY7CiAJZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKSB7Ci0JICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKLQkgICAgaWYgKCEoZXJyPXBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpKQorCSAgICBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPSBpb2FkZHI7CisJICAgIGlmICghKGVyciA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspKSkKIAkJZ290byBwb3J0X2ZvdW5kOwogCX0KLQlsaW5rLT5pby5CYXNlUG9ydDEgPSAwOyAvKiBsZXQgQ1MgZGVjaWRlICovCi0JaWYgKChlcnI9cGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSkpCisJbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gMDsgLyogbGV0IENTIGRlY2lkZSAqLworCWlmICgoZXJyID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaykpKQogCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKICAgICB9CiAgIHBvcnRfZm91bmQ6CkBAIC04NzAsMjQgKzg2OSwyMSBAQAogCWdvdG8gY29uZmlnX2Vycm9yOwogCiAgICAgaWYgKGxvY2FsLT5kaW5nbykgewotCWNvbmZfcmVnX3QgcmVnOwogCXdpbl9yZXFfdCByZXE7Ci0JbWVtcmVxX3QgbWVtOwogCiAJLyogUmVzZXQgdGhlIG1vZGVtJ3MgQkFSIHRvIHRoZSBjb3JyZWN0IHZhbHVlCiAJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBpbiB0aGUgUmVxdWVzdENvbmZpZ3VyYXRpb24gY2FsbCwKIAkgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBldGhlcm5ldCBwb3J0IChCYXNlUG9ydDEpIGlzIHdyaXR0ZW4KIAkgKiB0byB0aGUgQkFSIHJlZ2lzdGVycyBvZiB0aGUgbW9kZW0uCiAJICovCi0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfSU9CQVNFXzA7Ci0JcmVnLlZhbHVlID0gbGluay0+aW8uQmFzZVBvcnQyICYgMHhmZjsKLQlpZiAoKGVyciA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLCAmcmVnKSkpCisJZXJyID0gcGNtY2lhX3dyaXRlX2NvbmZpZ19ieXRlKGxpbmssIENJU1JFR19JT0JBU0VfMCwgKHU4KQorCQkJCWxpbmstPnJlc291cmNlWzFdLT5zdGFydCAmIDB4ZmYpOworCWlmIChlcnIpCiAJICAgIGdvdG8gY29uZmlnX2Vycm9yOwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0lPQkFTRV8xOwotCXJlZy5WYWx1ZSA9IChsaW5rLT5pby5CYXNlUG9ydDIgPj4gOCkgJiAweGZmOwotCWlmICgoZXJyID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmssICZyZWcpKSkKKworCWVyciA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShsaW5rLCBDSVNSRUdfSU9CQVNFXzEsCisJCQkJKGxpbmstPnJlc291cmNlWzFdLT5zdGFydCA+PiA4KSAmIDB4ZmYpOworCWlmIChlcnIpCiAJICAgIGdvdG8gY29uZmlnX2Vycm9yOwogCiAJLyogVGhlcmUgaXMgbm8gY29uZmlnIGVudHJ5IGZvciB0aGUgRXRoZXJuZXQgcGFydCB3aGljaApAQCAtOTAxLDE2ICs4OTcsMTQgQEAKIAkgICAgZ290byBjb25maWdfZXJyb3I7CiAKIAlsb2NhbC0+ZGluZ29fY2NyID0gaW9yZW1hcChyZXEuQmFzZSwweDEwMDApICsgMHgwODAwOwotCW1lbS5DYXJkT2Zmc2V0ID0gMHgwOwotCW1lbS5QYWdlID0gMDsKLQlpZiAoKGVyciA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbGluay0+d2luLCAmbWVtKSkpCisJaWYgKChlcnIgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmssIGxpbmstPndpbiwgMCkpKQogCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKIAogCS8qIFNldHVwIHRoZSBDQ1JzOyB0aGVyZSBhcmUgbm8gaW5mb3MgaW4gdGhlIENJUyBhYm91dCB0aGUgRXRoZXJuZXQKIAkgKiBwYXJ0LgogCSAqLwogCXdyaXRlYigweDQ3LCBsb2NhbC0+ZGluZ29fY2NyICsgQ0lTUkVHX0NPUik7Ci0JaW9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCWlvYWRkciA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKIAl3cml0ZWIoaW9hZGRyICYgMHhmZgkgICwgbG9jYWwtPmRpbmdvX2NjciArIENJU1JFR19JT0JBU0VfMCk7CiAJd3JpdGViKChpb2FkZHIgPj4gOCkmMHhmZiAsIGxvY2FsLT5kaW5nb19jY3IgKyBDSVNSRUdfSU9CQVNFXzEpOwogCkBAIC05NTcsNyArOTUxLDcgQEAKIAogICAgIC8qIHdlIGNhbiBub3cgcmVnaXN0ZXIgdGhlIGRldmljZSB3aXRoIHRoZSBuZXQgc3Vic3lzdGVtICovCiAgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnE7Ci0gICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKICAgICBpZiAobG9jYWwtPmRpbmdvKQogCWRvX3Jlc2V0KGRldiwgMSk7IC8qIGEga2x1ZGdlIHRvIG1ha2UgdGhlIGNlbTU2IHdvcmsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9icm9hZGNvbS5jIGIvZHJpdmVycy9uZXQvcGh5L2Jyb2FkY29tLmMKaW5kZXggY2VjZGJiZC4uNGFjY2Q4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2Jyb2FkY29tLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L2Jyb2FkY29tLmMKQEAgLTY4NSw3ICs2ODUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQxMV9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSAweDAwMjA2MDcwLAorCS5waHlfaWQJCT0gUEhZX0lEX0JDTTU0MTEsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKIAkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQxMSIsCiAJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfApAQCAtNzAwLDcgKzcwMCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQyMV9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSAweDAwMjA2MGUwLAorCS5waHlfaWQJCT0gUEhZX0lEX0JDTTU0MjEsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKIAkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQyMSIsCiAJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfApAQCAtNzE1LDcgKzcxNSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQ2MV9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSAweDAwMjA2MGMwLAorCS5waHlfaWQJCT0gUEhZX0lEX0JDTTU0NjEsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKIAkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQ2MSIsCiAJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfApAQCAtNzMwLDcgKzczMCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQ2NF9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSAweDAwMjA2MGIwLAorCS5waHlfaWQJCT0gUEhZX0lEX0JDTTU0NjQsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKIAkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQ2NCIsCiAJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfApAQCAtNzQ1LDcgKzc0NSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQ4MV9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSAweDAxNDNiY2EwLAorCS5waHlfaWQJCT0gUEhZX0lEX0JDTTU0ODEsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKIAkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQ4MSIsCiAJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfApAQCAtNzYwLDcgKzc2MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQ4Ml9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSAweDAxNDNiY2IwLAorCS5waHlfaWQJCT0gUEhZX0lEX0JDTTU0ODIsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKIAkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQ4MiIsCiAJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfApAQCAtODM0LDYgKzgzNCwyMSBAQAogCS5kcml2ZXIJCT0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIGJjbTUyNDFfZHJpdmVyID0geworCS5waHlfaWQJCT0gUEhZX0lEX0JDTTUyNDEsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTI0MSIsCisJLmZlYXR1cmVzCT0gUEhZX0JBU0lDX0ZFQVRVUkVTIHwKKwkJCSAgU1VQUE9SVEVEX1BhdXNlIHwgU1VQUE9SVEVEX0FzeW1fUGF1c2UsCisJLmZsYWdzCQk9IFBIWV9IQVNfTUFHSUNBTkVHIHwgUEhZX0hBU19JTlRFUlJVUFQsCisJLmNvbmZpZ19pbml0CT0gYnJjbV9mZXRfY29uZmlnX2luaXQsCisJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdAk9IGJyY21fZmV0X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0gYnJjbV9mZXRfY29uZmlnX2ludHIsCisJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFIH0sCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBicm9hZGNvbV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTg2OCw4ICs4ODMsMTMgQEAKIAlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZiY21hYzEzMV9kcml2ZXIpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2FjMTMxOworCXJldCA9IHBoeV9kcml2ZXJfcmVnaXN0ZXIoJmJjbTUyNDFfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF81MjQxOwogCXJldHVybiByZXQ7CiAKK291dF81MjQxOgorCXBoeV9kcml2ZXJfdW5yZWdpc3RlcigmYmNtYWMxMzFfZHJpdmVyKTsKIG91dF9hYzEzMToKIAlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTU3NzgwX2RyaXZlcik7CiBvdXRfNTc3ODA6CkBAIC04OTQsNiArOTE0LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGJyb2FkY29tX2V4aXQodm9pZCkKIHsKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTUyNDFfZHJpdmVyKTsKIAlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbWFjMTMxX2RyaXZlcik7CiAJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZiY201Nzc4MF9kcml2ZXIpOwogCXBoeV9kcml2ZXJfdW5yZWdpc3RlcigmYmNtNTA2MTBtX2RyaXZlcik7CkBAIC05MTAsMTYgKzkzMSwxNyBAQAogbW9kdWxlX2V4aXQoYnJvYWRjb21fZXhpdCk7CiAKIHN0YXRpYyBzdHJ1Y3QgbWRpb19kZXZpY2VfaWQgYnJvYWRjb21fdGJsW10gPSB7Ci0JeyAweDAwMjA2MDcwLCAweGZmZmZmZmYwIH0sCi0JeyAweDAwMjA2MGUwLCAweGZmZmZmZmYwIH0sCi0JeyAweDAwMjA2MGMwLCAweGZmZmZmZmYwIH0sCi0JeyAweDAwMjA2MGIwLCAweGZmZmZmZmYwIH0sCi0JeyAweDAxNDNiY2EwLCAweGZmZmZmZmYwIH0sCi0JeyAweDAxNDNiY2IwLCAweGZmZmZmZmYwIH0sCisJeyBQSFlfSURfQkNNNTQxMSwgMHhmZmZmZmZmMCB9LAorCXsgUEhZX0lEX0JDTTU0MjEsIDB4ZmZmZmZmZjAgfSwKKwl7IFBIWV9JRF9CQ001NDYxLCAweGZmZmZmZmYwIH0sCisJeyBQSFlfSURfQkNNNTQ2NCwgMHhmZmZmZmZmMCB9LAorCXsgUEhZX0lEX0JDTTU0ODIsIDB4ZmZmZmZmZjAgfSwKKwl7IFBIWV9JRF9CQ001NDgyLCAweGZmZmZmZmYwIH0sCiAJeyBQSFlfSURfQkNNNTA2MTAsIDB4ZmZmZmZmZjAgfSwKIAl7IFBIWV9JRF9CQ001MDYxME0sIDB4ZmZmZmZmZjAgfSwKIAl7IFBIWV9JRF9CQ001Nzc4MCwgMHhmZmZmZmZmMCB9LAogCXsgUEhZX0lEX0JDTUFDMTMxLCAweGZmZmZmZmYwIH0sCisJeyBQSFlfSURfQkNNNTI0MSwgMHhmZmZmZmZmMCB9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L2ljcGx1cy5jIGIvZHJpdmVycy9uZXQvcGh5L2ljcGx1cy5jCmluZGV4IDQzOWFkYWYuLjNmMjU4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9pY3BsdXMuYworKysgYi9kcml2ZXJzL25ldC9waHkvaWNwbHVzLmMKQEAgLTExNiw2ICsxMTYsOCBAQAogCS5jb25maWdfaW5pdAk9ICZpcDE3NWNfY29uZmlnX2luaXQsCiAJLmNvbmZpZ19hbmVnCT0gJmlwMTc1Y19jb25maWdfYW5lZywKIAkucmVhZF9zdGF0dXMJPSAmaXAxNzVjX3JlYWRfc3RhdHVzLAorCS5zdXNwZW5kCT0gZ2VucGh5X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBnZW5waHlfcmVzdW1lLAogCS5kcml2ZXIJCT0geyAub3duZXIgPSBUSElTX01PRFVMRSx9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21hcnZlbGwuYyBiL2RyaXZlcnMvbmV0L3BoeS9tYXJ2ZWxsLmMKaW5kZXggNzhiNzRlOC4uMDEwMWYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21hcnZlbGwuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWFydmVsbC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L21hcnZlbGxfcGh5Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC00OCw4ICs0OSw2IEBACiAjZGVmaW5lIE1JSV9NMTE0NV9SR01JSV9SWF9ERUxBWQkweDAwODAKICNkZWZpbmUgTUlJX00xMTQ1X1JHTUlJX1RYX0RFTEFZCTB4MDAwMgogCi0jZGVmaW5lIE0xMTQ1X0RFVl9GTEFHU19SRVNJU1RBTkNFCTB4MDAwMDAwMDEKLQogI2RlZmluZSBNSUlfTTExMTFfUEhZX0xFRF9DT05UUk9MCTB4MTgKICNkZWZpbmUgTUlJX00xMTExX1BIWV9MRURfRElSRUNUCTB4NDEwMAogI2RlZmluZSBNSUlfTTExMTFfUEhZX0xFRF9DT01CSU5FCTB4NDExYwpAQCAtNjksNiArNjgsMTUgQEAKICNkZWZpbmUgTUlJX00xMTExX0NPUFBFUgkJMAogI2RlZmluZSBNSUlfTTExMTFfRklCRVIJCQkxCiAKKyNkZWZpbmUgTUlJXzg4RTExMjFfUEhZX01TQ1JfUEFHRQkyCisjZGVmaW5lIE1JSV84OEUxMTIxX1BIWV9NU0NSX1JFRwkyMQorI2RlZmluZSBNSUlfODhFMTEyMV9QSFlfTVNDUl9SWF9ERUxBWQlCSVQoNSkKKyNkZWZpbmUgTUlJXzg4RTExMjFfUEhZX01TQ1JfVFhfREVMQVkJQklUKDQpCisjZGVmaW5lIE1JSV84OEUxMTIxX1BIWV9NU0NSX0RFTEFZX01BU0sJKH4oMHgzIDw8IDQpKQorCisjZGVmaW5lIE1JSV84OEVDMDQ4X1BIWV9NU0NSMV9SRUcJMTYKKyNkZWZpbmUgTUlJXzg4RUMwNDhfUEhZX01TQ1IxX1BBRF9PREQJQklUKDYpCisKICNkZWZpbmUgTUlJXzg4RTExMjFfUEhZX0xFRF9DVFJMCTE2CiAjZGVmaW5lIE1JSV84OEUxMTIxX1BIWV9MRURfUEFHRQkzCiAjZGVmaW5lIE1JSV84OEUxMTIxX1BIWV9MRURfREVGCQkweDAwMzAKQEAgLTE4MCw3ICsxODgsMzAgQEAKIAogc3RhdGljIGludCBtODhlMTEyMV9jb25maWdfYW5lZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewotCWludCBlcnIsIHRlbXA7CisJaW50IGVyciwgb2xkcGFnZSwgbXNjcjsKKworCW9sZHBhZ2UgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV84OEUxMTIxX1BIWV9QQUdFKTsKKworCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV84OEUxMTIxX1BIWV9QQUdFLAorCQkJTUlJXzg4RTExMjFfUEhZX01TQ1JfUEFHRSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJbXNjciA9IHBoeV9yZWFkKHBoeWRldiwgTUlJXzg4RTExMjFfUEhZX01TQ1JfUkVHKSAmCisJCU1JSV84OEUxMTIxX1BIWV9NU0NSX0RFTEFZX01BU0s7CisKKwlpZiAocGh5ZGV2LT5pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lEKQorCQltc2NyIHw9IChNSUlfODhFMTEyMV9QSFlfTVNDUl9SWF9ERUxBWSB8CisJCQkgTUlJXzg4RTExMjFfUEhZX01TQ1JfVFhfREVMQVkpOworCWVsc2UgaWYgKHBoeWRldi0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9SWElEKQorCQltc2NyIHw9IE1JSV84OEUxMTIxX1BIWV9NU0NSX1JYX0RFTEFZOworCWVsc2UgaWYgKHBoeWRldi0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElEKQorCQltc2NyIHw9IE1JSV84OEUxMTIxX1BIWV9NU0NSX1RYX0RFTEFZOworCisJZXJyID0gcGh5X3dyaXRlKHBoeWRldiwgTUlJXzg4RTExMjFfUEhZX01TQ1JfUkVHLCBtc2NyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBoeV93cml0ZShwaHlkZXYsIE1JSV84OEUxMTIxX1BIWV9QQUdFLCBvbGRwYWdlKTsKIAogCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTE5MSwxNyArMjIyLDQyIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQl0ZW1wID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfODhFMTEyMV9QSFlfUEFHRSk7CisJb2xkcGFnZSA9IHBoeV9yZWFkKHBoeWRldiwgTUlJXzg4RTExMjFfUEhZX1BBR0UpOwogCiAJcGh5X3dyaXRlKHBoeWRldiwgTUlJXzg4RTExMjFfUEhZX1BBR0UsIE1JSV84OEUxMTIxX1BIWV9MRURfUEFHRSk7CiAJcGh5X3dyaXRlKHBoeWRldiwgTUlJXzg4RTExMjFfUEhZX0xFRF9DVFJMLCBNSUlfODhFMTEyMV9QSFlfTEVEX0RFRik7Ci0JcGh5X3dyaXRlKHBoeWRldiwgTUlJXzg4RTExMjFfUEhZX1BBR0UsIHRlbXApOworCXBoeV93cml0ZShwaHlkZXYsIE1JSV84OEUxMTIxX1BIWV9QQUdFLCBvbGRwYWdlKTsKIAogCWVyciA9IGdlbnBoeV9jb25maWdfYW5lZyhwaHlkZXYpOwogCiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBtODhlYzA0OF9jb25maWdfYW5lZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCBlcnIsIG9sZHBhZ2UsIG1zY3I7CisKKwlvbGRwYWdlID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfODhFMTEyMV9QSFlfUEFHRSk7CisKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfODhFMTEyMV9QSFlfUEFHRSwKKwkJCU1JSV84OEUxMTIxX1BIWV9NU0NSX1BBR0UpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbXNjciA9IHBoeV9yZWFkKHBoeWRldiwgTUlJXzg4RUMwNDhfUEhZX01TQ1IxX1JFRyk7CisJbXNjciB8PSBNSUlfODhFQzA0OF9QSFlfTVNDUjFfUEFEX09ERDsKKworCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV84OEUxMTIxX1BIWV9NU0NSX1JFRywgbXNjcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfODhFMTEyMV9QSFlfUEFHRSwgb2xkcGFnZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbTg4ZTExMjFfY29uZmlnX2FuZWcocGh5ZGV2KTsKK30KKwogc3RhdGljIGludCBtODhlMTExMV9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWludCBlcnI7CkBAIC0zNTAsNyArNDA2LDEwIEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBBZGp1c3QgTEVEIENvbnRyb2wgKi8KLQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCAweDEwLCAweDAyMWUpOworCWlmIChwaHlkZXYtPmRldl9mbGFncyAmIE1BUlZFTExfUEhZX00xMTE4X0ROUzMyM19MRURTKQorCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCAweDEwLCAweDExMDApOworCWVsc2UKKwkJZXJyID0gcGh5X3dyaXRlKHBoeWRldiwgMHgxMCwgMHgwMjFlKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzk4LDcgKzQ1Nyw3IEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAotCQlpZiAocGh5ZGV2LT5kZXZfZmxhZ3MgJiBNMTE0NV9ERVZfRkxBR1NfUkVTSVNUQU5DRSkgeworCQlpZiAocGh5ZGV2LT5kZXZfZmxhZ3MgJiBNQVJWRUxMX1BIWV9NMTE0NV9GTEFHU19SRVNJU1RBTkNFKSB7CiAJCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCAweDFkLCAweDAwMTIpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKQEAgLTUyOSw4ICs1ODgsOCBAQAogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgbWFydmVsbF9kcml2ZXJzW10gPSB7CiAJewotCQkucGh5X2lkID0gMHgwMTQxMGM2MCwKLQkJLnBoeV9pZF9tYXNrID0gMHhmZmZmZmZmMCwKKwkJLnBoeV9pZCA9IE1BUlZFTExfUEhZX0lEXzg4RTExMDEsCisJCS5waHlfaWRfbWFzayA9IE1BUlZFTExfUEhZX0lEX01BU0ssCiAJCS5uYW1lID0gIk1hcnZlbGwgODhFMTEwMSIsCiAJCS5mZWF0dXJlcyA9IFBIWV9HQklUX0ZFQVRVUkVTLAogCQkuZmxhZ3MgPSBQSFlfSEFTX0lOVEVSUlVQVCwKQEAgLTU0MSw4ICs2MDAsOCBAQAogCQkuZHJpdmVyID0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAogCX0sCiAJewotCQkucGh5X2lkID0gMHgwMTQxMGM5MCwKLQkJLnBoeV9pZF9tYXNrID0gMHhmZmZmZmZmMCwKKwkJLnBoeV9pZCA9IE1BUlZFTExfUEhZX0lEXzg4RTExMTIsCisJCS5waHlfaWRfbWFzayA9IE1BUlZFTExfUEhZX0lEX01BU0ssCiAJCS5uYW1lID0gIk1hcnZlbGwgODhFMTExMiIsCiAJCS5mZWF0dXJlcyA9IFBIWV9HQklUX0ZFQVRVUkVTLAogCQkuZmxhZ3MgPSBQSFlfSEFTX0lOVEVSUlVQVCwKQEAgLTU1NCw4ICs2MTMsOCBAQAogCQkuZHJpdmVyID0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAogCX0sCiAJewotCQkucGh5X2lkID0gMHgwMTQxMGNjMCwKLQkJLnBoeV9pZF9tYXNrID0gMHhmZmZmZmZmMCwKKwkJLnBoeV9pZCA9IE1BUlZFTExfUEhZX0lEXzg4RTExMTEsCisJCS5waHlfaWRfbWFzayA9IE1BUlZFTExfUEhZX0lEX01BU0ssCiAJCS5uYW1lID0gIk1hcnZlbGwgODhFMTExMSIsCiAJCS5mZWF0dXJlcyA9IFBIWV9HQklUX0ZFQVRVUkVTLAogCQkuZmxhZ3MgPSBQSFlfSEFTX0lOVEVSUlVQVCwKQEAgLTU2Nyw4ICs2MjYsOCBAQAogCQkuZHJpdmVyID0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAogCX0sCiAJewotCQkucGh5X2lkID0gMHgwMTQxMGUxMCwKLQkJLnBoeV9pZF9tYXNrID0gMHhmZmZmZmZmMCwKKwkJLnBoeV9pZCA9IE1BUlZFTExfUEhZX0lEXzg4RTExMTgsCisJCS5waHlfaWRfbWFzayA9IE1BUlZFTExfUEhZX0lEX01BU0ssCiAJCS5uYW1lID0gIk1hcnZlbGwgODhFMTExOCIsCiAJCS5mZWF0dXJlcyA9IFBIWV9HQklUX0ZFQVRVUkVTLAogCQkuZmxhZ3MgPSBQSFlfSEFTX0lOVEVSUlVQVCwKQEAgLTU4MCw4ICs2MzksOCBAQAogCQkuZHJpdmVyID0gey5vd25lciA9IFRISVNfTU9EVUxFLH0sCiAJfSwKIAl7Ci0JCS5waHlfaWQgPSAweDAxNDEwY2IwLAotCQkucGh5X2lkX21hc2sgPSAweGZmZmZmZmYwLAorCQkucGh5X2lkID0gTUFSVkVMTF9QSFlfSURfODhFMTEyMVIsCisJCS5waHlfaWRfbWFzayA9IE1BUlZFTExfUEhZX0lEX01BU0ssCiAJCS5uYW1lID0gIk1hcnZlbGwgODhFMTEyMVIiLAogCQkuZmVhdHVyZXMgPSBQSFlfR0JJVF9GRUFUVVJFUywKIAkJLmZsYWdzID0gUEhZX0hBU19JTlRFUlJVUFQsCkBAIC01OTMsOCArNjUyLDIxIEBACiAJCS5kcml2ZXIgPSB7IC5vd25lciA9IFRISVNfTU9EVUxFIH0sCiAJfSwKIAl7Ci0JCS5waHlfaWQgPSAweDAxNDEwY2QwLAotCQkucGh5X2lkX21hc2sgPSAweGZmZmZmZmYwLAorCQkucGh5X2lkID0gTUFSVkVMTF9QSFlfSURfODhFQzA0OCwKKwkJLnBoeV9pZF9tYXNrID0gTUFSVkVMTF9QSFlfSURfTUFTSywKKwkJLm5hbWUgPSAiTWFydmVsbCA4OEVDMDQ4IiwKKwkJLmZlYXR1cmVzID0gUEhZX0dCSVRfRkVBVFVSRVMsCisJCS5mbGFncyA9IFBIWV9IQVNfSU5URVJSVVBULAorCQkuY29uZmlnX2FuZWcgPSAmbTg4ZWMwNDhfY29uZmlnX2FuZWcsCisJCS5yZWFkX3N0YXR1cyA9ICZtYXJ2ZWxsX3JlYWRfc3RhdHVzLAorCQkuYWNrX2ludGVycnVwdCA9ICZtYXJ2ZWxsX2Fja19pbnRlcnJ1cHQsCisJCS5jb25maWdfaW50ciA9ICZtYXJ2ZWxsX2NvbmZpZ19pbnRyLAorCQkuZGlkX2ludGVycnVwdCA9ICZtODhlMTEyMV9kaWRfaW50ZXJydXB0LAorCQkuZHJpdmVyID0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAorCX0sCisJeworCQkucGh5X2lkID0gTUFSVkVMTF9QSFlfSURfODhFMTE0NSwKKwkJLnBoeV9pZF9tYXNrID0gTUFSVkVMTF9QSFlfSURfTUFTSywKIAkJLm5hbWUgPSAiTWFydmVsbCA4OEUxMTQ1IiwKIAkJLmZlYXR1cmVzID0gUEhZX0dCSVRfRkVBVFVSRVMsCiAJCS5mbGFncyA9IFBIWV9IQVNfSU5URVJSVVBULApAQCAtNjA2LDggKzY3OCw4IEBACiAJCS5kcml2ZXIgPSB7IC5vd25lciA9IFRISVNfTU9EVUxFIH0sCiAJfSwKIAl7Ci0JCS5waHlfaWQgPSAweDAxNDEwZTMwLAotCQkucGh5X2lkX21hc2sgPSAweGZmZmZmZmYwLAorCQkucGh5X2lkID0gTUFSVkVMTF9QSFlfSURfODhFMTI0MCwKKwkJLnBoeV9pZF9tYXNrID0gTUFSVkVMTF9QSFlfSURfTUFTSywKIAkJLm5hbWUgPSAiTWFydmVsbCA4OEUxMjQwIiwKIAkJLmZlYXR1cmVzID0gUEhZX0dCSVRfRkVBVFVSRVMsCiAJCS5mbGFncyA9IFBIWV9IQVNfSU5URVJSVVBULApAQCAtNjU3LDYgKzcyOSw3IEBACiAJeyAweDAxNDEwY2IwLCAweGZmZmZmZmYwIH0sCiAJeyAweDAxNDEwY2QwLCAweGZmZmZmZmYwIH0sCiAJeyAweDAxNDEwZTMwLCAweGZmZmZmZmYwIH0sCisJeyAweDAxNDEwZTkwLCAweGZmZmZmZmYwIH0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby1vY3Rlb24uYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLW9jdGVvbi5jCmluZGV4IGY0NDNkNDMuLmJkMTJiYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvLW9jdGVvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLW9jdGVvbi5jCkBAIC04NSw3ICs4NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IG9jdGVvbl9tZGlvYnVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvY3Rlb25fbWRpb2J1c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBvY3Rlb25fbWRpb2J1cyAqYnVzOwogCXVuaW9uIGN2bXhfc21peF9lbiBzbWlfZW47CkBAIC0xNDMsNyArMTQzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBvY3Rlb25fbWRpb2J1c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9jdGVvbl9tZGlvYnVzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBvY3Rlb25fbWRpb2J1cyAqYnVzOwogCXVuaW9uIGN2bXhfc21peF9lbiBzbWlfZW47CkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlCQk9IG9jdGVvbl9tZGlvYnVzX3Byb2JlLAotCS5yZW1vdmUJCT0gX19leGl0X3Aob2N0ZW9uX21kaW9idXNfcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9jdGVvbl9tZGlvYnVzX3JlbW92ZSksCiB9OwogCiB2b2lkIG9jdGVvbl9tZGlvYnVzX2ZvcmNlX21vZF9kZXBlbmNlbmN5KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMgYi9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMKaW5kZXggMDY5MmY3NS4uOGJiN2RiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9taWNyZWwuYwpAQCAtMTIsNyArMTIsOCBAQAogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqIFN1cHBvcnQgOiBrc3o5MDIxICwgdnNjODIwMSwga3M4MDAxCisgKiBTdXBwb3J0IDoga3N6OTAyMSAxMDAwLzEwMC8xMCBwaHkgZnJvbSBNaWNyZWwKKyAqCQlrczgwMDEsIGtzODczNywga3M4NzIxLCBrczgwNDEsIGtzODA1MSAxMDAvMTAgcGh5CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjAsMzcgKzIxLDE0NiBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogCiAjZGVmaW5lCVBIWV9JRF9LU1o5MDIxCQkJMHgwMDIyMTYxMQotI2RlZmluZQlQSFlfSURfVlNDODIwMQkJCTB4MDAwRkM0MTMKKyNkZWZpbmUJUEhZX0lEX0tTODczNwkJCTB4MDAyMjE3MjAKKyNkZWZpbmUJUEhZX0lEX0tTODA0MQkJCTB4MDAyMjE1MTAKKyNkZWZpbmUJUEhZX0lEX0tTODA1MQkJCTB4MDAyMjE1NTAKKy8qIGJvdGggZm9yIGtzODAwMSBSZXYuIEEvQiwgYW5kIGZvciBrczg3MjEgUmV2IDMuICovCiAjZGVmaW5lCVBIWV9JRF9LUzgwMDEJCQkweDAwMjIxNjFBCiAKKy8qIGdlbmVyYWwgSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJlZyBpbiB2ZW5kb3Igc3BlY2lmaWMgYmxvY2suICovCisjZGVmaW5lIE1JSV9LU1pQSFlfSU5UQ1MJCQkweDFCCisjZGVmaW5lCUtTWlBIWV9JTlRDU19KQUJCRVIJCQkoMSA8PCAxNSkKKyNkZWZpbmUJS1NaUEhZX0lOVENTX1JFQ0VJVkVfRVJSCQkoMSA8PCAxNCkKKyNkZWZpbmUJS1NaUEhZX0lOVENTX1BBR0VfUkVDRUlWRQkJKDEgPDwgMTMpCisjZGVmaW5lCUtTWlBIWV9JTlRDU19QQVJFTExFTAkJCSgxIDw8IDEyKQorI2RlZmluZQlLU1pQSFlfSU5UQ1NfTElOS19QQVJUTkVSX0FDSwkJKDEgPDwgMTEpCisjZGVmaW5lCUtTWlBIWV9JTlRDU19MSU5LX0RPV04JCQkoMSA8PCAxMCkKKyNkZWZpbmUJS1NaUEhZX0lOVENTX1JFTU9URV9GQVVMVAkJKDEgPDwgOSkKKyNkZWZpbmUJS1NaUEhZX0lOVENTX0xJTktfVVAJCQkoMSA8PCA4KQorI2RlZmluZQlLU1pQSFlfSU5UQ1NfQUxMCQkJKEtTWlBIWV9JTlRDU19MSU5LX1VQIHxcCisJCQkJCQlLU1pQSFlfSU5UQ1NfTElOS19ET1dOKQorCisvKiBnZW5lcmFsIFBIWSBjb250cm9sIHJlZyBpbiB2ZW5kb3Igc3BlY2lmaWMgYmxvY2suICovCisjZGVmaW5lCU1JSV9LU1pQSFlfQ1RSTAkJCTB4MUYKKy8qIGJpdG1hcCBvZiBQSFkgcmVnaXN0ZXIgdG8gc2V0IGludGVycnVwdCBtb2RlICovCisjZGVmaW5lIEtTWlBIWV9DVFJMX0lOVF9BQ1RJVkVfSElHSAkJKDEgPDwgOSkKKyNkZWZpbmUgS1NaOTAyMV9DVFJMX0lOVF9BQ1RJVkVfSElHSAkJKDEgPDwgMTQpCisjZGVmaW5lIEtTODczN19DVFJMX0lOVF9BQ1RJVkVfSElHSAkJKDEgPDwgMTQpCisKK3N0YXRpYyBpbnQga3N6cGh5X2Fja19pbnRlcnJ1cHQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwkvKiBiaXRbNy4uMF0gaW50IHN0YXR1cywgd2hpY2ggaXMgYSByZWFkIGFuZCBjbGVhciByZWdpc3Rlci4gKi8KKwlpbnQgcmM7CisKKwlyYyA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0tTWlBIWV9JTlRDUyk7CisKKwlyZXR1cm4gKHJjIDwgMCkgPyByYyA6IDA7Cit9CisKK3N0YXRpYyBpbnQga3N6cGh5X3NldF9pbnRlcnJ1cHQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgdGVtcDsKKwl0ZW1wID0gKFBIWV9JTlRFUlJVUFRfRU5BQkxFRCA9PSBwaHlkZXYtPmludGVycnVwdHMpID8KKwkJS1NaUEhZX0lOVENTX0FMTCA6IDA7CisJcmV0dXJuIHBoeV93cml0ZShwaHlkZXYsIE1JSV9LU1pQSFlfSU5UQ1MsIHRlbXApOworfQorCitzdGF0aWMgaW50IGtzenBoeV9jb25maWdfaW50cihzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCB0ZW1wLCByYzsKKworCS8qIHNldCB0aGUgaW50ZXJydXB0IHBpbiBhY3RpdmUgbG93ICovCisJdGVtcCA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0tTWlBIWV9DVFJMKTsKKwl0ZW1wICY9IH5LU1pQSFlfQ1RSTF9JTlRfQUNUSVZFX0hJR0g7CisJcGh5X3dyaXRlKHBoeWRldiwgTUlJX0tTWlBIWV9DVFJMLCB0ZW1wKTsKKwlyYyA9IGtzenBoeV9zZXRfaW50ZXJydXB0KHBoeWRldik7CisJcmV0dXJuIHJjIDwgMCA/IHJjIDogMDsKK30KKworc3RhdGljIGludCBrc3o5MDIxX2NvbmZpZ19pbnRyKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHRlbXAsIHJjOworCisJLyogc2V0IHRoZSBpbnRlcnJ1cHQgcGluIGFjdGl2ZSBsb3cgKi8KKwl0ZW1wID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfS1NaUEhZX0NUUkwpOworCXRlbXAgJj0gfktTWjkwMjFfQ1RSTF9JTlRfQUNUSVZFX0hJR0g7CisJcGh5X3dyaXRlKHBoeWRldiwgTUlJX0tTWlBIWV9DVFJMLCB0ZW1wKTsKKwlyYyA9IGtzenBoeV9zZXRfaW50ZXJydXB0KHBoeWRldik7CisJcmV0dXJuIHJjIDwgMCA/IHJjIDogMDsKK30KKworc3RhdGljIGludCBrczg3MzdfY29uZmlnX2ludHIoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgdGVtcCwgcmM7CisKKwkvKiBzZXQgdGhlIGludGVycnVwdCBwaW4gYWN0aXZlIGxvdyAqLworCXRlbXAgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9LU1pQSFlfQ1RSTCk7CisJdGVtcCAmPSB+S1M4NzM3X0NUUkxfSU5UX0FDVElWRV9ISUdIOworCXBoeV93cml0ZShwaHlkZXYsIE1JSV9LU1pQSFlfQ1RSTCwgdGVtcCk7CisJcmMgPSBrc3pwaHlfc2V0X2ludGVycnVwdChwaHlkZXYpOworCXJldHVybiByYyA8IDAgPyByYyA6IDA7Cit9CiAKIHN0YXRpYyBpbnQga3N6cGh5X2NvbmZpZ19pbml0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIGtzODAwMV9kcml2ZXIgPSB7Ci0JLnBoeV9pZAkJPSBQSFlfSURfS1M4MDAxLAotCS5uYW1lCQk9ICJNaWNyZWwgS1M4MDAxIiwKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBrczg3MzdfZHJpdmVyID0geworCS5waHlfaWQJCT0gUEhZX0lEX0tTODczNywKIAkucGh5X2lkX21hc2sJPSAweDAwZmZmZmYwLAotCS5mZWF0dXJlcwk9IFBIWV9CQVNJQ19GRUFUVVJFUywKLQkuZmxhZ3MJCT0gUEhZX1BPTEwsCisJLm5hbWUJCT0gIk1pY3JlbCBLUzg3MzciLAorCS5mZWF0dXJlcwk9IChQSFlfQkFTSUNfRkVBVFVSRVMgfCBTVVBQT1JURURfUGF1c2UpLAorCS5mbGFncwkJPSBQSFlfSEFTX01BR0lDQU5FRyB8IFBIWV9IQVNfSU5URVJSVVBULAogCS5jb25maWdfaW5pdAk9IGtzenBoeV9jb25maWdfaW5pdCwKIAkuY29uZmlnX2FuZWcJPSBnZW5waHlfY29uZmlnX2FuZWcsCiAJLnJlYWRfc3RhdHVzCT0gZ2VucGh5X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0ga3N6cGh5X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0ga3M4NzM3X2NvbmZpZ19pbnRyLAogCS5kcml2ZXIJCT0geyAub3duZXIgPSBUSElTX01PRFVMRSx9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIHZzYzgyMDFfZHJpdmVyID0gewotCS5waHlfaWQJCT0gUEhZX0lEX1ZTQzgyMDEsCi0JLm5hbWUJCT0gIk1pY3JlbCBWU0M4MjAxIiwKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBrczgwNDFfZHJpdmVyID0geworCS5waHlfaWQJCT0gUEhZX0lEX0tTODA0MSwKIAkucGh5X2lkX21hc2sJPSAweDAwZmZmZmYwLAotCS5mZWF0dXJlcwk9IFBIWV9CQVNJQ19GRUFUVVJFUywKLQkuZmxhZ3MJCT0gUEhZX1BPTEwsCisJLm5hbWUJCT0gIk1pY3JlbCBLUzgwNDEiLAorCS5mZWF0dXJlcwk9IChQSFlfQkFTSUNfRkVBVFVSRVMgfCBTVVBQT1JURURfUGF1c2UKKwkJCQl8IFNVUFBPUlRFRF9Bc3ltX1BhdXNlKSwKKwkuZmxhZ3MJCT0gUEhZX0hBU19NQUdJQ0FORUcgfCBQSFlfSEFTX0lOVEVSUlVQVCwKIAkuY29uZmlnX2luaXQJPSBrc3pwaHlfY29uZmlnX2luaXQsCiAJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAogCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdAk9IGtzenBoeV9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9IGtzenBoeV9jb25maWdfaW50ciwKKwkuZHJpdmVyCQk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBrczgwNTFfZHJpdmVyID0geworCS5waHlfaWQJCT0gUEhZX0lEX0tTODA1MSwKKwkucGh5X2lkX21hc2sJPSAweDAwZmZmZmYwLAorCS5uYW1lCQk9ICJNaWNyZWwgS1M4MDUxIiwKKwkuZmVhdHVyZXMJPSAoUEhZX0JBU0lDX0ZFQVRVUkVTIHwgU1VQUE9SVEVEX1BhdXNlCisJCQkJfCBTVVBQT1JURURfQXN5bV9QYXVzZSksCisJLmZsYWdzCQk9IFBIWV9IQVNfTUFHSUNBTkVHIHwgUEhZX0hBU19JTlRFUlJVUFQsCisJLmNvbmZpZ19pbml0CT0ga3N6cGh5X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZwk9IGdlbnBoeV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSBrc3pwaHlfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIJPSBrc3pwaHlfY29uZmlnX2ludHIsCisJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLH0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIga3M4MDAxX2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IFBIWV9JRF9LUzgwMDEsCisJLm5hbWUJCT0gIk1pY3JlbCBLUzgwMDEgb3IgS1M4NzIxIiwKKwkucGh5X2lkX21hc2sJPSAweDAwZmZmZmYwLAorCS5mZWF0dXJlcwk9IChQSFlfQkFTSUNfRkVBVFVSRVMgfCBTVVBQT1JURURfUGF1c2UpLAorCS5mbGFncwkJPSBQSFlfSEFTX01BR0lDQU5FRyB8IFBIWV9IQVNfSU5URVJSVVBULAorCS5jb25maWdfaW5pdAk9IGtzenBoeV9jb25maWdfaW5pdCwKKwkuY29uZmlnX2FuZWcJPSBnZW5waHlfY29uZmlnX2FuZWcsCisJLnJlYWRfc3RhdHVzCT0gZ2VucGh5X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0ga3N6cGh5X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0ga3N6cGh5X2NvbmZpZ19pbnRyLAogCS5kcml2ZXIJCT0geyAub3duZXIgPSBUSElTX01PRFVMRSx9LAogfTsKIApAQCAtNTgsMTEgKzE2OCwxNCBAQAogCS5waHlfaWQJCT0gUEhZX0lEX0tTWjkwMjEsCiAJLnBoeV9pZF9tYXNrCT0gMHgwMDBmZmYxMCwKIAkubmFtZQkJPSAiTWljcmVsIEtTWjkwMjEgR2lnYWJpdCBQSFkiLAotCS5mZWF0dXJlcwk9IFBIWV9HQklUX0ZFQVRVUkVTIHwgU1VQUE9SVEVEX1BhdXNlLAotCS5mbGFncwkJPSBQSFlfUE9MTCwKKwkuZmVhdHVyZXMJPSAoUEhZX0dCSVRfRkVBVFVSRVMgfCBTVVBQT1JURURfUGF1c2UKKwkJCQl8IFNVUFBPUlRFRF9Bc3ltX1BhdXNlKSwKKwkuZmxhZ3MJCT0gUEhZX0hBU19NQUdJQ0FORUcgfCBQSFlfSEFTX0lOVEVSUlVQVCwKIAkuY29uZmlnX2luaXQJPSBrc3pwaHlfY29uZmlnX2luaXQsCiAJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAogCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdAk9IGtzenBoeV9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9IGtzejkwMjFfY29uZmlnX2ludHIsCiAJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLCB9LAogfTsKIApAQCAtNzMsMTcgKzE4NiwyOSBAQAogCXJldCA9IHBoeV9kcml2ZXJfcmVnaXN0ZXIoJmtzODAwMV9kcml2ZXIpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyMTsKLQlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZ2c2M4MjAxX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnIyOwogCiAJcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3Rlcigma3N6OTAyMV9kcml2ZXIpOwogCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKworCXJldCA9IHBoeV9kcml2ZXJfcmVnaXN0ZXIoJmtzODczN19kcml2ZXIpOworCWlmIChyZXQpCiAJCWdvdG8gZXJyMzsKKwlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZrczgwNDFfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjQ7CisJcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3Rlcigma3M4MDUxX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnI1OworCiAJcmV0dXJuIDA7CiAKK2VycjU6CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZrczgwNDFfZHJpdmVyKTsKK2VycjQ6CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZrczg3MzdfZHJpdmVyKTsKIGVycjM6Ci0JcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZ2c2M4MjAxX2RyaXZlcik7CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZrc3o5MDIxX2RyaXZlcik7CiBlcnIyOgogCXBoeV9kcml2ZXJfdW5yZWdpc3Rlcigma3M4MDAxX2RyaXZlcik7CiBlcnIxOgpAQCAtOTMsOCArMjE4LDEwIEBACiBzdGF0aWMgdm9pZCBfX2V4aXQga3NwaHlfZXhpdCh2b2lkKQogewogCXBoeV9kcml2ZXJfdW5yZWdpc3Rlcigma3M4MDAxX2RyaXZlcik7Ci0JcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZ2c2M4MjAxX2RyaXZlcik7CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZrczg3MzdfZHJpdmVyKTsKIAlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmtzejkwMjFfZHJpdmVyKTsKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmtzODA0MV9kcml2ZXIpOworCXBoeV9kcml2ZXJfdW5yZWdpc3Rlcigma3M4MDUxX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGtzcGh5X2luaXQpOwpAQCAtMTA2LDggKzIzMywxMCBAQAogCiBzdGF0aWMgc3RydWN0IG1kaW9fZGV2aWNlX2lkIG1pY3JlbF90YmxbXSA9IHsKIAl7IFBIWV9JRF9LU1o5MDIxLCAweDAwMGZmZjEwIH0sCi0JeyBQSFlfSURfVlNDODIwMSwgMHgwMGZmZmZmMCB9LAogCXsgUEhZX0lEX0tTODAwMSwgMHgwMGZmZmZmMCB9LAorCXsgUEhZX0lEX0tTODczNywgMHgwMGZmZmZmMCB9LAorCXsgUEhZX0lEX0tTODA0MSwgMHgwMGZmZmZmMCB9LAorCXsgUEhZX0lEX0tTODA1MSwgMHgwMGZmZmZmMCB9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IDY0YmU0NjYuLjUxMzBkYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKQEAgLTMwOSw4ICszMDksOSBAQAogICogY3VycmVudCBzdGF0ZS4gIFVzZSBhdCBvd24gcmlzay4KICAqLwogaW50IHBoeV9taWlfaW9jdGwoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKLQkJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSwgaW50IGNtZCkKKwkJc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSA9IGlmX21paShpZnIpOwogCXUxNiB2YWwgPSBtaWlfZGF0YS0+dmFsX2luOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTM2MCw2ICszNjEsMTEgQEAKIAkJfQogCQlicmVhazsKIAorCWNhc2UgU0lPQ1NIV1RTVEFNUDoKKwkJaWYgKHBoeWRldi0+ZHJ2LT5od3RzdGFtcCkKKwkJCXJldHVybiBwaHlkZXYtPmRydi0+aHd0c3RhbXAocGh5ZGV2LCBpZnIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwppbmRleCAxYTk5YmIyLi5jMDc2MTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKQEAgLTQ2MCw2ICs0NjAsNyBAQAogCX0KIAogCXBoeWRldi0+YXR0YWNoZWRfZGV2ID0gZGV2OworCWRldi0+cGh5ZGV2ID0gcGh5ZGV2OwogCiAJcGh5ZGV2LT5kZXZfZmxhZ3MgPSBmbGFnczsKIApAQCAtNTEzLDYgKzUxNCw3IEBACiAgKi8KIHZvaWQgcGh5X2RldGFjaChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogeworCXBoeWRldi0+YXR0YWNoZWRfZGV2LT5waHlkZXYgPSBOVUxMOwogCXBoeWRldi0+YXR0YWNoZWRfZGV2ID0gTlVMTDsKIAogCS8qIElmIHRoZSBkZXZpY2UgaGFkIG5vIHNwZWNpZmljIGRyaXZlciBiZWZvcmUgKGkuZS4gLSBpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKaW5kZXggMWIyYzI5MS4uNjY5NWE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCkBAIC00MCw3ICs0MCw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KQEAgLTY5LDcgKzY4LDYgQEAKIAogI2RlZmluZSBNUEhEUkxFTgk2CS8qIG11bHRpbGluayBwcm90b2NvbCBoZWFkZXIgbGVuZ3RoICovCiAjZGVmaW5lIE1QSERSTEVOX1NTTgk0CS8qIGRpdHRvIHdpdGggc2hvcnQgc2VxdWVuY2UgbnVtYmVycyAqLwotI2RlZmluZSBNSU5fRlJBR19TSVpFCTY0CiAKIC8qCiAgKiBBbiBpbnN0YW5jZSBvZiAvZGV2L3BwcCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciBhIHBwcApAQCAtMTgxLDYgKzE3OSw3IEBACiAgKiBjaGFubmVsLmRvd25sLgogICovCiAKK3N0YXRpYyBERUZJTkVfTVVURVgocHBwX211dGV4KTsKIHN0YXRpYyBhdG9taWNfdCBwcHBfdW5pdF9jb3VudCA9IEFUT01JQ19JTklUKDApOwogc3RhdGljIGF0b21pY190IGNoYW5uZWxfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKIApAQCAtMzYzLDcgKzM2Miw2IEBACiAgKi8KIHN0YXRpYyBpbnQgcHBwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAkvKgogCSAqIFRoaXMgY291bGQgKHNob3VsZD8pIGJlIGVuZm9yY2VkIGJ5IHRoZSBwZXJtaXNzaW9ucyBvbiAvZGV2L3BwcC4KIAkgKi8KQEAgLTUzOSwxNCArNTM3LDkgQEAKIAl9CiAKIAlsZW4gPSB1cHJvZy5sZW4gKiBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKTsKLQljb2RlID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmIChjb2RlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGNvZGUsIHVwcm9nLmZpbHRlciwgbGVuKSkgewotCQlrZnJlZShjb2RlKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCWNvZGUgPSBtZW1kdXBfdXNlcih1cHJvZy5maWx0ZXIsIGxlbik7CisJaWYgKElTX0VSUihjb2RlKSkKKwkJcmV0dXJuIFBUUl9FUlIoY29kZSk7CiAKIAllcnIgPSBza19jaGtfZmlsdGVyKGNvZGUsIHVwcm9nLmxlbik7CiAJaWYgKGVycikgewpAQCAtNTg4LDcgKzU4MSw3IEBACiAJCSAqIHRoaXMgZmQgYW5kIHJlb3BlbmluZyAvZGV2L3BwcC4KIAkJICovCiAJCWVyciA9IC1FSU5WQUw7Ci0JCWxvY2tfa2VybmVsKCk7CisJCW11dGV4X2xvY2soJnBwcF9tdXRleCk7CiAJCWlmIChwZi0+a2luZCA9PSBJTlRFUkZBQ0UpIHsKIAkJCXBwcCA9IFBGX1RPX1BQUChwZik7CiAJCQlpZiAoZmlsZSA9PSBwcHAtPm93bmVyKQpAQCAtNjAwLDcgKzU5Myw3IEBACiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUElPQ0RFVEFDSCBmaWxlLT5mX2NvdW50PSVsZFxuIiwKIAkJCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZmaWxlLT5mX2NvdW50KSk7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcHBfbXV0ZXgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjA4LDcgKzYwMSw3IEBACiAJCXN0cnVjdCBjaGFubmVsICpwY2g7CiAJCXN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbjsKIAotCQlsb2NrX2tlcm5lbCgpOworCQltdXRleF9sb2NrKCZwcHBfbXV0ZXgpOwogCQlwY2ggPSBQRl9UT19DSEFOTkVMKHBmKTsKIAogCQlzd2l0Y2ggKGNtZCkgewpAQCAtNjMwLDcgKzYyMyw3IEBACiAJCQkJZXJyID0gY2hhbi0+b3BzLT5pb2N0bChjaGFuLCBjbWQsIGFyZyk7CiAJCQl1cF9yZWFkKCZwY2gtPmNoYW5fc2VtKTsKIAkJfQotCQl1bmxvY2tfa2VybmVsKCk7CisJCW11dGV4X3VubG9jaygmcHBwX211dGV4KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTY0MCw3ICs2MzMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJnBwcF9tdXRleCk7CiAJcHBwID0gUEZfVE9fUFBQKHBmKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUFBQSU9DU01SVToKQEAgLTc4OCw3ICs3ODEsNyBAQAogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9UVFk7CiAJfQotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJnBwcF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODAxLDcgKzc5NCw3IEBACiAJc3RydWN0IHBwcF9uZXQgKnBuOwogCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmcHBwX211dGV4KTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUFBQSU9DTkVXVU5JVDoKIAkJLyogQ3JlYXRlIGEgbmV3IHBwcCB1bml0ICovCkBAIC04NTIsNyArODQ1LDcgQEAKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PVFRZOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZwcHBfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE5MzMsOSArMTkyNiw5IEBACiAJLyogSWYgdGhlIHF1ZXVlIGlzIGdldHRpbmcgbG9uZywgZG9uJ3Qgd2FpdCBhbnkgbG9uZ2VyIGZvciBwYWNrZXRzCiAJICAgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgcXVldWUuICovCiAJaWYgKHNrYl9xdWV1ZV9sZW4oJnBwcC0+bXJxKSA+PSBQUFBfTVBfTUFYX1FMRU4pIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKCZwcHAtPm1ycSk7Ci0JCWlmIChzZXFfYmVmb3JlKHBwcC0+bWluc2VxLCBza2ItPnNlcXVlbmNlKSkKLQkJCXBwcC0+bWluc2VxID0gc2tiLT5zZXF1ZW5jZTsKKwkJc3RydWN0IHNrX2J1ZmYgKm1za2IgPSBza2JfcGVlaygmcHBwLT5tcnEpOworCQlpZiAoc2VxX2JlZm9yZShwcHAtPm1pbnNlcSwgbXNrYi0+c2VxdWVuY2UpKQorCQkJcHBwLT5taW5zZXEgPSBtc2tiLT5zZXF1ZW5jZTsKIAl9CiAKIAkvKiBQdWxsIGNvbXBsZXRlZCBwYWNrZXRzIG9mZiB0aGUgcXVldWUgYW5kIHJlY2VpdmUgdGhlbS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG9lLmMgYi9kcml2ZXJzL25ldC9wcHBvZS5jCmluZGV4IDgwNWI2NGQuLjM0NGVmMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcG9lLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwb2UuYwpAQCAtODksNyArODksNiBAQAogI2RlZmluZSBQUFBPRV9IQVNIX1NJWkUgKDEgPDwgUFBQT0VfSEFTSF9CSVRTKQogI2RlZmluZSBQUFBPRV9IQVNIX01BU0sJKFBQUE9FX0hBU0hfU0laRSAtIDEpCiAKLXN0YXRpYyBpbnQgcHBwb2VfeG1pdChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIGludCBfX3BwcG9lX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcHBwb2Vfb3BzOwpAQCAtOTQ5LDcgKzk0OCw3IEBACiAKIGFib3J0OgogCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wczNfZ2VsaWNfd2lyZWxlc3MuaCBiL2RyaXZlcnMvbmV0L3BzM19nZWxpY193aXJlbGVzcy5oCmluZGV4IDBhODhiNTMuLmY3ZTUxYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BzM19nZWxpY193aXJlbGVzcy5oCisrKyBiL2RyaXZlcnMvbmV0L3BzM19nZWxpY193aXJlbGVzcy5oCkBAIC03NCw3ICs3NCw3IEBACiAJdTE2IGJzc190eXBlOyAgICAvKiBpbmZyYSBvciBhZGhvYyAqLwogCXUxNiBhdXRoX21ldGhvZDsgLyogc2hhcmVkIGtleSBvciBvcGVuICovCiAJdTE2IG9wX21vZGU7IC8qIEIvRyAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyogZm9yIEdFTElDX0VVUlVTX0NNRF9XRVBfQ0ZHICovCkBAIC04OCw3ICs4OCw3IEBACiAJLyogYWxsIGZpZWxkcyBhcmUgYmlnIGVuZGlhbiAqLwogCXUxNiBzZWN1cml0eTsKIAl1OCBrZXlbNF1bMTZdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIGZvciBHRUxJQ19FVVJVU19DTURfV1BBX0NGRyAqLwogZW51bSBnZWxpY19ldXJ1c193cGFfc2VjdXJpdHkgewpAQCAtMTIwLDcgKzEyMCw3IEBACiAJdTE2IHNlY3VyaXR5OwogCXUxNiBwc2tfdHlwZTsgLyogcHNrIGtleSBlbmNvZGluZyB0eXBlICovCiAJdTggcHNrW0dFTElDX1dMX0VVUlVTX1BTS19NQVhfTEVOXTsgLyogcHNrIGtleTsgaGV4IG9yIHBhc3NwaHJhc2UgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBmb3IgR0VMSUNfRVVSVVNfQ01EX3tTVEFSVCxHRVR9X1NDQU4gKi8KIGVudW0gZ2VsaWNfZXVydXNfc2Nhbl9jYXBhYmlsaXR5IHsKQEAgLTE3MSw3ICsxNzEsNyBAQAogCV9fYmUzMiByZXNlcnZlZDM7CiAJX19iZTMyIHJlc2VydmVkNDsKIAl1OCBlbGVtZW50c1swXTsgLyogaWUgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogdGhlIGh5cGVydmlzb3IgcmV0dXJucyBiYnMgdXAgdG8gMTYgKi8KICNkZWZpbmUgR0VMSUNfRVVSVVNfTUFYX1NDQU4gICgxNikKQEAgLTE5Myw3ICsxOTMsNyBAQAogc3RydWN0IGdlbGljX2V1cnVzX3Jzc2lfaW5mbyB7CiAJLyogYmlnIGVuZGlhbiAqLwogCV9fYmUxNiByc3NpOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qIGZvciAnc3RhdCcgbWVtYmVyIG9mIGdlbGljX3dsX2luZm8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsYTN4eHguYyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguYwppbmRleCA1NGViYjY1Li42MTY4YTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGEzeHh4LmMKKysrIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5jCkBAIC01LDYgKzUsOCBAQAogICogU2VlIExJQ0VOU0UucWxhM3h4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTM2LDE0ICszOCwxNiBAQAogCiAjaW5jbHVkZSAicWxhM3h4eC5oIgogCi0jZGVmaW5lIERSVl9OQU1FICAJInFsYTN4eHgiCi0jZGVmaW5lIERSVl9TVFJJTkcgCSJRTG9naWMgSVNQM1hYWCBOZXR3b3JrIERyaXZlciIKKyNkZWZpbmUgRFJWX05BTUUJInFsYTN4eHgiCisjZGVmaW5lIERSVl9TVFJJTkcJIlFMb2dpYyBJU1AzWFhYIE5ldHdvcmsgRHJpdmVyIgogI2RlZmluZSBEUlZfVkVSU0lPTgkidjIuMDMuMDAtazUiCi0jZGVmaW5lIFBGWAkJRFJWX05BTUUgIiAiCiAKIHN0YXRpYyBjb25zdCBjaGFyIHFsM3h4eF9kcml2ZXJfbmFtZVtdID0gRFJWX05BTUU7CiBzdGF0aWMgY29uc3QgY2hhciBxbDN4eHhfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogCisjZGVmaW5lIFRJTUVEX09VVF9NU0cJCQkJCQkJXAorIlRpbWVkIG91dCB3YWl0aW5nIGZvciBtYW5hZ2VtZW50IHBvcnQgdG8gZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZFxuIgorCiBNT0RVTEVfQVVUSE9SKCJRTG9naWMgQ29ycG9yYXRpb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIElTUDNYWFggTmV0d29yayBEcml2ZXIgIiBEUlZfVkVSU0lPTiAiICIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNzMsMjQgKzc3LDI0IEBACiAvKgogICogIFRoZXNlIGFyZSB0aGUga25vd24gUEhZJ3Mgd2hpY2ggYXJlIHVzZWQKICAqLwotdHlwZWRlZiBlbnVtIHsKK2VudW0gUEhZX0RFVklDRV9UWVBFIHsKICAgIFBIWV9UWVBFX1VOS05PV04gICA9IDAsCiAgICBQSFlfVklURVNTRV9WU0M4MjExLAogICAgUEhZX0FHRVJFX0VUMTAxMUMsCiAgICBNQVhfUEhZX0RFVl9UWVBFUwotfSBQSFlfREVWSUNFX2V0OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotCVBIWV9ERVZJQ0VfZXQgcGh5RGV2aWNlOwotCXUzMgkJcGh5SWRPVUk7Ci0JdTE2CQlwaHlJZE1vZGVsOwotCWNoYXIgCQkqbmFtZTsKLX0gUEhZX0RFVklDRV9JTkZPX3Q7CitzdHJ1Y3QgUEhZX0RFVklDRV9JTkZPIHsKKwljb25zdCBlbnVtIFBIWV9ERVZJQ0VfVFlQRQlwaHlEZXZpY2U7CisJY29uc3QgdTMyCQlwaHlJZE9VSTsKKwljb25zdCB1MTYJCXBoeUlkTW9kZWw7CisJY29uc3QgY2hhcgkJKm5hbWU7Cit9OwogCi1zdGF0aWMgY29uc3QgUEhZX0RFVklDRV9JTkZPX3QgUEhZX0RFVklDRVNbXSA9Ci0Je3tQSFlfVFlQRV9VTktOT1dOLCAgICAweDAwMDAwMCwgMHgwLCAiUEhZX1RZUEVfVU5LTk9XTiJ9LAotCSB7UEhZX1ZJVEVTU0VfVlNDODIxMSwgMHgwMDAzZjEsIDB4YiwgIlBIWV9WSVRFU1NFX1ZTQzgyMTEifSwKLQkge1BIWV9BR0VSRV9FVDEwMTFDLCAgIDB4MDBhMGJjLCAweDEsICJQSFlfQUdFUkVfRVQxMDExQyJ9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBQSFlfREVWSUNFX0lORk8gUEhZX0RFVklDRVNbXSA9IHsKKwl7UEhZX1RZUEVfVU5LTk9XTiwgICAgMHgwMDAwMDAsIDB4MCwgIlBIWV9UWVBFX1VOS05PV04ifSwKKwl7UEhZX1ZJVEVTU0VfVlNDODIxMSwgMHgwMDAzZjEsIDB4YiwgIlBIWV9WSVRFU1NFX1ZTQzgyMTEifSwKKwl7UEhZX0FHRVJFX0VUMTAxMUMsICAgMHgwMGEwYmMsIDB4MSwgIlBIWV9BR0VSRV9FVDEwMTFDIn0sCiB9OwogCiAKQEAgLTEwMCw3ICsxMDQsOCBAQAogc3RhdGljIGludCBxbF9zZW1fc3BpbmxvY2soc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAogCQkJICAgIHUzMiBzZW1fbWFzaywgdTMyIHNlbV9iaXRzKQogewotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgdmFsdWU7CiAJdW5zaWduZWQgaW50IHNlY29uZHMgPSAzOwogCkBAIC0xMTEsMjAgKzExNiwyMiBAQAogCQlpZiAoKHZhbHVlICYgKHNlbV9tYXNrID4+IDE2KSkgPT0gc2VtX2JpdHMpCiAJCQlyZXR1cm4gMDsKIAkJc3NsZWVwKDEpOwotCX0gd2hpbGUoLS1zZWNvbmRzKTsKKwl9IHdoaWxlICgtLXNlY29uZHMpOwogCXJldHVybiAtMTsKIH0KIAogc3RhdGljIHZvaWQgcWxfc2VtX3VubG9jayhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBzZW1fbWFzaykKIHsKLQlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJd3JpdGVsKHNlbV9tYXNrLCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlbWFwaG9yZVJlZyk7CiAJcmVhZGwoJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZW1hcGhvcmVSZWcpOwogfQogCiBzdGF0aWMgaW50IHFsX3NlbV9sb2NrKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIHNlbV9tYXNrLCB1MzIgc2VtX2JpdHMpCiB7Ci0Jc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCXUzMiB2YWx1ZTsKIAogCXdyaXRlbCgoc2VtX21hc2sgfCBzZW1fYml0cyksICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VtYXBob3JlUmVnKTsKQEAgLTEzOSwzMiArMTQ2LDI4IEBACiB7CiAJaW50IGkgPSAwOwogCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKCFxbF9zZW1fbG9jayhxZGV2LAotCQkJCSBRTF9EUlZSX1NFTV9NQVNLLAotCQkJCSAoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KQotCQkJCSAgKiAyKSA8PCAxKSkgewotCQkJaWYgKGkgPCAxMCkgewotCQkJCXNzbGVlcCgxKTsKLQkJCQlpKys7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgIgotCQkJCSAgICAgICAiZHJpdmVyIGxvY2suLi5cbiIsCi0JCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCi0JCQkgICAgICAgIiVzOiBkcml2ZXIgbG9jayBhY3F1aXJlZC5cbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJd2hpbGUgKGkgPCAxMCkgeworCQlpZiAoaSkKKwkJCXNzbGVlcCgxKTsKKworCQlpZiAocWxfc2VtX2xvY2socWRldiwKKwkJCQlRTF9EUlZSX1NFTV9NQVNLLAorCQkJCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpCisJCQkJICogMikgPDwgMSkpIHsKKwkJCW5ldGRldl9wcmludGsoS0VSTl9ERUJVRywgcWRldi0+bmRldiwKKwkJCQkgICAgICAiZHJpdmVyIGxvY2sgYWNxdWlyZWRcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CisKKwluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgZHJpdmVyIGxvY2suLi5cbiIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBxbF9zZXRfcmVnaXN0ZXJfcGFnZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBwYWdlKQogewotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAogCXdyaXRlbCgoKElTUF9DT05UUk9MX05QX01BU0sgPDwgMTYpIHwgcGFnZSksCiAJCQkmcG9ydF9yZWdzLT5Db21tb25SZWdzLmlzcENvbnRyb2xTdGF0dXMpOwpAQCAtMTcyLDggKzE3NSw3IEBACiAJcWRldi0+Y3VycmVudF9wYWdlID0gcGFnZTsKIH0KIAotc3RhdGljIHUzMiBxbF9yZWFkX2NvbW1vbl9yZWdfbChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCi0JCQkgICAgICB1MzIgX19pb21lbSAqIHJlZykKK3N0YXRpYyB1MzIgcWxfcmVhZF9jb21tb25fcmVnX2woc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgX19pb21lbSAqcmVnKQogewogCXUzMiB2YWx1ZTsKIAl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOwpAQCAtMTg1LDggKzE4Nyw3IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgdTMyIHFsX3JlYWRfY29tbW9uX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCi0JCQkgICAgICB1MzIgX19pb21lbSAqIHJlZykKK3N0YXRpYyB1MzIgcWxfcmVhZF9jb21tb25fcmVnKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIF9faW9tZW0gKnJlZykKIHsKIAlyZXR1cm4gcmVhZGwocmVnKTsKIH0KQEAgLTE5OSw3ICsyMDAsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CiAKIAlpZiAocWRldi0+Y3VycmVudF9wYWdlICE9IDApCi0JCXFsX3NldF9yZWdpc3Rlcl9wYWdlKHFkZXYsMCk7CisJCXFsX3NldF9yZWdpc3Rlcl9wYWdlKHFkZXYsIDApOwogCXZhbHVlID0gcmVhZGwocmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKQEAgLTIwOSw3ICsyMTAsNyBAQAogc3RhdGljIHUzMiBxbF9yZWFkX3BhZ2UwX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBfX2lvbWVtICpyZWcpCiB7CiAJaWYgKHFkZXYtPmN1cnJlbnRfcGFnZSAhPSAwKQotCQlxbF9zZXRfcmVnaXN0ZXJfcGFnZShxZGV2LDApOworCQlxbF9zZXRfcmVnaXN0ZXJfcGFnZShxZGV2LCAwKTsKIAlyZXR1cm4gcmVhZGwocmVnKTsKIH0KIApAQCAtMjQzLDcgKzI0NCw3IEBACiAJCQkgICAgICAgdTMyIF9faW9tZW0gKnJlZywgdTMyIHZhbHVlKQogewogCWlmIChxZGV2LT5jdXJyZW50X3BhZ2UgIT0gMCkKLQkJcWxfc2V0X3JlZ2lzdGVyX3BhZ2UocWRldiwwKTsKKwkJcWxfc2V0X3JlZ2lzdGVyX3BhZ2UocWRldiwgMCk7CiAJd3JpdGVsKHZhbHVlLCByZWcpOwogCXJlYWRsKHJlZyk7CiB9CkBAIC0yNTUsNyArMjU2LDcgQEAKIAkJCSAgICAgICB1MzIgX19pb21lbSAqcmVnLCB1MzIgdmFsdWUpCiB7CiAJaWYgKHFkZXYtPmN1cnJlbnRfcGFnZSAhPSAxKQotCQlxbF9zZXRfcmVnaXN0ZXJfcGFnZShxZGV2LDEpOworCQlxbF9zZXRfcmVnaXN0ZXJfcGFnZShxZGV2LCAxKTsKIAl3cml0ZWwodmFsdWUsIHJlZyk7CiAJcmVhZGwocmVnKTsKIH0KQEAgLTI2NywxNCArMjY4LDE1IEBACiAJCQkgICAgICAgdTMyIF9faW9tZW0gKnJlZywgdTMyIHZhbHVlKQogewogCWlmIChxZGV2LT5jdXJyZW50X3BhZ2UgIT0gMikKLQkJcWxfc2V0X3JlZ2lzdGVyX3BhZ2UocWRldiwyKTsKKwkJcWxfc2V0X3JlZ2lzdGVyX3BhZ2UocWRldiwgMik7CiAJd3JpdGVsKHZhbHVlLCByZWcpOwogCXJlYWRsKHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIHFsX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7Ci0Jc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCiAJcWxfd3JpdGVfY29tbW9uX3JlZ19sKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuaXNwSW50ZXJydXB0TWFza1JlZywKIAkJCSAgICAoSVNQX0lNUl9FTkFCTEVfSU5UIDw8IDE2KSk7CkBAIC0yODMsNyArMjg1LDggQEAKIAogc3RhdGljIHZvaWQgcWxfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAogCXFsX3dyaXRlX2NvbW1vbl9yZWdfbChxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLmlzcEludGVycnVwdE1hc2tSZWcsCiAJCQkgICAgKCgweGZmIDw8IDE2KSB8IElTUF9JTVJfRU5BQkxFX0lOVCkpOwpAQCAtMzA4LDggKzMxMSw3IEBACiAJCWxyZ19idWZfY2ItPnNrYiA9IG5ldGRldl9hbGxvY19za2IocWRldi0+bmRldiwKIAkJCQkJCSAgIHFkZXYtPmxyZ19idWZmZXJfbGVuKTsKIAkJaWYgKHVubGlrZWx5KCFscmdfYnVmX2NiLT5za2IpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogZmFpbGVkIG5ldGRldl9hbGxvY19za2IoKS5cbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJmYWlsZWQgbmV0ZGV2X2FsbG9jX3NrYigpXG4iKTsKIAkJCXFkZXYtPmxyZ19idWZfc2tiX2NoZWNrKys7CiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMzIzLDkgKzMyNSwxMCBAQAogCQkJCQkgICAgIFFMX0hFQURFUl9TUEFDRSwKIAkJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJZXJyID0gcGNpX2RtYV9tYXBwaW5nX2Vycm9yKHFkZXYtPnBkZXYsIG1hcCk7Ci0JCQlpZihlcnIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgbWFwcGluZyBmYWlsZWQgd2l0aCBlcnJvcjogJWRcbiIsCi0JCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUsIGVycik7CisJCQlpZiAoZXJyKSB7CisJCQkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LAorCQkJCQkgICAiUENJIG1hcHBpbmcgZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLAorCQkJCQkgICBlcnIpOwogCQkJCWRldl9rZnJlZV9za2IobHJnX2J1Zl9jYi0+c2tiKTsKIAkJCQlscmdfYnVmX2NiLT5za2IgPSBOVUxMOwogCkBAIC0zNTAsMTAgKzM1MywxMSBAQAogc3RhdGljIHN0cnVjdCBxbF9yY3ZfYnVmX2NiICpxbF9nZXRfZnJvbV9scmdfYnVmX2ZyZWVfbGlzdChzdHJ1Y3QgcWwzX2FkYXB0ZXIKIAkJCQkJCQkgICAqcWRldikKIHsKLQlzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqbHJnX2J1Zl9jYjsKKwlzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqbHJnX2J1Zl9jYiA9IHFkZXYtPmxyZ19idWZfZnJlZV9oZWFkOwogCi0JaWYgKChscmdfYnVmX2NiID0gcWRldi0+bHJnX2J1Zl9mcmVlX2hlYWQpICE9IE5VTEwpIHsKLQkJaWYgKChxZGV2LT5scmdfYnVmX2ZyZWVfaGVhZCA9IGxyZ19idWZfY2ItPm5leHQpID09IE5VTEwpCisJaWYgKGxyZ19idWZfY2IgIT0gTlVMTCkgeworCQlxZGV2LT5scmdfYnVmX2ZyZWVfaGVhZCA9IGxyZ19idWZfY2ItPm5leHQ7CisJCWlmIChxZGV2LT5scmdfYnVmX2ZyZWVfaGVhZCA9PSBOVUxMKQogCQkJcWRldi0+bHJnX2J1Zl9mcmVlX3RhaWwgPSBOVUxMOwogCQlxZGV2LT5scmdfYnVmX2ZyZWVfY291bnQtLTsKIAl9CkBAIC0zNzQsMTMgKzM3OCwxMyBAQAogc3RhdGljIHZvaWQgZm05M2M1NmFfc2VsZWN0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgKnNwaXIgPSAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWc7CiAKIAlxZGV2LT5lZXByb21fY21kX2RhdGEgPSBBVUJVUk5fRUVQUk9NX0NTXzE7Ci0JcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VyaWFsUG9ydEludGVyZmFjZVJlZywKLQkJCSAgICBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSk7Ci0JcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VyaWFsUG9ydEludGVyZmFjZVJlZywKLQkJCSAgICAoKElTUF9OVlJBTV9NQVNLIDw8IDE2KSB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSkpOworCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCBzcGlyLCBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSk7CisJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsIHNwaXIsCisJCQkgICAoKElTUF9OVlJBTV9NQVNLIDw8IDE2KSB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSkpOwogfQogCiAvKgpAQCAtMzkzLDUxICszOTcsNDAgQEAKIAl1MzIgZGF0YUJpdDsKIAl1MzIgcHJldmlvdXNCaXQ7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyICpzcGlyID0gJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnOwogCiAJLyogQ2xvY2sgaW4gYSB6ZXJvLCB0aGVuIGRvIHRoZSBzdGFydCBiaXQgKi8KLQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAotCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKLQkJCSAgICBBVUJVUk5fRUVQUk9NX0RPXzEpOwotCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCi0JCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KLQkJCSAgICBlZXByb21fY21kX2RhdGEgfCBBVUJVUk5fRUVQUk9NX0RPXzEgfAotCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UpOwotCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCi0JCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KLQkJCSAgICBlZXByb21fY21kX2RhdGEgfCBBVUJVUk5fRUVQUk9NX0RPXzEgfAotCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX0ZBTEwpOworCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCBzcGlyLAorCQkJICAgKElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCSAgICBBVUJVUk5fRUVQUk9NX0RPXzEpKTsKKwlxbF93cml0ZV9udnJhbV9yZWcocWRldiwgc3BpciwKKwkJCSAgIChJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSB8CisJCQkgICAgQVVCVVJOX0VFUFJPTV9ET18xIHwgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSkpOworCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCBzcGlyLAorCQkJICAgKElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCSAgICBBVUJVUk5fRUVQUk9NX0RPXzEgfCBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKSk7CiAKIAltYXNrID0gMSA8PCAoRk05M0M1NkFfQ01EX0JJVFMgLSAxKTsKIAkvKiBGb3JjZSB0aGUgcHJldmlvdXMgZGF0YSBiaXQgdG8gYmUgZGlmZmVyZW50ICovCiAJcHJldmlvdXNCaXQgPSAweGZmZmY7CiAJZm9yIChpID0gMDsgaSA8IEZNOTNDNTZBX0NNRF9CSVRTOyBpKyspIHsKLQkJZGF0YUJpdCA9Ci0JCSAgICAoY21kICYgbWFzaykgPyBBVUJVUk5fRUVQUk9NX0RPXzEgOiBBVUJVUk5fRUVQUk9NX0RPXzA7CisJCWRhdGFCaXQgPSAoY21kICYgbWFzaykKKwkJCT8gQVVCVVJOX0VFUFJPTV9ET18xCisJCQk6IEFVQlVSTl9FRVBST01fRE9fMDsKIAkJaWYgKHByZXZpb3VzQml0ICE9IGRhdGFCaXQpIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgYml0IGNoYW5nZWQsIHRoZW4gY2hhbmdlIHRoZSBETyBzdGF0ZSB0bwotCQkJICogbWF0Y2gKLQkJCSAqLwotCQkJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsCi0JCQkJCSAgICAmcG9ydF9yZWdzLT5Db21tb25SZWdzLgotCQkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKLQkJCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+Ci0JCQkJCSAgICBlZXByb21fY21kX2RhdGEgfCBkYXRhQml0KTsKKwkJCS8qIElmIHRoZSBiaXQgY2hhbmdlZCwgY2hhbmdlIHRoZSBETyBzdGF0ZSB0byBtYXRjaCAqLworCQkJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsIHNwaXIsCisJCQkJCSAgIChJU1BfTlZSQU1fTUFTSyB8CisJCQkJCSAgICBxZGV2LT5lZXByb21fY21kX2RhdGEgfCBkYXRhQml0KSk7CiAJCQlwcmV2aW91c0JpdCA9IGRhdGFCaXQ7CiAJCX0KLQkJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsCi0JCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCi0JCQkJICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCi0JCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+Ci0JCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAotCQkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19SSVNFKTsKLQkJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsCi0JCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCi0JCQkJICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCi0JCQkJICAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+Ci0JCQkJICAgIGVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAotCQkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKTsKKwkJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsIHNwaXIsCisJCQkJICAgKElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCQkgICAgZGF0YUJpdCB8IEFVQlVSTl9FRVBST01fQ0xLX1JJU0UpKTsKKwkJcWxfd3JpdGVfbnZyYW1fcmVnKHFkZXYsIHNwaXIsCisJCQkJICAgKElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCQkgICAgZGF0YUJpdCB8IEFVQlVSTl9FRVBST01fQ0xLX0ZBTEwpKTsKIAkJY21kID0gY21kIDw8IDE7CiAJfQogCkBAIC00NDUsMzMgKzQzOCwyNCBAQAogCS8qIEZvcmNlIHRoZSBwcmV2aW91cyBkYXRhIGJpdCB0byBiZSBkaWZmZXJlbnQgKi8KIAlwcmV2aW91c0JpdCA9IDB4ZmZmZjsKIAlmb3IgKGkgPSAwOyBpIDwgYWRkckJpdHM7IGkrKykgewotCQlkYXRhQml0ID0KLQkJICAgIChlZXByb21BZGRyICYgbWFzaykgPyBBVUJVUk5fRUVQUk9NX0RPXzEgOgotCQkgICAgQVVCVVJOX0VFUFJPTV9ET18wOworCQlkYXRhQml0ID0gKGVlcHJvbUFkZHIgJiBtYXNrKSA/IEFVQlVSTl9FRVBST01fRE9fMQorCQkJOiBBVUJVUk5fRUVQUk9NX0RPXzA7CiAJCWlmIChwcmV2aW91c0JpdCAhPSBkYXRhQml0KSB7CiAJCQkvKgogCQkJICogSWYgdGhlIGJpdCBjaGFuZ2VkLCB0aGVuIGNoYW5nZSB0aGUgRE8gc3RhdGUgdG8KIAkJCSAqIG1hdGNoCiAJCQkgKi8KLQkJCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LAotCQkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KLQkJCQkJICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCi0JCQkJCSAgICBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPgotCQkJCQkgICAgZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCk7CisJCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwgc3BpciwKKwkJCQkJICAgKElTUF9OVlJBTV9NQVNLIHwKKwkJCQkJICAgIHFkZXYtPmVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQpKTsKIAkJCXByZXZpb3VzQml0ID0gZGF0YUJpdDsKIAkJfQotCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwKLQkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KLQkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKLQkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KLQkJCQkgICAgZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8Ci0JCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UpOwotCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwKLQkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KLQkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKLQkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT4KLQkJCQkgICAgZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8Ci0JCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX0ZBTEwpOworCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwgc3BpciwKKwkJCQkgICAoSVNQX05WUkFNX01BU0sgfCBxZGV2LT5lZXByb21fY21kX2RhdGEgfAorCQkJCSAgICBkYXRhQml0IHwgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSkpOworCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwgc3BpciwKKwkJCQkgICAoSVNQX05WUkFNX01BU0sgfCBxZGV2LT5lZXByb21fY21kX2RhdGEgfAorCQkJCSAgICBkYXRhQml0IHwgQVVCVVJOX0VFUFJPTV9DTEtfRkFMTCkpOwogCQllZXByb21BZGRyID0gZWVwcm9tQWRkciA8PCAxOwogCX0KIH0KQEAgLTQ4MiwxMCArNDY2LDExIEBACiBzdGF0aWMgdm9pZCBmbTkzYzU2YV9kZXNlbGVjdChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJdTMyICpzcGlyID0gJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnOworCiAJcWRldi0+ZWVwcm9tX2NtZF9kYXRhID0gQVVCVVJOX0VFUFJPTV9DU18wOwotCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWcsCi0JCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT5lZXByb21fY21kX2RhdGEpOworCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCBzcGlyLCBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSk7CiB9CiAKIC8qCkBAIC00OTcsMjkgKzQ4MiwyMyBAQAogCXUzMiBkYXRhID0gMDsKIAl1MzIgZGF0YUJpdDsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgKnNwaXIgPSAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWc7CiAKIAkvKiBSZWFkIHRoZSBkYXRhIGJpdHMgKi8KIAkvKiBUaGUgZmlyc3QgYml0IGlzIGEgZHVtbXkuICBDbG9jayByaWdodCBvdmVyIGl0LiAqLwogCWZvciAoaSA9IDA7IGkgPCBkYXRhQml0czsgaSsrKSB7Ci0JCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LAotCQkJCSAgICAmcG9ydF9yZWdzLT5Db21tb25SZWdzLgotCQkJCSAgICBzZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAotCQkJCSAgICBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSB8Ci0JCQkJICAgIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UpOwotCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwKLQkJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KLQkJCQkgICAgc2VyaWFsUG9ydEludGVyZmFjZVJlZywKLQkJCQkgICAgSVNQX05WUkFNX01BU0sgfCBxZGV2LT5lZXByb21fY21kX2RhdGEgfAotCQkJCSAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKTsKLQkJZGF0YUJpdCA9Ci0JCSAgICAocWxfcmVhZF9jb21tb25fcmVnCi0JCSAgICAgKHFkZXYsCi0JCSAgICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCi0JCSAgICAgIHNlcmlhbFBvcnRJbnRlcmZhY2VSZWcpICYgQVVCVVJOX0VFUFJPTV9ESV8xKSA/IDEgOiAwOworCQlxbF93cml0ZV9udnJhbV9yZWcocWRldiwgc3BpciwKKwkJCQkgICBJU1BfTlZSQU1fTUFTSyB8IHFkZXYtPmVlcHJvbV9jbWRfZGF0YSB8CisJCQkJICAgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSk7CisJCXFsX3dyaXRlX252cmFtX3JlZyhxZGV2LCBzcGlyLAorCQkJCSAgIElTUF9OVlJBTV9NQVNLIHwgcWRldi0+ZWVwcm9tX2NtZF9kYXRhIHwKKwkJCQkgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMKTsKKwkJZGF0YUJpdCA9IChxbF9yZWFkX2NvbW1vbl9yZWcocWRldiwgc3BpcikgJgorCQkJICAgQVVCVVJOX0VFUFJPTV9ESV8xKSA/IDEgOiAwOwogCQlkYXRhID0gKGRhdGEgPDwgMSkgfCBkYXRhQml0OwogCX0KLQkqdmFsdWUgPSAodTE2KSBkYXRhOworCSp2YWx1ZSA9ICh1MTYpZGF0YTsKIH0KIAogLyoKQEAgLTU1MSwxMyArNTMwLDEyIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwogCi0JcEVFUFJPTURhdGEgPSAodTE2ICopICYgcWRldi0+bnZyYW1fZGF0YTsKKwlwRUVQUk9NRGF0YSA9ICh1MTYgKikmcWRldi0+bnZyYW1fZGF0YTsKIAlxZGV2LT5lZXByb21fY21kX2RhdGEgPSAwOwotCWlmKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9OVlJBTV9TRU1fTUFTSywKKwlpZiAocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX05WUkFNX1NFTV9NQVNLLAogCQkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgogCQkJIDIpIDw8IDEwKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYIiVzOiBGYWlsZWQgcWxfc2VtX3NwaW5sb2NrKCkuXG4iLAotCQkJX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBGYWlsZWQgcWxfc2VtX3NwaW5sb2NrKClcbiIsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNTcwLDggKzU0OCw4IEBACiAJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9OVlJBTV9TRU1fTUFTSyk7CiAKIAlpZiAoY2hlY2tzdW0gIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2hlY2tzdW0gc2hvdWxkIGJlIHplcm8sIGlzICV4ISFcbiIsCi0JCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLCBjaGVja3N1bSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgImNoZWNrc3VtIHNob3VsZCBiZSB6ZXJvLCBpcyAleCEhXG4iLAorCQkJICAgY2hlY2tzdW0pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC01ODcsNyArNTY1LDcgQEAKIHN0YXRpYyBpbnQgcWxfd2FpdF9mb3JfbWlpX3JlYWR5KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgdGVtcDsKIAlpbnQgY291bnQgPSAxMDAwOwogCkBAIC02MDQsNyArNTgyLDcgQEAKIHN0YXRpYyB2b2lkIHFsX21paV9lbmFibGVfc2Nhbl9tb2RlKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgc2NhbkNvbnRyb2w7CiAKIAlpZiAocWRldi0+bnVtUG9ydHMgPiAxKSB7CkBAIC02MzIsNyArNjEwLDcgQEAKIHsKIAl1OCByZXQ7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQkJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCiAJLyogU2VlIGlmIHNjYW4gbW9kZSBpcyBlbmFibGVkIGJlZm9yZSB3ZSB0dXJuIGl0IG9mZiAqLwogCWlmIChxbF9yZWFkX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNNSUlNZ210Q29udHJvbFJlZykgJgpAQCAtNjYyLDE3ICs2NDAsMTMgQEAKIAkJCSAgICAgICB1MTYgcmVnQWRkciwgdTE2IHZhbHVlLCB1MzIgcGh5QWRkcikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1OCBzY2FuV2FzRW5hYmxlZDsKIAogCXNjYW5XYXNFbmFibGVkID0gcWxfbWlpX2Rpc2FibGVfc2Nhbl9tb2RlKHFkZXYpOwogCiAJaWYgKHFsX3dhaXRfZm9yX21paV9yZWFkeShxZGV2KSkgewotCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAotCQkJICAgICAgICIlcyBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKLQkJCSAgICAgICAiZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZC5cbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGlmX3dhcm4ocWRldiwgbGluaywgcWRldi0+bmRldiwgVElNRURfT1VUX01TRyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY4MywxMSArNjU3LDcgQEAKIAogCS8qIFdhaXQgZm9yIHdyaXRlIHRvIGNvbXBsZXRlIDkvMTAvMDQgU0pQICovCiAJaWYgKHFsX3dhaXRfZm9yX21paV9yZWFkeShxZGV2KSkgewotCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAotCQkJICAgICAgICIlczogVGltZWQgb3V0IHdhaXRpbmcgZm9yIG1hbmFnZW1lbnQgcG9ydCB0byAiCi0JCQkgICAgICAgImdldCBmcmVlIGJlZm9yZSBpc3N1aW5nIGNvbW1hbmQuXG4iLAotCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQluZXRpZl93YXJuKHFkZXYsIGxpbmssIHFkZXYtPm5kZXYsIFRJTUVEX09VVF9NU0cpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC02OTgsMjEgKzY2OCwxNyBAQAogfQogCiBzdGF0aWMgaW50IHFsX21paV9yZWFkX3JlZ19leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUxNiByZWdBZGRyLAotCQkJICAgICAgdTE2ICogdmFsdWUsIHUzMiBwaHlBZGRyKQorCQkJICAgICAgdTE2ICp2YWx1ZSwgdTMyIHBoeUFkZHIpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTggc2Nhbldhc0VuYWJsZWQ7CiAJdTMyIHRlbXA7CiAKIAlzY2FuV2FzRW5hYmxlZCA9IHFsX21paV9kaXNhYmxlX3NjYW5fbW9kZShxZGV2KTsKIAogCWlmIChxbF93YWl0X2Zvcl9taWlfcmVhZHkocWRldikpIHsKLQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKLQkJCSAgICAgICAiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBtYW5hZ2VtZW50IHBvcnQgdG8gIgotCQkJICAgICAgICJnZXQgZnJlZSBiZWZvcmUgaXNzdWluZyBjb21tYW5kLlxuIiwKLQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0aWZfd2FybihxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LCBUSU1FRF9PVVRfTVNHKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNzI3LDExICs2OTMsNyBAQAogCiAJLyogV2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUgKi8KIAlpZiAocWxfd2FpdF9mb3JfbWlpX3JlYWR5KHFkZXYpKSB7Ci0JCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCi0JCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKLQkJCSAgICAgICAiZ2V0IGZyZWUgYWZ0ZXIgaXNzdWluZyBjb21tYW5kLlxuIiwKLQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0aWZfd2FybihxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LCBUSU1FRF9PVVRfTVNHKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNzQ3LDE2ICs3MDksMTIgQEAKIHN0YXRpYyBpbnQgcWxfbWlpX3dyaXRlX3JlZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUxNiByZWdBZGRyLCB1MTYgdmFsdWUpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAKIAlxbF9taWlfZGlzYWJsZV9zY2FuX21vZGUocWRldik7CiAKIAlpZiAocWxfd2FpdF9mb3JfbWlpX3JlYWR5KHFkZXYpKSB7Ci0JCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCi0JCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKLQkJCSAgICAgICAiZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZC5cbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGlmX3dhcm4ocWRldiwgbGluaywgcWRldi0+bmRldiwgVElNRURfT1VUX01TRyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTc2NywxMSArNzI1LDcgQEAKIAogCS8qIFdhaXQgZm9yIHdyaXRlIHRvIGNvbXBsZXRlLiAqLwogCWlmIChxbF93YWl0X2Zvcl9taWlfcmVhZHkocWRldikpIHsKLQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKLQkJCSAgICAgICAiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBtYW5hZ2VtZW50IHBvcnQgdG8gIgotCQkJICAgICAgICJnZXQgZnJlZSBiZWZvcmUgaXNzdWluZyBjb21tYW5kLlxuIiwKLQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0aWZfd2FybihxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LCBUSU1FRF9PVVRfTVNHKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNzg0LDE2ICs3MzgsMTIgQEAKIHsKIAl1MzIgdGVtcDsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAogCXFsX21paV9kaXNhYmxlX3NjYW5fbW9kZShxZGV2KTsKIAogCWlmIChxbF93YWl0X2Zvcl9taWlfcmVhZHkocWRldikpIHsKLQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKLQkJCSAgICAgICAiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBtYW5hZ2VtZW50IHBvcnQgdG8gIgotCQkJICAgICAgICJnZXQgZnJlZSBiZWZvcmUgaXNzdWluZyBjb21tYW5kLlxuIiwKLQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0aWZfd2FybihxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LCBUSU1FRF9PVVRfTVNHKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtODA4LDExICs3NTgsNyBAQAogCiAJLyogV2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUgKi8KIAlpZiAocWxfd2FpdF9mb3JfbWlpX3JlYWR5KHFkZXYpKSB7Ci0JCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCi0JCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFuYWdlbWVudCBwb3J0IHRvICIKLQkJCSAgICAgICAiZ2V0IGZyZWUgYmVmb3JlIGlzc3VpbmcgY29tbWFuZC5cbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGlmX3dhcm4ocWRldiwgbGluaywgcWRldi0+bmRldiwgVElNRURfT1VUX01TRyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTg5OCw3ICs4NDQsNyBAQAogCiBzdGF0aWMgdm9pZCBwaHlBZ2VyZVNwZWNpZmljSW5pdChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtaWlBZGRyKQogewotCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmFibGluZyBBZ2VyZSBzcGVjaWZpYyBQSFlcbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCW5ldGRldl9pbmZvKHFkZXYtPm5kZXYsICJlbmFibGluZyBBZ2VyZSBzcGVjaWZpYyBQSFlcbiIpOwogCS8qIHBvd2VyIGRvd24gZGV2aWNlIGJpdCAxMSA9IDEgKi8KIAlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIDB4MDAsIDB4MTk0MCwgbWlpQWRkcik7CiAJLyogZW5hYmxlIGRpYWdub3N0aWMgbW9kZSBiaXQgMiA9IDEgKi8KQEAgLTkxOCw3ICs4NjQsOCBAQAogCS8qIHBvaW50IHRvIGhpZGRlbiByZWcgMHgyODA2ICovCiAJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCAweDEwLCAweDI4MDYsIG1paUFkZHIpOwogCS8qIFdyaXRlIG5ldyBQSFlBRCB3L2JpdCA1IHNldCAqLwotCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgMHgxMSwgMHgwMDIwIHwgKFBIWUFkZHJbcWRldi0+bWFjX2luZGV4XSA+PiA4KSwgbWlpQWRkcik7CisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCAweDExLAorCQkJICAgIDB4MDAyMCB8IChQSFlBZGRyW3FkZXYtPm1hY19pbmRleF0gPj4gOCksIG1paUFkZHIpOwogCS8qCiAJICogRGlzYWJsZSBkaWFnbm9zdGljIG1vZGUgYml0IDIgPSAwCiAJICogUG93ZXIgdXAgZGV2aWNlIGJpdCAxMSA9IDAKQEAgLTkyOSwyMSArODc2LDE5IEBACiAJcWxfbWlpX3dyaXRlX3JlZyhxZGV2LCAweDFjLCAweGZhZjApOwogfQogCi1zdGF0aWMgUEhZX0RFVklDRV9ldCBnZXRQaHlUeXBlIChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCi0JCQkJIHUxNiBwaHlJZFJlZzAsIHUxNiBwaHlJZFJlZzEpCitzdGF0aWMgZW51bSBQSFlfREVWSUNFX1RZUEUgZ2V0UGh5VHlwZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgICAgIHUxNiBwaHlJZFJlZzAsIHUxNiBwaHlJZFJlZzEpCiB7Ci0JUEhZX0RFVklDRV9ldCByZXN1bHQgPSBQSFlfVFlQRV9VTktOT1dOOworCWVudW0gUEhZX0RFVklDRV9UWVBFIHJlc3VsdCA9IFBIWV9UWVBFX1VOS05PV047CiAJdTMyICAgb3VpOwogCXUxNiAgIG1vZGVsOwogCWludCBpOwogCi0JaWYgKHBoeUlkUmVnMCA9PSAweGZmZmYpIHsKKwlpZiAocGh5SWRSZWcwID09IDB4ZmZmZikKIAkJcmV0dXJuIHJlc3VsdDsKLQl9CiAKLQlpZiAocGh5SWRSZWcxID09IDB4ZmZmZikgeworCWlmIChwaHlJZFJlZzEgPT0gMHhmZmZmKQogCQlyZXR1cm4gcmVzdWx0OwotCX0KIAogCS8qIG91aSBpcyBzcGxpdCBiZXR3ZWVuIHR3byByZWdpc3RlcnMgKi8KIAlvdWkgPSAocGh5SWRSZWcwIDw8IDYpIHwgKChwaHlJZFJlZzEgJiBQSFlfT1VJXzFfTUFTSykgPj4gMTApOwpAQCAtOTUxLDE1ICs4OTYsMTMgQEAKIAltb2RlbCA9IChwaHlJZFJlZzEgJiBQSFlfTU9ERUxfTUFTSykgPj4gNDsKIAogCS8qIFNjYW4gdGFibGUgZm9yIHRoaXMgUEhZICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYX1BIWV9ERVZfVFlQRVM7IGkrKykgewotCQlpZiAoKG91aSA9PSBQSFlfREVWSUNFU1tpXS5waHlJZE9VSSkgJiYgKG1vZGVsID09IFBIWV9ERVZJQ0VTW2ldLnBoeUlkTW9kZWwpKQotCQl7CisJZm9yIChpID0gMDsgaSA8IE1BWF9QSFlfREVWX1RZUEVTOyBpKyspIHsKKwkJaWYgKChvdWkgPT0gUEhZX0RFVklDRVNbaV0ucGh5SWRPVUkpICYmCisJCSAgICAobW9kZWwgPT0gUEhZX0RFVklDRVNbaV0ucGh5SWRNb2RlbCkpIHsKKwkJCW5ldGRldl9pbmZvKHFkZXYtPm5kZXYsICJQaHk6ICVzXG4iLAorCQkJCSAgICBQSFlfREVWSUNFU1tpXS5uYW1lKTsKIAkJCXJlc3VsdCA9IFBIWV9ERVZJQ0VTW2ldLnBoeURldmljZTsKLQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBoeTogJXNcbiIsCi0JCQkJcWRldi0+bmRldi0+bmFtZSwgUEhZX0RFVklDRVNbaV0ubmFtZSk7Ci0KLQkJICAgICAgICBicmVhazsKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC05NzAsOSArOTEzLDggQEAKIHsKIAl1MTYgcmVnOwogCi0Jc3dpdGNoKHFkZXYtPnBoeVR5cGUpIHsKLQljYXNlIFBIWV9BR0VSRV9FVDEwMTFDOgotCXsKKwlzd2l0Y2ggKHFkZXYtPnBoeVR5cGUpIHsKKwljYXNlIFBIWV9BR0VSRV9FVDEwMTFDOiB7CiAJCWlmIChxbF9taWlfcmVhZF9yZWcocWRldiwgMHgxQSwgJnJlZykgPCAwKQogCQkJcmV0dXJuIDA7CiAKQEAgLTk4MCwyMCArOTIyLDIwIEBACiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OgotCWlmIChxbF9taWlfcmVhZF9yZWcocWRldiwgQVVYX0NPTlRST0xfU1RBVFVTLCAmcmVnKSA8IDApCi0JCXJldHVybiAwOworCQlpZiAocWxfbWlpX3JlYWRfcmVnKHFkZXYsIEFVWF9DT05UUk9MX1NUQVRVUywgJnJlZykgPCAwKQorCQkJcmV0dXJuIDA7CiAKLQlyZWcgPSAoKChyZWcgJiAweDE4KSA+PiAzKSAmIDMpOworCQlyZWcgPSAoKChyZWcgJiAweDE4KSA+PiAzKSAmIDMpOwogCX0KIAotCXN3aXRjaChyZWcpIHsKLQkJY2FzZSAyOgorCXN3aXRjaCAocmVnKSB7CisJY2FzZSAyOgogCQlyZXR1cm4gU1BFRURfMTAwMDsKLQkJY2FzZSAxOgorCWNhc2UgMToKIAkJcmV0dXJuIFNQRUVEXzEwMDsKLQkJY2FzZSAwOgorCWNhc2UgMDoKIAkJcmV0dXJuIFNQRUVEXzEwOwotCQlkZWZhdWx0OgorCWRlZmF1bHQ6CiAJCXJldHVybiAtMTsKIAl9CiB9CkBAIC0xMDAyLDE3ICs5NDQsMTUgQEAKIHsKIAl1MTYgcmVnOwogCi0Jc3dpdGNoKHFkZXYtPnBoeVR5cGUpIHsKLQljYXNlIFBIWV9BR0VSRV9FVDEwMTFDOgotCXsKKwlzd2l0Y2ggKHFkZXYtPnBoeVR5cGUpIHsKKwljYXNlIFBIWV9BR0VSRV9FVDEwMTFDOiB7CiAJCWlmIChxbF9taWlfcmVhZF9yZWcocWRldiwgMHgxQSwgJnJlZykpCiAJCQlyZXR1cm4gMDsKIAogCQlyZXR1cm4gKChyZWcgJiAweDAwODApICYmIChyZWcgJiAweDEwMDApKSAhPSAwOwogCX0KIAljYXNlIFBIWV9WSVRFU1NFX1ZTQzgyMTE6Ci0JZGVmYXVsdDoKLQl7CisJZGVmYXVsdDogewogCQlpZiAocWxfbWlpX3JlYWRfcmVnKHFkZXYsIEFVWF9DT05UUk9MX1NUQVRVUywgJnJlZykgPCAwKQogCQkJcmV0dXJuIDA7CiAJCXJldHVybiAocmVnICYgUEhZX0FVWF9EVVBMRVhfU1RBVCkgIT0gMDsKQEAgLTEwNDAsMTcgKzk4MCwxNSBAQAogCiAJLyogIERldGVybWluZSB0aGUgUEhZIHdlIGFyZSB1c2luZyBieSByZWFkaW5nIHRoZSBJRCdzICovCiAJZXJyID0gcWxfbWlpX3JlYWRfcmVnKHFkZXYsIFBIWV9JRF8wX1JFRywgJnJlZzEpOwotCWlmKGVyciAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8wX1JFR1xuIiwKLQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJaWYgKGVyciAhPSAwKSB7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIkNvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8wX1JFR1xuIik7CisJCXJldHVybiBlcnI7CiAJfQogCiAJZXJyID0gcWxfbWlpX3JlYWRfcmVnKHFkZXYsIFBIWV9JRF8xX1JFRywgJnJlZzIpOwotCWlmKGVyciAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8wX1JFR1xuIiwKLQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJaWYgKGVyciAhPSAwKSB7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIkNvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8xX1JFR1xuIik7CisJCXJldHVybiBlcnI7CiAJfQogCiAJLyogIENoZWNrIGlmIHdlIGhhdmUgYSBBZ2VyZSBQSFkgKi8KQEAgLTEwNTgsMjQgKzk5NiwyMiBAQAogCiAJCS8qIERldGVybWluZSB3aGljaCBNSUkgYWRkcmVzcyB3ZSBzaG91bGQgYmUgdXNpbmcKIAkJICAgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggb2YgdGhlIGNhcmQgKi8KLQkJaWYgKHFkZXYtPm1hY19pbmRleCA9PSAwKSB7CisJCWlmIChxZGV2LT5tYWNfaW5kZXggPT0gMCkKIAkJCW1paUFkZHIgPSBNSUlfQUdFUkVfQUREUl8xOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQltaWlBZGRyID0gTUlJX0FHRVJFX0FERFJfMjsKLQkJfQogCi0JCWVyciA9cWxfbWlpX3JlYWRfcmVnX2V4KHFkZXYsIFBIWV9JRF8wX1JFRywgJnJlZzEsIG1paUFkZHIpOwotCQlpZihlcnIgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IHJlYWQgZnJvbSByZWcgUEhZX0lEXzBfUkVHIGFmdGVyIEFnZXJlIGRldGVjdGVkXG4iLAotCQkgICAgICAgCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJZXJyID0gcWxfbWlpX3JlYWRfcmVnX2V4KHFkZXYsIFBIWV9JRF8wX1JFRywgJnJlZzEsIG1paUFkZHIpOworCQlpZiAoZXJyICE9IDApIHsKKwkJCW5ldGRldl9lcnIocWRldi0+bmRldiwKKwkJCQkgICAiQ291bGQgbm90IHJlYWQgZnJvbSByZWcgUEhZX0lEXzBfUkVHIGFmdGVyIEFnZXJlIGRldGVjdGVkXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAogCQllcnIgPSBxbF9taWlfcmVhZF9yZWdfZXgocWRldiwgUEhZX0lEXzFfUkVHLCAmcmVnMiwgbWlpQWRkcik7Ci0JCWlmKGVyciAhPSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgcmVhZCBmcm9tIHJlZyBQSFlfSURfMF9SRUcgYWZ0ZXIgQWdlcmUgZGV0ZWN0ZWRcbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7Ci0gICAgICAgIAkgICAgICAgIHJldHVybiBlcnI7CisJCWlmIChlcnIgIT0gMCkgeworCQkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiQ291bGQgbm90IHJlYWQgZnJvbSByZWcgUEhZX0lEXzFfUkVHIGFmdGVyIEFnZXJlIGRldGVjdGVkXG4iKTsKKwkJCXJldHVybiBlcnI7CiAJCX0KIAogCQkvKiAgV2UgbmVlZCB0byByZW1lbWJlciB0byBpbml0aWFsaXplIHRoZSBBZ2VyZSBQSFkgKi8KQEAgLTEwOTAsNyArMTAyNiw3IEBACiAJCS8qIG5lZWQgdGhpcyBoZXJlIHNvIGFkZHJlc3MgZ2V0cyBjaGFuZ2VkICovCiAJCXBoeUFnZXJlU3BlY2lmaWNJbml0KHFkZXYsIG1paUFkZHIpOwogCX0gZWxzZSBpZiAocWRldi0+cGh5VHlwZSA9PSBQSFlfVFlQRV9VTktOT1dOKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFBIWSBpcyB1bmtub3duXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiUEhZIGlzIHVua25vd25cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTExMDMsNyArMTAzOSw3IEBACiBzdGF0aWMgdm9pZCBxbF9tYWNfZW5hYmxlKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIGVuYWJsZSkKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgdmFsdWU7CiAKIAlpZiAoZW5hYmxlKQpAQCAtMTEyMyw3ICsxMDU5LDcgQEAKIHN0YXRpYyB2b2lkIHFsX21hY19jZmdfc29mdF9yZXNldChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBlbmFibGUpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIHZhbHVlOwogCiAJaWYgKGVuYWJsZSkKQEAgLTExNDMsNyArMTA3OSw3IEBACiBzdGF0aWMgdm9pZCBxbF9tYWNfY2ZnX2dpZyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBlbmFibGUpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIHZhbHVlOwogCiAJaWYgKGVuYWJsZSkKQEAgLTExNjMsNyArMTA5OSw3IEBACiBzdGF0aWMgdm9pZCBxbF9tYWNfY2ZnX2Z1bGxfZHVwKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIGVuYWJsZSkKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgdmFsdWU7CiAKIAlpZiAoZW5hYmxlKQpAQCAtMTE4Myw3ICsxMTE5LDcgQEAKIHN0YXRpYyB2b2lkIHFsX21hY19jZmdfcGF1c2Uoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgZW5hYmxlKQogewogCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KLQkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwkJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCXUzMiB2YWx1ZTsKIAogCWlmIChlbmFibGUpCkBAIC0xMjA1LDcgKzExNDEsNyBAQAogc3RhdGljIGludCBxbF9pc19maWJlcihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIGJpdFRvQ2hlY2sgPSAwOwogCXUzMiB0ZW1wOwogCkBAIC0xMjM1LDcgKzExNzEsNyBAQAogc3RhdGljIGludCBxbF9pc19hdXRvX25lZ19jb21wbGV0ZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIGJpdFRvQ2hlY2sgPSAwOwogCXUzMiB0ZW1wOwogCkBAIC0xMjUwLDE4ICsxMTg2LDExIEBACiAKIAl0ZW1wID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7CiAJaWYgKHRlbXAgJiBiaXRUb0NoZWNrKSB7Ci0JCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYCi0JCQkgICAgICAgIiVzOiBBdXRvLU5lZ290aWF0ZSBjb21wbGV0ZS5cbiIsCi0JCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGlmX2luZm8ocWRldiwgbGluaywgcWRldi0+bmRldiwgIkF1dG8tTmVnb3RpYXRlIGNvbXBsZXRlXG4iKTsKIAkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKLQkJCSAgICAgICAiJXM6IEF1dG8tTmVnb3RpYXRlIGluY29tcGxldGUuXG4iLAotCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOwotCQlyZXR1cm4gMDsKIAl9CisJbmV0aWZfaW5mbyhxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LCAiQXV0by1OZWdvdGlhdGUgaW5jb21wbGV0ZVxuIik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMjc4LDcgKzEyMDcsNyBAQAogc3RhdGljIGludCBxbF9hdXRvX25lZ19lcnJvcihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIGJpdFRvQ2hlY2sgPSAwOwogCXUzMiB0ZW1wOwogCkBAIC0xMzE2LDcgKzEyNDUsNyBAQAogc3RhdGljIGludCBxbF9saW5rX2Rvd25fZGV0ZWN0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgYml0VG9DaGVjayA9IDA7CiAJdTMyIHRlbXA7CiAKQEAgLTEzNDAsNyArMTI2OSw3IEBACiBzdGF0aWMgaW50IHFsX2xpbmtfZG93bl9kZXRlY3RfY2xlYXIoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewogCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KLQkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwkJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCiAJc3dpdGNoIChxZGV2LT5tYWNfaW5kZXgpIHsKIAljYXNlIDA6CkBAIC0xMzcwLDcgKzEyOTksNyBAQAogc3RhdGljIGludCBxbF90aGlzX2FkYXB0ZXJfY29udHJvbHNfcG9ydChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIGJpdFRvQ2hlY2sgPSAwOwogCXUzMiB0ZW1wOwogCkBAIC0xMzg3LDE2ICsxMzE2LDEzIEBACiAKIAl0ZW1wID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7CiAJaWYgKHRlbXAgJiBiaXRUb0NoZWNrKSB7Ci0JCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAotCQkJICAgICAgICIlczogaXMgbm90IGxpbmsgbWFzdGVyLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGlmX3ByaW50ayhxZGV2LCBsaW5rLCBLRVJOX0RFQlVHLCBxZGV2LT5uZGV2LAorCQkJICAgICAibm90IGxpbmsgbWFzdGVyXG4iKTsKIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCi0JCQkgICAgICAgIiVzOiBpcyBsaW5rIG1hc3Rlci5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOwotCQlyZXR1cm4gMTsKIAl9CisKKwluZXRpZl9wcmludGsocWRldiwgbGluaywgS0VSTl9ERUJVRywgcWRldi0+bmRldiwgImxpbmsgbWFzdGVyXG4iKTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgcWxfcGh5X3Jlc2V0X2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTE0MTAsMTkgKzEzMzYsMjAgQEAKIAl1MTYgcmVnOwogCXUxNiBwb3J0Q29uZmlndXJhdGlvbjsKIAotCWlmKHFkZXYtPnBoeVR5cGUgPT0gUEhZX0FHRVJFX0VUMTAxMUMpIHsKLQkJLyogdHVybiBvZmYgZXh0ZXJuYWwgbG9vcGJhY2sgKi8KKwlpZiAocWRldi0+cGh5VHlwZSA9PSBQSFlfQUdFUkVfRVQxMDExQykKIAkJcWxfbWlpX3dyaXRlX3JlZyhxZGV2LCAweDEzLCAweDAwMDApOwotCX0KKwkJCQkJLyogdHVybiBvZmYgZXh0ZXJuYWwgbG9vcGJhY2sgKi8KIAotCWlmKHFkZXYtPm1hY19pbmRleCA9PSAwKQotCQlwb3J0Q29uZmlndXJhdGlvbiA9IHFkZXYtPm52cmFtX2RhdGEubWFjQ2ZnX3BvcnQwLnBvcnRDb25maWd1cmF0aW9uOworCWlmIChxZGV2LT5tYWNfaW5kZXggPT0gMCkKKwkJcG9ydENvbmZpZ3VyYXRpb24gPQorCQkJcWRldi0+bnZyYW1fZGF0YS5tYWNDZmdfcG9ydDAucG9ydENvbmZpZ3VyYXRpb247CiAJZWxzZQotCQlwb3J0Q29uZmlndXJhdGlvbiA9IHFkZXYtPm52cmFtX2RhdGEubWFjQ2ZnX3BvcnQxLnBvcnRDb25maWd1cmF0aW9uOworCQlwb3J0Q29uZmlndXJhdGlvbiA9CisJCQlxZGV2LT5udnJhbV9kYXRhLm1hY0NmZ19wb3J0MS5wb3J0Q29uZmlndXJhdGlvbjsKIAogCS8qICBTb21lIEhCQSdzIGluIHRoZSBmaWVsZCBhcmUgc2V0IHRvIDAgYW5kIHRoZXkgbmVlZCB0bwogCSAgICBiZSByZWludGVycHJldGVkIHdpdGggYSBkZWZhdWx0IHZhbHVlICovCi0JaWYocG9ydENvbmZpZ3VyYXRpb24gPT0gMCkKKwlpZiAocG9ydENvbmZpZ3VyYXRpb24gPT0gMCkKIAkJcG9ydENvbmZpZ3VyYXRpb24gPSBQT1JUX0NPTkZJR19ERUZBVUxUOwogCiAJLyogU2V0IHRoZSAxMDAwIGFkdmVydGlzZW1lbnRzICovCkBAIC0xNDMwLDggKzEzNTcsOCBAQAogCQkJICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKIAlyZWcgJj0gflBIWV9HSUdfQUxMX1BBUkFNUzsKIAotCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTAwME1CX1NQRUVEKSB7Ci0JCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfRlVMTF9EVVBMRVhfRU5BQkxFRCkKKwlpZiAocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR18xMDAwTUJfU1BFRUQpIHsKKwkJaWYgKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfRlVMTF9EVVBMRVhfRU5BQkxFRCkKIAkJCXJlZyB8PSBQSFlfR0lHX0FEVl8xMDAwRjsKIAkJZWxzZQogCQkJcmVnIHw9IFBIWV9HSUdfQURWXzEwMDBIOwpAQCAtMTQ0NSwyOSArMTM3MiwyNyBAQAogCQkJICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKIAlyZWcgJj0gflBIWV9ORUdfQUxMX1BBUkFNUzsKIAotCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfU1lNX1BBVVNFX0VOQUJMRUQpCisJaWYgKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfU1lNX1BBVVNFX0VOQUJMRUQpCiAJCXJlZyB8PSBQSFlfTkVHX0FTWV9QQVVTRSB8IFBIWV9ORUdfU1lNX1BBVVNFOwogCi0JaWYocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR19GVUxMX0RVUExFWF9FTkFCTEVEKSB7Ci0JCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTAwTUJfU1BFRUQpCisJaWYgKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfRlVMTF9EVVBMRVhfRU5BQkxFRCkgeworCQlpZiAocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR18xMDBNQl9TUEVFRCkKIAkJCXJlZyB8PSBQSFlfTkVHX0FEVl8xMDBGOwogCi0JCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTBNQl9TUEVFRCkKKwkJaWYgKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTBNQl9TUEVFRCkKIAkJCXJlZyB8PSBQSFlfTkVHX0FEVl8xMEY7CiAJfQogCi0JaWYocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR19IQUxGX0RVUExFWF9FTkFCTEVEKSB7Ci0JCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTAwTUJfU1BFRUQpCisJaWYgKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfSEFMRl9EVVBMRVhfRU5BQkxFRCkgeworCQlpZiAocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR18xMDBNQl9TUEVFRCkKIAkJCXJlZyB8PSBQSFlfTkVHX0FEVl8xMDBIOwogCi0JCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTBNQl9TUEVFRCkKKwkJaWYgKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTBNQl9TUEVFRCkKIAkJCXJlZyB8PSBQSFlfTkVHX0FEVl8xMEg7CiAJfQogCi0JaWYocG9ydENvbmZpZ3VyYXRpb24gJgotCSAgIFBPUlRfQ09ORklHXzEwMDBNQl9TUEVFRCkgeworCWlmIChwb3J0Q29uZmlndXJhdGlvbiAmIFBPUlRfQ09ORklHXzEwMDBNQl9TUEVFRCkKIAkJcmVnIHw9IDE7Ci0JfQogCiAJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBQSFlfTkVHX0FEVkVSLCByZWcsCiAJCQkgICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKQEAgLTE0OTIsNyArMTQxNyw3IEBACiBzdGF0aWMgdTMyIHFsX2dldF9saW5rX3N0YXRlKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9Ci0JICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgYml0VG9DaGVjayA9IDA7CiAJdTMyIHRlbXAsIGxpbmtTdGF0ZTsKIApAQCAtMTUwNCwyMiArMTQyOSwyMiBAQAogCQliaXRUb0NoZWNrID0gUE9SVF9TVEFUVVNfVVAxOwogCQlicmVhazsKIAl9CisKIAl0ZW1wID0gcWxfcmVhZF9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+cG9ydFN0YXR1cyk7Ci0JaWYgKHRlbXAgJiBiaXRUb0NoZWNrKSB7CisJaWYgKHRlbXAgJiBiaXRUb0NoZWNrKQogCQlsaW5rU3RhdGUgPSBMU19VUDsKLQl9IGVsc2UgeworCWVsc2UKIAkJbGlua1N0YXRlID0gTFNfRE9XTjsKLQl9CisKIAlyZXR1cm4gbGlua1N0YXRlOwogfQogCiBzdGF0aWMgaW50IHFsX3BvcnRfc3RhcnQoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCWlmKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLLAorCWlmIChxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKIAkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgogCQkJIDIpIDw8IDcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBnZXQgaHcgbG9jayBmb3IgR0lPXG4iLAotCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIkNvdWxkIG5vdCBnZXQgaHcgbG9jayBmb3IgR0lPXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTUzNywxOSArMTQ2MiwxNiBAQAogc3RhdGljIGludCBxbF9maW5pc2hfYXV0b19uZWcoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewogCi0JaWYocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCisJaWYgKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLLAogCQkoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KSAqCiAJCQkgMikgPDwgNykpCiAJCXJldHVybiAtMTsKIAogCWlmICghcWxfYXV0b19uZWdfZXJyb3IocWRldikpIHsKLQkJaWYgKHRlc3RfYml0KFFMX0xJTktfTUFTVEVSLCZxZGV2LT5mbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KFFMX0xJTktfTUFTVEVSLCAmcWRldi0+ZmxhZ3MpKSB7CiAJCQkvKiBjb25maWd1cmUgdGhlIE1BQyAqLwotCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAotCQkJCSAgICAgICAiJXM6IENvbmZpZ3VyaW5nIGxpbmsuXG4iLAotCQkJCSAgICAgICBxZGV2LT5uZGV2LT4KLQkJCQkgICAgICAgbmFtZSk7CisJCQluZXRpZl9wcmludGsocWRldiwgbGluaywgS0VSTl9ERUJVRywgcWRldi0+bmRldiwKKwkJCQkgICAgICJDb25maWd1cmluZyBsaW5rXG4iKTsKIAkJCXFsX21hY19jZmdfc29mdF9yZXNldChxZGV2LCAxKTsKIAkJCXFsX21hY19jZmdfZ2lnKHFkZXYsCiAJCQkJICAgICAgIChxbF9nZXRfbGlua19zcGVlZApAQCAtMTU2NCw0MyArMTQ4NiwzMiBAQAogCQkJcWxfbWFjX2NmZ19zb2Z0X3Jlc2V0KHFkZXYsIDApOwogCiAJCQkvKiBlbmFibGUgdGhlIE1BQyAqLwotCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAotCQkJCSAgICAgICAiJXM6IEVuYWJsaW5nIG1hYy5cbiIsCi0JCQkJICAgICAgIHFkZXYtPm5kZXYtPgotCQkJCQkgICAgICAgbmFtZSk7CisJCQluZXRpZl9wcmludGsocWRldiwgbGluaywgS0VSTl9ERUJVRywgcWRldi0+bmRldiwKKwkJCQkgICAgICJFbmFibGluZyBtYWNcbiIpOwogCQkJcWxfbWFjX2VuYWJsZShxZGV2LCAxKTsKIAkJfQogCiAJCXFkZXYtPnBvcnRfbGlua19zdGF0ZSA9IExTX1VQOwogCQluZXRpZl9zdGFydF9xdWV1ZShxZGV2LT5uZGV2KTsKIAkJbmV0aWZfY2Fycmllcl9vbihxZGV2LT5uZGV2KTsKLQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKLQkJCSAgICAgICAiJXM6IExpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMgZHVwbGV4LlxuIiwKLQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLAotCQkJICAgICAgIHFsX2dldF9saW5rX3NwZWVkKHFkZXYpLAotCQkJICAgICAgIHFsX2lzX2xpbmtfZnVsbF9kdXAocWRldikKLQkJCSAgICAgICA/ICJmdWxsIiA6ICJoYWxmIik7CisJCW5ldGlmX2luZm8ocWRldiwgbGluaywgcWRldi0+bmRldiwKKwkJCSAgICJMaW5rIGlzIHVwIGF0ICVkIE1icHMsICVzIGR1cGxleFxuIiwKKwkJCSAgIHFsX2dldF9saW5rX3NwZWVkKHFkZXYpLAorCQkJICAgcWxfaXNfbGlua19mdWxsX2R1cChxZGV2KSA/ICJmdWxsIiA6ICJoYWxmIik7CiAKIAl9IGVsc2UgewkvKiBSZW1vdGUgZXJyb3IgZGV0ZWN0ZWQgKi8KIAotCQlpZiAodGVzdF9iaXQoUUxfTElOS19NQVNURVIsJnFkZXYtPmZsYWdzKSkgewotCQkJaWYgKG5ldGlmX21zZ19saW5rKHFkZXYpKQotCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAotCQkJCSAgICAgICAiJXM6IFJlbW90ZSBlcnJvciBkZXRlY3RlZC4gIgotCQkJCSAgICAgICAiQ2FsbGluZyBxbF9wb3J0X3N0YXJ0KCkuXG4iLAotCQkJCSAgICAgICBxZGV2LT5uZGV2LT4KLQkJCQkgICAgICAgbmFtZSk7CisJCWlmICh0ZXN0X2JpdChRTF9MSU5LX01BU1RFUiwgJnFkZXYtPmZsYWdzKSkgeworCQkJbmV0aWZfcHJpbnRrKHFkZXYsIGxpbmssIEtFUk5fREVCVUcsIHFkZXYtPm5kZXYsCisJCQkJICAgICAiUmVtb3RlIGVycm9yIGRldGVjdGVkLiBDYWxsaW5nIHFsX3BvcnRfc3RhcnQoKVxuIik7CiAJCQkvKgogCQkJICogcWxfcG9ydF9zdGFydCgpIGlzIHNoYXJlZCBjb2RlIGFuZCBuZWVkcwogCQkJICogdG8gbG9jayB0aGUgUEhZIG9uIGl0J3Mgb3duLgogCQkJICovCiAJCQlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0spOwotCQkJaWYocWxfcG9ydF9zdGFydChxZGV2KSkJey8qIFJlc3RhcnQgcG9ydCAqLworCQkJaWYgKHFsX3BvcnRfc3RhcnQocWRldikpCS8qIFJlc3RhcnQgcG9ydCAqLwogCQkJCXJldHVybiAtMTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiAwOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLKTsKQEAgLTE2MTksMzMgKzE1MzAsMjggQEAKIAogCWN1cnJfbGlua19zdGF0ZSA9IHFsX2dldF9saW5rX3N0YXRlKHFkZXYpOwogCi0JaWYgKHRlc3RfYml0KFFMX1JFU0VUX0FDVElWRSwmcWRldi0+ZmxhZ3MpKSB7Ci0JCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYCi0JCQkgICAgICAgIiVzOiBSZXNldCBpbiBwcm9ncmVzcywgc2tpcCBwcm9jZXNzaW5nIGxpbmsgIgotCQkJICAgICAgICJzdGF0ZS5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCWlmICh0ZXN0X2JpdChRTF9SRVNFVF9BQ1RJVkUsICZxZGV2LT5mbGFncykpIHsKKwkJbmV0aWZfaW5mbyhxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LAorCQkJICAgIlJlc2V0IGluIHByb2dyZXNzLCBza2lwIHByb2Nlc3NpbmcgbGluayBzdGF0ZVxuIik7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwogCiAJCS8qIFJlc3RhcnQgdGltZXIgb24gMiBzZWNvbmQgaW50ZXJ2YWwuICovCi0JCW1vZF90aW1lcigmcWRldi0+YWRhcHRlcl90aW1lciwgamlmZmllcyArIEhaICogMSk7XAorCQltb2RfdGltZXIoJnFkZXYtPmFkYXB0ZXJfdGltZXIsIGppZmZpZXMgKyBIWiAqIDEpOwogCiAJCXJldHVybjsKIAl9CiAKIAlzd2l0Y2ggKHFkZXYtPnBvcnRfbGlua19zdGF0ZSkgewogCWRlZmF1bHQ6Ci0JCWlmICh0ZXN0X2JpdChRTF9MSU5LX01BU1RFUiwmcWRldi0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChRTF9MSU5LX01BU1RFUiwgJnFkZXYtPmZsYWdzKSkKIAkJCXFsX3BvcnRfc3RhcnQocWRldik7Ci0JCX0KIAkJcWRldi0+cG9ydF9saW5rX3N0YXRlID0gTFNfRE9XTjsKIAkJLyogRmFsbCBUaHJvdWdoICovCiAKIAljYXNlIExTX0RPV046CiAJCWlmIChjdXJyX2xpbmtfc3RhdGUgPT0gTFNfVVApIHsKLQkJCWlmIChuZXRpZl9tc2dfbGluayhxZGV2KSkKLQkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IExpbmsgaXMgdXAuXG4iLAotCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2luZm8ocWRldiwgbGluaywgcWRldi0+bmRldiwgIkxpbmsgaXMgdXBcbiIpOwogCQkJaWYgKHFsX2lzX2F1dG9fbmVnX2NvbXBsZXRlKHFkZXYpKQogCQkJCXFsX2ZpbmlzaF9hdXRvX25lZyhxZGV2KTsKIApAQCAtMTY2Miw5ICsxNTY4LDcgQEAKIAkJICogYmFjayB1cAogCQkgKi8KIAkJaWYgKGN1cnJfbGlua19zdGF0ZSA9PSBMU19ET1dOKSB7Ci0JCQlpZiAobmV0aWZfbXNnX2xpbmsocWRldikpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIGlzIGRvd24uXG4iLAotCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2luZm8ocWRldiwgbGluaywgcWRldi0+bmRldiwgIkxpbmsgaXMgZG93blxuIik7CiAJCQlxZGV2LT5wb3J0X2xpbmtfc3RhdGUgPSBMU19ET1dOOwogCQl9CiAJCWlmIChxbF9saW5rX2Rvd25fZGV0ZWN0KHFkZXYpKQpAQCAtMTY4Myw5ICsxNTg3LDkgQEAKIHN0YXRpYyB2b2lkIHFsX2dldF9waHlfb3duZXIoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewogCWlmIChxbF90aGlzX2FkYXB0ZXJfY29udHJvbHNfcG9ydChxZGV2KSkKLQkJc2V0X2JpdChRTF9MSU5LX01BU1RFUiwmcWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFFMX0xJTktfTUFTVEVSLCAmcWRldi0+ZmxhZ3MpOwogCWVsc2UKLQkJY2xlYXJfYml0KFFMX0xJTktfTUFTVEVSLCZxZGV2LT5mbGFncyk7CisJCWNsZWFyX2JpdChRTF9MSU5LX01BU1RFUiwgJnFkZXYtPmZsYWdzKTsKIH0KIAogLyoKQEAgLTE2OTUsNyArMTU5OSw3IEBACiB7CiAJcWxfbWlpX2VuYWJsZV9zY2FuX21vZGUocWRldik7CiAKLQlpZiAodGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCAmcWRldi0+ZmxhZ3MpKSB7CiAJCWlmIChxbF90aGlzX2FkYXB0ZXJfY29udHJvbHNfcG9ydChxZGV2KSkKIAkJCXFsX3BldGJpX2luaXRfZXgocWRldik7CiAJfSBlbHNlIHsKQEAgLTE3MDUsMTggKzE2MDksMTggQEAKIH0KIAogLyoKLSAqIE1JSV9TZXR1cCBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHRha2luZyB0aGUgUEhZIG91dCBvZiByZXNldCBzbyB0aGF0IHRoZQotICogbWFuYWdlbWVudCBpbnRlcmZhY2UgY2xvY2sgc3BlZWQgY2FuIGJlIHNldCBwcm9wZXJseS4gIEl0IHdvdWxkIGJlIGJldHRlciBpZgotICogd2UgaGFkIGEgd2F5IHRvIGRpc2FibGUgTURDIHVudGlsIGFmdGVyIHRoZSBQSFkgaXMgb3V0IG9mIHJlc2V0LCBidXQgd2UKLSAqIGRvbid0IGhhdmUgdGhhdCBjYXBhYmlsaXR5LgorICogTUlJX1NldHVwIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGFraW5nIHRoZSBQSFkgb3V0IG9mIHJlc2V0CisgKiBzbyB0aGF0IHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZSBjbG9jayBzcGVlZCBjYW4gYmUgc2V0IHByb3Blcmx5LgorICogSXQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGhhZCBhIHdheSB0byBkaXNhYmxlIE1EQyB1bnRpbCBhZnRlciB0aGUKKyAqIFBIWSBpcyBvdXQgb2YgcmVzZXQsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQgY2FwYWJpbGl0eS4KICAqLwogc3RhdGljIGludCBxbF9taWlfc2V0dXAoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewogCXUzMiByZWc7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQotCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCQkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAKLQlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwlpZiAocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCiAJCQkoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KSAqCiAJCQkgMikgPDwgNykpCiAJCXJldHVybiAtMTsKQEAgLTE3MzUsMjQgKzE2MzksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBTVVBQT1JURURfT1BUSUNBTF9NT0RFUwkoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwJXAorCQkJCSBTVVBQT1JURURfRklCUkUgfAkJXAorCQkJCSBTVVBQT1JURURfQXV0b25lZykKKyNkZWZpbmUgU1VQUE9SVEVEX1RQX01PREVTCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwJXAorCQkJCSBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwJXAorCQkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CVwKKwkJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAlcCisJCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8CVwKKwkJCQkgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwJXAorCQkJCSBTVVBQT1JURURfQXV0b25lZyB8CQlcCisJCQkJIFNVUFBPUlRFRF9UUCk7CQkJXAorCiBzdGF0aWMgdTMyIHFsX3N1cHBvcnRlZF9tb2RlcyhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7Ci0JdTMyIHN1cHBvcnRlZDsKKwlpZiAodGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCAmcWRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gU1VQUE9SVEVEX09QVElDQUxfTU9ERVM7CiAKLQlpZiAodGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncykpIHsKLQkJc3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFCi0JCSAgICB8IFNVUFBPUlRFRF9BdXRvbmVnOwotCX0gZWxzZSB7Ci0JCXN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKLQkJICAgIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAotCQkgICAgfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZgotCQkgICAgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAotCQkgICAgfCBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKLQkJICAgIHwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCi0JCSAgICB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQOwotCX0KLQotCXJldHVybiBzdXBwb3J0ZWQ7CisJcmV0dXJuIFNVUFBPUlRFRF9UUF9NT0RFUzsKIH0KIAogc3RhdGljIGludCBxbF9nZXRfYXV0b19jZmdfc3RhdHVzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTE3NjAsOSArMTY2NCw5IEBACiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7Ci0JaWYocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCi0JCShRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8IChxZGV2LT5tYWNfaW5kZXgpICoKLQkJCSAyKSA8PCA3KSkgeworCWlmIChxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwkJCSAgICAoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfAorCQkJICAgICAocWRldi0+bWFjX2luZGV4KSAqIDIpIDw8IDcpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTc3Nyw5ICsxNjgxLDkgQEAKIAl1MzIgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKLQlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKLQkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgotCQkJIDIpIDw8IDcpKSB7CisJaWYgKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLLAorCQkJICAgIChRTF9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8CisJCQkgICAgIChxZGV2LT5tYWNfaW5kZXgpICogMikgPDwgNykpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNzk0LDkgKzE2OTgsOSBAQAogCWludCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBod19mbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwotCWlmKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9QSFlfR0lPX1NFTV9NQVNLLAotCQkoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KSAqCi0JCQkgMikgPDwgNykpIHsKKwlpZiAocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCisJCQkgICAgKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwKKwkJCSAgICAgKHFkZXYtPm1hY19pbmRleCkgKiAyKSA8PCA3KSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE4MDYsNyArMTcxMCw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCiBzdGF0aWMgaW50IHFsX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewogCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtMTgxNCw3ICsxNzE3LDcgQEAKIAllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CiAJZWNtZC0+c3VwcG9ydGVkID0gcWxfc3VwcG9ydGVkX21vZGVzKHFkZXYpOwogCi0JaWYgKHRlc3RfYml0KFFMX0xJTktfT1BUSUNBTCwmcWRldi0+ZmxhZ3MpKSB7CisJaWYgKHRlc3RfYml0KFFMX0xJTktfT1BUSUNBTCwgJnFkZXYtPmZsYWdzKSkgewogCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKIAl9IGVsc2UgewogCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKQEAgLTE4NTUsMTAgKzE3NTgsMTEgQEAKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQogewogCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAogCXUzMiByZWc7Ci0JaWYocWRldi0+bWFjX2luZGV4ID09IDApCisJaWYgKHFkZXYtPm1hY19pbmRleCA9PSAwKQogCQlyZWcgPSBxbF9yZWFkX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWMwQ29uZmlnUmVnKTsKIAllbHNlCiAJCXJlZyA9IHFsX3JlYWRfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hYzFDb25maWdSZWcpOwpAQCAtMTg4NSwxMiArMTc4OSwxMiBAQAogCiAJd2hpbGUgKGxyZ19idWZfY2IpIHsKIAkJaWYgKCFscmdfYnVmX2NiLT5za2IpIHsKLQkJCWxyZ19idWZfY2ItPnNrYiA9IG5ldGRldl9hbGxvY19za2IocWRldi0+bmRldiwKLQkJCQkJCQkgICBxZGV2LT5scmdfYnVmZmVyX2xlbik7CisJCQlscmdfYnVmX2NiLT5za2IgPQorCQkJCW5ldGRldl9hbGxvY19za2IocWRldi0+bmRldiwKKwkJCQkJCSBxZGV2LT5scmdfYnVmZmVyX2xlbik7CiAJCQlpZiAodW5saWtlbHkoIWxyZ19idWZfY2ItPnNrYikpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKLQkJCQkgICAgICAgIiVzOiBGYWlsZWQgbmV0ZGV2X2FsbG9jX3NrYigpLlxuIiwKLQkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQkJbmV0ZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBxZGV2LT5uZGV2LAorCQkJCQkgICAgICAiRmFpbGVkIG5ldGRldl9hbGxvY19za2IoKVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgewogCQkJCS8qCkBAIC0xOTA1LDkgKzE4MDksMTAgQEAKIAkJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQkJCWVyciA9IHBjaV9kbWFfbWFwcGluZ19lcnJvcihxZGV2LT5wZGV2LCBtYXApOwotCQkJCWlmKGVycikgewotCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgbWFwcGluZyBmYWlsZWQgd2l0aCBlcnJvcjogJWRcbiIsCi0JCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLCBlcnIpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LAorCQkJCQkJICAgIlBDSSBtYXBwaW5nIGZhaWxlZCB3aXRoIGVycm9yOiAlZFxuIiwKKwkJCQkJCSAgIGVycik7CiAJCQkJCWRldl9rZnJlZV9za2IobHJnX2J1Zl9jYi0+c2tiKTsKIAkJCQkJbHJnX2J1Zl9jYi0+c2tiID0gTlVMTDsKIAkJCQkJYnJlYWs7CkBAIC0xOTE1LDkgKzE4MjAsOSBAQAogCiAKIAkJCQlscmdfYnVmX2NiLT5idWZfcGh5X2FkZHJfbG93ID0KLQkJCQkgICAgY3B1X3RvX2xlMzIoTFNfNjRCSVRTKG1hcCkpOworCQkJCQljcHVfdG9fbGUzMihMU182NEJJVFMobWFwKSk7CiAJCQkJbHJnX2J1Zl9jYi0+YnVmX3BoeV9hZGRyX2hpZ2ggPQotCQkJCSAgICBjcHVfdG9fbGUzMihNU182NEJJVFMobWFwKSk7CisJCQkJCWNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKIAkJCQlkbWFfdW5tYXBfYWRkcl9zZXQobHJnX2J1Zl9jYiwgbWFwYWRkciwgbWFwKTsKIAkJCQlkbWFfdW5tYXBfbGVuX3NldChscmdfYnVmX2NiLCBtYXBsZW4sCiAJCQkJCQkgIHFkZXYtPmxyZ19idWZmZXJfbGVuIC0KQEAgLTE5MzcsNyArMTg0Miw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHFsX3VwZGF0ZV9zbWFsbF9idWZxX3Byb2RfaW5kZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwogCWlmIChxZGV2LT5zbWFsbF9idWZfcmVsZWFzZV9jbnQgPj0gMTYpIHsKIAkJd2hpbGUgKHFkZXYtPnNtYWxsX2J1Zl9yZWxlYXNlX2NudCA+PSAxNikgewogCQkJcWRldi0+c21hbGxfYnVmX3FfcHJvZHVjZXJfaW5kZXgrKzsKQEAgLTE5NjEsNyArMTg2OCw4IEBACiAJc3RydWN0IGJ1ZnFfYWRkcl9lbGVtZW50ICpscmdfYnVmX3FfZWxlOwogCWludCBpOwogCXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpscmdfYnVmX2NiOwotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAogCWlmICgocWRldi0+bHJnX2J1Zl9mcmVlX2NvdW50ID49IDgpICYmCiAJICAgIChxZGV2LT5scmdfYnVmX3JlbGVhc2VfY250ID49IDE2KSkgewpAQCAtMTk4OSw3ICsxODk3LDggQEAKIAogCQkJcWRldi0+bHJnX2J1Zl9xX3Byb2R1Y2VyX2luZGV4Kys7CiAKLQkJCWlmIChxZGV2LT5scmdfYnVmX3FfcHJvZHVjZXJfaW5kZXggPT0gcWRldi0+bnVtX2xidWZxX2VudHJpZXMpCisJCQlpZiAocWRldi0+bHJnX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID09CisJCQkgICAgcWRldi0+bnVtX2xidWZxX2VudHJpZXMpCiAJCQkJcWRldi0+bHJnX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID0gMDsKIAogCQkJaWYgKHFkZXYtPmxyZ19idWZfcV9wcm9kdWNlcl9pbmRleCA9PQpAQCAtMjAxMSwyMyArMTkyMCwyNiBAQAogCWludCBpOwogCWludCByZXR2YWwgPSAwOwogCi0JaWYobWFjX3JzcC0+ZmxhZ3MgJiBPQl9NQUNfSU9DQl9SU1BfUykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGcmFtZSBzaG9ydCBidXQsIGZyYW1lIHdhcyBwYWRkZWQgYW5kIHNlbnQuXG4iKTsKKwlpZiAobWFjX3JzcC0+ZmxhZ3MgJiBPQl9NQUNfSU9DQl9SU1BfUykgeworCQluZXRkZXZfd2FybihxZGV2LT5uZGV2LAorCQkJICAgICJGcmFtZSB0b28gc2hvcnQgYnV0IGl0IHdhcyBwYWRkZWQgYW5kIHNlbnRcbiIpOwogCX0KIAogCXR4X2NiID0gJnFkZXYtPnR4X2J1ZlttYWNfcnNwLT50cmFuc2FjdGlvbl9pZF07CiAKIAkvKiAgQ2hlY2sgdGhlIHRyYW5zbWl0IHJlc3BvbnNlIGZsYWdzIGZvciBhbnkgZXJyb3JzICovCi0JaWYobWFjX3JzcC0+ZmxhZ3MgJiBPQl9NQUNfSU9DQl9SU1BfUykgewotCQlwcmludGsoS0VSTl9FUlIgIkZyYW1lIHRvbyBzaG9ydCB0byBiZSBsZWdhbCwgZnJhbWUgbm90IHNlbnQuXG4iKTsKKwlpZiAobWFjX3JzcC0+ZmxhZ3MgJiBPQl9NQUNfSU9DQl9SU1BfUykgeworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsCisJCQkgICAiRnJhbWUgdG9vIHNob3J0IHRvIGJlIGxlZ2FsLCBmcmFtZSBub3Qgc2VudFxuIik7CiAKIAkJcWRldi0+bmRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gZnJhbWVfbm90X3NlbnQ7CiAJfQogCi0JaWYodHhfY2ItPnNlZ19jb3VudCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHhfY2ItPnNlZ19jb3VudCA9PSAwOiAlZFxuIiwgbWFjX3JzcC0+dHJhbnNhY3Rpb25faWQpOworCWlmICh0eF9jYi0+c2VnX2NvdW50ID09IDApIHsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAidHhfY2ItPnNlZ19jb3VudCA9PSAwOiAlZFxuIiwKKwkJCSAgIG1hY19yc3AtPnRyYW5zYWN0aW9uX2lkKTsKIAogCQlxZGV2LT5uZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJcmV0dmFsID0gLUVJTzsKQEAgLTIwNzMsNyArMTk4NSw3IEBACiAJcWRldi0+bHJnX2J1Zl9yZWxlYXNlX2NudCsrOwogCWlmICgrK3FkZXYtPmxyZ19idWZfaW5kZXggPT0gcWRldi0+bnVtX2xhcmdlX2J1ZmZlcnMpCiAJCXFkZXYtPmxyZ19idWZfaW5kZXggPSAwOwotCXJldHVybihscmdfYnVmX2NiKTsKKwlyZXR1cm4gbHJnX2J1Zl9jYjsKIH0KIAogLyoKQEAgLTIxNzcsMTIgKzIwODksMTEgQEAKIAkJaWYgKGNoZWNrc3VtICYKIAkJCShJQl9JUF9JT0NCX1JTUF8zMDMyX0lDRSB8CiAJCQkgSUJfSVBfSU9DQl9SU1BfMzAzMl9DRSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogQmFkIGNoZWNrc3VtIGZvciB0aGlzICVzIHBhY2tldCwgY2hlY2tzdW0gPSAleC5cbiIsCi0JCQkgICAgICAgX19mdW5jX18sCi0JCQkgICAgICAgKChjaGVja3N1bSAmCi0JCQkJSUJfSVBfSU9DQl9SU1BfMzAzMl9UQ1ApID8gIlRDUCIgOgotCQkJCSJVRFAiKSxjaGVja3N1bSk7CisJCQluZXRkZXZfZXJyKG5kZXYsCisJCQkJICAgIiVzOiBCYWQgY2hlY2tzdW0gZm9yIHRoaXMgJXMgcGFja2V0LCBjaGVja3N1bSA9ICV4XG4iLAorCQkJCSAgIF9fZnVuY19fLAorCQkJCSAgICgoY2hlY2tzdW0gJiBJQl9JUF9JT0NCX1JTUF8zMDMyX1RDUCkgPworCQkJCSAgICAiVENQIiA6ICJVRFAiKSwgY2hlY2tzdW0pOwogCQl9IGVsc2UgaWYgKChjaGVja3N1bSAmIElCX0lQX0lPQ0JfUlNQXzMwMzJfVENQKSB8fAogCQkJCShjaGVja3N1bSAmIElCX0lQX0lPQ0JfUlNQXzMwMzJfVURQICYmCiAJCQkJIShjaGVja3N1bSAmIElCX0lQX0lPQ0JfUlNQXzMwMzJfTlVDKSkpIHsKQEAgLTIyMTUsOCArMjEyNiw4IEBACiAJCW5ldF9yc3AgPSBxZGV2LT5yc3BfY3VycmVudDsKIAkJcm1iKCk7CiAJCS8qCi0JCSAqIEZpeCA0MDMyIGNoaXBlIHVuZG9jdW1lbnRlZCAiZmVhdHVyZSIgd2hlcmUgYml0LTggaXMgc2V0IGlmIHRoZQotCQkgKiBpbmJvdW5kIGNvbXBsZXRpb24gaXMgZm9yIGEgVkxBTi4KKwkJICogRml4IDQwMzIgY2hpcCdzIHVuZG9jdW1lbnRlZCAiZmVhdHVyZSIgd2hlcmUgYml0LTggaXMgc2V0CisJCSAqIGlmIHRoZSBpbmJvdW5kIGNvbXBsZXRpb24gaXMgZm9yIGEgVkxBTi4KIAkJICovCiAJCWlmIChxZGV2LT5kZXZpY2VfaWQgPT0gUUwzMDMyX0RFVklDRV9JRCkKIAkJCW5ldF9yc3AtPm9wY29kZSAmPSAweDdmOwpAQCAtMjI0MiwyMiArMjE1MywxOCBAQAogCQkJCQkJIG5ldF9yc3ApOwogCQkJKCpyeF9jbGVhbmVkKSsrOwogCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJdTMyICp0bXAgPSAodTMyICopIG5ldF9yc3A7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJCSAgICAgICAiJXM6IEhpdCBkZWZhdWx0IGNhc2UsIG5vdCAiCi0JCQkJICAgICAgICJoYW5kbGVkIVxuIgotCQkJCSAgICAgICAiCWRyb3BwaW5nIHRoZSBwYWNrZXQsIG9wY29kZSA9ICIKLQkJCQkgICAgICAgIiV4LlxuIiwKLQkJCQkgICAgICAgbmRldi0+bmFtZSwgbmV0X3JzcC0+b3Bjb2RlKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJICAgICAgICIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4XG4iLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzBdLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzFdLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzJdLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzNdKTsKLQkJCX0KKwkJZGVmYXVsdDogeworCQkJdTMyICp0bXAgPSAodTMyICopbmV0X3JzcDsKKwkJCW5ldGRldl9lcnIobmRldiwKKwkJCQkgICAiSGl0IGRlZmF1bHQgY2FzZSwgbm90IGhhbmRsZWQhXG4iCisJCQkJICAgIglkcm9wcGluZyB0aGUgcGFja2V0LCBvcGNvZGUgPSAleFxuIgorCQkJCSAgICIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4XG4iLAorCQkJCSAgIG5ldF9yc3AtPm9wY29kZSwKKwkJCQkgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzBdLAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGludCl0bXBbMV0sCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgaW50KXRtcFsyXSwKKwkJCQkgICAodW5zaWduZWQgbG9uZyBpbnQpdG1wWzNdKTsKKwkJfQogCQl9CiAKIAkJcWRldi0+cnNwX2NvbnN1bWVyX2luZGV4Kys7CkBAIC0yMjgwLDcgKzIxODcsOCBAQAogCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgcWwzX2FkYXB0ZXIsIG5hcGkpOwogCWludCByeF9jbGVhbmVkID0gMCwgdHhfY2xlYW5lZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBod19mbGFnczsKLQlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAKIAlxbF90eF9yeF9jbGVhbihxZGV2LCAmdHhfY2xlYW5lZCwgJnJ4X2NsZWFuZWQsIGJ1ZGdldCk7CiAKQEAgLTIzMDMsMTUgKzIyMTEsMTQgQEAKIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2lkOwogCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgdmFsdWU7CiAJaW50IGhhbmRsZWQgPSAxOwogCXUzMiB2YXI7CiAKLQlwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKLQotCXZhbHVlID0KLQkgICAgcWxfcmVhZF9jb21tb25fcmVnX2wocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzKTsKKwl2YWx1ZSA9IHFsX3JlYWRfY29tbW9uX3JlZ19sKHFkZXYsCisJCQkJICAgICAmcG9ydF9yZWdzLT5Db21tb25SZWdzLmlzcENvbnRyb2xTdGF0dXMpOwogCiAJaWYgKHZhbHVlICYgKElTUF9DT05UUk9MX0ZFIHwgSVNQX0NPTlRST0xfUkkpKSB7CiAJCXNwaW5fbG9jaygmcWRldi0+YWRhcHRlcl9sb2NrKTsKQEAgLTIzMTksNyArMjIyNiw3IEBACiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHFkZXYtPm5kZXYpOwogCQlxbF9kaXNhYmxlX2ludGVycnVwdHMocWRldik7CiAJCXFkZXYtPnBvcnRfbGlua19zdGF0ZSA9IExTX0RPV047Ci0JCXNldF9iaXQoUUxfUkVTRVRfQUNUSVZFLCZxZGV2LT5mbGFncykgOworCQlzZXRfYml0KFFMX1JFU0VUX0FDVElWRSwgJnFkZXYtPmZsYWdzKSA7CiAKIAkJaWYgKHZhbHVlICYgSVNQX0NPTlRST0xfRkUpIHsKIAkJCS8qCkBAIC0yMzI4LDY5ICsyMjM1LDUzIEBACiAJCQl2YXIgPQogCQkJICAgIHFsX3JlYWRfcGFnZTBfcmVnX2wocWRldiwKIAkJCQkJICAgICAgJnBvcnRfcmVncy0+UG9ydEZhdGFsRXJyU3RhdHVzKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCi0JCQkgICAgICAgIiVzOiBSZXNldHRpbmcgY2hpcC4gUG9ydEZhdGFsRXJyU3RhdHVzICIKLQkJCSAgICAgICAicmVnaXN0ZXIgPSAweCV4XG4iLCBuZGV2LT5uYW1lLCB2YXIpOwotCQkJc2V0X2JpdChRTF9SRVNFVF9TVEFSVCwmcWRldi0+ZmxhZ3MpIDsKKwkJCW5ldGRldl93YXJuKG5kZXYsCisJCQkJICAgICJSZXNldHRpbmcgY2hpcC4gUG9ydEZhdGFsRXJyU3RhdHVzIHJlZ2lzdGVyID0gMHgleFxuIiwKKwkJCQkgICAgdmFyKTsKKwkJCXNldF9iaXQoUUxfUkVTRVRfU1RBUlQsICZxZGV2LT5mbGFncykgOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFNvZnQgUmVzZXQgUmVxdWVzdGVkLgogCQkJICovCi0JCQlzZXRfYml0KFFMX1JFU0VUX1BFUl9TQ1NJLCZxZGV2LT5mbGFncykgOwotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJICAgICAgICIlczogQW5vdGhlciBmdW5jdGlvbiBpc3N1ZWQgYSByZXNldCB0byB0aGUgIgotCQkJICAgICAgICJjaGlwLiBJU1IgdmFsdWUgPSAleC5cbiIsIG5kZXYtPm5hbWUsIHZhbHVlKTsKKwkJCXNldF9iaXQoUUxfUkVTRVRfUEVSX1NDU0ksICZxZGV2LT5mbGFncykgOworCQkJbmV0ZGV2X2VycihuZGV2LAorCQkJCSAgICJBbm90aGVyIGZ1bmN0aW9uIGlzc3VlZCBhIHJlc2V0IHRvIHRoZSBjaGlwLiBJU1IgdmFsdWUgPSAleFxuIiwKKwkJCQkgICB2YWx1ZSk7CiAJCX0KIAkJcXVldWVfZGVsYXllZF93b3JrKHFkZXYtPndvcmtxdWV1ZSwgJnFkZXYtPnJlc2V0X3dvcmssIDApOwogCQlzcGluX3VubG9jaygmcWRldi0+YWRhcHRlcl9sb2NrKTsKIAl9IGVsc2UgaWYgKHZhbHVlICYgSVNQX0lNUl9ESVNBQkxFX0NNUExfSU5UKSB7CiAJCXFsX2Rpc2FibGVfaW50ZXJydXB0cyhxZGV2KTsKLQkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJnFkZXYtPm5hcGkpKSkgeworCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmcWRldi0+bmFwaSkpKQogCQkJX19uYXBpX3NjaGVkdWxlKCZxZGV2LT5uYXBpKTsKLQkJfQotCX0gZWxzZSB7CisJfSBlbHNlCiAJCXJldHVybiBJUlFfTk9ORTsKLQl9CiAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAogLyoKLSAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzIG5lZWRlZCBmb3IgdGhlCi0gKiBnaXZlbiBudW1iZXIgb2YgZnJhZ21lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQotICogb3V0Ym91bmQgYWRkcmVzcyBsaXN0cyAoT0FMKSB3aWxsIGJlIHVzZWQgd2hlbiBtb3JlIHRoYW4KLSAqIHR3byBmcmFncyBhcmUgZ2l2ZW4uICBFYWNoIGFkZHJlc3MgbGlzdCBoYXMgNSBhZGRyL2xlbgotICogcGFpcnMuICBUaGUgNXRoIHBhaXIgaW4gZWFjaCBBT0wgaXMgdXNlZCB0byAgcG9pbnQgdG8KLSAqIHRoZSBuZXh0IEFPTCBpZiBtb3JlIGZyYWdzIGFyZSBjb21pbmcuCi0gKiBUaGF0IGlzIHdoeSB0aGUgZnJhZ3M6c2VnbWVudCBjb3VudCAgcmF0aW8gaXMgbm90IGxpbmVhci4KKyAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzIG5lZWRlZCBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBmcmFnbWVudHMuCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG91dGJvdW5kIGFkZHJlc3MgbGlzdHMgKE9BTCkgd2lsbCBiZSB1c2VkIHdoZW4KKyAqIG1vcmUgdGhhbiB0d28gZnJhZ3MgYXJlIGdpdmVuLiAgRWFjaCBhZGRyZXNzIGxpc3QgaGFzIDUgYWRkci9sZW4gcGFpcnMuCisgKiBUaGUgNXRoIHBhaXIgaW4gZWFjaCBPQUwgaXMgdXNlZCB0byAgcG9pbnQgdG8gdGhlIG5leHQgT0FMIGlmIG1vcmUgZnJhZ3MKKyAqIGFyZSBjb21pbmcuICBUaGF0IGlzIHdoeSB0aGUgZnJhZ3M6c2VnbWVudCBjb3VudCByYXRpbyBpcyBub3QgbGluZWFyLgogICovCi1zdGF0aWMgaW50IHFsX2dldF9zZWdfY291bnQoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAotCQkJICAgIHVuc2lnbmVkIHNob3J0IGZyYWdzKQorc3RhdGljIGludCBxbF9nZXRfc2VnX2NvdW50KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdW5zaWduZWQgc2hvcnQgZnJhZ3MpCiB7CiAJaWYgKHFkZXYtPmRldmljZV9pZCA9PSBRTDMwMjJfREVWSUNFX0lEKQogCQlyZXR1cm4gMTsKIAotCXN3aXRjaChmcmFncykgewotCWNhc2UgMDoJcmV0dXJuIDE7CS8qIGp1c3QgdGhlIHNrYi0+ZGF0YSBzZWcgKi8KLQljYXNlIDE6CXJldHVybiAyOwkvKiBza2ItPmRhdGEgKyAxIGZyYWcgKi8KLQljYXNlIDI6CXJldHVybiAzOwkvKiBza2ItPmRhdGEgKyAyIGZyYWdzICovCi0JY2FzZSAzOglyZXR1cm4gNTsJLyogc2tiLT5kYXRhICsgMSBmcmFnICsgMSBBT0wgY29udGFpbnRpbmcgMiBmcmFncyAqLwotCWNhc2UgNDoJcmV0dXJuIDY7Ci0JY2FzZSA1OglyZXR1cm4gNzsKLQljYXNlIDY6CXJldHVybiA4OwotCWNhc2UgNzoJcmV0dXJuIDEwOwotCWNhc2UgODoJcmV0dXJuIDExOwotCWNhc2UgOToJcmV0dXJuIDEyOwotCWNhc2UgMTA6IHJldHVybiAxMzsKLQljYXNlIDExOiByZXR1cm4gMTU7Ci0JY2FzZSAxMjogcmV0dXJuIDE2OwotCWNhc2UgMTM6IHJldHVybiAxNzsKLQljYXNlIDE0OiByZXR1cm4gMTg7Ci0JY2FzZSAxNTogcmV0dXJuIDIwOwotCWNhc2UgMTY6IHJldHVybiAyMTsKLQljYXNlIDE3OiByZXR1cm4gMjI7Ci0JY2FzZSAxODogcmV0dXJuIDIzOwotCX0KKwlpZiAoZnJhZ3MgPD0gMikKKwkJcmV0dXJuIGZyYWdzICsgMTsKKwllbHNlIGlmIChmcmFncyA8PSA2KQorCQlyZXR1cm4gZnJhZ3MgKyAyOworCWVsc2UgaWYgKGZyYWdzIDw9IDEwKQorCQlyZXR1cm4gZnJhZ3MgKyAzOworCWVsc2UgaWYgKGZyYWdzIDw9IDE0KQorCQlyZXR1cm4gZnJhZ3MgKyA0OworCWVsc2UgaWYgKGZyYWdzIDw9IDE4KQorCQlyZXR1cm4gZnJhZ3MgKyA1OwogCXJldHVybiAtMTsKIH0KIApAQCAtMjQxMyw4ICsyMzA0LDggQEAKIH0KIAogLyoKLSAqIE1hcCB0aGUgYnVmZmVycyBmb3IgdGhpcyB0cmFuc21pdC4gIFRoaXMgd2lsbCByZXR1cm4KLSAqIE5FVERFVl9UWF9CVVNZIG9yIE5FVERFVl9UWF9PSyBiYXNlZCBvbiBzdWNjZXNzLgorICogTWFwIHRoZSBidWZmZXJzIGZvciB0aGlzIHRyYW5zbWl0LgorICogVGhpcyB3aWxsIHJldHVybiBORVRERVZfVFhfQlVTWSBvciBORVRERVZfVFhfT0sgYmFzZWQgb24gc3VjY2Vzcy4KICAqLwogc3RhdGljIGludCBxbF9zZW5kX21hcChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCiAJCQkJc3RydWN0IG9iX21hY19pb2NiX3JlcSAqbWFjX2lvY2JfcHRyLApAQCAtMjQzNyw5ICsyMzI4LDkgQEAKIAltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAKIAllcnIgPSBwY2lfZG1hX21hcHBpbmdfZXJyb3IocWRldi0+cGRldiwgbWFwKTsKLQlpZihlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIG1hcHBpbmcgZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLAotCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZXJyKTsKKwlpZiAoZXJyKSB7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIlBDSSBtYXBwaW5nIGZhaWxlZCB3aXRoIGVycm9yOiAlZFxuIiwKKwkJCSAgIGVycik7CiAKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KQEAgLTI0NTUsNjUgKzIzNDYsNjcgQEAKIAlpZiAoc2VnX2NudCA9PSAxKSB7CiAJCS8qIFRlcm1pbmF0ZSB0aGUgbGFzdCBzZWdtZW50LiAqLwogCQlvYWxfZW50cnktPmxlbiB8PSBjcHVfdG9fbGUzMihPQUxfTEFTVF9FTlRSWSk7Ci0JfSBlbHNlIHsKLQkJb2FsID0gdHhfY2ItPm9hbDsKLQkJZm9yIChjb21wbGV0ZWRfc2Vncz0wOyBjb21wbGV0ZWRfc2VnczxmcmFnX2NudDsgY29tcGxldGVkX3NlZ3MrKyxzZWcrKykgewotCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2NvbXBsZXRlZF9zZWdzXTsKLQkJCW9hbF9lbnRyeSsrOwotCQkJaWYgKChzZWcgPT0gMiAmJiBzZWdfY250ID4gMykgfHwJLyogQ2hlY2sgZm9yIGNvbnRpbnVhdGlvbiAqLwotCQkJICAgIChzZWcgPT0gNyAmJiBzZWdfY250ID4gOCkgfHwJLyogcmVxdWlyZW1lbnRzLiBJdCdzIHN0cmFuZ2UgKi8KLQkJCSAgICAoc2VnID09IDEyICYmIHNlZ19jbnQgPiAxMykgfHwJLyogYnV0IG5lY2Vzc2FyeS4gKi8KLQkJCSAgICAoc2VnID09IDE3ICYmIHNlZ19jbnQgPiAxOCkpIHsKLQkJCQkvKiBDb250aW51YXRpb24gZW50cnkgcG9pbnRzIHRvIG91dGJvdW5kIGFkZHJlc3MgbGlzdC4gKi8KLQkJCQltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCBvYWwsCi0JCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgb2FsKSwKLQkJCQkJCSAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQkJCQllcnIgPSBwY2lfZG1hX21hcHBpbmdfZXJyb3IocWRldi0+cGRldiwgbWFwKTsKLQkJCQlpZihlcnIpIHsKLQotCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgbWFwcGluZyBvdXRib3VuZCBhZGRyZXNzIGxpc3Qgd2l0aCBlcnJvcjogJWRcbiIsCi0JCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLCBlcnIpOwotCQkJCQlnb3RvIG1hcF9lcnJvcjsKLQkJCQl9Ci0KLQkJCQlvYWxfZW50cnktPmRtYV9sbyA9IGNwdV90b19sZTMyKExTXzY0QklUUyhtYXApKTsKLQkJCQlvYWxfZW50cnktPmRtYV9oaSA9IGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKLQkJCQlvYWxfZW50cnktPmxlbiA9Ci0JCQkJICAgIGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3Qgb2FsKSB8Ci0JCQkJCQlPQUxfQ09OVF9FTlRSWSk7Ci0JCQkJZG1hX3VubWFwX2FkZHJfc2V0KCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGFkZHIsCi0JCQkJCQkgICBtYXApOwotCQkJCWRtYV91bm1hcF9sZW5fc2V0KCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGxlbiwKLQkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBvYWwpKTsKLQkJCQlvYWxfZW50cnkgPSAoc3RydWN0IG9hbF9lbnRyeSAqKW9hbDsKLQkJCQlvYWwrKzsKLQkJCQlzZWcrKzsKLQkJCX0KLQotCQkJbWFwID0KLQkJCSAgICBwY2lfbWFwX3BhZ2UocWRldi0+cGRldiwgZnJhZy0+cGFnZSwKLQkJCQkJIGZyYWctPnBhZ2Vfb2Zmc2V0LCBmcmFnLT5zaXplLAotCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCW9hbCA9IHR4X2NiLT5vYWw7CisJZm9yIChjb21wbGV0ZWRfc2VncyA9IDA7CisJICAgICBjb21wbGV0ZWRfc2VncyA8IGZyYWdfY250OworCSAgICAgY29tcGxldGVkX3NlZ3MrKywgc2VnKyspIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2NvbXBsZXRlZF9zZWdzXTsKKwkJb2FsX2VudHJ5Kys7CisJCS8qCisJCSAqIENoZWNrIGZvciBjb250aW51YXRpb24gcmVxdWlyZW1lbnRzLgorCQkgKiBJdCdzIHN0cmFuZ2UgYnV0IG5lY2Vzc2FyeS4KKwkJICogQ29udGludWF0aW9uIGVudHJ5IHBvaW50cyB0byBvdXRib3VuZCBhZGRyZXNzIGxpc3QuCisJCSAqLworCQlpZiAoKHNlZyA9PSAyICYmIHNlZ19jbnQgPiAzKSB8fAorCQkgICAgKHNlZyA9PSA3ICYmIHNlZ19jbnQgPiA4KSB8fAorCQkgICAgKHNlZyA9PSAxMiAmJiBzZWdfY250ID4gMTMpIHx8CisJCSAgICAoc2VnID09IDE3ICYmIHNlZ19jbnQgPiAxOCkpIHsKKwkJCW1hcCA9IHBjaV9tYXBfc2luZ2xlKHFkZXYtPnBkZXYsIG9hbCwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IG9hbCksCisJCQkJCSAgICAgUENJX0RNQV9UT0RFVklDRSk7CiAKIAkJCWVyciA9IHBjaV9kbWFfbWFwcGluZ19lcnJvcihxZGV2LT5wZGV2LCBtYXApOwotCQkJaWYoZXJyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIG1hcHBpbmcgZnJhZ3MgZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLAotCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLCBlcnIpOworCQkJaWYgKGVycikgeworCQkJCW5ldGRldl9lcnIocWRldi0+bmRldiwKKwkJCQkJICAgIlBDSSBtYXBwaW5nIG91dGJvdW5kIGFkZHJlc3MgbGlzdCB3aXRoIGVycm9yOiAlZFxuIiwKKwkJCQkJICAgZXJyKTsKIAkJCQlnb3RvIG1hcF9lcnJvcjsKIAkJCX0KIAogCQkJb2FsX2VudHJ5LT5kbWFfbG8gPSBjcHVfdG9fbGUzMihMU182NEJJVFMobWFwKSk7CiAJCQlvYWxfZW50cnktPmRtYV9oaSA9IGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKLQkJCW9hbF9lbnRyeS0+bGVuID0gY3B1X3RvX2xlMzIoZnJhZy0+c2l6ZSk7CisJCQlvYWxfZW50cnktPmxlbiA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3Qgb2FsKSB8CisJCQkJCQkgICAgIE9BTF9DT05UX0VOVFJZKTsKIAkJCWRtYV91bm1hcF9hZGRyX3NldCgmdHhfY2ItPm1hcFtzZWddLCBtYXBhZGRyLCBtYXApOwogCQkJZG1hX3VubWFwX2xlbl9zZXQoJnR4X2NiLT5tYXBbc2VnXSwgbWFwbGVuLAotCQkJCQkgIGZyYWctPnNpemUpOworCQkJCQkgIHNpemVvZihzdHJ1Y3Qgb2FsKSk7CisJCQlvYWxfZW50cnkgPSAoc3RydWN0IG9hbF9lbnRyeSAqKW9hbDsKKwkJCW9hbCsrOworCQkJc2VnKys7CiAJCX0KLQkJLyogVGVybWluYXRlIHRoZSBsYXN0IHNlZ21lbnQuICovCi0JCW9hbF9lbnRyeS0+bGVuIHw9IGNwdV90b19sZTMyKE9BTF9MQVNUX0VOVFJZKTsKLQl9CiAKKwkJbWFwID0gcGNpX21hcF9wYWdlKHFkZXYtPnBkZXYsIGZyYWctPnBhZ2UsCisJCQkJICAgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJZXJyID0gcGNpX2RtYV9tYXBwaW5nX2Vycm9yKHFkZXYtPnBkZXYsIG1hcCk7CisJCWlmIChlcnIpIHsKKwkJCW5ldGRldl9lcnIocWRldi0+bmRldiwKKwkJCQkgICAiUENJIG1hcHBpbmcgZnJhZ3MgZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLAorCQkJCSAgIGVycik7CisJCQlnb3RvIG1hcF9lcnJvcjsKKwkJfQorCisJCW9hbF9lbnRyeS0+ZG1hX2xvID0gY3B1X3RvX2xlMzIoTFNfNjRCSVRTKG1hcCkpOworCQlvYWxfZW50cnktPmRtYV9oaSA9IGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKKwkJb2FsX2VudHJ5LT5sZW4gPSBjcHVfdG9fbGUzMihmcmFnLT5zaXplKTsKKwkJZG1hX3VubWFwX2FkZHJfc2V0KCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGFkZHIsIG1hcCk7CisJCWRtYV91bm1hcF9sZW5fc2V0KCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGxlbiwgZnJhZy0+c2l6ZSk7CisJCX0KKwkvKiBUZXJtaW5hdGUgdGhlIGxhc3Qgc2VnbWVudC4gKi8KKwlvYWxfZW50cnktPmxlbiB8PSBjcHVfdG9fbGUzMihPQUxfTEFTVF9FTlRSWSk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogbWFwX2Vycm9yOgpAQCAtMjUyNSwxMyArMjQxOCwxOCBAQAogCXNlZyA9IDE7CiAJb2FsX2VudHJ5ID0gKHN0cnVjdCBvYWxfZW50cnkgKikmbWFjX2lvY2JfcHRyLT5idWZfYWRkcjBfbG93OwogCW9hbCA9IHR4X2NiLT5vYWw7Ci0JZm9yIChpPTA7IGk8Y29tcGxldGVkX3NlZ3M7IGkrKyxzZWcrKykgeworCWZvciAoaSA9IDA7IGkgPCBjb21wbGV0ZWRfc2VnczsgaSsrLCBzZWcrKykgewogCQlvYWxfZW50cnkrKzsKIAotCQlpZigoc2VnID09IDIgJiYgc2VnX2NudCA+IDMpIHx8ICAgICAgICAvKiBDaGVjayBmb3IgY29udGludWF0aW9uICovCi0JCSAgIChzZWcgPT0gNyAmJiBzZWdfY250ID4gOCkgfHwgICAgICAgIC8qIHJlcXVpcmVtZW50cy4gSXQncyBzdHJhbmdlICovCi0JCSAgIChzZWcgPT0gMTIgJiYgc2VnX2NudCA+IDEzKSB8fCAgICAgIC8qIGJ1dCBuZWNlc3NhcnkuICovCi0JCSAgIChzZWcgPT0gMTcgJiYgc2VnX2NudCA+IDE4KSkgeworCQkvKgorCQkgKiBDaGVjayBmb3IgY29udGludWF0aW9uIHJlcXVpcmVtZW50cy4KKwkJICogSXQncyBzdHJhbmdlIGJ1dCBuZWNlc3NhcnkuCisJCSAqLworCisJCWlmICgoc2VnID09IDIgJiYgc2VnX2NudCA+IDMpIHx8CisJCSAgICAoc2VnID09IDcgJiYgc2VnX2NudCA+IDgpIHx8CisJCSAgICAoc2VnID09IDEyICYmIHNlZ19jbnQgPiAxMykgfHwKKwkJICAgIChzZWcgPT0gMTcgJiYgc2VnX2NudCA+IDE4KSkgewogCQkJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAogCQkJCWRtYV91bm1hcF9hZGRyKCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGFkZHIpLAogCQkJCWRtYV91bm1hcF9sZW4oJnR4X2NiLT5tYXBbc2VnXSwgbWFwbGVuKSwKQEAgLTI1NzAsMTkgKzI0NjgsMjAgQEAKIAkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSAoc3RydWN0IHFsM19hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CisJCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKIAl1MzIgdG90X2xlbiA9IHNrYi0+bGVuOwogCXN0cnVjdCBvYl9tYWNfaW9jYl9yZXEgKm1hY19pb2NiX3B0cjsKIAotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmcWRldi0+dHhfY291bnQpIDwgMikpIHsKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnFkZXYtPnR4X2NvdW50KSA8IDIpKQogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7Ci0JfQogCi0JdHhfY2IgPSAmcWRldi0+dHhfYnVmW3FkZXYtPnJlcV9wcm9kdWNlcl9pbmRleF0gOwotCWlmKCh0eF9jYi0+c2VnX2NvdW50ID0gcWxfZ2V0X3NlZ19jb3VudChxZGV2LAotCQkJCQkJKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpKSkgPT0gLTEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCIlczogaW52YWxpZCBzZWdtZW50IGNvdW50IVxuIixfX2Z1bmNfXyk7CisJdHhfY2IgPSAmcWRldi0+dHhfYnVmW3FkZXYtPnJlcV9wcm9kdWNlcl9pbmRleF07CisJdHhfY2ItPnNlZ19jb3VudCA9IHFsX2dldF9zZWdfY291bnQocWRldiwKKwkJCQkJICAgICBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKTsKKwlpZiAodHhfY2ItPnNlZ19jb3VudCA9PSAtMSkgeworCQluZXRkZXZfZXJyKG5kZXYsICIlczogaW52YWxpZCBzZWdtZW50IGNvdW50IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIApAQCAtMjU5OCw4ICsyNDk3LDggQEAKIAkgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJcWxfaHdfY3N1bV9zZXR1cChza2IsIG1hY19pb2NiX3B0cik7CiAKLQlpZihxbF9zZW5kX21hcChxZGV2LG1hY19pb2NiX3B0cix0eF9jYixza2IpICE9IE5FVERFVl9UWF9PSykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYIiVzOiBDb3VsZCBub3QgbWFwIHRoZSBzZWdtZW50cyFcbiIsX19mdW5jX18pOworCWlmIChxbF9zZW5kX21hcChxZGV2LCBtYWNfaW9jYl9wdHIsIHR4X2NiLCBza2IpICE9IE5FVERFVl9UWF9PSykgeworCQluZXRkZXZfZXJyKG5kZXYsICIlczogQ291bGQgbm90IG1hcCB0aGUgc2VnbWVudHMhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAKQEAgLTI2MTIsOSArMjUxMSw5IEBACiAJCQkgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5yZXFRUHJvZHVjZXJJbmRleCwKIAkJCSAgICBxZGV2LT5yZXFfcHJvZHVjZXJfaW5kZXgpOwogCi0JaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQocWRldikpCi0JCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAlZCwgbGVuICVkXG4iLAotCQkgICAgICAgbmRldi0+bmFtZSwgcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4LCBza2ItPmxlbik7CisJbmV0aWZfcHJpbnRrKHFkZXYsIHR4X3F1ZXVlZCwgS0VSTl9ERUJVRywgbmRldiwKKwkJICAgICAidHggcXVldWVkLCBzbG90ICVkLCBsZW4gJWRcbiIsCisJCSAgICAgcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4LCBza2ItPmxlbik7CiAKIAlhdG9taWNfZGVjKCZxZGV2LT50eF9jb3VudCk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTI2MzIsOCArMjUzMSw3IEBACiAKIAlpZiAoKHFkZXYtPnJlcV9xX3ZpcnRfYWRkciA9PSBOVUxMKSB8fAogCSAgICBMU182NEJJVFMocWRldi0+cmVxX3FfcGh5X2FkZHIpICYgKHFkZXYtPnJlcV9xX3NpemUgLSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogcmVxUSBmYWlsZWQuXG4iLAotCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgInJlcVEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNjQ2LDI1ICsyNTQ0LDIyIEBACiAKIAlpZiAoKHFkZXYtPnJzcF9xX3ZpcnRfYWRkciA9PSBOVUxMKSB8fAogCSAgICBMU182NEJJVFMocWRldi0+cnNwX3FfcGh5X2FkZHIpICYgKHFkZXYtPnJzcF9xX3NpemUgLSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiJXM6IHJzcFEgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCi0JCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAicnNwUSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwgKHNpemVfdCkgcWRldi0+cmVxX3Ffc2l6ZSwKIAkJCQkgICAgcWRldi0+cmVxX3FfdmlydF9hZGRyLAogCQkJCSAgICBxZGV2LT5yZXFfcV9waHlfYWRkcik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNldF9iaXQoUUxfQUxMT0NfUkVRX1JTUF9RX0RPTkUsJnFkZXYtPmZsYWdzKTsKKwlzZXRfYml0KFFMX0FMTE9DX1JFUV9SU1BfUV9ET05FLCAmcWRldi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHFsX2ZyZWVfbmV0X3JlcV9yc3BfcXVldWVzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKLQlpZiAoIXRlc3RfYml0KFFMX0FMTE9DX1JFUV9SU1BfUV9ET05FLCZxZGV2LT5mbGFncykpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKLQkJICAgICAgICIlczogQWxyZWFkeSBkb25lLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJaWYgKCF0ZXN0X2JpdChRTF9BTExPQ19SRVFfUlNQX1FfRE9ORSwgJnFkZXYtPmZsYWdzKSkgeworCQluZXRkZXZfaW5mbyhxZGV2LT5uZGV2LCAiQWxyZWFkeSBkb25lXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjY4MCwzNCArMjU3NSwzNCBAQAogCiAJcWRldi0+cnNwX3FfdmlydF9hZGRyID0gTlVMTDsKIAotCWNsZWFyX2JpdChRTF9BTExPQ19SRVFfUlNQX1FfRE9ORSwmcWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChRTF9BTExPQ19SRVFfUlNQX1FfRE9ORSwgJnFkZXYtPmZsYWdzKTsKIH0KIAogc3RhdGljIGludCBxbF9hbGxvY19idWZmZXJfcXVldWVzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAkvKiBDcmVhdGUgTGFyZ2UgQnVmZmVyIFF1ZXVlICovCiAJcWRldi0+bHJnX2J1Zl9xX3NpemUgPQotCSAgICBxZGV2LT5udW1fbGJ1ZnFfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbHJnX2J1Zl9xX2VudHJ5KTsKKwkJcWRldi0+bnVtX2xidWZxX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGxyZ19idWZfcV9lbnRyeSk7CiAJaWYgKHFkZXYtPmxyZ19idWZfcV9zaXplIDwgUEFHRV9TSVpFKQogCQlxZGV2LT5scmdfYnVmX3FfYWxsb2Nfc2l6ZSA9IFBBR0VfU0laRTsKIAllbHNlCiAJCXFkZXYtPmxyZ19idWZfcV9hbGxvY19zaXplID0gcWRldi0+bHJnX2J1Zl9xX3NpemUgKiAyOwogCi0JcWRldi0+bHJnX2J1ZiA9IGttYWxsb2MocWRldi0+bnVtX2xhcmdlX2J1ZmZlcnMgKiBzaXplb2Yoc3RydWN0IHFsX3Jjdl9idWZfY2IpLEdGUF9LRVJORUwpOworCXFkZXYtPmxyZ19idWYgPQorCQlrbWFsbG9jKHFkZXYtPm51bV9sYXJnZV9idWZmZXJzICogc2l6ZW9mKHN0cnVjdCBxbF9yY3ZfYnVmX2NiKSwKKwkJCUdGUF9LRVJORUwpOwogCWlmIChxZGV2LT5scmdfYnVmID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBxZGV2LT5scmdfYnVmIGFsbG9jIGZhaWxlZC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJxZGV2LT5scmdfYnVmIGFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXFkZXYtPmxyZ19idWZfcV9hbGxvY192aXJ0X2FkZHIgPQotCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LAotCQkJCSBxZGV2LT5scmdfYnVmX3FfYWxsb2Nfc2l6ZSwKLQkJCQkgJnFkZXYtPmxyZ19idWZfcV9hbGxvY19waHlfYWRkcik7CisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJICAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2Nfc2l6ZSwKKwkJCQkgICAgICZxZGV2LT5scmdfYnVmX3FfYWxsb2NfcGh5X2FkZHIpOwogCiAJaWYgKHFkZXYtPmxyZ19idWZfcV9hbGxvY192aXJ0X2FkZHIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiJXM6IGxCdWZRIGZhaWxlZFxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgImxCdWZRIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlxZGV2LT5scmdfYnVmX3FfdmlydF9hZGRyID0gcWRldi0+bHJnX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkcjsKQEAgLTI3MTUsMjEgKzI2MTAsMTkgQEAKIAogCS8qIENyZWF0ZSBTbWFsbCBCdWZmZXIgUXVldWUgKi8KIAlxZGV2LT5zbWFsbF9idWZfcV9zaXplID0KLQkgICAgTlVNX1NCVUZRX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGxyZ19idWZfcV9lbnRyeSk7CisJCU5VTV9TQlVGUV9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCBscmdfYnVmX3FfZW50cnkpOwogCWlmIChxZGV2LT5zbWFsbF9idWZfcV9zaXplIDwgUEFHRV9TSVpFKQogCQlxZGV2LT5zbWFsbF9idWZfcV9hbGxvY19zaXplID0gUEFHRV9TSVpFOwogCWVsc2UKIAkJcWRldi0+c21hbGxfYnVmX3FfYWxsb2Nfc2l6ZSA9IHFkZXYtPnNtYWxsX2J1Zl9xX3NpemUgKiAyOwogCiAJcWRldi0+c21hbGxfYnVmX3FfYWxsb2NfdmlydF9hZGRyID0KLQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKLQkJCQkgcWRldi0+c21hbGxfYnVmX3FfYWxsb2Nfc2l6ZSwKLQkJCQkgJnFkZXYtPnNtYWxsX2J1Zl9xX2FsbG9jX3BoeV9hZGRyKTsKKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgICAgIHFkZXYtPnNtYWxsX2J1Zl9xX2FsbG9jX3NpemUsCisJCQkJICAgICAmcWRldi0+c21hbGxfYnVmX3FfYWxsb2NfcGh5X2FkZHIpOwogCiAJaWYgKHFkZXYtPnNtYWxsX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJICAgICAgICIlczogU21hbGwgQnVmZmVyIFF1ZXVlIGFsbG9jYXRpb24gZmFpbGVkLlxuIiwKLQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJTbWFsbCBCdWZmZXIgUXVldWUgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsIHFkZXYtPmxyZ19idWZfcV9hbGxvY19zaXplLAogCQkJCSAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2NfdmlydF9hZGRyLAogCQkJCSAgICBxZGV2LT5scmdfYnVmX3FfYWxsb2NfcGh5X2FkZHIpOwpAQCAtMjczOCwxOCArMjYzMSwxNyBAQAogCiAJcWRldi0+c21hbGxfYnVmX3FfdmlydF9hZGRyID0gcWRldi0+c21hbGxfYnVmX3FfYWxsb2NfdmlydF9hZGRyOwogCXFkZXYtPnNtYWxsX2J1Zl9xX3BoeV9hZGRyID0gcWRldi0+c21hbGxfYnVmX3FfYWxsb2NfcGh5X2FkZHI7Ci0Jc2V0X2JpdChRTF9BTExPQ19CVUZRU19ET05FLCZxZGV2LT5mbGFncyk7CisJc2V0X2JpdChRTF9BTExPQ19CVUZRU19ET05FLCAmcWRldi0+ZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBxbF9mcmVlX2J1ZmZlcl9xdWV1ZXMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCWlmICghdGVzdF9iaXQoUUxfQUxMT0NfQlVGUVNfRE9ORSwmcWRldi0+ZmxhZ3MpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUEZYCi0JCSAgICAgICAiJXM6IEFscmVhZHkgZG9uZS5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCWlmICghdGVzdF9iaXQoUUxfQUxMT0NfQlVGUVNfRE9ORSwgJnFkZXYtPmZsYWdzKSkgeworCQluZXRkZXZfaW5mbyhxZGV2LT5uZGV2LCAiQWxyZWFkeSBkb25lXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlpZihxZGV2LT5scmdfYnVmKSBrZnJlZShxZGV2LT5scmdfYnVmKTsKKwlrZnJlZShxZGV2LT5scmdfYnVmKTsKIAlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsCiAJCQkgICAgcWRldi0+bHJnX2J1Zl9xX2FsbG9jX3NpemUsCiAJCQkgICAgcWRldi0+bHJnX2J1Zl9xX2FsbG9jX3ZpcnRfYWRkciwKQEAgLTI3NjQsNyArMjY1Niw3IEBACiAKIAlxZGV2LT5zbWFsbF9idWZfcV92aXJ0X2FkZHIgPSBOVUxMOwogCi0JY2xlYXJfYml0KFFMX0FMTE9DX0JVRlFTX0RPTkUsJnFkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoUUxfQUxMT0NfQlVGUVNfRE9ORSwgJnFkZXYtPmZsYWdzKTsKIH0KIAogc3RhdGljIGludCBxbF9hbGxvY19zbWFsbF9idWZmZXJzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTI3NzQsMTggKzI2NjYsMTYgQEAKIAogCS8qIEN1cnJlbnRseSB3ZSBhbGxvY2F0ZSBvbiBvbmUgb2YgbWVtb3J5IGFuZCB1c2UgaXQgZm9yIHNtYWxsYnVmZmVycyAqLwogCXFkZXYtPnNtYWxsX2J1Zl90b3RhbF9zaXplID0KLQkgICAgKFFMX0FERFJfRUxFX1BFUl9CVUZRX0VOVFJZICogTlVNX1NCVUZRX0VOVFJJRVMgKgotCSAgICAgUUxfU01BTExfQlVGRkVSX1NJWkUpOworCQkoUUxfQUREUl9FTEVfUEVSX0JVRlFfRU5UUlkgKiBOVU1fU0JVRlFfRU5UUklFUyAqCisJCSBRTF9TTUFMTF9CVUZGRVJfU0laRSk7CiAKIAlxZGV2LT5zbWFsbF9idWZfdmlydF9hZGRyID0KLQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKLQkJCQkgcWRldi0+c21hbGxfYnVmX3RvdGFsX3NpemUsCi0JCQkJICZxZGV2LT5zbWFsbF9idWZfcGh5X2FkZHIpOworCQlwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LAorCQkJCSAgICAgcWRldi0+c21hbGxfYnVmX3RvdGFsX3NpemUsCisJCQkJICAgICAmcWRldi0+c21hbGxfYnVmX3BoeV9hZGRyKTsKIAogCWlmIChxZGV2LT5zbWFsbF9idWZfdmlydF9hZGRyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gZ2V0IHNtYWxsIGJ1ZmZlciBtZW1vcnkuXG4iLAotCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIkZhaWxlZCB0byBnZXQgc21hbGwgYnVmZmVyIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjgwNCwxNSArMjY5NCwxNCBAQAogCQlzbWFsbF9idWZfcV9lbnRyeSsrOwogCX0KIAlxZGV2LT5zbWFsbF9idWZfaW5kZXggPSAwOwotCXNldF9iaXQoUUxfQUxMT0NfU01BTExfQlVGX0RPTkUsJnFkZXYtPmZsYWdzKTsKKwlzZXRfYml0KFFMX0FMTE9DX1NNQUxMX0JVRl9ET05FLCAmcWRldi0+ZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBxbF9mcmVlX3NtYWxsX2J1ZmZlcnMoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCWlmICghdGVzdF9iaXQoUUxfQUxMT0NfU01BTExfQlVGX0RPTkUsJnFkZXYtPmZsYWdzKSkgewotCQlwcmludGsoS0VSTl9JTkZPIFBGWAotCQkgICAgICAgIiVzOiBBbHJlYWR5IGRvbmUuXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwlpZiAoIXRlc3RfYml0KFFMX0FMTE9DX1NNQUxMX0JVRl9ET05FLCAmcWRldi0+ZmxhZ3MpKSB7CisJCW5ldGRldl9pbmZvKHFkZXYtPm5kZXYsICJBbHJlYWR5IGRvbmVcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChxZGV2LT5zbWFsbF9idWZfdmlydF9hZGRyICE9IE5VTEwpIHsKQEAgLTI4NzQsMTEgKzI3NjMsOSBAQAogCQkJCSAgICAgICBxZGV2LT5scmdfYnVmZmVyX2xlbik7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZCAqLwotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJICAgICAgICIlczogbGFyZ2UgYnVmZiBhbGxvYyBmYWlsZWQsICIKLQkJCSAgICAgICAiZm9yICVkIGJ5dGVzIGF0IGluZGV4ICVkLlxuIiwKLQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLAotCQkJICAgICAgIHFkZXYtPmxyZ19idWZmZXJfbGVuICogMiwgaSk7CisJCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsCisJCQkJICAgImxhcmdlIGJ1ZmYgYWxsb2MgZmFpbGVkIGZvciAlZCBieXRlcyBhdCBpbmRleCAlZFxuIiwKKwkJCQkgICBxZGV2LT5scmdfYnVmZmVyX2xlbiAqIDIsIGkpOwogCQkJcWxfZnJlZV9sYXJnZV9idWZmZXJzKHFkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZSB7CkBAIC0yODk5LDkgKzI3ODYsMTAgQEAKIAkJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCQllcnIgPSBwY2lfZG1hX21hcHBpbmdfZXJyb3IocWRldi0+cGRldiwgbWFwKTsKLQkJCWlmKGVycikgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBtYXBwaW5nIGZhaWxlZCB3aXRoIGVycm9yOiAlZFxuIiwKLQkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZXJyKTsKKwkJCWlmIChlcnIpIHsKKwkJCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsCisJCQkJCSAgICJQQ0kgbWFwcGluZyBmYWlsZWQgd2l0aCBlcnJvcjogJWRcbiIsCisJCQkJCSAgIGVycik7CiAJCQkJcWxfZnJlZV9sYXJnZV9idWZmZXJzKHFkZXYpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQpAQCAtMjkyNiwxMCArMjgxNCw4IEBACiAKIAl0eF9jYiA9ICZxZGV2LT50eF9idWZbMF07CiAJZm9yIChpID0gMDsgaSA8IE5VTV9SRVFfUV9FTlRSSUVTOyBpKyspIHsKLQkJaWYgKHR4X2NiLT5vYWwpIHsKLQkJCWtmcmVlKHR4X2NiLT5vYWwpOwotCQkJdHhfY2ItPm9hbCA9IE5VTEw7Ci0JCX0KKwkJa2ZyZWUodHhfY2ItPm9hbCk7CisJCXR4X2NiLT5vYWwgPSBOVUxMOwogCQl0eF9jYisrOwogCX0KIH0KQEAgLTI5MzgsOCArMjgyNCw3IEBACiB7CiAJc3RydWN0IHFsX3R4X2J1Zl9jYiAqdHhfY2I7CiAJaW50IGk7Ci0Jc3RydWN0IG9iX21hY19pb2NiX3JlcSAqcmVxX3FfY3VyciA9Ci0JCQkJCXFkZXYtPnJlcV9xX3ZpcnRfYWRkcjsKKwlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpyZXFfcV9jdXJyID0gcWRldi0+cmVxX3FfdmlydF9hZGRyOwogCiAJLyogQ3JlYXRlIGZyZWUgbGlzdCBvZiB0cmFuc21pdCBidWZmZXJzICovCiAJZm9yIChpID0gMDsgaSA8IE5VTV9SRVFfUV9FTlRSSUVTOyBpKyspIHsKQEAgLTI5NjAsMjMgKzI4NDUsMjIgQEAKIAlpZiAocWRldi0+bmRldi0+bXR1ID09IE5PUk1BTF9NVFVfU0laRSkgewogCQlxZGV2LT5udW1fbGJ1ZnFfZW50cmllcyA9IE5VTV9MQlVGUV9FTlRSSUVTOwogCQlxZGV2LT5scmdfYnVmZmVyX2xlbiA9IE5PUk1BTF9NVFVfU0laRTsKLQl9Ci0JZWxzZSBpZiAocWRldi0+bmRldi0+bXR1ID09IEpVTUJPX01UVV9TSVpFKSB7CisJfSBlbHNlIGlmIChxZGV2LT5uZGV2LT5tdHUgPT0gSlVNQk9fTVRVX1NJWkUpIHsKIAkJLyoKIAkJICogQmlnZ2VyIGJ1ZmZlcnMsIHNvIGxlc3Mgb2YgdGhlbS4KIAkJICovCiAJCXFkZXYtPm51bV9sYnVmcV9lbnRyaWVzID0gSlVNQk9fTlVNX0xCVUZRX0VOVFJJRVM7CiAJCXFkZXYtPmxyZ19idWZmZXJfbGVuID0gSlVNQk9fTVRVX1NJWkU7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBJbnZhbGlkIG10dSBzaXplLiAgT25seSAxNTAwIGFuZCA5MDAwIGFyZSBhY2NlcHRlZC5cbiIsCi0JCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiSW52YWxpZCBtdHUgc2l6ZTogJWQuICBPbmx5ICVkIGFuZCAlZCBhcmUgYWNjZXB0ZWQuXG4iLAorCQkJICAgcWRldi0+bmRldi0+bXR1LCBOT1JNQUxfTVRVX1NJWkUsIEpVTUJPX01UVV9TSVpFKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXFkZXYtPm51bV9sYXJnZV9idWZmZXJzID0gcWRldi0+bnVtX2xidWZxX2VudHJpZXMgKiBRTF9BRERSX0VMRV9QRVJfQlVGUV9FTlRSWTsKKwlxZGV2LT5udW1fbGFyZ2VfYnVmZmVycyA9CisJCXFkZXYtPm51bV9sYnVmcV9lbnRyaWVzICogUUxfQUREUl9FTEVfUEVSX0JVRlFfRU5UUlk7CiAJcWRldi0+bHJnX2J1ZmZlcl9sZW4gKz0gVkxBTl9FVEhfSExFTiArIFZMQU5fSURfTEVOICsgUUxfSEVBREVSX1NQQUNFOwogCXFkZXYtPm1heF9mcmFtZV9zaXplID0KLQkgICAgKHFkZXYtPmxyZ19idWZmZXJfbGVuIC0gUUxfSEVBREVSX1NQQUNFKSArIEVUSEVSTkVUX0NSQ19TSVpFOworCQkocWRldi0+bHJnX2J1ZmZlcl9sZW4gLSBRTF9IRUFERVJfU1BBQ0UpICsgRVRIRVJORVRfQ1JDX1NJWkU7CiAKIAkvKgogCSAqIEZpcnN0IGFsbG9jYXRlIGEgcGFnZSBvZiBzaGFyZWQgbWVtb3J5IGFuZCB1c2UgaXQgZm9yIHNoYWRvdwpAQCAtMjk4NCw1MSArMjg2OCw0NCBAQAogCSAqIE5ldHdvcmsgQ29tcGxldGlvbiBRdWV1ZSBQcm9kdWNlciBJbmRleCBSZWdpc3RlcgogCSAqLwogCXFkZXYtPnNoYWRvd19yZWdfdmlydF9hZGRyID0KLQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwKLQkJCQkgUEFHRV9TSVpFLCAmcWRldi0+c2hhZG93X3JlZ19waHlfYWRkcik7CisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJICAgICBQQUdFX1NJWkUsICZxZGV2LT5zaGFkb3dfcmVnX3BoeV9hZGRyKTsKIAogCWlmIChxZGV2LT5zaGFkb3dfcmVnX3ZpcnRfYWRkciAhPSBOVUxMKSB7CiAJCXFkZXYtPnByZXFfY29uc3VtZXJfaW5kZXggPSAodTE2ICopIHFkZXYtPnNoYWRvd19yZWdfdmlydF9hZGRyOwogCQlxZGV2LT5yZXFfY29uc3VtZXJfaW5kZXhfcGh5X2FkZHJfaGlnaCA9Ci0JCSAgICBNU182NEJJVFMocWRldi0+c2hhZG93X3JlZ19waHlfYWRkcik7CisJCQlNU182NEJJVFMocWRldi0+c2hhZG93X3JlZ19waHlfYWRkcik7CiAJCXFkZXYtPnJlcV9jb25zdW1lcl9pbmRleF9waHlfYWRkcl9sb3cgPQotCQkgICAgTFNfNjRCSVRTKHFkZXYtPnNoYWRvd19yZWdfcGh5X2FkZHIpOworCQkJTFNfNjRCSVRTKHFkZXYtPnNoYWRvd19yZWdfcGh5X2FkZHIpOwogCiAJCXFkZXYtPnByc3BfcHJvZHVjZXJfaW5kZXggPQotCQkgICAgKF9fbGUzMiAqKSAoKCh1OCAqKSBxZGV2LT5wcmVxX2NvbnN1bWVyX2luZGV4KSArIDgpOworCQkJKF9fbGUzMiAqKSAoKCh1OCAqKSBxZGV2LT5wcmVxX2NvbnN1bWVyX2luZGV4KSArIDgpOwogCQlxZGV2LT5yc3BfcHJvZHVjZXJfaW5kZXhfcGh5X2FkZHJfaGlnaCA9Ci0JCSAgICBxZGV2LT5yZXFfY29uc3VtZXJfaW5kZXhfcGh5X2FkZHJfaGlnaDsKKwkJCXFkZXYtPnJlcV9jb25zdW1lcl9pbmRleF9waHlfYWRkcl9oaWdoOwogCQlxZGV2LT5yc3BfcHJvZHVjZXJfaW5kZXhfcGh5X2FkZHJfbG93ID0KLQkJICAgIHFkZXYtPnJlcV9jb25zdW1lcl9pbmRleF9waHlfYWRkcl9sb3cgKyA4OworCQkJcWRldi0+cmVxX2NvbnN1bWVyX2luZGV4X3BoeV9hZGRyX2xvdyArIDg7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBzaGFkb3dSZWcgQWxsb2MgZmFpbGVkLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgInNoYWRvd1JlZyBBbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocWxfYWxsb2NfbmV0X3JlcV9yc3BfcXVldWVzKHFkZXYpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBxbF9hbGxvY19uZXRfcmVxX3JzcF9xdWV1ZXMgZmFpbGVkLlxuIiwKLQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJxbF9hbGxvY19uZXRfcmVxX3JzcF9xdWV1ZXMgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfcmVxX3JzcDsKIAl9CiAKIAlpZiAocWxfYWxsb2NfYnVmZmVyX3F1ZXVlcyhxZGV2KSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJICAgICAgICIlczogcWxfYWxsb2NfYnVmZmVyX3F1ZXVlcyBmYWlsZWQuXG4iLAotCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgInFsX2FsbG9jX2J1ZmZlcl9xdWV1ZXMgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfYnVmZmVyX3F1ZXVlczsKIAl9CiAKIAlpZiAocWxfYWxsb2Nfc21hbGxfYnVmZmVycyhxZGV2KSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJICAgICAgICIlczogcWxfYWxsb2Nfc21hbGxfYnVmZmVycyBmYWlsZWRcbiIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJxbF9hbGxvY19zbWFsbF9idWZmZXJzIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX3NtYWxsX2J1ZmZlcnM7CiAJfQogCiAJaWYgKHFsX2FsbG9jX2xhcmdlX2J1ZmZlcnMocWRldikgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiJXM6IHFsX2FsbG9jX2xhcmdlX2J1ZmZlcnMgZmFpbGVkXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAicWxfYWxsb2NfbGFyZ2VfYnVmZmVycyBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9zbWFsbF9idWZmZXJzOwogCX0KIApAQCAtMzA3Niw3ICsyOTUzLDcgQEAKIAlzdHJ1Y3QgcWwzeHh4X2xvY2FsX3JhbV9yZWdpc3RlcnMgX19pb21lbSAqbG9jYWxfcmFtID0KIAkgICAgKHZvaWQgX19pb21lbSAqKXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCi0JaWYocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX0REUl9SQU1fU0VNX01BU0ssCisJaWYgKHFsX3NlbV9zcGlubG9jayhxZGV2LCBRTF9ERFJfUkFNX1NFTV9NQVNLLAogCQkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgogCQkJIDIpIDw8IDQpKQogCQlyZXR1cm4gLTE7CkBAIC0zMTMyLDE4ICszMDA5LDIwIEBACiBzdGF0aWMgaW50IHFsX2FkYXB0ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJdTMyIHZhbHVlOwotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwl1MzIgKnNwaXIgPSAmcG9ydF9yZWdzLT5Db21tb25SZWdzLnNlcmlhbFBvcnRJbnRlcmZhY2VSZWc7CiAJc3RydWN0IHFsM3h4eF9ob3N0X21lbW9yeV9yZWdpc3RlcnMgX19pb21lbSAqaG1lbV9yZWdzID0KLQkJCQkJCSh2b2lkIF9faW9tZW0gKilwb3J0X3JlZ3M7CisJCSh2b2lkIF9faW9tZW0gKilwb3J0X3JlZ3M7CiAJdTMyIGRlbGF5ID0gMTA7CiAJaW50IHN0YXR1cyA9IDA7CiAJdW5zaWduZWQgbG9uZyBod19mbGFncyA9IDA7CiAKLQlpZihxbF9taWlfc2V0dXAocWRldikpCisJaWYgKHFsX21paV9zZXR1cChxZGV2KSkKIAkJcmV0dXJuIC0xOwogCiAJLyogQnJpbmcgb3V0IFBIWSBvdXQgb2YgcmVzZXQgKi8KLQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3Muc2VyaWFsUG9ydEludGVyZmFjZVJlZywKKwlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsIHNwaXIsCiAJCQkgICAgKElTUF9TRVJJQUxfUE9SVF9JRl9XRSB8CiAJCQkgICAgIChJU1BfU0VSSUFMX1BPUlRfSUZfV0UgPDwgMTYpKSk7CiAJLyogR2l2ZSB0aGUgUEhZIHRpbWUgdG8gY29tZSBvdXQgb2YgcmVzZXQuICovCkBAIC0zMTUyLDEzICszMDMxLDEzIEBACiAJbmV0aWZfY2Fycmllcl9vZmYocWRldi0+bmRldik7CiAKIAkvKiBWMiBjaGlwIGZpeCBmb3IgQVJTLTM5MTY4LiAqLwotCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5zZXJpYWxQb3J0SW50ZXJmYWNlUmVnLAorCXFsX3dyaXRlX2NvbW1vbl9yZWcocWRldiwgc3BpciwKIAkJCSAgICAoSVNQX1NFUklBTF9QT1JUX0lGX1NERSB8CiAJCQkgICAgIChJU1BfU0VSSUFMX1BPUlRfSUZfU0RFIDw8IDE2KSkpOwogCiAJLyogUmVxdWVzdCBRdWV1ZSBSZWdpc3RlcnMgKi8KLQkqKCh1MzIgKikgKHFkZXYtPnByZXFfY29uc3VtZXJfaW5kZXgpKSA9IDA7Ci0JYXRvbWljX3NldCgmcWRldi0+dHhfY291bnQsTlVNX1JFUV9RX0VOVFJJRVMpOworCSooKHUzMiAqKShxZGV2LT5wcmVxX2NvbnN1bWVyX2luZGV4KSkgPSAwOworCWF0b21pY19zZXQoJnFkZXYtPnR4X2NvdW50LCBOVU1fUkVRX1FfRU5UUklFUyk7CiAJcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4ID0gMDsKIAogCXFsX3dyaXRlX3BhZ2UxX3JlZyhxZGV2LApAQCAtMzIwOCw3ICszMDg3LDkgQEAKIAkJCSAgICZobWVtX3JlZ3MtPnJ4TGFyZ2VRQmFzZUFkZHJMb3csCiAJCQkgICBMU182NEJJVFMocWRldi0+bHJnX2J1Zl9xX3BoeV9hZGRyKSk7CiAKLQlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwgJmhtZW1fcmVncy0+cnhMYXJnZVFMZW5ndGgsIHFkZXYtPm51bV9sYnVmcV9lbnRyaWVzKTsKKwlxbF93cml0ZV9wYWdlMV9yZWcocWRldiwKKwkJCSAgICZobWVtX3JlZ3MtPnJ4TGFyZ2VRTGVuZ3RoLAorCQkJICAgcWRldi0+bnVtX2xidWZxX2VudHJpZXMpOwogCiAJcWxfd3JpdGVfcGFnZTFfcmVnKHFkZXYsCiAJCQkgICAmaG1lbV9yZWdzLT5yeExhcmdlQnVmZmVyTGVuZ3RoLApAQCAtMzI1OCw3ICszMTM5LDcgQEAKIAlpZiAoKHZhbHVlICYgUE9SVF9TVEFUVVNfSUMpID09IDApIHsKIAogCQkvKiBDaGlwIGhhcyBub3QgYmVlbiBjb25maWd1cmVkIHlldCwgc28gbGV0IGl0IHJpcC4gKi8KLQkJaWYocWxfaW5pdF9taXNjX3JlZ2lzdGVycyhxZGV2KSkgeworCQlpZiAocWxfaW5pdF9taXNjX3JlZ2lzdGVycyhxZGV2KSkgewogCQkJc3RhdHVzID0gLTE7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMzI2OCw3ICszMTQ5LDcgQEAKIAogCQl2YWx1ZSA9ICgweEZGRkYgPDwgMTYpIHwgcWRldi0+bnZyYW1fZGF0YS5leHRId0NvbmZpZzsKIAotCQlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfRkxBU0hfU0VNX01BU0ssCisJCWlmIChxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfRkxBU0hfU0VNX01BU0ssCiAJCQkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkKIAkJCQkgKiAyKSA8PCAxMykpIHsKIAkJCXN0YXR1cyA9IC0xOwpAQCAtMzI5MSw3ICszMTcyLDcgQEAKIAkJCQkJICAgJnBvcnRfcmVncy0+bWFjME1heEZyYW1lTGVuZ3RoUmVnLAogCQkJCQkgICBxZGV2LT5tYXhfZnJhbWVfc2l6ZSk7CiAKLQlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKKwlpZiAocWxfc2VtX3NwaW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0ssCiAJCQkoUUxfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfCAocWRldi0+bWFjX2luZGV4KSAqCiAJCQkgMikgPDwgNykpIHsKIAkJc3RhdHVzID0gLTE7CkBAIC0zMzUzLDggKzMyMzQsNyBAQAogCX0gd2hpbGUgKC0tZGVsYXkpOwogCiAJaWYgKGRlbGF5ID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBIdyBJbml0aWFsaXphdGlvbiB0aW1lb3V0LlxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIkh3IEluaXRpYWxpemF0aW9uIHRpbWVvdXRcbiIpOwogCQlzdGF0dXMgPSAtMTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzM4NSw3ICszMjY1LDggQEAKICAqLwogc3RhdGljIGludCBxbF9hZGFwdGVyX3Jlc2V0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKLQlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJaW50IHN0YXR1cyA9IDA7CiAJdTE2IHZhbHVlOwogCWludCBtYXhfd2FpdF90aW1lOwpAQCAtMzM5NiwxNyArMzI3NywxNCBAQAogCS8qCiAJICogSXNzdWUgc29mdCByZXNldCB0byBjaGlwLgogCSAqLwotCXByaW50ayhLRVJOX0RFQlVHIFBGWAotCSAgICAgICAiJXM6IElzc3VlIHNvZnQgcmVzZXQgdG8gY2hpcC5cbiIsCi0JICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCW5ldGRldl9wcmludGsoS0VSTl9ERUJVRywgcWRldi0+bmRldiwgIklzc3VlIHNvZnQgcmVzZXQgdG8gY2hpcFxuIik7CiAJcWxfd3JpdGVfY29tbW9uX3JlZyhxZGV2LAogCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuaXNwQ29udHJvbFN0YXR1cywKIAkJCSAgICAoKElTUF9DT05UUk9MX1NSIDw8IDE2KSB8IElTUF9DT05UUk9MX1NSKSk7CiAKIAkvKiBXYWl0IDMgc2Vjb25kcyBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCi0JcHJpbnRrKEtFUk5fREVCVUcgUEZYCi0JICAgICAgICIlczogV2FpdCAxMCBtaWxsaXNlY29uZHMgZm9yIHJlc2V0IHRvIGNvbXBsZXRlLlxuIiwKLQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJbmV0ZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBxZGV2LT5uZGV2LAorCQkgICAgICAiV2FpdCAxMCBtaWxsaXNlY29uZHMgZm9yIHJlc2V0IHRvIGNvbXBsZXRlXG4iKTsKIAogCS8qIFdhaXQgdW50aWwgdGhlIGZpcm13YXJlIHRlbGxzIHVzIHRoZSBTb2Z0IFJlc2V0IGlzIGRvbmUgKi8KIAltYXhfd2FpdF90aW1lID0gNTsKQEAgLTM0MjcsOCArMzMwNSw4IEBACiAJdmFsdWUgPQogCSAgICBxbF9yZWFkX2NvbW1vbl9yZWcocWRldiwgJnBvcnRfcmVncy0+Q29tbW9uUmVncy5pc3BDb250cm9sU3RhdHVzKTsKIAlpZiAodmFsdWUgJiBJU1BfQ09OVFJPTF9SSSkgewotCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKLQkJICAgICAgICJxbF9hZGFwdGVyX3Jlc2V0OiBjbGVhcmluZyBSSSBhZnRlciByZXNldC5cbiIpOworCQluZXRkZXZfcHJpbnRrKEtFUk5fREVCVUcsIHFkZXYtPm5kZXYsCisJCQkgICAgICAiY2xlYXJpbmcgUkkgYWZ0ZXIgcmVzZXRcbiIpOwogCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCiAJCQkJICAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCiAJCQkJICAgIGlzcENvbnRyb2xTdGF0dXMsCkBAIC0zNDQ4LDEzICszMzI2LDExIEBACiAJCSAqLwogCQltYXhfd2FpdF90aW1lID0gNTsKIAkJZG8gewotCQkJdmFsdWUgPQotCQkJICAgIHFsX3JlYWRfY29tbW9uX3JlZyhxZGV2LAotCQkJCQkgICAgICAgJnBvcnRfcmVncy0+Q29tbW9uUmVncy4KLQkJCQkJICAgICAgIGlzcENvbnRyb2xTdGF0dXMpOwotCQkJaWYgKCh2YWx1ZSAmIElTUF9DT05UUk9MX0ZTUikgPT0gMCkgeworCQkJdmFsdWUgPSBxbF9yZWFkX2NvbW1vbl9yZWcocWRldiwKKwkJCQkJCSAgICZwb3J0X3JlZ3MtPkNvbW1vblJlZ3MuCisJCQkJCQkgICBpc3BDb250cm9sU3RhdHVzKTsKKwkJCWlmICgodmFsdWUgJiBJU1BfQ09OVFJPTF9GU1IpID09IDApCiAJCQkJYnJlYWs7Ci0JCQl9CiAJCQlzc2xlZXAoMSk7CiAJCX0gd2hpbGUgKCgtLW1heF93YWl0X3RpbWUpKTsKIAl9CkBAIC0zNDY4LDcgKzMzNDQsOCBAQAogCiBzdGF0aWMgdm9pZCBxbF9zZXRfbWFjX2luZm8oc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQorCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAl1MzIgdmFsdWUsIHBvcnRfc3RhdHVzOwogCXU4IGZ1bmNfbnVtYmVyOwogCkBAIC0zNDg0LDkgKzMzNjEsOSBAQAogCQlxZGV2LT5tYl9iaXRfbWFzayA9IEZOMF9NQV9CSVRTX01BU0s7CiAJCXFkZXYtPlBIWUFkZHIgPSBQT1JUMF9QSFlfQUREUkVTUzsKIAkJaWYgKHBvcnRfc3RhdHVzICYgUE9SVF9TVEFUVVNfU00wKQotCQkJc2V0X2JpdChRTF9MSU5LX09QVElDQUwsJnFkZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoUUxfTElOS19PUFRJQ0FMLCAmcWRldi0+ZmxhZ3MpOwogCQllbHNlCi0JCQljbGVhcl9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoUUxfTElOS19PUFRJQ0FMLCAmcWRldi0+ZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgSVNQX0NPTlRST0xfRk4xX05FVDoKQEAgLTM0OTUsMTcgKzMzNzIsMTcgQEAKIAkJcWRldi0+bWJfYml0X21hc2sgPSBGTjFfTUFfQklUU19NQVNLOwogCQlxZGV2LT5QSFlBZGRyID0gUE9SVDFfUEhZX0FERFJFU1M7CiAJCWlmIChwb3J0X3N0YXR1cyAmIFBPUlRfU1RBVFVTX1NNMSkKLQkJCXNldF9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncyk7CisJCQlzZXRfYml0KFFMX0xJTktfT1BUSUNBTCwgJnFkZXYtPmZsYWdzKTsKIAkJZWxzZQotCQkJY2xlYXJfYml0KFFMX0xJTktfT1BUSUNBTCwmcWRldi0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KFFMX0xJTktfT1BUSUNBTCwgJnFkZXYtPmZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIElTUF9DT05UUk9MX0ZOMF9TQ1NJOgogCWNhc2UgSVNQX0NPTlRST0xfRk4xX1NDU0k6CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCi0JCSAgICAgICAiJXM6IEludmFsaWQgZnVuY3Rpb24gbnVtYmVyLCBpc3BDb250cm9sU3RhdHVzID0gMHgleFxuIiwKLQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUsdmFsdWUpOworCQluZXRkZXZfcHJpbnRrKEtFUk5fREVCVUcsIHFkZXYtPm5kZXYsCisJCQkgICAgICAiSW52YWxpZCBmdW5jdGlvbiBudW1iZXIsIGlzcENvbnRyb2xTdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgdmFsdWUpOwogCQlicmVhazsKIAl9CiAJcWRldi0+bnVtUG9ydHMgPSBxZGV2LT5udnJhbV9kYXRhLnZlcnNpb25fYW5kX251bVBvcnRzID4+IDg7CkBAIC0zNTE2LDMyICszMzkzLDI2IEBACiAJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbDNfYWRhcHRlciAqKW5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcWRldi0+cGRldjsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYCi0JICAgICAgICJcbiVzIEFkYXB0ZXIgJWQgUmV2aXNpb25JRCAlZCBmb3VuZCAlcyBvbiBQQ0kgc2xvdCAlZC5cbiIsCi0JICAgICAgIERSVl9OQU1FLCBxZGV2LT5pbmRleCwgcWRldi0+Y2hpcF9yZXZfaWQsCi0JICAgICAgIChxZGV2LT5kZXZpY2VfaWQgPT0gUUwzMDMyX0RFVklDRV9JRCkgPyAiUUxBMzAzMiIgOiAiUUxBMzAyMiIsCi0JICAgICAgIHFkZXYtPnBjaV9zbG90KTsKLQlwcmludGsoS0VSTl9JTkZPIFBGWAotCSAgICAgICAiJXMgSW50ZXJmYWNlLlxuIiwKLQkgICAgICAgdGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncykgPyAiT1BUSUNBTCIgOiAiQ09QUEVSIik7CisJbmV0ZGV2X2luZm8obmRldiwKKwkJICAgICIlcyBBZGFwdGVyICVkIFJldmlzaW9uSUQgJWQgZm91bmQgJXMgb24gUENJIHNsb3QgJWRcbiIsCisJCSAgICBEUlZfTkFNRSwgcWRldi0+aW5kZXgsIHFkZXYtPmNoaXBfcmV2X2lkLAorCQkgICAgcWRldi0+ZGV2aWNlX2lkID09IFFMMzAzMl9ERVZJQ0VfSUQgPyAiUUxBMzAzMiIgOiAiUUxBMzAyMiIsCisJCSAgICBxZGV2LT5wY2lfc2xvdCk7CisJbmV0ZGV2X2luZm8obmRldiwgIiVzIEludGVyZmFjZVxuIiwKKwkJdGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCAmcWRldi0+ZmxhZ3MpID8gIk9QVElDQUwiIDogIkNPUFBFUiIpOwogCiAJLyoKIAkgKiBQcmludCBQQ0kgYnVzIHdpZHRoL3R5cGUuCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlgKLQkgICAgICAgIkJ1cyBpbnRlcmZhY2UgaXMgJXMgJXMuXG4iLAotCSAgICAgICAoKHFkZXYtPnBjaV93aWR0aCA9PSA2NCkgPyAiNjQtYml0IiA6ICIzMi1iaXQiKSwKLQkgICAgICAgKChxZGV2LT5wY2lfeCkgPyAiUENJLVgiIDogIlBDSSIpKTsKKwluZXRkZXZfaW5mbyhuZGV2LCAiQnVzIGludGVyZmFjZSBpcyAlcyAlc1xuIiwKKwkJICAgICgocWRldi0+cGNpX3dpZHRoID09IDY0KSA/ICI2NC1iaXQiIDogIjMyLWJpdCIpLAorCQkgICAgKChxZGV2LT5wY2lfeCkgPyAiUENJLVgiIDogIlBDSSIpKTsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYCi0JICAgICAgICJtZW0gIElPIGJhc2UgYWRkcmVzcyBhZGp1c3RlZCA9IDB4JXBcbiIsCi0JICAgICAgIHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzKTsKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSW50ZXJydXB0IG51bWJlciA9ICVkXG4iLCBwZGV2LT5pcnEpOworCW5ldGRldl9pbmZvKG5kZXYsICJtZW0gIElPIGJhc2UgYWRkcmVzcyBhZGp1c3RlZCA9IDB4JXBcbiIsCisJCSAgICBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVycyk7CisJbmV0ZGV2X2luZm8obmRldiwgIkludGVycnVwdCBudW1iZXIgPSAlZFxuIiwgcGRldi0+aXJxKTsKIAotCWlmIChuZXRpZl9tc2dfcHJvYmUocWRldikpCi0JCXByaW50ayhLRVJOX0lORk8gUEZYCi0JCSAgICAgICAiJXM6IE1BQyBhZGRyZXNzICVwTVxuIiwKLQkJICAgICAgIG5kZXYtPm5hbWUsIG5kZXYtPmRldl9hZGRyKTsKKwluZXRpZl9pbmZvKHFkZXYsIHByb2JlLCBuZGV2LCAiTUFDIGFkZHJlc3MgJXBNXG4iLCBuZGV2LT5kZXZfYWRkcik7CiB9CiAKIHN0YXRpYyBpbnQgcWxfYWRhcHRlcl9kb3duKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgaW50IGRvX3Jlc2V0KQpAQCAtMzU1MiwxNyArMzQyMywxNiBAQAogCW5ldGlmX3N0b3BfcXVldWUobmRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYobmRldik7CiAKLQljbGVhcl9iaXQoUUxfQURBUFRFUl9VUCwmcWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChRTF9MSU5LX01BU1RFUiwmcWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChRTF9BREFQVEVSX1VQLCAmcWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChRTF9MSU5LX01BU1RFUiwgJnFkZXYtPmZsYWdzKTsKIAogCXFsX2Rpc2FibGVfaW50ZXJydXB0cyhxZGV2KTsKIAogCWZyZWVfaXJxKHFkZXYtPnBkZXYtPmlycSwgbmRldik7CiAKLQlpZiAocWRldi0+bXNpICYmIHRlc3RfYml0KFFMX01TSV9FTkFCTEVELCZxZGV2LT5mbGFncykpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKLQkJICAgICAgICIlczogY2FsbGluZyBwY2lfZGlzYWJsZV9tc2koKS5cbiIsIHFkZXYtPm5kZXYtPm5hbWUpOwotCQljbGVhcl9iaXQoUUxfTVNJX0VOQUJMRUQsJnFkZXYtPmZsYWdzKTsKKwlpZiAocWRldi0+bXNpICYmIHRlc3RfYml0KFFMX01TSV9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpKSB7CisJCW5ldGRldl9pbmZvKHFkZXYtPm5kZXYsICJjYWxsaW5nIHBjaV9kaXNhYmxlX21zaSgpXG4iKTsKKwkJY2xlYXJfYml0KFFMX01TSV9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpOwogCQlwY2lfZGlzYWJsZV9tc2kocWRldi0+cGRldik7CiAJfQogCkBAIC0zNTc2LDE3ICszNDQ2LDE2IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKIAkJaWYgKHFsX3dhaXRfZm9yX2RydnJfbG9jayhxZGV2KSkgewotCQkJaWYgKChzb2Z0X3Jlc2V0ID0gcWxfYWRhcHRlcl9yZXNldChxZGV2KSkpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJICAgICAgICIlczogcWxfYWRhcHRlcl9yZXNldCglZCkgRkFJTEVEIVxuIiwKLQkJCQkgICAgICAgbmRldi0+bmFtZSwgcWRldi0+aW5kZXgpOworCQkJc29mdF9yZXNldCA9IHFsX2FkYXB0ZXJfcmVzZXQocWRldik7CisJCQlpZiAoc29mdF9yZXNldCkgeworCQkJCW5ldGRldl9lcnIobmRldiwgInFsX2FkYXB0ZXJfcmVzZXQoJWQpIEZBSUxFRCFcbiIsCisJCQkJCSAgIHFkZXYtPmluZGV4KTsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCQkiJXM6IFJlbGVhc2VpbmcgZHJpdmVyIGxvY2sgdmlhIGNoaXAgcmVzZXQuXG4iLG5kZXYtPm5hbWUpOworCQkJbmV0ZGV2X2VycihuZGV2LAorCQkJCSAgICJSZWxlYXNpbmcgZHJpdmVyIGxvY2sgdmlhIGNoaXAgcmVzZXRcbiIpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJICAgICAgICIlczogQ291bGQgbm90IGFjcXVpcmUgZHJpdmVyIGxvY2sgdG8gZG8gIgotCQkJICAgICAgICJyZXNldCFcbiIsIG5kZXYtPm5hbWUpOworCQkJbmV0ZGV2X2VycihuZGV2LAorCQkJCSAgICJDb3VsZCBub3QgYWNxdWlyZSBkcml2ZXIgbG9jayB0byBkbyByZXNldCFcbiIpOwogCQkJcmV0dmFsID0gLTE7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwpAQCAtMzYwMyw1NiArMzQ3Miw1MCBAQAogCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CiAKIAlpZiAocWxfYWxsb2NfbWVtX3Jlc291cmNlcyhxZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiJXMgVW5hYmxlIHRvICBhbGxvY2F0ZSBidWZmZXJzLlxuIiwgbmRldi0+bmFtZSk7CisJCW5ldGRldl9lcnIobmRldiwgIlVuYWJsZSB0byAgYWxsb2NhdGUgYnVmZmVyc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWlmIChxZGV2LT5tc2kpIHsKIAkJaWYgKHBjaV9lbmFibGVfbXNpKHFkZXYtPnBkZXYpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkgICAgICAgIiVzOiBVc2VyIHJlcXVlc3RlZCBNU0ksIGJ1dCBNU0kgZmFpbGVkIHRvICIKLQkJCSAgICAgICAiaW5pdGlhbGl6ZS4gIENvbnRpbnVpbmcgd2l0aG91dCBNU0kuXG4iLAotCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJbmV0ZGV2X2VycihuZGV2LAorCQkJCSAgICJVc2VyIHJlcXVlc3RlZCBNU0ksIGJ1dCBNU0kgZmFpbGVkIHRvIGluaXRpYWxpemUuICBDb250aW51aW5nIHdpdGhvdXQgTVNJLlxuIik7CiAJCQlxZGV2LT5tc2kgPSAwOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBNU0kgRW5hYmxlZC4uLlxuIiwgcWRldi0+bmRldi0+bmFtZSk7Ci0JCQlzZXRfYml0KFFMX01TSV9FTkFCTEVELCZxZGV2LT5mbGFncyk7CisJCQluZXRkZXZfaW5mbyhuZGV2LCAiTVNJIEVuYWJsZWQuLi5cbiIpOworCQkJc2V0X2JpdChRTF9NU0lfRU5BQkxFRCwgJnFkZXYtPmZsYWdzKTsKIAkJCWlycV9mbGFncyAmPSB+SVJRRl9TSEFSRUQ7CiAJCX0KIAl9CiAKLQlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKHFkZXYtPnBkZXYtPmlycSwKLQkJCSAgICAgICBxbDN4eHhfaXNyLAotCQkJICAgICAgIGlycV9mbGFncywgbmRldi0+bmFtZSwgbmRldikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJICAgICAgICIlczogRmFpbGVkIHRvIHJlc2VydmUgaW50ZXJydXB0ICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKLQkJICAgICAgIG5kZXYtPm5hbWUsIHFkZXYtPnBkZXYtPmlycSk7CisJZXJyID0gcmVxdWVzdF9pcnEocWRldi0+cGRldi0+aXJxLCBxbDN4eHhfaXNyLAorCQkJICBpcnFfZmxhZ3MsIG5kZXYtPm5hbWUsIG5kZXYpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihuZGV2LAorCQkJICAgIkZhaWxlZCB0byByZXNlcnZlIGludGVycnVwdCAlZCAtIGFscmVhZHkgaW4gdXNlXG4iLAorCQkJICAgcWRldi0+cGRldi0+aXJxKTsKIAkJZ290byBlcnJfaXJxOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxZGV2LT5od19sb2NrLCBod19mbGFncyk7CiAKLQlpZiAoKGVyciA9IHFsX3dhaXRfZm9yX2RydnJfbG9jayhxZGV2KSkpIHsKLQkJaWYgKChlcnIgPSBxbF9hZGFwdGVyX2luaXRpYWxpemUocWRldikpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkgICAgICAgIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBhZGFwdGVyLlxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwllcnIgPSBxbF93YWl0X2Zvcl9kcnZyX2xvY2socWRldik7CisJaWYgKGVycikgeworCQllcnIgPSBxbF9hZGFwdGVyX2luaXRpYWxpemUocWRldik7CisJCWlmIChlcnIpIHsKKwkJCW5ldGRldl9lcnIobmRldiwgIlVuYWJsZSB0byBpbml0aWFsaXplIGFkYXB0ZXJcbiIpOwogCQkJZ290byBlcnJfaW5pdDsKIAkJfQotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJIiVzOiBSZWxlYXNlaW5nIGRyaXZlciBsb2NrLlxuIixuZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihuZGV2LCAiUmVsZWFzaW5nIGRyaXZlciBsb2NrXG4iKTsKIAkJcWxfc2VtX3VubG9jayhxZGV2LCBRTF9EUlZSX1NFTV9NQVNLKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiJXM6IENvdWxkIG5vdCBhY3F1aXJlIGRyaXZlciBsb2NrLlxuIiwKLQkJICAgICAgIG5kZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKG5kZXYsICJDb3VsZCBub3QgYWNxdWlyZSBkcml2ZXIgbG9ja1xuIik7CiAJCWdvdG8gZXJyX2xvY2s7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwogCi0Jc2V0X2JpdChRTF9BREFQVEVSX1VQLCZxZGV2LT5mbGFncyk7CisJc2V0X2JpdChRTF9BREFQVEVSX1VQLCAmcWRldi0+ZmxhZ3MpOwogCiAJbW9kX3RpbWVyKCZxZGV2LT5hZGFwdGVyX3RpbWVyLCBqaWZmaWVzICsgSFogKiAxKTsKIApAQCAtMzY2NiwxMSArMzUyOSw5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRldi0+aHdfbG9jaywgaHdfZmxhZ3MpOwogCWZyZWVfaXJxKHFkZXYtPnBkZXYtPmlycSwgbmRldik7CiBlcnJfaXJxOgotCWlmIChxZGV2LT5tc2kgJiYgdGVzdF9iaXQoUUxfTVNJX0VOQUJMRUQsJnFkZXYtPmZsYWdzKSkgewotCQlwcmludGsoS0VSTl9JTkZPIFBGWAotCQkgICAgICAgIiVzOiBjYWxsaW5nIHBjaV9kaXNhYmxlX21zaSgpLlxuIiwKLQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOwotCQljbGVhcl9iaXQoUUxfTVNJX0VOQUJMRUQsJnFkZXYtPmZsYWdzKTsKKwlpZiAocWRldi0+bXNpICYmIHRlc3RfYml0KFFMX01TSV9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpKSB7CisJCW5ldGRldl9pbmZvKG5kZXYsICJjYWxsaW5nIHBjaV9kaXNhYmxlX21zaSgpXG4iKTsKKwkJY2xlYXJfYml0KFFMX01TSV9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpOwogCQlwY2lfZGlzYWJsZV9tc2kocWRldi0+cGRldik7CiAJfQogCXJldHVybiBlcnI7CkBAIC0zNjc4LDEwICszNTM5LDkgQEAKIAogc3RhdGljIGludCBxbF9jeWNsZV9hZGFwdGVyKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgaW50IHJlc2V0KQogewotCWlmKCBxbF9hZGFwdGVyX2Rvd24ocWRldixyZXNldCkgfHwgcWxfYWRhcHRlcl91cChxZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJIiVzOiBEcml2ZXIgdXAvZG93biBjeWNsZSBmYWlsZWQsICIKLQkJCQkiY2xvc2luZyBkZXZpY2VcbiIscWRldi0+bmRldi0+bmFtZSk7CisJaWYgKHFsX2FkYXB0ZXJfZG93bihxZGV2LCByZXNldCkgfHwgcWxfYWRhcHRlcl91cChxZGV2KSkgeworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsCisJCQkgICAiRHJpdmVyIHVwL2Rvd24gY3ljbGUgZmFpbGVkLCBjbG9zaW5nIGRldmljZVxuIik7CiAJCXJ0bmxfbG9jaygpOwogCQlkZXZfY2xvc2UocWRldi0+bmRldik7CiAJCXJ0bmxfdW5sb2NrKCk7CkBAIC0zNjk4LDI0ICszNTU4LDI0IEBACiAJICogV2FpdCBmb3IgZGV2aWNlIHRvIHJlY292ZXIgZnJvbSBhIHJlc2V0LgogCSAqIChSYXJlbHkgaGFwcGVucywgYnV0IHBvc3NpYmxlLikKIAkgKi8KLQl3aGlsZSAoIXRlc3RfYml0KFFMX0FEQVBURVJfVVAsJnFkZXYtPmZsYWdzKSkKKwl3aGlsZSAoIXRlc3RfYml0KFFMX0FEQVBURVJfVVAsICZxZGV2LT5mbGFncykpCiAJCW1zbGVlcCg1MCk7CiAKLQlxbF9hZGFwdGVyX2Rvd24ocWRldixRTF9ET19SRVNFVCk7CisJcWxfYWRhcHRlcl9kb3duKHFkZXYsIFFMX0RPX1JFU0VUKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBxbDN4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlyZXR1cm4gKHFsX2FkYXB0ZXJfdXAocWRldikpOworCXJldHVybiBxbF9hZGFwdGVyX3VwKHFkZXYpOwogfQogCiBzdGF0aWMgaW50IHFsM3h4eF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbDNfYWRhcHRlciAqKW5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KLQkgICAgCQlxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKKwkJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CiAJdW5zaWduZWQgbG9uZyBod19mbGFnczsKIApAQCAtMzc1MCw3ICszNjEwLDcgQEAKIHsKIAlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSAoc3RydWN0IHFsM19hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CiAKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUmVzZXR0aW5nLi4uXG4iLCBuZGV2LT5uYW1lKTsKKwluZXRkZXZfZXJyKG5kZXYsICJSZXNldHRpbmcuLi5cbiIpOwogCS8qCiAJICogU3RvcCB0aGUgcXVldWVzLCB3ZSd2ZSBnb3QgYSBwcm9ibGVtLgogCSAqLwpAQCAtMzc3MCwxMSArMzYzMCwxMiBAQAogCXUzMiB2YWx1ZTsKIAlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKIAlpbnQgbWF4X3dhaXRfdGltZSwgaTsKLQlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdW5zaWduZWQgbG9uZyBod19mbGFnczsKIAotCWlmICh0ZXN0X2JpdCgoUUxfUkVTRVRfUEVSX1NDU0kgfCBRTF9SRVNFVF9TVEFSVCksJnFkZXYtPmZsYWdzKSkgewotCQljbGVhcl9iaXQoUUxfTElOS19NQVNURVIsJnFkZXYtPmZsYWdzKTsKKwlpZiAodGVzdF9iaXQoKFFMX1JFU0VUX1BFUl9TQ1NJIHwgUUxfUkVTRVRfU1RBUlQpLCAmcWRldi0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChRTF9MSU5LX01BU1RFUiwgJnFkZXYtPmZsYWdzKTsKIAogCQkvKgogCQkgKiBMb29wIHRocm91Z2ggdGhlIGFjdGl2ZSBsaXN0IGFuZCByZXR1cm4gdGhlIHNrYi4KQEAgLTM3ODMsMTcgKzM2NDQsMTkgQEAKIAkJCWludCBqOwogCQkJdHhfY2IgPSAmcWRldi0+dHhfYnVmW2ldOwogCQkJaWYgKHR4X2NiLT5za2IpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKLQkJCQkgICAgICAgIiVzOiBGcmVlaW5nIGxvc3QgU0tCLlxuIiwKLQkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQkJbmV0ZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBuZGV2LAorCQkJCQkgICAgICAiRnJlZWluZyBsb3N0IFNLQlxuIik7CiAJCQkJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAotCQkJCQkgZG1hX3VubWFwX2FkZHIoJnR4X2NiLT5tYXBbMF0sIG1hcGFkZHIpLAorCQkJCQkgZG1hX3VubWFwX2FkZHIoJnR4X2NiLT5tYXBbMF0sCisJCQkJCQkJbWFwYWRkciksCiAJCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eF9jYi0+bWFwWzBdLCBtYXBsZW4pLAogCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJZm9yKGo9MTtqPHR4X2NiLT5zZWdfY291bnQ7aisrKSB7CisJCQkJZm9yIChqID0gMTsgaiA8IHR4X2NiLT5zZWdfY291bnQ7IGorKykgewogCQkJCQlwY2lfdW5tYXBfcGFnZShxZGV2LT5wZGV2LAotCQkJCQkgICAgICAgZG1hX3VubWFwX2FkZHIoJnR4X2NiLT5tYXBbal0sbWFwYWRkciksCi0JCQkJCSAgICAgICBkbWFfdW5tYXBfbGVuKCZ0eF9jYi0+bWFwW2pdLG1hcGxlbiksCisJCQkJCSAgICAgICBkbWFfdW5tYXBfYWRkcigmdHhfY2ItPm1hcFtqXSwKKwkJCQkJCQkgICAgICBtYXBhZGRyKSwKKwkJCQkJICAgICAgIGRtYV91bm1hcF9sZW4oJnR4X2NiLT5tYXBbal0sCisJCQkJCQkJICAgICBtYXBsZW4pLAogCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CiAJCQkJfQogCQkJCWRldl9rZnJlZV9za2IodHhfY2ItPnNrYik7CkBAIC0zODAxLDggKzM2NjQsNyBAQAogCQkJfQogCQl9CiAKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgIiVzOiBDbGVhcmluZyBOUkkgYWZ0ZXIgcmVzZXQuXG4iLCBxZGV2LT5uZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihuZGV2LCAiQ2xlYXJpbmcgTlJJIGFmdGVyIHJlc2V0XG4iKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnFkZXYtPmh3X2xvY2ssIGh3X2ZsYWdzKTsKIAkJcWxfd3JpdGVfY29tbW9uX3JlZyhxZGV2LAogCQkJCSAgICAmcG9ydF9yZWdzLT5Db21tb25SZWdzLgpAQCAtMzgxOCwxNiArMzY4MCwxNCBAQAogCiAJCQkJCQkgICBpc3BDb250cm9sU3RhdHVzKTsKIAkJCWlmICgodmFsdWUgJiBJU1BfQ09OVFJPTF9TUikgPT0gMCkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAotCQkJCSAgICAgICAiJXM6IHJlc2V0IGNvbXBsZXRlZC5cbiIsCi0JCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworCQkJCW5ldGRldl9wcmludGsoS0VSTl9ERUJVRywgbmRldiwKKwkJCQkJICAgICAgInJlc2V0IGNvbXBsZXRlZFxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCWlmICh2YWx1ZSAmIElTUF9DT05UUk9MX1JJKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYCi0JCQkJICAgICAgICIlczogY2xlYXJpbmcgTlJJIGFmdGVyIHJlc2V0LlxuIiwKLQkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CisJCQkJbmV0ZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBuZGV2LAorCQkJCQkgICAgICAiY2xlYXJpbmcgTlJJIGFmdGVyIHJlc2V0XG4iKTsKIAkJCQlxbF93cml0ZV9jb21tb25fcmVnKHFkZXYsCiAJCQkJCQkgICAgJnBvcnRfcmVncy0+CiAJCQkJCQkgICAgQ29tbW9uUmVncy4KQEAgLTM4NDgsMjEgKzM3MDgsMTkgQEAKIAkJCSAqIFNldCB0aGUgcmVzZXQgZmxhZ3MgYW5kIGNsZWFyIHRoZSBib2FyZCBhZ2Fpbi4KIAkJCSAqIE5vdGhpbmcgZWxzZSB0byBkby4uLgogCQkJICovCi0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkgICAgICAgIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzZXQgdG8gIgotCQkJICAgICAgICJjb21wbGV0ZS5cbiIsIG5kZXYtPm5hbWUpOwotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJICAgICAgICIlczogRG8gYSByZXNldC5cbiIsIG5kZXYtPm5hbWUpOwotCQkJY2xlYXJfYml0KFFMX1JFU0VUX1BFUl9TQ1NJLCZxZGV2LT5mbGFncyk7Ci0JCQljbGVhcl9iaXQoUUxfUkVTRVRfU1RBUlQsJnFkZXYtPmZsYWdzKTsKLQkJCXFsX2N5Y2xlX2FkYXB0ZXIocWRldixRTF9ET19SRVNFVCk7CisJCQluZXRkZXZfZXJyKG5kZXYsCisJCQkJICAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNldCB0byBjb21wbGV0ZVxuIik7CisJCQluZXRkZXZfZXJyKG5kZXYsICJEbyBhIHJlc2V0XG4iKTsKKwkJCWNsZWFyX2JpdChRTF9SRVNFVF9QRVJfU0NTSSwgJnFkZXYtPmZsYWdzKTsKKwkJCWNsZWFyX2JpdChRTF9SRVNFVF9TVEFSVCwgJnFkZXYtPmZsYWdzKTsKKwkJCXFsX2N5Y2xlX2FkYXB0ZXIocWRldiwgUUxfRE9fUkVTRVQpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJY2xlYXJfYml0KFFMX1JFU0VUX0FDVElWRSwmcWRldi0+ZmxhZ3MpOwotCQljbGVhcl9iaXQoUUxfUkVTRVRfUEVSX1NDU0ksJnFkZXYtPmZsYWdzKTsKLQkJY2xlYXJfYml0KFFMX1JFU0VUX1NUQVJULCZxZGV2LT5mbGFncyk7Ci0JCXFsX2N5Y2xlX2FkYXB0ZXIocWRldixRTF9OT19SRVNFVCk7CisJCWNsZWFyX2JpdChRTF9SRVNFVF9BQ1RJVkUsICZxZGV2LT5mbGFncyk7CisJCWNsZWFyX2JpdChRTF9SRVNFVF9QRVJfU0NTSSwgJnFkZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KFFMX1JFU0VUX1NUQVJULCAmcWRldi0+ZmxhZ3MpOworCQlxbF9jeWNsZV9hZGFwdGVyKHFkZXYsIFFMX05PX1JFU0VUKTsKIAl9CiB9CiAKQEAgLTM4NzYsNyArMzczNCw4IEBACiAKIHN0YXRpYyB2b2lkIHFsX2dldF9ib2FyZF9pbmZvKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKLQlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9IHFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0KKwkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CiAJdTMyIHZhbHVlOwogCiAJdmFsdWUgPSBxbF9yZWFkX3BhZ2UwX3JlZ19sKHFkZXYsICZwb3J0X3JlZ3MtPnBvcnRTdGF0dXMpOwpAQCAtMzkxNSwyMCArMzc3NCwxOCBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSBOVUxMOwotCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CiAJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKHBjaV91c2luZ19kYWMpLCBlcnI7CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIGNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcHJfZXJyKCIlcyBjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsIHBjaV9uYW1lKHBkZXYpKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAogCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgY2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwcl9lcnIoIiVzIGNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIiwgcGNpX25hbWUocGRldikpOwogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OwogCX0KIApAQCAtMzk0MywxNSArMzgwMCwxMyBAQAogCX0KIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwcl9lcnIoIiVzIG5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIiwgcGNpX25hbWUocGRldikpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCX0KIAogCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHFsM19hZGFwdGVyKSk7CiAJaWYgKCFuZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIGNvdWxkIG5vdCBhbGxvYyBldGhlcmRldlxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcHJfZXJyKCIlcyBjb3VsZCBub3QgYWxsb2MgZXRoZXJkZXZcbiIsIHBjaV9uYW1lKHBkZXYpKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKIAl9CkBAIC0zOTc4LDggKzM4MzMsNyBAQAogCiAJcWRldi0+bWVtX21hcF9yZWdpc3RlcnMgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMSk7CiAJaWYgKCFxZGV2LT5tZW1fbWFwX3JlZ2lzdGVycykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwcl9lcnIoIiVzOiBjYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnNcbiIsIHBjaV9uYW1lKHBkZXYpKTsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBlcnJfb3V0X2ZyZWVfbmRldjsKIAl9CkBAIC0zOTk4LDkgKzM4NTIsOCBAQAogCiAJLyogbWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLwogCWlmIChxbF9nZXRfbnZyYW1fcGFyYW1zKHFkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWAotCQkgICAgICAgInFsM3h4eF9wcm9iZTogQWRhcHRlciAjJWQsIEludmFsaWQgTlZSQU0gcGFyYW1ldGVycy5cbiIsCi0JCSAgICAgICBxZGV2LT5pbmRleCk7CisJCXByX2FsZXJ0KCIlczogQWRhcHRlciAjJWQsIEludmFsaWQgTlZSQU0gcGFyYW1ldGVyc1xuIiwKKwkJCSBfX2Z1bmNfXywgcWRldi0+aW5kZXgpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAl9CkBAIC00MDI2LDE0ICszODc5LDEyIEBACiAJICogU2V0IHRoZSBNYXhpbXVtIE1lbW9yeSBSZWFkIEJ5dGUgQ291bnQgdmFsdWUuIFdlIGRvIHRoaXMgdG8gaGFuZGxlCiAJICoganVtYm8gZnJhbWVzLgogCSAqLwotCWlmIChxZGV2LT5wY2lfeCkgeworCWlmIChxZGV2LT5wY2lfeCkKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIChpbnQpMHg0ZSwgKHUxNikgMHgwMDM2KTsKLQl9CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCXByX2VycigiJXM6IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iLCBwY2lfbmFtZShwZGV2KSk7CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIApAQCAtNDA1MiwxMCArMzkwMywxMCBAQAogCXFkZXYtPmFkYXB0ZXJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAqIDI7CS8qIHR3byBzZWNvbmQgZGVsYXkgKi8KIAlxZGV2LT5hZGFwdGVyX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylxZGV2OwogCi0JaWYoIWNhcmRzX2ZvdW5kKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiJXNcbiIsIERSVl9TVFJJTkcpOwotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkRyaXZlciBuYW1lOiAlcywgVmVyc2lvbjogJXMuXG4iLAotCSAgICAJICAgRFJWX05BTUUsIERSVl9WRVJTSU9OKTsKKwlpZiAoIWNhcmRzX2ZvdW5kKSB7CisJCXByX2FsZXJ0KCIlc1xuIiwgRFJWX1NUUklORyk7CisJCXByX2FsZXJ0KCJEcml2ZXIgbmFtZTogJXMsIFZlcnNpb246ICVzXG4iLAorCQkJIERSVl9OQU1FLCBEUlZfVkVSU0lPTik7CiAJfQogCXFsX2Rpc3BsYXlfZGV2X2luZm8obmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWMuaCBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWMuaAppbmRleCA4OTZkNDBkLi45NzAzODkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljLmgKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pYy5oCkBAIC01MSw4ICs1MSw4IEBACiAKICNkZWZpbmUgX1FMQ05JQ19MSU5VWF9NQUpPUiA1CiAjZGVmaW5lIF9RTENOSUNfTElOVVhfTUlOT1IgMAotI2RlZmluZSBfUUxDTklDX0xJTlVYX1NVQlZFUlNJT04gMgotI2RlZmluZSBRTENOSUNfTElOVVhfVkVSU0lPTklEICAiNS4wLjIiCisjZGVmaW5lIF9RTENOSUNfTElOVVhfU1VCVkVSU0lPTiA3CisjZGVmaW5lIFFMQ05JQ19MSU5VWF9WRVJTSU9OSUQgICI1LjAuNyIKICNkZWZpbmUgUUxDTklDX0RSVl9JRENfVkVSICAweDAxCiAKICNkZWZpbmUgUUxDTklDX1ZFUlNJT05fQ09ERShhLCBiLCBjKQkoKChhKSA8PCAyNCkgKyAoKGIpIDw8IDE2KSArIChjKSkKQEAgLTY4LDYgKzY4LDcgQEAKICNkZWZpbmUgUUxDTklDX0RFQ09ERV9WRVJTSU9OKHYpIFwKIAlRTENOSUNfVkVSU0lPTl9DT0RFKCgodikgJiAweGZmKSwgKCgodikgPj4gOCkgJiAweGZmKSwgKCh2KSA+PiAxNikpCiAKKyNkZWZpbmUgUUxDTklDX01JTl9GV19WRVJTSU9OICAgICBRTENOSUNfVkVSU0lPTl9DT0RFKDQsIDQsIDIpCiAjZGVmaW5lIFFMQ05JQ19OVU1fRkxBU0hfU0VDVE9SUyAoNjQpCiAjZGVmaW5lIFFMQ05JQ19GTEFTSF9TRUNUT1JfU0laRSAoNjQgKiAxMDI0KQogI2RlZmluZSBRTENOSUNfRkxBU0hfVE9UQUxfU0laRSAgKFFMQ05JQ19OVU1fRkxBU0hfU0VDVE9SUyBcCkBAIC0xMTIsOCArMTEzLDEwIEBACiAjZGVmaW5lIFRYX1VEUFY2X1BLVAkweDBjCiAKIC8qIFR4IGRlZmluZXMgKi8KLSNkZWZpbmUgTUFYX0JVRkZFUlNfUEVSX0NNRAkzMgotI2RlZmluZSBUWF9TVE9QX1RIUkVTSAkJKChNQVhfU0tCX0ZSQUdTID4+IDIpICsgNCkKKyNkZWZpbmUgTUFYX1RTT19IRUFERVJfREVTQwkyCisjZGVmaW5lIE1HTVRfQ01EX0RFU0NfUkVTVgk0CisjZGVmaW5lIFRYX1NUT1BfVEhSRVNICQkoKE1BWF9TS0JfRlJBR1MgPj4gMikgKyBNQVhfVFNPX0hFQURFUl9ERVNDIFwKKwkJCQkJCQkrIE1HTVRfQ01EX0RFU0NfUkVTVikKICNkZWZpbmUgUUxDTklDX01BWF9UWF9USU1FT1VUUwkyCiAKIC8qCkBAIC0xOTcsOCArMjAwLDcgQEAKIAogCV9fbGU2NCBhZGRyX2J1ZmZlcjQ7CiAKLQlfX2xlMzIgcmVzZXJ2ZWQyOwotCV9fbGUxNiByZXNlcnZlZDsKKwl1OCBldGhfYWRkcltFVEhfQUxFTl07CiAJX19sZTE2IHZsYW5fVENJOwogCiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDY0KSkpOwpAQCAtMzE1LDYgKzMxNyw4IEBACiAjZGVmaW5lIFFMQ05JQ19CUkRUWVBFX1AzXzEwR19YRlAJMHgwMDMyCiAjZGVmaW5lIFFMQ05JQ19CUkRUWVBFX1AzXzEwR19UUAkweDAwODAKIAorI2RlZmluZSBRTENOSUNfTVNJWF9UQUJMRV9PRkZTRVQJMHg0NAorCiAvKiBGbGFzaCBtZW1vcnkgbWFwICovCiAjZGVmaW5lIFFMQ05JQ19CUkRDRkdfU1RBUlQJMHg0MDAwCQkvKiBib2FyZCBjb25maWcgKi8KICNkZWZpbmUgUUxDTklDX0JPT1RMRF9TVEFSVAkweDEwMDAwCQkvKiBib290bGQgKi8KQEAgLTM2Nyw3ICszNzEsNyBAQAogICovCiBzdHJ1Y3QgcWxjbmljX2NtZF9idWZmZXIgewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHFsY25pY19za2JfZnJhZyBmcmFnX2FycmF5W01BWF9CVUZGRVJTX1BFUl9DTUQgKyAxXTsKKwlzdHJ1Y3QgcWxjbmljX3NrYl9mcmFnIGZyYWdfYXJyYXlbTUFYX1NLQl9GUkFHUyArIDFdOwogCXUzMiBmcmFnX2NvdW50OwogfTsKIApAQCAtMzc3LDcgKzM4MSw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1NjQgZG1hOwogCXUxNiByZWZfaGFuZGxlOwotCXUxNiBzdGF0ZTsKIH07CiAKIC8qIEJvYXJkIHR5cGVzICovCkBAIC00MTksNyArNDIyLDYgQEAKIAl1NjQgIHhtaXRfb247CiAJdTY0ICB4bWl0X29mZjsKIAl1NjQgIHNrYl9hbGxvY19mYWlsdXJlOwotCXU2NCAgbnVsbF9za2I7CiAJdTY0ICBudWxsX3J4YnVmOwogCXU2NCAgcnhfZG1hX21hcF9lcnJvcjsKIAl1NjQgIHR4X2RtYV9tYXBfZXJyb3I7CkBAIC01NDIsNyArNTQ0LDE3IEBACiAjZGVmaW5lIFFMQ05JQ19DRFJQX0NNRF9SRUFEX1BFWFFfUEFSQU1FVEVSUwkweDAwMDAwMDFjCiAjZGVmaW5lIFFMQ05JQ19DRFJQX0NNRF9HRVRfTElDX0NBUEFCSUxJVElFUwkweDAwMDAwMDFkCiAjZGVmaW5lIFFMQ05JQ19DRFJQX0NNRF9SRUFEX01BWF9MUk9fUEVSX0JPQVJECTB4MDAwMDAwMWUKLSNkZWZpbmUgUUxDTklDX0NEUlBfQ01EX01BWAkJCTB4MDAwMDAwMWYKKyNkZWZpbmUgUUxDTklDX0NEUlBfQ01EX01BQ19BRERSRVNTCQkweDAwMDAwMDFmCisKKyNkZWZpbmUgUUxDTklDX0NEUlBfQ01EX0dFVF9QQ0lfSU5GTwkJMHgwMDAwMDAyMAorI2RlZmluZSBRTENOSUNfQ0RSUF9DTURfR0VUX05JQ19JTkZPCQkweDAwMDAwMDIxCisjZGVmaW5lIFFMQ05JQ19DRFJQX0NNRF9TRVRfTklDX0lORk8JCTB4MDAwMDAwMjIKKyNkZWZpbmUgUUxDTklDX0NEUlBfQ01EX1JFU0VUX05QQVIJCTB4MDAwMDAwMjMKKyNkZWZpbmUgUUxDTklDX0NEUlBfQ01EX0dFVF9FU1dJVENIX0NBUEFCSUxJVFkJMHgwMDAwMDAyNAorI2RlZmluZSBRTENOSUNfQ0RSUF9DTURfVE9HR0xFX0VTV0lUQ0gJCTB4MDAwMDAwMjUKKyNkZWZpbmUgUUxDTklDX0NEUlBfQ01EX0dFVF9FU1dJVENIX1NUQVRVUwkweDAwMDAwMDI2CisjZGVmaW5lIFFMQ05JQ19DRFJQX0NNRF9TRVRfUE9SVE1JUlJPUklORwkweDAwMDAwMDI3CisjZGVmaW5lIFFMQ05JQ19DRFJQX0NNRF9DT05GSUdVUkVfRVNXSVRDSAkweDAwMDAwMDI4CiAKICNkZWZpbmUgUUxDTklDX1JDT0RFX1NVQ0NFU1MJCTAKICNkZWZpbmUgUUxDTklDX1JDT0RFX1RJTUVPVVQJCTE3CkBAIC01NTYsMTIgKzU2OCwxMiBAQAogI2RlZmluZSBRTENOSUNfQ0FQMF9MU08gCQkoMSA8PCA2KQogI2RlZmluZSBRTENOSUNfQ0FQMF9KVU1CT19DT05USUdVT1VTCSgxIDw8IDcpCiAjZGVmaW5lIFFMQ05JQ19DQVAwX0xST19DT05USUdVT1VTCSgxIDw8IDgpCisjZGVmaW5lIFFMQ05JQ19DQVAwX1ZBTElET0ZGCQkoMSA8PCAxMSkKIAogLyoKICAqIENvbnRleHQgc3RhdGUKICAqLwotI2RlZmluZSBRTENIQUxfVkVSU0lPTgkxCi0KKyNkZWZpbmUgUUxDTklDX0hPU1RfQ1RYX1NUQVRFX0ZSRUVECTAKICNkZWZpbmUgUUxDTklDX0hPU1RfQ1RYX1NUQVRFX0FDVElWRQkyCiAKIC8qCkBAIC01OTIsOSArNjA0LDEwIEBACiAJX19sZTMyIHNkc19yaW5nX29mZnNldDsJLyogT2Zmc2V0IHRvIFNEUyBjb25maWcgKi8KIAlfX2xlMTYgbnVtX3Jkc19yaW5nczsJLyogQ291bnQgb2YgUkRTIHJpbmdzICovCiAJX19sZTE2IG51bV9zZHNfcmluZ3M7CS8qIENvdW50IG9mIFNEUyByaW5ncyAqLwotCV9fbGUxNiByc3ZkMTsJCS8qIFBhZGRpbmcgKi8KLQlfX2xlMTYgcnN2ZDI7CQkvKiBQYWRkaW5nICovCi0JdTggIHJlc2VydmVkWzEyOF07IAkvKiByZXNlcnZlIHNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uKi8KKwlfX2xlMTYgdmFsaWRfZmllbGRfb2Zmc2V0OworCXU4ICB0eHJ4X3Nkc19iaW5kaW5nOworCXU4ICBtc2l4X2hhbmRsZXI7CisJdTggIHJlc2VydmVkWzEyOF07ICAgICAgLyogcmVzZXJ2ZSBzcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiovCiAJLyogTVVTVCBCRSA2NC1iaXQgYWxpZ25lZC4KIAkgICBUaGUgZm9sbG93aW5nIGlzIHBhY2tlZDoKIAkgICAtIE4gaG9zdHJxX3Jkc19yaW5ncwpAQCAtODA4LDkgKzgyMSwxMCBAQAogI2RlZmluZSBRTENOSUNfTFJPX1JFUVVFU1RfQ0xFQU5VUAk0CiAKIC8qIENhcGFiaWxpdGVzIHJlY2VpdmVkICovCi0jZGVmaW5lIFFMQ05JQ19GV19DQVBBQklMSVRZX0JERwkJKDEgPDwgOCkKLSNkZWZpbmUgUUxDTklDX0ZXX0NBUEFCSUxJVFlfRlZMQU5UWAkJKDEgPDwgOSkKLSNkZWZpbmUgUUxDTklDX0ZXX0NBUEFCSUxJVFlfSFdfTFJPCQkoMSA8PCAxMCkKKyNkZWZpbmUgUUxDTklDX0ZXX0NBUEFCSUxJVFlfVFNPCQlCSVRfMQorI2RlZmluZSBRTENOSUNfRldfQ0FQQUJJTElUWV9CREcJCUJJVF84CisjZGVmaW5lIFFMQ05JQ19GV19DQVBBQklMSVRZX0ZWTEFOVFgJCUJJVF85CisjZGVmaW5lIFFMQ05JQ19GV19DQVBBQklMSVRZX0hXX0xSTwkJQklUXzEwCiAKIC8qIG1vZHVsZSB0eXBlcyAqLwogI2RlZmluZSBMSU5LRVZFTlRfTU9EVUxFX05PVF9QUkVTRU5UCQkJMQpAQCAtODgxLDEyICs4OTUsMTQgQEAKICNkZWZpbmUgUUxDTklDX0xST19FTkFCTEVECQkweDA4CiAjZGVmaW5lIFFMQ05JQ19CUklER0VfRU5BQkxFRCAgICAgICAJMFgxMAogI2RlZmluZSBRTENOSUNfRElBR19FTkFCTEVECQkweDIwCisjZGVmaW5lIFFMQ05JQ19FU1dJVENIX0VOQUJMRUQJCTB4NDAKICNkZWZpbmUgUUxDTklDX0lTX01TSV9GQU1JTFkoYWRhcHRlcikgXAogCSgoYWRhcHRlciktPmZsYWdzICYgKFFMQ05JQ19NU0lfRU5BQkxFRCB8IFFMQ05JQ19NU0lYX0VOQUJMRUQpKQogCiAjZGVmaW5lIE1TSVhfRU5UUklFU19QRVJfQURBUFRFUglOVU1fU1RTX0RFU0NfUklOR1MKICNkZWZpbmUgUUxDTklDX01TSVhfVEJMX1NQQUNFCQk4MTkyCiAjZGVmaW5lIFFMQ05JQ19QQ0lfUkVHX01TSVhfVEJMIAkweDQ0CisjZGVmaW5lIFFMQ05JQ19NU0lYX1RCTF9QR1NJWkUJCTQwOTYKIAogI2RlZmluZSBRTENOSUNfTkVUREVWX1dFSUdIVAkxMjgKICNkZWZpbmUgUUxDTklDX0FEQVBURVJfVVBfTUFHSUMgNzc3CkBAIC04OTUsNiArOTExLDcgQEAKICNkZWZpbmUgX19RTENOSUNfREVWX1VQIAkJMQogI2RlZmluZSBfX1FMQ05JQ19SRVNFVFRJTkcJCTIKICNkZWZpbmUgX19RTENOSUNfU1RBUlRfRlcgCQk0CisjZGVmaW5lIF9fUUxDTklDX0FFUgkJCTUKIAogI2RlZmluZSBRTENOSUNfSU5URVJSVVBUX1RFU1QJCTEKICNkZWZpbmUgUUxDTklDX0xPT1BCQUNLX1RFU1QJCTIKQEAgLTkxOSwxMSArOTM2LDExIEBACiAJdTggcnhfY3N1bTsKIAl1OCBwb3J0bnVtOwogCXU4IHBoeXNpY2FsX3BvcnQ7CisJdTggcmVzZXRfY29udGV4dDsKIAogCXU4IG1jX2VuYWJsZWQ7CiAJdTggbWF4X21jX2NvdW50OwogCXU4IHJzc19zdXBwb3J0ZWQ7Ci0JdTggcnNydmQxOwogCXU4IGZ3X3dhaXRfY250OwogCXU4IGZ3X2ZhaWxfY250OwogCXU4IHR4X3RpbWVvX2NudDsKQEAgLTkzMiw3ICs5NDksNiBAQAogCXU4IGhhc19saW5rX2V2ZW50czsKIAl1OCBmd190eXBlOwogCXUxNiB0eF9jb250ZXh0X2lkOwotCXUxNiBtdHU7CiAJdTE2IGlzX3VwOwogCiAJdTE2IGxpbmtfc3BlZWQ7CkBAIC05NDAsNiArOTU2LDEzIEBACiAJdTE2IGxpbmtfYXV0b25lZzsKIAl1MTYgbW9kdWxlX3R5cGU7CiAKKwl1MTYgb3BfbW9kZTsKKwl1MTYgc3dpdGNoX21vZGU7CisJdTE2IG1heF90eF9xdWVzOworCXUxNiBtYXhfcnhfcXVlczsKKwl1MTYgbWF4X210dTsKKworCXUzMiBmd19oYWxfdmVyc2lvbjsKIAl1MzIgY2FwYWJpbGl0aWVzOwogCXUzMiBmbGFnczsKIAl1MzIgaXJxOwpAQCAtOTQ4LDE4ICs5NzEsMjIgQEAKIAl1MzIgaW50X3ZlY19iaXQ7CiAJdTMyIGhlYXJ0Yml0OwogCisJdTggbWF4X21hY19maWx0ZXJzOwogCXU4IGRldl9zdGF0ZTsKIAl1OCBkaWFnX3Rlc3Q7CiAJdTggZGlhZ19jbnQ7CiAJdTggcmVzZXRfYWNrX3RpbWVvOwogCXU4IGRldl9pbml0X3RpbWVvOwotCXU4IHJzcmQxOwogCXUxNiBtc2dfZW5hYmxlOwogCiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogCiAJdTY0IGRldl9yc3RfdGltZTsKIAorCXN0cnVjdCBxbGNuaWNfbnBhcl9pbmZvICpucGFyczsKKwlzdHJ1Y3QgcWxjbmljX2Vzd2l0Y2ggKmVzd2l0Y2g7CisJc3RydWN0IHFsY25pY19uaWNfdGVtcGxhdGUgKm5pY19vcHM7CisKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXJfc3RhdHMgc3RhdHM7CiAKIAlzdHJ1Y3QgcWxjbmljX3JlY3ZfY29udGV4dCByZWN2X2N0eDsKQEAgLTk3NCw4ICsxMDAxLDYgQEAKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgZndfd29yazsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdCAgdHhfdGltZW91dF90YXNrOwotCiAJc3RydWN0IHFsY25pY19uaWNfaW50cl9jb2FsZXNjZSBjb2FsOwogCiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKQEAgLTk4NCw2ICsxMDA5LDEyMyBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiB9OwogCitzdHJ1Y3QgcWxjbmljX2luZm8geworCV9fbGUxNglwY2lfZnVuYzsKKwlfX2xlMTYJb3BfbW9kZTsgLyogMSA9IFByaXYsIDIgPSBOUCwgMyA9IE5QIHBhc3N0aHJ1ICovCisJX19sZTE2CXBoeXNfcG9ydDsKKwlfX2xlMTYJc3dpdGNoX21vZGU7IC8qIDAgPSBkaXNhYmxlZCwgMSA9IGludCwgMiA9IGV4dCAqLworCisJX19sZTMyCWNhcGFiaWxpdGllczsKKwl1OAltYXhfbWFjX2ZpbHRlcnM7CisJdTgJcmVzZXJ2ZWQxOworCV9fbGUxNgltYXhfbXR1OworCisJX19sZTE2CW1heF90eF9xdWVzOworCV9fbGUxNgltYXhfcnhfcXVlczsKKwlfX2xlMTYJbWluX3R4X2J3OworCV9fbGUxNgltYXhfdHhfYnc7CisJdTgJcmVzZXJ2ZWQyWzEwNF07Cit9OworCitzdHJ1Y3QgcWxjbmljX3BjaV9pbmZvIHsKKwlfX2xlMTYJaWQ7IC8qIHBjaSBmdW5jdGlvbiBpZCAqLworCV9fbGUxNglhY3RpdmU7IC8qIDEgPSBFbmFibGVkICovCisJX19sZTE2CXR5cGU7IC8qIDEgPSBOSUMsIDIgPSBGQ29FLCAzID0gaVNDU0kgKi8KKwlfX2xlMTYJZGVmYXVsdF9wb3J0OyAvKiBkZWZhdWx0IHBvcnQgbnVtYmVyICovCisKKwlfX2xlMTYJdHhfbWluX2J3OyAvKiBNdWx0aXBsZSBvZiAxMDBtYnBjICovCisJX19sZTE2CXR4X21heF9idzsKKwlfX2xlMTYJcmVzZXJ2ZWQxWzJdOworCisJdTgJbWFjW0VUSF9BTEVOXTsKKwl1OAlyZXNlcnZlZDJbMTA2XTsKK307CisKK3N0cnVjdCBxbGNuaWNfbnBhcl9pbmZvIHsKKwl1MTYJdmxhbl9pZDsKKwl1MTYJbWluX2J3OworCXUxNgltYXhfYnc7CisJdTgJcGh5X3BvcnQ7CisJdTgJdHlwZTsKKwl1OAlhY3RpdmU7CisJdTgJZW5hYmxlX3BtOworCXU4CWRlc3RfbnBhcjsKKwl1OAlob3N0X3ZsYW5fdGFnOworCXU4CXByb21pc2NfbW9kZTsKKwl1OAlkaXNjYXJkX3RhZ2dlZDsKKwl1OAltYWNfbGVhcm5pbmc7Cit9Oworc3RydWN0IHFsY25pY19lc3dpdGNoIHsKKwl1OAlwb3J0OworCXU4CWFjdGl2ZV92cG9ydHM7CisJdTgJYWN0aXZlX3ZsYW5zOworCXU4CWFjdGl2ZV91Y2FzdF9maWx0ZXJzOworCXU4CW1heF91Y2FzdF9maWx0ZXJzOworCXU4CW1heF9hY3RpdmVfdmxhbnM7CisKKwl1MzIJZmxhZ3M7CisjZGVmaW5lIFFMQ05JQ19TV0lUQ0hfRU5BQkxFCQlCSVRfMQorI2RlZmluZSBRTENOSUNfU1dJVENIX1ZMQU5fRklMVEVSSU5HCUJJVF8yCisjZGVmaW5lIFFMQ05JQ19TV0lUQ0hfUFJPTUlTQ19NT0RFCUJJVF8zCisjZGVmaW5lIFFMQ05JQ19TV0lUQ0hfUE9SVF9NSVJST1JJTkcJQklUXzQKK307CisKKworLyogUmV0dXJuIGNvZGVzIGZvciBFcnJvciBoYW5kbGluZyAqLworI2RlZmluZSBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTQktMQorCisjZGVmaW5lIE1BWF9CVwkJCTEwMAorI2RlZmluZSBNSU5fQlcJCQkxCisjZGVmaW5lIE1BWF9WTEFOX0lECQk0MDk1CisjZGVmaW5lIE1JTl9WTEFOX0lECQkyCisjZGVmaW5lIE1BWF9UWF9RVUVVRVMJCTEKKyNkZWZpbmUgTUFYX1JYX1FVRVVFUwkJNAorI2RlZmluZSBERUZBVUxUX01BQ19MRUFSTgkxCisKKyNkZWZpbmUgSVNfVkFMSURfVkxBTih2bGFuKQkodmxhbiA+PSBNSU5fVkxBTl9JRCAmJiB2bGFuIDw9IE1BWF9WTEFOX0lEKQorI2RlZmluZSBJU19WQUxJRF9CVyhidykJCShidyA+PSBNSU5fQlcgJiYgYncgPD0gTUFYX0JXKQorI2RlZmluZSBJU19WQUxJRF9UWF9RVUVVRVMocXVlKQkocXVlID4gMCAmJiBxdWUgPD0gTUFYX1RYX1FVRVVFUykKKyNkZWZpbmUgSVNfVkFMSURfUlhfUVVFVUVTKHF1ZSkJKHF1ZSA+IDAgJiYgcXVlIDw9IE1BWF9SWF9RVUVVRVMpCisjZGVmaW5lIElTX1ZBTElEX01PREUobW9kZSkJKG1vZGUgPT0gMCB8fCBtb2RlID09IDEpCisKK3N0cnVjdCBxbGNuaWNfcGNpX2Z1bmNfY2ZnIHsKKwl1MTYJZnVuY190eXBlOworCXUxNgltaW5fYnc7CisJdTE2CW1heF9idzsKKwl1MTYJcG9ydF9udW07CisJdTgJcGNpX2Z1bmM7CisJdTgJZnVuY19zdGF0ZTsKKwl1OAlkZWZfbWFjX2FkZHJbNl07Cit9OworCitzdHJ1Y3QgcWxjbmljX25wYXJfZnVuY19jZmcgeworCXUzMglmd19jYXBhYjsKKwl1MTYJcG9ydF9udW07CisJdTE2CW1pbl9idzsKKwl1MTYJbWF4X2J3OworCXUxNgltYXhfdHhfcXVldWVzOworCXUxNgltYXhfcnhfcXVldWVzOworCXU4CXBjaV9mdW5jOworCXU4CW9wX21vZGU7Cit9OworCitzdHJ1Y3QgcWxjbmljX3BtX2Z1bmNfY2ZnIHsKKwl1OAlwY2lfZnVuYzsKKwl1OAlhY3Rpb247CisJdTgJZGVzdF9ucGFyOworCXU4CXJlc2VydmVkWzVdOworfTsKKworc3RydWN0IHFsY25pY19lc3dfZnVuY19jZmcgeworCXUxNgl2bGFuX2lkOworCXU4CXBjaV9mdW5jOworCXU4CWhvc3Rfdmxhbl90YWc7CisJdTgJcHJvbWlzY19tb2RlOworCXU4CWRpc2NhcmRfdGFnZ2VkOworCXU4CW1hY19sZWFybmluZzsKKwl1OAlyZXNlcnZlZDsKK307CisKIGludCBxbGNuaWNfZndfY21kX3F1ZXJ5X3BoeShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWcsIHUzMiAqdmFsKTsKIGludCBxbGNuaWNfZndfY21kX3NldF9waHkoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1MzIgcmVnLCB1MzIgdmFsKTsKIApAQCAtMTAzMSwxMyArMTE3MywxMyBAQAogaW50IHFsY25pY19jb25maWdfbGVkKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTMyIHN0YXRlLCB1MzIgcmF0ZSk7CiAKIC8qIEZ1bmN0aW9ucyBmcm9tIHFsY25pY19pbml0LmMgKi8KLWludCBxbGNuaWNfcGhhbnRvbV9pbml0KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgcWxjbmljX2xvYWRfZmlybXdhcmUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKIGludCBxbGNuaWNfbmVlZF9md19yZXNldChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBxbGNuaWNfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBxbGNuaWNfcmVsZWFzZV9maXJtd2FyZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IHFsY25pY19waW5pdF9mcm9tX3JvbShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IHFsY25pY19zZXR1cF9pZGNfcGFyYW0oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKK2ludCBxbGNuaWNfY2hlY2tfZmxhc2hfZndfdmVyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiAKIGludCBxbGNuaWNfcm9tX2Zhc3RfcmVhZChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQgKnZhbHApOwogaW50IHFsY25pY19yb21fZmFzdF9yZWFkX3dvcmRzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsCkBAIC0xMDUwLDYgKzExOTIsMTAgQEAKIGludCBxbGNuaWNfYWxsb2NfaHdfcmVzb3VyY2VzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIHFsY25pY19mcmVlX2h3X3Jlc291cmNlcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCitpbnQgcWxjbmljX2Z3X2NyZWF0ZV9jdHgoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgcWxjbmljX2Z3X2Rlc3Ryb3lfY3R4KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQgcWxjbmljX3Jlc2V0X3J4X2J1ZmZlcnNfbGlzdChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBxbGNuaWNfcmVsZWFzZV9yeF9idWZmZXJzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIHFsY25pY19yZWxlYXNlX3R4X2J1ZmZlcnMoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKIApAQCAtMTA3MCwxMyArMTIxNiwxNCBAQAogaW50IHFsY25pY19md19jbWRfc2V0X210dShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtdHUpOwogaW50IHFsY25pY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KTsKIGludCBxbGNuaWNfY29uZmlnX2h3X2xybyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBlbmFibGUpOwotaW50IHFsY25pY19jb25maWdfYnJpZGdlZF9tb2RlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgaW50IGVuYWJsZSk7CitpbnQgcWxjbmljX2NvbmZpZ19icmlkZ2VkX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1MzIgZW5hYmxlKTsKIGludCBxbGNuaWNfc2VuZF9scm9fY2xlYW51cChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBxbGNuaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCXN0cnVjdCBxbGNuaWNfaG9zdF90eF9yaW5nICp0eF9yaW5nKTsKLWludCBxbGNuaWNfZ2V0X21hY19hZGRyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTY0ICptYWMpOworaW50IHFsY25pY19nZXRfbWFjX2FkZHIoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1OCAqbWFjKTsKIHZvaWQgcWxjbmljX2NsZWFyX2lsYl9tb2RlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgcWxjbmljX3NldF9pbGJfbW9kZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBxbGNuaWNfZmV0Y2hfbWFjKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1MzIsIHUzMiwgdTgsIHU4ICopOwogCiAvKiBGdW5jdGlvbnMgZnJvbSBxbGNuaWNfbWFpbi5jICovCiBpbnQgcWxjbmljX3Jlc2V0X2NvbnRleHQoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwpAQCAtMTA4OCw2ICsxMjM1LDI1IEBACiBuZXRkZXZfdHhfdCBxbGNuaWNfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHZvaWQgcWxjbmljX3Byb2Nlc3NfcmN2X3JpbmdfZGlhZyhzdHJ1Y3QgcWxjbmljX2hvc3Rfc2RzX3JpbmcgKnNkc19yaW5nKTsKIAorLyogTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK2ludCBxbGNuaWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1OCopOworaW50IHFsY25pY19nZXRfbWFjX2FkZHJlc3Moc3RydWN0IHFsY25pY19hZGFwdGVyICosIHU4Kik7CitpbnQgcWxjbmljX2dldF9uaWNfaW5mbyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgc3RydWN0IHFsY25pY19pbmZvICosIHU4KTsKK2ludCBxbGNuaWNfc2V0X25pY19pbmZvKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCBzdHJ1Y3QgcWxjbmljX2luZm8gKik7CitpbnQgcWxjbmljX2dldF9wY2lfaW5mbyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgc3RydWN0IHFsY25pY19wY2lfaW5mbyopOworaW50IHFsY25pY19yZXNldF9wYXJ0aXRpb24oc3RydWN0IHFsY25pY19hZGFwdGVyICosIHU4KTsKKworLyogIGVTd2l0Y2ggbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK2ludCBxbGNuaWNfZ2V0X2Vzd2l0Y2hfY2FwYWJpbGl0aWVzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1OCwKKwkJCQlzdHJ1Y3QgcWxjbmljX2Vzd2l0Y2ggKik7CitpbnQgcWxjbmljX2dldF9lc3dpdGNoX3N0YXR1cyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTgsCisJCQkJc3RydWN0IHFsY25pY19lc3dpdGNoICopOworaW50IHFsY25pY190b2dnbGVfZXN3aXRjaChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTgsIHU4KTsKK2ludCBxbGNuaWNfY29uZmlnX3N3aXRjaF9wb3J0KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1OCwgaW50LCB1OCwgdTgsCisJCQl1OCwgdTgsIHUxNik7CitpbnQgcWxjbmljX2NvbmZpZ19wb3J0X21pcnJvcmluZyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTgsIHU4LCB1OCk7CitleHRlcm4gaW50IHFsY25pY19jb25maWdfdHNvOworCiAvKgogICogUUxPR0lDIEJvYXJkIGluZm9ybWF0aW9uCiAgKi8KQEAgLTExMzEsNiArMTI5NywxMyBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFsY25pY19ldGh0b29sX29wczsKIAorc3RydWN0IHFsY25pY19uaWNfdGVtcGxhdGUgeworCWludCAoKmdldF9tYWNfYWRkcikgKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1OCopOworCWludCAoKmNvbmZpZ19icmlkZ2VkX21vZGUpIChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTMyKTsKKwlpbnQgKCpjb25maWdfbGVkKSAoc3RydWN0IHFsY25pY19hZGFwdGVyICosIHUzMiwgdTMyKTsKKwlpbnQgKCpzdGFydF9maXJtd2FyZSkgKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKK307CisKICNkZWZpbmUgUUxDREIoYWRhcHRlciwgbHZsLCBfZm10LCBfYXJncy4uLikgZG8gewlcCiAJaWYgKE5FVElGX01TR18jI2x2bCAmIGFkYXB0ZXItPm1zZ19lbmFibGUpCVwKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzOiAiIF9mbXQsCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfY3R4LmMgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2N0eC5jCmluZGV4IGMyYzFmNWMuLmNjNWQ4NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfY3R4LmMKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19jdHguYwpAQCAtODgsMTIgKzg4LDEyIEBACiAKIAlpZiAocmVjdl9jdHgtPnN0YXRlID09IFFMQ05JQ19IT1NUX0NUWF9TVEFURV9BQ1RJVkUpIHsKIAkJaWYgKHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwKLQkJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCi0JCQkJUUxDSEFMX1ZFUlNJT04sCi0JCQkJcmVjdl9jdHgtPmNvbnRleHRfaWQsCi0JCQkJbXR1LAotCQkJCTAsCi0JCQkJUUxDTklDX0NEUlBfQ01EX1NFVF9NVFUpKSB7CisJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbiwKKwkJCXJlY3ZfY3R4LT5jb250ZXh0X2lkLAorCQkJbXR1LAorCQkJMCwKKwkJCVFMQ05JQ19DRFJQX0NNRF9TRVRfTVRVKSkgewogCiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IG10dVxuIik7CiAJCQlyZXR1cm4gLUVJTzsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAJaW50IGksIG5yZHNfcmluZ3MsIG5zZHNfcmluZ3M7CiAJc2l6ZV90IHJxX3NpemUsIHJzcF9zaXplOwotCXUzMiBjYXAsIHJlZywgdmFsOworCXUzMiBjYXAsIHJlZywgdmFsLCByZWcyOwogCWludCBlcnI7CiAKIAlzdHJ1Y3QgcWxjbmljX3JlY3ZfY29udGV4dCAqcmVjdl9jdHggPSAmYWRhcHRlci0+cmVjdl9jdHg7CkBAIC0xNTIsOSArMTUyLDE0IEBACiAKIAlwcnEtPmhvc3RfcnNwX2RtYV9hZGRyID0gY3B1X3RvX2xlNjQoY2FyZHJzcF9waHlzX2FkZHIpOwogCi0JY2FwID0gKFFMQ05JQ19DQVAwX0xFR0FDWV9DT05URVhUIHwgUUxDTklDX0NBUDBfTEVHQUNZX01OKTsKKwljYXAgPSAoUUxDTklDX0NBUDBfTEVHQUNZX0NPTlRFWFQgfCBRTENOSUNfQ0FQMF9MRUdBQ1lfTU4KKwkJCQkJCXwgUUxDTklDX0NBUDBfVkFMSURPRkYpOwogCWNhcCB8PSAoUUxDTklDX0NBUDBfSlVNQk9fQ09OVElHVU9VUyB8IFFMQ05JQ19DQVAwX0xST19DT05USUdVT1VTKTsKIAorCXBycS0+dmFsaWRfZmllbGRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHFsY25pY19ob3N0cnFfcnhfY3R4LAorCQkJCQkJCSBtc2l4X2hhbmRsZXIpOworCXBycS0+dHhyeF9zZHNfYmluZGluZyA9IG5zZHNfcmluZ3MgLSAxOworCiAJcHJxLT5jYXBhYmlsaXRpZXNbMF0gPSBjcHVfdG9fbGUzMihjYXApOwogCXBycS0+aG9zdF9pbnRfY3JiX21vZGUgPQogCQljcHVfdG9fbGUzMihRTENOSUNfSE9TVF9JTlRfQ1JCX01PREVfU0hBUkVEKTsKQEAgLTE3NSw2ICsxODAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBucmRzX3JpbmdzOyBpKyspIHsKIAogCQlyZHNfcmluZyA9ICZyZWN2X2N0eC0+cmRzX3JpbmdzW2ldOworCQlyZHNfcmluZy0+cHJvZHVjZXIgPSAwOwogCiAJCXBycV9yZHNbaV0uaG9zdF9waHlzX2FkZHIgPSBjcHVfdG9fbGU2NChyZHNfcmluZy0+cGh5c19hZGRyKTsKIAkJcHJxX3Jkc1tpXS5yaW5nX3NpemUgPSBjcHVfdG9fbGUzMihyZHNfcmluZy0+bnVtX2Rlc2MpOwpAQCAtMTg4LDYgKzE5NCw4IEBACiAJZm9yIChpID0gMDsgaSA8IG5zZHNfcmluZ3M7IGkrKykgewogCiAJCXNkc19yaW5nID0gJnJlY3ZfY3R4LT5zZHNfcmluZ3NbaV07CisJCXNkc19yaW5nLT5jb25zdW1lciA9IDA7CisJCW1lbXNldChzZHNfcmluZy0+ZGVzY19oZWFkLCAwLCBTVEFUVVNfREVTQ19SSU5HU0laRShzZHNfcmluZykpOwogCiAJCXBycV9zZHNbaV0uaG9zdF9waHlzX2FkZHIgPSBjcHVfdG9fbGU2NChzZHNfcmluZy0+cGh5c19hZGRyKTsKIAkJcHJxX3Nkc1tpXS5yaW5nX3NpemUgPSBjcHVfdG9fbGUzMihzZHNfcmluZy0+bnVtX2Rlc2MpOwpAQCAtMTk3LDcgKzIwNSw3IEBACiAJcGh5c19hZGRyID0gaG9zdHJxX3BoeXNfYWRkcjsKIAllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCi0JCQlRTENIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAogCQkJKHUzMikocGh5c19hZGRyID4+IDMyKSwKIAkJCSh1MzIpKHBoeXNfYWRkciAmIDB4ZmZmZmZmZmYpLAogCQkJcnFfc2l6ZSwKQEAgLTIxNiw4ICsyMjQsNyBAQAogCQlyZHNfcmluZyA9ICZyZWN2X2N0eC0+cmRzX3JpbmdzW2ldOwogCiAJCXJlZyA9IGxlMzJfdG9fY3B1KHByc3BfcmRzW2ldLmhvc3RfcHJvZHVjZXJfY3JiKTsKLQkJcmRzX3JpbmctPmNyYl9yY3ZfcHJvZHVjZXIgPSBxbGNuaWNfZ2V0X2lvYWRkcihhZGFwdGVyLAotCQkJCVFMQ05JQ19SRUcocmVnIC0gMHgyMDApKTsKKwkJcmRzX3JpbmctPmNyYl9yY3ZfcHJvZHVjZXIgPSBhZGFwdGVyLT5haHcucGNpX2Jhc2UwICsgcmVnOwogCX0KIAogCXByc3Bfc2RzID0gKChzdHJ1Y3QgcWxjbmljX2NhcmRyc3Bfc2RzX3JpbmcgKikKQEAgLTIyNywxMiArMjM0LDEwIEBACiAJCXNkc19yaW5nID0gJnJlY3ZfY3R4LT5zZHNfcmluZ3NbaV07CiAKIAkJcmVnID0gbGUzMl90b19jcHUocHJzcF9zZHNbaV0uaG9zdF9jb25zdW1lcl9jcmIpOwotCQlzZHNfcmluZy0+Y3JiX3N0c19jb25zdW1lciA9IHFsY25pY19nZXRfaW9hZGRyKGFkYXB0ZXIsCi0JCQkJUUxDTklDX1JFRyhyZWcgLSAweDIwMCkpOworCQlyZWcyID0gbGUzMl90b19jcHUocHJzcF9zZHNbaV0uaW50ZXJydXB0X2NyYik7CiAKLQkJcmVnID0gbGUzMl90b19jcHUocHJzcF9zZHNbaV0uaW50ZXJydXB0X2NyYik7Ci0JCXNkc19yaW5nLT5jcmJfaW50cl9tYXNrID0gcWxjbmljX2dldF9pb2FkZHIoYWRhcHRlciwKLQkJCQlRTENOSUNfUkVHKHJlZyAtIDB4MjAwKSk7CisJCXNkc19yaW5nLT5jcmJfc3RzX2NvbnN1bWVyID0gYWRhcHRlci0+YWh3LnBjaV9iYXNlMCArIHJlZzsKKwkJc2RzX3JpbmctPmNyYl9pbnRyX21hc2sgPSBhZGFwdGVyLT5haHcucGNpX2Jhc2UwICsgcmVnMjsKIAl9CiAKIAlyZWN2X2N0eC0+c3RhdGUgPSBsZTMyX3RvX2NwdShwcnNwLT5ob3N0X2N0eF9zdGF0ZSk7CkBAIC0yNTMsNyArMjU4LDcgQEAKIAogCWlmIChxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCi0JCQlRTENIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAogCQkJcmVjdl9jdHgtPmNvbnRleHRfaWQsCiAJCQlRTENOSUNfREVTVFJPWV9DVFhfUkVTRVQsCiAJCQkwLApAQCAtMjYyLDYgKzI2Nyw4IEBACiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSJGYWlsZWQgdG8gZGVzdHJveSByeCBjdHggaW4gZmlybXdhcmVcbiIpOwogCX0KKworCXJlY3ZfY3R4LT5zdGF0ZSA9IFFMQ05JQ19IT1NUX0NUWF9TVEFURV9GUkVFRDsKIH0KIAogc3RhdGljIGludApAQCAtMjc4LDYgKzI4NSwxMSBAQAogCWRtYV9hZGRyX3QJcnFfcGh5c19hZGRyLCByc3BfcGh5c19hZGRyOwogCXN0cnVjdCBxbGNuaWNfaG9zdF90eF9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZzsKIAorCS8qIHJlc2V0IGhvc3QgcmVzb3VyY2VzICovCisJdHhfcmluZy0+cHJvZHVjZXIgPSAwOworCXR4X3JpbmctPnN3X2NvbnN1bWVyID0gMDsKKwkqKHR4X3JpbmctPmh3X2NvbnN1bWVyKSA9IDA7CisKIAlycV9zaXplID0gU0laRU9GX0hPU1RSUV9UWChzdHJ1Y3QgcWxjbmljX2hvc3RycV90eF9jdHgpOwogCXJxX2FkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAogCQlycV9zaXplLCAmcnFfcGh5c19hZGRyKTsKQEAgLTMxOSw3ICszMzEsNyBAQAogCXBoeXNfYWRkciA9IHJxX3BoeXNfYWRkcjsKIAllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCi0JCQlRTENIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAogCQkJKHUzMikocGh5c19hZGRyID4+IDMyKSwKIAkJCSgodTMyKXBoeXNfYWRkciAmIDB4ZmZmZmZmZmYpLAogCQkJcnFfc2l6ZSwKQEAgLTMyNyw4ICszMzksNyBAQAogCiAJaWYgKGVyciA9PSBRTENOSUNfUkNPREVfU1VDQ0VTUykgewogCQl0ZW1wID0gbGUzMl90b19jcHUocHJzcC0+Y2RzX3JpbmcuaG9zdF9wcm9kdWNlcl9jcmIpOwotCQl0eF9yaW5nLT5jcmJfY21kX3Byb2R1Y2VyID0gcWxjbmljX2dldF9pb2FkZHIoYWRhcHRlciwKLQkJCQlRTENOSUNfUkVHKHRlbXAgLSAweDIwMCkpOworCQl0eF9yaW5nLT5jcmJfY21kX3Byb2R1Y2VyID0gYWRhcHRlci0+YWh3LnBjaV9iYXNlMCArIHRlbXA7CiAKIAkJYWRhcHRlci0+dHhfY29udGV4dF9pZCA9CiAJCQlsZTE2X3RvX2NwdShwcnNwLT5jb250ZXh0X2lkKTsKQEAgLTM1MSw3ICszNjIsNyBAQAogewogCWlmIChxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCi0JCQlRTENIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAogCQkJYWRhcHRlci0+dHhfY29udGV4dF9pZCwKIAkJCVFMQ05JQ19ERVNUUk9ZX0NUWF9SRVNFVCwKIAkJCTAsCkBAIC0zNjgsNyArMzc5LDcgQEAKIAogCWlmIChxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCi0JCQlRTENIQUxfVkVSU0lPTiwKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAogCQkJcmVnLAogCQkJMCwKIAkJCTAsCkBAIC0zODUsNyArMzk2LDcgQEAKIHsKIAlyZXR1cm4gcWxjbmljX2lzc3VlX2NtZChhZGFwdGVyLAogCQkJYWRhcHRlci0+YWh3LnBjaV9mdW5jLAotCQkJUUxDSEFMX1ZFUlNJT04sCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbiwKIAkJCXJlZywKIAkJCXZhbCwKIAkJCTAsCkBAIC00NTcsMTUgKzQ2OCw2IEBACiAJCXNkc19yaW5nLT5kZXNjX2hlYWQgPSAoc3RydWN0IHN0YXR1c19kZXNjICopYWRkcjsKIAl9CiAKLQotCWVyciA9IHFsY25pY19md19jbWRfY3JlYXRlX3J4X2N0eChhZGFwdGVyKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZnJlZTsKLQllcnIgPSBxbGNuaWNfZndfY21kX2NyZWF0ZV90eF9jdHgoYWRhcHRlcik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQlzZXRfYml0KF9fUUxDTklDX0ZXX0FUVEFDSEVELCAmYWRhcHRlci0+c3RhdGUpOwogCXJldHVybiAwOwogCiBlcnJfb3V0X2ZyZWU6CkBAIC00NzMsNiArNDc1LDM2IEBACiAJcmV0dXJuIGVycjsKIH0KIAorCitpbnQgcWxjbmljX2Z3X2NyZWF0ZV9jdHgoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBlcnI7CisKKwllcnIgPSBxbGNuaWNfZndfY21kX2NyZWF0ZV9yeF9jdHgoYWRhcHRlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHFsY25pY19md19jbWRfY3JlYXRlX3R4X2N0eChhZGFwdGVyKTsKKwlpZiAoZXJyKSB7CisJCXFsY25pY19md19jbWRfZGVzdHJveV9yeF9jdHgoYWRhcHRlcik7CisJCXJldHVybiBlcnI7CisJfQorCisJc2V0X2JpdChfX1FMQ05JQ19GV19BVFRBQ0hFRCwgJmFkYXB0ZXItPnN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBxbGNuaWNfZndfZGVzdHJveV9jdHgoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoX19RTENOSUNfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpIHsKKwkJcWxjbmljX2Z3X2NtZF9kZXN0cm95X3J4X2N0eChhZGFwdGVyKTsKKwkJcWxjbmljX2Z3X2NtZF9kZXN0cm95X3R4X2N0eChhZGFwdGVyKTsKKworCQkvKiBBbGxvdyBkbWEgcXVldWVzIHRvIGRyYWluIGFmdGVyIGNvbnRleHQgcmVzZXQgKi8KKwkJbXNsZWVwKDIwKTsKKwl9Cit9CisKIHZvaWQgcWxjbmljX2ZyZWVfaHdfcmVzb3VyY2VzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcWxjbmljX3JlY3ZfY29udGV4dCAqcmVjdl9jdHg7CkBAIC00ODEsMTUgKzUxMyw2IEBACiAJc3RydWN0IHFsY25pY19ob3N0X3R4X3JpbmcgKnR4X3Jpbmc7CiAJaW50IHJpbmc7CiAKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoX19RTENOSUNfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpIHsKLQkJcWxjbmljX2Z3X2NtZF9kZXN0cm95X3J4X2N0eChhZGFwdGVyKTsKLQkJcWxjbmljX2Z3X2NtZF9kZXN0cm95X3R4X2N0eChhZGFwdGVyKTsKLQotCQkvKiBBbGxvdyBkbWEgcXVldWVzIHRvIGRyYWluIGFmdGVyIGNvbnRleHQgcmVzZXQgKi8KLQkJbXNsZWVwKDIwKTsKLQl9Ci0KIAlyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eDsKIAogCXR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nOwpAQCAtNTMzLDMgKzU1Niw0MzAgQEAKIAl9CiB9CiAKKy8qIFNldCBNQUMgYWRkcmVzcyBvZiBhIE5JQyBwYXJ0aXRpb24gKi8KK2ludCBxbGNuaWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTgqIG1hYykKK3sKKwlpbnQgZXJyID0gMDsKKwl1MzIgYXJnMSwgYXJnMiwgYXJnMzsKKworCWFyZzEgPSBhZGFwdGVyLT5haHcucGNpX2Z1bmMgfCBCSVRfOTsKKwlhcmcyID0gbWFjWzBdIHwgKG1hY1sxXSA8PCA4KSB8IChtYWNbMl0gPDwgMTYpIHwgKG1hY1szXSA8PCAyNCk7CisJYXJnMyA9IG1hY1s0XSB8IChtYWNbNV0gPDwgMTYpOworCisJZXJyID0gcWxjbmljX2lzc3VlX2NtZChhZGFwdGVyLAorCQkJYWRhcHRlci0+YWh3LnBjaV9mdW5jLAorCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sCisJCQlhcmcxLAorCQkJYXJnMiwKKwkJCWFyZzMsCisJCQlRTENOSUNfQ0RSUF9DTURfTUFDX0FERFJFU1MpOworCisJaWYgKGVyciAhPSBRTENOSUNfUkNPREVfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIHNldCBtYWMgYWRkcmVzcyVkXG4iLCBlcnIpOworCQllcnIgPSAtRUlPOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEdldCBNQUMgYWRkcmVzcyBvZiBhIE5JQyBwYXJ0aXRpb24gKi8KK2ludCBxbGNuaWNfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYykKK3sKKwlpbnQgZXJyOworCXUzMiBhcmcxOworCisJYXJnMSA9IGFkYXB0ZXItPmFody5wY2lfZnVuYyB8IEJJVF84OworCWVyciA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYywKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAorCQkJYXJnMSwKKwkJCTAsCisJCQkwLAorCQkJUUxDTklDX0NEUlBfQ01EX01BQ19BRERSRVNTKTsKKworCWlmIChlcnIgPT0gUUxDTklDX1JDT0RFX1NVQ0NFU1MpCisJCXFsY25pY19mZXRjaF9tYWMoYWRhcHRlciwgUUxDTklDX0FSRzFfQ1JCX09GRlNFVCwKKwkJCQlRTENOSUNfQVJHMl9DUkJfT0ZGU0VULCAwLCBtYWMpOworCWVsc2UgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGdldCBtYWMgYWRkcmVzcyVkXG4iLCBlcnIpOworCQllcnIgPSAtRUlPOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEdldCBpbmZvIG9mIGEgTklDIHBhcnRpdGlvbiAqLworaW50IHFsY25pY19nZXRfbmljX2luZm8oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLAorCQkJCXN0cnVjdCBxbGNuaWNfaW5mbyAqbnBhcl9pbmZvLCB1OCBmdW5jX2lkKQoreworCWludAllcnI7CisJZG1hX2FkZHJfdCBuaWNfZG1hX3Q7CisJc3RydWN0IHFsY25pY19pbmZvICpuaWNfaW5mbzsKKwl2b2lkICpuaWNfaW5mb19hZGRyOworCXNpemVfdAluaWNfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWxjbmljX2luZm8pOworCisJbmljX2luZm9fYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCisJCW5pY19zaXplLCAmbmljX2RtYV90KTsKKwlpZiAoIW5pY19pbmZvX2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChuaWNfaW5mb19hZGRyLCAwLCBuaWNfc2l6ZSk7CisKKwluaWNfaW5mbyA9IChzdHJ1Y3QgcWxjbmljX2luZm8gKikgbmljX2luZm9fYWRkcjsKKwllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCisJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbiwKKwkJCU1TRChuaWNfZG1hX3QpLAorCQkJTFNEKG5pY19kbWFfdCksCisJCQkoZnVuY19pZCA8PCAxNiB8IG5pY19zaXplKSwKKwkJCVFMQ05JQ19DRFJQX0NNRF9HRVRfTklDX0lORk8pOworCisJaWYgKGVyciA9PSBRTENOSUNfUkNPREVfU1VDQ0VTUykgeworCQlucGFyX2luZm8tPnBjaV9mdW5jID0gbGUxNl90b19jcHUobmljX2luZm8tPnBjaV9mdW5jKTsKKwkJbnBhcl9pbmZvLT5vcF9tb2RlID0gbGUxNl90b19jcHUobmljX2luZm8tPm9wX21vZGUpOworCQlucGFyX2luZm8tPnBoeXNfcG9ydCA9IGxlMTZfdG9fY3B1KG5pY19pbmZvLT5waHlzX3BvcnQpOworCQlucGFyX2luZm8tPnN3aXRjaF9tb2RlID0gbGUxNl90b19jcHUobmljX2luZm8tPnN3aXRjaF9tb2RlKTsKKwkJbnBhcl9pbmZvLT5tYXhfdHhfcXVlcyA9IGxlMTZfdG9fY3B1KG5pY19pbmZvLT5tYXhfdHhfcXVlcyk7CisJCW5wYXJfaW5mby0+bWF4X3J4X3F1ZXMgPSBsZTE2X3RvX2NwdShuaWNfaW5mby0+bWF4X3J4X3F1ZXMpOworCQlucGFyX2luZm8tPm1pbl90eF9idyA9IGxlMTZfdG9fY3B1KG5pY19pbmZvLT5taW5fdHhfYncpOworCQlucGFyX2luZm8tPm1heF90eF9idyA9IGxlMTZfdG9fY3B1KG5pY19pbmZvLT5tYXhfdHhfYncpOworCQlucGFyX2luZm8tPmNhcGFiaWxpdGllcyA9IGxlMzJfdG9fY3B1KG5pY19pbmZvLT5jYXBhYmlsaXRpZXMpOworCQlucGFyX2luZm8tPm1heF9tdHUgPSBsZTE2X3RvX2NwdShuaWNfaW5mby0+bWF4X210dSk7CisKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJwaHkgcG9ydDogJWQgc3dpdGNoX21vZGU6ICVkLFxuIgorCQkJIlx0bWF4X3R4X3E6ICVkIG1heF9yeF9xOiAlZCBtaW5fdHhfYnc6IDB4JXgsXG4iCisJCQkiXHRtYXhfdHhfYnc6IDB4JXggbWF4X210dToweCV4LCBjYXBhYmlsaXRpZXM6IDB4JXhcbiIsCisJCQlucGFyX2luZm8tPnBoeXNfcG9ydCwgbnBhcl9pbmZvLT5zd2l0Y2hfbW9kZSwKKwkJCW5wYXJfaW5mby0+bWF4X3R4X3F1ZXMsIG5wYXJfaW5mby0+bWF4X3J4X3F1ZXMsCisJCQlucGFyX2luZm8tPm1pbl90eF9idywgbnBhcl9pbmZvLT5tYXhfdHhfYncsCisJCQlucGFyX2luZm8tPm1heF9tdHUsIG5wYXJfaW5mby0+Y2FwYWJpbGl0aWVzKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGdldCBuaWMgaW5mbyVkXG4iLCBlcnIpOworCQllcnIgPSAtRUlPOworCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgbmljX3NpemUsIG5pY19pbmZvX2FkZHIsIG5pY19kbWFfdCk7CisJcmV0dXJuIGVycjsKK30KKworLyogQ29uZmlndXJlIGEgTklDIHBhcnRpdGlvbiAqLworaW50IHFsY25pY19zZXRfbmljX2luZm8oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcWxjbmljX2luZm8gKm5pYykKK3sKKwlpbnQgZXJyID0gLUVJTzsKKwlkbWFfYWRkcl90IG5pY19kbWFfdDsKKwl2b2lkICpuaWNfaW5mb19hZGRyOworCXN0cnVjdCBxbGNuaWNfaW5mbyAqbmljX2luZm87CisJc2l6ZV90IG5pY19zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGNuaWNfaW5mbyk7CisKKwlpZiAoYWRhcHRlci0+b3BfbW9kZSAhPSBRTENOSUNfTUdNVF9GVU5DKQorCQlyZXR1cm4gZXJyOworCisJbmljX2luZm9fYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIG5pY19zaXplLAorCQkJJm5pY19kbWFfdCk7CisJaWYgKCFuaWNfaW5mb19hZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChuaWNfaW5mb19hZGRyLCAwLCBuaWNfc2l6ZSk7CisJbmljX2luZm8gPSAoc3RydWN0IHFsY25pY19pbmZvICopbmljX2luZm9fYWRkcjsKKworCW5pY19pbmZvLT5wY2lfZnVuYyA9IGNwdV90b19sZTE2KG5pYy0+cGNpX2Z1bmMpOworCW5pY19pbmZvLT5vcF9tb2RlID0gY3B1X3RvX2xlMTYobmljLT5vcF9tb2RlKTsKKwluaWNfaW5mby0+cGh5c19wb3J0ID0gY3B1X3RvX2xlMTYobmljLT5waHlzX3BvcnQpOworCW5pY19pbmZvLT5zd2l0Y2hfbW9kZSA9IGNwdV90b19sZTE2KG5pYy0+c3dpdGNoX21vZGUpOworCW5pY19pbmZvLT5jYXBhYmlsaXRpZXMgPSBjcHVfdG9fbGUzMihuaWMtPmNhcGFiaWxpdGllcyk7CisJbmljX2luZm8tPm1heF9tYWNfZmlsdGVycyA9IG5pYy0+bWF4X21hY19maWx0ZXJzOworCW5pY19pbmZvLT5tYXhfdHhfcXVlcyA9IGNwdV90b19sZTE2KG5pYy0+bWF4X3R4X3F1ZXMpOworCW5pY19pbmZvLT5tYXhfcnhfcXVlcyA9IGNwdV90b19sZTE2KG5pYy0+bWF4X3J4X3F1ZXMpOworCW5pY19pbmZvLT5taW5fdHhfYncgPSBjcHVfdG9fbGUxNihuaWMtPm1pbl90eF9idyk7CisJbmljX2luZm8tPm1heF90eF9idyA9IGNwdV90b19sZTE2KG5pYy0+bWF4X3R4X2J3KTsKKworCWVyciA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYywKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAorCQkJTVNEKG5pY19kbWFfdCksCisJCQlMU0QobmljX2RtYV90KSwKKwkJCSgobmljLT5wY2lfZnVuYyA8PCAxNikgfCBuaWNfc2l6ZSksCisJCQlRTENOSUNfQ0RSUF9DTURfU0VUX05JQ19JTkZPKTsKKworCWlmIChlcnIgIT0gUUxDTklDX1JDT0RFX1NVQ0NFU1MpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBzZXQgbmljIGluZm8lZFxuIiwgZXJyKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIG5pY19zaXplLCBuaWNfaW5mb19hZGRyLCBuaWNfZG1hX3QpOworCXJldHVybiBlcnI7Cit9CisKKy8qIEdldCBQQ0kgSW5mbyBvZiBhIHBhcnRpdGlvbiAqLworaW50IHFsY25pY19nZXRfcGNpX2luZm8oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLAorCQkJCXN0cnVjdCBxbGNuaWNfcGNpX2luZm8gKnBjaV9pbmZvKQoreworCWludCBlcnIgPSAwLCBpOworCWRtYV9hZGRyX3QgcGNpX2luZm9fZG1hX3Q7CisJc3RydWN0IHFsY25pY19wY2lfaW5mbyAqbnBhcjsKKwl2b2lkICpwY2lfaW5mb19hZGRyOworCXNpemVfdCBucGFyX3NpemUgPSBzaXplb2Yoc3RydWN0IHFsY25pY19wY2lfaW5mbyk7CisJc2l6ZV90IHBjaV9zaXplID0gbnBhcl9zaXplICogUUxDTklDX01BWF9QQ0lfRlVOQzsKKworCXBjaV9pbmZvX2FkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwY2lfc2l6ZSwKKwkJCSZwY2lfaW5mb19kbWFfdCk7CisJaWYgKCFwY2lfaW5mb19hZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocGNpX2luZm9fYWRkciwgMCwgcGNpX3NpemUpOworCisJbnBhciA9IChzdHJ1Y3QgcWxjbmljX3BjaV9pbmZvICopIHBjaV9pbmZvX2FkZHI7CisJZXJyID0gcWxjbmljX2lzc3VlX2NtZChhZGFwdGVyLAorCQkJYWRhcHRlci0+YWh3LnBjaV9mdW5jLAorCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sCisJCQlNU0QocGNpX2luZm9fZG1hX3QpLAorCQkJTFNEKHBjaV9pbmZvX2RtYV90KSwKKwkJCXBjaV9zaXplLAorCQkJUUxDTklDX0NEUlBfQ01EX0dFVF9QQ0lfSU5GTyk7CisKKwlpZiAoZXJyID09IFFMQ05JQ19SQ09ERV9TVUNDRVNTKSB7CisJCWZvciAoaSA9IDA7IGkgPCBRTENOSUNfTUFYX1BDSV9GVU5DOyBpKyssIG5wYXIrKywgcGNpX2luZm8rKykgeworCQkJcGNpX2luZm8tPmlkID0gbGUzMl90b19jcHUobnBhci0+aWQpOworCQkJcGNpX2luZm8tPmFjdGl2ZSA9IGxlMzJfdG9fY3B1KG5wYXItPmFjdGl2ZSk7CisJCQlwY2lfaW5mby0+dHlwZSA9IGxlMzJfdG9fY3B1KG5wYXItPnR5cGUpOworCQkJcGNpX2luZm8tPmRlZmF1bHRfcG9ydCA9CisJCQkJbGUzMl90b19jcHUobnBhci0+ZGVmYXVsdF9wb3J0KTsKKwkJCXBjaV9pbmZvLT50eF9taW5fYncgPQorCQkJCWxlMzJfdG9fY3B1KG5wYXItPnR4X21pbl9idyk7CisJCQlwY2lfaW5mby0+dHhfbWF4X2J3ID0KKwkJCQlsZTMyX3RvX2NwdShucGFyLT50eF9tYXhfYncpOworCQkJbWVtY3B5KHBjaV9pbmZvLT5tYWMsIG5wYXItPm1hYywgRVRIX0FMRU4pOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBnZXQgUENJIEluZm8lZFxuIiwgZXJyKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBjaV9zaXplLCBwY2lfaW5mb19hZGRyLAorCQlwY2lfaW5mb19kbWFfdCk7CisJcmV0dXJuIGVycjsKK30KKworLyogUmVzZXQgYSBOSUMgcGFydGl0aW9uICovCisKK2ludCBxbGNuaWNfcmVzZXRfcGFydGl0aW9uKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTggZnVuY19ubykKK3sKKwlpbnQgZXJyID0gLUVJTzsKKworCWlmIChhZGFwdGVyLT5vcF9tb2RlICE9IFFMQ05JQ19NR01UX0ZVTkMpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCisJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbiwKKwkJCWZ1bmNfbm8sCisJCQkwLAorCQkJMCwKKwkJCVFMQ05JQ19DRFJQX0NNRF9SRVNFVF9OUEFSKTsKKworCWlmIChlcnIgIT0gUUxDTklDX1JDT0RFX1NVQ0NFU1MpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBpc3N1ZSByZXNldCBwYXJ0aXRpb24lZFxuIiwgZXJyKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBHZXQgZVN3aXRjaCBDYXBhYmlsaXRpZXMgKi8KK2ludCBxbGNuaWNfZ2V0X2Vzd2l0Y2hfY2FwYWJpbGl0aWVzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTggcG9ydCwKKwkJCQkJc3RydWN0IHFsY25pY19lc3dpdGNoICplc3dpdGNoKQoreworCWludCBlcnIgPSAtRUlPOworCXUzMiBhcmcxLCBhcmcyOworCisJaWYgKGFkYXB0ZXItPm9wX21vZGUgPT0gUUxDTklDX05PTl9QUklWX0ZVTkMpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCisJCQlhZGFwdGVyLT5haHcucGNpX2Z1bmMsCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbiwKKwkJCXBvcnQsCisJCQkwLAorCQkJMCwKKwkJCVFMQ05JQ19DRFJQX0NNRF9HRVRfRVNXSVRDSF9DQVBBQklMSVRZKTsKKworCWlmIChlcnIgPT0gUUxDTklDX1JDT0RFX1NVQ0NFU1MpIHsKKwkJYXJnMSA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0FSRzFfQ1JCX09GRlNFVCk7CisJCWFyZzIgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19BUkcyX0NSQl9PRkZTRVQpOworCisJCWVzd2l0Y2gtPnBvcnQgPSBhcmcxICYgMHhmOworCQllc3dpdGNoLT5hY3RpdmVfdnBvcnRzID0gTFNCKGFyZzIpOworCQllc3dpdGNoLT5tYXhfdWNhc3RfZmlsdGVycyA9IE1TQihhcmcyKTsKKwkJZXN3aXRjaC0+bWF4X2FjdGl2ZV92bGFucyA9IExTQihNU1coYXJnMikpOworCQlpZiAoYXJnMSAmIEJJVF82KQorCQkJZXN3aXRjaC0+ZmxhZ3MgfD0gUUxDTklDX1NXSVRDSF9WTEFOX0ZJTFRFUklORzsKKwkJaWYgKGFyZzEgJiBCSVRfNykKKwkJCWVzd2l0Y2gtPmZsYWdzIHw9IFFMQ05JQ19TV0lUQ0hfUFJPTUlTQ19NT0RFOworCQlpZiAoYXJnMSAmIEJJVF84KQorCQkJZXN3aXRjaC0+ZmxhZ3MgfD0gUUxDTklDX1NXSVRDSF9QT1JUX01JUlJPUklORzsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGdldCBlc3dpdGNoIGNhcGFiaWxpdGllcyVkXG4iLCBlcnIpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEdldCBjdXJyZW50IHN0YXR1cyBvZiBlc3dpdGNoICovCitpbnQgcWxjbmljX2dldF9lc3dpdGNoX3N0YXR1cyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHBvcnQsCisJCQkJc3RydWN0IHFsY25pY19lc3dpdGNoICplc3dpdGNoKQoreworCWludCBlcnIgPSAtRUlPOworCXUzMiBhcmcxLCBhcmcyOworCisJaWYgKGFkYXB0ZXItPm9wX21vZGUgIT0gUUxDTklDX01HTVRfRlVOQykKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYywKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAorCQkJcG9ydCwKKwkJCTAsCisJCQkwLAorCQkJUUxDTklDX0NEUlBfQ01EX0dFVF9FU1dJVENIX1NUQVRVUyk7CisKKwlpZiAoZXJyID09IFFMQ05JQ19SQ09ERV9TVUNDRVNTKSB7CisJCWFyZzEgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19BUkcxX0NSQl9PRkZTRVQpOworCQlhcmcyID0gUUxDUkQzMihhZGFwdGVyLCBRTENOSUNfQVJHMl9DUkJfT0ZGU0VUKTsKKworCQllc3dpdGNoLT5wb3J0ID0gYXJnMSAmIDB4ZjsKKwkJZXN3aXRjaC0+YWN0aXZlX3Zwb3J0cyA9IExTQihhcmcyKTsKKwkJZXN3aXRjaC0+YWN0aXZlX3VjYXN0X2ZpbHRlcnMgPSBNU0IoYXJnMik7CisJCWVzd2l0Y2gtPmFjdGl2ZV92bGFucyA9IExTQihNU1coYXJnMikpOworCQlpZiAoYXJnMSAmIEJJVF82KQorCQkJZXN3aXRjaC0+ZmxhZ3MgfD0gUUxDTklDX1NXSVRDSF9WTEFOX0ZJTFRFUklORzsKKwkJaWYgKGFyZzEgJiBCSVRfOCkKKwkJCWVzd2l0Y2gtPmZsYWdzIHw9IFFMQ05JQ19TV0lUQ0hfUE9SVF9NSVJST1JJTkc7CisKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGdldCBlc3dpdGNoIHN0YXR1cyVkXG4iLCBlcnIpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEVuYWJsZS9EaXNhYmxlIGVTd2l0Y2ggKi8KK2ludCBxbGNuaWNfdG9nZ2xlX2Vzd2l0Y2goc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1OCBpZCwgdTggZW5hYmxlKQoreworCWludCBlcnIgPSAtRUlPOworCXUzMiBhcmcxLCBhcmcyOworCXN0cnVjdCBxbGNuaWNfZXN3aXRjaCAqZXN3aXRjaDsKKworCWlmIChhZGFwdGVyLT5vcF9tb2RlICE9IFFMQ05JQ19NR01UX0ZVTkMpCisJCXJldHVybiBlcnI7CisKKwllc3dpdGNoID0gJmFkYXB0ZXItPmVzd2l0Y2hbaWRdOworCWlmICghZXN3aXRjaCkKKwkJcmV0dXJuIGVycjsKKworCWFyZzEgPSBlc3dpdGNoLT5wb3J0IHwgKGVuYWJsZSA/IEJJVF80IDogMCk7CisJYXJnMiA9IGVzd2l0Y2gtPmFjdGl2ZV92cG9ydHMgfCAoZXN3aXRjaC0+bWF4X3VjYXN0X2ZpbHRlcnMgPDwgOCkgfAorCQkoZXN3aXRjaC0+bWF4X2FjdGl2ZV92bGFucyA8PCAxNik7CisJZXJyID0gcWxjbmljX2lzc3VlX2NtZChhZGFwdGVyLAorCQkJYWRhcHRlci0+YWh3LnBjaV9mdW5jLAorCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sCisJCQlhcmcxLAorCQkJYXJnMiwKKwkJCTAsCisJCQlRTENOSUNfQ0RSUF9DTURfVE9HR0xFX0VTV0lUQ0gpOworCisJaWYgKGVyciAhPSBRTENOSUNfUkNPREVfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGVuYWJsZSBlc3dpdGNoJWRcbiIsIGVzd2l0Y2gtPnBvcnQpOworCQllc3dpdGNoLT5mbGFncyAmPSB+UUxDTklDX1NXSVRDSF9FTkFCTEU7CisJCWVyciA9IC1FSU87CisJfSBlbHNlIHsKKwkJZXN3aXRjaC0+ZmxhZ3MgfD0gUUxDTklDX1NXSVRDSF9FTkFCTEU7CisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRW5hYmxlZCBlU3dpdGNoIGZvciBwb3J0ICVkXG4iLCBlc3dpdGNoLT5wb3J0KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBDb25maWd1cmUgZVN3aXRjaCBmb3IgcG9ydCBtaXJyb3JpbmcgKi8KK2ludCBxbGNuaWNfY29uZmlnX3BvcnRfbWlycm9yaW5nKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTggaWQsCisJCQkJdTggZW5hYmxlX21pcnJvcmluZywgdTggcGNpX2Z1bmMpCit7CisJaW50IGVyciA9IC1FSU87CisJdTMyIGFyZzE7CisKKwlpZiAoYWRhcHRlci0+b3BfbW9kZSAhPSBRTENOSUNfTUdNVF9GVU5DIHx8CisJCSEoYWRhcHRlci0+ZXN3aXRjaFtpZF0uZmxhZ3MgJiBRTENOSUNfU1dJVENIX0VOQUJMRSkpCisJCXJldHVybiBlcnI7CisKKwlhcmcxID0gaWQgfCAoZW5hYmxlX21pcnJvcmluZyA/IEJJVF80IDogMCk7CisJYXJnMSB8PSBwY2lfZnVuYyA8PCA4OworCisJZXJyID0gcWxjbmljX2lzc3VlX2NtZChhZGFwdGVyLAorCQkJYWRhcHRlci0+YWh3LnBjaV9mdW5jLAorCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sCisJCQlhcmcxLAorCQkJMCwKKwkJCTAsCisJCQlRTENOSUNfQ0RSUF9DTURfU0VUX1BPUlRNSVJST1JJTkcpOworCisJaWYgKGVyciAhPSBRTENOSUNfUkNPREVfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwb3J0IG1pcnJvcmluZyVkIG9uIGVzd2l0Y2g6JWRcbiIsCisJCQlwY2lfZnVuYywgaWQpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiQ29uZmlndXJlZCBlU3dpdGNoICVkIGZvciBwb3J0IG1pcnJvcmluZzolZFxuIiwKKwkJCWlkLCBwY2lfZnVuYyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogQ29uZmlndXJlIGVTd2l0Y2ggcG9ydCAqLworaW50IHFsY25pY19jb25maWdfc3dpdGNoX3BvcnQoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1OCBpZCwKKwkJaW50IHZsYW5fdGFnZ2luZywgdTggZGlzY2FyZF90YWdnZWQsIHU4IHByb21zY19tb2RlLAorCQl1OCBtYWNfbGVhcm4sIHU4IHBjaV9mdW5jLCB1MTYgdmxhbl9pZCkKK3sKKwlpbnQgZXJyID0gLUVJTzsKKwl1MzIgYXJnMTsKKwlzdHJ1Y3QgcWxjbmljX2Vzd2l0Y2ggKmVzd2l0Y2g7CisKKwlpZiAoYWRhcHRlci0+b3BfbW9kZSAhPSBRTENOSUNfTUdNVF9GVU5DKQorCQlyZXR1cm4gZXJyOworCisJZXN3aXRjaCA9ICZhZGFwdGVyLT5lc3dpdGNoW2lkXTsKKwlpZiAoIShlc3dpdGNoLT5mbGFncyAmIFFMQ05JQ19TV0lUQ0hfRU5BQkxFKSkKKwkJcmV0dXJuIGVycjsKKworCWFyZzEgPSBlc3dpdGNoLT5wb3J0IHwgKGRpc2NhcmRfdGFnZ2VkID8gQklUXzQgOiAwKTsKKwlhcmcxIHw9IChwcm9tc2NfbW9kZSA/IEJJVF82IDogMCkgfCAobWFjX2xlYXJuID8gQklUXzcgOiAwKTsKKwlhcmcxIHw9IHBjaV9mdW5jIDw8IDg7CisJaWYgKHZsYW5fdGFnZ2luZykKKwkJYXJnMSB8PSBCSVRfNSB8ICh2bGFuX2lkIDw8IDE2KTsKKworCWVyciA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYywKKwkJCWFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uLAorCQkJYXJnMSwKKwkJCTAsCisJCQkwLAorCQkJUUxDTklDX0NEUlBfQ01EX0NPTkZJR1VSRV9FU1dJVENIKTsKKworCWlmIChlcnIgIT0gUUxDTklDX1JDT0RFX1NVQ0NFU1MpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBjb25maWd1cmUgZXN3aXRjaCBwb3J0JWRcbiIsIGVzd2l0Y2gtPnBvcnQpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiQ29uZmlndXJlZCBlU3dpdGNoIGZvciBwb3J0ICVkXG4iLCBlc3dpdGNoLT5wb3J0KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2V0aHRvb2wuYwppbmRleCAzYmQ1MTRlLi45MzI4ZDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2V0aHRvb2wuYwpAQCAtNjksOCArNjksNiBAQAogCQlRTENfU0laRU9GKHN0YXRzLnhtaXRfb2ZmKSwgUUxDX09GRihzdGF0cy54bWl0X29mZil9LAogCXsic2tiX2FsbG9jX2ZhaWx1cmUiLCBRTENfU0laRU9GKHN0YXRzLnNrYl9hbGxvY19mYWlsdXJlKSwKIAkJUUxDX09GRihzdGF0cy5za2JfYWxsb2NfZmFpbHVyZSl9LAotCXsibnVsbCBza2IiLAotCQlRTENfU0laRU9GKHN0YXRzLm51bGxfc2tiKSwgUUxDX09GRihzdGF0cy5udWxsX3NrYil9LAogCXsibnVsbCByeGJ1ZiIsCiAJCVFMQ19TSVpFT0Yoc3RhdHMubnVsbF9yeGJ1ZiksIFFMQ19PRkYoc3RhdHMubnVsbF9yeGJ1Zil9LAogCXsicnggZG1hIG1hcCBlcnJvciIsIFFMQ19TSVpFT0Yoc3RhdHMucnhfZG1hX21hcF9lcnJvciksCkBAIC0zNTAsNyArMzQ4LDcgQEAKIAlmb3IgKGkgPSAwOyBkaWFnX3JlZ2lzdGVyc1tpXSAhPSAtMTsgaSsrKQogCQlyZWdzX2J1ZmZbaV0gPSBRTENSRDMyKGFkYXB0ZXIsIGRpYWdfcmVnaXN0ZXJzW2ldKTsKIAotCWlmIChhZGFwdGVyLT5pc191cCAhPSBRTENOSUNfQURBUFRFUl9VUF9NQUdJQykKKwlpZiAoIXRlc3RfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJcmV0dXJuOwogCiAJcmVnc19idWZmW2krK10gPSAweEZGRUZDREFCOyAvKiBNYXJrZXIgYnR3IHJlZ3MgYW5kIHJpbmcgY291bnQqLwpAQCAtNTgwLDggKzU3OCwxMiBAQAogCQl9CiAJCVFMQ1dSMzIoYWRhcHRlciwgUUxDTklDX05JVV9HQl9QQVVTRV9DVEwsIHZhbCk7CiAJfSBlbHNlIGlmIChhZGFwdGVyLT5haHcucG9ydF90eXBlID09IFFMQ05JQ19YR0JFKSB7CisJCWlmICghcGF1c2UtPnJ4X3BhdXNlIHx8IHBhdXNlLT5hdXRvbmVnKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gUUxDTklDX05JVV9NQVhfWEdfUE9SVFMpKQogCQkJcmV0dXJuIC1FSU87CisKIAkJdmFsID0gUUxDUkQzMihhZGFwdGVyLCBRTENOSUNfTklVX1hHX1BBVVNFX0NUTCk7CiAJCWlmIChwb3J0ID09IDApIHsKIAkJCWlmIChwYXVzZS0+dHhfcGF1c2UpCkBAIC02NzYsNiArNjc4LDEyIEBACiAJaW50IG1heF9zZHNfcmluZ3MgPSBhZGFwdGVyLT5tYXhfc2RzX3JpbmdzOwogCWludCByZXQ7CiAKKwlpZiAoYWRhcHRlci0+b3BfbW9kZSA9PSBRTENOSUNfTk9OX1BSSVZfRlVOQykgeworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiTG9vcGJhY2sgdGVzdCBub3Qgc3VwcG9ydGVkIgorCQkJCSJmb3Igbm9uIHByaXZpbGVnZSBmdW5jdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KF9fUUxDTklDX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTcxNSw3ICs3MjMsOCBAQAogCiAJYWRhcHRlci0+ZGlhZ19jbnQgPSAwOwogCXJldCA9IHFsY25pY19pc3N1ZV9jbWQoYWRhcHRlciwgYWRhcHRlci0+YWh3LnBjaV9mdW5jLAotCQkJUUxDSEFMX1ZFUlNJT04sIGFkYXB0ZXItPnBvcnRudW0sIDAsIDAsIDB4MDAwMDAwMTEpOworCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sIGFkYXB0ZXItPnBvcnRudW0sCisJCQkwLCAwLCAweDAwMDAwMDExKTsKIAlpZiAocmV0KQogCQlnb3RvIGRvbmU7CiAKQEAgLTgyMSw2ICs4MzAsOSBAQAogCiBzdGF0aWMgaW50IHFsY25pY19zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQogeworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKCEoYWRhcHRlci0+Y2FwYWJpbGl0aWVzICYgUUxDTklDX0ZXX0NBUEFCSUxJVFlfVFNPKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCWlmIChkYXRhKQogCQlkZXYtPmZlYXR1cmVzIHw9IChORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNik7CiAJZWxzZQpAQCAtODM0LDcgKzg0NiwxMCBAQAogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJldDsKIAotCXJldCA9IHFsY25pY19jb25maWdfbGVkKGFkYXB0ZXIsIDEsIDB4Zik7CisJaWYgKCF0ZXN0X2JpdChfX1FMQ05JQ19ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSkpCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gYWRhcHRlci0+bmljX29wcy0+Y29uZmlnX2xlZChhZGFwdGVyLCAxLCAweGYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJIkZhaWxlZCB0byBzZXQgTEVEIGJsaW5rIHN0YXRlLlxuIik7CkBAIC04NDMsNyArODU4LDcgQEAKIAogCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHZhbCAqIDEwMDApOwogCi0JcmV0ID0gcWxjbmljX2NvbmZpZ19sZWQoYWRhcHRlciwgMCwgMHhmKTsKKwlyZXQgPSBhZGFwdGVyLT5uaWNfb3BzLT5jb25maWdfbGVkKGFkYXB0ZXIsIDAsIDB4Zik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkiRmFpbGVkIHRvIHJlc2V0IExFRCBibGluayBzdGF0ZS5cbiIpOwpAQCAtOTA1LDcgKzkyMCw3IEBACiB7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCWlmIChhZGFwdGVyLT5pc191cCAhPSBRTENOSUNfQURBUFRFUl9VUF9NQUdJQykKKwlpZiAoIXRlc3RfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKgpAQCAtOTgxLDEyICs5OTYsMTkgQEAKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBod19scm87CiAKKwlpZiAoZGF0YSAmIH5FVEhfRkxBR19MUk8pCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKCEoYWRhcHRlci0+Y2FwYWJpbGl0aWVzICYgUUxDTklDX0ZXX0NBUEFCSUxJVFlfSFdfTFJPKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlldGh0b29sX29wX3NldF9mbGFncyhuZXRkZXYsIGRhdGEpOwotCi0JaHdfbHJvID0gKGRhdGEgJiBFVEhfRkxBR19MUk8pID8gUUxDTklDX0xST19FTkFCTEVEIDogMDsKKwlpZiAoZGF0YSAmIEVUSF9GTEFHX0xSTykgeworCQlod19scm8gPSBRTENOSUNfTFJPX0VOQUJMRUQ7CisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CisJfSBlbHNlIHsKKwkJaHdfbHJvID0gMDsKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9MUk87CisJfQogCiAJaWYgKHFsY25pY19jb25maWdfaHdfbHJvKGFkYXB0ZXIsIGh3X2xybykpCiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19oZHIuaCBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaGRyLmgKaW5kZXggYWQ5ZDE2Ny4uMTVmYzMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19oZHIuaAorKysgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2hkci5oCkBAIC0yMDgsNiArMjA4LDM5IEBACiAJUUxDTklDX0hXX1BYX01BUF9DUkJfUEdSMAogfTsKIAorI2RlZmluZQlCSVRfMAkweDEKKyNkZWZpbmUJQklUXzEJMHgyCisjZGVmaW5lCUJJVF8yCTB4NAorI2RlZmluZQlCSVRfMwkweDgKKyNkZWZpbmUJQklUXzQJMHgxMAorI2RlZmluZQlCSVRfNQkweDIwCisjZGVmaW5lCUJJVF82CTB4NDAKKyNkZWZpbmUJQklUXzcJMHg4MAorI2RlZmluZQlCSVRfOAkweDEwMAorI2RlZmluZQlCSVRfOQkweDIwMAorI2RlZmluZQlCSVRfMTAJMHg0MDAKKyNkZWZpbmUJQklUXzExCTB4ODAwCisjZGVmaW5lCUJJVF8xMgkweDEwMDAKKyNkZWZpbmUJQklUXzEzCTB4MjAwMAorI2RlZmluZQlCSVRfMTQJMHg0MDAwCisjZGVmaW5lCUJJVF8xNQkweDgwMDAKKyNkZWZpbmUJQklUXzE2CTB4MTAwMDAKKyNkZWZpbmUJQklUXzE3CTB4MjAwMDAKKyNkZWZpbmUJQklUXzE4CTB4NDAwMDAKKyNkZWZpbmUJQklUXzE5CTB4ODAwMDAKKyNkZWZpbmUJQklUXzIwCTB4MTAwMDAwCisjZGVmaW5lCUJJVF8yMQkweDIwMDAwMAorI2RlZmluZQlCSVRfMjIJMHg0MDAwMDAKKyNkZWZpbmUJQklUXzIzCTB4ODAwMDAwCisjZGVmaW5lCUJJVF8yNAkweDEwMDAwMDAKKyNkZWZpbmUJQklUXzI1CTB4MjAwMDAwMAorI2RlZmluZQlCSVRfMjYJMHg0MDAwMDAwCisjZGVmaW5lCUJJVF8yNwkweDgwMDAwMDAKKyNkZWZpbmUJQklUXzI4CTB4MTAwMDAwMDAKKyNkZWZpbmUJQklUXzI5CTB4MjAwMDAwMDAKKyNkZWZpbmUJQklUXzMwCTB4NDAwMDAwMDAKKyNkZWZpbmUJQklUXzMxCTB4ODAwMDAwMDAKKwogLyogIFRoaXMgZmllbGQgZGVmaW5lcyBDUkIgYWRyIFszMToyMF0gb2YgdGhlIGFnZW50cyAqLwogCiAjZGVmaW5lIFFMQ05JQ19IV19DUkJfSFVCX0FHVF9BRFJfTU4JXApAQCAtNjY4LDEwICs3MDEsMTEgQEAKICNkZWZpbmUgUUxDTklDX0NSQl9ERVZfUkVGX0NPVU5UCShRTENOSUNfQ0FNX1JBTSgweDEzOCkpCiAjZGVmaW5lIFFMQ05JQ19DUkJfREVWX1NUQVRFCQkoUUxDTklDX0NBTV9SQU0oMHgxNDApKQogCi0jZGVmaW5lIFFMQ05JQ19DUkJfRFJWX1NUQVRFICAgICAgICAgICAgICAgKFFMQ05JQ19DQU1fUkFNKDB4MTQ0KSkKLSNkZWZpbmUgUUxDTklDX0NSQl9EUlZfU0NSQVRDSCAgICAgICAgICAgICAoUUxDTklDX0NBTV9SQU0oMHgxNDgpKQotI2RlZmluZSBRTENOSUNfQ1JCX0RFVl9QQVJUSVRJT05fSU5GTyAgICAgIChRTENOSUNfQ0FNX1JBTSgweDE0YykpCisjZGVmaW5lIFFMQ05JQ19DUkJfRFJWX1NUQVRFCQkoUUxDTklDX0NBTV9SQU0oMHgxNDQpKQorI2RlZmluZSBRTENOSUNfQ1JCX0RSVl9TQ1JBVENICQkoUUxDTklDX0NBTV9SQU0oMHgxNDgpKQorI2RlZmluZSBRTENOSUNfQ1JCX0RFVl9QQVJUSVRJT05fSU5GTwkoUUxDTklDX0NBTV9SQU0oMHgxNGMpKQogI2RlZmluZSBRTENOSUNfQ1JCX0RSVl9JRENfVkVSCQkoUUxDTklDX0NBTV9SQU0oMHgxNzQpKQorI2RlZmluZSBRTENOSUNfQ1JCX0RFVl9OUEFSX1NUQVRFCShRTENOSUNfQ0FNX1JBTSgweDE5YykpCiAjZGVmaW5lIFFMQ05JQ19ST01fREVWX0lOSVRfVElNRU9VVAkoMHgzZTg4NWMpCiAjZGVmaW5lIFFMQ05JQ19ST01fRFJWX1JFU0VUX1RJTUVPVVQJKDB4M2U4ODYwKQogCkBAIC02ODQsMTUgKzcxOCwyNiBAQAogI2RlZmluZSBRTENOSUNfREVWX0ZBSUxFRAkJMHg2CiAjZGVmaW5lIFFMQ05JQ19ERVZfUVVJU0NFTlQJCTB4NwogCisjZGVmaW5lIFFMQ05JQ19ERVZfTlBBUl9OT1RfUkRZCTAKKyNkZWZpbmUgUUxDTklDX0RFVl9OUEFSX1JEWQkJMQorCisjZGVmaW5lIFFMQ19ERVZfQ0hFQ0tfQUNUSVZFKFZBTCwgRk4pCQkoKFZBTCkgJj0gKDEgPDwgKEZOICogNCkpKQogI2RlZmluZSBRTENfREVWX1NFVF9SRUZfQ05UKFZBTCwgRk4pCQkoKFZBTCkgfD0gKDEgPDwgKEZOICogNCkpKQogI2RlZmluZSBRTENfREVWX0NMUl9SRUZfQ05UKFZBTCwgRk4pCQkoKFZBTCkgJj0gfigxIDw8IChGTiAqIDQpKSkKICNkZWZpbmUgUUxDX0RFVl9TRVRfUlNUX1JEWShWQUwsIEZOKQkJKChWQUwpIHw9ICgxIDw8IChGTiAqIDQpKSkKICNkZWZpbmUgUUxDX0RFVl9TRVRfUVNDTlRfUkRZKFZBTCwgRk4pCQkoKFZBTCkgfD0gKDIgPDwgKEZOICogNCkpKQogI2RlZmluZSBRTENfREVWX0NMUl9SU1RfUVNDTlQoVkFMLCBGTikJCSgoVkFMKSAmPSB+KDMgPDwgKEZOICogNCkpKQogCisjZGVmaW5lIFFMQ19ERVZfR0VUX0RSVihWQUwsIEZOKQkJKDB4ZiAmICgoVkFMKSA+PiAoRk4gKiA0KSkpCisjZGVmaW5lIFFMQ19ERVZfU0VUX0RSVihWQUwsIEZOKQkJKChWQUwpIDw8IChGTiAqIDQpKQorCisjZGVmaW5lIFFMQ05JQ19UWVBFX05JQwkJMQorI2RlZmluZSBRTENOSUNfVFlQRV9GQ09FCQkyCisjZGVmaW5lIFFMQ05JQ19UWVBFX0lTQ1NJCQkzCisKICNkZWZpbmUgUUxDTklDX1JDT0RFX0RSSVZFUl9JTkZPCQkweDIwMDAwMDAwCi0jZGVmaW5lIFFMQ05JQ19SQ09ERV9EUklWRVJfQ0FOX1JFTE9BRAkJMHg0MDAwMDAwMAotI2RlZmluZSBRTENOSUNfUkNPREVfRkFUQUxfRVJST1IJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUUxDTklDX1JDT0RFX0RSSVZFUl9DQU5fUkVMT0FECQlCSVRfMzAKKyNkZWZpbmUgUUxDTklDX1JDT0RFX0ZBVEFMX0VSUk9SCQlCSVRfMzEKICNkZWZpbmUgUUxDTklDX0ZXRVJST1JfUEVHTlVNKGNvZGUpCQkoKGNvZGUpICYgMHhmZikKICNkZWZpbmUgUUxDTklDX0ZXRVJST1JfQ09ERShjb2RlKQkJKChjb2RlID4+IDgpICYgMHhmZmZmZikKIApAQCAtNzIxLDYgKzc2NiwyOSBAQAogCXUzMglwY2lfaW50X3JlZzsKIH07CiAKKyNkZWZpbmUgUUxDTklDX0ZXX0FQSQkJMHgxYjIxNmMKKyNkZWZpbmUgUUxDTklDX0RSVl9PUF9NT0RFCTB4MWIyMTcwCisjZGVmaW5lIFFMQ05JQ19NU0lYX0JBU0UJMHgxMzIxMTAKKyNkZWZpbmUgUUxDTklDX01BWF9QQ0lfRlVOQwk4CisKKy8qIFBDSSBmdW5jdGlvbiBvcGVyYXRpb25hbCBtb2RlICovCitlbnVtIHsKKwlRTENOSUNfTUdNVF9GVU5DCT0gMCwKKwlRTENOSUNfUFJJVl9GVU5DCT0gMSwKKwlRTENOSUNfTk9OX1BSSVZfRlVOQwk9IDIKK307CisKKyNkZWZpbmUgUUxDX0RFVl9EUlZfREVGQVVMVCAweDExMTExMTExCisKKyNkZWZpbmUgTFNCKHgpCSgodWludDhfdCkoeCkpCisjZGVmaW5lIE1TQih4KQkoKHVpbnQ4X3QpKCh1aW50MTZfdCkoeCkgPj4gOCkpCisKKyNkZWZpbmUgTFNXKHgpICAoKHVpbnQxNl90KSgodWludDMyX3QpKHgpKSkKKyNkZWZpbmUgTVNXKHgpICAoKHVpbnQxNl90KSgodWludDMyX3QpKHgpID4+IDE2KSkKKworI2RlZmluZSBMU0QoeCkgICgodWludDMyX3QpKCh1aW50NjRfdCkoeCkpKQorI2RlZmluZSBNU0QoeCkgICgodWludDMyX3QpKCgoKHVpbnQ2NF90KSh4KSkgPj4gMTYpID4+IDE2KSkKKwogI2RlZmluZQlRTENOSUNfTEVHQUNZX0lOVFJfQ09ORklHCQkJCQlcCiB7CQkJCQkJCQkJXAogCXsJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaHcuYyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaHcuYwppbmRleCAwYzJlMWYwLi5lMDhjOGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19ody5jCkBAIC0zMjcsNyArMzI3LDcgQEAKIAogCWkgPSAwOwogCi0JaWYgKGFkYXB0ZXItPmlzX3VwICE9IFFMQ05JQ19BREFQVEVSX1VQX01BR0lDKQorCWlmICghdGVzdF9iaXQoX19RTENOSUNfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybiAtRUlPOwogCiAJdHhfcmluZyA9IGFkYXB0ZXItPnR4X3Jpbmc7CkBAIC0zMzgsOSArMzM4LDE1IEBACiAKIAlpZiAobnJfZGVzYyA+PSBxbGNuaWNfdHhfYXZhaWwodHhfcmluZykpIHsKIAkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eF9yaW5nLT50eHEpOwotCQlfX25ldGlmX3R4X3VubG9ja19iaCh0eF9yaW5nLT50eHEpOwotCQlhZGFwdGVyLT5zdGF0cy54bWl0X29mZisrOwotCQlyZXR1cm4gLUVCVVNZOworCQlzbXBfbWIoKTsKKwkJaWYgKHFsY25pY190eF9hdmFpbCh0eF9yaW5nKSA+IG5yX2Rlc2MpIHsKKwkJCWlmIChxbGNuaWNfdHhfYXZhaWwodHhfcmluZykgPiBUWF9TVE9QX1RIUkVTSCkKKwkJCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4X3JpbmctPnR4cSk7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5zdGF0cy54bWl0X29mZisrOworCQkJX19uZXRpZl90eF91bmxvY2tfYmgodHhfcmluZy0+dHhxKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KIAl9CiAKIAlkbyB7CkBAIC00MDcsMTAgKzQxMywxNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtY3B5KGN1ci0+bWFjX2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKLQlsaXN0X2FkZF90YWlsKCZjdXItPmxpc3QsICZhZGFwdGVyLT5tYWNfbGlzdCk7CiAKLQlyZXR1cm4gcWxjbmljX3NyZV9tYWNhZGRyX2NoYW5nZShhZGFwdGVyLAotCQkJCWN1ci0+bWFjX2FkZHIsIFFMQ05JQ19NQUNfQUREKTsKKwlpZiAocWxjbmljX3NyZV9tYWNhZGRyX2NoYW5nZShhZGFwdGVyLAorCQkJCWN1ci0+bWFjX2FkZHIsIFFMQ05JQ19NQUNfQUREKSkgeworCQlrZnJlZShjdXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZjdXItPmxpc3QsICZhZGFwdGVyLT5tYWNfbGlzdCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgcWxjbmljX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtNDIwLDcgKzQzMSw3IEBACiAJdTggYmNhc3RfYWRkcltFVEhfQUxFTl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIAl1MzIgbW9kZSA9IFZQT1JUX01JU1NfTU9ERV9EUk9QOwogCi0JaWYgKGFkYXB0ZXItPmlzX3VwICE9IFFMQ05JQ19BREFQVEVSX1VQX01BR0lDKQorCWlmICghdGVzdF9iaXQoX19RTENOSUNfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKIAogCXFsY25pY19uaWNfYWRkX21hYyhhZGFwdGVyLCBhZGFwdGVyLT5tYWNfYWRkcik7CkBAIC01MzgsNyArNTQ5LDcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLWludCBxbGNuaWNfY29uZmlnX2JyaWRnZWRfbW9kZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBlbmFibGUpCitpbnQgcWxjbmljX2NvbmZpZ19icmlkZ2VkX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1MzIgZW5hYmxlKQogewogCXN0cnVjdCBxbGNuaWNfbmljX3JlcSByZXE7CiAJdTY0IHdvcmQ7CkBAIC03MDQsMjEgKzcxNSwxNSBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHFsY25pY19nZXRfbWFjX2FkZHIoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1NjQgKm1hYykKK2ludCBxbGNuaWNfZ2V0X21hY19hZGRyKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYykKIHsKLQl1MzIgY3JiYWRkciwgbWFjX2hpLCBtYWNfbG87CisJdTMyIGNyYmFkZHI7CiAJaW50IHBjaV9mdW5jID0gYWRhcHRlci0+YWh3LnBjaV9mdW5jOwogCiAJY3JiYWRkciA9IENSQl9NQUNfQkxPQ0tfU1RBUlQgKwogCQkoNCAqICgocGNpX2Z1bmMvMikgKiAzKSkgKyAoNCAqIChwY2lfZnVuYyAmIDEpKTsKIAotCW1hY19sbyA9IFFMQ1JEMzIoYWRhcHRlciwgY3JiYWRkcik7Ci0JbWFjX2hpID0gUUxDUkQzMihhZGFwdGVyLCBjcmJhZGRyKzQpOwotCi0JaWYgKHBjaV9mdW5jICYgMSkKLQkJKm1hYyA9IGxlNjRfdG9fY3B1KChtYWNfbG8gPj4gMTYpIHwgKCh1NjQpbWFjX2hpIDw8IDE2KSk7Ci0JZWxzZQotCQkqbWFjID0gbGU2NF90b19jcHUoKHU2NCltYWNfbG8gfCAoKHU2NCltYWNfaGkgPDwgMzIpKTsKKwlxbGNuaWNfZmV0Y2hfbWFjKGFkYXB0ZXIsIGNyYmFkZHIsIGNyYmFkZHIrNCwgcGNpX2Z1bmMgJiAxLCBtYWMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjYsNyArNzcxLDcgQEAKICAqIE91dDogJ29mZicgaXMgMk0gcGNpIG1hcCBhZGRyCiAgKiBzaWRlIGVmZmVjdDogbG9jayBjcmIgd2luZG93CiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBxbGNuaWNfcGNpX3NldF9jcmJ3aW5kb3dfMk0oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1bG9uZyBvZmYpCiB7CiAJdTMyIHdpbmRvdzsKQEAgLTc3NSw2ICs3ODAsMTAgQEAKIAlvZmYgLT0gUUxDTklDX1BDSV9DUkJTUEFDRTsKIAogCXdpbmRvdyA9IENSQl9ISShvZmYpOworCWlmICh3aW5kb3cgPT0gMCkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJJbnZhbGlkIG9mZnNldCAweCVseFxuIiwgb2ZmKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCiAJd3JpdGVsKHdpbmRvdywgYWRkcik7CiAJaWYgKHJlYWRsKGFkZHIpICE9IHdpbmRvdykgewpAQCAtNzgyLDcgKzc5MSw5IEBACiAJCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJmYWlsZWQgdG8gc2V0IENSQiB3aW5kb3cgdG8gJWQgb2ZmIDB4JWx4XG4iLAogCQkJCXdpbmRvdywgb2ZmKTsKKwkJcmV0dXJuIC1FSU87CiAJfQorCXJldHVybiAwOwogfQogCiBpbnQKQEAgLTgwMywxMSArODE0LDEyIEBACiAJCS8qIGluZGlyZWN0IGFjY2VzcyAqLwogCQl3cml0ZV9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmFody5jcmJfbG9jaywgZmxhZ3MpOwogCQljcmJfd2luX2xvY2soYWRhcHRlcik7Ci0JCXFsY25pY19wY2lfc2V0X2NyYndpbmRvd18yTShhZGFwdGVyLCBvZmYpOwotCQl3cml0ZWwoZGF0YSwgYWRkcik7CisJCXJ2ID0gcWxjbmljX3BjaV9zZXRfY3Jid2luZG93XzJNKGFkYXB0ZXIsIG9mZik7CisJCWlmICghcnYpCisJCQl3cml0ZWwoZGF0YSwgYWRkcik7CiAJCWNyYl93aW5fdW5sb2NrKGFkYXB0ZXIpOwogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+YWh3LmNyYl9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gcnY7CiAJfQogCiAJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LApAQCAtODIxLDcgKzgzMyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcnY7Ci0JdTMyIGRhdGE7CisJdTMyIGRhdGEgPSAtMTsKIAl2b2lkIF9faW9tZW0gKmFkZHIgPSBOVUxMOwogCiAJcnYgPSBxbGNuaWNfcGNpX2dldF9jcmJfYWRkcl8yTShhZGFwdGVyLCBvZmYsICZhZGRyKTsKQEAgLTgzMyw4ICs4NDUsOCBAQAogCQkvKiBpbmRpcmVjdCBhY2Nlc3MgKi8KIAkJd3JpdGVfbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5haHcuY3JiX2xvY2ssIGZsYWdzKTsKIAkJY3JiX3dpbl9sb2NrKGFkYXB0ZXIpOwotCQlxbGNuaWNfcGNpX3NldF9jcmJ3aW5kb3dfMk0oYWRhcHRlciwgb2ZmKTsKLQkJZGF0YSA9IHJlYWRsKGFkZHIpOworCQlpZiAoIXFsY25pY19wY2lfc2V0X2NyYndpbmRvd18yTShhZGFwdGVyLCBvZmYpKQorCQkJZGF0YSA9IHJlYWRsKGFkZHIpOwogCQljcmJfd2luX3VubG9jayhhZGFwdGVyKTsKIAkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmFody5jcmJfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaW5pdC5jIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19pbml0LmMKaW5kZXggNzFhNGU2Ni4uNzViYTc0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19pbml0LmMKQEAgLTExMiwxOCArMTEyLDQ1IEBACiAJCXJkc19yaW5nID0gJnJlY3ZfY3R4LT5yZHNfcmluZ3NbcmluZ107CiAJCWZvciAoaSA9IDA7IGkgPCByZHNfcmluZy0+bnVtX2Rlc2M7ICsraSkgewogCQkJcnhfYnVmID0gJihyZHNfcmluZy0+cnhfYnVmX2FycltpXSk7Ci0JCQlpZiAocnhfYnVmLT5zdGF0ZSA9PSBRTENOSUNfQlVGRkVSX0ZSRUUpCisJCQlpZiAocnhfYnVmLT5za2IgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKKwogCQkJcGNpX3VubWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LAogCQkJCQlyeF9idWYtPmRtYSwKIAkJCQkJcmRzX3JpbmctPmRtYV9zaXplLAogCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJaWYgKHJ4X2J1Zi0+c2tiICE9IE5VTEwpCi0JCQkJZGV2X2tmcmVlX3NrYl9hbnkocnhfYnVmLT5za2IpOworCisJCQlkZXZfa2ZyZWVfc2tiX2FueShyeF9idWYtPnNrYik7CiAJCX0KIAl9CiB9CiAKK3ZvaWQgcWxjbmljX3Jlc2V0X3J4X2J1ZmZlcnNfbGlzdChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHFsY25pY19yZWN2X2NvbnRleHQgKnJlY3ZfY3R4OworCXN0cnVjdCBxbGNuaWNfaG9zdF9yZHNfcmluZyAqcmRzX3Jpbmc7CisJc3RydWN0IHFsY25pY19yeF9idWZmZXIgKnJ4X2J1ZjsKKwlpbnQgaSwgcmluZzsKKworCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4OworCWZvciAocmluZyA9IDA7IHJpbmcgPCBhZGFwdGVyLT5tYXhfcmRzX3JpbmdzOyByaW5nKyspIHsKKwkJcmRzX3JpbmcgPSAmcmVjdl9jdHgtPnJkc19yaW5nc1tyaW5nXTsKKworCQlzcGluX2xvY2soJnJkc19yaW5nLT5sb2NrKTsKKworCQlJTklUX0xJU1RfSEVBRCgmcmRzX3JpbmctPmZyZWVfbGlzdCk7CisKKwkJcnhfYnVmID0gcmRzX3JpbmctPnJ4X2J1Zl9hcnI7CisJCWZvciAoaSA9IDA7IGkgPCByZHNfcmluZy0+bnVtX2Rlc2M7IGkrKykgeworCQkJbGlzdF9hZGRfdGFpbCgmcnhfYnVmLT5saXN0LAorCQkJCQkmcmRzX3JpbmctPmZyZWVfbGlzdCk7CisJCQlyeF9idWYrKzsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZyZHNfcmluZy0+bG9jayk7CisJfQorfQorCiB2b2lkIHFsY25pY19yZWxlYXNlX3R4X2J1ZmZlcnMoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBxbGNuaWNfY21kX2J1ZmZlciAqY21kX2J1ZjsKQEAgLTE4MSw3ICsyMDgsOSBAQAogCiAJdHhfcmluZyA9IGFkYXB0ZXItPnR4X3Jpbmc7CiAJdmZyZWUodHhfcmluZy0+Y21kX2J1Zl9hcnIpOworCXR4X3JpbmctPmNtZF9idWZfYXJyID0gTlVMTDsKIAlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKKwlhZGFwdGVyLT50eF9yaW5nID0gTlVMTDsKIH0KIAogaW50IHFsY25pY19hbGxvY19zd19yZXNvdXJjZXMoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQpAQCAtMjY0LDcgKzI5Myw2IEBACiAJCQlsaXN0X2FkZF90YWlsKCZyeF9idWYtPmxpc3QsCiAJCQkJCSZyZHNfcmluZy0+ZnJlZV9saXN0KTsKIAkJCXJ4X2J1Zi0+cmVmX2hhbmRsZSA9IGk7Ci0JCQlyeF9idWYtPnN0YXRlID0gUUxDTklDX0JVRkZFUl9GUkVFOwogCQkJcnhfYnVmKys7CiAJCX0KIAkJc3Bpbl9sb2NrX2luaXQoJnJkc19yaW5nLT5sb2NrKTsKQEAgLTQxMyw3ICs0NDEsNyBAQAogCiAJLyogcmVzZXRhbGwgKi8KIAlxbGNuaWNfcm9tX2xvY2soYWRhcHRlcik7Ci0JUUxDV1IzMihhZGFwdGVyLCBRTENOSUNfUk9NVVNCX0dMQl9TV19SRVNFVCwgMHhmZmZmZmZmZik7CisJUUxDV1IzMihhZGFwdGVyLCBRTENOSUNfUk9NVVNCX0dMQl9TV19SRVNFVCwgMHhmZWZmZmZmZik7CiAJcWxjbmljX3JvbV91bmxvY2soYWRhcHRlcik7CiAKIAlpZiAocWxjbmljX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgMCwgJm4pICE9IDAgfHwgKG4gIT0gMHhjYWZlY2FmZSkgfHwKQEAgLTUyMSwxNiArNTQ5LDEzIEBACiAJdTMyIHZhbDsKIAogCXZhbCA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0NSQl9ERVZfUEFSVElUSU9OX0lORk8pOwotCXZhbCA9ICh2YWwgPj4gKGFkYXB0ZXItPnBvcnRudW0gKiA0KSkgJiAweGY7Ci0KLQlpZiAoKHZhbCAmIDB4MykgIT0gMSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJOb3QgYW4gRXRoZXJuZXQgTklDIGZ1bmM9JXVcbiIsCi0JCQkJCQkJCQl2YWwpOworCXZhbCA9IFFMQ19ERVZfR0VUX0RSVih2YWwsIGFkYXB0ZXItPnBvcnRudW0pOworCWlmICgodmFsICYgMHgzKSAhPSBRTENOSUNfVFlQRV9OSUMpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIk5vdCBhbiBFdGhlcm5ldCBOSUMgZnVuYz0ldVxuIiwgdmFsKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCiAJYWRhcHRlci0+cGh5c2ljYWxfcG9ydCA9ICh2YWwgPj4gMik7Ci0KIAlpZiAocWxjbmljX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgUUxDTklDX1JPTV9ERVZfSU5JVF9USU1FT1VULCAmdGltZW8pKQogCQl0aW1lbyA9IDMwOwogCkBAIC01NDQsMTYgKzU2OSwzNCBAQAogCXJldHVybiAwOwogfQogCitpbnQKK3FsY25pY19jaGVja19mbGFzaF9md192ZXIoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2ZXIgPSAtMSwgbWluX3ZlcjsKKworCXFsY25pY19yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIFFMQ05JQ19GV19WRVJTSU9OX09GRlNFVCwgKGludCAqKSZ2ZXIpOworCisJdmVyID0gUUxDTklDX0RFQ09ERV9WRVJTSU9OKHZlcik7CisJbWluX3ZlciA9IFFMQ05JQ19NSU5fRldfVkVSU0lPTjsKKworCWlmICh2ZXIgPCBtaW5fdmVyKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJmaXJtd2FyZSB2ZXJzaW9uICVkLiVkLiVkIHVuc3VwcG9ydGVkLiIKKwkJCSJNaW4gc3VwcG9ydGVkIHZlcnNpb24gJWQuJWQuJWRcbiIsCisJCQlfbWFqb3IodmVyKSwgX21pbm9yKHZlciksIF9idWlsZCh2ZXIpLAorCQkJX21ham9yKG1pbl92ZXIpLCBfbWlub3IobWluX3ZlciksIF9idWlsZChtaW5fdmVyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBxbGNuaWNfaGFzX21uKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQl1MzIgY2FwYWJpbGl0eSwgZmxhc2hlZF92ZXI7CisJdTMyIGNhcGFiaWxpdHk7CiAJY2FwYWJpbGl0eSA9IDA7CiAKLQlxbGNuaWNfcm9tX2Zhc3RfcmVhZChhZGFwdGVyLAotCQkJUUxDTklDX0ZXX1ZFUlNJT05fT0ZGU0VULCAoaW50ICopJmZsYXNoZWRfdmVyKTsKLQlmbGFzaGVkX3ZlciA9IFFMQ05JQ19ERUNPREVfVkVSU0lPTihmbGFzaGVkX3Zlcik7Ci0KIAljYXBhYmlsaXR5ID0gUUxDUkQzMihhZGFwdGVyLCBRTENOSUNfUEVHX1RVTkVfQ0FQQUJJTElUWSk7CiAJaWYgKGNhcGFiaWxpdHkgJiBRTENOSUNfUEVHX1RVTkVfTU5fUFJFU0VOVCkKIAkJcmV0dXJuIDE7CkBAIC0xMDA3LDcgKzEwNTAsNyBAQAogcWxjbmljX3ZhbGlkYXRlX2Zpcm13YXJlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlfX2xlMzIgdmFsOwotCXUzMiB2ZXIsIG1pbl92ZXIsIGJpb3MsIG1pbl9zaXplOworCXUzMiB2ZXIsIGJpb3MsIG1pbl9zaXplOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gYWRhcHRlci0+Znc7CiAJdTggZndfdHlwZSA9IGFkYXB0ZXItPmZ3X3R5cGU7CkBAIC0xMDI5LDEyICsxMDcyLDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2YWwgPSBxbGNuaWNfZ2V0X2Z3X3ZlcnNpb24oYWRhcHRlcik7Ci0KLQltaW5fdmVyID0gUUxDTklDX1ZFUlNJT05fQ09ERSg0LCAwLCAyMTYpOwotCiAJdmVyID0gUUxDTklDX0RFQ09ERV9WRVJTSU9OKHZhbCk7CiAKLQlpZiAoKF9tYWpvcih2ZXIpID4gX1FMQ05JQ19MSU5VWF9NQUpPUikgfHwgKHZlciA8IG1pbl92ZXIpKSB7CisJaWYgKHZlciA8IFFMQ05JQ19NSU5fRldfVkVSU0lPTikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIiVzOiBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkLiVkIHVuc3VwcG9ydGVkXG4iLAogCQlmd19uYW1lW2Z3X3R5cGVdLCBfbWFqb3IodmVyKSwgX21pbm9yKHZlciksIF9idWlsZCh2ZXIpKTsKQEAgLTExMjIsNyArMTE2Miw3IEBACiAJYWRhcHRlci0+ZncgPSBOVUxMOwogfQogCi1pbnQgcWxjbmljX3BoYW50b21faW5pdChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgaW50IHFsY25pY19jbWRfcGVnX3JlYWR5KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MzIgdmFsOwogCWludCByZXRyaWVzID0gNjA7CkBAIC0xMTQ3LDcgKzExODcsOCBAQAogCVFMQ1dSMzIoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSwgUEhBTl9JTklUSUFMSVpFX0ZBSUxFRCk7CiAKIG91dF9lcnI6Ci0JZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiZmlybXdhcmUgaW5pdCBmYWlsZWRcbiIpOworCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNvbW1hbmQgUGVnIGluaXRpYWxpemF0aW9uIG5vdCAiCisJCSAgICAgICJjb21wbGV0ZSwgc3RhdGU6IDB4JXguXG4iLCB2YWwpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0xMTgwLDYgKzEyMjEsMTAgQEAKIHsKIAlpbnQgZXJyOwogCisJZXJyID0gcWxjbmljX2NtZF9wZWdfcmVhZHkoYWRhcHRlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWVyciA9IHFsY25pY19yZWNlaXZlX3BlZ19yZWFkeShhZGFwdGVyKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMTI2NSwxNCArMTMxMCwxMiBAQAogCWRtYV9hZGRyX3QgZG1hOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAotCWJ1ZmZlci0+c2tiID0gZGV2X2FsbG9jX3NrYihyZHNfcmluZy0+c2tiX3NpemUpOwotCWlmICghYnVmZmVyLT5za2IpIHsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJkc19yaW5nLT5za2Jfc2l6ZSk7CisJaWYgKCFza2IpIHsKIAkJYWRhcHRlci0+c3RhdHMuc2tiX2FsbG9jX2ZhaWx1cmUrKzsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc2tiID0gYnVmZmVyLT5za2I7Ci0KIAlza2JfcmVzZXJ2ZShza2IsIDIpOwogCiAJZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLApAQCAtMTI4MSwxMyArMTMyNCwxMSBAQAogCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocGRldiwgZG1hKSkgewogCQlhZGFwdGVyLT5zdGF0cy5yeF9kbWFfbWFwX2Vycm9yKys7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCWJ1ZmZlci0+c2tiID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJYnVmZmVyLT5za2IgPSBza2I7CiAJYnVmZmVyLT5kbWEgPSBkbWE7Ci0JYnVmZmVyLT5zdGF0ZSA9IFFMQ05JQ19CVUZGRVJfQlVTWTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMwMCwxNCArMTM0MSwxNSBAQAogCiAJYnVmZmVyID0gJnJkc19yaW5nLT5yeF9idWZfYXJyW2luZGV4XTsKIAorCWlmICh1bmxpa2VseShidWZmZXItPnNrYiA9PSBOVUxMKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAlwY2lfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsIGJ1ZmZlci0+ZG1hLCByZHNfcmluZy0+ZG1hX3NpemUsCiAJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJc2tiID0gYnVmZmVyLT5za2I7Ci0JaWYgKCFza2IpIHsKLQkJYWRhcHRlci0+c3RhdHMubnVsbF9za2IrKzsKLQkJZ290byBub19za2I7Ci0JfQogCiAJaWYgKGxpa2VseShhZGFwdGVyLT5yeF9jc3VtICYmIGNrc3VtID09IFNUQVRVU19DS1NVTV9PSykpIHsKIAkJYWRhcHRlci0+c3RhdHMuY3N1bW1lZCsrOwpAQCAtMTMxOSw4ICsxMzYxLDcgQEAKIAlza2ItPmRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAogCWJ1ZmZlci0+c2tiID0gTlVMTDsKLW5vX3NrYjoKLQlidWZmZXItPnN0YXRlID0gUUxDTklDX0JVRkZFUl9GUkVFOworCiAJcmV0dXJuIHNrYjsKIH0KIApAQCAtMTQ5NSw3ICsxNTM2LDcgQEAKIAogCQlXQVJOX09OKGRlc2NfY250ID4gMSk7CiAKLQkJaWYgKHJ4YnVmKQorCQlpZiAobGlrZWx5KHJ4YnVmKSkKIAkJCWxpc3RfYWRkX3RhaWwoJnJ4YnVmLT5saXN0LCAmc2RzX3JpbmctPmZyZWVfbGlzdFtyaW5nXSk7CiAJCWVsc2UKIAkJCWFkYXB0ZXItPnN0YXRzLm51bGxfcnhidWYrKzsKQEAgLTE3MDEsMyArMTc0MiwyNCBAQAogCXNkc19yaW5nLT5jb25zdW1lciA9IGNvbnN1bWVyOwogCXdyaXRlbChjb25zdW1lciwgc2RzX3JpbmctPmNyYl9zdHNfY29uc3VtZXIpOwogfQorCit2b2lkCitxbGNuaWNfZmV0Y2hfbWFjKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTMyIG9mZjEsIHUzMiBvZmYyLAorCQkJdTggYWx0X21hYywgdTggKm1hYykKK3sKKwl1MzIgbWFjX2xvdywgbWFjX2hpZ2g7CisJaW50IGk7CisKKwltYWNfbG93ID0gUUxDUkQzMihhZGFwdGVyLCBvZmYxKTsKKwltYWNfaGlnaCA9IFFMQ1JEMzIoYWRhcHRlciwgb2ZmMik7CisKKwlpZiAoYWx0X21hYykgeworCQltYWNfbG93IHw9IChtYWNfbG93ID4+IDE2KSB8IChtYWNfaGlnaCA8PCAxNik7CisJCW1hY19oaWdoID4+PSAxNjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQltYWNbaV0gPSAodTgpKG1hY19oaWdoID4+ICgoMSAtIGkpICogOCkpOworCWZvciAoaSA9IDI7IGkgPCA2OyBpKyspCisJCW1hY1tpXSA9ICh1OCkobWFjX2xvdyA+PiAoKDUgLSBpKSAqIDgpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMKaW5kZXggMjNlYTljYS4uYjk2MTViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19tYWluLmMKQEAgLTM0LDE1ICszNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZXIuaD4KIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgMTAgR2JFIENvbnZlcmdlZCBFdGhlcm5ldCBEcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIDEvMTAgR2JFIENvbnZlcmdlZC9JbnRlbGxpZ2VudCBFdGhlcm5ldCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKFFMQ05JQ19MSU5VWF9WRVJTSU9OSUQpOwogTU9EVUxFX0ZJUk1XQVJFKFFMQ05JQ19VTklGSUVEX1JPTUlNQUdFX05BTUUpOwogCiBjaGFyIHFsY25pY19kcml2ZXJfbmFtZVtdID0gInFsY25pYyI7Ci1zdGF0aWMgY29uc3QgY2hhciBxbGNuaWNfZHJpdmVyX3N0cmluZ1tdID0gIlFMb2dpYyBDb252ZXJnZWQgRXRoZXJuZXQgRHJpdmVyIHYiCi0gICAgUUxDTklDX0xJTlVYX1ZFUlNJT05JRDsKK3N0YXRpYyBjb25zdCBjaGFyIHFsY25pY19kcml2ZXJfc3RyaW5nW10gPSAiUUxvZ2ljIDEvMTAgR2JFICIKKwkiQ29udmVyZ2VkL0ludGVsbGlnZW50IEV0aGVybmV0IERyaXZlciB2IiBRTENOSUNfTElOVVhfVkVSU0lPTklEOwogCiBzdGF0aWMgaW50IHBvcnRfbW9kZSA9IFFMQ05JQ19QT1JUX01PREVfQVVUT19ORUc7CiAKQEAgLTY1LDEzICs2NiwxNiBAQAogbW9kdWxlX3BhcmFtKGxvYWRfZndfZmlsZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobG9hZF9md19maWxlLCAiTG9hZCBmaXJtd2FyZSBmcm9tICgwPWZsYXNoLCAxPWZpbGUiKTsKIAorc3RhdGljIGludCBxbGNuaWNfY29uZmlnX25wYXJzOworbW9kdWxlX3BhcmFtKHFsY25pY19jb25maWdfbnBhcnMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHFsY25pY19jb25maWdfbnBhcnMsICJDb25maWd1cmUgTlBBUnMgKDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZCIpOworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBxbGNuaWNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogc3RhdGljIHZvaWQgX19kZXZleGl0IHFsY25pY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogc3RhdGljIGludCBxbGNuaWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHN0YXRpYyBpbnQgcWxjbmljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIHZvaWQgcWxjbmljX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1zdGF0aWMgdm9pZCBxbGNuaWNfdHhfdGltZW91dF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBxbGNuaWNfYXR0YWNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIHFsY25pY19md2luaXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgcWxjbmljX2Z3X3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpAQCAtNzksNiArODMsNyBAQAogCQl3b3JrX2Z1bmNfdCBmdW5jLCBpbnQgZGVsYXkpOwogc3RhdGljIHZvaWQgcWxjbmljX2NhbmNlbF9md193b3JrKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaW50IHFsY25pY19wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCk7CitzdGF0aWMgaW50IHFsY25pY19yeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCk7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHFsY25pY19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAjZW5kaWYKQEAgLTk5LDcgKzEwNCwxMiBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnFsY25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBzdGF0aWMgdm9pZCBxbGNuaWNfY29uZmlnX2luZGV2X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IHFsY25pY19zdGFydF9maXJtd2FyZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKik7CiAKK3N0YXRpYyB2b2lkIHFsY25pY19kZXZfc2V0X25wYXJfcmVhZHkoc3RydWN0IHFsY25pY19hZGFwdGVyICopOworc3RhdGljIGludCBxbGNuaWN2Zl9jb25maWdfbGVkKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1MzIsIHUzMik7CitzdGF0aWMgaW50IHFsY25pY3ZmX2NvbmZpZ19icmlkZ2VkX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICosIHUzMik7CitzdGF0aWMgaW50IHFsY25pY3ZmX3N0YXJ0X2Zpcm13YXJlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIC8qICBQQ0kgRGV2aWNlIElEIFRhYmxlICAqLwogI2RlZmluZSBFTlRSWShkZXZpY2UpIFwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgKGRldmljZSkpLCBcCkBAIC0xMjAsMTIgKzEzMCw2IEBACiAJCXN0cnVjdCBxbGNuaWNfaG9zdF90eF9yaW5nICp0eF9yaW5nKQogewogCXdyaXRlbCh0eF9yaW5nLT5wcm9kdWNlciwgdHhfcmluZy0+Y3JiX2NtZF9wcm9kdWNlcik7Ci0KLQlpZiAocWxjbmljX3R4X2F2YWlsKHR4X3JpbmcpIDw9IFRYX1NUT1BfVEhSRVNIKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKLQkJc21wX21iKCk7Ci0JCWFkYXB0ZXItPnN0YXRzLnhtaXRfb2ZmKys7Ci0JfQogfQogCiBzdGF0aWMgY29uc3QgdTMyIG1zaV90Z3Rfc3RhdHVzWzhdID0gewpAQCAtMTg0LDggKzE4OCwxMyBAQAogCiAJZm9yIChyaW5nID0gMDsgcmluZyA8IGFkYXB0ZXItPm1heF9zZHNfcmluZ3M7IHJpbmcrKykgewogCQlzZHNfcmluZyA9ICZyZWN2X2N0eC0+c2RzX3JpbmdzW3JpbmddOwotCQluZXRpZl9uYXBpX2FkZChuZXRkZXYsICZzZHNfcmluZy0+bmFwaSwKLQkJCQlxbGNuaWNfcG9sbCwgUUxDTklDX05FVERFVl9XRUlHSFQpOworCisJCWlmIChyaW5nID09IGFkYXB0ZXItPm1heF9zZHNfcmluZ3MgLSAxKQorCQkJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmc2RzX3JpbmctPm5hcGksIHFsY25pY19wb2xsLAorCQkJCVFMQ05JQ19ORVRERVZfV0VJR0hUL2FkYXB0ZXItPm1heF9zZHNfcmluZ3MpOworCQllbHNlCisJCQluZXRpZl9uYXBpX2FkZChuZXRkZXYsICZzZHNfcmluZy0+bmFwaSwKKwkJCQlxbGNuaWNfcnhfcG9sbCwgUUxDTklDX05FVERFVl9XRUlHSFQqMik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMDcsMTkgKzMxNiwxNCBAQAogc3RhdGljIGludAogcWxjbmljX3JlYWRfbWFjX2FkZHIoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQogewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JdTY0IG1hY19hZGRyOworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAotCWlmIChxbGNuaWNfZ2V0X21hY19hZGRyKGFkYXB0ZXIsICZtYWNfYWRkcikgIT0gMCkKKwlpZiAoYWRhcHRlci0+bmljX29wcy0+Z2V0X21hY19hZGRyKGFkYXB0ZXIsIG1hY19hZGRyKSAhPSAwKQogCQlyZXR1cm4gLUVJTzsKIAotCXAgPSAodW5zaWduZWQgY2hhciAqKSZtYWNfYWRkcjsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQluZXRkZXYtPmRldl9hZGRyW2ldID0gKihwICsgNSAtIGkpOwotCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBuZXRkZXYtPmRldl9hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAltZW1jcHkoYWRhcHRlci0+bWFjX2FkZHIsIG5ldGRldi0+ZGV2X2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOwogCkBAIC0zNDAsNyArMzQ0LDcgQEAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCWlmICh0ZXN0X2JpdChfX1FMQ05JQ19ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSkpIHsKIAkJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwogCQlxbGNuaWNfbmFwaV9kaXNhYmxlKGFkYXB0ZXIpOwogCX0KQEAgLTM0OSw3ICszNTMsNyBAQAogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAlxbGNuaWNfc2V0X211bHRpKGFkYXB0ZXItPm5ldGRldik7CiAKLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJaWYgKHRlc3RfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKSkgewogCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CiAJCXFsY25pY19uYXBpX2VuYWJsZShhZGFwdGVyKTsKIAl9CkBAIC0zNzEsNiArMzc1LDIwIEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcWxjbmljX25pY190ZW1wbGF0ZSBxbGNuaWNfb3BzID0geworCS5nZXRfbWFjX2FkZHIgPSBxbGNuaWNfZ2V0X21hY19hZGRyZXNzLAorCS5jb25maWdfYnJpZGdlZF9tb2RlID0gcWxjbmljX2NvbmZpZ19icmlkZ2VkX21vZGUsCisJLmNvbmZpZ19sZWQgPSBxbGNuaWNfY29uZmlnX2xlZCwKKwkuc3RhcnRfZmlybXdhcmUgPSBxbGNuaWNfc3RhcnRfZmlybXdhcmUKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxjbmljX25pY190ZW1wbGF0ZSBxbGNuaWNfdmZfb3BzID0geworCS5nZXRfbWFjX2FkZHIgPSBxbGNuaWNfZ2V0X21hY19hZGRyZXNzLAorCS5jb25maWdfYnJpZGdlZF9tb2RlID0gcWxjbmljdmZfY29uZmlnX2JyaWRnZWRfbW9kZSwKKwkuY29uZmlnX2xlZCA9IHFsY25pY3ZmX2NvbmZpZ19sZWQsCisJLnN0YXJ0X2Zpcm13YXJlID0gcWxjbmljdmZfc3RhcnRfZmlybXdhcmUKK307CisKIHN0YXRpYyB2b2lkCiBxbGNuaWNfc2V0dXBfaW50cihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC00NTMsNiArNDcxLDE2OSBAQAogfQogCiBzdGF0aWMgaW50CitxbGNuaWNfaW5pdF9wY2lfaW5mbyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHFsY25pY19wY2lfaW5mbyBwY2lfaW5mb1tRTENOSUNfTUFYX1BDSV9GVU5DXTsKKwlpbnQgaSwgcmV0ID0gMCwgZXJyOworCXU4IHBmbjsKKworCWlmICghYWRhcHRlci0+bnBhcnMpCisJCWFkYXB0ZXItPm5wYXJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFsY25pY19ucGFyX2luZm8pICoKKwkJCQlRTENOSUNfTUFYX1BDSV9GVU5DLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPm5wYXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghYWRhcHRlci0+ZXN3aXRjaCkKKwkJYWRhcHRlci0+ZXN3aXRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGNuaWNfZXN3aXRjaCkgKgorCQkJCVFMQ05JQ19OSVVfTUFYX1hHX1BPUlRTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPmVzd2l0Y2gpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZXN3aXRjaDsKKwl9CisKKwlyZXQgPSBxbGNuaWNfZ2V0X3BjaV9pbmZvKGFkYXB0ZXIsIHBjaV9pbmZvKTsKKwlpZiAoIXJldCkgeworCQlmb3IgKGkgPSAwOyBpIDwgUUxDTklDX01BWF9QQ0lfRlVOQzsgaSsrKSB7CisJCQlwZm4gPSBwY2lfaW5mb1tpXS5pZDsKKwkJCWlmIChwZm4gPiBRTENOSUNfTUFYX1BDSV9GVU5DKQorCQkJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKwkJCWFkYXB0ZXItPm5wYXJzW3Bmbl0uYWN0aXZlID0gcGNpX2luZm9baV0uYWN0aXZlOworCQkJYWRhcHRlci0+bnBhcnNbcGZuXS50eXBlID0gcGNpX2luZm9baV0udHlwZTsKKwkJCWFkYXB0ZXItPm5wYXJzW3Bmbl0ucGh5X3BvcnQgPSBwY2lfaW5mb1tpXS5kZWZhdWx0X3BvcnQ7CisJCQlhZGFwdGVyLT5ucGFyc1twZm5dLm1hY19sZWFybmluZyA9IERFRkFVTFRfTUFDX0xFQVJOOworCQkJYWRhcHRlci0+bnBhcnNbcGZuXS5taW5fYncgPSBwY2lfaW5mb1tpXS50eF9taW5fYnc7CisJCQlhZGFwdGVyLT5ucGFyc1twZm5dLm1heF9idyA9IHBjaV9pbmZvW2ldLnR4X21heF9idzsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBRTENOSUNfTklVX01BWF9YR19QT1JUUzsgaSsrKQorCQkJYWRhcHRlci0+ZXN3aXRjaFtpXS5mbGFncyB8PSBRTENOSUNfU1dJVENIX0VOQUJMRTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCWtmcmVlKGFkYXB0ZXItPmVzd2l0Y2gpOworCWFkYXB0ZXItPmVzd2l0Y2ggPSBOVUxMOworZXJyX2Vzd2l0Y2g6CisJa2ZyZWUoYWRhcHRlci0+bnBhcnMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcWxjbmljX3NldF9mdW5jdGlvbl9tb2RlcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTggaWQ7CisJdTMyIHJlZl9jb3VudDsKKwlpbnQgaSwgcmV0ID0gMTsKKwl1MzIgZGF0YSA9IFFMQ05JQ19NR01UX0ZVTkM7CisJdm9pZCBfX2lvbWVtICpwcml2X29wID0gYWRhcHRlci0+YWh3LnBjaV9iYXNlMCArIFFMQ05JQ19EUlZfT1BfTU9ERTsKKworCS8qIElmIG90aGVyIGRyaXZlcnMgYXJlIG5vdCBpbiB1c2Ugc2V0IHRoZWlyIHByaXZpbGVnZSBsZXZlbCAqLworCXJlZl9jb3VudCA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0NSQl9ERVZfUkVGX0NPVU5UKTsKKwlyZXQgPSBxbGNuaWNfYXBpX2xvY2soYWRhcHRlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbG9jazsKKwlpZiAoUUxDX0RFVl9DTFJfUkVGX0NOVChyZWZfY291bnQsIGFkYXB0ZXItPmFody5wY2lfZnVuYykpCisJCWdvdG8gZXJyX25wYXI7CisKKwlpZiAocWxjbmljX2NvbmZpZ19ucGFycykgeworCQlmb3IgKGkgPSAwOyBpIDwgUUxDTklDX01BWF9QQ0lfRlVOQzsgaSsrKSB7CisJCQlpZCA9IGk7CisJCQlpZiAoYWRhcHRlci0+bnBhcnNbaV0udHlwZSAhPSBRTENOSUNfVFlQRV9OSUMgfHwKKwkJCQlpZCA9PSBhZGFwdGVyLT5haHcucGNpX2Z1bmMpCisJCQkJY29udGludWU7CisJCQlkYXRhIHw9IChxbGNuaWNfY29uZmlnX25wYXJzICYKKwkJCQkJUUxDX0RFVl9TRVRfRFJWKDB4ZiwgaWQpKTsKKwkJfQorCX0gZWxzZSB7CisJCWRhdGEgPSByZWFkbChwcml2X29wKTsKKwkJZGF0YSA9IChkYXRhICYgflFMQ19ERVZfU0VUX0RSVigweGYsIGFkYXB0ZXItPmFody5wY2lfZnVuYykpIHwKKwkJCShRTENfREVWX1NFVF9EUlYoUUxDTklDX01HTVRfRlVOQywKKwkJCWFkYXB0ZXItPmFody5wY2lfZnVuYykpOworCX0KKwl3cml0ZWwoZGF0YSwgcHJpdl9vcCk7CitlcnJfbnBhcjoKKwlxbGNuaWNfYXBpX3VubG9jayhhZGFwdGVyKTsKK2Vycl9sb2NrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIKK3FsY25pY19nZXRfZHJpdmVyX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCXZvaWQgX19pb21lbSAqbXNpeF9iYXNlX2FkZHI7CisJdm9pZCBfX2lvbWVtICpwcml2X29wOworCXN0cnVjdCBxbGNuaWNfaW5mbyBuaWNfaW5mbzsKKwl1MzIgZnVuYzsKKwl1MzIgbXNpeF9iYXNlOworCXUzMiBvcF9tb2RlLCBwcml2X2xldmVsOworCisJLyogRGV0ZXJtaW5lIEZXIEFQSSB2ZXJzaW9uICovCisJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24gPSByZWFkbChhZGFwdGVyLT5haHcucGNpX2Jhc2UwICsgUUxDTklDX0ZXX0FQSSk7CisKKwkvKiBGaW5kIFBDSSBmdW5jdGlvbiBudW1iZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwgUUxDTklDX01TSVhfVEFCTEVfT0ZGU0VULCAmZnVuYyk7CisJbXNpeF9iYXNlX2FkZHIgPSBhZGFwdGVyLT5haHcucGNpX2Jhc2UwICsgUUxDTklDX01TSVhfQkFTRTsKKwltc2l4X2Jhc2UgPSByZWFkbChtc2l4X2Jhc2VfYWRkcik7CisJZnVuYyA9IChmdW5jIC0gbXNpeF9iYXNlKS9RTENOSUNfTVNJWF9UQkxfUEdTSVpFOworCWFkYXB0ZXItPmFody5wY2lfZnVuYyA9IGZ1bmM7CisKKwlpZiAoIXFsY25pY19nZXRfbmljX2luZm8oYWRhcHRlciwgJm5pY19pbmZvLCBhZGFwdGVyLT5haHcucGNpX2Z1bmMpKSB7CisJCWFkYXB0ZXItPmNhcGFiaWxpdGllcyA9IG5pY19pbmZvLmNhcGFiaWxpdGllczsKKworCQlpZiAoYWRhcHRlci0+Y2FwYWJpbGl0aWVzICYgQklUXzYpCisJCQlhZGFwdGVyLT5mbGFncyB8PSBRTENOSUNfRVNXSVRDSF9FTkFCTEVEOworCQllbHNlCisJCQlhZGFwdGVyLT5mbGFncyAmPSB+UUxDTklDX0VTV0lUQ0hfRU5BQkxFRDsKKwl9CisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19FU1dJVENIX0VOQUJMRUQpKQl7CisJCWFkYXB0ZXItPm5pY19vcHMgPSAmcWxjbmljX29wczsKKwkJcmV0dXJuIGFkYXB0ZXItPmZ3X2hhbF92ZXJzaW9uOworCX0KKworCS8qIERldGVybWluZSBmdW5jdGlvbiBwcml2aWxlZ2UgbGV2ZWwgKi8KKwlwcml2X29wID0gYWRhcHRlci0+YWh3LnBjaV9iYXNlMCArIFFMQ05JQ19EUlZfT1BfTU9ERTsKKwlvcF9tb2RlID0gcmVhZGwocHJpdl9vcCk7CisJaWYgKG9wX21vZGUgPT0gUUxDX0RFVl9EUlZfREVGQVVMVCkKKwkJcHJpdl9sZXZlbCA9IFFMQ05JQ19NR01UX0ZVTkM7CisJZWxzZQorCQlwcml2X2xldmVsID0gUUxDX0RFVl9HRVRfRFJWKG9wX21vZGUsIGFkYXB0ZXItPmFody5wY2lfZnVuYyk7CisKKwlzd2l0Y2ggKHByaXZfbGV2ZWwpIHsKKwljYXNlIFFMQ05JQ19NR01UX0ZVTkM6CisJCWFkYXB0ZXItPm9wX21vZGUgPSBRTENOSUNfTUdNVF9GVU5DOworCQlhZGFwdGVyLT5uaWNfb3BzID0gJnFsY25pY19vcHM7CisJCXFsY25pY19pbml0X3BjaV9pbmZvKGFkYXB0ZXIpOworCQkvKiBTZXQgcHJpdmlsZWdlIGxldmVsIGZvciBvdGhlciBmdW5jdGlvbnMgKi8KKwkJcWxjbmljX3NldF9mdW5jdGlvbl9tb2RlcyhhZGFwdGVyKTsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJIQUwgVmVyc2lvbjogJWQsIE1hbmFnZW1lbnQgZnVuY3Rpb25cbiIsCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbik7CisJCWJyZWFrOworCWNhc2UgUUxDTklDX1BSSVZfRlVOQzoKKwkJYWRhcHRlci0+b3BfbW9kZSA9IFFMQ05JQ19QUklWX0ZVTkM7CisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiSEFMIFZlcnNpb246ICVkLCBQcml2aWxlZ2VkIGZ1bmN0aW9uXG4iLAorCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24pOworCQlhZGFwdGVyLT5uaWNfb3BzID0gJnFsY25pY19vcHM7CisJCWJyZWFrOworCWNhc2UgUUxDTklDX05PTl9QUklWX0ZVTkM6CisJCWFkYXB0ZXItPm9wX21vZGUgPSBRTENOSUNfTk9OX1BSSVZfRlVOQzsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJIQUwgVmVyc2lvbjogJWQgTm9uIFByaXZpbGVnZWQgZnVuY3Rpb25cbiIsCisJCQlhZGFwdGVyLT5md19oYWxfdmVyc2lvbik7CisJCWFkYXB0ZXItPm5pY19vcHMgPSAmcWxjbmljX3ZmX29wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlVua25vd24gZnVuY3Rpb24gbW9kZTogJWRcbiIsCisJCQlwcml2X2xldmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBhZGFwdGVyLT5md19oYWxfdmVyc2lvbjsKK30KKworc3RhdGljIGludAogcWxjbmljX3NldHVwX3BjaV9tYXAoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQogewogCXZvaWQgX19pb21lbSAqbWVtX3B0cjAgPSBOVUxMOwpAQCAtNDYwLDcgKzY0MSw2IEBACiAJdW5zaWduZWQgbG9uZyBtZW1fbGVuLCBwY2lfbGVuMCA9IDA7CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JaW50IHBjaV9mdW5jID0gYWRhcHRlci0+YWh3LnBjaV9mdW5jOwogCiAJLyogcmVtYXAgcGh5cyBhZGRyZXNzICovCiAJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CS8qIDAgaXMgZm9yIEJBUiAwICovCkBAIC00ODMsOCArNjYzLDEzIEBACiAJYWRhcHRlci0+YWh3LnBjaV9iYXNlMCA9IG1lbV9wdHIwOwogCWFkYXB0ZXItPmFody5wY2lfbGVuMCA9IHBjaV9sZW4wOwogCisJaWYgKCFxbGNuaWNfZ2V0X2RyaXZlcl9tb2RlKGFkYXB0ZXIpKSB7CisJCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMCk7CisJCXJldHVybiAtRUlPOworCX0KKwogCWFkYXB0ZXItPmFody5vY21fd2luX2NyYiA9IHFsY25pY19nZXRfaW9hZGRyKGFkYXB0ZXIsCi0JCVFMQ05JQ19QQ0lYX1BTX1JFRyhQQ0lYX09DTV9XSU5ET1dfUkVHKHBjaV9mdW5jKSkpOworCQlRTENOSUNfUENJWF9QU19SRUcoUENJWF9PQ01fV0lORE9XX1JFRyhhZGFwdGVyLT5haHcucGNpX2Z1bmMpKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwOSw3ICs2OTQsNyBAQAogCX0KIAogCWlmICghZm91bmQpCi0JCW5hbWUgPSAiVW5rbm93biI7CisJCXNwcmludGYobmFtZSwgIiVwTSBHaWdhYml0IEV0aGVybmV0IiwgYWRhcHRlci0+bWFjX2FkZHIpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTIxLDcgKzcwNiw3IEBACiAJaW50IGksIG9mZnNldCwgdmFsOwogCWludCAqcHRyMzI7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCisJc3RydWN0IHFsY25pY19pbmZvIG5pY19pbmZvOwogCWFkYXB0ZXItPmRyaXZlcl9taXNtYXRjaCA9IDA7CiAKIAlwdHIzMiA9IChpbnQgKikmc2VyaWFsX251bTsKQEAgLTU1Myw4ICs3MzgsNiBAQAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJmaXJtd2FyZSB2JWQuJWQuJWRcbiIsCiAJCQlmd19tYWpvciwgZndfbWlub3IsIGZ3X2J1aWxkKTsKIAotCWFkYXB0ZXItPmNhcGFiaWxpdGllcyA9IFFMQ1JEMzIoYWRhcHRlciwgQ1JCX0ZXX0NBUEFCSUxJVElFU18xKTsKLQogCWFkYXB0ZXItPmZsYWdzICY9IH5RTENOSUNfTFJPX0VOQUJMRUQ7CiAKIAlpZiAoYWRhcHRlci0+YWh3LnBvcnRfdHlwZSA9PSBRTENOSUNfWEdCRSkgewpAQCAtNTY1LDYgKzc0OCwxNiBAQAogCQlhZGFwdGVyLT5udW1fanVtYm9fcnhkID0gTUFYX0pVTUJPX1JDVl9ERVNDUklQVE9SU18xRzsKIAl9CiAKKwlpZiAoIXFsY25pY19nZXRfbmljX2luZm8oYWRhcHRlciwgJm5pY19pbmZvLCBhZGFwdGVyLT5haHcucGNpX2Z1bmMpKSB7CisJCWFkYXB0ZXItPnBoeXNpY2FsX3BvcnQgPSBuaWNfaW5mby5waHlzX3BvcnQ7CisJCWFkYXB0ZXItPnN3aXRjaF9tb2RlID0gbmljX2luZm8uc3dpdGNoX21vZGU7CisJCWFkYXB0ZXItPm1heF90eF9xdWVzID0gbmljX2luZm8ubWF4X3R4X3F1ZXM7CisJCWFkYXB0ZXItPm1heF9yeF9xdWVzID0gbmljX2luZm8ubWF4X3J4X3F1ZXM7CisJCWFkYXB0ZXItPmNhcGFiaWxpdGllcyA9IG5pY19pbmZvLmNhcGFiaWxpdGllczsKKwkJYWRhcHRlci0+bWF4X21hY19maWx0ZXJzID0gbmljX2luZm8ubWF4X21hY19maWx0ZXJzOworCQlhZGFwdGVyLT5tYXhfbXR1ID0gbmljX2luZm8ubWF4X210dTsKKwl9CisKIAlhZGFwdGVyLT5tc2l4X3N1cHBvcnRlZCA9ICEhdXNlX21zaV94OwogCWFkYXB0ZXItPnJzc19zdXBwb3J0ZWQgPSAhIXVzZV9tc2lfeDsKIApAQCAtNTc0LDYgKzc2Nyw1MCBAQAogfQogCiBzdGF0aWMgaW50CitxbGNuaWNfcmVzZXRfbnBhcl9jb25maWcoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCBlcnIgPSAwOworCXN0cnVjdCBxbGNuaWNfbnBhcl9pbmZvICpucGFyOworCXN0cnVjdCBxbGNuaWNfaW5mbyBuaWNfaW5mbzsKKworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkgfHwKKwkgICAgIWFkYXB0ZXItPm5lZWRfZndfcmVzZXQpCisJCXJldHVybiAwOworCisJaWYgKGFkYXB0ZXItPm9wX21vZGUgPT0gUUxDTklDX01HTVRfRlVOQykgeworCQkvKiBTZXQgdGhlIE5QQVIgY29uZmlnIGRhdGEgYWZ0ZXIgRlcgcmVzZXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IFFMQ05JQ19NQVhfUENJX0ZVTkM7IGkrKykgeworCQkJbnBhciA9ICZhZGFwdGVyLT5ucGFyc1tpXTsKKwkJCWlmIChucGFyLT50eXBlICE9IFFMQ05JQ19UWVBFX05JQykKKwkJCQljb250aW51ZTsKKwkJCWVyciA9IHFsY25pY19nZXRfbmljX2luZm8oYWRhcHRlciwgJm5pY19pbmZvLCBpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJfb3V0OworCQkJbmljX2luZm8ubWluX3R4X2J3ID0gbnBhci0+bWluX2J3OworCQkJbmljX2luZm8ubWF4X3R4X2J3ID0gbnBhci0+bWF4X2J3OworCQkJZXJyID0gcWxjbmljX3NldF9uaWNfaW5mbyhhZGFwdGVyLCAmbmljX2luZm8pOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycl9vdXQ7CisKKwkJCWlmIChucGFyLT5lbmFibGVfcG0pIHsKKwkJCQllcnIgPSBxbGNuaWNfY29uZmlnX3BvcnRfbWlycm9yaW5nKGFkYXB0ZXIsCisJCQkJCQlucGFyLT5kZXN0X25wYXIsIDEsIGkpOworCQkJCWlmIChlcnIpCisJCQkJCWdvdG8gZXJyX291dDsKKworCQkJfQorCQkJbnBhci0+bWFjX2xlYXJuaW5nID0gREVGQVVMVF9NQUNfTEVBUk47CisJCQlucGFyLT5ob3N0X3ZsYW5fdGFnID0gMDsKKwkJCW5wYXItPnByb21pc2NfbW9kZSA9IDA7CisJCQlucGFyLT5kaXNjYXJkX3RhZ2dlZCA9IDA7CisJCQlucGFyLT52bGFuX2lkID0gMDsKKwkJfQorCX0KK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAogcWxjbmljX3N0YXJ0X2Zpcm13YXJlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgdmFsLCBlcnIsIGZpcnN0X2Jvb3Q7CkBAIC01OTEsOCArODI4LDEyIEBACiAKIAlpZiAobG9hZF9md19maWxlKQogCQlxbGNuaWNfcmVxdWVzdF9maXJtd2FyZShhZGFwdGVyKTsKLQllbHNlCisJZWxzZSB7CisJCWlmIChxbGNuaWNfY2hlY2tfZmxhc2hfZndfdmVyKGFkYXB0ZXIpKQorCQkJZ290byBlcnJfb3V0OworCiAJCWFkYXB0ZXItPmZ3X3R5cGUgPSBRTENOSUNfRkxBU0hfUk9NSU1BR0U7CisJfQogCiAJZXJyID0gcWxjbmljX25lZWRfZndfcmVzZXQoYWRhcHRlcik7CiAJaWYgKGVyciA8IDApCkBAIC02MDIsNiArODQzLDcgQEAKIAogCWlmIChmaXJzdF9ib290ICE9IDB4NTU1NTU1NTUpIHsKIAkJUUxDV1IzMihhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFLCAwKTsKKwkJUUxDV1IzMihhZGFwdGVyLCBDUkJfUkNWUEVHX1NUQVRFLCAwKTsKIAkJcWxjbmljX3Bpbml0X2Zyb21fcm9tKGFkYXB0ZXIpOwogCQltc2xlZXAoMSk7CiAJfQpAQCAtNjI0LDcgKzg2Niw3IEBACiAKIHdhaXRfaW5pdDoKIAkvKiBIYW5kc2hha2Ugd2l0aCB0aGUgY2FyZCBiZWZvcmUgd2UgcmVnaXN0ZXIgdGhlIGRldmljZXMuICovCi0JZXJyID0gcWxjbmljX3BoYW50b21faW5pdChhZGFwdGVyKTsKKwllcnIgPSBxbGNuaWNfaW5pdF9maXJtd2FyZShhZGFwdGVyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXQ7CiAKQEAgLTYzMiw2ICs4NzQsOSBAQAogCXFsY25pY19pZGNfZGVidWdfaW5mbyhhZGFwdGVyLCAxKTsKIAogCXFsY25pY19jaGVja19vcHRpb25zKGFkYXB0ZXIpOworCWlmIChxbGNuaWNfcmVzZXRfbnBhcl9jb25maWcoYWRhcHRlcikpCisJCWdvdG8gZXJyX291dDsKKwlxbGNuaWNfZGV2X3NldF9ucGFyX3JlYWR5KGFkYXB0ZXIpOwogCiAJYWRhcHRlci0+bmVlZF9md19yZXNldCA9IDA7CiAKQEAgLTcxNiw5ICs5NjEsMjMgQEAKIHN0YXRpYyBpbnQKIF9fcWxjbmljX3VwKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKKwlpbnQgcmluZzsKKwlzdHJ1Y3QgcWxjbmljX2hvc3RfcmRzX3JpbmcgKnJkc19yaW5nOworCiAJaWYgKGFkYXB0ZXItPmlzX3VwICE9IFFMQ05JQ19BREFQVEVSX1VQX01BR0lDKQogCQlyZXR1cm4gLUVJTzsKIAorCWlmICh0ZXN0X2JpdChfX1FMQ05JQ19ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisJaWYgKHFsY25pY19md19jcmVhdGVfY3R4KGFkYXB0ZXIpKQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAocmluZyA9IDA7IHJpbmcgPCBhZGFwdGVyLT5tYXhfcmRzX3JpbmdzOyByaW5nKyspIHsKKwkJcmRzX3JpbmcgPSAmYWRhcHRlci0+cmVjdl9jdHgucmRzX3JpbmdzW3JpbmddOworCQlxbGNuaWNfcG9zdF9yeF9idWZmZXJzKGFkYXB0ZXIsIHJpbmcsIHJkc19yaW5nKTsKKwl9CisKIAlxbGNuaWNfc2V0X211bHRpKG5ldGRldik7CiAJcWxjbmljX2Z3X2NtZF9zZXRfbXR1KGFkYXB0ZXIsIG5ldGRldi0+bXR1KTsKIApAQCAtNzM2LDYgKzk5NSw3IEBACiAKIAlxbGNuaWNfbGlua2V2ZW50X3JlcXVlc3QoYWRhcHRlciwgMSk7CiAKKwlhZGFwdGVyLT5yZXNldF9jb250ZXh0ID0gMDsKIAlzZXRfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc3NSw2ICsxMDM1LDkgQEAKIAogCXFsY25pY19uYXBpX2Rpc2FibGUoYWRhcHRlcik7CiAKKwlxbGNuaWNfZndfZGVzdHJveV9jdHgoYWRhcHRlcik7CisKKwlxbGNuaWNfcmVzZXRfcnhfYnVmZmVyc19saXN0KGFkYXB0ZXIpOwogCXFsY25pY19yZWxlYXNlX3R4X2J1ZmZlcnMoYWRhcHRlcik7CiAJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4X2NsZWFuX2xvY2spOwogfQpAQCAtNzk2LDE2ICsxMDU5LDExIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JaW50IGVyciwgcmluZzsKLQlzdHJ1Y3QgcWxjbmljX2hvc3RfcmRzX3JpbmcgKnJkc19yaW5nOworCWludCBlcnI7CiAKIAlpZiAoYWRhcHRlci0+aXNfdXAgPT0gUUxDTklDX0FEQVBURVJfVVBfTUFHSUMpCiAJCXJldHVybiAwOwogCi0JZXJyID0gcWxjbmljX2luaXRfZmlybXdhcmUoYWRhcHRlcik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWVyciA9IHFsY25pY19uYXBpX2FkZChhZGFwdGVyLCBuZXRkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC04MTMsNyArMTA3MSw3IEBACiAJZXJyID0gcWxjbmljX2FsbG9jX3N3X3Jlc291cmNlcyhhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIGluIHNldHRpbmcgc3cgcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJfb3V0X25hcGlfZGVsOwogCX0KIAogCWVyciA9IHFsY25pY19hbGxvY19od19yZXNvdXJjZXMoYWRhcHRlcik7CkBAIC04MjIsMTYgKzEwODAsMTAgQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfc3c7CiAJfQogCi0KLQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgYWRhcHRlci0+bWF4X3Jkc19yaW5nczsgcmluZysrKSB7Ci0JCXJkc19yaW5nID0gJmFkYXB0ZXItPnJlY3ZfY3R4LnJkc19yaW5nc1tyaW5nXTsKLQkJcWxjbmljX3Bvc3RfcnhfYnVmZmVycyhhZGFwdGVyLCByaW5nLCByZHNfcmluZyk7Ci0JfQotCiAJZXJyID0gcWxjbmljX3JlcXVlc3RfaXJxKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGludGVycnVwdFxuIik7Ci0JCWdvdG8gZXJyX291dF9mcmVlX3J4YnVmOworCQlnb3RvIGVycl9vdXRfZnJlZV9odzsKIAl9CiAKIAlxbGNuaWNfaW5pdF9jb2FsZXNjZV9kZWZhdWx0cyhhZGFwdGVyKTsKQEAgLTg0MSwxMSArMTA5MywxMiBAQAogCWFkYXB0ZXItPmlzX3VwID0gUUxDTklDX0FEQVBURVJfVVBfTUFHSUM7CiAJcmV0dXJuIDA7CiAKLWVycl9vdXRfZnJlZV9yeGJ1ZjoKLQlxbGNuaWNfcmVsZWFzZV9yeF9idWZmZXJzKGFkYXB0ZXIpOworZXJyX291dF9mcmVlX2h3OgogCXFsY25pY19mcmVlX2h3X3Jlc291cmNlcyhhZGFwdGVyKTsKIGVycl9vdXRfZnJlZV9zdzoKIAlxbGNuaWNfZnJlZV9zd19yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfb3V0X25hcGlfZGVsOgorCXFsY25pY19uYXBpX2RlbChhZGFwdGVyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04ODAsNiArMTEzMyw4IEBACiAJCX0KIAl9CiAKKwlxbGNuaWNfZndfZGVzdHJveV9jdHgoYWRhcHRlcik7CisKIAlxbGNuaWNfZGV0YWNoKGFkYXB0ZXIpOwogCiAJYWRhcHRlci0+ZGlhZ190ZXN0ID0gMDsKQEAgLTg5OCw2ICsxMTUzLDcgQEAKIHsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBxbGNuaWNfaG9zdF9zZHNfcmluZyAqc2RzX3Jpbmc7CisJc3RydWN0IHFsY25pY19ob3N0X3Jkc19yaW5nICpyZHNfcmluZzsKIAlpbnQgcmluZzsKIAlpbnQgcmV0OwogCkBAIC05MTcsNiArMTE3MywxOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCXJldCA9IHFsY25pY19md19jcmVhdGVfY3R4KGFkYXB0ZXIpOworCWlmIChyZXQpIHsKKwkJcWxjbmljX2RldGFjaChhZGFwdGVyKTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAocmluZyA9IDA7IHJpbmcgPCBhZGFwdGVyLT5tYXhfcmRzX3JpbmdzOyByaW5nKyspIHsKKwkJcmRzX3JpbmcgPSAmYWRhcHRlci0+cmVjdl9jdHgucmRzX3JpbmdzW3JpbmddOworCQlxbGNuaWNfcG9zdF9yeF9idWZmZXJzKGFkYXB0ZXIsIHJpbmcsIHJkc19yaW5nKTsKKwl9CisKIAlpZiAoYWRhcHRlci0+ZGlhZ190ZXN0ID09IFFMQ05JQ19JTlRFUlJVUFRfVEVTVCkgewogCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgYWRhcHRlci0+bWF4X3Nkc19yaW5nczsgcmluZysrKSB7CiAJCQlzZHNfcmluZyA9ICZhZGFwdGVyLT5yZWN2X2N0eC5zZHNfcmluZ3NbcmluZ107CkBAIC05MjgsNiArMTE5NiwyNyBAQAogCXJldHVybiAwOwogfQogCisvKiBSZXNldCBjb250ZXh0IGluIGhhcmR3YXJlIG9ubHkgKi8KK3N0YXRpYyBpbnQKK3FsY25pY19yZXNldF9od19jb250ZXh0KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoX19RTENOSUNfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCisJcWxjbmljX2Rvd24oYWRhcHRlciwgbmV0ZGV2KTsKKworCXFsY25pY191cChhZGFwdGVyLCBuZXRkZXYpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCisJY2xlYXJfYml0KF9fUUxDTklDX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKwogaW50CiBxbGNuaWNfcmVzZXRfY29udGV4dChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC05NzEsMTggKzEyNjAsMjEgQEAKIAlhZGFwdGVyLT5tYXhfbWNfY291bnQgPSAzODsKIAogCW5ldGRldi0+bmV0ZGV2X29wcwkgICA9ICZxbGNuaWNfbmV0ZGV2X29wczsKLQluZXRkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IDIqSFo7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyAgICAgPSA1KkhaOwogCiAJcWxjbmljX2NoYW5nZV9tdHUobmV0ZGV2LCBuZXRkZXYtPm10dSk7CiAKIAlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmcWxjbmljX2V0aHRvb2xfb3BzKTsKIAotCW5ldGRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1RTTyk7Ci0JbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9HUk8pOwotCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSAoTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfVFNPKTsKKwluZXRkZXYtPmZlYXR1cmVzIHw9IChORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwKKwkJTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX0dSTyk7CisJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IChORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwKKwkJTkVUSUZfRl9JUFY2X0NTVU0pOwogCi0JbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX1RTTzYpOwotCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSAoTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX1RTTzYpOworCWlmIChhZGFwdGVyLT5jYXBhYmlsaXRpZXMgJiBRTENOSUNfRldfQ0FQQUJJTElUWV9UU08pIHsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYpOworCQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082KTsKKwl9CiAKIAlpZiAocGNpX3VzaW5nX2RhYykgewogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKQEAgLTk5Nyw4ICsxMjg5LDYgQEAKIAogCW5ldGRldi0+aXJxID0gYWRhcHRlci0+bXNpeF9lbnRyaWVzWzBdLnZlY3RvcjsKIAotCUlOSVRfV09SSygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrLCBxbGNuaWNfdHhfdGltZW91dF90YXNrKTsKLQogCWlmIChxbGNuaWNfcmVhZF9tYWNfYWRkcihhZGFwdGVyKSkKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWFkIG1hYyBhZGRyXG4iKTsKIApAQCAtMTAzNiw3ICsxMzI2LDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOwogCWludCBlcnI7Ci0JaW50IHBjaV9mdW5jX2lkID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOwogCXVpbnQ4X3QgcmV2aXNpb25faWQ7CiAJdWludDhfdCBwY2lfdXNpbmdfZGFjOwogCkBAIC0xMDU4LDYgKzEzNDcsNyBAQAogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OwogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKIAogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIpKTsKIAlpZiAoIW5ldGRldikgewpAQCAtMTA3Miw3ICsxMzYyLDYgQEAKIAlhZGFwdGVyLT5uZXRkZXYgID0gbmV0ZGV2OwogCWFkYXB0ZXItPnBkZXYgICAgPSBwZGV2OwogCWFkYXB0ZXItPmRldl9yc3RfdGltZSA9IGppZmZpZXM7Ci0JYWRhcHRlci0+YWh3LnBjaV9mdW5jICA9IHBjaV9mdW5jX2lkOwogCiAJcmV2aXNpb25faWQgPSBwZGV2LT5yZXZpc2lvbjsKIAlhZGFwdGVyLT5haHcucmV2aXNpb25faWQgPSByZXZpc2lvbl9pZDsKQEAgLTEwODgsNyArMTM3Nyw3IEBACiAJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKIAogCS8qIFRoaXMgd2lsbCBiZSByZXNldCBmb3IgbWV6eiBjYXJkcyAgKi8KLQlhZGFwdGVyLT5wb3J0bnVtID0gcGNpX2Z1bmNfaWQ7CisJYWRhcHRlci0+cG9ydG51bSA9IGFkYXB0ZXItPmFody5wY2lfZnVuYzsKIAogCWVyciA9IHFsY25pY19nZXRfYm9hcmRfaW5mbyhhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CkBAIC0xMTAyLDcgKzEzOTEsNyBAQAogCWlmIChxbGNuaWNfc2V0dXBfaWRjX3BhcmFtKGFkYXB0ZXIpKQogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAotCWVyciA9IHFsY25pY19zdGFydF9maXJtd2FyZShhZGFwdGVyKTsKKwllcnIgPSBhZGFwdGVyLT5uaWNfb3BzLT5zdGFydF9maXJtd2FyZShhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkxvYWRpbmcgZncgZmFpbGVkLlBsZWFzZSBSZWJvb3RcbiIpOwogCQlnb3RvIGVycl9vdXRfZGVjcl9yZWY7CkBAIC0xMTcxLDEwICsxNDYwLDEzIEBACiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCi0JY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrKTsKLQogCXFsY25pY19kZXRhY2goYWRhcHRlcik7CiAKKwlpZiAoYWRhcHRlci0+bnBhcnMgIT0gTlVMTCkKKwkJa2ZyZWUoYWRhcHRlci0+bnBhcnMpOworCWlmIChhZGFwdGVyLT5lc3dpdGNoICE9IE5VTEwpCisJCWtmcmVlKGFkYXB0ZXItPmVzd2l0Y2gpOworCiAJcWxjbmljX2Nscl9hbGxfZHJ2X3N0YXRlKGFkYXB0ZXIpOwogCiAJY2xlYXJfYml0KF9fUUxDTklDX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKQEAgLTExODcsNiArMTQ3OSw3IEBACiAKIAlxbGNuaWNfcmVsZWFzZV9maXJtd2FyZShhZGFwdGVyKTsKIAorCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKQEAgLTEyMDYsMTAgKzE0OTksNiBAQAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCXFsY25pY19kb3duKGFkYXB0ZXIsIG5ldGRldik7CiAKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOwotCi0JcWxjbmljX2RldGFjaChhZGFwdGVyKTsKLQogCXFsY25pY19jbHJfYWxsX2Rydl9zdGF0ZShhZGFwdGVyKTsKIAogCWNsZWFyX2JpdChfX1FMQ05JQ19SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CkBAIC0xMjYzLDM1ICsxNTUyLDIzIEBACiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAKLQllcnIgPSBxbGNuaWNfc3RhcnRfZmlybXdhcmUoYWRhcHRlcik7CisJZXJyID0gYWRhcHRlci0+bmljX29wcy0+c3RhcnRfZmlybXdhcmUoYWRhcHRlcik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc3RhcnQgZmlybXdhcmVcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJZXJyID0gcWxjbmljX2F0dGFjaChhZGFwdGVyKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dDsKLQogCQllcnIgPSBxbGNuaWNfdXAoYWRhcHRlciwgbmV0ZGV2KTsKIAkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9kZXRhY2g7Ci0KKwkJCWdvdG8gZG9uZTsKIAogCQlxbGNuaWNfY29uZmlnX2luZGV2X2FkZHIobmV0ZGV2LCBORVRERVZfVVApOwogCX0KLQorZG9uZToKIAluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CiAJcWxjbmljX3NjaGVkdWxlX3dvcmsoYWRhcHRlciwgcWxjbmljX2Z3X3BvbGxfd29yaywgRldfUE9MTF9ERUxBWSk7CiAJcmV0dXJuIDA7Ci0KLWVycl9vdXRfZGV0YWNoOgotCXFsY25pY19kZXRhY2goYWRhcHRlcik7Ci1lcnJfb3V0OgotCXFsY25pY19jbHJfYWxsX2Rydl9zdGF0ZShhZGFwdGVyKTsKLQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7Ci0JcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCkBAIC0xMzQwLDExICsxNjE3LDExIEBACiAJdTggb3Bjb2RlID0gVFhfRVRIRVJfUEtUOwogCV9fYmUxNiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CiAJdTE2IGZsYWdzID0gMCwgdmlkID0gMDsKLQl1MzIgcHJvZHVjZXI7CiAJaW50IGNvcGllZCwgb2Zmc2V0LCBjb3B5X2xlbiwgaGRyX2xlbiA9IDAsIHRzbyA9IDAsIHZsYW5fb29iID0gMDsKIAlzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmh3ZGVzYzsKIAlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZoOwogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHByb2R1Y2VyID0gdHhfcmluZy0+cHJvZHVjZXI7CiAKIAlpZiAocHJvdG9jb2wgPT0gY3B1X3RvX2JlMTYoRVRIX1BfODAyMVEpKSB7CiAKQEAgLTEzNjAsNiArMTYzNywxMSBAQAogCQl2bGFuX29vYiA9IDE7CiAJfQogCisJaWYgKCooc2tiLT5kYXRhKSAmIEJJVF8wKSB7CisJCWZsYWdzIHw9IEJJVF8wOworCQltZW1jcHkoJmZpcnN0X2Rlc2MtPmV0aF9hZGRyLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwl9CisKIAlpZiAoKG5ldGRldi0+ZmVhdHVyZXMgJiAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYpKSAmJgogCQkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA+IDApIHsKIApAQCAtMTQwOSw3ICsxNjkxLDYgQEAKIAkvKiBGb3IgTFNPLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIE1BQy9JUC9UQ1AgaGVhZGVycyBpbnRvCiAJICogdGhlIGRlc2NyaXB0b3IgcmluZwogCSAqLwotCXByb2R1Y2VyID0gdHhfcmluZy0+cHJvZHVjZXI7CiAJY29waWVkID0gMDsKIAlvZmZzZXQgPSAyOwogCkBAIC0xNTM3LDEwICsxODE4LDE1IEBACiAJLyogNCBmcmFnbWVudHMgcGVyIGNtZCBkZXMgKi8KIAlub19vZl9kZXNjID0gKGZyYWdfY291bnQgKyAzKSA+PiAyOwogCi0JaWYgKHVubGlrZWx5KG5vX29mX2Rlc2MgKyAyID4gcWxjbmljX3R4X2F2YWlsKHR4X3JpbmcpKSkgeworCWlmICh1bmxpa2VseShxbGNuaWNfdHhfYXZhaWwodHhfcmluZykgPD0gVFhfU1RPUF9USFJFU0gpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJYWRhcHRlci0+c3RhdHMueG1pdF9vZmYrKzsKLQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCQlzbXBfbWIoKTsKKwkJaWYgKHFsY25pY190eF9hdmFpbCh0eF9yaW5nKSA+IFRYX1NUT1BfVEhSRVNIKQorCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwkJZWxzZSB7CisJCQlhZGFwdGVyLT5zdGF0cy54bWl0X29mZisrOworCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCQl9CiAJfQogCiAJcHJvZHVjZXIgPSB0eF9yaW5nLT5wcm9kdWNlcjsKQEAgLTE2NzUsMzUgKzE5NjEsMTEgQEAKIAkJcmV0dXJuOwogCiAJZGV2X2VycigmbmV0ZGV2LT5kZXYsICJ0cmFuc21pdCB0aW1lb3V0LCByZXNldHRpbmcuXG4iKTsKLQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOwotfQotCi1zdGF0aWMgdm9pZCBxbGNuaWNfdHhfdGltZW91dF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsY25pY19hZGFwdGVyLCB0eF90aW1lb3V0X3Rhc2spOwotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KF9fUUxDTklDX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKLQkJcmV0dXJuOwogCiAJaWYgKCsrYWRhcHRlci0+dHhfdGltZW9fY250ID49IFFMQ05JQ19NQVhfVFhfVElNRU9VVFMpCi0JCWdvdG8gcmVxdWVzdF9yZXNldDsKLQotCWNsZWFyX2JpdChfX1FMQ05JQ19SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7Ci0JaWYgKCFxbGNuaWNfcmVzZXRfY29udGV4dChhZGFwdGVyKSkgewotCQlhZGFwdGVyLT5uZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJcmV0dXJuOwotCi0JCS8qIGNvbnRleHQgcmVzZXQgZmFpbGVkLCBmYWxsIHRocm91Z2ggZm9yIGZ3IHJlc2V0ICovCi0JfQotCi1yZXF1ZXN0X3Jlc2V0OgotCWFkYXB0ZXItPm5lZWRfZndfcmVzZXQgPSAxOwotCWNsZWFyX2JpdChfX1FMQ05JQ19SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7Ci0JUUxDREIoYWRhcHRlciwgRFJWLCAiUmVzZXR0aW5nIGFkYXB0ZXJcbiIpOworCQlhZGFwdGVyLT5uZWVkX2Z3X3Jlc2V0ID0gMTsKKwllbHNlCisJCWFkYXB0ZXItPnJlc2V0X2NvbnRleHQgPSAxOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnFsY25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKQEAgLTE4NDYsMTQgKzIxMDgsMTIgQEAKIAkJc21wX21iKCk7CiAKIAkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJCV9fbmV0aWZfdHhfbG9jayh0eF9yaW5nLT50eHEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCQlpZiAocWxjbmljX3R4X2F2YWlsKHR4X3JpbmcpID4gVFhfU1RPUF9USFJFU0gpIHsKIAkJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7Ci0JCQkJYWRhcHRlci0+dHhfdGltZW9fY250ID0gMDsKIAkJCQlhZGFwdGVyLT5zdGF0cy54bWl0X29uKys7CiAJCQl9Ci0JCQlfX25ldGlmX3R4X3VubG9jayh0eF9yaW5nLT50eHEpOwogCQl9CisJCWFkYXB0ZXItPnR4X3RpbWVvX2NudCA9IDA7CiAJfQogCS8qCiAJICogSWYgZXZlcnl0aGluZyBpcyBmcmVlZCB1cCB0byBjb25zdW1lciB0aGVuIGNoZWNrIGlmIHRoZSByaW5nIGlzIGZ1bGwKQEAgLTE4OTgsNiArMjE1OCwyNSBAQAogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKK3N0YXRpYyBpbnQgcWxjbmljX3J4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBxbGNuaWNfaG9zdF9zZHNfcmluZyAqc2RzX3JpbmcgPQorCQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IHFsY25pY19ob3N0X3Nkc19yaW5nLCBuYXBpKTsKKworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IHNkc19yaW5nLT5hZGFwdGVyOworCWludCB3b3JrX2RvbmU7CisKKwl3b3JrX2RvbmUgPSBxbGNuaWNfcHJvY2Vzc19yY3ZfcmluZyhzZHNfcmluZywgYnVkZ2V0KTsKKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZSgmc2RzX3JpbmctPm5hcGkpOworCQlpZiAodGVzdF9iaXQoX19RTENOSUNfREVWX1VQLCAmYWRhcHRlci0+c3RhdGUpKQorCQkJcWxjbmljX2VuYWJsZV9pbnQoc2RzX3JpbmcpOworCX0KKworCXJldHVybiB3b3JrX2RvbmU7Cit9CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgcWxjbmljX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewpAQCAtMjEwOSw3ICsyMzg4LDcgQEAKIHsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywKIAkJCXN0cnVjdCBxbGNuaWNfYWRhcHRlciwgZndfd29yay53b3JrKTsKLQl1MzIgZGV2X3N0YXRlID0gMHhmOworCXUzMiBkZXZfc3RhdGUgPSAweGYsIG5wYXJfc3RhdGU7CiAKIAlpZiAocWxjbmljX2FwaV9sb2NrKGFkYXB0ZXIpKQogCQlnb3RvIGVycl9yZXQ7CkBAIC0yMTIyLDYgKzI0MDEsMTkgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmIChhZGFwdGVyLT5vcF9tb2RlID09IFFMQ05JQ19OT05fUFJJVl9GVU5DKSB7CisJCW5wYXJfc3RhdGUgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19DUkJfREVWX05QQVJfU1RBVEUpOworCQlpZiAobnBhcl9zdGF0ZSA9PSBRTENOSUNfREVWX05QQVJfUkRZKSB7CisJCQlxbGNuaWNfYXBpX3VubG9jayhhZGFwdGVyKTsKKwkJCWdvdG8gd2FpdF9ucGFyOworCQl9IGVsc2UgeworCQkJcWxjbmljX3NjaGVkdWxlX3dvcmsoYWRhcHRlciwgcWxjbmljX2Z3aW5pdF93b3JrLAorCQkJCUZXX1BPTExfREVMQVkpOworCQkJcWxjbmljX2FwaV91bmxvY2soYWRhcHRlcik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKIAlpZiAoYWRhcHRlci0+Zndfd2FpdF9jbnQrKyA+IGFkYXB0ZXItPnJlc2V0X2Fja190aW1lbykgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJSZXNldDpGYWlsZWQgdG8gZ2V0IGFjayAlZCBzZWNcbiIsCiAJCQkJCWFkYXB0ZXItPnJlc2V0X2Fja190aW1lbyk7CkBAIC0yMTU0LDcgKzI0NDYsNyBAQAogCiAJCXFsY25pY19hcGlfdW5sb2NrKGFkYXB0ZXIpOwogCi0JCWlmICghcWxjbmljX3N0YXJ0X2Zpcm13YXJlKGFkYXB0ZXIpKSB7CisJCWlmICghYWRhcHRlci0+bmljX29wcy0+c3RhcnRfZmlybXdhcmUoYWRhcHRlcikpIHsKIAkJCXFsY25pY19zY2hlZHVsZV93b3JrKGFkYXB0ZXIsIHFsY25pY19hdHRhY2hfd29yaywgMCk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIxNjMsNiArMjQ1NSw3IEBACiAKIAlxbGNuaWNfYXBpX3VubG9jayhhZGFwdGVyKTsKIAord2FpdF9ucGFyOgogCWRldl9zdGF0ZSA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0NSQl9ERVZfU1RBVEUpOwogCVFMQ0RCKGFkYXB0ZXIsIEhXLCAiRnVuYyB3YWl0aW5nOiBEZXZpY2Ugc3RhdGU9JXVcbiIsIGRldl9zdGF0ZSk7CiAKQEAgLTIxNzcsNyArMjQ3MCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJaWYgKCFxbGNuaWNfc3RhcnRfZmlybXdhcmUoYWRhcHRlcikpIHsKKwkJaWYgKCFhZGFwdGVyLT5uaWNfb3BzLT5zdGFydF9maXJtd2FyZShhZGFwdGVyKSkgewogCQkJcWxjbmljX3NjaGVkdWxlX3dvcmsoYWRhcHRlciwgcWxjbmljX2F0dGFjaF93b3JrLCAwKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjIwMiwxMCArMjQ5NSw2IEBACiAKIAlxbGNuaWNfZG93bihhZGFwdGVyLCBuZXRkZXYpOwogCi0JcnRubF9sb2NrKCk7Ci0JcWxjbmljX2RldGFjaChhZGFwdGVyKTsKLQlydG5sX3VubG9jaygpOwotCiAJc3RhdHVzID0gUUxDUkQzMihhZGFwdGVyLCBRTENOSUNfUEVHX0hBTFRfU1RBVFVTMSk7CiAKIAlpZiAoc3RhdHVzICYgUUxDTklDX1JDT0RFX0ZBVEFMX0VSUk9SKQpAQCAtMjIzNyw2ICsyNTI2LDcgQEAKIHsKIAl1MzIgc3RhdGU7CiAKKwlhZGFwdGVyLT5uZWVkX2Z3X3Jlc2V0ID0gMTsKIAlpZiAocWxjbmljX2FwaV9sb2NrKGFkYXB0ZXIpKQogCQlyZXR1cm47CiAKQEAgLTIyNTEsMTAgKzI1NDEsMzYgQEAKIAlxbGNuaWNfYXBpX3VubG9jayhhZGFwdGVyKTsKIH0KIAorLyogVHJhbnNpdCB0byBOUEFSIFJFQURZIHN0YXRlIGZyb20gTlBBUiBOT1QgUkVBRFkgc3RhdGUgKi8KK3N0YXRpYyB2b2lkCitxbGNuaWNfZGV2X3NldF9ucGFyX3JlYWR5KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgc3RhdGU7CisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19FU1dJVENIX0VOQUJMRUQpIHx8CisJCWFkYXB0ZXItPm9wX21vZGUgPT0gUUxDTklDX05PTl9QUklWX0ZVTkMpCisJCXJldHVybjsKKwlpZiAocWxjbmljX2FwaV9sb2NrKGFkYXB0ZXIpKQorCQlyZXR1cm47CisKKwlzdGF0ZSA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0NSQl9ERVZfTlBBUl9TVEFURSk7CisKKwlpZiAoc3RhdGUgIT0gUUxDTklDX0RFVl9OUEFSX1JEWSkgeworCQlRTENXUjMyKGFkYXB0ZXIsIFFMQ05JQ19DUkJfREVWX05QQVJfU1RBVEUsCisJCQlRTENOSUNfREVWX05QQVJfUkRZKTsKKwkJUUxDREIoYWRhcHRlciwgRFJWLCAiTlBBUiBSRUFEWSBzdGF0ZSBzZXRcbiIpOworCX0KKworCXFsY25pY19hcGlfdW5sb2NrKGFkYXB0ZXIpOworfQorCiBzdGF0aWMgdm9pZAogcWxjbmljX3NjaGVkdWxlX3dvcmsoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLAogCQl3b3JrX2Z1bmNfdCBmdW5jLCBpbnQgZGVsYXkpCiB7CisJaWYgKHRlc3RfYml0KF9fUUxDTklDX0FFUiwgJmFkYXB0ZXItPnN0YXRlKSkKKwkJcmV0dXJuOworCiAJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmZ3X3dvcmssIGZ1bmMpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWRhcHRlci0+Zndfd29yaywgcm91bmRfamlmZmllc19yZWxhdGl2ZShkZWxheSkpOwogfQpAQCAtMjI3NCwxOSArMjU5MCwxMSBAQAogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLAogCQkJCXN0cnVjdCBxbGNuaWNfYWRhcHRlciwgZndfd29yay53b3JrKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCWludCBlcnI7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCWVyciA9IHFsY25pY19hdHRhY2goYWRhcHRlcik7Ci0JCWlmIChlcnIpCisJCWlmIChxbGNuaWNfdXAoYWRhcHRlciwgbmV0ZGV2KSkKIAkJCWdvdG8gZG9uZTsKIAotCQllcnIgPSBxbGNuaWNfdXAoYWRhcHRlciwgbmV0ZGV2KTsKLQkJaWYgKGVycikgewotCQkJcWxjbmljX2RldGFjaChhZGFwdGVyKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCiAJCXFsY25pY19jb25maWdfaW5kZXZfYWRkcihuZXRkZXYsIE5FVERFVl9VUCk7CiAJfQogCkBAIC0yMzIyLDYgKzI2MzAsMTMgQEAKIAkJYWRhcHRlci0+ZndfZmFpbF9jbnQgPSAwOwogCQlpZiAoYWRhcHRlci0+bmVlZF9md19yZXNldCkKIAkJCWdvdG8gZGV0YWNoOworCisJCWlmIChhZGFwdGVyLT5yZXNldF9jb250ZXh0ICYmCisJCSAgICBhdXRvX2Z3X3Jlc2V0ID09IEFVVE9fRldfUkVTRVRfRU5BQkxFRCkgeworCQkJcWxjbmljX3Jlc2V0X2h3X2NvbnRleHQoYWRhcHRlcik7CisJCQlhZGFwdGVyLT5uZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCiAJCXJldHVybiAwOwogCX0KIApAQCAtMjMzMCw3ICsyNjQ1LDggQEAKIAogCXFsY25pY19kZXZfcmVxdWVzdF9yZXNldChhZGFwdGVyKTsKIAotCWNsZWFyX2JpdChfX1FMQ05JQ19GV19BVFRBQ0hFRCwgJmFkYXB0ZXItPnN0YXRlKTsKKwlpZiAoKGF1dG9fZndfcmVzZXQgPT0gQVVUT19GV19SRVNFVF9FTkFCTEVEKSkKKwkJY2xlYXJfYml0KF9fUUxDTklDX0ZXX0FUVEFDSEVELCAmYWRhcHRlci0+c3RhdGUpOwogCiAJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiZmlybXdhcmUgaGFuZyBkZXRlY3RlZFxuIik7CiAKQEAgLTIzNjUsNiArMjY4MSwxNjEgQEAKIAlxbGNuaWNfc2NoZWR1bGVfd29yayhhZGFwdGVyLCBxbGNuaWNfZndfcG9sbF93b3JrLCBGV19QT0xMX0RFTEFZKTsKIH0KIAorc3RhdGljIGludCBxbGNuaWNfaXNfZmlyc3RfZnVuYyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqb3RoX3BkZXY7CisJaW50IHZhbCA9IHBkZXYtPmRldmZuOworCisJd2hpbGUgKHZhbC0tID4gMCkgeworCQlvdGhfcGRldiA9IHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdChwY2lfZG9tYWluX25yCisJCQkocGRldi0+YnVzKSwgcGRldi0+YnVzLT5udW1iZXIsCisJCQlQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCB2YWwpKTsKKwkJaWYgKCFvdGhfcGRldikKKwkJCWNvbnRpbnVlOworCisJCWlmIChvdGhfcGRldi0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDNjb2xkKSB7CisJCQlwY2lfZGV2X3B1dChvdGhfcGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwY2lfZGV2X3B1dChvdGhfcGRldik7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHFsY25pY19hdHRhY2hfZnVuYyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgZXJyLCBmaXJzdF9mdW5jOworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJcGRldi0+ZXJyb3Jfc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19ub3JtYWw7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJZmlyc3RfZnVuYyA9IHFsY25pY19pc19maXJzdF9mdW5jKHBkZXYpOworCisJaWYgKHFsY25pY19hcGlfbG9jayhhZGFwdGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmlyc3RfZnVuYykgeworCQlhZGFwdGVyLT5uZWVkX2Z3X3Jlc2V0ID0gMTsKKwkJc2V0X2JpdChfX1FMQ05JQ19TVEFSVF9GVywgJmFkYXB0ZXItPnN0YXRlKTsKKwkJUUxDV1IzMihhZGFwdGVyLCBRTENOSUNfQ1JCX0RFVl9TVEFURSwgUUxDTklDX0RFVl9JTklUSUFMSVpJTkcpOworCQlRTENEQihhZGFwdGVyLCBEUlYsICJSZXN0YXJ0aW5nIGZ3XG4iKTsKKwl9CisJcWxjbmljX2FwaV91bmxvY2soYWRhcHRlcik7CisKKwllcnIgPSBhZGFwdGVyLT5uaWNfb3BzLT5zdGFydF9maXJtd2FyZShhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcWxjbmljX2Nscl9kcnZfc3RhdGUoYWRhcHRlcik7CisJcWxjbmljX3NldHVwX2ludHIoYWRhcHRlcik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWVyciA9IHFsY25pY19hdHRhY2goYWRhcHRlcik7CisJCWlmIChlcnIpIHsKKwkJCXFsY25pY19jbHJfYWxsX2Rydl9zdGF0ZShhZGFwdGVyKTsKKwkJCWNsZWFyX2JpdChfX1FMQ05JQ19BRVIsICZhZGFwdGVyLT5zdGF0ZSk7CisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJZXJyID0gcWxjbmljX3VwKGFkYXB0ZXIsIG5ldGRldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGRvbmU7CisKKwkJcWxjbmljX2NvbmZpZ19pbmRldl9hZGRyKG5ldGRldiwgTkVUREVWX1VQKTsKKwl9CisgZG9uZToKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcWxjbmljX2lvX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkJcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpCisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCisJaWYgKHN0YXRlID09IHBjaV9jaGFubmVsX2lvX25vcm1hbCkKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKKworCXNldF9iaXQoX19RTENOSUNfQUVSLCAmYWRhcHRlci0+c3RhdGUpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWRhcHRlci0+Zndfd29yayk7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlxbGNuaWNfZG93bihhZGFwdGVyLCBuZXRkZXYpOworCisJcWxjbmljX2RldGFjaChhZGFwdGVyKTsKKwlxbGNuaWNfdGVhcmRvd25faW50cihhZGFwdGVyKTsKKworCWNsZWFyX2JpdChfX1FMQ05JQ19SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKK30KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcWxjbmljX2lvX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIHFsY25pY19hdHRhY2hfZnVuYyhwZGV2KSA/IFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QgOgorCQkJCVBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKK30KKworc3RhdGljIHZvaWQgcWxjbmljX2lvX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyhwZGV2KTsKKworCWlmIChRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19DUkJfREVWX1NUQVRFKSA9PSBRTENOSUNfREVWX1JFQURZICYmCisJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChfX1FMQ05JQ19BRVIsICZhZGFwdGVyLT5zdGF0ZSkpCisJCXFsY25pY19zY2hlZHVsZV93b3JrKGFkYXB0ZXIsIHFsY25pY19md19wb2xsX3dvcmssCisJCQkJCQlGV19QT0xMX0RFTEFZKTsKK30KKworCitzdGF0aWMgaW50CitxbGNuaWN2Zl9zdGFydF9maXJtd2FyZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGVycjsKKworCWVyciA9IHFsY25pY19jYW5fc3RhcnRfZmlybXdhcmUoYWRhcHRlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXFsY25pY19jaGVja19vcHRpb25zKGFkYXB0ZXIpOworCisJYWRhcHRlci0+bmVlZF9md19yZXNldCA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitxbGNuaWN2Zl9jb25maWdfYnJpZGdlZF9tb2RlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTMyIGVuYWJsZSkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQKK3FsY25pY3ZmX2NvbmZpZ19sZWQoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1MzIgc3RhdGUsIHUzMiByYXRlKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogc3RhdGljIHNzaXplX3QKIHFsY25pY19zdG9yZV9icmlkZ2VkX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQpAQCAtMjM3NiwxMyArMjg0NywxMyBAQAogCWlmICghKGFkYXB0ZXItPmNhcGFiaWxpdGllcyAmIFFMQ05JQ19GV19DQVBBQklMSVRZX0JERykpCiAJCWdvdG8gZXJyX291dDsKIAotCWlmIChhZGFwdGVyLT5pc191cCAhPSBRTENOSUNfQURBUFRFUl9VUF9NQUdJQykKKwlpZiAoIXRlc3RfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJZ290byBlcnJfb3V0OwogCiAJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMiwgJm5ldykpCiAJCWdvdG8gZXJyX291dDsKIAotCWlmICghcWxjbmljX2NvbmZpZ19icmlkZ2VkX21vZGUoYWRhcHRlciwgISFuZXcpKQorCWlmICghYWRhcHRlci0+bmljX29wcy0+Y29uZmlnX2JyaWRnZWRfbW9kZShhZGFwdGVyLCAhIW5ldykpCiAJCXJldCA9IGxlbjsKIAogZXJyX291dDoKQEAgLTI1ODUsNiArMzA1NiwzNjEgQEAKIAkud3JpdGUgPSBxbGNuaWNfc3lzZnNfd3JpdGVfbWVtLAogfTsKIAorc3RhdGljIGludAordmFsaWRhdGVfcG1fY29uZmlnKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwKKwkJCXN0cnVjdCBxbGNuaWNfcG1fZnVuY19jZmcgKnBtX2NmZywgaW50IGNvdW50KQoreworCisJdTggc3JjX3BjaV9mdW5jLCBzX2Vzd19pZCwgZF9lc3dfaWQ7CisJdTggZGVzdF9wY2lfZnVuYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXNyY19wY2lfZnVuYyA9IHBtX2NmZ1tpXS5wY2lfZnVuYzsKKwkJZGVzdF9wY2lfZnVuYyA9IHBtX2NmZ1tpXS5kZXN0X25wYXI7CisJCWlmIChzcmNfcGNpX2Z1bmMgPj0gUUxDTklDX01BWF9QQ0lfRlVOQworCQkJCXx8IGRlc3RfcGNpX2Z1bmMgPj0gUUxDTklDX01BWF9QQ0lfRlVOQykKKwkJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCQlpZiAoYWRhcHRlci0+bnBhcnNbc3JjX3BjaV9mdW5jXS50eXBlICE9IFFMQ05JQ19UWVBFX05JQykKKwkJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCQlpZiAoYWRhcHRlci0+bnBhcnNbZGVzdF9wY2lfZnVuY10udHlwZSAhPSBRTENOSUNfVFlQRV9OSUMpCisJCQlyZXR1cm4gUUxfU1RBVFVTX0lOVkFMSURfUEFSQU07CisKKwkJaWYgKCFJU19WQUxJRF9NT0RFKHBtX2NmZ1tpXS5hY3Rpb24pKQorCQkJcmV0dXJuIFFMX1NUQVRVU19JTlZBTElEX1BBUkFNOworCisJCXNfZXN3X2lkID0gYWRhcHRlci0+bnBhcnNbc3JjX3BjaV9mdW5jXS5waHlfcG9ydDsKKwkJZF9lc3dfaWQgPSBhZGFwdGVyLT5ucGFyc1tkZXN0X3BjaV9mdW5jXS5waHlfcG9ydDsKKworCQlpZiAoc19lc3dfaWQgIT0gZF9lc3dfaWQpCisJCQlyZXR1cm4gUUxfU1RBVFVTX0lOVkFMSURfUEFSQU07CisKKwl9CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHNzaXplX3QKK3FsY25pY19zeXNmc193cml0ZV9wbV9jb25maWcoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcWxjbmljX3BtX2Z1bmNfY2ZnICpwbV9jZmc7CisJdTMyIGlkLCBhY3Rpb24sIHBjaV9mdW5jOworCWludCBjb3VudCwgcmVtLCBpLCByZXQ7CisKKwljb3VudAk9IHNpemUgLyBzaXplb2Yoc3RydWN0IHFsY25pY19wbV9mdW5jX2NmZyk7CisJcmVtCT0gc2l6ZSAlIHNpemVvZihzdHJ1Y3QgcWxjbmljX3BtX2Z1bmNfY2ZnKTsKKwlpZiAocmVtKQorCQlyZXR1cm4gUUxfU1RBVFVTX0lOVkFMSURfUEFSQU07CisKKwlwbV9jZmcgPSAoc3RydWN0IHFsY25pY19wbV9mdW5jX2NmZyAqKSBidWY7CisKKwlyZXQgPSB2YWxpZGF0ZV9wbV9jb25maWcoYWRhcHRlciwgcG1fY2ZnLCBjb3VudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwY2lfZnVuYyA9IHBtX2NmZ1tpXS5wY2lfZnVuYzsKKwkJYWN0aW9uID0gcG1fY2ZnW2ldLmFjdGlvbjsKKwkJaWQgPSBhZGFwdGVyLT5ucGFyc1twY2lfZnVuY10ucGh5X3BvcnQ7CisJCXJldCA9IHFsY25pY19jb25maWdfcG9ydF9taXJyb3JpbmcoYWRhcHRlciwgaWQsCisJCQkJCQlhY3Rpb24sIHBjaV9mdW5jKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcGNpX2Z1bmMgPSBwbV9jZmdbaV0ucGNpX2Z1bmM7CisJCWlkID0gYWRhcHRlci0+bnBhcnNbcGNpX2Z1bmNdLnBoeV9wb3J0OworCQlhZGFwdGVyLT5ucGFyc1twY2lfZnVuY10uZW5hYmxlX3BtID0gcG1fY2ZnW2ldLmFjdGlvbjsKKwkJYWRhcHRlci0+bnBhcnNbcGNpX2Z1bmNdLmRlc3RfbnBhciA9IGlkOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsY25pY19zeXNmc19yZWFkX3BtX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBxbGNuaWNfcG1fZnVuY19jZmcgcG1fY2ZnW1FMQ05JQ19NQVhfUENJX0ZVTkNdOworCWludCBpOworCisJaWYgKHNpemUgIT0gc2l6ZW9mKHBtX2NmZykpCisJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCWZvciAoaSA9IDA7IGkgPCBRTENOSUNfTUFYX1BDSV9GVU5DOyBpKyspIHsKKwkJaWYgKGFkYXB0ZXItPm5wYXJzW2ldLnR5cGUgIT0gUUxDTklDX1RZUEVfTklDKQorCQkJY29udGludWU7CisJCXBtX2NmZ1tpXS5hY3Rpb24gPSBhZGFwdGVyLT5ucGFyc1tpXS5lbmFibGVfcG07CisJCXBtX2NmZ1tpXS5kZXN0X25wYXIgPSAwOworCQlwbV9jZmdbaV0ucGNpX2Z1bmMgPSBpOworCX0KKwltZW1jcHkoYnVmLCAmcG1fY2ZnLCBzaXplKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50Cit2YWxpZGF0ZV9lc3dfY29uZmlnKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwKKwkJCXN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnICplc3dfY2ZnLCBpbnQgY291bnQpCit7CisJdTggcGNpX2Z1bmM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwY2lfZnVuYyA9IGVzd19jZmdbaV0ucGNpX2Z1bmM7CisJCWlmIChwY2lfZnVuYyA+PSBRTENOSUNfTUFYX1BDSV9GVU5DKQorCQkJcmV0dXJuIFFMX1NUQVRVU19JTlZBTElEX1BBUkFNOworCisJCWlmIChhZGFwdGVyLT5ucGFyc1tpXS50eXBlICE9IFFMQ05JQ19UWVBFX05JQykKKwkJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCQlpZiAoZXN3X2NmZy0+aG9zdF92bGFuX3RhZyA9PSAxKQorCQkJaWYgKCFJU19WQUxJRF9WTEFOKGVzd19jZmdbaV0udmxhbl9pZCkpCisJCQkJcmV0dXJuIFFMX1NUQVRVU19JTlZBTElEX1BBUkFNOworCisJCWlmICghSVNfVkFMSURfTU9ERShlc3dfY2ZnW2ldLnByb21pc2NfbW9kZSkKKwkJCQl8fCAhSVNfVkFMSURfTU9ERShlc3dfY2ZnW2ldLmhvc3Rfdmxhbl90YWcpCisJCQkJfHwgIUlTX1ZBTElEX01PREUoZXN3X2NmZ1tpXS5tYWNfbGVhcm5pbmcpCisJCQkJfHwgIUlTX1ZBTElEX01PREUoZXN3X2NmZ1tpXS5kaXNjYXJkX3RhZ2dlZCkpCisJCQlyZXR1cm4gUUxfU1RBVFVTX0lOVkFMSURfUEFSQU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGNuaWNfc3lzZnNfd3JpdGVfZXN3X2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnICplc3dfY2ZnOworCWludCBjb3VudCwgcmVtLCBpLCByZXQ7CisJdTggaWQsIHBjaV9mdW5jOworCisJY291bnQJPSBzaXplIC8gc2l6ZW9mKHN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnKTsKKwlyZW0JPSBzaXplICUgc2l6ZW9mKHN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnKTsKKwlpZiAocmVtKQorCQlyZXR1cm4gUUxfU1RBVFVTX0lOVkFMSURfUEFSQU07CisKKwllc3dfY2ZnID0gKHN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnICopIGJ1ZjsKKwlyZXQgPSB2YWxpZGF0ZV9lc3dfY29uZmlnKGFkYXB0ZXIsIGVzd19jZmcsIGNvdW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcGNpX2Z1bmMgPSBlc3dfY2ZnW2ldLnBjaV9mdW5jOworCQlpZCA9IGFkYXB0ZXItPm5wYXJzW3BjaV9mdW5jXS5waHlfcG9ydDsKKwkJcmV0ID0gcWxjbmljX2NvbmZpZ19zd2l0Y2hfcG9ydChhZGFwdGVyLCBpZCwKKwkJCQkJCWVzd19jZmdbaV0uaG9zdF92bGFuX3RhZywKKwkJCQkJCWVzd19jZmdbaV0uZGlzY2FyZF90YWdnZWQsCisJCQkJCQllc3dfY2ZnW2ldLnByb21pc2NfbW9kZSwKKwkJCQkJCWVzd19jZmdbaV0ubWFjX2xlYXJuaW5nLAorCQkJCQkJZXN3X2NmZ1tpXS5wY2lfZnVuYywKKwkJCQkJCWVzd19jZmdbaV0udmxhbl9pZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXBjaV9mdW5jID0gZXN3X2NmZ1tpXS5wY2lfZnVuYzsKKwkJYWRhcHRlci0+bnBhcnNbcGNpX2Z1bmNdLnByb21pc2NfbW9kZSA9IGVzd19jZmdbaV0ucHJvbWlzY19tb2RlOworCQlhZGFwdGVyLT5ucGFyc1twY2lfZnVuY10ubWFjX2xlYXJuaW5nID0JZXN3X2NmZ1tpXS5tYWNfbGVhcm5pbmc7CisJCWFkYXB0ZXItPm5wYXJzW3BjaV9mdW5jXS52bGFuX2lkID0gZXN3X2NmZ1tpXS52bGFuX2lkOworCQlhZGFwdGVyLT5ucGFyc1twY2lfZnVuY10uZGlzY2FyZF90YWdnZWQJPQorCQkJCQkJZXN3X2NmZ1tpXS5kaXNjYXJkX3RhZ2dlZDsKKwkJYWRhcHRlci0+bnBhcnNbcGNpX2Z1bmNdLmhvc3Rfdmxhbl90YWcgPQorCQkJCQkJZXN3X2NmZ1tpXS5ob3N0X3ZsYW5fdGFnOworCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdAorcWxjbmljX3N5c2ZzX3JlYWRfZXN3X2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnIGVzd19jZmdbUUxDTklDX01BWF9QQ0lfRlVOQ107CisJaW50IGk7CisKKwlpZiAoc2l6ZSAhPSBzaXplb2YoZXN3X2NmZykpCisJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCWZvciAoaSA9IDA7IGkgPCBRTENOSUNfTUFYX1BDSV9GVU5DOyBpKyspIHsKKwkJaWYgKGFkYXB0ZXItPm5wYXJzW2ldLnR5cGUgIT0gUUxDTklDX1RZUEVfTklDKQorCQkJY29udGludWU7CisKKwkJZXN3X2NmZ1tpXS5ob3N0X3ZsYW5fdGFnID0gYWRhcHRlci0+bnBhcnNbaV0uaG9zdF92bGFuX3RhZzsKKwkJZXN3X2NmZ1tpXS5wcm9taXNjX21vZGUgPSBhZGFwdGVyLT5ucGFyc1tpXS5wcm9taXNjX21vZGU7CisJCWVzd19jZmdbaV0uZGlzY2FyZF90YWdnZWQgPSBhZGFwdGVyLT5ucGFyc1tpXS5kaXNjYXJkX3RhZ2dlZDsKKwkJZXN3X2NmZ1tpXS52bGFuX2lkID0gYWRhcHRlci0+bnBhcnNbaV0udmxhbl9pZDsKKwkJZXN3X2NmZ1tpXS5tYWNfbGVhcm5pbmcgPSBhZGFwdGVyLT5ucGFyc1tpXS5tYWNfbGVhcm5pbmc7CisJfQorCW1lbWNweShidWYsICZlc3dfY2ZnLCBzaXplKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50Cit2YWxpZGF0ZV9ucGFyX2NvbmZpZyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IHFsY25pY19ucGFyX2Z1bmNfY2ZnICpucF9jZmcsIGludCBjb3VudCkKK3sKKwl1OCBwY2lfZnVuYywgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXBjaV9mdW5jID0gbnBfY2ZnW2ldLnBjaV9mdW5jOworCQlpZiAocGNpX2Z1bmMgPj0gUUxDTklDX01BWF9QQ0lfRlVOQykKKwkJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCQlpZiAoYWRhcHRlci0+bnBhcnNbcGNpX2Z1bmNdLnR5cGUgIT0gUUxDTklDX1RZUEVfTklDKQorCQkJcmV0dXJuIFFMX1NUQVRVU19JTlZBTElEX1BBUkFNOworCisJCWlmICghSVNfVkFMSURfQlcobnBfY2ZnW2ldLm1pbl9idykKKwkJCQl8fCAhSVNfVkFMSURfQlcobnBfY2ZnW2ldLm1heF9idykKKwkJCQl8fCAhSVNfVkFMSURfUlhfUVVFVUVTKG5wX2NmZ1tpXS5tYXhfcnhfcXVldWVzKQorCQkJCXx8ICFJU19WQUxJRF9UWF9RVUVVRVMobnBfY2ZnW2ldLm1heF90eF9xdWV1ZXMpKQorCQkJcmV0dXJuIFFMX1NUQVRVU19JTlZBTElEX1BBUkFNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3FsY25pY19zeXNmc193cml0ZV9ucGFyX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBxbGNuaWNfaW5mbyBuaWNfaW5mbzsKKwlzdHJ1Y3QgcWxjbmljX25wYXJfZnVuY19jZmcgKm5wX2NmZzsKKwlpbnQgaSwgY291bnQsIHJlbSwgcmV0OworCXU4IHBjaV9mdW5jOworCisJY291bnQJPSBzaXplIC8gc2l6ZW9mKHN0cnVjdCBxbGNuaWNfbnBhcl9mdW5jX2NmZyk7CisJcmVtCT0gc2l6ZSAlIHNpemVvZihzdHJ1Y3QgcWxjbmljX25wYXJfZnVuY19jZmcpOworCWlmIChyZW0pCisJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCW5wX2NmZyA9IChzdHJ1Y3QgcWxjbmljX25wYXJfZnVuY19jZmcgKikgYnVmOworCXJldCA9IHZhbGlkYXRlX25wYXJfY29uZmlnKGFkYXB0ZXIsIG5wX2NmZywgY291bnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQgOyBpKyspIHsKKwkJcGNpX2Z1bmMgPSBucF9jZmdbaV0ucGNpX2Z1bmM7CisJCXJldCA9IHFsY25pY19nZXRfbmljX2luZm8oYWRhcHRlciwgJm5pY19pbmZvLCBwY2lfZnVuYyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQluaWNfaW5mby5wY2lfZnVuYyA9IHBjaV9mdW5jOworCQluaWNfaW5mby5taW5fdHhfYncgPSBucF9jZmdbaV0ubWluX2J3OworCQluaWNfaW5mby5tYXhfdHhfYncgPSBucF9jZmdbaV0ubWF4X2J3OworCQlyZXQgPSBxbGNuaWNfc2V0X25pY19pbmZvKGFkYXB0ZXIsICZuaWNfaW5mbyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlhZGFwdGVyLT5ucGFyc1tpXS5taW5fYncgPSBuaWNfaW5mby5taW5fdHhfYnc7CisJCWFkYXB0ZXItPm5wYXJzW2ldLm1heF9idyA9IG5pY19pbmZvLm1heF90eF9idzsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKKworfQorc3RhdGljIHNzaXplX3QKK3FsY25pY19zeXNmc19yZWFkX25wYXJfY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHFsY25pY19pbmZvIG5pY19pbmZvOworCXN0cnVjdCBxbGNuaWNfbnBhcl9mdW5jX2NmZyBucF9jZmdbUUxDTklDX01BWF9QQ0lfRlVOQ107CisJaW50IGksIHJldDsKKworCWlmIChzaXplICE9IHNpemVvZihucF9jZmcpKQorCQlyZXR1cm4gUUxfU1RBVFVTX0lOVkFMSURfUEFSQU07CisKKwlmb3IgKGkgPSAwOyBpIDwgUUxDTklDX01BWF9QQ0lfRlVOQyA7IGkrKykgeworCQlpZiAoYWRhcHRlci0+bnBhcnNbaV0udHlwZSAhPSBRTENOSUNfVFlQRV9OSUMpCisJCQljb250aW51ZTsKKwkJcmV0ID0gcWxjbmljX2dldF9uaWNfaW5mbyhhZGFwdGVyLCAmbmljX2luZm8sIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlucF9jZmdbaV0ucGNpX2Z1bmMgPSBpOworCQlucF9jZmdbaV0ub3BfbW9kZSA9IG5pY19pbmZvLm9wX21vZGU7CisJCW5wX2NmZ1tpXS5wb3J0X251bSA9IG5pY19pbmZvLnBoeXNfcG9ydDsKKwkJbnBfY2ZnW2ldLmZ3X2NhcGFiID0gbmljX2luZm8uY2FwYWJpbGl0aWVzOworCQlucF9jZmdbaV0ubWluX2J3ID0gbmljX2luZm8ubWluX3R4X2J3IDsKKwkJbnBfY2ZnW2ldLm1heF9idyA9IG5pY19pbmZvLm1heF90eF9idzsKKwkJbnBfY2ZnW2ldLm1heF90eF9xdWV1ZXMgPSBuaWNfaW5mby5tYXhfdHhfcXVlczsKKwkJbnBfY2ZnW2ldLm1heF9yeF9xdWV1ZXMgPSBuaWNfaW5mby5tYXhfcnhfcXVlczsKKwl9CisJbWVtY3B5KGJ1ZiwgJm5wX2NmZywgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGNuaWNfc3lzZnNfcmVhZF9wY2lfY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHFsY25pY19wY2lfZnVuY19jZmcgcGNpX2NmZ1tRTENOSUNfTUFYX1BDSV9GVU5DXTsKKwlzdHJ1Y3QgcWxjbmljX3BjaV9pbmZvCXBjaV9pbmZvW1FMQ05JQ19NQVhfUENJX0ZVTkNdOworCWludCBpLCByZXQ7CisKKwlpZiAoc2l6ZSAhPSBzaXplb2YocGNpX2NmZykpCisJCXJldHVybiBRTF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworCXJldCA9IHFsY25pY19nZXRfcGNpX2luZm8oYWRhcHRlciwgcGNpX2luZm8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUxDTklDX01BWF9QQ0lfRlVOQyA7IGkrKykgeworCQlwY2lfY2ZnW2ldLnBjaV9mdW5jID0gcGNpX2luZm9baV0uaWQ7CisJCXBjaV9jZmdbaV0uZnVuY190eXBlID0gcGNpX2luZm9baV0udHlwZTsKKwkJcGNpX2NmZ1tpXS5wb3J0X251bSA9IHBjaV9pbmZvW2ldLmRlZmF1bHRfcG9ydDsKKwkJcGNpX2NmZ1tpXS5taW5fYncgPSBwY2lfaW5mb1tpXS50eF9taW5fYnc7CisJCXBjaV9jZmdbaV0ubWF4X2J3ID0gcGNpX2luZm9baV0udHhfbWF4X2J3OworCQltZW1jcHkoJnBjaV9jZmdbaV0uZGVmX21hY19hZGRyLCAmcGNpX2luZm9baV0ubWFjLCBFVEhfQUxFTik7CisJfQorCW1lbWNweShidWYsICZwY2lfY2ZnLCBzaXplKTsKKwlyZXR1cm4gc2l6ZTsKKworfQorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGJpbl9hdHRyX25wYXJfY29uZmlnID0geworCS5hdHRyID0gey5uYW1lID0gIm5wYXJfY29uZmlnIiwgLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBxbGNuaWNfc3lzZnNfcmVhZF9ucGFyX2NvbmZpZywKKwkud3JpdGUgPSBxbGNuaWNfc3lzZnNfd3JpdGVfbnBhcl9jb25maWcsCit9OworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgYmluX2F0dHJfcGNpX2NvbmZpZyA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJwY2lfY29uZmlnIiwgLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBxbGNuaWNfc3lzZnNfcmVhZF9wY2lfY29uZmlnLAorCS53cml0ZSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgYmluX2F0dHJfZXN3X2NvbmZpZyA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJlc3dfY29uZmlnIiwgLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBxbGNuaWNfc3lzZnNfcmVhZF9lc3dfY29uZmlnLAorCS53cml0ZSA9IHFsY25pY19zeXNmc193cml0ZV9lc3dfY29uZmlnLAorfTsKKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGJpbl9hdHRyX3BtX2NvbmZpZyA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJwbV9jb25maWciLCAubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUil9LAorCS5zaXplID0gMCwKKwkucmVhZCA9IHFsY25pY19zeXNmc19yZWFkX3BtX2NvbmZpZywKKwkud3JpdGUgPSBxbGNuaWNfc3lzZnNfd3JpdGVfcG1fY29uZmlnLAorfTsKKwogc3RhdGljIHZvaWQKIHFsY25pY19jcmVhdGVfc3lzZnNfZW50cmllcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC0yNjEwLDIzICszNDM2LDQ1IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKIAorCWlmIChhZGFwdGVyLT5vcF9tb2RlID09IFFMQ05JQ19OT05fUFJJVl9GVU5DKQorCQlyZXR1cm47CiAJaWYgKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kaWFnX21vZGUpKQogCQlkZXZfaW5mbyhkZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRpYWdfbW9kZSBzeXNmcyBlbnRyeVxuIik7CiAJaWYgKGRldmljZV9jcmVhdGVfYmluX2ZpbGUoZGV2LCAmYmluX2F0dHJfY3JiKSkKIAkJZGV2X2luZm8oZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBjcmIgc3lzZnMgZW50cnlcbiIpOwogCWlmIChkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKGRldiwgJmJpbl9hdHRyX21lbSkpCiAJCWRldl9pbmZvKGRldiwgImZhaWxlZCB0byBjcmVhdGUgbWVtIHN5c2ZzIGVudHJ5XG4iKTsKLX0KKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19FU1dJVENIX0VOQUJMRUQpIHx8CisJCQlhZGFwdGVyLT5vcF9tb2RlICE9IFFMQ05JQ19NR01UX0ZVTkMpCisJCXJldHVybjsKKwlpZiAoZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShkZXYsICZiaW5fYXR0cl9wY2lfY29uZmlnKSkKKwkJZGV2X2luZm8oZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBwY2kgY29uZmlnIHN5c2ZzIGVudHJ5Iik7CisJaWYgKGRldmljZV9jcmVhdGVfYmluX2ZpbGUoZGV2LCAmYmluX2F0dHJfbnBhcl9jb25maWcpKQorCQlkZXZfaW5mbyhkZXYsICJmYWlsZWQgdG8gY3JlYXRlIG5wYXIgY29uZmlnIHN5c2ZzIGVudHJ5Iik7CisJaWYgKGRldmljZV9jcmVhdGVfYmluX2ZpbGUoZGV2LCAmYmluX2F0dHJfZXN3X2NvbmZpZykpCisJCWRldl9pbmZvKGRldiwgImZhaWxlZCB0byBjcmVhdGUgZXN3IGNvbmZpZyBzeXNmcyBlbnRyeSIpOworCWlmIChkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKGRldiwgJmJpbl9hdHRyX3BtX2NvbmZpZykpCisJCWRldl9pbmZvKGRldiwgImZhaWxlZCB0byBjcmVhdGUgcG0gY29uZmlnIHN5c2ZzIGVudHJ5Iik7CiAKK30KIAogc3RhdGljIHZvaWQKIHFsY25pY19yZW1vdmVfZGlhZ19lbnRyaWVzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCisJaWYgKGFkYXB0ZXItPm9wX21vZGUgPT0gUUxDTklDX05PTl9QUklWX0ZVTkMpCisJCXJldHVybjsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGlhZ19tb2RlKTsKIAlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKGRldiwgJmJpbl9hdHRyX2NyYik7CiAJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShkZXYsICZiaW5fYXR0cl9tZW0pOworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkgfHwKKwkJCWFkYXB0ZXItPm9wX21vZGUgIT0gUUxDTklDX01HTVRfRlVOQykKKwkJcmV0dXJuOworCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoZGV2LCAmYmluX2F0dHJfcGNpX2NvbmZpZyk7CisJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShkZXYsICZiaW5fYXR0cl9ucGFyX2NvbmZpZyk7CisJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShkZXYsICZiaW5fYXR0cl9lc3dfY29uZmlnKTsKKwlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKGRldiwgJmJpbl9hdHRyX3BtX2NvbmZpZyk7CiB9CiAKICNpZmRlZiBDT05GSUdfSU5FVApAQCAtMjY4NCw3ICszNTMyLDcgQEAKIAlpZiAoIWFkYXB0ZXIpCiAJCWdvdG8gZG9uZTsKIAotCWlmIChhZGFwdGVyLT5pc191cCAhPSBRTENOSUNfQURBUFRFUl9VUF9NQUdJQykKKwlpZiAoIXRlc3RfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJZ290byBkb25lOwogCiAJcWxjbmljX2NvbmZpZ19pbmRldl9hZGRyKGRldiwgZXZlbnQpOwpAQCAtMjcyMCw3ICszNTY4LDcgQEAKIAlpZiAoIWFkYXB0ZXIpCiAJCWdvdG8gZG9uZTsKIAotCWlmIChhZGFwdGVyLT5pc191cCAhPSBRTENOSUNfQURBUFRFUl9VUF9NQUdJQykKKwlpZiAoIXRlc3RfYml0KF9fUUxDTklDX0RFVl9VUCwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJZ290byBkb25lOwogCiAJc3dpdGNoIChldmVudCkgewpAQCAtMjc1MCw2ICszNTk4LDExIEBACiBxbGNuaWNfY29uZmlnX2luZGV2X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBldmVudCkKIHsgfQogI2VuZGlmCitzdGF0aWMgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBxbGNuaWNfZXJyX2hhbmRsZXIgPSB7CisJLmVycm9yX2RldGVjdGVkID0gcWxjbmljX2lvX2Vycm9yX2RldGVjdGVkLAorCS5zbG90X3Jlc2V0ID0gcWxjbmljX2lvX3Nsb3RfcmVzZXQsCisJLnJlc3VtZSA9IHFsY25pY19pb19yZXN1bWUsCit9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcWxjbmljX2RyaXZlciA9IHsKIAkubmFtZSA9IHFsY25pY19kcml2ZXJfbmFtZSwKQEAgLTI3NjAsMTEgKzM2MTMsMTQgQEAKIAkuc3VzcGVuZCA9IHFsY25pY19zdXNwZW5kLAogCS5yZXN1bWUgPSBxbGNuaWNfcmVzdW1lLAogI2VuZGlmCi0JLnNodXRkb3duID0gcWxjbmljX3NodXRkb3duCisJLnNodXRkb3duID0gcWxjbmljX3NodXRkb3duLAorCS5lcnJfaGFuZGxlciA9ICZxbGNuaWNfZXJyX2hhbmRsZXIKKwogfTsKIAogc3RhdGljIGludCBfX2luaXQgcWxjbmljX2luaXRfbW9kdWxlKHZvaWQpCiB7CisJaW50IHJldDsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBxbGNuaWNfZHJpdmVyX3N0cmluZyk7CiAKQEAgLTI3NzMsOCArMzYyOSwxNSBAQAogCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZxbGNuaWNfaW5ldGFkZHJfY2IpOwogI2VuZGlmCiAKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZxbGNuaWNfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisjaWZkZWYgQ09ORklHX0lORVQKKwkJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmcWxjbmljX2luZXRhZGRyX2NiKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnFsY25pY19uZXRkZXZfY2IpOworI2VuZGlmCisJfQogCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnFsY25pY19kcml2ZXIpOworCXJldHVybiByZXQ7CiB9CiAKIG1vZHVsZV9pbml0KHFsY25pY19pbml0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaCBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCmluZGV4IDIwNjI0YmEuLmE0Nzg3ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCkBAIC0xNiw5ICsxNiw3IEBACiAgKi8KICNkZWZpbmUgRFJWX05BTUUgIAkicWxnZSIKICNkZWZpbmUgRFJWX1NUUklORyAJIlFMb2dpYyAxMCBHaWdhYml0IFBDSS1FIEV0aGVybmV0IERyaXZlciAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSJ2MS4wMC4wMC4yMy4wMC4wMC0wMSIKLQotI2RlZmluZSBQRlggInFsZ2U6ICIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JInYxLjAwLjAwLjI1LjAwLjAwLTAxIgogCiAjZGVmaW5lIFdRX0FERFJfQUxJR04JMHgzCS8qIDQgYnl0ZSBhbGlnbm1lbnQgKi8KIApAQCAtMTA2Miw3ICsxMDYwLDcgQEAKICNkZWZpbmUgVFhfREVTQ19MRU5fTUFTSwkweDAwMGZmZmZmCiAjZGVmaW5lIFRYX0RFU0NfQwkweDQwMDAwMDAwCiAjZGVmaW5lIFRYX0RFU0NfRQkweDgwMDAwMDAwCi19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBJT0NCIERlZmluaXRpb25zLi4uCkBAIC0xMDk1LDcgKzEwOTMsNyBAQAogCV9fbGUxNiB2bGFuX3RjaTsKIAlfX2xlMTYgcmVzZXJ2ZWQ0OwogCXN0cnVjdCB0eF9idWZfZGVzYyB0YmRbVFhfREVTQ19QRVJfSU9DQl07Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBvYl9tYWNfaW9jYl9yc3AgewogCXU4IG9wY29kZTsJCS8qICovCkBAIC0xMTEyLDcgKzExMTAsNyBAQAogCXUzMiB0aWQ7CiAJdTMyIHR4cV9pZHg7CiAJX19sZTMyIHJlc2VydmVkWzEzXTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9iX21hY190c29faW9jYl9yZXEgewogCXU4IG9wY29kZTsKQEAgLTExNDAsNyArMTEzOCw3IEBACiAJX19sZTE2IHZsYW5fdGNpOwogCV9fbGUxNiBtc3M7CiAJc3RydWN0IHR4X2J1Zl9kZXNjIHRiZFtUWF9ERVNDX1BFUl9JT0NCXTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9iX21hY190c29faW9jYl9yc3AgewogCXU4IG9wY29kZTsKQEAgLTExNTcsNyArMTE1NSw3IEBACiAJdTMyIHRpZDsKIAl1MzIgdHhxX2lkeDsKIAlfX2xlMzIgcmVzZXJ2ZWQyWzEzXTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGliX21hY19pb2NiX3JzcCB7CiAJdTggb3Bjb2RlOwkJLyogMHgyMCAqLwpAQCAtMTIxNiw3ICsxMjE0LDcgQEAKICNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0hMCTB4ODAKIAlfX2xlMzIgaGRyX2xlbjsJCS8qICovCiAJX19sZTY0IGhkcl9hZGRyOwkvKiAqLwotfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWJfYWVfaW9jYl9yc3AgewogCXU4IG9wY29kZTsKQEAgLTEyMzcsNyArMTIzNSw3IEBACiAjZGVmaW5lIFBDSV9FUlJfQU5PTl9CVUZfUkQgICAgICAgIDB4NDAKIAl1OCBxX2lkOwogCV9fbGUzMiByZXNlcnZlZFsxNV07Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBUaGVzZSB0aHJlZSBzdHJ1Y3R1cmVzIGFyZSBmb3IgZ2VuZXJpYwpAQCAtMTI0OSw3ICsxMjQ3LDcgQEAKIAlfX2xlMTYgbGVuZ3RoOwogCV9fbGUzMiB0aWQ7CiAJX19sZTMyIHJlc2VydmVkWzE0XTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5ldF9yZXFfaW9jYiB7CiAJdTggb3Bjb2RlOwpAQCAtMTI1Nyw3ICsxMjU1LDcgQEAKIAlfX2xlMTYgZmxhZ3MxOwogCV9fbGUzMiB0aWQ7CiAJX19sZTMyIHJlc2VydmVkMVszMF07Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiB0eCByaW5nIGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgZm9yIGNoaXAuCkBAIC0xMjgzLDcgKzEyODEsNyBAQAogCV9fbGUxNiByaWQ7CiAJX19sZTY0IGFkZHI7CiAJX19sZTY0IGNuc21yX2lkeF9hZGRyOwotfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogcnggcmluZyBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrIGZvciBjaGlwLgpAQCAtMTMxNyw3ICsxMzE1LDcgQEAKIAlfX2xlNjQgc2JxX2FkZHI7CiAJX19sZTE2IHNicV9idWZfc2l6ZTsKIAlfX2xlMTYgc2JxX2xlbjsJCS8qIGVudHJ5IGNvdW50ICovCi19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByaWNiIHsKIAl1OCBiYXNlX2NxOwpAQCAtMTMzNSw3ICsxMzMzLDcgQEAKIAl1OCBoYXNoX2NxX2lkWzEwMjRdOwogCV9fbGUzMiBpcHY2X2hhc2hfa2V5WzEwXTsKIAlfX2xlMzIgaXB2NF9oYXNoX2tleVs0XTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogU09GVFdBUkUvRFJJVkVSIERBVEEgU1RSVUNUVVJFUy4gKi8KIApAQCAtMjIyNyw3ICsyMjI1LDYgQEAKIAkJdTMyIHJhbV9hZGRyLCBpbnQgd29yZF9jb3VudCk7CiBpbnQgcWxfY29yZV9kdW1wKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LAogCQlzdHJ1Y3QgcWxfbXBpX2NvcmVkdW1wICptcGlfY29yZWR1bXApOwotaW50IHFsX21iX3N5c19lcnIoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOwogaW50IHFsX21iX2Fib3V0X2Z3KHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KTsKIGludCBxbF93b2woc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOwogaW50IHFsX21iX3dvbF9zZXRfbWFnaWMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBlbmFibGVfd29sKTsKQEAgLTIyNDYsNiArMjI0Myw3IEBACiB2b2lkIHFsX2NoZWNrX2xiX2ZyYW1lKHN0cnVjdCBxbF9hZGFwdGVyICosIHN0cnVjdCBza19idWZmICopOwogaW50IHFsX293bl9maXJtd2FyZShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldik7CiBpbnQgcWxfY2xlYW5fbGJfcnhfcmluZyhzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZywgaW50IGJ1ZGdldCk7Cit2b2lkIHFsZ2Vfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKIAogI2lmIDEKICNkZWZpbmUgUUxfQUxMX0RVTVAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYwppbmRleCA2OGExYzliLi40NzQ3NDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2RiZy5jCkBAIC0xLDMgKzEsNSBAQAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAicWxnZS5oIgpAQCAtNDQ2LDcgKzQ0OCw3IEBACiAJCQkJCU1BQ19BRERSX1RZUEVfQ0FNX01BQywgaSwgdmFsdWUpOwogCQlpZiAoc3RhdHVzKSB7CiAJCQluZXRpZl9lcnIocWRldiwgZHJ2LCBxZGV2LT5uZGV2LAotCQkJCSAgIkZhaWxlZCByZWFkIG9mIG1hYyBpbmRleCByZWdpc3Rlci5cbiIpOworCQkJCSAgIkZhaWxlZCByZWFkIG9mIG1hYyBpbmRleCByZWdpc3RlclxuIik7CiAJCQlnb3RvIGVycjsKIAkJfQogCQkqYnVmKysgPSB2YWx1ZVswXTsJLyogbG93ZXIgTUFDIGFkZHJlc3MgKi8KQEAgLTQ1OCw3ICs0NjAsNyBAQAogCQkJCQlNQUNfQUREUl9UWVBFX01VTFRJX01BQywgaSwgdmFsdWUpOwogCQlpZiAoc3RhdHVzKSB7CiAJCQluZXRpZl9lcnIocWRldiwgZHJ2LCBxZGV2LT5uZGV2LAotCQkJCSAgIkZhaWxlZCByZWFkIG9mIG1hYyBpbmRleCByZWdpc3Rlci5cbiIpOworCQkJCSAgIkZhaWxlZCByZWFkIG9mIG1hYyBpbmRleCByZWdpc3RlclxuIik7CiAJCQlnb3RvIGVycjsKIAkJfQogCQkqYnVmKysgPSB2YWx1ZVswXTsJLyogbG93ZXIgTWNhc3QgYWRkcmVzcyAqLwpAQCAtNDgyLDcgKzQ4NCw3IEBACiAJCXN0YXR1cyA9IHFsX2dldF9yb3V0aW5nX3JlZyhxZGV2LCBpLCAmdmFsdWUpOwogCQlpZiAoc3RhdHVzKSB7CiAJCQluZXRpZl9lcnIocWRldiwgZHJ2LCBxZGV2LT5uZGV2LAotCQkJCSAgIkZhaWxlZCByZWFkIG9mIHJvdXRpbmcgaW5kZXggcmVnaXN0ZXIuXG4iKTsKKwkJCQkgICJGYWlsZWQgcmVhZCBvZiByb3V0aW5nIGluZGV4IHJlZ2lzdGVyXG4iKTsKIAkJCWdvdG8gZXJyOwogCQl9IGVsc2UgewogCQkJKmJ1ZisrID0gdmFsdWU7CkBAIC02NjgsNyArNjcwLDcgQEAKIAkJCW1heF9vZmZzZXQgPSBNQUNfQUREUl9NQVhfTUdNVF9UVV9EUF9XQ09VTlQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiJCYWQgdHlwZSEhISAweCUwOHhcbiIsIHR5cGUpOworCQkJcHJfZXJyKCJCYWQgdHlwZSEhISAweCUwOHhcbiIsIHR5cGUpOwogCQkJbWF4X2luZGV4ID0gMDsKIAkJCW1heF9vZmZzZXQgPSAwOwogCQkJYnJlYWs7CkBAIC03MzgsNyArNzQwLDcgQEAKIAlpbnQgaTsKIAogCWlmICghbXBpX2NvcmVkdW1wKSB7Ci0JCW5ldGlmX2VycihxZGV2LCBkcnYsIHFkZXYtPm5kZXYsICJObyBtZW1vcnkgYXZhaWxhYmxlLlxuIik7CisJCW5ldGlmX2VycihxZGV2LCBkcnYsIHFkZXYtPm5kZXYsICJObyBtZW1vcnkgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjM0LDE1ICsxMjM2LDEwIEBACiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcocWRldi0+bmRldikpIHsKIAkJbmV0aWZfZXJyKHFkZXYsIGlmdXAsIHFkZXYtPm5kZXYsCi0JCQkgICJGb3JjZSBDb3JlZHVtcCBjYW4gb25seSBiZSBkb25lIGZyb20gaW50ZXJmYWNlIHRoYXQgaXMgdXAuXG4iKTsKKwkJCSAgIkZvcmNlIENvcmVkdW1wIGNhbiBvbmx5IGJlIGRvbmUgZnJvbSBpbnRlcmZhY2UgdGhhdCBpcyB1cFxuIik7CiAJCXJldHVybjsKIAl9Ci0KLQlpZiAocWxfbWJfc3lzX2VycihxZGV2KSkgewotCQluZXRpZl9lcnIocWRldiwgaWZ1cCwgcWRldi0+bmRldiwKLQkJCSAgIkZhaWwgZm9yY2UgY29yZWR1bXAgd2l0aCBxbF9tYl9zeXNfZXJyKCkuXG4iKTsKLQkJcmV0dXJuOwotCX0KKwlxbF9xdWV1ZV9md19lcnJvcihxZGV2KTsKIH0KIAogdm9pZCBxbF9nZW5fcmVnX2R1bXAoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCkBAIC0xMzM5LDcgKzEzMzYsNyBAQAogCQkgICAgICJDb3JlIGlzIGR1bXBpbmcgdG8gbG9nIGZpbGUhXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSA4KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJS4wOHg6ICUuMDh4ICUuMDh4ICUuMDh4ICUuMDh4ICUuMDh4ICIKKwkJcHJfZXJyKCIlLjA4eDogJS4wOHggJS4wOHggJS4wOHggJS4wOHggJS4wOHggIgogCQkJIiUuMDh4ICUuMDh4ICUuMDh4XG4iLCBpLAogCQkJdG1wW2kgKyAwXSwKIAkJCXRtcFtpICsgMV0sCkBAIC0xMzYxLDcxICsxMzU4LDQzIEBACiAJZm9yIChpID0gMDsgaSA8IHFkZXYtPmludHJfY291bnQ7IGkrKykgewogCQlxbF93cml0ZTMyKHFkZXYsIElOVFJfRU4sIHFkZXYtPmludHJfY29udGV4dFtpXS5pbnRyX3JlYWRfbWFzayk7CiAJCXZhbHVlID0gcWxfcmVhZDMyKHFkZXYsIElOVFJfRU4pOwotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiJXM6IEludGVycnVwdCAlZCBpcyAlcy5cbiIsCisJCXByX2VycigiJXM6IEludGVycnVwdCAlZCBpcyAlc1xuIiwKIAkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUsIGksCiAJCSAgICAgICAodmFsdWUgJiBJTlRSX0VOX0VOID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwogCX0KIH0KIAorI2RlZmluZSBEVU1QX1hHTUFDKHFkZXYsIHJlZykJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwl1MzIgZGF0YTsJCQkJCQlcCisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgcmVnLCAmZGF0YSk7CQkJXAorCXByX2VycigiJXM6ICVzID0gMHglLjA4eFxuIiwgcWRldi0+bmRldi0+bmFtZSwgI3JlZywgZGF0YSk7IFwKK30gd2hpbGUgKDApCisKIHZvaWQgcWxfZHVtcF94Z21hY19jb250cm9sX3JlZ3Moc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCiB7Ci0JdTMyIGRhdGE7CiAJaWYgKHFsX3NlbV9zcGlubG9jayhxZGV2LCBxZGV2LT54Z19zZW1fbWFzaykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGRuJ3QgZ2V0IHhnbWFjIHNlbS5cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogQ291bGRuJ3QgZ2V0IHhnbWFjIHNlbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQotCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIFBBVVNFX1NSQ19MTywgJmRhdGEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQQVVTRV9TUkNfTE8gPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKLQkgICAgICAgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfU1JDX0hJLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFBBVVNFX1NSQ19ISSA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAotCSAgICAgICBkYXRhKTsKLQlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBHTE9CQUxfQ0ZHLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEdMT0JBTF9DRkcgPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKLQkgICAgICAgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgVFhfQ0ZHLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFRYX0NGRyA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLCBkYXRhKTsKLQlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBSWF9DRkcsICZkYXRhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUlhfQ0ZHID0gMHglLjA4eC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUsIGRhdGEpOwotCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIEZMT1dfQ1RMLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEZMT1dfQ1RMID0gMHglLjA4eC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUsCi0JICAgICAgIGRhdGEpOwotCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIFBBVVNFX09QQ09ERSwgJmRhdGEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQQVVTRV9PUENPREUgPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKLQkgICAgICAgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfVElNRVIsICZkYXRhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUEFVU0VfVElNRVIgPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKLQkgICAgICAgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfRlJNX0RFU1RfTE8sICZkYXRhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUEFVU0VfRlJNX0RFU1RfTE8gPSAweCUuMDh4LlxuIiwKLQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfRlJNX0RFU1RfSEksICZkYXRhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUEFVU0VfRlJNX0RFU1RfSEkgPSAweCUuMDh4LlxuIiwKLQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgTUFDX1RYX1BBUkFNUywgJmRhdGEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBNQUNfVFhfUEFSQU1TID0gMHglLjA4eC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUsCi0JICAgICAgIGRhdGEpOwotCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIE1BQ19SWF9QQVJBTVMsICZkYXRhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogTUFDX1JYX1BBUkFNUyA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAotCSAgICAgICBkYXRhKTsKLQlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBNQUNfU1lTX0lOVCwgJmRhdGEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBNQUNfU1lTX0lOVCA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAotCSAgICAgICBkYXRhKTsKLQlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBNQUNfU1lTX0lOVF9NQVNLLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQ19TWVNfSU5UX01BU0sgPSAweCUuMDh4LlxuIiwKLQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgTUFDX01HTVRfSU5ULCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQ19NR01UX0lOVCA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAotCSAgICAgICBkYXRhKTsKLQlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBNQUNfTUdNVF9JTl9NQVNLLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQ19NR01UX0lOX01BU0sgPSAweCUuMDh4LlxuIiwKLQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7Ci0JcWxfcmVhZF94Z21hY19yZWcocWRldiwgRVhUX0FSQl9NT0RFLCAmZGF0YSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEVYVF9BUkJfTU9ERSA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAotCSAgICAgICBkYXRhKTsKKwlEVU1QX1hHTUFDKHFkZXYsIFBBVVNFX1NSQ19MTyk7CisJRFVNUF9YR01BQyhxZGV2LCBQQVVTRV9TUkNfSEkpOworCURVTVBfWEdNQUMocWRldiwgR0xPQkFMX0NGRyk7CisJRFVNUF9YR01BQyhxZGV2LCBUWF9DRkcpOworCURVTVBfWEdNQUMocWRldiwgUlhfQ0ZHKTsKKwlEVU1QX1hHTUFDKHFkZXYsIEZMT1dfQ1RMKTsKKwlEVU1QX1hHTUFDKHFkZXYsIFBBVVNFX09QQ09ERSk7CisJRFVNUF9YR01BQyhxZGV2LCBQQVVTRV9USU1FUik7CisJRFVNUF9YR01BQyhxZGV2LCBQQVVTRV9GUk1fREVTVF9MTyk7CisJRFVNUF9YR01BQyhxZGV2LCBQQVVTRV9GUk1fREVTVF9ISSk7CisJRFVNUF9YR01BQyhxZGV2LCBNQUNfVFhfUEFSQU1TKTsKKwlEVU1QX1hHTUFDKHFkZXYsIE1BQ19SWF9QQVJBTVMpOworCURVTVBfWEdNQUMocWRldiwgTUFDX1NZU19JTlQpOworCURVTVBfWEdNQUMocWRldiwgTUFDX1NZU19JTlRfTUFTSyk7CisJRFVNUF9YR01BQyhxZGV2LCBNQUNfTUdNVF9JTlQpOworCURVTVBfWEdNQUMocWRldiwgTUFDX01HTVRfSU5fTUFTSyk7CisJRFVNUF9YR01BQyhxZGV2LCBFWFRfQVJCX01PREUpOwogCXFsX3NlbV91bmxvY2socWRldiwgcWRldi0+eGdfc2VtX21hc2spOwotCiB9CiAKIHN0YXRpYyB2b2lkIHFsX2R1bXBfZXRzX3JlZ3Moc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCkBAIC0xNDQyLDE0ICsxNDExLDEyIEBACiAJCXJldHVybjsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWlmIChxbF9nZXRfbWFjX2FkZHJfcmVnKHFkZXYsIE1BQ19BRERSX1RZUEVfQ0FNX01BQywgaSwgdmFsdWUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkgICAgICAgIiVzOiBGYWlsZWQgcmVhZCBvZiBtYWMgaW5kZXggcmVnaXN0ZXIuXG4iLAorCQkJcHJfZXJyKCIlczogRmFpbGVkIHJlYWQgb2YgbWFjIGluZGV4IHJlZ2lzdGVyXG4iLAogCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfSBlbHNlIHsKIAkJCWlmICh2YWx1ZVswXSkKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJICAgICAgICIlczogQ0FNIGluZGV4ICVkIENBTSBMb29rdXAgTG93ZXIgPSAweCUuMDh4OiUuMDh4LCBPdXRwdXQgPSAweCUuMDh4LlxuIiwKKwkJCQlwcl9lcnIoIiVzOiBDQU0gaW5kZXggJWQgQ0FNIExvb2t1cCBMb3dlciA9IDB4JS4wOHg6JS4wOHgsIE91dHB1dCA9IDB4JS4wOHhcbiIsCiAJCQkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUsIGksIHZhbHVlWzFdLCB2YWx1ZVswXSwKIAkJCQkgICAgICAgdmFsdWVbMl0pOwogCQl9CkBAIC0xNDU3LDE0ICsxNDI0LDEyIEBACiAJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKIAkJaWYgKHFsX2dldF9tYWNfYWRkcl9yZWcKIAkJICAgIChxZGV2LCBNQUNfQUREUl9UWVBFX01VTFRJX01BQywgaSwgdmFsdWUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkgICAgICAgIiVzOiBGYWlsZWQgcmVhZCBvZiBtYWMgaW5kZXggcmVnaXN0ZXIuXG4iLAorCQkJcHJfZXJyKCIlczogRmFpbGVkIHJlYWQgb2YgbWFjIGluZGV4IHJlZ2lzdGVyXG4iLAogCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfSBlbHNlIHsKIAkJCWlmICh2YWx1ZVswXSkKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJICAgICAgICIlczogTUNBU1QgaW5kZXggJWQgQ0FNIExvb2t1cCBMb3dlciA9IDB4JS4wOHg6JS4wOHguXG4iLAorCQkJCXByX2VycigiJXM6IE1DQVNUIGluZGV4ICVkIENBTSBMb29rdXAgTG93ZXIgPSAweCUuMDh4OiUuMDh4XG4iLAogCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLCBpLCB2YWx1ZVsxXSwgdmFsdWVbMF0pOwogCQl9CiAJfQpAQCAtMTQ4MSwxMjkgKzE0NDYsNzcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQl2YWx1ZSA9IDA7CiAJCWlmIChxbF9nZXRfcm91dGluZ19yZWcocWRldiwgaSwgJnZhbHVlKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJICAgICAgICIlczogRmFpbGVkIHJlYWQgb2Ygcm91dGluZyBpbmRleCByZWdpc3Rlci5cbiIsCisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgcmVhZCBvZiByb3V0aW5nIGluZGV4IHJlZ2lzdGVyXG4iLAogCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfSBlbHNlIHsKIAkJCWlmICh2YWx1ZSkKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkJICAgICAgICIlczogUm91dGluZyBNYXNrICVkID0gMHglLjA4eC5cbiIsCisJCQkJcHJfZXJyKCIlczogUm91dGluZyBNYXNrICVkID0gMHglLjA4eFxuIiwKIAkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgaSwgdmFsdWUpOwogCQl9CiAJfQogCXFsX3NlbV91bmxvY2socWRldiwgU0VNX1JUX0lEWF9NQVNLKTsKIH0KIAorI2RlZmluZSBEVU1QX1JFRyhxZGV2LCByZWcpCQkJXAorCXByX2VycigiJS0zMnM9IDB4JXhcbiIsICNyZWcsIHFsX3JlYWQzMihxZGV2LCByZWcpKQorCiB2b2lkIHFsX2R1bXBfcmVncyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKIHsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWcgZHVtcCBmb3IgZnVuY3Rpb24gIyVkLlxuIiwgcWRldi0+ZnVuYyk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiU1lTCSAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgU1lTKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiUlNUX0ZPIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBSU1RfRk8pKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJGU0MgCQkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBGU0MpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJDU1IgCQkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBDU1IpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJJQ0JfUklEIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBJQ0JfUklEKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiSUNCX0wgCQkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBJQ0JfTCkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIklDQl9IIAkJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgSUNCX0gpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJDRkcgCQkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBDRkcpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJCSU9TX0FERFIgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEJJT1NfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIlNUUyAJCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFNUUykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIklOVFJfRU4JCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgSU5UUl9FTikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIklOVFJfTUFTSyAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgSU5UUl9NQVNLKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiSVNSMSAJCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIElTUjEpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJJU1IyIAkJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgSVNSMikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIklTUjMgCQkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBJU1IzKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiSVNSNCAJCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIElTUjQpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJSRVZfSUQgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFJFVl9JRCkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkZSQ19FQ0NfRVJSIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBGUkNfRUNDX0VSUikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUl9TVFMgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEVSUl9TVFMpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJSQU1fREJHX0FERFIgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFJBTV9EQkdfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIlJBTV9EQkdfREFUQSAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgUkFNX0RCR19EQVRBKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiRUNDX0VSUl9DTlQgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEVDQ19FUlJfQ05UKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiU0VNIAkJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgU0VNKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiR1BJT18xIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBHUElPXzEpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJHUElPXzIgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEdQSU9fMikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkdQSU9fMyAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgR1BJT18zKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiWEdNQUNfQUREUiAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgWEdNQUNfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIlhHTUFDX0RBVEEgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFhHTUFDX0RBVEEpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJOSUNfRVRTIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBOSUNfRVRTKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ05BX0VUUyAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ05BX0VUUykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkZMQVNIX0FERFIgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEZMQVNIX0FERFIpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJGTEFTSF9EQVRBIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBGTEFTSF9EQVRBKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ1FfU1RPUCAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ1FfU1RPUCkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIlBBR0VfVEJMX1JJRCAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgUEFHRV9UQkxfUklEKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiV1FfUEFHRV9UQkxfTE8gCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgV1FfUEFHRV9UQkxfTE8pKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJXUV9QQUdFX1RCTF9ISSAJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBXUV9QQUdFX1RCTF9ISSkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkNRX1BBR0VfVEJMX0xPIAkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIENRX1BBR0VfVEJMX0xPKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ1FfUEFHRV9UQkxfSEkgCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ1FfUEFHRV9UQkxfSEkpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJDT1NfREZMVF9DUTEgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIENPU19ERkxUX0NRMSkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkNPU19ERkxUX0NRMiAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ09TX0RGTFRfQ1EyKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiU1BMVF9IRFIgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFNQTFRfSERSKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkNfUEFVU0VfVEhSRVMgCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgRkNfUEFVU0VfVEhSRVMpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJOSUNfUEFVU0VfVEhSRVMgCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgTklDX1BBVVNFX1RIUkVTKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkNfRVRIRVJUWVBFIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBGQ19FVEhFUlRZUEUpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJGQ19SQ1ZfQ0ZHIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBGQ19SQ1ZfQ0ZHKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiTklDX1JDVl9DRkcgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIE5JQ19SQ1ZfQ0ZHKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkNfQ09TX1RBR1MgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEZDX0NPU19UQUdTKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiTklDX0NPU19UQUdTIAkJCT0gMHgleC5cbiIsCi0JICAgICAgIHFsX3JlYWQzMihxZGV2LCBOSUNfQ09TX1RBR1MpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJNR01UX1JDVl9DRkcgCQkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIE1HTVRfUkNWX0NGRykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIlhHX1NFUkRFU19BRERSIAkJPSAweCV4LlxuIiwKLQkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFhHX1NFUkRFU19BRERSKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiWEdfU0VSREVTX0RBVEEgCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgWEdfU0VSREVTX0RBVEEpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJQUkJfTVhfQUREUiAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgUFJCX01YX0FERFIpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJQUkJfTVhfREFUQSAJCQk9IDB4JXguXG4iLAotCSAgICAgICBxbF9yZWFkMzIocWRldiwgUFJCX01YX0RBVEEpKTsKKwlwcl9lcnIoInJlZyBkdW1wIGZvciBmdW5jdGlvbiAjJWRcbiIsIHFkZXYtPmZ1bmMpOworCURVTVBfUkVHKHFkZXYsIFNZUyk7CisJRFVNUF9SRUcocWRldiwgUlNUX0ZPKTsKKwlEVU1QX1JFRyhxZGV2LCBGU0MpOworCURVTVBfUkVHKHFkZXYsIENTUik7CisJRFVNUF9SRUcocWRldiwgSUNCX1JJRCk7CisJRFVNUF9SRUcocWRldiwgSUNCX0wpOworCURVTVBfUkVHKHFkZXYsIElDQl9IKTsKKwlEVU1QX1JFRyhxZGV2LCBDRkcpOworCURVTVBfUkVHKHFkZXYsIEJJT1NfQUREUik7CisJRFVNUF9SRUcocWRldiwgU1RTKTsKKwlEVU1QX1JFRyhxZGV2LCBJTlRSX0VOKTsKKwlEVU1QX1JFRyhxZGV2LCBJTlRSX01BU0spOworCURVTVBfUkVHKHFkZXYsIElTUjEpOworCURVTVBfUkVHKHFkZXYsIElTUjIpOworCURVTVBfUkVHKHFkZXYsIElTUjMpOworCURVTVBfUkVHKHFkZXYsIElTUjQpOworCURVTVBfUkVHKHFkZXYsIFJFVl9JRCk7CisJRFVNUF9SRUcocWRldiwgRlJDX0VDQ19FUlIpOworCURVTVBfUkVHKHFkZXYsIEVSUl9TVFMpOworCURVTVBfUkVHKHFkZXYsIFJBTV9EQkdfQUREUik7CisJRFVNUF9SRUcocWRldiwgUkFNX0RCR19EQVRBKTsKKwlEVU1QX1JFRyhxZGV2LCBFQ0NfRVJSX0NOVCk7CisJRFVNUF9SRUcocWRldiwgU0VNKTsKKwlEVU1QX1JFRyhxZGV2LCBHUElPXzEpOworCURVTVBfUkVHKHFkZXYsIEdQSU9fMik7CisJRFVNUF9SRUcocWRldiwgR1BJT18zKTsKKwlEVU1QX1JFRyhxZGV2LCBYR01BQ19BRERSKTsKKwlEVU1QX1JFRyhxZGV2LCBYR01BQ19EQVRBKTsKKwlEVU1QX1JFRyhxZGV2LCBOSUNfRVRTKTsKKwlEVU1QX1JFRyhxZGV2LCBDTkFfRVRTKTsKKwlEVU1QX1JFRyhxZGV2LCBGTEFTSF9BRERSKTsKKwlEVU1QX1JFRyhxZGV2LCBGTEFTSF9EQVRBKTsKKwlEVU1QX1JFRyhxZGV2LCBDUV9TVE9QKTsKKwlEVU1QX1JFRyhxZGV2LCBQQUdFX1RCTF9SSUQpOworCURVTVBfUkVHKHFkZXYsIFdRX1BBR0VfVEJMX0xPKTsKKwlEVU1QX1JFRyhxZGV2LCBXUV9QQUdFX1RCTF9ISSk7CisJRFVNUF9SRUcocWRldiwgQ1FfUEFHRV9UQkxfTE8pOworCURVTVBfUkVHKHFkZXYsIENRX1BBR0VfVEJMX0hJKTsKKwlEVU1QX1JFRyhxZGV2LCBDT1NfREZMVF9DUTEpOworCURVTVBfUkVHKHFkZXYsIENPU19ERkxUX0NRMik7CisJRFVNUF9SRUcocWRldiwgU1BMVF9IRFIpOworCURVTVBfUkVHKHFkZXYsIEZDX1BBVVNFX1RIUkVTKTsKKwlEVU1QX1JFRyhxZGV2LCBOSUNfUEFVU0VfVEhSRVMpOworCURVTVBfUkVHKHFkZXYsIEZDX0VUSEVSVFlQRSk7CisJRFVNUF9SRUcocWRldiwgRkNfUkNWX0NGRyk7CisJRFVNUF9SRUcocWRldiwgTklDX1JDVl9DRkcpOworCURVTVBfUkVHKHFkZXYsIEZDX0NPU19UQUdTKTsKKwlEVU1QX1JFRyhxZGV2LCBOSUNfQ09TX1RBR1MpOworCURVTVBfUkVHKHFkZXYsIE1HTVRfUkNWX0NGRyk7CisJRFVNUF9SRUcocWRldiwgWEdfU0VSREVTX0FERFIpOworCURVTVBfUkVHKHFkZXYsIFhHX1NFUkRFU19EQVRBKTsKKwlEVU1QX1JFRyhxZGV2LCBQUkJfTVhfQUREUik7CisJRFVNUF9SRUcocWRldiwgUFJCX01YX0RBVEEpOwogCXFsX2R1bXBfaW50cl9zdGF0ZXMocWRldik7CiAJcWxfZHVtcF94Z21hY19jb250cm9sX3JlZ3MocWRldik7CiAJcWxfZHVtcF9ldHNfcmVncyhxZGV2KTsKQEAgLTE2MTMsMTkxICsxNTI2LDEyNCBAQAogI2VuZGlmCiAKICNpZmRlZiBRTF9TVEFUX0RVTVAKKworI2RlZmluZSBEVU1QX1NUQVQocWRldiwgc3RhdCkJXAorCXByX2VycigiJXMgPSAlbGRcbiIsICNzdGF0LCAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMuc3RhdCkKKwogdm9pZCBxbF9kdW1wX3N0YXQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCiB7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogRW50ZXIuXG4iLCBfX2Z1bmNfXyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF9wa3RzID0gJWxkXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF9ieXRlcyA9ICVsZFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnR4X2J5dGVzKTsKLQlwcmludGsoS0VSTl9FUlIgInR4X21jYXN0X3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfbWNhc3RfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF9iY2FzdF9wa3RzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnR4X2JjYXN0X3BrdHMpOwotCXByaW50ayhLRVJOX0VSUiAidHhfdWNhc3RfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF91Y2FzdF9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInR4X2N0bF9wa3RzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnR4X2N0bF9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInR4X3BhdXNlX3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfcGF1c2VfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF82NF9wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfNjRfcGt0KTsKLQlwcmludGsoS0VSTl9FUlIgInR4XzY1X3RvXzEyN19wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfNjVfdG9fMTI3X3BrdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF8xMjhfdG9fMjU1X3BrdCA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF8xMjhfdG9fMjU1X3BrdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF8yNTZfNTExX3BrdCA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF8yNTZfNTExX3BrdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF81MTJfdG9fMTAyM19wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfNTEyX3RvXzEwMjNfcGt0KTsKLQlwcmludGsoS0VSTl9FUlIgInR4XzEwMjRfdG9fMTUxOF9wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfMTAyNF90b18xNTE4X3BrdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF8xNTE5X3RvX21heF9wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfMTUxOV90b19tYXhfcGt0KTsKLQlwcmludGsoS0VSTl9FUlIgInR4X3VuZGVyc2l6ZV9wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfdW5kZXJzaXplX3BrdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0eF9vdmVyc2l6ZV9wa3QgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfb3ZlcnNpemVfcGt0KTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X2J5dGVzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X2J5dGVzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X2J5dGVzX29rID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X2J5dGVzX29rKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF9wa3RzX29rID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X3BrdHNfb2spOwotCXByaW50ayhLRVJOX0VSUiAicnhfYmNhc3RfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9iY2FzdF9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X21jYXN0X3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfbWNhc3RfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF91Y2FzdF9wa3RzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X3VjYXN0X3BrdHMpOwotCXByaW50ayhLRVJOX0VSUiAicnhfdW5kZXJzaXplX3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfdW5kZXJzaXplX3BrdHMpOwotCXByaW50ayhLRVJOX0VSUiAicnhfb3ZlcnNpemVfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9vdmVyc2l6ZV9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X2phYmJlcl9wa3RzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X2phYmJlcl9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X3VuZGVyc2l6ZV9mY2Vycl9wa3RzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X3VuZGVyc2l6ZV9mY2Vycl9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X2Ryb3BfZXZlbnRzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X2Ryb3BfZXZlbnRzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X2ZjZXJyX3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfZmNlcnJfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF9hbGlnbl9lcnIgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfYWxpZ25fZXJyKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4X3N5bWJvbF9lcnIgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfc3ltYm9sX2Vycik7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF9tYWNfZXJyID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X21hY19lcnIpOwotCXByaW50ayhLRVJOX0VSUiAicnhfY3RsX3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfY3RsX3BrdHMpOwotCXByaW50ayhLRVJOX0VSUiAicnhfcGF1c2VfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9wYXVzZV9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4XzY0X3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfNjRfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF82NV90b18xMjdfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF82NV90b18xMjdfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF8xMjhfMjU1X3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfMTI4XzI1NV9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4XzI1Nl81MTFfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF8yNTZfNTExX3BrdHMpOwotCXByaW50ayhLRVJOX0VSUiAicnhfNTEyX3RvXzEwMjNfcGt0cyA9ICVsZC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF81MTJfdG9fMTAyM19wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4XzEwMjRfdG9fMTUxOF9wa3RzID0gJWxkLlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4XzEwMjRfdG9fMTUxOF9wa3RzKTsKLQlwcmludGsoS0VSTl9FUlIgInJ4XzE1MTlfdG9fbWF4X3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfMTUxOV90b19tYXhfcGt0cyk7Ci0JcHJpbnRrKEtFUk5fRVJSICJyeF9sZW5fZXJyX3BrdHMgPSAlbGQuXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfbGVuX2Vycl9wa3RzKTsKKwlwcl9lcnIoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOworCURVTVBfU1RBVChxZGV2LCB0eF9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgdHhfYnl0ZXMpOworCURVTVBfU1RBVChxZGV2LCB0eF9tY2FzdF9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgdHhfYmNhc3RfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHR4X3VjYXN0X3BrdHMpOworCURVTVBfU1RBVChxZGV2LCB0eF9jdGxfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHR4X3BhdXNlX3BrdHMpOworCURVTVBfU1RBVChxZGV2LCB0eF82NF9wa3QpOworCURVTVBfU1RBVChxZGV2LCB0eF82NV90b18xMjdfcGt0KTsKKwlEVU1QX1NUQVQocWRldiwgdHhfMTI4X3RvXzI1NV9wa3QpOworCURVTVBfU1RBVChxZGV2LCB0eF8yNTZfNTExX3BrdCk7CisJRFVNUF9TVEFUKHFkZXYsIHR4XzUxMl90b18xMDIzX3BrdCk7CisJRFVNUF9TVEFUKHFkZXYsIHR4XzEwMjRfdG9fMTUxOF9wa3QpOworCURVTVBfU1RBVChxZGV2LCB0eF8xNTE5X3RvX21heF9wa3QpOworCURVTVBfU1RBVChxZGV2LCB0eF91bmRlcnNpemVfcGt0KTsKKwlEVU1QX1NUQVQocWRldiwgdHhfb3ZlcnNpemVfcGt0KTsKKwlEVU1QX1NUQVQocWRldiwgcnhfYnl0ZXMpOworCURVTVBfU1RBVChxZGV2LCByeF9ieXRlc19vayk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4X3BrdHMpOworCURVTVBfU1RBVChxZGV2LCByeF9wa3RzX29rKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfYmNhc3RfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4X21jYXN0X3BrdHMpOworCURVTVBfU1RBVChxZGV2LCByeF91Y2FzdF9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfdW5kZXJzaXplX3BrdHMpOworCURVTVBfU1RBVChxZGV2LCByeF9vdmVyc2l6ZV9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfamFiYmVyX3BrdHMpOworCURVTVBfU1RBVChxZGV2LCByeF91bmRlcnNpemVfZmNlcnJfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4X2Ryb3BfZXZlbnRzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfZmNlcnJfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4X2FsaWduX2Vycik7CisJRFVNUF9TVEFUKHFkZXYsIHJ4X3N5bWJvbF9lcnIpOworCURVTVBfU1RBVChxZGV2LCByeF9tYWNfZXJyKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfY3RsX3BrdHMpOworCURVTVBfU1RBVChxZGV2LCByeF9wYXVzZV9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfNjRfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4XzY1X3RvXzEyN19wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfMTI4XzI1NV9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfMjU2XzUxMV9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfNTEyX3RvXzEwMjNfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4XzEwMjRfdG9fMTUxOF9wa3RzKTsKKwlEVU1QX1NUQVQocWRldiwgcnhfMTUxOV90b19tYXhfcGt0cyk7CisJRFVNUF9TVEFUKHFkZXYsIHJ4X2xlbl9lcnJfcGt0cyk7CiB9OwogI2VuZGlmCiAKICNpZmRlZiBRTF9ERVZfRFVNUAorCisjZGVmaW5lIERVTVBfUURFVl9GSUVMRChxZGV2LCB0eXBlLCBmaWVsZCkJCVwKKwlwcl9lcnIoInFkZXYtPiUtMjRzID0gIiB0eXBlICJcbiIsICNmaWVsZCwgcWRldi0+ZmllbGQpCisjZGVmaW5lIERVTVBfUURFVl9ETUFfRklFTEQocWRldiwgZmllbGQpCQlcCisJcHJfZXJyKCJxZGV2LT4lLTI0cyA9ICVsbHhcbiIsICNmaWVsZCwgKHVuc2lnbmVkIGxvbmcgbG9uZylxZGV2LT5maWVsZCkKKyNkZWZpbmUgRFVNUF9RREVWX0FSUkFZKHFkZXYsIHR5cGUsIGFycmF5LCBpbmRleCwgZmllbGQpIFwKKwlwcl9lcnIoIiVzWyVkXS4lcyA9ICIgdHlwZSAiXG4iLAkJIFwKKwkgICAgICAgI2FycmF5LCBpbmRleCwgI2ZpZWxkLCBxZGV2LT5hcnJheVtpbmRleF0uZmllbGQpOwogdm9pZCBxbF9kdW1wX3FkZXYoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCiB7CiAJaW50IGk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+ZmxhZ3MgCQkJPSAlbHguXG4iLAotCSAgICAgICBxZGV2LT5mbGFncyk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+dmxncnAgCQkJPSAlcC5cbiIsCi0JICAgICAgIHFkZXYtPnZsZ3JwKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5wZGV2IAkJCT0gJXAuXG4iLAotCSAgICAgICBxZGV2LT5wZGV2KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5uZGV2IAkJCT0gJXAuXG4iLAotCSAgICAgICBxZGV2LT5uZGV2KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5jaGlwX3Jldl9pZCAJCT0gJWQuXG4iLAotCSAgICAgICBxZGV2LT5jaGlwX3Jldl9pZCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cmVnX2Jhc2UgCQk9ICVwLlxuIiwKLQkgICAgICAgcWRldi0+cmVnX2Jhc2UpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPmRvb3JiZWxsX2FyZWEgCT0gJXAuXG4iLAotCSAgICAgICBxZGV2LT5kb29yYmVsbF9hcmVhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5kb29yYmVsbF9hcmVhX3NpemUgCT0gJWQuXG4iLAotCSAgICAgICBxZGV2LT5kb29yYmVsbF9hcmVhX3NpemUpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIm1zZ19lbmFibGUgCQk9ICV4LlxuIiwKLQkgICAgICAgcWRldi0+bXNnX2VuYWJsZSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cnhfcmluZ19zaGFkb3dfcmVnX2FyZWEJPSAlcC5cbiIsCi0JICAgICAgIHFkZXYtPnJ4X3Jpbmdfc2hhZG93X3JlZ19hcmVhKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfZG1hIAk9ICVsbHguXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfZG1hKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfYXJlYQk9ICVwLlxuIiwKLQkgICAgICAgcWRldi0+dHhfcmluZ19zaGFkb3dfcmVnX2FyZWEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnR4X3Jpbmdfc2hhZG93X3JlZ19kbWEJPSAlbGx4LlxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcWRldi0+dHhfcmluZ19zaGFkb3dfcmVnX2RtYSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+aW50cl9jb3VudCAJCT0gJWQuXG4iLAotCSAgICAgICBxZGV2LT5pbnRyX2NvdW50KTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVseCIsIGZsYWdzKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVwIiwgdmxncnApOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJXAiLCBwZGV2KTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVwIiwgbmRldik7CisJRFVNUF9RREVWX0ZJRUxEKHFkZXYsICIlZCIsIGNoaXBfcmV2X2lkKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVwIiwgcmVnX2Jhc2UpOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJXAiLCBkb29yYmVsbF9hcmVhKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVkIiwgZG9vcmJlbGxfYXJlYV9zaXplKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiV4IiwgbXNnX2VuYWJsZSk7CisJRFVNUF9RREVWX0ZJRUxEKHFkZXYsICIlcCIsIHJ4X3Jpbmdfc2hhZG93X3JlZ19hcmVhKTsKKwlEVU1QX1FERVZfRE1BX0ZJRUxEKHFkZXYsIHJ4X3Jpbmdfc2hhZG93X3JlZ19kbWEpOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJXAiLCB0eF9yaW5nX3NoYWRvd19yZWdfYXJlYSk7CisJRFVNUF9RREVWX0RNQV9GSUVMRChxZGV2LCB0eF9yaW5nX3NoYWRvd19yZWdfZG1hKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVkIiwgaW50cl9jb3VudCk7CiAJaWYgKHFkZXYtPm1zaV94X2VudHJ5KQogCQlmb3IgKGkgPSAwOyBpIDwgcWRldi0+aW50cl9jb3VudDsgaSsrKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCQkgICAgICAgIm1zaV94X2VudHJ5LlslZF12ZWN0b3IJPSAlZC5cbiIsIGksCi0JCQkgICAgICAgcWRldi0+bXNpX3hfZW50cnlbaV0udmVjdG9yKTsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJCSAgICAgICAibXNpX3hfZW50cnkuWyVkXWVudHJ5CT0gJWQuXG4iLCBpLAotCQkJICAgICAgIHFkZXYtPm1zaV94X2VudHJ5W2ldLmVudHJ5KTsKKwkJCURVTVBfUURFVl9BUlJBWShxZGV2LCAiJWQiLCBtc2lfeF9lbnRyeSwgaSwgdmVjdG9yKTsKKwkJCURVTVBfUURFVl9BUlJBWShxZGV2LCAiJWQiLCBtc2lfeF9lbnRyeSwgaSwgZW50cnkpOwogCQl9CiAJZm9yIChpID0gMDsgaSA8IHFkZXYtPmludHJfY291bnQ7IGkrKykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiaW50cl9jb250ZXh0WyVkXS5xZGV2CQk9ICVwLlxuIiwgaSwKLQkJICAgICAgIHFkZXYtPmludHJfY29udGV4dFtpXS5xZGV2KTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgImludHJfY29udGV4dFslZF0uaW50cgkJPSAlZC5cbiIsIGksCi0JCSAgICAgICBxZGV2LT5pbnRyX2NvbnRleHRbaV0uaW50cik7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlgKLQkJICAgICAgICJpbnRyX2NvbnRleHRbJWRdLmhvb2tlZAkJPSAlZC5cbiIsIGksCi0JCSAgICAgICBxZGV2LT5pbnRyX2NvbnRleHRbaV0uaG9va2VkKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgImludHJfY29udGV4dFslZF0uaW50cl9lbl9tYXNrCT0gMHglMDh4LlxuIiwgaSwKLQkJICAgICAgIHFkZXYtPmludHJfY29udGV4dFtpXS5pbnRyX2VuX21hc2spOwotCQlwcmludGsoS0VSTl9FUlIgUEZYCi0JCSAgICAgICAiaW50cl9jb250ZXh0WyVkXS5pbnRyX2Rpc19tYXNrCT0gMHglMDh4LlxuIiwgaSwKLQkJICAgICAgIHFkZXYtPmludHJfY29udGV4dFtpXS5pbnRyX2Rpc19tYXNrKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkgICAgICAgImludHJfY29udGV4dFslZF0uaW50cl9yZWFkX21hc2sJPSAweCUwOHguXG4iLCBpLAotCQkgICAgICAgcWRldi0+aW50cl9jb250ZXh0W2ldLmludHJfcmVhZF9tYXNrKTsKKwkJRFVNUF9RREVWX0FSUkFZKHFkZXYsICIlcCIsIGludHJfY29udGV4dCwgaSwgcWRldik7CisJCURVTVBfUURFVl9BUlJBWShxZGV2LCAiJWQiLCBpbnRyX2NvbnRleHQsIGksIGludHIpOworCQlEVU1QX1FERVZfQVJSQVkocWRldiwgIiVkIiwgaW50cl9jb250ZXh0LCBpLCBob29rZWQpOworCQlEVU1QX1FERVZfQVJSQVkocWRldiwgIjB4JTA4eCIsIGludHJfY29udGV4dCwgaSwgaW50cl9lbl9tYXNrKTsKKwkJRFVNUF9RREVWX0FSUkFZKHFkZXYsICIweCUwOHgiLCBpbnRyX2NvbnRleHQsIGksIGludHJfZGlzX21hc2spOworCQlEVU1QX1FERVZfQVJSQVkocWRldiwgIjB4JTA4eCIsIGludHJfY29udGV4dCwgaSwgaW50cl9yZWFkX21hc2spOwogCX0KLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT50eF9yaW5nX2NvdW50ID0gJWQuXG4iLCBxZGV2LT50eF9yaW5nX2NvdW50KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5yeF9yaW5nX2NvdW50ID0gJWQuXG4iLCBxZGV2LT5yeF9yaW5nX2NvdW50KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5yaW5nX21lbV9zaXplID0gJWQuXG4iLCBxZGV2LT5yaW5nX21lbV9zaXplKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5yaW5nX21lbSAJPSAlcC5cbiIsIHFkZXYtPnJpbmdfbWVtKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5pbnRyX2NvdW50IAk9ICVkLlxuIiwgcWRldi0+aW50cl9jb3VudCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+dHhfcmluZwkJPSAlcC5cbiIsCi0JICAgICAgIHFkZXYtPnR4X3JpbmcpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJzc19yaW5nX2NvdW50IAk9ICVkLlxuIiwKLQkgICAgICAgcWRldi0+cnNzX3JpbmdfY291bnQpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJ4X3JpbmcJPSAlcC5cbiIsIHFkZXYtPnJ4X3JpbmcpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPmRlZmF1bHRfcnhfcXVldWUJPSAlZC5cbiIsCi0JICAgICAgIHFkZXYtPmRlZmF1bHRfcnhfcXVldWUpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnhnX3NlbV9tYXNrCQk9IDB4JTA4eC5cbiIsCi0JICAgICAgIHFkZXYtPnhnX3NlbV9tYXNrKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5wb3J0X2xpbmtfdXAJCT0gMHglMDh4LlxuIiwKLQkgICAgICAgcWRldi0+cG9ydF9saW5rX3VwKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5wb3J0X2luaXQJCT0gMHglMDh4LlxuIiwKLQkgICAgICAgcWRldi0+cG9ydF9pbml0KTsKLQorCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJWQiLCB0eF9yaW5nX2NvdW50KTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVkIiwgcnhfcmluZ19jb3VudCk7CisJRFVNUF9RREVWX0ZJRUxEKHFkZXYsICIlZCIsIHJpbmdfbWVtX3NpemUpOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJXAiLCByaW5nX21lbSk7CisJRFVNUF9RREVWX0ZJRUxEKHFkZXYsICIlZCIsIGludHJfY291bnQpOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJXAiLCB0eF9yaW5nKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVkIiwgcnNzX3JpbmdfY291bnQpOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiJXAiLCByeF9yaW5nKTsKKwlEVU1QX1FERVZfRklFTEQocWRldiwgIiVkIiwgZGVmYXVsdF9yeF9xdWV1ZSk7CisJRFVNUF9RREVWX0ZJRUxEKHFkZXYsICIweCUwOHgiLCB4Z19zZW1fbWFzayk7CisJRFVNUF9RREVWX0ZJRUxEKHFkZXYsICIweCUwOHgiLCBwb3J0X2xpbmtfdXApOworCURVTVBfUURFVl9GSUVMRChxZGV2LCAiMHglMDh4IiwgcG9ydF9pbml0KTsKIH0KICNlbmRpZgogCiAjaWZkZWYgUUxfQ0JfRFVNUAogdm9pZCBxbF9kdW1wX3dxaWNiKHN0cnVjdCB3cWljYiAqd3FpY2IpCiB7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiRHVtcGluZyB3cWljYiBzdHVmZi4uLlxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPmxlbiA9IDB4JXguXG4iLCBsZTE2X3RvX2NwdSh3cWljYi0+bGVuKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPmZsYWdzID0gJXguXG4iLCBsZTE2X3RvX2NwdSh3cWljYi0+ZmxhZ3MpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ3cWljYi0+Y3FfaWRfcnNzID0gJWQuXG4iLAorCXByX2VycigiRHVtcGluZyB3cWljYiBzdHVmZi4uLlxuIik7CisJcHJfZXJyKCJ3cWljYi0+bGVuID0gMHgleFxuIiwgbGUxNl90b19jcHUod3FpY2ItPmxlbikpOworCXByX2Vycigid3FpY2ItPmZsYWdzID0gJXhcbiIsIGxlMTZfdG9fY3B1KHdxaWNiLT5mbGFncykpOworCXByX2Vycigid3FpY2ItPmNxX2lkX3JzcyA9ICVkXG4iLAogCSAgICAgICBsZTE2X3RvX2NwdSh3cWljYi0+Y3FfaWRfcnNzKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPnJpZCA9IDB4JXguXG4iLCBsZTE2X3RvX2NwdSh3cWljYi0+cmlkKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPndxX2FkZHIgPSAweCVsbHguXG4iLAorCXByX2Vycigid3FpY2ItPnJpZCA9IDB4JXhcbiIsIGxlMTZfdG9fY3B1KHdxaWNiLT5yaWQpKTsKKwlwcl9lcnIoIndxaWNiLT53cV9hZGRyID0gMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdSh3cWljYi0+YWRkcikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT53cV9jbnNtcl9pZHhfYWRkciA9IDB4JWxseC5cbiIsCisJcHJfZXJyKCJ3cWljYi0+d3FfY25zbXJfaWR4X2FkZHIgPSAweCVsbHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KHdxaWNiLT5jbnNtcl9pZHhfYWRkcikpOwogfQogCkBAIC0xODA1LDQwICsxNjUxLDM0IEBACiB7CiAJaWYgKHR4X3JpbmcgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXByaW50ayhLRVJOX0VSUiBQRlgKLQkgICAgICAgIj09PT09PT09PT09PT09PT09PT09PSBEdW1waW5nIHR4X3JpbmcgJWQgPT09PT09PT09PT09PT09LlxuIiwKKwlwcl9lcnIoIj09PT09PT09PT09PT09PT09PT09PSBEdW1waW5nIHR4X3JpbmcgJWQgPT09PT09PT09PT09PT09XG4iLAogCSAgICAgICB0eF9yaW5nLT53cV9pZCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+YmFzZSA9ICVwLlxuIiwgdHhfcmluZy0+d3FfYmFzZSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+YmFzZV9kbWEgPSAweCVsbHguXG4iLAorCXByX2VycigidHhfcmluZy0+YmFzZSA9ICVwXG4iLCB0eF9yaW5nLT53cV9iYXNlKTsKKwlwcl9lcnIoInR4X3JpbmctPmJhc2VfZG1hID0gMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eF9yaW5nLT53cV9iYXNlX2RtYSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWAotCSAgICAgICAidHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZywgYWRkciA9IDB4JXAsIHZhbHVlID0gJWQuXG4iLAorCXByX2VycigidHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZywgYWRkciA9IDB4JXAsIHZhbHVlID0gJWRcbiIsCiAJICAgICAgIHR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWcsCiAJICAgICAgIHR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWcKIAkJCT8gcWxfcmVhZF9zaF9yZWcodHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZykgOiAwKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5zaXplID0gJWQuXG4iLCB0eF9yaW5nLT53cV9zaXplKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5sZW4gPSAlZC5cbiIsIHR4X3JpbmctPndxX2xlbik7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+cHJvZF9pZHhfZGJfcmVnID0gJXAuXG4iLAotCSAgICAgICB0eF9yaW5nLT5wcm9kX2lkeF9kYl9yZWcpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInR4X3JpbmctPnZhbGlkX2RiX3JlZyA9ICVwLlxuIiwKLQkgICAgICAgdHhfcmluZy0+dmFsaWRfZGJfcmVnKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5wcm9kX2lkeCA9ICVkLlxuIiwgdHhfcmluZy0+cHJvZF9pZHgpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInR4X3JpbmctPmNxX2lkID0gJWQuXG4iLCB0eF9yaW5nLT5jcV9pZCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+d3FfaWQgPSAlZC5cbiIsIHR4X3JpbmctPndxX2lkKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5xID0gJXAuXG4iLCB0eF9yaW5nLT5xKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT50eF9jb3VudCA9ICVkLlxuIiwKLQkgICAgICAgYXRvbWljX3JlYWQoJnR4X3JpbmctPnR4X2NvdW50KSk7CisJcHJfZXJyKCJ0eF9yaW5nLT5zaXplID0gJWRcbiIsIHR4X3JpbmctPndxX3NpemUpOworCXByX2VycigidHhfcmluZy0+bGVuID0gJWRcbiIsIHR4X3JpbmctPndxX2xlbik7CisJcHJfZXJyKCJ0eF9yaW5nLT5wcm9kX2lkeF9kYl9yZWcgPSAlcFxuIiwgdHhfcmluZy0+cHJvZF9pZHhfZGJfcmVnKTsKKwlwcl9lcnIoInR4X3JpbmctPnZhbGlkX2RiX3JlZyA9ICVwXG4iLCB0eF9yaW5nLT52YWxpZF9kYl9yZWcpOworCXByX2VycigidHhfcmluZy0+cHJvZF9pZHggPSAlZFxuIiwgdHhfcmluZy0+cHJvZF9pZHgpOworCXByX2VycigidHhfcmluZy0+Y3FfaWQgPSAlZFxuIiwgdHhfcmluZy0+Y3FfaWQpOworCXByX2VycigidHhfcmluZy0+d3FfaWQgPSAlZFxuIiwgdHhfcmluZy0+d3FfaWQpOworCXByX2VycigidHhfcmluZy0+cSA9ICVwXG4iLCB0eF9yaW5nLT5xKTsKKwlwcl9lcnIoInR4X3JpbmctPnR4X2NvdW50ID0gJWRcbiIsIGF0b21pY19yZWFkKCZ0eF9yaW5nLT50eF9jb3VudCkpOwogfQogCiB2b2lkIHFsX2R1bXBfcmljYihzdHJ1Y3QgcmljYiAqcmljYikKIHsKIAlpbnQgaTsKLQlwcmludGsoS0VSTl9FUlIgUEZYCi0JICAgICAgICI9PT09PT09PT09PT09PT09PT09PT0gRHVtcGluZyByaWNiID09PT09PT09PT09PT09PS5cbiIpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkR1bXBpbmcgcmljYiBzdHVmZi4uLlxuIik7CisJcHJfZXJyKCI9PT09PT09PT09PT09PT09PT09PT0gRHVtcGluZyByaWNiID09PT09PT09PT09PT09PVxuIik7CisJcHJfZXJyKCJEdW1waW5nIHJpY2Igc3R1ZmYuLi5cbiIpOwogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicmljYi0+YmFzZV9jcSA9ICVkLlxuIiwgcmljYi0+YmFzZV9jcSAmIDB4MWYpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJpY2ItPmZsYWdzID0gJXMlcyVzJXMlcyVzJXMlcyVzLlxuIiwKKwlwcl9lcnIoInJpY2ItPmJhc2VfY3EgPSAlZFxuIiwgcmljYi0+YmFzZV9jcSAmIDB4MWYpOworCXByX2VycigicmljYi0+ZmxhZ3MgPSAlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCiAJICAgICAgIHJpY2ItPmJhc2VfY3EgJiBSU1NfTDRLID8gIlJTU19MNEsgIiA6ICIiLAogCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19MNksgPyAiUlNTX0w2SyAiIDogIiIsCiAJICAgICAgIHJpY2ItPmZsYWdzICYgUlNTX0xJID8gIlJTU19MSSAiIDogIiIsCkBAIC0xODQ4LDQ0ICsxNjg4LDQ0IEBACiAJICAgICAgIHJpY2ItPmZsYWdzICYgUlNTX1JUNCA/ICJSU1NfUlQ0ICIgOiAiIiwKIAkgICAgICAgcmljYi0+ZmxhZ3MgJiBSU1NfUkk2ID8gIlJTU19SSTYgIiA6ICIiLAogCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19SVDYgPyAiUlNTX1JUNiAiIDogIiIpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJpY2ItPm1hc2sgPSAweCUuMDR4LlxuIiwgbGUxNl90b19jcHUocmljYi0+bWFzaykpOworCXByX2VycigicmljYi0+bWFzayA9IDB4JS4wNHhcbiIsIGxlMTZfdG9fY3B1KHJpY2ItPm1hc2spKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmljYi0+aGFzaF9jcV9pZFslZF0gPSAweCUuMDh4LlxuIiwgaSwKKwkJcHJfZXJyKCJyaWNiLT5oYXNoX2NxX2lkWyVkXSA9IDB4JS4wOHhcbiIsIGksCiAJCSAgICAgICBsZTMyX3RvX2NwdShyaWNiLT5oYXNoX2NxX2lkW2ldKSk7CiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JCXByaW50ayhLRVJOX0VSUiBQRlggInJpY2ItPmlwdjZfaGFzaF9rZXlbJWRdID0gMHglLjA4eC5cbiIsIGksCisJCXByX2VycigicmljYi0+aXB2Nl9oYXNoX2tleVslZF0gPSAweCUuMDh4XG4iLCBpLAogCQkgICAgICAgbGUzMl90b19jcHUocmljYi0+aXB2Nl9oYXNoX2tleVtpXSkpOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCXByaW50ayhLRVJOX0VSUiBQRlggInJpY2ItPmlwdjRfaGFzaF9rZXlbJWRdID0gMHglLjA4eC5cbiIsIGksCisJCXByX2VycigicmljYi0+aXB2NF9oYXNoX2tleVslZF0gPSAweCUuMDh4XG4iLCBpLAogCQkgICAgICAgbGUzMl90b19jcHUocmljYi0+aXB2NF9oYXNoX2tleVtpXSkpOwogfQogCiB2b2lkIHFsX2R1bXBfY3FpY2Ioc3RydWN0IGNxaWNiICpjcWljYikKIHsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJEdW1waW5nIGNxaWNiIHN0dWZmLi4uXG4iKTsKKwlwcl9lcnIoIkR1bXBpbmcgY3FpY2Igc3R1ZmYuLi5cbiIpOwogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPm1zaXhfdmVjdCA9ICVkLlxuIiwgY3FpY2ItPm1zaXhfdmVjdCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmZsYWdzID0gJXguXG4iLCBjcWljYi0+ZmxhZ3MpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sZW4gPSAlZC5cbiIsIGxlMTZfdG9fY3B1KGNxaWNiLT5sZW4pKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+YWRkciA9IDB4JWxseC5cbiIsCisJcHJfZXJyKCJjcWljYi0+bXNpeF92ZWN0ID0gJWRcbiIsIGNxaWNiLT5tc2l4X3ZlY3QpOworCXByX2VycigiY3FpY2ItPmZsYWdzID0gJXhcbiIsIGNxaWNiLT5mbGFncyk7CisJcHJfZXJyKCJjcWljYi0+bGVuID0gJWRcbiIsIGxlMTZfdG9fY3B1KGNxaWNiLT5sZW4pKTsKKwlwcl9lcnIoImNxaWNiLT5hZGRyID0gMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShjcWljYi0+YWRkcikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5wcm9kX2lkeF9hZGRyID0gMHglbGx4LlxuIiwKKwlwcl9lcnIoImNxaWNiLT5wcm9kX2lkeF9hZGRyID0gMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShjcWljYi0+cHJvZF9pZHhfYWRkcikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5wa3RfZGVsYXkgPSAweCUuMDR4LlxuIiwKKwlwcl9lcnIoImNxaWNiLT5wa3RfZGVsYXkgPSAweCUuMDR4XG4iLAogCSAgICAgICBsZTE2X3RvX2NwdShjcWljYi0+cGt0X2RlbGF5KSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmlycV9kZWxheSA9IDB4JS4wNHguXG4iLAorCXByX2VycigiY3FpY2ItPmlycV9kZWxheSA9IDB4JS4wNHhcbiIsCiAJICAgICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5pcnFfZGVsYXkpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+bGJxX2FkZHIgPSAweCVsbHguXG4iLAorCXByX2VycigiY3FpY2ItPmxicV9hZGRyID0gMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShjcWljYi0+bGJxX2FkZHIpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+bGJxX2J1Zl9zaXplID0gMHglLjA0eC5cbiIsCisJcHJfZXJyKCJjcWljYi0+bGJxX2J1Zl9zaXplID0gMHglLjA0eFxuIiwKIAkgICAgICAgbGUxNl90b19jcHUoY3FpY2ItPmxicV9idWZfc2l6ZSkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sYnFfbGVuID0gMHglLjA0eC5cbiIsCisJcHJfZXJyKCJjcWljYi0+bGJxX2xlbiA9IDB4JS4wNHhcbiIsCiAJICAgICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5sYnFfbGVuKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPnNicV9hZGRyID0gMHglbGx4LlxuIiwKKwlwcl9lcnIoImNxaWNiLT5zYnFfYWRkciA9IDB4JWxseFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGU2NF90b19jcHUoY3FpY2ItPnNicV9hZGRyKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPnNicV9idWZfc2l6ZSA9IDB4JS4wNHguXG4iLAorCXByX2VycigiY3FpY2ItPnNicV9idWZfc2l6ZSA9IDB4JS4wNHhcbiIsCiAJICAgICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5zYnFfYnVmX3NpemUpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+c2JxX2xlbiA9IDB4JS4wNHguXG4iLAorCXByX2VycigiY3FpY2ItPnNicV9sZW4gPSAweCUuMDR4XG4iLAogCSAgICAgICBsZTE2X3RvX2NwdShjcWljYi0+c2JxX2xlbikpOwogfQogCkBAIC0xODkzLDEwMCArMTczMyw4NSBAQAogewogCWlmIChyeF9yaW5nID09IE5VTEwpCiAJCXJldHVybjsKLQlwcmludGsoS0VSTl9FUlIgUEZYCi0JICAgICAgICI9PT09PT09PT09PT09PT09PT09PT0gRHVtcGluZyByeF9yaW5nICVkID09PT09PT09PT09PT09PS5cbiIsCisJcHJfZXJyKCI9PT09PT09PT09PT09PT09PT09PT0gRHVtcGluZyByeF9yaW5nICVkID09PT09PT09PT09PT09PVxuIiwKIAkgICAgICAgcnhfcmluZy0+Y3FfaWQpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIkR1bXBpbmcgcnhfcmluZyAlZCwgdHlwZSA9ICVzJXMlcy5cbiIsCisJcHJfZXJyKCJEdW1waW5nIHJ4X3JpbmcgJWQsIHR5cGUgPSAlcyVzJXNcbiIsCiAJICAgICAgIHJ4X3JpbmctPmNxX2lkLCByeF9yaW5nLT50eXBlID09IERFRkFVTFRfUSA/ICJERUZBVUxUIiA6ICIiLAogCSAgICAgICByeF9yaW5nLT50eXBlID09IFRYX1EgPyAiT1VUQk9VTkQgQ09NUExFVElPTlMiIDogIiIsCiAJICAgICAgIHJ4X3JpbmctPnR5cGUgPT0gUlhfUSA/ICJJTkJPVU5EX0NPTVBMRVRJT05TIiA6ICIiKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcWljYiA9ICVwLlxuIiwgJnJ4X3JpbmctPmNxaWNiKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9iYXNlID0gJXAuXG4iLCByeF9yaW5nLT5jcV9iYXNlKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9iYXNlX2RtYSA9ICVsbHguXG4iLAorCXByX2VycigicnhfcmluZy0+Y3FpY2IgPSAlcFxuIiwgJnJ4X3JpbmctPmNxaWNiKTsKKwlwcl9lcnIoInJ4X3JpbmctPmNxX2Jhc2UgPSAlcFxuIiwgcnhfcmluZy0+Y3FfYmFzZSk7CisJcHJfZXJyKCJyeF9yaW5nLT5jcV9iYXNlX2RtYSA9ICVsbHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJ4X3JpbmctPmNxX2Jhc2VfZG1hKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9zaXplID0gJWQuXG4iLCByeF9yaW5nLT5jcV9zaXplKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9sZW4gPSAlZC5cbiIsIHJ4X3JpbmctPmNxX2xlbik7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWAotCSAgICAgICAicnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnLCBhZGRyID0gMHglcCwgdmFsdWUgPSAlZC5cbiIsCisJcHJfZXJyKCJyeF9yaW5nLT5jcV9zaXplID0gJWRcbiIsIHJ4X3JpbmctPmNxX3NpemUpOworCXByX2VycigicnhfcmluZy0+Y3FfbGVuID0gJWRcbiIsIHJ4X3JpbmctPmNxX2xlbik7CisJcHJfZXJyKCJyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcsIGFkZHIgPSAweCVwLCB2YWx1ZSA9ICVkXG4iLAogCSAgICAgICByeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcsCiAJICAgICAgIHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZwogCQkJPyBxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpIDogMCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnX2RtYSA9ICVsbHguXG4iLAorCXByX2VycigicnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnX2RtYSA9ICVsbHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZ19kbWEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmNuc21yX2lkeF9kYl9yZWcgPSAlcC5cbiIsCisJcHJfZXJyKCJyeF9yaW5nLT5jbnNtcl9pZHhfZGJfcmVnID0gJXBcbiIsCiAJICAgICAgIHJ4X3JpbmctPmNuc21yX2lkeF9kYl9yZWcpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmNuc21yX2lkeCA9ICVkLlxuIiwgcnhfcmluZy0+Y25zbXJfaWR4KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jdXJyX2VudHJ5ID0gJXAuXG4iLCByeF9yaW5nLT5jdXJyX2VudHJ5KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT52YWxpZF9kYl9yZWcgPSAlcC5cbiIsCi0JICAgICAgIHJ4X3JpbmctPnZhbGlkX2RiX3JlZyk7CisJcHJfZXJyKCJyeF9yaW5nLT5jbnNtcl9pZHggPSAlZFxuIiwgcnhfcmluZy0+Y25zbXJfaWR4KTsKKwlwcl9lcnIoInJ4X3JpbmctPmN1cnJfZW50cnkgPSAlcFxuIiwgcnhfcmluZy0+Y3Vycl9lbnRyeSk7CisJcHJfZXJyKCJyeF9yaW5nLT52YWxpZF9kYl9yZWcgPSAlcFxuIiwgcnhfcmluZy0+dmFsaWRfZGJfcmVnKTsKIAotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9iYXNlID0gJXAuXG4iLCByeF9yaW5nLT5sYnFfYmFzZSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX2Jhc2VfZG1hID0gJWxseC5cbiIsCisJcHJfZXJyKCJyeF9yaW5nLT5sYnFfYmFzZSA9ICVwXG4iLCByeF9yaW5nLT5sYnFfYmFzZSk7CisJcHJfZXJyKCJyeF9yaW5nLT5sYnFfYmFzZV9kbWEgPSAlbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSByeF9yaW5nLT5sYnFfYmFzZV9kbWEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0ID0gJXAuXG4iLAorCXByX2VycigicnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3QgPSAlcFxuIiwKIAkgICAgICAgcnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3QpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0X2RtYSA9ICVsbHguXG4iLAorCXByX2VycigicnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hID0gJWxseFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnEgPSAlcC5cbiIsIHJ4X3JpbmctPmxicSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX2xlbiA9ICVkLlxuIiwgcnhfcmluZy0+bGJxX2xlbik7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX3NpemUgPSAlZC5cbiIsIHJ4X3JpbmctPmxicV9zaXplKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnFfcHJvZF9pZHhfZGJfcmVnID0gJXAuXG4iLAorCXByX2VycigicnhfcmluZy0+bGJxID0gJXBcbiIsIHJ4X3JpbmctPmxicSk7CisJcHJfZXJyKCJyeF9yaW5nLT5sYnFfbGVuID0gJWRcbiIsIHJ4X3JpbmctPmxicV9sZW4pOworCXByX2VycigicnhfcmluZy0+bGJxX3NpemUgPSAlZFxuIiwgcnhfcmluZy0+bGJxX3NpemUpOworCXByX2VycigicnhfcmluZy0+bGJxX3Byb2RfaWR4X2RiX3JlZyA9ICVwXG4iLAogCSAgICAgICByeF9yaW5nLT5sYnFfcHJvZF9pZHhfZGJfcmVnKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnFfcHJvZF9pZHggPSAlZC5cbiIsCi0JICAgICAgIHJ4X3JpbmctPmxicV9wcm9kX2lkeCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX2N1cnJfaWR4ID0gJWQuXG4iLAotCSAgICAgICByeF9yaW5nLT5sYnFfY3Vycl9pZHgpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9jbGVhbl9pZHggPSAlZC5cbiIsCi0JICAgICAgIHJ4X3JpbmctPmxicV9jbGVhbl9pZHgpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9mcmVlX2NudCA9ICVkLlxuIiwKLQkgICAgICAgcnhfcmluZy0+bGJxX2ZyZWVfY250KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnFfYnVmX3NpemUgPSAlZC5cbiIsCi0JICAgICAgIHJ4X3JpbmctPmxicV9idWZfc2l6ZSk7CisJcHJfZXJyKCJyeF9yaW5nLT5sYnFfcHJvZF9pZHggPSAlZFxuIiwgcnhfcmluZy0+bGJxX3Byb2RfaWR4KTsKKwlwcl9lcnIoInJ4X3JpbmctPmxicV9jdXJyX2lkeCA9ICVkXG4iLCByeF9yaW5nLT5sYnFfY3Vycl9pZHgpOworCXByX2VycigicnhfcmluZy0+bGJxX2NsZWFuX2lkeCA9ICVkXG4iLCByeF9yaW5nLT5sYnFfY2xlYW5faWR4KTsKKwlwcl9lcnIoInJ4X3JpbmctPmxicV9mcmVlX2NudCA9ICVkXG4iLCByeF9yaW5nLT5sYnFfZnJlZV9jbnQpOworCXByX2VycigicnhfcmluZy0+bGJxX2J1Zl9zaXplID0gJWRcbiIsIHJ4X3JpbmctPmxicV9idWZfc2l6ZSk7CiAKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfYmFzZSA9ICVwLlxuIiwgcnhfcmluZy0+c2JxX2Jhc2UpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9iYXNlX2RtYSA9ICVsbHguXG4iLAorCXByX2VycigicnhfcmluZy0+c2JxX2Jhc2UgPSAlcFxuIiwgcnhfcmluZy0+c2JxX2Jhc2UpOworCXByX2VycigicnhfcmluZy0+c2JxX2Jhc2VfZG1hID0gJWxseFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnhfcmluZy0+c2JxX2Jhc2VfZG1hKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdCA9ICVwLlxuIiwKKwlwcl9lcnIoInJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0ID0gJXBcbiIsCiAJICAgICAgIHJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdF9kbWEgPSAlbGx4LlxuIiwKKwlwcl9lcnIoInJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0X2RtYSA9ICVsbHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0X2RtYSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxID0gJXAuXG4iLCByeF9yaW5nLT5zYnEpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9sZW4gPSAlZC5cbiIsIHJ4X3JpbmctPnNicV9sZW4pOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9zaXplID0gJWQuXG4iLCByeF9yaW5nLT5zYnFfc2l6ZSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxX3Byb2RfaWR4X2RiX3JlZyBhZGRyID0gJXAuXG4iLAorCXByX2VycigicnhfcmluZy0+c2JxID0gJXBcbiIsIHJ4X3JpbmctPnNicSk7CisJcHJfZXJyKCJyeF9yaW5nLT5zYnFfbGVuID0gJWRcbiIsIHJ4X3JpbmctPnNicV9sZW4pOworCXByX2VycigicnhfcmluZy0+c2JxX3NpemUgPSAlZFxuIiwgcnhfcmluZy0+c2JxX3NpemUpOworCXByX2VycigicnhfcmluZy0+c2JxX3Byb2RfaWR4X2RiX3JlZyBhZGRyID0gJXBcbiIsCiAJICAgICAgIHJ4X3JpbmctPnNicV9wcm9kX2lkeF9kYl9yZWcpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9wcm9kX2lkeCA9ICVkLlxuIiwKLQkgICAgICAgcnhfcmluZy0+c2JxX3Byb2RfaWR4KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfY3Vycl9pZHggPSAlZC5cbiIsCi0JICAgICAgIHJ4X3JpbmctPnNicV9jdXJyX2lkeCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxX2NsZWFuX2lkeCA9ICVkLlxuIiwKLQkgICAgICAgcnhfcmluZy0+c2JxX2NsZWFuX2lkeCk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxX2ZyZWVfY250ID0gJWQuXG4iLAotCSAgICAgICByeF9yaW5nLT5zYnFfZnJlZV9jbnQpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9idWZfc2l6ZSA9ICVkLlxuIiwKLQkgICAgICAgcnhfcmluZy0+c2JxX2J1Zl9zaXplKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9pZCA9ICVkLlxuIiwgcnhfcmluZy0+Y3FfaWQpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmlycSA9ICVkLlxuIiwgcnhfcmluZy0+aXJxKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcHUgPSAlZC5cbiIsIHJ4X3JpbmctPmNwdSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+cWRldiA9ICVwLlxuIiwgcnhfcmluZy0+cWRldik7CisJcHJfZXJyKCJyeF9yaW5nLT5zYnFfcHJvZF9pZHggPSAlZFxuIiwgcnhfcmluZy0+c2JxX3Byb2RfaWR4KTsKKwlwcl9lcnIoInJ4X3JpbmctPnNicV9jdXJyX2lkeCA9ICVkXG4iLCByeF9yaW5nLT5zYnFfY3Vycl9pZHgpOworCXByX2VycigicnhfcmluZy0+c2JxX2NsZWFuX2lkeCA9ICVkXG4iLCByeF9yaW5nLT5zYnFfY2xlYW5faWR4KTsKKwlwcl9lcnIoInJ4X3JpbmctPnNicV9mcmVlX2NudCA9ICVkXG4iLCByeF9yaW5nLT5zYnFfZnJlZV9jbnQpOworCXByX2VycigicnhfcmluZy0+c2JxX2J1Zl9zaXplID0gJWRcbiIsIHJ4X3JpbmctPnNicV9idWZfc2l6ZSk7CisJcHJfZXJyKCJyeF9yaW5nLT5jcV9pZCA9ICVkXG4iLCByeF9yaW5nLT5jcV9pZCk7CisJcHJfZXJyKCJyeF9yaW5nLT5pcnEgPSAlZFxuIiwgcnhfcmluZy0+aXJxKTsKKwlwcl9lcnIoInJ4X3JpbmctPmNwdSA9ICVkXG4iLCByeF9yaW5nLT5jcHUpOworCXByX2VycigicnhfcmluZy0+cWRldiA9ICVwXG4iLCByeF9yaW5nLT5xZGV2KTsKIH0KIAogdm9pZCBxbF9kdW1wX2h3X2NiKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBpbnQgc2l6ZSwgdTMyIGJpdCwgdTE2IHFfaWQpCiB7CiAJdm9pZCAqcHRyOwogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEVudGVyLlxuIiwgX19mdW5jX18pOworCXByX2VycigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAKIAlwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCWlmIChwdHIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBidWZmZXIuXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIGJ1ZmZlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHFsX3dyaXRlX2NmZyhxZGV2LCBwdHIsIHNpemUsIGJpdCwgcV9pZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHVwbG9hZCBjb250cm9sIGJsb2NrIVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHVwbG9hZCBjb250cm9sIGJsb2NrIVxuIiwgX19mdW5jX18pOwogCQlnb3RvIGZhaWxfaXQ7CiAJfQogCXN3aXRjaCAoYml0KSB7CkBAIC0yMDAwLDggKzE4MjUsNyBAQAogCQlxbF9kdW1wX3JpY2IoKHN0cnVjdCByaWNiICopcHRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEludmFsaWQgYml0IHZhbHVlID0gJXguXG4iLAotCQkgICAgICAgX19mdW5jX18sIGJpdCk7CisJCXByX2VycigiJXM6IEludmFsaWQgYml0IHZhbHVlID0gJXhcbiIsIF9fZnVuY19fLCBiaXQpOwogCQlicmVhazsKIAl9CiBmYWlsX2l0OgpAQCAtMjAxMiwyNyArMTgzNiwyNyBAQAogI2lmZGVmIFFMX09CX0RVTVAKIHZvaWQgcWxfZHVtcF90eF9kZXNjKHN0cnVjdCB0eF9idWZfZGVzYyAqdGJkKQogewotCXByaW50ayhLRVJOX0VSUiBQRlggInRiZC0+YWRkciAgPSAweCVsbHhcbiIsCisJcHJfZXJyKCJ0YmQtPmFkZHIgID0gMHglbGx4XG4iLAogCSAgICAgICBsZTY0X3RvX2NwdSgodTY0KSB0YmQtPmFkZHIpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmxlbiAgID0gJWRcbiIsCisJcHJfZXJyKCJ0YmQtPmxlbiAgID0gJWRcbiIsCiAJICAgICAgIGxlMzJfdG9fY3B1KHRiZC0+bGVuICYgVFhfREVTQ19MRU5fTUFTSykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInRiZC0+ZmxhZ3MgPSAlcyAlc1xuIiwKKwlwcl9lcnIoInRiZC0+ZmxhZ3MgPSAlcyAlc1xuIiwKIAkgICAgICAgdGJkLT5sZW4gJiBUWF9ERVNDX0MgPyAiQyIgOiAiLiIsCiAJICAgICAgIHRiZC0+bGVuICYgVFhfREVTQ19FID8gIkUiIDogIi4iKTsKIAl0YmQrKzsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmFkZHIgID0gMHglbGx4XG4iLAorCXByX2VycigidGJkLT5hZGRyICA9IDB4JWxseFxuIiwKIAkgICAgICAgbGU2NF90b19jcHUoKHU2NCkgdGJkLT5hZGRyKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidGJkLT5sZW4gICA9ICVkXG4iLAorCXByX2VycigidGJkLT5sZW4gICA9ICVkXG4iLAogCSAgICAgICBsZTMyX3RvX2NwdSh0YmQtPmxlbiAmIFRYX0RFU0NfTEVOX01BU0spKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmZsYWdzID0gJXMgJXNcbiIsCisJcHJfZXJyKCJ0YmQtPmZsYWdzID0gJXMgJXNcbiIsCiAJICAgICAgIHRiZC0+bGVuICYgVFhfREVTQ19DID8gIkMiIDogIi4iLAogCSAgICAgICB0YmQtPmxlbiAmIFRYX0RFU0NfRSA/ICJFIiA6ICIuIik7CiAJdGJkKys7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidGJkLT5hZGRyICA9IDB4JWxseFxuIiwKKwlwcl9lcnIoInRiZC0+YWRkciAgPSAweCVsbHhcbiIsCiAJICAgICAgIGxlNjRfdG9fY3B1KCh1NjQpIHRiZC0+YWRkcikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInRiZC0+bGVuICAgPSAlZFxuIiwKKwlwcl9lcnIoInRiZC0+bGVuICAgPSAlZFxuIiwKIAkgICAgICAgbGUzMl90b19jcHUodGJkLT5sZW4gJiBUWF9ERVNDX0xFTl9NQVNLKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidGJkLT5mbGFncyA9ICVzICVzXG4iLAorCXByX2VycigidGJkLT5mbGFncyA9ICVzICVzXG4iLAogCSAgICAgICB0YmQtPmxlbiAmIFRYX0RFU0NfQyA/ICJDIiA6ICIuIiwKIAkgICAgICAgdGJkLT5sZW4gJiBUWF9ERVNDX0UgPyAiRSIgOiAiLiIpOwogCkBAIC0yMDQ1LDM4ICsxODY5LDM4IEBACiAJc3RydWN0IHR4X2J1Zl9kZXNjICp0YmQ7CiAJdTE2IGZyYW1lX2xlbjsKIAotCXByaW50ayhLRVJOX0VSUiBQRlggIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAib3Bjb2RlICAgICAgICAgPSAlc1xuIiwKKwlwcl9lcnIoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcHJfZXJyKCJvcGNvZGUgICAgICAgICA9ICVzXG4iLAogCSAgICAgICAob2JfbWFjX2lvY2ItPm9wY29kZSA9PSBPUENPREVfT0JfTUFDX0lPQ0IpID8gIk1BQyIgOiAiVFNPIik7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3MxICAgICAgICAgID0gJXMgJXMgJXMgJXMgJXNcbiIsCisJcHJfZXJyKCJmbGFnczEgICAgICAgICAgPSAlcyAlcyAlcyAlcyAlc1xuIiwKIAkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczEgJiBPQl9NQUNfVFNPX0lPQ0JfT0kgPyAiT0kiIDogIiIsCiAJICAgICAgIG9iX21hY190c29faW9jYi0+ZmxhZ3MxICYgT0JfTUFDX1RTT19JT0NCX0kgPyAiSSIgOiAiIiwKIAkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczEgJiBPQl9NQUNfVFNPX0lPQ0JfRCA/ICJEIiA6ICIiLAogCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMSAmIE9CX01BQ19UU09fSU9DQl9JUDQgPyAiSVA0IiA6ICIiLAogCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMSAmIE9CX01BQ19UU09fSU9DQl9JUDYgPyAiSVA2IiA6ICIiKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJmbGFnczIgICAgICAgICAgPSAlcyAlcyAlc1xuIiwKKwlwcl9lcnIoImZsYWdzMiAgICAgICAgICA9ICVzICVzICVzXG4iLAogCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMiAmIE9CX01BQ19UU09fSU9DQl9MU08gPyAiTFNPIiA6ICIiLAogCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMiAmIE9CX01BQ19UU09fSU9DQl9VQyA/ICJVQyIgOiAiIiwKIAkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczIgJiBPQl9NQUNfVFNPX0lPQ0JfVEMgPyAiVEMiIDogIiIpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImZsYWdzMyAgICAgICAgICA9ICVzICVzICVzXG4iLAorCXByX2VycigiZmxhZ3MzICAgICAgICAgID0gJXMgJXMgJXNcbiIsCiAJICAgICAgIG9iX21hY190c29faW9jYi0+ZmxhZ3MzICYgT0JfTUFDX1RTT19JT0NCX0lDID8gIklDIiA6ICIiLAogCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMyAmIE9CX01BQ19UU09fSU9DQl9ERlAgPyAiREZQIiA6ICIiLAogCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMyAmIE9CX01BQ19UU09fSU9DQl9WID8gIlYiIDogIiIpOwotCXByaW50ayhLRVJOX0VSUiBQRlggInRpZCA9ICV4XG4iLCBvYl9tYWNfaW9jYi0+dGlkKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eHFfaWR4ID0gJWRcbiIsIG9iX21hY19pb2NiLT50eHFfaWR4KTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ2bGFuX3RjaSAgICAgID0gJXhcbiIsIG9iX21hY190c29faW9jYi0+dmxhbl90Y2kpOworCXByX2VycigidGlkID0gJXhcbiIsIG9iX21hY19pb2NiLT50aWQpOworCXByX2VycigidHhxX2lkeCA9ICVkXG4iLCBvYl9tYWNfaW9jYi0+dHhxX2lkeCk7CisJcHJfZXJyKCJ2bGFuX3RjaSAgICAgID0gJXhcbiIsIG9iX21hY190c29faW9jYi0+dmxhbl90Y2kpOwogCWlmIChvYl9tYWNfaW9jYi0+b3Bjb2RlID09IE9QQ09ERV9PQl9NQUNfVFNPX0lPQ0IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZnJhbWVfbGVuICAgICAgPSAlZFxuIiwKKwkJcHJfZXJyKCJmcmFtZV9sZW4gICAgICA9ICVkXG4iLAogCQkgICAgICAgbGUzMl90b19jcHUob2JfbWFjX3Rzb19pb2NiLT5mcmFtZV9sZW4pKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibXNzICAgICAgPSAlZFxuIiwKKwkJcHJfZXJyKCJtc3MgICAgICA9ICVkXG4iLAogCQkgICAgICAgbGUxNl90b19jcHUob2JfbWFjX3Rzb19pb2NiLT5tc3MpKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicHJvdF9oZHJfbGVuICAgPSAlZFxuIiwKKwkJcHJfZXJyKCJwcm90X2hkcl9sZW4gICA9ICVkXG4iLAogCQkgICAgICAgbGUxNl90b19jcHUob2JfbWFjX3Rzb19pb2NiLT50b3RhbF9oZHJzX2xlbikpOwotCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHJfb2Zmc2V0ICAgICA9IDB4JS4wNHhcbiIsCisJCXByX2VycigiaGRyX29mZnNldCAgICAgPSAweCUuMDR4XG4iLAogCQkgICAgICAgbGUxNl90b19jcHUob2JfbWFjX3Rzb19pb2NiLT5uZXRfdHJhbnNfb2Zmc2V0KSk7CiAJCWZyYW1lX2xlbiA9IGxlMzJfdG9fY3B1KG9iX21hY190c29faW9jYi0+ZnJhbWVfbGVuKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJmcmFtZV9sZW4gICAgICA9ICVkXG4iLAorCQlwcl9lcnIoImZyYW1lX2xlbiAgICAgID0gJWRcbiIsCiAJCSAgICAgICBsZTE2X3RvX2NwdShvYl9tYWNfaW9jYi0+ZnJhbWVfbGVuKSk7CiAJCWZyYW1lX2xlbiA9IGxlMTZfdG9fY3B1KG9iX21hY19pb2NiLT5mcmFtZV9sZW4pOwogCX0KQEAgLTIwODYsOSArMTkxMCw5IEBACiAKIHZvaWQgcWxfZHVtcF9vYl9tYWNfcnNwKHN0cnVjdCBvYl9tYWNfaW9jYl9yc3AgKm9iX21hY19yc3ApCiB7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXNcbiIsIF9fZnVuY19fKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJvcGNvZGUgICAgICAgICA9ICVkXG4iLCBvYl9tYWNfcnNwLT5vcGNvZGUpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImZsYWdzICAgICAgICAgID0gJXMgJXMgJXMgJXMgJXMgJXMgJXNcbiIsCisJcHJfZXJyKCIlc1xuIiwgX19mdW5jX18pOworCXByX2Vycigib3Bjb2RlICAgICAgICAgPSAlZFxuIiwgb2JfbWFjX3JzcC0+b3Bjb2RlKTsKKwlwcl9lcnIoImZsYWdzICAgICAgICAgID0gJXMgJXMgJXMgJXMgJXMgJXMgJXNcbiIsCiAJICAgICAgIG9iX21hY19yc3AtPmZsYWdzMSAmIE9CX01BQ19JT0NCX1JTUF9PSSA/ICJPSSIgOiAiLiIsCiAJICAgICAgIG9iX21hY19yc3AtPmZsYWdzMSAmIE9CX01BQ19JT0NCX1JTUF9JID8gIkkiIDogIi4iLAogCSAgICAgICBvYl9tYWNfcnNwLT5mbGFnczEgJiBPQl9NQUNfSU9DQl9SU1BfRSA/ICJFIiA6ICIuIiwKQEAgLTIwOTYsMTYgKzE5MjAsMTYgQEAKIAkgICAgICAgb2JfbWFjX3JzcC0+ZmxhZ3MxICYgT0JfTUFDX0lPQ0JfUlNQX0wgPyAiTCIgOiAiLiIsCiAJICAgICAgIG9iX21hY19yc3AtPmZsYWdzMSAmIE9CX01BQ19JT0NCX1JTUF9QID8gIlAiIDogIi4iLAogCSAgICAgICBvYl9tYWNfcnNwLT5mbGFnczIgJiBPQl9NQUNfSU9DQl9SU1BfQiA/ICJCIiA6ICIuIik7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAidGlkID0gJXhcbiIsIG9iX21hY19yc3AtPnRpZCk7CisJcHJfZXJyKCJ0aWQgPSAleFxuIiwgb2JfbWFjX3JzcC0+dGlkKTsKIH0KICNlbmRpZgogCiAjaWZkZWYgUUxfSUJfRFVNUAogdm9pZCBxbF9kdW1wX2liX21hY19yc3Aoc3RydWN0IGliX21hY19pb2NiX3JzcCAqaWJfbWFjX3JzcCkKIHsKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlc1xuIiwgX19mdW5jX18pOwotCXByaW50ayhLRVJOX0VSUiBQRlggIm9wY29kZSAgICAgICAgID0gMHgleFxuIiwgaWJfbWFjX3JzcC0+b3Bjb2RlKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJmbGFnczEgPSAlcyVzJXMlcyVzJXNcbiIsCisJcHJfZXJyKCIlc1xuIiwgX19mdW5jX18pOworCXByX2Vycigib3Bjb2RlICAgICAgICAgPSAweCV4XG4iLCBpYl9tYWNfcnNwLT5vcGNvZGUpOworCXByX2VycigiZmxhZ3MxID0gJXMlcyVzJXMlcyVzXG4iLAogCSAgICAgICBpYl9tYWNfcnNwLT5mbGFnczEgJiBJQl9NQUNfSU9DQl9SU1BfT0kgPyAiT0kgIiA6ICIiLAogCSAgICAgICBpYl9tYWNfcnNwLT5mbGFnczEgJiBJQl9NQUNfSU9DQl9SU1BfSSA/ICJJICIgOiAiIiwKIAkgICAgICAgaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX1RFID8gIlRFICIgOiAiIiwKQEAgLTIxMTQsNyArMTkzOCw3IEBACiAJICAgICAgIGliX21hY19yc3AtPmZsYWdzMSAmIElCX01BQ19JT0NCX1JTUF9CID8gIkIgIiA6ICIiKTsKIAogCWlmIChpYl9tYWNfcnNwLT5mbGFnczEgJiBJQl9NQUNfSU9DQl9SU1BfTV9NQVNLKQotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyVzJXMgTXVsdGljYXN0LlxuIiwKKwkJcHJfZXJyKCIlcyVzJXMgTXVsdGljYXN0XG4iLAogCQkgICAgICAgKGliX21hY19yc3AtPmZsYWdzMSAmIElCX01BQ19JT0NCX1JTUF9NX01BU0spID09CiAJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfTV9IQVNIID8gIkhhc2giIDogIiIsCiAJCSAgICAgICAoaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX01fTUFTSykgPT0KQEAgLTIxMjIsNyArMTk0Niw3IEBACiAJCSAgICAgICAoaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX01fTUFTSykgPT0KIAkJICAgICAgIElCX01BQ19JT0NCX1JTUF9NX1BST00gPyAiUHJvbWlzY3VvdXMiIDogIiIpOwogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3MyID0gJXMlcyVzJXMlc1xuIiwKKwlwcl9lcnIoImZsYWdzMiA9ICVzJXMlcyVzJXNcbiIsCiAJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfUCkgPyAiUCAiIDogIiIsCiAJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVikgPyAiViAiIDogIiIsCiAJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVSkgPyAiVSAiIDogIiIsCkBAIC0yMTMwLDcgKzE5NTQsNyBAQAogCSAgICAgICAoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX0ZPKSA/ICJGTyAiIDogIiIpOwogCiAJaWYgKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9FUlJfTUFTSykKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMlcyVzJXMlcyBlcnJvci5cbiIsCisJCXByX2VycigiJXMlcyVzJXMlcyBlcnJvclxuIiwKIAkJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRVJSX01BU0spID09CiAJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfRVJSX09WRVJTSVpFID8gIm92ZXJzaXplIiA6ICIiLAogCQkgICAgICAgKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9FUlJfTUFTSykgPT0KQEAgLTIxNDIsMTIgKzE5NjYsMTIgQEAKIAkJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRVJSX01BU0spID09CiAJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfRVJSX0NSQyA/ICJDUkMiIDogIiIpOwogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3MzID0gJXMlcy5cbiIsCisJcHJfZXJyKCJmbGFnczMgPSAlcyVzXG4iLAogCSAgICAgICBpYl9tYWNfcnNwLT5mbGFnczMgJiBJQl9NQUNfSU9DQl9SU1BfRFMgPyAiRFMgIiA6ICIiLAogCSAgICAgICBpYl9tYWNfcnNwLT5mbGFnczMgJiBJQl9NQUNfSU9DQl9SU1BfREwgPyAiREwgIiA6ICIiKTsKIAogCWlmIChpYl9tYWNfcnNwLT5mbGFnczMgJiBJQl9NQUNfSU9DQl9SU1BfUlNTX01BU0spCi0JCXByaW50ayhLRVJOX0VSUiBQRlggIlJTUyBmbGFncyA9ICVzJXMlcyVzLlxuIiwKKwkJcHJfZXJyKCJSU1MgZmxhZ3MgPSAlcyVzJXMlc1xuIiwKIAkJICAgICAgICgoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKSA9PQogCQkJSUJfTUFDX0lPQ0JfUlNQX01fSVBWNCkgPyAiSVB2NCBSU1MiIDogIiIsCiAJCSAgICAgICAoKGliX21hY19yc3AtPmZsYWdzMyAmIElCX01BQ19JT0NCX1JTUF9SU1NfTUFTSykgPT0KQEAgLTIxNTcsMjYgKzE5ODEsMjYgQEAKIAkJICAgICAgICgoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKSA9PQogCQkJSUJfTUFDX0lPQ0JfUlNQX01fVENQX1Y2KSA/ICJUQ1AvSVB2NiBSU1MiIDogIiIpOwogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGF0YV9sZW4JPSAlZFxuIiwKKwlwcl9lcnIoImRhdGFfbGVuCT0gJWRcbiIsCiAJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmRhdGFfbGVuKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGF0YV9hZGRyICAgID0gMHglbGx4XG4iLAorCXByX2VycigiZGF0YV9hZGRyICAgID0gMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShpYl9tYWNfcnNwLT5kYXRhX2FkZHIpKTsKIAlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKQotCQlwcmludGsoS0VSTl9FUlIgUEZYICJyc3MgICAgPSAleFxuIiwKKwkJcHJfZXJyKCJyc3MgICAgPSAleFxuIiwKIAkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPnJzcykpOwogCWlmIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVikKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmxhbl9pZCAgICA9ICV4XG4iLAorCQlwcl9lcnIoInZsYW5faWQgICAgPSAleFxuIiwKIAkJICAgICAgIGxlMTZfdG9fY3B1KGliX21hY19yc3AtPnZsYW5faWQpKTsKIAotCXByaW50ayhLRVJOX0VSUiBQRlggImZsYWdzNCA9ICVzJXMlcy5cbiIsCisJcHJfZXJyKCJmbGFnczQgPSAlcyVzJXNcbiIsCiAJCWliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IViA/ICJIViAiIDogIiIsCiAJCWliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IUyA/ICJIUyAiIDogIiIsCiAJCWliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9ITCA/ICJITCAiIDogIiIpOwogCiAJaWYgKGliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IVikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHIgbGVuZ3RoCT0gJWQuXG4iLAorCQlwcl9lcnIoImhkciBsZW5ndGgJPSAlZFxuIiwKIAkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmhkcl9sZW4pKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGFkZHIgICAgPSAweCVsbHguXG4iLAorCQlwcl9lcnIoImhkciBhZGRyICAgID0gMHglbGx4XG4iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGU2NF90b19jcHUoaWJfbWFjX3JzcC0+aGRyX2FkZHIpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYwppbmRleCBkMTBiY2VmLi44ZDYzZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKQEAgLTU3NCw2ICs1NzQsMjIgQEAKIAkJCSAgICAoUlRfSURYX0FMTF9FUlJfU0xPVCA8PCBSVF9JRFhfSURYX1NISUZUKTsvKiBpbmRleCAqLwogCQkJYnJlYWs7CiAJCX0KKwljYXNlIFJUX0lEWF9JUF9DU1VNX0VSUjogLyogUGFzcyB1cCBJUCBDU1VNIGVycm9yIGZyYW1lcy4gKi8KKwkJeworCQkJdmFsdWUgPSBSVF9JRFhfRFNUX0RGTFRfUSB8IC8qIGRlc3QgKi8KKwkJCQlSVF9JRFhfVFlQRV9OSUNRIHwgLyogdHlwZSAqLworCQkJCShSVF9JRFhfSVBfQ1NVTV9FUlJfU0xPVCA8PAorCQkJCVJUX0lEWF9JRFhfU0hJRlQpOyAvKiBpbmRleCAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIFJUX0lEWF9UVV9DU1VNX0VSUjogLyogUGFzcyB1cCBUQ1AvVURQIENTVU0gZXJyb3IgZnJhbWVzLiAqLworCQl7CisJCQl2YWx1ZSA9IFJUX0lEWF9EU1RfREZMVF9RIHwgLyogZGVzdCAqLworCQkJCVJUX0lEWF9UWVBFX05JQ1EgfCAvKiB0eXBlICovCisJCQkJKFJUX0lEWF9UQ1BfVURQX0NTVU1fRVJSX1NMT1QgPDwKKwkJCQlSVF9JRFhfSURYX1NISUZUKTsgLyogaW5kZXggKi8KKwkJCWJyZWFrOworCQl9CiAJY2FzZSBSVF9JRFhfQkNBU1Q6CS8qIFBhc3MgdXAgQnJvYWRjYXN0IGZyYW1lcyB0byBkZWZhdWx0IFEuICovCiAJCXsKIAkJCXZhbHVlID0gUlRfSURYX0RTVF9ERkxUX1EgfAkvKiBkZXN0ICovCkBAIC0xNTIxLDcgKzE1MzcsNyBAQAogCiAJLyogRnJhbWUgZXJyb3IsIHNvIGRyb3AgdGhlIHBhY2tldC4gKi8KIAlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX0VSUl9NQVNLKSB7Ci0JCW5ldGlmX2VycihxZGV2LCBkcnYsIHFkZXYtPm5kZXYsCisJCW5ldGlmX2luZm8ocWRldiwgZHJ2LCBxZGV2LT5uZGV2LAogCQkJICAiUmVjZWl2ZSBlcnJvciwgZmxhZ3MyID0gMHgleFxuIiwgaWJfbWFjX3JzcC0+ZmxhZ3MyKTsKIAkJcnhfcmluZy0+cnhfZXJyb3JzKys7CiAJCWdvdG8gZXJyX291dDsKQEAgLTE2MTgsNyArMTYzNCw3IEBACiAKIAkvKiBGcmFtZSBlcnJvciwgc28gZHJvcCB0aGUgcGFja2V0LiAqLwogCWlmIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRVJSX01BU0spIHsKLQkJbmV0aWZfZXJyKHFkZXYsIGRydiwgcWRldi0+bmRldiwKKwkJbmV0aWZfaW5mbyhxZGV2LCBkcnYsIHFkZXYtPm5kZXYsCiAJCQkgICJSZWNlaXZlIGVycm9yLCBmbGFnczIgPSAweCV4XG4iLCBpYl9tYWNfcnNwLT5mbGFnczIpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlyeF9yaW5nLT5yeF9lcnJvcnMrKzsKQEAgLTE2NzcsNyArMTY5Myw3IEBACiAJCQkvKiBVbmZyYWdtZW50ZWQgaXB2NCBVRFAgZnJhbWUuICovCiAJCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikgc2tiLT5kYXRhOwogCQkJaWYgKCEoaXBoLT5mcmFnX29mZiAmCi0JCQkJY3B1X3RvX2JlMTYoSVBfTUZ8SVBfT0ZGU0VUKSkpIHsKKwkJCQludG9ocyhJUF9NRnxJUF9PRkZTRVQpKSkgewogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCQkJbmV0aWZfcHJpbnRrKHFkZXYsIHJ4X3N0YXR1cywgS0VSTl9ERUJVRywKIAkJCQkJICAgICBxZGV2LT5uZGV2LApAQCAtMTkzOSw3ICsxOTU1LDcgQEAKIAogCS8qIEZyYW1lIGVycm9yLCBzbyBkcm9wIHRoZSBwYWNrZXQuICovCiAJaWYgKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9FUlJfTUFTSykgewotCQluZXRpZl9lcnIocWRldiwgZHJ2LCBxZGV2LT5uZGV2LAorCQluZXRpZl9pbmZvKHFkZXYsIGRydiwgcWRldi0+bmRldiwKIAkJCSAgIlJlY2VpdmUgZXJyb3IsIGZsYWdzMiA9IDB4JXhcbiIsIGliX21hY19yc3AtPmZsYWdzMik7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXJ4X3JpbmctPnJ4X2Vycm9ycysrOwpAQCAtMTk5Nyw3ICsyMDEzLDcgQEAKIAkJLyogVW5mcmFnbWVudGVkIGlwdjQgVURQIGZyYW1lLiAqLwogCQkJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopIHNrYi0+ZGF0YTsKIAkJCWlmICghKGlwaC0+ZnJhZ19vZmYgJgotCQkJCWNwdV90b19iZTE2KElQX01GfElQX09GRlNFVCkpKSB7CisJCQkJbnRvaHMoSVBfTUZ8SVBfT0ZGU0VUKSkpIHsKIAkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQkJCW5ldGlmX3ByaW50ayhxZGV2LCByeF9zdGF0dXMsIEtFUk5fREVCVUcsIHFkZXYtPm5kZXYsCiAJCQkJCSAgICAgIlRDUCBjaGVja3N1bSBkb25lIVxuIik7CkBAIC0zNTg3LDEwICszNjAzLDIwIEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAotCXN0YXR1cyA9IHFsX3NldF9yb3V0aW5nX3JlZyhxZGV2LCBSVF9JRFhfQUxMX0VSUl9TTE9ULCBSVF9JRFhfRVJSLCAxKTsKKwlzdGF0dXMgPSBxbF9zZXRfcm91dGluZ19yZWcocWRldiwgUlRfSURYX0lQX0NTVU1fRVJSX1NMT1QsCisJCQkJCQlSVF9JRFhfSVBfQ1NVTV9FUlIsIDEpOwogCWlmIChzdGF0dXMpIHsKIAkJbmV0aWZfZXJyKHFkZXYsIGlmdXAsIHFkZXYtPm5kZXYsCi0JCQkgICJGYWlsZWQgdG8gaW5pdCByb3V0aW5nIHJlZ2lzdGVyIGZvciBlcnJvciBwYWNrZXRzLlxuIik7CisJCQkiRmFpbGVkIHRvIGluaXQgcm91dGluZyByZWdpc3RlciAiCisJCQkiZm9yIElQIENTVU0gZXJyb3IgcGFja2V0cy5cbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCXN0YXR1cyA9IHFsX3NldF9yb3V0aW5nX3JlZyhxZGV2LCBSVF9JRFhfVENQX1VEUF9DU1VNX0VSUl9TTE9ULAorCQkJCQkJUlRfSURYX1RVX0NTVU1fRVJSLCAxKTsKKwlpZiAoc3RhdHVzKSB7CisJCW5ldGlmX2VycihxZGV2LCBpZnVwLCBxZGV2LT5uZGV2LAorCQkJIkZhaWxlZCB0byBpbml0IHJvdXRpbmcgcmVnaXN0ZXIgIgorCQkJImZvciBUQ1AvVURQIENTVU0gZXJyb3IgcGFja2V0cy5cbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCXN0YXR1cyA9IHFsX3NldF9yb3V0aW5nX3JlZyhxZGV2LCBSVF9JRFhfQkNBU1RfU0xPVCwgUlRfSURYX0JDQVNULCAxKTsKQEAgLTM5MTksNiArMzk0NSwxMSBAQAogCWlmICgocWxfcmVhZDMyKHFkZXYsIFNUUykgJiBxZGV2LT5wb3J0X2luaXQpICYmCiAJCQkocWxfcmVhZDMyKHFkZXYsIFNUUykgJiBxZGV2LT5wb3J0X2xpbmtfdXApKQogCQlxbF9saW5rX29uKHFkZXYpOworCS8qIFJlc3RvcmUgcnggbW9kZS4gKi8KKwljbGVhcl9iaXQoUUxfQUxMTVVMVEksICZxZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KFFMX1BST01JU0NVT1VTLCAmcWRldi0+ZmxhZ3MpOworCXFsZ2Vfc2V0X211bHRpY2FzdF9saXN0KHFkZXYtPm5kZXYpOworCiAJcWxfZW5hYmxlX2ludGVycnVwdHMocWRldik7CiAJcWxfZW5hYmxlX2FsbF9jb21wbGV0aW9uX2ludGVycnVwdHMocWRldik7CiAJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhxZGV2LT5uZGV2KTsKQEAgLTQyMDQsNyArNDIzNSw3IEBACiAJcmV0dXJuICZuZGV2LT5zdGF0czsKIH0KIAotc3RhdGljIHZvaWQgcWxnZV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit2b2lkIHFsZ2Vfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbF9hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tcGkuYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tcGkuYwppbmRleCAzYzAwNDYyLi5mODRlODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbXBpLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21waS5jCkBAIC02MDYsMjMgKzYwNiw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IHFsX21iX3N5c19lcnIoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCi17Ci0Jc3RydWN0IG1ib3hfcGFyYW1zIG1iYzsKLQlzdHJ1Y3QgbWJveF9wYXJhbXMgKm1iY3AgPSAmbWJjOwotCWludCBzdGF0dXM7Ci0KLQltZW1zZXQobWJjcCwgMCwgc2l6ZW9mKHN0cnVjdCBtYm94X3BhcmFtcykpOwotCi0JbWJjcC0+aW5fY291bnQgPSAxOwotCW1iY3AtPm91dF9jb3VudCA9IDA7Ci0KLQltYmNwLT5tYm94X2luWzBdID0gTUJfQ01EX01BS0VfU1lTX0VSUjsKLQotCXN0YXR1cyA9IHFsX21haWxib3hfY29tbWFuZChxZGV2LCBtYmNwKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCiAvKiBHZXQgTVBJIGZpcm13YXJlIHZlcnNpb24uIFRoaXMgd2lsbCBiZSB1c2VkIGZvcgogICogZHJpdmVyIGJhbm5lciBhbmQgZm9yIGV0aHRvb2wgaW5mby4KICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjYwNDAuYyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKaW5kZXggOWEyNTFhYy4uMTQyYzM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjYwNDAuYworKysgYi9kcml2ZXJzL25ldC9yNjA0MC5jCkBAIC00NCwxMiArNDQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicjYwNDAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjI1IgotI2RlZmluZSBEUlZfUkVMREFURQkiMjBBdWcyMDA5IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yNiIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjMwTWF5MjAxMCIKIAogLyogUEhZIENISVAgQWRkcmVzcyAqLwogI2RlZmluZSBQSFkxX0FERFIJMQkvKiBGb3IgTUFDMSAqLwpAQCAtMTc5LDcgKzE4MCw2IEBACiAKIHN0cnVjdCByNjA0MF9wcml2YXRlIHsKIAlzcGlubG9ja190IGxvY2s7CQkvKiBkcml2ZXIgbG9jayAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCByNjA0MF9kZXNjcmlwdG9yICpyeF9pbnNlcnRfcHRyOwogCXN0cnVjdCByNjA0MF9kZXNjcmlwdG9yICpyeF9yZW1vdmVfcHRyOwpAQCAtMTg5LDEzICsxODksMTUgQEAKIAlzdHJ1Y3QgcjYwNDBfZGVzY3JpcHRvciAqdHhfcmluZzsKIAlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOwogCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7Ci0JdTE2CXR4X2ZyZWVfZGVzYywgcGh5X2FkZHIsIHBoeV9tb2RlOworCXUxNgl0eF9mcmVlX2Rlc2MsIHBoeV9hZGRyOwogCXUxNgltY3IwLCBtY3IxOwotCXUxNglzd2l0Y2hfc2lnOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwlpbnQgb2xkX2xpbms7CisJaW50IG9sZF9kdXBsZXg7CiB9OwogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9IEtFUk5fSU5GTyBEUlZfTkFNRQpAQCAtMjM4LDIwICsyNDAsMzAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcjYwNDBfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcpCitzdGF0aWMgaW50IHI2MDQwX21kaW9idXNfcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsIGludCByZWcpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJ1cy0+cHJpdjsKIAlzdHJ1Y3QgcjYwNDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CiAKLQlyZXR1cm4gKHI2MDQwX3BoeV9yZWFkKGlvYWRkciwgbHAtPnBoeV9hZGRyLCByZWcpKTsKKwlyZXR1cm4gcjYwNDBfcGh5X3JlYWQoaW9hZGRyLCBwaHlfYWRkciwgcmVnKTsKIH0KIAotc3RhdGljIHZvaWQgcjYwNDBfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnLCBpbnQgdmFsKQorc3RhdGljIGludCByNjA0MF9tZGlvYnVzX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwKKwkJCQkJCWludCByZWcsIHUxNiB2YWx1ZSkKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnVzLT5wcml2OwogCXN0cnVjdCByNjA0MF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKIAotCXI2MDQwX3BoeV93cml0ZShpb2FkZHIsIGxwLT5waHlfYWRkciwgcmVnLCB2YWwpOworCXI2MDQwX3BoeV93cml0ZShpb2FkZHIsIHBoeV9hZGRyLCByZWcsIHZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI2MDQwX21kaW9idXNfcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcjYwNDBfZnJlZV90eGJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTQwOCwxMCArNDIwLDkgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHByaXYtPmJhc2U7CiAKIAluZXRkZXZfd2FybihkZXYsICJ0cmFuc21pdCB0aW1lZCBvdXQsIGludCBlbmFibGUgJTQuNHggIgotCQkic3RhdHVzICU0LjR4LCBQSFkgc3RhdHVzICU0LjR4XG4iLAorCQkic3RhdHVzICU0LjR4XG4iLAogCQlpb3JlYWQxNihpb2FkZHIgKyBNSUVSKSwKLQkJaW9yZWFkMTYoaW9hZGRyICsgTUlTUiksCi0JCXI2MDQwX21kaW9fcmVhZChkZXYsIHByaXYtPm1paV9pZi5waHlfaWQsIE1JSV9CTVNSKSk7CisJCWlvcmVhZDE2KGlvYWRkciArIE1JU1IpKTsKIAogCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAKQEAgLTQ2Myw5ICs0NzQsNiBAQAogCXN0cnVjdCByNjA0MF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBscC0+cGRldjsKIAotCS8qIGRlbGV0ZWQgdGltZXIgKi8KLQlkZWxfdGltZXJfc3luYygmbHAtPnRpbWVyKTsKLQogCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKIAluYXBpX2Rpc2FibGUoJmxwLT5uYXBpKTsKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC00OTUsNjQgKzUwMywxNCBAQAogCXJldHVybiAwOwogfQogCi0vKiBTdGF0dXMgb2YgUEhZIENISVAgKi8KLXN0YXRpYyBpbnQgcjYwNDBfcGh5X21vZGVfY2hrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHI2MDQwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOwotCWludCBwaHlfZGF0OwotCi0JLyogUEhZIExpbmsgU3RhdHVzIENoZWNrICovCi0JcGh5X2RhdCA9IHI2MDQwX3BoeV9yZWFkKGlvYWRkciwgbHAtPnBoeV9hZGRyLCAxKTsKLQlpZiAoIShwaHlfZGF0ICYgMHg0KSkKLQkJcGh5X2RhdCA9IDB4ODAwMDsJLyogTGluayBGYWlsZWQsIGZ1bGwgZHVwbGV4ICovCi0KLQkvKiBQSFkgQ2hpcCBBdXRvLU5lZ290aWF0aW9uIFN0YXR1cyAqLwotCXBoeV9kYXQgPSByNjA0MF9waHlfcmVhZChpb2FkZHIsIGxwLT5waHlfYWRkciwgMSk7Ci0JaWYgKHBoeV9kYXQgJiAweDAwMjApIHsKLQkJLyogQXV0byBOZWdvdGlhdGlvbiBNb2RlICovCi0JCXBoeV9kYXQgPSByNjA0MF9waHlfcmVhZChpb2FkZHIsIGxwLT5waHlfYWRkciwgNSk7Ci0JCXBoeV9kYXQgJj0gcjYwNDBfcGh5X3JlYWQoaW9hZGRyLCBscC0+cGh5X2FkZHIsIDQpOwotCQlpZiAocGh5X2RhdCAmIDB4MTQwKQotCQkJLyogRm9yY2UgZnVsbCBkdXBsZXggKi8KLQkJCXBoeV9kYXQgPSAweDgwMDA7Ci0JCWVsc2UKLQkJCXBoeV9kYXQgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIEZvcmNlIE1vZGUgKi8KLQkJcGh5X2RhdCA9IHI2MDQwX3BoeV9yZWFkKGlvYWRkciwgbHAtPnBoeV9hZGRyLCAwKTsKLQkJaWYgKHBoeV9kYXQgJiAweDEwMCkKLQkJCXBoeV9kYXQgPSAweDgwMDA7Ci0JCWVsc2UKLQkJCXBoeV9kYXQgPSAweDAwMDA7Ci0JfQotCi0JcmV0dXJuIHBoeV9kYXQ7Ci19OwotCi1zdGF0aWMgdm9pZCByNjA0MF9zZXRfY2FycmllcihzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKLXsKLQlpZiAocjYwNDBfcGh5X21vZGVfY2hrKG1paS0+ZGV2KSkgewotCQkvKiBhdXRvbmVnIGlzIG9mZjogTGluayBpcyBhbHdheXMgYXNzdW1lZCB0byBiZSB1cCAqLwotCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobWlpLT5kZXYpKQotCQkJbmV0aWZfY2Fycmllcl9vbihtaWktPmRldik7Ci0JfSBlbHNlCi0JCXI2MDQwX3BoeV9tb2RlX2NoayhtaWktPmRldik7Ci19Ci0KIHN0YXRpYyBpbnQgcjYwNDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgcjYwNDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7Ci0JaW50IHJjOwogCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJaWYgKCFscC0+cGh5ZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7Ci0JcmMgPSBnZW5lcmljX21paV9pb2N0bCgmbHAtPm1paV9pZiwgZGF0YSwgY21kLCBOVUxMKTsKLQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKLQlyNjA0MF9zZXRfY2FycmllcigmbHAtPm1paV9pZik7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwobHAtPnBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgcjYwNDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxpbWl0KQpAQCAtNzUxLDI2ICs3MDksNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBSZWFkIHRoZSBQSFkgSUQgKi8KLQlscC0+c3dpdGNoX3NpZyA9IHI2MDQwX3BoeV9yZWFkKGlvYWRkciwgMCwgMik7Ci0KLQlpZiAobHAtPnN3aXRjaF9zaWcgID09IElDUExVU19QSFlfSUQpIHsKLQkJcjYwNDBfcGh5X3dyaXRlKGlvYWRkciwgMjksIDMxLCAweDE3NUMpOyAvKiBFbmFibGUgcmVnaXN0ZXJzICovCi0JCWxwLT5waHlfbW9kZSA9IDB4ODAwMDsKLQl9IGVsc2UgewotCQkvKiBQSFkgTW9kZSBDaGVjayAqLwotCQlyNjA0MF9waHlfd3JpdGUoaW9hZGRyLCBscC0+cGh5X2FkZHIsIDQsIFBIWV9DQVApOwotCQlyNjA0MF9waHlfd3JpdGUoaW9hZGRyLCBscC0+cGh5X2FkZHIsIDAsIFBIWV9NT0RFKTsKLQotCQlpZiAoUEhZX01PREUgPT0gMHgzMTAwKQotCQkJbHAtPnBoeV9tb2RlID0gcjYwNDBfcGh5X21vZGVfY2hrKGRldik7Ci0JCWVsc2UKLQkJCWxwLT5waHlfbW9kZSA9IChQSFlfTU9ERSAmIDB4MDEwMCkgPyAweDgwMDA6MHgwOwotCX0KLQotCS8qIFNldCBkdXBsZXggbW9kZSAqLwotCWxwLT5tY3IwIHw9IGxwLT5waHlfbW9kZTsKLQogCS8qIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IFJEQyBndXlzKSAqLwogCXI2MDQwX3BoeV93cml0ZShpb2FkZHIsIDMwLCAxNywgKHI2MDQwX3BoeV9yZWFkKGlvYWRkciwgMzAsIDE3KSB8IDB4NDAwMCkpOwogCXI2MDQwX3BoeV93cml0ZShpb2FkZHIsIDMwLCAxNywgfigofnI2MDQwX3BoeV9yZWFkKGlvYWRkciwgMzAsIDE3KSkgfCAweDIwMDApKTsKQEAgLTc4MywzNSArNzIxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAgQSBwZXJpb2RpYyB0aW1lciByb3V0aW5lCi0JUG9sbGluZyBQSFkgQ2hpcCBMaW5rIFN0YXR1cwotKi8KLXN0YXRpYyB2b2lkIHI2MDQwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLQlzdHJ1Y3QgcjYwNDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7Ci0JdTE2IHBoeV9tb2RlOwotCi0JLyogUG9sbGluZyBQSFkgQ2hpcCBTdGF0dXMgKi8KLQlpZiAoUEhZX01PREUgPT0gMHgzMTAwKQotCQlwaHlfbW9kZSA9IHI2MDQwX3BoeV9tb2RlX2NoayhkZXYpOwotCWVsc2UKLQkJcGh5X21vZGUgPSAoUEhZX01PREUgJiAweDAxMDApID8gMHg4MDAwOjB4MDsKLQotCWlmIChwaHlfbW9kZSAhPSBscC0+cGh5X21vZGUpIHsKLQkJbHAtPnBoeV9tb2RlID0gcGh5X21vZGU7Ci0JCWxwLT5tY3IwID0gKGxwLT5tY3IwICYgMHg3ZmZmKSB8IHBoeV9tb2RlOwotCQlpb3dyaXRlMTYobHAtPm1jcjAsIGlvYWRkcik7Ci0JfQotCi0JLyogVGltZXIgYWN0aXZlIGFnYWluICovCi0JbW9kX3RpbWVyKCZscC0+dGltZXIsIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIEhaKSk7Ci0KLQkvKiBDaGVjayBtZWRpYSAqLwotCW1paV9jaGVja19tZWRpYSgmbHAtPm1paV9pZiwgMSwgMSk7Ci19CiAKIC8qIFJlYWQvc2V0IE1BQyBhZGRyZXNzIHJvdXRpbmVzICovCiBzdGF0aWMgdm9pZCByNjA0MF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtODczLDEwICs3ODIsNiBAQAogCW5hcGlfZW5hYmxlKCZscC0+bmFwaSk7CiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAotCS8qIHNldCBhbmQgYWN0aXZlIGEgdGltZXIgcHJvY2VzcyAqLwotCXNldHVwX3RpbWVyKCZscC0+dGltZXIsIHI2MDQwX3RpbWVyLCAodW5zaWduZWQgbG9uZykgZGV2KTsKLQlpZiAobHAtPnN3aXRjaF9zaWcgIT0gSUNQTFVTX1BIWV9JRCkKLQkJbW9kX3RpbWVyKCZscC0+dGltZXIsIGppZmZpZXMgKyBIWik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMTUsNDAgKzkyMCwyMiBAQAogc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCByNjA0MF9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJjOwogCi0Jc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOwotCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmcnAtPm1paV9pZiwgY21kKTsKLQlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gIHBoeV9ldGh0b29sX2dzZXQocnAtPnBoeWRldiwgY21kKTsKIH0KIAogc3RhdGljIGludCBuZXRkZXZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCByNjA0MF9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJjOwogCi0Jc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOwotCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmcnAtPm1paV9pZiwgY21kKTsKLQlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKLQlyNjA0MF9zZXRfY2FycmllcigmcnAtPm1paV9pZik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHI2MDQwX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiBtaWlfbGlua19vaygmcnAtPm1paV9pZik7CisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocnAtPnBoeWRldiwgY21kKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKIAkuZ2V0X3NldHRpbmdzCQk9IG5ldGRldl9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSBuZXRkZXZfc2V0X3NldHRpbmdzLAotCS5nZXRfbGluawkJPSBuZXRkZXZfZ2V0X2xpbmssCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHI2MDQwX25ldGRldl9vcHMgPSB7CkBAIC0xMDY3LDYgKzk1NCw3OSBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgdm9pZCByNjA0MF9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByNjA0MF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGxwLT5waHlkZXY7CisJaW50IHN0YXR1c19jaGFuZ2VkID0gMDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCisJQlVHX09OKCFwaHlkZXYpOworCisJaWYgKGxwLT5vbGRfbGluayAhPSBwaHlkZXYtPmxpbmspIHsKKwkJc3RhdHVzX2NoYW5nZWQgPSAxOworCQlscC0+b2xkX2xpbmsgPSBwaHlkZXYtPmxpbms7CisJfQorCisJLyogcmVmbGVjdCBkdXBsZXggY2hhbmdlICovCisJaWYgKHBoeWRldi0+bGluayAmJiAobHAtPm9sZF9kdXBsZXggIT0gcGh5ZGV2LT5kdXBsZXgpKSB7CisJCWxwLT5tY3IwIHw9IChwaHlkZXYtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCA/IDB4ODAwMCA6IDApOworCQlpb3dyaXRlMTYobHAtPm1jcjAsIGlvYWRkcik7CisKKwkJc3RhdHVzX2NoYW5nZWQgPSAxOworCQlscC0+b2xkX2R1cGxleCA9IHBoeWRldi0+ZHVwbGV4OworCX0KKworCWlmIChzdGF0dXNfY2hhbmdlZCkgeworCQlwcl9pbmZvKCIlczogbGluayAlcyIsIGRldi0+bmFtZSwgcGh5ZGV2LT5saW5rID8KKwkJCSJVUCIgOiAiRE9XTiIpOworCQlpZiAocGh5ZGV2LT5saW5rKQorCQkJcHJfY29udCgiIC0gJWQvJXMiLCBwaHlkZXYtPnNwZWVkLAorCQkJRFVQTEVYX0ZVTEwgPT0gcGh5ZGV2LT5kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCQlwcl9jb250KCJcbiIpOworCX0KK30KKworc3RhdGljIGludCByNjA0MF9taWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjYwNDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBOVUxMOworCisJcGh5ZGV2ID0gcGh5X2ZpbmRfZmlyc3QobHAtPm1paV9idXMpOworCWlmICghcGh5ZGV2KSB7CisJCWRldl9lcnIoJmxwLT5wZGV2LT5kZXYsICJubyBQSFkgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIGRldl9uYW1lKCZwaHlkZXYtPmRldiksICZyNjA0MF9hZGp1c3RfbGluaywKKwkJCQkwLCBQSFlfSU5URVJGQUNFX01PREVfTUlJKTsKKworCWlmIChJU19FUlIocGh5ZGV2KSkgeworCQlkZXZfZXJyKCZscC0+cGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCB0byBQSFlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwaHlkZXYpOworCX0KKworCS8qIG1hc2sgd2l0aCBNQUMgc3VwcG9ydGVkIGZlYXR1cmVzICovCisJcGh5ZGV2LT5zdXBwb3J0ZWQgJj0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKKwkJCQl8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCQl8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAorCQkJCXwgU1VQUE9SVEVEX0F1dG9uZWcKKwkJCQl8IFNVUFBPUlRFRF9NSUkKKwkJCQl8IFNVUFBPUlRFRF9UUCk7CisKKwlwaHlkZXYtPmFkdmVydGlzaW5nID0gcGh5ZGV2LT5zdXBwb3J0ZWQ7CisJbHAtPnBoeWRldiA9IHBoeWRldjsKKwlscC0+b2xkX2xpbmsgPSAwOworCWxwLT5vbGRfZHVwbGV4ID0gLTE7CisKKwlkZXZfaW5mbygmbHAtPnBkZXYtPmRldiwgImF0dGFjaGVkIFBIWSBkcml2ZXIgWyVzXSAiCisJCSIobWlpX2J1czpwaHlfYWRkcj0lcylcbiIsCisJCXBoeWRldi0+ZHJ2LT5uYW1lLCBkZXZfbmFtZSgmcGh5ZGV2LT5kZXYpKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCByNjA0MF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0xMDc3LDYgKzEwMzcsNyBAQAogCXN0YXRpYyBpbnQgY2FyZF9pZHggPSAtMTsKIAlpbnQgYmFyID0gMDsKIAl1MTYgKmFkcnA7CisJaW50IGk7CiAKIAlwcmludGsoIiVzXG4iLCB2ZXJzaW9uKTsKIApAQCAtMTE2Myw3ICsxMTI0LDYgQEAKIAkvKiBJbml0IFJEQyBwcml2YXRlIGRhdGEgKi8KIAlscC0+bWNyMCA9IDB4MTAwMjsKIAlscC0+cGh5X2FkZHIgPSBwaHlfdGFibGVbY2FyZF9pZHhdOwotCWxwLT5zd2l0Y2hfc2lnID0gMDsKIAogCS8qIFRoZSBSREMtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KIAlkZXYtPm5ldGRldl9vcHMgPSAmcjYwNDBfbmV0ZGV2X29wczsKQEAgLTExNzEsMjggKzExMzEsNTQgQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCW5ldGlmX25hcGlfYWRkKGRldiwgJmxwLT5uYXBpLCByNjA0MF9wb2xsLCA2NCk7Ci0JbHAtPm1paV9pZi5kZXYgPSBkZXY7Ci0JbHAtPm1paV9pZi5tZGlvX3JlYWQgPSByNjA0MF9tZGlvX3JlYWQ7Ci0JbHAtPm1paV9pZi5tZGlvX3dyaXRlID0gcjYwNDBfbWRpb193cml0ZTsKLQlscC0+bWlpX2lmLnBoeV9pZCA9IGxwLT5waHlfYWRkcjsKLQlscC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKLQlscC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CiAKLQkvKiBDaGVjayB0aGUgdmVuZG9yIElEIG9uIHRoZSBQSFksIGlmIDB4ZmZmZiBhc3N1bWUgbm9uZSBhdHRhY2hlZCAqLwotCWlmIChyNjA0MF9waHlfcmVhZChpb2FkZHIsIGxwLT5waHlfYWRkciwgMikgPT0gMHhmZmZmKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBkZXRlY3QgYW4gYXR0YWNoZWQgUEhZXG4iKTsKLQkJZXJyID0gLUVOT0RFVjsKKwlscC0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwlpZiAoIWxwLT5taWlfYnVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1kaW9idXNfYWxsb2MoKSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9vdXRfdW5tYXA7CiAJfQogCisJbHAtPm1paV9idXMtPnByaXYgPSBkZXY7CisJbHAtPm1paV9idXMtPnJlYWQgPSByNjA0MF9tZGlvYnVzX3JlYWQ7CisJbHAtPm1paV9idXMtPndyaXRlID0gcjYwNDBfbWRpb2J1c193cml0ZTsKKwlscC0+bWlpX2J1cy0+cmVzZXQgPSByNjA0MF9tZGlvYnVzX3Jlc2V0OworCWxwLT5taWlfYnVzLT5uYW1lID0gInI2MDQwX2V0aF9taWkiOworCXNucHJpbnRmKGxwLT5taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLCBjYXJkX2lkeCk7CisJbHAtPm1paV9idXMtPmlycSA9IGttYWxsb2Moc2l6ZW9mKGludCkqUEhZX01BWF9BRERSLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwLT5taWlfYnVzLT5pcnEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlpX2J1cyBpcnEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9vdXRfbWRpbzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCisJCWxwLT5taWlfYnVzLT5pcnFbaV0gPSBQSFlfUE9MTDsKKworCWVyciA9IG1kaW9idXNfcmVnaXN0ZXIobHAtPm1paV9idXMpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIE1JSSBidXNcbiIpOworCQlnb3RvIGVycl9vdXRfbWRpb19pcnE7CisJfQorCisJZXJyID0gcjYwNDBfbWlpX3Byb2JlKGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcHJvYmUgTUlJIGJ1c1xuIik7CisJCWdvdG8gZXJyX291dF9tZGlvX3VucmVnaXN0ZXI7CisJfQorCiAJLyogUmVnaXN0ZXIgbmV0IGRldmljZS4gQWZ0ZXIgdGhpcyBkZXYtPm5hbWUgYXNzaWduICovCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfb3V0X21kaW9fdW5yZWdpc3RlcjsKIAl9CiAJcmV0dXJuIDA7CiAKK2Vycl9vdXRfbWRpb191bnJlZ2lzdGVyOgorCW1kaW9idXNfdW5yZWdpc3RlcihscC0+bWlpX2J1cyk7CitlcnJfb3V0X21kaW9faXJxOgorCWtmcmVlKGxwLT5taWlfYnVzLT5pcnEpOworZXJyX291dF9tZGlvOgorCW1kaW9idXNfZnJlZShscC0+bWlpX2J1cyk7CiBlcnJfb3V0X3VubWFwOgogCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CiBlcnJfb3V0X2ZyZWVfcmVzOgpAQCAtMTIwNiw4ICsxMTkyLDEyIEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgcjYwNDBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByNjA0MF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCW1kaW9idXNfdW5yZWdpc3RlcihscC0+bWlpX2J1cyk7CisJa2ZyZWUobHAtPm1paV9idXMtPmlycSk7CisJbWRpb2J1c19mcmVlKGxwLT5taWlfYnVzKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCWZyZWVfbmV0ZGV2KGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKaW5kZXggY2RjNmE1Yy4uMDc4YmJmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjgxNjkuYworKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIFJUTF9XMzIocmVnLCB2YWwzMikJd3JpdGVsICgodmFsMzIpLCBpb2FkZHIgKyAocmVnKSkKICNkZWZpbmUgUlRMX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKICNkZWZpbmUgUlRMX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCi0jZGVmaW5lIFJUTF9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorI2RlZmluZSBSVExfUjMyKHJlZykJCXJlYWRsIChpb2FkZHIgKyAocmVnKSkKIAogZW51bSBtYWNfdmVyc2lvbiB7CiAJUlRMX0dJR0FfTUFDX05PTkUgICA9IDB4MDAsCkBAIC0zMjE5LDExICszMjE5LDggQEAKIAogCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmcGRldi0+ZGV2LCB0cC0+ZmVhdHVyZXMgJiBSVExfRkVBVFVSRV9XT0wpOwogCi0JaWYgKHBjaV9kZXZfcnVuX3dha2UocGRldikpIHsKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZwZGV2LT5kZXYpOwotCQlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKLQl9Ci0JcG1fcnVudGltZV9pZGxlKCZwZGV2LT5kZXYpOworCWlmIChwY2lfZGV2X3J1bl93YWtlKHBkZXYpKQorCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CiAKIG91dDoKIAlyZXR1cm4gcmM7CkBAIC0zMjQ2LDE3ICszMjQzLDEyIEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwotCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAKLQlpZiAocGNpX2Rldl9ydW5fd2FrZShwZGV2KSkgewotCQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0JCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCgmcGRldi0+ZGV2KTsKLQl9Ci0JcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwZGV2LT5kZXYpOworCWlmIChwY2lfZGV2X3J1bl93YWtlKHBkZXYpKQorCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmcGRldi0+ZGV2KTsKIAogCS8qIHJlc3RvcmUgb3JpZ2luYWwgTUFDIGFkZHJlc3MgKi8KIAlydGxfcmFyX3NldCh0cCwgZGV2LT5wZXJtX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmggYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAppbmRleCA0MTY2NjlmLi4zNjg4MzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaApAQCAtMSw2ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHJlZ3MuaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIE5ldGVyaW9uIDEwR2JFIFNlcnZlciBOSUMKLSAqIENvcHlyaWdodChjKSAyMDAyLTIwMDcgTmV0ZXJpb24gSW5jLgorICogQ29weXJpZ2h0KGMpIDIwMDItMjAxMCBFeGFyIENvcnAuCiAKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggMWQzN2YwYy4uMThiYzViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtMSw2ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHMyaW8uYzogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIE5ldGVyaW9uIDEwR2JFIFNlcnZlciBOSUMKLSAqIENvcHlyaWdodChjKSAyMDAyLTIwMDcgTmV0ZXJpb24gSW5jLgorICogQ29weXJpZ2h0KGMpIDIwMDItMjAxMCBFeGFyIENvcnAuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgogICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KQEAgLTM4LDcgKzM4LDcgQEAKICAqIFR4IGRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvcnJlc3BvbmRpbmcgRklGTy4KICAqIGludHJfdHlwZTogVGhpcyBkZWZpbmVzIHRoZSB0eXBlIG9mIGludGVycnVwdC4gVGhlIHZhbHVlcyBjYW4gYmUgMChJTlRBKSwKICAqICAgICAyKE1TSV9YKS4gRGVmYXVsdCB2YWx1ZSBpcyAnMihNU0lfWCknCi0gKiBscm9fZW5hYmxlOiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgTGFyZ2UgUmVjZWl2ZSBPZmZsb2FkIChMUk8pIG9yIG5vdC4KKyAqIGxybzogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIExhcmdlIFJlY2VpdmUgT2ZmbG9hZCAoTFJPKSBvciBub3QuCiAgKiAgICAgUG9zc2libGUgdmFsdWVzICcxJyBmb3IgZW5hYmxlICcwJyBmb3IgZGlzYWJsZS4gRGVmYXVsdCBpcyAnMCcKICAqIGxyb19tYXhfcGt0czogVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGNhbiBiZQogICogICAgIGFnZ3JlZ2F0ZWQgYXMgYSBzaW5nbGUgbGFyZ2UgcGFja2V0CkBAIC05MCw3ICs5MCw3IEBACiAjaW5jbHVkZSAiczJpby5oIgogI2luY2x1ZGUgInMyaW8tcmVncy5oIgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMjYuMjUiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMjYuMjYiCiAKIC8qIFMyaW8gRHJpdmVyIG5hbWUgJiB2ZXJzaW9uLiAqLwogc3RhdGljIGNoYXIgczJpb19kcml2ZXJfbmFtZVtdID0gIk5ldGVyaW9uIjsKQEAgLTQ5Niw3ICs0OTYsNyBAQAogLyogSW50ZXJydXB0IHR5cGUuIFZhbHVlcyBjYW4gYmUgMChJTlRBKSwgMihNU0lfWCkgKi8KIFMySU9fUEFSTV9JTlQoaW50cl90eXBlLCAyKTsKIC8qIExhcmdlIHJlY2VpdmUgb2ZmbG9hZCBmZWF0dXJlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGxyb19lbmFibGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGxyb19lbmFibGUgPSAxOwogbW9kdWxlX3BhcmFtX25hbWVkKGxybywgbHJvX2VuYWJsZSwgdWludCwgMCk7CiAKIC8qIE1heCBwa3RzIHRvIGJlIGFnZ3JlZ2F0ZWQgYnkgTFJPIGF0IG9uZSB0aW1lLiBJZiBub3Qgc3BlY2lmaWVkLApAQCAtNzk1LDcgKzc5NSw2IEBACiAJCXJpbmctPnJ4X2N1cnJfcHV0X2luZm8ucmluZ19sZW4gPSByeF9jZmctPm51bV9yeGQgLSAxOwogCQlyaW5nLT5uaWMgPSBuaWM7CiAJCXJpbmctPnJpbmdfbm8gPSBpOwotCQlyaW5nLT5scm8gPSBscm9fZW5hYmxlOwogCiAJCWJsa19jbnQgPSByeF9jZmctPm51bV9yeGQgLyAocnhkX2NvdW50W25pYy0+cnhkX21vZGVdICsgMSk7CiAJCS8qICBBbGxvY2F0aW5nIGFsbCB0aGUgUnggYmxvY2tzICovCkBAIC01Nzk3LDcgKzU3OTYsNyBAQAogewogCXU4ICp2cGRfZGF0YTsKIAl1OCBkYXRhOwotCWludCBpID0gMCwgY250LCBmYWlsID0gMDsKKwlpbnQgaSA9IDAsIGNudCwgbGVuLCBmYWlsID0gMDsKIAlpbnQgdnBkX2FkZHIgPSAweDgwOwogCXN0cnVjdCBzd1N0YXQgKnN3c3RhdHMgPSAmbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0OwogCkBAIC01ODM4LDIwICs1ODM3LDI4IEBACiAKIAlpZiAoIWZhaWwpIHsKIAkJLyogcmVhZCBzZXJpYWwgbnVtYmVyIG9mIGFkYXB0ZXIgKi8KLQkJZm9yIChjbnQgPSAwOyBjbnQgPCAyNTY7IGNudCsrKSB7CisJCWZvciAoY250ID0gMDsgY250IDwgMjUyOyBjbnQrKykgewogCQkJaWYgKCh2cGRfZGF0YVtjbnRdID09ICdTJykgJiYKLQkJCSAgICAodnBkX2RhdGFbY250KzFdID09ICdOJykgJiYKLQkJCSAgICAodnBkX2RhdGFbY250KzJdIDwgVlBEX1NUUklOR19MRU4pKSB7Ci0JCQkJbWVtc2V0KG5pYy0+c2VyaWFsX251bSwgMCwgVlBEX1NUUklOR19MRU4pOwotCQkJCW1lbWNweShuaWMtPnNlcmlhbF9udW0sICZ2cGRfZGF0YVtjbnQgKyAzXSwKLQkJCQkgICAgICAgdnBkX2RhdGFbY250KzJdKTsKLQkJCQlicmVhazsKKwkJCSAgICAodnBkX2RhdGFbY250KzFdID09ICdOJykpIHsKKwkJCQlsZW4gPSB2cGRfZGF0YVtjbnQrMl07CisJCQkJaWYgKGxlbiA8IG1pbihWUERfU1RSSU5HX0xFTiwgMjU2LWNudC0yKSkgeworCQkJCQltZW1jcHkobmljLT5zZXJpYWxfbnVtLAorCQkJCQkgICAgICAgJnZwZF9kYXRhW2NudCArIDNdLAorCQkJCQkgICAgICAgbGVuKTsKKwkJCQkJbWVtc2V0KG5pYy0+c2VyaWFsX251bStsZW4sCisJCQkJCSAgICAgICAwLAorCQkJCQkgICAgICAgVlBEX1NUUklOR19MRU4tbGVuKTsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQl9CiAJfQogCi0JaWYgKCghZmFpbCkgJiYgKHZwZF9kYXRhWzFdIDwgVlBEX1NUUklOR19MRU4pKQotCQltZW1jcHkobmljLT5wcm9kdWN0X25hbWUsICZ2cGRfZGF0YVszXSwgdnBkX2RhdGFbMV0pOworCWlmICgoIWZhaWwpICYmICh2cGRfZGF0YVsxXSA8IFZQRF9TVFJJTkdfTEVOKSkgeworCQlsZW4gPSB2cGRfZGF0YVsxXTsKKwkJbWVtY3B5KG5pYy0+cHJvZHVjdF9uYW1lLCAmdnBkX2RhdGFbM10sIGxlbik7CisJCW5pYy0+cHJvZHVjdF9uYW1lW2xlbl0gPSAwOworCX0KIAlrZnJlZSh2cGRfZGF0YSk7CiAJc3dzdGF0cy0+bWVtX2ZyZWVkICs9IDI1NjsKIH0KQEAgLTY3MDcsNiArNjcxNCw3IEBACiB7CiAJcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9UU08pICE9IDA7CiB9CisKIHN0YXRpYyBpbnQgczJpb19ldGh0b29sX29wX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCiB7CiAJaWYgKGRhdGEpCkBAIC02NzE3LDYgKzY3MjUsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzMmlvX2V0aHRvb2xfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYyA9IDA7CisJaW50IGNoYW5nZWQgPSAwOworCisJaWYgKGRhdGEgJiB+RVRIX0ZMQUdfTFJPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkYXRhICYgRVRIX0ZMQUdfTFJPKSB7CisJCWlmIChscm9fZW5hYmxlKSB7CisJCQlpZiAoIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pKSB7CisJCQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pIHsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9MUk87CisJCWNoYW5nZWQgPSAxOworCX0KKworCWlmIChjaGFuZ2VkICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzMmlvX3N0b3BfYWxsX3R4X3F1ZXVlKHNwKTsKKwkJczJpb19jYXJkX2Rvd24oc3ApOworCQlzcC0+bHJvID0gISEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKTsKKwkJcmMgPSBzMmlvX2NhcmRfdXAoc3ApOworCQlpZiAocmMpCisJCQlzMmlvX3Jlc2V0KHNwKTsKKwkJZWxzZQorCQkJczJpb19zdGFydF9hbGxfdHhfcXVldWUoc3ApOworCX0KKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncyA9IHMyaW9fZXRodG9vbF9nc2V0LAogCS5zZXRfc2V0dGluZ3MgPSBzMmlvX2V0aHRvb2xfc3NldCwKQEAgLTY3MzMsNiArNjc3Nyw4IEBACiAJLmdldF9yeF9jc3VtID0gczJpb19ldGh0b29sX2dldF9yeF9jc3VtLAogCS5zZXRfcnhfY3N1bSA9IHMyaW9fZXRodG9vbF9zZXRfcnhfY3N1bSwKIAkuc2V0X3R4X2NzdW0gPSBzMmlvX2V0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLnNldF9mbGFncyA9IHMyaW9fZXRodG9vbF9zZXRfZmxhZ3MsCisJLmdldF9mbGFncyA9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzLAogCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKIAkuZ2V0X3RzbyA9IHMyaW9fZXRodG9vbF9vcF9nZXRfdHNvLAogCS5zZXRfdHNvID0gczJpb19ldGh0b29sX29wX3NldF90c28sCkBAIC03MjYxLDYgKzczMDcsNyBAQAogCQlzdHJ1Y3QgcmluZ19pbmZvICpyaW5nID0gJm1hY19jb250cm9sLT5yaW5nc1tpXTsKIAogCQlyaW5nLT5tdHUgPSBkZXYtPm10dTsKKwkJcmluZy0+bHJvID0gc3AtPmxybzsKIAkJcmV0ID0gZmlsbF9yeF9idWZmZXJzKHNwLCByaW5nLCAxKTsKIAkJaWYgKHJldCkgewogCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogT3V0IG9mIG1lbW9yeSBpbiBPcGVuXG4iLApAQCAtNzg0Nyw3ICs3ODk0LDYgQEAKIAogCS8qICBQcml2YXRlIG1lbWJlciB2YXJpYWJsZSBpbml0aWFsaXplZCB0byBzMmlvIE5JQyBzdHJ1Y3R1cmUgKi8KIAlzcCA9IG5ldGRldl9wcml2KGRldik7Ci0JbWVtc2V0KHNwLCAwLCBzaXplb2Yoc3RydWN0IHMyaW9fbmljKSk7CiAJc3AtPmRldiA9IGRldjsKIAlzcC0+cGRldiA9IHBkZXY7CiAJc3AtPmhpZ2hfZG1hX2ZsYWcgPSBkbWFfZmxhZzsKQEAgLTgwMDEsNyArODA0Nyw4IEBACiAJZGV2LT5uZXRkZXZfb3BzID0gJnMyaW9fbmV0ZGV2X29wczsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKLQorCWlmIChscm9fZW5hYmxlKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOwogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKIAlpZiAoc3AtPmhpZ2hfZG1hX2ZsYWcgPT0gdHJ1ZSkKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CkBAIC04MTU5LDcgKzgyMDYsNyBAQAogCQlnb3RvIHJlZ2lzdGVyX2ZhaWxlZDsKIAl9CiAJczJpb192cGRfcmVhZChzcCk7Ci0JREJHX1BSSU5UKEVSUl9EQkcsICJDb3B5cmlnaHQoYykgMjAwMi0yMDA3IE5ldGVyaW9uIEluYy5cbiIpOworCURCR19QUklOVChFUlJfREJHLCAiQ29weXJpZ2h0KGMpIDIwMDItMjAxMCBFeGFyIENvcnAuXG4iKTsKIAlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBOZXRlcmlvbiAlcyAocmV2ICVkKVxuIiwgZGV2LT5uYW1lLAogCQkgIHNwLT5wcm9kdWN0X25hbWUsIHBkZXYtPnJldmlzaW9uKTsKIAlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBEcml2ZXIgdmVyc2lvbiAlc1xuIiwgZGV2LT5uYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5oIGIvZHJpdmVycy9uZXQvczJpby5oCmluZGV4IDVlNTJjNzUuLjBhZjAzMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLmgKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBzMmlvLmg6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBOZXRlcmlvbiAxMEdiRSBTZXJ2ZXIgTklDCi0gKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA3IE5ldGVyaW9uIEluYy4KKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLgogCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCiAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgpAQCAtNjUsNyArNjUsNyBAQAogCiAvKiBERUJVRyBtZXNzYWdlIHByaW50LiAqLwogI2RlZmluZSBEQkdfUFJJTlQoZGJnX2xldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHsJCQlcCi0JaWYgKGRiZ19sZXZlbCA+PSBkZWJ1Z19sZXZlbCkJCQkJXAorCWlmIChkYmdfbGV2ZWwgPD0gZGVidWdfbGV2ZWwpCQkJCVwKIAkJcHJfaW5mbyhmbXQsICMjYXJncyk7CQkJCVwKIAl9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKaW5kZXggNzllZWUzMC4uOGU2YmQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpAQCAtMjUzMiw3ICsyNTMyLDcgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhc2MtPnBoeV9kZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwoc2MtPnBoeV9kZXYsIGlmX21paShycSksIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwoc2MtPnBoeV9kZXYsIHJxLCBjbWQpOwogfQogCiBzdGF0aWMgaW50IHNibWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZWZ4LmMgYi9kcml2ZXJzL25ldC9zZmMvZWZ4LmMKaW5kZXggMTU2NDYwNS4uYmE2NzRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2VmeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9lZnguYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIm5pYy5oIgogCiAjaW5jbHVkZSAibWNkaS5oIgorI2luY2x1ZGUgIndvcmthcm91bmRzLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTkyLDEzICs5Myw2IEBACiAKICNkZWZpbmUgRUZYX01BWF9NVFUgKDkgKiAxMDI0KQogCi0vKiBSWCBzbG93IGZpbGwgd29ya3F1ZXVlLiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscyBpbiB0aGUgZmFzdCBwYXRoLAotICogYSB3b3JrIGl0ZW0gaXMgcHVzaGVkIG9udG8gdGhpcyB3b3JrIHF1ZXVlIHRvIHJldHJ5IHRoZSBhbGxvY2F0aW9uIGxhdGVyLAotICogdG8gYXZvaWQgdGhlIE5JQyBiZWluZyBzdGFydmVkIG9mIFJYIGJ1ZmZlcnMuIFNpbmNlIHRoaXMgaXMgYSBwZXIgY3B1Ci0gKiB3b3JrcXVldWUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZ2FpbmVkIGluIG1ha2luZyBpdCBwZXIgTklDCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcmVmaWxsX3dvcmtxdWV1ZTsKLQogLyogUmVzZXQgd29ya3F1ZXVlLiBJZiBhbnkgTklDIGhhcyBhIGhhcmR3YXJlIGZhaWx1cmUgdGhlbiBhIHJlc2V0IHdpbGwgYmUKICAqIHF1ZXVlZCBvbnRvIHRoaXMgd29yayBxdWV1ZS4gVGhpcyBpcyBub3QgYSBwZXItbmljIHdvcmsgcXVldWUsIGJlY2F1c2UKICAqIGVmeF9yZXNldF93b3JrKCkgYWNxdWlyZXMgdGhlIHJ0bmwgbG9jaywgc28gcmVzZXRzIGFyZSBuYXR1cmFsbHkgc2VyaWFsaXNlZC4KQEAgLTE5NSw2ICsxODksMTMgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaXJxX2FkYXB0X2hpZ2hfdGhyZXNoLAogCQkgIlRocmVzaG9sZCBzY29yZSBmb3IgaW5jcmVhc2luZyBJUlEgbW9kZXJhdGlvbiIpOwogCitzdGF0aWMgdW5zaWduZWQgZGVidWcgPSAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8CisJCQkgTkVUSUZfTVNHX0xJTksgfCBORVRJRl9NU0dfSUZET1dOIHwKKwkJCSBORVRJRl9NU0dfSUZVUCB8IE5FVElGX01TR19SWF9FUlIgfAorCQkJIE5FVElGX01TR19UWF9FUlIgfCBORVRJRl9NU0dfSFcpOworbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJCaXRtYXBwZWQgZGVidWdnaW5nIG1lc3NhZ2UgZW5hYmxlIHZhbHVlIik7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCBwcm90b3R5cGVzCkBAIC0yNzgsMTYgKzI3OSwxNiBAQAogewogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCA9CiAJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZWZ4X2NoYW5uZWwsIG5hcGlfc3RyKTsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCWludCBzcGVudDsKIAotCUVGWF9UUkFDRShjaGFubmVsLT5lZngsICJjaGFubmVsICVkIE5BUEkgcG9sbCBleGVjdXRpbmcgb24gQ1BVICVkXG4iLAotCQkgIGNoYW5uZWwtPmNoYW5uZWwsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCW5ldGlmX3ZkYmcoZWZ4LCBpbnRyLCBlZngtPm5ldF9kZXYsCisJCSAgICJjaGFubmVsICVkIE5BUEkgcG9sbCBleGVjdXRpbmcgb24gQ1BVICVkXG4iLAorCQkgICBjaGFubmVsLT5jaGFubmVsLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCXNwZW50ID0gZWZ4X3Byb2Nlc3NfY2hhbm5lbChjaGFubmVsLCBidWRnZXQpOwogCiAJaWYgKHNwZW50IDwgYnVkZ2V0KSB7Ci0JCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7Ci0KIAkJaWYgKGNoYW5uZWwtPmNoYW5uZWwgPCBlZngtPm5fcnhfY2hhbm5lbHMgJiYKIAkJICAgIGVmeC0+aXJxX3J4X2FkYXB0aXZlICYmCiAJCSAgICB1bmxpa2VseSgrK2NoYW5uZWwtPmlycV9jb3VudCA9PSAxMDAwKSkgewpAQCAtMzYzLDcgKzM2NCw4IEBACiAgKi8KIHN0YXRpYyBpbnQgZWZ4X3Byb2JlX2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCiB7Ci0JRUZYX0xPRyhjaGFubmVsLT5lZngsICJjaGFuICVkIGNyZWF0ZSBldmVudCBxdWV1ZVxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CisJbmV0aWZfZGJnKGNoYW5uZWwtPmVmeCwgcHJvYmUsIGNoYW5uZWwtPmVmeC0+bmV0X2RldiwKKwkJICAiY2hhbiAlZCBjcmVhdGUgZXZlbnQgcXVldWVcbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJcmV0dXJuIGVmeF9uaWNfcHJvYmVfZXZlbnRxKGNoYW5uZWwpOwogfQpAQCAtMzcxLDcgKzM3Myw4IEBACiAvKiBQcmVwYXJlIGNoYW5uZWwncyBldmVudCBxdWV1ZSAqLwogc3RhdGljIHZvaWQgZWZ4X2luaXRfZXZlbnRxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKLQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImNoYW4gJWQgaW5pdCBldmVudCBxdWV1ZVxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CisJbmV0aWZfZGJnKGNoYW5uZWwtPmVmeCwgZHJ2LCBjaGFubmVsLT5lZngtPm5ldF9kZXYsCisJCSAgImNoYW4gJWQgaW5pdCBldmVudCBxdWV1ZVxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CiAKIAljaGFubmVsLT5ldmVudHFfcmVhZF9wdHIgPSAwOwogCkBAIC0zODAsMTQgKzM4MywxNiBAQAogCiBzdGF0aWMgdm9pZCBlZnhfZmluaV9ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQogewotCUVGWF9MT0coY2hhbm5lbC0+ZWZ4LCAiY2hhbiAlZCBmaW5pIGV2ZW50IHF1ZXVlXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKKwluZXRpZl9kYmcoY2hhbm5lbC0+ZWZ4LCBkcnYsIGNoYW5uZWwtPmVmeC0+bmV0X2RldiwKKwkJICAiY2hhbiAlZCBmaW5pIGV2ZW50IHF1ZXVlXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKIAogCWVmeF9uaWNfZmluaV9ldmVudHEoY2hhbm5lbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVmeF9yZW1vdmVfZXZlbnRxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKLQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImNoYW4gJWQgcmVtb3ZlIGV2ZW50IHF1ZXVlXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKKwluZXRpZl9kYmcoY2hhbm5lbC0+ZWZ4LCBkcnYsIGNoYW5uZWwtPmVmeC0+bmV0X2RldiwKKwkJICAiY2hhbiAlZCByZW1vdmUgZXZlbnQgcXVldWVcbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJZWZ4X25pY19yZW1vdmVfZXZlbnRxKGNoYW5uZWwpOwogfQpAQCAtNDA0LDcgKzQwOSw4IEBACiAJc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7CiAJaW50IHJjOwogCi0JRUZYX0xPRyhjaGFubmVsLT5lZngsICJjcmVhdGluZyBjaGFubmVsICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKKwluZXRpZl9kYmcoY2hhbm5lbC0+ZWZ4LCBwcm9iZSwgY2hhbm5lbC0+ZWZ4LT5uZXRfZGV2LAorCQkgICJjcmVhdGluZyBjaGFubmVsICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKIAogCXJjID0gZWZ4X3Byb2JlX2V2ZW50cShjaGFubmVsKTsKIAlpZiAocmMpCkBAIC00NzQsMTIgKzQ4MCwxNSBAQAogCSAqLwogCWVmeC0+cnhfYnVmZmVyX2xlbiA9IChtYXgoRUZYX1BBR0VfSVBfQUxJR04sIE5FVF9JUF9BTElHTikgKwogCQkJICAgICAgRUZYX01BWF9GUkFNRV9MRU4oZWZ4LT5uZXRfZGV2LT5tdHUpICsKKwkJCSAgICAgIGVmeC0+dHlwZS0+cnhfYnVmZmVyX2hhc2hfc2l6ZSArCiAJCQkgICAgICBlZngtPnR5cGUtPnJ4X2J1ZmZlcl9wYWRkaW5nKTsKLQllZngtPnJ4X2J1ZmZlcl9vcmRlciA9IGdldF9vcmRlcihlZngtPnJ4X2J1ZmZlcl9sZW4pOworCWVmeC0+cnhfYnVmZmVyX29yZGVyID0gZ2V0X29yZGVyKGVmeC0+cnhfYnVmZmVyX2xlbiArCisJCQkJCSBzaXplb2Yoc3RydWN0IGVmeF9yeF9wYWdlX3N0YXRlKSk7CiAKIAkvKiBJbml0aWFsaXNlIHRoZSBjaGFubmVscyAqLwogCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkgewotCQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImluaXQgY2hhbiAlZFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CisJCW5ldGlmX2RiZyhjaGFubmVsLT5lZngsIGRydiwgY2hhbm5lbC0+ZWZ4LT5uZXRfZGV2LAorCQkJICAiaW5pdCBjaGFuICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKIAogCQllZnhfaW5pdF9ldmVudHEoY2hhbm5lbCk7CiAKQEAgLTUwNiw3ICs1MTUsOCBAQAogewogCXN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlOwogCi0JRUZYX0xPRyhjaGFubmVsLT5lZngsICJzdGFydGluZyBjaGFuICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKKwluZXRpZl9kYmcoY2hhbm5lbC0+ZWZ4LCBpZnVwLCBjaGFubmVsLT5lZngtPm5ldF9kZXYsCisJCSAgInN0YXJ0aW5nIGNoYW4gJWRcbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGlzIGNoYW5uZWwgbWF5IHNldCB3b3JrX3BlbmRpbmcKIAkgKiBhcyBzb29uIGFzIHdlIGVuYWJsZSBpdC4gIE1ha2Ugc3VyZSBpdCdzIGNsZWFyZWQgYmVmb3JlCkBAIC01MTUsMTEgKzUyNSwxMSBAQAogCWNoYW5uZWwtPmVuYWJsZWQgPSB0cnVlOwogCXNtcF93bWIoKTsKIAotCW5hcGlfZW5hYmxlKCZjaGFubmVsLT5uYXBpX3N0cik7Ci0KLQkvKiBMb2FkIHVwIFJYIGRlc2NyaXB0b3JzICovCisJLyogRmlsbCB0aGUgcXVldWVzIGJlZm9yZSBlbmFibGluZyBOQVBJICovCiAJZWZ4X2Zvcl9lYWNoX2NoYW5uZWxfcnhfcXVldWUocnhfcXVldWUsIGNoYW5uZWwpCiAJCWVmeF9mYXN0X3B1c2hfcnhfZGVzY3JpcHRvcnMocnhfcXVldWUpOworCisJbmFwaV9lbmFibGUoJmNoYW5uZWwtPm5hcGlfc3RyKTsKIH0KIAogLyogVGhpcyBkaXNhYmxlcyBldmVudCBxdWV1ZSBwcm9jZXNzaW5nIGFuZCBwYWNrZXQgdHJhbnNtaXNzaW9uLgpAQCAtNTI4LDIxICs1MzgsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgZWZ4X3N0b3BfY2hhbm5lbChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCiB7Ci0Jc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7Ci0KIAlpZiAoIWNoYW5uZWwtPmVuYWJsZWQpCiAJCXJldHVybjsKIAotCUVGWF9MT0coY2hhbm5lbC0+ZWZ4LCAic3RvcCBjaGFuICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKKwluZXRpZl9kYmcoY2hhbm5lbC0+ZWZ4LCBpZmRvd24sIGNoYW5uZWwtPmVmeC0+bmV0X2RldiwKKwkJICAic3RvcCBjaGFuICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKIAogCWNoYW5uZWwtPmVuYWJsZWQgPSBmYWxzZTsKIAluYXBpX2Rpc2FibGUoJmNoYW5uZWwtPm5hcGlfc3RyKTsKLQotCS8qIEVuc3VyZSB0aGF0IGFueSB3b3JrZXIgdGhyZWFkcyBoYXZlIGV4aXRlZCBvciB3aWxsIGJlIG5vLW9wcyAqLwotCWVmeF9mb3JfZWFjaF9jaGFubmVsX3J4X3F1ZXVlKHJ4X3F1ZXVlLCBjaGFubmVsKSB7Ci0JCXNwaW5fbG9ja19iaCgmcnhfcXVldWUtPmFkZF9sb2NrKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnJ4X3F1ZXVlLT5hZGRfbG9jayk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBlZnhfZmluaV9jaGFubmVscyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQpAQCAtNTU2LDEzICs1NTksMjQgQEAKIAlCVUdfT04oZWZ4LT5wb3J0X2VuYWJsZWQpOwogCiAJcmMgPSBlZnhfbmljX2ZsdXNoX3F1ZXVlcyhlZngpOwotCWlmIChyYykKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gZmx1c2ggcXVldWVzXG4iKTsKLQllbHNlCi0JCUVGWF9MT0coZWZ4LCAic3VjY2Vzc2Z1bGx5IGZsdXNoZWQgYWxsIHF1ZXVlc1xuIik7CisJaWYgKHJjICYmIEVGWF9XT1JLQVJPVU5EXzc4MDMoZWZ4KSkgeworCQkvKiBTY2hlZHVsZSBhIHJlc2V0IHRvIHJlY292ZXIgZnJvbSB0aGUgZmx1c2ggZmFpbHVyZS4gVGhlCisJCSAqIGRlc2NyaXB0b3IgY2FjaGVzIHJlZmVyZW5jZSBtZW1vcnkgd2UncmUgYWJvdXQgdG8gZnJlZSwKKwkJICogYnV0IGZhbGNvbl9yZWNvbmZpZ3VyZV9tYWNfd3JhcHBlcigpIHdvbid0IHJlY29ubmVjdAorCQkgKiB0aGUgTUFDcyBiZWNhdXNlIG9mIHRoZSBwZW5kaW5nIHJlc2V0LiAqLworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlJlc2V0dGluZyB0byByZWNvdmVyIGZyb20gZmx1c2ggZmFpbHVyZVxuIik7CisJCWVmeF9zY2hlZHVsZV9yZXNldChlZngsIFJFU0VUX1RZUEVfQUxMKTsKKwl9IGVsc2UgaWYgKHJjKSB7CisJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiZmFpbGVkIHRvIGZsdXNoIHF1ZXVlc1xuIik7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJzdWNjZXNzZnVsbHkgZmx1c2hlZCBhbGwgcXVldWVzXG4iKTsKKwl9CiAKIAllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpIHsKLQkJRUZYX0xPRyhjaGFubmVsLT5lZngsICJzaHV0IGRvd24gY2hhbiAlZFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CisJCW5ldGlmX2RiZyhjaGFubmVsLT5lZngsIGRydiwgY2hhbm5lbC0+ZWZ4LT5uZXRfZGV2LAorCQkJICAic2h1dCBkb3duIGNoYW4gJWRcbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJCWVmeF9mb3JfZWFjaF9jaGFubmVsX3J4X3F1ZXVlKHJ4X3F1ZXVlLCBjaGFubmVsKQogCQkJZWZ4X2ZpbmlfcnhfcXVldWUocnhfcXVldWUpOwpAQCAtNTc3LDcgKzU5MSw4IEBACiAJc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWU7CiAJc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7CiAKLQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImRlc3Ryb3kgY2hhbiAlZFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CisJbmV0aWZfZGJnKGNoYW5uZWwtPmVmeCwgZHJ2LCBjaGFubmVsLT5lZngtPm5ldF9kZXYsCisJCSAgImRlc3Ryb3kgY2hhbiAlZFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CiAKIAllZnhfZm9yX2VhY2hfY2hhbm5lbF9yeF9xdWV1ZShyeF9xdWV1ZSwgY2hhbm5lbCkKIAkJZWZ4X3JlbW92ZV9yeF9xdWV1ZShyeF9xdWV1ZSk7CkBAIC01ODYsOSArNjAxLDkgQEAKIAllZnhfcmVtb3ZlX2V2ZW50cShjaGFubmVsKTsKIH0KIAotdm9pZCBlZnhfc2NoZWR1bGVfc2xvd19maWxsKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLCBpbnQgZGVsYXkpCit2b2lkIGVmeF9zY2hlZHVsZV9zbG93X2ZpbGwoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpCiB7Ci0JcXVldWVfZGVsYXllZF93b3JrKHJlZmlsbF93b3JrcXVldWUsICZyeF9xdWV1ZS0+d29yaywgZGVsYXkpOworCW1vZF90aW1lcigmcnhfcXVldWUtPnNsb3dfZmlsbCwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjI4LDEyICs2NDMsMTMgQEAKIAogCS8qIFN0YXR1cyBtZXNzYWdlIGZvciBrZXJuZWwgbG9nICovCiAJaWYgKGxpbmtfc3RhdGUtPnVwKSB7Ci0JCUVGWF9JTkZPKGVmeCwgImxpbmsgdXAgYXQgJXVNYnBzICVzLWR1cGxleCAoTVRVICVkKSVzXG4iLAotCQkJIGxpbmtfc3RhdGUtPnNwZWVkLCBsaW5rX3N0YXRlLT5mZCA/ICJmdWxsIiA6ICJoYWxmIiwKLQkJCSBlZngtPm5ldF9kZXYtPm10dSwKLQkJCSAoZWZ4LT5wcm9taXNjdW91cyA/ICIgW1BST01JU0NdIiA6ICIiKSk7CisJCW5ldGlmX2luZm8oZWZ4LCBsaW5rLCBlZngtPm5ldF9kZXYsCisJCQkgICAibGluayB1cCBhdCAldU1icHMgJXMtZHVwbGV4IChNVFUgJWQpJXNcbiIsCisJCQkgICBsaW5rX3N0YXRlLT5zcGVlZCwgbGlua19zdGF0ZS0+ZmQgPyAiZnVsbCIgOiAiaGFsZiIsCisJCQkgICBlZngtPm5ldF9kZXYtPm10dSwKKwkJCSAgIChlZngtPnByb21pc2N1b3VzID8gIiBbUFJPTUlTQ10iIDogIiIpKTsKIAl9IGVsc2UgewotCQlFRlhfSU5GTyhlZngsICJsaW5rIGRvd25cbiIpOworCQluZXRpZl9pbmZvKGVmeCwgbGluaywgZWZ4LT5uZXRfZGV2LCAibGluayBkb3duXG4iKTsKIAl9CiAKIH0KQEAgLTczNyw3ICs3NTMsNyBAQAogewogCWludCByYzsKIAotCUVGWF9MT0coZWZ4LCAiY3JlYXRlIHBvcnRcbiIpOworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICJjcmVhdGUgcG9ydFxuIik7CiAKIAlpZiAocGh5X2ZsYXNoX2NmZykKIAkJZWZ4LT5waHlfbW9kZSA9IFBIWV9NT0RFX1NQRUNJQUw7CkBAIC03NTEsMTUgKzc2NywxNiBAQAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGVmeC0+bWFjX2FkZHJlc3MpKSB7CiAJCW1lbWNweShlZngtPm5ldF9kZXYtPmRldl9hZGRyLCBlZngtPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7CiAJfSBlbHNlIHsKLQkJRUZYX0VSUihlZngsICJpbnZhbGlkIE1BQyBhZGRyZXNzICVwTVxuIiwKLQkJCWVmeC0+bWFjX2FkZHJlc3MpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiaW52YWxpZCBNQUMgYWRkcmVzcyAlcE1cbiIsCisJCQkgIGVmeC0+bWFjX2FkZHJlc3MpOwogCQlpZiAoIWFsbG93X2JhZF9od2FkZHIpIHsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyOwogCQl9CiAJCXJhbmRvbV9ldGhlcl9hZGRyKGVmeC0+bmV0X2Rldi0+ZGV2X2FkZHIpOwotCQlFRlhfSU5GTyhlZngsICJ1c2luZyBsb2NhbGx5LWdlbmVyYXRlZCBNQUMgJXBNXG4iLAotCQkJIGVmeC0+bmV0X2Rldi0+ZGV2X2FkZHIpOworCQluZXRpZl9pbmZvKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgICJ1c2luZyBsb2NhbGx5LWdlbmVyYXRlZCBNQUMgJXBNXG4iLAorCQkJICAgZWZ4LT5uZXRfZGV2LT5kZXZfYWRkcik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03NzMsNyArNzkwLDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlFRlhfTE9HKGVmeCwgImluaXQgcG9ydFxuIik7CisJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJpbml0IHBvcnRcbiIpOwogCiAJbXV0ZXhfbG9jaygmZWZ4LT5tYWNfbG9jayk7CiAKQEAgLTgwNCw3ICs4MjEsNyBAQAogCiBzdGF0aWMgdm9pZCBlZnhfc3RhcnRfcG9ydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCUVGWF9MT0coZWZ4LCAic3RhcnQgcG9ydFxuIik7CisJbmV0aWZfZGJnKGVmeCwgaWZ1cCwgZWZ4LT5uZXRfZGV2LCAic3RhcnQgcG9ydFxuIik7CiAJQlVHX09OKGVmeC0+cG9ydF9lbmFibGVkKTsKIAogCW11dGV4X2xvY2soJmVmeC0+bWFjX2xvY2spOwpAQCAtODIxLDcgKzgzOCw3IEBACiAvKiBQcmV2ZW50IGVmeF9tYWNfd29yaygpIGFuZCBlZnhfbW9uaXRvcigpIGZyb20gd29ya2luZyAqLwogc3RhdGljIHZvaWQgZWZ4X3N0b3BfcG9ydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCUVGWF9MT0coZWZ4LCAic3RvcCBwb3J0XG4iKTsKKwluZXRpZl9kYmcoZWZ4LCBpZmRvd24sIGVmeC0+bmV0X2RldiwgInN0b3AgcG9ydFxuIik7CiAKIAltdXRleF9sb2NrKCZlZngtPm1hY19sb2NrKTsKIAllZngtPnBvcnRfZW5hYmxlZCA9IGZhbHNlOwpAQCAtODM2LDcgKzg1Myw3IEBACiAKIHN0YXRpYyB2b2lkIGVmeF9maW5pX3BvcnQoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlFRlhfTE9HKGVmeCwgInNodXQgZG93biBwb3J0XG4iKTsKKwluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInNodXQgZG93biBwb3J0XG4iKTsKIAogCWlmICghZWZ4LT5wb3J0X2luaXRpYWxpemVkKQogCQlyZXR1cm47CkBAIC04NTAsNyArODY3LDcgQEAKIAogc3RhdGljIHZvaWQgZWZ4X3JlbW92ZV9wb3J0KHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0JRUZYX0xPRyhlZngsICJkZXN0cm95aW5nIHBvcnRcbiIpOworCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiZGVzdHJveWluZyBwb3J0XG4iKTsKIAogCWVmeC0+dHlwZS0+cmVtb3ZlX3BvcnQoZWZ4KTsKIH0KQEAgLTg2OCwxMSArODg1LDEyIEBACiAJZG1hX2FkZHJfdCBkbWFfbWFzayA9IGVmeC0+dHlwZS0+bWF4X2RtYV9tYXNrOwogCWludCByYzsKIAotCUVGWF9MT0coZWZ4LCAiaW5pdGlhbGlzaW5nIEkvT1xuIik7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwgImluaXRpYWxpc2luZyBJL09cbiIpOwogCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJICAiZmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKIAkJZ290byBmYWlsMTsKIAl9CiAKQEAgLTg5MCwzOSArOTA4LDQ1IEBACiAJCWRtYV9tYXNrID4+PSAxOwogCX0KIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJjb3VsZCBub3QgZmluZCBhIHN1aXRhYmxlIERNQSBtYXNrXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgImNvdWxkIG5vdCBmaW5kIGEgc3VpdGFibGUgRE1BIG1hc2tcbiIpOwogCQlnb3RvIGZhaWwyOwogCX0KLQlFRlhfTE9HKGVmeCwgInVzaW5nIERNQSBtYXNrICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGRtYV9tYXNrKTsKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkgICJ1c2luZyBETUEgbWFzayAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKSBkbWFfbWFzayk7CiAJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpX2RldiwgZG1hX21hc2spOwogCWlmIChyYykgewogCQkvKiBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soKSBpcyBub3QgKmFsbG93ZWQqIHRvCiAJCSAqIGZhaWwgd2l0aCBhIG1hc2sgdGhhdCBwY2lfc2V0X2RtYV9tYXNrKCkgYWNjZXB0ZWQsCiAJCSAqIGJ1dCBqdXN0IGluIGNhc2UuLi4KIAkJICovCi0JCUVGWF9FUlIoZWZ4LCAiZmFpbGVkIHRvIHNldCBjb25zaXN0ZW50IERNQSBtYXNrXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgImZhaWxlZCB0byBzZXQgY29uc2lzdGVudCBETUEgbWFza1xuIik7CiAJCWdvdG8gZmFpbDI7CiAJfQogCiAJZWZ4LT5tZW1iYXNlX3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZWZ4LT5wY2lfZGV2LCBFRlhfTUVNX0JBUik7CiAJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGNpX2RldiwgRUZYX01FTV9CQVIsICJzZmMiKTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJyZXF1ZXN0IGZvciBtZW1vcnkgQkFSIGZhaWxlZFxuIik7CisJCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCQkgICJyZXF1ZXN0IGZvciBtZW1vcnkgQkFSIGZhaWxlZFxuIik7CiAJCXJjID0gLUVJTzsKIAkJZ290byBmYWlsMzsKIAl9CiAJZWZ4LT5tZW1iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGVmeC0+bWVtYmFzZV9waHlzLAogCQkJCSAgICAgICBlZngtPnR5cGUtPm1lbV9tYXBfc2l6ZSk7CiAJaWYgKCFlZngtPm1lbWJhc2UpIHsKLQkJRUZYX0VSUihlZngsICJjb3VsZCBub3QgbWFwIG1lbW9yeSBCQVIgYXQgJWxseCsleFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZWZ4LT5tZW1iYXNlX3BoeXMsCi0JCQllZngtPnR5cGUtPm1lbV9tYXBfc2l6ZSk7CisJCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCQkgICJjb3VsZCBub3QgbWFwIG1lbW9yeSBCQVIgYXQgJWxseCsleFxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyllZngtPm1lbWJhc2VfcGh5cywKKwkJCSAgZWZ4LT50eXBlLT5tZW1fbWFwX3NpemUpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDQ7CiAJfQotCUVGWF9MT0coZWZ4LCAibWVtb3J5IEJBUiBhdCAlbGx4KyV4ICh2aXJ0dWFsICVwKVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyllZngtPm1lbWJhc2VfcGh5cywKLQkJZWZ4LT50eXBlLT5tZW1fbWFwX3NpemUsIGVmeC0+bWVtYmFzZSk7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAibWVtb3J5IEJBUiBhdCAlbGx4KyV4ICh2aXJ0dWFsICVwKVxuIiwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKWVmeC0+bWVtYmFzZV9waHlzLAorCQkgIGVmeC0+dHlwZS0+bWVtX21hcF9zaXplLCBlZngtPm1lbWJhc2UpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTkzOCw3ICs5NjIsNyBAQAogCiBzdGF0aWMgdm9pZCBlZnhfZmluaV9pbyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCUVGWF9MT0coZWZ4LCAic2h1dHRpbmcgZG93biBJL09cbiIpOworCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAic2h1dHRpbmcgZG93biBJL09cbiIpOwogCiAJaWYgKGVmeC0+bWVtYmFzZSkgewogCQlpb3VubWFwKGVmeC0+bWVtYmFzZSk7CkBAIC0xMDAyLDkgKzEwMjYsMTEgQEAKIAkJCXhlbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAkJcmMgPSBwY2lfZW5hYmxlX21zaXgoZWZ4LT5wY2lfZGV2LCB4ZW50cmllcywgbl9jaGFubmVscyk7CiAJCWlmIChyYyA+IDApIHsKLQkJCUVGWF9FUlIoZWZ4LCAiV0FSTklORzogSW5zdWZmaWNpZW50IE1TSS1YIHZlY3RvcnMiCi0JCQkJIiBhdmFpbGFibGUgKCVkIDwgJWQpLlxuIiwgcmMsIG5fY2hhbm5lbHMpOwotCQkJRUZYX0VSUihlZngsICJXQVJOSU5HOiBQZXJmb3JtYW5jZSBtYXkgYmUgcmVkdWNlZC5cbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJICAiV0FSTklORzogSW5zdWZmaWNpZW50IE1TSS1YIHZlY3RvcnMiCisJCQkJICAiIGF2YWlsYWJsZSAoJWQgPCAlZCkuXG4iLCByYywgbl9jaGFubmVscyk7CisJCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJXQVJOSU5HOiBQZXJmb3JtYW5jZSBtYXkgYmUgcmVkdWNlZC5cbiIpOwogCQkJRUZYX0JVR19PTl9QQVJBTk9JRChyYyA+PSBuX2NoYW5uZWxzKTsKIAkJCW5fY2hhbm5lbHMgPSByYzsKIAkJCXJjID0gcGNpX2VuYWJsZV9tc2l4KGVmeC0+cGNpX2RldiwgeGVudHJpZXMsCkBAIC0xMDI4LDcgKzEwNTQsOCBAQAogCQl9IGVsc2UgewogCQkJLyogRmFsbCBiYWNrIHRvIHNpbmdsZSBjaGFubmVsIE1TSSAqLwogCQkJZWZ4LT5pbnRlcnJ1cHRfbW9kZSA9IEVGWF9JTlRfTU9ERV9NU0k7Ci0JCQlFRlhfRVJSKGVmeCwgImNvdWxkIG5vdCBlbmFibGUgTVNJLVhcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJICAiY291bGQgbm90IGVuYWJsZSBNU0ktWFxuIik7CiAJCX0KIAl9CiAKQEAgLTEwNDEsNyArMTA2OCw4IEBACiAJCWlmIChyYyA9PSAwKSB7CiAJCQllZngtPmNoYW5uZWxbMF0uaXJxID0gZWZ4LT5wY2lfZGV2LT5pcnE7CiAJCX0gZWxzZSB7Ci0JCQlFRlhfRVJSKGVmeCwgImNvdWxkIG5vdCBlbmFibGUgTVNJXG4iKTsKKwkJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgImNvdWxkIG5vdCBlbmFibGUgTVNJXG4iKTsKIAkJCWVmeC0+aW50ZXJydXB0X21vZGUgPSBFRlhfSU5UX01PREVfTEVHQUNZOwogCQl9CiAJfQpAQCAtMTA5Myw5ICsxMTIxLDEwIEBACiAKIHN0YXRpYyBpbnQgZWZ4X3Byb2JlX25pYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogeworCXNpemVfdCBpOwogCWludCByYzsKIAotCUVGWF9MT0coZWZ4LCAiY3JlYXRpbmcgTklDXG4iKTsKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiY3JlYXRpbmcgTklDXG4iKTsKIAogCS8qIENhcnJ5IG91dCBoYXJkd2FyZS10eXBlIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uICovCiAJcmMgPSBlZngtPnR5cGUtPnByb2JlKGVmeCk7CkBAIC0xMTA2LDYgKzExMzUsMTEgQEAKIAkgKiBpbiBNU0ktWCBpbnRlcnJ1cHRzLiAqLwogCWVmeF9wcm9iZV9pbnRlcnJ1cHRzKGVmeCk7CiAKKwlpZiAoZWZ4LT5uX2NoYW5uZWxzID4gMSkKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZWZ4LT5yeF9oYXNoX2tleSwgc2l6ZW9mKGVmeC0+cnhfaGFzaF9rZXkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKTsgaSsrKQorCQllZngtPnJ4X2luZGlyX3RhYmxlW2ldID0gaSAlIGVmeC0+bl9yeF9jaGFubmVsczsKKwogCWVmeF9zZXRfY2hhbm5lbHMoZWZ4KTsKIAllZngtPm5ldF9kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA9IGVmeC0+bl90eF9jaGFubmVsczsKIApAQCAtMTExNyw3ICsxMTUxLDcgQEAKIAogc3RhdGljIHZvaWQgZWZ4X3JlbW92ZV9uaWMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlFRlhfTE9HKGVmeCwgImRlc3Ryb3lpbmcgTklDXG4iKTsKKwluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgImRlc3Ryb3lpbmcgTklDXG4iKTsKIAogCWVmeF9yZW1vdmVfaW50ZXJydXB0cyhlZngpOwogCWVmeC0+dHlwZS0+cmVtb3ZlKGVmeCk7CkBAIC0xMTM3LDE0ICsxMTcxLDE0IEBACiAJLyogQ3JlYXRlIE5JQyAqLwogCXJjID0gZWZ4X3Byb2JlX25pYyhlZngpOwogCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBjcmVhdGUgTklDXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwgImZhaWxlZCB0byBjcmVhdGUgTklDXG4iKTsKIAkJZ290byBmYWlsMTsKIAl9CiAKIAkvKiBDcmVhdGUgcG9ydCAqLwogCXJjID0gZWZ4X3Byb2JlX3BvcnQoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gY3JlYXRlIHBvcnRcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBwb3J0XG4iKTsKIAkJZ290byBmYWlsMjsKIAl9CiAKQEAgLTExNTIsOCArMTE4Niw5IEBACiAJZWZ4X2Zvcl9lYWNoX2NoYW5uZWwoY2hhbm5lbCwgZWZ4KSB7CiAJCXJjID0gZWZ4X3Byb2JlX2NoYW5uZWwoY2hhbm5lbCk7CiAJCWlmIChyYykgewotCQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gY3JlYXRlIGNoYW5uZWwgJWRcbiIsCi0JCQkJY2hhbm5lbC0+Y2hhbm5lbCk7CisJCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgImZhaWxlZCB0byBjcmVhdGUgY2hhbm5lbCAlZFxuIiwKKwkJCQkgIGNoYW5uZWwtPmNoYW5uZWwpOwogCQkJZ290byBmYWlsMzsKIAkJfQogCX0KQEAgLTEyMzMsMTUgKzEyNjgsOCBAQAogICogc2luY2Ugd2UncmUgaG9sZGluZyB0aGUgcnRubF9sb2NrIGF0IHRoaXMgcG9pbnQuICovCiBzdGF0aWMgdm9pZCBlZnhfZmx1c2hfYWxsKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0Jc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7Ci0KIAkvKiBNYWtlIHN1cmUgdGhlIGhhcmR3YXJlIG1vbml0b3IgaXMgc3RvcHBlZCAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZWZ4LT5tb25pdG9yX3dvcmspOwotCi0JLyogRW5zdXJlIHRoYXQgYWxsIFJYIHNsb3cgcmVmaWxscyBhcmUgY29tcGxldGUuICovCi0JZWZ4X2Zvcl9lYWNoX3J4X3F1ZXVlKHJ4X3F1ZXVlLCBlZngpCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnhfcXVldWUtPndvcmspOwotCiAJLyogU3RvcCBzY2hlZHVsZWQgcG9ydCByZWNvbmZpZ3VyYXRpb25zICovCiAJY2FuY2VsX3dvcmtfc3luYygmZWZ4LT5tYWNfd29yayk7CiB9CkBAIC0xMzU2LDggKzEzODQsOSBAQAogCXN0cnVjdCBlZnhfbmljICplZnggPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGVmeF9uaWMsCiAJCQkJCSAgIG1vbml0b3Jfd29yay53b3JrKTsKIAotCUVGWF9UUkFDRShlZngsICJoYXJkd2FyZSBtb25pdG9yIGV4ZWN1dGluZyBvbiBDUFUgJWRcbiIsCi0JCSAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJbmV0aWZfdmRiZyhlZngsIHRpbWVyLCBlZngtPm5ldF9kZXYsCisJCSAgICJoYXJkd2FyZSBtb25pdG9yIGV4ZWN1dGluZyBvbiBDUFUgJWRcbiIsCisJCSAgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwogCUJVR19PTihlZngtPnR5cGUtPm1vbml0b3IgPT0gTlVMTCk7CiAKIAkvKiBJZiB0aGUgbWFjX2xvY2sgaXMgYWxyZWFkeSBoZWxkIHRoZW4gaXQgaXMgbGlrZWx5IGEgcG9ydApAQCAtMTQ2NCw4ICsxNDkzLDggQEAKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJRUZYX0FTU0VSVF9SRVNFVF9TRVJJQUxJU0VEKGVmeCk7CiAKLQlFRlhfTE9HKGVmeCwgIm9wZW5pbmcgZGV2aWNlICVzIG9uIENQVSAlZFxuIiwgbmV0X2Rldi0+bmFtZSwKLQkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJbmV0aWZfZGJnKGVmeCwgaWZ1cCwgZWZ4LT5uZXRfZGV2LCAib3BlbmluZyBkZXZpY2Ugb24gQ1BVICVkXG4iLAorCQkgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJaWYgKGVmeC0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpCiAJCXJldHVybiAtRUlPOwpAQCAtMTQ5MCw4ICsxNTE5LDggQEAKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKLQlFRlhfTE9HKGVmeCwgImNsb3NpbmcgJXMgb24gQ1BVICVkXG4iLCBuZXRfZGV2LT5uYW1lLAotCQlyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwluZXRpZl9kYmcoZWZ4LCBpZmRvd24sIGVmeC0+bmV0X2RldiwgImNsb3Npbmcgb24gQ1BVICVkXG4iLAorCQkgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJaWYgKGVmeC0+c3RhdGUgIT0gU1RBVEVfRElTQUJMRUQpIHsKIAkJLyogU3RvcCB0aGUgZGV2aWNlIGFuZCBmbHVzaCBhbGwgdGhlIGNoYW5uZWxzICovCkBAIC0xNTA0LDExICsxNTMzLDEwIEBACiB9CiAKIC8qIENvbnRleHQ6IHByb2Nlc3MsIGRldl9iYXNlX2xvY2sgb3IgUlROTCBoZWxkLCBub24tYmxvY2tpbmcuICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVmeF9uZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICplZnhfbmV0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgZWZ4X21hY19zdGF0cyAqbWFjX3N0YXRzID0gJmVmeC0+bWFjX3N0YXRzOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZuZXRfZGV2LT5zdGF0czsKIAogCXNwaW5fbG9ja19iaCgmZWZ4LT5zdGF0c19sb2NrKTsKIAllZngtPnR5cGUtPnVwZGF0ZV9zdGF0cyhlZngpOwpAQCAtMTUzMCwxMSArMTU1OCw4IEBACiAJc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgPSBtYWNfc3RhdHMtPnR4X2xhdGVfY29sbGlzaW9uOwogCiAJc3RhdHMtPnJ4X2Vycm9ycyA9IChzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArCi0JCQkgICAgc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKIAkJCSAgICBzdGF0cy0+cnhfY3JjX2Vycm9ycyArCiAJCQkgICAgc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArCi0JCQkgICAgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICsKLQkJCSAgICBzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyArCiAJCQkgICAgbWFjX3N0YXRzLT5yeF9zeW1ib2xfZXJyb3IpOwogCXN0YXRzLT50eF9lcnJvcnMgPSAoc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgKwogCQkJICAgIG1hY19zdGF0cy0+dHhfYmFkKTsKQEAgLTE1NDcsOCArMTU3Miw5IEBACiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCi0JRUZYX0VSUihlZngsICJUWCBzdHVjayB3aXRoIHBvcnRfZW5hYmxlZD0lZDogcmVzZXR0aW5nIGNoYW5uZWxzXG4iLAotCQllZngtPnBvcnRfZW5hYmxlZCk7CisJbmV0aWZfZXJyKGVmeCwgdHhfZXJyLCBlZngtPm5ldF9kZXYsCisJCSAgIlRYIHN0dWNrIHdpdGggcG9ydF9lbmFibGVkPSVkOiByZXNldHRpbmcgY2hhbm5lbHNcbiIsCisJCSAgZWZ4LT5wb3J0X2VuYWJsZWQpOwogCiAJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9UWF9XQVRDSERPRyk7CiB9CkBAIC0xNTY3LDcgKzE1OTMsNyBAQAogCiAJZWZ4X3N0b3BfYWxsKGVmeCk7CiAKLQlFRlhfTE9HKGVmeCwgImNoYW5naW5nIE1UVSB0byAlZFxuIiwgbmV3X210dSk7CisJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJjaGFuZ2luZyBNVFUgdG8gJWRcbiIsIG5ld19tdHUpOwogCiAJZWZ4X2ZpbmlfY2hhbm5lbHMoZWZ4KTsKIApAQCAtMTU5Myw4ICsxNjE5LDkgQEAKIAlFRlhfQVNTRVJUX1JFU0VUX1NFUklBTElTRUQoZWZ4KTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXdfYWRkcikpIHsKLQkJRUZYX0VSUihlZngsICJpbnZhbGlkIGV0aGVybmV0IE1BQyBhZGRyZXNzIHJlcXVlc3RlZDogJXBNXG4iLAotCQkJbmV3X2FkZHIpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgImludmFsaWQgZXRoZXJuZXQgTUFDIGFkZHJlc3MgcmVxdWVzdGVkOiAlcE1cbiIsCisJCQkgIG5ld19hZGRyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNjQ1LDcgKzE2NzIsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlZnhfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gZWZ4X25ldF9vcGVuLAogCS5uZG9fc3RvcAkJPSBlZnhfbmV0X3N0b3AsCi0JLm5kb19nZXRfc3RhdHMJCT0gZWZ4X25ldF9zdGF0cywKKwkubmRvX2dldF9zdGF0czY0CT0gZWZ4X25ldF9zdGF0cywKIAkubmRvX3R4X3RpbWVvdXQJCT0gZWZ4X3dhdGNoZG9nLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBlZnhfaGFyZF9zdGFydF94bWl0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLApAQCAtMTY5Nyw3ICsxNzI0LDYgQEAKIAluZXRfZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKIAluZXRfZGV2LT5pcnEgPSBlZngtPnBjaV9kZXYtPmlycTsKIAluZXRfZGV2LT5uZXRkZXZfb3BzID0gJmVmeF9uZXRkZXZfb3BzOwotCVNFVF9ORVRERVZfREVWKG5ldF9kZXYsICZlZngtPnBjaV9kZXYtPmRldik7CiAJU0VUX0VUSFRPT0xfT1BTKG5ldF9kZXYsICZlZnhfZXRodG9vbF9vcHMpOwogCiAJLyogQ2xlYXIgTUFDIHN0YXRpc3RpY3MgKi8KQEAgLTE3MjIsNyArMTc0OCw4IEBACiAKIAlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZWZ4LT5wY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9waHlfdHlwZSk7CiAJaWYgKHJjKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiZmFpbGVkIHRvIGluaXQgbmV0IGRldiBhdHRyaWJ1dGVzXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJmYWlsZWQgdG8gaW5pdCBuZXQgZGV2IGF0dHJpYnV0ZXNcbiIpOwogCQlnb3RvIGZhaWxfcmVnaXN0ZXJlZDsKIAl9CiAKQEAgLTE3MzAsNyArMTc1Nyw3IEBACiAKIGZhaWxfbG9ja2VkOgogCXJ0bmxfdW5sb2NrKCk7Ci0JRUZYX0VSUihlZngsICJjb3VsZCBub3QgcmVnaXN0ZXIgbmV0IGRldlxuIik7CisJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgbmV0IGRldlxuIik7CiAJcmV0dXJuIHJjOwogCiBmYWlsX3JlZ2lzdGVyZWQ6CkBAIC0xNzk1LDcgKzE4MjIsNyBAQAogCiAJcmMgPSBlZngtPnR5cGUtPmluaXQoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBOSUNcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgImZhaWxlZCB0byBpbml0aWFsaXNlIE5JQ1xuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE4MDcsNyArMTgzNCw4IEBACiAJCWlmIChyYykKIAkJCWdvdG8gZmFpbDsKIAkJaWYgKGVmeC0+cGh5X29wLT5yZWNvbmZpZ3VyZShlZngpKQotCQkJRUZYX0VSUihlZngsICJjb3VsZCBub3QgcmVzdG9yZSBQSFkgc2V0dGluZ3NcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJICAiY291bGQgbm90IHJlc3RvcmUgUEhZIHNldHRpbmdzXG4iKTsKIAl9CiAKIAllZngtPm1hY19vcC0+cmVjb25maWd1cmUoZWZ4KTsKQEAgLTE4NDAsMTMgKzE4NjgsMTQgQEAKIAlpbnQgcmMsIHJjMjsKIAlib29sIGRpc2FibGVkOwogCi0JRUZYX0lORk8oZWZ4LCAicmVzZXR0aW5nICglcylcbiIsIFJFU0VUX1RZUEUobWV0aG9kKSk7CisJbmV0aWZfaW5mbyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAicmVzZXR0aW5nICglcylcbiIsCisJCSAgIFJFU0VUX1RZUEUobWV0aG9kKSk7CiAKIAllZnhfcmVzZXRfZG93bihlZngsIG1ldGhvZCk7CiAKIAlyYyA9IGVmeC0+dHlwZS0+cmVzZXQoZWZ4LCBtZXRob2QpOwogCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byByZXNldCBoYXJkd2FyZVxuIik7CisJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiZmFpbGVkIHRvIHJlc2V0IGhhcmR3YXJlXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xODcxLDEwICsxOTAwLDEwIEBACiAKIAlpZiAoZGlzYWJsZWQpIHsKIAkJZGV2X2Nsb3NlKGVmeC0+bmV0X2Rldik7Ci0JCUVGWF9FUlIoZWZ4LCAiaGFzIGJlZW4gZGlzYWJsZWRcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgImhhcyBiZWVuIGRpc2FibGVkXG4iKTsKIAkJZWZ4LT5zdGF0ZSA9IFNUQVRFX0RJU0FCTEVEOwogCX0gZWxzZSB7Ci0JCUVGWF9MT0coZWZ4LCAicmVzZXQgY29tcGxldGVcbiIpOworCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInJlc2V0IGNvbXBsZXRlXG4iKTsKIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtMTg4NiwxMCArMTkxNSwxNCBAQAogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGVmeF9uaWMsIHJlc2V0X3dvcmspOwogCisJaWYgKGVmeC0+cmVzZXRfcGVuZGluZyA9PSBSRVNFVF9UWVBFX05PTkUpCisJCXJldHVybjsKKwogCS8qIElmIHdlJ3JlIG5vdCBSVU5OSU5HIHRoZW4gZG9uJ3QgcmVzZXQuIExlYXZlIHRoZSByZXNldF9wZW5kaW5nCiAJICogZmxhZyBzZXQgc28gdGhhdCBlZnhfcGNpX3Byb2JlX21haW4gd2lsbCBiZSByZXRyaWVkICovCiAJaWYgKGVmeC0+c3RhdGUgIT0gU1RBVEVfUlVOTklORykgewotCQlFRlhfSU5GTyhlZngsICJzY2hlZHVsZWQgcmVzZXQgcXVlbmNoZWQuIE5JQyBub3QgUlVOTklOR1xuIik7CisJCW5ldGlmX2luZm8oZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgICJzY2hlZHVsZWQgcmVzZXQgcXVlbmNoZWQuIE5JQyBub3QgUlVOTklOR1xuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE5MDMsNyArMTkzNiw4IEBACiAJZW51bSByZXNldF90eXBlIG1ldGhvZDsKIAogCWlmIChlZngtPnJlc2V0X3BlbmRpbmcgIT0gUkVTRVRfVFlQRV9OT05FKSB7Ci0JCUVGWF9JTkZPKGVmeCwgInF1ZW5jaGluZyBhbHJlYWR5IHNjaGVkdWxlZCByZXNldFxuIik7CisJCW5ldGlmX2luZm8oZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgICJxdWVuY2hpbmcgYWxyZWFkeSBzY2hlZHVsZWQgcmVzZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTI3LDEwICsxOTYxLDEyIEBACiAJfQogCiAJaWYgKG1ldGhvZCAhPSB0eXBlKQotCQlFRlhfTE9HKGVmeCwgInNjaGVkdWxpbmcgJXMgcmVzZXQgZm9yICVzXG4iLAotCQkJUkVTRVRfVFlQRShtZXRob2QpLCBSRVNFVF9UWVBFKHR5cGUpKTsKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJzY2hlZHVsaW5nICVzIHJlc2V0IGZvciAlc1xuIiwKKwkJCSAgUkVTRVRfVFlQRShtZXRob2QpLCBSRVNFVF9UWVBFKHR5cGUpKTsKIAllbHNlCi0JCUVGWF9MT0coZWZ4LCAic2NoZWR1bGluZyAlcyByZXNldFxuIiwgUkVTRVRfVFlQRShtZXRob2QpKTsKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJzY2hlZHVsaW5nICVzIHJlc2V0XG4iLAorCQkJICBSRVNFVF9UWVBFKG1ldGhvZCkpOwogCiAJZWZ4LT5yZXNldF9wZW5kaW5nID0gbWV0aG9kOwogCkBAIC0yMDE3LDYgKzIwNTMsNyBAQAogCUlOSVRfV09SSygmZWZ4LT5yZXNldF93b3JrLCBlZnhfcmVzZXRfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmVmeC0+bW9uaXRvcl93b3JrLCBlZnhfbW9uaXRvcik7CiAJZWZ4LT5wY2lfZGV2ID0gcGNpX2RldjsKKwllZngtPm1zZ19lbmFibGUgPSBkZWJ1ZzsKIAllZngtPnN0YXRlID0gU1RBVEVfSU5JVDsKIAllZngtPnJlc2V0X3BlbmRpbmcgPSBSRVNFVF9UWVBFX05PTkU7CiAJc3RybGNweShlZngtPm5hbWUsIHBjaV9uYW1lKHBjaV9kZXYpLCBzaXplb2YoZWZ4LT5uYW1lKSk7CkBAIC0yMDUyLDggKzIwODksOCBAQAogCQlyeF9xdWV1ZS0+cXVldWUgPSBpOwogCQlyeF9xdWV1ZS0+Y2hhbm5lbCA9ICZlZngtPmNoYW5uZWxbMF07IC8qIGZvciBzYWZldHkgKi8KIAkJcnhfcXVldWUtPmJ1ZmZlciA9IE5VTEw7Ci0JCXNwaW5fbG9ja19pbml0KCZyeF9xdWV1ZS0+YWRkX2xvY2spOwotCQlJTklUX0RFTEFZRURfV09SSygmcnhfcXVldWUtPndvcmssIGVmeF9yeF93b3JrKTsKKwkJc2V0dXBfdGltZXIoJnJ4X3F1ZXVlLT5zbG93X2ZpbGwsIGVmeF9yeF9zbG93X2ZpbGwsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpcnhfcXVldWUpOwogCX0KIAogCWVmeC0+dHlwZSA9IHR5cGU7CkBAIC0yMTM2LDcgKzIxNzMsNyBAQAogCWVmeF9wY2lfcmVtb3ZlX21haW4oZWZ4KTsKIAogCWVmeF9maW5pX2lvKGVmeCk7Ci0JRUZYX0xPRyhlZngsICJzaHV0ZG93biBzdWNjZXNzZnVsXG4iKTsKKwluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInNodXRkb3duIHN1Y2Nlc3NmdWxcbiIpOwogCiAJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOwogCWVmeF9maW5pX3N0cnVjdChlZngpOwpAQCAtMjE2MSwxMyArMjE5OCwxNSBAQAogCiAJcmMgPSBlZngtPnR5cGUtPmluaXQoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBOSUNcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJICAiZmFpbGVkIHRvIGluaXRpYWxpc2UgTklDXG4iKTsKIAkJZ290byBmYWlsMzsKIAl9CiAKIAlyYyA9IGVmeF9pbml0X3BvcnQoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBwb3J0XG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgImZhaWxlZCB0byBpbml0aWFsaXNlIHBvcnRcbiIpOwogCQlnb3RvIGZhaWw0OwogCX0KIApAQCAtMjIyMywxMSArMjI2MiwxMyBAQAogCQkJCSAgIE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfVFNPKTsKIAllZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgZWZ4KTsKKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmcGNpX2Rldi0+ZGV2KTsKIAlyYyA9IGVmeF9pbml0X3N0cnVjdChlZngsIHR5cGUsIHBjaV9kZXYsIG5ldF9kZXYpOwogCWlmIChyYykKIAkJZ290byBmYWlsMTsKIAotCUVGWF9JTkZPKGVmeCwgIlNvbGFyZmxhcmUgQ29tbXVuaWNhdGlvbnMgTklDIGRldGVjdGVkXG4iKTsKKwluZXRpZl9pbmZvKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAgIlNvbGFyZmxhcmUgQ29tbXVuaWNhdGlvbnMgTklDIGRldGVjdGVkXG4iKTsKIAogCS8qIFNldCB1cCBiYXNpYyBJL08gKEJBUiBtYXBwaW5ncyBldGMpICovCiAJcmMgPSBlZnhfaW5pdF9pbyhlZngpOwpAQCAtMjI2NSw3ICsyMzA2LDcgQEAKIAl9CiAKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJDb3VsZCBub3QgcmVzZXQgTklDXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwgIkNvdWxkIG5vdCByZXNldCBOSUNcbiIpOwogCQlnb3RvIGZhaWw0OwogCX0KIApAQCAtMjI3Nyw3ICsyMzE4LDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gZmFpbDU7CiAKLQlFRlhfTE9HKGVmeCwgImluaXRpYWxpc2F0aW9uIHN1Y2Nlc3NmdWxcbiIpOworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICJpbml0aWFsaXNhdGlvbiBzdWNjZXNzZnVsXG4iKTsKIAogCXJ0bmxfbG9jaygpOwogCWVmeF9tdGRfcHJvYmUoZWZ4KTsgLyogYWxsb3dlZCB0byBmYWlsICovCkBAIC0yMjkzLDcgKzIzMzQsNyBAQAogCWVmeF9maW5pX3N0cnVjdChlZngpOwogIGZhaWwxOgogCVdBUk5fT04ocmMgPiAwKTsKLQlFRlhfTE9HKGVmeCwgImluaXRpYWxpc2F0aW9uIGZhaWxlZC4gcmM9JWRcbiIsIHJjKTsKKwluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgImluaXRpYWxpc2F0aW9uIGZhaWxlZC4gcmM9JWRcbiIsIHJjKTsKIAlmcmVlX25ldGRldihuZXRfZGV2KTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0yMzMyLDYgKzIzNzMsOSBAQAogCiAJZWZ4LT50eXBlLT5yZXN1bWVfd29sKGVmeCk7CiAKKwkvKiBSZXNjaGVkdWxlIGFueSBxdWVuY2hlZCByZXNldHMgc2NoZWR1bGVkIGR1cmluZyBlZnhfcG1fZnJlZXplKCkgKi8KKwlxdWV1ZV93b3JrKHJlc2V0X3dvcmtxdWV1ZSwgJmVmeC0+cmVzZXRfd29yayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM5NCw3ICsyNDM4LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlZnhfcGNpX2RyaXZlciA9IHsKLQkubmFtZQkJPSBFRlhfRFJJVkVSX05BTUUsCisJLm5hbWUJCT0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlCT0gZWZ4X3BjaV90YWJsZSwKIAkucHJvYmUJCT0gZWZ4X3BjaV9wcm9iZSwKIAkucmVtb3ZlCQk9IGVmeF9wY2lfcmVtb3ZlLApAQCAtMjQyMSwxMSArMjQ2NSw2IEBACiAJaWYgKHJjKQogCQlnb3RvIGVycl9ub3RpZmllcjsKIAotCXJlZmlsbF93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJzZmNfcmVmaWxsIik7Ci0JaWYgKCFyZWZpbGxfd29ya3F1ZXVlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmVmaWxsOwotCX0KIAlyZXNldF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic2ZjX3Jlc2V0Iik7CiAJaWYgKCFyZXNldF93b3JrcXVldWUpIHsKIAkJcmMgPSAtRU5PTUVNOwpAQCAtMjQ0MSw4ICsyNDgwLDYgQEAKICBlcnJfcGNpOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHJlc2V0X3dvcmtxdWV1ZSk7CiAgZXJyX3Jlc2V0OgotCWRlc3Ryb3lfd29ya3F1ZXVlKHJlZmlsbF93b3JrcXVldWUpOwotIGVycl9yZWZpbGw6CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmVmeF9uZXRkZXZfbm90aWZpZXIpOwogIGVycl9ub3RpZmllcjoKIAlyZXR1cm4gcmM7CkBAIC0yNDU0LDcgKzI0OTEsNiBAQAogCiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlZnhfcGNpX2RyaXZlcik7CiAJZGVzdHJveV93b3JrcXVldWUocmVzZXRfd29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShyZWZpbGxfd29ya3F1ZXVlKTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZWZ4X25ldGRldl9ub3RpZmllcik7CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9lZnguaCBiL2RyaXZlcnMvbmV0L3NmYy9lZnguaAppbmRleCBmZmQ3MDhjLi4wNjBkYzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZWZ4LmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2VmeC5oCkBAIC00NywxMiArNDcsMTIgQEAKIGV4dGVybiB2b2lkIGVmeF9maW5pX3J4X3F1ZXVlKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKTsKIGV4dGVybiB2b2lkIGVmeF9yeF9zdHJhdGVneShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpOwogZXh0ZXJuIHZvaWQgZWZ4X2Zhc3RfcHVzaF9yeF9kZXNjcmlwdG9ycyhzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSk7Ci1leHRlcm4gdm9pZCBlZnhfcnhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpOworZXh0ZXJuIHZvaWQgZWZ4X3J4X3Nsb3dfZmlsbCh1bnNpZ25lZCBsb25nIGNvbnRleHQpOwogZXh0ZXJuIHZvaWQgX19lZnhfcnhfcGFja2V0KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKIAkJCSAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmLCBib29sIGNoZWNrc3VtbWVkKTsKIGV4dGVybiB2b2lkIGVmeF9yeF9wYWNrZXQoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsIHVuc2lnbmVkIGludCBpbmRleCwKIAkJCSAgdW5zaWduZWQgaW50IGxlbiwgYm9vbCBjaGVja3N1bW1lZCwgYm9vbCBkaXNjYXJkKTsKLWV4dGVybiB2b2lkIGVmeF9zY2hlZHVsZV9zbG93X2ZpbGwoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsIGludCBkZWxheSk7CitleHRlcm4gdm9pZCBlZnhfc2NoZWR1bGVfc2xvd19maWxsKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKTsKICNkZWZpbmUgRUZYX1JYUV9TSVpFIDEwMjQKICNkZWZpbmUgRUZYX1JYUV9NQVNLIChFRlhfUlhRX1NJWkUgLSAxKQogCkBAIC0xMDYsOCArMTA2LDkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGVmeF9zY2hlZHVsZV9jaGFubmVsKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKLQlFRlhfVFJBQ0UoY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCBzY2hlZHVsaW5nIE5BUEkgcG9sbCBvbiBDUFUlZFxuIiwKLQkJICBjaGFubmVsLT5jaGFubmVsLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwluZXRpZl92ZGJnKGNoYW5uZWwtPmVmeCwgaW50ciwgY2hhbm5lbC0+ZWZ4LT5uZXRfZGV2LAorCQkgICAiY2hhbm5lbCAlZCBzY2hlZHVsaW5nIE5BUEkgcG9sbCBvbiBDUFUlZFxuIiwKKwkJICAgY2hhbm5lbC0+Y2hhbm5lbCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJY2hhbm5lbC0+d29ya19wZW5kaW5nID0gdHJ1ZTsKIAogCW5hcGlfc2NoZWR1bGUoJmNoYW5uZWwtPm5hcGlfc3RyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9zZmMvZXRodG9vbC5jCmluZGV4IDIyMDI2YmYuLmZkMTlkNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2V0aHRvb2wuYwpAQCAtMjE4LDggKzIxOCw4IEBACiAKIAkvKiBHTUFDIGRvZXMgbm90IHN1cHBvcnQgMTAwME1icHMgSEQgKi8KIAlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpIHsKLQkJRUZYX0xPRyhlZngsICJyZWplY3RpbmcgdW5zdXBwb3J0ZWQgMTAwME1icHMgSEQiCi0JCQkiIHNldHRpbmdcbiIpOworCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgInJlamVjdGluZyB1bnN1cHBvcnRlZCAxMDAwTWJwcyBIRCBzZXR0aW5nXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzQsNyArMjM0LDcgQEAKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKLQlzdHJsY3B5KGluZm8tPmRyaXZlciwgRUZYX0RSSVZFUl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybGNweShpbmZvLT52ZXJzaW9uLCBFRlhfRFJJVkVSX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiAJaWYgKGVmeF9uaWNfcmV2KGVmeCkgPj0gRUZYX1JFVl9TSUVOQV9BMCkKIAkJc2llbmFfcHJpbnRfZnd2ZXIoZWZ4LCBpbmZvLT5md192ZXJzaW9uLApAQCAtMjQyLDYgKzI0MiwzMiBAQAogCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGVmeC0+cGNpX2RldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlyZXR1cm4gZWZ4X25pY19nZXRfcmVnc19sZW4obmV0ZGV2X3ByaXYobmV0X2RldikpOworfQorCitzdGF0aWMgdm9pZCBlZnhfZXRodG9vbF9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqYnVmKQoreworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKworCXJlZ3MtPnZlcnNpb24gPSBlZngtPnR5cGUtPnJldmlzaW9uOworCWVmeF9uaWNfZ2V0X3JlZ3MoZWZ4LCBidWYpOworfQorCitzdGF0aWMgdTMyIGVmeF9ldGh0b29sX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisJcmV0dXJuIGVmeC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZWZ4X2V0aHRvb2xfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1MzIgbXNnX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisJZWZ4LT5tc2dfZW5hYmxlID0gbXNnX2VuYWJsZTsKK30KKwogLyoqCiAgKiBlZnhfZmlsbF90ZXN0IC0gZmlsbCBpbiBhbiBpbmRpdmlkdWFsIHNlbGYtdGVzdCBlbnRyeQogICogQHRlc3RfaW5kZXg6CQlJbmRleCBvZiB0aGUgdGVzdApAQCAtNDQzLDEyICs0NjksMTMgQEAKIAlzdHJ1Y3QgZWZ4X21hY19zdGF0cyAqbWFjX3N0YXRzID0gJmVmeC0+bWFjX3N0YXRzOwogCXN0cnVjdCBlZnhfZXRodG9vbF9zdGF0ICpzdGF0OwogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKIAlpbnQgaTsKIAogCUVGWF9CVUdfT05fUEFSQU5PSUQoc3RhdHMtPm5fc3RhdHMgIT0gRUZYX0VUSFRPT0xfTlVNX1NUQVRTKTsKIAogCS8qIFVwZGF0ZSBNQUMgYW5kIE5JQyBzdGF0aXN0aWNzICovCi0JZGV2X2dldF9zdGF0cyhuZXRfZGV2KTsKKwlkZXZfZ2V0X3N0YXRzKG5ldF9kZXYsICZ0ZW1wKTsKIAogCS8qIEZpbGwgZGV0YWlsZWQgc3RhdGlzdGljcyBidWZmZXIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgRUZYX0VUSFRPT0xfTlVNX1NUQVRTOyBpKyspIHsKQEAgLTUyMCw2ICs1NDcsMTQgQEAKIAlyZXR1cm4gZWZ4LT5yeF9jaGVja3N1bV9lbmFibGVkOwogfQogCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXUzMiBzdXBwb3J0ZWQgPSBlZngtPnR5cGUtPm9mZmxvYWRfZmVhdHVyZXMgJiBFVEhfRkxBR19SWEhBU0g7CisKKwlyZXR1cm4gZXRodG9vbF9vcF9zZXRfZmxhZ3MobmV0X2RldiwgZGF0YSwgc3VwcG9ydGVkKTsKK30KKwogc3RhdGljIHZvaWQgZWZ4X2V0aHRvb2xfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAogCQkJCSAgc3RydWN0IGV0aHRvb2xfdGVzdCAqdGVzdCwgdTY0ICpkYXRhKQogewpAQCAtNTM5LDcgKzU3NCw4IEBACiAJaWYgKCFhbHJlYWR5X3VwKSB7CiAJCXJjID0gZGV2X29wZW4oZWZ4LT5uZXRfZGV2KTsKIAkJaWYgKHJjKSB7Ci0JCQlFRlhfRVJSKGVmeCwgImZhaWxlZCBvcGVuaW5nIGRldmljZS5cbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJICAiZmFpbGVkIG9wZW5pbmcgZGV2aWNlLlxuIik7CiAJCQlnb3RvIGZhaWwyOwogCQl9CiAJfQpAQCAtNTUxLDkgKzU4Nyw5IEBACiAJaWYgKCFhbHJlYWR5X3VwKQogCQlkZXZfY2xvc2UoZWZ4LT5uZXRfZGV2KTsKIAotCUVGWF9MT0coZWZ4LCAiJXMgJXNsaW5lIHNlbGYtdGVzdHNcbiIsCi0JCXJjID09IDAgPyAicGFzc2VkIiA6ICJmYWlsZWQiLAotCQkodGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSA/ICJvZmYiIDogIm9uIik7CisJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICIlcyAlc2xpbmUgc2VsZi10ZXN0c1xuIiwKKwkJICByYyA9PSAwID8gInBhc3NlZCIgOiAiZmFpbGVkIiwKKwkJICAodGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSA/ICJvZmYiIDogIm9uIik7CiAKICBmYWlsMjoKICBmYWlsMToKQEAgLTY3OSw4ICs3MTUsOCBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzIHx8IGNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2VjcykgewotCQlFRlhfRVJSKGVmeCwgImludmFsaWQgY29hbGVzY2luZyBzZXR0aW5nLiAiCi0JCQkiT25seSByeC90eF9jb2FsZXNjZV91c2Vjc19pcnEgYXJlIHN1cHBvcnRlZFxuIik7CisJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiaW52YWxpZCBjb2FsZXNjaW5nIHNldHRpbmcuICIKKwkJCSAgIk9ubHkgcngvdHhfY29hbGVzY2VfdXNlY3NfaXJxIGFyZSBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC02OTIsOCArNzI4LDggQEAKIAllZnhfZm9yX2VhY2hfdHhfcXVldWUodHhfcXVldWUsIGVmeCkgewogCQlpZiAoKHR4X3F1ZXVlLT5jaGFubmVsLT5jaGFubmVsIDwgZWZ4LT5uX3J4X2NoYW5uZWxzKSAmJgogCQkgICAgdHhfdXNlY3MpIHsKLQkJCUVGWF9FUlIoZWZ4LCAiQ2hhbm5lbCBpcyBzaGFyZWQuICIKLQkJCQkiT25seSBSWCBjb2FsZXNjaW5nIG1heSBiZSBzZXRcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJDaGFubmVsIGlzIHNoYXJlZC4gIgorCQkJCSAgIk9ubHkgUlggY29hbGVzY2luZyBtYXkgYmUgc2V0XG4iKTsKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJfQogCX0KQEAgLTcyMSwxMyArNzU3LDE1IEBACiAJCSAgICAgKHBhdXNlLT5hdXRvbmVnID8gRUZYX0ZDX0FVVE8gOiAwKSk7CiAKIAlpZiAoKHdhbnRlZF9mYyAmIEVGWF9GQ19UWCkgJiYgISh3YW50ZWRfZmMgJiBFRlhfRkNfUlgpKSB7Ci0JCUVGWF9MT0coZWZ4LCAiRmxvdyBjb250cm9sIHVuc3VwcG9ydGVkOiB0eCBPTiByeCBPRkZcbiIpOworCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIkZsb3cgY29udHJvbCB1bnN1cHBvcnRlZDogdHggT04gcnggT0ZGXG4iKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoKHdhbnRlZF9mYyAmIEVGWF9GQ19BVVRPKSAmJiAhZWZ4LT5saW5rX2FkdmVydGlzaW5nKSB7Ci0JCUVGWF9MT0coZWZ4LCAiQXV0b25lZ290aWF0aW9uIGlzIGRpc2FibGVkXG4iKTsKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJBdXRvbmVnb3RpYXRpb24gaXMgZGlzYWJsZWRcbiIpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTc1OCw4ICs3OTYsOSBAQAogCSAgICAoZWZ4LT53YW50ZWRfZmMgXiBvbGRfZmMpICYgRUZYX0ZDX0FVVE8pIHsKIAkJcmMgPSBlZngtPnBoeV9vcC0+cmVjb25maWd1cmUoZWZ4KTsKIAkJaWYgKHJjKSB7Ci0JCQlFRlhfRVJSKGVmeCwgIlVuYWJsZSB0byBhZHZlcnRpc2UgcmVxdWVzdGVkIGZsb3cgIgotCQkJCSJjb250cm9sIHNldHRpbmdcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJICAiVW5hYmxlIHRvIGFkdmVydGlzZSByZXF1ZXN0ZWQgZmxvdyAiCisJCQkJICAiY29udHJvbCBzZXR0aW5nXG4iKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtODMwLDEwICs4NjksMTAxIEBACiAJcmV0dXJuIGVmeF9yZXNldChlZngsIG1ldGhvZCk7CiB9CiAKK3N0YXRpYyBpbnQKK2VmeF9ldGh0b29sX2dldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJICAgICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmluZm8sIHZvaWQgKnJ1bGVzIF9fYWx3YXlzX3VudXNlZCkKK3sKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisKKwlzd2l0Y2ggKGluZm8tPmNtZCkgeworCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKKwkJaW5mby0+ZGF0YSA9IGVmeC0+bl9yeF9jaGFubmVsczsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEVUSFRPT0xfR1JYRkg6IHsKKwkJdW5zaWduZWQgbWluX3JldmlzaW9uID0gMDsKKworCQlpbmZvLT5kYXRhID0gMDsKKwkJc3dpdGNoIChpbmZvLT5mbG93X3R5cGUpIHsKKwkJY2FzZSBUQ1BfVjRfRkxPVzoKKwkJCWluZm8tPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgVURQX1Y0X0ZMT1c6CisJCWNhc2UgU0NUUF9WNF9GTE9XOgorCQljYXNlIEFIX0VTUF9WNF9GTE9XOgorCQljYXNlIElQVjRfRkxPVzoKKwkJCWluZm8tPmRhdGEgfD0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1Q7CisJCQltaW5fcmV2aXNpb24gPSBFRlhfUkVWX0ZBTENPTl9CMDsKKwkJCWJyZWFrOworCQljYXNlIFRDUF9WNl9GTE9XOgorCQkJaW5mby0+ZGF0YSB8PSBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBVRFBfVjZfRkxPVzoKKwkJY2FzZSBTQ1RQX1Y2X0ZMT1c6CisJCWNhc2UgQUhfRVNQX1Y2X0ZMT1c6CisJCWNhc2UgSVBWNl9GTE9XOgorCQkJaW5mby0+ZGF0YSB8PSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCW1pbl9yZXZpc2lvbiA9IEVGWF9SRVZfU0lFTkFfQTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWlmIChlZnhfbmljX3JldihlZngpIDwgbWluX3JldmlzaW9uKQorCQkJaW5mby0+ZGF0YSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAqaW5kaXIpCit7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXNpemVfdCBjb3B5X3NpemUgPQorCQltaW5fdChzaXplX3QsIGluZGlyLT5zaXplLCBBUlJBWV9TSVpFKGVmeC0+cnhfaW5kaXJfdGFibGUpKTsKKworCWlmIChlZnhfbmljX3JldihlZngpIDwgRUZYX1JFVl9GQUxDT05fQjApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWluZGlyLT5zaXplID0gQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKTsKKwltZW1jcHkoaW5kaXItPnJpbmdfaW5kZXgsIGVmeC0+cnhfaW5kaXJfdGFibGUsCisJICAgICAgIGNvcHlfc2l6ZSAqIHNpemVvZihpbmRpci0+cmluZ19pbmRleFswXSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX3NldF9yeGZoX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyKQoreworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKwlzaXplX3QgaTsKKworCWlmIChlZnhfbmljX3JldihlZngpIDwgRUZYX1JFVl9GQUxDT05fQjApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIFZhbGlkYXRlIHNpemUgYW5kIGluZGljZXMgKi8KKwlpZiAoaW5kaXItPnNpemUgIT0gQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWZ4LT5yeF9pbmRpcl90YWJsZSk7IGkrKykKKwkJaWYgKGluZGlyLT5yaW5nX2luZGV4W2ldID49IGVmeC0+bl9yeF9jaGFubmVscykKKwkJCXJldHVybiAtRUlOVkFMOworCisJbWVtY3B5KGVmeC0+cnhfaW5kaXJfdGFibGUsIGluZGlyLT5yaW5nX2luZGV4LAorCSAgICAgICBzaXplb2YoZWZ4LT5yeF9pbmRpcl90YWJsZSkpOworCWVmeF9uaWNfcHVzaF9yeF9pbmRpcl90YWJsZShlZngpOworCXJldHVybiAwOworfQorCiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZWZ4X2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gZWZ4X2V0aHRvb2xfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MJCT0gZWZ4X2V0aHRvb2xfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBlZnhfZXRodG9vbF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCQk9IGVmeF9ldGh0b29sX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MJCT0gZWZ4X2V0aHRvb2xfZ2V0X3JlZ3MsCisJLmdldF9tc2dsZXZlbAkJPSBlZnhfZXRodG9vbF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBlZnhfZXRodG9vbF9zZXRfbXNnbGV2ZWwsCiAJLm53YXlfcmVzZXQJCT0gZWZ4X2V0aHRvb2xfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsJCT0gZWZ4X2V0aHRvb2xfZ2V0X2xpbmssCiAJLmdldF9lZXByb21fbGVuCQk9IGVmeF9ldGh0b29sX2dldF9lZXByb21fbGVuLApAQCAtODU0LDcgKzk4NCw3IEBACiAJLyogTmVlZCB0byBlbmFibGUvZGlzYWJsZSBUU08tSVB2NiB0b28gKi8KIAkuc2V0X3RzbwkJPSBlZnhfZXRodG9vbF9zZXRfdHNvLAogCS5nZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncwkJPSBldGh0b29sX29wX3NldF9mbGFncywKKwkuc2V0X2ZsYWdzCQk9IGVmeF9ldGh0b29sX3NldF9mbGFncywKIAkuZ2V0X3NzZXRfY291bnQJCT0gZWZ4X2V0aHRvb2xfZ2V0X3NzZXRfY291bnQsCiAJLnNlbGZfdGVzdAkJPSBlZnhfZXRodG9vbF9zZWxmX3Rlc3QsCiAJLmdldF9zdHJpbmdzCQk9IGVmeF9ldGh0b29sX2dldF9zdHJpbmdzLApAQCAtODYzLDQgKzk5Myw3IEBACiAJLmdldF93b2wgICAgICAgICAgICAgICAgPSBlZnhfZXRodG9vbF9nZXRfd29sLAogCS5zZXRfd29sICAgICAgICAgICAgICAgID0gZWZ4X2V0aHRvb2xfc2V0X3dvbCwKIAkucmVzZXQJCQk9IGVmeF9ldGh0b29sX3Jlc2V0LAorCS5nZXRfcnhuZmMJCT0gZWZ4X2V0aHRvb2xfZ2V0X3J4bmZjLAorCS5nZXRfcnhmaF9pbmRpcgkJPSBlZnhfZXRodG9vbF9nZXRfcnhmaF9pbmRpciwKKwkuc2V0X3J4ZmhfaW5kaXIJCT0gZWZ4X2V0aHRvb2xfc2V0X3J4ZmhfaW5kaXIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jIGIvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCmluZGV4IDY1NWI2OTcuLjRmOWQzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYworKysgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKQEAgLTE2NywxMyArMTY3LDE1IEBACiAJICogZXhpdCB3aXRob3V0IGhhdmluZyB0b3VjaGVkIHRoZSBoYXJkd2FyZS4KIAkgKi8KIAlpZiAodW5saWtlbHkoRUZYX09XT1JEX0lTX1pFUk8oKmludF9rZXIpKSkgewotCQlFRlhfVFJBQ0UoZWZ4LCAiSVJRICVkIG9uIENQVSAlZCBub3QgZm9yIG1lXG4iLCBpcnEsCi0JCQkgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCQluZXRpZl92ZGJnKGVmeCwgaW50ciwgZWZ4LT5uZXRfZGV2LAorCQkJICAgIklSUSAlZCBvbiBDUFUgJWQgbm90IGZvciBtZVxuIiwgaXJxLAorCQkJICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAJZWZ4LT5sYXN0X2lycV9jcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCUVGWF9UUkFDRShlZngsICJJUlEgJWQgb24gQ1BVICVkIHN0YXR1cyAiIEVGWF9PV09SRF9GTVQgIlxuIiwKLQkJICBpcnEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIEVGWF9PV09SRF9WQUwoKmludF9rZXIpKTsKKwluZXRpZl92ZGJnKGVmeCwgaW50ciwgZWZ4LT5uZXRfZGV2LAorCQkgICAiSVJRICVkIG9uIENQVSAlZCBzdGF0dXMgIiBFRlhfT1dPUkRfRk1UICJcbiIsCisJCSAgIGlycSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwgRUZYX09XT1JEX1ZBTCgqaW50X2tlcikpOwogCiAJLyogRGV0ZXJtaW5lIGludGVycnVwdGluZyBxdWV1ZXMsIGNsZWFyIGludGVycnVwdCBzdGF0dXMKIAkgKiByZWdpc3RlciBhbmQgYWNrbm93bGVkZ2UgdGhlIGRldmljZSBpbnRlcnJ1cHQuCkBAIC0yMzksNyArMjQxLDggQEAKIAkJaWYgKCFmYWxjb25fc3BpX3BvbGwoZWZ4KSkKIAkJCXJldHVybiAwOwogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQkJRUZYX0VSUihlZngsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgU1BJXG4iKTsKKwkJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkJICAidGltZWQgb3V0IHdhaXRpbmcgZm9yIFNQSVxuIik7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTMzMyw5ICszMzYsMTAgQEAKIAkJaWYgKCEoc3RhdHVzICYgU1BJX1NUQVRVU19OUkRZKSkKIAkJCXJldHVybiAwOwogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQkJRUZYX0VSUihlZngsICJTUEkgd3JpdGUgdGltZW91dCBvbiBkZXZpY2UgJWQiCi0JCQkJIiBsYXN0IHN0YXR1cz0weCUwMnhcbiIsCi0JCQkJc3BpLT5kZXZpY2VfaWQsIHN0YXR1cyk7CisJCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIlNQSSB3cml0ZSB0aW1lb3V0IG9uIGRldmljZSAlZCIKKwkJCQkgICIgbGFzdCBzdGF0dXM9MHglMDJ4XG4iLAorCQkJCSAgc3BpLT5kZXZpY2VfaWQsIHN0YXR1cyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTQ2OSw3ICs0NzMsOCBAQAogCQkJCXVkZWxheSgxMCk7CiAJCQl9CiAKLQkJCUVGWF9FUlIoZWZ4LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIFhNQUMgY29yZSByZXNldFxuIik7CisJCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgInRpbWVkIG91dCB3YWl0aW5nIGZvciBYTUFDIGNvcmUgcmVzZXRcbiIpOwogCQl9CiAJfQogCkBAIC00OTIsMTIgKzQ5NywxMyBAQAogCQlpZiAoIUVGWF9PV09SRF9GSUVMRChyZWcsIEZSRl9BQl9SU1RfWEdUWCkgJiYKIAkJICAgICFFRlhfT1dPUkRfRklFTEQocmVnLCBGUkZfQUJfUlNUX1hHUlgpICYmCiAJCSAgICAhRUZYX09XT1JEX0ZJRUxEKHJlZywgRlJGX0FCX1JTVF9FTSkpIHsKLQkJCUVGWF9MT0coZWZ4LCAiQ29tcGxldGVkIE1BQyByZXNldCBhZnRlciAlZCBsb29wc1xuIiwKLQkJCQljb3VudCk7CisJCQluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIkNvbXBsZXRlZCBNQUMgcmVzZXQgYWZ0ZXIgJWQgbG9vcHNcbiIsCisJCQkJICBjb3VudCk7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoY291bnQgPiAyMCkgewotCQkJRUZYX0VSUihlZngsICJNQUMgcmVzZXQgZmFpbGVkXG4iKTsKKwkJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICJNQUMgcmVzZXQgZmFpbGVkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWNvdW50Kys7CkBAIC01NDgsNyArNTU0LDkgQEAKIHsKIAlzdHJ1Y3QgZWZ4X2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUgPSAmZWZ4LT5saW5rX3N0YXRlOwogCWVmeF9vd29yZF90IHJlZzsKLQlpbnQgbGlua19zcGVlZDsKKwlpbnQgbGlua19zcGVlZCwgaXNvbGF0ZTsKKworCWlzb2xhdGUgPSAoZWZ4LT5yZXNldF9wZW5kaW5nICE9IFJFU0VUX1RZUEVfTk9ORSk7CiAKIAlzd2l0Y2ggKGxpbmtfc3RhdGUtPnNwZWVkKSB7CiAJY2FzZSAxMDAwMDogbGlua19zcGVlZCA9IDM7IGJyZWFrOwpAQCAtNTcwLDcgKzU3OCw3IEBACiAJICogZGlzY2FyZGVkLiAqLwogCWlmIChlZnhfbmljX3JldihlZngpID49IEVGWF9SRVZfRkFMQ09OX0IwKSB7CiAJCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBGUkZfQkJfVFhGSUZPX0RSQUlOX0VOLAotCQkJCSAgICAhbGlua19zdGF0ZS0+dXApOworCQkJCSAgICAhbGlua19zdGF0ZS0+dXAgfHwgaXNvbGF0ZSk7CiAJfQogCiAJZWZ4X3dyaXRlbyhlZngsICZyZWcsIEZSX0FCX01BQ19DVFJMKTsKQEAgLTU4NCw3ICs1OTIsNyBAQAogCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBGUkZfQVpfUlhfWE9GRl9NQUNfRU4sIDEpOwogCS8qIFVuaXNvbGF0ZSB0aGUgTUFDIC0+IFJYICovCiAJaWYgKGVmeF9uaWNfcmV2KGVmeCkgPj0gRUZYX1JFVl9GQUxDT05fQjApCi0JCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBGUkZfQlpfUlhfSU5HUl9FTiwgMSk7CisJCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBGUkZfQlpfUlhfSU5HUl9FTiwgIWlzb2xhdGUpOwogCWVmeF93cml0ZW8oZWZ4LCAmcmVnLCBGUl9BWl9SWF9DRkcpOwogfQogCkBAIC02MjUsNyArNjMzLDggQEAKIAkJcm1iKCk7IC8qIHJlYWQgdGhlIGRvbmUgZmxhZyBiZWZvcmUgdGhlIHN0YXRzICovCiAJCWVmeC0+bWFjX29wLT51cGRhdGVfc3RhdHMoZWZ4KTsKIAl9IGVsc2UgewotCQlFRlhfRVJSKGVmeCwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBzdGF0aXN0aWNzXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgInRpbWVkIG91dCB3YWl0aW5nIGZvciBzdGF0aXN0aWNzXG4iKTsKIAl9CiB9CiAKQEAgLTcxNSwxNiArNzI0LDE3IEBACiAJCWlmIChFRlhfT1dPUkRfRklFTEQobWRfc3RhdCwgRlJGX0FCX01EX0JTWSkgPT0gMCkgewogCQkJaWYgKEVGWF9PV09SRF9GSUVMRChtZF9zdGF0LCBGUkZfQUJfTURfTE5GTCkgIT0gMCB8fAogCQkJICAgIEVGWF9PV09SRF9GSUVMRChtZF9zdGF0LCBGUkZfQUJfTURfQlNFUlIpICE9IDApIHsKLQkJCQlFRlhfRVJSKGVmeCwgImVycm9yIGZyb20gR01JSSBhY2Nlc3MgIgotCQkJCQlFRlhfT1dPUkRfRk1UIlxuIiwKLQkJCQkJRUZYX09XT1JEX1ZBTChtZF9zdGF0KSk7CisJCQkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCQkJICAiZXJyb3IgZnJvbSBHTUlJIGFjY2VzcyAiCisJCQkJCSAgRUZYX09XT1JEX0ZNVCJcbiIsCisJCQkJCSAgRUZYX09XT1JEX1ZBTChtZF9zdGF0KSk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQogCQl1ZGVsYXkoMTApOwogCX0KLQlFRlhfRVJSKGVmeCwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBHTUlJXG4iKTsKKwluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIEdNSUlcbiIpOwogCXJldHVybiAtRVRJTUVET1VUOwogfQogCkBAIC03MzYsNyArNzQ2LDggQEAKIAllZnhfb3dvcmRfdCByZWc7CiAJaW50IHJjOwogCi0JRUZYX1JFR0RVTVAoZWZ4LCAid3JpdGluZyBNRElPICVkIHJlZ2lzdGVyICVkLiVkIHdpdGggMHglMDR4XG4iLAorCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICAid3JpdGluZyBNRElPICVkIHJlZ2lzdGVyICVkLiVkIHdpdGggMHglMDR4XG4iLAogCQkgICAgcHJ0YWQsIGRldmFkLCBhZGRyLCB2YWx1ZSk7CiAKIAltdXRleF9sb2NrKCZlZngtPm1kaW9fbG9jayk7CkBAIC04MTAsOCArODIxLDkgQEAKIAlpZiAocmMgPT0gMCkgewogCQllZnhfcmVhZG8oZWZ4LCAmcmVnLCBGUl9BQl9NRF9SWEQpOwogCQlyYyA9IEVGWF9PV09SRF9GSUVMRChyZWcsIEZSRl9BQl9NRF9SWEQpOwotCQlFRlhfUkVHRFVNUChlZngsICJyZWFkIGZyb20gTURJTyAlZCByZWdpc3RlciAlZC4lZCwgZ290ICUwNHhcbiIsCi0JCQkgICAgcHJ0YWQsIGRldmFkLCBhZGRyLCByYyk7CisJCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAgInJlYWQgZnJvbSBNRElPICVkIHJlZ2lzdGVyICVkLiVkLCBnb3QgJTA0eFxuIiwKKwkJCSAgIHBydGFkLCBkZXZhZCwgYWRkciwgcmMpOwogCX0gZWxzZSB7CiAJCS8qIEFib3J0IHRoZSByZWFkIG9wZXJhdGlvbiAqLwogCQlFRlhfUE9QVUxBVEVfT1dPUkRfMihyZWcsCkBAIC04MTksOCArODMxLDkgQEAKIAkJCQkgICAgIEZSRl9BQl9NRF9HQywgMSk7CiAJCWVmeF93cml0ZW8oZWZ4LCAmcmVnLCBGUl9BQl9NRF9DUyk7CiAKLQkJRUZYX0xPRyhlZngsICJyZWFkIGZyb20gTURJTyAlZCByZWdpc3RlciAlZC4lZCwgZ290IGVycm9yICVkXG4iLAotCQkJcHJ0YWQsIGRldmFkLCBhZGRyLCByYyk7CisJCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJyZWFkIGZyb20gTURJTyAlZCByZWdpc3RlciAlZC4lZCwgZ290IGVycm9yICVkXG4iLAorCQkJICBwcnRhZCwgZGV2YWQsIGFkZHIsIHJjKTsKIAl9CiAKIG91dDoKQEAgLTg3MSw3ICs4ODQsOCBAQAogCiAJZmFsY29uX2Nsb2NrX21hYyhlZngpOwogCi0JRUZYX0xPRyhlZngsICJzZWxlY3RlZCAlY01BQ1xuIiwgRUZYX0lTMTBHKGVmeCkgPyAnWCcgOiAnRycpOworCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJzZWxlY3RlZCAlY01BQ1xuIiwKKwkJICBFRlhfSVMxMEcoZWZ4KSA/ICdYJyA6ICdHJyk7CiAJLyogTm90IGFsbCBtYWNzIHN1cHBvcnQgYSBtYWMtbGV2ZWwgbGluayBzdGF0ZSAqLwogCWVmeC0+eG1hY19wb2xsX3JlcXVpcmVkID0gZmFsc2U7CiAJZmFsY29uX3Jlc2V0X21hY3MoZWZ4KTsKQEAgLTg5NSw4ICs5MDksOCBAQAogCQllZngtPnBoeV9vcCA9ICZmYWxjb25fcXQyMDJ4X3BoeV9vcHM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUVGWF9FUlIoZWZ4LCAiVW5rbm93biBQSFkgdHlwZSAlZFxuIiwKLQkJCWVmeC0+cGh5X3R5cGUpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiVW5rbm93biBQSFkgdHlwZSAlZFxuIiwKKwkJCSAgZWZ4LT5waHlfdHlwZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtOTI0LDEwICs5MzgsMTEgQEAKIAkJCQkgIEZBTENPTl9NQUNfU1RBVFNfU0laRSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JRUZYX0xPRyhlZngsICJzdGF0cyBidWZmZXIgYXQgJWxseCAodmlydCAlcCBwaHlzICVsbHgpXG4iLAotCQkodTY0KWVmeC0+c3RhdHNfYnVmZmVyLmRtYV9hZGRyLAotCQllZngtPnN0YXRzX2J1ZmZlci5hZGRyLAotCQkodTY0KXZpcnRfdG9fcGh5cyhlZngtPnN0YXRzX2J1ZmZlci5hZGRyKSk7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAic3RhdHMgYnVmZmVyIGF0ICVsbHggKHZpcnQgJXAgcGh5cyAlbGx4KVxuIiwKKwkJICAodTY0KWVmeC0+c3RhdHNfYnVmZmVyLmRtYV9hZGRyLAorCQkgIGVmeC0+c3RhdHNfYnVmZmVyLmFkZHIsCisJCSAgKHU2NCl2aXJ0X3RvX3BoeXMoZWZ4LT5zdGF0c19idWZmZXIuYWRkcikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NjcsOCArOTgyLDggQEAKIAlyYyA9IGZhbGNvbl9zcGlfcmVhZChlZngsIHNwaSwgMCwgRkFMQ09OX05WQ09ORklHX0VORCwgTlVMTCwgcmVnaW9uKTsKIAltdXRleF91bmxvY2soJmVmeC0+c3BpX2xvY2spOwogCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgIkZhaWxlZCB0byByZWFkICVzXG4iLAotCQkJZWZ4LT5zcGlfZmxhc2ggPyAiZmxhc2giIDogIkVFUFJPTSIpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiRmFpbGVkIHRvIHJlYWQgJXNcbiIsCisJCQkgIGVmeC0+c3BpX2ZsYXNoID8gImZsYXNoIiA6ICJFRVBST00iKTsKIAkJcmMgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CkBAIC05NzgsMTEgKzk5MywxMyBAQAogCiAJcmMgPSAtRUlOVkFMOwogCWlmIChtYWdpY19udW0gIT0gRkFMQ09OX05WQ09ORklHX0JPQVJEX01BR0lDX05VTSkgewotCQlFRlhfRVJSKGVmeCwgIk5WUkFNIGJhZCBtYWdpYyAweCV4XG4iLCBtYWdpY19udW0pOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAiTlZSQU0gYmFkIG1hZ2ljIDB4JXhcbiIsIG1hZ2ljX251bSk7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAoc3RydWN0X3ZlciA8IDIpIHsKLQkJRUZYX0VSUihlZngsICJOVlJBTSBoYXMgYW5jaWVudCB2ZXJzaW9uIDB4JXhcbiIsIHN0cnVjdF92ZXIpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAiTlZSQU0gaGFzIGFuY2llbnQgdmVyc2lvbiAweCV4XG4iLCBzdHJ1Y3RfdmVyKTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChzdHJ1Y3RfdmVyIDwgNCkgewogCQl3b3JkID0gJm52Y29uZmlnLT5ib2FyZF9tYWdpY19udW07CkBAIC05OTUsNyArMTAxMiw4IEBACiAJCWNzdW0gKz0gbGUxNl90b19jcHUoKndvcmQpOwogCiAJaWYgKH5jc3VtICYgMHhmZmZmKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiTlZSQU0gaGFzIGluY29ycmVjdCBjaGVja3N1bVxuIik7CisJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJOVlJBTSBoYXMgaW5jb3JyZWN0IGNoZWNrc3VtXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMDczLDIyICsxMDkxLDI1IEBACiAJZWZ4X293b3JkX3QgZ2xiX2N0bF9yZWdfa2VyOwogCWludCByYzsKIAotCUVGWF9MT0coZWZ4LCAicGVyZm9ybWluZyAlcyBoYXJkd2FyZSByZXNldFxuIiwgUkVTRVRfVFlQRShtZXRob2QpKTsKKwluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAicGVyZm9ybWluZyAlcyBoYXJkd2FyZSByZXNldFxuIiwKKwkJICBSRVNFVF9UWVBFKG1ldGhvZCkpOwogCiAJLyogSW5pdGlhdGUgZGV2aWNlIHJlc2V0ICovCiAJaWYgKG1ldGhvZCA9PSBSRVNFVF9UWVBFX1dPUkxEKSB7CiAJCXJjID0gcGNpX3NhdmVfc3RhdGUoZWZ4LT5wY2lfZGV2KTsKIAkJaWYgKHJjKSB7Ci0JCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBiYWNrdXAgUENJIHN0YXRlIG9mIHByaW1hcnkgIgotCQkJCSJmdW5jdGlvbiBwcmlvciB0byBoYXJkd2FyZSByZXNldFxuIik7CisJCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJmYWlsZWQgdG8gYmFja3VwIFBDSSBzdGF0ZSBvZiBwcmltYXJ5ICIKKwkJCQkgICJmdW5jdGlvbiBwcmlvciB0byBoYXJkd2FyZSByZXNldFxuIik7CiAJCQlnb3RvIGZhaWwxOwogCQl9CiAJCWlmIChlZnhfbmljX2lzX2R1YWxfZnVuYyhlZngpKSB7CiAJCQlyYyA9IHBjaV9zYXZlX3N0YXRlKG5pY19kYXRhLT5wY2lfZGV2Mik7CiAJCQlpZiAocmMpIHsKLQkJCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBiYWNrdXAgUENJIHN0YXRlIG9mICIKLQkJCQkJInNlY29uZGFyeSBmdW5jdGlvbiBwcmlvciB0byAiCi0JCQkJCSJoYXJkd2FyZSByZXNldFxuIik7CisJCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJCSAgImZhaWxlZCB0byBiYWNrdXAgUENJIHN0YXRlIG9mICIKKwkJCQkJICAic2Vjb25kYXJ5IGZ1bmN0aW9uIHByaW9yIHRvICIKKwkJCQkJICAiaGFyZHdhcmUgcmVzZXRcbiIpOwogCQkJCWdvdG8gZmFpbDI7CiAJCQl9CiAJCX0KQEAgLTExMTMsNyArMTEzNCw3IEBACiAJfQogCWVmeF93cml0ZW8oZWZ4LCAmZ2xiX2N0bF9yZWdfa2VyLCBGUl9BQl9HTEJfQ1RMKTsKIAotCUVGWF9MT0coZWZ4LCAid2FpdGluZyBmb3IgaGFyZHdhcmUgcmVzZXRcbiIpOworCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJ3YWl0aW5nIGZvciBoYXJkd2FyZSByZXNldFxuIik7CiAJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFogLyAyMCk7CiAKIAkvKiBSZXN0b3JlIFBDSSBjb25maWd1cmF0aW9uIGlmIG5lZWRlZCAqLwpAQCAtMTEyMSwyOCArMTE0MiwzMiBAQAogCQlpZiAoZWZ4X25pY19pc19kdWFsX2Z1bmMoZWZ4KSkgewogCQkJcmMgPSBwY2lfcmVzdG9yZV9zdGF0ZShuaWNfZGF0YS0+cGNpX2RldjIpOwogCQkJaWYgKHJjKSB7Ci0JCQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gcmVzdG9yZSBQQ0kgY29uZmlnIGZvciAiCi0JCQkJCSJ0aGUgc2Vjb25kYXJ5IGZ1bmN0aW9uXG4iKTsKKwkJCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCQkJICAiZmFpbGVkIHRvIHJlc3RvcmUgUENJIGNvbmZpZyBmb3IgIgorCQkJCQkgICJ0aGUgc2Vjb25kYXJ5IGZ1bmN0aW9uXG4iKTsKIAkJCQlnb3RvIGZhaWwzOwogCQkJfQogCQl9CiAJCXJjID0gcGNpX3Jlc3RvcmVfc3RhdGUoZWZ4LT5wY2lfZGV2KTsKIAkJaWYgKHJjKSB7Ci0JCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byByZXN0b3JlIFBDSSBjb25maWcgZm9yIHRoZSAiCi0JCQkJInByaW1hcnkgZnVuY3Rpb25cbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkJICAiZmFpbGVkIHRvIHJlc3RvcmUgUENJIGNvbmZpZyBmb3IgdGhlICIKKwkJCQkgICJwcmltYXJ5IGZ1bmN0aW9uXG4iKTsKIAkJCWdvdG8gZmFpbDQ7CiAJCX0KLQkJRUZYX0xPRyhlZngsICJzdWNjZXNzZnVsbHkgcmVzdG9yZWQgUENJIGNvbmZpZ1xuIik7CisJCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAic3VjY2Vzc2Z1bGx5IHJlc3RvcmVkIFBDSSBjb25maWdcbiIpOwogCX0KIAogCS8qIEFzc2VydCB0aGF0IHJlc2V0IGNvbXBsZXRlICovCiAJZWZ4X3JlYWRvKGVmeCwgJmdsYl9jdGxfcmVnX2tlciwgRlJfQUJfR0xCX0NUTCk7CiAJaWYgKEVGWF9PV09SRF9GSUVMRChnbGJfY3RsX3JlZ19rZXIsIEZSRl9BQl9TV1JTVCkgIT0gMCkgewogCQlyYyA9IC1FVElNRURPVVQ7Ci0JCUVGWF9FUlIoZWZ4LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlIHJlc2V0XG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgInRpbWVkIG91dCB3YWl0aW5nIGZvciBoYXJkd2FyZSByZXNldFxuIik7CiAJCWdvdG8gZmFpbDU7CiAJfQotCUVGWF9MT0coZWZ4LCAiaGFyZHdhcmUgcmVzZXQgY29tcGxldGVcbiIpOworCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJoYXJkd2FyZSByZXNldCBjb21wbGV0ZVxuIik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTE2NSw4ICsxMTkwLDkgQEAKIAogCXJjID0gZmFsY29uX2JvYXJkKGVmeCktPnR5cGUtPm1vbml0b3IoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJCb2FyZCBzZW5zb3IgJXM7IHNodXR0aW5nIGRvd24gUEhZXG4iLAotCQkJKHJjID09IC1FUkFOR0UpID8gInJlcG9ydGVkIGZhdWx0IiA6ICJmYWlsZWQiKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgIkJvYXJkIHNlbnNvciAlczsgc2h1dHRpbmcgZG93biBQSFlcbiIsCisJCQkgIChyYyA9PSAtRVJBTkdFKSA/ICJyZXBvcnRlZCBmYXVsdCIgOiAiZmFpbGVkIik7CiAJCWVmeC0+cGh5X21vZGUgfD0gUEhZX01PREVfTE9XX1BPV0VSOwogCQlyYyA9IF9fZWZ4X3JlY29uZmlndXJlX3BvcnQoZWZ4KTsKIAkJV0FSTl9PTihyYyk7CkBAIC0xMjE3LDcgKzEyNDMsOCBAQAogCS8qIFdhaXQgZm9yIFNSQU0gcmVzZXQgdG8gY29tcGxldGUgKi8KIAljb3VudCA9IDA7CiAJZG8gewotCQlFRlhfTE9HKGVmeCwgIndhaXRpbmcgZm9yIFNSQU0gcmVzZXQgKGF0dGVtcHQgJWQpLi4uXG4iLCBjb3VudCk7CisJCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJ3YWl0aW5nIGZvciBTUkFNIHJlc2V0IChhdHRlbXB0ICVkKS4uLlxuIiwgY291bnQpOwogCiAJCS8qIFNSQU0gcmVzZXQgaXMgc2xvdzsgZXhwZWN0IGFyb3VuZCAxNm1zICovCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKEhaIC8gNTApOwpAQCAtMTIyNSwxMyArMTI1MiwxNCBAQAogCQkvKiBDaGVjayBmb3IgcmVzZXQgY29tcGxldGUgKi8KIAkJZWZ4X3JlYWRvKGVmeCwgJnNybV9jZmdfcmVnX2tlciwgRlJfQVpfU1JNX0NGRyk7CiAJCWlmICghRUZYX09XT1JEX0ZJRUxEKHNybV9jZmdfcmVnX2tlciwgRlJGX0FaX1NSTV9JTklUX0VOKSkgewotCQkJRUZYX0xPRyhlZngsICJTUkFNIHJlc2V0IGNvbXBsZXRlXG4iKTsKKwkJCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkJICAiU1JBTSByZXNldCBjb21wbGV0ZVxuIik7CiAKIAkJCXJldHVybiAwOwogCQl9CiAJfSB3aGlsZSAoKytjb3VudCA8IDIwKTsJLyogd2FpdCB1cHRvIDAuNCBzZWMgKi8KIAotCUVGWF9FUlIoZWZ4LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIFNSQU0gcmVzZXRcbiIpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgU1JBTSByZXNldFxuIik7CiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKQEAgLTEyOTAsNyArMTMxOCw4IEBACiAKIAlyYyA9IGZhbGNvbl9yZWFkX252cmFtKGVmeCwgbnZjb25maWcpOwogCWlmIChyYyA9PSAtRUlOVkFMKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiTlZSQU0gaXMgaW52YWxpZCB0aGVyZWZvcmUgdXNpbmcgZGVmYXVsdHNcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJICAiTlZSQU0gaXMgaW52YWxpZCB0aGVyZWZvcmUgdXNpbmcgZGVmYXVsdHNcbiIpOwogCQllZngtPnBoeV90eXBlID0gUEhZX1RZUEVfTk9ORTsKIAkJZWZ4LT5tZGlvLnBydGFkID0gTURJT19QUlRBRF9OT05FOwogCQlib2FyZF9yZXYgPSAwOwpAQCAtMTMyNCw3ICsxMzUzLDggQEAKIAkvKiBSZWFkIHRoZSBNQUMgYWRkcmVzc2VzICovCiAJbWVtY3B5KGVmeC0+bWFjX2FkZHJlc3MsIG52Y29uZmlnLT5tYWNfYWRkcmVzc1swXSwgRVRIX0FMRU4pOwogCi0JRUZYX0xPRyhlZngsICJQSFkgaXMgJWQgcGh5X2lkICVkXG4iLCBlZngtPnBoeV90eXBlLCBlZngtPm1kaW8ucHJ0YWQpOworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICJQSFkgaXMgJWQgcGh5X2lkICVkXG4iLAorCQkgIGVmeC0+cGh5X3R5cGUsIGVmeC0+bWRpby5wcnRhZCk7CiAKIAlyYyA9IGZhbGNvbl9wcm9iZV9ib2FyZChlZngsIGJvYXJkX3Jldik7CiAJaWYgKHJjKQpAQCAtMTM1MywxNCArMTM4MywxNiBAQAogCWlmIChFRlhfT1dPUkRfRklFTEQoZ3Bpb19jdGwsIEZSRl9BQl9HUElPM19QV1JVUF9WQUxVRSkpIHsKIAkJYm9vdF9kZXYgPSAoRUZYX09XT1JEX0ZJRUxEKG5pY19zdGF0LCBGUkZfQUJfU0ZfUFJTVCkgPwogCQkJICAgIEZGRV9BQl9TUElfREVWSUNFX0ZMQVNIIDogRkZFX0FCX1NQSV9ERVZJQ0VfRUVQUk9NKTsKLQkJRUZYX0xPRyhlZngsICJCb290ZWQgZnJvbSAlc1xuIiwKLQkJCWJvb3RfZGV2ID09IEZGRV9BQl9TUElfREVWSUNFX0ZMQVNIID8gImZsYXNoIiA6ICJFRVBST00iKTsKKwkJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwgIkJvb3RlZCBmcm9tICVzXG4iLAorCQkJICBib290X2RldiA9PSBGRkVfQUJfU1BJX0RFVklDRV9GTEFTSCA/CisJCQkgICJmbGFzaCIgOiAiRUVQUk9NIik7CiAJfSBlbHNlIHsKIAkJLyogRGlzYWJsZSBWUEQgYW5kIHNldCBjbG9jayBkaXZpZGVycyB0byBzYWZlCiAJCSAqIHZhbHVlcyBmb3IgaW5pdGlhbCBwcm9ncmFtbWluZy4gKi8KIAkJYm9vdF9kZXYgPSAtMTsKLQkJRUZYX0xPRyhlZngsICJCb290ZWQgZnJvbSBpbnRlcm5hbCBBU0lDIHNldHRpbmdzOyIKLQkJCSIgc2V0dGluZyBTUEkgY29uZmlnXG4iKTsKKwkJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgIkJvb3RlZCBmcm9tIGludGVybmFsIEFTSUMgc2V0dGluZ3M7IgorCQkJICAiIHNldHRpbmcgU1BJIGNvbmZpZ1xuIik7CiAJCUVGWF9QT1BVTEFURV9PV09SRF8zKGVlX3ZwZF9jZmcsIEZSRl9BQl9FRV9WUERfRU4sIDAsCiAJCQkJICAgICAvKiAxMjUgTUh6IC8gNyB+PSAyMCBNSHogKi8KIAkJCQkgICAgIEZSRl9BQl9FRV9TRl9DTE9DS19ESVYsIDcsCkBAIC0xMzk0LDcgKzE0MjYsOCBAQAogCXJjID0gLUVOT0RFVjsKIAogCWlmIChlZnhfbmljX2ZwZ2FfdmVyKGVmeCkgIT0gMCkgewotCQlFRlhfRVJSKGVmeCwgIkZhbGNvbiBGUEdBIG5vdCBzdXBwb3J0ZWRcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJICAiRmFsY29uIEZQR0Egbm90IHN1cHBvcnRlZFxuIik7CiAJCWdvdG8gZmFpbDE7CiAJfQogCkBAIC0xNDA0LDE2ICsxNDM3LDE5IEBACiAJCXU4IHBjaV9yZXYgPSBlZngtPnBjaV9kZXYtPnJldmlzaW9uOwogCiAJCWlmICgocGNpX3JldiA9PSAweGZmKSB8fCAocGNpX3JldiA9PSAwKSkgewotCQkJRUZYX0VSUihlZngsICJGYWxjb24gcmV2IEEwIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJGYWxjb24gcmV2IEEwIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQkJZ290byBmYWlsMTsKIAkJfQogCQllZnhfcmVhZG8oZWZ4LCAmbmljX3N0YXQsIEZSX0FCX05JQ19TVEFUKTsKIAkJaWYgKEVGWF9PV09SRF9GSUVMRChuaWNfc3RhdCwgRlJGX0FCX1NUUkFQXzEwRykgPT0gMCkgewotCQkJRUZYX0VSUihlZngsICJGYWxjb24gcmV2IEExIDFHIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJGYWxjb24gcmV2IEExIDFHIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQkJZ290byBmYWlsMTsKIAkJfQogCQlpZiAoRUZYX09XT1JEX0ZJRUxEKG5pY19zdGF0LCBGUkZfQUFfU1RSQVBfUENJRSkgPT0gMCkgewotCQkJRUZYX0VSUihlZngsICJGYWxjb24gcmV2IEExIFBDSS1YIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJGYWxjb24gcmV2IEExIFBDSS1YIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQkJZ290byBmYWlsMTsKIAkJfQogCkBAIC0xNDI3LDcgKzE0NjMsOCBAQAogCQkJfQogCQl9CiAJCWlmICghbmljX2RhdGEtPnBjaV9kZXYyKSB7Ci0JCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBmaW5kIHNlY29uZGFyeSBmdW5jdGlvblxuIik7CisJCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgImZhaWxlZCB0byBmaW5kIHNlY29uZGFyeSBmdW5jdGlvblxuIik7CiAJCQlyYyA9IC1FTk9ERVY7CiAJCQlnb3RvIGZhaWwyOwogCQl9CkBAIC0xNDM2LDcgKzE0NzMsNyBAQAogCS8qIE5vdyB3ZSBjYW4gcmVzZXQgdGhlIE5JQyAqLwogCXJjID0gZmFsY29uX3Jlc2V0X2h3KGVmeCwgUkVTRVRfVFlQRV9BTEwpOwogCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byByZXNldCBOSUNcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiZmFpbGVkIHRvIHJlc2V0IE5JQ1xuIik7CiAJCWdvdG8gZmFpbDM7CiAJfQogCkBAIC0xNDQ2LDkgKzE0ODMsMTEgQEAKIAkJZ290byBmYWlsNDsKIAlCVUdfT04oZWZ4LT5pcnFfc3RhdHVzLmRtYV9hZGRyICYgMHgwZik7CiAKLQlFRlhfTE9HKGVmeCwgIklOVF9LRVIgYXQgJWxseCAodmlydCAlcCBwaHlzICVsbHgpXG4iLAotCQkodTY0KWVmeC0+aXJxX3N0YXR1cy5kbWFfYWRkciwKLQkJZWZ4LT5pcnFfc3RhdHVzLmFkZHIsICh1NjQpdmlydF90b19waHlzKGVmeC0+aXJxX3N0YXR1cy5hZGRyKSk7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAiSU5UX0tFUiBhdCAlbGx4ICh2aXJ0ICVwIHBoeXMgJWxseClcbiIsCisJCSAgKHU2NCllZngtPmlycV9zdGF0dXMuZG1hX2FkZHIsCisJCSAgZWZ4LT5pcnFfc3RhdHVzLmFkZHIsCisJCSAgKHU2NCl2aXJ0X3RvX3BoeXMoZWZ4LT5pcnFfc3RhdHVzLmFkZHIpKTsKIAogCWZhbGNvbl9wcm9iZV9zcGlfZGV2aWNlcyhlZngpOwogCkBAIC0xNDcyLDcgKzE1MTEsOCBAQAogCiAJcmMgPSBmYWxjb25fYm9hcmQoZWZ4KS0+dHlwZS0+aW5pdChlZngpOwogCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBpbml0aWFsaXNlIGJvYXJkXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgImZhaWxlZCB0byBpbml0aWFsaXNlIGJvYXJkXG4iKTsKIAkJZ290byBmYWlsNjsKIAl9CiAKQEAgLTE1NDIsNiArMTU4MiwxMyBAQAogCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHJlZywgRlJGX0JaX1JYX1hPTl9UWF9USCwgY3RybF94b25fdGhyKTsKIAkJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIEZSRl9CWl9SWF9YT0ZGX1RYX1RILCBjdHJsX3hvZmZfdGhyKTsKIAkJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIEZSRl9CWl9SWF9JTkdSX0VOLCAxKTsKKworCQkvKiBFbmFibGUgaGFzaCBpbnNlcnRpb24uIFRoaXMgaXMgYnJva2VuIGZvciB0aGUKKwkJICogJ0ZhbGNvbicgaGFzaCBzbyBhbHNvIHNlbGVjdCBUb2VwbGl0eiBUQ1AvSVB2NCBhbmQKKwkJICogSVB2NCBoYXNoZXMuICovCisJCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBGUkZfQlpfUlhfSEFTSF9JTlNSVF9IRFIsIDEpOworCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHJlZywgRlJGX0JaX1JYX0hBU0hfQUxHLCAxKTsKKwkJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIEZSRl9CWl9SWF9JUF9IQVNILCAxKTsKIAl9CiAJLyogQWx3YXlzIGVuYWJsZSBYT0ZGIHNpZ25hbCBmcm9tIFJYIEZJRk8uICBXZSBlbmFibGUKIAkgKiBvciBkaXNhYmxlIHRyYW5zbWlzc2lvbiBvZiBwYXVzZSBmcmFtZXMgYXQgdGhlIE1BQy4gKi8KQEAgLTE2MTUsOCArMTY2MiwxMiBAQAogCiAJZmFsY29uX2luaXRfcnhfY2ZnKGVmeCk7CiAKLQkvKiBTZXQgZGVzdGluYXRpb24gb2YgYm90aCBUWCBhbmQgUlggRmx1c2ggZXZlbnRzICovCiAJaWYgKGVmeF9uaWNfcmV2KGVmeCkgPj0gRUZYX1JFVl9GQUxDT05fQjApIHsKKwkJLyogU2V0IGhhc2gga2V5IGZvciBJUHY0ICovCisJCW1lbWNweSgmdGVtcCwgZWZ4LT5yeF9oYXNoX2tleSwgc2l6ZW9mKHRlbXApKTsKKwkJZWZ4X3dyaXRlbyhlZngsICZ0ZW1wLCBGUl9CWl9SWF9SU1NfVEtFWSk7CisKKwkJLyogU2V0IGRlc3RpbmF0aW9uIG9mIGJvdGggVFggYW5kIFJYIEZsdXNoIGV2ZW50cyAqLwogCQlFRlhfUE9QVUxBVEVfT1dPUkRfMSh0ZW1wLCBGUkZfQlpfRkxTX0VWUV9JRCwgMCk7CiAJCWVmeF93cml0ZW8oZWZ4LCAmdGVtcCwgRlJfQlpfRFBfQ1RSTCk7CiAJfQpAQCAtMTgyMSw2ICsxODcyLDcgQEAKIAkuZXZxX3B0cl90YmxfYmFzZSA9IEZSX0JaX0VWUV9QVFJfVEJMLAogCS5ldnFfcnB0cl90YmxfYmFzZSA9IEZSX0JaX0VWUV9SUFRSLAogCS5tYXhfZG1hX21hc2sgPSBETUFfQklUX01BU0soRlNGX0FaX1RYX0tFUl9CVUZfQUREUl9XSURUSCksCisJLnJ4X2J1ZmZlcl9oYXNoX3NpemUgPSAweDEwLAogCS5yeF9idWZmZXJfcGFkZGluZyA9IDAsCiAJLm1heF9pbnRlcnJ1cHRfbW9kZSA9IEVGWF9JTlRfTU9ERV9NU0lYLAogCS5waHlzX2FkZHJfY2hhbm5lbHMgPSAzMiwgLyogSGFyZHdhcmUgbGltaXQgaXMgNjQsIGJ1dCB0aGUgbGVnYWN5CkBAIC0xODI4LDcgKzE4ODAsNyBAQAogCQkJCSAgICogY2hhbm5lbHMgKi8KIAkudHhfZGNfYmFzZSA9IDB4MTMwMDAwLAogCS5yeF9kY19iYXNlID0gMHgxMDAwMDAsCi0JLm9mZmxvYWRfZmVhdHVyZXMgPSBORVRJRl9GX0lQX0NTVU0sCisJLm9mZmxvYWRfZmVhdHVyZXMgPSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1JYSEFTSCwKIAkucmVzZXRfd29ybGRfZmxhZ3MgPSBFVEhfUkVTRVRfSVJRLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25fYm9hcmRzLmMKaW5kZXggYzdhOTMzYS4uM2Q5NTBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYworKysgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uX2JvYXJkcy5jCkBAIC0xMDYsMTIgKzEwNiwxNyBAQAogCWFsYXJtczEgJj0gbWFzazsKIAlhbGFybXMyICY9IG1hc2sgPj4gODsKIAlpZiAoYWxhcm1zMSB8fCBhbGFybXMyKSB7Ci0JCUVGWF9FUlIoZWZ4LAotCQkJIkxNODcgZGV0ZWN0ZWQgYSBoYXJkd2FyZSBmYWlsdXJlIChzdGF0dXMgJTAyeDolMDJ4KSIKLQkJCSIlcyVzXG4iLAotCQkJYWxhcm1zMSwgYWxhcm1zMiwKLQkJCShhbGFybXMxICYgTE04N19BTEFSTV9URU1QX0lOVCkgPyAiIElOVEVSTkFMIiA6ICIiLAotCQkJKGFsYXJtczEgJiBMTTg3X0FMQVJNX1RFTVBfRVhUMSkgPyAiIEVYVEVSTkFMIiA6ICIiKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgIkxNODcgZGV0ZWN0ZWQgYSBoYXJkd2FyZSBmYWlsdXJlIChzdGF0dXMgJTAyeDolMDJ4KSIKKwkJCSAgIiVzJXMlc1xuIiwKKwkJCSAgYWxhcm1zMSwgYWxhcm1zMiwKKwkJCSAgKGFsYXJtczEgJiBMTTg3X0FMQVJNX1RFTVBfSU5UKSA/CisJCQkgICI7IGJvYXJkIGlzIG92ZXJoZWF0aW5nIiA6ICIiLAorCQkJICAoYWxhcm1zMSAmIExNODdfQUxBUk1fVEVNUF9FWFQxKSA/CisJCQkgICI7IGNvbnRyb2xsZXIgaXMgb3ZlcmhlYXRpbmciIDogIiIsCisJCQkgIChhbGFybXMxICYgfihMTTg3X0FMQVJNX1RFTVBfSU5UIHwgTE04N19BTEFSTV9URU1QX0VYVDEpCisJCQkgICB8fCBhbGFybXMyKSA/CisJCQkgICI7IGVsZWN0cmljYWwgZmF1bHQiIDogIiIpOwogCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKQEAgLTI0Myw3ICsyNDgsNyBAQAogCQkgICAgICAgKDAgPDwgUDBfRU5fM1YzWF9MQk4pIHwgKDAgPDwgUDBfRU5fNVZfTEJOKSB8CiAJCSAgICAgICAoMCA8PCBQMF9FTl8xVjBYX0xCTikpOwogCWlmIChyYyAhPSBvdXQpIHsKLQkJRUZYX0lORk8oZWZ4LCAicG93ZXItY3ljbGluZyBQSFlcbiIpOworCQluZXRpZl9pbmZvKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgInBvd2VyLWN5Y2xpbmcgUEhZXG4iKTsKIAkJcmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGlvZXhwX2NsaWVudCwgUDBfT1VULCBvdXQpOwogCQlpZiAocmMpCiAJCQlnb3RvIGZhaWxfb247CkBAIC0yNjksNyArMjc0LDggQEAKIAkJaWYgKHJjKQogCQkJZ290byBmYWlsX29uOwogCi0JCUVGWF9JTkZPKGVmeCwgIndhaXRpbmcgZm9yIERTUCBib290IChhdHRlbXB0ICVkKS4uLlxuIiwgaSk7CisJCW5ldGlmX2luZm8oZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAgIndhaXRpbmcgZm9yIERTUCBib290IChhdHRlbXB0ICVkKS4uLlxuIiwgaSk7CiAKIAkJLyogSW4gZmxhc2ggY29uZmlnIG1vZGUsIERTUCBkb2VzIG5vdCB0dXJuIG9uIEFGRSwgc28KIAkJICoganVzdCB3YWl0IDEgc2Vjb25kLgpAQCAtMjkxLDcgKzI5Nyw3IEBACiAJCX0KIAl9CiAKLQlFRlhfSU5GTyhlZngsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgRFNQIGJvb3RcbiIpOworCW5ldGlmX2luZm8oZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIERTUCBib290XG4iKTsKIAlyYyA9IC1FVElNRURPVVQ7CiBmYWlsX29uOgogCXNmZTQwMDFfcG93ZXJvZmYoZWZ4KTsKQEAgLTM3Nyw3ICszODMsNyBAQAogewogCXN0cnVjdCBmYWxjb25fYm9hcmQgKmJvYXJkID0gZmFsY29uX2JvYXJkKGVmeCk7CiAKLQlFRlhfSU5GTyhlZngsICIlc1xuIiwgX19mdW5jX18pOworCW5ldGlmX2luZm8oZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmVmeC0+cGNpX2Rldi0+ZGV2LCAmZGV2X2F0dHJfcGh5X2ZsYXNoX2NmZyk7CiAJc2ZlNDAwMV9wb3dlcm9mZihlZngpOwpAQCAtNDYxLDcgKzQ2Nyw3IEBACiAJaWYgKHJjKQogCQlnb3RvIGZhaWxfb247CiAKLQlFRlhfSU5GTyhlZngsICJQSFkgaXMgcG93ZXJlZCBvblxuIik7CisJbmV0aWZfaW5mbyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJQSFkgaXMgcG93ZXJlZCBvblxuIik7CiAJcmV0dXJuIDA7CiAKIGZhaWxfb246CkBAIC00OTMsNyArNDk5LDcgQEAKIAogc3RhdGljIHZvaWQgc2ZuNDExMXRfZmluaShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCUVGWF9JTkZPKGVmeCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJbmV0aWZfaW5mbyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWRldmljZV9yZW1vdmVfZmlsZSgmZWZ4LT5wY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9waHlfZmxhc2hfY2ZnKTsKIAlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoZmFsY29uX2JvYXJkKGVmeCktPmh3bW9uX2NsaWVudCk7CkBAIC03NDIsMTMgKzc0OCwxNCBAQAogCQkJYm9hcmQtPnR5cGUgPSAmYm9hcmRfdHlwZXNbaV07CiAKIAlpZiAoYm9hcmQtPnR5cGUpIHsKLQkJRUZYX0lORk8oZWZ4LCAiYm9hcmQgaXMgJXMgcmV2ICVjJWRcbiIsCisJCW5ldGlmX2luZm8oZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiYm9hcmQgaXMgJXMgcmV2ICVjJWRcbiIsCiAJCQkgKGVmeC0+cGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBFRlhfVkVORElEX1NGQykKIAkJCSA/IGJvYXJkLT50eXBlLT5yZWZfbW9kZWwgOiBib2FyZC0+dHlwZS0+Z2VuX3R5cGUsCiAJCQkgJ0EnICsgYm9hcmQtPm1ham9yLCBib2FyZC0+bWlub3IpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewotCQlFRlhfRVJSKGVmeCwgInVua25vd24gYm9hcmQgdHlwZSAlZFxuIiwgdHlwZV9pZCk7CisJCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICJ1bmtub3duIGJvYXJkIHR5cGUgJWRcbiIsCisJCQkgIHR5cGVfaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uX3htYWMuYyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25feG1hYy5jCmluZGV4IGM4NGEyY2UuLmJhZTY1NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25feG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25feG1hYy5jCkBAIC04MSw3ICs4MSw4IEBACiAJCX0KIAkJdWRlbGF5KDEwKTsKIAl9Ci0JRUZYX0VSUihlZngsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgWEFVSS9YR1hTIHJlc2V0XG4iKTsKKwluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgWEFVSS9YR1hTIHJlc2V0XG4iKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIApAQCAtMjU2LDcgKzI1Nyw3IEBACiAJZmFsY29uX3N0b3BfbmljX3N0YXRzKGVmeCk7CiAKIAl3aGlsZSAoIW1hY191cCAmJiB0cmllcykgewotCQlFRlhfTE9HKGVmeCwgImJhc2hpbmcgeGF1aVxuIik7CisJCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJiYXNoaW5nIHhhdWlcbiIpOwogCQlmYWxjb25fcmVzZXRfeGF1aShlZngpOwogCQl1ZGVsYXkoMjAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2lvLmggYi9kcml2ZXJzL25ldC9zZmMvaW8uaAppbmRleCBiODkxNzdjLi44NWE5OWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvaW8uaAorKysgYi9kcml2ZXJzL25ldC9zZmMvaW8uaApAQCAtNzgsOCArNzgsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogCi0JRUZYX1JFR0RVTVAoZWZ4LCAid3JpdGluZyByZWdpc3RlciAleCB3aXRoICIgRUZYX09XT1JEX0ZNVCAiXG4iLCByZWcsCi0JCSAgICBFRlhfT1dPUkRfVkFMKCp2YWx1ZSkpOworCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICAid3JpdGluZyByZWdpc3RlciAleCB3aXRoICIgRUZYX09XT1JEX0ZNVCAiXG4iLCByZWcsCisJCSAgIEVGWF9PV09SRF9WQUwoKnZhbHVlKSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWZ4LT5iaXVfbG9jaywgZmxhZ3MpOwogI2lmZGVmIEVGWF9VU0VfUVdPUkRfSU8KQEAgLTEwNSw4ICsxMDYsOSBAQAogCXVuc2lnbmVkIGludCBhZGRyID0gaW5kZXggKiBzaXplb2YoKnZhbHVlKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIAotCUVGWF9SRUdEVU1QKGVmeCwgIndyaXRpbmcgU1JBTSBhZGRyZXNzICV4IHdpdGggIiBFRlhfUVdPUkRfRk1UICJcbiIsCi0JCSAgICBhZGRyLCBFRlhfUVdPUkRfVkFMKCp2YWx1ZSkpOworCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICAid3JpdGluZyBTUkFNIGFkZHJlc3MgJXggd2l0aCAiIEVGWF9RV09SRF9GTVQgIlxuIiwKKwkJICAgYWRkciwgRUZYX1FXT1JEX1ZBTCgqdmFsdWUpKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlZngtPmJpdV9sb2NrLCBmbGFncyk7CiAjaWZkZWYgRUZYX1VTRV9RV09SRF9JTwpAQCAtMTI5LDggKzEzMSw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZWZ4X3dyaXRlZChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBlZnhfZHdvcmRfdCAqdmFsdWUsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnKQogewotCUVGWF9SRUdEVU1QKGVmeCwgIndyaXRpbmcgcGFydGlhbCByZWdpc3RlciAleCB3aXRoICJFRlhfRFdPUkRfRk1UIlxuIiwKLQkJICAgIHJlZywgRUZYX0RXT1JEX1ZBTCgqdmFsdWUpKTsKKwluZXRpZl92ZGJnKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJICAgIndyaXRpbmcgcGFydGlhbCByZWdpc3RlciAleCB3aXRoICJFRlhfRFdPUkRfRk1UIlxuIiwKKwkJICAgcmVnLCBFRlhfRFdPUkRfVkFMKCp2YWx1ZSkpOwogCiAJLyogTm8gbG9jayByZXF1aXJlZCAqLwogCV9lZnhfd3JpdGVkKGVmeCwgdmFsdWUtPnUzMlswXSwgcmVnKTsKQEAgLTE1NSw4ICsxNTgsOSBAQAogCXZhbHVlLT51MzJbM10gPSBfZWZ4X3JlYWRkKGVmeCwgcmVnICsgMTIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmeC0+Yml1X2xvY2ssIGZsYWdzKTsKIAotCUVGWF9SRUdEVU1QKGVmeCwgInJlYWQgZnJvbSByZWdpc3RlciAleCwgZ290ICIgRUZYX09XT1JEX0ZNVCAiXG4iLCByZWcsCi0JCSAgICBFRlhfT1dPUkRfVkFMKCp2YWx1ZSkpOworCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICAicmVhZCBmcm9tIHJlZ2lzdGVyICV4LCBnb3QgIiBFRlhfT1dPUkRfRk1UICJcbiIsIHJlZywKKwkJICAgRUZYX09XT1JEX1ZBTCgqdmFsdWUpKTsKIH0KIAogLyogUmVhZCBhbiA4LWJ5dGUgU1JBTSBlbnRyeSB0aHJvdWdoIHN1cHBsaWVkIG1hcHBpbmcsCkBAIC0xNzcsOCArMTgxLDkgQEAKICNlbmRpZgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVmeC0+Yml1X2xvY2ssIGZsYWdzKTsKIAotCUVGWF9SRUdEVU1QKGVmeCwgInJlYWQgZnJvbSBTUkFNIGFkZHJlc3MgJXgsIGdvdCAiRUZYX1FXT1JEX0ZNVCJcbiIsCi0JCSAgICBhZGRyLCBFRlhfUVdPUkRfVkFMKCp2YWx1ZSkpOworCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICAicmVhZCBmcm9tIFNSQU0gYWRkcmVzcyAleCwgZ290ICJFRlhfUVdPUkRfRk1UIlxuIiwKKwkJICAgYWRkciwgRUZYX1FXT1JEX1ZBTCgqdmFsdWUpKTsKIH0KIAogLyogUmVhZCBkd29yZCBmcm9tIHJlZ2lzdGVyIHRoYXQgYWxsb3dzIHBhcnRpYWwgd3JpdGVzIChzaWMpICovCkBAIC0xODYsOCArMTkxLDkgQEAKIAkJCQl1bnNpZ25lZCBpbnQgcmVnKQogewogCXZhbHVlLT51MzJbMF0gPSBfZWZ4X3JlYWRkKGVmeCwgcmVnKTsKLQlFRlhfUkVHRFVNUChlZngsICJyZWFkIGZyb20gcmVnaXN0ZXIgJXgsIGdvdCAiRUZYX0RXT1JEX0ZNVCJcbiIsCi0JCSAgICByZWcsIEVGWF9EV09SRF9WQUwoKnZhbHVlKSk7CisJbmV0aWZfdmRiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCSAgICJyZWFkIGZyb20gcmVnaXN0ZXIgJXgsIGdvdCAiRUZYX0RXT1JEX0ZNVCJcbiIsCisJCSAgIHJlZywgRUZYX0RXT1JEX1ZBTCgqdmFsdWUpKTsKIH0KIAogLyogV3JpdGUgdG8gYSByZWdpc3RlciBmb3JtaW5nIHBhcnQgb2YgYSB0YWJsZSAqLwpAQCAtMjExLDYgKzIxNywxMyBAQAogCWVmeF93cml0ZWQoZWZ4LCB2YWx1ZSwgcmVnICsgaW5kZXggKiBzaXplb2YoZWZ4X293b3JkX3QpKTsKIH0KIAorLyogUmVhZCBmcm9tIGEgZHdvcmQgcmVnaXN0ZXIgZm9ybWluZyBwYXJ0IG9mIGEgdGFibGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlZnhfcmVhZGRfdGFibGUoc3RydWN0IGVmeF9uaWMgKmVmeCwgZWZ4X2R3b3JkX3QgKnZhbHVlLAorCQkJCSAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwllZnhfcmVhZGQoZWZ4LCB2YWx1ZSwgcmVnICsgaW5kZXggKiBzaXplb2YoZWZ4X2R3b3JkX3QpKTsKK30KKwogLyogUGFnZS1tYXBwZWQgcmVnaXN0ZXIgYmxvY2sgc2l6ZSAqLwogI2RlZmluZSBFRlhfUEFHRV9CTE9DS19TSVpFIDB4MjAwMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvbWNkaS5jIGIvZHJpdmVycy9uZXQvc2ZjL21jZGkuYwppbmRleCA5M2NjM2MxLi4zOTEyYjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvbWNkaS5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9tY2RpLmMKQEAgLTE2OCwxMSArMTY4LDEyIEBACiAJZXJyb3IgPSBFRlhfRFdPUkRfRklFTEQocmVnLCBNQ0RJX0hFQURFUl9FUlJPUik7CiAKIAlpZiAoZXJyb3IgJiYgbWNkaS0+cmVzcGxlbiA9PSAwKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiTUMgcmVib290ZWRcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiTUMgcmVib290ZWRcbiIpOwogCQlyYyA9IEVJTzsKIAl9IGVsc2UgaWYgKChyZXNwc2VxIF4gbWNkaS0+c2Vxbm8pICYgU0VRX01BU0spIHsKLQkJRUZYX0VSUihlZngsICJNQyByZXNwb25zZSBtaXNtYXRjaCB0eCBzZXEgMHgleCByeCBzZXEgMHgleFxuIiwKLQkJCXJlc3BzZXEsIG1jZGktPnNlcW5vKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgIk1DIHJlc3BvbnNlIG1pc21hdGNoIHR4IHNlcSAweCV4IHJ4IHNlcSAweCV4XG4iLAorCQkJICByZXNwc2VxLCBtY2RpLT5zZXFubyk7CiAJCXJjID0gRUlPOwogCX0gZWxzZSBpZiAoZXJyb3IpIHsKIAkJZWZ4X3JlYWRkKGVmeCwgJnJlZywgcGR1ICsgNCk7CkBAIC0zMDMsOCArMzA0LDkgQEAKIAkJCS8qIFRoZSByZXF1ZXN0IGhhcyBiZWVuIGNhbmNlbGxlZCAqLwogCQkJLS1tY2RpLT5jcmVkaXRzOwogCQllbHNlCi0JCQlFRlhfRVJSKGVmeCwgIk1DIHJlc3BvbnNlIG1pc21hdGNoIHR4IHNlcSAweCV4IHJ4ICIKLQkJCQkic2VxIDB4JXhcbiIsIHNlcW5vLCBtY2RpLT5zZXFubyk7CisJCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIk1DIHJlc3BvbnNlIG1pc21hdGNoIHR4IHNlcSAweCV4IHJ4ICIKKwkJCQkgICJzZXEgMHgleFxuIiwgc2Vxbm8sIG1jZGktPnNlcW5vKTsKIAl9IGVsc2UgewogCQltY2RpLT5yZXNwcmMgPSBlcnJubzsKIAkJbWNkaS0+cmVzcGxlbiA9IGRhdGFsZW47CkBAIC0zNTIsOCArMzU0LDkgQEAKIAkJKyttY2RpLT5jcmVkaXRzOwogCQlzcGluX3VubG9ja19iaCgmbWNkaS0+aWZhY2VfbG9jayk7CiAKLQkJRUZYX0VSUihlZngsICJNQyBjb21tYW5kIDB4JXggaW5sZW4gJWQgbW9kZSAlZCB0aW1lZCBvdXRcbiIsCi0JCQljbWQsIChpbnQpaW5sZW4sIG1jZGktPm1vZGUpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAiTUMgY29tbWFuZCAweCV4IGlubGVuICVkIG1vZGUgJWQgdGltZWQgb3V0XG4iLAorCQkJICBjbWQsIChpbnQpaW5sZW4sIG1jZGktPm1vZGUpOwogCX0gZWxzZSB7CiAJCXNpemVfdCByZXNwbGVuOwogCkBAIC0zNzQsMTEgKzM3NywxMyBAQAogCQl9IGVsc2UgaWYgKGNtZCA9PSBNQ19DTURfUkVCT09UICYmIHJjID09IC1FSU8pCiAJCQk7IC8qIERvbid0IHJlc2V0IGlmIE1DX0NNRF9SRUJPT1QgcmV0dXJucyBFSU8gKi8KIAkJZWxzZSBpZiAocmMgPT0gLUVJTyB8fCByYyA9PSAtRUlOVFIpIHsKLQkJCUVGWF9FUlIoZWZ4LCAiTUMgZmF0YWwgZXJyb3IgJWRcbiIsIC1yYyk7CisJCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiTUMgZmF0YWwgZXJyb3IgJWRcbiIsCisJCQkJICAtcmMpOwogCQkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9NQ19GQUlMVVJFKTsKIAkJfSBlbHNlCi0JCQlFRlhfRVJSKGVmeCwgIk1DIGNvbW1hbmQgMHgleCBpbmxlbiAlZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJY21kLCAoaW50KWlubGVuLCAtcmMpOworCQkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJNQyBjb21tYW5kIDB4JXggaW5sZW4gJWQgZmFpbGVkIHJjPSVkXG4iLAorCQkJCSAgY21kLCAoaW50KWlubGVuLCAtcmMpOwogCX0KIAogCWVmeF9tY2RpX3JlbGVhc2UobWNkaSk7CkBAIC01MzQsOCArNTM5LDkgQEAKIAlFRlhfQlVHX09OX1BBUkFOT0lEKHN0YXRlID49IEFSUkFZX1NJWkUoc2Vuc29yX3N0YXR1c19uYW1lcykpOwogCXN0YXRlX3R4dCA9IHNlbnNvcl9zdGF0dXNfbmFtZXNbc3RhdGVdOwogCi0JRUZYX0VSUihlZngsICJTZW5zb3IgJWQgKCVzKSByZXBvcnRzIGNvbmRpdGlvbiAnJXMnIGZvciByYXcgdmFsdWUgJWRcbiIsCi0JCW1vbml0b3IsIG5hbWUsIHN0YXRlX3R4dCwgdmFsdWUpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCSAgIlNlbnNvciAlZCAoJXMpIHJlcG9ydHMgY29uZGl0aW9uICclcycgZm9yIHJhdyB2YWx1ZSAlZFxuIiwKKwkJICBtb25pdG9yLCBuYW1lLCBzdGF0ZV90eHQsIHZhbHVlKTsKIH0KIAogLyogQ2FsbGVkIGZyb20gIGZhbGNvbl9wcm9jZXNzX2V2ZW50cSBmb3IgTUNESSBldmVudHMgKi8KQEAgLTU0OCwxMiArNTU0LDEzIEBACiAKIAlzd2l0Y2ggKGNvZGUpIHsKIAljYXNlIE1DRElfRVZFTlRfQ09ERV9CQURTU0VSVDoKLQkJRUZYX0VSUihlZngsICJNQyB3YXRjaGRvZyBvciBhc3NlcnRpb24gZmFpbHVyZSBhdCAweCV4XG4iLCBkYXRhKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgIk1DIHdhdGNoZG9nIG9yIGFzc2VydGlvbiBmYWlsdXJlIGF0IDB4JXhcbiIsIGRhdGEpOwogCQllZnhfbWNkaV9ldl9kZWF0aChlZngsIEVJTlRSKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1DRElfRVZFTlRfQ09ERV9QTU5PVElDRToKLQkJRUZYX0lORk8oZWZ4LCAiTUNESSBQTSBldmVudC5cbiIpOworCQluZXRpZl9pbmZvKGVmeCwgd29sLCBlZngtPm5ldF9kZXYsICJNQ0RJIFBNIGV2ZW50LlxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBNQ0RJX0VWRU5UX0NPREVfQ01ERE9ORToKQEAgLTU3MCwxMCArNTc3LDExIEBACiAJCWVmeF9tY2RpX3NlbnNvcl9ldmVudChlZngsIGV2ZW50KTsKIAkJYnJlYWs7CiAJY2FzZSBNQ0RJX0VWRU5UX0NPREVfU0NIRURFUlI6Ci0JCUVGWF9JTkZPKGVmeCwgIk1DIFNjaGVkdWxlciBlcnJvciBhZGRyZXNzPTB4JXhcbiIsIGRhdGEpOworCQluZXRpZl9pbmZvKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgICJNQyBTY2hlZHVsZXIgZXJyb3IgYWRkcmVzcz0weCV4XG4iLCBkYXRhKTsKIAkJYnJlYWs7CiAJY2FzZSBNQ0RJX0VWRU5UX0NPREVfUkVCT09UOgotCQlFRlhfSU5GTyhlZngsICJNQyBSZWJvb3RcbiIpOworCQluZXRpZl9pbmZvKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIk1DIFJlYm9vdFxuIik7CiAJCWVmeF9tY2RpX2V2X2RlYXRoKGVmeCwgRUlPKTsKIAkJYnJlYWs7CiAJY2FzZSBNQ0RJX0VWRU5UX0NPREVfTUFDX1NUQVRTX0RNQToKQEAgLTU4MSw3ICs1ODksOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUVGWF9FUlIoZWZ4LCAiVW5rbm93biBNQ0RJIGV2ZW50IDB4JXhcbiIsIGNvZGUpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiVW5rbm93biBNQ0RJIGV2ZW50IDB4JXhcbiIsCisJCQkgIGNvZGUpOwogCX0KIH0KIApAQCAtNjI3LDcgKzYzNiw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtNjU3LDcgKzY2Niw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtNjk1LDcgKzcwNCw4IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkIGxlbj0lZFxuIiwgX19mdW5jX18sIHJjLCAoaW50KW91dGxlbik7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWQgbGVuPSVkXG4iLAorCQkgIF9fZnVuY19fLCByYywgKGludClvdXRsZW4pOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNzI0LDcgKzczNCw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtNzQ5LDggKzc1OSw4IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLAotCQlfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLAorCQkgIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC03ODEsNyArNzkxLDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC04MDIsNyArODEyLDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC04MjcsNyArODM3LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC04NTMsNyArODYzLDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC04NzcsNyArODg3LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC04OTgsNyArOTA4LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC05NDgsOSArOTU4LDEwIEBACiAJcmV0dXJuIDA7CiAKIGZhaWwyOgotCUVGWF9FUlIoZWZ4LCAiJXM6IGZhaWxlZCB0eXBlPSV1XG4iLCBfX2Z1bmNfXywgdHlwZSk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgdHlwZT0ldVxuIiwKKwkJICBfX2Z1bmNfXywgdHlwZSk7CiBmYWlsMToKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC05OTQsMTQgKzEwMDUsMTUgQEAKIAkJOiAoZmxhZ3MgPT0gTUNfQ01EX0dFVF9BU1NFUlRTX0ZMQUdTX1dET0dfRklSRUQpCiAJCT8gIndhdGNoZG9nIHJlc2V0IgogCQk6ICJ1bmtub3duIGFzc2VydGlvbiI7Ci0JRUZYX0VSUihlZngsICJNQ1BVICVzIGF0IFBDID0gMHglLjh4IGluIHRocmVhZCAweCUuOHhcbiIsIHJlYXNvbiwKLQkJTUNESV9EV09SRChvdXRidWYsIEdFVF9BU1NFUlRTX09VVF9TQVZFRF9QQ19PRkZTKSwKLQkJTUNESV9EV09SRChvdXRidWYsIEdFVF9BU1NFUlRTX09VVF9USFJFQURfT0ZGUykpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCSAgIk1DUFUgJXMgYXQgUEMgPSAweCUuOHggaW4gdGhyZWFkIDB4JS44eFxuIiwgcmVhc29uLAorCQkgIE1DRElfRFdPUkQob3V0YnVmLCBHRVRfQVNTRVJUU19PVVRfU0FWRURfUENfT0ZGUyksCisJCSAgTUNESV9EV09SRChvdXRidWYsIEdFVF9BU1NFUlRTX09VVF9USFJFQURfT0ZGUykpOwogCiAJLyogUHJpbnQgb3V0IHRoZSByZWdpc3RlcnMgKi8KIAlvZnN0ID0gTUNfQ01EX0dFVF9BU1NFUlRTX09VVF9HUF9SRUdTX09GRlNfT0ZTVDsKIAlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCAzMjsgaW5kZXgrKykgewotCQlFRlhfRVJSKGVmeCwgIlIlLjJkICg/KTogMHglLjh4XG4iLCBpbmRleCwKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIlIlLjJkICg/KTogMHglLjh4XG4iLCBpbmRleCwKIAkJCU1DRElfRFdPUkQyKG91dGJ1Ziwgb2ZzdCkpOwogCQlvZnN0ICs9IHNpemVvZihlZnhfZHdvcmRfdCk7CiAJfQpAQCAtMTA1MCwxNCArMTA2MiwxNiBAQAogCXJjID0gZWZ4X21jZGlfcnBjKGVmeCwgTUNfQ01EX1NFVF9JRF9MRUQsIGluYnVmLCBzaXplb2YoaW5idWYpLAogCQkJICBOVUxMLCAwLCBOVUxMKTsKIAlpZiAocmMpCi0JCUVGWF9FUlIoZWZ4LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsCisJCQkgIF9fZnVuY19fLCByYyk7CiB9CiAKIGludCBlZnhfbWNkaV9yZXNldF9wb3J0KHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJaW50IHJjID0gZWZ4X21jZGlfcnBjKGVmeCwgTUNfQ01EX1BPUlRfUkVTRVQsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwpOwogCWlmIChyYykKLQkJRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwKKwkJCSAgX19mdW5jX18sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEwNzUsNyArMTA4OSw3IEBACiAJCXJldHVybiAwOwogCWlmIChyYyA9PSAwKQogCQlyYyA9IC1FSU87Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTEwOCw3ICsxMTIyLDcgQEAKIAogZmFpbDoKIAkqaWRfb3V0ID0gLTE7Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwogCXJldHVybiByYzsKIAogfQpAQCAtMTE0Myw3ICsxMTU3LDcgQEAKIAogZmFpbDoKIAkqaWRfb3V0ID0gLTE7Ci0JRUZYX0VSUihlZngsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTE2Myw3ICsxMTc3LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMTc5LDcgKzExOTMsNyBAQAogCXJldHVybiAwOwogCiBmYWlsOgotCUVGWF9FUlIoZWZ4LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKKwluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9tY2RpX21hYy5jIGIvZHJpdmVycy9uZXQvc2ZjL21jZGlfbWFjLmMKaW5kZXggMzkxODI2My4uZjg4ZjRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL21jZGlfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL21jZGlfbWFjLmMKQEAgLTY5LDggKzY5LDggQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsCi0JCV9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsCisJCSAgX19mdW5jX18sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTExMCw4ICsxMTAsOCBAQAogCXJldHVybiAwOwogCiBmYWlsOgotCUVGWF9FUlIoZWZ4LCAiJXM6ICVzIGZhaWxlZCByYz0lZFxuIiwKLQkJX19mdW5jX18sIGVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiAlcyBmYWlsZWQgcmM9JWRcbiIsCisJCSAgX19mdW5jX18sIGVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvbWNkaV9waHkuYyBiL2RyaXZlcnMvbmV0L3NmYy9tY2RpX3BoeS5jCmluZGV4IDYwMzJjMGUuLjAxMjFlNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9tY2RpX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9tY2RpX3BoeS5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAibmljLmgiCiAjaW5jbHVkZSAic2VsZnRlc3QuaCIKIAotc3RydWN0IGVmeF9tY2RpX3BoeV9jZmcgeworc3RydWN0IGVmeF9tY2RpX3BoeV9kYXRhIHsKIAl1MzIgZmxhZ3M7CiAJdTMyIHR5cGU7CiAJdTMyIHN1cHBvcnRlZF9jYXA7CkBAIC0zNSw3ICszNSw3IEBACiB9OwogCiBzdGF0aWMgaW50Ci1lZnhfbWNkaV9nZXRfcGh5X2NmZyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X21jZGlfcGh5X2NmZyAqY2ZnKQorZWZ4X21jZGlfZ2V0X3BoeV9jZmcoc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGVmeF9tY2RpX3BoeV9kYXRhICpjZmcpCiB7CiAJdTggb3V0YnVmW01DX0NNRF9HRVRfUEhZX0NGR19PVVRfTEVOXTsKIAlzaXplX3Qgb3V0bGVuOwpAQCAtNzEsNyArNzEsNyBAQAogCXJldHVybiAwOwogCiBmYWlsOgotCUVGWF9FUlIoZWZ4LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKKwluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTk3LDcgKzk3LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNTksNyArMjU5LDcgQEAKIAogc3RhdGljIHUzMiBlZnhfZ2V0X21jZGlfcGh5X2ZsYWdzKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0Jc3RydWN0IGVmeF9tY2RpX3BoeV9jZmcgKnBoeV9jZmcgPSBlZngtPnBoeV9kYXRhOworCXN0cnVjdCBlZnhfbWNkaV9waHlfZGF0YSAqcGh5X2NmZyA9IGVmeC0+cGh5X2RhdGE7CiAJZW51bSBlZnhfcGh5X21vZGUgbW9kZSwgc3VwcG9ydGVkOwogCXUzMiBmbGFnczsKIApAQCAtMzA3LDcgKzMwNyw3IEBACiAKIHN0YXRpYyBpbnQgZWZ4X21jZGlfcGh5X3Byb2JlKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0Jc3RydWN0IGVmeF9tY2RpX3BoeV9jZmcgKnBoeV9kYXRhOworCXN0cnVjdCBlZnhfbWNkaV9waHlfZGF0YSAqcGh5X2RhdGE7CiAJdTggb3V0YnVmW01DX0NNRF9HRVRfTElOS19PVVRfTEVOXTsKIAl1MzIgY2FwczsKIAlpbnQgcmM7CkBAIC0zOTUsNiArMzk1LDcgQEAKIAllZngtPndhbnRlZF9mYyA9IEVGWF9GQ19SWCB8IEVGWF9GQ19UWDsKIAlpZiAocGh5X2RhdGEtPnN1cHBvcnRlZF9jYXAgJiAoMSA8PCBNQ19DTURfUEhZX0NBUF9BTl9MQk4pKQogCQllZngtPndhbnRlZF9mYyB8PSBFRlhfRkNfQVVUTzsKKwllZnhfbGlua19zZXRfd2FudGVkX2ZjKGVmeCwgZWZ4LT53YW50ZWRfZmMpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTQwNSw3ICs0MDYsNyBAQAogCiBpbnQgZWZ4X21jZGlfcGh5X3JlY29uZmlndXJlKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0Jc3RydWN0IGVmeF9tY2RpX3BoeV9jZmcgKnBoeV9jZmcgPSBlZngtPnBoeV9kYXRhOworCXN0cnVjdCBlZnhfbWNkaV9waHlfZGF0YSAqcGh5X2NmZyA9IGVmeC0+cGh5X2RhdGE7CiAJdTMyIGNhcHMgPSAoZWZ4LT5saW5rX2FkdmVydGlzaW5nID8KIAkJICAgIGV0aHRvb2xfdG9fbWNkaV9jYXAoZWZ4LT5saW5rX2FkdmVydGlzaW5nKSA6CiAJCSAgICBwaHlfY2ZnLT5mb3JjZWRfY2FwKTsKQEAgLTQ0Niw3ICs0NDcsNyBAQAogICovCiB2b2lkIGVmeF9tY2RpX3BoeV9jaGVja19mY250bChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1MzIgbHBhKQogewotCXN0cnVjdCBlZnhfbWNkaV9waHlfY2ZnICpwaHlfY2ZnID0gZWZ4LT5waHlfZGF0YTsKKwlzdHJ1Y3QgZWZ4X21jZGlfcGh5X2RhdGEgKnBoeV9jZmcgPSBlZngtPnBoeV9kYXRhOwogCXUzMiBybXRhZHY7CiAKIAkvKiBUaGUgbGluayBwYXJ0bmVyIGNhcGFiaWxpdGllcyBhcmUgb25seSByZWxldmVudCBpZiB0aGUKQEAgLTQ2NSw4ICs0NjYsOCBAQAogCQlybXRhZHYgfD0gIEFEVkVSVElTRURfQXN5bV9QYXVzZTsKIAogCWlmICgoZWZ4LT53YW50ZWRfZmMgJiBFRlhfRkNfVFgpICYmIHJtdGFkdiA9PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCi0JCUVGWF9FUlIoZWZ4LCAid2FybmluZzogbGluayBwYXJ0bmVyIGRvZXNuJ3Qgc3VwcG9ydCAiCi0JCQkicGF1c2UgZnJhbWVzIik7CisJCW5ldGlmX2VycihlZngsIGxpbmssIGVmeC0+bmV0X2RldiwKKwkJCSAgIndhcm5pbmc6IGxpbmsgcGFydG5lciBkb2Vzbid0IHN1cHBvcnQgcGF1c2UgZnJhbWVzIik7CiB9CiAKIHN0YXRpYyBib29sIGVmeF9tY2RpX3BoeV9wb2xsKHN0cnVjdCBlZnhfbmljICplZngpCkBAIC00ODIsNyArNDgzLDggQEAKIAlyYyA9IGVmeF9tY2RpX3JwYyhlZngsIE1DX0NNRF9HRVRfTElOSywgTlVMTCwgMCwKIAkJCSAgb3V0YnVmLCBzaXplb2Yob3V0YnVmKSwgTlVMTCk7CiAJaWYgKHJjKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiJXM6IGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsCisJCQkgIF9fZnVuY19fLCByYyk7CiAJCWVmeC0+bGlua19zdGF0ZS51cCA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCWVmeF9tY2RpX3BoeV9kZWNvZGVfbGluaygKQEAgLTUwNSw3ICs1MDcsNyBAQAogCiBzdGF0aWMgdm9pZCBlZnhfbWNkaV9waHlfZ2V0X3NldHRpbmdzKHN0cnVjdCBlZnhfbmljICplZngsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKLQlzdHJ1Y3QgZWZ4X21jZGlfcGh5X2NmZyAqcGh5X2NmZyA9IGVmeC0+cGh5X2RhdGE7CisJc3RydWN0IGVmeF9tY2RpX3BoeV9kYXRhICpwaHlfY2ZnID0gZWZ4LT5waHlfZGF0YTsKIAl1OCBvdXRidWZbTUNfQ01EX0dFVF9MSU5LX09VVF9MRU5dOwogCWludCByYzsKIApAQCAtNTI1LDcgKzUyNyw4IEBACiAJcmMgPSBlZnhfbWNkaV9ycGMoZWZ4LCBNQ19DTURfR0VUX0xJTkssIE5VTEwsIDAsCiAJCQkgIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksIE5VTEwpOwogCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgIiVzOiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlczogZmFpbGVkIHJjPSVkXG4iLAorCQkJICBfX2Z1bmNfXywgcmMpOwogCQlyZXR1cm47CiAJfQogCWVjbWQtPmxwX2FkdmVydGlzaW5nID0KQEAgLTUzNSw3ICs1MzgsNyBAQAogCiBzdGF0aWMgaW50IGVmeF9tY2RpX3BoeV9zZXRfc2V0dGluZ3Moc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBlZnhfbWNkaV9waHlfY2ZnICpwaHlfY2ZnID0gZWZ4LT5waHlfZGF0YTsKKwlzdHJ1Y3QgZWZ4X21jZGlfcGh5X2RhdGEgKnBoeV9jZmcgPSBlZngtPnBoeV9kYXRhOwogCXUzMiBjYXBzOwogCWludCByYzsKIApAQCAtNjc0LDcgKzY3Nyw3IEBACiBzdGF0aWMgaW50IGVmeF9tY2RpX3BoeV9ydW5fdGVzdHMoc3RydWN0IGVmeF9uaWMgKmVmeCwgaW50ICpyZXN1bHRzLAogCQkJCSAgdW5zaWduZWQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGVmeF9tY2RpX3BoeV9jZmcgKnBoeV9jZmcgPSBlZngtPnBoeV9kYXRhOworCXN0cnVjdCBlZnhfbWNkaV9waHlfZGF0YSAqcGh5X2NmZyA9IGVmeC0+cGh5X2RhdGE7CiAJdTMyIG1vZGU7CiAJaW50IHJjOwogCkBAIC03MTIsNyArNzE1LDcgQEAKIAogY29uc3QgY2hhciAqZWZ4X21jZGlfcGh5X3Rlc3RfbmFtZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IGVmeF9tY2RpX3BoeV9jZmcgKnBoeV9jZmcgPSBlZngtPnBoeV9kYXRhOworCXN0cnVjdCBlZnhfbWNkaV9waHlfZGF0YSAqcGh5X2NmZyA9IGVmeC0+cGh5X2RhdGE7CiAKIAlpZiAocGh5X2NmZy0+ZmxhZ3MgJiAoMSA8PCBNQ19DTURfR0VUX1BIWV9DRkdfQklTVF9MQk4pKSB7CiAJCWlmIChpbmRleCA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL21kaW9fMTBnLmMgYi9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuYwppbmRleCAwNTQ4ZmNiLi5lZWFmMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuYworKysgYi9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuYwpAQCAtNjMsNyArNjMsOCBAQAogCQkvKiBSZWFkIE1NRCBTVEFUVVMyIHRvIGNoZWNrIGl0IGlzIHJlc3BvbmRpbmcuICovCiAJCXN0YXR1cyA9IGVmeF9tZGlvX3JlYWQoZWZ4LCBtbWQsIE1ESU9fU1RBVDIpOwogCQlpZiAoKHN0YXR1cyAmIE1ESU9fU1RBVDJfREVWUFJTVCkgIT0gTURJT19TVEFUMl9ERVZQUlNUX1ZBTCkgewotCQkJRUZYX0VSUihlZngsICJQSFkgTU1EICVkIG5vdCByZXNwb25kaW5nLlxuIiwgbW1kKTsKKwkJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkJICAiUEhZIE1NRCAlZCBub3QgcmVzcG9uZGluZy5cbiIsIG1tZCk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KQEAgLTcyLDEyICs3MywxNCBAQAogCXN0YXR1cyA9IGVmeF9tZGlvX3JlYWQoZWZ4LCBtbWQsIE1ESU9fU1RBVDEpOwogCWlmIChzdGF0dXMgJiBNRElPX1NUQVQxX0ZBVUxUKSB7CiAJCWlmIChmYXVsdF9mYXRhbCkgewotCQkJRUZYX0VSUihlZngsICJQSFkgTU1EICVkIHJlcG9ydGluZyBmYXRhbCIKLQkJCQkiIGZhdWx0OiBzdGF0dXMgJXhcbiIsIG1tZCwgc3RhdHVzKTsKKwkJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkJICAiUEhZIE1NRCAlZCByZXBvcnRpbmcgZmF0YWwiCisJCQkJICAiIGZhdWx0OiBzdGF0dXMgJXhcbiIsIG1tZCwgc3RhdHVzKTsKIAkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UgewotCQkJRUZYX0xPRyhlZngsICJQSFkgTU1EICVkIHJlcG9ydGluZyBzdGF0dXMiCi0JCQkJIiAleCAoZXhwZWN0ZWQpXG4iLCBtbWQsIHN0YXR1cyk7CisJCQluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIlBIWSBNTUQgJWQgcmVwb3J0aW5nIHN0YXR1cyIKKwkJCQkgICIgJXggKGV4cGVjdGVkKVxuIiwgbW1kLCBzdGF0dXMpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMTAzLDggKzEwNiw5IEBACiAJCQlpZiAobWFzayAmIDEpIHsKIAkJCQlzdGF0ID0gZWZ4X21kaW9fcmVhZChlZngsIG1tZCwgTURJT19DVFJMMSk7CiAJCQkJaWYgKHN0YXQgPCAwKSB7Ci0JCQkJCUVGWF9FUlIoZWZ4LCAiZmFpbGVkIHRvIHJlYWQgc3RhdHVzIG9mIgotCQkJCQkJIiBNTUQgJWRcbiIsIG1tZCk7CisJCQkJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkJCQkgICJmYWlsZWQgdG8gcmVhZCBzdGF0dXMgb2YiCisJCQkJCQkgICIgTU1EICVkXG4iLCBtbWQpOwogCQkJCQlyZXR1cm4gLUVJTzsKIAkJCQl9CiAJCQkJaWYgKHN0YXQgJiBNRElPX0NUUkwxX1JFU0VUKQpAQCAtMTE5LDggKzEyMyw5IEBACiAJCW1zbGVlcChzcGludGltZSk7CiAJfQogCWlmIChpbl9yZXNldCAhPSAwKSB7Ci0JCUVGWF9FUlIoZWZ4LCAibm90IGFsbCBNTURzIGNhbWUgb3V0IG9mIHJlc2V0IGluIHRpbWUuIgotCQkJIiBNTURzIHN0aWxsIGluIHJlc2V0OiAleFxuIiwgaW5fcmVzZXQpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAibm90IGFsbCBNTURzIGNhbWUgb3V0IG9mIHJlc2V0IGluIHRpbWUuIgorCQkJICAiIE1NRHMgc3RpbGwgaW4gcmVzZXQ6ICV4XG4iLCBpbl9yZXNldCk7CiAJCXJjID0gLUVUSU1FRE9VVDsKIAl9CiAJcmV0dXJuIHJjOwpAQCAtMTQyLDE2ICsxNDcsMTggQEAKIAlkZXZzMSA9IGVmeF9tZGlvX3JlYWQoZWZ4LCBwcm9iZV9tbWQsIE1ESU9fREVWUzEpOwogCWRldnMyID0gZWZ4X21kaW9fcmVhZChlZngsIHByb2JlX21tZCwgTURJT19ERVZTMik7CiAJaWYgKGRldnMxIDwgMCB8fCBkZXZzMiA8IDApIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gcmVhZCBkZXZpY2VzIHByZXNlbnRcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAiZmFpbGVkIHRvIHJlYWQgZGV2aWNlcyBwcmVzZW50XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWRldmljZXMgPSBkZXZzMSB8IChkZXZzMiA8PCAxNik7CiAJaWYgKChkZXZpY2VzICYgbW1kX21hc2spICE9IG1tZF9tYXNrKSB7Ci0JCUVGWF9FUlIoZWZ4LCAicmVxdWlyZWQgTU1EcyBub3QgcHJlc2VudDogZ290ICV4LCAiCi0JCQkid2FudGVkICV4XG4iLCBkZXZpY2VzLCBtbWRfbWFzayk7CisJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJyZXF1aXJlZCBNTURzIG5vdCBwcmVzZW50OiBnb3QgJXgsIHdhbnRlZCAleFxuIiwKKwkJCSAgZGV2aWNlcywgbW1kX21hc2spOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JRUZYX1RSQUNFKGVmeCwgIkRldmljZXMgcHJlc2VudDogJXhcbiIsIGRldmljZXMpOworCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiRGV2aWNlcyBwcmVzZW50OiAleFxuIiwgZGV2aWNlcyk7CiAKIAkvKiBDaGVjayBhbGwgcmVxdWlyZWQgTU1EcyBhcmUgcmVzcG9uZGluZyBhbmQgaGFwcHkuICovCiAJd2hpbGUgKG1tZF9tYXNrKSB7CkBAIC0yMTksNyArMjI2LDcgQEAKIHsKIAlpbnQgc3RhdCA9IGVmeF9tZGlvX3JlYWQoZWZ4LCBtbWQsIE1ESU9fU1RBVDEpOwogCi0JRUZYX1RSQUNFKGVmeCwgIlNldHRpbmcgbG93IHBvd2VyIG1vZGUgZm9yIE1NRCAlZCB0byAlZFxuIiwKKwluZXRpZl92ZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJTZXR0aW5nIGxvdyBwb3dlciBtb2RlIGZvciBNTUQgJWQgdG8gJWRcbiIsCiAJCSAgbW1kLCBscG93ZXIpOwogCiAJaWYgKHN0YXQgJiBNRElPX1NUQVQxX0xQT1dFUkFCTEUpIHsKQEAgLTM0OSw4ICszNTYsOCBAQAogCiAJaWYgKChwaHlzaWQxID09IDB4MDAwMCkgfHwgKHBoeXNpZDEgPT0gMHhmZmZmKSB8fAogCSAgICAocGh5c2lkMiA9PSAweDAwMDApIHx8IChwaHlzaWQyID09IDB4ZmZmZikpIHsKLQkJRUZYX0VSUihlZngsICJubyBNRElPIFBIWSBwcmVzZW50IHdpdGggSUQgJWRcbiIsCi0JCQllZngtPm1kaW8ucHJ0YWQpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAibm8gTURJTyBQSFkgcHJlc2VudCB3aXRoIElEICVkXG4iLCBlZngtPm1kaW8ucHJ0YWQpOwogCQlyYyA9IC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJcmMgPSBlZnhfbWRpb19jaGVja19tbWRzKGVmeCwgZWZ4LT5tZGlvLm1tZHMsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL21kaW9fMTBnLmggYi9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuaAppbmRleCBmODllNzE5Li43NTc5MWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuaAorKysgYi9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuaApAQCAtNTEsNyArNTEsOCBAQAogCiAJc3luYyA9ICEhKGxhbmVfc3RhdHVzICYgTURJT19QSFlYU19MTlNUQVRfQUxJR04pOwogCWlmICghc3luYykKLQkJRUZYX0xPRyhlZngsICJYR1hTIGxhbmUgc3RhdHVzOiAleFxuIiwgbGFuZV9zdGF0dXMpOworCQluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiWEdYUyBsYW5lIHN0YXR1czogJXhcbiIsCisJCQkgIGxhbmVfc3RhdHVzKTsKIAlyZXR1cm4gc3luYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL210ZC5jIGIvZHJpdmVycy9uZXQvc2ZjL210ZC5jCmluZGV4IGYzYWM3ZjMuLjAyZTU0YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9tdGQuYworKysgYi9kcml2ZXJzL25ldC9zZmMvbXRkLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKLSNkZWZpbmUgRUZYX0RSSVZFUl9OQU1FICJzZmNfbXRkIgogI2luY2x1ZGUgIm5ldF9kcml2ZXIuaCIKICNpbmNsdWRlICJzcGkuaCIKICNpbmNsdWRlICJlZnguaCIKQEAgLTcxLDggKzcwLDEwIEBACiAKIC8qIFNQSSB1dGlsaXRpZXMgKi8KIAotc3RhdGljIGludCBlZnhfc3BpX3Nsb3dfd2FpdChzdHJ1Y3QgZWZ4X210ZCAqZWZ4X210ZCwgYm9vbCB1bmludGVycnVwdGlibGUpCitzdGF0aWMgaW50CitlZnhfc3BpX3Nsb3dfd2FpdChzdHJ1Y3QgZWZ4X210ZF9wYXJ0aXRpb24gKnBhcnQsIGJvb2wgdW5pbnRlcnJ1cHRpYmxlKQogeworCXN0cnVjdCBlZnhfbXRkICplZnhfbXRkID0gcGFydC0+bXRkLnByaXY7CiAJY29uc3Qgc3RydWN0IGVmeF9zcGlfZGV2aWNlICpzcGkgPSBlZnhfbXRkLT5zcGk7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGVmeF9tdGQtPmVmeDsKIAl1OCBzdGF0dXM7CkBAIC05Miw3ICs5Myw3IEBACiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQotCUVGWF9FUlIoZWZ4LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yICVzXG4iLCBlZnhfbXRkLT5uYW1lKTsKKwlwcl9lcnIoIiVzOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgJXNcbiIsIHBhcnQtPm5hbWUsIGVmeF9tdGQtPm5hbWUpOwogCXJldHVybiAtRVRJTUVET1VUOwogfQogCkBAIC0xMzEsOCArMTMyLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZWZ4X3NwaV9lcmFzZShzdHJ1Y3QgZWZ4X210ZCAqZWZ4X210ZCwgbG9mZl90IHN0YXJ0LCBzaXplX3QgbGVuKQorc3RhdGljIGludAorZWZ4X3NwaV9lcmFzZShzdHJ1Y3QgZWZ4X210ZF9wYXJ0aXRpb24gKnBhcnQsIGxvZmZfdCBzdGFydCwgc2l6ZV90IGxlbikKIHsKKwlzdHJ1Y3QgZWZ4X210ZCAqZWZ4X210ZCA9IHBhcnQtPm10ZC5wcml2OwogCWNvbnN0IHN0cnVjdCBlZnhfc3BpX2RldmljZSAqc3BpID0gZWZ4X210ZC0+c3BpOwogCXN0cnVjdCBlZnhfbmljICplZnggPSBlZnhfbXRkLT5lZng7CiAJdW5zaWduZWQgcG9zLCBibG9ja19sZW47CkBAIC0xNTYsNyArMTU5LDcgQEAKIAkJCSAgICBOVUxMLCAwKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IGVmeF9zcGlfc2xvd193YWl0KGVmeF9tdGQsIGZhbHNlKTsKKwlyYyA9IGVmeF9zcGlfc2xvd193YWl0KHBhcnQsIGZhbHNlKTsKIAogCS8qIFZlcmlmeSB0aGUgZW50aXJlIHJlZ2lvbiBoYXMgYmVlbiB3aXBlZCAqLwogCW1lbXNldChlbXB0eSwgMHhmZiwgc2l6ZW9mKGVtcHR5KSk7CkBAIC0xOTgsMTMgKzIwMSwxNCBAQAogCiBzdGF0aWMgdm9pZCBlZnhfbXRkX3N5bmMoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CisJc3RydWN0IGVmeF9tdGRfcGFydGl0aW9uICpwYXJ0ID0gdG9fZWZ4X210ZF9wYXJ0aXRpb24obXRkKTsKIAlzdHJ1Y3QgZWZ4X210ZCAqZWZ4X210ZCA9IG10ZC0+cHJpdjsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gZWZ4X210ZC0+ZWZ4OwogCWludCByYzsKIAogCXJjID0gZWZ4X210ZC0+b3BzLT5zeW5jKG10ZCk7CiAJaWYgKHJjKQotCQlFRlhfRVJSKGVmeCwgIiVzIHN5bmMgZmFpbGVkICglZClcbiIsIGVmeF9tdGQtPm5hbWUsIHJjKTsKKwkJcHJfZXJyKCIlczogJXMgc3luYyBmYWlsZWQgKCVkKVxuIiwKKwkJICAgICAgIHBhcnQtPm5hbWUsIGVmeF9tdGQtPm5hbWUsIHJjKTsKIH0KIAogc3RhdGljIHZvaWQgZWZ4X210ZF9yZW1vdmVfcGFydGl0aW9uKHN0cnVjdCBlZnhfbXRkX3BhcnRpdGlvbiAqcGFydCkKQEAgLTMzOCw3ICszNDIsNyBAQAogCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZlZngtPnNwaV9sb2NrKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IGVmeF9zcGlfZXJhc2UoZWZ4X210ZCwgcGFydC0+b2Zmc2V0ICsgc3RhcnQsIGxlbik7CisJcmMgPSBlZnhfc3BpX2VyYXNlKHBhcnQsIHBhcnQtPm9mZnNldCArIHN0YXJ0LCBsZW4pOwogCW11dGV4X3VubG9jaygmZWZ4LT5zcGlfbG9jayk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMzYzLDEyICszNjcsMTMgQEAKIAogc3RhdGljIGludCBmYWxjb25fbXRkX3N5bmMoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CisJc3RydWN0IGVmeF9tdGRfcGFydGl0aW9uICpwYXJ0ID0gdG9fZWZ4X210ZF9wYXJ0aXRpb24obXRkKTsKIAlzdHJ1Y3QgZWZ4X210ZCAqZWZ4X210ZCA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gZWZ4X210ZC0+ZWZ4OwogCWludCByYzsKIAogCW11dGV4X2xvY2soJmVmeC0+c3BpX2xvY2spOwotCXJjID0gZWZ4X3NwaV9zbG93X3dhaXQoZWZ4X210ZCwgdHJ1ZSk7CisJcmMgPSBlZnhfc3BpX3Nsb3dfd2FpdChwYXJ0LCB0cnVlKTsKIAltdXRleF91bmxvY2soJmVmeC0+c3BpX2xvY2spOwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9uZXRfZHJpdmVyLmggYi9kcml2ZXJzL25ldC9zZmMvbmV0X2RyaXZlci5oCmluZGV4IDQ3NjJjOTEuLjY0ZTdjYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9uZXRfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL25ldF9kcml2ZXIuaApAQCAtMTMsMTEgKzEzLDE2IEBACiAjaWZuZGVmIEVGWF9ORVRfRFJJVkVSX0gKICNkZWZpbmUgRUZYX05FVF9EUklWRVJfSAogCisjaWYgZGVmaW5lZChFRlhfRU5BQkxFX0RFQlVHKSAmJiAhZGVmaW5lZChERUJVRykKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21kaW8uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC0zNCw5ICszOSw3IEBACiAgKiBCdWlsZCBkZWZpbml0aW9ucwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgRUZYX0RSSVZFUl9OQU1FCi0jZGVmaW5lIEVGWF9EUklWRVJfTkFNRQkic2ZjIgotI2VuZGlmCisKICNkZWZpbmUgRUZYX0RSSVZFUl9WRVJTSU9OCSIzLjAiCiAKICNpZmRlZiBFRlhfRU5BQkxFX0RFQlVHCkBAIC00NywzNSArNTAsNiBAQAogI2RlZmluZSBFRlhfV0FSTl9PTl9QQVJBTk9JRCh4KSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0vKiBVbi1yYXRlLWxpbWl0ZWQgbG9nZ2luZyAqLwotI2RlZmluZSBFRlhfRVJSKGVmeCwgZm10LCBhcmdzLi4uKSBcCi1kZXZfZXJyKCYoKGVmeCktPnBjaV9kZXYtPmRldiksICJFUlI6ICVzICIgZm10LCBlZnhfZGV2X25hbWUoZWZ4KSwgIyNhcmdzKQotCi0jZGVmaW5lIEVGWF9JTkZPKGVmeCwgZm10LCBhcmdzLi4uKSBcCi1kZXZfaW5mbygmKChlZngpLT5wY2lfZGV2LT5kZXYpLCAiSU5GTzogJXMgIiBmbXQsIGVmeF9kZXZfbmFtZShlZngpLCAjI2FyZ3MpCi0KLSNpZmRlZiBFRlhfRU5BQkxFX0RFQlVHCi0jZGVmaW5lIEVGWF9MT0coZWZ4LCBmbXQsIGFyZ3MuLi4pIFwKLWRldl9pbmZvKCYoKGVmeCktPnBjaV9kZXYtPmRldiksICJEQkc6ICVzICIgZm10LCBlZnhfZGV2X25hbWUoZWZ4KSwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRUZYX0xPRyhlZngsIGZtdCwgYXJncy4uLikgXAotZGV2X2RiZygmKChlZngpLT5wY2lfZGV2LT5kZXYpLCAiREJHOiAlcyAiIGZtdCwgZWZ4X2Rldl9uYW1lKGVmeCksICMjYXJncykKLSNlbmRpZgotCi0jZGVmaW5lIEVGWF9UUkFDRShlZngsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi0KLSNkZWZpbmUgRUZYX1JFR0RVTVAoZWZ4LCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotCi0vKiBSYXRlLWxpbWl0ZWQgbG9nZ2luZyAqLwotI2RlZmluZSBFRlhfRVJSX1JMKGVmeCwgZm10LCBhcmdzLi4uKSBcCi1kbyB7aWYgKG5ldF9yYXRlbGltaXQoKSkgRUZYX0VSUihlZngsIGZtdCwgIyNhcmdzKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBFRlhfSU5GT19STChlZngsIGZtdCwgYXJncy4uLikgXAotZG8ge2lmIChuZXRfcmF0ZWxpbWl0KCkpIEVGWF9JTkZPKGVmeCwgZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEVGWF9MT0dfUkwoZWZ4LCBmbXQsIGFyZ3MuLi4pIFwKLWRvIHtpZiAobmV0X3JhdGVsaW1pdCgpKSBFRlhfTE9HKGVmeCwgZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBFZnggZGF0YSBzdHJ1Y3R1cmVzCkBAIC0yMjEsNyArMTk1LDYgQEAKICAqCUlmIGJvdGggdGhpcyBhbmQgc2tiIGFyZSAlTlVMTCwgdGhlIGJ1ZmZlciBzbG90IGlzIGN1cnJlbnRseSBmcmVlLgogICogQGRhdGE6IFBvaW50ZXIgdG8gZXRoZXJuZXQgaGVhZGVyCiAgKiBAbGVuOiBCdWZmZXIgbGVuZ3RoLCBpbiBieXRlcy4KLSAqIEB1bm1hcF9hZGRyOiBETUEgYWRkcmVzcyB0byB1bm1hcAogICovCiBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciB7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKQEAgLTIyOSw3ICsyMDIsMjQgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAljaGFyICpkYXRhOwogCXVuc2lnbmVkIGludCBsZW47Ci0JZG1hX2FkZHJfdCB1bm1hcF9hZGRyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZWZ4X3J4X3BhZ2Vfc3RhdGUgLSBQYWdlLWJhc2VkIHJ4IGJ1ZmZlciBzdGF0ZQorICoKKyAqIEluc2VydGVkIGF0IHRoZSBzdGFydCBvZiBldmVyeSBwYWdlIGFsbG9jYXRlZCBmb3IgcmVjZWl2ZSBidWZmZXJzLgorICogVXNlZCB0byBmYWNpbGl0YXRlIHNoYXJpbmcgZG1hIG1hcHBpbmdzIGJldHdlZW4gcmVjeWNsZWQgcnggYnVmZmVycworICogYW5kIHRob3NlIHBhc3NlZCB1cCB0byB0aGUga2VybmVsLgorICoKKyAqIEByZWZjbnQ6IE51bWJlciBvZiBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlcidzIHJlZmVyZW5jaW5nIHRoaXMgcGFnZS4KKyAqCVdoZW4gcmVmY250IGZhbGxzIHRvIHplcm8sIHRoZSBwYWdlIGlzIHVubWFwcGVkIGZvciBkbWEKKyAqIEBkbWFfYWRkcjogVGhlIGRtYSBhZGRyZXNzIG9mIHRoaXMgcGFnZS4KKyAqLworc3RydWN0IGVmeF9yeF9wYWdlX3N0YXRlIHsKKwl1bnNpZ25lZCByZWZjbnQ7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXVuc2lnbmVkIGludCBfX3BhZFswXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiB9OwogCiAvKioKQEAgLTI0MiwxMCArMjMyLDYgQEAKICAqIEBhZGRlZF9jb3VudDogTnVtYmVyIG9mIGJ1ZmZlcnMgYWRkZWQgdG8gdGhlIHJlY2VpdmUgcXVldWUuCiAgKiBAbm90aWZpZWRfY291bnQ6IE51bWJlciBvZiBidWZmZXJzIGdpdmVuIHRvIE5JQyAoPD0gQGFkZGVkX2NvdW50KS4KICAqIEByZW1vdmVkX2NvdW50OiBOdW1iZXIgb2YgYnVmZmVycyByZW1vdmVkIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuCi0gKiBAYWRkX2xvY2s6IFJlY2VpdmUgcXVldWUgZGVzY3JpcHRvciBhZGQgc3BpbiBsb2NrLgotICoJVGhpcyBsb2NrIG11c3QgYmUgaGVsZCBpbiBvcmRlciB0byBhZGQgYnVmZmVycyB0byB0aGUgUlgKLSAqCWRlc2NyaXB0b3IgcmluZyAocnhkIGFuZCBidWZmZXIpIGFuZCB0byB1cGRhdGUgYWRkZWRfY291bnQgKGJ1dAotICoJbm90IHJlbW92ZWRfY291bnQpLgogICogQG1heF9maWxsOiBSWCBkZXNjcmlwdG9yIG1heGltdW0gZmlsbCBsZXZlbCAoPD0gcmluZyBzaXplKQogICogQGZhc3RfZmlsbF90cmlnZ2VyOiBSWCBkZXNjcmlwdG9yIGZpbGwgbGV2ZWwgdGhhdCB3aWxsIHRyaWdnZXIgYSBmYXN0IGZpbGwKICAqCSg8PSBAbWF4X2ZpbGwpCkBAIC0yNTksMTIgKzI0NSw3IEBACiAgKglvdmVyZmxvdyB3YXMgb2JzZXJ2ZWQuICBJdCBzaG91bGQgbmV2ZXIgYmUgc2V0LgogICogQGFsbG9jX3BhZ2VfY291bnQ6IFJYIGFsbG9jYXRpb24gc3RyYXRlZ3kgY291bnRlci4KICAqIEBhbGxvY19za2JfY291bnQ6IFJYIGFsbG9jYXRpb24gc3RyYXRlZ3kgY291bnRlci4KLSAqIEB3b3JrOiBEZXNjcmlwdG9yIHB1c2ggd29yayB0aHJlYWQKLSAqIEBidWZfcGFnZTogUGFnZSBmb3IgbmV4dCBSWCBidWZmZXIuCi0gKglXZSBjYW4gdXNlIGEgc2luZ2xlIHBhZ2UgZm9yIG11bHRpcGxlIFJYIGJ1ZmZlcnMuIFRoaXMgdHJhY2tzCi0gKgl0aGUgcmVtYWluaW5nIHNwYWNlIGluIHRoZSBhbGxvY2F0aW9uLgotICogQGJ1Zl9kbWFfYWRkcjogUGFnZSdzIERNQSBhZGRyZXNzLgotICogQGJ1Zl9kYXRhOiBQYWdlJ3MgaG9zdCBhZGRyZXNzLgorICogQHNsb3dfZmlsbDogVGltZXIgdXNlZCB0byBkZWZlciBlZnhfbmljX2dlbmVyYXRlX2ZpbGxfZXZlbnQoKS4KICAqIEBmbHVzaGVkOiBVc2Ugd2hlbiBoYW5kbGluZyBxdWV1ZSBmbHVzaGluZwogICovCiBzdHJ1Y3QgZWZ4X3J4X3F1ZXVlIHsKQEAgLTI3Nyw3ICsyNTgsNiBAQAogCWludCBhZGRlZF9jb3VudDsKIAlpbnQgbm90aWZpZWRfY291bnQ7CiAJaW50IHJlbW92ZWRfY291bnQ7Ci0Jc3BpbmxvY2tfdCBhZGRfbG9jazsKIAl1bnNpZ25lZCBpbnQgbWF4X2ZpbGw7CiAJdW5zaWduZWQgaW50IGZhc3RfZmlsbF90cmlnZ2VyOwogCXVuc2lnbmVkIGludCBmYXN0X2ZpbGxfbGltaXQ7CkBAIC0yODUsMTIgKzI2NSw5IEBACiAJdW5zaWduZWQgaW50IG1pbl9vdmVyZmlsbDsKIAl1bnNpZ25lZCBpbnQgYWxsb2NfcGFnZV9jb3VudDsKIAl1bnNpZ25lZCBpbnQgYWxsb2Nfc2tiX2NvdW50OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzbG93X2ZpbGw7CiAJdW5zaWduZWQgaW50IHNsb3dfZmlsbF9jb3VudDsKIAotCXN0cnVjdCBwYWdlICpidWZfcGFnZTsKLQlkbWFfYWRkcl90IGJ1Zl9kbWFfYWRkcjsKLQljaGFyICpidWZfZGF0YTsKIAllbnVtIGVmeF9mbHVzaF9zdGF0ZSBmbHVzaGVkOwogfTsKIApAQCAtMzM2LDcgKzMxMyw3IEBACiAgKiBAZXZlbnRxOiBFdmVudCBxdWV1ZSBidWZmZXIKICAqIEBldmVudHFfcmVhZF9wdHI6IEV2ZW50IHF1ZXVlIHJlYWQgcG9pbnRlcgogICogQGxhc3RfZXZlbnRxX3JlYWRfcHRyOiBMYXN0IGV2ZW50IHF1ZXVlIHJlYWQgcG9pbnRlciB2YWx1ZS4KLSAqIEBldmVudHFfbWFnaWM6IEV2ZW50IHF1ZXVlIG1hZ2ljIHZhbHVlIGZvciBkcml2ZXItZ2VuZXJhdGVkIHRlc3QgZXZlbnRzCisgKiBAbWFnaWNfY291bnQ6IEV2ZW50IHF1ZXVlIHRlc3QgZXZlbnQgY291bnQKICAqIEBpcnFfY291bnQ6IE51bWJlciBvZiBJUlFzIHNpbmNlIGxhc3QgYWRhcHRpdmUgbW9kZXJhdGlvbiBkZWNpc2lvbgogICogQGlycV9tb2Rfc2NvcmU6IElSUSBtb2RlcmF0aW9uIHNjb3JlCiAgKiBAcnhfYWxsb2NfbGV2ZWw6IFdhdGVybWFyayBiYXNlZCBoZXVyaXN0aWMgY291bnRlciBmb3IgcHVzaGluZyBkZXNjcmlwdG9ycwpAQCAtMzY3LDcgKzM0NCw3IEBACiAJc3RydWN0IGVmeF9zcGVjaWFsX2J1ZmZlciBldmVudHE7CiAJdW5zaWduZWQgaW50IGV2ZW50cV9yZWFkX3B0cjsKIAl1bnNpZ25lZCBpbnQgbGFzdF9ldmVudHFfcmVhZF9wdHI7Ci0JdW5zaWduZWQgaW50IGV2ZW50cV9tYWdpYzsKKwl1bnNpZ25lZCBpbnQgbWFnaWNfY291bnQ7CiAKIAl1bnNpZ25lZCBpbnQgaXJxX2NvdW50OwogCXVuc2lnbmVkIGludCBpcnFfbW9kX3Njb3JlOwpAQCAtNjU4LDYgKzYzNSw3IEBACiAgKiBAaW50ZXJydXB0X21vZGU6IEludGVycnVwdCBtb2RlCiAgKiBAaXJxX3J4X2FkYXB0aXZlOiBBZGFwdGl2ZSBJUlEgbW9kZXJhdGlvbiBlbmFibGVkIGZvciBSWCBldmVudCBxdWV1ZXMKICAqIEBpcnFfcnhfbW9kZXJhdGlvbjogSVJRIG1vZGVyYXRpb24gdGltZSBmb3IgUlggZXZlbnQgcXVldWVzCisgKiBAbXNnX2VuYWJsZTogTG9nIG1lc3NhZ2UgZW5hYmxlIGZsYWdzCiAgKiBAc3RhdGU6IERldmljZSBzdGF0ZSBmbGFnLiBTZXJpYWxpc2VkIGJ5IHRoZSBydG5sX2xvY2suCiAgKiBAcmVzZXRfcGVuZGluZzogUGVuZGluZyByZXNldCBtZXRob2QgKG5vcm1hbGx5IFJFU0VUX1RZUEVfTk9ORSkKICAqIEB0eF9xdWV1ZTogVFggRE1BIHF1ZXVlcwpAQCAtNjY5LDYgKzY0Nyw3IEBACiAgKiBAbl90eF9jaGFubmVsczogTnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgZm9yIFRYCiAgKiBAcnhfYnVmZmVyX2xlbjogUlggYnVmZmVyIGxlbmd0aAogICogQHJ4X2J1ZmZlcl9vcmRlcjogT3JkZXIgKGxvZzIpIG9mIG51bWJlciBvZiBwYWdlcyBmb3IgZWFjaCBSWCBidWZmZXIKKyAqIEByeF9pbmRpcl90YWJsZTogSW5kaXJlY3Rpb24gdGFibGUgZm9yIFJTUwogICogQGludF9lcnJvcl9jb3VudDogTnVtYmVyIG9mIGludGVybmFsIGVycm9ycyBzZWVuIHJlY2VudGx5CiAgKiBAaW50X2Vycm9yX2V4cGlyZTogVGltZSBhdCB3aGljaCBlcnJvciBjb3VudCB3aWxsIGJlIGV4cGlyZWQKICAqIEBpcnFfc3RhdHVzOiBJbnRlcnJ1cHQgc3RhdHVzIGJ1ZmZlcgpAQCAtNzQwLDYgKzcxOSw3IEBACiAJZW51bSBlZnhfaW50X21vZGUgaW50ZXJydXB0X21vZGU7CiAJYm9vbCBpcnFfcnhfYWRhcHRpdmU7CiAJdW5zaWduZWQgaW50IGlycV9yeF9tb2RlcmF0aW9uOworCXUzMiBtc2dfZW5hYmxlOwogCiAJZW51bSBuaWNfc3RhdGUgc3RhdGU7CiAJZW51bSByZXNldF90eXBlIHJlc2V0X3BlbmRpbmc7CkBAIC03NTQsNiArNzM0LDggQEAKIAl1bnNpZ25lZCBuX3R4X2NoYW5uZWxzOwogCXVuc2lnbmVkIGludCByeF9idWZmZXJfbGVuOwogCXVuc2lnbmVkIGludCByeF9idWZmZXJfb3JkZXI7CisJdTggcnhfaGFzaF9rZXlbNDBdOworCXUzMiByeF9pbmRpcl90YWJsZVsxMjhdOwogCiAJdW5zaWduZWQgaW50X2Vycm9yX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgaW50X2Vycm9yX2V4cGlyZTsKQEAgLTg2Niw3ICs4NDgsOCBAQAogICogQGV2cV9wdHJfdGJsX2Jhc2U6IEV2ZW50IHF1ZXVlIHBvaW50ZXIgdGFibGUgYmFzZSBhZGRyZXNzCiAgKiBAZXZxX3JwdHJfdGJsX2Jhc2U6IEV2ZW50IHF1ZXVlIHJlYWQtcG9pbnRlciB0YWJsZSBiYXNlIGFkZHJlc3MKICAqIEBtYXhfZG1hX21hc2s6IE1heGltdW0gcG9zc2libGUgRE1BIG1hc2sKLSAqIEByeF9idWZmZXJfcGFkZGluZzogUGFkZGluZyBhZGRlZCB0byBlYWNoIFJYIGJ1ZmZlcgorICogQHJ4X2J1ZmZlcl9oYXNoX3NpemU6IFNpemUgb2YgaGFzaCBhdCBzdGFydCBvZiBSWCBidWZmZXIKKyAqIEByeF9idWZmZXJfcGFkZGluZzogU2l6ZSBvZiBwYWRkaW5nIGF0IGVuZCBvZiBSWCBidWZmZXIKICAqIEBtYXhfaW50ZXJydXB0X21vZGU6IEhpZ2hlc3QgY2FwYWJpbGl0eSBpbnRlcnJ1cHQgbW9kZSBzdXBwb3J0ZWQKICAqCWZyb20gJmVudW0gZWZ4X2luaXRfbW9kZS4KICAqIEBwaHlzX2FkZHJfY2hhbm5lbHM6IE51bWJlciBvZiBjaGFubmVscyB3aXRoIHBoeXNpY2FsbHkgYWRkcmVzc2VkCkBAIC05MTAsNiArODkzLDcgQEAKIAl1bnNpZ25lZCBpbnQgZXZxX3B0cl90YmxfYmFzZTsKIAl1bnNpZ25lZCBpbnQgZXZxX3JwdHJfdGJsX2Jhc2U7CiAJdTY0IG1heF9kbWFfbWFzazsKKwl1bnNpZ25lZCBpbnQgcnhfYnVmZmVyX2hhc2hfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgcnhfYnVmZmVyX3BhZGRpbmc7CiAJdW5zaWduZWQgaW50IG1heF9pbnRlcnJ1cHRfbW9kZTsKIAl1bnNpZ25lZCBpbnQgcGh5c19hZGRyX2NoYW5uZWxzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL25pYy5jIGIvZHJpdmVycy9uZXQvc2ZjL25pYy5jCmluZGV4IDVkM2FhZWMuLmY1OTVkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9uaWMuYworKysgYi9kcml2ZXJzL25ldC9zZmMvbmljLmMKQEAgLTc5LDYgKzc5LDE0IEBACiAvKiBEZXB0aCBvZiBSWCBmbHVzaCByZXF1ZXN0IGZpZm8gKi8KICNkZWZpbmUgRUZYX1JYX0ZMVVNIX0NPVU5UIDQKIAorLyogR2VuZXJhdGVkIGV2ZW50IGNvZGUgZm9yIGVmeF9nZW5lcmF0ZV90ZXN0X2V2ZW50KCkgKi8KKyNkZWZpbmUgRUZYX0NIQU5ORUxfTUFHSUNfVEVTVChfY2hhbm5lbCkJXAorCSgweDAwMDEwMTAwICsgKF9jaGFubmVsKS0+Y2hhbm5lbCkKKworLyogR2VuZXJhdGVkIGV2ZW50IGNvZGUgZm9yIGVmeF9nZW5lcmF0ZV9maWxsX2V2ZW50KCkgKi8KKyNkZWZpbmUgRUZYX0NIQU5ORUxfTUFHSUNfRklMTChfY2hhbm5lbCkJXAorCSgweDAwMDEwMjAwICsgKF9jaGFubmVsKS0+Y2hhbm5lbCkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU29sYXJzdG9ybSBoYXJkd2FyZSBhY2Nlc3MKQEAgLTE3MSw5ICsxNzksMTAgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlFRlhfRVJSKGVmeCwgIndyb3RlICJFRlhfT1dPUkRfRk1UIiByZWFkICJFRlhfT1dPUkRfRk1UCi0JCSIgYXQgYWRkcmVzcyAweCV4IG1hc2sgIkVGWF9PV09SRF9GTVQiXG4iLCBFRlhfT1dPUkRfVkFMKHJlZyksCi0JCUVGWF9PV09SRF9WQUwoYnVmKSwgYWRkcmVzcywgRUZYX09XT1JEX1ZBTChtYXNrKSk7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJICAid3JvdGUgIkVGWF9PV09SRF9GTVQiIHJlYWQgIkVGWF9PV09SRF9GTVQKKwkJICAiIGF0IGFkZHJlc3MgMHgleCBtYXNrICJFRlhfT1dPUkRfRk1UIlxuIiwgRUZYX09XT1JEX1ZBTChyZWcpLAorCQkgIEVGWF9PV09SRF9WQUwoYnVmKSwgYWRkcmVzcywgRUZYX09XT1JEX1ZBTChtYXNrKSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTIwNiw4ICsyMTUsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBidWZmZXItPmVudHJpZXM7IGkrKykgewogCQlpbmRleCA9IGJ1ZmZlci0+aW5kZXggKyBpOwogCQlkbWFfYWRkciA9IGJ1ZmZlci0+ZG1hX2FkZHIgKyAoaSAqIDQwOTYpOwotCQlFRlhfTE9HKGVmeCwgIm1hcHBpbmcgc3BlY2lhbCBidWZmZXIgJWQgYXQgJWxseFxuIiwKLQkJCWluZGV4LCAodW5zaWduZWQgbG9uZyBsb25nKWRtYV9hZGRyKTsKKwkJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgIm1hcHBpbmcgc3BlY2lhbCBidWZmZXIgJWQgYXQgJWxseFxuIiwKKwkJCSAgaW5kZXgsICh1bnNpZ25lZCBsb25nIGxvbmcpZG1hX2FkZHIpOwogCQlFRlhfUE9QVUxBVEVfUVdPUkRfMyhidWZfZGVzYywKIAkJCQkgICAgIEZSRl9BWl9CVUZfQURSX1JFR0lPTiwgMCwKIAkJCQkgICAgIEZSRl9BWl9CVUZfQURSX0ZCVUYsIGRtYV9hZGRyID4+IDEyLApAQCAtMjI3LDggKzIzNyw4IEBACiAJaWYgKCFidWZmZXItPmVudHJpZXMpCiAJCXJldHVybjsKIAotCUVGWF9MT0coZWZ4LCAidW5tYXBwaW5nIHNwZWNpYWwgYnVmZmVycyAlZC0lZFxuIiwKLQkJYnVmZmVyLT5pbmRleCwgYnVmZmVyLT5pbmRleCArIGJ1ZmZlci0+ZW50cmllcyAtIDEpOworCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJ1bm1hcHBpbmcgc3BlY2lhbCBidWZmZXJzICVkLSVkXG4iLAorCQkgIGJ1ZmZlci0+aW5kZXgsIGJ1ZmZlci0+aW5kZXggKyBidWZmZXItPmVudHJpZXMgLSAxKTsKIAogCUVGWF9QT1BVTEFURV9PV09SRF80KGJ1Zl90YmxfdXBkLAogCQkJICAgICBGUkZfQVpfQlVGX1VQRF9DTUQsIDAsCkBAIC0yNjgsMTEgKzI3OCwxMiBAQAogCWJ1ZmZlci0+aW5kZXggPSBlZngtPm5leHRfYnVmZmVyX3RhYmxlOwogCWVmeC0+bmV4dF9idWZmZXJfdGFibGUgKz0gYnVmZmVyLT5lbnRyaWVzOwogCi0JRUZYX0xPRyhlZngsICJhbGxvY2F0aW5nIHNwZWNpYWwgYnVmZmVycyAlZC0lZCBhdCAlbGx4KyV4ICIKLQkJIih2aXJ0ICVwIHBoeXMgJWxseClcbiIsIGJ1ZmZlci0+aW5kZXgsCi0JCWJ1ZmZlci0+aW5kZXggKyBidWZmZXItPmVudHJpZXMgLSAxLAotCQkodTY0KWJ1ZmZlci0+ZG1hX2FkZHIsIGxlbiwKLQkJYnVmZmVyLT5hZGRyLCAodTY0KXZpcnRfdG9fcGh5cyhidWZmZXItPmFkZHIpKTsKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkgICJhbGxvY2F0aW5nIHNwZWNpYWwgYnVmZmVycyAlZC0lZCBhdCAlbGx4KyV4ICIKKwkJICAiKHZpcnQgJXAgcGh5cyAlbGx4KVxuIiwgYnVmZmVyLT5pbmRleCwKKwkJICBidWZmZXItPmluZGV4ICsgYnVmZmVyLT5lbnRyaWVzIC0gMSwKKwkJICAodTY0KWJ1ZmZlci0+ZG1hX2FkZHIsIGxlbiwKKwkJICBidWZmZXItPmFkZHIsICh1NjQpdmlydF90b19waHlzKGJ1ZmZlci0+YWRkcikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODMsMTEgKzI5NCwxMiBAQAogCWlmICghYnVmZmVyLT5hZGRyKQogCQlyZXR1cm47CiAKLQlFRlhfTE9HKGVmeCwgImRlYWxsb2NhdGluZyBzcGVjaWFsIGJ1ZmZlcnMgJWQtJWQgYXQgJWxseCsleCAiCi0JCSIodmlydCAlcCBwaHlzICVsbHgpXG4iLCBidWZmZXItPmluZGV4LAotCQlidWZmZXItPmluZGV4ICsgYnVmZmVyLT5lbnRyaWVzIC0gMSwKLQkJKHU2NClidWZmZXItPmRtYV9hZGRyLCBidWZmZXItPmxlbiwKLQkJYnVmZmVyLT5hZGRyLCAodTY0KXZpcnRfdG9fcGh5cyhidWZmZXItPmFkZHIpKTsKKwluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICJkZWFsbG9jYXRpbmcgc3BlY2lhbCBidWZmZXJzICVkLSVkIGF0ICVsbHgrJXggIgorCQkgICIodmlydCAlcCBwaHlzICVsbHgpXG4iLCBidWZmZXItPmluZGV4LAorCQkgIGJ1ZmZlci0+aW5kZXggKyBidWZmZXItPmVudHJpZXMgLSAxLAorCQkgICh1NjQpYnVmZmVyLT5kbWFfYWRkciwgYnVmZmVyLT5sZW4sCisJCSAgYnVmZmVyLT5hZGRyLCAodTY0KXZpcnRfdG9fcGh5cyhidWZmZXItPmFkZHIpKTsKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQoZWZ4LT5wY2lfZGV2LCBidWZmZXItPmxlbiwgYnVmZmVyLT5hZGRyLAogCQkJICAgIGJ1ZmZlci0+ZG1hX2FkZHIpOwpAQCAtNTQ3LDkgKzU1OSwxMCBAQAogCWJvb2wgaXNfYjAgPSBlZnhfbmljX3JldihlZngpID49IEVGWF9SRVZfRkFMQ09OX0IwOwogCWJvb2wgaXNjc2lfZGlnZXN0X2VuID0gaXNfYjA7CiAKLQlFRlhfTE9HKGVmeCwgIlJYIHF1ZXVlICVkIHJpbmcgaW4gc3BlY2lhbCBidWZmZXJzICVkLSVkXG4iLAotCQlyeF9xdWV1ZS0+cXVldWUsIHJ4X3F1ZXVlLT5yeGQuaW5kZXgsCi0JCXJ4X3F1ZXVlLT5yeGQuaW5kZXggKyByeF9xdWV1ZS0+cnhkLmVudHJpZXMgLSAxKTsKKwluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkgICJSWCBxdWV1ZSAlZCByaW5nIGluIHNwZWNpYWwgYnVmZmVycyAlZC0lZFxuIiwKKwkJICByeF9xdWV1ZS0+cXVldWUsIHJ4X3F1ZXVlLT5yeGQuaW5kZXgsCisJCSAgcnhfcXVldWUtPnJ4ZC5pbmRleCArIHJ4X3F1ZXVlLT5yeGQuZW50cmllcyAtIDEpOwogCiAJcnhfcXVldWUtPmZsdXNoZWQgPSBGTFVTSF9OT05FOwogCkBAIC02ODYsOSArNjk5LDEwIEBACiAJCSAgIEVGWF9XT1JLQVJPVU5EXzEwNzI3KGVmeCkpIHsKIAkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9UWF9ERVNDX0ZFVENIKTsKIAl9IGVsc2UgewotCQlFRlhfRVJSKGVmeCwgImNoYW5uZWwgJWQgdW5leHBlY3RlZCBUWCBldmVudCAiCi0JCQlFRlhfUVdPUkRfRk1UIlxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwKLQkJCUVGWF9RV09SRF9WQUwoKmV2ZW50KSk7CisJCW5ldGlmX2VycihlZngsIHR4X2VyciwgZWZ4LT5uZXRfZGV2LAorCQkJICAiY2hhbm5lbCAlZCB1bmV4cGVjdGVkIFRYIGV2ZW50ICIKKwkJCSAgRUZYX1FXT1JEX0ZNVCJcbiIsIGNoYW5uZWwtPmNoYW5uZWwsCisJCQkgIEVGWF9RV09SRF9WQUwoKmV2ZW50KSk7CiAJfQogCiAJcmV0dXJuIHR4X3BhY2tldHM7CkBAIC03NTEsMjAgKzc2NSwyMSBAQAogCSAqIHRvIGEgRklGTyBvdmVyZmxvdy4KIAkgKi8KICNpZmRlZiBFRlhfRU5BQkxFX0RFQlVHCi0JaWYgKHJ4X2V2X290aGVyX2VycikgewotCQlFRlhfSU5GT19STChlZngsICIgUlggcXVldWUgJWQgdW5leHBlY3RlZCBSWCBldmVudCAiCi0JCQkgICAgRUZYX1FXT1JEX0ZNVCAiJXMlcyVzJXMlcyVzJXMlc1xuIiwKLQkJCSAgICByeF9xdWV1ZS0+cXVldWUsIEVGWF9RV09SRF9WQUwoKmV2ZW50KSwKLQkJCSAgICByeF9ldl9idWZfb3duZXJfaWRfZXJyID8gIiBbT1dORVJfSURfRVJSXSIgOiAiIiwKLQkJCSAgICByeF9ldl9pcF9oZHJfY2hrc3VtX2VyciA/Ci0JCQkgICAgIiBbSVBfSERSX0NIS1NVTV9FUlJdIiA6ICIiLAotCQkJICAgIHJ4X2V2X3RjcF91ZHBfY2hrc3VtX2VyciA/Ci0JCQkgICAgIiBbVENQX1VEUF9DSEtTVU1fRVJSXSIgOiAiIiwKLQkJCSAgICByeF9ldl9ldGhfY3JjX2VyciA/ICIgW0VUSF9DUkNfRVJSXSIgOiAiIiwKLQkJCSAgICByeF9ldl9mcm1fdHJ1bmMgPyAiIFtGUk1fVFJVTkNdIiA6ICIiLAotCQkJICAgIHJ4X2V2X2RyaWJfbmliID8gIiBbRFJJQl9OSUJdIiA6ICIiLAotCQkJICAgIHJ4X2V2X3RvYmVfZGlzYyA/ICIgW1RPQkVfRElTQ10iIDogIiIsCi0JCQkgICAgcnhfZXZfcGF1c2VfZnJtID8gIiBbUEFVU0VdIiA6ICIiKTsKKwlpZiAocnhfZXZfb3RoZXJfZXJyICYmIG5ldF9yYXRlbGltaXQoKSkgeworCQluZXRpZl9kYmcoZWZ4LCByeF9lcnIsIGVmeC0+bmV0X2RldiwKKwkJCSAgIiBSWCBxdWV1ZSAlZCB1bmV4cGVjdGVkIFJYIGV2ZW50ICIKKwkJCSAgRUZYX1FXT1JEX0ZNVCAiJXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJCSAgcnhfcXVldWUtPnF1ZXVlLCBFRlhfUVdPUkRfVkFMKCpldmVudCksCisJCQkgIHJ4X2V2X2J1Zl9vd25lcl9pZF9lcnIgPyAiIFtPV05FUl9JRF9FUlJdIiA6ICIiLAorCQkJICByeF9ldl9pcF9oZHJfY2hrc3VtX2VyciA/CisJCQkgICIgW0lQX0hEUl9DSEtTVU1fRVJSXSIgOiAiIiwKKwkJCSAgcnhfZXZfdGNwX3VkcF9jaGtzdW1fZXJyID8KKwkJCSAgIiBbVENQX1VEUF9DSEtTVU1fRVJSXSIgOiAiIiwKKwkJCSAgcnhfZXZfZXRoX2NyY19lcnIgPyAiIFtFVEhfQ1JDX0VSUl0iIDogIiIsCisJCQkgIHJ4X2V2X2ZybV90cnVuYyA/ICIgW0ZSTV9UUlVOQ10iIDogIiIsCisJCQkgIHJ4X2V2X2RyaWJfbmliID8gIiBbRFJJQl9OSUJdIiA6ICIiLAorCQkJICByeF9ldl90b2JlX2Rpc2MgPyAiIFtUT0JFX0RJU0NdIiA6ICIiLAorCQkJICByeF9ldl9wYXVzZV9mcm0gPyAiIFtQQVVTRV0iIDogIiIpOwogCX0KICNlbmRpZgogfQpAQCAtNzc4LDggKzc5Myw5IEBACiAKIAlleHBlY3RlZCA9IHJ4X3F1ZXVlLT5yZW1vdmVkX2NvdW50ICYgRUZYX1JYUV9NQVNLOwogCWRyb3BwZWQgPSAoaW5kZXggLSBleHBlY3RlZCkgJiBFRlhfUlhRX01BU0s7Ci0JRUZYX0lORk8oZWZ4LCAiZHJvcHBlZCAlZCBldmVudHMgKGluZGV4PSVkIGV4cGVjdGVkPSVkKVxuIiwKLQkJZHJvcHBlZCwgaW5kZXgsIGV4cGVjdGVkKTsKKwluZXRpZl9pbmZvKGVmeCwgcnhfZXJyLCBlZngtPm5ldF9kZXYsCisJCSAgICJkcm9wcGVkICVkIGV2ZW50cyAoaW5kZXg9JWQgZXhwZWN0ZWQ9JWQpXG4iLAorCQkgICBkcm9wcGVkLCBpbmRleCwgZXhwZWN0ZWQpOwogCiAJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgRUZYX1dPUktBUk9VTkRfNTY3NihlZngpID8KIAkJCSAgIFJFU0VUX1RZUEVfUlhfUkVDT1ZFUlkgOiBSRVNFVF9UWVBFX0RJU0FCTEUpOwpAQCAtODUwLDYgKzg2NiwyNiBAQAogCQkgICAgICBjaGVja3N1bW1lZCwgZGlzY2FyZCk7CiB9CiAKK3N0YXRpYyB2b2lkCitlZnhfaGFuZGxlX2dlbmVyYXRlZF9ldmVudChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsIGVmeF9xd29yZF90ICpldmVudCkKK3sKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OworCXVuc2lnbmVkIGNvZGU7CisKKwljb2RlID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgRlNGX0FaX0RSVl9HRU5fRVZfTUFHSUMpOworCWlmIChjb2RlID09IEVGWF9DSEFOTkVMX01BR0lDX1RFU1QoY2hhbm5lbCkpCisJCSsrY2hhbm5lbC0+bWFnaWNfY291bnQ7CisJZWxzZSBpZiAoY29kZSA9PSBFRlhfQ0hBTk5FTF9NQUdJQ19GSUxMKGNoYW5uZWwpKQorCQkvKiBUaGUgcXVldWUgbXVzdCBiZSBlbXB0eSwgc28gd2Ugd29uJ3QgcmVjZWl2ZSBhbnkgcngKKwkJICogZXZlbnRzLCBzbyBlZnhfcHJvY2Vzc19jaGFubmVsKCkgd29uJ3QgcmVmaWxsIHRoZQorCQkgKiBxdWV1ZS4gUmVmaWxsIGl0IGhlcmUgKi8KKwkJZWZ4X2Zhc3RfcHVzaF9yeF9kZXNjcmlwdG9ycygmZWZ4LT5yeF9xdWV1ZVtjaGFubmVsLT5jaGFubmVsXSk7CisJZWxzZQorCQluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LCAiY2hhbm5lbCAlZCByZWNlaXZlZCAiCisJCQkgICJnZW5lcmF0ZWQgZXZlbnQgIkVGWF9RV09SRF9GTVQiXG4iLAorCQkJICBjaGFubmVsLT5jaGFubmVsLCBFRlhfUVdPUkRfVkFMKCpldmVudCkpOworfQorCiAvKiBHbG9iYWwgZXZlbnRzIGFyZSBiYXNpY2FsbHkgUEhZIGV2ZW50cyAqLwogc3RhdGljIHZvaWQKIGVmeF9oYW5kbGVfZ2xvYmFsX2V2ZW50KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwgZWZ4X3F3b3JkX3QgKmV2ZW50KQpAQCAtODczLDggKzkwOSw5IEBACiAJaWYgKGVmeF9uaWNfcmV2KGVmeCkgPD0gRUZYX1JFVl9GQUxDT05fQTEgPwogCSAgICBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBGU0ZfQUFfR0xCX0VWX1JYX1JFQ09WRVJZKSA6CiAJICAgIEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIEZTRl9CQl9HTEJfRVZfUlhfUkVDT1ZFUlkpKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiY2hhbm5lbCAlZCBzZWVuIGdsb2JhbCBSWF9SRVNFVCAiCi0JCQkiZXZlbnQuIFJlc2V0dGluZy5cbiIsIGNoYW5uZWwtPmNoYW5uZWwpOworCQluZXRpZl9lcnIoZWZ4LCByeF9lcnIsIGVmeC0+bmV0X2RldiwKKwkJCSAgImNoYW5uZWwgJWQgc2VlbiBnbG9iYWwgUlhfUkVTRVQgZXZlbnQuIFJlc2V0dGluZy5cbiIsCisJCQkgIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJCWF0b21pY19pbmMoJmVmeC0+cnhfcmVzZXQpOwogCQllZnhfc2NoZWR1bGVfcmVzZXQoZWZ4LCBFRlhfV09SS0FST1VORF82NTU1KGVmeCkgPwpAQCAtODgzLDkgKzkyMCwxMCBAQAogCX0KIAogCWlmICghaGFuZGxlZCkKLQkJRUZYX0VSUihlZngsICJjaGFubmVsICVkIHVua25vd24gZ2xvYmFsIGV2ZW50ICIKLQkJCUVGWF9RV09SRF9GTVQgIlxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwKLQkJCUVGWF9RV09SRF9WQUwoKmV2ZW50KSk7CisJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJjaGFubmVsICVkIHVua25vd24gZ2xvYmFsIGV2ZW50ICIKKwkJCSAgRUZYX1FXT1JEX0ZNVCAiXG4iLCBjaGFubmVsLT5jaGFubmVsLAorCQkJICBFRlhfUVdPUkRfVkFMKCpldmVudCkpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtOTAwLDMxICs5MzgsMzUgQEAKIAogCXN3aXRjaCAoZXZfc3ViX2NvZGUpIHsKIAljYXNlIEZTRV9BWl9UWF9ERVNDUV9GTFNfRE9ORV9FVjoKLQkJRUZYX1RSQUNFKGVmeCwgImNoYW5uZWwgJWQgVFhRICVkIGZsdXNoZWRcbiIsCi0JCQkgIGNoYW5uZWwtPmNoYW5uZWwsIGV2X3N1Yl9kYXRhKTsKKwkJbmV0aWZfdmRiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJjaGFubmVsICVkIFRYUSAlZCBmbHVzaGVkXG4iLAorCQkJICAgY2hhbm5lbC0+Y2hhbm5lbCwgZXZfc3ViX2RhdGEpOwogCQlicmVhazsKIAljYXNlIEZTRV9BWl9SWF9ERVNDUV9GTFNfRE9ORV9FVjoKLQkJRUZYX1RSQUNFKGVmeCwgImNoYW5uZWwgJWQgUlhRICVkIGZsdXNoZWRcbiIsCi0JCQkgIGNoYW5uZWwtPmNoYW5uZWwsIGV2X3N1Yl9kYXRhKTsKKwkJbmV0aWZfdmRiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJjaGFubmVsICVkIFJYUSAlZCBmbHVzaGVkXG4iLAorCQkJICAgY2hhbm5lbC0+Y2hhbm5lbCwgZXZfc3ViX2RhdGEpOwogCQlicmVhazsKIAljYXNlIEZTRV9BWl9FVlFfSU5JVF9ET05FX0VWOgotCQlFRlhfTE9HKGVmeCwgImNoYW5uZWwgJWQgRVZRICVkIGluaXRpYWxpc2VkXG4iLAotCQkJY2hhbm5lbC0+Y2hhbm5lbCwgZXZfc3ViX2RhdGEpOworCQluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAiY2hhbm5lbCAlZCBFVlEgJWQgaW5pdGlhbGlzZWRcbiIsCisJCQkgIGNoYW5uZWwtPmNoYW5uZWwsIGV2X3N1Yl9kYXRhKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0VfQVpfU1JNX1VQRF9ET05FX0VWOgotCQlFRlhfVFJBQ0UoZWZ4LCAiY2hhbm5lbCAlZCBTUkFNIHVwZGF0ZSBkb25lXG4iLAotCQkJICBjaGFubmVsLT5jaGFubmVsKTsKKwkJbmV0aWZfdmRiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICAiY2hhbm5lbCAlZCBTUkFNIHVwZGF0ZSBkb25lXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0VfQVpfV0FLRV9VUF9FVjoKLQkJRUZYX1RSQUNFKGVmeCwgImNoYW5uZWwgJWQgUlhRICVkIHdha2V1cCBldmVudFxuIiwKLQkJCSAgY2hhbm5lbC0+Y2hhbm5lbCwgZXZfc3ViX2RhdGEpOworCQluZXRpZl92ZGJnKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgICJjaGFubmVsICVkIFJYUSAlZCB3YWtldXAgZXZlbnRcbiIsCisJCQkgICBjaGFubmVsLT5jaGFubmVsLCBldl9zdWJfZGF0YSk7CiAJCWJyZWFrOwogCWNhc2UgRlNFX0FaX1RJTUVSX0VWOgotCQlFRlhfVFJBQ0UoZWZ4LCAiY2hhbm5lbCAlZCBSWCBxdWV1ZSAlZCB0aW1lciBleHBpcmVkXG4iLAotCQkJICBjaGFubmVsLT5jaGFubmVsLCBldl9zdWJfZGF0YSk7CisJCW5ldGlmX3ZkYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAgImNoYW5uZWwgJWQgUlggcXVldWUgJWQgdGltZXIgZXhwaXJlZFxuIiwKKwkJCSAgIGNoYW5uZWwtPmNoYW5uZWwsIGV2X3N1Yl9kYXRhKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0VfQUFfUlhfUkVDT1ZFUl9FVjoKLQkJRUZYX0VSUihlZngsICJjaGFubmVsICVkIHNlZW4gRFJJVkVSIFJYX1JFU0VUIGV2ZW50LiAiCisJCW5ldGlmX2VycihlZngsIHJ4X2VyciwgZWZ4LT5uZXRfZGV2LAorCQkJICAiY2hhbm5lbCAlZCBzZWVuIERSSVZFUiBSWF9SRVNFVCBldmVudC4gIgogCQkJIlJlc2V0dGluZy5cbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCQlhdG9taWNfaW5jKCZlZngtPnJ4X3Jlc2V0KTsKIAkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwKQEAgLTkzMywxOSArOTc1LDIyIEBACiAJCQkJICAgUkVTRVRfVFlQRV9ESVNBQkxFKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0VfQlpfUlhfRFNDX0VSUk9SX0VWOgotCQlFRlhfRVJSKGVmeCwgIlJYIERNQSBRICVkIHJlcG9ydHMgZGVzY3JpcHRvciBmZXRjaCBlcnJvci4iCi0JCQkiIFJYIFEgJWQgaXMgZGlzYWJsZWQuXG4iLCBldl9zdWJfZGF0YSwgZXZfc3ViX2RhdGEpOworCQluZXRpZl9lcnIoZWZ4LCByeF9lcnIsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlJYIERNQSBRICVkIHJlcG9ydHMgZGVzY3JpcHRvciBmZXRjaCBlcnJvci4iCisJCQkgICIgUlggUSAlZCBpcyBkaXNhYmxlZC5cbiIsIGV2X3N1Yl9kYXRhLCBldl9zdWJfZGF0YSk7CiAJCWVmeF9zY2hlZHVsZV9yZXNldChlZngsIFJFU0VUX1RZUEVfUlhfREVTQ19GRVRDSCk7CiAJCWJyZWFrOwogCWNhc2UgRlNFX0JaX1RYX0RTQ19FUlJPUl9FVjoKLQkJRUZYX0VSUihlZngsICJUWCBETUEgUSAlZCByZXBvcnRzIGRlc2NyaXB0b3IgZmV0Y2ggZXJyb3IuIgotCQkJIiBUWCBRICVkIGlzIGRpc2FibGVkLlxuIiwgZXZfc3ViX2RhdGEsIGV2X3N1Yl9kYXRhKTsKKwkJbmV0aWZfZXJyKGVmeCwgdHhfZXJyLCBlZngtPm5ldF9kZXYsCisJCQkgICJUWCBETUEgUSAlZCByZXBvcnRzIGRlc2NyaXB0b3IgZmV0Y2ggZXJyb3IuIgorCQkJICAiIFRYIFEgJWQgaXMgZGlzYWJsZWQuXG4iLCBldl9zdWJfZGF0YSwgZXZfc3ViX2RhdGEpOwogCQllZnhfc2NoZWR1bGVfcmVzZXQoZWZ4LCBSRVNFVF9UWVBFX1RYX0RFU0NfRkVUQ0gpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlFRlhfVFJBQ0UoZWZ4LCAiY2hhbm5lbCAlZCB1bmtub3duIGRyaXZlciBldmVudCBjb2RlICVkICIKLQkJCSAgImRhdGEgJTA0eFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwgZXZfc3ViX2NvZGUsCi0JCQkgIGV2X3N1Yl9kYXRhKTsKKwkJbmV0aWZfdmRiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICAiY2hhbm5lbCAlZCB1bmtub3duIGRyaXZlciBldmVudCBjb2RlICVkICIKKwkJCSAgICJkYXRhICUwNHhcbiIsIGNoYW5uZWwtPmNoYW5uZWwsIGV2X3N1Yl9jb2RlLAorCQkJICAgZXZfc3ViX2RhdGEpOwogCQlicmVhazsKIAl9CiB9CkBAIC05NjgsOCArMTAxMyw5IEBACiAJCQkvKiBFbmQgb2YgZXZlbnRzICovCiAJCQlicmVhazsKIAotCQlFRlhfVFJBQ0UoY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCBldmVudCBpcyAiRUZYX1FXT1JEX0ZNVCJcbiIsCi0JCQkgIGNoYW5uZWwtPmNoYW5uZWwsIEVGWF9RV09SRF9WQUwoZXZlbnQpKTsKKwkJbmV0aWZfdmRiZyhjaGFubmVsLT5lZngsIGludHIsIGNoYW5uZWwtPmVmeC0+bmV0X2RldiwKKwkJCSAgICJjaGFubmVsICVkIGV2ZW50IGlzICJFRlhfUVdPUkRfRk1UIlxuIiwKKwkJCSAgIGNoYW5uZWwtPmNoYW5uZWwsIEVGWF9RV09SRF9WQUwoZXZlbnQpKTsKIAogCQkvKiBDbGVhciB0aGlzIGV2ZW50IGJ5IG1hcmtpbmcgaXQgYWxsIG9uZXMgKi8KIAkJRUZYX1NFVF9RV09SRCgqcF9ldmVudCk7CkBAIC05OTMsMTEgKzEwMzksNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgRlNFX0FaX0VWX0NPREVfRFJWX0dFTl9FVjoKLQkJCWNoYW5uZWwtPmV2ZW50cV9tYWdpYyA9IEVGWF9RV09SRF9GSUVMRCgKLQkJCQlldmVudCwgRlNGX0FaX0RSVl9HRU5fRVZfTUFHSUMpOwotCQkJRUZYX0xPRyhjaGFubmVsLT5lZngsICJjaGFubmVsICVkIHJlY2VpdmVkIGdlbmVyYXRlZCAiCi0JCQkJImV2ZW50ICJFRlhfUVdPUkRfRk1UIlxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwKLQkJCQlFRlhfUVdPUkRfVkFMKGV2ZW50KSk7CisJCQllZnhfaGFuZGxlX2dlbmVyYXRlZF9ldmVudChjaGFubmVsLCAmZXZlbnQpOwogCQkJYnJlYWs7CiAJCWNhc2UgRlNFX0FaX0VWX0NPREVfR0xPQkFMX0VWOgogCQkJZWZ4X2hhbmRsZV9nbG9iYWxfZXZlbnQoY2hhbm5lbCwgJmV2ZW50KTsKQEAgLTEwMDksOSArMTA1MSwxMCBAQAogCQkJZWZ4X21jZGlfcHJvY2Vzc19ldmVudChjaGFubmVsLCAmZXZlbnQpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlFRlhfRVJSKGNoYW5uZWwtPmVmeCwgImNoYW5uZWwgJWQgdW5rbm93biBldmVudCB0eXBlICVkIgotCQkJCSIgKGRhdGEgIiBFRlhfUVdPUkRfRk1UICIpXG4iLCBjaGFubmVsLT5jaGFubmVsLAotCQkJCWV2X2NvZGUsIEVGWF9RV09SRF9WQUwoZXZlbnQpKTsKKwkJCW5ldGlmX2VycihjaGFubmVsLT5lZngsIGh3LCBjaGFubmVsLT5lZngtPm5ldF9kZXYsCisJCQkJICAiY2hhbm5lbCAlZCB1bmtub3duIGV2ZW50IHR5cGUgJWQgKGRhdGEgIgorCQkJCSAgRUZYX1FXT1JEX0ZNVCAiKVxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwKKwkJCQkgIGV2X2NvZGUsIEVGWF9RV09SRF9WQUwoZXZlbnQpKTsKIAkJfQogCX0KIApAQCAtMTAzNiw5ICsxMDc5LDEwIEBACiAJZWZ4X293b3JkX3QgcmVnOwogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAKLQlFRlhfTE9HKGVmeCwgImNoYW5uZWwgJWQgZXZlbnQgcXVldWUgaW4gc3BlY2lhbCBidWZmZXJzICVkLSVkXG4iLAotCQljaGFubmVsLT5jaGFubmVsLCBjaGFubmVsLT5ldmVudHEuaW5kZXgsCi0JCWNoYW5uZWwtPmV2ZW50cS5pbmRleCArIGNoYW5uZWwtPmV2ZW50cS5lbnRyaWVzIC0gMSk7CisJbmV0aWZfZGJnKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJICAiY2hhbm5lbCAlZCBldmVudCBxdWV1ZSBpbiBzcGVjaWFsIGJ1ZmZlcnMgJWQtJWRcbiIsCisJCSAgY2hhbm5lbC0+Y2hhbm5lbCwgY2hhbm5lbC0+ZXZlbnRxLmluZGV4LAorCQkgIGNoYW5uZWwtPmV2ZW50cS5pbmRleCArIGNoYW5uZWwtPmV2ZW50cS5lbnRyaWVzIC0gMSk7CiAKIAlpZiAoZWZ4X25pY19yZXYoZWZ4KSA+PSBFRlhfUkVWX1NJRU5BX0EwKSB7CiAJCUVGWF9QT1BVTEFURV9PV09SRF8zKHJlZywKQEAgLTEwODgsMTIgKzExMzIsMjAgQEAKIH0KIAogCi0vKiBHZW5lcmF0ZXMgYSB0ZXN0IGV2ZW50IG9uIHRoZSBldmVudCBxdWV1ZS4gIEEgc3Vic2VxdWVudCBjYWxsIHRvCi0gKiBwcm9jZXNzX2V2ZW50cSgpIHNob3VsZCBwaWNrIHVwIHRoZSBldmVudCBhbmQgcGxhY2UgdGhlIHZhbHVlIG9mCi0gKiAibWFnaWMiIGludG8gY2hhbm5lbC0+ZXZlbnRxX21hZ2ljOwotICovCi12b2lkIGVmeF9uaWNfZ2VuZXJhdGVfdGVzdF9ldmVudChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsIHVuc2lnbmVkIGludCBtYWdpYykKK3ZvaWQgZWZ4X25pY19nZW5lcmF0ZV90ZXN0X2V2ZW50KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWMgPSBFRlhfQ0hBTk5FTF9NQUdJQ19URVNUKGNoYW5uZWwpOworCWVmeF9xd29yZF90IHRlc3RfZXZlbnQ7CisKKwlFRlhfUE9QVUxBVEVfUVdPUkRfMih0ZXN0X2V2ZW50LCBGU0ZfQVpfRVZfQ09ERSwKKwkJCSAgICAgRlNFX0FaX0VWX0NPREVfRFJWX0dFTl9FViwKKwkJCSAgICAgRlNGX0FaX0RSVl9HRU5fRVZfTUFHSUMsIG1hZ2ljKTsKKwllZnhfZ2VuZXJhdGVfZXZlbnQoY2hhbm5lbCwgJnRlc3RfZXZlbnQpOworfQorCit2b2lkIGVmeF9uaWNfZ2VuZXJhdGVfZmlsbF9ldmVudChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IG1hZ2ljID0gRUZYX0NIQU5ORUxfTUFHSUNfRklMTChjaGFubmVsKTsKIAllZnhfcXdvcmRfdCB0ZXN0X2V2ZW50OwogCiAJRUZYX1BPUFVMQVRFX1FXT1JEXzIodGVzdF9ldmVudCwgRlNGX0FaX0VWX0NPREUsCkBAIC0xMjA4LDIwICsxMjYwLDE5IEBACiAJICogbGVhZGluZyB0byBhIHJlc2V0LCBvciBmYWtlIHVwIHN1Y2Nlc3MgYW55d2F5ICovCiAJZWZ4X2Zvcl9lYWNoX3R4X3F1ZXVlKHR4X3F1ZXVlLCBlZngpIHsKIAkJaWYgKHR4X3F1ZXVlLT5mbHVzaGVkICE9IEZMVVNIX0RPTkUpCi0JCQlFRlhfRVJSKGVmeCwgInR4IHF1ZXVlICVkIGZsdXNoIGNvbW1hbmQgdGltZWQgb3V0XG4iLAotCQkJCXR4X3F1ZXVlLT5xdWV1ZSk7CisJCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgInR4IHF1ZXVlICVkIGZsdXNoIGNvbW1hbmQgdGltZWQgb3V0XG4iLAorCQkJCSAgdHhfcXVldWUtPnF1ZXVlKTsKIAkJdHhfcXVldWUtPmZsdXNoZWQgPSBGTFVTSF9ET05FOwogCX0KIAllZnhfZm9yX2VhY2hfcnhfcXVldWUocnhfcXVldWUsIGVmeCkgewogCQlpZiAocnhfcXVldWUtPmZsdXNoZWQgIT0gRkxVU0hfRE9ORSkKLQkJCUVGWF9FUlIoZWZ4LCAicnggcXVldWUgJWQgZmx1c2ggY29tbWFuZCB0aW1lZCBvdXRcbiIsCi0JCQkJcnhfcXVldWUtPnF1ZXVlKTsKKwkJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkJICAicnggcXVldWUgJWQgZmx1c2ggY29tbWFuZCB0aW1lZCBvdXRcbiIsCisJCQkJICByeF9xdWV1ZS0+cXVldWUpOwogCQlyeF9xdWV1ZS0+Zmx1c2hlZCA9IEZMVVNIX0RPTkU7CiAJfQogCi0JaWYgKEVGWF9XT1JLQVJPVU5EXzc4MDMoZWZ4KSkKLQkJcmV0dXJuIDA7Ci0KIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIApAQCAtMTI5MCwxMCArMTM0MSwxMCBAQAogCWVmeF9yZWFkbyhlZngsICZmYXRhbF9pbnRyLCBGUl9BWl9GQVRBTF9JTlRSX0tFUik7CiAJZXJyb3IgPSBFRlhfT1dPUkRfRklFTEQoZmF0YWxfaW50ciwgRlJGX0FaX0ZBVEFMX0lOVFIpOwogCi0JRUZYX0VSUihlZngsICJTWVNURU0gRVJST1IgIiBFRlhfT1dPUkRfRk1UICIgc3RhdHVzICIKLQkJRUZYX09XT1JEX0ZNVCAiOiAlc1xuIiwgRUZYX09XT1JEX1ZBTCgqaW50X2tlciksCi0JCUVGWF9PV09SRF9WQUwoZmF0YWxfaW50ciksCi0JCWVycm9yID8gImRpc2FibGluZyBidXMgbWFzdGVyaW5nIiA6ICJubyByZWNvZ25pc2VkIGVycm9yIik7CisJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIlNZU1RFTSBFUlJPUiAiRUZYX09XT1JEX0ZNVCIgc3RhdHVzICIKKwkJICBFRlhfT1dPUkRfRk1UICI6ICVzXG4iLCBFRlhfT1dPUkRfVkFMKCppbnRfa2VyKSwKKwkJICBFRlhfT1dPUkRfVkFMKGZhdGFsX2ludHIpLAorCQkgIGVycm9yID8gImRpc2FibGluZyBidXMgbWFzdGVyaW5nIiA6ICJubyByZWNvZ25pc2VkIGVycm9yIik7CiAKIAkvKiBJZiB0aGlzIGlzIGEgbWVtb3J5IHBhcml0eSBlcnJvciBkdW1wIHdoaWNoIGJsb2NrcyBhcmUgb2ZmZW5kaW5nICovCiAJbWVtX3BlcnIgPSAoRUZYX09XT1JEX0ZJRUxEKGZhdGFsX2ludHIsIEZSRl9BWl9NRU1fUEVSUl9JTlRfS0VSKSB8fApAQCAtMTMwMSw4ICsxMzUyLDkgQEAKIAlpZiAobWVtX3BlcnIpIHsKIAkJZWZ4X293b3JkX3QgcmVnOwogCQllZnhfcmVhZG8oZWZ4LCAmcmVnLCBGUl9BWl9NRU1fU1RBVCk7Ci0JCUVGWF9FUlIoZWZ4LCAiU1lTVEVNIEVSUk9SOiBtZW1vcnkgcGFyaXR5IGVycm9yICIKLQkJCUVGWF9PV09SRF9GTVQgIlxuIiwgRUZYX09XT1JEX1ZBTChyZWcpKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlNZU1RFTSBFUlJPUjogbWVtb3J5IHBhcml0eSBlcnJvciAiRUZYX09XT1JEX0ZNVCJcbiIsCisJCQkgIEVGWF9PV09SRF9WQUwocmVnKSk7CiAJfQogCiAJLyogRGlzYWJsZSBib3RoIGRldmljZXMgKi8KQEAgLTEzMTksMTEgKzEzNzEsMTMgQEAKIAkJCWppZmZpZXMgKyBFRlhfSU5UX0VSUk9SX0VYUElSRSAqIEhaOwogCX0KIAlpZiAoKytlZngtPmludF9lcnJvcl9jb3VudCA8IEVGWF9NQVhfSU5UX0VSUk9SUykgewotCQlFRlhfRVJSKGVmeCwgIlNZU1RFTSBFUlJPUiAtIHJlc2V0IHNjaGVkdWxlZFxuIik7CisJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJTWVNURU0gRVJST1IgLSByZXNldCBzY2hlZHVsZWRcbiIpOwogCQllZnhfc2NoZWR1bGVfcmVzZXQoZWZ4LCBSRVNFVF9UWVBFX0lOVF9FUlJPUik7CiAJfSBlbHNlIHsKLQkJRUZYX0VSUihlZngsICJTWVNURU0gRVJST1IgLSBtYXggbnVtYmVyIG9mIGVycm9ycyBzZWVuLiIKLQkJCSJOSUMgd2lsbCBiZSBkaXNhYmxlZFxuIik7CisJCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJTWVNURU0gRVJST1IgLSBtYXggbnVtYmVyIG9mIGVycm9ycyBzZWVuLiIKKwkJCSAgIk5JQyB3aWxsIGJlIGRpc2FibGVkXG4iKTsKIAkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9ESVNBQkxFKTsKIAl9CiAKQEAgLTEzODYsOCArMTQ0MCw5IEBACiAKIAlpZiAocmVzdWx0ID09IElSUV9IQU5ETEVEKSB7CiAJCWVmeC0+bGFzdF9pcnFfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKLQkJRUZYX1RSQUNFKGVmeCwgIklSUSAlZCBvbiBDUFUgJWQgc3RhdHVzICIgRUZYX0RXT1JEX0ZNVCAiXG4iLAotCQkJICBpcnEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIEVGWF9EV09SRF9WQUwocmVnKSk7CisJCW5ldGlmX3ZkYmcoZWZ4LCBpbnRyLCBlZngtPm5ldF9kZXYsCisJCQkgICAiSVJRICVkIG9uIENQVSAlZCBzdGF0dXMgIiBFRlhfRFdPUkRfRk1UICJcbiIsCisJCQkgICBpcnEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIEVGWF9EV09SRF9WQUwocmVnKSk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE0MDgsOCArMTQ2Myw5IEBACiAJaW50IHN5c2VycjsKIAogCWVmeC0+bGFzdF9pcnFfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKLQlFRlhfVFJBQ0UoZWZ4LCAiSVJRICVkIG9uIENQVSAlZCBzdGF0dXMgIiBFRlhfT1dPUkRfRk1UICJcbiIsCi0JCSAgaXJxLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBFRlhfT1dPUkRfVkFMKCppbnRfa2VyKSk7CisJbmV0aWZfdmRiZyhlZngsIGludHIsIGVmeC0+bmV0X2RldiwKKwkJICAgIklSUSAlZCBvbiBDUFUgJWQgc3RhdHVzICIgRUZYX09XT1JEX0ZNVCAiXG4iLAorCQkgICBpcnEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIEVGWF9PV09SRF9WQUwoKmludF9rZXIpKTsKIAogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgc2VyaW91cyBlcnJvciBjb25kaXRpb24gKi8KIAlpZiAoY2hhbm5lbC0+Y2hhbm5lbCA9PSBlZngtPmZhdGFsX2lycV9sZXZlbCkgewpAQCAtMTQyOCwyMiArMTQ4NCwyMSBAQAogLyogU2V0dXAgUlNTIGluZGlyZWN0aW9uIHRhYmxlLgogICogVGhpcyBtYXBzIGZyb20gdGhlIGhhc2ggdmFsdWUgb2YgdGhlIHBhY2tldCB0byBSWFEKICAqLwotc3RhdGljIHZvaWQgZWZ4X3NldHVwX3Jzc19pbmRpcl90YWJsZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQordm9pZCBlZnhfbmljX3B1c2hfcnhfaW5kaXJfdGFibGUoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc2l6ZV90IGkgPSAwOwogCWVmeF9kd29yZF90IGR3b3JkOwogCiAJaWYgKGVmeF9uaWNfcmV2KGVmeCkgPCBFRlhfUkVWX0ZBTENPTl9CMCkKIAkJcmV0dXJuOwogCi0JZm9yIChvZmZzZXQgPSBGUl9CWl9SWF9JTkRJUkVDVElPTl9UQkw7Ci0JICAgICBvZmZzZXQgPCBGUl9CWl9SWF9JTkRJUkVDVElPTl9UQkwgKyAweDgwMDsKLQkgICAgIG9mZnNldCArPSAweDEwKSB7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoZWZ4LT5yeF9pbmRpcl90YWJsZSkgIT0KKwkJICAgICBGUl9CWl9SWF9JTkRJUkVDVElPTl9UQkxfUk9XUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlJfQlpfUlhfSU5ESVJFQ1RJT05fVEJMX1JPV1M7IGkrKykgewogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMShkd29yZCwgRlJGX0JaX0lUX1FVRVVFLAotCQkJCSAgICAgaSAlIGVmeC0+bl9yeF9jaGFubmVscyk7Ci0JCWVmeF93cml0ZWQoZWZ4LCAmZHdvcmQsIG9mZnNldCk7Ci0JCWkrKzsKKwkJCQkgICAgIGVmeC0+cnhfaW5kaXJfdGFibGVbaV0pOworCQllZnhfd3JpdGVkX3RhYmxlKGVmeCwgJmR3b3JkLCBGUl9CWl9SWF9JTkRJUkVDVElPTl9UQkwsIGkpOwogCX0KIH0KIApAQCAtMTQ2NSw4ICsxNTIwLDkgQEAKIAkJcmMgPSByZXF1ZXN0X2lycShlZngtPmxlZ2FjeV9pcnEsIGhhbmRsZXIsIElSUUZfU0hBUkVELAogCQkJCSBlZngtPm5hbWUsIGVmeCk7CiAJCWlmIChyYykgewotCQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gaG9vayBsZWdhY3kgSVJRICVkXG4iLAotCQkJCWVmeC0+cGNpX2Rldi0+aXJxKTsKKwkJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgImZhaWxlZCB0byBob29rIGxlZ2FjeSBJUlEgJWRcbiIsCisJCQkJICBlZngtPnBjaV9kZXYtPmlycSk7CiAJCQlnb3RvIGZhaWwxOwogCQl9CiAJCXJldHVybiAwOwpAQCAtMTQ3OCw3ICsxNTM0LDggQEAKIAkJCQkgSVJRRl9QUk9CRV9TSEFSRUQsIC8qIE5vdCBzaGFyZWQgKi8KIAkJCQkgY2hhbm5lbC0+bmFtZSwgY2hhbm5lbCk7CiAJCWlmIChyYykgewotCQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gaG9vayBJUlEgJWRcbiIsIGNoYW5uZWwtPmlycSk7CisJCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJmYWlsZWQgdG8gaG9vayBJUlEgJWRcbiIsIGNoYW5uZWwtPmlycSk7CiAJCQlnb3RvIGZhaWwyOwogCQl9CiAJfQpAQCAtMTU3Niw3ICsxNjMzLDcgQEAKIAlFRlhfSU5WRVJUX09XT1JEKHRlbXApOwogCWVmeF93cml0ZW8oZWZ4LCAmdGVtcCwgRlJfQVpfRkFUQUxfSU5UUl9LRVIpOwogCi0JZWZ4X3NldHVwX3Jzc19pbmRpcl90YWJsZShlZngpOworCWVmeF9uaWNfcHVzaF9yeF9pbmRpcl90YWJsZShlZngpOwogCiAJLyogRGlzYWJsZSB0aGUgdWdseSB0aW1lci1iYXNlZCBUWCBETUEgYmFja29mZiBhbmQgYWxsb3cgVFggRE1BIHRvIGJlCiAJICogY29udHJvbGxlZCBieSB0aGUgUlggRklGTyBmaWxsIGxldmVsLiBTZXQgYXJiaXRyYXRpb24gdG8gb25lIHBrdC9RLgpAQCAtMTU5OCwzICsxNjU1LDI2OSBAQAogCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIEZSRl9CWl9UWF9GTFVTSF9NSU5fTEVOX0VOLCAxKTsKIAllZnhfd3JpdGVvKGVmeCwgJnRlbXAsIEZSX0FaX1RYX1JFU0VSVkVEKTsKIH0KKworLyogUmVnaXN0ZXIgZHVtcCAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JFVklTSU9OX0EJMQorI2RlZmluZSBSRUdJU1RFUl9SRVZJU0lPTl9CCTIKKyNkZWZpbmUgUkVHSVNURVJfUkVWSVNJT05fQwkzCisjZGVmaW5lIFJFR0lTVEVSX1JFVklTSU9OX1oJMwkvKiBsYXRlc3QgcmV2aXNpb24gKi8KKworc3RydWN0IGVmeF9uaWNfcmVnIHsKKwl1MzIgb2Zmc2V0OjI0OworCXUzMiBtaW5fcmV2aXNpb246MiwgbWF4X3JldmlzaW9uOjI7Cit9OworCisjZGVmaW5lIFJFR0lTVEVSKG5hbWUsIG1pbl9yZXYsIG1heF9yZXYpIHsJCQkJXAorCUZSXyAjIyBtaW5fcmV2ICMjIG1heF9yZXYgIyMgXyAjIyBuYW1lLAkJCQlcCisJUkVHSVNURVJfUkVWSVNJT05fICMjIG1pbl9yZXYsIFJFR0lTVEVSX1JFVklTSU9OXyAjIyBtYXhfcmV2CVwKK30KKyNkZWZpbmUgUkVHSVNURVJfQUEobmFtZSkgUkVHSVNURVIobmFtZSwgQSwgQSkKKyNkZWZpbmUgUkVHSVNURVJfQUIobmFtZSkgUkVHSVNURVIobmFtZSwgQSwgQikKKyNkZWZpbmUgUkVHSVNURVJfQVoobmFtZSkgUkVHSVNURVIobmFtZSwgQSwgWikKKyNkZWZpbmUgUkVHSVNURVJfQkIobmFtZSkgUkVHSVNURVIobmFtZSwgQiwgQikKKyNkZWZpbmUgUkVHSVNURVJfQloobmFtZSkgUkVHSVNURVIobmFtZSwgQiwgWikKKyNkZWZpbmUgUkVHSVNURVJfQ1oobmFtZSkgUkVHSVNURVIobmFtZSwgQywgWikKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlZnhfbmljX3JlZyBlZnhfbmljX3JlZ3NbXSA9IHsKKwlSRUdJU1RFUl9BWihBRFJfUkVHSU9OKSwKKwlSRUdJU1RFUl9BWihJTlRfRU5fS0VSKSwKKwlSRUdJU1RFUl9CWihJTlRfRU5fQ0hBUiksCisJUkVHSVNURVJfQVooSU5UX0FEUl9LRVIpLAorCVJFR0lTVEVSX0JaKElOVF9BRFJfQ0hBUiksCisJLyogSU5UX0FDS19LRVIgaXMgV08gKi8KKwkvKiBJTlRfSVNSMCBpcyBSQyAqLworCVJFR0lTVEVSX0FaKEhXX0lOSVQpLAorCVJFR0lTVEVSX0NaKFVTUl9FVl9DRkcpLAorCVJFR0lTVEVSX0FCKEVFX1NQSV9IQ01EKSwKKwlSRUdJU1RFUl9BQihFRV9TUElfSEFEUiksCisJUkVHSVNURVJfQUIoRUVfU1BJX0hEQVRBKSwKKwlSRUdJU1RFUl9BQihFRV9CQVNFX1BBR0UpLAorCVJFR0lTVEVSX0FCKEVFX1ZQRF9DRkcwKSwKKwkvKiBFRV9WUERfU1dfQ05UTCBhbmQgRUVfVlBEX1NXX0RBVEEgYXJlIG5vdCB1c2VkICovCisJLyogUE1CWF9EQkdfSUFERFIgYW5kIFBCTVhfREJHX0lEQVRBIGFyZSBpbmRpcmVjdCAqLworCS8qIFBDSUVfQ09SRV9JTkRJUkVDVCBpcyBpbmRpcmVjdCAqLworCVJFR0lTVEVSX0FCKE5JQ19TVEFUKSwKKwlSRUdJU1RFUl9BQihHUElPX0NUTCksCisJUkVHSVNURVJfQUIoR0xCX0NUTCksCisJLyogRkFUQUxfSU5UUl9LRVIgYW5kIEZBVEFMX0lOVFJfQ0hBUiBhcmUgcGFydGx5IFJDICovCisJUkVHSVNURVJfQlooRFBfQ1RSTCksCisJUkVHSVNURVJfQVooTUVNX1NUQVQpLAorCVJFR0lTVEVSX0FaKENTX0RFQlVHKSwKKwlSRUdJU1RFUl9BWihBTFRFUkFfQlVJTEQpLAorCVJFR0lTVEVSX0FaKENTUl9TUEFSRSksCisJUkVHSVNURVJfQUIoUENJRV9TRF9DVEwwMTIzKSwKKwlSRUdJU1RFUl9BQihQQ0lFX1NEX0NUTDQ1KSwKKwlSRUdJU1RFUl9BQihQQ0lFX1BDU19DVExfU1RBVCksCisJLyogREVCVUdfREFUQV9PVVQgaXMgbm90IHVzZWQgKi8KKwkvKiBEUlZfRVYgaXMgV08gKi8KKwlSRUdJU1RFUl9BWihFVlFfQ1RMKSwKKwlSRUdJU1RFUl9BWihFVlFfQ05UMSksCisJUkVHSVNURVJfQVooRVZRX0NOVDIpLAorCVJFR0lTVEVSX0FaKEJVRl9UQkxfQ0ZHKSwKKwlSRUdJU1RFUl9BWihTUk1fUlhfRENfQ0ZHKSwKKwlSRUdJU1RFUl9BWihTUk1fVFhfRENfQ0ZHKSwKKwlSRUdJU1RFUl9BWihTUk1fQ0ZHKSwKKwkvKiBCVUZfVEJMX1VQRCBpcyBXTyAqLworCVJFR0lTVEVSX0FaKFNSTV9VUERfRVZRKSwKKwlSRUdJU1RFUl9BWihTUkFNX1BBUklUWSksCisJUkVHSVNURVJfQVooUlhfQ0ZHKSwKKwlSRUdJU1RFUl9CWihSWF9GSUxURVJfQ1RMKSwKKwkvKiBSWF9GTFVTSF9ERVNDUSBpcyBXTyAqLworCVJFR0lTVEVSX0FaKFJYX0RDX0NGRyksCisJUkVHSVNURVJfQVooUlhfRENfUEZfV00pLAorCVJFR0lTVEVSX0JaKFJYX1JTU19US0VZKSwKKwkvKiBSWF9OT0RFU0NfRFJPUCBpcyBSQyAqLworCVJFR0lTVEVSX0FBKFJYX1NFTEZfUlNUKSwKKwkvKiBSWF9ERUJVRywgUlhfUFVTSF9EUk9QIGFyZSBub3QgdXNlZCAqLworCVJFR0lTVEVSX0NaKFJYX1JTU19JUFY2X1JFRzEpLAorCVJFR0lTVEVSX0NaKFJYX1JTU19JUFY2X1JFRzIpLAorCVJFR0lTVEVSX0NaKFJYX1JTU19JUFY2X1JFRzMpLAorCS8qIFRYX0ZMVVNIX0RFU0NRIGlzIFdPICovCisJUkVHSVNURVJfQVooVFhfRENfQ0ZHKSwKKwlSRUdJU1RFUl9BQShUWF9DSEtTTV9DRkcpLAorCVJFR0lTVEVSX0FaKFRYX0NGRyksCisJLyogVFhfUFVTSF9EUk9QIGlzIG5vdCB1c2VkICovCisJUkVHSVNURVJfQVooVFhfUkVTRVJWRUQpLAorCVJFR0lTVEVSX0JaKFRYX1BBQ0UpLAorCS8qIFRYX1BBQ0VfRFJPUF9RSUQgaXMgUkMgKi8KKwlSRUdJU1RFUl9CQihUWF9WTEFOKSwKKwlSRUdJU1RFUl9CWihUWF9JUEZJTF9QT1JURU4pLAorCVJFR0lTVEVSX0FCKE1EX1RYRCksCisJUkVHSVNURVJfQUIoTURfUlhEKSwKKwlSRUdJU1RFUl9BQihNRF9DUyksCisJUkVHSVNURVJfQUIoTURfUEhZX0FEUiksCisJUkVHSVNURVJfQUIoTURfSUQpLAorCS8qIE1EX1NUQVQgaXMgUkMgKi8KKwlSRUdJU1RFUl9BQihNQUNfU1RBVF9ETUEpLAorCVJFR0lTVEVSX0FCKE1BQ19DVFJMKSwKKwlSRUdJU1RFUl9CQihHRU5fTU9ERSksCisJUkVHSVNURVJfQUIoTUFDX01DX0hBU0hfUkVHMCksCisJUkVHSVNURVJfQUIoTUFDX01DX0hBU0hfUkVHMSksCisJUkVHSVNURVJfQUIoR01fQ0ZHMSksCisJUkVHSVNURVJfQUIoR01fQ0ZHMiksCisJLyogR01fSVBHIGFuZCBHTV9IRCBhcmUgbm90IHVzZWQgKi8KKwlSRUdJU1RFUl9BQihHTV9NQVhfRkxFTiksCisJLyogR01fVEVTVCBpcyBub3QgdXNlZCAqLworCVJFR0lTVEVSX0FCKEdNX0FEUjEpLAorCVJFR0lTVEVSX0FCKEdNX0FEUjIpLAorCVJFR0lTVEVSX0FCKEdNRl9DRkcwKSwKKwlSRUdJU1RFUl9BQihHTUZfQ0ZHMSksCisJUkVHSVNURVJfQUIoR01GX0NGRzIpLAorCVJFR0lTVEVSX0FCKEdNRl9DRkczKSwKKwlSRUdJU1RFUl9BQihHTUZfQ0ZHNCksCisJUkVHSVNURVJfQUIoR01GX0NGRzUpLAorCVJFR0lTVEVSX0JCKFRYX1NSQ19NQUNfQ1RMKSwKKwlSRUdJU1RFUl9BQihYTV9BRFJfTE8pLAorCVJFR0lTVEVSX0FCKFhNX0FEUl9ISSksCisJUkVHSVNURVJfQUIoWE1fR0xCX0NGRyksCisJUkVHSVNURVJfQUIoWE1fVFhfQ0ZHKSwKKwlSRUdJU1RFUl9BQihYTV9SWF9DRkcpLAorCVJFR0lTVEVSX0FCKFhNX01HVF9JTlRfTUFTSyksCisJUkVHSVNURVJfQUIoWE1fRkMpLAorCVJFR0lTVEVSX0FCKFhNX1BBVVNFX1RJTUUpLAorCVJFR0lTVEVSX0FCKFhNX1RYX1BBUkFNKSwKKwlSRUdJU1RFUl9BQihYTV9SWF9QQVJBTSksCisJLyogWE1fTUdUX0lOVF9NU0sgKG5vdGUgbm8gJ0EnKSBpcyBSQyAqLworCVJFR0lTVEVSX0FCKFhYX1BXUl9SU1QpLAorCVJFR0lTVEVSX0FCKFhYX1NEX0NUTCksCisJUkVHSVNURVJfQUIoWFhfVFhEUlZfQ1RMKSwKKwkvKiBYWF9QUkJTX0NUTCwgWFhfUFJCU19DSEsgYW5kIFhYX1BSQlNfRVJSIGFyZSBub3QgdXNlZCAqLworCS8qIFhYX0NPUkVfU1RBVCBpcyBwYXJ0bHkgUkMgKi8KK307CisKK3N0cnVjdCBlZnhfbmljX3JlZ190YWJsZSB7CisJdTMyIG9mZnNldDoyNDsKKwl1MzIgbWluX3JldmlzaW9uOjIsIG1heF9yZXZpc2lvbjoyOworCXUzMiBzdGVwOjYsIHJvd3M6MjE7Cit9OworCisjZGVmaW5lIFJFR0lTVEVSX1RBQkxFX0RJTUVOU0lPTlMoXywgb2Zmc2V0LCBtaW5fcmV2LCBtYXhfcmV2LCBzdGVwLCByb3dzKSB7IFwKKwlvZmZzZXQsCQkJCQkJCQlcCisJUkVHSVNURVJfUkVWSVNJT05fICMjIG1pbl9yZXYsIFJFR0lTVEVSX1JFVklTSU9OXyAjIyBtYXhfcmV2LAlcCisJc3RlcCwgcm93cwkJCQkJCQlcCit9CisjZGVmaW5lIFJFR0lTVEVSX1RBQkxFKG5hbWUsIG1pbl9yZXYsIG1heF9yZXYpIAkJCQlcCisJUkVHSVNURVJfVEFCTEVfRElNRU5TSU9OUygJCQkJCVwKKwkJbmFtZSwgRlJfICMjIG1pbl9yZXYgIyMgbWF4X3JldiAjIyBfICMjIG5hbWUsCQlcCisJCW1pbl9yZXYsIG1heF9yZXYsCQkJCQlcCisJCUZSXyAjIyBtaW5fcmV2ICMjIG1heF9yZXYgIyMgXyAjIyBuYW1lICMjIF9TVEVQLAlcCisJCUZSXyAjIyBtaW5fcmV2ICMjIG1heF9yZXYgIyMgXyAjIyBuYW1lICMjIF9ST1dTKQorI2RlZmluZSBSRUdJU1RFUl9UQUJMRV9BQShuYW1lKSBSRUdJU1RFUl9UQUJMRShuYW1lLCBBLCBBKQorI2RlZmluZSBSRUdJU1RFUl9UQUJMRV9BWihuYW1lKSBSRUdJU1RFUl9UQUJMRShuYW1lLCBBLCBaKQorI2RlZmluZSBSRUdJU1RFUl9UQUJMRV9CQihuYW1lKSBSRUdJU1RFUl9UQUJMRShuYW1lLCBCLCBCKQorI2RlZmluZSBSRUdJU1RFUl9UQUJMRV9CWihuYW1lKSBSRUdJU1RFUl9UQUJMRShuYW1lLCBCLCBaKQorI2RlZmluZSBSRUdJU1RFUl9UQUJMRV9CQl9DWihuYW1lKQkJCQkJXAorCVJFR0lTVEVSX1RBQkxFX0RJTUVOU0lPTlMobmFtZSwgRlJfQlpfICMjIG5hbWUsIEIsIEIsCQlcCisJCQkJICBGUl9CWl8gIyMgbmFtZSAjIyBfU1RFUCwJCVwKKwkJCQkgIEZSX0JCXyAjIyBuYW1lICMjIF9ST1dTKSwJCVwKKwlSRUdJU1RFUl9UQUJMRV9ESU1FTlNJT05TKG5hbWUsIEZSX0JaXyAjIyBuYW1lLCBDLCBaLAkJXAorCQkJCSAgRlJfQlpfICMjIG5hbWUgIyMgX1NURVAsCQlcCisJCQkJICBGUl9DWl8gIyMgbmFtZSAjIyBfUk9XUykKKyNkZWZpbmUgUkVHSVNURVJfVEFCTEVfQ1oobmFtZSkgUkVHSVNURVJfVEFCTEUobmFtZSwgQywgWikKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlZnhfbmljX3JlZ190YWJsZSBlZnhfbmljX3JlZ190YWJsZXNbXSA9IHsKKwkvKiBEUklWRVIgaXMgbm90IHVzZWQgKi8KKwkvKiBFVlFfUlBUUiwgVElNRVJfQ09NTUFORCwgVVNSX0VWIGFuZCB7UlgsVFh9X0RFU0NfVVBEIGFyZSBXTyAqLworCVJFR0lTVEVSX1RBQkxFX0JCKFRYX0lQRklMX1RCTCksCisJUkVHSVNURVJfVEFCTEVfQkIoVFhfU1JDX01BQ19UQkwpLAorCVJFR0lTVEVSX1RBQkxFX0FBKFJYX0RFU0NfUFRSX1RCTF9LRVIpLAorCVJFR0lTVEVSX1RBQkxFX0JCX0NaKFJYX0RFU0NfUFRSX1RCTCksCisJUkVHSVNURVJfVEFCTEVfQUEoVFhfREVTQ19QVFJfVEJMX0tFUiksCisJUkVHSVNURVJfVEFCTEVfQkJfQ1ooVFhfREVTQ19QVFJfVEJMKSwKKwlSRUdJU1RFUl9UQUJMRV9BQShFVlFfUFRSX1RCTF9LRVIpLAorCVJFR0lTVEVSX1RBQkxFX0JCX0NaKEVWUV9QVFJfVEJMKSwKKwkvKiBUaGUgcmVnaXN0ZXIgYnVmZmVyIGlzIGFsbG9jYXRlZCB3aXRoIHNsYWIsIHNvIHdlIGNhbid0CisJICogcmVhc29uYWJseSByZWFkIGFsbCBvZiB0aGUgYnVmZmVyIHRhYmxlICh1cCB0byA4TUIhKS4KKwkgKiBIb3dldmVyIHRoaXMgZHJpdmVyIHdpbGwgb25seSB1c2UgYSBmZXcgZW50cmllcy4gIFJlYWRpbmcKKwkgKiAxSyBlbnRyaWVzIGFsbG93cyBmb3Igc29tZSBleHBhbnNpb24gb2YgcXVldWUgY291bnQgYW5kCisJICogc2l6ZSBiZWZvcmUgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHZlcnNpb24uICovCisJUkVHSVNURVJfVEFCTEVfRElNRU5TSU9OUyhCVUZfRlVMTF9UQkxfS0VSLCBGUl9BQV9CVUZfRlVMTF9UQkxfS0VSLAorCQkJCSAgQSwgQSwgOCwgMTAyNCksCisJUkVHSVNURVJfVEFCTEVfRElNRU5TSU9OUyhCVUZfRlVMTF9UQkwsIEZSX0JaX0JVRl9GVUxMX1RCTCwKKwkJCQkgIEIsIFosIDgsIDEwMjQpLAorCS8qIFJYX0ZJTFRFUl9UQkx7MCwxfSBpcyBodWdlIGFuZCBub3QgdXNlZCBieSB0aGlzIGRyaXZlciAqLworCVJFR0lTVEVSX1RBQkxFX0NaKFJYX01BQ19GSUxURVJfVEJMMCksCisJUkVHSVNURVJfVEFCTEVfQkJfQ1ooVElNRVJfVEJMKSwKKwlSRUdJU1RFUl9UQUJMRV9CQl9DWihUWF9QQUNFX1RCTCksCisJUkVHSVNURVJfVEFCTEVfQlooUlhfSU5ESVJFQ1RJT05fVEJMKSwKKwkvKiBUWF9GSUxURVJfVEJMMCBpcyBodWdlIGFuZCBub3QgdXNlZCBieSB0aGlzIGRyaXZlciAqLworCVJFR0lTVEVSX1RBQkxFX0NaKFRYX01BQ19GSUxURVJfVEJMMCksCisJUkVHSVNURVJfVEFCTEVfQ1ooTUNfVFJFR19TTUVNKSwKKwkvKiBNU0lYX1BCQV9UQUJMRSBpcyBub3QgbWFwcGVkICovCisJLyogU1JNX0RCRyBpcyBub3QgbWFwcGVkIChhbmQgaXMgcmVkdW5kYW50IHdpdGggQlVGX0ZMTF9UQkwpICovCit9OworCitzaXplX3QgZWZ4X25pY19nZXRfcmVnc19sZW4oc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwljb25zdCBzdHJ1Y3QgZWZ4X25pY19yZWcgKnJlZzsKKwljb25zdCBzdHJ1Y3QgZWZ4X25pY19yZWdfdGFibGUgKnRhYmxlOworCXNpemVfdCBsZW4gPSAwOworCisJZm9yIChyZWcgPSBlZnhfbmljX3JlZ3M7CisJICAgICByZWcgPCBlZnhfbmljX3JlZ3MgKyBBUlJBWV9TSVpFKGVmeF9uaWNfcmVncyk7CisJICAgICByZWcrKykKKwkJaWYgKGVmeC0+dHlwZS0+cmV2aXNpb24gPj0gcmVnLT5taW5fcmV2aXNpb24gJiYKKwkJICAgIGVmeC0+dHlwZS0+cmV2aXNpb24gPD0gcmVnLT5tYXhfcmV2aXNpb24pCisJCQlsZW4gKz0gc2l6ZW9mKGVmeF9vd29yZF90KTsKKworCWZvciAodGFibGUgPSBlZnhfbmljX3JlZ190YWJsZXM7CisJICAgICB0YWJsZSA8IGVmeF9uaWNfcmVnX3RhYmxlcyArIEFSUkFZX1NJWkUoZWZ4X25pY19yZWdfdGFibGVzKTsKKwkgICAgIHRhYmxlKyspCisJCWlmIChlZngtPnR5cGUtPnJldmlzaW9uID49IHRhYmxlLT5taW5fcmV2aXNpb24gJiYKKwkJICAgIGVmeC0+dHlwZS0+cmV2aXNpb24gPD0gdGFibGUtPm1heF9yZXZpc2lvbikKKwkJCWxlbiArPSB0YWJsZS0+cm93cyAqIG1pbl90KHNpemVfdCwgdGFibGUtPnN0ZXAsIDE2KTsKKworCXJldHVybiBsZW47Cit9CisKK3ZvaWQgZWZ4X25pY19nZXRfcmVncyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB2b2lkICpidWYpCit7CisJY29uc3Qgc3RydWN0IGVmeF9uaWNfcmVnICpyZWc7CisJY29uc3Qgc3RydWN0IGVmeF9uaWNfcmVnX3RhYmxlICp0YWJsZTsKKworCWZvciAocmVnID0gZWZ4X25pY19yZWdzOworCSAgICAgcmVnIDwgZWZ4X25pY19yZWdzICsgQVJSQVlfU0laRShlZnhfbmljX3JlZ3MpOworCSAgICAgcmVnKyspIHsKKwkJaWYgKGVmeC0+dHlwZS0+cmV2aXNpb24gPj0gcmVnLT5taW5fcmV2aXNpb24gJiYKKwkJICAgIGVmeC0+dHlwZS0+cmV2aXNpb24gPD0gcmVnLT5tYXhfcmV2aXNpb24pIHsKKwkJCWVmeF9yZWFkbyhlZngsIChlZnhfb3dvcmRfdCAqKWJ1ZiwgcmVnLT5vZmZzZXQpOworCQkJYnVmICs9IHNpemVvZihlZnhfb3dvcmRfdCk7CisJCX0KKwl9CisKKwlmb3IgKHRhYmxlID0gZWZ4X25pY19yZWdfdGFibGVzOworCSAgICAgdGFibGUgPCBlZnhfbmljX3JlZ190YWJsZXMgKyBBUlJBWV9TSVpFKGVmeF9uaWNfcmVnX3RhYmxlcyk7CisJICAgICB0YWJsZSsrKSB7CisJCXNpemVfdCBzaXplLCBpOworCisJCWlmICghKGVmeC0+dHlwZS0+cmV2aXNpb24gPj0gdGFibGUtPm1pbl9yZXZpc2lvbiAmJgorCQkgICAgICBlZngtPnR5cGUtPnJldmlzaW9uIDw9IHRhYmxlLT5tYXhfcmV2aXNpb24pKQorCQkJY29udGludWU7CisKKwkJc2l6ZSA9IG1pbl90KHNpemVfdCwgdGFibGUtPnN0ZXAsIDE2KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnJvd3M7IGkrKykgeworCQkJc3dpdGNoICh0YWJsZS0+c3RlcCkgeworCQkJY2FzZSA0OiAvKiAzMi1iaXQgcmVnaXN0ZXIgb3IgU1JBTSAqLworCQkJCWVmeF9yZWFkZF90YWJsZShlZngsIGJ1ZiwgdGFibGUtPm9mZnNldCwgaSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6IC8qIDY0LWJpdCBTUkFNICovCisJCQkJZWZ4X3NyYW1fcmVhZHEoZWZ4LAorCQkJCQkgICAgICAgZWZ4LT5tZW1iYXNlICsgdGFibGUtPm9mZnNldCwKKwkJCQkJICAgICAgIGJ1ZiwgaSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OiAvKiAxMjgtYml0IHJlZ2lzdGVyICovCisJCQkJZWZ4X3JlYWRvX3RhYmxlKGVmeCwgYnVmLCB0YWJsZS0+b2Zmc2V0LCBpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6IC8qIDEyOC1iaXQgcmVnaXN0ZXIsIGludGVybGVhdmVkICovCisJCQkJZWZ4X3JlYWRvX3RhYmxlKGVmeCwgYnVmLCB0YWJsZS0+b2Zmc2V0LCAyICogaSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVdBUk5fT04oMSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnVmICs9IHNpemU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvbmljLmggYi9kcml2ZXJzL25ldC9zZmMvbmljLmgKaW5kZXggYmJjMmMwYy4uMDQzOGRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9uaWMuaApAQCAtMTQyLDcgKzE0Miw2IEBACiAJdTMyIGZ3X2J1aWxkOwogCXN0cnVjdCBlZnhfbWNkaV9pZmFjZSBtY2RpOwogCWludCB3b2xfZmlsdGVyX2lkOwotCXU4IGlwdjZfcnNzX2tleVs0MF07CiB9OwogCiBleHRlcm4gdm9pZCBzaWVuYV9wcmludF9md3ZlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBjaGFyICpidWYsIHNpemVfdCBsZW4pOwpAQCAtMTkwLDggKzE4OSw4IEBACiAvKiBJbnRlcnJ1cHRzIGFuZCB0ZXN0IGV2ZW50cyAqLwogZXh0ZXJuIGludCBlZnhfbmljX2luaXRfaW50ZXJydXB0KHN0cnVjdCBlZnhfbmljICplZngpOwogZXh0ZXJuIHZvaWQgZWZ4X25pY19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKLWV4dGVybiB2b2lkIGVmeF9uaWNfZ2VuZXJhdGVfdGVzdF9ldmVudChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkJCXVuc2lnbmVkIGludCBtYWdpYyk7CitleHRlcm4gdm9pZCBlZnhfbmljX2dlbmVyYXRlX3Rlc3RfZXZlbnQoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKTsKK2V4dGVybiB2b2lkIGVmeF9uaWNfZ2VuZXJhdGVfZmlsbF9ldmVudChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpOwogZXh0ZXJuIHZvaWQgZWZ4X25pY19nZW5lcmF0ZV9pbnRlcnJ1cHQoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiBleHRlcm4gdm9pZCBlZnhfbmljX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiB2b2lkIGVmeF9uaWNfZmluaV9pbnRlcnJ1cHQoc3RydWN0IGVmeF9uaWMgKmVmeCk7CkBAIC0yMDgsNiArMjA3LDcgQEAKIGV4dGVybiB2b2lkIGZhbGNvbl9zZXR1cF94YXVpKHN0cnVjdCBlZnhfbmljICplZngpOwogZXh0ZXJuIGludCBmYWxjb25fcmVzZXRfeGF1aShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiB2b2lkIGVmeF9uaWNfaW5pdF9jb21tb24oc3RydWN0IGVmeF9uaWMgKmVmeCk7CitleHRlcm4gdm9pZCBlZnhfbmljX3B1c2hfcnhfaW5kaXJfdGFibGUoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAKIGludCBlZnhfbmljX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X2J1ZmZlciAqYnVmZmVyLAogCQkJIHVuc2lnbmVkIGludCBsZW4pOwpAQCAtMjIyLDYgKzIyMiw5IEBACiAJCQkJICBjb25zdCBzdHJ1Y3QgZWZ4X25pY19yZWdpc3Rlcl90ZXN0ICpyZWdzLAogCQkJCSAgc2l6ZV90IG5fcmVncyk7CiAKK2V4dGVybiBzaXplX3QgZWZ4X25pY19nZXRfcmVnc19sZW4oc3RydWN0IGVmeF9uaWMgKmVmeCk7CitleHRlcm4gdm9pZCBlZnhfbmljX2dldF9yZWdzKHN0cnVjdCBlZnhfbmljICplZngsIHZvaWQgKmJ1Zik7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZhbGNvbiBNQUMgc3RhdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9xdDIwMnhfcGh5LmMgYi9kcml2ZXJzL25ldC9zZmMvcXQyMDJ4X3BoeS5jCmluZGV4IGUwNzdiZWYuLjY4ODEzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9xdDIwMnhfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3F0MjAyeF9waHkuYwpAQCAtOTEsOSArOTEsMTAgQEAKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKIAkJCS8qIFNvbWUgY2FibGVzIGhhdmUgRUVQUk9NcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlCiAJCQkgKiBQSFkncyBvbi1ib2FyZCBFRVBST00gc28gaXQgY2Fubm90IGxvYWQgZmlybXdhcmUgKi8KLQkJCUVGWF9FUlIoZWZ4LCAiSWYgYW4gU0ZQKyBkaXJlY3QgYXR0YWNoIGNhYmxlIGlzIgotCQkJCSIgY29ubmVjdGVkLCBwbGVhc2UgY2hlY2sgdGhhdCBpdCBjb21wbGllcyIKLQkJCQkiIHdpdGggdGhlIFNGUCsgc3BlY2lmaWNhdGlvblxuIik7CisJCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIklmIGFuIFNGUCsgZGlyZWN0IGF0dGFjaCBjYWJsZSBpcyIKKwkJCQkgICIgY29ubmVjdGVkLCBwbGVhc2UgY2hlY2sgdGhhdCBpdCBjb21wbGllcyIKKwkJCQkgICIgd2l0aCB0aGUgU0ZQKyBzcGVjaWZpY2F0aW9uXG4iKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAJCW1zbGVlcChRVDIwMjVDX0hFQVJUQl9XQUlUKTsKQEAgLTE0NSw3ICsxNDYsOCBAQAogCQkvKiBCdWcgMTc2ODk6IG9jY2FzaW9uYWxseSBoZWFydGJlYXQgc3RhcnRzIGJ1dCBmaXJtd2FyZSBzdGF0dXMKIAkJICogY29kZSBuZXZlciBwcm9ncmVzc2VzIGJleW9uZCAweDAwLiAgVHJ5IGFnYWluLCBvbmNlLCBhZnRlcgogCQkgKiByZXN0YXJ0aW5nIGV4ZWN1dGlvbiBvZiB0aGUgZmlybXdhcmUgaW1hZ2UuICovCi0JCUVGWF9MT0coZWZ4LCAiYmFzaGluZyBRVDIwMjVDIG1pY3JvY29udHJvbGxlclxuIik7CisJCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsCisJCQkgICJiYXNoaW5nIFFUMjAyNUMgbWljcm9jb250cm9sbGVyXG4iKTsKIAkJcXQyMDI1Y19yZXN0YXJ0X2Zpcm13YXJlKGVmeCk7CiAJCXJjID0gcXQyMDI1Y193YWl0X2hlYXJ0YmVhdChlZngpOwogCQlpZiAocmMgIT0gMCkKQEAgLTE2NSwxMSArMTY3LDEyIEBACiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihmaXJtd2FyZV9pZCk7IGkrKykKIAkJZmlybXdhcmVfaWRbaV0gPSBlZnhfbWRpb19yZWFkKGVmeCwgTURJT19NTURfUENTLAogCQkJCQkgICAgICAgUENTX0ZXX1BST0RVQ1RfQ09ERV8xICsgaSk7Ci0JRUZYX0lORk8oZWZ4LCAiUVQyMDI1QyBmaXJtd2FyZSAleHIlZCB2JWQuJWQuJWQuJWQgWzIwJTAyZC0lMDJkLSUwMmRdXG4iLAotCQkgKGZpcm13YXJlX2lkWzBdIDw8IDgpIHwgZmlybXdhcmVfaWRbMV0sIGZpcm13YXJlX2lkWzJdLAotCQkgZmlybXdhcmVfaWRbM10gPj4gNCwgZmlybXdhcmVfaWRbM10gJiAweGYsCi0JCSBmaXJtd2FyZV9pZFs0XSwgZmlybXdhcmVfaWRbNV0sCi0JCSBmaXJtd2FyZV9pZFs2XSwgZmlybXdhcmVfaWRbN10sIGZpcm13YXJlX2lkWzhdKTsKKwluZXRpZl9pbmZvKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAgIlFUMjAyNUMgZmlybXdhcmUgJXhyJWQgdiVkLiVkLiVkLiVkIFsyMCUwMmQtJTAyZC0lMDJkXVxuIiwKKwkJICAgKGZpcm13YXJlX2lkWzBdIDw8IDgpIHwgZmlybXdhcmVfaWRbMV0sIGZpcm13YXJlX2lkWzJdLAorCQkgICBmaXJtd2FyZV9pZFszXSA+PiA0LCBmaXJtd2FyZV9pZFszXSAmIDB4ZiwKKwkJICAgZmlybXdhcmVfaWRbNF0sIGZpcm13YXJlX2lkWzVdLAorCQkgICBmaXJtd2FyZV9pZFs2XSwgZmlybXdhcmVfaWRbN10sIGZpcm13YXJlX2lkWzhdKTsKIAlwaHlfZGF0YS0+ZmlybXdhcmVfdmVyID0gKChmaXJtd2FyZV9pZFszXSAmIDB4ZjApIDw8IDIwKSB8CiAJCQkJICgoZmlybXdhcmVfaWRbM10gJiAweDBmKSA8PCAxNikgfAogCQkJCSAoZmlybXdhcmVfaWRbNF0gPDwgOCkgfCBmaXJtd2FyZV9pZFs1XTsKQEAgLTE5OCw3ICsyMDEsNyBAQAogCX0KIAogCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHBoeV9kYXRhLT5idWcxNzE5MF90aW1lcikpIHsKLQkJRUZYX0xPRyhlZngsICJiYXNoaW5nIFFUMjAyNUMgUE1BL1BNRFxuIik7CisJCW5ldGlmX2RiZyhlZngsIGh3LCBlZngtPm5ldF9kZXYsICJiYXNoaW5nIFFUMjAyNUMgUE1BL1BNRFxuIik7CiAJCWVmeF9tZGlvX3NldF9mbGFnKGVmeCwgTURJT19NTURfUE1BUE1ELCBNRElPX0NUUkwxLAogCQkJCSAgTURJT19QTUFfQ1RSTDFfTE9PUEJBQ0ssIHRydWUpOwogCQltc2xlZXAoMTAwKTsKQEAgLTIzMSw3ICsyMzQsOCBAQAogCXJlZyA9IGVmeF9tZGlvX3JlYWQoZWZ4LCAxLCAweGMzMTkpOwogCWlmICgocmVnICYgMHgwMDM4KSA9PSBwaHlfb3BfbW9kZSkKIAkJcmV0dXJuIDA7Ci0JRUZYX0xPRyhlZngsICJTd2l0Y2hpbmcgUEhZIHRvIG1vZGUgMHglMDR4XG4iLCBwaHlfb3BfbW9kZSk7CisJbmV0aWZfZGJnKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgIlN3aXRjaGluZyBQSFkgdG8gbW9kZSAweCUwNHhcbiIsCisJCSAgcGh5X29wX21vZGUpOwogCiAJLyogVGhpcyBzZXF1ZW5jZSByZXBsaWNhdGVzIHRoZSByZWdpc3RlciB3cml0ZXMgY29uZmlndXJlZCBpbiB0aGUgYm9vdAogCSAqIEVFUFJPTSAoaW5jbHVkaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGJvYXJkIHJldmlzaW9ucyksIGV4Y2VwdApAQCAtMjg3LDggKzI5MSw5IEBACiAJLyogV2FpdCBmb3IgdGhlIG1pY3JvY29udHJvbGxlciB0byBiZSByZWFkeSBhZ2FpbiAqLwogCXJjID0gcXQyMDI1Y193YWl0X3Jlc2V0KGVmeCk7CiAJaWYgKHJjIDwgMCkgewotCQlFRlhfRVJSKGVmeCwgIlBIWSBtaWNyb2NvbnRyb2xsZXIgcmVzZXQgZHVyaW5nIG1vZGUgc3dpdGNoICIKLQkJCQkidGltZWQgb3V0XG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlBIWSBtaWNyb2NvbnRyb2xsZXIgcmVzZXQgZHVyaW5nIG1vZGUgc3dpdGNoICIKKwkJCSAgInRpbWVkIG91dFxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTMyNCw3ICszMjksNyBAQAogCXJldHVybiAwOwogCiAgZmFpbDoKLQlFRlhfRVJSKGVmeCwgIlBIWSByZXNldCB0aW1lZCBvdXRcbiIpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICJQSFkgcmVzZXQgdGltZWQgb3V0XG4iKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTM1MywxNCArMzU4LDE1IEBACiAKIAlyYyA9IHF0MjAyeF9yZXNldF9waHkoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJQSFkgaW5pdCBmYWlsZWRcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiUEhZIGluaXQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJjOwogCX0KIAogCWRldmlkID0gZWZ4X21kaW9fcmVhZF9pZChlZngsIE1ESU9fTU1EX1BIWVhTKTsKLQlFRlhfSU5GTyhlZngsICJQSFkgSUQgcmVnICV4IChPVUkgJTA2eCBtb2RlbCAlMDJ4IHJldmlzaW9uICV4KVxuIiwKLQkJIGRldmlkLCBlZnhfbWRpb19pZF9vdWkoZGV2aWQpLCBlZnhfbWRpb19pZF9tb2RlbChkZXZpZCksCi0JCSBlZnhfbWRpb19pZF9yZXYoZGV2aWQpKTsKKwluZXRpZl9pbmZvKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAgIlBIWSBJRCByZWcgJXggKE9VSSAlMDZ4IG1vZGVsICUwMnggcmV2aXNpb24gJXgpXG4iLAorCQkgICBkZXZpZCwgZWZ4X21kaW9faWRfb3VpKGRldmlkKSwgZWZ4X21kaW9faWRfbW9kZWwoZGV2aWQpLAorCQkgICBlZnhfbWRpb19pZF9yZXYoZGV2aWQpKTsKIAogCWlmIChlZngtPnBoeV90eXBlID09IFBIWV9UWVBFX1FUMjAyNUMpCiAJCXF0MjAyNWNfZmlybXdhcmVfaWQoZWZ4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9yeC5jIGIvZHJpdmVycy9uZXQvc2ZjL3J4LmMKaW5kZXggZTMwODgxOC4uNzk5YzQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3J4LmMKQEAgLTI1LDYgKzI1LDkgQEAKIC8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyBwdXNoZWQgYXQgb25jZS4gKi8KICNkZWZpbmUgRUZYX1JYX0JBVENIICA4CiAKKy8qIE1heGltdW0gc2l6ZSBvZiBhIGJ1ZmZlciBzaGFyaW5nIGEgcGFnZSAqLworI2RlZmluZSBFRlhfUlhfSEFMRl9QQUdFICgoUEFHRV9TSVpFID4+IDEpIC0gc2l6ZW9mKHN0cnVjdCBlZnhfcnhfcGFnZV9zdGF0ZSkpCisKIC8qIFNpemUgb2YgYnVmZmVyIGFsbG9jYXRlZCBmb3Igc2tiIGhlYWRlciBhcmVhLiAqLwogI2RlZmluZSBFRlhfU0tCX0hFQURFUlMgIDY0dQogCkBAIC05OCwxNTUgKzEwMSwxNTEgQEAKIAlyZXR1cm4gUEFHRV9TSVpFIDw8IGVmeC0+cnhfYnVmZmVyX29yZGVyOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBlZnhfcnhfYnVmX2hhc2goc3RydWN0IGVmeF9yeF9idWZmZXIgKmJ1ZikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTKSB8fCBORVRfSVBfQUxJR04gJSA0ID09IDAKKwlyZXR1cm4gX19sZTMyX3RvX2NwdXAoKGNvbnN0IF9fbGUzMiAqKShidWYtPmRhdGEgLSA0KSk7CisjZWxzZQorCWNvbnN0IHU4ICpkYXRhID0gKGNvbnN0IHU4ICopKGJ1Zi0+ZGF0YSAtIDQpOworCXJldHVybiAoKHUzMilkYXRhWzBdICAgICAgIHwKKwkJKHUzMilkYXRhWzFdIDw8IDggIHwKKwkJKHUzMilkYXRhWzJdIDw8IDE2IHwKKwkJKHUzMilkYXRhWzNdIDw8IDI0KTsKKyNlbmRpZgorfQogCiAvKioKLSAqIGVmeF9pbml0X3J4X2J1ZmZlcl9za2IgLSBjcmVhdGUgbmV3IFJYIGJ1ZmZlciB1c2luZyBza2ItYmFzZWQgYWxsb2NhdGlvbgorICogZWZ4X2luaXRfcnhfYnVmZmVyc19za2IgLSBjcmVhdGUgRUZYX1JYX0JBVENIIHNrYi1iYXNlZCBSWCBidWZmZXJzCiAgKgogICogQHJ4X3F1ZXVlOgkJRWZ4IFJYIHF1ZXVlCi0gKiBAcnhfYnVmOgkJUlggYnVmZmVyIHN0cnVjdHVyZSB0byBwb3B1bGF0ZQogICoKLSAqIFRoaXMgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBuZXcgcmVjZWl2ZSBidWZmZXIsIG1hcHMgaXQgZm9yIERNQSwKLSAqIGFuZCBwb3B1bGF0ZXMgYSBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciB3aXRoIHRoZSByZWxldmFudAotICogaW5mb3JtYXRpb24uICBSZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIDAgb24gc3VjY2Vzcy4KKyAqIFRoaXMgYWxsb2NhdGVzIEVGWF9SWF9CQVRDSCBza2JzLCBtYXBzIHRoZW0gZm9yIERNQSwgYW5kIHBvcHVsYXRlcyBhCisgKiBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciBmb3IgZWFjaCBvbmUuIFJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgMAorICogb24gc3VjY2Vzcy4gTWF5IGZhaWwgaGF2aW5nIG9ubHkgaW5zZXJ0ZWQgZmV3ZXIgdGhhbiBFRlhfUlhfQkFUQ0gKKyAqIGJ1ZmZlcnMuCiAgKi8KLXN0YXRpYyBpbnQgZWZ4X2luaXRfcnhfYnVmZmVyX3NrYihzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSwKLQkJCQkgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCitzdGF0aWMgaW50IGVmeF9pbml0X3J4X2J1ZmZlcnNfc2tiKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSByeF9xdWV1ZS0+ZWZ4OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gZWZ4LT5uZXRfZGV2OworCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWY7CiAJaW50IHNrYl9sZW4gPSBlZngtPnJ4X2J1ZmZlcl9sZW47CisJdW5zaWduZWQgaW5kZXgsIGNvdW50OwogCi0JcnhfYnVmLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5ldF9kZXYsIHNrYl9sZW4pOwotCWlmICh1bmxpa2VseSghcnhfYnVmLT5za2IpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBFRlhfUlhfQkFUQ0g7ICsrY291bnQpIHsKKwkJaW5kZXggPSByeF9xdWV1ZS0+YWRkZWRfY291bnQgJiBFRlhfUlhRX01BU0s7CisJCXJ4X2J1ZiA9IGVmeF9yeF9idWZmZXIocnhfcXVldWUsIGluZGV4KTsKIAotCS8qIEFkanVzdCB0aGUgU0tCIGZvciBwYWRkaW5nIGFuZCBjaGVja3N1bSAqLwotCXNrYl9yZXNlcnZlKHJ4X2J1Zi0+c2tiLCBORVRfSVBfQUxJR04pOwotCXJ4X2J1Zi0+bGVuID0gc2tiX2xlbiAtIE5FVF9JUF9BTElHTjsKLQlyeF9idWYtPmRhdGEgPSAoY2hhciAqKXJ4X2J1Zi0+c2tiLT5kYXRhOwotCXJ4X2J1Zi0+c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJcnhfYnVmLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5ldF9kZXYsIHNrYl9sZW4pOworCQlpZiAodW5saWtlbHkoIXJ4X2J1Zi0+c2tiKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyeF9idWYtPnBhZ2UgPSBOVUxMOwogCi0JcnhfYnVmLT5kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGVmeC0+cGNpX2RldiwKLQkJCQkJICByeF9idWYtPmRhdGEsIHJ4X2J1Zi0+bGVuLAotCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCS8qIEFkanVzdCB0aGUgU0tCIGZvciBwYWRkaW5nIGFuZCBjaGVja3N1bSAqLworCQlza2JfcmVzZXJ2ZShyeF9idWYtPnNrYiwgTkVUX0lQX0FMSUdOKTsKKwkJcnhfYnVmLT5sZW4gPSBza2JfbGVuIC0gTkVUX0lQX0FMSUdOOworCQlyeF9idWYtPmRhdGEgPSAoY2hhciAqKXJ4X2J1Zi0+c2tiLT5kYXRhOworCQlyeF9idWYtPnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKLQlpZiAodW5saWtlbHkocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGVmeC0+cGNpX2RldiwgcnhfYnVmLT5kbWFfYWRkcikpKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHJ4X2J1Zi0+c2tiKTsKLQkJcnhfYnVmLT5za2IgPSBOVUxMOwotCQlyZXR1cm4gLUVJTzsKKwkJcnhfYnVmLT5kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGVmeC0+cGNpX2RldiwKKwkJCQkJCSAgcnhfYnVmLT5kYXRhLCByeF9idWYtPmxlbiwKKwkJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KHBjaV9kbWFfbWFwcGluZ19lcnJvcihlZngtPnBjaV9kZXYsCisJCQkJCQkgICByeF9idWYtPmRtYV9hZGRyKSkpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHJ4X2J1Zi0+c2tiKTsKKwkJCXJ4X2J1Zi0+c2tiID0gTlVMTDsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJKytyeF9xdWV1ZS0+YWRkZWRfY291bnQ7CisJCSsrcnhfcXVldWUtPmFsbG9jX3NrYl9jb3VudDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBlZnhfaW5pdF9yeF9idWZmZXJfcGFnZSAtIGNyZWF0ZSBuZXcgUlggYnVmZmVyIHVzaW5nIHBhZ2UtYmFzZWQgYWxsb2NhdGlvbgorICogZWZ4X2luaXRfcnhfYnVmZmVyc19wYWdlIC0gY3JlYXRlIEVGWF9SWF9CQVRDSCBwYWdlLWJhc2VkIFJYIGJ1ZmZlcnMKICAqCiAgKiBAcnhfcXVldWU6CQlFZnggUlggcXVldWUKLSAqIEByeF9idWY6CQlSWCBidWZmZXIgc3RydWN0dXJlIHRvIHBvcHVsYXRlCiAgKgotICogVGhpcyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBhIG5ldyByZWNlaXZlIGJ1ZmZlciwgbWFwcyBpdCBmb3IgRE1BLAotICogYW5kIHBvcHVsYXRlcyBhIHN0cnVjdCBlZnhfcnhfYnVmZmVyIHdpdGggdGhlIHJlbGV2YW50Ci0gKiBpbmZvcm1hdGlvbi4gIFJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgMCBvbiBzdWNjZXNzLgorICogVGhpcyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBFRlhfUlhfQkFUQ0ggcmVjZWl2ZSBidWZmZXJzLCBtYXBzIHRoZW0gZm9yIERNQSwKKyAqIGFuZCBwb3B1bGF0ZXMgc3RydWN0IGVmeF9yeF9idWZmZXJzIGZvciBlYWNoIG9uZS4gUmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGUgb3IgMCBvbiBzdWNjZXNzLiBJZiBhIHNpbmdsZSBwYWdlIGNhbiBiZSBzcGxpdCBiZXR3ZWVuIHR3byBidWZmZXJzLAorICogdGhlbiB0aGUgcGFnZSB3aWxsIGVpdGhlciBiZSBpbnNlcnRlZCBmdWxseSwgb3Igbm90IGF0IGF0IGFsbC4KICAqLwotc3RhdGljIGludCBlZnhfaW5pdF9yeF9idWZmZXJfcGFnZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSwKLQkJCQkgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQorc3RhdGljIGludCBlZnhfaW5pdF9yeF9idWZmZXJzX3BhZ2Uoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHJ4X3F1ZXVlLT5lZng7Ci0JaW50IGJ5dGVzLCBzcGFjZSwgb2Zmc2V0OworCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWY7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdm9pZCAqcGFnZV9hZGRyOworCXN0cnVjdCBlZnhfcnhfcGFnZV9zdGF0ZSAqc3RhdGU7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1bnNpZ25lZCBpbmRleCwgY291bnQ7CiAKLQlieXRlcyA9IGVmeC0+cnhfYnVmZmVyX2xlbiAtIEVGWF9QQUdFX0lQX0FMSUdOOworCS8qIFdlIGNhbiBzcGxpdCBhIHBhZ2UgYmV0d2VlbiB0d28gYnVmZmVycyAqLworCUJVSUxEX0JVR19PTihFRlhfUlhfQkFUQ0ggJiAxKTsKIAotCS8qIElmIHRoZXJlIGlzIHNwYWNlIGxlZnQgaW4gdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHBhZ2UsCi0JICogdGhlbiB1c2UgaXQuIE90aGVyd2lzZSBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KLQlyeF9idWYtPnBhZ2UgPSByeF9xdWV1ZS0+YnVmX3BhZ2U7Ci0JaWYgKHJ4X2J1Zi0+cGFnZSA9PSBOVUxMKSB7Ci0JCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0KLQkJcnhfYnVmLT5wYWdlID0gYWxsb2NfcGFnZXMoX19HRlBfQ09MRCB8IF9fR0ZQX0NPTVAgfCBHRlBfQVRPTUlDLAotCQkJCQkgICBlZngtPnJ4X2J1ZmZlcl9vcmRlcik7Ci0JCWlmICh1bmxpa2VseShyeF9idWYtPnBhZ2UgPT0gTlVMTCkpCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgRUZYX1JYX0JBVENIOyArK2NvdW50KSB7CisJCXBhZ2UgPSBhbGxvY19wYWdlcyhfX0dGUF9DT0xEIHwgX19HRlBfQ09NUCB8IEdGUF9BVE9NSUMsCisJCQkJICAgZWZ4LT5yeF9idWZmZXJfb3JkZXIpOworCQlpZiAodW5saWtlbHkocGFnZSA9PSBOVUxMKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCWRtYV9hZGRyID0gcGNpX21hcF9wYWdlKGVmeC0+cGNpX2RldiwgcnhfYnVmLT5wYWdlLAotCQkJCQkwLCBlZnhfcnhfYnVmX3NpemUoZWZ4KSwKKwkJZG1hX2FkZHIgPSBwY2lfbWFwX3BhZ2UoZWZ4LT5wY2lfZGV2LCBwYWdlLCAwLAorCQkJCQllZnhfcnhfYnVmX3NpemUoZWZ4KSwKIAkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQogCQlpZiAodW5saWtlbHkocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGVmeC0+cGNpX2RldiwgZG1hX2FkZHIpKSkgewotCQkJX19mcmVlX3BhZ2VzKHJ4X2J1Zi0+cGFnZSwgZWZ4LT5yeF9idWZmZXJfb3JkZXIpOwotCQkJcnhfYnVmLT5wYWdlID0gTlVMTDsKKwkJCV9fZnJlZV9wYWdlcyhwYWdlLCBlZngtPnJ4X2J1ZmZlcl9vcmRlcik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQorCQlwYWdlX2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCXN0YXRlID0gcGFnZV9hZGRyOworCQlzdGF0ZS0+cmVmY250ID0gMDsKKwkJc3RhdGUtPmRtYV9hZGRyID0gZG1hX2FkZHI7CiAKLQkJcnhfcXVldWUtPmJ1Zl9wYWdlID0gcnhfYnVmLT5wYWdlOwotCQlyeF9xdWV1ZS0+YnVmX2RtYV9hZGRyID0gZG1hX2FkZHI7Ci0JCXJ4X3F1ZXVlLT5idWZfZGF0YSA9IChwYWdlX2FkZHJlc3MocnhfYnVmLT5wYWdlKSArCi0JCQkJICAgICAgRUZYX1BBR0VfSVBfQUxJR04pOwotCX0KKwkJcGFnZV9hZGRyICs9IHNpemVvZihzdHJ1Y3QgZWZ4X3J4X3BhZ2Vfc3RhdGUpOworCQlkbWFfYWRkciArPSBzaXplb2Yoc3RydWN0IGVmeF9yeF9wYWdlX3N0YXRlKTsKIAotCXJ4X2J1Zi0+bGVuID0gYnl0ZXM7Ci0JcnhfYnVmLT5kYXRhID0gcnhfcXVldWUtPmJ1Zl9kYXRhOwotCW9mZnNldCA9IGVmeF9yeF9idWZfb2Zmc2V0KHJ4X2J1Zik7Ci0JcnhfYnVmLT5kbWFfYWRkciA9IHJ4X3F1ZXVlLT5idWZfZG1hX2FkZHIgKyBvZmZzZXQ7CisJc3BsaXQ6CisJCWluZGV4ID0gcnhfcXVldWUtPmFkZGVkX2NvdW50ICYgRUZYX1JYUV9NQVNLOworCQlyeF9idWYgPSBlZnhfcnhfYnVmZmVyKHJ4X3F1ZXVlLCBpbmRleCk7CisJCXJ4X2J1Zi0+ZG1hX2FkZHIgPSBkbWFfYWRkciArIEVGWF9QQUdFX0lQX0FMSUdOOworCQlyeF9idWYtPnNrYiA9IE5VTEw7CisJCXJ4X2J1Zi0+cGFnZSA9IHBhZ2U7CisJCXJ4X2J1Zi0+ZGF0YSA9IHBhZ2VfYWRkciArIEVGWF9QQUdFX0lQX0FMSUdOOworCQlyeF9idWYtPmxlbiA9IGVmeC0+cnhfYnVmZmVyX2xlbiAtIEVGWF9QQUdFX0lQX0FMSUdOOworCQkrK3J4X3F1ZXVlLT5hZGRlZF9jb3VudDsKKwkJKytyeF9xdWV1ZS0+YWxsb2NfcGFnZV9jb3VudDsKKwkJKytzdGF0ZS0+cmVmY250OwogCi0JLyogVHJ5IHRvIHBhY2sgbXVsdGlwbGUgYnVmZmVycyBwZXIgcGFnZSAqLwotCWlmIChlZngtPnJ4X2J1ZmZlcl9vcmRlciA9PSAwKSB7Ci0JCS8qIFRoZSBuZXh0IGJ1ZmZlciBzdGFydHMgb24gdGhlIG5leHQgNTEyIGJ5dGUgYm91bmRhcnkgKi8KLQkJcnhfcXVldWUtPmJ1Zl9kYXRhICs9ICgoYnl0ZXMgKyAweDFmZikgJiB+MHgxZmYpOwotCQlvZmZzZXQgKz0gKChieXRlcyArIDB4MWZmKSAmIH4weDFmZik7Ci0KLQkJc3BhY2UgPSBlZnhfcnhfYnVmX3NpemUoZWZ4KSAtIG9mZnNldDsKLQkJaWYgKHNwYWNlID49IGJ5dGVzKSB7Ci0JCQkvKiBSZWZzIGRyb3BwZWQgb24ga2VybmVsIHJlbGVhc2luZyBlYWNoIHNrYiAqLwotCQkJZ2V0X3BhZ2UocnhfcXVldWUtPmJ1Zl9wYWdlKTsKLQkJCWdvdG8gb3V0OworCQlpZiAoKH5jb3VudCAmIDEpICYmIChlZngtPnJ4X2J1ZmZlcl9sZW4gPD0gRUZYX1JYX0hBTEZfUEFHRSkpIHsKKwkJCS8qIFVzZSB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHBhZ2UgKi8KKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJZG1hX2FkZHIgKz0gKFBBR0VfU0laRSA+PiAxKTsKKwkJCXBhZ2VfYWRkciArPSAoUEFHRV9TSVpFID4+IDEpOworCQkJKytjb3VudDsKKwkJCWdvdG8gc3BsaXQ7CiAJCX0KIAl9CiAKLQkvKiBUaGlzIGlzIHRoZSBmaW5hbCBSWCBidWZmZXIgZm9yIHRoaXMgcGFnZSwgc28gbWFyayBpdCBmb3IKLQkgKiB1bm1hcHBpbmcgKi8KLQlyeF9xdWV1ZS0+YnVmX3BhZ2UgPSBOVUxMOwotCXJ4X2J1Zi0+dW5tYXBfYWRkciA9IHJ4X3F1ZXVlLT5idWZfZG1hX2FkZHI7Ci0KLSBvdXQ6CiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBuZXcgcmVjZWl2ZSBidWZmZXIsIG1hcHMgaXQgZm9yIERNQSwKLSAqIGFuZCBwb3B1bGF0ZXMgYSBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciB3aXRoIHRoZSByZWxldmFudAotICogaW5mb3JtYXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgZWZ4X2luaXRfcnhfYnVmZmVyKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAotCQkJICAgICAgc3RydWN0IGVmeF9yeF9idWZmZXIgKm5ld19yeF9idWYpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmIChyeF9xdWV1ZS0+Y2hhbm5lbC0+cnhfYWxsb2NfcHVzaF9wYWdlcykgewotCQluZXdfcnhfYnVmLT5za2IgPSBOVUxMOwotCQlyYyA9IGVmeF9pbml0X3J4X2J1ZmZlcl9wYWdlKHJ4X3F1ZXVlLCBuZXdfcnhfYnVmKTsKLQkJcnhfcXVldWUtPmFsbG9jX3BhZ2VfY291bnQrKzsKLQl9IGVsc2UgewotCQluZXdfcnhfYnVmLT5wYWdlID0gTlVMTDsKLQkJcmMgPSBlZnhfaW5pdF9yeF9idWZmZXJfc2tiKHJ4X3F1ZXVlLCBuZXdfcnhfYnVmKTsKLQkJcnhfcXVldWUtPmFsbG9jX3NrYl9jb3VudCsrOwotCX0KLQotCWlmICh1bmxpa2VseShyYyA8IDApKQotCQlFRlhfTE9HX1JMKHJ4X3F1ZXVlLT5lZngsICIlcyBSWFFbJWRdID0lZFxuIiwgX19mdW5jX18sCi0JCQkgICByeF9xdWV1ZS0+cXVldWUsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyB2b2lkIGVmeF91bm1hcF9yeF9idWZmZXIoc3RydWN0IGVmeF9uaWMgKmVmeCwKIAkJCQlzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQogewogCWlmIChyeF9idWYtPnBhZ2UpIHsKKwkJc3RydWN0IGVmeF9yeF9wYWdlX3N0YXRlICpzdGF0ZTsKKwogCQlFRlhfQlVHX09OX1BBUkFOT0lEKHJ4X2J1Zi0+c2tiKTsKLQkJaWYgKHJ4X2J1Zi0+dW5tYXBfYWRkcikgewotCQkJcGNpX3VubWFwX3BhZ2UoZWZ4LT5wY2lfZGV2LCByeF9idWYtPnVubWFwX2FkZHIsCisKKwkJc3RhdGUgPSBwYWdlX2FkZHJlc3MocnhfYnVmLT5wYWdlKTsKKwkJaWYgKC0tc3RhdGUtPnJlZmNudCA9PSAwKSB7CisJCQlwY2lfdW5tYXBfcGFnZShlZngtPnBjaV9kZXYsCisJCQkJICAgICAgIHN0YXRlLT5kbWFfYWRkciwKIAkJCQkgICAgICAgZWZ4X3J4X2J1Zl9zaXplKGVmeCksCiAJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlyeF9idWYtPnVubWFwX2FkZHIgPSAwOwogCQl9CiAJfSBlbHNlIGlmIChsaWtlbHkocnhfYnVmLT5za2IpKSB7CiAJCXBjaV91bm1hcF9zaW5nbGUoZWZ4LT5wY2lfZGV2LCByeF9idWYtPmRtYV9hZGRyLApAQCAtMjczLDMxICsyNzIsODQgQEAKIAllZnhfZnJlZV9yeF9idWZmZXIocnhfcXVldWUtPmVmeCwgcnhfYnVmKTsKIH0KIAorLyogQXR0ZW1wdCB0byByZXN1cnJlY3QgdGhlIG90aGVyIHJlY2VpdmUgYnVmZmVyIHRoYXQgdXNlZCB0byBzaGFyZSB0aGlzIHBhZ2UsCisgKiB3aGljaCBoYWQgcHJldmlvdXNseSBiZWVuIHBhc3NlZCB1cCB0byB0aGUga2VybmVsIGFuZCBmcmVlZC4gKi8KK3N0YXRpYyB2b2lkIGVmeF9yZXN1cnJlY3RfcnhfYnVmZmVyKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAorCQkJCSAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQoreworCXN0cnVjdCBlZnhfcnhfcGFnZV9zdGF0ZSAqc3RhdGUgPSBwYWdlX2FkZHJlc3MocnhfYnVmLT5wYWdlKTsKKwlzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqbmV3X2J1ZjsKKwl1bnNpZ25lZCBmaWxsX2xldmVsLCBpbmRleDsKKworCS8qICsxIGJlY2F1c2UgZWZ4X3J4X3BhY2tldCgpIGluY3JlbWVudGVkIHJlbW92ZWRfY291bnQuICsxIGJlY2F1c2UKKwkgKiB3ZSdkIGxpa2UgdG8gaW5zZXJ0IGFuIGFkZGl0aW9uYWwgZGVzY3JpcHRvciB3aGlsc3QgbGVhdmluZworCSAqIEVGWF9SWERfSEVBRF9ST09NIGZvciB0aGUgbm9uLXJlY3ljbGUgcGF0aCAqLworCWZpbGxfbGV2ZWwgPSAocnhfcXVldWUtPmFkZGVkX2NvdW50IC0gcnhfcXVldWUtPnJlbW92ZWRfY291bnQgKyAyKTsKKwlpZiAodW5saWtlbHkoZmlsbF9sZXZlbCA+PSBFRlhfUlhRX1NJWkUgLSBFRlhfUlhEX0hFQURfUk9PTSkpIHsKKwkJLyogV2UgY291bGQgcGxhY2UgInN0YXRlIiBvbiBhIGxpc3QsIGFuZCBkcmFpbiB0aGUgbGlzdCBpbgorCQkgKiBlZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzKCkuIEZvciBub3csIHRoaXMgd2lsbCBkby4gKi8KKwkJcmV0dXJuOworCX0KKworCSsrc3RhdGUtPnJlZmNudDsKKwlnZXRfcGFnZShyeF9idWYtPnBhZ2UpOworCisJaW5kZXggPSByeF9xdWV1ZS0+YWRkZWRfY291bnQgJiBFRlhfUlhRX01BU0s7CisJbmV3X2J1ZiA9IGVmeF9yeF9idWZmZXIocnhfcXVldWUsIGluZGV4KTsKKwluZXdfYnVmLT5kbWFfYWRkciA9IHJ4X2J1Zi0+ZG1hX2FkZHIgXiAoUEFHRV9TSVpFID4+IDEpOworCW5ld19idWYtPnNrYiA9IE5VTEw7CisJbmV3X2J1Zi0+cGFnZSA9IHJ4X2J1Zi0+cGFnZTsKKwluZXdfYnVmLT5kYXRhID0gKHZvaWQgKikKKwkJKChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpcnhfYnVmLT5kYXRhIF4gKFBBR0VfU0laRSA+PiAxKSk7CisJbmV3X2J1Zi0+bGVuID0gcnhfYnVmLT5sZW47CisJKytyeF9xdWV1ZS0+YWRkZWRfY291bnQ7Cit9CisKKy8qIFJlY3ljbGUgdGhlIGdpdmVuIHJ4IGJ1ZmZlciBkaXJlY3RseSBiYWNrIGludG8gdGhlIHJ4X3F1ZXVlLiBUaGVyZSBpcworICogYWx3YXlzIHJvb20gdG8gYWRkIHRoaXMgYnVmZmVyLCBiZWNhdXNlIHdlJ3ZlIGp1c3QgcG9wcGVkIGEgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgZWZ4X3JlY3ljbGVfcnhfYnVmZmVyKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCit7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKKwlzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSA9ICZlZngtPnJ4X3F1ZXVlW2NoYW5uZWwtPmNoYW5uZWxdOworCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpuZXdfYnVmOworCXVuc2lnbmVkIGluZGV4OworCisJaWYgKHJ4X2J1Zi0+cGFnZSAhPSBOVUxMICYmIGVmeC0+cnhfYnVmZmVyX2xlbiA8PSBFRlhfUlhfSEFMRl9QQUdFICYmCisJICAgIHBhZ2VfY291bnQocnhfYnVmLT5wYWdlKSA9PSAxKQorCQllZnhfcmVzdXJyZWN0X3J4X2J1ZmZlcihyeF9xdWV1ZSwgcnhfYnVmKTsKKworCWluZGV4ID0gcnhfcXVldWUtPmFkZGVkX2NvdW50ICYgRUZYX1JYUV9NQVNLOworCW5ld19idWYgPSBlZnhfcnhfYnVmZmVyKHJ4X3F1ZXVlLCBpbmRleCk7CisKKwltZW1jcHkobmV3X2J1ZiwgcnhfYnVmLCBzaXplb2YoKm5ld19idWYpKTsKKwlyeF9idWYtPnBhZ2UgPSBOVUxMOworCXJ4X2J1Zi0+c2tiID0gTlVMTDsKKwkrK3J4X3F1ZXVlLT5hZGRlZF9jb3VudDsKK30KKwogLyoqCiAgKiBlZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzIC0gcHVzaCBuZXcgUlggZGVzY3JpcHRvcnMgcXVpY2tseQogICogQHJ4X3F1ZXVlOgkJUlggZGVzY3JpcHRvciBxdWV1ZQotICogQHJldHJ5OiAgICAgICAgICAgICAgUmVjaGVjayB0aGUgZmlsbCBsZXZlbAogICogVGhpcyB3aWxsIGFpbSB0byBmaWxsIHRoZSBSWCBkZXNjcmlwdG9yIHF1ZXVlIHVwIHRvCiAgKiBAcnhfcXVldWUtPkBmYXN0X2ZpbGxfbGltaXQuIElmIHRoZXJlIGlzIGluc3VmZmljaWVudCBhdG9taWMKLSAqIG1lbW9yeSB0byBkbyBzbywgdGhlIGNhbGxlciBzaG91bGQgcmV0cnkuCisgKiBtZW1vcnkgdG8gZG8gc28sIGEgc2xvdyBmaWxsIHdpbGwgYmUgc2NoZWR1bGVkLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIHNlcmlhbGlzYXRpb24gKG5vbmUgaXMgdXNlZCBoZXJlKS4gSW4gcHJhY3Rpc2UsCisgKiB0aGlzIG1lYW5zIHRoaXMgZnVuY3Rpb24gbXVzdCBydW4gZnJvbSB0aGUgTkFQSSBoYW5kbGVyLCBvciBiZSBjYWxsZWQKKyAqIHdoZW4gTkFQSSBpcyBkaXNhYmxlZC4KICAqLwotc3RhdGljIGludCBfX2VmeF9mYXN0X3B1c2hfcnhfZGVzY3JpcHRvcnMoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsCi0JCQkJCSAgaW50IHJldHJ5KQordm9pZCBlZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKQogewotCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWY7Ci0JdW5zaWduZWQgZmlsbF9sZXZlbCwgaW5kZXg7Ci0JaW50IGksIHNwYWNlLCByYyA9IDA7CisJc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsID0gcnhfcXVldWUtPmNoYW5uZWw7CisJdW5zaWduZWQgZmlsbF9sZXZlbDsKKwlpbnQgc3BhY2UsIHJjID0gMDsKIAotCS8qIENhbGN1bGF0ZSBjdXJyZW50IGZpbGwgbGV2ZWwuICBEbyB0aGlzIG91dHNpZGUgdGhlIGxvY2ssCi0JICogYmVjYXVzZSBtb3N0IG9mIHRoZSB0aW1lIHdlJ2xsIGVuZCB1cCBub3Qgd2FudGluZyB0byBkbyB0aGUKLQkgKiBmaWxsIGFueXdheS4KLQkgKi8KKwkvKiBDYWxjdWxhdGUgY3VycmVudCBmaWxsIGxldmVsLCBhbmQgZXhpdCBpZiB3ZSBkb24ndCBuZWVkIHRvIGZpbGwgKi8KIAlmaWxsX2xldmVsID0gKHJ4X3F1ZXVlLT5hZGRlZF9jb3VudCAtIHJ4X3F1ZXVlLT5yZW1vdmVkX2NvdW50KTsKIAlFRlhfQlVHX09OX1BBUkFOT0lEKGZpbGxfbGV2ZWwgPiBFRlhfUlhRX1NJWkUpOwotCi0JLyogRG9uJ3QgZmlsbCBpZiB3ZSBkb24ndCBuZWVkIHRvICovCiAJaWYgKGZpbGxfbGV2ZWwgPj0gcnhfcXVldWUtPmZhc3RfZmlsbF90cmlnZ2VyKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAkvKiBSZWNvcmQgbWluaW11bSBmaWxsIGxldmVsICovCiAJaWYgKHVubGlrZWx5KGZpbGxfbGV2ZWwgPCByeF9xdWV1ZS0+bWluX2ZpbGwpKSB7CkBAIC0zMDUsOTkgKzM1Nyw0NyBAQAogCQkJcnhfcXVldWUtPm1pbl9maWxsID0gZmlsbF9sZXZlbDsKIAl9CiAKLQkvKiBBY3F1aXJlIFJYIGFkZCBsb2NrLiAgSWYgdGhpcyBsb2NrIGlzIGNvbnRlbmRlZCwgdGhlbiBhIGZhc3QKLQkgKiBmaWxsIG11c3QgYWxyZWFkeSBiZSBpbiBwcm9ncmVzcyAoZS5nLiBpbiB0aGUgcmVmaWxsCi0JICogdGFza2xldCksIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkgKi8KLQlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmcnhfcXVldWUtPmFkZF9sb2NrKSkKLQkJcmV0dXJuIC0xOwotCi0gcmV0cnk6Ci0JLyogUmVjYWxjdWxhdGUgY3VycmVudCBmaWxsIGxldmVsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGxvY2sgKi8KLQlmaWxsX2xldmVsID0gKHJ4X3F1ZXVlLT5hZGRlZF9jb3VudCAtIHJ4X3F1ZXVlLT5yZW1vdmVkX2NvdW50KTsKLQlFRlhfQlVHX09OX1BBUkFOT0lEKGZpbGxfbGV2ZWwgPiBFRlhfUlhRX1NJWkUpOwogCXNwYWNlID0gcnhfcXVldWUtPmZhc3RfZmlsbF9saW1pdCAtIGZpbGxfbGV2ZWw7CiAJaWYgKHNwYWNlIDwgRUZYX1JYX0JBVENIKQotCQlnb3RvIG91dF91bmxvY2s7CisJCWdvdG8gb3V0OwogCi0JRUZYX1RSQUNFKHJ4X3F1ZXVlLT5lZngsICJSWCBxdWV1ZSAlZCBmYXN0LWZpbGxpbmcgZGVzY3JpcHRvciByaW5nIGZyb20iCi0JCSAgIiBsZXZlbCAlZCB0byBsZXZlbCAlZCB1c2luZyAlcyBhbGxvY2F0aW9uXG4iLAotCQkgIHJ4X3F1ZXVlLT5xdWV1ZSwgZmlsbF9sZXZlbCwgcnhfcXVldWUtPmZhc3RfZmlsbF9saW1pdCwKLQkJICByeF9xdWV1ZS0+Y2hhbm5lbC0+cnhfYWxsb2NfcHVzaF9wYWdlcyA/ICJwYWdlIiA6ICJza2IiKTsKKwluZXRpZl92ZGJnKHJ4X3F1ZXVlLT5lZngsIHJ4X3N0YXR1cywgcnhfcXVldWUtPmVmeC0+bmV0X2RldiwKKwkJICAgIlJYIHF1ZXVlICVkIGZhc3QtZmlsbGluZyBkZXNjcmlwdG9yIHJpbmcgZnJvbSIKKwkJICAgIiBsZXZlbCAlZCB0byBsZXZlbCAlZCB1c2luZyAlcyBhbGxvY2F0aW9uXG4iLAorCQkgICByeF9xdWV1ZS0+cXVldWUsIGZpbGxfbGV2ZWwsIHJ4X3F1ZXVlLT5mYXN0X2ZpbGxfbGltaXQsCisJCSAgIGNoYW5uZWwtPnJ4X2FsbG9jX3B1c2hfcGFnZXMgPyAicGFnZSIgOiAic2tiIik7CiAKIAlkbyB7Ci0JCWZvciAoaSA9IDA7IGkgPCBFRlhfUlhfQkFUQ0g7ICsraSkgewotCQkJaW5kZXggPSByeF9xdWV1ZS0+YWRkZWRfY291bnQgJiBFRlhfUlhRX01BU0s7Ci0JCQlyeF9idWYgPSBlZnhfcnhfYnVmZmVyKHJ4X3F1ZXVlLCBpbmRleCk7Ci0JCQlyYyA9IGVmeF9pbml0X3J4X2J1ZmZlcihyeF9xdWV1ZSwgcnhfYnVmKTsKLQkJCWlmICh1bmxpa2VseShyYykpCi0JCQkJZ290byBvdXQ7Ci0JCQkrK3J4X3F1ZXVlLT5hZGRlZF9jb3VudDsKKwkJaWYgKGNoYW5uZWwtPnJ4X2FsbG9jX3B1c2hfcGFnZXMpCisJCQlyYyA9IGVmeF9pbml0X3J4X2J1ZmZlcnNfcGFnZShyeF9xdWV1ZSk7CisJCWVsc2UKKwkJCXJjID0gZWZ4X2luaXRfcnhfYnVmZmVyc19za2IocnhfcXVldWUpOworCQlpZiAodW5saWtlbHkocmMpKSB7CisJCQkvKiBFbnN1cmUgdGhhdCB3ZSBkb24ndCBsZWF2ZSB0aGUgcnggcXVldWUgZW1wdHkgKi8KKwkJCWlmIChyeF9xdWV1ZS0+YWRkZWRfY291bnQgPT0gcnhfcXVldWUtPnJlbW92ZWRfY291bnQpCisJCQkJZWZ4X3NjaGVkdWxlX3Nsb3dfZmlsbChyeF9xdWV1ZSk7CisJCQlnb3RvIG91dDsKIAkJfQogCX0gd2hpbGUgKChzcGFjZSAtPSBFRlhfUlhfQkFUQ0gpID49IEVGWF9SWF9CQVRDSCk7CiAKLQlFRlhfVFJBQ0UocnhfcXVldWUtPmVmeCwgIlJYIHF1ZXVlICVkIGZhc3QtZmlsbGVkIGRlc2NyaXB0b3IgcmluZyAiCi0JCSAgInRvIGxldmVsICVkXG4iLCByeF9xdWV1ZS0+cXVldWUsCi0JCSAgcnhfcXVldWUtPmFkZGVkX2NvdW50IC0gcnhfcXVldWUtPnJlbW92ZWRfY291bnQpOworCW5ldGlmX3ZkYmcocnhfcXVldWUtPmVmeCwgcnhfc3RhdHVzLCByeF9xdWV1ZS0+ZWZ4LT5uZXRfZGV2LAorCQkgICAiUlggcXVldWUgJWQgZmFzdC1maWxsZWQgZGVzY3JpcHRvciByaW5nICIKKwkJICAgInRvIGxldmVsICVkXG4iLCByeF9xdWV1ZS0+cXVldWUsCisJCSAgIHJ4X3F1ZXVlLT5hZGRlZF9jb3VudCAtIHJ4X3F1ZXVlLT5yZW1vdmVkX2NvdW50KTsKIAogIG91dDoKLQkvKiBTZW5kIHdyaXRlIHBvaW50ZXIgdG8gY2FyZC4gKi8KLQllZnhfbmljX25vdGlmeV9yeF9kZXNjKHJ4X3F1ZXVlKTsKLQotCS8qIElmIHRoZSBmYXN0IGZpbGwgaXMgcnVubmluZyBpbnNpZGUgZnJvbSB0aGUgcmVmaWxsIHRhc2tsZXQsIHRoZW4KLQkgKiBmb3IgU01QIHN5c3RlbXMgaXQgbWF5IGJlIHJ1bm5pbmcgb24gYSBkaWZmZXJlbnQgQ1BVIHRvCi0JICogUlggZXZlbnQgcHJvY2Vzc2luZywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZmlsbCBsZXZlbCBtYXkgbm93IGJlCi0JICogb3V0IG9mIGRhdGUuICovCi0JaWYgKHVubGlrZWx5KHJldHJ5ICYmIChyYyA9PSAwKSkpCi0JCWdvdG8gcmV0cnk7Ci0KLSBvdXRfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZyeF9xdWV1ZS0+YWRkX2xvY2spOwotCi0JcmV0dXJuIHJjOworCWlmIChyeF9xdWV1ZS0+bm90aWZpZWRfY291bnQgIT0gcnhfcXVldWUtPmFkZGVkX2NvdW50KQorCQllZnhfbmljX25vdGlmeV9yeF9kZXNjKHJ4X3F1ZXVlKTsKIH0KIAotLyoqCi0gKiBlZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzIC0gcHVzaCBuZXcgUlggZGVzY3JpcHRvcnMgcXVpY2tseQotICogQHJ4X3F1ZXVlOgkJUlggZGVzY3JpcHRvciBxdWV1ZQotICoKLSAqIFRoaXMgd2lsbCBhaW0gdG8gZmlsbCB0aGUgUlggZGVzY3JpcHRvciBxdWV1ZSB1cCB0bwotICogQHJ4X3F1ZXVlLT5AZmFzdF9maWxsX2xpbWl0LiAgSWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBkbyBzbywKLSAqIGl0IHdpbGwgc2NoZWR1bGUgYSB3b3JrIGl0ZW0gdG8gaW1tZWRpYXRlbHkgY29udGludWUgdGhlIGZhc3QgZmlsbAotICovCi12b2lkIGVmeF9mYXN0X3B1c2hfcnhfZGVzY3JpcHRvcnMoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpCit2b2lkIGVmeF9yeF9zbG93X2ZpbGwodW5zaWduZWQgbG9uZyBjb250ZXh0KQogewotCWludCByYzsKKwlzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSA9IChzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICopY29udGV4dDsKKwlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwgPSByeF9xdWV1ZS0+Y2hhbm5lbDsKIAotCXJjID0gX19lZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzKHJ4X3F1ZXVlLCAwKTsKLQlpZiAodW5saWtlbHkocmMpKSB7Ci0JCS8qIFNjaGVkdWxlIHRoZSB3b3JrIGl0ZW0gdG8gcnVuIGltbWVkaWF0ZWx5LiBUaGUgaG9wZSBpcwotCQkgKiB0aGF0IHdvcmsgaXMgaW1tZWRpYXRlbHkgcGVuZGluZyB0byBmcmVlIHNvbWUgbWVtb3J5Ci0JCSAqIChlLmcuIGFuIFJYIGV2ZW50IG9yIFRYIGNvbXBsZXRpb24pCi0JCSAqLwotCQllZnhfc2NoZWR1bGVfc2xvd19maWxsKHJ4X3F1ZXVlLCAwKTsKLQl9Ci19Ci0KLXZvaWQgZWZ4X3J4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlOwotCWludCByYzsKLQotCXJ4X3F1ZXVlID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBlZnhfcnhfcXVldWUsIHdvcmsud29yayk7Ci0KLQlpZiAodW5saWtlbHkoIXJ4X3F1ZXVlLT5jaGFubmVsLT5lbmFibGVkKSkKLQkJcmV0dXJuOwotCi0JRUZYX1RSQUNFKHJ4X3F1ZXVlLT5lZngsICJSWCBxdWV1ZSAlZCB3b3JrZXIgdGhyZWFkIGV4ZWN1dGluZyBvbiBDUFUgIgotCQkgICIlZFxuIiwgcnhfcXVldWUtPnF1ZXVlLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQorCS8qIFBvc3QgYW4gZXZlbnQgdG8gY2F1c2UgTkFQSSB0byBydW4gYW5kIHJlZmlsbCB0aGUgcXVldWUgKi8KKwllZnhfbmljX2dlbmVyYXRlX2ZpbGxfZXZlbnQoY2hhbm5lbCk7CiAJKytyeF9xdWV1ZS0+c2xvd19maWxsX2NvdW50OwotCS8qIFB1c2ggbmV3IFJYIGRlc2NyaXB0b3JzLCBhbGxvd2luZyBhdCBsZWFzdCAxIGppZmZ5IGZvcgotCSAqIHRoZSBrZXJuZWwgdG8gZnJlZSBzb21lIG1vcmUgbWVtb3J5LiAqLwotCXJjID0gX19lZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzKHJ4X3F1ZXVlLCAxKTsKLQlpZiAocmMpCi0JCWVmeF9zY2hlZHVsZV9zbG93X2ZpbGwocnhfcXVldWUsIDEpOwogfQogCiBzdGF0aWMgdm9pZCBlZnhfcnhfcGFja2V0X19jaGVja19sZW4oc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsCkBAIC00MTcsMTAgKzQxNywxMiBAQAogCSpkaXNjYXJkID0gdHJ1ZTsKIAogCWlmICgobGVuID4gcnhfYnVmLT5sZW4pICYmIEVGWF9XT1JLQVJPVU5EXzgwNzEoZWZ4KSkgewotCQlFRlhfRVJSX1JMKGVmeCwgIiBSWCBxdWV1ZSAlZCBzZXJpb3VzbHkgb3Zlcmxlbmd0aCAiCi0JCQkgICAiUlggZXZlbnQgKDB4JXggPiAweCV4KzB4JXgpLiBMZWFraW5nXG4iLAotCQkJICAgcnhfcXVldWUtPnF1ZXVlLCBsZW4sIG1heF9sZW4sCi0JCQkgICBlZngtPnR5cGUtPnJ4X2J1ZmZlcl9wYWRkaW5nKTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGlmX2VycihlZngsIHJ4X2VyciwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIiBSWCBxdWV1ZSAlZCBzZXJpb3VzbHkgb3Zlcmxlbmd0aCAiCisJCQkJICAiUlggZXZlbnQgKDB4JXggPiAweCV4KzB4JXgpLiBMZWFraW5nXG4iLAorCQkJCSAgcnhfcXVldWUtPnF1ZXVlLCBsZW4sIG1heF9sZW4sCisJCQkJICBlZngtPnR5cGUtPnJ4X2J1ZmZlcl9wYWRkaW5nKTsKIAkJLyogSWYgdGhpcyBidWZmZXIgd2FzIHNrYi1hbGxvY2F0ZWQsIHRoZW4gdGhlIG1ldGEKIAkJICogZGF0YSBhdCB0aGUgZW5kIG9mIHRoZSBza2Igd2lsbCBiZSB0cmFzaGVkLiBTbwogCQkgKiB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gbGVhayB0aGUgZnJhZ21lbnQuCkBAIC00MjgsOCArNDMwLDExIEBACiAJCSpsZWFrX3BhY2tldCA9IChyeF9idWYtPnNrYiAhPSBOVUxMKTsKIAkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9SWF9SRUNPVkVSWSk7CiAJfSBlbHNlIHsKLQkJRUZYX0VSUl9STChlZngsICIgUlggcXVldWUgJWQgb3Zlcmxlbmd0aCBSWCBldmVudCAiCi0JCQkgICAiKDB4JXggPiAweCV4KVxuIiwgcnhfcXVldWUtPnF1ZXVlLCBsZW4sIG1heF9sZW4pOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0aWZfZXJyKGVmeCwgcnhfZXJyLCBlZngtPm5ldF9kZXYsCisJCQkJICAiIFJYIHF1ZXVlICVkIG92ZXJsZW5ndGggUlggZXZlbnQgIgorCQkJCSAgIigweCV4ID4gMHgleClcbiIsCisJCQkJICByeF9xdWV1ZS0+cXVldWUsIGxlbiwgbWF4X2xlbik7CiAJfQogCiAJcnhfcXVldWUtPmNoYW5uZWwtPm5fcnhfb3Zlcmxlbmd0aCsrOwpAQCAtNDQ5LDYgKzQ1NCw3IEBACiAKIAkvKiBQYXNzIHRoZSBza2IvcGFnZSBpbnRvIHRoZSBMUk8gZW5naW5lICovCiAJaWYgKHJ4X2J1Zi0+cGFnZSkgeworCQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJ4X2J1Zi0+cGFnZTsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtNDYxLDYgKzQ2Nyw5IEBACiAJCQlyZXR1cm47CiAJCX0KIAorCQlpZiAoZWZ4LT5uZXRfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKQorCQkJc2tiLT5yeGhhc2ggPSBlZnhfcnhfYnVmX2hhc2gocnhfYnVmKTsKKwogCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2UgPSBwYWdlOwogCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ID0KIAkJCWVmeF9yeF9idWZfb2Zmc2V0KHJ4X2J1Zik7CkBAIC00OTgsNiArNTA3LDcgQEAKIAkJICAgdW5zaWduZWQgaW50IGxlbiwgYm9vbCBjaGVja3N1bW1lZCwgYm9vbCBkaXNjYXJkKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSByeF9xdWV1ZS0+ZWZ4OworCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCA9IHJ4X3F1ZXVlLT5jaGFubmVsOwogCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWY7CiAJYm9vbCBsZWFrX3BhY2tldCA9IGZhbHNlOwogCkBAIC01MTYsMjEgKzUyNiwyMyBAQAogCWVmeF9yeF9wYWNrZXRfX2NoZWNrX2xlbihyeF9xdWV1ZSwgcnhfYnVmLCBsZW4sCiAJCQkJICZkaXNjYXJkLCAmbGVha19wYWNrZXQpOwogCi0JRUZYX1RSQUNFKGVmeCwgIlJYIHF1ZXVlICVkIHJlY2VpdmVkIGlkICV4IGF0ICVsbHgrJXggJXMlc1xuIiwKLQkJICByeF9xdWV1ZS0+cXVldWUsIGluZGV4LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpcnhfYnVmLT5kbWFfYWRkciwgbGVuLAotCQkgIChjaGVja3N1bW1lZCA/ICIgW1NVTU1FRF0iIDogIiIpLAotCQkgIChkaXNjYXJkID8gIiBbRElTQ0FSRF0iIDogIiIpKTsKKwluZXRpZl92ZGJnKGVmeCwgcnhfc3RhdHVzLCBlZngtPm5ldF9kZXYsCisJCSAgICJSWCBxdWV1ZSAlZCByZWNlaXZlZCBpZCAleCBhdCAlbGx4KyV4ICVzJXNcbiIsCisJCSAgIHJ4X3F1ZXVlLT5xdWV1ZSwgaW5kZXgsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcnhfYnVmLT5kbWFfYWRkciwgbGVuLAorCQkgICAoY2hlY2tzdW1tZWQgPyAiIFtTVU1NRURdIiA6ICIiKSwKKwkJICAgKGRpc2NhcmQgPyAiIFtESVNDQVJEXSIgOiAiIikpOwogCiAJLyogRGlzY2FyZCBwYWNrZXQsIGlmIGluc3RydWN0ZWQgdG8gZG8gc28gKi8KIAlpZiAodW5saWtlbHkoZGlzY2FyZCkpIHsKIAkJaWYgKHVubGlrZWx5KGxlYWtfcGFja2V0KSkKLQkJCXJ4X3F1ZXVlLT5jaGFubmVsLT5uX3NrYnVmZl9sZWFrcysrOworCQkJY2hhbm5lbC0+bl9za2J1ZmZfbGVha3MrKzsKIAkJZWxzZQotCQkJLyogV2UgaGF2ZW4ndCBjYWxsZWQgZWZ4X3VubWFwX3J4X2J1ZmZlciB5ZXQsCi0JCQkgKiBzbyBmaW5pIHRoZSBlbnRpcmUgcnhfYnVmZmVyIGhlcmUgKi8KLQkJCWVmeF9maW5pX3J4X2J1ZmZlcihyeF9xdWV1ZSwgcnhfYnVmKTsKLQkJcmV0dXJuOworCQkJZWZ4X3JlY3ljbGVfcnhfYnVmZmVyKGNoYW5uZWwsIHJ4X2J1Zik7CisKKwkJLyogRG9uJ3QgaG9sZCBvZmYgdGhlIHByZXZpb3VzIHJlY2VpdmUgKi8KKwkJcnhfYnVmID0gTlVMTDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogUmVsZWFzZSBjYXJkIHJlc291cmNlcyAtIGFzc3VtZXMgYWxsIFJYIGJ1ZmZlcnMgY29uc3VtZWQgaW4tb3JkZXIKQEAgLTU0Nyw2ICs1NTksNyBAQAogCSAqIHByZWZldGNoZWQgaW50byBjYWNoZS4KIAkgKi8KIAlyeF9idWYtPmxlbiA9IGxlbjsKK291dDoKIAlpZiAocnhfcXVldWUtPmNoYW5uZWwtPnJ4X3BrdCkKIAkJX19lZnhfcnhfcGFja2V0KHJ4X3F1ZXVlLT5jaGFubmVsLAogCQkJCXJ4X3F1ZXVlLT5jaGFubmVsLT5yeF9wa3QsCkBAIC01NjIsNiArNTc1LDkgQEAKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCXN0cnVjdCBza19idWZmICpza2I7CiAKKwlyeF9idWYtPmRhdGEgKz0gZWZ4LT50eXBlLT5yeF9idWZmZXJfaGFzaF9zaXplOworCXJ4X2J1Zi0+bGVuIC09IGVmeC0+dHlwZS0+cnhfYnVmZmVyX2hhc2hfc2l6ZTsKKwogCS8qIElmIHdlJ3JlIGluIGxvb3BiYWNrIHRlc3QsIHRoZW4gcGFzcyB0aGUgcGFja2V0IGRpcmVjdGx5IHRvIHRoZQogCSAqIGxvb3BiYWNrIGxheWVyLCBhbmQgZnJlZSB0aGUgcnhfYnVmIGhlcmUKIAkgKi8KQEAgLTU3NCw4ICs1OTAsMTIgQEAKIAlpZiAocnhfYnVmLT5za2IpIHsKIAkJcHJlZmV0Y2goc2tiX3NoaW5mbyhyeF9idWYtPnNrYikpOwogCisJCXNrYl9yZXNlcnZlKHJ4X2J1Zi0+c2tiLCBlZngtPnR5cGUtPnJ4X2J1ZmZlcl9oYXNoX3NpemUpOwogCQlza2JfcHV0KHJ4X2J1Zi0+c2tiLCByeF9idWYtPmxlbik7CiAKKwkJaWYgKGVmeC0+bmV0X2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkKKwkJCXJ4X2J1Zi0+c2tiLT5yeGhhc2ggPSBlZnhfcnhfYnVmX2hhc2gocnhfYnVmKTsKKwogCQkvKiBNb3ZlIHBhc3QgdGhlIGV0aGVybmV0IGhlYWRlci4gcnhfYnVmLT5kYXRhIHN0aWxsIHBvaW50cwogCQkgKiBhdCB0aGUgZXRoZXJuZXQgaGVhZGVyICovCiAJCXJ4X2J1Zi0+c2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHJ4X2J1Zi0+c2tiLApAQCAtNjMzLDcgKzY1Myw4IEBACiAJdW5zaWduZWQgaW50IHJ4cV9zaXplOwogCWludCByYzsKIAotCUVGWF9MT0coZWZ4LCAiY3JlYXRpbmcgUlggcXVldWUgJWRcbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAiY3JlYXRpbmcgUlggcXVldWUgJWRcbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7CiAKIAkvKiBBbGxvY2F0ZSBSWCBidWZmZXJzICovCiAJcnhxX3NpemUgPSBFRlhfUlhRX1NJWkUgKiBzaXplb2YoKnJ4X3F1ZXVlLT5idWZmZXIpOwpAQCAtNjUzLDcgKzY3NCw4IEBACiB7CiAJdW5zaWduZWQgaW50IG1heF9maWxsLCB0cmlnZ2VyLCBsaW1pdDsKIAotCUVGWF9MT0cocnhfcXVldWUtPmVmeCwgImluaXRpYWxpc2luZyBSWCBxdWV1ZSAlZFxuIiwgcnhfcXVldWUtPnF1ZXVlKTsKKwluZXRpZl9kYmcocnhfcXVldWUtPmVmeCwgZHJ2LCByeF9xdWV1ZS0+ZWZ4LT5uZXRfZGV2LAorCQkgICJpbml0aWFsaXNpbmcgUlggcXVldWUgJWRcbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7CiAKIAkvKiBJbml0aWFsaXNlIHB0ciBmaWVsZHMgKi8KIAlyeF9xdWV1ZS0+YWRkZWRfY291bnQgPSAwOwpAQCAtNjgwLDggKzcwMiwxMCBAQAogCWludCBpOwogCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWY7CiAKLQlFRlhfTE9HKHJ4X3F1ZXVlLT5lZngsICJzaHV0dGluZyBkb3duIFJYIHF1ZXVlICVkXG4iLCByeF9xdWV1ZS0+cXVldWUpOworCW5ldGlmX2RiZyhyeF9xdWV1ZS0+ZWZ4LCBkcnYsIHJ4X3F1ZXVlLT5lZngtPm5ldF9kZXYsCisJCSAgInNodXR0aW5nIGRvd24gUlggcXVldWUgJWRcbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7CiAKKwlkZWxfdGltZXJfc3luYygmcnhfcXVldWUtPnNsb3dfZmlsbCk7CiAJZWZ4X25pY19maW5pX3J4KHJ4X3F1ZXVlKTsKIAogCS8qIFJlbGVhc2UgUlggYnVmZmVycyBOQiBzdGFydCBhdCBpbmRleCAwIG5vdCBjdXJyZW50IEhXIHB0ciAqLwpAQCAtNjkxLDIxICs3MTUsMTIgQEAKIAkJCWVmeF9maW5pX3J4X2J1ZmZlcihyeF9xdWV1ZSwgcnhfYnVmKTsKIAkJfQogCX0KLQotCS8qIEZvciBhIHBhZ2UgdGhhdCBpcyBwYXJ0LXdheSB0aHJvdWdoIHNwbGl0dGluZyBpbnRvIFJYIGJ1ZmZlcnMgKi8KLQlpZiAocnhfcXVldWUtPmJ1Zl9wYWdlICE9IE5VTEwpIHsKLQkJcGNpX3VubWFwX3BhZ2UocnhfcXVldWUtPmVmeC0+cGNpX2RldiwgcnhfcXVldWUtPmJ1Zl9kbWFfYWRkciwKLQkJCSAgICAgICBlZnhfcnhfYnVmX3NpemUocnhfcXVldWUtPmVmeCksCi0JCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJX19mcmVlX3BhZ2VzKHJ4X3F1ZXVlLT5idWZfcGFnZSwKLQkJCSAgICAgcnhfcXVldWUtPmVmeC0+cnhfYnVmZmVyX29yZGVyKTsKLQkJcnhfcXVldWUtPmJ1Zl9wYWdlID0gTlVMTDsKLQl9CiB9CiAKIHZvaWQgZWZ4X3JlbW92ZV9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSkKIHsKLQlFRlhfTE9HKHJ4X3F1ZXVlLT5lZngsICJkZXN0cm95aW5nIFJYIHF1ZXVlICVkXG4iLCByeF9xdWV1ZS0+cXVldWUpOworCW5ldGlmX2RiZyhyeF9xdWV1ZS0+ZWZ4LCBkcnYsIHJ4X3F1ZXVlLT5lZngtPm5ldF9kZXYsCisJCSAgImRlc3Ryb3lpbmcgUlggcXVldWUgJWRcbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7CiAKIAllZnhfbmljX3JlbW92ZV9yeChyeF9xdWV1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9zZWxmdGVzdC5jIGIvZHJpdmVycy9uZXQvc2ZjL3NlbGZ0ZXN0LmMKaW5kZXggMzcxZTg2Yy4uODVmMDE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3NlbGZ0ZXN0LmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3NlbGZ0ZXN0LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlzdHJ1Y3QgdWRwaGRyIHVkcDsKIAlfX2JlMTYgaXRlcmF0aW9uOwogCWNvbnN0IGNoYXIgbXNnWzY0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogTG9vcGJhY2sgdGVzdCBzb3VyY2UgTUFDIGFkZHJlc3MgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBheWxvYWRfc291cmNlW0VUSF9BTEVOXSA9IHsKQEAgLTEyMyw3ICsxMjMsNyBAQAogewogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKIAotCUVGWF9MT0coZWZ4LCAidGVzdGluZyBpbnRlcnJ1cHRzXG4iKTsKKwluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInRlc3RpbmcgaW50ZXJydXB0c1xuIik7CiAJdGVzdHMtPmludGVycnVwdCA9IC0xOwogCiAJLyogUmVzZXQgaW50ZXJydXB0IGZsYWcgKi8KQEAgLTE0MiwxNiArMTQyLDE3IEBACiAJZWZ4X25pY19nZW5lcmF0ZV9pbnRlcnJ1cHQoZWZ4KTsKIAogCS8qIFdhaXQgZm9yIGFycml2YWwgb2YgdGVzdCBpbnRlcnJ1cHQuICovCi0JRUZYX0xPRyhlZngsICJ3YWl0aW5nIGZvciB0ZXN0IGludGVycnVwdFxuIik7CisJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJ3YWl0aW5nIGZvciB0ZXN0IGludGVycnVwdFxuIik7CiAJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFogLyAxMCk7CiAJaWYgKGVmeC0+bGFzdF9pcnFfY3B1ID49IDApCiAJCWdvdG8gc3VjY2VzczsKIAotCUVGWF9FUlIoZWZ4LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIGludGVycnVwdFxuIik7CisJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgaW50ZXJydXB0XG4iKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIAogIHN1Y2Nlc3M6Ci0JRUZYX0xPRyhlZngsICIlcyB0ZXN0IGludGVycnVwdCBzZWVuIG9uIENQVSVkXG4iLCBJTlRfTU9ERShlZngpLAorCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiJXMgdGVzdCBpbnRlcnJ1cHQgc2VlbiBvbiBDUFUlZFxuIiwKKwkJICBJTlRfTU9ERShlZngpLAogCQllZngtPmxhc3RfaXJxX2NwdSk7CiAJdGVzdHMtPmludGVycnVwdCA9IDE7CiAJcmV0dXJuIDA7CkBAIC0xNjEsMjMgKzE2MiwxOCBAQAogc3RhdGljIGludCBlZnhfdGVzdF9ldmVudHFfaXJxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKIAkJCSAgICAgICBzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgKnRlc3RzKQogewotCXVuc2lnbmVkIGludCBtYWdpYywgY291bnQ7Ci0KLQkvKiBDaGFubmVsIHNwZWNpZmljIGNvZGUsIGxpbWl0ZWQgdG8gMjAgYml0cyAqLwotCW1hZ2ljID0gKDB4MDAwMTAxNTAgKyBjaGFubmVsLT5jaGFubmVsKTsKLQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImNoYW5uZWwgJWQgdGVzdGluZyBldmVudCBxdWV1ZSB3aXRoIGNvZGUgJXhcbiIsCi0JCWNoYW5uZWwtPmNoYW5uZWwsIG1hZ2ljKTsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OworCXVuc2lnbmVkIGludCBtYWdpY19jb3VudCwgY291bnQ7CiAKIAl0ZXN0cy0+ZXZlbnRxX2RtYVtjaGFubmVsLT5jaGFubmVsXSA9IC0xOwogCXRlc3RzLT5ldmVudHFfaW50W2NoYW5uZWwtPmNoYW5uZWxdID0gLTE7CiAJdGVzdHMtPmV2ZW50cV9wb2xsW2NoYW5uZWwtPmNoYW5uZWxdID0gLTE7CiAKLQkvKiBSZXNldCBmbGFnIGFuZCB6ZXJvIG1hZ2ljIHdvcmQgKi8KKwltYWdpY19jb3VudCA9IGNoYW5uZWwtPm1hZ2ljX2NvdW50OwogCWNoYW5uZWwtPmVmeC0+bGFzdF9pcnFfY3B1ID0gLTE7Ci0JY2hhbm5lbC0+ZXZlbnRxX21hZ2ljID0gMDsKIAlzbXBfd21iKCk7CiAKLQllZnhfbmljX2dlbmVyYXRlX3Rlc3RfZXZlbnQoY2hhbm5lbCwgbWFnaWMpOworCWVmeF9uaWNfZ2VuZXJhdGVfdGVzdF9ldmVudChjaGFubmVsKTsKIAogCS8qIFdhaXQgZm9yIGFycml2YWwgb2YgaW50ZXJydXB0ICovCiAJY291bnQgPSAwOwpAQCAtMTg3LDMzICsxODMsMzYgQEAKIAkJaWYgKGNoYW5uZWwtPndvcmtfcGVuZGluZykKIAkJCWVmeF9wcm9jZXNzX2NoYW5uZWxfbm93KGNoYW5uZWwpOwogCi0JCWlmIChjaGFubmVsLT5ldmVudHFfbWFnaWMgPT0gbWFnaWMpCisJCWlmIChjaGFubmVsLT5tYWdpY19jb3VudCAhPSBtYWdpY19jb3VudCkKIAkJCWdvdG8gZXZlbnRxX29rOwogCX0gd2hpbGUgKCsrY291bnQgPCAyKTsKIAotCUVGWF9FUlIoY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZXZlbnQgcXVldWVcbiIsCi0JCWNoYW5uZWwtPmNoYW5uZWwpOworCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkgICJjaGFubmVsICVkIHRpbWVkIG91dCB3YWl0aW5nIGZvciBldmVudCBxdWV1ZVxuIiwKKwkJICBjaGFubmVsLT5jaGFubmVsKTsKIAogCS8qIFNlZSBpZiBpbnRlcnJ1cHQgYXJyaXZlZCAqLwogCWlmIChjaGFubmVsLT5lZngtPmxhc3RfaXJxX2NwdSA+PSAwKSB7Ci0JCUVGWF9FUlIoY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCBzYXcgaW50ZXJydXB0IG9uIENQVSVkICIKLQkJCSJkdXJpbmcgZXZlbnQgcXVldWUgdGVzdFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwKLQkJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgImNoYW5uZWwgJWQgc2F3IGludGVycnVwdCBvbiBDUFUlZCAiCisJCQkgICJkdXJpbmcgZXZlbnQgcXVldWUgdGVzdFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCwKKwkJCSAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCXRlc3RzLT5ldmVudHFfaW50W2NoYW5uZWwtPmNoYW5uZWxdID0gMTsKIAl9CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgZXZlbnQgd2FzIHJlY2VpdmVkIGV2ZW4gaWYgaW50ZXJydXB0IHdhc24ndCAqLwogCWVmeF9wcm9jZXNzX2NoYW5uZWxfbm93KGNoYW5uZWwpOwotCWlmIChjaGFubmVsLT5ldmVudHFfbWFnaWMgPT0gbWFnaWMpIHsKLQkJRUZYX0VSUihjaGFubmVsLT5lZngsICJjaGFubmVsICVkIGV2ZW50IHdhcyBnZW5lcmF0ZWQsIGJ1dCAiCi0JCQkiZmFpbGVkIHRvIHRyaWdnZXIgYW4gaW50ZXJydXB0XG4iLCBjaGFubmVsLT5jaGFubmVsKTsKKwlpZiAoY2hhbm5lbC0+bWFnaWNfY291bnQgIT0gbWFnaWNfY291bnQpIHsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJjaGFubmVsICVkIGV2ZW50IHdhcyBnZW5lcmF0ZWQsIGJ1dCAiCisJCQkgICJmYWlsZWQgdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHRcbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCQl0ZXN0cy0+ZXZlbnRxX2RtYVtjaGFubmVsLT5jaGFubmVsXSA9IDE7CiAJfQogCiAJcmV0dXJuIC1FVElNRURPVVQ7CiAgZXZlbnRxX29rOgotCUVGWF9MT0coY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCBldmVudCBxdWV1ZSBwYXNzZWRcbiIsCi0JCWNoYW5uZWwtPmNoYW5uZWwpOworCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiY2hhbm5lbCAlZCBldmVudCBxdWV1ZSBwYXNzZWRcbiIsCisJCSAgY2hhbm5lbC0+Y2hhbm5lbCk7CiAJdGVzdHMtPmV2ZW50cV9kbWFbY2hhbm5lbC0+Y2hhbm5lbF0gPSAxOwogCXRlc3RzLT5ldmVudHFfaW50W2NoYW5uZWwtPmNoYW5uZWxdID0gMTsKIAl0ZXN0cy0+ZXZlbnRxX3BvbGxbY2hhbm5lbC0+Y2hhbm5lbF0gPSAxOwpAQCAtMjY2LDUxICsyNjUsNTcgQEAKIAogCS8qIENoZWNrIHRoYXQgaGVhZGVyIGV4aXN0cyAqLwogCWlmIChwa3RfbGVuIDwgc2l6ZW9mKHJlY2VpdmVkLT5oZWFkZXIpKSB7Ci0JCUVGWF9FUlIoZWZ4LCAic2F3IHJ1bnQgUlggcGFja2V0IChsZW5ndGggJWQpIGluICVzIGxvb3BiYWNrICIKLQkJCSJ0ZXN0XG4iLCBwa3RfbGVuLCBMT09QQkFDS19NT0RFKGVmeCkpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgInNhdyBydW50IFJYIHBhY2tldCAobGVuZ3RoICVkKSBpbiAlcyBsb29wYmFjayAiCisJCQkgICJ0ZXN0XG4iLCBwa3RfbGVuLCBMT09QQkFDS19NT0RFKGVmeCkpOwogCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBldGhlcm5ldCBoZWFkZXIgZXhpc3RzICovCiAJaWYgKG1lbWNtcCgmcmVjZWl2ZWQtPmhlYWRlciwgJnBheWxvYWQtPmhlYWRlciwgRVRIX0hMRU4pICE9IDApIHsKLQkJRUZYX0VSUihlZngsICJzYXcgbm9uLWxvb3BiYWNrIFJYIHBhY2tldCBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLAotCQkJTE9PUEJBQ0tfTU9ERShlZngpKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJzYXcgbm9uLWxvb3BiYWNrIFJYIHBhY2tldCBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLAorCQkJICBMT09QQkFDS19NT0RFKGVmeCkpOwogCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBDaGVjayBwYWNrZXQgbGVuZ3RoICovCiAJaWYgKHBrdF9sZW4gIT0gc2l6ZW9mKCpwYXlsb2FkKSkgewotCQlFRlhfRVJSKGVmeCwgInNhdyBpbmNvcnJlY3QgUlggcGFja2V0IGxlbmd0aCAlZCAod2FudGVkICVkKSBpbiAiCi0JCQkiJXMgbG9vcGJhY2sgdGVzdFxuIiwgcGt0X2xlbiwgKGludClzaXplb2YoKnBheWxvYWQpLAotCQkJTE9PUEJBQ0tfTU9ERShlZngpKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJzYXcgaW5jb3JyZWN0IFJYIHBhY2tldCBsZW5ndGggJWQgKHdhbnRlZCAlZCkgaW4gIgorCQkJICAiJXMgbG9vcGJhY2sgdGVzdFxuIiwgcGt0X2xlbiwgKGludClzaXplb2YoKnBheWxvYWQpLAorCQkJICBMT09QQkFDS19NT0RFKGVmeCkpOwogCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBDaGVjayB0aGF0IElQIGhlYWRlciBtYXRjaGVzICovCiAJaWYgKG1lbWNtcCgmcmVjZWl2ZWQtPmlwLCAmcGF5bG9hZC0+aXAsIHNpemVvZihwYXlsb2FkLT5pcCkpICE9IDApIHsKLQkJRUZYX0VSUihlZngsICJzYXcgY29ycnVwdGVkIElQIGhlYWRlciBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLAotCQkJTE9PUEJBQ0tfTU9ERShlZngpKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJzYXcgY29ycnVwdGVkIElQIGhlYWRlciBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLAorCQkJICBMT09QQkFDS19NT0RFKGVmeCkpOwogCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBDaGVjayB0aGF0IG1zZyBhbmQgcGFkZGluZyBtYXRjaGVzICovCiAJaWYgKG1lbWNtcCgmcmVjZWl2ZWQtPm1zZywgJnBheWxvYWQtPm1zZywgc2l6ZW9mKHJlY2VpdmVkLT5tc2cpKSAhPSAwKSB7Ci0JCUVGWF9FUlIoZWZ4LCAic2F3IGNvcnJ1cHRlZCBSWCBwYWNrZXQgaW4gJXMgbG9vcGJhY2sgdGVzdFxuIiwKLQkJCUxPT1BCQUNLX01PREUoZWZ4KSk7CisJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAic2F3IGNvcnJ1cHRlZCBSWCBwYWNrZXQgaW4gJXMgbG9vcGJhY2sgdGVzdFxuIiwKKwkJCSAgTE9PUEJBQ0tfTU9ERShlZngpKTsKIAkJZ290byBlcnI7CiAJfQogCiAJLyogQ2hlY2sgdGhhdCBpdGVyYXRpb24gbWF0Y2hlcyAqLwogCWlmIChyZWNlaXZlZC0+aXRlcmF0aW9uICE9IHBheWxvYWQtPml0ZXJhdGlvbikgewotCQlFRlhfRVJSKGVmeCwgInNhdyBSWCBwYWNrZXQgZnJvbSBpdGVyYXRpb24gJWQgKHdhbnRlZCAlZCkgaW4gIgotCQkJIiVzIGxvb3BiYWNrIHRlc3RcbiIsIG50b2hzKHJlY2VpdmVkLT5pdGVyYXRpb24pLAotCQkJbnRvaHMocGF5bG9hZC0+aXRlcmF0aW9uKSwgTE9PUEJBQ0tfTU9ERShlZngpKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJzYXcgUlggcGFja2V0IGZyb20gaXRlcmF0aW9uICVkICh3YW50ZWQgJWQpIGluICIKKwkJCSAgIiVzIGxvb3BiYWNrIHRlc3RcbiIsIG50b2hzKHJlY2VpdmVkLT5pdGVyYXRpb24pLAorCQkJICBudG9ocyhwYXlsb2FkLT5pdGVyYXRpb24pLCBMT09QQkFDS19NT0RFKGVmeCkpOwogCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBJbmNyZWFzZSBjb3JyZWN0IFJYIGNvdW50ICovCi0JRUZYX1RSQUNFKGVmeCwgImdvdCBsb29wYmFjayBSWCBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLAotCQkgIExPT1BCQUNLX01PREUoZWZ4KSk7CisJbmV0aWZfdmRiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkgICAiZ290IGxvb3BiYWNrIFJYIGluICVzIGxvb3BiYWNrIHRlc3RcbiIsIExPT1BCQUNLX01PREUoZWZ4KSk7CiAKIAlhdG9taWNfaW5jKCZzdGF0ZS0+cnhfZ29vZCk7CiAJcmV0dXJuOwpAQCAtMzE4LDEwICszMjMsMTAgQEAKICBlcnI6CiAjaWZkZWYgRUZYX0VOQUJMRV9ERUJVRwogCWlmIChhdG9taWNfcmVhZCgmc3RhdGUtPnJ4X2JhZCkgPT0gMCkgewotCQlFRlhfRVJSKGVmeCwgInJlY2VpdmVkIHBhY2tldDpcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInJlY2VpdmVkIHBhY2tldDpcbiIpOwogCQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgIiIsIERVTVBfUFJFRklYX09GRlNFVCwgMHgxMCwgMSwKIAkJCSAgICAgICBidWZfcHRyLCBwa3RfbGVuLCAwKTsKLQkJRUZYX0VSUihlZngsICJleHBlY3RlZCBwYWNrZXQ6XG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJleHBlY3RlZCBwYWNrZXQ6XG4iKTsKIAkJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDB4MTAsIDEsCiAJCQkgICAgICAgJnN0YXRlLT5wYXlsb2FkLCBzaXplb2Yoc3RhdGUtPnBheWxvYWQpLCAwKTsKIAl9CkBAIC00MDIsOSArNDA3LDExIEBACiAJCQluZXRpZl90eF91bmxvY2tfYmgoZWZ4LT5uZXRfZGV2KTsKIAogCQlpZiAocmMgIT0gTkVUREVWX1RYX09LKSB7Ci0JCQlFRlhfRVJSKGVmeCwgIlRYIHF1ZXVlICVkIGNvdWxkIG5vdCB0cmFuc21pdCBwYWNrZXQgJWQgIgotCQkJCSJvZiAlZCBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLCB0eF9xdWV1ZS0+cXVldWUsCi0JCQkJaSArIDEsIHN0YXRlLT5wYWNrZXRfY291bnQsIExPT1BCQUNLX01PREUoZWZ4KSk7CisJCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJUWCBxdWV1ZSAlZCBjb3VsZCBub3QgdHJhbnNtaXQgcGFja2V0ICVkIG9mICIKKwkJCQkgICIlZCBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLCB0eF9xdWV1ZS0+cXVldWUsCisJCQkJICBpICsgMSwgc3RhdGUtPnBhY2tldF9jb3VudCwKKwkJCQkgIExPT1BCQUNLX01PREUoZWZ4KSk7CiAKIAkJCS8qIERlZmVyIGNsZWFuaW5nIHVwIHRoZSBvdGhlciBza2JzIGZvciB0aGUgY2FsbGVyICovCiAJCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTQ2MCwyMCArNDY3LDIyIEBACiAJCS8qIERvbid0IGZyZWUgdGhlIHNrYnM7IHRoZXkgd2lsbCBiZSBwaWNrZWQgdXAgb24gVFgKIAkJICogb3ZlcmZsb3cgb3IgY2hhbm5lbCB0ZWFyZG93bi4KIAkJICovCi0JCUVGWF9FUlIoZWZ4LCAiVFggcXVldWUgJWQgc2F3IG9ubHkgJWQgb3V0IG9mIGFuIGV4cGVjdGVkICVkICIKLQkJCSJUWCBjb21wbGV0aW9uIGV2ZW50cyBpbiAlcyBsb29wYmFjayB0ZXN0XG4iLAotCQkJdHhfcXVldWUtPnF1ZXVlLCB0eF9kb25lLCBzdGF0ZS0+cGFja2V0X2NvdW50LAotCQkJTE9PUEJBQ0tfTU9ERShlZngpKTsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJUWCBxdWV1ZSAlZCBzYXcgb25seSAlZCBvdXQgb2YgYW4gZXhwZWN0ZWQgJWQgIgorCQkJICAiVFggY29tcGxldGlvbiBldmVudHMgaW4gJXMgbG9vcGJhY2sgdGVzdFxuIiwKKwkJCSAgdHhfcXVldWUtPnF1ZXVlLCB0eF9kb25lLCBzdGF0ZS0+cGFja2V0X2NvdW50LAorCQkJICBMT09QQkFDS19NT0RFKGVmeCkpOwogCQlyYyA9IC1FVElNRURPVVQ7CiAJCS8qIEFsbG93IHRvIGZhbGwgdGhyb3VnaCBzbyB3ZSBzZWUgdGhlIFJYIGVycm9ycyBhcyB3ZWxsICovCiAJfQogCiAJLyogV2UgbWF5IGFsd2F5cyBiZSB1cCB0byBhIGZsdXNoIGF3YXkgZnJvbSBvdXIgZGVzaXJlZCBwYWNrZXQgdG90YWwgKi8KIAlpZiAocnhfZ29vZCAhPSBzdGF0ZS0+cGFja2V0X2NvdW50KSB7Ci0JCUVGWF9MT0coZWZ4LCAiVFggcXVldWUgJWQgc2F3IG9ubHkgJWQgb3V0IG9mIGFuIGV4cGVjdGVkICVkICIKLQkJCSJyZWNlaXZlZCBwYWNrZXRzIGluICVzIGxvb3BiYWNrIHRlc3RcbiIsCi0JCQl0eF9xdWV1ZS0+cXVldWUsIHJ4X2dvb2QsIHN0YXRlLT5wYWNrZXRfY291bnQsCi0JCQlMT09QQkFDS19NT0RFKGVmeCkpOworCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlRYIHF1ZXVlICVkIHNhdyBvbmx5ICVkIG91dCBvZiBhbiBleHBlY3RlZCAlZCAiCisJCQkgICJyZWNlaXZlZCBwYWNrZXRzIGluICVzIGxvb3BiYWNrIHRlc3RcbiIsCisJCQkgIHR4X3F1ZXVlLT5xdWV1ZSwgcnhfZ29vZCwgc3RhdGUtPnBhY2tldF9jb3VudCwKKwkJCSAgTE9PUEJBQ0tfTU9ERShlZngpKTsKIAkJcmMgPSAtRVRJTUVET1VUOwogCQkvKiBGYWxsIHRocm91Z2ggKi8KIAl9CkBAIC01MDUsOSArNTE0LDEwIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJc3RhdGUtPmZsdXNoID0gZmFsc2U7CiAKLQkJRUZYX0xPRyhlZngsICJUWCBxdWV1ZSAlZCB0ZXN0aW5nICVzIGxvb3BiYWNrIHdpdGggJWQgIgotCQkJInBhY2tldHNcbiIsIHR4X3F1ZXVlLT5xdWV1ZSwgTE9PUEJBQ0tfTU9ERShlZngpLAotCQkJc3RhdGUtPnBhY2tldF9jb3VudCk7CisJCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAiVFggcXVldWUgJWQgdGVzdGluZyAlcyBsb29wYmFjayB3aXRoICVkIHBhY2tldHNcbiIsCisJCQkgIHR4X3F1ZXVlLT5xdWV1ZSwgTE9PUEJBQ0tfTU9ERShlZngpLAorCQkJICBzdGF0ZS0+cGFja2V0X2NvdW50KTsKIAogCQllZnhfaXRlcmF0ZV9zdGF0ZShlZngpOwogCQliZWdpbl9yYyA9IGVmeF9iZWdpbl9sb29wYmFjayh0eF9xdWV1ZSk7CkBAIC01MzEsOSArNTQxLDEwIEBACiAJCX0KIAl9CiAKLQlFRlhfTE9HKGVmeCwgIlRYIHF1ZXVlICVkIHBhc3NlZCAlcyBsb29wYmFjayB0ZXN0IHdpdGggYSBidXJzdCBsZW5ndGggIgotCQkib2YgJWQgcGFja2V0c1xuIiwgdHhfcXVldWUtPnF1ZXVlLCBMT09QQkFDS19NT0RFKGVmeCksCi0JCXN0YXRlLT5wYWNrZXRfY291bnQpOworCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkgICJUWCBxdWV1ZSAlZCBwYXNzZWQgJXMgbG9vcGJhY2sgdGVzdCB3aXRoIGEgYnVyc3QgbGVuZ3RoICIKKwkJICAib2YgJWQgcGFja2V0c1xuIiwgdHhfcXVldWUtPnF1ZXVlLCBMT09QQkFDS19NT0RFKGVmeCksCisJCSAgc3RhdGUtPnBhY2tldF9jb3VudCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU0NSw3ICs1NTYsNyBAQAogc3RhdGljIGludCBlZnhfd2FpdF9mb3JfbGluayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCXN0cnVjdCBlZnhfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9ICZlZngtPmxpbmtfc3RhdGU7Ci0JaW50IGNvdW50OworCWludCBjb3VudCwgbGlua191cF9jb3VudCA9IDA7CiAJYm9vbCBsaW5rX3VwOwogCiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgNDA7IGNvdW50KyspIHsKQEAgLTU2Nyw4ICs1NzgsMTIgQEAKIAkJCWxpbmtfdXAgPSAhZWZ4LT5tYWNfb3AtPmNoZWNrX2ZhdWx0KGVmeCk7CiAJCW11dGV4X3VubG9jaygmZWZ4LT5tYWNfbG9jayk7CiAKLQkJaWYgKGxpbmtfdXApCi0JCQlyZXR1cm4gMDsKKwkJaWYgKGxpbmtfdXApIHsKKwkJCWlmICgrK2xpbmtfdXBfY291bnQgPT0gMikKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWxpbmtfdXBfY291bnQgPSAwOworCQl9CiAJfQogCiAJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC02MDQsMTUgKzYxOSwxNyBAQAogCQlyYyA9IF9fZWZ4X3JlY29uZmlndXJlX3BvcnQoZWZ4KTsKIAkJbXV0ZXhfdW5sb2NrKCZlZngtPm1hY19sb2NrKTsKIAkJaWYgKHJjKSB7Ci0JCQlFRlhfRVJSKGVmeCwgInVuYWJsZSB0byBtb3ZlIGludG8gJXMgbG9vcGJhY2tcbiIsCi0JCQkJTE9PUEJBQ0tfTU9ERShlZngpKTsKKwkJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgInVuYWJsZSB0byBtb3ZlIGludG8gJXMgbG9vcGJhY2tcbiIsCisJCQkJICBMT09QQkFDS19NT0RFKGVmeCkpOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQlyYyA9IGVmeF93YWl0X2Zvcl9saW5rKGVmeCk7CiAJCWlmIChyYykgewotCQkJRUZYX0VSUihlZngsICJsb29wYmFjayAlcyBuZXZlciBjYW1lIHVwXG4iLAotCQkJCUxPT1BCQUNLX01PREUoZWZ4KSk7CisJCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCQkgICJsb29wYmFjayAlcyBuZXZlciBjYW1lIHVwXG4iLAorCQkJCSAgTE9PUEJBQ0tfTU9ERShlZngpKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTcyMCw3ICs3MzcsOCBAQAogCQlyY19yZXNldCA9IHJjOwogCiAJaWYgKHJjX3Jlc2V0KSB7Ci0JCUVGWF9FUlIoZWZ4LCAiVW5hYmxlIHRvIHJlY292ZXIgZnJvbSBjaGlwIHRlc3RcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlVuYWJsZSB0byByZWNvdmVyIGZyb20gY2hpcCB0ZXN0XG4iKTsKIAkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9ESVNBQkxFKTsKIAkJcmV0dXJuIHJjX3Jlc2V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9zaWVuYS5jIGIvZHJpdmVycy9uZXQvc2ZjL3NpZW5hLmMKaW5kZXggZjJiMWU2MS4uM2ZhYjAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3NpZW5hLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3NpZW5hLmMKQEAgLTExOCwxMCArMTE4LDExIEBACiAJCQkJICBNQ19DTURfTUFDX05TVEFUUyAqIHNpemVvZih1NjQpKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlFRlhfTE9HKGVmeCwgInN0YXRzIGJ1ZmZlciBhdCAlbGx4ICh2aXJ0ICVwIHBoeXMgJWxseClcbiIsCi0JCSh1NjQpZWZ4LT5zdGF0c19idWZmZXIuZG1hX2FkZHIsCi0JCWVmeC0+c3RhdHNfYnVmZmVyLmFkZHIsCi0JCSh1NjQpdmlydF90b19waHlzKGVmeC0+c3RhdHNfYnVmZmVyLmFkZHIpKTsKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkgICJzdGF0cyBidWZmZXIgYXQgJWxseCAodmlydCAlcCBwaHlzICVsbHgpXG4iLAorCQkgICh1NjQpZWZ4LT5zdGF0c19idWZmZXIuZG1hX2FkZHIsCisJCSAgZWZ4LT5zdGF0c19idWZmZXIuYWRkciwKKwkJICAodTY0KXZpcnRfdG9fcGh5cyhlZngtPnN0YXRzX2J1ZmZlci5hZGRyKSk7CiAKIAllZnhfbWNkaV9tYWNfc3RhdHMoZWZ4LCBlZngtPnN0YXRzX2J1ZmZlci5kbWFfYWRkciwgMCwgMCwgMSk7CiAKQEAgLTIxNiw3ICsyMTcsOCBAQAogCWVmeC0+bmljX2RhdGEgPSBuaWNfZGF0YTsKIAogCWlmIChlZnhfbmljX2ZwZ2FfdmVyKGVmeCkgIT0gMCkgewotCQlFRlhfRVJSKGVmeCwgIlNpZW5hIEZQR0Egbm90IHN1cHBvcnRlZFxuIik7CisJCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCQkgICJTaWVuYSBGUEdBIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbDE7CiAJfQpAQCAtMjMzLDggKzIzNSw4IEBACiAKIAlyYyA9IGVmeF9tY2RpX2Z3dmVyKGVmeCwgJm5pY19kYXRhLT5md192ZXJzaW9uLCAmbmljX2RhdGEtPmZ3X2J1aWxkKTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJGYWlsZWQgdG8gcmVhZCBNQ1BVIGZpcm13YXJlIHZlcnNpb24gLSAiCi0JCQkicmMgJWRcbiIsIHJjKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJCSAgIkZhaWxlZCB0byByZWFkIE1DUFUgZmlybXdhcmUgdmVyc2lvbiAtIHJjICVkXG4iLCByYyk7CiAJCWdvdG8gZmFpbDE7IC8qIE1DUFUgYWJzZW50PyAqLwogCX0KIApAQCAtMjQyLDE3ICsyNDQsMTkgQEAKIAkgKiBmaWx0ZXIgc2V0dGluZ3MuIFdlIG11c3QgZG8gdGhpcyBiZWZvcmUgd2UgcmVzZXQgdGhlIE5JQyAqLwogCXJjID0gZWZ4X21jZGlfZHJ2X2F0dGFjaChlZngsIHRydWUsICZhbHJlYWR5X2F0dGFjaGVkKTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJVbmFibGUgdG8gcmVnaXN0ZXIgZHJpdmVyIHdpdGggTUNQVVxuIik7CisJCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCQkgICJVbmFibGUgdG8gcmVnaXN0ZXIgZHJpdmVyIHdpdGggTUNQVVxuIik7CiAJCWdvdG8gZmFpbDI7CiAJfQogCWlmIChhbHJlYWR5X2F0dGFjaGVkKQogCQkvKiBOb3QgYSBmYXRhbCBlcnJvciAqLwotCQlFRlhfRVJSKGVmeCwgIkhvc3QgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggTUNQVVxuIik7CisJCW5ldGlmX2VycihlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCQkgICJIb3N0IGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIE1DUFVcbiIpOwogCiAJLyogTm93IHdlIGNhbiByZXNldCB0aGUgTklDICovCiAJcmMgPSBzaWVuYV9yZXNldF9odyhlZngsIFJFU0VUX1RZUEVfQUxMKTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gcmVzZXQgTklDXG4iKTsKKwkJbmV0aWZfZXJyKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwgImZhaWxlZCB0byByZXNldCBOSUNcbiIpOwogCQlnb3RvIGZhaWwzOwogCX0KIApAQCAtMjY0LDI0ICsyNjgsMjMgQEAKIAkJZ290byBmYWlsNDsKIAlCVUdfT04oZWZ4LT5pcnFfc3RhdHVzLmRtYV9hZGRyICYgMHgwZik7CiAKLQlFRlhfTE9HKGVmeCwgIklOVF9LRVIgYXQgJWxseCAodmlydCAlcCBwaHlzICVsbHgpXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWVmeC0+aXJxX3N0YXR1cy5kbWFfYWRkciwKLQkJZWZ4LT5pcnFfc3RhdHVzLmFkZHIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpdmlydF90b19waHlzKGVmeC0+aXJxX3N0YXR1cy5hZGRyKSk7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAiSU5UX0tFUiBhdCAlbGx4ICh2aXJ0ICVwIHBoeXMgJWxseClcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyllZngtPmlycV9zdGF0dXMuZG1hX2FkZHIsCisJCSAgZWZ4LT5pcnFfc3RhdHVzLmFkZHIsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aXJ0X3RvX3BoeXMoZWZ4LT5pcnFfc3RhdHVzLmFkZHIpKTsKIAogCS8qIFJlYWQgaW4gdGhlIG5vbi12b2xhdGlsZSBjb25maWd1cmF0aW9uICovCiAJcmMgPSBzaWVuYV9wcm9iZV9udmNvbmZpZyhlZngpOwogCWlmIChyYyA9PSAtRUlOVkFMKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiTlZSQU0gaXMgaW52YWxpZCB0aGVyZWZvcmUgdXNpbmcgZGVmYXVsdHNcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkJICAiTlZSQU0gaXMgaW52YWxpZCB0aGVyZWZvcmUgdXNpbmcgZGVmYXVsdHNcbiIpOwogCQllZngtPnBoeV90eXBlID0gUEhZX1RZUEVfTk9ORTsKIAkJZWZ4LT5tZGlvLnBydGFkID0gTURJT19QUlRBRF9OT05FOwogCX0gZWxzZSBpZiAocmMpIHsKIAkJZ290byBmYWlsNTsKIAl9CiAKLQlnZXRfcmFuZG9tX2J5dGVzKCZuaWNfZGF0YS0+aXB2Nl9yc3Nfa2V5LAotCQkJIHNpemVvZihuaWNfZGF0YS0+aXB2Nl9yc3Nfa2V5KSk7Ci0KIAlyZXR1cm4gMDsKIAogZmFpbDU6CkBAIC0zMDEsNyArMzA0LDYgQEAKICAqLwogc3RhdGljIGludCBzaWVuYV9pbml0X25pYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCXN0cnVjdCBzaWVuYV9uaWNfZGF0YSAqbmljX2RhdGEgPSBlZngtPm5pY19kYXRhOwogCWVmeF9vd29yZF90IHRlbXA7CiAJaW50IHJjOwogCkBAIC0zMjYsMjUgKzMyOCwzNiBAQAogCWVmeF9yZWFkbyhlZngsICZ0ZW1wLCBGUl9BWl9SWF9DRkcpOwogCUVGWF9TRVRfT1dPUkRfRklFTEQodGVtcCwgRlJGX0JaX1JYX0RFU0NfUFVTSF9FTiwgMCk7CiAJRUZYX1NFVF9PV09SRF9GSUVMRCh0ZW1wLCBGUkZfQlpfUlhfSU5HUl9FTiwgMSk7CisJLyogRW5hYmxlIGhhc2ggaW5zZXJ0aW9uLiBUaGlzIGlzIGJyb2tlbiBmb3IgdGhlICdGYWxjb24nIGhhc2gKKwkgKiBpZiBJUHY2IGhhc2hpbmcgaXMgYWxzbyBlbmFibGVkLCBzbyBhbHNvIHNlbGVjdCBUb2VwbGl0egorCSAqIFRDUC9JUHY0IGFuZCBJUHY0IGhhc2hlcy4gKi8KKwlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIEZSRl9CWl9SWF9IQVNIX0lOU1JUX0hEUiwgMSk7CisJRUZYX1NFVF9PV09SRF9GSUVMRCh0ZW1wLCBGUkZfQlpfUlhfSEFTSF9BTEcsIDEpOworCUVGWF9TRVRfT1dPUkRfRklFTEQodGVtcCwgRlJGX0JaX1JYX0lQX0hBU0gsIDEpOwogCWVmeF93cml0ZW8oZWZ4LCAmdGVtcCwgRlJfQVpfUlhfQ0ZHKTsKIAorCS8qIFNldCBoYXNoIGtleSBmb3IgSVB2NCAqLworCW1lbWNweSgmdGVtcCwgZWZ4LT5yeF9oYXNoX2tleSwgc2l6ZW9mKHRlbXApKTsKKwllZnhfd3JpdGVvKGVmeCwgJnRlbXAsIEZSX0JaX1JYX1JTU19US0VZKTsKKwogCS8qIEVuYWJsZSBJUHY2IFJTUyAqLwotCUJVSUxEX0JVR19PTihzaXplb2YobmljX2RhdGEtPmlwdjZfcnNzX2tleSkgIT0KKwlCVUlMRF9CVUdfT04oc2l6ZW9mKGVmeC0+cnhfaGFzaF9rZXkpIDwKIAkJICAgICAyICogc2l6ZW9mKHRlbXApICsgRlJGX0NaX1JYX1JTU19JUFY2X1RLRVlfSElfV0lEVEggLyA4IHx8CiAJCSAgICAgRlJGX0NaX1JYX1JTU19JUFY2X1RLRVlfSElfTEJOICE9IDApOwotCW1lbWNweSgmdGVtcCwgbmljX2RhdGEtPmlwdjZfcnNzX2tleSwgc2l6ZW9mKHRlbXApKTsKKwltZW1jcHkoJnRlbXAsIGVmeC0+cnhfaGFzaF9rZXksIHNpemVvZih0ZW1wKSk7CiAJZWZ4X3dyaXRlbyhlZngsICZ0ZW1wLCBGUl9DWl9SWF9SU1NfSVBWNl9SRUcxKTsKLQltZW1jcHkoJnRlbXAsIG5pY19kYXRhLT5pcHY2X3Jzc19rZXkgKyBzaXplb2YodGVtcCksIHNpemVvZih0ZW1wKSk7CisJbWVtY3B5KCZ0ZW1wLCBlZngtPnJ4X2hhc2hfa2V5ICsgc2l6ZW9mKHRlbXApLCBzaXplb2YodGVtcCkpOwogCWVmeF93cml0ZW8oZWZ4LCAmdGVtcCwgRlJfQ1pfUlhfUlNTX0lQVjZfUkVHMik7CiAJRUZYX1BPUFVMQVRFX09XT1JEXzIodGVtcCwgRlJGX0NaX1JYX1JTU19JUFY2X1RIQVNIX0VOQUJMRSwgMSwKIAkJCSAgICAgRlJGX0NaX1JYX1JTU19JUFY2X0lQX1RIQVNIX0VOQUJMRSwgMSk7Ci0JbWVtY3B5KCZ0ZW1wLCBuaWNfZGF0YS0+aXB2Nl9yc3Nfa2V5ICsgMiAqIHNpemVvZih0ZW1wKSwKKwltZW1jcHkoJnRlbXAsIGVmeC0+cnhfaGFzaF9rZXkgKyAyICogc2l6ZW9mKHRlbXApLAogCSAgICAgICBGUkZfQ1pfUlhfUlNTX0lQVjZfVEtFWV9ISV9XSURUSCAvIDgpOwogCWVmeF93cml0ZW8oZWZ4LCAmdGVtcCwgRlJfQ1pfUlhfUlNTX0lQVjZfUkVHMyk7CiAKIAlpZiAoZWZ4X25pY19yeF94b2ZmX3RocmVzaCA+PSAwIHx8IGVmeF9uaWNfcnhfeG9uX3RocmVzaCA+PSAwKQogCQkvKiBObyBNQ0RJIG9wZXJhdGlvbiBoYXMgYmVlbiBkZWZpbmVkIHRvIHNldCB0aHJlc2hvbGRzICovCi0JCUVGWF9FUlIoZWZ4LCAiaWdub3JpbmcgUlggZmxvdyBjb250cm9sIHRocmVzaG9sZHNcbiIpOworCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJICAiaWdub3JpbmcgUlggZmxvdyBjb250cm9sIHRocmVzaG9sZHNcbiIpOwogCiAJLyogRW5hYmxlIGV2ZW50IGxvZ2dpbmcgKi8KIAlyYyA9IGVmeF9tY2RpX2xvZ19jdHJsKGVmeCwgdHJ1ZSwgZmFsc2UsIDApOwpAQCAtNTY1LDcgKzU3OCw4IEBACiAKIAlyZXR1cm4gMDsKICBmYWlsOgotCUVGWF9FUlIoZWZ4LCAiJXMgZmFpbGVkOiB0eXBlPSVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgdHlwZSwgcmMpOworCW5ldGlmX2VycihlZngsIGh3LCBlZngtPm5ldF9kZXYsICIlcyBmYWlsZWQ6IHR5cGU9JWQgcmM9JWRcbiIsCisJCSAgX19mdW5jX18sIHR5cGUsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYyOCw2ICs2NDIsNyBAQAogCS5ldnFfcHRyX3RibF9iYXNlID0gRlJfQlpfRVZRX1BUUl9UQkwsCiAJLmV2cV9ycHRyX3RibF9iYXNlID0gRlJfQlpfRVZRX1JQVFIsCiAJLm1heF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSyhGU0ZfQVpfVFhfS0VSX0JVRl9BRERSX1dJRFRIKSwKKwkucnhfYnVmZmVyX2hhc2hfc2l6ZSA9IDB4MTAsCiAJLnJ4X2J1ZmZlcl9wYWRkaW5nID0gMCwKIAkubWF4X2ludGVycnVwdF9tb2RlID0gRUZYX0lOVF9NT0RFX01TSVgsCiAJLnBoeXNfYWRkcl9jaGFubmVscyA9IDMyLCAvKiBIYXJkd2FyZSBsaW1pdCBpcyA2NCwgYnV0IHRoZSBsZWdhY3kKQEAgLTYzNSw2ICs2NTAsNyBAQAogCQkJCSAgICogY2hhbm5lbHMgKi8KIAkudHhfZGNfYmFzZSA9IDB4ODgwMDAsCiAJLnJ4X2RjX2Jhc2UgPSAweDY4MDAwLAotCS5vZmZsb2FkX2ZlYXR1cmVzID0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0sCisJLm9mZmxvYWRfZmVhdHVyZXMgPSAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfAorCQkJICAgICBORVRJRl9GX1JYSEFTSCksCiAJLnJlc2V0X3dvcmxkX2ZsYWdzID0gRVRIX1JFU0VUX01HTVQgPDwgRVRIX1JFU0VUX1NIQVJFRF9TSElGVCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvdGVueHByZXNzLmMgYi9kcml2ZXJzL25ldC9zZmMvdGVueHByZXNzLmMKaW5kZXggZjIxZWZlNy4uNjc5MWJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3RlbnhwcmVzcy5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy90ZW54cHJlc3MuYwpAQCAtMjI4LDcgKzIyOCw4IEBACiAJCWJvb3Rfc3RhdCA9IGVmeF9tZGlvX3JlYWQoZWZ4LCBNRElPX01NRF9QQ1MsCiAJCQkJCSAgUENTX0JPT1RfU1RBVFVTX1JFRyk7CiAJCWlmIChib290X3N0YXQgPj0gMCkgewotCQkJRUZYX0xPRyhlZngsICJQSFkgYm9vdCBzdGF0dXMgPSAlI3hcbiIsIGJvb3Rfc3RhdCk7CisJCQluZXRpZl9kYmcoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIlBIWSBib290IHN0YXR1cyA9ICUjeFxuIiwgYm9vdF9zdGF0KTsKIAkJCXN3aXRjaCAoYm9vdF9zdGF0ICYKIAkJCQkoKDEgPDwgUENTX0JPT1RfRkFUQUxfRVJST1JfTEJOKSB8CiAJCQkJICgzIDw8IFBDU19CT09UX1BST0dSRVNTX0xCTikgfApAQCAtNDYzLDEwICs0NjQsMTEgQEAKIAkJCXJlZyB8PSBQTUFfUE1EX0xFRF9PRkYgPDwgUE1BX1BNRF9MRURfUlhfTEJOOwogCQl9IGVsc2UgewogCQkJcmVnIHw9IFBNQV9QTURfTEVEX0ZMQVNIIDw8IFBNQV9QTURfTEVEX1JYX0xCTjsKLQkJCUVGWF9FUlIoZWZ4LCAiYXBwZWFycyB0byBiZSBwbHVnZ2VkIGludG8gYSBwb3J0IgotCQkJCSIgdGhhdCBpcyBub3QgMTBHQkFTRS1UIGNhcGFibGUuIFRoZSBQSFkiCi0JCQkJIiBzdXBwb3J0cyAxMEdCQVNFLVQgT05MWSwgc28gbm8gbGluayBjYW4iCi0JCQkJIiBiZSBlc3RhYmxpc2hlZFxuIik7CisJCQluZXRpZl9lcnIoZWZ4LCBsaW5rLCBlZngtPm5ldF9kZXYsCisJCQkJICAiYXBwZWFycyB0byBiZSBwbHVnZ2VkIGludG8gYSBwb3J0IgorCQkJCSAgIiB0aGF0IGlzIG5vdCAxMEdCQVNFLVQgY2FwYWJsZS4gVGhlIFBIWSIKKwkJCQkgICIgc3VwcG9ydHMgMTBHQkFTRS1UIE9OTFksIHNvIG5vIGxpbmsgY2FuIgorCQkJCSAgIiBiZSBlc3RhYmxpc2hlZFxuIik7CiAJCX0KIAkJZWZ4X21kaW9fd3JpdGUoZWZ4LCBNRElPX01NRF9QTUFQTUQsCiAJCQkgICAgICAgUE1BX1BNRF9MRURfT1ZFUlJfUkVHLCByZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL3R4LmMgYi9kcml2ZXJzL25ldC9zZmMvdHguYwppbmRleCA2YmIxMmE4Li5jNjk0MmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvdHguYworKysgYi9kcml2ZXJzL25ldC9zZmMvdHguYwpAQCAtNDIsNyArNDIsNyBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfYmgoJmNoYW5uZWwtPnR4X3N0b3BfbG9jayk7Ci0JRUZYX1RSQUNFKGVmeCwgInN0b3AgVFggcXVldWVcbiIpOworCW5ldGlmX3ZkYmcoZWZ4LCB0eF9xdWV1ZWQsIGVmeC0+bmV0X2RldiwgInN0b3AgVFggcXVldWVcbiIpOwogCiAJYXRvbWljX2luYygmY2hhbm5lbC0+dHhfc3RvcF9jb3VudCk7CiAJbmV0aWZfdHhfc3RvcF9xdWV1ZSgKQEAgLTY0LDcgKzY0LDcgQEAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmNoYW5uZWwtPnR4X3N0b3BfY291bnQsCiAJCQkJJmNoYW5uZWwtPnR4X3N0b3BfbG9jaykpIHsKLQkJRUZYX1RSQUNFKGVmeCwgIndha2luZyBUWCBxdWV1ZVxuIik7CisJCW5ldGlmX3ZkYmcoZWZ4LCB0eF9xdWV1ZWQsIGVmeC0+bmV0X2RldiwgIndha2luZyBUWCBxdWV1ZVxuIik7CiAJCW5ldGlmX3R4X3dha2VfcXVldWUoCiAJCQluZXRkZXZfZ2V0X3R4X3F1ZXVlKAogCQkJCWVmeC0+bmV0X2RldiwKQEAgLTk0LDggKzk0LDkgQEAKIAlpZiAoYnVmZmVyLT5za2IpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoKHN0cnVjdCBza19idWZmICopIGJ1ZmZlci0+c2tiKTsKIAkJYnVmZmVyLT5za2IgPSBOVUxMOwotCQlFRlhfVFJBQ0UodHhfcXVldWUtPmVmeCwgIlRYIHF1ZXVlICVkIHRyYW5zbWlzc2lvbiBpZCAleCAiCi0JCQkgICJjb21wbGV0ZVxuIiwgdHhfcXVldWUtPnF1ZXVlLCByZWFkX3B0cik7CisJCW5ldGlmX3ZkYmcodHhfcXVldWUtPmVmeCwgdHhfZG9uZSwgdHhfcXVldWUtPmVmeC0+bmV0X2RldiwKKwkJCSAgICJUWCBxdWV1ZSAlZCB0cmFuc21pc3Npb24gaWQgJXggY29tcGxldGVcbiIsCisJCQkgICB0eF9xdWV1ZS0+cXVldWUsIHR4X3F1ZXVlLT5yZWFkX2NvdW50KTsKIAl9CiB9CiAKQEAgLTMwMCw5ICszMDEsMTAgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiAgcGNpX2VycjoKLQlFRlhfRVJSX1JMKGVmeCwgIiBUWCBxdWV1ZSAlZCBjb3VsZCBub3QgbWFwIHNrYiB3aXRoICVkIGJ5dGVzICVkICIKLQkJICAgImZyYWdtZW50cyBmb3IgRE1BXG4iLCB0eF9xdWV1ZS0+cXVldWUsIHNrYi0+bGVuLAotCQkgICBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSk7CisJbmV0aWZfZXJyKGVmeCwgdHhfZXJyLCBlZngtPm5ldF9kZXYsCisJCSAgIiBUWCBxdWV1ZSAlZCBjb3VsZCBub3QgbWFwIHNrYiB3aXRoICVkIGJ5dGVzICVkICIKKwkJICAiZnJhZ21lbnRzIGZvciBETUFcbiIsIHR4X3F1ZXVlLT5xdWV1ZSwgc2tiLT5sZW4sCisJCSAgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpOwogCiAJLyogTWFyayB0aGUgcGFja2V0IGFzIHRyYW5zbWl0dGVkLCBhbmQgZnJlZSB0aGUgU0tCIG91cnNlbHZlcyAqLwogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC0zNTQsOSArMzU2LDkgQEAKIAl3aGlsZSAocmVhZF9wdHIgIT0gc3RvcF9pbmRleCkgewogCQlzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqYnVmZmVyID0gJnR4X3F1ZXVlLT5idWZmZXJbcmVhZF9wdHJdOwogCQlpZiAodW5saWtlbHkoYnVmZmVyLT5sZW4gPT0gMCkpIHsKLQkJCUVGWF9FUlIodHhfcXVldWUtPmVmeCwgIlRYIHF1ZXVlICVkIHNwdXJpb3VzIFRYICIKLQkJCQkiY29tcGxldGlvbiBpZCAleFxuIiwgdHhfcXVldWUtPnF1ZXVlLAotCQkJCXJlYWRfcHRyKTsKKwkJCW5ldGlmX2VycihlZngsIHR4X2VyciwgZWZ4LT5uZXRfZGV2LAorCQkJCSAgIlRYIHF1ZXVlICVkIHNwdXJpb3VzIFRYIGNvbXBsZXRpb24gaWQgJXhcbiIsCisJCQkJICB0eF9xdWV1ZS0+cXVldWUsIHJlYWRfcHRyKTsKIAkJCWVmeF9zY2hlZHVsZV9yZXNldChlZngsIFJFU0VUX1RZUEVfVFhfU0tJUCk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTQzMSw3ICs0MzMsOCBAQAogCXVuc2lnbmVkIGludCB0eHFfc2l6ZTsKIAlpbnQgaSwgcmM7CiAKLQlFRlhfTE9HKGVmeCwgImNyZWF0aW5nIFRYIHF1ZXVlICVkXG4iLCB0eF9xdWV1ZS0+cXVldWUpOworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsICJjcmVhdGluZyBUWCBxdWV1ZSAlZFxuIiwKKwkJICB0eF9xdWV1ZS0+cXVldWUpOwogCiAJLyogQWxsb2NhdGUgc29mdHdhcmUgcmluZyAqLwogCXR4cV9zaXplID0gRUZYX1RYUV9TSVpFICogc2l6ZW9mKCp0eF9xdWV1ZS0+YnVmZmVyKTsKQEAgLTQ1Niw3ICs0NTksOCBAQAogCiB2b2lkIGVmeF9pbml0X3R4X3F1ZXVlKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKQogewotCUVGWF9MT0codHhfcXVldWUtPmVmeCwgImluaXRpYWxpc2luZyBUWCBxdWV1ZSAlZFxuIiwgdHhfcXVldWUtPnF1ZXVlKTsKKwluZXRpZl9kYmcodHhfcXVldWUtPmVmeCwgZHJ2LCB0eF9xdWV1ZS0+ZWZ4LT5uZXRfZGV2LAorCQkgICJpbml0aWFsaXNpbmcgVFggcXVldWUgJWRcbiIsIHR4X3F1ZXVlLT5xdWV1ZSk7CiAKIAl0eF9xdWV1ZS0+aW5zZXJ0X2NvdW50ID0gMDsKIAl0eF9xdWV1ZS0+d3JpdGVfY291bnQgPSAwOwpAQCAtNDg4LDcgKzQ5Miw4IEBACiAKIHZvaWQgZWZ4X2ZpbmlfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCiB7Ci0JRUZYX0xPRyh0eF9xdWV1ZS0+ZWZ4LCAic2h1dHRpbmcgZG93biBUWCBxdWV1ZSAlZFxuIiwgdHhfcXVldWUtPnF1ZXVlKTsKKwluZXRpZl9kYmcodHhfcXVldWUtPmVmeCwgZHJ2LCB0eF9xdWV1ZS0+ZWZ4LT5uZXRfZGV2LAorCQkgICJzaHV0dGluZyBkb3duIFRYIHF1ZXVlICVkXG4iLCB0eF9xdWV1ZS0+cXVldWUpOwogCiAJLyogRmx1c2ggVFggcXVldWUsIHJlbW92ZSBkZXNjcmlwdG9yIHJpbmcgKi8KIAllZnhfbmljX2ZpbmlfdHgodHhfcXVldWUpOwpAQCAtNTA3LDcgKzUxMiw4IEBACiAKIHZvaWQgZWZ4X3JlbW92ZV90eF9xdWV1ZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSkKIHsKLQlFRlhfTE9HKHR4X3F1ZXVlLT5lZngsICJkZXN0cm95aW5nIFRYIHF1ZXVlICVkXG4iLCB0eF9xdWV1ZS0+cXVldWUpOworCW5ldGlmX2RiZyh0eF9xdWV1ZS0+ZWZ4LCBkcnYsIHR4X3F1ZXVlLT5lZngtPm5ldF9kZXYsCisJCSAgImRlc3Ryb3lpbmcgVFggcXVldWUgJWRcbiIsIHR4X3F1ZXVlLT5xdWV1ZSk7CiAJZWZ4X25pY19yZW1vdmVfdHgodHhfcXVldWUpOwogCiAJa2ZyZWUodHhfcXVldWUtPmJ1ZmZlcik7CkBAIC02MzksOCArNjQ1LDggQEAKIAogCWJhc2Vfa3ZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFLCAmZG1hX2FkZHIpOwogCWlmIChiYXNlX2t2YSA9PSBOVUxMKSB7Ci0JCUVGWF9FUlIodHhfcXVldWUtPmVmeCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwYWdlIGZvciBUU08iCi0JCQkiIGhlYWRlcnNcbiIpOworCQluZXRpZl9lcnIodHhfcXVldWUtPmVmeCwgdHhfZXJyLCB0eF9xdWV1ZS0+ZWZ4LT5uZXRfZGV2LAorCQkJICAiVW5hYmxlIHRvIGFsbG9jYXRlIHBhZ2UgZm9yIFRTTyBoZWFkZXJzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMTI0LDcgKzExMzAsOCBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiAKICBtZW1fZXJyOgotCUVGWF9FUlIoZWZ4LCAiT3V0IG9mIG1lbW9yeSBmb3IgVFNPIGhlYWRlcnMsIG9yIFBDSSBtYXBwaW5nIGVycm9yXG4iKTsKKwluZXRpZl9lcnIoZWZ4LCB0eF9lcnIsIGVmeC0+bmV0X2RldiwKKwkJICAiT3V0IG9mIG1lbW9yeSBmb3IgVFNPIGhlYWRlcnMsIG9yIFBDSSBtYXBwaW5nIGVycm9yXG4iKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCWdvdG8gdW53aW5kOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvd29ya2Fyb3VuZHMuaCBiL2RyaXZlcnMvbmV0L3NmYy93b3JrYXJvdW5kcy5oCmluZGV4IDUxOGY3ZmMuLjc4MmU0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy93b3JrYXJvdW5kcy5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy93b3JrYXJvdW5kcy5oCkBAIC01NCw3ICs1NCw3IEBACiAvKiBJbmNyZWFzZSBmaWx0ZXIgZGVwdGggdG8gYXZvaWQgUlhfUkVTRVQgKi8KICNkZWZpbmUgRUZYX1dPUktBUk9VTkRfNzI0NCBFRlhfV09SS0FST1VORF9GQUxDT05fQQogLyogRmx1c2hlcyBtYXkgbmV2ZXIgY29tcGxldGUgKi8KLSNkZWZpbmUgRUZYX1dPUktBUk9VTkRfNzgwMyBFRlhfV09SS0FST1VORF9GQUxDT05fQQorI2RlZmluZSBFRlhfV09SS0FST1VORF83ODAzIEVGWF9XT1JLQVJPVU5EX0ZBTENPTl9BQgogLyogTGVhayBvdmVybGVuZ3RoIHBhY2tldHMgcmF0aGVyIHRoYW4gZnJlZSAqLwogI2RlZmluZSBFRlhfV09SS0FST1VORF84MDcxIEVGWF9XT1JLQVJPVU5EX0ZBTENPTl9BCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NoX2V0aC5jIGIvZHJpdmVycy9uZXQvc2hfZXRoLmMKaW5kZXggNTAxYTU1Zi4uZjVhOWViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2hfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvc2hfZXRoLmMKQEAgLTg4LDYgKzg4LDU1IEBACiAJLnJwYWRpcgkJPSAxLAogCS5ycGFkaXJfdmFsdWUJPSAweDAwMDIwMDAwLCAvKiBORVRfSVBfQUxJR04gYXNzdW1lZCB0byBiZSAyICovCiB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3KQorI2RlZmluZSBTSF9FVEhfUkVTRVRfREVGQVVMVAkxCitzdGF0aWMgdm9pZCBzaF9ldGhfc2V0X2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBpb2FkZHIgPSBuZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAobWRwLT5kdXBsZXgpIC8qIEZ1bGwgKi8KKwkJY3RybF9vdXRsKGN0cmxfaW5sKGlvYWRkciArIEVDTVIpIHwgRUNNUl9ETSwgaW9hZGRyICsgRUNNUik7CisJZWxzZQkJLyogSGFsZiAqLworCQljdHJsX291dGwoY3RybF9pbmwoaW9hZGRyICsgRUNNUikgJiB+RUNNUl9ETSwgaW9hZGRyICsgRUNNUik7Cit9CisKK3N0YXRpYyB2b2lkIHNoX2V0aF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBpb2FkZHIgPSBuZGV2LT5iYXNlX2FkZHI7CisKKwlzd2l0Y2ggKG1kcC0+c3BlZWQpIHsKKwljYXNlIDEwOiAvKiAxMEJBU0UgKi8KKwkJY3RybF9vdXRsKDAsIGlvYWRkciArIFJUUkFURSk7CisJCWJyZWFrOworCWNhc2UgMTAwOi8qIDEwMEJBU0UgKi8KKwkJY3RybF9vdXRsKDEsIGlvYWRkciArIFJUUkFURSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogU0g3NzU3ICovCitzdGF0aWMgc3RydWN0IHNoX2V0aF9jcHVfZGF0YSBzaF9ldGhfbXlfY3B1X2RhdGEgPSB7CisJLnNldF9kdXBsZXgJCT0gc2hfZXRoX3NldF9kdXBsZXgsCisJLnNldF9yYXRlCQk9IHNoX2V0aF9zZXRfcmF0ZSwKKworCS5lZXNpcHJfdmFsdWUJPSBETUFDX01fUkZSTUVSIHwgRE1BQ19NX0VDSSB8IDB4MDAzZmZmZmYsCisJLnJtY3JfdmFsdWUJPSAweDAwMDAwMDAxLAorCisJLnR4X2NoZWNrCT0gRUVTUl9GVEMgfCBFRVNSX0NORCB8IEVFU1JfRExDIHwgRUVTUl9DRCB8IEVFU1JfUlRPLAorCS5lZXNyX2Vycl9jaGVjawk9IEVFU1JfVFdCIHwgRUVTUl9UQUJUIHwgRUVTUl9SQUJUIHwgRUVTUl9SREUgfAorCQkJICBFRVNSX1JGUk1FUiB8IEVFU1JfVEZFIHwgRUVTUl9UREUgfCBFRVNSX0VDSSwKKwkudHhfZXJyb3JfY2hlY2sJPSBFRVNSX1RXQiB8IEVFU1JfVEFCVCB8IEVFU1JfVERFIHwgRUVTUl9URkUsCisKKwkuYXByCQk9IDEsCisJLm1wcgkJPSAxLAorCS50cGF1c2VyCT0gMSwKKwkuaHdfc3dhcAk9IDEsCisJLm5vX2FkZQkJPSAxLAorfTsKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzKQogI2RlZmluZSBTSF9FVEhfSEFTX1RTVQkxCkBAIC0xMDIzLDcgKzEwNzIsOSBAQAogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJm1kcC0+cGRldi0+ZGV2KTsKIAogCXJldCA9IHJlcXVlc3RfaXJxKG5kZXYtPmlycSwgc2hfZXRoX2ludGVycnVwdCwKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2NCkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjQpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcpCiAJCQkJSVJRRl9TSEFSRUQsCiAjZWxzZQogCQkJCTAsCkBAIC0xMjMzLDcgKzEyODQsNyBAQAogCWlmICghcGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgaWZfbWlpKHJxKSwgY21kKTsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChwaHlkZXYsIHJxLCBjbWQpOwogfQogCiAjaWYgZGVmaW5lZChTSF9FVEhfSEFTX1RTVSkKQEAgLTEzMjUsNyArMTM3Niw3IEBACiAJYml0YmFuZy0+bWRjX21zayA9IDB4MDE7CiAJYml0YmFuZy0+Y3RybC5vcHMgPSAmYmJfb3BzOwogCi0JLyogTUlJIGNvbnRvcmxsZXIgc2V0dGluZyAqLworCS8qIE1JSSBjb250cm9sbGVyIHNldHRpbmcgKi8KIAltZHAtPm1paV9idXMgPSBhbGxvY19tZGlvX2JpdGJhbmcoJmJpdGJhbmctPmN0cmwpOwogCWlmICghbWRwLT5taWlfYnVzKSB7CiAJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmMgYi9kcml2ZXJzL25ldC9za3kyLmMKaW5kZXggNzk4NTE2NS4uMTk0ZTVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3NreTIuYwpAQCAtNzksNyArNzksNyBAQAogCiAjZGVmaW5lIFNLWTJfRUVQUk9NX01BR0lDCTB4OTk1NWFhYmIKIAotI2RlZmluZSBSSU5HX05FWFQoeCxzKQkoKCh4KSsxKSAmICgocyktMSkpCisjZGVmaW5lIFJJTkdfTkVYVCh4LCBzKQkoKCh4KSsxKSAmICgocyktMSkpCiAKIHN0YXRpYyBjb25zdCB1MzIgZGVmYXVsdF9tc2cgPQogICAgIE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCi0JZGV2X3dhcm4oJmh3LT5wZGV2LT5kZXYsIiVzOiBwaHkgd3JpdGUgdGltZW91dFxuIiwgaHctPmRldltwb3J0XS0+bmFtZSk7CisJZGV2X3dhcm4oJmh3LT5wZGV2LT5kZXYsICIlczogcGh5IHdyaXRlIHRpbWVvdXRcbiIsIGh3LT5kZXZbcG9ydF0tPm5hbWUpOwogCXJldHVybiAtRVRJTUVET1VUOwogCiBpb19lcnJvcjoKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJcmV0dXJuIGxlOwogfQogCi1zdGF0aWMgdW5zaWduZWQgc2t5Ml9nZXRfcnhfdGhyZXNob2xkKHN0cnVjdCBza3kyX3BvcnQqIHNreTIpCitzdGF0aWMgdW5zaWduZWQgc2t5Ml9nZXRfcnhfdGhyZXNob2xkKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCiB7CiAJdW5zaWduZWQgc2l6ZTsKIApAQCAtMTA3OCw3ICsxMDc4LDcgQEAKIAlyZXR1cm4gKHNpemUgLSA4KSAvIHNpemVvZih1MzIpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgc2t5Ml9nZXRfcnhfZGF0YV9zaXplKHN0cnVjdCBza3kyX3BvcnQqIHNreTIpCitzdGF0aWMgdW5zaWduZWQgc2t5Ml9nZXRfcnhfZGF0YV9zaXplKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCiB7CiAJc3RydWN0IHJ4X3JpbmdfaW5mbyAqcmU7CiAJdW5zaWduZWQgc2l6ZTsKQEAgLTExMDIsNyArMTEwMiw3IEBACiB9CiAKIC8qIEJ1aWxkIGRlc2NyaXB0aW9uIHRvIGhhcmR3YXJlIGZvciBvbmUgcmVjZWl2ZSBzZWdtZW50ICovCi1zdGF0aWMgdm9pZCBza3kyX3J4X2FkZChzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyLCAgdTggb3AsCitzdGF0aWMgdm9pZCBza3kyX3J4X2FkZChzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyLCB1OCBvcCwKIAkJCWRtYV9hZGRyX3QgbWFwLCB1bnNpZ25lZCBsZW4pCiB7CiAJc3RydWN0IHNreTJfcnhfbGUgKmxlOwpAQCAtMzAxNCw3ICszMDE0LDcgQEAKIAlody0+Y2hpcF9pZCA9IHNreTJfcmVhZDgoaHcsIEIyX0NISVBfSUQpOwogCWh3LT5jaGlwX3JldiA9IChza3kyX3JlYWQ4KGh3LCBCMl9NQUNfQ0ZHKSAmIENGR19DSElQX1JfTVNLKSA+PiA0OwogCi0Jc3dpdGNoKGh3LT5jaGlwX2lkKSB7CisJc3dpdGNoIChody0+Y2hpcF9pZCkgewogCWNhc2UgQ0hJUF9JRF9ZVUtPTl9YTDoKIAkJaHctPmZsYWdzID0gU0tZMl9IV19HSUdBQklUIHwgU0tZMl9IV19ORVdFUl9QSFk7CiAJCWlmIChody0+Y2hpcF9yZXYgPCBDSElQX1JFVl9ZVV9YTF9BMikKQEAgLTM2ODUsNyArMzY4NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlubGluZSBza3kyX2FkZF9maWx0ZXIodTggZmlsdGVyWzhdLCBjb25zdCB1OCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBza3kyX2FkZF9maWx0ZXIodTggZmlsdGVyWzhdLCBjb25zdCB1OCAqYWRkcikKIHsKIAl1MzIgYml0OwogCkBAIC0zOTExLDcgKzM5MTEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZWNtZC0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPiBSWF9NQVhfUEVORElORykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGVjbWQtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA+UlhfTUFYX1BFTkRJTkcpCisJaWYgKGVjbWQtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA+IFJYX01BWF9QRU5ESU5HKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChlY21kLT50eF9jb2FsZXNjZV91c2VjcyA9PSAwKQpAQCAtNDE4OCwxNyArNDE4OCwxMyBAQAogc3RhdGljIGludCBza3kyX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3VwcG9ydGVkID0KKwkJKHNreTItPmh3LT5mbGFncyAmIFNLWTJfSFdfUlNTX0JST0tFTikgPyAwIDogRVRIX0ZMQUdfUlhIQVNIOworCWludCByYzsKIAotCWlmIChkYXRhICYgfkVUSF9GTEFHX1JYSEFTSCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKGRhdGEgJiBFVEhfRkxBR19SWEhBU0gpIHsKLQkJaWYgKHNreTItPmh3LT5mbGFncyAmIFNLWTJfSFdfUlNTX0JST0tFTikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9SWEhBU0g7Ci0JfSBlbHNlCi0JCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfUlhIQVNIOworCXJjID0gZXRodG9vbF9vcF9zZXRfZmxhZ3MoZGV2LCBkYXRhLCBzdXBwb3J0ZWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJcnhfc2V0X3JzcyhkZXYpOwogCkBAIC00Mzc2LDcgKzQzNzIsNyBAQAogCQkJc2VxX3ByaW50ZihzZXEsICIldToiLCBpZHgpOwogCQlzb3AgPSAwOwogCi0JCXN3aXRjaChsZS0+b3Bjb2RlICYgfkhXX09XTkVSKSB7CisJCXN3aXRjaCAobGUtPm9wY29kZSAmIH5IV19PV05FUikgewogCQljYXNlIE9QX0FERFI2NDoKIAkJCXNlcV9wcmludGYoc2VxLCAiICUjeDoiLCBhKTsKIAkJCWJyZWFrOwpAQCAtNDQ0NSw3ICs0NDQxLDcgQEAKIAlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fb3BlbiAhPSBza3kyX3VwIHx8ICFza3kyX2RlYnVnKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQlzd2l0Y2goZXZlbnQpIHsKKwlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKIAkJaWYgKHNreTItPmRlYnVnZnMpIHsKIAkJCXNreTItPmRlYnVnZnMgPSBkZWJ1Z2ZzX3JlbmFtZShza3kyX2RlYnVnLCBza3kyLT5kZWJ1Z2ZzLApAQCAtNDY0MCw3ICs0NjM2LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGh3LT5wZGV2OwogCWludCBlcnI7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkICgmaHctPm1zaV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+bXNpX3dhaXQpOwogCiAJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCBZMl9JU19JUlFfU1cpOwogCkBAIC00NzU3LDcgKzQ3NTMsNyBAQAogCSAqIHRoaXMgZHJpdmVyIHVzZXMgc29mdHdhcmUgc3dhcHBpbmcuCiAJICovCiAJcmVnICY9IH5QQ0lfUkVWX0RFU0M7Ci0JZXJyID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LFBDSV9ERVZfUkVHMiwgcmVnKTsKKwllcnIgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9ERVZfUkVHMiwgcmVnKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBDSSB3cml0ZSBjb25maWcgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuaCBiL2RyaXZlcnMvbmV0L3NreTIuaAppbmRleCAwODRlZmYyLi42MTg5MWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmgKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5oCkBAIC0yMTYxLDIxICsyMTYxLDIxIEBACiAJX19sZTE2CWxlbmd0aDsJLyogYWxzbyB2bGFuIHRhZyBvciBjaGVja3N1bSBzdGFydCAqLwogCXU4CWN0cmw7CiAJdTgJb3Bjb2RlOwotfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc2t5Ml9yeF9sZSB7CiAJX19sZTMyCWFkZHI7CiAJX19sZTE2CWxlbmd0aDsKIAl1OAljdHJsOwogCXU4CW9wY29kZTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHNreTJfc3RhdHVzX2xlIHsKIAlfX2xlMzIJc3RhdHVzOwkvKiBhbHNvIGNoZWNrc3VtICovCiAJX19sZTE2CWxlbmd0aDsJLyogYWxzbyB2bGFuIHRhZyAqLwogCXU4CWNzczsKIAl1OAlvcGNvZGU7Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB0eF9yaW5nX2luZm8gewogCXN0cnVjdCBza19idWZmCSpza2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCmluZGV4IDhkMjc3MmMuLmVlNzQ3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCkBAIC04Myw0MyArODMsNiBAQAogCX0KIH0KIAotI2VsaWYgZGVmaW5lZChDT05GSUdfUkVEV09PRF81KSB8fCBkZWZpbmVkKENPTkZJR19SRURXT09EXzYpCi0KLS8qIFdlIGNhbiBvbmx5IGRvIDE2LWJpdCByZWFkcyBhbmQgd3JpdGVzIGluIHRoZSBzdGF0aWMgbWVtb3J5IHNwYWNlLiAqLwotI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTAKLSNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQotI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCi0jZGVmaW5lIFNNQ19OT1dBSVQJCTEKLQotI2RlZmluZSBTTUNfSU9fU0hJRlQJCTAKLQotI2RlZmluZSBTTUNfaW53KGEsIHIpCQlpbl9iZTE2KCh2b2xhdGlsZSB1MTYgKikoKGEpICsgKHIpKSkKLSNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0X2JlMTYoKHZvbGF0aWxlIHUxNiAqKSgoYSkgKyAocikpLCB2KQotI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKSAJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIF9fcG9ydCA9IChhKSArIChyKTsJCQlcCi0JCXUxNiAqX19wID0gKHUxNiAqKShwKTsJCQkJCVwKLQkJaW50IF9fbCA9IChsKTsJCQkJCQlcCi0JCWluc3coX19wb3J0LCBfX3AsIF9fbCk7CQkJCQlcCi0JCXdoaWxlIChfX2wgPiAwKSB7CQkJCQlcCi0JCQkqX19wID0gc3dhYjE2KCpfX3ApOwkJCQlcCi0JCQlfX3ArKzsJCQkJCQlcCi0JCQlfX2wtLTsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKSAJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIF9fcG9ydCA9IChhKSArIChyKTsJCQlcCi0JCXUxNiAqX19wID0gKHUxNiAqKShwKTsJCQkJCVwKLQkJaW50IF9fbCA9IChsKTsJCQkJCQlcCi0JCXdoaWxlIChfX2wgPiAwKSB7CQkJCQlcCi0JCQkvKiBCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIHN3YWIgaXNuJ3QgbmVlZGVkLiAqLwlcCi0JCQlvdXR3KCAvKiBzd2FiMTYgKi8gKCpfX3ArKyksIF9fcG9ydCk7CQlcCi0JCQlfX2wtLTsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIFNNQ19JUlFfRkxBR1MJCSgwKQotCiAjZWxpZiBkZWZpbmVkKENPTkZJR19TQTExMDBfUExFQikKIC8qIFdlIGNhbiBvbmx5IGRvIDE2LWJpdCByZWFkcyBhbmQgd3JpdGVzIGluIHRoZSBzdGF0aWMgbWVtb3J5IHNwYWNlLiAqLwogI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMgYi9kcml2ZXJzL25ldC9zbXNjOTExeC5jCmluZGV4IGNjNTU5NzQuLjA5MDlhZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21zYzkxMXguYwpAQCAtODQsOCArODQsNyBAQAogCSAqLwogCXNwaW5sb2NrX3QgbWFjX2xvY2s7CiAKLQkvKiBzcGlubG9jayB0byBlbnN1cmUgMTYtYml0IGFjY2Vzc2VzIGFyZSBzZXJpYWxpc2VkLgotCSAqIHVudXNlZCB3aXRoIGEgMzItYml0IGJ1cyAqLworCS8qIHNwaW5sb2NrIHRvIGVuc3VyZSByZWdpc3RlciBhY2Nlc3NlcyBhcmUgc2VyaWFsaXNlZCAqLwogCXNwaW5sb2NrX3QgZGV2X2xvY2s7CiAKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKQEAgLTExOCwzNyArMTE3LDMzIEBACiAJdW5zaWduZWQgaW50IGhhc2hsbzsKIH07CiAKLS8qIFRoZSAxNi1iaXQgYWNjZXNzIGZ1bmN0aW9ucyBhcmUgc2lnbmlmaWNhbnRseSBzbG93ZXIsIGR1ZSB0byB0aGUgbG9ja2luZwotICogbmVjZXNzYXJ5LiAgSWYgeW91ciBidXMgaGFyZHdhcmUgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZG8gdGhpcyBmb3IgeW91Ci0gKiAoaW4gcmVzcG9uc2UgdG8gYSBzaW5nbGUgMzItYml0IG9wZXJhdGlvbiBmcm9tIHNvZnR3YXJlKSwgeW91IHNob3VsZCB1c2UKLSAqIHRoZSAzMi1iaXQgYWNjZXNzIGZ1bmN0aW9ucyBpbnN0ZWFkLiAqLwotCi1zdGF0aWMgaW5saW5lIHUzMiBzbXNjOTExeF9yZWdfcmVhZChzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEsIHUzMiByZWcpCitzdGF0aWMgaW5saW5lIHUzMiBfX3Ntc2M5MTF4X3JlZ19yZWFkKHN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSwgdTMyIHJlZykKIHsKIAlpZiAocGRhdGEtPmNvbmZpZy5mbGFncyAmIFNNU0M5MTFYX1VTRV8zMkJJVCkKIAkJcmV0dXJuIHJlYWRsKHBkYXRhLT5pb2FkZHIgKyByZWcpOwogCi0JaWYgKHBkYXRhLT5jb25maWcuZmxhZ3MgJiBTTVNDOTExWF9VU0VfMTZCSVQpIHsKLQkJdTMyIGRhdGE7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyogdGhlc2UgdHdvIDE2LWJpdCByZWFkcyBtdXN0IGJlIHBlcmZvcm1lZCBjb25zZWN1dGl2ZWx5LCBzbwotCQkgKiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSBvdXIgb3duIElTUiAod2hpY2ggd291bGQgc3RhcnQKLQkJICogYW5vdGhlciByZWFkIG9wZXJhdGlvbikgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlkYXRhID0gKChyZWFkdyhwZGF0YS0+aW9hZGRyICsgcmVnKSAmIDB4RkZGRikgfAorCWlmIChwZGF0YS0+Y29uZmlnLmZsYWdzICYgU01TQzkxMVhfVVNFXzE2QklUKQorCQlyZXR1cm4gKChyZWFkdyhwZGF0YS0+aW9hZGRyICsgcmVnKSAmIDB4RkZGRikgfAogCQkJKChyZWFkdyhwZGF0YS0+aW9hZGRyICsgcmVnICsgMikgJiAweEZGRkYpIDw8IDE2KSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiBkYXRhOwotCX0KIAogCUJVRygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc21zYzkxMXhfcmVnX3dyaXRlKHN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSwgdTMyIHJlZywKLQkJCQkgICAgICB1MzIgdmFsKQorc3RhdGljIGlubGluZSB1MzIgc21zYzkxMXhfcmVnX3JlYWQoc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhLCB1MzIgcmVnKQoreworCXUzMiBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPmRldl9sb2NrLCBmbGFncyk7CisJZGF0YSA9IF9fc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIHJlZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPmRldl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc21zYzkxMXhfcmVnX3dyaXRlKHN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSwgdTMyIHJlZywKKwkJCQkJdTMyIHZhbCkKIHsKIAlpZiAocGRhdGEtPmNvbmZpZy5mbGFncyAmIFNNU0M5MTFYX1VTRV8zMkJJVCkgewogCQl3cml0ZWwodmFsLCBwZGF0YS0+aW9hZGRyICsgcmVnKTsKQEAgLTE1Niw0NCArMTUxLDU0IEBACiAJfQogCiAJaWYgKHBkYXRhLT5jb25maWcuZmxhZ3MgJiBTTVNDOTExWF9VU0VfMTZCSVQpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkvKiB0aGVzZSB0d28gMTYtYml0IHdyaXRlcyBtdXN0IGJlIHBlcmZvcm1lZCBjb25zZWN1dGl2ZWx5LCBzbwotCQkgKiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSBvdXIgb3duIElTUiAod2hpY2ggd291bGQgc3RhcnQKLQkJICogYW5vdGhlciByZWFkIG9wZXJhdGlvbikgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOwogCQl3cml0ZXcodmFsICYgMHhGRkZGLCBwZGF0YS0+aW9hZGRyICsgcmVnKTsKIAkJd3JpdGV3KCh2YWwgPj4gMTYpICYgMHhGRkZGLCBwZGF0YS0+aW9hZGRyICsgcmVnICsgMik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCiAJQlVHKCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXNjOTExeF9yZWdfd3JpdGUoc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhLCB1MzIgcmVnLAorCQkJCSAgICAgIHUzMiB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlfX3Ntc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgcmVnLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCiAvKiBXcml0ZXMgYSBwYWNrZXQgdG8gdGhlIFRYX0RBVEFfRklGTyAqLwogc3RhdGljIGlubGluZSB2b2lkCiBzbXNjOTExeF90eF93cml0ZWZpZm8oc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBpbnQgKmJ1ZiwKIAkJICAgICAgdW5zaWduZWQgaW50IHdvcmRjb3VudCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOworCiAJaWYgKHBkYXRhLT5jb25maWcuZmxhZ3MgJiBTTVNDOTExWF9TV0FQX0ZJRk8pIHsKIAkJd2hpbGUgKHdvcmRjb3VudC0tKQotCQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBUWF9EQVRBX0ZJRk8sIHN3YWIzMigqYnVmKyspKTsKLQkJcmV0dXJuOworCQkJX19zbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIFRYX0RBVEFfRklGTywKKwkJCQkJICAgICBzd2FiMzIoKmJ1ZisrKSk7CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChwZGF0YS0+Y29uZmlnLmZsYWdzICYgU01TQzkxMVhfVVNFXzMyQklUKSB7CiAJCXdyaXRlc2wocGRhdGEtPmlvYWRkciArIFRYX0RBVEFfRklGTywgYnVmLCB3b3JkY291bnQpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChwZGF0YS0+Y29uZmlnLmZsYWdzICYgU01TQzkxMVhfVVNFXzE2QklUKSB7CiAJCXdoaWxlICh3b3JkY291bnQtLSkKLQkJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgVFhfREFUQV9GSUZPLCAqYnVmKyspOwotCQlyZXR1cm47CisJCQlfX3Ntc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgVFhfREFUQV9GSUZPLCAqYnVmKyspOworCQlnb3RvIG91dDsKIAl9CiAKIAlCVUcoKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+ZGV2X2xvY2ssIGZsYWdzKTsKIH0KIAogLyogUmVhZHMgYSBwYWNrZXQgb3V0IG9mIHRoZSBSWF9EQVRBX0ZJRk8gKi8KQEAgLTIwMSwyNCArMjA2LDMxIEBACiBzbXNjOTExeF9yeF9yZWFkZmlmbyhzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEsIHVuc2lnbmVkIGludCAqYnVmLAogCQkgICAgIHVuc2lnbmVkIGludCB3b3JkY291bnQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwogCWlmIChwZGF0YS0+Y29uZmlnLmZsYWdzICYgU01TQzkxMVhfU1dBUF9GSUZPKSB7CiAJCXdoaWxlICh3b3JkY291bnQtLSkKLQkJCSpidWYrKyA9IHN3YWIzMihzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgUlhfREFUQV9GSUZPKSk7Ci0JCXJldHVybjsKKwkJCSpidWYrKyA9IHN3YWIzMihfX3Ntc2M5MTF4X3JlZ19yZWFkKHBkYXRhLAorCQkJCQkJCSAgICBSWF9EQVRBX0ZJRk8pKTsKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKHBkYXRhLT5jb25maWcuZmxhZ3MgJiBTTVNDOTExWF9VU0VfMzJCSVQpIHsKIAkJcmVhZHNsKHBkYXRhLT5pb2FkZHIgKyBSWF9EQVRBX0ZJRk8sIGJ1Ziwgd29yZGNvdW50KTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAocGRhdGEtPmNvbmZpZy5mbGFncyAmIFNNU0M5MTFYX1VTRV8xNkJJVCkgewogCQl3aGlsZSAod29yZGNvdW50LS0pCi0JCQkqYnVmKysgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgUlhfREFUQV9GSUZPKTsKLQkJcmV0dXJuOworCQkJKmJ1ZisrID0gX19zbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgUlhfREFUQV9GSUZPKTsKKwkJZ290byBvdXQ7CiAJfQogCiAJQlVHKCk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPmRldl9sb2NrLCBmbGFncyk7CiB9CiAKIC8qIHdhaXRzIGZvciBNQUMgbm90IGJ1c3ksIHdpdGggdGltZW91dC4gIE9ubHkgY2FsbGVkIGJ5IHNtc2M5MTF4X21hY19yZWFkCkBAIC0xNTM4LDcgKzE1NTAsNyBAQAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8ICFwZGF0YS0+cGh5X2RldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwZGF0YS0+cGh5X2RldiwgaWZfbWlpKGlmciksIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwocGRhdGEtPnBoeV9kZXYsIGlmciwgY21kKTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21zYzk0MjAuYyBiL2RyaXZlcnMvbmV0L3Ntc2M5NDIwLmMKaW5kZXggNmNkZWU2YS4uYjA5ZWUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21zYzk0MjAuYworKysgYi9kcml2ZXJzL25ldC9zbXNjOTQyMC5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhcGQtPnBoeV9kZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocGQtPnBoeV9kZXYsIGlmX21paShpZnIpLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBkLT5waHlfZGV2LCBpZnIsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgc21zYzk0MjBfZXRodG9vbF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCmluZGV4IDc0YjdhZTcuLmE0MmI2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKKysrIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwpAQCAtNTYyLDcgKzU2Miw2IEBACiAJdW5zaWduZWQgaW50IHR4X2RvbmU7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKICNpZmRlZiBWTEFOX1NVUFBPUlQKIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CkBAIC0xMTc0LDcgKzExNzMsNyBAQAogCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KIAogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBwcmV2ZW50IHR4IHRpbWVvdXQgKi8KLQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKQEAgLTEyNjUsNyArMTI2NCw3IEBACiAJCQl9CiAJCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQkJCXN0YXR1cyB8PSBUeENhbFRDUDsKLQkJCQlucC0+c3RhdHMudHhfY29tcHJlc3NlZCsrOworCQkJCWRldi0+c3RhdHMudHhfY29tcHJlc3NlZCsrOwogCQkJfQogCQkJc3RhdHVzIHw9IHNrYl9maXJzdF9mcmFnX2xlbihza2IpIHwgKHNrYl9udW1fZnJhZ3Moc2tiKSA8PCAxNik7CiAKQEAgLTEzNzQsNyArMTM3Myw3IEBACiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBjb21wbGV0aW9uICMlZCBlbnRyeSAlZCBpcyAlIzguOHguXG4iLAogCQkJCSAgICAgICBkZXYtPm5hbWUsIG5wLT5kaXJ0eV90eCwgbnAtPnR4X2RvbmUsIHR4X3N0YXR1cyk7CiAJCQlpZiAoKHR4X3N0YXR1cyAmIDB4ZTAwMDAwMDApID09IDB4YTAwMDAwMDApIHsKLQkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJfSBlbHNlIGlmICgodHhfc3RhdHVzICYgMHhlMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgewogCQkJCXUxNiBlbnRyeSA9ICh0eF9zdGF0dXMgJiAweDdmZmYpIC8gc2l6ZW9mKHN0YXJmaXJlX3R4X2Rlc2MpOwogCQkJCXN0cnVjdCBza19idWZmICpza2IgPSBucC0+dHhfaW5mb1tlbnRyeV0uc2tiOwpAQCAtMTQ2Miw5ICsxNDYxLDkgQEAKIAkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KIAkJCWlmIChkZWJ1ZyA+IDIpCiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgUnggZXJyb3Igd2FzICUjOC44eC5cbiIsIGRlc2Nfc3RhdHVzKTsKLQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAoZGVzY19zdGF0dXMgJiBSeEZJRk9FcnIpCi0JCQkJbnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJZ290byBuZXh0X3J4OwogCQl9CiAKQEAgLTE1MTUsNyArMTUxNCw3IEBACiAjZW5kaWYKIAkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPnN0YXR1czIpICYgMHgwMTAwKSB7CiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQkJbnAtPnN0YXRzLnJ4X2NvbXByZXNzZWQrKzsKKwkJCWRldi0+c3RhdHMucnhfY29tcHJlc3NlZCsrOwogCQl9CiAJCS8qCiAJCSAqIFRoaXMgZmVhdHVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgd29ya2luZywgYXQgbGVhc3QKQEAgLTE1NDcsNyArMTU0Niw3IEBACiAJCX0gZWxzZQogI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLwogCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQkJbnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAKIAluZXh0X3J4OgogCQlucC0+Y3VyX3J4Kys7CkBAIC0xNzE3LDEyICsxNzE2LDEyIEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUENJIFR4IHVuZGVyZmxvdyAtLSBhZGFwdGVyIGlzIHByb2JhYmx5IG1hbGZ1bmN0aW9uaW5nXG4iLCBkZXYtPm5hbWUpOwogCX0KIAlpZiAoaW50cl9zdGF0dXMgJiBJbnRyUnhHRlBEZWFkKSB7Ci0JCW5wLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwotCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAl9CiAJaWYgKGludHJfc3RhdHVzICYgKEludHJOb1R4Q3N1bSB8IEludHJETUFFcnIpKSB7Ci0JCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwotCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAl9CiAJaWYgKChpbnRyX3N0YXR1cyAmIH4oSW50ck5vcm1hbE1hc2sgfCBJbnRyQWJub3JtYWxTdW1tYXJ5IHwgSW50ckxpbmtDaGFuZ2UgfCBJbnRyU3RhdHNNYXggfCBJbnRyVHhEYXRhTG93IHwgSW50clJ4R0ZQRGVhZCB8IEludHJOb1R4Q3N1bSB8IEludHJQQ0lQYWQpKSAmJiBkZWJ1ZykKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIFdpY2tlZCBoYXBwZW5lZCEgJSM4Ljh4LlxuIiwKQEAgLTE3MzYsMjQgKzE3MzUsMjQgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOwogCiAJLyogVGhpcyBhZGFwdGVyIGFyY2hpdGVjdHVyZSBuZWVkcyBubyBTTVAgbG9ja3MuICovCi0JbnAtPnN0YXRzLnR4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAxMCk7Ci0JbnAtPnN0YXRzLnJ4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHg1NzA0NCk7Ci0JbnAtPnN0YXRzLnR4X3BhY2tldHMgPSByZWFkbChpb2FkZHIgKyAweDU3MDAwKTsKLQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPQorCWRldi0+c3RhdHMudHhfYnl0ZXMgPSByZWFkbChpb2FkZHIgKyAweDU3MDEwKTsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHg1NzA0NCk7CisJZGV2LT5zdGF0cy50eF9wYWNrZXRzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAwMCk7CisJZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CiAJCXJlYWRsKGlvYWRkciArIDB4NTcwMjQpICsgcmVhZGwoaW9hZGRyICsgMHg1NzAyOCk7Ci0JbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSByZWFkbChpb2FkZHIgKyAweDU3MDE4KTsKLQlucC0+c3RhdHMuY29sbGlzaW9ucyA9CisJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAxOCk7CisJZGV2LT5zdGF0cy5jb2xsaXNpb25zID0KIAkJcmVhZGwoaW9hZGRyICsgMHg1NzAwNCkgKyByZWFkbChpb2FkZHIgKyAweDU3MDA4KTsKIAogCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KLQlucC0+c3RhdHMucnhfZHJvcHBlZCArPSByZWFkdyhpb2FkZHIgKyBSeERNQVN0YXR1cyk7CisJZGV2LT5zdGF0cy5yeF9kcm9wcGVkICs9IHJlYWR3KGlvYWRkciArIFJ4RE1BU3RhdHVzKTsKIAl3cml0ZXcoMCwgaW9hZGRyICsgUnhETUFTdGF0dXMpOwotCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAzQyk7Ci0JbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwNDApOwotCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzA1OCk7Ci0JbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSByZWFkbChpb2FkZHIgKyAweDU3MDdDKTsKKwlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSByZWFkbChpb2FkZHIgKyAweDU3MDNDKTsKKwlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwNDApOworCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwNTgpOworCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwN0MpOwogCi0JcmV0dXJuICZucC0+c3RhdHM7CisJcmV0dXJuICZkZXYtPnN0YXRzOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3N0bW1hYy9jb21tb24uaAppbmRleCAxNDRmNzZmLi42NmI5ZGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdG1tYWMvY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2NvbW1vbi5oCkBAIC0xMDgsNiArMTA4LDcgQEAKIAlnb29kX2ZyYW1lID0gMCwKIAlkaXNjYXJkX2ZyYW1lID0gMSwKIAljc3VtX25vbmUgPSAyLAorCWxsY19zbmFwID0gNCwKIH07CiAKIGVudW0gdHhfZG1hX2lycV9zdGF0dXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwMC5oIGIvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwMC5oCmluZGV4IGQ4ZDBmMzU1Li44YjIwYjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwMC5oCkBAIC05Myw3ICs5Myw3IEBACiAjZGVmaW5lIEdNQUNfQ09OVFJPTF9JUEMJMHgwMDAwMDQwMCAvKiBDaGVja3N1bSBPZmZsb2FkICovCiAjZGVmaW5lIEdNQUNfQ09OVFJPTF9EUgkJMHgwMDAwMDIwMCAvKiBEaXNhYmxlIFJldHJ5ICovCiAjZGVmaW5lIEdNQUNfQ09OVFJPTF9MVUQJMHgwMDAwMDEwMCAvKiBMaW5rIHVwL2Rvd24gKi8KLSNkZWZpbmUgR01BQ19DT05UUk9MX0FDUwkweDAwMDAwMDgwIC8qIEF1dG9tYXRpYyBQYWQgU3RyaXBwaW5nICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9BQ1MJMHgwMDAwMDA4MCAvKiBBdXRvbWF0aWMgUGFkL0ZDUyBTdHJpcHBpbmcgKi8KICNkZWZpbmUgR01BQ19DT05UUk9MX0RDCQkweDAwMDAwMDEwIC8qIERlZmVycmFsIENoZWNrICovCiAjZGVmaW5lIEdNQUNfQ09OVFJPTF9URQkJMHgwMDAwMDAwOCAvKiBUcmFuc21pdHRlciBFbmFibGUgKi8KICNkZWZpbmUgR01BQ19DT05UUk9MX1JFCQkweDAwMDAwMDA0IC8qIFJlY2VpdmVyIEVuYWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwMF9jb3JlLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYwppbmRleCA5MTdiNGUxLi4yYjJmNWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYwpAQCAtMjIwLDYgKzIyMCw4IEBACiAJCSgodWlkICYgMHgwMDAwZmYwMCkgPj4gOCksICh1aWQgJiAweDAwMDAwMGZmKSk7CiAKIAltYWMgPSBremFsbG9jKHNpemVvZihjb25zdCBzdHJ1Y3QgbWFjX2RldmljZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYWMpCisJCXJldHVybiBOVUxMOwogCiAJbWFjLT5tYWMgPSAmZHdtYWMxMDAwX29wczsKIAltYWMtPmRtYSA9ICZkd21hYzEwMDBfZG1hX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMF9jb3JlLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDBfY29yZS5jCmluZGV4IDZmMjcwYTAuLjJmYjE2NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwX2NvcmUuYwpAQCAtMTc5LDYgKzE3OSw4IEBACiAJc3RydWN0IG1hY19kZXZpY2VfaW5mbyAqbWFjOwogCiAJbWFjID0ga3phbGxvYyhzaXplb2YoY29uc3Qgc3RydWN0IG1hY19kZXZpY2VfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbWFjKQorCQlyZXR1cm4gTlVMTDsKIAogCXByX2luZm8oIlx0RFdNQUMxMDBcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvZW5oX2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9lbmhfZGVzYy5jCmluZGV4IDNjMThlYmUuLmY2MTJmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9lbmhfZGVzYy5jCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9lbmhfZGVzYy5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAkgKi8KIAlpZiAoc3RhdHVzID09IDB4MCkgewogCQlDSElQX0RCRyhLRVJOX0lORk8gIlJYIERlczAgc3RhdHVzOiBJRUVFIDgwMi4zIFR5cGUgZnJhbWUuXG4iKTsKLQkJcmV0ID0gZ29vZF9mcmFtZTsKKwkJcmV0ID0gbGxjX3NuYXA7CiAJfSBlbHNlIGlmIChzdGF0dXMgPT0gMHg0KSB7CiAJCUNISVBfREJHKEtFUk5fSU5GTyAiUlggRGVzMCBzdGF0dXM6IElQdjQvNiBObyBDU1VNIGVycm9yUy5cbiIpOwogCQlyZXQgPSBnb29kX2ZyYW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY19tYWluLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21haW4uYwppbmRleCBhMzFkNTgwLi5iYmI3OTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21haW4uYwpAQCAtODI5LDcgKzgyOSw2IEBACiAJICogSW4gY2FzZSBvZiBmYWlsdXJlIGNvbnRpbnVlIHdpdGhvdXQgdGltZXIuICovCiAJaWYgKHVubGlrZWx5KChzdG1tYWNfb3Blbl9leHRfdGltZXIoZGV2LCBwcml2LT50bSkpIDwgMCkpIHsKIAkJcHJfd2FybmluZygic3RtbWFjZXRoOiBjYW5ub3QgYXR0YWNoIHRoZSBleHRlcm5hbCB0aW1lci5cbiIpOwotCQl0bXJhdGUgPSAwOwogCQlwcml2LT50bS0+ZnJlcSA9IDA7CiAJCXByaXYtPnRtLT50aW1lcl9zdGFydCA9IHN0bW1hY19ub190aW1lcl9zdGFydGVkOwogCQlwcml2LT50bS0+dGltZXJfc3RvcCA9IHN0bW1hY19ub190aW1lcl9zdG9wcGVkOwpAQCAtMTIxNyw5ICsxMjE2LDEzIEBACiAJCQlwcml2LT5kZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQllbHNlIHsKIAkJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCQkvKiBMZW5ndGggc2hvdWxkIG9taXQgdGhlIENSQyAqLwotCQkJaW50IGZyYW1lX2xlbiA9IHByaXYtPmh3LT5kZXNjLT5nZXRfcnhfZnJhbWVfbGVuKHApIC0gNDsKKwkJCWludCBmcmFtZV9sZW47CiAKKwkJCWZyYW1lX2xlbiA9IHByaXYtPmh3LT5kZXNjLT5nZXRfcnhfZnJhbWVfbGVuKHApOworCQkJLyogQUNTIGlzIHNldDsgR01BQyBjb3JlIHN0cmlwcyBQQUQvRkNTIGZvciBJRUVFIDgwMi4zCisJCQkgKiBUeXBlIGZyYW1lcyAoTExDL0xMQy1TTkFQKSAqLworCQkJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSBsbGNfc25hcCkpCisJCQkJZnJhbWVfbGVuIC09IEVUSF9GQ1NfTEVOOwogI2lmZGVmIFNUTU1BQ19SWF9ERUJVRwogCQkJaWYgKGZyYW1lX2xlbiA+IEVUSF9GUkFNRV9MRU4pCiAJCQkJcHJfZGVidWcoIlx0UlggZnJhbWUgc2l6ZSAlZCwgQ09FIHN0YXR1czogJWRcbiIsCkBAIC0xNDM3LDI0ICsxNDQwLDE4IEBACiBzdGF0aWMgaW50IHN0bW1hY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewogCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJldCA9IC1FT1BOT1RTVVBQOworCWludCByZXQ7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0lPQ0dNSUlQSFk6Ci0JY2FzZSBTSU9DR01JSVJFRzoKLQljYXNlIFNJT0NTTUlJUkVHOgotCQlpZiAoIXByaXYtPnBoeWRldikKLQkJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJpdi0+cGh5ZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlzcGluX2xvY2soJnByaXYtPmxvY2spOwotCQlyZXQgPSBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeWRldiwgaWZfbWlpKHJxKSwgY21kKTsKLQkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCXJldCA9IHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTY0LDE1ICsxNTYxLDE1IEBACiAJZWxzZQogCQlkZXZpY2UgPSBkd21hYzEwMF9zZXR1cChpb2FkZHIpOwogCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCiAJaWYgKHByaXYtPmVuaF9kZXNjKSB7CiAJCWRldmljZS0+ZGVzYyA9ICZlbmhfZGVzY19vcHM7CiAJCXByX2luZm8oIlx0RW5oYW5jZWQgZGVzY3JpcHRvciBzdHJ1Y3R1cmVcbiIpOwogCX0gZWxzZQogCQlkZXZpY2UtPmRlc2MgPSAmbmRlc2Nfb3BzOwogCi0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcHJpdi0+aHcgPSBkZXZpY2U7CiAKIAlwcml2LT53b2xlbmFibGVkID0gcHJpdi0+aHctPnBtdDsJLyogUE1UIHN1cHBvcnRlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jIGIvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jCmluZGV4IDE1MTMxMjMuLmI2YWU1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYworKysgYi9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmMKQEAgLTE0Miw3ICsxNDIsNiBAQAogCiBzdHJ1Y3QgcHJpdgogewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAljaGFyICptZW10b3A7CiAJbG9uZyBpbnQgbG9jazsKQEAgLTc4OCwxMCArNzg3LDEwIEBACiAJCQkJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsKGNoYXIgKikgcC0+YmFzZStzd2FiMzIoKHVuc2lnbmVkIGxvbmcpIHJiZC0+YnVmZmVyKSx0b3RsZW4pOwogCQkJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKIAkJCQkJCW5ldGlmX3J4KHNrYik7Ci0JCQkJCQlwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCQkJfQogCQkJCQllbHNlCi0JCQkJCQlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKQEAgLTgxMiwxMyArODExLDEzIEBACiAJCQkJCXRvdGxlbiArPSByc3RhdCAmIFJCRF9NQVNLOwogCQkJCQlyYmQtPnN0YXR1cyA9IDA7CiAJCQkJCXByaW50aygiJXM6IHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZSEgbGVuZ3RoOiAlZFxuIixkZXYtPm5hbWUsdG90bGVuKTsKLQkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCSB9CiAJCX0KIAkJZWxzZSAvKiBmcmFtZSAhKG9rKSwgb25seSB3aXRoICdzYXZlLWJhZC1mcmFtZXMnICovCiAJCXsKIAkJCXByaW50aygiJXM6IG9vcHMhIHJmZC1lcnJvci1zdGF0dXM6ICUwNHhcbiIsZGV2LT5uYW1lLHN0YXR1cyk7Ci0JCQlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCX0KIAkJcC0+cmZkX3RvcC0+c3RhdF9oaWdoID0gMDsKIAkJcC0+cmZkX3RvcC0+bGFzdCA9IFJGRF9TVVNQOyAvKiBtYXliZSBleGNoYW5nZSBieSBSRkRfTEFTVCAqLwpAQCAtODg1LDcgKzg4NCw3IEBACiB7CiAJc3RydWN0IHByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JcC0+c3RhdHMucnhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAogCVdBSVRfNF9TQ0JfQ01EKCk7CQkvKiB3YWl0IGZvciB0aGUgbGFzdCBjbWQsIFdBSVRfNF9GVUxMU1RBVD8/ICovCiAJcC0+c2NiLT5jbWRfcnVjID0gUlVDX0FCT1JUOyAvKiB1c3VhbGx5IHRoZSBSVSBpcyBpbiB0aGUgJ25vIHJlc291cmNlJy1zdGF0ZSAuLiBhYm9ydCBpdCBub3cuICovCkBAIC05MTgsMjkgKzkxNywyOSBAQAogCiAJaWYoc3RhdHVzICYgU1RBVF9PSykKIAl7Ci0JCXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJcC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzICYgVENNRF9NQVhDT0xMTUFTSyk7CisJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyAmIFRDTURfTUFYQ09MTE1BU0spOwogCX0KIAllbHNlCiAJewotCQlwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJaWYoc3RhdHVzICYgVENNRF9MQVRFQ09MTCkgewogCQkJcHJpbnRrKCIlczogbGF0ZSBjb2xsaXNpb24gZGV0ZWN0ZWQuXG4iLGRldi0+bmFtZSk7Ci0JCQlwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKIAkJfQogCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTk9DQVJSSUVSKSB7Ci0JCQlwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwogCQkJcHJpbnRrKCIlczogbm8gY2FycmllciBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKIAkJfQogCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTE9TVENUUykKIAkJCXByaW50aygiJXM6IGxvc3Mgb2YgQ1RTIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOwogCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfVU5ERVJSVU4pIHsKLQkJCXAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCQlwcmludGsoIiVzOiBETUEgdW5kZXJydW4gZGV0ZWN0ZWQuXG4iLGRldi0+bmFtZSk7CiAJCX0KIAkJZWxzZSBpZihzdGF0dXMgJiBUQ01EX01BWENPTEwpIHsKIAkJCXByaW50aygiJXM6IE1heC4gY29sbGlzaW9ucyBleGNlZWRlZC5cbiIsZGV2LT5uYW1lKTsKLQkJCXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMTY7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMTY7CiAJCX0KIAl9CiAKQEAgLTExMjksMTIgKzExMjgsMTIgQEAKIAlvdnJuID0gc3dhYjE2KHAtPnNjYi0+b3Zybl9lcnJzKTsKIAlwLT5zY2ItPm92cm5fZXJycyA9IDA7CiAKLQlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGNyYzsKLQlwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBvdnJuOwotCXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBhbG47Ci0JcC0+c3RhdHMucnhfZHJvcHBlZCArPSByc2M7CisJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGNyYzsKKwlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IG92cm47CisJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gYWxuOworCWRldi0+c3RhdHMucnhfZHJvcHBlZCArPSByc2M7CiAKLQlyZXR1cm4gJnAtPnN0YXRzOworCXJldHVybiAmZGV2LT5zdGF0czsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5ibWFjLmMgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKaW5kZXggMzY3ZTk2Zi4uMDljMDcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuYwpAQCAtMTIwMSw3ICsxMjAxLDcgQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIAogCS8qIEZpbmlzaCBuZXQgZGV2aWNlIHJlZ2lzdHJhdGlvbi4gKi8KLQlkZXYtPmlycSA9IGJwLT5iaWdtYWNfb3AtPmlycXNbMF07CisJZGV2LT5pcnEgPSBicC0+YmlnbWFjX29wLT5hcmNoZGF0YS5pcnFzWzBdOwogCWRldi0+ZG1hID0gMDsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgewpAQCAtMTMwMSwxMiArMTMwMSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBiaWdtYWNfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmJpZ21hY19zYnVzX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZiaWdtYWNfc2J1c19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYmlnbWFjX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmYmlnbWFjX3NidXNfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYmlnbWFjX3NidXNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYmlnbWFjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwppbmRleCAzZDk2NTBiLi5lZWM0NDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5obWUuYworKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMjU2MSw3ICsyNTYxLDcgQEAKIAkJaWYgKHNraXApCiAJCQljb250aW51ZTsKIAotCQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1swXSwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmFyY2hkYXRhLmlycXNbMF0sCiAJCQkJICBxdWF0dHJvX3NidXNfaW50ZXJydXB0LAogCQkJCSAgSVJRRl9TSEFSRUQsICJRdWF0dHJvIiwKIAkJCQkgIHFwKTsKQEAgLTI1OTAsNyArMjU5MCw3IEBACiAJCWlmIChza2lwKQogCQkJY29udGludWU7CiAKLQkJZnJlZV9pcnEob3AtPmlycXNbMF0sIHFwKTsKKwkJZnJlZV9pcnEob3AtPmFyY2hkYXRhLmlycXNbMF0sIHFwKTsKIAl9CiB9CiAjZW5kaWYgLyogQ09ORklHX1NCVVMgKi8KQEAgLTI3OTAsNyArMjc5MCw3IEBACiAJLyogSGFwcHkgTWVhbCBjYW4gZG8gaXQgYWxsLi4uICovCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOwogCi0JZGV2LT5pcnEgPSBvcC0+aXJxc1swXTsKKwlkZXYtPmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCiAjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQogCS8qIEhvb2sgdXAgU0JVUyByZWdpc3Rlci9kZXNjcmlwdG9yIGFjY2Vzc29ycy4gKi8KQEAgLTMzMDQsNyArMzMwNCw3IEBACiB7CiAJaW50IGVycjsKIAotCWVyciA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmaG1lX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCWVyciA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmaG1lX3NidXNfZHJpdmVyKTsKIAlpZiAoIWVycikKIAkJZXJyID0gcXVhdHRyb19zYnVzX3JlZ2lzdGVyX2lycXMoKTsKIApAQCAtMzMxMyw3ICszMzEzLDcgQEAKIAogc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9zYnVzX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmaG1lX3NidXNfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmaG1lX3NidXNfZHJpdmVyKTsKIAlxdWF0dHJvX3NidXNfZnJlZV9pcnFzKCk7CiAKIAl3aGlsZSAocWZlX3NidXNfbGlzdCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKaW5kZXggN2Q5YzMzZC4uZWUzNjRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogCWRldi0+ZXRodG9vbF9vcHMgPSAmc3BhcmNfbGFuY2VfZXRodG9vbF9vcHM7CiAJZGV2LT5uZXRkZXZfb3BzID0gJnNwYXJjX2xhbmNlX29wczsKIAotCWRldi0+aXJxID0gb3AtPmlycXNbMF07CisJZGV2LT5pcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAogCS8qIFdlIGNhbm5vdCBzbGVlcCBpZiB0aGUgY2hpcCBpcyBidXN5IGR1cmluZyBhCiAJICogbXVsdGljYXN0IGxpc3QgdXBkYXRlIGV2ZW50LCBiZWNhdXNlIHN1Y2ggZXZlbnRzCkBAIC0xNTU4LDEyICsxNTU4LDEyIEBACiAvKiBGaW5kIGFsbCB0aGUgbGFuY2UgY2FyZHMgb24gdGhlIHN5c3RlbSBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCiBzdGF0aWMgaW50IF9faW5pdCBzcGFyY19sYW5jZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmc3VubGFuY2Vfc2J1c19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmc3VubGFuY2Vfc2J1c19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3BhcmNfbGFuY2VfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZzdW5sYW5jZV9zYnVzX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnN1bmxhbmNlX3NidXNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc3BhcmNfbGFuY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5xZS5jIGIvZHJpdmVycy9uZXQvc3VucWUuYwppbmRleCA3MmI1NzljLi41Zjg0YTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5xZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTgwMyw3ICs4MDMsNyBAQAogCiAJCQlxZWNfaW5pdF9vbmNlKHFlY3AsIG9wKTsKIAotCQkJaWYgKHJlcXVlc3RfaXJxKG9wLT5pcnFzWzBdLCBxZWNfaW50ZXJydXB0LAorCQkJaWYgKHJlcXVlc3RfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzBdLCBxZWNfaW50ZXJydXB0LAogCQkJCQlJUlFGX1NIQVJFRCwgInFlYyIsICh2b2lkICopIHFlY3ApKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJxZWM6IENhbid0IHJlZ2lzdGVyIGlycS5cbiIpOwogCQkJCWdvdG8gZmFpbDsKQEAgLTkwMSw3ICs5MDEsNyBAQAogCVNFVF9ORVRERVZfREVWKGRldiwgJm9wLT5kZXYpOwogCiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7Ci0JZGV2LT5pcnEgPSBvcC0+aXJxc1swXTsKKwlkZXYtPmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCWRldi0+ZG1hID0gMDsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJnFlX2V0aHRvb2xfb3BzOwogCWRldi0+bmV0ZGV2X29wcyA9ICZxZWNfb3BzOwpAQCAtOTg4LDE4ICs5ODgsMTggQEAKIAogc3RhdGljIGludCBfX2luaXQgcWVjX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZxZWNfc2J1c19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcWVjX3NidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHFlY19leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnFlY19zYnVzX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnFlY19zYnVzX2RyaXZlcik7CiAKIAl3aGlsZSAocm9vdF9xZWNfZGV2KSB7CiAJCXN0cnVjdCBzdW5xZWMgKm5leHQgPSByb290X3FlY19kZXYtPm5leHRfbW9kdWxlOwogCQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHJvb3RfcWVjX2Rldi0+b3A7CiAKLQkJZnJlZV9pcnEob3AtPmlycXNbMF0sICh2b2lkICopIHJvb3RfcWVjX2Rldik7CisJCWZyZWVfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzBdLCAodm9pZCAqKSByb290X3FlY19kZXYpOwogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHJvb3RfcWVjX2Rldi0+Z3JlZ3MsCiAJCQkgICBHTE9CX1JFR19TSVpFKTsKIAkJa2ZyZWUocm9vdF9xZWNfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RjMzU4MTUuYyBiL2RyaXZlcnMvbmV0L3RjMzU4MTUuYwppbmRleCBiZTA4Yjc1Li45OWU0MjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90YzM1ODE1LmMKKysrIGIvZHJpdmVycy9uZXQvdGMzNTgxNS5jCkBAIC0yMDY2LDcgKzIwNjYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWxwLT5waHlfZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gcGh5X21paV9pb2N0bChscC0+cGh5X2RldiwgaWZfbWlpKHJxKSwgY21kKTsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChscC0+cGh5X2RldiwgcnEsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHRjMzU4MTVfY2hpcF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVodXRpLmggYi9kcml2ZXJzL25ldC90ZWh1dGkuaAppbmRleCBjZmY5OGQwLi42N2UzYjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZWh1dGkuaAorKysgYi9kcml2ZXJzL25ldC90ZWh1dGkuaApAQCAtMzM0LDcgKzMzNCw3IEBACiAJdTMyIHZhX2xvOwogCXUzMiB2YV9oaTsKIAlzdHJ1Y3QgcGJsIHBibFswXTsJLyogRnJhZ21lbnRzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFJlZ2lzdGVyIHJlZ2lvbiBzaXplICovCiAjZGVmaW5lIEJEWF9SRUdTX1NJWkUJICAweDEwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggNTczMDU0YS4uYmMzYWY3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmMKKysrIGIvZHJpdmVycy9uZXQvdGczLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtNjcsOCArNjgsMTEgQEAKICNpbmNsdWRlICJ0ZzMuaCIKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJ0ZzMiCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4xMTAiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiQXByaWwgOSwgMjAxMCIKKyNkZWZpbmUgVEczX01BSl9OVU0JCQkzCisjZGVmaW5lIFRHM19NSU5fTlVNCQkJMTEzCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglcCisJX19zdHJpbmdpZnkoVEczX01BSl9OVU0pICIuIiBfX3N0cmluZ2lmeShURzNfTUlOX05VTSkKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJBdWd1c3QgMiwgMjAxMCIKIAogI2RlZmluZSBURzNfREVGX01BQ19NT0RFCTAKICNkZWZpbmUgVEczX0RFRl9SWF9NT0RFCQkwCkBAIC0xNDUsOCArMTQ5LDYgQEAKICNkZWZpbmUgVEczX1JYX0pNQl9CVUZGX1JJTkdfU0laRSBcCiAJKHNpemVvZihzdHJ1Y3QgcmluZ19pbmZvKSAqIFRHM19SWF9KVU1CT19SSU5HX1NJWkUpCiAKLSNkZWZpbmUgVEczX1JTU19NSU5fTlVNX01TSVhfVkVDUwkyCi0KIC8qIER1ZSB0byBhIGhhcmR3YXJlIGJ1ZywgdGhlIDU3MDEgY2FuIG9ubHkgRE1BIHRvIG1lbW9yeSBhZGRyZXNzZXMKICAqIHRoYXQgYXJlIGF0IGxlYXN0IGR3b3JkIGFsaWduZWQgd2hlbiB1c2VkIGluIFBDSVggbW9kZS4gIFRoZSBkcml2ZXIKICAqIHdvcmtzIGFyb3VuZCB0aGlzIGJ1ZyBieSBkb3VibGUgY29weWluZyB0aGUgcGFja2V0LiAgVGhpcyB3b3JrYXJvdW5kCkBAIC0yMTksMTIgKzIyMSw5IEBACiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMV8yKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNFNfMil9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVGKX0sCi0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcyMCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MjEpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzIyKX0sCi0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTEpfSwKLQl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUwTSl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTFNKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MUYpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUyKX0sCkBAIC0yNzIsNiArMjcxLDcgQEAKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc2NSl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzkxKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgVEczUENJX0RFVklDRV9USUdPTjNfNTc3OTUpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBURzNQQ0lfREVWSUNFX1RJR09OM181NzE5KX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfOURYWCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUXzlNWFgpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAwKX0sCkBAIC01ODUsMTggKzU4NSwyMyBAQAogc3RhdGljIHZvaWQgdGczX2FwZV9sb2NrX2luaXQoc3RydWN0IHRnMyAqdHApCiB7CiAJaW50IGk7CisJdTMyIHJlZ2Jhc2U7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NjEpCisJCXJlZ2Jhc2UgPSBURzNfQVBFX0xPQ0tfR1JBTlQ7CisJZWxzZQorCQlyZWdiYXNlID0gVEczX0FQRV9QRVJfTE9DS19HUkFOVDsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGhhc24ndCBhbnkgc3RhbGUgbG9ja3MuICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJdGczX2FwZV93cml0ZTMyKHRwLCBURzNfQVBFX0xPQ0tfR1JBTlQgKyA0ICogaSwKLQkJCQlBUEVfTE9DS19HUkFOVF9EUklWRVIpOworCQl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlZ2Jhc2UgKyA0ICogaSwgQVBFX0xPQ0tfR1JBTlRfRFJJVkVSKTsKIH0KIAogc3RhdGljIGludCB0ZzNfYXBlX2xvY2soc3RydWN0IHRnMyAqdHAsIGludCBsb2NrbnVtKQogewogCWludCBpLCBvZmY7CiAJaW50IHJldCA9IDA7Ci0JdTMyIHN0YXR1czsKKwl1MzIgc3RhdHVzLCByZXEsIGdudDsKIAogCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfRU5BQkxFX0FQRSkpCiAJCXJldHVybiAwOwpAQCAtNjA5LDEzICs2MTQsMjEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzYxKSB7CisJCXJlcSA9IFRHM19BUEVfTE9DS19SRVE7CisJCWdudCA9IFRHM19BUEVfTE9DS19HUkFOVDsKKwl9IGVsc2UgeworCQlyZXEgPSBURzNfQVBFX1BFUl9MT0NLX1JFUTsKKwkJZ250ID0gVEczX0FQRV9QRVJfTE9DS19HUkFOVDsKKwl9CisKIAlvZmYgPSA0ICogbG9ja251bTsKIAotCXRnM19hcGVfd3JpdGUzMih0cCwgVEczX0FQRV9MT0NLX1JFUSArIG9mZiwgQVBFX0xPQ0tfUkVRX0RSSVZFUik7CisJdGczX2FwZV93cml0ZTMyKHRwLCByZXEgKyBvZmYsIEFQRV9MT0NLX1JFUV9EUklWRVIpOwogCiAJLyogV2FpdCBmb3IgdXAgdG8gMSBtaWxsaXNlY29uZCB0byBhY3F1aXJlIGxvY2suICovCiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCXN0YXR1cyA9IHRnM19hcGVfcmVhZDMyKHRwLCBURzNfQVBFX0xPQ0tfR1JBTlQgKyBvZmYpOworCQlzdGF0dXMgPSB0ZzNfYXBlX3JlYWQzMih0cCwgZ250ICsgb2ZmKTsKIAkJaWYgKHN0YXR1cyA9PSBBUEVfTE9DS19HUkFOVF9EUklWRVIpCiAJCQlicmVhazsKIAkJdWRlbGF5KDEwKTsKQEAgLTYyMyw3ICs2MzYsNyBAQAogCiAJaWYgKHN0YXR1cyAhPSBBUEVfTE9DS19HUkFOVF9EUklWRVIpIHsKIAkJLyogUmV2b2tlIHRoZSBsb2NrIHJlcXVlc3QuICovCi0JCXRnM19hcGVfd3JpdGUzMih0cCwgVEczX0FQRV9MT0NLX0dSQU5UICsgb2ZmLAorCQl0ZzNfYXBlX3dyaXRlMzIodHAsIGdudCArIG9mZiwKIAkJCQlBUEVfTE9DS19HUkFOVF9EUklWRVIpOwogCiAJCXJldCA9IC1FQlVTWTsKQEAgLTYzNCw3ICs2NDcsNyBAQAogCiBzdGF0aWMgdm9pZCB0ZzNfYXBlX3VubG9jayhzdHJ1Y3QgdGczICp0cCwgaW50IGxvY2tudW0pCiB7Ci0JaW50IG9mZjsKKwl1MzIgZ250OwogCiAJaWYgKCEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19FTkFCTEVfQVBFKSkKIAkJcmV0dXJuOwpAQCAtNjQ3LDggKzY2MCwxMiBAQAogCQlyZXR1cm47CiAJfQogCi0Jb2ZmID0gNCAqIGxvY2tudW07Ci0JdGczX2FwZV93cml0ZTMyKHRwLCBURzNfQVBFX0xPQ0tfR1JBTlQgKyBvZmYsIEFQRV9MT0NLX0dSQU5UX0RSSVZFUik7CisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzYxKQorCQlnbnQgPSBURzNfQVBFX0xPQ0tfR1JBTlQ7CisJZWxzZQorCQlnbnQgPSBURzNfQVBFX1BFUl9MT0NLX0dSQU5UOworCisJdGczX2FwZV93cml0ZTMyKHRwLCBnbnQgKyA0ICogbG9ja251bSwgQVBFX0xPQ0tfR1JBTlRfRFJJVkVSKTsKIH0KIAogc3RhdGljIHZvaWQgdGczX2Rpc2FibGVfaW50cyhzdHJ1Y3QgdGczICp0cCkKQEAgLTg2Miw3ICs4NzksNyBAQAogCXVuc2lnbmVkIGludCBsb29wczsKIAlpbnQgcmV0OwogCi0JaWYgKCh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9JU19GRVQpICYmCisJaWYgKCh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpICYmCiAJICAgIChyZWcgPT0gTUlJX1RHM19DVFJMIHx8IHJlZyA9PSBNSUlfVEczX0FVWF9DVFJMKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTEwNjksMTQgKzEwODYsMTEgQEAKIAl1MzIgcmVnOwogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAKLQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcpIHsKLQkJdTMyIGZ1bmNudW0sIGlzX3NlcmRlczsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTkpIHsKKwkJdTMyIGlzX3NlcmRlczsKIAotCQlmdW5jbnVtID0gdHIzMihURzNfQ1BNVV9TVEFUVVMpICYgVEczX0NQTVVfU1RBVFVTX1BDSUVfRlVOQzsKLQkJaWYgKGZ1bmNudW0pCi0JCQl0cC0+cGh5X2FkZHIgPSAyOwotCQllbHNlCi0JCQl0cC0+cGh5X2FkZHIgPSAxOworCQl0cC0+cGh5X2FkZHIgPSBQQ0lfRlVOQyh0cC0+cGRldi0+ZGV2Zm4pICsgMTsKIAogCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MTdfQTApCiAJCQlpc19zZXJkZXMgPSB0cjMyKFNHX0RJR19TVEFUVVMpICYgU0dfRElHX0lTX1NFUkRFUzsKQEAgLTExNjEsNyArMTE3NSw3IEBACiAJY2FzZSBQSFlfSURfQkNNQUMxMzE6CiAJCXBoeWRldi0+aW50ZXJmYWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSTsKIAkJcGh5ZGV2LT5kZXZfZmxhZ3MgfD0gUEhZX0JSQ01fQVVUT19QV1JEV05fRU5BQkxFOwotCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM19QSFlfSVNfRkVUOworCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfSVNfRkVUOwogCQlicmVhazsKIAl9CiAKQEAgLTEyNTQsNyArMTI2OCw3IEBACiAJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfQ01EX0RBVEFfTUJPWCArIDQsIHZhbCk7CiAKIAl2YWwgPSAwOwotCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTUlJX1NFUkRFUykpIHsKKwlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKSkgewogCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQ1RSTDEwMDAsICZyZWcpKQogCQkJdmFsID0gcmVnIDw8IDE2OwogCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfU1RBVDEwMDAsICZyZWcpKQpAQCAtMTM2Miw3ICsxMzc2LDcgQEAKIAogCWlmIChhdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCiAJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUEFVU0VfQVVUT05FRykpIHsKLQkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQU5ZX1NFUkRFUykKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpCiAJCQlmbG93Y3RybCA9IHRnM19yZXNvbHZlX2Zsb3djdHJsXzEwMDBYKGxjbGFkdiwgcm10YWR2KTsKIAkJZWxzZQogCQkJZmxvd2N0cmwgPSBtaWlfcmVzb2x2ZV9mbG93Y3RybF9mZHgobGNsYWR2LCBybXRhZHYpOwpAQCAtMTQ3Niw3ICsxNDkwLDcgQEAKIHsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKQogCQlyZXR1cm4gMDsKIAogCS8qIEJyaW5nIHRoZSBQSFkgYmFjayB0byBhIGtub3duIHN0YXRlLiAqLwpAQCAtMTQ5Niw3ICsxNTEwLDcgQEAKIAlzd2l0Y2ggKHBoeWRldi0+aW50ZXJmYWNlKSB7CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfR01JSToKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSToKLQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkgeworCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkpIHsKIAkJCXBoeWRldi0+c3VwcG9ydGVkICY9IChQSFlfR0JJVF9GRUFUVVJFUyB8CiAJCQkJCSAgICAgIFNVUFBPUlRFRF9QYXVzZSB8CiAJCQkJCSAgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKQEAgLTE1MTMsNyArMTUyNyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXRwLT50ZzNfZmxhZ3MzIHw9IFRHM19GTEczX1BIWV9DT05ORUNURUQ7CisJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRDsKIAogCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIApAQCAtMTUyNCwxMyArMTUzOCwxMyBAQAogewogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAKLQlpZiAoISh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9DT05ORUNURUQpKQorCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkpCiAJCXJldHVybjsKIAogCXBoeWRldiA9IHRwLT5tZGlvX2J1cy0+cGh5X21hcFtURzNfUEhZX01JSV9BRERSXTsKIAotCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikgewotCQl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDA7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikgeworCQl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX0lTX0xPV19QT1dFUjsKIAkJcGh5ZGV2LT5zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX3NwZWVkOwogCQlwaHlkZXYtPmR1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX2R1cGxleDsKIAkJcGh5ZGV2LT5hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLm9yaWdfYXV0b25lZzsKQEAgLTE1NDQsNyArMTU1OCw3IEBACiAKIHN0YXRpYyB2b2lkIHRnM19waHlfc3RvcChzdHJ1Y3QgdGczICp0cCkKIHsKLQlpZiAoISh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9DT05ORUNURUQpKQorCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkpCiAJCXJldHVybjsKIAogCXBoeV9zdG9wKHRwLT5tZGlvX2J1cy0+cGh5X21hcFtURzNfUEhZX01JSV9BRERSXSk7CkBAIC0xNTUyLDE2ICsxNTY2LDIxIEBACiAKIHN0YXRpYyB2b2lkIHRnM19waHlfZmluaShzdHJ1Y3QgdGczICp0cCkKIHsKLQlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfQ09OTkVDVEVEKSB7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkgewogCQlwaHlfZGlzY29ubmVjdCh0cC0+bWRpb19idXMtPnBoeV9tYXBbVEczX1BIWV9NSUlfQUREUl0pOwotCQl0cC0+dGczX2ZsYWdzMyAmPSB+VEczX0ZMRzNfUEhZX0NPTk5FQ1RFRDsKKwkJdHAtPnBoeV9mbGFncyAmPSB+VEczX1BIWUZMR19JU19DT05ORUNURUQ7CiAJfQogfQogCi1zdGF0aWMgdm9pZCB0ZzNfcGh5ZHNwX3dyaXRlKHN0cnVjdCB0ZzMgKnRwLCB1MzIgcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCB0ZzNfcGh5ZHNwX3dyaXRlKHN0cnVjdCB0ZzMgKnRwLCB1MzIgcmVnLCB1MzIgdmFsKQogewotCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgcmVnKTsKLQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIHZhbCk7CisJaW50IGVycjsKKworCWVyciA9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgcmVnKTsKKwlpZiAoIWVycikKKwkJZXJyID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCB2YWwpOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgdGczX3BoeV9mZXRfdG9nZ2xlX2FwZChzdHJ1Y3QgdGczICp0cCwgYm9vbCBlbmFibGUpCkBAIC0xNTg5LDExICsxNjA4LDEyIEBACiAJdTMyIHJlZzsKIAogCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSB8fAotCQkoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgJiYKLQkgICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01JSV9TRVJERVMpKSkKKwkgICAgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCSAgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5KSAmJgorCSAgICAgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX01JSV9TRVJERVMpKSkKIAkJcmV0dXJuOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkgeworCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpIHsKIAkJdGczX3BoeV9mZXRfdG9nZ2xlX2FwZCh0cCwgZW5hYmxlKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2MjQsMTAgKzE2NDQsMTAgQEAKIAl1MzIgcGh5OwogCiAJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHx8Ci0JICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FOWV9TRVJERVMpKQorCSAgICAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykpCiAJCXJldHVybjsKIAotCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9JU19GRVQpIHsKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfRkVUKSB7CiAJCXUzMiBlcGh5OwogCiAJCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRkVUX1RFU1QsICZlcGh5KSkgewpAQCAtMTY2Myw3ICsxNjgzLDcgQEAKIHsKIAl1MzIgdmFsOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQpCisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX05PX0VUSF9XSVJFX1NQRUVEKQogCQlyZXR1cm47CiAKIAlpZiAoIXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg3MDA3KSAmJgpAQCAtMTcyMiw3ICsxNzQyLDcgQEAKIAl3aGlsZSAobGltaXQtLSkgewogCQl1MzIgdG1wMzI7CiAKLQkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgMHgxNiwgJnRtcDMyKSkgeworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9DT05UUk9MLCAmdG1wMzIpKSB7CiAJCQlpZiAoKHRtcDMyICYgMHgxMDAwKSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xNzQ4LDEzICsxNzY4LDEzIEBACiAKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLAogCQkJICAgICAoY2hhbiAqIDB4MjAwMCkgfCAweDAyMDApOwotCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDAwMik7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQ09OVFJPTCwgMHgwMDAyKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULAogCQkJCSAgICAgdGVzdF9wYXRbY2hhbl1baV0pOwogCi0JCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9DT05UUk9MLCAweDAyMDIpOwogCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKIAkJCSpyZXNldHAgPSAxOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTE3NjIsMTMgKzE3ODIsMTMgQEAKIAogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCiAJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7Ci0JCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDgyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9DT05UUk9MLCAweDAwODIpOwogCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKIAkJCSpyZXNldHAgPSAxOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCi0JCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwODAyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9DT05UUk9MLCAweDA4MDIpOwogCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpIHsKIAkJCSpyZXNldHAgPSAxOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTE4MDgsMTAgKzE4MjgsMTAgQEAKIAogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCiAJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7Ci0JCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9DT05UUk9MLCAweDAwMDIpOwogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAwMCk7Ci0JCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9DT05UUk9MLCAweDAyMDIpOwogCQlpZiAodGczX3dhaXRfbWFjcm9fZG9uZSh0cCkpCiAJCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE4NTcsOCArMTg3Nyw3IEBACiAJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKIAogCQkvKiBCbG9jayB0aGUgUEhZIGNvbnRyb2wgYWNjZXNzLiAgKi8KLQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDUpOwotCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDgwMCk7CisJCXRnM19waHlkc3Bfd3JpdGUodHAsIDB4ODAwNSwgMHgwODAwKTsKIAogCQllcnIgPSB0ZzNfcGh5X3dyaXRlX2FuZF9jaGVja190ZXN0cGF0KHRwLCAmZG9fcGh5X3Jlc2V0KTsKIAkJaWYgKCFlcnIpCkBAIC0xODY5LDExICsxODg4LDEwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA1KTsKLQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MDAwMCk7CisJdGczX3BoeWRzcF93cml0ZSh0cCwgMHg4MDA1LCAweDAwMDApOwogCiAJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgyMDApOwotCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAwKTsKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0NPTlRST0wsIDB4MDAwMCk7CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKQEAgLTE5NjQsNDMgKzE5ODIsMzkgQEAKIAkJfQogCX0KIAotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyAmJgotCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9NSUlfU0VSREVTKSkKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8CisJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkgJiYKKwkgICAgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX01JSV9TRVJERVMpKQogCQlyZXR1cm4gMDsKIAogCXRnM19waHlfYXBwbHlfb3RwKHRwKTsKIAotCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9FTkFCTEVfQVBEKQorCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19FTkFCTEVfQVBEKQogCQl0ZzNfcGh5X3RvZ2dsZV9hcGQodHAsIHRydWUpOwogCWVsc2UKIAkJdGczX3BoeV90b2dnbGVfYXBkKHRwLCBmYWxzZSk7CiAKIG91dDoKLQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfQURDX0JVRykgeworCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BRENfQlVHKSB7CiAJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKLQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDIwMWYpOwotCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MmFhYSk7Ci0JCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDBhKTsKLQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAzMjMpOworCQl0ZzNfcGh5ZHNwX3dyaXRlKHRwLCAweDIwMWYsIDB4MmFhYSk7CisJCXRnM19waHlkc3Bfd3JpdGUodHAsIDB4MDAwYSwgMHgwMzIzKTsKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOwogCX0KLQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUcpIHsKLQkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhkNjgpOwotCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHXzU3MDRfQTBfQlVHKSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19NSVNDX1NIRFcsIDB4OGQ2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19NSVNDX1NIRFcsIDB4OGQ2OCk7CiAJfQotCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9CRVJfQlVHKSB7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0JFUl9CVUcpIHsKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMDApOwotCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAwYSk7Ci0JCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgzMTBiKTsKLQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDIwMWYpOwotCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4OTUwNik7Ci0JCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg0MDFmKTsKLQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDE0ZTIpOworCQl0ZzNfcGh5ZHNwX3dyaXRlKHRwLCAweDAwMGEsIDB4MzEwYik7CisJCXRnM19waHlkc3Bfd3JpdGUodHAsIDB4MjAxZiwgMHg5NTA2KTsKKwkJdGczX3BoeWRzcF93cml0ZSh0cCwgMHg0MDFmLCAweDE0ZTIpOwogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MDQwMCk7Ci0JfSBlbHNlIGlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9KSVRURVJfQlVHKSB7CisJfSBlbHNlIGlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19KSVRURVJfQlVHKSB7CiAJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMGEpOwotCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfQURKVVNUX1RSSU0pIHsKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FESlVTVF9UUklNKSB7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MTEwYik7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfVEVTVDEsCiAJCQkJICAgICBNSUlfVEczX1RFU1QxX1RSSU1fRU4gfCAweDQpOwpAQCAtMjA0OSw2ICsyMDYzLDcgQEAKIAogCS8qIFRoZSBHUElPcyBkbyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgb24gNTc3NjUuICovCiAJaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0lTX05JQykgPT0gMCB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpCiAJCXJldHVybjsKIApAQCAtMjE4NCw3ICsyMTk5LDcgQEAKIHsKIAl1MzIgdmFsOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSB7CiAJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgewogCQkJdTMyIHNnX2RpZ19jdHJsID0gdHIzMihTR19ESUdfQ1RSTCk7CiAJCQl1MzIgc2VyZGVzX2NmZyA9IHRyMzIoTUFDX1NFUkRFU19DRkcpOwpAQCAtMjIwMyw3ICsyMjE4LDcgQEAKIAkJdHczMl9mKEdSQ19NSVNDX0NGRywgdmFsIHwgR1JDX01JU0NfQ0ZHX0VQSFlfSUREUSk7CiAJCXVkZWxheSg0MCk7CiAJCXJldHVybjsKLQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkgeworCX0gZWxzZSBpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfRkVUKSB7CiAJCXUzMiBwaHl0ZXN0OwogCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0ZFVF9URVNULCAmcGh5dGVzdCkpIHsKIAkJCXUzMiBwaHk7CkBAIC0yMjQwLDcgKzIyNTUsNyBAQAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCB8fAogCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODAgJiYKLQkgICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01JSV9TRVJERVMpKSkKKwkgICAgICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKSkpCiAJCXJldHVybjsKIAogCWlmIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQ0hJUFJFVl81Nzg0X0FYIHx8CkBAIC0yNTQzLDE0ICsyNTU4LDE0IEBACiAKIAlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSB7CiAJCWRvX2xvd19wb3dlciA9IGZhbHNlOwotCQlpZiAoKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkgJiYKLQkJICAgICF0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikgeworCQlpZiAoKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkgJiYKKwkJICAgICEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfTE9XX1BPV0VSKSkgewogCQkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAkJCXUzMiBwaHlpZCwgYWR2ZXJ0aXNpbmc7CiAKIAkJCXBoeWRldiA9IHRwLT5tZGlvX2J1cy0+cGh5X21hcFtURzNfUEhZX01JSV9BRERSXTsKIAotCQkJdHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIgPSAxOworCQkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX0lTX0xPV19QT1dFUjsKIAogCQkJdHAtPmxpbmtfY29uZmlnLm9yaWdfc3BlZWQgPSBwaHlkZXYtPnNwZWVkOwogCQkJdHAtPmxpbmtfY29uZmlnLm9yaWdfZHVwbGV4ID0gcGh5ZGV2LT5kdXBsZXg7CkBAIC0yNTg5LDE0ICsyNjA0LDE0IEBACiAJfSBlbHNlIHsKIAkJZG9fbG93X3Bvd2VyID0gdHJ1ZTsKIAotCQlpZiAodHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIgPT0gMCkgewotCQkJdHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIgPSAxOworCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19MT1dfUE9XRVIpKSB7CisJCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfSVNfTE9XX1BPV0VSOwogCQkJdHAtPmxpbmtfY29uZmlnLm9yaWdfc3BlZWQgPSB0cC0+bGlua19jb25maWcuc3BlZWQ7CiAJCQl0cC0+bGlua19jb25maWcub3JpZ19kdXBsZXggPSB0cC0+bGlua19jb25maWcuZHVwbGV4OwogCQkJdHAtPmxpbmtfY29uZmlnLm9yaWdfYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnOwogCQl9CiAKLQkJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSkgeworCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSkgewogCQkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfMTA7CiAJCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gRFVQTEVYX0hBTEY7CiAJCQl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwpAQCAtMjYyOSwxMyArMjY0NCwxMyBAQAogCWlmIChkZXZpY2Vfc2hvdWxkX3dha2UpIHsKIAkJdTMyIG1hY19tb2RlOwogCi0JCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEhZX1NFUkRFUykpIHsKIAkJCWlmIChkb19sb3dfcG93ZXIpIHsKIAkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NWEpOwogCQkJCXVkZWxheSg0MCk7CiAJCQl9CiAKLQkJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01JSV9TRVJERVMpCisJCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfTUlJX1NFUkRFUykKIAkJCQltYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOwogCQkJZWxzZQogCQkJCW1hY19tb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX01JSTsKQEAgLTI4MDMsNyArMjgxOCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkgeworCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfRkVUKSB7CiAJCQkqc3BlZWQgPSAodmFsICYgTUlJX1RHM19BVVhfU1RBVF8xMDApID8gU1BFRURfMTAwIDoKIAkJCQkgU1BFRURfMTA7CiAJCQkqZHVwbGV4ID0gKHZhbCAmIE1JSV9URzNfQVVYX1NUQVRfRlVMTCkgPyBEVVBMRVhfRlVMTCA6CkBAIC0yODIxLDcgKzI4MzYsNyBAQAogCXUzMiBuZXdfYWR2OwogCWludCBpOwogCi0JaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyKSB7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikgewogCQkvKiBFbnRlcmluZyBsb3cgcG93ZXIgbW9kZS4gIERpc2FibGUgZ2lnYWJpdCBhbmQKIAkJICogMTAwYmFzZVQgYWR2ZXJ0aXNlbWVudHMuCiAJCSAqLwpAQCAtMjgzNCw3ICsyODQ5LDcgQEAKIAogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIG5ld19hZHYpOwogCX0gZWxzZSBpZiAodHAtPmxpbmtfY29uZmlnLnNwZWVkID09IFNQRUVEX0lOVkFMSUQpIHsKLQkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHXzEwXzEwMF9PTkxZKQogCQkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICY9CiAJCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKIAkJCQkgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOwpAQCAtMjg2MCw3ICsyODc1LDcgQEAKIAkJCQluZXdfYWR2IHw9IE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGOwogCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCiAJCQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTDsKLQkJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgJiYKKwkJCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHXzEwXzEwMF9PTkxZKSAmJgogCQkJICAgICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAogCQkJICAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCkpCiAJCQkJbmV3X2FkdiB8PSAoTUlJX1RHM19DVFJMX0FTX01BU1RFUiB8CkBAIC0yOTYyLDIwICsyOTc3LDExIEBACiAJLyogU2V0IEV4dGVuZGVkIHBhY2tldCBsZW5ndGggYml0ICovCiAJZXJyICA9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg0YzIwKTsKIAotCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAxMik7Ci0JZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgxODA0KTsKLQotCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAxMyk7Ci0JZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgxMjA0KTsKLQotCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNik7Ci0JZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMTMyKTsKLQotCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNik7Ci0JZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMjMyKTsKLQotCWVyciB8PSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MjAxZik7Ci0JZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwYTIwKTsKKwllcnIgfD0gdGczX3BoeWRzcF93cml0ZSh0cCwgMHgwMDEyLCAweDE4MDQpOworCWVyciB8PSB0ZzNfcGh5ZHNwX3dyaXRlKHRwLCAweDAwMTMsIDB4MTIwNCk7CisJZXJyIHw9IHRnM19waHlkc3Bfd3JpdGUodHAsIDB4ODAwNiwgMHgwMTMyKTsKKwllcnIgfD0gdGczX3BoeWRzcF93cml0ZSh0cCwgMHg4MDA2LCAweDAyMzIpOworCWVyciB8PSB0ZzNfcGh5ZHNwX3dyaXRlKHRwLCAweDIwMWYsIDB4MGEyMCk7CiAKIAl1ZGVsYXkoNDApOwogCkBAIC0zMDAwLDcgKzMwMDYsNyBAQAogCiAJaWYgKChhZHZfcmVnICYgYWxsX21hc2spICE9IGFsbF9tYXNrKQogCQlyZXR1cm4gMDsKLQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKSB7CisJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKSB7CiAJCXUzMiB0ZzNfY3RybDsKIAogCQlhbGxfbWFzayA9IDA7CkBAIC0zMTI4LDE4ICszMTM0LDE4IEBACiAJCSAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSB7CiAJCS8qIDU3MDEge0EwLEIwfSBDUkMgYnVnIHdvcmthcm91bmQgKi8KIAkJdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDBhNzUpOwotCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGM2OCk7Ci0JCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKLQkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhjNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfTUlTQ19TSERXLCAweDhjNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfTUlTQ19TSERXLCAweDhkNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfTUlTQ19TSERXLCAweDhjNjgpOwogCX0KIAogCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4uLiAqLwogCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOwogCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKQorCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19VU0VfTUlfSU5URVJSVVBUKQogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfSU1BU0ssIH5NSUlfVEczX0lOVF9MSU5LQ0hHKTsKLQllbHNlIGlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkpCisJZWxzZSBpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpKQogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfSU1BU0ssIH4wKTsKIAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fApAQCAtMzE1NSw3ICszMTYxLDcgQEAKIAljdXJyZW50X3NwZWVkID0gU1BFRURfSU5WQUxJRDsKIAljdXJyZW50X2R1cGxleCA9IERVUExFWF9JTlZBTElEOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORykgeworCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19DQVBBQ0lUSVZFX0NPVVBMSU5HKSB7CiAJCXUzMiB2YWw7CiAKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDQwMDcpOwpAQCAtMzIzMSw3ICszMjM3LDcgQEAKIAl9CiAKIHJlbGluazoKLQlpZiAoY3VycmVudF9saW5rX3VwID09IDAgfHwgdHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIpIHsKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDAgfHwgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikpIHsKIAkJdTMyIHRtcDsKIAogCQl0ZzNfcGh5X2NvcHBlcl9iZWdpbih0cCk7CkBAIC0zMjQ5LDcgKzMyNTUsNyBAQAogCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CiAJCWVsc2UKIAkJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKLQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkKKwl9IGVsc2UgaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0ZFVCkKIAkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CiAJZWxzZQogCQl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CkBAIC0zODAwLDcgKzM4MDYsNyBAQAogCQlleHBlY3RlZF9zZ19kaWdfY3RybCB8PSBTR19ESUdfQVNZTV9QQVVTRTsKIAogCWlmIChzZ19kaWdfY3RybCAhPSBleHBlY3RlZF9zZ19kaWdfY3RybCkgewotCQlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEFSQUxMRUxfREVURUNUKSAmJgorCQlpZiAoKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVCkgJiYKIAkJICAgIHRwLT5zZXJkZXNfY291bnRlciAmJgogCQkgICAgKChtYWNfc3RhdHVzICYgKE1BQ19TVEFUVVNfUENTX1NZTkNFRCB8CiAJCQkJICAgIE1BQ19TVEFUVVNfUkNWRF9DRkcpKSA9PQpAQCAtMzgxNyw3ICszODIzLDcgQEAKIAkJdHczMl9mKFNHX0RJR19DVFJMLCBleHBlY3RlZF9zZ19kaWdfY3RybCk7CiAKIAkJdHAtPnNlcmRlc19jb3VudGVyID0gU0VSREVTX0FOX1RJTUVPVVRfNTcwNFM7Ci0JCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QQVJBTExFTF9ERVRFQ1Q7CisJCXRwLT5waHlfZmxhZ3MgJj0gflRHM19QSFlGTEdfUEFSQUxMRUxfREVURUNUOwogCX0gZWxzZSBpZiAobWFjX3N0YXR1cyAmIChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAogCQkJCSBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSB7CiAJCXNnX2RpZ19zdGF0dXMgPSB0cjMyKFNHX0RJR19TVEFUVVMpOwpAQCAtMzg0MCw3ICszODQ2LDcgQEAKIAkJCXRnM19zZXR1cF9mbG93X2NvbnRyb2wodHAsIGxvY2FsX2FkdiwgcmVtb3RlX2Fkdik7CiAJCQljdXJyZW50X2xpbmtfdXAgPSAxOwogCQkJdHAtPnNlcmRlc19jb3VudGVyID0gMDsKLQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QQVJBTExFTF9ERVRFQ1Q7CisJCQl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVDsKIAkJfSBlbHNlIGlmICghKHNnX2RpZ19zdGF0dXMgJiBTR19ESUdfQVVUT05FR19DT01QTEVURSkpIHsKIAkJCWlmICh0cC0+c2VyZGVzX2NvdW50ZXIpCiAJCQkJdHAtPnNlcmRlc19jb3VudGVyLS07CkBAIC0zODY3LDggKzM4NzMsOCBAQAogCQkJCSAgICAhKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSkgewogCQkJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCAwLCAwKTsKIAkJCQkJY3VycmVudF9saW5rX3VwID0gMTsKLQkJCQkJdHAtPnRnM19mbGFnczIgfD0KLQkJCQkJCVRHM19GTEcyX1BBUkFMTEVMX0RFVEVDVDsKKwkJCQkJdHAtPnBoeV9mbGFncyB8PQorCQkJCQkJVEczX1BIWUZMR19QQVJBTExFTF9ERVRFQ1Q7CiAJCQkJCXRwLT5zZXJkZXNfY291bnRlciA9CiAJCQkJCQlTRVJERVNfUEFSQUxMRUxfREVUX1RJTUVPVVQ7CiAJCQkJfSBlbHNlCkBAIC0zODc3LDcgKzM4ODMsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJdHAtPnNlcmRlc19jb3VudGVyID0gU0VSREVTX0FOX1RJTUVPVVRfNTcwNFM7Ci0JCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QQVJBTExFTF9ERVRFQ1Q7CisJCXRwLT5waHlfZmxhZ3MgJj0gflRHM19QSFlGTEdfUEFSQUxMRUxfREVURUNUOwogCX0KIAogb3V0OgpAQCAtNDA5NCw3ICs0MTAwLDcgQEAKIAllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcik7CiAKIAlpZiAoKHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSAmJiAhZm9yY2VfcmVzZXQgJiYKLQkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEFSQUxMRUxfREVURUNUKSkgeworCSAgICAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEFSQUxMRUxfREVURUNUKSkgewogCQkvKiBkbyBub3RoaW5nLCBqdXN0IGNoZWNrIGZvciBsaW5rIHVwIGF0IHRoZSBlbmQgKi8KIAl9IGVsc2UgaWYgKHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCXUzMiBhZHYsIG5ld19hZHY7CkBAIC00MTE5LDcgKzQxMjUsNyBAQAogCiAJCQl0dzMyX2YoTUFDX0VWRU5ULCBNQUNfRVZFTlRfTE5LU1RBVEVfQ0hBTkdFRCk7CiAJCQl0cC0+c2VyZGVzX2NvdW50ZXIgPSBTRVJERVNfQU5fVElNRU9VVF81NzE0UzsKLQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QQVJBTExFTF9ERVRFQ1Q7CisJCQl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVDsKIAogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtNDE2NCw3ICs0MTcwLDcgQEAKIAkJCQllbHNlCiAJCQkJCWJtc3IgJj0gfkJNU1JfTFNUQVRVUzsKIAkJCX0KLQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QQVJBTExFTF9ERVRFQ1Q7CisJCQl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVDsKIAkJfQogCX0KIApAQCAtNDE5MSw2ICs0MTk3LDggQEAKIAkJCQkJY3VycmVudF9kdXBsZXggPSBEVVBMRVhfRlVMTDsKIAkJCQllbHNlCiAJCQkJCWN1cnJlbnRfZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQl9IGVsc2UgaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzgwX0NMQVNTKSkgeworCQkJCS8qIExpbmsgaXMgdXAgdmlhIHBhcmFsbGVsIGRldGVjdCAqLwogCQkJfSBlbHNlIHsKIAkJCQljdXJyZW50X2xpbmtfdXAgPSAwOwogCQkJfQpAQCAtNDIxNyw3ICs0MjI1LDcgQEAKIAkJCW5ldGlmX2NhcnJpZXJfb24odHAtPmRldik7CiAJCWVsc2UgewogCQkJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7Ci0JCQl0cC0+dGczX2ZsYWdzMiAmPSB+VEczX0ZMRzJfUEFSQUxMRUxfREVURUNUOworCQkJdHAtPnBoeV9mbGFncyAmPSB+VEczX1BIWUZMR19QQVJBTExFTF9ERVRFQ1Q7CiAJCX0KIAkJdGczX2xpbmtfcmVwb3J0KHRwKTsKIAl9CkBAIC00MjQxLDEzICs0MjQ5LDE0IEBACiAJCQl1MzIgcGh5MSwgcGh5MjsKIAogCQkJLyogU2VsZWN0IHNoYWRvdyByZWdpc3RlciAweDFmICovCi0JCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4N2MwMCk7Ci0JCQl0ZzNfcmVhZHBoeSh0cCwgMHgxYywgJnBoeTEpOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX01JU0NfU0hEVywgMHg3YzAwKTsKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX01JU0NfU0hEVywgJnBoeTEpOwogCiAJCQkvKiBTZWxlY3QgZXhwYW5zaW9uIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCXRnM193cml0ZXBoeSh0cCwgMHgxNywgMHgwZjAxKTsKLQkJCXRnM19yZWFkcGh5KHRwLCAweDE1LCAmcGh5Mik7Ci0JCQl0ZzNfcmVhZHBoeSh0cCwgMHgxNSwgJnBoeTIpOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLAorCQkJCQkgTUlJX1RHM19EU1BfRVhQMV9JTlRfU1RBVCk7CisJCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgJnBoeTIpOworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsICZwaHkyKTsKIAogCQkJaWYgKChwaHkxICYgMHgxMCkgJiYgIShwaHkyICYgMHgyMCkpIHsKIAkJCQkvKiBXZSBoYXZlIHNpZ25hbCBkZXRlY3QgYW5kIG5vdCByZWNlaXZpbmcKQEAgLTQyNTgsMTcgKzQyNjcsMTggQEAKIAkJCQlibWNyICY9IH5CTUNSX0FORU5BQkxFOwogCQkJCWJtY3IgfD0gQk1DUl9TUEVFRDEwMDAgfCBCTUNSX0ZVTExEUExYOwogCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIGJtY3IpOwotCQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BBUkFMTEVMX0RFVEVDVDsKKwkJCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfUEFSQUxMRUxfREVURUNUOwogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpICYmCiAJCSAgICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgJiYKLQkJICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEFSQUxMRUxfREVURUNUKSkgeworCQkgICAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEFSQUxMRUxfREVURUNUKSkgewogCQl1MzIgcGh5MjsKIAogCQkvKiBTZWxlY3QgZXhwYW5zaW9uIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJdGczX3dyaXRlcGh5KHRwLCAweDE3LCAweDBmMDEpOwotCQl0ZzNfcmVhZHBoeSh0cCwgMHgxNSwgJnBoeTIpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkJIE1JSV9URzNfRFNQX0VYUDFfSU5UX1NUQVQpOworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgJnBoeTIpOwogCQlpZiAocGh5MiAmIDB4MjApIHsKIAkJCXUzMiBibWNyOwogCkBAIC00Mjc2LDcgKzQyODYsNyBAQAogCQkJdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcik7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBibWNyIHwgQk1DUl9BTkVOQUJMRSk7CiAKLQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QQVJBTExFTF9ERVRFQ1Q7CisJCQl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVDsKIAogCQl9CiAJfQpAQCAtNDI4Niw5ICs0Mjk2LDkgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEhZX1NFUkRFUykKIAkJZXJyID0gdGczX3NldHVwX2ZpYmVyX3BoeSh0cCwgZm9yY2VfcmVzZXQpOwotCWVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTUlJX1NFUkRFUykKKwllbHNlIGlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKQogCQllcnIgPSB0ZzNfc2V0dXBfZmliZXJfbWlpX3BoeSh0cCwgZm9yY2VfcmVzZXQpOwogCWVsc2UKIAkJZXJyID0gdGczX3NldHVwX2NvcHBlcl9waHkodHAsIGZvcmNlX3Jlc2V0KTsKQEAgLTQzNjcsNyArNDM3Nyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdTMyIHRnM190eF9hdmFpbChzdHJ1Y3QgdGczX25hcGkgKnRuYXBpKQogewotCXNtcF9tYigpOworCS8qIFRlbGwgY29tcGlsZXIgdG8gZmV0Y2ggdHggaW5kaWNlcyBmcm9tIG1lbW9yeS4gKi8KKwliYXJyaWVyKCk7CiAJcmV0dXJuIHRuYXBpLT50eF9wZW5kaW5nIC0KIAkgICAgICAgKCh0bmFwaS0+dHhfcHJvZCAtIHRuYXBpLT50eF9jb25zKSAmIChURzNfVFhfUklOR19TSVpFIC0gMSkpOwogfQpAQCAtNTU1Miw4ICs1NTYzLDggQEAKIAogCWVudHJ5ID0gdG5hcGktPnR4X3Byb2Q7CiAJYmFzZV9mbGFncyA9IDA7Ci0JbXNzID0gMDsKLQlpZiAoKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICE9IDApIHsKKwltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCWlmIChtc3MpIHsKIAkJaW50IHRjcF9vcHRfbGVuLCBpcF90Y3BfbGVuOwogCQl1MzIgaGRybGVuOwogCkBAIC01NjUxLDYgKzU2NjIsMTMgQEAKIAl0bmFwaS0+dHhfcHJvZCA9IGVudHJ5OwogCWlmICh1bmxpa2VseSh0ZzNfdHhfYXZhaWwodG5hcGkpIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpKSB7CiAJCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKKworCQkvKiBuZXRpZl90eF9zdG9wX3F1ZXVlKCkgbXVzdCBiZSBkb25lIGJlZm9yZSBjaGVja2luZworCQkgKiBjaGVja2luZyB0eCBpbmRleCBpbiB0ZzNfdHhfYXZhaWwoKSBiZWxvdywgYmVjYXVzZSBpbgorCQkgKiB0ZzNfdHgoKSwgd2UgdXBkYXRlIHR4IGluZGV4IGJlZm9yZSBjaGVja2luZyBmb3IKKwkJICogbmV0aWZfdHhfcXVldWVfc3RvcHBlZCgpLgorCQkgKi8KKwkJc21wX21iKCk7CiAJCWlmICh0ZzNfdHhfYXZhaWwodG5hcGkpID4gVEczX1RYX1dBS0VVUF9USFJFU0godG5hcGkpKQogCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZSh0eHEpOwogCX0KQEAgLTU2OTYsNiArNTcxNCwxMyBAQAogCS8qIEVzdGltYXRlIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIGluIHRoZSB3b3JzdCBjYXNlICovCiAJaWYgKHVubGlrZWx5KHRnM190eF9hdmFpbCgmdHAtPm5hcGlbMF0pIDw9IGZyYWdfY250X2VzdCkpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZSh0cC0+ZGV2KTsKKworCQkvKiBuZXRpZl90eF9zdG9wX3F1ZXVlKCkgbXVzdCBiZSBkb25lIGJlZm9yZSBjaGVja2luZworCQkgKiBjaGVja2luZyB0eCBpbmRleCBpbiB0ZzNfdHhfYXZhaWwoKSBiZWxvdywgYmVjYXVzZSBpbgorCQkgKiB0ZzNfdHgoKSwgd2UgdXBkYXRlIHR4IGluZGV4IGJlZm9yZSBjaGVja2luZyBmb3IKKwkJICogbmV0aWZfdHhfcXVldWVfc3RvcHBlZCgpLgorCQkgKi8KKwkJc21wX21iKCk7CiAJCWlmICh0ZzNfdHhfYXZhaWwoJnRwLT5uYXBpWzBdKSA8PSBmcmFnX2NudF9lc3QpCiAJCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAKQEAgLTU3NTksOSArNTc4NCwxMCBAQAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQogCQliYXNlX2ZsYWdzIHw9IFRYRF9GTEFHX1RDUFVEUF9DU1VNOwogCi0JaWYgKChtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSAhPSAwKSB7CisJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwlpZiAobXNzKSB7CiAJCXN0cnVjdCBpcGhkciAqaXBoOwotCQl1MzIgdGNwX29wdF9sZW4sIGlwX3RjcF9sZW4sIGhkcl9sZW47CisJCXUzMiB0Y3Bfb3B0X2xlbiwgaGRyX2xlbjsKIAogCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSAmJgogCQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSB7CkBAIC01NzY5LDEwICs1Nzk1LDIxIEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAorCQlpcGggPSBpcF9oZHIoc2tiKTsKIAkJdGNwX29wdF9sZW4gPSB0Y3Bfb3B0bGVuKHNrYik7Ci0JCWlwX3RjcF9sZW4gPSBpcF9oZHJsZW4oc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAotCQloZHJfbGVuID0gaXBfdGNwX2xlbiArIHRjcF9vcHRfbGVuOworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjYpIHsKKwkJCWhkcl9sZW4gPSBza2JfaGVhZGxlbihza2IpIC0gRVRIX0hMRU47CisJCX0gZWxzZSB7CisJCQl1MzIgaXBfdGNwX2xlbjsKKworCQkJaXBfdGNwX2xlbiA9IGlwX2hkcmxlbihza2IpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCQkJaGRyX2xlbiA9IGlwX3RjcF9sZW4gKyB0Y3Bfb3B0X2xlbjsKKworCQkJaXBoLT5jaGVjayA9IDA7CisJCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBoZHJfbGVuKTsKKwkJfQorCiAJCWlmICh1bmxpa2VseSgoRVRIX0hMRU4gKyBoZHJfbGVuKSA+IDgwKSAmJgogCQkJICAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQlVHKSkKIAkJCXJldHVybiB0ZzNfdHNvX2J1Zyh0cCwgc2tiKTsKQEAgLTU3ODAsOSArNTgxNyw2IEBACiAJCWJhc2VfZmxhZ3MgfD0gKFRYRF9GTEFHX0NQVV9QUkVfRE1BIHwKIAkJCSAgICAgICBUWERfRkxBR19DUFVfUE9TVF9ETUEpOwogCi0JCWlwaCA9IGlwX2hkcihza2IpOwotCQlpcGgtPmNoZWNrID0gMDsKLQkJaXBoLT50b3RfbGVuID0gaHRvbnMobXNzICsgaGRyX2xlbik7CiAJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgewogCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IDA7CiAJCQliYXNlX2ZsYWdzICY9IH5UWERfRkxBR19UQ1BVRFBfQ1NVTTsKQEAgLTU5MjIsNiArNTk1NiwxMyBAQAogCXRuYXBpLT50eF9wcm9kID0gZW50cnk7CiAJaWYgKHVubGlrZWx5KHRnM190eF9hdmFpbCh0bmFwaSkgPD0gKE1BWF9TS0JfRlJBR1MgKyAxKSkpIHsKIAkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOworCisJCS8qIG5ldGlmX3R4X3N0b3BfcXVldWUoKSBtdXN0IGJlIGRvbmUgYmVmb3JlIGNoZWNraW5nCisJCSAqIGNoZWNraW5nIHR4IGluZGV4IGluIHRnM190eF9hdmFpbCgpIGJlbG93LCBiZWNhdXNlIGluCisJCSAqIHRnM190eCgpLCB3ZSB1cGRhdGUgdHggaW5kZXggYmVmb3JlIGNoZWNraW5nIGZvcgorCQkgKiBuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKCkuCisJCSAqLworCQlzbXBfbWIoKTsKIAkJaWYgKHRnM190eF9hdmFpbCh0bmFwaSkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0bmFwaSkpCiAJCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4cSk7CiAJfQpAQCAtNjIxMiw2ICs2MjUzLDggQEAKIAlmb3IgKGogPSAwOyBqIDwgdHAtPmlycV9jbnQ7IGorKykgewogCQlzdHJ1Y3QgdGczX25hcGkgKnRuYXBpID0gJnRwLT5uYXBpW2pdOwogCisJCXRnM19yeF9wcm9kcmluZ19mcmVlKHRwLCAmdHAtPnByb2RyaW5nW2pdKTsKKwogCQlpZiAoIXRuYXBpLT50eF9idWZmZXJzKQogCQkJY29udGludWU7CiAKQEAgLTYyNDcsOCArNjI5MCw2IEBACiAKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCX0KLQotCQl0ZzNfcnhfcHJvZHJpbmdfZnJlZSh0cCwgJnRwLT5wcm9kcmluZ1tqXSk7CiAJfQogfQogCkBAIC02NjAzLDcgKzY2NDQsNyBAQAogCQlhcGVkYXRhID0gdGczX2FwZV9yZWFkMzIodHAsIFRHM19BUEVfSE9TVF9JTklUX0NPVU5UKTsKIAkJdGczX2FwZV93cml0ZTMyKHRwLCBURzNfQVBFX0hPU1RfSU5JVF9DT1VOVCwgKythcGVkYXRhKTsKIAkJdGczX2FwZV93cml0ZTMyKHRwLCBURzNfQVBFX0hPU1RfRFJJVkVSX0lELAotCQkJCUFQRV9IT1NUX0RSSVZFUl9JRF9NQUdJQyk7CisJCQlBUEVfSE9TVF9EUklWRVJfSURfTUFHSUMoVEczX01BSl9OVU0sIFRHM19NSU5fTlVNKSk7CiAJCXRnM19hcGVfd3JpdGUzMih0cCwgVEczX0FQRV9IT1NUX0JFSEFWSU9SLAogCQkJCUFQRV9IT1NUX0JFSEFWX05PX1BIWUxPQ0spOwogCkBAIC02NzgyLDcgKzY4MjMsOCBAQAogCS8qIEFsbG93IHJlYWRzIGFuZCB3cml0ZXMgdG8gdGhlIEFQRSByZWdpc3RlciBhbmQgbWVtb3J5IHNwYWNlLiAqLwogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX0VOQUJMRV9BUEUpCiAJCXZhbCB8PSBQQ0lTVEFURV9BTExPV19BUEVfQ1RMU1BDX1dSIHwKLQkJICAgICAgIFBDSVNUQVRFX0FMTE9XX0FQRV9TSE1FTV9XUjsKKwkJICAgICAgIFBDSVNUQVRFX0FMTE9XX0FQRV9TSE1FTV9XUiB8CisJCSAgICAgICBQQ0lTVEFURV9BTExPV19BUEVfUFNQQUNFX1dSOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKIAogCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsIHRwLT5wY2lfY21kKTsKQEAgLTY4OTcsOSArNjkzOSwxMyBAQAogCXZhbCA9IEdSQ19NSVNDX0NGR19DT1JFQ0xLX1JFU0VUOwogCiAJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKLQkJaWYgKHRyMzIoMHg3ZTJjKSA9PSAweDYwKSB7Ci0JCQl0dzMyKDB4N2UyYywgMHgyMCk7Ci0JCX0KKwkJLyogRm9yY2UgUENJZSAxLjBhIG1vZGUgKi8KKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81Nzg1ICYmCisJCSAgICAhKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKSAmJgorCQkgICAgdHIzMihURzNfUENJRV9QSFlfVFNUQ1RMKSA9PQorCQkgICAgKFRHM19QQ0lFX1BIWV9UU1RDVExfUENJRTEwIHwgVEczX1BDSUVfUEhZX1RTVENUTF9QU0NSQU0pKQorCQkJdHczMihURzNfUENJRV9QSFlfVFNUQ1RMLCBURzNfUENJRV9QSFlfVFNUQ1RMX1BTQ1JBTSk7CisKIAkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzUwX0EwKSB7CiAJCQl0dzMyKEdSQ19NSVNDX0NGRywgKDEgPDwgMjkpKTsKIAkJCXZhbCB8PSAoMSA8PCAyOSk7CkBAIC02OTEyLDggKzY5NTgsMTEgQEAKIAkJICAgICB0cjMyKEdSQ19WQ1BVX0VYVF9DVFJMKSAmIH5HUkNfVkNQVV9FWFRfQ1RSTF9IQUxUX0NQVSk7CiAJfQogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQorCS8qIE1hbmFnZSBncGh5IHBvd2VyIGZvciBhbGwgQ1BNVSBhYnNlbnQgUENJZSBkZXZpY2VzLiAqLworCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpICYmCisJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0NQTVVfUFJFU0VOVCkpCiAJCXZhbCB8PSBHUkNfTUlTQ19DRkdfS0VFUF9HUEhZX1BPV0VSOworCiAJdHczMihHUkNfTUlTQ19DRkcsIHZhbCk7CiAKIAkvKiByZXN0b3JlIDU3MDEgaGFyZHdhcmUgYnVnIHdvcmthcm91bmQgd3JpdGUgbWV0aG9kICovCkBAIC02OTcwLDggKzcwMTksNyBAQAogCQkgKiBPbGRlciBQQ0llIGRldmljZXMgb25seSBzdXBwb3J0IHRoZSAxMjggYnl0ZQogCQkgKiBNUFMgc2V0dGluZy4gIEVuZm9yY2UgdGhlIHJlc3RyaWN0aW9uLgogCQkgKi8KLQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0NQTVVfUFJFU0VOVCkgfHwKLQkJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NCkpCisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19DUE1VX1BSRVNFTlQpKQogCQkJdmFsMTYgJj0gflBDSV9FWFBfREVWQ1RMX1BBWUxPQUQ7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwKIAkJCQkgICAgICB0cC0+cGNpZV9jYXAgKyBQQ0lfRVhQX0RFVkNUTCwKQEAgLTcwMTgsMTAgKzcwNjYsMTAgQEAKIAkJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKIAl9CiAKLQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BIWV9TRVJERVMpIHsKIAkJdHAtPm1hY19tb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKIAkJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOwotCX0gZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9NSUlfU0VSREVTKSB7CisJfSBlbHNlIGlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKSB7CiAJCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOwogCQl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CiAJfSBlbHNlIGlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX0VOQUJMRV9BUEUpIHsKQEAgLTcwNDEsMzUgKzcwODksMTAgQEAKIAogCXRnM19tZGlvX3N0YXJ0KHRwKTsKIAotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3ODApIHsKLQkJdTggcGh5X2FkZHI7Ci0KLQkJcGh5X2FkZHIgPSB0cC0+cGh5X2FkZHI7Ci0JCXRwLT5waHlfYWRkciA9IFRHM19QSFlfUENJRV9BRERSOwotCi0JCXRnM193cml0ZXBoeSh0cCwgVEczX1BDSUVQSFlfQkxPQ0tfQUREUiwKLQkJCSAgICAgVEczX1BDSUVQSFlfVFhCX0JMSyA8PCBURzNfUENJRVBIWV9CTE9DS19TSElGVCk7Ci0JCXZhbCA9IFRHM19QQ0lFUEhZX1RYMENUUkwxX1RYT0NNIHwgVEczX1BDSUVQSFlfVFgwQ1RSTDFfUkRDVEwgfAotCQkgICAgICBURzNfUENJRVBIWV9UWDBDVFJMMV9UWENNViB8IFRHM19QQ0lFUEhZX1RYMENUUkwxX1RLU0VMIHwKLQkJICAgICAgVEczX1BDSUVQSFlfVFgwQ1RSTDFfTkJfRU47Ci0JCXRnM193cml0ZXBoeSh0cCwgVEczX1BDSUVQSFlfVFgwQ1RSTDEsIHZhbCk7Ci0JCXVkZWxheSgxMCk7Ci0KLQkJdGczX3dyaXRlcGh5KHRwLCBURzNfUENJRVBIWV9CTE9DS19BRERSLAotCQkJICAgICBURzNfUENJRVBIWV9YR1hTX0JMSzEgPDwgVEczX1BDSUVQSFlfQkxPQ0tfU0hJRlQpOwotCQl2YWwgPSBURzNfUENJRVBIWV9QV1JNR01UNF9MT1dQV1JfRU4gfAotCQkgICAgICBURzNfUENJRVBIWV9QV1JNR01UNF9MMVBMTFBEX0VOOwotCQl0ZzNfd3JpdGVwaHkodHAsIFRHM19QQ0lFUEhZX1BXUk1HTVQ0LCB2YWwpOwotCQl1ZGVsYXkoMTApOwotCi0JCXRwLT5waHlfYWRkciA9IHBoeV9hZGRyOwotCX0KLQogCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgJiYKIAkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTAgJiYKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3ODUgJiYKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTcgJiYKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NzY1KSB7CisJICAgICEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzE3X1BMVVMpKSB7CiAJCXZhbCA9IHRyMzIoMHg3YzAwKTsKIAogCQl0dzMyKDB4N2MwMCwgdmFsIHwgKDEgPDwgMjUpKTsKQEAgLTc0MjcsNyArNzQ1MCw3IEBACiAJCXR3MzIoSE9TVENDX1RYQ09BTF9NQVhGX0lOVCwgMCk7CiAJfQogCi0JaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9VU0lOR19NU0lYKSkgeworCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfRU5BQkxFX1JTUykpIHsKIAkJdHczMihIT1NUQ0NfUlhDT0xfVElDS1MsIGVjLT5yeF9jb2FsZXNjZV91c2Vjcyk7CiAJCXR3MzIoSE9TVENDX1JYTUFYX0ZSQU1FUywgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKIAkJdHczMihIT1NUQ0NfUlhDT0FMX01BWEZfSU5ULCBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxKTsKQEAgLTc1MDQsNyArNzUyNyw4IEBACiAKIAogCS8qIERpc2FibGUgYWxsIHJlY2VpdmUgcmV0dXJuIHJpbmdzIGJ1dCB0aGUgZmlyc3QuICovCi0JaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3KQorCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkKIAkJbGltaXQgPSBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIFRHM19CRElORk9fU0laRSAqIDE3OwogCWVsc2UgaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKQogCQlsaW1pdCA9IE5JQ19TUkFNX1JDVl9SRVRfUkNCICsgVEczX0JESU5GT19TSVpFICogMTY7CkBAIC03NzIwLDcgKzc3NDQsOCBAQAogCQkgKi8KIAkJdmFsID0gdHIzMihURzNQQ0lfUENJU1RBVEUpOwogCQl2YWwgfD0gUENJU1RBVEVfQUxMT1dfQVBFX0NUTFNQQ19XUiB8Ci0JCSAgICAgICBQQ0lTVEFURV9BTExPV19BUEVfU0hNRU1fV1I7CisJCSAgICAgICBQQ0lTVEFURV9BTExPV19BUEVfU0hNRU1fV1IgfAorCQkgICAgICAgUENJU1RBVEVfQUxMT1dfQVBFX1BTUEFDRV9XUjsKIAkJdHczMihURzNQQ0lfUENJU1RBVEUsIHZhbCk7CiAJfQogCkBAIC03NzQwLDggKzc3NjUsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KSB7CisJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKSB7CiAJCXZhbCA9IHRyMzIoVEczUENJX0RNQV9SV19DVFJMKSAmCiAJCSAgICAgIH5ETUFfUldDVFJMX0RJU19DQUNIRV9BTElHTk1FTlQ7CiAJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTc3NjVfQTApCkBAIC03ODY5LDcgKzc4OTMsOCBAQAogCSAgICAgKCh1NjQpIHRwci0+cnhfc3RkX21hcHBpbmcgPj4gMzIpKTsKIAl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKIAkgICAgICgodTY0KSB0cHItPnJ4X3N0ZF9tYXBwaW5nICYgMHhmZmZmZmZmZikpOwotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcxNykKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTcgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTkpCiAJCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX05JQ19BRERSLAogCQkgICAgIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDKTsKIApAQCAtNzg5NCw3ICs3OTE5LDggQEAKIAkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAogCQkJICAgICAoUlhfSlVNQk9fTUFYX1NJWkUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCkgfAogCQkJICAgICBCRElORk9fRkxBR1NfVVNFX0VYVF9SRUNWKTsKLQkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcxNykKKwkJCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfVVNFX0pVTUJPX0JERkxBRykgfHwKKwkJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpCiAJCQkJdHczMihSQ1ZEQkRJX0pVTUJPX0JEICsgVEczX0JESU5GT19OSUNfQUREUiwKIAkJCQkgICAgIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDKTsKIAkJfSBlbHNlIHsKQEAgLTc5MDIsOCArNzkyOCw3IEBACiAJCQkgICAgIEJESU5GT19GTEFHU19ESVNBQkxFRCk7CiAJCX0KIAotCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKLQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKQogCQkJdmFsID0gKFJYX1NURF9NQVhfU0laRV81NzA1IDw8IEJESU5GT19GTEFHU19NQVhMRU5fU0hJRlQpIHwKIAkJCSAgICAgIChURzNfUlhfU1REX0RNQV9TWiA8PCAyKTsKIAkJZWxzZQpAQCAtNzkyMCw4ICs3OTQ1LDcgQEAKIAkJCSAgdHAtPnJ4X2p1bWJvX3BlbmRpbmcgOiAwOwogCXR3MzJfcnhfbWJveChURzNfUlhfSk1CX1BST0RfSURYX1JFRywgdHByLT5yeF9qbWJfcHJvZF9pZHgpOwogCi0JaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8Ci0JICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkgeworCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczXzU3MTdfUExVUykgewogCQl0dzMyKFNURF9SRVBMRU5JU0hfTFdNLCAzMik7CiAJCXR3MzIoSk1CX1JFUExFTklTSF9MV00sIDE2KTsKIAl9CkBAIC03OTU2LDcgKzc5ODAsOCBAQAogCQkgICAgICBSRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIgfCBSRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCIHwKIAkJICAgICAgUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIpOwogCi0JaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3KQorCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkKIAkJcmRtYWNfbW9kZSB8PSBSRE1BQ19NT0RFX01VTFRfRE1BX1JEX0RJUzsKIAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NCB8fApAQCAtODA0OCw4ICs4MDczLDggQEAKIAlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCiAJCXR3MzIoUkNWTFNDX01PREUsIFJDVkxTQ19NT0RFX0VOQUJMRSB8IFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFKTsKIAotCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01JSV9TRVJERVMpIHsKLQkJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1BBUkFMTEVMX0RFVEVDVDsKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfTUlJX1NFUkRFUykgeworCQl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVDsKIAkJLyogcmVzZXQgdG8gcHJldmVudCBsb3NpbmcgMXN0IHJ4IHBhY2tldCBpbnRlcm1pdHRlbnRseSAqLwogCQl0dzMyX2YoTUFDX1JYX01PREUsIFJYX01PREVfUkVTRVQpOwogCQl1ZGVsYXkoMTApOwpAQCAtODA2Miw3ICs4MDg3LDcgQEAKIAl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfVFhTVEFUX0VOQUJMRSB8IE1BQ19NT0RFX1JYU1RBVF9FTkFCTEUgfAogCQlNQUNfTU9ERV9UREVfRU5BQkxFIHwgTUFDX01PREVfUkRFX0VOQUJMRSB8IE1BQ19NT0RFX0ZIREVfRU5BQkxFOwogCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSAmJgotCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgJiYKKwkgICAgISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSAmJgogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCkKIAkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CiAJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIgfCBNQUNfTU9ERV9UWFNUQVRfQ0xFQVIpOwpAQCAtODE5NSw2ICs4MjIwLDkgQEAKIAl9CiAKIAl0cC0+dHhfbW9kZSA9IFRYX01PREVfRU5BQkxFOworCWlmICgodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzU1X1BMVVMpIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81OTA2KQorCQl0cC0+dHhfbW9kZSB8PSBUWF9NT0RFX01CVUZfTE9DS1VQX0ZJWDsKIAl0dzMyX2YoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKIAl1ZGVsYXkoMTAwKTsKIApAQCAtODI0NCwxNiArODI3MiwxNiBAQAogCXR3MzIoTUFDX0xFRF9DVFJMLCB0cC0+bGVkX2N0cmwpOwogCiAJdHczMihNQUNfTUlfU1RBVCwgTUFDX01JX1NUQVRfTE5LU1RBVF9BVFROX0VOQUIpOwotCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEhZX1NFUkRFUykgewogCQl0dzMyX2YoTUFDX1JYX01PREUsIFJYX01PREVfUkVTRVQpOwogCQl1ZGVsYXkoMTApOwogCX0KIAl0dzMyX2YoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKIAl1ZGVsYXkoMTApOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSB7CiAJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpICYmCi0JCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU0VSREVTX1BSRUVNUEhBU0lTKSkgeworCQkJISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19TRVJERVNfUFJFRU1QSEFTSVMpKSB7CiAJCQkvKiBTZXQgZHJpdmUgdHJhbnNtaXNzaW9uIGxldmVsIHRvIDEuMlYgICovCiAJCQkvKiBvbmx5IGlmIHRoZSBzaWduYWwgcHJlLWVtcGhhc2lzIGJpdCBpcyBub3Qgc2V0ICAqLwogCQkJdmFsID0gdHIzMihNQUNfU0VSREVTX0NGRyk7CkBAIC04Mjc1LDEyICs4MzAzLDEyIEBACiAJdHczMl9mKE1BQ19MT1dfV01BUktfTUFYX1JYX0ZSQU1FLCB2YWwpOwogCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0ICYmCi0JICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJICAgICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSkgewogCQkvKiBVc2UgaGFyZHdhcmUgbGluayBhdXRvLW5lZ290aWF0aW9uICovCiAJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0hXX0FVVE9ORUc7CiAJfQogCi0JaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01JSV9TRVJERVMpICYmCisJaWYgKCh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKSAmJgogCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTQpKSB7CiAJCXUzMiB0bXA7CiAKQEAgLTgyOTIsOCArODMyMCw4IEBACiAJfQogCiAJaWYgKCEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSkgewotCQlpZiAodHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIpIHsKLQkJCXRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID0gMDsKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikgeworCQkJdHAtPnBoeV9mbGFncyAmPSB+VEczX1BIWUZMR19JU19MT1dfUE9XRVI7CiAJCQl0cC0+bGlua19jb25maWcuc3BlZWQgPSB0cC0+bGlua19jb25maWcub3JpZ19zcGVlZDsKIAkJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSB0cC0+bGlua19jb25maWcub3JpZ19kdXBsZXg7CiAJCQl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX2F1dG9uZWc7CkBAIC04MzAzLDE1ICs4MzMxLDE1IEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgJiYKLQkJICAgICEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfSVNfRkVUKSkgeworCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSAmJgorCQkgICAgISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpKSB7CiAJCQl1MzIgdG1wOwogCiAJCQkvKiBDbGVhciBDUkMgc3RhdHMuICovCiAJCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX1RFU1QxLCAmdG1wKSkgewogCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19URVNUMSwKIAkJCQkJICAgICB0bXAgfCBNSUlfVEczX1RFU1QxX0NSQ19FTik7Ci0JCQkJdGczX3JlYWRwaHkodHAsIDB4MTQsICZ0bXApOworCQkJCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX1JYUl9DT1VOVEVSUywgJnRtcCk7CiAJCQl9CiAJCX0KIAl9CkBAIC04NDc5LDcgKzg1MDcsNyBAQAogCQkJbWFjX3N0YXQgPSB0cjMyKE1BQ19TVEFUVVMpOwogCiAJCQlwaHlfZXZlbnQgPSAwOwotCQkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKSB7CisJCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfVVNFX01JX0lOVEVSUlVQVCkgewogCQkJCWlmIChtYWNfc3RhdCAmIE1BQ19TVEFUVVNfTUlfSU5URVJSVVBUKQogCQkJCQlwaHlfZXZlbnQgPSAxOwogCQkJfSBlbHNlIGlmIChtYWNfc3RhdCAmIE1BQ19TVEFUVVNfTE5LU1RBVEVfQ0hBTkdFRCkKQEAgLTg0OTUsNyArODUyMyw3IEBACiAJCQkgICAgKG1hY19zdGF0ICYgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VEKSkgewogCQkJCW5lZWRfc2V0dXAgPSAxOwogCQkJfQotCQkJaWYgKCEgbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSAmJgorCQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpICYmCiAJCQkgICAgKG1hY19zdGF0ICYgKE1BQ19TVEFUVVNfUENTX1NZTkNFRCB8CiAJCQkJCSBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSkgewogCQkJCW5lZWRfc2V0dXAgPSAxOwpAQCAtODUxMSw4ICs4NTM5LDEwIEBACiAJCQkJfQogCQkJCXRnM19zZXR1cF9waHkodHAsIDApOwogCQkJfQotCQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTUlJX1NFUkRFUykKKwkJfSBlbHNlIGlmICgodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfTUlJX1NFUkRFUykgJiYKKwkJCSAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3ODBfQ0xBU1MpKSB7CiAJCQl0ZzNfc2VyZGVzX3BhcmFsbGVsX2RldGVjdCh0cCk7CisJCX0KIAogCQl0cC0+dGltZXJfY291bnRlciA9IHRwLT50aW1lcl9tdWx0aXBsaWVyOwogCX0KQEAgLTg2MDUsOCArODYzNSw3IEBACiAJICogVHVybiBvZmYgTVNJIG9uZSBzaG90IG1vZGUuICBPdGhlcndpc2UgdGhpcyB0ZXN0IGhhcyBubwogCSAqIG9ic2VydmFibGUgd2F5IHRvIGtub3cgd2hldGhlciB0aGUgaW50ZXJydXB0IHdhcyBkZWxpdmVyZWQuCiAJICovCi0JaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAotCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KSAmJgorCWlmICgodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzE3X1BMVVMpICYmCiAJICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1VTSU5HX01TSSkpIHsKIAkJdmFsID0gdHIzMihNU0dJTlRfTU9ERSkgfCBNU0dJTlRfTU9ERV9PTkVfU0hPVF9ESVNBQkxFOwogCQl0dzMyKE1TR0lOVF9NT0RFLCB2YWwpOwpAQCAtODY0OSw4ICs4Njc4LDcgQEAKIAogCWlmIChpbnRyX29rKSB7CiAJCS8qIFJlZW5hYmxlIE1TSSBvbmUgc2hvdCBtb2RlLiAqLwotCQlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8Ci0JCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KSAmJgorCQlpZiAoKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKSAmJgogCQkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVVNJTkdfTVNJKSkgewogCQkJdmFsID0gdHIzMihNU0dJTlRfTU9ERSkgJiB+TVNHSU5UX01PREVfT05FX1NIT1RfRElTQUJMRTsKIAkJCXR3MzIoTVNHSU5UX01PREUsIHZhbCk7CkBAIC04Nzc1LDkgKzg4MDMsOSBAQAogCX0KIAogCXJjID0gcGNpX2VuYWJsZV9tc2l4KHRwLT5wZGV2LCBtc2l4X2VudCwgdHAtPmlycV9jbnQpOwotCWlmIChyYyAhPSAwKSB7Ci0JCWlmIChyYyA8IFRHM19SU1NfTUlOX05VTV9NU0lYX1ZFQ1MpCi0JCQlyZXR1cm4gZmFsc2U7CisJaWYgKHJjIDwgMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIGlmIChyYyAhPSAwKSB7CiAJCWlmIChwY2lfZW5hYmxlX21zaXgodHAtPnBkZXYsIG1zaXhfZW50LCByYykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCW5ldGRldl9ub3RpY2UodHAtPmRldiwgIlJlcXVlc3RlZCAlZCBNU0ktWCB2ZWN0b3JzLCByZWNlaXZlZCAlZFxuIiwKQEAgLTg3ODUsMTYgKzg4MTMsMTkgQEAKIAkJdHAtPmlycV9jbnQgPSByYzsKIAl9CiAKLQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM19FTkFCTEVfUlNTOwotCiAJZm9yIChpID0gMDsgaSA8IHRwLT5pcnFfbWF4OyBpKyspCiAJCXRwLT5uYXBpW2ldLmlycV92ZWMgPSBtc2l4X2VudFtpXS52ZWN0b3I7CiAKLQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcpIHsKLQkJdHAtPnRnM19mbGFnczMgfD0gVEczX0ZMRzNfRU5BQkxFX1RTUzsKLQkJdHAtPmRldi0+cmVhbF9udW1fdHhfcXVldWVzID0gdHAtPmlycV9jbnQgLSAxOwotCX0gZWxzZQotCQl0cC0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSAxOworCXRwLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA9IDE7CisJaWYgKHRwLT5pcnFfY250ID4gMSkgeworCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM19FTkFCTEVfUlNTOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTkpIHsKKwkJCXRwLT50ZzNfZmxhZ3MzIHw9IFRHM19GTEczX0VOQUJMRV9UU1M7CisJCQl0cC0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSB0cC0+aXJxX2NudCAtIDE7CisJCX0KKwl9CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTg4MzgsNyArODg2OSw3IEBACiAJZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9VU0lOR19NU0kpCiAJCXBjaV9kaXNhYmxlX21zaSh0cC0+cGRldik7CiAJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1VTSU5HX01TSV9PUl9NU0lYOwotCXRwLT50ZzNfZmxhZ3MzICY9IH5URzNfRkxHM19FTkFCTEVfUlNTOworCXRwLT50ZzNfZmxhZ3MzICY9IH4oVEczX0ZMRzNfRU5BQkxFX1JTUyB8IFRHM19GTEczX0VOQUJMRV9UU1MpOwogfQogCiBzdGF0aWMgaW50IHRnM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC04OTQyLDEwICs4OTczLDggQEAKIAkJCWdvdG8gZXJyX291dDI7CiAJCX0KIAotCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTcgJiYKLQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81Nzc2NSAmJgotCQkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVVNJTkdfTVNJKSAmJgotCQkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfMVNIT1RfTVNJKSkgeworCQlpZiAoISh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczXzU3MTdfUExVUykgJiYKKwkJICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1VTSU5HX01TSSkpIHsKIAkJCXUzMiB2YWwgPSB0cjMyKFBDSUVfVFJBTlNBQ1RJT05fQ0ZHKTsKIAogCQkJdHczMihQQ0lFX1RSQU5TQUNUSU9OX0NGRywKQEAgLTg5ODIsNyArOTAxMSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0ZzNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqdGczX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkJCQkgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICopOwogc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqKTsKIAogc3RhdGljIGludCB0ZzNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTkwMTYsOCArOTA0Niw4IEBACiAKIAl0ZzNfaW50c19maW5pKHRwKTsKIAotCW1lbWNweSgmdHAtPm5ldF9zdGF0c19wcmV2LCB0ZzNfZ2V0X3N0YXRzKHRwLT5kZXYpLAotCSAgICAgICBzaXplb2YodHAtPm5ldF9zdGF0c19wcmV2KSk7CisJdGczX2dldF9zdGF0czY0KHRwLT5kZXYsICZ0cC0+bmV0X3N0YXRzX3ByZXYpOworCiAJbWVtY3B5KCZ0cC0+ZXN0YXRzX3ByZXYsIHRnM19nZXRfZXN0YXRzKHRwKSwKIAkgICAgICAgc2l6ZW9mKHRwLT5lc3RhdHNfcHJldikpOwogCkBAIC05MDMwLDI4ICs5MDYwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc3RhdDY0KHRnM19zdGF0NjRfdCAqdmFsKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCi0jaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCi0JcmV0ID0gdmFsLT5sb3c7Ci0jZWxzZQotCXJldCA9ICgodTY0KXZhbC0+aGlnaCA8PCAzMikgfCAoKHU2NCl2YWwtPmxvdyk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBnZXRfZXN0YXQ2NCh0ZzNfc3RhdDY0X3QgKnZhbCkKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9zdGF0NjQodGczX3N0YXQ2NF90ICp2YWwpCiB7CiAgICAgICAgcmV0dXJuICgodTY0KXZhbC0+aGlnaCA8PCAzMikgfCAoKHU2NCl2YWwtPmxvdyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGNfY3JjX2Vycm9ycyhzdHJ1Y3QgdGczICp0cCkKK3N0YXRpYyB1NjQgY2FsY19jcmNfZXJyb3JzKHN0cnVjdCB0ZzMgKnRwKQogewogCXN0cnVjdCB0ZzNfaHdfc3RhdHMgKmh3X3N0YXRzID0gdHAtPmh3X3N0YXRzOwogCi0JaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSAmJgorCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BIWV9TRVJERVMpICYmCiAJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAogCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpKSB7CiAJCXUzMiB2YWw7CkBAIC05MDYwLDcgKzkwNzgsNyBAQAogCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX1RFU1QxLCAmdmFsKSkgewogCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX1RFU1QxLAogCQkJCSAgICAgdmFsIHwgTUlJX1RHM19URVNUMV9DUkNfRU4pOwotCQkJdGczX3JlYWRwaHkodHAsIDB4MTQsICZ2YWwpOworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfUlhSX0NPVU5URVJTLCAmdmFsKTsKIAkJfSBlbHNlCiAJCQl2YWwgPSAwOwogCQlzcGluX3VubG9ja19iaCgmdHAtPmxvY2spOwpAQCAtOTA3NSw3ICs5MDkzLDcgQEAKIAogI2RlZmluZSBFU1RBVF9BREQobWVtYmVyKSBcCiAJZXN0YXRzLT5tZW1iZXIgPQlvbGRfZXN0YXRzLT5tZW1iZXIgKyBcCi0JCQkJZ2V0X2VzdGF0NjQoJmh3X3N0YXRzLT5tZW1iZXIpCisJCQkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPm1lbWJlcikKIAogc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqdHApCiB7CkBAIC05MTY1LDExICs5MTgzLDExIEBACiAJcmV0dXJuIGVzdGF0czsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0ZzNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp0ZzNfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHAtPm5ldF9zdGF0czsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqb2xkX3N0YXRzID0gJnRwLT5uZXRfc3RhdHNfcHJldjsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm9sZF9zdGF0cyA9ICZ0cC0+bmV0X3N0YXRzX3ByZXY7CiAJc3RydWN0IHRnM19od19zdGF0cyAqaHdfc3RhdHMgPSB0cC0+aHdfc3RhdHM7CiAKIAlpZiAoIWh3X3N0YXRzKQpAQCAtOTM1MCwxMyArOTM2OCwxMyBAQAogCiAJbWVtc2V0KHAsIDAsIFRHM19SRUdEVU1QX0xFTik7CiAKLQlpZiAodHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIpCisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikKIAkJcmV0dXJuOwogCiAJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKICNkZWZpbmUgX19HRVRfUkVHMzIocmVnKQkoKihwKSsrID0gdHIzMihyZWcpKQotI2RlZmluZSBHRVRfUkVHMzJfTE9PUChiYXNlLGxlbikJCVwKKyNkZWZpbmUgR0VUX1JFRzMyX0xPT1AoYmFzZSwgbGVuKQkJXAogZG8gewlwID0gKHUzMiAqKShvcmlnX3AgKyAoYmFzZSkpOwkJXAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkJCVwKIAkJX19HRVRfUkVHMzIoKGJhc2UpICsgaSk7CVwKQEAgLTk0MjksNyArOTQ0Nyw3IEBACiAJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfTk9fTlZSQU0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyKQorCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19MT1dfUE9XRVIpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CkBAIC05NDQ5LDcgKzk0NjcsNyBAQAogCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZF9iZTMyKHRwLCBvZmZzZXQtYl9vZmZzZXQsICZ2YWwpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQkJbWVtY3B5KGRhdGEsICgoY2hhciopJnZhbCkgKyBiX29mZnNldCwgYl9jb3VudCk7CisJCW1lbWNweShkYXRhLCAoKGNoYXIgKikmdmFsKSArIGJfb2Zmc2V0LCBiX2NvdW50KTsKIAkJbGVuIC09IGJfY291bnQ7CiAJCW9mZnNldCArPSBiX2NvdW50OwogCQllZXByb20tPmxlbiArPSBiX2NvdW50OwpAQCAtOTQ5MSw3ICs5NTA5LDcgQEAKIAl1OCAqYnVmOwogCV9fYmUzMiBzdGFydCwgZW5kOwogCi0JaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyKQorCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19MT1dfUE9XRVIpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKCh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX05PX05WUkFNKSB8fApAQCAtOTU0OCw3ICs5NTY2LDcgQEAKIAogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1VTRV9QSFlMSUIpIHsKIAkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKLQkJaWYgKCEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfQ09OTkVDVEVEKSkKKwkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKSkKIAkJCXJldHVybiAtRUFHQUlOOwogCQlwaHlkZXYgPSB0cC0+bWRpb19idXMtPnBoeV9tYXBbVEczX1BIWV9NSUlfQUREUl07CiAJCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBoeWRldiwgY21kKTsKQEAgLTk1NTYsMTEgKzk1NzQsMTEgQEAKIAogCWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF9BdXRvbmVnKTsKIAotCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkpCisJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKQogCQljbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKIAkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOwogCi0JaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSkgeworCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpKSB7CiAJCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CiAJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CiAJCQkJICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKQEAgLTk1OTEsNyArOTYwOSw3IEBACiAKIAlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSB7CiAJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7Ci0JCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkpCisJCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJcGh5ZGV2ID0gdHAtPm1kaW9fYnVzLT5waHlfbWFwW1RHM19QSFlfTUlJX0FERFJdOwogCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7CkBAIC05NjExLDExICs5NjI5LDExIEBACiAJCQkgICBBRFZFUlRJU0VEX1BhdXNlIHwKIAkJCSAgIEFEVkVSVElTRURfQXN5bV9QYXVzZTsKIAotCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKQorCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkpCiAJCQltYXNrIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAogCQkJCUFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CiAKLQkJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSkKKwkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykpCiAJCQltYXNrIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CiAJCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKIAkJCQlBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CkBAIC05NjM2LDcgKzk2NTQsNyBAQAogCiAJCWNtZC0+YWR2ZXJ0aXNpbmcgJj0gbWFzazsKIAl9IGVsc2UgewotCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSB7CisJCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSB7CiAJCQlpZiAoY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAwKQogCQkJCXJldHVybiAtRUlOVkFMOwogCkBAIC05NzcyLDExICs5NzkwLDExIEBACiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEhZX1NFUkRFUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSB7Ci0JCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkpCisJCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJciA9IHBoeV9zdGFydF9hbmVnKHRwLT5tZGlvX2J1cy0+cGh5X21hcFtURzNfUEhZX01JSV9BRERSXSk7CiAJfSBlbHNlIHsKQEAgLTk3ODcsNyArOTgwNSw3IEBACiAJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpOwogCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpICYmCiAJCSAgICAoKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB8fAotCQkgICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BBUkFMTEVMX0RFVEVDVCkpKSB7CisJCSAgICAgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVCkpKSB7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBibWNyIHwgQk1DUl9BTlJFU1RBUlQgfAogCQkJCQkJICAgQk1DUl9BTkVOQUJMRSk7CiAJCQlyID0gMDsKQEAgLTk5MjIsNyArOTk0MCw3IEBACiAJCWVsc2UKIAkJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1BBVVNFX0FVVE9ORUc7CiAKLQkJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkgeworCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKSB7CiAJCQl1MzIgb2xkYWR2ID0gcGh5ZGV2LT5hZHZlcnRpc2luZyAmCiAJCQkJICAgICAoQURWRVJUSVNFRF9QYXVzZSB8IEFEVkVSVElTRURfQXN5bV9QYXVzZSk7CiAJCQlpZiAob2xkYWR2ICE9IG5ld2FkdikgewpAQCAtMTAyNTEsNyArMTAyNjksNyBAQAogCWlmICghbmV0aWZfcnVubmluZyh0cC0+ZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKQorCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKQogCQltYXggPSBURzNfU0VSREVTX1RJTUVPVVRfU0VDOwogCWVsc2UKIAkJbWF4ID0gVEczX0NPUFBFUl9USU1FT1VUX1NFQzsKQEAgLTEwNTU0LDcgKzEwNTcyLDggQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgaTsKIAotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNykKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTkpCiAJCW1lbV90YmwgPSBtZW1fdGJsXzU3MTc7CiAJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQogCQltZW1fdGJsID0gbWVtX3RibF81Nzc2NTsKQEAgLTEwNTY4LDggKzEwNTg3LDggQEAKIAkJbWVtX3RibCA9IG1lbV90YmxfNTcweDsKIAogCWZvciAoaSA9IDA7IG1lbV90YmxbaV0ub2Zmc2V0ICE9IDB4ZmZmZmZmZmY7IGkrKykgewotCQlpZiAoKGVyciA9IHRnM19kb19tZW1fdGVzdCh0cCwgbWVtX3RibFtpXS5vZmZzZXQsCi0JCSAgICBtZW1fdGJsW2ldLmxlbikpICE9IDApCisJCWVyciA9IHRnM19kb19tZW1fdGVzdCh0cCwgbWVtX3RibFtpXS5vZmZzZXQsIG1lbV90YmxbaV0ubGVuKTsKKwkJaWYgKGVycikKIAkJCWJyZWFrOwogCX0KIApAQCAtMTA2MTIsNyArMTA2MzEsNyBAQAogCQkJICAgTUFDX01PREVfUE9SVF9JTlRfTFBCQUNLOwogCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCiAJCQltYWNfbW9kZSB8PSBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwotCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKQorCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpCiAJCQltYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOwogCQllbHNlCiAJCQltYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKQEAgLTEwNjIwLDcgKzEwNjM5LDcgQEAKIAl9IGVsc2UgaWYgKGxvb3BiYWNrX21vZGUgPT0gVEczX1BIWV9MT09QQkFDSykgewogCQl1MzIgdmFsOwogCi0JCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9JU19GRVQpIHsKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0ZFVCkgewogCQkJdGczX3BoeV9mZXRfdG9nZ2xlX2FwZCh0cCwgZmFsc2UpOwogCQkJdmFsID0gQk1DUl9MT09QQkFDSyB8IEJNQ1JfRlVMTERQTFggfCBCTUNSX1NQRUVEMTAwOwogCQl9IGVsc2UKQEAgLTEwNjMyLDcgKzEwNjUxLDcgQEAKIAkJdWRlbGF5KDQwKTsKIAogCQltYWNfbW9kZSA9IHRwLT5tYWNfbW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKLQkJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkgeworCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfRkVUKSB7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRkVUX1BURVNULAogCQkJCSAgICAgTUlJX1RHM19GRVRfUFRFU1RfRlJDX1RYX0xJTksgfAogCQkJCSAgICAgTUlJX1RHM19GRVRfUFRFU1RfRlJDX1RYX0xPQ0spOwpAQCAtMTA2NDQsNyArMTA2NjMsNyBAQAogCQkJbWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CiAKIAkJLyogcmVzZXQgdG8gcHJldmVudCBsb3NpbmcgMXN0IHJ4IHBhY2tldCBpbnRlcm1pdHRlbnRseSAqLwotCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9NSUlfU0VSREVTKSB7CisJCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKSB7CiAJCQl0dzMyX2YoTUFDX1JYX01PREUsIFJYX01PREVfUkVTRVQpOwogCQkJdWRlbGF5KDEwKTsKIAkJCXR3MzJfZihNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOwpAQCAtMTA3NzUsNyArMTA3OTQsNyBAQAogCQlyZXR1cm4gVEczX0xPT1BCQUNLX0ZBSUxFRDsKIAogCS8qIFR1cm4gb2ZmIGdwaHkgYXV0b3Bvd2VyZG93bi4gKi8KLQlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfRU5BQkxFX0FQRCkKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfRU5BQkxFX0FQRCkKIAkJdGczX3BoeV90b2dnbGVfYXBkKHRwLCBmYWxzZSk7CiAKIAlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0NQTVVfUFJFU0VOVCkgewpAQCAtMTA4MTIsMTQgKzEwODMxLDE0IEBACiAJCXR3MzIoVEczX0NQTVVfTVVURVhfR05ULCBDUE1VX01VVEVYX0dOVF9EUklWRVIpOwogCX0KIAotCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgJiYKKwlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSAmJgogCSAgICAhKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfVVNFX1BIWUxJQikpIHsKIAkJaWYgKHRnM19ydW5fbG9vcGJhY2sodHAsIFRHM19QSFlfTE9PUEJBQ0spKQogCQkJZXJyIHw9IFRHM19QSFlfTE9PUEJBQ0tfRkFJTEVEOwogCX0KIAogCS8qIFJlLWVuYWJsZSBncGh5IGF1dG9wb3dlcmRvd24uICovCi0JaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0VOQUJMRV9BUEQpCisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0VOQUJMRV9BUEQpCiAJCXRnM19waHlfdG9nZ2xlX2FwZCh0cCwgdHJ1ZSk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTA4MzAsNyArMTA4NDksNyBAQAogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfTE9XX1BPV0VSKQogCQl0ZzNfc2V0X3Bvd2VyX3N0YXRlKHRwLCBQQ0lfRDApOwogCiAJbWVtc2V0KGRhdGEsIDAsIHNpemVvZih1NjQpICogVEczX05VTV9URVNUKTsKQEAgLTEwODYyLDcgKzEwODgxLDcgQEAKIAkJaWYgKCFlcnIpCiAJCQl0ZzNfbnZyYW1fdW5sb2NrKHRwKTsKIAotCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9NSUlfU0VSREVTKQorCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfTUlJX1NFUkRFUykKIAkJCXRnM19waHlfcmVzZXQodHApOwogCiAJCWlmICh0ZzNfdGVzdF9yZWdpc3RlcnModHApICE9IDApIHsKQEAgLTEwODk4LDcgKzEwOTE3LDcgQEAKIAkJaWYgKGlycV9zeW5jICYmICFlcnIyKQogCQkJdGczX3BoeV9zdGFydCh0cCk7CiAJfQotCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfTE9XX1BPV0VSKQogCQl0ZzNfc2V0X3Bvd2VyX3N0YXRlKHRwLCBQQ0lfRDNob3QpOwogCiB9CkBAIC0xMDkxMSwxMCArMTA5MzAsMTAgQEAKIAogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1VTRV9QSFlMSUIpIHsKIAkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKLQkJaWYgKCEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfQ09OTkVDVEVEKSkKKwkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKSkKIAkJCXJldHVybiAtRUFHQUlOOwogCQlwaHlkZXYgPSB0cC0+bWRpb19idXMtPnBoeV9tYXBbVEczX1BIWV9NSUlfQUREUl07Ci0JCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgZGF0YSwgY21kKTsKKwkJcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5ZGV2LCBpZnIsIGNtZCk7CiAJfQogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTEwOTI1LDEwICsxMDk0NCwxMCBAQAogCWNhc2UgU0lPQ0dNSUlSRUc6IHsKIAkJdTMyIG1paV9yZWd2YWw7CiAKLQkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BIWV9TRVJERVMpCiAJCQlicmVhazsJCQkvKiBXZSBoYXZlIG5vIFBIWSAqLwogCi0JCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikKIAkJCXJldHVybiAtRUFHQUlOOwogCiAJCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwpAQCAtMTA5NDEsMTAgKzEwOTYwLDEwIEBACiAJfQogCiAJY2FzZSBTSU9DU01JSVJFRzoKLQkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BIWV9TRVJERVMpCiAJCQlicmVhazsJCQkvKiBXZSBoYXZlIG5vIFBIWSAqLwogCi0JCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0xPV19QT1dFUikKIAkJCXJldHVybiAtRUFHQUlOOwogCiAJCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwpAQCAtMTE2MzQsNyArMTE2NTMsOCBAQAogCQllbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3ODAgfHwKIAkJCSBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpCiAJCQl0ZzNfZ2V0XzU3NzgwX252cmFtX2luZm8odHApOwotCQllbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNykKKwkJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKKwkJCSBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkKIAkJCXRnM19nZXRfNTcxN19udnJhbV9pbmZvKHRwKTsKIAkJZWxzZQogCQkJdGczX2dldF9udnJhbV9pbmZvKHRwKTsKQEAgLTEyMDcwLDExICsxMjA5MCwxMCBAQAogCiAJCXRwLT5waHlfaWQgPSBlZXByb21fcGh5X2lkOwogCQlpZiAoZWVwcm9tX3BoeV9zZXJkZXMpIHsKLQkJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzgwX0NMQVNTKSB8fAotCQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3KQotCQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX01JSV9TRVJERVM7CisJCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCisJCQkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX1BIWV9TRVJERVM7CiAJCQllbHNlCi0JCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX1NFUkRFUzsKKwkJCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfTUlJX1NFUkRFUzsKIAkJfQogCiAJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3NTBfUExVUykKQEAgLTEyMTU4LDcgKzEyMTc3LDcgQEAKIAkJCSh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3NTBfUExVUykpCiAJCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM19FTkFCTEVfQVBFOwogCi0JCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FOWV9TRVJERVMgJiYKKwkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMgJiYKIAkJICAgICEobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0ZJQkVSX1dPTCkpCiAJCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19XT0xfQ0FQOwogCkBAIC0xMjE2NywxOSArMTIxODYsMjEgQEAKIAkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfV09MX0VOQUJMRTsKIAogCQlpZiAoY2ZnMiAmICgxIDw8IDE3KSkKLQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0NBUEFDSVRJVkVfQ09VUExJTkc7CisJCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfQ0FQQUNJVElWRV9DT1VQTElORzsKIAogCQkvKiBzZXJkZXMgc2lnbmFsIHByZS1lbXBoYXNpcyBpbiByZWdpc3RlciAweDU5MCBzZXQgYnkgKi8KIAkJLyogYm9vdGNvZGUgaWYgYml0IDE4IGlzIHNldCAqLwogCQlpZiAoY2ZnMiAmICgxIDw8IDE4KSkKLQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1NFUkRFU19QUkVFTVBIQVNJUzsKKwkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19TRVJERVNfUFJFRU1QSEFTSVM7CiAKIAkJaWYgKCgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODQgJiYKIAkJICAgICAgR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IENISVBSRVZfNTc4NF9BWCkpICYmCiAJCSAgICAoY2ZnMiAmIE5JQ19TUkFNX0RBVEFfQ0ZHXzJfQVBEX0VOKSkKLQkJCXRwLT50ZzNfZmxhZ3MzIHw9IFRHM19GTEczX1BIWV9FTkFCTEVfQVBEOworCQkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX0VOQUJMRV9BUEQ7CiAKLQkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKKwkJaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSAmJgorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3ODUgJiYKKwkJICAgICEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzE3X1BMVVMpKSB7CiAJCQl1MzIgY2ZnMzsKIAogCQkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX0NGR18zLCAmY2ZnMyk7CkBAIC0xMjI4NCw5ICsxMjMwNSw5IEBACiAJaWYgKCFlcnIgJiYgVEczX0tOT1dOX1BIWV9JRChod19waHlfaWRfbWFza2VkKSkgewogCQl0cC0+cGh5X2lkID0gaHdfcGh5X2lkOwogCQlpZiAoaHdfcGh5X2lkX21hc2tlZCA9PSBURzNfUEhZX0lEX0JDTTgwMDIpCi0JCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCQkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX1BIWV9TRVJERVM7CiAJCWVsc2UKLQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QSFlfU0VSREVTOworCQkJdHAtPnBoeV9mbGFncyAmPSB+VEczX1BIWUZMR19QSFlfU0VSREVTOwogCX0gZWxzZSB7CiAJCWlmICh0cC0+cGh5X2lkICE9IFRHM19QSFlfSURfSU5WQUxJRCkgewogCQkJLyogRG8gbm90aGluZywgcGh5IElEIGFscmVhZHkgc2V0IHVwIGluCkBAIC0xMjMwNSwxMSArMTIzMjYsMTEgQEAKIAkJCXRwLT5waHlfaWQgPSBwLT5waHlfaWQ7CiAJCQlpZiAoIXRwLT5waHlfaWQgfHwKIAkJCSAgICB0cC0+cGh5X2lkID09IFRHM19QSFlfSURfQkNNODAwMikKLQkJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCQkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19QSFlfU0VSREVTOwogCQl9CiAJfQogCi0JaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSAmJgorCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpICYmCiAJICAgICEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19FTkFCTEVfQVBFKSAmJgogCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSkgewogCQl1MzIgYm1zciwgYWR2X3JlZywgdGczX2N0cmwsIG1hc2s7CkBAIC0xMjMyNyw3ICsxMjM0OCw3IEBACiAJCQkgICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMIHwKIAkJCSAgIEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CiAJCXRnM19jdHJsID0gMDsKLQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkgeworCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkpIHsKIAkJCXRnM19jdHJsID0gKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKIAkJCQkgICAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEwpOwogCQkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CkBAIC0xMjM0Miw3ICsxMjM2Myw3IEBACiAJCWlmICghdGczX2NvcHBlcl9pc19hZHZlcnRpc2luZ19hbGwodHAsIG1hc2spKSB7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIGFkdl9yZWcpOwogCi0JCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKQorCQkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKQogCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCB0ZzNfY3RybCk7CiAKIAkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsCkBAIC0xMjM1MSw3ICsxMjM3Miw3IEBACiAJCXRnM19waHlfc2V0X3dpcmVzcGVlZCh0cCk7CiAKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBhZHZfcmVnKTsKLQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkKKwkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKQogCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsIHRnM19jdHJsKTsKIAl9CiAKQEAgLTEyMzY0LDEzICsxMjM4NSwxMyBAQAogCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CiAJfQogCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQU5ZX1NFUkRFUykKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykKIAkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0KIAkJCShBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKIAkJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKIAkJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfAogCQkJIEFEVkVSVElTRURfRklCUkUpOwotCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHXzEwXzEwMF9PTkxZKQogCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJj0KIAkJCX4oQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CiAJCQkgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOwpAQCAtMTI2OTksNiArMTI3MjAsNyBAQAogewogCWludCB2bGVuOwogCXUzMiBhcGVkYXRhOworCWNoYXIgKmZ3dHlwZTsKIAogCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfRU5BQkxFX0FQRSkgfHwKIAkgICAgISh0cC0+dGczX2ZsYWdzICAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQpAQCAtMTI3MTQsOSArMTI3MzYsMTUgQEAKIAogCWFwZWRhdGEgPSB0ZzNfYXBlX3JlYWQzMih0cCwgVEczX0FQRV9GV19WRVJTSU9OKTsKIAorCWlmICh0ZzNfYXBlX3JlYWQzMih0cCwgVEczX0FQRV9GV19GRUFUVVJFUykgJiBURzNfQVBFX0ZXX0ZFQVRVUkVfTkNTSSkKKwkJZnd0eXBlID0gIk5DU0kiOworCWVsc2UKKwkJZnd0eXBlID0gIkRBU0giOworCiAJdmxlbiA9IHN0cmxlbih0cC0+ZndfdmVyKTsKIAotCXNucHJpbnRmKCZ0cC0+ZndfdmVyW3ZsZW5dLCBURzNfVkVSX1NJWkUgLSB2bGVuLCAiIERBU0ggdiVkLiVkLiVkLiVkIiwKKwlzbnByaW50ZigmdHAtPmZ3X3Zlclt2bGVuXSwgVEczX1ZFUl9TSVpFIC0gdmxlbiwgIiAlcyB2JWQuJWQuJWQuJWQiLAorCQkgZnd0eXBlLAogCQkgKGFwZWRhdGEgJiBBUEVfRldfVkVSU0lPTl9NQUpNU0spID4+IEFQRV9GV19WRVJTSU9OX01BSlNGVCwKIAkJIChhcGVkYXRhICYgQVBFX0ZXX1ZFUlNJT05fTUlOTVNLKSA+PiBBUEVfRldfVkVSU0lPTl9NSU5TRlQsCiAJCSAoYXBlZGF0YSAmIEFQRV9GV19WRVJTSU9OX1JFVk1TSykgPj4gQVBFX0ZXX1ZFUlNJT05fUkVWU0ZULApAQCAtMTI3NjAsNiArMTI3ODgsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogX19kZXZpbml0IHRnM19maW5kX3BlZXIoc3RydWN0IHRnMyAqKTsKIAorc3RhdGljIHZvaWQgaW5saW5lIHZsYW5fZmVhdHVyZXNfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gZmxhZ3M7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9pbnZhcmlhbnRzKHN0cnVjdCB0ZzMgKnRwKQogewogCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3cml0ZV9yZW9yZGVyX2NoaXBzZXRzW10gPSB7CkBAIC0xMjgwNCw3ICsxMjgzOSw4IEBACiAKIAkJaWYgKHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTcxNyB8fAogCQkgICAgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181NzE4IHx8Ci0JCSAgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3MjQpCisJCSAgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3MjQgfHwKKwkJICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTcxOSkKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwKIAkJCQkJICAgICAgVEczUENJX0dFTjJfUFJPRElEX0FTSUNSRVYsCiAJCQkJCSAgICAgICZwcm9kX2lkX2FzaWNfcmV2KTsKQEAgLTEyOTYyLDYgKzEyOTk4LDExIEBACiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3KQogCQl0cC0+cGRldl9wZWVyID0gdGczX2ZpbmRfcGVlcih0cCk7CiAKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTkgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM181NzE3X1BMVVM7CisKIAkvKiBJbnRlbnRpb25hbGx5IGV4Y2x1ZGUgQVNJQ19SRVZfNTkwNiAqLwogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1NSB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NyB8fApAQCAtMTI5NjksOCArMTMwMTAsNyBAQAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc2MSB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NSB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3ODAgfHwKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCSAgICAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzE3X1BMVVMpKQogCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM181NzU1X1BMVVM7CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTAgfHwKQEAgLTEyOTkwLDE2ICsxMzAzMCwxNyBAQAogCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMF9CMCkKIAkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19CUk9LRU5fQ0hFQ0tTVU1TOwogCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIGZlYXR1cmVzID0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfR1JPOworCiAJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TOwotCQl0cC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1NHOwogCQlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzU1X1BMVVMpCi0JCQl0cC0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQVjZfQ1NVTTsKLQkJdHAtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CisJCQlmZWF0dXJlcyB8PSBORVRJRl9GX0lQVjZfQ1NVTTsKKwkJdHAtPmRldi0+ZmVhdHVyZXMgfD0gZmVhdHVyZXM7CisJCXZsYW5fZmVhdHVyZXNfYWRkKHRwLT5kZXYsIGZlYXR1cmVzKTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgVFNPIGNhcGFiaWxpdGllcyAqLwotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpCisJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKQogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9IV19UU09fMzsKIAllbHNlIGlmICgodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzU1X1BMVVMpIHx8CiAJCSBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTkwNikKQEAgLTEzMDM1LDE0ICsxMzA3NiwxNCBAQAogCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfMVNIT1RfTVNJOwogCQl9CiAKLQkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8Ci0JCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpIHsKKwkJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKSB7CiAJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1NVUFBPUlRfTVNJWDsKIAkJCXRwLT5pcnFfbWF4ID0gVEczX0lSUV9NQVhfVkVDUzsKIAkJfQogCX0KIAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTkwNikKIAkJdHAtPnRnM19mbGFnczMgfD0gVEczX0ZMRzNfU0hPUlRfRE1BX0JVRzsKIAllbHNlIGlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTc1NV9QTFVTKSkgewpAQCAtMTMwNTAsOCArMTMwOTEsNyBAQAogCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM180MEJJVF9ETUFfTElNSVRfQlVHOwogCX0KIAotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpCisJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKQogCQl0cC0+dGczX2ZsYWdzMyB8PSBURzNfRkxHM19VU0VfSlVNQk9fQkRGTEFHOwogCiAJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHx8CkBAIC0xMzI0Miw3ICsxMzI4Miw4IEBACiAJCSAqIEFQRSByZWdpc3RlciBhbmQgbWVtb3J5IHNwYWNlLgogCQkgKi8KIAkJcGNpX3N0YXRlX3JlZyB8PSBQQ0lTVEFURV9BTExPV19BUEVfQ1RMU1BDX1dSIHwKLQkJCQkgUENJU1RBVEVfQUxMT1dfQVBFX1NITUVNX1dSOworCQkJCSBQQ0lTVEFURV9BTExPV19BUEVfU0hNRU1fV1IgfAorCQkJCSBQQ0lTVEFURV9BTExPV19BUEVfUFNQQUNFX1dSOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsCiAJCQkJICAgICAgIHBjaV9zdGF0ZV9yZWcpOwogCX0KQEAgLTEzMjUxLDggKzEzMjkyLDcgQEAKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NjEgfHwKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODUgfHwKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzgwIHx8Ci0JICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8Ci0JICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkgICAgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTcxN19QTFVTKSkKIAkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19DUE1VX1BSRVNFTlQ7CiAKIAkvKiBTZXQgdXAgdHAtPmdyY19sb2NhbF9jdHJsIGJlZm9yZSBjYWxsaW5nIHRnM19zZXRfcG93ZXJfc3RhdGUoKS4KQEAgLTEzMzEwLDQwICsxMzM1MCwzOSBAQAogCX0KIAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTkwNikKLQkJdHAtPnRnM19mbGFnczMgfD0gVEczX0ZMRzNfUEhZX0lTX0ZFVDsKKwkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX0lTX0ZFVDsKIAogCS8qIEEgZmV3IGJvYXJkcyBkb24ndCB3YW50IEV0aGVybmV0QFdpcmVTcGVlZCBwaHkgZmVhdHVyZSAqLwogCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHx8CiAJICAgICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpICYmCiAJICAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTApICYmCiAJICAgICAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDVfQTEpKSB8fAotCSAgICAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfSVNfRkVUKSB8fAotCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSkKLQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQ7CisJICAgICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpIHx8CisJICAgICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSkKKwkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX05PX0VUSF9XSVJFX1NQRUVEOwogCiAJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3MDNfQVggfHwKIAkgICAgR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwNF9BWCkKLQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX0FEQ19CVUc7CisJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19BRENfQlVHOwogCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNF9BMCkKLQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZXzU3MDRfQTBfQlVHOworCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfNTcwNF9BMF9CVUc7CiAKIAlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSAmJgotCSAgICAhKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkgJiYKKwkgICAgISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpICYmCiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81Nzg1ICYmCiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81Nzc4MCAmJgotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcxNyAmJgotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc3NjUpIHsKKwkgICAgISh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczXzU3MTdfUExVUykpIHsKIAkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzU1IHx8CiAJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NyB8fAogCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODQgfHwKIAkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzYxKSB7CiAJCQlpZiAodHAtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzU2ICYmCiAJCQkgICAgdHAtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzIyKQotCQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV9KSVRURVJfQlVHOworCQkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19KSVRURVJfQlVHOwogCQkJaWYgKHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc1NU0pCi0JCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX0FESlVTVF9UUklNOworCQkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19BREpVU1RfVFJJTTsKIAkJfSBlbHNlCi0JCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfQkVSX0JVRzsKKwkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19CRVJfQlVHOwogCX0KIAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc4NCAmJgpAQCAtMTMzNzIsOCArMTM0MTEsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3ICYmCi0JICAgICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcxN19BMCB8fAotCQkgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTUlJX1NFUkRFUykpKQorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcxN19BMCkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAogCS8qIEluaXRpYWxpemUgZGF0YS9kZXNjcmlwdG9yIGJ5dGUvd29yZCBzd2FwcGluZy4gKi8KQEAgLTEzNDU3LDggKzEzNDk1LDggQEAKIAkgICAgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc5MCB8fAogCSAgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzkxIHx8CiAJICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTc3OTUgfHwKLQkgICAgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0lTX0ZFVCkpCi0JCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfMTBfMTAwX09OTFk7CisJICAgICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpKQorCQl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfMTBfMTAwX09OTFk7CiAKIAllcnIgPSB0ZzNfcGh5X3Byb2JlKHRwKTsKIAlpZiAoZXJyKSB7CkBAIC0xMzQ3MCwxMyArMTM1MDgsMTMgQEAKIAl0ZzNfcmVhZF92cGQodHApOwogCXRnM19yZWFkX2Z3X3Zlcih0cCk7CiAKLQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7Ci0JCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQ7CisJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BIWV9TRVJERVMpIHsKKwkJdHAtPnBoeV9mbGFncyAmPSB+VEczX1BIWUZMR19VU0VfTUlfSU5URVJSVVBUOwogCX0gZWxzZSB7CiAJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCkKLQkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVDsKKwkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19VU0VfTUlfSU5URVJSVVBUOwogCQllbHNlCi0JCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19VU0VfTUlfSU5URVJSVVBUOworCQkJdHAtPnBoeV9mbGFncyAmPSB+VEczX1BIWUZMR19VU0VfTUlfSU5URVJSVVBUOwogCX0KIAogCS8qIDU3MDAge0FYLEJYfSBjaGlwcyBoYXZlIGEgYnJva2VuIHN0YXR1cyBibG9jayBsaW5rCkBAIC0xMzQ5NCwxMyArMTM1MzIsMTMgQEAKIAkgKi8KIAlpZiAodHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUxMICYmCiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxICYmCi0JICAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSkgewotCQl0cC0+dGczX2ZsYWdzIHw9IChURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUIHwKLQkJCQkgIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRyk7CisJICAgICEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEhZX1NFUkRFUykpIHsKKwkJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX1VTRV9NSV9JTlRFUlJVUFQ7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHOwogCX0KIAogCS8qIEZvciBhbGwgU0VSREVTIHdlIHBvbGwgdGhlIE1BQyBzdGF0dXMgcmVnaXN0ZXIuICovCi0JaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfUEhZX1NFUkRFUykKIAkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QT0xMX1NFUkRFUzsKIAllbHNlCiAJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1BPTExfU0VSREVTOwpAQCAtMTM1ODAsOSArMTM2MTgsMTIgQEAKIAkJCXR3MzJfZihOVlJBTV9DTUQsIE5WUkFNX0NNRF9SRVNFVCk7CiAJCWVsc2UKIAkJCXRnM19udnJhbV91bmxvY2sodHApOwotCX0gZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcpIHsKLQkJaWYgKHRyMzIoVEczX0NQTVVfU1RBVFVTKSAmIFRHM19DUE1VX1NUQVRVU19QQ0lFX0ZVTkMpCisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCQkgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkgeworCQlpZiAoUENJX0ZVTkModHAtPnBkZXYtPmRldmZuKSAmIDEpCiAJCQltYWNfb2Zmc2V0ID0gMHhjYzsKKwkJaWYgKFBDSV9GVU5DKHRwLT5wZGV2LT5kZXZmbikgPiAxKQorCQkJbWFjX29mZnNldCArPSAweDE4YzsKIAl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81OTA2KQogCQltYWNfb2Zmc2V0ID0gMHgxMDsKIApAQCAtMTM2NjcsOCArMTM3MDgsNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpIHsKKwlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzE3X1BMVVMpIHsKIAkJdmFsID0gZ29hbCA/IDAgOiBETUFfUldDVFJMX0RJU19DQUNIRV9BTElHTk1FTlQ7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzODc5LDggKzEzOTE5LDcgQEAKIAogCXRwLT5kbWFfcndjdHJsID0gdGczX2NhbGNfZG1hX2JuZHJ5KHRwLCB0cC0+ZG1hX3J3Y3RybCk7CiAKLQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczXzU3MTdfUExVUykKIAkJZ290byBvdXQ7CiAKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgewpAQCAtMTQwNzAsNyArMTQxMDksNiBAQAogCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CiAJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CiAJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKLQl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDA7CiAJdHAtPmxpbmtfY29uZmlnLm9yaWdfc3BlZWQgPSBTUEVFRF9JTlZBTElEOwogCXRwLT5saW5rX2NvbmZpZy5vcmlnX2R1cGxleCA9IERVUExFWF9JTlZBTElEOwogCXRwLT5saW5rX2NvbmZpZy5vcmlnX2F1dG9uZWcgPSBBVVRPTkVHX0lOVkFMSUQ7CkBAIC0xNDA3OCw4ICsxNDExNiw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHN0cnVjdCB0ZzMgKnRwKQogewotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpIHsKKwlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM181NzE3X1BMVVMpIHsKIAkJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9yZWFkX2RtYV9sb3dfd2F0ZXIgPQogCQkJREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl81NzA1OwogCQl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXIgPQpAQCAtMTQxNTYsNiArMTQxOTMsNyBAQAogCWNhc2UgVEczX1BIWV9JRF9CQ001NzE4QzoJcmV0dXJuICI1NzE4QyI7CiAJY2FzZSBURzNfUEhZX0lEX0JDTTU3MThTOglyZXR1cm4gIjU3MThTIjsKIAljYXNlIFRHM19QSFlfSURfQkNNNTc3NjU6CXJldHVybiAiNTc3NjUiOworCWNhc2UgVEczX1BIWV9JRF9CQ001NzE5QzoJcmV0dXJuICI1NzE5QyI7CiAJY2FzZSBURzNfUEhZX0lEX0JDTTgwMDI6CXJldHVybiAiODAwMi9zZXJkZXMiOwogCWNhc2UgMDoJCQlyZXR1cm4gInNlcmRlcyI7CiAJZGVmYXVsdDoJCXJldHVybiAidW5rbm93biI7CkBAIC0xNDI2MSw3ICsxNDI5OSw3IEBACiAJLm5kb19vcGVuCQk9IHRnM19vcGVuLAogCS5uZG9fc3RvcAkJPSB0ZzNfY2xvc2UsCiAJLm5kb19zdGFydF94bWl0CQk9IHRnM19zdGFydF94bWl0LAotCS5uZG9fZ2V0X3N0YXRzCQk9IHRnM19nZXRfc3RhdHMsCisJLm5kb19nZXRfc3RhdHM2NAk9IHRnM19nZXRfc3RhdHM2NCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHRnM19zZXRfcnhfbW9kZSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHRnM19zZXRfbWFjX2FkZHIsCkBAIC0xNDI4MCw3ICsxNDMxOCw3IEBACiAJLm5kb19vcGVuCQk9IHRnM19vcGVuLAogCS5uZG9fc3RvcAkJPSB0ZzNfY2xvc2UsCiAJLm5kb19zdGFydF94bWl0CQk9IHRnM19zdGFydF94bWl0X2RtYV9idWcsCi0JLm5kb19nZXRfc3RhdHMJCT0gdGczX2dldF9zdGF0cywKKwkubmRvX2dldF9zdGF0czY0CT0gdGczX2dldF9zdGF0czY0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gdGczX3NldF9yeF9tb2RlLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gdGczX3NldF9tYWNfYWRkciwKQEAgLTE0NDA0LDcgKzE0NDQyLDggQEAKIAl9CiAKIAlpZiAoKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfNTc1NV9QTFVTKSAmJgotCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcxN19BMCkKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MTdfQTAgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTkpCiAJCWRldi0+bmV0ZGV2X29wcyA9ICZ0ZzNfbmV0ZGV2X29wczsKIAllbHNlCiAJCWRldi0+bmV0ZGV2X29wcyA9ICZ0ZzNfbmV0ZGV2X29wc19kbWFfYnVnOwpAQCAtMTQ0NjgsMjAgKzE0NTA3LDI1IEBACiAJICogaXMgb2ZmIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgZW5hYmxlZCB1c2luZyBldGh0b29sLgogCSAqLwogCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pICYmCi0JICAgIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSkKKwkgICAgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pKSB7CiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0KKwkJdmxhbl9mZWF0dXJlc19hZGQoZGV2LCBORVRJRl9GX1RTTyk7CisJfQogCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU09fMikgfHwKIAkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPXzMpKSB7Ci0JCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUFY2X0NTVU0pCisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUFY2X0NTVU0pIHsKIAkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworCQkJdmxhbl9mZWF0dXJlc19hZGQoZGV2LCBORVRJRl9GX1RTTzYpOworCQl9CiAJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU09fMykgfHwKIAkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzYxIHx8CiAJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODQgJiYKIAkJICAgICBHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQ0hJUFJFVl81Nzg0X0FYKSB8fAogCQkJR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODUgfHwKLQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc4MCkKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc4MCkgewogCQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTT19FQ047CisJCQl2bGFuX2ZlYXR1cmVzX2FkZChkZXYsIE5FVElGX0ZfVFNPX0VDTik7CisJCX0KIAl9CiAKIAlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTEgJiYKQEAgLTE0NTk3LDI0ICsxNDY0MSwzMSBAQAogCQkgICAgdGczX2J1c19zdHJpbmcodHAsIHN0ciksCiAJCSAgICBkZXYtPmRldl9hZGRyKTsKIAotCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9DT05ORUNURUQpIHsKKwlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKSB7CiAJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJCXBoeWRldiA9IHRwLT5tZGlvX2J1cy0+cGh5X21hcFtURzNfUEhZX01JSV9BRERSXTsKIAkJbmV0ZGV2X2luZm8oZGV2LAogCQkJICAgICJhdHRhY2hlZCBQSFkgZHJpdmVyIFslc10gKG1paV9idXM6cGh5X2FkZHI9JXMpXG4iLAogCQkJICAgIHBoeWRldi0+ZHJ2LT5uYW1lLCBkZXZfbmFtZSgmcGh5ZGV2LT5kZXYpKTsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQljaGFyICpldGh0eXBlOworCisJCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkKKwkJCWV0aHR5cGUgPSAiMTAvMTAwQmFzZS1UWCI7CisJCWVsc2UgaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpCisJCQlldGh0eXBlID0gIjEwMDBCYXNlLVNYIjsKKwkJZWxzZQorCQkJZXRodHlwZSA9ICIxMC8xMDAvMTAwMEJhc2UtVCI7CisKIAkJbmV0ZGV2X2luZm8oZGV2LCAiYXR0YWNoZWQgUEhZIGlzICVzICglcyBFdGhlcm5ldCkgIgotCQkJICAgICIoV2lyZVNwZWVkWyVkXSlcbiIsIHRnM19waHlfc3RyaW5nKHRwKSwKLQkJCSAgICAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgPyAiMTAvMTAwQmFzZS1UWCIgOgotCQkJICAgICAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQU5ZX1NFUkRFUykgPyAiMTAwMEJhc2UtU1giIDoKLQkJCSAgICAgICIxMC8xMDAvMTAwMEJhc2UtVCIpKSwKLQkJCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRCkgPT0gMCk7CisJCQkgICAgIihXaXJlU3BlZWRbJWRdKVxuIiwgdGczX3BoeV9zdHJpbmcodHApLCBldGh0eXBlLAorCQkJICAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfTk9fRVRIX1dJUkVfU1BFRUQpID09IDApOworCX0KIAogCW5ldGRldl9pbmZvKGRldiwgIlJYY3N1bXNbJWRdIExpbmtDaGdSRUdbJWRdIE1JaXJxWyVkXSBBU0ZbJWRdIFRTT2NhcFslZF1cbiIsCiAJCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX0NIRUNLU1VNUykgIT0gMCwKIAkJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKSAhPSAwLAotCQkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKSAhPSAwLAorCQkgICAgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1VTRV9NSV9JTlRFUlJVUFQpICE9IDAsCiAJCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpICE9IDAsCiAJCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkgIT0gMCk7CiAJbmV0ZGV2X2luZm8oZGV2LCAiZG1hX3J3Y3RybFslMDh4XSBkbWFfbWFza1slZC1iaXRdXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaAppbmRleCBjZTljNDkxLi40OTM3YmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuaAorKysgYi9kcml2ZXJzL25ldC90ZzMuaApAQCAtNTMsNiArNTMsNyBAQAogI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNTc3NjUJIDB4MTZiNAogI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNTc3OTEJIDB4MTZiMgogI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNTc3OTUJIDB4MTZiNgorI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNTcxOQkgMHgxNjU3CiAvKiAweDA0IC0tPiAweDJjIHVudXNlZCAqLwogI2RlZmluZSBURzNQQ0lfU1VCVkVORE9SX0lEX0JST0FEQ09NCQlQQ0lfVkVORE9SX0lEX0JST0FEQ09NCiAjZGVmaW5lIFRHM1BDSV9TVUJERVZJQ0VfSURfQlJPQURDT01fOTU3MDBBNgkweDE2NDQKQEAgLTE2MCw2ICsxNjEsNyBAQAogI2RlZmluZSAgIEFTSUNfUkVWXzU3NzgwCQkgMHg1Nzc4MAogI2RlZmluZSAgIEFTSUNfUkVWXzU3MTcJCQkgMHg1NzE3CiAjZGVmaW5lICAgQVNJQ19SRVZfNTc3NjUJCSAweDU3Nzg1CisjZGVmaW5lICAgQVNJQ19SRVZfNTcxOQkJCSAweDU3MTkKICNkZWZpbmUgIEdFVF9DSElQX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgPj4gOCkKICNkZWZpbmUgICBDSElQUkVWXzU3MDBfQVgJCSAweDcwCiAjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0JYCQkgMHg3MQpAQCAtMjMxLDYgKzIzMyw3IEBACiAjZGVmaW5lICBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQQkgMHgwMDAwMjAwMAogI2RlZmluZSAgUENJU1RBVEVfQUxMT1dfQVBFX0NUTFNQQ19XUgkgMHgwMDAxMDAwMAogI2RlZmluZSAgUENJU1RBVEVfQUxMT1dfQVBFX1NITUVNX1dSCSAweDAwMDIwMDAwCisjZGVmaW5lICBQQ0lTVEFURV9BTExPV19BUEVfUFNQQUNFX1dSCSAweDAwMDQwMDAwCiAjZGVmaW5lIFRHM1BDSV9DTE9DS19DVFJMCQkweDAwMDAwMDc0CiAjZGVmaW5lICBDTE9DS19DVFJMX0NPUkVDTEtfRElTQUJMRQkgMHgwMDAwMDIwMAogI2RlZmluZSAgQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFCSAweDAwMDAwNDAwCkBAIC00NjgsNiArNDcxLDcgQEAKICNkZWZpbmUgIFRYX01PREVfRkxPV19DVFJMX0VOQUJMRQkgMHgwMDAwMDAxMAogI2RlZmluZSAgVFhfTU9ERV9CSUdfQkNLT0ZGX0VOQUJMRQkgMHgwMDAwMDAyMAogI2RlZmluZSAgVFhfTU9ERV9MT05HX1BBVVNFX0VOQUJMRQkgMHgwMDAwMDA0MAorI2RlZmluZSAgVFhfTU9ERV9NQlVGX0xPQ0tVUF9GSVgJIDB4MDAwMDAxMDAKICNkZWZpbmUgTUFDX1RYX1NUQVRVUwkJCTB4MDAwMDA0NjAKICNkZWZpbmUgIFRYX1NUQVRVU19YT0ZGRUQJCSAweDAwMDAwMDAxCiAjZGVmaW5lICBUWF9TVEFUVVNfU0VOVF9YT0ZGCQkgMHgwMDAwMDAwMgpAQCAtMTA3MSwxMCArMTA3NSw4IEBACiAjZGVmaW5lIFRHM19DUE1VX0hTVF9BQ0MJCTB4MDAwMDM2MWMKICNkZWZpbmUgIENQTVVfSFNUX0FDQ19NQUNDTEtfTUFTSwkgMHgwMDFmMDAwMAogI2RlZmluZSAgQ1BNVV9IU1RfQUNDX01BQ0NMS182XzI1CSAweDAwMTMwMDAwCi0vKiAweDM2MjAgLS0+IDB4MzYyYyB1bnVzZWQgKi8KKy8qIDB4MzYyMCAtLT4gMHgzNjMwIHVudXNlZCAqLwogCi0jZGVmaW5lIFRHM19DUE1VX1NUQVRVUwkJCTB4MDAwMDM2MmMKLSNkZWZpbmUgIFRHM19DUE1VX1NUQVRVU19QQ0lFX0ZVTkMJIDB4MjAwMDAwMDAKICNkZWZpbmUgVEczX0NQTVVfQ0xDS19TVEFUCQkweDAwMDAzNjMwCiAjZGVmaW5lICBDUE1VX0NMQ0tfU1RBVF9NQUNfQ0xDS19NQVNLCSAweDAwMWYwMDAwCiAjZGVmaW5lICBDUE1VX0NMQ0tfU1RBVF9NQUNfQ0xDS182Ml81CSAweDAwMDAwMDAwCkBAIC0xODQyLDYgKzE4NDQsMTAgQEAKICNkZWZpbmUgIFRHM19QQ0lFX0xOS0NUTF9MMV9QTExfUERfRElTCSAweDAwMDAwMDgwCiAvKiAweDdkNTggLS0+IDB4N2U3MCB1bnVzZWQgKi8KIAorI2RlZmluZSBURzNfUENJRV9QSFlfVFNUQ1RMCQkweDAwMDA3ZTJjCisjZGVmaW5lICBURzNfUENJRV9QSFlfVFNUQ1RMX1BDSUUxMAkgMHgwMDAwMDA0MAorI2RlZmluZSAgVEczX1BDSUVfUEhZX1RTVENUTF9QU0NSQU0JIDB4MDAwMDAwMjAKKwogI2RlZmluZSBURzNfUENJRV9FSURMRV9ERUxBWQkJMHgwMDAwN2U3MAogI2RlZmluZSAgVEczX1BDSUVfRUlETEVfREVMQVlfTUFTSwkgMHgwMDAwMDAxZgogI2RlZmluZSAgVEczX1BDSUVfRUlETEVfREVMQVlfMTNfQ0xLUwkgMHgwMDAwMDAwYwpAQCAtMjAzMCwzMSArMjAzNiw5IEBACiAKIAogLyogQ3VycmVudGx5IHRoaXMgaXMgZml4ZWQuICovCi0jZGVmaW5lIFRHM19QSFlfUENJRV9BRERSCQkweDAwCiAjZGVmaW5lIFRHM19QSFlfTUlJX0FERFIJCTB4MDEKIAogCi0vKioqIFRpZ29uMyBzcGVjaWZpYyBQSFkgUENJRSByZWdpc3RlcnMuICoqKi8KLQotI2RlZmluZSBURzNfUENJRVBIWV9CTE9DS19BRERSCQkweDFmCi0jZGVmaW5lICBURzNfUENJRVBIWV9YR1hTX0JMSzEJCTB4MDgwMQotI2RlZmluZSAgVEczX1BDSUVQSFlfVFhCX0JMSwkJMHgwODYxCi0jZGVmaW5lICBURzNfUENJRVBIWV9CTE9DS19TSElGVAk0Ci0KLS8qIFRHM19QQ0lFUEhZX1RYQl9CTEsgKi8KLSNkZWZpbmUgVEczX1BDSUVQSFlfVFgwQ1RSTDEJCTB4MTUKLSNkZWZpbmUgIFRHM19QQ0lFUEhZX1RYMENUUkwxX1RYT0NNCTB4MDAwMwotI2RlZmluZSAgVEczX1BDSUVQSFlfVFgwQ1RSTDFfUkRDVEwJMHgwMDA4Ci0jZGVmaW5lICBURzNfUENJRVBIWV9UWDBDVFJMMV9UWENNVgkweDAwMzAKLSNkZWZpbmUgIFRHM19QQ0lFUEhZX1RYMENUUkwxX1RLU0VMCTB4MDA0MAotI2RlZmluZSAgVEczX1BDSUVQSFlfVFgwQ1RSTDFfTkJfRU4JMHgwNDAwCi0KLS8qIFRHM19QQ0lFUEhZX1hHWFNfQkxLMSAqLwotI2RlZmluZSBURzNfUENJRVBIWV9QV1JNR01UNAkJMHgxYQotI2RlZmluZSBURzNfUENJRVBIWV9QV1JNR01UNF9MMVBMTFBEX0VOCTB4MDAzOAotI2RlZmluZSBURzNfUENJRVBIWV9QV1JNR01UNF9MT1dQV1JfRU4JMHg0MDAwCi0KLQogLyoqKiBUaWdvbjMgc3BlY2lmaWMgUEhZIE1JSSByZWdpc3RlcnMuICoqKi8KICNkZWZpbmUgIFRHM19CTUNSX1NQRUVEMTAwMAkJMHgwMDQwCiAKQEAgLTIwNzMsOCArMjA1Nyw5IEBACiAjZGVmaW5lIE1JSV9URzNfRVhUX1NUQVQJCTB4MTEgLyogRXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lICBNSUlfVEczX0VYVF9TVEFUX0xQQVNTCQkweDAxMDAKIAorI2RlZmluZSBNSUlfVEczX1JYUl9DT1VOVEVSUwkJMHgxNCAvKiBMb2NhbC9SZW1vdGUgUmVjZWl2ZXIgQ291bnRzICovCiAjZGVmaW5lIE1JSV9URzNfRFNQX1JXX1BPUlQJCTB4MTUgLyogRFNQIGNvZWZmaWNpZW50IHJlYWQvd3JpdGUgcG9ydCAqLwotCisjZGVmaW5lIE1JSV9URzNfRFNQX0NPTlRST0wJCTB4MTYgLyogRFNQIGNvbnRyb2wgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTUlJX1RHM19EU1BfQUREUkVTUwkJMHgxNyAvKiBEU1AgYWRkcmVzcyByZWdpc3RlciAqLwogCiAjZGVmaW5lIE1JSV9URzNfRFNQX1RBUDEJCTB4MDAwMQpAQCAtMjA4Miw2ICsyMDY3LDcgQEAKICNkZWZpbmUgTUlJX1RHM19EU1BfQUFESjFDSDAJCTB4MDAxZgogI2RlZmluZSBNSUlfVEczX0RTUF9BQURKMUNIMwkJMHg2MDFmCiAjZGVmaW5lICBNSUlfVEczX0RTUF9BQURKMUNIM19BRENDS0FESgkweDAwMDIKKyNkZWZpbmUgTUlJX1RHM19EU1BfRVhQMV9JTlRfU1RBVAkweDBmMDEKICNkZWZpbmUgTUlJX1RHM19EU1BfRVhQOAkJMHgwZjA4CiAjZGVmaW5lICBNSUlfVEczX0RTUF9FWFA4X1JFSjJNSHoJMHgwMDAxCiAjZGVmaW5lICBNSUlfVEczX0RTUF9FWFA4X0FFRFcJCTB4MDIwMApAQCAtMjE3Nyw2ICsyMTYzLDggQEAKIC8qIEFQRSBzaGFyZWQgbWVtb3J5LiAgQWNjZXNzaWJsZSB0aHJvdWdoIEJBUjEgKi8KICNkZWZpbmUgVEczX0FQRV9GV19TVEFUVVMJCTB4NDAwYwogI2RlZmluZSAgQVBFX0ZXX1NUQVRVU19SRUFEWQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgVEczX0FQRV9GV19GRUFUVVJFUwkJMHg0MDEwCisjZGVmaW5lICBURzNfQVBFX0ZXX0ZFQVRVUkVfTkNTSQkgMHgwMDAwMDAwMgogI2RlZmluZSBURzNfQVBFX0ZXX1ZFUlNJT04JCTB4NDAxOAogI2RlZmluZSAgQVBFX0ZXX1ZFUlNJT05fTUFKTVNLCQkgMHhmZjAwMDAwMAogI2RlZmluZSAgQVBFX0ZXX1ZFUlNJT05fTUFKU0ZUCQkgMjQKQEAgLTIxOTEsNyArMjE3OSw5IEBACiAjZGVmaW5lICBBUEVfSE9TVF9TRUdfTEVOX01BR0lDCQkgMHgwMDAwMDAxYwogI2RlZmluZSBURzNfQVBFX0hPU1RfSU5JVF9DT1VOVAkJMHg0MjA4CiAjZGVmaW5lIFRHM19BUEVfSE9TVF9EUklWRVJfSUQJCTB4NDIwYwotI2RlZmluZSAgQVBFX0hPU1RfRFJJVkVSX0lEX01BR0lDCSAweGYwMDM1MTAwCisjZGVmaW5lICBBUEVfSE9TVF9EUklWRVJfSURfTElOVVgJIDB4ZjAwMDAwMDAKKyNkZWZpbmUgIEFQRV9IT1NUX0RSSVZFUl9JRF9NQUdJQyhtYWosIG1pbikJXAorCShBUEVfSE9TVF9EUklWRVJfSURfTElOVVggfCAobWFqICYgMHhmZikgPDwgMTYgfCAobWluICYgMHhmZikgPDwgOCkKICNkZWZpbmUgVEczX0FQRV9IT1NUX0JFSEFWSU9SCQkweDQyMTAKICNkZWZpbmUgIEFQRV9IT1NUX0JFSEFWX05PX1BIWUxPQ0sJIDB4MDAwMDAwMDEKICNkZWZpbmUgVEczX0FQRV9IT1NUX0hFQVJUQkVBVF9JTlRfTVMJMHg0MjE0CkBAIC0yMjA5LDYgKzIxOTksMTEgQEAKICNkZWZpbmUgIEFQRV9FVkVOVF9TVEFUVVNfU1RBVEVfU1VTUEVORAkgMHgwMDA0MDAwMAogI2RlZmluZSAgQVBFX0VWRU5UX1NUQVRVU19FVkVOVF9QRU5ESU5HCSAweDgwMDAwMDAwCiAKKyNkZWZpbmUgVEczX0FQRV9QRVJfTE9DS19SRVEJCTB4ODQwMAorI2RlZmluZSAgQVBFX0xPQ0tfUEVSX1JFUV9EUklWRVIJIDB4MDAwMDEwMDAKKyNkZWZpbmUgVEczX0FQRV9QRVJfTE9DS19HUkFOVAkJMHg4NDIwCisjZGVmaW5lICBBUEVfUEVSX0xPQ0tfR1JBTlRfRFJJVkVSCSAweDAwMDAxMDAwCisKIC8qIEFQRSBjb252ZW5pZW5jZSBlbnVtZXJhdGlvbnMuICovCiAjZGVmaW5lIFRHM19BUEVfTE9DS19HUkMgICAgICAgICAgICAgICAgMQogI2RlZmluZSBURzNfQVBFX0xPQ0tfTUVNICAgICAgICAgICAgICAgIDQKQEAgLTI1MzksNyArMjUzNCw2IEBACiAJLyogV2hlbiB3ZSBnbyBpbiBhbmQgb3V0IG9mIGxvdyBwb3dlciBtb2RlIHdlIG5lZWQKIAkgKiB0byBzd2FwIHdpdGggdGhpcyBzdGF0ZS4KIAkgKi8KLQlpbnQJCQkJcGh5X2lzX2xvd19wb3dlcjsKIAl1MTYJCQkJb3JpZ19zcGVlZDsKIAl1OAkJCQlvcmlnX2R1cGxleDsKIAl1OAkJCQlvcmlnX2F1dG9uZWc7CkBAIC0yNzY1LDggKzI3NTksOCBAQAogCiAKIAkvKiBiZWdpbiAiZXZlcnl0aGluZyBlbHNlIiBjYWNoZWxpbmUocykgc2VjdGlvbiAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHM7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJCW5ldF9zdGF0c19wcmV2OworCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NAluZXRfc3RhdHM7CisJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0CW5ldF9zdGF0c19wcmV2OwogCXN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cwllc3RhdHM7CiAJc3RydWN0IHRnM19ldGh0b29sX3N0YXRzCWVzdGF0c19wcmV2OwogCkBAIC0yNzgwLDcgKzI3NzQsNiBAQAogI2RlZmluZSBURzNfRkxBR19UWERfTUJPWF9IV0JVRwkJMHgwMDAwMDAwMgogI2RlZmluZSBURzNfRkxBR19SWF9DSEVDS1NVTVMJCTB4MDAwMDAwMDQKICNkZWZpbmUgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHCTB4MDAwMDAwMDgKLSNkZWZpbmUgVEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVAkweDAwMDAwMDEwCiAjZGVmaW5lIFRHM19GTEFHX0VOQUJMRV9BU0YJCTB4MDAwMDAwMjAKICNkZWZpbmUgVEczX0ZMQUdfQVNQTV9XT1JLQVJPVU5ECTB4MDAwMDAwNDAKICNkZWZpbmUgVEczX0ZMQUdfUE9MTF9TRVJERVMJCTB4MDAwMDAwODAKQEAgLTI4MDIsNyArMjc5NSw2IEBACiAjZGVmaW5lIFRHM19GTEFHX1RYX1JFQ09WRVJZX1BFTkRJTkcJMHgwMDIwMDAwMAogI2RlZmluZSBURzNfRkxBR19XT0xfQ0FQCQkweDAwNDAwMDAwCiAjZGVmaW5lIFRHM19GTEFHX0pVTUJPX1JJTkdfRU5BQkxFCTB4MDA4MDAwMDAKLSNkZWZpbmUgVEczX0ZMQUdfMTBfMTAwX09OTFkJCTB4MDEwMDAwMDAKICNkZWZpbmUgVEczX0ZMQUdfUEFVU0VfQVVUT05FRwkJMHgwMjAwMDAwMAogI2RlZmluZSBURzNfRkxBR19DUE1VX1BSRVNFTlQJCTB4MDQwMDAwMDAKICNkZWZpbmUgVEczX0ZMQUdfNDBCSVRfRE1BX0JVRwkJMHgwODAwMDAwMApAQCAtMjgxMywyMiArMjgwNSwxNSBAQAogCXUzMgkJCQl0ZzNfZmxhZ3MyOwogI2RlZmluZSBURzNfRkxHMl9SRVNUQVJUX1RJTUVSCQkweDAwMDAwMDAxCiAjZGVmaW5lIFRHM19GTEcyX1RTT19CVUcJCTB4MDAwMDAwMDIKLSNkZWZpbmUgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQJMHgwMDAwMDAwNAogI2RlZmluZSBURzNfRkxHMl9JU181Nzg4CQkweDAwMDAwMDA4CiAjZGVmaW5lIFRHM19GTEcyX01BWF9SWFBFTkRfNjQJCTB4MDAwMDAwMTAKICNkZWZpbmUgVEczX0ZMRzJfVFNPX0NBUEFCTEUJCTB4MDAwMDAwMjAKLSNkZWZpbmUgVEczX0ZMRzJfUEhZX0FEQ19CVUcJCTB4MDAwMDAwNDAKLSNkZWZpbmUgVEczX0ZMRzJfUEhZXzU3MDRfQTBfQlVHCTB4MDAwMDAwODAKLSNkZWZpbmUgVEczX0ZMRzJfUEhZX0JFUl9CVUcJCTB4MDAwMDAxMDAKICNkZWZpbmUgVEczX0ZMRzJfUENJX0VYUFJFU1MJCTB4MDAwMDAyMDAKICNkZWZpbmUgVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0UJMHgwMDAwMDQwMAogI2RlZmluZSBURzNfRkxHMl9IV19BVVRPTkVHCQkweDAwMDAwODAwCiAjZGVmaW5lIFRHM19GTEcyX0lTX05JQwkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgVEczX0ZMRzJfUEhZX1NFUkRFUwkJMHgwMDAwMjAwMAotI2RlZmluZSBURzNfRkxHMl9DQVBBQ0lUSVZFX0NPVVBMSU5HCTB4MDAwMDQwMDAKICNkZWZpbmUgVEczX0ZMRzJfRkxBU0gJCQkweDAwMDA4MDAwCiAjZGVmaW5lIFRHM19GTEcyX0hXX1RTT18xCQkweDAwMDEwMDAwCi0jZGVmaW5lIFRHM19GTEcyX1NFUkRFU19QUkVFTVBIQVNJUwkweDAwMDIwMDAwCiAjZGVmaW5lIFRHM19GTEcyXzU3MDVfUExVUwkJMHgwMDA0MDAwMAogI2RlZmluZSBURzNfRkxHMl81NzUwX1BMVVMJCTB4MDAwODAwMDAKICNkZWZpbmUgVEczX0ZMRzJfSFdfVFNPXzMJCTB4MDAxMDAwMDAKQEAgLTI4MzYsMTAgKzI4MjEsNiBAQAogI2RlZmluZSBURzNfRkxHMl9VU0lOR19NU0lYCQkweDAwNDAwMDAwCiAjZGVmaW5lIFRHM19GTEcyX1VTSU5HX01TSV9PUl9NU0lYCShURzNfRkxHMl9VU0lOR19NU0kgfCBcCiAJCQkJCVRHM19GTEcyX1VTSU5HX01TSVgpCi0jZGVmaW5lIFRHM19GTEcyX01JSV9TRVJERVMJCTB4MDA4MDAwMDAKLSNkZWZpbmUgVEczX0ZMRzJfQU5ZX1NFUkRFUwkJKFRHM19GTEcyX1BIWV9TRVJERVMgfAlcCi0JCQkJCVRHM19GTEcyX01JSV9TRVJERVMpCi0jZGVmaW5lIFRHM19GTEcyX1BBUkFMTEVMX0RFVEVDVAkweDAxMDAwMDAwCiAjZGVmaW5lIFRHM19GTEcyX0lDSF9XT1JLQVJPVU5ECQkweDAyMDAwMDAwCiAjZGVmaW5lIFRHM19GTEcyXzU3ODBfQ0xBU1MJCTB4MDQwMDAwMDAKICNkZWZpbmUgVEczX0ZMRzJfSFdfVFNPXzIJCTB4MDgwMDAwMDAKQEAgLTI4NDcsOSArMjgyOCw3IEBACiAJCQkJCSBURzNfRkxHMl9IV19UU09fMiB8IFwKIAkJCQkJIFRHM19GTEcyX0hXX1RTT18zKQogI2RlZmluZSBURzNfRkxHMl8xU0hPVF9NU0kJCTB4MTAwMDAwMDAKLSNkZWZpbmUgVEczX0ZMRzJfUEhZX0pJVFRFUl9CVUcJCTB4MjAwMDAwMDAKICNkZWZpbmUgVEczX0ZMRzJfTk9fRldBUkVfUkVQT1JURUQJMHg0MDAwMDAwMAotI2RlZmluZSBURzNfRkxHMl9QSFlfQURKVVNUX1RSSU0JMHg4MDAwMDAwMAogCXUzMgkJCQl0ZzNfZmxhZ3MzOwogI2RlZmluZSBURzNfRkxHM19OT19OVlJBTV9BRERSX1RSQU5TCTB4MDAwMDAwMDEKICNkZWZpbmUgVEczX0ZMRzNfRU5BQkxFX0FQRQkJMHgwMDAwMDAwMgpAQCAtMjg1NywxNSArMjgzNiwxMiBAQAogI2RlZmluZSBURzNfRkxHM181NzAxX0RNQV9CVUcJCTB4MDAwMDAwMDgKICNkZWZpbmUgVEczX0ZMRzNfVVNFX1BIWUxJQgkJMHgwMDAwMDAxMAogI2RlZmluZSBURzNfRkxHM19NRElPQlVTX0lOSVRFRAkJMHgwMDAwMDAyMAotI2RlZmluZSBURzNfRkxHM19QSFlfQ09OTkVDVEVECQkweDAwMDAwMDgwCiAjZGVmaW5lIFRHM19GTEczX1JHTUlJX0lOQkFORF9ESVNBQkxFCTB4MDAwMDAxMDAKICNkZWZpbmUgVEczX0ZMRzNfUkdNSUlfRVhUX0lCTkRfUlhfRU4JMHgwMDAwMDIwMAogI2RlZmluZSBURzNfRkxHM19SR01JSV9FWFRfSUJORF9UWF9FTgkweDAwMDAwNDAwCiAjZGVmaW5lIFRHM19GTEczX0NMS1JFUV9CVUcJCTB4MDAwMDA4MDAKLSNkZWZpbmUgVEczX0ZMRzNfUEhZX0VOQUJMRV9BUEQJCTB4MDAwMDEwMDAKICNkZWZpbmUgVEczX0ZMRzNfNTc1NV9QTFVTCQkweDAwMDAyMDAwCiAjZGVmaW5lIFRHM19GTEczX05PX05WUkFNCQkweDAwMDA0MDAwCi0jZGVmaW5lIFRHM19GTEczX1BIWV9JU19GRVQJCTB4MDAwMTAwMDAKICNkZWZpbmUgVEczX0ZMRzNfRU5BQkxFX1JTUwkJMHgwMDAyMDAwMAogI2RlZmluZSBURzNfRkxHM19FTkFCTEVfVFNTCQkweDAwMDQwMDAwCiAjZGVmaW5lIFRHM19GTEczXzRHX0RNQV9CTkRSWV9CVUcJMHgwMDA4MDAwMApAQCAtMjg3Myw2ICsyODQ5LDcgQEAKICNkZWZpbmUgVEczX0ZMRzNfU0hPUlRfRE1BX0JVRwkJMHgwMDIwMDAwMAogI2RlZmluZSBURzNfRkxHM19VU0VfSlVNQk9fQkRGTEFHCTB4MDA0MDAwMDAKICNkZWZpbmUgVEczX0ZMRzNfTDFQTExQRF9FTgkJMHgwMDgwMDAwMAorI2RlZmluZSBURzNfRkxHM181NzE3X1BMVVMJCTB4MDEwMDAwMDAKIAogCXN0cnVjdCB0aW1lcl9saXN0CQl0aW1lcjsKIAl1MTYJCQkJdGltZXJfY291bnRlcjsKQEAgLTI5NDIsNiArMjkxOSw3IEBACiAjZGVmaW5lIFRHM19QSFlfSURfQkNNNTcxOEMJCTB4NWMwZDhhMDAKICNkZWZpbmUgVEczX1BIWV9JRF9CQ001NzE4UwkJMHhiYzA1MGZmMAogI2RlZmluZSBURzNfUEhZX0lEX0JDTTU3NzY1CQkweDVjMGQ4YTQwCisjZGVmaW5lIFRHM19QSFlfSURfQkNNNTcxOUMJCTB4NWMwZDhhMjAKICNkZWZpbmUgVEczX1BIWV9JRF9CQ001OTA2CQkweGRjMDBhYzQwCiAjZGVmaW5lIFRHM19QSFlfSURfQkNNODAwMgkJMHg2MDAxMDE0MAogI2RlZmluZSBURzNfUEhZX0lEX0lOVkFMSUQJCTB4ZmZmZmZmZmYKQEAgLTI5NjUsNyArMjk0MywyOSBAQAogCSAoWCkgPT0gVEczX1BIWV9JRF9CQ001NzU1IHx8IChYKSA9PSBURzNfUEhZX0lEX0JDTTU3NTYgfHwgXAogCSAoWCkgPT0gVEczX1BIWV9JRF9CQ001OTA2IHx8IChYKSA9PSBURzNfUEhZX0lEX0JDTTU3NjEgfHwgXAogCSAoWCkgPT0gVEczX1BIWV9JRF9CQ001NzE4QyB8fCAoWCkgPT0gVEczX1BIWV9JRF9CQ001NzE4UyB8fCBcCi0JIChYKSA9PSBURzNfUEhZX0lEX0JDTTU3NzY1IHx8IChYKSA9PSBURzNfUEhZX0lEX0JDTTgwMDIpCisJIChYKSA9PSBURzNfUEhZX0lEX0JDTTU3NzY1IHx8IChYKSA9PSBURzNfUEhZX0lEX0JDTTU3MTlDIHx8IFwKKwkgKFgpID09IFRHM19QSFlfSURfQkNNODAwMikKKworCXUzMgkJCQlwaHlfZmxhZ3M7CisjZGVmaW5lIFRHM19QSFlGTEdfSVNfTE9XX1BPV0VSCQkweDAwMDAwMDAxCisjZGVmaW5lIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVECQkweDAwMDAwMDAyCisjZGVmaW5lIFRHM19QSFlGTEdfVVNFX01JX0lOVEVSUlVQVAkweDAwMDAwMDA0CisjZGVmaW5lIFRHM19QSFlGTEdfUEhZX1NFUkRFUwkJMHgwMDAwMDAxMAorI2RlZmluZSBURzNfUEhZRkxHX01JSV9TRVJERVMJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVEczX1BIWUZMR19BTllfU0VSREVTCQkoVEczX1BIWUZMR19QSFlfU0VSREVTIHwJXAorCQkJCQlURzNfUEhZRkxHX01JSV9TRVJERVMpCisjZGVmaW5lIFRHM19QSFlGTEdfSVNfRkVUCQkweDAwMDAwMDQwCisjZGVmaW5lIFRHM19QSFlGTEdfMTBfMTAwX09OTFkJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEczX1BIWUZMR19FTkFCTEVfQVBECQkweDAwMDAwMTAwCisjZGVmaW5lIFRHM19QSFlGTEdfQ0FQQUNJVElWRV9DT1VQTElORwkweDAwMDAwMjAwCisjZGVmaW5lIFRHM19QSFlGTEdfTk9fRVRIX1dJUkVfU1BFRUQJMHgwMDAwMDQwMAorI2RlZmluZSBURzNfUEhZRkxHX0pJVFRFUl9CVUcJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVEczX1BIWUZMR19BREpVU1RfVFJJTQkJMHgwMDAwMTAwMAorI2RlZmluZSBURzNfUEhZRkxHX0FEQ19CVUcJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVEczX1BIWUZMR181NzA0X0EwX0JVRwkJMHgwMDAwNDAwMAorI2RlZmluZSBURzNfUEhZRkxHX0JFUl9CVUcJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVEczX1BIWUZMR19TRVJERVNfUFJFRU1QSEFTSVMJMHgwMDAxMDAwMAorI2RlZmluZSBURzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVAkweDAwMDIwMDAwCiAKIAl1MzIJCQkJbGVkX2N0cmw7CiAJdTMyCQkJCXBoeV9vdHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggMDZiNTUyZi4uNWVmYTU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtMjYyLDEzICsyNjIsMTMgQEAKIAl1MTYJCQljc3IxMzsKIAl1MTYJCQljc3IxNDsKIAl1MTYJCQljc3IxNTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYgewogCXUxNgkJCWRlZmF1bHRfbWVkaWE7CiAJdTgJCQluX2Jsb2NrczsKIAl1OAkJCXVudXNlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgZGVfZGVzYyB7CiAJX19sZTMyCQkJb3B0czE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKaW5kZXggMjllNmM2My4uMGJjNGYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAxOwkvKiBFbnRlciB0aGUgY2hlY2sgbW9kZSAqLwogCX0KIAotCS8qIEluaXRpbGl6ZSBETTkxMFggYm9hcmQgKi8KKwkvKiBJbml0aWFsaXplIERNOTEwWCBib2FyZCAqLwogCWRtZmVfaW5pdF9kbTkxMHgoZGV2KTsKIAogCS8qIEFjdGl2ZSBTeXN0ZW0gSW50ZXJmYWNlICovCkBAIC02MDYsOSArNjA2LDkgQEAKIH0KIAogCi0vKglJbml0aWxpemUgRE05MTBYIGJvYXJkCisvKglJbml0aWFsaXplIERNOTEwWCBib2FyZAogICoJUmVzZXQgRE05MTBYIGJvYXJkCi0gKglJbml0aWxpemUgVFgvUnggZGVzY3JpcHRvciBjaGFpbiBzdHJ1Y3R1cmUKKyAqCUluaXRpYWxpemUgVFgvUnggZGVzY3JpcHRvciBjaGFpbiBzdHJ1Y3R1cmUKICAqCVNlbmQgdGhlIHNldC11cCBmcmFtZQogICoJRW5hYmxlIFR4L1J4IG1hY2hpbmUKICAqLwpAQCAtNjQ5LDcgKzY0OSw3IEBACiAJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSApCiAJCWRiLT5vcF9tb2RlID0gZGItPm1lZGlhX21vZGU7IAkvKiBGb3JjZSBNb2RlICovCiAKLQkvKiBJbml0aWxpYXplIFRyYW5zbWl0L1JlY2VpdmUgZGVjcmlwdG9yIGFuZCBDUjMvNCAqLworCS8qIEluaXRpYWxpemUgVHJhbnNtaXQvUmVjZWl2ZSBkZWNyaXB0b3IgYW5kIENSMy80ICovCiAJZG1mZV9kZXNjcmlwdG9yX2luaXQoZGIsIGlvYWRkcik7CiAKIAkvKiBJbml0IENSNiB0byBwcm9ncmFtIERNOTEweCBvcGVyYXRpb24gKi8KQEAgLTEyODgsNyArMTI4OCw3IEBACiAgKglTdG9wIERNOTEwWCBib2FyZAogICoJRnJlZSBUeC9SeCBhbGxvY2F0ZWQgbWVtb3J5CiAgKglSZXNldCBETTkxMFggYm9hcmQKLSAqCVJlLWluaXRpbGl6ZSBETTkxMFggYm9hcmQKKyAqCVJlLWluaXRpYWxpemUgRE05MTBYIGJvYXJkCiAgKi8KIAogc3RhdGljIHZvaWQgZG1mZV9keW5hbWljX3Jlc2V0KHN0cnVjdCBERVZJQ0UgKmRldikKQEAgLTEzMTYsNyArMTMxNiw3IEBACiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAlkYi0+d2FpdF9yZXNldCA9IDA7CiAKLQkvKiBSZS1pbml0aWxpemUgRE05MTBYIGJvYXJkICovCisJLyogUmUtaW5pdGlhbGl6ZSBETTkxMFggYm9hcmQgKi8KIAlkbWZlX2luaXRfZG05MTB4KGRldik7CiAKIAkvKiBSZXN0YXJ0IHVwcGVyIGxheWVyIGludGVyZmFjZSAqLwpAQCAtMTQ0Nyw3ICsxNDQ3LDcgQEAKIAogLyoKICAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgRE05MTMyCi0gKglUaGlzIHNldHVwIGZyYW1lIGluaXRpbGl6ZSBETTkxMFggYWRkcmVzcyBmaWx0ZXIgbW9kZQorICoJVGhpcyBzZXR1cCBmcmFtZSBpbml0aWFsaXplIERNOTEwWCBhZGRyZXNzIGZpbHRlciBtb2RlCiAqLwogCiBzdGF0aWMgdm9pZCBkbTkxMzJfaWRfdGFibGUoc3RydWN0IERFVklDRSAqZGV2KQpAQCAtMTQ4OSw3ICsxNDg5LDcgQEAKIAogLyoKICAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgRE05MTAyL0RNOTEwMkEKLSAqCVRoaXMgc2V0dXAgZnJhbWUgaW5pdGlsaXplIERNOTEwWCBhZGRyZXNzIGZpbHRlciBtb2RlCisgKglUaGlzIHNldHVwIGZyYW1lIGluaXRpYWxpemUgRE05MTBYIGFkZHJlc3MgZmlsdGVyIG1vZGUKICAqLwogCiBzdGF0aWMgdm9pZCBzZW5kX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgREVWSUNFICpkZXYpCkBAIC0yMTQyLDcgKzIxNDIsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAotCS8qIFJlLWluaXRpbGl6ZSBETTkxMFggYm9hcmQgKi8KKwkvKiBSZS1pbml0aWFsaXplIERNOTEwWCBib2FyZCAqLwogCWRtZmVfaW5pdF9kbTkxMHgoZGV2KTsKIAogCS8qIERpc2FibGUgV09MICovCkBAIC0yMTk2LDcgKzIxOTYsNyBAQAogCiAvKglEZXNjcmlwdGlvbjoKICAqCXdoZW4gdXNlciB1c2VkIGluc21vZCB0byBhZGQgbW9kdWxlLCBzeXN0ZW0gaW52b2tlZCBpbml0X21vZHVsZSgpCi0gKgl0byBpbml0aWxpemUgYW5kIHJlZ2lzdGVyLgorICoJdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIuCiAgKi8KIAogc3RhdGljIGludCBfX2luaXQgZG1mZV9pbml0X21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwppbmRleCA2MDAyZTY1Li4zMDMxZWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwpAQCAtMTIwLDggKzEyMCw4IEBACiAJCQkgIDB4MDAsIDB4MDYgIC8qIHR0bSBiaXQgbWFwICovCiAJCQl9OwogCi0JCXRwLT5tdGFibGUgPSAoc3RydWN0IG1lZGlhdGFibGUgKikKLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZWRpYXRhYmxlKSArIHNpemVvZihzdHJ1Y3QgbWVkaWFsZWFmKSwgR0ZQX0tFUk5FTCk7CisJCXRwLT5tdGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKworCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBtZWRpYWxlYWYpLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAodHAtPm10YWJsZSA9PSBOVUxMKQogCQkJcmV0dXJuOyAvKiBIb3JyaWJsZSwgaW1wb3NzaWJsZSBmYWlsdXJlLiAqLwpAQCAtMjI3LDkgKzIyNyw5IEBACiAJCSAgICAgICAgcmV0dXJuOwogCQl9CiAKLQkJbXRhYmxlID0gKHN0cnVjdCBtZWRpYXRhYmxlICopCi0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKyBjb3VudCpzaXplb2Yoc3RydWN0IG1lZGlhbGVhZiksCi0JCQkJCUdGUF9LRVJORUwpOworCQltdGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKworCQkJCSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgbWVkaWFsZWFmKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CiAJCWlmIChtdGFibGUgPT0gTlVMTCkKIAkJCXJldHVybjsJCQkJLyogSG9ycmlibGUsIGltcG9zc2libGUgZmFpbHVyZS4gKi8KIAkJbGFzdF9tZWRpYXRhYmxlID0gdHAtPm10YWJsZSA9IG10YWJsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmggYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCmluZGV4IDBhZmEyZDQuLmU1MjU4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtNTEsMjIgKzUyLDIzIEBACiAKIAogZW51bSB0YmxfZmxhZyB7Ci0JSEFTX01JSQkJCT0gMHgwMDAxLAotCUhBU19NRURJQV9UQUJMRQkJPSAweDAwMDIsCi0JQ1NSMTJfSU5fU1JPTQkJPSAweDAwMDQsCi0JQUxXQVlTX0NIRUNLX01JSQk9IDB4MDAwOCwKLQlIQVNfQUNQSQkJPSAweDAwMTAsCi0JTUNfSEFTSF9PTkxZCQk9IDB4MDAyMCwgLyogSGFzaC1vbmx5IG11bHRpY2FzdCBmaWx0ZXIuICovCi0JSEFTX1BOSUNOV0FZCQk9IDB4MDA4MCwKLQlIQVNfTldBWQkJPSAweDAwNDAsIC8qIFVzZXMgaW50ZXJuYWwgTldheSB4Y3ZyLiAqLwotCUhBU19JTlRSX01JVElHQVRJT04JPSAweDAxMDAsCi0JSVNfQVNJWAkJCT0gMHgwMjAwLAotCUhBU184MDIzWAkJPSAweDA0MDAsCi0JQ09NRVRfTUFDX0FERFIJCT0gMHgwODAwLAotCUhBU19QQ0lfTVdJCQk9IDB4MTAwMCwKLQlIQVNfUEhZX0lSUQkJPSAweDIwMDAsCi0JSEFTX1NXQVBQRURfU0VFUFJPTQk9IDB4NDAwMCwKLQlORUVEU19GQUtFX01FRElBX1RBQkxFCT0gMHg4MDAwLAorCUhBU19NSUkJCQk9IDB4MDAwMDEsCisJSEFTX01FRElBX1RBQkxFCQk9IDB4MDAwMDIsCisJQ1NSMTJfSU5fU1JPTQkJPSAweDAwMDA0LAorCUFMV0FZU19DSEVDS19NSUkJPSAweDAwMDA4LAorCUhBU19BQ1BJCQk9IDB4MDAwMTAsCisJTUNfSEFTSF9PTkxZCQk9IDB4MDAwMjAsIC8qIEhhc2gtb25seSBtdWx0aWNhc3QgZmlsdGVyLiAqLworCUhBU19QTklDTldBWQkJPSAweDAwMDgwLAorCUhBU19OV0FZCQk9IDB4MDAwNDAsIC8qIFVzZXMgaW50ZXJuYWwgTldheSB4Y3ZyLiAqLworCUhBU19JTlRSX01JVElHQVRJT04JPSAweDAwMTAwLAorCUlTX0FTSVgJCQk9IDB4MDAyMDAsCisJSEFTXzgwMjNYCQk9IDB4MDA0MDAsCisJQ09NRVRfTUFDX0FERFIJCT0gMHgwMDgwMCwKKwlIQVNfUENJX01XSQkJPSAweDAxMDAwLAorCUhBU19QSFlfSVJRCQk9IDB4MDIwMDAsCisJSEFTX1NXQVBQRURfU0VFUFJPTQk9IDB4MDQwMDAsCisJTkVFRFNfRkFLRV9NRURJQV9UQUJMRQk9IDB4MDgwMDAsCisJQ09NRVRfUE0JCT0gMHgxMDAwMCwKIH07CiAKIApAQCAtMTIwLDYgKzEyMiwxMSBAQAogCUNTUjEzID0gMHg2OCwKIAlDU1IxNCA9IDB4NzAsCiAJQ1NSMTUgPSAweDc4LAorCUNTUjE4ID0gMHg4OCwKKwlDU1IxOSA9IDB4OGMsCisJQ1NSMjAgPSAweDkwLAorCUNTUjI3ID0gMHhBQywKKwlDU1IyOCA9IDB4QjAsCiB9OwogCiAvKiByZWdpc3RlciBvZmZzZXQgYW5kIGJpdHMgZm9yIENGREQgUENJIGNvbmZpZyByZWcgKi8KQEAgLTI4OSw2ICsyOTYsMzAgQEAKIAljc3I2X21hc2tfMTAwYnQgPSAoY3NyNl9zY3IgfCBjc3I2X3BjcyB8IGNzcjZfaGJkKSwKIH07CiAKK2VudW0gdHVsaXBfY29tZXRfY3NyMTNfYml0cyB7CisvKiBUaGUgTElOS09GRkUgYW5kIExJTktPTkUgd29yayBpbiBjb25qdW5jdGlvbiB3aXRoIExTQ0UsIGkuZS4gdGhleQorICogZGV0ZXJtaW5lIHdoaWNoIGxpbmsgc3RhdHVzIHRyYW5zaXRpb24gd2FrZXMgdXAgaWYgTFNDRSBpcworICogZW5hYmxlZCAqLworICAgICAgICBjb21ldF9jc3IxM19saW5rb2ZmZSA9ICgxIDw8IDE3KSwKKyAgICAgICAgY29tZXRfY3NyMTNfbGlua29uZSA9ICgxIDw8IDE2KSwKKyAgICAgICAgY29tZXRfY3NyMTNfd2ZyZSA9ICgxIDw8IDEwKSwKKyAgICAgICAgY29tZXRfY3NyMTNfbXByZSA9ICgxIDw8IDkpLAorICAgICAgICBjb21ldF9jc3IxM19sc2NlID0gKDEgPDwgOCksCisgICAgICAgIGNvbWV0X2NzcjEzX3dmciA9ICgxIDw8IDIpLAorICAgICAgICBjb21ldF9jc3IxM19tcHIgPSAoMSA8PCAxKSwKKyAgICAgICAgY29tZXRfY3NyMTNfbHNjID0gKDEgPDwgMCksCit9OworCitlbnVtIHR1bGlwX2NvbWV0X2NzcjE4X2JpdHMgeworICAgICAgICBjb21ldF9jc3IxOF9wbWVzX3N0aWNreSA9ICgxIDw8IDI0KSwKKyAgICAgICAgY29tZXRfY3NyMThfcG1fbW9kZSA9ICgxIDw8IDE5KSwKKyAgICAgICAgY29tZXRfY3NyMThfYXBtX21vZGUgPSAoMSA8PCAxOCksCisgICAgICAgIGNvbWV0X2NzcjE4X2QzYSA9ICgxIDw8IDcpCit9OworCitlbnVtIHR1bGlwX2NvbWV0X2NzcjIwX2JpdHMgeworICAgICAgICBjb21ldF9jc3IyMF9wbWVzID0gKDEgPDwgMTUpLAorfTsKIAogLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4KICAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKQEAgLTQxMSw2ICs0NDIsNyBAQAogCXVuc2lnbmVkIGludCBjc3I2OwkvKiBDdXJyZW50IENTUjYgY29udHJvbCBzZXR0aW5ncy4gKi8KIAl1bnNpZ25lZCBjaGFyIGVlcHJvbVtFRVBST01fU0laRV07CS8qIFNlcmlhbCBFRVBST00gY29udGVudHMuICovCiAJdm9pZCAoKmxpbmtfY2hhbmdlKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBjc3I1KTsKKyAgICAgICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyB3b2xpbmZvOyAgICAgICAgLyogV09MIHNldHRpbmdzICovCiAJdTE2IHN5bV9hZHZlcnRpc2UsIG1paV9hZHZlcnRpc2U7IC8qIE5XYXkgY2FwYWJpbGl0aWVzIGFkdmVydGlzZWQuICAqLwogCXUxNiBscGFyOwkJLyogMjExNDMgTGluayBwYXJ0bmVyIGFiaWxpdHkuICovCiAJdTE2IGFkdmVydGlzaW5nWzRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IDI1NDY0M2UuLjNhOGQ3ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yNzIsNiArMjcxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdHVsaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBwcml2YXRlX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0dWxpcF9zZXRfd29sb3B0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHdvbG9wdHMpOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCBwb2xsX3R1bGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCkBAIC0zMDksNiArMzA5LDExIEBACiAJLyogV2FrZSB0aGUgY2hpcCBmcm9tIHNsZWVwL3Nub296ZSBtb2RlLiAqLwogCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDApOwogCisJLyogRGlzYWJsZSBhbGwgV09MIGV2ZW50cyAqLworCXBjaV9lbmFibGVfd2FrZSh0cC0+cGRldiwgUENJX0QzaG90LCAwKTsKKwlwY2lfZW5hYmxlX3dha2UodHAtPnBkZXYsIFBDSV9EM2NvbGQsIDApOworCXR1bGlwX3NldF93b2xvcHRzKHRwLT5wZGV2LCAwKTsKKwogCS8qIE9uIHNvbWUgY2hpcCByZXZzIHdlIG11c3Qgc2V0IHRoZSBNSUkvU1lNIHBvcnQgYmVmb3JlIHRoZSByZXNldCE/ICovCiAJaWYgKHRwLT5taWlfY250ICB8fCAgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5oYXNfbWlpKSkKIAkJaW93cml0ZTMyKDB4MDAwNDAwMDAsIGlvYWRkciArIENTUjYpOwpAQCAtMzQ1LDggKzM1MCw4IEBACiAJCX0gZWxzZSBpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKIAkJCWlvd3JpdGUzMihhZGRyX2xvdywgIGlvYWRkciArIDB4QTQpOwogCQkJaW93cml0ZTMyKGFkZHJfaGlnaCwgaW9hZGRyICsgMHhBOCk7Ci0JCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgMHhBQyk7Ci0JCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgMHhCMCk7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMjcpOworCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjI4KTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIFRoaXMgaXMgc2V0X3J4X21vZGUoKSwgYnV0IHdpdGhvdXQgc3RhcnRpbmcgdGhlIHRyYW5zbWl0dGVyLiAqLwpAQCAtNTkxLDEwICs1OTYsMTAgQEAKIAkJCQkJcHJfY29udCgiICUwMngiLCBidWZbal0pOwogCQkJcHJfY29udCgiIGo9JWRcbiIsIGopOwogCQl9Ci0JCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTA4eDogIiwgKGludCl0cC0+cnhfcmluZyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJXA6ICIsIHRwLT5yeF9yaW5nKTsKIAkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQogCQkJcHJfY29udCgiICUwOHgiLCAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLnN0YXR1cyk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIgIFR4IHJpbmcgJTA4eDogIiwgKGludCl0cC0+dHhfcmluZyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFR4IHJpbmcgJXA6ICIsIHRwLT50eF9yaW5nKTsKIAkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQogCQkJcHJfY29udCgiICUwOHgiLCAodW5zaWduZWQgaW50KXRwLT50eF9yaW5nW2ldLnN0YXR1cyk7CiAJCXByX2NvbnQoIlxuIik7CkBAIC04NzYsOCArODgxLDM1IEBACiAJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOwogfQogCisKK3N0YXRpYyBpbnQgdHVsaXBfZXRodG9vbF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICh3b2xpbmZvLT53b2xvcHRzICYgKH50cC0+d29saW5mby5zdXBwb3J0ZWQpKQorCQkgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl0cC0+d29saW5mby53b2xvcHRzID0gd29saW5mby0+d29sb3B0czsKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJnRwLT5wZGV2LT5kZXYsIHRwLT53b2xpbmZvLndvbG9wdHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0dWxpcF9ldGh0b29sX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXdvbGluZm8tPnN1cHBvcnRlZCA9IHRwLT53b2xpbmZvLnN1cHBvcnRlZDsKKwl3b2xpbmZvLT53b2xvcHRzID0gdHAtPndvbGluZm8ud29sb3B0czsKKwlyZXR1cm47Cit9CisKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7Ci0JLmdldF9kcnZpbmZvID0gdHVsaXBfZ2V0X2RydmluZm8KKwkuZ2V0X2RydmluZm8gPSB0dWxpcF9nZXRfZHJ2aW5mbywKKwkuc2V0X3dvbCAgICAgPSB0dWxpcF9ldGh0b29sX3NldF93b2wsCisJLmdldF93b2wgICAgID0gdHVsaXBfZXRodG9vbF9nZXRfd29sLAogfTsKIAogLyogUHJvdmlkZSBpb2N0bCgpIGNhbGxzIHRvIGV4YW1pbmUgdGhlIE1JSSB4Y3ZyIHN0YXRlLiAqLwpAQCAtMTA5Myw4ICsxMTI1LDggQEAKIAkJCQlpb3dyaXRlMzIoMywgaW9hZGRyICsgQ1NSMTMpOwogCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIENTUjE0KTsKIAkJCX0gZWxzZSBpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKLQkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyAweEFDKTsKLQkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyAweEIwKTsKKwkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBDU1IyNyk7CisJCQkJaW93cml0ZTMyKG1jX2ZpbHRlclsxXSwgaW9hZGRyICsgQ1NSMjgpOwogCQkJfQogCQkJdHAtPm1jX2ZpbHRlclswXSA9IG1jX2ZpbHRlclswXTsKIAkJCXRwLT5tY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMV07CkBAIC0xMzA5LDYgKzEzNDEsMTIgQEAKICAgICAgICAgaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9MTUMpIHsKIAkJcHJfZXJyKFBGWCAic2tpcHBpbmcgTE1DIGNhcmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TQkUgJiYKKwkJICAgKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQkRFVklDRV9JRF9TQkVfVDNFMyB8fAorCQkgICAgcGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfU1VCREVWSUNFX0lEX1NCRV8yVDNFM19QMCB8fAorCQkgICAgcGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfU1VCREVWSUNFX0lEX1NCRV8yVDNFM19QMSkpIHsKKwkJcHJfZXJyKFBGWCAic2tpcHBpbmcgU0JFIFQzRTMgcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qCkBAIC0xMzgxLDYgKzE0MTksMTMgQEAKIAkJcmV0dXJuIGk7CiAJfQogCisJLyogVGhlIGNoaXAgd2lsbCBmYWlsIHRvIGVudGVyIGEgbG93LXBvd2VyIHN0YXRlIGxhdGVyIHVubGVzcworCSAqIGZpcnN0IGV4cGxpY2l0bHkgY29tbWFuZGVkIGludG8gRDAgKi8KKwlpZiAocGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApKSB7CisJCXByaW50ayAoS0VSTl9OT1RJQ0UgUEZYCisJCQkiRmFpbGVkIHRvIHNldCBwb3dlciBzdGF0ZSB0byBEMFxuIik7CisJfQorCiAJaXJxID0gcGRldi0+aXJxOwogCiAJLyogYWxsb2NfZXRoZXJkZXYgZW5zdXJlcyBhbGlnbmVkIGFuZCB6ZXJvZWQgcHJpdmF0ZSBzdHJ1Y3R1cmVzICovCkBAIC0xNDI3LDYgKzE0NzIsMTkgQEAKIAogCXRwLT5jaGlwX2lkID0gY2hpcF9pZHg7CiAJdHAtPmZsYWdzID0gdHVsaXBfdGJsW2NoaXBfaWR4XS5mbGFnczsKKworCXRwLT53b2xpbmZvLnN1cHBvcnRlZCA9IDA7CisJdHAtPndvbGluZm8ud29sb3B0cyA9IDA7CisJLyogQ09NRVQ6IEVuYWJsZSBwb3dlciBtYW5hZ2VtZW50IG9ubHkgZm9yIEFOOTgzQiAqLworCWlmIChjaGlwX2lkeCA9PSBDT01FVCApIHsKKwkJdTMyIHNpZzsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChwZGV2LCAweDgwLCAmc2lnKTsKKwkJaWYgKHNpZyA9PSAweDA5ODExMzE3KSB7CisJCQl0cC0+ZmxhZ3MgfD0gQ09NRVRfUE07CisJCQl0cC0+d29saW5mby5zdXBwb3J0ZWQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUM7CisJCQlwcmludGsoS0VSTl9JTkZPICJ0dWxpcF9pbml0X29uZTogRW5hYmxlZCBXT0wgc3VwcG9ydCBmb3IgQU45ODNCXG4iKTsKKwkJfQorCX0KIAl0cC0+cGRldiA9IHBkZXY7CiAJdHAtPmJhc2VfYWRkciA9IGlvYWRkcjsKIAl0cC0+cmV2aXNpb24gPSBwZGV2LT5yZXZpc2lvbjsKQEAgLTE3NTksMTEgKzE4MTcsNDMgQEAKIH0KIAogCisvKiBzZXQgdGhlIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHdvbG9wdHMgKi8KK3N0YXRpYyB2b2lkIHR1bGlwX3NldF93b2xvcHRzIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHdvbG9wdHMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKworCWlmICh0cC0+ZmxhZ3MgJiBDT01FVF9QTSkgeworCSAgCisJCXVuc2lnbmVkIGludCB0bXA7CisJCQkKKwkJdG1wID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTgpOworCQl0bXAgJj0gfihjb21ldF9jc3IxOF9wbWVzX3N0aWNreSB8IGNvbWV0X2NzcjE4X2FwbV9tb2RlIHwgY29tZXRfY3NyMThfZDNhKTsKKwkJdG1wIHw9IGNvbWV0X2NzcjE4X3BtX21vZGU7CisJCWlvd3JpdGUzMih0bXAsIGlvYWRkciArIENTUjE4KTsKKwkJCQorCQkvKiBTZXQgdGhlIFdha2UtdXAgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgdG8gdGhlIGdpdmVuIFdPTCBvcHRpb25zKi8KKwkJdG1wID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTMpOworCQl0bXAgJj0gfihjb21ldF9jc3IxM19saW5rb2ZmZSB8IGNvbWV0X2NzcjEzX2xpbmtvbmUgfCBjb21ldF9jc3IxM193ZnJlIHwgY29tZXRfY3NyMTNfbHNjZSB8IGNvbWV0X2NzcjEzX21wcmUpOworCQlpZiAod29sb3B0cyAmIFdBS0VfTUFHSUMpCisJCQl0bXAgfD0gY29tZXRfY3NyMTNfbXByZTsKKwkJaWYgKHdvbG9wdHMgJiBXQUtFX1BIWSkKKwkJCXRtcCB8PSBjb21ldF9jc3IxM19saW5rb2ZmZSB8IGNvbWV0X2NzcjEzX2xpbmtvbmUgfCBjb21ldF9jc3IxM19sc2NlOworCQkvKiBDbGVhciB0aGUgZXZlbnQgZmxhZ3MgKi8KKwkJdG1wIHw9IGNvbWV0X2NzcjEzX3dmciB8IGNvbWV0X2NzcjEzX21wciB8IGNvbWV0X2NzcjEzX2xzYzsKKwkJaW93cml0ZTMyKHRtcCwgaW9hZGRyICsgQ1NSMTMpOworCX0KK30KKwogI2lmZGVmIENPTkZJR19QTQogCisKIHN0YXRpYyBpbnQgdHVsaXBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKKwlwY2lfcG93ZXJfdCBwc3RhdGU7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTc3OSw3ICsxODY5LDE2IEBACiBzYXZlX3N0YXRlOgogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwlwc3RhdGUgPSBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwlpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCAmJiBwc3RhdGUgIT0gUENJX0QwKSB7CisJCWludCByYzsKKworCQl0dWxpcF9zZXRfd29sb3B0cyhwZGV2LCB0cC0+d29saW5mby53b2xvcHRzKTsKKwkJcmMgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgcHN0YXRlLCB0cC0+d29saW5mby53b2xvcHRzKTsKKwkJaWYgKHJjKQorCQkJcHJpbnRrKCJ0dWxpcDogcGNpX2VuYWJsZV93YWtlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJfQorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcHN0YXRlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc4OCw3ICsxODg3LDEwIEBACiBzdGF0aWMgaW50IHR1bGlwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOwogCWludCByZXR2YWw7CisJdW5zaWduZWQgaW50IHRtcDsKIAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4MDksNiArMTkxMSwxOCBAQAogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAorCWlmICh0cC0+ZmxhZ3MgJiBDT01FVF9QTSkgeworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCisJCS8qIENsZWFyIHRoZSBQTUVTIGZsYWcgKi8KKwkJdG1wID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMjApOworCQl0bXAgfD0gY29tZXRfY3NyMjBfcG1lczsKKwkJaW93cml0ZTMyKHRtcCwgaW9hZGRyICsgQ1NSMjApOworCisJCS8qIERpc2FibGUgYWxsIHdha2UtdXAgZXZlbnRzICovCisJCXR1bGlwX3NldF93b2xvcHRzKHBkZXYsIDApOworCX0KIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKaW5kZXggNjA4YjI3OS4uNjZkNDFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCkBAIC0xNTE0LDEyICsxNTE0LDEyIEBACiAJaWYgKGRlYnVnID4gMikgewogCQlpbnQgaTsKIAotCQlwcmludGsoS0VSTl9ERUJVRyIgIFR4IHJpbmcgYXQgJTA4eDpcbiIsIChpbnQpbnAtPnR4X3JpbmcpOworCQlwcmludGsoS0VSTl9ERUJVRyIgIFR4IHJpbmcgYXQgJXA6XG4iLCBucC0+dHhfcmluZyk7CiAJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKIAkJCXByaW50ayhLRVJOX0RFQlVHICIgIyVkIGRlc2MuICUwNHggJTA0eCAlMDh4XG4iLAogCQkJICAgICAgIGksIG5wLT50eF9yaW5nW2ldLmxlbmd0aCwKIAkJCSAgICAgICBucC0+dHhfcmluZ1tpXS5zdGF0dXMsIG5wLT50eF9yaW5nW2ldLmJ1ZmZlcjEpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiICBSeCByaW5nICUwOHg6XG4iLCAoaW50KW5wLT5yeF9yaW5nKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlcDpcbiIsIG5wLT5yeF9yaW5nKTsKIAkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlMDR4ICUwNHggJTA4eFxuIiwKIAkJCSAgICAgICBpLCBucC0+cnhfcmluZ1tpXS5sZW5ndGgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDZhZDZmZTcuLjU1ZjNhM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAl0ZmlsZS0+dHVuID0gdHVuOwogCXR1bi0+dGZpbGUgPSB0ZmlsZTsKIAl0dW4tPnNvY2tldC5maWxlID0gZmlsZTsKKwluZXRpZl9jYXJyaWVyX29uKHR1bi0+ZGV2KTsKIAlkZXZfaG9sZCh0dW4tPmRldik7CiAJc29ja19ob2xkKHR1bi0+c29ja2V0LnNrKTsKIAlhdG9taWNfaW5jKCZ0ZmlsZS0+Y291bnQpOwpAQCAtMTYyLDYgKzE2Myw3IEBACiB7CiAJLyogRGV0YWNoIGZyb20gbmV0IGRldmljZSAqLwogCW5ldGlmX3R4X2xvY2tfYmgodHVuLT5kZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKHR1bi0+ZGV2KTsKIAl0dW4tPnRmaWxlID0gTlVMTDsKIAl0dW4tPnNvY2tldC5maWxlID0gTlVMTDsKIAluZXRpZl90eF91bmxvY2tfYmgodHVuLT5kZXYpOwpAQCAtNzM2LDggKzczOCwxOCBAQAogCQkJCWdzby5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNjsKIAkJCWVsc2UgaWYgKHNpbmZvLT5nc29fdHlwZSAmIFNLQl9HU09fVURQKQogCQkJCWdzby5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19VRFA7Ci0JCQllbHNlCi0JCQkJQlVHKCk7CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInR1bjogdW5leHBlY3RlZCBHU08gdHlwZTogIgorCQkJCSAgICAgICAiMHgleCwgZ3NvX3NpemUgJWQsIGhkcl9sZW4gJWRcbiIsCisJCQkJICAgICAgIHNpbmZvLT5nc29fdHlwZSwgZ3NvLmdzb19zaXplLAorCQkJCSAgICAgICBnc28uaGRyX2xlbik7CisJCQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJ0dW46ICIsCisJCQkJCSAgICAgICBEVU1QX1BSRUZJWF9OT05FLAorCQkJCQkgICAgICAgMTYsIDEsIHNrYi0+aGVhZCwKKwkJCQkJICAgICAgIG1pbigoaW50KWdzby5oZHJfbGVuLCA2NCksIHRydWUpOworCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAkJCWlmIChzaW5mby0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUF9FQ04pCiAJCQkJZ3NvLmdzb190eXBlIHw9IFZJUlRJT19ORVRfSERSX0dTT19FQ047CiAJCX0gZWxzZQpAQCAtMTU2NCwxMiArMTU3Niw2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHUzMiB0dW5fZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gISF0dW4tPnRmaWxlOwotfQotCiBzdGF0aWMgdTMyIHR1bl9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTU5MSw3ICsxNTk3LDcgQEAKIAkuZ2V0X2RydmluZm8JPSB0dW5fZ2V0X2RydmluZm8sCiAJLmdldF9tc2dsZXZlbAk9IHR1bl9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAk9IHR1bl9zZXRfbXNnbGV2ZWwsCi0JLmdldF9saW5rCT0gdHVuX2dldF9saW5rLAorCS5nZXRfbGluawk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9yeF9jc3VtCT0gdHVuX2dldF9yeF9jc3VtLAogCS5zZXRfcnhfY3N1bQk9IHR1bl9zZXRfcnhfY3N1bQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwppbmRleCAyMmJkZTQ5Li4yZTUwMDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90eXBob29uLmMKKysrIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAlzdHJ1Y3QgcnhfZnJlZQkJCXJ4QnVmZltSWEZSRUVfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKIAl1MzIJCQkJemVyb1dvcmQ7CiAJc3RydWN0IHR4X2Rlc2MJCQl0eEhpW1RYSElfRU5UUklFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByeGJ1ZmZfZW50IHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5oIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5oCmluZGV4IDY3M2ZkNTEuLjg4MTg3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R5cGhvb24uaAorKysgYi9kcml2ZXJzL25ldC90eXBob29uLmgKQEAgLTc3LDcgKzc3LDcgQEAKIAl2b2xhdGlsZSBfX2xlMzIgY21kQ2xlYXJlZDsKIAl2b2xhdGlsZSBfX2xlMzIgcmVzcFJlYWR5OwogCXZvbGF0aWxlIF9fbGUzMiByeEhpUmVhZHk7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoZSBob3N0PC0+VHlwaG9vbiBpbnRlcmZhY2UKICAqIE91ciBtZWFucyBvZiBjb21tdW5pY2F0aW5nIHdoZXJlIHRoaW5ncyBhcmUKQEAgLTEyNSw3ICsxMjUsNyBAQAogCV9fbGUzMiByeEhpQWRkcjsKIAlfX2xlMzIgcnhIaUFkZHJIaTsKIAlfX2xlMzIgcnhIaVNpemU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoZSBUeXBob29uIHRyYW5zbWl0L2ZyYWdtZW50IGRlc2NyaXB0b3IKICAqCkBAIC0xODcsNyArMTg3LDcgQEAKICNkZWZpbmUgVFlQSE9PTl9UWF9QRl9WTEFOX01BU0sJCWNwdV90b19sZTMyKDB4MGZmZmYwMDApCiAjZGVmaW5lIFRZUEhPT05fVFhfUEZfSU5URVJOQUwJCWNwdV90b19sZTMyKDB4ZjAwMDAwMDApCiAjZGVmaW5lIFRZUEhPT05fVFhfUEZfVkxBTl9UQUdfU0hJRlQJMTIKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVGhlIFRDUCBTZWdtZW50YXRpb24gb2ZmbG9hZCBvcHRpb24gZGVzY3JpcHRvcgogICoKQEAgLTIwOCw3ICsyMDgsNyBAQAogCV9fbGUzMiByZXNwQWRkckxvOwogCV9fbGUzMiBieXRlc1R4OwogCV9fbGUzMiBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoZSBJUFNFQyBPZmZsb2FkIGRlc2NyaXB0b3IKICAqCkBAIC0yMjcsNyArMjI3LDcgQEAKIAlfX2xlMzIgc2ExOwogCV9fbGUzMiBzYTI7CiAJX19sZTMyIHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBUaGUgVHlwaG9vbiByZWNlaXZlIGRlc2NyaXB0b3IgKFVwZGF0ZWQgYnkgTklDKQogICoKQEAgLTI4NCw3ICsyODQsNyBAQAogI2RlZmluZSBUWVBIT09OX1JYX1VOS05PV05fU0EJCWNwdV90b19sZTE2KDB4MDEwMCkKICNkZWZpbmUgVFlQSE9PTl9SWF9FU1BfRk9STUFUX0VSUgljcHVfdG9fbGUxNigweDAyMDApCiAJX19iZTMyIHZsYW5UYWc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoZSBUeXBob29uIGZyZWUgYnVmZmVyIGRlc2NyaXB0b3IsIHVzZWQgdG8gZ2l2ZSBhIGJ1ZmZlciB0byB0aGUgTklDCiAgKgpAQCAtMzAxLDcgKzMwMSw3IEBACiAJX19sZTMyIHBoeXNBZGRySGk7CiAJdTMyIHZpcnRBZGRyOwogCXUzMiB2aXJ0QWRkckhpOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBUaGUgVHlwaG9vbiBjb21tYW5kIGRlc2NyaXB0b3IsIHVzZWQgZm9yIGNvbW1hbmRzIGFuZCByZXNwb25zZXMKICAqCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAlfX2xlMTYgcGFybTE7CiAJX19sZTMyIHBhcm0yOwogCV9fbGUzMiBwYXJtMzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVGhlIFR5cGhvb24gcmVzcG9uc2UgZGVzY3JpcHRvciwgc2VlIGNvbW1hbmQgZGVzY3JpcHRvciBmb3IgZGV0YWlscwogICovCkBAIC0zNTksNyArMzU5LDcgQEAKIAlfX2xlMTYgcGFybTE7CiAJX19sZTMyIHBhcm0yOwogCV9fbGUzMiBwYXJtMzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoeCwgY29tbWFuZCkJCQkJXAogCWRvIHsgc3RydWN0IGNtZF9kZXNjICpfcHRyID0gKHgpOwkJCQlcCkBAIC00MjcsNyArNDI3LDcgQEAKICNkZWZpbmUgVFlQSE9PTl9MSU5LX0hBTEZfRFVQTEVYCWNwdV90b19sZTMyKDB4MDAwMDAwMDApCiAJX19sZTMyIHVudXNlZDI7CiAJX19sZTMyIHVudXNlZDM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRZUEhPT05fQ01EX1hDVlJfU0VMRUNUIHhjdnIgdmFsdWVzIChyZXNwLnBhcm0xKQogICovCkBAIC00ODgsNyArNDg4LDcgQEAKIAl1MzIgaW5kZXg7CiAJdTMyIHVudXNlZDsKIAl1MzIgdW51c2VkMjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVFlQSE9PTl9DTURfU0VUX09GRkxPQURfVEFTS1MgYml0cyAoY21kLnBhcm0yIChUeCkgJiBjbWQucGFybTMgKFJ4KSkKICAqIFRoaXMgaXMgYWxsIGZvciBJUHY0LgpAQCAtNTE4LDE0ICs1MTgsMTQgQEAKIAlfX2xlMzIgbnVtU2VjdGlvbnM7CiAJX19sZTMyIHN0YXJ0QWRkcjsKIAlfX2xlMzIgaG1hY0RpZ2VzdFs1XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHR5cGhvb25fc2VjdGlvbl9oZWFkZXIgewogCV9fbGUzMiBsZW47CiAJdTE2IGNoZWNrc3VtOwogCXUxNiByZXNlcnZlZDsKIAlfX2xlMzIgc3RhcnRBZGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBUaGUgVHlwaG9vbiBSZWdpc3RlciBvZmZzZXRzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IDgwNzQ3MGUuLjhkNTMyZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtNTk0LDcgKzU5NCw3IEBACiB7CiAJaW50IGk7CiAKLQl1Z2V0aF9pbmZvKCJVQ0MlZCBHZXRoIHJlZ2lzdGVyczoiLCB1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKKwl1Z2V0aF9pbmZvKCJVQ0MlZCBHZXRoIHJlZ2lzdGVyczoiLCB1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtICsgMSk7CiAJdWdldGhfaW5mbygiQmFzZSBhZGRyZXNzOiAweCUwOHgiLCAodTMyKSB1Z2V0aC0+dWdfcmVncyk7CiAKIAl1Z2V0aF9pbmZvKCJtYWNjZmcxICAgIDogYWRkciAtIDB4JTA4eCwgdmFsIC0gMHglMDh4IiwKQEAgLTM3MDQsNiArMzcwNCwxOSBAQAogCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfTUlJOwogfQogCitzdGF0aWMgaW50IHVjY19nZXRoX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdWdldGgtPnBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X21paV9pb2N0bCh1Z2V0aC0+cGh5ZGV2LCBycSwgY21kKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB1Y2NfZ2V0aF9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSB1Y2NfZ2V0aF9vcGVuLAogCS5uZG9fc3RvcAkJPSB1Y2NfZ2V0aF9jbG9zZSwKQEAgLTM3MTMsNiArMzcyNiw3IEBACiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gdWNjX2dldGhfc2V0X211bHRpLAogCS5uZG9fdHhfdGltZW91dAkJPSB1Y2NfZ2V0aF90aW1lb3V0LAorCS5uZG9fZG9faW9jdGwJCT0gdWNjX2dldGhfaW9jdGwsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IHVjY19uZXRwb2xsLAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oIGIvZHJpdmVycy9uZXQvdWNjX2dldGguaAppbmRleCBlZjFmYmViLi4wNWE5NTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXUzMiBzY2FyOwkJLyogU3RhdGlzdGljcyBjYXJyeSByZWdpc3RlciAqLwogCXUzMiBzY2FtOwkJLyogU3RhdGlzdGljcyBjYXJ5eSBtYXNrIHJlZ2lzdGVyICovCiAJdTggcmVzNVsweDIwMCAtIDB4MWM0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVUNDIEdFVEggVEVNT0RSIFJlZ2lzdGVyICovCiAjZGVmaW5lIFRFTU9ERVJfVFhfUk1PTl9TVEFUSVNUSUNTX0VOQUJMRSAgICAgICAweDAxMDAJLyogZW5hYmxlIFR4IHN0YXRpc3RpY3MKQEAgLTQyMCwxMSArNDIwLDExIEBACiAKIHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV90eCB7CiAJdTggcmVzMFsxMDRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfcnggewogCXU4IHJlczBbNDBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBTZW5kIFF1ZXVlIFF1ZXVlLURlc2NyaXB0b3IgKi8KIHN0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkIHsKQEAgLTQzMiwxOSArNDMyLDE5IEBACiAJdTggcmVzMFsweDhdOwogCXUzMiBsYXN0X2JkX2NvbXBsZXRlZF9hZGRyZXNzOy8qIGluaXRpYWxpemUgdG8gbGFzdCBlbnRyeSBpbiBCRCByaW5nICovCiAJdTggcmVzMVsweDMwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfbWVtX3JlZ2lvbiB7CiAJc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfcWQgc3FxZFtOVU1fVFhfUVVFVUVTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVjY19nZXRoX3RocmVhZF90eF9wcmFtIHsKIAl1OCByZXMwWzY0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVjY19nZXRoX3RocmVhZF9yeF9wcmFtIHsKIAl1OCByZXMwWzEyOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVEhSRUFEX1JYX1BSQU1fQURESVRJT05BTF9GT1JfRVhURU5ERURfRklMVEVSSU5HICAgICAgICA2NAogI2RlZmluZSBUSFJFQURfUlhfUFJBTV9BRERJVElPTkFMX0ZPUl9FWFRFTkRFRF9GSUxURVJJTkdfOCAgICAgIDY0CkBAIC00ODQsNyArNDg0LDcgQEAKIAkJCQkgICAgICAvKio8IHdlaWdodCBmYWN0b3IgZm9yIHF1ZXVlcyAgICovCiAJdTMyIG1pbnc7CQkvKiB0ZW1wb3JhcnkgdmFyaWFibGUgaGFuZGxlZCBieSBRRSAqLwogCXU4IHJlczFbMHg3MCAtIDB4NjRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtIHsKIAl1MzIgc2ljb2x0eDsJCS8qIHNpbmdsZSBjb2xsaXNpb24gKi8KQEAgLTUwNiw3ICs1MDYsNyBAQAogCQkJCSAgIGFuZCAxNTE4IG9jdGV0cyAqLwogCXUzMiB0eHBrdHNqdW1ibzsJLyogdG90YWwgcGFja2V0cyAoaW5jbHVkaW5nIGJhZCkgYmV0d2VlbiAxMDI0CiAJCQkJICAgYW5kIE1BWExlbmd0aCBvY3RldHMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSB7CiAJdTMyIGZycnhmY3NlcjsJCS8qIGZyYW1lcyB3aXRoIGNyYyBlcnJvciAqLwpAQCAtNTQwLDcgKzU0MCw3IEBACiAJCQkJICAgcmVwbGFjZWQgKi8KIAl1MzIgaW5zZXJ0dmxhbjsJCS8qIHRvdGFsIGZyYW1lcyB0aGF0IGhhZCB0aGVpciBWTEFOIHRhZwogCQkJCSAgIGluc2VydGVkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ19lbnRyeSB7CiAJdTMyIGludGVycnVwdGNvYWxlc2NpbmdtYXh2YWx1ZTsJLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgbWF4CkBAIC01NDgsMjMgKzU0OCwyMyBAQAogCXUzMiBpbnRlcnJ1cHRjb2FsZXNjaW5nY291bnRlcjsJLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgY291bnRlciwKIAkJCQkJICAgaW5pdGlhbGl6ZSB0bwogCQkJCQkgICBpbnRlcnJ1cHRjb2FsZXNjaW5nbWF4dmFsdWUgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX3RhYmxlIHsKIAlzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfZW50cnkgY29hbGVzY2luZ2VudHJ5W05VTV9SWF9RVUVVRVNdOwogCQkJCSAgICAgICAvKio8IGludGVycnVwdCBjb2FsZXNjaW5nIGVudHJ5ICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2JkcyB7CiAJc3RydWN0IHFlX2JkIGJkW05VTV9CRFNfSU5fUFJFRkVUQ0hFRF9CRFNdOwkvKiBwcmVmZXRjaGVkIGJkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB1Y2NfZ2V0aF9yeF9iZF9xdWV1ZXNfZW50cnkgewogCXUzMiBiZGJhc2VwdHI7CQkvKiBCRCBiYXNlIHBvaW50ZXIgKi8KIAl1MzIgYmRwdHI7CQkvKiBCRCBwb2ludGVyICovCiAJdTMyIGV4dGVybmFsYmRiYXNlcHRyOwkvKiBleHRlcm5hbCBCRCBiYXNlIHBvaW50ZXIgKi8KIAl1MzIgZXh0ZXJuYWxiZHB0cjsJLyogZXh0ZXJuYWwgQkQgcG9pbnRlciAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdWNjX2dldGhfdHhfZ2xvYmFsX3ByYW0gewogCXUxNiB0ZW1vZGVyOwpAQCAtNTgwLDEzICs1ODAsMTMgQEAKIAl1MzIgdHFwdHI7CQkvKiBhIGJhc2UgcG9pbnRlciB0byB0aGUgVHggUXVldWVzIE1lbW9yeQogCQkJCSAgIFJlZ2lvbiAqLwogCXU4IHJlczJbMHg4MCAtIDB4NzRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEV4dGVuZGVkIEZpbHRlcmluZyBHbG9iYWwgUGFyYW1ldGVycyBpbiBQUkFNICovCiBzdHJ1Y3QgdWNjX2dldGhfZXhmX2dsb2JhbF9wcmFtIHsKIAl1MzIgbDJwY2RwdHI7CQkvKiBpbmRpdmlkdWFsIGFkZHJlc3MgZmlsdGVyLCBoaWdoICovCiAJdTggcmVzMFsweDEwIC0gMHgwNF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbSB7CiAJdTMyIHJlbW9kZXI7CQkvKiBldGhlcm5ldCBtb2RlIHJlZy4gKi8KQEAgLTYyMCw3ICs2MjAsNyBAQAogCXUzMiBleGZHbG9iYWxQYXJhbTsJLyogYmFzZSBhZGRyZXNzIGZvciBleHRlbmRlZCBmaWx0ZXJpbmcgZ2xvYmFsCiAJCQkJICAgcGFyYW1ldGVycyAqLwogCXU4IHJlczZbMHgxMDAgLSAweEM0XTsJLyogSW5pdGlhbGl6ZSB0byB6ZXJvICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgR1JBQ0VGVUxfU1RPUF9BQ0tOT1dMRURHRV9SWCAgICAgICAgICAgIDB4MDEKIApAQCAtNjM5LDcgKzYzOSw3IEBACiAJdTMyIHR4Z2xvYmFsOwkJLyogdHggZ2xvYmFsICovCiAJdTMyIHR4dGhyZWFkW0VORVRfSU5JVF9QQVJBTV9NQVhfRU5UUklFU19UWF07CS8qIHR4IHRocmVhZHMgKi8KIAl1OCByZXMzWzB4MV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgRU5FVF9JTklUX1BBUkFNX1JHRl9TSElGVCAgICAgICAgICAgICAgICgzMiAtIDQpCiAjZGVmaW5lIEVORVRfSU5JVF9QQVJBTV9UR0ZfU0hJRlQgICAgICAgICAgICAgICAoMzIgLSA4KQpAQCAtNjYxLDcgKzY2MSw3IEBACiAJdTE2IGg7CQkJLyogYWRkcmVzcyAoTVNCKSAqLwogCXUxNiBtOwkJCS8qIGFkZHJlc3MgKi8KIAl1MTYgbDsJCQkvKiBhZGRyZXNzIChMU0IpICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgODJ4eCBBZGRyZXNzIEZpbHRlcmluZyBQUkFNICovCiBzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtIHsKQEAgLTY3Miw3ICs2NzIsNyBAQAogCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2VuZXRfYWRkcmVzcyBfX2lvbWVtIHRhZGRyOwogCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2VuZXRfYWRkcmVzcyBfX2lvbWVtIHBhZGRyW05VTV9PRl9QQUREUlNdOwogCXU4IHJlczBbMHg0MCAtIDB4MzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBHRVRIIFR4IGZpcm13YXJlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLCB1c2VkIHdoZW4gY2FsbGluZwogICAgVUNDX0dFVEhfR2V0U3RhdGlzdGljcy4gKi8KQEAgLTY5Niw3ICs2OTYsNyBAQAogCQkJCSAgIGFuZCAxNTE4IG9jdGV0cyAqLwogCXUzMiB0eHBrdHNqdW1ibzsJLyogdG90YWwgcGFja2V0cyAoaW5jbHVkaW5nIGJhZCkgYmV0d2VlbiAxMDI0CiAJCQkJICAgYW5kIE1BWExlbmd0aCBvY3RldHMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogR0VUSCBSeCBmaXJtd2FyZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSwgdXNlZCB3aGVuIGNhbGxpbmcKICAgIFVDQ19HRVRIX0dldFN0YXRpc3RpY3MuICovCkBAIC03MzIsNyArNzMyLDcgQEAKIAkJCQkgICByZXBsYWNlZCAqLwogCXUzMiBpbnNlcnR2bGFuOwkJLyogdG90YWwgZnJhbWVzIHRoYXQgaGFkIHRoZWlyIFZMQU4gdGFnCiAJCQkJICAgaW5zZXJ0ZWQgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogR0VUSCBoYXJkd2FyZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSwgdXNlZCB3aGVuIGNhbGxpbmcKICAgIFVDQ19HRVRIX0dldFN0YXRpc3RpY3MuICovCkBAIC03ODEsNyArNzgxLDcgQEAKIAl1MzIgcmJjYTsJCS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5CiAJCQkJICAgdGhhdCBoYWQgZGVzdGluYXRpb24gYWRkcmVzcyBlcXVhbCB0byB0aGUKIAkJCQkgICBicm9hZGNhc3QgYWRkcmVzcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBVQ0MgR0VUSCBUeCBlcnJvcnMgcmV0dXJuZWQgdmlhIFR4Q29uZiBjYWxsYmFjayAqLwogI2RlZmluZSBUWF9FUlJPUlNfREVGICAgICAgMHgwMjAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvYXNpeC5jIGIvZHJpdmVycy9uZXQvdXNiL2FzaXguYwppbmRleCA5NTE2ZjM4Li5hZWE0NjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvYXNpeC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmMKQEAgLTE3OSw3ICsxNzksNyBAQAogCV9fbGUxNiByZXMyOwogCXU4IHN0YXR1czsKIAlfX2xlMTYgcmVzMzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGludCBhc2l4X3JlYWRfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKIAkJCSAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGMtcGhvbmV0LmMgYi9kcml2ZXJzL25ldC91c2IvY2RjLXBob25ldC5jCmluZGV4IGRjOTQ0NDUuLjEwOTc1MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGMtcGhvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NkYy1waG9uZXQuYwpAQCAtOTcsOCArOTcsOSBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSByZXEtPmNvbnRleHQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCB1c2Jwbl9kZXYgKnBuZCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHN0YXR1cyA9IHJlcS0+c3RhdHVzOwogCi0Jc3dpdGNoIChyZXEtPnN0YXR1cykgeworCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgogCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQlicmVhazsKQEAgLTEwOSw3ICsxMTAsNyBAQAogCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJZGVmYXVsdDoKIAkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJZGV2X2RiZygmZGV2LT5kZXYsICJUWCBlcnJvciAoJWQpXG4iLCByZXEtPnN0YXR1cyk7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiVFggZXJyb3IgKCVkKVxuIiwgc3RhdHVzKTsKIAl9CiAJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKQEAgLTE1MCw4ICsxNTEsOSBAQAogCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHJlcS0+dHJhbnNmZXJfYnVmZmVyKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1cyA9IHJlcS0+c3RhdHVzOwogCi0Jc3dpdGNoIChyZXEtPnN0YXR1cykgeworCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG5kLT5yeF9sb2NrLCBmbGFncyk7CiAJCXNrYiA9IHBuZC0+cnhfc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2hzby5jIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCmluZGV4IDRkZDIzNTEuLjZlZmNhNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYworKysgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKQEAgLTczLDcgKzczLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KIAogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkJIjEuMiIKICNkZWZpbmUgTU9EX0FVVEhPUgkJCSJPcHRpb24gV2lyZWxlc3MiCiAjZGVmaW5lIE1PRF9ERVNDUklQVElPTgkJCSJVU0IgSGlnaCBTcGVlZCBPcHRpb24gZHJpdmVyIgogI2RlZmluZSBNT0RfTElDRU5TRQkJCSJHUEwiCkBAIC0yMTEsNyArMjEwLDcgQEAKIAl1MTYgd0luZGV4OwogCXUxNiB3TGVuZ3RoOwogCXUxNiBVQVJUX3N0YXRlX2JpdG1hcDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaHNvX3Rpb2NtZ2V0IHsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CkBAIC00MDEsNyArNDAwLDcgQEAKIC8qIGRyaXZlciBpbmZvICovCiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gImhzbyI7CiBzdGF0aWMgY29uc3QgY2hhciB0dHlfZmlsZW5hbWVbXSA9ICJ0dHlIUyI7Ci1zdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9IF9fRklMRV9fICI6ICIgRFJJVkVSX1ZFUlNJT04gIiAiIE1PRF9BVVRIT1I7CitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9IF9fRklMRV9fICI6ICIgTU9EX0FVVEhPUjsKIC8qIHRoZSB1c2IgZHJpdmVyIGl0c2VsZiAocmVnaXN0ZXJlZCBpbiBoc29faW5pdCkgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBoc29fZHJpdmVyOwogLyogc2VyaWFsIHN0cnVjdHVyZXMgKi8KQEAgLTQ3OCw2ICs0NzcsNyBAQAogCXtVU0JfREVWSUNFKDB4MGFmMCwgMHg4NjAwKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYWYwLCAweDg4MDApfSwKIAl7VVNCX0RFVklDRSgweDBhZjAsIDB4ODkwMCl9LAorCXtVU0JfREVWSUNFKDB4MGFmMCwgMHg5MDAwKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYWYwLCAweGQwMzUpfSwKIAl7VVNCX0RFVklDRSgweDBhZjAsIDB4ZDA1NSl9LAogCXtVU0JfREVWSUNFKDB4MGFmMCwgMHhkMTU1KX0sCkBAIC04NDgsNyArODQ4LDYgQEAKIAlzdHJ1Y3QgaHNvX25ldCAqb2RldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKIAlzdHJuY3B5KGluZm8tPmRyaXZlciwgZHJpdmVyX25hbWUsIEVUSFRPT0xfQlVTSU5GT19MRU4pOwotCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIEVUSFRPT0xfQlVTSU5GT19MRU4pOwogCXVzYl9tYWtlX3BhdGgob2Rldi0+cGFyZW50LT51c2IsIGluZm8tPmJ1c19pbmZvLCBzaXplb2YgaW5mby0+YnVzX2luZm8pOwogfQogCkBAIC0zMzg4LDcgKzMzODcsNiBAQAogTU9EVUxFX0FVVEhPUihNT0RfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihNT0RfREVTQ1JJUFRJT04pOwogTU9EVUxFX0xJQ0VOU0UoTU9EX0xJQ0VOU0UpOwotTU9EVUxFX0lORk8oVmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04pOwogCiAvKiBjaGFuZ2UgdGhlIGRlYnVnIGxldmVsIChlZzogaW5zbW9kIGhzby5rbyBkZWJ1Zz0weDA0KSAqLwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkxldmVsIG9mIGRlYnVnIFsweDAxIHwgMHgwMiB8IDB4MDQgfCAweDA4IHwgMHgxMF0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9pcGhldGguYyBiL2RyaXZlcnMvbmV0L3VzYi9pcGhldGguYwppbmRleCAxOTdjMzUyLi4wOGU3YjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaXBoZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2lwaGV0aC5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAljYXNlIDA6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycigiJXM6IHVyYiBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJZXJyKCIlczogdXJiIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjIyLDE2ICsyMjIsMTcgQEAKIHN0YXRpYyB2b2lkIGlwaGV0aF9zbmRidWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgaXBoZXRoX2RldmljZSAqZGV2OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAogCWRldiA9IHVyYi0+Y29udGV4dDsKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmICh1cmItPnN0YXR1cyAhPSAwICYmCi0JICAgIHVyYi0+c3RhdHVzICE9IC1FTk9FTlQgJiYKLQkgICAgdXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQgJiYKLQkgICAgdXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikKLQkJZXJyKCIlczogdXJiIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCWlmIChzdGF0dXMgIT0gMCAmJgorCSAgICBzdGF0dXMgIT0gLUVOT0VOVCAmJgorCSAgICBzdGF0dXMgIT0gLUVDT05OUkVTRVQgJiYKKwkgICAgc3RhdHVzICE9IC1FU0hVVERPV04pCisJCWVycigiJXM6IHVyYiBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKIAlkZXZfa2ZyZWVfc2tiX2lycShkZXYtPnR4X3NrYik7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKaW5kZXggZDYwNzhiOC4uMmI3YjM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJX19sZTE2IHNlZ21lbnRfc2l6ZTsKIAlfX3UxNiBtYXhfbXVsdGljYXN0X2ZpbHRlcnM7CiAJX191OCByZXNlcnZlZDM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAga2F3ZXRoX2RldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL25ldDEwODAuYyBiL2RyaXZlcnMvbmV0L3VzYi9uZXQxMDgwLmMKaW5kZXggOTYxYThlZC4uYmE3MmE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL25ldDEwODAuYworKysgYi9kcml2ZXJzL25ldC91c2IvbmV0MTA4MC5jCkBAIC02NCwxMyArNjQsMTMgQEAKIAkvLyBhbGwgZWxzZSBpcyBvcHRpb25hbCwgYW5kIG11c3Qgc3RhcnQgd2l0aDoKIAkvLyBfX2xlMTYJdmVuZG9ySWQ7CS8vIGZyb20gdXNiLWlmCiAJLy8gX19sZTE2CXByb2R1Y3RJZDsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZQlQQURfQllURQkoKHVuc2lnbmVkIGNoYXIpMHhBQykKIAogc3RydWN0IG5jX3RyYWlsZXIgewogCV9fbGUxNglwYWNrZXRfaWQ7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAKIC8vIHBhY2tldHMgbWF5IHVzZSBGTEFHX0ZSQU1JTkdfTkMgYW5kIG9wdGlvbmFsIHBhZAogI2RlZmluZSBGUkFNRURfU0laRShtdHUpIChzaXplb2YgKHN0cnVjdCBuY19oZWFkZXIpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCmluZGV4IDk3NGQxN2YuLjY3MTBmMDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKQEAgLTIxLDExICsyMSwxMSBAQAogICoJCQliZWhhdmVzLiBQZWdhc3VzIElJIHN1cHBvcnQgYWRkZWQgc2luY2UgdGhpcyB2ZXJzaW9uLgogICoJCQlUT0RPOiBzdXBwcmVzc2luZyBIQ0Qgd2FybmluZ3Mgc3Bld2FnZSBvbiBkaXNjb25uZWN0LgogICoJCXYwLjQuMTMJRXRoZXJuZXQgYWRkcmVzcyBpcyBub3cgc2V0IGF0IHByb2JlKCksIG5vdCBhdCBvcGVuKCkKLSAqCQkJdGltZSBhcyB0aGlzIHNlZW1zIHRvIGJyZWFrIGRoY3BkLiAKKyAqCQkJdGltZSBhcyB0aGlzIHNlZW1zIHRvIGJyZWFrIGRoY3BkLgogICoJCXYwLjUuMAlicmFuY2ggdG8gMi41Lngga2VybmVscwogICoJCXYwLjUuMQlldGh0b29sIHN1cHBvcnQgYWRkZWQKICAqCQl2MC41LjUJcnggc29ja2V0IGJ1ZmZlcnMgYXJlIGluIGEgcG9vbCBhbmQgdGhlIHRoZWlyIGFsbG9jYXRpb24KLSAqIAkJCWlzIG91dCBvZiB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCisgKgkJCWlzIG91dCBvZiB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC01NSw5ICs1NSw5IEBACiAjZGVmaW5lCUJNU1JfTUVESUEJKEJNU1JfMTBIQUxGIHwgQk1TUl8xMEZVTEwgfCBCTVNSXzEwMEhBTEYgfCBcCiAJCQlCTVNSXzEwMEZVTEwgfCBCTVNSX0FORUdDQVBBQkxFKQogCi1zdGF0aWMgaW50IGxvb3BiYWNrID0gMDsKLXN0YXRpYyBpbnQgbWlpX21vZGUgPSAwOwotc3RhdGljIGNoYXIgKmRldmlkPU5VTEw7CitzdGF0aWMgaW50IGxvb3BiYWNrOworc3RhdGljIGludCBtaWlfbW9kZTsKK3N0YXRpYyBjaGFyICpkZXZpZDsKIAogc3RhdGljIHN0cnVjdCB1c2JfZXRoX2RldiB1c2JfZGV2X2lkW10gPSB7CiAjZGVmaW5lCVBFR0FTVVNfREVWKHBuLCB2aWQsIHBpZCwgZmxhZ3MpCVwKQEAgLTEwMiw4ICsxMDIsOCBAQAogCiAvKiB1c2UgZXRodG9vbCB0byBjaGFuZ2UgdGhlIGxldmVsIGZvciBhbnkgZ2l2ZW4gZGV2aWNlICovCiBzdGF0aWMgaW50IG1zZ19sZXZlbCA9IC0xOwotbW9kdWxlX3BhcmFtIChtc2dfbGV2ZWwsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDIChtc2dfbGV2ZWwsICJPdmVycmlkZSBkZWZhdWx0IG1lc3NhZ2UgbGV2ZWwiKTsKK21vZHVsZV9wYXJhbShtc2dfbGV2ZWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zZ19sZXZlbCwgIk92ZXJyaWRlIGRlZmF1bHQgbWVzc2FnZSBsZXZlbCIpOwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcGVnYXN1c19pZHMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBwZWdhc3VzX25ldGRldl9vcHM7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAl3YWtlX3VwKCZwZWdhc3VzLT5jdHJsX3dhaXQpOwogfQogCi1zdGF0aWMgaW50IGdldF9yZWdpc3RlcnMocGVnYXN1c190ICogcGVnYXN1cywgX191MTYgaW5keCwgX191MTYgc2l6ZSwKK3N0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVycyhwZWdhc3VzX3QgKnBlZ2FzdXMsIF9fdTE2IGluZHgsIF9fdTE2IHNpemUsCiAJCQkgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmV0OwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzZXRfcmVnaXN0ZXJzKHBlZ2FzdXNfdCAqIHBlZ2FzdXMsIF9fdTE2IGluZHgsIF9fdTE2IHNpemUsCitzdGF0aWMgaW50IHNldF9yZWdpc3RlcnMocGVnYXN1c190ICpwZWdhc3VzLCBfX3UxNiBpbmR4LCBfX3UxNiBzaXplLAogCQkJIHZvaWQgKmRhdGEpCiB7CiAJaW50IHJldDsKQEAgLTI0OCw3ICsyNDgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3JlZ2lzdGVyKHBlZ2FzdXNfdCAqIHBlZ2FzdXMsIF9fdTE2IGluZHgsIF9fdTggZGF0YSkKK3N0YXRpYyBpbnQgc2V0X3JlZ2lzdGVyKHBlZ2FzdXNfdCAqcGVnYXN1cywgX191MTYgaW5keCwgX191OCBkYXRhKQogewogCWludCByZXQ7CiAJY2hhciAqdG1wOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB1cGRhdGVfZXRoX3JlZ3NfYXN5bmMocGVnYXN1c190ICogcGVnYXN1cykKK3N0YXRpYyBpbnQgdXBkYXRlX2V0aF9yZWdzX2FzeW5jKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAlpbnQgcmV0OwogCkBAIC0zMjYsNyArMzI2LDcgQEAKIH0KIAogLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUgKi8KLXN0YXRpYyBpbnQgcmVhZF9taWlfd29yZChwZWdhc3VzX3QgKiBwZWdhc3VzLCBfX3U4IHBoeSwgX191OCBpbmR4LCBfX3UxNiAqIHJlZ2QpCitzdGF0aWMgaW50IHJlYWRfbWlpX3dvcmQocGVnYXN1c190ICpwZWdhc3VzLCBfX3U4IHBoeSwgX191OCBpbmR4LCBfX3UxNiAqcmVnZCkKIHsKIAlpbnQgaTsKIAlfX3U4IGRhdGFbNF0gPSB7IHBoeSwgMCwgMCwgaW5keCB9OwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJaW50IHJldDsKIAogCXNldF9yZWdpc3RlcihwZWdhc3VzLCBQaHlDdHJsLCAwKTsKLQlzZXRfcmVnaXN0ZXJzKHBlZ2FzdXMsIFBoeUFkZHIsIHNpemVvZiAoZGF0YSksIGRhdGEpOworCXNldF9yZWdpc3RlcnMocGVnYXN1cywgUGh5QWRkciwgc2l6ZW9mKGRhdGEpLCBkYXRhKTsKIAlzZXRfcmVnaXN0ZXIocGVnYXN1cywgUGh5Q3RybCwgKGluZHggfCBQSFlfUkVBRCkpOwogCWZvciAoaSA9IDA7IGkgPCBSRUdfVElNRU9VVDsgaSsrKSB7CiAJCXJldCA9IGdldF9yZWdpc3RlcnMocGVnYXN1cywgUGh5Q3RybCwgMSwgZGF0YSk7CkBAIC0zNjYsNyArMzY2LDcgQEAKIAlyZXR1cm4gKGludClyZXM7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVfbWlpX3dvcmQocGVnYXN1c190ICogcGVnYXN1cywgX191OCBwaHksIF9fdTggaW5keCwgX191MTYgcmVnZCkKK3N0YXRpYyBpbnQgd3JpdGVfbWlpX3dvcmQocGVnYXN1c190ICpwZWdhc3VzLCBfX3U4IHBoeSwgX191OCBpbmR4LCBfX3UxNiByZWdkKQogewogCWludCBpOwogCV9fdTggZGF0YVs0XSA9IHsgcGh5LCAwLCAwLCBpbmR4IH07CkBAIC00MDIsNyArNDAyLDcgQEAKIAl3cml0ZV9taWlfd29yZChwZWdhc3VzLCBwaHlfaWQsIGxvYywgdmFsKTsKIH0KIAotc3RhdGljIGludCByZWFkX2Vwcm9tX3dvcmQocGVnYXN1c190ICogcGVnYXN1cywgX191OCBpbmRleCwgX191MTYgKiByZXRkYXRhKQorc3RhdGljIGludCByZWFkX2Vwcm9tX3dvcmQocGVnYXN1c190ICpwZWdhc3VzLCBfX3U4IGluZGV4LCBfX3UxNiAqcmV0ZGF0YSkKIHsKIAlpbnQgaTsKIAlfX3U4IHRtcDsKQEAgLTQzMyw3ICs0MzMsNyBAQAogfQogCiAjaWZkZWYJUEVHQVNVU19XUklURV9FRVBST00KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfZXByb21fd3JpdGUocGVnYXN1c190ICogcGVnYXN1cykKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfZXByb21fd3JpdGUocGVnYXN1c190ICpwZWdhc3VzKQogewogCV9fdTggdG1wOwogCWludCByZXQ7CkBAIC00NDIsNyArNDQyLDcgQEAKIAlzZXRfcmVnaXN0ZXIocGVnYXN1cywgRXRoQ3RybDIsIHRtcCB8IEVQUk9NX1dSX0VOQUJMRSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2Vwcm9tX3dyaXRlKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9lcHJvbV93cml0ZShwZWdhc3VzX3QgKnBlZ2FzdXMpCiB7CiAJX191OCB0bXA7CiAJaW50IHJldDsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCXNldF9yZWdpc3RlcihwZWdhc3VzLCBFdGhDdHJsMiwgdG1wICYgfkVQUk9NX1dSX0VOQUJMRSk7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVfZXByb21fd29yZChwZWdhc3VzX3QgKiBwZWdhc3VzLCBfX3U4IGluZGV4LCBfX3UxNiBkYXRhKQorc3RhdGljIGludCB3cml0ZV9lcHJvbV93b3JkKHBlZ2FzdXNfdCAqcGVnYXN1cywgX191OCBpbmRleCwgX191MTYgZGF0YSkKIHsKIAlpbnQgaTsKIAlfX3U4IHRtcCwgZFs0XSA9IHsgMHgzZiwgMCwgMCwgRVBST01fV1JJVEUgfTsKQEAgLTQ4NCw3ICs0ODQsNyBAQAogfQogI2VuZGlmCQkJCS8qIFBFR0FTVVNfV1JJVEVfRUVQUk9NICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbm9kZV9pZChwZWdhc3VzX3QgKiBwZWdhc3VzLCBfX3U4ICogaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X25vZGVfaWQocGVnYXN1c190ICpwZWdhc3VzLCBfX3U4ICppZCkKIHsKIAlpbnQgaTsKIAlfX3UxNiB3MTY7CkBAIC00OTUsNyArNDk1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9ldGhlcm5ldF9hZGRyKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgdm9pZCBzZXRfZXRoZXJuZXRfYWRkcihwZWdhc3VzX3QgKnBlZ2FzdXMpCiB7CiAJX191OCBub2RlX2lkWzZdOwogCkBAIC01MDMsMTIgKzUwMywxMiBAQAogCQlnZXRfcmVnaXN0ZXJzKHBlZ2FzdXMsIDB4MTAsIHNpemVvZihub2RlX2lkKSwgbm9kZV9pZCk7CiAJfSBlbHNlIHsKIAkJZ2V0X25vZGVfaWQocGVnYXN1cywgbm9kZV9pZCk7Ci0JCXNldF9yZWdpc3RlcnMocGVnYXN1cywgRXRoSUQsIHNpemVvZiAobm9kZV9pZCksIG5vZGVfaWQpOworCQlzZXRfcmVnaXN0ZXJzKHBlZ2FzdXMsIEV0aElELCBzaXplb2Yobm9kZV9pZCksIG5vZGVfaWQpOwogCX0KLQltZW1jcHkocGVnYXN1cy0+bmV0LT5kZXZfYWRkciwgbm9kZV9pZCwgc2l6ZW9mIChub2RlX2lkKSk7CisJbWVtY3B5KHBlZ2FzdXMtPm5ldC0+ZGV2X2FkZHIsIG5vZGVfaWQsIHNpemVvZihub2RlX2lkKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlc2V0X21hYyhwZWdhc3VzX3QgKiBwZWdhc3VzKQorc3RhdGljIGlubGluZSBpbnQgcmVzZXRfbWFjKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAlfX3U4IGRhdGEgPSAweDg7CiAJaW50IGk7CkBAIC01NjMsNyArNTYzLDcgQEAKIAkJZGF0YVsxXSA9IDA7CiAJZGF0YVsyXSA9IChsb29wYmFjayAmIDEpID8gMHgwOSA6IDB4MDE7CiAKLQltZW1jcHkocGVnYXN1cy0+ZXRoX3JlZ3MsIGRhdGEsIHNpemVvZiAoZGF0YSkpOworCW1lbWNweShwZWdhc3VzLT5ldGhfcmVncywgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAlyZXQgPSBzZXRfcmVnaXN0ZXJzKHBlZ2FzdXMsIEV0aEN0cmwwLCAzLCBkYXRhKTsKIAogCWlmICh1c2JfZGV2X2lkW3BlZ2FzdXMtPmRldl9pbmRleF0udmVuZG9yID09IFZFTkRPUl9MSU5LU1lTIHx8CkBAIC01NzcsNyArNTc3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBmaWxsX3NrYl9wb29sKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgdm9pZCBmaWxsX3NrYl9wb29sKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAlpbnQgaTsKIApAQCAtNTk1LDcgKzU5NSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3NrYl9wb29sKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgdm9pZCBmcmVlX3NrYl9wb29sKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAlpbnQgaTsKIApAQCAtNjY3LDExICs2NjcsMTEgQEAKIAkJbmV0aWZfZGJnKHBlZ2FzdXMsIHJ4X2VyciwgbmV0LAogCQkJICAiUlggcGFja2V0IGVycm9yICV4XG4iLCByeF9zdGF0dXMpOwogCQlwZWdhc3VzLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJaWYgKHJ4X3N0YXR1cyAmIDB4MDYpCS8vIGxvbmcgb3IgcnVudAorCQlpZiAocnhfc3RhdHVzICYgMHgwNikJLyogbG9uZyBvciBydW50CSovCiAJCQlwZWdhc3VzLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCWlmIChyeF9zdGF0dXMgJiAweDA4KQogCQkJcGVnYXN1cy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQlpZiAocnhfc3RhdHVzICYgMHgxMCkJLy8gZXh0cmEgYml0cworCQlpZiAocnhfc3RhdHVzICYgMHgxMCkJLyogZXh0cmEgYml0cwkqLwogCQkJcGVnYXN1cy0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCWdvdG8gZ29vbjsKIAl9CkBAIC03NDgsOSArNzQ4LDggQEAKIAlpZiAocGVnYXN1cy0+ZmxhZ3MgJiBQRUdBU1VTX1JYX1VSQl9GQUlMKQogCQlpZiAocGVnYXN1cy0+cnhfc2tiKQogCQkJZ290byB0cnlfYWdhaW47Ci0JaWYgKHBlZ2FzdXMtPnJ4X3NrYiA9PSBOVUxMKSB7CisJaWYgKHBlZ2FzdXMtPnJ4X3NrYiA9PSBOVUxMKQogCQlwZWdhc3VzLT5yeF9za2IgPSBwdWxsX3NrYihwZWdhc3VzKTsKLQl9CiAJaWYgKHBlZ2FzdXMtPnJ4X3NrYiA9PSBOVUxMKSB7CiAJCW5ldGlmX3dhcm4ocGVnYXN1cywgcnhfZXJyLCBwZWdhc3VzLT5uZXQsICJsb3cgb24gbWVtb3J5XG4iKTsKIAkJdGFza2xldF9zY2hlZHVsZSgmcGVnYXN1cy0+cnhfdGwpOwpAQCAtODM1LDcgKzgzNCw3IEBACiAJfQogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+PSA2KSB7Ci0JCXU4CSogZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCQl1OCAqZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCiAJCS8qIGJ5dGUgMCA9PSB0eF9zdGF0dXMxLCByZWcgMkIgKi8KIAkJaWYgKGRbMF0gJiAoVFhfVU5ERVJSVU58RVhDRVNTSVZFX0NPTApAQCAtOTE4LDE0ICs5MTcsMTQgQEAKIAlyZXR1cm4gJigocGVnYXN1c190ICopIG5ldGRldl9wcml2KGRldikpLT5zdGF0czsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfbmV0X3RyYWZmaWMocGVnYXN1c190ICogcGVnYXN1cykKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX25ldF90cmFmZmljKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAlfX2xlMTYgdG1wID0gY3B1X3RvX2xlMTYoMCk7CiAKIAlzZXRfcmVnaXN0ZXJzKHBlZ2FzdXMsIEV0aEN0cmwwLCBzaXplb2YodG1wKSwgJnRtcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfaW50ZXJydXB0X2ludGVydmFsKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2ludGVycnVwdF9pbnRlcnZhbChwZWdhc3VzX3QgKnBlZ2FzdXMpCiB7CiAJdTE2IGRhdGE7CiAJdTggaW50ZXJ2YWw7CkBAIC05NjEsNyArOTYwLDcgQEAKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9hbGxfdXJicyhwZWdhc3VzX3QgKiBwZWdhc3VzKQorc3RhdGljIHZvaWQgZnJlZV9hbGxfdXJicyhwZWdhc3VzX3QgKnBlZ2FzdXMpCiB7CiAJdXNiX2ZyZWVfdXJiKHBlZ2FzdXMtPmludHJfdXJiKTsKIAl1c2JfZnJlZV91cmIocGVnYXN1cy0+dHhfdXJiKTsKQEAgLTk2OSw3ICs5NjgsNyBAQAogCXVzYl9mcmVlX3VyYihwZWdhc3VzLT5jdHJsX3VyYik7CiB9CiAKLXN0YXRpYyB2b2lkIHVubGlua19hbGxfdXJicyhwZWdhc3VzX3QgKiBwZWdhc3VzKQorc3RhdGljIHZvaWQgdW5saW5rX2FsbF91cmJzKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAl1c2Jfa2lsbF91cmIocGVnYXN1cy0+aW50cl91cmIpOwogCXVzYl9raWxsX3VyYihwZWdhc3VzLT50eF91cmIpOwpAQCAtOTc3LDEyICs5NzYsMTEgQEAKIAl1c2Jfa2lsbF91cmIocGVnYXN1cy0+Y3RybF91cmIpOwogfQogCi1zdGF0aWMgaW50IGFsbG9jX3VyYnMocGVnYXN1c190ICogcGVnYXN1cykKK3N0YXRpYyBpbnQgYWxsb2NfdXJicyhwZWdhc3VzX3QgKnBlZ2FzdXMpCiB7CiAJcGVnYXN1cy0+Y3RybF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcGVnYXN1cy0+Y3RybF91cmIpIHsKKwlpZiAoIXBlZ2FzdXMtPmN0cmxfdXJiKQogCQlyZXR1cm4gMDsKLQl9CiAJcGVnYXN1cy0+cnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBlZ2FzdXMtPnJ4X3VyYikgewogCQl1c2JfZnJlZV91cmIocGVnYXN1cy0+Y3RybF91cmIpOwpAQCAtMTAxOSw3ICsxMDE3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMgPSBzZXRfcmVnaXN0ZXJzKHBlZ2FzdXMsIEV0aElELCA2LCBuZXQtPmRldl9hZGRyKTsKLQkKKwogCXVzYl9maWxsX2J1bGtfdXJiKHBlZ2FzdXMtPnJ4X3VyYiwgcGVnYXN1cy0+dXNiLAogCQkJICB1c2JfcmN2YnVsa3BpcGUocGVnYXN1cy0+dXNiLCAxKSwKIAkJCSAgcGVnYXN1cy0+cnhfc2tiLT5kYXRhLCBQRUdBU1VTX01UVSArIDgsCkBAIC0xMDMzLDcgKzEwMzEsNyBAQAogCiAJdXNiX2ZpbGxfaW50X3VyYihwZWdhc3VzLT5pbnRyX3VyYiwgcGVnYXN1cy0+dXNiLAogCQkJIHVzYl9yY3ZpbnRwaXBlKHBlZ2FzdXMtPnVzYiwgMyksCi0JCQkgcGVnYXN1cy0+aW50cl9idWZmLCBzaXplb2YgKHBlZ2FzdXMtPmludHJfYnVmZiksCisJCQkgcGVnYXN1cy0+aW50cl9idWZmLCBzaXplb2YocGVnYXN1cy0+aW50cl9idWZmKSwKIAkJCSBpbnRyX2NhbGxiYWNrLCBwZWdhc3VzLCBwZWdhc3VzLT5pbnRyX2ludGVydmFsKTsKIAlpZiAoKHJlcyA9IHVzYl9zdWJtaXRfdXJiKHBlZ2FzdXMtPmludHJfdXJiLCBHRlBfS0VSTkVMKSkpIHsKIAkJaWYgKHJlcyA9PSAtRU5PREVWKQpAQCAtMTA3Niw5ICsxMDc0LDkgQEAKIAkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXBlZ2FzdXNfdCAqcGVnYXN1cyA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RybmNweShpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lLCBzaXplb2YgKGluZm8tPmRyaXZlcikgLSAxKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YgKGluZm8tPnZlcnNpb24pIC0gMSk7Ci0JdXNiX21ha2VfcGF0aChwZWdhc3VzLT51c2IsIGluZm8tPmJ1c19pbmZvLCBzaXplb2YgKGluZm8tPmJ1c19pbmZvKSk7CisJc3RybmNweShpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOworCXVzYl9tYWtlX3BhdGgocGVnYXN1cy0+dXNiLCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIC8qIGFsc28gaGFuZGxlcyB0aHJlZSBwYXR0ZXJucyBvZiBzb21lIGtpbmQgaW4gaGFyZHdhcmUgKi8KQEAgLTEwOTgsNyArMTA5Niw3IEBACiB7CiAJcGVnYXN1c190CSpwZWdhc3VzID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OAkJcmVnNzggPSAweDA0OwotCQorCiAJaWYgKHdvbC0+d29sb3B0cyAmIH5XT0xfU1VQUE9SVEVEKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTExOCw3ICsxMTE2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZWdhc3VzX3Jlc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGh0b29sX3dvbGluZm8gd29sOwotCQorCiAJbWVtc2V0KCZ3b2wsIDAsIHNpemVvZiB3b2wpOwogCSh2b2lkKSBwZWdhc3VzX3NldF93b2woZGV2LCAmd29sKTsKIH0KQEAgLTExNzgsNyArMTE3Niw3IEBACiAKIHN0YXRpYyBpbnQgcGVnYXN1c19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewotCV9fdTE2ICpkYXRhID0gKF9fdTE2ICopICYgcnEtPmlmcl9pZnJ1OworCV9fdTE2ICpkYXRhID0gKF9fdTE2ICopICZycS0+aWZyX2lmcnU7CiAJcGVnYXN1c190ICpwZWdhc3VzID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlpbnQgcmVzOwogCkBAIC0xMjIzLDcgKzEyMjEsNyBAQAogCWN0cmxfY2FsbGJhY2socGVnYXN1cy0+Y3RybF91cmIpOwogfQogCi1zdGF0aWMgX191OCBtaWlfcGh5X3Byb2JlKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgX191OCBtaWlfcGh5X3Byb2JlKHBlZ2FzdXNfdCAqcGVnYXN1cykKIHsKIAlpbnQgaTsKIAlfX3UxNiB0bXA7CkBAIC0xMjM5LDEwICsxMjM3LDEwIEBACiAJcmV0dXJuIDB4ZmY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9wZWdhc3VzX0lJKHBlZ2FzdXNfdCAqIHBlZ2FzdXMpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfcGVnYXN1c19JSShwZWdhc3VzX3QgKnBlZ2FzdXMpCiB7CiAJX191OCBkYXRhID0gMHhhNTsKLQkKKwogCXNldF9yZWdpc3RlcihwZWdhc3VzLCBSZWcxZCwgMCk7CiAJc2V0X3JlZ2lzdGVyKHBlZ2FzdXMsIFJlZzdiLCAxKTsKIAltZGVsYXkoMTAwKTsKQEAgLTEyNTQsMTYgKzEyNTIsMTUgQEAKIAlzZXRfcmVnaXN0ZXIocGVnYXN1cywgMHg4MywgZGF0YSk7CiAJZ2V0X3JlZ2lzdGVycyhwZWdhc3VzLCAweDgzLCAxLCAmZGF0YSk7CiAKLQlpZiAoZGF0YSA9PSAweGE1KSB7CisJaWYgKGRhdGEgPT0gMHhhNSkKIAkJcGVnYXN1cy0+Y2hpcCA9IDB4ODUxMzsKLQl9IGVsc2UgeworCWVsc2UKIAkJcGVnYXN1cy0+Y2hpcCA9IDA7Ci0JfQogCiAJc2V0X3JlZ2lzdGVyKHBlZ2FzdXMsIDB4ODAsIDB4YzApOwogCXNldF9yZWdpc3RlcihwZWdhc3VzLCAweDgzLCAweGZmKTsKIAlzZXRfcmVnaXN0ZXIocGVnYXN1cywgMHg4NCwgMHgwMSk7Ci0JCisKIAlpZiAocGVnYXN1cy0+ZmVhdHVyZXMgJiBIQVNfSE9NRV9QTkEgJiYgbWlpX21vZGUpCiAJCXNldF9yZWdpc3RlcihwZWdhc3VzLCBSZWc4MSwgNik7CiAJZWxzZQpAQCAtMTI3Miw3ICsxMjY5LDcgQEAKIAogCiBzdGF0aWMgaW50IHBlZ2FzdXNfY291bnQ7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBlZ2FzdXNfd29ya3F1ZXVlID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcGVnYXN1c193b3JrcXVldWU7CiAjZGVmaW5lIENBUlJJRVJfQ0hFQ0tfREVMQVkgKDIgKiBIWikKIAogc3RhdGljIHZvaWQgY2hlY2tfY2FycmllcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xMzY3LDcgKzEzNjQsNyBAQAogCXBlZ2FzdXMtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7CiAJcGVnYXN1cy0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CiAJc3Bpbl9sb2NrX2luaXQoJnBlZ2FzdXMtPnJ4X3Bvb2xfbG9jayk7Ci0JcGVnYXN1cy0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0IChtc2dfbGV2ZWwsIE5FVElGX01TR19EUlYKKwlwZWdhc3VzLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQobXNnX2xldmVsLCBORVRJRl9NU0dfRFJWCiAJCQkJfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyk7CiAKIAlwZWdhc3VzLT5mZWF0dXJlcyA9IHVzYl9kZXZfaWRbZGV2X2luZGV4XS5wcml2YXRlOwpAQCAtMTQ0MiwxMSArMTQzOSwxMSBAQAogCXBlZ2FzdXNfZGVjX3dvcmtxdWV1ZSgpOwogfQogCi1zdGF0aWMgaW50IHBlZ2FzdXNfc3VzcGVuZCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQorc3RhdGljIGludCBwZWdhc3VzX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewogCXN0cnVjdCBwZWdhc3VzICpwZWdhc3VzID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQkKLQluZXRpZl9kZXZpY2VfZGV0YWNoIChwZWdhc3VzLT5uZXQpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChwZWdhc3VzLT5uZXQpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnBlZ2FzdXMtPmNhcnJpZXJfY2hlY2spOwogCWlmIChuZXRpZl9ydW5uaW5nKHBlZ2FzdXMtPm5ldCkpIHsKIAkJdXNiX2tpbGxfdXJiKHBlZ2FzdXMtPnJ4X3VyYik7CkBAIC0xNDU1LDExICsxNDUyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGVnYXN1c19yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBwZWdhc3VzX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgcGVnYXN1cyAqcGVnYXN1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLQluZXRpZl9kZXZpY2VfYXR0YWNoIChwZWdhc3VzLT5uZXQpOworCW5ldGlmX2RldmljZV9hdHRhY2gocGVnYXN1cy0+bmV0KTsKIAlpZiAobmV0aWZfcnVubmluZyhwZWdhc3VzLT5uZXQpKSB7CiAJCXBlZ2FzdXMtPnJ4X3VyYi0+c3RhdHVzID0gMDsKIAkJcGVnYXN1cy0+cnhfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKQEAgLTE0OTgsOCArMTQ5NSw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9pZChjaGFyICppZCkKIHsKLQl1bnNpZ25lZCBpbnQgdmVuZG9yX2lkPTAsIGRldmljZV9pZD0wLCBmbGFncz0wLCBpPTA7Ci0JY2hhciAqdG9rZW4sICpuYW1lPU5VTEw7CisJdW5zaWduZWQgaW50IHZlbmRvcl9pZCA9IDAsIGRldmljZV9pZCA9IDAsIGZsYWdzID0gMCwgaSA9IDA7CisJY2hhciAqdG9rZW4sICpuYW1lID0gTlVMTDsKIAogCWlmICgodG9rZW4gPSBzdHJzZXAoJmlkLCAiOiIpKSAhPSBOVUxMKQogCQluYW1lID0gdG9rZW47CkBAIC0xNTEwLDE0ICsxNTA3LDE0IEBACiAJCWRldmljZV9pZCA9IHNpbXBsZV9zdHJ0b3VsKHRva2VuLCBOVUxMLCAxNik7CiAJZmxhZ3MgPSBzaW1wbGVfc3RydG91bChpZCwgTlVMTCwgMTYpOwogCXByX2luZm8oIiVzOiBuZXcgZGV2aWNlICVzLCB2ZW5kb3IgSUQgMHglMDR4LCBkZXZpY2UgSUQgMHglMDR4LCBmbGFnczogMHgleFxuIiwKLQkgICAgICAgIGRyaXZlcl9uYW1lLCBuYW1lLCB2ZW5kb3JfaWQsIGRldmljZV9pZCwgZmxhZ3MpOworCQlkcml2ZXJfbmFtZSwgbmFtZSwgdmVuZG9yX2lkLCBkZXZpY2VfaWQsIGZsYWdzKTsKIAogCWlmICh2ZW5kb3JfaWQgPiAweDEwMDAwIHx8IHZlbmRvcl9pZCA9PSAwKQogCQlyZXR1cm47CiAJaWYgKGRldmljZV9pZCA+IDB4MTAwMDAgfHwgZGV2aWNlX2lkID09IDApCiAJCXJldHVybjsKIAotCWZvciAoaT0wOyB1c2JfZGV2X2lkW2ldLm5hbWU7IGkrKyk7CisJZm9yIChpID0gMDsgdXNiX2Rldl9pZFtpXS5uYW1lOyBpKyspOwogCXVzYl9kZXZfaWRbaV0ubmFtZSA9IG5hbWU7CiAJdXNiX2Rldl9pZFtpXS52ZW5kb3IgPSB2ZW5kb3JfaWQ7CiAJdXNiX2Rldl9pZFtpXS5kZXZpY2UgPSBkZXZpY2VfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5oIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuaAppbmRleCAyOWY1MjExLi42NWI3OGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5oCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmgKQEAgLTY4LDcgKzY4LDcgQEAKIAlFcHJvbURhdGEgPSAweDIxLAkvKiAweDIxIGxvdywgMHgyMiBoaWdoIGJ5dGUgKi8KIAlFcHJvbUN0cmwgPSAweDIzLAogCVBoeUFkZHIgPSAweDI1LAotCVBoeURhdGEgPSAweDI2LCAJLyogMHgyNiBsb3csIDB4MjcgaGlnaCBieXRlICovCisJUGh5RGF0YSA9IDB4MjYsCQkvKiAweDI2IGxvdywgMHgyNyBoaWdoIGJ5dGUgKi8KIAlQaHlDdHJsID0gMHgyOCwKIAlVc2JTdHN0ID0gMHgyYSwKIAlFdGhUeFN0YXQwID0gMHgyYiwKQEAgLTE1NCwxNjIgKzE1NCwxNjIgQEAKIAogI2Vsc2UJLyogUEVHQVNVU19ERVYgKi8KIAotUEVHQVNVU19ERVYoICIzQ29tIFVTQiBFdGhlcm5ldCAzQzQ2MEIiLCBWRU5ET1JfM0NPTSwgMHg0NjAxLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiQVRFTiBVU0IgRXRoZXJuZXQgVUMtMTEwVCIsIFZFTkRPUl9BVEVOLCAweDIwMDcsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJVU0IgSFBOQS9FdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4MTEwYywKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSB8IEhBU19IT01FX1BOQSApCi1QRUdBU1VTX0RFViggIlVTQiBIUE5BL0V0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHg0MTA0LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBIQVNfSE9NRV9QTkEgKQotUEVHQVNVU19ERVYoICJVU0IgSFBOQS9FdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4NDAwNCwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgSEFTX0hPTUVfUE5BICkKLVBFR0FTVVNfREVWKCAiVVNCIEhQTkEvRXRoZXJuZXQiLCBWRU5ET1JfQUJPQ09NLCAweDQwMDcsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IEhBU19IT01FX1BOQSApCi1QRUdBU1VTX0RFViggIlVTQiAxMC8xMDAgRmFzdCBFdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4NDEwMiwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIlVTQiAxMC8xMDAgRmFzdCBFdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4NDAwMiwKLQkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiVVNCIDEwLzEwMCBGYXN0IEV0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHg0MDBiLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiVVNCIDEwLzEwMCBGYXN0IEV0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHg0MDBjLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiVVNCIDEwLzEwMCBGYXN0IEV0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHhhYmMxLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJVU0IgMTAvMTAwIEZhc3QgRXRoZXJuZXQiLCBWRU5ET1JfQUJPQ09NLCAweDIwMGMsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJBY2N0b24gVVNCIDEwLzEwMCBFdGhlcm5ldCBBZGFwdGVyIiwgVkVORE9SX0FDQ1RPTiwgMHgxMDQ2LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJTcGVlZFN0cmVhbSBVU0IgMTAvMTAwIEV0aGVybmV0IiwgVkVORE9SX0FDQ1RPTiwgMHg1MDQ2LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiUGhpbGlwcyBVU0IgMTAvMTAwIEV0aGVybmV0IiwgVkVORE9SX0FDQ1RPTiwgMHhiMDA0LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiQURNdGVrIEFETTg1MTEgXCJQZWdhc3VzIElJXCIgVVNCIEV0aGVybmV0IiwKK1BFR0FTVVNfREVWKCIzQ29tIFVTQiBFdGhlcm5ldCAzQzQ2MEIiLCBWRU5ET1JfM0NPTSwgMHg0NjAxLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIkFURU4gVVNCIEV0aGVybmV0IFVDLTExMFQiLCBWRU5ET1JfQVRFTiwgMHgyMDA3LAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIlVTQiBIUE5BL0V0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHgxMTBjLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJIHwgSEFTX0hPTUVfUE5BKQorUEVHQVNVU19ERVYoIlVTQiBIUE5BL0V0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHg0MTA0LAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBIQVNfSE9NRV9QTkEpCitQRUdBU1VTX0RFVigiVVNCIEhQTkEvRXRoZXJuZXQiLCBWRU5ET1JfQUJPQ09NLCAweDQwMDQsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IEhBU19IT01FX1BOQSkKK1BFR0FTVVNfREVWKCJVU0IgSFBOQS9FdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4NDAwNywKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgSEFTX0hPTUVfUE5BKQorUEVHQVNVU19ERVYoIlVTQiAxMC8xMDAgRmFzdCBFdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4NDEwMiwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJVU0IgMTAvMTAwIEZhc3QgRXRoZXJuZXQiLCBWRU5ET1JfQUJPQ09NLCAweDQwMDIsCisJCURFRkFVTFRfR1BJT19SRVNFVCkKK1BFR0FTVVNfREVWKCJVU0IgMTAvMTAwIEZhc3QgRXRoZXJuZXQiLCBWRU5ET1JfQUJPQ09NLCAweDQwMGIsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiVVNCIDEwLzEwMCBGYXN0IEV0aGVybmV0IiwgVkVORE9SX0FCT0NPTSwgMHg0MDBjLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIlVTQiAxMC8xMDAgRmFzdCBFdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4YWJjMSwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIlVTQiAxMC8xMDAgRmFzdCBFdGhlcm5ldCIsIFZFTkRPUl9BQk9DT00sIDB4MjAwYywKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJBY2N0b24gVVNCIDEwLzEwMCBFdGhlcm5ldCBBZGFwdGVyIiwgVkVORE9SX0FDQ1RPTiwgMHgxMDQ2LAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiU3BlZWRTdHJlYW0gVVNCIDEwLzEwMCBFdGhlcm5ldCIsIFZFTkRPUl9BQ0NUT04sIDB4NTA0NiwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJQaGlsaXBzIFVTQiAxMC8xMDAgRXRoZXJuZXQiLCBWRU5ET1JfQUNDVE9OLCAweGIwMDQsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiQURNdGVrIEFETTg1MTEgXCJQZWdhc3VzIElJXCIgVVNCIEV0aGVybmV0IiwKIAkJVkVORE9SX0FETVRFSywgMHg4NTExLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJIHwgSEFTX0hPTUVfUE5BICkKLVBFR0FTVVNfREVWKCAiQURNdGVrIEFETTg1MTMgXCJQZWdhc3VzIElJXCIgVVNCIEV0aGVybmV0IiwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSB8IEhBU19IT01FX1BOQSkKK1BFR0FTVVNfREVWKCJBRE10ZWsgQURNODUxMyBcIlBlZ2FzdXMgSUlcIiBVU0IgRXRoZXJuZXQiLAogCQlWRU5ET1JfQURNVEVLLCAweDg1MTMsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJBRE10ZWsgQURNODUxNSBcIlBlZ2FzdXMgSUlcIiBVU0ItMi4wIEV0aGVybmV0IiwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJBRE10ZWsgQURNODUxNSBcIlBlZ2FzdXMgSUlcIiBVU0ItMi4wIEV0aGVybmV0IiwKIAkJVkVORE9SX0FETVRFSywgMHg4NTE1LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiQURNdGVrIEFOOTg2IFwiUGVnYXN1c1wiIFVTQiBFdGhlcm5ldCAoZXZhbHVhdGlvbiBib2FyZCkiLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIkFETXRlayBBTjk4NiBcIlBlZ2FzdXNcIiBVU0IgRXRoZXJuZXQgKGV2YWx1YXRpb24gYm9hcmQpIiwKIAkJVkVORE9SX0FETVRFSywgMHgwOTg2LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBIQVNfSE9NRV9QTkEgKQotUEVHQVNVU19ERVYoICJBTjk4NkEgVVNCIE1BQyIsIFZFTkRPUl9BRE1URUssIDE5ODYsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJBRUkgVVNCIEZhc3QgRXRoZXJuZXQgQWRhcHRlciIsIFZFTkRPUl9BRUlMQUIsIDB4MTcwMSwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIkFsbGllZCBUZWxlc3luIEludC4gQVQtVVNCMTAwIiwgVkVORE9SX0FMTElFRFRFTCwgMHhiMTAwLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgSEFTX0hPTUVfUE5BKQorUEVHQVNVU19ERVYoIkFOOTg2QSBVU0IgTUFDIiwgVkVORE9SX0FETVRFSywgMTk4NiwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJBRUkgVVNCIEZhc3QgRXRoZXJuZXQgQWRhcHRlciIsIFZFTkRPUl9BRUlMQUIsIDB4MTcwMSwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJBbGxpZWQgVGVsZXN5biBJbnQuIEFULVVTQjEwMCIsIFZFTkRPUl9BTExJRURURUwsIDB4YjEwMCwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKIC8qCiAgKiBEaXN0aW5ndWlzaCBiZXR3ZWVuIHRoaXMgQmVsa2luIGFkYXB0b3IgYW5kIHRoZSBCZWxraW4gYmx1ZXRvb3RoIGFkYXB0b3JzCiAgKiB3aXRoIHRoZSBzYW1lIHByb2R1Y3QgSURzIGJ5IGNoZWNraW5nIHRoZSBkZXZpY2UgY2xhc3MgdG9vLgogICovCi1QRUdBU1VTX0RFVl9DTEFTUyggIkJlbGtpbiBGNUQ1MDUwIFVTQiBFdGhlcm5ldCIsIFZFTkRPUl9CRUxLSU4sIDB4MDEyMSwgMHgwMCwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIkJlbGtpbiBGNVUxMjIgMTAvMTAwIFVTQiBFdGhlcm5ldCIsIFZFTkRPUl9CRUxLSU4sIDB4MDEyMiwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIkJpbGxpb250b24gVVNCLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDA5ODYsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIkJpbGxpb250b24gVVNCTFAtMTAwIiwgVkVORE9SX0JJTExJT05UT04sIDB4MDk4NywKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgSEFTX0hPTUVfUE5BICkKLVBFR0FTVVNfREVWKCAiaVBBUSBOZXR3b3JraW5nIDEwLzEwMCBVU0IiLCBWRU5ET1JfQ09NUEFRLCAweDg1MTEsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJCaWxsaW9udG9uIFVTQkVMLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDA5ODgsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIkJpbGxpb250b24gVVNCRS0xMDAiLCBWRU5ET1JfQklMTElPTlRPTiwgMHg4NTExLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiQ29yZWdhIEZFdGhlciBVU0ItVFgiLCBWRU5ET1JfQ09SRUdBLCAweDAwMDQsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIkNvcmVnYSBGRXRoZXIgVVNCLVRYUyIsIFZFTkRPUl9DT1JFR0EsIDB4MDAwZCwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIkQtTGluayBEU0ItNjUwVFgiLCBWRU5ET1JfRExJTkssIDB4NDAwMSwKLQkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiRC1MaW5rIERTQi02NTBUWCIsIFZFTkRPUl9ETElOSywgMHg0MDAyLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJELUxpbmsgRFNCLTY1MFRYIiwgVkVORE9SX0RMSU5LLCAweDQxMDIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJELUxpbmsgRFNCLTY1MFRYIiwgVkVORE9SX0RMSU5LLCAweDQwMGIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJELUxpbmsgRFNCLTY1MFRYIiwgVkVORE9SX0RMSU5LLCAweDIwMGMsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJELUxpbmsgRFNCLTY1MFRYKFBOQSkiLCBWRU5ET1JfRExJTkssIDB4NDAwMywKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgSEFTX0hPTUVfUE5BICkKLVBFR0FTVVNfREVWKCAiRC1MaW5rIERTQi02NTAiLCBWRU5ET1JfRExJTkssIDB4YWJjMSwKLQkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiR09MRFBGRUlMIFVTQiBBZGFwdGVyIiwgVkVORE9SX0VMQ09OLCAweDAwMDIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgfCBIQVNfSE9NRV9QTkEgKQotUEVHQVNVU19ERVYoICJFTEVDT00gVVNCIEV0aGVybmV0IExELVVTQjIwIiwgVkVORE9SX0VMRUNPTSwgIDB4NDAxMCwKLQkJREVGQVVMVF9HUElPX1JFU0VUICB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJFYXNpRG9jayBFdGhlcm5ldCIsIFZFTkRPUl9NT0JJTElUWSwgMHgwMzA0LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJFbHNhIE1pY29saW5rIFVTQjJFdGhlcm5ldCIsIFZFTkRPUl9FTFNBLCAweDMwMDAsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIkdJR0FCWVRFIEdOLUJSNDAyVyBXaXJlbGVzcyBSb3V0ZXIiLCBWRU5ET1JfR0lHQUJZVEUsIDB4ODAwMiwKLQkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiSGF3a2luZyBVRjEwMCAxMC8xMDAgRXRoZXJuZXQiLCBWRU5ET1JfSEFXS0lORywgMHg0MDBjLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiSFAgaG4yMTBjIEV0aGVybmV0IFVTQiIsIFZFTkRPUl9IUCwgMHg4MTFjLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiSU8gREFUQSBVU0IgRVQvVFgiLCBWRU5ET1JfSU9EQVRBLCAweDA5MDQsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIklPIERBVEEgVVNCIEVUL1RYLVMiLCBWRU5ET1JfSU9EQVRBLCAweDA5MTMsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJJTyBEQVRBIFVTQiBFVFgtVVMyIiwgVkVORE9SX0lPREFUQSwgMHgwOTNhLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiS2luZ3N0b24gS05VMTAxVFggRXRoZXJuZXQiLCBWRU5ET1JfS0lOR1NUT04sIDB4MDAwYSwKK1BFR0FTVVNfREVWX0NMQVNTKCJCZWxraW4gRjVENTA1MCBVU0IgRXRoZXJuZXQiLCBWRU5ET1JfQkVMS0lOLCAweDAxMjEsIDB4MDAsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiQmVsa2luIEY1VTEyMiAxMC8xMDAgVVNCIEV0aGVybmV0IiwgVkVORE9SX0JFTEtJTiwgMHgwMTIyLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIkJpbGxpb250b24gVVNCLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDA5ODYsCiAJCURFRkFVTFRfR1BJT19SRVNFVCkKLVBFR0FTVVNfREVWKCAiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMDIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIkxBTkVFRCBVU0IgRXRoZXJuZXQgTEQtVVNCTC9UWCIsIFZFTkRPUl9MQU5FRUQsIDB4NDAwNSwKK1BFR0FTVVNfREVWKCJCaWxsaW9udG9uIFVTQkxQLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDA5ODcsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IEhBU19IT01FX1BOQSkKK1BFR0FTVVNfREVWKCJpUEFRIE5ldHdvcmtpbmcgMTAvMTAwIFVTQiIsIFZFTkRPUl9DT01QQVEsIDB4ODUxMSwKIAkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKLVBFR0FTVVNfREVWKCAiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMGIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJMQU5FRUQgVVNCIEV0aGVybmV0IExELVVTQi9UIiwgVkVORE9SX0xBTkVFRCwgMHhhYmMxLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJMQU5FRUQgVVNCIEV0aGVybmV0IExELVVTQi9UWCIsIFZFTkRPUl9MQU5FRUQsIDB4MjAwYywKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIkxpbmtzeXMgVVNCMTBUWCIsIFZFTkRPUl9MSU5LU1lTLCAweDIyMDIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIkxpbmtzeXMgVVNCMTAwVFgiLCBWRU5ET1JfTElOS1NZUywgMHgyMjAzLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJMaW5rc3lzIFVTQjEwMFRYIiwgVkVORE9SX0xJTktTWVMsIDB4MjIwNCwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgSEFTX0hPTUVfUE5BICkKLVBFR0FTVVNfREVWKCAiTGlua3N5cyBVU0IxMFQgRXRoZXJuZXQgQWRhcHRlciIsIFZFTkRPUl9MSU5LU1lTLCAweDIyMDYsCitQRUdBU1VTX0RFVigiQmlsbGlvbnRvbiBVU0JFTC0xMDAiLCBWRU5ET1JfQklMTElPTlRPTiwgMHgwOTg4LAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiQmlsbGlvbnRvbiBVU0JFLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDg1MTEsCiAJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCi1QRUdBU1VTX0RFViggIkxpbmtzeXMgVVNCVlBOMSIsIFZFTkRPUl9MSU5LU1lTMiwgMHgwOGI0LAotCQlERUZBVUxUX0dQSU9fUkVTRVQgKQotUEVHQVNVU19ERVYoICJMaW5rc3lzIFVTQiBVU0IxMDBUWCIsIFZFTkRPUl9MSU5LU1lTLCAweDQwMGIsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJMaW5rc3lzIFVTQjEwVFgiLCBWRU5ET1JfTElOS1NZUywgMHgyMDBjLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiTUVMQ08vQlVGRkFMTyBMVUEtVFgiLCBWRU5ET1JfTUVMQ08sIDB4MDAwMSwKLQkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiTUVMQ08vQlVGRkFMTyBMVUEtVFgiLCBWRU5ET1JfTUVMQ08sIDB4MDAwNSwKLQkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiTUVMQ08vQlVGRkFMTyBMVUEyLVRYIiwgVkVORE9SX01FTENPLCAweDAwMDksCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJNaWNyb3NvZnQgTU4tMTEwIiwgVkVORE9SX01JQ1JPU09GVCwgMHgwMDdhLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiTkVUR0VBUiBGQTEwMSIsIFZFTkRPUl9ORVRHRUFSLCAweDEwMjAsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJPQ1QgSW5jLiIsIFZFTkRPUl9PQ1QsIDB4MDEwOSwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIk9DVCBVU0IgVE8gRXRoZXJuZXQiLCBWRU5ET1JfT0NULCAweDA5MDEsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJzbWFydE5JQyAyIFBuUCBBZGFwdGVyIiwgVkVORE9SX1NNQVJUQlJJREdFUywgMHgwMDAzLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiU01DIDIwMiBVU0IgRXRoZXJuZXQiLCBWRU5ET1JfU01DLCAweDAyMDAsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIlNNQyAyMjA2IFVTQiBFdGhlcm5ldCIsIFZFTkRPUl9TTUMsIDB4MDIwMSwKK1BFR0FTVVNfREVWKCJDb3JlZ2EgRkV0aGVyIFVTQi1UWCIsIFZFTkRPUl9DT1JFR0EsIDB4MDAwNCwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIkNvcmVnYSBGRXRoZXIgVVNCLVRYUyIsIFZFTkRPUl9DT1JFR0EsIDB4MDAwZCwKIAkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKLVBFR0FTVVNfREVWKCAiU09IT3dhcmUgTlVCMTAwIEV0aGVybmV0IiwgVkVORE9SX1NPSE9XQVJFLCAweDkxMDAsCi0JCURFRkFVTFRfR1BJT19SRVNFVCApCi1QRUdBU1VTX0RFViggIlNPSE93YXJlIE5VQjExMCBFdGhlcm5ldCIsIFZFTkRPUl9TT0hPV0FSRSwgMHg5MTEwLAotCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJICkKLVBFR0FTVVNfREVWKCAiU3BlZWRTdHJlYW0gVVNCIDEwLzEwMCBFdGhlcm5ldCIsIFZFTkRPUl9TSUVNRU5TLCAweDEwMDEsCi0JCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQorUEVHQVNVU19ERVYoIkQtTGluayBEU0ItNjUwVFgiLCBWRU5ET1JfRExJTkssIDB4NDAwMSwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIkQtTGluayBEU0ItNjUwVFgiLCBWRU5ET1JfRExJTkssIDB4NDAwMiwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIkQtTGluayBEU0ItNjUwVFgiLCBWRU5ET1JfRExJTkssIDB4NDEwMiwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJELUxpbmsgRFNCLTY1MFRYIiwgVkVORE9SX0RMSU5LLCAweDQwMGIsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiRC1MaW5rIERTQi02NTBUWCIsIFZFTkRPUl9ETElOSywgMHgyMDBjLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIkQtTGluayBEU0ItNjUwVFgoUE5BKSIsIFZFTkRPUl9ETElOSywgMHg0MDAzLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBIQVNfSE9NRV9QTkEpCitQRUdBU1VTX0RFVigiRC1MaW5rIERTQi02NTAiLCBWRU5ET1JfRExJTkssIDB4YWJjMSwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIkdPTERQRkVJTCBVU0IgQWRhcHRlciIsIFZFTkRPUl9FTENPTiwgMHgwMDAyLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJIHwgSEFTX0hPTUVfUE5BKQorUEVHQVNVU19ERVYoIkVMRUNPTSBVU0IgRXRoZXJuZXQgTEQtVVNCMjAiLCBWRU5ET1JfRUxFQ09NLCAgMHg0MDEwLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJFYXNpRG9jayBFdGhlcm5ldCIsIFZFTkRPUl9NT0JJTElUWSwgMHgwMzA0LAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiRWxzYSBNaWNvbGluayBVU0IyRXRoZXJuZXQiLCBWRU5ET1JfRUxTQSwgMHgzMDAwLAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiR0lHQUJZVEUgR04tQlI0MDJXIFdpcmVsZXNzIFJvdXRlciIsIFZFTkRPUl9HSUdBQllURSwgMHg4MDAyLAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiSGF3a2luZyBVRjEwMCAxMC8xMDAgRXRoZXJuZXQiLCBWRU5ET1JfSEFXS0lORywgMHg0MDBjLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIkhQIGhuMjEwYyBFdGhlcm5ldCBVU0IiLCBWRU5ET1JfSFAsIDB4ODExYywKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJJTyBEQVRBIFVTQiBFVC9UWCIsIFZFTkRPUl9JT0RBVEEsIDB4MDkwNCwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIklPIERBVEEgVVNCIEVUL1RYLVMiLCBWRU5ET1JfSU9EQVRBLCAweDA5MTMsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiSU8gREFUQSBVU0IgRVRYLVVTMiIsIFZFTkRPUl9JT0RBVEEsIDB4MDkzYSwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJLaW5nc3RvbiBLTlUxMDFUWCBFdGhlcm5ldCIsIFZFTkRPUl9LSU5HU1RPTiwgMHgwMDBhLAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMDIsCisJCURFRkFVTFRfR1BJT19SRVNFVCkKK1BFR0FTVVNfREVWKCJMQU5FRUQgVVNCIEV0aGVybmV0IExELVVTQkwvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMDUsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMGIsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVCIsIFZFTkRPUl9MQU5FRUQsIDB4YWJjMSwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIkxBTkVFRCBVU0IgRXRoZXJuZXQgTEQtVVNCL1RYIiwgVkVORE9SX0xBTkVFRCwgMHgyMDBjLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIkxpbmtzeXMgVVNCMTBUWCIsIFZFTkRPUl9MSU5LU1lTLCAweDIyMDIsCisJCURFRkFVTFRfR1BJT19SRVNFVCkKK1BFR0FTVVNfREVWKCJMaW5rc3lzIFVTQjEwMFRYIiwgVkVORE9SX0xJTktTWVMsIDB4MjIwMywKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIkxpbmtzeXMgVVNCMTAwVFgiLCBWRU5ET1JfTElOS1NZUywgMHgyMjA0LAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBIQVNfSE9NRV9QTkEpCitQRUdBU1VTX0RFVigiTGlua3N5cyBVU0IxMFQgRXRoZXJuZXQgQWRhcHRlciIsIFZFTkRPUl9MSU5LU1lTLCAweDIyMDYsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiTGlua3N5cyBVU0JWUE4xIiwgVkVORE9SX0xJTktTWVMyLCAweDA4YjQsCisJCURFRkFVTFRfR1BJT19SRVNFVCkKK1BFR0FTVVNfREVWKCJMaW5rc3lzIFVTQiBVU0IxMDBUWCIsIFZFTkRPUl9MSU5LU1lTLCAweDQwMGIsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiTGlua3N5cyBVU0IxMFRYIiwgVkVORE9SX0xJTktTWVMsIDB4MjAwYywKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJNRUxDTy9CVUZGQUxPIExVQS1UWCIsIFZFTkRPUl9NRUxDTywgMHgwMDAxLAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiTUVMQ08vQlVGRkFMTyBMVUEtVFgiLCBWRU5ET1JfTUVMQ08sIDB4MDAwNSwKKwkJREVGQVVMVF9HUElPX1JFU0VUKQorUEVHQVNVU19ERVYoIk1FTENPL0JVRkZBTE8gTFVBMi1UWCIsIFZFTkRPUl9NRUxDTywgMHgwMDA5LAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIk1pY3Jvc29mdCBNTi0xMTAiLCBWRU5ET1JfTUlDUk9TT0ZULCAweDAwN2EsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiTkVUR0VBUiBGQTEwMSIsIFZFTkRPUl9ORVRHRUFSLCAweDEwMjAsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiT0NUIEluYy4iLCBWRU5ET1JfT0NULCAweDAxMDksCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiT0NUIFVTQiBUTyBFdGhlcm5ldCIsIFZFTkRPUl9PQ1QsIDB4MDkwMSwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKK1BFR0FTVVNfREVWKCJzbWFydE5JQyAyIFBuUCBBZGFwdGVyIiwgVkVORE9SX1NNQVJUQlJJREdFUywgMHgwMDAzLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIlNNQyAyMDIgVVNCIEV0aGVybmV0IiwgVkVORE9SX1NNQywgMHgwMjAwLAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiU01DIDIyMDYgVVNCIEV0aGVybmV0IiwgVkVORE9SX1NNQywgMHgwMjAxLAorCQlERUZBVUxUX0dQSU9fUkVTRVQgfCBQRUdBU1VTX0lJKQorUEVHQVNVU19ERVYoIlNPSE93YXJlIE5VQjEwMCBFdGhlcm5ldCIsIFZFTkRPUl9TT0hPV0FSRSwgMHg5MTAwLAorCQlERUZBVUxUX0dQSU9fUkVTRVQpCitQRUdBU1VTX0RFVigiU09IT3dhcmUgTlVCMTEwIEV0aGVybmV0IiwgVkVORE9SX1NPSE9XQVJFLCAweDkxMTAsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCitQRUdBU1VTX0RFVigiU3BlZWRTdHJlYW0gVVNCIDEwLzEwMCBFdGhlcm5ldCIsIFZFTkRPUl9TSUVNRU5TLCAweDEwMDEsCisJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkpCiAKIAogI2VuZGlmCS8qIFBFR0FTVVNfREVWICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc2llcnJhX25ldC5jIGIvZHJpdmVycy9uZXQvdXNiL3NpZXJyYV9uZXQuYwppbmRleCBmMTk0MmQ2Li5lZTg1YzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2Ivc2llcnJhX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zaWVycmFfbmV0LmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCXU4IGd3X2FkZHJfbGVuOyAvKiBOVy1zdXBwbGllZCBHVyBhZGRyZXNzIGxlbiAqLwogCXU4IGd3X2FkZHJbMTZdOyAvKiBOVy1zdXBwbGllZCBHVyBhZGRyZXNzIChiaWdlbmRpYW4pICovCiAJdTggcmVzZXJ2ZWRbOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgU0lFUlJBX05FVF9MU0lfQ09NTU9OX0xFTiAgICAgIDQKICNkZWZpbmUgU0lFUlJBX05FVF9MU0lfVU1UU19MRU4gICAgICAgIChzaXplb2Yoc3RydWN0IGxzaV91bXRzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYyBiL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYwppbmRleCA4MWM3NmFkLi4zYjAzNzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3VzYm5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjIyLUF1Zy0yMDA1IgogCkBAIC0xNTgsMTYgKzE1OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfZ2V0X2VuZHBvaW50cyk7CiAKLXN0YXRpYyB1OCBuaWJibGUodW5zaWduZWQgY2hhciBjKQotewotCWlmIChsaWtlbHkoaXNkaWdpdChjKSkpCi0JCXJldHVybiBjIC0gJzAnOwotCWMgPSB0b3VwcGVyKGMpOwotCWlmIChsaWtlbHkoaXN4ZGlnaXQoYykpKQotCQlyZXR1cm4gMTAgKyBjIC0gJ0EnOwotCXJldHVybiAwOwotfQotCiBpbnQgdXNibmV0X2dldF9ldGhlcm5ldF9hZGRyKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGlNQUNBZGRyZXNzKQogewogCWludCAJCXRtcCwgaTsKQEAgLTE4Myw3ICsxNzQsNyBAQAogCX0KIAlmb3IgKGkgPSB0bXAgPSAwOyBpIDwgNjsgaSsrLCB0bXAgKz0gMikKIAkJZGV2LT5uZXQtPmRldl9hZGRyIFtpXSA9Ci0JCQkobmliYmxlKGJ1ZiBbdG1wXSkgPDwgNCkgKyBuaWJibGUoYnVmIFt0bXAgKyAxXSk7CisJCQkoaGV4X3RvX2JpbihidWZbdG1wXSkgPDwgNCkgKyBoZXhfdG9fYmluKGJ1Zlt0bXAgKyAxXSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfZ2V0X2V0aGVybmV0X2FkZHIpOwpAQCAtNjI0LDcgKzYxNSw3IEBACiAJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJmRldi0+cnhxKQogCQkmJiAhc2tiX3F1ZXVlX2VtcHR5KCZkZXYtPnR4cSkKIAkJJiYgIXNrYl9xdWV1ZV9lbXB0eSgmZGV2LT5kb25lKSkgewotCQkJc2NoZWR1bGVfdGltZW91dChVTkxJTktfVElNRU9VVF9NUyk7CisJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoVU5MSU5LX1RJTUVPVVRfTVMpKTsKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCW5ldGlmX2RiZyhkZXYsIGlmZG93biwgZGV2LT5uZXQsCiAJCQkJICAid2FpdGVkIGZvciAlZCB1cmIgY29tcGxldGlvbnNcbiIsIHRlbXApOwpAQCAtNjQzLDcgKzYzNCw3IEBACiAJbmV0aWZfc3RvcF9xdWV1ZSAobmV0KTsKIAogCW5ldGlmX2luZm8oZGV2LCBpZmRvd24sIGRldi0+bmV0LAotCQkgICAic3RvcCBzdGF0czogcngvdHggJWxkLyVsZCwgZXJycyAlbGQvJWxkXG4iLAorCQkgICAic3RvcCBzdGF0czogcngvdHggJWx1LyVsdSwgZXJycyAlbHUvJWx1XG4iLAogCQkgICBuZXQtPnN0YXRzLnJ4X3BhY2tldHMsIG5ldC0+c3RhdHMudHhfcGFja2V0cywKIAkJICAgbmV0LT5zdGF0cy5yeF9lcnJvcnMsIG5ldC0+c3RhdHMudHhfZXJyb3JzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmggYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaAppbmRleCBjMzgxOTExLi5mN2IzM2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaAorKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaApAQCAtMTkzLDcgKzE5Myw3IEBACiAJX19sZTMyIHBhX2xvdzsJCS8qIExvdyAzMiBiaXQgUENJIGFkZHJlc3MgKi8KIAlfX2xlMTYgcGFfaGlnaDsJCS8qIE5leHQgMTYgYml0IFBDSSBhZGRyZXNzICg0OCB0b3RhbCkgKi8KIAlfX2xlMTYgc2l6ZTsJCS8qIGJpdHMgMC0tMTQgLSBmcmFtZSBzaXplLCBiaXQgMTUgLSBlbmFibGUgaW50LiAqLwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogLyoKICAqCVRyYW5zbWl0IGRlc2NyaXB0b3IKQEAgLTIwOCw3ICsyMDgsNyBAQAogCV9fbGUxNiB2bGFuOwogCXU4IFRDUjsKIAl1OCBjbWQ7CQkJLyogYml0cyAwLS0xIC0gVENQTFMsIGJpdHMgNC0tNyAtIENNRFogKi8KLX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewogCVREX1FVRVVFID0gY3B1X3RvX2xlMTYoMHg4MDAwKQpAQCAtMjE4LDcgKzIxOCw3IEBACiAJX19sZTMyIHBhX2xvdzsKIAlfX2xlMTYgcGFfaGlnaDsKIAlfX2xlMTYgc2l6ZTsJCS8qIGJpdHMgMC0tMTMgLSBzaXplLCBiaXQgMTUgLSBxdWV1ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHR4X2Rlc2MgewogCXN0cnVjdCB0ZGVzYzAgdGRlc2MwOwpAQCAtMTA5Niw3ICsxMDk2LDcgQEAKIAogCXZvbGF0aWxlIF9fbGUxNiBQYXR0ZXJuQ1JDWzhdOwkvKiAweEIwICovCiAJdm9sYXRpbGUgX19sZTMyIEJ5dGVNYXNrWzRdWzRdOwkvKiAweEMwICovCi19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAKIGVudW0gaHdfbWliIHsKQEAgLTEyMTYsNyArMTIxNiw3IEBACiAJdTggYXJfc2lwWzRdOwogCXU4IGFyX3RoYVtFVEhfQUxFTl07CiAJdTggYXJfdGlwWzRdOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IF9tYWdpY19wYWNrZXQgewogCXU4IGRlc3RfbWFjWzZdOwpAQCAtMTIyNCw3ICsxMjI0LDcgQEAKIAlfX2JlMTYgdHlwZTsKIAl1OCBNQUNbMTZdWzZdOwogCXU4IHBhc3N3b3JkWzZdOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogLyoKICAqCVN0b3JlIGZvciBjaGlwIGNvbnRleHQgd2hlbiBzYXZpbmcgYW5kIHJlc3RvcmluZyBzdGF0dXMuIE5vdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2RlZnMuaCBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kZWZzLmgKaW5kZXggYjQ4ODllNi4uY2E3NzI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZGVmcy5oCkBAIC00NjQsNiArNDY0LDkgQEAKIC8qIGFkZGl0aW9uIDEgZm9yIGV2ZW50cyAqLwogI2RlZmluZSBWTVhORVQzX01BWF9JTlRSUyAgICAgIDI1CiAKKy8qIHZhbHVlIG9mIGludHJDdHJsICovCisjZGVmaW5lIFZNWE5FVDNfSUNfRElTQUJMRV9BTEwgIDB4MSAgIC8qIGJpdCAwICovCisKIAogc3RydWN0IFZteG5ldDNfSW50ckNvbmYgewogCWJvb2wJCWF1dG9NYXNrOwpAQCAtNDcxLDcgKzQ3NCw4IEBACiAJdTgJCWV2ZW50SW50cklkeDsKIAl1OAkJbW9kTGV2ZWxzW1ZNWE5FVDNfTUFYX0lOVFJTXTsJLyogbW9kZXJhdGlvbiBsZXZlbCBmb3IKIAkJCQkJCQkgKiBlYWNoIGludHIgKi8KLQlfX2xlMzIJCXJlc2VydmVkWzNdOworCV9fbGUzMgkJaW50ckN0cmw7CisJX19sZTMyCQlyZXNlcnZlZFsyXTsKIH07CiAKIC8qIG9uZSBiaXQgcGVyIFZMQU4gSUQsIHRoZSBzaXplIGlzIGluIHRoZSB1bml0cyBvZiB1MzIJKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwppbmRleCA5ODliNzQyLi5hYmUwZmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCkBAIC03Miw2ICs3Miw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+aW50ci5udW1faW50cnM7IGkrKykKIAkJdm14bmV0M19lbmFibGVfaW50cihhZGFwdGVyLCBpKTsKKwlhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQuaW50ckNvbmYuaW50ckN0cmwgJj0KKwkJCQkJY3B1X3RvX2xlMzIoflZNWE5FVDNfSUNfRElTQUJMRV9BTEwpOwogfQogCiAKQEAgLTgwLDYgKzgyLDggQEAKIHsKIAlpbnQgaTsKIAorCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5pbnRyQ29uZi5pbnRyQ3RybCB8PQorCQkJCQljcHVfdG9fbGUzMihWTVhORVQzX0lDX0RJU0FCTEVfQUxMKTsKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+aW50ci5udW1faW50cnM7IGkrKykKIAkJdm14bmV0M19kaXNhYmxlX2ludHIoYWRhcHRlciwgaSk7CiB9CkBAIC0xMjgsNyArMTMyLDcgQEAKICAqIENoZWNrIHRoZSBsaW5rIHN0YXRlLiBUaGlzIG1heSBzdGFydCBvciBzdG9wIHRoZSB0eCBxdWV1ZS4KICAqLwogc3RhdGljIHZvaWQKLXZteG5ldDNfY2hlY2tfbGluayhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQordm14bmV0M19jaGVja19saW5rKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgYWZmZWN0VHhRdWV1ZSkKIHsKIAl1MzIgcmV0OwogCkBAIC0xNDEsMTQgKzE0NSwxNiBAQAogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkKIAkJCW5ldGlmX2NhcnJpZXJfb24oYWRhcHRlci0+bmV0ZGV2KTsKIAotCQl2bXhuZXQzX3RxX3N0YXJ0KCZhZGFwdGVyLT50eF9xdWV1ZSwgYWRhcHRlcik7CisJCWlmIChhZmZlY3RUeFF1ZXVlKQorCQkJdm14bmV0M190cV9zdGFydCgmYWRhcHRlci0+dHhfcXVldWUsIGFkYXB0ZXIpOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBOSUMgTGluayBpcyBEb3duXG4iLAogCQkgICAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKIAkJaWYgKG5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPm5ldGRldik7CiAKLQkJdm14bmV0M190cV9zdG9wKCZhZGFwdGVyLT50eF9xdWV1ZSwgYWRhcHRlcik7CisJCWlmIChhZmZlY3RUeFF1ZXVlKQorCQkJdm14bmV0M190cV9zdG9wKCZhZGFwdGVyLT50eF9xdWV1ZSwgYWRhcHRlcik7CiAJfQogfQogCkBAIC0xNjMsNyArMTY5LDcgQEAKIAogCS8qIENoZWNrIGlmIGxpbmsgc3RhdGUgaGFzIGNoYW5nZWQgKi8KIAlpZiAoZXZlbnRzICYgVk1YTkVUM19FQ1JfTElOSykKLQkJdm14bmV0M19jaGVja19saW5rKGFkYXB0ZXIpOworCQl2bXhuZXQzX2NoZWNrX2xpbmsoYWRhcHRlciwgdHJ1ZSk7CiAKIAkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbiB4bWl0L3JlY3YgcXVldWVzICovCiAJaWYgKGV2ZW50cyAmIChWTVhORVQzX0VDUl9UUUVSUiB8IFZNWE5FVDNfRUNSX1JRRVJSKSkgewpAQCAtNjU4LDggKzY2NCwxMyBAQAogCXdoaWxlIChsZW4pIHsKIAkJdTMyIGJ1Zl9zaXplOwogCi0JCWJ1Zl9zaXplID0gbGVuID4gVk1YTkVUM19NQVhfVFhfQlVGX1NJWkUgPwotCQkJICAgVk1YTkVUM19NQVhfVFhfQlVGX1NJWkUgOiBsZW47CisJCWlmIChsZW4gPCBWTVhORVQzX01BWF9UWF9CVUZfU0laRSkgeworCQkJYnVmX3NpemUgPSBsZW47CisJCQlkdzIgfD0gbGVuOworCQl9IGVsc2UgeworCQkJYnVmX3NpemUgPSBWTVhORVQzX01BWF9UWF9CVUZfU0laRTsKKwkJCS8qIHNwZWMgc2F5cyB0aGF0IGZvciBUeERlc2MubGVuLCAwID09IDJeMTQgKi8KKwkJfQogCiAJCXRiaSA9IHRxLT5idWZfaW5mbyArIHRxLT50eF9yaW5nLm5leHQyZmlsbDsKIAkJdGJpLT5tYXBfdHlwZSA9IFZNWE5FVDNfTUFQX1NJTkdMRTsKQEAgLTY2NywxMyArNjc4LDEzIEBACiAJCQkJc2tiLT5kYXRhICsgYnVmX29mZnNldCwgYnVmX3NpemUsCiAJCQkJUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJdGJpLT5sZW4gPSBidWZfc2l6ZTsgLyogdGhpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgMl4xNCB0byAwICovCisJCXRiaS0+bGVuID0gYnVmX3NpemU7CiAKIAkJZ2Rlc2MgPSB0cS0+dHhfcmluZy5iYXNlICsgdHEtPnR4X3JpbmcubmV4dDJmaWxsOwogCQlCVUdfT04oZ2Rlc2MtPnR4ZC5nZW4gPT0gdHEtPnR4X3JpbmcuZ2VuKTsKIAogCQlnZGVzYy0+dHhkLmFkZHIgPSBjcHVfdG9fbGU2NCh0YmktPmRtYV9hZGRyKTsKLQkJZ2Rlc2MtPmR3b3JkWzJdID0gY3B1X3RvX2xlMzIoZHcyIHwgYnVmX3NpemUpOworCQlnZGVzYy0+ZHdvcmRbMl0gPSBjcHVfdG9fbGUzMihkdzIpOwogCQlnZGVzYy0+ZHdvcmRbM10gPSAwOwogCiAJCWRldl9kYmcoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LApAQCAtMTgyNSw2ICsxODM2LDcgQEAKIAkJZGV2UmVhZC0+aW50ckNvbmYubW9kTGV2ZWxzW2ldID0gYWRhcHRlci0+aW50ci5tb2RfbGV2ZWxzW2ldOwogCiAJZGV2UmVhZC0+aW50ckNvbmYuZXZlbnRJbnRySWR4ID0gYWRhcHRlci0+aW50ci5ldmVudF9pbnRyX2lkeDsKKwlkZXZSZWFkLT5pbnRyQ29uZi5pbnRyQ3RybCB8PSBjcHVfdG9fbGUzMihWTVhORVQzX0lDX0RJU0FCTEVfQUxMKTsKIAogCS8qIHJ4IGZpbHRlciBzZXR0aW5ncyAqLwogCWRldlJlYWQtPnJ4RmlsdGVyQ29uZi5yeE1vZGUgPSAwOwpAQCAtMTg4OSw3ICsxOTAxLDcgQEAKIAkgKiBDaGVjayBsaW5rIHN0YXRlIHdoZW4gZmlyc3QgYWN0aXZhdGluZyBkZXZpY2UuIEl0IHdpbGwgc3RhcnQgdGhlCiAJICogdHggcXVldWUgaWYgdGhlIGxpbmsgaXMgdXAuCiAJICovCi0Jdm14bmV0M19jaGVja19saW5rKGFkYXB0ZXIpOworCXZteG5ldDNfY2hlY2tfbGluayhhZGFwdGVyLCB0cnVlKTsKIAogCW5hcGlfZW5hYmxlKCZhZGFwdGVyLT5uYXBpKTsKIAl2bXhuZXQzX2VuYWJsZV9hbGxfaW50cnMoYWRhcHRlcik7CkBAIC0yMjk1LDkgKzIzMDcsMTMgQEAKIAlhZGFwdGVyLT5pbnRyLm1hc2tfbW9kZSA9IChjZmcgPj4gMikgJiAweDM7CiAKIAlpZiAoYWRhcHRlci0+aW50ci50eXBlID09IFZNWE5FVDNfSVRfQVVUTykgewotCQlpbnQgZXJyOworCQlhZGFwdGVyLT5pbnRyLnR5cGUgPSBWTVhORVQzX0lUX01TSVg7CisJfQogCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAoYWRhcHRlci0+aW50ci50eXBlID09IFZNWE5FVDNfSVRfTVNJWCkgeworCQlpbnQgZXJyOworCiAJCWFkYXB0ZXItPmludHIubXNpeF9lbnRyaWVzWzBdLmVudHJ5ID0gMDsKIAkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPmludHIubXNpeF9lbnRyaWVzLAogCQkJCSAgICAgIFZNWE5FVDNfTElOVVhfTUFYX01TSVhfVkVDVCk7CkBAIC0yMzA2LDE1ICsyMzIyLDE4IEBACiAJCQlhZGFwdGVyLT5pbnRyLnR5cGUgPSBWTVhORVQzX0lUX01TSVg7CiAJCQlyZXR1cm47CiAJCX0KLSNlbmRpZgorCQlhZGFwdGVyLT5pbnRyLnR5cGUgPSBWTVhORVQzX0lUX01TSTsKKwl9CiAKKwlpZiAoYWRhcHRlci0+aW50ci50eXBlID09IFZNWE5FVDNfSVRfTVNJKSB7CisJCWludCBlcnI7CiAJCWVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwogCQlpZiAoIWVycikgewogCQkJYWRhcHRlci0+aW50ci5udW1faW50cnMgPSAxOwotCQkJYWRhcHRlci0+aW50ci50eXBlID0gVk1YTkVUM19JVF9NU0k7CiAJCQlyZXR1cm47CiAJCX0KIAl9CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KIAogCWFkYXB0ZXItPmludHIudHlwZSA9IFZNWE5FVDNfSVRfSU5UWDsKIApAQCAtMjM1OCw2ICsyMzc3LDcgQEAKIAkJcmV0dXJuOwogCiAJLyogaWYgdGhlIGRldmljZSBpcyBjbG9zZWQsIHdlIG11c3QgbGVhdmUgaXQgYWxvbmUgKi8KKwlydG5sX2xvY2soKTsKIAlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXNldHRpbmdcbiIsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CiAJCXZteG5ldDNfcXVpZXNjZV9kZXYoYWRhcHRlcik7CkBAIC0yMzY2LDYgKzIzODYsNyBAQAogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhbHJlYWR5IGNsb3NlZFxuIiwgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKIAl9CisJcnRubF91bmxvY2soKTsKIAogCWNsZWFyX2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiB9CkBAIC0yNDkxLDYgKzI1MTIsNyBAQAogCX0KIAogCXNldF9iaXQoVk1YTkVUM19TVEFURV9CSVRfUVVJRVNDRUQsICZhZGFwdGVyLT5zdGF0ZSk7CisJdm14bmV0M19jaGVja19saW5rKGFkYXB0ZXIsIGZhbHNlKTsKIAlhdG9taWNfaW5jKCZkZXZpY2VzX2ZvdW5kKTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19ldGh0b29sLmMKaW5kZXggMzkzNWM0NC4uN2U0YjVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jCkBAIC0yNzUsMjcgKzI3NSwyNyBAQAogCX0KIH0KIAotc3RhdGljIHUzMgotdm14bmV0M19nZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikgewotCXJldHVybiBuZXRkZXYtPmZlYXR1cmVzOwotfQotCiBzdGF0aWMgaW50Ci12bXhuZXQzX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkgewordm14bmV0M19zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCit7CiAJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTggbHJvX3JlcXVlc3RlZCA9IChkYXRhICYgRVRIX0ZMQUdfTFJPKSA9PSAwID8gMCA6IDE7CiAJdTggbHJvX3ByZXNlbnQgPSAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSA9PSAwID8gMCA6IDE7CiAKKwlpZiAoZGF0YSAmIH5FVEhfRkxBR19MUk8pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChscm9fcmVxdWVzdGVkIF4gbHJvX3ByZXNlbnQpIHsKIAkJLyogdG9nZ2xlIHRoZSBMUk8gZmVhdHVyZSovCiAJCW5ldGRldi0+ZmVhdHVyZXMgXj0gTkVUSUZfRl9MUk87CiAKIAkJLyogdXBkYXRlIGhhcndhcmUgTFJPIGNhcGFiaWxpdHkgYWNjb3JkaW5nbHkgKi8KIAkJaWYgKGxyb19yZXF1ZXN0ZWQpCi0JCQlhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQubWlzYy51cHRGZWF0dXJlcyAmPSBVUFQxX0ZfTFJPOworCQkJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLm1pc2MudXB0RmVhdHVyZXMgfD0KKwkJCQkJCWNwdV90b19sZTY0KFVQVDFfRl9MUk8pOwogCQllbHNlCiAJCQlhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQubWlzYy51cHRGZWF0dXJlcyAmPQotCQkJCQkJCQl+VVBUMV9GX0xSTzsKKwkJCQkJCWNwdV90b19sZTY0KH5VUFQxX0ZfTFJPKTsKIAkJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCiAJCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9GRUFUVVJFKTsKIAl9CkBAIC01NTQsNyArNTU0LDcgQEAKIAkuZ2V0X3RzbyAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCiAJLnNldF90c28gICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfdHNvLAogCS5nZXRfc3RyaW5ncyAgICAgICA9IHZteG5ldDNfZ2V0X3N0cmluZ3MsCi0JLmdldF9mbGFncwkgICA9IHZteG5ldDNfZ2V0X2ZsYWdzLAorCS5nZXRfZmxhZ3MJICAgPSBldGh0b29sX29wX2dldF9mbGFncywKIAkuc2V0X2ZsYWdzCSAgID0gdm14bmV0M19zZXRfZmxhZ3MsCiAJLmdldF9zc2V0X2NvdW50CSAgID0gdm14bmV0M19nZXRfc3NldF9jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMgPSB2bXhuZXQzX2dldF9ldGh0b29sX3N0YXRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCmluZGV4IDM0ZjM5MmY0Li4yMTIxYzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCkBAIC02OCwxMCArNjgsMTAgQEAKIC8qCiAgKiBWZXJzaW9uIG51bWJlcnMKICAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjAuNS4wLWsiCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMC4xNC4wLWsiCiAKIC8qIGEgMzItYml0IGludCwgZWFjaCBieXRlIGVuY29kZSBhIHZlcmlvbiBudW1iZXIgaW4gVk1YTkVUM19EUklWRVJfVkVSU0lPTiAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX05VTSAgICAgIDB4MDEwMDA1MDAKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9OVU0gICAgICAweDAxMDAwRTAwCiAKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC92eGdlL01ha2VmaWxlCmluZGV4IDg5OTJjYTIuLmI2MjVlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvdnhnZS9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgTWFrZWZpbGUgZm9yIE5ldGVyaW9uIEluYydzIFgzMTAwIFNlcmllcyAxMCBHYkUgUENJZSAjIEkvTworIyBNYWtlZmlsZSBmb3IgRXhhciBDb3JwJ3MgWDMxMDAgU2VyaWVzIDEwIEdiRSBQQ0llIEkvTwogIyBWaXJ0dWFsaXplZCBTZXJ2ZXIgQWRhcHRlciBsaW51eCBkcml2ZXIKIAogb2JqLSQoQ09ORklHX1ZYR0UpICs9IHZ4Z2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5jIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5jCmluZGV4IDI5N2YwZDIuLjBlNmRiNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1jb25maWcuYworKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtY29uZmlnLmMKQEAgLTcsOSArNyw5IEBACiAgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KICAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKLSAqIHZ4Z2UtY29uZmlnLmM6IERyaXZlciBmb3IgTmV0ZXJpb24gSW5jJ3MgWDMxMDAgU2VyaWVzIDEwR2JFIFBDSWUgSS9PCisgKiB2eGdlLWNvbmZpZy5jOiBEcml2ZXIgZm9yIEV4YXIgQ29ycCdzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTwogICogICAgICAgICAgICAgICAgVmlydHVhbGl6ZWQgU2VydmVyIEFkYXB0ZXIuCi0gKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA5IE5ldGVyaW9uIEluYy4KKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1jb25maWcuaCBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1jb25maWcuaAppbmRleCA0YWUyNjI1Li4xYTk0MzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtY29uZmlnLmgKKysrIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5oCkBAIC03LDkgKzcsOSBAQAogICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCiAgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCi0gKiB2eGdlLWNvbmZpZy5oOiBEcml2ZXIgZm9yIE5ldGVyaW9uIEluYydzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTworICogdnhnZS1jb25maWcuaDogRHJpdmVyIGZvciBFeGFyIENvcnAncyBYMzEwMCBTZXJpZXMgMTBHYkUgUENJZSBJL08KICAqICAgICAgICAgICAgICAgIFZpcnR1YWxpemVkIFNlcnZlciBBZGFwdGVyLgotICogQ29weXJpZ2h0KGMpIDIwMDItMjAwOSBOZXRlcmlvbiBJbmMuCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDEwIEV4YXIgQ29ycC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIFZYR0VfQ09ORklHX0gKICNkZWZpbmUgVlhHRV9DT05GSUdfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWV0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1ldGh0b29sLmMKaW5kZXggY2FkZWY4NS4uMDU2NzllMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWV0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtZXRodG9vbC5jCkBAIC03LDkgKzcsOSBAQAogICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCiAgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCi0gKiB2eGdlLWV0aHRvb2wuYzogRHJpdmVyIGZvciBOZXRlcmlvbiBJbmMncyBYMzEwMCBTZXJpZXMgMTBHYkUgUENJZSBJL08KKyAqIHZ4Z2UtZXRodG9vbC5jOiBEcml2ZXIgZm9yIEV4YXIgQ29ycCdzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTwogICogICAgICAgICAgICAgICAgIFZpcnR1YWxpemVkIFNlcnZlciBBZGFwdGVyLgotICogQ29weXJpZ2h0KGMpIDIwMDItMjAwOSBOZXRlcmlvbiBJbmMuCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDEwIEV4YXIgQ29ycC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZTxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWV0aHRvb2wuaCBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1ldGh0b29sLmgKaW5kZXggMWMzZGYwYS4uNmNmMzA0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWV0aHRvb2wuaAorKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtZXRodG9vbC5oCkBAIC03LDkgKzcsOSBAQAogICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCiAgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCi0gKiB2eGdlLWV0aHRvb2wuaDogRHJpdmVyIGZvciBOZXRlcmlvbiBJbmMncyBYMzEwMCBTZXJpZXMgMTBHYkUgUENJZSBJL08KKyAqIHZ4Z2UtZXRodG9vbC5oOiBEcml2ZXIgZm9yIEV4YXIgQ29ycCdzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTwogICogICAgICAgICAgICAgICAgIFZpcnR1YWxpemVkIFNlcnZlciBBZGFwdGVyLgotICogQ29weXJpZ2h0KGMpIDIwMDItMjAwOSBOZXRlcmlvbiBJbmMuCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDEwIEV4YXIgQ29ycC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9WWEdFX0VUSFRPT0xfSAogI2RlZmluZSBfVlhHRV9FVEhUT09MX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmMgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtbWFpbi5jCmluZGV4IGZjOGIyZDcuLmM3YzU2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLW1haW4uYwpAQCAtNyw5ICs3LDkgQEAKICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCiAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgotKiB2eGdlLW1haW4uYzogRHJpdmVyIGZvciBOZXRlcmlvbiBJbmMncyBYMzEwMCBTZXJpZXMgMTBHYkUgUENJZSBJL08KKyogdnhnZS1tYWluLmM6IERyaXZlciBmb3IgRXhhciBDb3JwJ3MgWDMxMDAgU2VyaWVzIDEwR2JFIFBDSWUgSS9PCiAqICAgICAgICAgICAgICBWaXJ0dWFsaXplZCBTZXJ2ZXIgQWRhcHRlci4KLSogQ29weXJpZ2h0KGMpIDIwMDItMjAwOSBOZXRlcmlvbiBJbmMuCisqIENvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLgogKgogKiBUaGUgbW9kdWxlIGxvYWRhYmxlIHBhcmFtZXRlcnMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgYW5kIGEgYnJpZWYKICogZXhwbGFuYXRpb24gb2YgYWxsIHRoZSB2YXJpYWJsZXM6CkBAIC00MSw2ICs0MSw4IEBACiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC04Nyw3ICs4OSw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBWWEdFX0NPTVBMRVRFX1ZQQVRIX1RYKHN0cnVjdCB2eGdlX2ZpZm8gKmZpZm8pCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKipza2JfcHRyID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKnRlbXA7CiAjZGVmaW5lIE5SX1NLQl9DT01QTEVURUQgMTI4CkBAIC05OCwxNSArOTksMTYgQEAKIAkJbW9yZSA9IDA7CiAJCXNrYl9wdHIgPSBjb21wbGV0ZWQ7CiAKLQkJaWYgKHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZmaWZvLT50eF9sb2NrLCBmbGFncykpIHsKKwkJaWYgKF9fbmV0aWZfdHhfdHJ5bG9jayhmaWZvLT50eHEpKSB7CiAJCQl2eGdlX2h3X3ZwYXRoX3BvbGxfdHgoZmlmby0+aGFuZGxlLCAmc2tiX3B0ciwKIAkJCQkJCU5SX1NLQl9DT01QTEVURUQsICZtb3JlKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpZm8tPnR4X2xvY2ssIGZsYWdzKTsKKwkJCV9fbmV0aWZfdHhfdW5sb2NrKGZpZm8tPnR4cSk7CiAJCX0KKwogCQkvKiBmcmVlIFNLQnMgKi8KIAkJZm9yICh0ZW1wID0gY29tcGxldGVkOyB0ZW1wICE9IHNrYl9wdHI7IHRlbXArKykKIAkJCWRldl9rZnJlZV9za2JfaXJxKCp0ZW1wKTsKLQl9IHdoaWxlIChtb3JlKSA7CisJfSB3aGlsZSAobW9yZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBWWEdFX0NPTVBMRVRFX0FMTF9UWChzdHJ1Y3QgdnhnZWRldiAqdmRldikKQEAgLTEzMSw4MCArMTMzLDYgQEAKIH0KIAogLyoKLSAqIE11bHRpUSBtYW5pcHVsYXRpb24gaGVscGVyIGZ1bmN0aW9ucwotICovCi12b2lkIHZ4Z2Vfc3RvcF9hbGxfdHhfcXVldWUoc3RydWN0IHZ4Z2VkZXYgKnZkZXYpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZkZXYtPm5kZXY7Ci0KLQlpZiAodmRldi0+Y29uZmlnLnR4X3N0ZWVyaW5nX3R5cGUgIT0gVFhfTVVMVElRX1NURUVSSU5HKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKQotCQkJdmRldi0+dnBhdGhzW2ldLmZpZm8ucXVldWVfc3RhdGUgPSBWUEFUSF9RVUVVRV9TVE9QOwotCX0KLQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoZGV2KTsKLX0KLQotdm9pZCB2eGdlX3N0b3BfdHhfcXVldWUoc3RydWN0IHZ4Z2VfZmlmbyAqZmlmbykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmlmby0+bmRldjsKLQotCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9IE5VTEw7Ci0JaWYgKGZpZm8tPnR4X3N0ZWVyaW5nX3R5cGUgPT0gVFhfTVVMVElRX1NURUVSSU5HKQotCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgZmlmby0+ZHJpdmVyX2lkKTsKLQllbHNlIHsKLQkJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIDApOwotCQlmaWZvLT5xdWV1ZV9zdGF0ZSA9IFZQQVRIX1FVRVVFX1NUT1A7Ci0JfQotCi0JbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOwotfQotCi12b2lkIHZ4Z2Vfc3RhcnRfYWxsX3R4X3F1ZXVlKHN0cnVjdCB2eGdlZGV2ICp2ZGV2KQotewotCWludCBpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2ZGV2LT5uZGV2OwotCi0JaWYgKHZkZXYtPmNvbmZpZy50eF9zdGVlcmluZ190eXBlICE9IFRYX01VTFRJUV9TVEVFUklORykgewotCQlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bm9fb2ZfdnBhdGg7IGkrKykKLQkJCXZkZXYtPnZwYXRoc1tpXS5maWZvLnF1ZXVlX3N0YXRlID0gVlBBVEhfUVVFVUVfU1RBUlQ7Ci0JfQotCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgdnhnZV93YWtlX2FsbF90eF9xdWV1ZShzdHJ1Y3QgdnhnZWRldiAqdmRldikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmRldi0+bmRldjsKLQotCWlmICh2ZGV2LT5jb25maWcudHhfc3RlZXJpbmdfdHlwZSAhPSBUWF9NVUxUSVFfU1RFRVJJTkcpIHsKLQkJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspCi0JCQl2ZGV2LT52cGF0aHNbaV0uZmlmby5xdWV1ZV9zdGF0ZSA9IFZQQVRIX1FVRVVFX1NUQVJUOwotCX0KLQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoZGV2KTsKLX0KLQotdm9pZCB2eGdlX3dha2VfdHhfcXVldWUoc3RydWN0IHZ4Z2VfZmlmbyAqZmlmbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmlmby0+bmRldjsKLQotCWludCB2cGF0aF9ubyA9IGZpZm8tPmRyaXZlcl9pZDsKLQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBOVUxMOwotCWlmIChmaWZvLT50eF9zdGVlcmluZ190eXBlID09IFRYX01VTFRJUV9TVEVFUklORykgewotCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgdnBhdGhfbm8pOwotCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpKQotCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZSh0eHEpOwotCX0gZWxzZSB7Ci0JCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCAwKTsKLQkJaWYgKGZpZm8tPnF1ZXVlX3N0YXRlID09IFZQQVRIX1FVRVVFX1NUT1ApCi0JCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpKSB7Ci0JCQkJZmlmby0+cXVldWVfc3RhdGUgPSBWUEFUSF9RVUVVRV9TVEFSVDsKLQkJCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4cSk7Ci0JCQl9Ci0JfQotfQotCi0vKgogICogdnhnZV9jYWxsYmFja19saW5rX3VwCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGludGVycnVwdCBjb250ZXh0IHRvIG5vdGlmeSBsaW5rIHVwIHN0YXRlCkBAIC0yMTgsMTEgKzE0NiwxMSBAQAogCiAJdnhnZV9kZWJ1Z19lbnRyeWV4aXQoVlhHRV9UUkFDRSwgIiVzOiAlczolZCIsCiAJCXZkZXYtPm5kZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICIlczogTGluayBVcFxuIiwgdmRldi0+bmRldi0+bmFtZSk7CisJbmV0ZGV2X25vdGljZSh2ZGV2LT5uZGV2LCAiTGluayBVcFxuIik7CiAJdmRldi0+c3RhdHMubGlua191cCsrOwogCiAJbmV0aWZfY2Fycmllcl9vbih2ZGV2LT5uZGV2KTsKLQl2eGdlX3dha2VfYWxsX3R4X3F1ZXVlKHZkZXYpOworCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyh2ZGV2LT5uZGV2KTsKIAogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsCiAJCSIlczogJXM6JWQgRXhpdGluZy4uLiIsIHZkZXYtPm5kZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXyk7CkBAIC0yNDIsMTEgKzE3MCwxMSBAQAogCiAJdnhnZV9kZWJ1Z19lbnRyeWV4aXQoVlhHRV9UUkFDRSwKIAkJIiVzOiAlczolZCIsIHZkZXYtPm5kZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICIlczogTGluayBEb3duXG4iLCB2ZGV2LT5uZGV2LT5uYW1lKTsKKwluZXRkZXZfbm90aWNlKHZkZXYtPm5kZXYsICJMaW5rIERvd25cbiIpOwogCiAJdmRldi0+c3RhdHMubGlua19kb3duKys7CiAJbmV0aWZfY2Fycmllcl9vZmYodmRldi0+bmRldik7Ci0JdnhnZV9zdG9wX2FsbF90eF9xdWV1ZSh2ZGV2KTsKKwluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXModmRldi0+bmRldik7CiAKIAl2eGdlX2RlYnVnX2VudHJ5ZXhpdChWWEdFX1RSQUNFLAogCQkiJXM6ICVzOiVkIEV4aXRpbmcuLi4iLCB2ZGV2LT5uZGV2LT5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtNjc3LDcgKzYwNSw4IEBACiAJCQkJJmR0ciwgJnRfY29kZSkgPT0gVlhHRV9IV19PSyk7CiAKIAkqc2tiX3B0ciA9IGRvbmVfc2tiOwotCXZ4Z2Vfd2FrZV90eF9xdWV1ZShmaWZvLCBza2IpOworCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKGZpZm8tPnR4cSkpCisJCW5ldGlmX3R4X3dha2VfcXVldWUoZmlmby0+dHhxKTsKIAogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsCiAJCQkJIiVzOiAlczolZCAgRXhpdGluZy4uLiIsCkBAIC02ODYsOCArNjE1LDcgQEAKIH0KIAogLyogc2VsZWN0IGEgdnBhdGggdG8gdHJhbnNtaXQgdGhlIHBhY2tldCAqLwotc3RhdGljIHUzMiB2eGdlX2dldF92cGF0aF9ubyhzdHJ1Y3QgdnhnZWRldiAqdmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlpbnQgKmRvX2xvY2spCitzdGF0aWMgdTMyIHZ4Z2VfZ2V0X3ZwYXRoX25vKHN0cnVjdCB2eGdlZGV2ICp2ZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXUxNiBxdWV1ZV9sZW4sIGNvdW50ZXIgPSAwOwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewpAQCAtNzA2LDEyICs2MzQsNiBAQAogCQkJCXZkZXYtPnZwYXRoX3NlbGVjdG9yW3F1ZXVlX2xlbiAtIDFdOwogCQkJaWYgKGNvdW50ZXIgPj0gcXVldWVfbGVuKQogCQkJCWNvdW50ZXIgPSBxdWV1ZV9sZW4gLSAxOwotCi0JCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7Ci0jaWZkZWYgTkVUSUZfRl9MTFRYCi0JCQkJKmRvX2xvY2sgPSAwOwotI2VuZGlmCi0JCQl9CiAJCX0KIAl9CiAJcmV0dXJuIGNvdW50ZXI7CkBAIC04MDgsOCArNzMwLDYgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBUeCBlbnRyeSBwb2ludCBvZiB0aGUgZHJpdmVyLiBOZXRlcmlvbiBOSUMgc3VwcG9ydHMKICAqIGNlcnRhaW4gcHJvdG9jb2wgYXNzaXN0IGZlYXR1cmVzIG9uIFR4IHNpZGUsIG5hbWVseSAgQ1NPLCBTL0csIExTTy4KLSAqIE5PVEU6IHdoZW4gZGV2aWNlIGNhbnQgcXVldWUgdGhlIHBrdCwganVzdCB0aGUgdHJhbnNfc3RhcnQgdmFyaWFibGUgd2lsbAotICogbm90IGJlIHVwYWR0ZWQuCiAqLwogc3RhdGljIG5ldGRldl90eF90CiB2eGdlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTgyNiw5ICs3NDYsNyBAQAogCXN0cnVjdCB2eGdlX3R4X3ByaXYgKnR4ZGxfcHJpdiA9IE5VTEw7CiAJc3RydWN0IF9fdnhnZV9od19maWZvICpmaWZvX2h3OwogCWludCBvZmZsb2FkX3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJaW50IHZwYXRoX25vID0gMDsKLQlpbnQgZG9fc3Bpbl90eF9sb2NrID0gMTsKIAogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsICIlczogJXM6JWQiLAogCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtODY0LDcgKzc4Miw3IEBACiAJaWYgKHZkZXYtPmNvbmZpZy50eF9zdGVlcmluZ190eXBlID09IFRYX01VTFRJUV9TVEVFUklORykKIAkJdnBhdGhfbm8gPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKIAllbHNlIGlmICh2ZGV2LT5jb25maWcudHhfc3RlZXJpbmdfdHlwZSA9PSBUWF9QT1JUX1NURUVSSU5HKQotCQl2cGF0aF9ubyA9IHZ4Z2VfZ2V0X3ZwYXRoX25vKHZkZXYsIHNrYiwgJmRvX3NwaW5fdHhfbG9jayk7CisJCXZwYXRoX25vID0gdnhnZV9nZXRfdnBhdGhfbm8odmRldiwgc2tiKTsKIAogCXZ4Z2VfZGVidWdfdHgoVlhHRV9UUkFDRSwgIiVzOiB2cGF0aF9ubz0gJWQiLCBkZXYtPm5hbWUsIHZwYXRoX25vKTsKIApAQCAtODc0LDQ2ICs3OTIsMjkgQEAKIAlmaWZvID0gJnZkZXYtPnZwYXRoc1t2cGF0aF9ub10uZmlmbzsKIAlmaWZvX2h3ID0gZmlmby0+aGFuZGxlOwogCi0JaWYgKGRvX3NwaW5fdHhfbG9jaykKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZpZm8tPnR4X2xvY2ssIGZsYWdzKTsKLQllbHNlIHsKLQkJaWYgKHVubGlrZWx5KCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmZmlmby0+dHhfbG9jaywgZmxhZ3MpKSkKLQkJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOwotCX0KKwlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChmaWZvLT50eHEpKQorCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAKLQlpZiAodmRldi0+Y29uZmlnLnR4X3N0ZWVyaW5nX3R5cGUgPT0gVFhfTVVMVElRX1NURUVSSU5HKSB7Ci0JCWlmIChuZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKGRldiwgc2tiKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlmby0+dHhfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwotCQl9Ci0JfSBlbHNlIGlmICh1bmxpa2VseShmaWZvLT5xdWV1ZV9zdGF0ZSA9PSBWUEFUSF9RVUVVRV9TVE9QKSkgewotCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWZvLT50eF9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7Ci0JCX0KLQl9CiAJYXZhaWwgPSB2eGdlX2h3X2ZpZm9fZnJlZV90eGRsX2NvdW50X2dldChmaWZvX2h3KTsKIAlpZiAoYXZhaWwgPT0gMCkgewogCQl2eGdlX2RlYnVnX3R4KFZYR0VfRVJSLAogCQkJIiVzOiBObyBmcmVlIFRYRHMgYXZhaWxhYmxlIiwgZGV2LT5uYW1lKTsKIAkJZmlmby0+c3RhdHMudHhkX25vdF9mcmVlKys7Ci0JCXZ4Z2Vfc3RvcF90eF9xdWV1ZShmaWZvKTsKLQkJZ290byBfZXhpdDI7CisJCWdvdG8gX2V4aXQwOwogCX0KIAogCS8qIExhc3QgVFhEPyAgU3RvcCB0eCBxdWV1ZSB0byBhdm9pZCBkcm9wcGluZyBwYWNrZXRzLiAgVFgKIAkgKiBjb21wbGV0aW9uIHdpbGwgcmVzdW1lIHRoZSBxdWV1ZS4KIAkgKi8KIAlpZiAoYXZhaWwgPT0gMSkKLQkJdnhnZV9zdG9wX3R4X3F1ZXVlKGZpZm8pOworCQluZXRpZl90eF9zdG9wX3F1ZXVlKGZpZm8tPnR4cSk7CiAKIAlzdGF0dXMgPSB2eGdlX2h3X2ZpZm9fdHhkbF9yZXNlcnZlKGZpZm9faHcsICZkdHIsICZkdHJfcHJpdik7CiAJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSBWWEdFX0hXX09LKSkgewogCQl2eGdlX2RlYnVnX3R4KFZYR0VfRVJSLAogCQkgICAiJXM6IE91dCBvZiBkZXNjcmlwdG9ycyAuIiwgZGV2LT5uYW1lKTsKIAkJZmlmby0+c3RhdHMudHhkX291dF9vZl9kZXNjKys7Ci0JCXZ4Z2Vfc3RvcF90eF9xdWV1ZShmaWZvKTsKLQkJZ290byBfZXhpdDI7CisJCWdvdG8gX2V4aXQwOwogCX0KIAogCXZ4Z2VfZGVidWdfdHgoVlhHRV9UUkFDRSwKQEAgLTkzMyw5ICs4MzQsOCBAQAogCiAJaWYgKHVubGlrZWx5KHBjaV9kbWFfbWFwcGluZ19lcnJvcihmaWZvLT5wZGV2LCBkbWFfcG9pbnRlcikpKSB7CiAJCXZ4Z2VfaHdfZmlmb190eGRsX2ZyZWUoZmlmb19odywgZHRyKTsKLQkJdnhnZV9zdG9wX3R4X3F1ZXVlKGZpZm8pOwogCQlmaWZvLT5zdGF0cy5wY2lfbWFwX2ZhaWwrKzsKLQkJZ290byBfZXhpdDI7CisJCWdvdG8gX2V4aXQwOwogCX0KIAogCXR4ZGxfcHJpdiA9IHZ4Z2VfaHdfZmlmb190eGRsX3ByaXZhdGVfZ2V0KGR0cik7CkBAIC05NTgsMTMgKzg1OCwxMiBAQAogCQlpZiAoIWZyYWctPnNpemUpCiAJCQljb250aW51ZTsKIAotCQlkbWFfcG9pbnRlciA9Ci0JCQkodTY0KXBjaV9tYXBfcGFnZShmaWZvLT5wZGV2LCBmcmFnLT5wYWdlLAorCQlkbWFfcG9pbnRlciA9ICh1NjQpIHBjaV9tYXBfcGFnZShmaWZvLT5wZGV2LCBmcmFnLT5wYWdlLAogCQkJCWZyYWctPnBhZ2Vfb2Zmc2V0LCBmcmFnLT5zaXplLAogCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCiAJCWlmICh1bmxpa2VseShwY2lfZG1hX21hcHBpbmdfZXJyb3IoZmlmby0+cGRldiwgZG1hX3BvaW50ZXIpKSkKLQkJCWdvdG8gX2V4aXQwOworCQkJZ290byBfZXhpdDI7CiAJCXZ4Z2VfZGVidWdfdHgoVlhHRV9UUkFDRSwKIAkJCSIlczogJXM6JWQgZnJhZyA9ICVkIGRtYV9wb2ludGVyID0gMHglbGx4IiwKIAkJCQlkZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXywgaSwKQEAgLTk3OSwxMSArODc4LDkgQEAKIAlvZmZsb2FkX3R5cGUgPSB2eGdlX29mZmxvYWRfdHlwZShza2IpOwogCiAJaWYgKG9mZmxvYWRfdHlwZSAmIChTS0JfR1NPX1RDUFY0IHwgU0tCX0dTT19UQ1BWNikpIHsKLQogCQlpbnQgbXNzID0gdnhnZV90Y3BfbXNzKHNrYik7CiAJCWlmIChtc3MpIHsKLQkJCXZ4Z2VfZGVidWdfdHgoVlhHRV9UUkFDRSwKLQkJCQkiJXM6ICVzOiVkIG1zcyA9ICVkIiwKKwkJCXZ4Z2VfZGVidWdfdHgoVlhHRV9UUkFDRSwgIiVzOiAlczolZCBtc3MgPSAlZCIsCiAJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18sIG1zcyk7CiAJCQl2eGdlX2h3X2ZpZm9fdHhkbF9tc3Nfc2V0KGR0ciwgbXNzKTsKIAkJfSBlbHNlIHsKQEAgLTEwMDEsMTkgKzg5OCwxMyBAQAogCQkJCQlWWEdFX0hXX0ZJRk9fVFhEX1RYX0NLT19VRFBfRU4pOwogCiAJdnhnZV9od19maWZvX3R4ZGxfcG9zdChmaWZvX2h3LCBkdHIpOwotI2lmZGVmIE5FVElGX0ZfTExUWAotCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBORVRJRl9GX0xMVFggZHJpdmVyIDooICovCi0jZW5kaWYKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWZvLT50eF9sb2NrLCBmbGFncyk7CiAKLQlWWEdFX0NPTVBMRVRFX1ZQQVRIX1RYKGZpZm8pOwogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsICIlczogJXM6JWQgIEV4aXRpbmcuLi4iLAogCQlkZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAotX2V4aXQwOgorX2V4aXQyOgogCXZ4Z2VfZGVidWdfdHgoVlhHRV9UUkFDRSwgIiVzOiBwY2lfbWFwX3BhZ2UgZmFpbGVkIiwgZGV2LT5uYW1lKTsKLQogX2V4aXQxOgogCWogPSAwOwogCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXTsKQEAgLTEwMjgsMTAgKzkxOSw5IEBACiAJfQogCiAJdnhnZV9od19maWZvX3R4ZGxfZnJlZShmaWZvX2h3LCBkdHIpOwotX2V4aXQyOgorX2V4aXQwOgorCW5ldGlmX3R4X3N0b3BfcXVldWUoZmlmby0+dHhxKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlmby0+dHhfbG9jaywgZmxhZ3MpOwotCVZYR0VfQ09NUExFVEVfVlBBVEhfVFgoZmlmbyk7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQpAQCAtMTEyMSw3ICsxMDExLDggQEAKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCXN0cnVjdCB2eGdlZGV2ICp2ZGV2OwogCWludCBpLCBtY2FzdF9jbnQgPSAwOwotCXN0cnVjdCBfX3Z4Z2VfaHdfZGV2aWNlICAqaGxkZXY7CisJc3RydWN0IF9fdnhnZV9od19kZXZpY2UgKmhsZGV2OworCXN0cnVjdCB2eGdlX3ZwYXRoICp2cGF0aDsKIAllbnVtIHZ4Z2VfaHdfc3RhdHVzIHN0YXR1cyA9IFZYR0VfSFdfT0s7CiAJc3RydWN0IG1hY0luZm8gbWFjX2luZm87CiAJaW50IHZwYXRoX2lkeCA9IDA7CkBAIC0xMTQxLDQ2ICsxMDMyLDQ4IEBACiAKIAlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmICghdmRldi0+YWxsX211bHRpX2ZsZykpIHsKIAkJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKLQkJCXZ4Z2VfYXNzZXJ0KHZkZXYtPnZwYXRoc1tpXS5pc19vcGVuKTsKLQkJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfbWNhc3RfZW5hYmxlKAotCQkJCQkJdmRldi0+dnBhdGhzW2ldLmhhbmRsZSk7CisJCQl2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbaV07CisJCQl2eGdlX2Fzc2VydCh2cGF0aC0+aXNfb3Blbik7CisJCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX21jYXN0X2VuYWJsZSh2cGF0aC0+aGFuZGxlKTsKKwkJCWlmIChzdGF0dXMgIT0gVlhHRV9IV19PSykKKwkJCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsICJmYWlsZWQgdG8gZW5hYmxlICIKKwkJCQkJCSJtdWx0aWNhc3QsIHN0YXR1cyAlZCIsIHN0YXR1cyk7CiAJCQl2ZGV2LT5hbGxfbXVsdGlfZmxnID0gMTsKIAkJfQotCX0gZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmICh2ZGV2LT5hbGxfbXVsdGlfZmxnKSkgeworCX0gZWxzZSBpZiAoIShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAodmRldi0+YWxsX211bHRpX2ZsZykpIHsKIAkJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKLQkJCXZ4Z2VfYXNzZXJ0KHZkZXYtPnZwYXRoc1tpXS5pc19vcGVuKTsKLQkJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfbWNhc3RfZGlzYWJsZSgKLQkJCQkJCXZkZXYtPnZwYXRoc1tpXS5oYW5kbGUpOwotCQkJdmRldi0+YWxsX211bHRpX2ZsZyA9IDE7CisJCQl2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbaV07CisJCQl2eGdlX2Fzc2VydCh2cGF0aC0+aXNfb3Blbik7CisJCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX21jYXN0X2Rpc2FibGUodnBhdGgtPmhhbmRsZSk7CisJCQlpZiAoc3RhdHVzICE9IFZYR0VfSFdfT0spCisJCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLCAiZmFpbGVkIHRvIGRpc2FibGUgIgorCQkJCQkJIm11bHRpY2FzdCwgc3RhdHVzICVkIiwgc3RhdHVzKTsKKwkJCXZkZXYtPmFsbF9tdWx0aV9mbGcgPSAwOwogCQl9CiAJfQogCi0JaWYgKHN0YXR1cyAhPSBWWEdFX0hXX09LKQotCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsCi0JCQkiZmFpbGVkIHRvICVzIG11bHRpY2FzdCwgc3RhdHVzICVkIiwKLQkJCWRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgPwotCQkJImVuYWJsZSIgOiAiZGlzYWJsZSIsIHN0YXR1cyk7CiAKIAlpZiAoIXZkZXYtPmNvbmZpZy5hZGRyX2xlYXJuX2VuKSB7Ci0JCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7Ci0JCQkJdnhnZV9hc3NlcnQodmRldi0+dnBhdGhzW2ldLmlzX29wZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bm9fb2ZfdnBhdGg7IGkrKykgeworCQkJdnBhdGggPSAmdmRldi0+dnBhdGhzW2ldOworCQkJdnhnZV9hc3NlcnQodnBhdGgtPmlzX29wZW4pOworCisJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQogCQkJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfcHJvbWlzY19lbmFibGUoCi0JCQkJCQl2ZGV2LT52cGF0aHNbaV0uaGFuZGxlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7Ci0JCQkJdnhnZV9hc3NlcnQodmRldi0+dnBhdGhzW2ldLmlzX29wZW4pOworCQkJCQl2cGF0aC0+aGFuZGxlKTsKKwkJCWVsc2UKIAkJCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX3Byb21pc2NfZGlzYWJsZSgKLQkJCQkJCXZkZXYtPnZwYXRoc1tpXS5oYW5kbGUpOwotCQkJfQorCQkJCQl2cGF0aC0+aGFuZGxlKTsKKwkJCWlmIChzdGF0dXMgIT0gVlhHRV9IV19PSykKKwkJCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsICJmYWlsZWQgdG8gJXMgcHJvbWlzYyIKKwkJCQkJIiwgc3RhdHVzICVkIiwgZGV2LT5mbGFncyZJRkZfUFJPTUlTQyA/CisJCQkJCSJlbmFibGUiIDogImRpc2FibGUiLCBzdGF0dXMpOwogCQl9CiAJfQogCiAJbWVtc2V0KCZtYWNfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBtYWNJbmZvKSk7CiAJLyogVXBkYXRlIGluZGl2aWR1YWwgTV9DQVNUIGFkZHJlc3MgbGlzdCAqLwogCWlmICgoIXZkZXYtPmFsbF9tdWx0aV9mbGcpICYmIG5ldGRldl9tY19jb3VudChkZXYpKSB7Ci0KIAkJbWNhc3RfY250ID0gdmRldi0+dnBhdGhzWzBdLm1jYXN0X2FkZHJfY250OwogCQlsaXN0X2hlYWQgPSAmdmRldi0+dnBhdGhzWzBdLm1hY19hZGRyX2xpc3Q7CiAJCWlmICgobmV0ZGV2X21jX2NvdW50KGRldikgKwpAQCAtMTE5MCwxNCArMTA4Myw3IEBACiAKIAkJLyogRGVsZXRlIHByZXZpb3VzIE1DJ3MgKi8KIAkJZm9yIChpID0gMDsgaSA8IG1jYXN0X2NudDsgaSsrKSB7Ci0JCQlpZiAoIWxpc3RfZW1wdHkobGlzdF9oZWFkKSkKLQkJCQltYWNfZW50cnkgPSAoc3RydWN0IHZ4Z2VfbWFjX2FkZHJzICopCi0JCQkJCWxpc3RfZmlyc3RfZW50cnkobGlzdF9oZWFkLAotCQkJCQkJc3RydWN0IHZ4Z2VfbWFjX2FkZHJzLAotCQkJCQkJaXRlbSk7Ci0KIAkJCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgbmV4dCwgbGlzdF9oZWFkKSB7Ci0KIAkJCQltYWNfZW50cnkgPSAoc3RydWN0IHZ4Z2VfbWFjX2FkZHJzICopIGVudHJ5OwogCQkJCS8qIENvcHkgdGhlIG1hYyBhZGRyZXNzIHRvIGRlbGV0ZSAqLwogCQkJCW1hY19hZGRyZXNzID0gKHU4ICopJm1hY19lbnRyeS0+bWFjYWRkcjsKQEAgLTEyNDAsOSArMTEyNiw3IEBACiAJCW1jYXN0X2NudCA9IHZkZXYtPnZwYXRoc1swXS5tY2FzdF9hZGRyX2NudDsKIAkJLyogRGVsZXRlIHByZXZpb3VzIE1DJ3MgKi8KIAkJZm9yIChpID0gMDsgaSA8IG1jYXN0X2NudDsgaSsrKSB7Ci0KIAkJCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgbmV4dCwgbGlzdF9oZWFkKSB7Ci0KIAkJCQltYWNfZW50cnkgPSAoc3RydWN0IHZ4Z2VfbWFjX2FkZHJzICopIGVudHJ5OwogCQkJCS8qIENvcHkgdGhlIG1hYyBhZGRyZXNzIHRvIGRlbGV0ZSAqLwogCQkJCW1hY19hZGRyZXNzID0gKHU4ICopJm1hY19lbnRyeS0+bWFjYWRkcjsKQEAgLTEyNjIsOSArMTE0NiwxMCBAQAogCiAJCS8qIEVuYWJsZSBhbGwgbXVsdGljYXN0ICovCiAJCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7Ci0JCQl2eGdlX2Fzc2VydCh2ZGV2LT52cGF0aHNbaV0uaXNfb3Blbik7Ci0JCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX21jYXN0X2VuYWJsZSgKLQkJCQkJCXZkZXYtPnZwYXRoc1tpXS5oYW5kbGUpOworCQkJdnBhdGggPSAmdmRldi0+dnBhdGhzW2ldOworCQkJdnhnZV9hc3NlcnQodnBhdGgtPmlzX29wZW4pOworCisJCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX21jYXN0X2VuYWJsZSh2cGF0aC0+aGFuZGxlKTsKIAkJCWlmIChzdGF0dXMgIT0gVlhHRV9IV19PSykgewogCQkJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX0VSUiwKIAkJCQkJIiVzOiVkIEVuYWJsaW5nIGFsbCBtdWx0aWNhc3RzIGZhaWxlZCIsCkBAIC0xNDI1LDYgKzEzMTAsNyBAQAogc3RhdGljIGludCB2eGdlX3Jlc2V0X3ZwYXRoKHN0cnVjdCB2eGdlZGV2ICp2ZGV2LCBpbnQgdnBfaWQpCiB7CiAJZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXMgPSBWWEdFX0hXX09LOworCXN0cnVjdCB2eGdlX3ZwYXRoICp2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbdnBfaWRdOwogCWludCByZXQgPSAwOwogCiAJLyogY2hlY2sgaWYgZGV2aWNlIGlzIGRvd24gYWxyZWFkeSAqLwpAQCAtMTQzNSwxMiArMTMyMSwxMCBAQAogCWlmICh0ZXN0X2JpdChfX1ZYR0VfU1RBVEVfUkVTRVRfQ0FSRCwgJnZkZXYtPnN0YXRlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodmRldi0+dnBhdGhzW3ZwX2lkXS5oYW5kbGUpIHsKLQkJaWYgKHZ4Z2VfaHdfdnBhdGhfcmVzZXQodmRldi0+dnBhdGhzW3ZwX2lkXS5oYW5kbGUpCi0JCQkJPT0gVlhHRV9IV19PSykgeworCWlmICh2cGF0aC0+aGFuZGxlKSB7CisJCWlmICh2eGdlX2h3X3ZwYXRoX3Jlc2V0KHZwYXRoLT5oYW5kbGUpID09IFZYR0VfSFdfT0spIHsKIAkJCWlmIChpc192eGdlX2NhcmRfdXAodmRldikgJiYKLQkJCQl2eGdlX2h3X3ZwYXRoX3JlY292ZXJfZnJvbV9yZXNldCgKLQkJCQkJdmRldi0+dnBhdGhzW3ZwX2lkXS5oYW5kbGUpCisJCQkJdnhnZV9od192cGF0aF9yZWNvdmVyX2Zyb21fcmVzZXQodnBhdGgtPmhhbmRsZSkKIAkJCQkJIT0gVlhHRV9IV19PSykgewogCQkJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX0VSUiwKIAkJCQkJInZ4Z2VfaHdfdnBhdGhfcmVjb3Zlcl9mcm9tX3Jlc2V0IgpAQCAtMTQ1NiwxMSArMTM0MCwyMCBAQAogCX0gZWxzZQogCQlyZXR1cm4gVlhHRV9IV19GQUlMOwogCi0JdnhnZV9yZXN0b3JlX3ZwYXRoX21hY19hZGRyKCZ2ZGV2LT52cGF0aHNbdnBfaWRdKTsKLQl2eGdlX3Jlc3RvcmVfdnBhdGhfdmlkX3RhYmxlKCZ2ZGV2LT52cGF0aHNbdnBfaWRdKTsKKwl2eGdlX3Jlc3RvcmVfdnBhdGhfbWFjX2FkZHIodnBhdGgpOworCXZ4Z2VfcmVzdG9yZV92cGF0aF92aWRfdGFibGUodnBhdGgpOwogCiAJLyogRW5hYmxlIGFsbCBicm9hZGNhc3QgKi8KLQl2eGdlX2h3X3ZwYXRoX2JjYXN0X2VuYWJsZSh2ZGV2LT52cGF0aHNbdnBfaWRdLmhhbmRsZSk7CisJdnhnZV9od192cGF0aF9iY2FzdF9lbmFibGUodnBhdGgtPmhhbmRsZSk7CisKKwkvKiBFbmFibGUgYWxsIG11bHRpY2FzdCAqLworCWlmICh2ZGV2LT5hbGxfbXVsdGlfZmxnKSB7CisJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfbWNhc3RfZW5hYmxlKHZwYXRoLT5oYW5kbGUpOworCQlpZiAoc3RhdHVzICE9IFZYR0VfSFdfT0spCisJCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsCisJCQkJIiVzOiVkIEVuYWJsaW5nIG11bHRpY2FzdCBmYWlsZWQiLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJfQogCiAJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCiAJdnhnZV92cGF0aF9pbnRyX2VuYWJsZSh2ZGV2LCB2cF9pZCk7CkBAIC0xNDY4LDE3ICsxMzYxLDE4IEBACiAJc21wX3dtYigpOwogCiAJLyogRW5hYmxlIHRoZSBmbG93IG9mIHRyYWZmaWMgdGhyb3VnaCB0aGUgdnBhdGggKi8KLQl2eGdlX2h3X3ZwYXRoX2VuYWJsZSh2ZGV2LT52cGF0aHNbdnBfaWRdLmhhbmRsZSk7CisJdnhnZV9od192cGF0aF9lbmFibGUodnBhdGgtPmhhbmRsZSk7CiAKIAlzbXBfd21iKCk7Ci0JdnhnZV9od192cGF0aF9yeF9kb29yYmVsbF9pbml0KHZkZXYtPnZwYXRoc1t2cF9pZF0uaGFuZGxlKTsKLQl2ZGV2LT52cGF0aHNbdnBfaWRdLnJpbmcubGFzdF9zdGF0dXMgPSBWWEdFX0hXX09LOworCXZ4Z2VfaHdfdnBhdGhfcnhfZG9vcmJlbGxfaW5pdCh2cGF0aC0+aGFuZGxlKTsKKwl2cGF0aC0+cmluZy5sYXN0X3N0YXR1cyA9IFZYR0VfSFdfT0s7CiAKIAkvKiBWcGF0aCByZXNldCBkb25lICovCiAJY2xlYXJfYml0KHZwX2lkLCAmdmRldi0+dnBfcmVzZXQpOwogCiAJLyogU3RhcnQgdGhlIHZwYXRoIHF1ZXVlICovCi0JdnhnZV93YWtlX3R4X3F1ZXVlKCZ2ZGV2LT52cGF0aHNbdnBfaWRdLmZpZm8sIE5VTEwpOworCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHZwYXRoLT5maWZvLnR4cSkpCisJCW5ldGlmX3R4X3dha2VfcXVldWUodnBhdGgtPmZpZm8udHhxKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTEyLDkgKzE0MDYsOSBAQAogCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAogCQkJCSIlczogZXhlY3V0aW9uIG1vZGUgaXMgZGVidWcsIHJldHVybmluZy4uIiwKIAkJCQl2ZGV2LT5uZGV2LT5uYW1lKTsKLQkJY2xlYXJfYml0KF9fVlhHRV9TVEFURV9DQVJEX1VQLCAmdmRldi0+c3RhdGUpOwotCQl2eGdlX3N0b3BfYWxsX3R4X3F1ZXVlKHZkZXYpOwotCQlyZXR1cm4gMDsKKwkJCWNsZWFyX2JpdChfX1ZYR0VfU1RBVEVfQ0FSRF9VUCwgJnZkZXYtPnN0YXRlKTsKKwkJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyh2ZGV2LT5uZGV2KTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCkBAIC0xNTIzLDcgKzE0MTcsNyBAQAogCiAJCXN3aXRjaCAodmRldi0+Y3JpY19lcnJfZXZlbnQpIHsKIAkJY2FzZSBWWEdFX0hXX0VWRU5UX1VOS05PV046Ci0JCQl2eGdlX3N0b3BfYWxsX3R4X3F1ZXVlKHZkZXYpOworCQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHZkZXYtPm5kZXYpOwogCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAogCQkJCSJmYXRhbDogJXM6IERpc2FibGluZyBkZXZpY2UgZHVlIHRvIgogCQkJCSJ1bmtub3duIGVycm9yIiwKQEAgLTE1NDQsNyArMTQzOCw3IEBACiAJCWNhc2UgVlhHRV9IV19FVkVOVF9WUEFUSF9FUlI6CiAJCQlicmVhazsKIAkJY2FzZSBWWEdFX0hXX0VWRU5UX0NSSVRJQ0FMX0VSUjoKLQkJCXZ4Z2Vfc3RvcF9hbGxfdHhfcXVldWUodmRldik7CisJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXModmRldi0+bmRldik7CiAJCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsCiAJCQkJImZhdGFsOiAlczogRGlzYWJsaW5nIGRldmljZSBkdWUgdG8iCiAJCQkJInNlcmlvdXMgZXJyb3IiLApAQCAtMTU1NCw3ICsxNDQ4LDcgQEAKIAkJCXJldCA9IC1FUEVSTTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIFZYR0VfSFdfRVZFTlRfU0VSUjoKLQkJCXZ4Z2Vfc3RvcF9hbGxfdHhfcXVldWUodmRldik7CisJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXModmRldi0+bmRldik7CiAJCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsCiAJCQkJImZhdGFsOiAlczogRGlzYWJsaW5nIGRldmljZSBkdWUgdG8iCiAJCQkJInNlcmlvdXMgZXJyb3IiLApAQCAtMTU2Niw3ICsxNDYwLDcgQEAKIAkJCXJldCA9IC1FUEVSTTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIFZYR0VfSFdfRVZFTlRfU0xPVF9GUkVFWkU6Ci0JCQl2eGdlX3N0b3BfYWxsX3R4X3F1ZXVlKHZkZXYpOworCQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHZkZXYtPm5kZXYpOwogCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAogCQkJCSJmYXRhbDogJXM6IERpc2FibGluZyBkZXZpY2UgZHVlIHRvIgogCQkJCSJzbG90IGZyZWV6ZSIsCkBAIC0xNTgwLDcgKzE0NzQsNyBAQAogCX0KIAogCWlmICgoZXZlbnQgPT0gVlhHRV9MTF9GVUxMX1JFU0VUKSB8fCAoZXZlbnQgPT0gVlhHRV9MTF9TVEFSVF9SRVNFVCkpCi0JCXZ4Z2Vfc3RvcF9hbGxfdHhfcXVldWUodmRldik7CisJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyh2ZGV2LT5uZGV2KTsKIAogCWlmIChldmVudCA9PSBWWEdFX0xMX0ZVTExfUkVTRVQpIHsKIAkJc3RhdHVzID0gdnhnZV9yZXNldF9hbGxfdnBhdGhzKHZkZXYpOwpAQCAtMTY0MCw3ICsxNTM0LDcgQEAKIAkJCXZ4Z2VfaHdfdnBhdGhfcnhfZG9vcmJlbGxfaW5pdCh2ZGV2LT52cGF0aHNbaV0uaGFuZGxlKTsKIAkJfQogCi0JCXZ4Z2Vfd2FrZV9hbGxfdHhfcXVldWUodmRldik7CisJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyh2ZGV2LT5uZGV2KTsKIAl9CiAKIG91dDoKQEAgLTE2NjEsOCArMTU1NSw3IEBACiAgKi8KIGludCB2eGdlX3Jlc2V0KHN0cnVjdCB2eGdlZGV2ICp2ZGV2KQogewotCWRvX3Z4Z2VfcmVzZXQodmRldiwgVlhHRV9MTF9GVUxMX1JFU0VUKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZG9fdnhnZV9yZXNldCh2ZGV2LCBWWEdFX0xMX0ZVTExfUkVTRVQpOwogfQogCiAvKioKQEAgLTIwMjUsMTcgKzE5MTgsMTcgQEAKIC8qIHJlc2V0IHZwYXRocyAqLwogZW51bSB2eGdlX2h3X3N0YXR1cyB2eGdlX3Jlc2V0X2FsbF92cGF0aHMoc3RydWN0IHZ4Z2VkZXYgKnZkZXYpCiB7Ci0JaW50IGk7CiAJZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXMgPSBWWEdFX0hXX09LOworCXN0cnVjdCB2eGdlX3ZwYXRoICp2cGF0aDsKKwlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKQotCQlpZiAodmRldi0+dnBhdGhzW2ldLmhhbmRsZSkgewotCQkJaWYgKHZ4Z2VfaHdfdnBhdGhfcmVzZXQodmRldi0+dnBhdGhzW2ldLmhhbmRsZSkKLQkJCQkJPT0gVlhHRV9IV19PSykgeworCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7CisJCXZwYXRoID0gJnZkZXYtPnZwYXRoc1tpXTsKKwkJaWYgKHZwYXRoLT5oYW5kbGUpIHsKKwkJCWlmICh2eGdlX2h3X3ZwYXRoX3Jlc2V0KHZwYXRoLT5oYW5kbGUpID09IFZYR0VfSFdfT0spIHsKIAkJCQlpZiAoaXNfdnhnZV9jYXJkX3VwKHZkZXYpICYmCiAJCQkJCXZ4Z2VfaHdfdnBhdGhfcmVjb3Zlcl9mcm9tX3Jlc2V0KAotCQkJCQkJdmRldi0+dnBhdGhzW2ldLmhhbmRsZSkKLQkJCQkJCSE9IFZYR0VfSFdfT0spIHsKKwkJCQkJCXZwYXRoLT5oYW5kbGUpICE9IFZYR0VfSFdfT0spIHsKIAkJCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAogCQkJCQkJInZ4Z2VfaHdfdnBhdGhfcmVjb3Zlcl8iCiAJCQkJCQkiZnJvbV9yZXNldCBmYWlsZWQgZm9yIHZwYXRoOiAiCkBAIC0yMDQ5LDgzICsxOTQyLDkzIEBACiAJCQkJCXJldHVybiBzdGF0dXM7CiAJCQl9CiAJCX0KKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBjbG9zZSB2cGF0aHMgKi8KIHZvaWQgdnhnZV9jbG9zZV92cGF0aHMoc3RydWN0IHZ4Z2VkZXYgKnZkZXYsIGludCBpbmRleCkKIHsKKwlzdHJ1Y3QgdnhnZV92cGF0aCAqdnBhdGg7CiAJaW50IGk7CisKIAlmb3IgKGkgPSBpbmRleDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKLQkJaWYgKHZkZXYtPnZwYXRoc1tpXS5oYW5kbGUgJiYgdmRldi0+dnBhdGhzW2ldLmlzX29wZW4pIHsKLQkJCXZ4Z2VfaHdfdnBhdGhfY2xvc2UodmRldi0+dnBhdGhzW2ldLmhhbmRsZSk7CisJCXZwYXRoID0gJnZkZXYtPnZwYXRoc1tpXTsKKworCQlpZiAodnBhdGgtPmhhbmRsZSAmJiB2cGF0aC0+aXNfb3BlbikgeworCQkJdnhnZV9od192cGF0aF9jbG9zZSh2cGF0aC0+aGFuZGxlKTsKIAkJCXZkZXYtPnN0YXRzLnZwYXRoc19vcGVuLS07CiAJCX0KLQkJdmRldi0+dnBhdGhzW2ldLmlzX29wZW4gPSAwOwotCQl2ZGV2LT52cGF0aHNbaV0uaGFuZGxlICA9IE5VTEw7CisJCXZwYXRoLT5pc19vcGVuID0gMDsKKwkJdnBhdGgtPmhhbmRsZSA9IE5VTEw7CiAJfQogfQogCiAvKiBvcGVuIHZwYXRocyAqLwogaW50IHZ4Z2Vfb3Blbl92cGF0aHMoc3RydWN0IHZ4Z2VkZXYgKnZkZXYpCiB7Ci0JZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXM7Ci0JaW50IGk7Ci0JdTMyIHZwX2lkID0gMDsKIAlzdHJ1Y3QgdnhnZV9od192cGF0aF9hdHRyIGF0dHI7CisJZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHZ4Z2VfdnBhdGggKnZwYXRoOworCXUzMiB2cF9pZCA9IDA7CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bm9fb2ZfdnBhdGg7IGkrKykgewotCQl2eGdlX2Fzc2VydCh2ZGV2LT52cGF0aHNbaV0uaXNfY29uZmlndXJlZCk7Ci0JCWF0dHIudnBfaWQgPSB2ZGV2LT52cGF0aHNbaV0uZGV2aWNlX2lkOworCQl2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbaV07CisKKwkJdnhnZV9hc3NlcnQodnBhdGgtPmlzX2NvbmZpZ3VyZWQpOworCQlhdHRyLnZwX2lkID0gdnBhdGgtPmRldmljZV9pZDsKIAkJYXR0ci5maWZvX2F0dHIuY2FsbGJhY2sgPSB2eGdlX3htaXRfY29tcGw7CiAJCWF0dHIuZmlmb19hdHRyLnR4ZGxfdGVybSA9IHZ4Z2VfdHhfdGVybTsKIAkJYXR0ci5maWZvX2F0dHIucGVyX3R4ZGxfc3BhY2UgPSBzaXplb2Yoc3RydWN0IHZ4Z2VfdHhfcHJpdik7Ci0JCWF0dHIuZmlmb19hdHRyLnVzZXJkYXRhID0gKHZvaWQgKikmdmRldi0+dnBhdGhzW2ldLmZpZm87CisJCWF0dHIuZmlmb19hdHRyLnVzZXJkYXRhID0gJnZwYXRoLT5maWZvOwogCiAJCWF0dHIucmluZ19hdHRyLmNhbGxiYWNrID0gdnhnZV9yeF8xYl9jb21wbDsKIAkJYXR0ci5yaW5nX2F0dHIucnhkX2luaXQgPSB2eGdlX3J4X2luaXRpYWxfcmVwbGVuaXNoOwogCQlhdHRyLnJpbmdfYXR0ci5yeGRfdGVybSA9IHZ4Z2VfcnhfdGVybTsKIAkJYXR0ci5yaW5nX2F0dHIucGVyX3J4ZF9zcGFjZSA9IHNpemVvZihzdHJ1Y3QgdnhnZV9yeF9wcml2KTsKLQkJYXR0ci5yaW5nX2F0dHIudXNlcmRhdGEgPSAodm9pZCAqKSZ2ZGV2LT52cGF0aHNbaV0ucmluZzsKKwkJYXR0ci5yaW5nX2F0dHIudXNlcmRhdGEgPSAmdnBhdGgtPnJpbmc7CiAKLQkJdmRldi0+dnBhdGhzW2ldLnJpbmcubmRldiA9IHZkZXYtPm5kZXY7Ci0JCXZkZXYtPnZwYXRoc1tpXS5yaW5nLnBkZXYgPSB2ZGV2LT5wZGV2OwotCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX29wZW4odmRldi0+ZGV2aCwgJmF0dHIsCi0JCQkJJih2ZGV2LT52cGF0aHNbaV0uaGFuZGxlKSk7CisJCXZwYXRoLT5yaW5nLm5kZXYgPSB2ZGV2LT5uZGV2OworCQl2cGF0aC0+cmluZy5wZGV2ID0gdmRldi0+cGRldjsKKwkJc3RhdHVzID0gdnhnZV9od192cGF0aF9vcGVuKHZkZXYtPmRldmgsICZhdHRyLCAmdnBhdGgtPmhhbmRsZSk7CiAJCWlmIChzdGF0dXMgPT0gVlhHRV9IV19PSykgewotCQkJdmRldi0+dnBhdGhzW2ldLmZpZm8uaGFuZGxlID0KKwkJCXZwYXRoLT5maWZvLmhhbmRsZSA9CiAJCQkgICAgKHN0cnVjdCBfX3Z4Z2VfaHdfZmlmbyAqKWF0dHIuZmlmb19hdHRyLnVzZXJkYXRhOwotCQkJdmRldi0+dnBhdGhzW2ldLnJpbmcuaGFuZGxlID0KKwkJCXZwYXRoLT5yaW5nLmhhbmRsZSA9CiAJCQkgICAgKHN0cnVjdCBfX3Z4Z2VfaHdfcmluZyAqKWF0dHIucmluZ19hdHRyLnVzZXJkYXRhOwotCQkJdmRldi0+dnBhdGhzW2ldLmZpZm8udHhfc3RlZXJpbmdfdHlwZSA9CisJCQl2cGF0aC0+Zmlmby50eF9zdGVlcmluZ190eXBlID0KIAkJCQl2ZGV2LT5jb25maWcudHhfc3RlZXJpbmdfdHlwZTsKLQkJCXZkZXYtPnZwYXRoc1tpXS5maWZvLm5kZXYgPSB2ZGV2LT5uZGV2OwotCQkJdmRldi0+dnBhdGhzW2ldLmZpZm8ucGRldiA9IHZkZXYtPnBkZXY7Ci0JCQl2ZGV2LT52cGF0aHNbaV0uZmlmby5pbmRpY2F0ZV9tYXhfcGt0cyA9CisJCQl2cGF0aC0+Zmlmby5uZGV2ID0gdmRldi0+bmRldjsKKwkJCXZwYXRoLT5maWZvLnBkZXYgPSB2ZGV2LT5wZGV2OworCQkJaWYgKHZkZXYtPmNvbmZpZy50eF9zdGVlcmluZ190eXBlKQorCQkJCXZwYXRoLT5maWZvLnR4cSA9CisJCQkJCW5ldGRldl9nZXRfdHhfcXVldWUodmRldi0+bmRldiwgaSk7CisJCQllbHNlCisJCQkJdnBhdGgtPmZpZm8udHhxID0KKwkJCQkJbmV0ZGV2X2dldF90eF9xdWV1ZSh2ZGV2LT5uZGV2LCAwKTsKKwkJCXZwYXRoLT5maWZvLmluZGljYXRlX21heF9wa3RzID0KIAkJCQl2ZGV2LT5jb25maWcuZmlmb19pbmRpY2F0ZV9tYXhfcGt0czsKLQkJCXZkZXYtPnZwYXRoc1tpXS5yaW5nLnJ4X3ZlY3Rvcl9ubyA9IDA7Ci0JCQl2ZGV2LT52cGF0aHNbaV0ucmluZy5yeF9jc3VtID0gdmRldi0+cnhfY3N1bTsKLQkJCXZkZXYtPnZwYXRoc1tpXS5pc19vcGVuID0gMTsKLQkJCXZkZXYtPnZwX2hhbmRsZXNbaV0gPSB2ZGV2LT52cGF0aHNbaV0uaGFuZGxlOwotCQkJdmRldi0+dnBhdGhzW2ldLnJpbmcuZ3JvX2VuYWJsZSA9Ci0JCQkJCQl2ZGV2LT5jb25maWcuZ3JvX2VuYWJsZTsKLQkJCXZkZXYtPnZwYXRoc1tpXS5yaW5nLnZsYW5fdGFnX3N0cmlwID0KLQkJCQkJCXZkZXYtPnZsYW5fdGFnX3N0cmlwOworCQkJdnBhdGgtPnJpbmcucnhfdmVjdG9yX25vID0gMDsKKwkJCXZwYXRoLT5yaW5nLnJ4X2NzdW0gPSB2ZGV2LT5yeF9jc3VtOworCQkJdnBhdGgtPmlzX29wZW4gPSAxOworCQkJdmRldi0+dnBfaGFuZGxlc1tpXSA9IHZwYXRoLT5oYW5kbGU7CisJCQl2cGF0aC0+cmluZy5ncm9fZW5hYmxlID0gdmRldi0+Y29uZmlnLmdyb19lbmFibGU7CisJCQl2cGF0aC0+cmluZy52bGFuX3RhZ19zdHJpcCA9IHZkZXYtPnZsYW5fdGFnX3N0cmlwOwogCQkJdmRldi0+c3RhdHMudnBhdGhzX29wZW4rKzsKIAkJfSBlbHNlIHsKIAkJCXZkZXYtPnN0YXRzLnZwYXRoX29wZW5fZmFpbCsrOwogCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAogCQkJCSIlczogdnBhdGg6ICVkIGZhaWxlZCB0byBvcGVuICIKIAkJCQkid2l0aCBzdGF0dXM6ICVkIiwKLQkJCSAgICB2ZGV2LT5uZGV2LT5uYW1lLCB2ZGV2LT52cGF0aHNbaV0uZGV2aWNlX2lkLAorCQkJICAgIHZkZXYtPm5kZXYtPm5hbWUsIHZwYXRoLT5kZXZpY2VfaWQsCiAJCQkJc3RhdHVzKTsKIAkJCXZ4Z2VfY2xvc2VfdnBhdGhzKHZkZXYsIDApOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQogCi0JCXZwX2lkID0KLQkJICAoKHN0cnVjdCBfX3Z4Z2VfaHdfdnBhdGhfaGFuZGxlICopdmRldi0+dnBhdGhzW2ldLmhhbmRsZSktPgotCQkgIHZwYXRoLT52cF9pZDsKKwkJdnBfaWQgPSB2cGF0aC0+aGFuZGxlLT52cGF0aC0+dnBfaWQ7CiAJCXZkZXYtPnZwYXRoc19kZXBsb3llZCB8PSB2eGdlX21CSVQodnBfaWQpOwogCX0KIAlyZXR1cm4gVlhHRV9IV19PSzsKQEAgLTIyOTksNyArMjIwMiw2IEBACiAJdmRldi0+dnhnZV9lbnRyaWVzW2pdLmluX3VzZSA9IDA7CiAKIAlyZXQgPSBwY2lfZW5hYmxlX21zaXgodmRldi0+cGRldiwgdmRldi0+ZW50cmllcywgdmRldi0+aW50cl9jbnQpOwotCiAJaWYgKHJldCA+IDApIHsKIAkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAogCQkJIiVzOiBNU0ktWCBlbmFibGUgZmFpbGVkIGZvciAlZCB2ZWN0b3JzLCByZXQ6ICVkIiwKQEAgLTIzNDUsMTcgKzIyNDcsMTYgQEAKIAlyZXQgPSB2eGdlX2FsbG9jX21zaXgodmRldik7CiAJaWYgKCFyZXQpIHsKIAkJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKKwkJCXN0cnVjdCB2eGdlX3ZwYXRoICp2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbaV07CiAKLQkJCS8qIElmIGZpZm8gb3IgcmluZyBhcmUgbm90IGVuYWJsZWQKLQkJCSAgIHRoZSBNU0lYIHZlY3RvciBmb3IgdGhhdCBzaG91bGQgYmUgc2V0IHRvIDAKLQkJCSAgIEhlbmNlIGluaXRpYWxpemVpbmcgdGhpcyBhcnJheSB0byBhbGwgMHMuCi0JCQkqLwotCQkJdmRldi0+dnBhdGhzW2ldLnJpbmcucnhfdmVjdG9yX25vID0KLQkJCQkodmRldi0+dnBhdGhzW2ldLmRldmljZV9pZCAqCi0JCQkJCVZYR0VfSFdfVlBBVEhfTVNJWF9BQ1RJVkUpICsgMTsKKwkJCS8qIElmIGZpZm8gb3IgcmluZyBhcmUgbm90IGVuYWJsZWQsIHRoZSBNU0lYIHZlY3RvciBmb3IKKwkJCSAqIGl0IHNob3VsZCBiZSBzZXQgdG8gMC4KKwkJCSAqLworCQkJdnBhdGgtPnJpbmcucnhfdmVjdG9yX25vID0gKHZwYXRoLT5kZXZpY2VfaWQgKgorCQkJCQkJVlhHRV9IV19WUEFUSF9NU0lYX0FDVElWRSkgKyAxOwogCi0JCQl2eGdlX2h3X3ZwYXRoX21zaXhfc2V0KHZkZXYtPnZwYXRoc1tpXS5oYW5kbGUsCi0JCQkJCXRpbV9tc2l4X2lkLCBWWEdFX0FMQVJNX01TSVhfSUQpOworCQkJdnhnZV9od192cGF0aF9tc2l4X3NldCh2cGF0aC0+aGFuZGxlLCB0aW1fbXNpeF9pZCwKKwkJCQkJICAgICAgIFZYR0VfQUxBUk1fTVNJWF9JRCk7CiAJCX0KIAl9CiAKQEAgLTI1NzAsOSArMjQ3MSwxMCBAQAogc3RhdGljIHZvaWQgdnhnZV9wb2xsX3ZwX2xvY2t1cCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHZ4Z2VkZXYgKnZkZXYgPSAoc3RydWN0IHZ4Z2VkZXYgKilkYXRhOwotCWludCBpOwotCXN0cnVjdCB2eGdlX3JpbmcgKnJpbmc7CiAJZW51bSB2eGdlX2h3X3N0YXR1cyBzdGF0dXMgPSBWWEdFX0hXX09LOworCXN0cnVjdCB2eGdlX3ZwYXRoICp2cGF0aDsKKwlzdHJ1Y3QgdnhnZV9yaW5nICpyaW5nOworCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKIAkJcmluZyA9ICZ2ZGV2LT52cGF0aHNbaV0ucmluZzsKQEAgLTI1ODYsMTMgKzI0ODgsMTMgQEAKIAogCQkJCS8qIHNjaGVkdWxlIHZwYXRoIHJlc2V0ICovCiAJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGksICZ2ZGV2LT52cF9yZXNldCkpIHsKKwkJCQkJdnBhdGggPSAmdmRldi0+dnBhdGhzW2ldOwogCiAJCQkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcyB2cGF0aCAqLwogCQkJCQl2eGdlX3ZwYXRoX2ludHJfZGlzYWJsZSh2ZGV2LCBpKTsKIAogCQkJCQkvKiBzdG9wIHRoZSBxdWV1ZSBmb3IgdGhpcyB2cGF0aCAqLwotCQkJCQl2eGdlX3N0b3BfdHhfcXVldWUoJnZkZXYtPnZwYXRoc1tpXS4KLQkJCQkJCQkJZmlmbyk7CisJCQkJCW5ldGlmX3R4X3N0b3BfcXVldWUodnBhdGgtPmZpZm8udHhxKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJfQpAQCAtMjYyMSw2ICsyNTIzLDcgQEAKIAllbnVtIHZ4Z2VfaHdfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgdnhnZWRldiAqdmRldjsKIAlzdHJ1Y3QgX192eGdlX2h3X2RldmljZSAqaGxkZXY7CisJc3RydWN0IHZ4Z2VfdnBhdGggKnZwYXRoOwogCWludCByZXQgPSAwOwogCWludCBpOwogCXU2NCB2YWw2NCwgZnVuY3Rpb25fbW9kZTsKQEAgLTI2NTQsMjAgKzI1NTcsMjEgQEAKIAkJZ290byBvdXQxOwogCX0KIAotCiAJaWYgKHZkZXYtPmNvbmZpZy5pbnRyX3R5cGUgIT0gTVNJX1gpIHsKIAkJbmV0aWZfbmFwaV9hZGQoZGV2LCAmdmRldi0+bmFwaSwgdnhnZV9wb2xsX2ludGEsCiAJCQl2ZGV2LT5jb25maWcubmFwaV93ZWlnaHQpOwogCQluYXBpX2VuYWJsZSgmdmRldi0+bmFwaSk7Ci0JCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKQotCQkJdmRldi0+dnBhdGhzW2ldLnJpbmcubmFwaV9wID0gJnZkZXYtPm5hcGk7CisJCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7CisJCQl2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbaV07CisJCQl2cGF0aC0+cmluZy5uYXBpX3AgPSAmdmRldi0+bmFwaTsKKwkJfQogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7Ci0JCQluZXRpZl9uYXBpX2FkZChkZXYsICZ2ZGV2LT52cGF0aHNbaV0ucmluZy5uYXBpLAorCQkJdnBhdGggPSAmdmRldi0+dnBhdGhzW2ldOworCQkJbmV0aWZfbmFwaV9hZGQoZGV2LCAmdnBhdGgtPnJpbmcubmFwaSwKIAkJCSAgICB2eGdlX3BvbGxfbXNpeCwgdmRldi0+Y29uZmlnLm5hcGlfd2VpZ2h0KTsKLQkJCW5hcGlfZW5hYmxlKCZ2ZGV2LT52cGF0aHNbaV0ucmluZy5uYXBpKTsKLQkJCXZkZXYtPnZwYXRoc1tpXS5yaW5nLm5hcGlfcCA9Ci0JCQkJJnZkZXYtPnZwYXRoc1tpXS5yaW5nLm5hcGk7CisJCQluYXBpX2VuYWJsZSgmdnBhdGgtPnJpbmcubmFwaSk7CisJCQl2cGF0aC0+cmluZy5uYXBpX3AgPSAmdnBhdGgtPnJpbmcubmFwaTsKIAkJfQogCX0KIApAQCAtMjY4NCw5ICsyNTg4LDEwIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKKwkJdnBhdGggPSAmdmRldi0+dnBhdGhzW2ldOworCiAJCS8qIHNldCBpbml0aWFsIG10dSBiZWZvcmUgZW5hYmxpbmcgdGhlIGRldmljZSAqLwotCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX210dV9zZXQodmRldi0+dnBhdGhzW2ldLmhhbmRsZSwKLQkJCQkJCXZkZXYtPm10dSk7CisJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfbXR1X3NldCh2cGF0aC0+aGFuZGxlLCB2ZGV2LT5tdHUpOwogCQlpZiAoc3RhdHVzICE9IFZYR0VfSFdfT0spIHsKIAkJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX0VSUiwKIAkJCQkiJXM6IGZhdGFsOiBjYW4gbm90IHNldCBuZXcgTVRVIiwgZGV2LT5uYW1lKTsKQEAgLTI3MDAsMTAgKzI2MDUsMjEgQEAKIAkJIiVzOiBNVFUgaXMgJWQiLCB2ZGV2LT5uZGV2LT5uYW1lLCB2ZGV2LT5tdHUpOwogCVZYR0VfREVWSUNFX0RFQlVHX0xFVkVMX1NFVChWWEdFX0VSUiwgVlhHRV9DT01QT05FTlRfTEwsIHZkZXYpOwogCi0JLyogUmVwcm9ncmFtIHRoZSBEQSB0YWJsZSB3aXRoIHBvcHVsYXRlZCBtYWMgYWRkcmVzc2VzICovCi0JZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKLQkJdnhnZV9yZXN0b3JlX3ZwYXRoX21hY19hZGRyKCZ2ZGV2LT52cGF0aHNbaV0pOwotCQl2eGdlX3Jlc3RvcmVfdnBhdGhfdmlkX3RhYmxlKCZ2ZGV2LT52cGF0aHNbaV0pOworCS8qIFJlc3RvcmUgdGhlIERBLCBWSUQgdGFibGUgYW5kIGFsc28gbXVsdGljYXN0IGFuZCBwcm9taXNjdW91cyBtb2RlCisJICogc3RhdGVzCisJICovCisJaWYgKHZkZXYtPmFsbF9tdWx0aV9mbGcpIHsKKwkJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKKwkJCXZwYXRoID0gJnZkZXYtPnZwYXRoc1tpXTsKKwkJCXZ4Z2VfcmVzdG9yZV92cGF0aF9tYWNfYWRkcih2cGF0aCk7CisJCQl2eGdlX3Jlc3RvcmVfdnBhdGhfdmlkX3RhYmxlKHZwYXRoKTsKKworCQkJc3RhdHVzID0gdnhnZV9od192cGF0aF9tY2FzdF9lbmFibGUodnBhdGgtPmhhbmRsZSk7CisJCQlpZiAoc3RhdHVzICE9IFZYR0VfSFdfT0spCisJCQkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAorCQkJCQkiJXM6JWQgRW5hYmxpbmcgbXVsdGljYXN0IGZhaWxlZCIsCisJCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCX0KIAl9CiAKIAkvKiBFbmFibGUgdnBhdGggdG8gc25pZmYgYWxsIHVuaWNhc3QvbXVsdGljYXN0IHRyYWZmaWMgdGhhdCBub3QKQEAgLTI3MzIsMTQgKzI2NDgsMTQgQEAKIAogCS8qIEVuYWJsaW5nIEJjYXN0IGFuZCBtY2FzdCBmb3IgYWxsIHZwYXRoICovCiAJZm9yIChpID0gMDsgaSA8IHZkZXYtPm5vX29mX3ZwYXRoOyBpKyspIHsKLQkJc3RhdHVzID0gdnhnZV9od192cGF0aF9iY2FzdF9lbmFibGUodmRldi0+dnBhdGhzW2ldLmhhbmRsZSk7CisJCXZwYXRoID0gJnZkZXYtPnZwYXRoc1tpXTsKKwkJc3RhdHVzID0gdnhnZV9od192cGF0aF9iY2FzdF9lbmFibGUodnBhdGgtPmhhbmRsZSk7CiAJCWlmIChzdGF0dXMgIT0gVlhHRV9IV19PSykKIAkJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX0VSUiwKIAkJCQkiJXMgOiBDYW4gbm90IGVuYWJsZSBiY2FzdCBmb3IgdnBhdGggIgogCQkJCSJpZCAlZCIsIGRldi0+bmFtZSwgaSk7CiAJCWlmICh2ZGV2LT5jb25maWcuYWRkcl9sZWFybl9lbikgewotCQkJc3RhdHVzID0KLQkJCSAgICB2eGdlX2h3X3ZwYXRoX21jYXN0X2VuYWJsZSh2ZGV2LT52cGF0aHNbaV0uaGFuZGxlKTsKKwkJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfbWNhc3RfZW5hYmxlKHZwYXRoLT5oYW5kbGUpOwogCQkJaWYgKHN0YXR1cyAhPSBWWEdFX0hXX09LKQogCQkJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX0VSUiwKIAkJCQkJIiVzIDogQ2FuIG5vdCBlbmFibGUgbWNhc3QgZm9yIHZwYXRoICIKQEAgLTI3NjUsNyArMjY4MSw3IEBACiAKIAlpZiAodnhnZV9od19kZXZpY2VfbGlua19zdGF0ZV9nZXQodmRldi0+ZGV2aCkgPT0gVlhHRV9IV19MSU5LX1VQKSB7CiAJCW5ldGlmX2NhcnJpZXJfb24odmRldi0+bmRldik7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IExpbmsgVXBcbiIsIHZkZXYtPm5kZXYtPm5hbWUpOworCQluZXRkZXZfbm90aWNlKHZkZXYtPm5kZXYsICJMaW5rIFVwXG4iKTsKIAkJdmRldi0+c3RhdHMubGlua191cCsrOwogCX0KIApAQCAtMjc3NCwxMiArMjY5MCwxNCBAQAogCXNtcF93bWIoKTsKIAogCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7Ci0JCXZ4Z2VfaHdfdnBhdGhfZW5hYmxlKHZkZXYtPnZwYXRoc1tpXS5oYW5kbGUpOworCQl2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbaV07CisKKwkJdnhnZV9od192cGF0aF9lbmFibGUodnBhdGgtPmhhbmRsZSk7CiAJCXNtcF93bWIoKTsKLQkJdnhnZV9od192cGF0aF9yeF9kb29yYmVsbF9pbml0KHZkZXYtPnZwYXRoc1tpXS5oYW5kbGUpOworCQl2eGdlX2h3X3ZwYXRoX3J4X2Rvb3JiZWxsX2luaXQodnBhdGgtPmhhbmRsZSk7CiAJfQogCi0JdnhnZV9zdGFydF9hbGxfdHhfcXVldWUodmRldik7CisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyh2ZGV2LT5uZGV2KTsKIAlnb3RvIG91dDA7CiAKIG91dDI6CkBAIC0yOTAxLDggKzI4MTksOCBAQAogCX0KIAogCW5ldGlmX2NhcnJpZXJfb2ZmKHZkZXYtPm5kZXYpOwotCXByaW50ayhLRVJOX05PVElDRSAiJXM6IExpbmsgRG93blxuIiwgdmRldi0+bmRldi0+bmFtZSk7Ci0JdnhnZV9zdG9wX2FsbF90eF9xdWV1ZSh2ZGV2KTsKKwluZXRkZXZfbm90aWNlKHZkZXYtPm5kZXYsICJMaW5rIERvd25cbiIpOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyh2ZGV2LT5uZGV2KTsKIAogCS8qIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHhtaXQoKSBpcyBzdG9wcGVkIGJ5IHVwcGVyIGxheWVyICovCiAJaWYgKGRvX2lvKQpAQCAtMzIxMSwxMSArMzEyOSwxMSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCWVudW0gdnhnZV9od19zdGF0dXMgc3RhdHVzID0gVlhHRV9IV19PSzsKIAlzdHJ1Y3QgdnhnZWRldiAqdmRldjsKLQlpbnQgaSwgcmV0ID0gMCwgbm9fb2ZfcXVldWUgPSAxOworCWludCByZXQgPSAwLCBub19vZl9xdWV1ZSA9IDE7CiAJdTY0IHN0YXQ7CiAKIAkqdmRldl9vdXQgPSBOVUxMOwotCWlmIChjb25maWctPnR4X3N0ZWVyaW5nX3R5cGUgPT0gVFhfTVVMVElRX1NURUVSSU5HKQorCWlmIChjb25maWctPnR4X3N0ZWVyaW5nX3R5cGUpCiAJCW5vX29mX3F1ZXVlID0gbm9fb2ZfdnBhdGg7CiAKIAluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCB2eGdlZGV2KSwKQEAgLTMyODQsMTYgKzMyMDIsNiBAQAogCWlmICh2ZGV2LT5jb25maWcuZ3JvX2VuYWJsZSkKIAkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CiAKLQlpZiAodmRldi0+Y29uZmlnLnR4X3N0ZWVyaW5nX3R5cGUgPT0gVFhfTVVMVElRX1NURUVSSU5HKQotCQluZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSBub19vZl92cGF0aDsKLQotI2lmZGVmIE5FVElGX0ZfTExUWAotCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IG5vX29mX3ZwYXRoOyBpKyspCi0JCXNwaW5fbG9ja19pbml0KCZ2ZGV2LT52cGF0aHNbaV0uZmlmby50eF9sb2NrKTsKLQogCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikpIHsKIAkJdnhnZV9kZWJ1Z19pbml0KHZ4Z2VfaHdfZGV2aWNlX3RyYWNlX2xldmVsX2dldChobGRldiksCiAJCQkiJXM6ICVzIDogZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQhIiwKQEAgLTMzOTMsNiArMzMwMSw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhsZGV2LT5uZGV2OwogCXN0cnVjdCB2eGdlZGV2ICp2ZGV2ID0gKHN0cnVjdCB2eGdlZGV2ICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdnhnZV92cGF0aCAqdnBhdGggPSBOVUxMOwogCWludCB2cGF0aF9pZHg7CiAKIAl2eGdlX2RlYnVnX2VudHJ5ZXhpdCh2ZGV2LT5sZXZlbF90cmFjZSwKQEAgLTM0MDMsOSArMzMxMiwxMSBAQAogCSAqLwogCXZkZXYtPmNyaWNfZXJyX2V2ZW50ID0gdHlwZTsKIAotCWZvciAodnBhdGhfaWR4ID0gMDsgdnBhdGhfaWR4IDwgdmRldi0+bm9fb2ZfdnBhdGg7IHZwYXRoX2lkeCsrKQotCQlpZiAodmRldi0+dnBhdGhzW3ZwYXRoX2lkeF0uZGV2aWNlX2lkID09IHZwX2lkKQorCWZvciAodnBhdGhfaWR4ID0gMDsgdnBhdGhfaWR4IDwgdmRldi0+bm9fb2ZfdnBhdGg7IHZwYXRoX2lkeCsrKSB7CisJCXZwYXRoID0gJnZkZXYtPnZwYXRoc1t2cGF0aF9pZHhdOworCQlpZiAodnBhdGgtPmRldmljZV9pZCA9PSB2cF9pZCkKIAkJCWJyZWFrOworCX0KIAogCWlmICghdGVzdF9iaXQoX19WWEdFX1NUQVRFX1JFU0VUX0NBUkQsICZ2ZGV2LT5zdGF0ZSkpIHsKIAkJaWYgKHR5cGUgPT0gVlhHRV9IV19FVkVOVF9TTE9UX0ZSRUVaRSkgewpAQCAtMzQ0Miw4ICszMzUzLDcgQEAKIAkJCQl2eGdlX3ZwYXRoX2ludHJfZGlzYWJsZSh2ZGV2LCB2cGF0aF9pZHgpOwogCiAJCQkJLyogc3RvcCB0aGUgcXVldWUgZm9yIHRoaXMgdnBhdGggKi8KLQkJCQl2eGdlX3N0b3BfdHhfcXVldWUoJnZkZXYtPnZwYXRoc1t2cGF0aF9pZHhdLgotCQkJCQkJCWZpZm8pOworCQkJCW5ldGlmX3R4X3N0b3BfcXVldWUodnBhdGgtPmZpZm8udHhxKTsKIAkJCX0KIAkJfQogCX0KQEAgLTM5MzYsOSArMzg0Niw3IEBACiAJc3RydWN0IHZ4Z2VkZXYgKnZkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICIKLQkJCSJDYW5ub3QgcmUtZW5hYmxlIGRldmljZSBhZnRlciByZXNldFxuIiwKLQkJCVZYR0VfRFJJVkVSX05BTUUpOworCQluZXRkZXZfZXJyKG5ldGRldiwgIkNhbm5vdCByZS1lbmFibGUgZGV2aWNlIGFmdGVyIHJlc2V0XG4iKTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CiAJfQogCkBAIC0zOTYzLDkgKzM4NzEsOCBAQAogCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewogCQlpZiAodnhnZV9vcGVuKG5ldGRldikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIKLQkJCQkiQ2FuJ3QgYnJpbmcgZGV2aWNlIGJhY2sgdXAgYWZ0ZXIgcmVzZXRcbiIsCi0JCQkJVlhHRV9EUklWRVJfTkFNRSk7CisJCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCQkgICAiQ2FuJ3QgYnJpbmcgZGV2aWNlIGJhY2sgdXAgYWZ0ZXIgcmVzZXRcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtNDAyMyw3ICszOTMwLDcgQEAKIAlpbnQgaGlnaF9kbWEgPSAwOwogCXU2NCB2cGF0aF9tYXNrID0gMDsKIAlzdHJ1Y3QgdnhnZWRldiAqdmRldjsKLQlzdHJ1Y3QgdnhnZV9jb25maWcgbGxfY29uZmlnOworCXN0cnVjdCB2eGdlX2NvbmZpZyAqbGxfY29uZmlnID0gTlVMTDsKIAlzdHJ1Y3QgdnhnZV9od19kZXZpY2VfY29uZmlnICpkZXZpY2VfY29uZmlnID0gTlVMTDsKIAlzdHJ1Y3QgdnhnZV9od19kZXZpY2VfYXR0ciBhdHRyOwogCWludCBpLCBqLCBub19vZl92cGF0aCA9IDAsIG1heF92cGF0aF9zdXBwb3J0ZWQgPSAwOwpAQCAtNDA4MiwxNyArMzk4OSwyNCBAQAogCQlnb3RvIF9leGl0MDsKIAl9CiAKLQltZW1zZXQoJmxsX2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCB2eGdlX2NvbmZpZykpOwotCWxsX2NvbmZpZy50eF9zdGVlcmluZ190eXBlID0gVFhfTVVMVElRX1NURUVSSU5HOwotCWxsX2NvbmZpZy5pbnRyX3R5cGUgPSBNU0lfWDsKLQlsbF9jb25maWcubmFwaV93ZWlnaHQgPSBORVdfTkFQSV9XRUlHSFQ7Ci0JbGxfY29uZmlnLnJ0aF9zdGVlcmluZyA9IFJUSF9TVEVFUklORzsKKwlsbF9jb25maWcgPSBremFsbG9jKHNpemVvZigqbGxfY29uZmlnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsbF9jb25maWcpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJdnhnZV9kZWJ1Z19pbml0KFZYR0VfRVJSLAorCQkJImxsX2NvbmZpZyA6IG1hbGxvYyBmYWlsZWQgJXMgJWQiLAorCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJZ290byBfZXhpdDA7CisJfQorCWxsX2NvbmZpZy0+dHhfc3RlZXJpbmdfdHlwZSA9IFRYX01VTFRJUV9TVEVFUklORzsKKwlsbF9jb25maWctPmludHJfdHlwZSA9IE1TSV9YOworCWxsX2NvbmZpZy0+bmFwaV93ZWlnaHQgPSBORVdfTkFQSV9XRUlHSFQ7CisJbGxfY29uZmlnLT5ydGhfc3RlZXJpbmcgPSBSVEhfU1RFRVJJTkc7CiAKIAkvKiBnZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCiAJdnhnZV9od19kZXZpY2VfY29uZmlnX2RlZmF1bHRfZ2V0KGRldmljZV9jb25maWcpOwogCiAJLyogaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KLQl2eGdlX2RldmljZV9jb25maWdfaW5pdChkZXZpY2VfY29uZmlnLCAmbGxfY29uZmlnLmludHJfdHlwZSk7CisJdnhnZV9kZXZpY2VfY29uZmlnX2luaXQoZGV2aWNlX2NvbmZpZywgJmxsX2NvbmZpZy0+aW50cl90eXBlKTsKIAogCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyZXQpIHsKQEAgLTQxNDUsNyArNDA1OSw3IEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApKTsKIAogCXN0YXR1cyA9IHZ4Z2VfaHdfZGV2aWNlX2h3X2luZm9fZ2V0KGF0dHIuYmFyMCwKLQkJCSZsbF9jb25maWcuZGV2aWNlX2h3X2luZm8pOworCQkJJmxsX2NvbmZpZy0+ZGV2aWNlX2h3X2luZm8pOwogCWlmIChzdGF0dXMgIT0gVlhHRV9IV19PSykgewogCQl2eGdlX2RlYnVnX2luaXQoVlhHRV9FUlIsCiAJCQkiJXM6IFJlYWRpbmcgb2YgaGFyZHdhcmUgaW5mbyBmYWlsZWQuIgpAQCAtNDE1NCw3ICs0MDY4LDcgQEAKIAkJZ290byBfZXhpdDM7CiAJfQogCi0JaWYgKGxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5md192ZXJzaW9uLm1ham9yICE9CisJaWYgKGxsX2NvbmZpZy0+ZGV2aWNlX2h3X2luZm8uZndfdmVyc2lvbi5tYWpvciAhPQogCQlWWEdFX0RSSVZFUl9GV19WRVJTSU9OX01BSk9SKSB7CiAJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX0VSUiwKIAkJCSIlczogSW5jb3JyZWN0IGZpcm13YXJlIHZlcnNpb24uIgpAQCAtNDE2NCw3ICs0MDc4LDcgQEAKIAkJZ290byBfZXhpdDM7CiAJfQogCi0JdnBhdGhfbWFzayA9IGxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby52cGF0aF9tYXNrOworCXZwYXRoX21hc2sgPSBsbF9jb25maWctPmRldmljZV9od19pbmZvLnZwYXRoX21hc2s7CiAJaWYgKHZwYXRoX21hc2sgPT0gMCkgewogCQl2eGdlX2RlYnVnX2xsX2NvbmZpZyhWWEdFX1RSQUNFLAogCQkJIiVzOiBObyB2cGF0aHMgYXZhaWxhYmxlIGluIGRldmljZSIsIFZYR0VfRFJJVkVSX05BTUUpOwpAQCAtNDE3NiwxMCArNDA5MCwxMCBAQAogCQkiJXM6JWQgIFZwYXRoIG1hc2sgPSAlbGx4IiwgX19mdW5jX18sIF9fTElORV9fLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXZwYXRoX21hc2spOwogCi0JZnVuY3Rpb25fbW9kZSA9IGxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5mdW5jdGlvbl9tb2RlOwotCWhvc3RfdHlwZSA9IGxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5ob3N0X3R5cGU7CisJZnVuY3Rpb25fbW9kZSA9IGxsX2NvbmZpZy0+ZGV2aWNlX2h3X2luZm8uZnVuY3Rpb25fbW9kZTsKKwlob3N0X3R5cGUgPSBsbF9jb25maWctPmRldmljZV9od19pbmZvLmhvc3RfdHlwZTsKIAlpc19wcml2aWxlZ2VkID0gX192eGdlX2h3X2RldmljZV9pc19wcml2aWxhZ2VkKGhvc3RfdHlwZSwKLQkJbGxfY29uZmlnLmRldmljZV9od19pbmZvLmZ1bmNfaWQpOworCQlsbF9jb25maWctPmRldmljZV9od19pbmZvLmZ1bmNfaWQpOwogCiAJLyogQ2hlY2sgaG93IG1hbnkgdnBhdGhzIGFyZSBhdmFpbGFibGUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgVlhHRV9IV19NQVhfVklSVFVBTF9QQVRIUzsgaSsrKSB7CkBAIC00MTkzLDcgKzQxMDcsNyBAQAogCiAJLyogRW5hYmxlIFNSSU9WIG1vZGUsIGlmIGZpcm13YXJlIGhhcyBTUklPViBzdXBwb3J0IGFuZCBpZiBpdCBpcyBhIFBGICovCiAJaWYgKGlzX3NyaW92KGZ1bmN0aW9uX21vZGUpICYmIChtYXhfY29uZmlnX2RldiA+IDEpICYmCi0JCShsbF9jb25maWcuaW50cl90eXBlICE9IElOVEEpICYmCisJCShsbF9jb25maWctPmludHJfdHlwZSAhPSBJTlRBKSAmJgogCQkoaXNfcHJpdmlsZWdlZCA9PSBWWEdFX0hXX09LKSkgewogCQlyZXQgPSBwY2lfZW5hYmxlX3NyaW92KHBkZXYsICgobWF4X2NvbmZpZ19kZXYgLSAxKSA8IG51bV92ZnMpCiAJCQk/IChtYXhfY29uZmlnX2RldiAtIDEpIDogbnVtX3Zmcyk7CkBAIC00MjA2LDcgKzQxMjAsNyBAQAogCSAqIENvbmZpZ3VyZSB2cGF0aHMgYW5kIGdldCBkcml2ZXIgY29uZmlndXJlZCBudW1iZXIgb2YgdnBhdGhzCiAJICogd2hpY2ggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZwYXRocyBwZXIgZnVuY3Rpb24uCiAJICovCi0Jbm9fb2ZfdnBhdGggPSB2eGdlX2NvbmZpZ192cGF0aHMoZGV2aWNlX2NvbmZpZywgdnBhdGhfbWFzaywgJmxsX2NvbmZpZyk7CisJbm9fb2ZfdnBhdGggPSB2eGdlX2NvbmZpZ192cGF0aHMoZGV2aWNlX2NvbmZpZywgdnBhdGhfbWFzaywgbGxfY29uZmlnKTsKIAlpZiAoIW5vX29mX3ZwYXRoKSB7CiAJCXZ4Z2VfZGVidWdfbGxfY29uZmlnKFZYR0VfRVJSLAogCQkJIiVzOiBObyBtb3JlIHZwYXRocyB0byBjb25maWd1cmUiLCBWWEdFX0RSSVZFUl9OQU1FKTsKQEAgLTQyNDEsMjEgKzQxNTUsMjEgQEAKIAkvKiBzZXQgcHJpdmF0ZSBkZXZpY2UgaW5mbyAqLwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBobGRldik7CiAKLQlsbF9jb25maWcuZ3JvX2VuYWJsZSA9IFZYR0VfR1JPX0FMV0FZU19BR0dSRUdBVEU7Ci0JbGxfY29uZmlnLmZpZm9faW5kaWNhdGVfbWF4X3BrdHMgPSBWWEdFX0ZJRk9fSU5ESUNBVEVfTUFYX1BLVFM7Ci0JbGxfY29uZmlnLmFkZHJfbGVhcm5fZW4gPSBhZGRyX2xlYXJuX2VuOwotCWxsX2NvbmZpZy5ydGhfYWxnb3JpdGhtID0gUlRIX0FMR19KRU5LSU5TOwotCWxsX2NvbmZpZy5ydGhfaGFzaF90eXBlX3RjcGlwdjQgPSBWWEdFX0hXX1JJTkdfSEFTSF9UWVBFX1RDUF9JUFY0OwotCWxsX2NvbmZpZy5ydGhfaGFzaF90eXBlX2lwdjQgPSBWWEdFX0hXX1JJTkdfSEFTSF9UWVBFX05PTkU7Ci0JbGxfY29uZmlnLnJ0aF9oYXNoX3R5cGVfdGNwaXB2NiA9IFZYR0VfSFdfUklOR19IQVNIX1RZUEVfTk9ORTsKLQlsbF9jb25maWcucnRoX2hhc2hfdHlwZV9pcHY2ID0gVlhHRV9IV19SSU5HX0hBU0hfVFlQRV9OT05FOwotCWxsX2NvbmZpZy5ydGhfaGFzaF90eXBlX3RjcGlwdjZleCA9IFZYR0VfSFdfUklOR19IQVNIX1RZUEVfTk9ORTsKLQlsbF9jb25maWcucnRoX2hhc2hfdHlwZV9pcHY2ZXggPSBWWEdFX0hXX1JJTkdfSEFTSF9UWVBFX05PTkU7Ci0JbGxfY29uZmlnLnJ0aF9ia3Rfc3ogPSBSVEhfQlVDS0VUX1NJWkU7Ci0JbGxfY29uZmlnLnR4X3BhdXNlX2VuYWJsZSA9IFZYR0VfUEFVU0VfQ1RSTF9FTkFCTEU7Ci0JbGxfY29uZmlnLnJ4X3BhdXNlX2VuYWJsZSA9IFZYR0VfUEFVU0VfQ1RSTF9FTkFCTEU7CisJbGxfY29uZmlnLT5ncm9fZW5hYmxlID0gVlhHRV9HUk9fQUxXQVlTX0FHR1JFR0FURTsKKwlsbF9jb25maWctPmZpZm9faW5kaWNhdGVfbWF4X3BrdHMgPSBWWEdFX0ZJRk9fSU5ESUNBVEVfTUFYX1BLVFM7CisJbGxfY29uZmlnLT5hZGRyX2xlYXJuX2VuID0gYWRkcl9sZWFybl9lbjsKKwlsbF9jb25maWctPnJ0aF9hbGdvcml0aG0gPSBSVEhfQUxHX0pFTktJTlM7CisJbGxfY29uZmlnLT5ydGhfaGFzaF90eXBlX3RjcGlwdjQgPSBWWEdFX0hXX1JJTkdfSEFTSF9UWVBFX1RDUF9JUFY0OworCWxsX2NvbmZpZy0+cnRoX2hhc2hfdHlwZV9pcHY0ID0gVlhHRV9IV19SSU5HX0hBU0hfVFlQRV9OT05FOworCWxsX2NvbmZpZy0+cnRoX2hhc2hfdHlwZV90Y3BpcHY2ID0gVlhHRV9IV19SSU5HX0hBU0hfVFlQRV9OT05FOworCWxsX2NvbmZpZy0+cnRoX2hhc2hfdHlwZV9pcHY2ID0gVlhHRV9IV19SSU5HX0hBU0hfVFlQRV9OT05FOworCWxsX2NvbmZpZy0+cnRoX2hhc2hfdHlwZV90Y3BpcHY2ZXggPSBWWEdFX0hXX1JJTkdfSEFTSF9UWVBFX05PTkU7CisJbGxfY29uZmlnLT5ydGhfaGFzaF90eXBlX2lwdjZleCA9IFZYR0VfSFdfUklOR19IQVNIX1RZUEVfTk9ORTsKKwlsbF9jb25maWctPnJ0aF9ia3Rfc3ogPSBSVEhfQlVDS0VUX1NJWkU7CisJbGxfY29uZmlnLT50eF9wYXVzZV9lbmFibGUgPSBWWEdFX1BBVVNFX0NUUkxfRU5BQkxFOworCWxsX2NvbmZpZy0+cnhfcGF1c2VfZW5hYmxlID0gVlhHRV9QQVVTRV9DVFJMX0VOQUJMRTsKIAotCWlmICh2eGdlX2RldmljZV9yZWdpc3RlcihobGRldiwgJmxsX2NvbmZpZywgaGlnaF9kbWEsIG5vX29mX3ZwYXRoLAorCWlmICh2eGdlX2RldmljZV9yZWdpc3RlcihobGRldiwgbGxfY29uZmlnLCBoaWdoX2RtYSwgbm9fb2ZfdnBhdGgsCiAJCSZ2ZGV2KSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIF9leGl0NDsKQEAgLTQyODEsMTIgKzQxOTUsMTEgQEAKIAogCQl2ZGV2LT52cGF0aHNbal0uaXNfY29uZmlndXJlZCA9IDE7CiAJCXZkZXYtPnZwYXRoc1tqXS5kZXZpY2VfaWQgPSBpOwotCQl2ZGV2LT52cGF0aHNbal0uZmlmby5kcml2ZXJfaWQgPSBqOwogCQl2ZGV2LT52cGF0aHNbal0ucmluZy5kcml2ZXJfaWQgPSBqOwogCQl2ZGV2LT52cGF0aHNbal0udmRldiA9IHZkZXY7CiAJCXZkZXYtPnZwYXRoc1tqXS5tYXhfbWFjX2FkZHJfY250ID0gbWF4X21hY192cGF0aDsKIAkJbWVtY3B5KCh1OCAqKXZkZXYtPnZwYXRoc1tqXS5tYWNhZGRyLAotCQkJCSh1OCAqKWxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5tYWNfYWRkcnNbaV0sCisJCQkJbGxfY29uZmlnLT5kZXZpY2VfaHdfaW5mby5tYWNfYWRkcnNbaV0sCiAJCQkJRVRIX0FMRU4pOwogCiAJCS8qIEluaXRpYWxpemUgdGhlIG1hYyBhZGRyZXNzIGxpc3QgaGVhZGVyICovCkBAIC00MzA3LDE4ICs0MjIwLDE4IEBACiAKIAltYWNhZGRyID0gKHU4ICopdmRldi0+dnBhdGhzWzBdLm1hY2FkZHI7CiAKLQlsbF9jb25maWcuZGV2aWNlX2h3X2luZm8uc2VyaWFsX251bWJlcltWWEdFX0hXX0lORk9fTEVOIC0gMV0gPSAnXDAnOwotCWxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5wcm9kdWN0X2Rlc2NbVlhHRV9IV19JTkZPX0xFTiAtIDFdID0gJ1wwJzsKLQlsbF9jb25maWcuZGV2aWNlX2h3X2luZm8ucGFydF9udW1iZXJbVlhHRV9IV19JTkZPX0xFTiAtIDFdID0gJ1wwJzsKKwlsbF9jb25maWctPmRldmljZV9od19pbmZvLnNlcmlhbF9udW1iZXJbVlhHRV9IV19JTkZPX0xFTiAtIDFdID0gJ1wwJzsKKwlsbF9jb25maWctPmRldmljZV9od19pbmZvLnByb2R1Y3RfZGVzY1tWWEdFX0hXX0lORk9fTEVOIC0gMV0gPSAnXDAnOworCWxsX2NvbmZpZy0+ZGV2aWNlX2h3X2luZm8ucGFydF9udW1iZXJbVlhHRV9IV19JTkZPX0xFTiAtIDFdID0gJ1wwJzsKIAogCXZ4Z2VfZGVidWdfaW5pdChWWEdFX1RSQUNFLCAiJXM6IFNFUklBTCBOVU1CRVI6ICVzIiwKLQkJdmRldi0+bmRldi0+bmFtZSwgbGxfY29uZmlnLmRldmljZV9od19pbmZvLnNlcmlhbF9udW1iZXIpOworCQl2ZGV2LT5uZGV2LT5uYW1lLCBsbF9jb25maWctPmRldmljZV9od19pbmZvLnNlcmlhbF9udW1iZXIpOwogCiAJdnhnZV9kZWJ1Z19pbml0KFZYR0VfVFJBQ0UsICIlczogUEFSVCBOVU1CRVI6ICVzIiwKLQkJdmRldi0+bmRldi0+bmFtZSwgbGxfY29uZmlnLmRldmljZV9od19pbmZvLnBhcnRfbnVtYmVyKTsKKwkJdmRldi0+bmRldi0+bmFtZSwgbGxfY29uZmlnLT5kZXZpY2VfaHdfaW5mby5wYXJ0X251bWJlcik7CiAKIAl2eGdlX2RlYnVnX2luaXQoVlhHRV9UUkFDRSwgIiVzOiBOZXRlcmlvbiAlcyBTZXJ2ZXIgQWRhcHRlciIsCi0JCXZkZXYtPm5kZXYtPm5hbWUsIGxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5wcm9kdWN0X2Rlc2MpOworCQl2ZGV2LT5uZGV2LT5uYW1lLCBsbF9jb25maWctPmRldmljZV9od19pbmZvLnByb2R1Y3RfZGVzYyk7CiAKIAl2eGdlX2RlYnVnX2luaXQoVlhHRV9UUkFDRSwgIiVzOiBNQUMgQUREUjogJXBNIiwKIAkJdmRldi0+bmRldi0+bmFtZSwgbWFjYWRkcik7CkBAIC00MzI4LDExICs0MjQxLDExIEBACiAKIAl2eGdlX2RlYnVnX2luaXQoVlhHRV9UUkFDRSwKIAkJIiVzOiBGaXJtd2FyZSB2ZXJzaW9uIDogJXMgRGF0ZSA6ICVzIiwgdmRldi0+bmRldi0+bmFtZSwKLQkJbGxfY29uZmlnLmRldmljZV9od19pbmZvLmZ3X3ZlcnNpb24udmVyc2lvbiwKLQkJbGxfY29uZmlnLmRldmljZV9od19pbmZvLmZ3X2RhdGUuZGF0ZSk7CisJCWxsX2NvbmZpZy0+ZGV2aWNlX2h3X2luZm8uZndfdmVyc2lvbi52ZXJzaW9uLAorCQlsbF9jb25maWctPmRldmljZV9od19pbmZvLmZ3X2RhdGUuZGF0ZSk7CiAKIAlpZiAobmV3X2RldmljZSkgewotCQlzd2l0Y2ggKGxsX2NvbmZpZy5kZXZpY2VfaHdfaW5mby5mdW5jdGlvbl9tb2RlKSB7CisJCXN3aXRjaCAobGxfY29uZmlnLT5kZXZpY2VfaHdfaW5mby5mdW5jdGlvbl9tb2RlKSB7CiAJCWNhc2UgVlhHRV9IV19GVU5DVElPTl9NT0RFX1NJTkdMRV9GVU5DVElPTjoKIAkJCXZ4Z2VfZGVidWdfaW5pdChWWEdFX1RSQUNFLAogCQkJIiVzOiBTaW5nbGUgRnVuY3Rpb24gTW9kZSBFbmFibGVkIiwgdmRldi0+bmRldi0+bmFtZSk7CkBAIC00MzU1LDcgKzQyNjgsNyBAQAogCXZ4Z2VfcHJpbnRfcGFybSh2ZGV2LCB2cGF0aF9tYXNrKTsKIAogCS8qIFN0b3JlIHRoZSBmdyB2ZXJzaW9uIGZvciBldGh0dG9vbCBvcHRpb24gKi8KLQlzdHJjcHkodmRldi0+ZndfdmVyc2lvbiwgbGxfY29uZmlnLmRldmljZV9od19pbmZvLmZ3X3ZlcnNpb24udmVyc2lvbik7CisJc3RyY3B5KHZkZXYtPmZ3X3ZlcnNpb24sIGxsX2NvbmZpZy0+ZGV2aWNlX2h3X2luZm8uZndfdmVyc2lvbi52ZXJzaW9uKTsKIAltZW1jcHkodmRldi0+bmRldi0+ZGV2X2FkZHIsICh1OCAqKXZkZXYtPnZwYXRoc1swXS5tYWNhZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KHZkZXYtPm5kZXYtPnBlcm1fYWRkciwgdmRldi0+bmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIApAQCAtNDM5NCw3ICs0MzA3LDcgQEAKIAkgKiBwcmVzZW50IHRvIHByZXZlbnQgc3VjaCBhIGZhaWx1cmUuCiAJICovCiAKLQlpZiAobGxfY29uZmlnLmRldmljZV9od19pbmZvLmZ1bmN0aW9uX21vZGUgPT0KKwlpZiAobGxfY29uZmlnLT5kZXZpY2VfaHdfaW5mby5mdW5jdGlvbl9tb2RlID09CiAJCVZYR0VfSFdfRlVOQ1RJT05fTU9ERV9NVUxUSV9GVU5DVElPTikKIAkJaWYgKHZkZXYtPmNvbmZpZy5pbnRyX3R5cGUgPT0gSU5UQSkKIAkJCXZ4Z2VfaHdfZGV2aWNlX3VubWFza19hbGwoaGxkZXYpOwpAQCAtNDQwNiw2ICs0MzE5LDcgQEAKIAlWWEdFX0NPUFlfREVCVUdfSU5GT19UT19MTCh2ZGV2LCB2eGdlX2h3X2RldmljZV9lcnJvcl9sZXZlbF9nZXQoaGxkZXYpLAogCQl2eGdlX2h3X2RldmljZV90cmFjZV9sZXZlbF9nZXQoaGxkZXYpKTsKIAorCWtmcmVlKGxsX2NvbmZpZyk7CiAJcmV0dXJuIDA7CiAKIF9leGl0NToKQEAgLTQ0MjMsNiArNDMzNyw3IEBACiBfZXhpdDE6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogX2V4aXQwOgorCWtmcmVlKGxsX2NvbmZpZyk7CiAJa2ZyZWUoZGV2aWNlX2NvbmZpZyk7CiAJZHJpdmVyX2NvbmZpZy0+Y29uZmlnX2Rldl9jbnQtLTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CkBAIC00NTE0LDEzICs0NDI5LDkgQEAKIHZ4Z2Vfc3RhcnRlcih2b2lkKQogewogCWludCByZXQgPSAwOwotCWNoYXIgdmVyc2lvblszMl07Ci0Jc25wcmludGYodmVyc2lvbiwgMzIsICIlcyIsIERSVl9WRVJTSU9OKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3B5cmlnaHQoYykgMjAwMi0yMDA5IE5ldGVyaW9uIEluY1xuIiwKLQkJVlhHRV9EUklWRVJfTkFNRSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyaXZlciB2ZXJzaW9uOiAlc1xuIiwKLQkJCVZYR0VfRFJJVkVSX05BTUUsIHZlcnNpb24pOworCXByX2luZm8oIkNvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLlxuIik7CisJcHJfaW5mbygiRHJpdmVyIHZlcnNpb246ICVzXG4iLCBEUlZfVkVSU0lPTik7CiAKIAl2ZXJpZnlfYmFuZHdpZHRoKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmggYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtbWFpbi5oCmluZGV4IDYwMjc2YjIuLjJlM2IwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLW1haW4uaApAQCAtNyw5ICs3LDkgQEAKICAqIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgogICogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhpcyBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgKgotICogdnhnZS1tYWluLmg6IERyaXZlciBmb3IgTmV0ZXJpb24gSW5jJ3MgWDMxMDAgU2VyaWVzIDEwR2JFIFBDSWUgSS9PCisgKiB2eGdlLW1haW4uaDogRHJpdmVyIGZvciBFeGFyIENvcnAncyBYMzEwMCBTZXJpZXMgMTBHYkUgUENJZSBJL08KICAqICAgICAgICAgICAgICBWaXJ0dWFsaXplZCBTZXJ2ZXIgQWRhcHRlci4KLSAqIENvcHlyaWdodChjKSAyMDAyLTIwMDkgTmV0ZXJpb24gSW5jLgorICogQ29weXJpZ2h0KGMpIDIwMDItMjAxMCBFeGFyIENvcnAuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBWWEdFX01BSU5fSAogI2RlZmluZSBWWEdFX01BSU5fSApAQCAtMjE3LDIxICsyMTcsMTMgQEAKIH07CiAKIHN0cnVjdCB2eGdlX2ZpZm8gewotCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2OwotCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgX192eGdlX2h3X2ZpZm8gKmhhbmRsZTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CiAKLQkvKiBUaGUgdnBhdGggaWQgbWFpbnRhaW5lZCBpbiB0aGUgZHJpdmVyIC0KLQkgKiAwIHRvICdtYXhpbXVtX3ZwYXRoc19pbl9mdW5jdGlvbiAtIDEnCi0JICovCi0JaW50IGRyaXZlcl9pZDsKIAlpbnQgdHhfc3RlZXJpbmdfdHlwZTsKIAlpbnQgaW5kaWNhdGVfbWF4X3BrdHM7Ci0Jc3BpbmxvY2tfdCB0eF9sb2NrOwotCS8qIGZsYWcgdXNlZCB0byBtYWludGFpbiBxdWV1ZSBzdGF0ZSB3aGVuIE1VTFRJUSBpcyBub3QgZW5hYmxlZCAqLwotI2RlZmluZSBWUEFUSF9RVUVVRV9TVEFSVCAgICAgICAwCi0jZGVmaW5lIFZQQVRIX1FVRVVFX1NUT1AgICAgICAgIDEKLQlpbnQgcXVldWVfc3RhdGU7CiAKIAkvKiBUeCBzdGF0cyAqLwogCXN0cnVjdCB2eGdlX2ZpZm9fc3RhdHMgc3RhdHM7CkBAIC0yNzksNyArMjcxLDYgQEAKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiBzdHJ1Y3QgdnhnZV92cGF0aCB7Ci0KIAlzdHJ1Y3QgdnhnZV9maWZvIGZpZm87CiAJc3RydWN0IHZ4Z2VfcmluZyByaW5nOwogCkBAIC00NDcsMTQgKzQzOCw2IEBACiAKIGVudW0gdnhnZV9od19zdGF0dXMgdnhnZV9yZXNldF9hbGxfdnBhdGhzKHN0cnVjdCB2eGdlZGV2ICp2ZGV2KTsKIAotdm9pZCB2eGdlX3N0b3BfYWxsX3R4X3F1ZXVlKHN0cnVjdCB2eGdlZGV2ICp2ZGV2KTsKLQotdm9pZCB2eGdlX3N0b3BfdHhfcXVldWUoc3RydWN0IHZ4Z2VfZmlmbyAqZmlmbyk7Ci0KLXZvaWQgdnhnZV9zdGFydF9hbGxfdHhfcXVldWUoc3RydWN0IHZ4Z2VkZXYgKnZkZXYpOwotCi12b2lkIHZ4Z2Vfd2FrZV90eF9xdWV1ZShzdHJ1Y3QgdnhnZV9maWZvICpmaWZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQogZW51bSB2eGdlX2h3X3N0YXR1cyB2eGdlX2FkZF9tYWNfYWRkcihzdHJ1Y3QgdnhnZWRldiAqdmRldiwKIAlzdHJ1Y3QgbWFjSW5mbyAqbWFjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLXJlZy5oIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLXJlZy5oCmluZGV4IDlhMGNmOGUuLjNkZDVjOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1yZWcuaAorKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtcmVnLmgKQEAgLTcsOSArNyw5IEBACiAgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KICAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKLSAqIHZ4Z2UtcmVnLmg6IERyaXZlciBmb3IgTmV0ZXJpb24gSW5jJ3MgWDMxMDAgU2VyaWVzIDEwR2JFIFBDSWUgSS9PIFZpcnR1YWxpemVkCisgKiB2eGdlLXJlZy5oOiBEcml2ZXIgZm9yIEV4YXIgQ29ycCdzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTyBWaXJ0dWFsaXplZAogICogICAgICAgICAgICAgU2VydmVyIEFkYXB0ZXIuCi0gKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA5IE5ldGVyaW9uIEluYy4KKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgVlhHRV9SRUdfSAogI2RlZmluZSBWWEdFX1JFR19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5jIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLXRyYWZmaWMuYwppbmRleCA2Y2MxZGQ3Li5jZWRmMDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS10cmFmZmljLmMKQEAgLTcsOSArNyw5IEBACiAgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KICAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKLSAqIHZ4Z2UtdHJhZmZpYy5jOiBEcml2ZXIgZm9yIE5ldGVyaW9uIEluYydzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTworICogdnhnZS10cmFmZmljLmM6IERyaXZlciBmb3IgRXhhciBDb3JwJ3MgWDMxMDAgU2VyaWVzIDEwR2JFIFBDSWUgSS9PCiAgKiAgICAgICAgICAgICAgICAgVmlydHVhbGl6ZWQgU2VydmVyIEFkYXB0ZXIuCi0gKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA5IE5ldGVyaW9uIEluYy4KKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCkBAIC0yNDY2LDE0ICsyNDY2LDEyIEBACiAgKiB0aGUgc2FtZS4KICAqIEBmaWZvOiBIYW5kbGUgdG8gdGhlIGZpZm8gb2JqZWN0IHVzZWQgZm9yIG5vbiBvZmZsb2FkIHNlbmQKICAqCi0gKiBUaGUgZnVuY3Rpb24JcG9sbHMgdGhlIFR4IGZvciB0aGUgY29tcGxldGVkCWRlc2NyaXB0b3JzIGFuZAljYWxscworICogVGhlIGZ1bmN0aW9uIHBvbGxzIHRoZSBUeCBmb3IgdGhlIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyBhbmQgY2FsbHMKICAqIHRoZSBkcml2ZXIgdmlhIHN1cHBsaWVkIGNvbXBsZXRpb24gY2FsbGJhY2suCiAgKgogICogUmV0dXJuczogVlhHRV9IV19PSywgaWYgdGhlIHBvbGxpbmcgaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWwuCiAgKiBWWEdFX0hXX0NPTVBMRVRJT05TX1JFTUFJTjogVGhlcmUgYXJlIHN0aWxsIG1vcmUgY29tcGxldGVkCiAgKiBkZXNjcmlwdG9ycyBhdmFpbGFibGUgd2hpY2ggYXJlIHlldCB0byBiZSBwcm9jZXNzZWQuCi0gKgotICogU2VlIGFsc286IHZ4Z2VfaHdfdnBhdGhfcG9sbF90eCgpLgogICovCiBlbnVtIHZ4Z2VfaHdfc3RhdHVzIHZ4Z2VfaHdfdnBhdGhfcG9sbF90eChzdHJ1Y3QgX192eGdlX2h3X2ZpZm8gKmZpZm8sCiAJCQkJCXN0cnVjdCBza19idWZmICoqKnNrYl9wdHIsIGludCBucl9za2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5oIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLXRyYWZmaWMuaAppbmRleCBjMjUyZjNkLi42ZmEwN2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5oCisrKyBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS10cmFmZmljLmgKQEAgLTcsOSArNyw5IEBACiAgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KICAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKLSAqIHZ4Z2UtdHJhZmZpYy5oOiBEcml2ZXIgZm9yIE5ldGVyaW9uIEluYydzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTworICogdnhnZS10cmFmZmljLmg6IERyaXZlciBmb3IgRXhhciBDb3JwJ3MgWDMxMDAgU2VyaWVzIDEwR2JFIFBDSWUgSS9PCiAgKiAgICAgICAgICAgICAgICAgVmlydHVhbGl6ZWQgU2VydmVyIEFkYXB0ZXIuCi0gKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA5IE5ldGVyaW9uIEluYy4KKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMTAgRXhhciBDb3JwLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgVlhHRV9UUkFGRklDX0gKICNkZWZpbmUgVlhHRV9UUkFGRklDX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS12ZXJzaW9uLmggYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdmVyc2lvbi5oCmluZGV4IDVkYTdhYjEuLjUzZmVmZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS12ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLXZlcnNpb24uaApAQCAtNywxNyArNywxNiBAQAogICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCiAgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCi0gKiB2eGdlLXZlcnNpb24uaDogRHJpdmVyIGZvciBOZXRlcmlvbiBJbmMncyBYMzEwMCBTZXJpZXMgMTBHYkUgUENJZSBJL08KKyAqIHZ4Z2UtdmVyc2lvbi5oOiBEcml2ZXIgZm9yIEV4YXIgQ29ycCdzIFgzMTAwIFNlcmllcyAxMEdiRSBQQ0llIEkvTwogICogICAgICAgICAgICAgICAgIFZpcnR1YWxpemVkIFNlcnZlciBBZGFwdGVyLgotICogQ29weXJpZ2h0KGMpIDIwMDItMjAwOSBOZXRlcmlvbiBJbmMuCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDEwIEV4YXIgQ29ycC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIFZYR0VfVkVSU0lPTl9ICi0KICNkZWZpbmUgVlhHRV9WRVJTSU9OX0gKIAogI2RlZmluZSBWWEdFX1ZFUlNJT05fTUFKT1IJIjIiCiAjZGVmaW5lIFZYR0VfVkVSU0lPTl9NSU5PUgkiMCIKLSNkZWZpbmUgVlhHRV9WRVJTSU9OX0ZJWAkiOCIKLSNkZWZpbmUgVlhHRV9WRVJTSU9OX0JVSUxECSIyMDE4MiIKKyNkZWZpbmUgVlhHRV9WRVJTSU9OX0ZJWAkiOSIKKyNkZWZpbmUgVlhHRV9WRVJTSU9OX0JVSUxECSIyMDg0MCIKICNkZWZpbmUgVlhHRV9WRVJTSU9OX0ZPUgkiayIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKaW5kZXggZjBiZDcwZi4uMDRjNmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYworKysgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCkBAIC04OSw3ICs4OSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTE3NCw2ICsxNzMsNyBAQAogICogQ2hhcmFjdGVyIGRldmljZSBtYWpvciBudW1iZXIuIDExNyB3YXMgYWxsb2NhdGVkIGZvciB1cy4KICAqIFRoZSB2YWx1ZSBvZiAwIG1lYW5zIHRvIGFsbG9jYXRlIGEgZmlyc3QgZnJlZSBvbmUuCiAgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoY29zYV9jaGFyZGV2X211dGV4KTsKIHN0YXRpYyBpbnQgY29zYV9tYWpvciA9IDExNzsKIAogLyoKQEAgLTk0NCw3ICs5NDQsNyBAQAogCWludCBuOwogCWludCByZXQgPSAwOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZjb3NhX2NoYXJkZXZfbXV0ZXgpOwogCWlmICgobj1pbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk+PkNBUkRfTUlOT1JfQklUUykKIAkJPj0gbnJfY2FyZHMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKQEAgLTk3Niw3ICs5NzYsNyBAQAogCWNoYW4tPnJ4X2RvbmUgPSBjaHJkZXZfcnhfZG9uZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmY29zYV9jaGFyZGV2X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjEyLDEwICsxMjEyLDEwIEBACiAJc3RydWN0IGNvc2FfZGF0YSAqY29zYTsKIAlsb25nIHJldDsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmY29zYV9jaGFyZGV2X211dGV4KTsKIAljb3NhID0gY2hhbm5lbC0+Y29zYTsKIAlyZXQgPSBjb3NhX2lvY3RsX2NvbW1vbihjb3NhLCBjaGFubmVsLCBjbWQsIGFyZyk7Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmY29zYV9jaGFyZGV2X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwppbmRleCBlMDg3YjlhLi5hZDc3MTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKQEAgLTE1LDYgKzE1LDggQEAKICAqICAgICAgTWFpbnRhaW5lcjogIEtldmluIEN1cnRpcyAgPGtldmluLmN1cnRpc0BmYXJzaXRlLmNvLnVrPgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KQEAgLTUxMSwyMSArNTEzLDE5IEBACiAgKiBzdXBwb3J0IHZhcmlhYmxlIG51bWJlcnMgb2YgbWFjcm8gcGFyYW1ldGVycy4gVGhlIGludmVydGVkIGlmIHByZXZlbnRzIHVzCiAgKiBlYXRpbmcgc29tZW9uZSBlbHNlJ3MgZWxzZSBjbGF1c2UuCiAgKi8KLSNkZWZpbmUgZGJnKEYsZm10LEEuLi4pIGlmICggISAoIGZzdF9kZWJ1Z19tYXNrICYgKEYpKSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKCBLRVJOX0RFQlVHIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKLQorI2RlZmluZSBkYmcoRiwgZm10LCBhcmdzLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmIChmc3RfZGVidWdfbWFzayAmIChGKSkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNhcmdzKTsJCVwKK30gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBkYmcoWC4uLikJCS8qIE5PUCAqLworI2RlZmluZSBkYmcoRiwgZm10LCBhcmdzLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICgwKQkJCQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI2FyZ3MpOwkJXAorfSB3aGlsZSAoMCkKICNlbmRpZgogCi0vKiAgICAgIFByaW50aW5nIHNob3J0IGN1dHMKLSAqLwotI2RlZmluZSBwcmludGtfZXJyKGZtdCxBLi4uKSAgICBwcmludGsgKCBLRVJOX0VSUiAgICAgRlNUX05BTUUgIjogIiBmbXQsICMjIEEgKQotI2RlZmluZSBwcmludGtfd2FybihmbXQsQS4uLikgICBwcmludGsgKCBLRVJOX1dBUk5JTkcgRlNUX05BTUUgIjogIiBmbXQsICMjIEEgKQotI2RlZmluZSBwcmludGtfaW5mbyhmbXQsQS4uLikgICBwcmludGsgKCBLRVJOX0lORk8gICAgRlNUX05BTUUgIjogIiBmbXQsICMjIEEgKQotCiAvKgogICogICAgICBQQ0kgSUQgbG9va3VwIHRhYmxlCiAgKi8KQEAgLTk2MSw3ICs5NjEsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKCsrc2FmZXR5ID4gMjAwMCkgewotCQkJcHJpbnRrX2VycigiTWFpbGJveCBzYWZldHkgdGltZW91dFxuIik7CisJCQlwcl9lcnIoIk1haWxib3ggc2FmZXR5IHRpbWVvdXRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTI0MSw4ICsxMjQxLDggQEAKIAkJICogVGhpcyBzZWVtcyB0byBoYXBwZW4gb24gdGhlIFRFMSBpbnRlcmZhY2Ugc29tZXRpbWVzCiAJCSAqIHNvIHRocm93IHRoZSBmcmFtZSBhd2F5IGFuZCBsb2cgdGhlIGV2ZW50LgogCQkgKi8KLQkJcHJpbnRrX2VycigiRnJhbWUgcmVjZWl2ZWQgd2l0aCAwIGxlbmd0aC4gQ2FyZCAlZCBQb3J0ICVkXG4iLAotCQkJICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQlwcl9lcnIoIkZyYW1lIHJlY2VpdmVkIHdpdGggMCBsZW5ndGguIENhcmQgJWQgUG9ydCAlZFxuIiwKKwkJICAgICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKIAkJLyogUmV0dXJuIGRlc2NyaXB0b3IgdG8gY2FyZCAqLwogCQlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOwogCkBAIC0xNDg2LDkgKzE0ODYsOCBAQAogCSAqLwogCWRiZyhEQkdfSU5UUiwgImludHI6ICVkICVwXG4iLCBjYXJkLT5pcnEsIGNhcmQpOwogCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykgewotCQlwcmludGtfZXJyCi0JCSAgICAoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2FyZCAlZCBpbiBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCi0JCSAgICAgY2FyZC0+Y2FyZF9ubywgY2FyZC0+c3RhdGUpOworCQlwcl9lcnIoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2FyZCAlZCBpbiBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCisJCSAgICAgICBjYXJkLT5jYXJkX25vLCBjYXJkLT5zdGF0ZSk7CiAKIAkJLyogCiAJCSAqIEl0IGlzIHBvc3NpYmxlIHRvIHJlYWxseSBiZSBydW5uaW5nLCBpLmUuIHdlIGhhdmUgcmUtbG9hZGVkCkBAIC0xNjE0LDggKzE2MTMsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXByaW50a19lcnIoImludHI6IHVua25vd24gY2FyZCBldmVudCAlZC4gaWdub3JlZFxuIiwKLQkJCQkgICBldmVudCk7CisJCQlwcl9lcnIoImludHI6IHVua25vd24gY2FyZCBldmVudCAlZC4gaWdub3JlZFxuIiwgZXZlbnQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTYzNywxMyArMTYzNSwxMyBAQAogCiAJLyogQ2hlY2sgc3RydWN0dXJlIHZlcnNpb24gYW5kIGVuZCBtYXJrZXIgKi8KIAlpZiAoRlNUX1JEVyhjYXJkLCBzbWNWZXJzaW9uKSAhPSBTTUNfVkVSU0lPTikgewotCQlwcmludGtfZXJyKCJCYWQgc2hhcmVkIG1lbW9yeSB2ZXJzaW9uICVkIGV4cGVjdGVkICVkXG4iLAotCQkJICAgRlNUX1JEVyhjYXJkLCBzbWNWZXJzaW9uKSwgU01DX1ZFUlNJT04pOworCQlwcl9lcnIoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24gJWQgZXhwZWN0ZWQgJWRcbiIsCisJCSAgICAgICBGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pLCBTTUNfVkVSU0lPTik7CiAJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CiAJCXJldHVybjsKIAl9CiAJaWYgKEZTVF9SREwoY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUpICE9IEVORF9TSUcpIHsKLQkJcHJpbnRrX2VycigiTWlzc2luZyBzaGFyZWQgbWVtb3J5IHNpZ25hdHVyZVxuIik7CisJCXByX2VycigiTWlzc2luZyBzaGFyZWQgbWVtb3J5IHNpZ25hdHVyZVxuIik7CiAJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CiAJCXJldHVybjsKIAl9CkBAIC0xNjUxLDExICsxNjQ5LDExIEBACiAJaWYgKChpID0gRlNUX1JEQihjYXJkLCB0YXNrU3RhdHVzKSkgPT0gMHgwMSkgewogCQljYXJkLT5zdGF0ZSA9IEZTVF9SVU5OSU5HOwogCX0gZWxzZSBpZiAoaSA9PSAweEZGKSB7Ci0JCXByaW50a19lcnIoIkZpcm13YXJlIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOworCQlwcl9lcnIoIkZpcm13YXJlIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOwogCQljYXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CiAJCXJldHVybjsKIAl9IGVsc2UgaWYgKGkgIT0gMHgwMCkgewotCQlwcmludGtfZXJyKCJVbmtub3duIGZpcm13YXJlIHN0YXR1cyAweCV4XG4iLCBpKTsKKwkJcHJfZXJyKCJVbmtub3duIGZpcm13YXJlIHN0YXR1cyAweCV4XG4iLCBpKTsKIAkJY2FyZC0+c3RhdGUgPSBGU1RfSEFMVEVEOwogCQlyZXR1cm47CiAJfQpAQCAtMTY2NSw5ICsxNjYzLDEwIEBACiAJICogZXhpc3RpbmcgZmlybXdhcmUgZXRjIHNvIHdlIGp1c3QgcmVwb3J0IGl0IGZvciB0aGUgbW9tZW50LgogCSAqLwogCWlmIChGU1RfUkRMKGNhcmQsIG51bWJlck9mUG9ydHMpICE9IGNhcmQtPm5wb3J0cykgewotCQlwcmludGtfd2FybigiUG9ydCBjb3VudCBtaXNtYXRjaCBvbiBjYXJkICVkLiIKLQkJCSAgICAiIEZpcm13YXJlIHRoaW5rcyAlZCB3ZSBzYXkgJWRcbiIsIGNhcmQtPmNhcmRfbm8sCi0JCQkgICAgRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSwgY2FyZC0+bnBvcnRzKTsKKwkJcHJfd2FybmluZygiUG9ydCBjb3VudCBtaXNtYXRjaCBvbiBjYXJkICVkLiAiCisJCQkgICAiRmlybXdhcmUgdGhpbmtzICVkIHdlIHNheSAlZFxuIiwKKwkJCSAgIGNhcmQtPmNhcmRfbm8sCisJCQkgICBGU1RfUkRMKGNhcmQsIG51bWJlck9mUG9ydHMpLCBjYXJkLT5ucG9ydHMpOwogCX0KIH0KIApAQCAtMjAzOCwxNiArMjAzNywxMCBAQAogCiAJCS8qIE5vdyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjYXJkLiAqLwogCi0JCWJ1ZiA9IGttYWxsb2Mod3J0aGRyLnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihidWYsCi0JCQkJICAgaWZyLT5pZnJfZGF0YSArIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSksCi0JCQkJICAgd3J0aGRyLnNpemUpKSB7Ci0JCQlrZnJlZShidWYpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwkJYnVmID0gbWVtZHVwX3VzZXIoaWZyLT5pZnJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZnN0aW9jX3dyaXRlKSwKKwkJCQkgIHdydGhkci5zaXplKTsKKwkJaWYgKElTX0VSUihidWYpKQorCQkJcmV0dXJuIFBUUl9FUlIoYnVmKTsKIAogCQltZW1jcHlfdG9pbyhjYXJkLT5tZW0gKyB3cnRoZHIub2Zmc2V0LCBidWYsIHdydGhkci5zaXplKTsKIAkJa2ZyZWUoYnVmKTsKQEAgLTIwOTYsOSArMjA4OSw4IEBACiAJCSAqLwogCiAJCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykgewotCQkJcHJpbnRrX2VycgotCQkJICAgICgiQXR0ZW1wdCB0byBjb25maWd1cmUgY2FyZCAlZCBpbiBub24tcnVubmluZyBzdGF0ZSAoJWQpXG4iLAotCQkJICAgICBjYXJkLT5jYXJkX25vLCBjYXJkLT5zdGF0ZSk7CisJCQlwcl9lcnIoIkF0dGVtcHQgdG8gY29uZmlndXJlIGNhcmQgJWQgaW4gbm9uLXJ1bm5pbmcgc3RhdGUgKCVkKVxuIiwKKwkJCSAgICAgICBjYXJkLT5jYXJkX25vLCBjYXJkLT5zdGF0ZSk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoaW5mbykpKSB7CkBAIC0yMzkwLDggKzIzODIsOCBAQAogICAgICAgICAgICAgICAgIGVyciA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGNhcmQtPnBvcnRzW2ldLmRldik7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKIAkJCWludCBqOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIkNhbm5vdCByZWdpc3RlciBIRExDIGRldmljZSBmb3IgcG9ydCAlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGVycm5vICVkKVxuIiwgaSwgLWVyciApOworCQkJcHJfZXJyKCJDYW5ub3QgcmVnaXN0ZXIgSERMQyBkZXZpY2UgZm9yIHBvcnQgJWQgKGVycm5vICVkKVxuIiwKKwkJCSAgICAgICBpLCAtZXJyKTsKIAkJCWZvciAoaiA9IGk7IGogPCBjYXJkLT5ucG9ydHM7IGorKykgewogCQkJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzW2pdLmRldik7CiAJCQkJY2FyZC0+cG9ydHNbal0uZGV2ID0gTlVMTDsKQEAgLTI0MDEsMTAgKzIzOTMsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAJfQogCi0JcHJpbnRrX2luZm8oIiVzLSVzOiAlcyBJUlElZCwgJWQgcG9ydHNcbiIsCi0JICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1swXSktPm5hbWUsCi0JICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tjYXJkLT5ucG9ydHMgLSAxXSktPm5hbWUsCi0JICAgICAgIHR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwgY2FyZC0+aXJxLCBjYXJkLT5ucG9ydHMpOworCXByX2luZm8oIiVzLSVzOiAlcyBJUlElZCwgJWQgcG9ydHNcbiIsCisJCXBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1swXSktPm5hbWUsCisJCXBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tjYXJkLT5ucG9ydHMgLSAxXSktPm5hbWUsCisJCXR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwgY2FyZC0+aXJxLCBjYXJkLT5ucG9ydHMpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGZzdF9vcHMgPSB7CkBAIC0yNDIzLDE5ICsyNDE1LDE3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdAogZnN0X2FkZF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RhdGljIGludCBmaXJzdHRpbWVfZG9uZSA9IDA7CiAJc3RhdGljIGludCBub19vZl9jYXJkc19hZGRlZCA9IDA7CiAJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CiAJaW50IGVyciA9IDA7CiAJaW50IGk7CiAKLQlpZiAoIWZpcnN0dGltZV9kb25lKSB7Ci0JCXByaW50a19pbmZvKCJGYXJTeW5jIFdBTiBkcml2ZXIgIiBGU1RfVVNFUl9WRVJTSU9OCi0JCSAgICAgICAiIChjKSAyMDAxLTIwMDQgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuXG4iKTsKLQkJZmlyc3R0aW1lX2RvbmUgPSAxOwotCQlkYmcoREJHX0FTUywgIlRoZSB2YWx1ZSBvZiBkZWJ1ZyBtYXNrIGlzICV4XG4iLCBmc3RfZGVidWdfbWFzayk7Ci0JfQotCisJcHJpbnRrX29uY2UoS0VSTl9JTkZPCisJCSAgICBwcl9mbXQoIkZhclN5bmMgV0FOIGRyaXZlciAiIEZTVF9VU0VSX1ZFUlNJT04KKwkJCSAgICIgKGMpIDIwMDEtMjAwNCBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC5cbiIpKTsKKyNpZiBGU1RfREVCVUcKKwlkYmcoREJHX0FTUywgIlRoZSB2YWx1ZSBvZiBkZWJ1ZyBtYXNrIGlzICV4XG4iLCBmc3RfZGVidWdfbWFzayk7CisjZW5kaWYKIAkvKgogCSAqIFdlIGFyZSBnb2luZyB0byBiZSBjbGV2ZXIgYW5kIGFsbG93IGNlcnRhaW4gY2FyZHMgbm90IHRvIGJlCiAJICogY29uZmlndXJlZC4gIEFuIGV4Y2x1ZGUgbGlzdCBjYW4gYmUgcHJvdmlkZWQgaW4gL2V0Yy9tb2R1bGVzLmNvbmYKQEAgLTI0NDcsOCArMjQzNyw4IEBACiAJCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgZnN0X2V4Y2x1ZGVkX2NhcmRzOyBpKyspIHsKIAkJCWlmICgocGRldi0+ZGV2Zm4pID4+IDMgPT0gZnN0X2V4Y2x1ZGVkX2xpc3RbaV0pIHsKLQkJCQlwcmludGtfaW5mbygiRmFyU3luYyBQQ0kgZGV2aWNlICVkIG5vdCBhc3NpZ25lZFxuIiwKLQkJCQkgICAgICAgKHBkZXYtPmRldmZuKSA+PiAzKTsKKwkJCQlwcl9pbmZvKCJGYXJTeW5jIFBDSSBkZXZpY2UgJWQgbm90IGFzc2lnbmVkXG4iLAorCQkJCQkocGRldi0+ZGV2Zm4pID4+IDMpOwogCQkJCXJldHVybiAtRUJVU1k7CiAJCQl9CiAJCX0KQEAgLTI0NTcsMjAgKzI0NDcsMTkgQEAKIAkvKiBBbGxvY2F0ZSBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCiAJY2FyZCA9IGt6YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChjYXJkID09IE5VTEwpIHsKLQkJcHJpbnRrX2VycigiRmFyU3luYyBjYXJkIGZvdW5kIGJ1dCBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciIKLQkJCSAgICIgZHJpdmVyIHN0b3JhZ2VcbiIpOworCQlwcl9lcnIoIkZhclN5bmMgY2FyZCBmb3VuZCBidXQgaW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgZHJpdmVyIHN0b3JhZ2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvKiBUcnkgdG8gZW5hYmxlIHRoZSBkZXZpY2UgKi8KIAlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSAhPSAwKSB7Ci0JCXByaW50a19lcnIoIkZhaWxlZCB0byBlbmFibGUgY2FyZC4gRXJyICVkXG4iLCAtZXJyKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIGNhcmQuIEVyciAlZFxuIiwgLWVycik7CiAJCWtmcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiRmFyU3luYyIpKSAhPTApIHsKLQkgICAgICAgIHByaW50a19lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpb25zLiBFcnIgJWRcbiIsIC1lcnIpOworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpb25zLiBFcnIgJWRcbiIsIC1lcnIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCWtmcmVlKGNhcmQpOwogCSAgICAgICAgcmV0dXJuIGVycjsKQEAgLTI0ODEsMTQgKzI0NzAsMTQgQEAKIAljYXJkLT5waHlzX21lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKIAljYXJkLT5waHlzX2N0bG1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKIAlpZiAoKGNhcmQtPm1lbSA9IGlvcmVtYXAoY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFKSkgPT0gTlVMTCkgewotCQlwcmludGtfZXJyKCJQaHlzaWNhbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJQaHlzaWNhbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQlrZnJlZShjYXJkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmICgoY2FyZC0+Y3RsbWVtID0gaW9yZW1hcChjYXJkLT5waHlzX2N0bG1lbSwgMHgxMCkpID09IE5VTEwpIHsKLQkJcHJpbnRrX2VycigiQ29udHJvbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJDb250cm9sIG1lbW9yeSByZW1hcCBmYWlsZWRcbiIpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCWtmcmVlKGNhcmQpOwpAQCAtMjQ5OCw3ICsyNDg3LDcgQEAKIAogCS8qIFJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwogCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGZzdF9pbnRyLCBJUlFGX1NIQVJFRCwgRlNUX0RFVl9OQU1FLCBjYXJkKSkgewotCQlwcmludGtfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW50ZXJydXB0ICVkXG4iLCBjYXJkLT5pcnEpOworCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBpbnRlcnJ1cHQgJWRcbiIsIGNhcmQtPmlycSk7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJaW91bm1hcChjYXJkLT5jdGxtZW0pOwpAQCAtMjUyOSw3ICsyNTE4LDcgQEAKIAkJaWYgKCFkZXYpIHsKIAkJCXdoaWxlIChpLS0pCiAJCQkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbaV0uZGV2KTsKLQkJCXByaW50a19lcnIgKCJGYXJTeW5jOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXByX2VycigiRmFyU3luYzogb3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKQEAgLTI1OTMsNyArMjU4Miw3IEBACiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAogCQkJCQkgJmNhcmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCk7CiAJCWlmIChjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3QgPT0gTlVMTCkgewotCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHJ4IGRtYSBidWZmZXJcbiIpOworCQkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgcnggZG1hIGJ1ZmZlclxuIik7CiAJCQlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOwogCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKQEAgLTI2MDYsNyArMjU5NSw3IEBACiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAogCQkJCQkgJmNhcmQtPnR4X2RtYV9oYW5kbGVfY2FyZCk7CiAJCWlmIChjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3QgPT0gTlVMTCkgewotCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHR4IGRtYSBidWZmZXJcbiIpOworCQkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgdHggZG1hIGJ1ZmZlclxuIik7CiAJCQlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOwogCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKQEAgLTI2NzgsNyArMjY2Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIGZzdF9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotCXByaW50a19pbmZvKCJGYXJTeW5jIFdBTiBkcml2ZXIgdW5sb2FkaW5nXG4iKTsKKwlwcl9pbmZvKCJGYXJTeW5jIFdBTiBkcml2ZXIgdW5sb2FkaW5nXG4iKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmZzdF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5oIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzAuaAppbmRleCAzODM5NjYyLi5lNGY1MzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5oCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTcwLmgKQEAgLTE1Myw3ICsxNTMsNyBAQAogCXUxNiBsZW47CQkvKiBEYXRhIExlbmd0aCAqLwogCXU4IHN0YXQ7CQkvKiBTdGF0dXMgKi8KIAl1OCB1bnVzZWQ7CQkvKiBwYWRzIHRvIDItYnl0ZSBib3VuZGFyeSAqLwotfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwa3RfZGVzYzsKK31fX3BhY2tlZCBwa3RfZGVzYzsKIAogCiAvKiBQYWNrZXQgRGVzY3JpcHRvciBTdGF0dXMgYml0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKaW5kZXggZWU3MDgzZi4uYjM4ZmZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCkBAIC0zNiw3ICszNiw3IEBACiAJdTggYWRkcmVzczsKIAl1OCBjb250cm9sOwogCV9fYmUxNiBwcm90b2NvbDsKLX1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9X19wYWNrZWQ7CiAKIAogc3RydWN0IGNpc2NvX3BhY2tldCB7CkBAIC00NSw3ICs0NSw3IEBACiAJX19iZTMyIHBhcjI7CiAJX19iZTE2IHJlbDsJCS8qIHJlbGlhYmlsaXR5ICovCiAJX19iZTMyIHRpbWU7Ci19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfV9fcGFja2VkOwogI2RlZmluZQlDSVNDT19QQUNLRVRfTEVOCTE4CiAjZGVmaW5lCUNJU0NPX0JJR19QQUNLRVRfTEVOCTIwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jCmluZGV4IDBlNTI5OTMuLjBlZGI1MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJdW5zaWduZWQgZGU6CTE7CiAJdW5zaWduZWQgZWEyOgkxOwogI2VuZGlmCi19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZyX2hkcjsKK31fX3BhY2tlZCBmcl9oZHI7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgcHZjX2RldmljZV9zdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGEuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKaW5kZXggNDNhZTZmNC4uZjQxMjVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NkbGEuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIHsKIAlzaG9ydCBkbGNpOwogCWNoYXIgIGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBfZnJhZF9zdGF0IAogewpAQCAtMTIxMSwxNCArMTIxMSw5IEBACiAJfQogCWVsc2UKIAl7Ci0JCXRlbXAgPSBrbWFsbG9jKG1lbS5sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXRlbXApCi0JCQlyZXR1cm4oLUVOT01FTSk7Ci0JCWlmKGNvcHlfZnJvbV91c2VyKHRlbXAsIG1lbS5kYXRhLCBtZW0ubGVuKSkKLQkJewotCQkJa2ZyZWUodGVtcCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCQl0ZW1wID0gbWVtZHVwX3VzZXIobWVtLmRhdGEsIG1lbS5sZW4pOworCQlpZiAoSVNfRVJSKHRlbXApKQorCQkJcmV0dXJuIFBUUl9FUlIodGVtcCk7CiAJCXNkbGFfd3JpdGUoZGV2LCBtZW0uYWRkciwgdGVtcCwgbWVtLmxlbik7CiAJCWtmcmVlKHRlbXApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dkLmMgYi9kcml2ZXJzL25ldC93ZC5jCmluZGV4IDc0NmE1ZWUuLmViNzJjNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dkLmMKKysrIGIvZHJpdmVycy9uZXQvd2QuYwpAQCAtMzU4LDggKzM1OCwxMCBAQAogI2VuZGlmCiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CisJfQogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCmluZGV4IGQ4NmU4ZjMuLjlmYjAzMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2NvbnRyb2wuYwpAQCAtNTAsNyArNTAsNyBAQAogICoKICAqIFJPQURNQVAKICAqCi0gKiBpMjQwMG1fZGV2X2luaXRhbGl6ZSgpICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0YXJ0KCkKKyAqIGkyNDAwbV9kZXZfaW5pdGlhbGl6ZSgpICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0YXJ0KCkKICAqICAgaTI0MDBtX3NldF9pbml0X2NvbmZpZygpCiAgKiAgIGkyNDAwbV9jbWRfZ2V0X3N0YXRlKCkKICAqIGkyNDAwbV9kZXZfc2h1dGRvd24oKSAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9kZXZfc3RvcCgpCkBAIC04NDgsNyArODQ4LDcgQEAKIAlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIGhkcjsKIAlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgdGx2OwogCV9fbGUzMiB2YWw7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZncuYwppbmRleCAxMTQ5MTM1Li44YjU1YTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZncuYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZncuYwpAQCAtNjUxLDcgKzY1MSw3IEBACiAJc3RydWN0IHsKIAkJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBjbWQ7CiAJCXU4IGNtZF9wYXlsb2FkW2NodW5rX2xlbl07Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqYnVmOworCX0gX19wYWNrZWQgKmJ1ZjsKIAlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGFjazsKIAogCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwIGNodW5rICVwIF9fY2h1bmtfbGVuICV6dSBhZGRyIDB4JTA4bHggIgpAQCAtNzk0LDcgKzc5NCw3IEBACiAJc3RydWN0IHsKIAkJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBjbWQ7CiAJCXU4IGNtZF9wbFswXTsKLQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWRfYnVmOworCX0gX19wYWNrZWQgKmNtZF9idWY7CiAJc2l6ZV90IHNpZ25hdHVyZV9ibG9ja19vZmZzZXQsIHNpZ25hdHVyZV9ibG9ja19zaXplOwogCiAJZF9mbnN0YXJ0KDMsIGRldiwgIm9mZnNldCAlenVcbiIsIG9mZnNldCk7CkBAIC0xMDI5LDcgKzEwMjksNyBAQAogCXN0cnVjdCB7CiAJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOwogCQl1OCBhY2tfcGxbMTZdOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWNrX2J1ZjsKKwl9IF9fcGFja2VkIGFja19idWY7CiAKIAlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CiAJY21kID0gaTI0MDBtLT5ibV9jbWRfYnVmOwpAQCAtMTExNSw3ICsxMTE1LDcgQEAKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGNtZDsKIAkJc3RydWN0IGkyNDAwbV9iY2ZfaGRyIGNtZF9wbDsKLQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWRfYnVmOworCX0gX19wYWNrZWQgKmNtZF9idWY7CiAJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBhY2s7CiAKIAlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBiY2ZfaGRyICVwKVxuIiwgaTI0MDBtLCBiY2ZfaGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tdXNiLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXVzYi5oCmluZGV4IDJkN2M5NmQuLmViODAyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2kyNDAwbS11c2IuaApAQCAtMTUyLDYgKzE1Miw3IEBACiAJLyogRGV2aWNlIElEcyAqLwogCVVTQl9ERVZJQ0VfSURfSTYwNTAgPSAweDAxODYsCiAJVVNCX0RFVklDRV9JRF9JNjA1MF8yID0gMHgwMTg4LAorCVVTQl9ERVZJQ0VfSURfSTYyNTAgPSAweDAxODcsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9vcC1yZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9vcC1yZmtpbGwuYwppbmRleCAwMzVlNGNmLi45ZTAyYjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vb3AtcmZraWxsLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL29wLXJma2lsbC5jCkBAIC05MSw3ICs5MSw3IEBACiAJc3RydWN0IHsKIAkJc3RydWN0IGkyNDAwbV9sM2w0X2hkciBoZHI7CiAJCXN0cnVjdCBpMjQwMG1fdGx2X3JmX29wZXJhdGlvbiBzd19yZjsKLQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWQ7CisJfSBfX3BhY2tlZCAqY21kOwogCWNoYXIgc3RyZXJyWzMyXTsKIAogCWRfZm5zdGFydCg0LCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICVkKVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKaW5kZXggMGQ1MDgxZC4uZDMzNjVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYwpAQCAtNDkxLDYgKzQ5MSw3IEBACiAJc3dpdGNoIChpZC0+aWRQcm9kdWN0KSB7CiAJY2FzZSBVU0JfREVWSUNFX0lEX0k2MDUwOgogCWNhc2UgVVNCX0RFVklDRV9JRF9JNjA1MF8yOgorCWNhc2UgVVNCX0RFVklDRV9JRF9JNjI1MDoKIAkJaTI0MDBtdS0+aTYwNTAgPSAxOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNzM5LDYgKzc0MCw3IEBACiBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpMjQwMG11X2lkX3RhYmxlW10gPSB7CiAJeyBVU0JfREVWSUNFKDB4ODA4NiwgVVNCX0RFVklDRV9JRF9JNjA1MCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHg4MDg2LCBVU0JfREVWSUNFX0lEX0k2MDUwXzIpIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgVVNCX0RFVklDRV9JRF9JNjI1MCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAxODEpIH0sCiAJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgxNDAzKSB9LAogCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MTQwNSkgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYwppbmRleCA4ODBhZDlkLi5hMTA1MDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jCkBAIC0zNzMsOCArMzczLDggQEAKIAkJcGt0bGVuID0gc3RhdHVzICYgUkRFUzBfU1RBVFVTX0ZMOwogCQlpZiAocGt0bGVuID4gUlhfUEtUX1NJWkUpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmcmFtZSB0b28gbG9uZyAoJWQpXG4iLAotCQkJCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBwa3RsZW4pOworCQkJCXdpcGh5X2RlYnVnKGRldi0+d2lwaHksICJmcmFtZSB0b28gbG9uZyAoJWQpXG4iLAorCQkJCQkgICAgcGt0bGVuKTsKIAkJCXBrdGxlbiA9IFJYX1BLVF9TSVpFOwogCQl9CiAKQEAgLTQ1NCwxMCArNDU0LDEwIEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZG04MjExX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0jZGVmaW5lIEFETTgyMTFfSU5UKHgpCQkJCQkJCSAgIFwKLWRvIHsJCQkJCQkJCQkgICBcCi0JaWYgKHVubGlrZWx5KHN0c3IgJiBBRE04MjExX1NUU1JfICMjIHgpKQkJCSAgIFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiICN4ICJcbiIsIHdpcGh5X25hbWUoZGV2LT53aXBoeSkpOyBcCisjZGVmaW5lIEFETTgyMTFfSU5UKHgpCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh1bmxpa2VseShzdHNyICYgQURNODIxMV9TVFNSXyAjIyB4KSkJCVwKKwkJd2lwaHlfZGVidWcoZGV2LT53aXBoeSwgIiVzXG4iLCAjeCk7CQlcCiB9IHdoaWxlICgwKQogCiAJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gZGV2X2lkOwpAQCAtNTcwLDkgKzU3MCw5IEBACiAJfQogCiAJaWYgKHRpbWVvdXQgPT0gMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGFkbTgyMTFfd3JpdGVfYmJwKCVkLCVkKSBmYWlsZWQiCi0JCSAgICAgICAiIHByZXdyaXRlIChyZWc9MHglMDh4KVxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksIGFkZHIsIGRhdGEsIHJlZyk7CisJCXdpcGh5X2RlYnVnKGRldi0+d2lwaHksCisJCQkgICAgImFkbTgyMTFfd3JpdGVfYmJwKCVkLCVkKSBmYWlsZWQgcHJld3JpdGUgKHJlZz0weCUwOHgpXG4iLAorCQkJICAgIGFkZHIsIGRhdGEsIHJlZyk7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIApAQCAtNjA1LDkgKzYwNSw5IEBACiAJaWYgKHRpbWVvdXQgPT0gMCkgewogCQlBRE04MjExX0NTUl9XUklURShCQlBDVEwsIEFETTgyMTFfQ1NSX1JFQUQoQkJQQ1RMKSAmCiAJCQkJICB+QURNODIxMV9CQlBDVExfV1IpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGFkbTgyMTFfd3JpdGVfYmJwKCVkLCVkKSBmYWlsZWQiCi0JCSAgICAgICAiIHBvc3R3cml0ZSAocmVnPTB4JTA4eClcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBhZGRyLCBkYXRhLCByZWcpOworCQl3aXBoeV9kZWJ1ZyhkZXYtPndpcGh5LAorCQkJICAgICJhZG04MjExX3dyaXRlX2JicCglZCwlZCkgZmFpbGVkIHBvc3R3cml0ZSAocmVnPTB4JTA4eClcbiIsCisJCQkgICAgYWRkciwgZGF0YSwgcmVnKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCkBAIC02NzUsOCArNjc1LDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuc3VwcG9ydGVkIHRyYW5zY2VpdmVyIHR5cGUgJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBwcml2LT50cmFuc2NlaXZlcl90eXBlKTsKKwkJd2lwaHlfZGVidWcoZGV2LT53aXBoeSwgInVuc3VwcG9ydGVkIHRyYW5zY2VpdmVyIHR5cGUgJWRcbiIsCisJCQkgICAgcHJpdi0+dHJhbnNjZWl2ZXJfdHlwZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzMyLDggKzczMiw4IEBACiAKIAkvKiBOb3RoaW5nIHRvIGRvIGZvciBBRE10ZWsgQkJQICovCiAJfSBlbHNlIGlmIChwcml2LT5iYnBfdHlwZSAhPSBBRE04MjExX1RZUEVfQURNVEVLKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuc3VwcG9ydGVkIEJCUCB0eXBlICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwgcHJpdi0+YmJwX3R5cGUpOworCQl3aXBoeV9kZWJ1ZyhkZXYtPndpcGh5LCAidW5zdXBwb3J0ZWQgYmJwIHR5cGUgJWRcbiIsCisJCQkgICAgcHJpdi0+YmJwX3R5cGUpOwogCiAJQURNODIxMV9SRVNUT1JFKCk7CiAKQEAgLTEwMjcsMTMgKzEwMjcsMTIgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuc3VwcG9ydGVkIHRyYW5zY2VpdmVyICVkXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksIHByaXYtPnRyYW5zY2VpdmVyX3R5cGUpOworCQkJd2lwaHlfZGVidWcoZGV2LT53aXBoeSwgInVuc3VwcG9ydGVkIHRyYW5zY2VpdmVyICVkXG4iLAorCQkJCSAgICBwcml2LT50cmFuc2NlaXZlcl90eXBlKTsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5zdXBwb3J0ZWQgQkJQICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwgcHJpdi0+YmJwX3R5cGUpOworCQl3aXBoeV9kZWJ1ZyhkZXYtPndpcGh5LCAidW5zdXBwb3J0ZWQgYmJwICVkXG4iLCBwcml2LT5iYnBfdHlwZSk7CiAKIAlBRE04MjExX0NTUl9XUklURShTWU5SRiwgMCk7CiAKQEAgLTE1MDksMTUgKzE1MDgsMTMgQEAKIAkvKiBQb3dlciB1cCBNQUMgYW5kIFJGIGNoaXBzICovCiAJcmV0dmFsID0gYWRtODIxMV9od19yZXNldChkZXYpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaGFyZHdhcmUgcmVzZXQgZmFpbGVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7CisJCXdpcGh5X2VycihkZXYtPndpcGh5LCAiaGFyZHdhcmUgcmVzZXQgZmFpbGVkXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAogCXJldHZhbCA9IGFkbTgyMTFfaW5pdF9yaW5ncyhkZXYpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGluaXRpYWxpemUgcmluZ3NcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSByaW5nc1xuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE1MjgsOCArMTUyNSw3IEBACiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocHJpdi0+cGRldi0+aXJxLCBhZG04MjExX2ludGVycnVwdCwKIAkJCSAgICAgSVJRRl9TSEFSRUQsICJhZG04MjExIiwgZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBJUlEgaGFuZGxlclxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQl3aXBoeV9lcnIoZGV2LT53aXBoeSwgImZhaWxlZCB0byByZWdpc3RlciBpcnEgaGFuZGxlclxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE5MDMsMTUgKzE4OTksMTcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXMgKGFkbTgyMTEpOiBDYW5ub3QgcmVnaXN0ZXIgZGV2aWNlXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwotCQlnb3RvIGVycl9mcmVlX2Rlc2M7CisJCWdvdG8gZXJyX2ZyZWVfZWVwcm9tOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBod2FkZHIgJXBNLCBSZXYgMHglMDJ4XG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBkZXYtPndpcGh5LT5wZXJtX2FkZHIsCi0JICAgICAgIHBkZXYtPnJldmlzaW9uKTsKKwl3aXBoeV9pbmZvKGRldi0+d2lwaHksICJod2FkZHIgJXBtLCByZXYgMHglMDJ4XG4iLAorCQkgICBkZXYtPndpcGh5LT5wZXJtX2FkZHIsIHBkZXYtPnJldmlzaW9uKTsKIAogCXJldHVybiAwOwogCisgZXJyX2ZyZWVfZWVwcm9tOgorCWtmcmVlKHByaXYtPmVlcHJvbSk7CisKICBlcnJfZnJlZV9kZXNjOgogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGFkbTgyMTFfZGVzYykgKiBwcml2LT5yeF9yaW5nX3NpemUgKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5oCmluZGV4IGIwN2U0ZDMuLmJiYzEwYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmgKQEAgLTgwLDcgKzgwLDcgQEAKIAlfX2xlMzIgRkVNUjsJCS8qIDB4MTA0ICovCiAJX19sZTMyIEZQU1I7CQkvKiAweDEwOCAqLwogCV9fbGUzMiBGRkVSOwkJLyogMHgxMEMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQ1NSMCAtIFBBUiAoUENJIEFkZHJlc3MgUmVnaXN0ZXIpICovCiAjZGVmaW5lIEFETTgyMTFfUEFSX01XSUUJKDEgPDwgMjQpCkBAIC00ODQsNyArNDg0LDcgQEAKIAl1OCBlbnRyeV9jb250cm9sOwkvLyBodWg/PwogCXUxNiByZXNlcnZlZF8xOwogCXUzMiByZXNlcnZlZF8yOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKICNkZWZpbmUgUlhfQ09QWV9CUkVBSyAxMjgKQEAgLTUzMSw3ICs1MzEsNyBAQAogCXU4CWxuYWdzX3RocmVzaG9sZFsxNF07CS8qIDB4NzAgKi8KIAlfX2xlMTYJY2hlY2tzdW07CQkvKiAweDdFICovCiAJdTgJY2lzX2RhdGFbMF07CQkvKiAweDgwLCAzODQgYnl0ZXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFkbTgyMTFfcHJpdiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggM2I3YWIyMC4uMWQwNTQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtNTA2LDIwICs1MDYsMjAgQEAKIAl1OCBtYWNbRVRIX0FMRU5dOwogCV9fbGUxNiBrbGVuOwogCXU4IGtleVsxNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIGZyb20gdGhlIEFpcm9uZXQncyBQQzQ1MDAgRGV2ZWxvcGVycyBNYW51YWwgKi8KIHR5cGVkZWYgc3RydWN0IFNzaWQgU3NpZDsKIHN0cnVjdCBTc2lkIHsKIAlfX2xlMTYgbGVuOwogCXU4IHNzaWRbMzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCBTc2lkUmlkIFNzaWRSaWQ7CiBzdHJ1Y3QgU3NpZFJpZCB7CiAJX19sZTE2IGxlbjsKIAlTc2lkIHNzaWRzWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCBNb2R1bGF0aW9uUmlkIE1vZHVsYXRpb25SaWQ7CiBzdHJ1Y3QgTW9kdWxhdGlvblJpZCB7CkBAIC01MjgsNyArNTI4LDcgQEAKICNkZWZpbmUgTU9EX0RFRkFVTFQgY3B1X3RvX2xlMTYoMCkKICNkZWZpbmUgTU9EX0NDSyBjcHVfdG9fbGUxNigxKQogI2RlZmluZSBNT0RfTU9LIGNwdV90b19sZTE2KDIpCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHR5cGVkZWYgc3RydWN0IENvbmZpZ1JpZCBDb25maWdSaWQ7CiBzdHJ1Y3QgQ29uZmlnUmlkIHsKQEAgLTY1Miw3ICs2NTIsNyBAQAogI2RlZmluZSBNQUdJQ19TVEFZX0lOX0NBTSAoMTw8MTApCiAJdTggbWFnaWNDb250cm9sOwogCV9fbGUxNiBhdXRvV2FrZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogdHlwZWRlZiBzdHJ1Y3QgU3RhdHVzUmlkIFN0YXR1c1JpZDsKIHN0cnVjdCBTdGF0dXNSaWQgewpAQCAtNzExLDIwICs3MTEsMjAgQEAKICNkZWZpbmUgU1RBVF9MRUFQRkFJTEVEIDkxCiAjZGVmaW5lIFNUQVRfTEVBUFRJTUVET1VUIDkyCiAjZGVmaW5lIFNUQVRfTEVBUENPTVBMRVRFIDkzCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHR5cGVkZWYgc3RydWN0IFN0YXRzUmlkIFN0YXRzUmlkOwogc3RydWN0IFN0YXRzUmlkIHsKIAlfX2xlMTYgbGVuOwogCV9fbGUxNiBzcGFjZXI7CiAJX19sZTMyIHZhbHNbMTAwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogdHlwZWRlZiBzdHJ1Y3QgQVBMaXN0UmlkIEFQTGlzdFJpZDsKIHN0cnVjdCBBUExpc3RSaWQgewogCV9fbGUxNiBsZW47CiAJdTggYXBbNF1bRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCBDYXBhYmlsaXR5UmlkIENhcGFiaWxpdHlSaWQ7CiBzdHJ1Y3QgQ2FwYWJpbGl0eVJpZCB7CkBAIC03NTQsNyArNzU0LDcgQEAKIAlfX2xlMTYgYm9vdEJsb2NrVmVyOwogCV9fbGUxNiByZXF1aXJlZEhhcmQ7CiAJX19sZTE2IGV4dFNvZnRDYXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE9ubHkgcHJlc2VudCBvbiBmaXJtd2FyZSA+PSA1LjMwLjE3ICovCiB0eXBlZGVmIHN0cnVjdCBCU1NMaXN0UmlkRXh0cmEgQlNTTGlzdFJpZEV4dHJhOwpAQCAtNzYyLDcgKzc2Miw3IEBACiAgIF9fbGUxNiB1bmtub3duWzRdOwogICB1OCBmaXhlZFsxMl07IC8qIFdMQU4gbWFuYWdlbWVudCBmcmFtZSAqLwogICB1OCBpZXBbNjI0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogdHlwZWRlZiBzdHJ1Y3QgQlNTTGlzdFJpZCBCU1NMaXN0UmlkOwogc3RydWN0IEJTU0xpc3RSaWQgewpAQCAtNzk2LDcgKzc5Niw3IEBACiAKICAgLyogT25seSBwcmVzZW50IG9uIGZpcm13YXJlID49IDUuMzAuMTcgKi8KICAgQlNTTGlzdFJpZEV4dHJhIGV4dHJhOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIEJTU0xpc3RSaWQgYnNzOwpAQCAtODA3LDEzICs4MDcsMTMgQEAKIHN0cnVjdCB0ZHNSc3NpRW50cnkgewogICB1OCByc3NpcGN0OwogICB1OCByc3NpZEJtOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCB0ZHNSc3NpUmlkIHRkc1Jzc2lSaWQ7CiBzdHJ1Y3QgdGRzUnNzaVJpZCB7CiAgIHUxNiBsZW47CiAgIHRkc1Jzc2lFbnRyeSB4WzI1Nl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHR5cGVkZWYgc3RydWN0IE1JQ1JpZCBNSUNSaWQ7CiBzdHJ1Y3QgTUlDUmlkIHsKQEAgLTgyMyw3ICs4MjMsNyBAQAogCXU4ICBtdWx0aWNhc3RbMTZdOwogCV9fbGUxNiB1bmljYXN0VmFsaWQ7CiAJdTggIHVuaWNhc3RbMTZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCBNSUNCdWZmZXIgTUlDQnVmZmVyOwogc3RydWN0IE1JQ0J1ZmZlciB7CkBAIC04NDEsNyArODQxLDcgQEAKIAl9IHU7CiAJX19iZTMyIG1pYzsKIAlfX2JlMzIgc2VxOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdTggZGFbRVRIX0FMRU5dOwpAQCAtOTk2LDcgKzk5Niw3IEBACiAJdTggcmF0ZTsKIAl1OCBmcmVxOwogCV9fbGUxNiB0bXBbNF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAl1bnNpZ25lZCBpbnQgIGN0bDogMTU7CkBAIC0yOTMxLDggKzI5MzEsOCBAQAogCSAgICAgICAgcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCApOwogZXJyX291dF9uZXRzOgogCWFpcm9fbmV0d29ya3NfZnJlZShhaSk7Ci0JZGVsX2Fpcm9fZGV2KGFpKTsKIGVycl9vdXRfZnJlZToKKwlkZWxfYWlyb19kZXYoYWkpOwogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC00NjU3LDcgKzQ2NTcsNyBAQAogCQkJICAgbG9mZl90ICpvZmZzZXQgKQogewogCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OwotCXN0cnVjdCBwcm9jX2RhdGEgKnByaXYgPSAoc3RydWN0IHByb2NfZGF0YSopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcm9jX2RhdGEgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoIXByaXYtPndidWZmZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDY4OSw3ICs0Njg5LDcgQEAKIAogCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMjA0OCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CiAJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ3NzIsNyArNDc3Miw3IEBACiAKIAlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDQwOTYsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgewogCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01MDQ1LDcgKzUwNDUsNyBAQAogCiAJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAyMDQ4LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKIAkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTEyNyw3ICs1MTI3LDcgQEAKIAogc3RhdGljIHZvaWQgcHJvY19TU0lEX29uX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+bWxfcHJpdjsKQEAgLTUxNjMsNyArNTE2Myw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHByb2NfQVBMaXN0X29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKLQlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPm1sX3ByaXY7CkBAIC01MzA5LDcgKzUzMDksNyBAQAogCiAJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKGtleSkpOwogCi0JZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CiAKIAlpZiAoZGF0YS0+d2J1ZmZlclswXSA+PSAnMCcgJiYgZGF0YS0+d2J1ZmZlclswXSA8PSAnMycgJiYKQEAgLTUzNjMsNyArNTM2Myw3IEBACiAJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoJndrciwgMCwgc2l6ZW9mKHdrcikpOwotCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGt6YWxsb2MoIDE4MCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CiAJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU0MDksNyArNTQwOSw3IEBACiAKIAlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwNCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CiAJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU0NTMsNyArNTQ1Myw3IEBACiAKIAlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwNCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CiAJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU0OTUsNyArNTQ5NSw3IEBACiAKIAlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwMjQsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgewogCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKaW5kZXggMzNiZGM2YS4uOWExMjFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMTU1LDggKzE1NCw2IEBACiAJCQkJdW5zaWduZWQgaW50IHZjYywKIAkJCQl2b2lkICpwcml2X2RhdGEpCiB7Ci0Jd2luX3JlcV90ICpyZXEgPSBwcml2X2RhdGE7Ci0KIAlpZiAoY2ZnLT5pbmRleCA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTc2LDUyICsxNzMsMjUgQEAKIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKIAogCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgJj0gfklPX0RBVEFfUEFUSF9XSURUSDsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PQorCQkJCQlwY21jaWFfaW9fY2ZnX2RhdGFfd2lkdGgoaW8tPmZsYWdzKTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKIAkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOwotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZmxhZ3MgPSBwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gaW8tPndpblsxXS5sZW47CiAJCX0KIAl9CiAKIAkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpICE9IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyoKLQkgIE5vdyBzZXQgdXAgYSBjb21tb24gbWVtb3J5IHdpbmRvdywgaWYgbmVlZGVkLiAgVGhlcmUgaXMgcm9vbQotCSAgaW4gdGhlIHN0cnVjdCBwY21jaWFfZGV2aWNlIHN0cnVjdHVyZSBmb3Igb25lIG1lbW9yeSB3aW5kb3cgaGFuZGxlLAotCSAgYnV0IGlmIHRoZSBiYXNlIGFkZHJlc3NlcyBuZWVkIHRvIGJlIHNhdmVkLCBvciBpZiBtdWx0aXBsZQotCSAgd2luZG93cyBhcmUgbmVlZGVkLCB0aGUgaW5mbyBzaG91bGQgZ28gaW4gdGhlIHByaXZhdGUgZGF0YQotCSAgc3RydWN0dXJlIGZvciB0aGlzIGRldmljZS4KLQotCSAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgd2luZG93IGJhc2UgaXMgYSBwaHlzaWNhbCBhZGRyZXNzLCBhbmQKLQkgIG5lZWRzIHRvIGJlIG1hcHBlZCB0byB2aXJ0dWFsIHNwYWNlIHdpdGggaW9yZW1hcCgpIGJlZm9yZSBpdAotCSAgaXMgdXNlZC4KLQkqLwotCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0LT5tZW0ubndpbiA+IDApKSB7Ci0JCWNpc3RwbF9tZW1fdCAqbWVtID0gKGNmZy0+bWVtLm53aW4pID8gJmNmZy0+bWVtIDogJmRmbHQtPm1lbTsKLQkJbWVtcmVxX3QgbWFwOwotCQlyZXEtPkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ007Ci0JCXJlcS0+QmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKLQkJcmVxLT5TaXplID0gbWVtLT53aW5bMF0ubGVuOwotCQlyZXEtPkFjY2Vzc1NwZWVkID0gMDsKLQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhwX2RldiwgcmVxLCAmcF9kZXYtPndpbikgIT0gMCkKLQkJCXJldHVybiAtRU5PREVWOwotCQltYXAuUGFnZSA9IDA7Ci0JCW1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOwotCQlpZiAocGNtY2lhX21hcF9tZW1fcGFnZShwX2RldiwgcF9kZXYtPndpbiwgJm1hcCkgIT0gMCkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KIAkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzAsMTcgKzIwMCwxMiBAQAogc3RhdGljIGludCBhaXJvX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlsb2NhbF9pbmZvX3QgKmRldjsKLQl3aW5fcmVxX3QgKnJlcTsKIAlpbnQgcmV0OwogCiAJZGV2ID0gbGluay0+cHJpdjsKIAogCWRldl9kYmcoJmxpbmstPmRldiwgImFpcm9fY29uZmlnXG4iKTsKIAotCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKHdpbl9yZXFfdCksIEdGUF9LRVJORUwpOwotCWlmICghcmVxKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCS8qCiAJICogSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUKIAkgKiBlbnRyaWVzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQKQEAgLTI1NSw3ICsyMjAsNyBAQAogCSAqIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluCiAJICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgogCSAqLwotCXJldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBhaXJvX2NzX2NvbmZpZ19jaGVjaywgcmVxKTsKKwlyZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgYWlyb19jc19jb25maWdfY2hlY2ssIE5VTEwpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCkBAIC0yNzIsNyArMjM3LDcgQEAKIAkJZ290byBmYWlsZWQ7CiAJKChsb2NhbF9pbmZvX3QgKilsaW5rLT5wcml2KS0+ZXRoX2RldiA9CiAJCWluaXRfYWlyb19jYXJkKGxpbmstPmlycSwKLQkJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEsIDEsICZsaW5rLT5kZXYpOworCQkJICAgICAgIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgMSwgJmxpbmstPmRldik7CiAJaWYgKCEoKGxvY2FsX2luZm9fdCAqKWxpbmstPnByaXYpLT5ldGhfZGV2KQogCQlnb3RvIGZhaWxlZDsKIApAQCAtMjgyLDIyICsyNDcsMTUgQEAKIAlpZiAobGluay0+Y29uZi5WcHApCiAJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcC8xMCwgbGluay0+Y29uZi5WcHAlMTApOwogCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMyKQotCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCi0JCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOwotCWlmIChsaW5rLT53aW4pCi0JCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgcmVxLT5CYXNlLAotCQkgICAgICAgcmVxLT5CYXNlK3JlcS0+U2l6ZS0xKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMF0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMF0pOworCWlmIChsaW5rLT5yZXNvdXJjZVsxXSkKKwkJcHJpbnRrKCIgJiAlcFIiLCBsaW5rLT5yZXNvdXJjZVsxXSk7CiAJcHJpbnRrKCJcbiIpOwotCWtmcmVlKHJlcSk7CiAJcmV0dXJuIDA7CiAKICBmYWlsZWQ6CiAJYWlyb19yZWxlYXNlKGxpbmspOwotCWtmcmVlKHJlcSk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9IC8qIGFpcm9fY29uZmlnICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmMKaW5kZXggOGEyZDRhZi4uZDUxNDBhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmMKQEAgLTcsNiArNyw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4KICAqIENvcHlyaWdodCAoYykgMjAwNyBLYWxsZSBWYWxvIDxrYWxsZS52YWxvQGlraS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBTZWJhc3RpYW4gU21vbG9yeiA8c2VzbW9AZ214Lm5ldD4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtODgsMjIgKzg5LDE5IEBACiAjZGVmaW5lIERCR19ERUZBVUxUUwkJMAogCiAvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KLSNkZWZpbmUgYXQ3Nl9kYmcoYml0cywgZm9ybWF0LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGF0NzZfZGVidWcgJiAoYml0cykpCQkJCSBcCi0JCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgXAotCQkJICAgICAgICMjIGFyZyk7CQkJCQkgXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIGF0NzZfZGJnKGJpdHMsIGZvcm1hdCwgYXJnLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoYXQ3Nl9kZWJ1ZyAmIChiaXRzKSkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogIiBmb3JtYXQgIlxuIiwgIyNhcmcpOwlcCit9IHdoaWxlICgwKQogCi0jZGVmaW5lIGF0NzZfZGJnX2R1bXAoYml0cywgYnVmLCBsZW4sIGZvcm1hdCwgYXJnLi4uKQlcCi0JZG8geyBcCi0JCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKSB7IFwKLQkJCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCBcCi0JCQkgICAgICAgIyMgYXJnKTsJCQkJCSBcCi0JCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAgICAgXAotCQkJCQkgICAgIGJ1ZiwgbGVuKTsJCQkgXAotCQl9CQkJCQkJCSBcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXQ3Nl9kYmdfZHVtcChiaXRzLCBidWYsIGxlbiwgZm9ybWF0LCBhcmcuLi4pCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoYXQ3Nl9kZWJ1ZyAmIChiaXRzKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiAiIGZvcm1hdCAiXG4iLCAjI2FyZyk7CVwKKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgYnVmLCBsZW4pOwlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljIHVpbnQgYXQ3Nl9kZWJ1ZyA9IERCR19ERUZBVUxUUzsKIApAQCAtMzA1LDcgKzMwMyw3IEBACiAJdW5zaWduZWQgY2hhciBwb2xsX3RpbWVvdXRbM107CiAJdW5zaWduZWQgY2hhciBzdGF0ZTsKIAl1bnNpZ25lZCBjaGFyIHN0cmluZzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzX2ludGVyc2lsKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKQEAgLTY1Nyw4ICs2NTUsOCBAQAogZXhpdDoKIAlrZnJlZShod2NmZyk7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBnZXQgSFcgQ29uZmlnIChlcnJvciAlZClcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjYW5ub3QgZ2V0IGh3IGNvbmZpZyAoZXJyb3IgJWQpXG4iLAorCQkJICByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc5Myw4ICs3OTEsOSBAQAogCWRvIHsKIAkJc3RhdHVzID0gYXQ3Nl9nZXRfY21kX3N0YXR1cyhwcml2LT51ZGV2LCBjbWQpOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfY21kX3N0YXR1cyBmYWlsZWQ6ICVkXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgc3RhdHVzKTsKKwkJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkJICAiYXQ3Nl9nZXRfY21kX3N0YXR1cyBmYWlsZWQ6ICVkXG4iLAorCQkJCSAgc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTgwOSw5ICs4MDgsOCBAQAogCiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWiAvIDEwKTsJLyogMTAwIG1zICovCiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IGNvbXBsZXRpb24gdGltZW91dCBmb3IgY29tbWFuZCAlZFxuIiwKLQkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCk7CisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJCSAgImNvbXBsZXRpb24gdGltZW91dCBmb3IgY29tbWFuZCAlZFxuIiwgY21kKTsKIAkJCXN0YXR1cyA9IC1FVElNRURPVVQ7CiAJCQlicmVhazsKIAkJfQpAQCAtODMyLDkgKzgzMCw5IEBACiAKIAlyZXQgPSBhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfU0VUX01JQik7CiAJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICIlczogc2V0X21pYjogYXQ3Nl93YWl0X2NvbXBsZXRpb24gZmFpbGVkICIKLQkJICAgICAgICJ3aXRoICVkXG4iLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2luZm8ocHJpdi0+aHctPndpcGh5LAorCQkJICAgInNldF9taWI6IGF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZCB3aXRoICVkXG4iLAorCQkJICAgcmV0KTsKIAkJcmV0ID0gLUVJTzsKIAl9CiAKQEAgLTg1NCw4ICs4NTIsOCBAQAogCiAJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIGNtZCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfc2V0X2NhcmRfY29tbWFuZCglZCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgY21kLCByZXQpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAiYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKCVkKSBmYWlsZWQ6ICVkXG4iLCBjbWQsIHJldCk7CiAJZWxzZQogCQlyZXQgPSAxOwogCkBAIC04NzUsOCArODczLDggQEAKIAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHBtX21vZGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJzZXRfbWliIChwbV9tb2RlKSBmYWlsZWQ6ICVkXG4iLAorCQkJICByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg5Miw4ICs4OTAsOCBAQAogCiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAocHJlYW1ibGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJzZXRfbWliIChwcmVhbWJsZSkgZmFpbGVkOiAlZFxuIiwKKwkJCSAgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC05MDksOCArOTA3LDggQEAKIAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGZyYWcgdGhyZXNob2xkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAic2V0X21pYiAoZnJhZyB0aHJlc2hvbGQpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTI2LDggKzkyNCw3IEBACiAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChydHMpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJzZXRfbWliIChydHMpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTQzLDggKzk0MCw4IEBACiAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChhdXRvcmF0ZSBmYWxsYmFjaykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgInNldF9taWIgKGF1dG9yYXRlIGZhbGxiYWNrKSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk2Miw4ICs5NTksOCBAQAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDX0FERFIsIG0sCiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tYWNfYWRkcikpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX0FERFIpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkgICJhdDc2X2dldF9taWIgKG1hY19hZGRyKSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC05OTEsOCArOTg4LDggQEAKIAlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19XRVAsIG0sCiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tYWNfd2VwKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNQUNfV0VQKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAiYXQ3Nl9nZXRfbWliIChtYWNfd2VwKSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMDI4LDggKzEwMjUsOCBAQAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDX01HTVQsIG0sCiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tYWNfbWdtdCkpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX01HTVQpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkgICJhdDc2X2dldF9taWIgKG1hY19tZ210KSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMDY0LDggKzEwNjEsOCBAQAogCiAJcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9NQUMsIG0sIHNpemVvZihzdHJ1Y3QgbWliX21hYykpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTUFDKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAiYXQ3Nl9nZXRfbWliIChtYWMpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTExMDEsOCArMTA5OCw4IEBACiAKIAlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX1BIWSwgbSwgc2l6ZW9mKHN0cnVjdCBtaWJfcGh5KSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChQSFkpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkgICJhdDc2X2dldF9taWIgKHBoeSkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTEzNCw4ICsxMTMxLDggQEAKIAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTE9DQUwsIG0sIHNpemVvZihzdHJ1Y3QgbWliX2xvY2FsKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChMT0NBTCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgImF0NzZfZ2V0X21pYiAobG9jYWwpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTExNjAsOCArMTE1Nyw4IEBACiAJcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9NRE9NQUlOLCBtLAogCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWRvbWFpbikpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTURPTUFJTikgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgImF0NzZfZ2V0X21pYiAobWRvbWFpbikgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTIzMiwxNiArMTIyOSwxNiBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7CiAKIAlpZiAoIXByaXYtPnJ4X3VyYikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogcHJpdi0+cnhfdXJiIGlzIE5VTExcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIF9fZnVuY19fKTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgIiVzOiBwcml2LT5yeF91cmIgaXMgbnVsbFxuIiwKKwkJCSAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlpZiAoIXNrYikgewogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIpKTsKIAkJaWYgKCFza2IpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSByeCBza2J1ZmZcbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKKwkJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkJICAiY2Fubm90IGFsbG9jYXRlIHJ4IHNrYnVmZlxuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0xMjYwLDE1ICsxMjU3LDE0IEBACiAJCQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsCiAJCQkJICJ1c2Jfc3VibWl0X3VyYiByZXR1cm5lZCAtRU5PREVWIik7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJ4LCB1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkJICAicngsIHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJfQogCiBleGl0OgogCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PREVWKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3Qgc3VibWl0IHJ4IHVyYiAtIHBsZWFzZSB1bmxvYWQgdGhlICIKLQkJICAgICAgICJkcml2ZXIgYW5kL29yIHBvd2VyIGN5Y2xlIHRoZSBkZXZpY2VcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAiY2Fubm90IHN1Ym1pdCByeCB1cmIgLSBwbGVhc2UgdW5sb2FkIHRoZSBkcml2ZXIgYW5kL29yIHBvd2VyIGN5Y2xlIHRoZSBkZXZpY2VcbiIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0MzcsOCArMTQzMyw4IEBACiAJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TVEFSVFVQLCAmcHJpdi0+Y2FyZF9jb25maWcsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgYXQ3Nl9jYXJkX2NvbmZpZykpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfc2V0X2NhcmRfY29tbWFuZCBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiYXQ3Nl9zZXRfY2FyZF9jb21tYW5kIGZhaWxlZDogJWRcbiIsCisJCQkgIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNTAzLDggKzE0OTksOCBAQAogCiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAocHJvbWlzY3VvdXNfbW9kZSkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgInNldF9taWIgKHByb21pc2N1b3VzX21vZGUpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAltdXRleF91bmxvY2soJnByaXYtPm10eCk7CiB9CkBAIC0xNjQ5LDYgKzE2NDUsNTggQEAKIAkJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgYXQ3Nl9qb2luKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGF0NzZfcmVxX2pvaW4gam9pbjsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZqb2luLCAwLCBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2pvaW4pKTsKKwltZW1jcHkoam9pbi5lc3NpZCwgcHJpdi0+ZXNzaWQsIHByaXYtPmVzc2lkX3NpemUpOworCWpvaW4uZXNzaWRfc2l6ZSA9IHByaXYtPmVzc2lkX3NpemU7CisJbWVtY3B5KGpvaW4uYnNzaWQsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7CisJam9pbi5ic3NfdHlwZSA9IElORlJBU1RSVUNUVVJFX01PREU7CisJam9pbi5jaGFubmVsID0gcHJpdi0+Y2hhbm5lbDsKKwlqb2luLnRpbWVvdXQgPSBjcHVfdG9fbGUxNigyMDAwKTsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBzZW5kaW5nIENNRF9KT0lOIiwgX19mdW5jX18pOworCXJldCA9IGF0NzZfc2V0X2NhcmRfY29tbWFuZChwcml2LT51ZGV2LCBDTURfSk9JTiwgJmpvaW4sCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOworCisJaWYgKHJldCA8IDApIHsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImF0NzZfc2V0X2NhcmRfY29tbWFuZCBmYWlsZWQ6ICVkXG4iLAorCQkJICByZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfSk9JTik7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IENNRF9KT0lOIHJldHVybmVkOiAweCUwMngiLCBfX2Z1bmNfXywgcmV0KTsKKwlpZiAocmV0ICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZDogJWRcbiIsCisJCQkgIHJldCk7CisJCXJldHVybiAwOworCX0KKworCWF0NzZfc2V0X3BtX21vZGUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl93b3JrX2pvaW5fYnNzaWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKKwkJCQkJICAgICAgd29ya19qb2luX2Jzc2lkKTsKKworCWlmIChwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+YnNzaWQpKQorCQlhdDc2X2pvaW4ocHJpdik7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7Cit9CisKIHN0YXRpYyB2b2lkIGF0NzZfbWFjODAyMTFfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7CkBAIC0xNjg2LDE2ICsxNzM0LDMyIEBACiAJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhfYnVmZmVyID0gcHJpdi0+YnVsa19vdXRfYnVmZmVyOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiLT5kYXRhOwogCWludCBwYWRkaW5nLCBzdWJtaXRfbGVuLCByZXQ7CiAKIAlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpIiwgX19mdW5jX18pOwogCiAJaWYgKHByaXYtPnR4X3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBjYWxsZWQgd2hpbGUgdHggdXJiIGlzIHBlbmRpbmdcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIF9fZnVuY19fKTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgIiVzIGNhbGxlZCB3aGlsZSB0eCB1cmIgaXMgcGVuZGluZ1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCisJLyogVGhlIGZvbGxvd2luZyBjb2RlIGxpbmVzIGFyZSBpbXBvcnRhbnQgd2hlbiB0aGUgZGV2aWNlIGlzIGdvaW5nIHRvCisJICogYXV0aGVudGljYXRlIHdpdGggYSBuZXcgYnNzaWQuIFRoZSBkcml2ZXIgbXVzdCBzZW5kIENNRF9KT0lOIGJlZm9yZQorCSAqIGFuIGF1dGhlbnRpY2F0aW9uIGZyYW1lIGlzIHRyYW5zbWl0dGVkLiBGb3IgdGhpcyB0byBzdWNjZWVkLCB0aGUKKwkgKiBjb3JyZWN0IGJzc2lkIG9mIHRoZSBBUCBtdXN0IGJlIGtub3duLiBBcyBtYWM4MDIxMSBkb2VzIG5vdCBpbmZvcm0KKwkgKiBkcml2ZXJzIGFib3V0IHRoZSBic3NpZCBwcmlvciB0byB0aGUgYXV0aGVudGljYXRpb24gcHJvY2VzcyB0aGUKKwkgKiBmb2xsb3dpbmcgd29ya2Fyb3VuZCBpcyBuZWNlc3NhcnkuIElmIHRoZSBUWCBmcmFtZSBpcyBhbgorCSAqIGF1dGhlbnRpY2F0aW9uIGZyYW1lIGV4dHJhY3QgdGhlIGJzc2lkIGFuZCBzZW5kIHRoZSBDTURfSk9JTi4gKi8KKwlpZiAobWdtdC0+ZnJhbWVfY29udHJvbCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKSkgeworCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPmJzc2lkLCBtZ210LT5ic3NpZCkpIHsKKwkJCW1lbWNweShwcml2LT5ic3NpZCwgbWdtdC0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGh3LCAmcHJpdi0+d29ya19qb2luX2Jzc2lkKTsKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwkJfQorCX0KKwogCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhodyk7CiAKIAlhdDc2X2xlZHRyaWdfdHhfYWN0aXZpdHkoKTsJLyogdGVsbCBsZWR0cmlnZ2VyIHdlIHNlbmQgYSBwYWNrZXQgKi8KQEAgLTE3MjUsMTMgKzE3ODksMTIgQEAKIAkJCSAgc3VibWl0X2xlbiwgYXQ3Nl9tYWM4MDIxMV90eF9jYWxsYmFjaywgcHJpdik7CiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+dHhfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGluIHR4IHN1Ym1pdCB1cmI6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsIHJldCk7CiAJCWlmIChyZXQgPT0gLUVJTlZBTCkKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogLUVJTlZBTDogdHggdXJiICVwIGhjcHJpdiAlcCBjb21wbGV0ZSAlcFxuIiwKLQkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnR4X3VyYiwKLQkJCSAgICAgICBwcml2LT50eF91cmItPmhjcHJpdiwgcHJpdi0+dHhfdXJiLT5jb21wbGV0ZSk7CisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJCSAgIi1laW52YWw6IHR4IHVyYiAlcCBoY3ByaXYgJXAgY29tcGxldGUgJXBcbiIsCisJCQkJICBwcml2LT50eF91cmIsCisJCQkJICBwcml2LT50eF91cmItPmhjcHJpdiwgcHJpdi0+dHhfdXJiLT5jb21wbGV0ZSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNzQ4LDggKzE4MTEsOCBAQAogCiAJcmV0ID0gYXQ3Nl9zdWJtaXRfcnhfdXJiKHByaXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG9wZW46IHN1Ym1pdF9yeF91cmIgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgIm9wZW46IHN1Ym1pdF9yeF91cmIgZmFpbGVkOiAlZFxuIiwKKwkJCSAgcmV0KTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTE3NzAsNiArMTgzMyw3IEBACiAJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2h3X3NjYW4pOworCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPndvcmtfam9pbl9ic3NpZCk7CiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+d29ya19zZXRfcHJvbWlzYyk7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdHgpOwpAQCAtMTgxOCw0MiArMTg4Miw2IEBACiAJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKIH0KIAotc3RhdGljIGludCBhdDc2X2pvaW4oc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yZXFfam9pbiBqb2luOwotCWludCByZXQ7Ci0KLQltZW1zZXQoJmpvaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOwotCW1lbWNweShqb2luLmVzc2lkLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSk7Ci0Jam9pbi5lc3NpZF9zaXplID0gcHJpdi0+ZXNzaWRfc2l6ZTsKLQltZW1jcHkoam9pbi5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKLQlqb2luLmJzc190eXBlID0gSU5GUkFTVFJVQ1RVUkVfTU9ERTsKLQlqb2luLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOwotCWpvaW4udGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOwotCi0JYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX0pPSU4iLCBfX2Z1bmNfXyk7Ci0JcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X3NldF9jYXJkX2NvbW1hbmQgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOwotCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfSk9JTiByZXR1cm5lZDogMHglMDJ4IiwgX19mdW5jX18sIHJldCk7Ci0JaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWF0NzZfc2V0X3BtX21vZGUocHJpdik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19od19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCkBAIC0yMTA3LDYgKzIxMzUsNyBAQAogCW11dGV4X2luaXQoJnByaXYtPm10eCk7CiAJSU5JVF9XT1JLKCZwcml2LT53b3JrX3NldF9wcm9taXNjLCBhdDc2X3dvcmtfc2V0X3Byb21pc2MpOwogCUlOSVRfV09SSygmcHJpdi0+d29ya19zdWJtaXRfcngsIGF0NzZfd29ya19zdWJtaXRfcngpOworCUlOSVRfV09SSygmcHJpdi0+d29ya19qb2luX2Jzc2lkLCBhdDc2X3dvcmtfam9pbl9ic3NpZCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2h3X3NjYW4sIGF0NzZfZHdvcmtfaHdfc2Nhbik7CiAKIAl0YXNrbGV0X2luaXQoJnByaXYtPnJ4X3Rhc2tsZXQsIGF0NzZfcnhfdGFza2xldCwgMCk7CkBAIC0yMjgxLDE0ICsyMzEwLDEyIEBACiAKIAlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBVU0IgJXMsIE1BQyAlcE0sIGZpcm13YXJlICVkLiVkLiVkLSVkXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCi0JICAgICAgIGRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksIHByaXYtPm1hY19hZGRyLAotCSAgICAgICBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAotCSAgICAgICBwcml2LT5md192ZXJzaW9uLnBhdGNoLCBwcml2LT5md192ZXJzaW9uLmJ1aWxkKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogcmVndWxhdG9yeSBkb21haW4gMHglMDJ4OiAlc1xuIiwKLQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAotCSAgICAgICBwcml2LT5yZWd1bGF0b3J5X2RvbWFpbiwgcHJpdi0+ZG9tYWluLT5uYW1lKTsKKwl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwgInVzYiAlcywgbWFjICVwbSwgZmlybXdhcmUgJWQuJWQuJWQtJWRcbiIsCisJCSAgIGRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksIHByaXYtPm1hY19hZGRyLAorCQkgICBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAorCQkgICBwcml2LT5md192ZXJzaW9uLnBhdGNoLCBwcml2LT5md192ZXJzaW9uLmJ1aWxkKTsKKwl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwgInJlZ3VsYXRvcnkgZG9tYWluIDB4JTAyeDogJXNcbiIsCisJCSAgIHByaXYtPnJlZ3VsYXRvcnlfZG9tYWluLCBwcml2LT5kb21haW4tPm5hbWUpOwogCiBleGl0OgogCXJldHVybiByZXQ7CkBAIC0yNDUwLDcgKzI0NzcsNyBAQAogCWlmICghcHJpdikKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRpc2Nvbm5lY3RpbmdcbiIsIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSk7CisJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJkaXNjb25uZWN0aW5nXG4iKTsKIAlhdDc2X2RlbGV0ZV9kZXZpY2UocHJpdik7CiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZpbnRlcmZhY2UtPmRldiwgImRpc2Nvbm5lY3RlZFxuIik7CiB9CkBAIC0yNTA4LDUgKzI1MzUsNiBAQAogTU9EVUxFX0FVVEhPUigiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4iKTsKIE1PRFVMRV9BVVRIT1IoIkd1aWRvIEd1ZW50aGVyIDxhZ3hAc2lneGNwdS5vcmc+Iik7CiBNT0RVTEVfQVVUSE9SKCJLYWxsZSBWYWxvIDxrYWxsZS52YWxvQGlraS5maT4iKTsKK01PRFVMRV9BVVRIT1IoIlNlYmFzdGlhbiBTbW9sb3J6IDxzZXNtb0BnbXgubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmgKaW5kZXggMWVjNWNjZi4uNGEzNzQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXQ3NmM1MHgtdXNiLmgKQEAgLTk5LDcgKzk5LDcgQEAKIAl1OCByZXNlcnZlZDJbMTRdOwogCXU4IGNyMTVfdmFsdWVzWzE0XTsKIAl1OCByZXNlcnZlZDNbM107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGh3Y2ZnX3JmbWQgewogCXU4IGNyMjBfdmFsdWVzWzE0XTsKQEAgLTExMSw3ICsxMTEsNyBAQAogCXU4IGxvd19wb3dlcl92YWx1ZXNbMTRdOwogCXU4IG5vcm1hbF9wb3dlcl92YWx1ZXNbMTRdOwogCXU4IHJlc2VydmVkMVszXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaHdjZmdfaW50ZXJzaWwgewogCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCXU4IHBpZHZpZFs0XTsKIAl1OCByZWd1bGF0b3J5X2RvbWFpbjsKIAl1OCByZXNlcnZlZFsxXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB1bmlvbiBhdDc2X2h3Y2ZnIHsKIAlzdHJ1Y3QgaHdjZmdfaW50ZXJzaWwgaTsKQEAgLTE0OSwxNCArMTQ5LDE0IEBACiAJdTggc3NpZF9sZW47CiAJdTggc2hvcnRfcHJlYW1ibGU7CiAJX19sZTE2IGJlYWNvbl9wZXJpb2Q7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGF0NzZfY29tbWFuZCB7CiAJdTggY21kOwogCXU4IHJlc2VydmVkOwogCV9fbGUxNiBzaXplOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogTGVuZ3RoIG9mIEF0bWVsLXNwZWNpZmljIFJ4IGhlYWRlciBiZWZvcmUgODAyLjExIGZyYW1lICovCiAjZGVmaW5lIEFUNzZfUlhfSERSTEVOIG9mZnNldG9mKHN0cnVjdCBhdDc2X3J4X2J1ZmZlciwgcGFja2V0KQpAQCAtMTcxLDcgKzE3MSw3IEBACiAJdTggbm9pc2VfbGV2ZWw7CiAJX19sZTMyIHJ4X3RpbWU7CiAJdTggcGFja2V0W0lFRUU4MDIxMV9NQVhfRlJBR19USFJFU0hPTERdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIExlbmd0aCBvZiBBdG1lbC1zcGVjaWZpYyBUeCBoZWFkZXIgYmVmb3JlIDgwMi4xMSBmcmFtZSAqLwogI2RlZmluZSBBVDc2X1RYX0hEUkxFTiBvZmZzZXRvZihzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIsIHBhY2tldCkKQEAgLTE4Miw3ICsxODIsNyBAQAogCXU4IHBhZGRpbmc7CiAJdTggcmVzZXJ2ZWRbNF07CiAJdTggcGFja2V0W0lFRUU4MDIxMV9NQVhfRlJBR19USFJFU0hPTERdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIGRlZmluZXMgZm9yIHNjYW5fdHlwZSBiZWxvdyAqLwogI2RlZmluZSBTQ0FOX1RZUEVfQUNUSVZFCTAKQEAgLTE5OCw3ICsxOTgsNyBAQAogCV9fbGUxNiBtYXhfY2hhbm5lbF90aW1lOwogCXU4IGVzc2lkX3NpemU7CiAJdTggaW50ZXJuYXRpb25hbF9zY2FuOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhdDc2X3JlcV9pYnNzIHsKIAl1OCBic3NpZFtFVEhfQUxFTl07CkBAIC0yMDcsNyArMjA3LDcgQEAKIAl1OCBjaGFubmVsOwogCXU4IGVzc2lkX3NpemU7CiAJdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGF0NzZfcmVxX2pvaW4gewogCXU4IGJzc2lkW0VUSF9BTEVOXTsKQEAgLTIxNyw3ICsyMTcsNyBAQAogCV9fbGUxNiB0aW1lb3V0OwogCXU4IGVzc2lkX3NpemU7CiAJdTggcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHNldF9taWJfYnVmZmVyIHsKIAl1OCB0eXBlOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCV9fbGUxNiB3b3JkOwogCQl1OCBhZGRyW0VUSF9BTEVOXTsKIAl9IGRhdGE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1pYl9sb2NhbCB7CiAJdTE2IHJlc2VydmVkMDsKQEAgLTI0MSwxNCArMjQxLDE0IEBACiAJdTE2IHJlc2VydmVkMjsKIAl1OCBwcmVhbWJsZV90eXBlOwogCXUxNiByZXNlcnZlZDM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1pYl9tYWNfYWRkciB7CiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogCXU4IHJlc1syXTsJCS8qID8/PyAqLwogCXU4IGdyb3VwX2FkZHJbNF1bRVRIX0FMRU5dOwogCXU4IGdyb3VwX2FkZHJfc3RhdHVzWzRdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtaWJfbWFjIHsKIAlfX2xlMzIgbWF4X3R4X21zZHVfbGlmZXRpbWU7CkBAIC0yNjksNyArMjY5LDcgQEAKIAl1OCBkZXNpcmVkX2Jzc2lkW0VUSF9BTEVOXTsKIAl1OCBkZXNpcmVkX2Jzc3R5cGU7CS8qIGFkLWhvYyBvciBpbmZyYXN0cnVjdHVyZSAqLwogCXU4IHJlc2VydmVkMjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbWliX21hY19tZ210IHsKIAlfX2xlMTYgYmVhY29uX3BlcmlvZDsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCXU4IG11bHRpX2RvbWFpbl9jYXBhYmlsaXR5X2VuYWJsZWQ7CiAJdTggY291bnRyeV9zdHJpbmdbM107CiAJdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1pYl9tYWNfd2VwIHsKIAl1OCBwcml2YWN5X2ludm9rZWQ7CS8qIDAgZGlzYWJsZSBlbmNyLiwgMSBlbmFibGUgZW5jciAqLwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKIAl1OCB3ZXBfZGVmYXVsdF9rZXl2YWx1ZVtXRVBfS0VZU11bV0VQX0xBUkdFX0tFWV9MRU5dOwogCXU4IGVuY3J5cHRpb25fbGV2ZWw7CS8qIDEgZm9yIDQwYml0LCAyIGZvciAxMDRiaXQgZW5jcnlwdGlvbiAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtaWJfcGh5IHsKIAlfX2xlMzIgZWRfdGhyZXNob2xkOwpAQCAtMzIwLDE5ICszMjAsMTkgQEAKIAl1OCBjdXJyZW50X2NjYV9tb2RlOwogCXU4IHBoeV90eXBlOwogCXU4IGN1cnJlbnRfcmVnX2RvbWFpbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbWliX2Z3X3ZlcnNpb24gewogCXU4IG1ham9yOwogCXU4IG1pbm9yOwogCXU4IHBhdGNoOwogCXU4IGJ1aWxkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtaWJfbWRvbWFpbiB7CiAJdTggdHhfcG93ZXJsZXZlbFsxNF07CiAJdTggY2hhbm5lbF9saXN0WzE0XTsJLyogMCBmb3IgaW52YWxpZCBjaGFubmVscyAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhdDc2X2Z3X2hlYWRlciB7CiAJX19sZTMyIGNyYzsJCS8qIENSQzMyIG9mIHRoZSB3aG9sZSBpbWFnZSAqLwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJX19sZTMyIGludF9md19sZW47CS8qIGludGVybmFsIGZpcm13YXJlIGltYWdlIGxlbmd0aCAqLwogCV9fbGUzMiBleHRfZndfb2Zmc2V0OwkvKiBleHRlcm5hbCBmaXJtd2FyZSBpbWFnZSBvZmZzZXQgKi8KIAlfX2xlMzIgZXh0X2Z3X2xlbjsJLyogZXh0ZXJuYWwgZmlybXdhcmUgaW1hZ2UgbGVuZ3RoICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogYSBkZXNjcmlwdGlvbiBvZiBhIHJlZ3VsYXRvcnkgZG9tYWluIGFuZCB0aGUgYWxsb3dlZCBjaGFubmVscyAqLwogc3RydWN0IHJlZ19kb21haW4gewpAQCAtMzg3LDYgKzM4Nyw3IEBACiAJLyogd29yayBxdWV1ZXMgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19zZXRfcHJvbWlzYzsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19zdWJtaXRfcng7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfam9pbl9ic3NpZDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2h3X3NjYW47CiAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFza2xldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL2NtZC5jCmluZGV4IGNmNmY1YzQuLjQ2MDRkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyOTE3MC9jbWQuYwpAQCAtNDgsOCArNDgsNyBAQAogCiAJZXJyID0gYXItPmV4ZWNfY21kKGFyLCBBUjkxNzBfQ01EX1dNRU0sIGxlbiwgKHU4ICopIGRhdGEsIDAsIE5VTEwpOwogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogd3JpdGluZyBtZW1vcnkgZmFpbGVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSk7CisJCXdpcGh5X2RlYnVnKGFyLT5ody0+d2lwaHksICJ3cml0aW5nIG1lbW9yeSBmYWlsZWRcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTY3LDggKzY2LDggQEAKIAllcnIgPSBhci0+ZXhlY19jbWQoYXIsIEFSOTE3MF9DTURfV1JFRywgc2l6ZW9mKGJ1ZiksCiAJCQkgICAodTggKikgYnVmLCAwLCBOVUxMKTsKIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdyaXRpbmcgcmVnICUjeCAodmFsICUjeCkgZmFpbGVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSwgcmVnLCB2YWwpOworCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LCAid3JpdGluZyByZWcgJSN4ICh2YWwgJSN4KSBmYWlsZWRcbiIsCisJCQkgICAgcmVnLCB2YWwpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL2xlZC5jCmluZGV4IDg2YzRlNzkuLjgzMmQ5MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyOTE3MC9sZWQuYwpAQCAtMTMzLDggKzEzMyw4IEBACiAJZXJyID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHdpcGh5X2Rldihhci0+aHctPndpcGh5KSwKIAkJCQkgICAgJmFyLT5sZWRzW2ldLmwpOwogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciAlcyBMRUQgKCVkKS5cbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCBhci0+bGVkc1tpXS5uYW1lLCBlcnIpOworCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwgImZhaWxlZCB0byByZWdpc3RlciAlcyBMRUQgKCVkKS5cbiIsCisJCQkgIGFyLT5sZWRzW2ldLm5hbWUsIGVycik7CiAJZWxzZQogCQlhci0+bGVkc1tpXS5yZWdpc3RlcmVkID0gdHJ1ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyOTE3MC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL21haW4uYwppbmRleCAyYWJjODc1Li5jNjdiMDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL21haW4uYwpAQCAtMTk4LDEyICsxOTgsMTMgQEAKIAlzdHJ1Y3QgYXI5MTcwX3R4X2luZm8gKmFyaW5mbyA9ICh2b2lkICopIHR4aW5mby0+cmF0ZV9kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKikgdHhjLT5mcmFtZV9kYXRhOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA9PiBGUkFNRSBbc2tiOiVwLCBxOiVkLCBEQTpbJXBNXSBzOiVkICIKLQkJCSAgIm1hY19jdHJsOiUwNHgsIHBoeV9jdHJsOiUwOHgsIHRpbWVvdXQ6WyVkIG1zXV1cbiIsCi0JICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIHNrYiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYiksCi0JICAgICAgIGllZWU4MDIxMV9nZXRfREEoaGRyKSwgYXI5MTcwX2dldF9zZXFfaChoZHIpLAotCSAgICAgICBsZTE2X3RvX2NwdSh0eGMtPm1hY19jb250cm9sKSwgbGUzMl90b19jcHUodHhjLT5waHlfY29udHJvbCksCi0JICAgICAgIGppZmZpZXNfdG9fbXNlY3MoYXJpbmZvLT50aW1lb3V0IC0gamlmZmllcykpOworCXdpcGh5X2RlYnVnKGFyLT5ody0+d2lwaHksCisJCSAgICAiPT4gRlJBTUUgW3NrYjolcCwgcTolZCwgREE6WyVwTV0gczolZCAiCisJCSAgICAibWFjX2N0cmw6JTA0eCwgcGh5X2N0cmw6JTA4eCwgdGltZW91dDpbJWQgbXNdXVxuIiwKKwkJICAgIHNrYiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYiksCisJCSAgICBpZWVlODAyMTFfZ2V0X0RBKGhkciksIGFyOTE3MF9nZXRfc2VxX2goaGRyKSwKKwkJICAgIGxlMTZfdG9fY3B1KHR4Yy0+bWFjX2NvbnRyb2wpLCBsZTMyX3RvX2NwdSh0eGMtPnBoeV9jb250cm9sKSwKKwkJICAgIGppZmZpZXNfdG9fbXNlY3MoYXJpbmZvLT50aW1lb3V0IC0gamlmZmllcykpOwogfQogCiBzdGF0aWMgdm9pZCBfX2FyOTE3MF9kdW1wX3R4cXVldWUoc3RydWN0IGFyOTE3MCAqYXIsCkBAIC0yMTMsOCArMjE0LDggQEAKIAlpbnQgaSA9IDA7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiLS0tWyBjdXQgaGVyZSBdLS0tXG4iKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVkIGVudHJpZXMgaW4gcXVldWUuXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCBza2JfcXVldWVfbGVuKHF1ZXVlKSk7CisJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwgIiVkIGVudHJpZXMgaW4gcXVldWUuXG4iLAorCQkgICAgc2tiX3F1ZXVlX2xlbihxdWV1ZSkpOwogCiAJc2tiX3F1ZXVlX3dhbGsocXVldWUsIHNrYikgewogCQlwcmludGsoS0VSTl9ERUJVRyAiaW5kZXg6JWQgPT5cbiIsIGkrKyk7CkBAIC0yNDQsMTUgKzI0NSwxNCBAQAogewogCWludCBpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRb1MgcXVldWUgc3RhdHNcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSkpOworCXdpcGh5X2RlYnVnKGFyLT5ody0+d2lwaHksICJxb3MgcXVldWUgc3RhdHNcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IF9fQVI5MTcwX05VTV9UWFE7IGkrKykKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBxdWV1ZTolZCBsaW1pdDolZCBsZW46JWQgd2FpdGFjazolZCAiCi0JCSAgICAgICAiIHN0b3BwZWQ6JWRcbiIsIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIGksCi0JCSAgICAgICBhci0+dHhfc3RhdHNbaV0ubGltaXQsIGFyLT50eF9zdGF0c1tpXS5sZW4sCi0JCSAgICAgICBza2JfcXVldWVfbGVuKCZhci0+dHhfc3RhdHVzW2ldKSwKLQkJICAgICAgIGllZWU4MDIxMV9xdWV1ZV9zdG9wcGVkKGFyLT5odywgaSkpOworCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LAorCQkJICAgICJxdWV1ZTolZCBsaW1pdDolZCBsZW46JWQgd2FpdGFjazolZCBzdG9wcGVkOiVkXG4iLAorCQkJICAgIGksIGFyLT50eF9zdGF0c1tpXS5saW1pdCwgYXItPnR4X3N0YXRzW2ldLmxlbiwKKwkJCSAgICBza2JfcXVldWVfbGVuKCZhci0+dHhfc3RhdHVzW2ldKSwKKwkJCSAgICBpZWVlODAyMTFfcXVldWVfc3RvcHBlZChhci0+aHcsIGkpKTsKIH0KICNlbmRpZiAvKiBBUjkxNzBfUVVFVUVfU1RPUF9ERUJVRyAqLwogCkBAIC0yNzQsOSArMjc0LDkgQEAKIAogCQlpZiAodGltZV9pc19iZWZvcmVfamlmZmllcyhhcmluZm8tPnRpbWVvdXQpKSB7CiAjaWZkZWYgQVI5MTcwX1FVRVVFX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFslbGQgPiAlbGRdIGZyYW1lIGV4cGlyZWQgPT4gIgotCQkJICAgICAgICJyZWN5Y2xlXG4iLCB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLAotCQkJICAgICAgIGppZmZpZXMsIGFyaW5mby0+dGltZW91dCk7CisJCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LAorCQkJCSAgICAiWyVsZCA+ICVsZF0gZnJhbWUgZXhwaXJlZCA9PiByZWN5Y2xlXG4iLAorCQkJCSAgICBqaWZmaWVzLCBhcmluZm8tPnRpbWVvdXQpOwogCQkJYXI5MTcwX3ByaW50X3R4aGVhZGVyKGFyLCBza2IpOwogI2VuZGlmIC8qIEFSOTE3MF9RVUVVRV9ERUJVRyAqLwogCQkJX19za2JfdW5saW5rKHNrYiwgcXVldWUpOwpAQCAtMzE3LDggKzMxNyw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCB0eF9zdGF0dXMgcmVzcG9uc2UgKCV4KS5cbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCB0eF9zdGF0dXMpOworCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwKKwkJCSAgImludmFsaWQgdHhfc3RhdHVzIHJlc3BvbnNlICgleClcbiIsIHR4X3N0YXR1cyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzM5LDggKzMzOSw3IEBACiAKIAlpZiAoYXItPnR4X3N0YXRzW3F1ZXVlXS5sZW4gPCBBUjkxNzBfTlVNX1RYX0xJTUlUX1NPRlQpIHsKICNpZmRlZiBBUjkxNzBfUVVFVUVfU1RPUF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdha2UgcXVldWUgJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCBxdWV1ZSk7CisJCXdpcGh5X2RlYnVnKGFyLT5ody0+d2lwaHksICJ3YWtlIHF1ZXVlICVkXG4iLCBxdWV1ZSk7CiAJCV9fYXI5MTcwX2R1bXBfdHhzdGF0cyhhcik7CiAjZW5kaWYgLyogQVI5MTcwX1FVRVVFX1NUT1BfREVCVUcgKi8KIAkJaWVlZTgwMjExX3dha2VfcXVldWUoYXItPmh3LCBxdWV1ZSk7CkBAIC0zODcsOSArMzg2LDkgQEAKIAogCQlpZiAobWFjICYmIGNvbXBhcmVfZXRoZXJfYWRkcihpZWVlODAyMTFfZ2V0X0RBKGhkciksIG1hYykpIHsKICNpZmRlZiBBUjkxNzBfUVVFVUVfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tpcCBmcmFtZSA9PiBEQSAlcE0gIT0gJXBNXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIG1hYywKLQkJCSAgICAgICBpZWVlODAyMTFfZ2V0X0RBKGhkcikpOworCQkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwKKwkJCQkgICAgInNraXAgZnJhbWUgPT4gZGEgJXBtICE9ICVwbVxuIiwKKwkJCQkgICAgbWFjLCBpZWVlODAyMTFfZ2V0X0RBKGhkcikpOwogCQkJYXI5MTcwX3ByaW50X3R4aGVhZGVyKGFyLCBza2IpOwogI2VuZGlmIC8qIEFSOTE3MF9RVUVVRV9ERUJVRyAqLwogCQkJY29udGludWU7CkBAIC00MDAsOCArMzk5LDggQEAKIAogCQlpZiAoKHJhdGUgIT0gQVI5MTcwX1RYX0lOVkFMSURfUkFURSkgJiYgKHIgIT0gcmF0ZSkpIHsKICNpZmRlZiBBUjkxNzBfUVVFVUVfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tpcCBmcmFtZSA9PiByYXRlICVkICE9ICVkXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIHJhdGUsIHIpOworCQkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwKKwkJCQkgICAgInNraXAgZnJhbWUgPT4gcmF0ZSAlZCAhPSAlZFxuIiwgcmF0ZSwgcik7CiAJCQlhcjkxNzBfcHJpbnRfdHhoZWFkZXIoYXIsIHNrYik7CiAjZW5kaWYgLyogQVI5MTcwX1FVRVVFX0RFQlVHICovCiAJCQljb250aW51ZTsKQEAgLTQxMyw5ICs0MTIsOSBAQAogCX0KIAogI2lmZGVmIEFSOTE3MF9RVUVVRV9ERUJVRwotCXByaW50ayhLRVJOX0VSUiAiJXM6IEVTUzpbJXBNXSBkb2VzIG5vdCBoYXZlIGFueSAiCi0JCQkib3V0c3RhbmRpbmcgZnJhbWVzIGluIHF1ZXVlLlxuIiwKLQkJCXdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIG1hYyk7CisJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksCisJCSAgIkVTUzpbJXBNXSBkb2VzIG5vdCBoYXZlIGFueSBvdXRzdGFuZGluZyBmcmFtZXMgaW4gcXVldWUuXG4iLAorCQkgIG1hYyk7CiAJX19hcjkxNzBfZHVtcF90eHF1ZXVlKGFyLCBxdWV1ZSk7CiAjZW5kaWYgLyogQVI5MTcwX1FVRVVFX0RFQlVHICovCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKQEAgLTQ0NCw4ICs0NDMsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IF9fQVI5MTcwX05VTV9UWFE7IGkrKykgewogI2lmZGVmIEFSOTE3MF9RVUVVRV9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGdhcmJhZ2UgY29sbGVjdG9yIHNjYW5zIHF1ZXVlOiVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSwgaSk7CisJCXdpcGh5X2RlYnVnKGFyLT5ody0+d2lwaHksICJnYXJiYWdlIGNvbGxlY3RvciBzY2FucyBxdWV1ZTolZFxuIiwKKwkJCSAgICBpKTsKIAkJYXI5MTcwX2R1bXBfdHhxdWV1ZShhciwgJmFyLT50eF9wZW5kaW5nW2ldKTsKIAkJYXI5MTcwX2R1bXBfdHhxdWV1ZShhciwgJmFyLT50eF9zdGF0dXNbaV0pOwogI2VuZGlmIC8qIEFSOTE3MF9RVUVVRV9ERUJVRyAqLwpAQCAtNDk1LDggKzQ5NCw5IEBACiAJCXUzMiBxID0gKHBoeSAmIEFSOTE3MF9UWF9QSFlfUU9TX01BU0spID4+CiAJCQlBUjkxNzBfVFhfUEhZX1FPU19TSElGVDsKICNpZmRlZiBBUjkxNzBfUVVFVUVfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWN2IHR4X3N0YXR1cyBmb3IgJXBNLCBwOiUwOHgsIHE6JWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCBjbWQtPnR4X3N0YXR1cy5kc3QsIHBoeSwgcSk7CisJCXdpcGh5X2RlYnVnKGFyLT5ody0+d2lwaHksCisJCQkgICAgInJlY3YgdHhfc3RhdHVzIGZvciAlcG0sIHA6JTA4eCwgcTolZFxuIiwKKwkJCSAgICBjbWQtPnR4X3N0YXR1cy5kc3QsIHBoeSwgcSk7CiAjZW5kaWYgLyogQVI5MTcwX1FVRVVFX0RFQlVHICovCiAKIAkJc2tiID0gYXI5MTcwX2dldF9xdWV1ZWRfc2tiKGFyLCBjbWQtPnR4X3N0YXR1cy5kc3QsCkBAIC01ODIsNyArNTgyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJyZWNlaXZlZCB1bmhhbmRsZWQgZXZlbnQgJXhcbiIsIGNtZC0+dHlwZSk7CisJCXByX2luZm8oInJlY2VpdmVkIHVuaGFuZGxlZCBldmVudCAleFxuIiwgY21kLT50eXBlKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImR1bXA6IiwgRFVNUF9QUkVGSVhfTk9ORSwgYnVmLCBsZW4pOwogCQlicmVhazsKIAl9CkBAIC02NzUsOSArNjc1LDkgQEAKIAkJLyogVE9ETzogdXBkYXRlIG5ldGRldmljZSdzIFJYIGRyb3BwZWQvZXJyb3JzIHN0YXRpc3RpY3MgKi8KIAogCQlpZiAoYXI5MTcwX25hZ19saW1pdGVyKGFyKSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgZnJhbWUgd2l0aCAiCi0JCQkgICAgICAgInN1c3BpY2lvdXMgZXJyb3IgY29kZSAoJSN4KS5cbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSwgZXJyb3IpOworCQkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwKKwkJCQkgICAgInJlY2VpdmVkIGZyYW1lIHdpdGggc3VzcGljaW91cyBlcnJvciBjb2RlICglI3gpLlxuIiwKKwkJCQkgICAgZXJyb3IpOwogCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTcwNCw5ICs3MDQsOSBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpZiAoYXI5MTcwX25hZ19saW1pdGVyKGFyKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIHBsY3AgY2NrIHJhdGUgIgotCQkJCSAgICAgICAiKCV4KS5cbiIsIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksCi0JCQkJICAgICAgIGhlYWQtPnBsY3BbMF0pOworCQkJCXdpcGh5X2Vycihhci0+aHctPndpcGh5LAorCQkJCQkgICJpbnZhbGlkIHBsY3AgY2NrIHJhdGUgKCV4KS5cbiIsCisJCQkJCSAgaGVhZC0+cGxjcFswXSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKQEAgLTc0MCw5ICs3NDAsOSBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpZiAoYXI5MTcwX25hZ19saW1pdGVyKGFyKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIHBsY3Agb2ZkbSByYXRlICIKLQkJCQkgICAgICAgIigleCkuXG4iLCB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLAotCQkJCSAgICAgICBoZWFkLT5wbGNwWzBdKTsKKwkJCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwKKwkJCQkJICAiaW52YWxpZCBwbGNwIG9mZG0gcmF0ZSAoJXgpLlxuIiwKKwkJCQkJICBoZWFkLT5wbGNwWzBdKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChzdGF0dXMtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKQEAgLTc2MSw4ICs3NjEsNyBAQAogCiAJZGVmYXVsdDoKIAkJaWYgKGFyOTE3MF9uYWdfbGltaXRlcihhcikpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIG1vZHVsYXRpb25cbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSk7CisJCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwgImludmFsaWQgbW9kdWxhdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODYzLDggKzg2Miw4IEBACiAJCQlhci0+cnhfbXBkdS5oYXNfcGxjcCA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQlpZiAoYXI5MTcwX25hZ19saW1pdGVyKGFyKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbGNwIGluZm8gaXMgY2xpcHBlZC5cbiIsCi0JCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSkpOworCQkJCXdpcGh5X2Vycihhci0+aHctPndpcGh5LAorCQkJCQkgICJwbGNwIGluZm8gaXMgY2xpcHBlZC5cbiIpOwogCQkJcmV0dXJuIDsKIAkJfQogCQlicmVhazsKQEAgLTg3Nyw4ICs4NzYsOCBAQAogCQkJcGh5ID0gKHZvaWQgKikoYnVmICsgbXBkdV9sZW4pOwogCQl9IGVsc2UgewogCQkJaWYgKGFyOTE3MF9uYWdfbGltaXRlcihhcikpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZnJhbWUgdGFpbCBpcyBjbGlwcGVkLlxuIiwKLQkJCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSk7CisJCQkJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksCisJCQkJCSAgImZyYW1lIHRhaWwgaXMgY2xpcHBlZC5cbiIpOwogCQkJcmV0dXJuIDsKIAkJfQogCkBAIC04ODgsOSArODg3LDggQEAKIAkJCWlmICghYXI5MTcwX25hZ19saW1pdGVyKGFyKSkKIAkJCQlyZXR1cm4gOwogCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeCBzdHJlYW0gZGlkIG5vdCBzdGFydCAiCi0JCQkJCSJ3aXRoIGEgZmlyc3RfbXBkdSBmcmFtZSB0YWcuXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSkpOworCQkJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksCisJCQkJICAicnggc3RyZWFtIGRpZCBub3Qgc3RhcnQgd2l0aCBhIGZpcnN0X21wZHUgZnJhbWUgdGFnLlxuIik7CiAKIAkJCXJldHVybiA7CiAJCX0KQEAgLTk1NCw4ICs5NTIsOCBAQAogCQkJaWYgKCFhci0+cnhfZmFpbG92ZXJfbWlzc2luZykgewogCQkJCS8qIHRoaXMgaXMgbm8gInNob3J0IHJlYWQiLiAqLwogCQkJCWlmIChhcjkxNzBfbmFnX2xpbWl0ZXIoYXIpKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1pc3NpbmcgdGFnIVxuIiwKLQkJCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSkpOworCQkJCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwKKwkJCQkJCSAgIm1pc3NpbmcgdGFnIVxuIik7CiAJCQkJCWdvdG8gZXJyX3RlbGx1c2VyOwogCQkJCX0gZWxzZQogCQkJCQlnb3RvIGVycl9zaWxlbnQ7CkBAIC05NjMsOSArOTYxLDggQEAKIAogCQkJaWYgKGFyLT5yeF9mYWlsb3Zlcl9taXNzaW5nID4gdGxlbikgewogCQkJCWlmIChhcjkxNzBfbmFnX2xpbWl0ZXIoYXIpKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBvc3NpYmxlIG11bHRpICIKLQkJCQkJICAgICAgICJzdHJlYW0gY29ycnVwdGlvbiFcbiIsCi0JCQkJCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpKTsKKwkJCQkJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksCisJCQkJCQkgICJwb3NzaWJsZSBtdWx0aSBzdHJlYW0gY29ycnVwdGlvbiFcbiIpOwogCQkJCQlnb3RvIGVycl90ZWxsdXNlcjsKIAkJCQl9IGVsc2UKIAkJCQkJZ290byBlcnJfc2lsZW50OwpAQCAtOTk3LDkgKzk5NCw4IEBACiAJCQlpZiAoYXItPnJ4X2ZhaWxvdmVyX21pc3NpbmcpIHsKIAkJCQkvKiBUT0RPOiBoYW5kbGUgZG91YmxlIHN0cmVhbSBjb3JydXB0aW9uLiAqLwogCQkJCWlmIChhcjkxNzBfbmFnX2xpbWl0ZXIoYXIpKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRvdWJsZSByeCBzdHJlYW0gIgotCQkJCQkgICAgICAgImNvcnJ1cHRpb24hXG4iLAotCQkJCQkJd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSk7CisJCQkJCXdpcGh5X2Vycihhci0+aHctPndpcGh5LAorCQkJCQkJICAiZG91YmxlIHJ4IHN0cmVhbSBjb3JydXB0aW9uIVxuIik7CiAJCQkJCWdvdG8gZXJyX3RlbGx1c2VyOwogCQkJCX0gZWxzZQogCQkJCQlnb3RvIGVycl9zaWxlbnQ7CkBAIC0xMDQyLDkgKzEwMzgsOSBAQAogCiAJaWYgKHRsZW4pIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVkIGJ5dGVzIG9mIHVucHJvY2Vzc2VkICIKLQkJCQkJImRhdGEgbGVmdCBpbiByeCBzdHJlYW0hXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIHRsZW4pOworCQkJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksCisJCQkJICAiJWQgYnl0ZXMgb2YgdW5wcm9jZXNzZWQgZGF0YSBsZWZ0IGluIHJ4IHN0cmVhbSFcbiIsCisJCQkJICB0bGVuKTsKIAogCQlnb3RvIGVycl90ZWxsdXNlcjsKIAl9CkBAIC0xMDUyLDEwICsxMDQ4LDkgQEAKIAlyZXR1cm4gOwogCiBlcnJfdGVsbHVzZXI6Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogZGFtYWdlZCBSWCBzdHJlYW0gZGF0YSBbd2FudDolZCwgIgotCQkJImRhdGE6JWQsIHJ4OiVkLCBwZW5kaW5nOiVkIF1cbiIsCi0JICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIGNsZW4sIHdsZW4sIHRsZW4sCi0JICAgICAgIGFyLT5yeF9mYWlsb3Zlcl9taXNzaW5nKTsKKwl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwKKwkJICAiZGFtYWdlZCBSWCBzdHJlYW0gZGF0YSBbd2FudDolZCwgZGF0YTolZCwgcng6JWQsIHBlbmRpbmc6JWQgXVxuIiwKKwkJICBjbGVuLCB3bGVuLCB0bGVuLCBhci0+cnhfZmFpbG92ZXJfbWlzc2luZyk7CiAKIAlpZiAoYXItPnJ4X2ZhaWxvdmVyX21pc3NpbmcpCiAJCXByaW50X2hleF9kdW1wX2J5dGVzKCJyeGJ1ZjoiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCkBAIC0xMDY1LDkgKzEwNjAsOCBAQAogCXByaW50X2hleF9kdW1wX2J5dGVzKCJzdHJlYW06IiwgRFVNUF9QUkVGSVhfT0ZGU0VULAogCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBjaGVjayB5b3VyIGhhcmR3YXJlIGFuZCBjYWJsZXMsIGlmICIKLQkJCSJ5b3Ugc2VlIHRoaXMgbWVzc2FnZSBmcmVxdWVudGx5LlxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSk7CisJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksCisJCSAgIklmIHlvdSBzZWUgdGhpcyBtZXNzYWdlIGZyZXF1ZW50bHksIHBsZWFzZSBjaGVjayB5b3VyIGhhcmR3YXJlIGFuZCBjYWJsZXMuXG4iKTsKIAogZXJyX3NpbGVudDoKIAlpZiAoYXItPnJ4X2ZhaWxvdmVyX21pc3NpbmcpIHsKQEAgLTEzODQsMTAgKzEzNzgsMTAgQEAKIAogCQlpZiAocmVtYWluaW5nX3NwYWNlIDwgZnJhbWVzKSB7CiAjaWZkZWYgQVI5MTcwX1FVRVVFX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IHF1b3RhIHJlYWNoZWQgcXVldWU6JWQsICIKLQkJCSAgICAgICAicmVtYWluaW5nIHNsb3RzOiVkLCBuZWVkZWQ6JWRcbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSwgaSwgcmVtYWluaW5nX3NwYWNlLAotCQkJICAgICAgIGZyYW1lcyk7CisJCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LAorCQkJCSAgICAidHggcXVvdGEgcmVhY2hlZCBxdWV1ZTolZCwgIgorCQkJCSAgICAicmVtYWluaW5nIHNsb3RzOiVkLCBuZWVkZWQ6JWRcbiIsCisJCQkJICAgIGksIHJlbWFpbmluZ19zcGFjZSwgZnJhbWVzKTsKICNlbmRpZiAvKiBBUjkxNzBfUVVFVUVfREVCVUcgKi8KIAkJCWZyYW1lcyA9IHJlbWFpbmluZ19zcGFjZTsKIAkJfQpAQCAtMTM5NiwxOCArMTM5MCwxNCBAQAogCQlhci0+dHhfc3RhdHNbaV0uY291bnQgKz0gZnJhbWVzOwogCQlpZiAoYXItPnR4X3N0YXRzW2ldLmxlbiA+PSBhci0+dHhfc3RhdHNbaV0ubGltaXQpIHsKICNpZmRlZiBBUjkxNzBfUVVFVUVfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcXVldWUgJWQgZnVsbFxuIiwKLQkJCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCBpKTsKLQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdHVjayBmcmFtZXM6ID09PT5cbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSk7CisJCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LCAicXVldWUgJWQgZnVsbFxuIiwgaSk7CisJCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LCAic3R1Y2sgZnJhbWVzOiA9PT0+XG4iKTsKIAkJCWFyOTE3MF9kdW1wX3R4cXVldWUoYXIsICZhci0+dHhfcGVuZGluZ1tpXSk7CiAJCQlhcjkxNzBfZHVtcF90eHF1ZXVlKGFyLCAmYXItPnR4X3N0YXR1c1tpXSk7CiAjZW5kaWYgLyogQVI5MTcwX1FVRVVFX0RFQlVHICovCiAKICNpZmRlZiBBUjkxNzBfUVVFVUVfU1RPUF9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdG9wIHF1ZXVlICVkXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIGkpOworCQkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwgInN0b3AgcXVldWUgJWRcbiIsIGkpOwogCQkJX19hcjkxNzBfZHVtcF90eHN0YXRzKGFyKTsKICNlbmRpZiAvKiBBUjkxNzBfUVVFVUVfU1RPUF9ERUJVRyAqLwogCQkJaWVlZTgwMjExX3N0b3BfcXVldWUoYXItPmh3LCBpKTsKQEAgLTE0MzUsOCArMTQyNSw3IEBACiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhBUjkxNzBfVFhfVElNRU9VVCk7CiAKICNpZmRlZiBBUjkxNzBfUVVFVUVfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZCBmcmFtZSBxOiVkID0+XG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIGkpOworCQkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwgInNlbmQgZnJhbWUgcTolZCA9PlxuIiwgaSk7CiAJCQlhcjkxNzBfcHJpbnRfdHhoZWFkZXIoYXIsIHNrYik7CiAjZW5kaWYgLyogQVI5MTcwX1FVRVVFX0RFQlVHICovCiAKQEAgLTE0NTMsMjYgKzE0NDIsMjUgQEAKIAkJfQogCiAjaWZkZWYgQVI5MTcwX1FVRVVFX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogYXI5MTcwX3R4IHJlcG9ydCBmb3IgcXVldWUgJWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpLCBpKTsKKwkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwKKwkJCSAgICAiYXI5MTcwX3R4IHJlcG9ydCBmb3IgcXVldWUgJWRcbiIsIGkpOwogCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5wcm9jZXNzZWQgcGVuZGluZyBmcmFtZXMgbGVmdDpcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpKTsKKwkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwKKwkJCSAgICAidW5wcm9jZXNzZWQgcGVuZGluZyBmcmFtZXMgbGVmdDpcbiIpOwogCQlhcjkxNzBfZHVtcF90eHF1ZXVlKGFyLCAmYXItPnR4X3BlbmRpbmdbaV0pOwogI2VuZGlmIC8qIEFSOTE3MF9RVUVVRV9ERUJVRyAqLwogCiAJCWlmICh1bmxpa2VseShmcmFtZXNfZmFpbGVkKSkgewogI2lmZGVmIEFSOTE3MF9RVUVVRV9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmcmFtZXMgZmFpbGVkICVkID0+XG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSksIGZyYW1lc19mYWlsZWQpOworCQkJd2lwaHlfZGVidWcoYXItPmh3LT53aXBoeSwKKwkJCQkgICAgImZyYW1lcyBmYWlsZWQgJWQgPT5cbiIsIGZyYW1lc19mYWlsZWQpOwogI2VuZGlmIC8qIEFSOTE3MF9RVUVVRV9ERUJVRyAqLwogCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXItPnR4X3N0YXRzX2xvY2ssIGZsYWdzKTsKIAkJCWFyLT50eF9zdGF0c1tpXS5sZW4gLT0gZnJhbWVzX2ZhaWxlZDsKIAkJCWFyLT50eF9zdGF0c1tpXS5jb3VudCAtPSBmcmFtZXNfZmFpbGVkOwogI2lmZGVmIEFSOTE3MF9RVUVVRV9TVE9QX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdha2UgcXVldWUgJWRcbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShhci0+aHctPndpcGh5KSwgaSk7CisJCQl3aXBoeV9kZWJ1Zyhhci0+aHctPndpcGh5LCAid2FrZSBxdWV1ZSAlZFxuIiwgaSk7CiAJCQlfX2FyOTE3MF9kdW1wX3R4c3RhdHMoYXIpOwogI2VuZGlmIC8qIEFSOTE3MF9RVUVVRV9TVE9QX0RFQlVHICovCiAJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShhci0+aHcsIGkpOwpAQCAtMTkxNyw2ICsxOTA1LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXI5MTcwX2dldF9zdXJ2ZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBpZHgsCisJCQkJc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpCit7CisJc3RydWN0IGFyOTE3MCAqYXIgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CisKKwlpZiAoaWR4ICE9IDApCisJCXJldHVybiAtRU5PRU5UOworCisJLyogVE9ETzogdXBkYXRlIG5vaXNlIHZhbHVlLCBlLmcuIGNhbGwgYXI5MTcwX3NldF9jaGFubmVsICovCisKKwlzdXJ2ZXktPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOworCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fTk9JU0VfREJNOworCXN1cnZleS0+bm9pc2UgPSBhci0+bm9pc2VbMF07CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhcjkxNzBfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IHF1ZXVlLAogCQkJICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW0pCiB7CkBAIC0xOTY5LDYgKzE5NzUsNyBAQAogCS5nZXRfdHNmCQk9IGFyOTE3MF9vcF9nZXRfdHNmLAogCS5zZXRfa2V5CQk9IGFyOTE3MF9zZXRfa2V5LAogCS5nZXRfc3RhdHMJCT0gYXI5MTcwX2dldF9zdGF0cywKKwkuZ2V0X3N1cnZleQkJPSBhcjkxNzBfZ2V0X3N1cnZleSwKIAkuYW1wZHVfYWN0aW9uCQk9IGFyOTE3MF9hbXBkdV9hY3Rpb24sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyOTE3MC9waHkuYwppbmRleCA0NWE0MTVlLi4wZGJmY2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvcGh5LmMKQEAgLTY3MCw4ICs2NzAsNyBAQAogCWFyOTE3MF9yZWd3cml0ZV9maW5pc2goKTsKIAllcnIgPSBhcjkxNzBfcmVnd3JpdGVfcmVzdWx0KCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmYgaW5pdCBmYWlsZWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGFyLT5ody0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGFyLT5ody0+d2lwaHksICJyZiBpbml0IGZhaWxlZFxuIik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTcwMiw5ICsxNzAxLDggQEAKIAkJCQkgICAgICAgMHgyMDAgfCBhci0+cGh5X2hlYXZ5X2NsaXApOwogCQlpZiAoZXJyKSB7CiAJCQlpZiAoYXI5MTcwX25hZ19saW1pdGVyKGFyKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gc2V0ICIKLQkJCQkgICAgICAgImhlYXZ5IGNsaXBcbiIsCi0JCQkJICAgICAgIHdpcGh5X25hbWUoYXItPmh3LT53aXBoeSkpOworCQkJCXdpcGh5X2Vycihhci0+aHctPndpcGh5LAorCQkJCQkgICJmYWlsZWQgdG8gc2V0IGhlYXZ5IGNsaXBcbiIpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvTWFrZWZpbGUKaW5kZXggY2MwOTU5NS4uMjI0MmExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9NYWtlZmlsZQpAQCAtMTMsNSArMTMsNiBAQAogYXRoNWsteQkJCQkrPSBsZWQubwogYXRoNWsteQkJCQkrPSByZmtpbGwubwogYXRoNWsteQkJCQkrPSBhbmkubworYXRoNWsteQkJCQkrPSBzeXNmcy5vCiBhdGg1ay0kKENPTkZJR19BVEg1S19ERUJVRykJKz0gZGVidWcubwogb2JqLSQoQ09ORklHX0FUSDVLKQkJKz0gYXRoNWsubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jCmluZGV4IGYyMzExYWIuLjI2ZGJlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmMKQEAgLTc0LDggKzc0LDggQEAKIAljb25zdCBzOCBmcltdID0geyAtNzgsIC04MCB9OwogI2VuZGlmCiAJaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+PSBBUlJBWV9TSVpFKHN6KSkgewotCQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwKLQkJCSJsZXZlbCBvdXQgb2YgcmFuZ2UgJWQiLCBsZXZlbCk7CisJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJub2lzZSBpbW11bml5IGxldmVsICVkIG91dCBvZiByYW5nZSIsCisJCQkgIGxldmVsKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA2LDggKzEwNiw4IEBACiAKIAlpZiAobGV2ZWwgPCAwIHx8IGxldmVsID49IEFSUkFZX1NJWkUodmFsKSB8fAogCSAgICBsZXZlbCA+IGFoLT5haF9zYy0+YW5pX3N0YXRlLm1heF9zcHVyX2xldmVsKSB7Ci0JCUFUSDVLX0RCR19VTkxJTUlUKGFoLT5haF9zYywgQVRINUtfREVCVUdfQU5JLAotCQkJImxldmVsIG91dCBvZiByYW5nZSAlZCIsIGxldmVsKTsKKwkJQVRINUtfRVJSKGFoLT5haF9zYywgInNwdXIgaW1tdW5pdHkgbGV2ZWwgJWQgb3V0IG9mIHJhbmdlIiwKKwkJCSAgbGV2ZWwpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzAsOCArMTMwLDcgQEAKIAljb25zdCBpbnQgdmFsW10gPSB7IDAsIDQsIDggfTsKIAogCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gQVJSQVlfU0laRSh2YWwpKSB7Ci0JCUFUSDVLX0RCR19VTkxJTUlUKGFoLT5haF9zYywgQVRINUtfREVCVUdfQU5JLAotCQkJImxldmVsIG91dCBvZiByYW5nZSAlZCIsIGxldmVsKTsKKwkJQVRINUtfRVJSKGFoLT5haF9zYywgImZpcnN0ZXAgbGV2ZWwgJWQgb3V0IG9mIHJhbmdlIiwgbGV2ZWwpOwogCQlyZXR1cm47CiAJfQogCkBAIC00ODEsMTQgKzQ4MCwxNSBAQAogCXN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzID0gJmFoLT5haF9zYy0+YW5pX3N0YXRlOwogCWludCBsaXN0ZW4sIG9mZG1faGlnaCwgb2ZkbV9sb3csIGNja19oaWdoLCBjY2tfbG93OwogCi0JaWYgKGFzLT5hbmlfbW9kZSAhPSBBVEg1S19BTklfTU9ERV9BVVRPKQotCQlyZXR1cm47Ci0KIAkvKiBnZXQgbGlzdGVuIHRpbWUgc2luY2UgbGFzdCBjYWxsIGFuZCBhZGQgaXQgdG8gdGhlIGNvdW50ZXIgYmVjYXVzZSB3ZQotCSAqIG1pZ2h0IG5vdCBoYXZlIHJlc3RhcnRlZCB0aGUgImFuaSBwZXJpb2QiIGxhc3QgdGltZSAqLworCSAqIG1pZ2h0IG5vdCBoYXZlIHJlc3RhcnRlZCB0aGUgImFuaSBwZXJpb2QiIGxhc3QgdGltZS4KKwkgKiBhbHdheXMgZG8gdGhpcyB0byBjYWxjdWxhdGUgdGhlIGJ1c3kgdGltZSBhbHNvIGluIG1hbnVhbCBtb2RlICovCiAJbGlzdGVuID0gYXRoNWtfaHdfYW5pX2dldF9saXN0ZW5fdGltZShhaCwgYXMpOwogCWFzLT5saXN0ZW5fdGltZSArPSBsaXN0ZW47CiAKKwlpZiAoYXMtPmFuaV9tb2RlICE9IEFUSDVLX0FOSV9NT0RFX0FVVE8pCisJCXJldHVybjsKKwogCWF0aDVrX2FuaV9zYXZlX2FuZF9jbGVhcl9waHlfZXJyb3JzKGFoLCBhcyk7CiAKIAlvZmRtX2hpZ2ggPSBhcy0+bGlzdGVuX3RpbWUgKiBBVEg1S19BTklfT0ZETV9UUklHX0hJR0ggLyAxMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0aDVrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAppbmRleCAyNzg1OTQ2Li5lYTYzNjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaApAQCAtMjA0LDYgKzIwNCw3IEBACiAjZGVmaW5lIEFSNUtfVFVORV9UUENfVFhQT1dFUgkJCWZhbHNlCiAjZGVmaW5lIEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfRlVMTCAgICAxMDAwMCAgIC8qIDEwIHNlYyAqLwogI2RlZmluZSBBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0FOSQkxMDAwCS8qIDEgc2VjICovCisjZGVmaW5lIEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfTkYJNjAwMDAJLyogNjAgc2VjICovCiAKICNkZWZpbmUgQVI1S19JTklUX0NBUlJfU0VOU0VfRU4JCQkxCiAKQEAgLTU2NSw3ICs1NjYsNyBAQAogKQogCiAvKgotICogRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJebisyKQorICogRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCiAgKi8KIGVudW0gYXRoNWtfZG1hc2l6ZSB7CiAJQVI1S19ETUFTSVpFXzRCCT0gMCwKQEAgLTExMTgsNiArMTExOSw3IEBACiAJLyogQ2FsaWJyYXRpb24gdGltZXN0YW1wICovCiAJdW5zaWduZWQgbG9uZwkJYWhfY2FsX25leHRfZnVsbDsKIAl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9hbmk7CisJdW5zaWduZWQgbG9uZwkJYWhfY2FsX25leHRfbmY7CiAKIAkvKiBDYWxpYnJhdGlvbiBtYXNrICovCiAJdTgJCQlhaF9jYWxfbWFzazsKQEAgLTExMjUsMTUgKzExMjcsMTAgQEAKIAkvKgogCSAqIEZ1bmN0aW9uIHBvaW50ZXJzCiAJICovCi0JaW50ICgqYWhfc2V0dXBfcnhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JCQkJdTMyIHNpemUsIHVuc2lnbmVkIGludCBmbGFncyk7CiAJaW50ICgqYWhfc2V0dXBfdHhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICosIHN0cnVjdCBhdGg1a19kZXNjICosCiAJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBpbnQsIGVudW0gYXRoNWtfcGt0X3R5cGUsCiAJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKIAkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLQlpbnQgKCphaF9zZXR1cF9tcnJfdHhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICosIHN0cnVjdCBhdGg1a19kZXNjICosCi0JCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogCWludCAoKmFoX3Byb2NfdHhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICosIHN0cnVjdCBhdGg1a19kZXNjICosCiAJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKik7CiAJaW50ICgqYWhfcHJvY19yeF9kZXNjKShzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKQEAgLTExNDgsNiArMTE0NSw5IEBACiBpbnQgYXRoNWtfaHdfYXR0YWNoKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOwogdm9pZCBhdGg1a19od19kZXRhY2goc3RydWN0IGF0aDVrX2h3ICphaCk7CiAKK2ludCBhdGg1a19zeXNmc19yZWdpc3RlcihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKK3ZvaWQgYXRoNWtfc3lzZnNfdW5yZWdpc3RlcihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKKwogLyogTEVEIGZ1bmN0aW9ucyAqLwogaW50IGF0aDVrX2luaXRfbGVkcyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKIHZvaWQgYXRoNWtfbGVkX2VuYWJsZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKQEAgLTEyMzEsNiArMTIzMSwxMSBAQAogCiAvKiBIYXJkd2FyZSBEZXNjcmlwdG9yIEZ1bmN0aW9ucyAqLwogaW50IGF0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoc3RydWN0IGF0aDVrX2h3ICphaCk7CitpbnQgYXRoNWtfaHdfc2V0dXBfcnhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCSAgIHUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworaW50IGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCXVuc2lnbmVkIGludCB0eF9yYXRlMSwgdV9pbnQgdHhfdHJpZXMxLCB1X2ludCB0eF9yYXRlMiwKKwl1X2ludCB0eF90cmllczIsIHVuc2lnbmVkIGludCB0eF9yYXRlMywgdV9pbnQgdHhfdHJpZXMzKTsKIAogLyogR1BJTyBGdW5jdGlvbnMgKi8KIHZvaWQgYXRoNWtfaHdfc2V0X2xlZHN0YXRlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzdGF0ZSk7CkBAIC0xMjcwLDYgKzEyNzUsNyBAQAogdm9pZCBhdGg1a19od19pbml0X25mY2FsX2hpc3Qoc3RydWN0IGF0aDVrX2h3ICphaCk7CiBpbnQgYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKTsKK3ZvaWQgYXRoNWtfaHdfdXBkYXRlX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpOwogLyogU3B1ciBtaXRpZ2F0aW9uICovCiBib29sIGF0aDVrX2h3X2NoYW5faGFzX3NwdXJfbm9pc2Uoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCk7CkBAIC0xMjgwLDYgKzEyODYsNyBAQAogaW50IGF0aDVrX2h3X3BoeV9kaXNhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgpOwogLyogQW50ZW5uYSBjb250cm9sICovCiB2b2lkIGF0aDVrX2h3X3NldF9hbnRlbm5hX21vZGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggYW50X21vZGUpOwordm9pZCBhdGg1a19od19zZXRfYW50ZW5uYV9zd2l0Y2goc3RydWN0IGF0aDVrX2h3ICphaCwgdTggZWVfbW9kZSk7CiAvKiBUWCBwb3dlciBzZXR1cCAqLwogaW50IGF0aDVrX2h3X3R4cG93ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkgICAgIHU4IGVlX21vZGUsIHU4IHR4cG93ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jCmluZGV4IDMxYzAwODAuLmIzMmUyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdHRhY2guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMKQEAgLTM1Miw4ICszNTIsNiBAQAogICovCiB2b2lkIGF0aDVrX2h3X2RldGFjaChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlfX3NldF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgYWgtPmFoX3NjLT5zdGF0dXMpOwogCiAJaWYgKGFoLT5haF9yZl9iYW5rcyAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKaW5kZXggNjQ4OTcyZC4uMGQ1ZGUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCkBAIC0zMTEsNyArMzExLDggQEAKIHN0YXRpYyBpbnQgCWF0aDVrX3R4YnVmX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsCiAJCQkJc3RydWN0IGF0aDVrX2J1ZiAqYmYsCiAJCQkJc3RydWN0IGF0aDVrX3R4cSAqdHhxLCBpbnQgcGFkc2l6ZSk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfdHhidWZfZnJlZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLAorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfdHhidWZfZnJlZV9za2Ioc3RydWN0IGF0aDVrX3NvZnRjICpzYywKIAkJCQlzdHJ1Y3QgYXRoNWtfYnVmICpiZikKIHsKIAlCVUdfT04oIWJmKTsKQEAgLTMyMSw5ICszMjIsMTEgQEAKIAkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCWRldl9rZnJlZV9za2JfYW55KGJmLT5za2IpOwogCWJmLT5za2IgPSBOVUxMOworCWJmLT5za2JhZGRyID0gMDsKKwliZi0+ZGVzYy0+ZHNfZGF0YSA9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19yeGJ1Zl9mcmVlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfcnhidWZfZnJlZV9za2Ioc3RydWN0IGF0aDVrX3NvZnRjICpzYywKIAkJCQlzdHJ1Y3QgYXRoNWtfYnVmICpiZikKIHsKIAlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwpAQCAtMzM2LDYgKzMzOSw4IEBACiAJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCWRldl9rZnJlZV9za2JfYW55KGJmLT5za2IpOwogCWJmLT5za2IgPSBOVUxMOworCWJmLT5za2JhZGRyID0gMDsKKwliZi0+ZGVzYy0+ZHNfZGF0YSA9IDA7CiB9CiAKIApAQCAtMzUyLDcgKzM1Nyw2IEBACiBzdGF0aWMgaW50IAlhdGg1a19yeF9zdGFydChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKIHN0YXRpYyB2b2lkIAlhdGg1a19yeF9zdG9wKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOwogc3RhdGljIHVuc2lnbmVkIGludCBhdGg1a19yeF9kZWNyeXB0ZWQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywKLQkJCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRzLAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycyk7CiBzdGF0aWMgdm9pZCAJYXRoNWtfdGFza2xldF9yeCh1bnNpZ25lZCBsb25nIGRhdGEpOwpAQCAtMzg0LDcgKzM4OCw3IEBACiBzdGF0aWMgaW50IAlhdGg1a19zdG9wX2xvY2tlZChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKIHN0YXRpYyBpbnQgCWF0aDVrX3N0b3BfaHcoc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgYXRoNWtfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotc3RhdGljIHZvaWQgCWF0aDVrX3Rhc2tsZXRfcmVzZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGF0aDVrX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIHZvaWQgCWF0aDVrX3Rhc2tsZXRfY2FsaWJyYXRlKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKQEAgLTU3OCw3ICs1ODIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZzYy0+YmxvY2spOwogCiAJLyogU2V0IHByaXZhdGUgZGF0YSAqLwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHNjKTsKIAogCS8qIFNldHVwIGludGVycnVwdCBoYW5kbGVyICovCiAJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBhdGg1a19pbnRyLCBJUlFGX1NIQVJFRCwgImF0aCIsIHNjKTsKQEAgLTY5NCwyNSArNjk4LDIzIEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQKIGF0aDVrX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKIAlhdGg1a19kZWJ1Z19maW5pc2hfZGV2aWNlKHNjKTsKLQlhdGg1a19kZXRhY2gocGRldiwgaHcpOworCWF0aDVrX2RldGFjaChwZGV2LCBzYy0+aHcpOwogCWF0aDVrX2h3X2RldGFjaChzYy0+YWgpOwogCWtmcmVlKHNjLT5haCk7CiAJZnJlZV9pcnEocGRldi0+aXJxLCBzYyk7CiAJcGNpX2lvdW5tYXAocGRldiwgc2MtPmlvYmFzZSk7CiAJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlpZWVlODAyMTFfZnJlZV9odyhodyk7CisJaWVlZTgwMjExX2ZyZWVfaHcoc2MtPmh3KTsKIH0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBhdGg1a19wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOwogCiAJYXRoNWtfbGVkX29mZihzYyk7CiAJcmV0dXJuIDA7CkBAIC03MjEsOCArNzIzLDcgQEAKIHN0YXRpYyBpbnQgYXRoNWtfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKIAkvKgogCSAqIFN1c3BlbmQvUmVzdW1lIHJlc2V0cyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UsIHNvIHdlIGhhdmUgdG8KQEAgLTc2OCw3ICs3NjksOCBAQAogCSAqIHJldHVybiBmYWxzZSB3L28gZG9pbmcgYW55dGhpbmcuICBNQUMncyB0aGF0IGRvCiAJICogc3VwcG9ydCBpdCB3aWxsIHJldHVybiB0cnVlIHcvbyBkb2luZyBhbnl0aGluZy4KIAkgKi8KLQlyZXQgPSBhaC0+YWhfc2V0dXBfbXJyX3R4X2Rlc2MoYWgsIE5VTEwsIDAsIDAsIDAsIDAsIDAsIDApOworCXJldCA9IGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKGFoLCBOVUxMLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAlpZiAocmV0ID4gMCkKQEAgLTgyOSwxMSArODMxLDEyIEBACiAKIAl0YXNrbGV0X2luaXQoJnNjLT5yeHRxLCBhdGg1a190YXNrbGV0X3J4LCAodW5zaWduZWQgbG9uZylzYyk7CiAJdGFza2xldF9pbml0KCZzYy0+dHh0cSwgYXRoNWtfdGFza2xldF90eCwgKHVuc2lnbmVkIGxvbmcpc2MpOwotCXRhc2tsZXRfaW5pdCgmc2MtPnJlc3RxLCBhdGg1a190YXNrbGV0X3Jlc2V0LCAodW5zaWduZWQgbG9uZylzYyk7CiAJdGFza2xldF9pbml0KCZzYy0+Y2FsaWIsIGF0aDVrX3Rhc2tsZXRfY2FsaWJyYXRlLCAodW5zaWduZWQgbG9uZylzYyk7CiAJdGFza2xldF9pbml0KCZzYy0+YmVhY29udHEsIGF0aDVrX3Rhc2tsZXRfYmVhY29uLCAodW5zaWduZWQgbG9uZylzYyk7CiAJdGFza2xldF9pbml0KCZzYy0+YW5pX3Rhc2tsZXQsIGF0aDVrX3Rhc2tsZXRfYW5pLCAodW5zaWduZWQgbG9uZylzYyk7CiAKKwlJTklUX1dPUksoJnNjLT5yZXNldF93b3JrLCBhdGg1a19yZXNldF93b3JrKTsKKwogCXJldCA9IGF0aDVrX2VlcHJvbV9yZWFkX21hYyhhaCwgbWFjKTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihzYywgInVuYWJsZSB0byByZWFkIGFkZHJlc3MgZnJvbSBFRVBST006IDB4JTA0eFxuIiwKQEAgLTg2NCw2ICs4NjcsOCBAQAogCiAJYXRoNWtfaW5pdF9sZWRzKHNjKTsKIAorCWF0aDVrX3N5c2ZzX3JlZ2lzdGVyKHNjKTsKKwogCXJldHVybiAwOwogZXJyX3F1ZXVlczoKIAlhdGg1a190eHFfcmVsZWFzZShzYyk7CkBAIC04OTksNiArOTA0LDcgQEAKIAlhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKHNjLT5haCwgc2MtPmJoYWxxKTsKIAlhdGg1a191bnJlZ2lzdGVyX2xlZHMoc2MpOwogCisJYXRoNWtfc3lzZnNfdW5yZWdpc3RlcihzYyk7CiAJLyoKIAkgKiBOQjogY2FuJ3QgcmVjbGFpbSB0aGVzZSB1bnRpbCBhZnRlciBpZWVlODAyMTFfaWZkZXRhY2gKIAkgKiByZXR1cm5zIGJlY2F1c2Ugd2UnbGwgZ2V0IGNhbGxlZCBiYWNrIHRvIHJlY2xhaW0gbm9kZQpAQCAtMTExMSw4ICsxMTE3LDkgQEAKIHN0YXRpYyBpbnQKIGF0aDVrX2NoYW5fc2V0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbikKIHsKLQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAiKCV1IE1IeikgLT4gKCV1IE1IeilcbiIsCi0JCXNjLT5jdXJjaGFuLT5jZW50ZXJfZnJlcSwgY2hhbi0+Y2VudGVyX2ZyZXEpOworCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsCisJCSAgImNoYW5uZWwgc2V0LCByZXNldHRpbmcgKCV1IC0+ICV1IE1IeilcbiIsCisJCSAgc2MtPmN1cmNoYW4tPmNlbnRlcl9mcmVxLCBjaGFuLT5jZW50ZXJfZnJlcSk7CiAKIAkvKgogCSAqIFRvIHN3aXRjaCBjaGFubmVscyBjbGVhciBhbnkgcGVuZGluZyBETUEgb3BlcmF0aW9uczsKQEAgLTEyMjgsMjEgKzEyMzUsMjMgQEAKIAkgKiBub3QgZ2V0IG92ZXJydW4gdW5kZXIgaGlnaCBsb2FkIChhcyBjYW4gaGFwcGVuIHdpdGggYQogCSAqIDUyMTIgd2hlbiBBTkkgcHJvY2Vzc2luZyBlbmFibGVzIFBIWSBlcnJvciBmcmFtZXMpLgogCSAqCi0JICogVG8gaW5zdXJlIHRoZSBsYXN0IGRlc2NyaXB0b3IgaXMgc2VsZi1saW5rZWQgd2UgY3JlYXRlCisJICogVG8gZW5zdXJlIHRoZSBsYXN0IGRlc2NyaXB0b3IgaXMgc2VsZi1saW5rZWQgd2UgY3JlYXRlCiAJICogZWFjaCBkZXNjcmlwdG9yIGFzIHNlbGYtbGlua2VkIGFuZCBhZGQgaXQgdG8gdGhlIGVuZC4gIEFzCiAJICogZWFjaCBhZGRpdGlvbmFsIGRlc2NyaXB0b3IgaXMgYWRkZWQgdGhlIHByZXZpb3VzIHNlbGYtbGlua2VkCi0JICogZW50cnkgaXMgYGBmaXhlZCcnIG5hdHVyYWxseS4gIFRoaXMgc2hvdWxkIGJlIHNhZmUgZXZlbgorCSAqIGVudHJ5IGlzICJmaXhlZCIgbmF0dXJhbGx5LiAgVGhpcyBzaG91bGQgYmUgc2FmZSBldmVuCiAJICogaWYgRE1BIGlzIGhhcHBlbmluZy4gIFdoZW4gcHJvY2Vzc2luZyBSWCBpbnRlcnJ1cHRzIHdlCiAJICogbmV2ZXIgcmVtb3ZlL3Byb2Nlc3MgdGhlIGxhc3QsIHNlbGYtbGlua2VkLCBlbnRyeSBvbiB0aGUKLQkgKiBkZXNjcmlwdG9yIGxpc3QuICBUaGlzIGluc3VyZXMgdGhlIGhhcmR3YXJlIGFsd2F5cyBoYXMKKwkgKiBkZXNjcmlwdG9yIGxpc3QuICBUaGlzIGVuc3VyZXMgdGhlIGhhcmR3YXJlIGFsd2F5cyBoYXMKIAkgKiBzb21lcGxhY2UgdG8gd3JpdGUgYSBuZXcgZnJhbWUuCiAJICovCiAJZHMgPSBiZi0+ZGVzYzsKIAlkcy0+ZHNfbGluayA9IGJmLT5kYWRkcjsJLyogbGluayB0byBzZWxmICovCiAJZHMtPmRzX2RhdGEgPSBiZi0+c2tiYWRkcjsKLQlyZXQgPSBhaC0+YWhfc2V0dXBfcnhfZGVzYyhhaCwgZHMsIGFoLT5jb21tb24ucnhfYnVmc2l6ZSwgMCk7Ci0JaWYgKHJldCkKKwlyZXQgPSBhdGg1a19od19zZXR1cF9yeF9kZXNjKGFoLCBkcywgYWgtPmNvbW1vbi5yeF9idWZzaXplLCAwKTsKKwlpZiAocmV0KSB7CisJCUFUSDVLX0VSUihzYywgIiVzOiBjb3VsZCBub3Qgc2V0dXAgUlggZGVzY1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0OworCX0KIAogCWlmIChzYy0+cnhsaW5rICE9IE5VTEwpCiAJCSpzYy0+cnhsaW5rID0gYmYtPmRhZGRyOwpAQCAtMTM0Nyw3ICsxMzU2LDcgQEAKIAkJbXJyX3RyaWVzW2ldID0gaW5mby0+Y29udHJvbC5yYXRlc1tpICsgMV0uY291bnQ7CiAJfQogCi0JYWgtPmFoX3NldHVwX21ycl90eF9kZXNjKGFoLCBkcywKKwlhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhhaCwgZHMsCiAJCW1ycl9yYXRlWzBdLCBtcnJfdHJpZXNbMF0sCiAJCW1ycl9yYXRlWzFdLCBtcnJfdHJpZXNbMV0sCiAJCW1ycl9yYXRlWzJdLCBtcnJfdHJpZXNbMl0pOwpAQCAtMTQ0MywxNyArMTQ1MiwyMCBAQAogewogCXN0cnVjdCBhdGg1a19idWYgKmJmOwogCi0JYXRoNWtfdHhidWZfZnJlZShzYywgc2MtPmJidWYpOworCWF0aDVrX3R4YnVmX2ZyZWVfc2tiKHNjLCBzYy0+YmJ1Zik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShiZiwgJnNjLT50eGJ1ZiwgbGlzdCkKLQkJYXRoNWtfdHhidWZfZnJlZShzYywgYmYpOworCQlhdGg1a190eGJ1Zl9mcmVlX3NrYihzYywgYmYpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+cnhidWYsIGxpc3QpCi0JCWF0aDVrX3J4YnVmX2ZyZWUoc2MsIGJmKTsKKwkJYXRoNWtfcnhidWZfZnJlZV9za2Ioc2MsIGJmKTsKIAogCS8qIEZyZWUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbGwgZGVzY3JpcHRvcnMgKi8KIAlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNjLT5kZXNjX2xlbiwgc2MtPmRlc2MsIHNjLT5kZXNjX2RhZGRyKTsKKwlzYy0+ZGVzYyA9IE5VTEw7CisJc2MtPmRlc2NfZGFkZHIgPSAwOwogCiAJa2ZyZWUoc2MtPmJ1ZnB0cik7CiAJc2MtPmJ1ZnB0ciA9IE5VTEw7CisJc2MtPmJidWYgPSBOVUxMOwogfQogCiAKQEAgLTE2MDIsNyArMTYxNCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJmLCBiZjAsICZ0eHEtPnEsIGxpc3QpIHsKIAkJYXRoNWtfZGVidWdfcHJpbnR0eGJ1ZihzYywgYmYpOwogCi0JCWF0aDVrX3R4YnVmX2ZyZWUoc2MsIGJmKTsKKwkJYXRoNWtfdHhidWZfZnJlZV9za2Ioc2MsIGJmKTsKIAogCQlzcGluX2xvY2tfYmgoJnNjLT50eGJ1ZmxvY2spOwogCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZzYy0+dHhidWYpOwpAQCAtMTcxNiwxMyArMTcyOCwxMSBAQAogCWF0aDVrX2h3X3N0b3BfcnhfZG1hKGFoKTsJLyogZGlzYWJsZSBETUEgZW5naW5lICovCiAKIAlhdGg1a19kZWJ1Z19wcmludHJ4YnVmZnMoc2MsIGFoKTsKLQotCXNjLT5yeGxpbmsgPSBOVUxMOwkJLyoganVzdCBpbiBjYXNlICovCiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWF0aDVrX3J4X2RlY3J5cHRlZChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZHMsCi0JCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQorYXRoNWtfcnhfZGVjcnlwdGVkKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQogewogCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CkBAIC0xODg5LDkgKzE4OTksMTM4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hdGg1a190YXNrbGV0X3J4KHVuc2lnbmVkIGxvbmcgZGF0YSkKK2F0aDVrX3JlY2VpdmVfZnJhbWUoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQogewogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeHM7CisKKwkvKiBUaGUgTUFDIGhlYWRlciBpcyBwYWRkZWQgdG8gaGF2ZSAzMi1iaXQgYm91bmRhcnkgaWYgdGhlCisJICogcGFja2V0IHBheWxvYWQgaXMgbm9uLXplcm8uIFRoZSBnZW5lcmFsIGNhbGN1bGF0aW9uIGZvcgorCSAqIHBhZHNpemUgd291bGQgdGFrZSBpbnRvIGFjY291bnQgb2RkIGhlYWRlciBsZW5ndGhzOgorCSAqIHBhZHNpemUgPSAoNCAtIGhkcmxlbiAlIDQpICUgNDsgSG93ZXZlciwgc2luY2Ugb25seQorCSAqIGV2ZW4tbGVuZ3RoIGhlYWRlcnMgYXJlIHVzZWQsIHBhZGRpbmcgY2FuIG9ubHkgYmUgMCBvciAyCisJICogYnl0ZXMgYW5kIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIGEgYml0LiBJbiBhZGRpdGlvbiwgd2UgbXVzdAorCSAqIG5vdCB0cnkgdG8gcmVtb3ZlIHBhZGRpbmcgZnJvbSBzaG9ydCBjb250cm9sIGZyYW1lcyB0aGF0IGRvCisJICogbm90IGhhdmUgcGF5bG9hZC4gKi8KKwlhdGg1a19yZW1vdmVfcGFkZGluZyhza2IpOworCisJcnhzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CisKKwlyeHMtPmZsYWcgPSAwOworCWlmICh1bmxpa2VseShycy0+cnNfc3RhdHVzICYgQVI1S19SWEVSUl9NSUMpKQorCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19NTUlDX0VSUk9SOworCisJLyoKKwkgKiBhbHdheXMgZXh0ZW5kIHRoZSBtYWMgdGltZXN0YW1wLCBzaW5jZSB0aGlzIGluZm9ybWF0aW9uIGlzCisJICogYWxzbyBuZWVkZWQgZm9yIHByb3BlciBJQlNTIG1lcmdpbmcuCisJICoKKwkgKiBYWFg6IGl0IG1pZ2h0IGJlIHRvbyBsYXRlIHRvIGRvIGl0IGhlcmUsIHNpbmNlIHJzX3RzdGFtcCBpcworCSAqIDE1Yml0IG9ubHkuIHRoYXQgbWVhbnMgVFNGIGV4dGVuc2lvbiBoYXMgdG8gYmUgZG9uZSB3aXRoaW4KKwkgKiAzMjc2OHVzZWMgKGFib3V0IDMybXMpLiBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gbW92ZSB0aGlzIHRvCisJICogdGhlIGludGVycnVwdCBoYW5kbGVyLCBsaWtlIGl0IGlzIGRvbmUgaW4gbWFkd2lmaS4KKwkgKgorCSAqIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3Qga25vdyB3aGVuIHRoZSBoYXJkd2FyZSB0YWtlcyB0aGUgcngKKwkgKiB0aW1lc3RhbXAgKGJlZ2lubmluZyBvZiBwaHkgZnJhbWUsIGRhdGEgZnJhbWUsIGVuZCBvZiByeD8pLgorCSAqIFRoZSBvbmx5IHRoaW5nIHdlIGtub3cgaXMgdGhhdCBpdCBpcyBoYXJkd2FyZSBzcGVjaWZpYy4uLgorCSAqIE9uIEFSNTIxMyBpdCBzZWVtcyB0aGUgcnggdGltZXN0YW1wIGlzIGF0IHRoZSBlbmQgb2YgdGhlCisJICogZnJhbWUsIGJ1dCBpJ20gbm90IHN1cmUuCisJICoKKwkgKiBOT1RFOiBtYWM4MDIxMSBkZWZpbmVzIG1hY3RpbWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QKKwkgKiBkYXRhIHN5bWJvbC4gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgdGltZSByZWZlcmVuY2VzIGl0J3MKKwkgKiBpbXBvc3NpYmxlIHRvIGNvbXBseSB0byB0aGF0LiBUaGlzIGFmZmVjdHMgSUJTUyBtZXJnZSBvbmx5CisJICogcmlnaHQgbm93LCBzbyBpdCdzIG5vdCB0b28gYmFkLi4uCisJICovCisJcnhzLT5tYWN0aW1lID0gYXRoNWtfZXh0ZW5kX3RzZihzYy0+YWgsIHJzLT5yc190c3RhbXApOworCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX1RTRlQ7CisKKwlyeHMtPmZyZXEgPSBzYy0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXE7CisJcnhzLT5iYW5kID0gc2MtPmN1cmJhbmQtPmJhbmQ7CisKKwlyeHMtPnNpZ25hbCA9IHNjLT5haC0+YWhfbm9pc2VfZmxvb3IgKyBycy0+cnNfcnNzaTsKKworCXJ4cy0+YW50ZW5uYSA9IHJzLT5yc19hbnRlbm5hOworCisJaWYgKHJzLT5yc19hbnRlbm5hID4gMCAmJiBycy0+cnNfYW50ZW5uYSA8IDUpCisJCXNjLT5zdGF0cy5hbnRlbm5hX3J4W3JzLT5yc19hbnRlbm5hXSsrOworCWVsc2UKKwkJc2MtPnN0YXRzLmFudGVubmFfcnhbMF0rKzsgLyogaW52YWxpZCAqLworCisJcnhzLT5yYXRlX2lkeCA9IGF0aDVrX2h3X3RvX2RyaXZlcl9yaXgoc2MsIHJzLT5yc19yYXRlKTsKKwlyeHMtPmZsYWcgfD0gYXRoNWtfcnhfZGVjcnlwdGVkKHNjLCBza2IsIHJzKTsKKworCWlmIChyeHMtPnJhdGVfaWR4ID49IDAgJiYgcnMtPnJzX3JhdGUgPT0KKwkgICAgc2MtPmN1cmJhbmQtPmJpdHJhdGVzW3J4cy0+cmF0ZV9pZHhdLmh3X3ZhbHVlX3Nob3J0KQorCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKKworCWF0aDVrX2RlYnVnX2R1bXBfc2tiKHNjLCBza2IsICJSWCAgIiwgMCk7CisKKwlhdGg1a191cGRhdGVfYmVhY29uX3Jzc2koc2MsIHNrYiwgcnMtPnJzX3Jzc2kpOworCisJLyogY2hlY2sgYmVhY29ucyBpbiBJQlNTIG1vZGUgKi8KKwlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJYXRoNWtfY2hlY2tfaWJzc190c2Yoc2MsIHNrYiwgcnhzKTsKKworCWllZWU4MDIxMV9yeChzYy0+aHcsIHNrYik7Cit9CisKKy8qKiBhdGg1a19mcmFtZV9yZWNlaXZlX29rKCkgLSBEbyB3ZSB3YW50IHRvIHJlY2VpdmUgdGhpcyBmcmFtZSBvciBub3Q/CisgKgorICogQ2hlY2sgaWYgd2Ugd2FudCB0byBmdXJ0aGVyIHByb2Nlc3MgdGhpcyBmcmFtZSBvciBub3QuIEFsc28gdXBkYXRlCisgKiBzdGF0aXN0aWNzLiBSZXR1cm4gdHJ1ZSBpZiB3ZSB3YW50IHRoaXMgZnJhbWUsIGZhbHNlIGlmIG5vdC4KKyAqLworc3RhdGljIGJvb2wKK2F0aDVrX3JlY2VpdmVfZnJhbWVfb2soc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCit7CisJc2MtPnN0YXRzLnJ4X2FsbF9jb3VudCsrOworCisJaWYgKHVubGlrZWx5KHJzLT5yc19zdGF0dXMpKSB7CisJCWlmIChycy0+cnNfc3RhdHVzICYgQVI1S19SWEVSUl9DUkMpCisJCQlzYy0+c3RhdHMucnhlcnJfY3JjKys7CisJCWlmIChycy0+cnNfc3RhdHVzICYgQVI1S19SWEVSUl9GSUZPKQorCQkJc2MtPnN0YXRzLnJ4ZXJyX2ZpZm8rKzsKKwkJaWYgKHJzLT5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX1BIWSkgeworCQkJc2MtPnN0YXRzLnJ4ZXJyX3BoeSsrOworCQkJaWYgKHJzLT5yc19waHllcnIgPiAwICYmIHJzLT5yc19waHllcnIgPCAzMikKKwkJCQlzYy0+c3RhdHMucnhlcnJfcGh5X2NvZGVbcnMtPnJzX3BoeWVycl0rKzsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfREVDUllQVCkgeworCQkJLyoKKwkJCSAqIERlY3J5cHQgZXJyb3IuICBJZiB0aGUgZXJyb3Igb2NjdXJyZWQKKwkJCSAqIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGhhcmR3YXJlIGtleSwgdGhlbgorCQkJICogbGV0IHRoZSBmcmFtZSB0aHJvdWdoIHNvIHRoZSB1cHBlciBsYXllcnMKKwkJCSAqIGNhbiBwcm9jZXNzIGl0LiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIDUyMTAKKwkJCSAqIHBhcnRzIHdoaWNoIGhhdmUgbm8gd2F5IHRvIHNldHVwIGEgYGBjbGVhcicnCisJCQkgKiBrZXkgY2FjaGUgZW50cnkuCisJCQkgKgorCQkJICogWFhYIGRvIGtleSBjYWNoZSBmYXVsdGluZworCQkJICovCisJCQlzYy0+c3RhdHMucnhlcnJfZGVjcnlwdCsrOworCQkJaWYgKHJzLT5yc19rZXlpeCA9PSBBUjVLX1JYS0VZSVhfSU5WQUxJRCAmJgorCQkJICAgICEocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfQ1JDKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfTUlDKSB7CisJCQlzYy0+c3RhdHMucnhlcnJfbWljKys7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8qIGxldCBjcnlwdG8tZXJyb3IgcGFja2V0cyBmYWxsIHRocm91Z2ggaW4gTU5UUiAqLworCQlpZiAoKHJzLT5yc19zdGF0dXMgJiB+KEFSNUtfUlhFUlJfREVDUllQVHxBUjVLX1JYRVJSX01JQykpIHx8CisJCSAgICBzYy0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHVubGlrZWx5KHJzLT5yc19tb3JlKSkgeworCQlzYy0+c3RhdHMucnhlcnJfanVtYm8rKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2F0aDVrX3Rhc2tsZXRfcngodW5zaWduZWQgbG9uZyBkYXRhKQorewogCXN0cnVjdCBhdGg1a19yeF9zdGF0dXMgcnMgPSB7fTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbmV4dF9za2I7CiAJZG1hX2FkZHJfdCBuZXh0X3NrYl9hZGRyOwpAQCAtMTkwMSw3ICsyMDQwLDYgQEAKIAlzdHJ1Y3QgYXRoNWtfYnVmICpiZjsKIAlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHM7CiAJaW50IHJldDsKLQlpbnQgcnhfZmxhZzsKIAogCXNwaW5fbG9jaygmc2MtPnJ4YnVmbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJnNjLT5yeGJ1ZikpIHsKQEAgLTE5MDksOCArMjA0Nyw2IEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAlkbyB7Ci0JCXJ4X2ZsYWcgPSAwOwotCiAJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmc2MtPnJ4YnVmLCBzdHJ1Y3QgYXRoNWtfYnVmLCBsaXN0KTsKIAkJQlVHX09OKGJmLT5za2IgPT0gTlVMTCk7CiAJCXNrYiA9IGJmLT5za2I7CkBAIC0xOTI2LDEzNyArMjA2MiwzMCBAQAogCQllbHNlIGlmICh1bmxpa2VseShyZXQpKSB7CiAJCQlBVEg1S19FUlIoc2MsICJlcnJvciBpbiBwcm9jZXNzaW5nIHJ4IGRlc2NyaXB0b3JcbiIpOwogCQkJc2MtPnN0YXRzLnJ4ZXJyX3Byb2MrKzsKLQkJCXNwaW5fdW5sb2NrKCZzYy0+cnhidWZsb2NrKTsKLQkJCXJldHVybjsKKwkJCWJyZWFrOwogCQl9CiAKLQkJc2MtPnN0YXRzLnJ4X2FsbF9jb3VudCsrOworCQlpZiAoYXRoNWtfcmVjZWl2ZV9mcmFtZV9vayhzYywgJnJzKSkgeworCQkJbmV4dF9za2IgPSBhdGg1a19yeF9za2JfYWxsb2Moc2MsICZuZXh0X3NrYl9hZGRyKTsKIAotCQlpZiAodW5saWtlbHkocnMucnNfc3RhdHVzKSkgewotCQkJaWYgKHJzLnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfQ1JDKQotCQkJCXNjLT5zdGF0cy5yeGVycl9jcmMrKzsKLQkJCWlmIChycy5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX0ZJRk8pCi0JCQkJc2MtPnN0YXRzLnJ4ZXJyX2ZpZm8rKzsKLQkJCWlmIChycy5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX1BIWSkgewotCQkJCXNjLT5zdGF0cy5yeGVycl9waHkrKzsKLQkJCQlpZiAocnMucnNfcGh5ZXJyID4gMCAmJiBycy5yc19waHllcnIgPCAzMikKLQkJCQkJc2MtPnN0YXRzLnJ4ZXJyX3BoeV9jb2RlW3JzLnJzX3BoeWVycl0rKzsKKwkJCS8qCisJCQkgKiBJZiB3ZSBjYW4ndCByZXBsYWNlIGJmLT5za2Igd2l0aCBhIG5ldyBza2IgdW5kZXIKKwkJCSAqIG1lbW9yeSBwcmVzc3VyZSwganVzdCBza2lwIHRoaXMgcGFja2V0CisJCQkgKi8KKwkJCWlmICghbmV4dF9za2IpCiAJCQkJZ290byBuZXh0OwotCQkJfQotCQkJaWYgKHJzLnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfREVDUllQVCkgewotCQkJCS8qCi0JCQkJICogRGVjcnlwdCBlcnJvci4gIElmIHRoZSBlcnJvciBvY2N1cnJlZAotCQkJCSAqIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGhhcmR3YXJlIGtleSwgdGhlbgotCQkJCSAqIGxldCB0aGUgZnJhbWUgdGhyb3VnaCBzbyB0aGUgdXBwZXIgbGF5ZXJzCi0JCQkJICogY2FuIHByb2Nlc3MgaXQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgNTIxMAotCQkJCSAqIHBhcnRzIHdoaWNoIGhhdmUgbm8gd2F5IHRvIHNldHVwIGEgYGBjbGVhcicnCi0JCQkJICoga2V5IGNhY2hlIGVudHJ5LgotCQkJCSAqCi0JCQkJICogWFhYIGRvIGtleSBjYWNoZSBmYXVsdGluZwotCQkJCSAqLwotCQkJCXNjLT5zdGF0cy5yeGVycl9kZWNyeXB0Kys7Ci0JCQkJaWYgKHJzLnJzX2tleWl4ID09IEFSNUtfUlhLRVlJWF9JTlZBTElEICYmCi0JCQkJICAgICEocnMucnNfc3RhdHVzICYgQVI1S19SWEVSUl9DUkMpKQotCQkJCQlnb3RvIGFjY2VwdDsKLQkJCX0KLQkJCWlmIChycy5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX01JQykgewotCQkJCXJ4X2ZsYWcgfD0gUlhfRkxBR19NTUlDX0VSUk9SOwotCQkJCXNjLT5zdGF0cy5yeGVycl9taWMrKzsKLQkJCQlnb3RvIGFjY2VwdDsKLQkJCX0KIAotCQkJLyogbGV0IGNyeXB0by1lcnJvciBwYWNrZXRzIGZhbGwgdGhyb3VnaCBpbiBNTlRSICovCi0JCQlpZiAoKHJzLnJzX3N0YXR1cyAmCi0JCQkJfihBUjVLX1JYRVJSX0RFQ1JZUFR8QVI1S19SWEVSUl9NSUMpKSB8fAotCQkJCQlzYy0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCi0JCQkJZ290byBuZXh0OworCQkJcGNpX3VubWFwX3NpbmdsZShzYy0+cGRldiwgYmYtPnNrYmFkZHIsCisJCQkJCSBjb21tb24tPnJ4X2J1ZnNpemUsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlza2JfcHV0KHNrYiwgcnMucnNfZGF0YWxlbik7CisKKwkJCWF0aDVrX3JlY2VpdmVfZnJhbWUoc2MsIHNrYiwgJnJzKTsKKworCQkJYmYtPnNrYiA9IG5leHRfc2tiOworCQkJYmYtPnNrYmFkZHIgPSBuZXh0X3NrYl9hZGRyOwogCQl9Ci0KLQkJaWYgKHVubGlrZWx5KHJzLnJzX21vcmUpKSB7Ci0JCQlzYy0+c3RhdHMucnhlcnJfanVtYm8rKzsKLQkJCWdvdG8gbmV4dDsKLQotCQl9Ci1hY2NlcHQ6Ci0JCW5leHRfc2tiID0gYXRoNWtfcnhfc2tiX2FsbG9jKHNjLCAmbmV4dF9za2JfYWRkcik7Ci0KLQkJLyoKLQkJICogSWYgd2UgY2FuJ3QgcmVwbGFjZSBiZi0+c2tiIHdpdGggYSBuZXcgc2tiIHVuZGVyIG1lbW9yeQotCQkgKiBwcmVzc3VyZSwganVzdCBza2lwIHRoaXMgcGFja2V0Ci0JCSAqLwotCQlpZiAoIW5leHRfc2tiKQotCQkJZ290byBuZXh0OwotCi0JCXBjaV91bm1hcF9zaW5nbGUoc2MtPnBkZXYsIGJmLT5za2JhZGRyLCBjb21tb24tPnJ4X2J1ZnNpemUsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJc2tiX3B1dChza2IsIHJzLnJzX2RhdGFsZW4pOwotCi0JCS8qIFRoZSBNQUMgaGVhZGVyIGlzIHBhZGRlZCB0byBoYXZlIDMyLWJpdCBib3VuZGFyeSBpZiB0aGUKLQkJICogcGFja2V0IHBheWxvYWQgaXMgbm9uLXplcm8uIFRoZSBnZW5lcmFsIGNhbGN1bGF0aW9uIGZvcgotCQkgKiBwYWRzaXplIHdvdWxkIHRha2UgaW50byBhY2NvdW50IG9kZCBoZWFkZXIgbGVuZ3RoczoKLQkJICogcGFkc2l6ZSA9ICg0IC0gaGRybGVuICUgNCkgJSA0OyBIb3dldmVyLCBzaW5jZSBvbmx5Ci0JCSAqIGV2ZW4tbGVuZ3RoIGhlYWRlcnMgYXJlIHVzZWQsIHBhZGRpbmcgY2FuIG9ubHkgYmUgMCBvciAyCi0JCSAqIGJ5dGVzIGFuZCB3ZSBjYW4gb3B0aW1pemUgdGhpcyBhIGJpdC4gSW4gYWRkaXRpb24sIHdlIG11c3QKLQkJICogbm90IHRyeSB0byByZW1vdmUgcGFkZGluZyBmcm9tIHNob3J0IGNvbnRyb2wgZnJhbWVzIHRoYXQgZG8KLQkJICogbm90IGhhdmUgcGF5bG9hZC4gKi8KLQkJYXRoNWtfcmVtb3ZlX3BhZGRpbmcoc2tiKTsKLQotCQlyeHMgPSBJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKTsKLQotCQkvKgotCQkgKiBhbHdheXMgZXh0ZW5kIHRoZSBtYWMgdGltZXN0YW1wLCBzaW5jZSB0aGlzIGluZm9ybWF0aW9uIGlzCi0JCSAqIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgSUJTUyBtZXJnaW5nLgotCQkgKgotCQkgKiBYWFg6IGl0IG1pZ2h0IGJlIHRvbyBsYXRlIHRvIGRvIGl0IGhlcmUsIHNpbmNlIHJzX3RzdGFtcCBpcwotCQkgKiAxNWJpdCBvbmx5LiB0aGF0IG1lYW5zIFRTRiBleHRlbnNpb24gaGFzIHRvIGJlIGRvbmUgd2l0aGluCi0JCSAqIDMyNzY4dXNlYyAoYWJvdXQgMzJtcykuIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBtb3ZlIHRoaXMgdG8KLQkJICogdGhlIGludGVycnVwdCBoYW5kbGVyLCBsaWtlIGl0IGlzIGRvbmUgaW4gbWFkd2lmaS4KLQkJICoKLQkJICogVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBrbm93IHdoZW4gdGhlIGhhcmR3YXJlIHRha2VzIHRoZSByeAotCQkgKiB0aW1lc3RhbXAgKGJlZ2lubmluZyBvZiBwaHkgZnJhbWUsIGRhdGEgZnJhbWUsIGVuZCBvZiByeD8pLgotCQkgKiBUaGUgb25seSB0aGluZyB3ZSBrbm93IGlzIHRoYXQgaXQgaXMgaGFyZHdhcmUgc3BlY2lmaWMuLi4KLQkJICogT24gQVI1MjEzIGl0IHNlZW1zIHRoZSByeCB0aW1lc3RhbXAgaXMgYXQgdGhlIGVuZCBvZiB0aGUKLQkJICogZnJhbWUsIGJ1dCBpJ20gbm90IHN1cmUuCi0JCSAqCi0JCSAqIE5PVEU6IG1hYzgwMjExIGRlZmluZXMgbWFjdGltZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdAotCQkgKiBkYXRhIHN5bWJvbC4gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgdGltZSByZWZlcmVuY2VzIGl0J3MKLQkJICogaW1wb3NzaWJsZSB0byBjb21wbHkgdG8gdGhhdC4gVGhpcyBhZmZlY3RzIElCU1MgbWVyZ2Ugb25seQotCQkgKiByaWdodCBub3csIHNvIGl0J3Mgbm90IHRvbyBiYWQuLi4KLQkJICovCi0JCXJ4cy0+bWFjdGltZSA9IGF0aDVrX2V4dGVuZF90c2Yoc2MtPmFoLCBycy5yc190c3RhbXApOwotCQlyeHMtPmZsYWcgPSByeF9mbGFnIHwgUlhfRkxBR19UU0ZUOwotCi0JCXJ4cy0+ZnJlcSA9IHNjLT5jdXJjaGFuLT5jZW50ZXJfZnJlcTsKLQkJcnhzLT5iYW5kID0gc2MtPmN1cmJhbmQtPmJhbmQ7Ci0KLQkJcnhzLT5zaWduYWwgPSBzYy0+YWgtPmFoX25vaXNlX2Zsb29yICsgcnMucnNfcnNzaTsKLQotCQlyeHMtPmFudGVubmEgPSBycy5yc19hbnRlbm5hOwotCi0JCWlmIChycy5yc19hbnRlbm5hID4gMCAmJiBycy5yc19hbnRlbm5hIDwgNSkKLQkJCXNjLT5zdGF0cy5hbnRlbm5hX3J4W3JzLnJzX2FudGVubmFdKys7Ci0JCWVsc2UKLQkJCXNjLT5zdGF0cy5hbnRlbm5hX3J4WzBdKys7IC8qIGludmFsaWQgKi8KLQotCQlyeHMtPnJhdGVfaWR4ID0gYXRoNWtfaHdfdG9fZHJpdmVyX3JpeChzYywgcnMucnNfcmF0ZSk7Ci0JCXJ4cy0+ZmxhZyB8PSBhdGg1a19yeF9kZWNyeXB0ZWQoc2MsIGRzLCBza2IsICZycyk7Ci0KLQkJaWYgKHJ4cy0+cmF0ZV9pZHggPj0gMCAmJiBycy5yc19yYXRlID09Ci0JCSAgICBzYy0+Y3VyYmFuZC0+Yml0cmF0ZXNbcnhzLT5yYXRlX2lkeF0uaHdfdmFsdWVfc2hvcnQpCi0JCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKLQotCQlhdGg1a19kZWJ1Z19kdW1wX3NrYihzYywgc2tiLCAiUlggICIsIDApOwotCi0JCWF0aDVrX3VwZGF0ZV9iZWFjb25fcnNzaShzYywgc2tiLCBycy5yc19yc3NpKTsKLQotCQkvKiBjaGVjayBiZWFjb25zIGluIElCU1MgbW9kZSAqLwotCQlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJCWF0aDVrX2NoZWNrX2lic3NfdHNmKHNjLCBza2IsIHJ4cyk7Ci0KLQkJaWVlZTgwMjExX3J4KHNjLT5odywgc2tiKTsKLQotCQliZi0+c2tiID0gbmV4dF9za2I7Ci0JCWJmLT5za2JhZGRyID0gbmV4dF9za2JfYWRkcjsKIG5leHQ6CiAJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJnNjLT5yeGJ1Zik7CiAJfSB3aGlsZSAoYXRoNWtfcnhidWZfc2V0dXAoc2MsIGJmKSA9PSAwKTsKQEAgLTIwNjUsOCArMjA5NCw2IEBACiB9CiAKIAotCi0KIC8qKioqKioqKioqKioqXAogKiBUWCBIYW5kbGluZyAqCiBcKioqKioqKioqKioqKi8KQEAgLTIyNjYsOCArMjI5Myw4IEBACiAgKiBmcmFtZSBjb250ZW50cyBhcmUgZG9uZSBhcyBuZWVkZWQgYW5kIHRoZSBzbG90IHRpbWUgaXMKICAqIGFsc28gYWRqdXN0ZWQgYmFzZWQgb24gY3VycmVudCBzdGF0ZS4KICAqCi0gKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHNvZnR3YXJlIGlycSBjb250ZXh0IChiZWFjb250cSBvciByZXN0cQotICogdGFza2xldHMpIG9yIHVzZXIgY29udGV4dCBmcm9tIGF0aDVrX2JlYWNvbl9jb25maWcuCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHNvZnR3YXJlIGlycSBjb250ZXh0IChiZWFjb250cSB0YXNrbGV0cykKKyAqIG9yIHVzZXIgY29udGV4dCBmcm9tIGF0aDVrX2JlYWNvbl9jb25maWcuCiAgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a19iZWFjb25fc2VuZChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQpAQCAtMjI5OCw3ICsyMzI1LDkgQEAKIAkJCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJCSJzdHVjayBiZWFjb24gdGltZSAoJXUgbWlzc2VkKVxuIiwKIAkJCQlzYy0+Ym1pc3Njb3VudCk7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZzYy0+cmVzdHEpOworCQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwKKwkJCQkgICJzdHVjayBiZWFjb24sIHJlc2V0dGluZ1xuIik7CisJCQlpZWVlODAyMTFfcXVldWVfd29yayhzYy0+aHcsICZzYy0+cmVzZXRfd29yayk7CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTI2MDIsMTIgKzI2MzEsMjAgQEAKIAlpZiAoIXRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIHNjLT5zdGF0dXMpKSB7CiAJCWF0aDVrX3J4X3N0b3Aoc2MpOwogCQlhdGg1a19od19waHlfZGlzYWJsZShhaCk7Ci0JfSBlbHNlCi0JCXNjLT5yeGxpbmsgPSBOVUxMOworCX0KIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBzdG9wX3Rhc2tsZXRzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCit7CisJdGFza2xldF9raWxsKCZzYy0+cnh0cSk7CisJdGFza2xldF9raWxsKCZzYy0+dHh0cSk7CisJdGFza2xldF9raWxsKCZzYy0+Y2FsaWIpOworCXRhc2tsZXRfa2lsbCgmc2MtPmJlYWNvbnRxKTsKKwl0YXNrbGV0X2tpbGwoJnNjLT5hbmlfdGFza2xldCk7Cit9CisKIC8qCiAgKiBTdG9wIHRoZSBkZXZpY2UsIGdyYWJiaW5nIHRoZSB0b3AtbGV2ZWwgbG9jayB0byBwcm90ZWN0CiAgKiBhZ2FpbnN0IGNvbmN1cnJlbnQgZW50cnkgdGhyb3VnaCBhdGg1a19pbml0ICh3aGljaCBjYW4gaGFwcGVuCkBAIC0yNjQ3LDE3ICsyNjg0LDEyIEBACiAJCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkJInB1dHRpbmcgZGV2aWNlIHRvIHNsZWVwXG4iKTsKIAl9Ci0JYXRoNWtfdHhidWZfZnJlZShzYywgc2MtPmJidWYpOworCWF0aDVrX3R4YnVmX2ZyZWVfc2tiKHNjLCBzYy0+YmJ1Zik7CiAKIAltbWlvd2IoKTsKIAltdXRleF91bmxvY2soJnNjLT5sb2NrKTsKIAotCXRhc2tsZXRfa2lsbCgmc2MtPnJ4dHEpOwotCXRhc2tsZXRfa2lsbCgmc2MtPnR4dHEpOwotCXRhc2tsZXRfa2lsbCgmc2MtPnJlc3RxKTsKLQl0YXNrbGV0X2tpbGwoJnNjLT5jYWxpYik7Ci0JdGFza2xldF9raWxsKCZzYy0+YmVhY29udHEpOwotCXRhc2tsZXRfa2lsbCgmc2MtPmFuaV90YXNrbGV0KTsKKwlzdG9wX3Rhc2tsZXRzKHNjKTsKIAogCWF0aDVrX3Jma2lsbF9od19zdG9wKHNjLT5haCk7CiAKQEAgLTI3MDUsNyArMjczNyw5IEBACiAJCQkgKiBGYXRhbCBlcnJvcnMgYXJlIHVucmVjb3ZlcmFibGUuCiAJCQkgKiBUeXBpY2FsbHkgdGhlc2UgYXJlIGNhdXNlZCBieSBETUEgZXJyb3JzLgogCQkJICovCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZzYy0+cmVzdHEpOworCQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwKKwkJCQkgICJmYXRhbCBpbnQsIHJlc2V0dGluZ1xuIik7CisJCQlpZWVlODAyMTFfcXVldWVfd29yayhzYy0+aHcsICZzYy0+cmVzZXRfd29yayk7CiAJCX0gZWxzZSBpZiAodW5saWtlbHkoc3RhdHVzICYgQVI1S19JTlRfUlhPUk4pKSB7CiAJCQkvKgogCQkJICogUmVjZWl2ZSBidWZmZXJzIGFyZSBmdWxsLiBFaXRoZXIgdGhlIGJ1cyBpcyBidXN5IG9yCkBAIC0yNzE3LDggKzI3NTEsMTEgQEAKIAkJCSAqIHRoaXMgZ3Vlc3MgaXMgY29waWVkIGZyb20gdGhlIEhBTC4KIAkJCSAqLwogCQkJc2MtPnN0YXRzLnJ4b3JuX2ludHIrKzsKLQkJCWlmIChhaC0+YWhfbWFjX3NyZXYgPCBBUjVLX1NSRVZfQVI1MjEyKQotCQkJCXRhc2tsZXRfc2NoZWR1bGUoJnNjLT5yZXN0cSk7CisJCQlpZiAoYWgtPmFoX21hY19zcmV2IDwgQVI1S19TUkVWX0FSNTIxMikgeworCQkJCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsCisJCQkJCSAgInJ4IG92ZXJydW4sIHJlc2V0dGluZ1xuIik7CisJCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPnJlc2V0X3dvcmspOworCQkJfQogCQkJZWxzZQogCQkJCXRhc2tsZXRfc2NoZWR1bGUoJnNjLT5yeHRxKTsKIAkJfSBlbHNlIHsKQEAgLTI3MzEsNyArMjc2OCw3IEBACiAJCQkJKiAgICAgUlhFIGJpdCBpcyB3cml0dGVuLCBidXQgaXQgZG9lc24ndCB3b3JrIGF0CiAJCQkJKiAgICAgbGVhc3Qgb24gb2xkZXIgaGFyZHdhcmUgcmV2cy4KIAkJCQkqLwotCQkJCXNjLT5yeGxpbmsgPSBOVUxMOworCQkJCXNjLT5zdGF0cy5yeGVvbF9pbnRyKys7CiAJCQl9CiAJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfVFhVUk4pIHsKIAkJCQkvKiBidW1wIHR4IHRyaWdnZXIgbGV2ZWwgKi8KQEAgLTI3NjQsMTQgKzI4MDEsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQKLWF0aDVrX3Rhc2tsZXRfcmVzZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSAodm9pZCAqKWRhdGE7Ci0KLQlhdGg1a19yZXNldChzYywgc2MtPmN1cmNoYW4pOwotfQotCiAvKgogICogUGVyaW9kaWNhbGx5IHJlY2FsaWJyYXRlIHRoZSBQSFkgdG8gYWNjb3VudAogICogZm9yIHRlbXBlcmF0dXJlL2Vudmlyb25tZW50IGNoYW5nZXMuCkBAIC0yNzg1LDEwICsyODE0LDYgQEAKIAkvKiBPbmx5IGZ1bGwgY2FsaWJyYXRpb24gZm9yIG5vdyAqLwogCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX0ZVTEw7CiAKLQkvKiBTdG9wIHF1ZXVlcyBzbyB0aGF0IGNhbGlicmF0aW9uCi0JICogZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0eCAqLwotCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhzYy0+aHcpOwotCiAJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsICJjaGFubmVsICV1LyV4XG4iLAogCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoc2MtPmN1cmNoYW4tPmNlbnRlcl9mcmVxKSwKIAkJc2MtPmN1cmNoYW4tPmh3X3ZhbHVlKTsKQEAgLTI3OTksMTUgKzI4MjQsMjMgQEAKIAkJICogdG8gbG9hZCBuZXcgZ2FpbiB2YWx1ZXMuCiAJCSAqLwogCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAiY2FsaWJyYXRpb24sIHJlc2V0dGluZ1xuIik7Ci0JCWF0aDVrX3Jlc2V0KHNjLCBzYy0+Y3VyY2hhbik7CisJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHNjLT5odywgJnNjLT5yZXNldF93b3JrKTsKIAl9CiAJaWYgKGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoYWgsIHNjLT5jdXJjaGFuKSkKIAkJQVRINUtfRVJSKHNjLCAiY2FsaWJyYXRpb24gb2YgY2hhbm5lbCAldSBmYWlsZWRcbiIsCiAJCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCiAJCQkJc2MtPmN1cmNoYW4tPmNlbnRlcl9mcmVxKSk7CiAKLQkvKiBXYWtlIHF1ZXVlcyAqLwotCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhzYy0+aHcpOworCS8qIE5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGludGVycnVwdHMgcngvdHggcGF0aCB3aGlsZSBJL1EgY2FsaWJyYXRpb24KKwkgKiBkb2Vzbid0LiBXZSBzdG9wIHRoZSBxdWV1ZXMgc28gdGhhdCBjYWxpYnJhdGlvbiBkb2Vzbid0IGludGVyZmVyZQorCSAqIHdpdGggVFggYW5kIGRvbid0IHJ1biBpdCBhcyBvZnRlbiAqLworCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9uZikpIHsKKwkJYWgtPmFoX2NhbF9uZXh0X25mID0gamlmZmllcyArCisJCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfTkYpOworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoc2MtPmh3KTsKKwkJYXRoNWtfaHdfdXBkYXRlX25vaXNlX2Zsb29yKGFoKTsKKwkJaWVlZTgwMjExX3dha2VfcXVldWVzKHNjLT5odyk7CisJfQogCiAJYWgtPmFoX2NhbF9tYXNrICY9IH5BUjVLX0NBTElCUkFUSU9OX0ZVTEw7CiB9CkBAIC0yODk1LDYgKzI5MjgsOCBAQAogLyoKICAqIFJlc2V0IHRoZSBoYXJkd2FyZS4gIElmIGNoYW4gaXMgbm90IE5VTEwsIHRoZW4gYWxzbyBwYXVzZSByeC90eAogICogYW5kIGNoYW5nZSB0byB0aGUgZ2l2ZW4gY2hhbm5lbC4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBzYy0+bG9jay4KICAqLwogc3RhdGljIGludAogYXRoNWtfcmVzZXQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuKQpAQCAtMjkwNCw4ICsyOTM5LDExIEBACiAKIAlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAicmVzZXR0aW5nXG4iKTsKIAorCWF0aDVrX2h3X3NldF9pbXIoYWgsIDApOworCXN5bmNocm9uaXplX2lycShzYy0+cGRldi0+aXJxKTsKKwlzdG9wX3Rhc2tsZXRzKHNjKTsKKwogCWlmIChjaGFuKSB7Ci0JCWF0aDVrX2h3X3NldF9pbXIoYWgsIDApOwogCQlhdGg1a190eHFfY2xlYW51cChzYyk7CiAJCWF0aDVrX3J4X3N0b3Aoc2MpOwogCkBAIC0yOTI2LDYgKzI5NjQsMTAgQEAKIAogCWF0aDVrX2FuaV9pbml0KGFoLCBhaC0+YWhfc2MtPmFuaV9zdGF0ZS5hbmlfbW9kZSk7CiAKKwlhaC0+YWhfY2FsX25leHRfZnVsbCA9IGppZmZpZXM7CisJYWgtPmFoX2NhbF9uZXh0X2FuaSA9IGppZmZpZXM7CisJYWgtPmFoX2NhbF9uZXh0X25mID0gamlmZmllczsKKwogCS8qCiAJICogQ2hhbmdlIGNoYW5uZWxzIGFuZCB1cGRhdGUgdGhlIGgvdyByYXRlIG1hcCBpZiB3ZSdyZSBzd2l0Y2hpbmc7CiAJICogZS5nLiAxMWEgdG8gMTFiL2cuCkBAIC0yOTQ3LDYgKzI5ODksMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBhdGg1a19yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGg1a19zb2Z0YywKKwkJcmVzZXRfd29yayk7CisKKwltdXRleF9sb2NrKCZzYy0+bG9jayk7CisJYXRoNWtfcmVzZXQoc2MsIHNjLT5jdXJjaGFuKTsKKwltdXRleF91bmxvY2soJnNjLT5sb2NrKTsKK30KKwogc3RhdGljIGludCBhdGg1a19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlyZXR1cm4gYXRoNWtfaW5pdChody0+cHJpdik7CkBAIC0zMzYwLDcgKzM0MTIsNyBAQAogCiAJYXRoNWtfZGVidWdfZHVtcF9za2Ioc2MsIHNrYiwgIkJDICAiLCAxKTsKIAotCWF0aDVrX3R4YnVmX2ZyZWUoc2MsIHNjLT5iYnVmKTsKKwlhdGg1a190eGJ1Zl9mcmVlX3NrYihzYywgc2MtPmJidWYpOwogCXNjLT5iYnVmLT5za2IgPSBza2I7CiAJcmV0ID0gYXRoNWtfYmVhY29uX3NldHVwKHNjLCBzYy0+YmJ1Zik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5oCmluZGV4IDU2MjIxYmMuLmRjMTI0MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuaApAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiYXRoNWsuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtMTM2LDYgKzEzNyw3IEBACiAKIAl1bnNpZ25lZCBpbnQgbWliX2ludHI7CiAJdW5zaWduZWQgaW50IHJ4b3JuX2ludHI7CisJdW5zaWduZWQgaW50IHJ4ZW9sX2ludHI7CiB9OwogCiAjaWYgQ0hBTl9ERUJVRwpAQCAtMTg5LDcgKzE5MSw3IEBACiAJdW5zaWduZWQgaW50CQlsZWRfcGluLAkvKiBHUElPIHBpbiBmb3IgZHJpdmluZyBMRUQgKi8KIAkJCQlsZWRfb247CQkvKiBwaW4gc2V0dGluZyBmb3IgTEVEIG9uICovCiAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcmVzdHE7CQkvKiByZXNldCB0YXNrbGV0ICovCisJc3RydWN0IHdvcmtfc3RydWN0CXJlc2V0X3dvcms7CS8qIGRlZmVycmVkIGNoaXAgcmVzZXQgKi8KIAogCXVuc2lnbmVkIGludAkJcnhidWZzaXplOwkvKiByeCBzaXplIGJhc2VkIG9uIG10dSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJcnhidWY7CQkvKiByZWNlaXZlIGJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9jYXBzLmMKaW5kZXggNzRmMDA3MS4uYmVhZTUxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jCkBAIC0zNCw3ICszNCw2IEBACiB7CiAJdTE2IGVlX2hlYWRlcjsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJLyogQ2FwYWJpbGl0aWVzIHN0b3JlZCBpbiB0aGUgRUVQUk9NICovCiAJZWVfaGVhZGVyID0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tLmVlX2hlYWRlcjsKIApAQCAtMTIzLDggKzEyMiw2IEBACiAJCWVudW0gYXRoNWtfY2FwYWJpbGl0eV90eXBlIGNhcF90eXBlLAogCQl1MzIgY2FwYWJpbGl0eSwgdTMyICpyZXN1bHQpCiB7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCXN3aXRjaCAoY2FwX3R5cGUpIHsKIAljYXNlIEFSNUtfQ0FQX05VTV9UWFFVRVVFUzoKIAkJaWYgKHJlc3VsdCkgewpAQCAtMTczLDggKzE3MCw2IEBACiBpbnQgYXRoNWtfaHdfZW5hYmxlX3BzcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqYnNzaWQsCiAJCXUxNiBhc3NvY19pZCkKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CiAJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19TVEFfSUQxLAogCQkJQVI1S19TVEFfSUQxX05PX1BTUE9MTCB8IEFSNUtfU1RBX0lEMV9ERUZBVUxUX0FOVEVOTkEpOwpAQCAtMTg2LDggKzE4MSw2IEBACiAKIGludCBhdGg1a19od19kaXNhYmxlX3BzcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKIAkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwKIAkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgfCBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKaW5kZXggNmZiNWM1Zi4uNGNjY2MyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKQEAgLTIzOSw2ICsyMzksOSBAQAogCQkiVFNGXHRcdDB4JTAxNmxseFx0VFU6ICUwOHhcbiIsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpdHNmLCBUU0ZfVE9fVFUodHNmKSk7CiAKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOworCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwogfQogCkBAIC0yNzgsNyArMjgxLDggQEAKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZzYy0+cmVzdHEpOworCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsICJkZWJ1ZyBmaWxlIHRyaWdnZXJlZCByZXNldFxuIik7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPnJlc2V0X3dvcmspOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzA3LDcgKzMxMSw2IEBACiAJeyBBVEg1S19ERUJVR19EVU1QX1JYLAkiZHVtcHJ4IiwJInByaW50IHJlY2VpdmVkIHNrYiBjb250ZW50IiB9LAogCXsgQVRINUtfREVCVUdfRFVNUF9UWCwJImR1bXB0eCIsCSJwcmludCB0cmFuc21pdCBza2IgY29udGVudCIgfSwKIAl7IEFUSDVLX0RFQlVHX0RVTVBCQU5EUywgImR1bXBiYW5kcyIsCSJkdW1wIGJhbmRzIiB9LAotCXsgQVRINUtfREVCVUdfVFJBQ0UsCSJ0cmFjZSIsCSJ0cmFjZSBmdW5jdGlvbiBjYWxscyIgfSwKIAl7IEFUSDVLX0RFQlVHX0FOSSwJImFuaSIsCQkiYWRhcHRpdmUgbm9pc2UgaW1tdW5pdHkiIH0sCiAJeyBBVEg1S19ERUJVR19BTlksCSJhbGwiLAkJInNob3cgYWxsIGRlYnVnIGxldmVscyIgfSwKIH07CkBAIC0zMzQsNiArMzM3LDkgQEAKIAkJc2MtPmRlYnVnLmxldmVsID09IGRiZ19pbmZvW2ldLmxldmVsID8gJysnIDogJyAnLAogCQlkYmdfaW5mb1tpXS5sZXZlbCwgZGJnX2luZm9baV0uZGVzYyk7CiAKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOworCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwogfQogCkBAIC00MjYsNiArNDMyLDE2IEBACiAJCSJBUjVLX1BIWV9GQVNUX0FOVF9ESVZfRU5cdCVkXG4iLAogCQkodiAmIEFSNUtfUEhZX0ZBU1RfQU5UX0RJVl9FTikgIT0gMCk7CiAKKwl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoc2MtPmFoLCBBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzApOworCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJCQkiXG5BUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzBcdDB4JTA4eFxuIiwgdik7CisJdiA9IGF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgQVI1S19QSFlfQU5UX1NXSVRDSF9UQUJMRV8xKTsKKwlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCQkJIkFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMVx0MHglMDh4XG4iLCB2KTsKKworCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKKwkJbGVuID0gc2l6ZW9mKGJ1Zik7CisKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CiB9CiAKQEAgLTUzNSw2ICs1NTEsOSBAQAogCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJbVFggYWxsXHQlZF1cbiIsCiAJCQlzdC0+dHhfYWxsX2NvdW50KTsKIAorCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKKwkJbGVuID0gc2l6ZW9mKGJ1Zik7CisKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CiB9CiAKQEAgLTY3NCw2ICs2OTMsOSBAQAogCQkJQVRINUtfQU5JX0NDS19UUklHX0hJR0ggLSAoQVRINUtfUEhZRVJSX0NOVF9NQVggLQogCQkJYXRoNWtfaHdfcmVnX3JlYWQoc2MtPmFoLCBBUjVLX1BIWUVSUl9DTlQyKSkpOwogCisJaWYgKGxlbiA+IHNpemVvZihidWYpKQorCQlsZW4gPSBzaXplb2YoYnVmKTsKKwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtNzI5LDYgKzc1MSw2OSBAQAogfTsKIAogCisvKiBkZWJ1Z2ZzOiBxdWV1ZXMgZXRjICovCisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9xdWV1ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbNzAwXTsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworCXN0cnVjdCBhdGg1a190eHEgKnR4cTsKKwlzdHJ1Y3QgYXRoNWtfYnVmICpiZiwgKmJmMDsKKwlpbnQgaSwgbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCQkJImF2YWlsYWJsZSB0eGJ1ZmZlcnM6ICVkXG4iLCBzYy0+dHhidWZfbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNjLT50eHFzKTsgaSsrKSB7CisJCXR4cSA9ICZzYy0+dHhxc1tpXTsKKworCQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCQkJIiUwMmQ6ICVzc2V0dXBcbiIsIGksIHR4cS0+c2V0dXAgPyAiIiA6ICJub3QgIik7CisKKwkJaWYgKCF0eHEtPnNldHVwKQorCQkJY29udGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJmLCBiZjAsICZ0eHEtPnEsIGxpc3QpCisJCQluKys7CisJCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgIGxlbjogJWRcbiIsIG4pOworCX0KKworCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKKwkJbGVuID0gc2l6ZW9mKGJ1Zik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVfcXVldWUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzIwXTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3RybmNtcChidWYsICJzdGFydCIsIDUpID09IDApCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhzYy0+aHcpOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAic3RvcCIsIDQpID09IDApCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhzYy0+aHcpOworCisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcXVldWUgPSB7CisJLnJlYWQgPSByZWFkX2ZpbGVfcXVldWUsCisJLndyaXRlID0gd3JpdGVfZmlsZV9xdWV1ZSwKKwkub3BlbiA9IGF0aDVrX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKKwogLyogaW5pdCAqLwogCiB2b2lkCkBAIC03NzIsNiArODU3LDExIEBACiAJCQkJU19JV1VTUiB8IFNfSVJVU1IsCiAJCQkJc2MtPmRlYnVnLmRlYnVnZnNfcGh5ZGlyLCBzYywKIAkJCQkmZm9wc19hbmkpOworCisJc2MtPmRlYnVnLmRlYnVnZnNfcXVldWUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJxdWV1ZSIsCisJCQkJU19JV1VTUiB8IFNfSVJVU1IsCisJCQkJc2MtPmRlYnVnLmRlYnVnZnNfcGh5ZGlyLCBzYywKKwkJCQkmZm9wc19xdWV1ZSk7CiB9CiAKIHZvaWQKQEAgLTc5MCw2ICs4ODAsNyBAQAogCWRlYnVnZnNfcmVtb3ZlKHNjLT5kZWJ1Zy5kZWJ1Z2ZzX2FudGVubmEpOwogCWRlYnVnZnNfcmVtb3ZlKHNjLT5kZWJ1Zy5kZWJ1Z2ZzX2ZyYW1lZXJyb3JzKTsKIAlkZWJ1Z2ZzX3JlbW92ZShzYy0+ZGVidWcuZGVidWdmc19hbmkpOworCWRlYnVnZnNfcmVtb3ZlKHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3F1ZXVlKTsKIAlkZWJ1Z2ZzX3JlbW92ZShzYy0+ZGVidWcuZGVidWdmc19waHlkaXIpOwogfQogCkBAIC04NTIsNyArOTQzLDcgQEAKIAkJZHMsICh1bnNpZ25lZCBsb25nIGxvbmcpYmYtPmRhZGRyLAogCQlkcy0+ZHNfbGluaywgZHMtPmRzX2RhdGEsCiAJCXJkLT5yeF9jdGwucnhfY29udHJvbF8wLCByZC0+cnhfY3RsLnJ4X2NvbnRyb2xfMSwKLQkJcmQtPnUucnhfc3RhdC5yeF9zdGF0dXNfMCwgcmQtPnUucnhfc3RhdC5yeF9zdGF0dXNfMCwKKwkJcmQtPnJ4X3N0YXQucnhfc3RhdHVzXzAsIHJkLT5yeF9zdGF0LnJ4X3N0YXR1c18xLAogCQkhZG9uZSA/ICcgJyA6IChycy0+cnNfc3RhdHVzID09IDApID8gJyonIDogJyEnKTsKIH0KIApAQCAtODY3LDcgKzk1OCw3IEBACiAJaWYgKGxpa2VseSghKHNjLT5kZWJ1Zy5sZXZlbCAmIEFUSDVLX0RFQlVHX1JFU0VUKSkpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0RFQlVHICJyeCBxdWV1ZSAleCwgbGluayAlcFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAicnhkcCAleCwgcnhsaW5rICVwXG4iLAogCQlhdGg1a19od19nZXRfcnhkcChhaCksIHNjLT5yeGxpbmspOwogCiAJc3Bpbl9sb2NrX2JoKCZzYy0+cnhidWZsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKaW5kZXggZGRkNWIzYS4uNjA2YWU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKQEAgLTc3LDYgKzc3LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVidWdmc19hbnRlbm5hOwogCXN0cnVjdCBkZW50cnkJCSpkZWJ1Z2ZzX2ZyYW1lZXJyb3JzOwogCXN0cnVjdCBkZW50cnkJCSpkZWJ1Z2ZzX2FuaTsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVidWdmc19xdWV1ZTsKIH07CiAKIC8qKgpAQCAtMTE1LDE4ICsxMTYsMTIgQEAKIAlBVEg1S19ERUJVR19EVU1QX1JYCT0gMHgwMDAwMDEwMCwKIAlBVEg1S19ERUJVR19EVU1QX1RYCT0gMHgwMDAwMDIwMCwKIAlBVEg1S19ERUJVR19EVU1QQkFORFMJPSAweDAwMDAwNDAwLAotCUFUSDVLX0RFQlVHX1RSQUNFCT0gMHgwMDAwMTAwMCwKIAlBVEg1S19ERUJVR19BTkkJCT0gMHgwMDAwMjAwMCwKIAlBVEg1S19ERUJVR19BTlkJCT0gMHhmZmZmZmZmZgogfTsKIAogI2lmZGVmIENPTkZJR19BVEg1S19ERUJVRwogCi0jZGVmaW5lIEFUSDVLX1RSQUNFKF9zYykgZG8geyBcCi0JaWYgKHVubGlrZWx5KChfc2MpLT5kZWJ1Zy5sZXZlbCAmIEFUSDVLX0RFQlVHX1RSQUNFKSkgXAotCQlwcmludGsoS0VSTl9ERUJVRyAiYXRoNWsgdHJhY2UgJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7IFwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIEFUSDVLX0RCRyhfc2MsIF9tLCBfZm10LCAuLi4pIGRvIHsgXAogCWlmICh1bmxpa2VseSgoX3NjKS0+ZGVidWcubGV2ZWwgJiAoX20pICYmIG5ldF9yYXRlbGltaXQoKSkpIFwKIAkJQVRINUtfUFJJTlRLKF9zYywgS0VSTl9ERUJVRywgIiglczolZCk6ICIgX2ZtdCwgXApAQCAtMTY4LDggKzE2Myw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi0jZGVmaW5lIEFUSDVLX1RSQUNFKF9zYykgdHlwZWNoZWNrKHN0cnVjdCBhdGg1a19zb2Z0YyAqLCAoX3NjKSkKLQogc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQogQVRINUtfREJHKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHVuc2lnbmVkIGludCBtLCBjb25zdCBjaGFyICpmbXQsIC4uLikge30KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKaW5kZXggN2Q3YjY0Ni4uNDMyNDQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCkBAIC05MSwxNCArOTEsMTMgQEAKIAl0eF9jdGwtPnR4X2NvbnRyb2xfMSA9IHBrdF9sZW4gJiBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOOwogCiAJLyoKLQkgKiBWZXJpZnkgYW5kIHNldCBoZWFkZXIgbGVuZ3RoCi0JICogWFhYOiBJIG9ubHkgZm91bmQgdGhhdCBvbiA1MjEwIGNvZGUsIGRvZXMgaXQgd29yayBvbiA1MjExID8KKwkgKiBWZXJpZnkgYW5kIHNldCBoZWFkZXIgbGVuZ3RoIChvbmx5IDUyMTApCiAJICovCiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCWlmIChoZHJfbGVuICYgfkFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU4pCisJCWlmIChoZHJfbGVuICYgfkFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU5fNTIxMCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQotCQkJQVI1S19SRUdfU00oaGRyX2xlbiwgQVI1S18yV19UWF9ERVNDX0NUTDBfSEVBREVSX0xFTik7CisJCQlBUjVLX1JFR19TTShoZHJfbGVuLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOXzUyMTApOwogCX0KIAogCS8qRGlmZmVyZW5jZXMgYmV0d2VlbiA1MjEwLTUyMTEqLwpAQCAtMTEwLDExICsxMDksMTEgQEAKIAkJY2FzZSBBUjVLX1BLVF9UWVBFX1BJRlM6CiAJCQlmcmFtZV90eXBlID0gQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlM7CiAJCWRlZmF1bHQ6Ci0JCQlmcmFtZV90eXBlID0gdHlwZSAvKjw8IDIgPyovOworCQkJZnJhbWVfdHlwZSA9IHR5cGU7CiAJCX0KIAogCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQotCQlBUjVLX1JFR19TTShmcmFtZV90eXBlLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9UWVBFKSB8CisJCUFSNUtfUkVHX1NNKGZyYW1lX3R5cGUsIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX1RZUEVfNTIxMCkgfAogCQlBUjVLX1JFR19TTSh0eF9yYXRlMCwgQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFKTsKIAogCX0gZWxzZSB7CkBAIC0xMjMsMjEgKzEyMiwzMCBAQAogCQkJQVI1S19SRUdfU00oYW50ZW5uYV9tb2RlLAogCQkJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVQpOwogCQl0eF9jdGwtPnR4X2NvbnRyb2xfMSB8PQotCQkJQVI1S19SRUdfU00odHlwZSwgQVI1S18yV19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRSk7CisJCQlBUjVLX1JFR19TTSh0eXBlLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFXzUyMTEpOwogCX0KKwogI2RlZmluZSBfVFhfRkxBR1MoX2MsIF9mbGFnKQkJCQkJXAogCWlmIChmbGFncyAmIEFSNUtfVFhERVNDXyMjX2ZsYWcpIHsJCQlcCiAJCXR4X2N0bC0+dHhfY29udHJvbF8jI19jIHw9CQkJXAogCQkJQVI1S18yV19UWF9ERVNDX0NUTCMjX2MjI18jI19mbGFnOwlcCiAJfQotCisjZGVmaW5lIF9UWF9GTEFHU181MjExKF9jLCBfZmxhZykJCQkJCVwKKwlpZiAoZmxhZ3MgJiBBUjVLX1RYREVTQ18jI19mbGFnKSB7CQkJCVwKKwkJdHhfY3RsLT50eF9jb250cm9sXyMjX2MgfD0JCQkJXAorCQkJQVI1S18yV19UWF9ERVNDX0NUTCMjX2MjI18jI19mbGFnIyNfNTIxMTsJXAorCX0KIAlfVFhfRkxBR1MoMCwgQ0xSRE1BU0spOwotCV9UWF9GTEFHUygwLCBWRU9MKTsKIAlfVFhfRkxBR1MoMCwgSU5UUkVRKTsKIAlfVFhfRkxBR1MoMCwgUlRTRU5BKTsKLQlfVFhfRkxBR1MoMSwgTk9BQ0spOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExKSB7CisJCV9UWF9GTEFHU181MjExKDAsIFZFT0wpOworCQlfVFhfRkxBR1NfNTIxMSgxLCBOT0FDSyk7CisJfQogCiAjdW5kZWYgX1RYX0ZMQUdTCisjdW5kZWYgX1RYX0ZMQUdTXzUyMTEKIAogCS8qCiAJICogV0VQIGNyYXAKQEAgLTE0Nyw3ICsxNTUsNyBAQAogCQkJQVI1S18yV19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQ7CiAJCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9CiAJCQlBUjVLX1JFR19TTShrZXlfaW5kZXgsCi0JCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWCk7CisJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNfS0VZX0lEWCk7CiAJfQogCiAJLyoKQEAgLTE1Niw3ICsxNjQsNyBAQAogCWlmICgoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApICYmCiAJCQkoZmxhZ3MgJiAoQVI1S19UWERFU0NfUlRTRU5BIHwgQVI1S19UWERFU0NfQ1RTRU5BKSkpCiAJCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9IHJ0c2N0c19kdXJhdGlvbiAmCi0JCQkJQVI1S18yV19UWF9ERVNDX0NUTDFfUlRTX0RVUkFUSU9OOworCQkJCUFSNUtfMldfVFhfREVTQ19DVEwxX1JUU19EVVJBVElPTl81MjEwOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzYsNyArMTg0LDYgQEAKIAlzdHJ1Y3QgYXRoNWtfaHdfNHdfdHhfY3RsICp0eF9jdGw7CiAJdW5zaWduZWQgaW50IGZyYW1lX2xlbjsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJdHhfY3RsID0gJmRlc2MtPnVkLmRzX3R4NTIxMi50eF9jdGw7CiAKIAkvKgpAQCAtMjU2LDcgKzI2Myw3IEBACiAJaWYgKGtleV9pbmRleCAhPSBBUjVLX1RYS0VZSVhfSU5WQUxJRCkgewogCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9FTkNSWVBUX0tFWV9WQUxJRDsKIAkJdHhfY3RsLT50eF9jb250cm9sXzEgfD0gQVI1S19SRUdfU00oa2V5X2luZGV4LAotCQkJCUFSNUtfNFdfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYKTsKKwkJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JRFgpOwogCX0KIAogCS8qCkBAIC0yNzgsMTMgKzI4NSwxNyBAQAogLyoKICAqIEluaXRpYWxpemUgYSA0LXdvcmQgbXVsdGkgcmF0ZSByZXRyeSB0eCBjb250cm9sIGRlc2NyaXB0b3Igb24gNTIxMgogICovCi1zdGF0aWMgaW50CitpbnQKIGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAogCXVuc2lnbmVkIGludCB0eF9yYXRlMSwgdV9pbnQgdHhfdHJpZXMxLCB1X2ludCB0eF9yYXRlMiwKIAl1X2ludCB0eF90cmllczIsIHVuc2lnbmVkIGludCB0eF9yYXRlMywgdV9pbnQgdHhfdHJpZXMzKQogewogCXN0cnVjdCBhdGg1a19od180d190eF9jdGwgKnR4X2N0bDsKIAorCS8qIG5vIG1yciBzdXBwb3J0IGZvciBjYXJkcyBvbGRlciB0aGFuIDUyMTIgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPCBBUjVLX0FSNTIxMikKKwkJcmV0dXJuIDA7CisKIAkvKgogCSAqIFJhdGVzIGNhbiBiZSAwIGFzIGxvbmcgYXMgdGhlIHJldHJ5IGNvdW50IGlzIDAgdG9vLgogCSAqIEEgemVybyByYXRlIGFuZCBub256ZXJvIHJldHJ5IGNvdW50IHdpbGwgcHV0IHRoZSBIVyBpbnRvIGEgbW9kZSB3aGVyZQpAQCAtMzI0LDE1ICszMzUsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBubyBtcnIgc3VwcG9ydCBmb3IgY2FyZHMgb2xkZXIgdGhhbiA1MjEyICovCi1zdGF0aWMgaW50Ci1hdGg1a19od19zZXR1cF9ub19tcnIoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JdW5zaWduZWQgaW50IHR4X3JhdGUxLCB1X2ludCB0eF90cmllczEsIHVfaW50IHR4X3JhdGUyLAotCXVfaW50IHR4X3RyaWVzMiwgdW5zaWduZWQgaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBQcm9jY2VzcyB0aGUgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCiAgKi8KQEAgLTM0Miw4ICszNDQsNiBAQAogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCiAJdHhfY3RsID0gJmRlc2MtPnVkLmRzX3R4NTIxMC50eF9jdGw7CiAJdHhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3R4NTIxMC50eF9zdGF0OwogCkBAIC0zOTYsOCArMzk2LDYgQEAKIAlzdHJ1Y3QgYXRoNWtfaHdfNHdfdHhfY3RsICp0eF9jdGw7CiAJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cyAqdHhfc3RhdHVzOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCXR4X2N0bCA9ICZkZXNjLT51ZC5kc190eDUyMTIudHhfY3RsOwogCXR4X3N0YXR1cyA9ICZkZXNjLT51ZC5kc190eDUyMTIudHhfc3RhdDsKIApAQCAtNDE5LDExICs0MTcsMTEgQEAKIAl0cy0+dHNfcnNzaSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCiAJCUFSNUtfREVTQ19UWF9TVEFUVVMxX0FDS19TSUdfU1RSRU5HVEgpOwogCXRzLT50c19hbnRlbm5hID0gKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJgotCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkEpID8gMiA6IDE7CisJCUFSNUtfREVTQ19UWF9TVEFUVVMxX1hNSVRfQU5URU5OQV81MjEyKSA/IDIgOiAxOwogCXRzLT50c19zdGF0dXMgPSAwOwogCiAJdHMtPnRzX2ZpbmFsX2lkeCA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCi0JCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9GSU5BTF9UU19JTkRFWCk7CisJCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9GSU5BTF9UU19JWF81MjEyKTsKIAogCS8qIFRoZSBsb25ncmV0cnkgY291bnRlciBoYXMgdGhlIG51bWJlciBvZiB1bi1hY2tlZCByZXRyaWVzCiAJICogZm9yIHRoZSBmaW5hbCByYXRlLiBUbyBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzCkBAIC00ODUsMTIgKzQ4MywxMSBAQAogLyoKICAqIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0dXBfcnhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKLQkJCXUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgYXRoNWtfaHdfc2V0dXBfcnhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCSAgIHUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bCAqcnhfY3RsOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlyeF9jdGwgPSAmZGVzYy0+dWQuZHNfcngucnhfY3RsOwogCiAJLyoKQEAgLTUwMiwxMCArNDk5LDExIEBACiAJKi8KIAltZW1zZXQoJmRlc2MtPnVkLmRzX3J4LCAwLCBzaXplb2Yoc3RydWN0IGF0aDVrX2h3X2FsbF9yeF9kZXNjKSk7CiAKKwlpZiAodW5saWtlbHkoc2l6ZSAmIH5BUjVLX0RFU0NfUlhfQ1RMMV9CVUZfTEVOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBTZXR1cCBkZXNjcmlwdG9yICovCiAJcnhfY3RsLT5yeF9jb250cm9sXzEgPSBzaXplICYgQVI1S19ERVNDX1JYX0NUTDFfQlVGX0xFTjsKLQlpZiAodW5saWtlbHkocnhfY3RsLT5yeF9jb250cm9sXzEgIT0gc2l6ZSkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGZsYWdzICYgQVI1S19SWERFU0NfSU5UUkVRKQogCQlyeF9jdGwtPnJ4X2NvbnRyb2xfMSB8PSBBUjVLX0RFU0NfUlhfQ1RMMV9JTlRSRVE7CkBAIC01MjEsMTMgKzUxOSwxNSBAQAogewogCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgKnJ4X3N0YXR1czsKIAotCXJ4X3N0YXR1cyA9ICZkZXNjLT51ZC5kc19yeC51LnJ4X3N0YXQ7CisJcnhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3J4LnJ4X3N0YXQ7CiAKIAkvKiBObyBmcmFtZSByZWNlaXZlZCAvIG5vdCByZWFkeSAqLwogCWlmICh1bmxpa2VseSghKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgotCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRE9ORSkpKQorCQkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ET05FKSkpCiAJCXJldHVybiAtRUlOUFJPR1JFU1M7CiAKKwltZW1zZXQocnMsIDAsIHNpemVvZihzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzKSk7CisKIAkvKgogCSAqIEZyYW1lIHJlY2VpdmUgc3RhdHVzCiAJICovCkBAIC01MzcsMTUgKzUzNywyMyBAQAogCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMKTsKIAlycy0+cnNfcmF0ZSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCiAJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFKTsKLQlycy0+cnNfYW50ZW5uYSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCi0JCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BKTsKIAlycy0+cnNfbW9yZSA9ICEhKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgogCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX01PUkUpOwotCS8qIFRPRE86IHRoaXMgdGltZXN0YW1wIGlzIDEzIGJpdCwgbGF0ZXIgb24gd2UgYXNzdW1lIDE1IGJpdCAqLworCS8qIFRPRE86IHRoaXMgdGltZXN0YW1wIGlzIDEzIGJpdCwgbGF0ZXIgb24gd2UgYXNzdW1lIDE1IGJpdCEKKwkgKiBhbHNvIHRoZSBIQUwgY29kZSBmb3IgNTIxMCBzYXlzIHRoZSB0aW1lc3RhbXAgaXMgYml0cyBbMTAuLjIyXSBvZiB0aGUKKwkgKiBUU0YsIGFuZCBleHRlbmRzIHRoZSB0aW1lc3RhbXAgaGVyZSB0byAxNSBiaXQuCisJICogd2UgbmVlZCB0byBjaGVjayBvbiA1MjEwLi4uCisJICovCiAJcnMtPnJzX3RzdGFtcCA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEsCiAJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVApOwotCXJzLT5yc19zdGF0dXMgPSAwOwotCXJzLT5yc19waHllcnIgPSAwOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExKQorCQlycy0+cnNfYW50ZW5uYSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCisJCQkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVF81MjExKTsKKwllbHNlCisJCXJzLT5yc19hbnRlbm5hID0gKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRfNTIxMCkKKwkJCQk/IDIgOiAxOwogCiAJLyoKIAkgKiBLZXkgdGFibGUgc3RhdHVzCkBAIC01NjAsMTkgKzU2OCwyMSBAQAogCSAqIFJlY2VpdmUvZGVzY3JpcHRvciBlcnJvcnMKIAkgKi8KIAlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKLQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spKSB7CisJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spKSB7CiAJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKIAkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUikKIAkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9DUkM7CiAKLQkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgotCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRklGT19PVkVSUlVOKQorCQkvKiBvbmx5IG9uIDUyMTAgKi8KKwkJaWYgKChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgJiYKKwkJICAgIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZJRk9fT1ZFUlJVTl81MjEwKSkKIAkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9GSUZPOwogCiAJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKIAkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUikgewogCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX1BIWTsKLQkJCXJzLT5yc19waHllcnIgfD0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKKwkJCXJzLT5yc19waHllcnIgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18xLAogCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKTsKIAkJfQogCkBAIC01ODgsMjIgKzU5OCwyMCBAQAogICogUHJvY2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKICAqLwogc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTJfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKKwkJCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQkJCXN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQogewogCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgKnJ4X3N0YXR1czsKLQlzdHJ1Y3QgYXRoNWtfaHdfcnhfZXJyb3IgKnJ4X2VycjsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0Jcnhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3J4LnUucnhfc3RhdDsKLQotCS8qIE92ZXJsYXkgb24gZXJyb3IgKi8KLQlyeF9lcnIgPSAmZGVzYy0+dWQuZHNfcngudS5yeF9lcnI7CisJcnhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3J4LnJ4X3N0YXQ7CiAKIAkvKiBObyBmcmFtZSByZWNlaXZlZCAvIG5vdCByZWFkeSAqLwogCWlmICh1bmxpa2VseSghKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgotCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRE9ORSkpKQorCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRE9ORSkpKQogCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCisJbWVtc2V0KHJzLCAwLCBzaXplb2Yoc3RydWN0IGF0aDVrX3J4X3N0YXR1cykpOworCiAJLyoKIAkgKiBGcmFtZSByZWNlaXZlIHN0YXR1cwogCSAqLwpAQCAtNjE5LDE1ICs2MjcsMTMgQEAKIAkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9NT1JFKTsKIAlycy0+cnNfdHN0YW1wID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKIAkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUCk7Ci0JcnMtPnJzX3N0YXR1cyA9IDA7Ci0JcnMtPnJzX3BoeWVyciA9IDA7CiAKIAkvKgogCSAqIEtleSB0YWJsZSBzdGF0dXMKIAkgKi8KIAlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElEKQogCQlycy0+cnNfa2V5aXggPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18xLAotCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYKTsKKwkJCQkJICAgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVgpOwogCWVsc2UKIAkJcnMtPnJzX2tleWl4ID0gQVI1S19SWEtFWUlYX0lOVkFMSUQ7CiAKQEAgLTYzNSw3ICs2NDEsNyBAQAogCSAqIFJlY2VpdmUvZGVzY3JpcHRvciBlcnJvcnMKIAkgKi8KIAlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKLQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spKSB7CisJICAgIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSykpIHsKIAkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgogCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SKQogCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0NSQzsKQEAgLTY0Myw5ICs2NDksMTAgQEAKIAkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgogCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKSB7CiAJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfUEhZOwotCQkJcnMtPnJzX3BoeWVyciB8PSBBUjVLX1JFR19NUyhyeF9lcnItPnJ4X2Vycm9yXzEsCi0JCQkJCSAgIEFSNUtfUlhfREVTQ19FUlJPUjFfUEhZX0VSUk9SX0NPREUpOwotCQkJYXRoNWtfYW5pX3BoeV9lcnJvcl9yZXBvcnQoYWgsIHJzLT5yc19waHllcnIpOworCQkJcnMtPnJzX3BoeWVyciA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEsCisJCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1JfQ09ERSk7CisJCQlpZiAoIWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2hhc19waHllcnJfY291bnRlcnMpCisJCQkJYXRoNWtfYW5pX3BoeV9lcnJvcl9yZXBvcnQoYWgsIHJzLT5yc19waHllcnIpOwogCQl9CiAKIAkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgpAQCAtNjU2LDcgKzY2Myw2IEBACiAJCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9NSUNfRVJST1IpCiAJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfTUlDOwogCX0KLQogCXJldHVybiAwOwogfQogCkBAIC02NjUsMjkgKzY3MSwxNSBAQAogICovCiBpbnQgYXRoNWtfaHdfaW5pdF9kZXNjX2Z1bmN0aW9ucyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCi0JaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwICYmCi0JCWFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjExICYmCi0JCWFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEyKQotCQkJcmV0dXJuIC1FTk9UU1VQUDsKLQogCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQlhaC0+YWhfc2V0dXBfcnhfZGVzYyA9IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2M7CiAJCWFoLT5haF9zZXR1cF90eF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfNHdvcmRfdHhfZGVzYzsKLQkJYWgtPmFoX3NldHVwX21ycl90eF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2M7CiAJCWFoLT5haF9wcm9jX3R4X2Rlc2MgPSBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1czsKLQl9IGVsc2UgewotCQlhaC0+YWhfc2V0dXBfcnhfZGVzYyA9IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2M7Ci0JCWFoLT5haF9zZXR1cF90eF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYzsKLQkJYWgtPmFoX3NldHVwX21ycl90eF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfbm9fbXJyOwotCQlhaC0+YWhfcHJvY190eF9kZXNjID0gYXRoNWtfaHdfcHJvY18yd29yZF90eF9zdGF0dXM7Ci0JfQotCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQogCQlhaC0+YWhfcHJvY19yeF9kZXNjID0gYXRoNWtfaHdfcHJvY181MjEyX3J4X3N0YXR1czsKLQllbHNlIGlmIChhaC0+YWhfdmVyc2lvbiA8PSBBUjVLX0FSNTIxMSkKKwl9IGVsc2UgaWYgKGFoLT5haF92ZXJzaW9uIDw9IEFSNUtfQVI1MjExKSB7CisJCWFoLT5haF9zZXR1cF90eF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYzsKKwkJYWgtPmFoX3Byb2NfdHhfZGVzYyA9IGF0aDVrX2h3X3Byb2NfMndvcmRfdHhfc3RhdHVzOwogCQlhaC0+YWhfcHJvY19yeF9kZXNjID0gYXRoNWtfaHdfcHJvY181MjEwX3J4X3N0YXR1czsKLQorCX0gZWxzZQorCQlyZXR1cm4gLUVOT1RTVVBQOwogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaAppbmRleCA2NDUzOGZiLi5iMmFkYjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKQEAgLTE3LDI4ICsxNywyNCBAQAogICovCiAKIC8qCi0gKiBJbnRlcm5hbCBSWC9UWCBkZXNjcmlwdG9yIHN0cnVjdHVyZXMKLSAqIChyWDogcmVzZXJ2ZWQgZmllbGRzIHBvc3NpYmlseSB1c2VkIGJ5IGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgYXI1ayBjaGlwc2V0KQorICogUlgvVFggZGVzY3JpcHRvciBzdHJ1Y3R1cmVzCiAgKi8KIAogLyoKLSAqIGNvbW1vbiBoYXJkd2FyZSBSWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIENvbW1vbiBoYXJkd2FyZSBSWCBjb250cm9sIGRlc2NyaXB0b3IKICAqLwogc3RydWN0IGF0aDVrX2h3X3J4X2N0bCB7CiAJdTMyCXJ4X2NvbnRyb2xfMDsgLyogUlggY29udHJvbCB3b3JkIDAgKi8KIAl1MzIJcnhfY29udHJvbF8xOyAvKiBSWCBjb250cm9sIHdvcmQgMSAqLwogfSBfX3BhY2tlZDsKIAotLyogUlggY29udHJvbCB3b3JkIDAgZmllbGQvc2ZsYWdzICovCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwwCQkJMHgwMDAwMDAwMAotCiAvKiBSWCBjb250cm9sIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KLSNkZWZpbmUgQVI1S19ERVNDX1JYX0NUTDFfQlVGX0xFTgkJMHgwMDAwMGZmZgotI2RlZmluZSBBUjVLX0RFU0NfUlhfQ1RMMV9JTlRSRVEJCTB4MDAwMDIwMDAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX0NUTDFfQlVGX0xFTgkJMHgwMDAwMGZmZiAvKiBkYXRhIGJ1ZmZlciBsZW5ndGggKi8KKyNkZWZpbmUgQVI1S19ERVNDX1JYX0NUTDFfSU5UUkVRCQkweDAwMDAyMDAwIC8qIFJYIGludGVycnVwdCByZXF1ZXN0ICovCiAKIC8qCi0gKiBjb21tb24gaGFyZHdhcmUgUlggc3RhdHVzIGRlc2NyaXB0b3IKLSAqIDUyMTAvMTEgYW5kIDUyMTIgZGlmZmVyIG9ubHkgaW4gdGhlIGZsYWdzIGRlZmluZWQgYmVsb3cKKyAqIENvbW1vbiBoYXJkd2FyZSBSWCBzdGF0dXMgZGVzY3JpcHRvcgorICogNTIxMCwgNTIxMSBhbmQgNTIxMiBkaWZmZXIgb25seSBpbiB0aGUgZmllbGRzIGFuZCBmbGFncyBkZWZpbmVkIGJlbG93CiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgewogCXUzMglyeF9zdGF0dXNfMDsgLyogUlggc3RhdHVzIHdvcmQgMCAqLwpAQCAtNDcsODEgKzQzLDY5IEBACiAKIC8qIDUyMTAvNTIxMSAqLwogLyogUlggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9EQVRBX0xFTgkJMHgwMDAwMGZmZgotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX01PUkUJCQkweDAwMDAxMDAwCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFCQkweDAwMDc4MDAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfREFUQV9MRU4JCTB4MDAwMDBmZmYgLyogUlggZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9NT1JFCQkJMHgwMDAwMTAwMCAvKiBtb3JlIGRlc2MgZm9yIHRoaXMgZnJhbWUgKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVF81MjEwCTB4MDAwMDQwMDAgLyogWzUyMTBdIHJlY2VpdmUgb24gYW50IDEgKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEUJCTB4MDAwNzgwMDAgLyogcmVjZXB0aW9uIHJhdGUgKi8KICNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEVfUwkxNQotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMCTB4MDdmODAwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTAkweDA3ZjgwMDAwIC8qIHJzc2kgKi8KICNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTF9TCTE5Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BCTB4MzgwMDAwMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkFfUwkyNworI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5UXzUyMTEJMHgzODAwMDAwMCAvKiBbNTIxMV0gcmVjZWl2ZSBhbnRlbm5hICovCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRfNTIxMV9TCTI3CiAKIC8qIFJYIHN0YXR1cyB3b3JkIDEgZmllbGRzL2ZsYWdzICovCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRE9ORQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9GUkFNRV9SRUNFSVZFX09LCTB4MDAwMDAwMDIKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9DUkNfRVJST1IJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9GSUZPX09WRVJSVU4JCTB4MDAwMDAwMDgKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ERUNSWVBUX0NSQ19FUlJPUgkweDAwMDAwMDEwCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SCQkweDAwMDAwMGUwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRE9ORQkJCTB4MDAwMDAwMDEgLyogZGVzY3JpcHRvciBjb21wbGV0ZSAqLworI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0sJMHgwMDAwMDAwMiAvKiByZWNlcHRpb24gc3VjY2VzcyAqLworI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUgkJMHgwMDAwMDAwNCAvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9GSUZPX09WRVJSVU5fNTIxMAkweDAwMDAwMDA4IC8qIFs1MjEwXSBGSUZPIG92ZXJydW4gKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ERUNSWVBUX0NSQ19FUlJPUgkweDAwMDAwMDEwIC8qIGRlY3lwdGlvbiBDUkMgZmFpbHVyZSAqLworI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUgkJMHgwMDAwMDBlMCAvKiBQSFkgZXJyb3IgKi8KICNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1JfUwkJNQotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRAkweDAwMDAwMTAwCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDA3ZTAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElECTB4MDAwMDAxMDAgLyoga2V5IGluZGV4IHZhbGlkICovCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDA3ZTAwIC8qIGRlY3lwdGlvbiBrZXkgaW5kZXggKi8KICNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVhfUwkJOQotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QCTB4MGZmZjgwMDAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUAkweDBmZmY4MDAwIC8qIDEzIGJpdCBvZiBUU0YgKi8KICNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUF9TCTE1Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0NBQ0hFX01JU1MJMHgxMDAwMDAwMAorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0tFWV9DQUNIRV9NSVNTCTB4MTAwMDAwMDAgLyoga2V5IGNhY2hlIG1pc3MgKi8KIAogLyogNTIxMiAqLwogLyogUlggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9EQVRBX0xFTgkJMHgwMDAwMGZmZgotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX01PUkUJCQkweDAwMDAxMDAwCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfREVDT01QX0NSQ19FUlJPUgkweDAwMDAyMDAwCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFCQkweDAwMGY4MDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfREFUQV9MRU4JCTB4MDAwMDBmZmYgLyogUlggZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9NT1JFCQkJMHgwMDAwMTAwMCAvKiBtb3JlIGRlc2MgZm9yIHRoaXMgZnJhbWUgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9ERUNPTVBfQ1JDX0VSUk9SCTB4MDAwMDIwMDAgLyogZGVjb21wcmVzc2lvbiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEUJCTB4MDAwZjgwMDAgLyogcmVjZXB0aW9uIHJhdGUgKi8KICNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEVfUwkxNQotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMCTB4MGZmMDAwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTAkweDBmZjAwMDAwIC8qIHJzc2kgKi8KICNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTF9TCTIwCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkEJMHhmMDAwMDAwMCAvKiByZWNlaXZlIGFudGVubmEgKi8KICNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkFfUwkyOAogCiAvKiBSWCBzdGF0dXMgd29yZCAxIGZpZWxkcy9mbGFncyAqLwotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0RPTkUJCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSwkweDAwMDAwMDAyCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IJMHgwMDAwMDAwOAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUgkJMHgwMDAwMDAxMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX01JQ19FUlJPUgkJMHgwMDAwMDAyMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRAkweDAwMDAwMTAwCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDBmZTAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRE9ORQkJCTB4MDAwMDAwMDEgLyogZGVzY3JpcHRvciBjb21wbGV0ZSAqLworI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0sJMHgwMDAwMDAwMiAvKiBmcmFtZSByZWNlcHRpb24gc3VjY2VzcyAqLworI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUgkJMHgwMDAwMDAwNCAvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ERUNSWVBUX0NSQ19FUlJPUgkweDAwMDAwMDA4IC8qIGRlY3J5cHRpb24gQ1JDIGZhaWx1cmUgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1IJCTB4MDAwMDAwMTAgLyogUEhZIGVycm9yICovCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfTUlDX0VSUk9SCQkweDAwMDAwMDIwIC8qIE1JQyBkZWNyeXB0IGVycm9yICovCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElECTB4MDAwMDAxMDAgLyoga2V5IGluZGV4IHZhbGlkICovCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDBmZTAwIC8qIGRlY3J5cHRpb24ga2V5IGluZGV4ICovCiAjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1MJCTkKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUAkweDdmZmYwMDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVAJMHg3ZmZmMDAwMCAvKiBmaXJzdCAxNWJpdCBvZiB0aGUgVFNGICovCiAjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVBfUwkxNgotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9DQUNIRV9NSVNTCTB4ODAwMDAwMDAKLQotLyoKLSAqIGNvbW1vbiBoYXJkd2FyZSBSWCBlcnJvciBkZXNjcmlwdG9yCi0gKi8KLXN0cnVjdCBhdGg1a19od19yeF9lcnJvciB7Ci0JdTMyCXJ4X2Vycm9yXzA7IC8qIFJYIHN0YXR1cyB3b3JkIDAgKi8KLQl1MzIJcnhfZXJyb3JfMTsgLyogUlggc3RhdHVzIHdvcmQgMSAqLwotfSBfX3BhY2tlZDsKLQotLyogUlggZXJyb3Igd29yZCAwIGZpZWxkcy9mbGFncyAqLwotI2RlZmluZSBBUjVLX1JYX0RFU0NfRVJST1IwCQkJMHgwMDAwMDAwMAotCi0vKiBSWCBlcnJvciB3b3JkIDEgZmllbGRzL2ZsYWdzICovCi0jZGVmaW5lIEFSNUtfUlhfREVTQ19FUlJPUjFfUEhZX0VSUk9SX0NPREUJMHgwMDAwZmYwMAotI2RlZmluZSBBUjVLX1JYX0RFU0NfRVJST1IxX1BIWV9FUlJPUl9DT0RFX1MJOAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9DQUNIRV9NSVNTCTB4ODAwMDAwMDAgLyoga2V5IGNhY2hlIG1pc3MgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1JfQ09ERQkweDAwMDBmZjAwIC8qIHBoeSBlcnJvciBjb2RlIG92ZXJsYXlzIGtleSBpbmRleCBhbmQgdmFsaWQgZmllbGRzICovCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SX0NPREVfUwk4CiAKIC8qKgogICogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSAtIFBIWSBFcnJvciBjb2RlcwogICovCiBlbnVtIGF0aDVrX3BoeV9lcnJvcl9jb2RlIHsKLQlBUjVLX1JYX1BIWV9FUlJPUl9VTkRFUlJVTgkJPSAwLAkvKiBUcmFuc21pdCB1bmRlcnJ1biAqLworCUFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOCQk9IDAsCS8qIFRyYW5zbWl0IHVuZGVycnVuLCBbNTIxMF0gTm8gZXJyb3IgKi8KIAlBUjVLX1JYX1BIWV9FUlJPUl9USU1JTkcJCT0gMSwJLyogVGltaW5nIGVycm9yICovCiAJQVI1S19SWF9QSFlfRVJST1JfUEFSSVRZCQk9IDIsCS8qIElsbGVnYWwgcGFyaXR5ICovCiAJQVI1S19SWF9QSFlfRVJST1JfUkFURQkJCT0gMywJLyogSWxsZWdhbCByYXRlICovCiAJQVI1S19SWF9QSFlfRVJST1JfTEVOR1RICQk9IDQsCS8qIElsbGVnYWwgbGVuZ3RoICovCi0JQVI1S19SWF9QSFlfRVJST1JfUkFEQVIJCQk9IDUsCS8qIFJhZGFyIGRldGVjdCAqLworCUFSNUtfUlhfUEhZX0VSUk9SX1JBREFSCQkJPSA1LAkvKiBSYWRhciBkZXRlY3QsIFs1MjEwXSA2NCBRQU0gcmF0ZSAqLwogCUFSNUtfUlhfUEhZX0VSUk9SX1NFUlZJQ0UJCT0gNiwJLyogSWxsZWdhbCBzZXJ2aWNlICovCiAJQVI1S19SWF9QSFlfRVJST1JfVE9SCQkJPSA3LAkvKiBUcmFuc21pdCBvdmVycmlkZSByZWNlaXZlICovCiAJLyogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHRoZSA1MjEyICovCkBAIC0xNDgsMTEyICsxMzIsMTExIEBACiB9IF9fcGFja2VkOwogCiAvKiBUWCBjb250cm9sIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU4JCTB4MDAwM2YwMDAgLypbNTIxMCA/XSovCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU5fUwkxMgotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEUJCTB4MDAzYzAwMDAKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOCQkweDAwMDAwZmZmIC8qIGZyYW1lIGxlbmd0aCAqLworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOXzUyMTAJMHgwMDAzZjAwMCAvKiBbNTIxMF0gaGVhZGVyIGxlbmd0aCAqLworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOXzUyMTBfUwkxMgorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEUJCTB4MDAzYzAwMDAgLyogdHggcmF0ZSAqLwogI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEVfUwkxOAotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9SVFNFTkEJCTB4MDA0MDAwMDAKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfQ0xSRE1BU0sJCTB4MDEwMDAwMDAKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfTE9OR19QQUNLRVQJMHgwMDgwMDAwMCAvKls1MjEwXSovCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX1ZFT0wJCTB4MDA4MDAwMDAgLypbNTIxMV0qLwotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9UWVBFCQkweDFjMDAwMDAwIC8qWzUyMTBdKi8KLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRV9TCTI2Ci0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMAkweDAyMDAwMDAwCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMQkweDFlMDAwMDAwCi0KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfUlRTRU5BCQkweDAwNDAwMDAwIC8qIFJUUy9DVFMgZW5hYmxlICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0xPTkdfUEFDS0VUXzUyMTAJMHgwMDgwMDAwMCAvKiBbNTIxMF0gbG9uZyBwYWNrZXQgKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfVkVPTF81MjExCQkweDAwODAwMDAwIC8qIFs1MjExXSB2aXJ0dWFsIGVuZC1vZi1saXN0ICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0NMUkRNQVNLCQkweDAxMDAwMDAwIC8qIGNsZWFyIGRlc3RpbmF0aW9uIG1hc2sgKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF81MjEwCTB4MDIwMDAwMDAgLyogWzUyMTBdIGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMQkweDFlMDAwMDAwIC8qIFs1MjExXSBhbnRlbm5hIHNlbGVjdGlvbiAqLwogI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUCQkJXAogCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwkJXAogCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUXzUyMTAgOglcCiAJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMSkKLQogI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUX1MJMjUKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfSU5UUkVRCQkweDIwMDAwMDAwCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0VOQ1JZUFRfS0VZX1ZBTElECTB4NDAwMDAwMDAKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRV81MjEwCTB4MWMwMDAwMDAgLyogWzUyMTBdIGZyYW1lIHR5cGUgKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRV81MjEwX1MJMjYKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfSU5UUkVRCQkweDIwMDAwMDAwIC8qIFRYIGludGVycnVwdCByZXF1ZXN0ICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0VOQ1JZUFRfS0VZX1ZBTElECTB4NDAwMDAwMDAgLyoga2V5IGlzIHZhbGlkICovCiAKIC8qIFRYIGNvbnRyb2wgd29yZCAxIGZpZWxkcy9mbGFncyAqLwotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX01PUkUJCTB4MDAwMDEwMDAKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVhfNTIxMAkweDAwMDdlMDAwCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYXzUyMTEJMHgwMDBmZTAwMAotCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYCQkJCVwKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfQlVGX0xFTgkJMHgwMDAwMGZmZiAvKiBkYXRhIGJ1ZmZlciBsZW5ndGggKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfTU9SRQkJMHgwMDAwMTAwMCAvKiBtb3JlIGRlc2MgZm9yIHRoaXMgZnJhbWUgKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DX0tFWV9JRFhfNTIxMAkweDAwMDdlMDAwIC8qIFs1MjEwXSBrZXkgdGFibGUgaW5kZXggKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DX0tFWV9JRFhfNTIxMQkweDAwMGZlMDAwIC8qIFs1MjExXSBrZXkgdGFibGUgaW5kZXggKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DX0tFWV9JRFgJCQkJXAogCQkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8JCVwKLQkJCUFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYXzUyMTAgOglcCi0JCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF81MjExKQotCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYX1MJMTMKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRQkJMHgwMDcwMDAwMCAvKls1MjExXSovCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEVfUwkyMAotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9OT0FDSwkJMHgwMDgwMDAwMCAvKls1MjExXSovCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX1JUU19EVVJBVElPTgkweGZmZjgwMDAwIC8qWzUyMTAgP10qLworCQkJQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DX0tFWV9JRFhfNTIxMCA6CQlcCisJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNfS0VZX0lEWF81MjExKQorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNfS0VZX0lEWF9TCTEzCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEVfNTIxMQkweDAwNzAwMDAwIC8qIFs1MjExXSBmcmFtZSB0eXBlICovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEVfNTIxMV9TCTIwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX05PQUNLXzUyMTEJCTB4MDA4MDAwMDAgLyogWzUyMTFdIG5vIEFDSyAqLworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9SVFNfRFVSQVRJT05fNTIxMAkweGZmZjgwMDAwIC8qIFs1MjEwXSBsb3dlciAxMyBiaXQgb2YgZHVyYXRpb24gKi8KIAogLyogRnJhbWUgdHlwZXMgKi8KLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PUk1BTCAgIDB4MDAKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX0FUSU0gICAgIDB4MDQKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BTUE9MTCAgIDB4MDgKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PX0RFTEFZIDB4MGMKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlMgICAgIDB4MTAKKyNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PUk1BTAkwCisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9BVElNCTEKKyNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BTUE9MTAkyCisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9OT19ERUxBWQkzCisjZGVmaW5lIEFSNUtfQVI1MjExX1RYX0RFU0NfRlJBTUVfVFlQRV9CRUFDT04JMworI2RlZmluZSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfUElGUwk0CisjZGVmaW5lIEFSNUtfQVI1MjExX1RYX0RFU0NfRlJBTUVfVFlQRV9QUkVTUAk0CiAKIC8qCiAgKiA1MjEyIGhhcmR3YXJlIDQtd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKICAqLwogc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCB7CiAJdTMyCXR4X2NvbnRyb2xfMDsgLyogVFggY29udHJvbCB3b3JkIDAgKi8KLQotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU4JCTB4MDAwMDBmZmYKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfWE1JVF9QT1dFUgkJMHgwMDNmMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9YTUlUX1BPV0VSX1MJMTYKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfUlRTRU5BCQkweDAwNDAwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1ZFT0wJCTB4MDA4MDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQ0xSRE1BU0sJCTB4MDEwMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVAkweDFlMDAwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfUwkyNQotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9JTlRSRVEJCTB4MjAwMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQJMHg0MDAwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9DVFNFTkEJCTB4ODAwMDAwMDAKLQogCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCisJdTMyCXR4X2NvbnRyb2xfMjsgLyogVFggY29udHJvbCB3b3JkIDIgKi8KKwl1MzIJdHhfY29udHJvbF8zOyAvKiBUWCBjb250cm9sIHdvcmQgMyAqLworfSBfX3BhY2tlZDsKIAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX01PUkUJCTB4MDAwMDEwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVgJMHgwMDBmZTAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF9TCTEzCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEUJCTB4MDBmMDAwMDAKKy8qIFRYIGNvbnRyb2wgd29yZCAwIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU4JCTB4MDAwMDBmZmYgLyogZnJhbWUgbGVuZ3RoICovCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1hNSVRfUE9XRVIJCTB4MDAzZjAwMDAgLyogdHJhbnNtaXQgcG93ZXIgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfWE1JVF9QT1dFUl9TCTE2CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1JUU0VOQQkJMHgwMDQwMDAwMCAvKiBSVFMvQ1RTIGVuYWJsZSAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9WRU9MCQkweDAwODAwMDAwIC8qIHZpcnR1YWwgZW5kLW9mLWxpc3QgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQ0xSRE1BU0sJCTB4MDEwMDAwMDAgLyogY2xlYXIgZGVzdGluYXRpb24gbWFzayAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUCTB4MWUwMDAwMDAgLyogVFggYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF9TCTI1CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0lOVFJFUQkJMHgyMDAwMDAwMCAvKiBUWCBpbnRlcnJ1cHQgcmVxdWVzdCAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9FTkNSWVBUX0tFWV9WQUxJRAkweDQwMDAwMDAwIC8qIGRlc3RpbmF0aW9uIGluZGV4IHZhbGlkICovCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0NUU0VOQQkJMHg4MDAwMDAwMCAvKiBwcmVjZWRlIGZyYW1lIHdpdGggQ1RTICovCisKKy8qIFRYIGNvbnRyb2wgd29yZCAxIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOCQkweDAwMDAwZmZmIC8qIGRhdGEgYnVmZmVyIGxlbmd0aCAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9NT1JFCQkweDAwMDAxMDAwIC8qIG1vcmUgZGVzYyBmb3IgdGhpcyBmcmFtZSAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JRFgJMHgwMDBmZTAwMCAvKiBkZXN0aW5hdGlvbiB0YWJsZSBpbmRleCAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JRFhfUwkxMworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFCQkweDAwZjAwMDAwIC8qIGZyYW1lIHR5cGUgKi8KICNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRV9TCTIwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX05PQUNLCQkweDAxMDAwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfUFJPQwkJMHgwNjAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9OT0FDSwkJMHgwMTAwMDAwMCAvKiBubyBBQ0sgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9QUk9DCQkweDA2MDAwMDAwIC8qIGNvbXByZXNzaW9uIHByb2Nlc3NpbmcgKi8KICNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9QUk9DX1MJMjUKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9JVl9MRU4JMHgxODAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX0lWX0xFTgkweDE4MDAwMDAwIC8qIGxlbmd0aCBvZiBmcmFtZSBJViAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX0lWX0xFTl9TCTI3Ci0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfSUNWX0xFTgkweDYwMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfSUNWX0xFTgkweDYwMDAwMDAwIC8qIGxlbmd0aCBvZiBmcmFtZSBJQ1YgKi8KICNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9JQ1ZfTEVOX1MJMjkKIAotCXUzMgl0eF9jb250cm9sXzI7IC8qIFRYIGNvbnRyb2wgd29yZCAyICovCisvKiBUWCBjb250cm9sIHdvcmQgMiBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfUlRTX0RVUkFUSU9OCTB4MDAwMDdmZmYgLyogUlRTL0NUUyBkdXJhdGlvbiAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9EVVJBVElPTl9VUERfRU4JMHgwMDAwODAwMCAvKiBmcmFtZSBkdXJhdGlvbiB1cGRhdGUgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzAJMHgwMDBmMDAwMCAvKiBzZXJpZXMgMCBtYXggYXR0ZW1wdHMgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzBfUwkxNgorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMQkweDAwZjAwMDAwIC8qIHNlcmllcyAxIG1heCBhdHRlbXB0cyAqLworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMV9TCTIwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMyCTB4MGYwMDAwMDAgLyogc2VyaWVzIDIgbWF4IGF0dGVtcHRzICovCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMyX1MJMjQKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzMJMHhmMDAwMDAwMCAvKiBzZXJpZXMgMyBtYXggYXR0ZW1wdHMgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzNfUwkyOAogCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1JUU19EVVJBVElPTgkJMHgwMDAwN2ZmZgotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9EVVJBVElPTl9VUERBVEVfRU5BQkxFCTB4MDAwMDgwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzAJCTB4MDAwZjAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzBfUwkJMTYKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzEJCTB4MDBmMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzFfUwkJMjAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzIJCTB4MGYwMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzJfUwkJMjQKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzMJCTB4ZjAwMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzNfUwkJMjgKLQotCXUzMgl0eF9jb250cm9sXzM7IC8qIFRYIGNvbnRyb2wgd29yZCAzICovCi0KLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMAkJMHgwMDAwMDAxZgotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUxCQkweDAwMDAwM2UwCisvKiBUWCBjb250cm9sIHdvcmQgMyBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMAkJMHgwMDAwMDAxZiAvKiBzZXJpZXMgMCB0eCByYXRlICovCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTEJCTB4MDAwMDAzZTAgLyogc2VyaWVzIDEgdHggcmF0ZSAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUxX1MJNQotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUyCQkweDAwMDA3YzAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTIJCTB4MDAwMDdjMDAgLyogc2VyaWVzIDIgdHggcmF0ZSAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUyX1MJMTAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMwkJMHgwMDBmODAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUzCQkweDAwMGY4MDAwIC8qIHNlcmllcyAzIHR4IHJhdGUgKi8KICNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFM19TCTE1Ci0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURQkweDAxZjAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURQkweDAxZjAwMDAwIC8qIFJUUyBvciBDVFMgcmF0ZSAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEVfUwkyMAotfSBfX3BhY2tlZDsKIAogLyoKICAqIENvbW1vbiBUWCBzdGF0dXMgZGVzY3JpcHRvcgpAQCAtMjY0LDM3ICsyNDcsMzQgQEAKIH0gX19wYWNrZWQ7CiAKIC8qIFRYIHN0YXR1cyB3b3JkIDAgZmllbGRzL2ZsYWdzICovCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZSQU1FX1hNSVRfT0sJMHgwMDAwMDAwMQotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9FWENFU1NJVkVfUkVUUklFUwkweDAwMDAwMDAyCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZJRk9fVU5ERVJSVU4JMHgwMDAwMDAwNAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUxURVJFRAkJMHgwMDAwMDAwOAotLyo/Pz8KLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfUlRTX0ZBSUxfQ09VTlQJMHgwMDAwMDBmMAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9SVFNfRkFJTF9DT1VOVF9TCTQKLSovCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1NIT1JUX1JFVFJZX0NPVU5UCTB4MDAwMDAwZjAKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSwkweDAwMDAwMDAxIC8qIFRYIHN1Y2Nlc3MgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRVhDRVNTSVZFX1JFVFJJRVMJMHgwMDAwMDAwMiAvKiBleGNlc3NpdmUgcmV0cmllcyAqLworI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUZPX1VOREVSUlVOCTB4MDAwMDAwMDQgLyogRklGTyB1bmRlcnJ1biAqLworI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUxURVJFRAkJMHgwMDAwMDAwOCAvKiBUWCBmaWx0ZXIgaW5kaWNhdGlvbiAqLworLyogYWNjb3JkaW5nIHRvIHRoZSBIQUwgc291cmNlcyB0aGUgc3BlYyBoYXMgc2hvcnQvbG9uZyByZXRyeSBjb3VudHMgcmV2ZXJzZWQuCisgKiB3ZSBoYXZlIGl0IHJldmVyc2VkIHRvIHRoZSBIQUwgc291cmNlcyBhcyB3ZWxsLCBmb3IgNTIxMCBhbmQgNTIxMS4KKyAqIEZvciA1MjEyIHRoZXNlIGZpZWxkcyBhcmUgZGVmaW5lZCBhcyBSVFNfRkFJTF9DT1VOVCBhbmQgREFUQV9GQUlMX0NPVU5ULAorICogYnV0IHVzZWQgcmVzcGVjdGl2ZWx5IGFzIFNIT1JUIGFuZCBMT05HIHJldHJ5IGNvdW50IGluIHRoZSBjb2RlIGxhdGVyLiBUaGlzCisgKiBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGRlZmluaXRpb25zIGhlcmUuLi4gVE9ETzogY2hlY2sgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfU0hPUlRfUkVUUllfQ09VTlQJMHgwMDAwMDBmMCAvKiBzaG9ydCByZXRyeSBjb3VudCAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVF9TCTQKLS8qPz8/Ci0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVAkweDAwMDAwZjAwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVF9TCTgKLSovCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQJMHgwMDAwMGYwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9MT05HX1JFVFJZX0NPVU5UCTB4MDAwMDBmMDAgLyogbG9uZyByZXRyeSBjb3VudCAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9MT05HX1JFVFJZX0NPVU5UX1MJOAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlQJMHgwMDAwZjAwMAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlRfUwkxMgotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUAkweGZmZmYwMDAwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1ZJUlRDT0xMX0NUXzUyMTEJMHgwMDAwZjAwMCAvKiBbNTIxMStdIHZpcnR1YWwgY29sbGlzaW9uIGNvdW50ICovCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1ZJUlRDT0xMX0NUXzUyMTJfUwkxMgorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUAkweGZmZmYwMDAwIC8qIFRYIHRpbWVzdGFtcCAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUF9TCTE2CiAKIC8qIFRYIHN0YXR1cyB3b3JkIDEgZmllbGRzL2ZsYWdzICovCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0RPTkUJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfU0VRX05VTQkJMHgwMDAwMWZmZQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9ET05FCQkweDAwMDAwMDAxIC8qIGRlc2NyaXB0b3IgY29tcGxldGUgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfU0VRX05VTQkJMHgwMDAwMWZmZSAvKiBUWCBzZXF1ZW5jZSBudW1iZXIgKi8KICNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfU0VRX05VTV9TCQkxCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0FDS19TSUdfU1RSRU5HVEgJMHgwMDFmZTAwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9BQ0tfU0lHX1NUUkVOR1RICTB4MDAxZmUwMDAgLyogc2lnbmFsIHN0cmVuZ3RoIG9mIEFDSyAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9BQ0tfU0lHX1NUUkVOR1RIX1MJMTMKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfRklOQUxfVFNfSU5ERVgJMHgwMDYwMDAwMAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9GSU5BTF9UU19JTkRFWF9TCTIxCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0NPTVBfU1VDQ0VTUwkweDAwODAwMDAwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX1hNSVRfQU5URU5OQQkweDAxMDAwMDAwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0ZJTkFMX1RTX0lYXzUyMTIJMHgwMDYwMDAwMCAvKiBbNTIxMl0gZmluYWwgVFggYXR0ZW1wdCBzZXJpZXMgaXggKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfRklOQUxfVFNfSVhfNTIxMl9TCTIxCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0NPTVBfU1VDQ0VTU181MjEyCTB4MDA4MDAwMDAgLyogWzUyMTJdIGNvbXByZXNzaW9uIHN0YXR1cyAqLworI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkFfNTIxMgkweDAxMDAwMDAwIC8qIFs1MjEyXSB0cmFuc21pdCBhbnRlbm5hICovCiAKIC8qCiAgKiA1MjEwLzUyMTEgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgpAQCAtMzEzLDE4ICsyOTMsMTUgQEAKIH0gX19wYWNrZWQ7CiAKIC8qCi0gKiBjb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorICogQ29tbW9uIGhhcmR3YXJlIFJYIGRlc2NyaXB0b3IKICAqLwogc3RydWN0IGF0aDVrX2h3X2FsbF9yeF9kZXNjIHsKLQlzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsCQkJcnhfY3RsOwotCXVuaW9uIHsKLQkJc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cwlyeF9zdGF0OwotCQlzdHJ1Y3QgYXRoNWtfaHdfcnhfZXJyb3IJcnhfZXJyOwotCX0gdTsKKwlzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsCQlyeF9jdGw7CisJc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cwlyeF9zdGF0OwogfSBfX3BhY2tlZDsKIAogLyoKLSAqIEF0aGVyb3MgaGFyZHdhcmUgZGVzY3JpcHRvcgorICogQXRoZXJvcyBoYXJkd2FyZSBETUEgZGVzY3JpcHRvcgogICogVGhpcyBpcyByZWFkIGFuZCB3cml0dGVuIHRvIGJ5IHRoZSBoYXJkd2FyZQogICovCiBzdHJ1Y3QgYXRoNWtfZGVzYyB7CkBAIC0zNDYsNCArMzIzLDMgQEAKICNkZWZpbmUgQVI1S19UWERFU0NfQ1RTRU5BCTB4MDAwOAogI2RlZmluZSBBUjVLX1RYREVTQ19JTlRSRVEJMHgwMDEwCiAjZGVmaW5lIEFSNUtfVFhERVNDX1ZFT0wJMHgwMDIwCS8qWzUyMTErXSovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYwppbmRleCA5NDFiNTExLi40ODRmMzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jCkBAIC00OCw3ICs0OCw2IEBACiAgKi8KIHZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfQ1JfUlhFLCBBUjVLX0NSKTsKIAlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUik7CiB9CkBAIC02Miw3ICs2MSw2IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19DUl9SWEQsIEFSNUtfQ1IpOwogCiAJLyoKQEAgLTk2LDggKzk0LDYgQEAKICAqLwogdm9pZCBhdGg1a19od19zZXRfcnhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcGh5c19hZGRyKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBoeXNfYWRkciwgQVI1S19SWERQKTsKIH0KIApAQCAtMTI1LDcgKzEyMSw2IEBACiB7CiAJdTMyIHR4X3F1ZXVlOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKIAogCS8qIFJldHVybiBpZiBxdWV1ZSBpcyBkZWNsYXJlZCBpbmFjdGl2ZSAqLwpAQCAtMTg2LDcgKzE4MSw2IEBACiAJdW5zaWduZWQgaW50IGkgPSA0MDsKIAl1MzIgdHhfcXVldWUsIHBlbmRpbmc7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOwogCiAJLyogUmV0dXJuIGlmIHF1ZXVlIGlzIGRlY2xhcmVkIGluYWN0aXZlICovCkBAIC0yOTcsNyArMjkxLDYgQEAKIHsKIAl1MTYgdHhfcmVnOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKIAogCS8qCkBAIC0zNDAsNyArMzMzLDYgQEAKIHsKIAl1MTYgdHhfcmVnOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKIAogCS8qCkBAIC00MDAsOCArMzkyLDYgQEAKIAl1MzIgdHJpZ2dlcl9sZXZlbCwgaW1yOwogCWludCByZXQgPSAtRUlPOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCS8qCiAJICogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIG1hc2sKIAkgKi8KQEAgLTQ1MSw3ICs0NDEsNiBAQAogICovCiBib29sIGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lOVFBFTkQpID09IDEgPyAxIDogMDsKIH0KIApAQCAtNDc1LDggKzQ2NCw2IEBACiB7CiAJdTMyIGRhdGE7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCiAJLyoKIAkgKiBSZWFkIGludGVycnVwdCBzdGF0dXMgZnJvbSB0aGUgSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlcgogCSAqIG9uIDUyMTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYwppbmRleCBlZDAyNjM2Li5hZTMxNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCkBAIC0zNSw3ICszNSw2IEBACiB7CiAJdTMyIHN0YXR1cywgdGltZW91dDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJLyoKIAkgKiBJbml0aWFsaXplIEVFUFJPTSBhY2Nlc3MKIAkgKi8KQEAgLTcxNSw3ICs3MTQsNyBAQAogCiAJCS8qIE9ubHkgb25lIGN1cnZlIGZvciBSRjUxMTEKIAkJICogZmluZCBvdXQgd2hpY2ggb25lIGFuZCBwbGFjZQotCQkgKiBpbiBpbiBwZF9jdXJ2ZXMuCisJCSAqIGluIHBkX2N1cnZlcy4KIAkJICogTm90ZTogZWVfeF9nYWluIGlzIHJldmVyc2VkIGhlcmUgKi8KIAkJZm9yIChpZHggPSAwOyBpZHggPCBBUjVLX0VFUFJPTV9OX1BEX0NVUlZFUzsgaWR4KyspIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9ncGlvLmMKaW5kZXggNjRhMjdlNy4uYmM5MDUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZ3Bpby5jCkBAIC0zNCw4ICszNCw2IEBACiAJLyo1MjEwIGhhcyBkaWZmZXJlbnQgbGVkIG1vZGUgaGFuZGxpbmcqLwogCXUzMiBsZWRfNTIxMDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAkvKlJlc2V0IGxlZCBzdGF0dXMqLwogCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKIAkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1BDSUNGRywKQEAgLTgyLDcgKzgwLDYgQEAKICAqLwogaW50IGF0aDVrX2h3X3NldF9ncGlvX2lucHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTk4LDcgKzk1LDYgQEAKICAqLwogaW50IGF0aDVrX2h3X3NldF9ncGlvX291dHB1dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCWlmIChncGlvID49IEFSNUtfTlVNX0dQSU8pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xMTQsNyArMTEwLDYgQEAKICAqLwogdTMyIGF0aDVrX2h3X2dldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKIAkJcmV0dXJuIDB4ZmZmZmZmZmY7CiAKQEAgLTEyOSw3ICsxMjQsNiBAQAogaW50IGF0aDVrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvLCB1MzIgdmFsKQogewogCXUzMiBkYXRhOwotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAKIAlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1Myw3ICsxNDcsNiBAQAogewogCXUzMiBkYXRhOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY3UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY3UuYwppbmRleCA1MjEyZTI3Li44NmZkYjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjdS5jCkBAIC01OSw4ICs1OSw2IEBACiAKIAliZWFjb25fcmVnID0gMDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlzd2l0Y2ggKG9wX21vZGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlwY3VfcmVnIHw9IEFSNUtfU1RBX0lEMV9BREhPQyB8IEFSNUtfU1RBX0lEMV9LRVlTUkNIX01PREU7CkBAIC0xNzMsNyArMTcxLDYgQEAKICAqLwogc3RhdGljIGludCBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHRpbWVvdXQpCiB7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlpZiAoYXRoNWtfaHdfY2xvY2t0b2goYWgsIEFSNUtfUkVHX01TKDB4ZmZmZmZmZmYsIEFSNUtfVElNRV9PVVRfQUNLKSkKIAkJCTw9IHRpbWVvdXQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTkyLDcgKzE4OSw2IEBACiAgKi8KIHN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJaWYgKGF0aDVrX2h3X2Nsb2NrdG9oKGFoLCBBUjVLX1JFR19NUygweGZmZmZmZmZmLCBBUjVLX1RJTUVfT1VUX0NUUykpCiAJCQk8PSB0aW1lb3V0KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI5Nyw3ICsyOTMsNiBAQAogCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7CiAJdTMyIHBjdV9yZWc7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCS8qIFNldCBuZXcgc3RhdGlvbiBJRCAqLwogCW1lbWNweShjb21tb24tPm1hY2FkZHIsIG1hYywgRVRIX0FMRU4pOwogCkBAIC0zNTcsNyArMzUyLDYgQEAKIHZvaWQgYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAogCS8qIENhY2hlIGJzc2lkIG1hc2sgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdAogCSAqIG9uIHJlc2V0ICovCkBAIC0zODIsNyArMzc2LDYgQEAKICAqLwogdm9pZCBhdGg1a19od19zdGFydF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXLCBBUjVLX0RJQUdfU1dfRElTX1JYKTsKIH0KIApAQCAtMzk3LDcgKzM5MCw2IEBACiAgKi8KIHZvaWQgYXRoNWtfaHdfc3RvcF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0RJQUdfU1csIEFSNUtfRElBR19TV19ESVNfUlgpOwogfQogCkBAIC00MDYsOCArMzk4LDYgQEAKICAqLwogdm9pZCBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIwLCB1MzIgZmlsdGVyMSkKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCS8qIFNldCB0aGUgbXVsdGljYXQgZmlsdGVyICovCiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBmaWx0ZXIwLCBBUjVLX01DQVNUX0ZJTFRFUjApOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyMSwgQVI1S19NQ0FTVF9GSUxURVIxKTsKIH0KQEAgLTQyNyw3ICs0MTcsNiBAQAogewogCXUzMiBkYXRhLCBmaWx0ZXIgPSAwOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlmaWx0ZXIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SWF9GSUxURVIpOwogCiAJLypSYWRhciBkZXRlY3Rpb24gZm9yIDUyMTIqLwpAQCAtNDU3LDggKzQ0Niw2IEBACiB7CiAJdTMyIGRhdGEgPSAwOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCS8qIFNldCBQSFkgZXJyb3IgZmlsdGVyIHJlZ2lzdGVyIG9uIDUyMTIqLwogCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewogCQlpZiAoZmlsdGVyICYgQVI1S19SWF9GSUxURVJfUkFEQVJFUlIpCkBAIC01MzMsOCArNTIwLDYgQEAKIAogCVdBUk5fT04oIGkgPT0gQVRINUtfTUFYX1RTRl9SRUFEICk7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCiAJcmV0dXJuICgoKHU2NCl0c2ZfdXBwZXIxIDw8IDMyKSB8IHRzZl9sb3dlcik7CiB9CiAKQEAgLTU0OCw4ICs1MzMsNiBAQAogICovCiB2b2lkIGF0aDVrX2h3X3NldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1NjQgdHNmNjQpCiB7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHNmNjQgJiAweGZmZmZmZmZmLCBBUjVLX1RTRl9MMzIpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHRzZjY0ID4+IDMyKSAmIDB4ZmZmZmZmZmYsIEFSNUtfVFNGX1UzMik7CiB9CkBAIC01NjUsOCArNTQ4LDYgQEAKIHsKIAl1MzIgdmFsOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCXZhbCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTikgfCBBUjVLX0JFQUNPTl9SRVNFVF9UU0Y7CiAKIAkvKgpAQCAtNTg2LDcgKzU2Nyw2IEBACiB7CiAJdTMyIHRpbWVyMSwgdGltZXIyLCB0aW1lcjM7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCS8qCiAJICogU2V0IHRoZSBhZGRpdGlvbmFsIHRpbWVycyBieSBtb2RlCiAJICovCkBAIC02NzQsNyArNjU0LDYgQEAKIAl1bnNpZ25lZCBpbnQgaSwgdHlwZTsKIAl1MTYgbWljZW50cnkgPSBlbnRyeSArIEFSNUtfS0VZVEFCTEVfTUlDX09GRlNFVDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJQVI1S19BU1NFUlRfRU5UUlkoZW50cnksIEFSNUtfS0VZVEFCTEVfU0laRSk7CiAKIAl0eXBlID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfS0VZVEFCTEVfVFlQRShlbnRyeSkpOwpAQCAtNzQ5LDggKzcyOCw2IEBACiAJYm9vbCBpc190a2lwOwogCWNvbnN0IHU4ICprZXlfcHRyOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCWlzX3RraXAgPSAoa2V5LT5hbGcgPT0gQUxHX1RLSVApOwogCiAJLyoKQEAgLTgzNiw3ICs4MTMsNiBAQAogewogCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7CiAKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCSAvKiBJbnZhbGlkIGVudHJ5IChrZXkgdGFibGUgb3ZlcmZsb3cpICovCiAJQVI1S19BU1NFUlRfRU5UUlkoZW50cnksIEFSNUtfS0VZVEFCTEVfU0laRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYwppbmRleCA0OTJjYmIxLi42Mjg0YzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCkBAIC0zNzgsOCArMzc4LDYgQEAKIAl1MzIgZGF0YSwgdHlwZTsKIAlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlpZiAoYWgtPmFoX3JmX2JhbmtzID09IE5VTEwgfHwKIAlhaC0+YWhfZ2Fpbi5nX3N0YXRlID09IEFSNUtfUkZHQUlOX0lOQUNUSVZFKQogCQlyZXR1cm4gQVI1S19SRkdBSU5fSU5BQ1RJVkU7CkBAIC0xMTY3LDcgKzExNjUsNyBAQAogICogVGhlIG1lZGlhbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBoaXN0b3J5IGlzIHRoZW4gbG9hZGVkIGludG8gdGhlCiAgKiBoYXJkd2FyZSBmb3IgaXRzIG93biB1c2UgZm9yIFJTU0kgYW5kIENDQSBtZWFzdXJlbWVudHMuCiAgKi8KLXN0YXRpYyB2b2lkIGF0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZCBhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3Ioc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKIAl1MzIgdmFsOwpAQCAtMTI0OCw3ICsxMjQ2LDYgQEAKIC8qCiAgKiBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uIG9uIFJGNTExMAogICogLUZpeCBCUFNLL1FBTSBDb25zdGVsbGF0aW9uIChJL1EgY29ycmVjdGlvbikKLSAqIC1DYWxjdWxhdGUgTm9pc2UgRmxvb3IKICAqLwogc3RhdGljIGludCBhdGg1a19od19yZjUxMTBfY2FsaWJyYXRlKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKQEAgLTEzMzUsOCArMTMzMiw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JYXRoNWtfaHdfdXBkYXRlX25vaXNlX2Zsb29yKGFoKTsKLQogCS8qCiAJICogUmUtZW5hYmxlIFJYL1RYIGFuZCBiZWFjb25zCiAJICovCkBAIC0xMzQ4LDIyICsxMzQzLDIwIEBACiB9CiAKIC8qCi0gKiBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uIG9uIFJGNTExMS81MTEyIGFuZCBuZXdlciBjaGlwcworICogUGVyZm9ybSBJL1EgY2FsaWJyYXRpb24gb24gUkY1MTExLzUxMTIgYW5kIG5ld2VyIGNoaXBzCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTF4X2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCitzdGF0aWMgaW50CithdGg1a19od19yZjUxMXhfaXFfY2FsaWJyYXRlKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdTMyIGlfcHdyLCBxX3B3cjsKIAlzMzIgaXFfY29yciwgaV9jb2ZmLCBpX2NvZmZkLCBxX2NvZmYsIHFfY29mZmQ7CiAJaW50IGk7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAogCWlmICghYWgtPmFoX2NhbGlicmF0aW9uIHx8CiAJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUSkgJiBBUjVLX1BIWV9JUV9SVU4pCi0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIDA7CiAKIAkvKiBDYWxpYnJhdGlvbiBoYXMgZmluaXNoZWQsIGdldCB0aGUgcmVzdWx0cyBhbmQgcmUtcnVuICovCi0KIAkvKiB3b3JrIGFyb3VuZCBlbXB0eSByZXN1bHRzIHdoaWNoIGNhbiBhcHBhcmVudGx5IGhhcHBlbiBvbiA1MjEyICovCiAJZm9yIChpID0gMDsgaSA8PSAxMDsgaSsrKSB7CiAJCWlxX2NvcnIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfSVFSRVNfQ0FMX0NPUlIpOwpAQCAtMTM4NCw3ICsxMzc3LDcgQEAKIAogCS8qIHByb3RlY3QgYWdhaW5zdCBkaXZpZGUgYnkgMCBhbmQgbG9zcyBvZiBzaWduIGJpdHMgKi8KIAlpZiAoaV9jb2ZmZCA9PSAwIHx8IHFfY29mZmQgPCAyKQotCQlnb3RvIGRvbmU7CisJCXJldHVybiAtMTsKIAogCWlfY29mZiA9ICgtaXFfY29ycikgLyBpX2NvZmZkOwogCWlfY29mZiA9IGNsYW1wKGlfY29mZiwgLTMyLCAzMSk7IC8qIHNpZ25lZCA2IGJpdCAqLwpAQCAtMTQxMCwxNyArMTQwMyw2IEBACiAJCQlBUjVLX1BIWV9JUV9DQUxfTlVNX0xPR19NQVgsIDE1KTsKIAlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsIEFSNUtfUEhZX0lRX1JVTik7CiAKLWRvbmU6Ci0KLQkvKiBUT0RPOiBTZXBhcmF0ZSBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiBmcm9tIEkvUSBjYWxpYnJhdGlvbgotCSAqIHNpbmNlIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGludGVycnVwdHMgcnggcGF0aCB3aGlsZSBJL1EKLQkgKiBjYWxpYnJhdGlvbiBkb2Vzbid0LiBXZSBkb24ndCBuZWVkIHRvIHJ1biBub2lzZSBmbG9vciBjYWxpYnJhdGlvbgotCSAqIGFzIG9mdGVuIGFzIEkvUSBjYWxpYnJhdGlvbi4qLwotCWF0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcihhaCk7Ci0KLQkvKiBJbml0aWF0ZSBhIGdhaW5fRiBjYWxpYnJhdGlvbiAqLwotCWF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKGFoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNDM0LDggKzE0MTYsMTAgQEAKIAogCWlmIChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTApCiAJCXJldCA9IGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoYWgsIGNoYW5uZWwpOwotCWVsc2UKLQkJcmV0ID0gYXRoNWtfaHdfcmY1MTF4X2NhbGlicmF0ZShhaCwgY2hhbm5lbCk7CisJZWxzZSB7CisJCXJldCA9IGF0aDVrX2h3X3JmNTExeF9pcV9jYWxpYnJhdGUoYWgpOworCQlhdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZShhaCk7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2OTMsNyArMTY3Nyw2IEBACiAKIGludCBhdGg1a19od19waHlfZGlzYWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJLypKdXN0IGEgdHJ5IE0uRi4qLwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfQUNUX0RJU0FCTEUsIEFSNUtfUEhZX0FDVCk7CiAKQEAgLTE3MDksOCArMTY5Miw2IEBACiAJdTMyIHNyZXY7CiAJdTE2IHJldDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAkvKgogCSAqIFNldCB0aGUgcmFkaW8gY2hpcCBhY2Nlc3MgcmVnaXN0ZXIKIAkgKi8KQEAgLTE3NTUsOCArMTczNiw2IEBACiBzdGF0aWMgdm9pZCAvKlRPRE86Qm91bmRhcnkgY2hlY2sqLwogYXRoNWtfaHdfc2V0X2RlZl9hbnRlbm5hKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IGFudCkKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCiAJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKQogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFudCAmIDB4NywgQVI1S19ERUZBVUxUX0FOVEVOTkEpOwogfQpAQCAtMTc4OSwxOSArMTc2OCw1MCBAQAogCiAJaWYgKGVuYWJsZSkgewogCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9SRVNUQVJULAotCQkJCUFSNUtfUEhZX1JFU1RBUlRfRElWX0dDLCAweGMpOworCQkJCUFSNUtfUEhZX1JFU1RBUlRfRElWX0dDLCA0KTsKIAogCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfRkFTVF9BTlRfRElWLAogCQkJCQlBUjVLX1BIWV9GQVNUX0FOVF9ESVZfRU4pOwogCX0gZWxzZSB7CiAJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX1JFU1RBUlQsCi0JCQkJQVI1S19QSFlfUkVTVEFSVF9ESVZfR0MsIDB4OCk7CisJCQkJQVI1S19QSFlfUkVTVEFSVF9ESVZfR0MsIDApOwogCiAJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QSFlfRkFTVF9BTlRfRElWLAogCQkJCQlBUjVLX1BIWV9GQVNUX0FOVF9ESVZfRU4pOwogCX0KIH0KIAordm9pZAorYXRoNWtfaHdfc2V0X2FudGVubmFfc3dpdGNoKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IGVlX21vZGUpCit7CisJdTggYW50MCwgYW50MTsKKworCS8qCisJICogSW4gY2FzZSBhIGZpeGVkIGFudGVubmEgd2FzIHNldCBhcyBkZWZhdWx0CisJICogdXNlIHRoZSBzYW1lIHN3aXRjaCB0YWJsZSB0d2ljZS4KKwkgKi8KKwlpZiAoYWgtPmFoX2FudF9tb2RlID09IEFSNUtfQU5UTU9ERV9GSVhFRF9BKQorCQlhbnQwID0gYW50MSA9IEFSNUtfQU5UX1NXVEFCTEVfQTsKKwllbHNlIGlmIChhaC0+YWhfYW50X21vZGUgPT0gQVI1S19BTlRNT0RFX0ZJWEVEX0IpCisJCWFudDAgPSBhbnQxID0gQVI1S19BTlRfU1dUQUJMRV9COworCWVsc2UgeworCQlhbnQwID0gQVI1S19BTlRfU1dUQUJMRV9BOworCQlhbnQxID0gQVI1S19BTlRfU1dUQUJMRV9COworCX0KKworCS8qIFNldCBhbnRlbm5hIGlkbGUgc3dpdGNoIHRhYmxlICovCisJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfQU5UX0NUTCwKKwkJCUFSNUtfUEhZX0FOVF9DVExfU1dUQUJMRV9JRExFLAorCQkJKGFoLT5haF9hbnRfY3RsW2VlX21vZGVdW0FSNUtfQU5UX0NUTF0gfAorCQkJQVI1S19QSFlfQU5UX0NUTF9UWFJYX0VOKSk7CisKKwkvKiBTZXQgYW50ZW5uYSBzd2l0Y2ggdGFibGVzICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfYW50X2N0bFtlZV9tb2RlXVthbnQwXSwKKwkJQVI1S19QSFlfQU5UX1NXSVRDSF9UQUJMRV8wKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9hbnRfY3RsW2VlX21vZGVdW2FudDFdLAorCQlBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzEpOworfQorCiAvKgogICogU2V0IGFudGVubmEgb3BlcmF0aW5nIG1vZGUKICAqLwpAQCAtMTgyMyw4ICsxODMzLDYgQEAKIAogCWRlZl9hbnQgPSBhaC0+YWhfZGVmX2FudDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlzd2l0Y2ggKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9NT0RFUykgewogCWNhc2UgQ0hBTk5FTF9BOgogCWNhc2UgQ0hBTk5FTF9UOgpAQCAtMTkyMyw2ICsxOTMxLDcgQEAKIAlpZiAoc3RhX2lkMSkKIAkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwgc3RhX2lkMSk7CiAKKwlhdGg1a19od19zZXRfYW50ZW5uYV9zd2l0Y2goYWgsIGVlX21vZGUpOwogCS8qIE5vdGU6IHNldCBkaXZlcnNpdHkgYmVmb3JlIGRlZmF1bHQgYW50ZW5uYQogCSAqIGJlY2F1c2UgaXQgd29uJ3Qgd29yayBjb3JyZWN0bHkgKi8KIAlhdGg1a19od19zZXRfZmFzdF9kaXYoYWgsIGVlX21vZGUsIGZhc3RfZGl2KTsKQEAgLTI5ODgsNyArMjk5Nyw2IEBACiAJdTggdHlwZTsKIAlpbnQgcmV0OwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlpZiAodHhwb3dlciA+IEFSNUtfVFVORV9NQVhfVFhQT1dFUikgewogCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiaW52YWxpZCB0eCBwb3dlcjogJXVcbiIsIHR4cG93ZXIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwODQsOCArMzA5Miw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gYWgtPmFoX2N1cnJlbnRfY2hhbm5lbDsKIAl1OCBlZV9tb2RlOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCXN3aXRjaCAoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX01PREVTKSB7CiAJY2FzZSBDSEFOTkVMX0E6CiAJY2FzZSBDSEFOTkVMX1Q6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMKaW5kZXggZjU4MzFkYS4uNDE4NmZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3FjdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9xY3UuYwpAQCAtMzEsNyArMzEsNiBAQAogaW50IGF0aDVrX2h3X2dldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKIAkJc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxdWV1ZV9pbmZvKQogewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJbWVtY3B5KHF1ZXVlX2luZm8sICZhaC0+YWhfdHhxW3F1ZXVlXSwgc2l6ZW9mKHN0cnVjdCBhdGg1a190eHFfaW5mbykpOwogCXJldHVybiAwOwogfQpAQCAtNDIsNyArNDEsNiBAQAogaW50IGF0aDVrX2h3X3NldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKIAkJCQljb25zdCBzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pCiB7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKIAlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKIAogCWlmIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQpAQCAtNjksOCArNjcsNiBAQAogCXVuc2lnbmVkIGludCBxdWV1ZTsKIAlpbnQgcmV0OwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCS8qCiAJICogR2V0IHF1ZXVlIGJ5IHR5cGUKIAkgKi8KQEAgLTE0OSw3ICsxNDUsNiBAQAogdTMyIGF0aDVrX2h3X251bV90eF9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1MzIgcGVuZGluZzsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOwogCiAJLyogUmV0dXJuIGlmIHF1ZXVlIGlzIGRlY2xhcmVkIGluYWN0aXZlICovCkBAIC0xNzcsNyArMTcyLDYgQEAKICAqLwogdm9pZCBhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwogCWlmIChXQVJOX09OKHF1ZXVlID49IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSkpCiAJCXJldHVybjsKIApAQCAtMTk1LDcgKzE4OSw2IEBACiAJdTMyIGN3X21pbiwgY3dfbWF4LCByZXRyeV9sZywgcmV0cnlfc2g7CiAJc3RydWN0IGF0aDVrX3R4cV9pbmZvICp0cSA9ICZhaC0+YWhfdHhxW3F1ZXVlXTsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJQVI1S19BU1NFUlRfRU5UUlkocXVldWUsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSk7CiAKIAl0cSA9ICZhaC0+YWhfdHhxW3F1ZXVlXTsKQEAgLTUyMyw4ICs1MTYsNiBAQAogewogCXUzMiBzbG90X3RpbWVfY2xvY2sgPSBhdGg1a19od19odG9jbG9jayhhaCwgc2xvdF90aW1lKTsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KIAlpZiAoc2xvdF90aW1lIDwgNiB8fCBzbG90X3RpbWVfY2xvY2sgPiBBUjVLX1NMT1RfVElNRV9NQVgpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCmluZGV4IDMwN2Y4MGUuLjQ5OGFhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCkBAIC0yMDEsOCArMjAxLDYgQEAKIAlpbnQgcmV0OwogCXUzMiBtYXNrID0gdmFsID8gdmFsIDogfjBVOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCS8qIFJlYWQtYW5kLWNsZWFyIFJYIERlc2NyaXB0b3IgUG9pbnRlciovCiAJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUlhEUCk7CiAKQEAgLTI0Niw3ICsyNDQsNiBAQAogCXVuc2lnbmVkIGludCBpOwogCXUzMiBzdGFpZCwgZGF0YTsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CiAJc3RhaWQgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TVEFfSUQxKTsKIAogCXN3aXRjaCAobW9kZSkgewpAQCAtMzkzLDggKzM5MCw2IEBACiAJbW9kZSA9IDA7CiAJY2xvY2sgPSAwOwogCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQogCS8qIFdha2V1cCB0aGUgZGV2aWNlICovCiAJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7CkBAIC03MzQsNyArNzI5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsIHU4ICphbnQsIHU4IGVlX21vZGUpCisJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwgdTggZWVfbW9kZSkKIHsKIAlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKIAlzMTYgY2NrX29mZG1fcHdyX2RlbHRhOwpAQCAtNzY4LDE3ICs3NjMsOSBAQAogCQkJCQkJZWUtPmVlX2Nja19vZmRtX2dhaW5fZGVsdGE7CiAJfQogCi0JLyogU2V0IGFudGVubmEgaWRsZSBzd2l0Y2ggdGFibGUgKi8KLQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9BTlRfQ1RMLAotCQkJQVI1S19QSFlfQU5UX0NUTF9TV1RBQkxFX0lETEUsCi0JCQkoYWgtPmFoX2FudF9jdGxbZWVfbW9kZV1bMF0gfAotCQkJQVI1S19QSFlfQU5UX0NUTF9UWFJYX0VOKSk7Ci0KLQkvKiBTZXQgYW50ZW5uYSBzd2l0Y2ggdGFibGVzICovCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfYW50X2N0bFtlZV9tb2RlXVthbnRbMF1dLAotCQlBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzApOwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX2FudF9jdGxbZWVfbW9kZV1bYW50WzFdXSwKLQkJQVI1S19QSFlfQU5UX1NXSVRDSF9UQUJMRV8xKTsKKwkvKiBYWFg6IG5lY2Vzc2FyeSBoZXJlPyBpcyBjYWxsZWQgZnJvbSBhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKCkKKwkgKiB0b28gKi8KKwlhdGg1a19od19zZXRfYW50ZW5uYV9zd2l0Y2goYWgsIGVlX21vZGUpOwogCiAJLyogTm9pc2UgZmxvb3IgdGhyZXNob2xkICovCiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLApAQCAtODU1LDcgKzg0Miw2IEBACiAJCQlBUjVLX1BIWV9ORl9USFJFU0g2MiwKIAkJCWVlLT5lZV90aHJfNjJbZWVfbW9kZV0pOwogCi0KIAkvKiBGYWxzZSBkZXRlY3QgYmFja29mZiBmb3IgY2hhbm5lbHMKIAkgKiB0aGF0IGhhdmUgc3B1ciBub2lzZS4gV3JpdGUgdGhlIG5ldwogCSAqIGN5Y2xpYyBwb3dlciBSU1NJIHRocmVzaG9sZC4gKi8KQEAgLTg5MSwxNCArODc3LDExIEBACiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGNoYW5nZV9jaGFubmVsKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwotCXUzMiBzX3NlcVsxMF0sIHNfYW50LCBzX2xlZFszXSwgc3RhaWQxX2ZsYWdzLCB0c2ZfdXAsIHRzZl9sbzsKKwl1MzIgc19zZXFbMTBdLCBzX2xlZFszXSwgc3RhaWQxX2ZsYWdzLCB0c2ZfdXAsIHRzZl9sbzsKIAl1MzIgcGh5X3RzdDE7Ci0JdTggbW9kZSwgZnJlcSwgZWVfbW9kZSwgYW50WzJdOworCXU4IG1vZGUsIGZyZXEsIGVlX21vZGU7CiAJaW50IGksIHJldDsKIAotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQlzX2FudCA9IDA7CiAJZWVfbW9kZSA9IDA7CiAJc3RhaWQxX2ZsYWdzID0gMDsKIAl0c2ZfdXAgPSAwOwpAQCAtOTk1LDkgKzk3OCw2IEBACiAJCQl9CiAJCX0KIAotCQkvKiBTYXZlIGRlZmF1bHQgYW50ZW5uYSAqLwotCQlzX2FudCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0RFRkFVTFRfQU5URU5OQSk7Ci0KIAkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7CiAJCQkvKiBSZXN0b3JlIG5vcm1hbCAzMi80ME1IeiBjbG9jayBvcGVyYXRpb24KIAkJCSAqIHRvIGF2b2lkIHJlZ2lzdGVyIGFjY2VzcyBkZWxheSBvbiBjZXJ0YWluCkBAIC0xMDk0LDIyICsxMDc0LDE3IEBACiAJCS8qIFdyaXRlIE9GRE0gdGltaW5ncyBvbiA1MjEyKi8KIAkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyICYmCiAJCQljaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfT0ZETSkgewotCQkJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9Ci0JCQkJCSZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CiAKIAkJCXJldCA9IGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyhhaCwgY2hhbm5lbCk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CiAKLQkJCS8qIE5vdGU6IEFjY29yZGluZyB0byBkb2NzIHdlIGNhbiBoYXZlIGEgbmV3ZXIKLQkJCSAqIEVFUFJPTSBvbiBvbGQgaGFyZHdhcmUsIHNvIHdlIG5lZWQgdG8gdmVyaWZ5Ci0JCQkgKiB0aGF0IG91ciBoYXJkd2FyZSBpcyBuZXcgZW5vdWdoIHRvIGhhdmUgc3B1cgotCQkJICogbWl0aWdhdGlvbiByZWdpc3RlcnMgKGRlbHRhIHBoYXNlIGV0YykgKi8KLQkJCWlmIChhaC0+YWhfbWFjX3NyZXYgPj0gQVI1S19TUkVWX0FSNTQyNCB8fAotCQkJKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfQVI1NDI0ICYmCi0JCQllZS0+ZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzVfMykpCisJCQkvKiBTcHVyIGluZm8gaXMgYXZhaWxhYmxlIG9ubHkgZnJvbSBFRVBST00gdmVyc2lvbnMKKwkJCSAqIGJpZ2dlciB0aGFuIDUuMyBidXQgYnV0IHRoZSBFRVBPTSByb3V0aW5lcyB3aWxsIHVzZQorCQkJICogc3RhdGljIHZhbHVlcyBmb3Igb2xkZXIgdmVyc2lvbnMgKi8KKwkJCWlmIChhaC0+YWhfbWFjX3NyZXYgPj0gQVI1S19TUkVWX0FSNTQyNCkKIAkJCQlhdGg1a19od19zZXRfc3B1cl9taXRpZ2F0aW9uX2ZpbHRlcihhaCwKLQkJCQkJCQkJY2hhbm5lbCk7CisJCQkJCQkJCSAgICBjaGFubmVsKTsKIAkJfQogCiAJCS8qRW5hYmxlL2Rpc2FibGUgODAyLjExYiBtb2RlIG9uIDUxMTEKQEAgLTExMjMsMjEgKzEwOTgsOCBAQAogCQkJCSAgICBBUjVLX1RYQ0ZHX0JfTU9ERSk7CiAJCX0KIAotCQkvKgotCQkgKiBJbiBjYXNlIGEgZml4ZWQgYW50ZW5uYSB3YXMgc2V0IGFzIGRlZmF1bHQKLQkJICogdXNlIHRoZSBzYW1lIHN3aXRjaCB0YWJsZSB0d2ljZS4KLQkJICovCi0JCWlmIChhaC0+YWhfYW50X21vZGUgPT0gQVI1S19BTlRNT0RFX0ZJWEVEX0EpCi0JCQkJYW50WzBdID0gYW50WzFdID0gQVI1S19BTlRfU1dUQUJMRV9BOwotCQllbHNlIGlmIChhaC0+YWhfYW50X21vZGUgPT0gQVI1S19BTlRNT0RFX0ZJWEVEX0IpCi0JCQkJYW50WzBdID0gYW50WzFdID0gQVI1S19BTlRfU1dUQUJMRV9COwotCQllbHNlIHsKLQkJCWFudFswXSA9IEFSNUtfQU5UX1NXVEFCTEVfQTsKLQkJCWFudFsxXSA9IEFSNUtfQU5UX1NXVEFCTEVfQjsKLQkJfQotCiAJCS8qIENvbW1pdCB2YWx1ZXMgZnJvbSBFRVBST00gKi8KLQkJYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncyhhaCwgY2hhbm5lbCwgYW50LCBlZV9tb2RlKTsKKwkJYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncyhhaCwgY2hhbm5lbCwgZWVfbW9kZSk7CiAKIAl9IGVsc2UgewogCQkvKgpAQCAtMTE3NSw4ICsxMTM3LDYgQEAKIAkJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHRzZl9sbywgQVI1S19UU0ZfTDMyKTsKIAkJCX0KIAkJfQotCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc19hbnQsIEFSNUtfREVGQVVMVF9BTlRFTk5BKTsKIAl9CiAKIAkvKiBMZWRzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3N5c2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc1N2RlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3N5c2ZzLmMKQEAgLTAsMCArMSwxMTYgQEAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgImJhc2UuaCIKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorCisjZGVmaW5lIFNJTVBMRV9TSE9XX1NUT1JFKG5hbWUsIGdldCwgc2V0KQkJCQlcCitzdGF0aWMgc3NpemVfdCBhdGg1a19hdHRyX3Nob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKKwkJCWNoYXIgKmJ1ZikJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZ2V0KTsgCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGF0aDVrX2F0dHJfc3RvcmVfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlpbnQgdmFsOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdmFsID0gKGludClzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJc2V0KHNjLT5haCwgdmFsKTsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08gfCBTX0lXVVNSLAkJCQlcCisJCSAgIGF0aDVrX2F0dHJfc2hvd18jI25hbWUsIGF0aDVrX2F0dHJfc3RvcmVfIyNuYW1lKQorCisjZGVmaW5lIFNJTVBMRV9TSE9XKG5hbWUsIGdldCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBhdGg1a19hdHRyX3Nob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKKwkJCWNoYXIgKmJ1ZikJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZ2V0KTsgCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhdGg1a19hdHRyX3Nob3dfIyNuYW1lLCBOVUxMKQorCisvKioqIEFOSSAqKiovCisKK1NJTVBMRV9TSE9XX1NUT1JFKGFuaV9tb2RlLCBzYy0+YW5pX3N0YXRlLmFuaV9tb2RlLCBhdGg1a19hbmlfaW5pdCk7CitTSU1QTEVfU0hPV19TVE9SRShub2lzZV9pbW11bml0eV9sZXZlbCwgc2MtPmFuaV9zdGF0ZS5ub2lzZV9pbW1fbGV2ZWwsCisJCQlhdGg1a19hbmlfc2V0X25vaXNlX2ltbXVuaXR5X2xldmVsKTsKK1NJTVBMRV9TSE9XX1NUT1JFKHNwdXJfbGV2ZWwsIHNjLT5hbmlfc3RhdGUuc3B1cl9sZXZlbCwKKwkJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbCk7CitTSU1QTEVfU0hPV19TVE9SRShmaXJzdGVwX2xldmVsLCBzYy0+YW5pX3N0YXRlLmZpcnN0ZXBfbGV2ZWwsCisJCQlhdGg1a19hbmlfc2V0X2ZpcnN0ZXBfbGV2ZWwpOworU0lNUExFX1NIT1dfU1RPUkUob2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24sIHNjLT5hbmlfc3RhdGUub2ZkbV93ZWFrX3NpZywKKwkJCWF0aDVrX2FuaV9zZXRfb2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24pOworU0lNUExFX1NIT1dfU1RPUkUoY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbiwgc2MtPmFuaV9zdGF0ZS5jY2tfd2Vha19zaWcsCisJCQlhdGg1a19hbmlfc2V0X2Nja193ZWFrX3NpZ25hbF9kZXRlY3Rpb24pOworU0lNUExFX1NIT1coc3B1cl9sZXZlbF9tYXgsIHNjLT5hbmlfc3RhdGUubWF4X3NwdXJfbGV2ZWwpOworCitzdGF0aWMgc3NpemVfdCBhdGg1a19hdHRyX3Nob3dfbm9pc2VfaW1tdW5pdHlfbGV2ZWxfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBBVEg1S19BTklfTUFYX05PSVNFX0lNTV9MVkwpOworfQorc3RhdGljIERFVklDRV9BVFRSKG5vaXNlX2ltbXVuaXR5X2xldmVsX21heCwgU19JUlVHTywKKwkJICAgYXRoNWtfYXR0cl9zaG93X25vaXNlX2ltbXVuaXR5X2xldmVsX21heCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGF0aDVrX2F0dHJfc2hvd19maXJzdGVwX2xldmVsX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgQVRINUtfQU5JX01BWF9GSVJTVEVQX0xWTCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZmlyc3RlcF9sZXZlbF9tYXgsIFNfSVJVR08sCisJCSAgIGF0aDVrX2F0dHJfc2hvd19maXJzdGVwX2xldmVsX21heCwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphdGg1a19zeXNmc19lbnRyaWVzX2FuaVtdID0geworCSZkZXZfYXR0cl9hbmlfbW9kZS5hdHRyLAorCSZkZXZfYXR0cl9ub2lzZV9pbW11bml0eV9sZXZlbC5hdHRyLAorCSZkZXZfYXR0cl9zcHVyX2xldmVsLmF0dHIsCisJJmRldl9hdHRyX2ZpcnN0ZXBfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfb2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24uYXR0ciwKKwkmZGV2X2F0dHJfY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbi5hdHRyLAorCSZkZXZfYXR0cl9ub2lzZV9pbW11bml0eV9sZXZlbF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfc3B1cl9sZXZlbF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfZmlyc3RlcF9sZXZlbF9tYXguYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdGg1a19hdHRyaWJ1dGVfZ3JvdXBfYW5pID0geworCS5uYW1lID0gImFuaSIsCisJLmF0dHJzID0gYXRoNWtfc3lzZnNfZW50cmllc19hbmksCit9OworCisKKy8qKiogcmVnaXN0ZXIgLyB1bnJlZ2lzdGVyICoqKi8KKworaW50CithdGg1a19zeXNmc19yZWdpc3RlcihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzYy0+cGRldi0+ZGV2OworCWludCBlcnI7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmF0aDVrX2F0dHJpYnV0ZV9ncm91cF9hbmkpOworCWlmIChlcnIpIHsKKwkJQVRINUtfRVJSKHNjLCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBncm91cFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2F0aDVrX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2MtPnBkZXYtPmRldjsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmYXRoNWtfYXR0cmlidXRlX2dyb3VwX2FuaSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUKaW5kZXggZGQxMTJiZS4uOTczYWU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZQpAQCAtMzIsNyArMzIsOCBAQAogCQltYWMubyBcCiAJCWFyOTAwMl9tYWMubyBcCiAJCWFyOTAwM19tYWMubyBcCi0JCWFyOTAwM19lZXByb20ubworCQlhcjkwMDNfZWVwcm9tLm8gXAorCQlhcjkwMDNfcGFwcmQubwogCiBvYmotJChDT05GSUdfQVRIOUtfSFcpICs9IGF0aDlrX2h3Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jCmluZGV4IDg1ZmRkMjYuLjFhOTg0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYWhiLmMKQEAgLTEzMSwxMSArMTMxLDggQEAKIAogCWFoID0gc2MtPnNjX2FoOwogCWF0aDlrX2h3X25hbWUoYWgsIGh3X25hbWUsIHNpemVvZihod19uYW1lKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAgICAiJXM6ICVzIG1lbT0weCVseCwgaXJxPSVkXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksCi0JICAgICAgIGh3X25hbWUsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKW1lbSwgaXJxKTsKKwl3aXBoeV9pbmZvKGh3LT53aXBoeSwgIiVzIG1lbT0weCVseCwgaXJxPSVkXG4iLAorCQkgICBod19uYW1lLCAodW5zaWduZWQgbG9uZyltZW0sIGlycSk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jCmluZGV4IGJhOGIyMGYuLmNjNjQ4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYW5pLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KICAqCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKQEAgLTE3LDggKzE3LDk5IEBACiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJody1vcHMuaCIKIAotc3RhdGljIGludCBhdGg5a19od19nZXRfYW5pX2NoYW5uZWxfaWR4KHN0cnVjdCBhdGhfaHcgKmFoLAotCQkJCQlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKK3N0cnVjdCBhbmlfb2ZkbV9sZXZlbF9lbnRyeSB7CisJaW50IHNwdXJfaW1tdW5pdHlfbGV2ZWw7CisJaW50IGZpcl9zdGVwX2xldmVsOworCWludCBvZmRtX3dlYWtfc2lnbmFsX29uOworfTsKKworLyogdmFsdWVzIGhlcmUgYXJlIHJlbGF0aXZlIHRvIHRoZSBJTkkgKi8KKworLyoKKyAqIExlZ2VuZDoKKyAqCisgKiBTSTogU3B1ciBpbW11bml0eQorICogRlM6IEZJUiBTdGVwCisgKiBXUzogT0ZETSAvIENDSyBXZWFrIFNpZ25hbCBkZXRlY3Rpb24KKyAqIE1SQy1DQ0s6IE1heGltYWwgUmF0aW8gQ29tYmluaW5nIGZvciBDQ0sKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFuaV9vZmRtX2xldmVsX2VudHJ5IG9mZG1fbGV2ZWxfdGFibGVbXSA9IHsKKwkvKiBTSSAgRlMgIFdTICovCisJeyAgMCwgIDAsICAxICB9LCAvKiBsdmwgMCAqLworCXsgIDEsICAxLCAgMSAgfSwgLyogbHZsIDEgKi8KKwl7ICAyLCAgMiwgIDEgIH0sIC8qIGx2bCAyICovCisJeyAgMywgIDIsICAxICB9LCAvKiBsdmwgMyAgKGRlZmF1bHQpICovCisJeyAgNCwgIDMsICAxICB9LCAvKiBsdmwgNCAqLworCXsgIDUsICA0LCAgMSAgfSwgLyogbHZsIDUgKi8KKwl7ICA2LCAgNSwgIDEgIH0sIC8qIGx2bCA2ICovCisJeyAgNywgIDYsICAxICB9LCAvKiBsdmwgNyAqLworCXsgIDcsICA3LCAgMSAgfSwgLyogbHZsIDggKi8KKwl7ICA3LCAgOCwgIDAgIH0gIC8qIGx2bCA5ICovCit9OworI2RlZmluZSBBVEg5S19BTklfT0ZETV9OVU1fTEVWRUwgXAorCShzaXplb2Yob2ZkbV9sZXZlbF90YWJsZSkvc2l6ZW9mKG9mZG1fbGV2ZWxfdGFibGVbMF0pKQorI2RlZmluZSBBVEg5S19BTklfT0ZETV9NQVhfTEVWRUwgXAorCShBVEg5S19BTklfT0ZETV9OVU1fTEVWRUwtMSkKKyNkZWZpbmUgQVRIOUtfQU5JX09GRE1fREVGX0xFVkVMIFwKKwkzIC8qIGRlZmF1bHQgbGV2ZWwgLSBtYXRjaGVzIHRoZSBJTkkgc2V0dGluZ3MgKi8KKworLyoKKyAqIE1SQyAoTWF4aW1hbCBSYXRpbyBDb21iaW5pbmcpIGhhcyBhbHdheXMgYmVlbiB1c2VkIHdpdGggbXVsdGktYW50ZW5uYSBvZmRtLgorICogV2l0aCBPRkRNIGZvciBzaW5nbGUgc3RyZWFtIHlvdSBqdXN0IGFkZCB1cCBhbGwgYW50ZW5uYSBpbnB1dHMsIHlvdSdyZQorICogb25seSBpbnRlcmVzdGVkIGluIHdoYXQgeW91IGdldCBhZnRlciBGRlQuIFNpZ25hbCBhbGlnbWVudCBpcyBhbHNvIG5vdAorICogcmVxdWlyZWQgZm9yIE9GRE0gYmVjYXVzZSBhbnkgcGhhc2UgZGlmZmVyZW5jZSBhZGRzIHVwIGluIHRoZSBmcmVxdWVuY3kKKyAqIGRvbWFpbi4KKyAqCisgKiBNUkMgcmVxdWlyZXMgZXh0cmEgd29yayBmb3IgdXNlIHdpdGggQ0NLLiBZb3UgbmVlZCB0byBhbGlnbiB0aGUgYW50ZW5uYQorICogc2lnbmFscyBmcm9tIHRoZSBkaWZmZXJlbnQgYW50ZW5uYSBiZWZvcmUgeW91IGNhbiBhZGQgdGhlIHNpZ25hbHMgdG9nZXRoZXIuCisgKiBZb3UgbmVlZCBhbGlnbWVudCBvZiBzaWduYWxzIGFzIENDSyBpcyBpbiB0aW1lIGRvbWFpbiwgc28gYWRkaXRpb24gY2FuIGNhbmNlbAorICogeW91ciBzaWduYWwgY29tcGxldGVseSBpZiBwaGFzZSBpcyAxODAgZGVncmVlcyAodGhpbmsgb2YgYWRkaW5nIHNpbmUgd2F2ZXMpLgorICogWW91IGFsc28gbmVlZCB0byByZW1vdmUgbm9pc2UgYmVmb3JlIHRoZSBhZGRpdGlvbiBhbmQgdGhpcyBpcyB3aGVyZSBBTkkKKyAqIE1SQyBDQ0sgY29tZXMgaW50byBwbGF5LiBPbmUgb2YgdGhlIGFudGVubmEgaW5wdXRzIG1heSBiZSBzdHJvbmdlciBidXQKKyAqIGxvd2VyIFNOUiwgc28ganVzdCBhZGRpbmcgYWZ0ZXIgYWxpZ25tZW50IGNhbiBiZSBkYW5nZXJvdXMuCisgKgorICogUmVnYXJkbGVzcyBvZiBhbGlnbm1lbnQgaW4gdGltZSwgdGhlIGFudGVubmEgc2lnbmFscyBhZGQgY29uc3RydWN0aXZlbHkgYWZ0ZXIKKyAqIEZGVCBhbmQgaW1wcm92ZSB5b3VyIHJlY2VwdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb246CisgKgorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXhpbWFsLXJhdGlvX2NvbWJpbmluZworICovCisKK3N0cnVjdCBhbmlfY2NrX2xldmVsX2VudHJ5IHsKKwlpbnQgZmlyX3N0ZXBfbGV2ZWw7CisJaW50IG1yY19jY2tfb247Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFuaV9jY2tfbGV2ZWxfZW50cnkgY2NrX2xldmVsX3RhYmxlW10gPSB7CisJLyogRlMgIE1SQy1DQ0sgICovCisJeyAgMCwgIDEgIH0sIC8qIGx2bCAwICovCisJeyAgMSwgIDEgIH0sIC8qIGx2bCAxICovCisJeyAgMiwgIDEgIH0sIC8qIGx2bCAyICAoZGVmYXVsdCkgKi8KKwl7ICAzLCAgMSAgfSwgLyogbHZsIDMgKi8KKwl7ICA0LCAgMCAgfSwgLyogbHZsIDQgKi8KKwl7ICA1LCAgMCAgfSwgLyogbHZsIDUgKi8KKwl7ICA2LCAgMCAgfSwgLyogbHZsIDYgKi8KKwl7ICA3LCAgMCAgfSwgLyogbHZsIDcgKG9ubHkgZm9yIGhpZ2ggcnNzaSkgKi8KKwl7ICA4LCAgMCAgfSAgLyogbHZsIDggKG9ubHkgZm9yIGhpZ2ggcnNzaSkgKi8KK307CisKKyNkZWZpbmUgQVRIOUtfQU5JX0NDS19OVU1fTEVWRUwgXAorCShzaXplb2YoY2NrX2xldmVsX3RhYmxlKS9zaXplb2YoY2NrX2xldmVsX3RhYmxlWzBdKSkKKyNkZWZpbmUgQVRIOUtfQU5JX0NDS19NQVhfTEVWRUwgXAorCShBVEg5S19BTklfQ0NLX05VTV9MRVZFTC0xKQorI2RlZmluZSBBVEg5S19BTklfQ0NLX01BWF9MRVZFTF9MT1dfUlNTSSBcCisJKEFUSDlLX0FOSV9DQ0tfTlVNX0xFVkVMLTMpCisjZGVmaW5lIEFUSDlLX0FOSV9DQ0tfREVGX0xFVkVMIFwKKwkyIC8qIGRlZmF1bHQgbGV2ZWwgLSBtYXRjaGVzIHRoZSBJTkkgc2V0dGluZ3MgKi8KKworLyogUHJpdmF0ZSB0byBhbmkuYyAqLworc3RhdGljIHZvaWQgYXRoOWtfaHdfYW5pX2xvd2VyX2ltbXVuaXR5KHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKS0+YW5pX2xvd2VyX2ltbXVuaXR5KGFoKTsKK30KKworaW50IGF0aDlrX2h3X2dldF9hbmlfY2hhbm5lbF9pZHgoc3RydWN0IGF0aF9odyAqYWgsCisJCQkJIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQogewogCWludCBpOwogCkBAIC00OCw3ICsxMzksNyBAQAogCXN0YXRzLT5iZWFjb25zICs9IFJFR19SRUFEKGFoLCBBUl9CRUFDT05fQ05UKTsKIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfYW5pX3Jlc3RhcnQoc3RydWN0IGF0aF9odyAqYWgpCitzdGF0aWMgdm9pZCBhdGg5a19hbmlfcmVzdGFydF9vbGQoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGFyNTQxNkFuaVN0YXRlICphbmlTdGF0ZTsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKQEAgLTk2LDcgKzE4Nyw0MiBAQAogCWFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDlrX2h3X2FuaV9vZmRtX2Vycl90cmlnZ2VyKHN0cnVjdCBhdGhfaHcgKmFoKQorc3RhdGljIHZvaWQgYXRoOWtfYW5pX3Jlc3RhcnRfbmV3KHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGU7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisKKwlpZiAoIURPX0FOSShhaCkpCisJCXJldHVybjsKKworCWFuaVN0YXRlID0gYWgtPmN1cmFuaTsKKwlhbmlTdGF0ZS0+bGlzdGVuVGltZSA9IDA7CisKKwlhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgPSAwOworCWFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlID0gMDsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkgICJXcml0aW5nIG9mZG1iYXNlPSUwOHggICBjY2tiYXNlPSUwOHhcbiIsCisJCSAgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlLAorCQkgIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKworCUVOQUJMRV9SRUdXUklURV9CVUZGRVIoYWgpOworCisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzIsIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLCBBUl9QSFlfRVJSX09GRE1fVElNSU5HKTsKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18yLCBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworCisJUkVHV1JJVEVfQlVGRkVSX0ZMVVNIKGFoKTsKKwlESVNBQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CisKKwlhdGg5a19od191cGRhdGVfbWlic3RhdHMoYWgsICZhaC0+YWhfbWliU3RhdHMpOworCisJYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCA9IDA7CisJYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfaHdfYW5pX29mZG1fZXJyX3RyaWdnZXJfb2xkKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZhdGg5a19od19jb21tb24oYWgpLT5ody0+Y29uZjsKIAlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlOwpAQCAtMTY4LDcgKzI5NCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg5a19od19hbmlfY2NrX2Vycl90cmlnZ2VyKHN0cnVjdCBhdGhfaHcgKmFoKQorc3RhdGljIHZvaWQgYXRoOWtfaHdfYW5pX2Nja19lcnJfdHJpZ2dlcl9vbGQoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmF0aDlrX2h3X2NvbW1vbihhaCktPmh3LT5jb25mOwogCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGU7CkBAIC0yMDYsNyArMzMyLDEyNSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfaHdfYW5pX2xvd2VyX2ltbXVuaXR5KHN0cnVjdCBhdGhfaHcgKmFoKQorLyogQWRqdXN0IHRoZSBPRkRNIE5vaXNlIEltbXVuaXR5IExldmVsICovCitzdGF0aWMgdm9pZCBhdGg5a19od19zZXRfb2ZkbV9uaWwoc3RydWN0IGF0aF9odyAqYWgsIHU4IGltbXVuaXR5TGV2ZWwpCit7CisJc3RydWN0IGFyNTQxNkFuaVN0YXRlICphbmlTdGF0ZSA9IGFoLT5jdXJhbmk7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJY29uc3Qgc3RydWN0IGFuaV9vZmRtX2xldmVsX2VudHJ5ICplbnRyeV9vZmRtOworCWNvbnN0IHN0cnVjdCBhbmlfY2NrX2xldmVsX2VudHJ5ICplbnRyeV9jY2s7CisKKwlhbmlTdGF0ZS0+bm9pc2VGbG9vciA9IEJFQUNPTl9SU1NJKGFoKTsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkgICIqKioqIG9mZG1sZXZlbCAlZD0+JWQsIHJzc2k9JWRbbG89JWQgaGk9JWRdXG4iLAorCQkgIGFuaVN0YXRlLT5vZmRtTm9pc2VJbW11bml0eUxldmVsLAorCQkgIGltbXVuaXR5TGV2ZWwsIGFuaVN0YXRlLT5ub2lzZUZsb29yLAorCQkgIGFuaVN0YXRlLT5yc3NpVGhyTG93LCBhbmlTdGF0ZS0+cnNzaVRockhpZ2gpOworCisJYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwgPSBpbW11bml0eUxldmVsOworCisJZW50cnlfb2ZkbSA9ICZvZmRtX2xldmVsX3RhYmxlW2FuaVN0YXRlLT5vZmRtTm9pc2VJbW11bml0eUxldmVsXTsKKwllbnRyeV9jY2sgPSAmY2NrX2xldmVsX3RhYmxlW2FuaVN0YXRlLT5jY2tOb2lzZUltbXVuaXR5TGV2ZWxdOworCisJaWYgKGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCAhPSBlbnRyeV9vZmRtLT5zcHVyX2ltbXVuaXR5X2xldmVsKQorCQlhdGg5a19od19hbmlfY29udHJvbChhaCwKKwkJCQkgICAgIEFUSDlLX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMLAorCQkJCSAgICAgZW50cnlfb2ZkbS0+c3B1cl9pbW11bml0eV9sZXZlbCk7CisKKwlpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCAhPSBlbnRyeV9vZmRtLT5maXJfc3RlcF9sZXZlbCAmJgorCSAgICBlbnRyeV9vZmRtLT5maXJfc3RlcF9sZXZlbCA+PSBlbnRyeV9jY2stPmZpcl9zdGVwX2xldmVsKQorCQlhdGg5a19od19hbmlfY29udHJvbChhaCwKKwkJCQkgICAgIEFUSDlLX0FOSV9GSVJTVEVQX0xFVkVMLAorCQkJCSAgICAgZW50cnlfb2ZkbS0+ZmlyX3N0ZXBfbGV2ZWwpOworCisJaWYgKChhaC0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkgICAgIGFoLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHx8CisJICAgIGFuaVN0YXRlLT5ub2lzZUZsb29yIDw9IGFuaVN0YXRlLT5yc3NpVGhySGlnaCkgeworCQlpZiAoYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorCQkJLyogZm9yY2Ugb24gb2ZkbSB3ZWFrIHNpZyBkZXRlY3QgKi8KKwkJCWF0aDlrX2h3X2FuaV9jb250cm9sKGFoLAorCQkJCUFUSDlLX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwKKwkJCQkJICAgICB0cnVlKTsKKwkJZWxzZSBpZiAoYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID09CisJCQkgZW50cnlfb2ZkbS0+b2ZkbV93ZWFrX3NpZ25hbF9vbikKKwkJCWF0aDlrX2h3X2FuaV9jb250cm9sKGFoLAorCQkJCUFUSDlLX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwKKwkJCQllbnRyeV9vZmRtLT5vZmRtX3dlYWtfc2lnbmFsX29uKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2FuaV9vZmRtX2Vycl90cmlnZ2VyX25ldyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlOworCisJaWYgKCFET19BTkkoYWgpKQorCQlyZXR1cm47CisKKwlhbmlTdGF0ZSA9IGFoLT5jdXJhbmk7CisKKwlpZiAoYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwgPCBBVEg5S19BTklfT0ZETV9NQVhfTEVWRUwpCisJCWF0aDlrX2h3X3NldF9vZmRtX25pbChhaCwgYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwgKyAxKTsKK30KKworLyoKKyAqIFNldCB0aGUgQU5JIHNldHRpbmdzIHRvIG1hdGNoIGFuIENDSyBsZXZlbC4KKyAqLworc3RhdGljIHZvaWQgYXRoOWtfaHdfc2V0X2Nja19uaWwoc3RydWN0IGF0aF9odyAqYWgsIHVfaW50OF90IGltbXVuaXR5TGV2ZWwpCit7CisJc3RydWN0IGFyNTQxNkFuaVN0YXRlICphbmlTdGF0ZSA9IGFoLT5jdXJhbmk7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJY29uc3Qgc3RydWN0IGFuaV9vZmRtX2xldmVsX2VudHJ5ICplbnRyeV9vZmRtOworCWNvbnN0IHN0cnVjdCBhbmlfY2NrX2xldmVsX2VudHJ5ICplbnRyeV9jY2s7CisKKwlhbmlTdGF0ZS0+bm9pc2VGbG9vciA9IEJFQUNPTl9SU1NJKGFoKTsKKwlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJICAiKioqKiBjY2tsZXZlbCAlZD0+JWQsIHJzc2k9JWRbbG89JWQgaGk9JWRdXG4iLAorCQkgIGFuaVN0YXRlLT5jY2tOb2lzZUltbXVuaXR5TGV2ZWwsIGltbXVuaXR5TGV2ZWwsCisJCSAgYW5pU3RhdGUtPm5vaXNlRmxvb3IsIGFuaVN0YXRlLT5yc3NpVGhyTG93LAorCQkgIGFuaVN0YXRlLT5yc3NpVGhySGlnaCk7CisKKwlpZiAoKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICAgYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKKwkgICAgYW5pU3RhdGUtPm5vaXNlRmxvb3IgPD0gYW5pU3RhdGUtPnJzc2lUaHJMb3cgJiYKKwkgICAgaW1tdW5pdHlMZXZlbCA+IEFUSDlLX0FOSV9DQ0tfTUFYX0xFVkVMX0xPV19SU1NJKQorCQlpbW11bml0eUxldmVsID0gQVRIOUtfQU5JX0NDS19NQVhfTEVWRUxfTE9XX1JTU0k7CisKKwlhbmlTdGF0ZS0+Y2NrTm9pc2VJbW11bml0eUxldmVsID0gaW1tdW5pdHlMZXZlbDsKKworCWVudHJ5X29mZG0gPSAmb2ZkbV9sZXZlbF90YWJsZVthbmlTdGF0ZS0+b2ZkbU5vaXNlSW1tdW5pdHlMZXZlbF07CisJZW50cnlfY2NrID0gJmNja19sZXZlbF90YWJsZVthbmlTdGF0ZS0+Y2NrTm9pc2VJbW11bml0eUxldmVsXTsKKworCWlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsICE9IGVudHJ5X2Njay0+ZmlyX3N0ZXBfbGV2ZWwgJiYKKwkgICAgZW50cnlfY2NrLT5maXJfc3RlcF9sZXZlbCA+PSBlbnRyeV9vZmRtLT5maXJfc3RlcF9sZXZlbCkKKwkJYXRoOWtfaHdfYW5pX2NvbnRyb2woYWgsCisJCQkJICAgICBBVEg5S19BTklfRklSU1RFUF9MRVZFTCwKKwkJCQkgICAgIGVudHJ5X2Njay0+ZmlyX3N0ZXBfbGV2ZWwpOworCisJLyogU2tpcCBNUkMgQ0NLIGZvciBwcmUgQVI5MDAzIGZhbWlsaWVzICovCisJaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQorCQlyZXR1cm47CisKKwlpZiAoYW5pU3RhdGUtPm1yY0NDS09mZiA9PSBlbnRyeV9jY2stPm1yY19jY2tfb24pCisJCWF0aDlrX2h3X2FuaV9jb250cm9sKGFoLAorCQkJCSAgICAgQVRIOUtfQU5JX01SQ19DQ0ssCisJCQkJICAgICBlbnRyeV9jY2stPm1yY19jY2tfb24pOworfQorCitzdGF0aWMgdm9pZCBhdGg5a19od19hbmlfY2NrX2Vycl90cmlnZ2VyX25ldyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlOworCisJaWYgKCFET19BTkkoYWgpKQorCQlyZXR1cm47CisKKwlhbmlTdGF0ZSA9IGFoLT5jdXJhbmk7CisKKwlpZiAoYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCA8IEFUSDlLX0FOSV9DQ0tfTUFYX0xFVkVMKQorCQlhdGg5a19od19zZXRfY2NrX25pbChhaCwgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCArIDEpOworfQorCitzdGF0aWMgdm9pZCBhdGg5a19od19hbmlfbG93ZXJfaW1tdW5pdHlfb2xkKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGU7CiAJaW50MzJfdCByc3NpOwpAQCAtMjU5LDkgKzUwMyw1MyBAQAogCX0KIH0KIAorLyoKKyAqIG9ubHkgbG93ZXIgZWl0aGVyIE9GRE0gb3IgQ0NLIGVycm9ycyBwZXIgdHVybgorICogd2UgbG93ZXIgdGhlIG90aGVyIG9uZSBuZXh0IHRpbWUKKyAqLworc3RhdGljIHZvaWQgYXRoOWtfaHdfYW5pX2xvd2VyX2ltbXVuaXR5X25ldyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlOworCisJYW5pU3RhdGUgPSBhaC0+Y3VyYW5pOworCisJLyogbG93ZXIgT0ZETSBub2lzZSBpbW11bml0eSAqLworCWlmIChhbmlTdGF0ZS0+b2ZkbU5vaXNlSW1tdW5pdHlMZXZlbCA+IDAgJiYKKwkgICAgKGFuaVN0YXRlLT5vZmRtc1R1cm4gfHwgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCA9PSAwKSkgeworCQlhdGg5a19od19zZXRfb2ZkbV9uaWwoYWgsIGFuaVN0YXRlLT5vZmRtTm9pc2VJbW11bml0eUxldmVsIC0gMSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBsb3dlciBDQ0sgbm9pc2UgaW1tdW5pdHkgKi8KKwlpZiAoYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCA+IDApCisJCWF0aDlrX2h3X3NldF9jY2tfbmlsKGFoLCBhbmlTdGF0ZS0+Y2NrTm9pc2VJbW11bml0eUxldmVsIC0gMSk7Cit9CisKK3N0YXRpYyB1OCBhdGg5a19od19jaGFuXzJfY2xvY2tyYXRlX21oeihzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiA9IGFoLT5jdXJjaGFuOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZhdGg5a19od19jb21tb24oYWgpLT5ody0+Y29uZjsKKwl1OCBjbG9ja3JhdGU7IC8qIGluIE1IeiAqLworCisJaWYgKCFhaC0+Y3VyY2hhbikgLyogc2hvdWxkIHJlYWxseSBjaGVjayBmb3IgQ0NLIGluc3RlYWQgKi8KKwkJY2xvY2tyYXRlID0gQVRIOUtfQ0xPQ0tfUkFURV9DQ0s7CisJZWxzZSBpZiAoY29uZi0+Y2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCQljbG9ja3JhdGUgPSBBVEg5S19DTE9DS19SQVRFXzJHSFpfT0ZETTsKKwllbHNlIGlmIChJU19DSEFOX0FfRkFTVF9DTE9DSyhhaCwgY2hhbikpCisJCWNsb2NrcmF0ZSA9IEFUSDlLX0NMT0NLX0ZBU1RfUkFURV81R0haX09GRE07CisJZWxzZQorCQljbG9ja3JhdGUgPSBBVEg5S19DTE9DS19SQVRFXzVHSFpfT0ZETTsKKworCWlmIChjb25mX2lzX2h0NDAoY29uZikpCisJCXJldHVybiBjbG9ja3JhdGUgKiAyOworCisJcmV0dXJuIGNsb2NrcmF0ZSAqIDI7Cit9CisKIHN0YXRpYyBpbnQzMl90IGF0aDlrX2h3X2FuaV9nZXRfbGlzdGVuX3RpbWUoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGFyNTQxNkFuaVN0YXRlICphbmlTdGF0ZTsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAl1MzIgdHhGcmFtZUNvdW50LCByeEZyYW1lQ291bnQsIGN5Y2xlQ291bnQ7CiAJaW50MzJfdCBsaXN0ZW5UaW1lOwogCkBAIC0yNzEsMTUgKzU1OSwzMSBAQAogCiAJYW5pU3RhdGUgPSBhaC0+Y3VyYW5pOwogCWlmIChhbmlTdGF0ZS0+Y3ljbGVDb3VudCA9PSAwIHx8IGFuaVN0YXRlLT5jeWNsZUNvdW50ID4gY3ljbGVDb3VudCkgewotCiAJCWxpc3RlblRpbWUgPSAwOwogCQlhaC0+c3RhdHMuYXN0X2FuaV9semVybysrOworCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCSAgIjFzdCBjYWxsOiBhbmlTdGF0ZS0+Y3ljbGVDb3VudD0lZFxuIiwKKwkJCSAgYW5pU3RhdGUtPmN5Y2xlQ291bnQpOwogCX0gZWxzZSB7CiAJCWludDMyX3QgY2NkZWx0YSA9IGN5Y2xlQ291bnQgLSBhbmlTdGF0ZS0+Y3ljbGVDb3VudDsKIAkJaW50MzJfdCByZmRlbHRhID0gcnhGcmFtZUNvdW50IC0gYW5pU3RhdGUtPnJ4RnJhbWVDb3VudDsKIAkJaW50MzJfdCB0ZmRlbHRhID0gdHhGcmFtZUNvdW50IC0gYW5pU3RhdGUtPnR4RnJhbWVDb3VudDsKLQkJbGlzdGVuVGltZSA9IChjY2RlbHRhIC0gcmZkZWx0YSAtIHRmZGVsdGEpIC8gNDQwMDA7CisJCWludDMyX3QgY2xvY2tfcmF0ZTsKKworCQkvKgorCQkgKiBjb252ZXJ0IEhXIGNvdW50ZXIgdmFsdWVzIHRvIG1zIHVzaW5nIG1vZGUKKwkJICogc3BlY2lmaXggY2xvY2sgcmF0ZQorCQkgKi8KKwkJY2xvY2tfcmF0ZSA9IGF0aDlrX2h3X2NoYW5fMl9jbG9ja3JhdGVfbWh6KGFoKSAqIDEwMDA7OworCisJCWxpc3RlblRpbWUgPSAoY2NkZWx0YSAtIHJmZGVsdGEgLSB0ZmRlbHRhKSAvIGNsb2NrX3JhdGU7CisKKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkgICJjeWNsZWNvdW50PSVkLCByZmNvdW50PSVkLCAiCisJCQkgICJ0ZmNvdW50PSVkLCBsaXN0ZW5UaW1lPSVkIENMT0NLX1JBVEU9JWRcbiIsCisJCQkgIGNjZGVsdGEsIHJmZGVsdGEsIHRmZGVsdGEsIGxpc3RlblRpbWUsIGNsb2NrX3JhdGUpOwogCX0KKwogCWFuaVN0YXRlLT5jeWNsZUNvdW50ID0gY3ljbGVDb3VudDsKIAlhbmlTdGF0ZS0+dHhGcmFtZUNvdW50ID0gdHhGcmFtZUNvdW50OwogCWFuaVN0YXRlLT5yeEZyYW1lQ291bnQgPSByeEZyYW1lQ291bnQ7CkBAIC0yODcsNyArNTkxLDcgQEAKIAlyZXR1cm4gbGlzdGVuVGltZTsKIH0KIAotdm9pZCBhdGg5a19hbmlfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgpCitzdGF0aWMgdm9pZCBhdGg5a19hbmlfcmVzZXRfb2xkKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGlzX3NjYW5uaW5nKQogewogCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGU7CiAJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4gPSBhaC0+Y3VyY2hhbjsKQEAgLTM0MCw3ICs2NDQsNyBAQAogCQkJYWgtPmN1cmFuaS0+Y2NrVHJpZ0xvdyA9CiAJCQkJYWgtPmNvbmZpZy5jY2tfdHJpZ19sb3c7CiAJCX0KLQkJYXRoOWtfYW5pX3Jlc3RhcnQoYWgpOworCQlhdGg5a19hbmlfcmVzdGFydF9vbGQoYWgpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNjIsNyArNjY2LDcgQEAKIAogCWF0aDlrX2h3X3NldHJ4ZmlsdGVyKGFoLCBhdGg5a19od19nZXRyeGZpbHRlcihhaCkgJgogCQkJICAgICB+QVRIOUtfUlhfRklMVEVSX1BIWUVSUik7Ci0JYXRoOWtfYW5pX3Jlc3RhcnQoYWgpOworCWF0aDlrX2FuaV9yZXN0YXJ0X29sZChhaCk7CiAKIAlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKIApAQCAtMzczLDggKzY3NywxMDIgQEAKIAlESVNBQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CiB9CiAKLXZvaWQgYXRoOWtfaHdfYW5pX21vbml0b3Ioc3RydWN0IGF0aF9odyAqYWgsCi0JCQkgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQorLyoKKyAqIFJlc3RvcmUgdGhlIEFOSSBwYXJhbWV0ZXJzIGluIHRoZSBIQUwgYW5kIHJlc2V0IHRoZSBzdGF0aXN0aWNzLgorICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IGhhcmR3YXJlIHJlc2V0IGFuZCBmb3IKKyAqIGV2ZXJ5IGNoYW5uZWwgY2hhbmdlLgorICovCitzdGF0aWMgdm9pZCBhdGg5a19hbmlfcmVzZXRfbmV3KHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGlzX3NjYW5uaW5nKQoreworCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGUgPSBhaC0+Y3VyYW5pOworCXN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuID0gYWgtPmN1cmNoYW47CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisKKwlpZiAoIURPX0FOSShhaCkpCisJCXJldHVybjsKKworCUJVR19PTihhbmlTdGF0ZSA9PSBOVUxMKTsKKwlhaC0+c3RhdHMuYXN0X2FuaV9yZXNldCsrOworCisJLyogb25seSBhbGxvdyBhIHN1YnNldCBvZiBmdW5jdGlvbnMgaW4gQVAgbW9kZSAqLworCWlmIChhaC0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJCWlmIChJU19DSEFOXzJHSFooY2hhbikpIHsKKwkJCWFoLT5hbmlfZnVuY3Rpb24gPSAoQVRIOUtfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwgfAorCQkJCQkgICAgQVRIOUtfQU5JX0ZJUlNURVBfTEVWRUwpOworCQkJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCisJCQkJYWgtPmFuaV9mdW5jdGlvbiB8PSBBVEg5S19BTklfTVJDX0NDSzsKKwkJfSBlbHNlCisJCQlhaC0+YW5pX2Z1bmN0aW9uID0gMDsKKwl9CisKKwkvKiBhbHdheXMgYWxsb3cgbW9kZSAob24vb2ZmKSB0byBiZSBjb250cm9sbGVkICovCisJYWgtPmFuaV9mdW5jdGlvbiB8PSBBVEg5S19BTklfTU9ERTsKKworCWlmIChpc19zY2FubmluZyB8fAorCSAgICAoYWgtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJICAgICBhaC0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSkgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBzY2FubmluZyBvciBpbiBBUCBtb2RlLCB0aGUgZGVmYXVsdHMgKGluaSkKKwkJICogc2hvdWxkIGJlIGluIHBsYWNlLiBGb3IgYW4gQVAgd2UgYXNzdW1lIHRoZSBoaXN0b3JpY2FsCisJCSAqIGxldmVscyBmb3IgdGhpcyBjaGFubmVsIGFyZSBwcm9iYWJseSBvdXRkYXRlZCBzbyBzdGFydAorCQkgKiBmcm9tIGRlZmF1bHRzIGluc3RlYWQuCisJCSAqLworCQlpZiAoYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwgIT0KKwkJICAgIEFUSDlLX0FOSV9PRkRNX0RFRl9MRVZFTCB8fAorCQkgICAgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCAhPQorCQkgICAgQVRIOUtfQU5JX0NDS19ERUZfTEVWRUwpIHsKKwkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJCSAgIlJlc3RvcmUgZGVmYXVsdHM6IG9wbW9kZSAldSAiCisJCQkJICAiY2hhbiAlZCBNaHovMHgleCBpc19zY2FubmluZz0lZCAiCisJCQkJICAib2ZkbTolZCBjY2s6JWRcbiIsCisJCQkJICBhaC0+b3Btb2RlLAorCQkJCSAgY2hhbi0+Y2hhbm5lbCwKKwkJCQkgIGNoYW4tPmNoYW5uZWxGbGFncywKKwkJCQkgIGlzX3NjYW5uaW5nLAorCQkJCSAgYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwsCisJCQkJICBhbmlTdGF0ZS0+Y2NrTm9pc2VJbW11bml0eUxldmVsKTsKKworCQkJYXRoOWtfaHdfc2V0X29mZG1fbmlsKGFoLCBBVEg5S19BTklfT0ZETV9ERUZfTEVWRUwpOworCQkJYXRoOWtfaHdfc2V0X2Nja19uaWwoYWgsIEFUSDlLX0FOSV9DQ0tfREVGX0xFVkVMKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIHJlc3RvcmUgaGlzdG9yaWNhbCBsZXZlbHMgZm9yIHRoaXMgY2hhbm5lbAorCQkgKi8KKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkgICJSZXN0b3JlIGhpc3Rvcnk6IG9wbW9kZSAldSAiCisJCQkgICJjaGFuICVkIE1oei8weCV4IGlzX3NjYW5uaW5nPSVkICIKKwkJCSAgIm9mZG06JWQgY2NrOiVkXG4iLAorCQkJICBhaC0+b3Btb2RlLAorCQkJICBjaGFuLT5jaGFubmVsLAorCQkJICBjaGFuLT5jaGFubmVsRmxhZ3MsCisJCQkgIGlzX3NjYW5uaW5nLAorCQkJICBhbmlTdGF0ZS0+b2ZkbU5vaXNlSW1tdW5pdHlMZXZlbCwKKwkJCSAgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCk7CisKKwkJCWF0aDlrX2h3X3NldF9vZmRtX25pbChhaCwKKwkJCQkJICAgICAgYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwpOworCQkJYXRoOWtfaHdfc2V0X2Nja19uaWwoYWgsCisJCQkJCSAgICAgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCk7CisJfQorCisJLyoKKwkgKiBlbmFibGUgcGh5IGNvdW50ZXJzIGlmIGh3IHN1cHBvcnRzIG9yIGlmIG5vdCwgZW5hYmxlIHBoeQorCSAqIGludGVycnVwdHMgKHNvIHdlIGNhbiBjb3VudCBlYWNoIG9uZSkKKwkgKi8KKwlhdGg5a19hbmlfcmVzdGFydF9uZXcoYWgpOworCisJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLCBBUl9QSFlfRVJSX09GRE1fVElNSU5HKTsKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18yLCBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworCisJUkVHV1JJVEVfQlVGRkVSX0ZMVVNIKGFoKTsKKwlESVNBQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2FuaV9tb25pdG9yX29sZChzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGU7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CkBAIC0zOTAsNyArNzg4LDcgQEAKIAlsaXN0ZW5UaW1lID0gYXRoOWtfaHdfYW5pX2dldF9saXN0ZW5fdGltZShhaCk7CiAJaWYgKGxpc3RlblRpbWUgPCAwKSB7CiAJCWFoLT5zdGF0cy5hc3RfYW5pX2xuZWcrKzsKLQkJYXRoOWtfYW5pX3Jlc3RhcnQoYWgpOworCQlhdGg5a19hbmlfcmVzdGFydF9vbGQoYWgpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NDQsMjEgKzg0MiwxNjYgQEAKIAkJICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA8PSBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCiAJCSAgICBhbmlTdGF0ZS0+Y2NrVHJpZ0xvdyAvIDEwMDApCiAJCQlhdGg5a19od19hbmlfbG93ZXJfaW1tdW5pdHkoYWgpOwotCQlhdGg5a19hbmlfcmVzdGFydChhaCk7CisJCWF0aDlrX2FuaV9yZXN0YXJ0X29sZChhaCk7CiAJfSBlbHNlIGlmIChhbmlTdGF0ZS0+bGlzdGVuVGltZSA+IGFoLT5hbmlwZXJpb2QpIHsKIAkJaWYgKGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgPiBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCiAJCSAgICBhbmlTdGF0ZS0+b2ZkbVRyaWdIaWdoIC8gMTAwMCkgewotCQkJYXRoOWtfaHdfYW5pX29mZG1fZXJyX3RyaWdnZXIoYWgpOwotCQkJYXRoOWtfYW5pX3Jlc3RhcnQoYWgpOworCQkJYXRoOWtfaHdfYW5pX29mZG1fZXJyX3RyaWdnZXJfb2xkKGFoKTsKKwkJCWF0aDlrX2FuaV9yZXN0YXJ0X29sZChhaCk7CiAJCX0gZWxzZSBpZiAoYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ID4KIAkJCSAgIGFuaVN0YXRlLT5saXN0ZW5UaW1lICogYW5pU3RhdGUtPmNja1RyaWdIaWdoIC8KIAkJCSAgIDEwMDApIHsKLQkJCWF0aDlrX2h3X2FuaV9jY2tfZXJyX3RyaWdnZXIoYWgpOwotCQkJYXRoOWtfYW5pX3Jlc3RhcnQoYWgpOworCQkJYXRoOWtfaHdfYW5pX2Nja19lcnJfdHJpZ2dlcl9vbGQoYWgpOworCQkJYXRoOWtfYW5pX3Jlc3RhcnRfb2xkKGFoKTsKIAkJfQogCX0KIH0KLUVYUE9SVF9TWU1CT0woYXRoOWtfaHdfYW5pX21vbml0b3IpOworCitzdGF0aWMgdm9pZCBhdGg5a19od19hbmlfbW9uaXRvcl9uZXcoc3RydWN0IGF0aF9odyAqYWgsCisJCQkJICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCWludDMyX3QgbGlzdGVuVGltZTsKKwl1MzIgcGh5Q250MSwgcGh5Q250MjsKKwl1MzIgb2ZkbVBoeUVyckNudCwgY2NrUGh5RXJyQ250OworCXUzMiBvZmRtUGh5RXJyUmF0ZSwgY2NrUGh5RXJyUmF0ZTsKKworCWlmICghRE9fQU5JKGFoKSkKKwkJcmV0dXJuOworCisJYW5pU3RhdGUgPSBhaC0+Y3VyYW5pOworCWlmIChXQVJOX09OKCFhbmlTdGF0ZSkpCisJCXJldHVybjsKKworCWxpc3RlblRpbWUgPSBhdGg5a19od19hbmlfZ2V0X2xpc3Rlbl90aW1lKGFoKTsKKwlpZiAobGlzdGVuVGltZSA8PSAwKSB7CisJCWFoLT5zdGF0cy5hc3RfYW5pX2xuZWcrKzsKKwkJLyogcmVzdGFydCBBTkkgcGVyaW9kIGlmIGxpc3RlblRpbWUgaXMgaW52YWxpZCAqLworCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCSAgImxpc3RlblRpbWU9JWQgLSBvbiBuZXcgYW5pIG1vbml0b3JcbiIsCisJCQkgIGxpc3RlblRpbWUpOworCQlhdGg5a19hbmlfcmVzdGFydF9uZXcoYWgpOworCQlyZXR1cm47CisJfQorCisJYW5pU3RhdGUtPmxpc3RlblRpbWUgKz0gbGlzdGVuVGltZTsKKworCWF0aDlrX2h3X3VwZGF0ZV9taWJzdGF0cyhhaCwgJmFoLT5haF9taWJTdGF0cyk7CisKKwlwaHlDbnQxID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9FUlJfMSk7CisJcGh5Q250MiA9IFJFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzIpOworCisJaWYgKHBoeUNudDEgPCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgfHwKKwkgICAgcGh5Q250MiA8IGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKSB7CisJCWlmIChwaHlDbnQxIDwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlKSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICJwaHlDbnQxIDB4JXgsIHJlc2V0dGluZyAiCisJCQkJICAiY291bnRlciB2YWx1ZSB0byAweCV4XG4iLAorCQkJCSAgcGh5Q250MSwKKwkJCQkgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMSwKKwkJCQkgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLAorCQkJCSAgQVJfUEhZX0VSUl9PRkRNX1RJTUlORyk7CisJCX0KKwkJaWYgKHBoeUNudDIgPCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSkgeworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAicGh5Q250MiAweCV4LCByZXNldHRpbmcgIgorCQkJCSAgImNvdW50ZXIgdmFsdWUgdG8gMHgleFxuIiwKKwkJCQkgIHBoeUNudDIsCisJCQkJICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwKKwkJCQkgIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKwkJCVJFR19XUklURShhaCwgQVJfUEhZX0VSUl9NQVNLXzIsCisJCQkJICBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlvZmRtUGh5RXJyQ250ID0gcGh5Q250MSAtIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZTsKKwlhaC0+c3RhdHMuYXN0X2FuaV9vZmRtZXJycyArPQorCQlvZmRtUGh5RXJyQ250IC0gYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudDsKKwlhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID0gb2ZkbVBoeUVyckNudDsKKworCWNja1BoeUVyckNudCA9IHBoeUNudDIgLSBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZTsKKwlhaC0+c3RhdHMuYXN0X2FuaV9jY2tlcnJzICs9CisJCWNja1BoeUVyckNudCAtIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudDsKKwlhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPSBjY2tQaHlFcnJDbnQ7CisKKwlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJICAiRXJyb3JzOiBPRkRNPTB4JTA4eC0weCUwOHg9JWQgICAiCisJCSAgIkNDSz0weCUwOHgtMHglMDh4PSVkXG4iLAorCQkgIHBoeUNudDEsCisJCSAgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlLAorCQkgIG9mZG1QaHlFcnJDbnQsCisJCSAgcGh5Q250MiwKKwkJICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSwKKwkJICBjY2tQaHlFcnJDbnQpOworCisJb2ZkbVBoeUVyclJhdGUgPSBhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ICogMTAwMCAvCisJCQkgYW5pU3RhdGUtPmxpc3RlblRpbWU7CisJY2NrUGh5RXJyUmF0ZSA9ICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgKiAxMDAwIC8KKwkJCSBhbmlTdGF0ZS0+bGlzdGVuVGltZTsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkgICJsaXN0ZW5UaW1lPSVkIE9GRE06JWQgZXJycz0lZC9zIENDSzolZCAiCisJCSAgImVycnM9JWQvcyBvZmRtX3R1cm49JWRcbiIsCisJCSAgbGlzdGVuVGltZSwgYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwsCisJCSAgb2ZkbVBoeUVyclJhdGUsIGFuaVN0YXRlLT5jY2tOb2lzZUltbXVuaXR5TGV2ZWwsCisJCSAgY2NrUGh5RXJyUmF0ZSwgYW5pU3RhdGUtPm9mZG1zVHVybik7CisKKwlpZiAoYW5pU3RhdGUtPmxpc3RlblRpbWUgPiA1ICogYWgtPmFuaXBlcmlvZCkgeworCQlpZiAob2ZkbVBoeUVyclJhdGUgPD0gYW5pU3RhdGUtPm9mZG1UcmlnTG93ICYmCisJCSAgICBjY2tQaHlFcnJSYXRlIDw9IGFuaVN0YXRlLT5jY2tUcmlnTG93KSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICIxLiBsaXN0ZW5UaW1lPSVkIE9GRE06JWQgZXJycz0lZC9zKDwlZCkgICIKKwkJCQkgICJDQ0s6JWQgZXJycz0lZC9zKDwlZCkgLT4gIgorCQkJCSAgImF0aDlrX2h3X2FuaV9sb3dlcl9pbW11bml0eSgpXG4iLAorCQkJCSAgYW5pU3RhdGUtPmxpc3RlblRpbWUsCisJCQkJICBhbmlTdGF0ZS0+b2ZkbU5vaXNlSW1tdW5pdHlMZXZlbCwKKwkJCQkgIG9mZG1QaHlFcnJSYXRlLAorCQkJCSAgYW5pU3RhdGUtPm9mZG1UcmlnTG93LAorCQkJCSAgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCwKKwkJCQkgIGNja1BoeUVyclJhdGUsCisJCQkJICBhbmlTdGF0ZS0+Y2NrVHJpZ0xvdyk7CisJCQlhdGg5a19od19hbmlfbG93ZXJfaW1tdW5pdHkoYWgpOworCQkJYW5pU3RhdGUtPm9mZG1zVHVybiA9ICFhbmlTdGF0ZS0+b2ZkbXNUdXJuOworCQl9CisJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJICAiMSBsaXN0ZW5UaW1lPSVkIG9mZG09JWQvcyBjY2s9JWQvcyAtICIKKwkJCSAgImNhbGxpbmcgYXRoOWtfYW5pX3Jlc3RhcnRfbmV3KClcbiIsCisJCQkgIGFuaVN0YXRlLT5saXN0ZW5UaW1lLCBvZmRtUGh5RXJyUmF0ZSwgY2NrUGh5RXJyUmF0ZSk7CisJCWF0aDlrX2FuaV9yZXN0YXJ0X25ldyhhaCk7CisJfSBlbHNlIGlmIChhbmlTdGF0ZS0+bGlzdGVuVGltZSA+IGFoLT5hbmlwZXJpb2QpIHsKKwkJLyogY2hlY2sgdG8gc2VlIGlmIG5lZWQgdG8gcmFpc2UgaW1tdW5pdHkgKi8KKwkJaWYgKG9mZG1QaHlFcnJSYXRlID4gYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCAmJgorCQkgICAgKGNja1BoeUVyclJhdGUgPD0gYW5pU3RhdGUtPmNja1RyaWdIaWdoIHx8CisJCSAgICAgYW5pU3RhdGUtPm9mZG1zVHVybikpIHsKKwkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJCSAgIjIgbGlzdGVuVGltZT0lZCBPRkRNOiVkIGVycnM9JWQvcyg+JWQpIC0+ICIKKwkJCQkgICJhdGg5a19od19hbmlfb2ZkbV9lcnJfdHJpZ2dlcl9uZXcoKVxuIiwKKwkJCQkgIGFuaVN0YXRlLT5saXN0ZW5UaW1lLAorCQkJCSAgYW5pU3RhdGUtPm9mZG1Ob2lzZUltbXVuaXR5TGV2ZWwsCisJCQkJICBvZmRtUGh5RXJyUmF0ZSwKKwkJCQkgIGFuaVN0YXRlLT5vZmRtVHJpZ0hpZ2gpOworCQkJYXRoOWtfaHdfYW5pX29mZG1fZXJyX3RyaWdnZXJfbmV3KGFoKTsKKwkJCWF0aDlrX2FuaV9yZXN0YXJ0X25ldyhhaCk7CisJCQlhbmlTdGF0ZS0+b2ZkbXNUdXJuID0gZmFsc2U7CisJCX0gZWxzZSBpZiAoY2NrUGh5RXJyUmF0ZSA+IGFuaVN0YXRlLT5jY2tUcmlnSGlnaCkgeworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICIzIGxpc3RlblRpbWU9JWQgQ0NLOiVkIGVycnM9JWQvcyg+JWQpIC0+ICIKKwkJCQkgImF0aDlrX2h3X2FuaV9jY2tfZXJyX3RyaWdnZXJfbmV3KClcbiIsCisJCQkJIGFuaVN0YXRlLT5saXN0ZW5UaW1lLAorCQkJCSBhbmlTdGF0ZS0+Y2NrTm9pc2VJbW11bml0eUxldmVsLAorCQkJCSBjY2tQaHlFcnJSYXRlLAorCQkJCSBhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2gpOworCQkJYXRoOWtfaHdfYW5pX2Nja19lcnJfdHJpZ2dlcl9uZXcoYWgpOworCQkJYXRoOWtfYW5pX3Jlc3RhcnRfbmV3KGFoKTsKKwkJCWFuaVN0YXRlLT5vZmRtc1R1cm4gPSB0cnVlOworCQl9CisJfQorfQogCiB2b2lkIGF0aDlrX2VuYWJsZV9taWJfY291bnRlcnMoc3RydWN0IGF0aF9odyAqYWgpCiB7CkBAIC00OTUsNiArMTAzOCw3IEBACiAJUkVHX1dSSVRFKGFoLCBBUl9GSUxUX09GRE0sIDApOwogCVJFR19XUklURShhaCwgQVJfRklMVF9DQ0ssIDApOwogfQorRVhQT1JUX1NZTUJPTChhdGg5a19od19kaXNhYmxlX21pYl9jb3VudGVycyk7CiAKIHUzMiBhdGg5a19od19HZXRNaWJDeWNsZUNvdW50c1BjdChzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkgIHUzMiAqcnhjX3BjbnQsCkBAIC01NDIsNyArMTA4Niw3IEBACiAgKiBhbnkgb2YgdGhlIE1JQiBjb3VudGVycyBvdmVyZmxvdy90cmlnZ2VyIHNvIGRvbid0IGFzc3VtZSB3ZSdyZQogICogaGVyZSBiZWNhdXNlIGEgUEhZIGVycm9yIGNvdW50ZXIgdHJpZ2dlcmVkLgogICovCi12b2lkIGF0aDlrX2h3X3Byb2NtaWJldmVudChzdHJ1Y3QgYXRoX2h3ICphaCkKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X3Byb2NfbWliX2V2ZW50X29sZChzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAl1MzIgcGh5Q250MSwgcGh5Q250MjsKIApAQCAtNTU1LDggKzEwOTksMTUgQEAKIAkvKiBDbGVhciB0aGUgbWliIGNvdW50ZXJzIGFuZCBzYXZlIHRoZW0gaW4gdGhlIHN0YXRzICovCiAJYXRoOWtfaHdfdXBkYXRlX21pYnN0YXRzKGFoLCAmYWgtPmFoX21pYlN0YXRzKTsKIAotCWlmICghRE9fQU5JKGFoKSkKKwlpZiAoIURPX0FOSShhaCkpIHsKKwkJLyoKKwkJICogV2UgbXVzdCBhbHdheXMgY2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSBieQorCQkgKiByZXNldHRpbmcgdGhlIHBoeSBlcnJvciByZWdzLgorCQkgKi8KKwkJUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIDApOworCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgMCk7CiAJCXJldHVybjsKKwl9CiAKIAkvKiBOQjogdGhlc2UgYXJlIG5vdCByZXNldC1vbi1yZWFkICovCiAJcGh5Q250MSA9IFJFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzEpOwpAQCAtNTg0LDE0ICsxMTM1LDUxIEBACiAJCSAqIGNoZWNrIHdpbGwgbmV2ZXIgYmUgdHJ1ZS4KIAkJICovCiAJCWlmIChhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID4gYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCkKLQkJCWF0aDlrX2h3X2FuaV9vZmRtX2Vycl90cmlnZ2VyKGFoKTsKKwkJCWF0aDlrX2h3X2FuaV9vZmRtX2Vycl90cmlnZ2VyX25ldyhhaCk7CiAJCWlmIChhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPiBhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2gpCi0JCQlhdGg5a19od19hbmlfY2NrX2Vycl90cmlnZ2VyKGFoKTsKKwkJCWF0aDlrX2h3X2FuaV9jY2tfZXJyX3RyaWdnZXJfb2xkKGFoKTsKIAkJLyogTkI6IGFsd2F5cyByZXN0YXJ0IHRvIGluc3VyZSB0aGUgaC93IGNvdW50ZXJzIGFyZSByZXNldCAqLwotCQlhdGg5a19hbmlfcmVzdGFydChhaCk7CisJCWF0aDlrX2FuaV9yZXN0YXJ0X29sZChhaCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChhdGg5a19od19wcm9jbWliZXZlbnQpOworCisvKgorICogUHJvY2VzcyBhIE1JQiBpbnRlcnJ1cHQuICBXZSBtYXkgcG90ZW50aWFsbHkgYmUgaW52b2tlZCBiZWNhdXNlCisgKiBhbnkgb2YgdGhlIE1JQiBjb3VudGVycyBvdmVyZmxvdy90cmlnZ2VyIHNvIGRvbid0IGFzc3VtZSB3ZSdyZQorICogaGVyZSBiZWNhdXNlIGEgUEhZIGVycm9yIGNvdW50ZXIgdHJpZ2dlcmVkLgorICovCitzdGF0aWMgdm9pZCBhdGg5a19od19wcm9jX21pYl9ldmVudF9uZXcoc3RydWN0IGF0aF9odyAqYWgpCit7CisJdTMyIHBoeUNudDEsIHBoeUNudDI7CisKKwkvKiBSZXNldCB0aGVzZSBjb3VudGVycyByZWdhcmRsZXNzICovCisJUkVHX1dSSVRFKGFoLCBBUl9GSUxUX09GRE0sIDApOworCVJFR19XUklURShhaCwgQVJfRklMVF9DQ0ssIDApOworCWlmICghKFJFR19SRUFEKGFoLCBBUl9TTFBfTUlCX0NUUkwpICYgQVJfU0xQX01JQl9QRU5ESU5HKSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9TTFBfTUlCX0NUUkwsIEFSX1NMUF9NSUJfQ0xFQVIpOworCisJLyogQ2xlYXIgdGhlIG1pYiBjb3VudGVycyBhbmQgc2F2ZSB0aGVtIGluIHRoZSBzdGF0cyAqLworCWF0aDlrX2h3X3VwZGF0ZV9taWJzdGF0cyhhaCwgJmFoLT5haF9taWJTdGF0cyk7CisKKwlpZiAoIURPX0FOSShhaCkpIHsKKwkJLyoKKwkJICogV2UgbXVzdCBhbHdheXMgY2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSBieQorCQkgKiByZXNldHRpbmcgdGhlIHBoeSBlcnJvciByZWdzLgorCQkgKi8KKwkJUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIDApOworCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBOQjogdGhlc2UgYXJlIG5vdCByZXNldC1vbi1yZWFkICovCisJcGh5Q250MSA9IFJFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzEpOworCXBoeUNudDIgPSBSRUdfUkVBRChhaCwgQVJfUEhZX0VSUl8yKTsKKworCS8qIE5COiBhbHdheXMgcmVzdGFydCB0byBpbnN1cmUgdGhlIGgvdyBjb3VudGVycyBhcmUgcmVzZXQgKi8KKwlpZiAoKChwaHlDbnQxICYgQVJfTUlCQ05UX0lOVFJNQVNLKSA9PSBBUl9NSUJDTlRfSU5UUk1BU0spIHx8CisJICAgICgocGh5Q250MiAmIEFSX01JQkNOVF9JTlRSTUFTSykgPT0gQVJfTUlCQ05UX0lOVFJNQVNLKSkKKwkJYXRoOWtfYW5pX3Jlc3RhcnRfbmV3KGFoKTsKK30KIAogdm9pZCBhdGg5a19od19hbmlfc2V0dXAoc3RydWN0IGF0aF9odyAqYWgpCiB7CkBAIC02MTksMjIgKzEyMDcsNzAgQEAKIAogCW1lbXNldChhaC0+YW5pLCAwLCBzaXplb2YoYWgtPmFuaSkpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFoLT5hbmkpOyBpKyspIHsKLQkJYWgtPmFuaVtpXS5vZmRtVHJpZ0hpZ2ggPSBBVEg5S19BTklfT0ZETV9UUklHX0hJR0g7Ci0JCWFoLT5hbmlbaV0ub2ZkbVRyaWdMb3cgPSBBVEg5S19BTklfT0ZETV9UUklHX0xPVzsKLQkJYWgtPmFuaVtpXS5jY2tUcmlnSGlnaCA9IEFUSDlLX0FOSV9DQ0tfVFJJR19ISUdIOwotCQlhaC0+YW5pW2ldLmNja1RyaWdMb3cgPSBBVEg5S19BTklfQ0NLX1RSSUdfTE9XOworCQlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSB8fCBtb2RwYXJhbV9mb3JjZV9uZXdfYW5pKSB7CisJCQlhaC0+YW5pW2ldLm9mZG1UcmlnSGlnaCA9IEFUSDlLX0FOSV9PRkRNX1RSSUdfSElHSF9ORVc7CisJCQlhaC0+YW5pW2ldLm9mZG1UcmlnTG93ID0gQVRIOUtfQU5JX09GRE1fVFJJR19MT1dfTkVXOworCisJCQlhaC0+YW5pW2ldLmNja1RyaWdIaWdoID0gQVRIOUtfQU5JX0NDS19UUklHX0hJR0hfTkVXOworCQkJYWgtPmFuaVtpXS5jY2tUcmlnTG93ID0gQVRIOUtfQU5JX0NDS19UUklHX0xPV19ORVc7CisKKwkJCWFoLT5hbmlbaV0uc3B1ckltbXVuaXR5TGV2ZWwgPQorCQkJCUFUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXOworCisJCQlhaC0+YW5pW2ldLmZpcnN0ZXBMZXZlbCA9IEFUSDlLX0FOSV9GSVJTVEVQX0xWTF9ORVc7CisKKwkJCWFoLT5hbmlbaV0ub2ZkbVBoeUVyckJhc2UgPSAwOworCQkJYWgtPmFuaVtpXS5jY2tQaHlFcnJCYXNlID0gMDsKKworCQkJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCisJCQkJYWgtPmFuaVtpXS5tcmNDQ0tPZmYgPQorCQkJCQkhQVRIOUtfQU5JX0VOQUJMRV9NUkNfQ0NLOworCQkJZWxzZQorCQkJCWFoLT5hbmlbaV0ubXJjQ0NLT2ZmID0gdHJ1ZTsKKworCQkJYWgtPmFuaVtpXS5vZmRtc1R1cm4gPSB0cnVlOworCQl9IGVsc2UgeworCQkJYWgtPmFuaVtpXS5vZmRtVHJpZ0hpZ2ggPSBBVEg5S19BTklfT0ZETV9UUklHX0hJR0hfT0xEOworCQkJYWgtPmFuaVtpXS5vZmRtVHJpZ0xvdyA9IEFUSDlLX0FOSV9PRkRNX1RSSUdfTE9XX09MRDsKKworCQkJYWgtPmFuaVtpXS5jY2tUcmlnSGlnaCA9IEFUSDlLX0FOSV9DQ0tfVFJJR19ISUdIX09MRDsKKwkJCWFoLT5hbmlbaV0uY2NrVHJpZ0xvdyA9IEFUSDlLX0FOSV9DQ0tfVFJJR19MT1dfT0xEOworCisJCQlhaC0+YW5pW2ldLnNwdXJJbW11bml0eUxldmVsID0KKwkJCQlBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX09MRDsKKwkJCWFoLT5hbmlbaV0uZmlyc3RlcExldmVsID0gQVRIOUtfQU5JX0ZJUlNURVBfTFZMX09MRDsKKworCQkJYWgtPmFuaVtpXS5vZmRtUGh5RXJyQmFzZSA9CisJCQkJQVJfUEhZX0NPVU5UTUFYIC0gQVRIOUtfQU5JX09GRE1fVFJJR19ISUdIX09MRDsKKwkJCWFoLT5hbmlbaV0uY2NrUGh5RXJyQmFzZSA9CisJCQkJQVJfUEhZX0NPVU5UTUFYIC0gQVRIOUtfQU5JX0NDS19UUklHX0hJR0hfT0xEOworCQkJYWgtPmFuaVtpXS5jY2tXZWFrU2lnVGhyZXNob2xkID0KKwkJCQlBVEg5S19BTklfQ0NLX1dFQUtfU0lHX1RIUjsKKwkJfQorCiAJCWFoLT5hbmlbaV0ucnNzaVRockhpZ2ggPSBBVEg5S19BTklfUlNTSV9USFJfSElHSDsKIAkJYWgtPmFuaVtpXS5yc3NpVGhyTG93ID0gQVRIOUtfQU5JX1JTU0lfVEhSX0xPVzsKIAkJYWgtPmFuaVtpXS5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9CiAJCQkhQVRIOUtfQU5JX1VTRV9PRkRNX1dFQUtfU0lHOwotCQlhaC0+YW5pW2ldLmNja1dlYWtTaWdUaHJlc2hvbGQgPQotCQkJQVRIOUtfQU5JX0NDS19XRUFLX1NJR19USFI7Ci0JCWFoLT5hbmlbaV0uc3B1ckltbXVuaXR5TGV2ZWwgPSBBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMOwotCQlhaC0+YW5pW2ldLmZpcnN0ZXBMZXZlbCA9IEFUSDlLX0FOSV9GSVJTVEVQX0xWTDsKLQkJYWgtPmFuaVtpXS5vZmRtUGh5RXJyQmFzZSA9Ci0JCQlBUl9QSFlfQ09VTlRNQVggLSBBVEg5S19BTklfT0ZETV9UUklHX0hJR0g7Ci0JCWFoLT5hbmlbaV0uY2NrUGh5RXJyQmFzZSA9Ci0JCQlBUl9QSFlfQ09VTlRNQVggLSBBVEg5S19BTklfQ0NLX1RSSUdfSElHSDsKKwkJYWgtPmFuaVtpXS5jY2tOb2lzZUltbXVuaXR5TGV2ZWwgPSBBVEg5S19BTklfQ0NLX0RFRl9MRVZFTDsKKwl9CisKKwkvKgorCSAqIHNpbmNlIHdlIGV4cGVjdCBzb21lIG9uZ29pbmcgbWFpbnRlbmFuY2Ugb24gdGhlIHRhYmxlcywgbGV0J3Mgc2FuaXR5CisJICogY2hlY2sgaGVyZSBkZWZhdWx0IGxldmVsIHNob3VsZCBub3QgbW9kaWZ5IElOSSBzZXR0aW5nLgorCSAqLworCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpIHx8IG1vZHBhcmFtX2ZvcmNlX25ld19hbmkpIHsKKwkJY29uc3Qgc3RydWN0IGFuaV9vZmRtX2xldmVsX2VudHJ5ICplbnRyeV9vZmRtOworCQljb25zdCBzdHJ1Y3QgYW5pX2Nja19sZXZlbF9lbnRyeSAqZW50cnlfY2NrOworCisJCWVudHJ5X29mZG0gPSAmb2ZkbV9sZXZlbF90YWJsZVtBVEg5S19BTklfT0ZETV9ERUZfTEVWRUxdOworCQllbnRyeV9jY2sgPSAmY2NrX2xldmVsX3RhYmxlW0FUSDlLX0FOSV9DQ0tfREVGX0xFVkVMXTsKKworCQlhaC0+YW5pcGVyaW9kID0gQVRIOUtfQU5JX1BFUklPRF9ORVc7CisJCWFoLT5jb25maWcuYW5pX3BvbGxfaW50ZXJ2YWwgPSBBVEg5S19BTklfUE9MTElOVEVSVkFMX05FVzsKKwl9IGVsc2UgeworCQlhaC0+YW5pcGVyaW9kID0gQVRIOUtfQU5JX1BFUklPRF9PTEQ7CisJCWFoLT5jb25maWcuYW5pX3BvbGxfaW50ZXJ2YWwgPSBBVEg5S19BTklfUE9MTElOVEVSVkFMX09MRDsKIAl9CiAKIAlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKQEAgLTY1Myw3ICsxMjg5LDM0IEBACiAKIAlhdGg5a19lbmFibGVfbWliX2NvdW50ZXJzKGFoKTsKIAotCWFoLT5hbmlwZXJpb2QgPSBBVEg5S19BTklfUEVSSU9EOwogCWlmIChhaC0+Y29uZmlnLmVuYWJsZV9hbmkpCiAJCWFoLT5wcm9jX3BoeWVyciB8PSBIQUxfUFJPQ0VTU19BTkk7CiB9CisKK3ZvaWQgYXRoOWtfaHdfYXR0YWNoX2FuaV9vcHNfb2xkKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfaHdfcHJpdmF0ZV9vcHMgKnByaXZfb3BzID0gYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpOworCXN0cnVjdCBhdGhfaHdfb3BzICpvcHMgPSBhdGg5a19od19vcHMoYWgpOworCisJcHJpdl9vcHMtPmFuaV9yZXNldCA9IGF0aDlrX2FuaV9yZXNldF9vbGQ7CisJcHJpdl9vcHMtPmFuaV9sb3dlcl9pbW11bml0eSA9IGF0aDlrX2h3X2FuaV9sb3dlcl9pbW11bml0eV9vbGQ7CisKKwlvcHMtPmFuaV9wcm9jX21pYl9ldmVudCA9IGF0aDlrX2h3X3Byb2NfbWliX2V2ZW50X29sZDsKKwlvcHMtPmFuaV9tb25pdG9yID0gYXRoOWtfaHdfYW5pX21vbml0b3Jfb2xkOworCisJYXRoX3ByaW50KGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQU5ZLCAiVXNpbmcgQU5JIHYxXG4iKTsKK30KKwordm9pZCBhdGg5a19od19hdHRhY2hfYW5pX29wc19uZXcoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9od19wcml2YXRlX29wcyAqcHJpdl9vcHMgPSBhdGg5a19od19wcml2YXRlX29wcyhhaCk7CisJc3RydWN0IGF0aF9od19vcHMgKm9wcyA9IGF0aDlrX2h3X29wcyhhaCk7CisKKwlwcml2X29wcy0+YW5pX3Jlc2V0ID0gYXRoOWtfYW5pX3Jlc2V0X25ldzsKKwlwcml2X29wcy0+YW5pX2xvd2VyX2ltbXVuaXR5ID0gYXRoOWtfaHdfYW5pX2xvd2VyX2ltbXVuaXR5X25ldzsKKworCW9wcy0+YW5pX3Byb2NfbWliX2V2ZW50ID0gYXRoOWtfaHdfcHJvY19taWJfZXZlbnRfbmV3OworCW9wcy0+YW5pX21vbml0b3IgPSBhdGg5a19od19hbmlfbW9uaXRvcl9uZXc7CisKKwlhdGhfcHJpbnQoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19BTlksICJVc2luZyBBTkkgdjJcbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5oCmluZGV4IDMzNTY3NjIuLmY0ZDBhNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYW5pLmgKQEAgLTIzLDIzICsyMyw1NSBAQAogCiAjZGVmaW5lIEJFQUNPTl9SU1NJKGFocCkgKGFocC0+c3RhdHMuYXZnYnJzc2kpCiAKLSNkZWZpbmUgQVRIOUtfQU5JX09GRE1fVFJJR19ISUdIICAgICAgICAgIDUwMAotI2RlZmluZSBBVEg5S19BTklfT0ZETV9UUklHX0xPVyAgICAgICAgICAgMjAwCi0jZGVmaW5lIEFUSDlLX0FOSV9DQ0tfVFJJR19ISUdIICAgICAgICAgICAyMDAKLSNkZWZpbmUgQVRIOUtfQU5JX0NDS19UUklHX0xPVyAgICAgICAgICAgIDEwMAorLyogdW5pdHMgYXJlIGVycm9ycyBwZXIgc2Vjb25kICovCisjZGVmaW5lIEFUSDlLX0FOSV9PRkRNX1RSSUdfSElHSF9PTEQgICAgICA1MDAKKyNkZWZpbmUgQVRIOUtfQU5JX09GRE1fVFJJR19ISUdIX05FVyAgICAgIDEwMDAKKworLyogdW5pdHMgYXJlIGVycm9ycyBwZXIgc2Vjb25kICovCisjZGVmaW5lIEFUSDlLX0FOSV9PRkRNX1RSSUdfTE9XX09MRCAgICAgICAyMDAKKyNkZWZpbmUgQVRIOUtfQU5JX09GRE1fVFJJR19MT1dfTkVXICAgICAgIDQwMAorCisvKiB1bml0cyBhcmUgZXJyb3JzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgQVRIOUtfQU5JX0NDS19UUklHX0hJR0hfT0xEICAgICAgIDIwMAorI2RlZmluZSBBVEg5S19BTklfQ0NLX1RSSUdfSElHSF9ORVcgICAgICAgNjAwCisKKy8qIHVuaXRzIGFyZSBlcnJvcnMgcGVyIHNlY29uZCAqLworI2RlZmluZSBBVEg5S19BTklfQ0NLX1RSSUdfTE9XX09MRCAgICAgICAgMTAwCisjZGVmaW5lIEFUSDlLX0FOSV9DQ0tfVFJJR19MT1dfTkVXICAgICAgICAzMDAKKwogI2RlZmluZSBBVEg5S19BTklfTk9JU0VfSU1NVU5FX0xWTCAgICAgICAgNAogI2RlZmluZSBBVEg5S19BTklfVVNFX09GRE1fV0VBS19TSUcgICAgICAgdHJ1ZQogI2RlZmluZSBBVEg5S19BTklfQ0NLX1dFQUtfU0lHX1RIUiAgICAgICAgZmFsc2UKLSNkZWZpbmUgQVRIOUtfQU5JX1NQVVJfSU1NVU5FX0xWTCAgICAgICAgIDcKLSNkZWZpbmUgQVRIOUtfQU5JX0ZJUlNURVBfTFZMICAgICAgICAgICAgIDAKKworI2RlZmluZSBBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX09MRCAgICAgNworI2RlZmluZSBBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX05FVyAgICAgMworCisjZGVmaW5lIEFUSDlLX0FOSV9GSVJTVEVQX0xWTF9PTEQgICAgICAgICAwCisjZGVmaW5lIEFUSDlLX0FOSV9GSVJTVEVQX0xWTF9ORVcgICAgICAgICAyCisKICNkZWZpbmUgQVRIOUtfQU5JX1JTU0lfVEhSX0hJR0ggICAgICAgICAgIDQwCiAjZGVmaW5lIEFUSDlLX0FOSV9SU1NJX1RIUl9MT1cgICAgICAgICAgICA3Ci0jZGVmaW5lIEFUSDlLX0FOSV9QRVJJT0QgICAgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBBVEg5S19BTklfUEVSSU9EX09MRCAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIEFUSDlLX0FOSV9QRVJJT0RfTkVXICAgICAgICAgICAgICAxMDAwCisKKy8qIGluIG1zICovCisjZGVmaW5lIEFUSDlLX0FOSV9QT0xMSU5URVJWQUxfT0xEICAgICAgICAxMDAKKyNkZWZpbmUgQVRIOUtfQU5JX1BPTExJTlRFUlZBTF9ORVcgICAgICAgIDEwMDAKIAogI2RlZmluZSBIQUxfTk9JU0VfSU1NVU5FX01BWCAgICAgICAgICAgICAgNAogI2RlZmluZSBIQUxfU1BVUl9JTU1VTkVfTUFYICAgICAgICAgICAgICAgNwogI2RlZmluZSBIQUxfRklSU1RfU1RFUF9NQVggICAgICAgICAgICAgICAgMgogCisjZGVmaW5lIEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUlOICAgICAwCisjZGVmaW5lIEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUFYICAgICAyMAorI2RlZmluZSBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NSU4gICAgMAorI2RlZmluZSBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NQVggICAgMjIKKworI2RlZmluZSBBVEg5S19BTklfRU5BQkxFX01SQ19DQ0sgICAgICAgICAgdHJ1ZQorCisvKiB2YWx1ZXMgaGVyZSBhcmUgcmVsYXRpdmUgdG8gdGhlIElOSSAqLworCiBlbnVtIGF0aDlrX2FuaV9jbWQgewogCUFUSDlLX0FOSV9QUkVTRU5UID0gMHgxLAogCUFUSDlLX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCA9IDB4MiwKQEAgLTQ5LDcgKzgxLDggQEAKIAlBVEg5S19BTklfU1BVUl9JTU1VTklUWV9MRVZFTCA9IDB4MjAsCiAJQVRIOUtfQU5JX01PREUgPSAweDQwLAogCUFUSDlLX0FOSV9QSFlFUlJfUkVTRVQgPSAweDgwLAotCUFUSDlLX0FOSV9BTEwgPSAweGZmCisJQVRIOUtfQU5JX01SQ19DQ0sgPSAweDEwMCwKKwlBVEg5S19BTklfQUxMID0gMHhmZmYKIH07CiAKIHN0cnVjdCBhdGg5a19taWJfc3RhdHMgewpAQCAtNjAsOSArOTMsMzEgQEAKIAl1MzIgYmVhY29uczsKIH07CiAKKy8qIElOSSBkZWZhdWx0IHZhbHVlcyBmb3IgQU5JIHJlZ2lzdGVycyAqLworc3RydWN0IGF0aDlrX2FuaV9kZWZhdWx0IHsKKwl1MTYgbTFUaHJlc2hMb3c7CisJdTE2IG0yVGhyZXNoTG93OworCXUxNiBtMVRocmVzaDsKKwl1MTYgbTJUaHJlc2g7CisJdTE2IG0yQ291bnRUaHI7CisJdTE2IG0yQ291bnRUaHJMb3c7CisJdTE2IG0xVGhyZXNoTG93RXh0OworCXUxNiBtMlRocmVzaExvd0V4dDsKKwl1MTYgbTFUaHJlc2hFeHQ7CisJdTE2IG0yVGhyZXNoRXh0OworCXUxNiBmaXJzdGVwOworCXUxNiBmaXJzdGVwTG93OworCXUxNiBjeWNwd3JUaHIxOworCXUxNiBjeWNwd3JUaHIxRXh0OworfTsKKwogc3RydWN0IGFyNTQxNkFuaVN0YXRlIHsKIAlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqYzsKIAl1OCBub2lzZUltbXVuaXR5TGV2ZWw7CisJdTggb2ZkbU5vaXNlSW1tdW5pdHlMZXZlbDsKKwl1OCBjY2tOb2lzZUltbXVuaXR5TGV2ZWw7CisJYm9vbCBvZmRtc1R1cm47CisJdTggbXJjQ0NLT2ZmOwogCXU4IHNwdXJJbW11bml0eUxldmVsOwogCXU4IGZpcnN0ZXBMZXZlbDsKIAl1OCBvZmRtV2Vha1NpZ0RldGVjdE9mZjsKQEAgLTg1LDYgKzE0MCw3IEBACiAJaW50MTZfdCBwa3RSc3NpWzJdOwogCWludDE2X3Qgb2ZkbUVyclJzc2lbMl07CiAJaW50MTZfdCBjY2tFcnJSc3NpWzJdOworCXN0cnVjdCBhdGg5a19hbmlfZGVmYXVsdCBpbmlEZWY7CiB9OwogCiBzdHJ1Y3QgYXI1NDE2U3RhdHMgewpAQCAtMTA4LDE1ICsxNjQsMTMgQEAKIH07CiAjZGVmaW5lIGFoX21pYlN0YXRzIHN0YXRzLmFzdF9taWJzdGF0cwogCi12b2lkIGF0aDlrX2FuaV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCk7Ci12b2lkIGF0aDlrX2h3X2FuaV9tb25pdG9yKHN0cnVjdCBhdGhfaHcgKmFoLAotCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbik7CiB2b2lkIGF0aDlrX2VuYWJsZV9taWJfY291bnRlcnMoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19kaXNhYmxlX21pYl9jb3VudGVycyhzdHJ1Y3QgYXRoX2h3ICphaCk7CiB1MzIgYXRoOWtfaHdfR2V0TWliQ3ljbGVDb3VudHNQY3Qoc3RydWN0IGF0aF9odyAqYWgsIHUzMiAqcnhjX3BjbnQsCiAJCQkJICB1MzIgKnJ4Zl9wY250LCB1MzIgKnR4Zl9wY250KTsKLXZvaWQgYXRoOWtfaHdfcHJvY21pYmV2ZW50KHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXRoOWtfaHdfYW5pX3NldHVwKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXRoOWtfaHdfYW5pX2luaXQoc3RydWN0IGF0aF9odyAqYWgpOworaW50IGF0aDlrX2h3X2dldF9hbmlfY2hhbm5lbF9pZHgoc3RydWN0IGF0aF9odyAqYWgsCisJCQkJIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKIAogI2VuZGlmIC8qIEFOSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X2luaXR2YWxzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X2luaXR2YWxzLmgKaW5kZXggMDI1YzMxYWMuLjM2ZjdkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X2luaXR2YWxzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAgKgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCkBAIC0xNCw3MjkgKzE0LDY2MCBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0jaWZuZGVmIElOSVRWQUxTX0FSNTAwOF9ICi0jZGVmaW5lIElOSVRWQUxTX0FSNTAwOF9ICi0KIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2TW9kZXNbXVs2XSA9IHsKLSAgICB7IDB4MDAwMDEwMzAsIDB4MDAwMDAyMzAsIDB4MDAwMDA0NjAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODAgfSwKLSAgICB7IDB4MDAwMDEwZjAsIDB4MDAwMGEwMDAsIDB4MDAwMTQwMDAsIDB4MDAwMTYwMDAsIDB4MDAwMGIwMDAsIDB4MDAwMTQwMDggfSwKLSAgICB7IDB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTAgfSwKLSAgICB7IDB4MDAwMDgwMWMsIDB4MTI4ZDkzYTcsIDB4MTI4ZDkzY2YsIDB4MTJlMDEzZDcsIDB4MTJlMDEzYWIsIDB4MDk4ODEzY2YgfSwKLSAgICB7IDB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAgfSwKLSAgICB7IDB4MDAwMDgxZDAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEgfSwKLSAgICB7IDB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDMgfSwKLSAgICB7IDB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSwKLSAgICB7IDB4MDAwMDk4MjQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEgfSwKLSAgICB7IDB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDk4NDQsIDB4MTM3MjE2MWUsIDB4MTM3MjE2MWUsIDB4MTM3MjE2YTAsIDB4MTM3MjE2YTAsIDB4MTM3MjE2YTAgfSwKLSAgICB7IDB4MDAwMDk4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjggfSwKLSAgICB7IDB4MDAwMGE4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjggfSwKLSAgICB7IDB4MDAwMGI4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjggfSwKLSAgICB7IDB4MDAwMDk4NTAsIDB4NmM0OGI0ZTAsIDB4NmQ0OGI0ZTAsIDB4NmQ0OGIwZGUsIDB4NmM0OGIwZGUsIDB4NmM0OGIwZGUgfSwKLSAgICB7IDB4MDAwMDk4NTgsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUgfSwKLSAgICB7IDB4MDAwMDk4NWMsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWUsIDB4MzEzOTVkNWUgfSwKLSAgICB7IDB4MDAwMDk4NjAsIDB4MDAwNDlkMTgsIDB4MDAwNDlkMTgsIDB4MDAwNDlkMTgsIDB4MDAwNDlkMTgsIDB4MDAwNDlkMTggfSwKLSAgICB7IDB4MDAwMDk4NjQsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAgfSwKLSAgICB7IDB4MDAwMDk4NjgsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAgfSwKLSAgICB7IDB4MDAwMDk4NmMsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEgfSwKLSAgICB7IDB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDAgfSwKLSAgICB7IDB4MDAwMDk5MTgsIDB4MDAwMDAxYjgsIDB4MDAwMDAzNzAsIDB4MDAwMDAyNjgsIDB4MDAwMDAxMzQsIDB4MDAwMDAxMzQgfSwKLSAgICB7IDB4MDAwMDk5MjQsIDB4ZDAwNThhMGIsIDB4ZDAwNThhMGIsIDB4ZDAwNThhMGIsIDB4ZDAwNThhMGIsIDB4ZDAwNThhMGIgfSwKLSAgICB7IDB4MDAwMDk5NDQsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAgfSwKLSAgICB7IDB4MDAwMDk5NjAsIDB4MDAwMDA5MDAsIDB4MDAwMDA5MDAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAgfSwKLSAgICB7IDB4MDAwMGE5NjAsIDB4MDAwMDA5MDAsIDB4MDAwMDA5MDAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAgfSwKLSAgICB7IDB4MDAwMGI5NjAsIDB4MDAwMDA5MDAsIDB4MDAwMDA5MDAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAgfSwKLSAgICB7IDB4MDAwMDk5NjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAgfSwKLSAgICB7IDB4MDAwMDk5YmMsIDB4MDAxYTBhMDAsIDB4MDAxYTBhMDAsIDB4MDAxYTBhMDAsIDB4MDAxYTBhMDAsIDB4MDAxYTBhMDAgfSwKLSAgICB7IDB4MDAwMDk5YzAsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUgfSwKLSAgICB7IDB4MDAwMDk5YzQsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcgfSwKLSAgICB7IDB4MDAwMDk5YzgsIDB4NmFmNjUzMmMsIDB4NmFmNjUzMmMsIDB4NmFmNjUzMmMsIDB4NmFmNjUzMmMsIDB4NmFmNjUzMmMgfSwKLSAgICB7IDB4MDAwMDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzggfSwKLSAgICB7IDB4MDAwMDk5ZDAsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQgfSwKLSAgICB7IDB4MDAwMDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMDQsIDB4MDAwMDA4ODAsIDB4MDAwMDA4ODAsIDB4MDAwMDA4ODAsIDB4MDAwMDA4ODAsIDB4MDAwMDA4ODAgfSwKLSAgICB7IDB4MDAwMGEyMDgsIDB4ZDZiZTQ3ODgsIDB4ZDZiZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB4ZDAzZTQ3ODggfSwKLSAgICB7IDB4MDAwMGEyMGMsIDB4MDAyZWMxZTAsIDB4MDAyZWMxZTAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAgfSwKLSAgICB7IDB4MDAwMGIyMGMsIDB4MDAyZWMxZTAsIDB4MDAyZWMxZTAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAgfSwKLSAgICB7IDB4MDAwMGMyMGMsIDB4MDAyZWMxZTAsIDB4MDAyZWMxZTAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAgfSwKLSAgICB7IDB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEgfSwKLSAgICB7IDB4MDAwMGEyMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNzQsIDB4MGExYTljYWEsIDB4MGExYTljYWEsIDB4MGExYTdjYWEsIDB4MGExYTdjYWEsIDB4MGExYTdjYWEgfSwKLSAgICB7IDB4MDAwMGEzMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDQsIDB4MzAwMzI2MDIsIDB4MzAwMzI2MDIsIDB4MmUwMzI0MDIsIDB4MmUwMzI0MDIsIDB4MmUwMzI0MDIgfSwKLSAgICB7IDB4MDAwMGEzMDgsIDB4NDgwNzNlMDYsIDB4NDgwNzNlMDYsIDB4NGEwYTNjMDYsIDB4NGEwYTNjMDYsIDB4NGEwYTNjMDYgfSwKLSAgICB7IDB4MDAwMGEzMGMsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGIgfSwKLSAgICB7IDB4MDAwMGEzMTAsIDB4NjQxYTYwMGYsIDB4NjQxYTYwMGYsIDB4NzY0ZjZjMWIsIDB4NzY0ZjZjMWIsIDB4NzY0ZjZjMWIgfSwKLSAgICB7IDB4MDAwMGEzMTQsIDB4N2E0ZjZlMWIsIDB4N2E0ZjZlMWIsIDB4ODQ1YjdhNWEsIDB4ODQ1YjdhNWEsIDB4ODQ1YjdhNWEgfSwKLSAgICB7IDB4MDAwMGEzMTgsIDB4OGM1YjdlNWEsIDB4OGM1YjdlNWEsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2YgfSwKLSAgICB7IDB4MDAwMGEzMWMsIDB4OWQwZjk2Y2YsIDB4OWQwZjk2Y2YsIDB4YTVjZjliNGYsIDB4YTVjZjliNGYsIDB4YTVjZjliNGYgfSwKLSAgICB7IDB4MDAwMGEzMjAsIDB4YjUxZmE2OWYsIDB4YjUxZmE2OWYsIDB4YmRkZmFmMWYsIDB4YmRkZmFmMWYsIDB4YmRkZmFmMWYgfSwKLSAgICB7IDB4MDAwMGEzMjQsIDB4Y2IzZmJkMDcsIDB4Y2IzZmJjYmYsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2YgfSwKLSAgICB7IDB4MDAwMGEzMjgsIDB4MDAwMGQ3YmYsIDB4MDAwMGQ3YmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTB9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwZTYwLCAweDAwMDAxY2MwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4LCAweDAwMDAxMTgwfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwYTAwMCwgMHgwMDAxNDAwMCwgMHgwMDAxNjAwMCwgMHgwMDAwYjAwMCwgMHgwMDAxNDAwOH0sCisJezB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTB9LAorCXsweDAwMDA4MDFjLCAweDEyOGQ5M2E3LCAweDEyOGQ5M2NmLCAweDEyZTAxM2Q3LCAweDEyZTAxM2FiLCAweDA5ODgxM2NmfSwKKwl7MHgwMDAwODEyMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMH0sCisJezB4MDAwMDgxZDAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGF9LAorCXsweDAwMDA5ODA0LCAweDAwMDAwMzAwLCAweDAwMDAwM2M0LCAweDAwMDAwM2M0LCAweDAwMDAwMzAwLCAweDAwMDAwMzAzfSwKKwl7MHgwMDAwOTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMH0sCisJezB4MDAwMDk4MjQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGV9LAorCXsweDAwMDA5ODI4LCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxfSwKKwl7MHgwMDAwOTgzNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZX0sCisJezB4MDAwMDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDd9LAorCXsweDAwMDA5ODQ0LCAweDEzNzIxNjFlLCAweDEzNzIxNjFlLCAweDEzNzIxNmEwLCAweDEzNzIxNmEwLCAweDEzNzIxNmEwfSwKKwl7MHgwMDAwOTg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OH0sCisJezB4MDAwMGE4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjh9LAorCXsweDAwMDBiODQ4LCAweDAwMWE2YTY1LCAweDAwMWE2YTY1LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4fSwKKwl7MHgwMDAwOTg1MCwgMHg2YzQ4YjRlMCwgMHg2ZDQ4YjRlMCwgMHg2ZDQ4YjBkZSwgMHg2YzQ4YjBkZSwgMHg2YzQ4YjBkZX0sCisJezB4MDAwMDk4NTgsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODJkMmV9LAorCXsweDAwMDA5ODVjLCAweDMxMzk1ZDVlLCAweDMxMzk2MDVlLCAweDMxMzk2MDVlLCAweDMxMzk1ZDVlLCAweDMxMzk1ZDVlfSwKKwl7MHgwMDAwOTg2MCwgMHgwMDA0OWQxOCwgMHgwMDA0OWQxOCwgMHgwMDA0OWQxOCwgMHgwMDA0OWQxOCwgMHgwMDA0OWQxOH0sCisJezB4MDAwMDk4NjQsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDB9LAorCXsweDAwMDA5ODY4LCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwfSwKKwl7MHgwMDAwOTg2YywgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MX0sCisJezB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDB9LAorCXsweDAwMDA5OTE4LCAweDAwMDAwMWI4LCAweDAwMDAwMzcwLCAweDAwMDAwMjY4LCAweDAwMDAwMTM0LCAweDAwMDAwMTM0fSwKKwl7MHgwMDAwOTkyNCwgMHhkMDA1OGEwYiwgMHhkMDA1OGEwYiwgMHhkMDA1OGEwYiwgMHhkMDA1OGEwYiwgMHhkMDA1OGEwYn0sCisJezB4MDAwMDk5NDQsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjAsIDB4ZmZiODEwMjB9LAorCXsweDAwMDA5OTYwLCAweDAwMDAwOTAwLCAweDAwMDAwOTAwLCAweDAwMDEyZDgwLCAweDAwMDEyZDgwLCAweDAwMDEyZDgwfSwKKwl7MHgwMDAwYTk2MCwgMHgwMDAwMDkwMCwgMHgwMDAwMDkwMCwgMHgwMDAxMmQ4MCwgMHgwMDAxMmQ4MCwgMHgwMDAxMmQ4MH0sCisJezB4MDAwMGI5NjAsIDB4MDAwMDA5MDAsIDB4MDAwMDA5MDAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODAsIDB4MDAwMTJkODB9LAorCXsweDAwMDA5OTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAxMTIwLCAweDAwMDAxMTIwLCAweDAwMDAxMTIwfSwKKwl7MHgwMDAwOTliYywgMHgwMDFhMGEwMCwgMHgwMDFhMGEwMCwgMHgwMDFhMGEwMCwgMHgwMDFhMGEwMCwgMHgwMDFhMGEwMH0sCisJezB4MDAwMDk5YzAsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmV9LAorCXsweDAwMDA5OWM0LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3fSwKKwl7MHgwMDAwOTljOCwgMHg2YWY2NTMyYywgMHg2YWY2NTMyYywgMHg2YWY2NTMyYywgMHg2YWY2NTMyYywgMHg2YWY2NTMyY30sCisJezB4MDAwMDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2Yzh9LAorCXsweDAwMDA5OWQwLCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0fSwKKwl7MHgwMDAwOTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjA0LCAweDAwMDAwODgwLCAweDAwMDAwODgwLCAweDAwMDAwODgwLCAweDAwMDAwODgwLCAweDAwMDAwODgwfSwKKwl7MHgwMDAwYTIwOCwgMHhkNmJlNDc4OCwgMHhkNmJlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OH0sCisJezB4MDAwMGEyMGMsIDB4MDAyZWMxZTAsIDB4MDAyZWMxZTAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjB9LAorCXsweDAwMDBiMjBjLCAweDAwMmVjMWUwLCAweDAwMmVjMWUwLCAweDAwMmFjMTIwLCAweDAwMmFjMTIwLCAweDAwMmFjMTIwfSwKKwl7MHgwMDAwYzIwYywgMHgwMDJlYzFlMCwgMHgwMDJlYzFlMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMH0sCisJezB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGF9LAorCXsweDAwMDBhMjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMjEwLCAweDAwMDAwMTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI3NCwgMHgwYTFhOWNhYSwgMHgwYTFhOWNhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYX0sCisJezB4MDAwMGEzMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDB9LAorCXsweDAwMDBhMzA0LCAweDMwMDMyNjAyLCAweDMwMDMyNjAyLCAweDJlMDMyNDAyLCAweDJlMDMyNDAyLCAweDJlMDMyNDAyfSwKKwl7MHgwMDAwYTMwOCwgMHg0ODA3M2UwNiwgMHg0ODA3M2UwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNn0sCisJezB4MDAwMGEzMGMsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGJ9LAorCXsweDAwMDBhMzEwLCAweDY0MWE2MDBmLCAweDY0MWE2MDBmLCAweDc2NGY2YzFiLCAweDc2NGY2YzFiLCAweDc2NGY2YzFifSwKKwl7MHgwMDAwYTMxNCwgMHg3YTRmNmUxYiwgMHg3YTRmNmUxYiwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSwgMHg4NDViN2E1YX0sCisJezB4MDAwMGEzMTgsIDB4OGM1YjdlNWEsIDB4OGM1YjdlNWEsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2Z9LAorCXsweDAwMDBhMzFjLCAweDlkMGY5NmNmLCAweDlkMGY5NmNmLCAweGE1Y2Y5YjRmLCAweGE1Y2Y5YjRmLCAweGE1Y2Y5YjRmfSwKKwl7MHgwMDAwYTMyMCwgMHhiNTFmYTY5ZiwgMHhiNTFmYTY5ZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZn0sCisJezB4MDAwMGEzMjQsIDB4Y2IzZmJkMDcsIDB4Y2IzZmJjYmYsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2Z9LAorCXsweDAwMDBhMzI4LCAweDAwMDBkN2JmLCAweDAwMDBkN2JmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2Q29tbW9uW11bMl0gPSB7Ci0gICAgeyAweDAwMDAwMDBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwMDMwLCAweDAwMDIwMDE1IH0sCi0gICAgeyAweDAwMDAwMDM0LCAweDAwMDAwMDA1IH0sCi0gICAgeyAweDAwMDAwMDQwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwMDQ0LCAweDAwMDAwMDA4IH0sCi0gICAgeyAweDAwMDAwMDQ4LCAweDAwMDAwMDA4IH0sCi0gICAgeyAweDAwMDAwMDRjLCAweDAwMDAwMDEwIH0sCi0gICAgeyAweDAwMDAwMDUwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwMDU0LCAweDAwMDAwMDFmIH0sCi0gICAgeyAweDAwMDAwODAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODE0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODIwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODI0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDQwLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDQ0LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDQ4LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDRjLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDUwLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDU0LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDU4LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDVjLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDYwLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDY0LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMjMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjcwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2I4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2Y4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNGI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNGY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNTM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNTc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNWI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNWY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNjM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNjc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNmI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNmY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNzc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxN2I4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxN2Y4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2JjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2ZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA0MDMwLCAweDAwMDAwMDAyIH0sCi0gICAgeyAweDAwMDA0MDNjLCAweDAwMDAwMDAyIH0sCi0gICAgeyAweDAwMDA3MDEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA3MDM4LCAweDAwMDAwNGMyIH0sCi0gICAgeyAweDAwMDA4MDA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDE4LCAweDAwMDAwNzAwIH0sCi0gICAgeyAweDAwMDA4MDIwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDQ4LCAweDQwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDU0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDU4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDVjLCAweDAwMGZjNzhmIH0sCi0gICAgeyAweDAwMDA4MDYwLCAweDAwMDAwMDBmIH0sCi0gICAgeyAweDAwMDA4MDY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGMwLCAweDJhODIzMDFhIH0sCi0gICAgeyAweDAwMDA4MGM0LCAweDA1ZGMwMWUwIH0sCi0gICAgeyAweDAwMDA4MGM4LCAweDFmNDAyNzEwIH0sCi0gICAgeyAweDAwMDA4MGNjLCAweDAxZjQwMDAwIH0sCi0gICAgeyAweDAwMDA4MGQwLCAweDAwMDAxZTAwIH0sCi0gICAgeyAweDAwMDA4MGQ0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGQ4LCAweDAwNDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGUwLCAweGZmZmZmZmZmIH0sCi0gICAgeyAweDAwMDA4MGU0LCAweDAwMDBmZmZmIH0sCi0gICAgeyAweDAwMDA4MGU4LCAweDAwM2YzZjNmIH0sCi0gICAgeyAweDAwMDA4MGVjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGYwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGZjLCAweDAwMDIwMDAwIH0sCi0gICAgeyAweDAwMDA4MTAwLCAweDAwMDIwMDAwIH0sCi0gICAgeyAweDAwMDA4MTA0LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA4MTA4LCAweDAwMDAwMDUyIH0sCi0gICAgeyAweDAwMDA4MTBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTEwLCAweDAwMDAwMTY4IH0sCi0gICAgeyAweDAwMDA4MTE4LCAweDAwMDEwMGFhIH0sCi0gICAgeyAweDAwMDA4MTFjLCAweDAwMDAzMjEwIH0sCi0gICAgeyAweDAwMDA4MTI0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTM0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTQ0LCAweGZmZmZmZmZmIH0sCi0gICAgeyAweDAwMDA4MTY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTcwLCAweDMyMTQzMzIwIH0sCi0gICAgeyAweDAwMDA4MTc0LCAweGZhYTRmYTUwIH0sCi0gICAgeyAweDAwMDA4MTc4LCAweDAwMDAwMTAwIH0sCi0gICAgeyAweDAwMDA4MTdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWM0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWVjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWYwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjE0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjIwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjI0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjM0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjQwLCAweDAwMTAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjQ0LCAweDAwMTBmNDAwIH0sCi0gICAgeyAweDAwMDA4MjQ4LCAweDAwMDAwMTAwIH0sCi0gICAgeyAweDAwMDA4MjRjLCAweDAwMDFlODAwIH0sCi0gICAgeyAweDAwMDA4MjUwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjU0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjU4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjVjLCAweDQwMDAwMGZmIH0sCi0gICAgeyAweDAwMDA4MjYwLCAweDAwMDgwOTIyIH0sCi0gICAgeyAweDAwMDA4MjY0LCAweDg4MDAwMDEwIH0sCi0gICAgeyAweDAwMDA4MjcwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjc0LCAweDQwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjc4LCAweDAwM2U0MTgwIH0sCi0gICAgeyAweDAwMDA4MjdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjg0LCAweDAwMDAwMDJjIH0sCi0gICAgeyAweDAwMDA4Mjg4LCAweDAwMDAwMDJjIH0sCi0gICAgeyAweDAwMDA4MjhjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjk0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjk4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzE0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzJjLCAweDAwMDAwMDA3IH0sCi0gICAgeyAweDAwMDA4MzMwLCAweDAwMDAwMzAyIH0sCi0gICAgeyAweDAwMDA4MzM0LCAweDAwMDAwZTAwIH0sCi0gICAgeyAweDAwMDA4MzM4LCAweDAwMDcwMDAwIH0sCi0gICAgeyAweDAwMDA4MzNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzQwLCAweDAwMDEwN2ZmIH0sCi0gICAgeyAweDAwMDA5ODA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODBjLCAweGFkODQ4ZTE5IH0sCi0gICAgeyAweDAwMDA5ODEwLCAweDdkMTRlMDAwIH0sCi0gICAgeyAweDAwMDA5ODE0LCAweDljMGE5ZjZiIH0sCi0gICAgeyAweDAwMDA5ODFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODJjLCAweDAwMDBhMDAwIH0sCi0gICAgeyAweDAwMDA5ODMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODNjLCAweDAwMjAwNDAwIH0sCi0gICAgeyAweDAwMDA5ODQwLCAweDIwNmEwMDJlIH0sCi0gICAgeyAweDAwMDA5ODRjLCAweDEyODQyMzNjIH0sCi0gICAgeyAweDAwMDA5ODU0LCAweDAwMDAwODU5IH0sCi0gICAgeyAweDAwMDA5OTAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTFjLCAweDEwMDAwZmZmIH0sCi0gICAgeyAweDAwMDA5OTIwLCAweDA1MTAwMDAwIH0sCi0gICAgeyAweDAwMDBhOTIwLCAweDA1MTAwMDAwIH0sCi0gICAgeyAweDAwMDBiOTIwLCAweDA1MTAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTI4LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5OTJjLCAweDAwMDAwMDA0IH0sCi0gICAgeyAweDAwMDA5OTM0LCAweDFlMWYyMDIyIH0sCi0gICAgeyAweDAwMDA5OTM4LCAweDBhMGIwYzBkIH0sCi0gICAgeyAweDAwMDA5OTNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTQ4LCAweDkyODBiMjEyIH0sCi0gICAgeyAweDAwMDA5OTRjLCAweDAwMDIwMDI4IH0sCi0gICAgeyAweDAwMDA5OTU0LCAweDVkNTBlMTg4IH0sCi0gICAgeyAweDAwMDA5OTU4LCAweDAwMDgxZmZmIH0sCi0gICAgeyAweDAwMDBjOTVjLCAweDAwNGI2YThlIH0sCi0gICAgeyAweDAwMDBjOTY4LCAweDAwMDAwM2NlIH0sCi0gICAgeyAweDAwMDA5OTcwLCAweDE5MGZiNTE1IH0sCi0gICAgeyAweDAwMDA5OTc0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTc4LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5OTdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTgwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTg0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTg4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OThjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTkwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTk0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTk4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTljLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWE0LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5OWE4LCAweDAwMWZmZjAwIH0sCi0gICAgeyAweDAwMDA5OWFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWIwLCAweDAzMDUxMDAwIH0sCi0gICAgeyAweDAwMDA5OWRjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWUwLCAweDAwMDAwMjAwIH0sCi0gICAgeyAweDAwMDA5OWU0LCAweGFhYWFhYWFhIH0sCi0gICAgeyAweDAwMDA5OWU4LCAweDNjNDY2NDc4IH0sCi0gICAgeyAweDAwMDA5OWVjLCAweDAwMDAwMGFhIH0sCi0gICAgeyAweDAwMDA5OWZjLCAweDAwMDAxMDQyIH0sCi0gICAgeyAweDAwMDA5YjAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5YjA0LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5YjA4LCAweDAwMDAwMDAyIH0sCi0gICAgeyAweDAwMDA5YjBjLCAweDAwMDAwMDAzIH0sCi0gICAgeyAweDAwMDA5YjEwLCAweDAwMDAwMDA0IH0sCi0gICAgeyAweDAwMDA5YjE0LCAweDAwMDAwMDA1IH0sCi0gICAgeyAweDAwMDA5YjE4LCAweDAwMDAwMDA4IH0sCi0gICAgeyAweDAwMDA5YjFjLCAweDAwMDAwMDA5IH0sCi0gICAgeyAweDAwMDA5YjIwLCAweDAwMDAwMDBhIH0sCi0gICAgeyAweDAwMDA5YjI0LCAweDAwMDAwMDBiIH0sCi0gICAgeyAweDAwMDA5YjI4LCAweDAwMDAwMDBjIH0sCi0gICAgeyAweDAwMDA5YjJjLCAweDAwMDAwMDBkIH0sCi0gICAgeyAweDAwMDA5YjMwLCAweDAwMDAwMDEwIH0sCi0gICAgeyAweDAwMDA5YjM0LCAweDAwMDAwMDExIH0sCi0gICAgeyAweDAwMDA5YjM4LCAweDAwMDAwMDEyIH0sCi0gICAgeyAweDAwMDA5YjNjLCAweDAwMDAwMDEzIH0sCi0gICAgeyAweDAwMDA5YjQwLCAweDAwMDAwMDE0IH0sCi0gICAgeyAweDAwMDA5YjQ0LCAweDAwMDAwMDE1IH0sCi0gICAgeyAweDAwMDA5YjQ4LCAweDAwMDAwMDE4IH0sCi0gICAgeyAweDAwMDA5YjRjLCAweDAwMDAwMDE5IH0sCi0gICAgeyAweDAwMDA5YjUwLCAweDAwMDAwMDFhIH0sCi0gICAgeyAweDAwMDA5YjU0LCAweDAwMDAwMDFiIH0sCi0gICAgeyAweDAwMDA5YjU4LCAweDAwMDAwMDFjIH0sCi0gICAgeyAweDAwMDA5YjVjLCAweDAwMDAwMDFkIH0sCi0gICAgeyAweDAwMDA5YjYwLCAweDAwMDAwMDIwIH0sCi0gICAgeyAweDAwMDA5YjY0LCAweDAwMDAwMDIxIH0sCi0gICAgeyAweDAwMDA5YjY4LCAweDAwMDAwMDIyIH0sCi0gICAgeyAweDAwMDA5YjZjLCAweDAwMDAwMDIzIH0sCi0gICAgeyAweDAwMDA5YjcwLCAweDAwMDAwMDI0IH0sCi0gICAgeyAweDAwMDA5Yjc0LCAweDAwMDAwMDI1IH0sCi0gICAgeyAweDAwMDA5Yjc4LCAweDAwMDAwMDI4IH0sCi0gICAgeyAweDAwMDA5YjdjLCAweDAwMDAwMDI5IH0sCi0gICAgeyAweDAwMDA5YjgwLCAweDAwMDAwMDJhIH0sCi0gICAgeyAweDAwMDA5Yjg0LCAweDAwMDAwMDJiIH0sCi0gICAgeyAweDAwMDA5Yjg4LCAweDAwMDAwMDJjIH0sCi0gICAgeyAweDAwMDA5YjhjLCAweDAwMDAwMDJkIH0sCi0gICAgeyAweDAwMDA5YjkwLCAweDAwMDAwMDMwIH0sCi0gICAgeyAweDAwMDA5Yjk0LCAweDAwMDAwMDMxIH0sCi0gICAgeyAweDAwMDA5Yjk4LCAweDAwMDAwMDMyIH0sCi0gICAgeyAweDAwMDA5YjljLCAweDAwMDAwMDMzIH0sCi0gICAgeyAweDAwMDA5YmEwLCAweDAwMDAwMDM0IH0sCi0gICAgeyAweDAwMDA5YmE0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmE4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmFjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmIwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmI0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmI4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmJjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmMwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmM0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmM4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmNjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmQwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmQ0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmQ4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmRjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmUwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmU0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmU4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmVjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmYwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmY0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmY4LCAweDAwMDAwMDEwIH0sCi0gICAgeyAweDAwMDA5YmZjLCAweDAwMDAwMDFhIH0sCi0gICAgeyAweDAwMDBhMjEwLCAweDQwODA2MzMzIH0sCi0gICAgeyAweDAwMDBhMjE0LCAweDAwMTA2YzEwIH0sCi0gICAgeyAweDAwMDBhMjE4LCAweDAwOWM0MDYwIH0sCi0gICAgeyAweDAwMDBhMjIwLCAweDAxODgzMGM2IH0sCi0gICAgeyAweDAwMDBhMjI0LCAweDAwMDAwNDAwIH0sCi0gICAgeyAweDAwMDBhMjI4LCAweDAwMDAwYmI1IH0sCi0gICAgeyAweDAwMDBhMjJjLCAweDAwMDAwMDExIH0sCi0gICAgeyAweDAwMDBhMjM0LCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMjM4LCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMjNjLCAweDEzYzg4OWFmIH0sCi0gICAgeyAweDAwMDBhMjQwLCAweDM4NDkwYTIwIH0sCi0gICAgeyAweDAwMDBhMjQ0LCAweDAwMDA3YmI2IH0sCi0gICAgeyAweDAwMDBhMjQ4LCAweDBmZmYzZmZjIH0sCi0gICAgeyAweDAwMDBhMjRjLCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDBhMjUwLCAweDAwMDBhMDAwIH0sCi0gICAgeyAweDAwMDBhMjU0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMjU4LCAweDBjYzc1MzgwIH0sCi0gICAgeyAweDAwMDBhMjVjLCAweDBmMGYwZjAxIH0sCi0gICAgeyAweDAwMDBhMjYwLCAweGRmYTkxZjAxIH0sCi0gICAgeyAweDAwMDBhMjY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMjZjLCAweDBlNzllNWM2IH0sCi0gICAgeyAweDAwMDBiMjZjLCAweDBlNzllNWM2IH0sCi0gICAgeyAweDAwMDBjMjZjLCAweDBlNzllNWM2IH0sCi0gICAgeyAweDAwMDBkMjcwLCAweDAwODIwODIwIH0sCi0gICAgeyAweDAwMDBhMjc4LCAweDFjZTczOWNlIH0sCi0gICAgeyAweDAwMDBhMjdjLCAweDA1MTcwMWNlIH0sCi0gICAgeyAweDAwMDBhMzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQ0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQ4LCAweDNmZmZmZmZmIH0sCi0gICAgeyAweDAwMDBhMzRjLCAweDNmZmZmZmZmIH0sCi0gICAgeyAweDAwMDBhMzUwLCAweDNmZmZmZmZmIH0sCi0gICAgeyAweDAwMDBhMzU0LCAweDAwMDNmZmZmIH0sCi0gICAgeyAweDAwMDBhMzU4LCAweDc5YThhYTFmIH0sCi0gICAgeyAweDAwMDBkMzVjLCAweDA3ZmZmZmVmIH0sCi0gICAgeyAweDAwMDBkMzYwLCAweDBmZmZmZmU3IH0sCi0gICAgeyAweDAwMDBkMzY0LCAweDE3ZmZmZmU1IH0sCi0gICAgeyAweDAwMDBkMzY4LCAweDFmZmZmZmU0IH0sCi0gICAgeyAweDAwMDBkMzZjLCAweDM3ZmZmZmUzIH0sCi0gICAgeyAweDAwMDBkMzcwLCAweDNmZmZmZmUzIH0sCi0gICAgeyAweDAwMDBkMzc0LCAweDU3ZmZmZmUzIH0sCi0gICAgeyAweDAwMDBkMzc4LCAweDVmZmZmZmUyIH0sCi0gICAgeyAweDAwMDBkMzdjLCAweDdmZmZmZmUyIH0sCi0gICAgeyAweDAwMDBkMzgwLCAweDdmM2M3YmJhIH0sCi0gICAgeyAweDAwMDBkMzg0LCAweGYzMzA3ZmYwIH0sCi0gICAgeyAweDAwMDBhMzg4LCAweDA4MDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzhjLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMzkwLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMzk0LCAweDFjZTczOWNlIH0sCi0gICAgeyAweDAwMDBhMzk4LCAweDAwMDAwMWNlIH0sCi0gICAgeyAweDAwMDBhMzljLCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDBhM2EwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2E0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2E4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2FjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2IwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2I0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2I4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2JjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2MwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2M0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2M4LCAweDAwMDAwMjQ2IH0sCi0gICAgeyAweDAwMDBhM2NjLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhM2QwLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhM2Q0LCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhM2RjLCAweDFjZTczOWNlIH0sCi0gICAgeyAweDAwMDBhM2UwLCAweDAwMDAwMWNlIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDAwMDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDAzMCwgMHgwMDAyMDAxNX0sCisJezB4MDAwMDAwMzQsIDB4MDAwMDAwMDV9LAorCXsweDAwMDAwMDQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA0NCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNDgsIDB4MDAwMDAwMDh9LAorCXsweDAwMDAwMDRjLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwMDA1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNTQsIDB4MDAwMDAwMWZ9LAorCXsweDAwMDAwODAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA0MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDQ4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1OCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNWMsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDYwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA2NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEyMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTAzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTI3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTMzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTRiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTU3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTYzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNmI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTZmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNzc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTdiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTM3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2ZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0N2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA0MDMwLCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwNDAzYywgMHgwMDAwMDAwMn0sCisJezB4MDAwMDcwMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAxOCwgMHgwMDAwMDcwMH0sCisJezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4NDAwMDAwMDB9LAorCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAorCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYzAsIDB4MmE4MjMwMWF9LAorCXsweDAwMDA4MGM0LCAweDA1ZGMwMWUwfSwKKwl7MHgwMDAwODBjOCwgMHgxZjQwMjcxMH0sCisJezB4MDAwMDgwY2MsIDB4MDFmNDAwMDB9LAorCXsweDAwMDA4MGQwLCAweDAwMDAxZTAwfSwKKwl7MHgwMDAwODBkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZDgsIDB4MDA0MDAwMDB9LAorCXsweDAwMDA4MGUwLCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODBlNCwgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgwZTgsIDB4MDAzZjNmM2Z9LAorCXsweDAwMDA4MGVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmYywgMHgwMDAyMDAwMH0sCisJezB4MDAwMDgxMDAsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTA0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwODEwOCwgMHgwMDAwMDA1Mn0sCisJezB4MDAwMDgxMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTEwLCAweDAwMDAwMTY4fSwKKwl7MHgwMDAwODExOCwgMHgwMDAxMDBhYX0sCisJezB4MDAwMDgxMWMsIDB4MDAwMDMyMTB9LAorCXsweDAwMDA4MTI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE0NCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgxNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE3MCwgMHgzMjE0MzMyMH0sCisJezB4MDAwMDgxNzQsIDB4ZmFhNGZhNTB9LAorCXsweDAwMDA4MTc4LCAweDAwMDAwMTAwfSwKKwl7MHgwMDAwODE3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjQwLCAweDAwMTAwMDAwfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQwMH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MjRjLCAweDAwMDFlODAwfSwKKwl7MHgwMDAwODI1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1YywgMHg0MDAwMDBmZn0sCisJezB4MDAwMDgyNjAsIDB4MDAwODA5MjJ9LAorCXsweDAwMDA4MjY0LCAweDg4MDAwMDEwfSwKKwl7MHgwMDAwODI3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNzQsIDB4NDAwMDAwMDB9LAorCXsweDAwMDA4Mjc4LCAweDAwM2U0MTgwfSwKKwl7MHgwMDAwODI3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyODQsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA4Mjg4LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzJjLCAweDAwMDAwMDA3fSwKKwl7MHgwMDAwODMzMCwgMHgwMDAwMDMwMn0sCisJezB4MDAwMDgzMzQsIDB4MDAwMDBlMDB9LAorCXsweDAwMDA4MzM4LCAweDAwMDcwMDAwfSwKKwl7MHgwMDAwODMzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNDAsIDB4MDAwMTA3ZmZ9LAorCXsweDAwMDA5ODA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgwYywgMHhhZDg0OGUxOX0sCisJezB4MDAwMDk4MTAsIDB4N2QxNGUwMDB9LAorCXsweDAwMDA5ODE0LCAweDljMGE5ZjZifSwKKwl7MHgwMDAwOTgxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MmMsIDB4MDAwMGEwMDB9LAorCXsweDAwMDA5ODMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgzYywgMHgwMDIwMDQwMH0sCisJezB4MDAwMDk4NDAsIDB4MjA2YTAwMmV9LAorCXsweDAwMDA5ODRjLCAweDEyODQyMzNjfSwKKwl7MHgwMDAwOTg1NCwgMHgwMDAwMDg1OX0sCisJezB4MDAwMDk5MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTFjLCAweDEwMDAwZmZmfSwKKwl7MHgwMDAwOTkyMCwgMHgwNTEwMDAwMH0sCisJezB4MDAwMGE5MjAsIDB4MDUxMDAwMDB9LAorCXsweDAwMDBiOTIwLCAweDA1MTAwMDAwfSwKKwl7MHgwMDAwOTkyOCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDk5MmMsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA5OTM0LCAweDFlMWYyMDIyfSwKKwl7MHgwMDAwOTkzOCwgMHgwYTBiMGMwZH0sCisJezB4MDAwMDk5M2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTQ4LCAweDkyODBiMjEyfSwKKwl7MHgwMDAwOTk0YywgMHgwMDAyMDAyOH0sCisJezB4MDAwMDk5NTQsIDB4NWQ1MGUxODh9LAorCXsweDAwMDA5OTU4LCAweDAwMDgxZmZmfSwKKwl7MHgwMDAwYzk1YywgMHgwMDRiNmE4ZX0sCisJezB4MDAwMGM5NjgsIDB4MDAwMDAzY2V9LAorCXsweDAwMDA5OTcwLCAweDE5MGZiNTE1fSwKKwl7MHgwMDAwOTk3NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5NzgsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OTdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlhNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDk5YTgsIDB4MDAxZmZmMDB9LAorCXsweDAwMDA5OWFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTliMCwgMHgwMzA1MTAwMH0sCisJezB4MDAwMDk5ZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWUwLCAweDAwMDAwMjAwfSwKKwl7MHgwMDAwOTllNCwgMHhhYWFhYWFhYX0sCisJezB4MDAwMDk5ZTgsIDB4M2M0NjY0Nzh9LAorCXsweDAwMDA5OWVjLCAweDAwMDAwMGFhfSwKKwl7MHgwMDAwOTlmYywgMHgwMDAwMTA0Mn0sCisJezB4MDAwMDliMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjA0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOWIwOCwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDliMGMsIDB4MDAwMDAwMDN9LAorCXsweDAwMDA5YjEwLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOWIxNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDliMTgsIDB4MDAwMDAwMDh9LAorCXsweDAwMDA5YjFjLCAweDAwMDAwMDA5fSwKKwl7MHgwMDAwOWIyMCwgMHgwMDAwMDAwYX0sCisJezB4MDAwMDliMjQsIDB4MDAwMDAwMGJ9LAorCXsweDAwMDA5YjI4LCAweDAwMDAwMDBjfSwKKwl7MHgwMDAwOWIyYywgMHgwMDAwMDAwZH0sCisJezB4MDAwMDliMzAsIDB4MDAwMDAwMTB9LAorCXsweDAwMDA5YjM0LCAweDAwMDAwMDExfSwKKwl7MHgwMDAwOWIzOCwgMHgwMDAwMDAxMn0sCisJezB4MDAwMDliM2MsIDB4MDAwMDAwMTN9LAorCXsweDAwMDA5YjQwLCAweDAwMDAwMDE0fSwKKwl7MHgwMDAwOWI0NCwgMHgwMDAwMDAxNX0sCisJezB4MDAwMDliNDgsIDB4MDAwMDAwMTh9LAorCXsweDAwMDA5YjRjLCAweDAwMDAwMDE5fSwKKwl7MHgwMDAwOWI1MCwgMHgwMDAwMDAxYX0sCisJezB4MDAwMDliNTQsIDB4MDAwMDAwMWJ9LAorCXsweDAwMDA5YjU4LCAweDAwMDAwMDFjfSwKKwl7MHgwMDAwOWI1YywgMHgwMDAwMDAxZH0sCisJezB4MDAwMDliNjAsIDB4MDAwMDAwMjB9LAorCXsweDAwMDA5YjY0LCAweDAwMDAwMDIxfSwKKwl7MHgwMDAwOWI2OCwgMHgwMDAwMDAyMn0sCisJezB4MDAwMDliNmMsIDB4MDAwMDAwMjN9LAorCXsweDAwMDA5YjcwLCAweDAwMDAwMDI0fSwKKwl7MHgwMDAwOWI3NCwgMHgwMDAwMDAyNX0sCisJezB4MDAwMDliNzgsIDB4MDAwMDAwMjh9LAorCXsweDAwMDA5YjdjLCAweDAwMDAwMDI5fSwKKwl7MHgwMDAwOWI4MCwgMHgwMDAwMDAyYX0sCisJezB4MDAwMDliODQsIDB4MDAwMDAwMmJ9LAorCXsweDAwMDA5Yjg4LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwOWI4YywgMHgwMDAwMDAyZH0sCisJezB4MDAwMDliOTAsIDB4MDAwMDAwMzB9LAorCXsweDAwMDA5Yjk0LCAweDAwMDAwMDMxfSwKKwl7MHgwMDAwOWI5OCwgMHgwMDAwMDAzMn0sCisJezB4MDAwMDliOWMsIDB4MDAwMDAwMzN9LAorCXsweDAwMDA5YmEwLCAweDAwMDAwMDM0fSwKKwl7MHgwMDAwOWJhNCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYTgsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmFjLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJiMCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYjQsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmI4LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJiYywgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYzAsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmM0LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJjOCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliY2MsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmQwLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJkNCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZDgsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmRjLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJlMCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZTQsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmU4LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJlYywgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZjAsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmY0LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJmOCwgMHgwMDAwMDAxMH0sCisJezB4MDAwMDliZmMsIDB4MDAwMDAwMWF9LAorCXsweDAwMDBhMjEwLCAweDQwODA2MzMzfSwKKwl7MHgwMDAwYTIxNCwgMHgwMDEwNmMxMH0sCisJezB4MDAwMGEyMTgsIDB4MDA5YzQwNjB9LAorCXsweDAwMDBhMjIwLCAweDAxODgzMGM2fSwKKwl7MHgwMDAwYTIyNCwgMHgwMDAwMDQwMH0sCisJezB4MDAwMGEyMjgsIDB4MDAwMDBiYjV9LAorCXsweDAwMDBhMjJjLCAweDAwMDAwMDExfSwKKwl7MHgwMDAwYTIzNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyMzgsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMjNjLCAweDEzYzg4OWFmfSwKKwl7MHgwMDAwYTI0MCwgMHgzODQ5MGEyMH0sCisJezB4MDAwMGEyNDQsIDB4MDAwMDdiYjZ9LAorCXsweDAwMDBhMjQ4LCAweDBmZmYzZmZjfSwKKwl7MHgwMDAwYTI0YywgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEyNTAsIDB4MDAwMGEwMDB9LAorCXsweDAwMDBhMjU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI1OCwgMHgwY2M3NTM4MH0sCisJezB4MDAwMGEyNWMsIDB4MGYwZjBmMDF9LAorCXsweDAwMDBhMjYwLCAweGRmYTkxZjAxfSwKKwl7MHgwMDAwYTI2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNmMsIDB4MGU3OWU1YzZ9LAorCXsweDAwMDBiMjZjLCAweDBlNzllNWM2fSwKKwl7MHgwMDAwYzI2YywgMHgwZTc5ZTVjNn0sCisJezB4MDAwMGQyNzAsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBhMjc4LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTI3YywgMHgwNTE3MDFjZX0sCisJezB4MDAwMGEzMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ4LCAweDNmZmZmZmZmfSwKKwl7MHgwMDAwYTM0YywgMHgzZmZmZmZmZn0sCisJezB4MDAwMGEzNTAsIDB4M2ZmZmZmZmZ9LAorCXsweDAwMDBhMzU0LCAweDAwMDNmZmZmfSwKKwl7MHgwMDAwYTM1OCwgMHg3OWE4YWExZn0sCisJezB4MDAwMGQzNWMsIDB4MDdmZmZmZWZ9LAorCXsweDAwMDBkMzYwLCAweDBmZmZmZmU3fSwKKwl7MHgwMDAwZDM2NCwgMHgxN2ZmZmZlNX0sCisJezB4MDAwMGQzNjgsIDB4MWZmZmZmZTR9LAorCXsweDAwMDBkMzZjLCAweDM3ZmZmZmUzfSwKKwl7MHgwMDAwZDM3MCwgMHgzZmZmZmZlM30sCisJezB4MDAwMGQzNzQsIDB4NTdmZmZmZTN9LAorCXsweDAwMDBkMzc4LCAweDVmZmZmZmUyfSwKKwl7MHgwMDAwZDM3YywgMHg3ZmZmZmZlMn0sCisJezB4MDAwMGQzODAsIDB4N2YzYzdiYmF9LAorCXsweDAwMDBkMzg0LCAweGYzMzA3ZmYwfSwKKwl7MHgwMDAwYTM4OCwgMHgwODAwMDAwMH0sCisJezB4MDAwMGEzOGMsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMzkwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTM5NCwgMHgxY2U3MzljZX0sCisJezB4MDAwMGEzOTgsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhMzljLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTNhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2E4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2I0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2MwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYzgsIDB4MDAwMDAyNDZ9LAorCXsweDAwMDBhM2NjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkMCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDQsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2RjLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTNlMCwgMHgwMDAwMDFjZX0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbmswW11bMl0gPSB7Ci0gICAgeyAweDAwMDA5OGIwLCAweDFlNTc5NWU1IH0sCi0gICAgeyAweDAwMDA5OGUwLCAweDAyMDA4MDIwIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA5OGIwLCAweDFlNTc5NWU1fSwKKwl7MHgwMDAwOThlMCwgMHgwMjAwODAyMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJCX1JmR2FpbltdWzNdID0gewotICAgIHsgMHgwMDAwOWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwNCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MCB9LAotICAgIHsgMHgwMDAwOWEwOCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCB9LAotICAgIHsgMHgwMDAwOWEwYywgMHgwMDAwMDFhMSwgMHgwMDAwMDE0MSB9LAotICAgIHsgMHgwMDAwOWExMCwgMHgwMDAwMDFlMSwgMHgwMDAwMDE4MSB9LAotICAgIHsgMHgwMDAwOWExNCwgMHgwMDAwMDAyMSwgMHgwMDAwMDFjMSB9LAotICAgIHsgMHgwMDAwOWExOCwgMHgwMDAwMDA2MSwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOWExYywgMHgwMDAwMDE2OCwgMHgwMDAwMDA0MSB9LAotICAgIHsgMHgwMDAwOWEyMCwgMHgwMDAwMDFhOCwgMHgwMDAwMDFhOCB9LAotICAgIHsgMHgwMDAwOWEyNCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCB9LAotICAgIHsgMHgwMDAwOWEyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCB9LAotICAgIHsgMHgwMDAwOWEyYywgMHgwMDAwMDA2OCwgMHgwMDAwMDA2OCB9LAotICAgIHsgMHgwMDAwOWEzMCwgMHgwMDAwMDE4OSwgMHgwMDAwMDBhOCB9LAotICAgIHsgMHgwMDAwOWEzNCwgMHgwMDAwMDFjOSwgMHgwMDAwMDE2OSB9LAotICAgIHsgMHgwMDAwOWEzOCwgMHgwMDAwMDAwOSwgMHgwMDAwMDFhOSB9LAotICAgIHsgMHgwMDAwOWEzYywgMHgwMDAwMDA0OSwgMHgwMDAwMDFlOSB9LAotICAgIHsgMHgwMDAwOWE0MCwgMHgwMDAwMDA4OSwgMHgwMDAwMDAyOSB9LAotICAgIHsgMHgwMDAwOWE0NCwgMHgwMDAwMDE3MCwgMHgwMDAwMDA2OSB9LAotICAgIHsgMHgwMDAwOWE0OCwgMHgwMDAwMDFiMCwgMHgwMDAwMDE5MCB9LAotICAgIHsgMHgwMDAwOWE0YywgMHgwMDAwMDFmMCwgMHgwMDAwMDFkMCB9LAotICAgIHsgMHgwMDAwOWE1MCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwOWE1NCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA1MCB9LAotICAgIHsgMHgwMDAwOWE1OCwgMHgwMDAwMDE5MSwgMHgwMDAwMDA5MCB9LAotICAgIHsgMHgwMDAwOWE1YywgMHgwMDAwMDFkMSwgMHgwMDAwMDE1MSB9LAotICAgIHsgMHgwMDAwOWE2MCwgMHgwMDAwMDAxMSwgMHgwMDAwMDE5MSB9LAotICAgIHsgMHgwMDAwOWE2NCwgMHgwMDAwMDA1MSwgMHgwMDAwMDFkMSB9LAotICAgIHsgMHgwMDAwOWE2OCwgMHgwMDAwMDA5MSwgMHgwMDAwMDAxMSB9LAotICAgIHsgMHgwMDAwOWE2YywgMHgwMDAwMDFiOCwgMHgwMDAwMDA1MSB9LAotICAgIHsgMHgwMDAwOWE3MCwgMHgwMDAwMDFmOCwgMHgwMDAwMDE5OCB9LAotICAgIHsgMHgwMDAwOWE3NCwgMHgwMDAwMDAzOCwgMHgwMDAwMDFkOCB9LAotICAgIHsgMHgwMDAwOWE3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDAxOCB9LAotICAgIHsgMHgwMDAwOWE3YywgMHgwMDAwMDE5OSwgMHgwMDAwMDA1OCB9LAotICAgIHsgMHgwMDAwOWE4MCwgMHgwMDAwMDFkOSwgMHgwMDAwMDA5OCB9LAotICAgIHsgMHgwMDAwOWE4NCwgMHgwMDAwMDAxOSwgMHgwMDAwMDE1OSB9LAotICAgIHsgMHgwMDAwOWE4OCwgMHgwMDAwMDA1OSwgMHgwMDAwMDE5OSB9LAotICAgIHsgMHgwMDAwOWE4YywgMHgwMDAwMDA5OSwgMHgwMDAwMDFkOSB9LAotICAgIHsgMHgwMDAwOWE5MCwgMHgwMDAwMDBkOSwgMHgwMDAwMDAxOSB9LAotICAgIHsgMHgwMDAwOWE5NCwgMHgwMDAwMDBmOSwgMHgwMDAwMDA1OSB9LAotICAgIHsgMHgwMDAwOWE5OCwgMHgwMDAwMDBmOSwgMHgwMDAwMDA5OSB9LAotICAgIHsgMHgwMDAwOWE5YywgMHgwMDAwMDBmOSwgMHgwMDAwMDBkOSB9LAotICAgIHsgMHgwMDAwOWFhMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFhNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFhOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFhYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwOWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMDQsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDB9LAorCXsweDAwMDA5YTA4LCAweDAwMDAwMDgwLCAweDAwMDAwMDgwfSwKKwl7MHgwMDAwOWEwYywgMHgwMDAwMDFhMSwgMHgwMDAwMDE0MX0sCisJezB4MDAwMDlhMTAsIDB4MDAwMDAxZTEsIDB4MDAwMDAxODF9LAorCXsweDAwMDA5YTE0LCAweDAwMDAwMDIxLCAweDAwMDAwMWMxfSwKKwl7MHgwMDAwOWExOCwgMHgwMDAwMDA2MSwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDlhMWMsIDB4MDAwMDAxNjgsIDB4MDAwMDAwNDF9LAorCXsweDAwMDA5YTIwLCAweDAwMDAwMWE4LCAweDAwMDAwMWE4fSwKKwl7MHgwMDAwOWEyNCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOH0sCisJezB4MDAwMDlhMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjh9LAorCXsweDAwMDA5YTJjLCAweDAwMDAwMDY4LCAweDAwMDAwMDY4fSwKKwl7MHgwMDAwOWEzMCwgMHgwMDAwMDE4OSwgMHgwMDAwMDBhOH0sCisJezB4MDAwMDlhMzQsIDB4MDAwMDAxYzksIDB4MDAwMDAxNjl9LAorCXsweDAwMDA5YTM4LCAweDAwMDAwMDA5LCAweDAwMDAwMWE5fSwKKwl7MHgwMDAwOWEzYywgMHgwMDAwMDA0OSwgMHgwMDAwMDFlOX0sCisJezB4MDAwMDlhNDAsIDB4MDAwMDAwODksIDB4MDAwMDAwMjl9LAorCXsweDAwMDA5YTQ0LCAweDAwMDAwMTcwLCAweDAwMDAwMDY5fSwKKwl7MHgwMDAwOWE0OCwgMHgwMDAwMDFiMCwgMHgwMDAwMDE5MH0sCisJezB4MDAwMDlhNGMsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZDB9LAorCXsweDAwMDA5YTUwLCAweDAwMDAwMDMwLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwOWE1NCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA1MH0sCisJezB4MDAwMDlhNTgsIDB4MDAwMDAxOTEsIDB4MDAwMDAwOTB9LAorCXsweDAwMDA5YTVjLCAweDAwMDAwMWQxLCAweDAwMDAwMTUxfSwKKwl7MHgwMDAwOWE2MCwgMHgwMDAwMDAxMSwgMHgwMDAwMDE5MX0sCisJezB4MDAwMDlhNjQsIDB4MDAwMDAwNTEsIDB4MDAwMDAxZDF9LAorCXsweDAwMDA5YTY4LCAweDAwMDAwMDkxLCAweDAwMDAwMDExfSwKKwl7MHgwMDAwOWE2YywgMHgwMDAwMDFiOCwgMHgwMDAwMDA1MX0sCisJezB4MDAwMDlhNzAsIDB4MDAwMDAxZjgsIDB4MDAwMDAxOTh9LAorCXsweDAwMDA5YTc0LCAweDAwMDAwMDM4LCAweDAwMDAwMWQ4fSwKKwl7MHgwMDAwOWE3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDAxOH0sCisJezB4MDAwMDlhN2MsIDB4MDAwMDAxOTksIDB4MDAwMDAwNTh9LAorCXsweDAwMDA5YTgwLCAweDAwMDAwMWQ5LCAweDAwMDAwMDk4fSwKKwl7MHgwMDAwOWE4NCwgMHgwMDAwMDAxOSwgMHgwMDAwMDE1OX0sCisJezB4MDAwMDlhODgsIDB4MDAwMDAwNTksIDB4MDAwMDAxOTl9LAorCXsweDAwMDA5YThjLCAweDAwMDAwMDk5LCAweDAwMDAwMWQ5fSwKKwl7MHgwMDAwOWE5MCwgMHgwMDAwMDBkOSwgMHgwMDAwMDAxOX0sCisJezB4MDAwMDlhOTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwNTl9LAorCXsweDAwMDA5YTk4LCAweDAwMDAwMGY5LCAweDAwMDAwMDk5fSwKKwl7MHgwMDAwOWE5YywgMHgwMDAwMDBmOSwgMHgwMDAwMDBkOX0sCisJezB4MDAwMDlhYTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWE0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFhOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWIwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFiNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWJjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFjMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYzQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWM4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFjYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZDAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWQ0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFkOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZGMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWUwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFlNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWVjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFmMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWY4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFmYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbmsxW11bMl0gPSB7Ci0gICAgeyAweDAwMDA5OGIwLCAweDAyMTA4NDIxIH0sCi0gICAgeyAweDAwMDA5OGVjLCAweDAwMDAwMDA4IH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA5OGIwLCAweDAyMTA4NDIxfSwKKwl7MHgwMDAwOThlYywgMHgwMDAwMDAwOH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbmsyW11bMl0gPSB7Ci0gICAgeyAweDAwMDA5OGIwLCAweDBlNzNmZjE3IH0sCi0gICAgeyAweDAwMDA5OGUwLCAweDAwMDAwNDIwIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA5OGIwLCAweDBlNzNmZjE3fSwKKwl7MHgwMDAwOThlMCwgMHgwMDAwMDQyMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbmszW11bM10gPSB7Ci0gICAgeyAweDAwMDA5OGYwLCAweDAxNDAwMDE4LCAweDAxYzAwMDE4IH0sCisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAqLworCXsweDAwMDA5OGYwLCAweDAxNDAwMDE4LCAweDAxYzAwMDE4fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazZbXVszXSA9IHsKLQotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVlMDAwMCwgMHgwMDVlMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHg0MGZmMDAwMCwgMHg0MGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDg3MDAwMCwgMHgwMDg3MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY5MDAwMCwgMHgwMGY5MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY1MDAwMCwgMHgwMGY1MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDExMDAwMCwgMHgwMDExMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYxMDBhOCwgMHgwMDYxMDBhOCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQyMTBhMiwgMHgwMDQyMTBhMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDE0MDA4ZiwgMHgwMDE0MDA4ZiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGM0MDAwMywgMHgwMGM0MDAwMyB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQ0MDAxNiwgMHgwMDQ0MDAxNiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQxMDA0MCwgMHgwMDQxMDA0MCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwYzBhYiwgMHgwMDAwYzBhYiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBmMSwgMHgwMDAwMDBmMSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCB9LAotICAgIHsgMHgwMDAwOThkMCwgMHgwMDAwMDAwZiwgMHgwMDEwMDAwZiB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA1ZTAwMDAsIDB4MDA1ZTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMTIwMDAwLCAweDAwMTIwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMjAwMDAsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDQwZmYwMDAwLCAweDQwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA4NzAwMDAsIDB4MDA4NzAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjkwMDAwLCAweDAwZjkwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjUwMDAwLCAweDAwZjUwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNjEwMGE4LCAweDAwNjEwMGE4fSwKKwl7MHgwMDAwOTg5YywgMHgwMDQyMTBhMiwgMHgwMDQyMTBhMn0sCisJezB4MDAwMDk4OWMsIDB4MDAxNDAwOGYsIDB4MDAxNDAwOGZ9LAorCXsweDAwMDA5ODljLCAweDAwYzQwMDAzLCAweDAwYzQwMDAzfSwKKwl7MHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMn0sCisJezB4MDAwMDk4OWMsIDB4MDA0NDAwMTYsIDB4MDA0NDAwMTZ9LAorCXsweDAwMDA5ODljLCAweDAwNDEwMDQwLCAweDAwNDEwMDQwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMGMwYWIsIDB4MDAwMGMwYWJ9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGYxLCAweDAwMDAwMGYxfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDR9LAorCXsweDAwMDA5OGQwLCAweDAwMDAwMDBmLCAweDAwMTAwMDBmfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazZUUENbXVszXSA9IHsKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBlMDAwMDAsIDB4MDBlMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA1ZTAwMDAsIDB4MDA1ZTAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA2MjAwMDAsIDB4MDA2MjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMjAwMDAsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4NDBmZjAwMDAsIDB4NDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA1ZjAwMDAsIDB4MDA1ZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA4NzAwMDAsIDB4MDA4NzAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBmOTAwMDAsIDB4MDBmOTAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA3YjAwMDAsIDB4MDA3YjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBmNTAwMDAsIDB4MDBmNTAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBkYzAwMDAsIDB4MDBkYzAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA2MTAwYTgsIDB4MDA2MTAwYTggfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA0MjMwMjIsIDB4MDA0MjMwMjIgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MjAxNDAwZGYsIDB4MjAxNDAwZGYgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDBjNDAwMDIsIDB4MDBjNDAwMDIgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAzMDAwZjIsIDB4MDAzMDAwZjIgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA0NDAwMTYsIDB4MDA0NDAwMTYgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDA0MTAwNDAsIDB4MDA0MTAwNDAgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMTgwNWUsIDB4MDAwMTgwNWUgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMGMwYWIsIDB4MDAwMGMwYWIgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMDAwZTEsIDB4MDAwMDAwZTEgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMDcwODEsIDB4MDAwMDcwODEgfSwKLSAgICB7IDB4MDAwMDk4OWMsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDQgfSwKLSAgICB7IDB4MDAwMDk4ZDAsIDB4MDAwMDAwMGYsIDB4MDAxMDAwMGYgfSwKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICovCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBlMDAwMDAsIDB4MDBlMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNWUwMDAwLCAweDAwNWUwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA2MjAwMDAsIDB4MDA2MjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDIwMDAwLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHg0MGZmMDAwMCwgMHg0MGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA1ZjAwMDAsIDB4MDA1ZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwODcwMDAwLCAweDAwODcwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGY5MDAwMCwgMHgwMGY5MDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA3YjAwMDAsIDB4MDA3YjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGY1MDAwMCwgMHgwMGY1MDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBkYzAwMDAsIDB4MDBkYzAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMTEwMDAwLCAweDAwMTEwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDYxMDBhOCwgMHgwMDYxMDBhOH0sCisJezB4MDAwMDk4OWMsIDB4MDA0MjMwMjIsIDB4MDA0MjMwMjJ9LAorCXsweDAwMDA5ODljLCAweDIwMTQwMGRmLCAweDIwMTQwMGRmfSwKKwl7MHgwMDAwOTg5YywgMHgwMGM0MDAwMiwgMHgwMGM0MDAwMn0sCisJezB4MDAwMDk4OWMsIDB4MDAzMDAwZjIsIDB4MDAzMDAwZjJ9LAorCXsweDAwMDA5ODljLCAweDAwNDQwMDE2LCAweDAwNDQwMDE2fSwKKwl7MHgwMDAwOTg5YywgMHgwMDQxMDA0MCwgMHgwMDQxMDA0MH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMTgwNWUsIDB4MDAwMTgwNWV9LAorCXsweDAwMDA5ODljLCAweDAwMDBjMGFiLCAweDAwMDBjMGFifSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDBlMSwgMHgwMDAwMDBlMX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDcwODEsIDB4MDAwMDcwODF9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGQ0LCAweDAwMDAwMGQ0fSwKKwl7MHgwMDAwOThkMCwgMHgwMDAwMDAwZiwgMHgwMDEwMDAwZn0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbms3W11bMl0gPSB7Ci0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwNTAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwODAwIH0sCi0gICAgeyAweDAwMDA5OGNjLCAweDAwMDAwMDBlIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA5ODljLCAweDAwMDAwNTAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDgwMH0sCisJezB4MDAwMDk4Y2MsIDB4MDAwMDAwMGV9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZBZGRhY1tdWzJdID0gewotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMyB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwYyB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAzMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDA2MCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDA1OCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5OGNjLCAgMHgwMDAwMDAwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDN9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwY30sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDMwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDA2MH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwNTh9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOThjYywgMHgwMDAwMDAwMH0sCiB9OwogCi1zdGF0aWMgY29uc3QgdTMyIGFyNTQxNk1vZGVzXzkxMDBbXVs2XSA9IHsKLSAgICB7IDB4MDAwMDEwMzAsIDB4MDAwMDAyMzAsIDB4MDAwMDA0NjAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODAgfSwKLSAgICB7IDB4MDAwMDEwZjAsIDB4MDAwMGEwMDAsIDB4MDAwMTQwMDAsIDB4MDAwMTYwMDAsIDB4MDAwMGIwMDAsIDB4MDAwMTQwMDggfSwKLSAgICB7IDB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTAgfSwKLSAgICB7IDB4MDAwMDgwMWMsIDB4MTI4ZDkzYTcsIDB4MTI4ZDkzY2YsIDB4MTJlMDEzZDcsIDB4MTJlMDEzYWIsIDB4MDk4ODEzY2YgfSwKLSAgICB7IDB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDMgfSwKLSAgICB7IDB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSwKLSAgICB7IDB4MDAwMDk4MjQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEgfSwKLSAgICB7IDB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDk4NDQsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAgfSwKLSAgICB7IDB4MDAwMDk4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjggfSwKLSAgICB7IDB4MDAwMGE4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjggfSwKLSAgICB7IDB4MDAwMGI4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjggfSwKLSAgICB7IDB4MDAwMDk4NTAsIDB4NmQ0OGI0ZTIsIDB4NmQ0OGI0ZTIsIDB4NmQ0OGIwZTIsIDB4NmQ0OGIwZTIsIDB4NmQ0OGIwZTIgfSwKLSAgICB7IDB4MDAwMDk4NTgsIDB4N2VjODJkMmUsIDB4N2VjODJkMmUsIDB4N2VjODZkMmUsIDB4N2VjODRkMmUsIDB4N2VjODJkMmUgfSwKLSAgICB7IDB4MDAwMDk4NWMsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUgfSwKLSAgICB7IDB4MDAwMDk4NjAsIDB4MDAwNDhkMTgsIDB4MDAwNDhkMTgsIDB4MDAwNDhkMjAsIDB4MDAwNDhkMjAsIDB4MDAwNDhkMTggfSwKLSAgICB7IDB4MDAwMGM4NjQsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAgfSwKLSAgICB7IDB4MDAwMDk4NjgsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAgfSwKLSAgICB7IDB4MDAwMDk4NmMsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEgfSwKLSAgICB7IDB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDA3ZDAsIDB4MDAwMDA4OTgsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDAgfSwKLSAgICB7IDB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTYgfSwKLSAgICB7IDB4MDAwMDk5MjQsIDB4ZDAwYThhMDcsIDB4ZDAwYThhMDcsIDB4ZDAwYThhMTEsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGQgfSwKLSAgICB7IDB4MDAwMDk5NDAsIDB4MDA3NTQ2MDQsIDB4MDA3NTQ2MDQsIDB4ZmZmODEyMDQsIDB4ZmZmODEyMDQsIDB4ZmZmODEyMDQgfSwKLSAgICB7IDB4MDAwMDk5NDQsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAsIDB4ZGZiODEwMjAgfSwKLSAgICB7IDB4MDAwMDk5NTQsIDB4NWYzY2EzZGUsIDB4NWYzY2EzZGUsIDB4ZTI1MGE1MWUsIDB4ZTI1MGE1MWUsIDB4ZTI1MGE1MWUgfSwKLSAgICB7IDB4MDAwMDk5NTgsIDB4MjEwOGVjZmYsIDB4MjEwOGVjZmYsIDB4MzM4OGZmZmYsIDB4MzM4OGZmZmYsIDB4MzM4OGZmZmYgfSwKLSNpZmRlZiBUQjI0MwotICAgIHsgMHgwMDAwOTk2MCwgMHgwMDAwMDkwMCwgMHgwMDAwMDkwMCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAxMmQ4MCB9LAotICAgIHsgMHgwMDAwYTk2MCwgMHgwMDAwMDkwMCwgMHgwMDAwMDkwMCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAxMmQ4MCB9LAotICAgIHsgMHgwMDAwYjk2MCwgMHgwMDAwMDkwMCwgMHgwMDAwMDkwMCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAxMmQ4MCB9LAotICAgIHsgMHgwMDAwOTk2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMjIxMCwgMHgwMDAwMjIxMCwgMHgwMDAwMTEyMCB9LAotI2Vsc2UKLSAgICB7IDB4MDAwMDk5NjAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAgfSwKLSAgICB7IDB4MDAwMGE5NjAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAgfSwKLSAgICB7IDB4MDAwMGI5NjAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAgfSwKLSAgICB7IDB4MDAwMDk5NjQsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAgfSwKLSNlbmRpZgotICAgIHsgMHgwMDAwYzliYywgMHgwMDFhMDYwMCwgMHgwMDFhMDYwMCwgMHgwMDFhMTAwMCwgMHgwMDFhMGMwMCwgMHgwMDFhMGMwMCB9LAotICAgIHsgMHgwMDAwOTljMCwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSB9LAotICAgIHsgMHgwMDAwOTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NyB9LAotICAgIHsgMHgwMDAwOTljOCwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSB9LAotICAgIHsgMHgwMDAwOTljYywgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCB9LAotICAgIHsgMHgwMDAwOTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCB9LAotICAgIHsgMHgwMDAwOTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTIwNCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCB9LAotICAgIHsgMHgwMDAwYTIwOCwgMHhkNmJlNDc4OCwgMHhkNmJlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCB9LAotICAgIHsgMHgwMDAwYTIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9LAotICAgIHsgMHgwMDAwYjIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9LAotICAgIHsgMHgwMDAwYzIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9LAotICAgIHsgMHgwMDAwYTIxYywgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSB9LAotICAgIHsgMHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTFhOWNhYSwgMHgwYTFhOWNhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSB9LAotICAgIHsgMHgwMDAwYTMwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMiB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHg0ODA3M2UwNiwgMHg0ODA3M2UwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiB9LAotICAgIHsgMHgwMDAwYTMwYywgMHg1NjBiNGMwYSwgMHg1NjBiNGMwYSwgMHg2MjFhNTQwYiwgMHg2MjFhNTQwYiwgMHg2MjFhNTQwYiB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYiB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHg3YTRmNmUxYiwgMHg3YTRmNmUxYiwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHg4YzViN2U1YSwgMHg4YzViN2U1YSwgMHg5NTBmOGNjZiwgMHg5NTBmOGNjZiwgMHg5NTBmOGNjZiB9LAotICAgIHsgMHgwMDAwYTMxYywgMHg5ZDBmOTZjZiwgMHg5ZDBmOTZjZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0ZiB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHhiNTFmYTY5ZiwgMHhiNTFmYTY5ZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHhjYjNmYmQwNywgMHhjYjNmYmNiZiwgMHhkMWZmYzkzZiwgMHhkMWZmYzkzZiwgMHhkMWZmYzkzZiB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAwZDdiZiwgMHgwMDAwZDdiZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotfTsKLQotI2VuZGlmIC8qIElOSVRWQUxTX0FSNTAwOF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYwppbmRleCBiMmMxN2M5Li4zZDJjODY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKQEAgLTE5LDcgKzE5LDMwIEBACiAjaW5jbHVkZSAiLi4vcmVnZC5oIgogI2luY2x1ZGUgImFyOTAwMl9waHkuaCIKIAotLyogQWxsIGNvZGUgYmVsb3cgaXMgZm9yIG5vbiBzaW5nbGUtY2hpcCBzb2x1dGlvbnMgKi8KKy8qIEFsbCBjb2RlIGJlbG93IGlzIGZvciBBUjUwMDgsIEFSOTAwMSwgQVI5MDAyICovCisKK3N0YXRpYyBjb25zdCBpbnQgZmlyc3RlcF90YWJsZVtdID0KKy8qIGxldmVsOiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAqLworCXsgLTQsIC0yLCAgMCwgIDIsICA0LCAgNiwgIDgsIDEwLCAxMiB9OyAvKiBsdmwgMC04LCBkZWZhdWx0IDIgKi8KKworc3RhdGljIGNvbnN0IGludCBjeWNwd3JUaHIxX3RhYmxlW10gPQorLyogbGV2ZWw6ICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICovCisJeyAtNiwgLTQsIC0yLCAgMCwgIDIsICA0LCAgNiwgIDggfTsgICAgIC8qIGx2bCAwLTcsIGRlZmF1bHQgMyAqLworCisvKgorICogcmVnaXN0ZXIgdmFsdWVzIHRvIHR1cm4gT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gT0ZGCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgbTFUaHJlc2hMb3dfb2ZmID0gMTI3Oworc3RhdGljIGNvbnN0IGludCBtMlRocmVzaExvd19vZmYgPSAxMjc7CitzdGF0aWMgY29uc3QgaW50IG0xVGhyZXNoX29mZiA9IDEyNzsKK3N0YXRpYyBjb25zdCBpbnQgbTJUaHJlc2hfb2ZmID0gMTI3Oworc3RhdGljIGNvbnN0IGludCBtMkNvdW50VGhyX29mZiA9ICAzMTsKK3N0YXRpYyBjb25zdCBpbnQgbTJDb3VudFRockxvd19vZmYgPSAgNjM7CitzdGF0aWMgY29uc3QgaW50IG0xVGhyZXNoTG93RXh0X29mZiA9IDEyNzsKK3N0YXRpYyBjb25zdCBpbnQgbTJUaHJlc2hMb3dFeHRfb2ZmID0gMTI3Oworc3RhdGljIGNvbnN0IGludCBtMVRocmVzaEV4dF9vZmYgPSAxMjc7CitzdGF0aWMgY29uc3QgaW50IG0yVGhyZXNoRXh0X29mZiA9IDEyNzsKKwogCiAvKioKICAqIGFyNTAwOF9od19waHlfbW9kaWZ5X3J4X2J1ZmZlcigpIC0gcGVyZm9ybSBhbmFsb2cgc3dpenpsaW5nIG9mIHBhcmFtZXRlcnMKQEAgLTc0MiwxNyArNzY1LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKEFSX1NSRVZfOTI4N18xMl9PUl9MQVRFUihhaCkpIHsKLQkJLyogRW5hYmxlIEFTWU5DIEZJRk8gKi8KLQkJUkVHX1NFVF9CSVQoYWgsIEFSX01BQ19QQ1VfQVNZTkNfRklGT19SRUczLAotCQkJCUFSX01BQ19QQ1VfQVNZTkNfRklGT19SRUczX0RBVEFQQVRIX1NFTCk7Ci0JCVJFR19TRVRfQklUKGFoLCBBUl9QSFlfTU9ERSwgQVJfUEhZX01PREVfQVNZTkNGSUZPKTsKLQkJUkVHX0NMUl9CSVQoYWgsIEFSX01BQ19QQ1VfQVNZTkNfRklGT19SRUczLAotCQkJCUFSX01BQ19QQ1VfQVNZTkNfRklGT19SRUczX1NPRlRfUkVTRVQpOwotCQlSRUdfU0VUX0JJVChhaCwgQVJfTUFDX1BDVV9BU1lOQ19GSUZPX1JFRzMsCi0JCQkJQVJfTUFDX1BDVV9BU1lOQ19GSUZPX1JFRzNfU09GVF9SRVNFVCk7Ci0JfQotCiAJLyoKIAkgKiBTZXQgY29ycmVjdCBiYXNlYmFuZCB0byBhbmFsb2cgc2hpZnQgc2V0dGluZyB0bwogCSAqIGFjY2VzcyBhbmFsb2cgY2hpcHMuCkBAIC0xMDM3LDggKzEwNDksOSBAQAogCXJldHVybiBwbGw7CiB9CiAKLXN0YXRpYyBib29sIGFyNTAwOF9od19hbmlfY29udHJvbChzdHJ1Y3QgYXRoX2h3ICphaCwKLQkJCQkgIGVudW0gYXRoOWtfYW5pX2NtZCBjbWQsIGludCBwYXJhbSkKK3N0YXRpYyBib29sIGFyNTAwOF9od19hbmlfY29udHJvbF9vbGQoc3RydWN0IGF0aF9odyAqYWgsCisJCQkJICAgICAgZW51bSBhdGg5a19hbmlfY21kIGNtZCwKKwkJCQkgICAgICBpbnQgcGFyYW0pCiB7CiAJc3RydWN0IGFyNTQxNkFuaVN0YXRlICphbmlTdGF0ZSA9IGFoLT5jdXJhbmk7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CkBAIC0xMjIwLDYwICsxMjMzLDM2OSBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBhcjUwMDhfaHdfYW5pX2NvbnRyb2xfbmV3KHN0cnVjdCBhdGhfaHcgKmFoLAorCQkJCSAgICAgIGVudW0gYXRoOWtfYW5pX2NtZCBjbWQsCisJCQkJICAgICAgaW50IHBhcmFtKQoreworCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGUgPSBhaC0+Y3VyYW5pOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuID0gYWgtPmN1cmNoYW47CisJczMyIHZhbHVlLCB2YWx1ZTI7CisKKwlzd2l0Y2ggKGNtZCAmIGFoLT5hbmlfZnVuY3Rpb24pIHsKKwljYXNlIEFUSDlLX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTjp7CisJCS8qCisJCSAqIG9uID09IDEgbWVhbnMgb2ZkbSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gaXMgT04KKwkJICogb24gPT0gMSBpcyB0aGUgZGVmYXVsdCwgZm9yIGxlc3Mgbm9pc2UgaW1tdW5pdHkKKwkJICoKKwkJICogb24gPT0gMCBtZWFucyBvZmRtIHdlYWsgc2lnbmFsIGRldGVjdGlvbiBpcyBPRkYKKwkJICogb24gPT0gMCBtZWFucyBtb3JlIG5vaXNlIGltbQorCQkgKi8KKwkJdTMyIG9uID0gcGFyYW0gPyAxIDogMDsKKwkJLyoKKwkJICogbWFrZSByZWdpc3RlciBzZXR0aW5nIGZvciBkZWZhdWx0CisJCSAqICh3ZWFrIHNpZyBkZXRlY3QgT04pIGNvbWUgZnJvbSBJTkkgZmlsZQorCQkgKi8KKwkJaW50IG0xVGhyZXNoTG93ID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMVRocmVzaExvdyA6IG0xVGhyZXNoTG93X29mZjsKKwkJaW50IG0yVGhyZXNoTG93ID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMlRocmVzaExvdyA6IG0yVGhyZXNoTG93X29mZjsKKwkJaW50IG0xVGhyZXNoID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMVRocmVzaCA6IG0xVGhyZXNoX29mZjsKKwkJaW50IG0yVGhyZXNoID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMlRocmVzaCA6IG0yVGhyZXNoX29mZjsKKwkJaW50IG0yQ291bnRUaHIgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0yQ291bnRUaHIgOiBtMkNvdW50VGhyX29mZjsKKwkJaW50IG0yQ291bnRUaHJMb3cgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0yQ291bnRUaHJMb3cgOiBtMkNvdW50VGhyTG93X29mZjsKKwkJaW50IG0xVGhyZXNoTG93RXh0ID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMVRocmVzaExvd0V4dCA6IG0xVGhyZXNoTG93RXh0X29mZjsKKwkJaW50IG0yVGhyZXNoTG93RXh0ID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMlRocmVzaExvd0V4dCA6IG0yVGhyZXNoTG93RXh0X29mZjsKKwkJaW50IG0xVGhyZXNoRXh0ID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMVRocmVzaEV4dCA6IG0xVGhyZXNoRXh0X29mZjsKKwkJaW50IG0yVGhyZXNoRXh0ID0gb24gPworCQkJYW5pU3RhdGUtPmluaURlZi5tMlRocmVzaEV4dCA6IG0yVGhyZXNoRXh0X29mZjsKKworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfU0ZDT1JSX0xPVywKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1csCisJCQkgICAgICBtMVRocmVzaExvdyk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlJfTE9XLAorCQkJICAgICAgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPVywKKwkJCSAgICAgIG0yVGhyZXNoTG93KTsKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1NGQ09SUiwKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfTTFfVEhSRVNILCBtMVRocmVzaCk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlIsCisJCQkgICAgICBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCwgbTJUaHJlc2gpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfU0ZDT1JSLAorCQkJICAgICAgQVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUiwgbTJDb3VudFRocik7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlJfTE9XLAorCQkJICAgICAgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XLAorCQkJICAgICAgbTJDb3VudFRockxvdyk7CisKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1NGQ09SUl9FWFQsCisJCQkgICAgICBBUl9QSFlfU0ZDT1JSX0VYVF9NMV9USFJFU0hfTE9XLCBtMVRocmVzaExvd0V4dCk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlJfRVhULAorCQkJICAgICAgQVJfUEhZX1NGQ09SUl9FWFRfTTJfVEhSRVNIX0xPVywgbTJUaHJlc2hMb3dFeHQpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfU0ZDT1JSX0VYVCwKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfRVhUX00xX1RIUkVTSCwgbTFUaHJlc2hFeHQpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfU0ZDT1JSX0VYVCwKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfRVhUX00yX1RIUkVTSCwgbTJUaHJlc2hFeHQpOworCisJCWlmIChvbikKKwkJCVJFR19TRVRfQklUKGFoLCBBUl9QSFlfU0ZDT1JSX0xPVywKKwkJCQkgICAgQVJfUEhZX1NGQ09SUl9MT1dfVVNFX1NFTEZfQ09SUl9MT1cpOworCQllbHNlCisJCQlSRUdfQ0xSX0JJVChhaCwgQVJfUEhZX1NGQ09SUl9MT1csCisJCQkJICAgIEFSX1BIWV9TRkNPUlJfTE9XX1VTRV9TRUxGX0NPUlJfTE9XKTsKKworCQlpZiAoIW9uICE9IGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikgeworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAiKiogY2ggJWQ6IG9mZG0gd2VhayBzaWduYWw6ICVzPT4lc1xuIiwKKwkJCQkgIGNoYW4tPmNoYW5uZWwsCisJCQkJICAhYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID8KKwkJCQkJIm9uIiA6ICJvZmYiLAorCQkJCSAgb24gPyAib24iIDogIm9mZiIpOworCQkJaWYgKG9uKQorCQkJCWFoLT5zdGF0cy5hc3RfYW5pX29mZG1vbisrOworCQkJZWxzZQorCQkJCWFoLT5zdGF0cy5hc3RfYW5pX29mZG1vZmYrKzsKKwkJCWFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9ICFvbjsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVEg5S19BTklfRklSU1RFUF9MRVZFTDp7CisJCXUzMiBsZXZlbCA9IHBhcmFtOworCisJCWlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKGZpcnN0ZXBfdGFibGUpKSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICJBVEg5S19BTklfRklSU1RFUF9MRVZFTDogbGV2ZWwgIgorCQkJCSAgIm91dCBvZiByYW5nZSAoJXUgPiAldSlcbiIsCisJCQkJICBsZXZlbCwKKwkJCQkgICh1bnNpZ25lZCkgQVJSQVlfU0laRShmaXJzdGVwX3RhYmxlKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKgorCQkgKiBtYWtlIHJlZ2lzdGVyIHNldHRpbmcgcmVsYXRpdmUgdG8gZGVmYXVsdAorCQkgKiBmcm9tIElOSSBmaWxlICYgY2FwIHZhbHVlCisJCSAqLworCQl2YWx1ZSA9IGZpcnN0ZXBfdGFibGVbbGV2ZWxdIC0KKwkJCWZpcnN0ZXBfdGFibGVbQVRIOUtfQU5JX0ZJUlNURVBfTFZMX05FV10gKworCQkJYW5pU3RhdGUtPmluaURlZi5maXJzdGVwOworCQlpZiAodmFsdWUgPCBBVEg5S19TSUdfRklSU1RFUF9TRVRUSU5HX01JTikKKwkJCXZhbHVlID0gQVRIOUtfU0lHX0ZJUlNURVBfU0VUVElOR19NSU47CisJCWlmICh2YWx1ZSA+IEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUFYKQorCQkJdmFsdWUgPSBBVEg5S19TSUdfRklSU1RFUF9TRVRUSU5HX01BWDsKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0ZJTkRfU0lHLAorCQkJICAgICAgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVAsCisJCQkgICAgICB2YWx1ZSk7CisJCS8qCisJCSAqIHdlIG5lZWQgdG8gc2V0IGZpcnN0IHN0ZXAgbG93IHJlZ2lzdGVyIHRvbworCQkgKiBtYWtlIHJlZ2lzdGVyIHNldHRpbmcgcmVsYXRpdmUgdG8gZGVmYXVsdAorCQkgKiBmcm9tIElOSSBmaWxlICYgY2FwIHZhbHVlCisJCSAqLworCQl2YWx1ZTIgPSBmaXJzdGVwX3RhYmxlW2xldmVsXSAtCisJCQkgZmlyc3RlcF90YWJsZVtBVEg5S19BTklfRklSU1RFUF9MVkxfTkVXXSArCisJCQkgYW5pU3RhdGUtPmluaURlZi5maXJzdGVwTG93OworCQlpZiAodmFsdWUyIDwgQVRIOUtfU0lHX0ZJUlNURVBfU0VUVElOR19NSU4pCisJCQl2YWx1ZTIgPSBBVEg5S19TSUdfRklSU1RFUF9TRVRUSU5HX01JTjsKKwkJaWYgKHZhbHVlMiA+IEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUFYKQorCQkJdmFsdWUyID0gQVRIOUtfU0lHX0ZJUlNURVBfU0VUVElOR19NQVg7CisKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0ZJTkRfU0lHX0xPVywKKwkJCSAgICAgIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX0xPVywgdmFsdWUyKTsKKworCQlpZiAobGV2ZWwgIT0gYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkgeworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAiKiogY2ggJWQ6IGxldmVsICVkPT4lZFtkZWY6JWRdICIKKwkJCQkgICJmaXJzdGVwW2xldmVsXT0lZCBpbmk9JWRcbiIsCisJCQkJICBjaGFuLT5jaGFubmVsLAorCQkJCSAgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCwKKwkJCQkgIGxldmVsLAorCQkJCSAgQVRIOUtfQU5JX0ZJUlNURVBfTFZMX05FVywKKwkJCQkgIHZhbHVlLAorCQkJCSAgYW5pU3RhdGUtPmluaURlZi5maXJzdGVwKTsKKwkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJCSAgIioqIGNoICVkOiBsZXZlbCAlZD0+JWRbZGVmOiVkXSAiCisJCQkJICAiZmlyc3RlcF9sb3dbbGV2ZWxdPSVkIGluaT0lZFxuIiwKKwkJCQkgIGNoYW4tPmNoYW5uZWwsCisJCQkJICBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsLAorCQkJCSAgbGV2ZWwsCisJCQkJICBBVEg5S19BTklfRklSU1RFUF9MVkxfTkVXLAorCQkJCSAgdmFsdWUyLAorCQkJCSAgYW5pU3RhdGUtPmluaURlZi5maXJzdGVwTG93KTsKKwkJCWlmIChsZXZlbCA+IGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwpCisJCQkJYWgtPnN0YXRzLmFzdF9hbmlfc3RlcHVwKys7CisJCQllbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwpCisJCQkJYWgtPnN0YXRzLmFzdF9hbmlfc3RlcGRvd24rKzsKKwkJCWFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPSBsZXZlbDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVEg5S19BTklfU1BVUl9JTU1VTklUWV9MRVZFTDp7CisJCXUzMiBsZXZlbCA9IHBhcmFtOworCisJCWlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKGN5Y3B3clRocjFfdGFibGUpKSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICJBVEg5S19BTklfU1BVUl9JTU1VTklUWV9MRVZFTDogbGV2ZWwgIgorCQkJCSAgIm91dCBvZiByYW5nZSAoJXUgPiAldSlcbiIsCisJCQkJICBsZXZlbCwKKwkJCQkgICh1bnNpZ25lZCkgQVJSQVlfU0laRShjeWNwd3JUaHIxX3RhYmxlKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJLyoKKwkJICogbWFrZSByZWdpc3RlciBzZXR0aW5nIHJlbGF0aXZlIHRvIGRlZmF1bHQKKwkJICogZnJvbSBJTkkgZmlsZSAmIGNhcCB2YWx1ZQorCQkgKi8KKwkJdmFsdWUgPSBjeWNwd3JUaHIxX3RhYmxlW2xldmVsXSAtCisJCQljeWNwd3JUaHIxX3RhYmxlW0FUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXXSArCisJCQlhbmlTdGF0ZS0+aW5pRGVmLmN5Y3B3clRocjE7CisJCWlmICh2YWx1ZSA8IEFUSDlLX1NJR19TUFVSX0lNTV9TRVRUSU5HX01JTikKKwkJCXZhbHVlID0gQVRIOUtfU0lHX1NQVVJfSU1NX1NFVFRJTkdfTUlOOworCQlpZiAodmFsdWUgPiBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NQVgpCisJCQl2YWx1ZSA9IEFUSDlLX1NJR19TUFVSX0lNTV9TRVRUSU5HX01BWDsKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1RJTUlORzUsCisJCQkgICAgICBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMSwKKwkJCSAgICAgIHZhbHVlKTsKKworCQkvKgorCQkgKiBzZXQgQVJfUEhZX0VYVF9DQ0EgZm9yIGV4dGVuc2lvbiBjaGFubmVsCisJCSAqIG1ha2UgcmVnaXN0ZXIgc2V0dGluZyByZWxhdGl2ZSB0byBkZWZhdWx0CisJCSAqIGZyb20gSU5JIGZpbGUgJiBjYXAgdmFsdWUKKwkJICovCisJCXZhbHVlMiA9IGN5Y3B3clRocjFfdGFibGVbbGV2ZWxdIC0KKwkJCSBjeWNwd3JUaHIxX3RhYmxlW0FUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXXSArCisJCQkgYW5pU3RhdGUtPmluaURlZi5jeWNwd3JUaHIxRXh0OworCQlpZiAodmFsdWUyIDwgQVRIOUtfU0lHX1NQVVJfSU1NX1NFVFRJTkdfTUlOKQorCQkJdmFsdWUyID0gQVRIOUtfU0lHX1NQVVJfSU1NX1NFVFRJTkdfTUlOOworCQlpZiAodmFsdWUyID4gQVRIOUtfU0lHX1NQVVJfSU1NX1NFVFRJTkdfTUFYKQorCQkJdmFsdWUyID0gQVRIOUtfU0lHX1NQVVJfSU1NX1NFVFRJTkdfTUFYOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfRVhUX0NDQSwKKwkJCSAgICAgIEFSX1BIWV9FWFRfVElNSU5HNV9DWUNQV1JfVEhSMSwgdmFsdWUyKTsKKworCQlpZiAobGV2ZWwgIT0gYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsKSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICIqKiBjaCAlZDogbGV2ZWwgJWQ9PiVkW2RlZjolZF0gIgorCQkJCSAgImN5Y3B3clRocjFbbGV2ZWxdPSVkIGluaT0lZFxuIiwKKwkJCQkgIGNoYW4tPmNoYW5uZWwsCisJCQkJICBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCisJCQkJICBsZXZlbCwKKwkJCQkgIEFUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXLAorCQkJCSAgdmFsdWUsCisJCQkJICBhbmlTdGF0ZS0+aW5pRGVmLmN5Y3B3clRocjEpOworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAiKiogY2ggJWQ6IGxldmVsICVkPT4lZFtkZWY6JWRdICIKKwkJCQkgICJjeWNwd3JUaHIxRXh0W2xldmVsXT0lZCBpbmk9JWRcbiIsCisJCQkJICBjaGFuLT5jaGFubmVsLAorCQkJCSAgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsLAorCQkJCSAgbGV2ZWwsCisJCQkJICBBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX05FVywKKwkJCQkgIHZhbHVlMiwKKwkJCQkgIGFuaVN0YXRlLT5pbmlEZWYuY3ljcHdyVGhyMUV4dCk7CisJCQlpZiAobGV2ZWwgPiBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwpCisJCQkJYWgtPnN0YXRzLmFzdF9hbmlfc3B1cnVwKys7CisJCQllbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKKwkJCQlhaC0+c3RhdHMuYXN0X2FuaV9zcHVyZG93bisrOworCQkJYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsID0gbGV2ZWw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVRIOUtfQU5JX01SQ19DQ0s6CisJCS8qCisJCSAqIFlvdSBzaG91bGQgbm90IHNlZSB0aGlzIGFzIEFSNTAwOCwgQVI5MDAxLCBBUjkwMDIKKwkJICogZG9lcyBub3QgaGF2ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBNUkMgQ0NLLgorCQkgKi8KKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJY2FzZSBBVEg5S19BTklfUFJFU0VOVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkgICJpbnZhbGlkIGNtZCAldVxuIiwgY21kKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkgICJBTkkgcGFyYW1ldGVyczogU0k9JWQsIG9mZG1XUz0lcyBGUz0lZCAiCisJCSAgIk1SQ2Njaz0lcyBsaXN0ZW5UaW1lPSVkIENDPSVkIGxpc3Rlbj0lZCAiCisJCSAgIm9mZG1FcnJzPSVkIGNja0VycnM9JWRcbiIsCisJCSAgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsLAorCQkgICFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYgPyAib24iIDogIm9mZiIsCisJCSAgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCwKKwkJICAhYW5pU3RhdGUtPm1yY0NDS09mZiA/ICJvbiIgOiAib2ZmIiwKKwkJICBhbmlTdGF0ZS0+bGlzdGVuVGltZSwKKwkJICBhbmlTdGF0ZS0+Y3ljbGVDb3VudCwKKwkJICBhbmlTdGF0ZS0+bGlzdGVuVGltZSwKKwkJICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50LAorCQkgIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCk7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkIGFyNTAwOF9od19kb19nZXRuZihzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCSAgICAgIGludDE2X3QgbmZhcnJheVtOVU1fTkZfUkVBRElOR1NdKQogewotCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCWludDE2X3QgbmY7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfQ0NBKSwgQVJfUEhZX01JTkNDQV9QV1IpOwotCWlmIChuZiAmIDB4MTAwKQotCQluZiA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2N0bF0gW2NoYWluIDBdIGlzICVkXG4iLCBuZik7Ci0JbmZhcnJheVswXSA9IG5mOworCW5mYXJyYXlbMF0gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfQ0gxX0NDQSksIEFSX1BIWV9DSDFfTUlOQ0NBX1BXUik7Ci0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJICAiTkYgY2FsaWJyYXRlZCBbY3RsXSBbY2hhaW4gMV0gaXMgJWRcbiIsIG5mKTsKLQluZmFycmF5WzFdID0gbmY7CisJbmZhcnJheVsxXSA9IHNpZ25fZXh0ZW5kKG5mLCA5KTsKIAogCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DSDJfQ0NBKSwgQVJfUEhZX0NIMl9NSU5DQ0FfUFdSKTsKLQlpZiAobmYgJiAweDEwMCkKLQkJbmYgPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOwotCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkgICJORiBjYWxpYnJhdGVkIFtjdGxdIFtjaGFpbiAyXSBpcyAlZFxuIiwgbmYpOwotCW5mYXJyYXlbMl0gPSBuZjsKKwluZmFycmF5WzJdID0gc2lnbl9leHRlbmQobmYsIDkpOworCisJaWYgKCFJU19DSEFOX0hUNDAoYWgtPmN1cmNoYW4pKQorCQlyZXR1cm47CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfRVhUX0NDQSksIEFSX1BIWV9FWFRfTUlOQ0NBX1BXUik7Ci0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJICAiTkYgY2FsaWJyYXRlZCBbZXh0XSBbY2hhaW4gMF0gaXMgJWRcbiIsIG5mKTsKLQluZmFycmF5WzNdID0gbmY7CisJbmZhcnJheVszXSA9IHNpZ25fZXh0ZW5kKG5mLCA5KTsKIAogCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DSDFfRVhUX0NDQSksIEFSX1BIWV9DSDFfRVhUX01JTkNDQV9QV1IpOwotCWlmIChuZiAmIDB4MTAwKQotCQluZiA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2V4dF0gW2NoYWluIDFdIGlzICVkXG4iLCBuZik7Ci0JbmZhcnJheVs0XSA9IG5mOworCW5mYXJyYXlbNF0gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfQ0gyX0VYVF9DQ0EpLCBBUl9QSFlfQ0gyX0VYVF9NSU5DQ0FfUFdSKTsKLQlpZiAobmYgJiAweDEwMCkKLQkJbmYgPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOwotCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkgICJORiBjYWxpYnJhdGVkIFtleHRdIFtjaGFpbiAyXSBpcyAlZFxuIiwgbmYpOwotCW5mYXJyYXlbNV0gPSBuZjsKKwluZmFycmF5WzVdID0gc2lnbl9leHRlbmQobmYsIDkpOwogfQogCi1zdGF0aWMgdm9pZCBhcjUwMDhfaHdfbG9hZG5mKHN0cnVjdCBhdGhfaHcgKmFoLCBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBTkkgcmVnaXN0ZXIgdmFsdWVzIHdpdGggZGVmYXVsdCAoaW5pKSB2YWx1ZXMuCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGR1cmluZyBhIChmdWxsKSBoYXJkd2FyZSByZXNldCBhZnRlcgorICogYWxsIHRoZSByZWdpc3RlcnMgYXJlIGluaXRpYWxpc2VkIGZyb20gdGhlIElOSS4KKyAqLworc3RhdGljIHZvaWQgYXI1MDA4X2h3X2FuaV9jYWNoZV9pbmlfcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoOWtfbmZjYWxfaGlzdCAqaDsKLQlpbnQgaSwgajsKLQlpbnQzMl90IHZhbDsKKwlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuID0gYWgtPmN1cmNoYW47CisJc3RydWN0IGF0aDlrX2FuaV9kZWZhdWx0ICppbmlEZWY7CisJaW50IGluZGV4OworCXUzMiB2YWw7CisKKwlpbmRleCA9IGF0aDlrX2h3X2dldF9hbmlfY2hhbm5lbF9pZHgoYWgsIGNoYW4pOworCWFuaVN0YXRlID0gJmFoLT5hbmlbaW5kZXhdOworCWFoLT5jdXJhbmkgPSBhbmlTdGF0ZTsKKwlpbmlEZWYgPSAmYW5pU3RhdGUtPmluaURlZjsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkgICJ2ZXIgJWQuJWQgb3Btb2RlICV1IGNoYW4gJWQgTWh6LzB4JXhcbiIsCisJCSAgYWgtPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiwKKwkJICBhaC0+aHdfdmVyc2lvbi5tYWNSZXYsCisJCSAgYWgtPm9wbW9kZSwKKwkJICBjaGFuLT5jaGFubmVsLAorCQkgIGNoYW4tPmNoYW5uZWxGbGFncyk7CisKKwl2YWwgPSBSRUdfUkVBRChhaCwgQVJfUEhZX1NGQ09SUik7CisJaW5pRGVmLT5tMVRocmVzaCA9IE1TKHZhbCwgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0gpOworCWluaURlZi0+bTJUaHJlc2ggPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIKTsKKwlpbmlEZWYtPm0yQ291bnRUaHIgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIpOworCisJdmFsID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9TRkNPUlJfTE9XKTsKKwlpbmlEZWYtPm0xVGhyZXNoTG93ID0gTVModmFsLCBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XKTsKKwlpbmlEZWYtPm0yVGhyZXNoTG93ID0gTVModmFsLCBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XKTsKKwlpbmlEZWYtPm0yQ291bnRUaHJMb3cgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPVyk7CisKKwl2YWwgPSBSRUdfUkVBRChhaCwgQVJfUEhZX1NGQ09SUl9FWFQpOworCWluaURlZi0+bTFUaHJlc2hFeHQgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfRVhUX00xX1RIUkVTSCk7CisJaW5pRGVmLT5tMlRocmVzaEV4dCA9IE1TKHZhbCwgQVJfUEhZX1NGQ09SUl9FWFRfTTJfVEhSRVNIKTsKKwlpbmlEZWYtPm0xVGhyZXNoTG93RXh0ID0gTVModmFsLCBBUl9QSFlfU0ZDT1JSX0VYVF9NMV9USFJFU0hfTE9XKTsKKwlpbmlEZWYtPm0yVGhyZXNoTG93RXh0ID0gTVModmFsLCBBUl9QSFlfU0ZDT1JSX0VYVF9NMl9USFJFU0hfTE9XKTsKKwlpbmlEZWYtPmZpcnN0ZXAgPSBSRUdfUkVBRF9GSUVMRChhaCwKKwkJCQkJIEFSX1BIWV9GSU5EX1NJRywKKwkJCQkJIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQKTsKKwlpbmlEZWYtPmZpcnN0ZXBMb3cgPSBSRUdfUkVBRF9GSUVMRChhaCwKKwkJCQkJICAgIEFSX1BIWV9GSU5EX1NJR19MT1csCisJCQkJCSAgICBBUl9QSFlfRklORF9TSUdfRklSU1RFUF9MT1cpOworCWluaURlZi0+Y3ljcHdyVGhyMSA9IFJFR19SRUFEX0ZJRUxEKGFoLAorCQkJCQkgICAgQVJfUEhZX1RJTUlORzUsCisJCQkJCSAgICBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMSk7CisJaW5pRGVmLT5jeWNwd3JUaHIxRXh0ID0gUkVHX1JFQURfRklFTEQoYWgsCisJCQkJCSAgICAgICBBUl9QSFlfRVhUX0NDQSwKKwkJCQkJICAgICAgIEFSX1BIWV9FWFRfVElNSU5HNV9DWUNQV1JfVEhSMSk7CisKKwkvKiB0aGVzZSBsZXZlbHMganVzdCBnb3QgcmVzZXQgdG8gZGVmYXVsdHMgYnkgdGhlIElOSSAqLworCWFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCA9IEFUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXOworCWFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPSBBVEg5S19BTklfRklSU1RFUF9MVkxfTkVXOworCWFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9ICFBVEg5S19BTklfVVNFX09GRE1fV0VBS19TSUc7CisJYW5pU3RhdGUtPm1yY0NDS09mZiA9IHRydWU7IC8qIG5vdCBhdmFpbGFibGUgb24gcHJlIEFSOTAwMyAqLworCisJYW5pU3RhdGUtPmN5Y2xlQ291bnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBhcjUwMDhfaHdfc2V0X25mX2xpbWl0cyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlhaC0+bmZfMmcubWF4ID0gQVJfUEhZX0NDQV9NQVhfR09PRF9WQUxfNTQxNl8yR0haOworCWFoLT5uZl8yZy5taW4gPSBBUl9QSFlfQ0NBX01JTl9HT09EX1ZBTF81NDE2XzJHSFo7CisJYWgtPm5mXzJnLm5vbWluYWwgPSBBUl9QSFlfQ0NBX05PTV9WQUxfNTQxNl8yR0haOworCWFoLT5uZl81Zy5tYXggPSBBUl9QSFlfQ0NBX01BWF9HT09EX1ZBTF81NDE2XzVHSFo7CisJYWgtPm5mXzVnLm1pbiA9IEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzU0MTZfNUdIWjsKKwlhaC0+bmZfNWcubm9taW5hbCA9IEFSX1BIWV9DQ0FfTk9NX1ZBTF81NDE2XzVHSFo7Cit9CisKK3ZvaWQgYXI1MDA4X2h3X2F0dGFjaF9waHlfb3BzKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfaHdfcHJpdmF0ZV9vcHMgKnByaXZfb3BzID0gYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpOwogCWNvbnN0IHUzMiBhcjU0MTZfY2NhX3JlZ3NbNl0gPSB7CiAJCUFSX1BIWV9DQ0EsCiAJCUFSX1BIWV9DSDFfQ0NBLApAQCAtMTI4Miw2NyArMTYwNCw2IEBACiAJCUFSX1BIWV9DSDFfRVhUX0NDQSwKIAkJQVJfUEhZX0NIMl9FWFRfQ0NBCiAJfTsKLQl1OCBjaGFpbm1hc2ssIHJ4X2NoYWluX3N0YXR1czsKLQotCXJ4X2NoYWluX3N0YXR1cyA9IFJFR19SRUFEKGFoLCBBUl9QSFlfUlhfQ0hBSU5NQVNLKTsKLQlpZiAoQVJfU1JFVl85Mjg1KGFoKSB8fCBBUl9TUkVWXzkyNzEoYWgpKQotCQljaGFpbm1hc2sgPSAweDk7Ci0JZWxzZSBpZiAoQVJfU1JFVl85MjgwKGFoKSB8fCBBUl9TUkVWXzkyODcoYWgpKSB7Ci0JCWlmICgocnhfY2hhaW5fc3RhdHVzICYgMHgyKSB8fCAocnhfY2hhaW5fc3RhdHVzICYgMHg0KSkKLQkJCWNoYWlubWFzayA9IDB4MUI7Ci0JCWVsc2UKLQkJCWNoYWlubWFzayA9IDB4MDk7Ci0JfSBlbHNlIHsKLQkJaWYgKHJ4X2NoYWluX3N0YXR1cyAmIDB4NCkKLQkJCWNoYWlubWFzayA9IDB4M0Y7Ci0JCWVsc2UgaWYgKHJ4X2NoYWluX3N0YXR1cyAmIDB4MikKLQkJCWNoYWlubWFzayA9IDB4MUI7Ci0JCWVsc2UKLQkJCWNoYWlubWFzayA9IDB4MDk7Ci0JfQotCi0JaCA9IGFoLT5uZkNhbEhpc3Q7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX05GX1JFQURJTkdTOyBpKyspIHsKLQkJaWYgKGNoYWlubWFzayAmICgxIDw8IGkpKSB7Ci0JCQl2YWwgPSBSRUdfUkVBRChhaCwgYXI1NDE2X2NjYV9yZWdzW2ldKTsKLQkJCXZhbCAmPSAweEZGRkZGRTAwOwotCQkJdmFsIHw9ICgoKHUzMikgKGhbaV0ucHJpdk5GKSA8PCAxKSAmIDB4MWZmKTsKLQkJCVJFR19XUklURShhaCwgYXI1NDE2X2NjYV9yZWdzW2ldLCB2YWwpOwotCQl9Ci0JfQotCi0JUkVHX0NMUl9CSVQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwKLQkJICAgIEFSX1BIWV9BR0NfQ09OVFJPTF9FTkFCTEVfTkYpOwotCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wsCi0JCSAgICBBUl9QSFlfQUdDX0NPTlRST0xfTk9fVVBEQVRFX05GKTsKLQlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX0FHQ19DT05UUk9MLCBBUl9QSFlfQUdDX0NPTlRST0xfTkYpOwotCi0JZm9yIChqID0gMDsgaiA8IDU7IGorKykgewotCQlpZiAoKFJFR19SRUFEKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wpICYKLQkJICAgICBBUl9QSFlfQUdDX0NPTlRST0xfTkYpID09IDApCi0JCQlicmVhazsKLQkJdWRlbGF5KDUwKTsKLQl9Ci0KLQlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fTkZfUkVBRElOR1M7IGkrKykgewotCQlpZiAoY2hhaW5tYXNrICYgKDEgPDwgaSkpIHsKLQkJCXZhbCA9IFJFR19SRUFEKGFoLCBhcjU0MTZfY2NhX3JlZ3NbaV0pOwotCQkJdmFsICY9IDB4RkZGRkZFMDA7Ci0JCQl2YWwgfD0gKCgodTMyKSAoLTUwKSA8PCAxKSAmIDB4MWZmKTsKLQkJCVJFR19XUklURShhaCwgYXI1NDE2X2NjYV9yZWdzW2ldLCB2YWwpOwotCQl9Ci0JfQotCi0JUkVHV1JJVEVfQlVGRkVSX0ZMVVNIKGFoKTsKLQlESVNBQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7Ci19Ci0KLXZvaWQgYXI1MDA4X2h3X2F0dGFjaF9waHlfb3BzKHN0cnVjdCBhdGhfaHcgKmFoKQotewotCXN0cnVjdCBhdGhfaHdfcHJpdmF0ZV9vcHMgKnByaXZfb3BzID0gYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpOwogCiAJcHJpdl9vcHMtPnJmX3NldF9mcmVxID0gYXI1MDA4X2h3X3NldF9jaGFubmVsOwogCXByaXZfb3BzLT5zcHVyX21pdGlnYXRlX2ZyZXEgPSBhcjUwMDhfaHdfc3B1cl9taXRpZ2F0ZTsKQEAgLTEzNjEsOSArMTYyMiwxMyBAQAogCXByaXZfb3BzLT5lbmFibGVfcmZraWxsID0gYXI1MDA4X2h3X2VuYWJsZV9yZmtpbGw7CiAJcHJpdl9vcHMtPnJlc3RvcmVfY2hhaW5tYXNrID0gYXI1MDA4X3Jlc3RvcmVfY2hhaW5tYXNrOwogCXByaXZfb3BzLT5zZXRfZGl2ZXJzaXR5ID0gYXI1MDA4X3NldF9kaXZlcnNpdHk7Ci0JcHJpdl9vcHMtPmFuaV9jb250cm9sID0gYXI1MDA4X2h3X2FuaV9jb250cm9sOwogCXByaXZfb3BzLT5kb19nZXRuZiA9IGFyNTAwOF9od19kb19nZXRuZjsKLQlwcml2X29wcy0+bG9hZG5mID0gYXI1MDA4X2h3X2xvYWRuZjsKKworCWlmIChtb2RwYXJhbV9mb3JjZV9uZXdfYW5pKSB7CisJCXByaXZfb3BzLT5hbmlfY29udHJvbCA9IGFyNTAwOF9od19hbmlfY29udHJvbF9uZXc7CisJCXByaXZfb3BzLT5hbmlfY2FjaGVfaW5pX3JlZ3MgPSBhcjUwMDhfaHdfYW5pX2NhY2hlX2luaV9yZWdzOworCX0gZWxzZQorCQlwcml2X29wcy0+YW5pX2NvbnRyb2wgPSBhcjUwMDhfaHdfYW5pX2NvbnRyb2xfb2xkOwogCiAJaWYgKEFSX1NSRVZfOTEwMChhaCkpCiAJCXByaXZfb3BzLT5jb21wdXRlX3BsbF9jb250cm9sID0gYXI5MTAwX2h3X2NvbXB1dGVfcGxsX2NvbnRyb2w7CkBAIC0xMzcxLDQgKzE2MzYsNyBAQAogCQlwcml2X29wcy0+Y29tcHV0ZV9wbGxfY29udHJvbCA9IGFyOTE2MF9od19jb21wdXRlX3BsbF9jb250cm9sOwogCWVsc2UKIAkJcHJpdl9vcHMtPmNvbXB1dGVfcGxsX2NvbnRyb2wgPSBhcjUwMDhfaHdfY29tcHV0ZV9wbGxfY29udHJvbDsKKworCWFyNTAwOF9od19zZXRfbmZfbGltaXRzKGFoKTsKKwltZW1jcHkoYWgtPm5mX3JlZ3MsIGFyNTQxNl9jY2FfcmVncywgc2l6ZW9mKGFoLT5uZl9yZWdzKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAxX2luaXR2YWxzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAxX2luaXR2YWxzLmgKaW5kZXggMGI5NGJkMy4uNjlhOTRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMV9pbml0dmFscy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDFfaW5pdHZhbHMuaApAQCAtMSwxMjU0ICsxLDEzNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZNb2Rlc185MTAwW11bNl0gPSB7CisJezB4MDAwMDEwMzAsIDB4MDAwMDAyMzAsIDB4MDAwMDA0NjAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTB9LAorCXsweDAwMDAxMDcwLCAweDAwMDAwMTY4LCAweDAwMDAwMmQwLCAweDAwMDAwMzE4LCAweDAwMDAwMThjLCAweDAwMDAwMWUwfSwKKwl7MHgwMDAwMTBiMCwgMHgwMDAwMGU2MCwgMHgwMDAwMWNjMCwgMHgwMDAwN2M3MCwgMHgwMDAwM2UzOCwgMHgwMDAwMTE4MH0sCisJezB4MDAwMDEwZjAsIDB4MDAwMGEwMDAsIDB4MDAwMTQwMDAsIDB4MDAwMTYwMDAsIDB4MDAwMGIwMDAsIDB4MDAwMTQwMDh9LAorCXsweDAwMDA4MDE0LCAweDAzZTgwM2U4LCAweDA3ZDAwN2QwLCAweDEwODAxNjAwLCAweDA4NDAwYjAwLCAweDA2ZTAwNmUwfSwKKwl7MHgwMDAwODAxYywgMHgxMjhkOTNhNywgMHgxMjhkOTNjZiwgMHgxMmUwMTNkNywgMHgxMmUwMTNhYiwgMHgwOTg4MTNjZn0sCisJezB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTB9LAorCXsweDAwMDA4MWQwLCAweDAwMDAzMjEwLCAweDAwMDAzMjEwLCAweDAwMDAzMjBhLCAweDAwMDAzMjBhLCAweDAwMDAzMjBhfSwKKwl7MHgwMDAwOTgwNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwM30sCisJezB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDB9LAorCXsweDAwMDA5ODI0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlfSwKKwl7MHgwMDAwOTgyOCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMX0sCisJezB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGV9LAorCXsweDAwMDA5ODM4LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3fSwKKwl7MHgwMDAwOTg0NCwgMHgwMzcyMTYxZSwgMHgwMzcyMTYxZSwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMH0sCisJezB4MDAwMDk4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjh9LAorCXsweDAwMDBhODQ4LCAweDAwMWE2YTY1LCAweDAwMWE2YTY1LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4fSwKKwl7MHgwMDAwYjg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OH0sCisJezB4MDAwMDk4NTAsIDB4NmM0OGI0ZTIsIDB4NmQ0OGI0ZTIsIDB4NmQ0OGIwZTIsIDB4NmM0OGIwZTIsIDB4NmM0OGIwZTJ9LAorCXsweDAwMDA5ODU4LCAweDdlYzgyZDJlLCAweDdlYzgyZDJlLCAweDdlYzgyZDJlLCAweDdlYzgyZDJlLCAweDdlYzgyZDJlfSwKKwl7MHgwMDAwOTg1YywgMHgzMTM5NWQ1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NWQ1ZSwgMHgzMTM5NWQ1ZX0sCisJezB4MDAwMDk4NjAsIDB4MDAwNDhkMTgsIDB4MDAwNDhkMTgsIDB4MDAwNDhkMjAsIDB4MDAwNDhkMjAsIDB4MDAwNDhkMTh9LAorCXsweDAwMDBjODY0LCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwLCAweDAwMDFjZTAwfSwKKwl7MHgwMDAwOTg2OCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMH0sCisJezB4MDAwMDk4NmMsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODEsIDB4MDUwY2IwODF9LAorCXsweDAwMDA5OTE0LCAweDAwMDAwN2QwLCAweDAwMDAwZmEwLCAweDAwMDAxMTMwLCAweDAwMDAwODk4LCAweDAwMDAwN2QwfSwKKwl7MHgwMDAwOTkxOCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNn0sCisJezB4MDAwMDk5MjQsIDB4ZDAwYThhMDcsIDB4ZDAwYThhMDcsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGR9LAorCXsweDAwMDA5OTQwLCAweDAwNzUwNjA0LCAweDAwNzU0NjA0LCAweGZmZjgxMjA0LCAweGZmZjgxMjA0LCAweGZmZjgxMjA0fSwKKwl7MHgwMDAwOTk0NCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMH0sCisJezB4MDAwMDk5NTQsIDB4NWYzY2EzZGUsIDB4NWYzY2EzZGUsIDB4ZTI1MGE1MWUsIDB4ZTI1MGE1MWUsIDB4ZTI1MGE1MWV9LAorCXsweDAwMDA5OTU4LCAweDIxMDhlY2ZmLCAweDIxMDhlY2ZmLCAweDMzODhmZmZmLCAweDMzODhmZmZmLCAweDMzODhmZmZmfSwKKwl7MHgwMDAwOTk2MCwgMHgwMDAxYmZjMCwgMHgwMDAxYmZjMCwgMHgwMDAxYmZjMCwgMHgwMDAxYmZjMCwgMHgwMDAxYmZjMH0sCisJezB4MDAwMGE5NjAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzAsIDB4MDAwMWJmYzB9LAorCXsweDAwMDBiOTYwLCAweDAwMDFiZmMwLCAweDAwMDFiZmMwLCAweDAwMDFiZmMwLCAweDAwMDFiZmMwLCAweDAwMDFiZmMwfSwKKwl7MHgwMDAwOTk2NCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMH0sCisJezB4MDAwMGM5YmMsIDB4MDAxYTA2MDAsIDB4MDAxYTA2MDAsIDB4MDAxYTEwMDAsIDB4MDAxYTBjMDAsIDB4MDAxYTBjMDB9LAorCXsweDAwMDA5OWMwLCAweDAzODkxOWJlLCAweDAzODkxOWJlLCAweDAzODkxOWJlLCAweDAzODkxOWJlLCAweDAzODkxOWJlfSwKKwl7MHgwMDAwOTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3N30sCisJezB4MDAwMDk5YzgsIDB4NmFmNjUzMjksIDB4NmFmNjUzMjksIDB4NmFmNjUzMjksIDB4NmFmNjUzMjksIDB4NmFmNjUzMjl9LAorCXsweDAwMDA5OWNjLCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4fSwKKwl7MHgwMDAwOTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NH0sCisJezB4MDAwMDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIwNCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MH0sCisJezB4MDAwMGEyMDgsIDB4ZDZiZTQ3ODgsIDB4ZDZiZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB4ZDAzZTQ3ODh9LAorCXsweDAwMDBhMjBjLCAweDAwMmZjMTYwLCAweDAwMmZjMTYwLCAweDAwMmFjMTIwLCAweDAwMmFjMTIwLCAweDAwMmFjMTIwfSwKKwl7MHgwMDAwYjIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMH0sCisJezB4MDAwMGMyMGMsIDB4MDAyZmMxNjAsIDB4MDAyZmMxNjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjB9LAorCXsweDAwMDBhMjFjLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhfSwKKwl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNzQsIDB4MGExYTljYWEsIDB4MGExYTljYWEsIDB4MGExYTdjYWEsIDB4MGExYTdjYWEsIDB4MGExYTdjYWF9LAorCXsweDAwMDBhMzAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwfSwKKwl7MHgwMDAwYTMwNCwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMn0sCisJezB4MDAwMGEzMDgsIDB4NDgwNzNlMDYsIDB4NDgwNzNlMDYsIDB4NGEwYTNjMDYsIDB4NGEwYTNjMDYsIDB4NGEwYTNjMDZ9LAorCXsweDAwMDBhMzBjLCAweDU2MGI0YzBhLCAweDU2MGI0YzBhLCAweDYyMWE1NDBiLCAweDYyMWE1NDBiLCAweDYyMWE1NDBifSwKKwl7MHgwMDAwYTMxMCwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYn0sCisJezB4MDAwMGEzMTQsIDB4N2E0ZjZlMWIsIDB4N2E0ZjZlMWIsIDB4ODQ1YjdhNWEsIDB4ODQ1YjdhNWEsIDB4ODQ1YjdhNWF9LAorCXsweDAwMDBhMzE4LCAweDhjNWI3ZTVhLCAweDhjNWI3ZTVhLCAweDk1MGY4Y2NmLCAweDk1MGY4Y2NmLCAweDk1MGY4Y2NmfSwKKwl7MHgwMDAwYTMxYywgMHg5ZDBmOTZjZiwgMHg5ZDBmOTZjZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0Zn0sCisJezB4MDAwMGEzMjAsIDB4YjUxZmE2OWYsIDB4YjUxZmE2OWYsIDB4YmRkZmFmMWYsIDB4YmRkZmFmMWYsIDB4YmRkZmFmMWZ9LAorCXsweDAwMDBhMzI0LCAweGNiM2ZiZDA3LCAweGNiM2ZiY2JmLCAweGQxZmZjOTNmLCAweGQxZmZjOTNmLCAweGQxZmZjOTNmfSwKKwl7MHgwMDAwYTMyOCwgMHgwMDAwZDdiZiwgMHgwMDAwZDdiZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCit9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkNvbW1vbl85MTAwW11bMl0gPSB7Ci0gICAgeyAweDAwMDAwMDBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwMDMwLCAweDAwMDIwMDE1IH0sCi0gICAgeyAweDAwMDAwMDM0LCAweDAwMDAwMDA1IH0sCi0gICAgeyAweDAwMDAwMDQwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwMDQ0LCAweDAwMDAwMDA4IH0sCi0gICAgeyAweDAwMDAwMDQ4LCAweDAwMDAwMDA4IH0sCi0gICAgeyAweDAwMDAwMDRjLCAweDAwMDAwMDEwIH0sCi0gICAgeyAweDAwMDAwMDUwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwMDU0LCAweDAwMDAwMDFmIH0sCi0gICAgeyAweDAwMDAwODAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODE0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODIwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAwODI0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDQwLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDQ0LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDQ4LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDRjLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDUwLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDU0LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDU4LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDVjLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDYwLCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMDY0LCAweDAwMmZmYzBmIH0sCi0gICAgeyAweDAwMDAxMjMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjcwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2I4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2Y4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNGI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNGY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNTM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNTc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNWI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNWY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNjM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNjc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNmI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNmY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNzc4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxN2I4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxN2Y4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMDdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMGZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMTdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMWZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMjdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMmZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxMzdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2JjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxM2ZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDAxNDdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDIwMDEwLCAweDAwMDAwMDAzIH0sCi0gICAgeyAweDAwMDIwMDM4LCAweDAwMDAwNGMyIH0sCi0gICAgeyAweDAwMDA4MDA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDE4LCAweDAwMDAwNzAwIH0sCi0gICAgeyAweDAwMDA4MDIwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDQ4LCAweDQwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDU0LCAweDAwMDA0MDAwIH0sCi0gICAgeyAweDAwMDA4MDU4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MDVjLCAweDAwMGZjNzhmIH0sCi0gICAgeyAweDAwMDA4MDYwLCAweDAwMDAwMDBmIH0sCi0gICAgeyAweDAwMDA4MDY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGMwLCAweDJhODIzMDFhIH0sCi0gICAgeyAweDAwMDA4MGM0LCAweDA1ZGMwMWUwIH0sCi0gICAgeyAweDAwMDA4MGM4LCAweDFmNDAyNzEwIH0sCi0gICAgeyAweDAwMDA4MGNjLCAweDAxZjQwMDAwIH0sCi0gICAgeyAweDAwMDA4MGQwLCAweDAwMDAxZTAwIH0sCi0gICAgeyAweDAwMDA4MGQ0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGQ4LCAweDAwNDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGUwLCAweGZmZmZmZmZmIH0sCi0gICAgeyAweDAwMDA4MGU0LCAweDAwMDBmZmZmIH0sCi0gICAgeyAweDAwMDA4MGU4LCAweDAwM2YzZjNmIH0sCi0gICAgeyAweDAwMDA4MGVjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGYwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MGZjLCAweDAwMDIwMDAwIH0sCi0gICAgeyAweDAwMDA4MTAwLCAweDAwMDIwMDAwIH0sCi0gICAgeyAweDAwMDA4MTA0LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA4MTA4LCAweDAwMDAwMDUyIH0sCi0gICAgeyAweDAwMDA4MTBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTEwLCAweDAwMDAwMTY4IH0sCi0gICAgeyAweDAwMDA4MTE4LCAweDAwMDEwMGFhIH0sCi0gICAgeyAweDAwMDA4MTFjLCAweDAwMDAzMjEwIH0sCi0gICAgeyAweDAwMDA4MTIwLCAweDA4ZjA0ODAwIH0sCi0gICAgeyAweDAwMDA4MTI0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTM0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTQ0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MTcwLCAweDMyMTQzMzIwIH0sCi0gICAgeyAweDAwMDA4MTc0LCAweGZhYTRmYTUwIH0sCi0gICAgeyAweDAwMDA4MTc4LCAweDAwMDAwMTAwIH0sCi0gICAgeyAweDAwMDA4MTdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWM0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWQwLCAweDAwMDAzMjEwIH0sCi0gICAgeyAweDAwMDA4MWVjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWYwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWY4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MWZjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjE0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjIwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjI0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjM0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjQwLCAweDAwMTAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjQ0LCAweDAwMTBmNDAwIH0sCi0gICAgeyAweDAwMDA4MjQ4LCAweDAwMDAwMTAwIH0sCi0gICAgeyAweDAwMDA4MjRjLCAweDAwMDFlODAwIH0sCi0gICAgeyAweDAwMDA4MjUwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjU0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjU4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MjVjLCAweDQwMDAwMGZmIH0sCi0gICAgeyAweDAwMDA4MjYwLCAweDAwMDgwOTIyIH0sCi0gICAgeyAweDAwMDA4MjcwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjc0LCAweDQwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjc4LCAweDAwM2U0MTgwIH0sCi0gICAgeyAweDAwMDA4MjdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjg0LCAweDAwMDAwMDJjIH0sCi0gICAgeyAweDAwMDA4Mjg4LCAweDAwMDAwMDJjIH0sCi0gICAgeyAweDAwMDA4MjhjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjk0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4Mjk4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzE0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzI4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzJjLCAweDAwMDAwMDA3IH0sCi0gICAgeyAweDAwMDA4MzMwLCAweDAwMDAwMzAyIH0sCi0gICAgeyAweDAwMDA4MzM0LCAweDAwMDAwZTAwIH0sCi0gICAgeyAweDAwMDA4MzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA4MzQwLCAweDAwMDEwN2ZmIH0sCi0gICAgeyAweDAwMDA5ODA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODBjLCAweGFkODQ4ZTE5IH0sCi0gICAgeyAweDAwMDA5ODEwLCAweDdkMTRlMDAwIH0sCi0gICAgeyAweDAwMDA5ODE0LCAweDljMGE5ZjZiIH0sCi0gICAgeyAweDAwMDA5ODFjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODJjLCAweDAwMDBhMDAwIH0sCi0gICAgeyAweDAwMDA5ODMwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODNjLCAweDAwMjAwNDAwIH0sCi0gICAgeyAweDAwMDA5ODQwLCAweDIwNmEwMWFlIH0sCi0gICAgeyAweDAwMDA5ODRjLCAweDEyODQyMzNjIH0sCi0gICAgeyAweDAwMDA5ODU0LCAweDAwMDAwODU5IH0sCi0gICAgeyAweDAwMDA5OTAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTA0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTBjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTFjLCAweDEwMDAwZmZmIH0sCi0gICAgeyAweDAwMDA5OTIwLCAweDA1MTAwMDAwIH0sCi0gICAgeyAweDAwMDBhOTIwLCAweDA1MTAwMDAwIH0sCi0gICAgeyAweDAwMDBiOTIwLCAweDA1MTAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTI4LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5OTJjLCAweDAwMDAwMDA0IH0sCi0gICAgeyAweDAwMDA5OTM0LCAweDFlMWYyMDIyIH0sCi0gICAgeyAweDAwMDA5OTM4LCAweDBhMGIwYzBkIH0sCi0gICAgeyAweDAwMDA5OTNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTQ4LCAweDkyODBiMjEyIH0sCi0gICAgeyAweDAwMDA5OTRjLCAweDAwMDIwMDI4IH0sCi0gICAgeyAweDAwMDBjOTVjLCAweDAwNGI2YThlIH0sCi0gICAgeyAweDAwMDBjOTY4LCAweDAwMDAwM2NlIH0sCi0gICAgeyAweDAwMDA5OTcwLCAweDE5MGZiNTE1IH0sCi0gICAgeyAweDAwMDA5OTc0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTc4LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5OTdjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTgwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTg0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTg4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OThjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTkwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTk0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTk4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OTljLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWE0LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5OWE4LCAweDIwMWZmZjAwIH0sCi0gICAgeyAweDAwMDA5OWFjLCAweDAwNmYwMDAwIH0sCi0gICAgeyAweDAwMDA5OWIwLCAweDAzMDUxMDAwIH0sCi0gICAgeyAweDAwMDA5OWRjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5OWUwLCAweDAwMDAwMjAwIH0sCi0gICAgeyAweDAwMDA5OWU0LCAweGFhYWFhYWFhIH0sCi0gICAgeyAweDAwMDA5OWU4LCAweDNjNDY2NDc4IH0sCi0gICAgeyAweDAwMDA5OWVjLCAweDBjYzgwY2FhIH0sCi0gICAgeyAweDAwMDA5OWZjLCAweDAwMDAxMDQyIH0sCi0gICAgeyAweDAwMDA5YjAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5YjA0LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDA5YjA4LCAweDAwMDAwMDAyIH0sCi0gICAgeyAweDAwMDA5YjBjLCAweDAwMDAwMDAzIH0sCi0gICAgeyAweDAwMDA5YjEwLCAweDAwMDAwMDA0IH0sCi0gICAgeyAweDAwMDA5YjE0LCAweDAwMDAwMDA1IH0sCi0gICAgeyAweDAwMDA5YjE4LCAweDAwMDAwMDA4IH0sCi0gICAgeyAweDAwMDA5YjFjLCAweDAwMDAwMDA5IH0sCi0gICAgeyAweDAwMDA5YjIwLCAweDAwMDAwMDBhIH0sCi0gICAgeyAweDAwMDA5YjI0LCAweDAwMDAwMDBiIH0sCi0gICAgeyAweDAwMDA5YjI4LCAweDAwMDAwMDBjIH0sCi0gICAgeyAweDAwMDA5YjJjLCAweDAwMDAwMDBkIH0sCi0gICAgeyAweDAwMDA5YjMwLCAweDAwMDAwMDEwIH0sCi0gICAgeyAweDAwMDA5YjM0LCAweDAwMDAwMDExIH0sCi0gICAgeyAweDAwMDA5YjM4LCAweDAwMDAwMDEyIH0sCi0gICAgeyAweDAwMDA5YjNjLCAweDAwMDAwMDEzIH0sCi0gICAgeyAweDAwMDA5YjQwLCAweDAwMDAwMDE0IH0sCi0gICAgeyAweDAwMDA5YjQ0LCAweDAwMDAwMDE1IH0sCi0gICAgeyAweDAwMDA5YjQ4LCAweDAwMDAwMDE4IH0sCi0gICAgeyAweDAwMDA5YjRjLCAweDAwMDAwMDE5IH0sCi0gICAgeyAweDAwMDA5YjUwLCAweDAwMDAwMDFhIH0sCi0gICAgeyAweDAwMDA5YjU0LCAweDAwMDAwMDFiIH0sCi0gICAgeyAweDAwMDA5YjU4LCAweDAwMDAwMDFjIH0sCi0gICAgeyAweDAwMDA5YjVjLCAweDAwMDAwMDFkIH0sCi0gICAgeyAweDAwMDA5YjYwLCAweDAwMDAwMDIwIH0sCi0gICAgeyAweDAwMDA5YjY0LCAweDAwMDAwMDIxIH0sCi0gICAgeyAweDAwMDA5YjY4LCAweDAwMDAwMDIyIH0sCi0gICAgeyAweDAwMDA5YjZjLCAweDAwMDAwMDIzIH0sCi0gICAgeyAweDAwMDA5YjcwLCAweDAwMDAwMDI0IH0sCi0gICAgeyAweDAwMDA5Yjc0LCAweDAwMDAwMDI1IH0sCi0gICAgeyAweDAwMDA5Yjc4LCAweDAwMDAwMDI4IH0sCi0gICAgeyAweDAwMDA5YjdjLCAweDAwMDAwMDI5IH0sCi0gICAgeyAweDAwMDA5YjgwLCAweDAwMDAwMDJhIH0sCi0gICAgeyAweDAwMDA5Yjg0LCAweDAwMDAwMDJiIH0sCi0gICAgeyAweDAwMDA5Yjg4LCAweDAwMDAwMDJjIH0sCi0gICAgeyAweDAwMDA5YjhjLCAweDAwMDAwMDJkIH0sCi0gICAgeyAweDAwMDA5YjkwLCAweDAwMDAwMDMwIH0sCi0gICAgeyAweDAwMDA5Yjk0LCAweDAwMDAwMDMxIH0sCi0gICAgeyAweDAwMDA5Yjk4LCAweDAwMDAwMDMyIH0sCi0gICAgeyAweDAwMDA5YjljLCAweDAwMDAwMDMzIH0sCi0gICAgeyAweDAwMDA5YmEwLCAweDAwMDAwMDM0IH0sCi0gICAgeyAweDAwMDA5YmE0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmE4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmFjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmIwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmI0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmI4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmJjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmMwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmM0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmM4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmNjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmQwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmQ0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmQ4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmRjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmUwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmU0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmU4LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmVjLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmYwLCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmY0LCAweDAwMDAwMDM1IH0sCi0gICAgeyAweDAwMDA5YmY4LCAweDAwMDAwMDEwIH0sCi0gICAgeyAweDAwMDA5YmZjLCAweDAwMDAwMDFhIH0sCi0gICAgeyAweDAwMDBhMjEwLCAweDQwODA2MzMzIH0sCi0gICAgeyAweDAwMDBhMjE0LCAweDAwMTA2YzEwIH0sCi0gICAgeyAweDAwMDBhMjE4LCAweDAwOWM0MDYwIH0sCi0gICAgeyAweDAwMDBhMjIwLCAweDAxODgzMGM2IH0sCi0gICAgeyAweDAwMDBhMjI0LCAweDAwMDAwNDAwIH0sCi0gICAgeyAweDAwMDBhMjI4LCAweDAwMWEwYmI1IH0sCi0gICAgeyAweDAwMDBhMjJjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMjM0LCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMjM4LCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMjNjLCAweDEzYzg4OWFlIH0sCi0gICAgeyAweDAwMDBhMjQwLCAweDM4NDkwYTIwIH0sCi0gICAgeyAweDAwMDBhMjQ0LCAweDAwMDA3YmI2IH0sCi0gICAgeyAweDAwMDBhMjQ4LCAweDBmZmYzZmZjIH0sCi0gICAgeyAweDAwMDBhMjRjLCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDBhMjUwLCAweDAwMDBhMDAwIH0sCi0gICAgeyAweDAwMDBhMjU0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMjU4LCAweDBjYzc1MzgwIH0sCi0gICAgeyAweDAwMDBhMjVjLCAweDBmMGYwZjAxIH0sCi0gICAgeyAweDAwMDBhMjYwLCAweGRmYTkxZjAxIH0sCi0gICAgeyAweDAwMDBhMjY4LCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDBhMjZjLCAweDBlYmFlOWM2IH0sCi0gICAgeyAweDAwMDBiMjZjLCAweDBlYmFlOWM2IH0sCi0gICAgeyAweDAwMDBjMjZjLCAweDBlYmFlOWM2IH0sCi0gICAgeyAweDAwMDBkMjcwLCAweDAwODIwODIwIH0sCi0gICAgeyAweDAwMDBhMjc4LCAweDFjZTczOWNlIH0sCi0gICAgeyAweDAwMDBhMjdjLCAweDA1MDcwMWNlIH0sCi0gICAgeyAweDAwMDBhMzM4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzNjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQ0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQ4LCAweDNmZmZmZmZmIH0sCi0gICAgeyAweDAwMDBhMzRjLCAweDNmZmZmZmZmIH0sCi0gICAgeyAweDAwMDBhMzUwLCAweDNmZmZmZmZmIH0sCi0gICAgeyAweDAwMDBhMzU0LCAweDAwMDNmZmZmIH0sCi0gICAgeyAweDAwMDBhMzU4LCAweDc5YThhYTMzIH0sCi0gICAgeyAweDAwMDBkMzVjLCAweDA3ZmZmZmVmIH0sCi0gICAgeyAweDAwMDBkMzYwLCAweDBmZmZmZmU3IH0sCi0gICAgeyAweDAwMDBkMzY0LCAweDE3ZmZmZmU1IH0sCi0gICAgeyAweDAwMDBkMzY4LCAweDFmZmZmZmU0IH0sCi0gICAgeyAweDAwMDBkMzZjLCAweDM3ZmZmZmUzIH0sCi0gICAgeyAweDAwMDBkMzcwLCAweDNmZmZmZmUzIH0sCi0gICAgeyAweDAwMDBkMzc0LCAweDU3ZmZmZmUzIH0sCi0gICAgeyAweDAwMDBkMzc4LCAweDVmZmZmZmUyIH0sCi0gICAgeyAweDAwMDBkMzdjLCAweDdmZmZmZmUyIH0sCi0gICAgeyAweDAwMDBkMzgwLCAweDdmM2M3YmJhIH0sCi0gICAgeyAweDAwMDBkMzg0LCAweGYzMzA3ZmYwIH0sCi0gICAgeyAweDAwMDBhMzg4LCAweDBjMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzhjLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMzkwLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhMzk0LCAweDFjZTczOWNlIH0sCi0gICAgeyAweDAwMDBhMzk4LCAweDAwMDAwMWNlIH0sCi0gICAgeyAweDAwMDBhMzljLCAweDAwMDAwMDAxIH0sCi0gICAgeyAweDAwMDBhM2EwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2E0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2E4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2FjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2IwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2I0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2I4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2JjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2MwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2M0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhM2M4LCAweDAwMDAwMjQ2IH0sCi0gICAgeyAweDAwMDBhM2NjLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhM2QwLCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhM2Q0LCAweDIwMjAyMDIwIH0sCi0gICAgeyAweDAwMDBhM2RjLCAweDFjZTczOWNlIH0sCi0gICAgeyAweDAwMDBhM2UwLCAweDAwMDAwMWNlIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDAwMDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDAzMCwgMHgwMDAyMDAxNX0sCisJezB4MDAwMDAwMzQsIDB4MDAwMDAwMDV9LAorCXsweDAwMDAwMDQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA0NCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNDgsIDB4MDAwMDAwMDh9LAorCXsweDAwMDAwMDRjLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwMDA1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNTQsIDB4MDAwMDAwMWZ9LAorCXsweDAwMDAwODAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA0MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDQ4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1OCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNWMsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDYwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA2NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEyMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTAzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTI3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTMzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTRiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTU3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTYzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNmI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTZmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNzc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTdiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTM3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2ZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0N2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDIwMDEwLCAweDAwMDAwMDAzfSwKKwl7MHgwMDAyMDAzOCwgMHgwMDAwMDRjMn0sCisJezB4MDAwMDgwMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMTgsIDB4MDAwMDA3MDB9LAorCXsweDAwMDA4MDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDQ4LCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODA1NCwgMHgwMDAwNDAwMH0sCisJezB4MDAwMDgwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDVjLCAweDAwMGZjNzhmfSwKKwl7MHgwMDAwODA2MCwgMHgwMDAwMDAwZn0sCisJezB4MDAwMDgwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGMwLCAweDJhODIzMDFhfSwKKwl7MHgwMDAwODBjNCwgMHgwNWRjMDFlMH0sCisJezB4MDAwMDgwYzgsIDB4MWY0MDI3MTB9LAorCXsweDAwMDA4MGNjLCAweDAxZjQwMDAwfSwKKwl7MHgwMDAwODBkMCwgMHgwMDAwMWUwMH0sCisJezB4MDAwMDgwZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGQ4LCAweDAwNDAwMDAwfSwKKwl7MHgwMDAwODBlMCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgwZTQsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MGU4LCAweDAwM2YzZjNmfSwKKwl7MHgwMDAwODBlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZmMsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTAwLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDgxMDgsIDB4MDAwMDAwNTJ9LAorCXsweDAwMDA4MTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExMCwgMHgwMDAwMDE2OH0sCisJezB4MDAwMDgxMTgsIDB4MDAwMTAwYWF9LAorCXsweDAwMDA4MTFjLCAweDAwMDAzMjEwfSwKKwl7MHgwMDAwODEyMCwgMHgwOGYwNDgwMH0sCisJezB4MDAwMDgxMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTcwLCAweDMyMTQzMzIwfSwKKwl7MHgwMDAwODE3NCwgMHhmYWE0ZmE1MH0sCisJezB4MDAwMDgxNzgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MTdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZDAsIDB4MDAwMDMyMTB9LAorCXsweDAwMDA4MWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjQwLCAweDAwMTAwMDAwfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQwMH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MjRjLCAweDAwMDFlODAwfSwKKwl7MHgwMDAwODI1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1YywgMHg0MDAwMDBmZn0sCisJezB4MDAwMDgyNjAsIDB4MDAwODA5MjJ9LAorCXsweDAwMDA4MjcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI3NCwgMHg0MDAwMDAwMH0sCisJezB4MDAwMDgyNzgsIDB4MDAzZTQxODB9LAorCXsweDAwMDA4MjdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI4NCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyODgsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA4MjhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMmMsIDB4MDAwMDAwMDd9LAorCXsweDAwMDA4MzMwLCAweDAwMDAwMzAyfSwKKwl7MHgwMDAwODMzNCwgMHgwMDAwMGUwMH0sCisJezB4MDAwMDgzMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM0MCwgMHgwMDAxMDdmZn0sCisJezB4MDAwMDk4MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODBjLCAweGFkODQ4ZTE5fSwKKwl7MHgwMDAwOTgxMCwgMHg3ZDE0ZTAwMH0sCisJezB4MDAwMDk4MTQsIDB4OWMwYTlmNmJ9LAorCXsweDAwMDA5ODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgyYywgMHgwMDAwYTAwMH0sCisJezB4MDAwMDk4MzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODNjLCAweDAwMjAwNDAwfSwKKwl7MHgwMDAwOTg0MCwgMHgyMDZhMDFhZX0sCisJezB4MDAwMDk4NGMsIDB4MTI4NDIzM2N9LAorCXsweDAwMDA5ODU0LCAweDAwMDAwODU5fSwKKwl7MHgwMDAwOTkwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MWMsIDB4MTAwMDBmZmZ9LAorCXsweDAwMDA5OTIwLCAweDA1MTAwMDAwfSwKKwl7MHgwMDAwYTkyMCwgMHgwNTEwMDAwMH0sCisJezB4MDAwMGI5MjAsIDB4MDUxMDAwMDB9LAorCXsweDAwMDA5OTI4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTkyYywgMHgwMDAwMDAwNH0sCisJezB4MDAwMDk5MzQsIDB4MWUxZjIwMjJ9LAorCXsweDAwMDA5OTM4LCAweDBhMGIwYzBkfSwKKwl7MHgwMDAwOTkzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5NDgsIDB4OTI4MGIyMTJ9LAorCXsweDAwMDA5OTRjLCAweDAwMDIwMDI4fSwKKwl7MHgwMDAwYzk1YywgMHgwMDRiNmE4ZX0sCisJezB4MDAwMGM5NjgsIDB4MDAwMDAzY2V9LAorCXsweDAwMDA5OTcwLCAweDE5MGZiNTE1fSwKKwl7MHgwMDAwOTk3NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5NzgsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OTdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlhNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDk5YTgsIDB4MjAxZmZmMDB9LAorCXsweDAwMDA5OWFjLCAweDAwNmYwMDAwfSwKKwl7MHgwMDAwOTliMCwgMHgwMzA1MTAwMH0sCisJezB4MDAwMDk5ZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWUwLCAweDAwMDAwMjAwfSwKKwl7MHgwMDAwOTllNCwgMHhhYWFhYWFhYX0sCisJezB4MDAwMDk5ZTgsIDB4M2M0NjY0Nzh9LAorCXsweDAwMDA5OWVjLCAweDBjYzgwY2FhfSwKKwl7MHgwMDAwOTlmYywgMHgwMDAwMTA0Mn0sCisJezB4MDAwMDliMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjA0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOWIwOCwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDliMGMsIDB4MDAwMDAwMDN9LAorCXsweDAwMDA5YjEwLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOWIxNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDliMTgsIDB4MDAwMDAwMDh9LAorCXsweDAwMDA5YjFjLCAweDAwMDAwMDA5fSwKKwl7MHgwMDAwOWIyMCwgMHgwMDAwMDAwYX0sCisJezB4MDAwMDliMjQsIDB4MDAwMDAwMGJ9LAorCXsweDAwMDA5YjI4LCAweDAwMDAwMDBjfSwKKwl7MHgwMDAwOWIyYywgMHgwMDAwMDAwZH0sCisJezB4MDAwMDliMzAsIDB4MDAwMDAwMTB9LAorCXsweDAwMDA5YjM0LCAweDAwMDAwMDExfSwKKwl7MHgwMDAwOWIzOCwgMHgwMDAwMDAxMn0sCisJezB4MDAwMDliM2MsIDB4MDAwMDAwMTN9LAorCXsweDAwMDA5YjQwLCAweDAwMDAwMDE0fSwKKwl7MHgwMDAwOWI0NCwgMHgwMDAwMDAxNX0sCisJezB4MDAwMDliNDgsIDB4MDAwMDAwMTh9LAorCXsweDAwMDA5YjRjLCAweDAwMDAwMDE5fSwKKwl7MHgwMDAwOWI1MCwgMHgwMDAwMDAxYX0sCisJezB4MDAwMDliNTQsIDB4MDAwMDAwMWJ9LAorCXsweDAwMDA5YjU4LCAweDAwMDAwMDFjfSwKKwl7MHgwMDAwOWI1YywgMHgwMDAwMDAxZH0sCisJezB4MDAwMDliNjAsIDB4MDAwMDAwMjB9LAorCXsweDAwMDA5YjY0LCAweDAwMDAwMDIxfSwKKwl7MHgwMDAwOWI2OCwgMHgwMDAwMDAyMn0sCisJezB4MDAwMDliNmMsIDB4MDAwMDAwMjN9LAorCXsweDAwMDA5YjcwLCAweDAwMDAwMDI0fSwKKwl7MHgwMDAwOWI3NCwgMHgwMDAwMDAyNX0sCisJezB4MDAwMDliNzgsIDB4MDAwMDAwMjh9LAorCXsweDAwMDA5YjdjLCAweDAwMDAwMDI5fSwKKwl7MHgwMDAwOWI4MCwgMHgwMDAwMDAyYX0sCisJezB4MDAwMDliODQsIDB4MDAwMDAwMmJ9LAorCXsweDAwMDA5Yjg4LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwOWI4YywgMHgwMDAwMDAyZH0sCisJezB4MDAwMDliOTAsIDB4MDAwMDAwMzB9LAorCXsweDAwMDA5Yjk0LCAweDAwMDAwMDMxfSwKKwl7MHgwMDAwOWI5OCwgMHgwMDAwMDAzMn0sCisJezB4MDAwMDliOWMsIDB4MDAwMDAwMzN9LAorCXsweDAwMDA5YmEwLCAweDAwMDAwMDM0fSwKKwl7MHgwMDAwOWJhNCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYTgsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmFjLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJiMCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYjQsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmI4LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJiYywgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYzAsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmM0LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJjOCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliY2MsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmQwLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJkNCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZDgsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmRjLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJlMCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZTQsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmU4LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJlYywgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZjAsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmY0LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJmOCwgMHgwMDAwMDAxMH0sCisJezB4MDAwMDliZmMsIDB4MDAwMDAwMWF9LAorCXsweDAwMDBhMjEwLCAweDQwODA2MzMzfSwKKwl7MHgwMDAwYTIxNCwgMHgwMDEwNmMxMH0sCisJezB4MDAwMGEyMTgsIDB4MDA5YzQwNjB9LAorCXsweDAwMDBhMjIwLCAweDAxODgzMGM2fSwKKwl7MHgwMDAwYTIyNCwgMHgwMDAwMDQwMH0sCisJezB4MDAwMGEyMjgsIDB4MDAxYTBiYjV9LAorCXsweDAwMDBhMjJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIzNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyMzgsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMjNjLCAweDEzYzg4OWFmfSwKKwl7MHgwMDAwYTI0MCwgMHgzODQ5MGEyMH0sCisJezB4MDAwMGEyNDQsIDB4MDAwMDdiYjZ9LAorCXsweDAwMDBhMjQ4LCAweDBmZmYzZmZjfSwKKwl7MHgwMDAwYTI0YywgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEyNTAsIDB4MDAwMGUwMDB9LAorCXsweDAwMDBhMjU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI1OCwgMHgwY2M3NTM4MH0sCisJezB4MDAwMGEyNWMsIDB4MGYwZjBmMDF9LAorCXsweDAwMDBhMjYwLCAweGRmYTkxZjAxfSwKKwl7MHgwMDAwYTI2OCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEyNmMsIDB4MGViYWU5YzZ9LAorCXsweDAwMDBiMjZjLCAweDBlYmFlOWM2fSwKKwl7MHgwMDAwYzI2YywgMHgwZWJhZTljNn0sCisJezB4MDAwMGQyNzAsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBhMjc4LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTI3YywgMHgwNTA3MDFjZX0sCisJezB4MDAwMGEzMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ4LCAweDNmZmZmZmZmfSwKKwl7MHgwMDAwYTM0YywgMHgzZmZmZmZmZn0sCisJezB4MDAwMGEzNTAsIDB4M2ZmZmZmZmZ9LAorCXsweDAwMDBhMzU0LCAweDAwMDNmZmZmfSwKKwl7MHgwMDAwYTM1OCwgMHg3OWE4YWEzM30sCisJezB4MDAwMGQzNWMsIDB4MDdmZmZmZWZ9LAorCXsweDAwMDBkMzYwLCAweDBmZmZmZmU3fSwKKwl7MHgwMDAwZDM2NCwgMHgxN2ZmZmZlNX0sCisJezB4MDAwMGQzNjgsIDB4MWZmZmZmZTR9LAorCXsweDAwMDBkMzZjLCAweDM3ZmZmZmUzfSwKKwl7MHgwMDAwZDM3MCwgMHgzZmZmZmZlM30sCisJezB4MDAwMGQzNzQsIDB4NTdmZmZmZTN9LAorCXsweDAwMDBkMzc4LCAweDVmZmZmZmUyfSwKKwl7MHgwMDAwZDM3YywgMHg3ZmZmZmZlMn0sCisJezB4MDAwMGQzODAsIDB4N2YzYzdiYmF9LAorCXsweDAwMDBkMzg0LCAweGYzMzA3ZmYwfSwKKwl7MHgwMDAwYTM4OCwgMHgwYzAwMDAwMH0sCisJezB4MDAwMGEzOGMsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMzkwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTM5NCwgMHgxY2U3MzljZX0sCisJezB4MDAwMGEzOTgsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhMzljLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTNhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2E4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2I0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2MwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYzgsIDB4MDAwMDAyNDZ9LAorCXsweDAwMDBhM2NjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkMCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDQsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2RjLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTNlMCwgMHgwMDAwMDFjZX0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbmswXzkxMDBbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDk4YjAsIDB4MWU1Nzk1ZTUgfSwKLSAgICB7IDB4MDAwMDk4ZTAsIDB4MDIwMDgwMjAgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDk4YjAsIDB4MWU1Nzk1ZTV9LAorCXsweDAwMDA5OGUwLCAweDAyMDA4MDIwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QkJfUmZHYWluXzkxMDBbXVszXSA9IHsKLSAgICB7IDB4MDAwMDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDQsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAgfSwKLSAgICB7IDB4MDAwMDlhMDgsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAgfSwKLSAgICB7IDB4MDAwMDlhMGMsIDB4MDAwMDAxYTEsIDB4MDAwMDAxNDEgfSwKLSAgICB7IDB4MDAwMDlhMTAsIDB4MDAwMDAxZTEsIDB4MDAwMDAxODEgfSwKLSAgICB7IDB4MDAwMDlhMTQsIDB4MDAwMDAwMjEsIDB4MDAwMDAxYzEgfSwKLSAgICB7IDB4MDAwMDlhMTgsIDB4MDAwMDAwNjEsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDlhMWMsIDB4MDAwMDAxNjgsIDB4MDAwMDAwNDEgfSwKLSAgICB7IDB4MDAwMDlhMjAsIDB4MDAwMDAxYTgsIDB4MDAwMDAxYTggfSwKLSAgICB7IDB4MDAwMDlhMjQsIDB4MDAwMDAxZTgsIDB4MDAwMDAxZTggfSwKLSAgICB7IDB4MDAwMDlhMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjggfSwKLSAgICB7IDB4MDAwMDlhMmMsIDB4MDAwMDAwNjgsIDB4MDAwMDAwNjggfSwKLSAgICB7IDB4MDAwMDlhMzAsIDB4MDAwMDAxODksIDB4MDAwMDAwYTggfSwKLSAgICB7IDB4MDAwMDlhMzQsIDB4MDAwMDAxYzksIDB4MDAwMDAxNjkgfSwKLSAgICB7IDB4MDAwMDlhMzgsIDB4MDAwMDAwMDksIDB4MDAwMDAxYTkgfSwKLSAgICB7IDB4MDAwMDlhM2MsIDB4MDAwMDAwNDksIDB4MDAwMDAxZTkgfSwKLSAgICB7IDB4MDAwMDlhNDAsIDB4MDAwMDAwODksIDB4MDAwMDAwMjkgfSwKLSAgICB7IDB4MDAwMDlhNDQsIDB4MDAwMDAxNzAsIDB4MDAwMDAwNjkgfSwKLSAgICB7IDB4MDAwMDlhNDgsIDB4MDAwMDAxYjAsIDB4MDAwMDAxOTAgfSwKLSAgICB7IDB4MDAwMDlhNGMsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZDAgfSwKLSAgICB7IDB4MDAwMDlhNTAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDlhNTQsIDB4MDAwMDAwNzAsIDB4MDAwMDAwNTAgfSwKLSAgICB7IDB4MDAwMDlhNTgsIDB4MDAwMDAxOTEsIDB4MDAwMDAwOTAgfSwKLSAgICB7IDB4MDAwMDlhNWMsIDB4MDAwMDAxZDEsIDB4MDAwMDAxNTEgfSwKLSAgICB7IDB4MDAwMDlhNjAsIDB4MDAwMDAwMTEsIDB4MDAwMDAxOTEgfSwKLSAgICB7IDB4MDAwMDlhNjQsIDB4MDAwMDAwNTEsIDB4MDAwMDAxZDEgfSwKLSAgICB7IDB4MDAwMDlhNjgsIDB4MDAwMDAwOTEsIDB4MDAwMDAwMTEgfSwKLSAgICB7IDB4MDAwMDlhNmMsIDB4MDAwMDAxYjgsIDB4MDAwMDAwNTEgfSwKLSAgICB7IDB4MDAwMDlhNzAsIDB4MDAwMDAxZjgsIDB4MDAwMDAxOTggfSwKLSAgICB7IDB4MDAwMDlhNzQsIDB4MDAwMDAwMzgsIDB4MDAwMDAxZDggfSwKLSAgICB7IDB4MDAwMDlhNzgsIDB4MDAwMDAwNzgsIDB4MDAwMDAwMTggfSwKLSAgICB7IDB4MDAwMDlhN2MsIDB4MDAwMDAxOTksIDB4MDAwMDAwNTggfSwKLSAgICB7IDB4MDAwMDlhODAsIDB4MDAwMDAxZDksIDB4MDAwMDAwOTggfSwKLSAgICB7IDB4MDAwMDlhODQsIDB4MDAwMDAwMTksIDB4MDAwMDAxNTkgfSwKLSAgICB7IDB4MDAwMDlhODgsIDB4MDAwMDAwNTksIDB4MDAwMDAxOTkgfSwKLSAgICB7IDB4MDAwMDlhOGMsIDB4MDAwMDAwOTksIDB4MDAwMDAxZDkgfSwKLSAgICB7IDB4MDAwMDlhOTAsIDB4MDAwMDAwZDksIDB4MDAwMDAwMTkgfSwKLSAgICB7IDB4MDAwMDlhOTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwNTkgfSwKLSAgICB7IDB4MDAwMDlhOTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwOTkgfSwKLSAgICB7IDB4MDAwMDlhOWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZDkgfSwKLSAgICB7IDB4MDAwMDlhYTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYjAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYmMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYzAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYzQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhYzgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhY2MsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZDAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZDQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZDgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZGMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZjAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKLSAgICB7IDB4MDAwMDlhZmMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjkgfSwKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICovCisJezB4MDAwMDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTA0LCAweDAwMDAwMDQwLCAweDAwMDAwMDQwfSwKKwl7MHgwMDAwOWEwOCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MH0sCisJezB4MDAwMDlhMGMsIDB4MDAwMDAxYTEsIDB4MDAwMDAxNDF9LAorCXsweDAwMDA5YTEwLCAweDAwMDAwMWUxLCAweDAwMDAwMTgxfSwKKwl7MHgwMDAwOWExNCwgMHgwMDAwMDAyMSwgMHgwMDAwMDFjMX0sCisJezB4MDAwMDlhMTgsIDB4MDAwMDAwNjEsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5YTFjLCAweDAwMDAwMTY4LCAweDAwMDAwMDQxfSwKKwl7MHgwMDAwOWEyMCwgMHgwMDAwMDFhOCwgMHgwMDAwMDFhOH0sCisJezB4MDAwMDlhMjQsIDB4MDAwMDAxZTgsIDB4MDAwMDAxZTh9LAorCXsweDAwMDA5YTI4LCAweDAwMDAwMDI4LCAweDAwMDAwMDI4fSwKKwl7MHgwMDAwOWEyYywgMHgwMDAwMDA2OCwgMHgwMDAwMDA2OH0sCisJezB4MDAwMDlhMzAsIDB4MDAwMDAxODksIDB4MDAwMDAwYTh9LAorCXsweDAwMDA5YTM0LCAweDAwMDAwMWM5LCAweDAwMDAwMTY5fSwKKwl7MHgwMDAwOWEzOCwgMHgwMDAwMDAwOSwgMHgwMDAwMDFhOX0sCisJezB4MDAwMDlhM2MsIDB4MDAwMDAwNDksIDB4MDAwMDAxZTl9LAorCXsweDAwMDA5YTQwLCAweDAwMDAwMDg5LCAweDAwMDAwMDI5fSwKKwl7MHgwMDAwOWE0NCwgMHgwMDAwMDE3MCwgMHgwMDAwMDA2OX0sCisJezB4MDAwMDlhNDgsIDB4MDAwMDAxYjAsIDB4MDAwMDAxOTB9LAorCXsweDAwMDA5YTRjLCAweDAwMDAwMWYwLCAweDAwMDAwMWQwfSwKKwl7MHgwMDAwOWE1MCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAxMH0sCisJezB4MDAwMDlhNTQsIDB4MDAwMDAwNzAsIDB4MDAwMDAwNTB9LAorCXsweDAwMDA5YTU4LCAweDAwMDAwMTkxLCAweDAwMDAwMDkwfSwKKwl7MHgwMDAwOWE1YywgMHgwMDAwMDFkMSwgMHgwMDAwMDE1MX0sCisJezB4MDAwMDlhNjAsIDB4MDAwMDAwMTEsIDB4MDAwMDAxOTF9LAorCXsweDAwMDA5YTY0LCAweDAwMDAwMDUxLCAweDAwMDAwMWQxfSwKKwl7MHgwMDAwOWE2OCwgMHgwMDAwMDA5MSwgMHgwMDAwMDAxMX0sCisJezB4MDAwMDlhNmMsIDB4MDAwMDAxYjgsIDB4MDAwMDAwNTF9LAorCXsweDAwMDA5YTcwLCAweDAwMDAwMWY4LCAweDAwMDAwMTk4fSwKKwl7MHgwMDAwOWE3NCwgMHgwMDAwMDAzOCwgMHgwMDAwMDFkOH0sCisJezB4MDAwMDlhNzgsIDB4MDAwMDAwNzgsIDB4MDAwMDAwMTh9LAorCXsweDAwMDA5YTdjLCAweDAwMDAwMTk5LCAweDAwMDAwMDU4fSwKKwl7MHgwMDAwOWE4MCwgMHgwMDAwMDFkOSwgMHgwMDAwMDA5OH0sCisJezB4MDAwMDlhODQsIDB4MDAwMDAwMTksIDB4MDAwMDAxNTl9LAorCXsweDAwMDA5YTg4LCAweDAwMDAwMDU5LCAweDAwMDAwMTk5fSwKKwl7MHgwMDAwOWE4YywgMHgwMDAwMDA5OSwgMHgwMDAwMDFkOX0sCisJezB4MDAwMDlhOTAsIDB4MDAwMDAwZDksIDB4MDAwMDAwMTl9LAorCXsweDAwMDA5YTk0LCAweDAwMDAwMGY5LCAweDAwMDAwMDU5fSwKKwl7MHgwMDAwOWE5OCwgMHgwMDAwMDBmOSwgMHgwMDAwMDA5OX0sCisJezB4MDAwMDlhOWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZDl9LAorCXsweDAwMDA5YWEwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFhNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWFjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFiMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWI4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFiYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYzAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWM0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFjOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhY2MsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWQwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFkNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZDgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWRjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFlMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWU4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFlYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZjAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWY0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFmOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZmMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZCYW5rMV85MTAwW11bMl0gPSB7Ci0gICAgeyAweDAwMDA5OGIwLCAweDAyMTA4NDIxfSwKLSAgICB7IDB4MDAwMDk4ZWMsIDB4MDAwMDAwMDh9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOThiMCwgMHgwMjEwODQyMX0sCisJezB4MDAwMDk4ZWMsIDB4MDAwMDAwMDh9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZCYW5rMl85MTAwW11bMl0gPSB7Ci0gICAgeyAweDAwMDA5OGIwLCAweDBlNzNmZjE3fSwKLSAgICB7IDB4MDAwMDk4ZTAsIDB4MDAwMDA0MjB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOThiMCwgMHgwZTczZmYxN30sCisJezB4MDAwMDk4ZTAsIDB4MDAwMDA0MjB9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZCYW5rM185MTAwW11bM10gPSB7Ci0gICAgeyAweDAwMDA5OGYwLCAweDAxNDAwMDE4LCAweDAxYzAwMDE4IH0sCisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAqLworCXsweDAwMDA5OGYwLCAweDAxNDAwMDE4LCAweDAxYzAwMDE4fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazZfOTEwMFtdWzNdID0gewotCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZTAwMDAwLCAweDAwZTAwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNWUwMDAwLCAweDAwNWUwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMTIwMDAwLCAweDAwMTIwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNjIwMDAwLCAweDAwNjIwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDIwMDAwLCAweDAwMDIwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNWYwMDAwLCAweDAwNWYwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwODcwMDAwLCAweDAwODcwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZjkwMDAwLCAweDAwZjkwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwN2IwMDAwLCAweDAwN2IwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZjUwMDAwLCAweDAwZjUwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwZGMwMDAwLCAweDAwZGMwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMTEwMDAwLCAweDAwMTEwMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNjEwMGE4LCAweDAwNjEwMGE4IH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNDIxMGEyLCAweDAwNDIxMGEyIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMTQwMDBmLCAweDAwMTQwMDBmIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwYzQwMDAyLCAweDAwYzQwMDAyIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMzAwMGYyLCAweDAwMzAwMGYyIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNDQwMDE2LCAweDAwNDQwMDE2IH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwNDEwMDQwLCAweDAwNDEwMDQwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDE4MGQ2LCAweDAwMDE4MGQ2IH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDBjMGFhLCAweDAwMDBjMGFhIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwMGIxLCAweDAwMDAwMGIxIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAyMDAwLCAweDAwMDAyMDAwIH0sCi0gICAgeyAweDAwMDA5ODljLCAweDAwMDAwMGQ0LCAweDAwMDAwMGQ0IH0sCi0gICAgeyAweDAwMDA5OGQwLCAweDAwMDAwMDBmLCAweDAwMTAwMDBmIH0sCisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAqLworCXsweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZTAwMDAwLCAweDAwZTAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDVlMDAwMCwgMHgwMDVlMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAxMjAwMDAsIDB4MDAxMjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNjIwMDAwLCAweDAwNjIwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNWYwMDAwLCAweDAwNWYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDg3MDAwMCwgMHgwMDg3MDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmOTAwMDAsIDB4MDBmOTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwN2IwMDAwLCAweDAwN2IwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmNTAwMDAsIDB4MDBmNTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZGMwMDAwLCAweDAwZGMwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDExMDAwMCwgMHgwMDExMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA2MTAwYTgsIDB4MDA2MTAwYTh9LAorCXsweDAwMDA5ODljLCAweDAwNDIxMGEyLCAweDAwNDIxMGEyfSwKKwl7MHgwMDAwOTg5YywgMHgwMDE0MDAwZiwgMHgwMDE0MDAwZn0sCisJezB4MDAwMDk4OWMsIDB4MDBjNDAwMDIsIDB4MDBjNDAwMDJ9LAorCXsweDAwMDA5ODljLCAweDAwMzAwMGYyLCAweDAwMzAwMGYyfSwKKwl7MHgwMDAwOTg5YywgMHgwMDQ0MDAxNiwgMHgwMDQ0MDAxNn0sCisJezB4MDAwMDk4OWMsIDB4MDA0MTAwNDAsIDB4MDA0MTAwNDB9LAorCXsweDAwMDA5ODljLCAweDAwMDE4MGQ2LCAweDAwMDE4MGQ2fSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwYzBhYSwgMHgwMDAwYzBhYX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwYjEsIDB4MDAwMDAwYjF9LAorCXsweDAwMDA5ODljLCAweDAwMDAyMDAwLCAweDAwMDAyMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNH0sCisJezB4MDAwMDk4ZDAsIDB4MDAwMDAwMGYsIDB4MDAxMDAwMGZ9LAogfTsKIAotCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbms2VFBDXzkxMDBbXVszXSA9IHsKLQotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVlMDAwMCwgMHgwMDVlMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHg0MGZmMDAwMCwgMHg0MGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDg3MDAwMCwgMHgwMDg3MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY5MDAwMCwgMHgwMGY5MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY1MDAwMCwgMHgwMGY1MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDExMDAwMCwgMHgwMDExMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYxMDBhOCwgMHgwMDYxMDBhOCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQyMzAyMiwgMHgwMDQyMzAyMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgyMDE0MDA4ZiwgMHgyMDE0MDA4ZiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGM0MDAwMiwgMHgwMGM0MDAwMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQ0MDAxNiwgMHgwMDQ0MDAxNiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQxMDA0MCwgMHgwMDQxMDA0MCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwYzBhYiwgMHgwMDAwYzBhYiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBlMSwgMHgwMDAwMDBlMSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwNzA4MCwgMHgwMDAwNzA4MCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCB9LAotICAgIHsgMHgwMDAwOThkMCwgMHgwMDAwMDAwZiwgMHgwMDEwMDAwZiB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA1ZTAwMDAsIDB4MDA1ZTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMTIwMDAwLCAweDAwMTIwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMjAwMDAsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDQwZmYwMDAwLCAweDQwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA4NzAwMDAsIDB4MDA4NzAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjkwMDAwLCAweDAwZjkwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjUwMDAwLCAweDAwZjUwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNjEwMGE4LCAweDAwNjEwMGE4fSwKKwl7MHgwMDAwOTg5YywgMHgwMDQyMzAyMiwgMHgwMDQyMzAyMn0sCisJezB4MDAwMDk4OWMsIDB4MjAxNDAwOGYsIDB4MjAxNDAwOGZ9LAorCXsweDAwMDA5ODljLCAweDAwYzQwMDAyLCAweDAwYzQwMDAyfSwKKwl7MHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMn0sCisJezB4MDAwMDk4OWMsIDB4MDA0NDAwMTYsIDB4MDA0NDAwMTZ9LAorCXsweDAwMDA5ODljLCAweDAwNDEwMDQwLCAweDAwNDEwMDQwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMGMwYWIsIDB4MDAwMGMwYWJ9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGUxLCAweDAwMDAwMGUxfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwNzA4MCwgMHgwMDAwNzA4MH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDR9LAorCXsweDAwMDA5OGQwLCAweDAwMDAwMDBmLCAweDAwMTAwMDBmfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazdfOTEwMFtdWzJdID0gewotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDUwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDgwMCB9LAotICAgIHsgMHgwMDAwOThjYywgMHgwMDAwMDAwZSB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDUwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDA4MDB9LAorCXsweDAwMDA5OGNjLCAweDAwMDAwMDBlfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QWRkYWNfOTEwMFtdWzJdID0gewotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMTAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMGMwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMTUgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4Y2MsIDB4MDAwMDAwMDAgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwYzB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDE1fSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OGNjLCAweDAwMDAwMDAwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2TW9kZXNfOTE2MFtdWzZdID0gewotICAgIHsgMHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4YywgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTBiMCwgMHgwMDAwMGU2MCwgMHgwMDAwMWNjMCwgMHgwMDAwN2M3MCwgMHgwMDAwM2UzOCwgMHgwMDAwMTE4MCB9LAotICAgIHsgMHgwMDAwMTBmMCwgMHgwMDAwYTAwMCwgMHgwMDAxNDAwMCwgMHgwMDAxNjAwMCwgMHgwMDAwYjAwMCwgMHgwMDAxNDAwOCB9LAotICAgIHsgMHgwMDAwODAxNCwgMHgwM2U4MDNlOCwgMHgwN2QwMDdkMCwgMHgxMDgwMTYwMCwgMHgwODQwMGIwMCwgMHgwNmUwMDZlMCB9LAotICAgIHsgMHgwMDAwODAxYywgMHgxMjhkOTNhNywgMHgxMjhkOTNjZiwgMHgxMmUwMTNkNywgMHgxMmUwMTNhYiwgMHgwOTg4MTNjZiB9LAotICAgIHsgMHgwMDAwOTgwNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMyB9LAotICAgIHsgMHgwMDAwOTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCB9LAotICAgIHsgMHgwMDAwOTgyNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgyOCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSB9LAotICAgIHsgMHgwMDAwOTgzNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNyB9LAotICAgIHsgMHgwMDAwOTg0NCwgMHgwMzcyMTYxZSwgMHgwMzcyMTYxZSwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMCB9LAotICAgIHsgMHgwMDAwOTg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCB9LAotICAgIHsgMHgwMDAwYTg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCB9LAotICAgIHsgMHgwMDAwYjg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCB9LAotICAgIHsgMHgwMDAwOTg1MCwgMHg2YzQ4YjRlMiwgMHg2YzQ4YjRlMiwgMHg2YzQ4YjBlMiwgMHg2YzQ4YjBlMiwgMHg2YzQ4YjBlMiB9LAotICAgIHsgMHgwMDAwOTg1OCwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSB9LAotICAgIHsgMHgwMDAwOTg1YywgMHgzMTM5NWQ1ZSwgMHgzMTM5NWQ1ZSwgMHgzMTM5NWQ1ZSwgMHgzMTM5NWQ1ZSwgMHgzMTM5NWQ1ZSB9LAotICAgIHsgMHgwMDAwOTg2MCwgMHgwMDA0OGQxOCwgMHgwMDA0OGQxOCwgMHgwMDA0OGQyMCwgMHgwMDA0OGQyMCwgMHgwMDA0OGQxOCB9LAotICAgIHsgMHgwMDAwYzg2NCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCB9LAotICAgIHsgMHgwMDAwOTg2OCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCwgMHg0MDlhNDBkMCB9LAotICAgIHsgMHgwMDAwOTg2YywgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSB9LAotICAgIHsgMHgwMDAwOTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMGZhMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMCB9LAotICAgIHsgMHgwMDAwOTkxOCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNiB9LAotICAgIHsgMHgwMDAwOTkyNCwgMHhkMDBhOGEwNywgMHhkMDBhOGEwNywgMHhkMDBhOGEwZCwgMHhkMDBhOGEwZCwgMHhkMDBhOGEwZCB9LAotICAgIHsgMHgwMDAwOTk0NCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCB9LAotICAgIHsgMHgwMDAwOTk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCB9LAotICAgIHsgMHgwMDAwYTk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCB9LAotICAgIHsgMHgwMDAwYjk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCB9LAotICAgIHsgMHgwMDAwOTk2NCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCB9LAotICAgIHsgMHgwMDAwYzk2OCwgMHgwMDAwMDNiNSwgMHgwMDAwMDNiNSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSB9LAotICAgIHsgMHgwMDAwYzliYywgMHgwMDFhMDYwMCwgMHgwMDFhMDYwMCwgMHgwMDFhMGMwMCwgMHgwMDFhMGMwMCwgMHgwMDFhMGMwMCB9LAotICAgIHsgMHgwMDAwOTljMCwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSB9LAotICAgIHsgMHgwMDAwOTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NyB9LAotICAgIHsgMHgwMDAwOTljOCwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSB9LAotICAgIHsgMHgwMDAwOTljYywgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCB9LAotICAgIHsgMHgwMDAwOTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCB9LAotICAgIHsgMHgwMDAwOTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTIwNCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCwgMHgwMDAwMDg4MCB9LAotICAgIHsgMHgwMDAwYTIwOCwgMHhkNmJlNDc4OCwgMHhkNmJlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCB9LAotICAgIHsgMHgwMDAwYTIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9LAotICAgIHsgMHgwMDAwYjIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9LAotICAgIHsgMHgwMDAwYzIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCB9LAotICAgIHsgMHgwMDAwYTIxYywgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSB9LAotICAgIHsgMHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTFhOWNhYSwgMHgwYTFhOWNhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSB9LAotICAgIHsgMHgwMDAwYTMwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMiB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHg0ODA3M2UwNiwgMHg0ODA3M2UwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiB9LAotICAgIHsgMHgwMDAwYTMwYywgMHg1NjBiNGMwYSwgMHg1NjBiNGMwYSwgMHg2MjFhNTQwYiwgMHg2MjFhNTQwYiwgMHg2MjFhNTQwYiB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYiB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHg3YTRmNmUxYiwgMHg3YTRmNmUxYiwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHg4YzViN2U1YSwgMHg4YzViN2U1YSwgMHg5NTBmOGNjZiwgMHg5NTBmOGNjZiwgMHg5NTBmOGNjZiB9LAotICAgIHsgMHgwMDAwYTMxYywgMHg5ZDBmOTZjZiwgMHg5ZDBmOTZjZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0ZiB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHhiNTFmYTY5ZiwgMHhiNTFmYTY5ZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHhjYjNmYmQwNywgMHhjYjNmYmNiZiwgMHhkMWZmYzkzZiwgMHhkMWZmYzkzZiwgMHhkMWZmYzkzZiB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAwZDdiZiwgMHgwMDAwZDdiZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAorCXsweDAwMDAxMDMwLCAweDAwMDAwMjMwLCAweDAwMDAwNDYwLCAweDAwMDAwMmMwLCAweDAwMDAwMTYwLCAweDAwMDAwMWUwfSwKKwl7MHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4YywgMHgwMDAwMDFlMH0sCisJezB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODB9LAorCXsweDAwMDAxMGYwLCAweDAwMDBhMDAwLCAweDAwMDE0MDAwLCAweDAwMDE2MDAwLCAweDAwMDBiMDAwLCAweDAwMDE0MDA4fSwKKwl7MHgwMDAwODAxNCwgMHgwM2U4MDNlOCwgMHgwN2QwMDdkMCwgMHgxMDgwMTYwMCwgMHgwODQwMGIwMCwgMHgwNmUwMDZlMH0sCisJezB4MDAwMDgwMWMsIDB4MTI4ZDkzYTcsIDB4MTI4ZDkzY2YsIDB4MTJlMDEzZDcsIDB4MTJlMDEzYWIsIDB4MDk4ODEzY2Z9LAorCXsweDAwMDA4MTIwLCAweDA4ZjA0ODAwLCAweDA4ZjA0ODAwLCAweDA4ZjA0ODEwLCAweDA4ZjA0ODEwLCAweDA4ZjA0ODEwfSwKKwl7MHgwMDAwODFkMCwgMHgwMDAwMzIxMCwgMHgwMDAwMzIxMCwgMHgwMDAwMzIwYSwgMHgwMDAwMzIwYSwgMHgwMDAwMzIwYX0sCisJezB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDN9LAorCXsweDAwMDA5ODIwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwfSwKKwl7MHgwMDAwOTgyNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZX0sCisJezB4MDAwMDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDF9LAorCXsweDAwMDA5ODM0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlfSwKKwl7MHgwMDAwOTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwN30sCisJezB4MDAwMDk4NDQsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTB9LAorCXsweDAwMDA5ODQ4LCAweDAwMWE2YTY1LCAweDAwMWE2YTY1LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4LCAweDAwMTk3YTY4fSwKKwl7MHgwMDAwYTg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OH0sCisJezB4MDAwMGI4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjh9LAorCXsweDAwMDA5ODUwLCAweDZjNDhiNGUyLCAweDZkNDhiNGUyLCAweDZkNDhiMGUyLCAweDZjNDhiMGUyLCAweDZjNDhiMGUyfSwKKwl7MHgwMDAwOTg1OCwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZX0sCisJezB4MDAwMDk4NWMsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWUsIDB4MzEzOTVkNWV9LAorCXsweDAwMDA5ODYwLCAweDAwMDQ4ZDE4LCAweDAwMDQ4ZDE4LCAweDAwMDQ4ZDIwLCAweDAwMDQ4ZDIwLCAweDAwMDQ4ZDE4fSwKKwl7MHgwMDAwOTg2NCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMH0sCisJezB4MDAwMDk4NjgsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDAsIDB4NDA5YTQwZDB9LAorCXsweDAwMDA5ODZjLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxfSwKKwl7MHgwMDAwOTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMGZhMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMH0sCisJezB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTZ9LAorCXsweDAwMDA5OTI0LCAweGQwMGE4YTA3LCAweGQwMGE4YTA3LCAweGQwMGE4YTBkLCAweGQwMGE4YTBkLCAweGQwMGE4YTBkfSwKKwl7MHgwMDAwOTk0NCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMCwgMHhmZmI4MTAyMH0sCisJezB4MDAwMDk5NjAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDB9LAorCXsweDAwMDBhOTYwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwfSwKKwl7MHgwMDAwYjk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MH0sCisJezB4MDAwMDk5NjQsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjAsIDB4MDAwMDExMjB9LAorCXsweDAwMDBjOTY4LCAweDAwMDAwM2I1LCAweDAwMDAwM2I1LCAweDAwMDAwM2NlLCAweDAwMDAwM2NlLCAweDAwMDAwM2NlfSwKKwl7MHgwMDAwOTliYywgMHgwMDFhMDYwMCwgMHgwMDFhMDYwMCwgMHgwMDFhMGMwMCwgMHgwMDFhMGMwMCwgMHgwMDFhMGMwMH0sCisJezB4MDAwMDk5YzAsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmV9LAorCXsweDAwMDA5OWM0LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3fSwKKwl7MHgwMDAwOTljOCwgMHg2YWY2NTMyOSwgMHg2YWY2NTMyOSwgMHg2YWY2NTMyOSwgMHg2YWY2NTMyOSwgMHg2YWY2NTMyOX0sCisJezB4MDAwMDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2Yzh9LAorCXsweDAwMDA5OWQwLCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0fSwKKwl7MHgwMDAwOTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjA0LCAweDAwMDAwODgwLCAweDAwMDAwODgwLCAweDAwMDAwODgwLCAweDAwMDAwODgwLCAweDAwMDAwODgwfSwKKwl7MHgwMDAwYTIwOCwgMHhkNmJlNDc4OCwgMHhkNmJlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OH0sCisJezB4MDAwMGEyMGMsIDB4MDAyZmMxNjAsIDB4MDAyZmMxNjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjAsIDB4MDAyYWMxMjB9LAorCXsweDAwMDBiMjBjLCAweDAwMmZjMTYwLCAweDAwMmZjMTYwLCAweDAwMmFjMTIwLCAweDAwMmFjMTIwLCAweDAwMmFjMTIwfSwKKwl7MHgwMDAwYzIwYywgMHgwMDJmYzE2MCwgMHgwMDJmYzE2MCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMCwgMHgwMDJhYzEyMH0sCisJezB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGF9LAorCXsweDAwMDBhMjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMjEwLCAweDAwMDAwMTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI3NCwgMHgwYTFhOWNhYSwgMHgwYTFhOWNhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYX0sCisJezB4MDAwMGEzMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDAsIDB4MTgwMTAwMDB9LAorCXsweDAwMDBhMzA0LCAweDMwMDMyNjAyLCAweDMwMDMyNjAyLCAweDJlMDMyNDAyLCAweDJlMDMyNDAyLCAweDJlMDMyNDAyfSwKKwl7MHgwMDAwYTMwOCwgMHg0ODA3M2UwNiwgMHg0ODA3M2UwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNiwgMHg0YTBhM2MwNn0sCisJezB4MDAwMGEzMGMsIDB4NTYwYjRjMGEsIDB4NTYwYjRjMGEsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGIsIDB4NjIxYTU0MGJ9LAorCXsweDAwMDBhMzEwLCAweDY0MWE2MDBmLCAweDY0MWE2MDBmLCAweDc2NGY2YzFiLCAweDc2NGY2YzFiLCAweDc2NGY2YzFifSwKKwl7MHgwMDAwYTMxNCwgMHg3YTRmNmUxYiwgMHg3YTRmNmUxYiwgMHg4NDViN2E1YSwgMHg4NDViN2E1YSwgMHg4NDViN2E1YX0sCisJezB4MDAwMGEzMTgsIDB4OGM1YjdlNWEsIDB4OGM1YjdlNWEsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2YsIDB4OTUwZjhjY2Z9LAorCXsweDAwMDBhMzFjLCAweDlkMGY5NmNmLCAweDlkMGY5NmNmLCAweGE1Y2Y5YjRmLCAweGE1Y2Y5YjRmLCAweGE1Y2Y5YjRmfSwKKwl7MHgwMDAwYTMyMCwgMHhiNTFmYTY5ZiwgMHhiNTFmYTY5ZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZiwgMHhiZGRmYWYxZn0sCisJezB4MDAwMGEzMjQsIDB4Y2IzZmJkMDcsIDB4Y2IzZmJjYmYsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2YsIDB4ZDFmZmM5M2Z9LAorCXsweDAwMDBhMzI4LCAweDAwMDBkN2JmLCAweDAwMDBkN2JmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2Q29tbW9uXzkxNjBbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwMzAsIDB4MDAwMjAwMTUgfSwKLSAgICB7IDB4MDAwMDAwMzQsIDB4MDAwMDAwMDUgfSwKLSAgICB7IDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNDQsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNDgsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNGMsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDAwNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNDAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNGMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNWMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwMzAsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwM2MsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDcwMTAsIDB4MDAwMDAwMjAgfSwKLSAgICB7IDB4MDAwMDcwMzgsIDB4MDAwMDA0YzIgfSwKLSAgICB7IDB4MDAwMDgwMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMTgsIDB4MDAwMDA3MDAgfSwKLSAgICB7IDB4MDAwMDgwMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNDgsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNWMsIDB4MDAwZmM3OGYgfSwKLSAgICB7IDB4MDAwMDgwNjAsIDB4MDAwMDAwMGYgfSwKLSAgICB7IDB4MDAwMDgwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYzAsIDB4MmE4MjMwMWEgfSwKLSAgICB7IDB4MDAwMDgwYzQsIDB4MDVkYzAxZTAgfSwKLSAgICB7IDB4MDAwMDgwYzgsIDB4MWY0MDI3MTAgfSwKLSAgICB7IDB4MDAwMDgwY2MsIDB4MDFmNDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDAsIDB4MDAwMDFlMDAgfSwKLSAgICB7IDB4MDAwMDgwZDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDgsIDB4MDA0MDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZTAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTQsIDB4MDAwMGZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTgsIDB4MDAzZjNmM2YgfSwKLSAgICB7IDB4MDAwMDgwZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZmMsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDAsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgxMDgsIDB4MDAwMDAwNTIgfSwKLSAgICB7IDB4MDAwMDgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMTAsIDB4MDAwMDAxNjggfSwKLSAgICB7IDB4MDAwMDgxMTgsIDB4MDAwMTAwYWEgfSwKLSAgICB7IDB4MDAwMDgxMWMsIDB4MDAwMDMyMTAgfSwKLSAgICB7IDB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAgfSwKLSAgICB7IDB4MDAwMDgxMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNDQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgxNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNzAsIDB4MzIxNDMzMjAgfSwKLSAgICB7IDB4MDAwMDgxNzQsIDB4ZmFhNGZhNTAgfSwKLSAgICB7IDB4MDAwMDgxNzgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgxN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxYzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZDAsIDB4MDAwMDMyMTAgfSwKLSAgICB7IDB4MDAwMDgxZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDAsIDB4MDAxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDQsIDB4MDAxMGY0MDAgfSwKLSAgICB7IDB4MDAwMDgyNDgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgyNGMsIDB4MDAwMWU4MDAgfSwKLSAgICB7IDB4MDAwMDgyNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNWMsIDB4NDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgyNjAsIDB4MDAwODA5MjIgfSwKLSAgICB7IDB4MDAwMDgyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzQsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzgsIDB4MDAzZTQxODAgfSwKLSAgICB7IDB4MDAwMDgyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyODQsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyODgsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMmMsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDgzMzAsIDB4MDAwMDAzMDIgfSwKLSAgICB7IDB4MDAwMDgzMzQsIDB4MDAwMDBlMDAgfSwKLSAgICB7IDB4MDAwMDgzMzgsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDgzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNDAsIDB4MDAwMTA3ZmYgfSwKLSAgICB7IDB4MDAwMDk4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MGMsIDB4YWQ4NDhlMTkgfSwKLSAgICB7IDB4MDAwMDk4MTAsIDB4N2QxNGUwMDAgfSwKLSAgICB7IDB4MDAwMDk4MTQsIDB4OWMwYTlmNmIgfSwKLSAgICB7IDB4MDAwMDk4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MmMsIDB4MDAwMGEwMDAgfSwKLSAgICB7IDB4MDAwMDk4MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4M2MsIDB4MDAyMDA0MDAgfSwKLSAgICB7IDB4MDAwMDk4NDAsIDB4MjA2YTAxYWUgfSwKLSAgICB7IDB4MDAwMDk4NGMsIDB4MTI4NDIzM2MgfSwKLSAgICB7IDB4MDAwMDk4NTQsIDB4MDAwMDA4NTkgfSwKLSAgICB7IDB4MDAwMDk5MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MWMsIDB4MTAwMDBmZmYgfSwKLSAgICB7IDB4MDAwMDk5MjAsIDB4MDUxMDAwMDAgfSwKLSAgICB7IDB4MDAwMGE5MjAsIDB4MDUxMDAwMDAgfSwKLSAgICB7IDB4MDAwMGI5MjAsIDB4MDUxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MjgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5MmMsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMDk5MzQsIDB4MWUxZjIwMjIgfSwKLSAgICB7IDB4MDAwMDk5MzgsIDB4MGEwYjBjMGQgfSwKLSAgICB7IDB4MDAwMDk5M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NDgsIDB4OTI4MGIyMTIgfSwKLSAgICB7IDB4MDAwMDk5NGMsIDB4MDAwMjAwMjggfSwKLSAgICB7IDB4MDAwMDk5NTQsIDB4NWYzY2EzZGUgfSwKLSAgICB7IDB4MDAwMDk5NTgsIDB4MjEwOGVjZmYgfSwKLSAgICB7IDB4MDAwMDk5NDAsIDB4MDA3NTA2MDQgfSwKLSAgICB7IDB4MDAwMGM5NWMsIDB4MDA0YjZhOGUgfSwKLSAgICB7IDB4MDAwMDk5NzAsIDB4MTkwZmI1MTUgfSwKLSAgICB7IDB4MDAwMDk5NzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NzgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5YTgsIDB4MjAxZmZmMDAgfSwKLSAgICB7IDB4MDAwMDk5YWMsIDB4MDA2ZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjAsIDB4MDMwNTEwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTAsIDB4MDAwMDAyMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTQsIDB4YWFhYWFhYWEgfSwKLSAgICB7IDB4MDAwMDk5ZTgsIDB4M2M0NjY0NzggfSwKLSAgICB7IDB4MDAwMDk5ZWMsIDB4MGNjODBjYWEgfSwKLSAgICB7IDB4MDAwMDk5ZmMsIDB4MDAwMDEwNDIgfSwKLSAgICB7IDB4MDAwMDliMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDliMDgsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDliMGMsIDB4MDAwMDAwMDMgfSwKLSAgICB7IDB4MDAwMDliMTAsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMDliMTQsIDB4MDAwMDAwMDUgfSwKLSAgICB7IDB4MDAwMDliMTgsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDliMWMsIDB4MDAwMDAwMDkgfSwKLSAgICB7IDB4MDAwMDliMjAsIDB4MDAwMDAwMGEgfSwKLSAgICB7IDB4MDAwMDliMjQsIDB4MDAwMDAwMGIgfSwKLSAgICB7IDB4MDAwMDliMjgsIDB4MDAwMDAwMGMgfSwKLSAgICB7IDB4MDAwMDliMmMsIDB4MDAwMDAwMGQgfSwKLSAgICB7IDB4MDAwMDliMzAsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDliMzQsIDB4MDAwMDAwMTEgfSwKLSAgICB7IDB4MDAwMDliMzgsIDB4MDAwMDAwMTIgfSwKLSAgICB7IDB4MDAwMDliM2MsIDB4MDAwMDAwMTMgfSwKLSAgICB7IDB4MDAwMDliNDAsIDB4MDAwMDAwMTQgfSwKLSAgICB7IDB4MDAwMDliNDQsIDB4MDAwMDAwMTUgfSwKLSAgICB7IDB4MDAwMDliNDgsIDB4MDAwMDAwMTggfSwKLSAgICB7IDB4MDAwMDliNGMsIDB4MDAwMDAwMTkgfSwKLSAgICB7IDB4MDAwMDliNTAsIDB4MDAwMDAwMWEgfSwKLSAgICB7IDB4MDAwMDliNTQsIDB4MDAwMDAwMWIgfSwKLSAgICB7IDB4MDAwMDliNTgsIDB4MDAwMDAwMWMgfSwKLSAgICB7IDB4MDAwMDliNWMsIDB4MDAwMDAwMWQgfSwKLSAgICB7IDB4MDAwMDliNjAsIDB4MDAwMDAwMjAgfSwKLSAgICB7IDB4MDAwMDliNjQsIDB4MDAwMDAwMjEgfSwKLSAgICB7IDB4MDAwMDliNjgsIDB4MDAwMDAwMjIgfSwKLSAgICB7IDB4MDAwMDliNmMsIDB4MDAwMDAwMjMgfSwKLSAgICB7IDB4MDAwMDliNzAsIDB4MDAwMDAwMjQgfSwKLSAgICB7IDB4MDAwMDliNzQsIDB4MDAwMDAwMjUgfSwKLSAgICB7IDB4MDAwMDliNzgsIDB4MDAwMDAwMjggfSwKLSAgICB7IDB4MDAwMDliN2MsIDB4MDAwMDAwMjkgfSwKLSAgICB7IDB4MDAwMDliODAsIDB4MDAwMDAwMmEgfSwKLSAgICB7IDB4MDAwMDliODQsIDB4MDAwMDAwMmIgfSwKLSAgICB7IDB4MDAwMDliODgsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDliOGMsIDB4MDAwMDAwMmQgfSwKLSAgICB7IDB4MDAwMDliOTAsIDB4MDAwMDAwMzAgfSwKLSAgICB7IDB4MDAwMDliOTQsIDB4MDAwMDAwMzEgfSwKLSAgICB7IDB4MDAwMDliOTgsIDB4MDAwMDAwMzIgfSwKLSAgICB7IDB4MDAwMDliOWMsIDB4MDAwMDAwMzMgfSwKLSAgICB7IDB4MDAwMDliYTAsIDB4MDAwMDAwMzQgfSwKLSAgICB7IDB4MDAwMDliYTQsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYTgsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYWMsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYjAsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYjQsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYjgsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYmMsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYzAsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYzQsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliYzgsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliY2MsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZDAsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZDQsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZDgsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZGMsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZTAsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZTQsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZTgsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZWMsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZjAsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZjQsIDB4MDAwMDAwMzUgfSwKLSAgICB7IDB4MDAwMDliZjgsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDliZmMsIDB4MDAwMDAwMWEgfSwKLSAgICB7IDB4MDAwMGEyMTAsIDB4NDA4MDYzMzMgfSwKLSAgICB7IDB4MDAwMGEyMTQsIDB4MDAxMDZjMTAgfSwKLSAgICB7IDB4MDAwMGEyMTgsIDB4MDA5YzQwNjAgfSwKLSAgICB7IDB4MDAwMGEyMjAsIDB4MDE4ODMwYzYgfSwKLSAgICB7IDB4MDAwMGEyMjQsIDB4MDAwMDA0MDAgfSwKLSAgICB7IDB4MDAwMGEyMjgsIDB4MDAxYTBiYjUgfSwKLSAgICB7IDB4MDAwMGEyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMzQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyMzgsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyM2MsIDB4MTNjODg5YWYgfSwKLSAgICB7IDB4MDAwMGEyNDAsIDB4Mzg0OTBhMjAgfSwKLSAgICB7IDB4MDAwMGEyNDQsIDB4MDAwMDdiYjYgfSwKLSAgICB7IDB4MDAwMGEyNDgsIDB4MGZmZjNmZmMgfSwKLSAgICB7IDB4MDAwMGEyNGMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEyNTAsIDB4MDAwMGUwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTgsIDB4MGNjNzUzODAgfSwKLSAgICB7IDB4MDAwMGEyNWMsIDB4MGYwZjBmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjAsIDB4ZGZhOTFmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEyNmMsIDB4MGViYWU5YzYgfSwKLSAgICB7IDB4MDAwMGIyNmMsIDB4MGViYWU5YzYgfSwKLSAgICB7IDB4MDAwMGMyNmMsIDB4MGViYWU5YzYgfSwKLSAgICB7IDB4MDAwMGQyNzAsIDB4MDA4MjA4MjAgfSwKLSAgICB7IDB4MDAwMGEyNzgsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEyN2MsIDB4MDUwNzAxY2UgfSwKLSAgICB7IDB4MDAwMGEzMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDgsIDB4M2ZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMGEzNGMsIDB4M2ZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMGEzNTAsIDB4M2ZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMGEzNTQsIDB4MDAwM2ZmZmYgfSwKLSAgICB7IDB4MDAwMGEzNTgsIDB4NzliZmFhMDMgfSwKLSAgICB7IDB4MDAwMGQzNWMsIDB4MDdmZmZmZWYgfSwKLSAgICB7IDB4MDAwMGQzNjAsIDB4MGZmZmZmZTcgfSwKLSAgICB7IDB4MDAwMGQzNjQsIDB4MTdmZmZmZTUgfSwKLSAgICB7IDB4MDAwMGQzNjgsIDB4MWZmZmZmZTQgfSwKLSAgICB7IDB4MDAwMGQzNmMsIDB4MzdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzAsIDB4M2ZmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzQsIDB4NTdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzgsIDB4NWZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzN2MsIDB4N2ZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzODAsIDB4N2YzYzdiYmEgfSwKLSAgICB7IDB4MDAwMGQzODQsIDB4ZjMzMDdmZjAgfSwKLSAgICB7IDB4MDAwMGEzODgsIDB4MGMwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzOGMsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTQsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEzOTgsIDB4MDAwMDAxY2UgfSwKLSAgICB7IDB4MDAwMGEzOWMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEzYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzgsIDB4MDAwMDAyNDYgfSwKLSAgICB7IDB4MDAwMGEzY2MsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZGMsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEzZTAsIDB4MDAwMDAxY2UgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDAwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDMwLCAweDAwMDIwMDE1fSwKKwl7MHgwMDAwMDAzNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ0LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0OCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNGMsIDB4MDAwMDAwMTB9LAorCXsweDAwMDAwMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA1NCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDA4MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDQwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDRjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDY0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTIzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTM3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2Y4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTRmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTViOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTY3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTczOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxN2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTdmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTE3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTIzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQ3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDQwMzAsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA0MDNjLCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAyMH0sCisJezB4MDAwMDcwMzgsIDB4MDAwMDA0YzJ9LAorCXsweDAwMDA4MDA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDE4LCAweDAwMDAwNzAwfSwKKwl7MHgwMDAwODAyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA0OCwgMHg0MDAwMDAwMH0sCisJezB4MDAwMDgwNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1YywgMHgwMDBmYzc4Zn0sCisJezB4MDAwMDgwNjAsIDB4MDAwMDAwMGZ9LAorCXsweDAwMDA4MDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBjMCwgMHgyYTgyMzAxYX0sCisJezB4MDAwMDgwYzQsIDB4MDVkYzAxZTB9LAorCXsweDAwMDA4MGM4LCAweDFmNDAyNzEwfSwKKwl7MHgwMDAwODBjYywgMHgwMWY0MDAwMH0sCisJezB4MDAwMDgwZDAsIDB4MDAwMDFlMDB9LAorCXsweDAwMDA4MGQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBkOCwgMHgwMDQwMDAwMH0sCisJezB4MDAwMDgwZTAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MGU0LCAweDAwMDBmZmZmfSwKKwl7MHgwMDAwODBlOCwgMHgwMDNmM2YzZn0sCisJezB4MDAwMDgwZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGZjLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwMCwgMHgwMDAyMDAwMH0sCisJezB4MDAwMDgxMDQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA4MTA4LCAweDAwMDAwMDUyfSwKKwl7MHgwMDAwODEwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMTAsIDB4MDAwMDAxNjh9LAorCXsweDAwMDA4MTE4LCAweDAwMDEwMGFhfSwKKwl7MHgwMDAwODExYywgMHgwMDAwMzIxMH0sCisJezB4MDAwMDgxMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTQ0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODE2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTcwLCAweDMyMTQzMzIwfSwKKwl7MHgwMDAwODE3NCwgMHhmYWE0ZmE1MH0sCisJezB4MDAwMDgxNzgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MTdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNDAsIDB4MDAxMDAwMDB9LAorCXsweDAwMDA4MjQ0LCAweDAwMTBmNDAwfSwKKwl7MHgwMDAwODI0OCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDgyNGMsIDB4MDAwMWU4MDB9LAorCXsweDAwMDA4MjUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjVjLCAweDQwMDAwMGZmfSwKKwl7MHgwMDAwODI2MCwgMHgwMDA4MDkyMn0sCisJezB4MDAwMDgyNjQsIDB4ODhhMDAwMTB9LAorCXsweDAwMDA4MjcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI3NCwgMHg0MDAwMDAwMH0sCisJezB4MDAwMDgyNzgsIDB4MDAzZTQxODB9LAorCXsweDAwMDA4MjdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI4NCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyODgsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA4MjhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMmMsIDB4MDAwMDAwMDd9LAorCXsweDAwMDA4MzMwLCAweDAwMDAwMzAyfSwKKwl7MHgwMDAwODMzNCwgMHgwMDAwMGUwMH0sCisJezB4MDAwMDgzMzgsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA4MzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM0MCwgMHgwMDAxMDdmZn0sCisJezB4MDAwMDk4MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODBjLCAweGFkODQ4ZTE5fSwKKwl7MHgwMDAwOTgxMCwgMHg3ZDE0ZTAwMH0sCisJezB4MDAwMDk4MTQsIDB4OWMwYTlmNmJ9LAorCXsweDAwMDA5ODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgyYywgMHgwMDAwYTAwMH0sCisJezB4MDAwMDk4MzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODNjLCAweDAwMjAwNDAwfSwKKwl7MHgwMDAwOTg0MCwgMHgyMDZhMDFhZX0sCisJezB4MDAwMDk4NGMsIDB4MTI4NDIzM2N9LAorCXsweDAwMDA5ODU0LCAweDAwMDAwODU5fSwKKwl7MHgwMDAwOTkwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MWMsIDB4MTAwMDBmZmZ9LAorCXsweDAwMDA5OTIwLCAweDA1MTAwMDAwfSwKKwl7MHgwMDAwYTkyMCwgMHgwNTEwMDAwMH0sCisJezB4MDAwMGI5MjAsIDB4MDUxMDAwMDB9LAorCXsweDAwMDA5OTI4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTkyYywgMHgwMDAwMDAwNH0sCisJezB4MDAwMDk5MzQsIDB4MWUxZjIwMjJ9LAorCXsweDAwMDA5OTM4LCAweDBhMGIwYzBkfSwKKwl7MHgwMDAwOTkzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5NDgsIDB4OTI4MGIyMTJ9LAorCXsweDAwMDA5OTRjLCAweDAwMDIwMDI4fSwKKwl7MHgwMDAwOTk1NCwgMHg1ZjNjYTNkZX0sCisJezB4MDAwMDk5NTgsIDB4MjEwOGVjZmZ9LAorCXsweDAwMDA5OTQwLCAweDAwNzUwNjA0fSwKKwl7MHgwMDAwYzk1YywgMHgwMDRiNmE4ZX0sCisJezB4MDAwMDk5NzAsIDB4MTkwZmI1MTV9LAorCXsweDAwMDA5OTc0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk3OCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDk5N2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OThjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5YTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWE0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTlhOCwgMHgyMDFmZmYwMH0sCisJezB4MDAwMDk5YWMsIDB4MDA2ZjAwMDB9LAorCXsweDAwMDA5OWIwLCAweDAzMDUxMDAwfSwKKwl7MHgwMDAwOTlkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZTAsIDB4MDAwMDAyMDB9LAorCXsweDAwMDA5OWU0LCAweGFhYWFhYWFhfSwKKwl7MHgwMDAwOTllOCwgMHgzYzQ2NjQ3OH0sCisJezB4MDAwMDk5ZWMsIDB4MGNjODBjYWF9LAorCXsweDAwMDA5OWZjLCAweDAwMDAxMDQyfSwKKwl7MHgwMDAwOWIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMDQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5YjA4LCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwOWIwYywgMHgwMDAwMDAwM30sCisJezB4MDAwMDliMTAsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA5YjE0LCAweDAwMDAwMDA1fSwKKwl7MHgwMDAwOWIxOCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDliMWMsIDB4MDAwMDAwMDl9LAorCXsweDAwMDA5YjIwLCAweDAwMDAwMDBhfSwKKwl7MHgwMDAwOWIyNCwgMHgwMDAwMDAwYn0sCisJezB4MDAwMDliMjgsIDB4MDAwMDAwMGN9LAorCXsweDAwMDA5YjJjLCAweDAwMDAwMDBkfSwKKwl7MHgwMDAwOWIzMCwgMHgwMDAwMDAxMH0sCisJezB4MDAwMDliMzQsIDB4MDAwMDAwMTF9LAorCXsweDAwMDA5YjM4LCAweDAwMDAwMDEyfSwKKwl7MHgwMDAwOWIzYywgMHgwMDAwMDAxM30sCisJezB4MDAwMDliNDAsIDB4MDAwMDAwMTR9LAorCXsweDAwMDA5YjQ0LCAweDAwMDAwMDE1fSwKKwl7MHgwMDAwOWI0OCwgMHgwMDAwMDAxOH0sCisJezB4MDAwMDliNGMsIDB4MDAwMDAwMTl9LAorCXsweDAwMDA5YjUwLCAweDAwMDAwMDFhfSwKKwl7MHgwMDAwOWI1NCwgMHgwMDAwMDAxYn0sCisJezB4MDAwMDliNTgsIDB4MDAwMDAwMWN9LAorCXsweDAwMDA5YjVjLCAweDAwMDAwMDFkfSwKKwl7MHgwMDAwOWI2MCwgMHgwMDAwMDAyMH0sCisJezB4MDAwMDliNjQsIDB4MDAwMDAwMjF9LAorCXsweDAwMDA5YjY4LCAweDAwMDAwMDIyfSwKKwl7MHgwMDAwOWI2YywgMHgwMDAwMDAyM30sCisJezB4MDAwMDliNzAsIDB4MDAwMDAwMjR9LAorCXsweDAwMDA5Yjc0LCAweDAwMDAwMDI1fSwKKwl7MHgwMDAwOWI3OCwgMHgwMDAwMDAyOH0sCisJezB4MDAwMDliN2MsIDB4MDAwMDAwMjl9LAorCXsweDAwMDA5YjgwLCAweDAwMDAwMDJhfSwKKwl7MHgwMDAwOWI4NCwgMHgwMDAwMDAyYn0sCisJezB4MDAwMDliODgsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA5YjhjLCAweDAwMDAwMDJkfSwKKwl7MHgwMDAwOWI5MCwgMHgwMDAwMDAzMH0sCisJezB4MDAwMDliOTQsIDB4MDAwMDAwMzF9LAorCXsweDAwMDA5Yjk4LCAweDAwMDAwMDMyfSwKKwl7MHgwMDAwOWI5YywgMHgwMDAwMDAzM30sCisJezB4MDAwMDliYTAsIDB4MDAwMDAwMzR9LAorCXsweDAwMDA5YmE0LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJhOCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYWMsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmIwLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJiNCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYjgsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmJjLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJjMCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliYzQsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmM4LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJjYywgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZDAsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmQ0LCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJkOCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZGMsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmUwLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJlNCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZTgsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmVjLCAweDAwMDAwMDM1fSwKKwl7MHgwMDAwOWJmMCwgMHgwMDAwMDAzNX0sCisJezB4MDAwMDliZjQsIDB4MDAwMDAwMzV9LAorCXsweDAwMDA5YmY4LCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwOWJmYywgMHgwMDAwMDAxYX0sCisJezB4MDAwMGEyMTAsIDB4NDA4MDYzMzN9LAorCXsweDAwMDBhMjE0LCAweDAwMTA2YzEwfSwKKwl7MHgwMDAwYTIxOCwgMHgwMDljNDA2MH0sCisJezB4MDAwMGEyMjAsIDB4MDE4ODMwYzZ9LAorCXsweDAwMDBhMjI0LCAweDAwMDAwNDAwfSwKKwl7MHgwMDAwYTIyOCwgMHgwMDFhMGJiNX0sCisJezB4MDAwMGEyMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjM0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTIzOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyM2MsIDB4MTNjODg5YWZ9LAorCXsweDAwMDBhMjQwLCAweDM4NDkwYTIwfSwKKwl7MHgwMDAwYTI0NCwgMHgwMDAwN2JiNn0sCisJezB4MDAwMGEyNDgsIDB4MGZmZjNmZmN9LAorCXsweDAwMDBhMjRjLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTI1MCwgMHgwMDAwZTAwMH0sCisJezB4MDAwMGEyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjU4LCAweDBjYzc1MzgwfSwKKwl7MHgwMDAwYTI1YywgMHgwZjBmMGYwMX0sCisJezB4MDAwMGEyNjAsIDB4ZGZhOTFmMDF9LAorCXsweDAwMDBhMjY4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTI2YywgMHgwZTc5ZTVjNn0sCisJezB4MDAwMGIyNmMsIDB4MGU3OWU1YzZ9LAorCXsweDAwMDBjMjZjLCAweDBlNzllNWM2fSwKKwl7MHgwMDAwZDI3MCwgMHgwMDgyMDgyMH0sCisJezB4MDAwMGEyNzgsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhMjdjLCAweDA1MDcwMWNlfSwKKwl7MHgwMDAwYTMzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDgsIDB4M2ZmZmZmZmZ9LAorCXsweDAwMDBhMzRjLCAweDNmZmZmZmZmfSwKKwl7MHgwMDAwYTM1MCwgMHgzZmZmZmZmZn0sCisJezB4MDAwMGEzNTQsIDB4MDAwM2ZmZmZ9LAorCXsweDAwMDBhMzU4LCAweDc5YmZhYTAzfSwKKwl7MHgwMDAwZDM1YywgMHgwN2ZmZmZlZn0sCisJezB4MDAwMGQzNjAsIDB4MGZmZmZmZTd9LAorCXsweDAwMDBkMzY0LCAweDE3ZmZmZmU1fSwKKwl7MHgwMDAwZDM2OCwgMHgxZmZmZmZlNH0sCisJezB4MDAwMGQzNmMsIDB4MzdmZmZmZTN9LAorCXsweDAwMDBkMzcwLCAweDNmZmZmZmUzfSwKKwl7MHgwMDAwZDM3NCwgMHg1N2ZmZmZlM30sCisJezB4MDAwMGQzNzgsIDB4NWZmZmZmZTJ9LAorCXsweDAwMDBkMzdjLCAweDdmZmZmZmUyfSwKKwl7MHgwMDAwZDM4MCwgMHg3ZjNjN2JiYX0sCisJezB4MDAwMGQzODQsIDB4ZjMzMDdmZjB9LAorCXsweDAwMDBhMzg4LCAweDBjMDAwMDAwfSwKKwl7MHgwMDAwYTM4YywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzOTAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMzk0LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTM5OCwgMHgwMDAwMDFjZX0sCisJezB4MDAwMGEzOWMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhM2EwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2FjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2M0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNjOCwgMHgwMDAwMDI0Nn0sCisJezB4MDAwMGEzY2MsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2QwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZGMsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhM2UwLCAweDAwMDAwMWNlfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazBfOTE2MFtdWzJdID0gewotICAgIHsgMHgwMDAwOThiMCwgMHgxZTU3OTVlNSB9LAotICAgIHsgMHgwMDAwOThlMCwgMHgwMjAwODAyMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOThiMCwgMHgxZTU3OTVlNX0sCisJezB4MDAwMDk4ZTAsIDB4MDIwMDgwMjB9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZCQl9SZkdhaW5fOTE2MFtdWzNdID0gewotICAgIHsgMHgwMDAwOWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwNCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MCB9LAotICAgIHsgMHgwMDAwOWEwOCwgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCB9LAotICAgIHsgMHgwMDAwOWEwYywgMHgwMDAwMDFhMSwgMHgwMDAwMDE0MSB9LAotICAgIHsgMHgwMDAwOWExMCwgMHgwMDAwMDFlMSwgMHgwMDAwMDE4MSB9LAotICAgIHsgMHgwMDAwOWExNCwgMHgwMDAwMDAyMSwgMHgwMDAwMDFjMSB9LAotICAgIHsgMHgwMDAwOWExOCwgMHgwMDAwMDA2MSwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOWExYywgMHgwMDAwMDE2OCwgMHgwMDAwMDA0MSB9LAotICAgIHsgMHgwMDAwOWEyMCwgMHgwMDAwMDFhOCwgMHgwMDAwMDFhOCB9LAotICAgIHsgMHgwMDAwOWEyNCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCB9LAotICAgIHsgMHgwMDAwOWEyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCB9LAotICAgIHsgMHgwMDAwOWEyYywgMHgwMDAwMDA2OCwgMHgwMDAwMDA2OCB9LAotICAgIHsgMHgwMDAwOWEzMCwgMHgwMDAwMDE4OSwgMHgwMDAwMDBhOCB9LAotICAgIHsgMHgwMDAwOWEzNCwgMHgwMDAwMDFjOSwgMHgwMDAwMDE2OSB9LAotICAgIHsgMHgwMDAwOWEzOCwgMHgwMDAwMDAwOSwgMHgwMDAwMDFhOSB9LAotICAgIHsgMHgwMDAwOWEzYywgMHgwMDAwMDA0OSwgMHgwMDAwMDFlOSB9LAotICAgIHsgMHgwMDAwOWE0MCwgMHgwMDAwMDA4OSwgMHgwMDAwMDAyOSB9LAotICAgIHsgMHgwMDAwOWE0NCwgMHgwMDAwMDE3MCwgMHgwMDAwMDA2OSB9LAotICAgIHsgMHgwMDAwOWE0OCwgMHgwMDAwMDFiMCwgMHgwMDAwMDE5MCB9LAotICAgIHsgMHgwMDAwOWE0YywgMHgwMDAwMDFmMCwgMHgwMDAwMDFkMCB9LAotICAgIHsgMHgwMDAwOWE1MCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwOWE1NCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA1MCB9LAotICAgIHsgMHgwMDAwOWE1OCwgMHgwMDAwMDE5MSwgMHgwMDAwMDA5MCB9LAotICAgIHsgMHgwMDAwOWE1YywgMHgwMDAwMDFkMSwgMHgwMDAwMDE1MSB9LAotICAgIHsgMHgwMDAwOWE2MCwgMHgwMDAwMDAxMSwgMHgwMDAwMDE5MSB9LAotICAgIHsgMHgwMDAwOWE2NCwgMHgwMDAwMDA1MSwgMHgwMDAwMDFkMSB9LAotICAgIHsgMHgwMDAwOWE2OCwgMHgwMDAwMDA5MSwgMHgwMDAwMDAxMSB9LAotICAgIHsgMHgwMDAwOWE2YywgMHgwMDAwMDFiOCwgMHgwMDAwMDA1MSB9LAotICAgIHsgMHgwMDAwOWE3MCwgMHgwMDAwMDFmOCwgMHgwMDAwMDE5OCB9LAotICAgIHsgMHgwMDAwOWE3NCwgMHgwMDAwMDAzOCwgMHgwMDAwMDFkOCB9LAotICAgIHsgMHgwMDAwOWE3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDAxOCB9LAotICAgIHsgMHgwMDAwOWE3YywgMHgwMDAwMDE5OSwgMHgwMDAwMDA1OCB9LAotICAgIHsgMHgwMDAwOWE4MCwgMHgwMDAwMDFkOSwgMHgwMDAwMDA5OCB9LAotICAgIHsgMHgwMDAwOWE4NCwgMHgwMDAwMDAxOSwgMHgwMDAwMDE1OSB9LAotICAgIHsgMHgwMDAwOWE4OCwgMHgwMDAwMDA1OSwgMHgwMDAwMDE5OSB9LAotICAgIHsgMHgwMDAwOWE4YywgMHgwMDAwMDA5OSwgMHgwMDAwMDFkOSB9LAotICAgIHsgMHgwMDAwOWE5MCwgMHgwMDAwMDBkOSwgMHgwMDAwMDAxOSB9LAotICAgIHsgMHgwMDAwOWE5NCwgMHgwMDAwMDBmOSwgMHgwMDAwMDA1OSB9LAotICAgIHsgMHgwMDAwOWE5OCwgMHgwMDAwMDBmOSwgMHgwMDAwMDA5OSB9LAotICAgIHsgMHgwMDAwOWE5YywgMHgwMDAwMDBmOSwgMHgwMDAwMDBkOSB9LAotICAgIHsgMHgwMDAwOWFhMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFhNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFhOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFhYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFiYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFjYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFkYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFlYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAotICAgIHsgMHgwMDAwOWFmYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwOWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMDQsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDB9LAorCXsweDAwMDA5YTA4LCAweDAwMDAwMDgwLCAweDAwMDAwMDgwfSwKKwl7MHgwMDAwOWEwYywgMHgwMDAwMDFhMSwgMHgwMDAwMDE0MX0sCisJezB4MDAwMDlhMTAsIDB4MDAwMDAxZTEsIDB4MDAwMDAxODF9LAorCXsweDAwMDA5YTE0LCAweDAwMDAwMDIxLCAweDAwMDAwMWMxfSwKKwl7MHgwMDAwOWExOCwgMHgwMDAwMDA2MSwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDlhMWMsIDB4MDAwMDAxNjgsIDB4MDAwMDAwNDF9LAorCXsweDAwMDA5YTIwLCAweDAwMDAwMWE4LCAweDAwMDAwMWE4fSwKKwl7MHgwMDAwOWEyNCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOH0sCisJezB4MDAwMDlhMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjh9LAorCXsweDAwMDA5YTJjLCAweDAwMDAwMDY4LCAweDAwMDAwMDY4fSwKKwl7MHgwMDAwOWEzMCwgMHgwMDAwMDE4OSwgMHgwMDAwMDBhOH0sCisJezB4MDAwMDlhMzQsIDB4MDAwMDAxYzksIDB4MDAwMDAxNjl9LAorCXsweDAwMDA5YTM4LCAweDAwMDAwMDA5LCAweDAwMDAwMWE5fSwKKwl7MHgwMDAwOWEzYywgMHgwMDAwMDA0OSwgMHgwMDAwMDFlOX0sCisJezB4MDAwMDlhNDAsIDB4MDAwMDAwODksIDB4MDAwMDAwMjl9LAorCXsweDAwMDA5YTQ0LCAweDAwMDAwMTcwLCAweDAwMDAwMDY5fSwKKwl7MHgwMDAwOWE0OCwgMHgwMDAwMDFiMCwgMHgwMDAwMDE5MH0sCisJezB4MDAwMDlhNGMsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZDB9LAorCXsweDAwMDA5YTUwLCAweDAwMDAwMDMwLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwOWE1NCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA1MH0sCisJezB4MDAwMDlhNTgsIDB4MDAwMDAxOTEsIDB4MDAwMDAwOTB9LAorCXsweDAwMDA5YTVjLCAweDAwMDAwMWQxLCAweDAwMDAwMTUxfSwKKwl7MHgwMDAwOWE2MCwgMHgwMDAwMDAxMSwgMHgwMDAwMDE5MX0sCisJezB4MDAwMDlhNjQsIDB4MDAwMDAwNTEsIDB4MDAwMDAxZDF9LAorCXsweDAwMDA5YTY4LCAweDAwMDAwMDkxLCAweDAwMDAwMDExfSwKKwl7MHgwMDAwOWE2YywgMHgwMDAwMDFiOCwgMHgwMDAwMDA1MX0sCisJezB4MDAwMDlhNzAsIDB4MDAwMDAxZjgsIDB4MDAwMDAxOTh9LAorCXsweDAwMDA5YTc0LCAweDAwMDAwMDM4LCAweDAwMDAwMWQ4fSwKKwl7MHgwMDAwOWE3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDAxOH0sCisJezB4MDAwMDlhN2MsIDB4MDAwMDAxOTksIDB4MDAwMDAwNTh9LAorCXsweDAwMDA5YTgwLCAweDAwMDAwMWQ5LCAweDAwMDAwMDk4fSwKKwl7MHgwMDAwOWE4NCwgMHgwMDAwMDAxOSwgMHgwMDAwMDE1OX0sCisJezB4MDAwMDlhODgsIDB4MDAwMDAwNTksIDB4MDAwMDAxOTl9LAorCXsweDAwMDA5YThjLCAweDAwMDAwMDk5LCAweDAwMDAwMWQ5fSwKKwl7MHgwMDAwOWE5MCwgMHgwMDAwMDBkOSwgMHgwMDAwMDAxOX0sCisJezB4MDAwMDlhOTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwNTl9LAorCXsweDAwMDA5YTk4LCAweDAwMDAwMGY5LCAweDAwMDAwMDk5fSwKKwl7MHgwMDAwOWE5YywgMHgwMDAwMDBmOSwgMHgwMDAwMDBkOX0sCisJezB4MDAwMDlhYTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWE0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFhOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWIwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFiNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWJjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFjMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhYzQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWM4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFjYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZDAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWQ0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFkOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZGMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWUwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFlNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWVjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFmMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCisJezB4MDAwMDlhZjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjl9LAorCXsweDAwMDA5YWY4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5fSwKKwl7MHgwMDAwOWFmYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOX0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkJhbmsxXzkxNjBbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDk4YjAsIDB4MDIxMDg0MjEgfSwKLSAgICB7IDB4MDAwMDk4ZWMsIDB4MDAwMDAwMDggfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDk4YjAsIDB4MDIxMDg0MjF9LAorCXsweDAwMDA5OGVjLCAweDAwMDAwMDA4fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazJfOTE2MFtdWzJdID0gewotICAgIHsgMHgwMDAwOThiMCwgMHgwZTczZmYxNyB9LAotICAgIHsgMHgwMDAwOThlMCwgMHgwMDAwMDQyMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOThiMCwgMHgwZTczZmYxN30sCisJezB4MDAwMDk4ZTAsIDB4MDAwMDA0MjB9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZCYW5rM185MTYwW11bM10gPSB7Ci0gICAgeyAweDAwMDA5OGYwLCAweDAxNDAwMDE4LCAweDAxYzAwMDE4IH0sCisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAqLworCXsweDAwMDA5OGYwLCAweDAxNDAwMDE4LCAweDAxYzAwMDE4fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazZfOTE2MFtdWzNdID0gewotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVlMDAwMCwgMHgwMDVlMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHg0MGZmMDAwMCwgMHg0MGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDg3MDAwMCwgMHgwMDg3MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY5MDAwMCwgMHgwMGY5MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY1MDAwMCwgMHgwMGY1MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDExMDAwMCwgMHgwMDExMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYxMDBhOCwgMHgwMDYxMDBhOCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQyMTBhMiwgMHgwMDQyMTBhMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDE0MDA4ZiwgMHgwMDE0MDA4ZiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGM0MDAwMywgMHgwMGM0MDAwMyB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQ0MDAxNiwgMHgwMDQ0MDAxNiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQxMDA0MCwgMHgwMDQxMDA0MCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwYzBhYiwgMHgwMDAwYzBhYiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBmMSwgMHgwMDAwMDBmMSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCB9LAotICAgIHsgMHgwMDAwOThkMCwgMHgwMDAwMDAwZiwgMHgwMDEwMDAwZiB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA1ZTAwMDAsIDB4MDA1ZTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMTIwMDAwLCAweDAwMTIwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMjAwMDAsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDQwZmYwMDAwLCAweDQwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA4NzAwMDAsIDB4MDA4NzAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjkwMDAwLCAweDAwZjkwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjUwMDAwLCAweDAwZjUwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNjEwMGE4LCAweDAwNjEwMGE4fSwKKwl7MHgwMDAwOTg5YywgMHgwMDQyMTBhMiwgMHgwMDQyMTBhMn0sCisJezB4MDAwMDk4OWMsIDB4MDAxNDAwOGYsIDB4MDAxNDAwOGZ9LAorCXsweDAwMDA5ODljLCAweDAwYzQwMDAzLCAweDAwYzQwMDAzfSwKKwl7MHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMn0sCisJezB4MDAwMDk4OWMsIDB4MDA0NDAwMTYsIDB4MDA0NDAwMTZ9LAorCXsweDAwMDA5ODljLCAweDAwNDEwMDQwLCAweDAwNDEwMDQwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMGMwYWIsIDB4MDAwMGMwYWJ9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGYxLCAweDAwMDAwMGYxfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDR9LAorCXsweDAwMDA5OGQwLCAweDAwMDAwMDBmLCAweDAwMTAwMDBmfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazZUUENfOTE2MFtdWzNdID0gewotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVlMDAwMCwgMHgwMDVlMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDEyMDAwMCwgMHgwMDEyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAyMDAwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHg0MGZmMDAwMCwgMHg0MGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDg3MDAwMCwgMHgwMDg3MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY5MDAwMCwgMHgwMGY5MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGY1MDAwMCwgMHgwMGY1MDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDExMDAwMCwgMHgwMDExMDAwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDYxMDBhOCwgMHgwMDYxMDBhOCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQyMzAyMiwgMHgwMDQyMzAyMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgyMDE0MDA4ZiwgMHgyMDE0MDA4ZiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMGM0MDAwMiwgMHgwMGM0MDAwMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQ0MDAxNiwgMHgwMDQ0MDAxNiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDQxMDA0MCwgMHgwMDQxMDA0MCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwYzBhYiwgMHgwMDAwYzBhYiB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBlMSwgMHgwMDAwMDBlMSB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwNzA4MCwgMHgwMDAwNzA4MCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDBkNCwgMHgwMDAwMDBkNCB9LAotICAgIHsgMHgwMDAwOThkMCwgMHgwMDAwMDAwZiwgMHgwMDEwMDAwZiB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGUwMDAwMCwgMHgwMGUwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA1ZTAwMDAsIDB4MDA1ZTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMTIwMDAwLCAweDAwMTIwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDYyMDAwMCwgMHgwMDYyMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMjAwMDAsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZmYwMDAwLCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGZmMDAwMCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDQwZmYwMDAwLCAweDQwZmYwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDVmMDAwMCwgMHgwMDVmMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDA4NzAwMDAsIDB4MDA4NzAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjkwMDAwLCAweDAwZjkwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDdiMDAwMCwgMHgwMDdiMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDBmZjAwMDAsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwZjUwMDAwLCAweDAwZjUwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMGRjMDAwMCwgMHgwMGRjMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAxMTAwMDAsIDB4MDAxMTAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwNjEwMGE4LCAweDAwNjEwMGE4fSwKKwl7MHgwMDAwOTg5YywgMHgwMDQyMzAyMiwgMHgwMDQyMzAyMn0sCisJezB4MDAwMDk4OWMsIDB4MjAxNDAwOGYsIDB4MjAxNDAwOGZ9LAorCXsweDAwMDA5ODljLCAweDAwYzQwMDAyLCAweDAwYzQwMDAyfSwKKwl7MHgwMDAwOTg5YywgMHgwMDMwMDBmMiwgMHgwMDMwMDBmMn0sCisJezB4MDAwMDk4OWMsIDB4MDA0NDAwMTYsIDB4MDA0NDAwMTZ9LAorCXsweDAwMDA5ODljLCAweDAwNDEwMDQwLCAweDAwNDEwMDQwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAxODA1ZSwgMHgwMDAxODA1ZX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMGMwYWIsIDB4MDAwMGMwYWJ9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGUxLCAweDAwMDAwMGUxfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwNzA4MCwgMHgwMDAwNzA4MH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwZDQsIDB4MDAwMDAwZDR9LAorCXsweDAwMDA5OGQwLCAweDAwMDAwMDBmLCAweDAwMTAwMDBmfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QmFuazdfOTE2MFtdWzJdID0gewotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDUwMCB9LAotICAgIHsgMHgwMDAwOTg5YywgMHgwMDAwMDgwMCB9LAotICAgIHsgMHgwMDAwOThjYywgMHgwMDAwMDAwZSB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDUwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDA4MDB9LAorCXsweDAwMDA5OGNjLCAweDAwMDAwMDBlfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI1NDE2QWRkYWNfOTE2MFtdWzJdID0gewotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDBjMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAxOCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwNCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDBjMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAxOSB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwNCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwNCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMyB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwOCB9LAotICAgIHsweDAwMDA5ODljLCAgMHgwMDAwMDAwMCB9LAotICAgIHsweDAwMDA5OGNjLCAgMHgwMDAwMDAwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDBjMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMTh9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDBjMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMTl9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwNH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDN9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4Y2MsIDB4MDAwMDAwMDB9LAogfTsKIAotc3RhdGljIGNvbnN0IHUzMiBhcjU0MTZBZGRhY185MTYwMV8xW11bMl0gPSB7Ci0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMGMwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDE4IH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDA0IH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMGMwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDE5IH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDA0IH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4OWMsICAweDAwMDAwMDAwIH0sCi0gICAgezB4MDAwMDk4Y2MsICAweDAwMDAwMDAwIH0sCitzdGF0aWMgY29uc3QgdTMyIGFyNTQxNkFkZGFjXzkxNjBfMV8xW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGMwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAxOH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMGMwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAxOX0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOThjYywgMHgwMDAwMDAwMH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMKaW5kZXggNWZkYmI1My4uZGFiYWZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfY2FsaWIuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJCQlpZiAocUNvZmYgPiAxNSkKIAkJCQlxQ29mZiA9IDE1OwogCQkJZWxzZSBpZiAocUNvZmYgPD0gLTE2KQotCQkJCXFDb2ZmID0gMTY7CisJCQkJcUNvZmYgPSAtMTY7CiAKIAkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAogCQkJCSAgIkNobiAlZCA6IGlDb2ZmID0gMHgleCAgcUNvZmYgPSAweCV4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jCmluZGV4IGE4YThjZGMuLjMwM2M2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMKQEAgLTE4LDYgKzE4LDExIEBACiAjaW5jbHVkZSAiYXI1MDA4X2luaXR2YWxzLmgiCiAjaW5jbHVkZSAiYXI5MDAxX2luaXR2YWxzLmgiCiAjaW5jbHVkZSAiYXI5MDAyX2luaXR2YWxzLmgiCisjaW5jbHVkZSAiYXI5MDAyX3BoeS5oIgorCitpbnQgbW9kcGFyYW1fZm9yY2VfbmV3X2FuaTsKK21vZHVsZV9wYXJhbV9uYW1lZChmb3JjZV9uZXdfYW5pLCBtb2RwYXJhbV9mb3JjZV9uZXdfYW5pLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhub2h3Y3J5cHQsICJGb3JjZSBuZXcgQU5JIGZvciBBUjUwMDgsIEFSOTAwMSwgQVI5MDAyIik7CiAKIC8qIEdlbmVyYWwgaGFyZHdhcmUgY29kZSBmb3IgdGhlIEE1MDA4L0FSOTAwMS9BUjkwMDIgaGFkd2FyZSBmYW1pbGllcyAqLwogCkBAIC04MCwyMSArODUsNiBAQAogCQkJYXI5Mjg3UGNpZVBoeV9jbGtyZXFfYWx3YXlzX29uX0wxXzkyODdfMV8xLAogCQkJQVJSQVlfU0laRShhcjkyODdQY2llUGh5X2Nsa3JlcV9hbHdheXNfb25fTDFfOTI4N18xXzEpLAogCQkJCQkyKTsKLQl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4N18xMF9PUl9MQVRFUihhaCkpIHsKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2RlcywgYXI5Mjg3TW9kZXNfOTI4N18xXzAsCi0JCQkJQVJSQVlfU0laRShhcjkyODdNb2Rlc185Mjg3XzFfMCksIDYpOwotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaUNvbW1vbiwgYXI5Mjg3Q29tbW9uXzkyODdfMV8wLAotCQkJCUFSUkFZX1NJWkUoYXI5Mjg3Q29tbW9uXzkyODdfMV8wKSwgMik7Ci0KLQkJaWYgKGFoLT5jb25maWcucGNpZV9jbG9ja19yZXEpCi0JCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXMsCi0JCQlhcjkyODdQY2llUGh5X2Nsa3JlcV9vZmZfTDFfOTI4N18xXzAsCi0JCQlBUlJBWV9TSVpFKGFyOTI4N1BjaWVQaHlfY2xrcmVxX29mZl9MMV85Mjg3XzFfMCksIDIpOwotCQllbHNlCi0JCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXMsCi0JCQlhcjkyODdQY2llUGh5X2Nsa3JlcV9hbHdheXNfb25fTDFfOTI4N18xXzAsCi0JCQlBUlJBWV9TSVpFKGFyOTI4N1BjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg3XzFfMCksCi0JCQkJICAyKTsKIAl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4NV8xMl9PUl9MQVRFUihhaCkpIHsKIAogCkBAIC0xMTMsMjEgKzEwMyw2IEBACiAJCQlBUlJBWV9TSVpFKGFyOTI4NVBjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg1XzFfMiksCiAJCQkJICAyKTsKIAkJfQotCX0gZWxzZSBpZiAoQVJfU1JFVl85Mjg1XzEwX09SX0xBVEVSKGFoKSkgewotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzLCBhcjkyODVNb2Rlc185Mjg1LAotCQkJICAgICAgIEFSUkFZX1NJWkUoYXI5Mjg1TW9kZXNfOTI4NSksIDYpOwotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaUNvbW1vbiwgYXI5Mjg1Q29tbW9uXzkyODUsCi0JCQkgICAgICAgQVJSQVlfU0laRShhcjkyODVDb21tb25fOTI4NSksIDIpOwotCi0JCWlmIChhaC0+Y29uZmlnLnBjaWVfY2xvY2tfcmVxKSB7Ci0JCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXMsCi0JCQlhcjkyODVQY2llUGh5X2Nsa3JlcV9vZmZfTDFfOTI4NSwKLQkJCUFSUkFZX1NJWkUoYXI5Mjg1UGNpZVBoeV9jbGtyZXFfb2ZmX0wxXzkyODUpLCAyKTsKLQkJfSBlbHNlIHsKLQkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlcywKLQkJCWFyOTI4NVBjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg1LAotCQkJQVJSQVlfU0laRShhcjkyODVQY2llUGh5X2Nsa3JlcV9hbHdheXNfb25fTDFfOTI4NSksIDIpOwotCQl9CiAJfSBlbHNlIGlmIChBUl9TUkVWXzkyODBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXMsIGFyOTI4ME1vZGVzXzkyODBfMiwKIAkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTI4ME1vZGVzXzkyODBfMiksIDYpOwpAQCAtMTQ2LDExICsxMjEsNiBAQAogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzQWRkaXRpb25hbCwKIAkJCSAgICAgICBhcjkyODBNb2Rlc19mYXN0X2Nsb2NrXzkyODBfMiwKIAkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTI4ME1vZGVzX2Zhc3RfY2xvY2tfOTI4MF8yKSwgMyk7Ci0JfSBlbHNlIGlmIChBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpKSB7Ci0JCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXMsIGFyOTI4ME1vZGVzXzkyODAsCi0JCQkgICAgICAgQVJSQVlfU0laRShhcjkyODBNb2Rlc185MjgwKSwgNik7Ci0JCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQ29tbW9uLCBhcjkyODBDb21tb25fOTI4MCwKLQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTI4MENvbW1vbl85MjgwKSwgMik7CiAJfSBlbHNlIGlmIChBUl9TUkVWXzkxNjBfMTBfT1JfTEFURVIoYWgpKSB7CiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXMsIGFyNTQxNk1vZGVzXzkxNjAsCiAJCQkgICAgICAgQVJSQVlfU0laRShhcjU0MTZNb2Rlc185MTYwKSwgNik7CkBAIC0xNzQsOCArMTQ0LDggQEAKIAkJCSAgICAgICBBUlJBWV9TSVpFKGFyNTQxNkJhbms3XzkxNjApLCAyKTsKIAkJaWYgKEFSX1NSRVZfOTE2MF8xMShhaCkpIHsKIAkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQWRkYWMsCi0JCQkJICAgICAgIGFyNTQxNkFkZGFjXzkxNjAxXzEsCi0JCQkJICAgICAgIEFSUkFZX1NJWkUoYXI1NDE2QWRkYWNfOTE2MDFfMSksIDIpOworCQkJCSAgICAgICBhcjU0MTZBZGRhY185MTYwXzFfMSwKKwkJCQkgICAgICAgQVJSQVlfU0laRShhcjU0MTZBZGRhY185MTYwXzFfMSksIDIpOwogCQl9IGVsc2UgewogCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlBZGRhYywgYXI1NDE2QWRkYWNfOTE2MCwKIAkJCQkgICAgICAgQVJSQVlfU0laRShhcjU0MTZBZGRhY185MTYwKSwgMik7CkBAIC0yMzQsMTIgKzIwNCwxMiBAQAogewogCWlmIChBUl9TUkVWXzkyODdfMTFfT1JfTEFURVIoYWgpKSB7CiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQ2NrZmlyTm9ybWFsLAotCQkgICAgICAgYXI5Mjg3Q29tbW9uX25vcm1hbF9jY2tfZmlyX2NvZWZmXzkyODcxXzEsCi0JCSAgICAgICBBUlJBWV9TSVpFKGFyOTI4N0NvbW1vbl9ub3JtYWxfY2NrX2Zpcl9jb2VmZl85Mjg3MV8xKSwKKwkJICAgICAgIGFyOTI4N0NvbW1vbl9ub3JtYWxfY2NrX2Zpcl9jb2VmZl85Mjg3XzFfMSwKKwkJICAgICAgIEFSUkFZX1NJWkUoYXI5Mjg3Q29tbW9uX25vcm1hbF9jY2tfZmlyX2NvZWZmXzkyODdfMV8xKSwKIAkJICAgICAgIDIpOwogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaUNja2ZpckphcGFuMjQ4NCwKLQkJICAgICAgIGFyOTI4N0NvbW1vbl9qYXBhbl8yNDg0X2Nja19maXJfY29lZmZfOTI4NzFfMSwKLQkJICAgICAgIEFSUkFZX1NJWkUoYXI5Mjg3Q29tbW9uX2phcGFuXzI0ODRfY2NrX2Zpcl9jb2VmZl85Mjg3MV8xKSwKKwkJICAgICAgIGFyOTI4N0NvbW1vbl9qYXBhbl8yNDg0X2Nja19maXJfY29lZmZfOTI4N18xXzEsCisJCSAgICAgICBBUlJBWV9TSVpFKGFyOTI4N0NvbW1vbl9qYXBhbl8yNDg0X2Nja19maXJfY29lZmZfOTI4N18xXzEpLAogCQkgICAgICAgMik7CiAJfQogfQpAQCAtMzAwLDEwICsyNzAsNiBAQAogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzUnhHYWluLAogCQlhcjkyODdNb2Rlc19yeF9nYWluXzkyODdfMV8xLAogCQlBUlJBWV9TSVpFKGFyOTI4N01vZGVzX3J4X2dhaW5fOTI4N18xXzEpLCA2KTsKLQllbHNlIGlmIChBUl9TUkVWXzkyODdfMTAoYWgpKQotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzUnhHYWluLAotCQlhcjkyODdNb2Rlc19yeF9nYWluXzkyODdfMV8wLAotCQlBUlJBWV9TSVpFKGFyOTI4N01vZGVzX3J4X2dhaW5fOTI4N18xXzApLCA2KTsKIAllbHNlIGlmIChBUl9TUkVWXzkyODBfMjAoYWgpKQogCQlhcjkyODBfMjBfaHdfaW5pdF9yeGdhaW5faW5pKGFoKTsKIApAQCAtMzExLDEwICsyNzcsNiBAQAogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAogCQlhcjkyODdNb2Rlc190eF9nYWluXzkyODdfMV8xLAogCQlBUlJBWV9TSVpFKGFyOTI4N01vZGVzX3R4X2dhaW5fOTI4N18xXzEpLCA2KTsKLQl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4N18xMChhaCkpIHsKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKLQkJYXI5Mjg3TW9kZXNfdHhfZ2Fpbl85Mjg3XzFfMCwKLQkJQVJSQVlfU0laRShhcjkyODdNb2Rlc190eF9nYWluXzkyODdfMV8wKSwgNik7CiAJfSBlbHNlIGlmIChBUl9TUkVWXzkyODBfMjAoYWgpKSB7CiAJCWFyOTI4MF8yMF9od19pbml0X3R4Z2Fpbl9pbmkoYWgpOwogCX0gZWxzZSBpZiAoQVJfU1JFVl85Mjg1XzEyX09SX0xBVEVSKGFoKSkgewpAQCAtMzg0LDI5ICszNDYsNiBAQAogCQkJCVJFR19XUklURShhaCwgSU5JX1JBKCZhaC0+aW5pUGNpZVNlcmRlcywgaSwgMCksCiAJCQkJCSAgSU5JX1JBKCZhaC0+aW5pUGNpZVNlcmRlcywgaSwgMSkpOwogCQkJfQotCQl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4MChhaCkgJiYKLQkJCSAgIChhaC0+aHdfdmVyc2lvbi5tYWNSZXYgPT0gQVJfU1JFVl9SRVZJU0lPTl85MjgwXzEwKSkgewotCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg5MjQ4ZmQwMCk7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDI0OTI0OTI0KTsKLQotCQkJLyogUlggc2h1dCBvZmYgd2hlbiBlbGVjaWRsZSBpcyBhc3NlcnRlZCAqLwotCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHhhODAwMDAxOSk7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDEzMTYwODIwKTsKLQkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4ZTU5ODA1NjApOwotCi0JCQkvKiBTaHV0IG9mZiBDTEtSRVEgYWN0aXZlIGluIEwxICovCi0JCQlpZiAoYWgtPmNvbmZpZy5wY2llX2Nsb2NrX3JlcSkKLQkJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDQwMWRlZmZjKTsKLQkJCWVsc2UKLQkJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDQwMWRlZmZkKTsKLQotCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHgxYWFhYmU0MCk7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweGJlMTA1NTU0KTsKLQkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MDAwNDMwMDcpOwotCi0JCQkvKiBMb2FkIHRoZSBuZXcgc2V0dGluZ3MgKi8KLQkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMyLCAweDAwMDAwMDAwKTsKLQogCQl9IGVsc2UgewogCQkJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CiAKQEAgLTQzNiw1NSArMzc1LDg0IEBACiAJCX0KIAogCQl1ZGVsYXkoMTAwMCk7CisJfQogCi0JCS8qIHNldCBiaXQgMTkgdG8gYWxsb3cgZm9yY2luZyBvZiBwY2llIGNvcmUgaW50byBMMSBzdGF0ZSAqLwotCQlSRUdfU0VUX0JJVChhaCwgQVJfUENJRV9QTV9DVFJMLCBBUl9QQ0lFX1BNX0NUUkxfRU5BKTsKKwlpZiAocG93ZXJfb2ZmKSB7CisJCS8qIGNsZWFyIGJpdCAxOSB0byBkaXNhYmxlIEwxICovCisJCVJFR19DTFJfQklUKGFoLCBBUl9QQ0lFX1BNX0NUUkwsIEFSX1BDSUVfUE1fQ1RSTF9FTkEpOwogCi0JCS8qIFNldmVyYWwgUENJZSBtYXNzYWdlcyB0byBlbnN1cmUgcHJvcGVyIGJlaGF2aW91ciAqLworCQl2YWwgPSBSRUdfUkVBRChhaCwgQVJfV0EpOworCisJCS8qCisJCSAqIFNldCBQQ0llIHdvcmthcm91bmQgYml0cworCQkgKiBJbiBBUjkyODAgYW5kIEFSOTI4NSwgYml0IDE0IGluIFdBIHJlZ2lzdGVyIChkaXNhYmxlIEwxKQorCQkgKiBzaG91bGQgb25seSAgYmUgc2V0IHdoZW4gZGV2aWNlIGVudGVycyBEMyBhbmQgYmUKKwkJICogY2xlYXJlZCB3aGVuIGRldmljZSBjb21lcyBiYWNrIHRvIEQwLgorCQkgKi8KKwkJaWYgKGFoLT5jb25maWcucGNpZV93YWVuKSB7CisJCQlpZiAoYWgtPmNvbmZpZy5wY2llX3dhZW4gJiBBUl9XQV9EM19MMV9ESVNBQkxFKQorCQkJCXZhbCB8PSBBUl9XQV9EM19MMV9ESVNBQkxFOworCQl9IGVsc2UgeworCQkJaWYgKCgoQVJfU1JFVl85Mjg1KGFoKSB8fAorCQkJICAgICAgQVJfU1JFVl85MjcxKGFoKSB8fAorCQkJICAgICAgQVJfU1JFVl85Mjg3KGFoKSkgJiYKKwkJCSAgICAgKEFSOTI4NV9XQV9ERUZBVUxUICYgQVJfV0FfRDNfTDFfRElTQUJMRSkpIHx8CisJCQkgICAgKEFSX1NSRVZfOTI4MChhaCkgJiYKKwkJCSAgICAgKEFSOTI4MF9XQV9ERUZBVUxUICYgQVJfV0FfRDNfTDFfRElTQUJMRSkpKSB7CisJCQkJdmFsIHw9IEFSX1dBX0QzX0wxX0RJU0FCTEU7CisJCQl9CisJCX0KKworCQlpZiAoQVJfU1JFVl85MjgwKGFoKSB8fCBBUl9TUkVWXzkyODUoYWgpIHx8IEFSX1NSRVZfOTI4NyhhaCkpIHsKKwkJCS8qCisJCQkgKiBEaXNhYmxlIGJpdCA2IGFuZCA3IGJlZm9yZSBlbnRlcmluZyBEMyB0bworCQkJICogcHJldmVudCBzeXN0ZW0gaGFuZy4KKwkJCSAqLworCQkJdmFsICY9IH4oQVJfV0FfQklUNiB8IEFSX1dBX0JJVDcpOworCQl9CisKKwkJaWYgKEFSX1NSRVZfOTI4NUVfMjAoYWgpKQorCQkJdmFsIHw9IEFSX1dBX0JJVDIzOworCisJCVJFR19XUklURShhaCwgQVJfV0EsIHZhbCk7CisJfSBlbHNlIHsKIAkJaWYgKGFoLT5jb25maWcucGNpZV93YWVuKSB7CiAJCQl2YWwgPSBhaC0+Y29uZmlnLnBjaWVfd2FlbjsKIAkJCWlmICghcG93ZXJfb2ZmKQogCQkJCXZhbCAmPSAofkFSX1dBX0QzX0wxX0RJU0FCTEUpOwogCQl9IGVsc2UgewotCQkJaWYgKEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85MjcxKGFoKSB8fAorCQkJaWYgKEFSX1NSRVZfOTI4NShhaCkgfHwKKwkJCSAgICBBUl9TUkVWXzkyNzEoYWgpIHx8CiAJCQkgICAgQVJfU1JFVl85Mjg3KGFoKSkgewogCQkJCXZhbCA9IEFSOTI4NV9XQV9ERUZBVUxUOwogCQkJCWlmICghcG93ZXJfb2ZmKQogCQkJCQl2YWwgJj0gKH5BUl9XQV9EM19MMV9ESVNBQkxFKTsKLQkJCX0gZWxzZSBpZiAoQVJfU1JFVl85MjgwKGFoKSkgeworCQkJfQorCQkJZWxzZSBpZiAoQVJfU1JFVl85MjgwKGFoKSkgewogCQkJCS8qCi0JCQkJICogT24gQVI5MjgwIGNoaXBzIGJpdCAyMiBvZiAweDQwMDQgbmVlZHMgdG8gYmUKLQkJCQkgKiBzZXQgb3RoZXJ3aXNlIGNhcmQgbWF5IGRpc2FwcGVhci4KKwkJCQkgKiBGb3IgQVI5MjgwIGNoaXBzLCBiaXQgMjIgb2YgMHg0MDA0CisJCQkJICogbmVlZHMgdG8gYmUgc2V0LgogCQkJCSAqLwogCQkJCXZhbCA9IEFSOTI4MF9XQV9ERUZBVUxUOwogCQkJCWlmICghcG93ZXJfb2ZmKQogCQkJCQl2YWwgJj0gKH5BUl9XQV9EM19MMV9ESVNBQkxFKTsKLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKIAkJCQl2YWwgPSBBUl9XQV9ERUZBVUxUOwotCQl9Ci0KLQkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgdmFsKTsKLQl9Ci0KLQlpZiAocG93ZXJfb2ZmKSB7Ci0JCS8qCi0JCSAqIFNldCBQQ0llIHdvcmthcm91bmQgYml0cwotCQkgKiBiaXQgMTQgaW4gV0EgcmVnaXN0ZXIgKGRpc2FibGUgTDEpIHNob3VsZCBvbmx5Ci0JCSAqIGJlIHNldCB3aGVuIGRldmljZSBlbnRlcnMgRDMgYW5kIGJlIGNsZWFyZWQKLQkJICogd2hlbiBkZXZpY2UgY29tZXMgYmFjayB0byBEMC4KLQkJICovCi0JCWlmIChhaC0+Y29uZmlnLnBjaWVfd2FlbikgewotCQkJaWYgKGFoLT5jb25maWcucGNpZV93YWVuICYgQVJfV0FfRDNfTDFfRElTQUJMRSkKLQkJCQlSRUdfU0VUX0JJVChhaCwgQVJfV0EsIEFSX1dBX0QzX0wxX0RJU0FCTEUpOwotCQl9IGVsc2UgewotCQkJaWYgKCgoQVJfU1JFVl85Mjg1KGFoKSB8fCBBUl9TUkVWXzkyNzEoYWgpIHx8Ci0JCQkgICAgICBBUl9TUkVWXzkyODcoYWgpKSAmJgotCQkJICAgICAoQVI5Mjg1X1dBX0RFRkFVTFQgJiBBUl9XQV9EM19MMV9ESVNBQkxFKSkgfHwKLQkJCSAgICAoQVJfU1JFVl85MjgwKGFoKSAmJgotCQkJICAgICAoQVI5MjgwX1dBX0RFRkFVTFQgJiBBUl9XQV9EM19MMV9ESVNBQkxFKSkpIHsKLQkJCQlSRUdfU0VUX0JJVChhaCwgQVJfV0EsIEFSX1dBX0QzX0wxX0RJU0FCTEUpOwogCQkJfQogCQl9CisKKwkJLyogV0FSIGZvciBBU1BNIHN5c3RlbSBoYW5nICovCisJCWlmIChBUl9TUkVWXzkyODAoYWgpIHx8IEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85Mjg3KGFoKSkgeworCQkJdmFsIHw9IChBUl9XQV9CSVQ2IHwgQVJfV0FfQklUNyk7CisJCX0KKworCQlpZiAoQVJfU1JFVl85Mjg1RV8yMChhaCkpCisJCQl2YWwgfD0gQVJfV0FfQklUMjM7CisKKwkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgdmFsKTsKKworCQkvKiBzZXQgYml0IDE5IHRvIGFsbG93IGZvcmNpbmcgb2YgcGNpZSBjb3JlIGludG8gTDEgc3RhdGUgKi8KKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BDSUVfUE1fQ1RSTCwgQVJfUENJRV9QTV9DVFJMX0VOQSk7CiAJfQogfQogCkBAIC01MzYsMTggKzUwNCwyOSBAQAogCXJldHVybiAwOwogfQogCit2b2lkIGFyOTAwMl9od19lbmFibGVfYXN5bmNfZmlmbyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlpZiAoQVJfU1JFVl85Mjg3XzEzX09SX0xBVEVSKGFoKSkgeworCQlSRUdfU0VUX0JJVChhaCwgQVJfTUFDX1BDVV9BU1lOQ19GSUZPX1JFRzMsCisJCQkJQVJfTUFDX1BDVV9BU1lOQ19GSUZPX1JFRzNfREFUQVBBVEhfU0VMKTsKKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9NT0RFLCBBUl9QSFlfTU9ERV9BU1lOQ0ZJRk8pOworCQlSRUdfQ0xSX0JJVChhaCwgQVJfTUFDX1BDVV9BU1lOQ19GSUZPX1JFRzMsCisJCQkJQVJfTUFDX1BDVV9BU1lOQ19GSUZPX1JFRzNfU09GVF9SRVNFVCk7CisJCVJFR19TRVRfQklUKGFoLCBBUl9NQUNfUENVX0FTWU5DX0ZJRk9fUkVHMywKKwkJCQlBUl9NQUNfUENVX0FTWU5DX0ZJRk9fUkVHM19TT0ZUX1JFU0VUKTsKKwl9Cit9CisKIC8qCi0gKiBFbmFibGUgQVNZTkMgRklGTwotICoKICAqIElmIEFzeW5jIEZJRk8gaXMgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBjb3VudGVycyBjaGFuZ2UgYXMgTUFDIG5vdyBydW5zCiAgKiBhdCAxMTcgTWh6IGluc3RlYWQgb2YgODgvNDRNSHogd2hlbiBhc3luYyBGSUZPIGlzIGRpc2FibGVkLgogICoKICAqIFRoZSB2YWx1ZXMgYmVsb3cgdGVzdGVkIGZvciBodDQwIDIgY2hhaW4uCiAgKiBPdmVyd3JpdGUgdGhlIGRlbGF5L3RpbWVvdXRzIGluaXRpYWxpemVkIGluIHByb2Nlc3MgaW5pLgogICovCi12b2lkIGFyOTAwMl9od19lbmFibGVfYXN5bmNfZmlmbyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3ZvaWQgYXI5MDAyX2h3X3VwZGF0ZV9hc3luY19maWZvKHN0cnVjdCBhdGhfaHcgKmFoKQogewotCWlmIChBUl9TUkVWXzkyODdfMTJfT1JfTEFURVIoYWgpKSB7CisJaWYgKEFSX1NSRVZfOTI4N18xM19PUl9MQVRFUihhaCkpIHsKIAkJUkVHX1dSSVRFKGFoLCBBUl9EX0dCTF9JRlNfU0lGUywKIAkJCSAgQVJfRF9HQkxfSUZTX1NJRlNfQVNZTkNfRklGT19EVVIpOwogCQlSRUdfV1JJVEUoYWgsIEFSX0RfR0JMX0lGU19TTE9ULApAQCAtNTcxLDkgKzU1MCw5IEBACiAgKi8KIHZvaWQgYXI5MDAyX2h3X2VuYWJsZV93ZXBfYWdncmVnYXRpb24oc3RydWN0IGF0aF9odyAqYWgpCiB7Ci0JaWYgKEFSX1NSRVZfOTI4N18xMl9PUl9MQVRFUihhaCkpIHsKKwlpZiAoQVJfU1JFVl85Mjg3XzEzX09SX0xBVEVSKGFoKSkgewogCQlSRUdfU0VUX0JJVChhaCwgQVJfUENVX01JU0NfTU9ERTIsCi0JCQkJQVJfUENVX01JU0NfTU9ERTJfRU5BQkxFX0FHR1dFUCk7CisJCQkgICAgQVJfUENVX01JU0NfTU9ERTJfRU5BQkxFX0FHR1dFUCk7CiAJfQogfQogCkBAIC01OTUsNCArNTc0LDkgQEAKIAogCWFyOTAwMl9od19hdHRhY2hfY2FsaWJfb3BzKGFoKTsKIAlhcjkwMDJfaHdfYXR0YWNoX21hY19vcHMoYWgpOworCisJaWYgKG1vZHBhcmFtX2ZvcmNlX25ld19hbmkpCisJCWF0aDlrX2h3X2F0dGFjaF9hbmlfb3BzX25ldyhhaCk7CisJZWxzZQorCQlhdGg5a19od19hdHRhY2hfYW5pX29wc19vbGQoYWgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9pbml0dmFscy5oCmluZGV4IGRhZTdmMzMuLjYyMDNlZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2luaXR2YWxzLmgKQEAgLTE0LDUyMTcgKzE0LDMyNTIgQEAKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotI2lmbmRlZiBJTklUVkFMU185MDAyXzEwX0gKLSNkZWZpbmUgSU5JVFZBTFNfOTAwMl8xMF9ICi0KLXN0YXRpYyBjb25zdCB1MzIgYXI5MjgwTW9kZXNfOTI4MFtdWzZdID0gewotICAgIHsgMHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4YywgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTBiMCwgMHgwMDAwMGU2MCwgMHgwMDAwMWNjMCwgMHgwMDAwN2M3MCwgMHgwMDAwM2UzOCwgMHgwMDAwMTE4MCB9LAotICAgIHsgMHgwMDAwMTBmMCwgMHgwMDAwYTAwMCwgMHgwMDAxNDAwMCwgMHgwMDAxNjAwMCwgMHgwMDAwYjAwMCwgMHgwMDAxNDAwOCB9LAotICAgIHsgMHgwMDAwODAxNCwgMHgwM2U4MDNlOCwgMHgwN2QwMDdkMCwgMHgxMDgwMTA4MCwgMHgwODQwMDg0MCwgMHgwNmUwMDZlMCB9LAotICAgIHsgMHgwMDAwODAxYywgMHgxMjhkODAyNywgMHgxMjhkODA0ZiwgMHgxMmUwMDA1NywgMHgxMmUwMDAyYiwgMHgwOTg4MDA0ZiB9LAotICAgIHsgMHgwMDAwOTgwNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMyB9LAotICAgIHsgMHgwMDAwOTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCB9LAotICAgIHsgMHgwMDAwOTgyNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgyOCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSB9LAotICAgIHsgMHgwMDAwOTgzNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNyB9LAotICAgIHsgMHgwMDAwOTg0NCwgMHgxMzcyMTYxZSwgMHgxMzcyMTYxZSwgMHgxMzcyMTZhMCwgMHgxMzcyMTZhMCwgMHgxMzcyMTZhMCB9LAotICAgIHsgMHgwMDAwOTg0OCwgMHgwMDAyODU2NiwgMHgwMDAyODU2NiwgMHgwMDAyODU2MywgMHgwMDAyODU2MywgMHgwMDAyODU2MyB9LAotICAgIHsgMHgwMDAwYTg0OCwgMHgwMDAyODU2NiwgMHgwMDAyODU2NiwgMHgwMDAyODU2MywgMHgwMDAyODU2MywgMHgwMDAyODU2MyB9LAotICAgIHsgMHgwMDAwOTg1MCwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiB9LAotICAgIHsgMHgwMDAwOTg1OCwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSwgMHg3ZWM4MmQyZSB9LAotICAgIHsgMHgwMDAwOTg1YywgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSB9LAotICAgIHsgMHgwMDAwOTg2MCwgMHgwMDA0OWQxOCwgMHgwMDA0OWQxOCwgMHgwMDA0OWQyMCwgMHgwMDA0OWQyMCwgMHgwMDA0OWQxOCB9LAotICAgIHsgMHgwMDAwYzg2NCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCB9LAotICAgIHsgMHgwMDAwOTg2OCwgMHg1YWM2NDE5MCwgMHg1YWM2NDE5MCwgMHg1YWM2NDE5MCwgMHg1YWM2NDE5MCwgMHg1YWM2NDE5MCB9LAotICAgIHsgMHgwMDAwOTg2YywgMHgwNjkwMzA4MSwgMHgwNjkwMzA4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MSB9LAotICAgIHsgMHgwMDAwOTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMDdkMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMCB9LAotICAgIHsgMHgwMDAwOTkxOCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNiB9LAotICAgIHsgMHgwMDAwOTkyNCwgMHhkMDBhOGEwNywgMHhkMDBhOGEwNywgMHhkMDBhOGEwZCwgMHhkMDBhOGEwZCwgMHhkMDBhOGEwZCB9LAotICAgIHsgMHgwMDAwOTk0NCwgMHhkZmJjMTAxMCwgMHhkZmJjMTAxMCwgMHhkZmJjMTAxMCwgMHhkZmJjMTAxMCwgMHhkZmJjMTAxMCB9LAotICAgIHsgMHgwMDAwOTk2MCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwYTk2MCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwOTk2NCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCB9LAotICAgIHsgMHgwMDAwYzliOCwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSB9LAotICAgIHsgMHgwMDAwYzliYywgMHgwMDAwMDYwMCwgMHgwMDAwMDYwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCB9LAotICAgIHsgMHgwMDAwOTljMCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCB9LAotICAgIHsgMHgwMDAwOTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NyB9LAotICAgIHsgMHgwMDAwOTljOCwgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYyB9LAotICAgIHsgMHgwMDAwOTljYywgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCB9LAotICAgIHsgMHgwMDAwOTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCB9LAotICAgIHsgMHgwMDAwOTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwMCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NCwgMHgwMDAwMDIxNCwgMHgwMDAwMDIxNCwgMHgwMDAwMDIxNCB9LAotICAgIHsgMHgwMDAwOWEwNCwgMHgwMDAwODE4OCwgMHgwMDAwODE4OCwgMHgwMDAwMDIxOCwgMHgwMDAwMDIxOCwgMHgwMDAwMDIxOCB9LAotICAgIHsgMHgwMDAwOWEwOCwgMHgwMDAwODE4YywgMHgwMDAwODE4YywgMHgwMDAwMDIyNCwgMHgwMDAwMDIyNCwgMHgwMDAwMDIyNCB9LAotICAgIHsgMHgwMDAwOWEwYywgMHgwMDAwODE5MCwgMHgwMDAwODE5MCwgMHgwMDAwMDIyOCwgMHgwMDAwMDIyOCwgMHgwMDAwMDIyOCB9LAotICAgIHsgMHgwMDAwOWExMCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCwgMHgwMDAwMDIyYywgMHgwMDAwMDIyYywgMHgwMDAwMDIyYyB9LAotICAgIHsgMHgwMDAwOWExNCwgMHgwMDAwODIwMCwgMHgwMDAwODIwMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDIzMCB9LAotICAgIHsgMHgwMDAwOWExOCwgMHgwMDAwODIwNCwgMHgwMDAwODIwNCwgMHgwMDAwMDJhNCwgMHgwMDAwMDJhNCwgMHgwMDAwMDJhNCB9LAotICAgIHsgMHgwMDAwOWExYywgMHgwMDAwODIwOCwgMHgwMDAwODIwOCwgMHgwMDAwMDJhOCwgMHgwMDAwMDJhOCwgMHgwMDAwMDJhOCB9LAotICAgIHsgMHgwMDAwOWEyMCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwMDJhYywgMHgwMDAwMDJhYywgMHgwMDAwMDJhYyB9LAotICAgIHsgMHgwMDAwOWEyNCwgMHgwMDAwODIxMCwgMHgwMDAwODIxMCwgMHgwMDAwMDJiMCwgMHgwMDAwMDJiMCwgMHgwMDAwMDJiMCB9LAotICAgIHsgMHgwMDAwOWEyOCwgMHgwMDAwODIxNCwgMHgwMDAwODIxNCwgMHgwMDAwMDJiNCwgMHgwMDAwMDJiNCwgMHgwMDAwMDJiNCB9LAotICAgIHsgMHgwMDAwOWEyYywgMHgwMDAwODI4MCwgMHgwMDAwODI4MCwgMHgwMDAwMDJiOCwgMHgwMDAwMDJiOCwgMHgwMDAwMDJiOCB9LAotICAgIHsgMHgwMDAwOWEzMCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCwgMHgwMDAwMDM5MCwgMHgwMDAwMDM5MCwgMHgwMDAwMDM5MCB9LAotICAgIHsgMHgwMDAwOWEzNCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwMDM5NCwgMHgwMDAwMDM5NCwgMHgwMDAwMDM5NCB9LAotICAgIHsgMHgwMDAwOWEzOCwgMHgwMDAwODI4YywgMHgwMDAwODI4YywgMHgwMDAwMDM5OCwgMHgwMDAwMDM5OCwgMHgwMDAwMDM5OCB9LAotICAgIHsgMHgwMDAwOWEzYywgMHgwMDAwODI5MCwgMHgwMDAwODI5MCwgMHgwMDAwMDMzNCwgMHgwMDAwMDMzNCwgMHgwMDAwMDMzNCB9LAotICAgIHsgMHgwMDAwOWE0MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwMDMzOCwgMHgwMDAwMDMzOCwgMHgwMDAwMDMzOCB9LAotICAgIHsgMHgwMDAwOWE0NCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCwgMHgwMDAwMDNhYywgMHgwMDAwMDNhYywgMHgwMDAwMDNhYyB9LAotICAgIHsgMHgwMDAwOWE0OCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCwgMHgwMDAwMDNiMCwgMHgwMDAwMDNiMCwgMHgwMDAwMDNiMCB9LAotICAgIHsgMHgwMDAwOWE0YywgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwMDNiNCwgMHgwMDAwMDNiNCwgMHgwMDAwMDNiNCB9LAotICAgIHsgMHgwMDAwOWE1MCwgMHgwMDAwODMxMCwgMHgwMDAwODMxMCwgMHgwMDAwMDNiOCwgMHgwMDAwMDNiOCwgMHgwMDAwMDNiOCB9LAotICAgIHsgMHgwMDAwOWE1NCwgMHgwMDAwODMxNCwgMHgwMDAwODMxNCwgMHgwMDAwMDNhNSwgMHgwMDAwMDNhNSwgMHgwMDAwMDNhNSB9LAotICAgIHsgMHgwMDAwOWE1OCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCwgMHgwMDAwMDNhOSwgMHgwMDAwMDNhOSwgMHgwMDAwMDNhOSB9LAotICAgIHsgMHgwMDAwOWE1YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwMDNhZCwgMHgwMDAwMDNhZCwgMHgwMDAwMDNhZCB9LAotICAgIHsgMHgwMDAwOWE2MCwgMHgwMDAwODM4OCwgMHgwMDAwODM4OCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCB9LAotICAgIHsgMHgwMDAwOWE2NCwgMHgwMDAwODM4YywgMHgwMDAwODM4YywgMHgwMDAwODFhMCwgMHgwMDAwODFhMCwgMHgwMDAwODFhMCB9LAotICAgIHsgMHgwMDAwOWE2OCwgMHgwMDAwODM5MCwgMHgwMDAwODM5MCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODIwYyB9LAotICAgIHsgMHgwMDAwOWE2YywgMHgwMDAwODM5NCwgMHgwMDAwODM5NCwgMHgwMDAwODFhOCwgMHgwMDAwODFhOCwgMHgwMDAwODFhOCB9LAotICAgIHsgMHgwMDAwOWE3MCwgMHgwMDAwYTM4MCwgMHgwMDAwYTM4MCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCB9LAotICAgIHsgMHgwMDAwOWE3NCwgMHgwMDAwYTM4NCwgMHgwMDAwYTM4NCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCB9LAotICAgIHsgMHgwMDAwOWE3OCwgMHgwMDAwYTM4OCwgMHgwMDAwYTM4OCwgMHgwMDAwODIyNCwgMHgwMDAwODIyNCwgMHgwMDAwODIyNCB9LAotICAgIHsgMHgwMDAwOWE3YywgMHgwMDAwYTM4YywgMHgwMDAwYTM4YywgMHgwMDAwODI5MCwgMHgwMDAwODI5MCwgMHgwMDAwODI5MCB9LAotICAgIHsgMHgwMDAwOWE4MCwgMHgwMDAwYTM5MCwgMHgwMDAwYTM5MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCB9LAotICAgIHsgMHgwMDAwOWE4NCwgMHgwMDAwYTM5NCwgMHgwMDAwYTM5NCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCB9LAotICAgIHsgMHgwMDAwOWE4OCwgMHgwMDAwYTc4MCwgMHgwMDAwYTc4MCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCB9LAotICAgIHsgMHgwMDAwOWE4YywgMHgwMDAwYTc4NCwgMHgwMDAwYTc4NCwgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwODMwYyB9LAotICAgIHsgMHgwMDAwOWE5MCwgMHgwMDAwYTc4OCwgMHgwMDAwYTc4OCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCB9LAotICAgIHsgMHgwMDAwOWE5NCwgMHgwMDAwYTc4YywgMHgwMDAwYTc4YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwODM4NCB9LAotICAgIHsgMHgwMDAwOWE5OCwgMHgwMDAwYTc5MCwgMHgwMDAwYTc5MCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMCB9LAotICAgIHsgMHgwMDAwOWE5YywgMHgwMDAwYTc5NCwgMHgwMDAwYTc5NCwgMHgwMDAwODcwNCwgMHgwMDAwODcwNCwgMHgwMDAwODcwNCB9LAotICAgIHsgMHgwMDAwOWFhMCwgMHgwMDAwYWI4NCwgMHgwMDAwYWI4NCwgMHgwMDAwODcwOCwgMHgwMDAwODcwOCwgMHgwMDAwODcwOCB9LAotICAgIHsgMHgwMDAwOWFhNCwgMHgwMDAwYWI4OCwgMHgwMDAwYWI4OCwgMHgwMDAwODcwYywgMHgwMDAwODcwYywgMHgwMDAwODcwYyB9LAotICAgIHsgMHgwMDAwOWFhOCwgMHgwMDAwYWI4YywgMHgwMDAwYWI4YywgMHgwMDAwODc4MCwgMHgwMDAwODc4MCwgMHgwMDAwODc4MCB9LAotICAgIHsgMHgwMDAwOWFhYywgMHgwMDAwYWI5MCwgMHgwMDAwYWI5MCwgMHgwMDAwODc4NCwgMHgwMDAwODc4NCwgMHgwMDAwODc4NCB9LAotICAgIHsgMHgwMDAwOWFiMCwgMHgwMDAwYWI5NCwgMHgwMDAwYWI5NCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMCB9LAotICAgIHsgMHgwMDAwOWFiNCwgMHgwMDAwYWY4MCwgMHgwMDAwYWY4MCwgMHgwMDAwOGIwNCwgMHgwMDAwOGIwNCwgMHgwMDAwOGIwNCB9LAotICAgIHsgMHgwMDAwOWFiOCwgMHgwMDAwYWY4NCwgMHgwMDAwYWY4NCwgMHgwMDAwOGIwOCwgMHgwMDAwOGIwOCwgMHgwMDAwOGIwOCB9LAotICAgIHsgMHgwMDAwOWFiYywgMHgwMDAwYWY4OCwgMHgwMDAwYWY4OCwgMHgwMDAwOGIwYywgMHgwMDAwOGIwYywgMHgwMDAwOGIwYyB9LAotICAgIHsgMHgwMDAwOWFjMCwgMHgwMDAwYWY4YywgMHgwMDAwYWY4YywgMHgwMDAwOGI4MCwgMHgwMDAwOGI4MCwgMHgwMDAwOGI4MCB9LAotICAgIHsgMHgwMDAwOWFjNCwgMHgwMDAwYWY5MCwgMHgwMDAwYWY5MCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NCB9LAotICAgIHsgMHgwMDAwOWFjOCwgMHgwMDAwYWY5NCwgMHgwMDAwYWY5NCwgMHgwMDAwOGI4OCwgMHgwMDAwOGI4OCwgMHgwMDAwOGI4OCB9LAotICAgIHsgMHgwMDAwOWFjYywgMHgwMDAwYjM4MCwgMHgwMDAwYjM4MCwgMHgwMDAwOGI4YywgMHgwMDAwOGI4YywgMHgwMDAwOGI4YyB9LAotICAgIHsgMHgwMDAwOWFkMCwgMHgwMDAwYjM4NCwgMHgwMDAwYjM4NCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MCB9LAotICAgIHsgMHgwMDAwOWFkNCwgMHgwMDAwYjM4OCwgMHgwMDAwYjM4OCwgMHgwMDAwOGY4MCwgMHgwMDAwOGY4MCwgMHgwMDAwOGY4MCB9LAotICAgIHsgMHgwMDAwOWFkOCwgMHgwMDAwYjM4YywgMHgwMDAwYjM4YywgMHgwMDAwOGY4NCwgMHgwMDAwOGY4NCwgMHgwMDAwOGY4NCB9LAotICAgIHsgMHgwMDAwOWFkYywgMHgwMDAwYjM5MCwgMHgwMDAwYjM5MCwgMHgwMDAwOGY4OCwgMHgwMDAwOGY4OCwgMHgwMDAwOGY4OCB9LAotICAgIHsgMHgwMDAwOWFlMCwgMHgwMDAwYjM5NCwgMHgwMDAwYjM5NCwgMHgwMDAwOGY4YywgMHgwMDAwOGY4YywgMHgwMDAwOGY4YyB9LAotICAgIHsgMHgwMDAwOWFlNCwgMHgwMDAwYjM5OCwgMHgwMDAwYjM5OCwgMHgwMDAwOGY5MCwgMHgwMDAwOGY5MCwgMHgwMDAwOGY5MCB9LAotICAgIHsgMHgwMDAwOWFlOCwgMHgwMDAwYjc4MCwgMHgwMDAwYjc4MCwgMHgwMDAwOTMwYywgMHgwMDAwOTMwYywgMHgwMDAwOTMwYyB9LAotICAgIHsgMHgwMDAwOWFlYywgMHgwMDAwYjc4NCwgMHgwMDAwYjc4NCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMCB9LAotICAgIHsgMHgwMDAwOWFmMCwgMHgwMDAwYjc4OCwgMHgwMDAwYjc4OCwgMHgwMDAwOTM4NCwgMHgwMDAwOTM4NCwgMHgwMDAwOTM4NCB9LAotICAgIHsgMHgwMDAwOWFmNCwgMHgwMDAwYjc4YywgMHgwMDAwYjc4YywgMHgwMDAwOTM4OCwgMHgwMDAwOTM4OCwgMHgwMDAwOTM4OCB9LAotICAgIHsgMHgwMDAwOWFmOCwgMHgwMDAwYjc5MCwgMHgwMDAwYjc5MCwgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNCB9LAotICAgIHsgMHgwMDAwOWFmYywgMHgwMDAwYjc5NCwgMHgwMDAwYjc5NCwgMHgwMDAwOTcwNCwgMHgwMDAwOTcwNCwgMHgwMDAwOTcwNCB9LAotICAgIHsgMHgwMDAwOWIwMCwgMHgwMDAwYjc5OCwgMHgwMDAwYjc5OCwgMHgwMDAwOTZhNCwgMHgwMDAwOTZhNCwgMHgwMDAwOTZhNCB9LAotICAgIHsgMHgwMDAwOWIwNCwgMHgwMDAwZDc4NCwgMHgwMDAwZDc4NCwgMHgwMDAwOTZhOCwgMHgwMDAwOTZhOCwgMHgwMDAwOTZhOCB9LAotICAgIHsgMHgwMDAwOWIwOCwgMHgwMDAwZDc4OCwgMHgwMDAwZDc4OCwgMHgwMDAwOTcxMCwgMHgwMDAwOTcxMCwgMHgwMDAwOTcxMCB9LAotICAgIHsgMHgwMDAwOWIwYywgMHgwMDAwZDc4YywgMHgwMDAwZDc4YywgMHgwMDAwOTcxNCwgMHgwMDAwOTcxNCwgMHgwMDAwOTcxNCB9LAotICAgIHsgMHgwMDAwOWIxMCwgMHgwMDAwZDc5MCwgMHgwMDAwZDc5MCwgMHgwMDAwOTcyMCwgMHgwMDAwOTcyMCwgMHgwMDAwOTcyMCB9LAotICAgIHsgMHgwMDAwOWIxNCwgMHgwMDAwZjc4MCwgMHgwMDAwZjc4MCwgMHgwMDAwOTcyNCwgMHgwMDAwOTcyNCwgMHgwMDAwOTcyNCB9LAotICAgIHsgMHgwMDAwOWIxOCwgMHgwMDAwZjc4NCwgMHgwMDAwZjc4NCwgMHgwMDAwOTcyOCwgMHgwMDAwOTcyOCwgMHgwMDAwOTcyOCB9LAotICAgIHsgMHgwMDAwOWIxYywgMHgwMDAwZjc4OCwgMHgwMDAwZjc4OCwgMHgwMDAwOTcyYywgMHgwMDAwOTcyYywgMHgwMDAwOTcyYyB9LAotICAgIHsgMHgwMDAwOWIyMCwgMHgwMDAwZjc4YywgMHgwMDAwZjc4YywgMHgwMDAwOTdhMCwgMHgwMDAwOTdhMCwgMHgwMDAwOTdhMCB9LAotICAgIHsgMHgwMDAwOWIyNCwgMHgwMDAwZjc5MCwgMHgwMDAwZjc5MCwgMHgwMDAwOTdhNCwgMHgwMDAwOTdhNCwgMHgwMDAwOTdhNCB9LAotICAgIHsgMHgwMDAwOWIyOCwgMHgwMDAwZjc5NCwgMHgwMDAwZjc5NCwgMHgwMDAwOTdhOCwgMHgwMDAwOTdhOCwgMHgwMDAwOTdhOCB9LAotICAgIHsgMHgwMDAwOWIyYywgMHgwMDAwZjdhNCwgMHgwMDAwZjdhNCwgMHgwMDAwOTdiMCwgMHgwMDAwOTdiMCwgMHgwMDAwOTdiMCB9LAotICAgIHsgMHgwMDAwOWIzMCwgMHgwMDAwZjdhOCwgMHgwMDAwZjdhOCwgMHgwMDAwOTdiNCwgMHgwMDAwOTdiNCwgMHgwMDAwOTdiNCB9LAotICAgIHsgMHgwMDAwOWIzNCwgMHgwMDAwZjdhYywgMHgwMDAwZjdhYywgMHgwMDAwOTdiOCwgMHgwMDAwOTdiOCwgMHgwMDAwOTdiOCB9LAotICAgIHsgMHgwMDAwOWIzOCwgMHgwMDAwZjdiMCwgMHgwMDAwZjdiMCwgMHgwMDAwOTdhNSwgMHgwMDAwOTdhNSwgMHgwMDAwOTdhNSB9LAotICAgIHsgMHgwMDAwOWIzYywgMHgwMDAwZjdiNCwgMHgwMDAwZjdiNCwgMHgwMDAwOTdhOSwgMHgwMDAwOTdhOSwgMHgwMDAwOTdhOSB9LAotICAgIHsgMHgwMDAwOWI0MCwgMHgwMDAwZjdhMSwgMHgwMDAwZjdhMSwgMHgwMDAwOTdhZCwgMHgwMDAwOTdhZCwgMHgwMDAwOTdhZCB9LAotICAgIHsgMHgwMDAwOWI0NCwgMHgwMDAwZjdhNSwgMHgwMDAwZjdhNSwgMHgwMDAwOTdiMSwgMHgwMDAwOTdiMSwgMHgwMDAwOTdiMSB9LAotICAgIHsgMHgwMDAwOWI0OCwgMHgwMDAwZjdhOSwgMHgwMDAwZjdhOSwgMHgwMDAwOTdiNSwgMHgwMDAwOTdiNSwgMHgwMDAwOTdiNSB9LAotICAgIHsgMHgwMDAwOWI0YywgMHgwMDAwZjdhZCwgMHgwMDAwZjdhZCwgMHgwMDAwOTdiOSwgMHgwMDAwOTdiOSwgMHgwMDAwOTdiOSB9LAotICAgIHsgMHgwMDAwOWI1MCwgMHgwMDAwZjdiMSwgMHgwMDAwZjdiMSwgMHgwMDAwOTdjNSwgMHgwMDAwOTdjNSwgMHgwMDAwOTdjNSB9LAotICAgIHsgMHgwMDAwOWI1NCwgMHgwMDAwZjdiNSwgMHgwMDAwZjdiNSwgMHgwMDAwOTdjOSwgMHgwMDAwOTdjOSwgMHgwMDAwOTdjOSB9LAotICAgIHsgMHgwMDAwOWI1OCwgMHgwMDAwZjdjNSwgMHgwMDAwZjdjNSwgMHgwMDAwOTdkMSwgMHgwMDAwOTdkMSwgMHgwMDAwOTdkMSB9LAotICAgIHsgMHgwMDAwOWI1YywgMHgwMDAwZjdjOSwgMHgwMDAwZjdjOSwgMHgwMDAwOTdkNSwgMHgwMDAwOTdkNSwgMHgwMDAwOTdkNSB9LAotICAgIHsgMHgwMDAwOWI2MCwgMHgwMDAwZjdjZCwgMHgwMDAwZjdjZCwgMHgwMDAwOTdkOSwgMHgwMDAwOTdkOSwgMHgwMDAwOTdkOSB9LAotICAgIHsgMHgwMDAwOWI2NCwgMHgwMDAwZjdkMSwgMHgwMDAwZjdkMSwgMHgwMDAwOTdjNiwgMHgwMDAwOTdjNiwgMHgwMDAwOTdjNiB9LAotICAgIHsgMHgwMDAwOWI2OCwgMHgwMDAwZjdkNSwgMHgwMDAwZjdkNSwgMHgwMDAwOTdjYSwgMHgwMDAwOTdjYSwgMHgwMDAwOTdjYSB9LAotICAgIHsgMHgwMDAwOWI2YywgMHgwMDAwZjdjMiwgMHgwMDAwZjdjMiwgMHgwMDAwOTdjZSwgMHgwMDAwOTdjZSwgMHgwMDAwOTdjZSB9LAotICAgIHsgMHgwMDAwOWI3MCwgMHgwMDAwZjdjNiwgMHgwMDAwZjdjNiwgMHgwMDAwOTdkMiwgMHgwMDAwOTdkMiwgMHgwMDAwOTdkMiB9LAotICAgIHsgMHgwMDAwOWI3NCwgMHgwMDAwZjdjYSwgMHgwMDAwZjdjYSwgMHgwMDAwOTdkNiwgMHgwMDAwOTdkNiwgMHgwMDAwOTdkNiB9LAotICAgIHsgMHgwMDAwOWI3OCwgMHgwMDAwZjdjZSwgMHgwMDAwZjdjZSwgMHgwMDAwOTdjMywgMHgwMDAwOTdjMywgMHgwMDAwOTdjMyB9LAotICAgIHsgMHgwMDAwOWI3YywgMHgwMDAwZjdkMiwgMHgwMDAwZjdkMiwgMHgwMDAwOTdjNywgMHgwMDAwOTdjNywgMHgwMDAwOTdjNyB9LAotICAgIHsgMHgwMDAwOWI4MCwgMHgwMDAwZjdkNiwgMHgwMDAwZjdkNiwgMHgwMDAwOTdjYiwgMHgwMDAwOTdjYiwgMHgwMDAwOTdjYiB9LAotICAgIHsgMHgwMDAwOWI4NCwgMHgwMDAwZjdjMywgMHgwMDAwZjdjMywgMHgwMDAwOTdjZiwgMHgwMDAwOTdjZiwgMHgwMDAwOTdjZiB9LAotICAgIHsgMHgwMDAwOWI4OCwgMHgwMDAwZjdjNywgMHgwMDAwZjdjNywgMHgwMDAwOTdkNywgMHgwMDAwOTdkNywgMHgwMDAwOTdkNyB9LAotICAgIHsgMHgwMDAwOWI4YywgMHgwMDAwZjdjYiwgMHgwMDAwZjdjYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWI5MCwgMHgwMDAwZjdkMywgMHgwMDAwZjdkMywgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWI5NCwgMHgwMDAwZjdkNywgMHgwMDAwZjdkNywgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWI5OCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWI5YywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJhMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJhNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJhOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJhYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJiMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJiNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJiOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJiYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJjMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJjNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJjOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJjYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJkMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJkNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJkOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJkYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJlMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJlNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJlOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJlYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJmMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJmNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJmOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwOWJmYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiB9LAotICAgIHsgMHgwMDAwYTIwNCwgMHgwMDAwMDQ0NCwgMHgwMDAwMDQ0NCwgMHgwMDAwMDQ0NCwgMHgwMDAwMDQ0NCwgMHgwMDAwMDQ0NCB9LAotICAgIHsgMHgwMDAwYTIwOCwgMHg4MDNlNDc4OCwgMHg4MDNlNDc4OCwgMHg4MDNlNDc4OCwgMHg4MDNlNDc4OCwgMHg4MDNlNDc4OCB9LAotICAgIHsgMHgwMDAwYTIwYywgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSB9LAotICAgIHsgMHgwMDAwYjIwYywgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSwgMHgwMDBjNjAxOSB9LAotICAgIHsgMHgwMDAwYTIxYywgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSB9LAotICAgIHsgMHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTE5YzY1MiwgMHgwYTE5YzY1MiwgMHgwYTFhYTY1MiwgMHgwYTFhYTY1MiwgMHgwYTFhYTY1MiB9LAotICAgIHsgMHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHgwMDAwNjAwNCwgMHgwMDAwNjAwNCwgMHgwMDAwODAwOSwgMHgwMDAwODAwOSwgMHgwMDAwODAwOSB9LAotICAgIHsgMHgwMDAwYTMwYywgMHgwMDAwYTAwNiwgMHgwMDAwYTAwNiwgMHgwMDAwYjAwYiwgMHgwMDAwYjAwYiwgMHgwMDAwYjAwYiB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHgwMDAxMTAxNCwgMHgwMDAxMTAxNCwgMHgwMDAxMjA0OCwgMHgwMDAxMjA0OCwgMHgwMDAxMjA0OCB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHgwMDAxNTA0YSwgMHgwMDAxNTA0YSwgMHgwMDAxNjA0YSwgMHgwMDAxNjA0YSwgMHgwMDAxNjA0YSB9LAotICAgIHsgMHgwMDAwYTMxYywgMHgwMDAxOTA0YywgMHgwMDAxOTA0YywgMHgwMDAxYTIxMSwgMHgwMDAxYTIxMSwgMHgwMDAxYTIxMSB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHgwMDAxYzA0ZSwgMHgwMDAxYzA0ZSwgMHgwMDAxZTIxMywgMHgwMDAxZTIxMywgMHgwMDAxZTIxMyB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHgwMDAyMDA5MiwgMHgwMDAyMDA5MiwgMHgwMDAyMTIxYiwgMHgwMDAyMTIxYiwgMHgwMDAyMTIxYiB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAyNDEwYSwgMHgwMDAyNDEwYSwgMHgwMDAyNDQxMiwgMHgwMDAyNDQxMiwgMHgwMDAyNDQxMiB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAyNzEwYywgMHgwMDAyNzEwYywgMHgwMDAyODQxNCwgMHgwMDAyODQxNCwgMHgwMDAyODQxNCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAyYjE4YiwgMHgwMDAyYjE4YiwgMHgwMDAyYjQ0YSwgMHgwMDAyYjQ0YSwgMHgwMDAyYjQ0YSB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAyZTFjYywgMHgwMDAyZTFjYywgMHgwMDAzMDY0OSwgMHgwMDAzMDY0OSwgMHgwMDAzMDY0OSB9LAotICAgIHsgMHgwMDAwYTMzOCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDAzMzY0YiwgMHgwMDAzMzY0YiwgMHgwMDAzMzY0YiB9LAotICAgIHsgMHgwMDAwYTMzYywgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDAzOGE0OSwgMHgwMDAzOGE0OSwgMHgwMDAzOGE0OSB9LAotICAgIHsgMHgwMDAwYTM0MCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDAzYmU0OCwgMHgwMDAzYmU0OCwgMHgwMDAzYmU0OCB9LAotICAgIHsgMHgwMDAwYTM0NCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDAzZWU0YSwgMHgwMDAzZWU0YSwgMHgwMDAzZWU0YSB9LAotICAgIHsgMHgwMDAwYTM0OCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDA0MmU4OCwgMHgwMDA0MmU4OCwgMHgwMDA0MmU4OCB9LAotICAgIHsgMHgwMDAwYTM0YywgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDA0NmU4YSwgMHgwMDA0NmU4YSwgMHgwMDA0NmU4YSB9LAotICAgIHsgMHgwMDAwYTM1MCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDA0OWVjOSwgMHgwMDA0OWVjOSwgMHgwMDA0OWVjOSB9LAotICAgIHsgMHgwMDAwYTM1NCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDA0YmY0MiwgMHgwMDA0YmY0MiwgMHgwMDA0YmY0MiB9LAotICAgIHsgMHgwMDAwNzg0YywgMHgwZTRmMDQ4YywgMHgwZTRmMDQ4YywgMHgwZTRkMDQ4YywgMHgwZTRkMDQ4YywgMHgwZTRkMDQ4YyB9LAotICAgIHsgMHgwMDAwNzg1NCwgMHgxMjAzMTgyOCwgMHgxMjAzMTgyOCwgMHgxMjAzNTgyOCwgMHgxMjAzNTgyOCwgMHgxMjAzNTgyOCB9LAotICAgIHsgMHgwMDAwNzg3MCwgMHg4MDdlYzQwMCwgMHg4MDdlYzQwMCwgMHg4MDdlYzAwMCwgMHg4MDdlYzAwMCwgMHg4MDdlYzAwMCB9LAotICAgIHsgMHgwMDAwNzg4YywgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDExMDAwMCwgMHgwMDExMDAwMCwgMHgwMDExMDAwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkyODBDb21tb25fOTI4MFtdWzJdID0gewotICAgIHsgMHgwMDAwMDAwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDAzMCwgMHgwMDAyMDAxNSB9LAotICAgIHsgMHgwMDAwMDAzNCwgMHgwMDAwMDAwNSB9LAotICAgIHsgMHgwMDAwMDA0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDA0NCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwMDA0OCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwMDA0YywgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwMDA1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDA1NCwgMHgwMDAwMDAxZiB9LAotICAgIHsgMHgwMDAwMDgwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA0MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0OCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0YywgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1OCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1YywgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA2MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA2NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTIzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTAzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTEzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTE3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTIzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTMzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTM3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQ3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTRiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTRmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTUzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTU3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTViOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTVmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTYzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTY3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTZiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTZmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTczOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTc3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTdiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTdmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTAzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTEzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTE3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTIzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTMzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTM3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQ3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNDAzMCwgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNDAzYywgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNDAyNCwgMHgwMDAwMDAxZiB9LAotICAgIHsgMHgwMDAwNzAxMCwgMHgwMDAwMDAzMyB9LAotICAgIHsgMHgwMDAwNzAzOCwgMHgwMDAwMDRjMiB9LAotICAgIHsgMHgwMDAwODAwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAxOCwgMHgwMDAwMDcwMCB9LAotICAgIHsgMHgwMDAwODAyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA0OCwgMHg0MDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1YywgMHgwMDBmYzc4ZiB9LAotICAgIHsgMHgwMDAwODA2MCwgMHgwMDAwMDAwZiB9LAotICAgIHsgMHgwMDAwODA2NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBjMCwgMHgyYTgyMzAxYSB9LAotICAgIHsgMHgwMDAwODBjNCwgMHgwNWRjMDFlMCB9LAotICAgIHsgMHgwMDAwODBjOCwgMHgxZjQwMjcxMCB9LAotICAgIHsgMHgwMDAwODBjYywgMHgwMWY0MDAwMCB9LAotICAgIHsgMHgwMDAwODBkMCwgMHgwMDAwMWUwMCB9LAotICAgIHsgMHgwMDAwODBkNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBkOCwgMHgwMDQwMDAwMCB9LAotICAgIHsgMHgwMDAwODBlMCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODBlNCwgMHgwMDAwZmZmZiB9LAotICAgIHsgMHgwMDAwODBlOCwgMHgwMDNmM2YzZiB9LAotICAgIHsgMHgwMDAwODBlYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmYywgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwODEwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwODEwNCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwODEwOCwgMHgwMDAwMDA1MiB9LAotICAgIHsgMHgwMDAwODEwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODExMCwgMHgwMDAwMDE2OCB9LAotICAgIHsgMHgwMDAwODExOCwgMHgwMDAxMDBhYSB9LAotICAgIHsgMHgwMDAwODExYywgMHgwMDAwMzIxMCB9LAotICAgIHsgMHgwMDAwODEyMCwgMHgwOGYwNDgwMCB9LAotICAgIHsgMHgwMDAwODEyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE0NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE2YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE3MCwgMHgzMjE0MzMyMCB9LAotICAgIHsgMHgwMDAwODE3NCwgMHhmYWE0ZmE1MCB9LAotICAgIHsgMHgwMDAwODE3OCwgMHgwMDAwMDEwMCB9LAotICAgIHsgMHgwMDAwODE3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFjNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFkMCwgMHgwMDAwMzIxMCB9LAotICAgIHsgMHgwMDAwODFlYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI0MCwgMHgwMDEwMDAwMCB9LAotICAgIHsgMHgwMDAwODI0NCwgMHgwMDEwZjQwMCB9LAotICAgIHsgMHgwMDAwODI0OCwgMHgwMDAwMDEwMCB9LAotICAgIHsgMHgwMDAwODI0YywgMHgwMDAxZTgwMCB9LAotICAgIHsgMHgwMDAwODI1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1YywgMHg0MDAwMDBmZiB9LAotICAgIHsgMHgwMDAwODI2MCwgMHgwMDA4MDkyMiB9LAotICAgIHsgMHgwMDAwODI3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI3NCwgMHg0MDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI3OCwgMHgwMDNlNDE4MCB9LAotICAgIHsgMHgwMDAwODI3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI4NCwgMHgwMDAwMDAyYyB9LAotICAgIHsgMHgwMDAwODI4OCwgMHgwMDAwMDAyYyB9LAotICAgIHsgMHgwMDAwODI4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMyYywgMHgwMDAwMDAwNyB9LAotICAgIHsgMHgwMDAwODMzMCwgMHgwMDAwMDMwMiB9LAotICAgIHsgMHgwMDAwODMzNCwgMHgwMDAwMGUwMCB9LAotICAgIHsgMHgwMDAwODMzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM0MCwgMHgwMDAxMDdmZiB9LAotICAgIHsgMHgwMDAwODM0NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgwYywgMHhhZjI2OGUzMCB9LAotICAgIHsgMHgwMDAwOTgxMCwgMHhmZDE0ZTAwMCB9LAotICAgIHsgMHgwMDAwOTgxNCwgMHg5YzBhOWY2YiB9LAotICAgIHsgMHgwMDAwOTgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgyYywgMHgwMDAwYTAwMCB9LAotICAgIHsgMHgwMDAwOTgzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgzYywgMHgwMDIwMDQwMCB9LAotICAgIHsgMHgwMDAwOTg0MCwgMHgyMDZhMDFhZSB9LAotICAgIHsgMHgwMDAwOTg0YywgMHgwMDQwMjMzYyB9LAotICAgIHsgMHgwMDAwYTg0YywgMHgwMDQwMjMzYyB9LAotICAgIHsgMHgwMDAwOTg1NCwgMHgwMDAwMDA0NCB9LAotICAgIHsgMHgwMDAwOTkwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkxYywgMHgxMDAwMGZmZiB9LAotICAgIHsgMHgwMDAwOTkyMCwgMHgwNDkwMDAwMCB9LAotICAgIHsgMHgwMDAwYTkyMCwgMHgwNDkwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkyOCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTkyYywgMHgwMDAwMDAwNCB9LAotICAgIHsgMHgwMDAwOTkzNCwgMHgxZTFmMjAyMiB9LAotICAgIHsgMHgwMDAwOTkzOCwgMHgwYTBiMGMwZCB9LAotICAgIHsgMHgwMDAwOTkzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk0OCwgMHg5MjgwYzAwYSB9LAotICAgIHsgMHgwMDAwOTk0YywgMHgwMDAyMDAyOCB9LAotICAgIHsgMHgwMDAwOTk1NCwgMHhlMjUwYTUxZSB9LAotICAgIHsgMHgwMDAwOTk1OCwgMHgzMzg4ZmZmZiB9LAotICAgIHsgMHgwMDAwOTk0MCwgMHgwMDc4MTIwNCB9LAotICAgIHsgMHgwMDAwYzk1YywgMHgwMDRiNmE4ZSB9LAotICAgIHsgMHgwMDAwYzk2OCwgMHgwMDAwMDNjZSB9LAotICAgIHsgMHgwMDAwOTk3MCwgMHgxOTBmYjUxNCB9LAotICAgIHsgMHgwMDAwOTk3NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk3OCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTk3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlhNCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTlhOCwgMHgyMDFmZmYwMCB9LAotICAgIHsgMHgwMDAwOTlhYywgMHgwMDZmMDBjNCB9LAotICAgIHsgMHgwMDAwOTliMCwgMHgwMzA1MTAwMCB9LAotICAgIHsgMHgwMDAwOTliNCwgMHgwMDAwMDgyMCB9LAotICAgIHsgMHgwMDAwOTlkYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTllMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTllNCwgMHhhYWFhYWFhYSB9LAotICAgIHsgMHgwMDAwOTllOCwgMHgzYzQ2NjQ3OCB9LAotICAgIHsgMHgwMDAwOTllYywgMHgwY2M4MGNhYSB9LAotICAgIHsgMHgwMDAwOTlmYywgMHgwMDAwMTA0MiB9LAotICAgIHsgMHgwMDAwYTIxMCwgMHg0MDgwYTMzMyB9LAotICAgIHsgMHgwMDAwYTIxNCwgMHg0MDIwNmMxMCB9LAotICAgIHsgMHgwMDAwYTIxOCwgMHgwMDljNDA2MCB9LAotICAgIHsgMHgwMDAwYTIyMCwgMHgwMTgzNDA2MSB9LAotICAgIHsgMHgwMDAwYTIyNCwgMHgwMDAwMDQwMCB9LAotICAgIHsgMHgwMDAwYTIyOCwgMHgwMDAwMDNiNSB9LAotICAgIHsgMHgwMDAwYTIyYywgMHgyMzI3NzIwMCB9LAotICAgIHsgMHgwMDAwYTIzNCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTIzOCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTIzYywgMHgxM2M4ODlhZiB9LAotICAgIHsgMHgwMDAwYTI0MCwgMHgzODQ5MGEyMCB9LAotICAgIHsgMHgwMDAwYTI0NCwgMHgwMDAwN2JiNiB9LAotICAgIHsgMHgwMDAwYTI0OCwgMHgwZmZmM2ZmYyB9LAotICAgIHsgMHgwMDAwYTI0YywgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwYTI1MCwgMHgwMDFkYTAwMCB9LAotICAgIHsgMHgwMDAwYTI1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1OCwgMHgwY2RiZDM4MCB9LAotICAgIHsgMHgwMDAwYTI1YywgMHgwZjBmMGYwMSB9LAotICAgIHsgMHgwMDAwYTI2MCwgMHhkZmE5MWYwMSB9LAotICAgIHsgMHgwMDAwYTI2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI2YywgMHgwZWJhZTljNiB9LAotICAgIHsgMHgwMDAwYjI2YywgMHgwZWJhZTljNiB9LAotICAgIHsgMHgwMDAwZDI3MCwgMHgwMDgyMDgyMCB9LAotICAgIHsgMHgwMDAwYTI3OCwgMHgxY2U3MzljZSB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTA3MDFjZSB9LAotICAgIHsgMHgwMDAwYTM1OCwgMHg3OTk5YWEwZiB9LAotICAgIHsgMHgwMDAwZDM1YywgMHgwN2ZmZmZlZiB9LAotICAgIHsgMHgwMDAwZDM2MCwgMHgwZmZmZmZlNyB9LAotICAgIHsgMHgwMDAwZDM2NCwgMHgxN2ZmZmZlNSB9LAotICAgIHsgMHgwMDAwZDM2OCwgMHgxZmZmZmZlNCB9LAotICAgIHsgMHgwMDAwZDM2YywgMHgzN2ZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3MCwgMHgzZmZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3NCwgMHg1N2ZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3OCwgMHg1ZmZmZmZlMiB9LAotICAgIHsgMHgwMDAwZDM3YywgMHg3ZmZmZmZlMiB9LAotICAgIHsgMHgwMDAwZDM4MCwgMHg3ZjNjN2JiYSB9LAotICAgIHsgMHgwMDAwZDM4NCwgMHhmMzMwN2ZmMCB9LAotICAgIHsgMHgwMDAwYTM4OCwgMHgwYzAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM4YywgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTM5MCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTM5NCwgMHgxY2U3MzljZSB9LAotICAgIHsgMHgwMDAwYTM5OCwgMHgwMDAwMDFjZSB9LAotICAgIHsgMHgwMDAwYTM5YywgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwYTNhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNhNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNhYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNjMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNjNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNjOCwgMHgwMDAwMDI0NiB9LAotICAgIHsgMHgwMDAwYTNjYywgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkMCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkNCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkYywgMHgxY2U3MzljZSB9LAotICAgIHsgMHgwMDAwYTNlMCwgMHgwMDAwMDFjZSB9LAotICAgIHsgMHgwMDAwYTNlNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNlOCwgMHgxOGM0MzQzMyB9LAotICAgIHsgMHgwMDAwYTNlYywgMHgwMGYzODA4MSB9LAotICAgIHsgMHgwMDAwNzgwMCwgMHgwMDA0MDAwMCB9LAotICAgIHsgMHgwMDAwNzgwNCwgMHhkYjAwNTAxMiB9LAotICAgIHsgMHgwMDAwNzgwOCwgMHgwNDkyNDkxNCB9LAotICAgIHsgMHgwMDAwNzgwYywgMHgyMTA4NDIxMCB9LAotICAgIHsgMHgwMDAwNzgxMCwgMHg2ZDgwMTMwMCB9LAotICAgIHsgMHgwMDAwNzgxNCwgMHgwMDE5YmVmZiB9LAotICAgIHsgMHgwMDAwNzgxOCwgMHgwN2U0MDAwMCB9LAotICAgIHsgMHgwMDAwNzgxYywgMHgwMDQ5MjAwMCB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHg5MjQ5MjQ4MCB9LAotICAgIHsgMHgwMDAwNzgyNCwgMHgwMDA0MDAwMCB9LAotICAgIHsgMHgwMDAwNzgyOCwgMHhkYjAwNTAxMiB9LAotICAgIHsgMHgwMDAwNzgyYywgMHgwNDkyNDkxNCB9LAotICAgIHsgMHgwMDAwNzgzMCwgMHgyMTA4NDIxMCB9LAotICAgIHsgMHgwMDAwNzgzNCwgMHg2ZDgwMTMwMCB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHgwMDE5YmVmZiB9LAotICAgIHsgMHgwMDAwNzgzYywgMHgwN2U0MDAwMCB9LAotICAgIHsgMHgwMDAwNzg0MCwgMHgwMDQ5MjAwMCB9LAotICAgIHsgMHgwMDAwNzg0NCwgMHg5MjQ5MjQ4MCB9LAotICAgIHsgMHgwMDAwNzg0OCwgMHgwMDEyMDAwMCB9LAotICAgIHsgMHgwMDAwNzg1MCwgMHg1NDIxNDUxNCB9LAotICAgIHsgMHgwMDAwNzg1OCwgMHg5MjU5MjY5MiB9LAotICAgIHsgMHgwMDAwNzg2MCwgMHg1MjgwMjAwMCB9LAotICAgIHsgMHgwMDAwNzg2NCwgMHgwYThlMzcwZSB9LAotICAgIHsgMHgwMDAwNzg2OCwgMHhjMDEwMjg1MCB9LAotICAgIHsgMHgwMDAwNzg2YywgMHg4MTJkNDAwMCB9LAotICAgIHsgMHgwMDAwNzg3NCwgMHgwMDFiNmRiMCB9LAotICAgIHsgMHgwMDAwNzg3OCwgMHgwMDM3NmI2MyB9LAotICAgIHsgMHgwMDAwNzg3YywgMHgwNmRiNmRiNiB9LAotICAgIHsgMHgwMDAwNzg4MCwgMHgwMDZkODAwMCB9LAotICAgIHsgMHgwMDAwNzg4NCwgMHhmZmVmZmZmZSB9LAotICAgIHsgMHgwMDAwNzg4OCwgMHhmZmVmZmZmZSB9LAotICAgIHsgMHgwMDAwNzg5MCwgMHgwMDA2MGFlYiB9LAotICAgIHsgMHgwMDAwNzg5NCwgMHg1YTEwODAwMCB9LAotICAgIHsgMHgwMDAwNzg5OCwgMHgyYTg1MDE2MCB9LAotfTsKLQotLyogWFhYIDkyODAgMiAqLwogc3RhdGljIGNvbnN0IHUzMiBhcjkyODBNb2Rlc185MjgwXzJbXVs2XSA9IHsKLSAgICB7IDB4MDAwMDEwMzAsIDB4MDAwMDAyMzAsIDB4MDAwMDA0NjAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODAgfSwKLSAgICB7IDB4MDAwMDEwZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTAgfSwKLSAgICB7IDB4MDAwMDgwMWMsIDB4MTI4ZDgwMjcsIDB4MTI4ZDgwNGYsIDB4MTJlMDAwNTcsIDB4MTJlMDAwMmIsIDB4MDk4ODAwNGYgfSwKLSAgICB7IDB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAgfSwKLSAgICB7IDB4MDAwMDgxZDAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEgfSwKLSAgICB7IDB4MDAwMDgzMTgsIDB4MDAwMDNlODAsIDB4MDAwMDdkMDAsIDB4MDAwMDY4ODAsIDB4MDAwMDM0NDAsIDB4MDAwMDY4ODAgfSwKLSAgICB7IDB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDMgfSwKLSAgICB7IDB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSwKLSAgICB7IDB4MDAwMDk4MjQsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEgfSwKLSAgICB7IDB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDk4NDAsIDB4MjA2YTAyMmUsIDB4MjA2YTAyMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUgfSwKLSAgICB7IDB4MDAwMDk4NDQsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAgfSwKLSAgICB7IDB4MDAwMDk4NTAsIDB4NmM0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZTIsIDB4NmM0MDAwZTIgfSwKLSAgICB7IDB4MDAwMDk4NTgsIDB4N2VjODhkMmUsIDB4N2VjODhkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUgfSwKLSAgICB7IDB4MDAwMDk4NWMsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWUsIDB4MzEzOTVkNWUgfSwKLSAgICB7IDB4MDAwMDk4NjAsIDB4MDAwNDhkMTgsIDB4MDAwNDhkMTgsIDB4MDAwNDhkMjAsIDB4MDAwNDhkMjAsIDB4MDAwNDhkMTggfSwKLSAgICB7IDB4MDAwMDk4NjQsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAgfSwKLSAgICB7IDB4MDAwMDk4NjgsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAgfSwKLSAgICB7IDB4MDAwMDk4NmMsIDB4MDY5MDMwODEsIDB4MDY5MDMwODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEgfSwKLSAgICB7IDB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDAgfSwKLSAgICB7IDB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAyNjgsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTYgfSwKLSAgICB7IDB4MDAwMDk5MjQsIDB4ZDAwYThhMGIsIDB4ZDAwYThhMGIsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGQgfSwKLSAgICB7IDB4MDAwMDk5NDQsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAgfSwKLSAgICB7IDB4MDAwMDk5NjAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMGE5NjAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDk5NjQsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAgfSwKLSAgICB7IDB4MDAwMGM5NjgsIDB4MDAwMDAzYjUsIDB4MDAwMDAzYjUsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UgfSwKLSAgICB7IDB4MDAwMDk5YjgsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMgfSwKLSAgICB7IDB4MDAwMDk5YmMsIDB4MDAwMDBhMDAsIDB4MDAwMDBhMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAgfSwKLSAgICB7IDB4MDAwMDk5YzAsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQgfSwKLSAgICB7IDB4MDAwMDk5YzQsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcgfSwKLSAgICB7IDB4MDAwMDk5YzgsIDB4NjBmNjUzMjksIDB4NjBmNjUzMjksIDB4NjBmNjUzMjksIDB4NjBmNjUzMjksIDB4NjBmNjUzMjkgfSwKLSAgICB7IDB4MDAwMDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzggfSwKLSAgICB7IDB4MDAwMDk5ZDAsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQgfSwKLSAgICB7IDB4MDAwMDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMDQsIDB4MDAwMDA0NDQsIDB4MDAwMDA0NDQsIDB4MDAwMDA0NDQsIDB4MDAwMDA0NDQsIDB4MDAwMDA0NDQgfSwKLSAgICB7IDB4MDAwMGEyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMTksIDB4MDAwMWYwMTksIDB4MDAwMWYwMTkgfSwKLSAgICB7IDB4MDAwMGIyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMTksIDB4MDAwMWYwMTksIDB4MDAwMWYwMTkgfSwKLSAgICB7IDB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEgfSwKLSAgICB7IDB4MDAwMGEyMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyM2MsIDB4MTNjODgwMDAsIDB4MTNjODgwMDAsIDB4MTNjODgwMDEsIDB4MTNjODgwMDAsIDB4MTNjODgwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTAsIDB4MDAxZmYwMDAsIDB4MDAxZmYwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTgsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUgfSwKLSAgICB7IDB4MDAwMGEzODgsIDB4MGMwMDAwMDAsIDB4MGMwMDAwMDAsIDB4MDgwMDAwMDAsIDB4MGMwMDAwMDAsIDB4MGMwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4OTQsIDB4NWE1MDgwMDAsIDB4NWE1MDgwMDAsIDB4NWE1MDgwMDAsIDB4NWE1MDgwMDAsIDB4NWE1MDgwMDAgfSwKKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTB9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwZTYwLCAweDAwMDAxY2MwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4LCAweDAwMDAxMTgwfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTB9LAorCXsweDAwMDA4MDFjLCAweDEyOGQ4MDI3LCAweDEyOGQ4MDRmLCAweDEyZTAwMDU3LCAweDEyZTAwMDJiLCAweDA5ODgwMDRmfSwKKwl7MHgwMDAwODEyMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMH0sCisJezB4MDAwMDgxZDAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMTAsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGF9LAorCXsweDAwMDA4MzE4LCAweDAwMDAzZTgwLCAweDAwMDA3ZDAwLCAweDAwMDA2ODgwLCAweDAwMDAzNDQwLCAweDAwMDA2ODgwfSwKKwl7MHgwMDAwOTgwNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwM30sCisJezB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDB9LAorCXsweDAwMDA5ODI0LCAweDAxMDAwZTBlLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlfSwKKwl7MHgwMDAwOTgyOCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMX0sCisJezB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGV9LAorCXsweDAwMDA5ODM4LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3fSwKKwl7MHgwMDAwOTg0MCwgMHgyMDZhMDIyZSwgMHgyMDZhMDIyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZX0sCisJezB4MDAwMDk4NDQsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTB9LAorCXsweDAwMDA5ODUwLCAweDZjNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZjNDAwMGUyLCAweDZjNDAwMGUyfSwKKwl7MHgwMDAwOTg1OCwgMHg3ZWM4OGQyZSwgMHg3ZWM4OGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCisJezB4MDAwMDk4NWMsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWUsIDB4MzEzOTVkNWV9LAorCXsweDAwMDA5ODYwLCAweDAwMDQ4ZDE4LCAweDAwMDQ4ZDE4LCAweDAwMDQ4ZDIwLCAweDAwMDQ4ZDIwLCAweDAwMDQ4ZDE4fSwKKwl7MHgwMDAwOTg2NCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMH0sCisJezB4MDAwMDk4NjgsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAorCXsweDAwMDA5ODZjLCAweDA2OTAzMDgxLCAweDA2OTAzMDgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKKwl7MHgwMDAwOTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMGZhMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMH0sCisJezB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAyNjgsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTZ9LAorCXsweDAwMDA5OTI0LCAweGQwMGE4YTBiLCAweGQwMGE4YTBiLCAweGQwMGE4YTBkLCAweGQwMGE4YTBkLCAweGQwMGE4YTBkfSwKKwl7MHgwMDAwOTk0NCwgMHhmZmJjMTAxMCwgMHhmZmJjMTAxMCwgMHhmZmJjMTAxMCwgMHhmZmJjMTAxMCwgMHhmZmJjMTAxMH0sCisJezB4MDAwMDk5NjAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTB9LAorCXsweDAwMDBhOTYwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwOTk2NCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMH0sCisJezB4MDAwMGM5NjgsIDB4MDAwMDAzYjUsIDB4MDAwMDAzYjUsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2V9LAorCXsweDAwMDA5OWI4LCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjfSwKKwl7MHgwMDAwOTliYywgMHgwMDAwMGEwMCwgMHgwMDAwMGEwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMH0sCisJezB4MDAwMDk5YzAsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDR9LAorCXsweDAwMDBhMjA0LCAweDAwMDAwNDQ0LCAweDAwMDAwNDQ0LCAweDAwMDAwNDQ0LCAweDAwMDAwNDQ0LCAweDAwMDAwNDQ0fSwKKwl7MHgwMDAwYTIwYywgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAxZjAxOSwgMHgwMDAxZjAxOSwgMHgwMDAxZjAxOX0sCisJezB4MDAwMGIyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMTksIDB4MDAwMWYwMTksIDB4MDAwMWYwMTl9LAorCXsweDAwMDBhMjFjLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhfSwKKwl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyM2MsIDB4MTNjODgwMDAsIDB4MTNjODgwMDAsIDB4MTNjODgwMDEsIDB4MTNjODgwMDAsIDB4MTNjODgwMDB9LAorCXsweDAwMDBhMjUwLCAweDAwMWZmMDAwLCAweDAwMWZmMDAwLCAweDAwMDRhMDAwLCAweDAwMDRhMDAwLCAweDAwMDRhMDAwfSwKKwl7MHgwMDAwYTM1OCwgMHg3OTk5YWEwMiwgMHg3OTk5YWEwMiwgMHg3OTk5YWEwZSwgMHg3OTk5YWEwZSwgMHg3OTk5YWEwZX0sCisJezB4MDAwMGEzODgsIDB4MGMwMDAwMDAsIDB4MGMwMDAwMDAsIDB4MDgwMDAwMDAsIDB4MGMwMDAwMDAsIDB4MGMwMDAwMDB9LAorCXsweDAwMDBhM2Q4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzg5NCwgMHg1YTUwODAwMCwgMHg1YTUwODAwMCwgMHg1YTUwODAwMCwgMHg1YTUwODAwMCwgMHg1YTUwODAwMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4MENvbW1vbl85MjgwXzJbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwMzAsIDB4MDAwMjAwMTUgfSwKLSAgICB7IDB4MDAwMDAwMzQsIDB4MDAwMDAwMDUgfSwKLSAgICB7IDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNDQsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNDgsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNGMsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDAwNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNDAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNGMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNWMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwMzAsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwM2MsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwMjQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDQwNjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDcwMTAsIDB4MDAwMDAwMzMgfSwKLSAgICB7IDB4MDAwMDcwMzQsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDcwMzgsIDB4MDAwMDA0YzIgfSwKLSAgICB7IDB4MDAwMDgwMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMTgsIDB4MDAwMDA3MDAgfSwKLSAgICB7IDB4MDAwMDgwMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNDgsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNWMsIDB4MDAwZmM3OGYgfSwKLSAgICB7IDB4MDAwMDgwNjAsIDB4MDAwMDAwMGYgfSwKLSAgICB7IDB4MDAwMDgwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYzAsIDB4MmE4MDAwMWEgfSwKLSAgICB7IDB4MDAwMDgwYzQsIDB4MDVkYzAxZTAgfSwKLSAgICB7IDB4MDAwMDgwYzgsIDB4MWY0MDI3MTAgfSwKLSAgICB7IDB4MDAwMDgwY2MsIDB4MDFmNDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDAsIDB4MDAwMDFlMDAgfSwKLSAgICB7IDB4MDAwMDgwZDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDgsIDB4MDA0MDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZTAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTQsIDB4MDAwMGZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTgsIDB4MDAzZjNmM2YgfSwKLSAgICB7IDB4MDAwMDgwZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZmMsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDAsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgxMDgsIDB4MDAwMDAwNTIgfSwKLSAgICB7IDB4MDAwMDgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMTAsIDB4MDAwMDAxNjggfSwKLSAgICB7IDB4MDAwMDgxMTgsIDB4MDAwMTAwYWEgfSwKLSAgICB7IDB4MDAwMDgxMWMsIDB4MDAwMDMyMTAgfSwKLSAgICB7IDB4MDAwMDgxMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNDQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgxNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNzAsIDB4MzIxNDMzMjAgfSwKLSAgICB7IDB4MDAwMDgxNzQsIDB4ZmFhNGZhNTAgfSwKLSAgICB7IDB4MDAwMDgxNzgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgxN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDAsIDB4MDAxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDQsIDB4MDAxMGY0MDAgfSwKLSAgICB7IDB4MDAwMDgyNDgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgyNGMsIDB4MDAwMWU4MDAgfSwKLSAgICB7IDB4MDAwMDgyNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNWMsIDB4NDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgyNjAsIDB4MDAwODA5MjIgfSwKLSAgICB7IDB4MDAwMDgyNjQsIDB4ODhhMDAwMTAgfSwKLSAgICB7IDB4MDAwMDgyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzQsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzgsIDB4MDAzZTQxODAgfSwKLSAgICB7IDB4MDAwMDgyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyODQsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyODgsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDAsIDB4MDAwMDAwNDAgfSwKLSAgICB7IDB4MDAwMDgzMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMmMsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDgzMzAsIDB4MDAwMDAzMDIgfSwKLSAgICB7IDB4MDAwMDgzMzQsIDB4MDAwMDBlMDAgfSwKLSAgICB7IDB4MDAwMDgzMzgsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDgzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNDAsIDB4MDAwMTA3ZmYgfSwKLSAgICB7IDB4MDAwMDgzNDQsIDB4MDA0ODEwNDMgfSwKLSAgICB7IDB4MDAwMDk4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MGMsIDB4YWZhNjhlMzAgfSwKLSAgICB7IDB4MDAwMDk4MTAsIDB4ZmQxNGUwMDAgfSwKLSAgICB7IDB4MDAwMDk4MTQsIDB4OWMwYTlmNmIgfSwKLSAgICB7IDB4MDAwMDk4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MmMsIDB4MDAwMGEwMDAgfSwKLSAgICB7IDB4MDAwMDk4MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4M2MsIDB4MDAyMDA0MDAgfSwKLSAgICB7IDB4MDAwMDk4NGMsIDB4MDA0MDIzM2MgfSwKLSAgICB7IDB4MDAwMGE4NGMsIDB4MDA0MDIzM2MgfSwKLSAgICB7IDB4MDAwMDk4NTQsIDB4MDAwMDAwNDQgfSwKLSAgICB7IDB4MDAwMDk5MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MTAsIDB4MDEwMDIzMTAgfSwKLSAgICB7IDB4MDAwMDk5MWMsIDB4MTAwMDBmZmYgfSwKLSAgICB7IDB4MDAwMDk5MjAsIDB4MDQ5MDAwMDAgfSwKLSAgICB7IDB4MDAwMGE5MjAsIDB4MDQ5MDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MjgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5MmMsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMDk5MzQsIDB4MWUxZjIwMjIgfSwKLSAgICB7IDB4MDAwMDk5MzgsIDB4MGEwYjBjMGQgfSwKLSAgICB7IDB4MDAwMDk5M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NDgsIDB4OTI4MGMwMGEgfSwKLSAgICB7IDB4MDAwMDk5NGMsIDB4MDAwMjAwMjggfSwKLSAgICB7IDB4MDAwMDk5NTQsIDB4NWYzY2EzZGUgfSwKLSAgICB7IDB4MDAwMDk5NTgsIDB4MjEwOGVjZmYgfSwKLSAgICB7IDB4MDAwMDk5NDAsIDB4MTQ3NTA2MDQgfSwKLSAgICB7IDB4MDAwMGM5NWMsIDB4MDA0YjZhOGUgfSwKLSAgICB7IDB4MDAwMDk5NzAsIDB4MTkwZmI1MTUgfSwKLSAgICB7IDB4MDAwMDk5NzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NzgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5YTgsIDB4MjAxZmZmMDAgfSwKLSAgICB7IDB4MDAwMDk5YWMsIDB4MDA2ZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjAsIDB4MDMwNTEwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjQsIDB4MDAwMDA4MjAgfSwKLSAgICB7IDB4MDAwMDk5ZGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTQsIDB4YWFhYWFhYWEgfSwKLSAgICB7IDB4MDAwMDk5ZTgsIDB4M2M0NjY0NzggfSwKLSAgICB7IDB4MDAwMDk5ZWMsIDB4MGNjODBjYWEgfSwKLSAgICB7IDB4MDAwMDk5ZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZmMsIDB4MDAwMDEwNDIgfSwKLSAgICB7IDB4MDAwMGEyMDgsIDB4ODAzZTQ3ODggfSwKLSAgICB7IDB4MDAwMGEyMTAsIDB4NDA4MGEzMzMgfSwKLSAgICB7IDB4MDAwMGEyMTQsIDB4NDAyMDZjMTAgfSwKLSAgICB7IDB4MDAwMGEyMTgsIDB4MDA5YzQwNjAgfSwKLSAgICB7IDB4MDAwMGEyMjAsIDB4MDE4MzQwNjEgfSwKLSAgICB7IDB4MDAwMGEyMjQsIDB4MDAwMDA0MDAgfSwKLSAgICB7IDB4MDAwMGEyMjgsIDB4MDAwMDAzYjUgfSwKLSAgICB7IDB4MDAwMGEyMmMsIDB4MjMzZjcxODAgfSwKLSAgICB7IDB4MDAwMGEyMzQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyMzgsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyNDAsIDB4Mzg0OTBhMjAgfSwKLSAgICB7IDB4MDAwMGEyNDQsIDB4MDAwMDdiYjYgfSwKLSAgICB7IDB4MDAwMGEyNDgsIDB4MGZmZjNmZmMgfSwKLSAgICB7IDB4MDAwMGEyNGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTgsIDB4MGNkYmQzODAgfSwKLSAgICB7IDB4MDAwMGEyNWMsIDB4MGYwZjBmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjAsIDB4ZGZhOTFmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNmMsIDB4MGU3OWU1YzYgfSwKLSAgICB7IDB4MDAwMGIyNmMsIDB4MGU3OWU1YzYgfSwKLSAgICB7IDB4MDAwMGQyNzAsIDB4MDA4MjA4MjAgfSwKLSAgICB7IDB4MDAwMGEyNzgsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGQzNWMsIDB4MDdmZmZmZWYgfSwKLSAgICB7IDB4MDAwMGQzNjAsIDB4MGZmZmZmZTcgfSwKLSAgICB7IDB4MDAwMGQzNjQsIDB4MTdmZmZmZTUgfSwKLSAgICB7IDB4MDAwMGQzNjgsIDB4MWZmZmZmZTQgfSwKLSAgICB7IDB4MDAwMGQzNmMsIDB4MzdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzAsIDB4M2ZmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzQsIDB4NTdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzgsIDB4NWZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzN2MsIDB4N2ZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzODAsIDB4N2YzYzdiYmEgfSwKLSAgICB7IDB4MDAwMGQzODQsIDB4ZjMzMDdmZjAgfSwKLSAgICB7IDB4MDAwMGEzOGMsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTQsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEzOTgsIDB4MDAwMDAxY2UgfSwKLSAgICB7IDB4MDAwMGEzOWMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEzYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzgsIDB4MDAwMDAyNDYgfSwKLSAgICB7IDB4MDAwMGEzY2MsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZGMsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEzZTAsIDB4MDAwMDAxY2UgfSwKLSAgICB7IDB4MDAwMGEzZTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzZTgsIDB4MThjNDM0MzMgfSwKLSAgICB7IDB4MDAwMGEzZWMsIDB4MDBmNzAwODEgfSwKLSAgICB7IDB4MDAwMDc4MDAsIDB4MDAwNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MDQsIDB4ZGIwMDUwMTIgfSwKLSAgICB7IDB4MDAwMDc4MDgsIDB4MDQ5MjQ5MTQgfSwKLSAgICB7IDB4MDAwMDc4MGMsIDB4MjEwODQyMTAgfSwKLSAgICB7IDB4MDAwMDc4MTAsIDB4NmQ4MDEzMDAgfSwKLSAgICB7IDB4MDAwMDc4MTgsIDB4MDdlNDEwMDAgfSwKLSAgICB7IDB4MDAwMDc4MjQsIDB4MDAwNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MjgsIDB4ZGIwMDUwMTIgfSwKLSAgICB7IDB4MDAwMDc4MmMsIDB4MDQ5MjQ5MTQgfSwKLSAgICB7IDB4MDAwMDc4MzAsIDB4MjEwODQyMTAgfSwKLSAgICB7IDB4MDAwMDc4MzQsIDB4NmQ4MDEzMDAgfSwKLSAgICB7IDB4MDAwMDc4M2MsIDB4MDdlNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4NDgsIDB4MDAxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4NGMsIDB4NzczZjA1NjcgfSwKLSAgICB7IDB4MDAwMDc4NTAsIDB4NTQyMTQ1MTQgfSwKLSAgICB7IDB4MDAwMDc4NTQsIDB4MTIwMzU4MjggfSwKLSAgICB7IDB4MDAwMDc4NTgsIDB4OTI1OTI2OWEgfSwKLSAgICB7IDB4MDAwMDc4NjAsIDB4NTI4MDIwMDAgfSwKLSAgICB7IDB4MDAwMDc4NjQsIDB4MGE4ZTM3MGUgfSwKLSAgICB7IDB4MDAwMDc4NjgsIDB4YzAxMDI4NTAgfSwKLSAgICB7IDB4MDAwMDc4NmMsIDB4ODEyZDQwMDAgfSwKLSAgICB7IDB4MDAwMDc4NzAsIDB4ODA3ZWM0MDAgfSwKLSAgICB7IDB4MDAwMDc4NzQsIDB4MDAxYjZkYjAgfSwKLSAgICB7IDB4MDAwMDc4NzgsIDB4MDAzNzZiNjMgfSwKLSAgICB7IDB4MDAwMDc4N2MsIDB4MDZkYjZkYjYgfSwKLSAgICB7IDB4MDAwMDc4ODAsIDB4MDA2ZDgwMDAgfSwKLSAgICB7IDB4MDAwMDc4ODQsIDB4ZmZlZmZmZmUgfSwKLSAgICB7IDB4MDAwMDc4ODgsIDB4ZmZlZmZmZmUgfSwKLSAgICB7IDB4MDAwMDc4OGMsIDB4MDAwMTAwMDAgfSwKLSAgICB7IDB4MDAwMDc4OTAsIDB4MDIwNjBhZWIgfSwKLSAgICB7IDB4MDAwMDc4OTgsIDB4MmE4NTAxNjAgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDAwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDMwLCAweDAwMDIwMDE1fSwKKwl7MHgwMDAwMDAzNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ0LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0OCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNGMsIDB4MDAwMDAwMTB9LAorCXsweDAwMDAwMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA1NCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDA4MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDQwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDRjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDY0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTIzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTM3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2Y4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTRmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTViOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTY3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTczOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxN2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTdmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTE3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTIzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQ3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDQwMzAsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA0MDNjLCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwNDAyNCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDQwNjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA0MDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAzM30sCisJezB4MDAwMDcwMzQsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAxOCwgMHgwMDAwMDcwMH0sCisJezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4NDAwMDAwMDB9LAorCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAorCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGMwLCAweDJhODAwMDFhfSwKKwl7MHgwMDAwODBjNCwgMHgwNWRjMDFlMH0sCisJezB4MDAwMDgwYzgsIDB4MWY0MDI3MTB9LAorCXsweDAwMDA4MGNjLCAweDAxZjQwMDAwfSwKKwl7MHgwMDAwODBkMCwgMHgwMDAwMWUwMH0sCisJezB4MDAwMDgwZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGQ4LCAweDAwNDAwMDAwfSwKKwl7MHgwMDAwODBlMCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgwZTQsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MGU4LCAweDAwM2YzZjNmfSwKKwl7MHgwMDAwODBlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZmMsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTAwLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDgxMDgsIDB4MDAwMDAwNTJ9LAorCXsweDAwMDA4MTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExMCwgMHgwMDAwMDE2OH0sCisJezB4MDAwMDgxMTgsIDB4MDAwMTAwYWF9LAorCXsweDAwMDA4MTFjLCAweDAwMDAzMjEwfSwKKwl7MHgwMDAwODEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNDQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MTY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNzAsIDB4MzIxNDMzMjB9LAorCXsweDAwMDA4MTc0LCAweGZhYTRmYTUwfSwKKwl7MHgwMDAwODE3OCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDgxN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI0MCwgMHgwMDEwMDAwMH0sCisJezB4MDAwMDgyNDQsIDB4MDAxMGY0MDB9LAorCXsweDAwMDA4MjQ4LCAweDAwMDAwMTAwfSwKKwl7MHgwMDAwODI0YywgMHgwMDAxZTgwMH0sCisJezB4MDAwMDgyNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNWMsIDB4NDAwMDAwZmZ9LAorCXsweDAwMDA4MjYwLCAweDAwMDgwOTIyfSwKKwl7MHgwMDAwODI2NCwgMHg4OGEwMDAxMH0sCisJezB4MDAwMDgyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjc0LCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI3OCwgMHgwMDNlNDE4MH0sCisJezB4MDAwMDgyN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjg0LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4OCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMDQwfSwKKwl7MHgwMDAwODMxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzJjLCAweDAwMDAwMDA3fSwKKwl7MHgwMDAwODMzMCwgMHgwMDAwMDMwMn0sCisJezB4MDAwMDgzMzQsIDB4MDAwMDBlMDB9LAorCXsweDAwMDA4MzM4LCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwODMzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNDAsIDB4MDAwMTA3ZmZ9LAorCXsweDAwMDA4MzQ0LCAweDAwNDgxMDQzfSwKKwl7MHgwMDAwOTgwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MGMsIDB4YWZhNjhlMzB9LAorCXsweDAwMDA5ODEwLCAweGZkMTRlMDAwfSwKKwl7MHgwMDAwOTgxNCwgMHg5YzBhOWY2Yn0sCisJezB4MDAwMDk4MWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODJjLCAweDAwMDBhMDAwfSwKKwl7MHgwMDAwOTgzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4M2MsIDB4MDAyMDA0MDB9LAorCXsweDAwMDA5ODRjLCAweDAwNDAyMzNjfSwKKwl7MHgwMDAwYTg0YywgMHgwMDQwMjMzY30sCisJezB4MDAwMDk4NTQsIDB4MDAwMDAwNDR9LAorCXsweDAwMDA5OTAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkxMCwgMHgwMTAwMjMxMH0sCisJezB4MDAwMDk5MWMsIDB4MTAwMDBmZmZ9LAorCXsweDAwMDA5OTIwLCAweDA0OTAwMDAwfSwKKwl7MHgwMDAwYTkyMCwgMHgwNDkwMDAwMH0sCisJezB4MDAwMDk5MjgsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OTJjLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOTkzNCwgMHgxZTFmMjAyMn0sCisJezB4MDAwMDk5MzgsIDB4MGEwYjBjMGR9LAorCXsweDAwMDA5OTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk0OCwgMHg5MjgwYzAwYX0sCisJezB4MDAwMDk5NGMsIDB4MDAwMjAwMjh9LAorCXsweDAwMDA5OTU0LCAweDVmM2NhM2RlfSwKKwl7MHgwMDAwOTk1OCwgMHgyMTA4ZWNmZn0sCisJezB4MDAwMDk5NDAsIDB4MTQ3NTA2MDR9LAorCXsweDAwMDBjOTVjLCAweDAwNGI2YThlfSwKKwl7MHgwMDAwOTk3MCwgMHgxOTBmYjUxNH0sCisJezB4MDAwMDk5NzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTc4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTk3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5YTQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OWE4LCAweDIwMWZmZjAwfSwKKwl7MHgwMDAwOTlhYywgMHgwMDZmMDAwMH0sCisJezB4MDAwMDk5YjAsIDB4MDMwNTEwMDB9LAorCXsweDAwMDA5OWI0LCAweDAwMDAwODIwfSwKKwl7MHgwMDAwOTljNCwgMHgwNjMzNmY3N30sCisJezB4MDAwMDk5YzgsIDB4NmFmNjUzMmZ9LAorCXsweDAwMDA5OWNjLCAweDA4ZjE4NmM4fSwKKwl7MHgwMDAwOTlkMCwgMHgwMDA0NjM4NH0sCisJezB4MDAwMDk5ZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWQ4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWU0LCAweGFhYWFhYWFhfSwKKwl7MHgwMDAwOTllOCwgMHgzYzQ2NjQ3OH0sCisJezB4MDAwMDk5ZWMsIDB4MGNjODBjYWF9LAorCXsweDAwMDA5OWYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlmYywgMHgwMDAwMTA0Mn0sCisJezB4MDAwMGEyMDgsIDB4ODAzZTQ3ODh9LAorCXsweDAwMDBhMjEwLCAweDQwODBhMzMzfSwKKwl7MHgwMDAwYTIxNCwgMHg0MDIwNmMxMH0sCisJezB4MDAwMGEyMTgsIDB4MDA5YzQwNjB9LAorCXsweDAwMDBhMjIwLCAweDAxODM0MDYxfSwKKwl7MHgwMDAwYTIyNCwgMHgwMDAwMDQwMH0sCisJezB4MDAwMGEyMjgsIDB4MDAwMDAzYjV9LAorCXsweDAwMDBhMjJjLCAweDIzM2Y3MTgwfSwKKwl7MHgwMDAwYTIzNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyMzgsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMjQwLCAweDM4NDkwYTIwfSwKKwl7MHgwMDAwYTI0NCwgMHgwMDAwN2JiNn0sCisJezB4MDAwMGEyNDgsIDB4MGZmZjNmZmN9LAorCXsweDAwMDBhMjRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNTgsIDB4MGNkYmQzODB9LAorCXsweDAwMDBhMjVjLCAweDBmMGYwZjAxfSwKKwl7MHgwMDAwYTI2MCwgMHhkZmE5MWYwMX0sCisJezB4MDAwMGEyNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjZjLCAweDBlNzllNWM2fSwKKwl7MHgwMDAwYjI2YywgMHgwZTc5ZTVjNn0sCisJezB4MDAwMGQyNzAsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBhMjc4LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwZDM1YywgMHgwN2ZmZmZlZn0sCisJezB4MDAwMGQzNjAsIDB4MGZmZmZmZTd9LAorCXsweDAwMDBkMzY0LCAweDE3ZmZmZmU1fSwKKwl7MHgwMDAwZDM2OCwgMHgxZmZmZmZlNH0sCisJezB4MDAwMGQzNmMsIDB4MzdmZmZmZTN9LAorCXsweDAwMDBkMzcwLCAweDNmZmZmZmUzfSwKKwl7MHgwMDAwZDM3NCwgMHg1N2ZmZmZlM30sCisJezB4MDAwMGQzNzgsIDB4NWZmZmZmZTJ9LAorCXsweDAwMDBkMzdjLCAweDdmZmZmZmUyfSwKKwl7MHgwMDAwZDM4MCwgMHg3ZjNjN2JiYX0sCisJezB4MDAwMGQzODQsIDB4ZjMzMDdmZjB9LAorCXsweDAwMDBhMzhjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTM5MCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzOTQsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhMzk4LCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYTM5YywgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEzYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2E0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2IwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2M4LCAweDAwMDAwMjQ2fSwKKwl7MHgwMDAwYTNjYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkYywgMHgxY2U3MzljZX0sCisJezB4MDAwMGEzZTAsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhM2U0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNlOCwgMHgxOGM0MzQzM30sCisJezB4MDAwMDc4MDAsIDB4MDAwNDAwMDB9LAorCXsweDAwMDA3ODA0LCAweGRiMDA1MDEyfSwKKwl7MHgwMDAwNzgwOCwgMHgwNDkyNDkxNH0sCisJezB4MDAwMDc4MGMsIDB4MjEwODQyMTB9LAorCXsweDAwMDA3ODEwLCAweDZkODAxMzAwfSwKKwl7MHgwMDAwNzgxOCwgMHgwN2U0MTAwMH0sCisJezB4MDAwMDc4MjQsIDB4MDAwNDAwMDB9LAorCXsweDAwMDA3ODI4LCAweGRiMDA1MDEyfSwKKwl7MHgwMDAwNzgyYywgMHgwNDkyNDkxNH0sCisJezB4MDAwMDc4MzAsIDB4MjEwODQyMTB9LAorCXsweDAwMDA3ODM0LCAweDZkODAxMzAwfSwKKwl7MHgwMDAwNzgzYywgMHgwN2U0MDAwMH0sCisJezB4MDAwMDc4NDgsIDB4MDAxMDAwMDB9LAorCXsweDAwMDA3ODRjLCAweDc3M2YwNTY3fSwKKwl7MHgwMDAwNzg1MCwgMHg1NDIxNDUxNH0sCisJezB4MDAwMDc4NTQsIDB4MTIwMzU4Mjh9LAorCXsweDAwMDA3ODU4LCAweDkyNTkyNjlhfSwKKwl7MHgwMDAwNzg2MCwgMHg1MjgwMjAwMH0sCisJezB4MDAwMDc4NjQsIDB4MGE4ZTM3MGV9LAorCXsweDAwMDA3ODY4LCAweGMwMTAyODUwfSwKKwl7MHgwMDAwNzg2YywgMHg4MTJkNDAwMH0sCisJezB4MDAwMDc4NzAsIDB4ODA3ZWM0MDB9LAorCXsweDAwMDA3ODc0LCAweDAwMWI2ZGIwfSwKKwl7MHgwMDAwNzg3OCwgMHgwMDM3NmI2M30sCisJezB4MDAwMDc4N2MsIDB4MDZkYjZkYjZ9LAorCXsweDAwMDA3ODgwLCAweDAwNmQ4MDAwfSwKKwl7MHgwMDAwNzg4NCwgMHhmZmVmZmZmZX0sCisJezB4MDAwMDc4ODgsIDB4ZmZlZmZmZmV9LAorCXsweDAwMDA3ODhjLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwNzg5MCwgMHgwMjA2MGFlYn0sCisJezB4MDAwMDc4OTgsIDB4MmE4NTAxNjB9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODBNb2Rlc19mYXN0X2Nsb2NrXzkyODBfMltdWzNdID0gewotICAgIHsgMHgwMDAwMTAzMCwgMHgwMDAwMDI2OCwgMHgwMDAwMDRkMCB9LAotICAgIHsgMHgwMDAwMTA3MCwgMHgwMDAwMDE4YywgMHgwMDAwMDMxOCB9LAotICAgIHsgMHgwMDAwMTBiMCwgMHgwMDAwMGZkMCwgMHgwMDAwMWZhMCB9LAotICAgIHsgMHgwMDAwODAxNCwgMHgwNDRjMDQ0YywgMHgwODk4MDg5OCB9LAotICAgIHsgMHgwMDAwODAxYywgMHgxNDhlYzAyYiwgMHgxNDhlYzA1NyB9LAotICAgIHsgMHgwMDAwODMxOCwgMHgwMDAwNDRjMCwgMHgwMDAwODk4MCB9LAotICAgIHsgMHgwMDAwOTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCB9LAotICAgIHsgMHgwMDAwOTgyNCwgMHgwMTAwMGYwZiwgMHgwMTAwMGYwZiB9LAotICAgIHsgMHgwMDAwOTgyOCwgMHgwYjAyMDAwMSwgMHgwYjAyMDAwMSB9LAotICAgIHsgMHgwMDAwOTgzNCwgMHgwMDAwMGYwZiwgMHgwMDAwMGYwZiB9LAotICAgIHsgMHgwMDAwOTg0NCwgMHgwMzcyMTgyMSwgMHgwMzcyMTgyMSB9LAotICAgIHsgMHgwMDAwOTkxNCwgMHgwMDAwMDg5OCwgMHgwMDAwMTEzMCB9LAotICAgIHsgMHgwMDAwOTkxOCwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNiB9LAorCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgKi8KKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDI2OCwgMHgwMDAwMDRkMH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAxOGMsIDB4MDAwMDAzMTh9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwZmQwLCAweDAwMDAxZmEwfSwKKwl7MHgwMDAwODAxNCwgMHgwNDRjMDQ0YywgMHgwODk4MDg5OH0sCisJezB4MDAwMDgwMWMsIDB4MTQ4ZWMwMmIsIDB4MTQ4ZWMwNTd9LAorCXsweDAwMDA4MzE4LCAweDAwMDA0NGMwLCAweDAwMDA4OTgwfSwKKwl7MHgwMDAwOTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMH0sCisJezB4MDAwMDk4MjQsIDB4MDEwMDBmMGYsIDB4MDEwMDBmMGZ9LAorCXsweDAwMDA5ODI4LCAweDBiMDIwMDAxLCAweDBiMDIwMDAxfSwKKwl7MHgwMDAwOTgzNCwgMHgwMDAwMGYwZiwgMHgwMDAwMGYwZn0sCisJezB4MDAwMDk4NDQsIDB4MDM3MjE4MjEsIDB4MDM3MjE4MjF9LAorCXsweDAwMDA5OTE0LCAweDAwMDAwODk4LCAweDAwMDAxMTMwfSwKKwl7MHgwMDAwOTkxOCwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNn0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4ME1vZGVzX2JhY2tvZmZfMjNkYl9yeGdhaW5fOTI4MF8yW11bNl0gPSB7Ci0gICAgeyAweDAwMDA5YTAwLCAweDAwMDA4MTg0LCAweDAwMDA4MTg0LCAweDAwMDAwMjkwLCAweDAwMDAwMjkwLCAweDAwMDAwMjkwIH0sCi0gICAgeyAweDAwMDA5YTA0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDAwMzAwLCAweDAwMDAwMzAwLCAweDAwMDAwMzAwIH0sCi0gICAgeyAweDAwMDA5YTA4LCAweDAwMDA4MThjLCAweDAwMDA4MThjLCAweDAwMDAwMzA0LCAweDAwMDAwMzA0LCAweDAwMDAwMzA0IH0sCi0gICAgeyAweDAwMDA5YTBjLCAweDAwMDA4MTkwLCAweDAwMDA4MTkwLCAweDAwMDAwMzA4LCAweDAwMDAwMzA4LCAweDAwMDAwMzA4IH0sCi0gICAgeyAweDAwMDA5YTEwLCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDAwMzBjLCAweDAwMDAwMzBjLCAweDAwMDAwMzBjIH0sCi0gICAgeyAweDAwMDA5YTE0LCAweDAwMDA4MjAwLCAweDAwMDA4MjAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwIH0sCi0gICAgeyAweDAwMDA5YTE4LCAweDAwMDA4MjA0LCAweDAwMDA4MjA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0IH0sCi0gICAgeyAweDAwMDA5YTFjLCAweDAwMDA4MjA4LCAweDAwMDA4MjA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4IH0sCi0gICAgeyAweDAwMDA5YTIwLCAweDAwMDA4MjBjLCAweDAwMDA4MjBjLCAweDAwMDA4MDBjLCAweDAwMDA4MDBjLCAweDAwMDA4MDBjIH0sCi0gICAgeyAweDAwMDA5YTI0LCAweDAwMDA4MjEwLCAweDAwMDA4MjEwLCAweDAwMDA4MDgwLCAweDAwMDA4MDgwLCAweDAwMDA4MDgwIH0sCi0gICAgeyAweDAwMDA5YTI4LCAweDAwMDA4MjE0LCAweDAwMDA4MjE0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0IH0sCi0gICAgeyAweDAwMDA5YTJjLCAweDAwMDA4MjgwLCAweDAwMDA4MjgwLCAweDAwMDA4MDg4LCAweDAwMDA4MDg4LCAweDAwMDA4MDg4IH0sCi0gICAgeyAweDAwMDA5YTMwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4MDhjLCAweDAwMDA4MDhjLCAweDAwMDA4MDhjIH0sCi0gICAgeyAweDAwMDA5YTM0LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4LCAweDAwMDA4MTAwLCAweDAwMDA4MTAwLCAweDAwMDA4MTAwIH0sCi0gICAgeyAweDAwMDA5YTM4LCAweDAwMDA4MjhjLCAweDAwMDA4MjhjLCAweDAwMDA4MTA0LCAweDAwMDA4MTA0LCAweDAwMDA4MTA0IH0sCi0gICAgeyAweDAwMDA5YTNjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MTA4LCAweDAwMDA4MTA4LCAweDAwMDA4MTA4IH0sCi0gICAgeyAweDAwMDA5YTQwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjIH0sCi0gICAgeyAweDAwMDA5YTQ0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0LCAweDAwMDA4MTEwLCAweDAwMDA4MTEwLCAweDAwMDA4MTEwIH0sCi0gICAgeyAweDAwMDA5YTQ4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MTE0LCAweDAwMDA4MTE0LCAweDAwMDA4MTE0IH0sCi0gICAgeyAweDAwMDA5YTRjLCAweDAwMDA4MzBjLCAweDAwMDA4MzBjLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwIH0sCi0gICAgeyAweDAwMDA5YTUwLCAweDAwMDA4MzEwLCAweDAwMDA4MzEwLCAweDAwMDA4MTg0LCAweDAwMDA4MTg0LCAweDAwMDA4MTg0IH0sCi0gICAgeyAweDAwMDA5YTU0LCAweDAwMDA4MzE0LCAweDAwMDA4MzE0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4IH0sCi0gICAgeyAweDAwMDA5YTU4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MThjLCAweDAwMDA4MThjLCAweDAwMDA4MThjIH0sCi0gICAgeyAweDAwMDA5YTVjLCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0LCAweDAwMDA4MTkwLCAweDAwMDA4MTkwLCAweDAwMDA4MTkwIH0sCi0gICAgeyAweDAwMDA5YTYwLCAweDAwMDA4Mzg4LCAweDAwMDA4Mzg4LCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDA4MTk0IH0sCi0gICAgeyAweDAwMDA5YTY0LCAweDAwMDA4MzhjLCAweDAwMDA4MzhjLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwIH0sCi0gICAgeyAweDAwMDA5YTY4LCAweDAwMDA4MzkwLCAweDAwMDA4MzkwLCAweDAwMDA4MjBjLCAweDAwMDA4MjBjLCAweDAwMDA4MjBjIH0sCi0gICAgeyAweDAwMDA5YTZjLCAweDAwMDA4Mzk0LCAweDAwMDA4Mzk0LCAweDAwMDA4MWE4LCAweDAwMDA4MWE4LCAweDAwMDA4MWE4IH0sCi0gICAgeyAweDAwMDA5YTcwLCAweDAwMDBhMzgwLCAweDAwMDBhMzgwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0IH0sCi0gICAgeyAweDAwMDA5YTc0LCAweDAwMDBhMzg0LCAweDAwMDBhMzg0LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4IH0sCi0gICAgeyAweDAwMDA5YTc4LCAweDAwMDBhMzg4LCAweDAwMDBhMzg4LCAweDAwMDA4MjI0LCAweDAwMDA4MjI0LCAweDAwMDA4MjI0IH0sCi0gICAgeyAweDAwMDA5YTdjLCAweDAwMDBhMzhjLCAweDAwMDBhMzhjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwIH0sCi0gICAgeyAweDAwMDA5YTgwLCAweDAwMDBhMzkwLCAweDAwMDBhMzkwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwIH0sCi0gICAgeyAweDAwMDA5YTg0LCAweDAwMDBhMzk0LCAweDAwMDBhMzk0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0IH0sCi0gICAgeyAweDAwMDA5YTg4LCAweDAwMDBhNzgwLCAweDAwMDBhNzgwLCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4IH0sCi0gICAgeyAweDAwMDA5YThjLCAweDAwMDBhNzg0LCAweDAwMDBhNzg0LCAweDAwMDA4MzBjLCAweDAwMDA4MzBjLCAweDAwMDA4MzBjIH0sCi0gICAgeyAweDAwMDA5YTkwLCAweDAwMDBhNzg4LCAweDAwMDBhNzg4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MzgwIH0sCi0gICAgeyAweDAwMDA5YTk0LCAweDAwMDBhNzhjLCAweDAwMDBhNzhjLCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0IH0sCi0gICAgeyAweDAwMDA5YTk4LCAweDAwMDBhNzkwLCAweDAwMDBhNzkwLCAweDAwMDA4NzAwLCAweDAwMDA4NzAwLCAweDAwMDA4NzAwIH0sCi0gICAgeyAweDAwMDA5YTljLCAweDAwMDBhNzk0LCAweDAwMDBhNzk0LCAweDAwMDA4NzA0LCAweDAwMDA4NzA0LCAweDAwMDA4NzA0IH0sCi0gICAgeyAweDAwMDA5YWEwLCAweDAwMDBhYjg0LCAweDAwMDBhYjg0LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4IH0sCi0gICAgeyAweDAwMDA5YWE0LCAweDAwMDBhYjg4LCAweDAwMDBhYjg4LCAweDAwMDA4NzBjLCAweDAwMDA4NzBjLCAweDAwMDA4NzBjIH0sCi0gICAgeyAweDAwMDA5YWE4LCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDA4NzgwLCAweDAwMDA4NzgwLCAweDAwMDA4NzgwIH0sCi0gICAgeyAweDAwMDA5YWFjLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0IH0sCi0gICAgeyAweDAwMDA5YWIwLCAweDAwMDBhYjk0LCAweDAwMDBhYjk0LCAweDAwMDA4YjAwLCAweDAwMDA4YjAwLCAweDAwMDA4YjAwIH0sCi0gICAgeyAweDAwMDA5YWI0LCAweDAwMDBhZjgwLCAweDAwMDBhZjgwLCAweDAwMDA4YjA0LCAweDAwMDA4YjA0LCAweDAwMDA4YjA0IH0sCi0gICAgeyAweDAwMDA5YWI4LCAweDAwMDBhZjg0LCAweDAwMDBhZjg0LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4IH0sCi0gICAgeyAweDAwMDA5YWJjLCAweDAwMDBhZjg4LCAweDAwMDBhZjg4LCAweDAwMDA4YjBjLCAweDAwMDA4YjBjLCAweDAwMDA4YjBjIH0sCi0gICAgeyAweDAwMDA5YWMwLCAweDAwMDBhZjhjLCAweDAwMDBhZjhjLCAweDAwMDA4YjEwLCAweDAwMDA4YjEwLCAweDAwMDA4YjEwIH0sCi0gICAgeyAweDAwMDA5YWM0LCAweDAwMDBhZjkwLCAweDAwMDBhZjkwLCAweDAwMDA4YjE0LCAweDAwMDA4YjE0LCAweDAwMDA4YjE0IH0sCi0gICAgeyAweDAwMDA5YWM4LCAweDAwMDBhZjk0LCAweDAwMDBhZjk0LCAweDAwMDA4YjAxLCAweDAwMDA4YjAxLCAweDAwMDA4YjAxIH0sCi0gICAgeyAweDAwMDA5YWNjLCAweDAwMDBiMzgwLCAweDAwMDBiMzgwLCAweDAwMDA4YjA1LCAweDAwMDA4YjA1LCAweDAwMDA4YjA1IH0sCi0gICAgeyAweDAwMDA5YWQwLCAweDAwMDBiMzg0LCAweDAwMDBiMzg0LCAweDAwMDA4YjA5LCAweDAwMDA4YjA5LCAweDAwMDA4YjA5IH0sCi0gICAgeyAweDAwMDA5YWQ0LCAweDAwMDBiMzg4LCAweDAwMDBiMzg4LCAweDAwMDA4YjBkLCAweDAwMDA4YjBkLCAweDAwMDA4YjBkIH0sCi0gICAgeyAweDAwMDA5YWQ4LCAweDAwMDBiMzhjLCAweDAwMDBiMzhjLCAweDAwMDA4YjExLCAweDAwMDA4YjExLCAweDAwMDA4YjExIH0sCi0gICAgeyAweDAwMDA5YWRjLCAweDAwMDBiMzkwLCAweDAwMDBiMzkwLCAweDAwMDA4YjE1LCAweDAwMDA4YjE1LCAweDAwMDA4YjE1IH0sCi0gICAgeyAweDAwMDA5YWUwLCAweDAwMDBiMzk0LCAweDAwMDBiMzk0LCAweDAwMDA4YjAyLCAweDAwMDA4YjAyLCAweDAwMDA4YjAyIH0sCi0gICAgeyAweDAwMDA5YWU0LCAweDAwMDBiMzk4LCAweDAwMDBiMzk4LCAweDAwMDA4YjA2LCAweDAwMDA4YjA2LCAweDAwMDA4YjA2IH0sCi0gICAgeyAweDAwMDA5YWU4LCAweDAwMDBiNzgwLCAweDAwMDBiNzgwLCAweDAwMDA4YjBhLCAweDAwMDA4YjBhLCAweDAwMDA4YjBhIH0sCi0gICAgeyAweDAwMDA5YWVjLCAweDAwMDBiNzg0LCAweDAwMDBiNzg0LCAweDAwMDA4YjBlLCAweDAwMDA4YjBlLCAweDAwMDA4YjBlIH0sCi0gICAgeyAweDAwMDA5YWYwLCAweDAwMDBiNzg4LCAweDAwMDBiNzg4LCAweDAwMDA4YjEyLCAweDAwMDA4YjEyLCAweDAwMDA4YjEyIH0sCi0gICAgeyAweDAwMDA5YWY0LCAweDAwMDBiNzhjLCAweDAwMDBiNzhjLCAweDAwMDA4YjE2LCAweDAwMDA4YjE2LCAweDAwMDA4YjE2IH0sCi0gICAgeyAweDAwMDA5YWY4LCAweDAwMDBiNzkwLCAweDAwMDBiNzkwLCAweDAwMDA4YjAzLCAweDAwMDA4YjAzLCAweDAwMDA4YjAzIH0sCi0gICAgeyAweDAwMDA5YWZjLCAweDAwMDBiNzk0LCAweDAwMDBiNzk0LCAweDAwMDA4YjA3LCAweDAwMDA4YjA3LCAweDAwMDA4YjA3IH0sCi0gICAgeyAweDAwMDA5YjAwLCAweDAwMDBiNzk4LCAweDAwMDBiNzk4LCAweDAwMDA4YjBiLCAweDAwMDA4YjBiLCAweDAwMDA4YjBiIH0sCi0gICAgeyAweDAwMDA5YjA0LCAweDAwMDBkNzg0LCAweDAwMDBkNzg0LCAweDAwMDA4YjBmLCAweDAwMDA4YjBmLCAweDAwMDA4YjBmIH0sCi0gICAgeyAweDAwMDA5YjA4LCAweDAwMDBkNzg4LCAweDAwMDBkNzg4LCAweDAwMDA4YjEzLCAweDAwMDA4YjEzLCAweDAwMDA4YjEzIH0sCi0gICAgeyAweDAwMDA5YjBjLCAweDAwMDBkNzhjLCAweDAwMDBkNzhjLCAweDAwMDA4YjE3LCAweDAwMDA4YjE3LCAweDAwMDA4YjE3IH0sCi0gICAgeyAweDAwMDA5YjEwLCAweDAwMDBkNzkwLCAweDAwMDBkNzkwLCAweDAwMDA4YjIzLCAweDAwMDA4YjIzLCAweDAwMDA4YjIzIH0sCi0gICAgeyAweDAwMDA5YjE0LCAweDAwMDBmNzgwLCAweDAwMDBmNzgwLCAweDAwMDA4YjI3LCAweDAwMDA4YjI3LCAweDAwMDA4YjI3IH0sCi0gICAgeyAweDAwMDA5YjE4LCAweDAwMDBmNzg0LCAweDAwMDBmNzg0LCAweDAwMDA4YjJiLCAweDAwMDA4YjJiLCAweDAwMDA4YjJiIH0sCi0gICAgeyAweDAwMDA5YjFjLCAweDAwMDBmNzg4LCAweDAwMDBmNzg4LCAweDAwMDA4YjJmLCAweDAwMDA4YjJmLCAweDAwMDA4YjJmIH0sCi0gICAgeyAweDAwMDA5YjIwLCAweDAwMDBmNzhjLCAweDAwMDBmNzhjLCAweDAwMDA4YjMzLCAweDAwMDA4YjMzLCAweDAwMDA4YjMzIH0sCi0gICAgeyAweDAwMDA5YjI0LCAweDAwMDBmNzkwLCAweDAwMDBmNzkwLCAweDAwMDA4YjM3LCAweDAwMDA4YjM3LCAweDAwMDA4YjM3IH0sCi0gICAgeyAweDAwMDA5YjI4LCAweDAwMDBmNzk0LCAweDAwMDBmNzk0LCAweDAwMDA4YjQzLCAweDAwMDA4YjQzLCAweDAwMDA4YjQzIH0sCi0gICAgeyAweDAwMDA5YjJjLCAweDAwMDBmN2E0LCAweDAwMDBmN2E0LCAweDAwMDA4YjQ3LCAweDAwMDA4YjQ3LCAweDAwMDA4YjQ3IH0sCi0gICAgeyAweDAwMDA5YjMwLCAweDAwMDBmN2E4LCAweDAwMDBmN2E4LCAweDAwMDA4YjRiLCAweDAwMDA4YjRiLCAweDAwMDA4YjRiIH0sCi0gICAgeyAweDAwMDA5YjM0LCAweDAwMDBmN2FjLCAweDAwMDBmN2FjLCAweDAwMDA4YjRmLCAweDAwMDA4YjRmLCAweDAwMDA4YjRmIH0sCi0gICAgeyAweDAwMDA5YjM4LCAweDAwMDBmN2IwLCAweDAwMDBmN2IwLCAweDAwMDA4YjUzLCAweDAwMDA4YjUzLCAweDAwMDA4YjUzIH0sCi0gICAgeyAweDAwMDA5YjNjLCAweDAwMDBmN2I0LCAweDAwMDBmN2I0LCAweDAwMDA4YjU3LCAweDAwMDA4YjU3LCAweDAwMDA4YjU3IH0sCi0gICAgeyAweDAwMDA5YjQwLCAweDAwMDBmN2ExLCAweDAwMDBmN2ExLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjQ0LCAweDAwMDBmN2E1LCAweDAwMDBmN2E1LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjQ4LCAweDAwMDBmN2E5LCAweDAwMDBmN2E5LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjRjLCAweDAwMDBmN2FkLCAweDAwMDBmN2FkLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjUwLCAweDAwMDBmN2IxLCAweDAwMDBmN2IxLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjU0LCAweDAwMDBmN2I1LCAweDAwMDBmN2I1LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjU4LCAweDAwMDBmN2M1LCAweDAwMDBmN2M1LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjVjLCAweDAwMDBmN2M5LCAweDAwMDBmN2M5LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjYwLCAweDAwMDBmN2NkLCAweDAwMDBmN2NkLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjY0LCAweDAwMDBmN2QxLCAweDAwMDBmN2QxLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjY4LCAweDAwMDBmN2Q1LCAweDAwMDBmN2Q1LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjZjLCAweDAwMDBmN2MyLCAweDAwMDBmN2MyLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjcwLCAweDAwMDBmN2M2LCAweDAwMDBmN2M2LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5Yjc0LCAweDAwMDBmN2NhLCAweDAwMDBmN2NhLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5Yjc4LCAweDAwMDBmN2NlLCAweDAwMDBmN2NlLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjdjLCAweDAwMDBmN2QyLCAweDAwMDBmN2QyLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjgwLCAweDAwMDBmN2Q2LCAweDAwMDBmN2Q2LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5Yjg0LCAweDAwMDBmN2MzLCAweDAwMDBmN2MzLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5Yjg4LCAweDAwMDBmN2M3LCAweDAwMDBmN2M3LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjhjLCAweDAwMDBmN2NiLCAweDAwMDBmN2NiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjkwLCAweDAwMDBmN2QzLCAweDAwMDBmN2QzLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5Yjk0LCAweDAwMDBmN2Q3LCAweDAwMDBmN2Q3LCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5Yjk4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YjljLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmEwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmE0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmE4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmFjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmIwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmI0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmI4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmJjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmMwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmM0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmM4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmNjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmQwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmQ0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmQ4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmRjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmUwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmU0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmU4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmVjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmYwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmY0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmY4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5YmZjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YjViLCAweDAwMDA4YjViLCAweDAwMDA4YjViIH0sCi0gICAgeyAweDAwMDA5ODQ4LCAweDAwMDAxMDY2LCAweDAwMDAxMDY2LCAweDAwMDAxMDUwLCAweDAwMDAxMDUwLCAweDAwMDAxMDUwIH0sCi0gICAgeyAweDAwMDBhODQ4LCAweDAwMDAxMDY2LCAweDAwMDAxMDY2LCAweDAwMDAxMDUwLCAweDAwMDAxMDUwLCAweDAwMDAxMDUwIH0sCisJezB4MDAwMDlhMDAsIDB4MDAwMDgxODQsIDB4MDAwMDgxODQsIDB4MDAwMDAyOTAsIDB4MDAwMDAyOTAsIDB4MDAwMDAyOTB9LAorCXsweDAwMDA5YTA0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDAwMzAwLCAweDAwMDAwMzAwLCAweDAwMDAwMzAwfSwKKwl7MHgwMDAwOWEwOCwgMHgwMDAwODE4YywgMHgwMDAwODE4YywgMHgwMDAwMDMwNCwgMHgwMDAwMDMwNCwgMHgwMDAwMDMwNH0sCisJezB4MDAwMDlhMGMsIDB4MDAwMDgxOTAsIDB4MDAwMDgxOTAsIDB4MDAwMDAzMDgsIDB4MDAwMDAzMDgsIDB4MDAwMDAzMDh9LAorCXsweDAwMDA5YTEwLCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDAwMzBjLCAweDAwMDAwMzBjLCAweDAwMDAwMzBjfSwKKwl7MHgwMDAwOWExNCwgMHgwMDAwODIwMCwgMHgwMDAwODIwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMH0sCisJezB4MDAwMDlhMTgsIDB4MDAwMDgyMDQsIDB4MDAwMDgyMDQsIDB4MDAwMDgwMDQsIDB4MDAwMDgwMDQsIDB4MDAwMDgwMDR9LAorCXsweDAwMDA5YTFjLCAweDAwMDA4MjA4LCAweDAwMDA4MjA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4fSwKKwl7MHgwMDAwOWEyMCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODAwYywgMHgwMDAwODAwYywgMHgwMDAwODAwY30sCisJezB4MDAwMDlhMjQsIDB4MDAwMDgyMTAsIDB4MDAwMDgyMTAsIDB4MDAwMDgwODAsIDB4MDAwMDgwODAsIDB4MDAwMDgwODB9LAorCXsweDAwMDA5YTI4LCAweDAwMDA4MjE0LCAweDAwMDA4MjE0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0fSwKKwl7MHgwMDAwOWEyYywgMHgwMDAwODI4MCwgMHgwMDAwODI4MCwgMHgwMDAwODA4OCwgMHgwMDAwODA4OCwgMHgwMDAwODA4OH0sCisJezB4MDAwMDlhMzAsIDB4MDAwMDgyODQsIDB4MDAwMDgyODQsIDB4MDAwMDgwOGMsIDB4MDAwMDgwOGMsIDB4MDAwMDgwOGN9LAorCXsweDAwMDA5YTM0LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4LCAweDAwMDA4MTAwLCAweDAwMDA4MTAwLCAweDAwMDA4MTAwfSwKKwl7MHgwMDAwOWEzOCwgMHgwMDAwODI4YywgMHgwMDAwODI4YywgMHgwMDAwODEwNCwgMHgwMDAwODEwNCwgMHgwMDAwODEwNH0sCisJezB4MDAwMDlhM2MsIDB4MDAwMDgyOTAsIDB4MDAwMDgyOTAsIDB4MDAwMDgxMDgsIDB4MDAwMDgxMDgsIDB4MDAwMDgxMDh9LAorCXsweDAwMDA5YTQwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjfSwKKwl7MHgwMDAwOWE0NCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCwgMHgwMDAwODExMCwgMHgwMDAwODExMCwgMHgwMDAwODExMH0sCisJezB4MDAwMDlhNDgsIDB4MDAwMDgzMDgsIDB4MDAwMDgzMDgsIDB4MDAwMDgxMTQsIDB4MDAwMDgxMTQsIDB4MDAwMDgxMTR9LAorCXsweDAwMDA5YTRjLCAweDAwMDA4MzBjLCAweDAwMDA4MzBjLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwfSwKKwl7MHgwMDAwOWE1MCwgMHgwMDAwODMxMCwgMHgwMDAwODMxMCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NH0sCisJezB4MDAwMDlhNTQsIDB4MDAwMDgzMTQsIDB4MDAwMDgzMTQsIDB4MDAwMDgxODgsIDB4MDAwMDgxODgsIDB4MDAwMDgxODh9LAorCXsweDAwMDA5YTU4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MThjLCAweDAwMDA4MThjLCAweDAwMDA4MThjfSwKKwl7MHgwMDAwOWE1YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwODE5MCwgMHgwMDAwODE5MCwgMHgwMDAwODE5MH0sCisJezB4MDAwMDlhNjAsIDB4MDAwMDgzODgsIDB4MDAwMDgzODgsIDB4MDAwMDgxOTQsIDB4MDAwMDgxOTQsIDB4MDAwMDgxOTR9LAorCXsweDAwMDA5YTY0LCAweDAwMDA4MzhjLCAweDAwMDA4MzhjLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwfSwKKwl7MHgwMDAwOWE2OCwgMHgwMDAwODM5MCwgMHgwMDAwODM5MCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODIwY30sCisJezB4MDAwMDlhNmMsIDB4MDAwMDgzOTQsIDB4MDAwMDgzOTQsIDB4MDAwMDgxYTgsIDB4MDAwMDgxYTgsIDB4MDAwMDgxYTh9LAorCXsweDAwMDA5YTcwLCAweDAwMDBhMzgwLCAweDAwMDBhMzgwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0fSwKKwl7MHgwMDAwOWE3NCwgMHgwMDAwYTM4NCwgMHgwMDAwYTM4NCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OH0sCisJezB4MDAwMDlhNzgsIDB4MDAwMGEzODgsIDB4MDAwMGEzODgsIDB4MDAwMDgyMjQsIDB4MDAwMDgyMjQsIDB4MDAwMDgyMjR9LAorCXsweDAwMDA5YTdjLCAweDAwMDBhMzhjLCAweDAwMDBhMzhjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwfSwKKwl7MHgwMDAwOWE4MCwgMHgwMDAwYTM5MCwgMHgwMDAwYTM5MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMH0sCisJezB4MDAwMDlhODQsIDB4MDAwMGEzOTQsIDB4MDAwMGEzOTQsIDB4MDAwMDgzMDQsIDB4MDAwMDgzMDQsIDB4MDAwMDgzMDR9LAorCXsweDAwMDA5YTg4LCAweDAwMDBhNzgwLCAweDAwMDBhNzgwLCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4fSwKKwl7MHgwMDAwOWE4YywgMHgwMDAwYTc4NCwgMHgwMDAwYTc4NCwgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwODMwY30sCisJezB4MDAwMDlhOTAsIDB4MDAwMGE3ODgsIDB4MDAwMGE3ODgsIDB4MDAwMDgzODAsIDB4MDAwMDgzODAsIDB4MDAwMDgzODB9LAorCXsweDAwMDA5YTk0LCAweDAwMDBhNzhjLCAweDAwMDBhNzhjLCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0fSwKKwl7MHgwMDAwOWE5OCwgMHgwMDAwYTc5MCwgMHgwMDAwYTc5MCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMH0sCisJezB4MDAwMDlhOWMsIDB4MDAwMGE3OTQsIDB4MDAwMGE3OTQsIDB4MDAwMDg3MDQsIDB4MDAwMDg3MDQsIDB4MDAwMDg3MDR9LAorCXsweDAwMDA5YWEwLCAweDAwMDBhYjg0LCAweDAwMDBhYjg0LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4fSwKKwl7MHgwMDAwOWFhNCwgMHgwMDAwYWI4OCwgMHgwMDAwYWI4OCwgMHgwMDAwODcwYywgMHgwMDAwODcwYywgMHgwMDAwODcwY30sCisJezB4MDAwMDlhYTgsIDB4MDAwMGFiOGMsIDB4MDAwMGFiOGMsIDB4MDAwMDg3ODAsIDB4MDAwMDg3ODAsIDB4MDAwMDg3ODB9LAorCXsweDAwMDA5YWFjLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0fSwKKwl7MHgwMDAwOWFiMCwgMHgwMDAwYWI5NCwgMHgwMDAwYWI5NCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMH0sCisJezB4MDAwMDlhYjQsIDB4MDAwMGFmODAsIDB4MDAwMGFmODAsIDB4MDAwMDhiMDQsIDB4MDAwMDhiMDQsIDB4MDAwMDhiMDR9LAorCXsweDAwMDA5YWI4LCAweDAwMDBhZjg0LCAweDAwMDBhZjg0LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4fSwKKwl7MHgwMDAwOWFiYywgMHgwMDAwYWY4OCwgMHgwMDAwYWY4OCwgMHgwMDAwOGIwYywgMHgwMDAwOGIwYywgMHgwMDAwOGIwY30sCisJezB4MDAwMDlhYzAsIDB4MDAwMGFmOGMsIDB4MDAwMGFmOGMsIDB4MDAwMDhiMTAsIDB4MDAwMDhiMTAsIDB4MDAwMDhiMTB9LAorCXsweDAwMDA5YWM0LCAweDAwMDBhZjkwLCAweDAwMDBhZjkwLCAweDAwMDA4YjgwLCAweDAwMDA4YjgwLCAweDAwMDA4YjgwfSwKKwl7MHgwMDAwOWFjOCwgMHgwMDAwYWY5NCwgMHgwMDAwYWY5NCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NH0sCisJezB4MDAwMDlhY2MsIDB4MDAwMGIzODAsIDB4MDAwMGIzODAsIDB4MDAwMDhiODgsIDB4MDAwMDhiODgsIDB4MDAwMDhiODh9LAorCXsweDAwMDA5YWQwLCAweDAwMDBiMzg0LCAweDAwMDBiMzg0LCAweDAwMDA4YjhjLCAweDAwMDA4YjhjLCAweDAwMDA4YjhjfSwKKwl7MHgwMDAwOWFkNCwgMHgwMDAwYjM4OCwgMHgwMDAwYjM4OCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MH0sCisJezB4MDAwMDlhZDgsIDB4MDAwMGIzOGMsIDB4MDAwMGIzOGMsIDB4MDAwMDhiOTQsIDB4MDAwMDhiOTQsIDB4MDAwMDhiOTR9LAorCXsweDAwMDA5YWRjLCAweDAwMDBiMzkwLCAweDAwMDBiMzkwLCAweDAwMDA4Yjk4LCAweDAwMDA4Yjk4LCAweDAwMDA4Yjk4fSwKKwl7MHgwMDAwOWFlMCwgMHgwMDAwYjM5NCwgMHgwMDAwYjM5NCwgMHgwMDAwOGJhNCwgMHgwMDAwOGJhNCwgMHgwMDAwOGJhNH0sCisJezB4MDAwMDlhZTQsIDB4MDAwMGIzOTgsIDB4MDAwMGIzOTgsIDB4MDAwMDhiYTgsIDB4MDAwMDhiYTgsIDB4MDAwMDhiYTh9LAorCXsweDAwMDA5YWU4LCAweDAwMDBiNzgwLCAweDAwMDBiNzgwLCAweDAwMDA4YmFjLCAweDAwMDA4YmFjLCAweDAwMDA4YmFjfSwKKwl7MHgwMDAwOWFlYywgMHgwMDAwYjc4NCwgMHgwMDAwYjc4NCwgMHgwMDAwOGJiMCwgMHgwMDAwOGJiMCwgMHgwMDAwOGJiMH0sCisJezB4MDAwMDlhZjAsIDB4MDAwMGI3ODgsIDB4MDAwMGI3ODgsIDB4MDAwMDhiYjQsIDB4MDAwMDhiYjQsIDB4MDAwMDhiYjR9LAorCXsweDAwMDA5YWY0LCAweDAwMDBiNzhjLCAweDAwMDBiNzhjLCAweDAwMDA4YmExLCAweDAwMDA4YmExLCAweDAwMDA4YmExfSwKKwl7MHgwMDAwOWFmOCwgMHgwMDAwYjc5MCwgMHgwMDAwYjc5MCwgMHgwMDAwOGJhNSwgMHgwMDAwOGJhNSwgMHgwMDAwOGJhNX0sCisJezB4MDAwMDlhZmMsIDB4MDAwMGI3OTQsIDB4MDAwMGI3OTQsIDB4MDAwMDhiYTksIDB4MDAwMDhiYTksIDB4MDAwMDhiYTl9LAorCXsweDAwMDA5YjAwLCAweDAwMDBiNzk4LCAweDAwMDBiNzk4LCAweDAwMDA4YmFkLCAweDAwMDA4YmFkLCAweDAwMDA4YmFkfSwKKwl7MHgwMDAwOWIwNCwgMHgwMDAwZDc4NCwgMHgwMDAwZDc4NCwgMHgwMDAwOGJiMSwgMHgwMDAwOGJiMSwgMHgwMDAwOGJiMX0sCisJezB4MDAwMDliMDgsIDB4MDAwMGQ3ODgsIDB4MDAwMGQ3ODgsIDB4MDAwMDhiYjUsIDB4MDAwMDhiYjUsIDB4MDAwMDhiYjV9LAorCXsweDAwMDA5YjBjLCAweDAwMDBkNzhjLCAweDAwMDBkNzhjLCAweDAwMDA4YmEyLCAweDAwMDA4YmEyLCAweDAwMDA4YmEyfSwKKwl7MHgwMDAwOWIxMCwgMHgwMDAwZDc5MCwgMHgwMDAwZDc5MCwgMHgwMDAwOGJhNiwgMHgwMDAwOGJhNiwgMHgwMDAwOGJhNn0sCisJezB4MDAwMDliMTQsIDB4MDAwMGY3ODAsIDB4MDAwMGY3ODAsIDB4MDAwMDhiYWEsIDB4MDAwMDhiYWEsIDB4MDAwMDhiYWF9LAorCXsweDAwMDA5YjE4LCAweDAwMDBmNzg0LCAweDAwMDBmNzg0LCAweDAwMDA4YmFlLCAweDAwMDA4YmFlLCAweDAwMDA4YmFlfSwKKwl7MHgwMDAwOWIxYywgMHgwMDAwZjc4OCwgMHgwMDAwZjc4OCwgMHgwMDAwOGJiMiwgMHgwMDAwOGJiMiwgMHgwMDAwOGJiMn0sCisJezB4MDAwMDliMjAsIDB4MDAwMGY3OGMsIDB4MDAwMGY3OGMsIDB4MDAwMDhiYjYsIDB4MDAwMDhiYjYsIDB4MDAwMDhiYjZ9LAorCXsweDAwMDA5YjI0LCAweDAwMDBmNzkwLCAweDAwMDBmNzkwLCAweDAwMDA4YmEzLCAweDAwMDA4YmEzLCAweDAwMDA4YmEzfSwKKwl7MHgwMDAwOWIyOCwgMHgwMDAwZjc5NCwgMHgwMDAwZjc5NCwgMHgwMDAwOGJhNywgMHgwMDAwOGJhNywgMHgwMDAwOGJhN30sCisJezB4MDAwMDliMmMsIDB4MDAwMGY3YTQsIDB4MDAwMGY3YTQsIDB4MDAwMDhiYWIsIDB4MDAwMDhiYWIsIDB4MDAwMDhiYWJ9LAorCXsweDAwMDA5YjMwLCAweDAwMDBmN2E4LCAweDAwMDBmN2E4LCAweDAwMDA4YmFmLCAweDAwMDA4YmFmLCAweDAwMDA4YmFmfSwKKwl7MHgwMDAwOWIzNCwgMHgwMDAwZjdhYywgMHgwMDAwZjdhYywgMHgwMDAwOGJiMywgMHgwMDAwOGJiMywgMHgwMDAwOGJiM30sCisJezB4MDAwMDliMzgsIDB4MDAwMGY3YjAsIDB4MDAwMGY3YjAsIDB4MDAwMDhiYjcsIDB4MDAwMDhiYjcsIDB4MDAwMDhiYjd9LAorCXsweDAwMDA5YjNjLCAweDAwMDBmN2I0LCAweDAwMDBmN2I0LCAweDAwMDA4YmMzLCAweDAwMDA4YmMzLCAweDAwMDA4YmMzfSwKKwl7MHgwMDAwOWI0MCwgMHgwMDAwZjdhMSwgMHgwMDAwZjdhMSwgMHgwMDAwOGJjNywgMHgwMDAwOGJjNywgMHgwMDAwOGJjN30sCisJezB4MDAwMDliNDQsIDB4MDAwMGY3YTUsIDB4MDAwMGY3YTUsIDB4MDAwMDhiY2IsIDB4MDAwMDhiY2IsIDB4MDAwMDhiY2J9LAorCXsweDAwMDA5YjQ4LCAweDAwMDBmN2E5LCAweDAwMDBmN2E5LCAweDAwMDA4YmNmLCAweDAwMDA4YmNmLCAweDAwMDA4YmNmfSwKKwl7MHgwMDAwOWI0YywgMHgwMDAwZjdhZCwgMHgwMDAwZjdhZCwgMHgwMDAwOGJkMywgMHgwMDAwOGJkMywgMHgwMDAwOGJkM30sCisJezB4MDAwMDliNTAsIDB4MDAwMGY3YjEsIDB4MDAwMGY3YjEsIDB4MDAwMDhiZDcsIDB4MDAwMDhiZDcsIDB4MDAwMDhiZDd9LAorCXsweDAwMDA5YjU0LCAweDAwMDBmN2I1LCAweDAwMDBmN2I1LCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWI1OCwgMHgwMDAwZjdjNSwgMHgwMDAwZjdjNSwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliNWMsIDB4MDAwMGY3YzksIDB4MDAwMGY3YzksIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YjYwLCAweDAwMDBmN2NkLCAweDAwMDBmN2NkLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWI2NCwgMHgwMDAwZjdkMSwgMHgwMDAwZjdkMSwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliNjgsIDB4MDAwMGY3ZDUsIDB4MDAwMGY3ZDUsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YjZjLCAweDAwMDBmN2MyLCAweDAwMDBmN2MyLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWI3MCwgMHgwMDAwZjdjNiwgMHgwMDAwZjdjNiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliNzQsIDB4MDAwMGY3Y2EsIDB4MDAwMGY3Y2EsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5Yjc4LCAweDAwMDBmN2NlLCAweDAwMDBmN2NlLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWI3YywgMHgwMDAwZjdkMiwgMHgwMDAwZjdkMiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliODAsIDB4MDAwMGY3ZDYsIDB4MDAwMGY3ZDYsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5Yjg0LCAweDAwMDBmN2MzLCAweDAwMDBmN2MzLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWI4OCwgMHgwMDAwZjdjNywgMHgwMDAwZjdjNywgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliOGMsIDB4MDAwMGY3Y2IsIDB4MDAwMGY3Y2IsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YjkwLCAweDAwMDBmN2QzLCAweDAwMDBmN2QzLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWI5NCwgMHgwMDAwZjdkNywgMHgwMDAwZjdkNywgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliOTgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YjljLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJhMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliYTQsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmE4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJhYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliYjAsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmI0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJiOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliYmMsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmMwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJjNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliYzgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmNjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJkMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliZDQsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmQ4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJkYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliZTAsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmU0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJlOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliZWMsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmYwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOWJmNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYiwgMHgwMDAwOGJkYn0sCisJezB4MDAwMDliZjgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGIsIDB4MDAwMDhiZGJ9LAorCXsweDAwMDA5YmZjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRiLCAweDAwMDA4YmRifSwKKwl7MHgwMDAwOTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMTA1NSwgMHgwMDAwMTA1NSwgMHgwMDAwMTA1NX0sCisJezB4MDAwMGE4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTUsIDB4MDAwMDEwNTUsIDB4MDAwMDEwNTV9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODBNb2Rlc19vcmlnaW5hbF9yeGdhaW5fOTI4MF8yW11bNl0gPSB7Ci0gICAgeyAweDAwMDA5YTAwLCAweDAwMDA4MTg0LCAweDAwMDA4MTg0LCAweDAwMDAwMjkwLCAweDAwMDAwMjkwLCAweDAwMDAwMjkwIH0sCi0gICAgeyAweDAwMDA5YTA0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDAwMzAwLCAweDAwMDAwMzAwLCAweDAwMDAwMzAwIH0sCi0gICAgeyAweDAwMDA5YTA4LCAweDAwMDA4MThjLCAweDAwMDA4MThjLCAweDAwMDAwMzA0LCAweDAwMDAwMzA0LCAweDAwMDAwMzA0IH0sCi0gICAgeyAweDAwMDA5YTBjLCAweDAwMDA4MTkwLCAweDAwMDA4MTkwLCAweDAwMDAwMzA4LCAweDAwMDAwMzA4LCAweDAwMDAwMzA4IH0sCi0gICAgeyAweDAwMDA5YTEwLCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDAwMzBjLCAweDAwMDAwMzBjLCAweDAwMDAwMzBjIH0sCi0gICAgeyAweDAwMDA5YTE0LCAweDAwMDA4MjAwLCAweDAwMDA4MjAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwIH0sCi0gICAgeyAweDAwMDA5YTE4LCAweDAwMDA4MjA0LCAweDAwMDA4MjA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0IH0sCi0gICAgeyAweDAwMDA5YTFjLCAweDAwMDA4MjA4LCAweDAwMDA4MjA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4IH0sCi0gICAgeyAweDAwMDA5YTIwLCAweDAwMDA4MjBjLCAweDAwMDA4MjBjLCAweDAwMDA4MDBjLCAweDAwMDA4MDBjLCAweDAwMDA4MDBjIH0sCi0gICAgeyAweDAwMDA5YTI0LCAweDAwMDA4MjEwLCAweDAwMDA4MjEwLCAweDAwMDA4MDgwLCAweDAwMDA4MDgwLCAweDAwMDA4MDgwIH0sCi0gICAgeyAweDAwMDA5YTI4LCAweDAwMDA4MjE0LCAweDAwMDA4MjE0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0IH0sCi0gICAgeyAweDAwMDA5YTJjLCAweDAwMDA4MjgwLCAweDAwMDA4MjgwLCAweDAwMDA4MDg4LCAweDAwMDA4MDg4LCAweDAwMDA4MDg4IH0sCi0gICAgeyAweDAwMDA5YTMwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4MDhjLCAweDAwMDA4MDhjLCAweDAwMDA4MDhjIH0sCi0gICAgeyAweDAwMDA5YTM0LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4LCAweDAwMDA4MTAwLCAweDAwMDA4MTAwLCAweDAwMDA4MTAwIH0sCi0gICAgeyAweDAwMDA5YTM4LCAweDAwMDA4MjhjLCAweDAwMDA4MjhjLCAweDAwMDA4MTA0LCAweDAwMDA4MTA0LCAweDAwMDA4MTA0IH0sCi0gICAgeyAweDAwMDA5YTNjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MTA4LCAweDAwMDA4MTA4LCAweDAwMDA4MTA4IH0sCi0gICAgeyAweDAwMDA5YTQwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjIH0sCi0gICAgeyAweDAwMDA5YTQ0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0LCAweDAwMDA4MTEwLCAweDAwMDA4MTEwLCAweDAwMDA4MTEwIH0sCi0gICAgeyAweDAwMDA5YTQ4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MTE0LCAweDAwMDA4MTE0LCAweDAwMDA4MTE0IH0sCi0gICAgeyAweDAwMDA5YTRjLCAweDAwMDA4MzBjLCAweDAwMDA4MzBjLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwIH0sCi0gICAgeyAweDAwMDA5YTUwLCAweDAwMDA4MzEwLCAweDAwMDA4MzEwLCAweDAwMDA4MTg0LCAweDAwMDA4MTg0LCAweDAwMDA4MTg0IH0sCi0gICAgeyAweDAwMDA5YTU0LCAweDAwMDA4MzE0LCAweDAwMDA4MzE0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4IH0sCi0gICAgeyAweDAwMDA5YTU4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MThjLCAweDAwMDA4MThjLCAweDAwMDA4MThjIH0sCi0gICAgeyAweDAwMDA5YTVjLCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0LCAweDAwMDA4MTkwLCAweDAwMDA4MTkwLCAweDAwMDA4MTkwIH0sCi0gICAgeyAweDAwMDA5YTYwLCAweDAwMDA4Mzg4LCAweDAwMDA4Mzg4LCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDA4MTk0IH0sCi0gICAgeyAweDAwMDA5YTY0LCAweDAwMDA4MzhjLCAweDAwMDA4MzhjLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwIH0sCi0gICAgeyAweDAwMDA5YTY4LCAweDAwMDA4MzkwLCAweDAwMDA4MzkwLCAweDAwMDA4MjBjLCAweDAwMDA4MjBjLCAweDAwMDA4MjBjIH0sCi0gICAgeyAweDAwMDA5YTZjLCAweDAwMDA4Mzk0LCAweDAwMDA4Mzk0LCAweDAwMDA4MWE4LCAweDAwMDA4MWE4LCAweDAwMDA4MWE4IH0sCi0gICAgeyAweDAwMDA5YTcwLCAweDAwMDBhMzgwLCAweDAwMDBhMzgwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0IH0sCi0gICAgeyAweDAwMDA5YTc0LCAweDAwMDBhMzg0LCAweDAwMDBhMzg0LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4IH0sCi0gICAgeyAweDAwMDA5YTc4LCAweDAwMDBhMzg4LCAweDAwMDBhMzg4LCAweDAwMDA4MjI0LCAweDAwMDA4MjI0LCAweDAwMDA4MjI0IH0sCi0gICAgeyAweDAwMDA5YTdjLCAweDAwMDBhMzhjLCAweDAwMDBhMzhjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwIH0sCi0gICAgeyAweDAwMDA5YTgwLCAweDAwMDBhMzkwLCAweDAwMDBhMzkwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwIH0sCi0gICAgeyAweDAwMDA5YTg0LCAweDAwMDBhMzk0LCAweDAwMDBhMzk0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0IH0sCi0gICAgeyAweDAwMDA5YTg4LCAweDAwMDBhNzgwLCAweDAwMDBhNzgwLCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4IH0sCi0gICAgeyAweDAwMDA5YThjLCAweDAwMDBhNzg0LCAweDAwMDBhNzg0LCAweDAwMDA4MzBjLCAweDAwMDA4MzBjLCAweDAwMDA4MzBjIH0sCi0gICAgeyAweDAwMDA5YTkwLCAweDAwMDBhNzg4LCAweDAwMDBhNzg4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MzgwIH0sCi0gICAgeyAweDAwMDA5YTk0LCAweDAwMDBhNzhjLCAweDAwMDBhNzhjLCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0IH0sCi0gICAgeyAweDAwMDA5YTk4LCAweDAwMDBhNzkwLCAweDAwMDBhNzkwLCAweDAwMDA4NzAwLCAweDAwMDA4NzAwLCAweDAwMDA4NzAwIH0sCi0gICAgeyAweDAwMDA5YTljLCAweDAwMDBhNzk0LCAweDAwMDBhNzk0LCAweDAwMDA4NzA0LCAweDAwMDA4NzA0LCAweDAwMDA4NzA0IH0sCi0gICAgeyAweDAwMDA5YWEwLCAweDAwMDBhYjg0LCAweDAwMDBhYjg0LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4IH0sCi0gICAgeyAweDAwMDA5YWE0LCAweDAwMDBhYjg4LCAweDAwMDBhYjg4LCAweDAwMDA4NzBjLCAweDAwMDA4NzBjLCAweDAwMDA4NzBjIH0sCi0gICAgeyAweDAwMDA5YWE4LCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDA4NzgwLCAweDAwMDA4NzgwLCAweDAwMDA4NzgwIH0sCi0gICAgeyAweDAwMDA5YWFjLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0IH0sCi0gICAgeyAweDAwMDA5YWIwLCAweDAwMDBhYjk0LCAweDAwMDBhYjk0LCAweDAwMDA4YjAwLCAweDAwMDA4YjAwLCAweDAwMDA4YjAwIH0sCi0gICAgeyAweDAwMDA5YWI0LCAweDAwMDBhZjgwLCAweDAwMDBhZjgwLCAweDAwMDA4YjA0LCAweDAwMDA4YjA0LCAweDAwMDA4YjA0IH0sCi0gICAgeyAweDAwMDA5YWI4LCAweDAwMDBhZjg0LCAweDAwMDBhZjg0LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4IH0sCi0gICAgeyAweDAwMDA5YWJjLCAweDAwMDBhZjg4LCAweDAwMDBhZjg4LCAweDAwMDA4YjBjLCAweDAwMDA4YjBjLCAweDAwMDA4YjBjIH0sCi0gICAgeyAweDAwMDA5YWMwLCAweDAwMDBhZjhjLCAweDAwMDBhZjhjLCAweDAwMDA4YjgwLCAweDAwMDA4YjgwLCAweDAwMDA4YjgwIH0sCi0gICAgeyAweDAwMDA5YWM0LCAweDAwMDBhZjkwLCAweDAwMDBhZjkwLCAweDAwMDA4Yjg0LCAweDAwMDA4Yjg0LCAweDAwMDA4Yjg0IH0sCi0gICAgeyAweDAwMDA5YWM4LCAweDAwMDBhZjk0LCAweDAwMDBhZjk0LCAweDAwMDA4Yjg4LCAweDAwMDA4Yjg4LCAweDAwMDA4Yjg4IH0sCi0gICAgeyAweDAwMDA5YWNjLCAweDAwMDBiMzgwLCAweDAwMDBiMzgwLCAweDAwMDA4YjhjLCAweDAwMDA4YjhjLCAweDAwMDA4YjhjIH0sCi0gICAgeyAweDAwMDA5YWQwLCAweDAwMDBiMzg0LCAweDAwMDBiMzg0LCAweDAwMDA4YjkwLCAweDAwMDA4YjkwLCAweDAwMDA4YjkwIH0sCi0gICAgeyAweDAwMDA5YWQ0LCAweDAwMDBiMzg4LCAweDAwMDBiMzg4LCAweDAwMDA4ZjgwLCAweDAwMDA4ZjgwLCAweDAwMDA4ZjgwIH0sCi0gICAgeyAweDAwMDA5YWQ4LCAweDAwMDBiMzhjLCAweDAwMDBiMzhjLCAweDAwMDA4Zjg0LCAweDAwMDA4Zjg0LCAweDAwMDA4Zjg0IH0sCi0gICAgeyAweDAwMDA5YWRjLCAweDAwMDBiMzkwLCAweDAwMDBiMzkwLCAweDAwMDA4Zjg4LCAweDAwMDA4Zjg4LCAweDAwMDA4Zjg4IH0sCi0gICAgeyAweDAwMDA5YWUwLCAweDAwMDBiMzk0LCAweDAwMDBiMzk0LCAweDAwMDA4ZjhjLCAweDAwMDA4ZjhjLCAweDAwMDA4ZjhjIH0sCi0gICAgeyAweDAwMDA5YWU0LCAweDAwMDBiMzk4LCAweDAwMDBiMzk4LCAweDAwMDA4ZjkwLCAweDAwMDA4ZjkwLCAweDAwMDA4ZjkwIH0sCi0gICAgeyAweDAwMDA5YWU4LCAweDAwMDBiNzgwLCAweDAwMDBiNzgwLCAweDAwMDA5MzBjLCAweDAwMDA5MzBjLCAweDAwMDA5MzBjIH0sCi0gICAgeyAweDAwMDA5YWVjLCAweDAwMDBiNzg0LCAweDAwMDBiNzg0LCAweDAwMDA5MzEwLCAweDAwMDA5MzEwLCAweDAwMDA5MzEwIH0sCi0gICAgeyAweDAwMDA5YWYwLCAweDAwMDBiNzg4LCAweDAwMDBiNzg4LCAweDAwMDA5Mzg0LCAweDAwMDA5Mzg0LCAweDAwMDA5Mzg0IH0sCi0gICAgeyAweDAwMDA5YWY0LCAweDAwMDBiNzhjLCAweDAwMDBiNzhjLCAweDAwMDA5Mzg4LCAweDAwMDA5Mzg4LCAweDAwMDA5Mzg4IH0sCi0gICAgeyAweDAwMDA5YWY4LCAweDAwMDBiNzkwLCAweDAwMDBiNzkwLCAweDAwMDA5MzI0LCAweDAwMDA5MzI0LCAweDAwMDA5MzI0IH0sCi0gICAgeyAweDAwMDA5YWZjLCAweDAwMDBiNzk0LCAweDAwMDBiNzk0LCAweDAwMDA5NzA0LCAweDAwMDA5NzA0LCAweDAwMDA5NzA0IH0sCi0gICAgeyAweDAwMDA5YjAwLCAweDAwMDBiNzk4LCAweDAwMDBiNzk4LCAweDAwMDA5NmE0LCAweDAwMDA5NmE0LCAweDAwMDA5NmE0IH0sCi0gICAgeyAweDAwMDA5YjA0LCAweDAwMDBkNzg0LCAweDAwMDBkNzg0LCAweDAwMDA5NmE4LCAweDAwMDA5NmE4LCAweDAwMDA5NmE4IH0sCi0gICAgeyAweDAwMDA5YjA4LCAweDAwMDBkNzg4LCAweDAwMDBkNzg4LCAweDAwMDA5NzEwLCAweDAwMDA5NzEwLCAweDAwMDA5NzEwIH0sCi0gICAgeyAweDAwMDA5YjBjLCAweDAwMDBkNzhjLCAweDAwMDBkNzhjLCAweDAwMDA5NzE0LCAweDAwMDA5NzE0LCAweDAwMDA5NzE0IH0sCi0gICAgeyAweDAwMDA5YjEwLCAweDAwMDBkNzkwLCAweDAwMDBkNzkwLCAweDAwMDA5NzIwLCAweDAwMDA5NzIwLCAweDAwMDA5NzIwIH0sCi0gICAgeyAweDAwMDA5YjE0LCAweDAwMDBmNzgwLCAweDAwMDBmNzgwLCAweDAwMDA5NzI0LCAweDAwMDA5NzI0LCAweDAwMDA5NzI0IH0sCi0gICAgeyAweDAwMDA5YjE4LCAweDAwMDBmNzg0LCAweDAwMDBmNzg0LCAweDAwMDA5NzI4LCAweDAwMDA5NzI4LCAweDAwMDA5NzI4IH0sCi0gICAgeyAweDAwMDA5YjFjLCAweDAwMDBmNzg4LCAweDAwMDBmNzg4LCAweDAwMDA5NzJjLCAweDAwMDA5NzJjLCAweDAwMDA5NzJjIH0sCi0gICAgeyAweDAwMDA5YjIwLCAweDAwMDBmNzhjLCAweDAwMDBmNzhjLCAweDAwMDA5N2EwLCAweDAwMDA5N2EwLCAweDAwMDA5N2EwIH0sCi0gICAgeyAweDAwMDA5YjI0LCAweDAwMDBmNzkwLCAweDAwMDBmNzkwLCAweDAwMDA5N2E0LCAweDAwMDA5N2E0LCAweDAwMDA5N2E0IH0sCi0gICAgeyAweDAwMDA5YjI4LCAweDAwMDBmNzk0LCAweDAwMDBmNzk0LCAweDAwMDA5N2E4LCAweDAwMDA5N2E4LCAweDAwMDA5N2E4IH0sCi0gICAgeyAweDAwMDA5YjJjLCAweDAwMDBmN2E0LCAweDAwMDBmN2E0LCAweDAwMDA5N2IwLCAweDAwMDA5N2IwLCAweDAwMDA5N2IwIH0sCi0gICAgeyAweDAwMDA5YjMwLCAweDAwMDBmN2E4LCAweDAwMDBmN2E4LCAweDAwMDA5N2I0LCAweDAwMDA5N2I0LCAweDAwMDA5N2I0IH0sCi0gICAgeyAweDAwMDA5YjM0LCAweDAwMDBmN2FjLCAweDAwMDBmN2FjLCAweDAwMDA5N2I4LCAweDAwMDA5N2I4LCAweDAwMDA5N2I4IH0sCi0gICAgeyAweDAwMDA5YjM4LCAweDAwMDBmN2IwLCAweDAwMDBmN2IwLCAweDAwMDA5N2E1LCAweDAwMDA5N2E1LCAweDAwMDA5N2E1IH0sCi0gICAgeyAweDAwMDA5YjNjLCAweDAwMDBmN2I0LCAweDAwMDBmN2I0LCAweDAwMDA5N2E5LCAweDAwMDA5N2E5LCAweDAwMDA5N2E5IH0sCi0gICAgeyAweDAwMDA5YjQwLCAweDAwMDBmN2ExLCAweDAwMDBmN2ExLCAweDAwMDA5N2FkLCAweDAwMDA5N2FkLCAweDAwMDA5N2FkIH0sCi0gICAgeyAweDAwMDA5YjQ0LCAweDAwMDBmN2E1LCAweDAwMDBmN2E1LCAweDAwMDA5N2IxLCAweDAwMDA5N2IxLCAweDAwMDA5N2IxIH0sCi0gICAgeyAweDAwMDA5YjQ4LCAweDAwMDBmN2E5LCAweDAwMDBmN2E5LCAweDAwMDA5N2I1LCAweDAwMDA5N2I1LCAweDAwMDA5N2I1IH0sCi0gICAgeyAweDAwMDA5YjRjLCAweDAwMDBmN2FkLCAweDAwMDBmN2FkLCAweDAwMDA5N2I5LCAweDAwMDA5N2I5LCAweDAwMDA5N2I5IH0sCi0gICAgeyAweDAwMDA5YjUwLCAweDAwMDBmN2IxLCAweDAwMDBmN2IxLCAweDAwMDA5N2M1LCAweDAwMDA5N2M1LCAweDAwMDA5N2M1IH0sCi0gICAgeyAweDAwMDA5YjU0LCAweDAwMDBmN2I1LCAweDAwMDBmN2I1LCAweDAwMDA5N2M5LCAweDAwMDA5N2M5LCAweDAwMDA5N2M5IH0sCi0gICAgeyAweDAwMDA5YjU4LCAweDAwMDBmN2M1LCAweDAwMDBmN2M1LCAweDAwMDA5N2QxLCAweDAwMDA5N2QxLCAweDAwMDA5N2QxIH0sCi0gICAgeyAweDAwMDA5YjVjLCAweDAwMDBmN2M5LCAweDAwMDBmN2M5LCAweDAwMDA5N2Q1LCAweDAwMDA5N2Q1LCAweDAwMDA5N2Q1IH0sCi0gICAgeyAweDAwMDA5YjYwLCAweDAwMDBmN2NkLCAweDAwMDBmN2NkLCAweDAwMDA5N2Q5LCAweDAwMDA5N2Q5LCAweDAwMDA5N2Q5IH0sCi0gICAgeyAweDAwMDA5YjY0LCAweDAwMDBmN2QxLCAweDAwMDBmN2QxLCAweDAwMDA5N2M2LCAweDAwMDA5N2M2LCAweDAwMDA5N2M2IH0sCi0gICAgeyAweDAwMDA5YjY4LCAweDAwMDBmN2Q1LCAweDAwMDBmN2Q1LCAweDAwMDA5N2NhLCAweDAwMDA5N2NhLCAweDAwMDA5N2NhIH0sCi0gICAgeyAweDAwMDA5YjZjLCAweDAwMDBmN2MyLCAweDAwMDBmN2MyLCAweDAwMDA5N2NlLCAweDAwMDA5N2NlLCAweDAwMDA5N2NlIH0sCi0gICAgeyAweDAwMDA5YjcwLCAweDAwMDBmN2M2LCAweDAwMDBmN2M2LCAweDAwMDA5N2QyLCAweDAwMDA5N2QyLCAweDAwMDA5N2QyIH0sCi0gICAgeyAweDAwMDA5Yjc0LCAweDAwMDBmN2NhLCAweDAwMDBmN2NhLCAweDAwMDA5N2Q2LCAweDAwMDA5N2Q2LCAweDAwMDA5N2Q2IH0sCi0gICAgeyAweDAwMDA5Yjc4LCAweDAwMDBmN2NlLCAweDAwMDBmN2NlLCAweDAwMDA5N2MzLCAweDAwMDA5N2MzLCAweDAwMDA5N2MzIH0sCi0gICAgeyAweDAwMDA5YjdjLCAweDAwMDBmN2QyLCAweDAwMDBmN2QyLCAweDAwMDA5N2M3LCAweDAwMDA5N2M3LCAweDAwMDA5N2M3IH0sCi0gICAgeyAweDAwMDA5YjgwLCAweDAwMDBmN2Q2LCAweDAwMDBmN2Q2LCAweDAwMDA5N2NiLCAweDAwMDA5N2NiLCAweDAwMDA5N2NiIH0sCi0gICAgeyAweDAwMDA5Yjg0LCAweDAwMDBmN2MzLCAweDAwMDBmN2MzLCAweDAwMDA5N2NmLCAweDAwMDA5N2NmLCAweDAwMDA5N2NmIH0sCi0gICAgeyAweDAwMDA5Yjg4LCAweDAwMDBmN2M3LCAweDAwMDBmN2M3LCAweDAwMDA5N2Q3LCAweDAwMDA5N2Q3LCAweDAwMDA5N2Q3IH0sCi0gICAgeyAweDAwMDA5YjhjLCAweDAwMDBmN2NiLCAweDAwMDBmN2NiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YjkwLCAweDAwMDBmN2QzLCAweDAwMDBmN2QzLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5Yjk0LCAweDAwMDBmN2Q3LCAweDAwMDBmN2Q3LCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5Yjk4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YjljLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmEwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmE0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmE4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmFjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmIwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmI0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmI4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmJjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmMwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmM0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmM4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmNjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmQwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmQ0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmQ4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmRjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmUwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmU0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmU4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmVjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmYwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmY0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmY4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5YmZjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiIH0sCi0gICAgeyAweDAwMDA5ODQ4LCAweDAwMDAxMDY2LCAweDAwMDAxMDY2LCAweDAwMDAxMDYzLCAweDAwMDAxMDYzLCAweDAwMDAxMDYzIH0sCi0gICAgeyAweDAwMDBhODQ4LCAweDAwMDAxMDY2LCAweDAwMDAxMDY2LCAweDAwMDAxMDYzLCAweDAwMDAxMDYzLCAweDAwMDAxMDYzIH0sCisJezB4MDAwMDlhMDAsIDB4MDAwMDgxODQsIDB4MDAwMDgxODQsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDB9LAorCXsweDAwMDA5YTA0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwfSwKKwl7MHgwMDAwOWEwOCwgMHgwMDAwODE4YywgMHgwMDAwODE4YywgMHgwMDAwODAwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMH0sCisJezB4MDAwMDlhMGMsIDB4MDAwMDgxOTAsIDB4MDAwMDgxOTAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDB9LAorCXsweDAwMDA5YTEwLCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMDA4MDAwfSwKKwl7MHgwMDAwOWExNCwgMHgwMDAwODIwMCwgMHgwMDAwODIwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMH0sCisJezB4MDAwMDlhMTgsIDB4MDAwMDgyMDQsIDB4MDAwMDgyMDQsIDB4MDAwMDgwMDQsIDB4MDAwMDgwMDQsIDB4MDAwMDgwMDR9LAorCXsweDAwMDA5YTFjLCAweDAwMDA4MjA4LCAweDAwMDA4MjA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4LCAweDAwMDA4MDA4fSwKKwl7MHgwMDAwOWEyMCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODAwYywgMHgwMDAwODAwYywgMHgwMDAwODAwY30sCisJezB4MDAwMDlhMjQsIDB4MDAwMDgyMTAsIDB4MDAwMDgyMTAsIDB4MDAwMDgwODAsIDB4MDAwMDgwODAsIDB4MDAwMDgwODB9LAorCXsweDAwMDA5YTI4LCAweDAwMDA4MjE0LCAweDAwMDA4MjE0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0LCAweDAwMDA4MDg0fSwKKwl7MHgwMDAwOWEyYywgMHgwMDAwODI4MCwgMHgwMDAwODI4MCwgMHgwMDAwODA4OCwgMHgwMDAwODA4OCwgMHgwMDAwODA4OH0sCisJezB4MDAwMDlhMzAsIDB4MDAwMDgyODQsIDB4MDAwMDgyODQsIDB4MDAwMDgwOGMsIDB4MDAwMDgwOGMsIDB4MDAwMDgwOGN9LAorCXsweDAwMDA5YTM0LCAweDAwMDA4Mjg4LCAweDAwMDA4Mjg4LCAweDAwMDA4MTAwLCAweDAwMDA4MTAwLCAweDAwMDA4MTAwfSwKKwl7MHgwMDAwOWEzOCwgMHgwMDAwODI4YywgMHgwMDAwODI4YywgMHgwMDAwODEwNCwgMHgwMDAwODEwNCwgMHgwMDAwODEwNH0sCisJezB4MDAwMDlhM2MsIDB4MDAwMDgyOTAsIDB4MDAwMDgyOTAsIDB4MDAwMDgxMDgsIDB4MDAwMDgxMDgsIDB4MDAwMDgxMDh9LAorCXsweDAwMDA5YTQwLCAweDAwMDA4MzAwLCAweDAwMDA4MzAwLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjLCAweDAwMDA4MTBjfSwKKwl7MHgwMDAwOWE0NCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCwgMHgwMDAwODExMCwgMHgwMDAwODExMCwgMHgwMDAwODExMH0sCisJezB4MDAwMDlhNDgsIDB4MDAwMDgzMDgsIDB4MDAwMDgzMDgsIDB4MDAwMDgxMTQsIDB4MDAwMDgxMTQsIDB4MDAwMDgxMTR9LAorCXsweDAwMDA5YTRjLCAweDAwMDA4MzBjLCAweDAwMDA4MzBjLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwLCAweDAwMDA4MTgwfSwKKwl7MHgwMDAwOWE1MCwgMHgwMDAwODMxMCwgMHgwMDAwODMxMCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NH0sCisJezB4MDAwMDlhNTQsIDB4MDAwMDgzMTQsIDB4MDAwMDgzMTQsIDB4MDAwMDgxODgsIDB4MDAwMDgxODgsIDB4MDAwMDgxODh9LAorCXsweDAwMDA5YTU4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MThjLCAweDAwMDA4MThjLCAweDAwMDA4MThjfSwKKwl7MHgwMDAwOWE1YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwODE5MCwgMHgwMDAwODE5MCwgMHgwMDAwODE5MH0sCisJezB4MDAwMDlhNjAsIDB4MDAwMDgzODgsIDB4MDAwMDgzODgsIDB4MDAwMDgxOTQsIDB4MDAwMDgxOTQsIDB4MDAwMDgxOTR9LAorCXsweDAwMDA5YTY0LCAweDAwMDA4MzhjLCAweDAwMDA4MzhjLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwLCAweDAwMDA4MWEwfSwKKwl7MHgwMDAwOWE2OCwgMHgwMDAwODM5MCwgMHgwMDAwODM5MCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODIwY30sCisJezB4MDAwMDlhNmMsIDB4MDAwMDgzOTQsIDB4MDAwMDgzOTQsIDB4MDAwMDgxYTgsIDB4MDAwMDgxYTgsIDB4MDAwMDgxYTh9LAorCXsweDAwMDA5YTcwLCAweDAwMDBhMzgwLCAweDAwMDBhMzgwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0fSwKKwl7MHgwMDAwOWE3NCwgMHgwMDAwYTM4NCwgMHgwMDAwYTM4NCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OH0sCisJezB4MDAwMDlhNzgsIDB4MDAwMGEzODgsIDB4MDAwMGEzODgsIDB4MDAwMDgyMjQsIDB4MDAwMDgyMjQsIDB4MDAwMDgyMjR9LAorCXsweDAwMDA5YTdjLCAweDAwMDBhMzhjLCAweDAwMDBhMzhjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwfSwKKwl7MHgwMDAwOWE4MCwgMHgwMDAwYTM5MCwgMHgwMDAwYTM5MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMH0sCisJezB4MDAwMDlhODQsIDB4MDAwMGEzOTQsIDB4MDAwMGEzOTQsIDB4MDAwMDgzMDQsIDB4MDAwMDgzMDQsIDB4MDAwMDgzMDR9LAorCXsweDAwMDA5YTg4LCAweDAwMDBhNzgwLCAweDAwMDBhNzgwLCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4fSwKKwl7MHgwMDAwOWE4YywgMHgwMDAwYTc4NCwgMHgwMDAwYTc4NCwgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwODMwY30sCisJezB4MDAwMDlhOTAsIDB4MDAwMGE3ODgsIDB4MDAwMGE3ODgsIDB4MDAwMDgzODAsIDB4MDAwMDgzODAsIDB4MDAwMDgzODB9LAorCXsweDAwMDA5YTk0LCAweDAwMDBhNzhjLCAweDAwMDBhNzhjLCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0LCAweDAwMDA4Mzg0fSwKKwl7MHgwMDAwOWE5OCwgMHgwMDAwYTc5MCwgMHgwMDAwYTc5MCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMH0sCisJezB4MDAwMDlhOWMsIDB4MDAwMGE3OTQsIDB4MDAwMGE3OTQsIDB4MDAwMDg3MDQsIDB4MDAwMDg3MDQsIDB4MDAwMDg3MDR9LAorCXsweDAwMDA5YWEwLCAweDAwMDBhYjg0LCAweDAwMDBhYjg0LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4LCAweDAwMDA4NzA4fSwKKwl7MHgwMDAwOWFhNCwgMHgwMDAwYWI4OCwgMHgwMDAwYWI4OCwgMHgwMDAwODcwYywgMHgwMDAwODcwYywgMHgwMDAwODcwY30sCisJezB4MDAwMDlhYTgsIDB4MDAwMGFiOGMsIDB4MDAwMGFiOGMsIDB4MDAwMDg3ODAsIDB4MDAwMDg3ODAsIDB4MDAwMDg3ODB9LAorCXsweDAwMDA5YWFjLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0LCAweDAwMDA4Nzg0fSwKKwl7MHgwMDAwOWFiMCwgMHgwMDAwYWI5NCwgMHgwMDAwYWI5NCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMH0sCisJezB4MDAwMDlhYjQsIDB4MDAwMGFmODAsIDB4MDAwMGFmODAsIDB4MDAwMDhiMDQsIDB4MDAwMDhiMDQsIDB4MDAwMDhiMDR9LAorCXsweDAwMDA5YWI4LCAweDAwMDBhZjg0LCAweDAwMDBhZjg0LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4LCAweDAwMDA4YjA4fSwKKwl7MHgwMDAwOWFiYywgMHgwMDAwYWY4OCwgMHgwMDAwYWY4OCwgMHgwMDAwOGIwYywgMHgwMDAwOGIwYywgMHgwMDAwOGIwY30sCisJezB4MDAwMDlhYzAsIDB4MDAwMGFmOGMsIDB4MDAwMGFmOGMsIDB4MDAwMDhiODAsIDB4MDAwMDhiODAsIDB4MDAwMDhiODB9LAorCXsweDAwMDA5YWM0LCAweDAwMDBhZjkwLCAweDAwMDBhZjkwLCAweDAwMDA4Yjg0LCAweDAwMDA4Yjg0LCAweDAwMDA4Yjg0fSwKKwl7MHgwMDAwOWFjOCwgMHgwMDAwYWY5NCwgMHgwMDAwYWY5NCwgMHgwMDAwOGI4OCwgMHgwMDAwOGI4OCwgMHgwMDAwOGI4OH0sCisJezB4MDAwMDlhY2MsIDB4MDAwMGIzODAsIDB4MDAwMGIzODAsIDB4MDAwMDhiOGMsIDB4MDAwMDhiOGMsIDB4MDAwMDhiOGN9LAorCXsweDAwMDA5YWQwLCAweDAwMDBiMzg0LCAweDAwMDBiMzg0LCAweDAwMDA4YjkwLCAweDAwMDA4YjkwLCAweDAwMDA4YjkwfSwKKwl7MHgwMDAwOWFkNCwgMHgwMDAwYjM4OCwgMHgwMDAwYjM4OCwgMHgwMDAwOGY4MCwgMHgwMDAwOGY4MCwgMHgwMDAwOGY4MH0sCisJezB4MDAwMDlhZDgsIDB4MDAwMGIzOGMsIDB4MDAwMGIzOGMsIDB4MDAwMDhmODQsIDB4MDAwMDhmODQsIDB4MDAwMDhmODR9LAorCXsweDAwMDA5YWRjLCAweDAwMDBiMzkwLCAweDAwMDBiMzkwLCAweDAwMDA4Zjg4LCAweDAwMDA4Zjg4LCAweDAwMDA4Zjg4fSwKKwl7MHgwMDAwOWFlMCwgMHgwMDAwYjM5NCwgMHgwMDAwYjM5NCwgMHgwMDAwOGY4YywgMHgwMDAwOGY4YywgMHgwMDAwOGY4Y30sCisJezB4MDAwMDlhZTQsIDB4MDAwMGIzOTgsIDB4MDAwMGIzOTgsIDB4MDAwMDhmOTAsIDB4MDAwMDhmOTAsIDB4MDAwMDhmOTB9LAorCXsweDAwMDA5YWU4LCAweDAwMDBiNzgwLCAweDAwMDBiNzgwLCAweDAwMDA5MzBjLCAweDAwMDA5MzBjLCAweDAwMDA5MzBjfSwKKwl7MHgwMDAwOWFlYywgMHgwMDAwYjc4NCwgMHgwMDAwYjc4NCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMH0sCisJezB4MDAwMDlhZjAsIDB4MDAwMGI3ODgsIDB4MDAwMGI3ODgsIDB4MDAwMDkzODQsIDB4MDAwMDkzODQsIDB4MDAwMDkzODR9LAorCXsweDAwMDA5YWY0LCAweDAwMDBiNzhjLCAweDAwMDBiNzhjLCAweDAwMDA5Mzg4LCAweDAwMDA5Mzg4LCAweDAwMDA5Mzg4fSwKKwl7MHgwMDAwOWFmOCwgMHgwMDAwYjc5MCwgMHgwMDAwYjc5MCwgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNH0sCisJezB4MDAwMDlhZmMsIDB4MDAwMGI3OTQsIDB4MDAwMGI3OTQsIDB4MDAwMDk3MDQsIDB4MDAwMDk3MDQsIDB4MDAwMDk3MDR9LAorCXsweDAwMDA5YjAwLCAweDAwMDBiNzk4LCAweDAwMDBiNzk4LCAweDAwMDA5NmE0LCAweDAwMDA5NmE0LCAweDAwMDA5NmE0fSwKKwl7MHgwMDAwOWIwNCwgMHgwMDAwZDc4NCwgMHgwMDAwZDc4NCwgMHgwMDAwOTZhOCwgMHgwMDAwOTZhOCwgMHgwMDAwOTZhOH0sCisJezB4MDAwMDliMDgsIDB4MDAwMGQ3ODgsIDB4MDAwMGQ3ODgsIDB4MDAwMDk3MTAsIDB4MDAwMDk3MTAsIDB4MDAwMDk3MTB9LAorCXsweDAwMDA5YjBjLCAweDAwMDBkNzhjLCAweDAwMDBkNzhjLCAweDAwMDA5NzE0LCAweDAwMDA5NzE0LCAweDAwMDA5NzE0fSwKKwl7MHgwMDAwOWIxMCwgMHgwMDAwZDc5MCwgMHgwMDAwZDc5MCwgMHgwMDAwOTcyMCwgMHgwMDAwOTcyMCwgMHgwMDAwOTcyMH0sCisJezB4MDAwMDliMTQsIDB4MDAwMGY3ODAsIDB4MDAwMGY3ODAsIDB4MDAwMDk3MjQsIDB4MDAwMDk3MjQsIDB4MDAwMDk3MjR9LAorCXsweDAwMDA5YjE4LCAweDAwMDBmNzg0LCAweDAwMDBmNzg0LCAweDAwMDA5NzI4LCAweDAwMDA5NzI4LCAweDAwMDA5NzI4fSwKKwl7MHgwMDAwOWIxYywgMHgwMDAwZjc4OCwgMHgwMDAwZjc4OCwgMHgwMDAwOTcyYywgMHgwMDAwOTcyYywgMHgwMDAwOTcyY30sCisJezB4MDAwMDliMjAsIDB4MDAwMGY3OGMsIDB4MDAwMGY3OGMsIDB4MDAwMDk3YTAsIDB4MDAwMDk3YTAsIDB4MDAwMDk3YTB9LAorCXsweDAwMDA5YjI0LCAweDAwMDBmNzkwLCAweDAwMDBmNzkwLCAweDAwMDA5N2E0LCAweDAwMDA5N2E0LCAweDAwMDA5N2E0fSwKKwl7MHgwMDAwOWIyOCwgMHgwMDAwZjc5NCwgMHgwMDAwZjc5NCwgMHgwMDAwOTdhOCwgMHgwMDAwOTdhOCwgMHgwMDAwOTdhOH0sCisJezB4MDAwMDliMmMsIDB4MDAwMGY3YTQsIDB4MDAwMGY3YTQsIDB4MDAwMDk3YjAsIDB4MDAwMDk3YjAsIDB4MDAwMDk3YjB9LAorCXsweDAwMDA5YjMwLCAweDAwMDBmN2E4LCAweDAwMDBmN2E4LCAweDAwMDA5N2I0LCAweDAwMDA5N2I0LCAweDAwMDA5N2I0fSwKKwl7MHgwMDAwOWIzNCwgMHgwMDAwZjdhYywgMHgwMDAwZjdhYywgMHgwMDAwOTdiOCwgMHgwMDAwOTdiOCwgMHgwMDAwOTdiOH0sCisJezB4MDAwMDliMzgsIDB4MDAwMGY3YjAsIDB4MDAwMGY3YjAsIDB4MDAwMDk3YTUsIDB4MDAwMDk3YTUsIDB4MDAwMDk3YTV9LAorCXsweDAwMDA5YjNjLCAweDAwMDBmN2I0LCAweDAwMDBmN2I0LCAweDAwMDA5N2E5LCAweDAwMDA5N2E5LCAweDAwMDA5N2E5fSwKKwl7MHgwMDAwOWI0MCwgMHgwMDAwZjdhMSwgMHgwMDAwZjdhMSwgMHgwMDAwOTdhZCwgMHgwMDAwOTdhZCwgMHgwMDAwOTdhZH0sCisJezB4MDAwMDliNDQsIDB4MDAwMGY3YTUsIDB4MDAwMGY3YTUsIDB4MDAwMDk3YjEsIDB4MDAwMDk3YjEsIDB4MDAwMDk3YjF9LAorCXsweDAwMDA5YjQ4LCAweDAwMDBmN2E5LCAweDAwMDBmN2E5LCAweDAwMDA5N2I1LCAweDAwMDA5N2I1LCAweDAwMDA5N2I1fSwKKwl7MHgwMDAwOWI0YywgMHgwMDAwZjdhZCwgMHgwMDAwZjdhZCwgMHgwMDAwOTdiOSwgMHgwMDAwOTdiOSwgMHgwMDAwOTdiOX0sCisJezB4MDAwMDliNTAsIDB4MDAwMGY3YjEsIDB4MDAwMGY3YjEsIDB4MDAwMDk3YzUsIDB4MDAwMDk3YzUsIDB4MDAwMDk3YzV9LAorCXsweDAwMDA5YjU0LCAweDAwMDBmN2I1LCAweDAwMDBmN2I1LCAweDAwMDA5N2M5LCAweDAwMDA5N2M5LCAweDAwMDA5N2M5fSwKKwl7MHgwMDAwOWI1OCwgMHgwMDAwZjdjNSwgMHgwMDAwZjdjNSwgMHgwMDAwOTdkMSwgMHgwMDAwOTdkMSwgMHgwMDAwOTdkMX0sCisJezB4MDAwMDliNWMsIDB4MDAwMGY3YzksIDB4MDAwMGY3YzksIDB4MDAwMDk3ZDUsIDB4MDAwMDk3ZDUsIDB4MDAwMDk3ZDV9LAorCXsweDAwMDA5YjYwLCAweDAwMDBmN2NkLCAweDAwMDBmN2NkLCAweDAwMDA5N2Q5LCAweDAwMDA5N2Q5LCAweDAwMDA5N2Q5fSwKKwl7MHgwMDAwOWI2NCwgMHgwMDAwZjdkMSwgMHgwMDAwZjdkMSwgMHgwMDAwOTdjNiwgMHgwMDAwOTdjNiwgMHgwMDAwOTdjNn0sCisJezB4MDAwMDliNjgsIDB4MDAwMGY3ZDUsIDB4MDAwMGY3ZDUsIDB4MDAwMDk3Y2EsIDB4MDAwMDk3Y2EsIDB4MDAwMDk3Y2F9LAorCXsweDAwMDA5YjZjLCAweDAwMDBmN2MyLCAweDAwMDBmN2MyLCAweDAwMDA5N2NlLCAweDAwMDA5N2NlLCAweDAwMDA5N2NlfSwKKwl7MHgwMDAwOWI3MCwgMHgwMDAwZjdjNiwgMHgwMDAwZjdjNiwgMHgwMDAwOTdkMiwgMHgwMDAwOTdkMiwgMHgwMDAwOTdkMn0sCisJezB4MDAwMDliNzQsIDB4MDAwMGY3Y2EsIDB4MDAwMGY3Y2EsIDB4MDAwMDk3ZDYsIDB4MDAwMDk3ZDYsIDB4MDAwMDk3ZDZ9LAorCXsweDAwMDA5Yjc4LCAweDAwMDBmN2NlLCAweDAwMDBmN2NlLCAweDAwMDA5N2MzLCAweDAwMDA5N2MzLCAweDAwMDA5N2MzfSwKKwl7MHgwMDAwOWI3YywgMHgwMDAwZjdkMiwgMHgwMDAwZjdkMiwgMHgwMDAwOTdjNywgMHgwMDAwOTdjNywgMHgwMDAwOTdjN30sCisJezB4MDAwMDliODAsIDB4MDAwMGY3ZDYsIDB4MDAwMGY3ZDYsIDB4MDAwMDk3Y2IsIDB4MDAwMDk3Y2IsIDB4MDAwMDk3Y2J9LAorCXsweDAwMDA5Yjg0LCAweDAwMDBmN2MzLCAweDAwMDBmN2MzLCAweDAwMDA5N2NmLCAweDAwMDA5N2NmLCAweDAwMDA5N2NmfSwKKwl7MHgwMDAwOWI4OCwgMHgwMDAwZjdjNywgMHgwMDAwZjdjNywgMHgwMDAwOTdkNywgMHgwMDAwOTdkNywgMHgwMDAwOTdkN30sCisJezB4MDAwMDliOGMsIDB4MDAwMGY3Y2IsIDB4MDAwMGY3Y2IsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YjkwLCAweDAwMDBmN2QzLCAweDAwMDBmN2QzLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWI5NCwgMHgwMDAwZjdkNywgMHgwMDAwZjdkNywgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliOTgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YjljLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJhMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliYTQsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmE4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJhYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliYjAsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmI0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJiOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliYmMsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmMwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJjNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliYzgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmNjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJkMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliZDQsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmQ4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJkYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliZTAsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmU0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJlOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliZWMsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmYwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOWJmNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYiwgMHgwMDAwOTdkYn0sCisJezB4MDAwMDliZjgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGIsIDB4MDAwMDk3ZGJ9LAorCXsweDAwMDA5YmZjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RiLCAweDAwMDA5N2RifSwKKwl7MHgwMDAwOTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2MywgMHgwMDAwMTA2MywgMHgwMDAwMTA2M30sCisJezB4MDAwMGE4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjMsIDB4MDAwMDEwNjMsIDB4MDAwMDEwNjN9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODBNb2Rlc19iYWNrb2ZmXzEzZGJfcnhnYWluXzkyODBfMltdWzZdID0gewotICAgIHsgMHgwMDAwOWEwMCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NCwgMHgwMDAwMDI5MCwgMHgwMDAwMDI5MCwgMHgwMDAwMDI5MCB9LAotICAgIHsgMHgwMDAwOWEwNCwgMHgwMDAwODE4OCwgMHgwMDAwODE4OCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMCB9LAotICAgIHsgMHgwMDAwOWEwOCwgMHgwMDAwODE4YywgMHgwMDAwODE4YywgMHgwMDAwMDMwNCwgMHgwMDAwMDMwNCwgMHgwMDAwMDMwNCB9LAotICAgIHsgMHgwMDAwOWEwYywgMHgwMDAwODE5MCwgMHgwMDAwODE5MCwgMHgwMDAwMDMwOCwgMHgwMDAwMDMwOCwgMHgwMDAwMDMwOCB9LAotICAgIHsgMHgwMDAwOWExMCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCwgMHgwMDAwMDMwYywgMHgwMDAwMDMwYywgMHgwMDAwMDMwYyB9LAotICAgIHsgMHgwMDAwOWExNCwgMHgwMDAwODIwMCwgMHgwMDAwODIwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCB9LAotICAgIHsgMHgwMDAwOWExOCwgMHgwMDAwODIwNCwgMHgwMDAwODIwNCwgMHgwMDAwODAwNCwgMHgwMDAwODAwNCwgMHgwMDAwODAwNCB9LAotICAgIHsgMHgwMDAwOWExYywgMHgwMDAwODIwOCwgMHgwMDAwODIwOCwgMHgwMDAwODAwOCwgMHgwMDAwODAwOCwgMHgwMDAwODAwOCB9LAotICAgIHsgMHgwMDAwOWEyMCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODAwYywgMHgwMDAwODAwYywgMHgwMDAwODAwYyB9LAotICAgIHsgMHgwMDAwOWEyNCwgMHgwMDAwODIxMCwgMHgwMDAwODIxMCwgMHgwMDAwODA4MCwgMHgwMDAwODA4MCwgMHgwMDAwODA4MCB9LAotICAgIHsgMHgwMDAwOWEyOCwgMHgwMDAwODIxNCwgMHgwMDAwODIxNCwgMHgwMDAwODA4NCwgMHgwMDAwODA4NCwgMHgwMDAwODA4NCB9LAotICAgIHsgMHgwMDAwOWEyYywgMHgwMDAwODI4MCwgMHgwMDAwODI4MCwgMHgwMDAwODA4OCwgMHgwMDAwODA4OCwgMHgwMDAwODA4OCB9LAotICAgIHsgMHgwMDAwOWEzMCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCwgMHgwMDAwODA4YywgMHgwMDAwODA4YywgMHgwMDAwODA4YyB9LAotICAgIHsgMHgwMDAwOWEzNCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwODEwMCwgMHgwMDAwODEwMCwgMHgwMDAwODEwMCB9LAotICAgIHsgMHgwMDAwOWEzOCwgMHgwMDAwODI4YywgMHgwMDAwODI4YywgMHgwMDAwODEwNCwgMHgwMDAwODEwNCwgMHgwMDAwODEwNCB9LAotICAgIHsgMHgwMDAwOWEzYywgMHgwMDAwODI5MCwgMHgwMDAwODI5MCwgMHgwMDAwODEwOCwgMHgwMDAwODEwOCwgMHgwMDAwODEwOCB9LAotICAgIHsgMHgwMDAwOWE0MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwODEwYywgMHgwMDAwODEwYywgMHgwMDAwODEwYyB9LAotICAgIHsgMHgwMDAwOWE0NCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCwgMHgwMDAwODExMCwgMHgwMDAwODExMCwgMHgwMDAwODExMCB9LAotICAgIHsgMHgwMDAwOWE0OCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCwgMHgwMDAwODExNCwgMHgwMDAwODExNCwgMHgwMDAwODExNCB9LAotICAgIHsgMHgwMDAwOWE0YywgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwODE4MCwgMHgwMDAwODE4MCwgMHgwMDAwODE4MCB9LAotICAgIHsgMHgwMDAwOWE1MCwgMHgwMDAwODMxMCwgMHgwMDAwODMxMCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NCwgMHgwMDAwODE4NCB9LAotICAgIHsgMHgwMDAwOWE1NCwgMHgwMDAwODMxNCwgMHgwMDAwODMxNCwgMHgwMDAwODE4OCwgMHgwMDAwODE4OCwgMHgwMDAwODE4OCB9LAotICAgIHsgMHgwMDAwOWE1OCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCwgMHgwMDAwODE4YywgMHgwMDAwODE4YywgMHgwMDAwODE4YyB9LAotICAgIHsgMHgwMDAwOWE1YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwODE5MCwgMHgwMDAwODE5MCwgMHgwMDAwODE5MCB9LAotICAgIHsgMHgwMDAwOWE2MCwgMHgwMDAwODM4OCwgMHgwMDAwODM4OCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCB9LAotICAgIHsgMHgwMDAwOWE2NCwgMHgwMDAwODM4YywgMHgwMDAwODM4YywgMHgwMDAwODFhMCwgMHgwMDAwODFhMCwgMHgwMDAwODFhMCB9LAotICAgIHsgMHgwMDAwOWE2OCwgMHgwMDAwODM5MCwgMHgwMDAwODM5MCwgMHgwMDAwODIwYywgMHgwMDAwODIwYywgMHgwMDAwODIwYyB9LAotICAgIHsgMHgwMDAwOWE2YywgMHgwMDAwODM5NCwgMHgwMDAwODM5NCwgMHgwMDAwODFhOCwgMHgwMDAwODFhOCwgMHgwMDAwODFhOCB9LAotICAgIHsgMHgwMDAwOWE3MCwgMHgwMDAwYTM4MCwgMHgwMDAwYTM4MCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCB9LAotICAgIHsgMHgwMDAwOWE3NCwgMHgwMDAwYTM4NCwgMHgwMDAwYTM4NCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCB9LAotICAgIHsgMHgwMDAwOWE3OCwgMHgwMDAwYTM4OCwgMHgwMDAwYTM4OCwgMHgwMDAwODIyNCwgMHgwMDAwODIyNCwgMHgwMDAwODIyNCB9LAotICAgIHsgMHgwMDAwOWE3YywgMHgwMDAwYTM4YywgMHgwMDAwYTM4YywgMHgwMDAwODI5MCwgMHgwMDAwODI5MCwgMHgwMDAwODI5MCB9LAotICAgIHsgMHgwMDAwOWE4MCwgMHgwMDAwYTM5MCwgMHgwMDAwYTM5MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCB9LAotICAgIHsgMHgwMDAwOWE4NCwgMHgwMDAwYTM5NCwgMHgwMDAwYTM5NCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCwgMHgwMDAwODMwNCB9LAotICAgIHsgMHgwMDAwOWE4OCwgMHgwMDAwYTc4MCwgMHgwMDAwYTc4MCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCB9LAotICAgIHsgMHgwMDAwOWE4YywgMHgwMDAwYTc4NCwgMHgwMDAwYTc4NCwgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwODMwYyB9LAotICAgIHsgMHgwMDAwOWE5MCwgMHgwMDAwYTc4OCwgMHgwMDAwYTc4OCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCB9LAotICAgIHsgMHgwMDAwOWE5NCwgMHgwMDAwYTc4YywgMHgwMDAwYTc4YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwODM4NCB9LAotICAgIHsgMHgwMDAwOWE5OCwgMHgwMDAwYTc5MCwgMHgwMDAwYTc5MCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMCwgMHgwMDAwODcwMCB9LAotICAgIHsgMHgwMDAwOWE5YywgMHgwMDAwYTc5NCwgMHgwMDAwYTc5NCwgMHgwMDAwODcwNCwgMHgwMDAwODcwNCwgMHgwMDAwODcwNCB9LAotICAgIHsgMHgwMDAwOWFhMCwgMHgwMDAwYWI4NCwgMHgwMDAwYWI4NCwgMHgwMDAwODcwOCwgMHgwMDAwODcwOCwgMHgwMDAwODcwOCB9LAotICAgIHsgMHgwMDAwOWFhNCwgMHgwMDAwYWI4OCwgMHgwMDAwYWI4OCwgMHgwMDAwODcwYywgMHgwMDAwODcwYywgMHgwMDAwODcwYyB9LAotICAgIHsgMHgwMDAwOWFhOCwgMHgwMDAwYWI4YywgMHgwMDAwYWI4YywgMHgwMDAwODc4MCwgMHgwMDAwODc4MCwgMHgwMDAwODc4MCB9LAotICAgIHsgMHgwMDAwOWFhYywgMHgwMDAwYWI5MCwgMHgwMDAwYWI5MCwgMHgwMDAwODc4NCwgMHgwMDAwODc4NCwgMHgwMDAwODc4NCB9LAotICAgIHsgMHgwMDAwOWFiMCwgMHgwMDAwYWI5NCwgMHgwMDAwYWI5NCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMCwgMHgwMDAwOGIwMCB9LAotICAgIHsgMHgwMDAwOWFiNCwgMHgwMDAwYWY4MCwgMHgwMDAwYWY4MCwgMHgwMDAwOGIwNCwgMHgwMDAwOGIwNCwgMHgwMDAwOGIwNCB9LAotICAgIHsgMHgwMDAwOWFiOCwgMHgwMDAwYWY4NCwgMHgwMDAwYWY4NCwgMHgwMDAwOGIwOCwgMHgwMDAwOGIwOCwgMHgwMDAwOGIwOCB9LAotICAgIHsgMHgwMDAwOWFiYywgMHgwMDAwYWY4OCwgMHgwMDAwYWY4OCwgMHgwMDAwOGIwYywgMHgwMDAwOGIwYywgMHgwMDAwOGIwYyB9LAotICAgIHsgMHgwMDAwOWFjMCwgMHgwMDAwYWY4YywgMHgwMDAwYWY4YywgMHgwMDAwOGI4MCwgMHgwMDAwOGI4MCwgMHgwMDAwOGI4MCB9LAotICAgIHsgMHgwMDAwOWFjNCwgMHgwMDAwYWY5MCwgMHgwMDAwYWY5MCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NCB9LAotICAgIHsgMHgwMDAwOWFjOCwgMHgwMDAwYWY5NCwgMHgwMDAwYWY5NCwgMHgwMDAwOGI4OCwgMHgwMDAwOGI4OCwgMHgwMDAwOGI4OCB9LAotICAgIHsgMHgwMDAwOWFjYywgMHgwMDAwYjM4MCwgMHgwMDAwYjM4MCwgMHgwMDAwOGI4YywgMHgwMDAwOGI4YywgMHgwMDAwOGI4YyB9LAotICAgIHsgMHgwMDAwOWFkMCwgMHgwMDAwYjM4NCwgMHgwMDAwYjM4NCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MCB9LAotICAgIHsgMHgwMDAwOWFkNCwgMHgwMDAwYjM4OCwgMHgwMDAwYjM4OCwgMHgwMDAwOGY4MCwgMHgwMDAwOGY4MCwgMHgwMDAwOGY4MCB9LAotICAgIHsgMHgwMDAwOWFkOCwgMHgwMDAwYjM4YywgMHgwMDAwYjM4YywgMHgwMDAwOGY4NCwgMHgwMDAwOGY4NCwgMHgwMDAwOGY4NCB9LAotICAgIHsgMHgwMDAwOWFkYywgMHgwMDAwYjM5MCwgMHgwMDAwYjM5MCwgMHgwMDAwOGY4OCwgMHgwMDAwOGY4OCwgMHgwMDAwOGY4OCB9LAotICAgIHsgMHgwMDAwOWFlMCwgMHgwMDAwYjM5NCwgMHgwMDAwYjM5NCwgMHgwMDAwOGY4YywgMHgwMDAwOGY4YywgMHgwMDAwOGY4YyB9LAotICAgIHsgMHgwMDAwOWFlNCwgMHgwMDAwYjM5OCwgMHgwMDAwYjM5OCwgMHgwMDAwOGY5MCwgMHgwMDAwOGY5MCwgMHgwMDAwOGY5MCB9LAotICAgIHsgMHgwMDAwOWFlOCwgMHgwMDAwYjc4MCwgMHgwMDAwYjc4MCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMCB9LAotICAgIHsgMHgwMDAwOWFlYywgMHgwMDAwYjc4NCwgMHgwMDAwYjc4NCwgMHgwMDAwOTMxNCwgMHgwMDAwOTMxNCwgMHgwMDAwOTMxNCB9LAotICAgIHsgMHgwMDAwOWFmMCwgMHgwMDAwYjc4OCwgMHgwMDAwYjc4OCwgMHgwMDAwOTMyMCwgMHgwMDAwOTMyMCwgMHgwMDAwOTMyMCB9LAotICAgIHsgMHgwMDAwOWFmNCwgMHgwMDAwYjc4YywgMHgwMDAwYjc4YywgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNCB9LAotICAgIHsgMHgwMDAwOWFmOCwgMHgwMDAwYjc5MCwgMHgwMDAwYjc5MCwgMHgwMDAwOTMyOCwgMHgwMDAwOTMyOCwgMHgwMDAwOTMyOCB9LAotICAgIHsgMHgwMDAwOWFmYywgMHgwMDAwYjc5NCwgMHgwMDAwYjc5NCwgMHgwMDAwOTMyYywgMHgwMDAwOTMyYywgMHgwMDAwOTMyYyB9LAotICAgIHsgMHgwMDAwOWIwMCwgMHgwMDAwYjc5OCwgMHgwMDAwYjc5OCwgMHgwMDAwOTMzMCwgMHgwMDAwOTMzMCwgMHgwMDAwOTMzMCB9LAotICAgIHsgMHgwMDAwOWIwNCwgMHgwMDAwZDc4NCwgMHgwMDAwZDc4NCwgMHgwMDAwOTMzNCwgMHgwMDAwOTMzNCwgMHgwMDAwOTMzNCB9LAotICAgIHsgMHgwMDAwOWIwOCwgMHgwMDAwZDc4OCwgMHgwMDAwZDc4OCwgMHgwMDAwOTMyMSwgMHgwMDAwOTMyMSwgMHgwMDAwOTMyMSB9LAotICAgIHsgMHgwMDAwOWIwYywgMHgwMDAwZDc4YywgMHgwMDAwZDc4YywgMHgwMDAwOTMyNSwgMHgwMDAwOTMyNSwgMHgwMDAwOTMyNSB9LAotICAgIHsgMHgwMDAwOWIxMCwgMHgwMDAwZDc5MCwgMHgwMDAwZDc5MCwgMHgwMDAwOTMyOSwgMHgwMDAwOTMyOSwgMHgwMDAwOTMyOSB9LAotICAgIHsgMHgwMDAwOWIxNCwgMHgwMDAwZjc4MCwgMHgwMDAwZjc4MCwgMHgwMDAwOTMyZCwgMHgwMDAwOTMyZCwgMHgwMDAwOTMyZCB9LAotICAgIHsgMHgwMDAwOWIxOCwgMHgwMDAwZjc4NCwgMHgwMDAwZjc4NCwgMHgwMDAwOTMzMSwgMHgwMDAwOTMzMSwgMHgwMDAwOTMzMSB9LAotICAgIHsgMHgwMDAwOWIxYywgMHgwMDAwZjc4OCwgMHgwMDAwZjc4OCwgMHgwMDAwOTMzNSwgMHgwMDAwOTMzNSwgMHgwMDAwOTMzNSB9LAotICAgIHsgMHgwMDAwOWIyMCwgMHgwMDAwZjc4YywgMHgwMDAwZjc4YywgMHgwMDAwOTMyMiwgMHgwMDAwOTMyMiwgMHgwMDAwOTMyMiB9LAotICAgIHsgMHgwMDAwOWIyNCwgMHgwMDAwZjc5MCwgMHgwMDAwZjc5MCwgMHgwMDAwOTMyNiwgMHgwMDAwOTMyNiwgMHgwMDAwOTMyNiB9LAotICAgIHsgMHgwMDAwOWIyOCwgMHgwMDAwZjc5NCwgMHgwMDAwZjc5NCwgMHgwMDAwOTMyYSwgMHgwMDAwOTMyYSwgMHgwMDAwOTMyYSB9LAotICAgIHsgMHgwMDAwOWIyYywgMHgwMDAwZjdhNCwgMHgwMDAwZjdhNCwgMHgwMDAwOTMyZSwgMHgwMDAwOTMyZSwgMHgwMDAwOTMyZSB9LAotICAgIHsgMHgwMDAwOWIzMCwgMHgwMDAwZjdhOCwgMHgwMDAwZjdhOCwgMHgwMDAwOTMzMiwgMHgwMDAwOTMzMiwgMHgwMDAwOTMzMiB9LAotICAgIHsgMHgwMDAwOWIzNCwgMHgwMDAwZjdhYywgMHgwMDAwZjdhYywgMHgwMDAwOTMzNiwgMHgwMDAwOTMzNiwgMHgwMDAwOTMzNiB9LAotICAgIHsgMHgwMDAwOWIzOCwgMHgwMDAwZjdiMCwgMHgwMDAwZjdiMCwgMHgwMDAwOTMyMywgMHgwMDAwOTMyMywgMHgwMDAwOTMyMyB9LAotICAgIHsgMHgwMDAwOWIzYywgMHgwMDAwZjdiNCwgMHgwMDAwZjdiNCwgMHgwMDAwOTMyNywgMHgwMDAwOTMyNywgMHgwMDAwOTMyNyB9LAotICAgIHsgMHgwMDAwOWI0MCwgMHgwMDAwZjdhMSwgMHgwMDAwZjdhMSwgMHgwMDAwOTMyYiwgMHgwMDAwOTMyYiwgMHgwMDAwOTMyYiB9LAotICAgIHsgMHgwMDAwOWI0NCwgMHgwMDAwZjdhNSwgMHgwMDAwZjdhNSwgMHgwMDAwOTMyZiwgMHgwMDAwOTMyZiwgMHgwMDAwOTMyZiB9LAotICAgIHsgMHgwMDAwOWI0OCwgMHgwMDAwZjdhOSwgMHgwMDAwZjdhOSwgMHgwMDAwOTMzMywgMHgwMDAwOTMzMywgMHgwMDAwOTMzMyB9LAotICAgIHsgMHgwMDAwOWI0YywgMHgwMDAwZjdhZCwgMHgwMDAwZjdhZCwgMHgwMDAwOTMzNywgMHgwMDAwOTMzNywgMHgwMDAwOTMzNyB9LAotICAgIHsgMHgwMDAwOWI1MCwgMHgwMDAwZjdiMSwgMHgwMDAwZjdiMSwgMHgwMDAwOTM0MywgMHgwMDAwOTM0MywgMHgwMDAwOTM0MyB9LAotICAgIHsgMHgwMDAwOWI1NCwgMHgwMDAwZjdiNSwgMHgwMDAwZjdiNSwgMHgwMDAwOTM0NywgMHgwMDAwOTM0NywgMHgwMDAwOTM0NyB9LAotICAgIHsgMHgwMDAwOWI1OCwgMHgwMDAwZjdjNSwgMHgwMDAwZjdjNSwgMHgwMDAwOTM0YiwgMHgwMDAwOTM0YiwgMHgwMDAwOTM0YiB9LAotICAgIHsgMHgwMDAwOWI1YywgMHgwMDAwZjdjOSwgMHgwMDAwZjdjOSwgMHgwMDAwOTM0ZiwgMHgwMDAwOTM0ZiwgMHgwMDAwOTM0ZiB9LAotICAgIHsgMHgwMDAwOWI2MCwgMHgwMDAwZjdjZCwgMHgwMDAwZjdjZCwgMHgwMDAwOTM1MywgMHgwMDAwOTM1MywgMHgwMDAwOTM1MyB9LAotICAgIHsgMHgwMDAwOWI2NCwgMHgwMDAwZjdkMSwgMHgwMDAwZjdkMSwgMHgwMDAwOTM1NywgMHgwMDAwOTM1NywgMHgwMDAwOTM1NyB9LAotICAgIHsgMHgwMDAwOWI2OCwgMHgwMDAwZjdkNSwgMHgwMDAwZjdkNSwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI2YywgMHgwMDAwZjdjMiwgMHgwMDAwZjdjMiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI3MCwgMHgwMDAwZjdjNiwgMHgwMDAwZjdjNiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI3NCwgMHgwMDAwZjdjYSwgMHgwMDAwZjdjYSwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI3OCwgMHgwMDAwZjdjZSwgMHgwMDAwZjdjZSwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI3YywgMHgwMDAwZjdkMiwgMHgwMDAwZjdkMiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI4MCwgMHgwMDAwZjdkNiwgMHgwMDAwZjdkNiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI4NCwgMHgwMDAwZjdjMywgMHgwMDAwZjdjMywgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI4OCwgMHgwMDAwZjdjNywgMHgwMDAwZjdjNywgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI4YywgMHgwMDAwZjdjYiwgMHgwMDAwZjdjYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI5MCwgMHgwMDAwZjdkMywgMHgwMDAwZjdkMywgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI5NCwgMHgwMDAwZjdkNywgMHgwMDAwZjdkNywgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI5OCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWI5YywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJhMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJhNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJhOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJhYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJiMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJiNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJiOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJiYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJjMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJjNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJjOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJjYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJkMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJkNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJkOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJkYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJlMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJlNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJlOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJlYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJmMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJmNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJmOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOWJmYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiB9LAotICAgIHsgMHgwMDAwOTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMTA1YSwgMHgwMDAwMTA1YSwgMHgwMDAwMTA1YSB9LAotICAgIHsgMHgwMDAwYTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMTA1YSwgMHgwMDAwMTA1YSwgMHgwMDAwMTA1YSB9LAorCXsweDAwMDA5YTAwLCAweDAwMDA4MTg0LCAweDAwMDA4MTg0LCAweDAwMDAwMjkwLCAweDAwMDAwMjkwLCAweDAwMDAwMjkwfSwKKwl7MHgwMDAwOWEwNCwgMHgwMDAwODE4OCwgMHgwMDAwODE4OCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMH0sCisJezB4MDAwMDlhMDgsIDB4MDAwMDgxOGMsIDB4MDAwMDgxOGMsIDB4MDAwMDAzMDQsIDB4MDAwMDAzMDQsIDB4MDAwMDAzMDR9LAorCXsweDAwMDA5YTBjLCAweDAwMDA4MTkwLCAweDAwMDA4MTkwLCAweDAwMDAwMzA4LCAweDAwMDAwMzA4LCAweDAwMDAwMzA4fSwKKwl7MHgwMDAwOWExMCwgMHgwMDAwODE5NCwgMHgwMDAwODE5NCwgMHgwMDAwMDMwYywgMHgwMDAwMDMwYywgMHgwMDAwMDMwY30sCisJezB4MDAwMDlhMTQsIDB4MDAwMDgyMDAsIDB4MDAwMDgyMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDB9LAorCXsweDAwMDA5YTE4LCAweDAwMDA4MjA0LCAweDAwMDA4MjA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0fSwKKwl7MHgwMDAwOWExYywgMHgwMDAwODIwOCwgMHgwMDAwODIwOCwgMHgwMDAwODAwOCwgMHgwMDAwODAwOCwgMHgwMDAwODAwOH0sCisJezB4MDAwMDlhMjAsIDB4MDAwMDgyMGMsIDB4MDAwMDgyMGMsIDB4MDAwMDgwMGMsIDB4MDAwMDgwMGMsIDB4MDAwMDgwMGN9LAorCXsweDAwMDA5YTI0LCAweDAwMDA4MjEwLCAweDAwMDA4MjEwLCAweDAwMDA4MDgwLCAweDAwMDA4MDgwLCAweDAwMDA4MDgwfSwKKwl7MHgwMDAwOWEyOCwgMHgwMDAwODIxNCwgMHgwMDAwODIxNCwgMHgwMDAwODA4NCwgMHgwMDAwODA4NCwgMHgwMDAwODA4NH0sCisJezB4MDAwMDlhMmMsIDB4MDAwMDgyODAsIDB4MDAwMDgyODAsIDB4MDAwMDgwODgsIDB4MDAwMDgwODgsIDB4MDAwMDgwODh9LAorCXsweDAwMDA5YTMwLCAweDAwMDA4Mjg0LCAweDAwMDA4Mjg0LCAweDAwMDA4MDhjLCAweDAwMDA4MDhjLCAweDAwMDA4MDhjfSwKKwl7MHgwMDAwOWEzNCwgMHgwMDAwODI4OCwgMHgwMDAwODI4OCwgMHgwMDAwODEwMCwgMHgwMDAwODEwMCwgMHgwMDAwODEwMH0sCisJezB4MDAwMDlhMzgsIDB4MDAwMDgyOGMsIDB4MDAwMDgyOGMsIDB4MDAwMDgxMDQsIDB4MDAwMDgxMDQsIDB4MDAwMDgxMDR9LAorCXsweDAwMDA5YTNjLCAweDAwMDA4MjkwLCAweDAwMDA4MjkwLCAweDAwMDA4MTA4LCAweDAwMDA4MTA4LCAweDAwMDA4MTA4fSwKKwl7MHgwMDAwOWE0MCwgMHgwMDAwODMwMCwgMHgwMDAwODMwMCwgMHgwMDAwODEwYywgMHgwMDAwODEwYywgMHgwMDAwODEwY30sCisJezB4MDAwMDlhNDQsIDB4MDAwMDgzMDQsIDB4MDAwMDgzMDQsIDB4MDAwMDgxMTAsIDB4MDAwMDgxMTAsIDB4MDAwMDgxMTB9LAorCXsweDAwMDA5YTQ4LCAweDAwMDA4MzA4LCAweDAwMDA4MzA4LCAweDAwMDA4MTE0LCAweDAwMDA4MTE0LCAweDAwMDA4MTE0fSwKKwl7MHgwMDAwOWE0YywgMHgwMDAwODMwYywgMHgwMDAwODMwYywgMHgwMDAwODE4MCwgMHgwMDAwODE4MCwgMHgwMDAwODE4MH0sCisJezB4MDAwMDlhNTAsIDB4MDAwMDgzMTAsIDB4MDAwMDgzMTAsIDB4MDAwMDgxODQsIDB4MDAwMDgxODQsIDB4MDAwMDgxODR9LAorCXsweDAwMDA5YTU0LCAweDAwMDA4MzE0LCAweDAwMDA4MzE0LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4LCAweDAwMDA4MTg4fSwKKwl7MHgwMDAwOWE1OCwgMHgwMDAwODM4MCwgMHgwMDAwODM4MCwgMHgwMDAwODE4YywgMHgwMDAwODE4YywgMHgwMDAwODE4Y30sCisJezB4MDAwMDlhNWMsIDB4MDAwMDgzODQsIDB4MDAwMDgzODQsIDB4MDAwMDgxOTAsIDB4MDAwMDgxOTAsIDB4MDAwMDgxOTB9LAorCXsweDAwMDA5YTYwLCAweDAwMDA4Mzg4LCAweDAwMDA4Mzg4LCAweDAwMDA4MTk0LCAweDAwMDA4MTk0LCAweDAwMDA4MTk0fSwKKwl7MHgwMDAwOWE2NCwgMHgwMDAwODM4YywgMHgwMDAwODM4YywgMHgwMDAwODFhMCwgMHgwMDAwODFhMCwgMHgwMDAwODFhMH0sCisJezB4MDAwMDlhNjgsIDB4MDAwMDgzOTAsIDB4MDAwMDgzOTAsIDB4MDAwMDgyMGMsIDB4MDAwMDgyMGMsIDB4MDAwMDgyMGN9LAorCXsweDAwMDA5YTZjLCAweDAwMDA4Mzk0LCAweDAwMDA4Mzk0LCAweDAwMDA4MWE4LCAweDAwMDA4MWE4LCAweDAwMDA4MWE4fSwKKwl7MHgwMDAwOWE3MCwgMHgwMDAwYTM4MCwgMHgwMDAwYTM4MCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NCwgMHgwMDAwODI4NH0sCisJezB4MDAwMDlhNzQsIDB4MDAwMGEzODQsIDB4MDAwMGEzODQsIDB4MDAwMDgyODgsIDB4MDAwMDgyODgsIDB4MDAwMDgyODh9LAorCXsweDAwMDA5YTc4LCAweDAwMDBhMzg4LCAweDAwMDBhMzg4LCAweDAwMDA4MjI0LCAweDAwMDA4MjI0LCAweDAwMDA4MjI0fSwKKwl7MHgwMDAwOWE3YywgMHgwMDAwYTM4YywgMHgwMDAwYTM4YywgMHgwMDAwODI5MCwgMHgwMDAwODI5MCwgMHgwMDAwODI5MH0sCisJezB4MDAwMDlhODAsIDB4MDAwMGEzOTAsIDB4MDAwMGEzOTAsIDB4MDAwMDgzMDAsIDB4MDAwMDgzMDAsIDB4MDAwMDgzMDB9LAorCXsweDAwMDA5YTg0LCAweDAwMDBhMzk0LCAweDAwMDBhMzk0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0LCAweDAwMDA4MzA0fSwKKwl7MHgwMDAwOWE4OCwgMHgwMDAwYTc4MCwgMHgwMDAwYTc4MCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOCwgMHgwMDAwODMwOH0sCisJezB4MDAwMDlhOGMsIDB4MDAwMGE3ODQsIDB4MDAwMGE3ODQsIDB4MDAwMDgzMGMsIDB4MDAwMDgzMGMsIDB4MDAwMDgzMGN9LAorCXsweDAwMDA5YTkwLCAweDAwMDBhNzg4LCAweDAwMDBhNzg4LCAweDAwMDA4MzgwLCAweDAwMDA4MzgwLCAweDAwMDA4MzgwfSwKKwl7MHgwMDAwOWE5NCwgMHgwMDAwYTc4YywgMHgwMDAwYTc4YywgMHgwMDAwODM4NCwgMHgwMDAwODM4NCwgMHgwMDAwODM4NH0sCisJezB4MDAwMDlhOTgsIDB4MDAwMGE3OTAsIDB4MDAwMGE3OTAsIDB4MDAwMDg3MDAsIDB4MDAwMDg3MDAsIDB4MDAwMDg3MDB9LAorCXsweDAwMDA5YTljLCAweDAwMDBhNzk0LCAweDAwMDBhNzk0LCAweDAwMDA4NzA0LCAweDAwMDA4NzA0LCAweDAwMDA4NzA0fSwKKwl7MHgwMDAwOWFhMCwgMHgwMDAwYWI4NCwgMHgwMDAwYWI4NCwgMHgwMDAwODcwOCwgMHgwMDAwODcwOCwgMHgwMDAwODcwOH0sCisJezB4MDAwMDlhYTQsIDB4MDAwMGFiODgsIDB4MDAwMGFiODgsIDB4MDAwMDg3MGMsIDB4MDAwMDg3MGMsIDB4MDAwMDg3MGN9LAorCXsweDAwMDA5YWE4LCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDA4NzgwLCAweDAwMDA4NzgwLCAweDAwMDA4NzgwfSwKKwl7MHgwMDAwOWFhYywgMHgwMDAwYWI5MCwgMHgwMDAwYWI5MCwgMHgwMDAwODc4NCwgMHgwMDAwODc4NCwgMHgwMDAwODc4NH0sCisJezB4MDAwMDlhYjAsIDB4MDAwMGFiOTQsIDB4MDAwMGFiOTQsIDB4MDAwMDhiMDAsIDB4MDAwMDhiMDAsIDB4MDAwMDhiMDB9LAorCXsweDAwMDA5YWI0LCAweDAwMDBhZjgwLCAweDAwMDBhZjgwLCAweDAwMDA4YjA0LCAweDAwMDA4YjA0LCAweDAwMDA4YjA0fSwKKwl7MHgwMDAwOWFiOCwgMHgwMDAwYWY4NCwgMHgwMDAwYWY4NCwgMHgwMDAwOGIwOCwgMHgwMDAwOGIwOCwgMHgwMDAwOGIwOH0sCisJezB4MDAwMDlhYmMsIDB4MDAwMGFmODgsIDB4MDAwMGFmODgsIDB4MDAwMDhiMGMsIDB4MDAwMDhiMGMsIDB4MDAwMDhiMGN9LAorCXsweDAwMDA5YWMwLCAweDAwMDBhZjhjLCAweDAwMDBhZjhjLCAweDAwMDA4YjgwLCAweDAwMDA4YjgwLCAweDAwMDA4YjgwfSwKKwl7MHgwMDAwOWFjNCwgMHgwMDAwYWY5MCwgMHgwMDAwYWY5MCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NCwgMHgwMDAwOGI4NH0sCisJezB4MDAwMDlhYzgsIDB4MDAwMGFmOTQsIDB4MDAwMGFmOTQsIDB4MDAwMDhiODgsIDB4MDAwMDhiODgsIDB4MDAwMDhiODh9LAorCXsweDAwMDA5YWNjLCAweDAwMDBiMzgwLCAweDAwMDBiMzgwLCAweDAwMDA4YjhjLCAweDAwMDA4YjhjLCAweDAwMDA4YjhjfSwKKwl7MHgwMDAwOWFkMCwgMHgwMDAwYjM4NCwgMHgwMDAwYjM4NCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MCwgMHgwMDAwOGI5MH0sCisJezB4MDAwMDlhZDQsIDB4MDAwMGIzODgsIDB4MDAwMGIzODgsIDB4MDAwMDhmODAsIDB4MDAwMDhmODAsIDB4MDAwMDhmODB9LAorCXsweDAwMDA5YWQ4LCAweDAwMDBiMzhjLCAweDAwMDBiMzhjLCAweDAwMDA4Zjg0LCAweDAwMDA4Zjg0LCAweDAwMDA4Zjg0fSwKKwl7MHgwMDAwOWFkYywgMHgwMDAwYjM5MCwgMHgwMDAwYjM5MCwgMHgwMDAwOGY4OCwgMHgwMDAwOGY4OCwgMHgwMDAwOGY4OH0sCisJezB4MDAwMDlhZTAsIDB4MDAwMGIzOTQsIDB4MDAwMGIzOTQsIDB4MDAwMDhmOGMsIDB4MDAwMDhmOGMsIDB4MDAwMDhmOGN9LAorCXsweDAwMDA5YWU0LCAweDAwMDBiMzk4LCAweDAwMDBiMzk4LCAweDAwMDA4ZjkwLCAweDAwMDA4ZjkwLCAweDAwMDA4ZjkwfSwKKwl7MHgwMDAwOWFlOCwgMHgwMDAwYjc4MCwgMHgwMDAwYjc4MCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMCwgMHgwMDAwOTMxMH0sCisJezB4MDAwMDlhZWMsIDB4MDAwMGI3ODQsIDB4MDAwMGI3ODQsIDB4MDAwMDkzMTQsIDB4MDAwMDkzMTQsIDB4MDAwMDkzMTR9LAorCXsweDAwMDA5YWYwLCAweDAwMDBiNzg4LCAweDAwMDBiNzg4LCAweDAwMDA5MzIwLCAweDAwMDA5MzIwLCAweDAwMDA5MzIwfSwKKwl7MHgwMDAwOWFmNCwgMHgwMDAwYjc4YywgMHgwMDAwYjc4YywgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNCwgMHgwMDAwOTMyNH0sCisJezB4MDAwMDlhZjgsIDB4MDAwMGI3OTAsIDB4MDAwMGI3OTAsIDB4MDAwMDkzMjgsIDB4MDAwMDkzMjgsIDB4MDAwMDkzMjh9LAorCXsweDAwMDA5YWZjLCAweDAwMDBiNzk0LCAweDAwMDBiNzk0LCAweDAwMDA5MzJjLCAweDAwMDA5MzJjLCAweDAwMDA5MzJjfSwKKwl7MHgwMDAwOWIwMCwgMHgwMDAwYjc5OCwgMHgwMDAwYjc5OCwgMHgwMDAwOTMzMCwgMHgwMDAwOTMzMCwgMHgwMDAwOTMzMH0sCisJezB4MDAwMDliMDQsIDB4MDAwMGQ3ODQsIDB4MDAwMGQ3ODQsIDB4MDAwMDkzMzQsIDB4MDAwMDkzMzQsIDB4MDAwMDkzMzR9LAorCXsweDAwMDA5YjA4LCAweDAwMDBkNzg4LCAweDAwMDBkNzg4LCAweDAwMDA5MzIxLCAweDAwMDA5MzIxLCAweDAwMDA5MzIxfSwKKwl7MHgwMDAwOWIwYywgMHgwMDAwZDc4YywgMHgwMDAwZDc4YywgMHgwMDAwOTMyNSwgMHgwMDAwOTMyNSwgMHgwMDAwOTMyNX0sCisJezB4MDAwMDliMTAsIDB4MDAwMGQ3OTAsIDB4MDAwMGQ3OTAsIDB4MDAwMDkzMjksIDB4MDAwMDkzMjksIDB4MDAwMDkzMjl9LAorCXsweDAwMDA5YjE0LCAweDAwMDBmNzgwLCAweDAwMDBmNzgwLCAweDAwMDA5MzJkLCAweDAwMDA5MzJkLCAweDAwMDA5MzJkfSwKKwl7MHgwMDAwOWIxOCwgMHgwMDAwZjc4NCwgMHgwMDAwZjc4NCwgMHgwMDAwOTMzMSwgMHgwMDAwOTMzMSwgMHgwMDAwOTMzMX0sCisJezB4MDAwMDliMWMsIDB4MDAwMGY3ODgsIDB4MDAwMGY3ODgsIDB4MDAwMDkzMzUsIDB4MDAwMDkzMzUsIDB4MDAwMDkzMzV9LAorCXsweDAwMDA5YjIwLCAweDAwMDBmNzhjLCAweDAwMDBmNzhjLCAweDAwMDA5MzIyLCAweDAwMDA5MzIyLCAweDAwMDA5MzIyfSwKKwl7MHgwMDAwOWIyNCwgMHgwMDAwZjc5MCwgMHgwMDAwZjc5MCwgMHgwMDAwOTMyNiwgMHgwMDAwOTMyNiwgMHgwMDAwOTMyNn0sCisJezB4MDAwMDliMjgsIDB4MDAwMGY3OTQsIDB4MDAwMGY3OTQsIDB4MDAwMDkzMmEsIDB4MDAwMDkzMmEsIDB4MDAwMDkzMmF9LAorCXsweDAwMDA5YjJjLCAweDAwMDBmN2E0LCAweDAwMDBmN2E0LCAweDAwMDA5MzJlLCAweDAwMDA5MzJlLCAweDAwMDA5MzJlfSwKKwl7MHgwMDAwOWIzMCwgMHgwMDAwZjdhOCwgMHgwMDAwZjdhOCwgMHgwMDAwOTMzMiwgMHgwMDAwOTMzMiwgMHgwMDAwOTMzMn0sCisJezB4MDAwMDliMzQsIDB4MDAwMGY3YWMsIDB4MDAwMGY3YWMsIDB4MDAwMDkzMzYsIDB4MDAwMDkzMzYsIDB4MDAwMDkzMzZ9LAorCXsweDAwMDA5YjM4LCAweDAwMDBmN2IwLCAweDAwMDBmN2IwLCAweDAwMDA5MzIzLCAweDAwMDA5MzIzLCAweDAwMDA5MzIzfSwKKwl7MHgwMDAwOWIzYywgMHgwMDAwZjdiNCwgMHgwMDAwZjdiNCwgMHgwMDAwOTMyNywgMHgwMDAwOTMyNywgMHgwMDAwOTMyN30sCisJezB4MDAwMDliNDAsIDB4MDAwMGY3YTEsIDB4MDAwMGY3YTEsIDB4MDAwMDkzMmIsIDB4MDAwMDkzMmIsIDB4MDAwMDkzMmJ9LAorCXsweDAwMDA5YjQ0LCAweDAwMDBmN2E1LCAweDAwMDBmN2E1LCAweDAwMDA5MzJmLCAweDAwMDA5MzJmLCAweDAwMDA5MzJmfSwKKwl7MHgwMDAwOWI0OCwgMHgwMDAwZjdhOSwgMHgwMDAwZjdhOSwgMHgwMDAwOTMzMywgMHgwMDAwOTMzMywgMHgwMDAwOTMzM30sCisJezB4MDAwMDliNGMsIDB4MDAwMGY3YWQsIDB4MDAwMGY3YWQsIDB4MDAwMDkzMzcsIDB4MDAwMDkzMzcsIDB4MDAwMDkzMzd9LAorCXsweDAwMDA5YjUwLCAweDAwMDBmN2IxLCAweDAwMDBmN2IxLCAweDAwMDA5MzQzLCAweDAwMDA5MzQzLCAweDAwMDA5MzQzfSwKKwl7MHgwMDAwOWI1NCwgMHgwMDAwZjdiNSwgMHgwMDAwZjdiNSwgMHgwMDAwOTM0NywgMHgwMDAwOTM0NywgMHgwMDAwOTM0N30sCisJezB4MDAwMDliNTgsIDB4MDAwMGY3YzUsIDB4MDAwMGY3YzUsIDB4MDAwMDkzNGIsIDB4MDAwMDkzNGIsIDB4MDAwMDkzNGJ9LAorCXsweDAwMDA5YjVjLCAweDAwMDBmN2M5LCAweDAwMDBmN2M5LCAweDAwMDA5MzRmLCAweDAwMDA5MzRmLCAweDAwMDA5MzRmfSwKKwl7MHgwMDAwOWI2MCwgMHgwMDAwZjdjZCwgMHgwMDAwZjdjZCwgMHgwMDAwOTM1MywgMHgwMDAwOTM1MywgMHgwMDAwOTM1M30sCisJezB4MDAwMDliNjQsIDB4MDAwMGY3ZDEsIDB4MDAwMGY3ZDEsIDB4MDAwMDkzNTcsIDB4MDAwMDkzNTcsIDB4MDAwMDkzNTd9LAorCXsweDAwMDA5YjY4LCAweDAwMDBmN2Q1LCAweDAwMDBmN2Q1LCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWI2YywgMHgwMDAwZjdjMiwgMHgwMDAwZjdjMiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliNzAsIDB4MDAwMGY3YzYsIDB4MDAwMGY3YzYsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5Yjc0LCAweDAwMDBmN2NhLCAweDAwMDBmN2NhLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWI3OCwgMHgwMDAwZjdjZSwgMHgwMDAwZjdjZSwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliN2MsIDB4MDAwMGY3ZDIsIDB4MDAwMGY3ZDIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YjgwLCAweDAwMDBmN2Q2LCAweDAwMDBmN2Q2LCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWI4NCwgMHgwMDAwZjdjMywgMHgwMDAwZjdjMywgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliODgsIDB4MDAwMGY3YzcsIDB4MDAwMGY3YzcsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YjhjLCAweDAwMDBmN2NiLCAweDAwMDBmN2NiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWI5MCwgMHgwMDAwZjdkMywgMHgwMDAwZjdkMywgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliOTQsIDB4MDAwMGY3ZDcsIDB4MDAwMGY3ZDcsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5Yjk4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWI5YywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliYTAsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmE0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJhOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliYWMsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmIwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJiNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliYjgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmJjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJjMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliYzQsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmM4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJjYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliZDAsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmQ0LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJkOCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliZGMsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmUwLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJlNCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliZTgsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmVjLCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJmMCwgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDliZjQsIDB4MDAwMGY3ZGIsIDB4MDAwMGY3ZGIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWIsIDB4MDAwMDkzNWJ9LAorCXsweDAwMDA5YmY4LCAweDAwMDBmN2RiLCAweDAwMDBmN2RiLCAweDAwMDA5MzViLCAweDAwMDA5MzViLCAweDAwMDA5MzVifSwKKwl7MHgwMDAwOWJmYywgMHgwMDAwZjdkYiwgMHgwMDAwZjdkYiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1YiwgMHgwMDAwOTM1Yn0sCisJezB4MDAwMDk4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNWEsIDB4MDAwMDEwNWEsIDB4MDAwMDEwNWF9LAorCXsweDAwMDBhODQ4LCAweDAwMDAxMDY2LCAweDAwMDAxMDY2LCAweDAwMDAxMDVhLCAweDAwMDAxMDVhLCAweDAwMDAxMDVhfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjgwTW9kZXNfaGlnaF9wb3dlcl90eF9nYWluXzkyODBfMltdWzZdID0gewotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTE5ZTY1MiwgMHgwYTE5ZTY1MiwgMHgwYTFhYTY1MiwgMHgwYTFhYTY1MiwgMHgwYTFhYTY1MiB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTA3MzljZSwgMHgwNTA3MzljZSwgMHgwNTA3MzljZSwgMHgwNTA3MzljZSwgMHgwNTA3MzljZSB9LAotICAgIHsgMHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwNDAwMiwgMHgwMDAwNDAwMiwgMHgwMDAwNDAwMiB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHgwMDAwNjAwNCwgMHgwMDAwNjAwNCwgMHgwMDAwNzAwOCwgMHgwMDAwNzAwOCwgMHgwMDAwNzAwOCB9LAotICAgIHsgMHgwMDAwYTMwYywgMHgwMDAwYTAwNiwgMHgwMDAwYTAwNiwgMHgwMDAwYzAxMCwgMHgwMDAwYzAxMCwgMHgwMDAwYzAxMCB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAxMDAxMiwgMHgwMDAxMDAxMiwgMHgwMDAxMDAxMiB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHgwMDAxMTAxNCwgMHgwMDAxMTAxNCwgMHgwMDAxMzAxNCwgMHgwMDAxMzAxNCwgMHgwMDAxMzAxNCB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHgwMDAxNTA0YSwgMHgwMDAxNTA0YSwgMHgwMDAxODIwYSwgMHgwMDAxODIwYSwgMHgwMDAxODIwYSB9LAotICAgIHsgMHgwMDAwYTMxYywgMHgwMDAxOTA0YywgMHgwMDAxOTA0YywgMHgwMDAxYjIxMSwgMHgwMDAxYjIxMSwgMHgwMDAxYjIxMSB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHgwMDAxYzA0ZSwgMHgwMDAxYzA0ZSwgMHgwMDAxZTIxMywgMHgwMDAxZTIxMywgMHgwMDAxZTIxMyB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHgwMDAyMTA5MiwgMHgwMDAyMTA5MiwgMHgwMDAyMjQxMSwgMHgwMDAyMjQxMSwgMHgwMDAyMjQxMSB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAyNTEwYSwgMHgwMDAyNTEwYSwgMHgwMDAyNTQxMywgMHgwMDAyNTQxMywgMHgwMDAyNTQxMyB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAyOTEwYywgMHgwMDAyOTEwYywgMHgwMDAyOTgxMSwgMHgwMDAyOTgxMSwgMHgwMDAyOTgxMSB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAyYzE4YiwgMHgwMDAyYzE4YiwgMHgwMDAyYzgxMywgMHgwMDAyYzgxMywgMHgwMDAyYzgxMyB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAyZjFjYywgMHgwMDAyZjFjYywgMHgwMDAzMGExNCwgMHgwMDAzMGExNCwgMHgwMDAzMGExNCB9LAotICAgIHsgMHgwMDAwYTMzOCwgMHgwMDAzMjFlYiwgMHgwMDAzMjFlYiwgMHgwMDAzNWE1MCwgMHgwMDAzNWE1MCwgMHgwMDAzNWE1MCB9LAotICAgIHsgMHgwMDAwYTMzYywgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDAzOWM0YywgMHgwMDAzOWM0YywgMHgwMDAzOWM0YyB9LAotICAgIHsgMHgwMDAwYTM0MCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDAzZGU4YSwgMHgwMDAzZGU4YSwgMHgwMDAzZGU4YSB9LAotICAgIHsgMHgwMDAwYTM0NCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA0MmU5MiwgMHgwMDA0MmU5MiwgMHgwMDA0MmU5MiB9LAotICAgIHsgMHgwMDAwYTM0OCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA0NmVkMiwgMHgwMDA0NmVkMiwgMHgwMDA0NmVkMiB9LAotICAgIHsgMHgwMDAwYTM0YywgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA0YmVkNSwgMHgwMDA0YmVkNSwgMHgwMDA0YmVkNSB9LAotICAgIHsgMHgwMDAwYTM1MCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA0ZmY1NCwgMHgwMDA0ZmY1NCwgMHgwMDA0ZmY1NCB9LAotICAgIHsgMHgwMDAwYTM1NCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA1NWZkNSwgMHgwMDA1NWZkNSwgMHgwMDA1NWZkNSB9LAotICAgIHsgMHgwMDAwNzgxNCwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiB9LAotICAgIHsgMHgwMDAwNzgxYywgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCB9LAotICAgIHsgMHgwMDAwNzg0MCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCB9LAotICAgIHsgMHgwMDAwNzg0NCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCwgMHhmMjU4YTQ4MCB9LAorCXsweDAwMDBhMjc0LCAweDBhMTllNjUyLCAweDBhMTllNjUyLCAweDBhMWFhNjUyLCAweDBhMWFhNjUyLCAweDBhMWFhNjUyfSwKKwl7MHgwMDAwYTI3YywgMHgwNTA3MzljZSwgMHgwNTA3MzljZSwgMHgwNTA3MzljZSwgMHgwNTA3MzljZSwgMHgwNTA3MzljZX0sCisJezB4MDAwMGEzMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzA0LCAweDAwMDAzMDAyLCAweDAwMDAzMDAyLCAweDAwMDA0MDAyLCAweDAwMDA0MDAyLCAweDAwMDA0MDAyfSwKKwl7MHgwMDAwYTMwOCwgMHgwMDAwNjAwNCwgMHgwMDAwNjAwNCwgMHgwMDAwNzAwOCwgMHgwMDAwNzAwOCwgMHgwMDAwNzAwOH0sCisJezB4MDAwMGEzMGMsIDB4MDAwMGEwMDYsIDB4MDAwMGEwMDYsIDB4MDAwMGMwMTAsIDB4MDAwMGMwMTAsIDB4MDAwMGMwMTB9LAorCXsweDAwMDBhMzEwLCAweDAwMDBlMDEyLCAweDAwMDBlMDEyLCAweDAwMDEwMDEyLCAweDAwMDEwMDEyLCAweDAwMDEwMDEyfSwKKwl7MHgwMDAwYTMxNCwgMHgwMDAxMTAxNCwgMHgwMDAxMTAxNCwgMHgwMDAxMzAxNCwgMHgwMDAxMzAxNCwgMHgwMDAxMzAxNH0sCisJezB4MDAwMGEzMTgsIDB4MDAwMTUwNGEsIDB4MDAwMTUwNGEsIDB4MDAwMTgyMGEsIDB4MDAwMTgyMGEsIDB4MDAwMTgyMGF9LAorCXsweDAwMDBhMzFjLCAweDAwMDE5MDRjLCAweDAwMDE5MDRjLCAweDAwMDFiMjExLCAweDAwMDFiMjExLCAweDAwMDFiMjExfSwKKwl7MHgwMDAwYTMyMCwgMHgwMDAxYzA0ZSwgMHgwMDAxYzA0ZSwgMHgwMDAxZTIxMywgMHgwMDAxZTIxMywgMHgwMDAxZTIxM30sCisJezB4MDAwMGEzMjQsIDB4MDAwMjEwOTIsIDB4MDAwMjEwOTIsIDB4MDAwMjI0MTEsIDB4MDAwMjI0MTEsIDB4MDAwMjI0MTF9LAorCXsweDAwMDBhMzI4LCAweDAwMDI1MTBhLCAweDAwMDI1MTBhLCAweDAwMDI1NDEzLCAweDAwMDI1NDEzLCAweDAwMDI1NDEzfSwKKwl7MHgwMDAwYTMyYywgMHgwMDAyOTEwYywgMHgwMDAyOTEwYywgMHgwMDAyOTgxMSwgMHgwMDAyOTgxMSwgMHgwMDAyOTgxMX0sCisJezB4MDAwMGEzMzAsIDB4MDAwMmMxOGIsIDB4MDAwMmMxOGIsIDB4MDAwMmM4MTMsIDB4MDAwMmM4MTMsIDB4MDAwMmM4MTN9LAorCXsweDAwMDBhMzM0LCAweDAwMDJmMWNjLCAweDAwMDJmMWNjLCAweDAwMDMwYTE0LCAweDAwMDMwYTE0LCAweDAwMDMwYTE0fSwKKwl7MHgwMDAwYTMzOCwgMHgwMDAzMjFlYiwgMHgwMDAzMjFlYiwgMHgwMDAzNWE1MCwgMHgwMDAzNWE1MCwgMHgwMDAzNWE1MH0sCisJezB4MDAwMGEzM2MsIDB4MDAwMzQxZWMsIDB4MDAwMzQxZWMsIDB4MDAwMzljNGMsIDB4MDAwMzljNGMsIDB4MDAwMzljNGN9LAorCXsweDAwMDBhMzQwLCAweDAwMDM0MWVjLCAweDAwMDM0MWVjLCAweDAwMDNkZThhLCAweDAwMDNkZThhLCAweDAwMDNkZThhfSwKKwl7MHgwMDAwYTM0NCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA0MmU5MiwgMHgwMDA0MmU5MiwgMHgwMDA0MmU5Mn0sCisJezB4MDAwMGEzNDgsIDB4MDAwMzQxZWMsIDB4MDAwMzQxZWMsIDB4MDAwNDZlZDIsIDB4MDAwNDZlZDIsIDB4MDAwNDZlZDJ9LAorCXsweDAwMDBhMzRjLCAweDAwMDM0MWVjLCAweDAwMDM0MWVjLCAweDAwMDRiZWQ1LCAweDAwMDRiZWQ1LCAweDAwMDRiZWQ1fSwKKwl7MHgwMDAwYTM1MCwgMHgwMDAzNDFlYywgMHgwMDAzNDFlYywgMHgwMDA0ZmY1NCwgMHgwMDA0ZmY1NCwgMHgwMDA0ZmY1NH0sCisJezB4MDAwMGEzNTQsIDB4MDAwMzQxZWMsIDB4MDAwMzQxZWMsIDB4MDAwNTVmZDUsIDB4MDAwNTVmZDUsIDB4MDAwNTVmZDV9LAorCXsweDAwMDBhM2VjLCAweDAwZjcwMDgxLCAweDAwZjcwMDgxLCAweDAwZjcwMDgxLCAweDAwZjcwMDgxLCAweDAwZjcwMDgxfSwKKwl7MHgwMDAwNzgxNCwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZiwgMHgwMDE5OGVmZn0sCisJezB4MDAwMDc4MzgsIDB4MDAxOThlZmYsIDB4MDAxOThlZmYsIDB4MDAxOThlZmYsIDB4MDAxOThlZmYsIDB4MDAxOThlZmZ9LAorCXsweDAwMDA3ODFjLCAweDAwMTcyMDAwLCAweDAwMTcyMDAwLCAweDAwMTcyMDAwLCAweDAwMTcyMDAwLCAweDAwMTcyMDAwfSwKKwl7MHgwMDAwNzg0MCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMCwgMHgwMDE3MjAwMH0sCisJezB4MDAwMDc4MjAsIDB4ZjI1OGE0ODAsIDB4ZjI1OGE0ODAsIDB4ZjI1OGE0ODAsIDB4ZjI1OGE0ODAsIDB4ZjI1OGE0ODB9LAorCXsweDAwMDA3ODQ0LCAweGYyNThhNDgwLCAweGYyNThhNDgwLCAweGYyNThhNDgwLCAweGYyNThhNDgwLCAweGYyNThhNDgwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjgwTW9kZXNfb3JpZ2luYWxfdHhfZ2Fpbl85MjgwXzJbXVs2XSA9IHsKLSAgICB7IDB4MDAwMGEyNzQsIDB4MGExOWM2NTIsIDB4MGExOWM2NTIsIDB4MGExYWE2NTIsIDB4MGExYWE2NTIsIDB4MGExYWE2NTIgfSwKLSAgICB7IDB4MDAwMGEyN2MsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UgfSwKLSAgICB7IDB4MDAwMGEzMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDQsIDB4MDAwMDMwMDIsIDB4MDAwMDMwMDIsIDB4MDAwMDMwMDIsIDB4MDAwMDMwMDIsIDB4MDAwMDMwMDIgfSwKLSAgICB7IDB4MDAwMGEzMDgsIDB4MDAwMDYwMDQsIDB4MDAwMDYwMDQsIDB4MDAwMDgwMDksIDB4MDAwMDgwMDksIDB4MDAwMDgwMDkgfSwKLSAgICB7IDB4MDAwMGEzMGMsIDB4MDAwMGEwMDYsIDB4MDAwMGEwMDYsIDB4MDAwMGIwMGIsIDB4MDAwMGIwMGIsIDB4MDAwMGIwMGIgfSwKLSAgICB7IDB4MDAwMGEzMTAsIDB4MDAwMGUwMTIsIDB4MDAwMGUwMTIsIDB4MDAwMGUwMTIsIDB4MDAwMGUwMTIsIDB4MDAwMGUwMTIgfSwKLSAgICB7IDB4MDAwMGEzMTQsIDB4MDAwMTEwMTQsIDB4MDAwMTEwMTQsIDB4MDAwMTIwNDgsIDB4MDAwMTIwNDgsIDB4MDAwMTIwNDggfSwKLSAgICB7IDB4MDAwMGEzMTgsIDB4MDAwMTUwNGEsIDB4MDAwMTUwNGEsIDB4MDAwMTYwNGEsIDB4MDAwMTYwNGEsIDB4MDAwMTYwNGEgfSwKLSAgICB7IDB4MDAwMGEzMWMsIDB4MDAwMTkwNGMsIDB4MDAwMTkwNGMsIDB4MDAwMWEyMTEsIDB4MDAwMWEyMTEsIDB4MDAwMWEyMTEgfSwKLSAgICB7IDB4MDAwMGEzMjAsIDB4MDAwMWMwNGUsIDB4MDAwMWMwNGUsIDB4MDAwMWUyMTMsIDB4MDAwMWUyMTMsIDB4MDAwMWUyMTMgfSwKLSAgICB7IDB4MDAwMGEzMjQsIDB4MDAwMjAwOTIsIDB4MDAwMjAwOTIsIDB4MDAwMjEyMWIsIDB4MDAwMjEyMWIsIDB4MDAwMjEyMWIgfSwKLSAgICB7IDB4MDAwMGEzMjgsIDB4MDAwMjQxMGEsIDB4MDAwMjQxMGEsIDB4MDAwMjQ0MTIsIDB4MDAwMjQ0MTIsIDB4MDAwMjQ0MTIgfSwKLSAgICB7IDB4MDAwMGEzMmMsIDB4MDAwMjcxMGMsIDB4MDAwMjcxMGMsIDB4MDAwMjg0MTQsIDB4MDAwMjg0MTQsIDB4MDAwMjg0MTQgfSwKLSAgICB7IDB4MDAwMGEzMzAsIDB4MDAwMmIxOGIsIDB4MDAwMmIxOGIsIDB4MDAwMmI0NGEsIDB4MDAwMmI0NGEsIDB4MDAwMmI0NGEgfSwKLSAgICB7IDB4MDAwMGEzMzQsIDB4MDAwMmUxY2MsIDB4MDAwMmUxY2MsIDB4MDAwMzA2NDksIDB4MDAwMzA2NDksIDB4MDAwMzA2NDkgfSwKLSAgICB7IDB4MDAwMGEzMzgsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwMzM2NGIsIDB4MDAwMzM2NGIsIDB4MDAwMzM2NGIgfSwKLSAgICB7IDB4MDAwMGEzM2MsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwMzhhNDksIDB4MDAwMzhhNDksIDB4MDAwMzhhNDkgfSwKLSAgICB7IDB4MDAwMGEzNDAsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwM2JlNDgsIDB4MDAwM2JlNDgsIDB4MDAwM2JlNDggfSwKLSAgICB7IDB4MDAwMGEzNDQsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwM2VlNGEsIDB4MDAwM2VlNGEsIDB4MDAwM2VlNGEgfSwKLSAgICB7IDB4MDAwMGEzNDgsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwNDJlODgsIDB4MDAwNDJlODgsIDB4MDAwNDJlODggfSwKLSAgICB7IDB4MDAwMGEzNGMsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwNDZlOGEsIDB4MDAwNDZlOGEsIDB4MDAwNDZlOGEgfSwKLSAgICB7IDB4MDAwMGEzNTAsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwNDllYzksIDB4MDAwNDllYzksIDB4MDAwNDllYzkgfSwKLSAgICB7IDB4MDAwMGEzNTQsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwNGJmNDIsIDB4MDAwNGJmNDIsIDB4MDAwNGJmNDIgfSwKLSAgICB7IDB4MDAwMDc4MTQsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYgfSwKLSAgICB7IDB4MDAwMDc4MzgsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYgfSwKLSAgICB7IDB4MDAwMDc4MWMsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAgfSwKLSAgICB7IDB4MDAwMDc4NDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAgfSwKLSAgICB7IDB4MDAwMDc4MjAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAgfSwKLSAgICB7IDB4MDAwMDc4NDQsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAsIDB4OTI1OTI0ODAgfSwKKwl7MHgwMDAwYTI3NCwgMHgwYTE5YzY1MiwgMHgwYTE5YzY1MiwgMHgwYTFhYTY1MiwgMHgwYTFhYTY1MiwgMHgwYTFhYTY1Mn0sCisJezB4MDAwMGEyN2MsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2UsIDB4MDUwNzAxY2V9LAorCXsweDAwMDBhMzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwNCwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMiwgMHgwMDAwMzAwMn0sCisJezB4MDAwMGEzMDgsIDB4MDAwMDYwMDQsIDB4MDAwMDYwMDQsIDB4MDAwMDgwMDksIDB4MDAwMDgwMDksIDB4MDAwMDgwMDl9LAorCXsweDAwMDBhMzBjLCAweDAwMDBhMDA2LCAweDAwMDBhMDA2LCAweDAwMDBiMDBiLCAweDAwMDBiMDBiLCAweDAwMDBiMDBifSwKKwl7MHgwMDAwYTMxMCwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMiwgMHgwMDAwZTAxMn0sCisJezB4MDAwMGEzMTQsIDB4MDAwMTEwMTQsIDB4MDAwMTEwMTQsIDB4MDAwMTIwNDgsIDB4MDAwMTIwNDgsIDB4MDAwMTIwNDh9LAorCXsweDAwMDBhMzE4LCAweDAwMDE1MDRhLCAweDAwMDE1MDRhLCAweDAwMDE2MDRhLCAweDAwMDE2MDRhLCAweDAwMDE2MDRhfSwKKwl7MHgwMDAwYTMxYywgMHgwMDAxOTA0YywgMHgwMDAxOTA0YywgMHgwMDAxYTIxMSwgMHgwMDAxYTIxMSwgMHgwMDAxYTIxMX0sCisJezB4MDAwMGEzMjAsIDB4MDAwMWMwNGUsIDB4MDAwMWMwNGUsIDB4MDAwMWUyMTMsIDB4MDAwMWUyMTMsIDB4MDAwMWUyMTN9LAorCXsweDAwMDBhMzI0LCAweDAwMDIwMDkyLCAweDAwMDIwMDkyLCAweDAwMDIxMjFiLCAweDAwMDIxMjFiLCAweDAwMDIxMjFifSwKKwl7MHgwMDAwYTMyOCwgMHgwMDAyNDEwYSwgMHgwMDAyNDEwYSwgMHgwMDAyNDQxMiwgMHgwMDAyNDQxMiwgMHgwMDAyNDQxMn0sCisJezB4MDAwMGEzMmMsIDB4MDAwMjcxMGMsIDB4MDAwMjcxMGMsIDB4MDAwMjg0MTQsIDB4MDAwMjg0MTQsIDB4MDAwMjg0MTR9LAorCXsweDAwMDBhMzMwLCAweDAwMDJiMThiLCAweDAwMDJiMThiLCAweDAwMDJiNDRhLCAweDAwMDJiNDRhLCAweDAwMDJiNDRhfSwKKwl7MHgwMDAwYTMzNCwgMHgwMDAyZTFjYywgMHgwMDAyZTFjYywgMHgwMDAzMDY0OSwgMHgwMDAzMDY0OSwgMHgwMDAzMDY0OX0sCisJezB4MDAwMGEzMzgsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwMzM2NGIsIDB4MDAwMzM2NGIsIDB4MDAwMzM2NGJ9LAorCXsweDAwMDBhMzNjLCAweDAwMDMyMWVjLCAweDAwMDMyMWVjLCAweDAwMDM4YTQ5LCAweDAwMDM4YTQ5LCAweDAwMDM4YTQ5fSwKKwl7MHgwMDAwYTM0MCwgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDAzYmU0OCwgMHgwMDAzYmU0OCwgMHgwMDAzYmU0OH0sCisJezB4MDAwMGEzNDQsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwM2VlNGEsIDB4MDAwM2VlNGEsIDB4MDAwM2VlNGF9LAorCXsweDAwMDBhMzQ4LCAweDAwMDMyMWVjLCAweDAwMDMyMWVjLCAweDAwMDQyZTg4LCAweDAwMDQyZTg4LCAweDAwMDQyZTg4fSwKKwl7MHgwMDAwYTM0YywgMHgwMDAzMjFlYywgMHgwMDAzMjFlYywgMHgwMDA0NmU4YSwgMHgwMDA0NmU4YSwgMHgwMDA0NmU4YX0sCisJezB4MDAwMGEzNTAsIDB4MDAwMzIxZWMsIDB4MDAwMzIxZWMsIDB4MDAwNDllYzksIDB4MDAwNDllYzksIDB4MDAwNDllYzl9LAorCXsweDAwMDBhMzU0LCAweDAwMDMyMWVjLCAweDAwMDMyMWVjLCAweDAwMDRiZjQyLCAweDAwMDRiZjQyLCAweDAwMDRiZjQyfSwKKwl7MHgwMDAwYTNlYywgMHgwMGY3MDA4MSwgMHgwMGY3MDA4MSwgMHgwMGY3MDA4MSwgMHgwMGY3MDA4MSwgMHgwMGY3MDA4MX0sCisJezB4MDAwMDc4MTQsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmYsIDB4MDAxOWJlZmZ9LAorCXsweDAwMDA3ODM4LCAweDAwMTliZWZmLCAweDAwMTliZWZmLCAweDAwMTliZWZmLCAweDAwMTliZWZmLCAweDAwMTliZWZmfSwKKwl7MHgwMDAwNzgxYywgMHgwMDM5MjAwMCwgMHgwMDM5MjAwMCwgMHgwMDM5MjAwMCwgMHgwMDM5MjAwMCwgMHgwMDM5MjAwMH0sCisJezB4MDAwMDc4NDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDAsIDB4MDAzOTIwMDB9LAorCXsweDAwMDA3ODIwLCAweDkyNTkyNDgwLCAweDkyNTkyNDgwLCAweDkyNTkyNDgwLCAweDkyNTkyNDgwLCAweDkyNTkyNDgwfSwKKwl7MHgwMDAwNzg0NCwgMHg5MjU5MjQ4MCwgMHg5MjU5MjQ4MCwgMHg5MjU5MjQ4MCwgMHg5MjU5MjQ4MCwgMHg5MjU5MjQ4MH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4MFBjaWVQaHlfY2xrcmVxX29mZl9MMV85MjgwW11bMl0gPSB7Ci0gICAgezB4MDAwMDQwNDAsICAweDkyNDhmZDAwIH0sCi0gICAgezB4MDAwMDQwNDAsICAweDI0OTI0OTI0IH0sCi0gICAgezB4MDAwMDQwNDAsICAweGE4MDAwMDE5IH0sCi0gICAgezB4MDAwMDQwNDAsICAweDEzMTYwODIwIH0sCi0gICAgezB4MDAwMDQwNDAsICAweGU1OTgwNTYwIH0sCi0gICAgezB4MDAwMDQwNDAsICAweGMwMWRjZmZjIH0sCi0gICAgezB4MDAwMDQwNDAsICAweDFhYWFiZTQxIH0sCi0gICAgezB4MDAwMDQwNDAsICAweGJlMTA1NTU0IH0sCi0gICAgezB4MDAwMDQwNDAsICAweDAwMDQzMDA3IH0sCi0gICAgezB4MDAwMDQwNDQsICAweDAwMDAwMDAwIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA0MDQwLCAweDkyNDhmZDAwfSwKKwl7MHgwMDAwNDA0MCwgMHgyNDkyNDkyNH0sCisJezB4MDAwMDQwNDAsIDB4YTgwMDAwMTl9LAorCXsweDAwMDA0MDQwLCAweDEzMTYwODIwfSwKKwl7MHgwMDAwNDA0MCwgMHhlNTk4MDU2MH0sCisJezB4MDAwMDQwNDAsIDB4YzAxZGNmZmN9LAorCXsweDAwMDA0MDQwLCAweDFhYWFiZTQxfSwKKwl7MHgwMDAwNDA0MCwgMHhiZTEwNTU1NH0sCisJezB4MDAwMDQwNDAsIDB4MDAwNDMwMDd9LAorCXsweDAwMDA0MDQ0LCAweDAwMDAwMDAwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjgwUGNpZVBoeV9jbGtyZXFfYWx3YXlzX29uX0wxXzkyODBbXVsyXSA9IHsKLSAgICB7MHgwMDAwNDA0MCwgIDB4OTI0OGZkMDAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MjQ5MjQ5MjQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YTgwMDAwMTkgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MTMxNjA4MjAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4ZTU5ODA1NjAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YzAxZGNmZmQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MWFhYWJlNDEgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YmUxMDU1NTQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MDAwNDMwMDcgfSwKLSAgICB7MHgwMDAwNDA0NCwgIDB4MDAwMDAwMDAgfSwKLX07Ci0KLS8qIEFSOTI4NSBSZXZzaW9uIDEwKi8KLXN0YXRpYyBjb25zdCB1MzIgYXI5Mjg1TW9kZXNfOTI4NVtdWzZdID0gewotICAgIHsgMHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4YywgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTBiMCwgMHgwMDAwMGU2MCwgMHgwMDAwMWNjMCwgMHgwMDAwN2M3MCwgMHgwMDAwM2UzOCwgMHgwMDAwMTE4MCB9LAotICAgIHsgMHgwMDAwMTBmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwODAxNCwgMHgwM2U4MDNlOCwgMHgwN2QwMDdkMCwgMHgxMDgwMTYwMCwgMHgwODQwMGIwMCwgMHgwNmUwMDZlMCB9LAotICAgIHsgMHgwMDAwODAxYywgMHgxMjhkODAyNywgMHgxMjhkODA0ZiwgMHgxMmUwMDA1NywgMHgxMmUwMDAyYiwgMHgwOTg4MDA0ZiB9LAotICAgIHsgMHgwMDAwODMxOCwgMHgwMDAwM2U4MCwgMHgwMDAwN2QwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MCwgMHgwMDAwNjg4MCB9LAotICAgIHsgMHgwMDAwOTgwNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMyB9LAotICAgIHsgMHgwMDAwOTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCB9LAotICAgIHsgMHgwMDAwOTgyNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgyOCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSB9LAotICAgIHsgMHgwMDAwOTgzNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNyB9LAotICAgIHsgMHgwMDAwOTg0MCwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSB9LAotICAgIHsgMHgwMDAwOTg0NCwgMHgwMzcyMTYxZSwgMHgwMzcyMTYxZSwgMHgwMzcyMDAyMCwgMHgwMzcyMDAyMCwgMHgwMzcyMTZhMCB9LAotICAgIHsgMHgwMDAwOTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMDA0ZSwgMHgwMDAwMDA0ZSwgMHgwMDAwMTA1OSB9LAotICAgIHsgMHgwMDAwOTg1MCwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiB9LAotICAgIHsgMHgwMDAwOTg1OCwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSB9LAotICAgIHsgMHgwMDAwOTg1YywgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM2NjA1ZSwgMHgzMTM2NjA1ZSwgMHgzMTM5NjA1ZSB9LAotICAgIHsgMHgwMDAwOTg2MCwgMHgwMDA1OGQxOCwgMHgwMDA1OGQxOCwgMHgwMDA1OGQyMCwgMHgwMDA1OGQyMCwgMHgwMDA1OGQxOCB9LAotICAgIHsgMHgwMDAwOTg2NCwgMHgwMDAwZmUwMCwgMHgwMDAwZmUwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCB9LAotICAgIHsgMHgwMDAwOTg2OCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCB9LAotICAgIHsgMHgwMDAwOTg2YywgMHgwNjkwMzA4MSwgMHgwNjkwMzA4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MSB9LAotICAgIHsgMHgwMDAwOTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMGZhMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMCB9LAotICAgIHsgMHgwMDAwOTkxOCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNiB9LAotICAgIHsgMHgwMDAwOTkyNCwgMHhkMDBhODAwNywgMHhkMDBhODAwNywgMHhkMDBhODAwZCwgMHhkMDBhODAwZCwgMHhkMDBhODAwZCB9LAotICAgIHsgMHgwMDAwOTk0NCwgMHhkZmJjMTAxMCwgMHhkZmJjMTAxMCwgMHhkZmJjMTAyMCwgMHhkZmJjMTAyMCwgMHhkZmJjMTAxMCB9LAotICAgIHsgMHgwMDAwOTk2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTliOCwgMHgwMGNmNGQxYywgMHgwMGNmNGQxYywgMHgwMGNmNGQxYywgMHgwMGNmNGQxYywgMHgwMGNmNGQxYyB9LAotICAgIHsgMHgwMDAwOTliYywgMHgwMDAwMDYwMCwgMHgwMDAwMDYwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCB9LAotICAgIHsgMHgwMDAwOTljMCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCB9LAotICAgIHsgMHgwMDAwOTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NyB9LAotICAgIHsgMHgwMDAwOTljOCwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSwgMHg2MGY2NTMyOSB9LAotICAgIHsgMHgwMDAwOTljYywgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCB9LAotICAgIHsgMHgwMDAwOTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCB9LAotICAgIHsgMHgwMDAwOTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4NCwgMHgwMDA2ODA4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4OCwgMHgwMDA2ODA4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4YywgMHgwMDA2ODA4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwMCwgMHgwMDA2ODEwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWExMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwNCwgMHgwMDA2ODEwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWExNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwOCwgMHgwMDA2ODEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWExOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwYywgMHgwMDA2ODEwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWExYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODExMCwgMHgwMDA2ODExMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODExNCwgMHgwMDA2ODExNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4MCwgMHgwMDA2ODE4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4NCwgMHgwMDA2ODE4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4OCwgMHgwMDA2ODE4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4YywgMHgwMDA2ODE4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE5MCwgMHgwMDA2ODE5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE5NCwgMHgwMDA2ODE5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWEzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODFhMCwgMHgwMDA2ODFhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODIwYywgMHgwMDA2ODIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODFhOCwgMHgwMDA2ODFhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODI4NCwgMHgwMDA2ODI4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODI4OCwgMHgwMDA2ODI4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODIyMCwgMHgwMDA2ODIyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODI5MCwgMHgwMDA2ODI5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwMCwgMHgwMDA2ODMwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwNCwgMHgwMDA2ODMwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwOCwgMHgwMDA2ODMwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwYywgMHgwMDA2ODMwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODM4MCwgMHgwMDA2ODM4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODM4NCwgMHgwMDA2ODM4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwMCwgMHgwMDA2ODcwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwNCwgMHgwMDA2ODcwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwOCwgMHgwMDA2ODcwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwYywgMHgwMDA2ODcwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4MCwgMHgwMDA2ODc4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4NCwgMHgwMDA2ODc4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGIwNCwgMHgwMDA2OGIwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGIwOCwgMHgwMDA2OGIwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGIwOCwgMHgwMDA2OGIwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGIwYywgMHgwMDA2OGIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI4MCwgMHgwMDA2OGI4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWE5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI4NCwgMHgwMDA2OGI4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI4OCwgMHgwMDA2OGI4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI4YywgMHgwMDA2OGI4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGI5MCwgMHgwMDBiOGI5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4MCwgMHgwMDBiOGY4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4NCwgMHgwMDBiOGY4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4OCwgMHgwMDBiOGY4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4YywgMHgwMDBiOGY4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY5MCwgMHgwMDBiOGY5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjMwYywgMHgwMDBiYjMwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjMxMCwgMHgwMDBiYjMxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM4NCwgMHgwMDBiYjM4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM4OCwgMHgwMDBiYjM4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjMyNCwgMHgwMDBiYjMyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjcwNCwgMHgwMDBiYjcwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTZhNCwgMHgwMDBmOTZhNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTZhOCwgMHgwMDBmOTZhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxMCwgMHgwMDBmOTcxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxNCwgMHgwMDBmOTcxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcyMCwgMHgwMDBmOTcyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcyNCwgMHgwMDBmOTcyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcyOCwgMHgwMDBmOTcyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcyYywgMHgwMDBmOTcyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTdhMCwgMHgwMDBmOTdhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWFmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTdhNCwgMHgwMDBmOTdhNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhOCwgMHgwMDBmYjdhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiMCwgMHgwMDBmYjdiMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiNCwgMHgwMDBmYjdiNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiOCwgMHgwMDBmYjdiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhNSwgMHgwMDBmYjdhNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhOSwgMHgwMDBmYjdhOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhZCwgMHgwMDBmYjdhZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiMSwgMHgwMDBmYjdiMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiNSwgMHgwMDBmYjdiNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiOSwgMHgwMDBmYjdiOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjNSwgMHgwMDBmYjdjNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjOSwgMHgwMDBmYjdjOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMSwgMHgwMDBmYjdkMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkNSwgMHgwMDBmYjdkNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkOSwgMHgwMDBmYjdkOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWIzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjNiwgMHgwMDBmYjdjNiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjYSwgMHgwMDBmYjdjYSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjZSwgMHgwMDBmYjdjZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMiwgMHgwMDBmYjdkMiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkNiwgMHgwMDBmYjdkNiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjMywgMHgwMDBmYjdjMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjNywgMHgwMDBmYjdjNywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjYiwgMHgwMDBmYjdjYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjZiwgMHgwMDBmYjdjZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkNywgMHgwMDBmYjdkNywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWI5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOWJmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkYiwgMHgwMDBmYjdkYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODAxYywgMHgwMDA2ODAxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4MCwgMHgwMDA2ODA4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4NCwgMHgwMDA2ODA4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4OCwgMHgwMDA2ODA4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWExMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODA4YywgMHgwMDA2ODA4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWExNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwMCwgMHgwMDA2ODEwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWExOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwNCwgMHgwMDA2ODEwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWExYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwOCwgMHgwMDA2ODEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODEwYywgMHgwMDA2ODEwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODExMCwgMHgwMDA2ODExMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODExMCwgMHgwMDA2ODExMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4MCwgMHgwMDA2ODE4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4NCwgMHgwMDA2ODE4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4OCwgMHgwMDA2ODE4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE4YywgMHgwMDA2ODE4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWEzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE5MCwgMHgwMDA2ODE5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODE5NCwgMHgwMDA2ODE5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODFhMCwgMHgwMDA2ODFhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODIwYywgMHgwMDA2ODIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODFhOCwgMHgwMDA2ODFhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODFhYywgMHgwMDA2ODFhYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODIxYywgMHgwMDA2ODIxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODIyNCwgMHgwMDA2ODIyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODI5MCwgMHgwMDA2ODI5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwMCwgMHgwMDA2ODMwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwOCwgMHgwMDA2ODMwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMwYywgMHgwMDA2ODMwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODMxMCwgMHgwMDA2ODMxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4OCwgMHgwMDA2ODc4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4YywgMHgwMDA2ODc4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc5MCwgMHgwMDA2ODc5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc5NCwgMHgwMDA2ODc5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc5OCwgMHgwMDA2ODc5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc5YywgMHgwMDA2ODc5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI4OSwgMHgwMDA2OGI4OSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI4ZCwgMHgwMDA2OGI4ZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI5MSwgMHgwMDA2OGI5MSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI5NSwgMHgwMDA2OGI5NSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGI5OSwgMHgwMDA2OGI5OSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWE5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGJhNSwgMHgwMDA2OGJhNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGJhOSwgMHgwMDA2OGJhOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2OGJhZCwgMHgwMDA2OGJhZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGIwYywgMHgwMDBiOGIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGYxMCwgMHgwMDBiOGYxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGYxNCwgMHgwMDBiOGYxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4NCwgMHgwMDBiOGY4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4NCwgMHgwMDBiOGY4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiOGY4OCwgMHgwMDBiOGY4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM4MCwgMHgwMDBiYjM4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM4NCwgMHgwMDBiYjM4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM4OCwgMHgwMDBiYjM4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM4YywgMHgwMDBiYjM4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjM5NCwgMHgwMDBiYjM5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBiYjc5OCwgMHgwMDBiYjc5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcwYywgMHgwMDBmOTcwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxMCwgMHgwMDBmOTcxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxNCwgMHgwMDBmOTcxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxOCwgMHgwMDBmOTcxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcwNSwgMHgwMDBmOTcwNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcwOSwgMHgwMDBmOTcwOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcwZCwgMHgwMDBmOTcwZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxMSwgMHgwMDBmOTcxMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxNSwgMHgwMDBmOTcxNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWFmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmOTcxOSwgMHgwMDBmOTcxOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhNCwgMHgwMDBmYjdhNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhOCwgMHgwMDBmYjdhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhYywgMHgwMDBmYjdhYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhYywgMHgwMDBmYjdhYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiMCwgMHgwMDBmYjdiMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiOCwgMHgwMDBmYjdiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiYywgMHgwMDBmYjdiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhMSwgMHgwMDBmYjdhMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhNSwgMHgwMDBmYjdhNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdhOSwgMHgwMDBmYjdhOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiMSwgMHgwMDBmYjdiMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiNSwgMHgwMDBmYjdiNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdiZCwgMHgwMDBmYjdiZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjOSwgMHgwMDBmYjdjOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjZCwgMHgwMDBmYjdjZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWIzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMSwgMHgwMDBmYjdkMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkOSwgMHgwMDBmYjdkOSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjMiwgMHgwMDBmYjdjMiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjNiwgMHgwMDBmYjdjNiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjYSwgMHgwMDBmYjdjYSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjZSwgMHgwMDBmYjdjZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMiwgMHgwMDBmYjdkMiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkNiwgMHgwMDBmYjdkNiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjMywgMHgwMDBmYjdjMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdjYiwgMHgwMDBmYjdjYiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWI5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYWJmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBmYjdkMywgMHgwMDBmYjdkMywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTIwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNCB9LAotICAgIHsgMHgwMDAwYTIwYywgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxZjAwMCB9LAotICAgIHsgMHgwMDAwYTIxYywgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSB9LAotICAgIHsgMHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1MCwgMHgwMDFmZjAwMCwgMHgwMDFmZjAwMCwgMHgwMDFjYTAwMCwgMHgwMDFjYTAwMCwgMHgwMDFkYTAwMCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTgxYzY1MiwgMHgwYTgxYzY1MiwgMHgwYTgyMDY1MiwgMHgwYTgyMDY1MiwgMHgwYTgyYTY1MiB9LAotICAgIHsgMHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwNzIwMSwgMHgwMDAwNzIwMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDQwOCwgMHgwMDAxMDQwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxODYwYSwgMHgwMDAxODYwYSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyMDgxOCwgMHgwMDAyMDgxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyNDg1OCwgMHgwMDAyNDg1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyNjg1OSwgMHgwMDAyNjg1OSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyOTg1YiwgMHgwMDAyOTg1YiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyYzg5YSwgMHgwMDAyYzg5YSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyZTg5YiwgMHgwMDAyZTg5YiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMDg5YywgMHgwMDAzMDg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMjg5ZCwgMHgwMDAzMjg5ZCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzNDg5ZSwgMHgwMDAzNDg5ZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzODhkZSwgMHgwMDAzODhkZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzYjkxZSwgMHgwMDAzYjkxZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzZDk1ZSwgMHgwMDAzZDk1ZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0MTlkZiwgMHgwMDA0MTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1OCwgMHg3OTk5YWEwMiwgMHg3OTk5YWEwMiwgMHg3OTk5YWEwZSwgMHg3OTk5YWEwZSwgMHg3OTk5YWEwZSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkyODVDb21tb25fOTI4NVtdWzJdID0gewotICAgIHsgMHgwMDAwMDAwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDAzMCwgMHgwMDAyMDA0NSB9LAotICAgIHsgMHgwMDAwMDAzNCwgMHgwMDAwMDAwNSB9LAotICAgIHsgMHgwMDAwMDA0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDA0NCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwMDA0OCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwMDA0YywgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwMDA1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDA1NCwgMHgwMDAwMDAxZiB9LAotICAgIHsgMHgwMDAwMDgwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA0MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0OCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0YywgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1OCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1YywgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA2MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA2NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTIzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTAzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTEzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTE3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTIzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTMzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTM3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQ3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTRiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTRmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTUzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTU3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTViOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTVmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTYzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTY3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTZiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTZmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTczOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTc3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTdiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTdmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTAzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTEzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTE3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTIzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTMzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTM3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQ3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNDAzMCwgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNDAzYywgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNDAyNCwgMHgwMDAwMDAxZiB9LAotICAgIHsgMHgwMDAwNDA2MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNDA2NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzAxMCwgMHgwMDAwMDAzMSB9LAotICAgIHsgMHgwMDAwNzAzNCwgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNzAzOCwgMHgwMDAwMDRjMiB9LAotICAgIHsgMHgwMDAwODAwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAxOCwgMHgwMDAwMDcwMCB9LAotICAgIHsgMHgwMDAwODAyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA0OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1YywgMHgwMDBmYzc4ZiB9LAotICAgIHsgMHgwMDAwODA2MCwgMHgwMDAwMDAwZiB9LAotICAgIHsgMHgwMDAwODA2NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBjMCwgMHgyYTgwMDAxYSB9LAotICAgIHsgMHgwMDAwODBjNCwgMHgwNWRjMDFlMCB9LAotICAgIHsgMHgwMDAwODBjOCwgMHgxZjQwMjcxMCB9LAotICAgIHsgMHgwMDAwODBjYywgMHgwMWY0MDAwMCB9LAotICAgIHsgMHgwMDAwODBkMCwgMHgwMDAwMWUwMCB9LAotICAgIHsgMHgwMDAwODBkNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBkOCwgMHgwMDQwMDAwMCB9LAotICAgIHsgMHgwMDAwODBlMCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODBlNCwgMHgwMDAwZmZmZiB9LAotICAgIHsgMHgwMDAwODBlOCwgMHgwMDNmM2YzZiB9LAotICAgIHsgMHgwMDAwODBlYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmYywgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwODEwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwODEwNCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwODEwOCwgMHgwMDAwMDA1MiB9LAotICAgIHsgMHgwMDAwODEwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODExMCwgMHgwMDAwMDE2OCB9LAotICAgIHsgMHgwMDAwODExOCwgMHgwMDAxMDBhYSB9LAotICAgIHsgMHgwMDAwODExYywgMHgwMDAwMzIxMCB9LAotICAgIHsgMHgwMDAwODEyMCwgMHgwOGYwNDgwMCB9LAotICAgIHsgMHgwMDAwODEyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE0NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE2YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE3MCwgMHgzMjE0MzMyMCB9LAotICAgIHsgMHgwMDAwODE3NCwgMHhmYWE0ZmE1MCB9LAotICAgIHsgMHgwMDAwODE3OCwgMHgwMDAwMDEwMCB9LAotICAgIHsgMHgwMDAwODE3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFjMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFkMCwgMHgwMDAwMzIxMCB9LAotICAgIHsgMHgwMDAwODFlYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI0MCwgMHgwMDEwMDAwMCB9LAotICAgIHsgMHgwMDAwODI0NCwgMHgwMDEwZjQwMCB9LAotICAgIHsgMHgwMDAwODI0OCwgMHgwMDAwMDEwMCB9LAotICAgIHsgMHgwMDAwODI0YywgMHgwMDAxZTgwMCB9LAotICAgIHsgMHgwMDAwODI1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1YywgMHg0MDAwMDBmZiB9LAotICAgIHsgMHgwMDAwODI2MCwgMHgwMDA4MDkyMiB9LAotICAgIHsgMHgwMDAwODI2NCwgMHg4OGEwMDAxMCB9LAotICAgIHsgMHgwMDAwODI3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI3NCwgMHg0MDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI3OCwgMHgwMDNlNDE4MCB9LAotICAgIHsgMHgwMDAwODI3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI4NCwgMHgwMDAwMDAyYyB9LAotICAgIHsgMHgwMDAwODI4OCwgMHgwMDAwMDAyYyB9LAotICAgIHsgMHgwMDAwODI4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMwMCwgMHgwMDAwMDA0MCB9LAotICAgIHsgMHgwMDAwODMxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMyYywgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwODMzMCwgMHgwMDAwMDMwMiB9LAotICAgIHsgMHgwMDAwODMzNCwgMHgwMDAwMGUwMCB9LAotICAgIHsgMHgwMDAwODMzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM0MCwgMHgwMDAxMDM4MCB9LAotICAgIHsgMHgwMDAwODM0NCwgMHgwMDQ4MTA0MyB9LAotICAgIHsgMHgwMDAwOTgwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgwYywgMHhhZmU2OGUzMCB9LAotICAgIHsgMHgwMDAwOTgxMCwgMHhmZDE0ZTAwMCB9LAotICAgIHsgMHgwMDAwOTgxNCwgMHg5YzBhOWY2YiB9LAotICAgIHsgMHgwMDAwOTgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgyYywgMHgwMDAwYTAwMCB9LAotICAgIHsgMHgwMDAwOTgzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgzYywgMHgwMDIwMDQwMCB9LAotICAgIHsgMHgwMDAwOTg0YywgMHgwMDQwMjMzYyB9LAotICAgIHsgMHgwMDAwOTg1NCwgMHgwMDAwMDA0NCB9LAotICAgIHsgMHgwMDAwOTkwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkxMCwgMHgwMTAwMjMxMCB9LAotICAgIHsgMHgwMDAwOTkxYywgMHgxMDAwMGZmZiB9LAotICAgIHsgMHgwMDAwOTkyMCwgMHgwNDkwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkyOCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTkyYywgMHgwMDAwMDAwNCB9LAotICAgIHsgMHgwMDAwOTkzNCwgMHgxZTFmMjAyMiB9LAotICAgIHsgMHgwMDAwOTkzOCwgMHgwYTBiMGMwZCB9LAotICAgIHsgMHgwMDAwOTkzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk0MCwgMHgxNDc1MDYwNCB9LAotICAgIHsgMHgwMDAwOTk0OCwgMHg5MjgwYzAwYSB9LAotICAgIHsgMHgwMDAwOTk0YywgMHgwMDAyMDAyOCB9LAotICAgIHsgMHgwMDAwOTk1NCwgMHg1ZjNjYTNkZSB9LAotICAgIHsgMHgwMDAwOTk1OCwgMHgyMTA4ZWNmZiB9LAotICAgIHsgMHgwMDAwOTk2OCwgMHgwMDAwMDNjZSB9LAotICAgIHsgMHgwMDAwOTk3MCwgMHgxOTI3YjUxNSB9LAotICAgIHsgMHgwMDAwOTk3NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk3OCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTk3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk4YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlhNCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTlhOCwgMHgyMDFmZmYwMCB9LAotICAgIHsgMHgwMDAwOTlhYywgMHgyZGVmMGEwMCB9LAotICAgIHsgMHgwMDAwOTliMCwgMHgwMzA1MTAwMCB9LAotICAgIHsgMHgwMDAwOTliNCwgMHgwMDAwMDgyMCB9LAotICAgIHsgMHgwMDAwOTlkYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTllMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTllNCwgMHhhYWFhYWFhYSB9LAotICAgIHsgMHgwMDAwOTllOCwgMHgzYzQ2NjQ3OCB9LAotICAgIHsgMHgwMDAwOTllYywgMHgwY2M4MGNhYSB9LAotICAgIHsgMHgwMDAwOTlmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTIwOCwgMHg4MDNlNjc4OCB9LAotICAgIHsgMHgwMDAwYTIxMCwgMHg0MDgwYTMzMyB9LAotICAgIHsgMHgwMDAwYTIxNCwgMHgwMDIwNmMxMCB9LAotICAgIHsgMHgwMDAwYTIxOCwgMHgwMDljNDA2MCB9LAotICAgIHsgMHgwMDAwYTIyMCwgMHgwMTgzNDA2MSB9LAotICAgIHsgMHgwMDAwYTIyNCwgMHgwMDAwMDQwMCB9LAotICAgIHsgMHgwMDAwYTIyOCwgMHgwMDAwMDNiNSB9LAotICAgIHsgMHgwMDAwYTIyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTIzNCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTIzOCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTI0NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI0OCwgMHhmZmZmZmZmYyB9LAotICAgIHsgMHgwMDAwYTI0YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1OCwgMHgwY2NiNTM4MCB9LAotICAgIHsgMHgwMDAwYTI1YywgMHgxNTE1MTUwMSB9LAotICAgIHsgMHgwMDAwYTI2MCwgMHhkZmE5MGYwMSB9LAotICAgIHsgMHgwMDAwYTI2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI2YywgMHgwZWJhZTllNiB9LAotICAgIHsgMHgwMDAwZDI3MCwgMHgwZDgyMDgyMCB9LAotICAgIHsgMHgwMDAwYTI3OCwgMHgzOWNlNzM5YyB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTBlMDM5YyB9LAotICAgIHsgMHgwMDAwZDM1YywgMHgwN2ZmZmZlZiB9LAotICAgIHsgMHgwMDAwZDM2MCwgMHgwZmZmZmZlNyB9LAotICAgIHsgMHgwMDAwZDM2NCwgMHgxN2ZmZmZlNSB9LAotICAgIHsgMHgwMDAwZDM2OCwgMHgxZmZmZmZlNCB9LAotICAgIHsgMHgwMDAwZDM2YywgMHgzN2ZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3MCwgMHgzZmZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3NCwgMHg1N2ZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3OCwgMHg1ZmZmZmZlMiB9LAotICAgIHsgMHgwMDAwZDM3YywgMHg3ZmZmZmZlMiB9LAotICAgIHsgMHgwMDAwZDM4MCwgMHg3ZjNjN2JiYSB9LAotICAgIHsgMHgwMDAwZDM4NCwgMHhmMzMwN2ZmMCB9LAotICAgIHsgMHgwMDAwYTM4OCwgMHgwYzAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM4YywgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTM5MCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTM5NCwgMHgzOWNlNzM5YyB9LAotICAgIHsgMHgwMDAwYTM5OCwgMHgwMDAwMDM5YyB9LAotICAgIHsgMHgwMDAwYTM5YywgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwYTNhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNhNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNhOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNhYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNjMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNjNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNjYywgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkMCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkNCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkYywgMHgzOWNlNzM5YyB9LAotICAgIHsgMHgwMDAwYTNlMCwgMHgwMDAwMDM5YyB9LAotICAgIHsgMHgwMDAwYTNlNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNlOCwgMHgxOGM0MzQzMyB9LAotICAgIHsgMHgwMDAwYTNlYywgMHgwMGY3MDA4MSB9LAotICAgIHsgMHgwMDAwNzgwMCwgMHgwMDE0MDAwMCB9LAotICAgIHsgMHgwMDAwNzgwNCwgMHgwZTQ1NDhkOCB9LAotICAgIHsgMHgwMDAwNzgwOCwgMHg1NDIxNDUxNCB9LAotICAgIHsgMHgwMDAwNzgwYywgMHgwMjAyNTgyMCB9LAotICAgIHsgMHgwMDAwNzgxMCwgMHg3MWMwZDM4OCB9LAotICAgIHsgMHgwMDAwNzgxNCwgMHg5MjQ5MzRhOCB9LAotICAgIHsgMHgwMDAwNzgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHgwMDAwMGMwNCB9LAotICAgIHsgMHgwMDAwNzgyNCwgMHgwMGQ4NmZmZiB9LAotICAgIHsgMHgwMDAwNzgyOCwgMHgyNmQyNDkxYiB9LAotICAgIHsgMHgwMDAwNzgyYywgMHg2ZTM2ZDk3YiB9LAotICAgIHsgMHgwMDAwNzgzMCwgMHhlZGI2ZDk2YyB9LAotICAgIHsgMHgwMDAwNzgzNCwgMHg3MTQwMDA4NiB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHhmYWM2ODgwMCB9LAotICAgIHsgMHgwMDAwNzgzYywgMHgwMDAxZmZmZSB9LAotICAgIHsgMHgwMDAwNzg0MCwgMHhmZmViMWEyMCB9LAotICAgIHsgMHgwMDAwNzg0NCwgMHgwMDBjMGRiNiB9LAotICAgIHsgMHgwMDAwNzg0OCwgMHg2ZGI2MWI2ZiB9LAotICAgIHsgMHgwMDAwNzg0YywgMHg2ZDliNjZkYiB9LAotICAgIHsgMHgwMDAwNzg1MCwgMHg2ZDhjNmRiYSB9LAotICAgIHsgMHgwMDAwNzg1NCwgMHgwMDA0MDAwMCB9LAotICAgIHsgMHgwMDAwNzg1OCwgMHhkYjAwMzAxMiB9LAotICAgIHsgMHgwMDAwNzg1YywgMHgwNDkyNDkxNCB9LAotICAgIHsgMHgwMDAwNzg2MCwgMHgyMTA4NDIxMCB9LAotICAgIHsgMHgwMDAwNzg2NCwgMHhmN2Q3ZmZkZSB9LAotICAgIHsgMHgwMDAwNzg2OCwgMHhjMjAzNDA4MCB9LAotICAgIHsgMHgwMDAwNzg2YywgMHg0ODYwOWViNCB9LAotICAgIHsgMHgwMDAwNzg3MCwgMHgxMDE0MmMwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHg5MjQ4ZmQwMH0sCisJezB4MDAwMDQwNDAsIDB4MjQ5MjQ5MjR9LAorCXsweDAwMDA0MDQwLCAweGE4MDAwMDE5fSwKKwl7MHgwMDAwNDA0MCwgMHgxMzE2MDgyMH0sCisJezB4MDAwMDQwNDAsIDB4ZTU5ODA1NjB9LAorCXsweDAwMDA0MDQwLCAweGMwMWRjZmZkfSwKKwl7MHgwMDAwNDA0MCwgMHgxYWFhYmU0MX0sCisJezB4MDAwMDQwNDAsIDB4YmUxMDU1NTR9LAorCXsweDAwMDA0MDQwLCAweDAwMDQzMDA3fSwKKwl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4NVBjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg1W11bMl0gPSB7Ci0gICAgezB4MDAwMDQwNDAsICAweDkyNDhmZDAwIH0sCi0gICAgezB4MDAwMDQwNDAsICAweDI0OTI0OTI0IH0sCi0gICAgezB4MDAwMDQwNDAsICAweGE4MDAwMDE5IH0sCi0gICAgezB4MDAwMDQwNDAsICAweDEzMTYwODIwIH0sCi0gICAgezB4MDAwMDQwNDAsICAweGU1OTgwNTYwIH0sCi0gICAgezB4MDAwMDQwNDAsICAweGMwMWRjZmZkIH0sCi0gICAgezB4MDAwMDQwNDAsICAweDFhYWFiZTQxIH0sCi0gICAgezB4MDAwMDQwNDAsICAweGJlMTA1NTU0IH0sCi0gICAgezB4MDAwMDQwNDAsICAweDAwMDQzMDA3IH0sCi0gICAgezB4MDAwMDQwNDQsICAweDAwMDAwMDAwIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA0MDQwLCAweDkyNDhmZDAwfSwKKwl7MHgwMDAwNDA0MCwgMHgyNDkyNDkyNH0sCisJezB4MDAwMDQwNDAsIDB4YTgwMDAwMTl9LAorCXsweDAwMDA0MDQwLCAweDEzMTYwODIwfSwKKwl7MHgwMDAwNDA0MCwgMHhlNTk4MDU2MH0sCisJezB4MDAwMDQwNDAsIDB4YzAxZGNmZmR9LAorCXsweDAwMDA0MDQwLCAweDFhYWFiZTQxfSwKKwl7MHgwMDAwNDA0MCwgMHhiZTEwNTU1NH0sCisJezB4MDAwMDQwNDAsIDB4MDAwNDMwMDd9LAorCXsweDAwMDA0MDQ0LCAweDAwMDAwMDAwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5Mjg1UGNpZVBoeV9jbGtyZXFfb2ZmX0wxXzkyODVbXVsyXSA9IHsKLSAgICB7MHgwMDAwNDA0MCwgIDB4OTI0OGZkMDAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MjQ5MjQ5MjQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YTgwMDAwMTkgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MTMxNjA4MjAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4ZTU5ODA1NjAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YzAxZGNmZmMgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MWFhYWJlNDEgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YmUxMDU1NTQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MDAwNDMwMDcgfSwKLSAgICB7MHgwMDAwNDA0NCwgIDB4MDAwMDAwMDAgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDQwNDAsIDB4OTI0OGZkMDB9LAorCXsweDAwMDA0MDQwLCAweDI0OTI0OTI0fSwKKwl7MHgwMDAwNDA0MCwgMHhhODAwMDAxOX0sCisJezB4MDAwMDQwNDAsIDB4MTMxNjA4MjB9LAorCXsweDAwMDA0MDQwLCAweGU1OTgwNTYwfSwKKwl7MHgwMDAwNDA0MCwgMHhjMDFkY2ZmY30sCisJezB4MDAwMDQwNDAsIDB4MWFhYWJlNDF9LAorCXsweDAwMDA0MDQwLCAweGJlMTA1NTU0fSwKKwl7MHgwMDAwNDA0MCwgMHgwMDA0MzAwN30sCisJezB4MDAwMDQwNDQsIDB4MDAwMDAwMDB9LAogfTsKIAotLyogQVI5Mjg1IHYxXzIgUENJIFJlZ2lzdGVyIFdyaXRlcy4gIENyZWF0ZWQ6IDA0LzEzLzA5ICovCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4NU1vZGVzXzkyODVfMV8yW11bNl0gPSB7Ci0gICAgLyogQWRkcmVzcyAgICAgIDVHLUhUMjAgICAgIDVHLUhUNDAgICAgIDJHLUhUNDAgICAgIDJHLUhUMjAgICAgIFR1cmJvICAgKi8KLSAgICB7IDB4MDAwMDEwMzAsIDB4MDAwMDAyMzAsIDB4MDAwMDA0NjAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODAgfSwKLSAgICB7IDB4MDAwMDEwZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTAgfSwKLSAgICB7IDB4MDAwMDgwMWMsIDB4MTI4ZDgwMjcsIDB4MTI4ZDgwNGYsIDB4MTJlMDAwNTcsIDB4MTJlMDAwMmIsIDB4MDk4ODAwNGYgfSwKLSAgICB7IDB4MDAwMDgzMTgsIDB4MDAwMDNlODAsIDB4MDAwMDdkMDAsIDB4MDAwMDY4ODAsIDB4MDAwMDM0NDAsIDB4MDAwMDY4ODAgfSwKLSAgICB7IDB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDMgfSwKLSAgICB7IDB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSwKLSAgICB7IDB4MDAwMDk4MjQsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEgfSwKLSAgICB7IDB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDk4NDAsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUgfSwKLSAgICB7IDB4MDAwMDk4NDQsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MjAsIDB4MDM3MjE2MjAsIDB4MDM3MjE2YTAgfSwKLSAgICB7IDB4MDAwMDk4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTkgfSwKLSAgICB7IDB4MDAwMGE4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTkgfSwKLSAgICB7IDB4MDAwMDk4NTAsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIgfSwKLSAgICB7IDB4MDAwMDk4NTgsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUgfSwKLSAgICB7IDB4MDAwMDk4NWMsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzOTYwNWUgfSwKLSAgICB7IDB4MDAwMDk4NjAsIDB4MDAwNThkMTgsIDB4MDAwNThkMTgsIDB4MDAwNThkMjAsIDB4MDAwNThkMjAsIDB4MDAwNThkMTggfSwKLSAgICB7IDB4MDAwMDk4NjQsIDB4MDAwMGZlMDAsIDB4MDAwMGZlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAgfSwKLSAgICB7IDB4MDAwMDk4NjgsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAgfSwKLSAgICB7IDB4MDAwMDk4NmMsIDB4MDY5MDMwODEsIDB4MDY5MDMwODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEgfSwKLSAgICB7IDB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDAgfSwKLSAgICB7IDB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTYgfSwKLSAgICB7IDB4MDAwMDk5MjQsIDB4ZDAwYTgwMDcsIDB4ZDAwYTgwMDcsIDB4ZDAwYTgwMGQsIDB4ZDAwYTgwMGQsIDB4ZDAwYTgwMGQgfSwKLSAgICB7IDB4MDAwMDk5NDQsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMjAsIDB4ZmZiYzEwMjAsIDB4ZmZiYzEwMTAgfSwKLSAgICB7IDB4MDAwMDk5NjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjgsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMgfSwKLSAgICB7IDB4MDAwMDk5YmMsIDB4MDAwMDA2MDAsIDB4MDAwMDA2MDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAgfSwKLSAgICB7IDB4MDAwMDk5YzAsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQgfSwKLSAgICB7IDB4MDAwMDk5YzQsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcgfSwKLSAgICB7IDB4MDAwMDk5YzgsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYgfSwKLSAgICB7IDB4MDAwMDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzggfSwKLSAgICB7IDB4MDAwMDk5ZDAsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQgfSwKLSAgICB7IDB4MDAwMDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODQsIDB4MDAwNTgwODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODgsIDB4MDAwNTgwODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwOGMsIDB4MDAwNTgwOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDAsIDB4MDAwNTgxMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDQsIDB4MDAwNTgxMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDgsIDB4MDAwNTgxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMGMsIDB4MDAwNTgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTAsIDB4MDAwNTgxMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTQsIDB4MDAwNTgxMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODAsIDB4MDAwNTgxODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODQsIDB4MDAwNTgxODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODgsIDB4MDAwNTgxODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOGMsIDB4MDAwNTgxOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTAsIDB4MDAwNTgxOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTQsIDB4MDAwNTgxOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTAsIDB4MDAwNTgxYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMGMsIDB4MDAwNTgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTgsIDB4MDAwNTgxYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODQsIDB4MDAwNTgyODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODgsIDB4MDAwNTgyODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMjQsIDB4MDAwNTgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyOTAsIDB4MDAwNTgyOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDAsIDB4MDAwNTgzMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDQsIDB4MDAwNTgzMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDgsIDB4MDAwNTgzMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMGMsIDB4MDAwNTgzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODAsIDB4MDAwNTgzODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODQsIDB4MDAwNTgzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDAsIDB4MDAwNjg3MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDQsIDB4MDAwNjg3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDgsIDB4MDAwNjg3MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MGMsIDB4MDAwNjg3MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODAsIDB4MDAwNjg3ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODQsIDB4MDAwNjg3ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDAsIDB4MDAwNzhiMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDQsIDB4MDAwNzhiMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDgsIDB4MDAwNzhiMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMGMsIDB4MDAwNzhiMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODAsIDB4MDAwNzhiODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODQsIDB4MDAwNzhiODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODgsIDB4MDAwNzhiODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOGMsIDB4MDAwNzhiOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOTAsIDB4MDAwNzhiOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODAsIDB4MDAwY2FmODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODQsIDB4MDAwY2FmODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODgsIDB4MDAwY2FmODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOGMsIDB4MDAwY2FmOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOTAsIDB4MDAwY2FmOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMGMsIDB4MDAwZGIzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMTAsIDB4MDAwZGIzMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODQsIDB4MDAwZGIzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODgsIDB4MDAwZGIzODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMjQsIDB4MDAwZGIzMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MDQsIDB4MDAwZWI3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTQsIDB4MDAwZWI2YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTgsIDB4MDAwZWI2YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTAsIDB4MDAwZWI3MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTQsIDB4MDAwZWI3MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjAsIDB4MDAwZWI3MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjQsIDB4MDAwZWI3MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjgsIDB4MDAwZWI3MjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MmMsIDB4MDAwZWI3MmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTAsIDB4MDAwZWI3YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTQsIDB4MDAwZWI3YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTgsIDB4MDAwZWI3YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjAsIDB4MDAwZWI3YjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjQsIDB4MDAwZWI3YjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjgsIDB4MDAwZWI3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTUsIDB4MDAwZWI3YTUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTksIDB4MDAwZWI3YTksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YWQsIDB4MDAwZWI3YWQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjEsIDB4MDAwZWI3YjEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjUsIDB4MDAwZWI3YjUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjksIDB4MDAwZWI3YjksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzUsIDB4MDAwZWI3YzUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzksIDB4MDAwZWI3YzksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDEsIDB4MDAwZWI3ZDEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDUsIDB4MDAwZWI3ZDUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDksIDB4MDAwZWI3ZDksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzYsIDB4MDAwZWI3YzYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2EsIDB4MDAwZWI3Y2EsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2UsIDB4MDAwZWI3Y2UsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDIsIDB4MDAwZWI3ZDIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDYsIDB4MDAwZWI3ZDYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzMsIDB4MDAwZWI3YzMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzcsIDB4MDAwZWI3YzcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2IsIDB4MDAwZWI3Y2IsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2YsIDB4MDAwZWI3Y2YsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDcsIDB4MDAwZWI3ZDcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODQsIDB4MDAwNTgwODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODgsIDB4MDAwNTgwODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwOGMsIDB4MDAwNTgwOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDAsIDB4MDAwNTgxMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDQsIDB4MDAwNTgxMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDgsIDB4MDAwNTgxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMGMsIDB4MDAwNTgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTAsIDB4MDAwNTgxMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTQsIDB4MDAwNTgxMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODAsIDB4MDAwNTgxODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODQsIDB4MDAwNTgxODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODgsIDB4MDAwNTgxODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOGMsIDB4MDAwNTgxOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTAsIDB4MDAwNTgxOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTQsIDB4MDAwNTgxOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTAsIDB4MDAwNTgxYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMGMsIDB4MDAwNTgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTgsIDB4MDAwNTgxYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODQsIDB4MDAwNTgyODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODgsIDB4MDAwNTgyODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMjQsIDB4MDAwNTgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyOTAsIDB4MDAwNTgyOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDAsIDB4MDAwNTgzMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDQsIDB4MDAwNTgzMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDgsIDB4MDAwNTgzMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMGMsIDB4MDAwNTgzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODAsIDB4MDAwNTgzODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODQsIDB4MDAwNTgzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDAsIDB4MDAwNjg3MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDQsIDB4MDAwNjg3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDgsIDB4MDAwNjg3MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MGMsIDB4MDAwNjg3MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODAsIDB4MDAwNjg3ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODQsIDB4MDAwNjg3ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDAsIDB4MDAwNzhiMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDQsIDB4MDAwNzhiMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDgsIDB4MDAwNzhiMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMGMsIDB4MDAwNzhiMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODAsIDB4MDAwNzhiODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODQsIDB4MDAwNzhiODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODgsIDB4MDAwNzhiODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOGMsIDB4MDAwNzhiOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOTAsIDB4MDAwNzhiOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODAsIDB4MDAwY2FmODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODQsIDB4MDAwY2FmODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODgsIDB4MDAwY2FmODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOGMsIDB4MDAwY2FmOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOTAsIDB4MDAwY2FmOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMGMsIDB4MDAwZGIzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMTAsIDB4MDAwZGIzMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODQsIDB4MDAwZGIzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODgsIDB4MDAwZGIzODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMjQsIDB4MDAwZGIzMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MDQsIDB4MDAwZWI3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTQsIDB4MDAwZWI2YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTgsIDB4MDAwZWI2YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTAsIDB4MDAwZWI3MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTQsIDB4MDAwZWI3MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjAsIDB4MDAwZWI3MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjQsIDB4MDAwZWI3MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjgsIDB4MDAwZWI3MjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MmMsIDB4MDAwZWI3MmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTAsIDB4MDAwZWI3YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTQsIDB4MDAwZWI3YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTgsIDB4MDAwZWI3YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjAsIDB4MDAwZWI3YjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjQsIDB4MDAwZWI3YjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjgsIDB4MDAwZWI3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTUsIDB4MDAwZWI3YTUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTksIDB4MDAwZWI3YTksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YWQsIDB4MDAwZWI3YWQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjEsIDB4MDAwZWI3YjEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjUsIDB4MDAwZWI3YjUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjksIDB4MDAwZWI3YjksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzUsIDB4MDAwZWI3YzUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzksIDB4MDAwZWI3YzksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDEsIDB4MDAwZWI3ZDEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDUsIDB4MDAwZWI3ZDUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDksIDB4MDAwZWI3ZDksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzYsIDB4MDAwZWI3YzYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2EsIDB4MDAwZWI3Y2EsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2UsIDB4MDAwZWI3Y2UsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDIsIDB4MDAwZWI3ZDIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDYsIDB4MDAwZWI3ZDYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzMsIDB4MDAwZWI3YzMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzcsIDB4MDAwZWI3YzcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2IsIDB4MDAwZWI3Y2IsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2YsIDB4MDAwZWI3Y2YsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDcsIDB4MDAwZWI3ZDcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMGEyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAgfSwKLSAgICB7IDB4MDAwMGIyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAgfSwKLSAgICB7IDB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEgfSwKLSAgICB7IDB4MDAwMGEyMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTAsIDB4MDAwNGYwMDAsIDB4MDAwNGYwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTgsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUgfSwKKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTB9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwZTYwLCAweDAwMDAxY2MwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4LCAweDAwMDAxMTgwfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTB9LAorCXsweDAwMDA4MDFjLCAweDEyOGQ4MDI3LCAweDEyOGQ4MDRmLCAweDEyZTAwMDU3LCAweDEyZTAwMDJiLCAweDA5ODgwMDRmfSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwM2U4MCwgMHgwMDAwN2QwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MCwgMHgwMDAwNjg4MH0sCisJezB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDN9LAorCXsweDAwMDA5ODIwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwfSwKKwl7MHgwMDAwOTgyNCwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZX0sCisJezB4MDAwMDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDF9LAorCXsweDAwMDA5ODM0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlfSwKKwl7MHgwMDAwOTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwN30sCisJezB4MDAwMDk4NDAsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmV9LAorCXsweDAwMDA5ODQ0LCAweDAzNzIxNjFlLCAweDAzNzIxNjFlLCAweDAzNzIxNjIwLCAweDAzNzIxNjIwLCAweDAzNzIxNmEwfSwKKwl7MHgwMDAwOTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMTA1MywgMHgwMDAwMTA1MywgMHgwMDAwMTA1OX0sCisJezB4MDAwMGE4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTl9LAorCXsweDAwMDA5ODUwLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyfSwKKwl7MHgwMDAwOTg1OCwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCisJezB4MDAwMDk4NWMsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzOTYwNWV9LAorCXsweDAwMDA5ODYwLCAweDAwMDU4ZDE4LCAweDAwMDU4ZDE4LCAweDAwMDU4ZDIwLCAweDAwMDU4ZDIwLCAweDAwMDU4ZDE4fSwKKwl7MHgwMDAwOTg2NCwgMHgwMDAwZmUwMCwgMHgwMDAwZmUwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMH0sCisJezB4MDAwMDk4NjgsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAorCXsweDAwMDA5ODZjLCAweDA2OTAzMDgxLCAweDA2OTAzMDgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKKwl7MHgwMDAwOTkxNCwgMHgwMDAwMDdkMCwgMHgwMDAwMGZhMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMH0sCisJezB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTZ9LAorCXsweDAwMDA5OTI0LCAweGQwMGE4MDA3LCAweGQwMGE4MDA3LCAweGQwMGE4MDBkLCAweGQwMGE4MDBkLCAweGQwMGE4MDBkfSwKKwl7MHgwMDAwOTk0NCwgMHhmZmJjMTAxMCwgMHhmZmJjMTAxMCwgMHhmZmJjMTAyMCwgMHhmZmJjMTAyMCwgMHhmZmJjMTAxMH0sCisJezB4MDAwMDk5NjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTliOCwgMHgwMDAwNDIxYywgMHgwMDAwNDIxYywgMHgwMDAwNDIxYywgMHgwMDAwNDIxYywgMHgwMDAwNDIxY30sCisJezB4MDAwMDk5YmMsIDB4MDAwMDA2MDAsIDB4MDAwMDA2MDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDB9LAorCXsweDAwMDA5OWMwLCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0fSwKKwl7MHgwMDAwOTljNCwgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3NywgMHgwNjMzNmY3N30sCisJezB4MDAwMDk5YzgsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmZ9LAorCXsweDAwMDA5OWNjLCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4LCAweDA4ZjE4NmM4fSwKKwl7MHgwMDAwOTlkMCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NCwgMHgwMDA0NjM4NH0sCisJezB4MDAwMDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODA4NCwgMHgwMDA1ODA4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODgsIDB4MDAwNTgwODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MDhjLCAweDAwMDU4MDhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODEwMCwgMHgwMDA1ODEwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDQsIDB4MDAwNTgxMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTA4LCAweDAwMDU4MTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWExOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODEwYywgMHgwMDA1ODEwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTAsIDB4MDAwNTgxMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTE0LCAweDAwMDU4MTE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE4MCwgMHgwMDA1ODE4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODQsIDB4MDAwNTgxODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTg4LCAweDAwMDU4MTg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE4YywgMHgwMDA1ODE4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTAsIDB4MDAwNTgxOTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTk0LCAweDAwMDU4MTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODFhMCwgMHgwMDA1ODFhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMGMsIDB4MDAwNTgyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MWE4LCAweDAwMDU4MWE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODI4NCwgMHgwMDA1ODI4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODgsIDB4MDAwNTgyODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MjI0LCAweDAwMDU4MjI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODI5MCwgMHgwMDA1ODI5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDAsIDB4MDAwNTgzMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzA0LCAweDAwMDU4MzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODMwOCwgMHgwMDA1ODMwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMGMsIDB4MDAwNTgzMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzgwLCAweDAwMDU4MzgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODM4NCwgMHgwMDA1ODM4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDAsIDB4MDAwNjg3MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzA0LCAweDAwMDY4NzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwOCwgMHgwMDA2ODcwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MGMsIDB4MDAwNjg3MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzgwLCAweDAwMDY4NzgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4NCwgMHgwMDA2ODc4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDAsIDB4MDAwNzhiMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjA0LCAweDAwMDc4YjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGIwOCwgMHgwMDA3OGIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMGMsIDB4MDAwNzhiMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjgwLCAweDAwMDc4YjgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI4NCwgMHgwMDA3OGI4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODgsIDB4MDAwNzhiODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjhjLCAweDAwMDc4YjhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI5MCwgMHgwMDA3OGI5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODAsIDB4MDAwY2FmODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjg0LCAweDAwMGNhZjg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBjYWY4OCwgMHgwMDBjYWY4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOGMsIDB4MDAwY2FmOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjkwLCAweDAwMGNhZjkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjMwYywgMHgwMDBkYjMwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMTAsIDB4MDAwZGIzMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGRiMzg0LCAweDAwMGRiMzg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjM4OCwgMHgwMDBkYjM4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMjQsIDB4MDAwZGIzMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzA0LCAweDAwMGViNzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjZhNCwgMHgwMDBlYjZhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTgsIDB4MDAwZWI2YTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzEwLCAweDAwMGViNzEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcxNCwgMHgwMDBlYjcxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjAsIDB4MDAwZWI3MjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzI0LCAweDAwMGViNzI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcyOCwgMHgwMDBlYjcyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MmMsIDB4MDAwZWI3MmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2EwLCAweDAwMGViN2EwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhNCwgMHgwMDBlYjdhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTgsIDB4MDAwZWI3YTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2IwLCAweDAwMGViN2IwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiNCwgMHgwMDBlYjdiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjgsIDB4MDAwZWI3YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2E1LCAweDAwMGViN2E1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhOSwgMHgwMDBlYjdhOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YWQsIDB4MDAwZWI3YWQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2IxLCAweDAwMGViN2IxLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiNSwgMHgwMDBlYjdiNSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjksIDB4MDAwZWI3YjksIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2M1LCAweDAwMGViN2M1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjOSwgMHgwMDBlYjdjOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDEsIDB4MDAwZWI3ZDEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2Q1LCAweDAwMGViN2Q1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkOSwgMHgwMDBlYjdkOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzYsIDB4MDAwZWI3YzYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2NhLCAweDAwMGViN2NhLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjZSwgMHgwMDBlYjdjZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDIsIDB4MDAwZWI3ZDIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2Q2LCAweDAwMGViN2Q2LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjMywgMHgwMDBlYjdjMywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzcsIDB4MDAwZWI3YzcsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2NiLCAweDAwMGViN2NiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjZiwgMHgwMDBlYjdjZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDcsIDB4MDAwZWI3ZDcsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5Yjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5Yjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MDg0LCAweDAwMDU4MDg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODA4OCwgMHgwMDA1ODA4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwOGMsIDB4MDAwNTgwOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTAwLCAweDAwMDU4MTAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWExMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODEwNCwgMHgwMDA1ODEwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDgsIDB4MDAwNTgxMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTBjLCAweDAwMDU4MTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWExYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODExMCwgMHgwMDA1ODExMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTQsIDB4MDAwNTgxMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTgwLCAweDAwMDU4MTgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE4NCwgMHgwMDA1ODE4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODgsIDB4MDAwNTgxODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MThjLCAweDAwMDU4MThjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE5MCwgMHgwMDA1ODE5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTQsIDB4MDAwNTgxOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MWEwLCAweDAwMDU4MWEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODIwYywgMHgwMDA1ODIwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTgsIDB4MDAwNTgxYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4Mjg0LCAweDAwMDU4Mjg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODI4OCwgMHgwMDA1ODI4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMjQsIDB4MDAwNTgyMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MjkwLCAweDAwMDU4MjkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODMwMCwgMHgwMDA1ODMwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDQsIDB4MDAwNTgzMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzA4LCAweDAwMDU4MzA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODMwYywgMHgwMDA1ODMwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODAsIDB4MDAwNTgzODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4Mzg0LCAweDAwMDU4Mzg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwMCwgMHgwMDA2ODcwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDQsIDB4MDAwNjg3MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzA4LCAweDAwMDY4NzA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwYywgMHgwMDA2ODcwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODAsIDB4MDAwNjg3ODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4Nzg0LCAweDAwMDY4Nzg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGIwMCwgMHgwMDA3OGIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDQsIDB4MDAwNzhiMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjA4LCAweDAwMDc4YjA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGIwYywgMHgwMDA3OGIwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODAsIDB4MDAwNzhiODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4Yjg0LCAweDAwMDc4Yjg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI4OCwgMHgwMDA3OGI4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOGMsIDB4MDAwNzhiOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjkwLCAweDAwMDc4YjkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBjYWY4MCwgMHgwMDBjYWY4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODQsIDB4MDAwY2FmODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjg4LCAweDAwMGNhZjg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBjYWY4YywgMHgwMDBjYWY4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOTAsIDB4MDAwY2FmOTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGRiMzBjLCAweDAwMGRiMzBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjMxMCwgMHgwMDBkYjMxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODQsIDB4MDAwZGIzODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGRiMzg4LCAweDAwMGRiMzg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjMyNCwgMHgwMDBkYjMyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MDQsIDB4MDAwZWI3MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNmE0LCAweDAwMGViNmE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjZhOCwgMHgwMDBlYjZhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTAsIDB4MDAwZWI3MTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzE0LCAweDAwMGViNzE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcyMCwgMHgwMDBlYjcyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjQsIDB4MDAwZWI3MjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzI4LCAweDAwMGViNzI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcyYywgMHgwMDBlYjcyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTAsIDB4MDAwZWI3YTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2E0LCAweDAwMGViN2E0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhOCwgMHgwMDBlYjdhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjAsIDB4MDAwZWI3YjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2I0LCAweDAwMGViN2I0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiOCwgMHgwMDBlYjdiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTUsIDB4MDAwZWI3YTUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2E5LCAweDAwMGViN2E5LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhZCwgMHgwMDBlYjdhZCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjEsIDB4MDAwZWI3YjEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2I1LCAweDAwMGViN2I1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiOSwgMHgwMDBlYjdiOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzUsIDB4MDAwZWI3YzUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2M5LCAweDAwMGViN2M5LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkMSwgMHgwMDBlYjdkMSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDUsIDB4MDAwZWI3ZDUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2Q5LCAweDAwMGViN2Q5LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjNiwgMHgwMDBlYjdjNiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2EsIDB4MDAwZWI3Y2EsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2NlLCAweDAwMGViN2NlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkMiwgMHgwMDBlYjdkMiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDYsIDB4MDAwZWI3ZDYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2MzLCAweDAwMGViN2MzLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjNywgMHgwMDBlYjdjNywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2IsIDB4MDAwZWI3Y2IsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2NmLCAweDAwMGViN2NmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkNywgMHgwMDBlYjdkNywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjhjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDR9LAorCXsweDAwMDBhMjBjLCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAweDAwMDFmMDAwLCAweDAwMDFmMDAwLCAweDAwMDFmMDAwfSwKKwl7MHgwMDAwYjIwYywgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAxZjAwMCwgMHgwMDAxZjAwMCwgMHgwMDAxZjAwMH0sCisJezB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGF9LAorCXsweDAwMDBhMjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMjEwLCAweDAwMDAwMTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI1MCwgMHgwMDA0ZjAwMCwgMHgwMDA0ZjAwMCwgMHgwMDA0YTAwMCwgMHgwMDA0YTAwMCwgMHgwMDA0YTAwMH0sCisJezB4MDAwMGEzNTgsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGV9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODVDb21tb25fOTI4NV8xXzJbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwMzAsIDB4MDAwMjAwNDUgfSwKLSAgICB7IDB4MDAwMDAwMzQsIDB4MDAwMDAwMDUgfSwKLSAgICB7IDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNDQsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNDgsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNGMsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDAwNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNDAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNGMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNWMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwMzAsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwM2MsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwMjQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDQwNjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDcwMTAsIDB4MDAwMDAwMzEgfSwKLSAgICB7IDB4MDAwMDcwMzQsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDcwMzgsIDB4MDAwMDA0YzIgfSwKLSAgICB7IDB4MDAwMDgwMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMTgsIDB4MDAwMDA3MDAgfSwKLSAgICB7IDB4MDAwMDgwMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNWMsIDB4MDAwZmM3OGYgfSwKLSAgICB7IDB4MDAwMDgwNjAsIDB4MDAwMDAwMGYgfSwKLSAgICB7IDB4MDAwMDgwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYzAsIDB4MmE4MDAwMWEgfSwKLSAgICB7IDB4MDAwMDgwYzQsIDB4MDVkYzAxZTAgfSwKLSAgICB7IDB4MDAwMDgwYzgsIDB4MWY0MDI3MTAgfSwKLSAgICB7IDB4MDAwMDgwY2MsIDB4MDFmNDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDAsIDB4MDAwMDFlMDAgfSwKLSAgICB7IDB4MDAwMDgwZDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDgsIDB4MDA0MDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZTAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTQsIDB4MDAwMGZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTgsIDB4MDAzZjNmM2YgfSwKLSAgICB7IDB4MDAwMDgwZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZmMsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDAsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgxMDgsIDB4MDAwMDAwNTIgfSwKLSAgICB7IDB4MDAwMDgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMTAsIDB4MDAwMDAxNjggfSwKLSAgICB7IDB4MDAwMDgxMTgsIDB4MDAwMTAwYWEgfSwKLSAgICB7IDB4MDAwMDgxMWMsIDB4MDAwMDMyMTAgfSwKLSAgICB7IDB4MDAwMDgxMjAsIDB4MDhmMDQ4MTAgfSwKLSAgICB7IDB4MDAwMDgxMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNDQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgxNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNzAsIDB4MzIxNDMzMjAgfSwKLSAgICB7IDB4MDAwMDgxNzQsIDB4ZmFhNGZhNTAgfSwKLSAgICB7IDB4MDAwMDgxNzgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgxN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZDAsIDB4MDAwMDMyMGEgfSwKLSAgICB7IDB4MDAwMDgxZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDAsIDB4MDAxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDQsIDB4MDAxMGY0MDAgfSwKLSAgICB7IDB4MDAwMDgyNDgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgyNGMsIDB4MDAwMWU4MDAgfSwKLSAgICB7IDB4MDAwMDgyNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNWMsIDB4NDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgyNjAsIDB4MDAwODA5MjIgfSwKLSAgICB7IDB4MDAwMDgyNjQsIDB4ODhhMDAwMTAgfSwKLSAgICB7IDB4MDAwMDgyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzQsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzgsIDB4MDAzZTQxODAgfSwKLSAgICB7IDB4MDAwMDgyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyODQsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyODgsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDAsIDB4MDAwMDAwNDAgfSwKLSAgICB7IDB4MDAwMDgzMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMmMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgzMzAsIDB4MDAwMDAzMDIgfSwKLSAgICB7IDB4MDAwMDgzMzQsIDB4MDAwMDBlMDAgfSwKLSAgICB7IDB4MDAwMDgzMzgsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDgzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNDAsIDB4MDAwMTAzODAgfSwKLSAgICB7IDB4MDAwMDgzNDQsIDB4MDA0ODEwNDMgfSwKLSAgICB7IDB4MDAwMDk4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MGMsIDB4YWZlNjhlMzAgfSwKLSAgICB7IDB4MDAwMDk4MTAsIDB4ZmQxNGUwMDAgfSwKLSAgICB7IDB4MDAwMDk4MTQsIDB4OWMwYTlmNmIgfSwKLSAgICB7IDB4MDAwMDk4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MmMsIDB4MDAwMGEwMDAgfSwKLSAgICB7IDB4MDAwMDk4MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4M2MsIDB4MDAyMDA0MDAgfSwKLSAgICB7IDB4MDAwMDk4NGMsIDB4MDA0MDIzM2MgfSwKLSAgICB7IDB4MDAwMDk4NTQsIDB4MDAwMDAwNDQgfSwKLSAgICB7IDB4MDAwMDk5MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MTAsIDB4MDEwMDIzMTAgfSwKLSAgICB7IDB4MDAwMDk5MWMsIDB4MTAwMDBmZmYgfSwKLSAgICB7IDB4MDAwMDk5MjAsIDB4MDQ5MDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MjgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5MmMsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMDk5MzQsIDB4MWUxZjIwMjIgfSwKLSAgICB7IDB4MDAwMDk5MzgsIDB4MGEwYjBjMGQgfSwKLSAgICB7IDB4MDAwMDk5M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NDAsIDB4MTQ3NTA2MDQgfSwKLSAgICB7IDB4MDAwMDk5NDgsIDB4OTI4MGMwMGEgfSwKLSAgICB7IDB4MDAwMDk5NGMsIDB4MDAwMjAwMjggfSwKLSAgICB7IDB4MDAwMDk5NTQsIDB4NWYzY2EzZGUgfSwKLSAgICB7IDB4MDAwMDk5NTgsIDB4MjEwOGVjZmYgfSwKLSAgICB7IDB4MDAwMDk5NjgsIDB4MDAwMDAzY2UgfSwKLSAgICB7IDB4MDAwMDk5NzAsIDB4MTkyYmI1MTQgfSwKLSAgICB7IDB4MDAwMDk5NzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NzgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5YTgsIDB4MjAxZmZmMDAgfSwKLSAgICB7IDB4MDAwMDk5YWMsIDB4MmRlZjA0MDAgfSwKLSAgICB7IDB4MDAwMDk5YjAsIDB4MDMwNTEwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjQsIDB4MDAwMDA4MjAgfSwKLSAgICB7IDB4MDAwMDk5ZGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTQsIDB4YWFhYWFhYWEgfSwKLSAgICB7IDB4MDAwMDk5ZTgsIDB4M2M0NjY0NzggfSwKLSAgICB7IDB4MDAwMDk5ZWMsIDB4MGNjODBjYWEgfSwKLSAgICB7IDB4MDAwMDk5ZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMDgsIDB4ODAzZTY4YzggfSwKLSAgICB7IDB4MDAwMGEyMTAsIDB4NDA4MGEzMzMgfSwKLSAgICB7IDB4MDAwMGEyMTQsIDB4MDAyMDZjMTAgfSwKLSAgICB7IDB4MDAwMGEyMTgsIDB4MDA5YzQwNjAgfSwKLSAgICB7IDB4MDAwMGEyMjAsIDB4MDE4MzQwNjEgfSwKLSAgICB7IDB4MDAwMGEyMjQsIDB4MDAwMDA0MDAgfSwKLSAgICB7IDB4MDAwMGEyMjgsIDB4MDAwMDAzYjUgfSwKLSAgICB7IDB4MDAwMGEyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMzQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyMzgsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyNDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNDgsIDB4ZmZmZmZmZmMgfSwKLSAgICB7IDB4MDAwMGEyNGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTgsIDB4MGNjYjUzODAgfSwKLSAgICB7IDB4MDAwMGEyNWMsIDB4MTUxNTE1MDEgfSwKLSAgICB7IDB4MDAwMGEyNjAsIDB4ZGZhOTBmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNmMsIDB4MGViYWU5ZTYgfSwKLSAgICB7IDB4MDAwMGQyNzAsIDB4MGQ4MjA4MjAgfSwKLSAgICB7IDB4MDAwMGQzNWMsIDB4MDdmZmZmZWYgfSwKLSAgICB7IDB4MDAwMGQzNjAsIDB4MGZmZmZmZTcgfSwKLSAgICB7IDB4MDAwMGQzNjQsIDB4MTdmZmZmZTUgfSwKLSAgICB7IDB4MDAwMGQzNjgsIDB4MWZmZmZmZTQgfSwKLSAgICB7IDB4MDAwMGQzNmMsIDB4MzdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzAsIDB4M2ZmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzQsIDB4NTdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzgsIDB4NWZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzN2MsIDB4N2ZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzODAsIDB4N2YzYzdiYmEgfSwKLSAgICB7IDB4MDAwMGQzODQsIDB4ZjMzMDdmZjAgfSwKLSAgICB7IDB4MDAwMGEzODgsIDB4MGMwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzOGMsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOWMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEzYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzY2MsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzZTgsIDB4MThjNDM0MzMgfSwKLSAgICB7IDB4MDAwMGEzZWMsIDB4MDBmNzAwODEgfSwKLSAgICB7IDB4MDAwMDc4MDAsIDB4MDAxNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MDQsIDB4MGU0NTQ4ZDggfSwKLSAgICB7IDB4MDAwMDc4MDgsIDB4NTQyMTQ1MTQgfSwKLSAgICB7IDB4MDAwMDc4MGMsIDB4MDIwMjU4MzAgfSwKLSAgICB7IDB4MDAwMDc4MTAsIDB4NzFjMGQzODggfSwKLSAgICB7IDB4MDAwMDc4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MjQsIDB4MDBkODZmZmYgfSwKLSAgICB7IDB4MDAwMDc4MmMsIDB4NmUzNmQ5N2IgfSwKLSAgICB7IDB4MDAwMDc4MzQsIDB4NzE0MDAwODcgfSwKLSAgICB7IDB4MDAwMDc4NDQsIDB4MDAwYzBkYjYgfSwKLSAgICB7IDB4MDAwMDc4NDgsIDB4NmRiNjI0NmYgfSwKLSAgICB7IDB4MDAwMDc4NGMsIDB4NmQ5YjY2ZGIgfSwKLSAgICB7IDB4MDAwMDc4NTAsIDB4NmQ4YzZkYmEgfSwKLSAgICB7IDB4MDAwMDc4NTQsIDB4MDAwNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4NTgsIDB4ZGIwMDMwMTIgfSwKLSAgICB7IDB4MDAwMDc4NWMsIDB4MDQ5MjQ5MTQgfSwKLSAgICB7IDB4MDAwMDc4NjAsIDB4MjEwODQyMTAgfSwKLSAgICB7IDB4MDAwMDc4NjQsIDB4ZjdkN2ZmZGUgfSwKLSAgICB7IDB4MDAwMDc4NjgsIDB4YzIwMzQwODAgfSwKLSAgICB7IDB4MDAwMDc4NzAsIDB4MTAxNDJjMDAgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDAwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDMwLCAweDAwMDIwMDQ1fSwKKwl7MHgwMDAwMDAzNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ0LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0OCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNGMsIDB4MDAwMDAwMTB9LAorCXsweDAwMDAwMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA1NCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDA4MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDQwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDRjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDY0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTIzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTM3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2Y4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTRmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTViOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTY3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTczOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxN2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTdmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTE3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTIzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQ3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDQwMzAsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA0MDNjLCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwNDAyNCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDQwNjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA0MDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAzMX0sCisJezB4MDAwMDcwMzQsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAxOCwgMHgwMDAwMDcwMH0sCisJezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAorCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGMwLCAweDJhODAwMDFhfSwKKwl7MHgwMDAwODBjNCwgMHgwNWRjMDFlMH0sCisJezB4MDAwMDgwYzgsIDB4MWY0MDI3MTB9LAorCXsweDAwMDA4MGNjLCAweDAxZjQwMDAwfSwKKwl7MHgwMDAwODBkMCwgMHgwMDAwMWUwMH0sCisJezB4MDAwMDgwZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGQ4LCAweDAwNDAwMDAwfSwKKwl7MHgwMDAwODBlMCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgwZTQsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MGU4LCAweDAwM2YzZjNmfSwKKwl7MHgwMDAwODBlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZmMsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTAwLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDgxMDgsIDB4MDAwMDAwNTJ9LAorCXsweDAwMDA4MTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExMCwgMHgwMDAwMDE2OH0sCisJezB4MDAwMDgxMTgsIDB4MDAwMTAwYWF9LAorCXsweDAwMDA4MTFjLCAweDAwMDAzMjEwfSwKKwl7MHgwMDAwODEyMCwgMHgwOGYwNDgxMH0sCisJezB4MDAwMDgxMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTQ0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODE2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTcwLCAweDMyMTQzMzIwfSwKKwl7MHgwMDAwODE3NCwgMHhmYWE0ZmE1MH0sCisJezB4MDAwMDgxNzgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MTdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZDAsIDB4MDAwMDMyMGF9LAorCXsweDAwMDA4MWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjQwLCAweDAwMTAwMDAwfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQwMH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MjRjLCAweDAwMDFlODAwfSwKKwl7MHgwMDAwODI1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1YywgMHg0MDAwMDBmZn0sCisJezB4MDAwMDgyNjAsIDB4MDAwODA5MjJ9LAorCXsweDAwMDA4MjY0LCAweDg4YTAwMDEwfSwKKwl7MHgwMDAwODI3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNzQsIDB4NDAwMDAwMDB9LAorCXsweDAwMDA4Mjc4LCAweDAwM2U0MTgwfSwKKwl7MHgwMDAwODI3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyODQsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA4Mjg4LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMDAsIDB4MDAwMDAwNDB9LAorCXsweDAwMDA4MzE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMmMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA4MzMwLCAweDAwMDAwMzAyfSwKKwl7MHgwMDAwODMzNCwgMHgwMDAwMGUwMH0sCisJezB4MDAwMDgzMzgsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA4MzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM0MCwgMHgwMDAxMDM4MH0sCisJezB4MDAwMDgzNDQsIDB4MDA0ODEwNDN9LAorCXsweDAwMDA5ODA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgwYywgMHhhZmU2OGUzMH0sCisJezB4MDAwMDk4MTAsIDB4ZmQxNGUwMDB9LAorCXsweDAwMDA5ODE0LCAweDljMGE5ZjZifSwKKwl7MHgwMDAwOTgxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MmMsIDB4MDAwMGEwMDB9LAorCXsweDAwMDA5ODMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgzYywgMHgwMDIwMDQwMH0sCisJezB4MDAwMDk4NGMsIDB4MDA0MDIzM2N9LAorCXsweDAwMDA5ODU0LCAweDAwMDAwMDQ0fSwKKwl7MHgwMDAwOTkwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MTAsIDB4MDEwMDIzMTB9LAorCXsweDAwMDA5OTFjLCAweDEwMDAwZmZmfSwKKwl7MHgwMDAwOTkyMCwgMHgwNDkwMDAwMH0sCisJezB4MDAwMDk5MjgsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OTJjLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOTkzNCwgMHgxZTFmMjAyMn0sCisJezB4MDAwMDk5MzgsIDB4MGEwYjBjMGR9LAorCXsweDAwMDA5OTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk0MCwgMHgxNDc1MDYwNH0sCisJezB4MDAwMDk5NDgsIDB4OTI4MGMwMGF9LAorCXsweDAwMDA5OTRjLCAweDAwMDIwMDI4fSwKKwl7MHgwMDAwOTk1NCwgMHg1ZjNjYTNkZX0sCisJezB4MDAwMDk5NTgsIDB4MjEwOGVjZmZ9LAorCXsweDAwMDA5OTY4LCAweDAwMDAwM2NlfSwKKwl7MHgwMDAwOTk3MCwgMHgxOTJiYjUxNH0sCisJezB4MDAwMDk5NzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTc4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTk3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5YTQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OWE4LCAweDIwMWZmZjAwfSwKKwl7MHgwMDAwOTlhYywgMHgyZGVmMDQwMH0sCisJezB4MDAwMDk5YjAsIDB4MDMwNTEwMDB9LAorCXsweDAwMDA5OWI0LCAweDAwMDAwODIwfSwKKwl7MHgwMDAwOTlkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWU0LCAweGFhYWFhYWFhfSwKKwl7MHgwMDAwOTllOCwgMHgzYzQ2NjQ3OH0sCisJezB4MDAwMDk5ZWMsIDB4MGNjODBjYWF9LAorCXsweDAwMDA5OWYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIwOCwgMHg4MDNlNjhjOH0sCisJezB4MDAwMGEyMTAsIDB4NDA4MGEzMzN9LAorCXsweDAwMDBhMjE0LCAweDAwMjA2YzEwfSwKKwl7MHgwMDAwYTIxOCwgMHgwMDljNDA2MH0sCisJezB4MDAwMGEyMjAsIDB4MDE4MzQwNjF9LAorCXsweDAwMDBhMjI0LCAweDAwMDAwNDAwfSwKKwl7MHgwMDAwYTIyOCwgMHgwMDAwMDNiNX0sCisJezB4MDAwMGEyMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjM0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTIzOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjQ4LCAweGZmZmZmZmZjfSwKKwl7MHgwMDAwYTI0YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjU4LCAweDBjY2I1MzgwfSwKKwl7MHgwMDAwYTI1YywgMHgxNTE1MTUwMX0sCisJezB4MDAwMGEyNjAsIDB4ZGZhOTBmMDF9LAorCXsweDAwMDBhMjY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI2YywgMHgwZWJhZTllNn0sCisJezB4MDAwMGQyNzAsIDB4MGQ4MjA4MjB9LAorCXsweDAwMDBkMzVjLCAweDA3ZmZmZmVmfSwKKwl7MHgwMDAwZDM2MCwgMHgwZmZmZmZlN30sCisJezB4MDAwMGQzNjQsIDB4MTdmZmZmZTV9LAorCXsweDAwMDBkMzY4LCAweDFmZmZmZmU0fSwKKwl7MHgwMDAwZDM2YywgMHgzN2ZmZmZlM30sCisJezB4MDAwMGQzNzAsIDB4M2ZmZmZmZTN9LAorCXsweDAwMDBkMzc0LCAweDU3ZmZmZmUzfSwKKwl7MHgwMDAwZDM3OCwgMHg1ZmZmZmZlMn0sCisJezB4MDAwMGQzN2MsIDB4N2ZmZmZmZTJ9LAorCXsweDAwMDBkMzgwLCAweDdmM2M3YmJhfSwKKwl7MHgwMDAwZDM4NCwgMHhmMzMwN2ZmMH0sCisJezB4MDAwMGEzODgsIDB4MGMwMDAwMDB9LAorCXsweDAwMDBhMzhjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTM5MCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzOWMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhM2EwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2FjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2M0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNjYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzZTgsIDB4MThjNDM0MzN9LAorCXsweDAwMDBhM2VjLCAweDAwZjcwMDgxfSwKKwl7MHgwMDAwNzgwMCwgMHgwMDE0MDAwMH0sCisJezB4MDAwMDc4MDQsIDB4MGU0NTQ4ZDh9LAorCXsweDAwMDA3ODA4LCAweDU0MjE0NTE0fSwKKwl7MHgwMDAwNzgwYywgMHgwMjAyNTgzMH0sCisJezB4MDAwMDc4MTAsIDB4NzFjMGQzODh9LAorCXsweDAwMDA3ODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzgyNCwgMHgwMGQ4NmZmZn0sCisJezB4MDAwMDc4MmMsIDB4NmUzNmQ5N2J9LAorCXsweDAwMDA3ODM0LCAweDcxNDAwMDg3fSwKKwl7MHgwMDAwNzg0NCwgMHgwMDBjMGRiNn0sCisJezB4MDAwMDc4NDgsIDB4NmRiNjI0NmZ9LAorCXsweDAwMDA3ODRjLCAweDZkOWI2NmRifSwKKwl7MHgwMDAwNzg1MCwgMHg2ZDhjNmRiYX0sCisJezB4MDAwMDc4NTQsIDB4MDAwNDAwMDB9LAorCXsweDAwMDA3ODU4LCAweGRiMDAzMDEyfSwKKwl7MHgwMDAwNzg1YywgMHgwNDkyNDkxNH0sCisJezB4MDAwMDc4NjAsIDB4MjEwODQyMTB9LAorCXsweDAwMDA3ODY0LCAweGY3ZDdmZmRlfSwKKwl7MHgwMDAwNzg2OCwgMHhjMjAzNDA4MH0sCisJezB4MDAwMDc4NzAsIDB4MTAxNDJjMDB9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODVNb2Rlc19oaWdoX3Bvd2VyX3R4X2dhaW5fOTI4NV8xXzJbXVs2XSA9IHsKLSAgICAvKiBBZGRyZXNzICAgICAgNUctSFQyMCAgICAgNUctSFQ0MCAgICAgMkctSFQ0MCAgICAgMkctSFQyMCAgICAgVHVyYm8gICAqLwotICAgIHsgMHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwNjIwMCwgMHgwMDAwNjIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwODIwMSwgMHgwMDAwODIwMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYjI0MCwgMHgwMDAwYjI0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDI0MSwgMHgwMDAwZDI0MSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZjYwMCwgMHgwMDAwZjYwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMjgwMCwgMHgwMDAxMjgwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxNjgwMiwgMHgwMDAxNjgwMiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxYjgwNSwgMHgwMDAxYjgwNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyMWE4MCwgMHgwMDAyMWE4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyOGIwMCwgMHgwMDAyOGIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyYWI0MCwgMHgwMDAyYWI0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyY2Q4MCwgMHgwMDAyY2Q4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzM2Q4MiwgMHgwMDAzM2Q4MiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzOCwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzYywgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0OCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0YywgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzgxNCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCB9LAotICAgIHsgMHgwMDAwNzgyOCwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiB9LAotICAgIHsgMHgwMDAwNzgzMCwgMHhlZGI2ZDk2ZSwgMHhlZGI2ZDk2ZSwgMHhlZGI2ZDk2ZSwgMHhlZGI2ZDk2ZSwgMHhlZGI2ZDk2ZSB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHhmYWM2ODgwMywgMHhmYWM2ODgwMywgMHhmYWM2ODgwMywgMHhmYWM2ODgwMywgMHhmYWM2ODgwMyB9LAotICAgIHsgMHgwMDAwNzgzYywgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSB9LAotICAgIHsgMHgwMDAwNzg0MCwgMHhmZmViMWEyMCwgMHhmZmViMWEyMCwgMHhmZmViMWEyMCwgMHhmZmViMWEyMCwgMHhmZmViMWEyMCB9LAotICAgIHsgMHgwMDAwNzg2YywgMHgwODYwOWViZSwgMHgwODYwOWViZSwgMHgwODYwOWViZSwgMHgwODYwOWViZSwgMHgwODYwOWViZSB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTIyYTY1MiwgMHgwYTIyYTY1MiwgMHgwYTIxNjY1MiwgMHgwYTIxNjY1MiwgMHgwYTIyYTY1MiB9LAotICAgIHsgMHgwMDAwYTI3OCwgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNyB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTAzODBlNywgMHgwNTAzODBlNywgMHgwNTAzODBlNywgMHgwNTAzODBlNywgMHgwNTAzODBlNyB9LAotICAgIHsgMHgwMDAwYTM5NCwgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNyB9LAotICAgIHsgMHgwMDAwYTM5OCwgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNyB9LAotICAgIHsgMHgwMDAwYTNkYywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNyB9LAotICAgIHsgMHgwMDAwYTNlMCwgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNyB9LAorCXsweDAwMDBhMzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwNjIwMCwgMHgwMDAwNjIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgyMDEsIDB4MDAwMDgyMDEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBiMjQwLCAweDAwMDBiMjQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDI0MSwgMHgwMDAwZDI0MSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGY2MDAsIDB4MDAwMGY2MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEyODAwLCAweDAwMDEyODAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxNjgwMiwgMHgwMDAxNjgwMiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMWI4MDUsIDB4MDAwMWI4MDUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIxYTgwLCAweDAwMDIxYTgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyOGIwMCwgMHgwMDAyOGIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmFiNDAsIDB4MDAwMmFiNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJjZDgwLCAweDAwMDJjZDgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzM2Q4MiwgMHgwMDAzM2Q4MiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzgsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzNjLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ4LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0YywgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNTAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzU0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzgxNCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOCwgMHg5MjQ5MzRhOH0sCisJezB4MDAwMDc4MjgsIDB4MjZkMjQ5MWIsIDB4MjZkMjQ5MWIsIDB4MjZkMjQ5MWIsIDB4MjZkMjQ5MWIsIDB4MjZkMjQ5MWJ9LAorCXsweDAwMDA3ODMwLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlfSwKKwl7MHgwMDAwNzgzOCwgMHhmYWM2ODgwMywgMHhmYWM2ODgwMywgMHhmYWM2ODgwMywgMHhmYWM2ODgwMywgMHhmYWM2ODgwM30sCisJezB4MDAwMDc4M2MsIDB4MDAwMWZmZmUsIDB4MDAwMWZmZmUsIDB4MDAwMWZmZmUsIDB4MDAwMWZmZmUsIDB4MDAwMWZmZmV9LAorCXsweDAwMDA3ODQwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwfSwKKwl7MHgwMDAwNzg2YywgMHgwODYwOWViZSwgMHgwODYwOWViZSwgMHgwODYwOWViZSwgMHgwODYwOWViZSwgMHgwODYwOWViZX0sCisJezB4MDAwMDc4MjAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDB9LAorCXsweDAwMDBhMjc0LCAweDBhMjJhNjUyLCAweDBhMjJhNjUyLCAweDBhMjE2NjUyLCAweDBhMjE2NjUyLCAweDBhMjJhNjUyfSwKKwl7MHgwMDAwYTI3OCwgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlN30sCisJezB4MDAwMGEyN2MsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTd9LAorCXsweDAwMDBhMzk0LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3fSwKKwl7MHgwMDAwYTM5OCwgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlN30sCisJezB4MDAwMGEzZGMsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTd9LAorCXsweDAwMDBhM2UwLCAweDAwMDAwMGU3LCAweDAwMDAwMGU3LCAweDAwMDAwMGU3LCAweDAwMDAwMGU3LCAweDAwMDAwMGU3fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5Mjg1TW9kZXNfb3JpZ2luYWxfdHhfZ2Fpbl85Mjg1XzFfMltdWzZdID0gewotICAgIC8qIEFkZHJlc3MgICAgICA1Ry1IVDIwICAgICA1Ry1IVDQwICAgICAyRy1IVDQwICAgICAyRy1IVDIwICAgICBUdXJibyAgICovCi0gICAgeyAweDAwMDBhMzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA5MjAwLCAweDAwMDA5MjAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMjA4LCAweDAwMDEwMjA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE5NjA4LCAweDAwMDE5NjA4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIyNjE4LCAweDAwMDIyNjE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJhNmM5LCAweDAwMDJhNmM5LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMxNzEwLCAweDAwMDMxNzEwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM1NzE4LCAweDAwMDM1NzE4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM4NzU4LCAweDAwMDM4NzU4LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDNjNzVhLCAweDAwMDNjNzVhLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQwNzVjLCAweDAwMDQwNzVjLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ0NzVlLCAweDAwMDQ0NzVlLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ2NzlmLCAweDAwMDQ2NzlmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ4N2RmLCAweDAwMDQ4N2RmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzM4LCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzNjLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQwLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQ0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzQ4LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzRjLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzUwLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzU0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDA3ODE0LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4IH0sCi0gICAgeyAweDAwMDA3ODI4LCAweDI2ZDI0OTFiLCAweDI2ZDI0OTFiLCAweDI2ZDI0OTFiLCAweDI2ZDI0OTFiLCAweDI2ZDI0OTFiIH0sCi0gICAgeyAweDAwMDA3ODMwLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlLCAweGVkYjZkOTZlIH0sCi0gICAgeyAweDAwMDA3ODM4LCAweGZhYzY4ODAxLCAweGZhYzY4ODAxLCAweGZhYzY4ODAxLCAweGZhYzY4ODAxLCAweGZhYzY4ODAxIH0sCi0gICAgeyAweDAwMDA3ODNjLCAweDAwMDFmZmZlLCAweDAwMDFmZmZlLCAweDAwMDFmZmZlLCAweDAwMDFmZmZlLCAweDAwMDFmZmZlIH0sCi0gICAgeyAweDAwMDA3ODQwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwLCAweGZmZWIxYTIwIH0sCi0gICAgeyAweDAwMDA3ODZjLCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0IH0sCi0gICAgeyAweDAwMDA3ODIwLCAweDAwMDAwYzA0LCAweDAwMDAwYzA0LCAweDAwMDAwYzA0LCAweDAwMDAwYzA0LCAweDAwMDAwYzA0IH0sCi0gICAgeyAweDAwMDBhMjc0LCAweDBhMjFjNjUyLCAweDBhMjFjNjUyLCAweDBhMjFhNjUyLCAweDBhMjFhNjUyLCAweDBhMjJhNjUyIH0sCi0gICAgeyAweDAwMDBhMjc4LCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljIH0sCi0gICAgeyAweDAwMDBhMjdjLCAweDA1MGUwMzljLCAweDA1MGUwMzljLCAweDA1MGUwMzljLCAweDA1MGUwMzljLCAweDA1MGUwMzljIH0sCi0gICAgeyAweDAwMDBhMzk0LCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljIH0sCi0gICAgeyAweDAwMDBhMzk4LCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljIH0sCi0gICAgeyAweDAwMDBhM2RjLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljIH0sCi0gICAgeyAweDAwMDBhM2UwLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljIH0sCisJezB4MDAwMGEzMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA5MjAwLCAweDAwMDA5MjAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDIwOCwgMHgwMDAxMDIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTk2MDgsIDB4MDAwMTk2MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIyNjE4LCAweDAwMDIyNjE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyYTZjOSwgMHgwMDAyYTZjOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzE3MTAsIDB4MDAwMzE3MTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM1NzE4LCAweDAwMDM1NzE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzODc1OCwgMHgwMDAzODc1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwM2M3NWEsIDB4MDAwM2M3NWEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQwNzVjLCAweDAwMDQwNzVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0NDc1ZSwgMHgwMDA0NDc1ZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDY3OWYsIDB4MDAwNDY3OWYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ4N2RmLCAweDAwMDQ4N2RmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzOCwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzM2MsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQwLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDgsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzRjLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM1MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNTQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA3ODE0LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4LCAweDkyNDkzNGE4fSwKKwl7MHgwMDAwNzgyOCwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYiwgMHgyNmQyNDkxYn0sCisJezB4MDAwMDc4MzAsIDB4ZWRiNmQ5NmUsIDB4ZWRiNmQ5NmUsIDB4ZWRiNmQ5NmUsIDB4ZWRiNmQ5NmUsIDB4ZWRiNmQ5NmV9LAorCXsweDAwMDA3ODM4LCAweGZhYzY4ODAxLCAweGZhYzY4ODAxLCAweGZhYzY4ODAxLCAweGZhYzY4ODAxLCAweGZhYzY4ODAxfSwKKwl7MHgwMDAwNzgzYywgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZSwgMHgwMDAxZmZmZX0sCisJezB4MDAwMDc4NDAsIDB4ZmZlYjFhMjAsIDB4ZmZlYjFhMjAsIDB4ZmZlYjFhMjAsIDB4ZmZlYjFhMjAsIDB4ZmZlYjFhMjB9LAorCXsweDAwMDA3ODZjLCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0fSwKKwl7MHgwMDAwNzgyMCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNH0sCisJezB4MDAwMGEyNzQsIDB4MGEyMWM2NTIsIDB4MGEyMWM2NTIsIDB4MGEyMWE2NTIsIDB4MGEyMWE2NTIsIDB4MGEyMmE2NTJ9LAorCXsweDAwMDBhMjc4LCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljfSwKKwl7MHgwMDAwYTI3YywgMHgwNTBlMDM5YywgMHgwNTBlMDM5YywgMHgwNTBlMDM5YywgMHgwNTBlMDM5YywgMHgwNTBlMDM5Y30sCisJezB4MDAwMGEzOTQsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWN9LAorCXsweDAwMDBhMzk4LCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljLCAweDAwMDAwMzljfSwKKwl7MHgwMDAwYTNkYywgMHgzOWNlNzM5YywgMHgzOWNlNzM5YywgMHgzOWNlNzM5YywgMHgzOWNlNzM5YywgMHgzOWNlNzM5Y30sCisJezB4MDAwMGEzZTAsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWN9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODVNb2Rlc19YRTJfMF9ub3JtYWxfcG93ZXJbXVs2XSA9IHsKLSAgICB7IDB4MDAwMGEzMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDkyMDAsIDB4MDAwMDkyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAyMDgsIDB4MDAwMTAyMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTk2MDgsIDB4MDAwMTk2MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjI2MTgsIDB4MDAwMjI2MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmE2YzksIDB4MDAwMmE2YzksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzE3MTAsIDB4MDAwMzE3MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzU3MTgsIDB4MDAwMzU3MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzg3NTgsIDB4MDAwMzg3NTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwM2M3NWEsIDB4MDAwM2M3NWEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDA3NWMsIDB4MDAwNDA3NWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDQ3NWUsIDB4MDAwNDQ3NWUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDY3OWYsIDB4MDAwNDY3OWYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDg3ZGYsIDB4MDAwNDg3ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzgsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzM2MsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDgsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNGMsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MTQsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTggfSwKLSAgICB7IDB4MDAwMDc4MjgsIDB4NGFkMjQ5MWIsIDB4NGFkMjQ5MWIsIDB4MmFkMjQ5MWIsIDB4NGFkMjQ5MWIsIDB4NGFkMjQ5MWIgfSwKLSAgICB7IDB4MDAwMDc4MzAsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRiYWUgfSwKLSAgICB7IDB4MDAwMDc4MzgsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEgfSwKLSAgICB7IDB4MDAwMDc4M2MsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUgfSwKLSAgICB7IDB4MDAwMDc4NDAsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMgfSwKLSAgICB7IDB4MDAwMDc4NmMsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQgfSwKLSAgICB7IDB4MDAwMDc4MjAsIDB4MDAwMDBjMDQsIDB4MDAwMDBjMDQsIDB4MDAwMDBjMDQsIDB4MDAwMDBjMDQsIDB4MDAwMDBjMDQgfSwKLSAgICB7IDB4MDAwMGEyNzQsIDB4MGEyMWM2NTIsIDB4MGEyMWM2NTIsIDB4MGEyMWE2NTIsIDB4MGEyMWE2NTIsIDB4MGEyMmE2NTIgfSwKLSAgICB7IDB4MDAwMGEyNzgsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMgfSwKLSAgICB7IDB4MDAwMGEyN2MsIDB4MDUwZTAzOWMsIDB4MDUwZTAzOWMsIDB4MDUwZTAzOWMsIDB4MDUwZTAzOWMsIDB4MDUwZTAzOWMgfSwKLSAgICB7IDB4MDAwMGEzOTQsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMgfSwKLSAgICB7IDB4MDAwMGEzOTgsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMgfSwKLSAgICB7IDB4MDAwMGEzZGMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMgfSwKLSAgICB7IDB4MDAwMGEzZTAsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMgfSwKKwl7MHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDkyMDAsIDB4MDAwMDkyMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMjA4LCAweDAwMDEwMjA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxOTYwOCwgMHgwMDAxOTYwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjI2MTgsIDB4MDAwMjI2MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJhNmM5LCAweDAwMDJhNmM5LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMTcxMCwgMHgwMDAzMTcxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzU3MTgsIDB4MDAwMzU3MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM4NzU4LCAweDAwMDM4NzU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzYzc1YSwgMHgwMDAzYzc1YSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDA3NWMsIDB4MDAwNDA3NWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ0NzVlLCAweDAwMDQ0NzVlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0Njc5ZiwgMHgwMDA0Njc5ZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDg3ZGYsIDB4MDAwNDg3ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzM4LCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzYywgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0OCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNGMsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzUwLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM1NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDc4MTQsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTh9LAorCXsweDAwMDA3ODI4LCAweDRhZDI0OTFiLCAweDRhZDI0OTFiLCAweDJhZDI0OTFiLCAweDRhZDI0OTFiLCAweDRhZDI0OTFifSwKKwl7MHgwMDAwNzgzMCwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGJhZX0sCisJezB4MDAwMDc4MzgsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDEsIDB4ZGFjNzE0NDF9LAorCXsweDAwMDA3ODNjLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlfSwKKwl7MHgwMDAwNzg0MCwgMHhiYTVmNjM4YywgMHhiYTVmNjM4YywgMHhiYTVmNjM4YywgMHhiYTVmNjM4YywgMHhiYTVmNjM4Y30sCisJezB4MDAwMDc4NmMsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQsIDB4NDg2MDllYjQsIDB4NDg2MDllYjR9LAorCXsweDAwMDA3ODIwLCAweDAwMDAwYzA0LCAweDAwMDAwYzA0LCAweDAwMDAwYzA0LCAweDAwMDAwYzA0LCAweDAwMDAwYzA0fSwKKwl7MHgwMDAwYTI3NCwgMHgwYTIxYzY1MiwgMHgwYTIxYzY1MiwgMHgwYTIxYTY1MiwgMHgwYTIxYTY1MiwgMHgwYTIyYTY1Mn0sCisJezB4MDAwMGEyNzgsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWMsIDB4MzljZTczOWN9LAorCXsweDAwMDBhMjdjLCAweDA1MGUwMzljLCAweDA1MGUwMzljLCAweDA1MGUwMzljLCAweDA1MGUwMzljLCAweDA1MGUwMzljfSwKKwl7MHgwMDAwYTM5NCwgMHgzOWNlNzM5YywgMHgzOWNlNzM5YywgMHgzOWNlNzM5YywgMHgzOWNlNzM5YywgMHgzOWNlNzM5Y30sCisJezB4MDAwMGEzOTgsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWMsIDB4MDAwMDAzOWN9LAorCXsweDAwMDBhM2RjLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljLCAweDM5Y2U3MzljfSwKKwl7MHgwMDAwYTNlMCwgMHgwMDAwMDM5YywgMHgwMDAwMDM5YywgMHgwMDAwMDM5YywgMHgwMDAwMDM5YywgMHgwMDAwMDM5Y30sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4NU1vZGVzX1hFMl8wX2hpZ2hfcG93ZXJbXVs2XSA9IHsKLSAgICB7IDB4MDAwMGEzMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDYyMDAsIDB4MDAwMDYyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgyMDEsIDB4MDAwMDgyMDEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGIyNDAsIDB4MDAwMGIyNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQyNDEsIDB4MDAwMGQyNDEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGY2MDAsIDB4MDAwMGY2MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTI4MDAsIDB4MDAwMTI4MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTY4MDIsIDB4MDAwMTY4MDIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMWI4MDUsIDB4MDAwMWI4MDUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjFhODAsIDB4MDAwMjFhODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjhiMDAsIDB4MDAwMjhiMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmFiNDAsIDB4MDAwMmFiNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmNkODAsIDB4MDAwMmNkODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzNkODIsIDB4MDAwMzNkODIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMzgsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzM2MsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwM2E5NWUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNDgsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNGMsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MTQsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTggfSwKLSAgICB7IDB4MDAwMDc4MjgsIDB4NGFkMjQ5MWIsIDB4NGFkMjQ5MWIsIDB4MmFkMjQ5MWIsIDB4NGFkMjQ5MWIsIDB4NGFkMjQ5MWIgfSwKLSAgICB7IDB4MDAwMDc4MzAsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUsIDB4ZWRiNmRhNmUgfSwKLSAgICB7IDB4MDAwMDc4MzgsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMgfSwKLSAgICB7IDB4MDAwMDc4M2MsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUsIDB4MjQ4MWY2ZmUgfSwKLSAgICB7IDB4MDAwMDc4NDAsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMsIDB4YmE1ZjYzOGMgfSwKLSAgICB7IDB4MDAwMDc4NmMsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUgfSwKLSAgICB7IDB4MDAwMDc4MjAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAgfSwKLSAgICB7IDB4MDAwMGEyNzQsIDB4MGEyMmE2NTIsIDB4MGEyMmE2NTIsIDB4MGEyMTY2NTIsIDB4MGEyMTY2NTIsIDB4MGEyMmE2NTIgfSwKLSAgICB7IDB4MDAwMGEyNzgsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcgfSwKLSAgICB7IDB4MDAwMGEyN2MsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcsIDB4MDUwMzgwZTcgfSwKLSAgICB7IDB4MDAwMGEzOTQsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcgfSwKLSAgICB7IDB4MDAwMGEzOTgsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcgfSwKLSAgICB7IDB4MDAwMGEzZGMsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcgfSwKLSAgICB7IDB4MDAwMGEzZTAsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcgfSwKKwl7MHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDYyMDAsIDB4MDAwMDYyMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA4MjAxLCAweDAwMDA4MjAxLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYjI0MCwgMHgwMDAwYjI0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQyNDEsIDB4MDAwMGQyNDEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNjAwLCAweDAwMDBmNjAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMjgwMCwgMHgwMDAxMjgwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTY4MDIsIDB4MDAwMTY4MDIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDFiODA1LCAweDAwMDFiODA1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyMWE4MCwgMHgwMDAyMWE4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjhiMDAsIDB4MDAwMjhiMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJhYjQwLCAweDAwMDJhYjQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyY2Q4MCwgMHgwMDAyY2Q4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzNkODIsIDB4MDAwMzNkODIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzM4LCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDM4OTFlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzYywgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0OCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNGMsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzUwLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM1NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDc4MTQsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTgsIDB4OTI0OTdjYTh9LAorCXsweDAwMDA3ODI4LCAweDRhZDI0OTFiLCAweDRhZDI0OTFiLCAweDJhZDI0OTFiLCAweDRhZDI0OTFiLCAweDRhZDI0OTFifSwKKwl7MHgwMDAwNzgzMCwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZSwgMHhlZGI2ZGE2ZX0sCisJezB4MDAwMDc4MzgsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDMsIDB4ZGFjNzE0NDN9LAorCXsweDAwMDA3ODNjLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlLCAweDI0ODFmNmZlfSwKKwl7MHgwMDAwNzg0MCwgMHhiYTVmNjM4YywgMHhiYTVmNjM4YywgMHhiYTVmNjM4YywgMHhiYTVmNjM4YywgMHhiYTVmNjM4Y30sCisJezB4MDAwMDc4NmMsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUsIDB4MDg2MDllYmUsIDB4MDg2MDllYmV9LAorCXsweDAwMDA3ODIwLCAweDAwMDAwYzAwLCAweDAwMDAwYzAwLCAweDAwMDAwYzAwLCAweDAwMDAwYzAwLCAweDAwMDAwYzAwfSwKKwl7MHgwMDAwYTI3NCwgMHgwYTIyYTY1MiwgMHgwYTIyYTY1MiwgMHgwYTIxNjY1MiwgMHgwYTIxNjY1MiwgMHgwYTIyYTY1Mn0sCisJezB4MDAwMGEyNzgsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTcsIDB4MGU3MzljZTd9LAorCXsweDAwMDBhMjdjLCAweDA1MDM4MGU3LCAweDA1MDM4MGU3LCAweDA1MDM4MGU3LCAweDA1MDM4MGU3LCAweDA1MDM4MGU3fSwKKwl7MHgwMDAwYTM5NCwgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlN30sCisJezB4MDAwMGEzOTgsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTcsIDB4MDAwMDAwZTd9LAorCXsweDAwMDBhM2RjLCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3fSwKKwl7MHgwMDAwYTNlMCwgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlNywgMHgwMDAwMDBlN30sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4NVBjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg1XzFfMltdWzJdID0gewotICAgIHsweDAwMDA0MDQwLCAgMHg5MjQ4ZmQwMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgyNDkyNDkyNCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhhODAwMDAxOSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxMzE2MDgyMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhlNTk4MDU2MCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhjMDFkY2ZmZCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxYWFhYmU0MSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhiZTEwNTU1NCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgwMDA0MzAwNyB9LAotICAgIHsweDAwMDA0MDQ0LCAgMHgwMDAwMDAwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHg5MjQ4ZmQwMH0sCisJezB4MDAwMDQwNDAsIDB4MjQ5MjQ5MjR9LAorCXsweDAwMDA0MDQwLCAweGE4MDAwMDE5fSwKKwl7MHgwMDAwNDA0MCwgMHgxMzE2MDgyMH0sCisJezB4MDAwMDQwNDAsIDB4ZTU5ODA1NjB9LAorCXsweDAwMDA0MDQwLCAweGMwMWRjZmZkfSwKKwl7MHgwMDAwNDA0MCwgMHgxYWFhYmU0MX0sCisJezB4MDAwMDQwNDAsIDB4YmUxMDU1NTR9LAorCXsweDAwMDA0MDQwLCAweDAwMDQzMDA3fSwKKwl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4NVBjaWVQaHlfY2xrcmVxX29mZl9MMV85Mjg1XzFfMltdWzJdID0gewotICAgIHsweDAwMDA0MDQwLCAgMHg5MjQ4ZmQwMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgyNDkyNDkyNCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhhODAwMDAxOSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxMzE2MDgyMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhlNTk4MDU2MCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhjMDFkY2ZmYyB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxYWFhYmU0MSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhiZTEwNTU1NCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgwMDA0MzAwNyB9LAotICAgIHsweDAwMDA0MDQ0LCAgMHgwMDAwMDAwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHg5MjQ4ZmQwMH0sCisJezB4MDAwMDQwNDAsIDB4MjQ5MjQ5MjR9LAorCXsweDAwMDA0MDQwLCAweGE4MDAwMDE5fSwKKwl7MHgwMDAwNDA0MCwgMHgxMzE2MDgyMH0sCisJezB4MDAwMDQwNDAsIDB4ZTU5ODA1NjB9LAorCXsweDAwMDA0MDQwLCAweGMwMWRjZmZjfSwKKwl7MHgwMDAwNDA0MCwgMHgxYWFhYmU0MX0sCisJezB4MDAwMDQwNDAsIDB4YmUxMDU1NTR9LAorCXsweDAwMDA0MDQwLCAweDAwMDQzMDA3fSwKKwl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCiB9OwogCi0vKiBBUjkyODcgUmV2aXNpb24gMTAgKi8KLXN0YXRpYyBjb25zdCB1MzIgYXI5Mjg3TW9kZXNfOTI4N18xXzBbXVs2XSA9IHsKLSAgICAvKiBBZGRyZXNzICAgICAgNUctSFQyMCAgICAgNUctSFQ0MCAgICAgMkctSFQ0MCAgICAgMkctSFQyMCAgICAgVHVyYm8gICAqLwotICAgIHsgMHgwMDAwMTAzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTA3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4YywgMHgwMDAwMDFlMCB9LAotICAgIHsgMHgwMDAwMTBiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwN2M3MCwgMHgwMDAwM2UzOCwgMHgwMDAwMTE4MCB9LAotICAgIHsgMHgwMDAwMTBmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwODAxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxMDgwMTYwMCwgMHgwODQwMGIwMCwgMHgwNmUwMDZlMCB9LAotICAgIHsgMHgwMDAwODAxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxMmUwMDA1NywgMHgxMmUwMDAyYiwgMHgwOTg4MDA0ZiB9LAotICAgIHsgMHgwMDAwODEyMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMCB9LAotICAgIHsgMHgwMDAwODFkMCwgMHgwMDAwMzIwMCwgMHgwMDAwMzIwMCwgMHgwMDAwMzIwYSwgMHgwMDAwMzIwYSwgMHgwMDAwMzIwYSB9LAotICAgIHsgMHgwMDAwODMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MCwgMHgwMDAwNjg4MCB9LAotICAgIHsgMHgwMDAwOTgwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwMyB9LAotICAgIHsgMHgwMDAwOTgyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCB9LAotICAgIHsgMHgwMDAwOTgyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSwgMHgwYTAyMDAwMSB9LAotICAgIHsgMHgwMDAwOTgzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSB9LAotICAgIHsgMHgwMDAwOTgzOCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNyB9LAotICAgIHsgMHgwMDAwOTg0MCwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSB9LAotICAgIHsgMHgwMDAwOTg0NCwgMHgwMzcyMDAwMCwgMHgwMzcyMDAwMCwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMCB9LAotICAgIHsgMHgwMDAwOTg1MCwgMHg2MDAwMDAwMCwgMHg2MDAwMDAwMCwgMHg2ZDQwMDBlMiwgMHg2YzQwMDBlMiwgMHg2YzQwMDBlMiB9LAotICAgIHsgMHgwMDAwOTg1OCwgMHg3YzAwMGQwMCwgMHg3YzAwMGQwMCwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSB9LAotICAgIHsgMHgwMDAwOTg1YywgMHgzMTAwMDA1ZSwgMHgzMTAwMDA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NWQ1ZSwgMHgzMTM5NWQ1ZSB9LAotICAgIHsgMHgwMDAwOTg2MCwgMHgwMDA1OGQwMCwgMHgwMDA1OGQwMCwgMHgwMDA1OGQyMCwgMHgwMDA1OGQyMCwgMHgwMDA1OGQxOCB9LAotICAgIHsgMHgwMDAwOTg2NCwgMHgwMDAwMGUwMCwgMHgwMDAwMGUwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCB9LAotICAgIHsgMHgwMDAwOTg2OCwgMHgwMDAwNDBjMCwgMHgwMDAwNDBjMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCB9LAotICAgIHsgMHgwMDAwOTg2YywgMHgwMDAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MSB9LAotICAgIHsgMHgwMDAwOTkxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMCB9LAotICAgIHsgMHgwMDAwOTkxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNiB9LAotICAgIHsgMHgwMDAwOTkyNCwgMHhkMDBhOGEwMSwgMHhkMDBhOGEwMSwgMHhkMDBhOGEwZCwgMHhkMDBhOGEwZCwgMHhkMDBhOGEwZCB9LAotICAgIHsgMHgwMDAwOTk0NCwgMHhlZmJjMDAwMCwgMHhlZmJjMDAwMCwgMHhlZmJjMTAxMCwgMHhlZmJjMTAxMCwgMHhlZmJjMTAxMCB9LAotICAgIHsgMHgwMDAwOTk2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwYTk2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwOTk2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCB9LAotICAgIHsgMHgwMDAwYzk2OCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSB9LAotICAgIHsgMHgwMDAwOTliOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAxYywgMHgwMDAwMDAxYywgMHgwMDAwMDAxYyB9LAotICAgIHsgMHgwMDAwOTliYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCB9LAotICAgIHsgMHgwMDAwOTljMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCB9LAotICAgIHsgMHgwMDAwYTIwNCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0NCwgMHgwMDAwMDQ0NCwgMHgwMDAwMDQ0NCB9LAotICAgIHsgMHgwMDAwYTIwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYjIwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTIxYywgMHgxODAzODAwYSwgMHgxODAzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSB9LAotICAgIHsgMHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0YTAwMCwgMHgwMDA0YTAwMCwgMHgwMDA0YTAwMCB9LAotICAgIHsgMHgwMDAwYTM1OCwgMHg3OTk5YWEwMiwgMHg3OTk5YWEwMiwgMHg3OTk5YWEwZSwgMHg3OTk5YWEwZSwgMHg3OTk5YWEwZSB9LAotICAgIHsgMHgwMDAwYTNkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkyODdDb21tb25fOTI4N18xXzBbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwMzAsIDB4MDAwMjAwMTUgfSwKLSAgICB7IDB4MDAwMDAwMzQsIDB4MDAwMDAwMDUgfSwKLSAgICB7IDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNDQsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNDgsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNGMsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDAwNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNDAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNGMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNWMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwMzAsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwM2MsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwMjQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDQwNjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDcwMTAsIDB4MDAwMDAwMzMgfSwKLSAgICB7IDB4MDAwMDcwMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDcwMzQsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDcwMzgsIDB4MDAwMDA0YzIgfSwKLSAgICB7IDB4MDAwMDgwMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMTgsIDB4MDAwMDA3MDAgfSwKLSAgICB7IDB4MDAwMDgwMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNDgsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNWMsIDB4MDAwZmM3OGYgfSwKLSAgICB7IDB4MDAwMDgwNjAsIDB4MDAwMDAwMGYgfSwKLSAgICB7IDB4MDAwMDgwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYzAsIDB4MmE4MDAwMWEgfSwKLSAgICB7IDB4MDAwMDgwYzQsIDB4MDVkYzAxZTAgfSwKLSAgICB7IDB4MDAwMDgwYzgsIDB4MWY0MDI3MTAgfSwKLSAgICB7IDB4MDAwMDgwY2MsIDB4MDFmNDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDAsIDB4MDAwMDFlMDAgfSwKLSAgICB7IDB4MDAwMDgwZDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDgsIDB4MDA0MDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZTAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTQsIDB4MDAwMGZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTgsIDB4MDAzZjNmM2YgfSwKLSAgICB7IDB4MDAwMDgwZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZmMsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDAsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgxMDgsIDB4MDAwMDAwNTIgfSwKLSAgICB7IDB4MDAwMDgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMTAsIDB4MDAwMDAxNjggfSwKLSAgICB7IDB4MDAwMDgxMTgsIDB4MDAwMTAwYWEgfSwKLSAgICB7IDB4MDAwMDgxMWMsIDB4MDAwMDMyMTAgfSwKLSAgICB7IDB4MDAwMDgxMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNDQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgxNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNzAsIDB4MTg0ODczMjAgfSwKLSAgICB7IDB4MDAwMDgxNzQsIDB4ZmFhNGZhNTAgfSwKLSAgICB7IDB4MDAwMDgxNzgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgxN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxYzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDAsIDB4MDAxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDQsIDB4MDAxMGY0MDAgfSwKLSAgICB7IDB4MDAwMDgyNDgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgyNGMsIDB4MDAwMWU4MDAgfSwKLSAgICB7IDB4MDAwMDgyNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNWMsIDB4NDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgyNjAsIDB4MDAwODA5MjIgfSwKLSAgICB7IDB4MDAwMDgyNjQsIDB4ODhhMDAwMTAgfSwKLSAgICB7IDB4MDAwMDgyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzQsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzgsIDB4MDAzZTQxODAgfSwKLSAgICB7IDB4MDAwMDgyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyODQsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyODgsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyOGMsIDB4MDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgyOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDAsIDB4MDAwMDAwNDAgfSwKLSAgICB7IDB4MDAwMDgzMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMmMsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDgzMzAsIDB4MDAwMDAzMDIgfSwKLSAgICB7IDB4MDAwMDgzMzQsIDB4MDAwMDBlMDAgfSwKLSAgICB7IDB4MDAwMDgzMzgsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDgzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNDAsIDB4MDAwMTA3ZmYgfSwKLSAgICB7IDB4MDAwMDgzNDQsIDB4MDFjODEwNDMgfSwKLSAgICB7IDB4MDAwMDgzNjAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgzNjQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgzNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNzQsIDB4MDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgzNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzODAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgzODQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgzOTAsIDB4MGZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgzOTQsIDB4MGZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgzOTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzOWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MGMsIDB4YWZlNjhlMzAgfSwKLSAgICB7IDB4MDAwMDk4MTAsIDB4ZmQxNGUwMDAgfSwKLSAgICB7IDB4MDAwMDk4MTQsIDB4OWMwYTlmNmIgfSwKLSAgICB7IDB4MDAwMDk4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MmMsIDB4MDAwMGEwMDAgfSwKLSAgICB7IDB4MDAwMDk4MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4M2MsIDB4MDAyMDA0MDAgfSwKLSAgICB7IDB4MDAwMDk4NGMsIDB4MDA0MDIzM2MgfSwKLSAgICB7IDB4MDAwMGE4NGMsIDB4MDA0MDIzM2MgfSwKLSAgICB7IDB4MDAwMDk4NTQsIDB4MDAwMDAwNDQgfSwKLSAgICB7IDB4MDAwMDk5MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MTAsIDB4MTAwMDIzMTAgfSwKLSAgICB7IDB4MDAwMDk5MWMsIDB4MTAwMDBmZmYgfSwKLSAgICB7IDB4MDAwMDk5MjAsIDB4MDQ5MDAwMDAgfSwKLSAgICB7IDB4MDAwMGE5MjAsIDB4MDQ5MDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MjgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5MmMsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMDk5MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGE5MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MzQsIDB4MWUxZjIwMjIgfSwKLSAgICB7IDB4MDAwMDk5MzgsIDB4MGEwYjBjMGQgfSwKLSAgICB7IDB4MDAwMDk5M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NDgsIDB4OTI4MGMwMGEgfSwKLSAgICB7IDB4MDAwMDk5NGMsIDB4MDAwMjAwMjggfSwKLSAgICB7IDB4MDAwMDk5NTQsIDB4NWYzY2EzZGUgfSwKLSAgICB7IDB4MDAwMDk5NTgsIDB4MDEwOGVjZmYgfSwKLSAgICB7IDB4MDAwMDk5NDAsIDB4MTQ3NTA2MDQgfSwKLSAgICB7IDB4MDAwMGM5NWMsIDB4MDA0YjZhOGUgfSwKLSAgICB7IDB4MDAwMDk5NzAsIDB4OTkwYmI1MTUgfSwKLSAgICB7IDB4MDAwMDk5NzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NzgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5YTgsIDB4MjAxZmZmMDAgfSwKLSAgICB7IDB4MDAwMDk5YWMsIDB4MGM2ZjAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjAsIDB4MDMwNTEwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjQsIDB4MDAwMDA4MjAgfSwKLSAgICB7IDB4MDAwMDk5YzQsIDB4MDYzMzZmNzcgfSwKLSAgICB7IDB4MDAwMDk5YzgsIDB4NmFmNjUzMjkgfSwKLSAgICB7IDB4MDAwMDk5Y2MsIDB4MDhmMTg2YzggfSwKLSAgICB7IDB4MDAwMDk5ZDAsIDB4MDAwNDYzODQgfSwKLSAgICB7IDB4MDAwMDk5ZGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTQsIDB4YWFhYWFhYWEgfSwKLSAgICB7IDB4MDAwMDk5ZTgsIDB4M2M0NjY0NzggfSwKLSAgICB7IDB4MDAwMDk5ZWMsIDB4MGNjODBjYWEgfSwKLSAgICB7IDB4MDAwMDk5ZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZmMsIDB4MDAwMDEwNDIgfSwKLSAgICB7IDB4MDAwMGExZjQsIDB4MDBmZmZlZmYgfSwKLSAgICB7IDB4MDAwMGExZjgsIDB4MDBmNWY5ZmYgfSwKLSAgICB7IDB4MDAwMGExZmMsIDB4Yjc5ZjY0MjcgfSwKLSAgICB7IDB4MDAwMGEyMDgsIDB4ODAzZTQ3ODggfSwKLSAgICB7IDB4MDAwMGEyMTAsIDB4NDA4MGEzMzMgfSwKLSAgICB7IDB4MDAwMGEyMTQsIDB4NDAyMDZjMTAgfSwKLSAgICB7IDB4MDAwMGEyMTgsIDB4MDA5YzQwNjAgfSwKLSAgICB7IDB4MDAwMGEyMjAsIDB4MDE4MzQwNjEgfSwKLSAgICB7IDB4MDAwMGEyMjQsIDB4MDAwMDA0MDAgfSwKLSAgICB7IDB4MDAwMGEyMjgsIDB4MDAwMDAzYjUgfSwKLSAgICB7IDB4MDAwMGEyMmMsIDB4MjMzZjcxODAgfSwKLSAgICB7IDB4MDAwMGEyMzQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyMzgsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyM2MsIDB4MTNjODg5YWYgfSwKLSAgICB7IDB4MDAwMGEyNDAsIDB4Mzg0OTBhMjAgfSwKLSAgICB7IDB4MDAwMGEyNDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNDgsIDB4ZmZmZmZmZmMgfSwKLSAgICB7IDB4MDAwMGEyNGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTgsIDB4MGNkYmQzODAgfSwKLSAgICB7IDB4MDAwMGEyNWMsIDB4MGYwZjBmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjAsIDB4ZGZhOTFmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjQsIDB4MDA0MThhMTEgfSwKLSAgICB7IDB4MDAwMGIyNjQsIDB4MDA0MThhMTEgfSwKLSAgICB7IDB4MDAwMGEyNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNmMsIDB4MGU3OWU1YzYgfSwKLSAgICB7IDB4MDAwMGIyNmMsIDB4MGU3OWU1YzYgfSwKLSAgICB7IDB4MDAwMGQyNzAsIDB4MDA4MjA4MjAgfSwKLSAgICB7IDB4MDAwMGEyNzgsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEyN2MsIDB4MDUwNzAxY2UgfSwKLSAgICB7IDB4MDAwMGQzNWMsIDB4MDdmZmZmZWYgfSwKLSAgICB7IDB4MDAwMGQzNjAsIDB4MGZmZmZmZTcgfSwKLSAgICB7IDB4MDAwMGQzNjQsIDB4MTdmZmZmZTUgfSwKLSAgICB7IDB4MDAwMGQzNjgsIDB4MWZmZmZmZTQgfSwKLSAgICB7IDB4MDAwMGQzNmMsIDB4MzdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzAsIDB4M2ZmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzQsIDB4NTdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzgsIDB4NWZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzN2MsIDB4N2ZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzODAsIDB4N2YzYzdiYmEgfSwKLSAgICB7IDB4MDAwMGQzODQsIDB4ZjMzMDdmZjAgfSwKLSAgICB7IDB4MDAwMGEzODgsIDB4MGMwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzOGMsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTQsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEzOTgsIDB4MDAwMDAxY2UgfSwKLSAgICB7IDB4MDAwMGIzOTgsIDB4MDAwMDAxY2UgfSwKLSAgICB7IDB4MDAwMGEzOWMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEzYzgsIDB4MDAwMDAyNDYgfSwKLSAgICB7IDB4MDAwMGEzY2MsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZGMsIDB4MWNlNzM5Y2UgfSwKLSAgICB7IDB4MDAwMGEzZTAsIDB4MDAwMDAxY2UgfSwKLSAgICB7IDB4MDAwMGEzZTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzZTgsIDB4MThjNDM0MzMgfSwKLSAgICB7IDB4MDAwMGEzZWMsIDB4MDBmNzAwODEgfSwKLSAgICB7IDB4MDAwMGEzZjAsIDB4MDEwMzZhMWUgfSwKLSAgICB7IDB4MDAwMGEzZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGIzZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGE3ZDgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDc4MDAsIDB4MDAwMDA4MDAgfSwKLSAgICB7IDB4MDAwMDc4MDQsIDB4NmMzNWZmYjAgfSwKLSAgICB7IDB4MDAwMDc4MDgsIDB4NmRiNmMwMDAgfSwKLSAgICB7IDB4MDAwMDc4MGMsIDB4NmRiNmNiMzAgfSwKLSAgICB7IDB4MDAwMDc4MTAsIDB4NmRiNmNiNmMgfSwKLSAgICB7IDB4MDAwMDc4MTQsIDB4MDUwMWUyMDAgfSwKLSAgICB7IDB4MDAwMDc4MTgsIDB4MDA5NDEyOGQgfSwKLSAgICB7IDB4MDAwMDc4MWMsIDB4OTc2ZWUzOTIgfSwKLSAgICB7IDB4MDAwMDc4MjAsIDB4Zjc1ZmY2ZmMgfSwKLSAgICB7IDB4MDAwMDc4MjQsIDB4MDAwNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MjgsIDB4ZGIwMDMwMTIgfSwKLSAgICB7IDB4MDAwMDc4MmMsIDB4MDQ5MjQ5MTQgfSwKLSAgICB7IDB4MDAwMDc4MzAsIDB4MjEwODQyMTAgfSwKLSAgICB7IDB4MDAwMDc4MzQsIDB4MDAxNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MzgsIDB4MGU0NTQ4ZDggfSwKLSAgICB7IDB4MDAwMDc4M2MsIDB4NTQyMTQ1MTQgfSwKLSAgICB7IDB4MDAwMDc4NDAsIDB4MDIwMjU4MjAgfSwKLSAgICB7IDB4MDAwMDc4NDQsIDB4NzFjMGQzODggfSwKLSAgICB7IDB4MDAwMDc4NDgsIDB4OTM0OTM0YTggfSwKLSAgICB7IDB4MDAwMDc4NTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4NTQsIDB4MDAwMDA4MDAgfSwKLSAgICB7IDB4MDAwMDc4NTgsIDB4NmMzNWZmYjAgfSwKLSAgICB7IDB4MDAwMDc4NWMsIDB4NmRiNmMwMDAgfSwKLSAgICB7IDB4MDAwMDc4NjAsIDB4NmRiNmNiMmMgfSwKLSAgICB7IDB4MDAwMDc4NjQsIDB4NmRiNmNiNmMgfSwKLSAgICB7IDB4MDAwMDc4NjgsIDB4MDUwMWUyMDAgfSwKLSAgICB7IDB4MDAwMDc4NmMsIDB4MDA5NDEyOGQgfSwKLSAgICB7IDB4MDAwMDc4NzAsIDB4OTc2ZWUzOTIgfSwKLSAgICB7IDB4MDAwMDc4NzQsIDB4Zjc1ZmY2ZmMgfSwKLSAgICB7IDB4MDAwMDc4NzgsIDB4MDAwNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4N2MsIDB4ZGIwMDMwMTIgfSwKLSAgICB7IDB4MDAwMDc4ODAsIDB4MDQ5MjQ5MTQgfSwKLSAgICB7IDB4MDAwMDc4ODQsIDB4MjEwODQyMTAgfSwKLSAgICB7IDB4MDAwMDc4ODgsIDB4MDAxYjZkYjAgfSwKLSAgICB7IDB4MDAwMDc4OGMsIDB4MDAzNzZiNjMgfSwKLSAgICB7IDB4MDAwMDc4OTAsIDB4MDZkYjZkYjYgfSwKLSAgICB7IDB4MDAwMDc4OTQsIDB4MDA2ZDgwMDAgfSwKLSAgICB7IDB4MDAwMDc4OTgsIDB4NDgxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4YTAsIDB4MDgwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4YTQsIDB4MDAwN2ZmZDggfSwKLSAgICB7IDB4MDAwMDc4YTgsIDB4MDAwN2ZmZDggfSwKLSAgICB7IDB4MDAwMDc4YWMsIDB4MDAxYzAwMjAgfSwKLSAgICB7IDB4MDAwMDc4YjAsIDB4MDAwNjExZWIgfSwKLSAgICB7IDB4MDAwMDc4YjQsIDB4NDAwMDgwODAgfSwKLSAgICB7IDB4MDAwMDc4YjgsIDB4MmE4NTAxNjAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYXI5Mjg3TW9kZXNfdHhfZ2Fpbl85Mjg3XzFfMFtdWzZdID0gewotICAgIC8qIEFkZHJlc3MgICAgICA1Ry1IVDIwICAgICA1Ry1IVDQwICAgICAyRy1IVDQwICAgICAyRy1IVDIwICAgICBUdXJibyAgICovCi0gICAgeyAweDAwMDBhMzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMzA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDAyLCAweDAwMDA0MDAyLCAweDAwMDA0MDAyIH0sCi0gICAgeyAweDAwMDBhMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA4MDA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0IH0sCi0gICAgeyAweDAwMDBhMzBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjMDBhLCAweDAwMDBjMDBhLCAweDAwMDBjMDBhIH0sCi0gICAgeyAweDAwMDBhMzEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMDBjLCAweDAwMDEwMDBjLCAweDAwMDEwMDBjIH0sCi0gICAgeyAweDAwMDBhMzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE0MjBiLCAweDAwMDE0MjBiLCAweDAwMDE0MjBiIH0sCi0gICAgeyAweDAwMDBhMzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE4MjRhLCAweDAwMDE4MjRhLCAweDAwMDE4MjRhIH0sCi0gICAgeyAweDAwMDBhMzFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDFjNDRhLCAweDAwMDFjNDRhLCAweDAwMDFjNDRhIH0sCi0gICAgeyAweDAwMDBhMzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIwNjRhLCAweDAwMDIwNjRhLCAweDAwMDIwNjRhIH0sCi0gICAgeyAweDAwMDBhMzI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDI0ODRhLCAweDAwMDI0ODRhLCAweDAwMDI0ODRhIH0sCi0gICAgeyAweDAwMDBhMzI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDI4YTRhLCAweDAwMDI4YTRhLCAweDAwMDI4YTRhIH0sCi0gICAgeyAweDAwMDBhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJjYzRhLCAweDAwMDJjYzRhLCAweDAwMDJjYzRhIH0sCi0gICAgeyAweDAwMDBhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMwZTRhLCAweDAwMDMwZTRhLCAweDAwMDMwZTRhIH0sCi0gICAgeyAweDAwMDBhMzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0ZThhLCAweDAwMDM0ZThhLCAweDAwMDM0ZThhIH0sCi0gICAgeyAweDAwMDBhMzM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM4ZThjLCAweDAwMDM4ZThjLCAweDAwMDM4ZThjIH0sCi0gICAgeyAweDAwMDBhMzNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDNjZWNjLCAweDAwMDNjZWNjLCAweDAwMDNjZWNjIH0sCi0gICAgeyAweDAwMDBhMzQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQwZWQ0LCAweDAwMDQwZWQ0LCAweDAwMDQwZWQ0IH0sCi0gICAgeyAweDAwMDBhMzQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ0ZWRjLCAweDAwMDQ0ZWRjLCAweDAwMDQ0ZWRjIH0sCi0gICAgeyAweDAwMDBhMzQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ4ZWRlLCAweDAwMDQ4ZWRlLCAweDAwMDQ4ZWRlIH0sCi0gICAgeyAweDAwMDBhMzRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDRjZjFlLCAweDAwMDRjZjFlLCAweDAwMDRjZjFlIH0sCi0gICAgeyAweDAwMDBhMzUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDUwZjVlLCAweDAwMDUwZjVlLCAweDAwMDUwZjVlIH0sCi0gICAgeyAweDAwMDBhMzU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU0ZjllLCAweDAwMDU0ZjllLCAweDAwMDU0ZjllIH0sCi0gICAgeyAweDAwMDBhNzgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDYwLCAweDAwMDAwMDYwLCAweDAwMDAwMDYwIH0sCi0gICAgeyAweDAwMDBhNzg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDYyLCAweDAwMDA0MDYyLCAweDAwMDA0MDYyIH0sCi0gICAgeyAweDAwMDBhNzg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA4MDY0LCAweDAwMDA4MDY0LCAweDAwMDA4MDY0IH0sCi0gICAgeyAweDAwMDBhNzhjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjMGE0LCAweDAwMDBjMGE0LCAweDAwMDBjMGE0IH0sCi0gICAgeyAweDAwMDBhNzkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMGIwLCAweDAwMDEwMGIwLCAweDAwMDEwMGIwIH0sCi0gICAgeyAweDAwMDBhNzk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE0MGIyLCAweDAwMDE0MGIyLCAweDAwMDE0MGIyIH0sCi0gICAgeyAweDAwMDBhNzk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE4MGI0LCAweDAwMDE4MGI0LCAweDAwMDE4MGI0IH0sCi0gICAgeyAweDAwMDBhNzljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDFjMGY0LCAweDAwMDFjMGY0LCAweDAwMDFjMGY0IH0sCi0gICAgeyAweDAwMDBhN2EwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIwMTM0LCAweDAwMDIwMTM0LCAweDAwMDIwMTM0IH0sCi0gICAgeyAweDAwMDBhN2E0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDI0MGZlLCAweDAwMDI0MGZlLCAweDAwMDI0MGZlIH0sCi0gICAgeyAweDAwMDBhN2E4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDI4MTNlLCAweDAwMDI4MTNlLCAweDAwMDI4MTNlIH0sCi0gICAgeyAweDAwMDBhN2FjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJjMTdlLCAweDAwMDJjMTdlLCAweDAwMDJjMTdlIH0sCi0gICAgeyAweDAwMDBhN2IwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMwMWJlLCAweDAwMDMwMWJlLCAweDAwMDMwMWJlIH0sCi0gICAgeyAweDAwMDBhN2I0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2I4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2JjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2MwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2M0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2M4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2NjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2QwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhN2Q0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlLCAweDAwMDM0MWZlIH0sCi0gICAgeyAweDAwMDBhMjc0LCAweDBhMTgwMDAwLCAweDBhMTgwMDAwLCAweDBhMWFhMDAwLCAweDBhMWFhMDAwLCAweDBhMWFhMDAwIH0sCi19OwotCi0KLXN0YXRpYyBjb25zdCB1MzIgYXI5Mjg3TW9kZXNfcnhfZ2Fpbl85Mjg3XzFfMFtdWzZdID0gewotICAgIC8qIEFkZHJlc3MgICAgICA1Ry1IVDIwICAgICA1Ry1IVDQwICAgICAyRy1IVDQwICAgICAyRy1IVDIwICAgICBUdXJibyAgICovCi0gICAgeyAweDAwMDA5YTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwIH0sCi0gICAgeyAweDAwMDA5YTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI0LCAweDAwMDBhMTI0LCAweDAwMDBhMTI0IH0sCi0gICAgeyAweDAwMDA5YTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI4LCAweDAwMDBhMTI4LCAweDAwMDBhMTI4IH0sCi0gICAgeyAweDAwMDA5YTBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjIH0sCi0gICAgeyAweDAwMDA5YTEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwIH0sCi0gICAgeyAweDAwMDA5YTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk0LCAweDAwMDBhMTk0LCAweDAwMDBhMTk0IH0sCi0gICAgeyAweDAwMDA5YTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk4LCAweDAwMDBhMTk4LCAweDAwMDBhMTk4IH0sCi0gICAgeyAweDAwMDA5YTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjIH0sCi0gICAgeyAweDAwMDA5YTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwIH0sCi0gICAgeyAweDAwMDA5YTI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg0LCAweDAwMDBhMjg0LCAweDAwMDBhMjg0IH0sCi0gICAgeyAweDAwMDA5YTI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg4LCAweDAwMDBhMjg4LCAweDAwMDBhMjg4IH0sCi0gICAgeyAweDAwMDA5YTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjIH0sCi0gICAgeyAweDAwMDA5YTMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwIH0sCi0gICAgeyAweDAwMDA5YTM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjk0LCAweDAwMDBhMjk0LCAweDAwMDBhMjk0IH0sCi0gICAgeyAweDAwMDA5YTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwIH0sCi0gICAgeyAweDAwMDA5YTNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE0LCAweDAwMDBhMmE0LCAweDAwMDBhMmE0IH0sCi0gICAgeyAweDAwMDA5YTQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE4LCAweDAwMDBhMmE4LCAweDAwMDBhMmE4IH0sCi0gICAgeyAweDAwMDA5YTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjIH0sCi0gICAgeyAweDAwMDA5YTQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwIH0sCi0gICAgeyAweDAwMDA5YTRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI0LCAweDAwMDBhMmI0LCAweDAwMDBhMmI0IH0sCi0gICAgeyAweDAwMDA5YTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI4LCAweDAwMDBhMmI4LCAweDAwMDBhMmI4IH0sCi0gICAgeyAweDAwMDA5YTU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmM0LCAweDAwMDBhMmM0LCAweDAwMDBhMmM0IH0sCi0gICAgeyAweDAwMDA5YTU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzA4LCAweDAwMDBhNzA4LCAweDAwMDBhNzA4IH0sCi0gICAgeyAweDAwMDA5YTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjIH0sCi0gICAgeyAweDAwMDA5YTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwIH0sCi0gICAgeyAweDAwMDA5YTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA0LCAweDAwMDBhYjA0LCAweDAwMDBhYjA0IH0sCi0gICAgeyAweDAwMDA5YTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA4LCAweDAwMDBhYjA4LCAweDAwMDBhYjA4IH0sCi0gICAgeyAweDAwMDA5YTZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjIH0sCi0gICAgeyAweDAwMDA5YTcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwIH0sCi0gICAgeyAweDAwMDA5YTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE0LCAweDAwMDBhYjE0LCAweDAwMDBhYjE0IH0sCi0gICAgeyAweDAwMDA5YTc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE4LCAweDAwMDBhYjE4LCAweDAwMDBhYjE4IH0sCi0gICAgeyAweDAwMDA5YTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjIH0sCi0gICAgeyAweDAwMDA5YTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwIH0sCi0gICAgeyAweDAwMDA5YTg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk0LCAweDAwMDBhYjk0LCAweDAwMDBhYjk0IH0sCi0gICAgeyAweDAwMDA5YTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk4LCAweDAwMDBhYjk4LCAweDAwMDBhYjk4IH0sCi0gICAgeyAweDAwMDA5YThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE0LCAweDAwMDBhYmE0LCAweDAwMDBhYmE0IH0sCi0gICAgeyAweDAwMDA5YTkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE4LCAweDAwMDBhYmE4LCAweDAwMDBhYmE4IH0sCi0gICAgeyAweDAwMDA5YTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA0LCAweDAwMDBjYjA0LCAweDAwMDBjYjA0IH0sCi0gICAgeyAweDAwMDA5YTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA4LCAweDAwMDBjYjA4LCAweDAwMDBjYjA4IH0sCi0gICAgeyAweDAwMDA5YTljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjIH0sCi0gICAgeyAweDAwMDA5YWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwIH0sCi0gICAgeyAweDAwMDA5YWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE0LCAweDAwMDBjYjE0LCAweDAwMDBjYjE0IH0sCi0gICAgeyAweDAwMDA5YWE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE4LCAweDAwMDBjYjE4LCAweDAwMDBjYjE4IH0sCi0gICAgeyAweDAwMDA5YWFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjIH0sCi0gICAgeyAweDAwMDA5YWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwIH0sCi0gICAgeyAweDAwMDA5YWI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjE4LCAweDAwMDBjZjE4LCAweDAwMDBjZjE4IH0sCi0gICAgeyAweDAwMDA5YWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI0LCAweDAwMDBjZjI0LCAweDAwMDBjZjI0IH0sCi0gICAgeyAweDAwMDA5YWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI4LCAweDAwMDBjZjI4LCAweDAwMDBjZjI4IH0sCi0gICAgeyAweDAwMDA5YWMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE0LCAweDAwMDBkMzE0LCAweDAwMDBkMzE0IH0sCi0gICAgeyAweDAwMDA5YWM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE4LCAweDAwMDBkMzE4LCAweDAwMDBkMzE4IH0sCi0gICAgeyAweDAwMDA5YWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjIH0sCi0gICAgeyAweDAwMDA5YWNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwIH0sCi0gICAgeyAweDAwMDA5YWQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk0LCAweDAwMDBkMzk0LCAweDAwMDBkMzk0IH0sCi0gICAgeyAweDAwMDA5YWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk4LCAweDAwMDBkMzk4LCAweDAwMDBkMzk4IH0sCi0gICAgeyAweDAwMDA5YWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E0LCAweDAwMDBkM2E0LCAweDAwMDBkM2E0IH0sCi0gICAgeyAweDAwMDA5YWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E4LCAweDAwMDBkM2E4LCAweDAwMDBkM2E4IH0sCi0gICAgeyAweDAwMDA5YWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjIH0sCi0gICAgeyAweDAwMDA5YWU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwIH0sCi0gICAgeyAweDAwMDA5YWU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwIH0sCi0gICAgeyAweDAwMDA5YWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg0LCAweDAwMDBmMzg0LCAweDAwMDBmMzg0IH0sCi0gICAgeyAweDAwMDA5YWYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg4LCAweDAwMDBmMzg4LCAweDAwMDBmMzg4IH0sCi0gICAgeyAweDAwMDA5YWY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwIH0sCi0gICAgeyAweDAwMDA5YWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE0LCAweDAwMDBmNzE0LCAweDAwMDBmNzE0IH0sCi0gICAgeyAweDAwMDA5YWZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE4LCAweDAwMDBmNzE4LCAweDAwMDBmNzE4IH0sCi0gICAgeyAweDAwMDA5YjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwIH0sCi0gICAgeyAweDAwMDA5YjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE0LCAweDAwMDBmYjE0LCAweDAwMDBmYjE0IH0sCi0gICAgeyAweDAwMDA5YjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE4LCAweDAwMDBmYjE4LCAweDAwMDBmYjE4IH0sCi0gICAgeyAweDAwMDA5YjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjIH0sCi0gICAgeyAweDAwMDA5YjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwIH0sCi0gICAgeyAweDAwMDA5YjE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjk0LCAweDAwMDBmYjk0LCAweDAwMDBmYjk0IH0sCi0gICAgeyAweDAwMDA5YjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjIH0sCi0gICAgeyAweDAwMDA5YjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwIH0sCi0gICAgeyAweDAwMDA5YjIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjk0LCAweDAwMDBmZjk0LCAweDAwMDBmZjk0IH0sCi0gICAgeyAweDAwMDA5YjI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwIH0sCi0gICAgeyAweDAwMDA5YjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE0LCAweDAwMDBmZmE0LCAweDAwMDBmZmE0IH0sCi0gICAgeyAweDAwMDA5YjJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE4LCAweDAwMDBmZmE4LCAweDAwMDBmZmE4IH0sCi0gICAgeyAweDAwMDA5YjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjIH0sCi0gICAgeyAweDAwMDA5YjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwIH0sCi0gICAgeyAweDAwMDA5YjM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI0LCAweDAwMDBmZmI0LCAweDAwMDBmZmI0IH0sCi0gICAgeyAweDAwMDA5YjNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmExLCAweDAwMDBmZmExLCAweDAwMDBmZmExIH0sCi0gICAgeyAweDAwMDA5YjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE1LCAweDAwMDBmZmE1LCAweDAwMDBmZmE1IH0sCi0gICAgeyAweDAwMDA5YjQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE5LCAweDAwMDBmZmE5LCAweDAwMDBmZmE5IH0sCi0gICAgeyAweDAwMDA5YjQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkIH0sCi0gICAgeyAweDAwMDA5YjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxIH0sCi0gICAgeyAweDAwMDA5YjUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI1LCAweDAwMDBmZmI1LCAweDAwMDBmZmI1IH0sCi0gICAgeyAweDAwMDA5YjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI5LCAweDAwMDBmZmI5LCAweDAwMDBmZmI5IH0sCi0gICAgeyAweDAwMDA5YjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM1LCAweDAwMDBmZmM1LCAweDAwMDBmZmM1IH0sCi0gICAgeyAweDAwMDA5YjVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM5LCAweDAwMDBmZmM5LCAweDAwMDBmZmM5IH0sCi0gICAgeyAweDAwMDA5YjYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkIH0sCi0gICAgeyAweDAwMDA5YjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxIH0sCi0gICAgeyAweDAwMDA5YjY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1IH0sCi0gICAgeyAweDAwMDA5YjZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyIH0sCi0gICAgeyAweDAwMDA5YjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM2LCAweDAwMDBmZmM2LCAweDAwMDBmZmM2IH0sCi0gICAgeyAweDAwMDA5Yjc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhIH0sCi0gICAgeyAweDAwMDA5Yjc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlIH0sCi0gICAgeyAweDAwMDA5YjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyIH0sCi0gICAgeyAweDAwMDA5YjgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2IH0sCi0gICAgeyAweDAwMDA5Yjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhIH0sCi0gICAgeyAweDAwMDA5Yjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM3LCAweDAwMDBmZmM3LCAweDAwMDBmZmM3IH0sCi0gICAgeyAweDAwMDA5YjhjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiIH0sCi0gICAgeyAweDAwMDA5YjkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmIH0sCi0gICAgeyAweDAwMDA5Yjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzIH0sCi0gICAgeyAweDAwMDA5Yjk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3IH0sCi0gICAgeyAweDAwMDA5YjljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwIH0sCi0gICAgeyAweDAwMDBhYTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI0LCAweDAwMDBhMTI0LCAweDAwMDBhMTI0IH0sCi0gICAgeyAweDAwMDBhYTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI4LCAweDAwMDBhMTI4LCAweDAwMDBhMTI4IH0sCi0gICAgeyAweDAwMDBhYTBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjIH0sCi0gICAgeyAweDAwMDBhYTEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwIH0sCi0gICAgeyAweDAwMDBhYTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk0LCAweDAwMDBhMTk0LCAweDAwMDBhMTk0IH0sCi0gICAgeyAweDAwMDBhYTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk4LCAweDAwMDBhMTk4LCAweDAwMDBhMTk4IH0sCi0gICAgeyAweDAwMDBhYTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjIH0sCi0gICAgeyAweDAwMDBhYTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwIH0sCi0gICAgeyAweDAwMDBhYTI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg0LCAweDAwMDBhMjg0LCAweDAwMDBhMjg0IH0sCi0gICAgeyAweDAwMDBhYTI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg4LCAweDAwMDBhMjg4LCAweDAwMDBhMjg4IH0sCi0gICAgeyAweDAwMDBhYTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjIH0sCi0gICAgeyAweDAwMDBhYTMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwIH0sCi0gICAgeyAweDAwMDBhYTM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjk0LCAweDAwMDBhMjk0LCAweDAwMDBhMjk0IH0sCi0gICAgeyAweDAwMDBhYTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwIH0sCi0gICAgeyAweDAwMDBhYTNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE0LCAweDAwMDBhMmE0LCAweDAwMDBhMmE0IH0sCi0gICAgeyAweDAwMDBhYTQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE4LCAweDAwMDBhMmE4LCAweDAwMDBhMmE4IH0sCi0gICAgeyAweDAwMDBhYTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjIH0sCi0gICAgeyAweDAwMDBhYTQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwIH0sCi0gICAgeyAweDAwMDBhYTRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI0LCAweDAwMDBhMmI0LCAweDAwMDBhMmI0IH0sCi0gICAgeyAweDAwMDBhYTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI4LCAweDAwMDBhMmI4LCAweDAwMDBhMmI4IH0sCi0gICAgeyAweDAwMDBhYTU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmM0LCAweDAwMDBhMmM0LCAweDAwMDBhMmM0IH0sCi0gICAgeyAweDAwMDBhYTU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzA4LCAweDAwMDBhNzA4LCAweDAwMDBhNzA4IH0sCi0gICAgeyAweDAwMDBhYTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjIH0sCi0gICAgeyAweDAwMDBhYTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwIH0sCi0gICAgeyAweDAwMDBhYTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA0LCAweDAwMDBhYjA0LCAweDAwMDBhYjA0IH0sCi0gICAgeyAweDAwMDBhYTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA4LCAweDAwMDBhYjA4LCAweDAwMDBhYjA4IH0sCi0gICAgeyAweDAwMDBhYTZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjIH0sCi0gICAgeyAweDAwMDBhYTcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwIH0sCi0gICAgeyAweDAwMDBhYTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE0LCAweDAwMDBhYjE0LCAweDAwMDBhYjE0IH0sCi0gICAgeyAweDAwMDBhYTc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE4LCAweDAwMDBhYjE4LCAweDAwMDBhYjE4IH0sCi0gICAgeyAweDAwMDBhYTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjIH0sCi0gICAgeyAweDAwMDBhYTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwIH0sCi0gICAgeyAweDAwMDBhYTg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk0LCAweDAwMDBhYjk0LCAweDAwMDBhYjk0IH0sCi0gICAgeyAweDAwMDBhYTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk4LCAweDAwMDBhYjk4LCAweDAwMDBhYjk4IH0sCi0gICAgeyAweDAwMDBhYThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE0LCAweDAwMDBhYmE0LCAweDAwMDBhYmE0IH0sCi0gICAgeyAweDAwMDBhYTkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE4LCAweDAwMDBhYmE4LCAweDAwMDBhYmE4IH0sCi0gICAgeyAweDAwMDBhYTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA0LCAweDAwMDBjYjA0LCAweDAwMDBjYjA0IH0sCi0gICAgeyAweDAwMDBhYTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA4LCAweDAwMDBjYjA4LCAweDAwMDBjYjA4IH0sCi0gICAgeyAweDAwMDBhYTljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjIH0sCi0gICAgeyAweDAwMDBhYWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwIH0sCi0gICAgeyAweDAwMDBhYWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE0LCAweDAwMDBjYjE0LCAweDAwMDBjYjE0IH0sCi0gICAgeyAweDAwMDBhYWE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE4LCAweDAwMDBjYjE4LCAweDAwMDBjYjE4IH0sCi0gICAgeyAweDAwMDBhYWFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjIH0sCi0gICAgeyAweDAwMDBhYWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwIH0sCi0gICAgeyAweDAwMDBhYWI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjE4LCAweDAwMDBjZjE4LCAweDAwMDBjZjE4IH0sCi0gICAgeyAweDAwMDBhYWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI0LCAweDAwMDBjZjI0LCAweDAwMDBjZjI0IH0sCi0gICAgeyAweDAwMDBhYWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI4LCAweDAwMDBjZjI4LCAweDAwMDBjZjI4IH0sCi0gICAgeyAweDAwMDBhYWMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE0LCAweDAwMDBkMzE0LCAweDAwMDBkMzE0IH0sCi0gICAgeyAweDAwMDBhYWM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE4LCAweDAwMDBkMzE4LCAweDAwMDBkMzE4IH0sCi0gICAgeyAweDAwMDBhYWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjIH0sCi0gICAgeyAweDAwMDBhYWNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwIH0sCi0gICAgeyAweDAwMDBhYWQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk0LCAweDAwMDBkMzk0LCAweDAwMDBkMzk0IH0sCi0gICAgeyAweDAwMDBhYWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk4LCAweDAwMDBkMzk4LCAweDAwMDBkMzk4IH0sCi0gICAgeyAweDAwMDBhYWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E0LCAweDAwMDBkM2E0LCAweDAwMDBkM2E0IH0sCi0gICAgeyAweDAwMDBhYWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E4LCAweDAwMDBkM2E4LCAweDAwMDBkM2E4IH0sCi0gICAgeyAweDAwMDBhYWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjIH0sCi0gICAgeyAweDAwMDBhYWU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwIH0sCi0gICAgeyAweDAwMDBhYWU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwIH0sCi0gICAgeyAweDAwMDBhYWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg0LCAweDAwMDBmMzg0LCAweDAwMDBmMzg0IH0sCi0gICAgeyAweDAwMDBhYWYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg4LCAweDAwMDBmMzg4LCAweDAwMDBmMzg4IH0sCi0gICAgeyAweDAwMDBhYWY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwIH0sCi0gICAgeyAweDAwMDBhYWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE0LCAweDAwMDBmNzE0LCAweDAwMDBmNzE0IH0sCi0gICAgeyAweDAwMDBhYWZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE4LCAweDAwMDBmNzE4LCAweDAwMDBmNzE4IH0sCi0gICAgeyAweDAwMDBhYjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwIH0sCi0gICAgeyAweDAwMDBhYjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE0LCAweDAwMDBmYjE0LCAweDAwMDBmYjE0IH0sCi0gICAgeyAweDAwMDBhYjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE4LCAweDAwMDBmYjE4LCAweDAwMDBmYjE4IH0sCi0gICAgeyAweDAwMDBhYjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjIH0sCi0gICAgeyAweDAwMDBhYjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwIH0sCi0gICAgeyAweDAwMDBhYjE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjk0LCAweDAwMDBmYjk0LCAweDAwMDBmYjk0IH0sCi0gICAgeyAweDAwMDBhYjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjIH0sCi0gICAgeyAweDAwMDBhYjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwIH0sCi0gICAgeyAweDAwMDBhYjIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjk0LCAweDAwMDBmZjk0LCAweDAwMDBmZjk0IH0sCi0gICAgeyAweDAwMDBhYjI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwIH0sCi0gICAgeyAweDAwMDBhYjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE0LCAweDAwMDBmZmE0LCAweDAwMDBmZmE0IH0sCi0gICAgeyAweDAwMDBhYjJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE4LCAweDAwMDBmZmE4LCAweDAwMDBmZmE4IH0sCi0gICAgeyAweDAwMDBhYjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjIH0sCi0gICAgeyAweDAwMDBhYjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwIH0sCi0gICAgeyAweDAwMDBhYjM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI0LCAweDAwMDBmZmI0LCAweDAwMDBmZmI0IH0sCi0gICAgeyAweDAwMDBhYjNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmExLCAweDAwMDBmZmExLCAweDAwMDBmZmExIH0sCi0gICAgeyAweDAwMDBhYjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE1LCAweDAwMDBmZmE1LCAweDAwMDBmZmE1IH0sCi0gICAgeyAweDAwMDBhYjQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE5LCAweDAwMDBmZmE5LCAweDAwMDBmZmE5IH0sCi0gICAgeyAweDAwMDBhYjQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkIH0sCi0gICAgeyAweDAwMDBhYjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxIH0sCi0gICAgeyAweDAwMDBhYjUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI1LCAweDAwMDBmZmI1LCAweDAwMDBmZmI1IH0sCi0gICAgeyAweDAwMDBhYjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI5LCAweDAwMDBmZmI5LCAweDAwMDBmZmI5IH0sCi0gICAgeyAweDAwMDBhYjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM1LCAweDAwMDBmZmM1LCAweDAwMDBmZmM1IH0sCi0gICAgeyAweDAwMDBhYjVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM5LCAweDAwMDBmZmM5LCAweDAwMDBmZmM5IH0sCi0gICAgeyAweDAwMDBhYjYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkIH0sCi0gICAgeyAweDAwMDBhYjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxIH0sCi0gICAgeyAweDAwMDBhYjY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1IH0sCi0gICAgeyAweDAwMDBhYjZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyIH0sCi0gICAgeyAweDAwMDBhYjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM2LCAweDAwMDBmZmM2LCAweDAwMDBmZmM2IH0sCi0gICAgeyAweDAwMDBhYjc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhIH0sCi0gICAgeyAweDAwMDBhYjc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlIH0sCi0gICAgeyAweDAwMDBhYjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyIH0sCi0gICAgeyAweDAwMDBhYjgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2IH0sCi0gICAgeyAweDAwMDBhYjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhIH0sCi0gICAgeyAweDAwMDBhYjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM3LCAweDAwMDBmZmM3LCAweDAwMDBmZmM3IH0sCi0gICAgeyAweDAwMDBhYjhjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiIH0sCi0gICAgeyAweDAwMDBhYjkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmIH0sCi0gICAgeyAweDAwMDBhYjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzIH0sCi0gICAgeyAweDAwMDBhYjk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3IH0sCi0gICAgeyAweDAwMDBhYjljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5ODQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAxMDY3LCAweDAwMDAxMDY3LCAweDAwMDAxMDY3IH0sCi0gICAgeyAweDAwMDBhODQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAxMDY3LCAweDAwMDAxMDY3LCAweDAwMDAxMDY3IH0sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTI4N1BjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg3XzFfMFtdWzJdID0gewotICAgIHsweDAwMDA0MDQwLCAgMHg5MjQ4ZmQwMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgyNDkyNDkyNCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhhODAwMDAxOSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxMzE2MDgyMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhlNTk4MDU2MCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhjMDFkY2ZmZCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxYWFhYmU0MSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhiZTEwNTU1NCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgwMDA0MzAwNyB9LAotICAgIHsweDAwMDA0MDQ0LCAgMHgwMDAwMDAwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkyODdQY2llUGh5X2Nsa3JlcV9vZmZfTDFfOTI4N18xXzBbXVsyXSA9IHsKLSAgICB7MHgwMDAwNDA0MCwgIDB4OTI0OGZkMDAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MjQ5MjQ5MjQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YTgwMDAwMTkgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MTMxNjA4MjAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4ZTU5ODA1NjAgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YzAxZGNmZmMgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MWFhYWJlNDEgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4YmUxMDU1NTQgfSwKLSAgICB7MHgwMDAwNDA0MCwgIDB4MDAwNDMwMDcgfSwKLSAgICB7MHgwMDAwNDA0NCwgIDB4MDAwMDAwMDAgfSwKLX07Ci0KLS8qIEFSOTI4NyBSZXZpc2lvbiAxMSAqLwotCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4N01vZGVzXzkyODdfMV8xW11bNl0gPSB7Ci0gICAgLyogQWRkcmVzcyAgICAgIDVHLUhUMjAgICAgIDVHLUhUNDAgICAgIDJHLUhUNDAgICAgIDJHLUhUMjAgICAgIFR1cmJvICAgKi8KLSAgICB7IDB4MDAwMDEwMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODAgfSwKLSAgICB7IDB4MDAwMDEwZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDgwMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTAgfSwKLSAgICB7IDB4MDAwMDgwMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTJlMDAwNTcsIDB4MTJlMDAwMmIsIDB4MDk4ODAwNGYgfSwKLSAgICB7IDB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTAgfSwKLSAgICB7IDB4MDAwMDgxZDAsIDB4MDAwMDMyMDAsIDB4MDAwMDMyMDAsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEgfSwKLSAgICB7IDB4MDAwMDgzMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDY4ODAsIDB4MDAwMDM0NDAsIDB4MDAwMDY4ODAgfSwKLSAgICB7IDB4MDAwMDk4MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDMgfSwKLSAgICB7IDB4MDAwMDk4MjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSwKLSAgICB7IDB4MDAwMDk4MjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEgfSwKLSAgICB7IDB4MDAwMDk4MzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MzgsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDk4NDAsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUgfSwKLSAgICB7IDB4MDAwMDk4NDQsIDB4MDM3MjAwMDAsIDB4MDM3MjAwMDAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAgfSwKLSAgICB7IDB4MDAwMDk4NTAsIDB4NjAwMDAwMDAsIDB4NjAwMDAwMDAsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZTIsIDB4NmM0MDAwZTIgfSwKLSAgICB7IDB4MDAwMDk4NTgsIDB4N2MwMDBkMDAsIDB4N2MwMDBkMDAsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUgfSwKLSAgICB7IDB4MDAwMDk4NWMsIDB4MzEwMDAwNWUsIDB4MzEwMDAwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWUsIDB4MzEzOTVkNWUgfSwKLSAgICB7IDB4MDAwMDk4NjAsIDB4MDAwNThkMDAsIDB4MDAwNThkMDAsIDB4MDAwNThkMjAsIDB4MDAwNThkMjAsIDB4MDAwNThkMTggfSwKLSAgICB7IDB4MDAwMDk4NjQsIDB4MDAwMDBlMDAsIDB4MDAwMDBlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAgfSwKLSAgICB7IDB4MDAwMDk4NjgsIDB4MDAwMDQwYzAsIDB4MDAwMDQwYzAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAgfSwKLSAgICB7IDB4MDAwMDk4NmMsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEgfSwKLSAgICB7IDB4MDAwMDk5MTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDAgfSwKLSAgICB7IDB4MDAwMDk5MTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTYgfSwKLSAgICB7IDB4MDAwMDk5MjQsIDB4ZDAwYThhMDEsIDB4ZDAwYThhMDEsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGQsIDB4ZDAwYThhMGQgfSwKLSAgICB7IDB4MDAwMDk5NDQsIDB4ZWZiYzAwMDAsIDB4ZWZiYzAwMDAsIDB4ZWZiYzEwMTAsIDB4ZWZiYzEwMTAsIDB4ZWZiYzEwMTAgfSwKLSAgICB7IDB4MDAwMDk5NjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMGE5NjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDk5NjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAgfSwKLSAgICB7IDB4MDAwMGM5NjgsIDB4MDAwMDAyMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UgfSwKLSAgICB7IDB4MDAwMDk5YjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMgfSwKLSAgICB7IDB4MDAwMDk5YmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAgfSwKLSAgICB7IDB4MDAwMDk5YzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQgfSwKLSAgICB7IDB4MDAwMGEyMDQsIDB4MDAwMDA0NDAsIDB4MDAwMDA0NDAsIDB4MDAwMDA0NDQsIDB4MDAwMDA0NDQsIDB4MDAwMDA0NDQgfSwKLSAgICB7IDB4MDAwMGEyMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGIyMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMWMsIDB4MTgwMzgwMGEsIDB4MTgwMzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEgfSwKLSAgICB7IDB4MDAwMGEyMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTgsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUgfSwKLSAgICB7IDB4MDAwMGEzZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTB9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4LCAweDAwMDAxMTgwfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDgwMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTB9LAorCXsweDAwMDA4MDFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDEyZTAwMDU3LCAweDEyZTAwMDJiLCAweDA5ODgwMDRmfSwKKwl7MHgwMDAwODEyMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgwMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMCwgMHgwOGYwNDgxMH0sCisJezB4MDAwMDgxZDAsIDB4MDAwMDMyMDAsIDB4MDAwMDMyMDAsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGEsIDB4MDAwMDMyMGF9LAorCXsweDAwMDA4MzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA2ODgwLCAweDAwMDAzNDQwLCAweDAwMDA2ODgwfSwKKwl7MHgwMDAwOTgwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDNjNCwgMHgwMDAwMDMwMCwgMHgwMDAwMDMwM30sCisJezB4MDAwMDk4MjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDB9LAorCXsweDAwMDA5ODI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlfSwKKwl7MHgwMDAwOTgyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYTAyMDAwMSwgMHgzYTAyMDAwMSwgMHgzYTAyMDAwMX0sCisJezB4MDAwMDk4MzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGV9LAorCXsweDAwMDA5ODM4LCAweDAwMDAwMDAzLCAweDAwMDAwMDAzLCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3fSwKKwl7MHgwMDAwOTg0MCwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZX0sCisJezB4MDAwMDk4NDQsIDB4MDM3MjAwMDAsIDB4MDM3MjAwMDAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTB9LAorCXsweDAwMDA5ODUwLCAweDYwMDAwMDAwLCAweDYwMDAwMDAwLCAweDZkNDAwMGUyLCAweDZjNDAwMGUyLCAweDZjNDAwMGUyfSwKKwl7MHgwMDAwOTg1OCwgMHg3YzAwMGQwMCwgMHg3YzAwMGQwMCwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCisJezB4MDAwMDk4NWMsIDB4MzEwMDAwNWUsIDB4MzEwMDAwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWUsIDB4MzEzOTVkNWV9LAorCXsweDAwMDA5ODYwLCAweDAwMDU4ZDAwLCAweDAwMDU4ZDAwLCAweDAwMDU4ZDIwLCAweDAwMDU4ZDIwLCAweDAwMDU4ZDE4fSwKKwl7MHgwMDAwOTg2NCwgMHgwMDAwMGUwMCwgMHgwMDAwMGUwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMH0sCisJezB4MDAwMDk4NjgsIDB4MDAwMDQwYzAsIDB4MDAwMDQwYzAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAorCXsweDAwMDA5ODZjLCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKKwl7MHgwMDAwOTkxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OCwgMHgwMDAwMDdkMH0sCisJezB4MDAwMDk5MTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTZ9LAorCXsweDAwMDA5OTI0LCAweGQwMGE4YTAxLCAweGQwMGE4YTAxLCAweGQwMGE4YTBkLCAweGQwMGE4YTBkLCAweGQwMGE4YTBkfSwKKwl7MHgwMDAwOTk0NCwgMHhlZmJjMDAwMCwgMHhlZmJjMDAwMCwgMHhlZmJjMTAxMCwgMHhlZmJjMTAxMCwgMHhlZmJjMTAxMH0sCisJezB4MDAwMDk5NjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTB9LAorCXsweDAwMDBhOTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwOTk2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDIxMH0sCisJezB4MDAwMGM5NjgsIDB4MDAwMDAyMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2V9LAorCXsweDAwMDA5OWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjfSwKKwl7MHgwMDAwOTliYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMH0sCisJezB4MDAwMDk5YzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDR9LAorCXsweDAwMDBhMjA0LCAweDAwMDAwNDQwLCAweDAwMDAwNDQwLCAweDAwMDAwNDQ0LCAweDAwMDAwNDQ0LCAweDAwMDAwNDQ0fSwKKwl7MHgwMDAwYTIwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjFjLCAweDE4MDM4MDBhLCAweDE4MDM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhfSwKKwl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDB9LAorCXsweDAwMDBhMzU4LCAweDc5OTlhYTAyLCAweDc5OTlhYTAyLCAweDc5OTlhYTBlLCAweDc5OTlhYTBlLCAweDc5OTlhYTBlfSwKKwl7MHgwMDAwYTNkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4N0NvbW1vbl85Mjg3XzFfMVtdWzJdID0gewotICAgIHsgMHgwMDAwMDAwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDAzMCwgMHgwMDAyMDAxNSB9LAotICAgIHsgMHgwMDAwMDAzNCwgMHgwMDAwMDAwNSB9LAotICAgIHsgMHgwMDAwMDA0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDA0NCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwMDA0OCwgMHgwMDAwMDAwOCB9LAotICAgIHsgMHgwMDAwMDA0YywgMHgwMDAwMDAxMCB9LAotICAgIHsgMHgwMDAwMDA1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDA1NCwgMHgwMDAwMDAxZiB9LAotICAgIHsgMHgwMDAwMDgwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMDgyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA0MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0OCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA0YywgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1OCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA1YywgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA2MCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTA2NCwgMHgwMDJmZmMwZiB9LAotICAgIHsgMHgwMDAwMTIzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTAzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTEzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTE3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTIzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTMzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTM3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQ3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTRiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTRmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTUzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTU3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTViOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTVmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTYzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTY3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTZiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTZmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTczOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTc3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTdiOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTdmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTAzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTA3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTBmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTEzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTE3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTFmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTIzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTI3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTJmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTMzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTM3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNiYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTNmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwMTQ3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNDAzMCwgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNDAzYywgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNDAyNCwgMHgwMDAwMDAxZiB9LAotICAgIHsgMHgwMDAwNDA2MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNDA2NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzAxMCwgMHgwMDAwMDAzMyB9LAotICAgIHsgMHgwMDAwNzAyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzAzNCwgMHgwMDAwMDAwMiB9LAotICAgIHsgMHgwMDAwNzAzOCwgMHgwMDAwMDRjMiB9LAotICAgIHsgMHgwMDAwODAwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAxOCwgMHgwMDAwMDcwMCB9LAotICAgIHsgMHgwMDAwODAyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODAzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA0OCwgMHg0MDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA1YywgMHgwMDBmYzc4ZiB9LAotICAgIHsgMHgwMDAwODA2MCwgMHgwMDAwMDAwZiB9LAotICAgIHsgMHgwMDAwODA2NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODA3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBjMCwgMHgyYTgwMDAxYSB9LAotICAgIHsgMHgwMDAwODBjNCwgMHgwNWRjMDFlMCB9LAotICAgIHsgMHgwMDAwODBjOCwgMHgxZjQwMjcxMCB9LAotICAgIHsgMHgwMDAwODBjYywgMHgwMWY0MDAwMCB9LAotICAgIHsgMHgwMDAwODBkMCwgMHgwMDAwMWUwMCB9LAotICAgIHsgMHgwMDAwODBkNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBkOCwgMHgwMDQwMDAwMCB9LAotICAgIHsgMHgwMDAwODBlMCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODBlNCwgMHgwMDAwZmZmZiB9LAotICAgIHsgMHgwMDAwODBlOCwgMHgwMDNmM2YzZiB9LAotICAgIHsgMHgwMDAwODBlYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODBmYywgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwODEwMCwgMHgwMDAyMDAwMCB9LAotICAgIHsgMHgwMDAwODEwNCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwODEwOCwgMHgwMDAwMDA1MiB9LAotICAgIHsgMHgwMDAwODEwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODExMCwgMHgwMDAwMDE2OCB9LAotICAgIHsgMHgwMDAwODExOCwgMHgwMDAxMDBhYSB9LAotICAgIHsgMHgwMDAwODExYywgMHgwMDAwMzIxMCB9LAotICAgIHsgMHgwMDAwODEyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODEzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE0NCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODE2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE2YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODE3MCwgMHgxODQ4NzMyMCB9LAotICAgIHsgMHgwMDAwODE3NCwgMHhmYWE0ZmE1MCB9LAotICAgIHsgMHgwMDAwODE3OCwgMHgwMDAwMDEwMCB9LAotICAgIHsgMHgwMDAwODE3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFjMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFjNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFkNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFlYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODFmYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIyYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODIzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI0MCwgMHgwMDEwMDAwMCB9LAotICAgIHsgMHgwMDAwODI0NCwgMHgwMDEwZjQwMCB9LAotICAgIHsgMHgwMDAwODI0OCwgMHgwMDAwMDEwMCB9LAotICAgIHsgMHgwMDAwODI0YywgMHgwMDAxZTgwMCB9LAotICAgIHsgMHgwMDAwODI1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI1YywgMHg0MDAwMDBmZiB9LAotICAgIHsgMHgwMDAwODI2MCwgMHgwMDA4MDkyMiB9LAotICAgIHsgMHgwMDAwODI2NCwgMHg4OGEwMDAxMCB9LAotICAgIHsgMHgwMDAwODI3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI3NCwgMHg0MDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI3OCwgMHgwMDNlNDE4MCB9LAotICAgIHsgMHgwMDAwODI3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI4NCwgMHgwMDAwMDAyYyB9LAotICAgIHsgMHgwMDAwODI4OCwgMHgwMDAwMDAyYyB9LAotICAgIHsgMHgwMDAwODI4YywgMHgwMDAwMDBmZiB9LAotICAgIHsgMHgwMDAwODI5NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODI5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMwMCwgMHgwMDAwMDA0MCB9LAotICAgIHsgMHgwMDAwODMxNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMyOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODMyYywgMHgwMDAwMDAwNyB9LAotICAgIHsgMHgwMDAwODMzMCwgMHgwMDAwMDMwMiB9LAotICAgIHsgMHgwMDAwODMzNCwgMHgwMDAwMGUwMCB9LAotICAgIHsgMHgwMDAwODMzOCwgMHgwMGZmMDAwMCB9LAotICAgIHsgMHgwMDAwODMzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM0MCwgMHgwMDAxMDdmZiB9LAotICAgIHsgMHgwMDAwODM0NCwgMHgwMWM4MTA0MyB9LAotICAgIHsgMHgwMDAwODM2MCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODM2NCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODM2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM3MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM3NCwgMHgwMDAwMDBmZiB9LAotICAgIHsgMHgwMDAwODM3OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM4MCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODM4NCwgMHhmZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODM5MCwgMHgwZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODM5NCwgMHgwZmZmZmZmZiB9LAotICAgIHsgMHgwMDAwODM5OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODM5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwODNhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgwYywgMHhhZmU2OGUzMCB9LAotICAgIHsgMHgwMDAwOTgxMCwgMHhmZDE0ZTAwMCB9LAotICAgIHsgMHgwMDAwOTgxNCwgMHg5YzBhOWY2YiB9LAotICAgIHsgMHgwMDAwOTgxYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgyYywgMHgwMDAwYTAwMCB9LAotICAgIHsgMHgwMDAwOTgzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTgzYywgMHgwMDIwMDQwMCB9LAotICAgIHsgMHgwMDAwOTg0YywgMHgwMDQwMjMzYyB9LAotICAgIHsgMHgwMDAwYTg0YywgMHgwMDQwMjMzYyB9LAotICAgIHsgMHgwMDAwOTg1NCwgMHgwMDAwMDA0NCB9LAotICAgIHsgMHgwMDAwOTkwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkwYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkxMCwgMHgxMDAwMjMxMCB9LAotICAgIHsgMHgwMDAwOTkxYywgMHgxMDAwMGZmZiB9LAotICAgIHsgMHgwMDAwOTkyMCwgMHgwNDkwMDAwMCB9LAotICAgIHsgMHgwMDAwYTkyMCwgMHgwNDkwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkyOCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTkyYywgMHgwMDAwMDAwNCB9LAotICAgIHsgMHgwMDAwOTkzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTkzMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTkzNCwgMHgxZTFmMjAyMiB9LAotICAgIHsgMHgwMDAwOTkzOCwgMHgwYTBiMGMwZCB9LAotICAgIHsgMHgwMDAwOTkzYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk0OCwgMHg5MjgwYzAwYSB9LAotICAgIHsgMHgwMDAwOTk0YywgMHgwMDAyMDAyOCB9LAotICAgIHsgMHgwMDAwOTk1NCwgMHg1ZjNjYTNkZSB9LAotICAgIHsgMHgwMDAwOTk1OCwgMHgwMTA4ZWNmZiB9LAotICAgIHsgMHgwMDAwOTk0MCwgMHgxNDc1MDYwNCB9LAotICAgIHsgMHgwMDAwYzk1YywgMHgwMDRiNmE4ZSB9LAotICAgIHsgMHgwMDAwOTk3MCwgMHg5OTBiYjUxNCB9LAotICAgIHsgMHgwMDAwOTk3NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTk3OCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTk3YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlhMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlhNCwgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwOTlhOCwgMHgyMDFmZmYwMCB9LAotICAgIHsgMHgwMDAwOTlhYywgMHgwYzZmMDAwMCB9LAotICAgIHsgMHgwMDAwOTliMCwgMHgwMzA1MTAwMCB9LAotICAgIHsgMHgwMDAwOTliNCwgMHgwMDAwMDgyMCB9LAotICAgIHsgMHgwMDAwOTljNCwgMHgwNjMzNmY3NyB9LAotICAgIHsgMHgwMDAwOTljOCwgMHg2YWY2NTMyZiB9LAotICAgIHsgMHgwMDAwOTljYywgMHgwOGYxODZjOCB9LAotICAgIHsgMHgwMDAwOTlkMCwgMHgwMDA0NjM4NCB9LAotICAgIHsgMHgwMDAwOTlkYywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTllMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTllNCwgMHhhYWFhYWFhYSB9LAotICAgIHsgMHgwMDAwOTllOCwgMHgzYzQ2NjQ3OCB9LAotICAgIHsgMHgwMDAwOTllYywgMHgwY2M4MGNhYSB9LAotICAgIHsgMHgwMDAwOTlmMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwOTlmYywgMHgwMDAwMTA0MiB9LAotICAgIHsgMHgwMDAwYTIwOCwgMHg4MDNlNDc4OCB9LAotICAgIHsgMHgwMDAwYTIxMCwgMHg0MDgwYTMzMyB9LAotICAgIHsgMHgwMDAwYTIxNCwgMHg0MDIwNmMxMCB9LAotICAgIHsgMHgwMDAwYTIxOCwgMHgwMDljNDA2MCB9LAotICAgIHsgMHgwMDAwYTIyMCwgMHgwMTgzNDA2MSB9LAotICAgIHsgMHgwMDAwYTIyNCwgMHgwMDAwMDQwMCB9LAotICAgIHsgMHgwMDAwYTIyOCwgMHgwMDAwMDNiNSB9LAotICAgIHsgMHgwMDAwYTIyYywgMHgyMzNmNzE4MCB9LAotICAgIHsgMHgwMDAwYTIzNCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTIzOCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTIzYywgMHgxM2M4ODlhZiB9LAotICAgIHsgMHgwMDAwYTI0MCwgMHgzODQ5MGEyMCB9LAotICAgIHsgMHgwMDAwYTI0NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI0OCwgMHhmZmZmZmZmYyB9LAotICAgIHsgMHgwMDAwYTI0YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1NCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI1OCwgMHgwY2RiZDM4MCB9LAotICAgIHsgMHgwMDAwYTI1YywgMHgwZjBmMGYwMSB9LAotICAgIHsgMHgwMDAwYTI2MCwgMHhkZmE5MWYwMSB9LAotICAgIHsgMHgwMDAwYTI2NCwgMHgwMDQxOGExMSB9LAotICAgIHsgMHgwMDAwYjI2NCwgMHgwMDQxOGExMSB9LAotICAgIHsgMHgwMDAwYTI2OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTI2YywgMHgwZTc5ZTVjNiB9LAotICAgIHsgMHgwMDAwYjI2YywgMHgwZTc5ZTVjNiB9LAotICAgIHsgMHgwMDAwZDI3MCwgMHgwMDgyMDgyMCB9LAotICAgIHsgMHgwMDAwYTI3OCwgMHgxY2U3MzljZSB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTA3MDFjZSB9LAotICAgIHsgMHgwMDAwZDM1YywgMHgwN2ZmZmZlZiB9LAotICAgIHsgMHgwMDAwZDM2MCwgMHgwZmZmZmZlNyB9LAotICAgIHsgMHgwMDAwZDM2NCwgMHgxN2ZmZmZlNSB9LAotICAgIHsgMHgwMDAwZDM2OCwgMHgxZmZmZmZlNCB9LAotICAgIHsgMHgwMDAwZDM2YywgMHgzN2ZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3MCwgMHgzZmZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3NCwgMHg1N2ZmZmZlMyB9LAotICAgIHsgMHgwMDAwZDM3OCwgMHg1ZmZmZmZlMiB9LAotICAgIHsgMHgwMDAwZDM3YywgMHg3ZmZmZmZlMiB9LAotICAgIHsgMHgwMDAwZDM4MCwgMHg3ZjNjN2JiYSB9LAotICAgIHsgMHgwMDAwZDM4NCwgMHhmMzMwN2ZmMCB9LAotICAgIHsgMHgwMDAwYTM4OCwgMHgwYzAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM4YywgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTM5MCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTM5NCwgMHgxY2U3MzljZSB9LAotICAgIHsgMHgwMDAwYTM5OCwgMHgwMDAwMDFjZSB9LAotICAgIHsgMHgwMDAwYjM5OCwgMHgwMDAwMDFjZSB9LAotICAgIHsgMHgwMDAwYTM5YywgMHgwMDAwMDAwMSB9LAotICAgIHsgMHgwMDAwYTNjOCwgMHgwMDAwMDI0NiB9LAotICAgIHsgMHgwMDAwYTNjYywgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkMCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkNCwgMHgyMDIwMjAyMCB9LAotICAgIHsgMHgwMDAwYTNkYywgMHgxY2U3MzljZSB9LAotICAgIHsgMHgwMDAwYTNlMCwgMHgwMDAwMDFjZSB9LAotICAgIHsgMHgwMDAwYTNlNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTNlOCwgMHgxOGM0MzQzMyB9LAotICAgIHsgMHgwMDAwYTNlYywgMHgwMGY3MDA4MSB9LAotICAgIHsgMHgwMDAwYTNmMCwgMHgwMTAzNmExZSB9LAotICAgIHsgMHgwMDAwYTNmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYjNmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTdkOCwgMHgwMDAwMDNmMSB9LAotICAgIHsgMHgwMDAwNzgwMCwgMHgwMDAwMDgwMCB9LAotICAgIHsgMHgwMDAwNzgwNCwgMHg2YzM1ZmZkMiB9LAotICAgIHsgMHgwMDAwNzgwOCwgMHg2ZGI2YzAwMCB9LAotICAgIHsgMHgwMDAwNzgwYywgMHg2ZGI2Y2IzMCB9LAotICAgIHsgMHgwMDAwNzgxMCwgMHg2ZGI2Y2I2YyB9LAotICAgIHsgMHgwMDAwNzgxNCwgMHgwNTAxZTIwMCB9LAotICAgIHsgMHgwMDAwNzgxOCwgMHgwMDk0MTI4ZCB9LAotICAgIHsgMHgwMDAwNzgxYywgMHg5NzZlZTM5MiB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHhmNzVmZjZmYyB9LAotICAgIHsgMHgwMDAwNzgyNCwgMHgwMDA0MDAwMCB9LAotICAgIHsgMHgwMDAwNzgyOCwgMHhkYjAwMzAxMiB9LAotICAgIHsgMHgwMDAwNzgyYywgMHgwNDkyNDkxNCB9LAotICAgIHsgMHgwMDAwNzgzMCwgMHgyMTA4NDIxMCB9LAotICAgIHsgMHgwMDAwNzgzNCwgMHgwMDE0MDAwMCB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHgwZTQ1NDhkOCB9LAotICAgIHsgMHgwMDAwNzgzYywgMHg1NDIxNDUxNCB9LAotICAgIHsgMHgwMDAwNzg0MCwgMHgwMjAyNTgzMCB9LAotICAgIHsgMHgwMDAwNzg0NCwgMHg3MWMwZDM4OCB9LAotICAgIHsgMHgwMDAwNzg0OCwgMHg5MzQ5MzRhOCB9LAotICAgIHsgMHgwMDAwNzg1MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzg1NCwgMHgwMDAwMDgwMCB9LAotICAgIHsgMHgwMDAwNzg1OCwgMHg2YzM1ZmZkMiB9LAotICAgIHsgMHgwMDAwNzg1YywgMHg2ZGI2YzAwMCB9LAotICAgIHsgMHgwMDAwNzg2MCwgMHg2ZGI2Y2IzMCB9LAotICAgIHsgMHgwMDAwNzg2NCwgMHg2ZGI2Y2I2YyB9LAotICAgIHsgMHgwMDAwNzg2OCwgMHgwNTAxZTIwMCB9LAotICAgIHsgMHgwMDAwNzg2YywgMHgwMDk0MTI4ZCB9LAotICAgIHsgMHgwMDAwNzg3MCwgMHg5NzZlZTM5MiB9LAotICAgIHsgMHgwMDAwNzg3NCwgMHhmNzVmZjZmYyB9LAotICAgIHsgMHgwMDAwNzg3OCwgMHgwMDA0MDAwMCB9LAotICAgIHsgMHgwMDAwNzg3YywgMHhkYjAwMzAxMiB9LAotICAgIHsgMHgwMDAwNzg4MCwgMHgwNDkyNDkxNCB9LAotICAgIHsgMHgwMDAwNzg4NCwgMHgyMTA4NDIxMCB9LAotICAgIHsgMHgwMDAwNzg4OCwgMHgwMDFiNmRiMCB9LAotICAgIHsgMHgwMDAwNzg4YywgMHgwMDM3NmI2MyB9LAotICAgIHsgMHgwMDAwNzg5MCwgMHgwNmRiNmRiNiB9LAotICAgIHsgMHgwMDAwNzg5NCwgMHgwMDZkODAwMCB9LAotICAgIHsgMHgwMDAwNzg5OCwgMHg0ODEwMDAwMCB9LAotICAgIHsgMHgwMDAwNzg5YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzhhMCwgMHgwODAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzhhNCwgMHgwMDA3ZmZkOCB9LAotICAgIHsgMHgwMDAwNzhhOCwgMHgwMDA3ZmZkOCB9LAotICAgIHsgMHgwMDAwNzhhYywgMHgwMDFjMDAyMCB9LAotICAgIHsgMHgwMDAwNzhiMCwgMHgwMDA2MGFlYiB9LAotICAgIHsgMHgwMDAwNzhiNCwgMHg0MDAwODA4MCB9LAotICAgIHsgMHgwMDAwNzhiOCwgMHgyYTg1MDE2MCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwMDAwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwMzAsIDB4MDAwMjAwMTV9LAorCXsweDAwMDAwMDM0LCAweDAwMDAwMDA1fSwKKwl7MHgwMDAwMDA0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNDQsIDB4MDAwMDAwMDh9LAorCXsweDAwMDAwMDQ4LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0YywgMHgwMDAwMDAxMH0sCisJezB4MDAwMDAwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDU0LCAweDAwMDAwMDFmfSwKKwl7MHgwMDAwMDgwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwNDAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDQ0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0OCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNGMsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDUwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDVjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA2MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMjMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTI3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTE3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTIzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQ3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNGY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTUzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTVmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNjc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTZiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNzM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTc3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxN2Y4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTI3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTMzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0M2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNDAzMCwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDQwM2MsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA0MDI0LCAweDAwMDAwMDFmfSwKKwl7MHgwMDAwNDA2MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDQwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA3MDEwLCAweDAwMDAwMDMzfSwKKwl7MHgwMDAwNzAyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDcwMzQsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAxOCwgMHgwMDAwMDcwMH0sCisJezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4NDAwMDAwMDB9LAorCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAorCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGMwLCAweDJhODAwMDFhfSwKKwl7MHgwMDAwODBjNCwgMHgwNWRjMDFlMH0sCisJezB4MDAwMDgwYzgsIDB4MWY0MDI3MTB9LAorCXsweDAwMDA4MGNjLCAweDAxZjQwMDAwfSwKKwl7MHgwMDAwODBkMCwgMHgwMDAwMWUwMH0sCisJezB4MDAwMDgwZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGQ4LCAweDAwNDAwMDAwfSwKKwl7MHgwMDAwODBlMCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgwZTQsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MGU4LCAweDAwM2YzZjNmfSwKKwl7MHgwMDAwODBlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZmMsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTAwLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDgxMDgsIDB4MDAwMDAwNTJ9LAorCXsweDAwMDA4MTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExMCwgMHgwMDAwMDE2OH0sCisJezB4MDAwMDgxMTgsIDB4MDAwMTAwYWF9LAorCXsweDAwMDA4MTFjLCAweDAwMDAzMjEwfSwKKwl7MHgwMDAwODEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNDQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MTY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNzAsIDB4MTg0ODczMjB9LAorCXsweDAwMDA4MTc0LCAweGZhYTRmYTUwfSwKKwl7MHgwMDAwODE3OCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDgxN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjQwLCAweDAwMTAwMDAwfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQwMH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDAxMDB9LAorCXsweDAwMDA4MjRjLCAweDAwMDFlODAwfSwKKwl7MHgwMDAwODI1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1YywgMHg0MDAwMDBmZn0sCisJezB4MDAwMDgyNjAsIDB4MDAwODA5MjJ9LAorCXsweDAwMDA4MjY0LCAweDg4YTAwMDEwfSwKKwl7MHgwMDAwODI3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNzQsIDB4NDAwMDAwMDB9LAorCXsweDAwMDA4Mjc4LCAweDAwM2U0MTgwfSwKKwl7MHgwMDAwODI3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyODQsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA4Mjg4LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4YywgMHgwMDAwMDBmZn0sCisJezB4MDAwMDgyOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMDAsIDB4MDAwMDAwNDB9LAorCXsweDAwMDA4MzE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMmMsIDB4MDAwMDAwMDd9LAorCXsweDAwMDA4MzMwLCAweDAwMDAwMzAyfSwKKwl7MHgwMDAwODMzNCwgMHgwMDAwMGUwMH0sCisJezB4MDAwMDgzMzgsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA4MzNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM0MCwgMHgwMDAxMDdmZn0sCisJezB4MDAwMDgzNDQsIDB4MDFjODEwNDN9LAorCXsweDAwMDA4MzYwLCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM2NCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3NCwgMHgwMDAwMDBmZn0sCisJezB4MDAwMDgzNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM4MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzODQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MzkwLCAweDBmZmZmZmZmfSwKKwl7MHgwMDAwODM5NCwgMHgwZmZmZmZmZn0sCisJezB4MDAwMDgzOTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODBjLCAweGFmZTY4ZTMwfSwKKwl7MHgwMDAwOTgxMCwgMHhmZDE0ZTAwMH0sCisJezB4MDAwMDk4MTQsIDB4OWMwYTlmNmJ9LAorCXsweDAwMDA5ODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgyYywgMHgwMDAwYTAwMH0sCisJezB4MDAwMDk4MzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODNjLCAweDAwMjAwNDAwfSwKKwl7MHgwMDAwOTg0YywgMHgwMDQwMjMzY30sCisJezB4MDAwMGE4NGMsIDB4MDA0MDIzM2N9LAorCXsweDAwMDA5ODU0LCAweDAwMDAwMDQ0fSwKKwl7MHgwMDAwOTkwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MTAsIDB4MTAwMDIzMTB9LAorCXsweDAwMDA5OTFjLCAweDEwMDAwZmZmfSwKKwl7MHgwMDAwOTkyMCwgMHgwNDkwMDAwMH0sCisJezB4MDAwMGE5MjAsIDB4MDQ5MDAwMDB9LAorCXsweDAwMDA5OTI4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTkyYywgMHgwMDAwMDAwNH0sCisJezB4MDAwMDk5MzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhOTMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkzNCwgMHgxZTFmMjAyMn0sCisJezB4MDAwMDk5MzgsIDB4MGEwYjBjMGR9LAorCXsweDAwMDA5OTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk0OCwgMHg5MjgwYzAwYX0sCisJezB4MDAwMDk5NGMsIDB4MDAwMjAwMjh9LAorCXsweDAwMDA5OTU0LCAweDVmM2NhM2RlfSwKKwl7MHgwMDAwOTk1OCwgMHgwMTA4ZWNmZn0sCisJezB4MDAwMDk5NDAsIDB4MTQ3NTA2MDR9LAorCXsweDAwMDBjOTVjLCAweDAwNGI2YThlfSwKKwl7MHgwMDAwOTk3MCwgMHg5OTBiYjUxNH0sCisJezB4MDAwMDk5NzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTc4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTk3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5YTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWE0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTlhOCwgMHgyMDFmZmYwMH0sCisJezB4MDAwMDk5YWMsIDB4MGM2ZjAwMDB9LAorCXsweDAwMDA5OWIwLCAweDAzMDUxMDAwfSwKKwl7MHgwMDAwOTliNCwgMHgwMDAwMDgyMH0sCisJezB4MDAwMDk5YzQsIDB4MDYzMzZmNzd9LAorCXsweDAwMDA5OWM4LCAweDZhZjY1MzJmfSwKKwl7MHgwMDAwOTljYywgMHgwOGYxODZjOH0sCisJezB4MDAwMDk5ZDAsIDB4MDAwNDYzODR9LAorCXsweDAwMDA5OWRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTllMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZTQsIDB4YWFhYWFhYWF9LAorCXsweDAwMDA5OWU4LCAweDNjNDY2NDc4fSwKKwl7MHgwMDAwOTllYywgMHgwY2M4MGNhYX0sCisJezB4MDAwMDk5ZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWZjLCAweDAwMDAxMDQyfSwKKwl7MHgwMDAwYTIwOCwgMHg4MDNlNDc4OH0sCisJezB4MDAwMGEyMTAsIDB4NDA4MGEzMzN9LAorCXsweDAwMDBhMjE0LCAweDQwMjA2YzEwfSwKKwl7MHgwMDAwYTIxOCwgMHgwMDljNDA2MH0sCisJezB4MDAwMGEyMjAsIDB4MDE4MzQwNjF9LAorCXsweDAwMDBhMjI0LCAweDAwMDAwNDAwfSwKKwl7MHgwMDAwYTIyOCwgMHgwMDAwMDNiNX0sCisJezB4MDAwMGEyMmMsIDB4MjMzZjcxODB9LAorCXsweDAwMDBhMjM0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTIzOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyM2MsIDB4MTNjODg5YWZ9LAorCXsweDAwMDBhMjQwLCAweDM4NDkwYTIwfSwKKwl7MHgwMDAwYTI0NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNDgsIDB4ZmZmZmZmZmN9LAorCXsweDAwMDBhMjRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNTgsIDB4MGNkYmQzODB9LAorCXsweDAwMDBhMjVjLCAweDBmMGYwZjAxfSwKKwl7MHgwMDAwYTI2MCwgMHhkZmE5MWYwMX0sCisJezB4MDAwMGEyNjQsIDB4MDA0MThhMTF9LAorCXsweDAwMDBiMjY0LCAweDAwNDE4YTExfSwKKwl7MHgwMDAwYTI2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNmMsIDB4MGU3OWU1YzZ9LAorCXsweDAwMDBiMjZjLCAweDBlNzllNWM2fSwKKwl7MHgwMDAwZDI3MCwgMHgwMDgyMDgyMH0sCisJezB4MDAwMGEyNzgsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhMjdjLCAweDA1MDcwMWNlfSwKKwl7MHgwMDAwZDM1YywgMHgwN2ZmZmZlZn0sCisJezB4MDAwMGQzNjAsIDB4MGZmZmZmZTd9LAorCXsweDAwMDBkMzY0LCAweDE3ZmZmZmU1fSwKKwl7MHgwMDAwZDM2OCwgMHgxZmZmZmZlNH0sCisJezB4MDAwMGQzNmMsIDB4MzdmZmZmZTN9LAorCXsweDAwMDBkMzcwLCAweDNmZmZmZmUzfSwKKwl7MHgwMDAwZDM3NCwgMHg1N2ZmZmZlM30sCisJezB4MDAwMGQzNzgsIDB4NWZmZmZmZTJ9LAorCXsweDAwMDBkMzdjLCAweDdmZmZmZmUyfSwKKwl7MHgwMDAwZDM4MCwgMHg3ZjNjN2JiYX0sCisJezB4MDAwMGQzODQsIDB4ZjMzMDdmZjB9LAorCXsweDAwMDBhMzg4LCAweDBjMDAwMDAwfSwKKwl7MHgwMDAwYTM4YywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzOTAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhMzk0LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTM5OCwgMHgwMDAwMDFjZX0sCisJezB4MDAwMGIzOTgsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhMzljLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTNjOCwgMHgwMDAwMDI0Nn0sCisJezB4MDAwMGEzY2MsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2QwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZGMsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhM2UwLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYTNlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzZTgsIDB4MThjNDM0MzN9LAorCXsweDAwMDBhM2VjLCAweDAwZjcwMDgxfSwKKwl7MHgwMDAwYTNmMCwgMHgwMTAzNmExZX0sCisJezB4MDAwMGEzZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiM2Y0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTdkOCwgMHgwMDAwMDNmMX0sCisJezB4MDAwMDc4MDAsIDB4MDAwMDA4MDB9LAorCXsweDAwMDA3ODA0LCAweDZjMzVmZmQyfSwKKwl7MHgwMDAwNzgwOCwgMHg2ZGI2YzAwMH0sCisJezB4MDAwMDc4MGMsIDB4NmRiNmNiMzB9LAorCXsweDAwMDA3ODEwLCAweDZkYjZjYjZjfSwKKwl7MHgwMDAwNzgxNCwgMHgwNTAxZTIwMH0sCisJezB4MDAwMDc4MTgsIDB4MDA5NDEyOGR9LAorCXsweDAwMDA3ODFjLCAweDk3NmVlMzkyfSwKKwl7MHgwMDAwNzgyMCwgMHhmNzVmZjZmY30sCisJezB4MDAwMDc4MjQsIDB4MDAwNDAwMDB9LAorCXsweDAwMDA3ODI4LCAweGRiMDAzMDEyfSwKKwl7MHgwMDAwNzgyYywgMHgwNDkyNDkxNH0sCisJezB4MDAwMDc4MzAsIDB4MjEwODQyMTB9LAorCXsweDAwMDA3ODM0LCAweDAwMTQwMDAwfSwKKwl7MHgwMDAwNzgzOCwgMHgwZTQ1NDhkOH0sCisJezB4MDAwMDc4M2MsIDB4NTQyMTQ1MTR9LAorCXsweDAwMDA3ODQwLCAweDAyMDI1ODMwfSwKKwl7MHgwMDAwNzg0NCwgMHg3MWMwZDM4OH0sCisJezB4MDAwMDc4NDgsIDB4OTM0OTM0YTh9LAorCXsweDAwMDA3ODUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzg1NCwgMHgwMDAwMDgwMH0sCisJezB4MDAwMDc4NTgsIDB4NmMzNWZmZDJ9LAorCXsweDAwMDA3ODVjLCAweDZkYjZjMDAwfSwKKwl7MHgwMDAwNzg2MCwgMHg2ZGI2Y2IzMH0sCisJezB4MDAwMDc4NjQsIDB4NmRiNmNiNmN9LAorCXsweDAwMDA3ODY4LCAweDA1MDFlMjAwfSwKKwl7MHgwMDAwNzg2YywgMHgwMDk0MTI4ZH0sCisJezB4MDAwMDc4NzAsIDB4OTc2ZWUzOTJ9LAorCXsweDAwMDA3ODc0LCAweGY3NWZmNmZjfSwKKwl7MHgwMDAwNzg3OCwgMHgwMDA0MDAwMH0sCisJezB4MDAwMDc4N2MsIDB4ZGIwMDMwMTJ9LAorCXsweDAwMDA3ODgwLCAweDA0OTI0OTE0fSwKKwl7MHgwMDAwNzg4NCwgMHgyMTA4NDIxMH0sCisJezB4MDAwMDc4ODgsIDB4MDAxYjZkYjB9LAorCXsweDAwMDA3ODhjLCAweDAwMzc2YjYzfSwKKwl7MHgwMDAwNzg5MCwgMHgwNmRiNmRiNn0sCisJezB4MDAwMDc4OTQsIDB4MDA2ZDgwMDB9LAorCXsweDAwMDA3ODk4LCAweDQ4MTAwMDAwfSwKKwl7MHgwMDAwNzg5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDc4YTAsIDB4MDgwMDAwMDB9LAorCXsweDAwMDA3OGE0LCAweDAwMDdmZmQ4fSwKKwl7MHgwMDAwNzhhOCwgMHgwMDA3ZmZkOH0sCisJezB4MDAwMDc4YWMsIDB4MDAxYzAwMjB9LAorCXsweDAwMDA3OGIwLCAweDAwMDYwYWVifSwKKwl7MHgwMDAwNzhiNCwgMHg0MDAwODA4MH0sCisJezB4MDAwMDc4YjgsIDB4MmE4NTAxNjB9LAogfTsKIAotLyoKLSAqIEZvciBKYXBhbmVzZSByZWd1bGF0b3J5IHJlcXVpcmVtZW50cywgMjQ4NCBNSHogcmVxdWlyZXMgdGhlIGZvbGxvd2luZyB0aHJlZQotICogcmVnaXN0ZXJzIGJlIHByb2dyYW1tZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUgY2hhbm5lbCBiZXR3ZWVuIDI0MTIgYW5kCi0gKiAyNDcyIE1Iei4KLSAqLwotc3RhdGljIGNvbnN0IHUzMiBhcjkyODdDb21tb25fbm9ybWFsX2Nja19maXJfY29lZmZfOTI4NzFfMVtdWzJdID0gewotICAgIHsgMHgwMDAwYTFmNCwgMHgwMGZmZmVmZiB9LAotICAgIHsgMHgwMDAwYTFmOCwgMHgwMGY1ZjlmZiB9LAotICAgIHsgMHgwMDAwYTFmYywgMHhiNzlmNjQyNyB9LAorc3RhdGljIGNvbnN0IHUzMiBhcjkyODdDb21tb25fbm9ybWFsX2Nja19maXJfY29lZmZfOTI4N18xXzFbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMGExZjQsIDB4MDBmZmZlZmZ9LAorCXsweDAwMDBhMWY4LCAweDAwZjVmOWZmfSwKKwl7MHgwMDAwYTFmYywgMHhiNzlmNjQyN30sCiB9OwogCi1zdGF0aWMgY29uc3QgdTMyIGFyOTI4N0NvbW1vbl9qYXBhbl8yNDg0X2Nja19maXJfY29lZmZfOTI4NzFfMVtdWzJdID0gewotICAgIHsgMHgwMDAwYTFmNCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTFmOCwgMHhlZmZmMDMwMSB9LAotICAgIHsgMHgwMDAwYTFmYywgMHhjYTkyMjhlZSB9LAorc3RhdGljIGNvbnN0IHUzMiBhcjkyODdDb21tb25famFwYW5fMjQ4NF9jY2tfZmlyX2NvZWZmXzkyODdfMV8xW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMWY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFmOCwgMHhlZmZmMDMwMX0sCisJezB4MDAwMGExZmMsIDB4Y2E5MjI4ZWV9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyODdNb2Rlc190eF9nYWluXzkyODdfMV8xW11bNl0gPSB7Ci0gICAgLyogQWRkcmVzcyAgICAgIDVHLUhUMjAgICAgIDVHLUhUNDAgICAgIDJHLUhUNDAgICAgIDJHLUhUMjAgICAgIFR1cmJvICAgKi8KLSAgICB7IDB4MDAwMGEzMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDQwMDIsIDB4MDAwMDQwMDIsIDB4MDAwMDQwMDIgfSwKLSAgICB7IDB4MDAwMGEzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgwMDQsIDB4MDAwMDgwMDQsIDB4MDAwMDgwMDQgfSwKLSAgICB7IDB4MDAwMGEzMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGMwMGEsIDB4MDAwMGMwMGEsIDB4MDAwMGMwMGEgfSwKLSAgICB7IDB4MDAwMGEzMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAwMGMsIDB4MDAwMTAwMGMsIDB4MDAwMTAwMGMgfSwKLSAgICB7IDB4MDAwMGEzMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTQyMGIsIDB4MDAwMTQyMGIsIDB4MDAwMTQyMGIgfSwKLSAgICB7IDB4MDAwMGEzMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTgyNGEsIDB4MDAwMTgyNGEsIDB4MDAwMTgyNGEgfSwKLSAgICB7IDB4MDAwMGEzMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMWM0NGEsIDB4MDAwMWM0NGEsIDB4MDAwMWM0NGEgfSwKLSAgICB7IDB4MDAwMGEzMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjA2NGEsIDB4MDAwMjA2NGEsIDB4MDAwMjA2NGEgfSwKLSAgICB7IDB4MDAwMGEzMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjQ4NGEsIDB4MDAwMjQ4NGEsIDB4MDAwMjQ4NGEgfSwKLSAgICB7IDB4MDAwMGEzMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjhhNGEsIDB4MDAwMjhhNGEsIDB4MDAwMjhhNGEgfSwKLSAgICB7IDB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmNjNGEsIDB4MDAwMmNjNGEsIDB4MDAwMmNjNGEgfSwKLSAgICB7IDB4MDAwMGEzMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzBlNGEsIDB4MDAwMzBlNGEsIDB4MDAwMzBlNGEgfSwKLSAgICB7IDB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzRlOGEsIDB4MDAwMzRlOGEsIDB4MDAwMzRlOGEgfSwKLSAgICB7IDB4MDAwMGEzMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzhlOGMsIDB4MDAwMzhlOGMsIDB4MDAwMzhlOGMgfSwKLSAgICB7IDB4MDAwMGEzM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwM2NlY2MsIDB4MDAwM2NlY2MsIDB4MDAwM2NlY2MgfSwKLSAgICB7IDB4MDAwMGEzNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDBlZDQsIDB4MDAwNDBlZDQsIDB4MDAwNDBlZDQgfSwKLSAgICB7IDB4MDAwMGEzNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDRlZGMsIDB4MDAwNDRlZGMsIDB4MDAwNDRlZGMgfSwKLSAgICB7IDB4MDAwMGEzNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDhlZGUsIDB4MDAwNDhlZGUsIDB4MDAwNDhlZGUgfSwKLSAgICB7IDB4MDAwMGEzNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNGNmMWUsIDB4MDAwNGNmMWUsIDB4MDAwNGNmMWUgfSwKLSAgICB7IDB4MDAwMGEzNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTBmNWUsIDB4MDAwNTBmNWUsIDB4MDAwNTBmNWUgfSwKLSAgICB7IDB4MDAwMGEzNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTRmOWUsIDB4MDAwNTRmOWUsIDB4MDAwNTRmOWUgfSwKLSAgICB7IDB4MDAwMGE3ODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNjIsIDB4MDAwMDAwNjIsIDB4MDAwMDAwNjIgfSwKLSAgICB7IDB4MDAwMGE3ODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDQwNjQsIDB4MDAwMDQwNjQsIDB4MDAwMDQwNjQgfSwKLSAgICB7IDB4MDAwMGE3ODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgwYTQsIDB4MDAwMDgwYTQsIDB4MDAwMDgwYTQgfSwKLSAgICB7IDB4MDAwMGE3OGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGMwYWEsIDB4MDAwMGMwYWEsIDB4MDAwMGMwYWEgfSwKLSAgICB7IDB4MDAwMGE3OTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAwYWMsIDB4MDAwMTAwYWMsIDB4MDAwMTAwYWMgfSwKLSAgICB7IDB4MDAwMGE3OTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTQwYjQsIDB4MDAwMTQwYjQsIDB4MDAwMTQwYjQgfSwKLSAgICB7IDB4MDAwMGE3OTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTgwZjQsIDB4MDAwMTgwZjQsIDB4MDAwMTgwZjQgfSwKLSAgICB7IDB4MDAwMGE3OWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMWMxMzQsIDB4MDAwMWMxMzQsIDB4MDAwMWMxMzQgfSwKLSAgICB7IDB4MDAwMGE3YTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjAxNzQsIDB4MDAwMjAxNzQsIDB4MDAwMjAxNzQgfSwKLSAgICB7IDB4MDAwMGE3YTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjQxN2MsIDB4MDAwMjQxN2MsIDB4MDAwMjQxN2MgfSwKLSAgICB7IDB4MDAwMGE3YTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjgxN2UsIDB4MDAwMjgxN2UsIDB4MDAwMjgxN2UgfSwKLSAgICB7IDB4MDAwMGE3YWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmMxYmUsIDB4MDAwMmMxYmUsIDB4MDAwMmMxYmUgfSwKLSAgICB7IDB4MDAwMGE3YjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3YjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3YjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3YmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3YzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3YzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3YzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3Y2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3ZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGE3ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUgfSwKLSAgICB7IDB4MDAwMGEyNzQsIDB4MGExODAwMDAsIDB4MGExODAwMDAsIDB4MGExYWEwMDAsIDB4MGExYWEwMDAsIDB4MGExYWEwMDAgfSwKKwl7MHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDQwMDIsIDB4MDAwMDQwMDIsIDB4MDAwMDQwMDJ9LAorCXsweDAwMDBhMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA4MDA0LCAweDAwMDA4MDA0LCAweDAwMDA4MDA0fSwKKwl7MHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYzAwYSwgMHgwMDAwYzAwYSwgMHgwMDAwYzAwYX0sCisJezB4MDAwMGEzMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAwMGMsIDB4MDAwMTAwMGMsIDB4MDAwMTAwMGN9LAorCXsweDAwMDBhMzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE0MjBiLCAweDAwMDE0MjBiLCAweDAwMDE0MjBifSwKKwl7MHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxODI0YSwgMHgwMDAxODI0YSwgMHgwMDAxODI0YX0sCisJezB4MDAwMGEzMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMWM0NGEsIDB4MDAwMWM0NGEsIDB4MDAwMWM0NGF9LAorCXsweDAwMDBhMzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIwNjRhLCAweDAwMDIwNjRhLCAweDAwMDIwNjRhfSwKKwl7MHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyNDg0YSwgMHgwMDAyNDg0YSwgMHgwMDAyNDg0YX0sCisJezB4MDAwMGEzMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjhhNGEsIDB4MDAwMjhhNGEsIDB4MDAwMjhhNGF9LAorCXsweDAwMDBhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJjYzRhLCAweDAwMDJjYzRhLCAweDAwMDJjYzRhfSwKKwl7MHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMGU0YSwgMHgwMDAzMGU0YSwgMHgwMDAzMGU0YX0sCisJezB4MDAwMGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzRlOGEsIDB4MDAwMzRlOGEsIDB4MDAwMzRlOGF9LAorCXsweDAwMDBhMzM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM4ZThjLCAweDAwMDM4ZThjLCAweDAwMDM4ZThjfSwKKwl7MHgwMDAwYTMzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzY2VjYywgMHgwMDAzY2VjYywgMHgwMDAzY2VjY30sCisJezB4MDAwMGEzNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDBlZDQsIDB4MDAwNDBlZDQsIDB4MDAwNDBlZDR9LAorCXsweDAwMDBhMzQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQ0ZWRjLCAweDAwMDQ0ZWRjLCAweDAwMDQ0ZWRjfSwKKwl7MHgwMDAwYTM0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0OGVkZSwgMHgwMDA0OGVkZSwgMHgwMDA0OGVkZX0sCisJezB4MDAwMGEzNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNGNmMWUsIDB4MDAwNGNmMWUsIDB4MDAwNGNmMWV9LAorCXsweDAwMDBhMzUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDUwZjVlLCAweDAwMDUwZjVlLCAweDAwMDUwZjVlfSwKKwl7MHgwMDAwYTM1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1NGY5ZSwgMHgwMDA1NGY5ZSwgMHgwMDA1NGY5ZX0sCisJezB4MDAwMGE3ODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNjIsIDB4MDAwMDAwNjIsIDB4MDAwMDAwNjJ9LAorCXsweDAwMDBhNzg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDA0MDY0LCAweDAwMDA0MDY0LCAweDAwMDA0MDY0fSwKKwl7MHgwMDAwYTc4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwODBhNCwgMHgwMDAwODBhNCwgMHgwMDAwODBhNH0sCisJezB4MDAwMGE3OGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGMwYWEsIDB4MDAwMGMwYWEsIDB4MDAwMGMwYWF9LAorCXsweDAwMDBhNzkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMGFjLCAweDAwMDEwMGFjLCAweDAwMDEwMGFjfSwKKwl7MHgwMDAwYTc5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxNDBiNCwgMHgwMDAxNDBiNCwgMHgwMDAxNDBiNH0sCisJezB4MDAwMGE3OTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTgwZjQsIDB4MDAwMTgwZjQsIDB4MDAwMTgwZjR9LAorCXsweDAwMDBhNzljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDFjMTM0LCAweDAwMDFjMTM0LCAweDAwMDFjMTM0fSwKKwl7MHgwMDAwYTdhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyMDE3NCwgMHgwMDAyMDE3NCwgMHgwMDAyMDE3NH0sCisJezB4MDAwMGE3YTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjQxN2MsIDB4MDAwMjQxN2MsIDB4MDAwMjQxN2N9LAorCXsweDAwMDBhN2E4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDI4MTdlLCAweDAwMDI4MTdlLCAweDAwMDI4MTdlfSwKKwl7MHgwMDAwYTdhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyYzFiZSwgMHgwMDAyYzFiZSwgMHgwMDAyYzFiZX0sCisJezB4MDAwMGE3YjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmV9LAorCXsweDAwMDBhN2I0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMwMWZlLCAweDAwMDMwMWZlLCAweDAwMDMwMWZlfSwKKwl7MHgwMDAwYTdiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMDFmZSwgMHgwMDAzMDFmZSwgMHgwMDAzMDFmZX0sCisJezB4MDAwMGE3YmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmV9LAorCXsweDAwMDBhN2MwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMwMWZlLCAweDAwMDMwMWZlLCAweDAwMDMwMWZlfSwKKwl7MHgwMDAwYTdjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMDFmZSwgMHgwMDAzMDFmZSwgMHgwMDAzMDFmZX0sCisJezB4MDAwMGE3YzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmV9LAorCXsweDAwMDBhN2NjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMwMWZlLCAweDAwMDMwMWZlLCAweDAwMDMwMWZlfSwKKwl7MHgwMDAwYTdkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMDFmZSwgMHgwMDAzMDFmZSwgMHgwMDAzMDFmZX0sCisJezB4MDAwMGE3ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmUsIDB4MDAwMzAxZmV9LAorCXsweDAwMDBhMjc0LCAweDBhMTgwMDAwLCAweDBhMTgwMDAwLCAweDBhMWFhMDAwLCAweDBhMWFhMDAwLCAweDBhMWFhMDAwfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5Mjg3TW9kZXNfcnhfZ2Fpbl85Mjg3XzFfMVtdWzZdID0gewotICAgIC8qIEFkZHJlc3MgICAgICA1Ry1IVDIwICAgICA1Ry1IVDQwICAgICAyRy1IVDQwICAgICAyRy1IVDIwICAgICBUdXJibyAgICovCi0gICAgeyAweDAwMDA5YTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwIH0sCi0gICAgeyAweDAwMDA5YTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI0LCAweDAwMDBhMTI0LCAweDAwMDBhMTI0IH0sCi0gICAgeyAweDAwMDA5YTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI4LCAweDAwMDBhMTI4LCAweDAwMDBhMTI4IH0sCi0gICAgeyAweDAwMDA5YTBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjIH0sCi0gICAgeyAweDAwMDA5YTEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwIH0sCi0gICAgeyAweDAwMDA5YTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk0LCAweDAwMDBhMTk0LCAweDAwMDBhMTk0IH0sCi0gICAgeyAweDAwMDA5YTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk4LCAweDAwMDBhMTk4LCAweDAwMDBhMTk4IH0sCi0gICAgeyAweDAwMDA5YTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjIH0sCi0gICAgeyAweDAwMDA5YTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwIH0sCi0gICAgeyAweDAwMDA5YTI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg0LCAweDAwMDBhMjg0LCAweDAwMDBhMjg0IH0sCi0gICAgeyAweDAwMDA5YTI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg4LCAweDAwMDBhMjg4LCAweDAwMDBhMjg4IH0sCi0gICAgeyAweDAwMDA5YTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjIH0sCi0gICAgeyAweDAwMDA5YTMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwIH0sCi0gICAgeyAweDAwMDA5YTM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjk0LCAweDAwMDBhMjk0LCAweDAwMDBhMjk0IH0sCi0gICAgeyAweDAwMDA5YTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwIH0sCi0gICAgeyAweDAwMDA5YTNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE0LCAweDAwMDBhMmE0LCAweDAwMDBhMmE0IH0sCi0gICAgeyAweDAwMDA5YTQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE4LCAweDAwMDBhMmE4LCAweDAwMDBhMmE4IH0sCi0gICAgeyAweDAwMDA5YTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjIH0sCi0gICAgeyAweDAwMDA5YTQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwIH0sCi0gICAgeyAweDAwMDA5YTRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI0LCAweDAwMDBhMmI0LCAweDAwMDBhMmI0IH0sCi0gICAgeyAweDAwMDA5YTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI4LCAweDAwMDBhMmI4LCAweDAwMDBhMmI4IH0sCi0gICAgeyAweDAwMDA5YTU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmM0LCAweDAwMDBhMmM0LCAweDAwMDBhMmM0IH0sCi0gICAgeyAweDAwMDA5YTU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzA4LCAweDAwMDBhNzA4LCAweDAwMDBhNzA4IH0sCi0gICAgeyAweDAwMDA5YTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjIH0sCi0gICAgeyAweDAwMDA5YTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwIH0sCi0gICAgeyAweDAwMDA5YTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA0LCAweDAwMDBhYjA0LCAweDAwMDBhYjA0IH0sCi0gICAgeyAweDAwMDA5YTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA4LCAweDAwMDBhYjA4LCAweDAwMDBhYjA4IH0sCi0gICAgeyAweDAwMDA5YTZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjIH0sCi0gICAgeyAweDAwMDA5YTcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwIH0sCi0gICAgeyAweDAwMDA5YTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE0LCAweDAwMDBhYjE0LCAweDAwMDBhYjE0IH0sCi0gICAgeyAweDAwMDA5YTc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE4LCAweDAwMDBhYjE4LCAweDAwMDBhYjE4IH0sCi0gICAgeyAweDAwMDA5YTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjIH0sCi0gICAgeyAweDAwMDA5YTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwIH0sCi0gICAgeyAweDAwMDA5YTg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk0LCAweDAwMDBhYjk0LCAweDAwMDBhYjk0IH0sCi0gICAgeyAweDAwMDA5YTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk4LCAweDAwMDBhYjk4LCAweDAwMDBhYjk4IH0sCi0gICAgeyAweDAwMDA5YThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE0LCAweDAwMDBhYmE0LCAweDAwMDBhYmE0IH0sCi0gICAgeyAweDAwMDA5YTkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE4LCAweDAwMDBhYmE4LCAweDAwMDBhYmE4IH0sCi0gICAgeyAweDAwMDA5YTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA0LCAweDAwMDBjYjA0LCAweDAwMDBjYjA0IH0sCi0gICAgeyAweDAwMDA5YTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA4LCAweDAwMDBjYjA4LCAweDAwMDBjYjA4IH0sCi0gICAgeyAweDAwMDA5YTljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjIH0sCi0gICAgeyAweDAwMDA5YWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwIH0sCi0gICAgeyAweDAwMDA5YWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE0LCAweDAwMDBjYjE0LCAweDAwMDBjYjE0IH0sCi0gICAgeyAweDAwMDA5YWE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE4LCAweDAwMDBjYjE4LCAweDAwMDBjYjE4IH0sCi0gICAgeyAweDAwMDA5YWFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjIH0sCi0gICAgeyAweDAwMDA5YWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwIH0sCi0gICAgeyAweDAwMDA5YWI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjE4LCAweDAwMDBjZjE4LCAweDAwMDBjZjE4IH0sCi0gICAgeyAweDAwMDA5YWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI0LCAweDAwMDBjZjI0LCAweDAwMDBjZjI0IH0sCi0gICAgeyAweDAwMDA5YWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI4LCAweDAwMDBjZjI4LCAweDAwMDBjZjI4IH0sCi0gICAgeyAweDAwMDA5YWMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE0LCAweDAwMDBkMzE0LCAweDAwMDBkMzE0IH0sCi0gICAgeyAweDAwMDA5YWM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE4LCAweDAwMDBkMzE4LCAweDAwMDBkMzE4IH0sCi0gICAgeyAweDAwMDA5YWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjIH0sCi0gICAgeyAweDAwMDA5YWNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwIH0sCi0gICAgeyAweDAwMDA5YWQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk0LCAweDAwMDBkMzk0LCAweDAwMDBkMzk0IH0sCi0gICAgeyAweDAwMDA5YWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk4LCAweDAwMDBkMzk4LCAweDAwMDBkMzk4IH0sCi0gICAgeyAweDAwMDA5YWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E0LCAweDAwMDBkM2E0LCAweDAwMDBkM2E0IH0sCi0gICAgeyAweDAwMDA5YWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E4LCAweDAwMDBkM2E4LCAweDAwMDBkM2E4IH0sCi0gICAgeyAweDAwMDA5YWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjIH0sCi0gICAgeyAweDAwMDA5YWU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwIH0sCi0gICAgeyAweDAwMDA5YWU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwIH0sCi0gICAgeyAweDAwMDA5YWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg0LCAweDAwMDBmMzg0LCAweDAwMDBmMzg0IH0sCi0gICAgeyAweDAwMDA5YWYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg4LCAweDAwMDBmMzg4LCAweDAwMDBmMzg4IH0sCi0gICAgeyAweDAwMDA5YWY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwIH0sCi0gICAgeyAweDAwMDA5YWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE0LCAweDAwMDBmNzE0LCAweDAwMDBmNzE0IH0sCi0gICAgeyAweDAwMDA5YWZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE4LCAweDAwMDBmNzE4LCAweDAwMDBmNzE4IH0sCi0gICAgeyAweDAwMDA5YjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwIH0sCi0gICAgeyAweDAwMDA5YjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE0LCAweDAwMDBmYjE0LCAweDAwMDBmYjE0IH0sCi0gICAgeyAweDAwMDA5YjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE4LCAweDAwMDBmYjE4LCAweDAwMDBmYjE4IH0sCi0gICAgeyAweDAwMDA5YjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjIH0sCi0gICAgeyAweDAwMDA5YjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwIH0sCi0gICAgeyAweDAwMDA5YjE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjk0LCAweDAwMDBmYjk0LCAweDAwMDBmYjk0IH0sCi0gICAgeyAweDAwMDA5YjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjIH0sCi0gICAgeyAweDAwMDA5YjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwIH0sCi0gICAgeyAweDAwMDA5YjIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjk0LCAweDAwMDBmZjk0LCAweDAwMDBmZjk0IH0sCi0gICAgeyAweDAwMDA5YjI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwIH0sCi0gICAgeyAweDAwMDA5YjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE0LCAweDAwMDBmZmE0LCAweDAwMDBmZmE0IH0sCi0gICAgeyAweDAwMDA5YjJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE4LCAweDAwMDBmZmE4LCAweDAwMDBmZmE4IH0sCi0gICAgeyAweDAwMDA5YjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjIH0sCi0gICAgeyAweDAwMDA5YjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwIH0sCi0gICAgeyAweDAwMDA5YjM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI0LCAweDAwMDBmZmI0LCAweDAwMDBmZmI0IH0sCi0gICAgeyAweDAwMDA5YjNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmExLCAweDAwMDBmZmExLCAweDAwMDBmZmExIH0sCi0gICAgeyAweDAwMDA5YjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE1LCAweDAwMDBmZmE1LCAweDAwMDBmZmE1IH0sCi0gICAgeyAweDAwMDA5YjQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE5LCAweDAwMDBmZmE5LCAweDAwMDBmZmE5IH0sCi0gICAgeyAweDAwMDA5YjQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkIH0sCi0gICAgeyAweDAwMDA5YjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxIH0sCi0gICAgeyAweDAwMDA5YjUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI1LCAweDAwMDBmZmI1LCAweDAwMDBmZmI1IH0sCi0gICAgeyAweDAwMDA5YjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI5LCAweDAwMDBmZmI5LCAweDAwMDBmZmI5IH0sCi0gICAgeyAweDAwMDA5YjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM1LCAweDAwMDBmZmM1LCAweDAwMDBmZmM1IH0sCi0gICAgeyAweDAwMDA5YjVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM5LCAweDAwMDBmZmM5LCAweDAwMDBmZmM5IH0sCi0gICAgeyAweDAwMDA5YjYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkIH0sCi0gICAgeyAweDAwMDA5YjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxIH0sCi0gICAgeyAweDAwMDA5YjY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1IH0sCi0gICAgeyAweDAwMDA5YjZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyIH0sCi0gICAgeyAweDAwMDA5YjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM2LCAweDAwMDBmZmM2LCAweDAwMDBmZmM2IH0sCi0gICAgeyAweDAwMDA5Yjc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhIH0sCi0gICAgeyAweDAwMDA5Yjc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlIH0sCi0gICAgeyAweDAwMDA5YjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyIH0sCi0gICAgeyAweDAwMDA5YjgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2IH0sCi0gICAgeyAweDAwMDA5Yjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhIH0sCi0gICAgeyAweDAwMDA5Yjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM3LCAweDAwMDBmZmM3LCAweDAwMDBmZmM3IH0sCi0gICAgeyAweDAwMDA5YjhjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiIH0sCi0gICAgeyAweDAwMDA5YjkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmIH0sCi0gICAgeyAweDAwMDA5Yjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzIH0sCi0gICAgeyAweDAwMDA5Yjk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3IH0sCi0gICAgeyAweDAwMDA5YjljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5YmZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwLCAweDAwMDBhMTIwIH0sCi0gICAgeyAweDAwMDBhYTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI0LCAweDAwMDBhMTI0LCAweDAwMDBhMTI0IH0sCi0gICAgeyAweDAwMDBhYTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI4LCAweDAwMDBhMTI4LCAweDAwMDBhMTI4IH0sCi0gICAgeyAweDAwMDBhYTBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjLCAweDAwMDBhMTJjIH0sCi0gICAgeyAweDAwMDBhYTEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwIH0sCi0gICAgeyAweDAwMDBhYTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk0LCAweDAwMDBhMTk0LCAweDAwMDBhMTk0IH0sCi0gICAgeyAweDAwMDBhYTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk4LCAweDAwMDBhMTk4LCAweDAwMDBhMTk4IH0sCi0gICAgeyAweDAwMDBhYTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjIH0sCi0gICAgeyAweDAwMDBhYTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwIH0sCi0gICAgeyAweDAwMDBhYTI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg0LCAweDAwMDBhMjg0LCAweDAwMDBhMjg0IH0sCi0gICAgeyAweDAwMDBhYTI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg4LCAweDAwMDBhMjg4LCAweDAwMDBhMjg4IH0sCi0gICAgeyAweDAwMDBhYTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjIH0sCi0gICAgeyAweDAwMDBhYTMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwLCAweDAwMDBhMjkwIH0sCi0gICAgeyAweDAwMDBhYTM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjk0LCAweDAwMDBhMjk0LCAweDAwMDBhMjk0IH0sCi0gICAgeyAweDAwMDBhYTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwIH0sCi0gICAgeyAweDAwMDBhYTNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE0LCAweDAwMDBhMmE0LCAweDAwMDBhMmE0IH0sCi0gICAgeyAweDAwMDBhYTQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE4LCAweDAwMDBhMmE4LCAweDAwMDBhMmE4IH0sCi0gICAgeyAweDAwMDBhYTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjIH0sCi0gICAgeyAweDAwMDBhYTQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwLCAweDAwMDBhMmIwIH0sCi0gICAgeyAweDAwMDBhYTRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI0LCAweDAwMDBhMmI0LCAweDAwMDBhMmI0IH0sCi0gICAgeyAweDAwMDBhYTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI4LCAweDAwMDBhMmI4LCAweDAwMDBhMmI4IH0sCi0gICAgeyAweDAwMDBhYTU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmM0LCAweDAwMDBhMmM0LCAweDAwMDBhMmM0IH0sCi0gICAgeyAweDAwMDBhYTU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzA4LCAweDAwMDBhNzA4LCAweDAwMDBhNzA4IH0sCi0gICAgeyAweDAwMDBhYTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjIH0sCi0gICAgeyAweDAwMDBhYTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwLCAweDAwMDBhNzEwIH0sCi0gICAgeyAweDAwMDBhYTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA0LCAweDAwMDBhYjA0LCAweDAwMDBhYjA0IH0sCi0gICAgeyAweDAwMDBhYTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA4LCAweDAwMDBhYjA4LCAweDAwMDBhYjA4IH0sCi0gICAgeyAweDAwMDBhYTZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjLCAweDAwMDBhYjBjIH0sCi0gICAgeyAweDAwMDBhYTcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwIH0sCi0gICAgeyAweDAwMDBhYTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE0LCAweDAwMDBhYjE0LCAweDAwMDBhYjE0IH0sCi0gICAgeyAweDAwMDBhYTc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE4LCAweDAwMDBhYjE4LCAweDAwMDBhYjE4IH0sCi0gICAgeyAweDAwMDBhYTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjIH0sCi0gICAgeyAweDAwMDBhYTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwIH0sCi0gICAgeyAweDAwMDBhYTg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk0LCAweDAwMDBhYjk0LCAweDAwMDBhYjk0IH0sCi0gICAgeyAweDAwMDBhYTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk4LCAweDAwMDBhYjk4LCAweDAwMDBhYjk4IH0sCi0gICAgeyAweDAwMDBhYThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE0LCAweDAwMDBhYmE0LCAweDAwMDBhYmE0IH0sCi0gICAgeyAweDAwMDBhYTkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE4LCAweDAwMDBhYmE4LCAweDAwMDBhYmE4IH0sCi0gICAgeyAweDAwMDBhYTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA0LCAweDAwMDBjYjA0LCAweDAwMDBjYjA0IH0sCi0gICAgeyAweDAwMDBhYTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA4LCAweDAwMDBjYjA4LCAweDAwMDBjYjA4IH0sCi0gICAgeyAweDAwMDBhYTljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjLCAweDAwMDBjYjBjIH0sCi0gICAgeyAweDAwMDBhYWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwIH0sCi0gICAgeyAweDAwMDBhYWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE0LCAweDAwMDBjYjE0LCAweDAwMDBjYjE0IH0sCi0gICAgeyAweDAwMDBhYWE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE4LCAweDAwMDBjYjE4LCAweDAwMDBjYjE4IH0sCi0gICAgeyAweDAwMDBhYWFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjIH0sCi0gICAgeyAweDAwMDBhYWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwIH0sCi0gICAgeyAweDAwMDBhYWI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjE4LCAweDAwMDBjZjE4LCAweDAwMDBjZjE4IH0sCi0gICAgeyAweDAwMDBhYWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI0LCAweDAwMDBjZjI0LCAweDAwMDBjZjI0IH0sCi0gICAgeyAweDAwMDBhYWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI4LCAweDAwMDBjZjI4LCAweDAwMDBjZjI4IH0sCi0gICAgeyAweDAwMDBhYWMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE0LCAweDAwMDBkMzE0LCAweDAwMDBkMzE0IH0sCi0gICAgeyAweDAwMDBhYWM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE4LCAweDAwMDBkMzE4LCAweDAwMDBkMzE4IH0sCi0gICAgeyAweDAwMDBhYWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjIH0sCi0gICAgeyAweDAwMDBhYWNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwLCAweDAwMDBkMzkwIH0sCi0gICAgeyAweDAwMDBhYWQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk0LCAweDAwMDBkMzk0LCAweDAwMDBkMzk0IH0sCi0gICAgeyAweDAwMDBhYWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk4LCAweDAwMDBkMzk4LCAweDAwMDBkMzk4IH0sCi0gICAgeyAweDAwMDBhYWQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E0LCAweDAwMDBkM2E0LCAweDAwMDBkM2E0IH0sCi0gICAgeyAweDAwMDBhYWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E4LCAweDAwMDBkM2E4LCAweDAwMDBkM2E4IH0sCi0gICAgeyAweDAwMDBhYWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjIH0sCi0gICAgeyAweDAwMDBhYWU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwLCAweDAwMDBkM2IwIH0sCi0gICAgeyAweDAwMDBhYWU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwIH0sCi0gICAgeyAweDAwMDBhYWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg0LCAweDAwMDBmMzg0LCAweDAwMDBmMzg0IH0sCi0gICAgeyAweDAwMDBhYWYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg4LCAweDAwMDBmMzg4LCAweDAwMDBmMzg4IH0sCi0gICAgeyAweDAwMDBhYWY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwIH0sCi0gICAgeyAweDAwMDBhYWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE0LCAweDAwMDBmNzE0LCAweDAwMDBmNzE0IH0sCi0gICAgeyAweDAwMDBhYWZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE4LCAweDAwMDBmNzE4LCAweDAwMDBmNzE4IH0sCi0gICAgeyAweDAwMDBhYjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwIH0sCi0gICAgeyAweDAwMDBhYjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE0LCAweDAwMDBmYjE0LCAweDAwMDBmYjE0IH0sCi0gICAgeyAweDAwMDBhYjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE4LCAweDAwMDBmYjE4LCAweDAwMDBmYjE4IH0sCi0gICAgeyAweDAwMDBhYjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjIH0sCi0gICAgeyAweDAwMDBhYjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwIH0sCi0gICAgeyAweDAwMDBhYjE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjk0LCAweDAwMDBmYjk0LCAweDAwMDBmYjk0IH0sCi0gICAgeyAweDAwMDBhYjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjIH0sCi0gICAgeyAweDAwMDBhYjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwIH0sCi0gICAgeyAweDAwMDBhYjIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjk0LCAweDAwMDBmZjk0LCAweDAwMDBmZjk0IH0sCi0gICAgeyAweDAwMDBhYjI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwIH0sCi0gICAgeyAweDAwMDBhYjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE0LCAweDAwMDBmZmE0LCAweDAwMDBmZmE0IH0sCi0gICAgeyAweDAwMDBhYjJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE4LCAweDAwMDBmZmE4LCAweDAwMDBmZmE4IH0sCi0gICAgeyAweDAwMDBhYjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjIH0sCi0gICAgeyAweDAwMDBhYjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwIH0sCi0gICAgeyAweDAwMDBhYjM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI0LCAweDAwMDBmZmI0LCAweDAwMDBmZmI0IH0sCi0gICAgeyAweDAwMDBhYjNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmExLCAweDAwMDBmZmExLCAweDAwMDBmZmExIH0sCi0gICAgeyAweDAwMDBhYjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE1LCAweDAwMDBmZmE1LCAweDAwMDBmZmE1IH0sCi0gICAgeyAweDAwMDBhYjQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE5LCAweDAwMDBmZmE5LCAweDAwMDBmZmE5IH0sCi0gICAgeyAweDAwMDBhYjQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkIH0sCi0gICAgeyAweDAwMDBhYjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxIH0sCi0gICAgeyAweDAwMDBhYjUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI1LCAweDAwMDBmZmI1LCAweDAwMDBmZmI1IH0sCi0gICAgeyAweDAwMDBhYjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI5LCAweDAwMDBmZmI5LCAweDAwMDBmZmI5IH0sCi0gICAgeyAweDAwMDBhYjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM1LCAweDAwMDBmZmM1LCAweDAwMDBmZmM1IH0sCi0gICAgeyAweDAwMDBhYjVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM5LCAweDAwMDBmZmM5LCAweDAwMDBmZmM5IH0sCi0gICAgeyAweDAwMDBhYjYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkIH0sCi0gICAgeyAweDAwMDBhYjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxIH0sCi0gICAgeyAweDAwMDBhYjY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1LCAweDAwMDBmZmQ1IH0sCi0gICAgeyAweDAwMDBhYjZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyIH0sCi0gICAgeyAweDAwMDBhYjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM2LCAweDAwMDBmZmM2LCAweDAwMDBmZmM2IH0sCi0gICAgeyAweDAwMDBhYjc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhLCAweDAwMDBmZmNhIH0sCi0gICAgeyAweDAwMDBhYjc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlIH0sCi0gICAgeyAweDAwMDBhYjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyIH0sCi0gICAgeyAweDAwMDBhYjgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2LCAweDAwMDBmZmQ2IH0sCi0gICAgeyAweDAwMDBhYjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhIH0sCi0gICAgeyAweDAwMDBhYjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM3LCAweDAwMDBmZmM3LCAweDAwMDBmZmM3IH0sCi0gICAgeyAweDAwMDBhYjhjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiLCAweDAwMDBmZmNiIH0sCi0gICAgeyAweDAwMDBhYjkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmIH0sCi0gICAgeyAweDAwMDBhYjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzIH0sCi0gICAgeyAweDAwMDBhYjk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3LCAweDAwMDBmZmQ3IH0sCi0gICAgeyAweDAwMDBhYjljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDBhYmZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiIH0sCi0gICAgeyAweDAwMDA5ODQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAxMDY3LCAweDAwMDAxMDY3LCAweDAwMDAxMDY3IH0sCi0gICAgeyAweDAwMDBhODQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAxMDY3LCAweDAwMDAxMDY3LCAweDAwMDAxMDY3IH0sCisJezB4MDAwMDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGExMjAsIDB4MDAwMGExMjAsIDB4MDAwMGExMjB9LAorCXsweDAwMDA5YTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI0LCAweDAwMDBhMTI0LCAweDAwMDBhMTI0fSwKKwl7MHgwMDAwOWEwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTEyOCwgMHgwMDAwYTEyOCwgMHgwMDAwYTEyOH0sCisJezB4MDAwMDlhMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGExMmMsIDB4MDAwMGExMmMsIDB4MDAwMGExMmN9LAorCXsweDAwMDA5YTEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwLCAweDAwMDBhMTMwfSwKKwl7MHgwMDAwOWExNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTE5NCwgMHgwMDAwYTE5NCwgMHgwMDAwYTE5NH0sCisJezB4MDAwMDlhMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGExOTgsIDB4MDAwMGExOTgsIDB4MDAwMGExOTh9LAorCXsweDAwMDA5YTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjLCAweDAwMDBhMjBjfSwKKwl7MHgwMDAwOWEyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTIxMCwgMHgwMDAwYTIxMCwgMHgwMDAwYTIxMH0sCisJezB4MDAwMDlhMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyODQsIDB4MDAwMGEyODQsIDB4MDAwMGEyODR9LAorCXsweDAwMDA5YTI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjg4LCAweDAwMDBhMjg4LCAweDAwMDBhMjg4fSwKKwl7MHgwMDAwOWEyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTI4YywgMHgwMDAwYTI4YywgMHgwMDAwYTI4Y30sCisJezB4MDAwMDlhMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyOTAsIDB4MDAwMGEyOTAsIDB4MDAwMGEyOTB9LAorCXsweDAwMDA5YTM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjk0LCAweDAwMDBhMjk0LCAweDAwMDBhMjk0fSwKKwl7MHgwMDAwOWEzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTJhMCwgMHgwMDAwYTJhMCwgMHgwMDAwYTJhMH0sCisJezB4MDAwMDlhM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyYTQsIDB4MDAwMGEyYTQsIDB4MDAwMGEyYTR9LAorCXsweDAwMDA5YTQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmE4LCAweDAwMDBhMmE4LCAweDAwMDBhMmE4fSwKKwl7MHgwMDAwOWE0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTJhYywgMHgwMDAwYTJhYywgMHgwMDAwYTJhY30sCisJezB4MDAwMDlhNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyYjAsIDB4MDAwMGEyYjAsIDB4MDAwMGEyYjB9LAorCXsweDAwMDA5YTRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI0LCAweDAwMDBhMmI0LCAweDAwMDBhMmI0fSwKKwl7MHgwMDAwOWE1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTJiOCwgMHgwMDAwYTJiOCwgMHgwMDAwYTJiOH0sCisJezB4MDAwMDlhNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyYzQsIDB4MDAwMGEyYzQsIDB4MDAwMGEyYzR9LAorCXsweDAwMDA5YTU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzA4LCAweDAwMDBhNzA4LCAweDAwMDBhNzA4fSwKKwl7MHgwMDAwOWE1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTcwYywgMHgwMDAwYTcwYywgMHgwMDAwYTcwY30sCisJezB4MDAwMDlhNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGE3MTAsIDB4MDAwMGE3MTAsIDB4MDAwMGE3MTB9LAorCXsweDAwMDA5YTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA0LCAweDAwMDBhYjA0LCAweDAwMDBhYjA0fSwKKwl7MHgwMDAwOWE2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWIwOCwgMHgwMDAwYWIwOCwgMHgwMDAwYWIwOH0sCisJezB4MDAwMDlhNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiMGMsIDB4MDAwMGFiMGMsIDB4MDAwMGFiMGN9LAorCXsweDAwMDA5YTcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwLCAweDAwMDBhYjEwfSwKKwl7MHgwMDAwOWE3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWIxNCwgMHgwMDAwYWIxNCwgMHgwMDAwYWIxNH0sCisJezB4MDAwMDlhNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiMTgsIDB4MDAwMGFiMTgsIDB4MDAwMGFiMTh9LAorCXsweDAwMDA5YTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjLCAweDAwMDBhYjhjfSwKKwl7MHgwMDAwOWE4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWI5MCwgMHgwMDAwYWI5MCwgMHgwMDAwYWI5MH0sCisJezB4MDAwMDlhODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiOTQsIDB4MDAwMGFiOTQsIDB4MDAwMGFiOTR9LAorCXsweDAwMDA5YTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjk4LCAweDAwMDBhYjk4LCAweDAwMDBhYjk4fSwKKwl7MHgwMDAwOWE4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWJhNCwgMHgwMDAwYWJhNCwgMHgwMDAwYWJhNH0sCisJezB4MDAwMDlhOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiYTgsIDB4MDAwMGFiYTgsIDB4MDAwMGFiYTh9LAorCXsweDAwMDA5YTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA0LCAweDAwMDBjYjA0LCAweDAwMDBjYjA0fSwKKwl7MHgwMDAwOWE5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2IwOCwgMHgwMDAwY2IwOCwgMHgwMDAwY2IwOH0sCisJezB4MDAwMDlhOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNiMGMsIDB4MDAwMGNiMGMsIDB4MDAwMGNiMGN9LAorCXsweDAwMDA5YWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwLCAweDAwMDBjYjEwfSwKKwl7MHgwMDAwOWFhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2IxNCwgMHgwMDAwY2IxNCwgMHgwMDAwY2IxNH0sCisJezB4MDAwMDlhYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNiMTgsIDB4MDAwMGNiMTgsIDB4MDAwMGNiMTh9LAorCXsweDAwMDA5YWFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjLCAweDAwMDBjYjhjfSwKKwl7MHgwMDAwOWFiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2I5MCwgMHgwMDAwY2I5MCwgMHgwMDAwY2I5MH0sCisJezB4MDAwMDlhYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNmMTgsIDB4MDAwMGNmMTgsIDB4MDAwMGNmMTh9LAorCXsweDAwMDA5YWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI0LCAweDAwMDBjZjI0LCAweDAwMDBjZjI0fSwKKwl7MHgwMDAwOWFiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2YyOCwgMHgwMDAwY2YyOCwgMHgwMDAwY2YyOH0sCisJezB4MDAwMDlhYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzMTQsIDB4MDAwMGQzMTQsIDB4MDAwMGQzMTR9LAorCXsweDAwMDA5YWM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzE4LCAweDAwMDBkMzE4LCAweDAwMDBkMzE4fSwKKwl7MHgwMDAwOWFjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDM4YywgMHgwMDAwZDM4YywgMHgwMDAwZDM4Y30sCisJezB4MDAwMDlhY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzOTAsIDB4MDAwMGQzOTAsIDB4MDAwMGQzOTB9LAorCXsweDAwMDA5YWQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk0LCAweDAwMDBkMzk0LCAweDAwMDBkMzk0fSwKKwl7MHgwMDAwOWFkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDM5OCwgMHgwMDAwZDM5OCwgMHgwMDAwZDM5OH0sCisJezB4MDAwMDlhZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzYTQsIDB4MDAwMGQzYTQsIDB4MDAwMGQzYTR9LAorCXsweDAwMDA5YWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2E4LCAweDAwMDBkM2E4LCAweDAwMDBkM2E4fSwKKwl7MHgwMDAwOWFlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDNhYywgMHgwMDAwZDNhYywgMHgwMDAwZDNhY30sCisJezB4MDAwMDlhZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzYjAsIDB4MDAwMGQzYjAsIDB4MDAwMGQzYjB9LAorCXsweDAwMDA5YWU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwLCAweDAwMDBmMzgwfSwKKwl7MHgwMDAwOWFlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZjM4NCwgMHgwMDAwZjM4NCwgMHgwMDAwZjM4NH0sCisJezB4MDAwMDlhZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGYzODgsIDB4MDAwMGYzODgsIDB4MDAwMGYzODh9LAorCXsweDAwMDA5YWY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwLCAweDAwMDBmNzEwfSwKKwl7MHgwMDAwOWFmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZjcxNCwgMHgwMDAwZjcxNCwgMHgwMDAwZjcxNH0sCisJezB4MDAwMDlhZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGY3MTgsIDB4MDAwMGY3MTgsIDB4MDAwMGY3MTh9LAorCXsweDAwMDA5YjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwLCAweDAwMDBmYjEwfSwKKwl7MHgwMDAwOWIwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmIxNCwgMHgwMDAwZmIxNCwgMHgwMDAwZmIxNH0sCisJezB4MDAwMDliMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZiMTgsIDB4MDAwMGZiMTgsIDB4MDAwMGZiMTh9LAorCXsweDAwMDA5YjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjLCAweDAwMDBmYjhjfSwKKwl7MHgwMDAwOWIxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmI5MCwgMHgwMDAwZmI5MCwgMHgwMDAwZmI5MH0sCisJezB4MDAwMDliMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZiOTQsIDB4MDAwMGZiOTQsIDB4MDAwMGZiOTR9LAorCXsweDAwMDA5YjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjLCAweDAwMDBmZjhjfSwKKwl7MHgwMDAwOWIxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmY5MCwgMHgwMDAwZmY5MCwgMHgwMDAwZmY5MH0sCisJezB4MDAwMDliMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmOTQsIDB4MDAwMGZmOTQsIDB4MDAwMGZmOTR9LAorCXsweDAwMDA5YjI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwLCAweDAwMDBmZmEwfSwKKwl7MHgwMDAwOWIyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZhNCwgMHgwMDAwZmZhNCwgMHgwMDAwZmZhNH0sCisJezB4MDAwMDliMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYTgsIDB4MDAwMGZmYTgsIDB4MDAwMGZmYTh9LAorCXsweDAwMDA5YjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjLCAweDAwMDBmZmFjfSwKKwl7MHgwMDAwOWIzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZiMCwgMHgwMDAwZmZiMCwgMHgwMDAwZmZiMH0sCisJezB4MDAwMDliMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYjQsIDB4MDAwMGZmYjQsIDB4MDAwMGZmYjR9LAorCXsweDAwMDA5YjNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmExLCAweDAwMDBmZmExLCAweDAwMDBmZmExfSwKKwl7MHgwMDAwOWI0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZhNSwgMHgwMDAwZmZhNSwgMHgwMDAwZmZhNX0sCisJezB4MDAwMDliNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYTksIDB4MDAwMGZmYTksIDB4MDAwMGZmYTl9LAorCXsweDAwMDA5YjQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkLCAweDAwMDBmZmFkfSwKKwl7MHgwMDAwOWI0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZiMSwgMHgwMDAwZmZiMSwgMHgwMDAwZmZiMX0sCisJezB4MDAwMDliNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYjUsIDB4MDAwMGZmYjUsIDB4MDAwMGZmYjV9LAorCXsweDAwMDA5YjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmI5LCAweDAwMDBmZmI5LCAweDAwMDBmZmI5fSwKKwl7MHgwMDAwOWI1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZjNSwgMHgwMDAwZmZjNSwgMHgwMDAwZmZjNX0sCisJezB4MDAwMDliNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYzksIDB4MDAwMGZmYzksIDB4MDAwMGZmYzl9LAorCXsweDAwMDA5YjYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkLCAweDAwMDBmZmNkfSwKKwl7MHgwMDAwOWI2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkMSwgMHgwMDAwZmZkMSwgMHgwMDAwZmZkMX0sCisJezB4MDAwMDliNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZDUsIDB4MDAwMGZmZDUsIDB4MDAwMGZmZDV9LAorCXsweDAwMDA5YjZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyLCAweDAwMDBmZmMyfSwKKwl7MHgwMDAwOWI3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZjNiwgMHgwMDAwZmZjNiwgMHgwMDAwZmZjNn0sCisJezB4MDAwMDliNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmY2EsIDB4MDAwMGZmY2EsIDB4MDAwMGZmY2F9LAorCXsweDAwMDA5Yjc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlLCAweDAwMDBmZmNlfSwKKwl7MHgwMDAwOWI3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkMiwgMHgwMDAwZmZkMiwgMHgwMDAwZmZkMn0sCisJezB4MDAwMDliODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZDYsIDB4MDAwMGZmZDYsIDB4MDAwMGZmZDZ9LAorCXsweDAwMDA5Yjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhLCAweDAwMDBmZmRhfSwKKwl7MHgwMDAwOWI4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZjNywgMHgwMDAwZmZjNywgMHgwMDAwZmZjN30sCisJezB4MDAwMDliOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmY2IsIDB4MDAwMGZmY2IsIDB4MDAwMGZmY2J9LAorCXsweDAwMDA5YjkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmLCAweDAwMDBmZmNmfSwKKwl7MHgwMDAwOWI5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkMywgMHgwMDAwZmZkMywgMHgwMDAwZmZkM30sCisJezB4MDAwMDliOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZDcsIDB4MDAwMGZmZDcsIDB4MDAwMGZmZDd9LAorCXsweDAwMDA5YjljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwOWJmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMDliZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5YmZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTEyMCwgMHgwMDAwYTEyMCwgMHgwMDAwYTEyMH0sCisJezB4MDAwMGFhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGExMjQsIDB4MDAwMGExMjQsIDB4MDAwMGExMjR9LAorCXsweDAwMDBhYTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTI4LCAweDAwMDBhMTI4LCAweDAwMDBhMTI4fSwKKwl7MHgwMDAwYWEwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTEyYywgMHgwMDAwYTEyYywgMHgwMDAwYTEyY30sCisJezB4MDAwMGFhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGExMzAsIDB4MDAwMGExMzAsIDB4MDAwMGExMzB9LAorCXsweDAwMDBhYTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMTk0LCAweDAwMDBhMTk0LCAweDAwMDBhMTk0fSwKKwl7MHgwMDAwYWExOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTE5OCwgMHgwMDAwYTE5OCwgMHgwMDAwYTE5OH0sCisJezB4MDAwMGFhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyMGMsIDB4MDAwMGEyMGMsIDB4MDAwMGEyMGN9LAorCXsweDAwMDBhYTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwLCAweDAwMDBhMjEwfSwKKwl7MHgwMDAwYWEyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTI4NCwgMHgwMDAwYTI4NCwgMHgwMDAwYTI4NH0sCisJezB4MDAwMGFhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyODgsIDB4MDAwMGEyODgsIDB4MDAwMGEyODh9LAorCXsweDAwMDBhYTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjLCAweDAwMDBhMjhjfSwKKwl7MHgwMDAwYWEzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTI5MCwgMHgwMDAwYTI5MCwgMHgwMDAwYTI5MH0sCisJezB4MDAwMGFhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyOTQsIDB4MDAwMGEyOTQsIDB4MDAwMGEyOTR9LAorCXsweDAwMDBhYTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwLCAweDAwMDBhMmEwfSwKKwl7MHgwMDAwYWEzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTJhNCwgMHgwMDAwYTJhNCwgMHgwMDAwYTJhNH0sCisJezB4MDAwMGFhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyYTgsIDB4MDAwMGEyYTgsIDB4MDAwMGEyYTh9LAorCXsweDAwMDBhYTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjLCAweDAwMDBhMmFjfSwKKwl7MHgwMDAwYWE0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTJiMCwgMHgwMDAwYTJiMCwgMHgwMDAwYTJiMH0sCisJezB4MDAwMGFhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGEyYjQsIDB4MDAwMGEyYjQsIDB4MDAwMGEyYjR9LAorCXsweDAwMDBhYTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhMmI4LCAweDAwMDBhMmI4LCAweDAwMDBhMmI4fSwKKwl7MHgwMDAwYWE1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTJjNCwgMHgwMDAwYTJjNCwgMHgwMDAwYTJjNH0sCisJezB4MDAwMGFhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGE3MDgsIDB4MDAwMGE3MDgsIDB4MDAwMGE3MDh9LAorCXsweDAwMDBhYTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjLCAweDAwMDBhNzBjfSwKKwl7MHgwMDAwYWE2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYTcxMCwgMHgwMDAwYTcxMCwgMHgwMDAwYTcxMH0sCisJezB4MDAwMGFhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiMDQsIDB4MDAwMGFiMDQsIDB4MDAwMGFiMDR9LAorCXsweDAwMDBhYTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjA4LCAweDAwMDBhYjA4LCAweDAwMDBhYjA4fSwKKwl7MHgwMDAwYWE2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWIwYywgMHgwMDAwYWIwYywgMHgwMDAwYWIwY30sCisJezB4MDAwMGFhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiMTAsIDB4MDAwMGFiMTAsIDB4MDAwMGFiMTB9LAorCXsweDAwMDBhYTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjE0LCAweDAwMDBhYjE0LCAweDAwMDBhYjE0fSwKKwl7MHgwMDAwYWE3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWIxOCwgMHgwMDAwYWIxOCwgMHgwMDAwYWIxOH0sCisJezB4MDAwMGFhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiOGMsIDB4MDAwMGFiOGMsIDB4MDAwMGFiOGN9LAorCXsweDAwMDBhYTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwLCAweDAwMDBhYjkwfSwKKwl7MHgwMDAwYWE4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWI5NCwgMHgwMDAwYWI5NCwgMHgwMDAwYWI5NH0sCisJezB4MDAwMGFhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGFiOTgsIDB4MDAwMGFiOTgsIDB4MDAwMGFiOTh9LAorCXsweDAwMDBhYThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBhYmE0LCAweDAwMDBhYmE0LCAweDAwMDBhYmE0fSwKKwl7MHgwMDAwYWE5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwYWJhOCwgMHgwMDAwYWJhOCwgMHgwMDAwYWJhOH0sCisJezB4MDAwMGFhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNiMDQsIDB4MDAwMGNiMDQsIDB4MDAwMGNiMDR9LAorCXsweDAwMDBhYTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjA4LCAweDAwMDBjYjA4LCAweDAwMDBjYjA4fSwKKwl7MHgwMDAwYWE5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2IwYywgMHgwMDAwY2IwYywgMHgwMDAwY2IwY30sCisJezB4MDAwMGFhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNiMTAsIDB4MDAwMGNiMTAsIDB4MDAwMGNiMTB9LAorCXsweDAwMDBhYWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjE0LCAweDAwMDBjYjE0LCAweDAwMDBjYjE0fSwKKwl7MHgwMDAwYWFhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2IxOCwgMHgwMDAwY2IxOCwgMHgwMDAwY2IxOH0sCisJezB4MDAwMGFhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNiOGMsIDB4MDAwMGNiOGMsIDB4MDAwMGNiOGN9LAorCXsweDAwMDBhYWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwLCAweDAwMDBjYjkwfSwKKwl7MHgwMDAwYWFiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwY2YxOCwgMHgwMDAwY2YxOCwgMHgwMDAwY2YxOH0sCisJezB4MDAwMGFhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGNmMjQsIDB4MDAwMGNmMjQsIDB4MDAwMGNmMjR9LAorCXsweDAwMDBhYWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBjZjI4LCAweDAwMDBjZjI4LCAweDAwMDBjZjI4fSwKKwl7MHgwMDAwYWFjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDMxNCwgMHgwMDAwZDMxNCwgMHgwMDAwZDMxNH0sCisJezB4MDAwMGFhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzMTgsIDB4MDAwMGQzMTgsIDB4MDAwMGQzMTh9LAorCXsweDAwMDBhYWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjLCAweDAwMDBkMzhjfSwKKwl7MHgwMDAwYWFjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDM5MCwgMHgwMDAwZDM5MCwgMHgwMDAwZDM5MH0sCisJezB4MDAwMGFhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzOTQsIDB4MDAwMGQzOTQsIDB4MDAwMGQzOTR9LAorCXsweDAwMDBhYWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkMzk4LCAweDAwMDBkMzk4LCAweDAwMDBkMzk4fSwKKwl7MHgwMDAwYWFkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDNhNCwgMHgwMDAwZDNhNCwgMHgwMDAwZDNhNH0sCisJezB4MDAwMGFhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGQzYTgsIDB4MDAwMGQzYTgsIDB4MDAwMGQzYTh9LAorCXsweDAwMDBhYWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjLCAweDAwMDBkM2FjfSwKKwl7MHgwMDAwYWFlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZDNiMCwgMHgwMDAwZDNiMCwgMHgwMDAwZDNiMH0sCisJezB4MDAwMGFhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGYzODAsIDB4MDAwMGYzODAsIDB4MDAwMGYzODB9LAorCXsweDAwMDBhYWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmMzg0LCAweDAwMDBmMzg0LCAweDAwMDBmMzg0fSwKKwl7MHgwMDAwYWFmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZjM4OCwgMHgwMDAwZjM4OCwgMHgwMDAwZjM4OH0sCisJezB4MDAwMGFhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGY3MTAsIDB4MDAwMGY3MTAsIDB4MDAwMGY3MTB9LAorCXsweDAwMDBhYWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmNzE0LCAweDAwMDBmNzE0LCAweDAwMDBmNzE0fSwKKwl7MHgwMDAwYWFmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZjcxOCwgMHgwMDAwZjcxOCwgMHgwMDAwZjcxOH0sCisJezB4MDAwMGFiMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZiMTAsIDB4MDAwMGZiMTAsIDB4MDAwMGZiMTB9LAorCXsweDAwMDBhYjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjE0LCAweDAwMDBmYjE0LCAweDAwMDBmYjE0fSwKKwl7MHgwMDAwYWIwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmIxOCwgMHgwMDAwZmIxOCwgMHgwMDAwZmIxOH0sCisJezB4MDAwMGFiMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZiOGMsIDB4MDAwMGZiOGMsIDB4MDAwMGZiOGN9LAorCXsweDAwMDBhYjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwLCAweDAwMDBmYjkwfSwKKwl7MHgwMDAwYWIxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmI5NCwgMHgwMDAwZmI5NCwgMHgwMDAwZmI5NH0sCisJezB4MDAwMGFiMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmOGMsIDB4MDAwMGZmOGMsIDB4MDAwMGZmOGN9LAorCXsweDAwMDBhYjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwLCAweDAwMDBmZjkwfSwKKwl7MHgwMDAwYWIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmY5NCwgMHgwMDAwZmY5NCwgMHgwMDAwZmY5NH0sCisJezB4MDAwMGFiMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYTAsIDB4MDAwMGZmYTAsIDB4MDAwMGZmYTB9LAorCXsweDAwMDBhYjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE0LCAweDAwMDBmZmE0LCAweDAwMDBmZmE0fSwKKwl7MHgwMDAwYWIyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZhOCwgMHgwMDAwZmZhOCwgMHgwMDAwZmZhOH0sCisJezB4MDAwMGFiMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYWMsIDB4MDAwMGZmYWMsIDB4MDAwMGZmYWN9LAorCXsweDAwMDBhYjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwLCAweDAwMDBmZmIwfSwKKwl7MHgwMDAwYWIzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZiNCwgMHgwMDAwZmZiNCwgMHgwMDAwZmZiNH0sCisJezB4MDAwMGFiM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYTEsIDB4MDAwMGZmYTEsIDB4MDAwMGZmYTF9LAorCXsweDAwMDBhYjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmE1LCAweDAwMDBmZmE1LCAweDAwMDBmZmE1fSwKKwl7MHgwMDAwYWI0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZhOSwgMHgwMDAwZmZhOSwgMHgwMDAwZmZhOX0sCisJezB4MDAwMGFiNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYWQsIDB4MDAwMGZmYWQsIDB4MDAwMGZmYWR9LAorCXsweDAwMDBhYjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxLCAweDAwMDBmZmIxfSwKKwl7MHgwMDAwYWI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZiNSwgMHgwMDAwZmZiNSwgMHgwMDAwZmZiNX0sCisJezB4MDAwMGFiNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYjksIDB4MDAwMGZmYjksIDB4MDAwMGZmYjl9LAorCXsweDAwMDBhYjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM1LCAweDAwMDBmZmM1LCAweDAwMDBmZmM1fSwKKwl7MHgwMDAwYWI1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZjOSwgMHgwMDAwZmZjOSwgMHgwMDAwZmZjOX0sCisJezB4MDAwMGFiNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmY2QsIDB4MDAwMGZmY2QsIDB4MDAwMGZmY2R9LAorCXsweDAwMDBhYjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxLCAweDAwMDBmZmQxfSwKKwl7MHgwMDAwYWI2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkNSwgMHgwMDAwZmZkNSwgMHgwMDAwZmZkNX0sCisJezB4MDAwMGFiNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmYzIsIDB4MDAwMGZmYzIsIDB4MDAwMGZmYzJ9LAorCXsweDAwMDBhYjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM2LCAweDAwMDBmZmM2LCAweDAwMDBmZmM2fSwKKwl7MHgwMDAwYWI3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZjYSwgMHgwMDAwZmZjYSwgMHgwMDAwZmZjYX0sCisJezB4MDAwMGFiNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmY2UsIDB4MDAwMGZmY2UsIDB4MDAwMGZmY2V9LAorCXsweDAwMDBhYjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyLCAweDAwMDBmZmQyfSwKKwl7MHgwMDAwYWI4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkNiwgMHgwMDAwZmZkNiwgMHgwMDAwZmZkNn0sCisJezB4MDAwMGFiODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGEsIDB4MDAwMGZmZGEsIDB4MDAwMGZmZGF9LAorCXsweDAwMDBhYjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmM3LCAweDAwMDBmZmM3LCAweDAwMDBmZmM3fSwKKwl7MHgwMDAwYWI4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZjYiwgMHgwMDAwZmZjYiwgMHgwMDAwZmZjYn0sCisJezB4MDAwMGFiOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmY2YsIDB4MDAwMGZmY2YsIDB4MDAwMGZmY2Z9LAorCXsweDAwMDBhYjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzLCAweDAwMDBmZmQzfSwKKwl7MHgwMDAwYWI5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkNywgMHgwMDAwZmZkNywgMHgwMDAwZmZkN30sCisJezB4MDAwMGFiOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDBhYmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDBmZmRiLCAweDAwMDBmZmRiLCAweDAwMDBmZmRifSwKKwl7MHgwMDAwYWJmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYiwgMHgwMDAwZmZkYn0sCisJezB4MDAwMGFiZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGIsIDB4MDAwMGZmZGJ9LAorCXsweDAwMDA5ODQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAxMDY3LCAweDAwMDAxMDY3LCAweDAwMDAxMDY3fSwKKwl7MHgwMDAwYTg0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMTA2NywgMHgwMDAwMTA2NywgMHgwMDAwMTA2N30sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4N1BjaWVQaHlfY2xrcmVxX2Fsd2F5c19vbl9MMV85Mjg3XzFfMVtdWzJdID0gewotICAgIHsweDAwMDA0MDQwLCAgMHg5MjQ4ZmQwMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgyNDkyNDkyNCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhhODAwMDAxOSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxMzE2MDgyMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhlNTk4MDU2MCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhjMDFkY2ZmZCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxYWFhYmU0MSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhiZTEwNTU1NCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgwMDA0MzAwNyB9LAotICAgIHsweDAwMDA0MDQ0LCAgMHgwMDAwMDAwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHg5MjQ4ZmQwMH0sCisJezB4MDAwMDQwNDAsIDB4MjQ5MjQ5MjR9LAorCXsweDAwMDA0MDQwLCAweGE4MDAwMDE5fSwKKwl7MHgwMDAwNDA0MCwgMHgxMzE2MDgyMH0sCisJezB4MDAwMDQwNDAsIDB4ZTU5ODA1NjB9LAorCXsweDAwMDA0MDQwLCAweGMwMWRjZmZkfSwKKwl7MHgwMDAwNDA0MCwgMHgxYWFhYmU0MX0sCisJezB4MDAwMDQwNDAsIDB4YmUxMDU1NTR9LAorCXsweDAwMDA0MDQwLCAweDAwMDQzMDA3fSwKKwl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI4N1BjaWVQaHlfY2xrcmVxX29mZl9MMV85Mjg3XzFfMVtdWzJdID0gewotICAgIHsweDAwMDA0MDQwLCAgMHg5MjQ4ZmQwMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgyNDkyNDkyNCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhhODAwMDAxOSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxMzE2MDgyMCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhlNTk4MDU2MCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhjMDFkY2ZmYyB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgxYWFhYmU0MSB9LAotICAgIHsweDAwMDA0MDQwLCAgMHhiZTEwNTU1NCB9LAotICAgIHsweDAwMDA0MDQwLCAgMHgwMDA0MzAwNyB9LAotICAgIHsweDAwMDA0MDQ0LCAgMHgwMDAwMDAwMCB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHg5MjQ4ZmQwMH0sCisJezB4MDAwMDQwNDAsIDB4MjQ5MjQ5MjR9LAorCXsweDAwMDA0MDQwLCAweGE4MDAwMDE5fSwKKwl7MHgwMDAwNDA0MCwgMHgxMzE2MDgyMH0sCisJezB4MDAwMDQwNDAsIDB4ZTU5ODA1NjB9LAorCXsweDAwMDA0MDQwLCAweGMwMWRjZmZjfSwKKwl7MHgwMDAwNDA0MCwgMHgxYWFhYmU0MX0sCisJezB4MDAwMDQwNDAsIDB4YmUxMDU1NTR9LAorCXsweDAwMDA0MDQwLCAweDAwMDQzMDA3fSwKKwl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCiB9OwogCi0KLS8qIEFSOTI3MSBpbml0aWFsaXphdGlvbiB2YWx1ZXMgYXV0b21hdGljYWx5IGNyZWF0ZWQ6IDA2LzA0LzA5ICovCiBzdGF0aWMgY29uc3QgdTMyIGFyOTI3MU1vZGVzXzkyNzFbXVs2XSA9IHsKLSAgICB7IDB4MDAwMDEwMzAsIDB4MDAwMDAyMzAsIDB4MDAwMDA0NjAsIDB4MDAwMDAyYzAsIDB4MDAwMDAxNjAsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTAgfSwKLSAgICB7IDB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzgsIDB4MDAwMDExODAgfSwKLSAgICB7IDB4MDAwMDEwZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTAgfSwKLSAgICB7IDB4MDAwMDgwMWMsIDB4MTI4ZDgwMjcsIDB4MTI4ZDgwNGYsIDB4MTJlMDAwNTcsIDB4MTJlMDAwMmIsIDB4MDk4ODAwNGYgfSwKLSAgICB7IDB4MDAwMDgzMTgsIDB4MDAwMDNlODAsIDB4MDAwMDdkMDAsIDB4MDAwMDY4ODAsIDB4MDAwMDM0NDAsIDB4MDAwMDY4ODAgfSwKLSAgICB7IDB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDMgfSwKLSAgICB7IDB4MDAwMDk4MjAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAsIDB4MDIwMjAyMDAgfSwKLSAgICB7IDB4MDAwMDk4MjQsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MjgsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEgfSwKLSAgICB7IDB4MDAwMDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUgfSwKLSAgICB7IDB4MDAwMDk4MzgsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcgfSwKLSAgICB7IDB4MDAwMDk4NDAsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUgfSwKLSAgICB7IDB4MDAwMDk4NDQsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MjAsIDB4MDM3MjE2MjAsIDB4MDM3MjE2YTAgfSwKLSAgICB7IDB4MDAwMDk4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTkgfSwKLSAgICB7IDB4MDAwMGE4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTkgfSwKLSAgICB7IDB4MDAwMDk4NTAsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIgfSwKLSAgICB7IDB4MDAwMDk4NTgsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmUgfSwKLSAgICB7IDB4MDAwMDk4NWMsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzOTYwNWUgfSwKLSAgICB7IDB4MDAwMDk4NjAsIDB4MDAwNThkMTgsIDB4MDAwNThkMTgsIDB4MDAwNThkMTgsIDB4MDAwNThkMTgsIDB4MDAwNThkMTggfSwKLSAgICB7IDB4MDAwMDk4NjQsIDB4MDAwMGZlMDAsIDB4MDAwMGZlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAgfSwKLSAgICB7IDB4MDAwMDk4NjgsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAgfSwKLSAgICB7IDB4MDAwMDk4NmMsIDB4MDY5MDMwODEsIDB4MDY5MDMwODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEgfSwKLSAgICB7IDB4MDAwMDk5MTAsIDB4MzAwMDIzMTAsIDB4MzAwMDIzMTAsIDB4MzAwMDIzMTAsIDB4MzAwMDIzMTAsIDB4MzAwMDIzMTAgfSwKLSAgICB7IDB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDAgfSwKLSAgICB7IDB4MDAwMDk5MTgsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTYgfSwKLSAgICB7IDB4MDAwMDk5MjQsIDB4ZDAwYTgwMDcsIDB4ZDAwYTgwMDcsIDB4ZDAwYTgwMGQsIDB4ZDAwYTgwMGQsIDB4ZDAwYTgwMGQgfSwKLSAgICB7IDB4MDAwMDk5NDQsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMjAsIDB4ZmZiYzEwMjAsIDB4ZmZiYzEwMTAgfSwKLSAgICB7IDB4MDAwMDk5NjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjgsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMgfSwKLSAgICB7IDB4MDAwMDk5YmMsIDB4MDAwMDA2MDAsIDB4MDAwMDA2MDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAsIDB4MDAwMDBjMDAgfSwKLSAgICB7IDB4MDAwMDk5YzAsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQgfSwKLSAgICB7IDB4MDAwMDk5YzQsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcgfSwKLSAgICB7IDB4MDAwMDk5YzgsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYsIDB4NmFmNjUzMmYgfSwKLSAgICB7IDB4MDAwMDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzggfSwKLSAgICB7IDB4MDAwMDk5ZDAsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQgfSwKLSAgICB7IDB4MDAwMDk5ZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODQsIDB4MDAwNTgwODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODgsIDB4MDAwNTgwODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwOGMsIDB4MDAwNTgwOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDAsIDB4MDAwNTgxMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDQsIDB4MDAwNTgxMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDgsIDB4MDAwNTgxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMGMsIDB4MDAwNTgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTAsIDB4MDAwNTgxMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTQsIDB4MDAwNTgxMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODAsIDB4MDAwNTgxODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODQsIDB4MDAwNTgxODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODgsIDB4MDAwNTgxODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOGMsIDB4MDAwNTgxOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTAsIDB4MDAwNTgxOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTQsIDB4MDAwNTgxOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTAsIDB4MDAwNTgxYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMGMsIDB4MDAwNTgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTgsIDB4MDAwNTgxYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODQsIDB4MDAwNTgyODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODgsIDB4MDAwNTgyODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMjQsIDB4MDAwNTgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyOTAsIDB4MDAwNTgyOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDAsIDB4MDAwNTgzMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDQsIDB4MDAwNTgzMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDgsIDB4MDAwNTgzMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMGMsIDB4MDAwNTgzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODAsIDB4MDAwNTgzODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODQsIDB4MDAwNTgzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDAsIDB4MDAwNjg3MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDQsIDB4MDAwNjg3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDgsIDB4MDAwNjg3MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MGMsIDB4MDAwNjg3MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODAsIDB4MDAwNjg3ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODQsIDB4MDAwNjg3ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDAsIDB4MDAwNzhiMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDQsIDB4MDAwNzhiMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDgsIDB4MDAwNzhiMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMGMsIDB4MDAwNzhiMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODAsIDB4MDAwNzhiODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODQsIDB4MDAwNzhiODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODgsIDB4MDAwNzhiODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOGMsIDB4MDAwNzhiOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOTAsIDB4MDAwNzhiOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODAsIDB4MDAwY2FmODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODQsIDB4MDAwY2FmODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODgsIDB4MDAwY2FmODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOGMsIDB4MDAwY2FmOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOTAsIDB4MDAwY2FmOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMGMsIDB4MDAwZGIzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMTAsIDB4MDAwZGIzMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODQsIDB4MDAwZGIzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODgsIDB4MDAwZGIzODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMjQsIDB4MDAwZGIzMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MDQsIDB4MDAwZWI3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTQsIDB4MDAwZWI2YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTgsIDB4MDAwZWI2YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTAsIDB4MDAwZWI3MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTQsIDB4MDAwZWI3MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjAsIDB4MDAwZWI3MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjQsIDB4MDAwZWI3MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjgsIDB4MDAwZWI3MjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MmMsIDB4MDAwZWI3MmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTAsIDB4MDAwZWI3YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDlhZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTQsIDB4MDAwZWI3YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTgsIDB4MDAwZWI3YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjAsIDB4MDAwZWI3YjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjQsIDB4MDAwZWI3YjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjgsIDB4MDAwZWI3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTUsIDB4MDAwZWI3YTUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTksIDB4MDAwZWI3YTksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YWQsIDB4MDAwZWI3YWQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjEsIDB4MDAwZWI3YjEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjUsIDB4MDAwZWI3YjUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjksIDB4MDAwZWI3YjksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzUsIDB4MDAwZWI3YzUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzksIDB4MDAwZWI3YzksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDEsIDB4MDAwZWI3ZDEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDUsIDB4MDAwZWI3ZDUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDksIDB4MDAwZWI3ZDksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzYsIDB4MDAwZWI3YzYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2EsIDB4MDAwZWI3Y2EsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2UsIDB4MDAwZWI3Y2UsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDIsIDB4MDAwZWI3ZDIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDYsIDB4MDAwZWI3ZDYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzMsIDB4MDAwZWI3YzMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzcsIDB4MDAwZWI3YzcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2IsIDB4MDAwZWI3Y2IsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2YsIDB4MDAwZWI3Y2YsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDcsIDB4MDAwZWI3ZDcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDliZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODQsIDB4MDAwNTgwODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODgsIDB4MDAwNTgwODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwOGMsIDB4MDAwNTgwOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDAsIDB4MDAwNTgxMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDQsIDB4MDAwNTgxMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDgsIDB4MDAwNTgxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMGMsIDB4MDAwNTgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTAsIDB4MDAwNTgxMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTQsIDB4MDAwNTgxMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODAsIDB4MDAwNTgxODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODQsIDB4MDAwNTgxODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODgsIDB4MDAwNTgxODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOGMsIDB4MDAwNTgxOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTAsIDB4MDAwNTgxOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTQsIDB4MDAwNTgxOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTAsIDB4MDAwNTgxYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMGMsIDB4MDAwNTgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTgsIDB4MDAwNTgxYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODQsIDB4MDAwNTgyODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODgsIDB4MDAwNTgyODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMjQsIDB4MDAwNTgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyOTAsIDB4MDAwNTgyOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDAsIDB4MDAwNTgzMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDQsIDB4MDAwNTgzMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDgsIDB4MDAwNTgzMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMGMsIDB4MDAwNTgzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODAsIDB4MDAwNTgzODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODQsIDB4MDAwNTgzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDAsIDB4MDAwNjg3MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDQsIDB4MDAwNjg3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDgsIDB4MDAwNjg3MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MGMsIDB4MDAwNjg3MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODAsIDB4MDAwNjg3ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODQsIDB4MDAwNjg3ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDAsIDB4MDAwNzhiMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDQsIDB4MDAwNzhiMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDgsIDB4MDAwNzhiMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMGMsIDB4MDAwNzhiMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODAsIDB4MDAwNzhiODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODQsIDB4MDAwNzhiODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODgsIDB4MDAwNzhiODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOGMsIDB4MDAwNzhiOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOTAsIDB4MDAwNzhiOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODAsIDB4MDAwY2FmODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODQsIDB4MDAwY2FmODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODgsIDB4MDAwY2FmODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOGMsIDB4MDAwY2FmOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOTAsIDB4MDAwY2FmOTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMGMsIDB4MDAwZGIzMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMTAsIDB4MDAwZGIzMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODQsIDB4MDAwZGIzODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODgsIDB4MDAwZGIzODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMjQsIDB4MDAwZGIzMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MDQsIDB4MDAwZWI3MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTQsIDB4MDAwZWI2YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTgsIDB4MDAwZWI2YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTAsIDB4MDAwZWI3MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTQsIDB4MDAwZWI3MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjAsIDB4MDAwZWI3MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjQsIDB4MDAwZWI3MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjgsIDB4MDAwZWI3MjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MmMsIDB4MDAwZWI3MmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTAsIDB4MDAwZWI3YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFhZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTQsIDB4MDAwZWI3YTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTgsIDB4MDAwZWI3YTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjAsIDB4MDAwZWI3YjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjQsIDB4MDAwZWI3YjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjgsIDB4MDAwZWI3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTUsIDB4MDAwZWI3YTUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTksIDB4MDAwZWI3YTksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YWQsIDB4MDAwZWI3YWQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjEsIDB4MDAwZWI3YjEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjUsIDB4MDAwZWI3YjUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjksIDB4MDAwZWI3YjksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzUsIDB4MDAwZWI3YzUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzksIDB4MDAwZWI3YzksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDEsIDB4MDAwZWI3ZDEsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDUsIDB4MDAwZWI3ZDUsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDksIDB4MDAwZWI3ZDksIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzYsIDB4MDAwZWI3YzYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2EsIDB4MDAwZWI3Y2EsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2UsIDB4MDAwZWI3Y2UsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDIsIDB4MDAwZWI3ZDIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDYsIDB4MDAwZWI3ZDYsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzMsIDB4MDAwZWI3YzMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzcsIDB4MDAwZWI3YzcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2IsIDB4MDAwZWI3Y2IsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2YsIDB4MDAwZWI3Y2YsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDcsIDB4MDAwZWI3ZDcsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGFiZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMGEyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAgfSwKLSAgICB7IDB4MDAwMGIyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAgfSwKLSAgICB7IDB4MDAwMGEyMWMsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEsIDB4MTg4MzgwMGEgfSwKLSAgICB7IDB4MDAwMGEyMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTAsIDB4MDAwNGYwMDAsIDB4MDAwNGYwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAgfSwKLSAgICB7IDB4MDAwMGEzNTgsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMDIsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUsIDB4Nzk5OWFhMGUgfSwKKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MCwgMHgwMDAwMDFlMH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGMsIDB4MDAwMDAxZTB9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwZTYwLCAweDAwMDAxY2MwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4LCAweDAwMDAxMTgwfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDgwMTQsIDB4MDNlODAzZTgsIDB4MDdkMDA3ZDAsIDB4MTA4MDE2MDAsIDB4MDg0MDBiMDAsIDB4MDZlMDA2ZTB9LAorCXsweDAwMDA4MDFjLCAweDEyOGQ4MDI3LCAweDEyOGQ4MDRmLCAweDEyZTAwMDU3LCAweDEyZTAwMDJiLCAweDA5ODgwMDRmfSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwM2U4MCwgMHgwMDAwN2QwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MCwgMHgwMDAwNjg4MH0sCisJezB4MDAwMDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzMDN9LAorCXsweDAwMDA5ODIwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwfSwKKwl7MHgwMDAwOTgyNCwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZX0sCisJezB4MDAwMDk4MjgsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDEsIDB4M2EwMjAwMDF9LAorCXsweDAwMDA5ODM0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlfSwKKwl7MHgwMDAwOTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwN30sCisJezB4MDAwMDk4NDAsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmV9LAorCXsweDAwMDA5ODQ0LCAweDAzNzIxNjFlLCAweDAzNzIxNjFlLCAweDAzNzIxNjIwLCAweDAzNzIxNjIwLCAweDAzNzIxNmEwfSwKKwl7MHgwMDAwOTg0OCwgMHgwMDAwMTA2NiwgMHgwMDAwMTA2NiwgMHgwMDAwMTA1MywgMHgwMDAwMTA1MywgMHgwMDAwMTA1OX0sCisJezB4MDAwMGE4NDgsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNjYsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTMsIDB4MDAwMDEwNTl9LAorCXsweDAwMDA5ODUwLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyfSwKKwl7MHgwMDAwOTg1OCwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCisJezB4MDAwMDk4NWMsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzNzYwNWUsIDB4MzEzOTYwNWV9LAorCXsweDAwMDA5ODYwLCAweDAwMDU4ZDE4LCAweDAwMDU4ZDE4LCAweDAwMDU4ZDE4LCAweDAwMDU4ZDE4LCAweDAwMDU4ZDE4fSwKKwl7MHgwMDAwOTg2NCwgMHgwMDAwZmUwMCwgMHgwMDAwZmUwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMH0sCisJezB4MDAwMDk4NjgsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAorCXsweDAwMDA5ODZjLCAweDA2OTAzMDgxLCAweDA2OTAzMDgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKKwl7MHgwMDAwOTkxMCwgMHgzMDAwMjMxMCwgMHgzMDAwMjMxMCwgMHgzMDAwMjMxMCwgMHgzMDAwMjMxMCwgMHgzMDAwMjMxMH0sCisJezB4MDAwMDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTgsIDB4MDAwMDA3ZDB9LAorCXsweDAwMDA5OTE4LCAweDAwMDAwMDBhLCAweDAwMDAwMDE0LCAweDAwMDAwMDE2LCAweDAwMDAwMDBiLCAweDAwMDAwMDE2fSwKKwl7MHgwMDAwOTkyNCwgMHhkMDBhODAwNywgMHhkMDBhODAwNywgMHhkMDBhODAwZCwgMHhkMDBhODAwZCwgMHhkMDBhODAwZH0sCisJezB4MDAwMDk5NDQsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMTAsIDB4ZmZiYzEwMjAsIDB4ZmZiYzEwMjAsIDB4ZmZiYzEwMTB9LAorCXsweDAwMDA5OTYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5YjgsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWMsIDB4MDAwMDQyMWN9LAorCXsweDAwMDA5OWJjLCAweDAwMDAwNjAwLCAweDAwMDAwNjAwLCAweDAwMDAwYzAwLCAweDAwMDAwYzAwLCAweDAwMDAwYzAwfSwKKwl7MHgwMDAwOTljMCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNH0sCisJezB4MDAwMDk5YzQsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzd9LAorCXsweDAwMDA5OWM4LCAweDZhZjY1MzJmLCAweDZhZjY1MzJmLCAweDZhZjY1MzJmLCAweDZhZjY1MzJmLCAweDZhZjY1MzJmfSwKKwl7MHgwMDAwOTljYywgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOH0sCisJezB4MDAwMDk5ZDAsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODR9LAorCXsweDAwMDA5OWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODQsIDB4MDAwNTgwODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MDg4LCAweDAwMDU4MDg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODA4YywgMHgwMDA1ODA4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDAsIDB4MDAwNTgxMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTA0LCAweDAwMDU4MTA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWExNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODEwOCwgMHgwMDA1ODEwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMGMsIDB4MDAwNTgxMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTEwLCAweDAwMDU4MTEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODExNCwgMHgwMDA1ODExNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODAsIDB4MDAwNTgxODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTg0LCAweDAwMDU4MTg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE4OCwgMHgwMDA1ODE4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOGMsIDB4MDAwNTgxOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTkwLCAweDAwMDU4MTkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWEzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE5NCwgMHgwMDA1ODE5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxYTAsIDB4MDAwNTgxYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MjBjLCAweDAwMDU4MjBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODFhOCwgMHgwMDA1ODFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODQsIDB4MDAwNTgyODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4Mjg4LCAweDAwMDU4Mjg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODIyNCwgMHgwMDA1ODIyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyOTAsIDB4MDAwNTgyOTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzAwLCAweDAwMDU4MzAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODMwNCwgMHgwMDA1ODMwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDgsIDB4MDAwNTgzMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzBjLCAweDAwMDU4MzBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODM4MCwgMHgwMDA1ODM4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzODQsIDB4MDAwNTgzODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzAwLCAweDAwMDY4NzAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwNCwgMHgwMDA2ODcwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDgsIDB4MDAwNjg3MDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzBjLCAweDAwMDY4NzBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4MCwgMHgwMDA2ODc4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3ODQsIDB4MDAwNjg3ODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjAwLCAweDAwMDc4YjAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGIwNCwgMHgwMDA3OGIwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDgsIDB4MDAwNzhiMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YTk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjBjLCAweDAwMDc4YjBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWE5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI4MCwgMHgwMDA3OGI4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODQsIDB4MDAwNzhiODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4Yjg4LCAweDAwMDc4Yjg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI4YywgMHgwMDA3OGI4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiOTAsIDB4MDAwNzhiOTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjgwLCAweDAwMGNhZjgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBjYWY4NCwgMHgwMDBjYWY4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODgsIDB4MDAwY2FmODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjhjLCAweDAwMGNhZjhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBjYWY5MCwgMHgwMDBjYWY5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMGMsIDB4MDAwZGIzMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGRiMzEwLCAweDAwMGRiMzEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjM4NCwgMHgwMDBkYjM4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzODgsIDB4MDAwZGIzODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGRiMzI0LCAweDAwMGRiMzI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcwNCwgMHgwMDBlYjcwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTQsIDB4MDAwZWI2YTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNmE4LCAweDAwMGViNmE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcxMCwgMHgwMDBlYjcxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MTQsIDB4MDAwZWI3MTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzIwLCAweDAwMGViNzIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcyNCwgMHgwMDBlYjcyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjgsIDB4MDAwZWI3MjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YWY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzJjLCAweDAwMGViNzJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWFmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhMCwgMHgwMDBlYjdhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDlhZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTQsIDB4MDAwZWI3YTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2E4LCAweDAwMGViN2E4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiMCwgMHgwMDBlYjdiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjQsIDB4MDAwZWI3YjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2I4LCAweDAwMGViN2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhNSwgMHgwMDBlYjdhNSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTksIDB4MDAwZWI3YTksIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2FkLCAweDAwMGViN2FkLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiMSwgMHgwMDBlYjdiMSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjUsIDB4MDAwZWI3YjUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2I5LCAweDAwMGViN2I5LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjNSwgMHgwMDBlYjdjNSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzksIDB4MDAwZWI3YzksIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2QxLCAweDAwMGViN2QxLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWIzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkNSwgMHgwMDBlYjdkNSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDksIDB4MDAwZWI3ZDksIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2M2LCAweDAwMGViN2M2LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjYSwgMHgwMDBlYjdjYSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2UsIDB4MDAwZWI3Y2UsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2QyLCAweDAwMGViN2QyLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI0YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkNiwgMHgwMDBlYjdkNiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzMsIDB4MDAwZWI3YzMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2M3LCAweDAwMGViN2M3LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjYiwgMHgwMDBlYjdjYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3Y2YsIDB4MDAwZWI3Y2YsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2Q3LCAweDAwMGViN2Q3LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI3MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliNzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5Yjc4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5Yjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWI5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliOTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YjljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJhYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJiOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJjNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliYzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJkMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmQ4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJkYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJlOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmYwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWJmNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDliZjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YmZjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODA4NCwgMHgwMDA1ODA4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgwODgsIDB4MDAwNTgwODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MDhjLCAweDAwMDU4MDhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODEwMCwgMHgwMDA1ODEwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMDQsIDB4MDAwNTgxMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTA4LCAweDAwMDU4MTA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWExOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODEwYywgMHgwMDA1ODEwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxMTAsIDB4MDAwNTgxMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTE0LCAweDAwMDU4MTE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE4MCwgMHgwMDA1ODE4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxODQsIDB4MDAwNTgxODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTg4LCAweDAwMDU4MTg4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODE4YywgMHgwMDA1ODE4YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgxOTAsIDB4MDAwNTgxOTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MTk0LCAweDAwMDU4MTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWEzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODFhMCwgMHgwMDA1ODFhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyMGMsIDB4MDAwNTgyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MWE4LCAweDAwMDU4MWE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE0OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODI4NCwgMHgwMDA1ODI4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgyODgsIDB4MDAwNTgyODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MjI0LCAweDAwMDU4MjI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE1NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODI5MCwgMHgwMDA1ODI5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMDAsIDB4MDAwNTgzMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzA0LCAweDAwMDU4MzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE2MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODMwOCwgMHgwMDA1ODMwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNTgzMGMsIDB4MDAwNTgzMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDU4MzgwLCAweDAwMDU4MzgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE2YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA1ODM4NCwgMHgwMDA1ODM4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhNzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MDAsIDB4MDAwNjg3MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzA0LCAweDAwMDY4NzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODcwOCwgMHgwMDA2ODcwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhN2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNjg3MGMsIDB4MDAwNjg3MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDY4NzgwLCAweDAwMDY4NzgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA2ODc4NCwgMHgwMDA2ODc4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMDAsIDB4MDAwNzhiMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjA0LCAweDAwMDc4YjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGIwOCwgMHgwMDA3OGIwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhOTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiMGMsIDB4MDAwNzhiMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjgwLCAweDAwMDc4YjgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWE5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI4NCwgMHgwMDA3OGI4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNzhiODgsIDB4MDAwNzhiODgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDc4YjhjLCAweDAwMDc4YjhjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA3OGI5MCwgMHgwMDA3OGI5MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmODAsIDB4MDAwY2FmODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjg0LCAweDAwMGNhZjg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBjYWY4OCwgMHgwMDBjYWY4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwY2FmOGMsIDB4MDAwY2FmOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGNhZjkwLCAweDAwMGNhZjkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjMwYywgMHgwMDBkYjMwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMTAsIDB4MDAwZGIzMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGRiMzg0LCAweDAwMGRiMzg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFjYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBkYjM4OCwgMHgwMDBkYjM4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZGIzMjQsIDB4MDAwZGIzMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzA0LCAweDAwMGViNzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjZhNCwgMHgwMDBlYjZhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI2YTgsIDB4MDAwZWI2YTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzEwLCAweDAwMGViNzEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFlNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcxNCwgMHgwMDBlYjcxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MjAsIDB4MDAwZWI3MjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWVjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViNzI0LCAweDAwMGViNzI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjcyOCwgMHgwMDBlYjcyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFhZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3MmMsIDB4MDAwZWI3MmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYWY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2EwLCAweDAwMGViN2EwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWFmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhNCwgMHgwMDBlYjdhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YTgsIDB4MDAwZWI3YTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2IwLCAweDAwMGViN2IwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiNCwgMHgwMDBlYjdiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjgsIDB4MDAwZWI3YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2E1LCAweDAwMGViN2E1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdhOSwgMHgwMDBlYjdhOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YWQsIDB4MDAwZWI3YWQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2IxLCAweDAwMGViN2IxLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdiNSwgMHgwMDBlYjdiNSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YjksIDB4MDAwZWI3YjksIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2M1LCAweDAwMGViN2M1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjOSwgMHgwMDBlYjdjOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiMzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDEsIDB4MDAwZWI3ZDEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2Q1LCAweDAwMGViN2Q1LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWIzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkOSwgMHgwMDBlYjdkOSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiM2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzYsIDB4MDAwZWI3YzYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2NhLCAweDAwMGViN2NhLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI0NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjZSwgMHgwMDBlYjdjZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDIsIDB4MDAwZWI3ZDIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2Q2LCAweDAwMGViN2Q2LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjMywgMHgwMDBlYjdjMywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3YzcsIDB4MDAwZWI3YzcsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2NiLCAweDAwMGViN2NiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI1YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdjZiwgMHgwMDBlYjdjZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZDcsIDB4MDAwZWI3ZDcsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjcwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI3NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiNzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjdjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI4MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiOTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYjk0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWI5OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiOWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmI4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiY2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJlMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJlYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhYmY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMGViN2RiLCAweDAwMGViN2RiLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWJmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDBlYjdkYiwgMHgwMDBlYjdkYiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFiZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwZWI3ZGIsIDB4MDAwZWI3ZGIsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwYTIwYywgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAxZjAwMCwgMHgwMDAxZjAwMCwgMHgwMDAxZjAwMH0sCisJezB4MDAwMGIyMGMsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDAsIDB4MDAwMWYwMDB9LAorCXsweDAwMDBhMjFjLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhfSwKKwl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNTAsIDB4MDAwNGYwMDAsIDB4MDAwNGYwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDAsIDB4MDAwNGEwMDB9LAorCXsweDAwMDBhMzU4LCAweDc5OTlhYTAyLCAweDc5OTlhYTAyLCAweDc5OTlhYTBlLCAweDc5OTlhYTBlLCAweDc5OTlhYTBlfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjcxQ29tbW9uXzkyNzFbXVsyXSA9IHsKLSAgICB7IDB4MDAwMDAwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwMzAsIDB4MDAwMjAwNDUgfSwKLSAgICB7IDB4MDAwMDAwMzQsIDB4MDAwMDAwMDUgfSwKLSAgICB7IDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNDQsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNDgsIDB4MDAwMDAwMDggfSwKLSAgICB7IDB4MDAwMDAwNGMsIDB4MDAwMDAwMTAgfSwKLSAgICB7IDB4MDAwMDAwNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDAwNTQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDA4MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDA4MjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNDAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNDgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNGMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNTgsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNWMsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjAsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEwNjQsIDB4MDAyZmZjMGYgfSwKLSAgICB7IDB4MDAwMDEyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzNzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE1ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE2ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3MzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3NzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3YjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE3ZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEwZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDExZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEyZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDEzZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDE0N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwMzAsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwM2MsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDQwMjQsIDB4MDAwMDAwMWYgfSwKLSAgICB7IDB4MDAwMDQwNjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDQwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMTgsIDB4MDAwMDA3MDAgfSwKLSAgICB7IDB4MDAwMDgwMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNWMsIDB4MDAwZmM3OGYgfSwKLSAgICB7IDB4MDAwMDgwNjAsIDB4MDAwMDAwMGYgfSwKLSAgICB7IDB4MDAwMDgwNjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwYzAsIDB4MmE4MDAwMWEgfSwKLSAgICB7IDB4MDAwMDgwYzQsIDB4MDVkYzAxZTAgfSwKLSAgICB7IDB4MDAwMDgwYzgsIDB4MWY0MDI3MTAgfSwKLSAgICB7IDB4MDAwMDgwY2MsIDB4MDFmNDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDAsIDB4MDAwMDFlMDAgfSwKLSAgICB7IDB4MDAwMDgwZDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZDgsIDB4MDA0MDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZTAsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTQsIDB4MDAwMGZmZmYgfSwKLSAgICB7IDB4MDAwMDgwZTgsIDB4MDAzZjNmM2YgfSwKLSAgICB7IDB4MDAwMDgwZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgwZmMsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDAsIDB4MDAwMjAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMDQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgxMDgsIDB4MDAwMDAwNTIgfSwKLSAgICB7IDB4MDAwMDgxMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMTAsIDB4MDAwMDAxNjggfSwKLSAgICB7IDB4MDAwMDgxMTgsIDB4MDAwMTAwYWEgfSwKLSAgICB7IDB4MDAwMDgxMWMsIDB4MDAwMDMyMTAgfSwKLSAgICB7IDB4MDAwMDgxMjAsIDB4MDhmMDQ4MTAgfSwKLSAgICB7IDB4MDAwMDgxMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNDQsIDB4ZmZmZmZmZmYgfSwKLSAgICB7IDB4MDAwMDgxNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxNzAsIDB4MzIxNDMzMjAgfSwKLSAgICB7IDB4MDAwMDgxNzQsIDB4ZmFhNGZhNTAgfSwKLSAgICB7IDB4MDAwMDgxNzgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgxN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZDAsIDB4MDAwMDMyMGEgfSwKLSAgICB7IDB4MDAwMDgxZWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgxZmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyMzgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDAsIDB4MDAxMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNDQsIDB4MDAxMGY0MDAgfSwKLSAgICB7IDB4MDAwMDgyNDgsIDB4MDAwMDAxMDAgfSwKLSAgICB7IDB4MDAwMDgyNGMsIDB4MDAwMWU4MDAgfSwKLSAgICB7IDB4MDAwMDgyNTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNWMsIDB4NDAwMDAwZmYgfSwKLSAgICB7IDB4MDAwMDgyNjAsIDB4MDAwODA5MjIgfSwKLSAgICB7IDB4MDAwMDgyNjQsIDB4ODhhMDAwMTAgfSwKLSAgICB7IDB4MDAwMDgyNzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzQsIDB4NDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyNzgsIDB4MDAzZTQxODAgfSwKLSAgICB7IDB4MDAwMDgyN2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyODQsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyODgsIDB4MDAwMDAwMmMgfSwKLSAgICB7IDB4MDAwMDgyOGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgyOWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMDAsIDB4MDAwMDAwNDAgfSwKLSAgICB7IDB4MDAwMDgzMTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzMmMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDgzMzAsIDB4MDAwMDAzMDIgfSwKLSAgICB7IDB4MDAwMDgzMzQsIDB4MDAwMDBlMDAgfSwKLSAgICB7IDB4MDAwMDgzMzgsIDB4MDBmZjAwMDAgfSwKLSAgICB7IDB4MDAwMDgzM2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDgzNDAsIDB4MDAwMTAzODAgfSwKLSAgICB7IDB4MDAwMDgzNDQsIDB4MDA1ODEwNDMgfSwKLSAgICB7IDB4MDAwMDcwMTAsIDB4MDAwMDAwMzAgfSwKLSAgICB7IDB4MDAwMDcwMzQsIDB4MDAwMDAwMDIgfSwKLSAgICB7IDB4MDAwMDcwMzgsIDB4MDAwMDA0YzIgfSwKLSAgICB7IDB4MDAwMDc4MDAsIDB4MDAxNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MDQsIDB4MGU0NTQ4ZDggfSwKLSAgICB7IDB4MDAwMDc4MDgsIDB4NTQyMTQ1MTQgfSwKLSAgICB7IDB4MDAwMDc4MGMsIDB4MDIwMjU4MjAgfSwKLSAgICB7IDB4MDAwMDc4MTAsIDB4NzFjMGQzODggfSwKLSAgICB7IDB4MDAwMDc4MTQsIDB4OTI0OTM0YTggfSwKLSAgICB7IDB4MDAwMDc4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4MjgsIDB4NjY5NjQzMDAgfSwKLSAgICB7IDB4MDAwMDc4MmMsIDB4OGRiNmQ5NjEgfSwKLSAgICB7IDB4MDAwMDc4MzAsIDB4OGRiNmQ5NmMgfSwKLSAgICB7IDB4MDAwMDc4MzQsIDB4NjE0MDAwOGIgfSwKLSAgICB7IDB4MDAwMDc4M2MsIDB4NzJlZTBhNzIgfSwKLSAgICB7IDB4MDAwMDc4NDAsIDB4YmJmZmZmZmMgfSwKLSAgICB7IDB4MDAwMDc4NDQsIDB4MDAwYzBkYjYgfSwKLSAgICB7IDB4MDAwMDc4NDgsIDB4NmRiNjFiNmYgfSwKLSAgICB7IDB4MDAwMDc4NGMsIDB4NmQ5YjY2ZGIgfSwKLSAgICB7IDB4MDAwMDc4NTAsIDB4NmQ4YzZkYmEgfSwKLSAgICB7IDB4MDAwMDc4NTQsIDB4MDAwNDAwMDAgfSwKLSAgICB7IDB4MDAwMDc4NTgsIDB4ZGIwMDMwMTIgfSwKLSAgICB7IDB4MDAwMDc4NWMsIDB4MDQ5MjQ5MTQgfSwKLSAgICB7IDB4MDAwMDc4NjAsIDB4MjEwODQyMTAgfSwKLSAgICB7IDB4MDAwMDc4NjQsIDB4ZjdkN2ZmZGUgfSwKLSAgICB7IDB4MDAwMDc4NjgsIDB4YzIwMzQwODAgfSwKLSAgICB7IDB4MDAwMDc4NzAsIDB4MTAxNDJjMDAgfSwKLSAgICB7IDB4MDAwMDk4MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MGMsIDB4YWZlNjhlMzAgfSwKLSAgICB7IDB4MDAwMDk4MTAsIDB4ZmQxNGUwMDAgfSwKLSAgICB7IDB4MDAwMDk4MTQsIDB4OWMwYTlmNmIgfSwKLSAgICB7IDB4MDAwMDk4MWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4MmMsIDB4MDAwMGEwMDAgfSwKLSAgICB7IDB4MDAwMDk4MzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk4M2MsIDB4MDAyMDA0MDAgfSwKLSAgICB7IDB4MDAwMDk4NGMsIDB4MDA0MDIzM2MgfSwKLSAgICB7IDB4MDAwMDk4NTQsIDB4MDAwMDAwNDQgfSwKLSAgICB7IDB4MDAwMDk5MDAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MDgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MWMsIDB4MTAwMDBmZmYgfSwKLSAgICB7IDB4MDAwMDk5MjAsIDB4MDQ5MDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5MjgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5MmMsIDB4MDAwMDAwMDQgfSwKLSAgICB7IDB4MDAwMDk5MzQsIDB4MWUxZjIwMjIgfSwKLSAgICB7IDB4MDAwMDk5MzgsIDB4MGEwYjBjMGQgfSwKLSAgICB7IDB4MDAwMDk5M2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NDAsIDB4MTQ3NTA2MDQgfSwKLSAgICB7IDB4MDAwMDk5NDgsIDB4OTI4MGMwMGEgfSwKLSAgICB7IDB4MDAwMDk5NGMsIDB4MDAwMjAwMjggfSwKLSAgICB7IDB4MDAwMDk5NTQsIDB4NWYzY2EzZGUgfSwKLSAgICB7IDB4MDAwMDk5NTgsIDB4MDEwOGVjZmYgfSwKLSAgICB7IDB4MDAwMDk5NjgsIDB4MDAwMDAzY2UgfSwKLSAgICB7IDB4MDAwMDk5NzAsIDB4MTkyYmI1MTQgfSwKLSAgICB7IDB4MDAwMDk5NzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5NzgsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5N2MsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ODgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5OWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5YTQsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMDk5YTgsIDB4MjAxZmZmMDAgfSwKLSAgICB7IDB4MDAwMDk5YWMsIDB4MmRlZjA0MDAgfSwKLSAgICB7IDB4MDAwMDk5YjAsIDB4MDMwNTEwMDAgfSwKLSAgICB7IDB4MDAwMDk5YjQsIDB4MDAwMDA4MjAgfSwKLSAgICB7IDB4MDAwMDk5ZGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMDk5ZTQsIDB4YWFhYWFhYWEgfSwKLSAgICB7IDB4MDAwMDk5ZTgsIDB4M2M0NjY0NzggfSwKLSAgICB7IDB4MDAwMDk5ZWMsIDB4MGNjODBjYWEgfSwKLSAgICB7IDB4MDAwMDk5ZjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMDgsIDB4ODAzZTY4YzggfSwKLSAgICB7IDB4MDAwMGEyMTAsIDB4NDA4MGEzMzMgfSwKLSAgICB7IDB4MDAwMGEyMTQsIDB4MDAyMDZjMTAgfSwKLSAgICB7IDB4MDAwMGEyMTgsIDB4MDA5YzQwNjAgfSwKLSAgICB7IDB4MDAwMGEyMjAsIDB4MDE4MzQwNjEgfSwKLSAgICB7IDB4MDAwMGEyMjQsIDB4MDAwMDA0MDAgfSwKLSAgICB7IDB4MDAwMGEyMjgsIDB4MDAwMDAzYjUgfSwKLSAgICB7IDB4MDAwMGEyMmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyMzQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyMzgsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEyNDQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNDgsIDB4ZmZmZmZmZmMgfSwKLSAgICB7IDB4MDAwMGEyNGMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNTgsIDB4MGNjYjUzODAgfSwKLSAgICB7IDB4MDAwMGEyNWMsIDB4MTUxNTE1MDEgfSwKLSAgICB7IDB4MDAwMGEyNjAsIDB4ZGZhOTBmMDEgfSwKLSAgICB7IDB4MDAwMGEyNjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEyNmMsIDB4MGViYWU5ZTYgfSwKLSAgICB7IDB4MDAwMGEzODgsIDB4MGMwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzOGMsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOTAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzOWMsIDB4MDAwMDAwMDEgfSwKLSAgICB7IDB4MDAwMGEzYTAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYTgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYWMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYjgsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYmMsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzAsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzYzQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzY2MsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDAsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZDQsIDB4MjAyMDIwMjAgfSwKLSAgICB7IDB4MDAwMGEzZTQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGEzZTgsIDB4MThjNDM0MzMgfSwKLSAgICB7IDB4MDAwMGEzZWMsIDB4MDBmNzAwODEgfSwKLSAgICB7IDB4MDAwMGEzZjAsIDB4MDEwMzZhMmYgfSwKLSAgICB7IDB4MDAwMGEzZjQsIDB4MDAwMDAwMDAgfSwKLSAgICB7IDB4MDAwMGQyNzAsIDB4MGQ4MjA4MjAgfSwKLSAgICB7IDB4MDAwMGQzNWMsIDB4MDdmZmZmZWYgfSwKLSAgICB7IDB4MDAwMGQzNjAsIDB4MGZmZmZmZTcgfSwKLSAgICB7IDB4MDAwMGQzNjQsIDB4MTdmZmZmZTUgfSwKLSAgICB7IDB4MDAwMGQzNjgsIDB4MWZmZmZmZTQgfSwKLSAgICB7IDB4MDAwMGQzNmMsIDB4MzdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzAsIDB4M2ZmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzQsIDB4NTdmZmZmZTMgfSwKLSAgICB7IDB4MDAwMGQzNzgsIDB4NWZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzN2MsIDB4N2ZmZmZmZTIgfSwKLSAgICB7IDB4MDAwMGQzODAsIDB4N2YzYzdiYmEgfSwKLSAgICB7IDB4MDAwMGQzODQsIDB4ZjMzMDdmZjAgfSwKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDAwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDMwLCAweDAwMDIwMDQ1fSwKKwl7MHgwMDAwMDAzNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ0LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0OCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNGMsIDB4MDAwMDAwMTB9LAorCXsweDAwMDAwMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA1NCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDA4MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwODFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDgyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDA4MjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDQwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDRjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDY0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTIzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMGY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMjc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTM3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxM2Y4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTRmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1MzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTViOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE1ZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTY3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE2YjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTczOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE3NzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxN2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTdmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTE3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDExYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTIzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMzdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEzZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQ3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDQwMzAsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA0MDNjLCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwNDAyNCwgMHgwMDAwMDAxZn0sCisJezB4MDAwMDQwNjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA0MDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAxOCwgMHgwMDAwMDcwMH0sCisJezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAorCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBjMCwgMHgyYTgwMDAxYX0sCisJezB4MDAwMDgwYzQsIDB4MDVkYzAxZTB9LAorCXsweDAwMDA4MGM4LCAweDFmNDAyNzEwfSwKKwl7MHgwMDAwODBjYywgMHgwMWY0MDAwMH0sCisJezB4MDAwMDgwZDAsIDB4MDAwMDFlMDB9LAorCXsweDAwMDA4MGQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBkOCwgMHgwMDQwMDAwMH0sCisJezB4MDAwMDgwZTAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MGU0LCAweDAwMDBmZmZmfSwKKwl7MHgwMDAwODBlOCwgMHgwMDNmM2YzZn0sCisJezB4MDAwMDgwZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGZjLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwMCwgMHgwMDAyMDAwMH0sCisJezB4MDAwMDgxMDQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA4MTA4LCAweDAwMDAwMDUyfSwKKwl7MHgwMDAwODEwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMTAsIDB4MDAwMDAxNjh9LAorCXsweDAwMDA4MTE4LCAweDAwMDEwMGFhfSwKKwl7MHgwMDAwODExYywgMHgwMDAwMzIxMH0sCisJezB4MDAwMDgxMjAsIDB4MDhmMDQ4MTB9LAorCXsweDAwMDA4MTI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE0NCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgxNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE3MCwgMHgzMjE0MzMyMH0sCisJezB4MDAwMDgxNzQsIDB4ZmFhNGZhNTB9LAorCXsweDAwMDA4MTc4LCAweDAwMDAwMTAwfSwKKwl7MHgwMDAwODE3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWQwLCAweDAwMDAzMjBhfSwKKwl7MHgwMDAwODFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODIzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI0MCwgMHgwMDEwMDAwMH0sCisJezB4MDAwMDgyNDQsIDB4MDAxMGY0MDB9LAorCXsweDAwMDA4MjQ4LCAweDAwMDAwMTAwfSwKKwl7MHgwMDAwODI0YywgMHgwMDAxZTgwMH0sCisJezB4MDAwMDgyNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNWMsIDB4NDAwMDAwZmZ9LAorCXsweDAwMDA4MjYwLCAweDAwMDgwOTIyfSwKKwl7MHgwMDAwODI2NCwgMHg4OGEwMDAxMH0sCisJezB4MDAwMDgyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjc0LCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI3OCwgMHgwMDNlNDE4MH0sCisJezB4MDAwMDgyN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjg0LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4OCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyOGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMDQwfSwKKwl7MHgwMDAwODMxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzJjLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwODMzMCwgMHgwMDAwMDMwMn0sCisJezB4MDAwMDgzMzQsIDB4MDAwMDBlMDB9LAorCXsweDAwMDA4MzM4LCAweDAwZmYwMDAwfSwKKwl7MHgwMDAwODMzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNDAsIDB4MDAwMTAzODB9LAorCXsweDAwMDA4MzQ0LCAweDAwNTgxMDQzfSwKKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAzMH0sCisJezB4MDAwMDcwMzQsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwNzgwMCwgMHgwMDE0MDAwMH0sCisJezB4MDAwMDc4MDQsIDB4MGU0NTQ4ZDh9LAorCXsweDAwMDA3ODA4LCAweDU0MjE0NTE0fSwKKwl7MHgwMDAwNzgwYywgMHgwMjAyNTgyMH0sCisJezB4MDAwMDc4MTAsIDB4NzFjMGQzODh9LAorCXsweDAwMDA3ODE0LCAweDkyNDkzNGE4fSwKKwl7MHgwMDAwNzgxYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDc4MjgsIDB4NjY5NjQzMDB9LAorCXsweDAwMDA3ODJjLCAweDhkYjZkOTYxfSwKKwl7MHgwMDAwNzgzMCwgMHg4ZGI2ZDk2Y30sCisJezB4MDAwMDc4MzQsIDB4NjE0MDAwOGJ9LAorCXsweDAwMDA3ODNjLCAweDcyZWUwYTcyfSwKKwl7MHgwMDAwNzg0MCwgMHhiYmZmZmZmY30sCisJezB4MDAwMDc4NDQsIDB4MDAwYzBkYjZ9LAorCXsweDAwMDA3ODQ4LCAweDZkYjYyNDZmfSwKKwl7MHgwMDAwNzg0YywgMHg2ZDliNjZkYn0sCisJezB4MDAwMDc4NTAsIDB4NmQ4YzZkYmF9LAorCXsweDAwMDA3ODU0LCAweDAwMDQwMDAwfSwKKwl7MHgwMDAwNzg1OCwgMHhkYjAwMzAxMn0sCisJezB4MDAwMDc4NWMsIDB4MDQ5MjQ5MTR9LAorCXsweDAwMDA3ODYwLCAweDIxMDg0MjEwfSwKKwl7MHgwMDAwNzg2NCwgMHhmN2Q3ZmZkZX0sCisJezB4MDAwMDc4NjgsIDB4YzIwMzQwODB9LAorCXsweDAwMDA3ODcwLCAweDEwMTQyYzAwfSwKKwl7MHgwMDAwOTgwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MGMsIDB4YWZlNjhlMzB9LAorCXsweDAwMDA5ODEwLCAweGZkMTRlMDAwfSwKKwl7MHgwMDAwOTgxNCwgMHg5YzBhOWY2Yn0sCisJezB4MDAwMDk4MWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ODJjLCAweDAwMDBhMDAwfSwKKwl7MHgwMDAwOTgzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4M2MsIDB4MDAyMDA0MDB9LAorCXsweDAwMDA5ODRjLCAweDAwNDAyMzNjfSwKKwl7MHgwMDAwOTg1NCwgMHgwMDAwMDA0NH0sCisJezB4MDAwMDk5MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTkwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTFjLCAweDEwMDAwZmZmfSwKKwl7MHgwMDAwOTkyMCwgMHgwNDkwMDAwMH0sCisJezB4MDAwMDk5MjgsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OTJjLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwOTkzNCwgMHgxZTFmMjAyMn0sCisJezB4MDAwMDk5MzgsIDB4MGEwYjBjMGR9LAorCXsweDAwMDA5OTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk0MCwgMHgxNDc1MDYwNH0sCisJezB4MDAwMDk5NDgsIDB4OTI4MGMwMGF9LAorCXsweDAwMDA5OTRjLCAweDAwMDIwMDI4fSwKKwl7MHgwMDAwOTk1NCwgMHg1ZjNjYTNkZX0sCisJezB4MDAwMDk5NTgsIDB4MDEwOGVjZmZ9LAorCXsweDAwMDA5OTY4LCAweDAwMDAwM2NlfSwKKwl7MHgwMDAwOTk3MCwgMHgxOTJiYjUxNH0sCisJezB4MDAwMDk5NzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTc4LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwOTk3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk4OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTkwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTk5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5OTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OTljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTlhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5YTQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDA5OWE4LCAweDIwMWZmZjAwfSwKKwl7MHgwMDAwOTlhYywgMHgyZGVmMDQwMH0sCisJezB4MDAwMDk5YjAsIDB4MDMwNTEwMDB9LAorCXsweDAwMDA5OWI0LCAweDAwMDAwODIwfSwKKwl7MHgwMDAwOTlkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk5ZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OWU0LCAweGFhYWFhYWFhfSwKKwl7MHgwMDAwOTllOCwgMHgzYzQ2NjQ3OH0sCisJezB4MDAwMDk5ZWMsIDB4MGNjODBjYWF9LAorCXsweDAwMDA5OWYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIwOCwgMHg4MDNlNjhjOH0sCisJezB4MDAwMGEyMTAsIDB4NDA4MGEzMzN9LAorCXsweDAwMDBhMjE0LCAweDAwMjA2YzEwfSwKKwl7MHgwMDAwYTIxOCwgMHgwMDljNDA2MH0sCisJezB4MDAwMGEyMjAsIDB4MDE4MzQwNjF9LAorCXsweDAwMDBhMjI0LCAweDAwMDAwNDAwfSwKKwl7MHgwMDAwYTIyOCwgMHgwMDAwMDNiNX0sCisJezB4MDAwMGEyMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjM0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTIzOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEyNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjQ4LCAweGZmZmZmZmZjfSwKKwl7MHgwMDAwYTI0YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjU4LCAweDBjY2I1MzgwfSwKKwl7MHgwMDAwYTI1YywgMHgxNTE1MTUwMX0sCisJezB4MDAwMGEyNjAsIDB4ZGZhOTBmMDF9LAorCXsweDAwMDBhMjY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI2YywgMHgwZWJhZTllNn0sCisJezB4MDAwMGEzODgsIDB4MGMwMDAwMDB9LAorCXsweDAwMDBhMzhjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTM5MCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzOWMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhM2EwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2FjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2M0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNjYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzZTgsIDB4MThjNDM0MzN9LAorCXsweDAwMDBhM2VjLCAweDAwZjcwMDgxfSwKKwl7MHgwMDAwYTNmMCwgMHgwMTAzNmEyZn0sCisJezB4MDAwMGEzZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBkMjcwLCAweDBkODIwODIwfSwKKwl7MHgwMDAwZDM1YywgMHgwN2ZmZmZlZn0sCisJezB4MDAwMGQzNjAsIDB4MGZmZmZmZTd9LAorCXsweDAwMDBkMzY0LCAweDE3ZmZmZmU1fSwKKwl7MHgwMDAwZDM2OCwgMHgxZmZmZmZlNH0sCisJezB4MDAwMGQzNmMsIDB4MzdmZmZmZTN9LAorCXsweDAwMDBkMzcwLCAweDNmZmZmZmUzfSwKKwl7MHgwMDAwZDM3NCwgMHg1N2ZmZmZlM30sCisJezB4MDAwMGQzNzgsIDB4NWZmZmZmZTJ9LAorCXsweDAwMDBkMzdjLCAweDdmZmZmZmUyfSwKKwl7MHgwMDAwZDM4MCwgMHg3ZjNjN2JiYX0sCisJezB4MDAwMGQzODQsIDB4ZjMzMDdmZjB9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyNzFDb21tb25fbm9ybWFsX2Nja19maXJfY29lZmZfOTI3MVtdWzJdID0gewotICAgIHsgMHgwMDAwYTFmNCwgMHgwMGZmZmVmZiB9LAotICAgIHsgMHgwMDAwYTFmOCwgMHgwMGY1ZjlmZiB9LAotICAgIHsgMHgwMDAwYTFmYywgMHhiNzlmNjQyNyB9LAorCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwYTFmNCwgMHgwMGZmZmVmZn0sCisJezB4MDAwMGExZjgsIDB4MDBmNWY5ZmZ9LAorCXsweDAwMDBhMWZjLCAweGI3OWY2NDI3fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjcxQ29tbW9uX2phcGFuXzI0ODRfY2NrX2Zpcl9jb2VmZl85MjcxW11bMl0gPSB7Ci0gICAgeyAweDAwMDBhMWY0LCAweDAwMDAwMDAwIH0sCi0gICAgeyAweDAwMDBhMWY4LCAweGVmZmYwMzAxIH0sCi0gICAgeyAweDAwMDBhMWZjLCAweGNhOTIyOGVlIH0sCisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMWY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFmOCwgMHhlZmZmMDMwMX0sCisJezB4MDAwMGExZmMsIDB4Y2E5MjI4ZWV9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyNzFNb2Rlc185MjcxXzFfMF9vbmx5W11bNl0gPSB7Ci0gICAgeyAweDAwMDA5OTEwLCAweDMwMDAyMzExLCAweDMwMDAyMzExLCAweDMwMDAyMzExLCAweDMwMDAyMzExLCAweDMwMDAyMzExIH0sCi0gICAgeyAweDAwMDA5ODI4LCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxIH0sCisJezB4MDAwMDk5MTAsIDB4MzAwMDIzMTEsIDB4MzAwMDIzMTEsIDB4MzAwMDIzMTEsIDB4MzAwMDIzMTEsIDB4MzAwMDIzMTF9LAorCXsweDAwMDA5ODI4LCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjcxTW9kZXNfOTI3MV9BTklfcmVnW11bNl0gPSB7Ci0gICAgeyAweDAwMDA5ODUwLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyIH0sCi0gICAgeyAweDAwMDA5ODVjLCAweDMxMzk2MDVlLCAweDMxMzk2MDVlLCAweDMxMzc2MDVlLCAweDMxMzc2MDVlLCAweDMxMzk2MDVlIH0sCi0gICAgeyAweDAwMDA5ODU4LCAweDdlYzg0ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg0ZDJlIH0sCi0gICAgeyAweDAwMDA5ODZjLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxIH0sCi0gICAgeyAweDAwMDA5ODY4LCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwIH0sCi0gICAgeyAweDAwMDBhMjA4LCAweDgwM2U2OGM4LCAweDgwM2U2OGM4LCAweDgwM2U2OGM4LCAweDgwM2U2OGM4LCAweDgwM2U2OGM4IH0sCi0gICAgeyAweDAwMDA5OTI0LCAweGQwMGE4MDA3LCAweGQwMGE4MDA3LCAweGQwMGE4MDBkLCAweGQwMGE4MDBkLCAweGQwMGE4MDBkIH0sCi0gICAgeyAweDAwMDA5OWMwLCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0IH0sCisJezB4MDAwMDk4NTAsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTJ9LAorCXsweDAwMDA5ODVjLCAweDMxMzk2MDVlLCAweDMxMzk2MDVlLCAweDMxMzc2MDVlLCAweDMxMzc2MDVlLCAweDMxMzk2MDVlfSwKKwl7MHgwMDAwOTg1OCwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCisJezB4MDAwMDk4NmMsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODF9LAorCXsweDAwMDA5ODY4LCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwfSwKKwl7MHgwMDAwYTIwOCwgMHg4MDNlNjhjOCwgMHg4MDNlNjhjOCwgMHg4MDNlNjhjOCwgMHg4MDNlNjhjOCwgMHg4MDNlNjhjOH0sCisJezB4MDAwMDk5MjQsIDB4ZDAwYTgwMDcsIDB4ZDAwYTgwMDcsIDB4ZDAwYTgwMGQsIDB4ZDAwYTgwMGQsIDB4ZDAwYTgwMGR9LAorCXsweDAwMDA5OWMwLCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5MjcxTW9kZXNfbm9ybWFsX3Bvd2VyX3R4X2dhaW5fOTI3MVtdWzZdID0gewotICAgIHsgMHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwOTIwMCwgMHgwMDAwOTIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDIwOCwgMHgwMDAxMDIwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxOTYwOCwgMHgwMDAxOTYwOCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxZTYxMCwgMHgwMDAxZTYxMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyZDZkMCwgMHgwMDAyZDZkMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzOTc1OCwgMHgwMDAzOTc1OCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzYjc1OSwgMHgwMDAzYjc1OSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzZDc1YSwgMHgwMDAzZDc1YSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0MTc1YywgMHgwMDA0MTc1YywgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0NTc1ZSwgMHgwMDA0NTc1ZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0OTc5ZiwgMHgwMDA0OTc5ZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0ZDdkZiwgMHgwMDA0ZDdkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzOCwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzYywgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0OCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0YywgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSB9LAotICAgIHsgMHgwMDAwNzgyNCwgMHgwMGQ4YWJmZiwgMHgwMGQ4YWJmZiwgMHgwMGQ4YWJmZiwgMHgwMGQ4YWJmZiwgMHgwMGQ4YWJmZiB9LAotICAgIHsgMHgwMDAwNzg2YywgMHg0ODYwOWViNCwgMHg0ODYwOWViNCwgMHg0ODYwOWViNCwgMHg0ODYwOWViNCwgMHg0ODYwOWViNCB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTIxYzY1MiwgMHgwYTIxYzY1MiwgMHgwYTIxODY1MiwgMHgwYTIxODY1MiwgMHgwYTIyYTY1MiB9LAotICAgIHsgMHgwMDAwYTI3OCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTBlODNiZCwgMHgwNTBlODNiZCwgMHgwNTBlODNiZCwgMHgwNTBlODNiZCwgMHgwNTBlODNiZCB9LAotICAgIHsgMHgwMDAwYTM5NCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCB9LAotICAgIHsgMHgwMDAwYTM5OCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCB9LAotICAgIHsgMHgwMDAwYTNkYywgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCB9LAotICAgIHsgMHgwMDAwYTNlMCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCwgMHgwMDAwMDNiZCB9LAorCXsweDAwMDBhMzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwOTIwMCwgMHgwMDAwOTIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAyMDgsIDB4MDAwMTAyMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE5NjA4LCAweDAwMDE5NjA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxZTYxMCwgMHgwMDAxZTYxMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmQ2ZDAsIDB4MDAwMmQ2ZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDM5NzU4LCAweDAwMDM5NzU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzYjc1OSwgMHgwMDAzYjc1OSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwM2Q3NWEsIDB4MDAwM2Q3NWEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDQxNzVjLCAweDAwMDQxNzVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDA0NTc1ZSwgMHgwMDA0NTc1ZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwNDk3OWYsIDB4MDAwNDk3OWYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDRkN2RmLCAweDAwMDRkN2RmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzNCwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzgsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzNjLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ4LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0YywgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNTAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzU0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzgzOCwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOX0sCisJezB4MDAwMDc4MjQsIDB4MDBkOGFiZmYsIDB4MDBkOGFiZmYsIDB4MDBkOGFiZmYsIDB4MDBkOGFiZmYsIDB4MDBkOGFiZmZ9LAorCXsweDAwMDA3ODZjLCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0LCAweDQ4NjA5ZWI0fSwKKwl7MHgwMDAwNzgyMCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNCwgMHgwMDAwMGMwNH0sCisJezB4MDAwMGEyNzQsIDB4MGEyMWM2NTIsIDB4MGEyMWM2NTIsIDB4MGEyMTg2NTIsIDB4MGEyMTg2NTIsIDB4MGEyMmE2NTJ9LAorCXsweDAwMDBhMjc4LCAweDNiZGVmN2JkLCAweDNiZGVmN2JkLCAweDNiZGVmN2JkLCAweDNiZGVmN2JkLCAweDNiZGVmN2JkfSwKKwl7MHgwMDAwYTI3YywgMHgwNTBlODNiZCwgMHgwNTBlODNiZCwgMHgwNTBlODNiZCwgMHgwNTBlODNiZCwgMHgwNTBlODNiZH0sCisJezB4MDAwMGEzOTQsIDB4M2JkZWY3YmQsIDB4M2JkZWY3YmQsIDB4M2JkZWY3YmQsIDB4M2JkZWY3YmQsIDB4M2JkZWY3YmR9LAorCXsweDAwMDBhMzk4LCAweDAwMDAwM2JkLCAweDAwMDAwM2JkLCAweDAwMDAwM2JkLCAweDAwMDAwM2JkLCAweDAwMDAwM2JkfSwKKwl7MHgwMDAwYTNkYywgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZCwgMHgzYmRlZjdiZH0sCisJezB4MDAwMGEzZTAsIDB4MDAwMDAzYmQsIDB4MDAwMDAzYmQsIDB4MDAwMDAzYmQsIDB4MDAwMDAzYmQsIDB4MDAwMDAzYmR9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjkyNzFNb2Rlc19oaWdoX3Bvd2VyX3R4X2dhaW5fOTI3MVtdWzZdID0gewotICAgIHsgMHgwMDAwYTMwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxNjIwMCwgMHgwMDAxNjIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxODIwMSwgMHgwMDAxODIwMSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxYjI0MCwgMHgwMDAxYjI0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxZDI0MSwgMHgwMDAxZDI0MSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxZjYwMCwgMHgwMDAxZjYwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyMjgwMCwgMHgwMDAyMjgwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyNjgwMiwgMHgwMDAyNjgwMiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyYjgwNSwgMHgwMDAyYjgwNSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyZWE0MSwgMHgwMDAyZWE0MSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzOGIwMCwgMHgwMDAzOGIwMCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzYWI0MCwgMHgwMDAzYWI0MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzY2Q4MCwgMHgwMDAzY2Q4MCwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzNCwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzOCwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAzODkxZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTMzYywgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAzYTk1ZSwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0OCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM0YywgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwYTM1NCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMCB9LAotICAgIHsgMHgwMDAwNzgzOCwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiB9LAotICAgIHsgMHgwMDAwNzgyNCwgMHgwMGQ4YTdmZiwgMHgwMGQ4YTdmZiwgMHgwMGQ4YTdmZiwgMHgwMGQ4YTdmZiwgMHgwMGQ4YTdmZiB9LAotICAgIHsgMHgwMDAwNzg2YywgMHgwODYwOWViNiwgMHgwODYwOWViNiwgMHgwODYwOWViYSwgMHgwODYwOWViYSwgMHgwODYwOWViNiB9LAotICAgIHsgMHgwMDAwNzgyMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCB9LAotICAgIHsgMHgwMDAwYTI3NCwgMHgwYTIyYTY1MiwgMHgwYTIyYTY1MiwgMHgwYTIxMjY1MiwgMHgwYTIxMjY1MiwgMHgwYTIyYTY1MiB9LAotICAgIHsgMHgwMDAwYTI3OCwgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNywgMHgwZTczOWNlNyB9LAotICAgIHsgMHgwMDAwYTI3YywgMHgwNTAxODA2MywgMHgwNTAzODA2MywgMHgwNTAxODA2MywgMHgwNTAxODA2MywgMHgwNTAxODA2MyB9LAotICAgIHsgMHgwMDAwYTM5NCwgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MyB9LAotICAgIHsgMHgwMDAwYTM5OCwgMHgwMDAwMDA2MywgMHgwMDAwMDA2MywgMHgwMDAwMDA2MywgMHgwMDAwMDA2MywgMHgwMDAwMDA2MyB9LAotICAgIHsgMHgwMDAwYTNkYywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MyB9LAotICAgIHsgMHgwMDAwYTNlMCwgMHgwMDAwMDA2MywgMHgwMDAwMDA2MywgMHgwMDAwMDA2MywgMHgwMDAwMDA2MywgMHgwMDAwMDA2MyB9LAorCXsweDAwMDBhMzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxNjIwMCwgMHgwMDAxNjIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTgyMDEsIDB4MDAwMTgyMDEsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDFiMjQwLCAweDAwMDFiMjQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxZDI0MSwgMHgwMDAxZDI0MSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMWY2MDAsIDB4MDAwMWY2MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDIyODAwLCAweDAwMDIyODAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAyNjgwMiwgMHgwMDAyNjgwMiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMmI4MDUsIDB4MDAwMmI4MDUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDJlYTQxLCAweDAwMDJlYTQxLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzOGIwMCwgMHgwMDAzOGIwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwM2FiNDAsIDB4MDAwM2FiNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDNjZDgwLCAweDAwMDNjZDgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTMzNCwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAzNjhkZSwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzMzgsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMzg5MWUsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzNjLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDNhOTVlLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0MCwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ4LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0YywgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAzZTlkZiwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNTAsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwM2U5ZGYsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzU0LCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDNlOWRmLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzgzOCwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYn0sCisJezB4MDAwMDc4MjQsIDB4MDBkOGE3ZmYsIDB4MDBkOGE3ZmYsIDB4MDBkOGE3ZmYsIDB4MDBkOGE3ZmYsIDB4MDBkOGE3ZmZ9LAorCXsweDAwMDA3ODZjLCAweDA4NjA5ZWI2LCAweDA4NjA5ZWI2LCAweDA4NjA5ZWJhLCAweDA4NjA5ZWJhLCAweDA4NjA5ZWI2fSwKKwl7MHgwMDAwNzgyMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMCwgMHgwMDAwMGMwMH0sCisJezB4MDAwMGEyNzQsIDB4MGEyMmE2NTIsIDB4MGEyMmE2NTIsIDB4MGEyMTQ2NTIsIDB4MGEyMTQ2NTIsIDB4MGEyMmE2NTJ9LAorCXsweDAwMDBhMjc4LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3LCAweDBlNzM5Y2U3fSwKKwl7MHgwMDAwYTI3YywgMHgwNTAxODA2MywgMHgwNTAzODA2MywgMHgwNTAxODA2MywgMHgwNTAxODA2MywgMHgwNTAxODA2M30sCisJezB4MDAwMGEzOTQsIDB4MDYzMThjNjMsIDB4MDYzMThjNjMsIDB4MDYzMThjNjMsIDB4MDYzMThjNjMsIDB4MDYzMThjNjN9LAorCXsweDAwMDBhMzk4LCAweDAwMDAwMDYzLCAweDAwMDAwMDYzLCAweDAwMDAwMDYzLCAweDAwMDAwMDYzLCAweDAwMDAwMDYzfSwKKwl7MHgwMDAwYTNkYywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2MywgMHgwNjMxOGM2M30sCisJezB4MDAwMGEzZTAsIDB4MDAwMDAwNjMsIDB4MDAwMDAwNjMsIDB4MDAwMDAwNjMsIDB4MDAwMDAwNjMsIDB4MDAwMDAwNjN9LAogfTsKIAotI2VuZGlmIC8qIElOSVRWQUxTXzkwMDJfMTBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMKaW5kZXggMmJlMjBkMi4uNTBkZGEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX21hYy5jCkBAIC0yODcsNiArMjg3LDcgQEAKIAl0cy0+dHNfc2hvcnRyZXRyeSA9IE1TKGFkcy0+ZHNfdHhzdGF0dXMxLCBBUl9SVFNGYWlsQ250KTsKIAl0cy0+dHNfbG9uZ3JldHJ5ID0gTVMoYWRzLT5kc190eHN0YXR1czEsIEFSX0RhdGFGYWlsQ250KTsKIAl0cy0+dHNfdmlydGNvbCA9IE1TKGFkcy0+ZHNfdHhzdGF0dXMxLCBBUl9WaXJ0UmV0cnlDbnQpOworCXRzLT50aWQgPSBNUyhhZHMtPmRzX3R4c3RhdHVzOSwgQVJfVHhUaWQpOwogCXRzLT50c19hbnRlbm5hID0gMDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfcGh5LmMKaW5kZXggZWQzMTRlOC4uYWRiZjAzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX3BoeS5jCkBAIC00NzEsNTIgKzQ3MSw0NyBAQAogc3RhdGljIHZvaWQgYXI5MDAyX2h3X2RvX2dldG5mKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJICAgICAgaW50MTZfdCBuZmFycmF5W05VTV9ORl9SRUFESU5HU10pCiB7Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAJaW50MTZfdCBuZjsKIAogCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DQ0EpLCBBUjkyODBfUEhZX01JTkNDQV9QV1IpOwotCi0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJICAiTkYgY2FsaWJyYXRlZCBbY3RsXSBbY2hhaW4gMF0gaXMgJWRcbiIsIG5mKTsKLQotCWlmIChBUl9TUkVWXzkyNzEoYWgpICYmIChuZiA+PSAtMTE0KSkKLQkJbmYgPSAtMTE2OwotCi0JbmZhcnJheVswXSA9IG5mOwotCi0JaWYgKCFBUl9TUkVWXzkyODUoYWgpICYmICFBUl9TUkVWXzkyNzEoYWgpKSB7Ci0JCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DSDFfQ0NBKSwKLQkJCQlBUjkyODBfUEhZX0NIMV9NSU5DQ0FfUFdSKTsKLQotCQlpZiAobmYgJiAweDEwMCkKLQkJCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkgICJORiBjYWxpYnJhdGVkIFtjdGxdIFtjaGFpbiAxXSBpcyAlZFxuIiwgbmYpOwotCQluZmFycmF5WzFdID0gbmY7Ci0JfQorCW5mYXJyYXlbMF0gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfRVhUX0NDQSksIEFSOTI4MF9QSFlfRVhUX01JTkNDQV9QV1IpOwotCWlmIChuZiAmIDB4MTAwKQotCQluZiA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2V4dF0gW2NoYWluIDBdIGlzICVkXG4iLCBuZik7CisJaWYgKElTX0NIQU5fSFQ0MChhaC0+Y3VyY2hhbikpCisJCW5mYXJyYXlbM10gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKLQlpZiAoQVJfU1JFVl85MjcxKGFoKSAmJiAobmYgPj0gLTExNCkpCi0JCW5mID0gLTExNjsKKwlpZiAoQVJfU1JFVl85Mjg1KGFoKSB8fCBBUl9TUkVWXzkyNzEoYWgpKQorCQlyZXR1cm47CiAKLQluZmFycmF5WzNdID0gbmY7CisJbmYgPSBNUyhSRUdfUkVBRChhaCwgQVJfUEhZX0NIMV9DQ0EpLCBBUjkyODBfUEhZX0NIMV9NSU5DQ0FfUFdSKTsKKwluZmFycmF5WzFdID0gc2lnbl9leHRlbmQobmYsIDkpOwogCi0JaWYgKCFBUl9TUkVWXzkyODUoYWgpICYmICFBUl9TUkVWXzkyNzEoYWgpKSB7Ci0JCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DSDFfRVhUX0NDQSksCi0JCQkJQVI5MjgwX1BIWV9DSDFfRVhUX01JTkNDQV9QV1IpOworCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DSDFfRVhUX0NDQSksIEFSOTI4MF9QSFlfQ0gxX0VYVF9NSU5DQ0FfUFdSKTsKKwlpZiAoSVNfQ0hBTl9IVDQwKGFoLT5jdXJjaGFuKSkKKwkJbmZhcnJheVs0XSA9IHNpZ25fZXh0ZW5kKG5mLCA5KTsKK30KIAotCQlpZiAobmYgJiAweDEwMCkKLQkJCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkgICJORiBjYWxpYnJhdGVkIFtleHRdIFtjaGFpbiAxXSBpcyAlZFxuIiwgbmYpOwotCQluZmFycmF5WzRdID0gbmY7CitzdGF0aWMgdm9pZCBhcjkwMDJfaHdfc2V0X25mX2xpbWl0cyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlpZiAoQVJfU1JFVl85Mjg1KGFoKSkgeworCQlhaC0+bmZfMmcubWF4ID0gQVJfUEhZX0NDQV9NQVhfR09PRF9WQUxfOTI4NV8yR0haOworCQlhaC0+bmZfMmcubWluID0gQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfOTI4NV8yR0haOworCQlhaC0+bmZfMmcubm9taW5hbCA9IEFSX1BIWV9DQ0FfTk9NX1ZBTF85Mjg1XzJHSFo7CisJfSBlbHNlIGlmIChBUl9TUkVWXzkyODcoYWgpKSB7CisJCWFoLT5uZl8yZy5tYXggPSBBUl9QSFlfQ0NBX01BWF9HT09EX1ZBTF85Mjg3XzJHSFo7CisJCWFoLT5uZl8yZy5taW4gPSBBUl9QSFlfQ0NBX01JTl9HT09EX1ZBTF85Mjg3XzJHSFo7CisJCWFoLT5uZl8yZy5ub21pbmFsID0gQVJfUEhZX0NDQV9OT01fVkFMXzkyODdfMkdIWjsKKwl9IGVsc2UgaWYgKEFSX1NSRVZfOTI3MShhaCkpIHsKKwkJYWgtPm5mXzJnLm1heCA9IEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkyNzFfMkdIWjsKKwkJYWgtPm5mXzJnLm1pbiA9IEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzkyNzFfMkdIWjsKKwkJYWgtPm5mXzJnLm5vbWluYWwgPSBBUl9QSFlfQ0NBX05PTV9WQUxfOTI3MV8yR0haOworCX0gZWxzZSB7CisJCWFoLT5uZl8yZy5tYXggPSBBUl9QSFlfQ0NBX01BWF9HT09EX1ZBTF85MjgwXzJHSFo7CisJCWFoLT5uZl8yZy5taW4gPSBBUl9QSFlfQ0NBX01JTl9HT09EX1ZBTF85MjgwXzJHSFo7CisJCWFoLT5uZl8yZy5ub21pbmFsID0gQVJfUEhZX0NDQV9OT01fVkFMXzkyODBfMkdIWjsKKwkJYWgtPm5mXzVnLm1heCA9IEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkyODBfNUdIWjsKKwkJYWgtPm5mXzVnLm1pbiA9IEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzkyODBfNUdIWjsKKwkJYWgtPm5mXzVnLm5vbWluYWwgPSBBUl9QSFlfQ0NBX05PTV9WQUxfOTI4MF81R0haOwogCX0KIH0KIApAQCAtNTMyLDQgKzUyNyw2IEBACiAJcHJpdl9vcHMtPm9sY19pbml0ID0gYXI5MDAyX29sY19pbml0OwogCXByaXZfb3BzLT5jb21wdXRlX3BsbF9jb250cm9sID0gYXI5MDAyX2h3X2NvbXB1dGVfcGxsX2NvbnRyb2w7CiAJcHJpdl9vcHMtPmRvX2dldG5mID0gYXI5MDAyX2h3X2RvX2dldG5mOworCisJYXI5MDAyX2h3X3NldF9uZl9saW1pdHMoYWgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9waHkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfcGh5LmgKaW5kZXggODFiZjZlNS4uYzUxNTFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9waHkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX3BoeS5oCkBAIC0xMTQsNiArMTE0LDEwIEBACiAjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJQV1IgICAgMHgwM0ZDMDAwMAogI2RlZmluZSBBUl9QSFlfRklORF9TSUdfRklSUFdSX1MgIDE4CiAKKyNkZWZpbmUgQVJfUEhZX0ZJTkRfU0lHX0xPVyAgICAgICAgICAgMHg5ODQwCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX0xPVyAgIDB4MDAwMDBGQzBMCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX0xPV19TIDYKKwogI2RlZmluZSBBUl9QSFlfQUdDX0NUTDEgICAgICAgICAgICAgICAgICAweDk4NUMKICNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1cgICAgICAgMHgwMDAwN0Y4MAogI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPV19TICAgICA3CkBAIC0zMjUsNiArMzI5LDkgQEAKICNkZWZpbmUgQVJfUEhZX0VYVF9DQ0FfQ1lDUFdSX1RIUjFfUyAgICA5CiAjZGVmaW5lIEFSX1BIWV9FWFRfQ0NBX1RIUkVTSDYyICAgICAgICAgMHgwMDdGMDAwMAogI2RlZmluZSBBUl9QSFlfRVhUX0NDQV9USFJFU0g2Ml9TICAgICAgIDE2CisjZGVmaW5lIEFSX1BIWV9FWFRfVElNSU5HNV9DWUNQV1JfVEhSMSAgIDB4MDAwMEZFMDBMCisjZGVmaW5lIEFSX1BIWV9FWFRfVElNSU5HNV9DWUNQV1JfVEhSMV9TIDkKKwogI2RlZmluZSBBUl9QSFlfRVhUX01JTkNDQV9QV1IgICAgICAgICAgIDB4RkY4MDAwMDAKICNkZWZpbmUgQVJfUEhZX0VYVF9NSU5DQ0FfUFdSX1MgICAgICAgICAyMwogI2RlZmluZSBBUjkyODBfUEhZX0VYVF9NSU5DQ0FfUFdSICAgICAgIDB4MDFGRjAwMDAKQEAgLTU2OSw0ICs1NzYsMzAgQEAKICNkZWZpbmUgQVJfUEhZX0NIMl9FWFRfTUlOQ0NBX1BXUiAgIDB4RkY4MDAwMDAKICNkZWZpbmUgQVJfUEhZX0NIMl9FWFRfTUlOQ0NBX1BXUl9TIDIzCiAKKyNkZWZpbmUgQVJfUEhZX0NDQV9OT01fVkFMXzU0MTZfMkdIWiAgICAgICAgICAgIC05MAorI2RlZmluZSBBUl9QSFlfQ0NBX05PTV9WQUxfNTQxNl81R0haICAgICAgICAgICAgLTEwMAorI2RlZmluZSBBUl9QSFlfQ0NBX01JTl9HT09EX1ZBTF81NDE2XzJHSFogICAgIC0xMDAKKyNkZWZpbmUgQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfNTQxNl81R0haICAgICAtMTEwCisjZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzU0MTZfMkdIWiAgICAgLTgwCisjZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzU0MTZfNUdIWiAgICAgLTkwCisKKyNkZWZpbmUgQVJfUEhZX0NDQV9OT01fVkFMXzkyODBfMkdIWiAgICAgICAgIC0xMTIKKyNkZWZpbmUgQVJfUEhZX0NDQV9OT01fVkFMXzkyODBfNUdIWiAgICAgICAgIC0xMTIKKyNkZWZpbmUgQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfOTI4MF8yR0haICAtMTI3CisjZGVmaW5lIEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzkyODBfNUdIWiAgLTEyMgorI2RlZmluZSBBUl9QSFlfQ0NBX01BWF9HT09EX1ZBTF85MjgwXzJHSFogIC05NworI2RlZmluZSBBUl9QSFlfQ0NBX01BWF9HT09EX1ZBTF85MjgwXzVHSFogIC0xMDIKKworI2RlZmluZSBBUl9QSFlfQ0NBX05PTV9WQUxfOTI4NV8yR0haICAgICAgICAgICAtMTE4CisjZGVmaW5lIEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzkyODVfMkdIWiAgICAtMTI3CisjZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkyODVfMkdIWiAgICAtMTA4CisKKyNkZWZpbmUgQVJfUEhZX0NDQV9OT01fVkFMXzkyNzFfMkdIWiAgICAgICAgICAgICAtMTE4CisjZGVmaW5lIEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzkyNzFfMkdIWiAgICAgIC0xMjcKKyNkZWZpbmUgQVJfUEhZX0NDQV9NQVhfR09PRF9WQUxfOTI3MV8yR0haICAgICAgLTExNgorCisjZGVmaW5lIEFSX1BIWV9DQ0FfTk9NX1ZBTF85Mjg3XzJHSFogICAgICAgICAgIC0xMjAKKyNkZWZpbmUgQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfOTI4N18yR0haICAgIC0xMjcKKyNkZWZpbmUgQVJfUEhZX0NDQV9NQVhfR09PRF9WQUxfOTI4N18yR0haICAgIC0xMTAKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzXzJwMF9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM18ycDBfaW5pdHZhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM3NWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM18ycDBfaW5pdHZhbHMuaApAQCAtMCwwICsxLDE3ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBJTklUVkFMU185MDAzXzJQMF9ICisjZGVmaW5lIElOSVRWQUxTXzkwMDNfMlAwX0gKKworLyogQVI5MDAzIDIuMCAqLworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfcmFkaW9fcG9zdGFtYmxlW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDE2MDljLCAweDBkZDA4ZjI5LCAweDBkZDA4ZjI5LCAweDBiMjgzZjMxLCAweDBiMjgzZjMxfSwKKwl7MHgwMDAxNjBhYywgMHhhNDY1M2MwMCwgMHhhNDY1M2MwMCwgMHgyNDY1MjgwMCwgMHgyNDY1MjgwMH0sCisJezB4MDAwMTYwYjAsIDB4MDMyODRmM2UsIDB4MDMyODRmM2UsIDB4MDVkMDhmMjAsIDB4MDVkMDhmMjB9LAorCXsweDAwMDE2MTBjLCAweDA4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjE0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg1MDgwNDAwOCwgMHg1MDgwNDAwOH0sCisJezB4MDAwMTY1MGMsIDB4MDgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2NTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDUwODA0MDA4LCAweDUwODA0MDA4fSwKKwl7MHgwMDAxNjkwYywgMHgwODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY5NDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4NTA4MDQwMDgsIDB4NTA4MDQwMDh9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBNb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDBbXVs1XSA9IHsKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCisJezB4MDAwMGE0MTAsIDB4MDAwMDUwZDksIDB4MDAwMDUwZDksIDB4MDAwMDUwZDksIDB4MDAwMDUwZDl9LAorCXsweDAwMDBhNTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTUwNCwgMHgwNjAwMDAwMywgMHgwNjAwMDAwMywgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1MDgsIDB4MGEwMDAwMjAsIDB4MGEwMDAwMjAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNTBjLCAweDEwMDAwMDIzLCAweDEwMDAwMDIzLCAweDBiMDAwMjAwLCAweDBiMDAwMjAwfSwKKwl7MHgwMDAwYTUxMCwgMHgxNjAwMDIyMCwgMHgxNjAwMDIyMCwgMHgwZjAwMDIwMiwgMHgwZjAwMDIwMn0sCisJezB4MDAwMGE1MTQsIDB4MWMwMDAyMjMsIDB4MWMwMDAyMjMsIDB4MTIwMDA0MDAsIDB4MTIwMDA0MDB9LAorCXsweDAwMDBhNTE4LCAweDIxMDIwMjIwLCAweDIxMDIwMjIwLCAweDE2MDAwNDAyLCAweDE2MDAwNDAyfSwKKwl7MHgwMDAwYTUxYywgMHgyNzAyMDIyMywgMHgyNzAyMDIyMywgMHgxOTAwMDQwNCwgMHgxOTAwMDQwNH0sCisJezB4MDAwMGE1MjAsIDB4MmIwMjIyMjAsIDB4MmIwMjIyMjAsIDB4MWMwMDA2MDMsIDB4MWMwMDA2MDN9LAorCXsweDAwMDBhNTI0LCAweDJmMDIyMjIyLCAweDJmMDIyMjIyLCAweDIxMDAwYTAyLCAweDIxMDAwYTAyfSwKKwl7MHgwMDAwYTUyOCwgMHgzNDAyMjIyNSwgMHgzNDAyMjIyNSwgMHgyNTAwMGEwNCwgMHgyNTAwMGEwNH0sCisJezB4MDAwMGE1MmMsIDB4M2EwMjIyMmEsIDB4M2EwMjIyMmEsIDB4MjgwMDBhMjAsIDB4MjgwMDBhMjB9LAorCXsweDAwMDBhNTMwLCAweDNlMDIyMjJjLCAweDNlMDIyMjJjLCAweDJjMDAwZTIwLCAweDJjMDAwZTIwfSwKKwl7MHgwMDAwYTUzNCwgMHg0MjAyMjQyYSwgMHg0MjAyMjQyYSwgMHgzMDAwMGUyMiwgMHgzMDAwMGUyMn0sCisJezB4MDAwMGE1MzgsIDB4NDcwMjI0NGEsIDB4NDcwMjI0NGEsIDB4MzQwMDBlMjQsIDB4MzQwMDBlMjR9LAorCXsweDAwMDBhNTNjLCAweDRiMDIyNDRjLCAweDRiMDIyNDRjLCAweDM4MDAxNjQwLCAweDM4MDAxNjQwfSwKKwl7MHgwMDAwYTU0MCwgMHg0ZTAyMjQ2YywgMHg0ZTAyMjQ2YywgMHgzYzAwMTY2MCwgMHgzYzAwMTY2MH0sCisJezB4MDAwMGE1NDQsIDB4NTMwMjI2NmMsIDB4NTMwMjI2NmMsIDB4M2YwMDE4NjEsIDB4M2YwMDE4NjF9LAorCXsweDAwMDBhNTQ4LCAweDU3MDIyODZjLCAweDU3MDIyODZjLCAweDQzMDAxYTgxLCAweDQzMDAxYTgxfSwKKwl7MHgwMDAwYTU0YywgMHg1YzA0Mjg2YiwgMHg1YzA0Mjg2YiwgMHg0NzAwMWE4MywgMHg0NzAwMWE4M30sCisJezB4MDAwMGE1NTAsIDB4NjEwNDJhNmMsIDB4NjEwNDJhNmMsIDB4NGEwMDFjODQsIDB4NGEwMDFjODR9LAorCXsweDAwMDBhNTU0LCAweDY2MDYyYTZjLCAweDY2MDYyYTZjLCAweDRlMDAxY2UzLCAweDRlMDAxY2UzfSwKKwl7MHgwMDAwYTU1OCwgMHg2YjA2MmU2YywgMHg2YjA2MmU2YywgMHg1MjAwMWNlNSwgMHg1MjAwMWNlNX0sCisJezB4MDAwMGE1NWMsIDB4NzAwNjMwOGMsIDB4NzAwNjMwOGMsIDB4NTYwMDFjZTksIDB4NTYwMDFjZTl9LAorCXsweDAwMDBhNTYwLCAweDczMGEzMDhhLCAweDczMGEzMDhhLCAweDVhMDAxY2ViLCAweDVhMDAxY2VifSwKKwl7MHgwMDAwYTU2NCwgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1NjgsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTZjLCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU3MCwgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1NzQsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTc4LCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU3YywgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1ODAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDB9LAorCXsweDAwMDBhNTg0LCAweDA2ODAwMDAzLCAweDA2ODAwMDAzLCAweDA0ODAwMDAyLCAweDA0ODAwMDAyfSwKKwl7MHgwMDAwYTU4OCwgMHgwYTgwMDAyMCwgMHgwYTgwMDAyMCwgMHgwODgwMDAwNCwgMHgwODgwMDAwNH0sCisJezB4MDAwMGE1OGMsIDB4MTA4MDAwMjMsIDB4MTA4MDAwMjMsIDB4MGI4MDAyMDAsIDB4MGI4MDAyMDB9LAorCXsweDAwMDBhNTkwLCAweDE2ODAwMjIwLCAweDE2ODAwMjIwLCAweDBmODAwMjAyLCAweDBmODAwMjAyfSwKKwl7MHgwMDAwYTU5NCwgMHgxYzgwMDIyMywgMHgxYzgwMDIyMywgMHgxMjgwMDQwMCwgMHgxMjgwMDQwMH0sCisJezB4MDAwMGE1OTgsIDB4MjE4MjAyMjAsIDB4MjE4MjAyMjAsIDB4MTY4MDA0MDIsIDB4MTY4MDA0MDJ9LAorCXsweDAwMDBhNTljLCAweDI3ODIwMjIzLCAweDI3ODIwMjIzLCAweDE5ODAwNDA0LCAweDE5ODAwNDA0fSwKKwl7MHgwMDAwYTVhMCwgMHgyYjgyMjIyMCwgMHgyYjgyMjIyMCwgMHgxYzgwMDYwMywgMHgxYzgwMDYwM30sCisJezB4MDAwMGE1YTQsIDB4MmY4MjIyMjIsIDB4MmY4MjIyMjIsIDB4MjE4MDBhMDIsIDB4MjE4MDBhMDJ9LAorCXsweDAwMDBhNWE4LCAweDM0ODIyMjI1LCAweDM0ODIyMjI1LCAweDI1ODAwYTA0LCAweDI1ODAwYTA0fSwKKwl7MHgwMDAwYTVhYywgMHgzYTgyMjIyYSwgMHgzYTgyMjIyYSwgMHgyODgwMGEyMCwgMHgyODgwMGEyMH0sCisJezB4MDAwMGE1YjAsIDB4M2U4MjIyMmMsIDB4M2U4MjIyMmMsIDB4MmM4MDBlMjAsIDB4MmM4MDBlMjB9LAorCXsweDAwMDBhNWI0LCAweDQyODIyNDJhLCAweDQyODIyNDJhLCAweDMwODAwZTIyLCAweDMwODAwZTIyfSwKKwl7MHgwMDAwYTViOCwgMHg0NzgyMjQ0YSwgMHg0NzgyMjQ0YSwgMHgzNDgwMGUyNCwgMHgzNDgwMGUyNH0sCisJezB4MDAwMGE1YmMsIDB4NGI4MjI0NGMsIDB4NGI4MjI0NGMsIDB4Mzg4MDE2NDAsIDB4Mzg4MDE2NDB9LAorCXsweDAwMDBhNWMwLCAweDRlODIyNDZjLCAweDRlODIyNDZjLCAweDNjODAxNjYwLCAweDNjODAxNjYwfSwKKwl7MHgwMDAwYTVjNCwgMHg1MzgyMjY2YywgMHg1MzgyMjY2YywgMHgzZjgwMTg2MSwgMHgzZjgwMTg2MX0sCisJezB4MDAwMGE1YzgsIDB4NTc4MjI4NmMsIDB4NTc4MjI4NmMsIDB4NDM4MDFhODEsIDB4NDM4MDFhODF9LAorCXsweDAwMDBhNWNjLCAweDVjODQyODZiLCAweDVjODQyODZiLCAweDQ3ODAxYTgzLCAweDQ3ODAxYTgzfSwKKwl7MHgwMDAwYTVkMCwgMHg2MTg0MmE2YywgMHg2MTg0MmE2YywgMHg0YTgwMWM4NCwgMHg0YTgwMWM4NH0sCisJezB4MDAwMGE1ZDQsIDB4NjY4NjJhNmMsIDB4NjY4NjJhNmMsIDB4NGU4MDFjZTMsIDB4NGU4MDFjZTN9LAorCXsweDAwMDBhNWQ4LCAweDZiODYyZTZjLCAweDZiODYyZTZjLCAweDUyODAxY2U1LCAweDUyODAxY2U1fSwKKwl7MHgwMDAwYTVkYywgMHg3MDg2MzA4YywgMHg3MDg2MzA4YywgMHg1NjgwMWNlOSwgMHg1NjgwMWNlOX0sCisJezB4MDAwMGE1ZTAsIDB4NzM4YTMwOGEsIDB4NzM4YTMwOGEsIDB4NWE4MDFjZWIsIDB4NWE4MDFjZWJ9LAorCXsweDAwMDBhNWU0LCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVlOCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZWMsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWYwLCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVmNCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZjgsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWZjLCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAxNjA0NCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNH0sCisJezB4MDAwMTYwNDgsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDF9LAorCXsweDAwMDE2MDY4LCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjfSwKKwl7MHgwMDAxNjQ0NCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNH0sCisJezB4MDAwMTY0NDgsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDF9LAorCXsweDAwMDE2NDY4LCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjfSwKKwl7MHgwMDAxNjg0NCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNCwgMHgwMTI0OTJkNH0sCisJezB4MDAwMTY4NDgsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDEsIDB4NjI0ODAwMDF9LAorCXsweDAwMDE2ODY4LCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwTW9kZXNfZmFzdF9jbG9ja18ycDBbXVszXSA9IHsKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICovCisJezB4MDAwMDEwMzAsIDB4MDAwMDAyNjgsIDB4MDAwMDA0ZDB9LAorCXsweDAwMDAxMDcwLCAweDAwMDAwMThjLCAweDAwMDAwMzE4fSwKKwl7MHgwMDAwMTBiMCwgMHgwMDAwMGZkMCwgMHgwMDAwMWZhMH0sCisJezB4MDAwMDgwMTQsIDB4MDQ0YzA0NGMsIDB4MDg5ODA4OTh9LAorCXsweDAwMDA4MDFjLCAweDE0OGVjMDJiLCAweDE0OGVjMDU3fSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwNDRjMCwgMHgwMDAwODk4MH0sCisJezB4MDAwMDllMDAsIDB4MDM3MjE4MjEsIDB4MDM3MjE4MjF9LAorCXsweDAwMDBhMjMwLCAweDAwMDAwMDBiLCAweDAwMDAwMDE2fSwKKwl7MHgwMDAwYTI1NCwgMHgwMDAwMDg5OCwgMHgwMDAwMTEzMH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfcmFkaW9fY29yZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAxNjAwMCwgMHgzNmRiNmRiNn0sCisJezB4MDAwMTYwMDQsIDB4NmRiNmRiNDB9LAorCXsweDAwMDE2MDA4LCAweDczZjAwMDAwfSwKKwl7MHgwMDAxNjAwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYwNDAsIDB4N2Y4MGZmZjh9LAorCXsweDAwMDE2MDRjLCAweDc2ZDAwNWI1fSwKKwl7MHgwMDAxNjA1MCwgMHg1NTZjZjAzMX0sCisJezB4MDAwMTYwNTQsIDB4MTM0NDk0NDB9LAorCXsweDAwMDE2MDU4LCAweDBjNTFjOTJjfSwKKwl7MHgwMDAxNjA1YywgMHgzZGI3ZmZmY30sCisJezB4MDAwMTYwNjAsIDB4ZmZmZmZmZmN9LAorCXsweDAwMDE2MDY0LCAweDAwMGYwMjc4fSwKKwl7MHgwMDAxNjA2YywgMHg2ZGI2MDAwMH0sCisJezB4MDAwMTYwODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2MDg0LCAweDBlNDgwNDhjfSwKKwl7MHgwMDAxNjA4OCwgMHg1NDIxNDUxNH0sCisJezB4MDAwMTYwOGMsIDB4MTE5ZjQ4MWV9LAorCXsweDAwMDE2MDkwLCAweDI0OTI2NDkwfSwKKwl7MHgwMDAxNjA5OCwgMHhkMjg4ODg4OH0sCisJezB4MDAwMTYwYTAsIDB4MGExMDhmZmV9LAorCXsweDAwMDE2MGE0LCAweDgxMmZjMzcwfSwKKwl7MHgwMDAxNjBhOCwgMHg0MjNjODAwMH0sCisJezB4MDAwMTYwYjQsIDB4OTI0ODAwODB9LAorCXsweDAwMDE2MGMwLCAweDAwYWRiNmQwfSwKKwl7MHgwMDAxNjBjNCwgMHg2ZGI2ZGI2MH0sCisJezB4MDAwMTYwYzgsIDB4NmRiNmRiNmN9LAorCXsweDAwMDE2MGNjLCAweDAxZTZjMDAwfSwKKwl7MHgwMDAxNjEwMCwgMHgzZmZmYmUwMX0sCisJezB4MDAwMTYxMDQsIDB4ZmZmODAwMDB9LAorCXsweDAwMDE2MTA4LCAweDAwMDgwMDEwfSwKKwl7MHgwMDAxNjE0NCwgMHgwMjA4NDA4MH0sCisJezB4MDAwMTYxNDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2MjgwLCAweDA1OGEwMDAxfSwKKwl7MHgwMDAxNjI4NCwgMHgzZDg0MDIwOH0sCisJezB4MDAwMTYyODgsIDB4MDVhMjA0MDh9LAorCXsweDAwMDE2MjhjLCAweDAwMDM4YzA3fSwKKwl7MHgwMDAxNjI5MCwgMHg0MDAwMDAwNH0sCisJezB4MDAwMTYyOTQsIDB4NDU4YWExNGZ9LAorCXsweDAwMDE2MzgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjM4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzODgsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2MzhjLCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNjM5MCwgMHgwMDgwMDcwMH0sCisJezB4MDAwMTYzOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Mzk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjM5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDE2M2E0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAxNjNhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2IwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNjMCwgMHgwMDAwMDBhMH0sCisJezB4MDAwMTYzYzQsIDB4MDAwYzAwMDB9LAorCXsweDAwMDE2M2M4LCAweDE0MDIxNDAyfSwKKwl7MHgwMDAxNjNjYywgMHgwMDAwMTQwMn0sCisJezB4MDAwMTYzZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2Q0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjQwMCwgMHgzNmRiNmRiNn0sCisJezB4MDAwMTY0MDQsIDB4NmRiNmRiNDB9LAorCXsweDAwMDE2NDA4LCAweDczZjAwMDAwfSwKKwl7MHgwMDAxNjQwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY0NDAsIDB4N2Y4MGZmZjh9LAorCXsweDAwMDE2NDRjLCAweDc2ZDAwNWI1fSwKKwl7MHgwMDAxNjQ1MCwgMHg1NTZjZjAzMX0sCisJezB4MDAwMTY0NTQsIDB4MTM0NDk0NDB9LAorCXsweDAwMDE2NDU4LCAweDBjNTFjOTJjfSwKKwl7MHgwMDAxNjQ1YywgMHgzZGI3ZmZmY30sCisJezB4MDAwMTY0NjAsIDB4ZmZmZmZmZmN9LAorCXsweDAwMDE2NDY0LCAweDAwMGYwMjc4fSwKKwl7MHgwMDAxNjQ2YywgMHg2ZGI2MDAwMH0sCisJezB4MDAwMTY1MDAsIDB4M2ZmZmJlMDF9LAorCXsweDAwMDE2NTA0LCAweGZmZjgwMDAwfSwKKwl7MHgwMDAxNjUwOCwgMHgwMDA4MDAxMH0sCisJezB4MDAwMTY1NDQsIDB4MDIwODQwODB9LAorCXsweDAwMDE2NTQ4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjc4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3ODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Nzg4LCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNjc4YywgMHgwMDgwMDcwMH0sCisJezB4MDAwMTY3OTAsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2Nzk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjc5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3OWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2N2EwLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAxNjdhNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMTY3YTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2N2FjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjdiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3YjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2N2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjdiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3YzAsIDB4MDAwMDAwYTB9LAorCXsweDAwMDE2N2M0LCAweDAwMGMwMDAwfSwKKwl7MHgwMDAxNjdjOCwgMHgxNDAyMTQwMn0sCisJezB4MDAwMTY3Y2MsIDB4MDAwMDE0MDJ9LAorCXsweDAwMDE2N2QwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjdkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY4MDAsIDB4MzZkYjZkYjZ9LAorCXsweDAwMDE2ODA0LCAweDZkYjZkYjQwfSwKKwl7MHgwMDAxNjgwOCwgMHg3M2YwMDAwMH0sCisJezB4MDAwMTY4MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2ODQwLCAweDdmODBmZmY4fSwKKwl7MHgwMDAxNjg0YywgMHg3NmQwMDViNX0sCisJezB4MDAwMTY4NTAsIDB4NTU2Y2YwMzF9LAorCXsweDAwMDE2ODU0LCAweDEzNDQ5NDQwfSwKKwl7MHgwMDAxNjg1OCwgMHgwYzUxYzkyY30sCisJezB4MDAwMTY4NWMsIDB4M2RiN2ZmZmN9LAorCXsweDAwMDE2ODYwLCAweGZmZmZmZmZjfSwKKwl7MHgwMDAxNjg2NCwgMHgwMDBmMDI3OH0sCisJezB4MDAwMTY4NmMsIDB4NmRiNjAwMDB9LAorCXsweDAwMDE2OTAwLCAweDNmZmZiZTAxfSwKKwl7MHgwMDAxNjkwNCwgMHhmZmY4MDAwMH0sCisJezB4MDAwMTY5MDgsIDB4MDAwODAwMTB9LAorCXsweDAwMDE2OTQ0LCAweDAyMDg0MDgwfSwKKwl7MHgwMDAxNjk0OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Yjg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmI4OCwgMHgwMDgwMDcwMH0sCisJezB4MDAwMTZiOGMsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2YjkwLCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNmI5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiOTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YjljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmJhMCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMTZiYTQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDE2YmE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmJhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YmI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmJiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YmMwLCAweDAwMDAwMGEwfSwKKwl7MHgwMDAxNmJjNCwgMHgwMDBjMDAwMH0sCisJezB4MDAwMTZiYzgsIDB4MTQwMjE0MDJ9LAorCXsweDAwMDE2YmNjLCAweDAwMDAxNDAyfSwKKwl7MHgwMDAxNmJkMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiZDQsIDB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBDb21tb25fcnhfZ2Fpbl90YWJsZV9tZXJsaW5fMnAwW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMDAwLCAweDAyMDAwMTAxfSwKKwl7MHgwMDAwYTAwNCwgMHgwMjAwMDEwMn0sCisJezB4MDAwMGEwMDgsIDB4MDIwMDAxMDN9LAorCXsweDAwMDBhMDBjLCAweDAyMDAwMTA0fSwKKwl7MHgwMDAwYTAxMCwgMHgwMjAwMDIwMH0sCisJezB4MDAwMGEwMTQsIDB4MDIwMDAyMDF9LAorCXsweDAwMDBhMDE4LCAweDAyMDAwMjAyfSwKKwl7MHgwMDAwYTAxYywgMHgwMjAwMDIwM30sCisJezB4MDAwMGEwMjAsIDB4MDIwMDAyMDR9LAorCXsweDAwMDBhMDI0LCAweDAyMDAwMjA1fSwKKwl7MHgwMDAwYTAyOCwgMHgwMjAwMDIwOH0sCisJezB4MDAwMGEwMmMsIDB4MDIwMDAzMDJ9LAorCXsweDAwMDBhMDMwLCAweDAyMDAwMzAzfSwKKwl7MHgwMDAwYTAzNCwgMHgwMjAwMDMwNH0sCisJezB4MDAwMGEwMzgsIDB4MDIwMDA0MDB9LAorCXsweDAwMDBhMDNjLCAweDAyMDEwMzAwfSwKKwl7MHgwMDAwYTA0MCwgMHgwMjAxMDMwMX0sCisJezB4MDAwMGEwNDQsIDB4MDIwMTAzMDJ9LAorCXsweDAwMDBhMDQ4LCAweDAyMDAwNTAwfSwKKwl7MHgwMDAwYTA0YywgMHgwMjAxMDQwMH0sCisJezB4MDAwMGEwNTAsIDB4MDIwMjAzMDB9LAorCXsweDAwMDBhMDU0LCAweDAyMDIwMzAxfSwKKwl7MHgwMDAwYTA1OCwgMHgwMjAyMDMwMn0sCisJezB4MDAwMGEwNWMsIDB4MDIwMjAzMDN9LAorCXsweDAwMDBhMDYwLCAweDAyMDIwNDAwfSwKKwl7MHgwMDAwYTA2NCwgMHgwMjAzMDMwMH0sCisJezB4MDAwMGEwNjgsIDB4MDIwMzAzMDF9LAorCXsweDAwMDBhMDZjLCAweDAyMDMwMzAyfSwKKwl7MHgwMDAwYTA3MCwgMHgwMjAzMDMwM30sCisJezB4MDAwMGEwNzQsIDB4MDIwMzA0MDB9LAorCXsweDAwMDBhMDc4LCAweDAyMDQwMzAwfSwKKwl7MHgwMDAwYTA3YywgMHgwMjA0MDMwMX0sCisJezB4MDAwMGEwODAsIDB4MDIwNDAzMDJ9LAorCXsweDAwMDBhMDg0LCAweDAyMDQwMzAzfSwKKwl7MHgwMDAwYTA4OCwgMHgwMjAzMDUwMH0sCisJezB4MDAwMGEwOGMsIDB4MDIwNDA0MDB9LAorCXsweDAwMDBhMDkwLCAweDAyMDUwMjAzfSwKKwl7MHgwMDAwYTA5NCwgMHgwMjA1MDIwNH0sCisJezB4MDAwMGEwOTgsIDB4MDIwNTAyMDV9LAorCXsweDAwMDBhMDljLCAweDAyMDQwNTAwfSwKKwl7MHgwMDAwYTBhMCwgMHgwMjA1MDMwMX0sCisJezB4MDAwMGEwYTQsIDB4MDIwNTAzMDJ9LAorCXsweDAwMDBhMGE4LCAweDAyMDUwMzAzfSwKKwl7MHgwMDAwYTBhYywgMHgwMjA1MDQwMH0sCisJezB4MDAwMGEwYjAsIDB4MDIwNTA0MDF9LAorCXsweDAwMDBhMGI0LCAweDAyMDUwNDAyfSwKKwl7MHgwMDAwYTBiOCwgMHgwMjA1MDQwM30sCisJezB4MDAwMGEwYmMsIDB4MDIwNTA1MDB9LAorCXsweDAwMDBhMGMwLCAweDAyMDUwNTAxfSwKKwl7MHgwMDAwYTBjNCwgMHgwMjA1MDUwMn0sCisJezB4MDAwMGEwYzgsIDB4MDIwNTA1MDN9LAorCXsweDAwMDBhMGNjLCAweDAyMDUwNTA0fSwKKwl7MHgwMDAwYTBkMCwgMHgwMjA1MDYwMH0sCisJezB4MDAwMGEwZDQsIDB4MDIwNTA2MDF9LAorCXsweDAwMDBhMGQ4LCAweDAyMDUwNjAyfSwKKwl7MHgwMDAwYTBkYywgMHgwMjA1MDYwM30sCisJezB4MDAwMGEwZTAsIDB4MDIwNTA2MDR9LAorCXsweDAwMDBhMGU0LCAweDAyMDUwNzAwfSwKKwl7MHgwMDAwYTBlOCwgMHgwMjA1MDcwMX0sCisJezB4MDAwMGEwZWMsIDB4MDIwNTA3MDJ9LAorCXsweDAwMDBhMGYwLCAweDAyMDUwNzAzfSwKKwl7MHgwMDAwYTBmNCwgMHgwMjA1MDcwNH0sCisJezB4MDAwMGEwZjgsIDB4MDIwNTA3MDV9LAorCXsweDAwMDBhMGZjLCAweDAyMDUwNzA4fSwKKwl7MHgwMDAwYTEwMCwgMHgwMjA1MDcwOX0sCisJezB4MDAwMGExMDQsIDB4MDIwNTA3MGF9LAorCXsweDAwMDBhMTA4LCAweDAyMDUwNzBifSwKKwl7MHgwMDAwYTEwYywgMHgwMjA1MDcwY30sCisJezB4MDAwMGExMTAsIDB4MDIwNTA3MGR9LAorCXsweDAwMDBhMTE0LCAweDAyMDUwNzEwfSwKKwl7MHgwMDAwYTExOCwgMHgwMjA1MDcxMX0sCisJezB4MDAwMGExMWMsIDB4MDIwNTA3MTJ9LAorCXsweDAwMDBhMTIwLCAweDAyMDUwNzEzfSwKKwl7MHgwMDAwYTEyNCwgMHgwMjA1MDcxNH0sCisJezB4MDAwMGExMjgsIDB4MDIwNTA3MTV9LAorCXsweDAwMDBhMTJjLCAweDAyMDUwNzMwfSwKKwl7MHgwMDAwYTEzMCwgMHgwMjA1MDczMX0sCisJezB4MDAwMGExMzQsIDB4MDIwNTA3MzJ9LAorCXsweDAwMDBhMTM4LCAweDAyMDUwNzMzfSwKKwl7MHgwMDAwYTEzYywgMHgwMjA1MDczNH0sCisJezB4MDAwMGExNDAsIDB4MDIwNTA3MzV9LAorCXsweDAwMDBhMTQ0LCAweDAyMDUwNzUwfSwKKwl7MHgwMDAwYTE0OCwgMHgwMjA1MDc1MX0sCisJezB4MDAwMGExNGMsIDB4MDIwNTA3NTJ9LAorCXsweDAwMDBhMTUwLCAweDAyMDUwNzUzfSwKKwl7MHgwMDAwYTE1NCwgMHgwMjA1MDc1NH0sCisJezB4MDAwMGExNTgsIDB4MDIwNTA3NTV9LAorCXsweDAwMDBhMTVjLCAweDAyMDUwNzcwfSwKKwl7MHgwMDAwYTE2MCwgMHgwMjA1MDc3MX0sCisJezB4MDAwMGExNjQsIDB4MDIwNTA3NzJ9LAorCXsweDAwMDBhMTY4LCAweDAyMDUwNzczfSwKKwl7MHgwMDAwYTE2YywgMHgwMjA1MDc3NH0sCisJezB4MDAwMGExNzAsIDB4MDIwNTA3NzV9LAorCXsweDAwMDBhMTc0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE3OCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExN2MsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMTgwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE4NCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExODgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMThjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE5MCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExOTQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMTk4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE5YywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYTAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWE0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFhOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYWMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWIwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFiNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYjgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWJjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFjMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYzQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWM4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFjYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZDAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWQ0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFkOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZGMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWUwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFlNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZTgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWVjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFmMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZjQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWY4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFmYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIwMDAsIDB4MDIwMDAxMDF9LAorCXsweDAwMDBiMDA0LCAweDAyMDAwMTAyfSwKKwl7MHgwMDAwYjAwOCwgMHgwMjAwMDEwM30sCisJezB4MDAwMGIwMGMsIDB4MDIwMDAxMDR9LAorCXsweDAwMDBiMDEwLCAweDAyMDAwMjAwfSwKKwl7MHgwMDAwYjAxNCwgMHgwMjAwMDIwMX0sCisJezB4MDAwMGIwMTgsIDB4MDIwMDAyMDJ9LAorCXsweDAwMDBiMDFjLCAweDAyMDAwMjAzfSwKKwl7MHgwMDAwYjAyMCwgMHgwMjAwMDIwNH0sCisJezB4MDAwMGIwMjQsIDB4MDIwMDAyMDV9LAorCXsweDAwMDBiMDI4LCAweDAyMDAwMjA4fSwKKwl7MHgwMDAwYjAyYywgMHgwMjAwMDMwMn0sCisJezB4MDAwMGIwMzAsIDB4MDIwMDAzMDN9LAorCXsweDAwMDBiMDM0LCAweDAyMDAwMzA0fSwKKwl7MHgwMDAwYjAzOCwgMHgwMjAwMDQwMH0sCisJezB4MDAwMGIwM2MsIDB4MDIwMTAzMDB9LAorCXsweDAwMDBiMDQwLCAweDAyMDEwMzAxfSwKKwl7MHgwMDAwYjA0NCwgMHgwMjAxMDMwMn0sCisJezB4MDAwMGIwNDgsIDB4MDIwMDA1MDB9LAorCXsweDAwMDBiMDRjLCAweDAyMDEwNDAwfSwKKwl7MHgwMDAwYjA1MCwgMHgwMjAyMDMwMH0sCisJezB4MDAwMGIwNTQsIDB4MDIwMjAzMDF9LAorCXsweDAwMDBiMDU4LCAweDAyMDIwMzAyfSwKKwl7MHgwMDAwYjA1YywgMHgwMjAyMDMwM30sCisJezB4MDAwMGIwNjAsIDB4MDIwMjA0MDB9LAorCXsweDAwMDBiMDY0LCAweDAyMDMwMzAwfSwKKwl7MHgwMDAwYjA2OCwgMHgwMjAzMDMwMX0sCisJezB4MDAwMGIwNmMsIDB4MDIwMzAzMDJ9LAorCXsweDAwMDBiMDcwLCAweDAyMDMwMzAzfSwKKwl7MHgwMDAwYjA3NCwgMHgwMjAzMDQwMH0sCisJezB4MDAwMGIwNzgsIDB4MDIwNDAzMDB9LAorCXsweDAwMDBiMDdjLCAweDAyMDQwMzAxfSwKKwl7MHgwMDAwYjA4MCwgMHgwMjA0MDMwMn0sCisJezB4MDAwMGIwODQsIDB4MDIwNDAzMDN9LAorCXsweDAwMDBiMDg4LCAweDAyMDMwNTAwfSwKKwl7MHgwMDAwYjA4YywgMHgwMjA0MDQwMH0sCisJezB4MDAwMGIwOTAsIDB4MDIwNTAyMDN9LAorCXsweDAwMDBiMDk0LCAweDAyMDUwMjA0fSwKKwl7MHgwMDAwYjA5OCwgMHgwMjA1MDIwNX0sCisJezB4MDAwMGIwOWMsIDB4MDIwNDA1MDB9LAorCXsweDAwMDBiMGEwLCAweDAyMDUwMzAxfSwKKwl7MHgwMDAwYjBhNCwgMHgwMjA1MDMwMn0sCisJezB4MDAwMGIwYTgsIDB4MDIwNTAzMDN9LAorCXsweDAwMDBiMGFjLCAweDAyMDUwNDAwfSwKKwl7MHgwMDAwYjBiMCwgMHgwMjA1MDQwMX0sCisJezB4MDAwMGIwYjQsIDB4MDIwNTA0MDJ9LAorCXsweDAwMDBiMGI4LCAweDAyMDUwNDAzfSwKKwl7MHgwMDAwYjBiYywgMHgwMjA1MDUwMH0sCisJezB4MDAwMGIwYzAsIDB4MDIwNTA1MDF9LAorCXsweDAwMDBiMGM0LCAweDAyMDUwNTAyfSwKKwl7MHgwMDAwYjBjOCwgMHgwMjA1MDUwM30sCisJezB4MDAwMGIwY2MsIDB4MDIwNTA1MDR9LAorCXsweDAwMDBiMGQwLCAweDAyMDUwNjAwfSwKKwl7MHgwMDAwYjBkNCwgMHgwMjA1MDYwMX0sCisJezB4MDAwMGIwZDgsIDB4MDIwNTA2MDJ9LAorCXsweDAwMDBiMGRjLCAweDAyMDUwNjAzfSwKKwl7MHgwMDAwYjBlMCwgMHgwMjA1MDYwNH0sCisJezB4MDAwMGIwZTQsIDB4MDIwNTA3MDB9LAorCXsweDAwMDBiMGU4LCAweDAyMDUwNzAxfSwKKwl7MHgwMDAwYjBlYywgMHgwMjA1MDcwMn0sCisJezB4MDAwMGIwZjAsIDB4MDIwNTA3MDN9LAorCXsweDAwMDBiMGY0LCAweDAyMDUwNzA0fSwKKwl7MHgwMDAwYjBmOCwgMHgwMjA1MDcwNX0sCisJezB4MDAwMGIwZmMsIDB4MDIwNTA3MDh9LAorCXsweDAwMDBiMTAwLCAweDAyMDUwNzA5fSwKKwl7MHgwMDAwYjEwNCwgMHgwMjA1MDcwYX0sCisJezB4MDAwMGIxMDgsIDB4MDIwNTA3MGJ9LAorCXsweDAwMDBiMTBjLCAweDAyMDUwNzBjfSwKKwl7MHgwMDAwYjExMCwgMHgwMjA1MDcwZH0sCisJezB4MDAwMGIxMTQsIDB4MDIwNTA3MTB9LAorCXsweDAwMDBiMTE4LCAweDAyMDUwNzExfSwKKwl7MHgwMDAwYjExYywgMHgwMjA1MDcxMn0sCisJezB4MDAwMGIxMjAsIDB4MDIwNTA3MTN9LAorCXsweDAwMDBiMTI0LCAweDAyMDUwNzE0fSwKKwl7MHgwMDAwYjEyOCwgMHgwMjA1MDcxNX0sCisJezB4MDAwMGIxMmMsIDB4MDIwNTA3MzB9LAorCXsweDAwMDBiMTMwLCAweDAyMDUwNzMxfSwKKwl7MHgwMDAwYjEzNCwgMHgwMjA1MDczMn0sCisJezB4MDAwMGIxMzgsIDB4MDIwNTA3MzN9LAorCXsweDAwMDBiMTNjLCAweDAyMDUwNzM0fSwKKwl7MHgwMDAwYjE0MCwgMHgwMjA1MDczNX0sCisJezB4MDAwMGIxNDQsIDB4MDIwNTA3NTB9LAorCXsweDAwMDBiMTQ4LCAweDAyMDUwNzUxfSwKKwl7MHgwMDAwYjE0YywgMHgwMjA1MDc1Mn0sCisJezB4MDAwMGIxNTAsIDB4MDIwNTA3NTN9LAorCXsweDAwMDBiMTU0LCAweDAyMDUwNzU0fSwKKwl7MHgwMDAwYjE1OCwgMHgwMjA1MDc1NX0sCisJezB4MDAwMGIxNWMsIDB4MDIwNTA3NzB9LAorCXsweDAwMDBiMTYwLCAweDAyMDUwNzcxfSwKKwl7MHgwMDAwYjE2NCwgMHgwMjA1MDc3Mn0sCisJezB4MDAwMGIxNjgsIDB4MDIwNTA3NzN9LAorCXsweDAwMDBiMTZjLCAweDAyMDUwNzc0fSwKKwl7MHgwMDAwYjE3MCwgMHgwMjA1MDc3NX0sCisJezB4MDAwMGIxNzQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMTc4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE3YywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxODAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMTg0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE4OCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxOGMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMTkwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE5NCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxOTgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMTljLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFhMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYTQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWE4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFhYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYjAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWI0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFiOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYmMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWMwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFjNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYzgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWNjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFkMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZDQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWQ4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFkYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZTAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWU0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFlOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZWMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWYwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFmNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZjgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWZjLCAweDAwMDAwNzc2fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwXzJwMF9tYWNfcG9zdGFtYmxlW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDAxMDMwLCAweDAwMDAwMjMwLCAweDAwMDAwNDYwLCAweDAwMDAwMmMwLCAweDAwMDAwMTYwfSwKKwl7MHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4Y30sCisJezB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzh9LAorCXsweDAwMDA4MDE0LCAweDAzZTgwM2U4LCAweDA3ZDAwN2QwLCAweDEwODAxNjAwLCAweDA4NDAwYjAwfSwKKwl7MHgwMDAwODAxYywgMHgxMjhkODAyNywgMHgxMjhkODA0ZiwgMHgxMmUwMDA1NywgMHgxMmUwMDAyYn0sCisJezB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTB9LAorCXsweDAwMDA4MWQwLCAweDAwMDAzMjEwLCAweDAwMDAzMjEwLCAweDAwMDAzMjBhLCAweDAwMDAzMjBhfSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwM2U4MCwgMHgwMDAwN2QwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfc29jX3Bvc3RhbWJsZVtdWzVdID0geworCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAyMywgMHgwMDAwMDAyMywgMHgwMDAwMDAyMywgMHgwMDAwMDAyM30sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTIwMF9tZXJsaW5fMnAwX3JhZGlvX2NvcmVbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDc4MDAsIDB4MDAwNDAwMDB9LAorCXsweDAwMDA3ODA0LCAweGRiMDA1MDEyfSwKKwl7MHgwMDAwNzgwOCwgMHgwNDkyNDkxNH0sCisJezB4MDAwMDc4MGMsIDB4MjEwODQyMTB9LAorCXsweDAwMDA3ODEwLCAweDZkODAxMzAwfSwKKwl7MHgwMDAwNzgxNCwgMHgwMDE5YmVmZn0sCisJezB4MDAwMDc4MTgsIDB4MDdlNDEwMDB9LAorCXsweDAwMDA3ODFjLCAweDAwMzkyMDAwfSwKKwl7MHgwMDAwNzgyMCwgMHg5MjU5MjQ4MH0sCisJezB4MDAwMDc4MjQsIDB4MDAwNDAwMDB9LAorCXsweDAwMDA3ODI4LCAweGRiMDA1MDEyfSwKKwl7MHgwMDAwNzgyYywgMHgwNDkyNDkxNH0sCisJezB4MDAwMDc4MzAsIDB4MjEwODQyMTB9LAorCXsweDAwMDA3ODM0LCAweDZkODAxMzAwfSwKKwl7MHgwMDAwNzgzOCwgMHgwMDE5YmVmZn0sCisJezB4MDAwMDc4M2MsIDB4MDdlNDAwMDB9LAorCXsweDAwMDA3ODQwLCAweDAwMzkyMDAwfSwKKwl7MHgwMDAwNzg0NCwgMHg5MjU5MjQ4MH0sCisJezB4MDAwMDc4NDgsIDB4MDAxMDAwMDB9LAorCXsweDAwMDA3ODRjLCAweDc3M2YwNTY3fSwKKwl7MHgwMDAwNzg1MCwgMHg1NDIxNDUxNH0sCisJezB4MDAwMDc4NTQsIDB4MTIwMzU4Mjh9LAorCXsweDAwMDA3ODU4LCAweDkyNTkyNjkyfSwKKwl7MHgwMDAwNzg1YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDc4NjAsIDB4NTY0MDAwMDB9LAorCXsweDAwMDA3ODY0LCAweDBhOGUzNzBlfSwKKwl7MHgwMDAwNzg2OCwgMHhjMDEwMjg1MH0sCisJezB4MDAwMDc4NmMsIDB4ODEyZDQwMDB9LAorCXsweDAwMDA3ODcwLCAweDgwN2VjNDAwfSwKKwl7MHgwMDAwNzg3NCwgMHgwMDFiNmRiMH0sCisJezB4MDAwMDc4NzgsIDB4MDAzNzZiNjN9LAorCXsweDAwMDA3ODdjLCAweDA2ZGI2ZGI2fSwKKwl7MHgwMDAwNzg4MCwgMHgwMDZkODAwMH0sCisJezB4MDAwMDc4ODQsIDB4ZmZlZmZmZmV9LAorCXsweDAwMDA3ODg4LCAweGZmZWZmZmZlfSwKKwl7MHgwMDAwNzg4YywgMHgwMDAxMDAwMH0sCisJezB4MDAwMDc4OTAsIDB4MDIwNjBhZWJ9LAorCXsweDAwMDA3ODk0LCAweDVhMTA4MDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwXzJwMF9iYXNlYmFuZF9wb3N0YW1ibGVbXVs1XSA9IHsKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCisJezB4MDAwMDk4MTAsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMTEsIDB4ZDAwYTgwMTF9LAorCXsweDAwMDA5ODIwLCAweDIwNmEwMjJlLCAweDIwNmEwMjJlLCAweDIwNmEwMTJlLCAweDIwNmEwMTJlfSwKKwl7MHgwMDAwOTgyNCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMH0sCisJezB4MDAwMDk4MjgsIDB4MDY5MDMwODEsIDB4MDY5MDMwODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODF9LAorCXsweDAwMDA5ODJjLCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0fSwKKwl7MHgwMDAwOTgzMCwgMHgwMDAwMDU5YywgMHgwMDAwMDU5YywgMHgwMDAwMTE5YywgMHgwMDAwMTE5Y30sCisJezB4MDAwMDljMDAsIDB4MDAwMDAwNDQsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzQsIDB4MDAwMDAwNDR9LAorCXsweDAwMDA5ZTAwLCAweDAzNzIxNjFlLCAweDAzNzIxNjFlLCAweDAzNzIxNmEwLCAweDAzNzIxNmEwfSwKKwl7MHgwMDAwOWUwNCwgMHgwMDgwMjAyMCwgMHgwMDgwMjAyMCwgMHgwMDgwMjAyMCwgMHgwMDgwMjAyMH0sCisJezB4MDAwMDllMGMsIDB4NmM0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZTJ9LAorCXsweDAwMDA5ZTEwLCAweDdlYzg4ZDJlLCAweDdlYzg4ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg0ZDJlfSwKKwl7MHgwMDAwOWUxNCwgMHgzMTM5NWQ1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NjA1ZSwgMHgzMTM5NWQ1ZX0sCisJezB4MDAwMDllMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ZTFjLCAweDAwMDFjZjljLCAweDAwMDFjZjljLCAweDAwMDIxZjljLCAweDAwMDIxZjljfSwKKwl7MHgwMDAwOWUyMCwgMHgwMDAwMDNiNSwgMHgwMDAwMDNiNSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZX0sCisJezB4MDAwMDllMmMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjF9LAorCXsweDAwMDA5ZTQ0LCAweDAyMzIxZTI3LCAweDAyMzIxZTI3LCAweDAyMjkxZTI3LCAweDAyMjkxZTI3fSwKKwl7MHgwMDAwOWU0OCwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxMiwgMHg1MDMwMjAxMn0sCisJezB4MDAwMDlmYzgsIDB4MDAwM2YwMDAsIDB4MDAwM2YwMDAsIDB4MDAwMWEwMDAsIDB4MDAwMWEwMDB9LAorCXsweDAwMDBhMjA0LCAweDAwMDAzN2MwLCAweDAwMDAzN2M0LCAweDAwMDAzN2M0LCAweDAwMDAzN2MwfSwKKwl7MHgwMDAwYTIwOCwgMHgwMDAwMDEwNCwgMHgwMDAwMDEwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNH0sCisJezB4MDAwMGEyMzAsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGJ9LAorCXsweDAwMDBhMjM4LCAweGZmYjgxMDE4LCAweGZmYjgxMDE4LCAweGZmYjgxMDE4LCAweGZmYjgxMDE4fSwKKwl7MHgwMDAwYTI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOH0sCisJezB4MDAwMGEyNTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTh9LAorCXsweDAwMDBhMjU4LCAweDAyMDIwMDAyLCAweDAyMDIwMDAyLCAweDAyMDIwMDAyLCAweDAyMDIwMDAyfSwKKwl7MHgwMDAwYTI1YywgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZX0sCisJezB4MDAwMGEyNjAsIDB4MGEwMjE1MDEsIDB4MGEwMjE1MDEsIDB4M2EwMjE1MDEsIDB4M2EwMjE1MDF9LAorCXsweDAwMDBhMjY0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlfSwKKwl7MHgwMDAwYTI4MCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYn0sCisJezB4MDAwMGEyODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAxNTAsIDB4MDAwMDAxNTB9LAorCXsweDAwMDBhMjg4LCAweDAwMDAwMTEwLCAweDAwMDAwMTEwLCAweDAwMDAwMTEwLCAweDAwMDAwMTEwfSwKKwl7MHgwMDAwYTI4YywgMHgwMDAyMjIyMiwgMHgwMDAyMjIyMiwgMHgwMDAyMjIyMiwgMHgwMDAyMjIyMn0sCisJezB4MDAwMGEyYzQsIDB4MDAxNThkMTgsIDB4MDAxNThkMTgsIDB4MDAxNThkMTgsIDB4MDAxNThkMTh9LAorCXsweDAwMDBhMmQwLCAweDAwMDcxOTgxLCAweDAwMDcxOTgxLCAweDAwMDcxOTgxLCAweDAwMDcxOTgyfSwKKwl7MHgwMDAwYTJkOCwgMHhmOTk5YTgzYSwgMHhmOTk5YTgzYSwgMHhmOTk5YTgzYSwgMHhmOTk5YTgzYX0sCisJezB4MDAwMGEzNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhODMwLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljfSwKKwl7MHgwMDAwYWUwNCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMH0sCisJezB4MDAwMGFlMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhZTFjLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljfSwKKwl7MHgwMDAwYWUyMCwgMHgwMDAwMDFiNSwgMHgwMDAwMDFiNSwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZX0sCisJezB4MDAwMGIyODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAxNTAsIDB4MDAwMDAxNTB9LAorCXsweDAwMDBiODMwLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljfSwKKwl7MHgwMDAwYmUwNCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMH0sCisJezB4MDAwMGJlMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiZTFjLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljfSwKKwl7MHgwMDAwYmUyMCwgMHgwMDAwMDFiNSwgMHgwMDAwMDFiNSwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZX0sCisJezB4MDAwMGMyODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAxNTAsIDB4MDAwMDAxNTB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAwX2Jhc2ViYW5kX2NvcmVbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDk4MDAsIDB4YWZlNjhlMzB9LAorCXsweDAwMDA5ODA0LCAweGZkMTRlMDAwfSwKKwl7MHgwMDAwOTgwOCwgMHg5YzBhOWY2Yn0sCisJezB4MDAwMDk4MGMsIDB4MDQ5MDAwMDB9LAorCXsweDAwMDA5ODE0LCAweDkyODBjMDBhfSwKKwl7MHgwMDAwOTgxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MWMsIDB4MDAwMjAwMjh9LAorCXsweDAwMDA5ODM0LCAweDVmM2NhM2RlfSwKKwl7MHgwMDAwOTgzOCwgMHgwMTA4ZWNmZn0sCisJezB4MDAwMDk4M2MsIDB4MTQ3NTA2MDB9LAorCXsweDAwMDA5ODgwLCAweDIwMWZmZjAwfSwKKwl7MHgwMDAwOTg4NCwgMHgwMDAwMTA0Mn0sCisJezB4MDAwMDk4YTQsIDB4MDAyMDA0MDB9LAorCXsweDAwMDA5OGIwLCAweDUyNDQwYmJlfSwKKwl7MHgwMDAwOThkMCwgMHgwMDRiNmE4ZX0sCisJezB4MDAwMDk4ZDQsIDB4MDAwMDA4MjB9LAorCXsweDAwMDA5OGRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOThmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4ZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzA0LCAweGZmNTVmZjU1fSwKKwl7MHgwMDAwOWMwOCwgMHgwMzIwZmY1NX0sCisJezB4MDAwMDljMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWMxNCwgMHgwMDA0NjM4NH0sCisJezB4MDAwMDljMTgsIDB4MDViNmI0NDB9LAorCXsweDAwMDA5YzFjLCAweDAwYjZiNDQwfSwKKwl7MHgwMDAwOWQwMCwgMHhjMDgwYTMzM30sCisJezB4MDAwMDlkMDQsIDB4NDAyMDZjMTB9LAorCXsweDAwMDA5ZDA4LCAweDAwOWM0MDYwfSwKKwl7MHgwMDAwOWQwYywgMHg5ODgzODAwYX0sCisJezB4MDAwMDlkMTAsIDB4MDE4MzQwNjF9LAorCXsweDAwMDA5ZDE0LCAweDAwYzAwNDBifSwKKwl7MHgwMDAwOWQxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDllMDgsIDB4MDAzODIzMGN9LAorCXsweDAwMDA5ZTI0LCAweDk5MGJiNTE1fSwKKwl7MHgwMDAwOWUyOCwgMHgwYzZmMDAwMH0sCisJezB4MDAwMDllMzAsIDB4MDYzMzZmNzd9LAorCXsweDAwMDA5ZTM0LCAweDZhZjY1MzJmfSwKKwl7MHgwMDAwOWUzOCwgMHgwY2M4MGMwMH0sCisJezB4MDAwMDllM2MsIDB4Y2Y5NDYyMjJ9LAorCXsweDAwMDA5ZTQwLCAweDBkMjYxODIwfSwKKwl7MHgwMDAwOWU0YywgMHgwMDAwMTAwNH0sCisJezB4MDAwMDllNTAsIDB4MDBmZjAzZjF9LAorCXsweDAwMDA5ZTU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWZjMCwgMHg4MDNlNDc4OH0sCisJezB4MDAwMDlmYzQsIDB4MDAwMWVmYjV9LAorCXsweDAwMDA5ZmNjLCAweDQwMDAwMDE0fSwKKwl7MHgwMDAwOWZkMCwgMHgwMTE5M2I5M30sCisJezB4MDAwMGEyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyMjgsIDB4MTAwMDIzMTB9LAorCXsweDAwMDBhMjJjLCAweDAxMDM2YTFlfSwKKwl7MHgwMDAwYTIzNCwgMHgxMDAwMGZmZn0sCisJezB4MDAwMGEyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjQ0LCAweDBjMDAwMDAwfSwKKwl7MHgwMDAwYTJhMCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEyYzAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhMmM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJjYywgMHgxOGM0MzQzM30sCisJezB4MDAwMGEyZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJlMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM1MCwgMHgwMDAwYTAwMH0sCisJezB4MDAwMGEzNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM5MCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEzOTQsIDB4MDAwMDA0NDR9LAorCXsweDAwMDBhMzk4LCAweDAwMWYwZTBmfSwKKwl7MHgwMDAwYTM5YywgMHgwMDc1MzkzZn0sCisJezB4MDAwMGEzYTAsIDB4Yjc5ZjY0Mjd9LAorCXsweDAwMDBhM2E0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhOCwgMHhhYWFhYWFhYX0sCisJezB4MDAwMGEzYWMsIDB4M2M0NjY0Nzh9LAorCXsweDAwMDBhM2MwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNjNCwgMHgyMjIyMjIyMH0sCisJezB4MDAwMGEzYzgsIDB4MjAyMDAwMjB9LAorCXsweDAwMDBhM2NjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkMCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDQsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q4LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZTAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2U0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNlOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZWMsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2YwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNmNCwgMHgwMDAwMDI0Nn0sCisJezB4MDAwMGEzZjgsIDB4MGNkYmQzODB9LAorCXsweDAwMDBhM2ZjLCAweDAwMGYwZjAxfSwKKwl7MHgwMDAwYTQwMCwgMHg4ZmE5MWYwMX0sCisJezB4MDAwMGE0MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDA4LCAweDBlNzllNWM2fSwKKwl7MHgwMDAwYTQwYywgMHgwMDgyMDgyMH0sCisJezB4MDAwMGE0MTQsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDE4LCAweDJkMDAxZGNlfSwKKwl7MHgwMDAwYTQxYywgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MjAsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhNDI0LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQyOCwgMHgwMDAwMDFjZX0sCisJezB4MDAwMGE0MmMsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDMwLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE0MzgsIDB4MDAwMDE4MDF9LAorCXsweDAwMDBhNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTQ0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE0NDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDQ4LCAweDA0MDAwMDgwfSwKKwl7MHgwMDAwYTQ0YywgMHgwMDAwMDAwMX0sCisJezB4MDAwMGE0NTAsIDB4MDAwMTAwMDB9LAorCXsweDAwMDBhNDU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2NDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjQ0LCAweDNmYWQ5ZDc0fSwKKwl7MHgwMDAwYTY0OCwgMHgwMDQ4MDYwYX0sCisJezB4MDAwMGE2NGMsIDB4MDAwMDA2Mzd9LAorCXsweDAwMDBhNjcwLCAweDAzMDIwMTAwfSwKKwl7MHgwMDAwYTY3NCwgMHgwOTA4MDUwNH0sCisJezB4MDAwMGE2NzgsIDB4MGQwYzBiMGF9LAorCXsweDAwMDBhNjdjLCAweDEzMTIxMTEwfSwKKwl7MHgwMDAwYTY4MCwgMHgzMTMwMTUxNH0sCisJezB4MDAwMGE2ODQsIDB4MzUzNDMzMzJ9LAorCXsweDAwMDBhNjg4LCAweDAwMDAwMDM2fSwKKwl7MHgwMDAwYTY5MCwgMHgwMDAwMDgzOH0sCisJezB4MDAwMGE3YzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhN2M0LCAweGZmZmZmZmZjfSwKKwl7MHgwMDAwYTdjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE3Y2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhN2QwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTdkNCwgMHgwMDAwMDAwNH0sCisJezB4MDAwMGE3ZGMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhOGQwLCAweDAwNGI2YThlfSwKKwl7MHgwMDAwYThkNCwgMHgwMDAwMDgyMH0sCisJezB4MDAwMGE4ZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhOGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYThmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZDAsIDB4MDAwMDAwODB9LAorCXsweDAwMDBiMmQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjJkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMmU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjJlOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMmYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjJmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiNDA4LCAweDBlNzllNWMwfSwKKwl7MHgwMDAwYjQwYywgMHgwMDgyMDgyMH0sCisJezB4MDAwMGI0MjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiOGQwLCAweDAwNGI2YThlfSwKKwl7MHgwMDAwYjhkNCwgMHgwMDAwMDgyMH0sCisJezB4MDAwMGI4ZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiOGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjhmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZDAsIDB4MDAwMDAwODB9LAorCXsweDAwMDBjMmQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYzJkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjMmU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYzJlOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjMmYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYzJmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjNDA4LCAweDBlNzllNWMwfSwKKwl7MHgwMDAwYzQwYywgMHgwMDgyMDgyMH0sCisJezB4MDAwMGM0MjAsIDB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBNb2Rlc19oaWdoX3Bvd2VyX3R4X2dhaW5fdGFibGVfMnAwW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ4LCAweDAwMDA1MGQ4LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5fSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAwMjIyMCwgMHgwMDAwMjIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDQwMDIyMjIsIDB4MDQwMDIyMjIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDA5MDAyNDIxLCAweDA5MDAyNDIxLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgwZDAwMjYyMSwgMHgwZDAwMjYyMSwgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTMwMDQ2MjAsIDB4MTMwMDQ2MjAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDE5MDA0YTIwLCAweDE5MDA0YTIwLCAweDExMDAwNDAwLCAweDExMDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgxZDAwNGUyMCwgMHgxZDAwNGUyMCwgMHgxNTAwMDQwMiwgMHgxNTAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MjEwMDU0MjAsIDB4MjEwMDU0MjAsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDI2MDA1ZTIwLCAweDI2MDA1ZTIwLCAweDFiMDAwNjAzLCAweDFiMDAwNjAzfSwKKwl7MHgwMDAwYTUyNCwgMHgyYjAwNWU0MCwgMHgyYjAwNWU0MCwgMHgxZjAwMGEwMiwgMHgxZjAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4MmYwMDVlNDIsIDB4MmYwMDVlNDIsIDB4MjMwMDBhMDQsIDB4MjMwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDMzMDA1ZTQ0LCAweDMzMDA1ZTQ0LCAweDI2MDAwYTIwLCAweDI2MDAwYTIwfSwKKwl7MHgwMDAwYTUzMCwgMHgzODAwNWU2NSwgMHgzODAwNWU2NSwgMHgyYTAwMGUyMCwgMHgyYTAwMGUyMH0sCisJezB4MDAwMGE1MzQsIDB4M2MwMDVlNjksIDB4M2MwMDVlNjksIDB4MmUwMDBlMjIsIDB4MmUwMDBlMjJ9LAorCXsweDAwMDBhNTM4LCAweDQwMDA1ZTZiLCAweDQwMDA1ZTZiLCAweDMxMDAwZTI0LCAweDMxMDAwZTI0fSwKKwl7MHgwMDAwYTUzYywgMHg0NDAwNWU2ZCwgMHg0NDAwNWU2ZCwgMHgzNDAwMTY0MCwgMHgzNDAwMTY0MH0sCisJezB4MDAwMGE1NDAsIDB4NDkwMDVlNzIsIDB4NDkwMDVlNzIsIDB4MzgwMDE2NjAsIDB4MzgwMDE2NjB9LAorCXsweDAwMDBhNTQ0LCAweDRlMDA1ZWIyLCAweDRlMDA1ZWIyLCAweDNiMDAxODYxLCAweDNiMDAxODYxfSwKKwl7MHgwMDAwYTU0OCwgMHg1MzAwNWYxMiwgMHg1MzAwNWYxMiwgMHgzZTAwMWE4MSwgMHgzZTAwMWE4MX0sCisJezB4MDAwMGE1NGMsIDB4NTkwMjVlYjUsIDB4NTkwMjVlYjUsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAorCXsweDAwMDBhNTUwLCAweDVlMDI1ZjEyLCAweDVlMDI1ZjEyLCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKKwl7MHgwMDAwYTU1NCwgMHg2MTAyN2YxMiwgMHg2MTAyN2YxMiwgMHg0ODAwMWNlMywgMHg0ODAwMWNlM30sCisJezB4MDAwMGE1NTgsIDB4NjcwMmJmMTIsIDB4NjcwMmJmMTIsIDB4NGMwMDFjZTUsIDB4NGMwMDFjZTV9LAorCXsweDAwMDBhNTVjLCAweDZiMDJiZjE0LCAweDZiMDJiZjE0LCAweDUwMDAxY2U5LCAweDUwMDAxY2U5fSwKKwl7MHgwMDAwYTU2MCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NDAwMWNlYiwgMHg1NDAwMWNlYn0sCisJezB4MDAwMGE1NjQsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTY4LCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU2YywgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1NzAsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTc0LCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU3OCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1N2MsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTgwLCAweDAwODAyMjIwLCAweDAwODAyMjIwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNDgwMjIyMiwgMHgwNDgwMjIyMiwgMHgwNDgwMDAwMiwgMHgwNDgwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MDk4MDI0MjEsIDB4MDk4MDI0MjEsIDB4MDg4MDAwMDQsIDB4MDg4MDAwMDR9LAorCXsweDAwMDBhNThjLCAweDBkODAyNjIxLCAweDBkODAyNjIxLCAweDBiODAwMjAwLCAweDBiODAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxMzgwNDYyMCwgMHgxMzgwNDYyMCwgMHgwZjgwMDIwMiwgMHgwZjgwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MTk4MDRhMjAsIDB4MTk4MDRhMjAsIDB4MTE4MDA0MDAsIDB4MTE4MDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDFkODA0ZTIwLCAweDFkODA0ZTIwLCAweDE1ODAwNDAyLCAweDE1ODAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyMTgwNTQyMCwgMHgyMTgwNTQyMCwgMHgxOTgwMDQwNCwgMHgxOTgwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MjY4MDVlMjAsIDB4MjY4MDVlMjAsIDB4MWI4MDA2MDMsIDB4MWI4MDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDJiODA1ZTQwLCAweDJiODA1ZTQwLCAweDFmODAwYTAyLCAweDFmODAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgyZjgwNWU0MiwgMHgyZjgwNWU0MiwgMHgyMzgwMGEwNCwgMHgyMzgwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4MzM4MDVlNDQsIDB4MzM4MDVlNDQsIDB4MjY4MDBhMjAsIDB4MjY4MDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDM4ODA1ZTY1LCAweDM4ODA1ZTY1LCAweDJhODAwZTIwLCAweDJhODAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHgzYzgwNWU2OSwgMHgzYzgwNWU2OSwgMHgyZTgwMGUyMiwgMHgyZTgwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NDA4MDVlNmIsIDB4NDA4MDVlNmIsIDB4MzE4MDBlMjQsIDB4MzE4MDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDQ0ODA1ZTZkLCAweDQ0ODA1ZTZkLCAweDM0ODAxNjQwLCAweDM0ODAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg0OTgwNWU3MiwgMHg0OTgwNWU3MiwgMHgzODgwMTY2MCwgMHgzODgwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NGU4MDVlYjIsIDB4NGU4MDVlYjIsIDB4M2I4MDE4NjEsIDB4M2I4MDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDUzODA1ZjEyLCAweDUzODA1ZjEyLCAweDNlODAxYTgxLCAweDNlODAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg1OTgyNWViMiwgMHg1OTgyNWViMiwgMHg0MjgwMWE4MywgMHg0MjgwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NWU4MjVmMTIsIDB4NWU4MjVmMTIsIDB4NDQ4MDFjODQsIDB4NDQ4MDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDYxODI3ZjEyLCAweDYxODI3ZjEyLCAweDQ4ODAxY2UzLCAweDQ4ODAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg2NzgyYmYxMiwgMHg2NzgyYmYxMiwgMHg0YzgwMWNlNSwgMHg0YzgwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4NmI4MmJmMTQsIDB4NmI4MmJmMTQsIDB4NTA4MDFjZTksIDB4NTA4MDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU0ODAxY2ViLCAweDU0ODAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMTYwNDQsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTZ9LAorCXsweDAwMDE2MDQ4LCAweGFlNDgwMDAxLCAweGFlNDgwMDAxLCAweGFlNDgwMDAxLCAweGFlNDgwMDAxfSwKKwl7MHgwMDAxNjA2OCwgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2Y30sCisJezB4MDAwMTY0NDQsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTZ9LAorCXsweDAwMDE2NDQ4LCAweGFlNDgwMDAxLCAweGFlNDgwMDAxLCAweGFlNDgwMDAxLCAweGFlNDgwMDAxfSwKKwl7MHgwMDAxNjQ2OCwgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2Y30sCisJezB4MDAwMTY4NDQsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTYsIDB4MDU2ZGIyZTZ9LAorCXsweDAwMDE2ODQ4LCAweGFlNDgwMDAxLCAweGFlNDgwMDAxLCAweGFlNDgwMDAxLCAweGFlNDgwMDAxfSwKKwl7MHgwMDAxNjg2OCwgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2YywgMHg2ZWI2ZGI2Y30sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwME1vZGVzX2hpZ2hfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDBbXVs1XSA9IHsKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCisJezB4MDAwMGE0MTAsIDB4MDAwMDUwZDgsIDB4MDAwMDUwZDgsIDB4MDAwMDUwZDksIDB4MDAwMDUwZDl9LAorCXsweDAwMDBhNTAwLCAweDAwMDAyMjIwLCAweDAwMDAyMjIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTUwNCwgMHgwNDAwMjIyMiwgMHgwNDAwMjIyMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1MDgsIDB4MDkwMDI0MjEsIDB4MDkwMDI0MjEsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNTBjLCAweDBkMDAyNjIxLCAweDBkMDAyNjIxLCAweDBiMDAwMjAwLCAweDBiMDAwMjAwfSwKKwl7MHgwMDAwYTUxMCwgMHgxMzAwNDYyMCwgMHgxMzAwNDYyMCwgMHgwZjAwMDIwMiwgMHgwZjAwMDIwMn0sCisJezB4MDAwMGE1MTQsIDB4MTkwMDRhMjAsIDB4MTkwMDRhMjAsIDB4MTEwMDA0MDAsIDB4MTEwMDA0MDB9LAorCXsweDAwMDBhNTE4LCAweDFkMDA0ZTIwLCAweDFkMDA0ZTIwLCAweDE1MDAwNDAyLCAweDE1MDAwNDAyfSwKKwl7MHgwMDAwYTUxYywgMHgyMTAwNTQyMCwgMHgyMTAwNTQyMCwgMHgxOTAwMDQwNCwgMHgxOTAwMDQwNH0sCisJezB4MDAwMGE1MjAsIDB4MjYwMDVlMjAsIDB4MjYwMDVlMjAsIDB4MWIwMDA2MDMsIDB4MWIwMDA2MDN9LAorCXsweDAwMDBhNTI0LCAweDJiMDA1ZTQwLCAweDJiMDA1ZTQwLCAweDFmMDAwYTAyLCAweDFmMDAwYTAyfSwKKwl7MHgwMDAwYTUyOCwgMHgyZjAwNWU0MiwgMHgyZjAwNWU0MiwgMHgyMzAwMGEwNCwgMHgyMzAwMGEwNH0sCisJezB4MDAwMGE1MmMsIDB4MzMwMDVlNDQsIDB4MzMwMDVlNDQsIDB4MjYwMDBhMjAsIDB4MjYwMDBhMjB9LAorCXsweDAwMDBhNTMwLCAweDM4MDA1ZTY1LCAweDM4MDA1ZTY1LCAweDJhMDAwZTIwLCAweDJhMDAwZTIwfSwKKwl7MHgwMDAwYTUzNCwgMHgzYzAwNWU2OSwgMHgzYzAwNWU2OSwgMHgyZTAwMGUyMiwgMHgyZTAwMGUyMn0sCisJezB4MDAwMGE1MzgsIDB4NDAwMDVlNmIsIDB4NDAwMDVlNmIsIDB4MzEwMDBlMjQsIDB4MzEwMDBlMjR9LAorCXsweDAwMDBhNTNjLCAweDQ0MDA1ZTZkLCAweDQ0MDA1ZTZkLCAweDM0MDAxNjQwLCAweDM0MDAxNjQwfSwKKwl7MHgwMDAwYTU0MCwgMHg0OTAwNWU3MiwgMHg0OTAwNWU3MiwgMHgzODAwMTY2MCwgMHgzODAwMTY2MH0sCisJezB4MDAwMGE1NDQsIDB4NGUwMDVlYjIsIDB4NGUwMDVlYjIsIDB4M2IwMDE4NjEsIDB4M2IwMDE4NjF9LAorCXsweDAwMDBhNTQ4LCAweDUzMDA1ZjEyLCAweDUzMDA1ZjEyLCAweDNlMDAxYTgxLCAweDNlMDAxYTgxfSwKKwl7MHgwMDAwYTU0YywgMHg1OTAyNWViNSwgMHg1OTAyNWViNSwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCisJezB4MDAwMGE1NTAsIDB4NWUwMjVmMTIsIDB4NWUwMjVmMTIsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAorCXsweDAwMDBhNTU0LCAweDYxMDI3ZjEyLCAweDYxMDI3ZjEyLCAweDQ4MDAxY2UzLCAweDQ4MDAxY2UzfSwKKwl7MHgwMDAwYTU1OCwgMHg2NzAyYmYxMiwgMHg2NzAyYmYxMiwgMHg0YzAwMWNlNSwgMHg0YzAwMWNlNX0sCisJezB4MDAwMGE1NWMsIDB4NmIwMmJmMTQsIDB4NmIwMmJmMTQsIDB4NTAwMDFjZTksIDB4NTAwMDFjZTl9LAorCXsweDAwMDBhNTYwLCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU0MDAxY2ViLCAweDU0MDAxY2VifSwKKwl7MHgwMDAwYTU2NCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1NjgsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTZjLCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU3MCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1NzQsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTc4LCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU3YywgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ODAsIDB4MDA4MDIyMjAsIDB4MDA4MDIyMjAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDB9LAorCXsweDAwMDBhNTg0LCAweDA0ODAyMjIyLCAweDA0ODAyMjIyLCAweDA0ODAwMDAyLCAweDA0ODAwMDAyfSwKKwl7MHgwMDAwYTU4OCwgMHgwOTgwMjQyMSwgMHgwOTgwMjQyMSwgMHgwODgwMDAwNCwgMHgwODgwMDAwNH0sCisJezB4MDAwMGE1OGMsIDB4MGQ4MDI2MjEsIDB4MGQ4MDI2MjEsIDB4MGI4MDAyMDAsIDB4MGI4MDAyMDB9LAorCXsweDAwMDBhNTkwLCAweDEzODA0NjIwLCAweDEzODA0NjIwLCAweDBmODAwMjAyLCAweDBmODAwMjAyfSwKKwl7MHgwMDAwYTU5NCwgMHgxOTgwNGEyMCwgMHgxOTgwNGEyMCwgMHgxMTgwMDQwMCwgMHgxMTgwMDQwMH0sCisJezB4MDAwMGE1OTgsIDB4MWQ4MDRlMjAsIDB4MWQ4MDRlMjAsIDB4MTU4MDA0MDIsIDB4MTU4MDA0MDJ9LAorCXsweDAwMDBhNTljLCAweDIxODA1NDIwLCAweDIxODA1NDIwLCAweDE5ODAwNDA0LCAweDE5ODAwNDA0fSwKKwl7MHgwMDAwYTVhMCwgMHgyNjgwNWUyMCwgMHgyNjgwNWUyMCwgMHgxYjgwMDYwMywgMHgxYjgwMDYwM30sCisJezB4MDAwMGE1YTQsIDB4MmI4MDVlNDAsIDB4MmI4MDVlNDAsIDB4MWY4MDBhMDIsIDB4MWY4MDBhMDJ9LAorCXsweDAwMDBhNWE4LCAweDJmODA1ZTQyLCAweDJmODA1ZTQyLCAweDIzODAwYTA0LCAweDIzODAwYTA0fSwKKwl7MHgwMDAwYTVhYywgMHgzMzgwNWU0NCwgMHgzMzgwNWU0NCwgMHgyNjgwMGEyMCwgMHgyNjgwMGEyMH0sCisJezB4MDAwMGE1YjAsIDB4Mzg4MDVlNjUsIDB4Mzg4MDVlNjUsIDB4MmE4MDBlMjAsIDB4MmE4MDBlMjB9LAorCXsweDAwMDBhNWI0LCAweDNjODA1ZTY5LCAweDNjODA1ZTY5LCAweDJlODAwZTIyLCAweDJlODAwZTIyfSwKKwl7MHgwMDAwYTViOCwgMHg0MDgwNWU2YiwgMHg0MDgwNWU2YiwgMHgzMTgwMGUyNCwgMHgzMTgwMGUyNH0sCisJezB4MDAwMGE1YmMsIDB4NDQ4MDVlNmQsIDB4NDQ4MDVlNmQsIDB4MzQ4MDE2NDAsIDB4MzQ4MDE2NDB9LAorCXsweDAwMDBhNWMwLCAweDQ5ODA1ZTcyLCAweDQ5ODA1ZTcyLCAweDM4ODAxNjYwLCAweDM4ODAxNjYwfSwKKwl7MHgwMDAwYTVjNCwgMHg0ZTgwNWViMiwgMHg0ZTgwNWViMiwgMHgzYjgwMTg2MSwgMHgzYjgwMTg2MX0sCisJezB4MDAwMGE1YzgsIDB4NTM4MDVmMTIsIDB4NTM4MDVmMTIsIDB4M2U4MDFhODEsIDB4M2U4MDFhODF9LAorCXsweDAwMDBhNWNjLCAweDU5ODI1ZWIyLCAweDU5ODI1ZWIyLCAweDQyODAxYTgzLCAweDQyODAxYTgzfSwKKwl7MHgwMDAwYTVkMCwgMHg1ZTgyNWYxMiwgMHg1ZTgyNWYxMiwgMHg0NDgwMWM4NCwgMHg0NDgwMWM4NH0sCisJezB4MDAwMGE1ZDQsIDB4NjE4MjdmMTIsIDB4NjE4MjdmMTIsIDB4NDg4MDFjZTMsIDB4NDg4MDFjZTN9LAorCXsweDAwMDBhNWQ4LCAweDY3ODJiZjEyLCAweDY3ODJiZjEyLCAweDRjODAxY2U1LCAweDRjODAxY2U1fSwKKwl7MHgwMDAwYTVkYywgMHg2YjgyYmYxNCwgMHg2YjgyYmYxNCwgMHg1MDgwMWNlOSwgMHg1MDgwMWNlOX0sCisJezB4MDAwMGE1ZTAsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTQ4MDFjZWIsIDB4NTQ4MDFjZWJ9LAorCXsweDAwMDBhNWU0LCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVlOCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZWMsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWYwLCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVmNCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZjgsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWZjLCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAxNjA0NCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNH0sCisJezB4MDAwMTYwNDgsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDF9LAorCXsweDAwMDE2MDY4LCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjfSwKKwl7MHgwMDAxNjQ0NCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNH0sCisJezB4MDAwMTY0NDgsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDF9LAorCXsweDAwMDE2NDY4LCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjfSwKKwl7MHgwMDAxNjg0NCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNCwgMHgwNTZkYjJlNH0sCisJezB4MDAwMTY4NDgsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDEsIDB4OGU0ODAwMDF9LAorCXsweDAwMDE2ODY4LCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjLCAweDZkYjZkYjZjfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwQ29tbW9uX3J4X2dhaW5fdGFibGVfMnAwW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMDAwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYTAwNCwgMHgwMDAzMDAwMn0sCisJezB4MDAwMGEwMDgsIDB4MDAwNTAwMDR9LAorCXsweDAwMDBhMDBjLCAweDAwODEwMDgwfSwKKwl7MHgwMDAwYTAxMCwgMHgwMDgzMDA4Mn0sCisJezB4MDAwMGEwMTQsIDB4MDE4MTAxODB9LAorCXsweDAwMDBhMDE4LCAweDAxODMwMTgyfSwKKwl7MHgwMDAwYTAxYywgMHgwMTg1MDE4NH0sCisJezB4MDAwMGEwMjAsIDB4MDE4OTAxODh9LAorCXsweDAwMDBhMDI0LCAweDAxOGIwMThhfSwKKwl7MHgwMDAwYTAyOCwgMHgwMThkMDE4Y30sCisJezB4MDAwMGEwMmMsIDB4MDE5MTAxOTB9LAorCXsweDAwMDBhMDMwLCAweDAxOTMwMTkyfSwKKwl7MHgwMDAwYTAzNCwgMHgwMTk1MDE5NH0sCisJezB4MDAwMGEwMzgsIDB4MDM4YTAxOTZ9LAorCXsweDAwMDBhMDNjLCAweDAzOGMwMzhifSwKKwl7MHgwMDAwYTA0MCwgMHgwMzkwMDM4ZH0sCisJezB4MDAwMGEwNDQsIDB4MDM5MjAzOTF9LAorCXsweDAwMDBhMDQ4LCAweDAzOTQwMzkzfSwKKwl7MHgwMDAwYTA0YywgMHgwMzk2MDM5NX0sCisJezB4MDAwMGEwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwODAsIDB4MjIyMjIyMjl9LAorCXsweDAwMDBhMDg0LCAweDFkMWQxZDFkfSwKKwl7MHgwMDAwYTA4OCwgMHgxZDFkMWQxZH0sCisJezB4MDAwMGEwOGMsIDB4MWQxZDFkMWR9LAorCXsweDAwMDBhMDkwLCAweDE3MWQxZDFkfSwKKwl7MHgwMDAwYTA5NCwgMHgxMTExMTcxN30sCisJezB4MDAwMGEwOTgsIDB4MDAwMzAzMTF9LAorCXsweDAwMDBhMDljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGMwLCAweDAwMWYwMDAwfSwKKwl7MHgwMDAwYTBjNCwgMHgwMTAwMDEwMX0sCisJezB4MDAwMGEwYzgsIDB4MDExZTAxMWZ9LAorCXsweDAwMDBhMGNjLCAweDAxMWMwMTFkfSwKKwl7MHgwMDAwYTBkMCwgMHgwMjAzMDIwNH0sCisJezB4MDAwMGEwZDQsIDB4MDIwMTAyMDJ9LAorCXsweDAwMDBhMGQ4LCAweDAyMWYwMjAwfSwKKwl7MHgwMDAwYTBkYywgMHgwMzAyMDIxZX0sCisJezB4MDAwMGEwZTAsIDB4MDMwMDAzMDF9LAorCXsweDAwMDBhMGU0LCAweDAzMWUwMzFmfSwKKwl7MHgwMDAwYTBlOCwgMHgwNDAyMDMxZH0sCisJezB4MDAwMGEwZWMsIDB4MDQwMDA0MDF9LAorCXsweDAwMDBhMGYwLCAweDA0MWUwNDFmfSwKKwl7MHgwMDAwYTBmNCwgMHgwNTAyMDQxZH0sCisJezB4MDAwMGEwZjgsIDB4MDUwMDA1MDF9LAorCXsweDAwMDBhMGZjLCAweDA1MWUwNTFmfSwKKwl7MHgwMDAwYTEwMCwgMHgwNjAxMDYwMn0sCisJezB4MDAwMGExMDQsIDB4MDYxZjA2MDB9LAorCXsweDAwMDBhMTA4LCAweDA2MWQwNjFlfSwKKwl7MHgwMDAwYTEwYywgMHgwNzAyMDcwM30sCisJezB4MDAwMGExMTAsIDB4MDcwMDA3MDF9LAorCXsweDAwMDBhMTE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTExOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExNDAsIDB4MDAxZjAwMDB9LAorCXsweDAwMDBhMTQ0LCAweDAxMDAwMTAxfSwKKwl7MHgwMDAwYTE0OCwgMHgwMTFlMDExZn0sCisJezB4MDAwMGExNGMsIDB4MDExYzAxMWR9LAorCXsweDAwMDBhMTUwLCAweDAyMDMwMjA0fSwKKwl7MHgwMDAwYTE1NCwgMHgwMjAxMDIwMn0sCisJezB4MDAwMGExNTgsIDB4MDIxZjAyMDB9LAorCXsweDAwMDBhMTVjLCAweDAzMDIwMjFlfSwKKwl7MHgwMDAwYTE2MCwgMHgwMzAwMDMwMX0sCisJezB4MDAwMGExNjQsIDB4MDMxZTAzMWZ9LAorCXsweDAwMDBhMTY4LCAweDA0MDIwMzFkfSwKKwl7MHgwMDAwYTE2YywgMHgwNDAwMDQwMX0sCisJezB4MDAwMGExNzAsIDB4MDQxZTA0MWZ9LAorCXsweDAwMDBhMTc0LCAweDA1MDIwNDFkfSwKKwl7MHgwMDAwYTE3OCwgMHgwNTAwMDUwMX0sCisJezB4MDAwMGExN2MsIDB4MDUxZTA1MWZ9LAorCXsweDAwMDBhMTgwLCAweDA2MDEwNjAyfSwKKwl7MHgwMDAwYTE4NCwgMHgwNjFmMDYwMH0sCisJezB4MDAwMGExODgsIDB4MDYxZDA2MWV9LAorCXsweDAwMDBhMThjLCAweDA3MDIwNzAzfSwKKwl7MHgwMDAwYTE5MCwgMHgwNzAwMDcwMX0sCisJezB4MDAwMGExOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFmMCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZjQsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmYywgMHgwMDAwMDE5Nn0sCisJezB4MDAwMGIwMDAsIDB4MDAwMTAwMDB9LAorCXsweDAwMDBiMDA0LCAweDAwMDMwMDAyfSwKKwl7MHgwMDAwYjAwOCwgMHgwMDA1MDAwNH0sCisJezB4MDAwMGIwMGMsIDB4MDA4MTAwODB9LAorCXsweDAwMDBiMDEwLCAweDAwODMwMDgyfSwKKwl7MHgwMDAwYjAxNCwgMHgwMTgxMDE4MH0sCisJezB4MDAwMGIwMTgsIDB4MDE4MzAxODJ9LAorCXsweDAwMDBiMDFjLCAweDAxODUwMTg0fSwKKwl7MHgwMDAwYjAyMCwgMHgwMjgxMDI4MH0sCisJezB4MDAwMGIwMjQsIDB4MDI4MzAyODJ9LAorCXsweDAwMDBiMDI4LCAweDAyODUwMjg0fSwKKwl7MHgwMDAwYjAyYywgMHgwMjg5MDI4OH0sCisJezB4MDAwMGIwMzAsIDB4MDI4YjAyOGF9LAorCXsweDAwMDBiMDM0LCAweDAzODgwMjhjfSwKKwl7MHgwMDAwYjAzOCwgMHgwMzhhMDM4OX0sCisJezB4MDAwMGIwM2MsIDB4MDM4YzAzOGJ9LAorCXsweDAwMDBiMDQwLCAweDAzOTAwMzhkfSwKKwl7MHgwMDAwYjA0NCwgMHgwMzkyMDM5MX0sCisJezB4MDAwMGIwNDgsIDB4MDM5NDAzOTN9LAorCXsweDAwMDBiMDRjLCAweDAzOTYwMzk1fSwKKwl7MHgwMDAwYjA1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA1YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA3NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA4MCwgMHgzMjMyMzIzMn0sCisJezB4MDAwMGIwODQsIDB4MmYyZjMyMzJ9LAorCXsweDAwMDBiMDg4LCAweDIzMjgyYTJkfSwKKwl7MHgwMDAwYjA4YywgMHgxYzFlMjEyM30sCisJezB4MDAwMGIwOTAsIDB4MTQxNzE5MTl9LAorCXsweDAwMDBiMDk0LCAweDBlMGUxMjE0fSwKKwl7MHgwMDAwYjA5OCwgMHgwMzA1MDcwN30sCisJezB4MDAwMGIwOWMsIDB4MDAwMzAzMDN9LAorCXsweDAwMDBiMGEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYzAsIDB4MDAzZjAwMjB9LAorCXsweDAwMDBiMGM0LCAweDAwNDAwMDQxfSwKKwl7MHgwMDAwYjBjOCwgMHgwMTQwMDA1Zn0sCisJezB4MDAwMGIwY2MsIDB4MDE2MDAxNWZ9LAorCXsweDAwMDBiMGQwLCAweDAxN2UwMTdmfSwKKwl7MHgwMDAwYjBkNCwgMHgwMjQxMDI0Mn0sCisJezB4MDAwMGIwZDgsIDB4MDI1ZjAyNDB9LAorCXsweDAwMDBiMGRjLCAweDAyN2YwMjYwfSwKKwl7MHgwMDAwYjBlMCwgMHgwMzQxMDI3ZX0sCisJezB4MDAwMGIwZTQsIDB4MDM1ZjAzNDB9LAorCXsweDAwMDBiMGU4LCAweDAzN2YwMzYwfSwKKwl7MHgwMDAwYjBlYywgMHgwNDQwMDQ0MX0sCisJezB4MDAwMGIwZjAsIDB4MDQ2MDA0NWZ9LAorCXsweDAwMDBiMGY0LCAweDA1NDEwNDdmfSwKKwl7MHgwMDAwYjBmOCwgMHgwNTVmMDU0MH0sCisJezB4MDAwMGIwZmMsIDB4MDU3ZjA1NjB9LAorCXsweDAwMDBiMTAwLCAweDA2NDAwNjQxfSwKKwl7MHgwMDAwYjEwNCwgMHgwNjYwMDY1Zn0sCisJezB4MDAwMGIxMDgsIDB4MDY3ZTA2N2Z9LAorCXsweDAwMDBiMTBjLCAweDA3NDEwNzQyfSwKKwl7MHgwMDAwYjExMCwgMHgwNzVmMDc0MH0sCisJezB4MDAwMGIxMTQsIDB4MDc3ZjA3NjB9LAorCXsweDAwMDBiMTE4LCAweDA3ODAwNzgxfSwKKwl7MHgwMDAwYjExYywgMHgwN2EwMDc5Zn0sCisJezB4MDAwMGIxMjAsIDB4MDdjMTA3YmZ9LAorCXsweDAwMDBiMTI0LCAweDAwMDAwN2MwfSwKKwl7MHgwMDAwYjEyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjE0MCwgMHgwMDNmMDAyMH0sCisJezB4MDAwMGIxNDQsIDB4MDA0MDAwNDF9LAorCXsweDAwMDBiMTQ4LCAweDAxNDAwMDVmfSwKKwl7MHgwMDAwYjE0YywgMHgwMTYwMDE1Zn0sCisJezB4MDAwMGIxNTAsIDB4MDE3ZTAxN2Z9LAorCXsweDAwMDBiMTU0LCAweDAyNDEwMjQyfSwKKwl7MHgwMDAwYjE1OCwgMHgwMjVmMDI0MH0sCisJezB4MDAwMGIxNWMsIDB4MDI3ZjAyNjB9LAorCXsweDAwMDBiMTYwLCAweDAzNDEwMjdlfSwKKwl7MHgwMDAwYjE2NCwgMHgwMzVmMDM0MH0sCisJezB4MDAwMGIxNjgsIDB4MDM3ZjAzNjB9LAorCXsweDAwMDBiMTZjLCAweDA0NDAwNDQxfSwKKwl7MHgwMDAwYjE3MCwgMHgwNDYwMDQ1Zn0sCisJezB4MDAwMGIxNzQsIDB4MDU0MTA0N2Z9LAorCXsweDAwMDBiMTc4LCAweDA1NWYwNTQwfSwKKwl7MHgwMDAwYjE3YywgMHgwNTdmMDU2MH0sCisJezB4MDAwMGIxODAsIDB4MDY0MDA2NDF9LAorCXsweDAwMDBiMTg0LCAweDA2NjAwNjVmfSwKKwl7MHgwMDAwYjE4OCwgMHgwNjdlMDY3Zn0sCisJezB4MDAwMGIxOGMsIDB4MDc0MTA3NDJ9LAorCXsweDAwMDBiMTkwLCAweDA3NWYwNzQwfSwKKwl7MHgwMDAwYjE5NCwgMHgwNzdmMDc2MH0sCisJezB4MDAwMGIxOTgsIDB4MDc4MDA3ODF9LAorCXsweDAwMDBiMTljLCAweDA3YTAwNzlmfSwKKwl7MHgwMDAwYjFhMCwgMHgwN2MxMDdiZn0sCisJezB4MDAwMGIxYTQsIDB4MDAwMDA3YzB9LAorCXsweDAwMDBiMWE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFkMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWQ4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFlOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWYwLCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYjFmNCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGIxZjgsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBiMWZjLCAweDAwMDAwMTk2fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwTW9kZXNfbG93X29iX2RiX3R4X2dhaW5fdGFibGVfMnAwW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5fSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDYwMDAwMDMsIDB4MDYwMDAwMDMsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDBhMDAwMDIwLCAweDBhMDAwMDIwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgxMDAwMDAyMywgMHgxMDAwMDAyMywgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTYwMDAyMjAsIDB4MTYwMDAyMjAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDFjMDAwMjIzLCAweDFjMDAwMjIzLCAweDEyMDAwNDAwLCAweDEyMDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgyMTAyMDIyMCwgMHgyMTAyMDIyMCwgMHgxNjAwMDQwMiwgMHgxNjAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MjcwMjAyMjMsIDB4MjcwMjAyMjMsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDJiMDIyMjIwLCAweDJiMDIyMjIwLCAweDFjMDAwNjAzLCAweDFjMDAwNjAzfSwKKwl7MHgwMDAwYTUyNCwgMHgyZjAyMjIyMiwgMHgyZjAyMjIyMiwgMHgyMTAwMGEwMiwgMHgyMTAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4MzQwMjIyMjUsIDB4MzQwMjIyMjUsIDB4MjUwMDBhMDQsIDB4MjUwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDNhMDIyMjJhLCAweDNhMDIyMjJhLCAweDI4MDAwYTIwLCAweDI4MDAwYTIwfSwKKwl7MHgwMDAwYTUzMCwgMHgzZTAyMjIyYywgMHgzZTAyMjIyYywgMHgyYzAwMGUyMCwgMHgyYzAwMGUyMH0sCisJezB4MDAwMGE1MzQsIDB4NDIwMjI0MmEsIDB4NDIwMjI0MmEsIDB4MzAwMDBlMjIsIDB4MzAwMDBlMjJ9LAorCXsweDAwMDBhNTM4LCAweDQ3MDIyNDRhLCAweDQ3MDIyNDRhLCAweDM0MDAwZTI0LCAweDM0MDAwZTI0fSwKKwl7MHgwMDAwYTUzYywgMHg0YjAyMjQ0YywgMHg0YjAyMjQ0YywgMHgzODAwMTY0MCwgMHgzODAwMTY0MH0sCisJezB4MDAwMGE1NDAsIDB4NGUwMjI0NmMsIDB4NGUwMjI0NmMsIDB4M2MwMDE2NjAsIDB4M2MwMDE2NjB9LAorCXsweDAwMDBhNTQ0LCAweDUzMDIyNjZjLCAweDUzMDIyNjZjLCAweDNmMDAxODYxLCAweDNmMDAxODYxfSwKKwl7MHgwMDAwYTU0OCwgMHg1NzAyMjg2YywgMHg1NzAyMjg2YywgMHg0MzAwMWE4MSwgMHg0MzAwMWE4MX0sCisJezB4MDAwMGE1NGMsIDB4NWMwNDI4NmIsIDB4NWMwNDI4NmIsIDB4NDcwMDFhODMsIDB4NDcwMDFhODN9LAorCXsweDAwMDBhNTUwLCAweDYxMDQyYTZjLCAweDYxMDQyYTZjLCAweDRhMDAxYzg0LCAweDRhMDAxYzg0fSwKKwl7MHgwMDAwYTU1NCwgMHg2NjA2MmE2YywgMHg2NjA2MmE2YywgMHg0ZTAwMWNlMywgMHg0ZTAwMWNlM30sCisJezB4MDAwMGE1NTgsIDB4NmIwNjJlNmMsIDB4NmIwNjJlNmMsIDB4NTIwMDFjZTUsIDB4NTIwMDFjZTV9LAorCXsweDAwMDBhNTVjLCAweDcwMDYzMDhjLCAweDcwMDYzMDhjLCAweDU2MDAxY2U5LCAweDU2MDAxY2U5fSwKKwl7MHgwMDAwYTU2MCwgMHg3MzBhMzA4YSwgMHg3MzBhMzA4YSwgMHg1YTAwMWNlYiwgMHg1YTAwMWNlYn0sCisJezB4MDAwMGE1NjQsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTY4LCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU2YywgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1NzAsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTc0LCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU3OCwgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1N2MsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTgwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNjgwMDAwMywgMHgwNjgwMDAwMywgMHgwNDgwMDAwMiwgMHgwNDgwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MGE4MDAwMjAsIDB4MGE4MDAwMjAsIDB4MDg4MDAwMDQsIDB4MDg4MDAwMDR9LAorCXsweDAwMDBhNThjLCAweDEwODAwMDIzLCAweDEwODAwMDIzLCAweDBiODAwMjAwLCAweDBiODAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxNjgwMDIyMCwgMHgxNjgwMDIyMCwgMHgwZjgwMDIwMiwgMHgwZjgwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MWM4MDAyMjMsIDB4MWM4MDAyMjMsIDB4MTI4MDA0MDAsIDB4MTI4MDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDIxODIwMjIwLCAweDIxODIwMjIwLCAweDE2ODAwNDAyLCAweDE2ODAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyNzgyMDIyMywgMHgyNzgyMDIyMywgMHgxOTgwMDQwNCwgMHgxOTgwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MmI4MjIyMjAsIDB4MmI4MjIyMjAsIDB4MWM4MDA2MDMsIDB4MWM4MDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDJmODIyMjIyLCAweDJmODIyMjIyLCAweDIxODAwYTAyLCAweDIxODAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgzNDgyMjIyNSwgMHgzNDgyMjIyNSwgMHgyNTgwMGEwNCwgMHgyNTgwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4M2E4MjIyMmEsIDB4M2E4MjIyMmEsIDB4Mjg4MDBhMjAsIDB4Mjg4MDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDNlODIyMjJjLCAweDNlODIyMjJjLCAweDJjODAwZTIwLCAweDJjODAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHg0MjgyMjQyYSwgMHg0MjgyMjQyYSwgMHgzMDgwMGUyMiwgMHgzMDgwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NDc4MjI0NGEsIDB4NDc4MjI0NGEsIDB4MzQ4MDBlMjQsIDB4MzQ4MDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDRiODIyNDRjLCAweDRiODIyNDRjLCAweDM4ODAxNjQwLCAweDM4ODAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg0ZTgyMjQ2YywgMHg0ZTgyMjQ2YywgMHgzYzgwMTY2MCwgMHgzYzgwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NTM4MjI2NmMsIDB4NTM4MjI2NmMsIDB4M2Y4MDE4NjEsIDB4M2Y4MDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDU3ODIyODZjLCAweDU3ODIyODZjLCAweDQzODAxYTgxLCAweDQzODAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg1Yzg0Mjg2YiwgMHg1Yzg0Mjg2YiwgMHg0NzgwMWE4MywgMHg0NzgwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NjE4NDJhNmMsIDB4NjE4NDJhNmMsIDB4NGE4MDFjODQsIDB4NGE4MDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDY2ODYyYTZjLCAweDY2ODYyYTZjLCAweDRlODAxY2UzLCAweDRlODAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg2Yjg2MmU2YywgMHg2Yjg2MmU2YywgMHg1MjgwMWNlNSwgMHg1MjgwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4NzA4NjMwOGMsIDB4NzA4NjMwOGMsIDB4NTY4MDFjZTksIDB4NTY4MDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDczOGEzMDhhLCAweDczOGEzMDhhLCAweDVhODAxY2ViLCAweDVhODAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMTYwNDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAorCXsweDAwMDE2MDQ4LCAweDY0MDAwMDAxLCAweDY0MDAwMDAxLCAweDY0MDAwMDAxLCAweDY0MDAwMDAxfSwKKwl7MHgwMDAxNjA2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTY0NDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAorCXsweDAwMDE2NDQ4LCAweDY0MDAwMDAxLCAweDY0MDAwMDAxLCAweDY0MDAwMDAxLCAweDY0MDAwMDAxfSwKKwl7MHgwMDAxNjQ2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTY4NDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAorCXsweDAwMDE2ODQ4LCAweDY0MDAwMDAxLCAweDY0MDAwMDAxLCAweDY0MDAwMDAxLCAweDY0MDAwMDAxfSwKKwl7MHgwMDAxNjg2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfbWFjX2NvcmVbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDAwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDMwLCAweDAwMDIwMDg1fSwKKwl7MHgwMDAwMDAzNCwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA0OCwgMHgwMDAwMDAwOH0sCisJezB4MDAwMDAwNGMsIDB4MDAwMDAwMTB9LAorCXsweDAwMDAwMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTA0MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDQ4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1OCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNWMsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDYwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA2NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwZjAsIDB4MDAwMDAxMDB9LAorCXsweDAwMDAxMjcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQ3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDQ4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA0YywgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgwNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1YywgMHgwMDBmYzc4Zn0sCisJezB4MDAwMDgwNjAsIDB4MDAwMDAwMGZ9LAorCXsweDAwMDA4MDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA3MCwgMHgwMDAwMDMxMH0sCisJezB4MDAwMDgwNzQsIDB4MDAwMDAwMjB9LAorCXsweDAwMDA4MDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA5YywgMHgwMDAwMDAwZn0sCisJezB4MDAwMDgwYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGE0LCAweDAyZmYwMDAwfSwKKwl7MHgwMDAwODBhOCwgMHgwZTA3MDYwNX0sCisJezB4MDAwMDgwYWMsIDB4MDAwMDAwMGR9LAorCXsweDAwMDA4MGIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBjMCwgMHgyYTgwMDAwMH0sCisJezB4MDAwMDgwYzQsIDB4MDY5MDAxNjh9LAorCXsweDAwMDA4MGM4LCAweDEzODgxYzIwfSwKKwl7MHgwMDAwODBjYywgMHgwMWY0MDAwMH0sCisJezB4MDAwMDgwZDAsIDB4MDAyNTI1MDB9LAorCXsweDAwMDA4MGQ0LCAweDAwYTAwMDAwfSwKKwl7MHgwMDAwODBkOCwgMHgwMDQwMDAwMH0sCisJezB4MDAwMDgwZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGUwLCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODBlNCwgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgwZTgsIDB4M2YzZjNmM2Z9LAorCXsweDAwMDA4MGVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGZjLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODEwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMDgsIDB4MDAwMDAwNTJ9LAorCXsweDAwMDA4MTBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMTQsIDB4MDAwMDA3ZmZ9LAorCXsweDAwMDA4MTE4LCAweDAwMDAwMGFhfSwKKwl7MHgwMDAwODExYywgMHgwMDAwMzIxMH0sCisJezB4MDAwMDgxMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxM2MsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MTQ0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODE2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTcwLCAweDE4NDg2MjAwfSwKKwl7MHgwMDAwODE3NCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgxNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTdjLCAweDAwMDIwMDAwfSwKKwl7MHgwMDAwODFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxYzQsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4MWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNDAsIDB4MDAxMDAwMDB9LAorCXsweDAwMDA4MjQ0LCAweDAwMTBmNDI0fSwKKwl7MHgwMDAwODI0OCwgMHgwMDAwMDgwMH0sCisJezB4MDAwMDgyNGMsIDB4MDAwMWU4NDh9LAorCXsweDAwMDA4MjUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjVjLCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI2MCwgMHgwMDA4MDkyMn0sCisJezB4MDAwMDgyNjQsIDB4OThhMDAwMTB9LAorCXsweDAwMDA4MjY4LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODI2YywgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjc0LCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI3OCwgMHgwMDNlNDE4MH0sCisJezB4MDAwMDgyN2MsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA4Mjg0LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4OCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyOGMsIDB4MDAwMDAwZmZ9LAorCXsweDAwMDA4Mjk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMTQwfSwKKwl7MHgwMDAwODMxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMWMsIDB4MDAwMDAxMGR9LAorCXsweDAwMDA4MzI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyYywgMHgwMDAwMDAwN30sCisJezB4MDAwMDgzMzAsIDB4MDAwMDAzMDJ9LAorCXsweDAwMDA4MzM0LCAweDAwMDAwNzAwfSwKKwl7MHgwMDAwODMzOCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDgzM2MsIDB4MDI0MDAwMDB9LAorCXsweDAwMDA4MzQwLCAweDAwMDEwN2ZmfSwKKwl7MHgwMDAwODM0NCwgMHhhYTQ4MTA1Yn0sCisJezB4MDAwMDgzNDgsIDB4MDA4ZjAwMDB9LAorCXsweDAwMDA4MzVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM2MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzNjQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MzY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNzQsIDB4MDAwMDAwZmZ9LAorCXsweDAwMDA4Mzc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzODAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzg0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM5MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzOTQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2E0LCAweDAwMDBmYTE0fSwKKwl7MHgwMDAwODNhOCwgMHgwMDBmMGMwMH0sCisJezB4MDAwMDgzYWMsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2IwLCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODNiNCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgzYjgsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2M4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjYywgMHgwMDAwMDIwMH0sCisJezB4MDAwMDgzZDAsIDB4MDAwMzAxZmZ9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBDb21tb25fd29feGxuYV9yeF9nYWluX3RhYmxlXzJwMFtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwYTAwMCwgMHgwMDAxMDAwMH0sCisJezB4MDAwMGEwMDQsIDB4MDAwMzAwMDJ9LAorCXsweDAwMDBhMDA4LCAweDAwMDUwMDA0fSwKKwl7MHgwMDAwYTAwYywgMHgwMDgxMDA4MH0sCisJezB4MDAwMGEwMTAsIDB4MDA4MzAwODJ9LAorCXsweDAwMDBhMDE0LCAweDAxODEwMTgwfSwKKwl7MHgwMDAwYTAxOCwgMHgwMTgzMDE4Mn0sCisJezB4MDAwMGEwMWMsIDB4MDE4NTAxODR9LAorCXsweDAwMDBhMDIwLCAweDAxODkwMTg4fSwKKwl7MHgwMDAwYTAyNCwgMHgwMThiMDE4YX0sCisJezB4MDAwMGEwMjgsIDB4MDE4ZDAxOGN9LAorCXsweDAwMDBhMDJjLCAweDAzODIwMTkwfSwKKwl7MHgwMDAwYTAzMCwgMHgwMzg0MDM4M30sCisJezB4MDAwMGEwMzQsIDB4MDM4ODAzODV9LAorCXsweDAwMDBhMDM4LCAweDAzOGEwMzg5fSwKKwl7MHgwMDAwYTAzYywgMHgwMzhjMDM4Yn0sCisJezB4MDAwMGEwNDAsIDB4MDM5MDAzOGR9LAorCXsweDAwMDBhMDQ0LCAweDAzOTIwMzkxfSwKKwl7MHgwMDAwYTA0OCwgMHgwMzk0MDM5M30sCisJezB4MDAwMGEwNGMsIDB4MDM5NjAzOTV9LAorCXsweDAwMDBhMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDgwLCAweDI5MjkyOTI5fSwKKwl7MHgwMDAwYTA4NCwgMHgyOTI5MjkyOX0sCisJezB4MDAwMGEwODgsIDB4MjkyOTI5Mjl9LAorCXsweDAwMDBhMDhjLCAweDI5MjkyOTI5fSwKKwl7MHgwMDAwYTA5MCwgMHgyMjI5MjkyOX0sCisJezB4MDAwMGEwOTQsIDB4MWQxZDIyMjJ9LAorCXsweDAwMDBhMDk4LCAweDBjMTExMTE3fSwKKwl7MHgwMDAwYTA5YywgMHgwMDAzMDMwM30sCisJezB4MDAwMGEwYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBjMCwgMHgwMDFmMDAwMH0sCisJezB4MDAwMGEwYzQsIDB4MDEwMDAxMDF9LAorCXsweDAwMDBhMGM4LCAweDAxMWUwMTFmfSwKKwl7MHgwMDAwYTBjYywgMHgwMTFjMDExZH0sCisJezB4MDAwMGEwZDAsIDB4MDIwMzAyMDR9LAorCXsweDAwMDBhMGQ0LCAweDAyMDEwMjAyfSwKKwl7MHgwMDAwYTBkOCwgMHgwMjFmMDIwMH0sCisJezB4MDAwMGEwZGMsIDB4MDMwMjAyMWV9LAorCXsweDAwMDBhMGUwLCAweDAzMDAwMzAxfSwKKwl7MHgwMDAwYTBlNCwgMHgwMzFlMDMxZn0sCisJezB4MDAwMGEwZTgsIDB4MDQwMjAzMWR9LAorCXsweDAwMDBhMGVjLCAweDA0MDAwNDAxfSwKKwl7MHgwMDAwYTBmMCwgMHgwNDFlMDQxZn0sCisJezB4MDAwMGEwZjQsIDB4MDUwMjA0MWR9LAorCXsweDAwMDBhMGY4LCAweDA1MDAwNTAxfSwKKwl7MHgwMDAwYTBmYywgMHgwNTFlMDUxZn0sCisJezB4MDAwMGExMDAsIDB4MDYwMTA2MDJ9LAorCXsweDAwMDBhMTA0LCAweDA2MWYwNjAwfSwKKwl7MHgwMDAwYTEwOCwgMHgwNjFkMDYxZX0sCisJezB4MDAwMGExMGMsIDB4MDcwMjA3MDN9LAorCXsweDAwMDBhMTEwLCAweDA3MDAwNzAxfSwKKwl7MHgwMDAwYTExNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTQwLCAweDAwMWYwMDAwfSwKKwl7MHgwMDAwYTE0NCwgMHgwMTAwMDEwMX0sCisJezB4MDAwMGExNDgsIDB4MDExZTAxMWZ9LAorCXsweDAwMDBhMTRjLCAweDAxMWMwMTFkfSwKKwl7MHgwMDAwYTE1MCwgMHgwMjAzMDIwNH0sCisJezB4MDAwMGExNTQsIDB4MDIwMTAyMDJ9LAorCXsweDAwMDBhMTU4LCAweDAyMWYwMjAwfSwKKwl7MHgwMDAwYTE1YywgMHgwMzAyMDIxZX0sCisJezB4MDAwMGExNjAsIDB4MDMwMDAzMDF9LAorCXsweDAwMDBhMTY0LCAweDAzMWUwMzFmfSwKKwl7MHgwMDAwYTE2OCwgMHgwNDAyMDMxZH0sCisJezB4MDAwMGExNmMsIDB4MDQwMDA0MDF9LAorCXsweDAwMDBhMTcwLCAweDA0MWUwNDFmfSwKKwl7MHgwMDAwYTE3NCwgMHgwNTAyMDQxZH0sCisJezB4MDAwMGExNzgsIDB4MDUwMDA1MDF9LAorCXsweDAwMDBhMTdjLCAweDA1MWUwNTFmfSwKKwl7MHgwMDAwYTE4MCwgMHgwNjAxMDYwMn0sCisJezB4MDAwMGExODQsIDB4MDYxZjA2MDB9LAorCXsweDAwMDBhMTg4LCAweDA2MWQwNjFlfSwKKwl7MHgwMDAwYTE4YywgMHgwNzAyMDcwM30sCisJezB4MDAwMGExOTAsIDB4MDcwMDA3MDF9LAorCXsweDAwMDBhMTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExY2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZjAsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY0LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmOCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZmMsIDB4MDAwMDAxOTZ9LAorCXsweDAwMDBiMDAwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYjAwNCwgMHgwMDAzMDAwMn0sCisJezB4MDAwMGIwMDgsIDB4MDAwNTAwMDR9LAorCXsweDAwMDBiMDBjLCAweDAwODEwMDgwfSwKKwl7MHgwMDAwYjAxMCwgMHgwMDgzMDA4Mn0sCisJezB4MDAwMGIwMTQsIDB4MDE4MTAxODB9LAorCXsweDAwMDBiMDE4LCAweDAxODMwMTgyfSwKKwl7MHgwMDAwYjAxYywgMHgwMTg1MDE4NH0sCisJezB4MDAwMGIwMjAsIDB4MDI4MTAyODB9LAorCXsweDAwMDBiMDI0LCAweDAyODMwMjgyfSwKKwl7MHgwMDAwYjAyOCwgMHgwMjg1MDI4NH0sCisJezB4MDAwMGIwMmMsIDB4MDI4OTAyODh9LAorCXsweDAwMDBiMDMwLCAweDAyOGIwMjhhfSwKKwl7MHgwMDAwYjAzNCwgMHgwMzg4MDI4Y30sCisJezB4MDAwMGIwMzgsIDB4MDM4YTAzODl9LAorCXsweDAwMDBiMDNjLCAweDAzOGMwMzhifSwKKwl7MHgwMDAwYjA0MCwgMHgwMzkwMDM4ZH0sCisJezB4MDAwMGIwNDQsIDB4MDM5MjAzOTF9LAorCXsweDAwMDBiMDQ4LCAweDAzOTQwMzkzfSwKKwl7MHgwMDAwYjA0YywgMHgwMzk2MDM5NX0sCisJezB4MDAwMGIwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwODAsIDB4MzIzMjMyMzJ9LAorCXsweDAwMDBiMDg0LCAweDJmMmYzMjMyfSwKKwl7MHgwMDAwYjA4OCwgMHgyMzI4MmEyZH0sCisJezB4MDAwMGIwOGMsIDB4MWMxZTIxMjN9LAorCXsweDAwMDBiMDkwLCAweDE0MTcxOTE5fSwKKwl7MHgwMDAwYjA5NCwgMHgwZTBlMTIxNH0sCisJezB4MDAwMGIwOTgsIDB4MDMwNTA3MDd9LAorCXsweDAwMDBiMDljLCAweDAwMDMwMzAzfSwKKwl7MHgwMDAwYjBhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGMwLCAweDAwM2YwMDIwfSwKKwl7MHgwMDAwYjBjNCwgMHgwMDQwMDA0MX0sCisJezB4MDAwMGIwYzgsIDB4MDE0MDAwNWZ9LAorCXsweDAwMDBiMGNjLCAweDAxNjAwMTVmfSwKKwl7MHgwMDAwYjBkMCwgMHgwMTdlMDE3Zn0sCisJezB4MDAwMGIwZDQsIDB4MDI0MTAyNDJ9LAorCXsweDAwMDBiMGQ4LCAweDAyNWYwMjQwfSwKKwl7MHgwMDAwYjBkYywgMHgwMjdmMDI2MH0sCisJezB4MDAwMGIwZTAsIDB4MDM0MTAyN2V9LAorCXsweDAwMDBiMGU0LCAweDAzNWYwMzQwfSwKKwl7MHgwMDAwYjBlOCwgMHgwMzdmMDM2MH0sCisJezB4MDAwMGIwZWMsIDB4MDQ0MDA0NDF9LAorCXsweDAwMDBiMGYwLCAweDA0NjAwNDVmfSwKKwl7MHgwMDAwYjBmNCwgMHgwNTQxMDQ3Zn0sCisJezB4MDAwMGIwZjgsIDB4MDU1ZjA1NDB9LAorCXsweDAwMDBiMGZjLCAweDA1N2YwNTYwfSwKKwl7MHgwMDAwYjEwMCwgMHgwNjQwMDY0MX0sCisJezB4MDAwMGIxMDQsIDB4MDY2MDA2NWZ9LAorCXsweDAwMDBiMTA4LCAweDA2N2UwNjdmfSwKKwl7MHgwMDAwYjEwYywgMHgwNzQxMDc0Mn0sCisJezB4MDAwMGIxMTAsIDB4MDc1ZjA3NDB9LAorCXsweDAwMDBiMTE0LCAweDA3N2YwNzYwfSwKKwl7MHgwMDAwYjExOCwgMHgwNzgwMDc4MX0sCisJezB4MDAwMGIxMWMsIDB4MDdhMDA3OWZ9LAorCXsweDAwMDBiMTIwLCAweDA3YzEwN2JmfSwKKwl7MHgwMDAwYjEyNCwgMHgwMDAwMDdjMH0sCisJezB4MDAwMGIxMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxNDAsIDB4MDAzZjAwMjB9LAorCXsweDAwMDBiMTQ0LCAweDAwNDAwMDQxfSwKKwl7MHgwMDAwYjE0OCwgMHgwMTQwMDA1Zn0sCisJezB4MDAwMGIxNGMsIDB4MDE2MDAxNWZ9LAorCXsweDAwMDBiMTUwLCAweDAxN2UwMTdmfSwKKwl7MHgwMDAwYjE1NCwgMHgwMjQxMDI0Mn0sCisJezB4MDAwMGIxNTgsIDB4MDI1ZjAyNDB9LAorCXsweDAwMDBiMTVjLCAweDAyN2YwMjYwfSwKKwl7MHgwMDAwYjE2MCwgMHgwMzQxMDI3ZX0sCisJezB4MDAwMGIxNjQsIDB4MDM1ZjAzNDB9LAorCXsweDAwMDBiMTY4LCAweDAzN2YwMzYwfSwKKwl7MHgwMDAwYjE2YywgMHgwNDQwMDQ0MX0sCisJezB4MDAwMGIxNzAsIDB4MDQ2MDA0NWZ9LAorCXsweDAwMDBiMTc0LCAweDA1NDEwNDdmfSwKKwl7MHgwMDAwYjE3OCwgMHgwNTVmMDU0MH0sCisJezB4MDAwMGIxN2MsIDB4MDU3ZjA1NjB9LAorCXsweDAwMDBiMTgwLCAweDA2NDAwNjQxfSwKKwl7MHgwMDAwYjE4NCwgMHgwNjYwMDY1Zn0sCisJezB4MDAwMGIxODgsIDB4MDY3ZTA2N2Z9LAorCXsweDAwMDBiMThjLCAweDA3NDEwNzQyfSwKKwl7MHgwMDAwYjE5MCwgMHgwNzVmMDc0MH0sCisJezB4MDAwMGIxOTQsIDB4MDc3ZjA3NjB9LAorCXsweDAwMDBiMTk4LCAweDA3ODAwNzgxfSwKKwl7MHgwMDAwYjE5YywgMHgwN2EwMDc5Zn0sCisJezB4MDAwMGIxYTAsIDB4MDdjMTA3YmZ9LAorCXsweDAwMDBiMWE0LCAweDAwMDAwN2MwfSwKKwl7MHgwMDAwYjFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFkOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFmMCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGIxZjQsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBiMWY4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYjFmYywgMHgwMDAwMDE5Nn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfc29jX3ByZWFtYmxlW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA0MGE0LCAweDAwYTBjMWM5fSwKKwl7MHgwMDAwNzAwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDcwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA3MDM0LCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwNzAzOCwgMHgwMDAwMDRjMn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMFBjaWVQaHlfcGxsX29uX2Nsa3JlcV9kaXNhYmxlX0wxXzJwMFtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHgwODIxMmU1ZX0sCisJezB4MDAwMDQwNDAsIDB4MDAwODAwM2J9LAorCXsweDAwMDA0MDQ0LCAweDAwMDAwMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwUGNpZVBoeV9jbGtyZXFfZW5hYmxlX0wxXzJwMFtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHgwODI1M2U1ZX0sCisJezB4MDAwMDQwNDAsIDB4MDAwODAwM2J9LAorCXsweDAwMDA0MDQ0LCAweDAwMDAwMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwUGNpZVBoeV9jbGtyZXFfZGlzYWJsZV9MMV8ycDBbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDQwNDAsIDB4MDgyMTNlNWV9LAorCXsweDAwMDA0MDQwLCAweDAwMDgwMDNifSwKKwl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCit9OworCisjZW5kaWYgLyogSU5JVFZBTFNfOTAwM18yUDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM18ycDJfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfMnAyX2luaXR2YWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5OGFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfMnAyX2luaXR2YWxzLmgKQEAgLTAsMCArMSwxNzg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgSU5JVFZBTFNfOTAwM18yUDJfSAorI2RlZmluZSBJTklUVkFMU185MDAzXzJQMl9ICisKKy8qIEFSOTAwMyAyLjIgKi8KKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAyX3JhZGlvX3Bvc3RhbWJsZVtdWzVdID0geworCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KKwl7MHgwMDAxNjA5YywgMHgwZGQwOGYyOSwgMHgwZGQwOGYyOSwgMHgwYjI4M2YzMSwgMHgwYjI4M2YzMX0sCisJezB4MDAwMTYwYWMsIDB4YTQ2NTNjMDAsIDB4YTQ2NTNjMDAsIDB4MjQ2NTI4MDAsIDB4MjQ2NTI4MDB9LAorCXsweDAwMDE2MGIwLCAweDAzMjg0ZjNlLCAweDAzMjg0ZjNlLCAweDA1ZDA4ZjIwLCAweDA1ZDA4ZjIwfSwKKwl7MHgwMDAxNjEwYywgMHgwODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYxNDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4NTA4MDQwMDgsIDB4NTA4MDQwMDh9LAorCXsweDAwMDE2NTBjLCAweDA4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjU0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg1MDgwNDAwOCwgMHg1MDgwNDAwOH0sCisJezB4MDAwMTY5MGMsIDB4MDgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2OTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDUwODA0MDA4LCAweDUwODA0MDA4fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMnAyW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5fSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDYwMDAwMDMsIDB4MDYwMDAwMDMsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDBhMDAwMDIwLCAweDBhMDAwMDIwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgxMDAwMDAyMywgMHgxMDAwMDAyMywgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTYwMDAyMjAsIDB4MTYwMDAyMjAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDFjMDAwMjIzLCAweDFjMDAwMjIzLCAweDEyMDAwNDAwLCAweDEyMDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgyMTAwMjIyMCwgMHgyMTAwMjIyMCwgMHgxNjAwMDQwMiwgMHgxNjAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MjcwMDIyMjMsIDB4MjcwMDIyMjMsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDJiMDIyMjIwLCAweDJiMDIyMjIwLCAweDFjMDAwNjAzLCAweDFjMDAwNjAzfSwKKwl7MHgwMDAwYTUyNCwgMHgyZjAyMjIyMiwgMHgyZjAyMjIyMiwgMHgyMTAwMGEwMiwgMHgyMTAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4MzQwMjIyMjUsIDB4MzQwMjIyMjUsIDB4MjUwMDBhMDQsIDB4MjUwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDNhMDIyMjJhLCAweDNhMDIyMjJhLCAweDI4MDAwYTIwLCAweDI4MDAwYTIwfSwKKwl7MHgwMDAwYTUzMCwgMHgzZTAyMjIyYywgMHgzZTAyMjIyYywgMHgyYzAwMGUyMCwgMHgyYzAwMGUyMH0sCisJezB4MDAwMGE1MzQsIDB4NDIwMjI0MmEsIDB4NDIwMjI0MmEsIDB4MzAwMDBlMjIsIDB4MzAwMDBlMjJ9LAorCXsweDAwMDBhNTM4LCAweDQ3MDIyNDRhLCAweDQ3MDIyNDRhLCAweDM0MDAwZTI0LCAweDM0MDAwZTI0fSwKKwl7MHgwMDAwYTUzYywgMHg0YjAyMjQ0YywgMHg0YjAyMjQ0YywgMHgzODAwMTY0MCwgMHgzODAwMTY0MH0sCisJezB4MDAwMGE1NDAsIDB4NGUwMjI0NmMsIDB4NGUwMjI0NmMsIDB4M2MwMDE2NjAsIDB4M2MwMDE2NjB9LAorCXsweDAwMDBhNTQ0LCAweDUzMDIyNjZjLCAweDUzMDIyNjZjLCAweDNmMDAxODYxLCAweDNmMDAxODYxfSwKKwl7MHgwMDAwYTU0OCwgMHg1NzAyMjg2YywgMHg1NzAyMjg2YywgMHg0MzAwMWE4MSwgMHg0MzAwMWE4MX0sCisJezB4MDAwMGE1NGMsIDB4NWMwMjQ4NmIsIDB4NWMwMjQ4NmIsIDB4NDcwMDFhODMsIDB4NDcwMDFhODN9LAorCXsweDAwMDBhNTUwLCAweDYxMDI0YTZjLCAweDYxMDI0YTZjLCAweDRhMDAxYzg0LCAweDRhMDAxYzg0fSwKKwl7MHgwMDAwYTU1NCwgMHg2NjAyNmE2YywgMHg2NjAyNmE2YywgMHg0ZTAwMWNlMywgMHg0ZTAwMWNlM30sCisJezB4MDAwMGE1NTgsIDB4NmIwMjZlNmMsIDB4NmIwMjZlNmMsIDB4NTIwMDFjZTUsIDB4NTIwMDFjZTV9LAorCXsweDAwMDBhNTVjLCAweDcwMDI3MDhjLCAweDcwMDI3MDhjLCAweDU2MDAxY2U5LCAweDU2MDAxY2U5fSwKKwl7MHgwMDAwYTU2MCwgMHg3MzAyYjA4YSwgMHg3MzAyYjA4YSwgMHg1YTAwMWNlYiwgMHg1YTAwMWNlYn0sCisJezB4MDAwMGE1NjQsIDB4NzcwMmIwOGMsIDB4NzcwMmIwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTY4LCAweDc3MDJiMDhjLCAweDc3MDJiMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU2YywgMHg3NzAyYjA4YywgMHg3NzAyYjA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1NzAsIDB4NzcwMmIwOGMsIDB4NzcwMmIwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTc0LCAweDc3MDJiMDhjLCAweDc3MDJiMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU3OCwgMHg3NzAyYjA4YywgMHg3NzAyYjA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1N2MsIDB4NzcwMmIwOGMsIDB4NzcwMmIwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTgwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNjgwMDAwMywgMHgwNjgwMDAwMywgMHgwNDgwMDAwMiwgMHgwNDgwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MGE4MDAwMjAsIDB4MGE4MDAwMjAsIDB4MDg4MDAwMDQsIDB4MDg4MDAwMDR9LAorCXsweDAwMDBhNThjLCAweDEwODAwMDIzLCAweDEwODAwMDIzLCAweDBiODAwMjAwLCAweDBiODAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxNjgwMDIyMCwgMHgxNjgwMDIyMCwgMHgwZjgwMDIwMiwgMHgwZjgwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MWM4MDAyMjMsIDB4MWM4MDAyMjMsIDB4MTI4MDA0MDAsIDB4MTI4MDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDIxODAyMjIwLCAweDIxODAyMjIwLCAweDE2ODAwNDAyLCAweDE2ODAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyNzgwMjIyMywgMHgyNzgwMjIyMywgMHgxOTgwMDQwNCwgMHgxOTgwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MmI4MjIyMjAsIDB4MmI4MjIyMjAsIDB4MWM4MDA2MDMsIDB4MWM4MDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDJmODIyMjIyLCAweDJmODIyMjIyLCAweDIxODAwYTAyLCAweDIxODAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgzNDgyMjIyNSwgMHgzNDgyMjIyNSwgMHgyNTgwMGEwNCwgMHgyNTgwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4M2E4MjIyMmEsIDB4M2E4MjIyMmEsIDB4Mjg4MDBhMjAsIDB4Mjg4MDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDNlODIyMjJjLCAweDNlODIyMjJjLCAweDJjODAwZTIwLCAweDJjODAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHg0MjgyMjQyYSwgMHg0MjgyMjQyYSwgMHgzMDgwMGUyMiwgMHgzMDgwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NDc4MjI0NGEsIDB4NDc4MjI0NGEsIDB4MzQ4MDBlMjQsIDB4MzQ4MDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDRiODIyNDRjLCAweDRiODIyNDRjLCAweDM4ODAxNjQwLCAweDM4ODAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg0ZTgyMjQ2YywgMHg0ZTgyMjQ2YywgMHgzYzgwMTY2MCwgMHgzYzgwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NTM4MjI2NmMsIDB4NTM4MjI2NmMsIDB4M2Y4MDE4NjEsIDB4M2Y4MDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDU3ODIyODZjLCAweDU3ODIyODZjLCAweDQzODAxYTgxLCAweDQzODAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg1YzgyNDg2YiwgMHg1YzgyNDg2YiwgMHg0NzgwMWE4MywgMHg0NzgwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NjE4MjRhNmMsIDB4NjE4MjRhNmMsIDB4NGE4MDFjODQsIDB4NGE4MDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDY2ODI2YTZjLCAweDY2ODI2YTZjLCAweDRlODAxY2UzLCAweDRlODAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg2YjgyNmU2YywgMHg2YjgyNmU2YywgMHg1MjgwMWNlNSwgMHg1MjgwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4NzA4MjcwOGMsIDB4NzA4MjcwOGMsIDB4NTY4MDFjZTksIDB4NTY4MDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDczODJiMDhhLCAweDczODJiMDhhLCAweDVhODAxY2ViLCAweDVhODAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg3NzgyYjA4YywgMHg3NzgyYjA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4Nzc4MmIwOGMsIDB4Nzc4MmIwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDc3ODJiMDhjLCAweDc3ODJiMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg3NzgyYjA4YywgMHg3NzgyYjA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4Nzc4MmIwOGMsIDB4Nzc4MmIwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDc3ODJiMDhjLCAweDc3ODJiMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg3NzgyYjA4YywgMHg3NzgyYjA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMTYwNDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAorCXsweDAwMDE2MDQ4LCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxfSwKKwl7MHgwMDAxNjA2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTY0NDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAorCXsweDAwMDE2NDQ4LCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxfSwKKwl7MHgwMDAxNjQ2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTY4NDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAorCXsweDAwMDE2ODQ4LCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxfSwKKwl7MHgwMDAxNjg2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwME1vZGVzX2Zhc3RfY2xvY2tfMnAyW11bM10gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAqLworCXsweDAwMDAxMDMwLCAweDAwMDAwMjY4LCAweDAwMDAwNGQwfSwKKwl7MHgwMDAwMTA3MCwgMHgwMDAwMDE4YywgMHgwMDAwMDMxOH0sCisJezB4MDAwMDEwYjAsIDB4MDAwMDBmZDAsIDB4MDAwMDFmYTB9LAorCXsweDAwMDA4MDE0LCAweDA0NGMwNDRjLCAweDA4OTgwODk4fSwKKwl7MHgwMDAwODAxYywgMHgxNDhlYzAyYiwgMHgxNDhlYzA1N30sCisJezB4MDAwMDgzMTgsIDB4MDAwMDQ0YzAsIDB4MDAwMDg5ODB9LAorCXsweDAwMDA5ZTAwLCAweDAzNzIxODIxLCAweDAzNzIxODIxfSwKKwl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNn0sCisJezB4MDAwMGEyNTQsIDB4MDAwMDA4OTgsIDB4MDAwMDExMzB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAyX3JhZGlvX2NvcmVbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMTYwMDAsIDB4MzZkYjZkYjZ9LAorCXsweDAwMDE2MDA0LCAweDZkYjZkYjQwfSwKKwl7MHgwMDAxNjAwOCwgMHg3M2YwMDAwMH0sCisJezB4MDAwMTYwMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2MDQwLCAweDdmODBmZmY4fSwKKwl7MHgwMDAxNjA0YywgMHg3NmQwMDViNX0sCisJezB4MDAwMTYwNTAsIDB4NTU2Y2YwMzF9LAorCXsweDAwMDE2MDU0LCAweDEzNDQ5NDQwfSwKKwl7MHgwMDAxNjA1OCwgMHgwYzUxYzkyY30sCisJezB4MDAwMTYwNWMsIDB4M2RiN2ZmZmN9LAorCXsweDAwMDE2MDYwLCAweGZmZmZmZmZjfSwKKwl7MHgwMDAxNjA2NCwgMHgwMDBmMDI3OH0sCisJezB4MDAwMTYwNmMsIDB4NmRiNjAwMDB9LAorCXsweDAwMDE2MDgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjA4NCwgMHgwZTQ4MDQ4Y30sCisJezB4MDAwMTYwODgsIDB4NTQyMTQ1MTR9LAorCXsweDAwMDE2MDhjLCAweDExOWY0ODFlfSwKKwl7MHgwMDAxNjA5MCwgMHgyNDkyNjQ5MH0sCisJezB4MDAwMTYwOTgsIDB4ZDI4ODg4ODh9LAorCXsweDAwMDE2MGEwLCAweDBhMTA4ZmZlfSwKKwl7MHgwMDAxNjBhNCwgMHg4MTJmYzM3MH0sCisJezB4MDAwMTYwYTgsIDB4NDIzYzgwMDB9LAorCXsweDAwMDE2MGI0LCAweDkyNDgwMDgwfSwKKwl7MHgwMDAxNjBjMCwgMHgwMGFkYjZkMH0sCisJezB4MDAwMTYwYzQsIDB4NmRiNmRiNjB9LAorCXsweDAwMDE2MGM4LCAweDZkYjZkYjZjfSwKKwl7MHgwMDAxNjBjYywgMHgwMWU2YzAwMH0sCisJezB4MDAwMTYxMDAsIDB4M2ZmZmJlMDF9LAorCXsweDAwMDE2MTA0LCAweGZmZjgwMDAwfSwKKwl7MHgwMDAxNjEwOCwgMHgwMDA4MDAxMH0sCisJezB4MDAwMTYxNDQsIDB4MDIwODQwODB9LAorCXsweDAwMDE2MTQ4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjI4MCwgMHgwNThhMDAwMX0sCisJezB4MDAwMTYyODQsIDB4M2Q4NDAyMDh9LAorCXsweDAwMDE2Mjg4LCAweDA1YTIwNDA4fSwKKwl7MHgwMDAxNjI4YywgMHgwMDAzOGMwN30sCisJezB4MDAwMTYyOTAsIDB4MDAwMDAwMDR9LAorCXsweDAwMDE2Mjk0LCAweDQ1OGFhMTRmfSwKKwl7MHgwMDAxNjM4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Mzg4LCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNjM4YywgMHgwMDgwMDcwMH0sCisJezB4MDAwMTYzOTAsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2Mzk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjM5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2EwLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAxNjNhNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMTYzYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2FjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYzAsIDB4MDAwMDAwYTB9LAorCXsweDAwMDE2M2M0LCAweDAwMGMwMDAwfSwKKwl7MHgwMDAxNjNjOCwgMHgxNDAyMTQwMn0sCisJezB4MDAwMTYzY2MsIDB4MDAwMDE0MDJ9LAorCXsweDAwMDE2M2QwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY0MDAsIDB4MzZkYjZkYjZ9LAorCXsweDAwMDE2NDA0LCAweDZkYjZkYjQwfSwKKwl7MHgwMDAxNjQwOCwgMHg3M2YwMDAwMH0sCisJezB4MDAwMTY0MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2NDQwLCAweDdmODBmZmY4fSwKKwl7MHgwMDAxNjQ0YywgMHg3NmQwMDViNX0sCisJezB4MDAwMTY0NTAsIDB4NTU2Y2YwMzF9LAorCXsweDAwMDE2NDU0LCAweDEzNDQ5NDQwfSwKKwl7MHgwMDAxNjQ1OCwgMHgwYzUxYzkyY30sCisJezB4MDAwMTY0NWMsIDB4M2RiN2ZmZmN9LAorCXsweDAwMDE2NDYwLCAweGZmZmZmZmZjfSwKKwl7MHgwMDAxNjQ2NCwgMHgwMDBmMDI3OH0sCisJezB4MDAwMTY0NmMsIDB4NmRiNjAwMDB9LAorCXsweDAwMDE2NTAwLCAweDNmZmZiZTAxfSwKKwl7MHgwMDAxNjUwNCwgMHhmZmY4MDAwMH0sCisJezB4MDAwMTY1MDgsIDB4MDAwODAwMTB9LAorCXsweDAwMDE2NTQ0LCAweDAyMDg0MDgwfSwKKwl7MHgwMDAxNjU0OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3ODAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Nzg0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjc4OCwgMHgwMDgwMDcwMH0sCisJezB4MDAwMTY3OGMsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2NzkwLCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNjc5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3OTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2NzljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjdhMCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMTY3YTQsIDB4MDAwMDAwMDF9LAorCXsweDAwMDE2N2E4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjdhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3YjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2N2I0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjdiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3YmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2N2MwLCAweDAwMDAwMGEwfSwKKwl7MHgwMDAxNjdjNCwgMHgwMDBjMDAwMH0sCisJezB4MDAwMTY3YzgsIDB4MTQwMjE0MDJ9LAorCXsweDAwMDE2N2NjLCAweDAwMDAxNDAyfSwKKwl7MHgwMDAxNjdkMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTY3ZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2ODAwLCAweDM2ZGI2ZGI2fSwKKwl7MHgwMDAxNjgwNCwgMHg2ZGI2ZGI0MH0sCisJezB4MDAwMTY4MDgsIDB4NzNmMDAwMDB9LAorCXsweDAwMDE2ODBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjg0MCwgMHg3ZjgwZmZmOH0sCisJezB4MDAwMTY4NGMsIDB4NzZkMDA1YjV9LAorCXsweDAwMDE2ODUwLCAweDU1NmNmMDMxfSwKKwl7MHgwMDAxNjg1NCwgMHgxMzQ0OTQ0MH0sCisJezB4MDAwMTY4NTgsIDB4MGM1MWM5MmN9LAorCXsweDAwMDE2ODVjLCAweDNkYjdmZmZjfSwKKwl7MHgwMDAxNjg2MCwgMHhmZmZmZmZmY30sCisJezB4MDAwMTY4NjQsIDB4MDAwZjAyNzh9LAorCXsweDAwMDE2ODZjLCAweDZkYjYwMDAwfSwKKwl7MHgwMDAxNjkwMCwgMHgzZmZmYmUwMX0sCisJezB4MDAwMTY5MDQsIDB4ZmZmODAwMDB9LAorCXsweDAwMDE2OTA4LCAweDAwMDgwMDEwfSwKKwl7MHgwMDAxNjk0NCwgMHgwMjA4NDA4MH0sCisJezB4MDAwMTY5NDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YjgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmI4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiODgsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2YjhjLCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNmI5MCwgMHgwMDgwMDcwMH0sCisJezB4MDAwMTZiOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Yjk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmI5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiYTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDE2YmE0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAxNmJhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YmIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmJiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTZiYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YmJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNmJjMCwgMHgwMDAwMDBhMH0sCisJezB4MDAwMTZiYzQsIDB4MDAwYzAwMDB9LAorCXsweDAwMDE2YmM4LCAweDE0MDIxNDAyfSwKKwl7MHgwMDAxNmJjYywgMHgwMDAwMTQwMn0sCisJezB4MDAwMTZiZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2YmQ0LCAweDAwMDAwMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwQ29tbW9uX3J4X2dhaW5fdGFibGVfbWVybGluXzJwMltdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwYTAwMCwgMHgwMjAwMDEwMX0sCisJezB4MDAwMGEwMDQsIDB4MDIwMDAxMDJ9LAorCXsweDAwMDBhMDA4LCAweDAyMDAwMTAzfSwKKwl7MHgwMDAwYTAwYywgMHgwMjAwMDEwNH0sCisJezB4MDAwMGEwMTAsIDB4MDIwMDAyMDB9LAorCXsweDAwMDBhMDE0LCAweDAyMDAwMjAxfSwKKwl7MHgwMDAwYTAxOCwgMHgwMjAwMDIwMn0sCisJezB4MDAwMGEwMWMsIDB4MDIwMDAyMDN9LAorCXsweDAwMDBhMDIwLCAweDAyMDAwMjA0fSwKKwl7MHgwMDAwYTAyNCwgMHgwMjAwMDIwNX0sCisJezB4MDAwMGEwMjgsIDB4MDIwMDAyMDh9LAorCXsweDAwMDBhMDJjLCAweDAyMDAwMzAyfSwKKwl7MHgwMDAwYTAzMCwgMHgwMjAwMDMwM30sCisJezB4MDAwMGEwMzQsIDB4MDIwMDAzMDR9LAorCXsweDAwMDBhMDM4LCAweDAyMDAwNDAwfSwKKwl7MHgwMDAwYTAzYywgMHgwMjAxMDMwMH0sCisJezB4MDAwMGEwNDAsIDB4MDIwMTAzMDF9LAorCXsweDAwMDBhMDQ0LCAweDAyMDEwMzAyfSwKKwl7MHgwMDAwYTA0OCwgMHgwMjAwMDUwMH0sCisJezB4MDAwMGEwNGMsIDB4MDIwMTA0MDB9LAorCXsweDAwMDBhMDUwLCAweDAyMDIwMzAwfSwKKwl7MHgwMDAwYTA1NCwgMHgwMjAyMDMwMX0sCisJezB4MDAwMGEwNTgsIDB4MDIwMjAzMDJ9LAorCXsweDAwMDBhMDVjLCAweDAyMDIwMzAzfSwKKwl7MHgwMDAwYTA2MCwgMHgwMjAyMDQwMH0sCisJezB4MDAwMGEwNjQsIDB4MDIwMzAzMDB9LAorCXsweDAwMDBhMDY4LCAweDAyMDMwMzAxfSwKKwl7MHgwMDAwYTA2YywgMHgwMjAzMDMwMn0sCisJezB4MDAwMGEwNzAsIDB4MDIwMzAzMDN9LAorCXsweDAwMDBhMDc0LCAweDAyMDMwNDAwfSwKKwl7MHgwMDAwYTA3OCwgMHgwMjA0MDMwMH0sCisJezB4MDAwMGEwN2MsIDB4MDIwNDAzMDF9LAorCXsweDAwMDBhMDgwLCAweDAyMDQwMzAyfSwKKwl7MHgwMDAwYTA4NCwgMHgwMjA0MDMwM30sCisJezB4MDAwMGEwODgsIDB4MDIwMzA1MDB9LAorCXsweDAwMDBhMDhjLCAweDAyMDQwNDAwfSwKKwl7MHgwMDAwYTA5MCwgMHgwMjA1MDIwM30sCisJezB4MDAwMGEwOTQsIDB4MDIwNTAyMDR9LAorCXsweDAwMDBhMDk4LCAweDAyMDUwMjA1fSwKKwl7MHgwMDAwYTA5YywgMHgwMjA0MDUwMH0sCisJezB4MDAwMGEwYTAsIDB4MDIwNTAzMDF9LAorCXsweDAwMDBhMGE0LCAweDAyMDUwMzAyfSwKKwl7MHgwMDAwYTBhOCwgMHgwMjA1MDMwM30sCisJezB4MDAwMGEwYWMsIDB4MDIwNTA0MDB9LAorCXsweDAwMDBhMGIwLCAweDAyMDUwNDAxfSwKKwl7MHgwMDAwYTBiNCwgMHgwMjA1MDQwMn0sCisJezB4MDAwMGEwYjgsIDB4MDIwNTA0MDN9LAorCXsweDAwMDBhMGJjLCAweDAyMDUwNTAwfSwKKwl7MHgwMDAwYTBjMCwgMHgwMjA1MDUwMX0sCisJezB4MDAwMGEwYzQsIDB4MDIwNTA1MDJ9LAorCXsweDAwMDBhMGM4LCAweDAyMDUwNTAzfSwKKwl7MHgwMDAwYTBjYywgMHgwMjA1MDUwNH0sCisJezB4MDAwMGEwZDAsIDB4MDIwNTA2MDB9LAorCXsweDAwMDBhMGQ0LCAweDAyMDUwNjAxfSwKKwl7MHgwMDAwYTBkOCwgMHgwMjA1MDYwMn0sCisJezB4MDAwMGEwZGMsIDB4MDIwNTA2MDN9LAorCXsweDAwMDBhMGUwLCAweDAyMDUwNjA0fSwKKwl7MHgwMDAwYTBlNCwgMHgwMjA1MDcwMH0sCisJezB4MDAwMGEwZTgsIDB4MDIwNTA3MDF9LAorCXsweDAwMDBhMGVjLCAweDAyMDUwNzAyfSwKKwl7MHgwMDAwYTBmMCwgMHgwMjA1MDcwM30sCisJezB4MDAwMGEwZjQsIDB4MDIwNTA3MDR9LAorCXsweDAwMDBhMGY4LCAweDAyMDUwNzA1fSwKKwl7MHgwMDAwYTBmYywgMHgwMjA1MDcwOH0sCisJezB4MDAwMGExMDAsIDB4MDIwNTA3MDl9LAorCXsweDAwMDBhMTA0LCAweDAyMDUwNzBhfSwKKwl7MHgwMDAwYTEwOCwgMHgwMjA1MDcwYn0sCisJezB4MDAwMGExMGMsIDB4MDIwNTA3MGN9LAorCXsweDAwMDBhMTEwLCAweDAyMDUwNzBkfSwKKwl7MHgwMDAwYTExNCwgMHgwMjA1MDcxMH0sCisJezB4MDAwMGExMTgsIDB4MDIwNTA3MTF9LAorCXsweDAwMDBhMTFjLCAweDAyMDUwNzEyfSwKKwl7MHgwMDAwYTEyMCwgMHgwMjA1MDcxM30sCisJezB4MDAwMGExMjQsIDB4MDIwNTA3MTR9LAorCXsweDAwMDBhMTI4LCAweDAyMDUwNzE1fSwKKwl7MHgwMDAwYTEyYywgMHgwMjA1MDczMH0sCisJezB4MDAwMGExMzAsIDB4MDIwNTA3MzF9LAorCXsweDAwMDBhMTM0LCAweDAyMDUwNzMyfSwKKwl7MHgwMDAwYTEzOCwgMHgwMjA1MDczM30sCisJezB4MDAwMGExM2MsIDB4MDIwNTA3MzR9LAorCXsweDAwMDBhMTQwLCAweDAyMDUwNzM1fSwKKwl7MHgwMDAwYTE0NCwgMHgwMjA1MDc1MH0sCisJezB4MDAwMGExNDgsIDB4MDIwNTA3NTF9LAorCXsweDAwMDBhMTRjLCAweDAyMDUwNzUyfSwKKwl7MHgwMDAwYTE1MCwgMHgwMjA1MDc1M30sCisJezB4MDAwMGExNTQsIDB4MDIwNTA3NTR9LAorCXsweDAwMDBhMTU4LCAweDAyMDUwNzU1fSwKKwl7MHgwMDAwYTE1YywgMHgwMjA1MDc3MH0sCisJezB4MDAwMGExNjAsIDB4MDIwNTA3NzF9LAorCXsweDAwMDBhMTY0LCAweDAyMDUwNzcyfSwKKwl7MHgwMDAwYTE2OCwgMHgwMjA1MDc3M30sCisJezB4MDAwMGExNmMsIDB4MDIwNTA3NzR9LAorCXsweDAwMDBhMTcwLCAweDAyMDUwNzc1fSwKKwl7MHgwMDAwYTE3NCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExNzgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMTdjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE4MCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExODQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMTg4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE4YywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExOTAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMTk0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTE5OCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExOWMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWEwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFhNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYTgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWFjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFiMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYjQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWI4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFiYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExYzAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWM0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFjOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExY2MsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWQwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFkNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZDgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWRjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFlMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZTQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWU4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFlYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZjAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBhMWY0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYTFmOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGExZmMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMDAwLCAweDAyMDAwMTAxfSwKKwl7MHgwMDAwYjAwNCwgMHgwMjAwMDEwMn0sCisJezB4MDAwMGIwMDgsIDB4MDIwMDAxMDN9LAorCXsweDAwMDBiMDBjLCAweDAyMDAwMTA0fSwKKwl7MHgwMDAwYjAxMCwgMHgwMjAwMDIwMH0sCisJezB4MDAwMGIwMTQsIDB4MDIwMDAyMDF9LAorCXsweDAwMDBiMDE4LCAweDAyMDAwMjAyfSwKKwl7MHgwMDAwYjAxYywgMHgwMjAwMDIwM30sCisJezB4MDAwMGIwMjAsIDB4MDIwMDAyMDR9LAorCXsweDAwMDBiMDI0LCAweDAyMDAwMjA1fSwKKwl7MHgwMDAwYjAyOCwgMHgwMjAwMDIwOH0sCisJezB4MDAwMGIwMmMsIDB4MDIwMDAzMDJ9LAorCXsweDAwMDBiMDMwLCAweDAyMDAwMzAzfSwKKwl7MHgwMDAwYjAzNCwgMHgwMjAwMDMwNH0sCisJezB4MDAwMGIwMzgsIDB4MDIwMDA0MDB9LAorCXsweDAwMDBiMDNjLCAweDAyMDEwMzAwfSwKKwl7MHgwMDAwYjA0MCwgMHgwMjAxMDMwMX0sCisJezB4MDAwMGIwNDQsIDB4MDIwMTAzMDJ9LAorCXsweDAwMDBiMDQ4LCAweDAyMDAwNTAwfSwKKwl7MHgwMDAwYjA0YywgMHgwMjAxMDQwMH0sCisJezB4MDAwMGIwNTAsIDB4MDIwMjAzMDB9LAorCXsweDAwMDBiMDU0LCAweDAyMDIwMzAxfSwKKwl7MHgwMDAwYjA1OCwgMHgwMjAyMDMwMn0sCisJezB4MDAwMGIwNWMsIDB4MDIwMjAzMDN9LAorCXsweDAwMDBiMDYwLCAweDAyMDIwNDAwfSwKKwl7MHgwMDAwYjA2NCwgMHgwMjAzMDMwMH0sCisJezB4MDAwMGIwNjgsIDB4MDIwMzAzMDF9LAorCXsweDAwMDBiMDZjLCAweDAyMDMwMzAyfSwKKwl7MHgwMDAwYjA3MCwgMHgwMjAzMDMwM30sCisJezB4MDAwMGIwNzQsIDB4MDIwMzA0MDB9LAorCXsweDAwMDBiMDc4LCAweDAyMDQwMzAwfSwKKwl7MHgwMDAwYjA3YywgMHgwMjA0MDMwMX0sCisJezB4MDAwMGIwODAsIDB4MDIwNDAzMDJ9LAorCXsweDAwMDBiMDg0LCAweDAyMDQwMzAzfSwKKwl7MHgwMDAwYjA4OCwgMHgwMjAzMDUwMH0sCisJezB4MDAwMGIwOGMsIDB4MDIwNDA0MDB9LAorCXsweDAwMDBiMDkwLCAweDAyMDUwMjAzfSwKKwl7MHgwMDAwYjA5NCwgMHgwMjA1MDIwNH0sCisJezB4MDAwMGIwOTgsIDB4MDIwNTAyMDV9LAorCXsweDAwMDBiMDljLCAweDAyMDQwNTAwfSwKKwl7MHgwMDAwYjBhMCwgMHgwMjA1MDMwMX0sCisJezB4MDAwMGIwYTQsIDB4MDIwNTAzMDJ9LAorCXsweDAwMDBiMGE4LCAweDAyMDUwMzAzfSwKKwl7MHgwMDAwYjBhYywgMHgwMjA1MDQwMH0sCisJezB4MDAwMGIwYjAsIDB4MDIwNTA0MDF9LAorCXsweDAwMDBiMGI0LCAweDAyMDUwNDAyfSwKKwl7MHgwMDAwYjBiOCwgMHgwMjA1MDQwM30sCisJezB4MDAwMGIwYmMsIDB4MDIwNTA1MDB9LAorCXsweDAwMDBiMGMwLCAweDAyMDUwNTAxfSwKKwl7MHgwMDAwYjBjNCwgMHgwMjA1MDUwMn0sCisJezB4MDAwMGIwYzgsIDB4MDIwNTA1MDN9LAorCXsweDAwMDBiMGNjLCAweDAyMDUwNTA0fSwKKwl7MHgwMDAwYjBkMCwgMHgwMjA1MDYwMH0sCisJezB4MDAwMGIwZDQsIDB4MDIwNTA2MDF9LAorCXsweDAwMDBiMGQ4LCAweDAyMDUwNjAyfSwKKwl7MHgwMDAwYjBkYywgMHgwMjA1MDYwM30sCisJezB4MDAwMGIwZTAsIDB4MDIwNTA2MDR9LAorCXsweDAwMDBiMGU0LCAweDAyMDUwNzAwfSwKKwl7MHgwMDAwYjBlOCwgMHgwMjA1MDcwMX0sCisJezB4MDAwMGIwZWMsIDB4MDIwNTA3MDJ9LAorCXsweDAwMDBiMGYwLCAweDAyMDUwNzAzfSwKKwl7MHgwMDAwYjBmNCwgMHgwMjA1MDcwNH0sCisJezB4MDAwMGIwZjgsIDB4MDIwNTA3MDV9LAorCXsweDAwMDBiMGZjLCAweDAyMDUwNzA4fSwKKwl7MHgwMDAwYjEwMCwgMHgwMjA1MDcwOX0sCisJezB4MDAwMGIxMDQsIDB4MDIwNTA3MGF9LAorCXsweDAwMDBiMTA4LCAweDAyMDUwNzBifSwKKwl7MHgwMDAwYjEwYywgMHgwMjA1MDcwY30sCisJezB4MDAwMGIxMTAsIDB4MDIwNTA3MGR9LAorCXsweDAwMDBiMTE0LCAweDAyMDUwNzEwfSwKKwl7MHgwMDAwYjExOCwgMHgwMjA1MDcxMX0sCisJezB4MDAwMGIxMWMsIDB4MDIwNTA3MTJ9LAorCXsweDAwMDBiMTIwLCAweDAyMDUwNzEzfSwKKwl7MHgwMDAwYjEyNCwgMHgwMjA1MDcxNH0sCisJezB4MDAwMGIxMjgsIDB4MDIwNTA3MTV9LAorCXsweDAwMDBiMTJjLCAweDAyMDUwNzMwfSwKKwl7MHgwMDAwYjEzMCwgMHgwMjA1MDczMX0sCisJezB4MDAwMGIxMzQsIDB4MDIwNTA3MzJ9LAorCXsweDAwMDBiMTM4LCAweDAyMDUwNzMzfSwKKwl7MHgwMDAwYjEzYywgMHgwMjA1MDczNH0sCisJezB4MDAwMGIxNDAsIDB4MDIwNTA3MzV9LAorCXsweDAwMDBiMTQ0LCAweDAyMDUwNzUwfSwKKwl7MHgwMDAwYjE0OCwgMHgwMjA1MDc1MX0sCisJezB4MDAwMGIxNGMsIDB4MDIwNTA3NTJ9LAorCXsweDAwMDBiMTUwLCAweDAyMDUwNzUzfSwKKwl7MHgwMDAwYjE1NCwgMHgwMjA1MDc1NH0sCisJezB4MDAwMGIxNTgsIDB4MDIwNTA3NTV9LAorCXsweDAwMDBiMTVjLCAweDAyMDUwNzcwfSwKKwl7MHgwMDAwYjE2MCwgMHgwMjA1MDc3MX0sCisJezB4MDAwMGIxNjQsIDB4MDIwNTA3NzJ9LAorCXsweDAwMDBiMTY4LCAweDAyMDUwNzczfSwKKwl7MHgwMDAwYjE2YywgMHgwMjA1MDc3NH0sCisJezB4MDAwMGIxNzAsIDB4MDIwNTA3NzV9LAorCXsweDAwMDBiMTc0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE3OCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxN2MsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMTgwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE4NCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxODgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMThjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE5MCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxOTQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMTk4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjE5YywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYTAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWE0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFhOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYWMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWIwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFiNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYjgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWJjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFjMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxYzQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWM4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFjYywgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZDAsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWQ0LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFkOCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZGMsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWUwLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFlNCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZTgsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWVjLCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFmMCwgMHgwMDAwMDc3Nn0sCisJezB4MDAwMGIxZjQsIDB4MDAwMDA3NzZ9LAorCXsweDAwMDBiMWY4LCAweDAwMDAwNzc2fSwKKwl7MHgwMDAwYjFmYywgMHgwMDAwMDc3Nn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDJfbWFjX3Bvc3RhbWJsZVtdWzVdID0geworCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KKwl7MHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MH0sCisJezB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGN9LAorCXsweDAwMDAxMGIwLCAweDAwMDAwZTYwLCAweDAwMDAxY2MwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4fSwKKwl7MHgwMDAwODAxNCwgMHgwM2U4MDNlOCwgMHgwN2QwMDdkMCwgMHgxMDgwMTYwMCwgMHgwODQwMGIwMH0sCisJezB4MDAwMDgwMWMsIDB4MTI4ZDgwMjcsIDB4MTI4ZDgwNGYsIDB4MTJlMDAwNTcsIDB4MTJlMDAwMmJ9LAorCXsweDAwMDA4MTIwLCAweDA4ZjA0ODAwLCAweDA4ZjA0ODAwLCAweDA4ZjA0ODEwLCAweDA4ZjA0ODEwfSwKKwl7MHgwMDAwODFkMCwgMHgwMDAwMzIxMCwgMHgwMDAwMzIxMCwgMHgwMDAwMzIwYSwgMHgwMDAwMzIwYX0sCisJezB4MDAwMDgzMTgsIDB4MDAwMDNlODAsIDB4MDAwMDdkMDAsIDB4MDAwMDY4ODAsIDB4MDAwMDM0NDB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAyX3NvY19wb3N0YW1ibGVbXVs1XSA9IHsKKwkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCisJezB4MDAwMDcwMTAsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjN9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkyMDBfbWVybGluXzJwMl9yYWRpb19jb3JlW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA3ODAwLCAweDAwMDQwMDAwfSwKKwl7MHgwMDAwNzgwNCwgMHhkYjAwNTAxMn0sCisJezB4MDAwMDc4MDgsIDB4MDQ5MjQ5MTR9LAorCXsweDAwMDA3ODBjLCAweDIxMDg0MjEwfSwKKwl7MHgwMDAwNzgxMCwgMHg2ZDgwMTMwMH0sCisJezB4MDAwMDc4MTQsIDB4MDAxOWJlZmZ9LAorCXsweDAwMDA3ODE4LCAweDA3ZTQxMDAwfSwKKwl7MHgwMDAwNzgxYywgMHgwMDM5MjAwMH0sCisJezB4MDAwMDc4MjAsIDB4OTI1OTI0ODB9LAorCXsweDAwMDA3ODI0LCAweDAwMDQwMDAwfSwKKwl7MHgwMDAwNzgyOCwgMHhkYjAwNTAxMn0sCisJezB4MDAwMDc4MmMsIDB4MDQ5MjQ5MTR9LAorCXsweDAwMDA3ODMwLCAweDIxMDg0MjEwfSwKKwl7MHgwMDAwNzgzNCwgMHg2ZDgwMTMwMH0sCisJezB4MDAwMDc4MzgsIDB4MDAxOWJlZmZ9LAorCXsweDAwMDA3ODNjLCAweDA3ZTQwMDAwfSwKKwl7MHgwMDAwNzg0MCwgMHgwMDM5MjAwMH0sCisJezB4MDAwMDc4NDQsIDB4OTI1OTI0ODB9LAorCXsweDAwMDA3ODQ4LCAweDAwMTAwMDAwfSwKKwl7MHgwMDAwNzg0YywgMHg3NzNmMDU2N30sCisJezB4MDAwMDc4NTAsIDB4NTQyMTQ1MTR9LAorCXsweDAwMDA3ODU0LCAweDEyMDM1ODI4fSwKKwl7MHgwMDAwNzg1OCwgMHg5MjU5MjY5Mn0sCisJezB4MDAwMDc4NWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA3ODYwLCAweDU2NDAwMDAwfSwKKwl7MHgwMDAwNzg2NCwgMHgwYThlMzcwZX0sCisJezB4MDAwMDc4NjgsIDB4YzAxMDI4NTB9LAorCXsweDAwMDA3ODZjLCAweDgxMmQ0MDAwfSwKKwl7MHgwMDAwNzg3MCwgMHg4MDdlYzQwMH0sCisJezB4MDAwMDc4NzQsIDB4MDAxYjZkYjB9LAorCXsweDAwMDA3ODc4LCAweDAwMzc2YjYzfSwKKwl7MHgwMDAwNzg3YywgMHgwNmRiNmRiNn0sCisJezB4MDAwMDc4ODAsIDB4MDA2ZDgwMDB9LAorCXsweDAwMDA3ODg0LCAweGZmZWZmZmZlfSwKKwl7MHgwMDAwNzg4OCwgMHhmZmVmZmZmZX0sCisJezB4MDAwMDc4OGMsIDB4MDAwMTAwMDB9LAorCXsweDAwMDA3ODkwLCAweDAyMDYwYWVifSwKKwl7MHgwMDAwNzg5NCwgMHg1YTEwODAwMH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDJfYmFzZWJhbmRfcG9zdGFtYmxlW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDA5ODEwLCAweGQwMGE4MDA1LCAweGQwMGE4MDA1LCAweGQwMGE4MDExLCAweGQwMGE4MDExfSwKKwl7MHgwMDAwOTgyMCwgMHgyMDZhMDIyZSwgMHgyMDZhMDIyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZX0sCisJezB4MDAwMDk4MjQsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAorCXsweDAwMDA5ODI4LCAweDA2OTAzMDgxLCAweDA2OTAzMDgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKKwl7MHgwMDAwOTgyYywgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNH0sCisJezB4MDAwMDk4MzAsIDB4MDAwMDA1OWMsIDB4MDAwMDA1OWMsIDB4MDAwMDExOWMsIDB4MDAwMDExOWN9LAorCXsweDAwMDA5YzAwLCAweDAwMDAwMGM0LCAweDAwMDAwMGM0LCAweDAwMDAwMGM0LCAweDAwMDAwMGM0fSwKKwl7MHgwMDAwOWUwMCwgMHgwMzcyMTYxZSwgMHgwMzcyMTYxZSwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMH0sCisJezB4MDAwMDllMDQsIDB4MDA4MDIwMjAsIDB4MDA4MDIwMjAsIDB4MDA4MDIwMjAsIDB4MDA4MDIwMjB9LAorCXsweDAwMDA5ZTBjLCAweDZjNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZjNDAwMGUyfSwKKwl7MHgwMDAwOWUxMCwgMHg3ZWM4OGQyZSwgMHg3ZWM4OGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCisJezB4MDAwMDllMTQsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWV9LAorCXsweDAwMDA5ZTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWUxYywgMHgwMDAxY2Y5YywgMHgwMDAxY2Y5YywgMHgwMDAyMWY5YywgMHgwMDAyMWY5Y30sCisJezB4MDAwMDllMjAsIDB4MDAwMDAzYjUsIDB4MDAwMDAzYjUsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2V9LAorCXsweDAwMDA5ZTJjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDIxLCAweDAwMDAwMDIxfSwKKwl7MHgwMDAwOWU0NCwgMHgwMjMyMWUyNywgMHgwMjMyMWUyNywgMHgwMjI5MWUyNywgMHgwMjI5MWUyN30sCisJezB4MDAwMDllNDgsIDB4NTAzMDIwMWEsIDB4NTAzMDIwMWEsIDB4NTAzMDIwMTIsIDB4NTAzMDIwMTJ9LAorCXsweDAwMDA5ZmM4LCAweDAwMDNmMDAwLCAweDAwMDNmMDAwLCAweDAwMDFhMDAwLCAweDAwMDFhMDAwfSwKKwl7MHgwMDAwYTIwNCwgMHgwMDAwMzdjMCwgMHgwMDAwMzdjNCwgMHgwMDAwMzdjNCwgMHgwMDAwMzdjMH0sCisJezB4MDAwMGEyMDgsIDB4MDAwMDAxMDQsIDB4MDAwMDAxMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDR9LAorCXsweDAwMDBhMjMwLCAweDAwMDAwMDBhLCAweDAwMDAwMDE0LCAweDAwMDAwMDE2LCAweDAwMDAwMDBifSwKKwl7MHgwMDAwYTIzNCwgMHgwMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgwMDAwMGZmZn0sCisJezB4MDAwMGEyMzgsIDB4ZmZiODEwMTgsIDB4ZmZiODEwMTgsIDB4ZmZiODEwMTgsIDB4ZmZiODEwMTh9LAorCXsweDAwMDBhMjUwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMjEwLCAweDAwMDAwMTA4fSwKKwl7MHgwMDAwYTI1NCwgMHgwMDAwMDdkMCwgMHgwMDAwMGZhMCwgMHgwMDAwMTEzMCwgMHgwMDAwMDg5OH0sCisJezB4MDAwMGEyNTgsIDB4MDIwMjAwMDIsIDB4MDIwMjAwMDIsIDB4MDIwMjAwMDIsIDB4MDIwMjAwMDJ9LAorCXsweDAwMDBhMjVjLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlLCAweDAxMDAwZTBlfSwKKwl7MHgwMDAwYTI2MCwgMHgwYTAyMTUwMSwgMHgwYTAyMTUwMSwgMHgzYTAyMTUwMSwgMHgzYTAyMTUwMX0sCisJezB4MDAwMGEyNjQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGV9LAorCXsweDAwMDBhMjgwLCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDBiLCAweDAwMDAwMDBifSwKKwl7MHgwMDAwYTI4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDE1MCwgMHgwMDAwMDE1MH0sCisJezB4MDAwMGEyODgsIDB4MDAwMDAxMTAsIDB4MDAwMDAxMTAsIDB4MDAwMDAxMTAsIDB4MDAwMDAxMTB9LAorCXsweDAwMDBhMjhjLCAweDAwMDIyMjIyLCAweDAwMDIyMjIyLCAweDAwMDIyMjIyLCAweDAwMDIyMjIyfSwKKwl7MHgwMDAwYTJjNCwgMHgwMDE1OGQxOCwgMHgwMDE1OGQxOCwgMHgwMDE1OGQxOCwgMHgwMDE1OGQxOH0sCisJezB4MDAwMGEyZDAsIDB4MDAwNzE5ODEsIDB4MDAwNzE5ODEsIDB4MDAwNzE5ODEsIDB4MDAwNzE5ODJ9LAorCXsweDAwMDBhMmQ4LCAweGY5OTlhODNhLCAweGY5OTlhODNhLCAweGY5OTlhODNhLCAweGY5OTlhODNhfSwKKwl7MHgwMDAwYTM1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE4MzAsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWN9LAorCXsweDAwMDBhZTA0LCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKKwl7MHgwMDAwYWUxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGFlMWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWN9LAorCXsweDAwMDBhZTIwLCAweDAwMDAwMWI1LCAweDAwMDAwMWI1LCAweDAwMDAwMWNlLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYjI4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDE1MCwgMHgwMDAwMDE1MH0sCisJezB4MDAwMGI4MzAsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWN9LAorCXsweDAwMDBiZTA0LCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKKwl7MHgwMDAwYmUxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGJlMWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWN9LAorCXsweDAwMDBiZTIwLCAweDAwMDAwMWI1LCAweDAwMDAwMWI1LCAweDAwMDAwMWNlLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYzI4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDE1MCwgMHgwMDAwMDE1MH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDJfYmFzZWJhbmRfY29yZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOTgwMCwgMHhhZmU2OGUzMH0sCisJezB4MDAwMDk4MDQsIDB4ZmQxNGUwMDB9LAorCXsweDAwMDA5ODA4LCAweDljMGE5ZjZifSwKKwl7MHgwMDAwOTgwYywgMHgwNDkwMDAwMH0sCisJezB4MDAwMDk4MTQsIDB4OTI4MGMwMGF9LAorCXsweDAwMDA5ODE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgxYywgMHgwMDAyMDAyOH0sCisJezB4MDAwMDk4MzQsIDB4NWYzY2EzZGV9LAorCXsweDAwMDA5ODM4LCAweDAxMDhlY2ZmfSwKKwl7MHgwMDAwOTgzYywgMHgxNDc1MDYwMH0sCisJezB4MDAwMDk4ODAsIDB4MjAxZmZmMDB9LAorCXsweDAwMDA5ODg0LCAweDAwMDAxMDQyfSwKKwl7MHgwMDAwOThhNCwgMHgwMDIwMDQwMH0sCisJezB4MDAwMDk4YjAsIDB4NTI0NDBiYmV9LAorCXsweDAwMDA5OGQwLCAweDAwNGI2YThlfSwKKwl7MHgwMDAwOThkNCwgMHgwMDAwMDgyMH0sCisJezB4MDAwMDk4ZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOThmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDljMDQsIDB4ZmY1NWZmNTV9LAorCXsweDAwMDA5YzA4LCAweDAzMjBmZjU1fSwKKwl7MHgwMDAwOWMwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDljMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzE0LCAweDAwMDQ2Mzg0fSwKKwl7MHgwMDAwOWMxOCwgMHgwNWI2YjQ0MH0sCisJezB4MDAwMDljMWMsIDB4MDBiNmI0NDB9LAorCXsweDAwMDA5ZDAwLCAweGMwODBhMzMzfSwKKwl7MHgwMDAwOWQwNCwgMHg0MDIwNmMxMH0sCisJezB4MDAwMDlkMDgsIDB4MDA5YzQwNjB9LAorCXsweDAwMDA5ZDBjLCAweDk4ODM4MDBhfSwKKwl7MHgwMDAwOWQxMCwgMHgwMTgzNDA2MX0sCisJezB4MDAwMDlkMTQsIDB4MDBjMDA0MGJ9LAorCXsweDAwMDA5ZDE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWUwOCwgMHgwMDM4MjMwY30sCisJezB4MDAwMDllMjQsIDB4OTkwYmI1MTV9LAorCXsweDAwMDA5ZTI4LCAweDBjNmYwMDAwfSwKKwl7MHgwMDAwOWUzMCwgMHgwNjMzNmY3N30sCisJezB4MDAwMDllMzQsIDB4NmFmNjUzMmZ9LAorCXsweDAwMDA5ZTM4LCAweDBjYzgwYzAwfSwKKwl7MHgwMDAwOWUzYywgMHhjZjk0NjIyMn0sCisJezB4MDAwMDllNDAsIDB4MGQyNjE4MjB9LAorCXsweDAwMDA5ZTRjLCAweDAwMDAxMDA0fSwKKwl7MHgwMDAwOWU1MCwgMHgwMGZmMDNmMX0sCisJezB4MDAwMDllNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5ZmMwLCAweDgwM2U0Nzg4fSwKKwl7MHgwMDAwOWZjNCwgMHgwMDAxZWZiNX0sCisJezB4MDAwMDlmY2MsIDB4NDAwMDAwMTR9LAorCXsweDAwMDA5ZmQwLCAweDAxMTkzYjkzfSwKKwl7MHgwMDAwYTIwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIyOCwgMHgxMDAwMjMxMH0sCisJezB4MDAwMGEyMmMsIDB4MDEwMzZhMWV9LAorCXsweDAwMDBhMjNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI0NCwgMHgwYzAwMDAwMH0sCisJezB4MDAwMGEyYTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhMmMwLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTJjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyY2MsIDB4MThjNDM0MzN9LAorCXsweDAwMDBhMmQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJlOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNTAsIDB4MDAwMGEwMDB9LAorCXsweDAwMDBhMzY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzOTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhMzk0LCAweDAwMDAwNDQ0fSwKKwl7MHgwMDAwYTM5OCwgMHgwMDFmMGUwZn0sCisJezB4MDAwMGEzOWMsIDB4MDA3NTM5M2Z9LAorCXsweDAwMDBhM2EwLCAweGI3OWY2NDI3fSwKKwl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTgsIDB4YWFhYWFhYWF9LAorCXsweDAwMDBhM2FjLCAweDNjNDY2NDc4fSwKKwl7MHgwMDAwYTNjMCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzYzQsIDB4MjIyMjIyMjB9LAorCXsweDAwMDBhM2M4LCAweDIwMjAwMDIwfSwKKwl7MHgwMDAwYTNjYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZGMsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2UwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNlNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZTgsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2VjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzZjQsIDB4MDAwMDAyNDZ9LAorCXsweDAwMDBhM2Y4LCAweDBjZGJkMzgwfSwKKwl7MHgwMDAwYTNmYywgMHgwMDBmMGYwMX0sCisJezB4MDAwMGE0MDAsIDB4OGZhOTFmMDF9LAorCXsweDAwMDBhNDA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTQwOCwgMHgwZTc5ZTVjNn0sCisJezB4MDAwMGE0MGMsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBhNDE0LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQxOCwgMHgyZDAwMWRjZX0sCisJezB4MDAwMGE0MWMsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDIwLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYTQyNCwgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MjgsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhNDJjLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQzMCwgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDM4LCAweDAwMDAxODAxfSwKKwl7MHgwMDAwYTQzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE0NDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTQ0OCwgMHgwNjAwMDA4MH0sCisJezB4MDAwMGE0NGMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhNDUwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYTQ1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2M2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTY0NCwgMHgzZmFkOWQ3NH0sCisJezB4MDAwMGE2NDgsIDB4MDA0ODA2MGF9LAorCXsweDAwMDBhNjRjLCAweDAwMDAwNjM3fSwKKwl7MHgwMDAwYTY3MCwgMHgwMzAyMDEwMH0sCisJezB4MDAwMGE2NzQsIDB4MDkwODA1MDR9LAorCXsweDAwMDBhNjc4LCAweDBkMGMwYjBhfSwKKwl7MHgwMDAwYTY3YywgMHgxMzEyMTExMH0sCisJezB4MDAwMGE2ODAsIDB4MzEzMDE1MTR9LAorCXsweDAwMDBhNjg0LCAweDM1MzQzMzMyfSwKKwl7MHgwMDAwYTY4OCwgMHgwMDAwMDAzNn0sCisJezB4MDAwMGE2OTAsIDB4MDAwMDA4Mzh9LAorCXsweDAwMDBhN2MwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTdjNCwgMHhmZmZmZmZmY30sCisJezB4MDAwMGE3YzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhN2NjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTdkMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE3ZDQsIDB4MDAwMDAwMDR9LAorCXsweDAwMDBhN2RjLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYThkMCwgMHgwMDRiNmE4ZX0sCisJezB4MDAwMGE4ZDQsIDB4MDAwMDA4MjB9LAorCXsweDAwMDBhOGRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYThmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE4ZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMmQwLCAweDAwMDAwMDgwfSwKKwl7MHgwMDAwYjJkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMmUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjJlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMmVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjJmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIyZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjQwOCwgMHgwZTc5ZTVjMH0sCisJezB4MDAwMGI0MGMsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBiNDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjhkMCwgMHgwMDRiNmE4ZX0sCisJezB4MDAwMGI4ZDQsIDB4MDAwMDA4MjB9LAorCXsweDAwMDBiOGRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjhmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGI4ZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjMmQwLCAweDAwMDAwMDgwfSwKKwl7MHgwMDAwYzJkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjMmUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYzJlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjMmVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYzJmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGMyZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBjMmY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYzQwOCwgMHgwZTc5ZTVjMH0sCisJezB4MDAwMGM0MGMsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBjNDIwLCAweDAwMDAwMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwTW9kZXNfaGlnaF9wb3dlcl90eF9nYWluX3RhYmxlXzJwMltdWzVdID0geworCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KKwl7MHgwMDAwYTQxMCwgMHgwMDAwNTBkOCwgMHgwMDAwNTBkOCwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOX0sCisJezB4MDAwMGE1MDAsIDB4MDAwMDIyMjAsIDB4MDAwMDIyMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTA0LCAweDA0MDAyMjIyLCAweDA0MDAyMjIyLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTUwOCwgMHgwOTAwMjQyMSwgMHgwOTAwMjQyMSwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1MGMsIDB4MGQwMDI2MjEsIDB4MGQwMDI2MjEsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAorCXsweDAwMDBhNTEwLCAweDEzMDA0NjIwLCAweDEzMDA0NjIwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKKwl7MHgwMDAwYTUxNCwgMHgxOTAwNGEyMCwgMHgxOTAwNGEyMCwgMHgxMTAwMDQwMCwgMHgxMTAwMDQwMH0sCisJezB4MDAwMGE1MTgsIDB4MWQwMDRlMjAsIDB4MWQwMDRlMjAsIDB4MTUwMDA0MDIsIDB4MTUwMDA0MDJ9LAorCXsweDAwMDBhNTFjLCAweDIxMDA1NDIwLCAweDIxMDA1NDIwLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKKwl7MHgwMDAwYTUyMCwgMHgyNjAwNWUyMCwgMHgyNjAwNWUyMCwgMHgxYjAwMDYwMywgMHgxYjAwMDYwM30sCisJezB4MDAwMGE1MjQsIDB4MmIwMDVlNDAsIDB4MmIwMDVlNDAsIDB4MWYwMDBhMDIsIDB4MWYwMDBhMDJ9LAorCXsweDAwMDBhNTI4LCAweDJmMDA1ZTQyLCAweDJmMDA1ZTQyLCAweDIzMDAwYTA0LCAweDIzMDAwYTA0fSwKKwl7MHgwMDAwYTUyYywgMHgzMzAwNWU0NCwgMHgzMzAwNWU0NCwgMHgyNjAwMGEyMCwgMHgyNjAwMGEyMH0sCisJezB4MDAwMGE1MzAsIDB4MzgwMDVlNjUsIDB4MzgwMDVlNjUsIDB4MmEwMDBlMjAsIDB4MmEwMDBlMjB9LAorCXsweDAwMDBhNTM0LCAweDNjMDA1ZTY5LCAweDNjMDA1ZTY5LCAweDJlMDAwZTIyLCAweDJlMDAwZTIyfSwKKwl7MHgwMDAwYTUzOCwgMHg0MDAwNWU2YiwgMHg0MDAwNWU2YiwgMHgzMTAwMGUyNCwgMHgzMTAwMGUyNH0sCisJezB4MDAwMGE1M2MsIDB4NDQwMDVlNmQsIDB4NDQwMDVlNmQsIDB4MzQwMDE2NDAsIDB4MzQwMDE2NDB9LAorCXsweDAwMDBhNTQwLCAweDQ5MDA1ZTcyLCAweDQ5MDA1ZTcyLCAweDM4MDAxNjYwLCAweDM4MDAxNjYwfSwKKwl7MHgwMDAwYTU0NCwgMHg0ZTAwNWViMiwgMHg0ZTAwNWViMiwgMHgzYjAwMTg2MSwgMHgzYjAwMTg2MX0sCisJezB4MDAwMGE1NDgsIDB4NTMwMDVmMTIsIDB4NTMwMDVmMTIsIDB4M2UwMDFhODEsIDB4M2UwMDFhODF9LAorCXsweDAwMDBhNTRjLCAweDU5MDI1ZWI1LCAweDU5MDI1ZWI1LCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKKwl7MHgwMDAwYTU1MCwgMHg1ZTAyNWYxMiwgMHg1ZTAyNWYxMiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCisJezB4MDAwMGE1NTQsIDB4NjEwMjdmMTIsIDB4NjEwMjdmMTIsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAorCXsweDAwMDBhNTU4LCAweDY3MDJiZjEyLCAweDY3MDJiZjEyLCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKKwl7MHgwMDAwYTU1YywgMHg2YjAyYmYxNCwgMHg2YjAyYmYxNCwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCisJezB4MDAwMGE1NjAsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTQwMDFjZWIsIDB4NTQwMDFjZWJ9LAorCXsweDAwMDBhNTY0LCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU2OCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1NmMsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTcwLCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU3NCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1NzgsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTdjLCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU4MCwgMHgwMDgwMjIyMCwgMHgwMDgwMjIyMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMH0sCisJezB4MDAwMGE1ODQsIDB4MDQ4MDIyMjIsIDB4MDQ4MDIyMjIsIDB4MDQ4MDAwMDIsIDB4MDQ4MDAwMDJ9LAorCXsweDAwMDBhNTg4LCAweDA5ODAyNDIxLCAweDA5ODAyNDIxLCAweDA4ODAwMDA0LCAweDA4ODAwMDA0fSwKKwl7MHgwMDAwYTU4YywgMHgwZDgwMjYyMSwgMHgwZDgwMjYyMSwgMHgwYjgwMDIwMCwgMHgwYjgwMDIwMH0sCisJezB4MDAwMGE1OTAsIDB4MTM4MDQ2MjAsIDB4MTM4MDQ2MjAsIDB4MGY4MDAyMDIsIDB4MGY4MDAyMDJ9LAorCXsweDAwMDBhNTk0LCAweDE5ODA0YTIwLCAweDE5ODA0YTIwLCAweDExODAwNDAwLCAweDExODAwNDAwfSwKKwl7MHgwMDAwYTU5OCwgMHgxZDgwNGUyMCwgMHgxZDgwNGUyMCwgMHgxNTgwMDQwMiwgMHgxNTgwMDQwMn0sCisJezB4MDAwMGE1OWMsIDB4MjE4MDU0MjAsIDB4MjE4MDU0MjAsIDB4MTk4MDA0MDQsIDB4MTk4MDA0MDR9LAorCXsweDAwMDBhNWEwLCAweDI2ODA1ZTIwLCAweDI2ODA1ZTIwLCAweDFiODAwNjAzLCAweDFiODAwNjAzfSwKKwl7MHgwMDAwYTVhNCwgMHgyYjgwNWU0MCwgMHgyYjgwNWU0MCwgMHgxZjgwMGEwMiwgMHgxZjgwMGEwMn0sCisJezB4MDAwMGE1YTgsIDB4MmY4MDVlNDIsIDB4MmY4MDVlNDIsIDB4MjM4MDBhMDQsIDB4MjM4MDBhMDR9LAorCXsweDAwMDBhNWFjLCAweDMzODA1ZTQ0LCAweDMzODA1ZTQ0LCAweDI2ODAwYTIwLCAweDI2ODAwYTIwfSwKKwl7MHgwMDAwYTViMCwgMHgzODgwNWU2NSwgMHgzODgwNWU2NSwgMHgyYTgwMGUyMCwgMHgyYTgwMGUyMH0sCisJezB4MDAwMGE1YjQsIDB4M2M4MDVlNjksIDB4M2M4MDVlNjksIDB4MmU4MDBlMjIsIDB4MmU4MDBlMjJ9LAorCXsweDAwMDBhNWI4LCAweDQwODA1ZTZiLCAweDQwODA1ZTZiLCAweDMxODAwZTI0LCAweDMxODAwZTI0fSwKKwl7MHgwMDAwYTViYywgMHg0NDgwNWU2ZCwgMHg0NDgwNWU2ZCwgMHgzNDgwMTY0MCwgMHgzNDgwMTY0MH0sCisJezB4MDAwMGE1YzAsIDB4NDk4MDVlNzIsIDB4NDk4MDVlNzIsIDB4Mzg4MDE2NjAsIDB4Mzg4MDE2NjB9LAorCXsweDAwMDBhNWM0LCAweDRlODA1ZWIyLCAweDRlODA1ZWIyLCAweDNiODAxODYxLCAweDNiODAxODYxfSwKKwl7MHgwMDAwYTVjOCwgMHg1MzgwNWYxMiwgMHg1MzgwNWYxMiwgMHgzZTgwMWE4MSwgMHgzZTgwMWE4MX0sCisJezB4MDAwMGE1Y2MsIDB4NTk4MjVlYjIsIDB4NTk4MjVlYjIsIDB4NDI4MDFhODMsIDB4NDI4MDFhODN9LAorCXsweDAwMDBhNWQwLCAweDVlODI1ZjEyLCAweDVlODI1ZjEyLCAweDQ0ODAxYzg0LCAweDQ0ODAxYzg0fSwKKwl7MHgwMDAwYTVkNCwgMHg2MTgyN2YxMiwgMHg2MTgyN2YxMiwgMHg0ODgwMWNlMywgMHg0ODgwMWNlM30sCisJezB4MDAwMGE1ZDgsIDB4Njc4MmJmMTIsIDB4Njc4MmJmMTIsIDB4NGM4MDFjZTUsIDB4NGM4MDFjZTV9LAorCXsweDAwMDBhNWRjLCAweDZiODJiZjE0LCAweDZiODJiZjE0LCAweDUwODAxY2U5LCAweDUwODAxY2U5fSwKKwl7MHgwMDAwYTVlMCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NDgwMWNlYiwgMHg1NDgwMWNlYn0sCisJezB4MDAwMGE1ZTQsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWU4LCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVlYywgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZjAsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWY0LCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVmOCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZmMsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDE2MDQ0LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2fSwKKwl7MHgwMDAxNjA0OCwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMX0sCisJezB4MDAwMTYwNjgsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmN9LAorCXsweDAwMDE2NDQ0LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2fSwKKwl7MHgwMDAxNjQ0OCwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMX0sCisJezB4MDAwMTY0NjgsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmN9LAorCXsweDAwMDE2ODQ0LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2fSwKKwl7MHgwMDAxNjg0OCwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMX0sCisJezB4MDAwMTY4NjgsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmN9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBNb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fdGFibGVfMnAyW11bNV0gPSB7CisJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLworCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ4LCAweDAwMDA1MGQ4LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5fSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAwMjIyMCwgMHgwMDAwMjIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDQwMDIyMjIsIDB4MDQwMDIyMjIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDA5MDAyNDIxLCAweDA5MDAyNDIxLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgwZDAwMjYyMSwgMHgwZDAwMjYyMSwgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTMwMDQ2MjAsIDB4MTMwMDQ2MjAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDE5MDA0YTIwLCAweDE5MDA0YTIwLCAweDExMDAwNDAwLCAweDExMDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgxZDAwNGUyMCwgMHgxZDAwNGUyMCwgMHgxNTAwMDQwMiwgMHgxNTAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MjEwMDU0MjAsIDB4MjEwMDU0MjAsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDI2MDA1ZTIwLCAweDI2MDA1ZTIwLCAweDFiMDAwNjAzLCAweDFiMDAwNjAzfSwKKwl7MHgwMDAwYTUyNCwgMHgyYjAwNWU0MCwgMHgyYjAwNWU0MCwgMHgxZjAwMGEwMiwgMHgxZjAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4MmYwMDVlNDIsIDB4MmYwMDVlNDIsIDB4MjMwMDBhMDQsIDB4MjMwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDMzMDA1ZTQ0LCAweDMzMDA1ZTQ0LCAweDI2MDAwYTIwLCAweDI2MDAwYTIwfSwKKwl7MHgwMDAwYTUzMCwgMHgzODAwNWU2NSwgMHgzODAwNWU2NSwgMHgyYTAwMGUyMCwgMHgyYTAwMGUyMH0sCisJezB4MDAwMGE1MzQsIDB4M2MwMDVlNjksIDB4M2MwMDVlNjksIDB4MmUwMDBlMjIsIDB4MmUwMDBlMjJ9LAorCXsweDAwMDBhNTM4LCAweDQwMDA1ZTZiLCAweDQwMDA1ZTZiLCAweDMxMDAwZTI0LCAweDMxMDAwZTI0fSwKKwl7MHgwMDAwYTUzYywgMHg0NDAwNWU2ZCwgMHg0NDAwNWU2ZCwgMHgzNDAwMTY0MCwgMHgzNDAwMTY0MH0sCisJezB4MDAwMGE1NDAsIDB4NDkwMDVlNzIsIDB4NDkwMDVlNzIsIDB4MzgwMDE2NjAsIDB4MzgwMDE2NjB9LAorCXsweDAwMDBhNTQ0LCAweDRlMDA1ZWIyLCAweDRlMDA1ZWIyLCAweDNiMDAxODYxLCAweDNiMDAxODYxfSwKKwl7MHgwMDAwYTU0OCwgMHg1MzAwNWYxMiwgMHg1MzAwNWYxMiwgMHgzZTAwMWE4MSwgMHgzZTAwMWE4MX0sCisJezB4MDAwMGE1NGMsIDB4NTkwMjVlYjUsIDB4NTkwMjVlYjUsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAorCXsweDAwMDBhNTUwLCAweDVlMDI1ZjEyLCAweDVlMDI1ZjEyLCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKKwl7MHgwMDAwYTU1NCwgMHg2MTAyN2YxMiwgMHg2MTAyN2YxMiwgMHg0ODAwMWNlMywgMHg0ODAwMWNlM30sCisJezB4MDAwMGE1NTgsIDB4NjcwMmJmMTIsIDB4NjcwMmJmMTIsIDB4NGMwMDFjZTUsIDB4NGMwMDFjZTV9LAorCXsweDAwMDBhNTVjLCAweDZiMDJiZjE0LCAweDZiMDJiZjE0LCAweDUwMDAxY2U5LCAweDUwMDAxY2U5fSwKKwl7MHgwMDAwYTU2MCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NDAwMWNlYiwgMHg1NDAwMWNlYn0sCisJezB4MDAwMGE1NjQsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTY4LCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU2YywgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1NzAsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTc0LCAweDZmMDJiZjE2LCAweDZmMDJiZjE2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTU3OCwgMHg2ZjAyYmYxNiwgMHg2ZjAyYmYxNiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1N2MsIDB4NmYwMmJmMTYsIDB4NmYwMmJmMTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNTgwLCAweDAwODAyMjIwLCAweDAwODAyMjIwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNDgwMjIyMiwgMHgwNDgwMjIyMiwgMHgwNDgwMDAwMiwgMHgwNDgwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MDk4MDI0MjEsIDB4MDk4MDI0MjEsIDB4MDg4MDAwMDQsIDB4MDg4MDAwMDR9LAorCXsweDAwMDBhNThjLCAweDBkODAyNjIxLCAweDBkODAyNjIxLCAweDBiODAwMjAwLCAweDBiODAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxMzgwNDYyMCwgMHgxMzgwNDYyMCwgMHgwZjgwMDIwMiwgMHgwZjgwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MTk4MDRhMjAsIDB4MTk4MDRhMjAsIDB4MTE4MDA0MDAsIDB4MTE4MDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDFkODA0ZTIwLCAweDFkODA0ZTIwLCAweDE1ODAwNDAyLCAweDE1ODAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyMTgwNTQyMCwgMHgyMTgwNTQyMCwgMHgxOTgwMDQwNCwgMHgxOTgwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MjY4MDVlMjAsIDB4MjY4MDVlMjAsIDB4MWI4MDA2MDMsIDB4MWI4MDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDJiODA1ZTQwLCAweDJiODA1ZTQwLCAweDFmODAwYTAyLCAweDFmODAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgyZjgwNWU0MiwgMHgyZjgwNWU0MiwgMHgyMzgwMGEwNCwgMHgyMzgwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4MzM4MDVlNDQsIDB4MzM4MDVlNDQsIDB4MjY4MDBhMjAsIDB4MjY4MDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDM4ODA1ZTY1LCAweDM4ODA1ZTY1LCAweDJhODAwZTIwLCAweDJhODAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHgzYzgwNWU2OSwgMHgzYzgwNWU2OSwgMHgyZTgwMGUyMiwgMHgyZTgwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NDA4MDVlNmIsIDB4NDA4MDVlNmIsIDB4MzE4MDBlMjQsIDB4MzE4MDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDQ0ODA1ZTZkLCAweDQ0ODA1ZTZkLCAweDM0ODAxNjQwLCAweDM0ODAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg0OTgwNWU3MiwgMHg0OTgwNWU3MiwgMHgzODgwMTY2MCwgMHgzODgwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NGU4MDVlYjIsIDB4NGU4MDVlYjIsIDB4M2I4MDE4NjEsIDB4M2I4MDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDUzODA1ZjEyLCAweDUzODA1ZjEyLCAweDNlODAxYTgxLCAweDNlODAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg1OTgyNWViMiwgMHg1OTgyNWViMiwgMHg0MjgwMWE4MywgMHg0MjgwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NWU4MjVmMTIsIDB4NWU4MjVmMTIsIDB4NDQ4MDFjODQsIDB4NDQ4MDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDYxODI3ZjEyLCAweDYxODI3ZjEyLCAweDQ4ODAxY2UzLCAweDQ4ODAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg2NzgyYmYxMiwgMHg2NzgyYmYxMiwgMHg0YzgwMWNlNSwgMHg0YzgwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4NmI4MmJmMTQsIDB4NmI4MmJmMTQsIDB4NTA4MDFjZTksIDB4NTA4MDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU0ODAxY2ViLCAweDU0ODAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4NmY4MmJmMTYsIDB4NmY4MmJmMTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDZmODJiZjE2LCAweDZmODJiZjE2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg2ZjgyYmYxNiwgMHg2ZjgyYmYxNiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCisJezB4MDAwMTYwNDQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTR9LAorCXsweDAwMDE2MDQ4LCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxfSwKKwl7MHgwMDAxNjA2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTY0NDQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTR9LAorCXsweDAwMDE2NDQ4LCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxfSwKKwl7MHgwMDAxNjQ2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTY4NDQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTR9LAorCXsweDAwMDE2ODQ4LCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxfSwKKwl7MHgwMDAxNjg2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwMENvbW1vbl9yeF9nYWluX3RhYmxlXzJwMltdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwYTAwMCwgMHgwMDAxMDAwMH0sCisJezB4MDAwMGEwMDQsIDB4MDAwMzAwMDJ9LAorCXsweDAwMDBhMDA4LCAweDAwMDUwMDA0fSwKKwl7MHgwMDAwYTAwYywgMHgwMDgxMDA4MH0sCisJezB4MDAwMGEwMTAsIDB4MDA4MzAwODJ9LAorCXsweDAwMDBhMDE0LCAweDAxODEwMTgwfSwKKwl7MHgwMDAwYTAxOCwgMHgwMTgzMDE4Mn0sCisJezB4MDAwMGEwMWMsIDB4MDE4NTAxODR9LAorCXsweDAwMDBhMDIwLCAweDAxODkwMTg4fSwKKwl7MHgwMDAwYTAyNCwgMHgwMThiMDE4YX0sCisJezB4MDAwMGEwMjgsIDB4MDE4ZDAxOGN9LAorCXsweDAwMDBhMDJjLCAweDAxOTEwMTkwfSwKKwl7MHgwMDAwYTAzMCwgMHgwMTkzMDE5Mn0sCisJezB4MDAwMGEwMzQsIDB4MDE5NTAxOTR9LAorCXsweDAwMDBhMDM4LCAweDAzOGEwMTk2fSwKKwl7MHgwMDAwYTAzYywgMHgwMzhjMDM4Yn0sCisJezB4MDAwMGEwNDAsIDB4MDM5MDAzOGR9LAorCXsweDAwMDBhMDQ0LCAweDAzOTIwMzkxfSwKKwl7MHgwMDAwYTA0OCwgMHgwMzk0MDM5M30sCisJezB4MDAwMGEwNGMsIDB4MDM5NjAzOTV9LAorCXsweDAwMDBhMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDgwLCAweDIyMjIyMjI5fSwKKwl7MHgwMDAwYTA4NCwgMHgxZDFkMWQxZH0sCisJezB4MDAwMGEwODgsIDB4MWQxZDFkMWR9LAorCXsweDAwMDBhMDhjLCAweDFkMWQxZDFkfSwKKwl7MHgwMDAwYTA5MCwgMHgxNzFkMWQxZH0sCisJezB4MDAwMGEwOTQsIDB4MTExMTE3MTd9LAorCXsweDAwMDBhMDk4LCAweDAwMDMwMzExfSwKKwl7MHgwMDAwYTA5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBjMCwgMHgwMDFmMDAwMH0sCisJezB4MDAwMGEwYzQsIDB4MDEwMDAxMDF9LAorCXsweDAwMDBhMGM4LCAweDAxMWUwMTFmfSwKKwl7MHgwMDAwYTBjYywgMHgwMTFjMDExZH0sCisJezB4MDAwMGEwZDAsIDB4MDIwMzAyMDR9LAorCXsweDAwMDBhMGQ0LCAweDAyMDEwMjAyfSwKKwl7MHgwMDAwYTBkOCwgMHgwMjFmMDIwMH0sCisJezB4MDAwMGEwZGMsIDB4MDMwMjAyMWV9LAorCXsweDAwMDBhMGUwLCAweDAzMDAwMzAxfSwKKwl7MHgwMDAwYTBlNCwgMHgwMzFlMDMxZn0sCisJezB4MDAwMGEwZTgsIDB4MDQwMjAzMWR9LAorCXsweDAwMDBhMGVjLCAweDA0MDAwNDAxfSwKKwl7MHgwMDAwYTBmMCwgMHgwNDFlMDQxZn0sCisJezB4MDAwMGEwZjQsIDB4MDUwMjA0MWR9LAorCXsweDAwMDBhMGY4LCAweDA1MDAwNTAxfSwKKwl7MHgwMDAwYTBmYywgMHgwNTFlMDUxZn0sCisJezB4MDAwMGExMDAsIDB4MDYwMTA2MDJ9LAorCXsweDAwMDBhMTA0LCAweDA2MWYwNjAwfSwKKwl7MHgwMDAwYTEwOCwgMHgwNjFkMDYxZX0sCisJezB4MDAwMGExMGMsIDB4MDcwMjA3MDN9LAorCXsweDAwMDBhMTEwLCAweDA3MDAwNzAxfSwKKwl7MHgwMDAwYTExNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTQwLCAweDAwMWYwMDAwfSwKKwl7MHgwMDAwYTE0NCwgMHgwMTAwMDEwMX0sCisJezB4MDAwMGExNDgsIDB4MDExZTAxMWZ9LAorCXsweDAwMDBhMTRjLCAweDAxMWMwMTFkfSwKKwl7MHgwMDAwYTE1MCwgMHgwMjAzMDIwNH0sCisJezB4MDAwMGExNTQsIDB4MDIwMTAyMDJ9LAorCXsweDAwMDBhMTU4LCAweDAyMWYwMjAwfSwKKwl7MHgwMDAwYTE1YywgMHgwMzAyMDIxZX0sCisJezB4MDAwMGExNjAsIDB4MDMwMDAzMDF9LAorCXsweDAwMDBhMTY0LCAweDAzMWUwMzFmfSwKKwl7MHgwMDAwYTE2OCwgMHgwNDAyMDMxZH0sCisJezB4MDAwMGExNmMsIDB4MDQwMDA0MDF9LAorCXsweDAwMDBhMTcwLCAweDA0MWUwNDFmfSwKKwl7MHgwMDAwYTE3NCwgMHgwNTAyMDQxZH0sCisJezB4MDAwMGExNzgsIDB4MDUwMDA1MDF9LAorCXsweDAwMDBhMTdjLCAweDA1MWUwNTFmfSwKKwl7MHgwMDAwYTE4MCwgMHgwNjAxMDYwMn0sCisJezB4MDAwMGExODQsIDB4MDYxZjA2MDB9LAorCXsweDAwMDBhMTg4LCAweDA2MWQwNjFlfSwKKwl7MHgwMDAwYTE4YywgMHgwNzAyMDcwM30sCisJezB4MDAwMGExOTAsIDB4MDcwMDA3MDF9LAorCXsweDAwMDBhMTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExY2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZjAsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY0LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmOCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZmMsIDB4MDAwMDAxOTZ9LAorCXsweDAwMDBiMDAwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYjAwNCwgMHgwMDAzMDAwMn0sCisJezB4MDAwMGIwMDgsIDB4MDAwNTAwMDR9LAorCXsweDAwMDBiMDBjLCAweDAwODEwMDgwfSwKKwl7MHgwMDAwYjAxMCwgMHgwMDgzMDA4Mn0sCisJezB4MDAwMGIwMTQsIDB4MDE4MTAxODB9LAorCXsweDAwMDBiMDE4LCAweDAxODMwMTgyfSwKKwl7MHgwMDAwYjAxYywgMHgwMTg1MDE4NH0sCisJezB4MDAwMGIwMjAsIDB4MDI4MTAyODB9LAorCXsweDAwMDBiMDI0LCAweDAyODMwMjgyfSwKKwl7MHgwMDAwYjAyOCwgMHgwMjg1MDI4NH0sCisJezB4MDAwMGIwMmMsIDB4MDI4OTAyODh9LAorCXsweDAwMDBiMDMwLCAweDAyOGIwMjhhfSwKKwl7MHgwMDAwYjAzNCwgMHgwMzg4MDI4Y30sCisJezB4MDAwMGIwMzgsIDB4MDM4YTAzODl9LAorCXsweDAwMDBiMDNjLCAweDAzOGMwMzhifSwKKwl7MHgwMDAwYjA0MCwgMHgwMzkwMDM4ZH0sCisJezB4MDAwMGIwNDQsIDB4MDM5MjAzOTF9LAorCXsweDAwMDBiMDQ4LCAweDAzOTQwMzkzfSwKKwl7MHgwMDAwYjA0YywgMHgwMzk2MDM5NX0sCisJezB4MDAwMGIwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwODAsIDB4MzIzMjMyMzJ9LAorCXsweDAwMDBiMDg0LCAweDJmMmYzMjMyfSwKKwl7MHgwMDAwYjA4OCwgMHgyMzI4MmEyZH0sCisJezB4MDAwMGIwOGMsIDB4MWMxZTIxMjN9LAorCXsweDAwMDBiMDkwLCAweDE0MTcxOTE5fSwKKwl7MHgwMDAwYjA5NCwgMHgwZTBlMTIxNH0sCisJezB4MDAwMGIwOTgsIDB4MDMwNTA3MDd9LAorCXsweDAwMDBiMDljLCAweDAwMDMwMzAzfSwKKwl7MHgwMDAwYjBhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGMwLCAweDAwM2YwMDIwfSwKKwl7MHgwMDAwYjBjNCwgMHgwMDQwMDA0MX0sCisJezB4MDAwMGIwYzgsIDB4MDE0MDAwNWZ9LAorCXsweDAwMDBiMGNjLCAweDAxNjAwMTVmfSwKKwl7MHgwMDAwYjBkMCwgMHgwMTdlMDE3Zn0sCisJezB4MDAwMGIwZDQsIDB4MDI0MTAyNDJ9LAorCXsweDAwMDBiMGQ4LCAweDAyNWYwMjQwfSwKKwl7MHgwMDAwYjBkYywgMHgwMjdmMDI2MH0sCisJezB4MDAwMGIwZTAsIDB4MDM0MTAyN2V9LAorCXsweDAwMDBiMGU0LCAweDAzNWYwMzQwfSwKKwl7MHgwMDAwYjBlOCwgMHgwMzdmMDM2MH0sCisJezB4MDAwMGIwZWMsIDB4MDQ0MDA0NDF9LAorCXsweDAwMDBiMGYwLCAweDA0NjAwNDVmfSwKKwl7MHgwMDAwYjBmNCwgMHgwNTQxMDQ3Zn0sCisJezB4MDAwMGIwZjgsIDB4MDU1ZjA1NDB9LAorCXsweDAwMDBiMGZjLCAweDA1N2YwNTYwfSwKKwl7MHgwMDAwYjEwMCwgMHgwNjQwMDY0MX0sCisJezB4MDAwMGIxMDQsIDB4MDY2MDA2NWZ9LAorCXsweDAwMDBiMTA4LCAweDA2N2UwNjdmfSwKKwl7MHgwMDAwYjEwYywgMHgwNzQxMDc0Mn0sCisJezB4MDAwMGIxMTAsIDB4MDc1ZjA3NDB9LAorCXsweDAwMDBiMTE0LCAweDA3N2YwNzYwfSwKKwl7MHgwMDAwYjExOCwgMHgwNzgwMDc4MX0sCisJezB4MDAwMGIxMWMsIDB4MDdhMDA3OWZ9LAorCXsweDAwMDBiMTIwLCAweDA3YzEwN2JmfSwKKwl7MHgwMDAwYjEyNCwgMHgwMDAwMDdjMH0sCisJezB4MDAwMGIxMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxNDAsIDB4MDAzZjAwMjB9LAorCXsweDAwMDBiMTQ0LCAweDAwNDAwMDQxfSwKKwl7MHgwMDAwYjE0OCwgMHgwMTQwMDA1Zn0sCisJezB4MDAwMGIxNGMsIDB4MDE2MDAxNWZ9LAorCXsweDAwMDBiMTUwLCAweDAxN2UwMTdmfSwKKwl7MHgwMDAwYjE1NCwgMHgwMjQxMDI0Mn0sCisJezB4MDAwMGIxNTgsIDB4MDI1ZjAyNDB9LAorCXsweDAwMDBiMTVjLCAweDAyN2YwMjYwfSwKKwl7MHgwMDAwYjE2MCwgMHgwMzQxMDI3ZX0sCisJezB4MDAwMGIxNjQsIDB4MDM1ZjAzNDB9LAorCXsweDAwMDBiMTY4LCAweDAzN2YwMzYwfSwKKwl7MHgwMDAwYjE2YywgMHgwNDQwMDQ0MX0sCisJezB4MDAwMGIxNzAsIDB4MDQ2MDA0NWZ9LAorCXsweDAwMDBiMTc0LCAweDA1NDEwNDdmfSwKKwl7MHgwMDAwYjE3OCwgMHgwNTVmMDU0MH0sCisJezB4MDAwMGIxN2MsIDB4MDU3ZjA1NjB9LAorCXsweDAwMDBiMTgwLCAweDA2NDAwNjQxfSwKKwl7MHgwMDAwYjE4NCwgMHgwNjYwMDY1Zn0sCisJezB4MDAwMGIxODgsIDB4MDY3ZTA2N2Z9LAorCXsweDAwMDBiMThjLCAweDA3NDEwNzQyfSwKKwl7MHgwMDAwYjE5MCwgMHgwNzVmMDc0MH0sCisJezB4MDAwMGIxOTQsIDB4MDc3ZjA3NjB9LAorCXsweDAwMDBiMTk4LCAweDA3ODAwNzgxfSwKKwl7MHgwMDAwYjE5YywgMHgwN2EwMDc5Zn0sCisJezB4MDAwMGIxYTAsIDB4MDdjMTA3YmZ9LAorCXsweDAwMDBiMWE0LCAweDAwMDAwN2MwfSwKKwl7MHgwMDAwYjFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFkOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFmMCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGIxZjQsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBiMWY4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYjFmYywgMHgwMDAwMDE5Nn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMwME1vZGVzX2xvd19vYl9kYl90eF9nYWluX3RhYmxlXzJwMltdWzVdID0geworCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KKwl7MHgwMDAwYTQxMCwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOX0sCisJezB4MDAwMGE1MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTA0LCAweDA2MDAwMDAzLCAweDA2MDAwMDAzLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTUwOCwgMHgwYTAwMDAyMCwgMHgwYTAwMDAyMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1MGMsIDB4MTAwMDAwMjMsIDB4MTAwMDAwMjMsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAorCXsweDAwMDBhNTEwLCAweDE2MDAwMjIwLCAweDE2MDAwMjIwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKKwl7MHgwMDAwYTUxNCwgMHgxYzAwMDIyMywgMHgxYzAwMDIyMywgMHgxMjAwMDQwMCwgMHgxMjAwMDQwMH0sCisJezB4MDAwMGE1MTgsIDB4MjEwMDIyMjAsIDB4MjEwMDIyMjAsIDB4MTYwMDA0MDIsIDB4MTYwMDA0MDJ9LAorCXsweDAwMDBhNTFjLCAweDI3MDAyMjIzLCAweDI3MDAyMjIzLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKKwl7MHgwMDAwYTUyMCwgMHgyYjAyMjIyMCwgMHgyYjAyMjIyMCwgMHgxYzAwMDYwMywgMHgxYzAwMDYwM30sCisJezB4MDAwMGE1MjQsIDB4MmYwMjIyMjIsIDB4MmYwMjIyMjIsIDB4MjEwMDBhMDIsIDB4MjEwMDBhMDJ9LAorCXsweDAwMDBhNTI4LCAweDM0MDIyMjI1LCAweDM0MDIyMjI1LCAweDI1MDAwYTA0LCAweDI1MDAwYTA0fSwKKwl7MHgwMDAwYTUyYywgMHgzYTAyMjIyYSwgMHgzYTAyMjIyYSwgMHgyODAwMGEyMCwgMHgyODAwMGEyMH0sCisJezB4MDAwMGE1MzAsIDB4M2UwMjIyMmMsIDB4M2UwMjIyMmMsIDB4MmMwMDBlMjAsIDB4MmMwMDBlMjB9LAorCXsweDAwMDBhNTM0LCAweDQyMDIyNDJhLCAweDQyMDIyNDJhLCAweDMwMDAwZTIyLCAweDMwMDAwZTIyfSwKKwl7MHgwMDAwYTUzOCwgMHg0NzAyMjQ0YSwgMHg0NzAyMjQ0YSwgMHgzNDAwMGUyNCwgMHgzNDAwMGUyNH0sCisJezB4MDAwMGE1M2MsIDB4NGIwMjI0NGMsIDB4NGIwMjI0NGMsIDB4MzgwMDE2NDAsIDB4MzgwMDE2NDB9LAorCXsweDAwMDBhNTQwLCAweDRlMDIyNDZjLCAweDRlMDIyNDZjLCAweDNjMDAxNjYwLCAweDNjMDAxNjYwfSwKKwl7MHgwMDAwYTU0NCwgMHg1MzAyMjY2YywgMHg1MzAyMjY2YywgMHgzZjAwMTg2MSwgMHgzZjAwMTg2MX0sCisJezB4MDAwMGE1NDgsIDB4NTcwMjI4NmMsIDB4NTcwMjI4NmMsIDB4NDMwMDFhODEsIDB4NDMwMDFhODF9LAorCXsweDAwMDBhNTRjLCAweDVjMDI0ODZiLCAweDVjMDI0ODZiLCAweDQ3MDAxYTgzLCAweDQ3MDAxYTgzfSwKKwl7MHgwMDAwYTU1MCwgMHg2MTAyNGE2YywgMHg2MTAyNGE2YywgMHg0YTAwMWM4NCwgMHg0YTAwMWM4NH0sCisJezB4MDAwMGE1NTQsIDB4NjYwMjZhNmMsIDB4NjYwMjZhNmMsIDB4NGUwMDFjZTMsIDB4NGUwMDFjZTN9LAorCXsweDAwMDBhNTU4LCAweDZiMDI2ZTZjLCAweDZiMDI2ZTZjLCAweDUyMDAxY2U1LCAweDUyMDAxY2U1fSwKKwl7MHgwMDAwYTU1YywgMHg3MDAyNzA4YywgMHg3MDAyNzA4YywgMHg1NjAwMWNlOSwgMHg1NjAwMWNlOX0sCisJezB4MDAwMGE1NjAsIDB4NzMwMmIwOGEsIDB4NzMwMmIwOGEsIDB4NWEwMDFjZWIsIDB4NWEwMDFjZWJ9LAorCXsweDAwMDBhNTY0LCAweDc3MDJiMDhjLCAweDc3MDJiMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU2OCwgMHg3NzAyYjA4YywgMHg3NzAyYjA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1NmMsIDB4NzcwMmIwOGMsIDB4NzcwMmIwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTcwLCAweDc3MDJiMDhjLCAweDc3MDJiMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU3NCwgMHg3NzAyYjA4YywgMHg3NzAyYjA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCisJezB4MDAwMGE1NzgsIDB4NzcwMmIwOGMsIDB4NzcwMmIwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAorCXsweDAwMDBhNTdjLCAweDc3MDJiMDhjLCAweDc3MDJiMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKKwl7MHgwMDAwYTU4MCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMH0sCisJezB4MDAwMGE1ODQsIDB4MDY4MDAwMDMsIDB4MDY4MDAwMDMsIDB4MDQ4MDAwMDIsIDB4MDQ4MDAwMDJ9LAorCXsweDAwMDBhNTg4LCAweDBhODAwMDIwLCAweDBhODAwMDIwLCAweDA4ODAwMDA0LCAweDA4ODAwMDA0fSwKKwl7MHgwMDAwYTU4YywgMHgxMDgwMDAyMywgMHgxMDgwMDAyMywgMHgwYjgwMDIwMCwgMHgwYjgwMDIwMH0sCisJezB4MDAwMGE1OTAsIDB4MTY4MDAyMjAsIDB4MTY4MDAyMjAsIDB4MGY4MDAyMDIsIDB4MGY4MDAyMDJ9LAorCXsweDAwMDBhNTk0LCAweDFjODAwMjIzLCAweDFjODAwMjIzLCAweDEyODAwNDAwLCAweDEyODAwNDAwfSwKKwl7MHgwMDAwYTU5OCwgMHgyMTgwMjIyMCwgMHgyMTgwMjIyMCwgMHgxNjgwMDQwMiwgMHgxNjgwMDQwMn0sCisJezB4MDAwMGE1OWMsIDB4Mjc4MDIyMjMsIDB4Mjc4MDIyMjMsIDB4MTk4MDA0MDQsIDB4MTk4MDA0MDR9LAorCXsweDAwMDBhNWEwLCAweDJiODIyMjIwLCAweDJiODIyMjIwLCAweDFjODAwNjAzLCAweDFjODAwNjAzfSwKKwl7MHgwMDAwYTVhNCwgMHgyZjgyMjIyMiwgMHgyZjgyMjIyMiwgMHgyMTgwMGEwMiwgMHgyMTgwMGEwMn0sCisJezB4MDAwMGE1YTgsIDB4MzQ4MjIyMjUsIDB4MzQ4MjIyMjUsIDB4MjU4MDBhMDQsIDB4MjU4MDBhMDR9LAorCXsweDAwMDBhNWFjLCAweDNhODIyMjJhLCAweDNhODIyMjJhLCAweDI4ODAwYTIwLCAweDI4ODAwYTIwfSwKKwl7MHgwMDAwYTViMCwgMHgzZTgyMjIyYywgMHgzZTgyMjIyYywgMHgyYzgwMGUyMCwgMHgyYzgwMGUyMH0sCisJezB4MDAwMGE1YjQsIDB4NDI4MjI0MmEsIDB4NDI4MjI0MmEsIDB4MzA4MDBlMjIsIDB4MzA4MDBlMjJ9LAorCXsweDAwMDBhNWI4LCAweDQ3ODIyNDRhLCAweDQ3ODIyNDRhLCAweDM0ODAwZTI0LCAweDM0ODAwZTI0fSwKKwl7MHgwMDAwYTViYywgMHg0YjgyMjQ0YywgMHg0YjgyMjQ0YywgMHgzODgwMTY0MCwgMHgzODgwMTY0MH0sCisJezB4MDAwMGE1YzAsIDB4NGU4MjI0NmMsIDB4NGU4MjI0NmMsIDB4M2M4MDE2NjAsIDB4M2M4MDE2NjB9LAorCXsweDAwMDBhNWM0LCAweDUzODIyNjZjLCAweDUzODIyNjZjLCAweDNmODAxODYxLCAweDNmODAxODYxfSwKKwl7MHgwMDAwYTVjOCwgMHg1NzgyMjg2YywgMHg1NzgyMjg2YywgMHg0MzgwMWE4MSwgMHg0MzgwMWE4MX0sCisJezB4MDAwMGE1Y2MsIDB4NWM4MjQ4NmIsIDB4NWM4MjQ4NmIsIDB4NDc4MDFhODMsIDB4NDc4MDFhODN9LAorCXsweDAwMDBhNWQwLCAweDYxODI0YTZjLCAweDYxODI0YTZjLCAweDRhODAxYzg0LCAweDRhODAxYzg0fSwKKwl7MHgwMDAwYTVkNCwgMHg2NjgyNmE2YywgMHg2NjgyNmE2YywgMHg0ZTgwMWNlMywgMHg0ZTgwMWNlM30sCisJezB4MDAwMGE1ZDgsIDB4NmI4MjZlNmMsIDB4NmI4MjZlNmMsIDB4NTI4MDFjZTUsIDB4NTI4MDFjZTV9LAorCXsweDAwMDBhNWRjLCAweDcwODI3MDhjLCAweDcwODI3MDhjLCAweDU2ODAxY2U5LCAweDU2ODAxY2U5fSwKKwl7MHgwMDAwYTVlMCwgMHg3MzgyYjA4YSwgMHg3MzgyYjA4YSwgMHg1YTgwMWNlYiwgMHg1YTgwMWNlYn0sCisJezB4MDAwMGE1ZTQsIDB4Nzc4MmIwOGMsIDB4Nzc4MmIwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWU4LCAweDc3ODJiMDhjLCAweDc3ODJiMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVlYywgMHg3NzgyYjA4YywgMHg3NzgyYjA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZjAsIDB4Nzc4MmIwOGMsIDB4Nzc4MmIwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDBhNWY0LCAweDc3ODJiMDhjLCAweDc3ODJiMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKKwl7MHgwMDAwYTVmOCwgMHg3NzgyYjA4YywgMHg3NzgyYjA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCisJezB4MDAwMGE1ZmMsIDB4Nzc4MmIwOGMsIDB4Nzc4MmIwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAorCXsweDAwMDE2MDQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0fSwKKwl7MHgwMDAxNjA0OCwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMX0sCisJezB4MDAwMTYwNjgsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmN9LAorCXsweDAwMDE2NDQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0fSwKKwl7MHgwMDAxNjQ0OCwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMX0sCisJezB4MDAwMTY0NjgsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmN9LAorCXsweDAwMDE2ODQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0fSwKKwl7MHgwMDAxNjg0OCwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMSwgMHg2NjQ4MDAwMX0sCisJezB4MDAwMTY4NjgsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmN9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAyX21hY19jb3JlW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDAwMDA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDAzMCwgMHgwMDAyMDA4NX0sCisJezB4MDAwMDAwMzQsIDB4MDAwMDAwMDV9LAorCXsweDAwMDAwMDQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA0NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNDgsIDB4MDAwMDAwMDh9LAorCXsweDAwMDAwMDRjLCAweDAwMDAwMDEwfSwKKwl7MHgwMDAwMDA1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEwNDAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDQ0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0OCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNGMsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDUwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDVjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA2MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMGYwLCAweDAwMDAwMTAwfSwKKwl7MHgwMDAwMTI3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDEyYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTQzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0N2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA0OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNGMsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAorCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNzAsIDB4MDAwMDAzMTB9LAorCXsweDAwMDA4MDc0LCAweDAwMDAwMDIwfSwKKwl7MHgwMDAwODA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwOWMsIDB4MDAwMDAwMGZ9LAorCXsweDAwMDA4MGEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBhNCwgMHgwMmZmMDAwMH0sCisJezB4MDAwMDgwYTgsIDB4MGUwNzA2MDV9LAorCXsweDAwMDA4MGFjLCAweDAwMDAwMDBkfSwKKwl7MHgwMDAwODBiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYzAsIDB4MmE4MDAwMDB9LAorCXsweDAwMDA4MGM0LCAweDA2OTAwMTY4fSwKKwl7MHgwMDAwODBjOCwgMHgxMzg4MWMyMH0sCisJezB4MDAwMDgwY2MsIDB4MDFmNDAwMDB9LAorCXsweDAwMDA4MGQwLCAweDAwMjUyNTAwfSwKKwl7MHgwMDAwODBkNCwgMHgwMGEwMDAwMH0sCisJezB4MDAwMDgwZDgsIDB4MDA0MDAwMDB9LAorCXsweDAwMDA4MGRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBlMCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgwZTQsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MGU4LCAweDNmM2YzZjNmfSwKKwl7MHgwMDAwODBlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmYywgMHgwMDAyMDAwMH0sCisJezB4MDAwMDgxMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTA4LCAweDAwMDAwMDUyfSwKKwl7MHgwMDAwODEwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTE0LCAweDAwMDAwN2ZmfSwKKwl7MHgwMDAwODExOCwgMHgwMDAwMDBhYX0sCisJezB4MDAwMDgxMWMsIDB4MDAwMDMyMTB9LAorCXsweDAwMDA4MTI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTNjLCAweDAwMDBmZmZmfSwKKwl7MHgwMDAwODE0NCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgxNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE3MCwgMHgxODQ4NjIwMH0sCisJezB4MDAwMDgxNzQsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4MTc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE3YywgMHgwMDAyMDAwMH0sCisJezB4MDAwMDgxYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWM0LCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODFjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxY2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjQwLCAweDAwMTAwMDAwfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQyNH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDA4MDB9LAorCXsweDAwMDA4MjRjLCAweDAwMDFlODQ4fSwKKwl7MHgwMDAwODI1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1YywgMHg0MDAwMDAwMH0sCisJezB4MDAwMDgyNjAsIDB4MDAwODA5MjJ9LAorCXsweDAwMDA4MjY0LCAweDliYzAwMDEwfSwKKwl7MHgwMDAwODI2OCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgyNmMsIDB4MDAwMGZmZmZ9LAorCXsweDAwMDA4MjcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI3NCwgMHg0MDAwMDAwMH0sCisJezB4MDAwMDgyNzgsIDB4MDAzZTQxODB9LAorCXsweDAwMDA4MjdjLCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwODI4NCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyODgsIDB4MDAwMDAwMmN9LAorCXsweDAwMDA4MjhjLCAweDAwMDAwMGZmfSwKKwl7MHgwMDAwODI5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMwMCwgMHgwMDAwMDE0MH0sCisJezB4MDAwMDgzMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzFjLCAweDAwMDAwMTBkfSwKKwl7MHgwMDAwODMyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMmMsIDB4MDAwMDAwMDd9LAorCXsweDAwMDA4MzMwLCAweDAwMDAwMzAyfSwKKwl7MHgwMDAwODMzNCwgMHgwMDAwMDcwMH0sCisJezB4MDAwMDgzMzgsIDB4MDBmZjAwMDB9LAorCXsweDAwMDA4MzNjLCAweDAyNDAwMDAwfSwKKwl7MHgwMDAwODM0MCwgMHgwMDAxMDdmZn0sCisJezB4MDAwMDgzNDQsIDB4YWE0ODEwNWJ9LAorCXsweDAwMDA4MzQ4LCAweDAwOGYwMDAwfSwKKwl7MHgwMDAwODM1YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNjAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MzY0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mzc0LCAweDAwMDAwMGZmfSwKKwl7MHgwMDAwODM3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzgwLCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM4NCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzOTAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzk0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2EwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNhNCwgMHgwMDAwZmExNH0sCisJezB4MDAwMDgzYTgsIDB4MDAwZjBjMDB9LAorCXsweDAwMDA4M2FjLCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODNiMCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgzYjQsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2I4LCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2M0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzY2MsIDB4MDAwMDAyMDB9LAorCXsweDAwMDA4M2QwLCAweDAwMDMwMWZmfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwQ29tbW9uX3dvX3hsbmFfcnhfZ2Fpbl90YWJsZV8ycDJbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMGEwMDAsIDB4MDAwMTAwMDB9LAorCXsweDAwMDBhMDA0LCAweDAwMDMwMDAyfSwKKwl7MHgwMDAwYTAwOCwgMHgwMDA1MDAwNH0sCisJezB4MDAwMGEwMGMsIDB4MDA4MTAwODB9LAorCXsweDAwMDBhMDEwLCAweDAwODMwMDgyfSwKKwl7MHgwMDAwYTAxNCwgMHgwMTgxMDE4MH0sCisJezB4MDAwMGEwMTgsIDB4MDE4MzAxODJ9LAorCXsweDAwMDBhMDFjLCAweDAxODUwMTg0fSwKKwl7MHgwMDAwYTAyMCwgMHgwMTg5MDE4OH0sCisJezB4MDAwMGEwMjQsIDB4MDE4YjAxOGF9LAorCXsweDAwMDBhMDI4LCAweDAxOGQwMThjfSwKKwl7MHgwMDAwYTAyYywgMHgwMzgyMDE5MH0sCisJezB4MDAwMGEwMzAsIDB4MDM4NDAzODN9LAorCXsweDAwMDBhMDM0LCAweDAzODgwMzg1fSwKKwl7MHgwMDAwYTAzOCwgMHgwMzhhMDM4OX0sCisJezB4MDAwMGEwM2MsIDB4MDM4YzAzOGJ9LAorCXsweDAwMDBhMDQwLCAweDAzOTAwMzhkfSwKKwl7MHgwMDAwYTA0NCwgMHgwMzkyMDM5MX0sCisJezB4MDAwMGEwNDgsIDB4MDM5NDAzOTN9LAorCXsweDAwMDBhMDRjLCAweDAzOTYwMzk1fSwKKwl7MHgwMDAwYTA1MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA4MCwgMHgyOTI5MjkyOX0sCisJezB4MDAwMGEwODQsIDB4MjkyOTI5Mjl9LAorCXsweDAwMDBhMDg4LCAweDI5MjkyOTI5fSwKKwl7MHgwMDAwYTA4YywgMHgyOTI5MjkyOX0sCisJezB4MDAwMGEwOTAsIDB4MjIyOTI5Mjl9LAorCXsweDAwMDBhMDk0LCAweDFkMWQyMjIyfSwKKwl7MHgwMDAwYTA5OCwgMHgwYzExMTExN30sCisJezB4MDAwMGEwOWMsIDB4MDAwMzAzMDN9LAorCXsweDAwMDBhMGEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYzAsIDB4MDAxZjAwMDB9LAorCXsweDAwMDBhMGM0LCAweDAxMDAwMTAxfSwKKwl7MHgwMDAwYTBjOCwgMHgwMTFlMDExZn0sCisJezB4MDAwMGEwY2MsIDB4MDExYzAxMWR9LAorCXsweDAwMDBhMGQwLCAweDAyMDMwMjA0fSwKKwl7MHgwMDAwYTBkNCwgMHgwMjAxMDIwMn0sCisJezB4MDAwMGEwZDgsIDB4MDIxZjAyMDB9LAorCXsweDAwMDBhMGRjLCAweDAzMDIwMjFlfSwKKwl7MHgwMDAwYTBlMCwgMHgwMzAwMDMwMX0sCisJezB4MDAwMGEwZTQsIDB4MDMxZTAzMWZ9LAorCXsweDAwMDBhMGU4LCAweDA0MDIwMzFkfSwKKwl7MHgwMDAwYTBlYywgMHgwNDAwMDQwMX0sCisJezB4MDAwMGEwZjAsIDB4MDQxZTA0MWZ9LAorCXsweDAwMDBhMGY0LCAweDA1MDIwNDFkfSwKKwl7MHgwMDAwYTBmOCwgMHgwNTAwMDUwMX0sCisJezB4MDAwMGEwZmMsIDB4MDUxZTA1MWZ9LAorCXsweDAwMDBhMTAwLCAweDA2MDEwNjAyfSwKKwl7MHgwMDAwYTEwNCwgMHgwNjFmMDYwMH0sCisJezB4MDAwMGExMDgsIDB4MDYxZDA2MWV9LAorCXsweDAwMDBhMTBjLCAweDA3MDIwNzAzfSwKKwl7MHgwMDAwYTExMCwgMHgwNzAwMDcwMX0sCisJezB4MDAwMGExMTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTExYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE0MCwgMHgwMDFmMDAwMH0sCisJezB4MDAwMGExNDQsIDB4MDEwMDAxMDF9LAorCXsweDAwMDBhMTQ4LCAweDAxMWUwMTFmfSwKKwl7MHgwMDAwYTE0YywgMHgwMTFjMDExZH0sCisJezB4MDAwMGExNTAsIDB4MDIwMzAyMDR9LAorCXsweDAwMDBhMTU0LCAweDAyMDEwMjAyfSwKKwl7MHgwMDAwYTE1OCwgMHgwMjFmMDIwMH0sCisJezB4MDAwMGExNWMsIDB4MDMwMjAyMWV9LAorCXsweDAwMDBhMTYwLCAweDAzMDAwMzAxfSwKKwl7MHgwMDAwYTE2NCwgMHgwMzFlMDMxZn0sCisJezB4MDAwMGExNjgsIDB4MDQwMjAzMWR9LAorCXsweDAwMDBhMTZjLCAweDA0MDAwNDAxfSwKKwl7MHgwMDAwYTE3MCwgMHgwNDFlMDQxZn0sCisJezB4MDAwMGExNzQsIDB4MDUwMjA0MWR9LAorCXsweDAwMDBhMTc4LCAweDA1MDAwNTAxfSwKKwl7MHgwMDAwYTE3YywgMHgwNTFlMDUxZn0sCisJezB4MDAwMGExODAsIDB4MDYwMTA2MDJ9LAorCXsweDAwMDBhMTg0LCAweDA2MWYwNjAwfSwKKwl7MHgwMDAwYTE4OCwgMHgwNjFkMDYxZX0sCisJezB4MDAwMGExOGMsIDB4MDcwMjA3MDN9LAorCXsweDAwMDBhMTkwLCAweDA3MDAwNzAxfSwKKwl7MHgwMDAwYTE5NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExOTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQ4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWYwLCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmNCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZjgsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWZjLCAweDAwMDAwMTk2fSwKKwl7MHgwMDAwYjAwMCwgMHgwMDAxMDAwMH0sCisJezB4MDAwMGIwMDQsIDB4MDAwMzAwMDJ9LAorCXsweDAwMDBiMDA4LCAweDAwMDUwMDA0fSwKKwl7MHgwMDAwYjAwYywgMHgwMDgxMDA4MH0sCisJezB4MDAwMGIwMTAsIDB4MDA4MzAwODJ9LAorCXsweDAwMDBiMDE0LCAweDAxODEwMTgwfSwKKwl7MHgwMDAwYjAxOCwgMHgwMTgzMDE4Mn0sCisJezB4MDAwMGIwMWMsIDB4MDE4NTAxODR9LAorCXsweDAwMDBiMDIwLCAweDAyODEwMjgwfSwKKwl7MHgwMDAwYjAyNCwgMHgwMjgzMDI4Mn0sCisJezB4MDAwMGIwMjgsIDB4MDI4NTAyODR9LAorCXsweDAwMDBiMDJjLCAweDAyODkwMjg4fSwKKwl7MHgwMDAwYjAzMCwgMHgwMjhiMDI4YX0sCisJezB4MDAwMGIwMzQsIDB4MDM4ODAyOGN9LAorCXsweDAwMDBiMDM4LCAweDAzOGEwMzg5fSwKKwl7MHgwMDAwYjAzYywgMHgwMzhjMDM4Yn0sCisJezB4MDAwMGIwNDAsIDB4MDM5MDAzOGR9LAorCXsweDAwMDBiMDQ0LCAweDAzOTIwMzkxfSwKKwl7MHgwMDAwYjA0OCwgMHgwMzk0MDM5M30sCisJezB4MDAwMGIwNGMsIDB4MDM5NjAzOTV9LAorCXsweDAwMDBiMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA2MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDc0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMDgwLCAweDMyMzIzMjMyfSwKKwl7MHgwMDAwYjA4NCwgMHgyZjJmMzIzMn0sCisJezB4MDAwMGIwODgsIDB4MjMyODJhMmR9LAorCXsweDAwMDBiMDhjLCAweDFjMWUyMTIzfSwKKwl7MHgwMDAwYjA5MCwgMHgxNDE3MTkxOX0sCisJezB4MDAwMGIwOTQsIDB4MGUwZTEyMTR9LAorCXsweDAwMDBiMDk4LCAweDAzMDUwNzA3fSwKKwl7MHgwMDAwYjA5YywgMHgwMDAzMDMwM30sCisJezB4MDAwMGIwYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjBjMCwgMHgwMDNmMDAyMH0sCisJezB4MDAwMGIwYzQsIDB4MDA0MDAwNDF9LAorCXsweDAwMDBiMGM4LCAweDAxNDAwMDVmfSwKKwl7MHgwMDAwYjBjYywgMHgwMTYwMDE1Zn0sCisJezB4MDAwMGIwZDAsIDB4MDE3ZTAxN2Z9LAorCXsweDAwMDBiMGQ0LCAweDAyNDEwMjQyfSwKKwl7MHgwMDAwYjBkOCwgMHgwMjVmMDI0MH0sCisJezB4MDAwMGIwZGMsIDB4MDI3ZjAyNjB9LAorCXsweDAwMDBiMGUwLCAweDAzNDEwMjdlfSwKKwl7MHgwMDAwYjBlNCwgMHgwMzVmMDM0MH0sCisJezB4MDAwMGIwZTgsIDB4MDM3ZjAzNjB9LAorCXsweDAwMDBiMGVjLCAweDA0NDAwNDQxfSwKKwl7MHgwMDAwYjBmMCwgMHgwNDYwMDQ1Zn0sCisJezB4MDAwMGIwZjQsIDB4MDU0MTA0N2Z9LAorCXsweDAwMDBiMGY4LCAweDA1NWYwNTQwfSwKKwl7MHgwMDAwYjBmYywgMHgwNTdmMDU2MH0sCisJezB4MDAwMGIxMDAsIDB4MDY0MDA2NDF9LAorCXsweDAwMDBiMTA0LCAweDA2NjAwNjVmfSwKKwl7MHgwMDAwYjEwOCwgMHgwNjdlMDY3Zn0sCisJezB4MDAwMGIxMGMsIDB4MDc0MTA3NDJ9LAorCXsweDAwMDBiMTEwLCAweDA3NWYwNzQwfSwKKwl7MHgwMDAwYjExNCwgMHgwNzdmMDc2MH0sCisJezB4MDAwMGIxMTgsIDB4MDc4MDA3ODF9LAorCXsweDAwMDBiMTFjLCAweDA3YTAwNzlmfSwKKwl7MHgwMDAwYjEyMCwgMHgwN2MxMDdiZn0sCisJezB4MDAwMGIxMjQsIDB4MDAwMDA3YzB9LAorCXsweDAwMDBiMTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMTQwLCAweDAwM2YwMDIwfSwKKwl7MHgwMDAwYjE0NCwgMHgwMDQwMDA0MX0sCisJezB4MDAwMGIxNDgsIDB4MDE0MDAwNWZ9LAorCXsweDAwMDBiMTRjLCAweDAxNjAwMTVmfSwKKwl7MHgwMDAwYjE1MCwgMHgwMTdlMDE3Zn0sCisJezB4MDAwMGIxNTQsIDB4MDI0MTAyNDJ9LAorCXsweDAwMDBiMTU4LCAweDAyNWYwMjQwfSwKKwl7MHgwMDAwYjE1YywgMHgwMjdmMDI2MH0sCisJezB4MDAwMGIxNjAsIDB4MDM0MTAyN2V9LAorCXsweDAwMDBiMTY0LCAweDAzNWYwMzQwfSwKKwl7MHgwMDAwYjE2OCwgMHgwMzdmMDM2MH0sCisJezB4MDAwMGIxNmMsIDB4MDQ0MDA0NDF9LAorCXsweDAwMDBiMTcwLCAweDA0NjAwNDVmfSwKKwl7MHgwMDAwYjE3NCwgMHgwNTQxMDQ3Zn0sCisJezB4MDAwMGIxNzgsIDB4MDU1ZjA1NDB9LAorCXsweDAwMDBiMTdjLCAweDA1N2YwNTYwfSwKKwl7MHgwMDAwYjE4MCwgMHgwNjQwMDY0MX0sCisJezB4MDAwMGIxODQsIDB4MDY2MDA2NWZ9LAorCXsweDAwMDBiMTg4LCAweDA2N2UwNjdmfSwKKwl7MHgwMDAwYjE4YywgMHgwNzQxMDc0Mn0sCisJezB4MDAwMGIxOTAsIDB4MDc1ZjA3NDB9LAorCXsweDAwMDBiMTk0LCAweDA3N2YwNzYwfSwKKwl7MHgwMDAwYjE5OCwgMHgwNzgwMDc4MX0sCisJezB4MDAwMGIxOWMsIDB4MDdhMDA3OWZ9LAorCXsweDAwMDBiMWEwLCAweDA3YzEwN2JmfSwKKwl7MHgwMDAwYjFhNCwgMHgwMDAwMDdjMH0sCisJezB4MDAwMGIxYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxY2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFlMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBiMWU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYjFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGIxZjAsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBiMWY0LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYjFmOCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGIxZmMsIDB4MDAwMDAxOTZ9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAyX3NvY19wcmVhbWJsZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDBhNCwgMHgwMGEwYzFjOX0sCisJezB4MDAwMDcwMDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA3MDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzAzNCwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDcwMzgsIDB4MDAwMDA0YzJ9LAorCXsweDAwMDA3MDQ4LCAweDAwMDAwMDA4fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzAwUGNpZVBoeV9wbGxfb25fY2xrcmVxX2Rpc2FibGVfTDFfMnAyW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA0MDQwLCAweDA4MjEyZTVlfSwKKwl7MHgwMDAwNDA0MCwgMHgwMDA4MDAzYn0sCisJezB4MDAwMDQwNDQsIDB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBQY2llUGh5X2Nsa3JlcV9lbmFibGVfTDFfMnAyW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA0MDQwLCAweDA4MjUzZTVlfSwKKwl7MHgwMDAwNDA0MCwgMHgwMDA4MDAzYn0sCisJezB4MDAwMDQwNDQsIDB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBQY2llUGh5X2Nsa3JlcV9kaXNhYmxlX0wxXzJwMltdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNDA0MCwgMHgwODIxM2U1ZX0sCisJezB4MDAwMDQwNDAsIDB4MDAwODAwM2J9LAorCXsweDAwMDA0MDQ0LCAweDAwMDAwMDAwfSwKK307CisKKyNlbmRpZiAvKiBJTklUVkFMU185MDAzXzJQMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMKaW5kZXggNTZhOWU1Zi4uNWEwNjUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfY2FsaWIuYwpAQCAtNzM5LDYgKzczOSwxMiBAQAogCSAqLwogCWFyOTAwM19od19zZXRfY2hhaW5fbWFza3MoYWgsIDB4NywgMHg3KTsKIAorCS8qIERvIFR4IElRIENhbGlicmF0aW9uICovCisJYXI5MDAzX2h3X3R4X2lxX2NhbChhaCk7CisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQUNUSVZFLCBBUl9QSFlfQUNUSVZFX0RJUyk7CisJdWRlbGF5KDUpOworCVJFR19XUklURShhaCwgQVJfUEhZX0FDVElWRSwgQVJfUEhZX0FDVElWRV9FTik7CisKIAkvKiBDYWxpYnJhdGUgdGhlIEFHQyAqLwogCVJFR19XUklURShhaCwgQVJfUEhZX0FHQ19DT05UUk9MLAogCQkgIFJFR19SRUFEKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wpIHwKQEAgLTc1MywxMCArNzU5LDYgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCS8qIERvIFR4IElRIENhbGlicmF0aW9uICovCi0JaWYgKGFoLT5jb25maWcudHhfaXFfY2FsaWJyYXRpb24pCi0JCWFyOTAwM19od190eF9pcV9jYWwoYWgpOwotCiAJLyogUmV2ZXJ0IGNoYWlubWFza3MgdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzIGJlZm9yZSBORiBjYWwgKi8KIAlhcjkwMDNfaHdfc2V0X2NoYWluX21hc2tzKGFoLCBhaC0+cnhjaGFpbm1hc2ssIGFoLT50eGNoYWlubWFzayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCmluZGV4IDIzZWI2MGUuLmFjZThkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwpAQCAtNjcsNiArNjcsNyBAQAogCQkgICogYml0MiAtIGVuYWJsZSBmYXN0Q2xvY2sgLSBlbmFibGVkCiAJCSAgKiBiaXQzIC0gZW5hYmxlIGRvdWJsaW5nIC0gZW5hYmxlZAogCQkgICogYml0NCAtIGVuYWJsZSBpbnRlcm5hbCByZWd1bGF0b3IgLSBkaXNhYmxlZAorCQkgICogYml0NSAtIGVuYWJsZSBwYSBwcmVkaXN0b3J0aW9uIC0gZGlzYWJsZWQKIAkJICAqLwogCQkubWlzY0NvbmZpZ3VyYXRpb24gPSAwLCAvKiBiaXQwIC0gdHVybiBkb3duIGRyaXZlc3RyZW5ndGggKi8KIAkJLmVlcHJvbVdyaXRlRW5hYmxlR3BpbyA9IDMsCkBAIC0xMjksOSArMTMwLDExIEBACiAJCS50eEVuZFRvUnhPbiA9IDB4MiwKIAkJLnR4RnJhbWVUb1hwYU9uID0gMHhlLAogCQkudGhyZXNoNjIgPSAyOCwKLQkJLmZ1dHVyZU1vZGFsID0geyAvKiBbMzJdICovCisJCS5wYXBkUmF0ZU1hc2tIdDIwID0gTEUzMigweDgwYzA4MCksCisJCS5wYXBkUmF0ZU1hc2tIdDQwID0gTEUzMigweDgwYzA4MCksCisJCS5mdXR1cmVNb2RhbCA9IHsKIAkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiAJCX0sCiAJIH0sCiAJLmNhbEZyZXFQaWVyMkcgPSB7CkBAIC0zMjYsOSArMzI5LDExIEBACiAJCS50eEVuZFRvUnhPbiA9IDB4MiwKIAkJLnR4RnJhbWVUb1hwYU9uID0gMHhlLAogCQkudGhyZXNoNjIgPSAyOCwKKwkJLnBhcGRSYXRlTWFza0h0MjAgPSBMRTMyKDB4ZjBlMGUwKSwKKwkJLnBhcGRSYXRlTWFza0h0NDAgPSBMRTMyKDB4ZjBlMGUwKSwKIAkJLmZ1dHVyZU1vZGFsID0gewogCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKwkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKIAkJfSwKIAkgfSwKIAkuY2FsRnJlcVBpZXI1RyA9IHsKQEAgLTY0NCw2ICs2NDksOCBAQAogCQlyZXR1cm4gKHBCYXNlLT5mZWF0dXJlRW5hYmxlICYgMHgxMCkgPj4gNDsKIAljYXNlIEVFUF9TV1JFRzoKIAkJcmV0dXJuIGxlMzJfdG9fY3B1KHBCYXNlLT5zd3JlZyk7CisJY2FzZSBFRVBfUEFQUkQ6CisJCXJldHVybiAhIShwQmFzZS0+ZmVhdHVyZUVuYWJsZSAmIEJJVCg1KSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTQ0LDcgKzk1MSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB1MTYgYXRoOWtfaHdfYXI5MzAwX2dldF9lZXByb21fYW50ZW5uYV9jZmcoc3RydWN0IGF0aF9odyAqYWgsCitzdGF0aWMgdTMyIGF0aDlrX2h3X2FyOTMwMF9nZXRfZWVwcm9tX2FudGVubmFfY2ZnKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5oCmluZGV4IDIzZmIzNTMuLjNjNTMzYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uaApAQCAtMjM0LDcgKzIzNCw5IEBACiAJdTggdHhFbmRUb1J4T247CiAJdTggdHhGcmFtZVRvWHBhT247CiAJdTggdGhyZXNoNjI7Ci0JdTggZnV0dXJlTW9kYWxbMzJdOworCV9fbGUzMiBwYXBkUmF0ZU1hc2tIdDIwOworCV9fbGUzMiBwYXBkUmF0ZU1hc2tIdDQwOworCXU4IGZ1dHVyZU1vZGFsWzI0XTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBhcjkzMDBfY2FsX2RhdGFfcGVyX2ZyZXFfb3BfbG9vcCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2h3LmMKaW5kZXggYjE1MzA5Yy4uMDY0MTY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaHcuYwpAQCAtMTYsNyArMTYsOCBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfbWFjLmgiCi0jaW5jbHVkZSAiYXI5MDAzX2luaXR2YWxzLmgiCisjaW5jbHVkZSAiYXI5MDAzXzJwMF9pbml0dmFscy5oIgorI2luY2x1ZGUgImFyOTAwM18ycDJfaW5pdHZhbHMuaCIKIAogLyogR2VuZXJhbCBoYXJkd2FyZSBjb2RlIGZvciB0aGUgQVI5MDAzIGhhZHdhcmUgZmFtaWx5ICovCiAKQEAgLTMxLDEyICszMiw4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBBUjkwMDMgMi4wIC0gbmV3IElOSSBmb3JtYXQgKHByZSwgY29yZSwgcG9zdCBhcnJheXMgcGVyIHN1YnN5c3RlbSkgKi8KLS8qCi0gKiBYWFg6IG1vdmUgVFgvUlggZ2FpbiBJTkkgdG8gaXRzIG93biBpbml0X21vZGVfZ2Fpbl9yZWdzIGFmdGVyCi0gKiBlbnN1cmluZyBpdCBkb2VzIG5vdCBhZmZlY3QgaGFyZHdhcmUgYnJpbmcgdXAKLSAqLwotc3RhdGljIHZvaWQgYXI5MDAzX2h3X2luaXRfbW9kZV9yZWdzKHN0cnVjdCBhdGhfaHcgKmFoKQorLyogQVI5MDAzIDIuMCAqLworc3RhdGljIHZvaWQgYXI5MDAzXzJwMF9od19pbml0X21vZGVfcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAkvKiBtYWMgKi8KIAlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOwpAQCAtMTA2LDI3ICsxMDMsMTI4IEBACiAJCSAgICAgICAzKTsKIH0KIAorLyogQVI5MDAzIDIuMiAqLworc3RhdGljIHZvaWQgYXI5MDAzXzJwMl9od19pbml0X21vZGVfcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwkvKiBtYWMgKi8KKwlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTWFjW0FUSF9JTklfQ09SRV0sCisJCSAgICAgICBhcjkzMDBfMnAyX21hY19jb3JlLAorCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBfMnAyX21hY19jb3JlKSwgMik7CisJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNYWNbQVRIX0lOSV9QT1NUXSwKKwkJICAgICAgIGFyOTMwMF8ycDJfbWFjX3Bvc3RhbWJsZSwKKwkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwXzJwMl9tYWNfcG9zdGFtYmxlKSwgNSk7CisKKwkvKiBiYiAqLworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQkJbQVRIX0lOSV9QUkVdLCBOVUxMLCAwLCAwKTsKKwlJTklUX0lOSV9BUlJBWSgmYWgtPmluaUJCW0FUSF9JTklfQ09SRV0sCisJCSAgICAgICBhcjkzMDBfMnAyX2Jhc2ViYW5kX2NvcmUsCisJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwMF8ycDJfYmFzZWJhbmRfY29yZSksIDIpOworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQkJbQVRIX0lOSV9QT1NUXSwKKwkJICAgICAgIGFyOTMwMF8ycDJfYmFzZWJhbmRfcG9zdGFtYmxlLAorCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBfMnAyX2Jhc2ViYW5kX3Bvc3RhbWJsZSksIDUpOworCisJLyogcmFkaW8gKi8KKwlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVJhZGlvW0FUSF9JTklfUFJFXSwgTlVMTCwgMCwgMCk7CisJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlSYWRpb1tBVEhfSU5JX0NPUkVdLAorCQkgICAgICAgYXI5MzAwXzJwMl9yYWRpb19jb3JlLAorCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBfMnAyX3JhZGlvX2NvcmUpLCAyKTsKKwlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVJhZGlvW0FUSF9JTklfUE9TVF0sCisJCSAgICAgICBhcjkzMDBfMnAyX3JhZGlvX3Bvc3RhbWJsZSwKKwkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwXzJwMl9yYWRpb19wb3N0YW1ibGUpLCA1KTsKKworCS8qIHNvYyAqLworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfUFJFXSwKKwkJICAgICAgIGFyOTMwMF8ycDJfc29jX3ByZWFtYmxlLAorCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBfMnAyX3NvY19wcmVhbWJsZSksIDIpOworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfQ09SRV0sIE5VTEwsIDAsIDApOworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfUE9TVF0sCisJCSAgICAgICBhcjkzMDBfMnAyX3NvY19wb3N0YW1ibGUsCisJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwMF8ycDJfc29jX3Bvc3RhbWJsZSksIDUpOworCisJLyogcngvdHggZ2FpbiAqLworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCSAgICAgICBhcjkzMDBDb21tb25fcnhfZ2Fpbl90YWJsZV8ycDIsCisJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwMENvbW1vbl9yeF9nYWluX3RhYmxlXzJwMiksIDIpOworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCisJCSAgICAgICBhcjkzMDBNb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDIsCisJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwME1vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluX3RhYmxlXzJwMiksCisJCSAgICAgICA1KTsKKworCS8qIExvYWQgUENJRSBTRVJERVMgc2V0dGluZ3MgZnJvbSBJTkkgKi8KKworCS8qIEF3YWtlIFNldHRpbmcgKi8KKworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlcywKKwkJICAgICAgIGFyOTMwMFBjaWVQaHlfcGxsX29uX2Nsa3JlcV9kaXNhYmxlX0wxXzJwMiwKKwkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwUGNpZVBoeV9wbGxfb25fY2xrcmVxX2Rpc2FibGVfTDFfMnAyKSwKKwkJICAgICAgIDIpOworCisJLyogU2xlZXAgU2V0dGluZyAqLworCisJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzTG93UG93ZXIsCisJCSAgICAgICBhcjkzMDBQY2llUGh5X2Nsa3JlcV9lbmFibGVfTDFfMnAyLAorCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBQY2llUGh5X2Nsa3JlcV9lbmFibGVfTDFfMnAyKSwKKwkJICAgICAgIDIpOworCisJLyogRmFzdCBjbG9jayBtb2RhbCBzZXR0aW5ncyAqLworCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNBZGRpdGlvbmFsLAorCQkgICAgICAgYXI5MzAwTW9kZXNfZmFzdF9jbG9ja18ycDIsCisJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwME1vZGVzX2Zhc3RfY2xvY2tfMnAyKSwKKwkJICAgICAgIDMpOworfQorCisvKgorICogVGhlIEFSOTAwMyBmYW1pbHkgdXNlcyBhIG5ldyBJTkkgZm9ybWF0IChwcmUsIGNvcmUsIHBvc3QKKyAqIGFycmF5cyBwZXIgc3Vic3lzdGVtKS4KKyAqLworc3RhdGljIHZvaWQgYXI5MDAzX2h3X2luaXRfbW9kZV9yZWdzKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWlmIChBUl9TUkVWXzkzMDBfMjAoYWgpKQorCQlhcjkwMDNfMnAwX2h3X2luaXRfbW9kZV9yZWdzKGFoKTsKKwllbHNlCisJCWFyOTAwM18ycDJfaHdfaW5pdF9tb2RlX3JlZ3MoYWgpOworfQorCiBzdGF0aWMgdm9pZCBhcjkwMDNfdHhfZ2Fpbl90YWJsZV9hcHBseShzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAlzd2l0Y2ggKGFyOTAwM19od19nZXRfdHhfZ2Fpbl9pZHgoYWgpKSB7CiAJY2FzZSAwOgogCWRlZmF1bHQ6Ci0JCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCi0JCQkgICAgICAgYXI5MzAwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMnAwLAotCQkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMnAwKSwKLQkJCSAgICAgICA1KTsKKwkJaWYgKEFSX1NSRVZfOTMwMF8yMChhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJCSAgICAgICBhcjkzMDBNb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDAsCisJCQkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMnAwKSwKKwkJCQkgICAgICAgNSk7CisJCWVsc2UKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCisJCQkJICAgICAgIGFyOTMwME1vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluX3RhYmxlXzJwMiwKKwkJCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBNb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDIpLAorCQkJCSAgICAgICA1KTsKIAkJYnJlYWs7CiAJY2FzZSAxOgotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAotCQkJICAgICAgIGFyOTMwME1vZGVzX2hpZ2hfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDAsCi0JCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBNb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fdGFibGVfMnAwKSwKLQkJCSAgICAgICA1KTsKKwkJaWYgKEFSX1NSRVZfOTMwMF8yMChhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJCSAgICAgICBhcjkzMDBNb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fdGFibGVfMnAwLAorCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwME1vZGVzX2hpZ2hfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDApLAorCQkJCSAgICAgICA1KTsKKwkJZWxzZQorCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKKwkJCQkgICAgICAgYXI5MzAwTW9kZXNfaGlnaF9vYl9kYl90eF9nYWluX3RhYmxlXzJwMiwKKwkJCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBNb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fdGFibGVfMnAyKSwKKwkJCQkgICAgICAgNSk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKLQkJCSAgICAgICBhcjkzMDBNb2Rlc19sb3dfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDAsCi0JCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBNb2Rlc19sb3dfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDApLAotCQkJICAgICAgIDUpOworCQlpZiAoQVJfU1JFVl85MzAwXzIwKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCisJCQkJICAgICAgIGFyOTMwME1vZGVzX2xvd19vYl9kYl90eF9nYWluX3RhYmxlXzJwMCwKKwkJCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBNb2Rlc19sb3dfb2JfZGJfdHhfZ2Fpbl90YWJsZV8ycDApLAorCQkJCSAgICAgICA1KTsKKwkJZWxzZQorCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKKwkJCQkgICAgICAgYXI5MzAwTW9kZXNfbG93X29iX2RiX3R4X2dhaW5fdGFibGVfMnAyLAorCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwME1vZGVzX2xvd19vYl9kYl90eF9nYWluX3RhYmxlXzJwMiksCisJCQkJICAgICAgIDUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0xMzYsMTUgKzIzNCwyOCBAQAogCXN3aXRjaCAoYXI5MDAzX2h3X2dldF9yeF9nYWluX2lkeChhaCkpIHsKIAljYXNlIDA6CiAJZGVmYXVsdDoKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1J4R2FpbiwgYXI5MzAwQ29tbW9uX3J4X2dhaW5fdGFibGVfMnAwLAotCQkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwQ29tbW9uX3J4X2dhaW5fdGFibGVfMnAwKSwKLQkJCSAgICAgICAyKTsKKwkJaWYgKEFSX1NSRVZfOTMwMF8yMChhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzUnhHYWluLAorCQkJCSAgICAgICBhcjkzMDBDb21tb25fcnhfZ2Fpbl90YWJsZV8ycDAsCisJCQkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwQ29tbW9uX3J4X2dhaW5fdGFibGVfMnAwKSwKKwkJCQkgICAgICAgMik7CisJCWVsc2UKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCQkJICAgICAgIGFyOTMwMENvbW1vbl9yeF9nYWluX3RhYmxlXzJwMiwKKwkJCQkgICAgICAgQVJSQVlfU0laRShhcjkzMDBDb21tb25fcnhfZ2Fpbl90YWJsZV8ycDIpLAorCQkJCSAgICAgICAyKTsKIAkJYnJlYWs7CiAJY2FzZSAxOgotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzUnhHYWluLAotCQkJICAgICAgIGFyOTMwMENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMnAwLAotCQkJICAgICAgIEFSUkFZX1NJWkUoYXI5MzAwQ29tbW9uX3dvX3hsbmFfcnhfZ2Fpbl90YWJsZV8ycDApLAotCQkJICAgICAgIDIpOworCQlpZiAoQVJfU1JFVl85MzAwXzIwKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCQkJICAgICAgIGFyOTMwMENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMnAwLAorCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwMENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMnAwKSwKKwkJCQkgICAgICAgMik7CisJCWVsc2UKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCQkJICAgICAgIGFyOTMwMENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMnAyLAorCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTMwMENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMnAyKSwKKwkJCQkgICAgICAgMik7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE4NCw2ICsyOTUsMjYgQEAKIAkJLyogU2V2ZXJhbCBQQ0llIG1hc3NhZ2VzIHRvIGVuc3VyZSBwcm9wZXIgYmVoYXZpb3VyICovCiAJCWlmIChhaC0+Y29uZmlnLnBjaWVfd2FlbikKIAkJCVJFR19XUklURShhaCwgQVJfV0EsIGFoLT5jb25maWcucGNpZV93YWVuKTsKKwkJZWxzZQorCQkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPldBUmVnVmFsKTsKKwl9CisKKwkvKgorCSAqIENvbmZpZ2lyZSBQQ0lFIGFmdGVyIEluaSBpbml0LiBTRVJERVMgdmFsdWVzIG5vdyBjb21lIGZyb20gaW5pIGZpbGUKKwkgKiBUaGlzIGVuYWJsZXMgUENJZSBsb3cgcG93ZXIgbW9kZS4KKwkgKi8KKwlpZiAoYWgtPmNvbmZpZy5wY2llU2VyRGVzV3JpdGUpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCXN0cnVjdCBhcjU0MTZJbmlBcnJheSAqYXJyYXk7CisKKwkJYXJyYXkgPSBwb3dlcl9vZmYgPyAmYWgtPmluaVBjaWVTZXJkZXMgOgorCQkJCSAgICAmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgYXJyYXktPmlhX3Jvd3M7IGkrKykgeworCQkJUkVHX1dSSVRFKGFoLAorCQkJCSAgSU5JX1JBKGFycmF5LCBpLCAwKSwKKwkJCQkgIElOSV9SQShhcnJheSwgaSwgMSkpOworCQl9CiAJfQogfQogCkBAIC0yMDIsNCArMzMzLDYgQEAKIAlhcjkwMDNfaHdfYXR0YWNoX3BoeV9vcHMoYWgpOwogCWFyOTAwM19od19hdHRhY2hfY2FsaWJfb3BzKGFoKTsKIAlhcjkwMDNfaHdfYXR0YWNoX21hY19vcHMoYWgpOworCisJYXRoOWtfaHdfYXR0YWNoX2FuaV9vcHNfbmV3KGFoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaW5pdHZhbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMTlkZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2luaXR2YWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBJTklUVkFMU185MDAzX0gKLSNkZWZpbmUgSU5JVFZBTFNfOTAwM19ICi0KLS8qIEFSOTAwMyAyLjAgKi8KLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAwX3JhZGlvX3Bvc3RhbWJsZVtdWzVdID0gewotCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KLQl7MHgwMDAxNjA5YywgMHgwZGQwOGYyOSwgMHgwZGQwOGYyOSwgMHgwYjI4M2YzMSwgMHgwYjI4M2YzMX0sCi0JezB4MDAwMTYwYWMsIDB4YTQ2NTNjMDAsIDB4YTQ2NTNjMDAsIDB4MjQ2NTI4MDAsIDB4MjQ2NTI4MDB9LAotCXsweDAwMDE2MGIwLCAweDAzMjg0ZjNlLCAweDAzMjg0ZjNlLCAweDA1ZDA4ZjIwLCAweDA1ZDA4ZjIwfSwKLQl7MHgwMDAxNjEwYywgMHgwODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTYxNDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4NTA4MDQwMDgsIDB4NTA4MDQwMDh9LAotCXsweDAwMDE2NTBjLCAweDA4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjU0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg1MDgwNDAwOCwgMHg1MDgwNDAwOH0sCi0JezB4MDAwMTY5MGMsIDB4MDgwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2OTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDUwODA0MDA4LCAweDUwODA0MDA4fSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYXI5MzAwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMnAwW11bNV0gPSB7Ci0JLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLwotCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5fSwKLQl7MHgwMDAwYTUwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE1MDQsIDB4MDYwMDAwMDMsIDB4MDYwMDAwMDMsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAotCXsweDAwMDBhNTA4LCAweDBhMDAwMDIwLCAweDBhMDAwMDIwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKLQl7MHgwMDAwYTUwYywgMHgxMDAwMDAyMywgMHgxMDAwMDAyMywgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCi0JezB4MDAwMGE1MTAsIDB4MTYwMDAyMjAsIDB4MTYwMDAyMjAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAotCXsweDAwMDBhNTE0LCAweDFjMDAwMjIzLCAweDFjMDAwMjIzLCAweDEyMDAwNDAwLCAweDEyMDAwNDAwfSwKLQl7MHgwMDAwYTUxOCwgMHgyMTAyMDIyMCwgMHgyMTAyMDIyMCwgMHgxNjAwMDQwMiwgMHgxNjAwMDQwMn0sCi0JezB4MDAwMGE1MWMsIDB4MjcwMjAyMjMsIDB4MjcwMjAyMjMsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAotCXsweDAwMDBhNTIwLCAweDJiMDIyMjIwLCAweDJiMDIyMjIwLCAweDFjMDAwNjAzLCAweDFjMDAwNjAzfSwKLQl7MHgwMDAwYTUyNCwgMHgyZjAyMjIyMiwgMHgyZjAyMjIyMiwgMHgyMTAwMGEwMiwgMHgyMTAwMGEwMn0sCi0JezB4MDAwMGE1MjgsIDB4MzQwMjIyMjUsIDB4MzQwMjIyMjUsIDB4MjUwMDBhMDQsIDB4MjUwMDBhMDR9LAotCXsweDAwMDBhNTJjLCAweDNhMDIyMjJhLCAweDNhMDIyMjJhLCAweDI4MDAwYTIwLCAweDI4MDAwYTIwfSwKLQl7MHgwMDAwYTUzMCwgMHgzZTAyMjIyYywgMHgzZTAyMjIyYywgMHgyYzAwMGUyMCwgMHgyYzAwMGUyMH0sCi0JezB4MDAwMGE1MzQsIDB4NDIwMjI0MmEsIDB4NDIwMjI0MmEsIDB4MzAwMDBlMjIsIDB4MzAwMDBlMjJ9LAotCXsweDAwMDBhNTM4LCAweDQ3MDIyNDRhLCAweDQ3MDIyNDRhLCAweDM0MDAwZTI0LCAweDM0MDAwZTI0fSwKLQl7MHgwMDAwYTUzYywgMHg0YjAyMjQ0YywgMHg0YjAyMjQ0YywgMHgzODAwMTY0MCwgMHgzODAwMTY0MH0sCi0JezB4MDAwMGE1NDAsIDB4NGUwMjI0NmMsIDB4NGUwMjI0NmMsIDB4M2MwMDE2NjAsIDB4M2MwMDE2NjB9LAotCXsweDAwMDBhNTQ0LCAweDUzMDIyNjZjLCAweDUzMDIyNjZjLCAweDNmMDAxODYxLCAweDNmMDAxODYxfSwKLQl7MHgwMDAwYTU0OCwgMHg1NzAyMjg2YywgMHg1NzAyMjg2YywgMHg0MzAwMWE4MSwgMHg0MzAwMWE4MX0sCi0JezB4MDAwMGE1NGMsIDB4NWMwNDI4NmIsIDB4NWMwNDI4NmIsIDB4NDcwMDFhODMsIDB4NDcwMDFhODN9LAotCXsweDAwMDBhNTUwLCAweDYxMDQyYTZjLCAweDYxMDQyYTZjLCAweDRhMDAxYzg0LCAweDRhMDAxYzg0fSwKLQl7MHgwMDAwYTU1NCwgMHg2NjA2MmE2YywgMHg2NjA2MmE2YywgMHg0ZTAwMWNlMywgMHg0ZTAwMWNlM30sCi0JezB4MDAwMGE1NTgsIDB4NmIwNjJlNmMsIDB4NmIwNjJlNmMsIDB4NTIwMDFjZTUsIDB4NTIwMDFjZTV9LAotCXsweDAwMDBhNTVjLCAweDcwMDYzMDhjLCAweDcwMDYzMDhjLCAweDU2MDAxY2U5LCAweDU2MDAxY2U5fSwKLQl7MHgwMDAwYTU2MCwgMHg3MzBhMzA4YSwgMHg3MzBhMzA4YSwgMHg1YTAwMWNlYiwgMHg1YTAwMWNlYn0sCi0JezB4MDAwMGE1NjQsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAotCXsweDAwMDBhNTY4LCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKLQl7MHgwMDAwYTU2YywgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCi0JezB4MDAwMGE1NzAsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAotCXsweDAwMDBhNTc0LCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKLQl7MHgwMDAwYTU3OCwgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCi0JezB4MDAwMGE1N2MsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAotCXsweDAwMDBhNTgwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKLQl7MHgwMDAwYTU4NCwgMHgwNjgwMDAwMywgMHgwNjgwMDAwMywgMHgwNDgwMDAwMiwgMHgwNDgwMDAwMn0sCi0JezB4MDAwMGE1ODgsIDB4MGE4MDAwMjAsIDB4MGE4MDAwMjAsIDB4MDg4MDAwMDQsIDB4MDg4MDAwMDR9LAotCXsweDAwMDBhNThjLCAweDEwODAwMDIzLCAweDEwODAwMDIzLCAweDBiODAwMjAwLCAweDBiODAwMjAwfSwKLQl7MHgwMDAwYTU5MCwgMHgxNjgwMDIyMCwgMHgxNjgwMDIyMCwgMHgwZjgwMDIwMiwgMHgwZjgwMDIwMn0sCi0JezB4MDAwMGE1OTQsIDB4MWM4MDAyMjMsIDB4MWM4MDAyMjMsIDB4MTI4MDA0MDAsIDB4MTI4MDA0MDB9LAotCXsweDAwMDBhNTk4LCAweDIxODIwMjIwLCAweDIxODIwMjIwLCAweDE2ODAwNDAyLCAweDE2ODAwNDAyfSwKLQl7MHgwMDAwYTU5YywgMHgyNzgyMDIyMywgMHgyNzgyMDIyMywgMHgxOTgwMDQwNCwgMHgxOTgwMDQwNH0sCi0JezB4MDAwMGE1YTAsIDB4MmI4MjIyMjAsIDB4MmI4MjIyMjAsIDB4MWM4MDA2MDMsIDB4MWM4MDA2MDN9LAotCXsweDAwMDBhNWE0LCAweDJmODIyMjIyLCAweDJmODIyMjIyLCAweDIxODAwYTAyLCAweDIxODAwYTAyfSwKLQl7MHgwMDAwYTVhOCwgMHgzNDgyMjIyNSwgMHgzNDgyMjIyNSwgMHgyNTgwMGEwNCwgMHgyNTgwMGEwNH0sCi0JezB4MDAwMGE1YWMsIDB4M2E4MjIyMmEsIDB4M2E4MjIyMmEsIDB4Mjg4MDBhMjAsIDB4Mjg4MDBhMjB9LAotCXsweDAwMDBhNWIwLCAweDNlODIyMjJjLCAweDNlODIyMjJjLCAweDJjODAwZTIwLCAweDJjODAwZTIwfSwKLQl7MHgwMDAwYTViNCwgMHg0MjgyMjQyYSwgMHg0MjgyMjQyYSwgMHgzMDgwMGUyMiwgMHgzMDgwMGUyMn0sCi0JezB4MDAwMGE1YjgsIDB4NDc4MjI0NGEsIDB4NDc4MjI0NGEsIDB4MzQ4MDBlMjQsIDB4MzQ4MDBlMjR9LAotCXsweDAwMDBhNWJjLCAweDRiODIyNDRjLCAweDRiODIyNDRjLCAweDM4ODAxNjQwLCAweDM4ODAxNjQwfSwKLQl7MHgwMDAwYTVjMCwgMHg0ZTgyMjQ2YywgMHg0ZTgyMjQ2YywgMHgzYzgwMTY2MCwgMHgzYzgwMTY2MH0sCi0JezB4MDAwMGE1YzQsIDB4NTM4MjI2NmMsIDB4NTM4MjI2NmMsIDB4M2Y4MDE4NjEsIDB4M2Y4MDE4NjF9LAotCXsweDAwMDBhNWM4LCAweDU3ODIyODZjLCAweDU3ODIyODZjLCAweDQzODAxYTgxLCAweDQzODAxYTgxfSwKLQl7MHgwMDAwYTVjYywgMHg1Yzg0Mjg2YiwgMHg1Yzg0Mjg2YiwgMHg0NzgwMWE4MywgMHg0NzgwMWE4M30sCi0JezB4MDAwMGE1ZDAsIDB4NjE4NDJhNmMsIDB4NjE4NDJhNmMsIDB4NGE4MDFjODQsIDB4NGE4MDFjODR9LAotCXsweDAwMDBhNWQ0LCAweDY2ODYyYTZjLCAweDY2ODYyYTZjLCAweDRlODAxY2UzLCAweDRlODAxY2UzfSwKLQl7MHgwMDAwYTVkOCwgMHg2Yjg2MmU2YywgMHg2Yjg2MmU2YywgMHg1MjgwMWNlNSwgMHg1MjgwMWNlNX0sCi0JezB4MDAwMGE1ZGMsIDB4NzA4NjMwOGMsIDB4NzA4NjMwOGMsIDB4NTY4MDFjZTksIDB4NTY4MDFjZTl9LAotCXsweDAwMDBhNWUwLCAweDczOGEzMDhhLCAweDczOGEzMDhhLCAweDVhODAxY2ViLCAweDVhODAxY2VifSwKLQl7MHgwMDAwYTVlNCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCi0JezB4MDAwMGE1ZTgsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAotCXsweDAwMDBhNWVjLCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKLQl7MHgwMDAwYTVmMCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCi0JezB4MDAwMGE1ZjQsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAotCXsweDAwMDBhNWY4LCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKLQl7MHgwMDAwYTVmYywgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCi0JezB4MDAwMTYwNDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAotCXsweDAwMDE2MDQ4LCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxfSwKLQl7MHgwMDAxNjA2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCi0JezB4MDAwMTY0NDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAotCXsweDAwMDE2NDQ4LCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxfSwKLQl7MHgwMDAxNjQ2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCi0JezB4MDAwMTY4NDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDQsIDB4MDEyNDkyZDR9LAotCXsweDAwMDE2ODQ4LCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxLCAweDYyNDgwMDAxfSwKLQl7MHgwMDAxNjg2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwME1vZGVzX2Zhc3RfY2xvY2tfMnAwW11bM10gPSB7Ci0JLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAqLwotCXsweDAwMDAxMDMwLCAweDAwMDAwMjY4LCAweDAwMDAwNGQwfSwKLQl7MHgwMDAwMTA3MCwgMHgwMDAwMDE4YywgMHgwMDAwMDMxOH0sCi0JezB4MDAwMDEwYjAsIDB4MDAwMDBmZDAsIDB4MDAwMDFmYTB9LAotCXsweDAwMDA4MDE0LCAweDA0NGMwNDRjLCAweDA4OTgwODk4fSwKLQl7MHgwMDAwODAxYywgMHgxNDhlYzAyYiwgMHgxNDhlYzA1N30sCi0JezB4MDAwMDgzMTgsIDB4MDAwMDQ0YzAsIDB4MDAwMDg5ODB9LAotCXsweDAwMDA5ZTAwLCAweDAzNzIxODIxLCAweDAzNzIxODIxfSwKLQl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwYiwgMHgwMDAwMDAxNn0sCi0JezB4MDAwMGEyNTQsIDB4MDAwMDA4OTgsIDB4MDAwMDExMzB9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAwX3JhZGlvX2NvcmVbXVsyXSA9IHsKLQkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCi0JezB4MDAwMTYwMDAsIDB4MzZkYjZkYjZ9LAotCXsweDAwMDE2MDA0LCAweDZkYjZkYjQwfSwKLQl7MHgwMDAxNjAwOCwgMHg3M2YwMDAwMH0sCi0JezB4MDAwMTYwMGMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2MDQwLCAweDdmODBmZmY4fSwKLQl7MHgwMDAxNjA0YywgMHg3NmQwMDViNX0sCi0JezB4MDAwMTYwNTAsIDB4NTU2Y2YwMzF9LAotCXsweDAwMDE2MDU0LCAweDEzNDQ5NDQwfSwKLQl7MHgwMDAxNjA1OCwgMHgwYzUxYzkyY30sCi0JezB4MDAwMTYwNWMsIDB4M2RiN2ZmZmN9LAotCXsweDAwMDE2MDYwLCAweGZmZmZmZmZjfSwKLQl7MHgwMDAxNjA2NCwgMHgwMDBmMDI3OH0sCi0JezB4MDAwMTYwNmMsIDB4NmRiNjAwMDB9LAotCXsweDAwMDE2MDgwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjA4NCwgMHgwZTQ4MDQ4Y30sCi0JezB4MDAwMTYwODgsIDB4NTQyMTQ1MTR9LAotCXsweDAwMDE2MDhjLCAweDExOWY0ODFlfSwKLQl7MHgwMDAxNjA5MCwgMHgyNDkyNjQ5MH0sCi0JezB4MDAwMTYwOTgsIDB4ZDI4ODg4ODh9LAotCXsweDAwMDE2MGEwLCAweDBhMTA4ZmZlfSwKLQl7MHgwMDAxNjBhNCwgMHg4MTJmYzM3MH0sCi0JezB4MDAwMTYwYTgsIDB4NDIzYzgwMDB9LAotCXsweDAwMDE2MGI0LCAweDkyNDgwMDgwfSwKLQl7MHgwMDAxNjBjMCwgMHgwMGFkYjZkMH0sCi0JezB4MDAwMTYwYzQsIDB4NmRiNmRiNjB9LAotCXsweDAwMDE2MGM4LCAweDZkYjZkYjZjfSwKLQl7MHgwMDAxNjBjYywgMHgwMWU2YzAwMH0sCi0JezB4MDAwMTYxMDAsIDB4M2ZmZmJlMDF9LAotCXsweDAwMDE2MTA0LCAweGZmZjgwMDAwfSwKLQl7MHgwMDAxNjEwOCwgMHgwMDA4MDAxMH0sCi0JezB4MDAwMTYxNDQsIDB4MDIwODQwODB9LAotCXsweDAwMDE2MTQ4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjI4MCwgMHgwNThhMDAwMX0sCi0JezB4MDAwMTYyODQsIDB4M2Q4NDAyMDh9LAotCXsweDAwMDE2Mjg4LCAweDA1YTIwNDA4fSwKLQl7MHgwMDAxNjI4YywgMHgwMDAzOGMwN30sCi0JezB4MDAwMTYyOTAsIDB4NDAwMDAwMDR9LAotCXsweDAwMDE2Mjk0LCAweDQ1OGFhMTRmfSwKLQl7MHgwMDAxNjM4MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTYzODQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2Mzg4LCAweDAwODAwNzAwfSwKLQl7MHgwMDAxNjM4YywgMHgwMDgwMDcwMH0sCi0JezB4MDAwMTYzOTAsIDB4MDA4MDA3MDB9LAotCXsweDAwMDE2Mzk0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjM5OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTYzOWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2M2EwLCAweDAwMDAwMDAxfSwKLQl7MHgwMDAxNjNhNCwgMHgwMDAwMDAwMX0sCi0JezB4MDAwMTYzYTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2M2FjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjNiMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTYzYjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2M2I4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjNiYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTYzYzAsIDB4MDAwMDAwYTB9LAotCXsweDAwMDE2M2M0LCAweDAwMGMwMDAwfSwKLQl7MHgwMDAxNjNjOCwgMHgxNDAyMTQwMn0sCi0JezB4MDAwMTYzY2MsIDB4MDAwMDE0MDJ9LAotCXsweDAwMDE2M2QwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjNkNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTY0MDAsIDB4MzZkYjZkYjZ9LAotCXsweDAwMDE2NDA0LCAweDZkYjZkYjQwfSwKLQl7MHgwMDAxNjQwOCwgMHg3M2YwMDAwMH0sCi0JezB4MDAwMTY0MGMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2NDQwLCAweDdmODBmZmY4fSwKLQl7MHgwMDAxNjQ0YywgMHg3NmQwMDViNX0sCi0JezB4MDAwMTY0NTAsIDB4NTU2Y2YwMzF9LAotCXsweDAwMDE2NDU0LCAweDEzNDQ5NDQwfSwKLQl7MHgwMDAxNjQ1OCwgMHgwYzUxYzkyY30sCi0JezB4MDAwMTY0NWMsIDB4M2RiN2ZmZmN9LAotCXsweDAwMDE2NDYwLCAweGZmZmZmZmZjfSwKLQl7MHgwMDAxNjQ2NCwgMHgwMDBmMDI3OH0sCi0JezB4MDAwMTY0NmMsIDB4NmRiNjAwMDB9LAotCXsweDAwMDE2NTAwLCAweDNmZmZiZTAxfSwKLQl7MHgwMDAxNjUwNCwgMHhmZmY4MDAwMH0sCi0JezB4MDAwMTY1MDgsIDB4MDAwODAwMTB9LAotCXsweDAwMDE2NTQ0LCAweDAyMDg0MDgwfSwKLQl7MHgwMDAxNjU0OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTY3ODAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2Nzg0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjc4OCwgMHgwMDgwMDcwMH0sCi0JezB4MDAwMTY3OGMsIDB4MDA4MDA3MDB9LAotCXsweDAwMDE2NzkwLCAweDAwODAwNzAwfSwKLQl7MHgwMDAxNjc5NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTY3OTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2NzljLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjdhMCwgMHgwMDAwMDAwMX0sCi0JezB4MDAwMTY3YTQsIDB4MDAwMDAwMDF9LAotCXsweDAwMDE2N2E4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjdhYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTY3YjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2N2I0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjdiOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTY3YmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2N2MwLCAweDAwMDAwMGEwfSwKLQl7MHgwMDAxNjdjNCwgMHgwMDBjMDAwMH0sCi0JezB4MDAwMTY3YzgsIDB4MTQwMjE0MDJ9LAotCXsweDAwMDE2N2NjLCAweDAwMDAxNDAyfSwKLQl7MHgwMDAxNjdkMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTY3ZDQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2ODAwLCAweDM2ZGI2ZGI2fSwKLQl7MHgwMDAxNjgwNCwgMHg2ZGI2ZGI0MH0sCi0JezB4MDAwMTY4MDgsIDB4NzNmMDAwMDB9LAotCXsweDAwMDE2ODBjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNjg0MCwgMHg3ZjgwZmZmOH0sCi0JezB4MDAwMTY4NGMsIDB4NzZkMDA1YjV9LAotCXsweDAwMDE2ODUwLCAweDU1NmNmMDMxfSwKLQl7MHgwMDAxNjg1NCwgMHgxMzQ0OTQ0MH0sCi0JezB4MDAwMTY4NTgsIDB4MGM1MWM5MmN9LAotCXsweDAwMDE2ODVjLCAweDNkYjdmZmZjfSwKLQl7MHgwMDAxNjg2MCwgMHhmZmZmZmZmY30sCi0JezB4MDAwMTY4NjQsIDB4MDAwZjAyNzh9LAotCXsweDAwMDE2ODZjLCAweDZkYjYwMDAwfSwKLQl7MHgwMDAxNjkwMCwgMHgzZmZmYmUwMX0sCi0JezB4MDAwMTY5MDQsIDB4ZmZmODAwMDB9LAotCXsweDAwMDE2OTA4LCAweDAwMDgwMDEwfSwKLQl7MHgwMDAxNjk0NCwgMHgwMjA4NDA4MH0sCi0JezB4MDAwMTY5NDgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2YjgwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNmI4NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTZiODgsIDB4MDA4MDA3MDB9LAotCXsweDAwMDE2YjhjLCAweDAwODAwNzAwfSwKLQl7MHgwMDAxNmI5MCwgMHgwMDgwMDcwMH0sCi0JezB4MDAwMTZiOTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2Yjk4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNmI5YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTZiYTAsIDB4MDAwMDAwMDF9LAotCXsweDAwMDE2YmE0LCAweDAwMDAwMDAxfSwKLQl7MHgwMDAxNmJhOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTZiYWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2YmIwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNmJiNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMTZiYjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2YmJjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAxNmJjMCwgMHgwMDAwMDBhMH0sCi0JezB4MDAwMTZiYzQsIDB4MDAwYzAwMDB9LAotCXsweDAwMDE2YmM4LCAweDE0MDIxNDAyfSwKLQl7MHgwMDAxNmJjYywgMHgwMDAwMTQwMn0sCi0JezB4MDAwMTZiZDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDE2YmQ0LCAweDAwMDAwMDAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYXI5MzAwQ29tbW9uX3J4X2dhaW5fdGFibGVfbWVybGluXzJwMFtdWzJdID0gewotCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KLQl7MHgwMDAwYTAwMCwgMHgwMjAwMDEwMX0sCi0JezB4MDAwMGEwMDQsIDB4MDIwMDAxMDJ9LAotCXsweDAwMDBhMDA4LCAweDAyMDAwMTAzfSwKLQl7MHgwMDAwYTAwYywgMHgwMjAwMDEwNH0sCi0JezB4MDAwMGEwMTAsIDB4MDIwMDAyMDB9LAotCXsweDAwMDBhMDE0LCAweDAyMDAwMjAxfSwKLQl7MHgwMDAwYTAxOCwgMHgwMjAwMDIwMn0sCi0JezB4MDAwMGEwMWMsIDB4MDIwMDAyMDN9LAotCXsweDAwMDBhMDIwLCAweDAyMDAwMjA0fSwKLQl7MHgwMDAwYTAyNCwgMHgwMjAwMDIwNX0sCi0JezB4MDAwMGEwMjgsIDB4MDIwMDAyMDh9LAotCXsweDAwMDBhMDJjLCAweDAyMDAwMzAyfSwKLQl7MHgwMDAwYTAzMCwgMHgwMjAwMDMwM30sCi0JezB4MDAwMGEwMzQsIDB4MDIwMDAzMDR9LAotCXsweDAwMDBhMDM4LCAweDAyMDAwNDAwfSwKLQl7MHgwMDAwYTAzYywgMHgwMjAxMDMwMH0sCi0JezB4MDAwMGEwNDAsIDB4MDIwMTAzMDF9LAotCXsweDAwMDBhMDQ0LCAweDAyMDEwMzAyfSwKLQl7MHgwMDAwYTA0OCwgMHgwMjAwMDUwMH0sCi0JezB4MDAwMGEwNGMsIDB4MDIwMTA0MDB9LAotCXsweDAwMDBhMDUwLCAweDAyMDIwMzAwfSwKLQl7MHgwMDAwYTA1NCwgMHgwMjAyMDMwMX0sCi0JezB4MDAwMGEwNTgsIDB4MDIwMjAzMDJ9LAotCXsweDAwMDBhMDVjLCAweDAyMDIwMzAzfSwKLQl7MHgwMDAwYTA2MCwgMHgwMjAyMDQwMH0sCi0JezB4MDAwMGEwNjQsIDB4MDIwMzAzMDB9LAotCXsweDAwMDBhMDY4LCAweDAyMDMwMzAxfSwKLQl7MHgwMDAwYTA2YywgMHgwMjAzMDMwMn0sCi0JezB4MDAwMGEwNzAsIDB4MDIwMzAzMDN9LAotCXsweDAwMDBhMDc0LCAweDAyMDMwNDAwfSwKLQl7MHgwMDAwYTA3OCwgMHgwMjA0MDMwMH0sCi0JezB4MDAwMGEwN2MsIDB4MDIwNDAzMDF9LAotCXsweDAwMDBhMDgwLCAweDAyMDQwMzAyfSwKLQl7MHgwMDAwYTA4NCwgMHgwMjA0MDMwM30sCi0JezB4MDAwMGEwODgsIDB4MDIwMzA1MDB9LAotCXsweDAwMDBhMDhjLCAweDAyMDQwNDAwfSwKLQl7MHgwMDAwYTA5MCwgMHgwMjA1MDIwM30sCi0JezB4MDAwMGEwOTQsIDB4MDIwNTAyMDR9LAotCXsweDAwMDBhMDk4LCAweDAyMDUwMjA1fSwKLQl7MHgwMDAwYTA5YywgMHgwMjA0MDUwMH0sCi0JezB4MDAwMGEwYTAsIDB4MDIwNTAzMDF9LAotCXsweDAwMDBhMGE0LCAweDAyMDUwMzAyfSwKLQl7MHgwMDAwYTBhOCwgMHgwMjA1MDMwM30sCi0JezB4MDAwMGEwYWMsIDB4MDIwNTA0MDB9LAotCXsweDAwMDBhMGIwLCAweDAyMDUwNDAxfSwKLQl7MHgwMDAwYTBiNCwgMHgwMjA1MDQwMn0sCi0JezB4MDAwMGEwYjgsIDB4MDIwNTA0MDN9LAotCXsweDAwMDBhMGJjLCAweDAyMDUwNTAwfSwKLQl7MHgwMDAwYTBjMCwgMHgwMjA1MDUwMX0sCi0JezB4MDAwMGEwYzQsIDB4MDIwNTA1MDJ9LAotCXsweDAwMDBhMGM4LCAweDAyMDUwNTAzfSwKLQl7MHgwMDAwYTBjYywgMHgwMjA1MDUwNH0sCi0JezB4MDAwMGEwZDAsIDB4MDIwNTA2MDB9LAotCXsweDAwMDBhMGQ0LCAweDAyMDUwNjAxfSwKLQl7MHgwMDAwYTBkOCwgMHgwMjA1MDYwMn0sCi0JezB4MDAwMGEwZGMsIDB4MDIwNTA2MDN9LAotCXsweDAwMDBhMGUwLCAweDAyMDUwNjA0fSwKLQl7MHgwMDAwYTBlNCwgMHgwMjA1MDcwMH0sCi0JezB4MDAwMGEwZTgsIDB4MDIwNTA3MDF9LAotCXsweDAwMDBhMGVjLCAweDAyMDUwNzAyfSwKLQl7MHgwMDAwYTBmMCwgMHgwMjA1MDcwM30sCi0JezB4MDAwMGEwZjQsIDB4MDIwNTA3MDR9LAotCXsweDAwMDBhMGY4LCAweDAyMDUwNzA1fSwKLQl7MHgwMDAwYTBmYywgMHgwMjA1MDcwOH0sCi0JezB4MDAwMGExMDAsIDB4MDIwNTA3MDl9LAotCXsweDAwMDBhMTA0LCAweDAyMDUwNzBhfSwKLQl7MHgwMDAwYTEwOCwgMHgwMjA1MDcwYn0sCi0JezB4MDAwMGExMGMsIDB4MDIwNTA3MGN9LAotCXsweDAwMDBhMTEwLCAweDAyMDUwNzBkfSwKLQl7MHgwMDAwYTExNCwgMHgwMjA1MDcxMH0sCi0JezB4MDAwMGExMTgsIDB4MDIwNTA3MTF9LAotCXsweDAwMDBhMTFjLCAweDAyMDUwNzEyfSwKLQl7MHgwMDAwYTEyMCwgMHgwMjA1MDcxM30sCi0JezB4MDAwMGExMjQsIDB4MDIwNTA3MTR9LAotCXsweDAwMDBhMTI4LCAweDAyMDUwNzE1fSwKLQl7MHgwMDAwYTEyYywgMHgwMjA1MDczMH0sCi0JezB4MDAwMGExMzAsIDB4MDIwNTA3MzF9LAotCXsweDAwMDBhMTM0LCAweDAyMDUwNzMyfSwKLQl7MHgwMDAwYTEzOCwgMHgwMjA1MDczM30sCi0JezB4MDAwMGExM2MsIDB4MDIwNTA3MzR9LAotCXsweDAwMDBhMTQwLCAweDAyMDUwNzM1fSwKLQl7MHgwMDAwYTE0NCwgMHgwMjA1MDc1MH0sCi0JezB4MDAwMGExNDgsIDB4MDIwNTA3NTF9LAotCXsweDAwMDBhMTRjLCAweDAyMDUwNzUyfSwKLQl7MHgwMDAwYTE1MCwgMHgwMjA1MDc1M30sCi0JezB4MDAwMGExNTQsIDB4MDIwNTA3NTR9LAotCXsweDAwMDBhMTU4LCAweDAyMDUwNzU1fSwKLQl7MHgwMDAwYTE1YywgMHgwMjA1MDc3MH0sCi0JezB4MDAwMGExNjAsIDB4MDIwNTA3NzF9LAotCXsweDAwMDBhMTY0LCAweDAyMDUwNzcyfSwKLQl7MHgwMDAwYTE2OCwgMHgwMjA1MDc3M30sCi0JezB4MDAwMGExNmMsIDB4MDIwNTA3NzR9LAotCXsweDAwMDBhMTcwLCAweDAyMDUwNzc1fSwKLQl7MHgwMDAwYTE3NCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExNzgsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMTdjLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTE4MCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExODQsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMTg4LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTE4YywgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExOTAsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMTk0LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTE5OCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExOWMsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWEwLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFhNCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExYTgsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWFjLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFiMCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExYjQsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWI4LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFiYywgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExYzAsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWM0LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFjOCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExY2MsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWQwLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFkNCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExZDgsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWRjLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFlMCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExZTQsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWU4LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFlYywgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExZjAsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBhMWY0LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYTFmOCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGExZmMsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMDAwLCAweDAyMDAwMTAxfSwKLQl7MHgwMDAwYjAwNCwgMHgwMjAwMDEwMn0sCi0JezB4MDAwMGIwMDgsIDB4MDIwMDAxMDN9LAotCXsweDAwMDBiMDBjLCAweDAyMDAwMTA0fSwKLQl7MHgwMDAwYjAxMCwgMHgwMjAwMDIwMH0sCi0JezB4MDAwMGIwMTQsIDB4MDIwMDAyMDF9LAotCXsweDAwMDBiMDE4LCAweDAyMDAwMjAyfSwKLQl7MHgwMDAwYjAxYywgMHgwMjAwMDIwM30sCi0JezB4MDAwMGIwMjAsIDB4MDIwMDAyMDR9LAotCXsweDAwMDBiMDI0LCAweDAyMDAwMjA1fSwKLQl7MHgwMDAwYjAyOCwgMHgwMjAwMDIwOH0sCi0JezB4MDAwMGIwMmMsIDB4MDIwMDAzMDJ9LAotCXsweDAwMDBiMDMwLCAweDAyMDAwMzAzfSwKLQl7MHgwMDAwYjAzNCwgMHgwMjAwMDMwNH0sCi0JezB4MDAwMGIwMzgsIDB4MDIwMDA0MDB9LAotCXsweDAwMDBiMDNjLCAweDAyMDEwMzAwfSwKLQl7MHgwMDAwYjA0MCwgMHgwMjAxMDMwMX0sCi0JezB4MDAwMGIwNDQsIDB4MDIwMTAzMDJ9LAotCXsweDAwMDBiMDQ4LCAweDAyMDAwNTAwfSwKLQl7MHgwMDAwYjA0YywgMHgwMjAxMDQwMH0sCi0JezB4MDAwMGIwNTAsIDB4MDIwMjAzMDB9LAotCXsweDAwMDBiMDU0LCAweDAyMDIwMzAxfSwKLQl7MHgwMDAwYjA1OCwgMHgwMjAyMDMwMn0sCi0JezB4MDAwMGIwNWMsIDB4MDIwMjAzMDN9LAotCXsweDAwMDBiMDYwLCAweDAyMDIwNDAwfSwKLQl7MHgwMDAwYjA2NCwgMHgwMjAzMDMwMH0sCi0JezB4MDAwMGIwNjgsIDB4MDIwMzAzMDF9LAotCXsweDAwMDBiMDZjLCAweDAyMDMwMzAyfSwKLQl7MHgwMDAwYjA3MCwgMHgwMjAzMDMwM30sCi0JezB4MDAwMGIwNzQsIDB4MDIwMzA0MDB9LAotCXsweDAwMDBiMDc4LCAweDAyMDQwMzAwfSwKLQl7MHgwMDAwYjA3YywgMHgwMjA0MDMwMX0sCi0JezB4MDAwMGIwODAsIDB4MDIwNDAzMDJ9LAotCXsweDAwMDBiMDg0LCAweDAyMDQwMzAzfSwKLQl7MHgwMDAwYjA4OCwgMHgwMjAzMDUwMH0sCi0JezB4MDAwMGIwOGMsIDB4MDIwNDA0MDB9LAotCXsweDAwMDBiMDkwLCAweDAyMDUwMjAzfSwKLQl7MHgwMDAwYjA5NCwgMHgwMjA1MDIwNH0sCi0JezB4MDAwMGIwOTgsIDB4MDIwNTAyMDV9LAotCXsweDAwMDBiMDljLCAweDAyMDQwNTAwfSwKLQl7MHgwMDAwYjBhMCwgMHgwMjA1MDMwMX0sCi0JezB4MDAwMGIwYTQsIDB4MDIwNTAzMDJ9LAotCXsweDAwMDBiMGE4LCAweDAyMDUwMzAzfSwKLQl7MHgwMDAwYjBhYywgMHgwMjA1MDQwMH0sCi0JezB4MDAwMGIwYjAsIDB4MDIwNTA0MDF9LAotCXsweDAwMDBiMGI0LCAweDAyMDUwNDAyfSwKLQl7MHgwMDAwYjBiOCwgMHgwMjA1MDQwM30sCi0JezB4MDAwMGIwYmMsIDB4MDIwNTA1MDB9LAotCXsweDAwMDBiMGMwLCAweDAyMDUwNTAxfSwKLQl7MHgwMDAwYjBjNCwgMHgwMjA1MDUwMn0sCi0JezB4MDAwMGIwYzgsIDB4MDIwNTA1MDN9LAotCXsweDAwMDBiMGNjLCAweDAyMDUwNTA0fSwKLQl7MHgwMDAwYjBkMCwgMHgwMjA1MDYwMH0sCi0JezB4MDAwMGIwZDQsIDB4MDIwNTA2MDF9LAotCXsweDAwMDBiMGQ4LCAweDAyMDUwNjAyfSwKLQl7MHgwMDAwYjBkYywgMHgwMjA1MDYwM30sCi0JezB4MDAwMGIwZTAsIDB4MDIwNTA2MDR9LAotCXsweDAwMDBiMGU0LCAweDAyMDUwNzAwfSwKLQl7MHgwMDAwYjBlOCwgMHgwMjA1MDcwMX0sCi0JezB4MDAwMGIwZWMsIDB4MDIwNTA3MDJ9LAotCXsweDAwMDBiMGYwLCAweDAyMDUwNzAzfSwKLQl7MHgwMDAwYjBmNCwgMHgwMjA1MDcwNH0sCi0JezB4MDAwMGIwZjgsIDB4MDIwNTA3MDV9LAotCXsweDAwMDBiMGZjLCAweDAyMDUwNzA4fSwKLQl7MHgwMDAwYjEwMCwgMHgwMjA1MDcwOX0sCi0JezB4MDAwMGIxMDQsIDB4MDIwNTA3MGF9LAotCXsweDAwMDBiMTA4LCAweDAyMDUwNzBifSwKLQl7MHgwMDAwYjEwYywgMHgwMjA1MDcwY30sCi0JezB4MDAwMGIxMTAsIDB4MDIwNTA3MGR9LAotCXsweDAwMDBiMTE0LCAweDAyMDUwNzEwfSwKLQl7MHgwMDAwYjExOCwgMHgwMjA1MDcxMX0sCi0JezB4MDAwMGIxMWMsIDB4MDIwNTA3MTJ9LAotCXsweDAwMDBiMTIwLCAweDAyMDUwNzEzfSwKLQl7MHgwMDAwYjEyNCwgMHgwMjA1MDcxNH0sCi0JezB4MDAwMGIxMjgsIDB4MDIwNTA3MTV9LAotCXsweDAwMDBiMTJjLCAweDAyMDUwNzMwfSwKLQl7MHgwMDAwYjEzMCwgMHgwMjA1MDczMX0sCi0JezB4MDAwMGIxMzQsIDB4MDIwNTA3MzJ9LAotCXsweDAwMDBiMTM4LCAweDAyMDUwNzMzfSwKLQl7MHgwMDAwYjEzYywgMHgwMjA1MDczNH0sCi0JezB4MDAwMGIxNDAsIDB4MDIwNTA3MzV9LAotCXsweDAwMDBiMTQ0LCAweDAyMDUwNzUwfSwKLQl7MHgwMDAwYjE0OCwgMHgwMjA1MDc1MX0sCi0JezB4MDAwMGIxNGMsIDB4MDIwNTA3NTJ9LAotCXsweDAwMDBiMTUwLCAweDAyMDUwNzUzfSwKLQl7MHgwMDAwYjE1NCwgMHgwMjA1MDc1NH0sCi0JezB4MDAwMGIxNTgsIDB4MDIwNTA3NTV9LAotCXsweDAwMDBiMTVjLCAweDAyMDUwNzcwfSwKLQl7MHgwMDAwYjE2MCwgMHgwMjA1MDc3MX0sCi0JezB4MDAwMGIxNjQsIDB4MDIwNTA3NzJ9LAotCXsweDAwMDBiMTY4LCAweDAyMDUwNzczfSwKLQl7MHgwMDAwYjE2YywgMHgwMjA1MDc3NH0sCi0JezB4MDAwMGIxNzAsIDB4MDIwNTA3NzV9LAotCXsweDAwMDBiMTc0LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjE3OCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxN2MsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMTgwLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjE4NCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxODgsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMThjLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjE5MCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxOTQsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMTk4LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjE5YywgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxYTAsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWE0LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFhOCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxYWMsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWIwLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFiNCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxYjgsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWJjLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFjMCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxYzQsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWM4LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFjYywgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxZDAsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWQ0LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFkOCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxZGMsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWUwLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFlNCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxZTgsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWVjLCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFmMCwgMHgwMDAwMDc3Nn0sCi0JezB4MDAwMGIxZjQsIDB4MDAwMDA3NzZ9LAotCXsweDAwMDBiMWY4LCAweDAwMDAwNzc2fSwKLQl7MHgwMDAwYjFmYywgMHgwMDAwMDc3Nn0sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfbWFjX3Bvc3RhbWJsZVtdWzVdID0gewotCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KLQl7MHgwMDAwMTAzMCwgMHgwMDAwMDIzMCwgMHgwMDAwMDQ2MCwgMHgwMDAwMDJjMCwgMHgwMDAwMDE2MH0sCi0JezB4MDAwMDEwNzAsIDB4MDAwMDAxNjgsIDB4MDAwMDAyZDAsIDB4MDAwMDAzMTgsIDB4MDAwMDAxOGN9LAotCXsweDAwMDAxMGIwLCAweDAwMDAwZTYwLCAweDAwMDAxY2MwLCAweDAwMDA3YzcwLCAweDAwMDAzZTM4fSwKLQl7MHgwMDAwODAxNCwgMHgwM2U4MDNlOCwgMHgwN2QwMDdkMCwgMHgxMDgwMTYwMCwgMHgwODQwMGIwMH0sCi0JezB4MDAwMDgwMWMsIDB4MTI4ZDgwMjcsIDB4MTI4ZDgwNGYsIDB4MTJlMDAwNTcsIDB4MTJlMDAwMmJ9LAotCXsweDAwMDA4MTIwLCAweDA4ZjA0ODAwLCAweDA4ZjA0ODAwLCAweDA4ZjA0ODEwLCAweDA4ZjA0ODEwfSwKLQl7MHgwMDAwODFkMCwgMHgwMDAwMzIxMCwgMHgwMDAwMzIxMCwgMHgwMDAwMzIwYSwgMHgwMDAwMzIwYX0sCi0JezB4MDAwMDgzMTgsIDB4MDAwMDNlODAsIDB4MDAwMDdkMDAsIDB4MDAwMDY4ODAsIDB4MDAwMDM0NDB9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAwX3NvY19wb3N0YW1ibGVbXVs1XSA9IHsKLQkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCi0JezB4MDAwMDcwMTAsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjN9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkyMDBfbWVybGluXzJwMF9yYWRpb19jb3JlW11bMl0gPSB7Ci0JLyogQWRkciAgICAgIGFsbG1vZGVzICAqLwotCXsweDAwMDA3ODAwLCAweDAwMDQwMDAwfSwKLQl7MHgwMDAwNzgwNCwgMHhkYjAwNTAxMn0sCi0JezB4MDAwMDc4MDgsIDB4MDQ5MjQ5MTR9LAotCXsweDAwMDA3ODBjLCAweDIxMDg0MjEwfSwKLQl7MHgwMDAwNzgxMCwgMHg2ZDgwMTMwMH0sCi0JezB4MDAwMDc4MTQsIDB4MDAxOWJlZmZ9LAotCXsweDAwMDA3ODE4LCAweDA3ZTQxMDAwfSwKLQl7MHgwMDAwNzgxYywgMHgwMDM5MjAwMH0sCi0JezB4MDAwMDc4MjAsIDB4OTI1OTI0ODB9LAotCXsweDAwMDA3ODI0LCAweDAwMDQwMDAwfSwKLQl7MHgwMDAwNzgyOCwgMHhkYjAwNTAxMn0sCi0JezB4MDAwMDc4MmMsIDB4MDQ5MjQ5MTR9LAotCXsweDAwMDA3ODMwLCAweDIxMDg0MjEwfSwKLQl7MHgwMDAwNzgzNCwgMHg2ZDgwMTMwMH0sCi0JezB4MDAwMDc4MzgsIDB4MDAxOWJlZmZ9LAotCXsweDAwMDA3ODNjLCAweDA3ZTQwMDAwfSwKLQl7MHgwMDAwNzg0MCwgMHgwMDM5MjAwMH0sCi0JezB4MDAwMDc4NDQsIDB4OTI1OTI0ODB9LAotCXsweDAwMDA3ODQ4LCAweDAwMTAwMDAwfSwKLQl7MHgwMDAwNzg0YywgMHg3NzNmMDU2N30sCi0JezB4MDAwMDc4NTAsIDB4NTQyMTQ1MTR9LAotCXsweDAwMDA3ODU0LCAweDEyMDM1ODI4fSwKLQl7MHgwMDAwNzg1OCwgMHg5MjU5MjY5Mn0sCi0JezB4MDAwMDc4NWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA3ODYwLCAweDU2NDAwMDAwfSwKLQl7MHgwMDAwNzg2NCwgMHgwYThlMzcwZX0sCi0JezB4MDAwMDc4NjgsIDB4YzAxMDI4NTB9LAotCXsweDAwMDA3ODZjLCAweDgxMmQ0MDAwfSwKLQl7MHgwMDAwNzg3MCwgMHg4MDdlYzQwMH0sCi0JezB4MDAwMDc4NzQsIDB4MDAxYjZkYjB9LAotCXsweDAwMDA3ODc4LCAweDAwMzc2YjYzfSwKLQl7MHgwMDAwNzg3YywgMHgwNmRiNmRiNn0sCi0JezB4MDAwMDc4ODAsIDB4MDA2ZDgwMDB9LAotCXsweDAwMDA3ODg0LCAweGZmZWZmZmZlfSwKLQl7MHgwMDAwNzg4OCwgMHhmZmVmZmZmZX0sCi0JezB4MDAwMDc4OGMsIDB4MDAwMTAwMDB9LAotCXsweDAwMDA3ODkwLCAweDAyMDYwYWVifSwKLQl7MHgwMDAwNzg5NCwgMHg1YTEwODAwMH0sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwMF8ycDBfYmFzZWJhbmRfcG9zdGFtYmxlW11bNV0gPSB7Ci0JLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLwotCXsweDAwMDA5ODEwLCAweGQwMGE4MDA1LCAweGQwMGE4MDA1LCAweGQwMGE4MDExLCAweGQwMGE4MDExfSwKLQl7MHgwMDAwOTgyMCwgMHgyMDZhMDIyZSwgMHgyMDZhMDIyZSwgMHgyMDZhMDEyZSwgMHgyMDZhMDEyZX0sCi0JezB4MDAwMDk4MjQsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAotCXsweDAwMDA5ODI4LCAweDA2OTAzMDgxLCAweDA2OTAzMDgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKLQl7MHgwMDAwOTgyYywgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNH0sCi0JezB4MDAwMDk4MzAsIDB4MDAwMDA1OWMsIDB4MDAwMDA1OWMsIDB4MDAwMDExOWMsIDB4MDAwMDExOWN9LAotCXsweDAwMDA5YzAwLCAweDAwMDAwMDQ0LCAweDAwMDAwMGM0LCAweDAwMDAwMGM0LCAweDAwMDAwMDQ0fSwKLQl7MHgwMDAwOWUwMCwgMHgwMzcyMTYxZSwgMHgwMzcyMTYxZSwgMHgwMzcyMTZhMCwgMHgwMzcyMTZhMH0sCi0JezB4MDAwMDllMDQsIDB4MDA4MDIwMjAsIDB4MDA4MDIwMjAsIDB4MDA4MDIwMjAsIDB4MDA4MDIwMjB9LAotCXsweDAwMDA5ZTBjLCAweDZjNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZjNDAwMGUyfSwKLQl7MHgwMDAwOWUxMCwgMHg3ZWM4OGQyZSwgMHg3ZWM4OGQyZSwgMHg3ZWM4NGQyZSwgMHg3ZWM4NGQyZX0sCi0JezB4MDAwMDllMTQsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWV9LAotCXsweDAwMDA5ZTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwOWUxYywgMHgwMDAxY2Y5YywgMHgwMDAxY2Y5YywgMHgwMDAyMWY5YywgMHgwMDAyMWY5Y30sCi0JezB4MDAwMDllMjAsIDB4MDAwMDAzYjUsIDB4MDAwMDAzYjUsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2V9LAotCXsweDAwMDA5ZTJjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDIxLCAweDAwMDAwMDIxfSwKLQl7MHgwMDAwOWU0NCwgMHgwMjMyMWUyNywgMHgwMjMyMWUyNywgMHgwMjI5MWUyNywgMHgwMjI5MWUyN30sCi0JezB4MDAwMDllNDgsIDB4NTAzMDIwMWEsIDB4NTAzMDIwMWEsIDB4NTAzMDIwMTIsIDB4NTAzMDIwMTJ9LAotCXsweDAwMDA5ZmM4LCAweDAwMDNmMDAwLCAweDAwMDNmMDAwLCAweDAwMDFhMDAwLCAweDAwMDFhMDAwfSwKLQl7MHgwMDAwYTIwNCwgMHgwMDAwMzdjMCwgMHgwMDAwMzdjNCwgMHgwMDAwMzdjNCwgMHgwMDAwMzdjMH0sCi0JezB4MDAwMGEyMDgsIDB4MDAwMDAxMDQsIDB4MDAwMDAxMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDR9LAotCXsweDAwMDBhMjMwLCAweDAwMDAwMDBhLCAweDAwMDAwMDE0LCAweDAwMDAwMDE2LCAweDAwMDAwMDBifSwKLQl7MHgwMDAwYTIzOCwgMHhmZmI4MTAxOCwgMHhmZmI4MTAxOCwgMHhmZmI4MTAxOCwgMHhmZmI4MTAxOH0sCi0JezB4MDAwMGEyNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDh9LAotCXsweDAwMDBhMjU0LCAweDAwMDAwN2QwLCAweDAwMDAwZmEwLCAweDAwMDAxMTMwLCAweDAwMDAwODk4fSwKLQl7MHgwMDAwYTI1OCwgMHgwMjAyMDAwMiwgMHgwMjAyMDAwMiwgMHgwMjAyMDAwMiwgMHgwMjAyMDAwMn0sCi0JezB4MDAwMGEyNWMsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGV9LAotCXsweDAwMDBhMjYwLCAweDBhMDIxNTAxLCAweDBhMDIxNTAxLCAweDNhMDIxNTAxLCAweDNhMDIxNTAxfSwKLQl7MHgwMDAwYTI2NCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZX0sCi0JezB4MDAwMGEyODAsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGJ9LAotCXsweDAwMDBhMjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMTUwLCAweDAwMDAwMTUwfSwKLQl7MHgwMDAwYTI4OCwgMHgwMDAwMDExMCwgMHgwMDAwMDExMCwgMHgwMDAwMDExMCwgMHgwMDAwMDExMH0sCi0JezB4MDAwMGEyOGMsIDB4MDAwMjIyMjIsIDB4MDAwMjIyMjIsIDB4MDAwMjIyMjIsIDB4MDAwMjIyMjJ9LAotCXsweDAwMDBhMmM0LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4fSwKLQl7MHgwMDAwYTJkMCwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4Mn0sCi0JezB4MDAwMGEyZDgsIDB4Zjk5OWE4M2EsIDB4Zjk5OWE4M2EsIDB4Zjk5OWE4M2EsIDB4Zjk5OWE4M2F9LAotCXsweDAwMDBhMzU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTgzMCwgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5Y30sCi0JezB4MDAwMGFlMDQsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDB9LAotCXsweDAwMDBhZTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYWUxYywgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5Y30sCi0JezB4MDAwMGFlMjAsIDB4MDAwMDAxYjUsIDB4MDAwMDAxYjUsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2V9LAotCXsweDAwMDBiMjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMTUwLCAweDAwMDAwMTUwfSwKLQl7MHgwMDAwYjgzMCwgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5Y30sCi0JezB4MDAwMGJlMDQsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDB9LAotCXsweDAwMDBiZTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYmUxYywgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5YywgMHgwMDAwMDE5Y30sCi0JezB4MDAwMGJlMjAsIDB4MDAwMDAxYjUsIDB4MDAwMDAxYjUsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2V9LAotCXsweDAwMDBjMjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMTUwLCAweDAwMDAwMTUwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYXI5MzAwXzJwMF9iYXNlYmFuZF9jb3JlW11bMl0gPSB7Ci0JLyogQWRkciAgICAgIGFsbG1vZGVzICAqLwotCXsweDAwMDA5ODAwLCAweGFmZTY4ZTMwfSwKLQl7MHgwMDAwOTgwNCwgMHhmZDE0ZTAwMH0sCi0JezB4MDAwMDk4MDgsIDB4OWMwYTlmNmJ9LAotCXsweDAwMDA5ODBjLCAweDA0OTAwMDAwfSwKLQl7MHgwMDAwOTgxNCwgMHg5MjgwYzAwYX0sCi0JezB4MDAwMDk4MTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA5ODFjLCAweDAwMDIwMDI4fSwKLQl7MHgwMDAwOTgzNCwgMHg1ZjNjYTNkZX0sCi0JezB4MDAwMDk4MzgsIDB4MDEwOGVjZmZ9LAotCXsweDAwMDA5ODNjLCAweDE0NzUwNjAwfSwKLQl7MHgwMDAwOTg4MCwgMHgyMDFmZmYwMH0sCi0JezB4MDAwMDk4ODQsIDB4MDAwMDEwNDJ9LAotCXsweDAwMDA5OGE0LCAweDAwMjAwNDAwfSwKLQl7MHgwMDAwOThiMCwgMHg1MjQ0MGJiZX0sCi0JezB4MDAwMDk4ZDAsIDB4MDA0YjZhOGV9LAotCXsweDAwMDA5OGQ0LCAweDAwMDAwODIwfSwKLQl7MHgwMDAwOThkYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDk4ZjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA5OGY0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwOWMwNCwgMHhmZjU1ZmY1NX0sCi0JezB4MDAwMDljMDgsIDB4MDMyMGZmNTV9LAotCXsweDAwMDA5YzBjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwOWMxMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDljMTQsIDB4MDAwNDYzODR9LAotCXsweDAwMDA5YzE4LCAweDA1YjZiNDQwfSwKLQl7MHgwMDAwOWMxYywgMHgwMGI2YjQ0MH0sCi0JezB4MDAwMDlkMDAsIDB4YzA4MGEzMzN9LAotCXsweDAwMDA5ZDA0LCAweDQwMjA2YzEwfSwKLQl7MHgwMDAwOWQwOCwgMHgwMDljNDA2MH0sCi0JezB4MDAwMDlkMGMsIDB4OTg4MzgwMGF9LAotCXsweDAwMDA5ZDEwLCAweDAxODM0MDYxfSwKLQl7MHgwMDAwOWQxNCwgMHgwMGMwMDQwYn0sCi0JezB4MDAwMDlkMTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA5ZTA4LCAweDAwMzgyMzBjfSwKLQl7MHgwMDAwOWUyNCwgMHg5OTBiYjUxNX0sCi0JezB4MDAwMDllMjgsIDB4MGM2ZjAwMDB9LAotCXsweDAwMDA5ZTMwLCAweDA2MzM2Zjc3fSwKLQl7MHgwMDAwOWUzNCwgMHg2YWY2NTMyZn0sCi0JezB4MDAwMDllMzgsIDB4MGNjODBjMDB9LAotCXsweDAwMDA5ZTNjLCAweGNmOTQ2MjIyfSwKLQl7MHgwMDAwOWU0MCwgMHgwZDI2MTgyMH0sCi0JezB4MDAwMDllNGMsIDB4MDAwMDEwMDR9LAotCXsweDAwMDA5ZTUwLCAweDAwZmYwM2YxfSwKLQl7MHgwMDAwOWU1NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDlmYzAsIDB4ODAzZTQ3ODh9LAotCXsweDAwMDA5ZmM0LCAweDAwMDFlZmI1fSwKLQl7MHgwMDAwOWZjYywgMHg0MDAwMDAxNH0sCi0JezB4MDAwMDlmZDAsIDB4MDExOTNiOTN9LAotCXsweDAwMDBhMjBjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTIyMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEyMjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMjI4LCAweDEwMDAyMzEwfSwKLQl7MHgwMDAwYTIyYywgMHgwMTAzNmExZX0sCi0JezB4MDAwMGEyMzQsIDB4MTAwMDBmZmZ9LAotCXsweDAwMDBhMjNjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTI0NCwgMHgwYzAwMDAwMH0sCi0JezB4MDAwMGEyYTAsIDB4MDAwMDAwMDF9LAotCXsweDAwMDBhMmMwLCAweDAwMDAwMDAxfSwKLQl7MHgwMDAwYTJjOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEyY2MsIDB4MThjNDM0MzN9LAotCXsweDAwMDBhMmQ0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTJkYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEyZTAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMmU0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTJlOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEyZWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMmYwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTJmNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEyZjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMzQ0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTM0YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEzNTAsIDB4MDAwMGEwMDB9LAotCXsweDAwMDBhMzY0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTM3MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEzOTAsIDB4MDAwMDAwMDF9LAotCXsweDAwMDBhMzk0LCAweDAwMDAwNDQ0fSwKLQl7MHgwMDAwYTM5OCwgMHgwMDFmMGUwZn0sCi0JezB4MDAwMGEzOWMsIDB4MDA3NTM5M2Z9LAotCXsweDAwMDBhM2EwLCAweGI3OWY2NDI3fSwKLQl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEzYTgsIDB4YWFhYWFhYWF9LAotCXsweDAwMDBhM2FjLCAweDNjNDY2NDc4fSwKLQl7MHgwMDAwYTNjMCwgMHgyMDIwMjAyMH0sCi0JezB4MDAwMGEzYzQsIDB4MjIyMjIyMjB9LAotCXsweDAwMDBhM2M4LCAweDIwMjAwMDIwfSwKLQl7MHgwMDAwYTNjYywgMHgyMDIwMjAyMH0sCi0JezB4MDAwMGEzZDAsIDB4MjAyMDIwMjB9LAotCXsweDAwMDBhM2Q0LCAweDIwMjAyMDIwfSwKLQl7MHgwMDAwYTNkOCwgMHgyMDIwMjAyMH0sCi0JezB4MDAwMGEzZGMsIDB4MjAyMDIwMjB9LAotCXsweDAwMDBhM2UwLCAweDIwMjAyMDIwfSwKLQl7MHgwMDAwYTNlNCwgMHgyMDIwMjAyMH0sCi0JezB4MDAwMGEzZTgsIDB4MjAyMDIwMjB9LAotCXsweDAwMDBhM2VjLCAweDIwMjAyMDIwfSwKLQl7MHgwMDAwYTNmMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEzZjQsIDB4MDAwMDAyNDZ9LAotCXsweDAwMDBhM2Y4LCAweDBjZGJkMzgwfSwKLQl7MHgwMDAwYTNmYywgMHgwMDBmMGYwMX0sCi0JezB4MDAwMGE0MDAsIDB4OGZhOTFmMDF9LAotCXsweDAwMDBhNDA0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTQwOCwgMHgwZTc5ZTVjNn0sCi0JezB4MDAwMGE0MGMsIDB4MDA4MjA4MjB9LAotCXsweDAwMDBhNDE0LCAweDFjZTczOWNlfSwKLQl7MHgwMDAwYTQxOCwgMHgyZDAwMWRjZX0sCi0JezB4MDAwMGE0MWMsIDB4MWNlNzM5Y2V9LAotCXsweDAwMDBhNDIwLCAweDAwMDAwMWNlfSwKLQl7MHgwMDAwYTQyNCwgMHgxY2U3MzljZX0sCi0JezB4MDAwMGE0MjgsIDB4MDAwMDAxY2V9LAotCXsweDAwMDBhNDJjLCAweDFjZTczOWNlfSwKLQl7MHgwMDAwYTQzMCwgMHgxY2U3MzljZX0sCi0JezB4MDAwMGE0MzQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNDM4LCAweDAwMDAxODAxfSwKLQl7MHgwMDAwYTQzYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE0NDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNDQ0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTQ0OCwgMHgwNDAwMDA4MH0sCi0JezB4MDAwMGE0NGMsIDB4MDAwMDAwMDF9LAotCXsweDAwMDBhNDUwLCAweDAwMDEwMDAwfSwKLQl7MHgwMDAwYTQ1OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE2MDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNjA0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTYwOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE2MGMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNjEwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTYxNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE2MTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNjFjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTYyMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE2MjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNjI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTYyYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE2MzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNjM0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTYzOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE2M2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNjQwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTY0NCwgMHgzZmFkOWQ3NH0sCi0JezB4MDAwMGE2NDgsIDB4MDA0ODA2MGF9LAotCXsweDAwMDBhNjRjLCAweDAwMDAwNjM3fSwKLQl7MHgwMDAwYTY3MCwgMHgwMzAyMDEwMH0sCi0JezB4MDAwMGE2NzQsIDB4MDkwODA1MDR9LAotCXsweDAwMDBhNjc4LCAweDBkMGMwYjBhfSwKLQl7MHgwMDAwYTY3YywgMHgxMzEyMTExMH0sCi0JezB4MDAwMGE2ODAsIDB4MzEzMDE1MTR9LAotCXsweDAwMDBhNjg0LCAweDM1MzQzMzMyfSwKLQl7MHgwMDAwYTY4OCwgMHgwMDAwMDAzNn0sCi0JezB4MDAwMGE2OTAsIDB4MDAwMDA4Mzh9LAotCXsweDAwMDBhN2MwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTdjNCwgMHhmZmZmZmZmY30sCi0JezB4MDAwMGE3YzgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhN2NjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTdkMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE3ZDQsIDB4MDAwMDAwMDR9LAotCXsweDAwMDBhN2RjLCAweDAwMDAwMDAxfSwKLQl7MHgwMDAwYThkMCwgMHgwMDRiNmE4ZX0sCi0JezB4MDAwMGE4ZDQsIDB4MDAwMDA4MjB9LAotCXsweDAwMDBhOGRjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYThmMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE4ZjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMmQwLCAweDAwMDAwMDgwfSwKLQl7MHgwMDAwYjJkNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIyZGMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMmUwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjJlNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIyZTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMmVjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjJmMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIyZjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMmY4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjQwOCwgMHgwZTc5ZTVjMH0sCi0JezB4MDAwMGI0MGMsIDB4MDA4MjA4MjB9LAotCXsweDAwMDBiNDIwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjhkMCwgMHgwMDRiNmE4ZX0sCi0JezB4MDAwMGI4ZDQsIDB4MDAwMDA4MjB9LAotCXsweDAwMDBiOGRjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjhmMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGI4ZjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBjMmQwLCAweDAwMDAwMDgwfSwKLQl7MHgwMDAwYzJkNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGMyZGMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBjMmUwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYzJlNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGMyZTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBjMmVjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYzJmMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGMyZjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBjMmY4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYzQwOCwgMHgwZTc5ZTVjMH0sCi0JezB4MDAwMGM0MGMsIDB4MDA4MjA4MjB9LAotCXsweDAwMDBjNDIwLCAweDAwMDAwMDAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYXI5MzAwTW9kZXNfaGlnaF9wb3dlcl90eF9nYWluX3RhYmxlXzJwMFtdWzVdID0gewotCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KLQl7MHgwMDAwYTQxMCwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOX0sCi0JezB4MDAwMGE1MDAsIDB4MDAwMDIyMjAsIDB4MDAwMDIyMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNTA0LCAweDA2MDAyMjIzLCAweDA2MDAyMjIzLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKLQl7MHgwMDAwYTUwOCwgMHgwYTAyMjIyMCwgMHgwYTAyMjIyMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCi0JezB4MDAwMGE1MGMsIDB4MGYwMjIyMjMsIDB4MGYwMjIyMjMsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAotCXsweDAwMDBhNTEwLCAweDE0MDIyNjIwLCAweDE0MDIyNjIwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKLQl7MHgwMDAwYTUxNCwgMHgxODAyMjYyMiwgMHgxODAyMjYyMiwgMHgxMTAwMDQwMCwgMHgxMTAwMDQwMH0sCi0JezB4MDAwMGE1MTgsIDB4MWIwMjI4MjIsIDB4MWIwMjI4MjIsIDB4MTUwMDA0MDIsIDB4MTUwMDA0MDJ9LAotCXsweDAwMDBhNTFjLCAweDIwMDIyODQyLCAweDIwMDIyODQyLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKLQl7MHgwMDAwYTUyMCwgMHgyMjAyMmM0MSwgMHgyMjAyMmM0MSwgMHgxYjAwMDYwMywgMHgxYjAwMDYwM30sCi0JezB4MDAwMGE1MjQsIDB4MjgwMjMwNDIsIDB4MjgwMjMwNDIsIDB4MWYwMDBhMDIsIDB4MWYwMDBhMDJ9LAotCXsweDAwMDBhNTI4LCAweDJjMDIzMDQ0LCAweDJjMDIzMDQ0LCAweDIzMDAwYTA0LCAweDIzMDAwYTA0fSwKLQl7MHgwMDAwYTUyYywgMHgyZjAyMzY0NCwgMHgyZjAyMzY0NCwgMHgyNjAwMGEyMCwgMHgyNjAwMGEyMH0sCi0JezB4MDAwMGE1MzAsIDB4MzQwMjU2NDMsIDB4MzQwMjU2NDMsIDB4MmEwMDBlMjAsIDB4MmEwMDBlMjB9LAotCXsweDAwMDBhNTM0LCAweDM4MDI1YTQ0LCAweDM4MDI1YTQ0LCAweDJlMDAwZTIyLCAweDJlMDAwZTIyfSwKLQl7MHgwMDAwYTUzOCwgMHgzYjAyNWU0NSwgMHgzYjAyNWU0NSwgMHgzMTAwMGUyNCwgMHgzMTAwMGUyNH0sCi0JezB4MDAwMGE1M2MsIDB4NDEwMjVlNGEsIDB4NDEwMjVlNGEsIDB4MzQwMDE2NDAsIDB4MzQwMDE2NDB9LAotCXsweDAwMDBhNTQwLCAweDQ4MDI1ZTZjLCAweDQ4MDI1ZTZjLCAweDM4MDAxNjYwLCAweDM4MDAxNjYwfSwKLQl7MHgwMDAwYTU0NCwgMHg0ZTAyNWU4ZSwgMHg0ZTAyNWU4ZSwgMHgzYjAwMTg2MSwgMHgzYjAwMTg2MX0sCi0JezB4MDAwMGE1NDgsIDB4NTMwMjVlYjIsIDB4NTMwMjVlYjIsIDB4M2UwMDFhODEsIDB4M2UwMDFhODF9LAotCXsweDAwMDBhNTRjLCAweDU5MDI1ZWI1LCAweDU5MDI1ZWI1LCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKLQl7MHgwMDAwYTU1MCwgMHg1ZjAyNWVmNiwgMHg1ZjAyNWVmNiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCi0JezB4MDAwMGE1NTQsIDB4NjIwMjVmNTYsIDB4NjIwMjVmNTYsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAotCXsweDAwMDBhNTU4LCAweDY2MDI3ZjU2LCAweDY2MDI3ZjU2LCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKLQl7MHgwMDAwYTU1YywgMHg2YTAyOWY1NiwgMHg2YTAyOWY1NiwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCi0JezB4MDAwMGE1NjAsIDB4NzAwNDlmNTYsIDB4NzAwNDlmNTYsIDB4NTQwMDFjZWIsIDB4NTQwMDFjZWJ9LAotCXsweDAwMDBhNTY0LCAweDc1MDRmZjU2LCAweDc1MDRmZjU2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKLQl7MHgwMDAwYTU2OCwgMHg3NTA0ZmY1NiwgMHg3NTA0ZmY1NiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCi0JezB4MDAwMGE1NmMsIDB4NzUwNGZmNTYsIDB4NzUwNGZmNTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAotCXsweDAwMDBhNTcwLCAweDc1MDRmZjU2LCAweDc1MDRmZjU2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKLQl7MHgwMDAwYTU3NCwgMHg3NTA0ZmY1NiwgMHg3NTA0ZmY1NiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCi0JezB4MDAwMGE1NzgsIDB4NzUwNGZmNTYsIDB4NzUwNGZmNTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAotCXsweDAwMDBhNTdjLCAweDc1MDRmZjU2LCAweDc1MDRmZjU2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKLQl7MHgwMDAwYTU4MCwgMHgwMDgwMjIyMCwgMHgwMDgwMjIyMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMH0sCi0JezB4MDAwMGE1ODQsIDB4MDY4MDIyMjMsIDB4MDY4MDIyMjMsIDB4MDQ4MDAwMDIsIDB4MDQ4MDAwMDJ9LAotCXsweDAwMDBhNTg4LCAweDBhODIyMjIwLCAweDBhODIyMjIwLCAweDA4ODAwMDA0LCAweDA4ODAwMDA0fSwKLQl7MHgwMDAwYTU4YywgMHgwZjgyMjIyMywgMHgwZjgyMjIyMywgMHgwYjgwMDIwMCwgMHgwYjgwMDIwMH0sCi0JezB4MDAwMGE1OTAsIDB4MTQ4MjI2MjAsIDB4MTQ4MjI2MjAsIDB4MGY4MDAyMDIsIDB4MGY4MDAyMDJ9LAotCXsweDAwMDBhNTk0LCAweDE4ODIyNjIyLCAweDE4ODIyNjIyLCAweDExODAwNDAwLCAweDExODAwNDAwfSwKLQl7MHgwMDAwYTU5OCwgMHgxYjgyMjgyMiwgMHgxYjgyMjgyMiwgMHgxNTgwMDQwMiwgMHgxNTgwMDQwMn0sCi0JezB4MDAwMGE1OWMsIDB4MjA4MjI4NDIsIDB4MjA4MjI4NDIsIDB4MTk4MDA0MDQsIDB4MTk4MDA0MDR9LAotCXsweDAwMDBhNWEwLCAweDIyODIyYzQxLCAweDIyODIyYzQxLCAweDFiODAwNjAzLCAweDFiODAwNjAzfSwKLQl7MHgwMDAwYTVhNCwgMHgyODgyMzA0MiwgMHgyODgyMzA0MiwgMHgxZjgwMGEwMiwgMHgxZjgwMGEwMn0sCi0JezB4MDAwMGE1YTgsIDB4MmM4MjMwNDQsIDB4MmM4MjMwNDQsIDB4MjM4MDBhMDQsIDB4MjM4MDBhMDR9LAotCXsweDAwMDBhNWFjLCAweDJmODIzNjQ0LCAweDJmODIzNjQ0LCAweDI2ODAwYTIwLCAweDI2ODAwYTIwfSwKLQl7MHgwMDAwYTViMCwgMHgzNDgyNTY0MywgMHgzNDgyNTY0MywgMHgyYTgwMGUyMCwgMHgyYTgwMGUyMH0sCi0JezB4MDAwMGE1YjQsIDB4Mzg4MjVhNDQsIDB4Mzg4MjVhNDQsIDB4MmU4MDBlMjIsIDB4MmU4MDBlMjJ9LAotCXsweDAwMDBhNWI4LCAweDNiODI1ZTQ1LCAweDNiODI1ZTQ1LCAweDMxODAwZTI0LCAweDMxODAwZTI0fSwKLQl7MHgwMDAwYTViYywgMHg0MTgyNWU0YSwgMHg0MTgyNWU0YSwgMHgzNDgwMTY0MCwgMHgzNDgwMTY0MH0sCi0JezB4MDAwMGE1YzAsIDB4NDg4MjVlNmMsIDB4NDg4MjVlNmMsIDB4Mzg4MDE2NjAsIDB4Mzg4MDE2NjB9LAotCXsweDAwMDBhNWM0LCAweDRlODI1ZThlLCAweDRlODI1ZThlLCAweDNiODAxODYxLCAweDNiODAxODYxfSwKLQl7MHgwMDAwYTVjOCwgMHg1MzgyNWViMiwgMHg1MzgyNWViMiwgMHgzZTgwMWE4MSwgMHgzZTgwMWE4MX0sCi0JezB4MDAwMGE1Y2MsIDB4NTk4MjVlYjUsIDB4NTk4MjVlYjUsIDB4NDI4MDFhODMsIDB4NDI4MDFhODN9LAotCXsweDAwMDBhNWQwLCAweDVmODI1ZWY2LCAweDVmODI1ZWY2LCAweDQ0ODAxYzg0LCAweDQ0ODAxYzg0fSwKLQl7MHgwMDAwYTVkNCwgMHg2MjgyNWY1NiwgMHg2MjgyNWY1NiwgMHg0ODgwMWNlMywgMHg0ODgwMWNlM30sCi0JezB4MDAwMGE1ZDgsIDB4NjY4MjdmNTYsIDB4NjY4MjdmNTYsIDB4NGM4MDFjZTUsIDB4NGM4MDFjZTV9LAotCXsweDAwMDBhNWRjLCAweDZhODI5ZjU2LCAweDZhODI5ZjU2LCAweDUwODAxY2U5LCAweDUwODAxY2U5fSwKLQl7MHgwMDAwYTVlMCwgMHg3MDg0OWY1NiwgMHg3MDg0OWY1NiwgMHg1NDgwMWNlYiwgMHg1NDgwMWNlYn0sCi0JezB4MDAwMGE1ZTQsIDB4NzU4NGZmNTYsIDB4NzU4NGZmNTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAotCXsweDAwMDBhNWU4LCAweDc1ODRmZjU2LCAweDc1ODRmZjU2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKLQl7MHgwMDAwYTVlYywgMHg3NTg0ZmY1NiwgMHg3NTg0ZmY1NiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCi0JezB4MDAwMGE1ZjAsIDB4NzU4NGZmNTYsIDB4NzU4NGZmNTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAotCXsweDAwMDBhNWY0LCAweDc1ODRmZjU2LCAweDc1ODRmZjU2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKLQl7MHgwMDAwYTVmOCwgMHg3NTg0ZmY1NiwgMHg3NTg0ZmY1NiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCi0JezB4MDAwMGE1ZmMsIDB4NzU4NGZmNTYsIDB4NzU4NGZmNTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAotCXsweDAwMDE2MDQ0LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2fSwKLQl7MHgwMDAxNjA0OCwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMX0sCi0JezB4MDAwMTYwNjgsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmN9LAotCXsweDAwMDE2NDQ0LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2fSwKLQl7MHgwMDAxNjQ0OCwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMX0sCi0JezB4MDAwMTY0NjgsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmN9LAotCXsweDAwMDE2ODQ0LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2LCAweDA1NmRiMmU2fSwKLQl7MHgwMDAxNjg0OCwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMSwgMHhhZTQ4MDAwMX0sCi0JezB4MDAwMTY4NjgsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmMsIDB4NmViNmRiNmN9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBNb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fdGFibGVfMnAwW11bNV0gPSB7Ci0JLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLwotCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5LCAweDAwMDA1MGQ5fSwKLQl7MHgwMDAwYTUwMCwgMHgwMDAwMjIyMCwgMHgwMDAwMjIyMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE1MDQsIDB4MDYwMDIyMjMsIDB4MDYwMDIyMjMsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAotCXsweDAwMDBhNTA4LCAweDBhMDIyMjIwLCAweDBhMDIyMjIwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKLQl7MHgwMDAwYTUwYywgMHgwZjAyMjIyMywgMHgwZjAyMjIyMywgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCi0JezB4MDAwMGE1MTAsIDB4MTQwMjI2MjAsIDB4MTQwMjI2MjAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAotCXsweDAwMDBhNTE0LCAweDE4MDIyNjIyLCAweDE4MDIyNjIyLCAweDExMDAwNDAwLCAweDExMDAwNDAwfSwKLQl7MHgwMDAwYTUxOCwgMHgxYjAyMjgyMiwgMHgxYjAyMjgyMiwgMHgxNTAwMDQwMiwgMHgxNTAwMDQwMn0sCi0JezB4MDAwMGE1MWMsIDB4MjAwMjI4NDIsIDB4MjAwMjI4NDIsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAotCXsweDAwMDBhNTIwLCAweDIyMDIyYzQxLCAweDIyMDIyYzQxLCAweDFiMDAwNjAzLCAweDFiMDAwNjAzfSwKLQl7MHgwMDAwYTUyNCwgMHgyODAyMzA0MiwgMHgyODAyMzA0MiwgMHgxZjAwMGEwMiwgMHgxZjAwMGEwMn0sCi0JezB4MDAwMGE1MjgsIDB4MmMwMjMwNDQsIDB4MmMwMjMwNDQsIDB4MjMwMDBhMDQsIDB4MjMwMDBhMDR9LAotCXsweDAwMDBhNTJjLCAweDJmMDIzNjQ0LCAweDJmMDIzNjQ0LCAweDI2MDAwYTIwLCAweDI2MDAwYTIwfSwKLQl7MHgwMDAwYTUzMCwgMHgzNDAyNTY0MywgMHgzNDAyNTY0MywgMHgyYTAwMGUyMCwgMHgyYTAwMGUyMH0sCi0JezB4MDAwMGE1MzQsIDB4MzgwMjVhNDQsIDB4MzgwMjVhNDQsIDB4MmUwMDBlMjIsIDB4MmUwMDBlMjJ9LAotCXsweDAwMDBhNTM4LCAweDNiMDI1ZTQ1LCAweDNiMDI1ZTQ1LCAweDMxMDAwZTI0LCAweDMxMDAwZTI0fSwKLQl7MHgwMDAwYTUzYywgMHg0MTAyNWU0YSwgMHg0MTAyNWU0YSwgMHgzNDAwMTY0MCwgMHgzNDAwMTY0MH0sCi0JezB4MDAwMGE1NDAsIDB4NDgwMjVlNmMsIDB4NDgwMjVlNmMsIDB4MzgwMDE2NjAsIDB4MzgwMDE2NjB9LAotCXsweDAwMDBhNTQ0LCAweDRlMDI1ZThlLCAweDRlMDI1ZThlLCAweDNiMDAxODYxLCAweDNiMDAxODYxfSwKLQl7MHgwMDAwYTU0OCwgMHg1MzAyNWViMiwgMHg1MzAyNWViMiwgMHgzZTAwMWE4MSwgMHgzZTAwMWE4MX0sCi0JezB4MDAwMGE1NGMsIDB4NTkwMjVlYjUsIDB4NTkwMjVlYjUsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAotCXsweDAwMDBhNTUwLCAweDVmMDI1ZWY2LCAweDVmMDI1ZWY2LCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKLQl7MHgwMDAwYTU1NCwgMHg2MjAyNWY1NiwgMHg2MjAyNWY1NiwgMHg0ODAwMWNlMywgMHg0ODAwMWNlM30sCi0JezB4MDAwMGE1NTgsIDB4NjYwMjdmNTYsIDB4NjYwMjdmNTYsIDB4NGMwMDFjZTUsIDB4NGMwMDFjZTV9LAotCXsweDAwMDBhNTVjLCAweDZhMDI5ZjU2LCAweDZhMDI5ZjU2LCAweDUwMDAxY2U5LCAweDUwMDAxY2U5fSwKLQl7MHgwMDAwYTU2MCwgMHg3MDA0OWY1NiwgMHg3MDA0OWY1NiwgMHg1NDAwMWNlYiwgMHg1NDAwMWNlYn0sCi0JezB4MDAwMGE1NjQsIDB4NzUwNGZmNTYsIDB4NzUwNGZmNTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAotCXsweDAwMDBhNTY4LCAweDc1MDRmZjU2LCAweDc1MDRmZjU2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKLQl7MHgwMDAwYTU2YywgMHg3NTA0ZmY1NiwgMHg3NTA0ZmY1NiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCi0JezB4MDAwMGE1NzAsIDB4NzUwNGZmNTYsIDB4NzUwNGZmNTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAotCXsweDAwMDBhNTc0LCAweDc1MDRmZjU2LCAweDc1MDRmZjU2LCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKLQl7MHgwMDAwYTU3OCwgMHg3NTA0ZmY1NiwgMHg3NTA0ZmY1NiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCi0JezB4MDAwMGE1N2MsIDB4NzUwNGZmNTYsIDB4NzUwNGZmNTYsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAotCXsweDAwMDBhNTgwLCAweDAwODAyMjIwLCAweDAwODAyMjIwLCAweDAwODAwMDAwLCAweDAwODAwMDAwfSwKLQl7MHgwMDAwYTU4NCwgMHgwNjgwMjIyMywgMHgwNjgwMjIyMywgMHgwNDgwMDAwMiwgMHgwNDgwMDAwMn0sCi0JezB4MDAwMGE1ODgsIDB4MGE4MjIyMjAsIDB4MGE4MjIyMjAsIDB4MDg4MDAwMDQsIDB4MDg4MDAwMDR9LAotCXsweDAwMDBhNThjLCAweDBmODIyMjIzLCAweDBmODIyMjIzLCAweDBiODAwMjAwLCAweDBiODAwMjAwfSwKLQl7MHgwMDAwYTU5MCwgMHgxNDgyMjYyMCwgMHgxNDgyMjYyMCwgMHgwZjgwMDIwMiwgMHgwZjgwMDIwMn0sCi0JezB4MDAwMGE1OTQsIDB4MTg4MjI2MjIsIDB4MTg4MjI2MjIsIDB4MTE4MDA0MDAsIDB4MTE4MDA0MDB9LAotCXsweDAwMDBhNTk4LCAweDFiODIyODIyLCAweDFiODIyODIyLCAweDE1ODAwNDAyLCAweDE1ODAwNDAyfSwKLQl7MHgwMDAwYTU5YywgMHgyMDgyMjg0MiwgMHgyMDgyMjg0MiwgMHgxOTgwMDQwNCwgMHgxOTgwMDQwNH0sCi0JezB4MDAwMGE1YTAsIDB4MjI4MjJjNDEsIDB4MjI4MjJjNDEsIDB4MWI4MDA2MDMsIDB4MWI4MDA2MDN9LAotCXsweDAwMDBhNWE0LCAweDI4ODIzMDQyLCAweDI4ODIzMDQyLCAweDFmODAwYTAyLCAweDFmODAwYTAyfSwKLQl7MHgwMDAwYTVhOCwgMHgyYzgyMzA0NCwgMHgyYzgyMzA0NCwgMHgyMzgwMGEwNCwgMHgyMzgwMGEwNH0sCi0JezB4MDAwMGE1YWMsIDB4MmY4MjM2NDQsIDB4MmY4MjM2NDQsIDB4MjY4MDBhMjAsIDB4MjY4MDBhMjB9LAotCXsweDAwMDBhNWIwLCAweDM0ODI1NjQzLCAweDM0ODI1NjQzLCAweDJhODAwZTIwLCAweDJhODAwZTIwfSwKLQl7MHgwMDAwYTViNCwgMHgzODgyNWE0NCwgMHgzODgyNWE0NCwgMHgyZTgwMGUyMiwgMHgyZTgwMGUyMn0sCi0JezB4MDAwMGE1YjgsIDB4M2I4MjVlNDUsIDB4M2I4MjVlNDUsIDB4MzE4MDBlMjQsIDB4MzE4MDBlMjR9LAotCXsweDAwMDBhNWJjLCAweDQxODI1ZTRhLCAweDQxODI1ZTRhLCAweDM0ODAxNjQwLCAweDM0ODAxNjQwfSwKLQl7MHgwMDAwYTVjMCwgMHg0ODgyNWU2YywgMHg0ODgyNWU2YywgMHgzODgwMTY2MCwgMHgzODgwMTY2MH0sCi0JezB4MDAwMGE1YzQsIDB4NGU4MjVlOGUsIDB4NGU4MjVlOGUsIDB4M2I4MDE4NjEsIDB4M2I4MDE4NjF9LAotCXsweDAwMDBhNWM4LCAweDUzODI1ZWIyLCAweDUzODI1ZWIyLCAweDNlODAxYTgxLCAweDNlODAxYTgxfSwKLQl7MHgwMDAwYTVjYywgMHg1OTgyNWViNSwgMHg1OTgyNWViNSwgMHg0MjgwMWE4MywgMHg0MjgwMWE4M30sCi0JezB4MDAwMGE1ZDAsIDB4NWY4MjVlZjYsIDB4NWY4MjVlZjYsIDB4NDQ4MDFjODQsIDB4NDQ4MDFjODR9LAotCXsweDAwMDBhNWQ0LCAweDYyODI1ZjU2LCAweDYyODI1ZjU2LCAweDQ4ODAxY2UzLCAweDQ4ODAxY2UzfSwKLQl7MHgwMDAwYTVkOCwgMHg2NjgyN2Y1NiwgMHg2NjgyN2Y1NiwgMHg0YzgwMWNlNSwgMHg0YzgwMWNlNX0sCi0JezB4MDAwMGE1ZGMsIDB4NmE4MjlmNTYsIDB4NmE4MjlmNTYsIDB4NTA4MDFjZTksIDB4NTA4MDFjZTl9LAotCXsweDAwMDBhNWUwLCAweDcwODQ5ZjU2LCAweDcwODQ5ZjU2LCAweDU0ODAxY2ViLCAweDU0ODAxY2VifSwKLQl7MHgwMDAwYTVlNCwgMHg3NTg0ZmY1NiwgMHg3NTg0ZmY1NiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCi0JezB4MDAwMGE1ZTgsIDB4NzU4NGZmNTYsIDB4NzU4NGZmNTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAotCXsweDAwMDBhNWVjLCAweDc1ODRmZjU2LCAweDc1ODRmZjU2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKLQl7MHgwMDAwYTVmMCwgMHg3NTg0ZmY1NiwgMHg3NTg0ZmY1NiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCi0JezB4MDAwMGE1ZjQsIDB4NzU4NGZmNTYsIDB4NzU4NGZmNTYsIDB4NTY4MDFlZWMsIDB4NTY4MDFlZWN9LAotCXsweDAwMDBhNWY4LCAweDc1ODRmZjU2LCAweDc1ODRmZjU2LCAweDU2ODAxZWVjLCAweDU2ODAxZWVjfSwKLQl7MHgwMDAwYTVmYywgMHg3NTg0ZmY1NiwgMHg3NTg0ZmY1NiwgMHg1NjgwMWVlYywgMHg1NjgwMWVlY30sCi0JezB4MDAwMTYwNDQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTR9LAotCXsweDAwMDE2MDQ4LCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxfSwKLQl7MHgwMDAxNjA2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCi0JezB4MDAwMTY0NDQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTR9LAotCXsweDAwMDE2NDQ4LCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxfSwKLQl7MHgwMDAxNjQ2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCi0JezB4MDAwMTY4NDQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTQsIDB4MDU2ZGIyZTR9LAotCXsweDAwMDE2ODQ4LCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxLCAweDhlNDgwMDAxfSwKLQl7MHgwMDAxNjg2OCwgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2YywgMHg2ZGI2ZGI2Y30sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwMENvbW1vbl9yeF9nYWluX3RhYmxlXzJwMFtdWzJdID0gewotCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KLQl7MHgwMDAwYTAwMCwgMHgwMDAxMDAwMH0sCi0JezB4MDAwMGEwMDQsIDB4MDAwMzAwMDJ9LAotCXsweDAwMDBhMDA4LCAweDAwMDUwMDA0fSwKLQl7MHgwMDAwYTAwYywgMHgwMDgxMDA4MH0sCi0JezB4MDAwMGEwMTAsIDB4MDA4MzAwODJ9LAotCXsweDAwMDBhMDE0LCAweDAxODEwMTgwfSwKLQl7MHgwMDAwYTAxOCwgMHgwMTgzMDE4Mn0sCi0JezB4MDAwMGEwMWMsIDB4MDE4NTAxODR9LAotCXsweDAwMDBhMDIwLCAweDAxODkwMTg4fSwKLQl7MHgwMDAwYTAyNCwgMHgwMThiMDE4YX0sCi0JezB4MDAwMGEwMjgsIDB4MDE4ZDAxOGN9LAotCXsweDAwMDBhMDJjLCAweDAxOTEwMTkwfSwKLQl7MHgwMDAwYTAzMCwgMHgwMTkzMDE5Mn0sCi0JezB4MDAwMGEwMzQsIDB4MDE5NTAxOTR9LAotCXsweDAwMDBhMDM4LCAweDAzOGEwMTk2fSwKLQl7MHgwMDAwYTAzYywgMHgwMzhjMDM4Yn0sCi0JezB4MDAwMGEwNDAsIDB4MDM5MDAzOGR9LAotCXsweDAwMDBhMDQ0LCAweDAzOTIwMzkxfSwKLQl7MHgwMDAwYTA0OCwgMHgwMzk0MDM5M30sCi0JezB4MDAwMGEwNGMsIDB4MDM5NjAzOTV9LAotCXsweDAwMDBhMDUwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA1NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDVjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA2MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDY4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA2YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDc0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA3OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwN2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDgwLCAweDIyMjIyMjI5fSwKLQl7MHgwMDAwYTA4NCwgMHgxZDFkMWQxZH0sCi0JezB4MDAwMGEwODgsIDB4MWQxZDFkMWR9LAotCXsweDAwMDBhMDhjLCAweDFkMWQxZDFkfSwKLQl7MHgwMDAwYTA5MCwgMHgxNzFkMWQxZH0sCi0JezB4MDAwMGEwOTQsIDB4MTExMTE3MTd9LAotCXsweDAwMDBhMDk4LCAweDAwMDMwMzExfSwKLQl7MHgwMDAwYTA5YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwYTAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMGE0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTBhOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwYWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMGIwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTBiNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwYjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMGJjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTBjMCwgMHgwMDFmMDAwMH0sCi0JezB4MDAwMGEwYzQsIDB4MDEwMDAxMDF9LAotCXsweDAwMDBhMGM4LCAweDAxMWUwMTFmfSwKLQl7MHgwMDAwYTBjYywgMHgwMTFjMDExZH0sCi0JezB4MDAwMGEwZDAsIDB4MDIwMzAyMDR9LAotCXsweDAwMDBhMGQ0LCAweDAyMDEwMjAyfSwKLQl7MHgwMDAwYTBkOCwgMHgwMjFmMDIwMH0sCi0JezB4MDAwMGEwZGMsIDB4MDMwMjAyMWV9LAotCXsweDAwMDBhMGUwLCAweDAzMDAwMzAxfSwKLQl7MHgwMDAwYTBlNCwgMHgwMzFlMDMxZn0sCi0JezB4MDAwMGEwZTgsIDB4MDQwMjAzMWR9LAotCXsweDAwMDBhMGVjLCAweDA0MDAwNDAxfSwKLQl7MHgwMDAwYTBmMCwgMHgwNDFlMDQxZn0sCi0JezB4MDAwMGEwZjQsIDB4MDUwMjA0MWR9LAotCXsweDAwMDBhMGY4LCAweDA1MDAwNTAxfSwKLQl7MHgwMDAwYTBmYywgMHgwNTFlMDUxZn0sCi0JezB4MDAwMGExMDAsIDB4MDYwMTA2MDJ9LAotCXsweDAwMDBhMTA0LCAweDA2MWYwNjAwfSwKLQl7MHgwMDAwYTEwOCwgMHgwNjFkMDYxZX0sCi0JezB4MDAwMGExMGMsIDB4MDcwMjA3MDN9LAotCXsweDAwMDBhMTEwLCAweDA3MDAwNzAxfSwKLQl7MHgwMDAwYTExNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExMTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTFjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTEyMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExMjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTEyYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExMzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTM0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTEzOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExM2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTQwLCAweDAwMWYwMDAwfSwKLQl7MHgwMDAwYTE0NCwgMHgwMTAwMDEwMX0sCi0JezB4MDAwMGExNDgsIDB4MDExZTAxMWZ9LAotCXsweDAwMDBhMTRjLCAweDAxMWMwMTFkfSwKLQl7MHgwMDAwYTE1MCwgMHgwMjAzMDIwNH0sCi0JezB4MDAwMGExNTQsIDB4MDIwMTAyMDJ9LAotCXsweDAwMDBhMTU4LCAweDAyMWYwMjAwfSwKLQl7MHgwMDAwYTE1YywgMHgwMzAyMDIxZX0sCi0JezB4MDAwMGExNjAsIDB4MDMwMDAzMDF9LAotCXsweDAwMDBhMTY0LCAweDAzMWUwMzFmfSwKLQl7MHgwMDAwYTE2OCwgMHgwNDAyMDMxZH0sCi0JezB4MDAwMGExNmMsIDB4MDQwMDA0MDF9LAotCXsweDAwMDBhMTcwLCAweDA0MWUwNDFmfSwKLQl7MHgwMDAwYTE3NCwgMHgwNTAyMDQxZH0sCi0JezB4MDAwMGExNzgsIDB4MDUwMDA1MDF9LAotCXsweDAwMDBhMTdjLCAweDA1MWUwNTFmfSwKLQl7MHgwMDAwYTE4MCwgMHgwNjAxMDYwMn0sCi0JezB4MDAwMGExODQsIDB4MDYxZjA2MDB9LAotCXsweDAwMDBhMTg4LCAweDA2MWQwNjFlfSwKLQl7MHgwMDAwYTE4YywgMHgwNzAyMDcwM30sCi0JezB4MDAwMGExOTAsIDB4MDcwMDA3MDF9LAotCXsweDAwMDBhMTk0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTE5OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExOWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWEwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFhNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWFjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFiMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFiYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWM0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFjOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExY2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWQwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFkNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExZDgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWRjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFlMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExZTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWU4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFlYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExZjAsIDB4MDAwMDAzOTZ9LAotCXsweDAwMDBhMWY0LCAweDAwMDAwMzk2fSwKLQl7MHgwMDAwYTFmOCwgMHgwMDAwMDM5Nn0sCi0JezB4MDAwMGExZmMsIDB4MDAwMDAxOTZ9LAotCXsweDAwMDBiMDAwLCAweDAwMDEwMDAwfSwKLQl7MHgwMDAwYjAwNCwgMHgwMDAzMDAwMn0sCi0JezB4MDAwMGIwMDgsIDB4MDAwNTAwMDR9LAotCXsweDAwMDBiMDBjLCAweDAwODEwMDgwfSwKLQl7MHgwMDAwYjAxMCwgMHgwMDgzMDA4Mn0sCi0JezB4MDAwMGIwMTQsIDB4MDE4MTAxODB9LAotCXsweDAwMDBiMDE4LCAweDAxODMwMTgyfSwKLQl7MHgwMDAwYjAxYywgMHgwMTg1MDE4NH0sCi0JezB4MDAwMGIwMjAsIDB4MDI4MTAyODB9LAotCXsweDAwMDBiMDI0LCAweDAyODMwMjgyfSwKLQl7MHgwMDAwYjAyOCwgMHgwMjg1MDI4NH0sCi0JezB4MDAwMGIwMmMsIDB4MDI4OTAyODh9LAotCXsweDAwMDBiMDMwLCAweDAyOGIwMjhhfSwKLQl7MHgwMDAwYjAzNCwgMHgwMzg4MDI4Y30sCi0JezB4MDAwMGIwMzgsIDB4MDM4YTAzODl9LAotCXsweDAwMDBiMDNjLCAweDAzOGMwMzhifSwKLQl7MHgwMDAwYjA0MCwgMHgwMzkwMDM4ZH0sCi0JezB4MDAwMGIwNDQsIDB4MDM5MjAzOTF9LAotCXsweDAwMDBiMDQ4LCAweDAzOTQwMzkzfSwKLQl7MHgwMDAwYjA0YywgMHgwMzk2MDM5NX0sCi0JezB4MDAwMGIwNTAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDU0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA1OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwNWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDYwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA2NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwNjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDZjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA3MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwNzQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDc4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA3YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwODAsIDB4MzIzMjMyMzJ9LAotCXsweDAwMDBiMDg0LCAweDJmMmYzMjMyfSwKLQl7MHgwMDAwYjA4OCwgMHgyMzI4MmEyZH0sCi0JezB4MDAwMGIwOGMsIDB4MWMxZTIxMjN9LAotCXsweDAwMDBiMDkwLCAweDE0MTcxOTE5fSwKLQl7MHgwMDAwYjA5NCwgMHgwZTBlMTIxNH0sCi0JezB4MDAwMGIwOTgsIDB4MDMwNTA3MDd9LAotCXsweDAwMDBiMDljLCAweDAwMDMwMzAzfSwKLQl7MHgwMDAwYjBhMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwYTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMGE4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjBhYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwYjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMGI0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjBiOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwYmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMGMwLCAweDAwM2YwMDIwfSwKLQl7MHgwMDAwYjBjNCwgMHgwMDQwMDA0MX0sCi0JezB4MDAwMGIwYzgsIDB4MDE0MDAwNWZ9LAotCXsweDAwMDBiMGNjLCAweDAxNjAwMTVmfSwKLQl7MHgwMDAwYjBkMCwgMHgwMTdlMDE3Zn0sCi0JezB4MDAwMGIwZDQsIDB4MDI0MTAyNDJ9LAotCXsweDAwMDBiMGQ4LCAweDAyNWYwMjQwfSwKLQl7MHgwMDAwYjBkYywgMHgwMjdmMDI2MH0sCi0JezB4MDAwMGIwZTAsIDB4MDM0MTAyN2V9LAotCXsweDAwMDBiMGU0LCAweDAzNWYwMzQwfSwKLQl7MHgwMDAwYjBlOCwgMHgwMzdmMDM2MH0sCi0JezB4MDAwMGIwZWMsIDB4MDQ0MDA0NDF9LAotCXsweDAwMDBiMGYwLCAweDA0NjAwNDVmfSwKLQl7MHgwMDAwYjBmNCwgMHgwNTQxMDQ3Zn0sCi0JezB4MDAwMGIwZjgsIDB4MDU1ZjA1NDB9LAotCXsweDAwMDBiMGZjLCAweDA1N2YwNTYwfSwKLQl7MHgwMDAwYjEwMCwgMHgwNjQwMDY0MX0sCi0JezB4MDAwMGIxMDQsIDB4MDY2MDA2NWZ9LAotCXsweDAwMDBiMTA4LCAweDA2N2UwNjdmfSwKLQl7MHgwMDAwYjEwYywgMHgwNzQxMDc0Mn0sCi0JezB4MDAwMGIxMTAsIDB4MDc1ZjA3NDB9LAotCXsweDAwMDBiMTE0LCAweDA3N2YwNzYwfSwKLQl7MHgwMDAwYjExOCwgMHgwNzgwMDc4MX0sCi0JezB4MDAwMGIxMWMsIDB4MDdhMDA3OWZ9LAotCXsweDAwMDBiMTIwLCAweDA3YzEwN2JmfSwKLQl7MHgwMDAwYjEyNCwgMHgwMDAwMDdjMH0sCi0JezB4MDAwMGIxMjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMTJjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjEzMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxMzQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMTM4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjEzYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxNDAsIDB4MDAzZjAwMjB9LAotCXsweDAwMDBiMTQ0LCAweDAwNDAwMDQxfSwKLQl7MHgwMDAwYjE0OCwgMHgwMTQwMDA1Zn0sCi0JezB4MDAwMGIxNGMsIDB4MDE2MDAxNWZ9LAotCXsweDAwMDBiMTUwLCAweDAxN2UwMTdmfSwKLQl7MHgwMDAwYjE1NCwgMHgwMjQxMDI0Mn0sCi0JezB4MDAwMGIxNTgsIDB4MDI1ZjAyNDB9LAotCXsweDAwMDBiMTVjLCAweDAyN2YwMjYwfSwKLQl7MHgwMDAwYjE2MCwgMHgwMzQxMDI3ZX0sCi0JezB4MDAwMGIxNjQsIDB4MDM1ZjAzNDB9LAotCXsweDAwMDBiMTY4LCAweDAzN2YwMzYwfSwKLQl7MHgwMDAwYjE2YywgMHgwNDQwMDQ0MX0sCi0JezB4MDAwMGIxNzAsIDB4MDQ2MDA0NWZ9LAotCXsweDAwMDBiMTc0LCAweDA1NDEwNDdmfSwKLQl7MHgwMDAwYjE3OCwgMHgwNTVmMDU0MH0sCi0JezB4MDAwMGIxN2MsIDB4MDU3ZjA1NjB9LAotCXsweDAwMDBiMTgwLCAweDA2NDAwNjQxfSwKLQl7MHgwMDAwYjE4NCwgMHgwNjYwMDY1Zn0sCi0JezB4MDAwMGIxODgsIDB4MDY3ZTA2N2Z9LAotCXsweDAwMDBiMThjLCAweDA3NDEwNzQyfSwKLQl7MHgwMDAwYjE5MCwgMHgwNzVmMDc0MH0sCi0JezB4MDAwMGIxOTQsIDB4MDc3ZjA3NjB9LAotCXsweDAwMDBiMTk4LCAweDA3ODAwNzgxfSwKLQl7MHgwMDAwYjE5YywgMHgwN2EwMDc5Zn0sCi0JezB4MDAwMGIxYTAsIDB4MDdjMTA3YmZ9LAotCXsweDAwMDBiMWE0LCAweDAwMDAwN2MwfSwKLQl7MHgwMDAwYjFhOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxYWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWIwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFiNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxYjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWJjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFjMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxYzQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWM4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFjYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxZDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWQ0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFkOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxZGMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWUwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFlNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxZTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWVjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFmMCwgMHgwMDAwMDM5Nn0sCi0JezB4MDAwMGIxZjQsIDB4MDAwMDAzOTZ9LAotCXsweDAwMDBiMWY4LCAweDAwMDAwMzk2fSwKLQl7MHgwMDAwYjFmYywgMHgwMDAwMDE5Nn0sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwME1vZGVzX2xvd19vYl9kYl90eF9nYWluX3RhYmxlXzJwMFtdWzVdID0gewotCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KLQl7MHgwMDAwYTQxMCwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOSwgMHgwMDAwNTBkOX0sCi0JezB4MDAwMGE1MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhNTA0LCAweDA2MDAwMDAzLCAweDA2MDAwMDAzLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKLQl7MHgwMDAwYTUwOCwgMHgwYTAwMDAyMCwgMHgwYTAwMDAyMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCi0JezB4MDAwMGE1MGMsIDB4MTAwMDAwMjMsIDB4MTAwMDAwMjMsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAotCXsweDAwMDBhNTEwLCAweDE2MDAwMjIwLCAweDE2MDAwMjIwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKLQl7MHgwMDAwYTUxNCwgMHgxYzAwMDIyMywgMHgxYzAwMDIyMywgMHgxMjAwMDQwMCwgMHgxMjAwMDQwMH0sCi0JezB4MDAwMGE1MTgsIDB4MjEwMjAyMjAsIDB4MjEwMjAyMjAsIDB4MTYwMDA0MDIsIDB4MTYwMDA0MDJ9LAotCXsweDAwMDBhNTFjLCAweDI3MDIwMjIzLCAweDI3MDIwMjIzLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKLQl7MHgwMDAwYTUyMCwgMHgyYjAyMjIyMCwgMHgyYjAyMjIyMCwgMHgxYzAwMDYwMywgMHgxYzAwMDYwM30sCi0JezB4MDAwMGE1MjQsIDB4MmYwMjIyMjIsIDB4MmYwMjIyMjIsIDB4MjEwMDBhMDIsIDB4MjEwMDBhMDJ9LAotCXsweDAwMDBhNTI4LCAweDM0MDIyMjI1LCAweDM0MDIyMjI1LCAweDI1MDAwYTA0LCAweDI1MDAwYTA0fSwKLQl7MHgwMDAwYTUyYywgMHgzYTAyMjIyYSwgMHgzYTAyMjIyYSwgMHgyODAwMGEyMCwgMHgyODAwMGEyMH0sCi0JezB4MDAwMGE1MzAsIDB4M2UwMjIyMmMsIDB4M2UwMjIyMmMsIDB4MmMwMDBlMjAsIDB4MmMwMDBlMjB9LAotCXsweDAwMDBhNTM0LCAweDQyMDIyNDJhLCAweDQyMDIyNDJhLCAweDMwMDAwZTIyLCAweDMwMDAwZTIyfSwKLQl7MHgwMDAwYTUzOCwgMHg0NzAyMjQ0YSwgMHg0NzAyMjQ0YSwgMHgzNDAwMGUyNCwgMHgzNDAwMGUyNH0sCi0JezB4MDAwMGE1M2MsIDB4NGIwMjI0NGMsIDB4NGIwMjI0NGMsIDB4MzgwMDE2NDAsIDB4MzgwMDE2NDB9LAotCXsweDAwMDBhNTQwLCAweDRlMDIyNDZjLCAweDRlMDIyNDZjLCAweDNjMDAxNjYwLCAweDNjMDAxNjYwfSwKLQl7MHgwMDAwYTU0NCwgMHg1MzAyMjY2YywgMHg1MzAyMjY2YywgMHgzZjAwMTg2MSwgMHgzZjAwMTg2MX0sCi0JezB4MDAwMGE1NDgsIDB4NTcwMjI4NmMsIDB4NTcwMjI4NmMsIDB4NDMwMDFhODEsIDB4NDMwMDFhODF9LAotCXsweDAwMDBhNTRjLCAweDVjMDQyODZiLCAweDVjMDQyODZiLCAweDQ3MDAxYTgzLCAweDQ3MDAxYTgzfSwKLQl7MHgwMDAwYTU1MCwgMHg2MTA0MmE2YywgMHg2MTA0MmE2YywgMHg0YTAwMWM4NCwgMHg0YTAwMWM4NH0sCi0JezB4MDAwMGE1NTQsIDB4NjYwNjJhNmMsIDB4NjYwNjJhNmMsIDB4NGUwMDFjZTMsIDB4NGUwMDFjZTN9LAotCXsweDAwMDBhNTU4LCAweDZiMDYyZTZjLCAweDZiMDYyZTZjLCAweDUyMDAxY2U1LCAweDUyMDAxY2U1fSwKLQl7MHgwMDAwYTU1YywgMHg3MDA2MzA4YywgMHg3MDA2MzA4YywgMHg1NjAwMWNlOSwgMHg1NjAwMWNlOX0sCi0JezB4MDAwMGE1NjAsIDB4NzMwYTMwOGEsIDB4NzMwYTMwOGEsIDB4NWEwMDFjZWIsIDB4NWEwMDFjZWJ9LAotCXsweDAwMDBhNTY0LCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKLQl7MHgwMDAwYTU2OCwgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCi0JezB4MDAwMGE1NmMsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAotCXsweDAwMDBhNTcwLCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKLQl7MHgwMDAwYTU3NCwgMHg3NzBhMzA4YywgMHg3NzBhMzA4YywgMHg1ZDAwMWVlYywgMHg1ZDAwMWVlY30sCi0JezB4MDAwMGE1NzgsIDB4NzcwYTMwOGMsIDB4NzcwYTMwOGMsIDB4NWQwMDFlZWMsIDB4NWQwMDFlZWN9LAotCXsweDAwMDBhNTdjLCAweDc3MGEzMDhjLCAweDc3MGEzMDhjLCAweDVkMDAxZWVjLCAweDVkMDAxZWVjfSwKLQl7MHgwMDAwYTU4MCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMH0sCi0JezB4MDAwMGE1ODQsIDB4MDY4MDAwMDMsIDB4MDY4MDAwMDMsIDB4MDQ4MDAwMDIsIDB4MDQ4MDAwMDJ9LAotCXsweDAwMDBhNTg4LCAweDBhODAwMDIwLCAweDBhODAwMDIwLCAweDA4ODAwMDA0LCAweDA4ODAwMDA0fSwKLQl7MHgwMDAwYTU4YywgMHgxMDgwMDAyMywgMHgxMDgwMDAyMywgMHgwYjgwMDIwMCwgMHgwYjgwMDIwMH0sCi0JezB4MDAwMGE1OTAsIDB4MTY4MDAyMjAsIDB4MTY4MDAyMjAsIDB4MGY4MDAyMDIsIDB4MGY4MDAyMDJ9LAotCXsweDAwMDBhNTk0LCAweDFjODAwMjIzLCAweDFjODAwMjIzLCAweDEyODAwNDAwLCAweDEyODAwNDAwfSwKLQl7MHgwMDAwYTU5OCwgMHgyMTgyMDIyMCwgMHgyMTgyMDIyMCwgMHgxNjgwMDQwMiwgMHgxNjgwMDQwMn0sCi0JezB4MDAwMGE1OWMsIDB4Mjc4MjAyMjMsIDB4Mjc4MjAyMjMsIDB4MTk4MDA0MDQsIDB4MTk4MDA0MDR9LAotCXsweDAwMDBhNWEwLCAweDJiODIyMjIwLCAweDJiODIyMjIwLCAweDFjODAwNjAzLCAweDFjODAwNjAzfSwKLQl7MHgwMDAwYTVhNCwgMHgyZjgyMjIyMiwgMHgyZjgyMjIyMiwgMHgyMTgwMGEwMiwgMHgyMTgwMGEwMn0sCi0JezB4MDAwMGE1YTgsIDB4MzQ4MjIyMjUsIDB4MzQ4MjIyMjUsIDB4MjU4MDBhMDQsIDB4MjU4MDBhMDR9LAotCXsweDAwMDBhNWFjLCAweDNhODIyMjJhLCAweDNhODIyMjJhLCAweDI4ODAwYTIwLCAweDI4ODAwYTIwfSwKLQl7MHgwMDAwYTViMCwgMHgzZTgyMjIyYywgMHgzZTgyMjIyYywgMHgyYzgwMGUyMCwgMHgyYzgwMGUyMH0sCi0JezB4MDAwMGE1YjQsIDB4NDI4MjI0MmEsIDB4NDI4MjI0MmEsIDB4MzA4MDBlMjIsIDB4MzA4MDBlMjJ9LAotCXsweDAwMDBhNWI4LCAweDQ3ODIyNDRhLCAweDQ3ODIyNDRhLCAweDM0ODAwZTI0LCAweDM0ODAwZTI0fSwKLQl7MHgwMDAwYTViYywgMHg0YjgyMjQ0YywgMHg0YjgyMjQ0YywgMHgzODgwMTY0MCwgMHgzODgwMTY0MH0sCi0JezB4MDAwMGE1YzAsIDB4NGU4MjI0NmMsIDB4NGU4MjI0NmMsIDB4M2M4MDE2NjAsIDB4M2M4MDE2NjB9LAotCXsweDAwMDBhNWM0LCAweDUzODIyNjZjLCAweDUzODIyNjZjLCAweDNmODAxODYxLCAweDNmODAxODYxfSwKLQl7MHgwMDAwYTVjOCwgMHg1NzgyMjg2YywgMHg1NzgyMjg2YywgMHg0MzgwMWE4MSwgMHg0MzgwMWE4MX0sCi0JezB4MDAwMGE1Y2MsIDB4NWM4NDI4NmIsIDB4NWM4NDI4NmIsIDB4NDc4MDFhODMsIDB4NDc4MDFhODN9LAotCXsweDAwMDBhNWQwLCAweDYxODQyYTZjLCAweDYxODQyYTZjLCAweDRhODAxYzg0LCAweDRhODAxYzg0fSwKLQl7MHgwMDAwYTVkNCwgMHg2Njg2MmE2YywgMHg2Njg2MmE2YywgMHg0ZTgwMWNlMywgMHg0ZTgwMWNlM30sCi0JezB4MDAwMGE1ZDgsIDB4NmI4NjJlNmMsIDB4NmI4NjJlNmMsIDB4NTI4MDFjZTUsIDB4NTI4MDFjZTV9LAotCXsweDAwMDBhNWRjLCAweDcwODYzMDhjLCAweDcwODYzMDhjLCAweDU2ODAxY2U5LCAweDU2ODAxY2U5fSwKLQl7MHgwMDAwYTVlMCwgMHg3MzhhMzA4YSwgMHg3MzhhMzA4YSwgMHg1YTgwMWNlYiwgMHg1YTgwMWNlYn0sCi0JezB4MDAwMGE1ZTQsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAotCXsweDAwMDBhNWU4LCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKLQl7MHgwMDAwYTVlYywgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCi0JezB4MDAwMGE1ZjAsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAotCXsweDAwMDBhNWY0LCAweDc3OGEzMDhjLCAweDc3OGEzMDhjLCAweDVkODAxZWVjLCAweDVkODAxZWVjfSwKLQl7MHgwMDAwYTVmOCwgMHg3NzhhMzA4YywgMHg3NzhhMzA4YywgMHg1ZDgwMWVlYywgMHg1ZDgwMWVlY30sCi0JezB4MDAwMGE1ZmMsIDB4Nzc4YTMwOGMsIDB4Nzc4YTMwOGMsIDB4NWQ4MDFlZWMsIDB4NWQ4MDFlZWN9LAotCXsweDAwMDE2MDQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0fSwKLQl7MHgwMDAxNjA0OCwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMX0sCi0JezB4MDAwMTYwNjgsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmN9LAotCXsweDAwMDE2NDQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0fSwKLQl7MHgwMDAxNjQ0OCwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMX0sCi0JezB4MDAwMTY0NjgsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmN9LAotCXsweDAwMDE2ODQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0LCAweDAxMjQ5MmQ0fSwKLQl7MHgwMDAxNjg0OCwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMSwgMHg2NDAwMDAwMX0sCi0JezB4MDAwMTY4NjgsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmMsIDB4NmRiNmRiNmN9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAwX21hY19jb3JlW11bMl0gPSB7Ci0JLyogQWRkciAgICAgIGFsbG1vZGVzICAqLwotCXsweDAwMDAwMDA4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwMDAzMCwgMHgwMDAyMDA4NX0sCi0JezB4MDAwMDAwMzQsIDB4MDAwMDAwMDV9LAotCXsweDAwMDAwMDQwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwMDA0NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDAwNDgsIDB4MDAwMDAwMDh9LAotCXsweDAwMDAwMDRjLCAweDAwMDAwMDEwfSwKLQl7MHgwMDAwMDA1MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDEwNDAsIDB4MDAyZmZjMGZ9LAotCXsweDAwMDAxMDQ0LCAweDAwMmZmYzBmfSwKLQl7MHgwMDAwMTA0OCwgMHgwMDJmZmMwZn0sCi0JezB4MDAwMDEwNGMsIDB4MDAyZmZjMGZ9LAotCXsweDAwMDAxMDUwLCAweDAwMmZmYzBmfSwKLQl7MHgwMDAwMTA1NCwgMHgwMDJmZmMwZn0sCi0JezB4MDAwMDEwNTgsIDB4MDAyZmZjMGZ9LAotCXsweDAwMDAxMDVjLCAweDAwMmZmYzBmfSwKLQl7MHgwMDAwMTA2MCwgMHgwMDJmZmMwZn0sCi0JezB4MDAwMDEwNjQsIDB4MDAyZmZjMGZ9LAotCXsweDAwMDAxMGYwLCAweDAwMDAwMTAwfSwKLQl7MHgwMDAwMTI3MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDEyYjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDAxMmYwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwMTQzYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDE0N2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MDAwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODAwNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwMDgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MDBjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODAxOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwMjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MDM4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODAzYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwNDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MDQ0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODA0OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwNGMsIDB4ZmZmZmZmZmZ9LAotCXsweDAwMDA4MDU0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODA1OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwNWMsIDB4MDAwZmM3OGZ9LAotCXsweDAwMDA4MDYwLCAweDAwMDAwMDBmfSwKLQl7MHgwMDAwODA2NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwNzAsIDB4MDAwMDAzMTB9LAotCXsweDAwMDA4MDc0LCAweDAwMDAwMDIwfSwKLQl7MHgwMDAwODA3OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwOWMsIDB4MDAwMDAwMGZ9LAotCXsweDAwMDA4MGEwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODBhNCwgMHgwMmZmMDAwMH0sCi0JezB4MDAwMDgwYTgsIDB4MGUwNzA2MDV9LAotCXsweDAwMDA4MGFjLCAweDAwMDAwMDBkfSwKLQl7MHgwMDAwODBiMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwYjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MGI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODBiYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwYzAsIDB4MmE4MDAwMDB9LAotCXsweDAwMDA4MGM0LCAweDA2OTAwMTY4fSwKLQl7MHgwMDAwODBjOCwgMHgxMzg4MWMyMH0sCi0JezB4MDAwMDgwY2MsIDB4MDFmNDAwMDB9LAotCXsweDAwMDA4MGQwLCAweDAwMjUyNTAwfSwKLQl7MHgwMDAwODBkNCwgMHgwMGEwMDAwMH0sCi0JezB4MDAwMDgwZDgsIDB4MDA0MDAwMDB9LAotCXsweDAwMDA4MGRjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODBlMCwgMHhmZmZmZmZmZn0sCi0JezB4MDAwMDgwZTQsIDB4MDAwMGZmZmZ9LAotCXsweDAwMDA4MGU4LCAweDNmM2YzZjNmfSwKLQl7MHgwMDAwODBlYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgwZjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MGY0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODBmYywgMHgwMDAyMDAwMH0sCi0JezB4MDAwMDgxMDAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MTA4LCAweDAwMDAwMDUyfSwKLQl7MHgwMDAwODEwYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgxMTAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MTE0LCAweDAwMDAwN2ZmfSwKLQl7MHgwMDAwODExOCwgMHgwMDAwMDBhYX0sCi0JezB4MDAwMDgxMWMsIDB4MDAwMDMyMTB9LAotCXsweDAwMDA4MTI0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODEyOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgxMmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MTMwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODEzNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgxMzgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MTNjLCAweDAwMDBmZmZmfSwKLQl7MHgwMDAwODE0NCwgMHhmZmZmZmZmZn0sCi0JezB4MDAwMDgxNjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MTZjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODE3MCwgMHgxODQ4NjIwMH0sCi0JezB4MDAwMDgxNzQsIDB4MzMzMzIyMTB9LAotCXsweDAwMDA4MTc4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODE3YywgMHgwMDAyMDAwMH0sCi0JezB4MDAwMDgxYzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MWM0LCAweDMzMzMyMjEwfSwKLQl7MHgwMDAwODFjOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgxY2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MWQ0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODFlYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgxZjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MWY0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODFmOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgxZmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MjQwLCAweDAwMTAwMDAwfSwKLQl7MHgwMDAwODI0NCwgMHgwMDEwZjQyNH0sCi0JezB4MDAwMDgyNDgsIDB4MDAwMDA4MDB9LAotCXsweDAwMDA4MjRjLCAweDAwMDFlODQ4fSwKLQl7MHgwMDAwODI1MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgyNTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MjU4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODI1YywgMHg0MDAwMDAwMH0sCi0JezB4MDAwMDgyNjAsIDB4MDAwODA5MjJ9LAotCXsweDAwMDA4MjY0LCAweDk4YTAwMDEwfSwKLQl7MHgwMDAwODI2OCwgMHhmZmZmZmZmZn0sCi0JezB4MDAwMDgyNmMsIDB4MDAwMGZmZmZ9LAotCXsweDAwMDA4MjcwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODI3NCwgMHg0MDAwMDAwMH0sCi0JezB4MDAwMDgyNzgsIDB4MDAzZTQxODB9LAotCXsweDAwMDA4MjdjLCAweDAwMDAwMDA0fSwKLQl7MHgwMDAwODI4NCwgMHgwMDAwMDAyY30sCi0JezB4MDAwMDgyODgsIDB4MDAwMDAwMmN9LAotCXsweDAwMDA4MjhjLCAweDAwMDAwMGZmfSwKLQl7MHgwMDAwODI5NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgyOTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MjljLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODMwMCwgMHgwMDAwMDE0MH0sCi0JezB4MDAwMDgzMTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MzFjLCAweDAwMDAwMTBkfSwKLQl7MHgwMDAwODMyOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzMmMsIDB4MDAwMDAwMDd9LAotCXsweDAwMDA4MzMwLCAweDAwMDAwMzAyfSwKLQl7MHgwMDAwODMzNCwgMHgwMDAwMDcwMH0sCi0JezB4MDAwMDgzMzgsIDB4MDBmZjAwMDB9LAotCXsweDAwMDA4MzNjLCAweDAyNDAwMDAwfSwKLQl7MHgwMDAwODM0MCwgMHgwMDAxMDdmZn0sCi0JezB4MDAwMDgzNDQsIDB4YWE0ODEwNWJ9LAotCXsweDAwMDA4MzQ4LCAweDAwOGYwMDAwfSwKLQl7MHgwMDAwODM1YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzNjAsIDB4ZmZmZmZmZmZ9LAotCXsweDAwMDA4MzY0LCAweGZmZmZmZmZmfSwKLQl7MHgwMDAwODM2OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzNzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4Mzc0LCAweDAwMDAwMGZmfSwKLQl7MHgwMDAwODM3OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzN2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MzgwLCAweGZmZmZmZmZmfSwKLQl7MHgwMDAwODM4NCwgMHhmZmZmZmZmZn0sCi0JezB4MDAwMDgzOTAsIDB4ZmZmZmZmZmZ9LAotCXsweDAwMDA4Mzk0LCAweGZmZmZmZmZmfSwKLQl7MHgwMDAwODM5OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzOWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4M2EwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODNhNCwgMHgwMDAwZmExNH0sCi0JezB4MDAwMDgzYTgsIDB4MDAwZjBjMDB9LAotCXsweDAwMDA4M2FjLCAweDMzMzMyMjEwfSwKLQl7MHgwMDAwODNiMCwgMHgzMzMzMjIxMH0sCi0JezB4MDAwMDgzYjQsIDB4MzMzMzIyMTB9LAotCXsweDAwMDA4M2I4LCAweDMzMzMyMjEwfSwKLQl7MHgwMDAwODNiYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzYzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4M2M0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwODNjOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMDgzY2MsIDB4MDAwMDAyMDB9LAotCXsweDAwMDA4M2QwLCAweDAwMDMwMWZmfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYXI5MzAwQ29tbW9uX3dvX3hsbmFfcnhfZ2Fpbl90YWJsZV8ycDBbXVsyXSA9IHsKLQkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCi0JezB4MDAwMGEwMDAsIDB4MDAwMTAwMDB9LAotCXsweDAwMDBhMDA0LCAweDAwMDMwMDAyfSwKLQl7MHgwMDAwYTAwOCwgMHgwMDA1MDAwNH0sCi0JezB4MDAwMGEwMGMsIDB4MDA4MTAwODB9LAotCXsweDAwMDBhMDEwLCAweDAwODMwMDgyfSwKLQl7MHgwMDAwYTAxNCwgMHgwMTgxMDE4MH0sCi0JezB4MDAwMGEwMTgsIDB4MDE4MzAxODJ9LAotCXsweDAwMDBhMDFjLCAweDAxODUwMTg0fSwKLQl7MHgwMDAwYTAyMCwgMHgwMTg5MDE4OH0sCi0JezB4MDAwMGEwMjQsIDB4MDE4YjAxOGF9LAotCXsweDAwMDBhMDI4LCAweDAxOGQwMThjfSwKLQl7MHgwMDAwYTAyYywgMHgwMzgyMDE5MH0sCi0JezB4MDAwMGEwMzAsIDB4MDM4NDAzODN9LAotCXsweDAwMDBhMDM0LCAweDAzODgwMzg1fSwKLQl7MHgwMDAwYTAzOCwgMHgwMzhhMDM4OX0sCi0JezB4MDAwMGEwM2MsIDB4MDM4YzAzOGJ9LAotCXsweDAwMDBhMDQwLCAweDAzOTAwMzhkfSwKLQl7MHgwMDAwYTA0NCwgMHgwMzkyMDM5MX0sCi0JezB4MDAwMGEwNDgsIDB4MDM5NDAzOTN9LAotCXsweDAwMDBhMDRjLCAweDAzOTYwMzk1fSwKLQl7MHgwMDAwYTA1MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDU4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA1YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDY0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA2OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDcwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA3NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwNzgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMDdjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTA4MCwgMHgyOTI5MjkyOX0sCi0JezB4MDAwMGEwODQsIDB4MjkyOTI5Mjl9LAotCXsweDAwMDBhMDg4LCAweDI5MjkyOTI5fSwKLQl7MHgwMDAwYTA4YywgMHgyOTI5MjkyOX0sCi0JezB4MDAwMGEwOTAsIDB4MjIyOTI5Mjl9LAotCXsweDAwMDBhMDk0LCAweDFkMWQyMjIyfSwKLQl7MHgwMDAwYTA5OCwgMHgwYzExMTExN30sCi0JezB4MDAwMGEwOWMsIDB4MDAwMzAzMDN9LAotCXsweDAwMDBhMGEwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTBhNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwYTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMGFjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTBiMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwYjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMGI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTBiYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGEwYzAsIDB4MDAxZjAwMDB9LAotCXsweDAwMDBhMGM0LCAweDAxMDAwMTAxfSwKLQl7MHgwMDAwYTBjOCwgMHgwMTFlMDExZn0sCi0JezB4MDAwMGEwY2MsIDB4MDExYzAxMWR9LAotCXsweDAwMDBhMGQwLCAweDAyMDMwMjA0fSwKLQl7MHgwMDAwYTBkNCwgMHgwMjAxMDIwMn0sCi0JezB4MDAwMGEwZDgsIDB4MDIxZjAyMDB9LAotCXsweDAwMDBhMGRjLCAweDAzMDIwMjFlfSwKLQl7MHgwMDAwYTBlMCwgMHgwMzAwMDMwMX0sCi0JezB4MDAwMGEwZTQsIDB4MDMxZTAzMWZ9LAotCXsweDAwMDBhMGU4LCAweDA0MDIwMzFkfSwKLQl7MHgwMDAwYTBlYywgMHgwNDAwMDQwMX0sCi0JezB4MDAwMGEwZjAsIDB4MDQxZTA0MWZ9LAotCXsweDAwMDBhMGY0LCAweDA1MDIwNDFkfSwKLQl7MHgwMDAwYTBmOCwgMHgwNTAwMDUwMX0sCi0JezB4MDAwMGEwZmMsIDB4MDUxZTA1MWZ9LAotCXsweDAwMDBhMTAwLCAweDA2MDEwNjAyfSwKLQl7MHgwMDAwYTEwNCwgMHgwNjFmMDYwMH0sCi0JezB4MDAwMGExMDgsIDB4MDYxZDA2MWV9LAotCXsweDAwMDBhMTBjLCAweDA3MDIwNzAzfSwKLQl7MHgwMDAwYTExMCwgMHgwNzAwMDcwMX0sCi0JezB4MDAwMGExMTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTE4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTExYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExMjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTI0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTEyOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExMmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTMwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTEzNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExMzgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTNjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTE0MCwgMHgwMDFmMDAwMH0sCi0JezB4MDAwMGExNDQsIDB4MDEwMDAxMDF9LAotCXsweDAwMDBhMTQ4LCAweDAxMWUwMTFmfSwKLQl7MHgwMDAwYTE0YywgMHgwMTFjMDExZH0sCi0JezB4MDAwMGExNTAsIDB4MDIwMzAyMDR9LAotCXsweDAwMDBhMTU0LCAweDAyMDEwMjAyfSwKLQl7MHgwMDAwYTE1OCwgMHgwMjFmMDIwMH0sCi0JezB4MDAwMGExNWMsIDB4MDMwMjAyMWV9LAotCXsweDAwMDBhMTYwLCAweDAzMDAwMzAxfSwKLQl7MHgwMDAwYTE2NCwgMHgwMzFlMDMxZn0sCi0JezB4MDAwMGExNjgsIDB4MDQwMjAzMWR9LAotCXsweDAwMDBhMTZjLCAweDA0MDAwNDAxfSwKLQl7MHgwMDAwYTE3MCwgMHgwNDFlMDQxZn0sCi0JezB4MDAwMGExNzQsIDB4MDUwMjA0MWR9LAotCXsweDAwMDBhMTc4LCAweDA1MDAwNTAxfSwKLQl7MHgwMDAwYTE3YywgMHgwNTFlMDUxZn0sCi0JezB4MDAwMGExODAsIDB4MDYwMTA2MDJ9LAotCXsweDAwMDBhMTg0LCAweDA2MWYwNjAwfSwKLQl7MHgwMDAwYTE4OCwgMHgwNjFkMDYxZX0sCi0JezB4MDAwMGExOGMsIDB4MDcwMjA3MDN9LAotCXsweDAwMDBhMTkwLCAweDA3MDAwNzAxfSwKLQl7MHgwMDAwYTE5NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExOTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMTljLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFhMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWE4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFhYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYjAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWI0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFiOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYmMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWMwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFjNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExYzgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWNjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFkMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExZDQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWQ4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFkYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExZTAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWU0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYTFlOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGExZWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhMWYwLCAweDAwMDAwMzk2fSwKLQl7MHgwMDAwYTFmNCwgMHgwMDAwMDM5Nn0sCi0JezB4MDAwMGExZjgsIDB4MDAwMDAzOTZ9LAotCXsweDAwMDBhMWZjLCAweDAwMDAwMTk2fSwKLQl7MHgwMDAwYjAwMCwgMHgwMDAxMDAwMH0sCi0JezB4MDAwMGIwMDQsIDB4MDAwMzAwMDJ9LAotCXsweDAwMDBiMDA4LCAweDAwMDUwMDA0fSwKLQl7MHgwMDAwYjAwYywgMHgwMDgxMDA4MH0sCi0JezB4MDAwMGIwMTAsIDB4MDA4MzAwODJ9LAotCXsweDAwMDBiMDE0LCAweDAxODEwMTgwfSwKLQl7MHgwMDAwYjAxOCwgMHgwMTgzMDE4Mn0sCi0JezB4MDAwMGIwMWMsIDB4MDE4NTAxODR9LAotCXsweDAwMDBiMDIwLCAweDAyODEwMjgwfSwKLQl7MHgwMDAwYjAyNCwgMHgwMjgzMDI4Mn0sCi0JezB4MDAwMGIwMjgsIDB4MDI4NTAyODR9LAotCXsweDAwMDBiMDJjLCAweDAyODkwMjg4fSwKLQl7MHgwMDAwYjAzMCwgMHgwMjhiMDI4YX0sCi0JezB4MDAwMGIwMzQsIDB4MDM4ODAyOGN9LAotCXsweDAwMDBiMDM4LCAweDAzOGEwMzg5fSwKLQl7MHgwMDAwYjAzYywgMHgwMzhjMDM4Yn0sCi0JezB4MDAwMGIwNDAsIDB4MDM5MDAzOGR9LAotCXsweDAwMDBiMDQ0LCAweDAzOTIwMzkxfSwKLQl7MHgwMDAwYjA0OCwgMHgwMzk0MDM5M30sCi0JezB4MDAwMGIwNGMsIDB4MDM5NjAzOTV9LAotCXsweDAwMDBiMDUwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA1NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwNTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDVjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA2MCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwNjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDY4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA2YywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwNzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDc0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjA3OCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwN2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMDgwLCAweDMyMzIzMjMyfSwKLQl7MHgwMDAwYjA4NCwgMHgyZjJmMzIzMn0sCi0JezB4MDAwMGIwODgsIDB4MjMyODJhMmR9LAotCXsweDAwMDBiMDhjLCAweDFjMWUyMTIzfSwKLQl7MHgwMDAwYjA5MCwgMHgxNDE3MTkxOX0sCi0JezB4MDAwMGIwOTQsIDB4MGUwZTEyMTR9LAotCXsweDAwMDBiMDk4LCAweDAzMDUwNzA3fSwKLQl7MHgwMDAwYjA5YywgMHgwMDAzMDMwM30sCi0JezB4MDAwMGIwYTAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMGE0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjBhOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwYWMsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMGIwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjBiNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIwYjgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMGJjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjBjMCwgMHgwMDNmMDAyMH0sCi0JezB4MDAwMGIwYzQsIDB4MDA0MDAwNDF9LAotCXsweDAwMDBiMGM4LCAweDAxNDAwMDVmfSwKLQl7MHgwMDAwYjBjYywgMHgwMTYwMDE1Zn0sCi0JezB4MDAwMGIwZDAsIDB4MDE3ZTAxN2Z9LAotCXsweDAwMDBiMGQ0LCAweDAyNDEwMjQyfSwKLQl7MHgwMDAwYjBkOCwgMHgwMjVmMDI0MH0sCi0JezB4MDAwMGIwZGMsIDB4MDI3ZjAyNjB9LAotCXsweDAwMDBiMGUwLCAweDAzNDEwMjdlfSwKLQl7MHgwMDAwYjBlNCwgMHgwMzVmMDM0MH0sCi0JezB4MDAwMGIwZTgsIDB4MDM3ZjAzNjB9LAotCXsweDAwMDBiMGVjLCAweDA0NDAwNDQxfSwKLQl7MHgwMDAwYjBmMCwgMHgwNDYwMDQ1Zn0sCi0JezB4MDAwMGIwZjQsIDB4MDU0MTA0N2Z9LAotCXsweDAwMDBiMGY4LCAweDA1NWYwNTQwfSwKLQl7MHgwMDAwYjBmYywgMHgwNTdmMDU2MH0sCi0JezB4MDAwMGIxMDAsIDB4MDY0MDA2NDF9LAotCXsweDAwMDBiMTA0LCAweDA2NjAwNjVmfSwKLQl7MHgwMDAwYjEwOCwgMHgwNjdlMDY3Zn0sCi0JezB4MDAwMGIxMGMsIDB4MDc0MTA3NDJ9LAotCXsweDAwMDBiMTEwLCAweDA3NWYwNzQwfSwKLQl7MHgwMDAwYjExNCwgMHgwNzdmMDc2MH0sCi0JezB4MDAwMGIxMTgsIDB4MDc4MDA3ODF9LAotCXsweDAwMDBiMTFjLCAweDA3YTAwNzlmfSwKLQl7MHgwMDAwYjEyMCwgMHgwN2MxMDdiZn0sCi0JezB4MDAwMGIxMjQsIDB4MDAwMDA3YzB9LAotCXsweDAwMDBiMTI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjEyYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxMzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMTM0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjEzOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxM2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMTQwLCAweDAwM2YwMDIwfSwKLQl7MHgwMDAwYjE0NCwgMHgwMDQwMDA0MX0sCi0JezB4MDAwMGIxNDgsIDB4MDE0MDAwNWZ9LAotCXsweDAwMDBiMTRjLCAweDAxNjAwMTVmfSwKLQl7MHgwMDAwYjE1MCwgMHgwMTdlMDE3Zn0sCi0JezB4MDAwMGIxNTQsIDB4MDI0MTAyNDJ9LAotCXsweDAwMDBiMTU4LCAweDAyNWYwMjQwfSwKLQl7MHgwMDAwYjE1YywgMHgwMjdmMDI2MH0sCi0JezB4MDAwMGIxNjAsIDB4MDM0MTAyN2V9LAotCXsweDAwMDBiMTY0LCAweDAzNWYwMzQwfSwKLQl7MHgwMDAwYjE2OCwgMHgwMzdmMDM2MH0sCi0JezB4MDAwMGIxNmMsIDB4MDQ0MDA0NDF9LAotCXsweDAwMDBiMTcwLCAweDA0NjAwNDVmfSwKLQl7MHgwMDAwYjE3NCwgMHgwNTQxMDQ3Zn0sCi0JezB4MDAwMGIxNzgsIDB4MDU1ZjA1NDB9LAotCXsweDAwMDBiMTdjLCAweDA1N2YwNTYwfSwKLQl7MHgwMDAwYjE4MCwgMHgwNjQwMDY0MX0sCi0JezB4MDAwMGIxODQsIDB4MDY2MDA2NWZ9LAotCXsweDAwMDBiMTg4LCAweDA2N2UwNjdmfSwKLQl7MHgwMDAwYjE4YywgMHgwNzQxMDc0Mn0sCi0JezB4MDAwMGIxOTAsIDB4MDc1ZjA3NDB9LAotCXsweDAwMDBiMTk0LCAweDA3N2YwNzYwfSwKLQl7MHgwMDAwYjE5OCwgMHgwNzgwMDc4MX0sCi0JezB4MDAwMGIxOWMsIDB4MDdhMDA3OWZ9LAotCXsweDAwMDBiMWEwLCAweDA3YzEwN2JmfSwKLQl7MHgwMDAwYjFhNCwgMHgwMDAwMDdjMH0sCi0JezB4MDAwMGIxYTgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWFjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFiMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxYjQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWI4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFiYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxYzAsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWM0LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFjOCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxY2MsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWQwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFkNCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxZDgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWRjLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFlMCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxZTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBiMWU4LCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwYjFlYywgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGIxZjAsIDB4MDAwMDAzOTZ9LAotCXsweDAwMDBiMWY0LCAweDAwMDAwMzk2fSwKLQl7MHgwMDAwYjFmOCwgMHgwMDAwMDM5Nn0sCi0JezB4MDAwMGIxZmMsIDB4MDAwMDAxOTZ9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBfMnAwX3NvY19wcmVhbWJsZVtdWzJdID0gewotCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KLQl7MHgwMDAwNDBhNCwgMHgwMGEwYzFjOX0sCi0JezB4MDAwMDcwMDgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA3MDIwLCAweDAwMDAwMDAwfSwKLQl7MHgwMDAwNzAzNCwgMHgwMDAwMDAwMn0sCi0JezB4MDAwMDcwMzgsIDB4MDAwMDA0YzJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBhcjkzMDBQY2llUGh5X3BsbF9vbl9jbGtyZXFfZGlzYWJsZV9MMV8ycDBbXVsyXSA9IHsKLQkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCi0JezB4MDAwMDQwNDAsIDB4MDgyMTJlNWV9LAotCXsweDAwMDA0MDQwLCAweDAwMDgwMDNifSwKLQl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwMFBjaWVQaHlfY2xrcmVxX2VuYWJsZV9MMV8ycDBbXVsyXSA9IHsKLQkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCi0JezB4MDAwMDQwNDAsIDB4MDgyNTNlNWV9LAotCXsweDAwMDA0MDQwLCAweDAwMDgwMDNifSwKLQl7MHgwMDAwNDA0NCwgMHgwMDAwMDAwMH0sCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGFyOTMwMFBjaWVQaHlfY2xrcmVxX2Rpc2FibGVfTDFfMnAwW11bMl0gPSB7Ci0JLyogQWRkciAgICAgIGFsbG1vZGVzICAqLwotCXsweDAwMDA0MDQwLCAweDA4MjEzZTVlfSwKLQl7MHgwMDAwNDA0MCwgMHgwMDA4MDAzYn0sCi0JezB4MDAwMDQwNDQsIDB4MDAwMDAwMDB9LAotfTsKLQotI2VuZGlmIC8qIElOSVRWQUxTXzkwMDNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMKaW5kZXggMzdiYTM3NC4uNWI5OTViZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5jCkBAIC05MCw2ICs5MCw4IEBACiAJCQkJICBNQVBfSVNSX1MyX0NTVCk7CiAJCQltYXNrMiB8PSAoKGlzcjIgJiBBUl9JU1JfUzJfVFNGT09SKSA+PgogCQkJCSAgTUFQX0lTUl9TMl9UU0ZPT1IpOworCQkJbWFzazIgfD0gKChpc3IyICYgQVJfSVNSX1MyX0JCX1dBVENIRE9HKSA+PgorCQkJCSAgTUFQX0lTUl9TMl9CQl9XQVRDSERPRyk7CiAKIAkJCWlmICghKHBDYXAtPmh3X2NhcHMgJiBBVEg5S19IV19DQVBfUkFDX1NVUFBPUlRFRCkpIHsKIAkJCQlSRUdfV1JJVEUoYWgsIEFSX0lTUl9TMiwgaXNyMik7CkBAIC0xNjcsNiArMTY5LDkgQEAKIAogCQkJKHZvaWQpIFJFR19SRUFEKGFoLCBBUl9JU1IpOwogCQl9CisKKwkJaWYgKCptYXNrZWQgJiBBVEg5S19JTlRfQkJfV0FUQ0hET0cpCisJCQlhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfcmVhZChhaCk7CiAJfQogCiAJaWYgKHN5bmNfY2F1c2UpIHsKQEAgLTQ2NSw2ICs0NzAsMTQgQEAKIAkJYWRzLT5jdGwxMSAmPSB+QVJfVmlydE1vcmVGcmFnOwogfQogCit2b2lkIGFyOTAwM19od19zZXRfcGFwcmRfdHhkZXNjKHN0cnVjdCBhdGhfaHcgKmFoLCB2b2lkICpkcywgdTggY2hhaW5zKQoreworCXN0cnVjdCBhcjkwMDNfdHhjICphZHMgPSBkczsKKworCWFkcy0+Y3RsMTIgfD0gU00oY2hhaW5zLCBBUl9QQVBSRENoYWluTWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19od19zZXRfcGFwcmRfdHhkZXNjKTsKKwogdm9pZCBhcjkwMDNfaHdfYXR0YWNoX21hY19vcHMoc3RydWN0IGF0aF9odyAqaHcpCiB7CiAJc3RydWN0IGF0aF9od19vcHMgKm9wcyA9IGF0aDlrX2h3X29wcyhodyk7CkBAIC01NjYsMTIgKzU3OSwzOSBAQAogCQlyeHMtPnJzX2ZsYWdzIHw9IEFUSDlLX1JYX0RFQ1JZUFRfQlVTWTsKIAogCWlmICgocnhzcC0+c3RhdHVzMTEgJiBBUl9SeEZyYW1lT0spID09IDApIHsKKwkJLyoKKwkJICogQVJfQ1JDRXJyIHdpbGwgYmV0IHNldCB0byB0cnVlIGlmIHdlJ3JlIG9uIHRoZSBsYXN0CisJCSAqIHN1YmZyYW1lIGFuZCB0aGUgQVJfUG9zdERlbGltQ1JDRXJyIGlzIGNhdWdodC4KKwkJICogSW4gYSB3YXkgdGhpcyBhbHNvIGdpdmVzIHVzIGEgZ3VhcmFudGVlIHRoYXQgd2hlbgorCQkgKiAoIShBUl9DUkNFcnIpICYmIChBUl9Qb3N0RGVsaW1DUkNFcnIpKSB3ZSBjYW5ub3QKKwkJICogcG9zc2libHkgYmUgcmV2aWV3aW5nIHRoZSBsYXN0IHN1YmZyYW1lLiBBUl9DUkNFcnIKKwkJICogaXMgdGhlIENSQyBvZiB0aGUgYWN0dWFsIGRhdGEuCisJCSAqLwogCQlpZiAocnhzcC0+c3RhdHVzMTEgJiBBUl9DUkNFcnIpIHsKIAkJCXJ4cy0+cnNfc3RhdHVzIHw9IEFUSDlLX1JYRVJSX0NSQzsKIAkJfSBlbHNlIGlmIChyeHNwLT5zdGF0dXMxMSAmIEFSX1BIWUVycikgewotCQkJcnhzLT5yc19zdGF0dXMgfD0gQVRIOUtfUlhFUlJfUEhZOwogCQkJcGh5ZXJyID0gTVMocnhzcC0+c3RhdHVzMTEsIEFSX1BIWUVyckNvZGUpOwotCQkJcnhzLT5yc19waHllcnIgPSBwaHllcnI7CisJCQkvKgorCQkJICogSWYgd2UgcmVhY2ggYSBwb2ludCBoZXJlIHdoZXJlIEFSX1Bvc3REZWxpbUNSQ0VyciBpcworCQkJICogdHJ1ZSBpdCBpbXBsaWVzIHdlJ3JlICpub3QqIG9uIHRoZSBsYXN0IHN1YmZyYW1lLiBJbgorCQkJICogaW4gdGhhdCBjYXNlIHRoYXQgd2Uga25vdyBhbHJlYWR5IHRoYXQgdGhlIENSQyBvZgorCQkJICogdGhlIGZyYW1lIHdhcyBPSywgYW5kIE1BQyB3b3VsZCBzZW5kIGFuIEFDSyBmb3IgdGhhdAorCQkJICogc3ViZnJhbWUsIGV2ZW4gaWYgd2UgZGlkIGdldCBhIHBoeSBlcnJvciBvZiB0eXBlCisJCQkgKiBBVEg5S19QSFlFUlJfT0ZETV9SRVNUQVJULiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZQorCQkJICogdG8gZnJhbWUgdGhhdCBhcmUgcHJpb3IgdG8gdGhlIGxhc3Qgc3ViZnJhbWUuCisJCQkgKiBUaGUgQVJfUG9zdERlbGltQ1JDRXJyIGlzIHRoZSBDUkMgZm9yIHRoZSBNUERVCisJCQkgKiBkZWxpbWl0ZXIsIHdoaWNoIGNvbnRhaW5zIHRoZSA0IHJlc2VydmVkIGJpdHMsCisJCQkgKiB0aGUgTVBEVSBsZW5ndGggKDEyIGJpdHMpLCBhbmQgZm9sbG93cyB0aGUgTVBEVQorCQkJICogZGVsaW1pdGVyIGZvciBhbiBBLU1QRFUgc3ViZnJhbWUgKDB4NEUgPSAnTicgQVNDSUkpLgorCQkJICovCisJCQlpZiAoKHBoeWVyciA9PSBBVEg5S19QSFlFUlJfT0ZETV9SRVNUQVJUKSAmJgorCQkJICAgIChyeHNwLT5zdGF0dXMxMSAmIEFSX1Bvc3REZWxpbUNSQ0VycikpIHsKKwkJCQlyeHMtPnJzX3BoeWVyciA9IDA7CisJCQl9IGVsc2UgeworCQkJCXJ4cy0+cnNfc3RhdHVzIHw9IEFUSDlLX1JYRVJSX1BIWTsKKwkJCQlyeHMtPnJzX3BoeWVyciA9IHBoeWVycjsKKwkJCX0KKwogCQl9IGVsc2UgaWYgKHJ4c3AtPnN0YXR1czExICYgQVJfRGVjcnlwdENSQ0VycikgewogCQkJcnhzLT5yc19zdGF0dXMgfD0gQVRIOUtfUlhFUlJfREVDUllQVDsKIAkJfSBlbHNlIGlmIChyeHNwLT5zdGF0dXMxMSAmIEFSX01pY2hhZWxFcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5oCmluZGV4IGYxNzU1OGIuLjlmMmNlYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuaApAQCAtMzMsMTMgKzMzLDE0IEBACiAjZGVmaW5lIEFSX1R4RGVzY0lkX1MJMTYKICNkZWZpbmUgQVJfVHhQdHJDaGtTdW0JMHgwMDAwZmZmZgogCi0jZGVmaW5lIEFSX1R4VGlkCTB4ZjAwMDAwMDAKLSNkZWZpbmUgQVJfVHhUaWRfUwkyOAotCiAjZGVmaW5lIEFSX0xvd1J4Q2hhaW4JMHgwMDAwNDAwMAogCiAjZGVmaW5lIEFSX05vdF9Tb3VuZGluZwkweDIwMDAwMDAwCiAKKy8qIGN0bCAxMiAqLworI2RlZmluZSBBUl9QQVBSRENoYWluTWFzawkweDAwMDAwZTAwCisjZGVmaW5lIEFSX1BBUFJEQ2hhaW5NYXNrX1MJOQorCiAjZGVmaW5lIE1BUF9JU1JfUzJfQ1NUICAgICAgICAgIDYKICNkZWZpbmUgTUFQX0lTUl9TMl9HVFQgICAgICAgICAgNgogI2RlZmluZSBNQVBfSVNSX1MyX1RJTSAgICAgICAgICAzCkBAIC00Nyw2ICs0OCw3IEBACiAjZGVmaW5lIE1BUF9JU1JfUzJfRFRJTVNZTkMgICAgIDcKICNkZWZpbmUgTUFQX0lTUl9TMl9EVElNICAgICAgICAgNwogI2RlZmluZSBNQVBfSVNSX1MyX1RTRk9PUiAgICAgICA0CisjZGVmaW5lIE1BUF9JU1JfUzJfQkJfV0FUQ0hET0cgIDYKIAogI2RlZmluZSBBUjkwMDNUWENfQ09OU1QoX2RzKSAoKGNvbnN0IHN0cnVjdCBhcjkwMDNfdHhjICopIF9kcykKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTBjODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jCkBAIC0wLDAgKzEsNzE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgImFyOTAwM19waHkuaCIKKwordm9pZCBhcjkwMDNfcGFwcmRfZW5hYmxlKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHZhbCkKK3sKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfQ1RSTDBfQjAsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9DVFJMMF9QQVBSRF9FTkFCTEUsICEhdmFsKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfQ1RSTDBfQjEsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9DVFJMMF9QQVBSRF9FTkFCTEUsICEhdmFsKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfQ1RSTDBfQjIsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9DVFJMMF9QQVBSRF9FTkFCTEUsICEhdmFsKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX3BhcHJkX2VuYWJsZSk7CisKK3N0YXRpYyB2b2lkIGFyOTAwM19wYXByZF9zZXR1cF9zaW5nbGVfdGFibGUoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGFyOTMwMF9lZXByb20gKmVlcCA9ICZhaC0+ZWVwcm9tLmFyOTMwMF9lZXA7CisJc3RydWN0IGFyOTMwMF9tb2RhbF9lZXBfaGVhZGVyICpoZHI7CisJY29uc3QgdTMyIGN0cmwwWzNdID0geworCQlBUl9QSFlfUEFQUkRfQ1RSTDBfQjAsCisJCUFSX1BIWV9QQVBSRF9DVFJMMF9CMSwKKwkJQVJfUEhZX1BBUFJEX0NUUkwwX0IyCisJfTsKKwljb25zdCB1MzIgY3RybDFbM10gPSB7CisJCUFSX1BIWV9QQVBSRF9DVFJMMV9CMCwKKwkJQVJfUEhZX1BBUFJEX0NUUkwxX0IxLAorCQlBUl9QSFlfUEFQUkRfQ1RSTDFfQjIKKwl9OworCXUzMiBhbV9tYXNrLCBodDQwX21hc2s7CisJaW50IGk7CisKKwlpZiAoYWgtPmN1cmNoYW4gJiYgSVNfQ0hBTl81R0haKGFoLT5jdXJjaGFuKSkKKwkJaGRyID0gJmVlcC0+bW9kYWxIZWFkZXI1RzsKKwllbHNlCisJCWhkciA9ICZlZXAtPm1vZGFsSGVhZGVyMkc7CisKKwlhbV9tYXNrID0gbGUzMl90b19jcHUoaGRyLT5wYXBkUmF0ZU1hc2tIdDIwKTsKKwlodDQwX21hc2sgPSBsZTMyX3RvX2NwdShoZHItPnBhcGRSYXRlTWFza0h0NDApOworCisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX0FNMkFNLCBBUl9QSFlfUEFQUkRfQU0yQU1fTUFTSywgYW1fbWFzayk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX0FNMlBNLCBBUl9QSFlfUEFQUkRfQU0yUE1fTUFTSywgYW1fbWFzayk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX0hUNDAsIEFSX1BIWV9QQVBSRF9IVDQwX01BU0ssIGh0NDBfbWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCVJFR19STVdfRklFTEQoYWgsIGN0cmwwW2ldLAorCQkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwwX1VTRV9TSU5HTEVfVEFCTEVfTUFTSywgMSk7CisJCVJFR19STVdfRklFTEQoYWgsIGN0cmwxW2ldLAorCQkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwxX0FEQVBUSVZFX0FNMlBNX0VOQUJMRSwgMSk7CisJCVJFR19STVdfRklFTEQoYWgsIGN0cmwxW2ldLAorCQkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwxX0FEQVBUSVZFX0FNMkFNX0VOQUJMRSwgMSk7CisJCVJFR19STVdfRklFTEQoYWgsIGN0cmwxW2ldLAorCQkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwxX0FEQVBUSVZFX1NDQUxJTkdfRU5BLCAwKTsKKwkJUkVHX1JNV19GSUVMRChhaCwgY3RybDFbaV0sCisJCQkgICAgICBBUl9QSFlfUEFQUkRfQ1RSTDFfUEFfR0FJTl9TQ0FMRV9GQUNUX01BU0ssIDE4MSk7CisJCVJFR19STVdfRklFTEQoYWgsIGN0cmwxW2ldLAorCQkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwxX1BBUFJEX01BR19TQ0FMRV9GQUNULCAzNjEpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBjdHJsMVtpXSwKKwkJCSAgICAgIEFSX1BIWV9QQVBSRF9DVFJMMV9BREFQVElWRV9TQ0FMSU5HX0VOQSwgMCk7CisJCVJFR19STVdfRklFTEQoYWgsIGN0cmwwW2ldLAorCQkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwwX1BBUFJEX01BR19USFJTSCwgMyk7CisJfQorCisJYXI5MDAzX3BhcHJkX2VuYWJsZShhaCwgZmFsc2UpOworCisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDEsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX0xCX1NLSVAsIDB4MzApOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxLAorCQkgICAgICBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9MQl9FTkFCTEUsIDEpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxLAorCQkgICAgICBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9UWF9HQUlOX0ZPUkNFLCAxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMSwKKwkJICAgICAgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDFfQ0ZfUEFQUkRfUlhfQkJfR0FJTl9GT1JDRSwgMCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDEsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX0lRQ09SUl9FTkFCTEUsIDApOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxLAorCQkgICAgICBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9BR0MyX1NFVFRMSU5HLCAyOCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDEsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX0NGX1BBUFJEX1RSQUlOX0VOQUJMRSwgMSk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDIsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwyX0NGX1BBUFJEX0lOSVRfUlhfQkJfR0FJTiwgMTQ3KTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMywKKwkJICAgICAgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDNfQ0ZfUEFQUkRfRklORV9DT1JSX0xFTiwgNCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDMsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX0NPQVJTRV9DT1JSX0xFTiwgNCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDMsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX05VTV9DT1JSX1NUQUdFUywgNyk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDMsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX01JTl9MT09QQkFDS19ERUwsIDEpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzLAorCQkgICAgICBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMM19DRl9QQVBSRF9RVUlDS19EUk9QLCAtNik7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDMsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX0FEQ19ERVNJUkVEX1NJWkUsCisJCSAgICAgIC0xNSk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDMsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX0JCVFhNSVhfRElTQUJMRSwgMSk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDQsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0X0NGX1BBUFJEX1NBRkVUWV9ERUxUQSwgMCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDQsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0X0NGX1BBUFJEX01JTl9DT1JSLCA0MDApOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0LAorCQkgICAgICBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMNF9DRl9QQVBSRF9OVU1fVFJBSU5fU0FNUExFUywKKwkJICAgICAgMTAwKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTEVfMF9CMCwKKwkJICAgICAgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxJTkcsIDI2MTM3Nik7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxFXzFfQjAsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMSU5HLCAyNDgwNzkpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMRV8yX0IwLAorCQkgICAgICBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTElORywgMjMzNzU5KTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTEVfM19CMCwKKwkJICAgICAgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxJTkcsIDIyMDQ2NCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxFXzRfQjAsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMSU5HLCAyMDgxOTQpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMRV81X0IwLAorCQkgICAgICBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTElORywgMTk2OTQ5KTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTEVfNl9CMCwKKwkJICAgICAgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxJTkcsIDE4NTcwNik7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxFXzdfQjAsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMSU5HLCAxNzU0ODcpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfcGFwcmRfZ2V0X2dhaW5fdGFibGUoc3RydWN0IGF0aF9odyAqYWgpCit7CisJdTMyICplbnRyeSA9IGFoLT5wYXByZF9nYWluX3RhYmxlX2VudHJpZXM7CisJdTggKmluZGV4ID0gYWgtPnBhcHJkX2dhaW5fdGFibGVfaW5kZXg7CisJdTMyIHJlZyA9IEFSX1BIWV9UWEdBSU5fVEFCTEU7CisJaW50IGk7CisKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZihhaC0+cGFwcmRfZ2Fpbl90YWJsZV9lbnRyaWVzKSk7CisJbWVtc2V0KGluZGV4LCAwLCBzaXplb2YoYWgtPnBhcHJkX2dhaW5fdGFibGVfaW5kZXgpKTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWVudHJ5W2ldID0gUkVHX1JFQUQoYWgsIHJlZyk7CisJCWluZGV4W2ldID0gKGVudHJ5W2ldID4+IDI0KSAmIDB4ZmY7CisJCXJlZyArPSA0OworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhcjkwMDNfZ2V0X2Rlc2lyZWRfZ2FpbihzdHJ1Y3QgYXRoX2h3ICphaCwgaW50IGNoYWluLAorCQkJCQkgICAgaW50IHRhcmdldF9wb3dlcikKK3sKKwlpbnQgb2xwY19nYWluX2RlbHRhID0gMDsKKwlpbnQgYWxwaGFfdGhlcm0sIGFscGhhX3ZvbHQ7CisJaW50IHRoZXJtX2NhbF92YWx1ZSwgdm9sdF9jYWxfdmFsdWU7CisJaW50IHRoZXJtX3ZhbHVlLCB2b2x0X3ZhbHVlOworCWludCB0aGVybWFsX2dhaW5fY29yciwgdm9sdGFnZV9nYWluX2NvcnI7CisJaW50IGRlc2lyZWRfc2NhbGUsIGRlc2lyZWRfZ2FpbiA9IDA7CisJdTMyIHJlZzsKKworCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMSwKKwkJICAgIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1RSQUlOX0RPTkUpOworCWRlc2lyZWRfc2NhbGUgPSBSRUdfUkVBRF9GSUVMRChhaCwgQVJfUEhZX1RQQ18xMiwKKwkJCQkgICAgICAgQVJfUEhZX1RQQ18xMl9ERVNJUkVEX1NDQUxFX0hUNDBfNSk7CisJYWxwaGFfdGhlcm0gPSBSRUdfUkVBRF9GSUVMRChhaCwgQVJfUEhZX1RQQ18xOSwKKwkJCQkgICAgIEFSX1BIWV9UUENfMTlfQUxQSEFfVEhFUk0pOworCWFscGhhX3ZvbHQgPSBSRUdfUkVBRF9GSUVMRChhaCwgQVJfUEhZX1RQQ18xOSwKKwkJCQkgICAgQVJfUEhZX1RQQ18xOV9BTFBIQV9WT0xUKTsKKwl0aGVybV9jYWxfdmFsdWUgPSBSRUdfUkVBRF9GSUVMRChhaCwgQVJfUEhZX1RQQ18xOCwKKwkJCQkJIEFSX1BIWV9UUENfMThfVEhFUk1fQ0FMX1ZBTFVFKTsKKwl2b2x0X2NhbF92YWx1ZSA9IFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9QSFlfVFBDXzE4LAorCQkJCQlBUl9QSFlfVFBDXzE4X1ZPTFRfQ0FMX1ZBTFVFKTsKKwl0aGVybV92YWx1ZSA9IFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9QSFlfQkJfVEhFUk1fQURDXzQsCisJCQkJICAgICBBUl9QSFlfQkJfVEhFUk1fQURDXzRfTEFURVNUX1RIRVJNX1ZBTFVFKTsKKwl2b2x0X3ZhbHVlID0gUkVHX1JFQURfRklFTEQoYWgsIEFSX1BIWV9CQl9USEVSTV9BRENfNCwKKwkJCQkgICAgQVJfUEhZX0JCX1RIRVJNX0FEQ180X0xBVEVTVF9WT0xUX1ZBTFVFKTsKKworCWlmIChjaGFpbiA9PSAwKQorCQlyZWcgPSBBUl9QSFlfVFBDXzExX0IwOworCWVsc2UgaWYgKGNoYWluID09IDEpCisJCXJlZyA9IEFSX1BIWV9UUENfMTFfQjE7CisJZWxzZQorCQlyZWcgPSBBUl9QSFlfVFBDXzExX0IyOworCisJb2xwY19nYWluX2RlbHRhID0gUkVHX1JFQURfRklFTEQoYWgsIHJlZywKKwkJCQkJIEFSX1BIWV9UUENfMTFfT0xQQ19HQUlOX0RFTFRBKTsKKworCWlmIChvbHBjX2dhaW5fZGVsdGEgPj0gMTI4KQorCQlvbHBjX2dhaW5fZGVsdGEgPSBvbHBjX2dhaW5fZGVsdGEgLSAyNTY7CisKKwl0aGVybWFsX2dhaW5fY29yciA9IChhbHBoYV90aGVybSAqICh0aGVybV92YWx1ZSAtIHRoZXJtX2NhbF92YWx1ZSkgKworCQkJICAgICAoMjU2IC8gMikpIC8gMjU2OworCXZvbHRhZ2VfZ2Fpbl9jb3JyID0gKGFscGhhX3ZvbHQgKiAodm9sdF92YWx1ZSAtIHZvbHRfY2FsX3ZhbHVlKSArCisJCQkgICAgICgxMjggLyAyKSkgLyAxMjg7CisJZGVzaXJlZF9nYWluID0gdGFyZ2V0X3Bvd2VyIC0gb2xwY19nYWluX2RlbHRhIC0gdGhlcm1hbF9nYWluX2NvcnIgLQorCSAgICB2b2x0YWdlX2dhaW5fY29yciArIGRlc2lyZWRfc2NhbGU7CisKKwlyZXR1cm4gZGVzaXJlZF9nYWluOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfdHhfZm9yY2VfZ2FpbihzdHJ1Y3QgYXRoX2h3ICphaCwgdW5zaWduZWQgaW50IGdhaW5faW5kZXgpCit7CisJaW50IHNlbGVjdGVkX2dhaW5fZW50cnksIHR4YmIxZGJnYWluLCB0eGJiNmRiZ2FpbiwgdHhteHJnYWluOworCWludCBwYWRydmduQSwgcGFkcnZnbkIsIHBhZHJ2Z25DLCBwYWRydmduRDsKKwl1MzIgKmdhaW5fdGFibGVfZW50cmllcyA9IGFoLT5wYXByZF9nYWluX3RhYmxlX2VudHJpZXM7CisKKwlzZWxlY3RlZF9nYWluX2VudHJ5ID0gZ2Fpbl90YWJsZV9lbnRyaWVzW2dhaW5faW5kZXhdOworCXR4YmIxZGJnYWluID0gc2VsZWN0ZWRfZ2Fpbl9lbnRyeSAmIDB4NzsKKwl0eGJiNmRiZ2FpbiA9IChzZWxlY3RlZF9nYWluX2VudHJ5ID4+IDMpICYgMHgzOworCXR4bXhyZ2FpbiA9IChzZWxlY3RlZF9nYWluX2VudHJ5ID4+IDUpICYgMHhmOworCXBhZHJ2Z25BID0gKHNlbGVjdGVkX2dhaW5fZW50cnkgPj4gOSkgJiAweGY7CisJcGFkcnZnbkIgPSAoc2VsZWN0ZWRfZ2Fpbl9lbnRyeSA+PiAxMykgJiAweGY7CisJcGFkcnZnbkMgPSAoc2VsZWN0ZWRfZ2Fpbl9lbnRyeSA+PiAxNykgJiAweGY7CisJcGFkcnZnbkQgPSAoc2VsZWN0ZWRfZ2Fpbl9lbnRyeSA+PiAyMSkgJiAweDM7CisKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVFhfRk9SQ0VEX0dBSU4sCisJCSAgICAgIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfVFhCQjFEQkdBSU4sIHR4YmIxZGJnYWluKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVFhfRk9SQ0VEX0dBSU4sCisJCSAgICAgIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfVFhCQjZEQkdBSU4sIHR4YmI2ZGJnYWluKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVFhfRk9SQ0VEX0dBSU4sCisJCSAgICAgIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfVFhNWFJHQUlOLCB0eG14cmdhaW4pOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UWF9GT1JDRURfR0FJTiwKKwkJICAgICAgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9QQURSVkdOQSwgcGFkcnZnbkEpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UWF9GT1JDRURfR0FJTiwKKwkJICAgICAgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9QQURSVkdOQiwgcGFkcnZnbkIpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UWF9GT1JDRURfR0FJTiwKKwkJICAgICAgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9QQURSVkdOQywgcGFkcnZnbkMpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UWF9GT1JDRURfR0FJTiwKKwkJICAgICAgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9QQURSVkdORCwgcGFkcnZnbkQpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UWF9GT1JDRURfR0FJTiwKKwkJICAgICAgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9FTkFCTEVfUEFMLCAwKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVFhfRk9SQ0VEX0dBSU4sCisJCSAgICAgIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRV9UWF9HQUlOLCAwKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVFBDXzEsIEFSX1BIWV9UUENfMV9GT1JDRURfREFDX0dBSU4sIDApOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UUENfMSwgQVJfUEhZX1RQQ18xX0ZPUkNFX0RBQ19HQUlOLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9leHBuKGludCBudW0pCit7CisJcmV0dXJuIGZscyhudW0pIC0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9wcm9wZXJfc2NhbGUoaW50IGV4cG4sIGludCBOKQoreworCXJldHVybiAoZXhwbiA+IE4pID8gZXhwbiAtIDEwIDogMDsKK30KKworI2RlZmluZSBOVU1fQklOIDIzCisKK3N0YXRpYyBib29sIGNyZWF0ZV9wYV9jdXJ2ZSh1MzIgKmRhdGFfTCwgdTMyICpkYXRhX1UsIHUzMiAqcGFfdGFibGUsIHUxNiAqZ2FpbikKK3sKKwl1bnNpZ25lZCBpbnQgdGhyZXNoX2FjY3VtX2NudDsKKwlpbnQgeF9lc3RbTlVNX0JJTiArIDFdLCBZW05VTV9CSU4gKyAxXSwgdGhldGFbTlVNX0JJTiArIDFdOworCWludCBQQV9pbltOVU1fQklOICsgMV07CisJaW50IEIxX3RtcFtOVU1fQklOICsgMV0sIEIyX3RtcFtOVU1fQklOICsgMV07CisJdW5zaWduZWQgaW50IEIxX2Fic19tYXgsIEIyX2Fic19tYXg7CisJaW50IG1heF9pbmRleCwgc2NhbGVfZmFjdG9yOworCWludCB5X2VzdFtOVU1fQklOICsgMV07CisJaW50IHhfZXN0X2Z4cDFfbm9ubGluLCB4X3RpbGRlW05VTV9CSU4gKyAxXTsKKwl1bnNpZ25lZCBpbnQgeF90aWxkZV9hYnM7CisJaW50IEdfZnhwLCBZX2ludGVyY2VwdCwgb3JkZXJfeF9ieV95LCBNLCBJLCBMLCBzdW1feV9zcXIsIHN1bV95X3F1YWQ7CisJaW50IFFfeCwgUV9CMSwgUV9CMiwgYmV0YV9yYXcsIGFscGhhX3Jhdywgc2NhbGVfQjsKKwlpbnQgUV9zY2FsZV9CLCBRX2JldGEsIFFfYWxwaGEsIGFscGhhLCBiZXRhLCBvcmRlcl8xLCBvcmRlcl8yOworCWludCBvcmRlcjFfNXgsIG9yZGVyMl8zeCwgb3JkZXIxXzV4X3JlbSwgb3JkZXIyXzN4X3JlbTsKKwlpbnQgeTUsIHkzLCB0bXA7CisJaW50IHRoZXRhX2xvd19iaW4gPSAwOworCWludCBpOworCisJLyogZGlzcmVnYXJkIGFueSBiaW4gdGhhdCBjb250YWlucyA8PSAxNiBzYW1wbGVzICovCisJdGhyZXNoX2FjY3VtX2NudCA9IDE2OworCXNjYWxlX2ZhY3RvciA9IDU7CisJbWF4X2luZGV4ID0gMDsKKwltZW1zZXQodGhldGEsIDAsIHNpemVvZih0aGV0YSkpOworCW1lbXNldCh4X2VzdCwgMCwgc2l6ZW9mKHhfZXN0KSk7CisJbWVtc2V0KFksIDAsIHNpemVvZihZKSk7CisJbWVtc2V0KHlfZXN0LCAwLCBzaXplb2YoeV9lc3QpKTsKKwltZW1zZXQoeF90aWxkZSwgMCwgc2l6ZW9mKHhfdGlsZGUpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQklOOyBpKyspIHsKKwkJczMyIGFjY3VtX2NudCwgYWNjdW1fdHgsIGFjY3VtX3J4LCBhY2N1bV9hbmc7CisKKwkJLyogbnVtYmVyIG9mIHNhbXBsZXMgKi8KKwkJYWNjdW1fY250ID0gZGF0YV9MW2ldICYgMHhmZmZmOworCisJCWlmIChhY2N1bV9jbnQgPD0gdGhyZXNoX2FjY3VtX2NudCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHN1bSh0eCBhbXBsaXR1ZGUpICovCisJCWFjY3VtX3R4ID0gKChkYXRhX0xbaV0gPj4gMTYpICYgMHhmZmZmKSB8CisJCSAgICAoKGRhdGFfVVtpXSAmIDB4N2ZmKSA8PCAxNik7CisKKwkJLyogc3VtKHJ4IGFtcGxpdHVkZSBkaXN0YW5jZSB0byBsb3dlciBiaW4gZWRnZSkgKi8KKwkJYWNjdW1fcnggPSAoKGRhdGFfVVtpXSA+PiAxMSkgJiAweDFmKSB8CisJCSAgICAoKGRhdGFfTFtpICsgMjNdICYgMHhmZmZmKSA8PCA1KTsKKworCQkvKiBzdW0oYW5nbGVzKSAqLworCQlhY2N1bV9hbmcgPSAoKGRhdGFfTFtpICsgMjNdID4+IDE2KSAmIDB4ZmZmZikgfAorCQkgICAgKChkYXRhX1VbaSArIDIzXSAmIDB4N2ZmKSA8PCAxNik7CisKKwkJYWNjdW1fdHggPDw9IHNjYWxlX2ZhY3RvcjsKKwkJYWNjdW1fcnggPDw9IHNjYWxlX2ZhY3RvcjsKKwkJeF9lc3RbaSArIDFdID0gKCgoYWNjdW1fdHggKyBhY2N1bV9jbnQpIC8gYWNjdW1fY250KSArIDMyKSA+PgorCQkgICAgc2NhbGVfZmFjdG9yOworCisJCVlbaSArIDFdID0gKCgoKGFjY3VtX3J4ICsgYWNjdW1fY250KSAvIGFjY3VtX2NudCkgKyAzMikgPj4KKwkJCSAgICBzY2FsZV9mYWN0b3IpICsKKwkJCSAgICAoMSA8PCBzY2FsZV9mYWN0b3IpICogbWF4X2luZGV4ICsgMTY7CisKKwkJaWYgKGFjY3VtX2FuZyA+PSAoMSA8PCAyNikpCisJCQlhY2N1bV9hbmcgLT0gMSA8PCAyNzsKKworCQl0aGV0YVtpICsgMV0gPSAoKGFjY3VtX2FuZyAqICgxIDw8IHNjYWxlX2ZhY3RvcikpICsgYWNjdW1fY250KSAvCisJCSAgICBhY2N1bV9jbnQ7CisKKwkJbWF4X2luZGV4Kys7CisJfQorCisJLyoKKwkgKiBGaW5kIGF2ZXJhZ2UgdGhldGEgb2YgZmlyc3QgNSBiaW4gYW5kIGFsbCBvZiB0aG9zZSB0byBzYW1lIHZhbHVlLgorCSAqIEN1cnZlIGlzIGxpbmVhciBhdCB0aGF0IHJhbmdlLgorCSAqLworCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspCisJCXRoZXRhX2xvd19iaW4gKz0gdGhldGFbaV07CisKKwl0aGV0YV9sb3dfYmluID0gdGhldGFfbG93X2JpbiAvIDU7CisJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKKwkJdGhldGFbaV0gPSB0aGV0YV9sb3dfYmluOworCisJLyogU2V0IHZhbHVlcyBhdCBvcmlnaW4gKi8KKwl0aGV0YVswXSA9IHRoZXRhX2xvd19iaW47CisJZm9yIChpID0gMDsgaSA8PSBtYXhfaW5kZXg7IGkrKykKKwkJdGhldGFbaV0gLT0gdGhldGFfbG93X2JpbjsKKworCXhfZXN0WzBdID0gMDsKKwlZWzBdID0gMDsKKwlzY2FsZV9mYWN0b3IgPSA4OworCisJLyogbG93IHNpZ25hbCBnYWluICovCisJaWYgKHhfZXN0WzZdID09IHhfZXN0WzNdKQorCQlyZXR1cm4gZmFsc2U7CisKKwlHX2Z4cCA9CisJICAgICgoKFlbNl0gLSBZWzNdKSAqIDEgPDwgc2NhbGVfZmFjdG9yKSArCisJICAgICAoeF9lc3RbNl0gLSB4X2VzdFszXSkpIC8gKHhfZXN0WzZdIC0geF9lc3RbM10pOworCisJWV9pbnRlcmNlcHQgPQorCSAgICAoR19meHAgKiAoeF9lc3RbMF0gLSB4X2VzdFszXSkgKworCSAgICAgKDEgPDwgc2NhbGVfZmFjdG9yKSkgLyAoMSA8PCBzY2FsZV9mYWN0b3IpICsgWVszXTsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4X2luZGV4OyBpKyspCisJCXlfZXN0W2ldID0gWVtpXSAtIFlfaW50ZXJjZXB0OworCisJZm9yIChpID0gMDsgaSA8PSAzOyBpKyspIHsKKwkJeV9lc3RbaV0gPSBpICogMzI7CisKKwkJLyogcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvICovCisJCWlmIChHX2Z4cCA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXhfZXN0W2ldID0gKCh5X2VzdFtpXSAqIDEgPDwgc2NhbGVfZmFjdG9yKSArIEdfZnhwKSAvIEdfZnhwOworCX0KKworCXhfZXN0X2Z4cDFfbm9ubGluID0KKwkgICAgeF9lc3RbbWF4X2luZGV4XSAtICgoMSA8PCBzY2FsZV9mYWN0b3IpICogeV9lc3RbbWF4X2luZGV4XSArCisJCQkJR19meHApIC8gR19meHA7CisKKwlvcmRlcl94X2J5X3kgPQorCSAgICAoeF9lc3RfZnhwMV9ub25saW4gKyB5X2VzdFttYXhfaW5kZXhdKSAvIHlfZXN0W21heF9pbmRleF07CisKKwlpZiAob3JkZXJfeF9ieV95ID09IDApCisJCU0gPSAxMDsKKwllbHNlIGlmIChvcmRlcl94X2J5X3kgPT0gMSkKKwkJTSA9IDk7CisJZWxzZQorCQlNID0gODsKKworCUkgPSAobWF4X2luZGV4ID4gMTUpID8gNyA6IG1heF9pbmRleCA+PiAxOworCUwgPSBtYXhfaW5kZXggLSBJOworCXNjYWxlX2ZhY3RvciA9IDg7CisJc3VtX3lfc3FyID0gMDsKKwlzdW1feV9xdWFkID0gMDsKKwl4X3RpbGRlX2FicyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEw7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgeV9zcXI7CisJCXVuc2lnbmVkIGludCB5X3F1YWQ7CisJCXVuc2lnbmVkIGludCB0bXBfYWJzOworCisJCS8qIHByZXZlbnQgZGl2aXNpb24gYnkgemVybyAqLworCQlpZiAoeV9lc3RbaSArIEldID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJeF9lc3RfZnhwMV9ub25saW4gPQorCQkgICAgeF9lc3RbaSArIEldIC0gKCgxIDw8IHNjYWxlX2ZhY3RvcikgKiB5X2VzdFtpICsgSV0gKworCQkJCSAgICBHX2Z4cCkgLyBHX2Z4cDsKKworCQl4X3RpbGRlW2ldID0KKwkJICAgICh4X2VzdF9meHAxX25vbmxpbiAqICgxIDw8IE0pICsgeV9lc3RbaSArIEldKSAvIHlfZXN0W2kgKworCQkJCQkJCQkJICBJXTsKKwkJeF90aWxkZVtpXSA9CisJCSAgICAoeF90aWxkZVtpXSAqICgxIDw8IE0pICsgeV9lc3RbaSArIEldKSAvIHlfZXN0W2kgKyBJXTsKKwkJeF90aWxkZVtpXSA9CisJCSAgICAoeF90aWxkZVtpXSAqICgxIDw8IE0pICsgeV9lc3RbaSArIEldKSAvIHlfZXN0W2kgKyBJXTsKKwkJeV9zcXIgPQorCQkgICAgKHlfZXN0W2kgKyBJXSAqIHlfZXN0W2kgKyBJXSArCisJCSAgICAgKHNjYWxlX2ZhY3RvciAqIHNjYWxlX2ZhY3RvcikpIC8gKHNjYWxlX2ZhY3RvciAqCisJCQkJCQkgICAgICAgc2NhbGVfZmFjdG9yKTsKKwkJdG1wX2FicyA9IGFicyh4X3RpbGRlW2ldKTsKKwkJaWYgKHRtcF9hYnMgPiB4X3RpbGRlX2FicykKKwkJCXhfdGlsZGVfYWJzID0gdG1wX2FiczsKKworCQl5X3F1YWQgPSB5X3NxciAqIHlfc3FyOworCQlzdW1feV9zcXIgPSBzdW1feV9zcXIgKyB5X3NxcjsKKwkJc3VtX3lfcXVhZCA9IHN1bV95X3F1YWQgKyB5X3F1YWQ7CisJCUIxX3RtcFtpXSA9IHlfc3FyICogKEwgKyAxKTsKKwkJQjJfdG1wW2ldID0geV9zcXI7CisJfQorCisJQjFfYWJzX21heCA9IDA7CisJQjJfYWJzX21heCA9IDA7CisJZm9yIChpID0gMDsgaSA8PSBMOyBpKyspIHsKKwkJaW50IGFic192YWw7CisKKwkJQjFfdG1wW2ldIC09IHN1bV95X3NxcjsKKwkJQjJfdG1wW2ldID0gc3VtX3lfcXVhZCAtIHN1bV95X3NxciAqIEIyX3RtcFtpXTsKKworCQlhYnNfdmFsID0gYWJzKEIxX3RtcFtpXSk7CisJCWlmIChhYnNfdmFsID4gQjFfYWJzX21heCkKKwkJCUIxX2Fic19tYXggPSBhYnNfdmFsOworCisJCWFic192YWwgPSBhYnMoQjJfdG1wW2ldKTsKKwkJaWYgKGFic192YWwgPiBCMl9hYnNfbWF4KQorCQkJQjJfYWJzX21heCA9IGFic192YWw7CisJfQorCisJUV94ID0gZmluZF9wcm9wZXJfc2NhbGUoZmluZF9leHBuKHhfdGlsZGVfYWJzKSwgMTApOworCVFfQjEgPSBmaW5kX3Byb3Blcl9zY2FsZShmaW5kX2V4cG4oQjFfYWJzX21heCksIDEwKTsKKwlRX0IyID0gZmluZF9wcm9wZXJfc2NhbGUoZmluZF9leHBuKEIyX2Fic19tYXgpLCAxMCk7CisKKwliZXRhX3JhdyA9IDA7CisJYWxwaGFfcmF3ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDw9IEw7IGkrKykgeworCQl4X3RpbGRlW2ldID0geF90aWxkZVtpXSAvICgxIDw8IFFfeCk7CisJCUIxX3RtcFtpXSA9IEIxX3RtcFtpXSAvICgxIDw8IFFfQjEpOworCQlCMl90bXBbaV0gPSBCMl90bXBbaV0gLyAoMSA8PCBRX0IyKTsKKwkJYmV0YV9yYXcgPSBiZXRhX3JhdyArIEIxX3RtcFtpXSAqIHhfdGlsZGVbaV07CisJCWFscGhhX3JhdyA9IGFscGhhX3JhdyArIEIyX3RtcFtpXSAqIHhfdGlsZGVbaV07CisJfQorCisJc2NhbGVfQiA9CisJICAgICgoc3VtX3lfcXVhZCAvIHNjYWxlX2ZhY3RvcikgKiAoTCArIDEpIC0KKwkgICAgIChzdW1feV9zcXIgLyBzY2FsZV9mYWN0b3IpICogc3VtX3lfc3FyKSAqIHNjYWxlX2ZhY3RvcjsKKworCVFfc2NhbGVfQiA9IGZpbmRfcHJvcGVyX3NjYWxlKGZpbmRfZXhwbihhYnMoc2NhbGVfQikpLCAxMCk7CisJc2NhbGVfQiA9IHNjYWxlX0IgLyAoMSA8PCBRX3NjYWxlX0IpOworCVFfYmV0YSA9IGZpbmRfcHJvcGVyX3NjYWxlKGZpbmRfZXhwbihhYnMoYmV0YV9yYXcpKSwgMTApOworCVFfYWxwaGEgPSBmaW5kX3Byb3Blcl9zY2FsZShmaW5kX2V4cG4oYWJzKGFscGhhX3JhdykpLCAxMCk7CisJYmV0YV9yYXcgPSBiZXRhX3JhdyAvICgxIDw8IFFfYmV0YSk7CisJYWxwaGFfcmF3ID0gYWxwaGFfcmF3IC8gKDEgPDwgUV9hbHBoYSk7CisJYWxwaGEgPSAoYWxwaGFfcmF3IDw8IDEwKSAvIHNjYWxlX0I7CisJYmV0YSA9IChiZXRhX3JhdyA8PCAxMCkgLyBzY2FsZV9COworCW9yZGVyXzEgPSAzICogTSAtIFFfeCAtIFFfQjEgLSBRX2JldGEgKyAxMCArIFFfc2NhbGVfQjsKKwlvcmRlcl8yID0gMyAqIE0gLSBRX3ggLSBRX0IyIC0gUV9hbHBoYSArIDEwICsgUV9zY2FsZV9COworCW9yZGVyMV81eCA9IG9yZGVyXzEgLyA1OworCW9yZGVyMl8zeCA9IG9yZGVyXzIgLyAzOworCW9yZGVyMV81eF9yZW0gPSBvcmRlcl8xIC0gNSAqIG9yZGVyMV81eDsKKwlvcmRlcjJfM3hfcmVtID0gb3JkZXJfMiAtIDMgKiBvcmRlcjJfM3g7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFQUkRfVEFCTEVfU1o7IGkrKykgeworCQl0bXAgPSBpICogMzI7CisJCXk1ID0gKChiZXRhICogdG1wKSA+PiA2KSA+PiBvcmRlcjFfNXg7CisJCXk1ID0gKHk1ICogdG1wKSA+PiBvcmRlcjFfNXg7CisJCXk1ID0gKHk1ICogdG1wKSA+PiBvcmRlcjFfNXg7CisJCXk1ID0gKHk1ICogdG1wKSA+PiBvcmRlcjFfNXg7CisJCXk1ID0gKHk1ICogdG1wKSA+PiBvcmRlcjFfNXg7CisJCXk1ID0geTUgPj4gb3JkZXIxXzV4X3JlbTsKKwkJeTMgPSAoYWxwaGEgKiB0bXApID4+IG9yZGVyMl8zeDsKKwkJeTMgPSAoeTMgKiB0bXApID4+IG9yZGVyMl8zeDsKKwkJeTMgPSAoeTMgKiB0bXApID4+IG9yZGVyMl8zeDsKKwkJeTMgPSB5MyA+PiBvcmRlcjJfM3hfcmVtOworCQlQQV9pbltpXSA9IHk1ICsgeTMgKyAoMjU2ICogdG1wKSAvIEdfZnhwOworCisJCWlmIChpID49IDIpIHsKKwkJCXRtcCA9IFBBX2luW2ldIC0gUEFfaW5baSAtIDFdOworCQkJaWYgKHRtcCA8IDApCisJCQkJUEFfaW5baV0gPQorCQkJCSAgICBQQV9pbltpIC0gMV0gKyAoUEFfaW5baSAtIDFdIC0KKwkJCQkJCSAgICBQQV9pbltpIC0gMl0pOworCQl9CisKKwkJUEFfaW5baV0gPSAoUEFfaW5baV0gPCAxNDAwKSA/IFBBX2luW2ldIDogMTQwMDsKKwl9CisKKwliZXRhX3JhdyA9IDA7CisJYWxwaGFfcmF3ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPD0gTDsgaSsrKSB7CisJCWludCB0aGV0YV90aWxkZSA9CisJCSAgICAoKHRoZXRhW2kgKyBJXSA8PCBNKSArIHlfZXN0W2kgKyBJXSkgLyB5X2VzdFtpICsgSV07CisJCXRoZXRhX3RpbGRlID0KKwkJICAgICgodGhldGFfdGlsZGUgPDwgTSkgKyB5X2VzdFtpICsgSV0pIC8geV9lc3RbaSArIEldOworCQl0aGV0YV90aWxkZSA9CisJCSAgICAoKHRoZXRhX3RpbGRlIDw8IE0pICsgeV9lc3RbaSArIEldKSAvIHlfZXN0W2kgKyBJXTsKKwkJYmV0YV9yYXcgPSBiZXRhX3JhdyArIEIxX3RtcFtpXSAqIHRoZXRhX3RpbGRlOworCQlhbHBoYV9yYXcgPSBhbHBoYV9yYXcgKyBCMl90bXBbaV0gKiB0aGV0YV90aWxkZTsKKwl9CisKKwlRX2JldGEgPSBmaW5kX3Byb3Blcl9zY2FsZShmaW5kX2V4cG4oYWJzKGJldGFfcmF3KSksIDEwKTsKKwlRX2FscGhhID0gZmluZF9wcm9wZXJfc2NhbGUoZmluZF9leHBuKGFicyhhbHBoYV9yYXcpKSwgMTApOworCWJldGFfcmF3ID0gYmV0YV9yYXcgLyAoMSA8PCBRX2JldGEpOworCWFscGhhX3JhdyA9IGFscGhhX3JhdyAvICgxIDw8IFFfYWxwaGEpOworCisJYWxwaGEgPSAoYWxwaGFfcmF3IDw8IDEwKSAvIHNjYWxlX0I7CisJYmV0YSA9IChiZXRhX3JhdyA8PCAxMCkgLyBzY2FsZV9COworCW9yZGVyXzEgPSAzICogTSAtIFFfeCAtIFFfQjEgLSBRX2JldGEgKyAxMCArIFFfc2NhbGVfQiArIDU7CisJb3JkZXJfMiA9IDMgKiBNIC0gUV94IC0gUV9CMiAtIFFfYWxwaGEgKyAxMCArIFFfc2NhbGVfQiArIDU7CisJb3JkZXIxXzV4ID0gb3JkZXJfMSAvIDU7CisJb3JkZXIyXzN4ID0gb3JkZXJfMiAvIDM7CisJb3JkZXIxXzV4X3JlbSA9IG9yZGVyXzEgLSA1ICogb3JkZXIxXzV4OworCW9yZGVyMl8zeF9yZW0gPSBvcmRlcl8yIC0gMyAqIG9yZGVyMl8zeDsKKworCWZvciAoaSA9IDA7IGkgPCBQQVBSRF9UQUJMRV9TWjsgaSsrKSB7CisJCWludCBQQV9hbmdsZTsKKworCQkvKiBwYV90YWJsZVs0XSBpcyBjYWxjdWxhdGVkIGZyb20gUEFfYW5nbGUgZm9yIGk9NSAqLworCQlpZiAoaSA9PSA0KQorCQkJY29udGludWU7CisKKwkJdG1wID0gaSAqIDMyOworCQlpZiAoYmV0YSA+IDApCisJCQl5NSA9ICgoKGJldGEgKiB0bXAgLSA2NCkgPj4gNikgLQorCQkJICAgICAgKDEgPDwgb3JkZXIxXzV4KSkgLyAoMSA8PCBvcmRlcjFfNXgpOworCQllbHNlCisJCQl5NSA9ICgoKChiZXRhICogdG1wIC0gNjQpID4+IDYpICsKKwkJCSAgICAgICAoMSA8PCBvcmRlcjFfNXgpKSAvICgxIDw8IG9yZGVyMV81eCkpOworCisJCXk1ID0gKHk1ICogdG1wKSAvICgxIDw8IG9yZGVyMV81eCk7CisJCXk1ID0gKHk1ICogdG1wKSAvICgxIDw8IG9yZGVyMV81eCk7CisJCXk1ID0gKHk1ICogdG1wKSAvICgxIDw8IG9yZGVyMV81eCk7CisJCXk1ID0gKHk1ICogdG1wKSAvICgxIDw8IG9yZGVyMV81eCk7CisJCXk1ID0geTUgLyAoMSA8PCBvcmRlcjFfNXhfcmVtKTsKKworCQlpZiAoYmV0YSA+IDApCisJCQl5MyA9IChhbHBoYSAqIHRtcCAtCisJCQkgICAgICAoMSA8PCBvcmRlcjJfM3gpKSAvICgxIDw8IG9yZGVyMl8zeCk7CisJCWVsc2UKKwkJCXkzID0gKGFscGhhICogdG1wICsKKwkJCSAgICAgICgxIDw8IG9yZGVyMl8zeCkpIC8gKDEgPDwgb3JkZXIyXzN4KTsKKwkJeTMgPSAoeTMgKiB0bXApIC8gKDEgPDwgb3JkZXIyXzN4KTsKKwkJeTMgPSAoeTMgKiB0bXApIC8gKDEgPDwgb3JkZXIyXzN4KTsKKwkJeTMgPSB5MyAvICgxIDw8IG9yZGVyMl8zeF9yZW0pOworCisJCWlmIChpIDwgNCkgeworCQkJUEFfYW5nbGUgPSAwOworCQl9IGVsc2UgeworCQkJUEFfYW5nbGUgPSB5NSArIHkzOworCQkJaWYgKFBBX2FuZ2xlIDwgLTE1MCkKKwkJCQlQQV9hbmdsZSA9IC0xNTA7CisJCQllbHNlIGlmIChQQV9hbmdsZSA+IDE1MCkKKwkJCQlQQV9hbmdsZSA9IDE1MDsKKwkJfQorCisJCXBhX3RhYmxlW2ldID0gKChQQV9pbltpXSAmIDB4N2ZmKSA8PCAxMSkgKyAoUEFfYW5nbGUgJiAweDdmZik7CisJCWlmIChpID09IDUpIHsKKwkJCVBBX2FuZ2xlID0gKFBBX2FuZ2xlICsgMikgPj4gMTsKKwkJCXBhX3RhYmxlW2kgLSAxXSA9ICgoUEFfaW5baSAtIDFdICYgMHg3ZmYpIDw8IDExKSArCisJCQkgICAgKFBBX2FuZ2xlICYgMHg3ZmYpOworCQl9CisJfQorCisJKmdhaW4gPSBHX2Z4cDsKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBhcjkwMDNfcGFwcmRfcG9wdWxhdGVfc2luZ2xlX3RhYmxlKHN0cnVjdCBhdGhfaHcgKmFoLAorCQkJCQlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwgaW50IGNoYWluKQoreworCXUzMiAqcGFwcmRfdGFibGVfdmFsID0gY2hhbi0+cGFfdGFibGVbY2hhaW5dOworCXUzMiBzbWFsbF9zaWduYWxfZ2FpbiA9IGNoYW4tPnNtYWxsX3NpZ25hbF9nYWluW2NoYWluXTsKKwl1MzIgdHJhaW5pbmdfcG93ZXI7CisJdTMyIHJlZyA9IDA7CisJaW50IGk7CisKKwl0cmFpbmluZ19wb3dlciA9CisJICAgIFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9QSFlfUE9XRVJUWF9SQVRFNSwKKwkJCSAgIEFSX1BIWV9QT1dFUlRYX1JBVEU1X1BPV0VSVFhIVDIwXzApOworCXRyYWluaW5nX3Bvd2VyIC09IDQ7CisKKwlpZiAoY2hhaW4gPT0gMCkKKwkJcmVnID0gQVJfUEhZX1BBUFJEX01FTV9UQUJfQjA7CisJZWxzZSBpZiAoY2hhaW4gPT0gMSkKKwkJcmVnID0gQVJfUEhZX1BBUFJEX01FTV9UQUJfQjE7CisJZWxzZSBpZiAoY2hhaW4gPT0gMikKKwkJcmVnID0gQVJfUEhZX1BBUFJEX01FTV9UQUJfQjI7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFQUkRfVEFCTEVfU1o7IGkrKykgeworCQlSRUdfV1JJVEUoYWgsIHJlZywgcGFwcmRfdGFibGVfdmFsW2ldKTsKKwkJcmVnID0gcmVnICsgNDsKKwl9CisKKwlpZiAoY2hhaW4gPT0gMCkKKwkJcmVnID0gQVJfUEhZX1BBX0dBSU4xMjNfQjA7CisJZWxzZSBpZiAoY2hhaW4gPT0gMSkKKwkJcmVnID0gQVJfUEhZX1BBX0dBSU4xMjNfQjE7CisJZWxzZQorCQlyZWcgPSBBUl9QSFlfUEFfR0FJTjEyM19CMjsKKworCVJFR19STVdfRklFTEQoYWgsIHJlZywgQVJfUEhZX1BBX0dBSU4xMjNfUEFfR0FJTjEsIHNtYWxsX3NpZ25hbF9nYWluKTsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9DVFJMMV9CMCwKKwkJICAgICAgQVJfUEhZX1BBUFJEX0NUUkwxX1BBUFJEX1BPV0VSX0FUX0FNMkFNX0NBTCwKKwkJICAgICAgdHJhaW5pbmdfcG93ZXIpOworCisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX0NUUkwxX0IxLAorCQkgICAgICBBUl9QSFlfUEFQUkRfQ1RSTDFfUEFQUkRfUE9XRVJfQVRfQU0yQU1fQ0FMLAorCQkgICAgICB0cmFpbmluZ19wb3dlcik7CisKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfQ1RSTDFfQjIsCisJCSAgICAgIEFSX1BIWV9QQVBSRF9DVFJMMV9QQVBSRF9QT1dFUl9BVF9BTTJBTV9DQUwsCisJCSAgICAgIHRyYWluaW5nX3Bvd2VyKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX3BhcHJkX3BvcHVsYXRlX3NpbmdsZV90YWJsZSk7CisKK2ludCBhcjkwMDNfcGFwcmRfc2V0dXBfZ2Fpbl90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCwgaW50IGNoYWluKQoreworCisJdW5zaWduZWQgaW50IGksIGRlc2lyZWRfZ2FpbiwgZ2Fpbl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgdHJhaW5fcG93ZXI7CisKKwl0cmFpbl9wb3dlciA9IFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9QSFlfUE9XRVJUWF9SQVRFNSwKKwkJCQkgICAgIEFSX1BIWV9QT1dFUlRYX1JBVEU1X1BPV0VSVFhIVDIwXzApOworCisJdHJhaW5fcG93ZXIgPSB0cmFpbl9wb3dlciAtIDQ7CisKKwlkZXNpcmVkX2dhaW4gPSBhcjkwMDNfZ2V0X2Rlc2lyZWRfZ2FpbihhaCwgY2hhaW4sIHRyYWluX3Bvd2VyKTsKKworCWdhaW5faW5kZXggPSAwOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChhaC0+cGFwcmRfZ2Fpbl90YWJsZV9pbmRleFtpXSA+PSBkZXNpcmVkX2dhaW4pCisJCQlicmVhazsKKwkJZ2Fpbl9pbmRleCsrOworCX0KKworCWFyOTAwM190eF9mb3JjZV9nYWluKGFoLCBnYWluX2luZGV4KTsKKworCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMSwKKwkJCUFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1RSQUlOX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19wYXByZF9zZXR1cF9nYWluX3RhYmxlKTsKKworaW50IGFyOTAwM19wYXByZF9jcmVhdGVfY3VydmUoc3RydWN0IGF0aF9odyAqYWgsIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAorCQkJICAgICAgaW50IGNoYWluKQoreworCXUxNiAqc21hbGxfc2lnbmFsX2dhaW4gPSAmY2hhbi0+c21hbGxfc2lnbmFsX2dhaW5bY2hhaW5dOworCXUzMiAqcGFfdGFibGUgPSBjaGFuLT5wYV90YWJsZVtjaGFpbl07CisJdTMyICpkYXRhX0wsICpkYXRhX1U7CisJaW50IGksIHN0YXR1cyA9IDA7CisJdTMyICpidWY7CisJdTMyIHJlZzsKKworCW1lbXNldChjaGFuLT5wYV90YWJsZVtjaGFpbl0sIDAsIHNpemVvZihjaGFuLT5wYV90YWJsZVtjaGFpbl0pKTsKKworCWJ1ZiA9IGttYWxsb2MoMiAqIDQ4ICogc2l6ZW9mKHUzMiksIEdGUF9BVE9NSUMpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGFfTCA9ICZidWZbMF07CisJZGF0YV9VID0gJmJ1Zls0OF07CisKKwlSRUdfQ0xSX0JJVChhaCwgQVJfUEhZX0NIQU5fSU5GT19NRU1PUlksCisJCSAgICBBUl9QSFlfQ0hBTl9JTkZPX01FTU9SWV9DSEFOSU5GT01FTV9TMl9SRUFEKTsKKworCXJlZyA9IEFSX1BIWV9DSEFOX0lORk9fVEFCXzA7CisJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspCisJCWRhdGFfTFtpXSA9IFJFR19SRUFEKGFoLCByZWcgKyAoaSA8PCAyKSk7CisKKwlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX0NIQU5fSU5GT19NRU1PUlksCisJCSAgICBBUl9QSFlfQ0hBTl9JTkZPX01FTU9SWV9DSEFOSU5GT01FTV9TMl9SRUFEKTsKKworCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKQorCQlkYXRhX1VbaV0gPSBSRUdfUkVBRChhaCwgcmVnICsgKGkgPDwgMikpOworCisJaWYgKCFjcmVhdGVfcGFfY3VydmUoZGF0YV9MLCBkYXRhX1UsIHBhX3RhYmxlLCBzbWFsbF9zaWduYWxfZ2FpbikpCisJCXN0YXR1cyA9IC0yOworCisJUkVHX0NMUl9CSVQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxLAorCQkgICAgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDFfUEFQUkRfVFJBSU5fRE9ORSk7CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX3BhcHJkX2NyZWF0ZV9jdXJ2ZSk7CisKK2ludCBhcjkwMDNfcGFwcmRfaW5pdF90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlhcjkwMDNfcGFwcmRfc2V0dXBfc2luZ2xlX3RhYmxlKGFoKTsKKwlhcjkwMDNfcGFwcmRfZ2V0X2dhaW5fdGFibGUoYWgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhcjkwMDNfcGFwcmRfaW5pdF90YWJsZSk7CisKK2Jvb2wgYXI5MDAzX3BhcHJkX2lzX2RvbmUoc3RydWN0IGF0aF9odyAqYWgpCit7CisJcmV0dXJuICEhUkVHX1JFQURfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxLAorCQkJCUFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1RSQUlOX0RPTkUpOworfQorRVhQT1JUX1NZTUJPTChhcjkwMDNfcGFwcmRfaXNfZG9uZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwppbmRleCA4MDQzMWEyLi5hNzUzYTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKQEAgLTE3LDYgKzE3LDI4IEBACiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCiAKK3N0YXRpYyBjb25zdCBpbnQgZmlyc3RlcF90YWJsZVtdID0KKy8qIGxldmVsOiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAqLworCXsgLTQsIC0yLCAgMCwgIDIsICA0LCAgNiwgIDgsIDEwLCAxMiB9OyAvKiBsdmwgMC04LCBkZWZhdWx0IDIgKi8KKworc3RhdGljIGNvbnN0IGludCBjeWNwd3JUaHIxX3RhYmxlW10gPQorLyogbGV2ZWw6ICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICovCisJeyAtNiwgLTQsIC0yLCAgMCwgIDIsICA0LCAgNiwgIDggfTsgICAgIC8qIGx2bCAwLTcsIGRlZmF1bHQgMyAqLworCisvKgorICogcmVnaXN0ZXIgdmFsdWVzIHRvIHR1cm4gT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gT0ZGCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgbTFUaHJlc2hMb3dfb2ZmID0gMTI3Oworc3RhdGljIGNvbnN0IGludCBtMlRocmVzaExvd19vZmYgPSAxMjc7CitzdGF0aWMgY29uc3QgaW50IG0xVGhyZXNoX29mZiA9IDEyNzsKK3N0YXRpYyBjb25zdCBpbnQgbTJUaHJlc2hfb2ZmID0gMTI3Oworc3RhdGljIGNvbnN0IGludCBtMkNvdW50VGhyX29mZiA9ICAzMTsKK3N0YXRpYyBjb25zdCBpbnQgbTJDb3VudFRockxvd19vZmYgPSAgNjM7CitzdGF0aWMgY29uc3QgaW50IG0xVGhyZXNoTG93RXh0X29mZiA9IDEyNzsKK3N0YXRpYyBjb25zdCBpbnQgbTJUaHJlc2hMb3dFeHRfb2ZmID0gMTI3Oworc3RhdGljIGNvbnN0IGludCBtMVRocmVzaEV4dF9vZmYgPSAxMjc7CitzdGF0aWMgY29uc3QgaW50IG0yVGhyZXNoRXh0X29mZiA9IDEyNzsKKwogLyoqCiAgKiBhcjkwMDNfaHdfc2V0X2NoYW5uZWwgLSBzZXQgY2hhbm5lbCBvbiBzaW5nbGUtY2hpcCBkZXZpY2UKICAqIEBhaDogYXRoZXJvcyBoYXJkd2FyZSBzdHJ1Y3R1cmUKQEAgLTk0LDcgKzExNiw3IEBACiB9CiAKIC8qKgotICogYXI5MDAzX2h3X3NwdXJfbWl0aWdhdGUgLSBjb252ZXJ0IGJhc2ViYW5kIHNwdXIgZnJlcXVlbmN5CisgKiBhcjkwMDNfaHdfc3B1cl9taXRpZ2F0ZV9tcmNfY2NrIC0gY29udmVydCBiYXNlYmFuZCBzcHVyIGZyZXF1ZW5jeQogICogQGFoOiBhdGhlcm9zIGhhcmR3YXJlIHN0cnVjdHVyZQogICogQGNoYW46CiAgKgpAQCAtNTIxLDE1ICs1NDMsNiBAQAogCQl1MzIgdmFsID0gSU5JX1JBKGluaUFyciwgaSwgY29sdW1uKTsKIAogCQlSRUdfV1JJVEUoYWgsIHJlZywgdmFsKTsKLQotCQkvKgotCQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHNoaWZ0IHJlZ2lzdGVyIHZhbHVlLCBhbmQgaW5zZXJ0IHRoZQotCQkgKiBjb25maWd1cmVkIGRlbGF5IGlmIHNvLgotCQkgKi8KLQkJaWYgKHJlZyA+PSAweDE2MDAwICYmIHJlZyA8IDB4MTcwMDAKLQkJICAgICYmIGFoLT5jb25maWcuYW5hbG9nX3NoaWZ0cmVnKQotCQkJdWRlbGF5KDEwMCk7Ci0KIAkJRE9fREVMQVkocmVnV3JpdGVzKTsKIAl9CiB9CkBAIC03MzIsNzEgKzc0NSw2OCBAQAogewogCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGUgPSBhaC0+Y3VyYW5pOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuID0gYWgtPmN1cmNoYW47CisJczMyIHZhbHVlLCB2YWx1ZTI7CiAKIAlzd2l0Y2ggKGNtZCAmIGFoLT5hbmlfZnVuY3Rpb24pIHsKLQljYXNlIEFUSDlLX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTDp7Ci0JCXUzMiBsZXZlbCA9IHBhcmFtOwotCi0JCWlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKGFoLT50b3RhbFNpemVEZXNpcmVkKSkgewotCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCQkJICAibGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV1KVxuIiwKLQkJCQkgIGxldmVsLAotCQkJCSAgKHVuc2lnbmVkKUFSUkFZX1NJWkUoYWgtPnRvdGFsU2l6ZURlc2lyZWQpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9ERVNJUkVEX1NaLAotCQkJICAgICAgQVJfUEhZX0RFU0lSRURfU1pfVE9UX0RFUywKLQkJCSAgICAgIGFoLT50b3RhbFNpemVEZXNpcmVkW2xldmVsXSk7Ci0JCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9BR0MsCi0JCQkgICAgICBBUl9QSFlfQUdDX0NPQVJTRV9MT1csCi0JCQkgICAgICBhaC0+Y29hcnNlX2xvd1tsZXZlbF0pOwotCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfQUdDLAotCQkJICAgICAgQVJfUEhZX0FHQ19DT0FSU0VfSElHSCwKLQkJCSAgICAgIGFoLT5jb2Fyc2VfaGlnaFtsZXZlbF0pOwotCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfRklORF9TSUcsCi0JCQkgICAgICBBUl9QSFlfRklORF9TSUdfRklSUFdSLCBhaC0+ZmlycHdyW2xldmVsXSk7Ci0KLQkJaWYgKGxldmVsID4gYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCkKLQkJCWFoLT5zdGF0cy5hc3RfYW5pX25pdXArKzsKLQkJZWxzZSBpZiAobGV2ZWwgPCBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsKQotCQkJYWgtPnN0YXRzLmFzdF9hbmlfbmlkb3duKys7Ci0JCWFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPSBsZXZlbDsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgQVRIOUtfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OOnsKLQkJY29uc3QgaW50IG0xVGhyZXNoTG93W10gPSB7IDEyNywgNTAgfTsKLQkJY29uc3QgaW50IG0yVGhyZXNoTG93W10gPSB7IDEyNywgNDAgfTsKLQkJY29uc3QgaW50IG0xVGhyZXNoW10gPSB7IDEyNywgMHg0ZCB9OwotCQljb25zdCBpbnQgbTJUaHJlc2hbXSA9IHsgMTI3LCAweDQwIH07Ci0JCWNvbnN0IGludCBtMkNvdW50VGhyW10gPSB7IDMxLCAxNiB9OwotCQljb25zdCBpbnQgbTJDb3VudFRockxvd1tdID0geyA2MywgNDggfTsKKwkJLyoKKwkJICogb24gPT0gMSBtZWFucyBvZmRtIHdlYWsgc2lnbmFsIGRldGVjdGlvbiBpcyBPTgorCQkgKiBvbiA9PSAxIGlzIHRoZSBkZWZhdWx0LCBmb3IgbGVzcyBub2lzZSBpbW11bml0eQorCQkgKgorCQkgKiBvbiA9PSAwIG1lYW5zIG9mZG0gd2VhayBzaWduYWwgZGV0ZWN0aW9uIGlzIE9GRgorCQkgKiBvbiA9PSAwIG1lYW5zIG1vcmUgbm9pc2UgaW1tCisJCSAqLwogCQl1MzIgb24gPSBwYXJhbSA/IDEgOiAwOworCQkvKgorCQkgKiBtYWtlIHJlZ2lzdGVyIHNldHRpbmcgZm9yIGRlZmF1bHQKKwkJICogKHdlYWsgc2lnIGRldGVjdCBPTikgY29tZSBmcm9tIElOSSBmaWxlCisJCSAqLworCQlpbnQgbTFUaHJlc2hMb3cgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0xVGhyZXNoTG93IDogbTFUaHJlc2hMb3dfb2ZmOworCQlpbnQgbTJUaHJlc2hMb3cgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0yVGhyZXNoTG93IDogbTJUaHJlc2hMb3dfb2ZmOworCQlpbnQgbTFUaHJlc2ggPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0xVGhyZXNoIDogbTFUaHJlc2hfb2ZmOworCQlpbnQgbTJUaHJlc2ggPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0yVGhyZXNoIDogbTJUaHJlc2hfb2ZmOworCQlpbnQgbTJDb3VudFRociA9IG9uID8KKwkJCWFuaVN0YXRlLT5pbmlEZWYubTJDb3VudFRociA6IG0yQ291bnRUaHJfb2ZmOworCQlpbnQgbTJDb3VudFRockxvdyA9IG9uID8KKwkJCWFuaVN0YXRlLT5pbmlEZWYubTJDb3VudFRockxvdyA6IG0yQ291bnRUaHJMb3dfb2ZmOworCQlpbnQgbTFUaHJlc2hMb3dFeHQgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0xVGhyZXNoTG93RXh0IDogbTFUaHJlc2hMb3dFeHRfb2ZmOworCQlpbnQgbTJUaHJlc2hMb3dFeHQgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0yVGhyZXNoTG93RXh0IDogbTJUaHJlc2hMb3dFeHRfb2ZmOworCQlpbnQgbTFUaHJlc2hFeHQgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0xVGhyZXNoRXh0IDogbTFUaHJlc2hFeHRfb2ZmOworCQlpbnQgbTJUaHJlc2hFeHQgPSBvbiA/CisJCQlhbmlTdGF0ZS0+aW5pRGVmLm0yVGhyZXNoRXh0IDogbTJUaHJlc2hFeHRfb2ZmOwogCiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlJfTE9XLAogCQkJICAgICAgQVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPVywKLQkJCSAgICAgIG0xVGhyZXNoTG93W29uXSk7CisJCQkgICAgICBtMVRocmVzaExvdyk7CiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlJfTE9XLAogCQkJICAgICAgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPVywKLQkJCSAgICAgIG0yVGhyZXNoTG93W29uXSk7CisJCQkgICAgICBtMlRocmVzaExvdyk7CiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlIsCi0JCQkgICAgICBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSCwgbTFUaHJlc2hbb25dKTsKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfTTFfVEhSRVNILCBtMVRocmVzaCk7CiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlIsCi0JCQkgICAgICBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCwgbTJUaHJlc2hbb25dKTsKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNILCBtMlRocmVzaCk7CiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlIsCi0JCQkgICAgICBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSLCBtMkNvdW50VGhyW29uXSk7CisJCQkgICAgICBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSLCBtMkNvdW50VGhyKTsKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1NGQ09SUl9MT1csCiAJCQkgICAgICBBUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1csCi0JCQkgICAgICBtMkNvdW50VGhyTG93W29uXSk7CisJCQkgICAgICBtMkNvdW50VGhyTG93KTsKIAogCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfU0ZDT1JSX0VYVCwKLQkJCSAgICAgIEFSX1BIWV9TRkNPUlJfRVhUX00xX1RIUkVTSF9MT1csIG0xVGhyZXNoTG93W29uXSk7CisJCQkgICAgICBBUl9QSFlfU0ZDT1JSX0VYVF9NMV9USFJFU0hfTE9XLCBtMVRocmVzaExvd0V4dCk7CiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9TRkNPUlJfRVhULAotCQkJICAgICAgQVJfUEhZX1NGQ09SUl9FWFRfTTJfVEhSRVNIX0xPVywgbTJUaHJlc2hMb3dbb25dKTsKKwkJCSAgICAgIEFSX1BIWV9TRkNPUlJfRVhUX00yX1RIUkVTSF9MT1csIG0yVGhyZXNoTG93RXh0KTsKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1NGQ09SUl9FWFQsCi0JCQkgICAgICBBUl9QSFlfU0ZDT1JSX0VYVF9NMV9USFJFU0gsIG0xVGhyZXNoW29uXSk7CisJCQkgICAgICBBUl9QSFlfU0ZDT1JSX0VYVF9NMV9USFJFU0gsIG0xVGhyZXNoRXh0KTsKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1NGQ09SUl9FWFQsCi0JCQkgICAgICBBUl9QSFlfU0ZDT1JSX0VYVF9NMl9USFJFU0gsIG0yVGhyZXNoW29uXSk7CisJCQkgICAgICBBUl9QSFlfU0ZDT1JSX0VYVF9NMl9USFJFU0gsIG0yVGhyZXNoRXh0KTsKIAogCQlpZiAob24pCiAJCQlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX1NGQ09SUl9MT1csCkBAIC04MDYsNiArODE2LDEyIEBACiAJCQkJICAgIEFSX1BIWV9TRkNPUlJfTE9XX1VTRV9TRUxGX0NPUlJfTE9XKTsKIAogCQlpZiAoIW9uICE9IGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikgeworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAiKiogY2ggJWQ6IG9mZG0gd2VhayBzaWduYWw6ICVzPT4lc1xuIiwKKwkJCQkgIGNoYW4tPmNoYW5uZWwsCisJCQkJICAhYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID8KKwkJCQkJIm9uIiA6ICJvZmYiLAorCQkJCSAgb24gPyAib24iIDogIm9mZiIpOwogCQkJaWYgKG9uKQogCQkJCWFoLT5zdGF0cy5hc3RfYW5pX29mZG1vbisrOwogCQkJZWxzZQpAQCAtODE0LDY0ICs4MzAsMTY3IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCWNhc2UgQVRIOUtfQU5JX0NDS19XRUFLX1NJR05BTF9USFI6ewotCQljb25zdCBpbnQgd2Vha1NpZ1RockNja1tdID0geyA4LCA2IH07Ci0JCXUzMiBoaWdoID0gcGFyYW0gPyAxIDogMDsKLQotCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfQ0NLX0RFVEVDVCwKLQkJCSAgICAgIEFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0ssCi0JCQkgICAgICB3ZWFrU2lnVGhyQ2NrW2hpZ2hdKTsKLQkJaWYgKGhpZ2ggIT0gYW5pU3RhdGUtPmNja1dlYWtTaWdUaHJlc2hvbGQpIHsKLQkJCWlmIChoaWdoKQotCQkJCWFoLT5zdGF0cy5hc3RfYW5pX2Nja2hpZ2grKzsKLQkJCWVsc2UKLQkJCQlhaC0+c3RhdHMuYXN0X2FuaV9jY2tsb3crKzsKLQkJCWFuaVN0YXRlLT5jY2tXZWFrU2lnVGhyZXNob2xkID0gaGlnaDsKLQkJfQotCQlicmVhazsKLQl9CiAJY2FzZSBBVEg5S19BTklfRklSU1RFUF9MRVZFTDp7Ci0JCWNvbnN0IGludCBmaXJzdGVwW10gPSB7IDAsIDQsIDggfTsKIAkJdTMyIGxldmVsID0gcGFyYW07CiAKLQkJaWYgKGxldmVsID49IEFSUkFZX1NJWkUoZmlyc3RlcCkpIHsKKwkJaWYgKGxldmVsID49IEFSUkFZX1NJWkUoZmlyc3RlcF90YWJsZSkpIHsKIAkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAotCQkJCSAgImxldmVsIG91dCBvZiByYW5nZSAoJXUgPiAldSlcbiIsCisJCQkJICAiQVRIOUtfQU5JX0ZJUlNURVBfTEVWRUw6IGxldmVsICIKKwkJCQkgICJvdXQgb2YgcmFuZ2UgKCV1ID4gJXUpXG4iLAogCQkJCSAgbGV2ZWwsCi0JCQkJICAodW5zaWduZWQpIEFSUkFZX1NJWkUoZmlyc3RlcCkpOworCQkJCSAgKHVuc2lnbmVkKSBBUlJBWV9TSVpFKGZpcnN0ZXBfdGFibGUpKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQorCisJCS8qCisJCSAqIG1ha2UgcmVnaXN0ZXIgc2V0dGluZyByZWxhdGl2ZSB0byBkZWZhdWx0CisJCSAqIGZyb20gSU5JIGZpbGUgJiBjYXAgdmFsdWUKKwkJICovCisJCXZhbHVlID0gZmlyc3RlcF90YWJsZVtsZXZlbF0gLQorCQkJZmlyc3RlcF90YWJsZVtBVEg5S19BTklfRklSU1RFUF9MVkxfTkVXXSArCisJCQlhbmlTdGF0ZS0+aW5pRGVmLmZpcnN0ZXA7CisJCWlmICh2YWx1ZSA8IEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUlOKQorCQkJdmFsdWUgPSBBVEg5S19TSUdfRklSU1RFUF9TRVRUSU5HX01JTjsKKwkJaWYgKHZhbHVlID4gQVRIOUtfU0lHX0ZJUlNURVBfU0VUVElOR19NQVgpCisJCQl2YWx1ZSA9IEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUFYOwogCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfRklORF9TSUcsCiAJCQkgICAgICBBUl9QSFlfRklORF9TSUdfRklSU1RFUCwKLQkJCSAgICAgIGZpcnN0ZXBbbGV2ZWxdKTsKLQkJaWYgKGxldmVsID4gYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkKLQkJCWFoLT5zdGF0cy5hc3RfYW5pX3N0ZXB1cCsrOwotCQllbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwpCi0JCQlhaC0+c3RhdHMuYXN0X2FuaV9zdGVwZG93bisrOwotCQlhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID0gbGV2ZWw7CisJCQkgICAgICB2YWx1ZSk7CisJCS8qCisJCSAqIHdlIG5lZWQgdG8gc2V0IGZpcnN0IHN0ZXAgbG93IHJlZ2lzdGVyIHRvbworCQkgKiBtYWtlIHJlZ2lzdGVyIHNldHRpbmcgcmVsYXRpdmUgdG8gZGVmYXVsdAorCQkgKiBmcm9tIElOSSBmaWxlICYgY2FwIHZhbHVlCisJCSAqLworCQl2YWx1ZTIgPSBmaXJzdGVwX3RhYmxlW2xldmVsXSAtCisJCQkgZmlyc3RlcF90YWJsZVtBVEg5S19BTklfRklSU1RFUF9MVkxfTkVXXSArCisJCQkgYW5pU3RhdGUtPmluaURlZi5maXJzdGVwTG93OworCQlpZiAodmFsdWUyIDwgQVRIOUtfU0lHX0ZJUlNURVBfU0VUVElOR19NSU4pCisJCQl2YWx1ZTIgPSBBVEg5S19TSUdfRklSU1RFUF9TRVRUSU5HX01JTjsKKwkJaWYgKHZhbHVlMiA+IEFUSDlLX1NJR19GSVJTVEVQX1NFVFRJTkdfTUFYKQorCQkJdmFsdWUyID0gQVRIOUtfU0lHX0ZJUlNURVBfU0VUVElOR19NQVg7CisKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0ZJTkRfU0lHX0xPVywKKwkJCSAgICAgIEFSX1BIWV9GSU5EX1NJR19MT1dfRklSU1RFUF9MT1csIHZhbHVlMik7CisKKwkJaWYgKGxldmVsICE9IGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwpIHsKKwkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJCSAgIioqIGNoICVkOiBsZXZlbCAlZD0+JWRbZGVmOiVkXSAiCisJCQkJICAiZmlyc3RlcFtsZXZlbF09JWQgaW5pPSVkXG4iLAorCQkJCSAgY2hhbi0+Y2hhbm5lbCwKKwkJCQkgIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwsCisJCQkJICBsZXZlbCwKKwkJCQkgIEFUSDlLX0FOSV9GSVJTVEVQX0xWTF9ORVcsCisJCQkJICB2YWx1ZSwKKwkJCQkgIGFuaVN0YXRlLT5pbmlEZWYuZmlyc3RlcCk7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICIqKiBjaCAlZDogbGV2ZWwgJWQ9PiVkW2RlZjolZF0gIgorCQkJCSAgImZpcnN0ZXBfbG93W2xldmVsXT0lZCBpbmk9JWRcbiIsCisJCQkJICBjaGFuLT5jaGFubmVsLAorCQkJCSAgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCwKKwkJCQkgIGxldmVsLAorCQkJCSAgQVRIOUtfQU5JX0ZJUlNURVBfTFZMX05FVywKKwkJCQkgIHZhbHVlMiwKKwkJCQkgIGFuaVN0YXRlLT5pbmlEZWYuZmlyc3RlcExvdyk7CisJCQlpZiAobGV2ZWwgPiBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsKQorCQkJCWFoLT5zdGF0cy5hc3RfYW5pX3N0ZXB1cCsrOworCQkJZWxzZSBpZiAobGV2ZWwgPCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsKQorCQkJCWFoLT5zdGF0cy5hc3RfYW5pX3N0ZXBkb3duKys7CisJCQlhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID0gbGV2ZWw7CisJCX0KIAkJYnJlYWs7CiAJfQogCWNhc2UgQVRIOUtfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUw6ewotCQljb25zdCBpbnQgY3ljcHdyVGhyMVtdID0geyAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiB9OwogCQl1MzIgbGV2ZWwgPSBwYXJhbTsKIAotCQlpZiAobGV2ZWwgPj0gQVJSQVlfU0laRShjeWNwd3JUaHIxKSkgeworCQlpZiAobGV2ZWwgPj0gQVJSQVlfU0laRShjeWNwd3JUaHIxX3RhYmxlKSkgewogCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCQkJICAibGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV1KVxuIiwKKwkJCQkgICJBVEg5S19BTklfU1BVUl9JTU1VTklUWV9MRVZFTDogbGV2ZWwgIgorCQkJCSAgIm91dCBvZiByYW5nZSAoJXUgPiAldSlcbiIsCiAJCQkJICBsZXZlbCwKLQkJCQkgICh1bnNpZ25lZCkgQVJSQVlfU0laRShjeWNwd3JUaHIxKSk7CisJCQkJICAodW5zaWduZWQpIEFSUkFZX1NJWkUoY3ljcHdyVGhyMV90YWJsZSkpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CisJCS8qCisJCSAqIG1ha2UgcmVnaXN0ZXIgc2V0dGluZyByZWxhdGl2ZSB0byBkZWZhdWx0CisJCSAqIGZyb20gSU5JIGZpbGUgJiBjYXAgdmFsdWUKKwkJICovCisJCXZhbHVlID0gY3ljcHdyVGhyMV90YWJsZVtsZXZlbF0gLQorCQkJY3ljcHdyVGhyMV90YWJsZVtBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX05FV10gKworCQkJYW5pU3RhdGUtPmluaURlZi5jeWNwd3JUaHIxOworCQlpZiAodmFsdWUgPCBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NSU4pCisJCQl2YWx1ZSA9IEFUSDlLX1NJR19TUFVSX0lNTV9TRVRUSU5HX01JTjsKKwkJaWYgKHZhbHVlID4gQVRIOUtfU0lHX1NQVVJfSU1NX1NFVFRJTkdfTUFYKQorCQkJdmFsdWUgPSBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NQVg7CiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9USU1JTkc1LAogCQkJICAgICAgQVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjEsCi0JCQkgICAgICBjeWNwd3JUaHIxW2xldmVsXSk7Ci0JCWlmIChsZXZlbCA+IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKLQkJCWFoLT5zdGF0cy5hc3RfYW5pX3NwdXJ1cCsrOwotCQllbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKLQkJCWFoLT5zdGF0cy5hc3RfYW5pX3NwdXJkb3duKys7Ci0JCWFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCA9IGxldmVsOworCQkJICAgICAgdmFsdWUpOworCisJCS8qCisJCSAqIHNldCBBUl9QSFlfRVhUX0NDQSBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwKKwkJICogbWFrZSByZWdpc3RlciBzZXR0aW5nIHJlbGF0aXZlIHRvIGRlZmF1bHQKKwkJICogZnJvbSBJTkkgZmlsZSAmIGNhcCB2YWx1ZQorCQkgKi8KKwkJdmFsdWUyID0gY3ljcHdyVGhyMV90YWJsZVtsZXZlbF0gLQorCQkJIGN5Y3B3clRocjFfdGFibGVbQVRIOUtfQU5JX1NQVVJfSU1NVU5FX0xWTF9ORVddICsKKwkJCSBhbmlTdGF0ZS0+aW5pRGVmLmN5Y3B3clRocjFFeHQ7CisJCWlmICh2YWx1ZTIgPCBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NSU4pCisJCQl2YWx1ZTIgPSBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NSU47CisJCWlmICh2YWx1ZTIgPiBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NQVgpCisJCQl2YWx1ZTIgPSBBVEg5S19TSUdfU1BVUl9JTU1fU0VUVElOR19NQVg7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9FWFRfQ0NBLAorCQkJICAgICAgQVJfUEhZX0VYVF9DWUNQV1JfVEhSMSwgdmFsdWUyKTsKKworCQlpZiAobGV2ZWwgIT0gYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsKSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCQkgICIqKiBjaCAlZDogbGV2ZWwgJWQ9PiVkW2RlZjolZF0gIgorCQkJCSAgImN5Y3B3clRocjFbbGV2ZWxdPSVkIGluaT0lZFxuIiwKKwkJCQkgIGNoYW4tPmNoYW5uZWwsCisJCQkJICBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCisJCQkJICBsZXZlbCwKKwkJCQkgIEFUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXLAorCQkJCSAgdmFsdWUsCisJCQkJICBhbmlTdGF0ZS0+aW5pRGVmLmN5Y3B3clRocjEpOworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAiKiogY2ggJWQ6IGxldmVsICVkPT4lZFtkZWY6JWRdICIKKwkJCQkgICJjeWNwd3JUaHIxRXh0W2xldmVsXT0lZCBpbmk9JWRcbiIsCisJCQkJICBjaGFuLT5jaGFubmVsLAorCQkJCSAgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsLAorCQkJCSAgbGV2ZWwsCisJCQkJICBBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX05FVywKKwkJCQkgIHZhbHVlMiwKKwkJCQkgIGFuaVN0YXRlLT5pbmlEZWYuY3ljcHdyVGhyMUV4dCk7CisJCQlpZiAobGV2ZWwgPiBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwpCisJCQkJYWgtPnN0YXRzLmFzdF9hbmlfc3B1cnVwKys7CisJCQllbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKKwkJCQlhaC0+c3RhdHMuYXN0X2FuaV9zcHVyZG93bisrOworCQkJYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsID0gbGV2ZWw7CisJCX0KIAkJYnJlYWs7CiAJfQorCWNhc2UgQVRIOUtfQU5JX01SQ19DQ0s6eworCQkvKgorCQkgKiBpc19vbiA9PSAxIG1lYW5zIE1SQyBDQ0sgT04gKGRlZmF1bHQsIGxlc3Mgbm9pc2UgaW1tKQorCQkgKiBpc19vbiA9PSAwIG1lYW5zIE1SQyBDQ0sgaXMgT0ZGIChtb3JlIG5vaXNlIGltbSkKKwkJICovCisJCWJvb2wgaXNfb24gPSBwYXJhbSA/IDEgOiAwOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfTVJDX0NDS19DVFJMLAorCQkJICAgICAgQVJfUEhZX01SQ19DQ0tfRU5BQkxFLCBpc19vbik7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9NUkNfQ0NLX0NUUkwsCisJCQkgICAgICBBUl9QSFlfTVJDX0NDS19NVVhfUkVHLCBpc19vbik7CisJCWlmICghaXNfb24gIT0gYW5pU3RhdGUtPm1yY0NDS09mZikgeworCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQkJICAiKiogY2ggJWQ6IE1SQyBDQ0s6ICVzPT4lc1xuIiwKKwkJCQkgIGNoYW4tPmNoYW5uZWwsCisJCQkJICAhYW5pU3RhdGUtPm1yY0NDS09mZiA/ICJvbiIgOiAib2ZmIiwKKwkJCQkgIGlzX29uID8gIm9uIiA6ICJvZmYiKTsKKwkJaWYgKGlzX29uKQorCQkJYWgtPnN0YXRzLmFzdF9hbmlfY2NrbG93Kys7CisJCWVsc2UKKwkJCWFoLT5zdGF0cy5hc3RfYW5pX2Nja2hpZ2grKzsKKwkJYW5pU3RhdGUtPm1yY0NDS09mZiA9ICFpc19vbjsKKwkJfQorCWJyZWFrOworCX0KIAljYXNlIEFUSDlLX0FOSV9QUkVTRU5UOgogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODgwLDE1OCArOTk5LDEyNiBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksICJBTkkgcGFyYW1ldGVyczpcbiIpOwogCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQU5JLAotCQkgICJub2lzZUltbXVuaXR5TGV2ZWw9JWQsIHNwdXJJbW11bml0eUxldmVsPSVkLCAiCi0JCSAgIm9mZG1XZWFrU2lnRGV0ZWN0T2ZmPSVkXG4iLAotCQkgIGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwsCisJCSAgIkFOSSBwYXJhbWV0ZXJzOiBTST0lZCwgb2ZkbVdTPSVzIEZTPSVkICIKKwkJICAiTVJDY2NrPSVzIGxpc3RlblRpbWU9JWQgQ0M9JWQgbGlzdGVuPSVkICIKKwkJICAib2ZkbUVycnM9JWQgY2NrRXJycz0lZFxuIiwKIAkJICBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCi0JCSAgIWFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZik7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCSAgImNja1dlYWtTaWdUaHJlc2hvbGQ9JWQsICIKLQkJICAiZmlyc3RlcExldmVsPSVkLCBsaXN0ZW5UaW1lPSVkXG4iLAotCQkgIGFuaVN0YXRlLT5jY2tXZWFrU2lnVGhyZXNob2xkLAorCQkgICFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYgPyAib24iIDogIm9mZiIsCiAJCSAgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCwKLQkJICBhbmlTdGF0ZS0+bGlzdGVuVGltZSk7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCSJjeWNsZUNvdW50PSVkLCBvZmRtUGh5RXJyQ291bnQ9JWQsIGNja1BoeUVyckNvdW50PSVkXG5cbiIsCi0JCWFuaVN0YXRlLT5jeWNsZUNvdW50LAotCQlhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50LAotCQlhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQpOwotCisJCSAgIWFuaVN0YXRlLT5tcmNDQ0tPZmYgPyAib24iIDogIm9mZiIsCisJCSAgYW5pU3RhdGUtPmxpc3RlblRpbWUsCisJCSAgYW5pU3RhdGUtPmN5Y2xlQ291bnQsCisJCSAgYW5pU3RhdGUtPmxpc3RlblRpbWUsCisJCSAgYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCwKKwkJICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQpOwogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBhcjkwMDNfaHdfbmZfc2FuaXRpemVfMmcoc3RydWN0IGF0aF9odyAqYWgsIHMxNiAqbmYpCi17Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7Ci0KLQlpZiAoKm5mID4gYWgtPm5mXzJnX21heCkgewotCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSAgIjIgR0h6IE5GICglZCkgPiBNQVggKCVkKSwgIgotCQkJICAiY29ycmVjdGluZyB0byBNQVgiLAotCQkJICAqbmYsIGFoLT5uZl8yZ19tYXgpOwotCQkqbmYgPSBhaC0+bmZfMmdfbWF4OwotCX0gZWxzZSBpZiAoKm5mIDwgYWgtPm5mXzJnX21pbikgewotCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSAgIjIgR0h6IE5GICglZCkgPCBNSU4gKCVkKSwgIgotCQkJICAiY29ycmVjdGluZyB0byBNSU4iLAotCQkJICAqbmYsIGFoLT5uZl8yZ19taW4pOwotCQkqbmYgPSBhaC0+bmZfMmdfbWluOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXI5MDAzX2h3X25mX3Nhbml0aXplXzVnKHN0cnVjdCBhdGhfaHcgKmFoLCBzMTYgKm5mKQotewotCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwotCi0JaWYgKCpuZiA+IGFoLT5uZl81Z19tYXgpIHsKLQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkgICI1IEdIeiBORiAoJWQpID4gTUFYICglZCksICIKLQkJCSAgImNvcnJlY3RpbmcgdG8gTUFYIiwKLQkJCSAgKm5mLCBhaC0+bmZfNWdfbWF4KTsKLQkJKm5mID0gYWgtPm5mXzVnX21heDsKLQl9IGVsc2UgaWYgKCpuZiA8IGFoLT5uZl81Z19taW4pIHsKLQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkgICI1IEdIeiBORiAoJWQpIDwgTUlOICglZCksICIKLQkJCSAgImNvcnJlY3RpbmcgdG8gTUlOIiwKLQkJCSAgKm5mLCBhaC0+bmZfNWdfbWluKTsKLQkJKm5mID0gYWgtPm5mXzVnX21pbjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFyOTAwM19od19uZl9zYW5pdGl6ZShzdHJ1Y3QgYXRoX2h3ICphaCwgczE2ICpuZikKLXsKLQlpZiAoSVNfQ0hBTl8yR0haKGFoLT5jdXJjaGFuKSkKLQkJYXI5MDAzX2h3X25mX3Nhbml0aXplXzJnKGFoLCBuZik7Ci0JZWxzZQotCQlhcjkwMDNfaHdfbmZfc2FuaXRpemVfNWcoYWgsIG5mKTsKLX0KLQogc3RhdGljIHZvaWQgYXI5MDAzX2h3X2RvX2dldG5mKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJICAgICAgaW50MTZfdCBuZmFycmF5W05VTV9ORl9SRUFESU5HU10pCiB7Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAJaW50MTZfdCBuZjsKIAogCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DQ0FfMCksIEFSX1BIWV9NSU5DQ0FfUFdSKTsKLQlpZiAobmYgJiAweDEwMCkKLQkJbmYgPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOwotCWFyOTAwM19od19uZl9zYW5pdGl6ZShhaCwgJm5mKTsKLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJICAiTkYgY2FsaWJyYXRlZCBbY3RsXSBbY2hhaW4gMF0gaXMgJWRcbiIsIG5mKTsKLQluZmFycmF5WzBdID0gbmY7CisJbmZhcnJheVswXSA9IHNpZ25fZXh0ZW5kKG5mLCA5KTsKIAogCW5mID0gTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9DQ0FfMSksIEFSX1BIWV9DSDFfTUlOQ0NBX1BXUik7Ci0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhcjkwMDNfaHdfbmZfc2FuaXRpemUoYWgsICZuZik7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2N0bF0gW2NoYWluIDFdIGlzICVkXG4iLCBuZik7Ci0JbmZhcnJheVsxXSA9IG5mOworCW5mYXJyYXlbMV0gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfQ0NBXzIpLCBBUl9QSFlfQ0gyX01JTkNDQV9QV1IpOwotCWlmIChuZiAmIDB4MTAwKQotCQluZiA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7Ci0JYXI5MDAzX2h3X25mX3Nhbml0aXplKGFoLCAmbmYpOwotCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkgICJORiBjYWxpYnJhdGVkIFtjdGxdIFtjaGFpbiAyXSBpcyAlZFxuIiwgbmYpOwotCW5mYXJyYXlbMl0gPSBuZjsKKwluZmFycmF5WzJdID0gc2lnbl9leHRlbmQobmYsIDkpOworCisJaWYgKCFJU19DSEFOX0hUNDAoYWgtPmN1cmNoYW4pKQorCQlyZXR1cm47CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfRVhUX0NDQSksIEFSX1BIWV9FWFRfTUlOQ0NBX1BXUik7Ci0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhcjkwMDNfaHdfbmZfc2FuaXRpemUoYWgsICZuZik7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2V4dF0gW2NoYWluIDBdIGlzICVkXG4iLCBuZik7Ci0JbmZhcnJheVszXSA9IG5mOworCW5mYXJyYXlbM10gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfRVhUX0NDQV8xKSwgQVJfUEhZX0NIMV9FWFRfTUlOQ0NBX1BXUik7Ci0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhcjkwMDNfaHdfbmZfc2FuaXRpemUoYWgsICZuZik7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2V4dF0gW2NoYWluIDFdIGlzICVkXG4iLCBuZik7Ci0JbmZhcnJheVs0XSA9IG5mOworCW5mYXJyYXlbNF0gPSBzaWduX2V4dGVuZChuZiwgOSk7CiAKIAluZiA9IE1TKFJFR19SRUFEKGFoLCBBUl9QSFlfRVhUX0NDQV8yKSwgQVJfUEhZX0NIMl9FWFRfTUlOQ0NBX1BXUik7Ci0JaWYgKG5mICYgMHgxMDApCi0JCW5mID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKLQlhcjkwMDNfaHdfbmZfc2FuaXRpemUoYWgsICZuZik7Ci0JYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSAgIk5GIGNhbGlicmF0ZWQgW2V4dF0gW2NoYWluIDJdIGlzICVkXG4iLCBuZik7Ci0JbmZhcnJheVs1XSA9IG5mOworCW5mYXJyYXlbNV0gPSBzaWduX2V4dGVuZChuZiwgOSk7CiB9CiAKLXZvaWQgYXI5MDAzX2h3X3NldF9uZl9saW1pdHMoc3RydWN0IGF0aF9odyAqYWgpCitzdGF0aWMgdm9pZCBhcjkwMDNfaHdfc2V0X25mX2xpbWl0cyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlhaC0+bmZfMmdfbWF4ID0gQVJfUEhZX0NDQV9NQVhfR09PRF9WQUxfOTMwMF8yR0haOwotCWFoLT5uZl8yZ19taW4gPSBBUl9QSFlfQ0NBX01JTl9HT09EX1ZBTF85MzAwXzJHSFo7Ci0JYWgtPm5mXzVnX21heCA9IEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkzMDBfNUdIWjsKLQlhaC0+bmZfNWdfbWluID0gQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfOTMwMF81R0haOworCWFoLT5uZl8yZy5tYXggPSBBUl9QSFlfQ0NBX01BWF9HT09EX1ZBTF85MzAwXzJHSFo7CisJYWgtPm5mXzJnLm1pbiA9IEFSX1BIWV9DQ0FfTUlOX0dPT0RfVkFMXzkzMDBfMkdIWjsKKwlhaC0+bmZfMmcubm9taW5hbCA9IEFSX1BIWV9DQ0FfTk9NX1ZBTF85MzAwXzJHSFo7CisJYWgtPm5mXzVnLm1heCA9IEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkzMDBfNUdIWjsKKwlhaC0+bmZfNWcubWluID0gQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfOTMwMF81R0haOworCWFoLT5uZl81Zy5ub21pbmFsID0gQVJfUEhZX0NDQV9OT01fVkFMXzkzMDBfNUdIWjsKIH0KIAogLyoKLSAqIEZpbmQgb3V0IHdoaWNoIG9mIHRoZSBSWCBjaGFpbnMgYXJlIGVuYWJsZWQKKyAqIEluaXRpYWxpemUgdGhlIEFOSSByZWdpc3RlciB2YWx1ZXMgd2l0aCBkZWZhdWx0IChpbmkpIHZhbHVlcy4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZHVyaW5nIGEgKGZ1bGwpIGhhcmR3YXJlIHJlc2V0IGFmdGVyCisgKiBhbGwgdGhlIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGlzZWQgZnJvbSB0aGUgSU5JLgogICovCi1zdGF0aWMgdTMyIGFyOTAwM19od19nZXRfcnhfY2hhaW5tYXNrKHN0cnVjdCBhdGhfaHcgKmFoKQorc3RhdGljIHZvaWQgYXI5MDAzX2h3X2FuaV9jYWNoZV9pbmlfcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQl1MzIgY2hhaW4gPSBSRUdfUkVBRChhaCwgQVJfUEhZX1JYX0NIQUlOTUFTSyk7Ci0JLyoKLQkgKiBUaGUgYml0cyBbMjowXSBpbmRpY2F0ZSB0aGUgcnggY2hhaW4gbWFzayBhbmQgYXJlIHRvIGJlCi0JICogaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKLQkgKiAwMHggPT4gT25seSBjaGFpbiAwIGlzIGVuYWJsZWQKLQkgKiAwMXggPT4gQ2hhaW4gMSBhbmQgMCBlbmFibGVkCi0JICogMXh4ID0+IENoYWluIDIsMSBhbmQgMCBlbmFibGVkCi0JICovCi0JcmV0dXJuIGNoYWluICYgMHg3OworCXN0cnVjdCBhcjU0MTZBbmlTdGF0ZSAqYW5pU3RhdGU7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4gPSBhaC0+Y3VyY2hhbjsKKwlzdHJ1Y3QgYXRoOWtfYW5pX2RlZmF1bHQgKmluaURlZjsKKwlpbnQgaW5kZXg7CisJdTMyIHZhbDsKKworCWluZGV4ID0gYXRoOWtfaHdfZ2V0X2FuaV9jaGFubmVsX2lkeChhaCwgY2hhbik7CisJYW5pU3RhdGUgPSAmYWgtPmFuaVtpbmRleF07CisJYWgtPmN1cmFuaSA9IGFuaVN0YXRlOworCWluaURlZiA9ICZhbmlTdGF0ZS0+aW5pRGVmOworCisJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTkksCisJCSAgInZlciAlZC4lZCBvcG1vZGUgJXUgY2hhbiAlZCBNaHovMHgleFxuIiwKKwkJICBhaC0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uLAorCQkgIGFoLT5od192ZXJzaW9uLm1hY1JldiwKKwkJICBhaC0+b3Btb2RlLAorCQkgIGNoYW4tPmNoYW5uZWwsCisJCSAgY2hhbi0+Y2hhbm5lbEZsYWdzKTsKKworCXZhbCA9IFJFR19SRUFEKGFoLCBBUl9QSFlfU0ZDT1JSKTsKKwlpbmlEZWYtPm0xVGhyZXNoID0gTVModmFsLCBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSCk7CisJaW5pRGVmLT5tMlRocmVzaCA9IE1TKHZhbCwgQVJfUEhZX1NGQ09SUl9NMl9USFJFU0gpOworCWluaURlZi0+bTJDb3VudFRociA9IE1TKHZhbCwgQVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUik7CisKKwl2YWwgPSBSRUdfUkVBRChhaCwgQVJfUEhZX1NGQ09SUl9MT1cpOworCWluaURlZi0+bTFUaHJlc2hMb3cgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1cpOworCWluaURlZi0+bTJUaHJlc2hMb3cgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1cpOworCWluaURlZi0+bTJDb3VudFRockxvdyA9IE1TKHZhbCwgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XKTsKKworCXZhbCA9IFJFR19SRUFEKGFoLCBBUl9QSFlfU0ZDT1JSX0VYVCk7CisJaW5pRGVmLT5tMVRocmVzaEV4dCA9IE1TKHZhbCwgQVJfUEhZX1NGQ09SUl9FWFRfTTFfVEhSRVNIKTsKKwlpbmlEZWYtPm0yVGhyZXNoRXh0ID0gTVModmFsLCBBUl9QSFlfU0ZDT1JSX0VYVF9NMl9USFJFU0gpOworCWluaURlZi0+bTFUaHJlc2hMb3dFeHQgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfRVhUX00xX1RIUkVTSF9MT1cpOworCWluaURlZi0+bTJUaHJlc2hMb3dFeHQgPSBNUyh2YWwsIEFSX1BIWV9TRkNPUlJfRVhUX00yX1RIUkVTSF9MT1cpOworCWluaURlZi0+Zmlyc3RlcCA9IFJFR19SRUFEX0ZJRUxEKGFoLAorCQkJCQkgQVJfUEhZX0ZJTkRfU0lHLAorCQkJCQkgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVApOworCWluaURlZi0+Zmlyc3RlcExvdyA9IFJFR19SRUFEX0ZJRUxEKGFoLAorCQkJCQkgICAgQVJfUEhZX0ZJTkRfU0lHX0xPVywKKwkJCQkJICAgIEFSX1BIWV9GSU5EX1NJR19MT1dfRklSU1RFUF9MT1cpOworCWluaURlZi0+Y3ljcHdyVGhyMSA9IFJFR19SRUFEX0ZJRUxEKGFoLAorCQkJCQkgICAgQVJfUEhZX1RJTUlORzUsCisJCQkJCSAgICBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMSk7CisJaW5pRGVmLT5jeWNwd3JUaHIxRXh0ID0gUkVHX1JFQURfRklFTEQoYWgsCisJCQkJCSAgICAgICBBUl9QSFlfRVhUX0NDQSwKKwkJCQkJICAgICAgIEFSX1BIWV9FWFRfQ1lDUFdSX1RIUjEpOworCisJLyogdGhlc2UgbGV2ZWxzIGp1c3QgZ290IHJlc2V0IHRvIGRlZmF1bHRzIGJ5IHRoZSBJTkkgKi8KKwlhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgPSBBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX05FVzsKKwlhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID0gQVRIOUtfQU5JX0ZJUlNURVBfTFZMX05FVzsKKwlhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYgPSAhQVRIOUtfQU5JX1VTRV9PRkRNX1dFQUtfU0lHOworCWFuaVN0YXRlLT5tcmNDQ0tPZmYgPSAhQVRIOUtfQU5JX0VOQUJMRV9NUkNfQ0NLOworCisJYW5pU3RhdGUtPmN5Y2xlQ291bnQgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBhcjkwMDNfaHdfbG9hZG5mKHN0cnVjdCBhdGhfaHcgKmFoLCBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKK3ZvaWQgYXI5MDAzX2h3X2F0dGFjaF9waHlfb3BzKHN0cnVjdCBhdGhfaHcgKmFoKQogewotCXN0cnVjdCBhdGg5a19uZmNhbF9oaXN0ICpoOwotCXVuc2lnbmVkIGksIGo7Ci0JaW50MzJfdCB2YWw7CisJc3RydWN0IGF0aF9od19wcml2YXRlX29wcyAqcHJpdl9vcHMgPSBhdGg5a19od19wcml2YXRlX29wcyhhaCk7CiAJY29uc3QgdTMyIGFyOTMwMF9jY2FfcmVnc1s2XSA9IHsKIAkJQVJfUEhZX0NDQV8wLAogCQlBUl9QSFlfQ0NBXzEsCkBAIC0xMDQwLDgwICsxMTI3LDYgQEAKIAkJQVJfUEhZX0VYVF9DQ0FfMSwKIAkJQVJfUEhZX0VYVF9DQ0FfMiwKIAl9OwotCXU4IGNoYWlubWFzaywgcnhfY2hhaW5fc3RhdHVzOwotCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwotCi0JcnhfY2hhaW5fc3RhdHVzID0gYXI5MDAzX2h3X2dldF9yeF9jaGFpbm1hc2soYWgpOwotCi0JY2hhaW5tYXNrID0gMHgzRjsKLQloID0gYWgtPm5mQ2FsSGlzdDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fTkZfUkVBRElOR1M7IGkrKykgewotCQlpZiAoY2hhaW5tYXNrICYgKDEgPDwgaSkpIHsKLQkJCXZhbCA9IFJFR19SRUFEKGFoLCBhcjkzMDBfY2NhX3JlZ3NbaV0pOwotCQkJdmFsICY9IDB4RkZGRkZFMDA7Ci0JCQl2YWwgfD0gKCgodTMyKSAoaFtpXS5wcml2TkYpIDw8IDEpICYgMHgxZmYpOwotCQkJUkVHX1dSSVRFKGFoLCBhcjkzMDBfY2NhX3JlZ3NbaV0sIHZhbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIExvYWQgc29mdHdhcmUgZmlsdGVyZWQgTkYgdmFsdWUgaW50byBiYXNlYmFuZCBpbnRlcm5hbCBtaW5DQ0Fwd3IKLQkgKiB2YXJpYWJsZS4KLQkgKi8KLQlSRUdfQ0xSX0JJVChhaCwgQVJfUEhZX0FHQ19DT05UUk9MLAotCQkgICAgQVJfUEhZX0FHQ19DT05UUk9MX0VOQUJMRV9ORik7Ci0JUkVHX0NMUl9CSVQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwKLQkJICAgIEFSX1BIWV9BR0NfQ09OVFJPTF9OT19VUERBVEVfTkYpOwotCVJFR19TRVRfQklUKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wsIEFSX1BIWV9BR0NfQ09OVFJPTF9ORik7Ci0KLQkvKgotCSAqIFdhaXQgZm9yIGxvYWQgdG8gY29tcGxldGUsIHNob3VsZCBiZSBmYXN0LCBhIGZldyAxMHMgb2YgdXMuCi0JICogVGhlIG1heCBkZWxheSB3YXMgY2hhbmdlZCBmcm9tIGFuIG9yaWdpbmFsIDI1MHVzIHRvIDEwMDAwdXMKLQkgKiBzaW5jZSAyNTB1cyBvZnRlbiByZXN1bHRzIGluIE5GIGxvYWQgdGltZW91dCBhbmQgY2F1c2VzIGRlYWYKLQkgKiBjb25kaXRpb24gZHVyaW5nIHN0cmVzcyB0ZXN0aW5nIDEyLzEyLzIwMDkKLQkgKi8KLQlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKSB7Ci0JCWlmICgoUkVHX1JFQUQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCkgJgotCQkgICAgIEFSX1BIWV9BR0NfQ09OVFJPTF9ORikgPT0gMCkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTApOwotCX0KLQotCS8qCi0JICogV2UgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBub2lzZWZsb29yIHRvIGxvYWQsIHByb2JhYmx5IGR1ZSB0byBhbgotCSAqIGluLXByb2dyZXNzIHJ4LiBTaW1wbHkgcmV0dXJuIGhlcmUgYW5kIGFsbG93IHRoZSBsb2FkIHBsZW50eSBvZiB0aW1lCi0JICogdG8gY29tcGxldGUgYmVmb3JlIHRoZSBuZXh0IGNhbGlicmF0aW9uIGludGVydmFsLiAgV2UgbmVlZCB0byBhdm9pZAotCSAqIHRyeWluZyB0byBsb2FkIC01MCAod2hpY2ggaGFwcGVucyBiZWxvdykgd2hpbGUgdGhlIHByZXZpb3VzIGxvYWQgaXMKLQkgKiBzdGlsbCBpbiBwcm9ncmVzcyBhcyB0aGlzIGNhbiBjYXVzZSByeCBkZWFmbmVzcy4gSW5zdGVhZCBieSByZXR1cm5pbmcKLQkgKiBoZXJlLCB0aGUgYmFzZWJhbmQgbmYgY2FsIHdpbGwganVzdCBiZSBjYXBwZWQgYnkgb3VyIHByZXNlbnQKLQkgKiBub2lzZWZsb29yIHVudGlsIHRoZSBuZXh0IGNhbGlicmF0aW9uIHRpbWVyLgotCSAqLwotCWlmIChqID09IDEwMDApIHsKLQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19BTlksICJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIG5mICIKLQkJCSAgInRvIGxvYWQ6IEFSX1BIWV9BR0NfQ09OVFJPTD0weCV4XG4iLAotCQkJICBSRUdfUkVBRChhaCwgQVJfUEhZX0FHQ19DT05UUk9MKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFJlc3RvcmUgbWF4Q0NBUG93ZXIgcmVnaXN0ZXIgcGFyYW1ldGVyIGFnYWluIHNvIHRoYXQgd2UncmUgbm90IGNhcHBlZAotCSAqIGJ5IHRoZSBtZWRpYW4gd2UganVzdCBsb2FkZWQuICBUaGlzIHdpbGwgYmUgaW5pdGlhbCAoYW5kIG1heCkgdmFsdWUKLQkgKiBvZiBuZXh0IG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIHRoZSBiYXNlYmFuZCBkb2VzLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fTkZfUkVBRElOR1M7IGkrKykgewotCQlpZiAoY2hhaW5tYXNrICYgKDEgPDwgaSkpIHsKLQkJCXZhbCA9IFJFR19SRUFEKGFoLCBhcjkzMDBfY2NhX3JlZ3NbaV0pOwotCQkJdmFsICY9IDB4RkZGRkZFMDA7Ci0JCQl2YWwgfD0gKCgodTMyKSAoLTUwKSA8PCAxKSAmIDB4MWZmKTsKLQkJCVJFR19XUklURShhaCwgYXI5MzAwX2NjYV9yZWdzW2ldLCB2YWwpOwotCQl9Ci0JfQotfQotCi12b2lkIGFyOTAwM19od19hdHRhY2hfcGh5X29wcyhzdHJ1Y3QgYXRoX2h3ICphaCkKLXsKLQlzdHJ1Y3QgYXRoX2h3X3ByaXZhdGVfb3BzICpwcml2X29wcyA9IGF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKTsKIAogCXByaXZfb3BzLT5yZl9zZXRfZnJlcSA9IGFyOTAwM19od19zZXRfY2hhbm5lbDsKIAlwcml2X29wcy0+c3B1cl9taXRpZ2F0ZV9mcmVxID0gYXI5MDAzX2h3X3NwdXJfbWl0aWdhdGU7CkBAIC0xMTMwLDUgKzExNDMsMTI3IEBACiAJcHJpdl9vcHMtPnNldF9kaXZlcnNpdHkgPSBhcjkwMDNfaHdfc2V0X2RpdmVyc2l0eTsKIAlwcml2X29wcy0+YW5pX2NvbnRyb2wgPSBhcjkwMDNfaHdfYW5pX2NvbnRyb2w7CiAJcHJpdl9vcHMtPmRvX2dldG5mID0gYXI5MDAzX2h3X2RvX2dldG5mOwotCXByaXZfb3BzLT5sb2FkbmYgPSBhcjkwMDNfaHdfbG9hZG5mOworCXByaXZfb3BzLT5hbmlfY2FjaGVfaW5pX3JlZ3MgPSBhcjkwMDNfaHdfYW5pX2NhY2hlX2luaV9yZWdzOworCisJYXI5MDAzX2h3X3NldF9uZl9saW1pdHMoYWgpOworCW1lbWNweShhaC0+bmZfcmVncywgYXI5MzAwX2NjYV9yZWdzLCBzaXplb2YoYWgtPm5mX3JlZ3MpKTsKIH0KKwordm9pZCBhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfY29uZmlnKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBpZGxlX3Rtb19tcyA9IGFoLT5iYl93YXRjaGRvZ190aW1lb3V0X21zOworCXUzMiB2YWwsIGlkbGVfY291bnQ7CisKKwlpZiAoIWlkbGVfdG1vX21zKSB7CisJCS8qIGRpc2FibGUgSVJRLCBkaXNhYmxlIGNoaXAtcmVzZXQgZm9yIEJCIHBhbmljICovCisJCVJFR19XUklURShhaCwgQVJfUEhZX1dBVENIRE9HX0NUTF8yLAorCQkJICBSRUdfUkVBRChhaCwgQVJfUEhZX1dBVENIRE9HX0NUTF8yKSAmCisJCQkgIH4oQVJfUEhZX1dBVENIRE9HX1JTVF9FTkFCTEUgfAorCQkJICAgIEFSX1BIWV9XQVRDSERPR19JUlFfRU5BQkxFKSk7CisKKwkJLyogZGlzYWJsZSB3YXRjaGRvZyBpbiBub24tSURMRSBtb2RlLCBkaXNhYmxlIGluIElETEUgbW9kZSAqLworCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMSwKKwkJCSAgUkVHX1JFQUQoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMSkgJgorCQkJICB+KEFSX1BIWV9XQVRDSERPR19OT05fSURMRV9FTkFCTEUgfAorCQkJICAgIEFSX1BIWV9XQVRDSERPR19JRExFX0VOQUJMRSkpOworCisJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfUkVTRVQsICJEaXNhYmxlZCBCQiBXYXRjaGRvZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgSVJRLCBkaXNhYmxlIGNoaXAtcmVzZXQgZm9yIEJCIHdhdGNoZG9nICovCisJdmFsID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMikgJiBBUl9QSFlfV0FUQ0hET0dfQ05UTDJfTUFTSzsKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMiwKKwkJICAodmFsIHwgQVJfUEhZX1dBVENIRE9HX0lSUV9FTkFCTEUpICYKKwkJICB+QVJfUEhZX1dBVENIRE9HX1JTVF9FTkFCTEUpOworCisJLyogYm91bmQgbGltaXQgdG8gMTAgc2VjcyAqLworCWlmIChpZGxlX3Rtb19tcyA+IDEwMDAwKQorCQlpZGxlX3Rtb19tcyA9IDEwMDAwOworCisJLyoKKwkgKiBUaGUgdGltZSB1bml0IGZvciB3YXRjaGRvZyBldmVudCBpcyAyXjE1IDQ0Lzg4TUh6IGN5Y2xlcy4KKwkgKgorCSAqIEZvciBIVDIwIHdlIGhhdmUgYSB0aW1lIHVuaXQgb2YgMl4xNS80NCBNSHogPSAuNzQgbXMgcGVyIHRpY2sKKwkgKiBGb3IgSFQ0MCB3ZSBoYXZlIGEgdGltZSB1bml0IG9mIDJeMTUvODggTUh6ID0gLjM3IG1zIHBlciB0aWNrCisJICoKKwkgKiBHaXZlbiB3ZSB1c2UgZmFzdCBjbG9jayBub3cgaW4gNSBHSHosIHRoZXNlIHRpbWUgdW5pdHMgc2hvdWxkCisJICogYmUgY29tbW9uIGZvciBib3RoIDIgR0h6IGFuZCA1IEdIei4KKwkgKi8KKwlpZGxlX2NvdW50ID0gKDEwMCAqIGlkbGVfdG1vX21zKSAvIDc0OworCWlmIChhaC0+Y3VyY2hhbiAmJiBJU19DSEFOX0hUNDAoYWgtPmN1cmNoYW4pKQorCQlpZGxlX2NvdW50ID0gKDEwMCAqIGlkbGVfdG1vX21zKSAvIDM3OworCisJLyoKKwkgKiBlbmFibGUgd2F0Y2hkb2cgaW4gbm9uLUlETEUgbW9kZSwgZGlzYWJsZSBpbiBJRExFIG1vZGUsCisJICogc2V0IGlkbGUgdGltZS1vdXQuCisJICovCisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfV0FUQ0hET0dfQ1RMXzEsCisJCSAgQVJfUEhZX1dBVENIRE9HX05PTl9JRExFX0VOQUJMRSB8CisJCSAgQVJfUEhZX1dBVENIRE9HX0lETEVfTUFTSyB8CisJCSAgKEFSX1BIWV9XQVRDSERPR19OT05fSURMRV9NQVNLICYgKGlkbGVfY291bnQgPDwgMikpKTsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfUkVTRVQsCisJCSAgIkVuYWJsZWQgQkIgV2F0Y2hkb2cgdGltZW91dCAoJXUgbXMpXG4iLAorCQkgIGlkbGVfdG1vX21zKTsKK30KKwordm9pZCBhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfcmVhZChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwkvKgorCSAqIHdlIHdhbnQgdG8gYXZvaWQgcHJpbnRpbmcgaW4gSVNSIGNvbnRleHQgc28gd2Ugc2F2ZSB0aGUKKwkgKiB3YXRjaGRvZyBzdGF0dXMgdG8gYmUgcHJpbnRlZCBsYXRlciBpbiBib3R0b20gaGFsZiBjb250ZXh0LgorCSAqLworCWFoLT5iYl93YXRjaGRvZ19sYXN0X3N0YXR1cyA9IFJFR19SRUFEKGFoLCBBUl9QSFlfV0FUQ0hET0dfU1RBVFVTKTsKKworCS8qCisJICogdGhlIHdhdGNoZG9nIHRpbWVyIHNob3VsZCByZXNldCBvbiBzdGF0dXMgcmVhZCBidXQgdG8gYmUgc3VyZQorCSAqIHN1cmUgd2Ugd3JpdGUgMCB0byB0aGUgd2F0Y2hkb2cgc3RhdHVzIGJpdC4KKwkgKi8KKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9XQVRDSERPR19TVEFUVVMsCisJCSAgYWgtPmJiX3dhdGNoZG9nX2xhc3Rfc3RhdHVzICYgfkFSX1BIWV9XQVRDSERPR19TVEFUVVNfQ0xSKTsKK30KKwordm9pZCBhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfZGJnX2luZm8oc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJdTMyIHJ4Y19wY250ID0gMCwgcnhmX3BjbnQgPSAwLCB0eGZfcGNudCA9IDAsIHN0YXR1czsKKworCWlmIChsaWtlbHkoIShjb21tb24tPmRlYnVnX21hc2sgJiBBVEhfREJHX1JFU0VUKSkpCisJCXJldHVybjsKKworCXN0YXR1cyA9IGFoLT5iYl93YXRjaGRvZ19sYXN0X3N0YXR1czsKKwlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1JFU0VULAorCQkgICJcbj09PT0gQkIgdXBkYXRlOiBCQiBzdGF0dXM9MHglMDh4ID09PT1cbiIsIHN0YXR1cyk7CisJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKKwkJICAiKiogQkIgc3RhdGU6IHdkPSV1IGRldD0ldSByZGFyPSV1IHJPRkRNPSVkICIKKwkJICAickNDSz0ldSB0T0ZETT0ldSB0Q0NLPSV1IGFnYz0ldSBzcmM9JXUgKipcbiIsCisJCSAgTVMoc3RhdHVzLCBBUl9QSFlfV0FUQ0hET0dfSU5GTyksCisJCSAgTVMoc3RhdHVzLCBBUl9QSFlfV0FUQ0hET0dfREVUX0hBTkcpLAorCQkgIE1TKHN0YXR1cywgQVJfUEhZX1dBVENIRE9HX1JBREFSX1NNKSwKKwkJICBNUyhzdGF0dXMsIEFSX1BIWV9XQVRDSERPR19SWF9PRkRNX1NNKSwKKwkJICBNUyhzdGF0dXMsIEFSX1BIWV9XQVRDSERPR19SWF9DQ0tfU00pLAorCQkgIE1TKHN0YXR1cywgQVJfUEhZX1dBVENIRE9HX1RYX09GRE1fU00pLAorCQkgIE1TKHN0YXR1cywgQVJfUEhZX1dBVENIRE9HX1RYX0NDS19TTSksCisJCSAgTVMoc3RhdHVzLCBBUl9QSFlfV0FUQ0hET0dfQUdDX1NNKSwKKwkJICBNUyhzdGF0dXMsQVJfUEhZX1dBVENIRE9HX1NSQ0hfU00pKTsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfUkVTRVQsCisJCSAgIioqIEJCIFdEIGNudGw6IGNudGwxPTB4JTA4eCBjbnRsMj0weCUwOHggKipcbiIsCisJCSAgUkVHX1JFQUQoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMSksCisJCSAgUkVHX1JFQUQoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMikpOworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfUkVTRVQsCisJCSAgIioqIEJCIG1vZGU6IEJCX2dlbl9jb250cm9scz0weCUwOHggKipcbiIsCisJCSAgUkVHX1JFQUQoYWgsIEFSX1BIWV9HRU5fQ1RSTCkpOworCisJaWYgKGF0aDlrX2h3X0dldE1pYkN5Y2xlQ291bnRzUGN0KGFoLCAmcnhjX3BjbnQsICZyeGZfcGNudCwgJnR4Zl9wY250KSkKKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKKwkJCSAgIioqIEJCIGJ1c3kgdGltZXM6IHJ4X2NsZWFyPSVkJSUsICIKKwkJCSAgInJ4X2ZyYW1lPSVkJSUsIHR4X2ZyYW1lPSVkJSUgKipcbiIsCisJCQkgIHJ4Y19wY250LCByeGZfcGNudCwgdHhmX3BjbnQpOworCisJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKKwkJICAiPT09PSBCQiB1cGRhdGU6IGRvbmUgPT09PVxuXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2RiZ19pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oCmluZGV4IGYwOGNjOGIuLjMzOTRkZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuaApAQCAtMTQ5LDYgKzE0OSw4IEBACiAjZGVmaW5lIEFSX1BIWV9FWFRfQ0NBX1RIUkVTSDYyX1MgICAgICAgMTYKICNkZWZpbmUgQVJfUEhZX0VYVF9NSU5DQ0FfUFdSICAgMHgwMUZGMDAwMAogI2RlZmluZSBBUl9QSFlfRVhUX01JTkNDQV9QV1JfUyAxNgorI2RlZmluZSBBUl9QSFlfRVhUX0NZQ1BXUl9USFIxIDB4MDAwMEZFMDBMCisjZGVmaW5lIEFSX1BIWV9FWFRfQ1lDUFdSX1RIUjFfUyA5CiAjZGVmaW5lIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxICAweDAwMDAwMEZFCiAjZGVmaW5lIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxX1MgICAgMQogI2RlZmluZSBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMV9FTkFCTEUgIDB4MDAwMDAwMDEKQEAgLTI4Myw2ICsyODUsMTIgQEAKICNkZWZpbmUgQVJfUEhZX0NDS19TUFVSX01JVF9DQ0tfU1BVUl9GUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZmZmZmUwMAogI2RlZmluZSBBUl9QSFlfQ0NLX1NQVVJfTUlUX0NDS19TUFVSX0ZSRVFfUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CiAKKyNkZWZpbmUgQVJfUEhZX01SQ19DQ0tfQ1RSTCAgICAgICAgIChBUl9BR0NfQkFTRSArIDB4MWQwKQorI2RlZmluZSBBUl9QSFlfTVJDX0NDS19FTkFCTEUgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfTVJDX0NDS19FTkFCTEVfUyAgICAgICAgICAgICAgMAorI2RlZmluZSBBUl9QSFlfTVJDX0NDS19NVVhfUkVHICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBUl9QSFlfTVJDX0NDS19NVVhfUkVHX1MgICAgICAgICAgICAgMQorCiAjZGVmaW5lIEFSX1BIWV9SWF9PQ0dBSU4gICAgICAgIChBUl9BR0NfQkFTRSArIDB4MjAwKQogCiAjZGVmaW5lIEFSX1BIWV9DQ0FfTk9NX1ZBTF85MzAwXzJHSFogICAgICAgICAgLTExMApAQCAtNDUxLDcgKzQ1OSwxMSBAQAogI2RlZmluZSBBUl9QSFlfVFNUREFDICAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDE2OCkKIAogI2RlZmluZSBBUl9QSFlfQ0hBTl9TVEFUVVMgICAgICAgKEFSX1NNX0JBU0UgKyAweDE2YykKLSNkZWZpbmUgQVJfUEhZX0NIQU5fSU5GT19NRU1PUlkgIChBUl9TTV9CQVNFICsgMHgxNzApCisKKyNkZWZpbmUgQVJfUEhZX0NIQU5fSU5GT19NRU1PUlkJCQkJKEFSX1NNX0JBU0UgKyAweDE3MCkKKyNkZWZpbmUgQVJfUEhZX0NIQU5fSU5GT19NRU1PUllfQ0hBTklORk9NRU1fUzJfUkVBRAkweDAwMDAwMDA4CisjZGVmaW5lIEFSX1BIWV9DSEFOX0lORk9fTUVNT1JZX0NIQU5JTkZPTUVNX1MyX1JFQURfUwkzCisKICNkZWZpbmUgQVJfUEhZX0NITklORk9fTk9JU0VQV1IgIChBUl9TTV9CQVNFICsgMHgxNzQpCiAjZGVmaW5lIEFSX1BIWV9DSE5JTkZPX0dBSU5ESUZGICAoQVJfU01fQkFTRSArIDB4MTc4KQogI2RlZmluZSBBUl9QSFlfQ0hOSU5GT19GSU5FVElNICAgKEFSX1NNX0JBU0UgKyAweDE3YykKQEAgLTQ2NywzMCArNDc5LDg2IEBACiAjZGVmaW5lIEFSX1BIWV9QV1JUWF9NQVggICAgICAgICAoQVJfU01fQkFTRSArIDB4MWYwKQogI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfU1VCICAgICAgKEFSX1NNX0JBU0UgKyAweDFmNCkKIAotI2RlZmluZSBBUl9QSFlfVFBDXzRfQjAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDIwNCkKLSNkZWZpbmUgQVJfUEhZX1RQQ181X0IwICAgICAgICAgIChBUl9TTV9CQVNFICsgMHgyMDgpCi0jZGVmaW5lIEFSX1BIWV9UUENfNl9CMCAgICAgICAgICAoQVJfU01fQkFTRSArIDB4MjBjKQotI2RlZmluZSBBUl9QSFlfVFBDXzExX0IwICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDIyMCkKLSNkZWZpbmUgQVJfUEhZX1RQQ18xOCAgICAgICAgICAgIChBUl9TTV9CQVNFICsgMHgyM2MpCi0jZGVmaW5lIEFSX1BIWV9UUENfMTkgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4MjQwKQorI2RlZmluZSBBUl9QSFlfVFBDXzEJCQkJKEFSX1NNX0JBU0UgKyAweDFmOCkKKyNkZWZpbmUgQVJfUEhZX1RQQ18xX0ZPUkNFRF9EQUNfR0FJTgkJMHgwMDAwMDAzZQorI2RlZmluZSBBUl9QSFlfVFBDXzFfRk9SQ0VEX0RBQ19HQUlOX1MJCTEKKyNkZWZpbmUgQVJfUEhZX1RQQ18xX0ZPUkNFX0RBQ19HQUlOCQkweDAwMDAwMDAxCisjZGVmaW5lIEFSX1BIWV9UUENfMV9GT1JDRV9EQUNfR0FJTl9TCQkwCiAKLSNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOICAgIChBUl9TTV9CQVNFICsgMHgyNTgpCisjZGVmaW5lIEFSX1BIWV9UUENfNF9CMAkJCQkoQVJfU01fQkFTRSArIDB4MjA0KQorI2RlZmluZSBBUl9QSFlfVFBDXzVfQjAJCQkJKEFSX1NNX0JBU0UgKyAweDIwOCkKKyNkZWZpbmUgQVJfUEhZX1RQQ182X0IwCQkJCShBUl9TTV9CQVNFICsgMHgyMGMpCisKKyNkZWZpbmUgQVJfUEhZX1RQQ18xMV9CMAkJCShBUl9TTV9CQVNFICsgMHgyMjApCisjZGVmaW5lIEFSX1BIWV9UUENfMTFfQjEJCQkoQVJfU00xX0JBU0UgKyAweDIyMCkKKyNkZWZpbmUgQVJfUEhZX1RQQ18xMV9CMgkJCShBUl9TTTJfQkFTRSArIDB4MjIwKQorI2RlZmluZSBBUl9QSFlfVFBDXzExX09MUENfR0FJTl9ERUxUQQkJMHgwMGZmMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDXzExX09MUENfR0FJTl9ERUxUQV9TCQkxNgorCisjZGVmaW5lIEFSX1BIWV9UUENfMTIJCQkJKEFSX1NNX0JBU0UgKyAweDIyNCkKKyNkZWZpbmUgQVJfUEhZX1RQQ18xMl9ERVNJUkVEX1NDQUxFX0hUNDBfNQkweDNlMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENfMTJfREVTSVJFRF9TQ0FMRV9IVDQwXzVfUwkyNQorCisjZGVmaW5lIEFSX1BIWV9UUENfMTgJCQkJKEFSX1NNX0JBU0UgKyAweDIzYykKKyNkZWZpbmUgQVJfUEhZX1RQQ18xOF9USEVSTV9DQUxfVkFMVUUgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgQVJfUEhZX1RQQ18xOF9USEVSTV9DQUxfVkFMVUVfUyAgICAgICAgIDAKKyNkZWZpbmUgQVJfUEhZX1RQQ18xOF9WT0xUX0NBTF9WQUxVRQkJMHgwMDAwZmYwMAorI2RlZmluZSBBUl9QSFlfVFBDXzE4X1ZPTFRfQ0FMX1ZBTFVFX1MJCTgKKworI2RlZmluZSBBUl9QSFlfVFBDXzE5CQkJCShBUl9TTV9CQVNFICsgMHgyNDApCisjZGVmaW5lIEFSX1BIWV9UUENfMTlfQUxQSEFfVk9MVAkJMHgwMDFmMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDXzE5X0FMUEhBX1ZPTFRfUwkJMTYKKyNkZWZpbmUgQVJfUEhZX1RQQ18xOV9BTFBIQV9USEVSTQkJMHhmZgorI2RlZmluZSBBUl9QSFlfVFBDXzE5X0FMUEhBX1RIRVJNX1MJCTAKKworI2RlZmluZSBBUl9QSFlfVFhfRk9SQ0VEX0dBSU4JCQkJKEFSX1NNX0JBU0UgKyAweDI1OCkKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFX1RYX0dBSU4JCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFX1RYX0dBSU5fUwkJMAorI2RlZmluZSBBUl9QSFlfVFhfRk9SQ0VEX0dBSU5fRk9SQ0VEX1RYQkIxREJHQUlOCTB4MDAwMDAwMGUKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9UWEJCMURCR0FJTl9TCTEKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9UWEJCNkRCR0FJTgkweDAwMDAwMDMwCisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfVFhCQjZEQkdBSU5fUwk0CisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfVFhNWFJHQUlOCQkweDAwMDAwM2MwCisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfVFhNWFJHQUlOX1MJNgorI2RlZmluZSBBUl9QSFlfVFhfRk9SQ0VEX0dBSU5fRk9SQ0VEX1BBRFJWR05BCQkweDAwMDAzYzAwCisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfUEFEUlZHTkFfUwkJMTAKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9QQURSVkdOQgkJMHgwMDAzYzAwMAorI2RlZmluZSBBUl9QSFlfVFhfRk9SQ0VEX0dBSU5fRk9SQ0VEX1BBRFJWR05CX1MJCTE0CisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfUEFEUlZHTkMJCTB4MDAzYzAwMDAKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9QQURSVkdOQ19TCQkxOAorI2RlZmluZSBBUl9QSFlfVFhfRk9SQ0VEX0dBSU5fRk9SQ0VEX1BBRFJWR05ECQkweDAwYzAwMDAwCisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfUEFEUlZHTkRfUwkJMjIKKyNkZWZpbmUgQVJfUEhZX1RYX0ZPUkNFRF9HQUlOX0ZPUkNFRF9FTkFCTEVfUEFMCQkweDAxMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9UWF9GT1JDRURfR0FJTl9GT1JDRURfRU5BQkxFX1BBTF9TCTI0CisKIAogI2RlZmluZSBBUl9QSFlfUERBRENfVEFCXzAgICAgICAgKEFSX1NNX0JBU0UgKyAweDI4MCkKIAorI2RlZmluZSBBUl9QSFlfVFhHQUlOX1RBQkxFICAgICAgKEFSX1NNX0JBU0UgKyAweDMwMCkKKwogI2RlZmluZSBBUl9QSFlfVFhfSVFDQUxfQ09OVFJPTF8xICAgKEFSX1NNX0JBU0UgKyAweDQ0OCkKICNkZWZpbmUgQVJfUEhZX1RYX0lRQ0FMX1NUQVJUICAgICAgIChBUl9TTV9CQVNFICsgMHg0NDApCiAjZGVmaW5lIEFSX1BIWV9UWF9JUUNBTF9TVEFUVVNfQjAgICAoQVJfU01fQkFTRSArIDB4NDhjKQogI2RlZmluZSBBUl9QSFlfVFhfSVFDQUxfQ09SUl9DT0VGRl8wMV9CMCAgICAoQVJfU01fQkFTRSArIDB4NDUwKQogCi0jZGVmaW5lIEFSX1BIWV9QQU5JQ19XRF9TVEFUVVMgICAgICAoQVJfU01fQkFTRSArIDB4NWMwKQotI2RlZmluZSBBUl9QSFlfUEFOSUNfV0RfQ1RMXzEgICAgICAgKEFSX1NNX0JBU0UgKyAweDVjNCkKLSNkZWZpbmUgQVJfUEhZX1BBTklDX1dEX0NUTF8yICAgICAgIChBUl9TTV9CQVNFICsgMHg1YzgpCi0jZGVmaW5lIEFSX1BIWV9CVF9DVEwgICAgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4NWNjKQorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfU1RBVFVTICAgICAgKEFSX1NNX0JBU0UgKyAweDVjMCkKKyNkZWZpbmUgQVJfUEhZX1dBVENIRE9HX0NUTF8xICAgICAgIChBUl9TTV9CQVNFICsgMHg1YzQpCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19DVExfMiAgICAgICAoQVJfU01fQkFTRSArIDB4NWM4KQorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfQ1RMICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDVjYykKICNkZWZpbmUgQVJfUEhZX09OTFlfV0FSTVJFU0VUICAgICAgIChBUl9TTV9CQVNFICsgMHg1ZDApCiAjZGVmaW5lIEFSX1BIWV9PTkxZX0NUTCAgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4NWQ0KQogI2RlZmluZSBBUl9QSFlfRUNPX0NUUkwgICAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDVkYykKLSNkZWZpbmUgQVJfUEhZX0JCX1RIRVJNX0FEQ18xICAgICAgIChBUl9TTV9CQVNFICsgMHgyNDgpCisKKyNkZWZpbmUgQVJfUEhZX0JCX1RIRVJNX0FEQ18xCQkJCShBUl9TTV9CQVNFICsgMHgyNDgpCisjZGVmaW5lIEFSX1BIWV9CQl9USEVSTV9BRENfMV9JTklUX1RIRVJNCQkweDAwMDAwMGZmCisjZGVmaW5lIEFSX1BIWV9CQl9USEVSTV9BRENfMV9JTklUX1RIRVJNX1MJCTAKKworI2RlZmluZSBBUl9QSFlfQkJfVEhFUk1fQURDXzQJCQkJKEFSX1NNX0JBU0UgKyAweDI1NCkKKyNkZWZpbmUgQVJfUEhZX0JCX1RIRVJNX0FEQ180X0xBVEVTVF9USEVSTV9WQUxVRQkweDAwMDAwMGZmCisjZGVmaW5lIEFSX1BIWV9CQl9USEVSTV9BRENfNF9MQVRFU1RfVEhFUk1fVkFMVUVfUwkwCisjZGVmaW5lIEFSX1BIWV9CQl9USEVSTV9BRENfNF9MQVRFU1RfVk9MVF9WQUxVRQkJMHgwMDAwZmYwMAorI2RlZmluZSBBUl9QSFlfQkJfVEhFUk1fQURDXzRfTEFURVNUX1ZPTFRfVkFMVUVfUwk4CisKIAogI2RlZmluZSBBUl9QSFlfNjVOTV9DSDBfU1lOVEg0ICAgICAgMHgxNjA4YwogI2RlZmluZSBBUl9QSFlfU1lOVEg0X0xPTkdfU0hJRlRfU0VMRUNUICAgMHgwMDAwMDAwMgpAQCAtNjYwLDE3ICs3MjgsOSBAQAogI2RlZmluZSBBUl9QSFlfVFhfSVFDQUxfQ09SUl9DT0VGRl8wMV9DT0VGRl9UQUJMRSAgICAgIDB4MDAwMDNmZmYKICNkZWZpbmUgQVJfUEhZX1RYX0lRQ0FMX0NPUlJfQ09FRkZfMDFfQ09FRkZfVEFCTEVfUyAgICAwCiAKLSNkZWZpbmUgQVJfUEhZX1RQQ18xOF9USEVSTV9DQUxfVkFMVUUgICAgICAgICAgIDB4ZmYKLSNkZWZpbmUgQVJfUEhZX1RQQ18xOF9USEVSTV9DQUxfVkFMVUVfUyAgICAgICAgIDAKLSNkZWZpbmUgQVJfUEhZX1RQQ18xOV9BTFBIQV9USEVSTSAgICAgICAgICAgICAgIDB4ZmYKLSNkZWZpbmUgQVJfUEhZX1RQQ18xOV9BTFBIQV9USEVSTV9TICAgICAgICAgICAgIDAKLQogI2RlZmluZSBBUl9QSFlfNjVOTV9DSDBfUlhUWDRfVEhFUk1fT04gICAgICAgICAgMHgxMDAwMDAwMAogI2RlZmluZSBBUl9QSFlfNjVOTV9DSDBfUlhUWDRfVEhFUk1fT05fUyAgICAgICAgMjgKIAotI2RlZmluZSBBUl9QSFlfQkJfVEhFUk1fQURDXzFfSU5JVF9USEVSTSAgICAgICAgMHgwMDAwMDBmZgotI2RlZmluZSBBUl9QSFlfQkJfVEhFUk1fQURDXzFfSU5JVF9USEVSTV9TICAgICAgMAotCiAvKgogICogQ2hhbm5lbCAxIFJlZ2lzdGVyIE1hcAogICovCkBAIC04MTIsMzUgKzg3MiwxNzMgQEAKICNkZWZpbmUgQVJfUEhZX0NBTF9NRUFTXzJfOTMwMF8xMChfaSkgKEFSX1BIWV9JUV9BRENfTUVBU18yX0IwXzkzMDBfMTAgKyAoQVJfUEhZX0NIQUlOX09GRlNFVCAqIChfaSkpKQogI2RlZmluZSBBUl9QSFlfQ0FMX01FQVNfM185MzAwXzEwKF9pKSAoQVJfUEhZX0lRX0FEQ19NRUFTXzNfQjBfOTMwMF8xMCArIChBUl9QSFlfQ0hBSU5fT0ZGU0VUICogKF9pKSkpCiAKLSNkZWZpbmUgQVJfUEhZX0JCX1BBTklDX05PTl9JRExFX0VOQUJMRSAweDAwMDAwMDAxCi0jZGVmaW5lIEFSX1BIWV9CQl9QQU5JQ19JRExFX0VOQUJMRSAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBUl9QSFlfQkJfUEFOSUNfSURMRV9NQVNLICAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVJfUEhZX0JCX1BBTklDX05PTl9JRExFX01BU0sgICAweDAwMDBGRkZDCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19OT05fSURMRV9FTkFCTEUgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfSURMRV9FTkFCTEUgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfUEhZX1dBVENIRE9HX0lETEVfTUFTSyAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19OT05fSURMRV9NQVNLICAgICAgMHgwMDAwRkZGQwogCi0jZGVmaW5lIEFSX1BIWV9CQl9QQU5JQ19SU1RfRU5BQkxFICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBUl9QSFlfQkJfUEFOSUNfSVJRX0VOQUJMRSAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQVJfUEhZX0JCX1BBTklDX0NOVEwyX01BU0sgICAgICAweEZGRkZGRkY5CisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19SU1RfRU5BQkxFICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfSVJRX0VOQUJMRSAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfUEhZX1dBVENIRE9HX0NOVEwyX01BU0sgICAgICAgICAweEZGRkZGRkY5CiAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1NUQVRVUyAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIEFSX1BIWV9CQl9XRF9TVEFUVVNfUyAgICAgICAgICAgMAotI2RlZmluZSBBUl9QSFlfQkJfV0RfREVUX0hBTkcgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX0RFVF9IQU5HX1MgICAgICAgICAzCi0jZGVmaW5lIEFSX1BIWV9CQl9XRF9SQURBUl9TTSAgICAgICAgICAgMHgwMDAwMDBGMAotI2RlZmluZSBBUl9QSFlfQkJfV0RfUkFEQVJfU01fUyAgICAgICAgIDQKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1JYX09GRE1fU00gICAgICAgICAweDAwMDAwRjAwCi0jZGVmaW5lIEFSX1BIWV9CQl9XRF9SWF9PRkRNX1NNX1MgICAgICAgOAotI2RlZmluZSBBUl9QSFlfQkJfV0RfUlhfQ0NLX1NNICAgICAgICAgIDB4MDAwMEYwMDAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1JYX0NDS19TTV9TICAgICAgICAxMgotI2RlZmluZSBBUl9QSFlfQkJfV0RfVFhfT0ZETV9TTSAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1RYX09GRE1fU01fUyAgICAgICAxNgotI2RlZmluZSBBUl9QSFlfQkJfV0RfVFhfQ0NLX1NNICAgICAgICAgIDB4MDBGMDAwMDAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1RYX0NDS19TTV9TICAgICAgICAyMAotI2RlZmluZSBBUl9QSFlfQkJfV0RfQUdDX1NNICAgICAgICAgICAgIDB4MEYwMDAwMDAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX0FHQ19TTV9TICAgICAgICAgICAyNAotI2RlZmluZSBBUl9QSFlfQkJfV0RfU1JDSF9TTSAgICAgICAgICAgIDB4RjAwMDAwMDAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1NSQ0hfU01fUyAgICAgICAgICAyOAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfSU5GTyAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgQVJfUEhZX1dBVENIRE9HX0lORk9fUyAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19ERVRfSEFORyAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfREVUX0hBTkdfUyAgICAgICAgIDMKKyNkZWZpbmUgQVJfUEhZX1dBVENIRE9HX1JBREFSX1NNICAgICAgICAgICAweDAwMDAwMEYwCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19SQURBUl9TTV9TICAgICAgICAgNAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfUlhfT0ZETV9TTSAgICAgICAgIDB4MDAwMDBGMDAKKyNkZWZpbmUgQVJfUEhZX1dBVENIRE9HX1JYX09GRE1fU01fUyAgICAgICA4CisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19SWF9DQ0tfU00gICAgICAgICAgMHgwMDAwRjAwMAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfUlhfQ0NLX1NNX1MgICAgICAgIDEyCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19UWF9PRkRNX1NNICAgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfVFhfT0ZETV9TTV9TICAgICAgIDE2CisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19UWF9DQ0tfU00gICAgICAgICAgMHgwMEYwMDAwMAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfVFhfQ0NLX1NNX1MgICAgICAgIDIwCisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19BR0NfU00gICAgICAgICAgICAgMHgwRjAwMDAwMAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfQUdDX1NNX1MgICAgICAgICAgIDI0CisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19TUkNIX1NNICAgICAgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBBUl9QSFlfV0FUQ0hET0dfU1JDSF9TTV9TICAgICAgICAgIDI4CiAKLSNkZWZpbmUgQVJfUEhZX0JCX1dEX1NUQVRVU19DTFIgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSX1BIWV9XQVRDSERPR19TVEFUVVNfQ0xSICAgICAgICAgMHgwMDAwMDAwOAorCisvKgorICogUEFQUkQgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQVJfUEhZX1hQQV9USU1JTkdfQ1RMCQkoQVJfU01fQkFTRSArIDB4NjQpCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0FNMkFNCQkoQVJfQ0hBTl9CQVNFICsgMHhlNCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0FNMkFNX01BU0sJCTB4MDFmZmZmZmYKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0FNMkFNX01BU0tfUwkwCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0FNMlBNCQkoQVJfQ0hBTl9CQVNFICsgMHhlOCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0FNMlBNX01BU0sJCTB4MDFmZmZmZmYKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0FNMlBNX01BU0tfUwkwCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0hUNDAJCShBUl9DSEFOX0JBU0UgKyAweGVjKQorI2RlZmluZSBBUl9QSFlfUEFQUkRfSFQ0MF9NQVNLCQkweDAxZmZmZmZmCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9IVDQwX01BU0tfUwkwCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwwX0IwCQkJCShBUl9DSEFOX0JBU0UgKyAweGYwKQorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDBfQjEJCQkJKEFSX0NIQU4xX0JBU0UgKyAweGYwKQorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDBfQjIJCQkJKEFSX0NIQU4yX0JBU0UgKyAweGYwKQorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDBfUEFQUkRfRU5BQkxFCQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDBfUEFQUkRfRU5BQkxFX1MJCTAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwwX1VTRV9TSU5HTEVfVEFCTEVfTUFTSwkweDAwMDAwMDAyCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9DVFJMMF9VU0VfU0lOR0xFX1RBQkxFX01BU0tfUwkxCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9DVFJMMF9QQVBSRF9NQUdfVEhSU0gJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwwX1BBUFJEX01BR19USFJTSF9TCQkyNworCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9DVFJMMV9CMAkJCQkoQVJfQ0hBTl9CQVNFICsgMHhmNCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX0IxCQkJCShBUl9DSEFOMV9CQVNFICsgMHhmNCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX0IyCQkJCShBUl9DSEFOMl9CQVNFICsgMHhmNCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX0FEQVBUSVZFX1NDQUxJTkdfRU5BCQkweDAwMDAwMDAxCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9DVFJMMV9BREFQVElWRV9TQ0FMSU5HX0VOQV9TCTAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX0FEQVBUSVZFX0FNMkFNX0VOQUJMRQkweDAwMDAwMDAyCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9DVFJMMV9BREFQVElWRV9BTTJBTV9FTkFCTEVfUwkxCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9DVFJMMV9BREFQVElWRV9BTTJQTV9FTkFCTEUJMHgwMDAwMDAwNAorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDFfQURBUFRJVkVfQU0yUE1fRU5BQkxFX1MJMgorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDFfUEFQUkRfUE9XRVJfQVRfQU0yQU1fQ0FMCTB4MDAwMDAxZjgKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX1BBUFJEX1BPV0VSX0FUX0FNMkFNX0NBTF9TCTMKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX1BBX0dBSU5fU0NBTEVfRkFDVF9NQVNLCTB4MDAwMWZlMDAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX1BBX0dBSU5fU0NBTEVfRkFDVF9NQVNLX1MJOQorI2RlZmluZSBBUl9QSFlfUEFQUkRfQ1RSTDFfUEFQUkRfTUFHX1NDQUxFX0ZBQ1QJCTB4MGZmZTAwMDAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX0NUUkwxX1BBUFJEX01BR19TQ0FMRV9GQUNUX1MJMTcKKworI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMQkJCQkoQVJfU01fQkFTRSArIDB4NDkwKQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9DRl9QQVBSRF9UUkFJTl9FTkFCTEUJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9DRl9QQVBSRF9UUkFJTl9FTkFCTEVfUwkwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX0FHQzJfU0VUVExJTkcJMHgwMDAwMDA3ZQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9BR0MyX1NFVFRMSU5HX1MJMQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9JUUNPUlJfRU5BQkxFCTB4MDAwMDAxMDAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDFfQ0ZfUEFQUkRfSVFDT1JSX0VOQUJMRV9TCTgKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDFfQ0ZfUEFQUkRfUlhfQkJfR0FJTl9GT1JDRQkweDAwMDAwMjAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX1JYX0JCX0dBSU5fRk9SQ0VfUwk5CisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX1RYX0dBSU5fRk9SQ0UJMHgwMDAwMDQwMAorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9UWF9HQUlOX0ZPUkNFX1MJMTAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDFfQ0ZfUEFQUkRfTEJfRU5BQkxFCQkweDAwMDAwODAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX0xCX0VOQUJMRV9TCQkxMQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMV9DRl9QQVBSRF9MQl9TS0lQCQkweDAwMDNmMDAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwxX0NGX1BBUFJEX0xCX1NLSVBfUwkJMTIKKworI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMgkJCQkoQVJfU01fQkFTRSArIDB4NDk0KQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMl9DRl9QQVBSRF9JTklUX1JYX0JCX0dBSU4JMHhGRkZGRkZGRgorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMMl9DRl9QQVBSRF9JTklUX1JYX0JCX0dBSU5fUwkwCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDMJCQkJKEFSX1NNX0JBU0UgKyAweDQ5OCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDNfQ0ZfUEFQUkRfQURDX0RFU0lSRURfU0laRQkweDAwMDAwMDNmCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX0FEQ19ERVNJUkVEX1NJWkVfUwkwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX1FVSUNLX0RST1AJCTB4MDAwMDBmYzAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDNfQ0ZfUEFQUkRfUVVJQ0tfRFJPUF9TCTYKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDNfQ0ZfUEFQUkRfTUlOX0xPT1BCQUNLX0RFTAkweDAwMDFmMDAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX01JTl9MT09QQkFDS19ERUxfUwkxMgorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMM19DRl9QQVBSRF9OVU1fQ09SUl9TVEFHRVMJMHgwMDBlMDAwMAorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMM19DRl9QQVBSRF9OVU1fQ09SUl9TVEFHRVNfUwkxNworI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMM19DRl9QQVBSRF9DT0FSU0VfQ09SUl9MRU4JMHgwMGYwMDAwMAorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMM19DRl9QQVBSRF9DT0FSU0VfQ09SUl9MRU5fUwkyMAorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMM19DRl9QQVBSRF9GSU5FX0NPUlJfTEVOCTB4MGYwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDNfQ0ZfUEFQUkRfRklORV9DT1JSX0xFTl9TCTI0CisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX0JCVFhNSVhfRElTQUJMRQkweDIwMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEwzX0NGX1BBUFJEX0JCVFhNSVhfRElTQUJMRV9TCTI5CisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDQJCQkJKEFSX1NNX0JBU0UgKyAweDQ5YykKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfQ05UTDRfQ0ZfUEFQUkRfTlVNX1RSQUlOX1NBTVBMRVMJMHgwM2ZmMDAwMAorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9DTlRMNF9DRl9QQVBSRF9OVU1fVFJBSU5fU0FNUExFU19TCTE2CisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0X0NGX1BBUFJEX1NBRkVUWV9ERUxUQQkweDAwMDBmMDAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0X0NGX1BBUFJEX1NBRkVUWV9ERUxUQV9TCTEyCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0X0NGX1BBUFJEX01JTl9DT1JSCQkweDAwMDAwZmZmCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX0NOVEw0X0NGX1BBUFJEX01JTl9DT1JSX1MJCTAKKworI2RlZmluZSBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTEVfMF9CMAkJCShBUl9DSEFOX0JBU0UgKyAweDEwMCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxFXzFfQjAJCQkoQVJfQ0hBTl9CQVNFICsgMHgxMDQpCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMRV8yX0IwCQkJKEFSX0NIQU5fQkFTRSArIDB4MTA4KQorI2RlZmluZSBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTEVfM19CMAkJCShBUl9DSEFOX0JBU0UgKyAweDEwYykKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxFXzRfQjAJCQkoQVJfQ0hBTl9CQVNFICsgMHgxMTApCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMRV81X0IwCQkJKEFSX0NIQU5fQkFTRSArIDB4MTE0KQorI2RlZmluZSBBUl9QSFlfUEFQUkRfUFJFX1BPU1RfU0NBTEVfNl9CMAkJCShBUl9DSEFOX0JBU0UgKyAweDExOCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxFXzdfQjAJCQkoQVJfQ0hBTl9CQVNFICsgMHgxMWMpCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9QUkVfUE9TVF9TQ0FMSU5HCQkJCTB4M0ZGRkYKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1BSRV9QT1NUX1NDQUxJTkdfUwkJCQkwCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDEJCQkJKEFSX1NNX0JBU0UgKyAweDRhMCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDFfUEFQUkRfVFJBSU5fRE9ORQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMV9QQVBSRF9UUkFJTl9ET05FX1MJCTAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDFfUEFQUkRfVFJBSU5fSU5DT01QTEVURQkweDAwMDAwMDAyCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1RSQUlOX0lOQ09NUExFVEVfUwkxCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX0NPUlJfRVJSCQkweDAwMDAwMDA0CisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX0NPUlJfRVJSX1MJCTIKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDFfUEFQUkRfVFJBSU5fQUNUSVZFCQkweDAwMDAwMDA4CisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1RSQUlOX0FDVElWRV9TCQkzCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1JYX0dBSU5fSURYCQkweDAwMDAwMWYwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1JYX0dBSU5fSURYX1MJCTQKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDFfUEFQUkRfQUdDMl9QV1IJCTB4MDAwMWZlMDAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDFfUEFQUkRfQUdDMl9QV1JfUwkJOQorCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQyCQkJCShBUl9TTV9CQVNFICsgMHg0YTQpCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQyX1BBUFJEX0ZJTkVfVkFMCQkweDAwMDBmZmZmCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQyX1BBUFJEX0ZJTkVfVkFMX1MJCTAKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDJfUEFQUkRfQ09BUlNFX0lEWAkJMHgwMDFmMDAwMAorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMl9QQVBSRF9DT0FSU0VfSURYX1MJCTE2CisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQyX1BBUFJEX0ZJTkVfSURYCQkweDAwNjAwMDAwCisjZGVmaW5lIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQyX1BBUFJEX0ZJTkVfSURYX1MJCTIxCisKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDMJCQkJKEFSX1NNX0JBU0UgKyAweDRhOCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDNfUEFQUkRfVFJBSU5fU0FNUExFU19DTlQJMHgwMDBmZmZmZgorI2RlZmluZSBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUM19QQVBSRF9UUkFJTl9TQU1QTEVTX0NOVF9TCTAKKworI2RlZmluZSBBUl9QSFlfUEFQUkRfTUVNX1RBQl9CMAkJCShBUl9DSEFOX0JBU0UgKyAweDEyMCkKKyNkZWZpbmUgQVJfUEhZX1BBUFJEX01FTV9UQUJfQjEJCQkoQVJfQ0hBTjFfQkFTRSArIDB4MTIwKQorI2RlZmluZSBBUl9QSFlfUEFQUkRfTUVNX1RBQl9CMgkJCShBUl9DSEFOMl9CQVNFICsgMHgxMjApCisKKyNkZWZpbmUgQVJfUEhZX1BBX0dBSU4xMjNfQjAJCQkoQVJfQ0hBTl9CQVNFICsgMHhmOCkKKyNkZWZpbmUgQVJfUEhZX1BBX0dBSU4xMjNfQjEJCQkoQVJfQ0hBTjFfQkFTRSArIDB4ZjgpCisjZGVmaW5lIEFSX1BIWV9QQV9HQUlOMTIzX0IyCQkJKEFSX0NIQU4yX0JBU0UgKyAweGY4KQorI2RlZmluZSBBUl9QSFlfUEFfR0FJTjEyM19QQV9HQUlOMQkJMHgzRkYKKyNkZWZpbmUgQVJfUEhZX1BBX0dBSU4xMjNfUEFfR0FJTjFfUwkJMAorCisjZGVmaW5lIEFSX1BIWV9QT1dFUlRYX1JBVEU1CQkJKEFSX1NNX0JBU0UgKyAweDFkMCkKKyNkZWZpbmUgQVJfUEhZX1BPV0VSVFhfUkFURTVfUE9XRVJUWEhUMjBfMAkweDNGCisjZGVmaW5lIEFSX1BIWV9QT1dFUlRYX1JBVEU1X1BPV0VSVFhIVDIwXzBfUwkwCiAKIHZvaWQgYXI5MDAzX2h3X3NldF9jaGFpbl9tYXNrcyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTggcngsIHU4IHR4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaAppbmRleCA1ZWE4NzczLi45OThhZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiY29tbW9uLmgiCkBAIC0xMzYsNiArMTM3LDggQEAKICNkZWZpbmUgQVRIX01BWF9BTlRFTk5BICAgICAgICAgMwogI2RlZmluZSBBVEhfUlhCVUYgICAgICAgICAgICAgICA1MTIKICNkZWZpbmUgQVRIX1RYQlVGICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIEFUSF9UWEJVRl9SRVNFUlZFICAgICAgIDUKKyNkZWZpbmUgQVRIX01BWF9RREVQVEggICAgICAgICAgKEFUSF9UWEJVRiAvIDQgLSBBVEhfVFhCVUZfUkVTRVJWRSkKICNkZWZpbmUgQVRIX1RYTUFYVFJZICAgICAgICAgICAgMTMKICNkZWZpbmUgQVRIX01HVF9UWE1BWFRSWSAgICAgICAgNAogCkBAIC0xOTIsNiArMTk1LDcgQEAKIAogI2RlZmluZSBBVEhfVFhGSUZPX0RFUFRIIDgKIHN0cnVjdCBhdGhfdHhxIHsKKwlpbnQgYXhxX2NsYXNzOwogCXUzMiBheHFfcW51bTsKIAl1MzIgKmF4cV9saW5rOwogCXN0cnVjdCBsaXN0X2hlYWQgYXhxX3E7CkBAIC0yMDYsNiArMjEwLDcxIEBACiAJdTggdHhxX3RhaWxpZHg7CiB9OwogCitzdHJ1Y3QgYXRoX2F0eF9hYyB7CisJaW50IHNjaGVkOworCWludCBxbnVtOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRpZF9xOworfTsKKworc3RydWN0IGF0aF9idWZfc3RhdGUgeworCWludCBiZnNfbmZyYW1lczsKKwl1MTYgYmZzX2FsOworCXUxNiBiZnNfZnJtbGVuOworCWludCBiZnNfc2Vxbm87CisJaW50IGJmc190aWRubzsKKwlpbnQgYmZzX3JldHJpZXM7CisJdTggYmZfdHlwZTsKKwl1OCBiZnNfcGFwcmQ7CisJdW5zaWduZWQgbG9uZyBiZnNfcGFwcmRfdGltZXN0YW1wOworCXUzMiBiZnNfa2V5aXg7CisJZW51bSBhdGg5a19rZXlfdHlwZSBiZnNfa2V5dHlwZTsKK307CisKK3N0cnVjdCBhdGhfYnVmIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGF0aF9idWYgKmJmX2xhc3RiZjsJLyogbGFzdCBidWYgb2YgdGhpcyB1bml0IChhIGZyYW1lIG9yCisJCQkJCSAgIGFuIGFnZ3JlZ2F0ZSkgKi8KKwlzdHJ1Y3QgYXRoX2J1ZiAqYmZfbmV4dDsJLyogbmV4dCBzdWJmcmFtZSBpbiB0aGUgYWdncmVnYXRlICovCisJc3RydWN0IHNrX2J1ZmYgKmJmX21wZHU7CS8qIGVuY2xvc2luZyBmcmFtZSBzdHJ1Y3R1cmUgKi8KKwl2b2lkICpiZl9kZXNjOwkJCS8qIHZpcnR1YWwgYWRkciBvZiBkZXNjICovCisJZG1hX2FkZHJfdCBiZl9kYWRkcjsJCS8qIHBoeXNpY2FsIGFkZHIgb2YgZGVzYyAqLworCWRtYV9hZGRyX3QgYmZfYnVmX2FkZHI7CQkvKiBwaHlzaWNhbCBhZGRyIG9mIGRhdGEgYnVmZmVyICovCisJYm9vbCBiZl9zdGFsZTsKKwlib29sIGJmX2lzbnVsbGZ1bmM7CisJYm9vbCBiZl90eF9hYm9ydGVkOworCXUxNiBiZl9mbGFnczsKKwlzdHJ1Y3QgYXRoX2J1Zl9zdGF0ZSBiZl9zdGF0ZTsKKwlkbWFfYWRkcl90IGJmX2RtYWNvbnRleHQ7CisJc3RydWN0IGF0aF93aXBoeSAqYXBoeTsKK307CisKK3N0cnVjdCBhdGhfYXR4X3RpZCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgYnVmX3E7CisJc3RydWN0IGF0aF9ub2RlICphbjsKKwlzdHJ1Y3QgYXRoX2F0eF9hYyAqYWM7CisJc3RydWN0IGF0aF9idWYgKnR4X2J1ZltBVEhfVElEX01BWF9CVUZTXTsKKwl1MTYgc2VxX3N0YXJ0OworCXUxNiBzZXFfbmV4dDsKKwl1MTYgYmF3X3NpemU7CisJaW50IHRpZG5vOworCWludCBiYXdfaGVhZDsgICAvKiBmaXJzdCB1bi1hY2tlZCB0eCBidWZmZXIgKi8KKwlpbnQgYmF3X3RhaWw7ICAgLyogbmV4dCB1bnVzZWQgdHggYnVmZmVyIHNsb3QgKi8KKwlpbnQgc2NoZWQ7CisJaW50IHBhdXNlZDsKKwl1OCBzdGF0ZTsKK307CisKK3N0cnVjdCBhdGhfbm9kZSB7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbjsKKwlzdHJ1Y3QgYXRoX2F0eF90aWQgdGlkW1dNRV9OVU1fVElEXTsKKwlzdHJ1Y3QgYXRoX2F0eF9hYyBhY1tXTUVfTlVNX0FDXTsKKwl1MTYgbWF4YW1wZHU7CisJdTggbXBkdWRlbnNpdHk7CisJaW50IGxhc3RfcnNzaTsKK307CisKICNkZWZpbmUgQUdHUl9DTEVBTlVQICAgICAgICAgQklUKDEpCiAjZGVmaW5lIEFHR1JfQUREQkFfQ09NUExFVEUgIEJJVCgyKQogI2RlZmluZSBBR0dSX0FEREJBX1BST0dSRVNTICBCSVQoMykKQEAgLTIxNCw2ICsyODMsNyBAQAogCXN0cnVjdCBhdGhfdHhxICp0eHE7CiAJaW50IGlmX2lkOwogCWVudW0gYXRoOWtfaW50ZXJuYWxfZnJhbWVfdHlwZSBmcmFtZV90eXBlOworCXU4IHBhcHJkOwogfTsKIAogI2RlZmluZSBBVEhfVFhfRVJST1IgICAgICAgIDB4MDEKQEAgLTIyMywxMSArMjkzLDEyIEBACiBzdHJ1Y3QgYXRoX3R4IHsKIAl1MTYgc2VxX25vOwogCXUzMiB0eHFzZXR1cDsKLQlpbnQgaHdxX21hcFtBVEg5S19XTUVfQUNfVk8rMV07CisJaW50IGh3cV9tYXBbV01FX05VTV9BQ107CiAJc3BpbmxvY2tfdCB0eGJ1ZmxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCB0eGJ1ZjsKIAlzdHJ1Y3QgYXRoX3R4cSB0eHFbQVRIOUtfTlVNX1RYX1FVRVVFU107CiAJc3RydWN0IGF0aF9kZXNjZG1hIHR4ZG1hOworCWludCBwZW5kaW5nX2ZyYW1lc1tXTUVfTlVNX0FDXTsKIH07CiAKIHN0cnVjdCBhdGhfcnhfZWRtYSB7CkBAIC0yNjcsNyArMzM4LDYgQEAKIHZvaWQgYXRoX3R4cV9zY2hlZHVsZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSk7CiBpbnQgYXRoX3R4X2luaXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBuYnVmcyk7CiB2b2lkIGF0aF90eF9jbGVhbnVwKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKLXN0cnVjdCBhdGhfdHhxICphdGhfdGVzdF9nZXRfdHhxKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBhdGhfdHhxX3VwZGF0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IHFudW0sCiAJCSAgIHN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvICpxKTsKIGludCBhdGhfdHhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0zNTEsMTAgKzQyMSwxNSBAQAogCiAjZGVmaW5lIEFUSF9TVEFfU0hPUlRfQ0FMSU5URVJWQUwgMTAwMCAgICAvKiAxIHNlY29uZCAqLwogI2RlZmluZSBBVEhfQVBfU0hPUlRfQ0FMSU5URVJWQUwgIDEwMCAgICAgLyogMTAwIG1zICovCi0jZGVmaW5lIEFUSF9BTklfUE9MTElOVEVSVkFMICAgICAgMTAwICAgICAvKiAxMDAgbXMgKi8KKyNkZWZpbmUgQVRIX0FOSV9QT0xMSU5URVJWQUxfT0xEICAxMDAgICAgIC8qIDEwMCBtcyAqLworI2RlZmluZSBBVEhfQU5JX1BPTExJTlRFUlZBTF9ORVcgIDEwMDAgICAgLyogMTAwMCBtcyAqLwogI2RlZmluZSBBVEhfTE9OR19DQUxJTlRFUlZBTCAgICAgIDMwMDAwICAgLyogMzAgc2Vjb25kcyAqLwogI2RlZmluZSBBVEhfUkVTVEFSVF9DQUxJTlRFUlZBTCAgIDEyMDAwMDAgLyogMjAgbWludXRlcyAqLwogCisjZGVmaW5lIEFUSF9QQVBSRF9USU1FT1VUCTEwMCAvKiBtc2VjcyAqLworCit2b2lkIGF0aF9od19jaGVjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBhdGhfcGFwcmRfY2FsaWJyYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGF0aF9hbmlfY2FsaWJyYXRlKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qKioqKioqKioqLwpAQCAtNDg3LDYgKzU2Miw5IEBACiAJc3BpbmxvY2tfdCBzY19zZXJpYWxfcnc7CiAJc3BpbmxvY2tfdCBzY19wbV9sb2NrOwogCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGFwcmRfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfY2hlY2tfd29yazsKKwlzdHJ1Y3QgY29tcGxldGlvbiBwYXByZF9jb21wbGV0ZTsKIAogCXUzMiBpbnRyc3RhdHVzOwogCXUzMiBzY19mbGFnczsgLyogU0NfT1BfKiAqLwpAQCAtNTQ1LDcgKzYyMyw2IEBACiAKIHZvaWQgYXRoOWtfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwogaW50IGF0aF9yZXNldChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgYm9vbCByZXRyeV90eCk7Ci1pbnQgYXRoX2dldF9oYWxfcW51bSh1MTYgcXVldWUsIHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKIGludCBhdGhfZ2V0X21hYzgwMjExX3FudW0odTMyIHF1ZXVlLCBzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7CiBpbnQgYXRoX2NhYnFfdXBkYXRlKHN0cnVjdCBhdGhfc29mdGMgKik7CiAKQEAgLTU1NiwxMyArNjMzLDEyIEBACiAKIGV4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBhdGg5a19vcHM7CiBleHRlcm4gaW50IG1vZHBhcmFtX25vaHdjcnlwdDsKK2V4dGVybiBpbnQgbGVkX2JsaW5rOwogCiBpcnFyZXR1cm5fdCBhdGhfaXNyKGludCBpcnEsIHZvaWQgKmRldik7CiBpbnQgYXRoOWtfaW5pdF9kZXZpY2UodTE2IGRldmlkLCBzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTE2IHN1YnN5c2lkLAogCQkgICAgY29uc3Qgc3RydWN0IGF0aF9idXNfb3BzICpidXNfb3BzKTsKIHZvaWQgYXRoOWtfZGVpbml0X2RldmljZShzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7Ci1jb25zdCBjaGFyICphdGhfbWFjX2JiX25hbWUodTMyIG1hY19iYl92ZXJzaW9uKTsKLWNvbnN0IGNoYXIgKmF0aF9yZl9uYW1lKHUxNiByZl92ZXJzaW9uKTsKIHZvaWQgYXRoOWtfc2V0X2h3X2NhcGFiKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIGF0aDlrX3VwZGF0ZV9pY2hhbm5lbChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqaWNoYW4pOwpAQCAtNjExLDkgKzY4Nyw3IEBACiB2b2lkIGF0aDlrX3NldF93aXBoeV9pZGxlKHN0cnVjdCBhdGhfd2lwaHkgKmFwaHksIGJvb2wgaWRsZSk7CiAKIHZvaWQgYXRoX21hYzgwMjExX3N0b3BfcXVldWUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHUxNiBza2JfcXVldWUpOwotdm9pZCBhdGhfbWFjODAyMTFfc3RhcnRfcXVldWUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHUxNiBza2JfcXVldWUpOwotCi1pbnQgYXRoX3R4X2dldF9xbnVtKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBpbnQgcXR5cGUsIGludCBoYWx0eXBlKTsKK2Jvb2wgYXRoX21hYzgwMjExX3N0YXJ0X3F1ZXVlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1MTYgc2tiX3F1ZXVlKTsKIAogdm9pZCBhdGhfc3RhcnRfcmZraWxsX3BvbGwoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwogZXh0ZXJuIHZvaWQgYXRoOWtfcmZraWxsX3BvbGxfc3RhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jCmluZGV4IGY0M2Q4NWEuLjRkNGIyMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9iZWFjb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYmVhY29uLmMKQEAgLTM4LDggKzM4LDcgQEAKIAkJcWkudHFpX2N3bWF4ID0gMDsKIAl9IGVsc2UgewogCQkvKiBBZGhvYyBtb2RlOyBpbXBvcnRhbnQgdGhpbmcgaXMgdG8gdXNlIDJ4IGN3bWluLiAqLwotCQlxbnVtID0gYXRoX3R4X2dldF9xbnVtKHNjLCBBVEg5S19UWF9RVUVVRV9EQVRBLAotCQkJCSAgICAgICBBVEg5S19XTUVfQUNfQkUpOworCQlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbV01FX0FDX0JFXTsKIAkJYXRoOWtfaHdfZ2V0X3R4cV9wcm9wcyhhaCwgcW51bSwgJnFpX2JlKTsKIAkJcWkudHFpX2FpZnMgPSBxaV9iZS50cWlfYWlmczsKIAkJcWkudHFpX2N3bWluID0gNCpxaV9iZS50cWlfY3dtaW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jYWxpYi5jCmluZGV4IDA3YjhmYTYuLjEzOTI4OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jYWxpYi5jCkBAIC03NCwxMyArNzQsOCBAQAogCQkJaFtpXS5jdXJySW5kZXggPSAwOwogCiAJCWlmIChoW2ldLmludmFsaWRORmNvdW50ID4gMCkgewotCQkJaWYgKG5mYXJyYXlbaV0gPCBBUl9QSFlfQ0NBX01JTl9CQURfVkFMVUUgfHwKLQkJCSAgICBuZmFycmF5W2ldID4gQVJfUEhZX0NDQV9NQVhfSElHSF9WQUxVRSkgewotCQkJCWhbaV0uaW52YWxpZE5GY291bnQgPSBBVEg5S19ORl9DQUxfSElTVF9NQVg7Ci0JCQl9IGVsc2UgewotCQkJCWhbaV0uaW52YWxpZE5GY291bnQtLTsKLQkJCQloW2ldLnByaXZORiA9IG5mYXJyYXlbaV07Ci0JCQl9CisJCQloW2ldLmludmFsaWRORmNvdW50LS07CisJCQloW2ldLnByaXZORiA9IG5mYXJyYXlbaV07CiAJCX0gZWxzZSB7CiAJCQloW2ldLnByaXZORiA9CiAJCQkJYXRoOWtfaHdfZ2V0X25mX2hpc3RfbWlkKGhbaV0ubmZDYWxCdWZmZXIpOwpAQCAtMTcyLDYgKzE2NywxMTYgQEAKIAlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX0FHQ19DT05UUk9MLCBBUl9QSFlfQUdDX0NPTlRST0xfTkYpOwogfQogCit2b2lkIGF0aDlrX2h3X2xvYWRuZihzdHJ1Y3QgYXRoX2h3ICphaCwgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGF0aDlrX25mY2FsX2hpc3QgKmg7CisJdW5zaWduZWQgaSwgajsKKwlpbnQzMl90IHZhbDsKKwl1OCBjaGFpbm1hc2sgPSAoYWgtPnJ4Y2hhaW5tYXNrIDw8IDMpIHwgYWgtPnJ4Y2hhaW5tYXNrOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCisJaCA9IGFoLT5uZkNhbEhpc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX05GX1JFQURJTkdTOyBpKyspIHsKKwkJaWYgKGNoYWlubWFzayAmICgxIDw8IGkpKSB7CisJCQl2YWwgPSBSRUdfUkVBRChhaCwgYWgtPm5mX3JlZ3NbaV0pOworCQkJdmFsICY9IDB4RkZGRkZFMDA7CisJCQl2YWwgfD0gKCgodTMyKSAoaFtpXS5wcml2TkYpIDw8IDEpICYgMHgxZmYpOworCQkJUkVHX1dSSVRFKGFoLCBhaC0+bmZfcmVnc1tpXSwgdmFsKTsKKwkJfQorCX0KKworCS8qCisJICogTG9hZCBzb2Z0d2FyZSBmaWx0ZXJlZCBORiB2YWx1ZSBpbnRvIGJhc2ViYW5kIGludGVybmFsIG1pbkNDQXB3cgorCSAqIHZhcmlhYmxlLgorCSAqLworCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wsCisJCSAgICBBUl9QSFlfQUdDX0NPTlRST0xfRU5BQkxFX05GKTsKKwlSRUdfQ0xSX0JJVChhaCwgQVJfUEhZX0FHQ19DT05UUk9MLAorCQkgICAgQVJfUEhZX0FHQ19DT05UUk9MX05PX1VQREFURV9ORik7CisJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwgQVJfUEhZX0FHQ19DT05UUk9MX05GKTsKKworCS8qCisJICogV2FpdCBmb3IgbG9hZCB0byBjb21wbGV0ZSwgc2hvdWxkIGJlIGZhc3QsIGEgZmV3IDEwcyBvZiB1cy4KKwkgKiBUaGUgbWF4IGRlbGF5IHdhcyBjaGFuZ2VkIGZyb20gYW4gb3JpZ2luYWwgMjUwdXMgdG8gMTAwMDB1cworCSAqIHNpbmNlIDI1MHVzIG9mdGVuIHJlc3VsdHMgaW4gTkYgbG9hZCB0aW1lb3V0IGFuZCBjYXVzZXMgZGVhZgorCSAqIGNvbmRpdGlvbiBkdXJpbmcgc3RyZXNzIHRlc3RpbmcgMTIvMTIvMjAwOQorCSAqLworCWZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKKwkJaWYgKChSRUdfUkVBRChhaCwgQVJfUEhZX0FHQ19DT05UUk9MKSAmCisJCSAgICAgQVJfUEhZX0FHQ19DT05UUk9MX05GKSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJLyoKKwkgKiBXZSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIG5vaXNlZmxvb3IgdG8gbG9hZCwgcHJvYmFibHkgZHVlIHRvIGFuCisJICogaW4tcHJvZ3Jlc3MgcnguIFNpbXBseSByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIGxvYWQgcGxlbnR5IG9mIHRpbWUKKwkgKiB0byBjb21wbGV0ZSBiZWZvcmUgdGhlIG5leHQgY2FsaWJyYXRpb24gaW50ZXJ2YWwuICBXZSBuZWVkIHRvIGF2b2lkCisJICogdHJ5aW5nIHRvIGxvYWQgLTUwICh3aGljaCBoYXBwZW5zIGJlbG93KSB3aGlsZSB0aGUgcHJldmlvdXMgbG9hZCBpcworCSAqIHN0aWxsIGluIHByb2dyZXNzIGFzIHRoaXMgY2FuIGNhdXNlIHJ4IGRlYWZuZXNzLiBJbnN0ZWFkIGJ5IHJldHVybmluZworCSAqIGhlcmUsIHRoZSBiYXNlYmFuZCBuZiBjYWwgd2lsbCBqdXN0IGJlIGNhcHBlZCBieSBvdXIgcHJlc2VudAorCSAqIG5vaXNlZmxvb3IgdW50aWwgdGhlIG5leHQgY2FsaWJyYXRpb24gdGltZXIuCisJICovCisJaWYgKGogPT0gMTAwMCkgeworCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOWSwgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgbmYgIgorCQkJICAidG8gbG9hZDogQVJfUEhZX0FHQ19DT05UUk9MPTB4JXhcbiIsCisJCQkgIFJFR19SRUFEKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wpKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmVzdG9yZSBtYXhDQ0FQb3dlciByZWdpc3RlciBwYXJhbWV0ZXIgYWdhaW4gc28gdGhhdCB3ZSdyZSBub3QgY2FwcGVkCisJICogYnkgdGhlIG1lZGlhbiB3ZSBqdXN0IGxvYWRlZC4gIFRoaXMgd2lsbCBiZSBpbml0aWFsIChhbmQgbWF4KSB2YWx1ZQorCSAqIG9mIG5leHQgbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24gdGhlIGJhc2ViYW5kIGRvZXMuCisJICovCisJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9ORl9SRUFESU5HUzsgaSsrKSB7CisJCWlmIChjaGFpbm1hc2sgJiAoMSA8PCBpKSkgeworCQkJdmFsID0gUkVHX1JFQUQoYWgsIGFoLT5uZl9yZWdzW2ldKTsKKwkJCXZhbCAmPSAweEZGRkZGRTAwOworCQkJdmFsIHw9ICgoKHUzMikgKC01MCkgPDwgMSkgJiAweDFmZik7CisJCQlSRUdfV1JJVEUoYWgsIGFoLT5uZl9yZWdzW2ldLCB2YWwpOworCQl9CisJfQorCVJFR1dSSVRFX0JVRkZFUl9GTFVTSChhaCk7CisJRElTQUJMRV9SRUdXUklURV9CVUZGRVIoYWgpOworfQorCisKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X25mX3Nhbml0aXplKHN0cnVjdCBhdGhfaHcgKmFoLCBzMTYgKm5mKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGhfbmZfbGltaXRzICpsaW1pdDsKKwlpbnQgaTsKKworCWlmIChJU19DSEFOXzJHSFooYWgtPmN1cmNoYW4pKQorCQlsaW1pdCA9ICZhaC0+bmZfMmc7CisJZWxzZQorCQlsaW1pdCA9ICZhaC0+bmZfNWc7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX05GX1JFQURJTkdTOyBpKyspIHsKKwkJaWYgKCFuZltpXSkKKwkJCWNvbnRpbnVlOworCisJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJICAiTkYgY2FsaWJyYXRlZCBbJXNdIFtjaGFpbiAlZF0gaXMgJWRcbiIsCisJCQkgIChpID49IDMgPyAiZXh0IiA6ICJjdGwiKSwgaSAlIDMsIG5mW2ldKTsKKworCQlpZiAobmZbaV0gPiBsaW1pdC0+bWF4KSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCQkgICJORlslZF0gKCVkKSA+IE1BWCAoJWQpLCBjb3JyZWN0aW5nIHRvIE1BWCIsCisJCQkJICBpLCBuZltpXSwgbGltaXQtPm1heCk7CisJCQluZltpXSA9IGxpbWl0LT5tYXg7CisJCX0gZWxzZSBpZiAobmZbaV0gPCBsaW1pdC0+bWluKSB7CisJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCQkgICJORlslZF0gKCVkKSA8IE1JTiAoJWQpLCBjb3JyZWN0aW5nIHRvIE5PTSIsCisJCQkJICBpLCBuZltpXSwgbGltaXQtPm1pbik7CisJCQluZltpXSA9IGxpbWl0LT5ub21pbmFsOworCQl9CisJfQorfQorCiBpbnQxNl90IGF0aDlrX2h3X2dldG5mKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkgICAgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CkBAIC0xOTAsNiArMjk1LDcgQEAKIAkJcmV0dXJuIGNoYW4tPnJhd05vaXNlRmxvb3I7CiAJfSBlbHNlIHsKIAkJYXRoOWtfaHdfZG9fZ2V0bmYoYWgsIG5mYXJyYXkpOworCQlhdGg5a19od19uZl9zYW5pdGl6ZShhaCwgbmZhcnJheSk7CiAJCW5mID0gbmZhcnJheVswXTsKIAkJaWYgKGF0aDlrX2h3X2dldF9uZl90aHJlc2goYWgsIGMtPmJhbmQsICZuZlRocmVzaCkKIAkJICAgICYmIG5mID4gbmZUaHJlc2gpIHsKQEAgLTIxMSwyNSArMzE3LDIxIEBACiAKIHZvaWQgYXRoOWtfaW5pdF9uZmNhbF9oaXN0X2J1ZmZlcihzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKKwlzdHJ1Y3QgYXRoX25mX2xpbWl0cyAqbGltaXQ7CiAJaW50IGksIGo7Ci0JczE2IG5vaXNlX2Zsb29yOwogCi0JaWYgKEFSX1NSRVZfOTI4MChhaCkpCi0JCW5vaXNlX2Zsb29yID0gQVJfUEhZX0NDQV9NQVhfQVI5MjgwX0dPT0RfVkFMVUU7Ci0JZWxzZSBpZiAoQVJfU1JFVl85Mjg1KGFoKSB8fCBBUl9TUkVWXzkyNzEoYWgpKQotCQlub2lzZV9mbG9vciA9IEFSX1BIWV9DQ0FfTUFYX0FSOTI4NV9HT09EX1ZBTFVFOwotCWVsc2UgaWYgKEFSX1NSRVZfOTI4NyhhaCkpCi0JCW5vaXNlX2Zsb29yID0gQVJfUEhZX0NDQV9NQVhfQVI5Mjg3X0dPT0RfVkFMVUU7CisJaWYgKCFhaC0+Y3VyY2hhbiB8fCBJU19DSEFOXzJHSFooYWgtPmN1cmNoYW4pKQorCQlsaW1pdCA9ICZhaC0+bmZfMmc7CiAJZWxzZQotCQlub2lzZV9mbG9vciA9IEFSX1BIWV9DQ0FfTUFYX0FSNTQxNl9HT09EX1ZBTFVFOworCQlsaW1pdCA9ICZhaC0+bmZfNWc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX05GX1JFQURJTkdTOyBpKyspIHsKIAkJYWgtPm5mQ2FsSGlzdFtpXS5jdXJySW5kZXggPSAwOwotCQlhaC0+bmZDYWxIaXN0W2ldLnByaXZORiA9IG5vaXNlX2Zsb29yOworCQlhaC0+bmZDYWxIaXN0W2ldLnByaXZORiA9IGxpbWl0LT5ub21pbmFsOwogCQlhaC0+bmZDYWxIaXN0W2ldLmludmFsaWRORmNvdW50ID0KIAkJCUFSX1BIWV9DQ0FfRklMVEVSV0lORE9XX0xFTkdUSDsKIAkJZm9yIChqID0gMDsgaiA8IEFUSDlLX05GX0NBTF9ISVNUX01BWDsgaisrKSB7Ci0JCQlhaC0+bmZDYWxIaXN0W2ldLm5mQ2FsQnVmZmVyW2pdID0gbm9pc2VfZmxvb3I7CisJCQlhaC0+bmZDYWxIaXN0W2ldLm5mQ2FsQnVmZmVyW2pdID0gbGltaXQtPm5vbWluYWw7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jYWxpYi5oCmluZGV4IDI0NTM4YmQuLmNkNjBkMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jYWxpYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jYWxpYi5oCkBAIC0xOSwxMiArMTksNiBAQAogCiAjaW5jbHVkZSAiaHcuaCIKIAotI2RlZmluZSBBUl9QSFlfQ0NBX01BWF9BUjU0MTZfR09PRF9WQUxVRQktODUKLSNkZWZpbmUgQVJfUEhZX0NDQV9NQVhfQVI5MjgwX0dPT0RfVkFMVUUJLTExMgotI2RlZmluZSBBUl9QSFlfQ0NBX01BWF9BUjkyODVfR09PRF9WQUxVRQktMTE4Ci0jZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0FSOTI4N19HT09EX1ZBTFVFCS0xMTgKLSNkZWZpbmUgQVJfUEhZX0NDQV9NQVhfSElHSF9WQUxVRSAgICAgIAkJLTYyCi0jZGVmaW5lIEFSX1BIWV9DQ0FfTUlOX0JBRF9WQUxVRSAgICAgICAJCS0xNDAKICNkZWZpbmUgQVJfUEhZX0NDQV9GSUxURVJXSU5ET1dfTEVOR1RIX0lOSVQgICAgIDMKICNkZWZpbmUgQVJfUEhZX0NDQV9GSUxURVJXSU5ET1dfTEVOR1RIICAgICAgICAgIDUKIApAQCAtMTE1LDYgKzEwOSw3IEBACiAKIGJvb2wgYXRoOWtfaHdfcmVzZXRfY2FsdmFsaWQoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19zdGFydF9uZmNhbChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGF0aDlrX2h3X2xvYWRuZihzdHJ1Y3QgYXRoX2h3ICphaCwgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pOwogaW50MTZfdCBhdGg5a19od19nZXRuZihzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJICAgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKIHZvaWQgYXRoOWtfaW5pdF9uZmNhbF9oaXN0X2J1ZmZlcihzdHJ1Y3QgYXRoX2h3ICphaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLmMKaW5kZXggNzcwNzM0MS4uYzg2ZjdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24uYwpAQCAtMjcsMjcwICsyNyw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlNoYXJlZCBsaWJyYXJ5IGZvciBBdGhlcm9zIHdpcmVsZXNzIDgwMi4xMW4gTEFOIGNhcmRzLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogCi0vKiBDb21tb24gUlggcHJvY2Vzc2luZyAqLwotCi0vKiBBc3N1bWVzIHlvdSd2ZSBhbHJlYWR5IGRvbmUgdGhlIGVuZGlhbiB0byBDUFUgY29udmVyc2lvbiAqLwotc3RhdGljIGJvb2wgYXRoOWtfcnhfYWNjZXB0KHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCi0JCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhzLAotCQkJICAgIHN0cnVjdCBhdGhfcnhfc3RhdHVzICpyeF9zdGF0cywKLQkJCSAgICBib29sICpkZWNyeXB0X2Vycm9yKQotewotCXN0cnVjdCBhdGhfaHcgKmFoID0gY29tbW9uLT5haDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCV9fbGUxNiBmYzsKLQotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0JZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLQlpZiAoIXJ4X3N0YXRzLT5yc19kYXRhbGVuKQotCQlyZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIHJzX3N0YXR1cyBmb2xsb3dzIHJzX2RhdGFsZW4gc28gaWYgcnNfZGF0YWxlbiBpcyB0b28gbGFyZ2UKLSAgICAgICAgICogd2UgY2FuIHRha2UgYSBoaW50IHRoYXQgaGFyZHdhcmUgY29ycnVwdGVkIGl0LCBzbyBpZ25vcmUKLSAgICAgICAgICogdGhvc2UgZnJhbWVzLgotICAgICAgICAgKi8KLQlpZiAocnhfc3RhdHMtPnJzX2RhdGFsZW4gPiBjb21tb24tPnJ4X2J1ZnNpemUpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qCi0JICogcnNfbW9yZSBpbmRpY2F0ZXMgY2hhaW5lZCBkZXNjcmlwdG9ycyB3aGljaCBjYW4gYmUgdXNlZAotCSAqIHRvIGxpbmsgYnVmZmVycyB0b2dldGhlciBmb3IgYSBzb3J0IG9mIHNjYXR0ZXItZ2F0aGVyCi0JICogb3BlcmF0aW9uLgotCSAqIHJlamVjdCB0aGUgZnJhbWUsIHdlIGRvbid0IHN1cHBvcnQgc2NhdHRlci1nYXRoZXIgeWV0IGFuZAotCSAqIHRoZSBmcmFtZSBpcyBwcm9iYWJseSBjb3JydXB0IGFueXdheQotCSAqLwotCWlmIChyeF9zdGF0cy0+cnNfbW9yZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyoKLQkgKiBUaGUgcnhfc3RhdHMtPnJzX3N0YXR1cyB3aWxsIG5vdCBiZSBzZXQgdW50aWwgdGhlIGVuZCBvZiB0aGUKLQkgKiBjaGFpbmVkIGRlc2NyaXB0b3JzIHNvIGl0IGNhbiBiZSBpZ25vcmVkIGlmIHJzX21vcmUgaXMgc2V0LiBUaGUKLQkgKiByc19tb3JlIHdpbGwgYmUgZmFsc2UgYXQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW5lZAotCSAqIGRlc2NyaXB0b3JzLgotCSAqLwotCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICE9IDApIHsKLQkJaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9DUkMpCi0JCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKLQkJaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9QSFkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9ERUNSWVBUKSB7Ci0JCQkqZGVjcnlwdF9lcnJvciA9IHRydWU7Ci0JCX0gZWxzZSBpZiAocnhfc3RhdHMtPnJzX3N0YXR1cyAmIEFUSDlLX1JYRVJSX01JQykgewotCQkJaWYgKGllZWU4MDIxMV9pc19jdGwoZmMpKQotCQkJCS8qCi0JCQkJICogU29tZXRpbWVzLCB3ZSBnZXQgaW52YWxpZAotCQkJCSAqIE1JQyBmYWlsdXJlcyBvbiB2YWxpZCBjb250cm9sIGZyYW1lcy4KLQkJCQkgKiBSZW1vdmUgdGhlc2UgbWljIGVycm9ycy4KLQkJCQkgKi8KLQkJCQlyeF9zdGF0cy0+cnNfc3RhdHVzICY9IH5BVEg5S19SWEVSUl9NSUM7Ci0JCQllbHNlCi0JCQkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfTU1JQ19FUlJPUjsKLQkJfQotCQkvKgotCQkgKiBSZWplY3QgZXJyb3IgZnJhbWVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotCQkgKiBkZWNyeXB0aW9uIGFuZCBNSUMgZmFpbHVyZXMuIEZvciBtb25pdG9yIG1vZGUsCi0JCSAqIHdlIGFsc28gaWdub3JlIHRoZSBDUkMgZXJyb3IuCi0JCSAqLwotCQlpZiAoYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB7Ci0JCQlpZiAocnhfc3RhdHMtPnJzX3N0YXR1cyAmCi0JCQkgICAgfihBVEg5S19SWEVSUl9ERUNSWVBUIHwgQVRIOUtfUlhFUlJfTUlDIHwKLQkJCSAgICAgIEFUSDlLX1JYRVJSX0NSQykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJgotCQkJICAgIH4oQVRIOUtfUlhFUlJfREVDUllQVCB8IEFUSDlLX1JYRVJSX01JQykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoOWtfcHJvY2Vzc19yYXRlKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBhdGhfcnhfc3RhdHVzICpyeF9zdGF0cywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeHMsCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKLQl1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLQliYW5kID0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKLQlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbYmFuZF07Ci0KLQlpZiAocnhfc3RhdHMtPnJzX3JhdGUgJiAweDgwKSB7Ci0JCS8qIEhUIHJhdGUgKi8KLQkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfSFQ7Ci0JCWlmIChyeF9zdGF0cy0+cnNfZmxhZ3MgJiBBVEg5S19SWF8yMDQwKQotCQkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfNDBNSFo7Ci0JCWlmIChyeF9zdGF0cy0+cnNfZmxhZ3MgJiBBVEg5S19SWF9HSSkKLQkJCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOwotCQlyeHMtPnJhdGVfaWR4ID0gcnhfc3RhdHMtPnJzX3JhdGUgJiAweDdmOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgewotCQlpZiAoc2JhbmQtPmJpdHJhdGVzW2ldLmh3X3ZhbHVlID09IHJ4X3N0YXRzLT5yc19yYXRlKSB7Ci0JCQlyeHMtPnJhdGVfaWR4ID0gaTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChzYmFuZC0+Yml0cmF0ZXNbaV0uaHdfdmFsdWVfc2hvcnQgPT0gcnhfc3RhdHMtPnJzX3JhdGUpIHsKLQkJCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOwotCQkJcnhzLT5yYXRlX2lkeCA9IGk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qCi0JICogTm8gdmFsaWQgaGFyZHdhcmUgYml0cmF0ZSBmb3VuZCAtLSB3ZSBzaG91bGQgbm90IGdldCBoZXJlCi0JICogYmVjYXVzZSBoYXJkd2FyZSBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhpcyBmcmFtZSBhcyBPSy4KLQkgKi8KLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1hNSVQsICJ1bnN1cHBvcnRlZCBodyBiaXRyYXRlIGRldGVjdGVkICIKLQkJICAiMHglMDJ4IHVzaW5nIDEgTWJpdFxuIiwgcnhfc3RhdHMtPnJzX3JhdGUpOwotCWlmICgoY29tbW9uLT5kZWJ1Z19tYXNrICYgQVRIX0RCR19YTUlUKSkKLQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX05PTkUsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aDlrX3Byb2Nlc3NfcnNzaShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzKQotewotCXN0cnVjdCBhdGhfaHcgKmFoID0gY29tbW9uLT5haDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0Jc3RydWN0IGF0aF9ub2RlICphbjsKLQlpbnQgbGFzdF9yc3NpID0gQVRIX1JTU0lfRFVNTVlfTUFSS0VSOwotCV9fbGUxNiBmYzsKLQotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQkvKgotCSAqIFhYWDogdXNlIGllZWU4MDIxMV9maW5kX3N0YSEgVGhpcyByZXF1aXJlcyBxdWl0ZSBhIGJpdCBvZiB3b3JrCi0JICogdW5kZXIgdGhlIGN1cnJlbnQgYXRoOWsgdmlydHVhbCB3aXBoeSBpbXBsZW1lbnRhdGlvbiBhcyB3ZSBoYXZlCi0JICogbm8gd2F5IG9mIHR5aW5nIGEgdmlmIHRvIHdpcGh5LiBUeXBpY2FsbHkgdmlmcyBhcmUgYXR0YWNoZWQgdG8KLQkgKiBhdCBsZWFzdCBvbmUgc2RhdGEgb2YgYSB3aXBoeSBvbiBtYWM4MDIxMSBidXQgd2l0aCBhdGg5ayB2aXJ0dWFsCi0JICogd2lwaHkgeW91J2QgaGF2ZSB0byBpdGVyYXRlIG92ZXIgZXZlcnkgd2lwaHkgYW5kIGVhY2ggc2RhdGEuCi0JICovCi0Jc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2h3KGh3LCBoZHItPmFkZHIyKTsKLQlpZiAoc3RhKSB7Ci0JCWFuID0gKHN0cnVjdCBhdGhfbm9kZSAqKSBzdGEtPmRydl9wcml2OwotCQlpZiAocnhfc3RhdHMtPnJzX3Jzc2kgIT0gQVRIOUtfUlNTSV9CQUQgJiYKLQkJICAgIXJ4X3N0YXRzLT5yc19tb3JlYWdncikKLQkJCUFUSF9SU1NJX0xQRihhbi0+bGFzdF9yc3NpLCByeF9zdGF0cy0+cnNfcnNzaSk7Ci0JCWxhc3RfcnNzaSA9IGFuLT5sYXN0X3Jzc2k7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JaWYgKGxpa2VseShsYXN0X3Jzc2kgIT0gQVRIX1JTU0lfRFVNTVlfTUFSS0VSKSkKLQkJcnhfc3RhdHMtPnJzX3Jzc2kgPSBBVEhfRVBfUk5EKGxhc3RfcnNzaSwKLQkJCQkJICAgICAgQVRIX1JTU0lfRVBfTVVMVElQTElFUik7Ci0JaWYgKHJ4X3N0YXRzLT5yc19yc3NpIDwgMCkKLQkJcnhfc3RhdHMtPnJzX3Jzc2kgPSAwOwotCi0JLyogVXBkYXRlIEJlYWNvbiBSU1NJLCB0aGlzIGlzIHVzZWQgYnkgQU5JLiAqLwotCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGZjKSkKLQkJYWgtPnN0YXRzLmF2Z2Jyc3NpID0gcnhfc3RhdHMtPnJzX3Jzc2k7Ci19Ci0KLS8qCi0gKiBGb3IgRGVjcnlwdCBvciBEZW1pYyBlcnJvcnMsIHdlIG9ubHkgbWFyayBwYWNrZXQgc3RhdHVzIGhlcmUgYW5kIGFsd2F5cyBwdXNoCi0gKiB1cCB0aGUgZnJhbWUgdXAgdG8gbGV0IG1hYzgwMjExIGhhbmRsZSB0aGUgYWN0dWFsIGVycm9yIGNhc2UsIGJlIGl0IG5vCi0gKiBkZWNyeXB0aW9uIGtleSBvciByZWFsIGRlY3J5cHRpb24gZXJyb3IuIFRoaXMgbGV0IHVzIGtlZXAgc3RhdGlzdGljcyB0aGVyZS4KLSAqLwotaW50IGF0aDlrX2Ntbl9yeF9za2JfcHJlcHJvY2VzcyhzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCi0JCQkJYm9vbCAqZGVjcnlwdF9lcnJvcikKLXsKLQlzdHJ1Y3QgYXRoX2h3ICphaCA9IGNvbW1vbi0+YWg7Ci0KLQltZW1zZXQocnhfc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMpKTsKLQotCS8qCi0JICogZXZlcnl0aGluZyBidXQgdGhlIHJhdGUgaXMgY2hlY2tlZCBoZXJlLCB0aGUgcmF0ZSBjaGVjayBpcyBkb25lCi0JICogc2VwYXJhdGVseSB0byBhdm9pZCBkb2luZyB0d28gbG9va3VwcyBmb3IgYSByYXRlIGZvciBlYWNoIGZyYW1lLgotCSAqLwotCWlmICghYXRoOWtfcnhfYWNjZXB0KGNvbW1vbiwgc2tiLCByeF9zdGF0dXMsIHJ4X3N0YXRzLCBkZWNyeXB0X2Vycm9yKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhdGg5a19wcm9jZXNzX3Jzc2koY29tbW9uLCBodywgc2tiLCByeF9zdGF0cyk7Ci0KLQlpZiAoYXRoOWtfcHJvY2Vzc19yYXRlKGNvbW1vbiwgaHcsIHJ4X3N0YXRzLCByeF9zdGF0dXMsIHNrYikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jcnhfc3RhdHVzLT5tYWN0aW1lID0gYXRoOWtfaHdfZXh0ZW5kX3RzZihhaCwgcnhfc3RhdHMtPnJzX3RzdGFtcCk7Ci0Jcnhfc3RhdHVzLT5iYW5kID0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKLQlyeF9zdGF0dXMtPmZyZXEgPSBody0+Y29uZi5jaGFubmVsLT5jZW50ZXJfZnJlcTsKLQlyeF9zdGF0dXMtPnNpZ25hbCA9IEFUSF9ERUZBVUxUX05PSVNFX0ZMT09SICsgcnhfc3RhdHMtPnJzX3Jzc2k7Ci0Jcnhfc3RhdHVzLT5hbnRlbm5hID0gcnhfc3RhdHMtPnJzX2FudGVubmE7Ci0Jcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfVFNGVDsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChhdGg5a19jbW5fcnhfc2tiX3ByZXByb2Nlc3MpOwotCi12b2lkIGF0aDlrX2Ntbl9yeF9za2JfcG9zdHByb2Nlc3Moc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnhfc3RhdHMsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhzLAotCQkJCSAgYm9vbCBkZWNyeXB0X2Vycm9yKQotewotCXN0cnVjdCBhdGhfaHcgKmFoID0gY29tbW9uLT5haDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCWludCBoZHJsZW4sIHBhZHBvcywgcGFkc2l6ZTsKLQl1OCBrZXlpeDsKLQlfX2xlMTYgZmM7Ci0KLQkvKiBzZWUgaWYgYW55IHBhZGRpbmcgaXMgZG9uZSBieSB0aGUgaHcgYW5kIHJlbW92ZSBpdCAqLwotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0JaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKLQlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQlwYWRwb3MgPSBhdGg5a19jbW5fcGFkcG9zKGhkci0+ZnJhbWVfY29udHJvbCk7Ci0KLQkvKiBUaGUgTUFDIGhlYWRlciBpcyBwYWRkZWQgdG8gaGF2ZSAzMi1iaXQgYm91bmRhcnkgaWYgdGhlCi0JICogcGFja2V0IHBheWxvYWQgaXMgbm9uLXplcm8uIFRoZSBnZW5lcmFsIGNhbGN1bGF0aW9uIGZvcgotCSAqIHBhZHNpemUgd291bGQgdGFrZSBpbnRvIGFjY291bnQgb2RkIGhlYWRlciBsZW5ndGhzOgotCSAqIHBhZHNpemUgPSAoNCAtIHBhZHBvcyAlIDQpICUgNDsgSG93ZXZlciwgc2luY2Ugb25seQotCSAqIGV2ZW4tbGVuZ3RoIGhlYWRlcnMgYXJlIHVzZWQsIHBhZGRpbmcgY2FuIG9ubHkgYmUgMCBvciAyCi0JICogYnl0ZXMgYW5kIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIGEgYml0LiBJbiBhZGRpdGlvbiwgd2UgbXVzdAotCSAqIG5vdCB0cnkgdG8gcmVtb3ZlIHBhZGRpbmcgZnJvbSBzaG9ydCBjb250cm9sIGZyYW1lcyB0aGF0IGRvCi0JICogbm90IGhhdmUgcGF5bG9hZC4gKi8KLQlwYWRzaXplID0gcGFkcG9zICYgMzsKLQlpZiAocGFkc2l6ZSAmJiBza2ItPmxlbj49cGFkcG9zK3BhZHNpemUrRkNTX0xFTikgewotCQltZW1tb3ZlKHNrYi0+ZGF0YSArIHBhZHNpemUsIHNrYi0+ZGF0YSwgcGFkcG9zKTsKLQkJc2tiX3B1bGwoc2tiLCBwYWRzaXplKTsKLQl9Ci0KLQlrZXlpeCA9IHJ4X3N0YXRzLT5yc19rZXlpeDsKLQotCWlmICghKGtleWl4ID09IEFUSDlLX1JYS0VZSVhfSU5WQUxJRCkgJiYgIWRlY3J5cHRfZXJyb3IgJiYKLQkgICAgaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoZmMpKSB7Ci0JCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGZjKQotCQkgICAmJiAhZGVjcnlwdF9lcnJvciAmJiBza2ItPmxlbiA+PSBoZHJsZW4gKyA0KSB7Ci0JCWtleWl4ID0gc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDY7Ci0KLQkJaWYgKHRlc3RfYml0KGtleWl4LCBjb21tb24tPmtleW1hcCkpCi0JCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7Ci0JfQotCWlmIChhaC0+c3dfbWdtdF9jcnlwdG8gJiYKLQkgICAgKHJ4cy0+ZmxhZyAmIFJYX0ZMQUdfREVDUllQVEVEKSAmJgotCSAgICBpZWVlODAyMTFfaXNfbWdtdChmYykpCi0JCS8qIFVzZSBzb2Z0d2FyZSBkZWNyeXB0IGZvciBtYW5hZ2VtZW50IGZyYW1lcy4gKi8KLQkJcnhzLT5mbGFnICY9IH5SWF9GTEFHX0RFQ1JZUFRFRDsKLX0KLUVYUE9SVF9TWU1CT0woYXRoOWtfY21uX3J4X3NrYl9wb3N0cHJvY2Vzcyk7Ci0KIGludCBhdGg5a19jbW5fcGFkcG9zKF9fbGUxNiBmcmFtZV9jb250cm9sKQogewogCWludCBwYWRwb3MgPSAyNDsKQEAgLTQ3NSwxMCArMjExLDE0IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGF0aF9yZXNlcnZlX2tleV9jYWNoZV9zbG90KHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24pCitzdGF0aWMgaW50IGF0aF9yZXNlcnZlX2tleV9jYWNoZV9zbG90KHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCisJCQkJICAgICAgZW51bSBpZWVlODAyMTFfa2V5X2FsZyBhbGcpCiB7CiAJaW50IGk7CiAKKwlpZiAoYWxnID09IEFMR19US0lQKQorCQlyZXR1cm4gYXRoX3Jlc2VydmVfa2V5X2NhY2hlX3Nsb3RfdGtpcChjb21tb24pOworCiAJLyogRmlyc3QsIHRyeSB0byBmaW5kIHNsb3RzIHRoYXQgd291bGQgbm90IGJlIGF2YWlsYWJsZSBmb3IgVEtJUC4gKi8KIAlpZiAoY29tbW9uLT5zcGxpdG1pYykgewogCQlmb3IgKGkgPSBJRUVFODAyMTFfV0VQX05LSUQ7IGkgPCBjb21tb24tPmtleW1heCAvIDQ7IGkrKykgewpAQCAtNTQ3LDYgKzI4Nyw3IEBACiAJc3RydWN0IGF0aF9odyAqYWggPSBjb21tb24tPmFoOwogCXN0cnVjdCBhdGg5a19rZXl2YWwgaGs7CiAJY29uc3QgdTggKm1hYyA9IE5VTEw7CisJdTggZ21hY1tFVEhfQUxFTl07CiAJaW50IHJldCA9IDA7CiAJaW50IGlkeDsKIApAQCAtNTcwLDkgKzMxMSwyNyBAQAogCW1lbWNweShoay5rdl92YWwsIGtleS0+a2V5LCBrZXktPmtleWxlbik7CiAKIAlpZiAoIShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSkgewotCQkvKiBGb3Igbm93LCB1c2UgdGhlIGRlZmF1bHQga2V5cyBmb3IgYnJvYWRjYXN0IGtleXMuIFRoaXMgbWF5Ci0JCSAqIG5lZWQgdG8gY2hhbmdlIHdpdGggdmlydHVhbCBpbnRlcmZhY2VzLiAqLwotCQlpZHggPSBrZXktPmtleWlkeDsKKwkJc3dpdGNoICh2aWYtPnR5cGUpIHsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJCW1lbWNweShnbWFjLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCWdtYWNbMF0gfD0gMHgwMTsKKwkJCW1hYyA9IGdtYWM7CisJCQlpZHggPSBhdGhfcmVzZXJ2ZV9rZXlfY2FjaGVfc2xvdChjb21tb24sIGtleS0+YWxnKTsKKwkJCWJyZWFrOworCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQkJaWYgKCFzdGEpIHsKKwkJCQlpZHggPSBrZXktPmtleWlkeDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweShnbWFjLCBzdGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCWdtYWNbMF0gfD0gMHgwMTsKKwkJCW1hYyA9IGdtYWM7CisJCQlpZHggPSBhdGhfcmVzZXJ2ZV9rZXlfY2FjaGVfc2xvdChjb21tb24sIGtleS0+YWxnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWR4ID0ga2V5LT5rZXlpZHg7CisJCQlicmVhazsKKwkJfQogCX0gZWxzZSBpZiAoa2V5LT5rZXlpZHgpIHsKIAkJaWYgKFdBUk5fT04oIXN0YSkpCiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC01ODksMTQgKzM0OCwxMiBAQAogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQltYWMgPSBzdGEtPmFkZHI7CiAKLQkJaWYgKGtleS0+YWxnID09IEFMR19US0lQKQotCQkJaWR4ID0gYXRoX3Jlc2VydmVfa2V5X2NhY2hlX3Nsb3RfdGtpcChjb21tb24pOwotCQllbHNlCi0JCQlpZHggPSBhdGhfcmVzZXJ2ZV9rZXlfY2FjaGVfc2xvdChjb21tb24pOwotCQlpZiAoaWR4IDwgMCkKLQkJCXJldHVybiAtRU5PU1BDOyAvKiBubyBmcmVlIGtleSBjYWNoZSBlbnRyaWVzICovCisJCWlkeCA9IGF0aF9yZXNlcnZlX2tleV9jYWNoZV9zbG90KGNvbW1vbiwga2V5LT5hbGcpOwogCX0KIAorCWlmIChpZHggPCAwKQorCQlyZXR1cm4gLUVOT1NQQzsgLyogbm8gZnJlZSBrZXkgY2FjaGUgZW50cmllcyAqLworCiAJaWYgKGtleS0+YWxnID09IEFMR19US0lQKQogCQlyZXQgPSBhdGhfc2V0a2V5X3RraXAoY29tbW9uLCBpZHgsIGtleS0+a2V5LCAmaGssIG1hYywKIAkJCQkgICAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApOwpAQCAtNjQ0LDYgKzQwMSwxOSBAQAogfQogRVhQT1JUX1NZTUJPTChhdGg5a19jbW5fa2V5X2RlbGV0ZSk7CiAKK2ludCBhdGg5a19jbW5fY291bnRfc3RyZWFtcyh1bnNpZ25lZCBpbnQgY2hhaW5tYXNrLCBpbnQgbWF4KQoreworCWludCBzdHJlYW1zID0gMDsKKworCWRvIHsKKwkJaWYgKCsrc3RyZWFtcyA9PSBtYXgpCisJCQlicmVhazsKKwl9IHdoaWxlICgoY2hhaW5tYXNrID0gY2hhaW5tYXNrICYgKGNoYWlubWFzayAtIDEpKSk7CisKKwlyZXR1cm4gc3RyZWFtczsKK30KK0VYUE9SVF9TWU1CT0woYXRoOWtfY21uX2NvdW50X3N0cmVhbXMpOworCiBzdGF0aWMgaW50IF9faW5pdCBhdGg5a19jbW5faW5pdCh2b2lkKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi5oCmluZGV4IGUwOGY3ZTUuLjk3ODA5ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLmgKQEAgLTUyLDgyICs1Miw2IEBACiAjZGVmaW5lIEFUSF9FUF9STkQoeCwgbXVsKSAJCQkJCQlcCiAJKCgoKHgpJShtdWwpKSA+PSAoKG11bCkvMikpID8gKCh4KSArICgobXVsKSAtIDEpKSAvIChtdWwpIDogKHgpLyhtdWwpKQogCi1zdHJ1Y3QgYXRoX2F0eF9hYyB7Ci0JaW50IHNjaGVkOwotCWludCBxbnVtOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRpZF9xOwotfTsKLQotc3RydWN0IGF0aF9idWZfc3RhdGUgewotCWludCBiZnNfbmZyYW1lczsKLQl1MTYgYmZzX2FsOwotCXUxNiBiZnNfZnJtbGVuOwotCWludCBiZnNfc2Vxbm87Ci0JaW50IGJmc190aWRubzsKLQlpbnQgYmZzX3JldHJpZXM7Ci0JdTggYmZfdHlwZTsKLQl1MzIgYmZzX2tleWl4OwotCWVudW0gYXRoOWtfa2V5X3R5cGUgYmZzX2tleXR5cGU7Ci19OwotCi1zdHJ1Y3QgYXRoX2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBhdGhfYnVmICpiZl9sYXN0YmY7CS8qIGxhc3QgYnVmIG9mIHRoaXMgdW5pdCAoYSBmcmFtZSBvcgotCQkJCQkgICBhbiBhZ2dyZWdhdGUpICovCi0Jc3RydWN0IGF0aF9idWYgKmJmX25leHQ7CS8qIG5leHQgc3ViZnJhbWUgaW4gdGhlIGFnZ3JlZ2F0ZSAqLwotCXN0cnVjdCBza19idWZmICpiZl9tcGR1OwkvKiBlbmNsb3NpbmcgZnJhbWUgc3RydWN0dXJlICovCi0Jdm9pZCAqYmZfZGVzYzsJCQkvKiB2aXJ0dWFsIGFkZHIgb2YgZGVzYyAqLwotCWRtYV9hZGRyX3QgYmZfZGFkZHI7CQkvKiBwaHlzaWNhbCBhZGRyIG9mIGRlc2MgKi8KLQlkbWFfYWRkcl90IGJmX2J1Zl9hZGRyOwkJLyogcGh5c2ljYWwgYWRkciBvZiBkYXRhIGJ1ZmZlciAqLwotCWJvb2wgYmZfc3RhbGU7Ci0JYm9vbCBiZl9pc251bGxmdW5jOwotCWJvb2wgYmZfdHhfYWJvcnRlZDsKLQl1MTYgYmZfZmxhZ3M7Ci0Jc3RydWN0IGF0aF9idWZfc3RhdGUgYmZfc3RhdGU7Ci0JZG1hX2FkZHJfdCBiZl9kbWFjb250ZXh0OwotCXN0cnVjdCBhdGhfd2lwaHkgKmFwaHk7Ci19OwotCi1zdHJ1Y3QgYXRoX2F0eF90aWQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ1Zl9xOwotCXN0cnVjdCBhdGhfbm9kZSAqYW47Ci0Jc3RydWN0IGF0aF9hdHhfYWMgKmFjOwotCXN0cnVjdCBhdGhfYnVmICp0eF9idWZbQVRIX1RJRF9NQVhfQlVGU107Ci0JdTE2IHNlcV9zdGFydDsKLQl1MTYgc2VxX25leHQ7Ci0JdTE2IGJhd19zaXplOwotCWludCB0aWRubzsKLQlpbnQgYmF3X2hlYWQ7ICAgLyogZmlyc3QgdW4tYWNrZWQgdHggYnVmZmVyICovCi0JaW50IGJhd190YWlsOyAgIC8qIG5leHQgdW51c2VkIHR4IGJ1ZmZlciBzbG90ICovCi0JaW50IHNjaGVkOwotCWludCBwYXVzZWQ7Ci0JdTggc3RhdGU7Ci19OwotCi1zdHJ1Y3QgYXRoX25vZGUgewotCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb247Ci0Jc3RydWN0IGF0aF9hdHhfdGlkIHRpZFtXTUVfTlVNX1RJRF07Ci0Jc3RydWN0IGF0aF9hdHhfYWMgYWNbV01FX05VTV9BQ107Ci0JdTE2IG1heGFtcGR1OwotCXU4IG1wZHVkZW5zaXR5OwotCWludCBsYXN0X3Jzc2k7Ci19OwotCi1pbnQgYXRoOWtfY21uX3J4X3NrYl9wcmVwcm9jZXNzKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCi0JCQkJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnhfc3RhdHMsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKLQkJCQlib29sICpkZWNyeXB0X2Vycm9yKTsKLQotdm9pZCBhdGg5a19jbW5fcnhfc2tiX3Bvc3Rwcm9jZXNzKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4cywKLQkJCQkgIGJvb2wgZGVjcnlwdF9lcnJvcik7Ci0KIGludCBhdGg5a19jbW5fcGFkcG9zKF9fbGUxNiBmcmFtZV9jb250cm9sKTsKIGludCBhdGg5a19jbW5fZ2V0X2h3X2NyeXB0b19rZXl0eXBlKHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBhdGg5a19jbW5fdXBkYXRlX2ljaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTQwLDMgKzY0LDQgQEAKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOwogdm9pZCBhdGg5a19jbW5fa2V5X2RlbGV0ZShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOworaW50IGF0aDlrX2Ntbl9jb3VudF9zdHJlYW1zKHVuc2lnbmVkIGludCBjaGFpbm1hc2ssIGludCBtYXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwppbmRleCAyOTg5OGY4Li41NGFhZTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwpAQCAtNDIsNyArNDIsNyBAQAogCWNoYXIgYnVmWzMyXTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCi0JbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JTA4eFxuIiwgY29tbW9uLT5kZWJ1Z19tYXNrKTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgY29tbW9uLT5kZWJ1Z19tYXNrKTsKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CiB9CiAKQEAgLTU3LDcgKzU3LDcgQEAKIAogCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUZBVUxUOwogCiAJYnVmW2xlbl0gPSAnXDAnOwogCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZtYXNrKSkKQEAgLTg2LDcgKzg2LDcgQEAKIAljaGFyIGJ1ZlszMl07CiAJdW5zaWduZWQgaW50IGxlbjsKIAotCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOHhcbiIsIGNvbW1vbi0+dHhfY2hhaW5tYXNrKTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgY29tbW9uLT50eF9jaGFpbm1hc2spOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVGQVVMVDsKIAogCWJ1ZltsZW5dID0gJ1wwJzsKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmbWFzaykpCkBAIC0xMjgsNyArMTI4LDcgQEAKIAljaGFyIGJ1ZlszMl07CiAJdW5zaWduZWQgaW50IGxlbjsKIAotCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOHhcbiIsIGNvbW1vbi0+cnhfY2hhaW5tYXNrKTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgY29tbW9uLT5yeF9jaGFpbm1hc2spOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVGQVVMVDsKIAogCWJ1ZltsZW5dID0gJ1wwJzsKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmbWFzaykpCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogCWJ1ZiA9IGttYWxsb2MoRE1BX0JVRl9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlhdGg5a19wc193YWtldXAoc2MpOwogCkBAIC0yNDgsNiArMjQ4LDkgQEAKIAogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogCisJaWYgKGxlbiA+IERNQV9CVUZfTEVOKQorCQlsZW4gPSBETUFfQlVGX0xFTjsKKwogCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI2OSw2ICsyNzIsOCBAQAogCQkJc2MtPmRlYnVnLnN0YXRzLmlzdGF0cy5yeGxwKys7CiAJCWlmIChzdGF0dXMgJiBBVEg5S19JTlRfUlhIUCkKIAkJCXNjLT5kZWJ1Zy5zdGF0cy5pc3RhdHMucnhocCsrOworCQlpZiAoc3RhdHVzICYgQVRIOUtfSU5UX0JCX1dBVENIRE9HKQorCQkJc2MtPmRlYnVnLnN0YXRzLmlzdGF0cy5iYl93YXRjaGRvZysrOwogCX0gZWxzZSB7CiAJCWlmIChzdGF0dXMgJiBBVEg5S19JTlRfUlgpCiAJCQlzYy0+ZGVidWcuc3RhdHMuaXN0YXRzLnJ4b2srKzsKQEAgLTMxOSw2ICszMjQsOSBAQAogCQkJIiU4czogJTEwdVxuIiwgIlJYTFAiLCBzYy0+ZGVidWcuc3RhdHMuaXN0YXRzLnJ4bHApOwogCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSIlOHM6ICUxMHVcbiIsICJSWEhQIiwgc2MtPmRlYnVnLnN0YXRzLmlzdGF0cy5yeGhwKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCQkiJThzOiAlMTB1XG4iLCAiV0FUQ0hET0ciLAorCQkJc2MtPmRlYnVnLnN0YXRzLmlzdGF0cy5iYl93YXRjaGRvZyk7CiAJfSBlbHNlIHsKIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiJThzOiAlMTB1XG4iLCAiUlgiLCBzYy0+ZGVidWcuc3RhdHMuaXN0YXRzLnJ4b2spOwpAQCAtMzU4LDYgKzM2Niw5IEBACiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSIlOHM6ICUxMHVcbiIsICJUT1RBTCIsIHNjLT5kZWJ1Zy5zdGF0cy5pc3RhdHMudG90YWwpOwogCisJaWYgKGxlbiA+IHNpemVvZihidWYpKQorCQlsZW4gPSBzaXplb2YoYnVmKTsKKwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtMzk3LDExICs0MDgsMTAgQEAKIAlpZiAoc2MtPmN1cl9yYXRlX3RhYmxlID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JbWF4ID0gODAgKyBzYy0+Y3VyX3JhdGVfdGFibGUtPnJhdGVfY250ICogMTAyNDsKLQlidWYgPSBrbWFsbG9jKG1heCArIDEsIEdGUF9LRVJORUwpOworCW1heCA9IDgwICsgc2MtPmN1cl9yYXRlX3RhYmxlLT5yYXRlX2NudCAqIDEwMjQgKyAxOworCWJ1ZiA9IGttYWxsb2MobWF4LCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAwOwotCWJ1ZlttYXhdID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZW4gKz0gc3ByaW50ZihidWYsICIlNnMgJTZzICU2cyAiCiAJCSAgICAgICAiJTEwcyAlMTBzICUxMHMgJTEwc1xuIiwKQEAgLTQ0Myw2ICs0NTMsOSBAQAogCQkJc3RhdHMtPnBlcik7CiAJfQogCisJaWYgKGxlbiA+IG1heCkKKwkJbGVuID0gbWF4OworCiAJcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNTA1LDYgKzUxOCw5IEBACiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiYWRkcm1hc2s6ICVwTVxuIiwgYWRkcik7CiAKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOworCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwogfQogCkBAIC02MTQsMTAgKzYzMCwxMCBAQAogCWRvIHsJCQkJCQkJCVwKIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwJCQlcCiAJCQkJIiVzJTEzdSUxMXUlMTB1JTEwdVxuIiwgc3RyLAkJXAotCQlzYy0+ZGVidWcuc3RhdHMudHhzdGF0c1tzYy0+dHguaHdxX21hcFtBVEg5S19XTUVfQUNfQkVdXS5lbGVtLCBcCi0JCXNjLT5kZWJ1Zy5zdGF0cy50eHN0YXRzW3NjLT50eC5od3FfbWFwW0FUSDlLX1dNRV9BQ19CS11dLmVsZW0sIFwKLQkJc2MtPmRlYnVnLnN0YXRzLnR4c3RhdHNbc2MtPnR4Lmh3cV9tYXBbQVRIOUtfV01FX0FDX1ZJXV0uZWxlbSwgXAotCQlzYy0+ZGVidWcuc3RhdHMudHhzdGF0c1tzYy0+dHguaHdxX21hcFtBVEg5S19XTUVfQUNfVk9dXS5lbGVtKTsgXAorCQlzYy0+ZGVidWcuc3RhdHMudHhzdGF0c1tzYy0+dHguaHdxX21hcFtXTUVfQUNfQkVdXS5lbGVtLCBcCisJCXNjLT5kZWJ1Zy5zdGF0cy50eHN0YXRzW3NjLT50eC5od3FfbWFwW1dNRV9BQ19CS11dLmVsZW0sIFwKKwkJc2MtPmRlYnVnLnN0YXRzLnR4c3RhdHNbc2MtPnR4Lmh3cV9tYXBbV01FX0FDX1ZJXV0uZWxlbSwgXAorCQlzYy0+ZGVidWcuc3RhdHMudHhzdGF0c1tzYy0+dHguaHdxX21hcFtXTUVfQUNfVk9dXS5lbGVtKTsgXAogfSB3aGlsZSgwKQogCiBzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfeG1pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLApAQCAtNjMwLDcgKzY0Niw3IEBACiAKIAlidWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PTUVNOwogCiAJbGVuICs9IHNwcmludGYoYnVmLCAiJTMwcyAlMTBzJTEwcyUxMHNcblxuIiwgIkJFIiwgIkJLIiwgIlZJIiwgIlZPIik7CiAKQEAgLTY0OCw2ICs2NjQsOSBAQAogCVBSKCJEQVRBIFVuZGVycnVuOiAgICIsIGRhdGFfdW5kZXJydW4pOwogCVBSKCJERUxJTSBVbmRlcnJ1bjogICIsIGRlbGltX3VuZGVycnVuKTsKIAorCWlmIChsZW4gPiBzaXplKQorCQlsZW4gPSBzaXplOworCiAJcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CiAJa2ZyZWUoYnVmKTsKIApAQCAtNzAwLDcgKzcxOSw3IEBACiAKIAlidWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PTUVNOwogCiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKIAkJCSIlMThzIDogJTEwdVxuIiwgIkNSQyBFUlIiLApAQCAtNzUxLDYgKzc3MCw5IEBACiAJUEhZX0VSUigiSFQtTEVOR1RIIiwgQVRIOUtfUEhZRVJSX0hUX0xFTkdUSF9JTExFR0FMKTsKIAlQSFlfRVJSKCJIVC1SQVRFIiwgQVRIOUtfUEhZRVJSX0hUX1JBVEVfSUxMRUdBTCk7CiAKKwlpZiAobGVuID4gc2l6ZSkKKwkJbGVuID0gc2l6ZTsKKwogCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwogCWtmcmVlKGJ1Zik7CiAKQEAgLTgwMiw3ICs4MjQsNyBAQAogCWNoYXIgYnVmWzMyXTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCi0JbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JTA4eFxuIiwgc2MtPmRlYnVnLnJlZ2lkeCk7CisJbGVuID0gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIHNjLT5kZWJ1Zy5yZWdpZHgpOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtODE2LDcgKzgzOCw3IEBACiAKIAlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVGQVVMVDsKIAogCWJ1ZltsZW5dID0gJ1wwJzsKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmcmVnaWR4KSkKQEAgLTg0Myw3ICs4NjUsNyBAQAogCXUzMiByZWd2YWw7CiAKIAlyZWd2YWwgPSBSRUdfUkVBRF9EKGFoLCBzYy0+ZGVidWcucmVnaWR4KTsKLQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglMDh4XG4iLCByZWd2YWwpOworCWxlbiA9IHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCByZWd2YWwpOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtODU4LDcgKzg4MCw3IEBACiAKIAlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVGQVVMVDsKIAogCWJ1ZltsZW5dID0gJ1wwJzsKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmcmVndmFsKSkKQEAgLTkzNCw2ICs5NTYsMTAgQEAKIAkJCXNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgc2MsICZmb3BzX3JlZ3ZhbCkpCiAJCWdvdG8gZXJyOwogCisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmVfZXh0Y2NhIiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQlzYy0+ZGVidWcuZGVidWdmc19waHksICZhaC0+Y29uZmlnLmN3bV9pZ25vcmVfZXh0Y2NhKSkKKwkJZ290byBlcnI7CisKIAlzYy0+ZGVidWcucmVnaWR4ID0gMDsKIAlyZXR1cm4gMDsKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmgKaW5kZXggNTE0N2I4Ny4uNWQyMTcwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmgKQEAgLTUzLDYgKzUzLDcgQEAKICAqIEBjYWJlbmQ6IFJYIEVuZCBvZiBDQUIgdHJhZmZpYwogICogQGR0aW1zeW5jOiBEVElNIHN5bmMgbG9zc2FnZQogICogQGR0aW06IFJYIEJlYWNvbiB3aXRoIERUSU0KKyAqIEBiYl93YXRjaGRvZzogQmFzZWJhbmQgd2F0Y2hkb2cKICAqLwogc3RydWN0IGF0aF9pbnRlcnJ1cHRfc3RhdHMgewogCXUzMiB0b3RhbDsKQEAgLTc2LDYgKzc3LDcgQEAKIAl1MzIgY2FiZW5kOwogCXUzMiBkdGltc3luYzsKIAl1MzIgZHRpbTsKKwl1MzIgYmJfd2F0Y2hkb2c7CiB9OwogCiBzdHJ1Y3QgYXRoX3JjX3N0YXRzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uYwppbmRleCBjYTg3MDRhLi4xMjY2MzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5jCkBAIC0yNCw2ICsyNCwxNCBAQAogCXJldHVybiAodTE2KSAoKGlzMkdIeikgPyAoMjMwMCArIGZiaW4pIDogKDQ4MDAgKyA1ICogZmJpbikpOwogfQogCit2b2lkIGF0aDlrX2h3X2FuYWxvZ19zaGlmdF9yZWd3cml0ZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKyAgICAgICAgUkVHX1dSSVRFKGFoLCByZWcsIHZhbCk7CisKKyAgICAgICAgaWYgKGFoLT5jb25maWcuYW5hbG9nX3NoaWZ0cmVnKQorCQl1ZGVsYXkoMTAwKTsKK30KKwogdm9pZCBhdGg5a19od19hbmFsb2dfc2hpZnRfcm13KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgcmVnLCB1MzIgbWFzaywKIAkJCSAgICAgICB1MzIgc2hpZnQsIHUzMiB2YWwpCiB7CkBAIC0yNTAsNiArMjU4LDI3IEBACiAJcmV0dXJuIHR3aWNlTWF4RWRnZVBvd2VyOwogfQogCit2b2lkIGF0aDlrX2h3X3VwZGF0ZV9yZWd1bGF0b3J5X21heHBvd2VyKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVndWxhdG9yeSA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpOworCisJc3dpdGNoIChhcjU0MTZfZ2V0X250eGNoYWlucyhhaC0+dHhjaGFpbm1hc2spKSB7CisJY2FzZSAxOgorCQlicmVhazsKKwljYXNlIDI6CisJCXJlZ3VsYXRvcnktPm1heF9wb3dlcl9sZXZlbCArPSBJTkNSRUFTRV9NQVhQT1dfQllfVFdPX0NIQUlOOworCQlicmVhazsKKwljYXNlIDM6CisJCXJlZ3VsYXRvcnktPm1heF9wb3dlcl9sZXZlbCArPSBJTkNSRUFTRV9NQVhQT1dfQllfVEhSRUVfQ0hBSU47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRUVQUk9NLAorCQkJICAiSW52YWxpZCBjaGFpbm1hc2sgY29uZmlndXJhdGlvblxuIik7CisJCWJyZWFrOworCX0KK30KKwogaW50IGF0aDlrX2h3X2VlcHJvbV9pbml0KHN0cnVjdCBhdGhfaHcgKmFoKQogewogCWludCBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmgKaW5kZXggMjEzNTRjMTUuLjg3NTBjNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmgKQEAgLTI2Myw3ICsyNjMsOCBAQAogCUVFUF9QV1JfVEFCTEVfT0ZGU0VULAogCUVFUF9EUklWRV9TVFJFTkdUSCwKIAlFRVBfSU5URVJOQUxfUkVHVUxBVE9SLAotCUVFUF9TV1JFRworCUVFUF9TV1JFRywKKwlFRVBfUEFQUkQsCiB9OwogCiBlbnVtIGFyNTQxNl9yYXRlcyB7CkBAIC02NjksNyArNjcwLDcgQEAKIAlpbnQgKCpnZXRfZWVwcm9tX3Zlcikoc3RydWN0IGF0aF9odyAqaHcpOwogCWludCAoKmdldF9lZXByb21fcmV2KShzdHJ1Y3QgYXRoX2h3ICpodyk7CiAJdTggKCpnZXRfbnVtX2FudF9jb25maWcpKHN0cnVjdCBhdGhfaHcgKmh3LCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwotCXUxNiAoKmdldF9lZXByb21fYW50ZW5uYV9jZmcpKHN0cnVjdCBhdGhfaHcgKmh3LAorCXUzMiAoKmdldF9lZXByb21fYW50ZW5uYV9jZmcpKHN0cnVjdCBhdGhfaHcgKmh3LAogCQkJCSAgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKIAl2b2lkICgqc2V0X2JvYXJkX3ZhbHVlcykoc3RydWN0IGF0aF9odyAqaHcsIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKIAl2b2lkICgqc2V0X2FkZGFjKShzdHJ1Y3QgYXRoX2h3ICpodywgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pOwpAQCAtNjc5LDYgKzY4MCw3IEBACiAJdTE2ICgqZ2V0X3NwdXJfY2hhbm5lbCkoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBpLCBib29sIGlzMkdIeik7CiB9OwogCit2b2lkIGF0aDlrX2h3X2FuYWxvZ19zaGlmdF9yZWd3cml0ZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHJlZywgdTMyIHZhbCk7CiB2b2lkIGF0aDlrX2h3X2FuYWxvZ19zaGlmdF9ybXcoc3RydWN0IGF0aF9odyAqYWgsIHUzMiByZWcsIHUzMiBtYXNrLAogCQkJICAgICAgIHUzMiBzaGlmdCwgdTMyIHZhbCk7CiBpbnQxNl90IGF0aDlrX2h3X2ludGVycG9sYXRlKHUxNiB0YXJnZXQsIHUxNiBzcmNMZWZ0LCB1MTYgc3JjUmlnaHQsCkBAIC03MDQsNiArNzA2LDcgQEAKIAkJCQl1MTYgbnVtUmF0ZXMsIGJvb2wgaXNIdDQwVGFyZ2V0KTsKIHUxNiBhdGg5a19od19nZXRfbWF4X2VkZ2VfcG93ZXIodTE2IGZyZXEsIHN0cnVjdCBjYWxfY3RsX2VkZ2VzICpwUmRFZGdlc1Bvd2VyLAogCQkJCWJvb2wgaXMyR0h6LCBpbnQgbnVtX2JhbmRfZWRnZXMpOwordm9pZCBhdGg5a19od191cGRhdGVfcmVndWxhdG9yeV9tYXhwb3dlcihzdHJ1Y3QgYXRoX2h3ICphaCk7CiBpbnQgYXRoOWtfaHdfZWVwcm9tX2luaXQoc3RydWN0IGF0aF9odyAqYWgpOwogCiAjZGVmaW5lIGFyNTQxNl9nZXRfbnR4Y2hhaW5zKF90eGNoYWlubWFzaykJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMKaW5kZXggNDFhNzdkMS4uOWNjY2QxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCiAJCQkJc3RydWN0IGNhbF9kYXRhX3Blcl9mcmVxXzRrICpwUmF3RGF0YVNldCwKIAkJCQl1OCAqYkNoYW5zLCB1MTYgYXZhaWxQaWVycywKLQkJCQl1MTYgdFBkR2Fpbk92ZXJsYXAsIGludDE2X3QgKnBNaW5DYWxQb3dlciwKKwkJCQl1MTYgdFBkR2Fpbk92ZXJsYXAsCiAJCQkJdTE2ICpwUGRHYWluQm91bmRhcmllcywgdTggKnBQREFEQ1ZhbHVlcywKIAkJCQl1MTYgbnVtWHBkR2FpbnMpCiB7CkBAIC0yNDksNiArMjQ5LDcgQEAKIAlzdHJ1Y3QgY2hhbl9jZW50ZXJzIGNlbnRlcnM7CiAjZGVmaW5lIFBEX0dBSU5fQk9VTkRBUllfREVGQVVMVCA1ODsKIAorCW1lbXNldCgmbWluUHdyVDQsIDAsIEFSOTI4N19OVU1fUERfR0FJTlMpOwogCWF0aDlrX2h3X2dldF9jaGFubmVsX2NlbnRlcnMoYWgsIGNoYW4sICZjZW50ZXJzKTsKIAogCWZvciAobnVtUGllcnMgPSAwOyBudW1QaWVycyA8IGF2YWlsUGllcnM7IG51bVBpZXJzKyspIHsKQEAgLTMwNyw4ICszMDgsNiBAQAogCQl9CiAJfQogCi0JKnBNaW5DYWxQb3dlciA9IChpbnQxNl90KShtaW5Qd3JUNFswXSAvIDIpOwotCiAJayA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtWHBkR2FpbnM7IGkrKykgewpAQCAtMzk4LDcgKzM5Nyw2IEBACiAJc3RhdGljIHU4IHBkYWRjVmFsdWVzW0FSNTQxNl9OVU1fUERBRENfVkFMVUVTXTsKIAl1MTYgZ2FpbkJvdW5kYXJpZXNbQVI1NDE2X0VFUDRLX1BEX0dBSU5TX0lOX01BU0tdOwogCXUxNiBudW1QaWVycywgaSwgajsKLQlpbnQxNl90IHRNaW5DYWxQb3dlcjsKIAl1MTYgbnVtWHBkR2FpbiwgeHBkTWFzazsKIAl1MTYgeHBkR2FpblZhbHVlc1tBUjU0MTZfRUVQNEtfTlVNX1BEX0dBSU5TXSA9IHsgMCwgMCB9OwogCXUzMiByZWczMiwgcmVnT2Zmc2V0LCByZWdDaGFpbk9mZnNldDsKQEAgLTQ1MSw3ICs0NDksNyBAQAogCQkJYXRoOWtfaHdfZ2V0XzRrX2dhaW5fYm91bmRhcmllc19wZGFkY3MoYWgsIGNoYW4sCiAJCQkJCSAgICBwUmF3RGF0YXNldCwgcENhbEJDaGFucywKIAkJCQkJICAgIG51bVBpZXJzLCBwZEdhaW5PdmVybGFwX3QyLAotCQkJCQkgICAgJnRNaW5DYWxQb3dlciwgZ2FpbkJvdW5kYXJpZXMsCisJCQkJCSAgICBnYWluQm91bmRhcmllcywKIAkJCQkJICAgIHBkYWRjVmFsdWVzLCBudW1YcGRHYWluKTsKIAogCQkJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CkBAIC0xMTQ5LDEzICsxMTQ3LDEzIEBACiAJfQogfQogCi1zdGF0aWMgdTE2IGF0aDlrX2h3XzRrX2dldF9lZXByb21fYW50ZW5uYV9jZmcoc3RydWN0IGF0aF9odyAqYWgsCitzdGF0aWMgdTMyIGF0aDlrX2h3XzRrX2dldF9lZXByb21fYW50ZW5uYV9jZmcoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCSAgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBhcjU0MTZfZWVwcm9tXzRrICplZXAgPSAmYWgtPmVlcHJvbS5tYXA0azsKIAlzdHJ1Y3QgbW9kYWxfZWVwXzRrX2hlYWRlciAqcE1vZGFsID0gJmVlcC0+bW9kYWxIZWFkZXI7CiAKLQlyZXR1cm4gcE1vZGFsLT5hbnRDdHJsQ29tbW9uICYgMHhGRkZGOworCXJldHVybiBwTW9kYWwtPmFudEN0cmxDb21tb247CiB9CiAKIHN0YXRpYyB1OCBhdGg5a19od180a19nZXRfbnVtX2FudF9jb25maWcoc3RydWN0IGF0aF9odyAqYWgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jCmluZGV4IGI0NzFkYjUuLjRhNTJjZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jCkBAIC0xNywxNyArMTcsMTkgQEAKICNpbmNsdWRlICJody5oIgogI2luY2x1ZGUgImFyOTAwMl9waHkuaCIKIAotc3RhdGljIGludCBhdGg5a19od19BUjkyODdfZ2V0X2VlcHJvbV92ZXIoc3RydWN0IGF0aF9odyAqYWgpCisjZGVmaW5lIE5VTV9FRVBfV09SRFMgKHNpemVvZihzdHJ1Y3QgYXI5Mjg3X2VlcHJvbSkgLyBzaXplb2YodTE2KSkKKworc3RhdGljIGludCBhdGg5a19od19hcjkyODdfZ2V0X2VlcHJvbV92ZXIoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJcmV0dXJuIChhaC0+ZWVwcm9tLm1hcDkyODcuYmFzZUVlcEhlYWRlci52ZXJzaW9uID4+IDEyKSAmIDB4RjsKIH0KIAotc3RhdGljIGludCBhdGg5a19od19BUjkyODdfZ2V0X2VlcHJvbV9yZXYoc3RydWN0IGF0aF9odyAqYWgpCitzdGF0aWMgaW50IGF0aDlrX2h3X2FyOTI4N19nZXRfZWVwcm9tX3JldihzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAlyZXR1cm4gKGFoLT5lZXByb20ubWFwOTI4Ny5iYXNlRWVwSGVhZGVyLnZlcnNpb24pICYgMHhGRkY7CiB9CiAKLXN0YXRpYyBib29sIGF0aDlrX2h3X0FSOTI4N19maWxsX2VlcHJvbShzdHJ1Y3QgYXRoX2h3ICphaCkKK3N0YXRpYyBib29sIGF0aDlrX2h3X2FyOTI4N19maWxsX2VlcHJvbShzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXI5Mjg3X2VlcHJvbSAqZWVwID0gJmFoLT5lZXByb20ubWFwOTI4NzsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKQEAgLTQwLDIwICs0MiwyMCBAQAogCQkJICAiUmVhZGluZyBmcm9tIEVFUFJPTSwgbm90IGZsYXNoXG4iKTsKIAl9CiAKLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgc2l6ZW9mKHN0cnVjdCBhcjkyODdfZWVwcm9tKSAvIHNpemVvZih1MTYpOwotCQkJYWRkcisrKQl7Ci0JCWlmICghYXRoOWtfaHdfbnZyYW1fcmVhZChjb21tb24sCi0JCQkJCSBhZGRyICsgZWVwX3N0YXJ0X2xvYywgZWVwX2RhdGEpKSB7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IE5VTV9FRVBfV09SRFM7IGFkZHIrKykgeworCQlpZiAoIWF0aDlrX2h3X252cmFtX3JlYWQoY29tbW9uLCBhZGRyICsgZWVwX3N0YXJ0X2xvYywKKwkJCQkJIGVlcF9kYXRhKSkgewogCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19FRVBST00sCiAJCQkJICAiVW5hYmxlIHRvIHJlYWQgZWVwcm9tIHJlZ2lvblxuIik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJZWVwX2RhdGErKzsKIAl9CisKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBhdGg5a19od19BUjkyODdfY2hlY2tfZWVwcm9tKHN0cnVjdCBhdGhfaHcgKmFoKQorc3RhdGljIGludCBhdGg5a19od19hcjkyODdfY2hlY2tfZWVwcm9tKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXUzMiBzdW0gPSAwLCBlbCwgaW50ZWdlcjsKIAl1MTYgdGVtcCwgd29yZCwgbWFnaWMsIG1hZ2ljMiwgKmVlcGRhdGE7CkBAIC02Myw4ICs2NSw4IEBACiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAKIAlpZiAoIWF0aDlrX2h3X3VzZV9mbGFzaChhaCkpIHsKLQkJaWYgKCFhdGg5a19od19udnJhbV9yZWFkKGNvbW1vbiwKLQkJCQkJIEFSNTQxNl9FRVBST01fTUFHSUNfT0ZGU0VULCAmbWFnaWMpKSB7CisJCWlmICghYXRoOWtfaHdfbnZyYW1fcmVhZChjb21tb24sIEFSNTQxNl9FRVBST01fTUFHSUNfT0ZGU0VULAorCQkJCQkgJm1hZ2ljKSkgewogCQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCQkgICJSZWFkaW5nIE1hZ2ljICMgZmFpbGVkXG4iKTsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTcyLDYgKzc0LDcgQEAKIAogCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKIAkJCSAgIlJlYWQgTWFnaWMgPSAweCUwNFhcbiIsIG1hZ2ljKTsKKwogCQlpZiAobWFnaWMgIT0gQVI1NDE2X0VFUFJPTV9NQUdJQykgewogCQkJbWFnaWMyID0gc3dhYjE2KG1hZ2ljKTsKIApAQCAtNzksOSArODIsNyBAQAogCQkJCW5lZWRfc3dhcCA9IHRydWU7CiAJCQkJZWVwZGF0YSA9ICh1MTYgKikoJmFoLT5lZXByb20pOwogCi0JCQkJZm9yIChhZGRyID0gMDsKLQkJCQkgICAgIGFkZHIgPCBzaXplb2Yoc3RydWN0IGFyOTI4N19lZXByb20pIC8gc2l6ZW9mKHUxNik7Ci0JCQkJICAgICBhZGRyKyspIHsKKwkJCQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgTlVNX0VFUF9XT1JEUzsgYWRkcisrKSB7CiAJCQkJCXRlbXAgPSBzd2FiMTYoKmVlcGRhdGEpOwogCQkJCQkqZWVwZGF0YSA9IHRlbXA7CiAJCQkJCWVlcGRhdGErKzsKQEAgLTg5LDEzICs5MCwxNCBAQAogCQkJfSBlbHNlIHsKIAkJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0ZBVEFMLAogCQkJCQkgICJJbnZhbGlkIEVFUFJPTSBNYWdpYy4gIgotCQkJCQkgICJlbmRpYW5uZXNzIG1pc21hdGNoLlxuIik7CisJCQkJCSAgIkVuZGlhbm5lc3MgbWlzbWF0Y2guXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQogCX0KLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwgIm5lZWRfc3dhcCA9ICVzLlxuIiwgbmVlZF9zd2FwID8KLQkJICAiVHJ1ZSIgOiAiRmFsc2UiKTsKKworCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRUVQUk9NLCAibmVlZF9zd2FwID0gJXMuXG4iLAorCQkgIG5lZWRfc3dhcCA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCiAJaWYgKG5lZWRfc3dhcCkKIAkJZWwgPSBzd2FiMTYoYWgtPmVlcHJvbS5tYXA5Mjg3LmJhc2VFZXBIZWFkZXIubGVuZ3RoKTsKQEAgLTEwOCw2ICsxMTAsNyBAQAogCQllbCA9IGVsIC8gc2l6ZW9mKHUxNik7CiAKIAllZXBkYXRhID0gKHUxNiAqKSgmYWgtPmVlcHJvbSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgZWw7IGkrKykKIAkJc3VtIF49ICplZXBkYXRhKys7CiAKQEAgLTE2MSw3ICsxNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTMyIGF0aDlrX2h3X0FSOTI4N19nZXRfZWVwcm9tKHN0cnVjdCBhdGhfaHcgKmFoLAorc3RhdGljIHUzMiBhdGg5a19od19hcjkyODdfZ2V0X2VlcHJvbShzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkgICAgICBlbnVtIGVlcHJvbV9wYXJhbSBwYXJhbSkKIHsKIAlzdHJ1Y3QgYXI5Mjg3X2VlcHJvbSAqZWVwID0gJmFoLT5lZXByb20ubWFwOTI4NzsKQEAgLTE3MCw2ICsxNzMsNyBAQAogCXUxNiB2ZXJfbWlub3I7CiAKIAl2ZXJfbWlub3IgPSBwQmFzZS0+dmVyc2lvbiAmIEFSOTI4N19FRVBfVkVSX01JTk9SX01BU0s7CisKIAlzd2l0Y2ggKHBhcmFtKSB7CiAJY2FzZSBFRVBfTkZUSFJFU0hfMjoKIAkJcmV0dXJuIHBNb2RhbC0+bm9pc2VGbG9vclRocmVzaENoWzBdOwpAQCAtMjE0LDI5ICsyMTgsMjkgQEAKIAl9CiB9CiAKLQotc3RhdGljIHZvaWQgYXRoOWtfaHdfZ2V0X0FSOTI4N19nYWluX2JvdW5kYXJpZXNfcGRhZGNzKHN0cnVjdCBhdGhfaHcgKmFoLAotCQkJCSAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAotCQkJCSAgIHN0cnVjdCBjYWxfZGF0YV9wZXJfZnJlcV9hcjkyODcgKnBSYXdEYXRhU2V0LAotCQkJCSAgIHU4ICpiQ2hhbnMsICB1MTYgYXZhaWxQaWVycywKLQkJCQkgICB1MTYgdFBkR2Fpbk92ZXJsYXAsIGludDE2X3QgKnBNaW5DYWxQb3dlciwKLQkJCQkgICB1MTYgKnBQZEdhaW5Cb3VuZGFyaWVzLCB1OCAqcFBEQURDVmFsdWVzLAotCQkJCSAgIHUxNiBudW1YcGRHYWlucykKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2dldF9hcjkyODdfZ2Fpbl9ib3VuZGFyaWVzX3BkYWRjcyhzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCSAgICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgICBzdHJ1Y3QgY2FsX2RhdGFfcGVyX2ZyZXFfYXI5Mjg3ICpwUmF3RGF0YVNldCwKKwkJCSAgICAgICB1OCAqYkNoYW5zLCB1MTYgYXZhaWxQaWVycywKKwkJCSAgICAgICB1MTYgdFBkR2Fpbk92ZXJsYXAsCisJCQkgICAgICAgdTE2ICpwUGRHYWluQm91bmRhcmllcywKKwkJCSAgICAgICB1OCAqcFBEQURDVmFsdWVzLAorCQkJICAgICAgIHUxNiBudW1YcGRHYWlucykKIHsKLSNkZWZpbmUgVE1QX1ZBTF9WUERfVEFCTEUgXAorI2RlZmluZSBUTVBfVkFMX1ZQRF9UQUJMRQkJCQkJCVwKIAkoKHZwZFRhYmxlSVtpXVtzaXplQ3VyclZwZFRhYmxlIC0gMV0gKyAoc3MgLSBtYXhJbmRleCArIDEpICogdnBkU3RlcCkpOwogCi0JaW50ICAgICAgIGksIGosIGs7Ci0JaW50MTZfdCAgIHNzOwotCXUxNiAgaWR4TCA9IDAsIGlkeFIgPSAwLCBudW1QaWVyczsKLQl1OCAgICpwVnBkTCwgKnBWcGRSLCAqcFB3ckwsICpwUHdyUjsKLQl1OCAgIG1pblB3clQ0W0FSOTI4N19OVU1fUERfR0FJTlNdOwotCXU4ICAgbWF4UHdyVDRbQVI5Mjg3X05VTV9QRF9HQUlOU107Ci0JaW50MTZfdCAgIHZwZFN0ZXA7Ci0JaW50MTZfdCAgIHRtcFZhbDsKLQl1MTYgIHNpemVDdXJyVnBkVGFibGUsIG1heEluZGV4LCB0Z3RJbmRleDsKLQlib29sICAgIG1hdGNoOwotCWludDE2X3QgIG1pbkRlbHRhID0gMDsKKwlpbnQgaSwgaiwgazsKKwlpbnQxNl90IHNzOworCXUxNiBpZHhMID0gMCwgaWR4UiA9IDAsIG51bVBpZXJzOworCXU4ICpwVnBkTCwgKnBWcGRSLCAqcFB3ckwsICpwUHdyUjsKKwl1OCBtaW5Qd3JUNFtBUjkyODdfTlVNX1BEX0dBSU5TXTsKKwl1OCBtYXhQd3JUNFtBUjkyODdfTlVNX1BEX0dBSU5TXTsKKwlpbnQxNl90IHZwZFN0ZXA7CisJaW50MTZfdCB0bXBWYWw7CisJdTE2IHNpemVDdXJyVnBkVGFibGUsIG1heEluZGV4LCB0Z3RJbmRleDsKKwlib29sIG1hdGNoOworCWludDE2X3QgbWluRGVsdGEgPSAwOwogCXN0cnVjdCBjaGFuX2NlbnRlcnMgY2VudGVyczsKIAlzdGF0aWMgdTggdnBkVGFibGVMW0FSNTQxNl9FRVA0S19OVU1fUERfR0FJTlNdCiAJCVtBUjU0MTZfTUFYX1BXUl9SQU5HRV9JTl9IQUxGX0RCXTsKQEAgLTI0NSw2ICsyNDksNyBAQAogCXN0YXRpYyB1OCB2cGRUYWJsZUlbQVI1NDE2X0VFUDRLX05VTV9QRF9HQUlOU10KIAkJW0FSNTQxNl9NQVhfUFdSX1JBTkdFX0lOX0hBTEZfREJdOwogCisJbWVtc2V0KCZtaW5Qd3JUNCwgMCwgQVI5Mjg3X05VTV9QRF9HQUlOUyk7CiAJYXRoOWtfaHdfZ2V0X2NoYW5uZWxfY2VudGVycyhhaCwgY2hhbiwgJmNlbnRlcnMpOwogCiAJZm9yIChudW1QaWVycyA9IDA7IG51bVBpZXJzIDwgYXZhaWxQaWVyczsgbnVtUGllcnMrKykgewpAQCAtMjUzLDE4ICsyNTgsMTggQEAKIAl9CiAKIAltYXRjaCA9IGF0aDlrX2h3X2dldF9sb3dlcl91cHBlcl9pbmRleCgKLQkJCQkgICAodTgpRlJFUTJGQklOKGNlbnRlcnMuc3ludGhfY2VudGVyLAotCQkJCSAgICBJU19DSEFOXzJHSFooY2hhbikpLCBiQ2hhbnMsIG51bVBpZXJzLAotCQkJCSAgICAmaWR4TCwgJmlkeFIpOworCQkodTgpRlJFUTJGQklOKGNlbnRlcnMuc3ludGhfY2VudGVyLCBJU19DSEFOXzJHSFooY2hhbikpLAorCQliQ2hhbnMsIG51bVBpZXJzLCAmaWR4TCwgJmlkeFIpOwogCiAJaWYgKG1hdGNoKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1YcGRHYWluczsgaSsrKSB7CiAJCQltaW5Qd3JUNFtpXSA9IHBSYXdEYXRhU2V0W2lkeExdLnB3clBkZ1tpXVswXTsKIAkJCW1heFB3clQ0W2ldID0gcFJhd0RhdGFTZXRbaWR4TF0ucHdyUGRnW2ldWzRdOwogCQkJYXRoOWtfaHdfZmlsbF92cGRfdGFibGUobWluUHdyVDRbaV0sIG1heFB3clQ0W2ldLAotCQkJCQlwUmF3RGF0YVNldFtpZHhMXS5wd3JQZGdbaV0sCi0JCQkJCXBSYXdEYXRhU2V0W2lkeExdLnZwZFBkZ1tpXSwKLQkJCQkJQVI5Mjg3X1BEX0dBSU5fSUNFUFRTLCB2cGRUYWJsZUlbaV0pOworCQkJCQkJcFJhd0RhdGFTZXRbaWR4TF0ucHdyUGRnW2ldLAorCQkJCQkJcFJhd0RhdGFTZXRbaWR4TF0udnBkUGRnW2ldLAorCQkJCQkJQVI5Mjg3X1BEX0dBSU5fSUNFUFRTLAorCQkJCQkJdnBkVGFibGVJW2ldKTsKIAkJfQogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1YcGRHYWluczsgaSsrKSB7CkBAIC0yNzUsNjEgKzI4MCw1OCBAQAogCiAJCQltaW5Qd3JUNFtpXSA9IG1heChwUHdyTFswXSwgcFB3clJbMF0pOwogCi0JCQltYXhQd3JUNFtpXSA9Ci0JCQkJbWluKHBQd3JMW0FSOTI4N19QRF9HQUlOX0lDRVBUUyAtIDFdLAotCQkJCSAgICBwUHdyUltBUjkyODdfUERfR0FJTl9JQ0VQVFMgLSAxXSk7CisJCQltYXhQd3JUNFtpXSA9IG1pbihwUHdyTFtBUjkyODdfUERfR0FJTl9JQ0VQVFMgLSAxXSwKKwkJCQkJICBwUHdyUltBUjkyODdfUERfR0FJTl9JQ0VQVFMgLSAxXSk7CiAKIAkJCWF0aDlrX2h3X2ZpbGxfdnBkX3RhYmxlKG1pblB3clQ0W2ldLCBtYXhQd3JUNFtpXSwKLQkJCQkJcFB3ckwsIHBWcGRMLAotCQkJCQlBUjkyODdfUERfR0FJTl9JQ0VQVFMsCi0JCQkJCXZwZFRhYmxlTFtpXSk7CisJCQkJCQlwUHdyTCwgcFZwZEwsCisJCQkJCQlBUjkyODdfUERfR0FJTl9JQ0VQVFMsCisJCQkJCQl2cGRUYWJsZUxbaV0pOwogCQkJYXRoOWtfaHdfZmlsbF92cGRfdGFibGUobWluUHdyVDRbaV0sIG1heFB3clQ0W2ldLAotCQkJCQlwUHdyUiwgcFZwZFIsCi0JCQkJCUFSOTI4N19QRF9HQUlOX0lDRVBUUywKLQkJCQkJdnBkVGFibGVSW2ldKTsKKwkJCQkJCXBQd3JSLCBwVnBkUiwKKwkJCQkJCUFSOTI4N19QRF9HQUlOX0lDRVBUUywKKwkJCQkJCXZwZFRhYmxlUltpXSk7CiAKIAkJCWZvciAoaiA9IDA7IGogPD0gKG1heFB3clQ0W2ldIC0gbWluUHdyVDRbaV0pIC8gMjsgaisrKSB7Ci0JCQkJdnBkVGFibGVJW2ldW2pdID0KLQkJCQkJKHU4KShhdGg5a19od19pbnRlcnBvbGF0ZSgodTE2KQotCQkJCQlGUkVRMkZCSU4oY2VudGVycy4gc3ludGhfY2VudGVyLAotCQkJCQlJU19DSEFOXzJHSFooY2hhbikpLAotCQkJCQliQ2hhbnNbaWR4TF0sIGJDaGFuc1tpZHhSXSwKLQkJCQkJdnBkVGFibGVMW2ldW2pdLCB2cGRUYWJsZVJbaV1bal0pKTsKKwkJCQl2cGRUYWJsZUlbaV1bal0gPSAodTgpKGF0aDlrX2h3X2ludGVycG9sYXRlKAorCQkJCSAgICAgICAodTE2KUZSRVEyRkJJTihjZW50ZXJzLiBzeW50aF9jZW50ZXIsCisJCQkJCQkgICAgICBJU19DSEFOXzJHSFooY2hhbikpLAorCQkJCSAgICAgICBiQ2hhbnNbaWR4TF0sIGJDaGFuc1tpZHhSXSwKKwkJCQkgICAgICAgdnBkVGFibGVMW2ldW2pdLCB2cGRUYWJsZVJbaV1bal0pKTsKIAkJCX0KIAkJfQogCX0KLQkqcE1pbkNhbFBvd2VyID0gKGludDE2X3QpKG1pblB3clQ0WzBdIC8gMik7CiAKIAlrID0gMDsKKwogCWZvciAoaSA9IDA7IGkgPCBudW1YcGRHYWluczsgaSsrKSB7CiAJCWlmIChpID09IChudW1YcGRHYWlucyAtIDEpKQotCQkJcFBkR2FpbkJvdW5kYXJpZXNbaV0gPSAodTE2KShtYXhQd3JUNFtpXSAvIDIpOworCQkJcFBkR2FpbkJvdW5kYXJpZXNbaV0gPQorCQkJCSh1MTYpKG1heFB3clQ0W2ldIC8gMik7CiAJCWVsc2UKLQkJCXBQZEdhaW5Cb3VuZGFyaWVzW2ldID0gKHUxNikoKG1heFB3clQ0W2ldICsKLQkJCQkJCSAgICAgIG1pblB3clQ0W2krMV0pIC8gNCk7CisJCQlwUGRHYWluQm91bmRhcmllc1tpXSA9CisJCQkJKHUxNikoKG1heFB3clQ0W2ldICsgbWluUHdyVDRbaSsxXSkgLyA0KTsKIAogCQlwUGRHYWluQm91bmRhcmllc1tpXSA9IG1pbigodTE2KUFSNTQxNl9NQVhfUkFURV9QT1dFUiwKLQkJCQkJICAgIHBQZEdhaW5Cb3VuZGFyaWVzW2ldKTsKKwkJCQkJICAgcFBkR2FpbkJvdW5kYXJpZXNbaV0pOwogCiAKLQkJaWYgKChpID09IDApICYmICFBUl9TUkVWXzU0MTZfMjBfT1JfTEFURVIoYWgpKSB7Ci0JCQltaW5EZWx0YSA9IHBQZEdhaW5Cb3VuZGFyaWVzWzBdIC0gMjM7Ci0JCQlwUGRHYWluQm91bmRhcmllc1swXSA9IDIzOwotCQl9IGVsc2UKLQkJCW1pbkRlbHRhID0gMDsKKwkJbWluRGVsdGEgPSAwOwogCiAJCWlmIChpID09IDApIHsKIAkJCWlmIChBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpKQogCQkJCXNzID0gKGludDE2X3QpKDAgLSAobWluUHdyVDRbaV0gLyAyKSk7CiAJCQllbHNlCiAJCQkJc3MgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXNzID0gKGludDE2X3QpKChwUGRHYWluQm91bmRhcmllc1tpLTFdIC0KLQkJCQkgICAgICAgKG1pblB3clQ0W2ldIC8gMikpIC0KKwkJCQkJKG1pblB3clQ0W2ldIC8gMikpIC0KIAkJCQkgICAgICAgdFBkR2Fpbk92ZXJsYXAgKyAxICsgbWluRGVsdGEpOworCQl9CiAKIAkJdnBkU3RlcCA9IChpbnQxNl90KSh2cGRUYWJsZUlbaV1bMV0gLSB2cGRUYWJsZUlbaV1bMF0pOwogCQl2cGRTdGVwID0gKGludDE2X3QpKCh2cGRTdGVwIDwgMSkgPyAxIDogdnBkU3RlcCk7CisKIAkJd2hpbGUgKChzcyA8IDApICYmIChrIDwgKEFSOTI4N19OVU1fUERBRENfVkFMVUVTIC0gMSkpKQl7CiAJCQl0bXBWYWwgPSAoaW50MTZfdCkodnBkVGFibGVJW2ldWzBdICsgc3MgKiB2cGRTdGVwKTsKIAkJCXBQREFEQ1ZhbHVlc1trKytdID0gKHU4KSgodG1wVmFsIDwgMCkgPyAwIDogdG1wVmFsKTsKQEAgLTM0OCwxMiArMzUwLDEzIEBACiAJCXZwZFN0ZXAgPSAoaW50MTZfdCkodnBkVGFibGVJW2ldW3NpemVDdXJyVnBkVGFibGUgLSAxXSAtCiAJCQkJICAgIHZwZFRhYmxlSVtpXVtzaXplQ3VyclZwZFRhYmxlIC0gMl0pOwogCQl2cGRTdGVwID0gKGludDE2X3QpKCh2cGRTdGVwIDwgMSkgPyAxIDogdnBkU3RlcCk7CisKIAkJaWYgKHRndEluZGV4ID4gbWF4SW5kZXgpIHsKIAkJCXdoaWxlICgoc3MgPD0gdGd0SW5kZXgpICYmCiAJCQkJKGsgPCAoQVI5Mjg3X05VTV9QREFEQ19WQUxVRVMgLSAxKSkpIHsKIAkJCQl0bXBWYWwgPSAoaW50MTZfdCkgVE1QX1ZBTF9WUERfVEFCTEU7Ci0JCQkJcFBEQURDVmFsdWVzW2srK10gPSAodTgpKCh0bXBWYWwgPiAyNTUpID8KLQkJCQkJCQkgIDI1NSA6IHRtcFZhbCk7CisJCQkJcFBEQURDVmFsdWVzW2srK10gPQorCQkJCQkodTgpKCh0bXBWYWwgPiAyNTUpID8gMjU1IDogdG1wVmFsKTsKIAkJCQlzcysrOwogCQkJfQogCQl9CkBAIC0zNzUsMTAgKzM3OCw5IEBACiBzdGF0aWMgdm9pZCBhcjkyODdfZWVwcm9tX2dldF90eF9nYWluX2luZGV4KHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAogCQkJICAgIHN0cnVjdCBjYWxfZGF0YV9vcF9sb29wX2FyOTI4NyAqcFJhd0RhdGFzZXRPcExvb3AsCi0JCQkgICAgdTggKnBDYWxDaGFucywgIHUxNiBhdmFpbFBpZXJzLAotCQkJICAgIGludDhfdCAqcFB3cikKKwkJCSAgICB1OCAqcENhbENoYW5zLCAgdTE2IGF2YWlsUGllcnMsIGludDhfdCAqcFB3cikKIHsKLQl1MTYgIGlkeEwgPSAwLCBpZHhSID0gMCwgbnVtUGllcnM7CisJdTE2IGlkeEwgPSAwLCBpZHhSID0gMCwgbnVtUGllcnM7CiAJYm9vbCBtYXRjaDsKIAlzdHJ1Y3QgY2hhbl9jZW50ZXJzIGNlbnRlcnM7CiAKQEAgLTM5MCwxNSArMzkyLDE0IEBACiAJfQogCiAJbWF0Y2ggPSBhdGg5a19od19nZXRfbG93ZXJfdXBwZXJfaW5kZXgoCi0JCQkodTgpRlJFUTJGQklOKGNlbnRlcnMuc3ludGhfY2VudGVyLCBJU19DSEFOXzJHSFooY2hhbikpLAotCQkJcENhbENoYW5zLCBudW1QaWVycywKLQkJCSZpZHhMLCAmaWR4Uik7CisJCSh1OClGUkVRMkZCSU4oY2VudGVycy5zeW50aF9jZW50ZXIsIElTX0NIQU5fMkdIWihjaGFuKSksCisJCXBDYWxDaGFucywgbnVtUGllcnMsICZpZHhMLCAmaWR4Uik7CiAKIAlpZiAobWF0Y2gpIHsKIAkJKnBQd3IgPSAoaW50OF90KSBwUmF3RGF0YXNldE9wTG9vcFtpZHhMXS5wd3JQZGdbMF1bMF07CiAJfSBlbHNlIHsKIAkJKnBQd3IgPSAoKGludDhfdCkgcFJhd0RhdGFzZXRPcExvb3BbaWR4TF0ucHdyUGRnWzBdWzBdICsKLQkJCSAgICAoaW50OF90KSBwUmF3RGF0YXNldE9wTG9vcFtpZHhSXS5wd3JQZGdbMF1bMF0pLzI7CisJCQkgKGludDhfdCkgcFJhd0RhdGFzZXRPcExvb3BbaWR4Ul0ucHdyUGRnWzBdWzBdKS8yOwogCX0KIAogfQpAQCAtNDA5LDE2ICs0MTAsMjIgQEAKIAl1MzIgdG1wVmFsOwogCXUzMiBhOwogCisJLyogRW5hYmxlIE9MUEMgZm9yIGNoYWluIDAgKi8KKwogCXRtcFZhbCA9IFJFR19SRUFEKGFoLCAweGEyNzApOwogCXRtcFZhbCA9IHRtcFZhbCAmIDB4RkNGRkZGRkY7CiAJdG1wVmFsID0gdG1wVmFsIHwgKDB4MyA8PCAyNCk7CiAJUkVHX1dSSVRFKGFoLCAweGEyNzAsIHRtcFZhbCk7CiAKKwkvKiBFbmFibGUgT0xQQyBmb3IgY2hhaW4gMSAqLworCiAJdG1wVmFsID0gUkVHX1JFQUQoYWgsIDB4YjI3MCk7CiAJdG1wVmFsID0gdG1wVmFsICYgMHhGQ0ZGRkZGRjsKIAl0bXBWYWwgPSB0bXBWYWwgfCAoMHgzIDw8IDI0KTsKIAlSRUdfV1JJVEUoYWgsIDB4YjI3MCwgdG1wVmFsKTsKIAorCS8qIFdyaXRlIHRoZSBPTFBDIHJlZiBwb3dlciBmb3IgY2hhaW4gMCAqLworCiAJaWYgKGNoYWluID09IDApIHsKIAkJdG1wVmFsID0gUkVHX1JFQUQoYWgsIDB4YTM5OCk7CiAJCXRtcFZhbCA9IHRtcFZhbCAmIDB4ZmYwMGZmZmY7CkBAIC00MjcsNiArNDM0LDggQEAKIAkJUkVHX1dSSVRFKGFoLCAweGEzOTgsIHRtcFZhbCk7CiAJfQogCisJLyogV3JpdGUgdGhlIE9MUEMgcmVmIHBvd2VyIGZvciBjaGFpbiAxICovCisKIAlpZiAoY2hhaW4gPT0gMSkgewogCQl0bXBWYWwgPSBSRUdfUkVBRChhaCwgMHhiMzk4KTsKIAkJdG1wVmFsID0gdG1wVmFsICYgMHhmZjAwZmZmZjsKQEAgLTQzNiwyOCArNDQ1LDI4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg5a19od19zZXRfQVI5Mjg3X3Bvd2VyX2NhbF90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCwKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X3NldF9hcjkyODdfcG93ZXJfY2FsX3RhYmxlKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJCQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCiAJCQkJCQlpbnQxNl90ICpwVHhQb3dlckluZGV4T2Zmc2V0KQogewotCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBjYWxfZGF0YV9wZXJfZnJlcV9hcjkyODcgKnBSYXdEYXRhc2V0OwogCXN0cnVjdCBjYWxfZGF0YV9vcF9sb29wX2FyOTI4NyAqcFJhd0RhdGFzZXRPcGVuTG9vcDsKLQl1OCAgKnBDYWxCQ2hhbnMgPSBOVUxMOworCXU4ICpwQ2FsQkNoYW5zID0gTlVMTDsKIAl1MTYgcGRHYWluT3ZlcmxhcF90MjsKLQl1OCAgcGRhZGNWYWx1ZXNbQVI5Mjg3X05VTV9QREFEQ19WQUxVRVNdOworCXU4IHBkYWRjVmFsdWVzW0FSOTI4N19OVU1fUERBRENfVkFMVUVTXTsKIAl1MTYgZ2FpbkJvdW5kYXJpZXNbQVI5Mjg3X1BEX0dBSU5TX0lOX01BU0tdOwogCXUxNiBudW1QaWVycyA9IDAsIGksIGo7Ci0JaW50MTZfdCAgdE1pbkNhbFBvd2VyOwogCXUxNiBudW1YcGRHYWluLCB4cGRNYXNrOwogCXUxNiB4cGRHYWluVmFsdWVzW0FSOTI4N19OVU1fUERfR0FJTlNdID0gezAsIDAsIDAsIDB9OwotCXUzMiByZWczMiwgcmVnT2Zmc2V0LCByZWdDaGFpbk9mZnNldDsKLQlpbnQxNl90ICAgbW9kYWxJZHgsIGRpZmYgPSAwOworCXUzMiByZWczMiwgcmVnT2Zmc2V0LCByZWdDaGFpbk9mZnNldCwgcmVndmFsOworCWludDE2X3QgbW9kYWxJZHgsIGRpZmYgPSAwOwogCXN0cnVjdCBhcjkyODdfZWVwcm9tICpwRWVwRGF0YSA9ICZhaC0+ZWVwcm9tLm1hcDkyODc7CisKIAltb2RhbElkeCA9IElTX0NIQU5fMkdIWihjaGFuKSA/IDEgOiAwOwogCXhwZE1hc2sgPSBwRWVwRGF0YS0+bW9kYWxIZWFkZXIueHBkR2FpbjsKKwogCWlmICgocEVlcERhdGEtPmJhc2VFZXBIZWFkZXIudmVyc2lvbiAmIEFSOTI4N19FRVBfVkVSX01JTk9SX01BU0spID49Ci0JCQlBUjkyODdfRUVQX01JTk9SX1ZFUl8yKQorCSAgICBBUjkyODdfRUVQX01JTk9SX1ZFUl8yKQogCQlwZEdhaW5PdmVybGFwX3QyID0gcEVlcERhdGEtPm1vZGFsSGVhZGVyLnBkR2Fpbk92ZXJsYXA7CiAJZWxzZQogCQlwZEdhaW5PdmVybGFwX3QyID0gKHUxNikoTVMoUkVHX1JFQUQoYWgsIEFSX1BIWV9UUENSRzUpLApAQCAtNDY2LDE1ICs0NzUsMTYgQEAKIAlpZiAoSVNfQ0hBTl8yR0haKGNoYW4pKSB7CiAJCXBDYWxCQ2hhbnMgPSBwRWVwRGF0YS0+Y2FsRnJlcVBpZXIyRzsKIAkJbnVtUGllcnMgPSBBUjkyODdfTlVNXzJHX0NBTF9QSUVSUzsKLQkJaWYgKGF0aDlrX2h3X0FSOTI4N19nZXRfZWVwcm9tKGFoLCBFRVBfT0xfUFdSQ1RSTCkpIHsKKwkJaWYgKGF0aDlrX2h3X2FyOTI4N19nZXRfZWVwcm9tKGFoLCBFRVBfT0xfUFdSQ1RSTCkpIHsKIAkJCXBSYXdEYXRhc2V0T3Blbkxvb3AgPQotCQkJCShzdHJ1Y3QgY2FsX2RhdGFfb3BfbG9vcF9hcjkyODcgKikKLQkJCQlwRWVwRGF0YS0+Y2FsUGllckRhdGEyR1swXTsKKwkJCShzdHJ1Y3QgY2FsX2RhdGFfb3BfbG9vcF9hcjkyODcgKilwRWVwRGF0YS0+Y2FsUGllckRhdGEyR1swXTsKIAkJCWFoLT5pbml0UERBREMgPSBwUmF3RGF0YXNldE9wZW5Mb29wLT52cGRQZGdbMF1bMF07CiAJCX0KIAl9CiAKIAludW1YcGRHYWluID0gMDsKKworCS8qIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgeHBkZ2FpbnMgZnJvbSB0aGUgeHBkR2FpbiBNYXNrICovCiAJZm9yIChpID0gMTsgaSA8PSBBUjkyODdfUERfR0FJTlNfSU5fTUFTSzsgaSsrKSB7CiAJCWlmICgoeHBkTWFzayA+PiAoQVI5Mjg3X1BEX0dBSU5TX0lOX01BU0sgLSBpKSkgJiAxKSB7CiAJCQlpZiAobnVtWHBkR2FpbiA+PSBBUjkyODdfTlVNX1BEX0dBSU5TKQpAQCAtNDk2LDk5ICs1MDYsNzkgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBBUjkyODdfTUFYX0NIQUlOUzsgaSsrKQl7CiAJCXJlZ0NoYWluT2Zmc2V0ID0gaSAqIDB4MTAwMDsKKwogCQlpZiAocEVlcERhdGEtPmJhc2VFZXBIZWFkZXIudHhNYXNrICYgKDEgPDwgaSkpIHsKLQkJCXBSYXdEYXRhc2V0T3Blbkxvb3AgPSAoc3RydWN0IGNhbF9kYXRhX29wX2xvb3BfYXI5Mjg3ICopCi0JCQkJCSAgICAgICBwRWVwRGF0YS0+Y2FsUGllckRhdGEyR1tpXTsKLQkJCWlmIChhdGg5a19od19BUjkyODdfZ2V0X2VlcHJvbShhaCwgRUVQX09MX1BXUkNUUkwpKSB7CisJCQlwUmF3RGF0YXNldE9wZW5Mb29wID0KKwkJCShzdHJ1Y3QgY2FsX2RhdGFfb3BfbG9vcF9hcjkyODcgKilwRWVwRGF0YS0+Y2FsUGllckRhdGEyR1tpXTsKKworCQkJaWYgKGF0aDlrX2h3X2FyOTI4N19nZXRfZWVwcm9tKGFoLCBFRVBfT0xfUFdSQ1RSTCkpIHsKIAkJCQlpbnQ4X3QgdHhQb3dlcjsKIAkJCQlhcjkyODdfZWVwcm9tX2dldF90eF9nYWluX2luZGV4KGFoLCBjaGFuLAotCQkJCQkJCSAgcFJhd0RhdGFzZXRPcGVuTG9vcCwKLQkJCQkJCQkgIHBDYWxCQ2hhbnMsIG51bVBpZXJzLAotCQkJCQkJCSAgJnR4UG93ZXIpOworCQkJCQkJCXBSYXdEYXRhc2V0T3Blbkxvb3AsCisJCQkJCQkJcENhbEJDaGFucywgbnVtUGllcnMsCisJCQkJCQkJJnR4UG93ZXIpOwogCQkJCWFyOTI4N19lZXByb21fb2xwY19zZXRfcGRhZGNzKGFoLCB0eFBvd2VyLCBpKTsKIAkJCX0gZWxzZSB7CiAJCQkJcFJhd0RhdGFzZXQgPQogCQkJCQkoc3RydWN0IGNhbF9kYXRhX3Blcl9mcmVxX2FyOTI4NyAqKQogCQkJCQlwRWVwRGF0YS0+Y2FsUGllckRhdGEyR1tpXTsKLQkJCQlhdGg5a19od19nZXRfQVI5Mjg3X2dhaW5fYm91bmRhcmllc19wZGFkY3MoCi0JCQkJCQkgIGFoLCBjaGFuLCBwUmF3RGF0YXNldCwKLQkJCQkJCSAgcENhbEJDaGFucywgbnVtUGllcnMsCi0JCQkJCQkgIHBkR2Fpbk92ZXJsYXBfdDIsCi0JCQkJCQkgICZ0TWluQ2FsUG93ZXIsIGdhaW5Cb3VuZGFyaWVzLAotCQkJCQkJICBwZGFkY1ZhbHVlcywgbnVtWHBkR2Fpbik7CisKKwkJCQlhdGg5a19od19nZXRfYXI5Mjg3X2dhaW5fYm91bmRhcmllc19wZGFkY3MoYWgsIGNoYW4sCisJCQkJCQkJICAgcFJhd0RhdGFzZXQsCisJCQkJCQkJICAgcENhbEJDaGFucywgbnVtUGllcnMsCisJCQkJCQkJICAgcGRHYWluT3ZlcmxhcF90MiwKKwkJCQkJCQkgICBnYWluQm91bmRhcmllcywKKwkJCQkJCQkgICBwZGFkY1ZhbHVlcywKKwkJCQkJCQkgICBudW1YcGRHYWluKTsKIAkJCX0KIAogCQkJaWYgKGkgPT0gMCkgewotCQkJCWlmICghYXRoOWtfaHdfQVI5Mjg3X2dldF9lZXByb20oCi0JCQkJCSAgICBhaCwgRUVQX09MX1BXUkNUUkwpKSB7Ci0JCQkJCVJFR19XUklURShhaCwgQVJfUEhZX1RQQ1JHNSArCi0JCQkJCSAgcmVnQ2hhaW5PZmZzZXQsCi0JCQkJCSAgU00ocGRHYWluT3ZlcmxhcF90MiwKLQkJCQkJICAgICBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fT1ZFUkxBUCkgfAotCQkJCQkgIFNNKGdhaW5Cb3VuZGFyaWVzWzBdLAotCQkJCQkgICAgIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8xKQotCQkJCQkgIHwgU00oZ2FpbkJvdW5kYXJpZXNbMV0sCi0JCQkJCSAgICAgICBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMikKLQkJCQkJICB8IFNNKGdhaW5Cb3VuZGFyaWVzWzJdLAotCQkJCQkgICAgICAgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzMpCi0JCQkJCSAgfCBTTShnYWluQm91bmRhcmllc1szXSwKLQkJCQkJICAgICAgIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV80KSk7CisJCQkJaWYgKCFhdGg5a19od19hcjkyODdfZ2V0X2VlcHJvbShhaCwKKwkJCQkJCQlFRVBfT0xfUFdSQ1RSTCkpIHsKKworCQkJCQlyZWd2YWwgPSBTTShwZEdhaW5PdmVybGFwX3QyLAorCQkJCQkJICAgIEFSX1BIWV9UUENSRzVfUERfR0FJTl9PVkVSTEFQKQorCQkJCQkJfCBTTShnYWluQm91bmRhcmllc1swXSwKKwkJCQkJCSAgICAgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzEpCisJCQkJCQl8IFNNKGdhaW5Cb3VuZGFyaWVzWzFdLAorCQkJCQkJICAgICBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMikKKwkJCQkJCXwgU00oZ2FpbkJvdW5kYXJpZXNbMl0sCisJCQkJCQkgICAgIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8zKQorCQkJCQkJfCBTTShnYWluQm91bmRhcmllc1szXSwKKwkJCQkJCSAgICAgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzQpOworCisJCQkJCVJFR19XUklURShhaCwKKwkJCQkJCSAgQVJfUEhZX1RQQ1JHNSArIHJlZ0NoYWluT2Zmc2V0LAorCQkJCQkJICByZWd2YWwpOwogCQkJCX0KIAkJCX0KIAogCQkJaWYgKChpbnQzMl90KUFSOTI4N19QV1JfVEFCTEVfT0ZGU0VUX0RCICE9Ci0JCQkJICAgICBwRWVwRGF0YS0+YmFzZUVlcEhlYWRlci5wd3JUYWJsZU9mZnNldCkgewotCQkJCWRpZmYgPSAodTE2KQotCQkJCSAgICAgICAocEVlcERhdGEtPmJhc2VFZXBIZWFkZXIucHdyVGFibGVPZmZzZXQKLQkJCQkJLSAoaW50MzJfdClBUjkyODdfUFdSX1RBQkxFX09GRlNFVF9EQik7CisJCQkgICAgcEVlcERhdGEtPmJhc2VFZXBIZWFkZXIucHdyVGFibGVPZmZzZXQpIHsKKwkJCQlkaWZmID0gKHUxNikocEVlcERhdGEtPmJhc2VFZXBIZWFkZXIucHdyVGFibGVPZmZzZXQgLQorCQkJCQkgICAgIChpbnQzMl90KUFSOTI4N19QV1JfVEFCTEVfT0ZGU0VUX0RCKTsKIAkJCQlkaWZmICo9IDI7CiAKLQkJCQlmb3IgKGogPSAwOwotCQkJCSAgICAgaiA8ICgodTE2KUFSOTI4N19OVU1fUERBRENfVkFMVUVTLWRpZmYpOwotCQkJCSAgICAgaisrKQorCQkJCWZvciAoaiA9IDA7IGogPCAoKHUxNilBUjkyODdfTlVNX1BEQURDX1ZBTFVFUy1kaWZmKTsgaisrKQogCQkJCQlwZGFkY1ZhbHVlc1tqXSA9IHBkYWRjVmFsdWVzW2orZGlmZl07CiAKIAkJCQlmb3IgKGogPSAodTE2KShBUjkyODdfTlVNX1BEQURDX1ZBTFVFUy1kaWZmKTsKIAkJCQkgICAgIGogPCBBUjkyODdfTlVNX1BEQURDX1ZBTFVFUzsgaisrKQogCQkJCQlwZGFkY1ZhbHVlc1tqXSA9Ci0JCQkJCSAgcGRhZGNWYWx1ZXNbCi0JCQkJCSAgQVI5Mjg3X05VTV9QREFEQ19WQUxVRVMtZGlmZl07CisJCQkJCSAgcGRhZGNWYWx1ZXNbQVI5Mjg3X05VTV9QREFEQ19WQUxVRVMtZGlmZl07CiAJCQl9CiAKLQkJCWlmICghYXRoOWtfaHdfQVI5Mjg3X2dldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkgewotCQkJCXJlZ09mZnNldCA9IEFSX1BIWV9CQVNFICsgKDY3MiA8PCAyKSArCi0JCQkJCQkJICAgcmVnQ2hhaW5PZmZzZXQ7CisJCQlpZiAoIWF0aDlrX2h3X2FyOTI4N19nZXRfZWVwcm9tKGFoLCBFRVBfT0xfUFdSQ1RSTCkpIHsKKwkJCQlyZWdPZmZzZXQgPSBBUl9QSFlfQkFTRSArCisJCQkJCSg2NzIgPDwgMikgKyByZWdDaGFpbk9mZnNldDsKKwogCQkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0JCQkJCXJlZzMyID0gKChwZGFkY1ZhbHVlc1s0KmogKyAwXQotCQkJCQkJICAmIDB4RkYpIDw8IDApICB8Ci0JCQkJCQkoKHBkYWRjVmFsdWVzWzQqaiArIDFdCi0JCQkJCQkgICYgMHhGRikgPDwgOCkgIHwKLQkJCQkJCSgocGRhZGNWYWx1ZXNbNCpqICsgMl0KLQkJCQkJCSAgJiAweEZGKSA8PCAxNikgfAotCQkJCQkJKChwZGFkY1ZhbHVlc1s0KmogKyAzXQotCQkJCQkJICAmIDB4RkYpIDw8IDI0KSA7CisJCQkJCXJlZzMyID0gKChwZGFkY1ZhbHVlc1s0KmogKyAwXSAmIDB4RkYpIDw8IDApCisJCQkJCQl8ICgocGRhZGNWYWx1ZXNbNCpqICsgMV0gJiAweEZGKSA8PCA4KQorCQkJCQkJfCAoKHBkYWRjVmFsdWVzWzQqaiArIDJdICYgMHhGRikgPDwgMTYpCisJCQkJCQl8ICgocGRhZGNWYWx1ZXNbNCpqICsgM10gJiAweEZGKSA8PCAyNCk7CisKIAkJCQkJUkVHX1dSSVRFKGFoLCByZWdPZmZzZXQsIHJlZzMyKTsKLQotCQkJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCQkJCSAgIlBEQURDICglZCwlNHgpOiAlNC40eCAiCi0JCQkJCQkgICIlOC44eFxuIiwKLQkJCQkJCSAgaSwgcmVnQ2hhaW5PZmZzZXQsIHJlZ09mZnNldCwKLQkJCQkJCSAgcmVnMzIpOwotCi0JCQkJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRUVQUk9NLAotCQkJCQkJICAiUERBREM6IENoYWluICVkIHwgIgotCQkJCQkJICAiUERBREMgJTNkIFZhbHVlICUzZCB8ICIKLQkJCQkJCSAgIlBEQURDICUzZCBWYWx1ZSAlM2QgfCAiCi0JCQkJCQkgICJQREFEQyAlM2QgVmFsdWUgJTNkIHwgIgotCQkJCQkJICAiUERBREMgJTNkIFZhbHVlICUzZCB8XG4iLAotCQkJCQkJICBpLCA0ICogaiwgcGRhZGNWYWx1ZXNbNCAqIGpdLAotCQkJCQkJICA0ICogaiArIDEsCi0JCQkJCQkgIHBkYWRjVmFsdWVzWzQgKiBqICsgMV0sCi0JCQkJCQkgIDQgKiBqICsgMiwKLQkJCQkJCSAgcGRhZGNWYWx1ZXNbNCAqIGogKyAyXSwKLQkJCQkJCSAgNCAqIGogKyAzLAotCQkJCQkJICBwZGFkY1ZhbHVlc1s0ICogaiArIDNdKTsKLQogCQkJCQlyZWdPZmZzZXQgKz0gNDsKIAkJCQl9CiAJCQl9CkBAIC01OTgsMzAgKzU4OCw0NSBAQAogCSpwVHhQb3dlckluZGV4T2Zmc2V0ID0gMDsKIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfaHdfc2V0X0FSOTI4N19wb3dlcl9wZXJfcmF0ZV90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCwKLQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sIGludDE2X3QgKnJhdGVzQXJyYXksIHUxNiBjZmdDdGwsCi0JCXUxNiBBbnRlbm5hUmVkdWN0aW9uLCB1MTYgdHdpY2VNYXhSZWd1bGF0b3J5UG93ZXIsCi0JCXUxNiBwb3dlckxpbWl0KQorc3RhdGljIHZvaWQgYXRoOWtfaHdfc2V0X2FyOTI4N19wb3dlcl9wZXJfcmF0ZV90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCSAgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCisJCQkJCQkgICAgIGludDE2X3QgKnJhdGVzQXJyYXksCisJCQkJCQkgICAgIHUxNiBjZmdDdGwsCisJCQkJCQkgICAgIHUxNiBBbnRlbm5hUmVkdWN0aW9uLAorCQkJCQkJICAgICB1MTYgdHdpY2VNYXhSZWd1bGF0b3J5UG93ZXIsCisJCQkJCQkgICAgIHUxNiBwb3dlckxpbWl0KQogeworI2RlZmluZSBDTVBfQ1RMIFwKKwkoKChjZmdDdGwgJiB+Q1RMX01PREVfTSkgfCAocEN0bE1vZGVbY3RsTW9kZV0gJiBDVExfTU9ERV9NKSkgPT0gXAorCSBwRWVwRGF0YS0+Y3RsSW5kZXhbaV0pCisKKyNkZWZpbmUgQ01QX05PX0NUTCBcCisJKCgoY2ZnQ3RsICYgfkNUTF9NT0RFX00pIHwgKHBDdGxNb2RlW2N0bE1vZGVdICYgQ1RMX01PREVfTSkpID09IFwKKwkgKChwRWVwRGF0YS0+Y3RsSW5kZXhbaV0gJiBDVExfTU9ERV9NKSB8IFNEX05PX0NUTCkpCisKICNkZWZpbmUgUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU4gICAgIDYKICNkZWZpbmUgUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTiAgIDEwCisKIAlzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZ3VsYXRvcnkgPSBhdGg5a19od19yZWd1bGF0b3J5KGFoKTsKIAl1MTYgdHdpY2VNYXhFZGdlUG93ZXIgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CiAJc3RhdGljIGNvbnN0IHUxNiB0cFNjYWxlUmVkdWN0aW9uVGFibGVbNV0gPQogCQl7IDAsIDMsIDYsIDksIEFSNTQxNl9NQVhfUkFURV9QT1dFUiB9OwogCWludCBpOwotCWludDE2X3QgIHR3aWNlTGFyZ2VzdEFudGVubmE7CisJaW50MTZfdCB0d2ljZUxhcmdlc3RBbnRlbm5hOwogCXN0cnVjdCBjYWxfY3RsX2RhdGFfYXI5Mjg3ICpyZXA7CiAJc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfbGVnIHRhcmdldFBvd2VyT2ZkbSA9IHswLCB7MCwgMCwgMCwgMH0gfSwKIAkJCQkgICAgdGFyZ2V0UG93ZXJDY2sgPSB7MCwgezAsIDAsIDAsIDB9IH07CiAJc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfbGVnIHRhcmdldFBvd2VyT2ZkbUV4dCA9IHswLCB7MCwgMCwgMCwgMH0gfSwKIAkJCQkgICAgdGFyZ2V0UG93ZXJDY2tFeHQgPSB7MCwgezAsIDAsIDAsIDB9IH07Ci0Jc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfaHQgIHRhcmdldFBvd2VySHQyMCwKKwlzdHJ1Y3QgY2FsX3RhcmdldF9wb3dlcl9odCB0YXJnZXRQb3dlckh0MjAsCiAJCQkJICAgIHRhcmdldFBvd2VySHQ0MCA9IHswLCB7MCwgMCwgMCwgMH0gfTsKIAl1MTYgc2NhbGVkUG93ZXIgPSAwLCBtaW5DdGxQb3dlciwgbWF4UmVnQWxsb3dlZFBvd2VyOwotCXUxNiBjdGxNb2Rlc0ZvcjExZ1tdID0KLQkJe0NUTF8xMUIsIENUTF8xMUcsIENUTF8yR0hUMjAsCi0JCSBDVExfMTFCX0VYVCwgQ1RMXzExR19FWFQsIENUTF8yR0hUNDB9OworCXUxNiBjdGxNb2Rlc0ZvcjExZ1tdID0ge0NUTF8xMUIsCisJCQkJQ1RMXzExRywKKwkJCQlDVExfMkdIVDIwLAorCQkJCUNUTF8xMUJfRVhULAorCQkJCUNUTF8xMUdfRVhULAorCQkJCUNUTF8yR0hUNDB9OwogCXUxNiBudW1DdGxNb2RlcyA9IDAsICpwQ3RsTW9kZSA9IE5VTEwsIGN0bE1vZGUsIGZyZXE7CiAJc3RydWN0IGNoYW5fY2VudGVycyBjZW50ZXJzOwogCWludCB0eF9jaGFpbm1hc2s7CkBAIC02MzEsMTkgKzYzNiwyOCBAQAogCiAJYXRoOWtfaHdfZ2V0X2NoYW5uZWxfY2VudGVycyhhaCwgY2hhbiwgJmNlbnRlcnMpOwogCisJLyogQ29tcHV0ZSBUeFBvd2VyIHJlZHVjdGlvbiBkdWUgdG8gQW50ZW5uYSBHYWluICovCiAJdHdpY2VMYXJnZXN0QW50ZW5uYSA9IG1heChwRWVwRGF0YS0+bW9kYWxIZWFkZXIuYW50ZW5uYUdhaW5DaFswXSwKIAkJCQkgIHBFZXBEYXRhLT5tb2RhbEhlYWRlci5hbnRlbm5hR2FpbkNoWzFdKTsKKwl0d2ljZUxhcmdlc3RBbnRlbm5hID0gKGludDE2X3QpbWluKChBbnRlbm5hUmVkdWN0aW9uKSAtCisJCQkJCSAgIHR3aWNlTGFyZ2VzdEFudGVubmEsIDApOwogCi0JdHdpY2VMYXJnZXN0QW50ZW5uYSA9ICAoaW50MTZfdCltaW4oKEFudGVubmFSZWR1Y3Rpb24pIC0KLQkJCQkJICAgIHR3aWNlTGFyZ2VzdEFudGVubmEsIDApOwotCisJLyoKKwkgKiBzY2FsZWRQb3dlciBpcyB0aGUgbWluaW11bSBvZiB0aGUgdXNlciBpbnB1dCBwb3dlciBsZXZlbAorCSAqIGFuZCB0aGUgcmVndWxhdG9yeSBhbGxvd2VkIHBvd2VyIGxldmVsLgorCSAqLwogCW1heFJlZ0FsbG93ZWRQb3dlciA9IHR3aWNlTWF4UmVndWxhdG9yeVBvd2VyICsgdHdpY2VMYXJnZXN0QW50ZW5uYTsKKwogCWlmIChyZWd1bGF0b3J5LT50cF9zY2FsZSAhPSBBVEg5S19UUF9TQ0FMRV9NQVgpCiAJCW1heFJlZ0FsbG93ZWRQb3dlciAtPQogCQkJKHRwU2NhbGVSZWR1Y3Rpb25UYWJsZVsocmVndWxhdG9yeS0+dHBfc2NhbGUpXSAqIDIpOwogCiAJc2NhbGVkUG93ZXIgPSBtaW4ocG93ZXJMaW1pdCwgbWF4UmVnQWxsb3dlZFBvd2VyKTsKIAorCS8qCisJICogUmVkdWNlIHNjYWxlZCBQb3dlciBieSBudW1iZXIgb2YgY2hhaW5zIGFjdGl2ZQorCSAqIHRvIGdldCB0aGUgcGVyIGNoYWluIHR4IHBvd2VyIGxldmVsLgorCSAqLwogCXN3aXRjaCAoYXI1NDE2X2dldF9udHhjaGFpbnModHhfY2hhaW5tYXNrKSkgewogCWNhc2UgMToKIAkJYnJlYWs7CkBAIC02NTYsOSArNjcwLDE0IEBACiAJfQogCXNjYWxlZFBvd2VyID0gbWF4KCh1MTYpMCwgc2NhbGVkUG93ZXIpOwogCisJLyoKKwkgKiBHZXQgVFggcG93ZXIgZnJvbSBFRVBST00uCisJICovCiAJaWYgKElTX0NIQU5fMkdIWihjaGFuKSkJeworCQkvKiBDVExfMTFCLCBDVExfMTFHLCBDVExfMkdIVDIwICovCiAJCW51bUN0bE1vZGVzID0KIAkJCUFSUkFZX1NJWkUoY3RsTW9kZXNGb3IxMWcpIC0gU1VCX05VTV9DVExfTU9ERVNfQVRfMkdfNDA7CisKIAkJcEN0bE1vZGUgPSBjdGxNb2Rlc0ZvcjExZzsKIAogCQlhdGg5a19od19nZXRfbGVnYWN5X3RhcmdldF9wb3dlcnMoYWgsIGNoYW4sCkBAIC02NzUsNiArNjk0LDcgQEAKIAkJCQkJICAgJnRhcmdldFBvd2VySHQyMCwgOCwgZmFsc2UpOwogCiAJCWlmIChJU19DSEFOX0hUNDAoY2hhbikpCXsKKwkJCS8qIEFsbCAyRyBDVExzICovCiAJCQludW1DdGxNb2RlcyA9IEFSUkFZX1NJWkUoY3RsTW9kZXNGb3IxMWcpOwogCQkJYXRoOWtfaHdfZ2V0X3RhcmdldF9wb3dlcnMoYWgsIGNoYW4sCiAJCQkJCQkgICBwRWVwRGF0YS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDAsCkBAIC02OTIsOCArNzEyLDkgQEAKIAl9CiAKIAlmb3IgKGN0bE1vZGUgPSAwOyBjdGxNb2RlIDwgbnVtQ3RsTW9kZXM7IGN0bE1vZGUrKykgewotCQlib29sIGlzSHQ0MEN0bE1vZGUgPSAocEN0bE1vZGVbY3RsTW9kZV0gPT0gQ1RMXzVHSFQ0MCkgfHwKLQkJCQkgICAgIChwQ3RsTW9kZVtjdGxNb2RlXSA9PSBDVExfMkdIVDQwKTsKKwkJYm9vbCBpc0h0NDBDdGxNb2RlID0KKwkJCShwQ3RsTW9kZVtjdGxNb2RlXSA9PSBDVExfMkdIVDQwKSA/IHRydWUgOiBmYWxzZTsKKwogCQlpZiAoaXNIdDQwQ3RsTW9kZSkKIAkJCWZyZXEgPSBjZW50ZXJzLnN5bnRoX2NlbnRlcjsKIAkJZWxzZSBpZiAocEN0bE1vZGVbY3RsTW9kZV0gJiBFWFRfQURESVRJVkUpCkBAIC03MDEsMzEgKzcyMiwyOCBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCi0JCWlmIChhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV92ZXIoYWgpID09IDE0ICYmCi0JCSAgICBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV9yZXYoYWgpIDw9IDIpCi0JCQl0d2ljZU1heEVkZ2VQb3dlciA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKLQorCQkvKiBXYWxrIHRocm91Z2ggdGhlIENUTCBpbmRpY2VzIHN0b3JlZCBpbiBFRVBST00gKi8KIAkJZm9yIChpID0gMDsgKGkgPCBBUjkyODdfTlVNX0NUTFMpICYmIHBFZXBEYXRhLT5jdGxJbmRleFtpXTsgaSsrKSB7Ci0JCQlpZiAoKCgoY2ZnQ3RsICYgfkNUTF9NT0RFX00pIHwKLQkJCSAgICAgIChwQ3RsTW9kZVtjdGxNb2RlXSAmIENUTF9NT0RFX00pKSA9PQotCQkJICAgICBwRWVwRGF0YS0+Y3RsSW5kZXhbaV0pIHx8Ci0JCQkgICAgKCgoY2ZnQ3RsICYgfkNUTF9NT0RFX00pIHwKLQkJCSAgICAgIChwQ3RsTW9kZVtjdGxNb2RlXSAmIENUTF9NT0RFX00pKSA9PQotCQkJICAgICAoKHBFZXBEYXRhLT5jdGxJbmRleFtpXSAmCi0JCQkgICAgICAgQ1RMX01PREVfTSkgfCBTRF9OT19DVEwpKSkgeworCQkJc3RydWN0IGNhbF9jdGxfZWRnZXMgKnBSZEVkZ2VzUG93ZXI7CiAKKwkJCS8qCisJCQkgKiBDb21wYXJlIHRlc3QgZ3JvdXAgZnJvbSByZWd1bGF0b3J5IGNoYW5uZWwgbGlzdAorCQkJICogd2l0aCB0ZXN0IG1vZGUgZnJvbSBwQ3RsTW9kZSBsaXN0CisJCQkgKi8KKwkJCWlmIChDTVBfQ1RMIHx8IENNUF9OT19DVEwpIHsKIAkJCQlyZXAgPSAmKHBFZXBEYXRhLT5jdGxEYXRhW2ldKTsKLQkJCQl0d2ljZU1pbkVkZ2VQb3dlciA9IGF0aDlrX2h3X2dldF9tYXhfZWRnZV9wb3dlcigKLQkJCQkgICAgZnJlcSwKLQkJCQkgICAgcmVwLT5jdGxFZGdlc1thcjU0MTZfZ2V0X250eGNoYWlucygKLQkJCQkgICAgdHhfY2hhaW5tYXNrKSAtIDFdLAotCQkJCSAgICBJU19DSEFOXzJHSFooY2hhbiksIEFSNTQxNl9OVU1fQkFORF9FREdFUyk7CisJCQkJcFJkRWRnZXNQb3dlciA9CisJCQkJcmVwLT5jdGxFZGdlc1thcjU0MTZfZ2V0X250eGNoYWlucyh0eF9jaGFpbm1hc2spIC0gMV07CiAKLQkJCQlpZiAoKGNmZ0N0bCAmIH5DVExfTU9ERV9NKSA9PSBTRF9OT19DVEwpCi0JCQkJCXR3aWNlTWF4RWRnZVBvd2VyID0gbWluKAotCQkJCQkJCSAgICB0d2ljZU1heEVkZ2VQb3dlciwKLQkJCQkJCQkgICAgdHdpY2VNaW5FZGdlUG93ZXIpOwotCQkJCWVsc2UgeworCQkJCXR3aWNlTWluRWRnZVBvd2VyID0gYXRoOWtfaHdfZ2V0X21heF9lZGdlX3Bvd2VyKGZyZXEsCisJCQkJCQkJCXBSZEVkZ2VzUG93ZXIsCisJCQkJCQkJCUlTX0NIQU5fMkdIWihjaGFuKSwKKwkJCQkJCQkJQVI1NDE2X05VTV9CQU5EX0VER0VTKTsKKworCQkJCWlmICgoY2ZnQ3RsICYgfkNUTF9NT0RFX00pID09IFNEX05PX0NUTCkgeworCQkJCQl0d2ljZU1heEVkZ2VQb3dlciA9IG1pbih0d2ljZU1heEVkZ2VQb3dlciwKKwkJCQkJCQkJdHdpY2VNaW5FZGdlUG93ZXIpOworCQkJCX0gZWxzZSB7CiAJCQkJCXR3aWNlTWF4RWRnZVBvd2VyID0gdHdpY2VNaW5FZGdlUG93ZXI7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTczNCw1NSArNzUyLDQ4IEBACiAKIAkJbWluQ3RsUG93ZXIgPSAodTgpbWluKHR3aWNlTWF4RWRnZVBvd2VyLCBzY2FsZWRQb3dlcik7CiAKKwkJLyogQXBwbHkgY3RsIG1vZGUgdG8gY29ycmVjdCB0YXJnZXQgcG93ZXIgc2V0ICovCiAJCXN3aXRjaCAocEN0bE1vZGVbY3RsTW9kZV0pIHsKIAkJY2FzZSBDVExfMTFCOgotCQkJZm9yIChpID0gMDsKLQkJCSAgICAgaSA8IEFSUkFZX1NJWkUodGFyZ2V0UG93ZXJDY2sudFBvdzJ4KTsKLQkJCSAgICAgaSsrKSB7Ci0JCQkJdGFyZ2V0UG93ZXJDY2sudFBvdzJ4W2ldID0gKHU4KW1pbigKLQkJCQkJKHUxNil0YXJnZXRQb3dlckNjay50UG93MnhbaV0sCi0JCQkJCW1pbkN0bFBvd2VyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhcmdldFBvd2VyQ2NrLnRQb3cyeCk7IGkrKykgeworCQkJCXRhcmdldFBvd2VyQ2NrLnRQb3cyeFtpXSA9CisJCQkJCSh1OCltaW4oKHUxNil0YXJnZXRQb3dlckNjay50UG93MnhbaV0sCisJCQkJCQltaW5DdGxQb3dlcik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBDVExfMTFBOgogCQljYXNlIENUTF8xMUc6Ci0JCQlmb3IgKGkgPSAwOwotCQkJICAgICBpIDwgQVJSQVlfU0laRSh0YXJnZXRQb3dlck9mZG0udFBvdzJ4KTsKLQkJCSAgICAgaSsrKSB7Ci0JCQkJdGFyZ2V0UG93ZXJPZmRtLnRQb3cyeFtpXSA9ICh1OCltaW4oCi0JCQkJCSh1MTYpdGFyZ2V0UG93ZXJPZmRtLnRQb3cyeFtpXSwKLQkJCQkJbWluQ3RsUG93ZXIpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFyZ2V0UG93ZXJPZmRtLnRQb3cyeCk7IGkrKykgeworCQkJCXRhcmdldFBvd2VyT2ZkbS50UG93MnhbaV0gPQorCQkJCQkodTgpbWluKCh1MTYpdGFyZ2V0UG93ZXJPZmRtLnRQb3cyeFtpXSwKKwkJCQkJCW1pbkN0bFBvd2VyKTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIENUTF81R0hUMjA6CiAJCWNhc2UgQ1RMXzJHSFQyMDoKLQkJCWZvciAoaSA9IDA7Ci0JCQkgICAgIGkgPCBBUlJBWV9TSVpFKHRhcmdldFBvd2VySHQyMC50UG93MngpOwotCQkJICAgICBpKyspIHsKLQkJCQl0YXJnZXRQb3dlckh0MjAudFBvdzJ4W2ldID0gKHU4KW1pbigKLQkJCQkJKHUxNil0YXJnZXRQb3dlckh0MjAudFBvdzJ4W2ldLAotCQkJCQltaW5DdGxQb3dlcik7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXRQb3dlckh0MjAudFBvdzJ4KTsgaSsrKSB7CisJCQkJdGFyZ2V0UG93ZXJIdDIwLnRQb3cyeFtpXSA9CisJCQkJCSh1OCltaW4oKHUxNil0YXJnZXRQb3dlckh0MjAudFBvdzJ4W2ldLAorCQkJCQkJbWluQ3RsUG93ZXIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQ1RMXzExQl9FWFQ6Ci0JCQl0YXJnZXRQb3dlckNja0V4dC50UG93MnhbMF0gPSAodTgpbWluKAotCQkJCSAgICAodTE2KXRhcmdldFBvd2VyQ2NrRXh0LnRQb3cyeFswXSwKLQkJCQkgICAgbWluQ3RsUG93ZXIpOworCQkJdGFyZ2V0UG93ZXJDY2tFeHQudFBvdzJ4WzBdID0KKwkJCQkodTgpbWluKCh1MTYpdGFyZ2V0UG93ZXJDY2tFeHQudFBvdzJ4WzBdLAorCQkJCQltaW5DdGxQb3dlcik7CiAJCQlicmVhazsKIAkJY2FzZSBDVExfMTFBX0VYVDoKIAkJY2FzZSBDVExfMTFHX0VYVDoKLQkJCXRhcmdldFBvd2VyT2ZkbUV4dC50UG93MnhbMF0gPSAodTgpbWluKAotCQkJCSAgICAodTE2KXRhcmdldFBvd2VyT2ZkbUV4dC50UG93MnhbMF0sCi0JCQkJICAgIG1pbkN0bFBvd2VyKTsKKwkJCXRhcmdldFBvd2VyT2ZkbUV4dC50UG93MnhbMF0gPQorCQkJCSh1OCltaW4oKHUxNil0YXJnZXRQb3dlck9mZG1FeHQudFBvdzJ4WzBdLAorCQkJCQltaW5DdGxQb3dlcik7CiAJCQlicmVhazsKIAkJY2FzZSBDVExfNUdIVDQwOgogCQljYXNlIENUTF8yR0hUNDA6Ci0JCQlmb3IgKGkgPSAwOwotCQkJICAgICBpIDwgQVJSQVlfU0laRSh0YXJnZXRQb3dlckh0NDAudFBvdzJ4KTsKLQkJCSAgICAgaSsrKSB7Ci0JCQkJdGFyZ2V0UG93ZXJIdDQwLnRQb3cyeFtpXSA9ICh1OCltaW4oCi0JCQkJCSh1MTYpdGFyZ2V0UG93ZXJIdDQwLnRQb3cyeFtpXSwKLQkJCQkJbWluQ3RsUG93ZXIpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFyZ2V0UG93ZXJIdDQwLnRQb3cyeCk7IGkrKykgeworCQkJCXRhcmdldFBvd2VySHQ0MC50UG93MnhbaV0gPQorCQkJCQkodTgpbWluKCh1MTYpdGFyZ2V0UG93ZXJIdDQwLnRQb3cyeFtpXSwKKwkJCQkJCW1pbkN0bFBvd2VyKTsKIAkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNzkwLDEyICs4MDEsMTMgQEAKIAkJfQogCX0KIAorCS8qIE5vdyBzZXQgdGhlIHJhdGVzIGFycmF5ICovCisKIAlyYXRlc0FycmF5W3JhdGU2bWJdID0KIAlyYXRlc0FycmF5W3JhdGU5bWJdID0KIAlyYXRlc0FycmF5W3JhdGUxMm1iXSA9CiAJcmF0ZXNBcnJheVtyYXRlMThtYl0gPQotCXJhdGVzQXJyYXlbcmF0ZTI0bWJdID0KLQl0YXJnZXRQb3dlck9mZG0udFBvdzJ4WzBdOworCXJhdGVzQXJyYXlbcmF0ZTI0bWJdID0gdGFyZ2V0UG93ZXJPZmRtLnRQb3cyeFswXTsKIAogCXJhdGVzQXJyYXlbcmF0ZTM2bWJdID0gdGFyZ2V0UG93ZXJPZmRtLnRQb3cyeFsxXTsKIAlyYXRlc0FycmF5W3JhdGU0OG1iXSA9IHRhcmdldFBvd2VyT2ZkbS50UG93MnhbMl07CkBAIC04MDcsMTIgKzgxOSwxMiBAQAogCiAJaWYgKElTX0NIQU5fMkdIWihjaGFuKSkJewogCQlyYXRlc0FycmF5W3JhdGUxbF0gPSB0YXJnZXRQb3dlckNjay50UG93MnhbMF07Ci0JCXJhdGVzQXJyYXlbcmF0ZTJzXSA9IHJhdGVzQXJyYXlbcmF0ZTJsXSA9Ci0JCQl0YXJnZXRQb3dlckNjay50UG93MnhbMV07Ci0JCXJhdGVzQXJyYXlbcmF0ZTVfNXNdID0gcmF0ZXNBcnJheVtyYXRlNV81bF0gPQotCQkJdGFyZ2V0UG93ZXJDY2sudFBvdzJ4WzJdOwotCQlyYXRlc0FycmF5W3JhdGUxMXNdID0gcmF0ZXNBcnJheVtyYXRlMTFsXSA9Ci0JCQl0YXJnZXRQb3dlckNjay50UG93MnhbM107CisJCXJhdGVzQXJyYXlbcmF0ZTJzXSA9CisJCXJhdGVzQXJyYXlbcmF0ZTJsXSA9IHRhcmdldFBvd2VyQ2NrLnRQb3cyeFsxXTsKKwkJcmF0ZXNBcnJheVtyYXRlNV81c10gPQorCQlyYXRlc0FycmF5W3JhdGU1XzVsXSA9IHRhcmdldFBvd2VyQ2NrLnRQb3cyeFsyXTsKKwkJcmF0ZXNBcnJheVtyYXRlMTFzXSA9CisJCXJhdGVzQXJyYXlbcmF0ZTExbF0gPSB0YXJnZXRQb3dlckNjay50UG93MnhbM107CiAJfQogCWlmIChJU19DSEFOX0hUNDAoY2hhbikpCXsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFyZ2V0UG93ZXJIdDQwLnRQb3cyeCk7IGkrKykKQEAgLTgyMSwyOCArODMzLDI4IEBACiAJCXJhdGVzQXJyYXlbcmF0ZUR1cE9mZG1dID0gdGFyZ2V0UG93ZXJIdDQwLnRQb3cyeFswXTsKIAkJcmF0ZXNBcnJheVtyYXRlRHVwQ2NrXSAgPSB0YXJnZXRQb3dlckh0NDAudFBvdzJ4WzBdOwogCQlyYXRlc0FycmF5W3JhdGVFeHRPZmRtXSA9IHRhcmdldFBvd2VyT2ZkbUV4dC50UG93MnhbMF07CisKIAkJaWYgKElTX0NIQU5fMkdIWihjaGFuKSkKIAkJCXJhdGVzQXJyYXlbcmF0ZUV4dENja10gPSB0YXJnZXRQb3dlckNja0V4dC50UG93MnhbMF07CiAJfQogCisjdW5kZWYgQ01QX0NUTAorI3VuZGVmIENNUF9OT19DVEwKICN1bmRlZiBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTgogI3VuZGVmIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4KIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfaHdfQVI5Mjg3X3NldF90eHBvd2VyKHN0cnVjdCBhdGhfaHcgKmFoLAorc3RhdGljIHZvaWQgYXRoOWtfaHdfYXI5Mjg3X3NldF90eHBvd2VyKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJCQlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwgdTE2IGNmZ0N0bCwKIAkJCQkJdTggdHdpY2VBbnRlbm5hUmVkdWN0aW9uLAogCQkJCQl1OCB0d2ljZU1heFJlZ3VsYXRvcnlQb3dlciwKIAkJCQkJdTggcG93ZXJMaW1pdCkKIHsKLSNkZWZpbmUgSU5DUkVBU0VfTUFYUE9XX0JZX1RXT19DSEFJTiAgICAgNgotI2RlZmluZSBJTkNSRUFTRV9NQVhQT1dfQllfVEhSRUVfQ0hBSU4gICAxMAotCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVndWxhdG9yeSA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpOwogCXN0cnVjdCBhcjkyODdfZWVwcm9tICpwRWVwRGF0YSA9ICZhaC0+ZWVwcm9tLm1hcDkyODc7CiAJc3RydWN0IG1vZGFsX2VlcF9hcjkyODdfaGVhZGVyICpwTW9kYWwgPSAmcEVlcERhdGEtPm1vZGFsSGVhZGVyOwogCWludDE2X3QgcmF0ZXNBcnJheVtBcjU0MTZSYXRlU2l6ZV07Ci0JaW50MTZfdCAgdHhQb3dlckluZGV4T2Zmc2V0ID0gMDsKKwlpbnQxNl90IHR4UG93ZXJJbmRleE9mZnNldCA9IDA7CiAJdTggaHQ0MFBvd2VySW5jRm9yUGRhZGMgPSAyOwogCWludCBpOwogCkBAIC04NTIsMTMgKzg2NCwxMyBAQAogCSAgICBBUjkyODdfRUVQX01JTk9SX1ZFUl8yKQogCQlodDQwUG93ZXJJbmNGb3JQZGFkYyA9IHBNb2RhbC0+aHQ0MFBvd2VySW5jRm9yUGRhZGM7CiAKLQlhdGg5a19od19zZXRfQVI5Mjg3X3Bvd2VyX3Blcl9yYXRlX3RhYmxlKGFoLCBjaGFuLAorCWF0aDlrX2h3X3NldF9hcjkyODdfcG93ZXJfcGVyX3JhdGVfdGFibGUoYWgsIGNoYW4sCiAJCQkJCQkgJnJhdGVzQXJyYXlbMF0sIGNmZ0N0bCwKIAkJCQkJCSB0d2ljZUFudGVubmFSZWR1Y3Rpb24sCiAJCQkJCQkgdHdpY2VNYXhSZWd1bGF0b3J5UG93ZXIsCiAJCQkJCQkgcG93ZXJMaW1pdCk7CiAKLQlhdGg5a19od19zZXRfQVI5Mjg3X3Bvd2VyX2NhbF90YWJsZShhaCwgY2hhbiwgJnR4UG93ZXJJbmRleE9mZnNldCk7CisJYXRoOWtfaHdfc2V0X2FyOTI4N19wb3dlcl9jYWxfdGFibGUoYWgsIGNoYW4sICZ0eFBvd2VySW5kZXhPZmZzZXQpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmF0ZXNBcnJheSk7IGkrKykgewogCQlyYXRlc0FycmF5W2ldID0gKGludDE2X3QpKHR4UG93ZXJJbmRleE9mZnNldCArIHJhdGVzQXJyYXlbaV0pOwpAQCAtODcxLDYgKzg4Myw3IEBACiAJCQlyYXRlc0FycmF5W2ldIC09IEFSOTI4N19QV1JfVEFCTEVfT0ZGU0VUX0RCICogMjsKIAl9CiAKKwkvKiBPRkRNIHBvd2VyIHBlciByYXRlICovCiAJUkVHX1dSSVRFKGFoLCBBUl9QSFlfUE9XRVJfVFhfUkFURTEsCiAJCSAgQVRIOUtfUE9XX1NNKHJhdGVzQXJyYXlbcmF0ZTE4bWJdLCAyNCkKIAkJICB8IEFUSDlLX1BPV19TTShyYXRlc0FycmF5W3JhdGUxMm1iXSwgMTYpCkBAIC04ODMsNiArODk2LDcgQEAKIAkJICB8IEFUSDlLX1BPV19TTShyYXRlc0FycmF5W3JhdGUzNm1iXSwgOCkKIAkJICB8IEFUSDlLX1BPV19TTShyYXRlc0FycmF5W3JhdGUyNG1iXSwgMCkpOwogCisJLyogQ0NLIHBvd2VyIHBlciByYXRlICovCiAJaWYgKElTX0NIQU5fMkdIWihjaGFuKSkJewogCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9QT1dFUl9UWF9SQVRFMywKIAkJCSAgQVRIOUtfUE9XX1NNKHJhdGVzQXJyYXlbcmF0ZTJzXSwgMjQpCkBAIC04OTYsNiArOTEwLDcgQEAKIAkJCSAgfCBBVEg5S19QT1dfU00ocmF0ZXNBcnJheVtyYXRlNV81bF0sIDApKTsKIAl9CiAKKwkvKiBIVDIwIHBvd2VyIHBlciByYXRlICovCiAJUkVHX1dSSVRFKGFoLCBBUl9QSFlfUE9XRVJfVFhfUkFURTUsCiAJCSAgQVRIOUtfUE9XX1NNKHJhdGVzQXJyYXlbcmF0ZUh0MjBfM10sIDI0KQogCQkgIHwgQVRIOUtfUE9XX1NNKHJhdGVzQXJyYXlbcmF0ZUh0MjBfMl0sIDE2KQpAQCAtOTA4LDggKzkyMyw5IEBACiAJCSAgfCBBVEg5S19QT1dfU00ocmF0ZXNBcnJheVtyYXRlSHQyMF81XSwgOCkKIAkJICB8IEFUSDlLX1BPV19TTShyYXRlc0FycmF5W3JhdGVIdDIwXzRdLCAwKSk7CiAKKwkvKiBIVDQwIHBvd2VyIHBlciByYXRlICovCiAJaWYgKElTX0NIQU5fSFQ0MChjaGFuKSkJewotCQlpZiAoYXRoOWtfaHdfQVI5Mjg3X2dldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkgeworCQlpZiAoYXRoOWtfaHdfYXI5Mjg3X2dldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkgewogCQkJUkVHX1dSSVRFKGFoLCBBUl9QSFlfUE9XRVJfVFhfUkFURTcsCiAJCQkJICBBVEg5S19QT1dfU00ocmF0ZXNBcnJheVtyYXRlSHQ0MF8zXSwgMjQpCiAJCQkJICB8IEFUSDlLX1BPV19TTShyYXRlc0FycmF5W3JhdGVIdDQwXzJdLCAxNikKQEAgLTk0Myw2ICs5NTksNyBAQAogCQkJCQkJIGh0NDBQb3dlckluY0ZvclBkYWRjLCAwKSk7CiAJCX0KIAorCQkvKiBEdXAvRXh0IHBvd2VyIHBlciByYXRlICovCiAJCVJFR19XUklURShhaCwgQVJfUEhZX1BPV0VSX1RYX1JBVEU5LAogCQkJICBBVEg5S19QT1dfU00ocmF0ZXNBcnJheVtyYXRlRXh0T2ZkbV0sIDI0KQogCQkJICB8IEFUSDlLX1BPV19TTShyYXRlc0FycmF5W3JhdGVFeHRDY2tdLCAxNikKQEAgLTk2MCwzNyArOTc3LDIwIEBACiAJCQlyYXRlc0FycmF5W2ldICsgQVI5Mjg3X1BXUl9UQUJMRV9PRkZTRVRfREIgKiAyOwogCWVsc2UKIAkJcmVndWxhdG9yeS0+bWF4X3Bvd2VyX2xldmVsID0gcmF0ZXNBcnJheVtpXTsKLQotCXN3aXRjaCAoYXI1NDE2X2dldF9udHhjaGFpbnMoYWgtPnR4Y2hhaW5tYXNrKSkgewotCWNhc2UgMToKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlyZWd1bGF0b3J5LT5tYXhfcG93ZXJfbGV2ZWwgKz0KLQkJCUlOQ1JFQVNFX01BWFBPV19CWV9UV09fQ0hBSU47Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJcmVndWxhdG9yeS0+bWF4X3Bvd2VyX2xldmVsICs9Ci0JCQlJTkNSRUFTRV9NQVhQT1dfQllfVEhSRUVfQ0hBSU47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRUVQUk9NLAotCQkJICAiSW52YWxpZCBjaGFpbm1hc2sgY29uZmlndXJhdGlvblxuIik7Ci0JCWJyZWFrOwotCX0KIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfaHdfQVI5Mjg3X3NldF9hZGRhYyhzdHJ1Y3QgYXRoX2h3ICphaCwKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2FyOTI4N19zZXRfYWRkYWMoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJICAgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDlrX2h3X0FSOTI4N19zZXRfYm9hcmRfdmFsdWVzKHN0cnVjdCBhdGhfaHcgKmFoLAorc3RhdGljIHZvaWQgYXRoOWtfaHdfYXI5Mjg3X3NldF9ib2FyZF92YWx1ZXMoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCSAgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CiAJc3RydWN0IGFyOTI4N19lZXByb20gKmVlcCA9ICZhaC0+ZWVwcm9tLm1hcDkyODc7CiAJc3RydWN0IG1vZGFsX2VlcF9hcjkyODdfaGVhZGVyICpwTW9kYWwgPSAmZWVwLT5tb2RhbEhlYWRlcjsKIAl1MTYgYW50V3JpdGVzW0FSOTI4N19BTlRfMTZTXTsKLQl1MzIgcmVnQ2hhaW5PZmZzZXQ7CisJdTMyIHJlZ0NoYWluT2Zmc2V0LCByZWd2YWw7CiAJdTggdHhSeEF0dGVuTG9jYWw7CiAJaW50IGksIGosIG9mZnNldF9udW07CiAKQEAgLTEwNzcsNDIgKzEwNzcsMzcgQEAKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfRVhUX0NDQTAsCiAJCSAgICAgIEFSX1BIWV9FWFRfQ0NBMF9USFJFU0g2MiwgcE1vZGFsLT50aHJlc2g2Mik7CiAKLQlhdGg5a19od19hbmFsb2dfc2hpZnRfcm13KGFoLCBBUjkyODdfQU5fUkYyRzNfQ0gwLCBBUjkyODdfQU5fUkYyRzNfREIxLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX0RCMV9TLCBwTW9kYWwtPmRiMSk7Ci0JYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhhaCwgQVI5Mjg3X0FOX1JGMkczX0NIMCwgQVI5Mjg3X0FOX1JGMkczX0RCMiwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19EQjJfUywgcE1vZGFsLT5kYjIpOwotCWF0aDlrX2h3X2FuYWxvZ19zaGlmdF9ybXcoYWgsIEFSOTI4N19BTl9SRjJHM19DSDAsCi0JCQkJICBBUjkyODdfQU5fUkYyRzNfT0JfQ0NLLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX09CX0NDS19TLCBwTW9kYWwtPm9iX2Njayk7Ci0JYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhhaCwgQVI5Mjg3X0FOX1JGMkczX0NIMCwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19PQl9QU0ssCi0JCQkJICBBUjkyODdfQU5fUkYyRzNfT0JfUFNLX1MsIHBNb2RhbC0+b2JfcHNrKTsKLQlhdGg5a19od19hbmFsb2dfc2hpZnRfcm13KGFoLCBBUjkyODdfQU5fUkYyRzNfQ0gwLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX09CX1FBTSwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19PQl9RQU1fUywgcE1vZGFsLT5vYl9xYW0pOwotCWF0aDlrX2h3X2FuYWxvZ19zaGlmdF9ybXcoYWgsIEFSOTI4N19BTl9SRjJHM19DSDAsCi0JCQkJICBBUjkyODdfQU5fUkYyRzNfT0JfUEFMX09GRiwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19PQl9QQUxfT0ZGX1MsCi0JCQkJICBwTW9kYWwtPm9iX3BhbF9vZmYpOworCXJlZ3ZhbCA9IFJFR19SRUFEKGFoLCBBUjkyODdfQU5fUkYyRzNfQ0gwKTsKKwlyZWd2YWwgJj0gfihBUjkyODdfQU5fUkYyRzNfREIxIHwKKwkJICAgIEFSOTI4N19BTl9SRjJHM19EQjIgfAorCQkgICAgQVI5Mjg3X0FOX1JGMkczX09CX0NDSyB8CisJCSAgICBBUjkyODdfQU5fUkYyRzNfT0JfUFNLIHwKKwkJICAgIEFSOTI4N19BTl9SRjJHM19PQl9RQU0gfAorCQkgICAgQVI5Mjg3X0FOX1JGMkczX09CX1BBTF9PRkYpOworCXJlZ3ZhbCB8PSAoU00ocE1vZGFsLT5kYjEsIEFSOTI4N19BTl9SRjJHM19EQjEpIHwKKwkJICAgU00ocE1vZGFsLT5kYjIsIEFSOTI4N19BTl9SRjJHM19EQjIpIHwKKwkJICAgU00ocE1vZGFsLT5vYl9jY2ssIEFSOTI4N19BTl9SRjJHM19PQl9DQ0spIHwKKwkJICAgU00ocE1vZGFsLT5vYl9wc2ssIEFSOTI4N19BTl9SRjJHM19PQl9QU0spIHwKKwkJICAgU00ocE1vZGFsLT5vYl9xYW0sIEFSOTI4N19BTl9SRjJHM19PQl9RQU0pIHwKKwkJICAgU00ocE1vZGFsLT5vYl9wYWxfb2ZmLCBBUjkyODdfQU5fUkYyRzNfT0JfUEFMX09GRikpOwogCi0JYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhhaCwgQVI5Mjg3X0FOX1JGMkczX0NIMSwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19EQjEsIEFSOTI4N19BTl9SRjJHM19EQjFfUywKLQkJCQkgIHBNb2RhbC0+ZGIxKTsKLQlhdGg5a19od19hbmFsb2dfc2hpZnRfcm13KGFoLCBBUjkyODdfQU5fUkYyRzNfQ0gxLCBBUjkyODdfQU5fUkYyRzNfREIyLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX0RCMl9TLCBwTW9kYWwtPmRiMik7Ci0JYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhhaCwgQVI5Mjg3X0FOX1JGMkczX0NIMSwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19PQl9DQ0ssCi0JCQkJICBBUjkyODdfQU5fUkYyRzNfT0JfQ0NLX1MsIHBNb2RhbC0+b2JfY2NrKTsKLQlhdGg5a19od19hbmFsb2dfc2hpZnRfcm13KGFoLCBBUjkyODdfQU5fUkYyRzNfQ0gxLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX09CX1BTSywKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19PQl9QU0tfUywgcE1vZGFsLT5vYl9wc2spOwotCWF0aDlrX2h3X2FuYWxvZ19zaGlmdF9ybXcoYWgsIEFSOTI4N19BTl9SRjJHM19DSDEsCi0JCQkJICBBUjkyODdfQU5fUkYyRzNfT0JfUUFNLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX09CX1FBTV9TLCBwTW9kYWwtPm9iX3FhbSk7Ci0JYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhhaCwgQVI5Mjg3X0FOX1JGMkczX0NIMSwKLQkJCQkgIEFSOTI4N19BTl9SRjJHM19PQl9QQUxfT0ZGLAotCQkJCSAgQVI5Mjg3X0FOX1JGMkczX09CX1BBTF9PRkZfUywKLQkJCQkgIHBNb2RhbC0+b2JfcGFsX29mZik7CisJYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JlZ3dyaXRlKGFoLCBBUjkyODdfQU5fUkYyRzNfQ0gwLCByZWd2YWwpOworCisJcmVndmFsID0gUkVHX1JFQUQoYWgsIEFSOTI4N19BTl9SRjJHM19DSDEpOworCXJlZ3ZhbCAmPSB+KEFSOTI4N19BTl9SRjJHM19EQjEgfAorCQkgICAgQVI5Mjg3X0FOX1JGMkczX0RCMiB8CisJCSAgICBBUjkyODdfQU5fUkYyRzNfT0JfQ0NLIHwKKwkJICAgIEFSOTI4N19BTl9SRjJHM19PQl9QU0sgfAorCQkgICAgQVI5Mjg3X0FOX1JGMkczX09CX1FBTSB8CisJCSAgICBBUjkyODdfQU5fUkYyRzNfT0JfUEFMX09GRik7CisJcmVndmFsIHw9IChTTShwTW9kYWwtPmRiMSwgQVI5Mjg3X0FOX1JGMkczX0RCMSkgfAorCQkgICBTTShwTW9kYWwtPmRiMiwgQVI5Mjg3X0FOX1JGMkczX0RCMikgfAorCQkgICBTTShwTW9kYWwtPm9iX2NjaywgQVI5Mjg3X0FOX1JGMkczX09CX0NDSykgfAorCQkgICBTTShwTW9kYWwtPm9iX3BzaywgQVI5Mjg3X0FOX1JGMkczX09CX1BTSykgfAorCQkgICBTTShwTW9kYWwtPm9iX3FhbSwgQVI5Mjg3X0FOX1JGMkczX09CX1FBTSkgfAorCQkgICBTTShwTW9kYWwtPm9iX3BhbF9vZmYsIEFSOTI4N19BTl9SRjJHM19PQl9QQUxfT0ZGKSk7CisKKwlhdGg5a19od19hbmFsb2dfc2hpZnRfcmVnd3JpdGUoYWgsIEFSOTI4N19BTl9SRjJHM19DSDEsIHJlZ3ZhbCk7CiAKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUkZfQ1RMMiwKIAkJICAgICAgQVJfUEhZX1RYX0VORF9EQVRBX1NUQVJULCBwTW9kYWwtPnR4RnJhbWVUb0RhdGFTdGFydCk7CkBAIC0xMTI1LDI2ICsxMTIwLDI3IEBACiAJCQkJICBwTW9kYWwtPnhwYUJpYXNMdmwpOwogfQogCi1zdGF0aWMgdTggYXRoOWtfaHdfQVI5Mjg3X2dldF9udW1fYW50X2NvbmZpZyhzdHJ1Y3QgYXRoX2h3ICphaCwKK3N0YXRpYyB1OCBhdGg5a19od19hcjkyODdfZ2V0X251bV9hbnRfY29uZmlnKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgZnJlcV9iYW5kKQogewogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdTE2IGF0aDlrX2h3X0FSOTI4N19nZXRfZWVwcm9tX2FudGVubmFfY2ZnKHN0cnVjdCBhdGhfaHcgKmFoLAorc3RhdGljIHUzMiBhdGg5a19od19hcjkyODdfZ2V0X2VlcHJvbV9hbnRlbm5hX2NmZyhzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJCSAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CiAJc3RydWN0IGFyOTI4N19lZXByb20gKmVlcCA9ICZhaC0+ZWVwcm9tLm1hcDkyODc7CiAJc3RydWN0IG1vZGFsX2VlcF9hcjkyODdfaGVhZGVyICpwTW9kYWwgPSAmZWVwLT5tb2RhbEhlYWRlcjsKIAotCXJldHVybiBwTW9kYWwtPmFudEN0cmxDb21tb24gJiAweEZGRkY7CisJcmV0dXJuIHBNb2RhbC0+YW50Q3RybENvbW1vbjsKIH0KIAotc3RhdGljIHUxNiBhdGg5a19od19BUjkyODdfZ2V0X3NwdXJfY2hhbm5lbChzdHJ1Y3QgYXRoX2h3ICphaCwKK3N0YXRpYyB1MTYgYXRoOWtfaHdfYXI5Mjg3X2dldF9zcHVyX2NoYW5uZWwoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCSAgICB1MTYgaSwgYm9vbCBpczJHSHopCiB7CiAjZGVmaW5lIEVFUF9NQVA5Mjg3X1NQVVJDSEFOIFwKIAkoYWgtPmVlcHJvbS5tYXA5Mjg3Lm1vZGFsSGVhZGVyLnNwdXJDaGFuc1tpXS5zcHVyQ2hhbikKKwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXUxNiBzcHVyX3ZhbCA9IEFSX05PX1NQVVI7CiAKQEAgLTExNzEsMTUgKzExNjcsMTUgQEAKIH0KIAogY29uc3Qgc3RydWN0IGVlcHJvbV9vcHMgZWVwX2FyOTI4N19vcHMgPSB7Ci0JLmNoZWNrX2VlcHJvbQkJPSBhdGg5a19od19BUjkyODdfY2hlY2tfZWVwcm9tLAotCS5nZXRfZWVwcm9tCQk9IGF0aDlrX2h3X0FSOTI4N19nZXRfZWVwcm9tLAotCS5maWxsX2VlcHJvbQkJPSBhdGg5a19od19BUjkyODdfZmlsbF9lZXByb20sCi0JLmdldF9lZXByb21fdmVyCQk9IGF0aDlrX2h3X0FSOTI4N19nZXRfZWVwcm9tX3ZlciwKLQkuZ2V0X2VlcHJvbV9yZXYJCT0gYXRoOWtfaHdfQVI5Mjg3X2dldF9lZXByb21fcmV2LAotCS5nZXRfbnVtX2FudF9jb25maWcJPSBhdGg5a19od19BUjkyODdfZ2V0X251bV9hbnRfY29uZmlnLAotCS5nZXRfZWVwcm9tX2FudGVubmFfY2ZnCT0gYXRoOWtfaHdfQVI5Mjg3X2dldF9lZXByb21fYW50ZW5uYV9jZmcsCi0JLnNldF9ib2FyZF92YWx1ZXMJPSBhdGg5a19od19BUjkyODdfc2V0X2JvYXJkX3ZhbHVlcywKLQkuc2V0X2FkZGFjCQk9IGF0aDlrX2h3X0FSOTI4N19zZXRfYWRkYWMsCi0JLnNldF90eHBvd2VyCQk9IGF0aDlrX2h3X0FSOTI4N19zZXRfdHhwb3dlciwKLQkuZ2V0X3NwdXJfY2hhbm5lbAk9IGF0aDlrX2h3X0FSOTI4N19nZXRfc3B1cl9jaGFubmVsCisJLmNoZWNrX2VlcHJvbQkJPSBhdGg5a19od19hcjkyODdfY2hlY2tfZWVwcm9tLAorCS5nZXRfZWVwcm9tCQk9IGF0aDlrX2h3X2FyOTI4N19nZXRfZWVwcm9tLAorCS5maWxsX2VlcHJvbQkJPSBhdGg5a19od19hcjkyODdfZmlsbF9lZXByb20sCisJLmdldF9lZXByb21fdmVyCQk9IGF0aDlrX2h3X2FyOTI4N19nZXRfZWVwcm9tX3ZlciwKKwkuZ2V0X2VlcHJvbV9yZXYJCT0gYXRoOWtfaHdfYXI5Mjg3X2dldF9lZXByb21fcmV2LAorCS5nZXRfbnVtX2FudF9jb25maWcJPSBhdGg5a19od19hcjkyODdfZ2V0X251bV9hbnRfY29uZmlnLAorCS5nZXRfZWVwcm9tX2FudGVubmFfY2ZnCT0gYXRoOWtfaHdfYXI5Mjg3X2dldF9lZXByb21fYW50ZW5uYV9jZmcsCisJLnNldF9ib2FyZF92YWx1ZXMJPSBhdGg5a19od19hcjkyODdfc2V0X2JvYXJkX3ZhbHVlcywKKwkuc2V0X2FkZGFjCQk9IGF0aDlrX2h3X2FyOTI4N19zZXRfYWRkYWMsCisJLnNldF90eHBvd2VyCQk9IGF0aDlrX2h3X2FyOTI4N19zZXRfdHhwb3dlciwKKwkuZ2V0X3NwdXJfY2hhbm5lbAk9IGF0aDlrX2h3X2FyOTI4N19nZXRfc3B1cl9jaGFubmVsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKaW5kZXggN2UxZWQ3OGQuLmFmYTJiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYwpAQCAtNTkzLDcgKzU5Myw3IEBACiAJCQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCiAJCQkJc3RydWN0IGNhbF9kYXRhX3Blcl9mcmVxICpwUmF3RGF0YVNldCwKIAkJCQl1OCAqYkNoYW5zLCB1MTYgYXZhaWxQaWVycywKLQkJCQl1MTYgdFBkR2Fpbk92ZXJsYXAsIGludDE2X3QgKnBNaW5DYWxQb3dlciwKKwkJCQl1MTYgdFBkR2Fpbk92ZXJsYXAsCiAJCQkJdTE2ICpwUGRHYWluQm91bmRhcmllcywgdTggKnBQREFEQ1ZhbHVlcywKIAkJCQl1MTYgbnVtWHBkR2FpbnMpCiB7CkBAIC02MTcsNiArNjE3LDcgQEAKIAlpbnQxNl90IG1pbkRlbHRhID0gMDsKIAlzdHJ1Y3QgY2hhbl9jZW50ZXJzIGNlbnRlcnM7CiAKKwltZW1zZXQoJm1pblB3clQ0LCAwLCBBUjkyODdfTlVNX1BEX0dBSU5TKTsKIAlhdGg5a19od19nZXRfY2hhbm5lbF9jZW50ZXJzKGFoLCBjaGFuLCAmY2VudGVycyk7CiAKIAlmb3IgKG51bVBpZXJzID0gMDsgbnVtUGllcnMgPCBhdmFpbFBpZXJzOyBudW1QaWVycysrKSB7CkBAIC02NzQsOCArNjc1LDYgQEAKIAkJfQogCX0KIAotCSpwTWluQ2FsUG93ZXIgPSAoaW50MTZfdCkobWluUHdyVDRbMF0gLyAyKTsKLQogCWsgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IG51bVhwZEdhaW5zOyBpKyspIHsKQEAgLTcyOSw3ICs3MjgsNyBAQAogCQkJCSAgICB2cGRUYWJsZUlbaV1bc2l6ZUN1cnJWcGRUYWJsZSAtIDJdKTsKIAkJdnBkU3RlcCA9IChpbnQxNl90KSgodnBkU3RlcCA8IDEpID8gMSA6IHZwZFN0ZXApOwogCi0JCWlmICh0Z3RJbmRleCA+IG1heEluZGV4KSB7CisJCWlmICh0Z3RJbmRleCA+PSBtYXhJbmRleCkgewogCQkJd2hpbGUgKChzcyA8PSB0Z3RJbmRleCkgJiYKIAkJCSAgICAgICAoayA8IChBUjU0MTZfTlVNX1BEQURDX1ZBTFVFUyAtIDEpKSkgewogCQkJCXRtcFZhbCA9IChpbnQxNl90KSgodnBkVGFibGVJW2ldW3NpemVDdXJyVnBkVGFibGUgLSAxXSArCkBAIC04MzcsNyArODM2LDcgQEAKIAlzdGF0aWMgdTggcGRhZGNWYWx1ZXNbQVI1NDE2X05VTV9QREFEQ19WQUxVRVNdOwogCXUxNiBnYWluQm91bmRhcmllc1tBUjU0MTZfUERfR0FJTlNfSU5fTUFTS107CiAJdTE2IG51bVBpZXJzLCBpLCBqOwotCWludDE2X3QgdE1pbkNhbFBvd2VyLCBkaWZmID0gMDsKKwlpbnQxNl90IGRpZmYgPSAwOwogCXUxNiBudW1YcGRHYWluLCB4cGRNYXNrOwogCXUxNiB4cGRHYWluVmFsdWVzW0FSNTQxNl9OVU1fUERfR0FJTlNdID0geyAwLCAwLCAwLCAwIH07CiAJdTMyIHJlZzMyLCByZWdPZmZzZXQsIHJlZ0NoYWluT2Zmc2V0OwpAQCAtOTIyLDcgKzkyMSw2IEBACiAJCQkJCQkJY2hhbiwgcFJhd0RhdGFzZXQsCiAJCQkJCQkJcENhbEJDaGFucywgbnVtUGllcnMsCiAJCQkJCQkJcGRHYWluT3ZlcmxhcF90MiwKLQkJCQkJCQkmdE1pbkNhbFBvd2VyLAogCQkJCQkJCWdhaW5Cb3VuZGFyaWVzLAogCQkJCQkJCXBkYWRjVmFsdWVzLAogCQkJCQkJCW51bVhwZEdhaW4pOwpAQCAtMTQzNywxNCArMTQzNSwxNCBAQAogCXJldHVybiBudW1fYW50X2NvbmZpZzsKIH0KIAotc3RhdGljIHUxNiBhdGg5a19od19kZWZfZ2V0X2VlcHJvbV9hbnRlbm5hX2NmZyhzdHJ1Y3QgYXRoX2h3ICphaCwKK3N0YXRpYyB1MzIgYXRoOWtfaHdfZGVmX2dldF9lZXByb21fYW50ZW5uYV9jZmcoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCSAgICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKIAlzdHJ1Y3QgYXI1NDE2X2VlcHJvbV9kZWYgKmVlcCA9ICZhaC0+ZWVwcm9tLmRlZjsKIAlzdHJ1Y3QgbW9kYWxfZWVwX2hlYWRlciAqcE1vZGFsID0KIAkJJihlZXAtPm1vZGFsSGVhZGVyW0lTX0NIQU5fMkdIWihjaGFuKV0pOwogCi0JcmV0dXJuIHBNb2RhbC0+YW50Q3RybENvbW1vbiAmIDB4RkZGRjsKKwlyZXR1cm4gcE1vZGFsLT5hbnRDdHJsQ29tbW9uOwogfQogCiBzdGF0aWMgdTE2IGF0aDlrX2h3X2RlZl9nZXRfc3B1cl9jaGFubmVsKHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgaSwgYm9vbCBpczJHSHopCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwppbmRleCAwZWU3NWU3Li4zYThlZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKQEAgLTc2LDcgKzc2LDggQEAKIAljYXNlIExFRF9GVUxMOgogCQlpZiAobGVkLT5sZWRfdHlwZSA9PSBBVEhfTEVEX0FTU09DKSB7CiAJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfTEVEX0FTU09DSUFURUQ7Ci0JCQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHNjLT5odywKKwkJCWlmIChsZWRfYmxpbmspCisJCQkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhzYy0+aHcsCiAJCQkJCQkgICAgICZzYy0+YXRoX2xlZF9ibGlua193b3JrLCAwKTsKIAkJfSBlbHNlIGlmIChsZWQtPmxlZF90eXBlID09IEFUSF9MRURfUkFESU8pIHsKIAkJCWF0aDlrX2h3X3NldF9ncGlvKHNjLT5zY19haCwgc2MtPnNjX2FoLT5sZWRfcGluLCAwKTsKQEAgLTE0Myw3ICsxNDQsOCBAQAogCS8qIExFRCBvZmYsIGFjdGl2ZSBsb3cgKi8KIAlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIHNjLT5zY19haC0+bGVkX3BpbiwgMSk7CiAKLQlJTklUX0RFTEFZRURfV09SSygmc2MtPmF0aF9sZWRfYmxpbmtfd29yaywgYXRoX2xlZF9ibGlua193b3JrKTsKKwlpZiAobGVkX2JsaW5rKQorCQlJTklUX0RFTEFZRURfV09SSygmc2MtPmF0aF9sZWRfYmxpbmtfd29yaywgYXRoX2xlZF9ibGlua193b3JrKTsKIAogCXRyaWdnZXIgPSBpZWVlODAyMTFfZ2V0X3JhZGlvX2xlZF9uYW1lKHNjLT5odyk7CiAJc25wcmludGYoc2MtPnJhZGlvX2xlZC5uYW1lLCBzaXplb2Yoc2MtPnJhZGlvX2xlZC5uYW1lKSwKQEAgLTE4MCw3ICsxODIsOCBAQAogCXJldHVybjsKIAogZmFpbDoKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnNjLT5hdGhfbGVkX2JsaW5rX3dvcmspOworCWlmIChsZWRfYmxpbmspCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2MtPmF0aF9sZWRfYmxpbmtfd29yayk7CiAJYXRoX2RlaW5pdF9sZWRzKHNjKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2hpZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9oaWZfdXNiLmMKaW5kZXggMjNjMTVhYS4uNjFjMWJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2hpZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaGlmX3VzYi5jCkBAIC0xNiwxMiArMTYsMjcgQEAKIAogI2luY2x1ZGUgImh0Yy5oIgogCi0jZGVmaW5lIEFUSDlLX0ZXX1VTQl9ERVYoZGV2aWQsIGZ3KQkJCQkJXAotCXsgVVNCX0RFVklDRSgweDBjZjMsIGRldmlkKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIGZ3IH0KKy8qIGlkZW50aWZ5IGZpcm13YXJlIGltYWdlcyAqLworI2RlZmluZSBGSVJNV0FSRV9BUjcwMTAJCSJhcjcwMTAuZnciCisjZGVmaW5lIEZJUk1XQVJFX0FSNzAxMF8xXzEJImFyNzAxMF8xXzEuZnciCisjZGVmaW5lIEZJUk1XQVJFX0FSOTI3MQkJImFyOTI3MS5mdyIKKworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX0FSNzAxMCk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfQVI3MDEwXzFfMSk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfQVI5MjcxKTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGF0aDlrX2hpZl91c2JfaWRzW10gPSB7Ci0JQVRIOUtfRldfVVNCX0RFVigweDkyNzEsICJhcjkyNzEuZnciKSwKLQlBVEg5S19GV19VU0JfREVWKDB4MTAwNiwgImFyOTI3MS5mdyIpLAorCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4OTI3MSkgfSwgLyogQXRoZXJvcyAqLworCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4MTAwNikgfSwgLyogQXRoZXJvcyAqLworCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4NzAxMCkgfSwgLyogQXRoZXJvcyAqLworCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4NzAxNSkgfSwgLyogQXRoZXJvcyAqLworCXsgVVNCX0RFVklDRSgweDA4NDYsIDB4OTAzMCkgfSwgLyogTmV0Z2VhciBOMTUwICovCisJeyBVU0JfREVWSUNFKDB4MDg0NiwgMHg5MDE4KSB9LCAvKiBOZXRnZWFyIFdOREEzMjAwICovCisJeyBVU0JfREVWSUNFKDB4MDdEMSwgMHgzQTEwKSB9LCAvKiBEbGluayBXaXJlbGVzcyAxNTAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxM0QzLCAweDMzMjcpIH0sIC8qIEF6dXJld2F2ZSAqLworCXsgVVNCX0RFVklDRSgweDEzRDMsIDB4MzMyOCkgfSwgLyogQXp1cmV3YXZlICovCisJeyBVU0JfREVWSUNFKDB4MDRDQSwgMHg0NjA1KSB9LCAvKiBMaXRlb24gKi8KKwl7IFVTQl9ERVZJQ0UoMHgwODNBLCAweEE3MDQpIH0sIC8qIFNNQyBOZXR3b3JrcyAqLwogCXsgfSwKIH07CiAKQEAgLTc2MCw2ICs3NzUsNyBAQAogCXNpemVfdCBsZW4gPSBoaWZfZGV2LT5maXJtd2FyZS0+c2l6ZTsKIAl1MzIgYWRkciA9IEFSOTI3MV9GSVJNV0FSRTsKIAl1OCAqYnVmID0ga3phbGxvYyg0MDk2LCBHRlBfS0VSTkVMKTsKKwl1MzIgZmlybV9vZmZzZXQ7CiAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODMsMzIgKzc5OSwzNyBAQAogCX0KIAlrZnJlZShidWYpOwogCisJaWYgKGhpZl9kZXYtPmRldmljZV9pZCA9PSAweDcwMTApCisJCWZpcm1fb2Zmc2V0ID0gQVI3MDEwX0ZJUk1XQVJFX1RFWFQ7CisJZWxzZQorCQlmaXJtX29mZnNldCA9IEFSOTI3MV9GSVJNV0FSRV9URVhUOworCiAJLyoKIAkgKiBJc3N1ZSBGVyBkb3dubG9hZCBjb21wbGV0ZSBjb21tYW5kIHRvIGZpcm13YXJlLgogCSAqLwogCWVyciA9IHVzYl9jb250cm9sX21zZyhoaWZfZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoaGlmX2Rldi0+dWRldiwgMCksCiAJCQkgICAgICBGSVJNV0FSRV9ET1dOTE9BRF9DT01QLAogCQkJICAgICAgMHg0MCB8IFVTQl9ESVJfT1VULAotCQkJICAgICAgQVI5MjcxX0ZJUk1XQVJFX1RFWFQgPj4gOCwgMCwgTlVMTCwgMCwgSFopOworCQkJICAgICAgZmlybV9vZmZzZXQgPj4gOCwgMCwgTlVMTCwgMCwgSFopOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUlPOwogCiAJZGV2X2luZm8oJmhpZl9kZXYtPnVkZXYtPmRldiwgImF0aDlrX2h0YzogVHJhbnNmZXJyZWQgRlc6ICVzLCBzaXplOiAlbGRcbiIsCi0JCSAiYXI5MjcxLmZ3IiwgKHVuc2lnbmVkIGxvbmcpIGhpZl9kZXYtPmZpcm13YXJlLT5zaXplKTsKKwkJIGhpZl9kZXYtPmZ3X25hbWUsICh1bnNpZ25lZCBsb25nKSBoaWZfZGV2LT5maXJtd2FyZS0+c2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg5a19oaWZfdXNiX2Rldl9pbml0KHN0cnVjdCBoaWZfZGV2aWNlX3VzYiAqaGlmX2RldiwKLQkJCQkgIGNvbnN0IGNoYXIgKmZ3X25hbWUpCitzdGF0aWMgaW50IGF0aDlrX2hpZl91c2JfZGV2X2luaXQoc3RydWN0IGhpZl9kZXZpY2VfdXNiICpoaWZfZGV2KQogewogCWludCByZXQ7CiAKIAkvKiBSZXF1ZXN0IGZpcm13YXJlICovCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmaGlmX2Rldi0+ZmlybXdhcmUsIGZ3X25hbWUsICZoaWZfZGV2LT51ZGV2LT5kZXYpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmhpZl9kZXYtPmZpcm13YXJlLCBoaWZfZGV2LT5md19uYW1lLAorCQkJICAgICAgICZoaWZfZGV2LT51ZGV2LT5kZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmaGlmX2Rldi0+dWRldi0+ZGV2LAotCQkJImF0aDlrX2h0YzogRmlybXdhcmUgLSAlcyBub3QgZm91bmRcbiIsIGZ3X25hbWUpOworCQkJImF0aDlrX2h0YzogRmlybXdhcmUgLSAlcyBub3QgZm91bmRcbiIsIGhpZl9kZXYtPmZ3X25hbWUpOwogCQlnb3RvIGVycl9md19yZXE7CiAJfQogCkBAIC04MjQsNyArODQ1LDggQEAKIAlyZXQgPSBhdGg5a19oaWZfdXNiX2Rvd25sb2FkX2Z3KGhpZl9kZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmaGlmX2Rldi0+dWRldi0+ZGV2LAotCQkJImF0aDlrX2h0YzogRmlybXdhcmUgLSAlcyBkb3dubG9hZCBmYWlsZWRcbiIsIGZ3X25hbWUpOworCQkJImF0aDlrX2h0YzogRmlybXdhcmUgLSAlcyBkb3dubG9hZCBmYWlsZWRcbiIsCisJCQloaWZfZGV2LT5md19uYW1lKTsKIAkJZ290byBlcnJfZndfZG93bmxvYWQ7CiAJfQogCkBAIC04NTEsNyArODczLDYgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKIAlzdHJ1Y3QgaGlmX2RldmljZV91c2IgKmhpZl9kZXY7Ci0JY29uc3QgY2hhciAqZndfbmFtZSA9IChjb25zdCBjaGFyICopIGlkLT5kcml2ZXJfaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAogCWhpZl9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlmX2RldmljZV91c2IpLCBHRlBfS0VSTkVMKTsKQEAgLTg3Niw3ICs4OTcsMjcgQEAKIAkJZ290byBlcnJfaHRjX2h3X2FsbG9jOwogCX0KIAotCXJldCA9IGF0aDlrX2hpZl91c2JfZGV2X2luaXQoaGlmX2RldiwgZndfbmFtZSk7CisJLyogRmluZCBvdXQgd2hpY2ggZmlybXdhcmUgdG8gbG9hZCAqLworCisJc3dpdGNoKGhpZl9kZXYtPmRldmljZV9pZCkgeworCWNhc2UgMHg3MDEwOgorCWNhc2UgMHg5MDE4OgorCQlpZiAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpID09IDB4MDIwMikKKwkJCWhpZl9kZXYtPmZ3X25hbWUgPSBGSVJNV0FSRV9BUjcwMTBfMV8xOworCQllbHNlCisJCQloaWZfZGV2LT5md19uYW1lID0gRklSTVdBUkVfQVI3MDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQloaWZfZGV2LT5md19uYW1lID0gRklSTVdBUkVfQVI5MjcxOworCQlicmVhazsKKwl9CisKKwlpZiAoIWhpZl9kZXYtPmZ3X25hbWUpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2FuJ3QgZGV0ZXJtaW5lIGZpcm13YXJlICFcbiIpOworCQlnb3RvIGVycl9odGNfaHdfYWxsb2M7CisJfQorCisJcmV0ID0gYXRoOWtfaGlmX3VzYl9kZXZfaW5pdChoaWZfZGV2KTsKIAlpZiAocmV0KSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2hpZl9pbml0X3VzYjsKQEAgLTkxMSwxMiArOTUyLDEwIEBACiAJdm9pZCAqYnVmOwogCWludCByZXQ7CiAKLQlidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOworCWJ1ZiA9IGttZW1kdXAoJnJlYm9vdF9jbWQsIDQsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm47CiAKLQltZW1jcHkoYnVmLCAmcmVib290X2NtZCwgNCk7Ci0KIAlyZXQgPSB1c2JfYnVsa19tc2codWRldiwgdXNiX3NuZGJ1bGtwaXBlKHVkZXYsIFVTQl9SRUdfT1VUX1BJUEUpLAogCQkJICAgYnVmLCA0LCBOVUxMLCBIWik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9oaWZfdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaGlmX3VzYi5oCmluZGV4IDBhY2E0OWI2Li4yZGFmOTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaGlmX3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9oaWZfdXNiLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2RlZmluZSBBUjkyNzFfRklSTVdBUkUgICAgICAgMHg1MDEwMDAKICNkZWZpbmUgQVI5MjcxX0ZJUk1XQVJFX1RFWFQgIDB4OTAzMDAwCisjZGVmaW5lIEFSNzAxMF9GSVJNV0FSRV9URVhUICAweDkwNjAwMAogCiAjZGVmaW5lIEZJUk1XQVJFX0RPV05MT0FEICAgICAgIDB4MzAKICNkZWZpbmUgRklSTVdBUkVfRE9XTkxPQURfQ09NUCAgMHgzMQpAQCAtOTAsNiArOTEsNyBAQAogCXN0cnVjdCB1c2JfYW5jaG9yIHJlZ291dF9zdWJtaXR0ZWQ7CiAJc3RydWN0IHVzYl9hbmNob3Igcnhfc3VibWl0dGVkOwogCXN0cnVjdCBza19idWZmICpyZW1haW5fc2tiOworCWNvbnN0IGNoYXIgKmZ3X25hbWU7CiAJaW50IHJ4X3JlbWFpbl9sZW47CiAJaW50IHJ4X3BrdF9sZW47CiAJaW50IHJ4X3RyYW5zZmVyX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGMuaAppbmRleCBjMjUxNjAzLi4zNzU2NDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Yy5oCkBAIC0yMjMsMTUgKzIyMyw2IEBACiAJZW51bSB0aWRfYWdncl9zdGF0ZSB0aWRfc3RhdGVbQVRIOUtfSFRDX01BWF9USURdOwogfTsKIAotc3RydWN0IGF0aDlrX2h0Y19hZ2dyX3dvcmsgewotCXUxNiB0aWQ7Ci0JdTggc3RhX2FkZHJbRVRIX0FMRU5dOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7Ci0JZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uOwotCXN0cnVjdCBtdXRleCBtdXRleDsKLX07Ci0KICNkZWZpbmUgQVRIOUtfSFRDX1JYQlVGIDI1NgogI2RlZmluZSBIVENfUlhfRlJBTUVfSEVBREVSX1NJWkUgNDAKIApAQCAtMjU3LDEyICsyNDgsMTUgQEAKICNkZWZpbmUgVFhfU1RBVF9JTkMoYykgKGhpZl9kZXYtPmh0Y19oYW5kbGUtPmRydl9wcml2LT5kZWJ1Zy50eF9zdGF0cy5jKyspCiAjZGVmaW5lIFJYX1NUQVRfSU5DKGMpIChoaWZfZGV2LT5odGNfaGFuZGxlLT5kcnZfcHJpdi0+ZGVidWcucnhfc3RhdHMuYysrKQogCisjZGVmaW5lIFRYX1FTVEFUX0lOQyhxKSAocHJpdi0+ZGVidWcudHhfc3RhdHMucXVldWVfc3RhdHNbcV0rKykKKwogc3RydWN0IGF0aF90eF9zdGF0cyB7CiAJdTMyIGJ1Zl9xdWV1ZWQ7CiAJdTMyIGJ1Zl9jb21wbGV0ZWQ7CiAJdTMyIHNrYl9xdWV1ZWQ7CiAJdTMyIHNrYl9jb21wbGV0ZWQ7CiAJdTMyIHNrYl9kcm9wcGVkOworCXUzMiBxdWV1ZV9zdGF0c1tXTUVfTlVNX0FDXTsKIH07CiAKIHN0cnVjdCBhdGhfcnhfc3RhdHMgewpAQCAtMjg2LDExICsyODAsMTQgQEAKICNkZWZpbmUgVFhfU1RBVF9JTkMoYykgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBSWF9TVEFUX0lOQyhjKSBkbyB7IH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgVFhfUVNUQVRfSU5DKGMpIGRvIHsgfSB3aGlsZSAoMCkKKwogI2VuZGlmIC8qIENPTkZJR19BVEg5S19IVENfREVCVUdGUyAqLwogCiAjZGVmaW5lIEFUSF9MRURfUElOX0RFRiAgICAgICAgICAgICAxCiAjZGVmaW5lIEFUSF9MRURfUElOXzkyODcgICAgICAgICAgICA4CiAjZGVmaW5lIEFUSF9MRURfUElOXzkyNzEgICAgICAgICAgICAxNQorI2RlZmluZSBBVEhfTEVEX1BJTl83MDEwICAgICAgICAgICAgMTIKICNkZWZpbmUgQVRIX0xFRF9PTl9EVVJBVElPTl9JRExFICAgIDM1MAkvKiBpbiBtc2VjcyAqLwogI2RlZmluZSBBVEhfTEVEX09GRl9EVVJBVElPTl9JRExFICAgMjUwCS8qIGluIG1zZWNzICovCiAKQEAgLTMyNiwxMSArMzIzLDEwIEBACiAjZGVmaW5lIE9QX0xFRF9PTiAgICAgICAgIEJJVCg0KQogI2RlZmluZSBPUF9QUkVBTUJMRV9TSE9SVCBCSVQoNSkKICNkZWZpbmUgT1BfUFJPVEVDVF9FTkFCTEUgQklUKDYpCi0jZGVmaW5lIE9QX1RYQUdHUiAgICAgICAgIEJJVCg3KQotI2RlZmluZSBPUF9BU1NPQ0lBVEVEICAgICBCSVQoOCkKLSNkZWZpbmUgT1BfRU5BQkxFX0JFQUNPTiAgQklUKDkpCi0jZGVmaW5lIE9QX0xFRF9ERUlOSVQgICAgIEJJVCgxMCkKLSNkZWZpbmUgT1BfVU5QTFVHR0VEICAgICAgQklUKDExKQorI2RlZmluZSBPUF9BU1NPQ0lBVEVEICAgICBCSVQoNykKKyNkZWZpbmUgT1BfRU5BQkxFX0JFQUNPTiAgQklUKDgpCisjZGVmaW5lIE9QX0xFRF9ERUlOSVQgICAgIEJJVCg5KQorI2RlZmluZSBPUF9VTlBMVUdHRUQgICAgICBCSVQoMTApCiAKIHN0cnVjdCBhdGg5a19odGNfcHJpdiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtMzcxLDggKzM2Nyw2IEBACiAJc3RydWN0IGF0aDlrX2h0Y19yeCByeDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHhfdGFza2xldDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOwotCXN0cnVjdCBhdGg5a19odGNfYWdncl93b3JrIGFnZ3Jfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGF0aDlrX2FnZ3Jfd29yazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGF0aDlrX2FuaV93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBwc193b3JrOwogCkBAIC0zOTAsMTMgKzM4NCwxNCBAQAogCWludCBsZWRfb2ZmX2R1cmF0aW9uOwogCWludCBsZWRfb25fY250OwogCWludCBsZWRfb2ZmX2NudDsKLQlpbnQgaHdxX21hcFtBVEg5S19XTUVfQUNfVk8rMV07CisKKwlpbnQgYmVhY29ucTsKKwlpbnQgY2FicTsKKwlpbnQgaHdxX21hcFtXTUVfTlVNX0FDXTsKIAogI2lmZGVmIENPTkZJR19BVEg5S19IVENfREVCVUdGUwogCXN0cnVjdCBhdGg5a19kZWJ1ZyBkZWJ1ZzsKICNlbmRpZgotCXN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUgdGd0X3JhdGU7Ci0KIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiB9OwogCkBAIC00MDUsNiArNDAwLDcgQEAKIAljb21tb24tPmJ1c19vcHMtPnJlYWRfY2FjaGVzaXplKGNvbW1vbiwgY3N6KTsKIH0KIAordm9pZCBhdGg5a19odGNfYmVhY29ucV9jb25maWcoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2KTsKIHZvaWQgYXRoOWtfaHRjX2JlYWNvbl9jb25maWcoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIHZvaWQgYXRoOWtfaHRjX3N3YmEoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LCB1OCBiZWFjb25fcGVuZGluZyk7CkBAIC00MjQsOCArNDIwLDggQEAKIHZvaWQgYXRoOWtfdHhfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwogaW50IGF0aDlrX2h0Y190eF9zdGFydChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBhdGg5a190eF9jbGVhbnVwKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdik7Ci1ib29sIGF0aDlrX2h0Y190eHFfc2V0dXAoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAotCQkJIGVudW0gYXRoOWtfdHhfcXVldWVfc3VidHlwZSBxdHlwZSk7Citib29sIGF0aDlrX2h0Y190eHFfc2V0dXAoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LCBpbnQgc3VidHlwZSk7CitpbnQgYXRoOWtfaHRjX2NhYnFfc2V0dXAoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2KTsKIGludCBnZXRfaHdfcW51bSh1MTYgcXVldWUsIGludCAqaHdxX21hcCk7CiBpbnQgYXRoX2h0Y190eHFfdXBkYXRlKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwgaW50IHFudW0sCiAJCSAgICAgICBzdHJ1Y3QgYXRoOWtfdHhfcXVldWVfaW5mbyAqcWluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfYmVhY29uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYwppbmRleCBjMTBjN2QwLi5iZDE1MDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYwpAQCAtMjIyLDYgKzIyMiwyOSBAQAogCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5iZWFjb25fbG9jayk7CiB9CiAKKy8qIEN1cnJlbnRseSwgb25seSBmb3IgSUJTUyAqLwordm9pZCBhdGg5a19odGNfYmVhY29ucV9jb25maWcoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2KQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gcHJpdi0+YWg7CisJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gcWksIHFpX2JlOworCWludCBxbnVtID0gcHJpdi0+aHdxX21hcFtXTUVfQUNfQkVdOworCisJbWVtc2V0KCZxaSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvKSk7CisJbWVtc2V0KCZxaV9iZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvKSk7CisKKwlhdGg5a19od19nZXRfdHhxX3Byb3BzKGFoLCBxbnVtLCAmcWlfYmUpOworCisJcWkudHFpX2FpZnMgPSBxaV9iZS50cWlfYWlmczsKKwlxaS50cWlfY3dtaW4gPSA0KnFpX2JlLnRxaV9jd21pbjsKKwlxaS50cWlfY3dtYXggPSBxaV9iZS50cWlfY3dtYXg7CisKKwlpZiAoIWF0aDlrX2h3X3NldF90eHFfcHJvcHMoYWgsIHByaXYtPmJlYWNvbnEsICZxaSkpIHsKKwkJYXRoX3ByaW50KGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfRkFUQUwsCisJCQkgICJVbmFibGUgdG8gdXBkYXRlIGJlYWNvbiBxdWV1ZSAldSFcbiIsIHFudW0pOworCX0gZWxzZSB7CisJCWF0aDlrX2h3X3Jlc2V0dHhxdWV1ZShhaCwgcHJpdi0+YmVhY29ucSk7CisJfQorfQogCiB2b2lkIGF0aDlrX2h0Y19iZWFjb25fY29uZmlnKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYwppbmRleCBkYzAxNTA3Li4xNDhiNDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfaW5pdC5jCkBAIC0zNCw2ICszNCwxMyBAQAogCS5tYXhfcG93ZXIgPSAyMCwgXAogfQogCisjZGVmaW5lIENIQU41RyhfZnJlcSwgX2lkeCkgeyBcCisJLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCBcCisJLmNlbnRlcl9mcmVxID0gKF9mcmVxKSwgXAorCS5od192YWx1ZSA9IChfaWR4KSwgXAorCS5tYXhfcG93ZXIgPSAyMCwgXAorfQorCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGF0aDlrXzJnaHpfY2hhbm5lbHNbXSA9IHsKIAlDSEFOMkcoMjQxMiwgMCksIC8qIENoYW5uZWwgMSAqLwogCUNIQU4yRygyNDE3LCAxKSwgLyogQ2hhbm5lbCAyICovCkBAIC01MSw2ICs1OCwzNyBAQAogCUNIQU4yRygyNDg0LCAxMyksIC8qIENoYW5uZWwgMTQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYXRoOWtfNWdoel9jaGFubmVsc1tdID0geworCS8qIF9XZV8gY2FsbCB0aGlzIFVOSUkgMSAqLworCUNIQU41Ryg1MTgwLCAxNCksIC8qIENoYW5uZWwgMzYgKi8KKwlDSEFONUcoNTIwMCwgMTUpLCAvKiBDaGFubmVsIDQwICovCisJQ0hBTjVHKDUyMjAsIDE2KSwgLyogQ2hhbm5lbCA0NCAqLworCUNIQU41Ryg1MjQwLCAxNyksIC8qIENoYW5uZWwgNDggKi8KKwkvKiBfV2VfIGNhbGwgdGhpcyBVTklJIDIgKi8KKwlDSEFONUcoNTI2MCwgMTgpLCAvKiBDaGFubmVsIDUyICovCisJQ0hBTjVHKDUyODAsIDE5KSwgLyogQ2hhbm5lbCA1NiAqLworCUNIQU41Ryg1MzAwLCAyMCksIC8qIENoYW5uZWwgNjAgKi8KKwlDSEFONUcoNTMyMCwgMjEpLCAvKiBDaGFubmVsIDY0ICovCisJLyogX1dlXyBjYWxsIHRoaXMgIk1pZGRsZSBiYW5kIiAqLworCUNIQU41Ryg1NTAwLCAyMiksIC8qIENoYW5uZWwgMTAwICovCisJQ0hBTjVHKDU1MjAsIDIzKSwgLyogQ2hhbm5lbCAxMDQgKi8KKwlDSEFONUcoNTU0MCwgMjQpLCAvKiBDaGFubmVsIDEwOCAqLworCUNIQU41Ryg1NTYwLCAyNSksIC8qIENoYW5uZWwgMTEyICovCisJQ0hBTjVHKDU1ODAsIDI2KSwgLyogQ2hhbm5lbCAxMTYgKi8KKwlDSEFONUcoNTYwMCwgMjcpLCAvKiBDaGFubmVsIDEyMCAqLworCUNIQU41Ryg1NjIwLCAyOCksIC8qIENoYW5uZWwgMTI0ICovCisJQ0hBTjVHKDU2NDAsIDI5KSwgLyogQ2hhbm5lbCAxMjggKi8KKwlDSEFONUcoNTY2MCwgMzApLCAvKiBDaGFubmVsIDEzMiAqLworCUNIQU41Ryg1NjgwLCAzMSksIC8qIENoYW5uZWwgMTM2ICovCisJQ0hBTjVHKDU3MDAsIDMyKSwgLyogQ2hhbm5lbCAxNDAgKi8KKwkvKiBfV2VfIGNhbGwgdGhpcyBVTklJIDMgKi8KKwlDSEFONUcoNTc0NSwgMzMpLCAvKiBDaGFubmVsIDE0OSAqLworCUNIQU41Ryg1NzY1LCAzNCksIC8qIENoYW5uZWwgMTUzICovCisJQ0hBTjVHKDU3ODUsIDM1KSwgLyogQ2hhbm5lbCAxNTcgKi8KKwlDSEFONUcoNTgwNSwgMzYpLCAvKiBDaGFubmVsIDE2MSAqLworCUNIQU41Ryg1ODI1LCAzNyksIC8qIENoYW5uZWwgMTY1ICovCit9OworCiAvKiBBdGhlcm9zIGhhcmR3YXJlIHJhdGUgY29kZSBhZGRpdGlvbiBmb3Igc2hvcnQgcHJlbWJsZSAqLwogI2RlZmluZSBTSFBDSEVDSyhfX2h3X3JhdGUsIF9fZmxhZ3MpIFwKIAkoKF9fZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSkgPyAoX19od19yYXRlIHwgMHgwNCkgOiAwKQpAQCAtMTQxLDcgKzE3OSw3IEBACiAJcmV0dXJuIGh0Y19jb25uZWN0X3NlcnZpY2UocHJpdi0+aHRjLCAmcmVxLCBlcF9pZCk7CiB9CiAKLXN0YXRpYyBpbnQgYXRoOWtfaW5pdF9odGNfc2VydmljZXMoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2KQorc3RhdGljIGludCBhdGg5a19pbml0X2h0Y19zZXJ2aWNlcyhzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYsIHUxNiBkZXZpZCkKIHsKIAlpbnQgcmV0OwogCkBAIC0xOTksMTAgKzIzNywyOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCisJLyoKKwkgKiBTZXR1cCByZXF1aXJlZCBjcmVkaXRzIGJlZm9yZSBpbml0aWFsaXppbmcgSFRDLgorCSAqIFRoaXMgaXMgYSBiaXQgaGFja3ksIGJ1dCwgc2luY2UgcXVldWluZyBpcyBkb25lIGluCisJICogdGhlIEhJRiBsYXllciwgc2hvdWxkbid0IG1hdHRlciBtdWNoLgorCSAqLworCisJc3dpdGNoKGRldmlkKSB7CisJY2FzZSAweDcwMTA6CisJY2FzZSAweDkwMTg6CisJCXByaXYtPmh0Yy0+Y3JlZGl0cyA9IDQ1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcml2LT5odGMtPmNyZWRpdHMgPSAzMzsKKwl9CisKIAlyZXQgPSBodGNfaW5pdChwcml2LT5odGMpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCisJZGV2X2luZm8ocHJpdi0+ZGV2LCAiYXRoOWtfaHRjOiBIVEMgaW5pdGlhbGl6ZWQgd2l0aCAlZCBjcmVkaXRzXG4iLAorCQkgcHJpdi0+aHRjLT5jcmVkaXRzKTsKKwogCXJldHVybiAwOwogCiBlcnI6CkBAIC0zOTgsMTcgKzQ1NCw0MyBAQAogc3RhdGljIHZvaWQgc2V0dXBfaHRfY2FwKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2luZm8pCiB7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihwcml2LT5haCk7CisJdTggdHhfc3RyZWFtcywgcnhfc3RyZWFtczsKKwlpbnQgaTsKKwogCWh0X2luZm8tPmh0X3N1cHBvcnRlZCA9IHRydWU7CiAJaHRfaW5mby0+Y2FwID0gSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfAogCQkgICAgICAgSUVFRTgwMjExX0hUX0NBUF9TTV9QUyB8CiAJCSAgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8CiAJCSAgICAgICBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MDsKIAorCWlmIChwcml2LT5haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX1NHSV8yMCkKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworCisJaHRfaW5mby0+Y2FwIHw9ICgxIDw8IElFRUU4MDIxMV9IVF9DQVBfUlhfU1RCQ19TSElGVCk7CisKIAlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsKIAlodF9pbmZvLT5hbXBkdV9kZW5zaXR5ID0gSUVFRTgwMjExX0hUX01QRFVfREVOU0lUWV84OwogCiAJbWVtc2V0KCZodF9pbmZvLT5tY3MsIDAsIHNpemVvZihodF9pbmZvLT5tY3MpKTsKLQlodF9pbmZvLT5tY3MucnhfbWFza1swXSA9IDB4ZmY7CisKKwkvKiBhdGg5a19odGMgc3VwcG9ydHMgb25seSAxIG9yIDIgc3RyZWFtIGRldmljZXMgKi8KKwl0eF9zdHJlYW1zID0gYXRoOWtfY21uX2NvdW50X3N0cmVhbXMoY29tbW9uLT50eF9jaGFpbm1hc2ssIDIpOworCXJ4X3N0cmVhbXMgPSBhdGg5a19jbW5fY291bnRfc3RyZWFtcyhjb21tb24tPnJ4X2NoYWlubWFzaywgMik7CisKKwlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKKwkJICAiVFggc3RyZWFtcyAlZCwgUlggc3RyZWFtczogJWRcbiIsCisJCSAgdHhfc3RyZWFtcywgcnhfc3RyZWFtcyk7CisKKwlpZiAodHhfc3RyZWFtcyAhPSByeF9zdHJlYW1zKSB7CisJCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgfD0gSUVFRTgwMjExX0hUX01DU19UWF9SWF9ESUZGOworCQlodF9pbmZvLT5tY3MudHhfcGFyYW1zIHw9ICgodHhfc3RyZWFtcyAtIDEpIDw8CisJCQkJCSAgIElFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfU0hJRlQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByeF9zdHJlYW1zOyBpKyspCisJCWh0X2luZm8tPm1jcy5yeF9tYXNrW2ldID0gMHhmZjsKKwogCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgfD0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVEOwogfQogCkBAIC00MjAsMjMgKzUwMiwzNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaXYtPmh3cV9tYXApOyBpKyspCiAJCXByaXYtPmh3cV9tYXBbaV0gPSAtMTsKIAotCWlmICghYXRoOWtfaHRjX3R4cV9zZXR1cChwcml2LCBBVEg5S19XTUVfQUNfQkUpKSB7CisJcHJpdi0+YmVhY29ucSA9IGF0aDlrX2h3X2JlYWNvbnFfc2V0dXAocHJpdi0+YWgpOworCWlmIChwcml2LT5iZWFjb25xID09IC0xKSB7CisJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRkFUQUwsCisJCQkgICJVbmFibGUgdG8gc2V0dXAgQkVBQ09OIHhtaXQgcXVldWVcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcml2LT5jYWJxID0gYXRoOWtfaHRjX2NhYnFfc2V0dXAocHJpdik7CisJaWYgKHByaXYtPmNhYnEgPT0gLTEpIHsKKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKKwkJCSAgIlVuYWJsZSB0byBzZXR1cCBDQUIgeG1pdCBxdWV1ZVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghYXRoOWtfaHRjX3R4cV9zZXR1cChwcml2LCBXTUVfQUNfQkUpKSB7CiAJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRkFUQUwsCiAJCQkgICJVbmFibGUgdG8gc2V0dXAgeG1pdCBxdWV1ZSBmb3IgQkUgdHJhZmZpY1xuIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCWlmICghYXRoOWtfaHRjX3R4cV9zZXR1cChwcml2LCBBVEg5S19XTUVfQUNfQkspKSB7CisJaWYgKCFhdGg5a19odGNfdHhxX3NldHVwKHByaXYsIFdNRV9BQ19CSykpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBzZXR1cCB4bWl0IHF1ZXVlIGZvciBCSyB0cmFmZmljXG4iKTsKIAkJZ290byBlcnI7CiAJfQotCWlmICghYXRoOWtfaHRjX3R4cV9zZXR1cChwcml2LCBBVEg5S19XTUVfQUNfVkkpKSB7CisJaWYgKCFhdGg5a19odGNfdHhxX3NldHVwKHByaXYsIFdNRV9BQ19WSSkpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBzZXR1cCB4bWl0IHF1ZXVlIGZvciBWSSB0cmFmZmljXG4iKTsKIAkJZ290byBlcnI7CiAJfQotCWlmICghYXRoOWtfaHRjX3R4cV9zZXR1cChwcml2LCBBVEg5S19XTUVfQUNfVk8pKSB7CisJaWYgKCFhdGg5a19odGNfdHhxX3NldHVwKHByaXYsIFdNRV9BQ19WTykpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBzZXR1cCB4bWl0IHF1ZXVlIGZvciBWTyB0cmFmZmljXG4iKTsKIAkJZ290byBlcnI7CkBAIC00NjgsMzYgKzU2NCw2IEBACiAJICovCiAJZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+a2V5bWF4OyBpKyspCiAJCWF0aDlrX2h3X2tleXJlc2V0KHByaXYtPmFoLCAodTE2KSBpKTsKLQotCWlmIChhdGg5a19od19nZXRjYXBhYmlsaXR5KHByaXYtPmFoLCBBVEg5S19DQVBfQ0lQSEVSLAotCQkJCSAgIEFUSDlLX0NJUEhFUl9US0lQLCBOVUxMKSkgewotCQkvKgotCQkgKiBXaGV0aGVyIHdlIHNob3VsZCBlbmFibGUgaC93IFRLSVAgTUlDLgotCQkgKiBYWFg6IGlmIHdlIGRvbid0IHN1cHBvcnQgV01FIFRLSVAgTUlDLCB0aGVuIHdlIHdvdWxkbid0Ci0JCSAqIHJlcG9ydCBXTU0gY2FwYWJsZSwgc28gaXQncyBhbHdheXMgc2FmZSB0byB0dXJuIG9uCi0JCSAqIFRLSVAgTUlDIGluIHRoaXMgY2FzZS4KLQkJICovCi0JCWF0aDlrX2h3X3NldGNhcGFiaWxpdHkocHJpdi0+YWgsIEFUSDlLX0NBUF9US0lQX01JQywgMCwgMSwgTlVMTCk7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBzZXBhcmF0ZSBrZXkgY2FjaGUgZW50cmllcwotCSAqIGFyZSByZXF1aXJlZCB0byBoYW5kbGUgYm90aCB0eCtyeCBNSUMga2V5cy4KLQkgKiBXaXRoIHNwbGl0IG1pYyBrZXlzIHRoZSBudW1iZXIgb2Ygc3RhdGlvbnMgaXMgbGltaXRlZAotCSAqIHRvIDI3IG90aGVyd2lzZSA1OS4KLQkgKi8KLQlpZiAoYXRoOWtfaHdfZ2V0Y2FwYWJpbGl0eShwcml2LT5haCwgQVRIOUtfQ0FQX0NJUEhFUiwKLQkJCQkgICBBVEg5S19DSVBIRVJfVEtJUCwgTlVMTCkKLQkgICAgJiYgYXRoOWtfaHdfZ2V0Y2FwYWJpbGl0eShwcml2LT5haCwgQVRIOUtfQ0FQX0NJUEhFUiwKLQkJCQkgICAgICBBVEg5S19DSVBIRVJfTUlDLCBOVUxMKQotCSAgICAmJiBhdGg5a19od19nZXRjYXBhYmlsaXR5KHByaXYtPmFoLCBBVEg5S19DQVBfVEtJUF9TUExJVCwKLQkJCQkgICAgICAwLCBOVUxMKSkKLQkJY29tbW9uLT5zcGxpdG1pYyA9IDE7Ci0KLQkvKiB0dXJuIG9uIG1jYXN0IGtleSBzZWFyY2ggaWYgcG9zc2libGUgKi8KLQlpZiAoIWF0aDlrX2h3X2dldGNhcGFiaWxpdHkocHJpdi0+YWgsIEFUSDlLX0NBUF9NQ0FTVF9LRVlTUkNILCAwLCBOVUxMKSkKLQkJKHZvaWQpYXRoOWtfaHdfc2V0Y2FwYWJpbGl0eShwcml2LT5haCwgQVRIOUtfQ0FQX01DQVNUX0tFWVNSQ0gsCi0JCQkJCSAgICAgMSwgMSwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2luaXRfY2hhbm5lbHNfcmF0ZXMoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2KQpAQCAtNTEyLDYgKzU3OCwxNyBAQAogCQlwcml2LT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9iaXRyYXRlcyA9CiAJCQlBUlJBWV9TSVpFKGF0aDlrX2xlZ2FjeV9yYXRlcyk7CiAJfQorCisJaWYgKHRlc3RfYml0KEFUSDlLX01PREVfMTFBLCBwcml2LT5haC0+Y2Fwcy53aXJlbGVzc19tb2RlcykpIHsKKwkJcHJpdi0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLmNoYW5uZWxzID0gYXRoOWtfNWdoel9jaGFubmVsczsKKwkJcHJpdi0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOworCQlwcml2LT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyA9CisJCQlBUlJBWV9TSVpFKGF0aDlrXzVnaHpfY2hhbm5lbHMpOworCQlwcml2LT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0uYml0cmF0ZXMgPQorCQkJYXRoOWtfbGVnYWN5X3JhdGVzICsgNDsKKwkJcHJpdi0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fYml0cmF0ZXMgPQorCQkJQVJSQVlfU0laRShhdGg5a19sZWdhY3lfcmF0ZXMpIC0gNDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2luaXRfbWlzYyhzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYpCkBAIC01MjQsNyArNjAxLDYgQEAKIAlpZiAocHJpdi0+YWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9CU1NJRE1BU0spCiAJCW1lbWNweShjb21tb24tPmJzc2lkbWFzaywgYXRoX2JjYXN0X21hYywgRVRIX0FMRU4pOwogCi0JcHJpdi0+b3BfZmxhZ3MgfD0gT1BfVFhBR0dSOwogCXByaXYtPmFoLT5vcG1vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwogfQogCkBAIC01NTYsMTQgKzYzMiwxMiBAQAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5iZWFjb25fbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xvY2spOwogCW11dGV4X2luaXQoJnByaXYtPm11dGV4KTsKLQltdXRleF9pbml0KCZwcml2LT5hZ2dyX3dvcmsubXV0ZXgpOwogCW11dGV4X2luaXQoJnByaXYtPmh0Y19wbV9sb2NrKTsKIAl0YXNrbGV0X2luaXQoJnByaXYtPndtaV90YXNrbGV0LCBhdGg5a193bWlfdGFza2xldCwKIAkJICAgICAodW5zaWduZWQgbG9uZylwcml2KTsKIAl0YXNrbGV0X2luaXQoJnByaXYtPnJ4X3Rhc2tsZXQsIGF0aDlrX3J4X3Rhc2tsZXQsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpcHJpdik7CiAJdGFza2xldF9pbml0KCZwcml2LT50eF90YXNrbGV0LCBhdGg5a190eF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwcml2KTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+YXRoOWtfYWdncl93b3JrLCBhdGg5a19odGNfYWdncl93b3JrKTsKIAlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+YXRoOWtfYW5pX3dvcmssIGF0aDlrX2FuaV93b3JrKTsKIAlJTklUX1dPUksoJnByaXYtPnBzX3dvcmssIGF0aDlrX3BzX3dvcmspOwogCkBAIC02NDMsMTEgKzcxNywxNyBAQAogCWlmICh0ZXN0X2JpdChBVEg5S19NT0RFXzExRywgcHJpdi0+YWgtPmNhcHMud2lyZWxlc3NfbW9kZXMpKQogCQlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KIAkJCSZwcml2LT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJaWYgKHRlc3RfYml0KEFUSDlLX01PREVfMTFBLCBwcml2LT5haC0+Y2Fwcy53aXJlbGVzc19tb2RlcykpCisJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQorCQkJJnByaXYtPnNiYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKIAogCWlmIChwcml2LT5haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0hUKSB7CiAJCWlmICh0ZXN0X2JpdChBVEg5S19NT0RFXzExRywgcHJpdi0+YWgtPmNhcHMud2lyZWxlc3NfbW9kZXMpKQogCQkJc2V0dXBfaHRfY2FwKHByaXYsCiAJCQkJICAgICAmcHJpdi0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmh0X2NhcCk7CisJCWlmICh0ZXN0X2JpdChBVEg5S19NT0RFXzExQSwgcHJpdi0+YWgtPmNhcHMud2lyZWxlc3NfbW9kZXMpKQorCQkJc2V0dXBfaHRfY2FwKHByaXYsCisJCQkJICAgICAmcHJpdi0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLmh0X2NhcCk7CiAJfQogCiAJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIGNvbW1vbi0+bWFjYWRkcik7CkBAIC03NDcsNyArODI3LDcgQEAKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlyZXQgPSBhdGg5a19pbml0X2h0Y19zZXJ2aWNlcyhwcml2KTsKKwlyZXQgPSBhdGg5a19pbml0X2h0Y19zZXJ2aWNlcyhwcml2LCBkZXZpZCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfaW5pdDsKIApAQCAtNzkwLDcgKzg3MCw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGF0aDlrX2luaXRfaHRjX3NlcnZpY2VzKGh0Y19oYW5kbGUtPmRydl9wcml2KTsKKwlyZXQgPSBhdGg5a19pbml0X2h0Y19zZXJ2aWNlcyhodGNfaGFuZGxlLT5kcnZfcHJpdiwKKwkJCSAgICAgIGh0Y19oYW5kbGUtPmRydl9wcml2LT5haC0+aHdfdmVyc2lvbi5kZXZpZCk7CiAJcmV0dXJuIHJldDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jCmluZGV4IDlkMzcxYzEuLmNmOWJjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMKQEAgLTI3LDEzICsyNywxMSBAQAogc3RhdGljIHZvaWQgYXRoX3VwZGF0ZV90eHBvdyhzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBwcml2LT5haDsKLQl1MzIgdHhwb3c7CiAKIAlpZiAocHJpdi0+Y3VydHhwb3cgIT0gcHJpdi0+dHhwb3dsaW1pdCkgewogCQlhdGg5a19od19zZXRfdHhwb3dlcmxpbWl0KGFoLCBwcml2LT50eHBvd2xpbWl0KTsKIAkJLyogcmVhZCBiYWNrIGluIGNhc2UgdmFsdWUgaXMgY2xhbXBlZCAqLwotCQlhdGg5a19od19nZXRjYXBhYmlsaXR5KGFoLCBBVEg5S19DQVBfVFhQT1csIDEsICZ0eHBvdyk7Ci0JCXByaXYtPmN1cnR4cG93ID0gdHhwb3c7CisJCXByaXYtPmN1cnR4cG93ID0gYXRoOWtfaHdfcmVndWxhdG9yeShhaCktPnBvd2VyX2xpbWl0OwogCX0KIH0KIApAQCAtMzI1LDE0MiArMzIzLDEyOSBAQAogCXRjYXAuZmxhZ3NfZXh0ID0gMHg4MDYwMTAwMDsKIAl0Y2FwLmFtcGR1X2xpbWl0ID0gMHhmZmZmMDAwMDsKIAl0Y2FwLmFtcGR1X3N1YmZyYW1lcyA9IDIwOwotCXRjYXAudHhfY2hhaW5tYXNrX2xlZ2FjeSA9IDE7CisJdGNhcC50eF9jaGFpbm1hc2tfbGVnYWN5ID0gcHJpdi0+YWgtPmNhcHMudHhfY2hhaW5tYXNrOwogCXRjYXAucHJvdG1vZGUgPSAxOwotCXRjYXAudHhfY2hhaW5tYXNrID0gMTsKKwl0Y2FwLnR4X2NoYWlubWFzayA9IHByaXYtPmFoLT5jYXBzLnR4X2NoYWlubWFzazsKIAogCVdNSV9DTURfQlVGKFdNSV9UQVJHRVRfSUNfVVBEQVRFX0NNRElELCAmdGNhcCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0aDlrX2h0Y19pbml0X3JhdGUoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQorc3RhdGljIHZvaWQgYXRoOWtfaHRjX3NldHVwX3JhdGUoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSBzdHJ1Y3QgYXRoOWtfaHRjX3RhcmdldF9yYXRlICp0cmF0ZSkKIHsKLQlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHByaXYtPmFoKTsKIAlzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqaXN0YSA9IChzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqKSBzdGEtPmRydl9wcml2OwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUgdHJhdGU7CiAJdTMyIGNhcHMgPSAwOwotCXU4IGNtZF9yc3A7Ci0JaW50IGksIGosIHJldDsKKwlpbnQgaSwgajsKIAotCW1lbXNldCgmdHJhdGUsIDAsIHNpemVvZih0cmF0ZSkpOwotCi0JLyogT25seSAyR0h6IGlzIHN1cHBvcnRlZCAqLwotCXNiYW5kID0gcHJpdi0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKKwlzYmFuZCA9IHByaXYtPmh3LT53aXBoeS0+YmFuZHNbcHJpdi0+aHctPmNvbmYuY2hhbm5lbC0+YmFuZF07CiAKIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspIHsKIAkJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0gJiBCSVQoaSkpIHsKLQkJCXByaXYtPnRndF9yYXRlLnJhdGVzLmxlZ2FjeV9yYXRlcy5yc19yYXRlc1tqXQorCQkJdHJhdGUtPnJhdGVzLmxlZ2FjeV9yYXRlcy5yc19yYXRlc1tqXQogCQkJCT0gKHNiYW5kLT5iaXRyYXRlc1tpXS5iaXRyYXRlICogMikgLyAxMDsKIAkJCWorKzsKIAkJfQogCX0KLQlwcml2LT50Z3RfcmF0ZS5yYXRlcy5sZWdhY3lfcmF0ZXMucnNfbnJhdGVzID0gajsKKwl0cmF0ZS0+cmF0ZXMubGVnYWN5X3JhdGVzLnJzX25yYXRlcyA9IGo7CiAKIAlpZiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7CiAJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgNzc7IGkrKykgewogCQkJaWYgKHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrW2kvOF0gJiAoMTw8KGklOCkpKQotCQkJCXByaXYtPnRndF9yYXRlLnJhdGVzLmh0X3JhdGVzLnJzX3JhdGVzW2orK10gPSBpOworCQkJCXRyYXRlLT5yYXRlcy5odF9yYXRlcy5yc19yYXRlc1tqKytdID0gaTsKIAkJCWlmIChqID09IEFUSF9IVENfUkFURV9NQVgpCiAJCQkJYnJlYWs7CiAJCX0KLQkJcHJpdi0+dGd0X3JhdGUucmF0ZXMuaHRfcmF0ZXMucnNfbnJhdGVzID0gajsKKwkJdHJhdGUtPnJhdGVzLmh0X3JhdGVzLnJzX25yYXRlcyA9IGo7CiAKIAkJY2FwcyA9IFdMQU5fUkNfSFRfRkxBRzsKKwkJaWYgKHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdKQorCQkJY2FwcyB8PSBXTEFOX1JDX0RTX0ZMQUc7CiAJCWlmIChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkKIAkJCWNhcHMgfD0gV0xBTl9SQ180MF9GTEFHOwotCQlpZiAoc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApCisJCWlmIChjb25mX2lzX2h0NDAoJnByaXYtPmh3LT5jb25mKSAmJgorCQkgICAgKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSkKIAkJCWNhcHMgfD0gV0xBTl9SQ19TR0lfRkxBRzsKLQorCQllbHNlIGlmIChjb25mX2lzX2h0MjAoJnByaXYtPmh3LT5jb25mKSAmJgorCQkJIChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCisJCQljYXBzIHw9IFdMQU5fUkNfU0dJX0ZMQUc7CiAJfQogCi0JcHJpdi0+dGd0X3JhdGUuc3RhX2luZGV4ID0gaXN0YS0+aW5kZXg7Ci0JcHJpdi0+dGd0X3JhdGUuaXNuZXcgPSAxOwotCXRyYXRlID0gcHJpdi0+dGd0X3JhdGU7Ci0JcHJpdi0+dGd0X3JhdGUuY2FwZmxhZ3MgPSBjcHVfdG9fYmUzMihjYXBzKTsKLQl0cmF0ZS5jYXBmbGFncyA9IGNwdV90b19iZTMyKGNhcHMpOworCXRyYXRlLT5zdGFfaW5kZXggPSBpc3RhLT5pbmRleDsKKwl0cmF0ZS0+aXNuZXcgPSAxOworCXRyYXRlLT5jYXBmbGFncyA9IGNwdV90b19iZTMyKGNhcHMpOworfQogCi0JV01JX0NNRF9CVUYoV01JX1JDX1JBVEVfVVBEQVRFX0NNRElELCAmdHJhdGUpOworc3RhdGljIGludCBhdGg5a19odGNfc2VuZF9yYXRlX2NtZChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUgKnRyYXRlKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24ocHJpdi0+YWgpOworCWludCByZXQ7CisJdTggY21kX3JzcDsKKworCVdNSV9DTURfQlVGKFdNSV9SQ19SQVRFX1VQREFURV9DTURJRCwgdHJhdGUpOwogCWlmIChyZXQpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBpbml0aWFsaXplIFJhdGUgaW5mb3JtYXRpb24gb24gdGFyZ2V0XG4iKTsKLQkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJICAiVXBkYXRlZCB0YXJnZXQgU1RBOiAlcE0gKGNhcHM6IDB4JXgpXG4iLCBzdGEtPmFkZHIsIGNhcHMpOwotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIGNoZWNrX3JjX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCAqY3c0MCkKK3N0YXRpYyB2b2lkIGF0aDlrX2h0Y19pbml0X3JhdGUoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7Ci0Jc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCi0JaWYgKCFjb25mX2lzX2h0KGNvbmYpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIShwcml2LT5vcF9mbGFncyAmIE9QX0FTU09DSUFURUQpIHx8Ci0JICAgIChwcml2LT5vcF9mbGFncyAmIE9QX1NDQU5OSU5HKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGNvbmZfaXNfaHQ0MChjb25mKSkgewotCQlpZiAocHJpdi0+YWgtPmN1cmNoYW4tPmNoYW5tb2RlICYKLQkJCShDSEFOTkVMX0hUNDBQTFVTIHwgQ0hBTk5FTF9IVDQwTUlOVVMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkqY3c0MCA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7ICAvKiBodDIwICovCi0JCWlmIChwcml2LT5haC0+Y3VyY2hhbi0+Y2hhbm1vZGUgJiBDSEFOTkVMX0hUMjApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXRoOWtfaHRjX3JjX3VwZGF0ZShzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYsIGJvb2wgaXNfY3c0MCkKLXsKLQlzdHJ1Y3QgYXRoOWtfaHRjX3RhcmdldF9yYXRlIHRyYXRlOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24ocHJpdi0+YWgpOworCXN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUgdHJhdGU7CiAJaW50IHJldDsKLQl1MzIgY2FwcyA9IGJlMzJfdG9fY3B1KHByaXYtPnRndF9yYXRlLmNhcGZsYWdzKTsKLQl1OCBjbWRfcnNwOwogCi0JbWVtc2V0KCZ0cmF0ZSwgMCwgc2l6ZW9mKHRyYXRlKSk7CisJbWVtc2V0KCZ0cmF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3JhdGUpKTsKKwlhdGg5a19odGNfc2V0dXBfcmF0ZShwcml2LCBzdGEsICZ0cmF0ZSk7CisJcmV0ID0gYXRoOWtfaHRjX3NlbmRfcmF0ZV9jbWQocHJpdiwgJnRyYXRlKTsKKwlpZiAoIXJldCkKKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCQkgICJVcGRhdGVkIHRhcmdldCBzdGE6ICVwTSwgcmF0ZSBjYXBzOiAweCVYXG4iLAorCQkJICBzdGEtPmFkZHIsIGJlMzJfdG9fY3B1KHRyYXRlLmNhcGZsYWdzKSk7Cit9CiAKLQl0cmF0ZSA9IHByaXYtPnRndF9yYXRlOworc3RhdGljIHZvaWQgYXRoOWtfaHRjX3VwZGF0ZV9yYXRlKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZikKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHByaXYtPmFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHRjX3RhcmdldF9yYXRlIHRyYXRlOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJaW50IHJldDsKIAotCWlmIChpc19jdzQwKQotCQljYXBzIHw9IFdMQU5fUkNfNDBfRkxBRzsKLQllbHNlCi0JCWNhcHMgJj0gfldMQU5fUkNfNDBfRkxBRzsKKwltZW1zZXQoJnRyYXRlLCAwLCBzaXplb2Yoc3RydWN0IGF0aDlrX2h0Y190YXJnZXRfcmF0ZSkpOwogCi0JcHJpdi0+dGd0X3JhdGUuY2FwZmxhZ3MgPSBjcHVfdG9fYmUzMihjYXBzKTsKLQl0cmF0ZS5jYXBmbGFncyA9IGNwdV90b19iZTMyKGNhcHMpOwotCi0JV01JX0NNRF9CVUYoV01JX1JDX1JBVEVfVVBEQVRFX0NNRElELCAmdHJhdGUpOwotCWlmIChyZXQpIHsKLQkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKLQkJCSAgIlVuYWJsZSB0byB1cGRhdGUgUmF0ZSBpbmZvcm1hdGlvbiBvbiB0YXJnZXRcbiIpOworCXJjdV9yZWFkX2xvY2soKTsKKwlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCBic3NfY29uZi0+YnNzaWQpOworCWlmICghc3RhKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm47CiAJfQorCWF0aDlrX2h0Y19zZXR1cF9yYXRlKHByaXYsIHN0YSwgJnRyYXRlKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAotCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiUmF0ZSBjb250cm9sIHVwZGF0ZWQgd2l0aCAiCi0JCSAgImNhcHM6MHgleCBvbiB0YXJnZXRcbiIsIHByaXYtPnRndF9yYXRlLmNhcGZsYWdzKTsKKwlyZXQgPSBhdGg5a19odGNfc2VuZF9yYXRlX2NtZChwcml2LCAmdHJhdGUpOworCWlmICghcmV0KQorCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKKwkJCSAgIlVwZGF0ZWQgdGFyZ2V0IHN0YTogJXBNLCByYXRlIGNhcHM6IDB4JVhcbiIsCisJCQkgIGJzc19jb25mLT5ic3NpZCwgYmUzMl90b19jcHUodHJhdGUuY2FwZmxhZ3MpKTsKIH0KIAotc3RhdGljIGludCBhdGg5a19odGNfYWdncl9vcGVyKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICAgIHU4ICpzdGFfYWRkciwgdTggdGlkLCBib29sIG9wZXIpCitzdGF0aWMgaW50IGF0aDlrX2h0Y190eF9hZ2dyX29wZXIoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCisJCQkJICB1MTYgdGlkKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24ocHJpdi0+YWgpOwogCXN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X2FnZ3IgYWdncjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gTlVMTDsKIAlzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqaXN0YTsKIAlpbnQgcmV0ID0gMDsKIAl1OCBjbWRfcnNwOwpAQCAtNDY5LDc0ICs0NTQsMzAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1zZXQoJmFnZ3IsIDAsIHNpemVvZihzdHJ1Y3QgYXRoOWtfaHRjX3RhcmdldF9hZ2dyKSk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkvKiBDaGVjayBpZiB3ZSBhcmUgYWJsZSB0byByZXRyaWV2ZSB0aGUgc3RhdGlvbiAqLwotCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIHN0YV9hZGRyKTsKLQlpZiAoIXN0YSkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaXN0YSA9IChzdHJ1Y3QgYXRoOWtfaHRjX3N0YSAqKSBzdGEtPmRydl9wcml2OwogCi0JaWYgKG9wZXIpCi0JCWlzdGEtPnRpZF9zdGF0ZVt0aWRdID0gQUdHUl9TVEFSVDsKLQllbHNlCi0JCWlzdGEtPnRpZF9zdGF0ZVt0aWRdID0gQUdHUl9TVE9QOwotCiAJYWdnci5zdGFfaW5kZXggPSBpc3RhLT5pbmRleDsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JYWdnci50aWRubyA9IHRpZDsKLQlhZ2dyLmFnZ3JfZW5hYmxlID0gb3BlcjsKKwlhZ2dyLnRpZG5vID0gdGlkICYgMHhmOworCWFnZ3IuYWdncl9lbmFibGUgPSAoYWN0aW9uID09IElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVCkgPyB0cnVlIDogZmFsc2U7CiAKIAlXTUlfQ01EX0JVRihXTUlfVFhfQUdHUl9FTkFCTEVfQ01ESUQsICZhZ2dyKTsKIAlpZiAocmV0KQogCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKIAkJCSAgIlVuYWJsZSB0byAlcyBUWCBhZ2dyZWdhdGlvbiBmb3IgKCVwTSwgJWQpXG4iLAotCQkJICAob3BlcikgPyAic3RhcnQiIDogInN0b3AiLCBzdGEtPmFkZHIsIHRpZCk7CisJCQkgIChhZ2dyLmFnZ3JfZW5hYmxlKSA/ICJzdGFydCIgOiAic3RvcCIsIHN0YS0+YWRkciwgdGlkKTsKIAllbHNlCiAJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJICAiJXMgYWdncmVnYXRpb24gZm9yICglcE0sICVkKVxuIiwKLQkJCSAgKG9wZXIpID8gIlN0YXJ0aW5nIiA6ICJTdG9wcGluZyIsIHN0YS0+YWRkciwgdGlkKTsKKwkJCSAgIiVzIFRYIGFnZ3JlZ2F0aW9uIGZvciAoJXBNLCAlZClcbiIsCisJCQkgIChhZ2dyLmFnZ3JfZW5hYmxlKSA/ICJTdGFydGluZyIgOiAiU3RvcHBpbmciLAorCQkJICBzdGEtPmFkZHIsIHRpZCk7CisKKwlzcGluX2xvY2tfYmgoJnByaXYtPnR4X2xvY2spOworCWlzdGEtPnRpZF9zdGF0ZVt0aWRdID0gKGFnZ3IuYWdncl9lbmFibGUgJiYgIXJldCkgPyBBR0dSX1NUQVJUIDogQUdHUl9TVE9QOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT50eF9sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYXRoOWtfaHRjX2FnZ3Jfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGg5a19odGNfcHJpdiwKLQkJCSAgICAgYXRoOWtfYWdncl93b3JrLndvcmspOwotCXN0cnVjdCBhdGg5a19odGNfYWdncl93b3JrICp3ayA9ICZwcml2LT5hZ2dyX3dvcms7Ci0KLQltdXRleF9sb2NrKCZ3ay0+bXV0ZXgpOwotCi0Jc3dpdGNoICh3ay0+YWN0aW9uKSB7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6Ci0JCXJldCA9IGF0aDlrX2h0Y19hZ2dyX29wZXIocHJpdiwgd2stPnZpZiwgd2stPnN0YV9hZGRyLAotCQkJCQkgIHdrLT50aWQsIHRydWUpOwotCQlpZiAoIXJldCkKLQkJCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYih3ay0+dmlmLCB3ay0+c3RhX2FkZHIsCi0JCQkJCQkgd2stPnRpZCk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6Ci0JCWF0aDlrX2h0Y19hZ2dyX29wZXIocHJpdiwgd2stPnZpZiwgd2stPnN0YV9hZGRyLAotCQkJCSAgICB3ay0+dGlkLCBmYWxzZSk7Ci0JCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiKHdrLT52aWYsIHdrLT5zdGFfYWRkciwgd2stPnRpZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWF0aF9wcmludChhdGg5a19od19jb21tb24ocHJpdi0+YWgpLCBBVEhfREJHX0ZBVEFMLAotCQkJICAiVW5rbm93biBBTVBEVSBhY3Rpb25cbiIpOwotCX0KLQotCW11dGV4X3VubG9jaygmd2stPm11dGV4KTsKLX0KLQogLyoqKioqKioqKi8KIC8qIERFQlVHICovCiAvKioqKioqKioqLwpAQCAtNTUyLDggKzQ5Myw3IEBACiBzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfdGd0X3N0YXRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0KLQkJKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBhdGg5a19odGNfdGFyZ2V0X3N0YXRzIGNtZF9yc3A7CiAJY2hhciBidWZbNTEyXTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMDsKQEAgLTU4NCw2ICs1MjQsOSBAQAogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIiUxOXMgOiAlMTB1XG4iLCAiVFggUmF0ZSIsIHByaXYtPmRlYnVnLnR4cmF0ZSk7CiAKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOworCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwogfQogCkBAIC01OTYsOCArNTM5LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV94bWl0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPQotCQkoc3RydWN0IGF0aDlrX2h0Y19wcml2ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciBidWZbNTEyXTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMDsKIApAQCAtNjE3LDYgKzU1OSwyMiBAQAogCQkJIiUyMHMgOiAlMTB1XG4iLCAiU0tCcyBkcm9wcGVkIiwKIAkJCXByaXYtPmRlYnVnLnR4X3N0YXRzLnNrYl9kcm9wcGVkKTsKIAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJIiUyMHMgOiAlMTB1XG4iLCAiQkUgcXVldWVkIiwKKwkJCXByaXYtPmRlYnVnLnR4X3N0YXRzLnF1ZXVlX3N0YXRzW1dNRV9BQ19CRV0pOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJIiUyMHMgOiAlMTB1XG4iLCAiQksgcXVldWVkIiwKKwkJCXByaXYtPmRlYnVnLnR4X3N0YXRzLnF1ZXVlX3N0YXRzW1dNRV9BQ19CS10pOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJIiUyMHMgOiAlMTB1XG4iLCAiVkkgcXVldWVkIiwKKwkJCXByaXYtPmRlYnVnLnR4X3N0YXRzLnF1ZXVlX3N0YXRzW1dNRV9BQ19WSV0pOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJIiUyMHMgOiAlMTB1XG4iLCAiVk8gcXVldWVkIiwKKwkJCXByaXYtPmRlYnVnLnR4X3N0YXRzLnF1ZXVlX3N0YXRzW1dNRV9BQ19WT10pOworCisJaWYgKGxlbiA+IHNpemVvZihidWYpKQorCQlsZW4gPSBzaXplb2YoYnVmKTsKKwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KIApAQCAtNjI5LDggKzU4Nyw3IEBACiBzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfcmVjdihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0KLQkJKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzUxMl07CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CiAKQEAgLTY0NCw2ICs2MDEsOSBAQAogCQkJIiUyMHMgOiAlMTB1XG4iLCAiU0tCcyBEcm9wcGVkIiwKIAkJCXByaXYtPmRlYnVnLnJ4X3N0YXRzLnNrYl9kcm9wcGVkKTsKIAorCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKKwkJbGVuID0gc2l6ZW9mKGJ1Zik7CisKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CiB9CiAKQEAgLTk3OCw2ICs5MzgsOCBAQAogCQlwcml2LT5haC0+bGVkX3BpbiA9IEFUSF9MRURfUElOXzkyODc7CiAJZWxzZSBpZiAoQVJfU1JFVl85MjcxKHByaXYtPmFoKSkKIAkJcHJpdi0+YWgtPmxlZF9waW4gPSBBVEhfTEVEX1BJTl85MjcxOworCWVsc2UgaWYgKEFSX0RFVklEXzcwMTAocHJpdi0+YWgpKQorCQlwcml2LT5haC0+bGVkX3BpbiA9IEFUSF9MRURfUElOXzcwMTA7CiAJZWxzZQogCQlwcml2LT5haC0+bGVkX3BpbiA9IEFUSF9MRURfUElOX0RFRjsKIApAQCAtMTA1NCw2ICsxMDE2LDk1IEBACiAJCXdpcGh5X3Jma2lsbF9zdGFydF9wb2xsaW5nKHByaXYtPmh3LT53aXBoeSk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX2h0Y19yYWRpb19lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGF0aF9odyAqYWggPSBwcml2LT5haDsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlpbnQgcmV0OworCXU4IGNtZF9yc3A7CisKKwlpZiAoIWFoLT5jdXJjaGFuKQorCQlhaC0+Y3VyY2hhbiA9IGF0aDlrX2Ntbl9nZXRfY3VyY2hhbm5lbChodywgYWgpOworCisJLyogUmVzZXQgdGhlIEhXICovCisJcmV0ID0gYXRoOWtfaHdfcmVzZXQoYWgsIGFoLT5jdXJjaGFuLCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0ZBVEFMLAorCQkJICAiVW5hYmxlIHRvIHJlc2V0IGhhcmR3YXJlOyByZXNldCBzdGF0dXMgJWQgIgorCQkJICAiKGZyZXEgJXUgTUh6KVxuIiwgcmV0LCBhaC0+Y3VyY2hhbi0+Y2hhbm5lbCk7CisJfQorCisJYXRoX3VwZGF0ZV90eHBvdyhwcml2KTsKKworCS8qIFN0YXJ0IFJYICovCisJV01JX0NNRChXTUlfU1RBUlRfUkVDVl9DTURJRCk7CisJYXRoOWtfaG9zdF9yeF9pbml0KHByaXYpOworCisJLyogU3RhcnQgVFggKi8KKwlodGNfc3RhcnQocHJpdi0+aHRjKTsKKwlzcGluX2xvY2tfYmgoJnByaXYtPnR4X2xvY2spOworCXByaXYtPnR4X3F1ZXVlc19zdG9wID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnR4X2xvY2spOworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CisKKwlXTUlfQ01EKFdNSV9FTkFCTEVfSU5UUl9DTURJRCk7CisKKwkvKiBFbmFibGUgTEVEICovCisJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgYWgtPmxlZF9waW4sCisJCQkgICAgQVJfR1BJT19PVVRQVVRfTVVYX0FTX09VVFBVVCk7CisJYXRoOWtfaHdfc2V0X2dwaW8oYWgsIGFoLT5sZWRfcGluLCAwKTsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfaHRjX3JhZGlvX2Rpc2FibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGF0aF9odyAqYWggPSBwcml2LT5haDsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlpbnQgcmV0OworCXU4IGNtZF9yc3A7CisKKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOworCisJLyogRGlzYWJsZSBMRUQgKi8KKwlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sIDEpOworCWF0aDlrX2h3X2NmZ19ncGlvX2lucHV0KGFoLCBhaC0+bGVkX3Bpbik7CisKKwlXTUlfQ01EKFdNSV9ESVNBQkxFX0lOVFJfQ01ESUQpOworCisJLyogU3RvcCBUWCAqLworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhodyk7CisJaHRjX3N0b3AocHJpdi0+aHRjKTsKKwlXTUlfQ01EKFdNSV9EUkFJTl9UWFFfQUxMX0NNRElEKTsKKwlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnR4X3F1ZXVlKTsKKworCS8qIFN0b3AgUlggKi8KKwlXTUlfQ01EKFdNSV9TVE9QX1JFQ1ZfQ01ESUQpOworCisJLyoKKwkgKiBUaGUgTUlCIGNvdW50ZXJzIGhhdmUgdG8gYmUgZGlzYWJsZWQgaGVyZSwKKwkgKiBzaW5jZSB0aGUgdGFyZ2V0IGRvZXNuJ3QgZG8gaXQuCisJICovCisJYXRoOWtfaHdfZGlzYWJsZV9taWJfY291bnRlcnMoYWgpOworCisJaWYgKCFhaC0+Y3VyY2hhbikKKwkJYWgtPmN1cmNoYW4gPSBhdGg5a19jbW5fZ2V0X2N1cmNoYW5uZWwoaHcsIGFoKTsKKworCS8qIFJlc2V0IHRoZSBIVyAqLworCXJldCA9IGF0aDlrX2h3X3Jlc2V0KGFoLCBhaC0+Y3VyY2hhbiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKKwkJCSAgIlVuYWJsZSB0byByZXNldCBoYXJkd2FyZTsgcmVzZXQgc3RhdHVzICVkICIKKwkJCSAgIihmcmVxICV1IE1IeilcbiIsIHJldCwgYWgtPmN1cmNoYW4tPmNoYW5uZWwpOworCX0KKworCS8qIERpc2FibGUgdGhlIFBIWSAqLworCWF0aDlrX2h3X3BoeV9kaXNhYmxlKGFoKTsKKworCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOworCWF0aDlrX2h0Y19zZXRwb3dlcihwcml2LCBBVEg5S19QTV9GVUxMX1NMRUVQKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKiovCiAvKiBtYWM4MDIxMSBDYWxsYmFja3MgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA5OSw3ICsxMTUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg5a19odGNfcmFkaW9fZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGxlZCkKK3N0YXRpYyBpbnQgYXRoOWtfaHRjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGhfaHcgKmFoID0gcHJpdi0+YWg7CkBAIC0xMTExLDEwICsxMTYyLDE2IEBACiAJX19iZTE2IGh0Y19tb2RlOwogCXU4IGNtZF9yc3A7CiAKKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisKIAlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKIAkJICAiU3RhcnRpbmcgZHJpdmVyIHdpdGggaW5pdGlhbCBjaGFubmVsOiAlZCBNSHpcbiIsCiAJCSAgY3VyY2hhbi0+Y2VudGVyX2ZyZXEpOwogCisJLyogRW5zdXJlIHRoYXQgSFcgaXMgYXdha2UgYmVmb3JlIGZsdXNoaW5nIFJYICovCisJYXRoOWtfaHRjX3NldHBvd2VyKHByaXYsIEFUSDlLX1BNX0FXQUtFKTsKKwlXTUlfQ01EKFdNSV9GTFVTSF9SRUNWX0NNRElEKTsKKwogCS8qIHNldHVwIGluaXRpYWwgY2hhbm5lbCAqLwogCWluaXRfY2hhbm5lbCA9IGF0aDlrX2Ntbl9nZXRfY3VyY2hhbm5lbChodywgYWgpOwogCkBAIC0xMTI3LDYgKzExODQsNyBAQAogCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0ZBVEFMLAogCQkJICAiVW5hYmxlIHRvIHJlc2V0IGhhcmR3YXJlOyByZXNldCBzdGF0dXMgJWQgIgogCQkJICAiKGZyZXEgJXUgTUh6KVxuIiwgcmV0LCBjdXJjaGFuLT5jZW50ZXJfZnJlcSk7CisJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTE0NywzMSArMTIwNSwxNCBAQAogCXByaXYtPnR4X3F1ZXVlc19zdG9wID0gZmFsc2U7CiAJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnR4X2xvY2spOwogCi0JaWYgKGxlZCkgewotCQkvKiBFbmFibGUgTEVEICovCi0JCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGFoLT5sZWRfcGluLAotCQkJCSAgICBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKLQkJYXRoOWtfaHdfc2V0X2dwaW8oYWgsIGFoLT5sZWRfcGluLCAwKTsKLQl9Ci0KIAlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoaHcpOwogCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdGg5a19odGNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JcmV0ID0gYXRoOWtfaHRjX3JhZGlvX2VuYWJsZShodywgZmFsc2UpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfaHRjX3JhZGlvX2Rpc2FibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgbGVkKQorc3RhdGljIHZvaWQgYXRoOWtfaHRjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9odyAqYWggPSBwcml2LT5haDsKQEAgLTExNzksMjEgKzEyMjAsMTcgQEAKIAlpbnQgcmV0ID0gMDsKIAl1OCBjbWRfcnNwOwogCisJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCiAJaWYgKHByaXYtPm9wX2ZsYWdzICYgT1BfSU5WQUxJRCkgewogCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0FOWSwgIkRldmljZSBub3QgcHJlc2VudFxuIik7CisJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGxlZCkgewotCQkvKiBEaXNhYmxlIExFRCAqLwotCQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sIDEpOwotCQlhdGg5a19od19jZmdfZ3Bpb19pbnB1dChhaCwgYWgtPmxlZF9waW4pOwotCX0KLQogCS8qIENhbmNlbCBhbGwgdGhlIHJ1bm5pbmcgdGltZXJzL3dvcmsgLi4gKi8KIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5wc193b3JrKTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmF0aDlrX2FuaV93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmF0aDlrX2FnZ3Jfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5hdGg5a19sZWRfYmxpbmtfd29yayk7CiAJYXRoOWtfbGVkX3N0b3BfYnJpZ2h0bmVzcyhwcml2KTsKIApAQCAtMTIwMiwxMiArMTIzOSw2IEBACiAJV01JX0NNRChXTUlfRElTQUJMRV9JTlRSX0NNRElEKTsKIAlXTUlfQ01EKFdNSV9EUkFJTl9UWFFfQUxMX0NNRElEKTsKIAlXTUlfQ01EKFdNSV9TVE9QX1JFQ1ZfQ01ESUQpOwotCWF0aDlrX2h3X3BoeV9kaXNhYmxlKGFoKTsKLQlhdGg5a19od19kaXNhYmxlKGFoKTsKLQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoYWgsIDEsIDEpOwotCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOwotCWF0aDlrX2h0Y19zZXRwb3dlcihwcml2LCBBVEg5S19QTV9GVUxMX1NMRUVQKTsKLQogCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+dHhfcXVldWUpOwogCiAJLyogUmVtb3ZlIG1vbml0b3IgaW50ZXJmYWNlIGhlcmUgKi8KQEAgLTEyMjAsMjEgKzEyNTEsMTggQEAKIAkJCQkgICJNb25pdG9yIGludGVyZmFjZSByZW1vdmVkXG4iKTsKIAl9CiAKKwlhdGg5a19od19waHlfZGlzYWJsZShhaCk7CisJYXRoOWtfaHdfZGlzYWJsZShhaCk7CisJYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAxLCAxKTsKKwlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKKwlhdGg5a19odGNfc2V0cG93ZXIocHJpdiwgQVRIOUtfUE1fRlVMTF9TTEVFUCk7CisKIAlwcml2LT5vcF9mbGFncyB8PSBPUF9JTlZBTElEOwogCiAJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJEcml2ZXIgaGFsdFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aDlrX2h0Y19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWF0aDlrX2h0Y19yYWRpb19kaXNhYmxlKGh3LCBmYWxzZSk7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKLQogc3RhdGljIGludCBhdGg5a19odGNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtMTMwMiw2ICsxMzMwLDcgQEAKIG91dDoKIAlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzMTgsNiArMTM0Nyw3IEBACiAJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJEZXRhY2ggSW50ZXJmYWNlXG4iKTsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCiAJbWVtc2V0KCZodmlmLCAwLCBzaXplb2Yoc3RydWN0IGF0aDlrX2h0Y190YXJnZXRfdmlmKSk7CiAJbWVtY3B5KCZodmlmLm15YWRkciwgdmlmLT5hZGRyLCBFVEhfQUxFTik7CkBAIC0xMzI4LDYgKzEzNTgsNyBAQAogCWF0aDlrX2h0Y19yZW1vdmVfc3RhdGlvbihwcml2LCB2aWYsIE5VTEwpOwogCXByaXYtPnZpZiA9IE5VTEw7CiAKKwlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIApAQCAtMTM0MywzMCArMTM3NCwyNyBAQAogCQlib29sIGVuYWJsZV9yYWRpbyA9IGZhbHNlOwogCQlib29sIGlkbGUgPSAhIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpOwogCisJCW11dGV4X2xvY2soJnByaXYtPmh0Y19wbV9sb2NrKTsKIAkJaWYgKCFpZGxlICYmIHByaXYtPnBzX2lkbGUpCiAJCQllbmFibGVfcmFkaW8gPSB0cnVlOwotCiAJCXByaXYtPnBzX2lkbGUgPSBpZGxlOworCQltdXRleF91bmxvY2soJnByaXYtPmh0Y19wbV9sb2NrKTsKIAogCQlpZiAoZW5hYmxlX3JhZGlvKSB7Ci0JCQlhdGg5a19odGNfc2V0cG93ZXIocHJpdiwgQVRIOUtfUE1fQVdBS0UpOwotCQkJYXRoOWtfaHRjX3JhZGlvX2VuYWJsZShodywgdHJ1ZSk7CiAJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKIAkJCQkgICJub3QtaWRsZTogZW5hYmxpbmcgcmFkaW9cbiIpOworCQkJYXRoOWtfaHRjX3NldHBvd2VyKHByaXYsIEFUSDlLX1BNX0FXQUtFKTsKKwkJCWF0aDlrX2h0Y19yYWRpb19lbmFibGUoaHcpOwogCQl9CiAJfQogCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmN1cmNoYW4gPSBody0+Y29uZi5jaGFubmVsOwogCQlpbnQgcG9zID0gY3VyY2hhbi0+aHdfdmFsdWU7Ci0JCWJvb2wgaXNfY3c0MCA9IGZhbHNlOwogCiAJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiU2V0IGNoYW5uZWw6ICVkIE1IelxuIiwKIAkJCSAgY3VyY2hhbi0+Y2VudGVyX2ZyZXEpOwogCi0JCWlmIChjaGVja19yY191cGRhdGUoaHcsICZpc19jdzQwKSkKLQkJCWF0aDlrX2h0Y19yY191cGRhdGUocHJpdiwgaXNfY3c0MCk7Ci0KIAkJYXRoOWtfY21uX3VwZGF0ZV9pY2hhbm5lbChodywgJnByaXYtPmFoLT5jaGFubmVsc1twb3NdKTsKIAogCQlpZiAoYXRoOWtfaHRjX3NldF9jaGFubmVsKHByaXYsIGh3LCAmcHJpdi0+YWgtPmNoYW5uZWxzW3Bvc10pIDwgMCkgewpAQCAtMTM5OSwxNCArMTQyNywyMSBAQAogCQl9CiAJfQogCi0JaWYgKHByaXYtPnBzX2lkbGUpIHsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFKSB7CisJCW11dGV4X2xvY2soJnByaXYtPmh0Y19wbV9sb2NrKTsKKwkJaWYgKCFwcml2LT5wc19pZGxlKSB7CisJCQltdXRleF91bmxvY2soJnByaXYtPmh0Y19wbV9sb2NrKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW11dGV4X3VubG9jaygmcHJpdi0+aHRjX3BtX2xvY2spOworCiAJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ09ORklHLAogCQkJICAiaWRsZTogZGlzYWJsaW5nIHJhZGlvXG4iKTsKLQkJYXRoOWtfaHRjX3JhZGlvX2Rpc2FibGUoaHcsIHRydWUpOworCQlhdGg5a19odGNfcmFkaW9fZGlzYWJsZShodyk7CiAJfQogCitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQyOCw4ICsxNDYzLDggQEAKIAl1MzIgcmZpbHQ7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KIAlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOworCiAJY2hhbmdlZF9mbGFncyAmPSBTVVBQT1JURURfRklMVEVSUzsKIAkqdG90YWxfZmxhZ3MgJj0gU1VQUE9SVEVEX0ZJTFRFUlM7CiAKQEAgLTE0NDQsMzAgKzE0NzksMzggQEAKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIAotc3RhdGljIHZvaWQgYXRoOWtfaHRjX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJIGVudW0gc3RhX25vdGlmeV9jbWQgY21kLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQorc3RhdGljIGludCBhdGg5a19odGNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNUQV9OT1RJRllfQUREOgotCQlyZXQgPSBhdGg5a19odGNfYWRkX3N0YXRpb24ocHJpdiwgdmlmLCBzdGEpOwotCQlpZiAoIXJldCkKLQkJCWF0aDlrX2h0Y19pbml0X3JhdGUocHJpdiwgdmlmLCBzdGEpOwotCQlicmVhazsKLQljYXNlIFNUQV9OT1RJRllfUkVNT1ZFOgotCQlhdGg5a19odGNfcmVtb3ZlX3N0YXRpb24ocHJpdiwgdmlmLCBzdGEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOworCXJldCA9IGF0aDlrX2h0Y19hZGRfc3RhdGlvbihwcml2LCB2aWYsIHN0YSk7CisJaWYgKCFyZXQpCisJCWF0aDlrX2h0Y19pbml0X3JhdGUocHJpdiwgc3RhKTsKKwlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoOWtfaHRjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKKwlyZXQgPSBhdGg5a19odGNfcmVtb3ZlX3N0YXRpb24ocHJpdiwgdmlmLCBzdGEpOworCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdGg5a19odGNfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IHF1ZXVlLApAQCAtMTQ4Miw2ICsxNTI1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKIAogCW1lbXNldCgmcWksIDAsIHNpemVvZihzdHJ1Y3QgYXRoOWtfdHhfcXVldWVfaW5mbykpOwogCkBAIC0xNDk5LDkgKzE1NDMsMTYgQEAKIAkJICBwYXJhbXMtPmN3X21heCwgcGFyYW1zLT50eG9wKTsKIAogCXJldCA9IGF0aF9odGNfdHhxX3VwZGF0ZShwcml2LCBxbnVtLCAmcWkpOwotCWlmIChyZXQpCisJaWYgKHJldCkgewogCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX0ZBVEFMLCAiVFhRIFVwZGF0ZSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CiAKKwlpZiAoKHByaXYtPmFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCisJICAgIChxbnVtID09IHByaXYtPmh3cV9tYXBbV01FX0FDX0JFXSkpCisJCSAgICBhdGg5a19odGNfYmVhY29ucV9jb25maWcocHJpdik7CitvdXQ6CisJYXRoOWtfaHRjX3BzX3Jlc3RvcmUocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTU3NCw3ICsxNjI1LDYgQEAKIAkJCWF0aF9zdGFydF9hbmkocHJpdik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT5vcF9mbGFncyAmPSB+T1BfQVNTT0NJQVRFRDsKLQkJCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnBzX3dvcmspOwogCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5hdGg5a19hbmlfd29yayk7CiAJCX0KIAl9CkBAIC0xNjMxLDYgKzE2ODEsOSBAQAogCQlhdGg5a19od19pbml0X2dsb2JhbF9zZXR0aW5ncyhhaCk7CiAJfQogCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9IVCkKKwkJYXRoOWtfaHRjX3VwZGF0ZV9yYXRlKHByaXYsIHZpZiwgYnNzX2NvbmYpOworCiAJYXRoOWtfaHRjX3BzX3Jlc3RvcmUocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CkBAIC0xNjQxLDcgKzE2OTQsOSBAQAogCXU2NCB0c2Y7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKIAl0c2YgPSBhdGg5a19od19nZXR0c2Y2NChwcml2LT5haCk7CisJYXRoOWtfaHRjX3BzX3Jlc3RvcmUocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAKIAlyZXR1cm4gdHNmOwpAQCAtMTY1Miw3ICsxNzA3LDkgQEAKIAlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCWF0aDlrX2h3X3NldHRzZjY0KHByaXYtPmFoLCB0c2YpOworCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC0xNjYwLDExICsxNzE3LDExIEBACiB7CiAJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7CiAKLQlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCWF0aDlrX2h3X3Jlc2V0X3RzZihwcml2LT5haCk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAJYXRoOWtfaHRjX3BzX3Jlc3RvcmUocHJpdik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoOWtfaHRjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTE2NzQsOCArMTczMSw4IEBACiAJCQkJICB1MTYgdGlkLCB1MTYgKnNzbikKIHsKIAlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgYXRoOWtfaHRjX2FnZ3Jfd29yayAqd29yayA9ICZwcml2LT5hZ2dyX3dvcms7CiAJc3RydWN0IGF0aDlrX2h0Y19zdGEgKmlzdGE7CisJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgpAQCAtMTY4MywyNiArMTc0MCwyNiBAQAogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgorCQlyZXQgPSBhdGg5a19odGNfdHhfYWdncl9vcGVyKHByaXYsIHZpZiwgc3RhLCBhY3Rpb24sIHRpZCk7CisJCWlmICghcmV0KQorCQkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CisJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6Ci0JCWlmICghKHByaXYtPm9wX2ZsYWdzICYgT1BfVFhBR0dSKSkKLQkJCXJldHVybiAtRU5PVFNVUFA7Ci0JCW1lbWNweSh3b3JrLT5zdGFfYWRkciwgc3RhLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXdvcmstPmh3ID0gaHc7Ci0JCXdvcmstPnZpZiA9IHZpZjsKLQkJd29yay0+YWN0aW9uID0gYWN0aW9uOwotCQl3b3JrLT50aWQgPSB0aWQ7Ci0JCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoaHcsICZwcml2LT5hdGg5a19hZ2dyX3dvcmssIDApOworCQlhdGg5a19odGNfdHhfYWdncl9vcGVyKHByaXYsIHZpZiwgc3RhLCBhY3Rpb24sIHRpZCk7CisJCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgogCQlpc3RhID0gKHN0cnVjdCBhdGg5a19odGNfc3RhICopIHN0YS0+ZHJ2X3ByaXY7CisJCXNwaW5fbG9ja19iaCgmcHJpdi0+dHhfbG9jayk7CiAJCWlzdGEtPnRpZF9zdGF0ZVt0aWRdID0gQUdHUl9PUEVSQVRJT05BTDsKKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnR4X2xvY2spOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlhdGhfcHJpbnQoYXRoOWtfaHdfY29tbW9uKHByaXYtPmFoKSwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVua25vd24gQU1QRFUgYWN0aW9uXG4iKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhdGg5a19odGNfc3dfc2Nhbl9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKQEAgLTE3MjIsOCArMTc3OSw4IEBACiB7CiAJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gaHctPnByaXY7CiAKLQlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCXNwaW5fbG9ja19iaCgmcHJpdi0+YmVhY29uX2xvY2spOwogCXByaXYtPm9wX2ZsYWdzICY9IH5PUF9TQ0FOTklORzsKIAlzcGluX3VubG9ja19iaCgmcHJpdi0+YmVhY29uX2xvY2spOwpAQCAtMTczMSw4ICsxNzg4LDggQEAKIAlpZiAocHJpdi0+b3BfZmxhZ3MgJiBPUF9BU1NPQ0lBVEVEKQogCQlhdGg5a19odGNfYmVhY29uX2NvbmZpZyhwcml2LCBwcml2LT52aWYpOwogCWF0aF9zdGFydF9hbmkocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAJYXRoOWtfaHRjX3BzX3Jlc3RvcmUocHJpdik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoOWtfaHRjX3NldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgdmFsdWUpCkBAIC0xNzQ2LDggKzE4MDMsMTAgQEAKIAlzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlhdGg5a19odGNfcHNfd2FrZXVwKHByaXYpOwogCXByaXYtPmFoLT5jb3ZlcmFnZV9jbGFzcyA9IGNvdmVyYWdlX2NsYXNzOwogCWF0aDlrX2h3X2luaXRfZ2xvYmFsX3NldHRpbmdzKHByaXYtPmFoKTsKKwlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIApAQCAtMTc1OSw3ICsxODE4LDggQEAKIAkucmVtb3ZlX2ludGVyZmFjZSAgID0gYXRoOWtfaHRjX3JlbW92ZV9pbnRlcmZhY2UsCiAJLmNvbmZpZyAgICAgICAgICAgICA9IGF0aDlrX2h0Y19jb25maWcsCiAJLmNvbmZpZ3VyZV9maWx0ZXIgICA9IGF0aDlrX2h0Y19jb25maWd1cmVfZmlsdGVyLAotCS5zdGFfbm90aWZ5ICAgICAgICAgPSBhdGg5a19odGNfc3RhX25vdGlmeSwKKwkuc3RhX2FkZCAgICAgICAgICAgID0gYXRoOWtfaHRjX3N0YV9hZGQsCisJLnN0YV9yZW1vdmUgICAgICAgICA9IGF0aDlrX2h0Y19zdGFfcmVtb3ZlLAogCS5jb25mX3R4ICAgICAgICAgICAgPSBhdGg5a19odGNfY29uZl90eCwKIAkuYnNzX2luZm9fY2hhbmdlZCAgID0gYXRoOWtfaHRjX2Jzc19pbmZvX2NoYW5nZWQsCiAJLnNldF9rZXkgICAgICAgICAgICA9IGF0aDlrX2h0Y19zZXRfa2V5LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfdHhyeC5jCmluZGV4IDI1NzFiNDQuLmJkMGI0YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl90eHJ4LmMKQEAgLTIwLDE5ICsyMCwyOSBAQAogLyogVFggKi8KIC8qKioqKiovCiAKKyNkZWZpbmUgQVRIOUtfSFRDX0lOSVRfVFhRKHN1YnR5cGUpIGRvIHsJCQlcCisJCXFpLnRxaV9zdWJ0eXBlID0gc3VidHlwZTsJCQlcCisJCXFpLnRxaV9haWZzID0gQVRIOUtfVFhRX1VTRURFRkFVTFQ7CQlcCisJCXFpLnRxaV9jd21pbiA9IEFUSDlLX1RYUV9VU0VERUZBVUxUOwkJXAorCQlxaS50cWlfY3dtYXggPSBBVEg5S19UWFFfVVNFREVGQVVMVDsJCVwKKwkJcWkudHFpX3BoeXNDb21wQnVmID0gMDsJCQkJXAorCQlxaS50cWlfcWZsYWdzID0gVFhRX0ZMQUdfVFhFT0xJTlRfRU5BQkxFIHwJXAorCQkJVFhRX0ZMQUdfVFhERVNDSU5UX0VOQUJMRTsJCVwKKwl9IHdoaWxlICgwKQorCiBpbnQgZ2V0X2h3X3FudW0odTE2IHF1ZXVlLCBpbnQgKmh3cV9tYXApCiB7CiAJc3dpdGNoIChxdWV1ZSkgewogCWNhc2UgMDoKLQkJcmV0dXJuIGh3cV9tYXBbQVRIOUtfV01FX0FDX1ZPXTsKKwkJcmV0dXJuIGh3cV9tYXBbV01FX0FDX1ZPXTsKIAljYXNlIDE6Ci0JCXJldHVybiBod3FfbWFwW0FUSDlLX1dNRV9BQ19WSV07CisJCXJldHVybiBod3FfbWFwW1dNRV9BQ19WSV07CiAJY2FzZSAyOgotCQlyZXR1cm4gaHdxX21hcFtBVEg5S19XTUVfQUNfQkVdOworCQlyZXR1cm4gaHdxX21hcFtXTUVfQUNfQkVdOwogCWNhc2UgMzoKLQkJcmV0dXJuIGh3cV9tYXBbQVRIOUtfV01FX0FDX0JLXTsKKwkJcmV0dXJuIGh3cV9tYXBbV01FX0FDX0JLXTsKIAlkZWZhdWx0OgotCQlyZXR1cm4gaHdxX21hcFtBVEg5S19XTUVfQUNfQkVdOworCQlyZXR1cm4gaHdxX21hcFtXTUVfQUNfQkVdOwogCX0KIH0KIApAQCAtNzEsNyArODEsNyBAQAogCXN0cnVjdCBhdGg5a19odGNfdmlmICphdnA7CiAJc3RydWN0IGF0aDlrX2h0Y190eF9jdGwgdHhfY3RsOwogCWVudW0gaHRjX2VuZHBvaW50X2lkIGVwaWQ7Ci0JdTE2IHFudW0sIGh3X3FudW07CisJdTE2IHFudW07CiAJX19sZTE2IGZjOwogCXU4ICp0eF9maGRyOwogCXU4IHN0YV9pZHg7CkBAIC0xMzEsMjAgKzE0MSwyMyBAQAogCQltZW1jcHkodHhfZmhkciwgKHU4ICopICZ0eF9oZHIsIHNpemVvZih0eF9oZHIpKTsKIAogCQlxbnVtID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7Ci0JCWh3X3FudW0gPSBnZXRfaHdfcW51bShxbnVtLCBwcml2LT5od3FfbWFwKTsKIAotCQlzd2l0Y2ggKGh3X3FudW0pIHsKKwkJc3dpdGNoIChxbnVtKSB7CiAJCWNhc2UgMDoKLQkJCWVwaWQgPSBwcml2LT5kYXRhX2JlX2VwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWVwaWQgPSBwcml2LT5kYXRhX3ZpX2VwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKKwkJCVRYX1FTVEFUX0lOQyhXTUVfQUNfVk8pOwogCQkJZXBpZCA9IHByaXYtPmRhdGFfdm9fZXA7CiAJCQlicmVhazsKIAkJY2FzZSAxOgorCQkJVFhfUVNUQVRfSU5DKFdNRV9BQ19WSSk7CisJCQllcGlkID0gcHJpdi0+ZGF0YV92aV9lcDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlUWF9RU1RBVF9JTkMoV01FX0FDX0JFKTsKKwkJCWVwaWQgPSBwcml2LT5kYXRhX2JlX2VwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKIAkJZGVmYXVsdDoKKwkJCVRYX1FTVEFUX0lOQyhXTUVfQUNfQkspOwogCQkJZXBpZCA9IHByaXYtPmRhdGFfYmtfZXA7CiAJCQlicmVhazsKIAkJfQpAQCAtMTc0LDYgKzE4NywxOSBAQAogCXJldHVybiBodGNfc2VuZChwcml2LT5odGMsIHNrYiwgZXBpZCwgJnR4X2N0bCk7CiB9CiAKK3N0YXRpYyBib29sIGF0aDlrX2h0Y19jaGVja190eF9hZ2dyKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiwKKwkJCQkgICAgc3RydWN0IGF0aDlrX2h0Y19zdGEgKmlzdGEsIHU4IHRpZCkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2JoKCZwcml2LT50eF9sb2NrKTsKKwlpZiAoKHRpZCA8IEFUSDlLX0hUQ19NQVhfVElEKSAmJiAoaXN0YS0+dGlkX3N0YXRlW3RpZF0gPT0gQUdHUl9TVE9QKSkKKwkJcmV0ID0gdHJ1ZTsKKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dHhfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCiB2b2lkIGF0aDlrX3R4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKilkYXRhOwpAQCAtMjAzLDggKzIyOSw3IEBACiAJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3RhcnQgYWdncmVnYXRpb24gKi8KIAogCQlpZiAoc3RhICYmIGNvbmZfaXNfaHQoJnByaXYtPmh3LT5jb25mKSAmJgotCQkgICAgKHByaXYtPm9wX2ZsYWdzICYgT1BfVFhBR0dSKQotCQkgICAgJiYgIShza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpKSB7CisJCSAgICAhKHNrYi0+cHJvdG9jb2wgPT0gY3B1X3RvX2JlMTYoRVRIX1BfUEFFKSkpIHsKIAkJCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CiAJCQkJdTggKnFjLCB0aWQ7CiAJCQkJc3RydWN0IGF0aDlrX2h0Y19zdGEgKmlzdGE7CkBAIC0yMTMsMTAgKzIzOCwxMSBAQAogCQkJCXRpZCA9IHFjWzBdICYgMHhmOwogCQkJCWlzdGEgPSAoc3RydWN0IGF0aDlrX2h0Y19zdGEgKilzdGEtPmRydl9wcml2OwogCi0JCQkJaWYgKCh0aWQgPCBBVEg5S19IVENfTUFYX1RJRCkgJiYKLQkJCQkgICAgaXN0YS0+dGlkX3N0YXRlW3RpZF0gPT0gQUdHUl9TVE9QKSB7CisJCQkJaWYgKGF0aDlrX2h0Y19jaGVja190eF9hZ2dyKHByaXYsIGlzdGEsIHRpZCkpIHsKIAkJCQkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQpOworCQkJCQlzcGluX2xvY2tfYmgoJnByaXYtPnR4X2xvY2spOwogCQkJCQlpc3RhLT50aWRfc3RhdGVbdGlkXSA9IEFHR1JfUFJPR1JFU1M7CisJCQkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT50eF9sb2NrKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTI4NCw4ICszMTAsNyBAQAogCiB9CiAKLWJvb2wgYXRoOWtfaHRjX3R4cV9zZXR1cChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYsCi0JCQkgZW51bSBhdGg5a190eF9xdWV1ZV9zdWJ0eXBlIHN1YnR5cGUpCitib29sIGF0aDlrX2h0Y190eHFfc2V0dXAoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LCBpbnQgc3VidHlwZSkKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHByaXYtPmFoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwpAQCAtMjkzLDEzICszMTgsNyBAQAogCWludCBxbnVtOwogCiAJbWVtc2V0KCZxaSwgMCwgc2l6ZW9mKHFpKSk7Ci0KLQlxaS50cWlfc3VidHlwZSA9IHN1YnR5cGU7Ci0JcWkudHFpX2FpZnMgPSBBVEg5S19UWFFfVVNFREVGQVVMVDsKLQlxaS50cWlfY3dtaW4gPSBBVEg5S19UWFFfVVNFREVGQVVMVDsKLQlxaS50cWlfY3dtYXggPSBBVEg5S19UWFFfVVNFREVGQVVMVDsKLQlxaS50cWlfcGh5c0NvbXBCdWYgPSAwOwotCXFpLnRxaV9xZmxhZ3MgPSBUWFFfRkxBR19UWEVPTElOVF9FTkFCTEUgfCBUWFFfRkxBR19UWERFU0NJTlRfRU5BQkxFOworCUFUSDlLX0hUQ19JTklUX1RYUShzdWJ0eXBlKTsKIAogCXFudW0gPSBhdGg5a19od19zZXR1cHR4cXVldWUocHJpdi0+YWgsIEFUSDlLX1RYX1FVRVVFX0RBVEEsICZxaSk7CiAJaWYgKHFudW0gPT0gLTEpCkBAIC0zMTcsNiArMzM2LDE2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK2ludCBhdGg5a19odGNfY2FicV9zZXR1cChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gcWk7CisKKwltZW1zZXQoJnFpLCAwLCBzaXplb2YocWkpKTsKKwlBVEg5S19IVENfSU5JVF9UWFEoMCk7CisKKwlyZXR1cm4gYXRoOWtfaHdfc2V0dXB0eHF1ZXVlKHByaXYtPmFoLCBBVEg5S19UWF9RVUVVRV9DQUIsICZxaSk7Cit9CisKIC8qKioqKiovCiAvKiBSWCAqLwogLyoqKioqKi8KQEAgLTM4Nyw5ICs0MTYsNiBAQAogCS8qIGNvbmZpZ3VyZSBvcGVyYXRpb25hbCBtb2RlICovCiAJYXRoOWtfaHdfc2V0b3Btb2RlKGFoKTsKIAotCS8qIEhhbmRsZSBhbnkgbGluay1sZXZlbCBhZGRyZXNzIGNoYW5nZS4gKi8KLQlhdGg5a19od19zZXRtYWMoYWgsIGNvbW1vbi0+bWFjYWRkcik7Ci0KIAkvKiBjYWxjdWxhdGUgYW5kIGluc3RhbGwgbXVsdGljYXN0IGZpbHRlciAqLwogCW1maWx0WzBdID0gbWZpbHRbMV0gPSB+MDsKIAlhdGg5a19od19zZXRtY2FzdGZpbHRlcihhaCwgbWZpbHRbMF0sIG1maWx0WzFdKTsKQEAgLTM5OSw3ICs0MjUsNyBAQAogewogCWF0aDlrX2h3X3J4ZW5hKHByaXYtPmFoKTsKIAlhdGg5a19odGNfb3Btb2RlX2luaXQocHJpdik7Ci0JYXRoOWtfaHdfc3RhcnRwY3VyZWNlaXZlKHByaXYtPmFoKTsKKwlhdGg5a19od19zdGFydHBjdXJlY2VpdmUocHJpdi0+YWgsIChwcml2LT5vcF9mbGFncyAmIE9QX1NDQU5OSU5HKSk7CiAJcHJpdi0+cngubGFzdF9yc3NpID0gQVRIX1JTU0lfRFVNTVlfTUFSS0VSOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2hzdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19oc3QuYwppbmRleCAwNjQzOTdmLi43MDVjMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2hzdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfaHN0LmMKQEAgLTg5LDcgKzg5LDYgQEAKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludDsKIAlzdHJ1Y3QgaHRjX3JlYWR5X21zZyAqaHRjX3JlYWR5X21zZyA9IChzdHJ1Y3QgaHRjX3JlYWR5X21zZyAqKSBidWY7CiAKLQl0YXJnZXQtPmNyZWRpdHMgPSBiZTE2X3RvX2NwdShodGNfcmVhZHlfbXNnLT5jcmVkaXRzKTsKIAl0YXJnZXQtPmNyZWRpdF9zaXplID0gYmUxNl90b19jcHUoaHRjX3JlYWR5X21zZy0+Y3JlZGl0X3NpemUpOwogCiAJZW5kcG9pbnQgPSAmdGFyZ2V0LT5lbmRwb2ludFtFTkRQT0lOVDBdOwpAQCAtMTU5LDcgKzE1OCw3IEBACiAKIAljcF9tc2ctPm1lc3NhZ2VfaWQgPSBjcHVfdG9fYmUxNihIVENfTVNHX0NPTkZJR19QSVBFX0lEKTsKIAljcF9tc2ctPnBpcGVfaWQgPSBVU0JfV0xBTl9UWF9QSVBFOwotCWNwX21zZy0+Y3JlZGl0cyA9IDI4OworCWNwX21zZy0+Y3JlZGl0cyA9IHRhcmdldC0+Y3JlZGl0czsKIAogCXRhcmdldC0+aHRjX2ZsYWdzIHw9IEhUQ19PUF9DT05GSUdfUElQRV9DUkVESVRTOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmgKaW5kZXggNjI0NDIyYS4uZmZlY2JhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LW9wcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaApAQCAtMTI4LDYgKzEyOCwxNyBAQAogCWF0aDlrX2h3X29wcyhhaCktPnNldDExbl92aXJ0dWFsbW9yZWZyYWcoYWgsIGRzLCB2bWYpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoOWtfaHdfcHJvY21pYmV2ZW50KHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWF0aDlrX2h3X29wcyhhaCktPmFuaV9wcm9jX21pYl9ldmVudChhaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19od19hbmlfbW9uaXRvcihzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCit7CisJYXRoOWtfaHdfb3BzKGFoKS0+YW5pX21vbml0b3IoYWgsIGNoYW4pOworfQorCiAvKiBQcml2YXRlIGhhcmR3YXJlIGNhbGwgb3BzICovCiAKIC8qIFBIWSBvcHMgKi8KQEAgLTI1MywxMiArMjY0LDYgQEAKIAlhdGg5a19od19wcml2YXRlX29wcyhhaCktPmRvX2dldG5mKGFoLCBuZmFycmF5KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X2xvYWRuZihzdHJ1Y3QgYXRoX2h3ICphaCwKLQkJCQkgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKLXsKLQlhdGg5a19od19wcml2YXRlX29wcyhhaCktPmxvYWRuZihhaCwgY2hhbik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBhdGg5a19od19pbml0X2NhbChzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQogewpAQCAtMjc3LDQgKzI4Miw5IEBACiAJcmV0dXJuIGF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKS0+aXNjYWxfc3VwcG9ydGVkKGFoLCBjYWxUeXBlKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2FuaV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBpc19zY2FubmluZykKK3sKKwlhdGg5a19od19wcml2YXRlX29wcyhhaCktPmFuaV9yZXNldChhaCwgaXNfc2Nhbm5pbmcpOworfQorCiAjZW5kaWYgLyogQVRIOUtfSFdfT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKaW5kZXggYzMzZjE3ZC4uOGQyOTFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKQEAgLTIzLDExICsyMyw2IEBACiAjaW5jbHVkZSAicmMuaCIKICNpbmNsdWRlICJhcjkwMDNfbWFjLmgiCiAKLSNkZWZpbmUgQVRIOUtfQ0xPQ0tfUkFURV9DQ0sJCTIyCi0jZGVmaW5lIEFUSDlLX0NMT0NLX1JBVEVfNUdIWl9PRkRNCTQwCi0jZGVmaW5lIEFUSDlLX0NMT0NLX1JBVEVfMkdIWl9PRkRNCTQ0Ci0jZGVmaW5lIEFUSDlLX0NMT0NLX0ZBU1RfUkFURV81R0haX09GRE0gNDQKLQogc3RhdGljIGJvb2wgYXRoOWtfaHdfc2V0X3Jlc2V0X3JlZyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHR5cGUpOwogCiBNT0RVTEVfQVVUSE9SKCJBdGhlcm9zIENvbW11bmljYXRpb25zIik7CkBAIC04MCw2ICs3NSwxNSBAQAogCWF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKS0+aW5pdF9tb2RlX2dhaW5fcmVncyhhaCk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2FuaV9jYWNoZV9pbmlfcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwkvKiBZb3Ugd2lsbCBub3QgaGF2ZSB0aGlzIGNhbGxiYWNrIGlmIHVzaW5nIHRoZSBvbGQgQU5JICovCisJaWYgKCFhdGg5a19od19wcml2YXRlX29wcyhhaCktPmFuaV9jYWNoZV9pbmlfcmVncykKKwkJcmV0dXJuOworCisJYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpLT5hbmlfY2FjaGVfaW5pX3JlZ3MoYWgpOworfQorCiAvKioqKioqKioqKioqKioqKioqKiovCiAvKiBIZWxwZXIgRnVuY3Rpb25zICovCiAvKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNzEsMTMgKzM3NSw3IEBACiAJYWgtPmNvbmZpZy5vZmRtX3RyaWdfaGlnaCA9IDUwMDsKIAlhaC0+Y29uZmlnLmNja190cmlnX2hpZ2ggPSAyMDA7CiAJYWgtPmNvbmZpZy5jY2tfdHJpZ19sb3cgPSAxMDA7Ci0KLQkvKgotCSAqIEZvciBub3cgQU5JIGlzIGRpc2FibGVkIGZvciBBUjkwMDMsIGl0IGlzIHN0aWxsCi0JICogYmVpbmcgdGVzdGVkLgotCSAqLwotCWlmICghQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKLQkJYWgtPmNvbmZpZy5lbmFibGVfYW5pID0gMTsKKwlhaC0+Y29uZmlnLmVuYWJsZV9hbmkgPSB0cnVlOwogCiAJZm9yIChpID0gMDsgaSA8IEFSX0VFUFJPTV9NT0RBTF9TUFVSUzsgaSsrKSB7CiAJCWFoLT5jb25maWcuc3B1cmNoYW5zW2ldWzBdID0gQVJfTk9fU1BVUjsKQEAgLTM5MCwxMiArMzg4LDcgQEAKIAkJYWgtPmNvbmZpZy5odF9lbmFibGUgPSAwOwogCiAJYWgtPmNvbmZpZy5yeF9pbnRyX21pdGlnYXRpb24gPSB0cnVlOwotCi0JLyoKLQkgKiBUeCBJUSBDYWxpYnJhdGlvbiAoYWgtPmNvbmZpZy50eF9pcV9jYWxpYnJhdGlvbikgaXMgb25seQotCSAqIHVzZWQgYnkgQVI5MDAzLCBidXQgaXQgaXMgc2hvd2luZyByZWxpYWJpbGl0eSBpc3N1ZXMuCi0JICogSXQgd2lsbCB0YWtlIGEgd2hpbGUgdG8gZml4IHNvIHRoaXMgaXMgY3VycmVudGx5IGRpc2FibGVkLgotCSAqLworCWFoLT5jb25maWcucGNpZVNlckRlc1dyaXRlID0gdHJ1ZTsKIAogCS8qCiAJICogV2UgbmVlZCB0aGlzIGZvciBQQ0kgZGV2aWNlcyBvbmx5IChDYXJkYnVzLCBQQ0ksIG1pbmlQQ0kpCkBAIC00MzMsNyArNDI2LDkgQEAKIAkJYWgtPmFoX2ZsYWdzID0gQUhfVVNFX0VFUFJPTTsKIAogCWFoLT5hdGltX3dpbmRvdyA9IDA7Ci0JYWgtPnN0YV9pZDFfZGVmYXVsdHMgPSBBUl9TVEFfSUQxX0NSUFRfTUlDX0VOQUJMRTsKKwlhaC0+c3RhX2lkMV9kZWZhdWx0cyA9CisJCUFSX1NUQV9JRDFfQ1JQVF9NSUNfRU5BQkxFIHwKKwkJQVJfU1RBX0lEMV9NQ0FTVF9LU1JDSDsKIAlhaC0+YmVhY29uX2ludGVydmFsID0gMTAwOwogCWFoLT5lbmFibGVfMzJrSHpfY2xvY2sgPSBET05UX1VTRV8zMktIWjsKIAlhaC0+c2xvdHRpbWUgPSAodTMyKSAtMTsKQEAgLTUzNyw3ICs1MzIsOCBAQAogCiAJaWYgKGFoLT5jb25maWcuc2VyaWFsaXplX3JlZ21vZGUgPT0gU0VSX1JFR19NT0RFX0FVVE8pIHsKIAkJaWYgKGFoLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPT0gQVJfU1JFVl9WRVJTSU9OXzU0MTZfUENJIHx8Ci0JCSAgICAoQVJfU1JFVl85MjgwKGFoKSAmJiAhYWgtPmlzX3BjaWV4cHJlc3MpKSB7CisJCSAgICAoKEFSX1NSRVZfOTE2MChhaCkgfHwgQVJfU1JFVl85MjgwKGFoKSkgJiYKKwkJICAgICAhYWgtPmlzX3BjaWV4cHJlc3MpKSB7CiAJCQlhaC0+Y29uZmlnLnNlcmlhbGl6ZV9yZWdtb2RlID0KIAkJCQlTRVJfUkVHX01PREVfT047CiAJCX0gZWxzZSB7CkBAIC01NzEsMjggKzU2NywxOSBAQAogCWFoLT5hbmlfZnVuY3Rpb24gPSBBVEg5S19BTklfQUxMOwogCWlmIChBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpICYmICFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQogCQlhaC0+YW5pX2Z1bmN0aW9uICY9IH5BVEg5S19BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUw7CisJaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQorCQlhaC0+YW5pX2Z1bmN0aW9uICY9IH5BVEg5S19BTklfTVJDX0NDSzsKIAogCWF0aDlrX2h3X2luaXRfbW9kZV9yZWdzKGFoKTsKIAogCS8qCi0JICogQ29uZmlnaXJlIFBDSUUgYWZ0ZXIgSW5pIGluaXQuIFNFUkRFUyB2YWx1ZXMgbm93IGNvbWUgZnJvbSBpbmkgZmlsZQotCSAqIFRoaXMgZW5hYmxlcyBQQ0llIGxvdyBwb3dlciBtb2RlLgorCSAqIFJlYWQgYmFjayBBUl9XQSBpbnRvIGEgcGVybWFuZW50IGNvcHkgYW5kIHNldCBiaXRzIDE0IGFuZCAxNy4KKwkgKiBXZSBuZWVkIHRvIGRvIHRoaXMgdG8gYXZvaWQgUk1XIG9mIHRoaXMgcmVnaXN0ZXIuIFdlIGNhbm5vdAorCSAqIHJlYWQgdGhlIHJlZyB3aGVuIGNoaXAgaXMgYXNsZWVwLgogCSAqLwotCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7Ci0JCXUzMiByZWd2YWw7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCS8qIFNldCBCaXRzIDE2IGFuZCAxNyBpbiB0aGUgQVJfV0EgcmVnaXN0ZXIuICovCi0JCXJlZ3ZhbCA9IFJFR19SRUFEKGFoLCBBUl9XQSk7Ci0JCXJlZ3ZhbCB8PSAweDAwMDMwMDAwOwotCQlSRUdfV1JJVEUoYWgsIEFSX1dBLCByZWd2YWwpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBhaC0+aW5pUGNpZVNlcmRlc0xvd1Bvd2VyLmlhX3Jvd3M7IGkrKykgewotCQkJUkVHX1dSSVRFKGFoLAotCQkJCSAgSU5JX1JBKCZhaC0+aW5pUGNpZVNlcmRlc0xvd1Bvd2VyLCBpLCAwKSwKLQkJCQkgIElOSV9SQSgmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlciwgaSwgMSkpOwotCQl9Ci0JfQorCWFoLT5XQVJlZ1ZhbCA9IFJFR19SRUFEKGFoLCBBUl9XQSk7CisJYWgtPldBUmVnVmFsIHw9IChBUl9XQV9EM19MMV9ESVNBQkxFIHwKKwkJCSBBUl9XQV9BU1BNX1RJTUVSX0JBU0VEX0RJU0FCTEUpOwogCiAJaWYgKGFoLT5pc19wY2lleHByZXNzKQogCQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoYWgsIDAsIDApOwpAQCAtNjIzLDEwICs2MTAsOCBAQAogCWVsc2UKIAkJYWgtPnR4X3RyaWdfbGV2ZWwgPSAoQVJfRlRSSUdfNTEyQiA+PiBBUl9GVFJJR19TKTsKIAotCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQotCQlhcjkwMDNfaHdfc2V0X25mX2xpbWl0cyhhaCk7Ci0KIAlhdGg5a19pbml0X25mY2FsX2hpc3RfYnVmZmVyKGFoKTsKKwlhaC0+YmJfd2F0Y2hkb2dfdGltZW91dF9tcyA9IDI1OwogCiAJY29tbW9uLT5zdGF0ZSA9IEFUSF9IV19JTklUSUFMSVpFRDsKIApAQCAtMTAxMiw2ICs5OTcsMTEgQEAKIAogCUVOQUJMRV9SRUdXUklURV9CVUZGRVIoYWgpOwogCisJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKKwkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPldBUmVnVmFsKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisKIAlSRUdfV1JJVEUoYWgsIEFSX1JUQ19GT1JDRV9XQUtFLCBBUl9SVENfRk9SQ0VfV0FLRV9FTiB8CiAJCSAgQVJfUlRDX0ZPUkNFX1dBS0VfT05fSU5UKTsKIApAQCAtMTA2Niw2ICsxMDU2LDExIEBACiB7CiAJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CiAKKwlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgeworCQlSRUdfV1JJVEUoYWgsIEFSX1dBLCBhaC0+V0FSZWdWYWwpOworCQl1ZGVsYXkoMTApOworCX0KKwogCVJFR19XUklURShhaCwgQVJfUlRDX0ZPUkNFX1dBS0UsIEFSX1JUQ19GT1JDRV9XQUtFX0VOIHwKIAkJICBBUl9SVENfRk9SQ0VfV0FLRV9PTl9JTlQpOwogCkBAIC0xMDczLDYgKzEwNjgsNyBAQAogCQlSRUdfV1JJVEUoYWgsIEFSX1JDLCBBUl9SQ19BSEIpOwogCiAJUkVHX1dSSVRFKGFoLCBBUl9SVENfUkVTRVQsIDApOworCXVkZWxheSgyKTsKIAogCVJFR1dSSVRFX0JVRkZFUl9GTFVTSChhaCk7CiAJRElTQUJMRV9SRUdXUklURV9CVUZGRVIoYWgpOwpAQCAtMTEwMiw2ICsxMDk4LDExIEBACiAKIHN0YXRpYyBib29sIGF0aDlrX2h3X3NldF9yZXNldF9yZWcoc3RydWN0IGF0aF9odyAqYWgsIHUzMiB0eXBlKQogeworCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CisJCVJFR19XUklURShhaCwgQVJfV0EsIGFoLT5XQVJlZ1ZhbCk7CisJCXVkZWxheSgxMCk7CisJfQorCiAJUkVHX1dSSVRFKGFoLCBBUl9SVENfRk9SQ0VfV0FLRSwKIAkJICBBUl9SVENfRk9SQ0VfV0FLRV9FTiB8IEFSX1JUQ19GT1JDRV9XQUtFX09OX0lOVCk7CiAKQEAgLTEyMzIsOSArMTIzMywxMSBAQAogCiAJaWYgKCFhaC0+Y2hpcF9mdWxsc2xlZXApIHsKIAkJYXRoOWtfaHdfYWJvcnRwY3VyZWN2KGFoKTsKLQkJaWYgKCFhdGg5a19od19zdG9wZG1hcmVjdihhaCkpCisJCWlmICghYXRoOWtfaHdfc3RvcGRtYXJlY3YoYWgpKSB7CiAJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1hNSVQsCiAJCQkJIkZhaWxlZCB0byBzdG9wIHJlY2VpdmUgZG1hXG4iKTsKKwkJCWJDaGFubmVsQ2hhbmdlID0gZmFsc2U7CisJCX0KIAl9CiAKIAlpZiAoIWF0aDlrX2h3X3NldHBvd2VyKGFoLCBBVEg5S19QTV9BV0FLRSkpCkBAIC0xMjY1LDcgKzEyNjgsOCBAQAogCW1hY1N0YUlkMSA9IFJFR19SRUFEKGFoLCBBUl9TVEFfSUQxKSAmIEFSX1NUQV9JRDFfQkFTRV9SQVRFXzExQjsKIAogCS8qIEZvciBjaGlwcyBvbiB3aGljaCBSVEMgcmVzZXQgaXMgZG9uZSwgc2F2ZSBUU0YgYmVmb3JlIGl0IGdldHMgY2xlYXJlZCAqLwotCWlmIChBUl9TUkVWXzkyODAoYWgpICYmIGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tKGFoLCBFRVBfT0xfUFdSQ1RSTCkpCisJaWYgKEFSX1NSRVZfOTEwMChhaCkgfHwKKwkgICAgKEFSX1NSRVZfOTI4MChhaCkgJiYgYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkpCiAJCXRzZiA9IGF0aDlrX2h3X2dldHRzZjY0KGFoKTsKIAogCXNhdmVMZWRTdGF0ZSA9IFJFR19SRUFEKGFoLCBBUl9DRkdfTEVEKSAmCkBAIC0xMjk3LDE2ICsxMzAxLDMwIEBACiAJfQogCiAJLyogUmVzdG9yZSBUU0YgKi8KLQlpZiAodHNmICYmIEFSX1NSRVZfOTI4MChhaCkgJiYgYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkKKwlpZiAodHNmKQogCQlhdGg5a19od19zZXR0c2Y2NChhaCwgdHNmKTsKIAogCWlmIChBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpKQogCQlSRUdfU0VUX0JJVChhaCwgQVJfR1BJT19JTlBVVF9FTl9WQUwsIEFSX0dQSU9fSlRBR19ESVNBQkxFKTsKIAorCWlmICghQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKKwkJYXI5MDAyX2h3X2VuYWJsZV9hc3luY19maWZvKGFoKTsKKwogCXIgPSBhdGg5a19od19wcm9jZXNzX2luaShhaCwgY2hhbik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJLyoKKwkgKiBTb21lIEFSOTF4eCBTb0MgZGV2aWNlcyBmcmVxdWVudGx5IGZhaWwgdG8gYWNjZXB0IFRTRiB3cml0ZXMKKwkgKiByaWdodCBhZnRlciB0aGUgY2hpcCByZXNldC4gV2hlbiB0aGF0IGhhcHBlbnMsIHdyaXRlIGEgbmV3CisJICogdmFsdWUgYWZ0ZXIgdGhlIGluaXR2YWxzIGhhdmUgYmVlbiBhcHBsaWVkLCB3aXRoIGFuIG9mZnNldAorCSAqIGJhc2VkIG9uIG1lYXN1cmVkIHRpbWUgZGlmZmVyZW5jZQorCSAqLworCWlmIChBUl9TUkVWXzkxMDAoYWgpICYmIChhdGg5a19od19nZXR0c2Y2NChhaCkgPCB0c2YpKSB7CisJCXRzZiArPSAxNTAwOworCQlhdGg5a19od19zZXR0c2Y2NChhaCwgdHNmKTsKKwl9CisKIAkvKiBTZXR1cCBNRlAgb3B0aW9ucyBmb3IgQ0NNUCAqLwogCWlmIChBUl9TUkVWXzkyODBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCS8qIE1hc2sgUmV0cnkoYjExKSwgUHdyTWd0KGIxMiksIE1vcmVEYXRhKGIxMykgdG8gMCBpbiBtZ210CkBAIC0xMzY3LDYgKzEzODUsNyBAQAogCQlhdGg5a19od19yZXNldHR4cXVldWUoYWgsIGkpOwogCiAJYXRoOWtfaHdfaW5pdF9pbnRlcnJ1cHRfbWFza3MoYWgsIGFoLT5vcG1vZGUpOworCWF0aDlrX2h3X2FuaV9jYWNoZV9pbmlfcmVncyhhaCk7CiAJYXRoOWtfaHdfaW5pdF9xb3MoYWgpOwogCiAJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfUkZTSUxFTlQpCkBAIC0xMzc1LDcgKzEzOTQsNyBAQAogCWF0aDlrX2h3X2luaXRfZ2xvYmFsX3NldHRpbmdzKGFoKTsKIAogCWlmICghQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewotCQlhcjkwMDJfaHdfZW5hYmxlX2FzeW5jX2ZpZm8oYWgpOworCQlhcjkwMDJfaHdfdXBkYXRlX2FzeW5jX2ZpZm8oYWgpOwogCQlhcjkwMDJfaHdfZW5hYmxlX3dlcF9hZ2dyZWdhdGlvbihhaCk7CiAJfQogCkBAIC0xNDI2LDkgKzE0NDUsMTMgQEAKIAkJCQkiU2V0dGluZyBDRkcgMHgleFxuIiwgUkVHX1JFQUQoYWgsIEFSX0NGRykpOwogCQl9CiAJfSBlbHNlIHsKLQkJLyogQ29uZmlndXJlIEFSOTI3MSB0YXJnZXQgV0xBTiAqLwotICAgICAgICAgICAgICAgIGlmIChBUl9TUkVWXzkyNzEoYWgpKQotCQkJUkVHX1dSSVRFKGFoLCBBUl9DRkcsIEFSX0NGR19TV1JCIHwgQVJfQ0ZHX1NXVEIpOworCQlpZiAoY29tbW9uLT5idXNfb3BzLT5hdGhfYnVzX3R5cGUgPT0gQVRIX1VTQikgeworCQkJLyogQ29uZmlndXJlIEFSOTI3MSB0YXJnZXQgV0xBTiAqLworCQkJaWYgKEFSX1NSRVZfOTI3MShhaCkpCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9DRkcsIEFSX0NGR19TV1JCIHwgQVJfQ0ZHX1NXVEIpOworCQkJZWxzZQorCQkJCVJFR19XUklURShhaCwgQVJfQ0ZHLCBBUl9DRkdfU1dURCB8IEFSX0NGR19TV1JEKTsKKwkJfQogI2lmZGVmIF9fQklHX0VORElBTgogICAgICAgICAgICAgICAgIGVsc2UKIAkJCVJFR19XUklURShhaCwgQVJfQ0ZHLCBBUl9DRkdfU1dURCB8IEFSX0NGR19TV1JEKTsKQEAgLTE0NDEsNiArMTQ2NCw3IEBACiAJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJYXRoOWtfaHdfbG9hZG5mKGFoLCBjdXJjaGFuKTsKIAkJYXRoOWtfaHdfc3RhcnRfbmZjYWwoYWgpOworCQlhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfY29uZmlnKGFoKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE0ODYsOSArMTUxMCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChhdGg5a19od19rZXlyZXNldCk7CiAKLWJvb2wgYXRoOWtfaHdfa2V5c2V0bWFjKHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgZW50cnksIGNvbnN0IHU4ICptYWMpCitzdGF0aWMgYm9vbCBhdGg5a19od19rZXlzZXRtYWMoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBlbnRyeSwgY29uc3QgdTggKm1hYykKIHsKIAl1MzIgbWFjSGksIG1hY0xvOworCXUzMiB1bmljYXN0X2ZsYWcgPSBBUl9LRVlUQUJMRV9WQUxJRDsKIAogCWlmIChlbnRyeSA+PSBhaC0+Y2Fwcy5rZXljYWNoZV9zaXplKSB7CiAJCWF0aF9wcmludChhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0ZBVEFMLApAQCAtMTQ5Nyw2ICsxNTIyLDE2IEBACiAJfQogCiAJaWYgKG1hYyAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEFSX0tFWVRBQkxFX1ZBTElEIGluZGljYXRlcyB0aGF0IHRoZSBhZGRyZXNzIGlzIGEgdW5pY2FzdAorCQkgKiBhZGRyZXNzLCB3aGljaCBtdXN0IG1hdGNoIHRoZSB0cmFuc21pdHRlciBhZGRyZXNzIGZvcgorCQkgKiBkZWNyeXB0aW5nIGZyYW1lcy4KKwkJICogTm90IHNldHRpbmcgdGhpcyBiaXQgYWxsb3dzIHRoZSBoYXJkd2FyZSB0byB1c2UgdGhlIGtleQorCQkgKiBmb3IgbXVsdGljYXN0IGZyYW1lIGRlY3J5cHRpb24uCisJCSAqLworCQlpZiAobWFjWzBdICYgMHgwMSkKKwkJCXVuaWNhc3RfZmxhZyA9IDA7CisKIAkJbWFjSGkgPSAobWFjWzVdIDw8IDgpIHwgbWFjWzRdOwogCQltYWNMbyA9IChtYWNbM10gPDwgMjQpIHwKIAkJCShtYWNbMl0gPDwgMTYpIHwKQEAgLTE1MDksMTEgKzE1NDQsMTAgQEAKIAkJbWFjTG8gPSBtYWNIaSA9IDA7CiAJfQogCVJFR19XUklURShhaCwgQVJfS0VZVEFCTEVfTUFDMChlbnRyeSksIG1hY0xvKTsKLQlSRUdfV1JJVEUoYWgsIEFSX0tFWVRBQkxFX01BQzEoZW50cnkpLCBtYWNIaSB8IEFSX0tFWVRBQkxFX1ZBTElEKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0tFWVRBQkxFX01BQzEoZW50cnkpLCBtYWNIaSB8IHVuaWNhc3RfZmxhZyk7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KLUVYUE9SVF9TWU1CT0woYXRoOWtfaHdfa2V5c2V0bWFjKTsKIAogYm9vbCBhdGg5a19od19zZXRfa2V5Y2FjaGVfZW50cnkoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBlbnRyeSwKIAkJCQkgY29uc3Qgc3RydWN0IGF0aDlrX2tleXZhbCAqaywKQEAgLTE3MTQsMTcgKzE3NDgsNiBAQAogfQogRVhQT1JUX1NZTUJPTChhdGg5a19od19zZXRfa2V5Y2FjaGVfZW50cnkpOwogCi1ib29sIGF0aDlrX2h3X2tleWlzdmFsaWQoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBlbnRyeSkKLXsKLQlpZiAoZW50cnkgPCBhaC0+Y2Fwcy5rZXljYWNoZV9zaXplKSB7Ci0JCXUzMiB2YWwgPSBSRUdfUkVBRChhaCwgQVJfS0VZVEFCTEVfTUFDMShlbnRyeSkpOwotCQlpZiAodmFsICYgQVJfS0VZVEFCTEVfVkFMSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotRVhQT1JUX1NZTUJPTChhdGg5a19od19rZXlpc3ZhbGlkKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFBvd2VyIE1hbmFnZW1lbnQgKENoaXBzZXQpICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTc1MSw2ICsxNzc0LDExIEBACiAJCQlSRUdfQ0xSX0JJVChhaCwgKEFSX1JUQ19SRVNFVCksCiAJCQkJICAgIEFSX1JUQ19SRVNFVF9FTik7CiAJfQorCisJLyogQ2xlYXIgQml0IDE0IG9mIEFSX1dBIGFmdGVyIHB1dHRpbmcgY2hpcCBpbnRvIEZ1bGwgU2xlZXAgbW9kZS4gKi8KKwlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9XQSwKKwkJCSAgYWgtPldBUmVnVmFsICYgfkFSX1dBX0QzX0wxX0RJU0FCTEUpOwogfQogCiAvKgpAQCAtMTc3Nyw2ICsxODA1LDEwIEBACiAJCQkJICAgIEFSX1JUQ19GT1JDRV9XQUtFX0VOKTsKIAkJfQogCX0KKworCS8qIENsZWFyIEJpdCAxNCBvZiBBUl9XQSBhZnRlciBwdXR0aW5nIGNoaXAgaW50byBOZXQgU2xlZXAgbW9kZS4gKi8KKwlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPldBUmVnVmFsICYgfkFSX1dBX0QzX0wxX0RJU0FCTEUpOwogfQogCiBzdGF0aWMgYm9vbCBhdGg5a19od19zZXRfcG93ZXJfYXdha2Uoc3RydWN0IGF0aF9odyAqYWgsIGludCBzZXRDaGlwKQpAQCAtMTc4NCw2ICsxODE2LDEyIEBACiAJdTMyIHZhbDsKIAlpbnQgaTsKIAorCS8qIFNldCBCaXRzIDE0IGFuZCAxNyBvZiBBUl9XQSBiZWZvcmUgcG93ZXJpbmcgb24gdGhlIGNoaXAuICovCisJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKKwkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPldBUmVnVmFsKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisKIAlpZiAoc2V0Q2hpcCkgewogCQlpZiAoKFJFR19SRUFEKGFoLCBBUl9SVENfU1RBVFVTKSAmCiAJCSAgICAgQVJfUlRDX1NUQVRVU19NKSA9PSBBUl9SVENfU1RBVFVTX1NIVVRET1dOKSB7CkBAIC0yMTM4LDYgKzIxNzYsOCBAQAogCiAJaWYgKEFSX1NSRVZfOTI3MShhaCkpCiAJCXBDYXAtPm51bV9ncGlvX3BpbnMgPSBBUjkyNzFfTlVNX0dQSU87CisJZWxzZSBpZiAoQVJfREVWSURfNzAxMChhaCkpCisJCXBDYXAtPm51bV9ncGlvX3BpbnMgPSBBUjcwMTBfTlVNX0dQSU87CiAJZWxzZSBpZiAoQVJfU1JFVl85Mjg1XzEwX09SX0xBVEVSKGFoKSkKIAkJcENhcC0+bnVtX2dwaW9fcGlucyA9IEFSOTI4NV9OVU1fR1BJTzsKIAllbHNlIGlmIChBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpKQpAQCAtMjE2NSw3ICsyMjA1LDcgQEAKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfUkZTSUxFTlQ7CiAJfQogI2VuZGlmCi0JaWYgKEFSX1NSRVZfOTI3MShhaCkpCisJaWYgKEFSX1NSRVZfOTI3MShhaCkgfHwgQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfQVVUT1NMRUVQOwogCWVsc2UKIAkJcENhcC0+aHdfY2FwcyAmPSB+QVRIOUtfSFdfQ0FQX0FVVE9TTEVFUDsKQEAgLTIyMjAsNiArMjI2MCw4IEBACiAJCXBDYXAtPnJ4X3N0YXR1c19sZW4gPSBzaXplb2Yoc3RydWN0IGFyOTAwM19yeHMpOwogCQlwQ2FwLT50eF9kZXNjX2xlbiA9IHNpemVvZihzdHJ1Y3QgYXI5MDAzX3R4Yyk7CiAJCXBDYXAtPnR4c19sZW4gPSBzaXplb2Yoc3RydWN0IGFyOTAwM190eHMpOworCQlpZiAoYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9QQVBSRCkpCisJCQlwQ2FwLT5od19jYXBzIHw9IEFUSDlLX0hXX0NBUF9QQVBSRDsKIAl9IGVsc2UgewogCQlwQ2FwLT50eF9kZXNjX2xlbiA9IHNpemVvZihzdHJ1Y3QgYXRoX2Rlc2MpOwogCQlpZiAoQVJfU1JFVl85MjgwXzIwKGFoKSAmJgpAQCAtMjIzMiwxMDEgKzIyNzQsMTIgQEAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfUkFDX1NVUFBPUlRFRDsKIAorCWlmIChBUl9TUkVWXzkyODdfMTBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTI3MShhaCkpCisJCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX1NHSV8yMDsKKwogCXJldHVybiAwOwogfQogCi1ib29sIGF0aDlrX2h3X2dldGNhcGFiaWxpdHkoc3RydWN0IGF0aF9odyAqYWgsIGVudW0gYXRoOWtfY2FwYWJpbGl0eV90eXBlIHR5cGUsCi0JCQkgICAgdTMyIGNhcGFiaWxpdHksIHUzMiAqcmVzdWx0KQotewotCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVndWxhdG9yeSA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQVRIOUtfQ0FQX0NJUEhFUjoKLQkJc3dpdGNoIChjYXBhYmlsaXR5KSB7Ci0JCWNhc2UgQVRIOUtfQ0lQSEVSX0FFU19DQ006Ci0JCWNhc2UgQVRIOUtfQ0lQSEVSX0FFU19PQ0I6Ci0JCWNhc2UgQVRIOUtfQ0lQSEVSX1RLSVA6Ci0JCWNhc2UgQVRIOUtfQ0lQSEVSX1dFUDoKLQkJY2FzZSBBVEg5S19DSVBIRVJfTUlDOgotCQljYXNlIEFUSDlLX0NJUEhFUl9DTFI6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCWNhc2UgQVRIOUtfQ0FQX1RLSVBfTUlDOgotCQlzd2l0Y2ggKGNhcGFiaWxpdHkpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgMToKLQkJCXJldHVybiAoYWgtPnN0YV9pZDFfZGVmYXVsdHMgJgotCQkJCUFSX1NUQV9JRDFfQ1JQVF9NSUNfRU5BQkxFKSA/IHRydWUgOgotCQkJZmFsc2U7Ci0JCX0KLQljYXNlIEFUSDlLX0NBUF9US0lQX1NQTElUOgotCQlyZXR1cm4gKGFoLT5taXNjX21vZGUgJiBBUl9QQ1VfTUlDX05FV19MT0NfRU5BKSA/Ci0JCQlmYWxzZSA6IHRydWU7Ci0JY2FzZSBBVEg5S19DQVBfTUNBU1RfS0VZU1JDSDoKLQkJc3dpdGNoIChjYXBhYmlsaXR5KSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiB0cnVlOwotCQljYXNlIDE6Ci0JCQlpZiAoUkVHX1JFQUQoYWgsIEFSX1NUQV9JRDEpICYgQVJfU1RBX0lEMV9BREhPQykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIChhaC0+c3RhX2lkMV9kZWZhdWx0cyAmCi0JCQkJCUFSX1NUQV9JRDFfTUNBU1RfS1NSQ0gpID8gdHJ1ZSA6Ci0JCQkJCWZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQljYXNlIEFUSDlLX0NBUF9UWFBPVzoKLQkJc3dpdGNoIChjYXBhYmlsaXR5KSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiAwOwotCQljYXNlIDE6Ci0JCQkqcmVzdWx0ID0gcmVndWxhdG9yeS0+cG93ZXJfbGltaXQ7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSAyOgotCQkJKnJlc3VsdCA9IHJlZ3VsYXRvcnktPm1heF9wb3dlcl9sZXZlbDsKLQkJCXJldHVybiAwOwotCQljYXNlIDM6Ci0JCQkqcmVzdWx0ID0gcmVndWxhdG9yeS0+dHBfc2NhbGU7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JY2FzZSBBVEg5S19DQVBfRFM6Ci0JCXJldHVybiAoQVJfU1JFVl85MjgwXzIwX09SX0xBVEVSKGFoKSAmJgotCQkJKGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tKGFoLCBFRVBfUkNfQ0hBSU5fTUFTSykgPT0gMSkpCi0JCQk/IGZhbHNlIDogdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChhdGg5a19od19nZXRjYXBhYmlsaXR5KTsKLQotYm9vbCBhdGg5a19od19zZXRjYXBhYmlsaXR5KHN0cnVjdCBhdGhfaHcgKmFoLCBlbnVtIGF0aDlrX2NhcGFiaWxpdHlfdHlwZSB0eXBlLAotCQkJICAgIHUzMiBjYXBhYmlsaXR5LCB1MzIgc2V0dGluZywgaW50ICpzdGF0dXMpCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBVEg5S19DQVBfVEtJUF9NSUM6Ci0JCWlmIChzZXR0aW5nKQotCQkJYWgtPnN0YV9pZDFfZGVmYXVsdHMgfD0KLQkJCQlBUl9TVEFfSUQxX0NSUFRfTUlDX0VOQUJMRTsKLQkJZWxzZQotCQkJYWgtPnN0YV9pZDFfZGVmYXVsdHMgJj0KLQkJCQl+QVJfU1RBX0lEMV9DUlBUX01JQ19FTkFCTEU7Ci0JCXJldHVybiB0cnVlOwotCWNhc2UgQVRIOUtfQ0FQX01DQVNUX0tFWVNSQ0g6Ci0JCWlmIChzZXR0aW5nKQotCQkJYWgtPnN0YV9pZDFfZGVmYXVsdHMgfD0gQVJfU1RBX0lEMV9NQ0FTVF9LU1JDSDsKLQkJZWxzZQotCQkJYWgtPnN0YV9pZDFfZGVmYXVsdHMgJj0gfkFSX1NUQV9JRDFfTUNBU1RfS1NSQ0g7Ci0JCXJldHVybiB0cnVlOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGF0aDlrX2h3X3NldGNhcGFiaWxpdHkpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEdQSU8gLyBSRktJTEwgLyBBbnRlbm5hZSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzY1LDggKzIzMTgsMTUgQEAKIAogCUJVR19PTihncGlvID49IGFoLT5jYXBzLm51bV9ncGlvX3BpbnMpOwogCi0JZ3Bpb19zaGlmdCA9IGdwaW8gPDwgMTsKKwlpZiAoQVJfREVWSURfNzAxMChhaCkpIHsKKwkJZ3Bpb19zaGlmdCA9IGdwaW87CisJCVJFR19STVcoYWgsIEFSNzAxMF9HUElPX09FLAorCQkJKEFSNzAxMF9HUElPX09FX0FTX0lOUFVUIDw8IGdwaW9fc2hpZnQpLAorCQkJKEFSNzAxMF9HUElPX09FX01BU0sgPDwgZ3Bpb19zaGlmdCkpOworCQlyZXR1cm47CisJfQogCisJZ3Bpb19zaGlmdCA9IGdwaW8gPDwgMTsKIAlSRUdfUk1XKGFoLAogCQlBUl9HUElPX09FX09VVCwKIAkJKEFSX0dQSU9fT0VfT1VUX0RSVl9OTyA8PCBncGlvX3NoaWZ0KSwKQEAgLTIzODIsNyArMjM0MiwxMSBAQAogCWlmIChncGlvID49IGFoLT5jYXBzLm51bV9ncGlvX3BpbnMpCiAJCXJldHVybiAweGZmZmZmZmZmOwogCi0JaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCisJaWYgKEFSX0RFVklEXzcwMTAoYWgpKSB7CisJCXUzMiB2YWw7CisJCXZhbCA9IFJFR19SRUFEKGFoLCBBUjcwMTBfR1BJT19JTik7CisJCXJldHVybiAoTVModmFsLCBBUjcwMTBfR1BJT19JTl9WQUwpICYgQVJfR1BJT19CSVQoZ3BpbykpID09IDA7CisJfSBlbHNlIGlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQogCQlyZXR1cm4gTVNfUkVHX1JFQUQoQVI5MzAwLCBncGlvKSAhPSAwOwogCWVsc2UgaWYgKEFSX1NSRVZfOTI3MShhaCkpCiAJCXJldHVybiBNU19SRUdfUkVBRChBUjkyNzEsIGdwaW8pICE9IDA7CkBAIC0yNDAyLDEwICsyMzY2LDE2IEBACiB7CiAJdTMyIGdwaW9fc2hpZnQ7CiAKKwlpZiAoQVJfREVWSURfNzAxMChhaCkpIHsKKwkJZ3Bpb19zaGlmdCA9IGdwaW87CisJCVJFR19STVcoYWgsIEFSNzAxMF9HUElPX09FLAorCQkJKEFSNzAxMF9HUElPX09FX0FTX09VVFBVVCA8PCBncGlvX3NoaWZ0KSwKKwkJCShBUjcwMTBfR1BJT19PRV9NQVNLIDw8IGdwaW9fc2hpZnQpKTsKKwkJcmV0dXJuOworCX0KKwogCWF0aDlrX2h3X2dwaW9fY2ZnX291dHB1dF9tdXgoYWgsIGdwaW8sIGFoX3NpZ25hbF90eXBlKTsKLQogCWdwaW9fc2hpZnQgPSAyICogZ3BpbzsKLQogCVJFR19STVcoYWgsCiAJCUFSX0dQSU9fT0VfT1VULAogCQkoQVJfR1BJT19PRV9PVVRfRFJWX0FMTCA8PCBncGlvX3NoaWZ0KSwKQEAgLTI0MTUsNiArMjM4NSwxMyBAQAogCiB2b2lkIGF0aDlrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCkKIHsKKwlpZiAoQVJfREVWSURfNzAxMChhaCkpIHsKKwkJdmFsID0gdmFsID8gMCA6IDE7CisJCVJFR19STVcoYWgsIEFSNzAxMF9HUElPX09VVCwgKCh2YWwmMSkgPDwgZ3BpbyksCisJCQlBUl9HUElPX0JJVChncGlvKSk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoQVJfU1JFVl85MjcxKGFoKSkKIAkJdmFsID0gfnZhbDsKIApAQCAtMjUyMCwxMiArMjQ5Nyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X3NldF90eHBvd2VybGltaXQpOwogCi12b2lkIGF0aDlrX2h3X3NldG1hYyhzdHJ1Y3QgYXRoX2h3ICphaCwgY29uc3QgdTggKm1hYykKLXsKLQltZW1jcHkoYXRoOWtfaHdfY29tbW9uKGFoKS0+bWFjYWRkciwgbWFjLCBFVEhfQUxFTik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF0aDlrX2h3X3NldG1hYyk7Ci0KIHZvaWQgYXRoOWtfaHdfc2V0b3Btb2RlKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCWF0aDlrX2h3X3NldF9vcGVyYXRpbmdfbW9kZShhaCwgYWgtPm9wbW9kZSk7CkBAIC0yNTk4LDIxICsyNTY5LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woYXRoOWtfaHdfc2V0X3RzZmFkanVzdCk7CiAKLS8qCi0gKiAgRXh0ZW5kIDE1LWJpdCB0aW1lIHN0YW1wIGZyb20gcnggZGVzY3JpcHRvciB0bwotICogIGEgZnVsbCA2NC1iaXQgVFNGIHVzaW5nIHRoZSBjdXJyZW50IGgvdyBUU0YuCi0qLwotdTY0IGF0aDlrX2h3X2V4dGVuZF90c2Yoc3RydWN0IGF0aF9odyAqYWgsIHUzMiByc3RhbXApCi17Ci0JdTY0IHRzZjsKLQotCXRzZiA9IGF0aDlrX2h3X2dldHRzZjY0KGFoKTsKLQlpZiAoKHRzZiAmIDB4N2ZmZikgPCByc3RhbXApCi0JCXRzZiAtPSAweDgwMDA7Ci0JcmV0dXJuICh0c2YgJiB+MHg3ZmZmKSB8IHJzdGFtcDsKLX0KLUVYUE9SVF9TWU1CT0woYXRoOWtfaHdfZXh0ZW5kX3RzZik7Ci0KIHZvaWQgYXRoOWtfaHdfc2V0MTFubWFjMjA0MChzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmYXRoOWtfaHdfY29tbW9uKGFoKS0+aHctPmNvbmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCmluZGV4IDc3MjQ1ZGYuLjJkMzBlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCkBAIC0xNTgsNiArMTU4LDkgQEAKICNkZWZpbmUgQVRIOUtfSFdfUlhfSFBfUURFUFRICTE2CiAjZGVmaW5lIEFUSDlLX0hXX1JYX0xQX1FERVBUSAkxMjgKIAorI2RlZmluZSBQQVBSRF9HQUlOX1RBQkxFX0VOVFJJRVMgICAgMzIKKyNkZWZpbmUgUEFQUkRfVEFCTEVfU1ogICAgICAgICAgICAgIDI0CisKIGVudW0gYXRoX2luaV9zdWJzeXMgewogCUFUSF9JTklfUFJFID0gMCwKIAlBVEhfSU5JX0NPUkUsCkBAIC0xOTksMTUgKzIwMiw4IEBACiAJQVRIOUtfSFdfQ0FQX1JBQ19TVVBQT1JURUQJCT0gQklUKDE4KSwKIAlBVEg5S19IV19DQVBfTERQQwkJCT0gQklUKDE5KSwKIAlBVEg5S19IV19DQVBfRkFTVENMT0NLCQkJPSBCSVQoMjApLAotfTsKLQotZW51bSBhdGg5a19jYXBhYmlsaXR5X3R5cGUgewotCUFUSDlLX0NBUF9DSVBIRVIgPSAwLAotCUFUSDlLX0NBUF9US0lQX01JQywKLQlBVEg5S19DQVBfVEtJUF9TUExJVCwKLQlBVEg5S19DQVBfVFhQT1csCi0JQVRIOUtfQ0FQX01DQVNUX0tFWVNSQ0gsCi0JQVRIOUtfQ0FQX0RTCisJQVRIOUtfSFdfQ0FQX1NHSV8yMAkJCT0gQklUKDIxKSwKKwlBVEg5S19IV19DQVBfUEFQUkQJCQk9IEJJVCgyMiksCiB9OwogCiBzdHJ1Y3QgYXRoOWtfaHdfY2FwYWJpbGl0aWVzIHsKQEAgLTIzNyw4ICsyMzMsOSBAQAogCWludCBzd19iZWFjb25fcmVzcG9uc2VfdGltZTsKIAlpbnQgYWRkaXRpb25hbF9zd2JhX2JhY2tvZmY7CiAJaW50IGFja182bWI7Ci0JaW50IGN3bV9pZ25vcmVfZXh0Y2NhOworCXUzMiBjd21faWdub3JlX2V4dGNjYTsKIAl1OCBwY2llX3Bvd2Vyc2F2ZV9lbmFibGU7CisJYm9vbCBwY2llU2VyRGVzV3JpdGU7CiAJdTggcGNpZV9jbG9ja19yZXE7CiAJdTMyIHBjaWVfd2FlbjsKIAl1OCBhbmFsb2dfc2hpZnRyZWc7CkBAIC0yNjIsMTAgKzI1OSwxMCBAQAogI2RlZmluZSBBUl9CQVNFX0ZSRVFfNUdIWiAgIAk0OTAwCiAjZGVmaW5lIEFSX1NQVVJfRkVFUV9CT1VORF9IVDQwIDE5CiAjZGVmaW5lIEFSX1NQVVJfRkVFUV9CT1VORF9IVDIwIDEwCi0JYm9vbCB0eF9pcV9jYWxpYnJhdGlvbjsgLyogT25seSBhdmFpbGFibGUgZm9yID49IEFSOTAwMyAqLwogCWludCBzcHVybW9kZTsKIAl1MTYgc3B1cmNoYW5zW0FSX0VFUFJPTV9NT0RBTF9TUFVSU11bMl07CiAJdTggbWF4X3R4dHJpZ19sZXZlbDsKKwl1MTYgYW5pX3BvbGxfaW50ZXJ2YWw7IC8qIEFOSSBwb2xsIGludGVydmFsIGluIG1zICovCiB9OwogCiBlbnVtIGF0aDlrX2ludCB7CkBAIC0yNzksNiArMjc2LDcgQEAKIAlBVEg5S19JTlRfVFggPSAweDAwMDAwMDQwLAogCUFUSDlLX0lOVF9UWERFU0MgPSAweDAwMDAwMDgwLAogCUFUSDlLX0lOVF9USU1fVElNRVIgPSAweDAwMDAwMTAwLAorCUFUSDlLX0lOVF9CQl9XQVRDSERPRyA9IDB4MDAwMDA0MDAsCiAJQVRIOUtfSU5UX1RYVVJOID0gMHgwMDAwMDgwMCwKIAlBVEg5S19JTlRfTUlCID0gMHgwMDAwMTAwMCwKIAlBVEg5S19JTlRfUlhQSFkgPSAweDAwMDA0MDAwLApAQCAtMzU4LDYgKzM1Niw5IEBACiAJaW50OF90IGlDb2ZmOwogCWludDhfdCBxQ29mZjsKIAlpbnQxNl90IHJhd05vaXNlRmxvb3I7CisJYm9vbCBwYXByZF9kb25lOworCXUxNiBzbWFsbF9zaWduYWxfZ2FpbltBUjkzMDBfTUFYX0NIQUlOU107CisJdTMyIHBhX3RhYmxlW0FSOTMwMF9NQVhfQ0hBSU5TXVtQQVBSRF9UQUJMRV9TWl07CiB9OwogCiAjZGVmaW5lIElTX0NIQU5fRyhfYykgKCgoKF9jKS0+Y2hhbm5lbEZsYWdzICYgKENIQU5ORUxfRykpID09IENIQU5ORUxfRykgfHwgXApAQCAtNDU5LDcgKzQ2MCw3IEBACiAjZGVmaW5lIEFSX0dFTlRNUl9CSVQoX2luZGV4KQkoMSA8PCAoX2luZGV4KSkKIAogLyoKLSAqIFVzaW5nIGRlIEJydWlqaW4gc2VxdWVuY2UgdG8gdG8gbG9vayB1cCAxJ3MgaW5kZXggaW4gYSAzMiBiaXQgbnVtYmVyCisgKiBVc2luZyBkZSBCcnVpamluIHNlcXVlbmNlIHRvIGxvb2sgdXAgMSdzIGluZGV4IGluIGEgMzIgYml0IG51bWJlcgogICogZGVicnVpam4zMiA9IDAwMDAgMDExMSAwMTExIDExMDAgMTAxMSAwMTAxIDAwMTEgMDAwMQogICovCiAjZGVmaW5lIGRlYnJ1aWpuMzIgMHgwNzdDQjUzMVUKQEAgLTUwOSw3ICs1MTAsMTcgQEAKICAqCUFSX1JUQ19QTExfQ09OVFJPTCBmb3IgYSBnaXZlbiBjaGFubmVsCiAgKiBAc2V0dXBfY2FsaWJyYXRpb246IHNldCB1cCBjYWxpYnJhdGlvbgogICogQGlzY2FsX3N1cHBvcnRlZDogdXNlZCB0byBxdWVyeSBpZiBhIHR5cGUgb2YgY2FsaWJyYXRpb24gaXMgc3VwcG9ydGVkCi0gKiBAbG9hZG5mOiBsb2FkIG5vaXNlIGZsb29yIHJlYWQgZnJvbSBlYWNoIGNoYWluIG9uIHRoZSBDQ0EgcmVnaXN0ZXJzCisgKgorICogQGFuaV9yZXNldDogcmVzZXQgQU5JIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMKKyAqIEBhbmlfbG93ZXJfaW1tdW5pdHk6IGxvd2VyIHRoZSBub2lzZSBpbW11bml0eSBsZXZlbC4gVGhlIGxldmVsIGNvbnRyb2xzCisgKgl0aGUgcG93ZXItYmFzZWQgcGFja2V0IGRldGVjdGlvbiBvbiBoYXJkd2FyZS4gSWYgYSBwb3dlciBqdW1wIGlzCisgKglkZXRlY3RlZCB0aGUgYWRhcHRlciB0YWtlcyBpdCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgYSBwYWNrZXQgaGFzCisgKglhcnJpdmVkLiBUaGUgbGV2ZWwgcmFuZ2VzIGZyb20gMC01LiBFYWNoIGxldmVsIGNvcnJlc3BvbmRzIHRvIGEKKyAqCWZldyBkQiBtb3JlIG9mIG5vaXNlIGltbXVuaXR5LiBJZiB5b3UgaGF2ZSBhIHN0cm9uZyB0aW1lLXZhcnlpbmcKKyAqCWludGVyZmVyZW5jZSB0aGF0IGlzIGNhdXNpbmcgZmFsc2UgZGV0ZWN0aW9ucyAoT0ZETSB0aW1pbmcgZXJyb3JzIG9yCisgKglDQ0sgdGltaW5nIGVycm9ycykgdGhlIGxldmVsIGNhbiBiZSBpbmNyZWFzZWQuCisgKiBAYW5pX2NhY2hlX2luaV9yZWdzOiBjYWNoZSB0aGUgdmFsdWVzIGZvciBBTkkgZnJvbSB0aGUgaW5pdGlhbAorICoJcmVnaXN0ZXIgc2V0dGluZ3MgdGhyb3VnaCB0aGUgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24uCiAgKi8KIHN0cnVjdCBhdGhfaHdfcHJpdmF0ZV9vcHMgewogCS8qIENhbGlicmF0aW9uIG9wcyAqLwpAQCAtNTUyLDcgKzU2MywxMSBAQAogCWJvb2wgKCphbmlfY29udHJvbCkoc3RydWN0IGF0aF9odyAqYWgsIGVudW0gYXRoOWtfYW5pX2NtZCBjbWQsCiAJCQkgICAgaW50IHBhcmFtKTsKIAl2b2lkICgqZG9fZ2V0bmYpKHN0cnVjdCBhdGhfaHcgKmFoLCBpbnQxNl90IG5mYXJyYXlbTlVNX05GX1JFQURJTkdTXSk7Ci0Jdm9pZCAoKmxvYWRuZikoc3RydWN0IGF0aF9odyAqYWgsIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKKworCS8qIEFOSSAqLworCXZvaWQgKCphbmlfcmVzZXQpKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGlzX3NjYW5uaW5nKTsKKwl2b2lkICgqYW5pX2xvd2VyX2ltbXVuaXR5KShzdHJ1Y3QgYXRoX2h3ICphaCk7CisJdm9pZCAoKmFuaV9jYWNoZV9pbmlfcmVncykoc3RydWN0IGF0aF9odyAqYWgpOwogfTsKIAogLyoqCkBAIC01NjMsNiArNTc4LDExIEBACiAgKgogICogQGNvbmZpZ19wY2lfcG93ZXJzYXZlOgogICogQGNhbGlicmF0ZTogcGVyaW9kaWMgY2FsaWJyYXRpb24gZm9yIE5GLCBBTkksIElRLCBBREMgZ2FpbiwgQURDLURDCisgKgorICogQGFuaV9wcm9jX21pYl9ldmVudDogcHJvY2VzcyBNSUIgZXZlbnRzLCB0aGlzIHdvdWxkIGhhcHBlbiB1cG9uIHNwZWNpZmljIEFOSQorICoJdGhyZXNob2xkcyBiZWluZyByZWFjaGVkIG9yIGhhdmluZyBvdmVyZmxvd2VkLgorICogQGFuaV9tb25pdG9yOiBjYWxsZWQgcGVyaW9kaWNhbGx5IGJ5IHRoZSBjb3JlIGRyaXZlciB0byBjb2xsZWN0CisgKglNSUIgc3RhdHMgYW5kIGFkanVzdCBBTkkgaWYgc3BlY2lmaWMgdGhyZXNob2xkcyBoYXZlIGJlZW4gcmVhY2hlZC4KICAqLwogc3RydWN0IGF0aF9od19vcHMgewogCXZvaWQgKCpjb25maWdfcGNpX3Bvd2Vyc2F2ZSkoc3RydWN0IGF0aF9odyAqYWgsCkBAIC02MDMsNiArNjIzLDE1IEBACiAJCQkJICAgICB1MzIgYnVyc3REdXJhdGlvbik7CiAJdm9pZCAoKnNldDExbl92aXJ0dWFsbW9yZWZyYWcpKHN0cnVjdCBhdGhfaHcgKmFoLCB2b2lkICpkcywKIAkJCQkgICAgICAgdTMyIHZtZik7CisKKwl2b2lkICgqYW5pX3Byb2NfbWliX2V2ZW50KShzdHJ1Y3QgYXRoX2h3ICphaCk7CisJdm9pZCAoKmFuaV9tb25pdG9yKShzdHJ1Y3QgYXRoX2h3ICphaCwgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pOworfTsKKworc3RydWN0IGF0aF9uZl9saW1pdHMgeworCXMxNiBtYXg7CisJczE2IG1pbjsKKwlzMTYgbm9taW5hbDsKIH07CiAKIHN0cnVjdCBhdGhfaHcgewpAQCAtNjI2LDEwICs2NTUsMTAgQEAKIAlib29sIGlzX3BjaWV4cHJlc3M7CiAJYm9vbCBuZWVkX2FuX3RvcDJfZml4dXA7CiAJdTE2IHR4X3RyaWdfbGV2ZWw7Ci0JczE2IG5mXzJnX21heDsKLQlzMTYgbmZfMmdfbWluOwotCXMxNiBuZl81Z19tYXg7Ci0JczE2IG5mXzVnX21pbjsKKworCXUzMiBuZl9yZWdzWzZdOworCXN0cnVjdCBhdGhfbmZfbGltaXRzIG5mXzJnOworCXN0cnVjdCBhdGhfbmZfbGltaXRzIG5mXzVnOwogCXUxNiByZnNpbGVudDsKIAl1MzIgcmZraWxsX2dwaW87CiAJdTMyIHJma2lsbF9wb2xhcml0eTsKQEAgLTc4OSw2ICs4MTgsMTggQEAKIAl1MzIgdHNfcGFkZHJfZW5kOwogCXUxNiB0c190YWlsOwogCXU4IHRzX3NpemU7CisKKwl1MzIgYmJfd2F0Y2hkb2dfbGFzdF9zdGF0dXM7CisJdTMyIGJiX3dhdGNoZG9nX3RpbWVvdXRfbXM7IC8qIGluIG1zLCAwIHRvIGRpc2FibGUgKi8KKworCXUzMiBwYXByZF9nYWluX3RhYmxlX2VudHJpZXNbUEFQUkRfR0FJTl9UQUJMRV9FTlRSSUVTXTsKKwl1OCBwYXByZF9nYWluX3RhYmxlX2luZGV4W1BBUFJEX0dBSU5fVEFCTEVfRU5UUklFU107CisJLyoKKwkgKiBTdG9yZSB0aGUgcGVybWFuZW50IHZhbHVlIG9mIFJlZyAweDQwMDRpbiBXQVJlZ1ZhbAorCSAqIHNvIHdlIGRvbnQgaGF2ZSB0byBSL00vVy4gV2Ugc2hvdWxkIG5vdCBiZSByZWFkaW5nCisJICogdGhpcyByZWdpc3RlciB3aGVuIGluIHNsZWVwIHN0YXRlcy4KKwkgKi8KKwl1MzIgV0FSZWdWYWw7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhdGhfY29tbW9uICphdGg5a19od19jb21tb24oc3RydWN0IGF0aF9odyAqYWgpCkBAIC04MTEsNiArODUyLDEyIEBACiAJcmV0dXJuICZhaC0+b3BzOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzaWduX2V4dGVuZChpbnQgdmFsLCBjb25zdCBpbnQgbmJpdHMpCit7CisJaW50IG9yZGVyID0gQklUKG5iaXRzLTEpOworCXJldHVybiAodmFsIF4gb3JkZXIpIC0gb3JkZXI7Cit9CisKIC8qIEluaXRpYWxpemF0aW9uLCBEZXRhY2gsIFJlc2V0ICovCiBjb25zdCBjaGFyICphdGg5a19od19wcm9iZSh1MTYgdmVuZG9yaWQsIHUxNiBkZXZpZCk7CiB2b2lkIGF0aDlrX2h3X2RlaW5pdChzdHJ1Y3QgYXRoX2h3ICphaCk7CkBAIC04MTgsMTkgKzg2NSwxMyBAQAogaW50IGF0aDlrX2h3X3Jlc2V0KHN0cnVjdCBhdGhfaHcgKmFoLCBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwKIAkJICAgYm9vbCBiQ2hhbm5lbENoYW5nZSk7CiBpbnQgYXRoOWtfaHdfZmlsbF9jYXBfaW5mbyhzdHJ1Y3QgYXRoX2h3ICphaCk7Ci1ib29sIGF0aDlrX2h3X2dldGNhcGFiaWxpdHkoc3RydWN0IGF0aF9odyAqYWgsIGVudW0gYXRoOWtfY2FwYWJpbGl0eV90eXBlIHR5cGUsCi0JCQkgICAgdTMyIGNhcGFiaWxpdHksIHUzMiAqcmVzdWx0KTsKLWJvb2wgYXRoOWtfaHdfc2V0Y2FwYWJpbGl0eShzdHJ1Y3QgYXRoX2h3ICphaCwgZW51bSBhdGg5a19jYXBhYmlsaXR5X3R5cGUgdHlwZSwKLQkJCSAgICB1MzIgY2FwYWJpbGl0eSwgdTMyIHNldHRpbmcsIGludCAqc3RhdHVzKTsKIHUzMiBhdGg5a19yZWdkX2dldF9jdGwoc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcsIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKIAogLyogS2V5IENhY2hlIE1hbmFnZW1lbnQgKi8KIGJvb2wgYXRoOWtfaHdfa2V5cmVzZXQoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBlbnRyeSk7Ci1ib29sIGF0aDlrX2h3X2tleXNldG1hYyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTE2IGVudHJ5LCBjb25zdCB1OCAqbWFjKTsKIGJvb2wgYXRoOWtfaHdfc2V0X2tleWNhY2hlX2VudHJ5KHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgZW50cnksCiAJCQkJIGNvbnN0IHN0cnVjdCBhdGg5a19rZXl2YWwgKmssCiAJCQkJIGNvbnN0IHU4ICptYWMpOwotYm9vbCBhdGg5a19od19rZXlpc3ZhbGlkKHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgZW50cnkpOwogCiAvKiBHUElPIC8gUkZLSUxMIC8gQW50ZW5uYWUgKi8KIHZvaWQgYXRoOWtfaHdfY2ZnX2dwaW9faW5wdXQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBncGlvKTsKQEAgLTg1Niw3ICs4OTcsNiBAQAogYm9vbCBhdGg5a19od19waHlfZGlzYWJsZShzdHJ1Y3QgYXRoX2h3ICphaCk7CiBib29sIGF0aDlrX2h3X2Rpc2FibGUoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19zZXRfdHhwb3dlcmxpbWl0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgbGltaXQpOwotdm9pZCBhdGg5a19od19zZXRtYWMoc3RydWN0IGF0aF9odyAqYWgsIGNvbnN0IHU4ICptYWMpOwogdm9pZCBhdGg5a19od19zZXRvcG1vZGUoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19zZXRtY2FzdGZpbHRlcihzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKTsKIHZvaWQgYXRoOWtfaHdfc2V0YnNzaWRtYXNrKHN0cnVjdCBhdGhfaHcgKmFoKTsKQEAgLTg2NSw3ICs5MDUsNiBAQAogdm9pZCBhdGg5a19od19zZXR0c2Y2NChzdHJ1Y3QgYXRoX2h3ICphaCwgdTY0IHRzZjY0KTsKIHZvaWQgYXRoOWtfaHdfcmVzZXRfdHNmKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXRoOWtfaHdfc2V0X3RzZmFkanVzdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHNldHRpbmcpOwotdTY0IGF0aDlrX2h3X2V4dGVuZF90c2Yoc3RydWN0IGF0aF9odyAqYWgsIHUzMiByc3RhbXApOwogdm9pZCBhdGg5a19od19pbml0X2dsb2JhbF9zZXR0aW5ncyhzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGF0aDlrX2h3X3NldDExbm1hYzIwNDAoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19iZWFjb25pbml0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgbmV4dF9iZWFjb24sIHUzMiBiZWFjb25fcGVyaW9kKTsKQEAgLTkwNywxMyArOTQ2LDI1IEBACiB2b2lkIGFyOTAwMl9od19jY2tfY2hhbjE0X3NwcmVhZChzdHJ1Y3QgYXRoX2h3ICphaCk7CiBpbnQgYXI5MDAyX2h3X3JmX2NsYWltKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXI5MDAyX2h3X2VuYWJsZV9hc3luY19maWZvKHN0cnVjdCBhdGhfaHcgKmFoKTsKK3ZvaWQgYXI5MDAyX2h3X3VwZGF0ZV9hc3luY19maWZvKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXI5MDAyX2h3X2VuYWJsZV93ZXBfYWdncmVnYXRpb24oc3RydWN0IGF0aF9odyAqYWgpOwogCiAvKgotICogQ29kZSBzcGVjaWZyaWMgdG8gQVI5MDAzLCB3ZSBzdHVmZiB0aGVzZSBoZXJlIHRvIGF2b2lkIGNhbGxiYWNrcworICogQ29kZSBzcGVjaWZpYyB0byBBUjkwMDMsIHdlIHN0dWZmIHRoZXNlIGhlcmUgdG8gYXZvaWQgY2FsbGJhY2tzCiAgKiBmb3Igb2xkZXIgZmFtaWxpZXMKICAqLwotdm9pZCBhcjkwMDNfaHdfc2V0X25mX2xpbWl0cyhzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19od19iYl93YXRjaGRvZ19jb25maWcoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfcmVhZChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19od19iYl93YXRjaGRvZ19kYmdfaW5mbyhzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19wYXByZF9lbmFibGUoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgdmFsKTsKK3ZvaWQgYXI5MDAzX3BhcHJkX3BvcHVsYXRlX3NpbmdsZV90YWJsZShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sIGludCBjaGFpbik7CitpbnQgYXI5MDAzX3BhcHJkX2NyZWF0ZV9jdXJ2ZShzdHJ1Y3QgYXRoX2h3ICphaCwgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICBpbnQgY2hhaW4pOworaW50IGFyOTAwM19wYXByZF9zZXR1cF9nYWluX3RhYmxlKHN0cnVjdCBhdGhfaHcgKmFoLCBpbnQgY2hhaW4pOworaW50IGFyOTAwM19wYXByZF9pbml0X3RhYmxlKHN0cnVjdCBhdGhfaHcgKmFoKTsKK2Jvb2wgYXI5MDAzX3BhcHJkX2lzX2RvbmUoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfaHdfc2V0X3BhcHJkX3R4ZGVzYyhzdHJ1Y3QgYXRoX2h3ICphaCwgdm9pZCAqZHMsIHU4IGNoYWlucyk7CiAKIC8qIEhhcmR3YXJlIGZhbWlseSBvcCBhdHRhY2ggaGVscGVycyAqLwogdm9pZCBhcjUwMDhfaHdfYXR0YWNoX3BoeV9vcHMoc3RydWN0IGF0aF9odyAqYWgpOwpAQCAtOTI2LDggKzk3NywyNCBAQAogdm9pZCBhcjkwMDJfaHdfYXR0YWNoX29wcyhzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGFyOTAwM19od19hdHRhY2hfb3BzKHN0cnVjdCBhdGhfaHcgKmFoKTsKIAorLyoKKyAqIEFOSSB3b3JrIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBhbGwgZmFtaWxpZXMgYnV0IGEgbmV4dAorICogZ2VuZXJhdGlvbiBpbXBsZW1lbnRhdGlvbiBvZiBBTkkgd2lsbCBiZSB1c2VkIG9ubHkgZm9yIEFSOTAwMyBvbmx5CisgKiBmb3Igbm93IGFzIHRoZSBvdGhlciBmYW1pbGllcyBzdGlsbCBuZWVkIHRvIGJlIHRlc3RlZCB3aXRoIHRoZSBzYW1lCisgKiBuZXh0IGdlbmVyYXRpb24gQU5JLiBGZWVsIGZyZWUgdG8gc3RhcnQgdGVzdGluZyBpdCB0aG91Z2ggZm9yIHRoZQorICogb2xkZXIgZmFtaWxpZXMgKEFSNTAwOCwgQVI5MDAxLCBBUjkwMDIpIGJ5IHVzaW5nIG1vZHBhcmFtX2ZvcmNlX25ld19hbmkuCisgKi8KK2V4dGVybiBpbnQgbW9kcGFyYW1fZm9yY2VfbmV3X2FuaTsKK3ZvaWQgYXRoOWtfaHdfYXR0YWNoX2FuaV9vcHNfb2xkKHN0cnVjdCBhdGhfaHcgKmFoKTsKK3ZvaWQgYXRoOWtfaHdfYXR0YWNoX2FuaV9vcHNfbmV3KHN0cnVjdCBhdGhfaHcgKmFoKTsKKwogI2RlZmluZSBBVEhfUENJRV9DQVBfTElOS19DVFJMCTB4NzAKICNkZWZpbmUgQVRIX1BDSUVfQ0FQX0xJTktfTDBTCTEKICNkZWZpbmUgQVRIX1BDSUVfQ0FQX0xJTktfTDEJMgogCisjZGVmaW5lIEFUSDlLX0NMT0NLX1JBVEVfQ0NLCQkyMgorI2RlZmluZSBBVEg5S19DTE9DS19SQVRFXzVHSFpfT0ZETQk0MAorI2RlZmluZSBBVEg5S19DTE9DS19SQVRFXzJHSFpfT0ZETQk0NAorI2RlZmluZSBBVEg5S19DTE9DS19GQVNUX1JBVEVfNUdIWl9PRkRNIDQ0CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKaW5kZXggZDQ1N2NiMy4uMjQzYzE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCkBAIC0zMyw2ICszMywxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG5vaHdjcnlwdCwgbW9kcGFyYW1fbm9od2NyeXB0LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhub2h3Y3J5cHQsICJEaXNhYmxlIGhhcmR3YXJlIGVuY3J5cHRpb24iKTsKIAoraW50IGxlZF9ibGluayA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoYmxpbmssIGxlZF9ibGluaywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYmxpbmssICJFbmFibGUgTEVEIGJsaW5rIG9uIGFjdGl2aXR5Iik7CisKIC8qIFdlIHVzZSB0aGUgaHdfdmFsdWUgYXMgYW4gaW5kZXggaW50byBvdXIgcHJpdmF0ZSBjaGFubmVsIHN0cnVjdHVyZSAqLwogCiAjZGVmaW5lIENIQU4yRyhfZnJlcSwgX2lkeCkgIHsgXApAQCAtMTc1LDE4ICsxNzksNiBAQAogCS53cml0ZSA9IGF0aDlrX2lvd3JpdGUzMiwKIH07CiAKLXN0YXRpYyBpbnQgY291bnRfc3RyZWFtcyh1bnNpZ25lZCBpbnQgY2hhaW5tYXNrLCBpbnQgbWF4KQotewotCWludCBzdHJlYW1zID0gMDsKLQotCWRvIHsKLQkJaWYgKCsrc3RyZWFtcyA9PSBtYXgpCi0JCQlicmVhazsKLQl9IHdoaWxlICgoY2hhaW5tYXNrID0gY2hhaW5tYXNrICYgKGNoYWlubWFzayAtIDEpKSk7Ci0KLQlyZXR1cm4gc3RyZWFtczsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgIEluaXRpYWxpemF0aW9uICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjA4LDYgKzIwMCw5IEBACiAJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0xEUEMpCiAJCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX0xEUENfQ09ESU5HOwogCisJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX1NHSV8yMCkKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworCiAJaHRfaW5mby0+YW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7CiAJaHRfaW5mby0+YW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfODsKIApAQCAtMjI0LDggKzIxOSw4IEBACiAKIAkvKiBzZXQgdXAgc3VwcG9ydGVkIG1jcyBzZXQgKi8KIAltZW1zZXQoJmh0X2luZm8tPm1jcywgMCwgc2l6ZW9mKGh0X2luZm8tPm1jcykpOwotCXR4X3N0cmVhbXMgPSBjb3VudF9zdHJlYW1zKGNvbW1vbi0+dHhfY2hhaW5tYXNrLCBtYXhfc3RyZWFtcyk7Ci0Jcnhfc3RyZWFtcyA9IGNvdW50X3N0cmVhbXMoY29tbW9uLT5yeF9jaGFpbm1hc2ssIG1heF9zdHJlYW1zKTsKKwl0eF9zdHJlYW1zID0gYXRoOWtfY21uX2NvdW50X3N0cmVhbXMoY29tbW9uLT50eF9jaGFpbm1hc2ssIG1heF9zdHJlYW1zKTsKKwlyeF9zdHJlYW1zID0gYXRoOWtfY21uX2NvdW50X3N0cmVhbXMoY29tbW9uLT5yeF9jaGFpbm1hc2ssIG1heF9zdHJlYW1zKTsKIAogCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfQ09ORklHLAogCQkgICJUWCBzdHJlYW1zICVkLCBSWCBzdHJlYW1zOiAlZFxuIiwKQEAgLTM4OCwzNiArMzgzLDE0IEBACiAJZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+a2V5bWF4OyBpKyspCiAJCWF0aDlrX2h3X2tleXJlc2V0KHNjLT5zY19haCwgKHUxNikgaSk7CiAKLQlpZiAoYXRoOWtfaHdfZ2V0Y2FwYWJpbGl0eShzYy0+c2NfYWgsIEFUSDlLX0NBUF9DSVBIRVIsCi0JCQkJICAgQVRIOUtfQ0lQSEVSX1RLSVAsIE5VTEwpKSB7Ci0JCS8qCi0JCSAqIFdoZXRoZXIgd2Ugc2hvdWxkIGVuYWJsZSBoL3cgVEtJUCBNSUMuCi0JCSAqIFhYWDogaWYgd2UgZG9uJ3Qgc3VwcG9ydCBXTUUgVEtJUCBNSUMsIHRoZW4gd2Ugd291bGRuJ3QKLQkJICogcmVwb3J0IFdNTSBjYXBhYmxlLCBzbyBpdCdzIGFsd2F5cyBzYWZlIHRvIHR1cm4gb24KLQkJICogVEtJUCBNSUMgaW4gdGhpcyBjYXNlLgotCQkgKi8KLQkJYXRoOWtfaHdfc2V0Y2FwYWJpbGl0eShzYy0+c2NfYWgsIEFUSDlLX0NBUF9US0lQX01JQywgMCwgMSwgTlVMTCk7Ci0JfQotCiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHRoZSBzZXBhcmF0ZSBrZXkgY2FjaGUgZW50cmllcwogCSAqIGFyZSByZXF1aXJlZCB0byBoYW5kbGUgYm90aCB0eCtyeCBNSUMga2V5cy4KIAkgKiBXaXRoIHNwbGl0IG1pYyBrZXlzIHRoZSBudW1iZXIgb2Ygc3RhdGlvbnMgaXMgbGltaXRlZAogCSAqIHRvIDI3IG90aGVyd2lzZSA1OS4KIAkgKi8KLQlpZiAoYXRoOWtfaHdfZ2V0Y2FwYWJpbGl0eShzYy0+c2NfYWgsIEFUSDlLX0NBUF9DSVBIRVIsCi0JCQkJICAgQVRIOUtfQ0lQSEVSX1RLSVAsIE5VTEwpCi0JICAgICYmIGF0aDlrX2h3X2dldGNhcGFiaWxpdHkoc2MtPnNjX2FoLCBBVEg5S19DQVBfQ0lQSEVSLAotCQkJCSAgICAgIEFUSDlLX0NJUEhFUl9NSUMsIE5VTEwpCi0JICAgICYmIGF0aDlrX2h3X2dldGNhcGFiaWxpdHkoc2MtPnNjX2FoLCBBVEg5S19DQVBfVEtJUF9TUExJVCwKLQkJCQkgICAgICAwLCBOVUxMKSkKKwlpZiAoIShzYy0+c2NfYWgtPm1pc2NfbW9kZSAmIEFSX1BDVV9NSUNfTkVXX0xPQ19FTkEpKQogCQljb21tb24tPnNwbGl0bWljID0gMTsKLQotCS8qIHR1cm4gb24gbWNhc3Qga2V5IHNlYXJjaCBpZiBwb3NzaWJsZSAqLwotCWlmICghYXRoOWtfaHdfZ2V0Y2FwYWJpbGl0eShzYy0+c2NfYWgsIEFUSDlLX0NBUF9NQ0FTVF9LRVlTUkNILCAwLCBOVUxMKSkKLQkJKHZvaWQpYXRoOWtfaHdfc2V0Y2FwYWJpbGl0eShzYy0+c2NfYWgsIEFUSDlLX0NBUF9NQ0FTVF9LRVlTUkNILAotCQkJCQkgICAgIDEsIDEsIE5VTEwpOwotCiB9CiAKIHN0YXRpYyBpbnQgYXRoOWtfaW5pdF9idGNvZXgoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCkBAIC00MzUsNyArNDA4LDcgQEAKIAkJciA9IGF0aF9pbml0X2J0Y29leF90aW1lcihzYyk7CiAJCWlmIChyKQogCQkJcmV0dXJuIC0xOwotCQlxbnVtID0gYXRoX3R4X2dldF9xbnVtKHNjLCBBVEg5S19UWF9RVUVVRV9EQVRBLCBBVEg5S19XTUVfQUNfQkUpOworCQlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbV01FX0FDX0JFXTsKIAkJYXRoOWtfaHdfaW5pdF9idGNvZXhfaHcoc2MtPnNjX2FoLCBxbnVtKTsKIAkJc2MtPmJ0Y29leC5idF9zdG9tcF90eXBlID0gQVRIX0JUQ09FWF9TVE9NUF9MT1c7CiAJCWJyZWFrOwpAQCAtNDcyLDIzICs0NDUsMjMgQEAKIAlzYy0+Y29uZmlnLmNhYnFSZWFkeXRpbWUgPSBBVEhfQ0FCUV9SRUFEWV9USU1FOwogCWF0aF9jYWJxX3VwZGF0ZShzYyk7CiAKLQlpZiAoIWF0aF90eF9zZXR1cChzYywgQVRIOUtfV01FX0FDX0JLKSkgeworCWlmICghYXRoX3R4X3NldHVwKHNjLCBXTUVfQUNfQkspKSB7CiAJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRkFUQUwsCiAJCQkgICJVbmFibGUgdG8gc2V0dXAgeG1pdCBxdWV1ZSBmb3IgQksgdHJhZmZpY1xuIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCWlmICghYXRoX3R4X3NldHVwKHNjLCBBVEg5S19XTUVfQUNfQkUpKSB7CisJaWYgKCFhdGhfdHhfc2V0dXAoc2MsIFdNRV9BQ19CRSkpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBzZXR1cCB4bWl0IHF1ZXVlIGZvciBCRSB0cmFmZmljXG4iKTsKIAkJZ290byBlcnI7CiAJfQotCWlmICghYXRoX3R4X3NldHVwKHNjLCBBVEg5S19XTUVfQUNfVkkpKSB7CisJaWYgKCFhdGhfdHhfc2V0dXAoc2MsIFdNRV9BQ19WSSkpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBzZXR1cCB4bWl0IHF1ZXVlIGZvciBWSSB0cmFmZmljXG4iKTsKIAkJZ290byBlcnI7CiAJfQotCWlmICghYXRoX3R4X3NldHVwKHNjLCBBVEg5S19XTUVfQUNfVk8pKSB7CisJaWYgKCFhdGhfdHhfc2V0dXAoc2MsIFdNRV9BQ19WTykpIHsKIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwKIAkJCSAgIlVuYWJsZSB0byBzZXR1cCB4bWl0IHF1ZXVlIGZvciBWTyB0cmFmZmljXG4iKTsKIAkJZ290byBlcnI7CkBAIC03NDUsNiArNzE4LDggQEAKIAkJCWdvdG8gZXJyb3Jfd29ybGQ7CiAJfQogCisJSU5JVF9XT1JLKCZzYy0+aHdfY2hlY2tfd29yaywgYXRoX2h3X2NoZWNrKTsKKwlJTklUX1dPUksoJnNjLT5wYXByZF93b3JrLCBhdGhfcGFwcmRfY2FsaWJyYXRlKTsKIAlJTklUX1dPUksoJnNjLT5jaGFuX3dvcmssIGF0aDlrX3dpcGh5X2NoYW5fd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnNjLT53aXBoeV93b3JrLCBhdGg5a193aXBoeV93b3JrKTsKIAlzYy0+d2lwaHlfc2NoZWR1bGVyX2ludCA9IG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKQEAgLTgxMiwxMiArNzg3LDEyIEBACiAJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGFwaHktPmh3KTsKIAkJaWVlZTgwMjExX2ZyZWVfaHcoYXBoeS0+aHcpOwogCX0KLQlrZnJlZShzYy0+c2VjX3dpcGh5KTsKIAogCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGh3KTsKIAlhdGhfcnhfY2xlYW51cChzYyk7CiAJYXRoX3R4X2NsZWFudXAoc2MpOwogCWF0aDlrX2RlaW5pdF9zb2Z0YyhzYyk7CisJa2ZyZWUoc2MtPnNlY193aXBoeSk7CiB9CiAKIHZvaWQgYXRoX2Rlc2NkbWFfY2xlYW51cChzdHJ1Y3QgYXRoX3NvZnRjICpzYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYwppbmRleCAwZTQyNWNiLi5lOTU1YmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiaHctb3BzLmgiCiAKIHN0YXRpYyB2b2lkIGF0aDlrX2h3X3NldF90eHFfaW50ZXJydXB0cyhzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gKnFpKQpAQCAtNTU0LDggKzU1NSwxMyBAQAogCQlSRUdXUklURV9CVUZGRVJfRkxVU0goYWgpOwogCQlESVNBQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CiAKLQkJLyogY3dtaW4gYW5kIGN3bWF4IHNob3VsZCBiZSAwIGZvciBiZWFjb24gcXVldWUgKi8KLQkJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKKwkJLyoKKwkJICogY3dtaW4gYW5kIGN3bWF4IHNob3VsZCBiZSAwIGZvciBiZWFjb24gcXVldWUKKwkJICogYnV0IG5vdCBmb3IgSUJTUyBhcyB3ZSB3b3VsZCBjcmVhdGUgYW4gaW1iYWxhbmNlCisJCSAqIG9uIGJlYWNvbmluZyBmYWlybmVzcyBmb3IgcGFydGljaXBhdGluZyBub2Rlcy4KKwkJICovCisJCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpICYmCisJCSAgICBhaC0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX0RMQ0xfSUZTKHEpLCBTTSgwLCBBUl9EX0xDTF9JRlNfQ1dNSU4pCiAJCQkJICB8IFNNKDAsIEFSX0RfTENMX0lGU19DV01BWCkKIAkJCQkgIHwgU00ocWktPnRxaV9haWZzLCBBUl9EX0xDTF9JRlNfQUlGUykpOwpAQCAtNzU2LDExICs3NjIsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woYXRoOWtfaHdfcHV0cnhidWYpOwogCi12b2lkIGF0aDlrX2h3X3N0YXJ0cGN1cmVjZWl2ZShzdHJ1Y3QgYXRoX2h3ICphaCkKK3ZvaWQgYXRoOWtfaHdfc3RhcnRwY3VyZWNlaXZlKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGlzX3NjYW5uaW5nKQogewogCWF0aDlrX2VuYWJsZV9taWJfY291bnRlcnMoYWgpOwogCi0JYXRoOWtfYW5pX3Jlc2V0KGFoKTsKKwlhdGg5a19hbmlfcmVzZXQoYWgsIGlzX3NjYW5uaW5nKTsKIAogCVJFR19DTFJfQklUKGFoLCBBUl9ESUFHX1NXLCAoQVJfRElBR19SWF9ESVMgfCBBUl9ESUFHX1JYX0FCT1JUKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmgKaW5kZXggMDBmM2UwYy4uMjYzMzg5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuaApAQCAtNDg1LDYgKzQ4NSw5IEBACiAjZGVmaW5lIEFSX1R4UlNTSUNvbWJpbmVkICAgMHhmZjAwMDAwMAogI2RlZmluZSBBUl9UeFJTU0lDb21iaW5lZF9TIDI0CiAKKyNkZWZpbmUgQVJfVHhUaWQJMHhmMDAwMDAwMAorI2RlZmluZSBBUl9UeFRpZF9TCTI4CisKICNkZWZpbmUgQVJfVHhFVk0wICAgICAgICAgICBkc190eHN0YXR1czUKICNkZWZpbmUgQVJfVHhFVk0xICAgICAgICAgICBkc190eHN0YXR1czYKICNkZWZpbmUgQVJfVHhFVk0yICAgICAgICAgICBkc190eHN0YXR1czcKQEAgLTU3NywxMyArNTgwLDggQEAKIAogI2RlZmluZQlBVEg5S19OVU1fVFhfUVVFVUVTIDEwCiAKLWVudW0gYXRoOWtfdHhfcXVldWVfc3VidHlwZSB7Ci0JQVRIOUtfV01FX0FDX0JLID0gMCwKLQlBVEg5S19XTUVfQUNfQkUsCi0JQVRIOUtfV01FX0FDX1ZJLAotCUFUSDlLX1dNRV9BQ19WTywKLQlBVEg5S19XTUVfVVBTRAotfTsKKy8qIFVzZWQgYXMgYSBxdWV1ZSBzdWJ0eXBlIGluc3RlYWQgb2YgYSBXTU0gQUMgKi8KKyNkZWZpbmUgQVRIOUtfV01FX1VQU0QJNAogCiBlbnVtIGF0aDlrX3R4X3F1ZXVlX2ZsYWdzIHsKIAlUWFFfRkxBR19UWE9LSU5UX0VOQUJMRSA9IDB4MDAwMSwKQEAgLTYxNyw3ICs2MTUsNyBAQAogc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gewogCXUzMiB0cWlfdmVyOwogCWVudW0gYXRoOWtfdHhfcXVldWUgdHFpX3R5cGU7Ci0JZW51bSBhdGg5a190eF9xdWV1ZV9zdWJ0eXBlIHRxaV9zdWJ0eXBlOworCWludCB0cWlfc3VidHlwZTsKIAllbnVtIGF0aDlrX3R4X3F1ZXVlX2ZsYWdzIHRxaV9xZmxhZ3M7CiAJdTMyIHRxaV9wcmlvcml0eTsKIAl1MzIgdHFpX2FpZnM7CkBAIC03MTUsNyArNzEzLDcgQEAKIAkJCSAgdTMyIHNpemUsIHUzMiBmbGFncyk7CiBib29sIGF0aDlrX2h3X3NldHJ4YWJvcnQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgc2V0KTsKIHZvaWQgYXRoOWtfaHdfcHV0cnhidWYoc3RydWN0IGF0aF9odyAqYWgsIHUzMiByeGRwKTsKLXZvaWQgYXRoOWtfaHdfc3RhcnRwY3VyZWNlaXZlKHN0cnVjdCBhdGhfaHcgKmFoKTsKK3ZvaWQgYXRoOWtfaHdfc3RhcnRwY3VyZWNlaXZlKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGlzX3NjYW5uaW5nKTsKIHZvaWQgYXRoOWtfaHdfc3RvcHBjdXJlY3Yoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19hYm9ydHBjdXJlY3Yoc3RydWN0IGF0aF9odyAqYWgpOwogYm9vbCBhdGg5a19od19zdG9wZG1hcmVjdihzdHJ1Y3QgYXRoX2h3ICphaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwppbmRleCAxZTJhNjhlLi4wNDI5ZGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKQEAgLTUxLDEzICs1MSwxMSBAQAogc3RhdGljIHZvaWQgYXRoX3VwZGF0ZV90eHBvdyhzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKLQl1MzIgdHhwb3c7CiAKIAlpZiAoc2MtPmN1cnR4cG93ICE9IHNjLT5jb25maWcudHhwb3dsaW1pdCkgewogCQlhdGg5a19od19zZXRfdHhwb3dlcmxpbWl0KGFoLCBzYy0+Y29uZmlnLnR4cG93bGltaXQpOwogCQkvKiByZWFkIGJhY2sgaW4gY2FzZSB2YWx1ZSBpcyBjbGFtcGVkICovCi0JCWF0aDlrX2h3X2dldGNhcGFiaWxpdHkoYWgsIEFUSDlLX0NBUF9UWFBPVywgMSwgJnR4cG93KTsKLQkJc2MtPmN1cnR4cG93ID0gdHhwb3c7CisJCXNjLT5jdXJ0eHBvdyA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpLT5wb3dlcl9saW1pdDsKIAl9CiB9CiAKQEAgLTIzMiw2ICsyMzAsMTE0IEBACiAJcmV0dXJuIHI7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aF9wYXByZF9hY3RpdmF0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlpbnQgY2hhaW47CisKKwlpZiAoIWFoLT5jdXJjaGFuLT5wYXByZF9kb25lKQorCQlyZXR1cm47CisKKwlhdGg5a19wc193YWtldXAoc2MpOworCWZvciAoY2hhaW4gPSAwOyBjaGFpbiA8IEFSOTMwMF9NQVhfQ0hBSU5TOyBjaGFpbisrKSB7CisJCWlmICghKGFoLT5jYXBzLnR4X2NoYWlubWFzayAmIEJJVChjaGFpbikpKQorCQkJY29udGludWU7CisKKwkJYXI5MDAzX3BhcHJkX3BvcHVsYXRlX3NpbmdsZV90YWJsZShhaCwgYWgtPmN1cmNoYW4sIGNoYWluKTsKKwl9CisKKwlhcjkwMDNfcGFwcmRfZW5hYmxlKGFoLCB0cnVlKTsKKwlhdGg5a19wc19yZXN0b3JlKHNjKTsKK30KKwordm9pZCBhdGhfcGFwcmRfY2FsaWJyYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRoX3NvZnRjLCBwYXByZF93b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHNjLT5odzsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsKKwlpbnQgYmFuZCA9IGh3LT5jb25mLmNoYW5uZWwtPmJhbmQ7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSAmc2MtPnNiYW5kc1tiYW5kXTsKKwlzdHJ1Y3QgYXRoX3R4X2NvbnRyb2wgdHhjdGw7CisJaW50IHFudW0sIGZ0eXBlOworCWludCBjaGFpbl9vayA9IDA7CisJaW50IGNoYWluOworCWludCBsZW4gPSAxODAwOworCWludCB0aW1lX2xlZnQ7CisJaW50IGk7CisKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCXNrYl9wdXQoc2tiLCBsZW4pOworCW1lbXNldChza2ItPmRhdGEsIDAsIGxlbik7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCWZ0eXBlID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkM7CisJaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoZnR5cGUpOworCWhkci0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigxMCk7CisJbWVtY3B5KGhkci0+YWRkcjEsIGh3LT53aXBoeS0+cGVybV9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIGh3LT53aXBoeS0+cGVybV9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjMsIGh3LT53aXBoeS0+cGVybV9hZGRyLCBFVEhfQUxFTik7CisKKwltZW1zZXQoJnR4Y3RsLCAwLCBzaXplb2YodHhjdGwpKTsKKwlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbV01FX0FDX0JFXTsKKwl0eGN0bC50eHEgPSAmc2MtPnR4LnR4cVtxbnVtXTsKKworCWF0aDlrX3BzX3dha2V1cChzYyk7CisJYXI5MDAzX3BhcHJkX2luaXRfdGFibGUoYWgpOworCWZvciAoY2hhaW4gPSAwOyBjaGFpbiA8IEFSOTMwMF9NQVhfQ0hBSU5TOyBjaGFpbisrKSB7CisJCWlmICghKGFoLT5jYXBzLnR4X2NoYWlubWFzayAmIEJJVChjaGFpbikpKQorCQkJY29udGludWU7CisKKwkJY2hhaW5fb2sgPSAwOworCQltZW1zZXQodHhfaW5mbywgMCwgc2l6ZW9mKCp0eF9pbmZvKSk7CisJCXR4X2luZm8tPmJhbmQgPSBiYW5kOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXR4X2luZm8tPmNvbnRyb2wucmF0ZXNbaV0uaWR4ID0gc2JhbmQtPm5fYml0cmF0ZXMgLSAxOworCQkJdHhfaW5mby0+Y29udHJvbC5yYXRlc1tpXS5jb3VudCA9IDY7CisJCX0KKworCQlpbml0X2NvbXBsZXRpb24oJnNjLT5wYXByZF9jb21wbGV0ZSk7CisJCWFyOTAwM19wYXByZF9zZXR1cF9nYWluX3RhYmxlKGFoLCBjaGFpbik7CisJCXR4Y3RsLnBhcHJkID0gQklUKGNoYWluKTsKKwkJaWYgKGF0aF90eF9zdGFydChodywgc2tiLCAmdHhjdGwpICE9IDApCisJCQlicmVhazsKKworCQl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNjLT5wYXByZF9jb21wbGV0ZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKEFUSF9QQVBSRF9USU1FT1VUKSk7CisJCWlmICghdGltZV9sZWZ0KSB7CisJCQlhdGhfcHJpbnQoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQkJICAiVGltZW91dCB3YWl0aW5nIGZvciBwYXByZCB0cmFpbmluZyBvbiAiCisJCQkJICAiVFggY2hhaW4gJWRcbiIsCisJCQkJICBjaGFpbik7CisJCQlnb3RvIGZhaWxfcGFwcmQ7CisJCX0KKworCQlpZiAoIWFyOTAwM19wYXByZF9pc19kb25lKGFoKSkKKwkJCWJyZWFrOworCisJCWlmIChhcjkwMDNfcGFwcmRfY3JlYXRlX2N1cnZlKGFoLCBhaC0+Y3VyY2hhbiwgY2hhaW4pICE9IDApCisJCQlicmVhazsKKworCQljaGFpbl9vayA9IDE7CisJfQorCWtmcmVlX3NrYihza2IpOworCisJaWYgKGNoYWluX29rKSB7CisJCWFoLT5jdXJjaGFuLT5wYXByZF9kb25lID0gdHJ1ZTsKKwkJYXRoX3BhcHJkX2FjdGl2YXRlKHNjKTsKKwl9CisKK2ZhaWxfcGFwcmQ6CisJYXRoOWtfcHNfcmVzdG9yZShzYyk7Cit9CisKIC8qCiAgKiAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHRoZSBwZXJpb2RpYyBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiBmdW5jdGlvbgogICogIHRoYXQgaXMgdXNlZCB0byBhZGp1c3QgYW5kIG9wdGltaXplIHRoZSBjaGlwIHBlcmZvcm1hbmNlLiAgVGhpcwpAQCAtMjg1LDcgKzM5MSw4IEBACiAJfQogCiAJLyogVmVyaWZ5IHdoZXRoZXIgd2UgbXVzdCBjaGVjayBBTkkgKi8KLQlpZiAoKHRpbWVzdGFtcCAtIGNvbW1vbi0+YW5pLmNoZWNrYW5pX3RpbWVyKSA+PSBBVEhfQU5JX1BPTExJTlRFUlZBTCkgeworCWlmICgodGltZXN0YW1wIC0gY29tbW9uLT5hbmkuY2hlY2thbmlfdGltZXIpID49CisJICAgICBhaC0+Y29uZmlnLmFuaV9wb2xsX2ludGVydmFsKSB7CiAJCWFuaWZsYWcgPSB0cnVlOwogCQljb21tb24tPmFuaS5jaGVja2FuaV90aW1lciA9IHRpbWVzdGFtcDsKIAl9CkBAIC0zMjYsMTUgKzQzMywyNCBAQAogCSovCiAJY2FsX2ludGVydmFsID0gQVRIX0xPTkdfQ0FMSU5URVJWQUw7CiAJaWYgKHNjLT5zY19haC0+Y29uZmlnLmVuYWJsZV9hbmkpCi0JCWNhbF9pbnRlcnZhbCA9IG1pbihjYWxfaW50ZXJ2YWwsICh1MzIpQVRIX0FOSV9QT0xMSU5URVJWQUwpOworCQljYWxfaW50ZXJ2YWwgPSBtaW4oY2FsX2ludGVydmFsLAorCQkJCSAgICh1MzIpYWgtPmNvbmZpZy5hbmlfcG9sbF9pbnRlcnZhbCk7CiAJaWYgKCFjb21tb24tPmFuaS5jYWxkb25lKQogCQljYWxfaW50ZXJ2YWwgPSBtaW4oY2FsX2ludGVydmFsLCAodTMyKXNob3J0X2NhbF9pbnRlcnZhbCk7CiAKIAltb2RfdGltZXIoJmNvbW1vbi0+YW5pLnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhjYWxfaW50ZXJ2YWwpKTsKKwlpZiAoKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX1BBUFJEKSAmJgorCSAgICAhKHNjLT5zY19mbGFncyAmIFNDX09QX1NDQU5OSU5HKSkgeworCQlpZiAoIXNjLT5zY19haC0+Y3VyY2hhbi0+cGFwcmRfZG9uZSkKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHNjLT5odywgJnNjLT5wYXByZF93b3JrKTsKKwkJZWxzZQorCQkJYXRoX3BhcHJkX2FjdGl2YXRlKHNjKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF9zdGFydF9hbmkoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbikKIHsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IGNvbW1vbi0+YWg7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gKHN0cnVjdCBhdGhfc29mdGMgKikgY29tbW9uLT5wcml2OwogCkBAIC0zNDYsNyArNDYyLDggQEAKIAljb21tb24tPmFuaS5jaGVja2FuaV90aW1lciA9IHRpbWVzdGFtcDsKIAogCW1vZF90aW1lcigmY29tbW9uLT5hbmkudGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVRIX0FOSV9QT0xMSU5URVJWQUwpKTsKKwkJICBqaWZmaWVzICsKKwkJCW1zZWNzX3RvX2ppZmZpZXMoKHUzMilhaC0+Y29uZmlnLmFuaV9wb2xsX2ludGVydmFsKSk7CiB9CiAKIC8qCkBAIC0zOTgsNiArNTE1LDI1IEBACiAJCWF0aF90eF9ub2RlX2NsZWFudXAoc2MsIGFuKTsKIH0KIAordm9pZCBhdGhfaHdfY2hlY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGhfc29mdGMsIGh3X2NoZWNrX3dvcmspOworCWludCBpOworCisJYXRoOWtfcHNfd2FrZXVwKHNjKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKGF0aDlrX2h3X2NoZWNrX2FsaXZlKHNjLT5zY19haCkpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoMSk7CisJfQorCWF0aF9yZXNldChzYywgZmFsc2UpOworCitvdXQ6CisJYXRoOWtfcHNfcmVzdG9yZShzYyk7Cit9CisKIHZvaWQgYXRoOWtfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSAoc3RydWN0IGF0aF9zb2Z0YyAqKWRhdGE7CkBAIC00MDksMTMgKzU0NSwxNSBAQAogCiAJYXRoOWtfcHNfd2FrZXVwKHNjKTsKIAotCWlmICgoc3RhdHVzICYgQVRIOUtfSU5UX0ZBVEFMKSB8fAotCSAgICAhYXRoOWtfaHdfY2hlY2tfYWxpdmUoYWgpKSB7CisJaWYgKHN0YXR1cyAmIEFUSDlLX0lOVF9GQVRBTCkgewogCQlhdGhfcmVzZXQoc2MsIGZhbHNlKTsKIAkJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAJCXJldHVybjsKIAl9CiAKKwlpZiAoIWF0aDlrX2h3X2NoZWNrX2FsaXZlKGFoKSkKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPmh3X2NoZWNrX3dvcmspOworCiAJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkKIAkJcnhtYXNrID0gKEFUSDlLX0lOVF9SWEhQIHwgQVRIOUtfSU5UX1JYTFAgfCBBVEg5S19JTlRfUlhFT0wgfAogCQkJICBBVEg5S19JTlRfUlhPUk4pOwpAQCAtNTI0LDYgKzY2MiwxMiBAQAogCSAgICAhKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkpKQogCQlnb3RvIGNoaXBfcmVzZXQ7CiAKKwlpZiAoKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgJiYKKwkgICAgKHN0YXR1cyAmIEFUSDlLX0lOVF9CQl9XQVRDSERPRykpIHsKKwkJYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2RiZ19pbmZvKGFoKTsKKwkJZ290byBjaGlwX3Jlc2V0OworCX0KKwogCWlmIChzdGF0dXMgJiBBVEg5S19JTlRfU1dCQSkKIAkJdGFza2xldF9zY2hlZHVsZSgmc2MtPmJjb25fdGFza2xldCk7CiAKQEAgLTYxOSwyMzQgKzc2Myw2IEBACiAJcmV0dXJuIGNoYW5tb2RlOwogfQogCi1zdGF0aWMgaW50IGF0aF9zZXRrZXlfdGtpcChzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLCB1MTYga2V5aXgsIGNvbnN0IHU4ICprZXksCi0JCQkgICBzdHJ1Y3QgYXRoOWtfa2V5dmFsICpoaywgY29uc3QgdTggKmFkZHIsCi0JCQkgICBib29sIGF1dGhlbnRpY2F0b3IpCi17Ci0Jc3RydWN0IGF0aF9odyAqYWggPSBjb21tb24tPmFoOwotCWNvbnN0IHU4ICprZXlfcnhtaWM7Ci0JY29uc3QgdTggKmtleV90eG1pYzsKLQotCWtleV90eG1pYyA9IGtleSArIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9UWF9NSUNfS0VZOwotCWtleV9yeG1pYyA9IGtleSArIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZOwotCi0JaWYgKGFkZHIgPT0gTlVMTCkgewotCQkvKgotCQkgKiBHcm91cCBrZXkgaW5zdGFsbGF0aW9uIC0gb25seSB0d28ga2V5IGNhY2hlIGVudHJpZXMgYXJlIHVzZWQKLQkJICogcmVnYXJkbGVzcyBvZiBzcGxpdG1pYyBjYXBhYmlsaXR5IHNpbmNlIGdyb3VwIGtleSBpcyBvbmx5Ci0JCSAqIHVzZWQgZWl0aGVyIGZvciBUWCBvciBSWC4KLQkJICovCi0JCWlmIChhdXRoZW50aWNhdG9yKSB7Ci0JCQltZW1jcHkoaGstPmt2X21pYywga2V5X3R4bWljLCBzaXplb2YoaGstPmt2X21pYykpOwotCQkJbWVtY3B5KGhrLT5rdl90eG1pYywga2V5X3R4bWljLCBzaXplb2YoaGstPmt2X21pYykpOwotCQl9IGVsc2UgewotCQkJbWVtY3B5KGhrLT5rdl9taWMsIGtleV9yeG1pYywgc2l6ZW9mKGhrLT5rdl9taWMpKTsKLQkJCW1lbWNweShoay0+a3ZfdHhtaWMsIGtleV9yeG1pYywgc2l6ZW9mKGhrLT5rdl9taWMpKTsKLQkJfQotCQlyZXR1cm4gYXRoOWtfaHdfc2V0X2tleWNhY2hlX2VudHJ5KGFoLCBrZXlpeCwgaGssIGFkZHIpOwotCX0KLQlpZiAoIWNvbW1vbi0+c3BsaXRtaWMpIHsKLQkJLyogVFggYW5kIFJYIGtleXMgc2hhcmUgdGhlIHNhbWUga2V5IGNhY2hlIGVudHJ5LiAqLwotCQltZW1jcHkoaGstPmt2X21pYywga2V5X3J4bWljLCBzaXplb2YoaGstPmt2X21pYykpOwotCQltZW1jcHkoaGstPmt2X3R4bWljLCBrZXlfdHhtaWMsIHNpemVvZihoay0+a3ZfdHhtaWMpKTsKLQkJcmV0dXJuIGF0aDlrX2h3X3NldF9rZXljYWNoZV9lbnRyeShhaCwga2V5aXgsIGhrLCBhZGRyKTsKLQl9Ci0KLQkvKiBTZXBhcmF0ZSBrZXkgY2FjaGUgZW50cmllcyBmb3IgVFggYW5kIFJYICovCi0KLQkvKiBUWCBrZXkgZ29lcyBhdCBmaXJzdCBpbmRleCwgUlgga2V5IGF0ICszMi4gKi8KLQltZW1jcHkoaGstPmt2X21pYywga2V5X3R4bWljLCBzaXplb2YoaGstPmt2X21pYykpOwotCWlmICghYXRoOWtfaHdfc2V0X2tleWNhY2hlX2VudHJ5KGFoLCBrZXlpeCwgaGssIE5VTEwpKSB7Ci0JCS8qIFRYIE1JQyBlbnRyeSBmYWlsZWQuIE5vIG5lZWQgdG8gcHJvY2VlZCBmdXJ0aGVyICovCi0JCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRkFUQUwsCi0JCQkgICJTZXR0aW5nIFRYIE1JQyBLZXkgRmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbWVtY3B5KGhrLT5rdl9taWMsIGtleV9yeG1pYywgc2l6ZW9mKGhrLT5rdl9taWMpKTsKLQkvKiBYWFggZGVsZXRlIHR4IGtleSBvbiBmYWlsdXJlPyAqLwotCXJldHVybiBhdGg5a19od19zZXRfa2V5Y2FjaGVfZW50cnkoYWgsIGtleWl4ICsgMzIsIGhrLCBhZGRyKTsKLX0KLQotc3RhdGljIGludCBhdGhfcmVzZXJ2ZV9rZXlfY2FjaGVfc2xvdF90a2lwKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBJRUVFODAyMTFfV0VQX05LSUQ7IGkgPCBjb21tb24tPmtleW1heCAvIDI7IGkrKykgewotCQlpZiAodGVzdF9iaXQoaSwgY29tbW9uLT5rZXltYXApIHx8Ci0JCSAgICB0ZXN0X2JpdChpICsgNjQsIGNvbW1vbi0+a2V5bWFwKSkKLQkJCWNvbnRpbnVlOyAvKiBBdCBsZWFzdCBvbmUgcGFydCBvZiBUS0lQIGtleSBhbGxvY2F0ZWQgKi8KLQkJaWYgKGNvbW1vbi0+c3BsaXRtaWMgJiYKLQkJICAgICh0ZXN0X2JpdChpICsgMzIsIGNvbW1vbi0+a2V5bWFwKSB8fAotCQkgICAgIHRlc3RfYml0KGkgKyA2NCArIDMyLCBjb21tb24tPmtleW1hcCkpKQotCQkJY29udGludWU7IC8qIEF0IGxlYXN0IG9uZSBwYXJ0IG9mIFRLSVAga2V5IGFsbG9jYXRlZCAqLwotCi0JCS8qIEZvdW5kIGEgZnJlZSBzbG90IGZvciBhIFRLSVAga2V5ICovCi0JCXJldHVybiBpOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoX3Jlc2VydmVfa2V5X2NhY2hlX3Nsb3Qoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbikKLXsKLQlpbnQgaTsKLQotCS8qIEZpcnN0LCB0cnkgdG8gZmluZCBzbG90cyB0aGF0IHdvdWxkIG5vdCBiZSBhdmFpbGFibGUgZm9yIFRLSVAuICovCi0JaWYgKGNvbW1vbi0+c3BsaXRtaWMpIHsKLQkJZm9yIChpID0gSUVFRTgwMjExX1dFUF9OS0lEOyBpIDwgY29tbW9uLT5rZXltYXggLyA0OyBpKyspIHsKLQkJCWlmICghdGVzdF9iaXQoaSwgY29tbW9uLT5rZXltYXApICYmCi0JCQkgICAgKHRlc3RfYml0KGkgKyAzMiwgY29tbW9uLT5rZXltYXApIHx8Ci0JCQkgICAgIHRlc3RfYml0KGkgKyA2NCwgY29tbW9uLT5rZXltYXApIHx8Ci0JCQkgICAgIHRlc3RfYml0KGkgKyA2NCArIDMyLCBjb21tb24tPmtleW1hcCkpKQotCQkJCXJldHVybiBpOwotCQkJaWYgKCF0ZXN0X2JpdChpICsgMzIsIGNvbW1vbi0+a2V5bWFwKSAmJgotCQkJICAgICh0ZXN0X2JpdChpLCBjb21tb24tPmtleW1hcCkgfHwKLQkJCSAgICAgdGVzdF9iaXQoaSArIDY0LCBjb21tb24tPmtleW1hcCkgfHwKLQkJCSAgICAgdGVzdF9iaXQoaSArIDY0ICsgMzIsIGNvbW1vbi0+a2V5bWFwKSkpCi0JCQkJcmV0dXJuIGkgKyAzMjsKLQkJCWlmICghdGVzdF9iaXQoaSArIDY0LCBjb21tb24tPmtleW1hcCkgJiYKLQkJCSAgICAodGVzdF9iaXQoaSAsIGNvbW1vbi0+a2V5bWFwKSB8fAotCQkJICAgICB0ZXN0X2JpdChpICsgMzIsIGNvbW1vbi0+a2V5bWFwKSB8fAotCQkJICAgICB0ZXN0X2JpdChpICsgNjQgKyAzMiwgY29tbW9uLT5rZXltYXApKSkKLQkJCQlyZXR1cm4gaSArIDY0OwotCQkJaWYgKCF0ZXN0X2JpdChpICsgNjQgKyAzMiwgY29tbW9uLT5rZXltYXApICYmCi0JCQkgICAgKHRlc3RfYml0KGksIGNvbW1vbi0+a2V5bWFwKSB8fAotCQkJICAgICB0ZXN0X2JpdChpICsgMzIsIGNvbW1vbi0+a2V5bWFwKSB8fAotCQkJICAgICB0ZXN0X2JpdChpICsgNjQsIGNvbW1vbi0+a2V5bWFwKSkpCi0JCQkJcmV0dXJuIGkgKyA2NCArIDMyOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gSUVFRTgwMjExX1dFUF9OS0lEOyBpIDwgY29tbW9uLT5rZXltYXggLyAyOyBpKyspIHsKLQkJCWlmICghdGVzdF9iaXQoaSwgY29tbW9uLT5rZXltYXApICYmCi0JCQkgICAgdGVzdF9iaXQoaSArIDY0LCBjb21tb24tPmtleW1hcCkpCi0JCQkJcmV0dXJuIGk7Ci0JCQlpZiAodGVzdF9iaXQoaSwgY29tbW9uLT5rZXltYXApICYmCi0JCQkgICAgIXRlc3RfYml0KGkgKyA2NCwgY29tbW9uLT5rZXltYXApKQotCQkJCXJldHVybiBpICsgNjQ7Ci0JCX0KLQl9Ci0KLQkvKiBObyBwYXJ0aWFsbHkgdXNlZCBUS0lQIHNsb3RzLCBwaWNrIGFueSBhdmFpbGFibGUgc2xvdCAqLwotCWZvciAoaSA9IElFRUU4MDIxMV9XRVBfTktJRDsgaSA8IGNvbW1vbi0+a2V5bWF4OyBpKyspIHsKLQkJLyogRG8gbm90IGFsbG93IHNsb3RzIHRoYXQgY291bGQgYmUgbmVlZGVkIGZvciBUS0lQIGdyb3VwIGtleXMKLQkJICogdG8gYmUgdXNlZC4gVGhpcyBsaW1pdGF0aW9uIGNvdWxkIGJlIHJlbW92ZWQgaWYgd2Uga25vdyB0aGF0Ci0JCSAqIFRLSVAgd2lsbCBub3QgYmUgdXNlZC4gKi8KLQkJaWYgKGkgPj0gNjQgJiYgaSA8IDY0ICsgSUVFRTgwMjExX1dFUF9OS0lEKQotCQkJY29udGludWU7Ci0JCWlmIChjb21tb24tPnNwbGl0bWljKSB7Ci0JCQlpZiAoaSA+PSAzMiAmJiBpIDwgMzIgKyBJRUVFODAyMTFfV0VQX05LSUQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaSA+PSA2NCArIDMyICYmIGkgPCA2NCArIDMyICsgSUVFRTgwMjExX1dFUF9OS0lEKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCF0ZXN0X2JpdChpLCBjb21tb24tPmtleW1hcCkpCi0JCQlyZXR1cm4gaTsgLyogRm91bmQgYSBmcmVlIHNsb3QgZm9yIGEga2V5ICovCi0JfQotCi0JLyogTm8gZnJlZSBzbG90IGZvdW5kICovCi0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGF0aF9rZXlfY29uZmlnKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKLXsKLQlzdHJ1Y3QgYXRoX2h3ICphaCA9IGNvbW1vbi0+YWg7Ci0Jc3RydWN0IGF0aDlrX2tleXZhbCBoazsKLQljb25zdCB1OCAqbWFjID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaWR4OwotCi0JbWVtc2V0KCZoaywgMCwgc2l6ZW9mKGhrKSk7Ci0KLQlzd2l0Y2ggKGtleS0+YWxnKSB7Ci0JY2FzZSBBTEdfV0VQOgotCQloay5rdl90eXBlID0gQVRIOUtfQ0lQSEVSX1dFUDsKLQkJYnJlYWs7Ci0JY2FzZSBBTEdfVEtJUDoKLQkJaGsua3ZfdHlwZSA9IEFUSDlLX0NJUEhFUl9US0lQOwotCQlicmVhazsKLQljYXNlIEFMR19DQ01QOgotCQloay5rdl90eXBlID0gQVRIOUtfQ0lQSEVSX0FFU19DQ007Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQloay5rdl9sZW4gPSBrZXktPmtleWxlbjsKLQltZW1jcHkoaGsua3ZfdmFsLCBrZXktPmtleSwga2V5LT5rZXlsZW4pOwotCi0JaWYgKCEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpIHsKLQkJLyogRm9yIG5vdywgdXNlIHRoZSBkZWZhdWx0IGtleXMgZm9yIGJyb2FkY2FzdCBrZXlzLiBUaGlzIG1heQotCQkgKiBuZWVkIHRvIGNoYW5nZSB3aXRoIHZpcnR1YWwgaW50ZXJmYWNlcy4gKi8KLQkJaWR4ID0ga2V5LT5rZXlpZHg7Ci0JfSBlbHNlIGlmIChrZXktPmtleWlkeCkgewotCQlpZiAoV0FSTl9PTighc3RhKSkKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJbWFjID0gc3RhLT5hZGRyOwotCi0JCWlmICh2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKLQkJCS8qIE9ubHkga2V5aWR4IDAgc2hvdWxkIGJlIHVzZWQgd2l0aCB1bmljYXN0IGtleSwgYnV0Ci0JCQkgKiBhbGxvdyB0aGlzIGZvciBjbGllbnQgbW9kZSBmb3Igbm93LiAqLwotCQkJaWR4ID0ga2V5LT5rZXlpZHg7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU87Ci0JfSBlbHNlIHsKLQkJaWYgKFdBUk5fT04oIXN0YSkpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCW1hYyA9IHN0YS0+YWRkcjsKLQotCQlpZiAoa2V5LT5hbGcgPT0gQUxHX1RLSVApCi0JCQlpZHggPSBhdGhfcmVzZXJ2ZV9rZXlfY2FjaGVfc2xvdF90a2lwKGNvbW1vbik7Ci0JCWVsc2UKLQkJCWlkeCA9IGF0aF9yZXNlcnZlX2tleV9jYWNoZV9zbG90KGNvbW1vbik7Ci0JCWlmIChpZHggPCAwKQotCQkJcmV0dXJuIC1FTk9TUEM7IC8qIG5vIGZyZWUga2V5IGNhY2hlIGVudHJpZXMgKi8KLQl9Ci0KLQlpZiAoa2V5LT5hbGcgPT0gQUxHX1RLSVApCi0JCXJldCA9IGF0aF9zZXRrZXlfdGtpcChjb21tb24sIGlkeCwga2V5LT5rZXksICZoaywgbWFjLAotCQkJCSAgICAgIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCk7Ci0JZWxzZQotCQlyZXQgPSBhdGg5a19od19zZXRfa2V5Y2FjaGVfZW50cnkoYWgsIGlkeCwgJmhrLCBtYWMpOwotCi0JaWYgKCFyZXQpCi0JCXJldHVybiAtRUlPOwotCi0Jc2V0X2JpdChpZHgsIGNvbW1vbi0+a2V5bWFwKTsKLQlpZiAoa2V5LT5hbGcgPT0gQUxHX1RLSVApIHsKLQkJc2V0X2JpdChpZHggKyA2NCwgY29tbW9uLT5rZXltYXApOwotCQlpZiAoY29tbW9uLT5zcGxpdG1pYykgewotCQkJc2V0X2JpdChpZHggKyAzMiwgY29tbW9uLT5rZXltYXApOwotCQkJc2V0X2JpdChpZHggKyA2NCArIDMyLCBjb21tb24tPmtleW1hcCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgdm9pZCBhdGhfa2V5X2RlbGV0ZShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCi17Ci0Jc3RydWN0IGF0aF9odyAqYWggPSBjb21tb24tPmFoOwotCi0JYXRoOWtfaHdfa2V5cmVzZXQoYWgsIGtleS0+aHdfa2V5X2lkeCk7Ci0JaWYgKGtleS0+aHdfa2V5X2lkeCA8IElFRUU4MDIxMV9XRVBfTktJRCkKLQkJcmV0dXJuOwotCi0JY2xlYXJfYml0KGtleS0+aHdfa2V5X2lkeCwgY29tbW9uLT5rZXltYXApOwotCWlmIChrZXktPmFsZyAhPSBBTEdfVEtJUCkKLQkJcmV0dXJuOwotCi0JY2xlYXJfYml0KGtleS0+aHdfa2V5X2lkeCArIDY0LCBjb21tb24tPmtleW1hcCk7Ci0JaWYgKGNvbW1vbi0+c3BsaXRtaWMpIHsKLQkJYXRoOWtfaHdfa2V5cmVzZXQoYWgsIGtleS0+aHdfa2V5X2lkeCArIDMyKTsKLQkJY2xlYXJfYml0KGtleS0+aHdfa2V5X2lkeCArIDMyLCBjb21tb24tPmtleW1hcCk7Ci0JCWNsZWFyX2JpdChrZXktPmh3X2tleV9pZHggKyA2NCArIDMyLCBjb21tb24tPmtleW1hcCk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBhdGg5a19ic3NfYXNzb2NfaW5mbyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywKIAkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYpCkBAIC05NDEsOSArODU3LDE0IEBACiAJYXRoOWtfcHNfd2FrZXVwKHNjKTsKIAlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOwogCi0JLyogRGlzYWJsZSBMRUQgKi8KLQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sIDEpOwotCWF0aDlrX2h3X2NmZ19ncGlvX2lucHV0KGFoLCBhaC0+bGVkX3Bpbik7CisJLyoKKwkgKiBLZWVwIHRoZSBMRUQgb24gd2hlbiB0aGUgcmFkaW8gaXMgZGlzYWJsZWQKKwkgKiBkdXJpbmcgaWRsZSB1bmFzc29jaWF0ZWQgc3RhdGUuCisJICovCisJaWYgKCFzYy0+cHNfaWRsZSkgeworCQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sIDEpOworCQlhdGg5a19od19jZmdfZ3Bpb19pbnB1dChhaCwgYWgtPmxlZF9waW4pOworCX0KIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLCAwKTsKQEAgLTEwMzIsMjUgKzk1MywyNSBAQAogCXJldHVybiByOwogfQogCi1pbnQgYXRoX2dldF9oYWxfcW51bSh1MTYgcXVldWUsIHN0cnVjdCBhdGhfc29mdGMgKnNjKQorc3RhdGljIGludCBhdGhfZ2V0X2hhbF9xbnVtKHUxNiBxdWV1ZSwgc3RydWN0IGF0aF9zb2Z0YyAqc2MpCiB7CiAJaW50IHFudW07CiAKIAlzd2l0Y2ggKHF1ZXVlKSB7CiAJY2FzZSAwOgotCQlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbQVRIOUtfV01FX0FDX1ZPXTsKKwkJcW51bSA9IHNjLT50eC5od3FfbWFwW1dNRV9BQ19WT107CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJcW51bSA9IHNjLT50eC5od3FfbWFwW0FUSDlLX1dNRV9BQ19WSV07CisJCXFudW0gPSBzYy0+dHguaHdxX21hcFtXTUVfQUNfVkldOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCXFudW0gPSBzYy0+dHguaHdxX21hcFtBVEg5S19XTUVfQUNfQkVdOworCQlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbV01FX0FDX0JFXTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbQVRIOUtfV01FX0FDX0JLXTsKKwkJcW51bSA9IHNjLT50eC5od3FfbWFwW1dNRV9BQ19CS107CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXFudW0gPSBzYy0+dHguaHdxX21hcFtBVEg5S19XTUVfQUNfQkVdOworCQlxbnVtID0gc2MtPnR4Lmh3cV9tYXBbV01FX0FDX0JFXTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMDYyLDE2ICs5ODMsMTYgQEAKIAlpbnQgcW51bTsKIAogCXN3aXRjaCAocXVldWUpIHsKLQljYXNlIEFUSDlLX1dNRV9BQ19WTzoKKwljYXNlIFdNRV9BQ19WTzoKIAkJcW51bSA9IDA7CiAJCWJyZWFrOwotCWNhc2UgQVRIOUtfV01FX0FDX1ZJOgorCWNhc2UgV01FX0FDX1ZJOgogCQlxbnVtID0gMTsKIAkJYnJlYWs7Ci0JY2FzZSBBVEg5S19XTUVfQUNfQkU6CisJY2FzZSBXTUVfQUNfQkU6CiAJCXFudW0gPSAyOwogCQlicmVhazsKLQljYXNlIEFUSDlLX1dNRV9BQ19CSzoKKwljYXNlIFdNRV9BQ19CSzoKIAkJcW51bSA9IDM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMjAxLDcgKzExMjIsOSBAQAogCQkgICAgQVRIOUtfSU5UX0dMT0JBTDsKIAogCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpCi0JCWFoLT5pbWFzayB8PSBBVEg5S19JTlRfUlhIUCB8IEFUSDlLX0lOVF9SWExQOworCQlhaC0+aW1hc2sgfD0gQVRIOUtfSU5UX1JYSFAgfAorCQkJICAgICBBVEg5S19JTlRfUlhMUCB8CisJCQkgICAgIEFUSDlLX0lOVF9CQl9XQVRDSERPRzsKIAllbHNlCiAJCWFoLT5pbWFzayB8PSBBVEg5S19JTlRfUlg7CiAKQEAgLTEyNTEsNiArMTE3NCw3IEBACiAJc3RydWN0IGF0aF90eF9jb250cm9sIHR4Y3RsOwogCWludCBwYWRwb3MsIHBhZHNpemU7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJaW50IHFudW07CiAKIAlpZiAoYXBoeS0+c3RhdGUgIT0gQVRIX1dJUEhZX0FDVElWRSAmJiBhcGh5LT5zdGF0ZSAhPSBBVEhfV0lQSFlfU0NBTikgewogCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1hNSVQsCkBAIC0xMjgwLDcgKzEyMDQsOCBAQAogCQkgKiBjb21wbGV0ZWQgYW5kIGlmIG5lZWRlZCwgYWxzbyBmb3IgUlggb2YgYnVmZmVyZWQgZnJhbWVzLgogCQkgKi8KIAkJYXRoOWtfcHNfd2FrZXVwKHNjKTsKLQkJYXRoOWtfaHdfc2V0cnhhYm9ydChzYy0+c2NfYWgsIDApOworCQlpZiAoIShzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9BVVRPU0xFRVApKQorCQkJYXRoOWtfaHdfc2V0cnhhYm9ydChzYy0+c2NfYWgsIDApOwogCQlpZiAoaWVlZTgwMjExX2lzX3BzcG9sbChoZHItPmZyYW1lX2NvbnRyb2wpKSB7CiAJCQlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1BTLAogCQkJCSAgIlNlbmRpbmcgUFMtUG9sbCB0byBwaWNrIGEgYnVmZmVyZWQgZnJhbWVcbiIpOwpAQCAtMTMyMiwxMSArMTI0Nyw4IEBACiAJCW1lbW1vdmUoc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBwYWRzaXplLCBwYWRwb3MpOwogCX0KIAotCS8qIENoZWNrIGlmIGEgdHggcXVldWUgaXMgYXZhaWxhYmxlICovCi0KLQl0eGN0bC50eHEgPSBhdGhfdGVzdF9nZXRfdHhxKHNjLCBza2IpOwotCWlmICghdHhjdGwudHhxKQotCQlnb3RvIGV4aXQ7CisJcW51bSA9IGF0aF9nZXRfaGFsX3FudW0oc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYiksIHNjKTsKKwl0eGN0bC50eHEgPSAmc2MtPnR4LnR4cVtxbnVtXTsKIAogCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfWE1JVCwgInRyYW5zbWl0dGluZyBwYWNrZXQsIHNrYjogJXBcbiIsIHNrYik7CiAKQEAgLTEzNDcsMTUgKzEyNjksMjUgQEAKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGFwaHktPnNjOwogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCWludCBpOwogCiAJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKIAogCWFwaHktPnN0YXRlID0gQVRIX1dJUEhZX0lOQUNUSVZFOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzYy0+YXRoX2xlZF9ibGlua193b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnNjLT50eF9jb21wbGV0ZV93b3JrKTsKKwlpZiAobGVkX2JsaW5rKQorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnNjLT5hdGhfbGVkX2JsaW5rX3dvcmspOwogCi0JaWYgKCFzYy0+bnVtX3NlY193aXBoeSkgeworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2MtPnR4X2NvbXBsZXRlX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJnNjLT5wYXByZF93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZzYy0+aHdfY2hlY2tfd29yayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2MtPm51bV9zZWNfd2lwaHk7IGkrKykgeworCQlpZiAoc2MtPnNlY193aXBoeVtpXSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHNjLT5udW1fc2VjX3dpcGh5KSB7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2MtPndpcGh5X3dvcmspOwogCQljYW5jZWxfd29ya19zeW5jKCZzYy0+Y2hhbl93b3JrKTsKIAl9CkBAIC0xNTQ3LDggKzE0NzksOCBAQAogCQkJYWgtPmltYXNrIHw9IEFUSDlLX0lOVF9USU1fVElNRVI7CiAJCQlhdGg5a19od19zZXRfaW50ZXJydXB0cyhhaCwgYWgtPmltYXNrKTsKIAkJfQorCQlhdGg5a19od19zZXRyeGFib3J0KGFoLCAxKTsKIAl9Ci0JYXRoOWtfaHdfc2V0cnhhYm9ydChhaCwgMSk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoOWtfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKQEAgLTE3ODUsNyArMTcxNyw3IEBACiAJCWF0aF9wcmludChjb21tb24sIEFUSF9EQkdfRkFUQUwsICJUWFEgVXBkYXRlIGZhaWxlZFxuIik7CiAKIAlpZiAoc2MtPnNjX2FoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCi0JCWlmICgocW51bSA9PSBzYy0+dHguaHdxX21hcFtBVEg5S19XTUVfQUNfQkVdKSAmJiAhcmV0KQorCQlpZiAoKHFudW0gPT0gc2MtPnR4Lmh3cV9tYXBbV01FX0FDX0JFXSkgJiYgIXJldCkKIAkJCWF0aF9iZWFjb25xX2NvbmZpZyhzYyk7CiAKIAltdXRleF91bmxvY2soJnNjLT5tdXRleCk7CkBAIC0xODEzLDcgKzE3NDUsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNFVF9LRVk6Ci0JCXJldCA9IGF0aF9rZXlfY29uZmlnKGNvbW1vbiwgdmlmLCBzdGEsIGtleSk7CisJCXJldCA9IGF0aDlrX2Ntbl9rZXlfY29uZmlnKGNvbW1vbiwgdmlmLCBzdGEsIGtleSk7CiAJCWlmIChyZXQgPj0gMCkgewogCQkJa2V5LT5od19rZXlfaWR4ID0gcmV0OwogCQkJLyogcHVzaCBJViBhbmQgTWljaGFlbCBNSUMgZ2VuZXJhdGlvbiB0byBzdGFjayAqLwpAQCAtMTgyNiw3ICsxNzU4LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIERJU0FCTEVfS0VZOgotCQlhdGhfa2V5X2RlbGV0ZShjb21tb24sIGtleSk7CisJCWF0aDlrX2Ntbl9rZXlfZGVsZXRlKGNvbW1vbiwga2V5KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTE5OTksNiArMTkzMSw4IEBACiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBhcGh5LT5zYzsKIAlpbnQgcmV0ID0gMDsKIAorCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6CiAJCWlmICghKHNjLT5zY19mbGFncyAmIFNDX09QX1JYQUdHUikpCkBAIC0yMDI4LDYgKzE5NjIsOCBAQAogCQkJICAiVW5rbm93biBBTVBEVSBhY3Rpb25cbiIpOwogCX0KIAorCWxvY2FsX2JoX2VuYWJsZSgpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjA1OCwxMSArMTk5NCwxMiBAQAogCiAJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKIAlpZiAoYXRoOWtfd2lwaHlfc2Nhbm5pbmcoc2MpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJhdGg5azogVHdvIHdpcGh5cyB0cnlpbmcgdG8gc2NhbiBhdCB0aGUgIgotCQkgICAgICAgInNhbWUgdGltZVxuIik7CiAJCS8qCi0JCSAqIERvIG5vdCBhbGxvdyB0aGUgY29uY3VycmVudCBzY2FubmluZyBzdGF0ZSBmb3Igbm93LiBUaGlzCi0JCSAqIGNvdWxkIGJlIGltcHJvdmVkIHdpdGggc2Nhbm5pbmcgY29udHJvbCBtb3ZlZCBpbnRvIGF0aDlrLgorCQkgKiBUaGVyZSBpcyBhIHJhY2UgaGVyZSBpbiBtYWM4MDIxMSBidXQgZml4aW5nIGl0IHJlcXVpcmVzCisJCSAqIHdlIHJldmlzaXQgaG93IHdlIGhhbmRsZSB0aGUgc2NhbiBjb21wbGV0ZSBjYWxsYmFjay4KKwkJICogQWZ0ZXIgbWFjODAyMTEgZml4ZXMgd2Ugd2lsbCBub3QgaGF2ZSBjb25maWd1cmVkIGhhcmR3YXJlCisJCSAqIHRvIHRoZSBob21lIGNoYW5uZWwgbm9yIHdvdWxkIHdlIGhhdmUgY29uZmlndXJlZCB0aGUgUlgKKwkJICogZmlsdGVyIHlldC4KIAkJICovCiAJCW11dGV4X3VubG9jaygmc2MtPm11dGV4KTsKIAkJcmV0dXJuOwpAQCAtMjA3MiwxMCArMjAwOSwxNiBAQAogCWF0aDlrX3dpcGh5X3BhdXNlX2FsbF9mb3JjZWQoc2MsIGFwaHkpOwogCXNjLT5zY19mbGFncyB8PSBTQ19PUF9TQ0FOTklORzsKIAlkZWxfdGltZXJfc3luYygmY29tbW9uLT5hbmkudGltZXIpOworCWNhbmNlbF93b3JrX3N5bmMoJnNjLT5wYXByZF93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZzYy0+aHdfY2hlY2tfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzYy0+dHhfY29tcGxldGVfd29yayk7CiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogfQogCisvKgorICogWFhYOiB0aGlzIHJlcXVpcmVzIGEgcmV2aXNpdCBhZnRlciB0aGUgZHJpdmVyCisgKiBzY2FuX2NvbXBsZXRlIGdldHMgbW92ZWQgdG8gYW5vdGhlciBwbGFjZS9yZW1vdmVkIGluIG1hYzgwMjExLgorICovCiBzdGF0aWMgdm9pZCBhdGg5a19zd19zY2FuX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBhdGhfd2lwaHkgKmFwaHkgPSBody0+cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYwppbmRleCAxZWM4MzZjLi5iNWI2NTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAJeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMkMpIH0sIC8qIFBDSS1FIDgwMi4xMW4gYm9uZGVkIG91dCAqLwogCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDJEKSB9LCAvKiBQQ0kgICAqLwogCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDJFKSB9LCAvKiBQQ0ktRSAqLworCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDMwKSB9LCAvKiBQQ0ktRSAgQVI5MzAwICovCiAJeyAwIH0KIH07CiAKQEAgLTIwOCwxMSArMjA5LDggQEAKIAl9CiAKIAlhdGg5a19od19uYW1lKHNjLT5zY19haCwgaHdfbmFtZSwgc2l6ZW9mKGh3X25hbWUpKTsKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICIlczogJXMgbWVtPTB4JWx4LCBpcnE9JWRcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwKLQkgICAgICAgaHdfbmFtZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpbWVtLCBwZGV2LT5pcnEpOworCXdpcGh5X2luZm8oaHctPndpcGh5LCAiJXMgbWVtPTB4JWx4LCBpcnE9JWRcbiIsCisJCSAgIGh3X25hbWUsICh1bnNpZ25lZCBsb25nKW1lbSwgcGRldi0+aXJxKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCmluZGV4IDg1MTk0NTIuLmU0OWJlNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCkBAIC0yMCw5MyArMjAsMTQ1IEBACiAjaW5jbHVkZSAiYXRoOWsuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGhfcmF0ZV90YWJsZSBhcjU0MTZfMTFuYV9yYXRldGFibGUgPSB7Ci0JNDIsCisJNjgsCiAJOCwgLyogTUNTIHN0YXJ0ICovCiAJewotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgNjAwMCwgLyogNiBNYiAqLwotCQkJNTQwMCwgMCwgMTIsIDAsIDAsIDAsIDAsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDkwMDAsIC8qIDkgTWIgKi8KLQkJCTc4MDAsICAxLCAxOCwgMCwgMSwgMSwgMSwgMSB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMTIwMDAsIC8qIDEyIE1iICovCi0JCQkxMDAwMCwgMiwgMjQsIDIsIDIsIDIsIDIsIDIgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDE4MDAwLCAvKiAxOCBNYiAqLwotCQkJMTM5MDAsIDMsIDM2LCAyLCAzLCAzLCAzLCAzIH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCAyNDAwMCwgLyogMjQgTWIgKi8KLQkJCTE3MzAwLCA0LCA0OCwgNCwgNCwgNCwgNCwgNCB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMzYwMDAsIC8qIDM2IE1iICovCi0JCQkyMzAwMCwgNSwgNzIsIDQsIDUsIDUsIDUsIDUgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDQ4MDAwLCAvKiA0OCBNYiAqLwotCQkJMjc0MDAsIDYsIDk2LCA0LCA2LCA2LCA2LCA2IH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCA1NDAwMCwgLyogNTQgTWIgKi8KLQkJCTI5MzAwLCA3LCAxMDgsIDQsIDcsIDcsIDcsIDcgfSwKLQkJeyBWQUxJRF8yMDQwLCBWQUxJRF8yMDQwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNjUwMCwgLyogNi41IE1iICovCi0JCQk2NDAwLCAwLCAwLCAwLCA4LCAyNCwgOCwgMjQgfSwKLQkJeyBWQUxJRF8yMCwgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAxMzAwMCwgLyogMTMgTWIgKi8KLQkJCTEyNzAwLCAxLCAxLCAyLCA5LCAyNSwgOSwgMjUgfSwKLQkJeyBWQUxJRF8yMCwgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAxOTUwMCwgLyogMTkuNSBNYiAqLwotCQkJMTg4MDAsIDIsIDIsIDIsIDEwLCAyNiwgMTAsIDI2IH0sCi0JCXsgVkFMSURfMjAsIFZBTElEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgMjYwMDAsIC8qIDI2IE1iICovCi0JCQkyNTAwMCwgMywgMywgNCwgMTEsIDI3LCAxMSwgMjcgfSwKLQkJeyBWQUxJRF8yMCwgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAzOTAwMCwgLyogMzkgTWIgKi8KLQkJCTM2NzAwLCA0LCA0LCA0LCAxMiwgMjgsIDEyLCAyOCB9LAotCQl7IElOVkFMSUQsIFZBTElEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNTIwMDAsIC8qIDUyIE1iICovCi0JCQk0ODEwMCwgNSwgNSwgNCwgMTMsIDI5LCAxMywgMjkgfSwKLQkJeyBJTlZBTElELCBWQUxJRF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfU1MsIDU4NTAwLCAvKiA1OC41IE1iICovCi0JCQk1MzUwMCwgNiwgNiwgNCwgMTQsIDMwLCAxNCwgMzAgfSwKLQkJeyBJTlZBTElELCBWQUxJRF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfU1MsIDY1MDAwLCAvKiA2NSBNYiAqLwotCQkJNTkwMDAsIDcsIDcsIDQsIDE1LCAzMSwgMTUsIDMyIH0sCi0JCXsgSU5WQUxJRCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDEzMDAwLCAvKiAxMyBNYiAqLwotCQkJMTI3MDAsIDgsIDgsIDMsIDE2LCAzMywgMTYsIDMzIH0sCi0JCXsgSU5WQUxJRCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDI2MDAwLCAvKiAyNiBNYiAqLwotCQkJMjQ4MDAsIDksIDksIDIsIDE3LCAzNCwgMTcsIDM0IH0sCi0JCXsgSU5WQUxJRCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDM5MDAwLCAvKiAzOSBNYiAqLwotCQkJMzY2MDAsIDEwLCAxMCwgMiwgMTgsIDM1LCAxOCwgMzUgfSwKLQkJeyBWQUxJRF8yMCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDUyMDAwLCAvKiA1MiBNYiAqLwotCQkJNDgxMDAsIDExLCAxMSwgNCwgMTksIDM2LCAxOSwgMzYgfSwKLQkJeyBWQUxJRF8yMCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDc4MDAwLCAvKiA3OCBNYiAqLwotCQkJNjk1MDAsIDEyLCAxMiwgNCwgMjAsIDM3LCAyMCwgMzcgfSwKLQkJeyBWQUxJRF8yMCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDEwNDAwMCwgLyogMTA0IE1iICovCi0JCQk4OTUwMCwgMTMsIDEzLCA0LCAyMSwgMzgsIDIxLCAzOCB9LAotCQl7IFZBTElEXzIwLCBJTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMTE3MDAwLCAvKiAxMTcgTWIgKi8KLQkJCTk4OTAwLCAxNCwgMTQsIDQsIDIyLCAzOSwgMjIsIDM5IH0sCi0JCXsgVkFMSURfMjAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAxMzAwMDAsIC8qIDEzMCBNYiAqLwotCQkJMTA4MzAwLCAxNSwgMTUsIDQsIDIzLCA0MCwgMjMsIDQxIH0sCi0JCXsgVkFMSURfNDAsIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgMTM1MDAsIC8qIDEzLjUgTWIgKi8KLQkJCTEzMjAwLCAwLCAwLCAwLCA4LCAyNCwgMjQsIDI0IH0sCi0JCXsgVkFMSURfNDAsIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgMjc1MDAsIC8qIDI3LjAgTWIgKi8KLQkJCTI1OTAwLCAxLCAxLCAyLCA5LCAyNSwgMjUsIDI1IH0sCi0JCXsgVkFMSURfNDAsIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgNDA1MDAsIC8qIDQwLjUgTWIgKi8KLQkJCTM4NjAwLCAyLCAyLCAyLCAxMCwgMjYsIDI2LCAyNiB9LAotCQl7IFZBTElEXzQwLCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDU0MDAwLCAvKiA1NCBNYiAqLwotCQkJNDk4MDAsIDMsIDMsIDQsIDExLCAyNywgMjcsIDI3IH0sCi0JCXsgVkFMSURfNDAsIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgODE1MDAsIC8qIDgxIE1iICovCi0JCQk3MjIwMCwgNCwgNCwgNCwgMTIsIDI4LCAyOCwgMjggfSwKLQkJeyBJTlZBTElELCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDEwODAwMCwgLyogMTA4IE1iICovCi0JCQk5MjkwMCwgNSwgNSwgNCwgMTMsIDI5LCAyOSwgMjkgfSwKLQkJeyBJTlZBTElELCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDEyMTUwMCwgLyogMTIxLjUgTWIgKi8KLQkJCTEwMjcwMCwgNiwgNiwgNCwgMTQsIDMwLCAzMCwgMzAgfSwKLQkJeyBJTlZBTElELCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDEzNTAwMCwgLyogMTM1IE1iICovCi0JCQkxMTIwMDAsIDcsIDcsIDQsIDE1LCAzMSwgMzIsIDMyIH0sCi0JCXsgSU5WQUxJRCwgVkFMSURfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTX0hHSSwgMTUwMDAwLCAvKiAxNTAgTWIgKi8KLQkJCTEyMjAwMCwgNywgNywgNCwgMTUsIDMxLCAzMiwgMzIgfSwKLQkJeyBJTlZBTElELCBJTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9EUywgMjcwMDAsIC8qIDI3IE1iICovCi0JCQkyNTgwMCwgOCwgOCwgMCwgMTYsIDMzLCAzMywgMzMgfSwKLQkJeyBJTlZBTElELCBJTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9EUywgNTQwMDAsIC8qIDU0IE1iICovCi0JCQk0OTgwMCwgOSwgOSwgMiwgMTcsIDM0LCAzNCwgMzQgfSwKLQkJeyBJTlZBTElELCBJTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9EUywgODEwMDAsIC8qIDgxIE1iICovCi0JCQk3MTkwMCwgMTAsIDEwLCAyLCAxOCwgMzUsIDM1LCAzNSB9LAotCQl7IFZBTElEXzQwLCBJTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9EUywgMTA4MDAwLCAvKiAxMDggTWIgKi8KLQkJCTkyNTAwLCAxMSwgMTEsIDQsIDE5LCAzNiwgMzYsIDM2IH0sCi0JCXsgVkFMSURfNDAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAxNjIwMDAsIC8qIDE2MiBNYiAqLwotCQkJMTMwMzAwLCAxMiwgMTIsIDQsIDIwLCAzNywgMzcsIDM3IH0sCi0JCXsgVkFMSURfNDAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyMTYwMDAsIC8qIDIxNiBNYiAqLwotCQkJMTYyODAwLCAxMywgMTMsIDQsIDIxLCAzOCwgMzgsIDM4IH0sCi0JCXsgVkFMSURfNDAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNDMwMDAsIC8qIDI0MyBNYiAqLwotCQkJMTc4MjAwLCAxNCwgMTQsIDQsIDIyLCAzOSwgMzksIDM5IH0sCi0JCXsgVkFMSURfNDAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNzAwMDAsIC8qIDI3MCBNYiAqLwotCQkJMTkyMTAwLCAxNSwgMTUsIDQsIDIzLCA0MCwgNDEsIDQxIH0sCi0JCXsgVkFMSURfNDAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSwgMzAwMDAwLCAvKiAzMDAgTWIgKi8KLQkJCTIwNzAwMCwgMTUsIDE1LCA0LCAyMywgNDAsIDQxLCA0MSB9LAorCQlbMF0gPSB7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCA2MDAwLAorCQkJNTQwMCwgMCwgMTIsIDAsIDAsIDAsIDAgfSwgLyogNiBNYiAqLworCQlbMV0gPSB7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCA5MDAwLAorCQkJNzgwMCwgIDEsIDE4LCAwLCAxLCAxLCAxIH0sIC8qIDkgTWIgKi8KKwkJWzJdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMTIwMDAsCisJCQkxMDAwMCwgMiwgMjQsIDIsIDIsIDIsIDIgfSwgLyogMTIgTWIgKi8KKwkJWzNdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMTgwMDAsCisJCQkxMzkwMCwgMywgMzYsIDIsIDMsIDMsIDMgfSwgLyogMTggTWIgKi8KKwkJWzRdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMjQwMDAsCisJCQkxNzMwMCwgNCwgNDgsIDQsIDQsIDQsIDQgfSwgLyogMjQgTWIgKi8KKwkJWzVdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMzYwMDAsCisJCQkyMzAwMCwgNSwgNzIsIDQsIDUsIDUsIDUgfSwgLyogMzYgTWIgKi8KKwkJWzZdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgNDgwMDAsCisJCQkyNzQwMCwgNiwgOTYsIDQsIDYsIDYsIDYgfSwgLyogNDggTWIgKi8KKwkJWzddID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgNTQwMDAsCisJCQkyOTMwMCwgNywgMTA4LCA0LCA3LCA3LCA3IH0sIC8qIDU0IE1iICovCisJCVs4XSA9IHsgUkNfSFRfU0RUXzIwNDAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCA2NTAwLAorCQkJNjQwMCwgMCwgMCwgMCwgMzgsIDgsIDM4IH0sIC8qIDYuNSBNYiAqLworCQlbOV0gPSB7IFJDX0hUX1NEVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfU1MsIDEzMDAwLAorCQkJMTI3MDAsIDEsIDEsIDIsIDM5LCA5LCAzOSB9LCAvKiAxMyBNYiAqLworCQlbMTBdID0geyBSQ19IVF9TRFRfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAxOTUwMCwKKwkJCTE4ODAwLCAyLCAyLCAyLCA0MCwgMTAsIDQwIH0sIC8qIDE5LjUgTWIgKi8KKwkJWzExXSA9IHsgUkNfSFRfU0RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAyNjAwMCwKKwkJCTI1MDAwLCAzLCAzLCA0LCA0MSwgMTEsIDQxIH0sIC8qIDI2IE1iICovCisJCVsxMl0gPSB7IFJDX0hUX1NEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgMzkwMDAsCisJCQkzNjcwMCwgNCwgNCwgNCwgNDIsIDEyLCA0MiB9LCAvKiAzOSBNYiAqLworCQlbMTNdID0geyBSQ19IVF9TXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNTIwMDAsCisJCQk0ODEwMCwgNSwgNSwgNCwgNDMsIDEzLCA0MyB9LCAvKiA1MiBNYiAqLworCQlbMTRdID0geyBSQ19IVF9TXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNTg1MDAsCisJCQk1MzUwMCwgNiwgNiwgNCwgNDQsIDE0LCA0NCB9LCAvKiA1OC41IE1iICovCisJCVsxNV0gPSB7IFJDX0hUX1NfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCA2NTAwMCwKKwkJCTU5MDAwLCA3LCA3LCA0LCA0NSwgMTYsIDQ2IH0sIC8qIDY1IE1iICovCisJCVsxNl0gPSB7IFJDX0hUX1NfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTX0hHSSwgNzIyMDAsCisJCQk2NTQwMCwgNywgNywgNCwgNDUsIDE2LCA0NiB9LCAvKiA3NSBNYiAqLworCQlbMTddID0geyBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMTMwMDAsCisJCQkxMjcwMCwgOCwgOCwgMCwgNDcsIDE3LCA0NyB9LCAvKiAxMyBNYiAqLworCQlbMThdID0geyBSQ19IVF9UXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMjYwMDAsCisJCQkyNDgwMCwgOSwgOSwgMiwgNDgsIDE4LCA0OCB9LCAvKiAyNiBNYiAqLworCQlbMTldID0geyBSQ19IVF9UXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMzkwMDAsCisJCQkzNjYwMCwgMTAsIDEwLCAyLCA0OSwgMTksIDQ5IH0sIC8qIDM5IE1iICovCisJCVsyMF0gPSB7IFJDX0hUX0RUXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgNTIwMDAsCisJCQk0ODEwMCwgMTEsIDExLCA0LCA1MCwgMjAsIDUwIH0sIC8qIDUyIE1iICovCisJCVsyMV0gPSB7IFJDX0hUX0RUXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgNzgwMDAsCisJCQk2OTUwMCwgMTIsIDEyLCA0LCA1MSwgMjEsIDUxIH0sIC8qIDc4IE1iICovCisJCVsyMl0gPSB7IFJDX0hUX0RUXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMTA0MDAwLAorCQkJODk1MDAsIDEzLCAxMywgNCwgNTIsIDIyLCA1MiB9LCAvKiAxMDQgTWIgKi8KKwkJWzIzXSA9IHsgUkNfSFRfRFRfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAxMTcwMDAsCisJCQk5ODkwMCwgMTQsIDE0LCA0LCA1MywgMjMsIDUzIH0sIC8qIDExNyBNYiAqLworCQlbMjRdID0geyBSQ19IVF9EVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDEzMDAwMCwKKwkJCTEwODMwMCwgMTUsIDE1LCA0LCA1NCwgMjUsIDU1IH0sIC8qIDEzMCBNYiAqLworCQlbMjVdID0geyBSQ19IVF9EVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfRFNfSEdJLCAxNDQ0MDAsCisJCQkxMjAwMDAsIDE1LCAxNSwgNCwgNTQsIDI1LCA1NSB9LCAvKiAxNDQuNCBNYiAqLworCQlbMjZdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfVFMsIDE5NTAwLAorCQkJMTc0MDAsIDE2LCAxNiwgMCwgNTYsIDI2LCA1NiB9LCAvKiAxOS41IE1iICovCisJCVsyN10gPSB7ICBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9UUywgMzkwMDAsCisJCQkzNTEwMCwgMTcsIDE3LCAyLCA1NywgMjcsIDU3IH0sIC8qIDM5IE1iICovCisJCVsyOF0gPSB7ICBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9UUywgNTg1MDAsCisJCQk1MjYwMCwgMTgsIDE4LCAyLCA1OCwgMjgsIDU4IH0sIC8qIDU4LjUgTWIgKi8KKwkJWzI5XSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCA3ODAwMCwKKwkJCTcwNDAwLCAxOSwgMTksIDQsIDU5LCAyOSwgNTkgfSwgLyogNzggTWIgKi8KKwkJWzMwXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAxMTcwMDAsCisJCQkxMDQ5MDAsIDIwLCAyMCwgNCwgNjAsIDMxLCA2MSB9LCAvKiAxMTcgTWIgKi8KKwkJWzMxXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX1RTX0hHSSwgMTMwMDAwLAorCQkJMTE1ODAwLCAyMCwgMjAsIDQsIDYwLCAzMSwgNjEgfSwgLyogMTMwIE1iKi8KKwkJWzMyXSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAxNTYwMDAsCisJCQkxMzcyMDAsIDIxLCAyMSwgNCwgNjIsIDMzLCA2MyB9LCAvKiAxNTYgTWIgKi8KKwkJWzMzXSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTX0hHSSwgMTczMzAwLAorCQkJMTUxMTAwLCAyMSwgMjEsIDQsIDYyLCAzMywgNjMgfSwgLyogMTczLjMgTWIgKi8KKwkJWzM0XSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAxNzU1MDAsCisJCQkxNTI4MDAsIDIyLCAyMiwgNCwgNjQsIDM1LCA2NSB9LCAvKiAxNzUuNSBNYiAqLworCQlbMzVdID0geyAgUkNfSFRfVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfVFNfSEdJLCAxOTUwMDAsCisJCQkxNjg0MDAsIDIyLCAyMiwgNCwgNjQsIDM1LCA2NSB9LCAvKiAxOTUgTWIqLworCQlbMzZdID0geyAgUkNfSFRfVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfVFMsIDE5NTAwMCwKKwkJCTE2ODQwMCwgMjMsIDIzLCA0LCA2NiwgMzcsIDY3IH0sIC8qIDE5NSBNYiAqLworCQlbMzddID0geyAgUkNfSFRfVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfVFNfSEdJLCAyMTY3MDAsCisJCQkxODUwMDAsIDIzLCAyMywgNCwgNjYsIDM3LCA2NyB9LCAvKiAyMTYuNyBNYiAqLworCQlbMzhdID0geyBSQ19IVF9TRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAxMzUwMCwKKwkJCTEzMjAwLCAwLCAwLCAwLCAzOCwgMzgsIDM4IH0sIC8qIDEzLjUgTWIqLworCQlbMzldID0geyBSQ19IVF9TRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAyNzUwMCwKKwkJCTI1OTAwLCAxLCAxLCAyLCAzOSwgMzksIDM5IH0sIC8qIDI3LjAgTWIqLworCQlbNDBdID0geyBSQ19IVF9TRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCA0MDUwMCwKKwkJCTM4NjAwLCAyLCAyLCAyLCA0MCwgNDAsIDQwIH0sIC8qIDQwLjUgTWIqLworCQlbNDFdID0geyBSQ19IVF9TRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDU0MDAwLAorCQkJNDk4MDAsIDMsIDMsIDQsIDQxLCA0MSwgNDEgfSwgLyogNTQgTWIgKi8KKwkJWzQyXSA9IHsgUkNfSFRfU0RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCA4MTUwMCwKKwkJCTcyMjAwLCA0LCA0LCA0LCA0MiwgNDIsIDQyIH0sIC8qIDgxIE1iICovCisJCVs0M10gPSB7IFJDX0hUX1NfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAxMDgwMDAsCisJCQk5MjkwMCwgNSwgNSwgNCwgNDMsIDQzLCA0MyB9LCAvKiAxMDggTWIgKi8KKwkJWzQ0XSA9IHsgUkNfSFRfU180MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDEyMTUwMCwKKwkJCTEwMjcwMCwgNiwgNiwgNCwgNDQsIDQ0LCA0NCB9LCAvKiAxMjEuNSBNYiovCisJCVs0NV0gPSB7IFJDX0hUX1NfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAxMzUwMDAsCisJCQkxMTIwMDAsIDcsIDcsIDQsIDQ1LCA0NiwgNDYgfSwgLyogMTM1IE1iICovCisJCVs0Nl0gPSB7IFJDX0hUX1NfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTX0hHSSwgMTUwMDAwLAorCQkJMTIyMDAwLCA3LCA3LCA0LCA0NSwgNDYsIDQ2IH0sIC8qIDE1MCBNYiAqLworCQlbNDddID0geyBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9EUywgMjcwMDAsCisJCQkyNTgwMCwgOCwgOCwgMCwgNDcsIDQ3LCA0NyB9LCAvKiAyNyBNYiAqLworCQlbNDhdID0geyBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9EUywgNTQwMDAsCisJCQk0OTgwMCwgOSwgOSwgMiwgNDgsIDQ4LCA0OCB9LCAvKiA1NCBNYiAqLworCQlbNDldID0geyBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9EUywgODEwMDAsCisJCQk3MTkwMCwgMTAsIDEwLCAyLCA0OSwgNDksIDQ5IH0sIC8qIDgxIE1iICovCisJCVs1MF0gPSB7IFJDX0hUX0RUXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9EUywgMTA4MDAwLAorCQkJOTI1MDAsIDExLCAxMSwgNCwgNTAsIDUwLCA1MCB9LCAvKiAxMDggTWIgKi8KKwkJWzUxXSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAxNjIwMDAsCisJCQkxMzAzMDAsIDEyLCAxMiwgNCwgNTEsIDUxLCA1MSB9LCAvKiAxNjIgTWIgKi8KKwkJWzUyXSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyMTYwMDAsCisJCQkxNjI4MDAsIDEzLCAxMywgNCwgNTIsIDUyLCA1MiB9LCAvKiAyMTYgTWIgKi8KKwkJWzUzXSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNDMwMDAsCisJCQkxNzgyMDAsIDE0LCAxNCwgNCwgNTMsIDUzLCA1MyB9LCAvKiAyNDMgTWIgKi8KKwkJWzU0XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNzAwMDAsCisJCQkxOTIxMDAsIDE1LCAxNSwgNCwgNTQsIDU1LCA1NSB9LCAvKiAyNzAgTWIgKi8KKwkJWzU1XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSwgMzAwMDAwLAorCQkJMjA3MDAwLCAxNSwgMTUsIDQsIDU0LCA1NSwgNTUgfSwgLyogMzAwIE1iICovCisJCVs1Nl0gPSB7ICBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9UUywgNDA1MDAsCisJCQkzNjEwMCwgMTYsIDE2LCAwLCA1NiwgNTYsIDU2IH0sIC8qIDQwLjUgTWIgKi8KKwkJWzU3XSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCA4MTAwMCwKKwkJCTcyOTAwLCAxNywgMTcsIDIsIDU3LCA1NywgNTcgfSwgLyogODEgTWIgKi8KKwkJWzU4XSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCAxMjE1MDAsCisJCQkxMDgzMDAsIDE4LCAxOCwgMiwgNTgsIDU4LCA1OCB9LCAvKiAxMjEuNSBNYiAqLworCQlbNTldID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfVFMsIDE2MjAwMCwKKwkJCTE0MjAwMCwgMTksIDE5LCA0LCA1OSwgNTksIDU5IH0sIC8qICAxNjIgTWIgKi8KKwkJWzYwXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCAyNDMwMDAsCisJCQkyMDUxMDAsIDIwLCAyMCwgNCwgNjAsIDYxLCA2MSB9LCAvKiAgMjQzIE1iICovCisJCVs2MV0gPSB7ICBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9UU19IR0ksIDI3MDAwMCwKKwkJCTIyNDcwMCwgMjAsIDIwLCA0LCA2MCwgNjEsIDYxIH0sIC8qICAyNzAgTWIgKi8KKwkJWzYyXSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCAzMjQwMDAsCisJCQkyNjMxMDAsIDIxLCAyMSwgNCwgNjIsIDYzLCA2MyB9LCAvKiAgMzI0IE1iICovCisJCVs2M10gPSB7ICBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9UU19IR0ksIDM2MDAwMCwKKwkJCTI4ODAwMCwgMjEsIDIxLCA0LCA2MiwgNjMsIDYzIH0sIC8qICAzNjAgTWIgKi8KKwkJWzY0XSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCAzNjQ1MDAsCisJCQkyOTA3MDAsIDIyLCAyMiwgNCwgNjQsIDY1LCA2NSB9LCAvKiAzNjQuNSBNYiAqLworCQlbNjVdID0geyAgUkNfSFRfVF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfVFNfSEdJLCA0MDUwMDAsCisJCQkzMTcyMDAsIDIyLCAyMiwgNCwgNjQsIDY1LCA2NSB9LCAvKiA0MDUgTWIgKi8KKwkJWzY2XSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCA0MDUwMDAsCisJCQkzMTcyMDAsIDIzLCAyMywgNCwgNjYsIDY3LCA2NyB9LCAvKiA0MDUgTWIgKi8KKwkJWzY3XSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTX0hHSSwgNDUwMDAwLAorCQkJMzQ2NDAwLCAyMywgMjMsIDQsIDY2LCA2NywgNjcgfSwgLyogNDUwIE1iICovCiAJfSwKIAk1MCwgIC8qIHByb2JlIGludGVydmFsICovCiAJV0xBTl9SQ19IVF9GTEFHLCAgLyogUGh5IHJhdGVzIGFsbG93ZWQgaW5pdGlhbGx5ICovCkBAIC0xMTYsMTAxICsxNjgsMTUzIEBACiAgKiBmb3IgSFQgYXJlIHRoZSA2NEsgbWF4IGFnZ3JlZ2F0ZSBsaW1pdCAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aF9yYXRlX3RhYmxlIGFyNTQxNl8xMW5nX3JhdGV0YWJsZSA9IHsKLQk0NiwKKwk3MiwKIAkxMiwgLyogTUNTIHN0YXJ0ICovCiAJewotCQl7IFZBTElEX0FMTCwgVkFMSURfQUxMLCBXTEFOX1JDX1BIWV9DQ0ssIDEwMDAsIC8qIDEgTWIgKi8KLQkJCTkwMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCB9LAotCQl7IFZBTElEX0FMTCwgVkFMSURfQUxMLCBXTEFOX1JDX1BIWV9DQ0ssIDIwMDAsIC8qIDIgTWIgKi8KLQkJCTE5MDAsIDEsIDQsIDEsIDEsIDEsIDEsIDEgfSwKLQkJeyBWQUxJRF9BTEwsIFZBTElEX0FMTCwgV0xBTl9SQ19QSFlfQ0NLLCA1NTAwLCAvKiA1LjUgTWIgKi8KLQkJCTQ5MDAsIDIsIDExLCAyLCAyLCAyLCAyLCAyIH0sCi0JCXsgVkFMSURfQUxMLCBWQUxJRF9BTEwsIFdMQU5fUkNfUEhZX0NDSywgMTEwMDAsIC8qIDExIE1iICovCi0JCQk4MTAwLCAzLCAyMiwgMywgMywgMywgMywgMyB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDYwMDAsIC8qIDYgTWIgKi8KLQkJCTU0MDAsIDQsIDEyLCA0LCA0LCA0LCA0LCA0IH0sCi0JCXsgSU5WQUxJRCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgOTAwMCwgLyogOSBNYiAqLwotCQkJNzgwMCwgNSwgMTgsIDQsIDUsIDUsIDUsIDUgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDEyMDAwLCAvKiAxMiBNYiAqLwotCQkJMTAxMDAsIDYsIDI0LCA2LCA2LCA2LCA2LCA2IH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCAxODAwMCwgLyogMTggTWIgKi8KLQkJCTE0MTAwLCA3LCAzNiwgNiwgNywgNywgNywgNyB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMjQwMDAsIC8qIDI0IE1iICovCi0JCQkxNzcwMCwgOCwgNDgsIDgsIDgsIDgsIDgsIDggfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDM2MDAwLCAvKiAzNiBNYiAqLwotCQkJMjM3MDAsIDksIDcyLCA4LCA5LCA5LCA5LCA5IH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCA0ODAwMCwgLyogNDggTWIgKi8KLQkJCTI3NDAwLCAxMCwgOTYsIDgsIDEwLCAxMCwgMTAsIDEwIH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCA1NDAwMCwgLyogNTQgTWIgKi8KLQkJCTMwOTAwLCAxMSwgMTA4LCA4LCAxMSwgMTEsIDExLCAxMSB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCA2NTAwLCAvKiA2LjUgTWIgKi8KLQkJCTY0MDAsIDAsIDAsIDQsIDEyLCAyOCwgMTIsIDI4IH0sCi0JCXsgVkFMSURfMjAsIFZBTElEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgMTMwMDAsIC8qIDEzIE1iICovCi0JCQkxMjcwMCwgMSwgMSwgNiwgMTMsIDI5LCAxMywgMjkgfSwKLQkJeyBWQUxJRF8yMCwgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAxOTUwMCwgLyogMTkuNSBNYiAqLwotCQkJMTg4MDAsIDIsIDIsIDYsIDE0LCAzMCwgMTQsIDMwIH0sCi0JCXsgVkFMSURfMjAsIFZBTElEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgMjYwMDAsIC8qIDI2IE1iICovCi0JCQkyNTAwMCwgMywgMywgOCwgMTUsIDMxLCAxNSwgMzEgfSwKLQkJeyBWQUxJRF8yMCwgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAzOTAwMCwgLyogMzkgTWIgKi8KLQkJCTM2NzAwLCA0LCA0LCA4LCAxNiwgMzIsIDE2LCAzMiB9LAotCQl7IElOVkFMSUQsIFZBTElEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNTIwMDAsIC8qIDUyIE1iICovCi0JCQk0ODEwMCwgNSwgNSwgOCwgMTcsIDMzLCAxNywgMzMgfSwKLQkJeyBJTlZBTElELCAgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCA1ODUwMCwgLyogNTguNSBNYiAqLwotCQkJNTM1MDAsIDYsIDYsIDgsIDE4LCAzNCwgMTgsIDM0IH0sCi0JCXsgSU5WQUxJRCwgVkFMSURfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCA2NTAwMCwgLyogNjUgTWIgKi8KLQkJCTU5MDAwLCA3LCA3LCA4LCAxOSwgMzUsIDE5LCAzNiB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAxMzAwMCwgLyogMTMgTWIgKi8KLQkJCTEyNzAwLCA4LCA4LCA0LCAyMCwgMzcsIDIwLCAzNyB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAyNjAwMCwgLyogMjYgTWIgKi8KLQkJCTI0ODAwLCA5LCA5LCA2LCAyMSwgMzgsIDIxLCAzOCB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAzOTAwMCwgLyogMzkgTWIgKi8KLQkJCTM2NjAwLCAxMCwgMTAsIDYsIDIyLCAzOSwgMjIsIDM5IH0sCi0JCXsgVkFMSURfMjAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCA1MjAwMCwgLyogNTIgTWIgKi8KLQkJCTQ4MTAwLCAxMSwgMTEsIDgsIDIzLCA0MCwgMjMsIDQwIH0sCi0JCXsgVkFMSURfMjAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCA3ODAwMCwgLyogNzggTWIgKi8KLQkJCTY5NTAwLCAxMiwgMTIsIDgsIDI0LCA0MSwgMjQsIDQxIH0sCi0JCXsgVkFMSURfMjAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAxMDQwMDAsIC8qIDEwNCBNYiAqLwotCQkJODk1MDAsIDEzLCAxMywgOCwgMjUsIDQyLCAyNSwgNDIgfSwKLQkJeyBWQUxJRF8yMCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDExNzAwMCwgLyogMTE3IE1iICovCi0JCQk5ODkwMCwgMTQsIDE0LCA4LCAyNiwgNDMsIDI2LCA0NCB9LAotCQl7IFZBTElEXzIwLCBJTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMTMwMDAwLCAvKiAxMzAgTWIgKi8KLQkJCTEwODMwMCwgMTUsIDE1LCA4LCAyNywgNDQsIDI3LCA0NSB9LAotCQl7IFZBTElEXzQwLCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDEzNTAwLCAvKiAxMy41IE1iICovCi0JCQkxMzIwMCwgMCwgMCwgOCwgMTIsIDI4LCAyOCwgMjggfSwKLQkJeyBWQUxJRF80MCwgVkFMSURfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAyNzUwMCwgLyogMjcuMCBNYiAqLwotCQkJMjU5MDAsIDEsIDEsIDgsIDEzLCAyOSwgMjksIDI5IH0sCi0JCXsgVkFMSURfNDAsIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgNDA1MDAsIC8qIDQwLjUgTWIgKi8KLQkJCTM4NjAwLCAyLCAyLCA4LCAxNCwgMzAsIDMwLCAzMCB9LAotCQl7IFZBTElEXzQwLCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDU0MDAwLCAvKiA1NCBNYiAqLwotCQkJNDk4MDAsIDMsIDMsIDgsICAxNSwgMzEsIDMxLCAzMSB9LAotCQl7IFZBTElEXzQwLCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDgxNTAwLCAvKiA4MSBNYiAqLwotCQkJNzIyMDAsIDQsIDQsIDgsIDE2LCAzMiwgMzIsIDMyIH0sCi0JCXsgSU5WQUxJRCwgVkFMSURfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAxMDgwMDAsIC8qIDEwOCBNYiAqLwotCQkJOTI5MDAsIDUsIDUsIDgsIDE3LCAzMywgMzMsIDMzIH0sCi0JCXsgSU5WQUxJRCwgIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgMTIxNTAwLCAvKiAxMjEuNSBNYiAqLwotCQkJMTAyNzAwLCA2LCA2LCA4LCAxOCwgMzQsIDM0LCAzNCB9LAotCQl7IElOVkFMSUQsIFZBTElEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgMTM1MDAwLCAvKiAxMzUgTWIgKi8KLQkJCTExMjAwMCwgNywgNywgOCwgMTksIDM1LCAzNiwgMzYgfSwKLQkJeyBJTlZBTElELCBWQUxJRF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1NfSEdJLCAxNTAwMDAsIC8qIDE1MCBNYiAqLwotCQkJMTIyMDAwLCA3LCA3LCA4LCAxOSwgMzUsIDM2LCAzNiB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNzAwMCwgLyogMjcgTWIgKi8KLQkJCTI1ODAwLCA4LCA4LCA4LCAyMCwgMzcsIDM3LCAzNyB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCA1NDAwMCwgLyogNTQgTWIgKi8KLQkJCTQ5ODAwLCA5LCA5LCA4LCAyMSwgMzgsIDM4LCAzOCB9LAotCQl7IElOVkFMSUQsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCA4MTAwMCwgLyogODEgTWIgKi8KLQkJCTcxOTAwLCAxMCwgMTAsIDgsIDIyLCAzOSwgMzksIDM5IH0sCi0JCXsgVkFMSURfNDAsIElOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAxMDgwMDAsIC8qIDEwOCBNYiAqLwotCQkJOTI1MDAsIDExLCAxMSwgOCwgMjMsIDQwLCA0MCwgNDAgfSwKLQkJeyBWQUxJRF80MCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfRFMsIDE2MjAwMCwgLyogMTYyIE1iICovCi0JCQkxMzAzMDAsIDEyLCAxMiwgOCwgMjQsIDQxLCA0MSwgNDEgfSwKLQkJeyBWQUxJRF80MCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfRFMsIDIxNjAwMCwgLyogMjE2IE1iICovCi0JCQkxNjI4MDAsIDEzLCAxMywgOCwgMjUsIDQyLCA0MiwgNDIgfSwKLQkJeyBWQUxJRF80MCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfRFMsIDI0MzAwMCwgLyogMjQzIE1iICovCi0JCQkxNzgyMDAsIDE0LCAxNCwgOCwgMjYsIDQzLCA0MywgNDMgfSwKLQkJeyBWQUxJRF80MCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfRFMsIDI3MDAwMCwgLyogMjcwIE1iICovCi0JCQkxOTIxMDAsIDE1LCAxNSwgOCwgMjcsIDQ0LCA0NSwgNDUgfSwKLQkJeyBWQUxJRF80MCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfRFNfSEdJLCAzMDAwMDAsIC8qIDMwMCBNYiAqLwotCQkJMjA3MDAwLCAxNSwgMTUsIDgsIDI3LCA0NCwgNDUsIDQ1IH0sCisJCVswXSA9IHsgUkNfQUxMLCBXTEFOX1JDX1BIWV9DQ0ssIDEwMDAsCisJCQk5MDAsIDAsIDIsIDAsIDAsIDAsIDAgfSwgLyogMSBNYiAqLworCQlbMV0gPSB7IFJDX0FMTCwgV0xBTl9SQ19QSFlfQ0NLLCAyMDAwLAorCQkJMTkwMCwgMSwgNCwgMSwgMSwgMSwgMSB9LCAvKiAyIE1iICovCisJCVsyXSA9IHsgUkNfQUxMLCBXTEFOX1JDX1BIWV9DQ0ssIDU1MDAsCisJCQk0OTAwLCAyLCAxMSwgMiwgMiwgMiwgMiB9LCAvKiA1LjUgTWIgKi8KKwkJWzNdID0geyBSQ19BTEwsIFdMQU5fUkNfUEhZX0NDSywgMTEwMDAsCisJCQk4MTAwLCAzLCAyMiwgMywgMywgMywgMyB9LCAvKiAxMSBNYiAqLworCQlbNF0gPSB7IFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDYwMDAsCisJCQk1NDAwLCA0LCAxMiwgNCwgNCwgNCwgNCB9LCAvKiA2IE1iICovCisJCVs1XSA9IHsgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgOTAwMCwKKwkJCTc4MDAsIDUsIDE4LCA0LCA1LCA1LCA1IH0sIC8qIDkgTWIgKi8KKwkJWzZdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMTIwMDAsCisJCQkxMDEwMCwgNiwgMjQsIDYsIDYsIDYsIDYgfSwgLyogMTIgTWIgKi8KKwkJWzddID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMTgwMDAsCisJCQkxNDEwMCwgNywgMzYsIDYsIDcsIDcsIDcgfSwgLyogMTggTWIgKi8KKwkJWzhdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMjQwMDAsCisJCQkxNzcwMCwgOCwgNDgsIDgsIDgsIDgsIDggfSwgLyogMjQgTWIgKi8KKwkJWzldID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMzYwMDAsCisJCQkyMzcwMCwgOSwgNzIsIDgsIDksIDksIDkgfSwgLyogMzYgTWIgKi8KKwkJWzEwXSA9IHsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX09GRE0sIDQ4MDAwLAorCQkJMjc0MDAsIDEwLCA5NiwgOCwgMTAsIDEwLCAxMCB9LCAvKiA0OCBNYiAqLworCQlbMTFdID0geyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgNTQwMDAsCisJCQkzMDkwMCwgMTEsIDEwOCwgOCwgMTEsIDExLCAxMSB9LCAvKiA1NCBNYiAqLworCQlbMTJdID0geyBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNjUwMCwKKwkJCTY0MDAsIDAsIDAsIDQsIDQyLCAxMiwgNDIgfSwgLyogNi41IE1iICovCisJCVsxM10gPSB7IFJDX0hUX1NEVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfU1MsIDEzMDAwLAorCQkJMTI3MDAsIDEsIDEsIDYsIDQzLCAxMywgNDMgfSwgLyogMTMgTWIgKi8KKwkJWzE0XSA9IHsgUkNfSFRfU0RUXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgMTk1MDAsCisJCQkxODgwMCwgMiwgMiwgNiwgNDQsIDE0LCA0NCB9LCAvKiAxOS41IE1iKi8KKwkJWzE1XSA9IHsgUkNfSFRfU0RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCAyNjAwMCwKKwkJCTI1MDAwLCAzLCAzLCA4LCA0NSwgMTUsIDQ1IH0sIC8qIDI2IE1iICovCisJCVsxNl0gPSB7IFJDX0hUX1NEXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgMzkwMDAsCisJCQkzNjcwMCwgNCwgNCwgOCwgNDYsIDE2LCA0NiB9LCAvKiAzOSBNYiAqLworCQlbMTddID0geyBSQ19IVF9TXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNTIwMDAsCisJCQk0ODEwMCwgNSwgNSwgOCwgNDcsIDE3LCA0NyB9LCAvKiA1MiBNYiAqLworCQlbMThdID0geyBSQ19IVF9TXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9TUywgNTg1MDAsCisJCQk1MzUwMCwgNiwgNiwgOCwgNDgsIDE4LCA0OCB9LCAvKiA1OC41IE1iICovCisJCVsxOV0gPSB7IFJDX0hUX1NfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTLCA2NTAwMCwKKwkJCTU5MDAwLCA3LCA3LCA4LCA0OSwgMjAsIDUwIH0sIC8qIDY1IE1iICovCisJCVsyMF0gPSB7IFJDX0hUX1NfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1NTX0hHSSwgNzIyMDAsCisJCQk2NTQwMCwgNywgNywgOCwgNDksIDIwLCA1MCB9LCAvKiA2NSBNYiovCisJCVsyMV0gPSB7IFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAxMzAwMCwKKwkJCTEyNzAwLCA4LCA4LCA0LCA1MSwgMjEsIDUxIH0sIC8qIDEzIE1iICovCisJCVsyMl0gPSB7IFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAyNjAwMCwKKwkJCTI0ODAwLCA5LCA5LCA2LCA1MiwgMjIsIDUyIH0sIC8qIDI2IE1iICovCisJCVsyM10gPSB7IFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAzOTAwMCwKKwkJCTM2NjAwLCAxMCwgMTAsIDYsIDUzLCAyMywgNTMgfSwgLyogMzkgTWIgKi8KKwkJWzI0XSA9IHsgUkNfSFRfRFRfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCA1MjAwMCwKKwkJCTQ4MTAwLCAxMSwgMTEsIDgsIDU0LCAyNCwgNTQgfSwgLyogNTIgTWIgKi8KKwkJWzI1XSA9IHsgUkNfSFRfRFRfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCA3ODAwMCwKKwkJCTY5NTAwLCAxMiwgMTIsIDgsIDU1LCAyNSwgNTUgfSwgLyogNzggTWIgKi8KKwkJWzI2XSA9IHsgUkNfSFRfRFRfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX0RTLCAxMDQwMDAsCisJCQk4OTUwMCwgMTMsIDEzLCA4LCA1NiwgMjYsIDU2IH0sIC8qIDEwNCBNYiAqLworCQlbMjddID0geyBSQ19IVF9EVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfRFMsIDExNzAwMCwKKwkJCTk4OTAwLCAxNCwgMTQsIDgsIDU3LCAyNywgNTcgfSwgLyogMTE3IE1iICovCisJCVsyOF0gPSB7IFJDX0hUX0RUXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EUywgMTMwMDAwLAorCQkJMTA4MzAwLCAxNSwgMTUsIDgsIDU4LCAyOSwgNTkgfSwgLyogMTMwIE1iICovCisJCVsyOV0gPSB7IFJDX0hUX0RUXzIwLCBXTEFOX1JDX1BIWV9IVF8yMF9EU19IR0ksIDE0NDQwMCwKKwkJCTEyMDAwMCwgMTUsIDE1LCA4LCA1OCwgMjksIDU5IH0sIC8qIDE0NC40IE1iICovCisJCVszMF0gPSB7ICBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF8yMF9UUywgMTk1MDAsCisJCQkxNzQwMCwgMTYsIDE2LCA0LCA2MCwgMzAsIDYwIH0sIC8qIDE5LjUgTWIgKi8KKwkJWzMxXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAzOTAwMCwKKwkJCTM1MTAwLCAxNywgMTcsIDYsIDYxLCAzMSwgNjEgfSwgLyogMzkgTWIgKi8KKwkJWzMyXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCA1ODUwMCwKKwkJCTUyNjAwLCAxOCwgMTgsIDYsIDYyLCAzMiwgNjIgfSwgLyogNTguNSBNYiAqLworCQlbMzNdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfVFMsIDc4MDAwLAorCQkJNzA0MDAsIDE5LCAxOSwgOCwgNjMsIDMzLCA2MyB9LCAvKiA3OCBNYiAqLworCQlbMzRdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfVFMsIDExNzAwMCwKKwkJCTEwNDkwMCwgMjAsIDIwLCA4LCA2NCwgMzUsIDY1IH0sIC8qIDExNyBNYiAqLworCQlbMzVdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfMjBfVFNfSEdJLCAxMzAwMDAsCisJCQkxMTU4MDAsIDIwLCAyMCwgOCwgNjQsIDM1LCA2NSB9LCAvKiAxMzAgTWIgKi8KKwkJWzM2XSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAxNTYwMDAsCisJCQkxMzcyMDAsIDIxLCAyMSwgOCwgNjYsIDM3LCA2NyB9LCAvKiAxNTYgTWIgKi8KKwkJWzM3XSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTX0hHSSwgMTczMzAwLAorCQkJMTUxMTAwLCAyMSwgMjEsIDgsIDY2LCAzNywgNjcgfSwgLyogMTczLjMgTWIgKi8KKwkJWzM4XSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAxNzU1MDAsCisJCQkxNTI4MDAsIDIyLCAyMiwgOCwgNjgsIDM5LCA2OSB9LCAvKiAxNzUuNSBNYiAqLworCQlbMzldID0geyAgUkNfSFRfVF8yMCwgV0xBTl9SQ19QSFlfSFRfMjBfVFNfSEdJLCAxOTUwMDAsCisJCQkxNjg0MDAsIDIyLCAyMiwgOCwgNjgsIDM5LCA2OSB9LCAvKiAxOTUgTWIgKi8KKwkJWzQwXSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTLCAxOTUwMDAsCisJCQkxNjg0MDAsIDIzLCAyMywgOCwgNzAsIDQxLCA3MSB9LCAvKiAxOTUgTWIgKi8KKwkJWzQxXSA9IHsgIFJDX0hUX1RfMjAsIFdMQU5fUkNfUEhZX0hUXzIwX1RTX0hHSSwgMjE2NzAwLAorCQkJMTg1MDAwLCAyMywgMjMsIDgsIDcwLCA0MSwgNzEgfSwgLyogMjE2LjcgTWIgKi8KKwkJWzQyXSA9IHsgUkNfSFRfU0RUXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgMTM1MDAsCisJCQkxMzIwMCwgMCwgMCwgOCwgNDIsIDQyLCA0MiB9LCAvKiAxMy41IE1iICovCisJCVs0M10gPSB7IFJDX0hUX1NEVF80MCwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDI3NTAwLAorCQkJMjU5MDAsIDEsIDEsIDgsIDQzLCA0MywgNDMgfSwgLyogMjcuMCBNYiAqLworCQlbNDRdID0geyBSQ19IVF9TRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCA0MDUwMCwKKwkJCTM4NjAwLCAyLCAyLCA4LCA0NCwgNDQsIDQ0IH0sIC8qIDQwLjUgTWIgKi8KKwkJWzQ1XSA9IHsgUkNfSFRfU0RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCA1NDAwMCwKKwkJCTQ5ODAwLCAzLCAzLCA4LCA0NSwgNDUsIDQ1IH0sIC8qIDU0IE1iICovCisJCVs0Nl0gPSB7IFJDX0hUX1NEXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgODE1MDAsCisJCQk3MjIwMCwgNCwgNCwgOCwgNDYsIDQ2LCA0NiB9LCAvKiA4MSBNYiAqLworCQlbNDddID0geyBSQ19IVF9TXzQwICwgV0xBTl9SQ19QSFlfSFRfNDBfU1MsIDEwODAwMCwKKwkJCTkyOTAwLCA1LCA1LCA4LCA0NywgNDcsIDQ3IH0sIC8qIDEwOCBNYiAqLworCQlbNDhdID0geyBSQ19IVF9TXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9TUywgMTIxNTAwLAorCQkJMTAyNzAwLCA2LCA2LCA4LCA0OCwgNDgsIDQ4IH0sIC8qIDEyMS41IE1iICovCisJCVs0OV0gPSB7IFJDX0hUX1NfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTLCAxMzUwMDAsCisJCQkxMTIwMDAsIDcsIDcsIDgsIDQ5LCA1MCwgNTAgfSwgLyogMTM1IE1iICovCisJCVs1MF0gPSB7IFJDX0hUX1NfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1NTX0hHSSwgMTUwMDAwLAorCQkJMTIyMDAwLCA3LCA3LCA4LCA0OSwgNTAsIDUwIH0sIC8qIDE1MCBNYiAqLworCQlbNTFdID0geyBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9EUywgMjcwMDAsCisJCQkyNTgwMCwgOCwgOCwgOCwgNTEsIDUxLCA1MSB9LCAvKiAyNyBNYiAqLworCQlbNTJdID0geyBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9EUywgNTQwMDAsCisJCQk0OTgwMCwgOSwgOSwgOCwgNTIsIDUyLCA1MiB9LCAvKiA1NCBNYiAqLworCQlbNTNdID0geyBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9EUywgODEwMDAsCisJCQk3MTkwMCwgMTAsIDEwLCA4LCA1MywgNTMsIDUzIH0sIC8qIDgxIE1iICovCisJCVs1NF0gPSB7IFJDX0hUX0RUXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9EUywgMTA4MDAwLAorCQkJOTI1MDAsIDExLCAxMSwgOCwgNTQsIDU0LCA1NCB9LCAvKiAxMDggTWIgKi8KKwkJWzU1XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAxNjIwMDAsCisJCQkxMzAzMDAsIDEyLCAxMiwgOCwgNTUsIDU1LCA1NSB9LCAvKiAxNjIgTWIgKi8KKwkJWzU2XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyMTYwMDAsCisJCQkxNjI4MDAsIDEzLCAxMywgOCwgNTYsIDU2LCA1NiB9LCAvKiAyMTYgTWIgKi8KKwkJWzU3XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNDMwMDAsCisJCQkxNzgyMDAsIDE0LCAxNCwgOCwgNTcsIDU3LCA1NyB9LCAvKiAyNDMgTWIgKi8KKwkJWzU4XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTLCAyNzAwMDAsCisJCQkxOTIxMDAsIDE1LCAxNSwgOCwgNTgsIDU5LCA1OSB9LCAvKiAyNzAgTWIgKi8KKwkJWzU5XSA9IHsgUkNfSFRfRFRfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSwgMzAwMDAwLAorCQkJMjA3MDAwLCAxNSwgMTUsIDgsIDU4LCA1OSwgNTkgfSwgLyogMzAwIE1iICovCisJCVs2MF0gPSB7ICBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9IVF80MF9UUywgNDA1MDAsCisJCQkzNjEwMCwgMTYsIDE2LCA4LCA2MCwgNjAsIDYwIH0sIC8qIDQwLjUgTWIgKi8KKwkJWzYxXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCA4MTAwMCwKKwkJCTcyOTAwLCAxNywgMTcsIDgsIDYxLCA2MSwgNjEgfSwgLyogODEgTWIgKi8KKwkJWzYyXSA9IHsgIFJDX0lOVkFMSUQsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCAxMjE1MDAsCisJCQkxMDgzMDAsIDE4LCAxOCwgOCwgNjIsIDYyLCA2MiB9LCAvKiAxMjEuNSBNYiAqLworCQlbNjNdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfVFMsIDE2MjAwMCwKKwkJCTE0MjAwMCwgMTksIDE5LCA4LCA2MywgNjMsIDYzIH0sIC8qIDE2MiBNYiAqLworCQlbNjRdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfVFMsIDI0MzAwMCwKKwkJCTIwNTEwMCwgMjAsIDIwLCA4LCA2NCwgNjUsIDY1IH0sIC8qIDI0MyBNYiAqLworCQlbNjVdID0geyAgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfSFRfNDBfVFNfSEdJLCAyNzAwMDAsCisJCQkyMjQ3MDAsIDIwLCAyMCwgOCwgNjQsIDY1LCA2NSB9LCAvKiAxNzAgTWIgKi8KKwkJWzY2XSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTLCAzMjQwMDAsCisJCQkyNjMxMDAsIDIxLCAyMSwgOCwgNjYsIDY3LCA2NyB9LCAvKiAzMjQgTWIgKi8KKwkJWzY3XSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTX0hHSSwgMzYwMDAwLAorCQkJMjg4MDAwLCAyMSwgMjEsIDgsIDY2LCA2NywgNjcgfSwgLyogMzYwIE1iICovCisJCVs2OF0gPSB7ICBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9UUywgMzY0NTAwLAorCQkJMjkwNzAwLCAyMiwgMjIsIDgsIDY4LCA2OSwgNjkgfSwgLyogMzY0LjUgTWIgKi8KKwkJWzY5XSA9IHsgIFJDX0hUX1RfNDAsIFdMQU5fUkNfUEhZX0hUXzQwX1RTX0hHSSwgNDA1MDAwLAorCQkJMzE3MjAwLCAyMiwgMjIsIDgsIDY4LCA2OSwgNjkgfSwgLyogNDA1IE1iICovCisJCVs3MF0gPSB7ICBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9UUywgNDA1MDAwLAorCQkJMzE3MjAwLCAyMywgMjMsIDgsIDcwLCA3MSwgNzEgfSwgLyogNDA1IE1iICovCisJCVs3MV0gPSB7ICBSQ19IVF9UXzQwLCBXTEFOX1JDX1BIWV9IVF80MF9UU19IR0ksIDQ1MDAwMCwKKwkJCTM0NjQwMCwgMjMsIDIzLCA4LCA3MCwgNzEsIDcxIH0sIC8qIDQ1MCBNYiAqLwogCX0sCiAJNTAsICAvKiBwcm9iZSBpbnRlcnZhbCAqLwogCVdMQU5fUkNfSFRfRkxBRywgIC8qIFBoeSByYXRlcyBhbGxvd2VkIGluaXRpYWxseSAqLwpAQCAtMjIwLDIyICszMjQsMjIgQEAKIAk4LAogCTAsCiAJewotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgNjAwMCwgLyogNiBNYiAqLwotCQkJNTQwMCwgMCwgMTIsIDAsIDAsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDkwMDAsIC8qIDkgTWIgKi8KLQkJCTc4MDAsICAxLCAxOCwgMCwgMSwgMCB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMTIwMDAsIC8qIDEyIE1iICovCi0JCQkxMDAwMCwgMiwgMjQsIDIsIDIsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDE4MDAwLCAvKiAxOCBNYiAqLwotCQkJMTM5MDAsIDMsIDM2LCAyLCAzLCAwIH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCAyNDAwMCwgLyogMjQgTWIgKi8KLQkJCTE3MzAwLCA0LCA0OCwgNCwgNCwgMCB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMzYwMDAsIC8qIDM2IE1iICovCi0JCQkyMzAwMCwgNSwgNzIsIDQsIDUsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDQ4MDAwLCAvKiA0OCBNYiAqLwotCQkJMjc0MDAsIDYsIDk2LCA0LCA2LCAwIH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCA1NDAwMCwgLyogNTQgTWIgKi8KLQkJCTI5MzAwLCA3LCAxMDgsIDQsIDcsIDAgfSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgNjAwMCwgLyogNiBNYiAqLworCQkJNTQwMCwgMCwgMTIsIDB9LAorCQl7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCA5MDAwLCAvKiA5IE1iICovCisJCQk3ODAwLCAgMSwgMTgsIDB9LAorCQl7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCAxMjAwMCwgLyogMTIgTWIgKi8KKwkJCTEwMDAwLCAyLCAyNCwgMn0sCisJCXsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX09GRE0sIDE4MDAwLCAvKiAxOCBNYiAqLworCQkJMTM5MDAsIDMsIDM2LCAyfSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMjQwMDAsIC8qIDI0IE1iICovCisJCQkxNzMwMCwgNCwgNDgsIDR9LAorCQl7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCAzNjAwMCwgLyogMzYgTWIgKi8KKwkJCTIzMDAwLCA1LCA3MiwgNH0sCisJCXsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX09GRE0sIDQ4MDAwLCAvKiA0OCBNYiAqLworCQkJMjc0MDAsIDYsIDk2LCA0fSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgNTQwMDAsIC8qIDU0IE1iICovCisJCQkyOTMwMCwgNywgMTA4LCA0fSwKIAl9LAogCTUwLCAgLyogcHJvYmUgaW50ZXJ2YWwgKi8KIAkwLCAgIC8qIFBoeSByYXRlcyBhbGxvd2VkIGluaXRpYWxseSAqLwpAQCAtMjQ1LDMwICszNDksMzAgQEAKIAkxMiwKIAkwLAogCXsKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX0NDSywgMTAwMCwgLyogMSBNYiAqLwotCQkJOTAwLCAwLCAyLCAwLCAwLCAwIH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9DQ0ssIDIwMDAsIC8qIDIgTWIgKi8KLQkJCTE5MDAsIDEsIDQsIDEsIDEsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX0NDSywgNTUwMCwgLyogNS41IE1iICovCi0JCQk0OTAwLCAyLCAxMSwgMiwgMiwgMCB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfQ0NLLCAxMTAwMCwgLyogMTEgTWIgKi8KLQkJCTgxMDAsIDMsIDIyLCAzLCAzLCAwIH0sCi0JCXsgSU5WQUxJRCwgSU5WQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgNjAwMCwgLyogNiBNYiAqLwotCQkJNTQwMCwgNCwgMTIsIDQsIDQsIDAgfSwKLQkJeyBJTlZBTElELCBJTlZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCA5MDAwLCAvKiA5IE1iICovCi0JCQk3ODAwLCA1LCAxOCwgNCwgNSwgMCB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMTIwMDAsIC8qIDEyIE1iICovCi0JCQkxMDAwMCwgNiwgMjQsIDYsIDYsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDE4MDAwLCAvKiAxOCBNYiAqLwotCQkJMTM5MDAsIDcsIDM2LCA2LCA3LCAwIH0sCi0JCXsgVkFMSUQsIFZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCAyNDAwMCwgLyogMjQgTWIgKi8KLQkJCTE3MzAwLCA4LCA0OCwgOCwgOCwgMCB9LAotCQl7IFZBTElELCBWQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgMzYwMDAsIC8qIDM2IE1iICovCi0JCQkyMzAwMCwgOSwgNzIsIDgsIDksIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDQ4MDAwLCAvKiA0OCBNYiAqLwotCQkJMjc0MDAsIDEwLCA5NiwgOCwgMTAsIDAgfSwKLQkJeyBWQUxJRCwgVkFMSUQsIFdMQU5fUkNfUEhZX09GRE0sIDU0MDAwLCAvKiA1NCBNYiAqLwotCQkJMjkzMDAsIDExLCAxMDgsIDgsIDExLCAwIH0sCisJCXsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX0NDSywgMTAwMCwgLyogMSBNYiAqLworCQkJOTAwLCAwLCAyLCAwfSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfQ0NLLCAyMDAwLCAvKiAyIE1iICovCisJCQkxOTAwLCAxLCA0LCAxfSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfQ0NLLCA1NTAwLCAvKiA1LjUgTWIgKi8KKwkJCTQ5MDAsIDIsIDExLCAyfSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfQ0NLLCAxMTAwMCwgLyogMTEgTWIgKi8KKwkJCTgxMDAsIDMsIDIyLCAzfSwKKwkJeyBSQ19JTlZBTElELCBXTEFOX1JDX1BIWV9PRkRNLCA2MDAwLCAvKiA2IE1iICovCisJCQk1NDAwLCA0LCAxMiwgNH0sCisJCXsgUkNfSU5WQUxJRCwgV0xBTl9SQ19QSFlfT0ZETSwgOTAwMCwgLyogOSBNYiAqLworCQkJNzgwMCwgNSwgMTgsIDR9LAorCQl7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCAxMjAwMCwgLyogMTIgTWIgKi8KKwkJCTEwMDAwLCA2LCAyNCwgNn0sCisJCXsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX09GRE0sIDE4MDAwLCAvKiAxOCBNYiAqLworCQkJMTM5MDAsIDcsIDM2LCA2fSwKKwkJeyBSQ19MX1NEVCwgV0xBTl9SQ19QSFlfT0ZETSwgMjQwMDAsIC8qIDI0IE1iICovCisJCQkxNzMwMCwgOCwgNDgsIDh9LAorCQl7IFJDX0xfU0RULCBXTEFOX1JDX1BIWV9PRkRNLCAzNjAwMCwgLyogMzYgTWIgKi8KKwkJCTIzMDAwLCA5LCA3MiwgOH0sCisJCXsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX09GRE0sIDQ4MDAwLCAvKiA0OCBNYiAqLworCQkJMjc0MDAsIDEwLCA5NiwgOH0sCisJCXsgUkNfTF9TRFQsIFdMQU5fUkNfUEhZX09GRE0sIDU0MDAwLCAvKiA1NCBNYiAqLworCQkJMjkzMDAsIDExLCAxMDgsIDh9LAogCX0sCiAJNTAsICAvKiBwcm9iZSBpbnRlcnZhbCAqLwogCTAsICAgLyogUGh5IHJhdGVzIGFsbG93ZWQgaW5pdGlhbGx5ICovCkBAIC0zMzgsNyArNDQyLDcgQEAKIAkJCQkJICAgdTggaW5kZXgsIGludCB2YWxpZF90eF9yYXRlKQogewogCUJVR19PTihpbmRleCA+IGF0aF9yY19wcml2LT5yYXRlX3RhYmxlX3NpemUpOwotCWF0aF9yY19wcml2LT52YWxpZF9yYXRlX2luZGV4W2luZGV4XSA9IHZhbGlkX3R4X3JhdGUgPyAxIDogMDsKKwlhdGhfcmNfcHJpdi0+dmFsaWRfcmF0ZV9pbmRleFtpbmRleF0gPSAhIXZhbGlkX3R4X3JhdGU7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTM3MCw2ICs0NzQsOCBAQAogCQlyZXR1cm4gMDsKIAlpZiAoV0xBTl9SQ19QSFlfRFMocGh5KSAmJiAhKGNhcGZsYWcgJiBXTEFOX1JDX0RTX0ZMQUcpKQogCQlyZXR1cm4gMDsKKwlpZiAoV0xBTl9SQ19QSFlfVFMocGh5KSAmJiAhKGNhcGZsYWcgJiBXTEFOX1JDX1RTX0ZMQUcpKQorCQlyZXR1cm4gMDsKIAlpZiAoV0xBTl9SQ19QSFlfU0dJKHBoeSkgJiYgIShjYXBmbGFnICYgV0xBTl9SQ19TR0lfRkxBRykpCiAJCXJldHVybiAwOwogCWlmICghaWdub3JlX2N3ICYmIFdMQU5fUkNfUEhZX0hUKHBoeSkpCkBAIC00MDAsMTMgKzUwNiw5IEBACiAJCQkJIHUzMiBjYXBmbGFnKQogewogCXU4IGksIGhpID0gMDsKLQl1MzIgdmFsaWQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmF0ZV90YWJsZS0+cmF0ZV9jbnQ7IGkrKykgewotCQl2YWxpZCA9ICghKGF0aF9yY19wcml2LT5odF9jYXAgJiBXTEFOX1JDX0RTX0ZMQUcpID8KLQkJCSByYXRlX3RhYmxlLT5pbmZvW2ldLnZhbGlkX3NpbmdsZV9zdHJlYW0gOgotCQkJIHJhdGVfdGFibGUtPmluZm9baV0udmFsaWQpOwotCQlpZiAodmFsaWQgPT0gMSkgeworCQlpZiAocmF0ZV90YWJsZS0+aW5mb1tpXS5yYXRlX2ZsYWdzICYgUkNfTEVHQUNZKSB7CiAJCQl1MzIgcGh5ID0gcmF0ZV90YWJsZS0+aW5mb1tpXS5waHk7CiAJCQl1OCB2YWxpZF9yYXRlX2NvdW50ID0gMDsKIApAQCAtNDE4LDcgKzUyMCw3IEBACiAJCQlhdGhfcmNfcHJpdi0+dmFsaWRfcGh5X3JhdGVpZHhbcGh5XVt2YWxpZF9yYXRlX2NvdW50XSA9IGk7CiAJCQlhdGhfcmNfcHJpdi0+dmFsaWRfcGh5X3JhdGVjbnRbcGh5XSArPSAxOwogCQkJYXRoX3JjX3NldF92YWxpZF90eG1hc2soYXRoX3JjX3ByaXYsIGksIDEpOwotCQkJaGkgPSBBX01BWChoaSwgaSk7CisJCQloaSA9IGk7CiAJCX0KIAl9CiAKQEAgLTQzNiw5ICs1MzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCByYXRlc2V0LT5yc19ucmF0ZXM7IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgcmF0ZV90YWJsZS0+cmF0ZV9jbnQ7IGorKykgewogCQkJdTMyIHBoeSA9IHJhdGVfdGFibGUtPmluZm9bal0ucGh5OwotCQkJdTMyIHZhbGlkID0gKCEoYXRoX3JjX3ByaXYtPmh0X2NhcCAmIFdMQU5fUkNfRFNfRkxBRykgPwotCQkJCSAgICAgcmF0ZV90YWJsZS0+aW5mb1tqXS52YWxpZF9zaW5nbGVfc3RyZWFtIDoKLQkJCQkgICAgIHJhdGVfdGFibGUtPmluZm9bal0udmFsaWQpOworCQkJdTE2IHJhdGVfZmxhZ3MgPSByYXRlX3RhYmxlLT5pbmZvW2ldLnJhdGVfZmxhZ3M7CiAJCQl1OCByYXRlID0gcmF0ZXNldC0+cnNfcmF0ZXNbaV07CiAJCQl1OCBkb3QxMXJhdGUgPSByYXRlX3RhYmxlLT5pbmZvW2pdLmRvdDExcmF0ZTsKIApAQCAtNDQ3LDggKzU0Nyw5IEBACiAJCQkgKiAoVkFMSUQvVkFMSURfMjAvVkFMSURfNDApIGZsYWdzICovCiAKIAkJCWlmICgocmF0ZSA9PSBkb3QxMXJhdGUpICYmCi0JCQkgICAgKCh2YWxpZCAmIFdMQU5fUkNfQ0FQX01PREUoY2FwZmxhZykpID09Ci0JCQkgICAgIFdMQU5fUkNfQ0FQX01PREUoY2FwZmxhZykpICYmCisJCQkgICAgKHJhdGVfZmxhZ3MgJiBXTEFOX1JDX0NBUF9NT0RFKGNhcGZsYWcpKSA9PQorCQkJICAgIFdMQU5fUkNfQ0FQX01PREUoY2FwZmxhZykgJiYKKwkJCSAgICAocmF0ZV9mbGFncyAmIFdMQU5fUkNfQ0FQX1NUUkVBTShjYXBmbGFnKSkgJiYKIAkJCSAgICAhV0xBTl9SQ19QSFlfSFQocGh5KSkgewogCQkJCXU4IHZhbGlkX3JhdGVfY291bnQgPSAwOwogCkBAIC00ODIsMTQgKzU4MywxMyBAQAogCWZvciAoaSA9IDA7IGkgPCByYXRlc2V0LT5yc19ucmF0ZXM7IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgcmF0ZV90YWJsZS0+cmF0ZV9jbnQ7IGorKykgewogCQkJdTMyIHBoeSA9IHJhdGVfdGFibGUtPmluZm9bal0ucGh5OwotCQkJdTMyIHZhbGlkID0gKCEoYXRoX3JjX3ByaXYtPmh0X2NhcCAmIFdMQU5fUkNfRFNfRkxBRykgPwotCQkJCSAgICAgcmF0ZV90YWJsZS0+aW5mb1tqXS52YWxpZF9zaW5nbGVfc3RyZWFtIDoKLQkJCQkgICAgIHJhdGVfdGFibGUtPmluZm9bal0udmFsaWQpOworCQkJdTE2IHJhdGVfZmxhZ3MgPSByYXRlX3RhYmxlLT5pbmZvW2pdLnJhdGVfZmxhZ3M7CiAJCQl1OCByYXRlID0gcmF0ZXNldC0+cnNfcmF0ZXNbaV07CiAJCQl1OCBkb3QxMXJhdGUgPSByYXRlX3RhYmxlLT5pbmZvW2pdLmRvdDExcmF0ZTsKIAogCQkJaWYgKChyYXRlICE9IGRvdDExcmF0ZSkgfHwgIVdMQU5fUkNfUEhZX0hUKHBoeSkgfHwKLQkJCSAgICAhV0xBTl9SQ19QSFlfSFRfVkFMSUQodmFsaWQsIGNhcGZsYWcpKQorCQkJICAgICEocmF0ZV9mbGFncyAmIFdMQU5fUkNfQ0FQX1NUUkVBTShjYXBmbGFnKSkgfHwKKwkJCSAgICAhV0xBTl9SQ19QSFlfSFRfVkFMSUQocmF0ZV9mbGFncywgY2FwZmxhZykpCiAJCQkJY29udGludWU7CiAKIAkJCWlmICghYXRoX3JjX3ZhbGlkX3BoeXJhdGUocGh5LCBjYXBmbGFnLCAwKSkKQEAgLTU4NSwxMiArNjg1LDE1IEBACiAJaWYgKHJhdGUgPiAoYXRoX3JjX3ByaXYtPnJhdGVfdGFibGVfc2l6ZSAtIDEpKQogCQlyYXRlID0gYXRoX3JjX3ByaXYtPnJhdGVfdGFibGVfc2l6ZSAtIDE7CiAKLQlpZiAocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS52YWxpZCAmJgotCSAgICAoYXRoX3JjX3ByaXYtPmh0X2NhcCAmIFdMQU5fUkNfRFNfRkxBRykpCisJaWYgKFJDX1RTX09OTFkocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS5yYXRlX2ZsYWdzKSAmJgorCSAgICAoYXRoX3JjX3ByaXYtPmh0X2NhcCAmIFdMQU5fUkNfVFNfRkxBRykpCiAJCXJldHVybiByYXRlOwogCi0JaWYgKHJhdGVfdGFibGUtPmluZm9bcmF0ZV0udmFsaWRfc2luZ2xlX3N0cmVhbSAmJgotCSAgICAhKGF0aF9yY19wcml2LT5odF9jYXAgJiBXTEFOX1JDX0RTX0ZMQUcpKQorCWlmIChSQ19EU19PUl9MQVRFUihyYXRlX3RhYmxlLT5pbmZvW3JhdGVdLnJhdGVfZmxhZ3MpICYmCisJICAgIChhdGhfcmNfcHJpdi0+aHRfY2FwICYgKFdMQU5fUkNfRFNfRkxBRyB8IFdMQU5fUkNfVFNfRkxBRykpKQorCQlyZXR1cm4gcmF0ZTsKKworCWlmIChSQ19TU19PUl9MRUdBQ1kocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS5yYXRlX2ZsYWdzKSkKIAkJcmV0dXJuIHJhdGU7CiAKIAkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCkBAIC0xMDAzLDEyICsxMTA2LDE5IEBACiBzdGF0aWMgaW50IGF0aF9yY19nZXRfcmF0ZWluZGV4KGNvbnN0IHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqcmF0ZV90YWJsZSwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUpCiB7Ci0JaW50IHJpeDsKKwlpbnQgcml4ID0gMCwgaSA9IDA7CisJaW50IG1jc19yaXhfb2ZmW10gPSB7IDcsIDE1LCAyMCwgMjEsIDIyLCAyMyB9OwogCiAJaWYgKCEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSkKIAkJcmV0dXJuIHJhdGUtPmlkeDsKIAotCXJpeCA9IHJhdGUtPmlkeCArIHJhdGVfdGFibGUtPm1jc19zdGFydDsKKwl3aGlsZSAocmF0ZS0+aWR4ID4gbWNzX3JpeF9vZmZbaV0gJiYKKwkgICAgICBpIDwgc2l6ZW9mKG1jc19yaXhfb2ZmKS9zaXplb2YoaW50KSkgeworCQlyaXgrKzsgaSsrOworCX0KKworCXJpeCArPSByYXRlLT5pZHggKyByYXRlX3RhYmxlLT5tY3Nfc3RhcnQ7CisKIAlpZiAoKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkgJiYKIAkgICAgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSkKIAkJcml4ID0gcmF0ZV90YWJsZS0+aW5mb1tyaXhdLmh0X2luZGV4OwpAQCAtMTAxNiw4ICsxMTI2LDYgQEAKIAkJcml4ID0gcmF0ZV90YWJsZS0+aW5mb1tyaXhdLnNnaV9pbmRleDsKIAllbHNlIGlmIChyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpCiAJCXJpeCA9IHJhdGVfdGFibGUtPmluZm9bcml4XS5jdzQwaW5kZXg7Ci0JZWxzZQotCQlyaXggPSByYXRlX3RhYmxlLT5pbmZvW3JpeF0uYmFzZV9pbmRleDsKIAogCXJldHVybiByaXg7CiB9CkBAIC0xMTkzLDIwICsxMzAxLDE5IEBACiB9CiAKIHN0YXRpYyB1OCBhdGhfcmNfYnVpbGRfaHRfY2FwcyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgICBib29sIGlzX2N3NDAsIGJvb2wgaXNfc2dpNDApCisJCQkgICAgICAgYm9vbCBpc19jdzQwLCBib29sIGlzX3NnaSkKIHsKIAl1OCBjYXBzID0gMDsKIAogCWlmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpIHsKIAkJY2FwcyA9IFdMQU5fUkNfSFRfRkxBRzsKLQkJaWYgKHNjLT5zY19haC0+Y2Fwcy50eF9jaGFpbm1hc2sgIT0gMSAmJgotCQkgICAgYXRoOWtfaHdfZ2V0Y2FwYWJpbGl0eShzYy0+c2NfYWgsIEFUSDlLX0NBUF9EUywgMCwgTlVMTCkpIHsKLQkJCWlmIChzdGEtPmh0X2NhcC5tY3MucnhfbWFza1sxXSkKLQkJCQljYXBzIHw9IFdMQU5fUkNfRFNfRkxBRzsKLQkJfQorCQlpZiAoc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMV0gJiYgc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMl0pCisJCQljYXBzIHw9IFdMQU5fUkNfVFNfRkxBRyB8IFdMQU5fUkNfRFNfRkxBRzsKKwkJZWxzZSBpZiAoc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMV0pCisJCQljYXBzIHw9IFdMQU5fUkNfRFNfRkxBRzsKIAkJaWYgKGlzX2N3NDApCiAJCQljYXBzIHw9IFdMQU5fUkNfNDBfRkxBRzsKLQkJaWYgKGlzX3NnaTQwKQorCQlpZiAoaXNfc2dpKQogCQkJY2FwcyB8PSBXTEFOX1JDX1NHSV9GTEFHOwogCX0KIApAQCAtMTMwMCw3ICsxNDA3LDcgQEAKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IHByaXY7CiAJc3RydWN0IGF0aF9yYXRlX3ByaXYgKmF0aF9yY19wcml2ID0gcHJpdl9zdGE7CiAJY29uc3Qgc3RydWN0IGF0aF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlOwotCWJvb2wgaXNfY3c0MCwgaXNfc2dpNDA7CisJYm9vbCBpc19jdzQwLCBpc19zZ2kgPSBmYWxzZTsKIAlpbnQgaSwgaiA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgewpAQCAtMTMyMyw3ICsxNDMwLDExIEBACiAJfQogCiAJaXNfY3c0MCA9IHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOwotCWlzX3NnaTQwID0gc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CisKKwlpZiAoaXNfY3c0MCkKKwkJaXNfc2dpID0gc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CisJZWxzZSBpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfU0dJXzIwKQorCQlpc19zZ2kgPSBzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMDsKIAogCS8qIENob29zZSByYXRlIHRhYmxlIGZpcnN0ICovCiAKQEAgLTEzMzYsNyArMTQ0Nyw3IEBACiAJCXJhdGVfdGFibGUgPSBod19yYXRlX3RhYmxlW3NjLT5jdXJfcmF0ZV9tb2RlXTsKIAl9CiAKLQlhdGhfcmNfcHJpdi0+aHRfY2FwID0gYXRoX3JjX2J1aWxkX2h0X2NhcHMoc2MsIHN0YSwgaXNfY3c0MCwgaXNfc2dpNDApOworCWF0aF9yY19wcml2LT5odF9jYXAgPSBhdGhfcmNfYnVpbGRfaHRfY2FwcyhzYywgc3RhLCBpc19jdzQwLCBpc19zZ2kpOwogCWF0aF9yY19pbml0KHNjLCBwcml2X3N0YSwgc2JhbmQsIHN0YSwgcmF0ZV90YWJsZSk7CiB9CiAKQEAgLTEzNDcsMTAgKzE0NTgsMTAgQEAKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IHByaXY7CiAJc3RydWN0IGF0aF9yYXRlX3ByaXYgKmF0aF9yY19wcml2ID0gcHJpdl9zdGE7CiAJY29uc3Qgc3RydWN0IGF0aF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlID0gTlVMTDsKLQlib29sIG9wZXJfY3c0MCA9IGZhbHNlLCBvcGVyX3NnaTQwOworCWJvb2wgb3Blcl9jdzQwID0gZmFsc2UsIG9wZXJfc2dpOwogCWJvb2wgbG9jYWxfY3c0MCA9IChhdGhfcmNfcHJpdi0+aHRfY2FwICYgV0xBTl9SQ180MF9GTEFHKSA/CiAJCXRydWUgOiBmYWxzZTsKLQlib29sIGxvY2FsX3NnaTQwID0gKGF0aF9yY19wcml2LT5odF9jYXAgJiBXTEFOX1JDX1NHSV9GTEFHKSA/CisJYm9vbCBsb2NhbF9zZ2kgPSAoYXRoX3JjX3ByaXYtPmh0X2NhcCAmIFdMQU5fUkNfU0dJX0ZMQUcpID8KIAkJdHJ1ZSA6IGZhbHNlOwogCiAJLyogRklYTUU6IEhhbmRsZSBBUCBtb2RlIGxhdGVyIHdoZW4gd2Ugc3VwcG9ydCBDV00gKi8KQEAgLTEzNjMsMTUgKzE0NzQsMjEgQEAKIAkJICAgIG9wZXJfY2hhbl90eXBlID09IE5MODAyMTFfQ0hBTl9IVDQwUExVUykKIAkJCW9wZXJfY3c0MCA9IHRydWU7CiAKLQkJb3Blcl9zZ2k0MCA9IChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkgPwotCQkJdHJ1ZSA6IGZhbHNlOworCQlpZiAob3Blcl9jdzQwKQorCQkJb3Blcl9zZ2kgPSAoc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApID8KKwkJCQkgICB0cnVlIDogZmFsc2U7CisJCWVsc2UgaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX1NHSV8yMCkKKwkJCW9wZXJfc2dpID0gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/CisJCQkJICAgdHJ1ZSA6IGZhbHNlOworCQllbHNlCisJCQlvcGVyX3NnaSA9IGZhbHNlOwogCi0JCWlmICgobG9jYWxfY3c0MCAhPSBvcGVyX2N3NDApIHx8IChsb2NhbF9zZ2k0MCAhPSBvcGVyX3NnaTQwKSkgeworCQlpZiAoKGxvY2FsX2N3NDAgIT0gb3Blcl9jdzQwKSB8fCAobG9jYWxfc2dpICE9IG9wZXJfc2dpKSkgewogCQkJcmF0ZV90YWJsZSA9IGF0aF9jaG9vc2VfcmF0ZV90YWJsZShzYywgc2JhbmQtPmJhbmQsCiAJCQkJCQkgICBzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQsCiAJCQkJCQkgICBvcGVyX2N3NDApOwogCQkJYXRoX3JjX3ByaXYtPmh0X2NhcCA9IGF0aF9yY19idWlsZF9odF9jYXBzKHNjLCBzdGEsCi0JCQkJCQkgICBvcGVyX2N3NDAsIG9wZXJfc2dpNDApOworCQkJCQkJICAgb3Blcl9jdzQwLCBvcGVyX3NnaSk7CiAJCQlhdGhfcmNfaW5pdChzYywgcHJpdl9zdGEsIHNiYW5kLCBzdGEsIHJhdGVfdGFibGUpOwogCiAJCQlhdGhfcHJpbnQoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksIEFUSF9EQkdfQ09ORklHLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuaAppbmRleCAzZDhkNDBjLi5kYzEwODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuaApAQCAtMjQsMzIgKzI0LDYzIEBACiBzdHJ1Y3QgYXRoX3NvZnRjOwogCiAjZGVmaW5lIEFUSF9SQVRFX01BWCAgICAgMzAKLSNkZWZpbmUgUkFURV9UQUJMRV9TSVpFICA2NAorI2RlZmluZSBSQVRFX1RBQkxFX1NJWkUgIDcyCiAjZGVmaW5lIE1BWF9UWF9SQVRFX1BIWSAgNDgKIAotLyogVkFMSURfQUxMIC0gdmFsaWQgZm9yIDIwLzQwL0xlZ2FjeSwKLSAqIFZBTElEIC0gTGVnYWN5IG9ubHksCi0gKiBWQUxJRF8yMCAtIEhUIDIwIG9ubHksCi0gKiBWQUxJRF80MCAtIEhUIDQwIG9ubHkgKi8KIAotI2RlZmluZSBJTlZBTElEICAgIDB4MAotI2RlZmluZSBWQUxJRCAgICAgIDB4MQotI2RlZmluZSBWQUxJRF8yMCAgIDB4MgotI2RlZmluZSBWQUxJRF80MCAgIDB4NAotI2RlZmluZSBWQUxJRF8yMDQwIChWQUxJRF8yMHxWQUxJRF80MCkKLSNkZWZpbmUgVkFMSURfQUxMICAoVkFMSURfMjA0MHxWQUxJRCkKKyNkZWZpbmUgUkNfSU5WQUxJRAkweDAwMDAKKyNkZWZpbmUgUkNfTEVHQUNZCTB4MDAwMQorI2RlZmluZSBSQ19TUwkJMHgwMDAyCisjZGVmaW5lIFJDX0RTCQkweDAwMDQKKyNkZWZpbmUgUkNfVFMJCTB4MDAwOAorI2RlZmluZSBSQ19IVF8yMAkweDAwMTAKKyNkZWZpbmUgUkNfSFRfNDAJMHgwMDIwCisKKyNkZWZpbmUgUkNfU1RSRUFNX01BU0sJMHhlCisjZGVmaW5lIFJDX0RTX09SX0xBVEVSKGYpCSgoKChmKSAmIFJDX1NUUkVBTV9NQVNLKSA9PSBSQ19EUykgfHwgXAorCQkJCSgoKGYpICYgUkNfU1RSRUFNX01BU0spID09IChSQ19EUyB8IFJDX1RTKSkpCisjZGVmaW5lIFJDX1RTX09OTFkoZikJCSgoKGYpICYgUkNfU1RSRUFNX01BU0spID09IFJDX1RTKQorI2RlZmluZSBSQ19TU19PUl9MRUdBQ1koZikJKChmKSAmIChSQ19TUyB8IFJDX0xFR0FDWSkpCisKKyNkZWZpbmUgUkNfSFRfMjA0MAkJKFJDX0hUXzIwIHwgUkNfSFRfNDApCisjZGVmaW5lIFJDX0FMTF9TVFJFQU0JCShSQ19TUyB8IFJDX0RTIHwgUkNfVFMpCisjZGVmaW5lIFJDX0xfU0QJCQkoUkNfTEVHQUNZIHwgUkNfU1MgfCBSQ19EUykKKyNkZWZpbmUgUkNfTF9TRFQJCShSQ19MRUdBQ1kgfCBSQ19TUyB8IFJDX0RTIHwgUkNfVFMpCisjZGVmaW5lIFJDX0hUX1NfMjAJCShSQ19IVF8yMCB8IFJDX1NTKQorI2RlZmluZSBSQ19IVF9EXzIwCQkoUkNfSFRfMjAgfCBSQ19EUykKKyNkZWZpbmUgUkNfSFRfVF8yMAkJKFJDX0hUXzIwIHwgUkNfVFMpCisjZGVmaW5lIFJDX0hUX1NfNDAJCShSQ19IVF80MCB8IFJDX1NTKQorI2RlZmluZSBSQ19IVF9EXzQwCQkoUkNfSFRfNDAgfCBSQ19EUykKKyNkZWZpbmUgUkNfSFRfVF80MAkJKFJDX0hUXzQwIHwgUkNfVFMpCisKKyNkZWZpbmUgUkNfSFRfU0RfMjAJCShSQ19IVF8yMCB8IFJDX1NTIHwgUkNfRFMpCisjZGVmaW5lIFJDX0hUX0RUXzIwCQkoUkNfSFRfMjAgfCBSQ19EUyB8IFJDX1RTKQorI2RlZmluZSBSQ19IVF9TRF80MAkJKFJDX0hUXzQwIHwgUkNfU1MgfCBSQ19EUykKKyNkZWZpbmUgUkNfSFRfRFRfNDAJCShSQ19IVF80MCB8IFJDX0RTIHwgUkNfVFMpCisKKyNkZWZpbmUgUkNfSFRfU0RfMjA0MAkJKFJDX0hUXzIwNDAgfCBSQ19TUyB8IFJDX0RTKQorI2RlZmluZSBSQ19IVF9TRFRfMjA0MAkJKFJDX0hUXzIwNDAgfCBSQ19TUyB8IFJDX0RTIHwgUkNfVFMpCisKKyNkZWZpbmUgUkNfSFRfU0RUXzIwCQkoUkNfSFRfMjAgfCBSQ19TUyB8IFJDX0RTIHwgUkNfVFMpCisjZGVmaW5lIFJDX0hUX1NEVF80MAkJKFJDX0hUXzQwIHwgUkNfU1MgfCBSQ19EUyB8IFJDX1RTKQorCisjZGVmaW5lIFJDX0FMTAkJCShSQ19MRUdBQ1kgfCBSQ19IVF8yMDQwIHwgUkNfQUxMX1NUUkVBTSkKIAogZW51bSB7CiAJV0xBTl9SQ19QSFlfT0ZETSwKIAlXTEFOX1JDX1BIWV9DQ0ssCiAJV0xBTl9SQ19QSFlfSFRfMjBfU1MsCiAJV0xBTl9SQ19QSFlfSFRfMjBfRFMsCisJV0xBTl9SQ19QSFlfSFRfMjBfVFMsCiAJV0xBTl9SQ19QSFlfSFRfNDBfU1MsCiAJV0xBTl9SQ19QSFlfSFRfNDBfRFMsCisJV0xBTl9SQ19QSFlfSFRfNDBfVFMsCiAJV0xBTl9SQ19QSFlfSFRfMjBfU1NfSEdJLAogCVdMQU5fUkNfUEhZX0hUXzIwX0RTX0hHSSwKKwlXTEFOX1JDX1BIWV9IVF8yMF9UU19IR0ksCiAJV0xBTl9SQ19QSFlfSFRfNDBfU1NfSEdJLAogCVdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSwKKwlXTEFOX1JDX1BIWV9IVF80MF9UU19IR0ksCiAJV0xBTl9SQ19QSFlfTUFYCiB9OwogCkBAIC01NywzNiArODgsNTAgQEAKIAkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9EUykJXAogCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTX0hHSSkJXAogCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSkpCisjZGVmaW5lIFdMQU5fUkNfUEhZX1RTKF9waHkpICAgKChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX1RTKQkJXAorCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX1RTKQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfVFNfSEdJKQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfVFNfSEdJKSkKICNkZWZpbmUgV0xBTl9SQ19QSFlfMjAoX3BoeSkgICAoKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfU1MpCQlcCiAJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfRFMpCVwKKwkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF8yMF9UUykJXAogCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX1NTX0hHSSkJXAotCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTX0hHSSkpCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfRFNfSEdJKQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfVFNfSEdJKSkKICNkZWZpbmUgV0xBTl9SQ19QSFlfNDAoX3BoeSkgICAoKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfU1MpCQlcCiAJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfRFMpCVwKKwkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9UUykJXAogCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX1NTX0hHSSkJXAotCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSkpCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfRFNfSEdJKQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfVFNfSEdJKSkKICNkZWZpbmUgV0xBTl9SQ19QSFlfU0dJKF9waHkpICAoKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfU1NfSEdJKSAgICAgIFwKIAkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF8yMF9EU19IR0kpICAgXAorCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX1RTX0hHSSkgICBcCiAJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfU1NfSEdJKSAgIFwKLQkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9EU19IR0kpKQorCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSkgICBcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfVFNfSEdJKSkKIAogI2RlZmluZSBXTEFOX1JDX1BIWV9IVChfcGh5KSAgICAoX3BoeSA+PSBXTEFOX1JDX1BIWV9IVF8yMF9TUykKIAogI2RlZmluZSBXTEFOX1JDX0NBUF9NT0RFKGNhcGZsYWcpICgoKGNhcGZsYWcgJiBXTEFOX1JDX0hUX0ZMQUcpID8JXAotCQkoY2FwZmxhZyAmIFdMQU5fUkNfNDBfRkxBRykgPyBWQUxJRF80MCA6IFZBTElEXzIwIDogVkFMSUQpKQorCSgoY2FwZmxhZyAmIFdMQU5fUkNfNDBfRkxBRykgPyBSQ19IVF80MCA6IFJDX0hUXzIwKSA6IFJDX0xFR0FDWSkpCisKKyNkZWZpbmUgV0xBTl9SQ19DQVBfU1RSRUFNKGNhcGZsYWcpICgoKGNhcGZsYWcgJiBXTEFOX1JDX1RTX0ZMQUcpID8JXAorCShSQ19UUykgOiAoKGNhcGZsYWcgJiBXTEFOX1JDX0RTX0ZMQUcpID8gUkNfRFMgOiBSQ19TUykpKQogCiAvKiBSZXR1cm4gVFJVRSBpZiBmbGFnIHN1cHBvcnRzIEhUMjAgJiYgY2xpZW50IHN1cHBvcnRzIEhUMjAgb3IKICAqIHJldHVybiBUUlVFIGlmIGZsYWcgc3VwcG9ydHMgSFQ0MCAmJiBjbGllbnQgc3VwcG9ydHMgSFQ0MC4KICAqIFRoaXMgaXMgdXNlZCBiZWNvcyBzb21lIHJhdGVzIG92ZXJsYXAgYmV0d2VlbiBIVDIwL0hUNDAuCiAgKi8KICNkZWZpbmUgV0xBTl9SQ19QSFlfSFRfVkFMSUQoZmxhZywgY2FwZmxhZykJCQlcCi0JKCgoZmxhZyAmIFZBTElEXzIwKSAmJiAhKGNhcGZsYWcgJiBXTEFOX1JDXzQwX0ZMQUcpKSB8fCBcCi0JICgoZmxhZyAmIFZBTElEXzQwKSAmJiAoY2FwZmxhZyAmIFdMQU5fUkNfNDBfRkxBRykpKQorCSgoKGZsYWcgJiBSQ19IVF8yMCkgJiYgIShjYXBmbGFnICYgV0xBTl9SQ180MF9GTEFHKSkgfHwgXAorCSAoKGZsYWcgJiBSQ19IVF80MCkgJiYgKGNhcGZsYWcgJiBXTEFOX1JDXzQwX0ZMQUcpKSkKIAogI2RlZmluZSBXTEFOX1JDX0RTX0ZMQUcgICAgICAgICAoMHgwMSkKLSNkZWZpbmUgV0xBTl9SQ180MF9GTEFHICAgICAgICAgKDB4MDIpCi0jZGVmaW5lIFdMQU5fUkNfU0dJX0ZMQUcgICAgICAgICgweDA0KQotI2RlZmluZSBXTEFOX1JDX0hUX0ZMQUcgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgV0xBTl9SQ19UU19GTEFHICAgICAgICAgKDB4MDIpCisjZGVmaW5lIFdMQU5fUkNfNDBfRkxBRyAgICAgICAgICgweDA0KQorI2RlZmluZSBXTEFOX1JDX1NHSV9GTEFHICAgICAgICAoMHgwOCkKKyNkZWZpbmUgV0xBTl9SQ19IVF9GTEFHICAgICAgICAgKDB4MTApCiAKIC8qKgogICogc3RydWN0IGF0aF9yYXRlX3RhYmxlIC0gUmF0ZSBDb250cm9sIHRhYmxlCkBAIC0xMTAsMTUgKzE1NSwxMyBAQAogCWludCByYXRlX2NudDsKIAlpbnQgbWNzX3N0YXJ0OwogCXN0cnVjdCB7Ci0JCXU4IHZhbGlkOwotCQl1OCB2YWxpZF9zaW5nbGVfc3RyZWFtOworCQl1MTYgcmF0ZV9mbGFnczsKIAkJdTggcGh5OwogCQl1MzIgcmF0ZWticHM7CiAJCXUzMiB1c2VyX3JhdGVrYnBzOwogCQl1OCByYXRlY29kZTsKIAkJdTggZG90MTFyYXRlOwogCQl1OCBjdHJsX3JhdGU7Ci0JCXU4IGJhc2VfaW5kZXg7CiAJCXU4IGN3NDBpbmRleDsKIAkJdTggc2dpX2luZGV4OwogCQl1OCBodF9pbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jCmluZGV4IGNhNjA2NWIuLmRhMGNmZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYwpAQCAtMTE2LDkgKzExNiw2IEBACiAJLyogY29uZmlndXJlIG9wZXJhdGlvbmFsIG1vZGUgKi8KIAlhdGg5a19od19zZXRvcG1vZGUoYWgpOwogCi0JLyogSGFuZGxlIGFueSBsaW5rLWxldmVsIGFkZHJlc3MgY2hhbmdlLiAqLwotCWF0aDlrX2h3X3NldG1hYyhhaCwgY29tbW9uLT5tYWNhZGRyKTsKLQogCS8qIGNhbGN1bGF0ZSBhbmQgaW5zdGFsbCBtdWx0aWNhc3QgZmlsdGVyICovCiAJbWZpbHRbMF0gPSBtZmlsdFsxXSA9IH4wOwogCWF0aDlrX2h3X3NldG1jYXN0ZmlsdGVyKGFoLCBtZmlsdFswXSwgbWZpbHRbMV0pOwpAQCAtMjk1LDcgKzI5Miw3IEBACiAKIAlhdGhfb3Btb2RlX2luaXQoc2MpOwogCi0JYXRoOWtfaHdfc3RhcnRwY3VyZWNlaXZlKHNjLT5zY19haCk7CisJYXRoOWtfaHdfc3RhcnRwY3VyZWNlaXZlKHNjLT5zY19haCwgKHNjLT5zY19mbGFncyAmIFNDX09QX1NDQU5OSU5HKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF9lZG1hX3N0b3BfcmVjdihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKQEAgLTUwMSw3ICs0OTgsNyBAQAogc3RhcnRfcmVjdjoKIAlzcGluX3VubG9ja19iaCgmc2MtPnJ4LnJ4YnVmbG9jayk7CiAJYXRoX29wbW9kZV9pbml0KHNjKTsKLQlhdGg5a19od19zdGFydHBjdXJlY2VpdmUoYWgpOworCWF0aDlrX2h3X3N0YXJ0cGN1cmVjZWl2ZShhaCwgKHNjLT5zY19mbGFncyAmIFNDX09QX1NDQU5OSU5HKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcwMCwxMiArNjk3LDE2IEBACiAJYmYgPSBTS0JfQ0JfQVRIQlVGKHNrYik7CiAJQlVHX09OKCFiZik7CiAKLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzYy0+ZGV2LCBiZi0+YmZfYnVmX2FkZHIsCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc2MtPmRldiwgYmYtPmJmX2J1Zl9hZGRyLAogCQkJCWNvbW1vbi0+cnhfYnVmc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAogCXJldCA9IGF0aDlrX2h3X3Byb2Nlc3NfcnhkZXNjX2VkbWEoYWgsIE5VTEwsIHNrYi0+ZGF0YSk7Ci0JaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MpCisJaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJLypsZXQgZGV2aWNlIGdhaW4gdGhlIGJ1ZmZlciBhZ2FpbiovCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNjLT5kZXYsIGJmLT5iZl9idWZfYWRkciwKKwkJCQljb21tb24tPnJ4X2J1ZnNpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJCXJldHVybiBmYWxzZTsKKwl9CiAKIAlfX3NrYl91bmxpbmsoc2tiLCAmcnhfZWRtYS0+cnhfZmlmbyk7CiAJaWYgKHJldCA9PSAtRUlOVkFMKSB7CkBAIC04MTQsMTMgKzgxNSwyNjMgQEAKIAkgKiAxLiBhY2Nlc3NpbmcgdGhlIGZyYW1lCiAJICogMi4gcmVxdWV1ZWluZyB0aGUgc2FtZSBidWZmZXIgdG8gaC93CiAJICovCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc2MtPmRldiwgYmYtPmJmX2J1Zl9hZGRyLAorCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNjLT5kZXYsIGJmLT5iZl9idWZfYWRkciwKIAkJCWNvbW1vbi0+cnhfYnVmc2l6ZSwKIAkJCURNQV9GUk9NX0RFVklDRSk7CiAKIAlyZXR1cm4gYmY7CiB9CiAKKy8qIEFzc3VtZXMgeW91J3ZlIGFscmVhZHkgZG9uZSB0aGUgZW5kaWFuIHRvIENQVSBjb252ZXJzaW9uICovCitzdGF0aWMgYm9vbCBhdGg5a19yeF9hY2NlcHQoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeHMsCisJCQkgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzLAorCQkJICAgIGJvb2wgKmRlY3J5cHRfZXJyb3IpCit7CisJc3RydWN0IGF0aF9odyAqYWggPSBjb21tb24tPmFoOworCV9fbGUxNiBmYzsKKwl1OCByeF9zdGF0dXNfbGVuID0gYWgtPmNhcHMucnhfc3RhdHVzX2xlbjsKKworCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisJaWYgKCFyeF9zdGF0cy0+cnNfZGF0YWxlbikKKwkJcmV0dXJuIGZhbHNlOworICAgICAgICAvKgorICAgICAgICAgKiByc19zdGF0dXMgZm9sbG93cyByc19kYXRhbGVuIHNvIGlmIHJzX2RhdGFsZW4gaXMgdG9vIGxhcmdlCisgICAgICAgICAqIHdlIGNhbiB0YWtlIGEgaGludCB0aGF0IGhhcmR3YXJlIGNvcnJ1cHRlZCBpdCwgc28gaWdub3JlCisgICAgICAgICAqIHRob3NlIGZyYW1lcy4KKyAgICAgICAgICovCisJaWYgKHJ4X3N0YXRzLT5yc19kYXRhbGVuID4gKGNvbW1vbi0+cnhfYnVmc2l6ZSAtIHJ4X3N0YXR1c19sZW4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIHJzX21vcmUgaW5kaWNhdGVzIGNoYWluZWQgZGVzY3JpcHRvcnMgd2hpY2ggY2FuIGJlIHVzZWQKKwkgKiB0byBsaW5rIGJ1ZmZlcnMgdG9nZXRoZXIgZm9yIGEgc29ydCBvZiBzY2F0dGVyLWdhdGhlcgorCSAqIG9wZXJhdGlvbi4KKwkgKiByZWplY3QgdGhlIGZyYW1lLCB3ZSBkb24ndCBzdXBwb3J0IHNjYXR0ZXItZ2F0aGVyIHlldCBhbmQKKwkgKiB0aGUgZnJhbWUgaXMgcHJvYmFibHkgY29ycnVwdCBhbnl3YXkKKwkgKi8KKwlpZiAocnhfc3RhdHMtPnJzX21vcmUpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogVGhlIHJ4X3N0YXRzLT5yc19zdGF0dXMgd2lsbCBub3QgYmUgc2V0IHVudGlsIHRoZSBlbmQgb2YgdGhlCisJICogY2hhaW5lZCBkZXNjcmlwdG9ycyBzbyBpdCBjYW4gYmUgaWdub3JlZCBpZiByc19tb3JlIGlzIHNldC4gVGhlCisJICogcnNfbW9yZSB3aWxsIGJlIGZhbHNlIGF0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluZWQKKwkgKiBkZXNjcmlwdG9ycy4KKwkgKi8KKwlpZiAocnhfc3RhdHMtPnJzX3N0YXR1cyAhPSAwKSB7CisJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfQ1JDKQorCQkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7CisJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfUEhZKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfREVDUllQVCkgeworCQkJKmRlY3J5cHRfZXJyb3IgPSB0cnVlOworCQl9IGVsc2UgaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9NSUMpIHsKKwkJCWlmIChpZWVlODAyMTFfaXNfY3RsKGZjKSkKKwkJCQkvKgorCQkJCSAqIFNvbWV0aW1lcywgd2UgZ2V0IGludmFsaWQKKwkJCQkgKiBNSUMgZmFpbHVyZXMgb24gdmFsaWQgY29udHJvbCBmcmFtZXMuCisJCQkJICogUmVtb3ZlIHRoZXNlIG1pYyBlcnJvcnMuCisJCQkJICovCisJCQkJcnhfc3RhdHMtPnJzX3N0YXR1cyAmPSB+QVRIOUtfUlhFUlJfTUlDOworCQkJZWxzZQorCQkJCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX01NSUNfRVJST1I7CisJCX0KKwkJLyoKKwkJICogUmVqZWN0IGVycm9yIGZyYW1lcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKKwkJICogZGVjcnlwdGlvbiBhbmQgTUlDIGZhaWx1cmVzLiBGb3IgbW9uaXRvciBtb2RlLAorCQkgKiB3ZSBhbHNvIGlnbm9yZSB0aGUgQ1JDIGVycm9yLgorCQkgKi8KKwkJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikgeworCQkJaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJgorCQkJICAgIH4oQVRIOUtfUlhFUlJfREVDUllQVCB8IEFUSDlLX1JYRVJSX01JQyB8CisJCQkgICAgICBBVEg5S19SWEVSUl9DUkMpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYKKwkJCSAgICB+KEFUSDlLX1JYRVJSX0RFQ1JZUFQgfCBBVEg5S19SWEVSUl9NSUMpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGF0aDlrX3Byb2Nlc3NfcmF0ZShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnhfc3RhdHMsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhzKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisKKwliYW5kID0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKKwlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbYmFuZF07CisKKwlpZiAocnhfc3RhdHMtPnJzX3JhdGUgJiAweDgwKSB7CisJCS8qIEhUIHJhdGUgKi8KKwkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfSFQ7CisJCWlmIChyeF9zdGF0cy0+cnNfZmxhZ3MgJiBBVEg5S19SWF8yMDQwKQorCQkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfNDBNSFo7CisJCWlmIChyeF9zdGF0cy0+cnNfZmxhZ3MgJiBBVEg5S19SWF9HSSkKKwkJCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOworCQlyeHMtPnJhdGVfaWR4ID0gcnhfc3RhdHMtPnJzX3JhdGUgJiAweDdmOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgeworCQlpZiAoc2JhbmQtPmJpdHJhdGVzW2ldLmh3X3ZhbHVlID09IHJ4X3N0YXRzLT5yc19yYXRlKSB7CisJCQlyeHMtPnJhdGVfaWR4ID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzYmFuZC0+Yml0cmF0ZXNbaV0uaHdfdmFsdWVfc2hvcnQgPT0gcnhfc3RhdHMtPnJzX3JhdGUpIHsKKwkJCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOworCQkJcnhzLT5yYXRlX2lkeCA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogTm8gdmFsaWQgaGFyZHdhcmUgYml0cmF0ZSBmb3VuZCAtLSB3ZSBzaG91bGQgbm90IGdldCBoZXJlCisJICogYmVjYXVzZSBoYXJkd2FyZSBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhpcyBmcmFtZSBhcyBPSy4KKwkgKi8KKwlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1hNSVQsICJ1bnN1cHBvcnRlZCBodyBiaXRyYXRlIGRldGVjdGVkICIKKwkJICAiMHglMDJ4IHVzaW5nIDEgTWJpdFxuIiwgcnhfc3RhdHMtPnJzX3JhdGUpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDlrX3Byb2Nlc3NfcnNzaShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gY29tbW9uLT5haDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCXN0cnVjdCBhdGhfbm9kZSAqYW47CisJaW50IGxhc3RfcnNzaSA9IEFUSF9SU1NJX0RVTU1ZX01BUktFUjsKKwlfX2xlMTYgZmM7CisKKwlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwkvKgorCSAqIFhYWDogdXNlIGllZWU4MDIxMV9maW5kX3N0YSEgVGhpcyByZXF1aXJlcyBxdWl0ZSBhIGJpdCBvZiB3b3JrCisJICogdW5kZXIgdGhlIGN1cnJlbnQgYXRoOWsgdmlydHVhbCB3aXBoeSBpbXBsZW1lbnRhdGlvbiBhcyB3ZSBoYXZlCisJICogbm8gd2F5IG9mIHR5aW5nIGEgdmlmIHRvIHdpcGh5LiBUeXBpY2FsbHkgdmlmcyBhcmUgYXR0YWNoZWQgdG8KKwkgKiBhdCBsZWFzdCBvbmUgc2RhdGEgb2YgYSB3aXBoeSBvbiBtYWM4MDIxMSBidXQgd2l0aCBhdGg5ayB2aXJ0dWFsCisJICogd2lwaHkgeW91J2QgaGF2ZSB0byBpdGVyYXRlIG92ZXIgZXZlcnkgd2lwaHkgYW5kIGVhY2ggc2RhdGEuCisJICovCisJc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2h3KGh3LCBoZHItPmFkZHIyKTsKKwlpZiAoc3RhKSB7CisJCWFuID0gKHN0cnVjdCBhdGhfbm9kZSAqKSBzdGEtPmRydl9wcml2OworCQlpZiAocnhfc3RhdHMtPnJzX3Jzc2kgIT0gQVRIOUtfUlNTSV9CQUQgJiYKKwkJICAgIXJ4X3N0YXRzLT5yc19tb3JlYWdncikKKwkJCUFUSF9SU1NJX0xQRihhbi0+bGFzdF9yc3NpLCByeF9zdGF0cy0+cnNfcnNzaSk7CisJCWxhc3RfcnNzaSA9IGFuLT5sYXN0X3Jzc2k7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGxpa2VseShsYXN0X3Jzc2kgIT0gQVRIX1JTU0lfRFVNTVlfTUFSS0VSKSkKKwkJcnhfc3RhdHMtPnJzX3Jzc2kgPSBBVEhfRVBfUk5EKGxhc3RfcnNzaSwKKwkJCQkJICAgICAgQVRIX1JTU0lfRVBfTVVMVElQTElFUik7CisJaWYgKHJ4X3N0YXRzLT5yc19yc3NpIDwgMCkKKwkJcnhfc3RhdHMtPnJzX3Jzc2kgPSAwOworCisJLyogVXBkYXRlIEJlYWNvbiBSU1NJLCB0aGlzIGlzIHVzZWQgYnkgQU5JLiAqLworCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGZjKSkKKwkJYWgtPnN0YXRzLmF2Z2Jyc3NpID0gcnhfc3RhdHMtPnJzX3Jzc2k7Cit9CisKKy8qCisgKiBGb3IgRGVjcnlwdCBvciBEZW1pYyBlcnJvcnMsIHdlIG9ubHkgbWFyayBwYWNrZXQgc3RhdHVzIGhlcmUgYW5kIGFsd2F5cyBwdXNoCisgKiB1cCB0aGUgZnJhbWUgdXAgdG8gbGV0IG1hYzgwMjExIGhhbmRsZSB0aGUgYWN0dWFsIGVycm9yIGNhc2UsIGJlIGl0IG5vCisgKiBkZWNyeXB0aW9uIGtleSBvciByZWFsIGRlY3J5cHRpb24gZXJyb3IuIFRoaXMgbGV0IHVzIGtlZXAgc3RhdGlzdGljcyB0aGVyZS4KKyAqLworc3RhdGljIGludCBhdGg5a19yeF9za2JfcHJlcHJvY2VzcyhzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCQkJICAgYm9vbCAqZGVjcnlwdF9lcnJvcikKK3sKKwltZW1zZXQocnhfc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMpKTsKKworCS8qCisJICogZXZlcnl0aGluZyBidXQgdGhlIHJhdGUgaXMgY2hlY2tlZCBoZXJlLCB0aGUgcmF0ZSBjaGVjayBpcyBkb25lCisJICogc2VwYXJhdGVseSB0byBhdm9pZCBkb2luZyB0d28gbG9va3VwcyBmb3IgYSByYXRlIGZvciBlYWNoIGZyYW1lLgorCSAqLworCWlmICghYXRoOWtfcnhfYWNjZXB0KGNvbW1vbiwgaGRyLCByeF9zdGF0dXMsIHJ4X3N0YXRzLCBkZWNyeXB0X2Vycm9yKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdGg5a19wcm9jZXNzX3Jzc2koY29tbW9uLCBodywgaGRyLCByeF9zdGF0cyk7CisKKwlpZiAoYXRoOWtfcHJvY2Vzc19yYXRlKGNvbW1vbiwgaHcsIHJ4X3N0YXRzLCByeF9zdGF0dXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ4X3N0YXR1cy0+YmFuZCA9IGh3LT5jb25mLmNoYW5uZWwtPmJhbmQ7CisJcnhfc3RhdHVzLT5mcmVxID0gaHctPmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJcnhfc3RhdHVzLT5zaWduYWwgPSBBVEhfREVGQVVMVF9OT0lTRV9GTE9PUiArIHJ4X3N0YXRzLT5yc19yc3NpOworCXJ4X3N0YXR1cy0+YW50ZW5uYSA9IHJ4X3N0YXRzLT5yc19hbnRlbm5hOworCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1RTRlQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfcnhfc2tiX3Bvc3Rwcm9jZXNzKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4cywKKwkJCQkgICAgIGJvb2wgZGVjcnlwdF9lcnJvcikKK3sKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IGNvbW1vbi0+YWg7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlpbnQgaGRybGVuLCBwYWRwb3MsIHBhZHNpemU7CisJdTgga2V5aXg7CisJX19sZTE2IGZjOworCisJLyogc2VlIGlmIGFueSBwYWRkaW5nIGlzIGRvbmUgYnkgdGhlIGh3IGFuZCByZW1vdmUgaXQgKi8KKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKHNrYik7CisJZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisJcGFkcG9zID0gYXRoOWtfY21uX3BhZHBvcyhoZHItPmZyYW1lX2NvbnRyb2wpOworCisJLyogVGhlIE1BQyBoZWFkZXIgaXMgcGFkZGVkIHRvIGhhdmUgMzItYml0IGJvdW5kYXJ5IGlmIHRoZQorCSAqIHBhY2tldCBwYXlsb2FkIGlzIG5vbi16ZXJvLiBUaGUgZ2VuZXJhbCBjYWxjdWxhdGlvbiBmb3IKKwkgKiBwYWRzaXplIHdvdWxkIHRha2UgaW50byBhY2NvdW50IG9kZCBoZWFkZXIgbGVuZ3RoczoKKwkgKiBwYWRzaXplID0gKDQgLSBwYWRwb3MgJSA0KSAlIDQ7IEhvd2V2ZXIsIHNpbmNlIG9ubHkKKwkgKiBldmVuLWxlbmd0aCBoZWFkZXJzIGFyZSB1c2VkLCBwYWRkaW5nIGNhbiBvbmx5IGJlIDAgb3IgMgorCSAqIGJ5dGVzIGFuZCB3ZSBjYW4gb3B0aW1pemUgdGhpcyBhIGJpdC4gSW4gYWRkaXRpb24sIHdlIG11c3QKKwkgKiBub3QgdHJ5IHRvIHJlbW92ZSBwYWRkaW5nIGZyb20gc2hvcnQgY29udHJvbCBmcmFtZXMgdGhhdCBkbworCSAqIG5vdCBoYXZlIHBheWxvYWQuICovCisJcGFkc2l6ZSA9IHBhZHBvcyAmIDM7CisJaWYgKHBhZHNpemUgJiYgc2tiLT5sZW4+PXBhZHBvcytwYWRzaXplK0ZDU19MRU4pIHsKKwkJbWVtbW92ZShza2ItPmRhdGEgKyBwYWRzaXplLCBza2ItPmRhdGEsIHBhZHBvcyk7CisJCXNrYl9wdWxsKHNrYiwgcGFkc2l6ZSk7CisJfQorCisJa2V5aXggPSByeF9zdGF0cy0+cnNfa2V5aXg7CisKKwlpZiAoIShrZXlpeCA9PSBBVEg5S19SWEtFWUlYX0lOVkFMSUQpICYmICFkZWNyeXB0X2Vycm9yICYmCisJICAgIGllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGZjKSkgeworCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7CisJfSBlbHNlIGlmIChpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChmYykKKwkJICAgJiYgIWRlY3J5cHRfZXJyb3IgJiYgc2tiLT5sZW4gPj0gaGRybGVuICsgNCkgeworCQlrZXlpeCA9IHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2OworCisJCWlmICh0ZXN0X2JpdChrZXlpeCwgY29tbW9uLT5rZXltYXApKQorCQkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCX0KKwlpZiAoYWgtPnN3X21nbXRfY3J5cHRvICYmCisJICAgIChyeHMtPmZsYWcgJiBSWF9GTEFHX0RFQ1JZUFRFRCkgJiYKKwkgICAgaWVlZTgwMjExX2lzX21nbXQoZmMpKQorCQkvKiBVc2Ugc29mdHdhcmUgZGVjcnlwdCBmb3IgbWFuYWdlbWVudCBmcmFtZXMuICovCisJCXJ4cy0+ZmxhZyAmPSB+UlhfRkxBR19ERUNSWVBURUQ7Cit9CiAKIGludCBhdGhfcnhfdGFza2xldChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IGZsdXNoLCBib29sIGhwKQogewpAQCAtODQyLDE1ICsxMDkzLDIxIEBACiAJZW51bSBhdGg5a19yeF9xdHlwZSBxdHlwZTsKIAlib29sIGVkbWEgPSAhIShhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpOwogCWludCBkbWFfdHlwZTsKKwl1OCByeF9zdGF0dXNfbGVuID0gYWgtPmNhcHMucnhfc3RhdHVzX2xlbjsKKwl1NjQgdHNmID0gMDsKKwl1MzIgdHNmX2xvd2VyID0gMDsKIAogCWlmIChlZG1hKQotCQlkbWFfdHlwZSA9IERNQV9GUk9NX0RFVklDRTsKLQllbHNlCiAJCWRtYV90eXBlID0gRE1BX0JJRElSRUNUSU9OQUw7CisJZWxzZQorCQlkbWFfdHlwZSA9IERNQV9GUk9NX0RFVklDRTsKIAogCXF0eXBlID0gaHAgPyBBVEg5S19SWF9RVUVVRV9IUCA6IEFUSDlLX1JYX1FVRVVFX0xQOwogCXNwaW5fbG9ja19iaCgmc2MtPnJ4LnJ4YnVmbG9jayk7CiAKKwl0c2YgPSBhdGg5a19od19nZXR0c2Y2NChhaCk7CisJdHNmX2xvd2VyID0gdHNmICYgMHhmZmZmZmZmZjsKKwogCWRvIHsKIAkJLyogSWYgaGFuZGxpbmcgcnggaW50ZXJydXB0IGFuZCBmbHVzaCBpcyBpbiBwcm9ncmVzcyA9PiBleGl0ICovCiAJCWlmICgoc2MtPnNjX2ZsYWdzICYgU0NfT1BfUlhGTFVTSCkgJiYgKGZsdXNoID09IDApKQpAQCAtODY5LDcgKzExMjYsNyBAQAogCQlpZiAoIXNrYikKIAkJCWNvbnRpbnVlOwogCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSAoc2tiLT5kYXRhICsgcnhfc3RhdHVzX2xlbik7CiAJCXJ4cyA9ICBJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKTsKIAogCQlodyA9IGF0aF9nZXRfdmlydF9odyhzYywgaGRyKTsKQEAgLTg4Myw4ICsxMTQwLDE3IEBACiAJCWlmIChmbHVzaCkKIAkJCWdvdG8gcmVxdWV1ZTsKIAotCQlyZXR2YWwgPSBhdGg5a19jbW5fcnhfc2tiX3ByZXByb2Nlc3MoY29tbW9uLCBodywgc2tiLCAmcnMsCi0JCQkJCQkgICAgIHJ4cywgJmRlY3J5cHRfZXJyb3IpOworCQlyeHMtPm1hY3RpbWUgPSAodHNmICYgfjB4ZmZmZmZmZmZVTEwpIHwgcnMucnNfdHN0YW1wOworCQlpZiAocnMucnNfdHN0YW1wID4gdHNmX2xvd2VyICYmCisJCSAgICB1bmxpa2VseShycy5yc190c3RhbXAgLSB0c2ZfbG93ZXIgPiAweDEwMDAwMDAwKSkKKwkJCXJ4cy0+bWFjdGltZSAtPSAweDEwMDAwMDAwMFVMTDsKKworCQlpZiAocnMucnNfdHN0YW1wIDwgdHNmX2xvd2VyICYmCisJCSAgICB1bmxpa2VseSh0c2ZfbG93ZXIgLSBycy5yc190c3RhbXAgPiAweDEwMDAwMDAwKSkKKwkJCXJ4cy0+bWFjdGltZSArPSAweDEwMDAwMDAwMFVMTDsKKworCQlyZXR2YWwgPSBhdGg5a19yeF9za2JfcHJlcHJvY2Vzcyhjb21tb24sIGh3LCBoZHIsICZycywKKwkJCQkJCSByeHMsICZkZWNyeXB0X2Vycm9yKTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gcmVxdWV1ZTsKIApAQCAtOTA4LDggKzExNzQsOCBAQAogCQlpZiAoYWgtPmNhcHMucnhfc3RhdHVzX2xlbikKIAkJCXNrYl9wdWxsKHNrYiwgYWgtPmNhcHMucnhfc3RhdHVzX2xlbik7CiAKLQkJYXRoOWtfY21uX3J4X3NrYl9wb3N0cHJvY2Vzcyhjb21tb24sIHNrYiwgJnJzLAotCQkJCQkgICAgIHJ4cywgZGVjcnlwdF9lcnJvcik7CisJCWF0aDlrX3J4X3NrYl9wb3N0cHJvY2Vzcyhjb21tb24sIHNrYiwgJnJzLAorCQkJCQkgcnhzLCBkZWNyeXB0X2Vycm9yKTsKIAogCQkvKiBXZSB3aWxsIG5vdyBnaXZlIGhhcmR3YXJlIG91ciBzaGlueSBuZXcgYWxsb2NhdGVkIHNrYiAqLwogCQliZi0+YmZfbXBkdSA9IHJlcXVldWVfc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCmluZGV4IGQ0MzcxYTQuLjYzM2UzZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKQEAgLTIyMiw2ICsyMjIsNyBAQAogCiAjZGVmaW5lIEFSX0lTUl9TMiAgICAgICAgICAgICAgMHgwMDhjCiAjZGVmaW5lIEFSX0lTUl9TMl9RQ1VfVFhVUk4gICAgMHgwMDAwMDNGRgorI2RlZmluZSBBUl9JU1JfUzJfQkJfV0FUQ0hET0cgIDB4MDAwMTAwMDAKICNkZWZpbmUgQVJfSVNSX1MyX0NTVCAgICAgICAgICAweDAwNDAwMDAwCiAjZGVmaW5lIEFSX0lTUl9TMl9HVFQgICAgICAgICAgMHgwMDgwMDAwMAogI2RlZmluZSBBUl9JU1JfUzJfVElNICAgICAgICAgIDB4MDEwMDAwMDAKQEAgLTY5OSw3ICs3MDAsMTUgQEAKICNkZWZpbmUgQVJfUkNfSE9TVElGICAgICAgICAgMHgwMDAwMDEwMAogCiAjZGVmaW5lIEFSX1dBICAgICAgICAgICAgICAgIAkJMHg0MDA0CisjZGVmaW5lIEFSX1dBX0JJVDYJCQkoMSA8PCA2KQorI2RlZmluZSBBUl9XQV9CSVQ3CQkJKDEgPDwgNykKKyNkZWZpbmUgQVJfV0FfQklUMjMJCQkoMSA8PCAyMykKICNkZWZpbmUgQVJfV0FfRDNfTDFfRElTQUJMRQkJKDEgPDwgMTQpCisjZGVmaW5lIEFSX1dBX0QzX1RPX0wxX0RJU0FCTEVfUkVBTCAgICAgKDEgPDwgMTYpCisjZGVmaW5lIEFSX1dBX0FTUE1fVElNRVJfQkFTRURfRElTQUJMRSAgKDEgPDwgMTcpCisjZGVmaW5lIEFSX1dBX1JFU0VUX0VOICAgICAgICAgICAgICAgICAgKDEgPDwgMTgpIC8qIFN3IENvbnRyb2wgdG8gZW5hYmxlIFBDSS1SZXNldCB0byBQT1IgKGJpdCAxNSkgKi8KKyNkZWZpbmUgQVJfV0FfQU5BTE9HX1NISUZUICAgICAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQVJfV0FfUE9SX1NIT1JUICAgICAgICAgICAgICAgICAoMSA8PCAyMSkgLyogUENJLUUgUGh5IHJlc2V0IGNvbnRyb2wgKi8KICNkZWZpbmUgQVI5Mjg1X1dBX0RFRkFVTFQJCTB4MDA0YTA1MGIKICNkZWZpbmUgQVI5MjgwX1dBX0RFRkFVTFQgICAgICAgICAgIAkweDAwNDAwNzNiCiAjZGVmaW5lIEFSX1dBX0RFRkFVTFQgICAgICAgICAgICAgICAJMHgwMDAwMDczZgpAQCAtNzU2LDMyICs3NjUsMzMgQEAKICNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTjIgICAgICAgIAkgICAgICAweDAwMDAwRjAwCiAjZGVmaW5lIEFSX1NSRVZfUkVWSVNJT04yX1MgICAgIAkgICAgICA4CiAKLSNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzU0MTZfUENJICAgICAgICAgICAgICAgMHhECi0jZGVmaW5lIEFSX1NSRVZfVkVSU0lPTl81NDE2X1BDSUUgICAgICAgICAgICAgIDB4QwotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzU0MTZfMTAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fNTQxNl8yMCAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl81NDE2XzIyICAgICAgICAgICAgICAgMgotI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTEwMCAgICAgICAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzkxNjAgICAgICAgIAkgICAgICAweDQwCi0jZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTE2MF8xMCAgICAJICAgICAgMAotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkxNjBfMTEgICAgCSAgICAgIDEKLSNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzkyODAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODBfMTAgICAgICAgICAgICAwCi0jZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTI4MF8yMCAgICAgICAgICAgIDEKLSNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85MjgwXzIxICAgICAgICAgICAgMgotI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTI4NSAgICAgICAgICAgICAgICAgIDB4QzAKLSNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85Mjg1XzEwICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTI4NV8xMSAgICAgICAgICAgICAgMQotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODVfMTIgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzkyODcgICAgICAgICAgICAgICAgICAweDE4MAotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODdfMTAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85Mjg3XzExICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTI4N18xMiAgICAgICAgICAgICAgMgotI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTI3MQkJCTB4MTQwCi0jZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTI3MV8xMAkJMAotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyNzFfMTEJCTEKLSNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzkzMDAgICAgICAgICAgICAgICAgICAweDFjMAotI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkzMDBfMjAgICAgICAgICAgICAgIDIgLyogMi4wIGFuZCAyLjEgKi8KKyNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzU0MTZfUENJCTB4RAorI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fNTQxNl9QQ0lFCTB4QworI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzU0MTZfMTAJMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzU0MTZfMjAJMQorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzU0MTZfMjIJMgorI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTEwMAkJMHgxNAorI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTE2MAkJMHg0MAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkxNjBfMTAJMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkxNjBfMTEJMQorI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTI4MAkJMHg4MAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODBfMTAJMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODBfMjAJMQorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODBfMjEJMgorI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTI4NQkJMHhDMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODVfMTAJMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODVfMTEJMQorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkyODVfMTIJMgorI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTI4NwkJMHgxODAKKyNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85Mjg3XzEwCTAKKyNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85Mjg3XzExCTEKKyNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85Mjg3XzEyCTIKKyNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85Mjg3XzEzCTMKKyNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzkyNzEJCTB4MTQwCisjZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTI3MV8xMAkwCisjZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTI3MV8xMQkxCisjZGVmaW5lIEFSX1NSRVZfVkVSU0lPTl85MzAwCQkweDFjMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkzMDBfMjAJMiAvKiAyLjAgYW5kIDIuMSAqLwogCiAjZGVmaW5lIEFSX1NSRVZfNTQxNihfYWgpIFwKIAkoKChfYWgpLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPT0gQVJfU1JFVl9WRVJTSU9OXzU0MTZfUENJKSB8fCBcCkBAIC04NTksNiArODY5LDExIEBACiAJKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID4gQVJfU1JFVl9WRVJTSU9OXzkyODcpIHx8IFwKIAkgKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85Mjg3KSAmJiBcCiAJICAoKF9haCktPmh3X3ZlcnNpb24ubWFjUmV2ID49IEFSX1NSRVZfUkVWSVNJT05fOTI4N18xMikpKQorI2RlZmluZSBBUl9TUkVWXzkyODdfMTNfT1JfTEFURVIoX2FoKSBcCisJKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID4gQVJfU1JFVl9WRVJTSU9OXzkyODcpIHx8IFwKKwkgKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85Mjg3KSAmJiBcCisJICAoKF9haCktPmh3X3ZlcnNpb24ubWFjUmV2ID49IEFSX1NSRVZfUkVWSVNJT05fOTI4N18xMykpKQorCiAjZGVmaW5lIEFSX1NSRVZfOTI3MShfYWgpIFwKICAgICAoKChfYWgpKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85MjcxKQogI2RlZmluZSBBUl9TUkVWXzkyNzFfMTAoX2FoKSBcCkBAIC04NjcsNiArODgyLDcgQEAKICNkZWZpbmUgQVJfU1JFVl85MjcxXzExKF9haCkgXAogICAgIChBUl9TUkVWXzkyNzEoX2FoKSAmJiBcCiAgICAgICgoX2FoKS0+aHdfdmVyc2lvbi5tYWNSZXYgPT0gQVJfU1JFVl9SRVZJU0lPTl85MjcxXzExKSkKKwogI2RlZmluZSBBUl9TUkVWXzkzMDAoX2FoKSBcCiAJKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85MzAwKSkKICNkZWZpbmUgQVJfU1JFVl85MzAwXzIwKF9haCkgXApAQCAtODgxLDYgKzg5NywxMCBAQAogICAgIChBUl9TUkVWXzkyODVfMTJfT1JfTEFURVIoX2FoKSAmJiBcCiAgICAgICgoUkVHX1JFQUQoX2FoLCBBUl9BTl9TWU5USDkpICYgMHg3KSA9PSAweDEpKQogCisjZGVmaW5lIEFSX0RFVklEXzcwMTAoX2FoKSBcCisJKCgoX2FoKS0+aHdfdmVyc2lvbi5kZXZpZCA9PSAweDcwMTApIHx8IFwKKwkgKChfYWgpLT5od192ZXJzaW9uLmRldmlkID09IDB4OTAxOCkpCisKICNkZWZpbmUgQVJfUkFESU9fU1JFVl9NQUpPUiAgICAgICAgICAgICAgICAgICAweGYwCiAjZGVmaW5lIEFSX1JBRDUxMzNfU1JFVl9NQUpPUiAgICAgICAgICAgICAgICAgMHhjMAogI2RlZmluZSBBUl9SQUQyMTMzX1NSRVZfTUFKT1IgICAgICAgICAgICAgICAgIDB4ZDAKQEAgLTk3OCw2ICs5OTgsNyBAQAogI2RlZmluZSBBUjkyODdfTlVNX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAjZGVmaW5lIEFSOTI3MV9OVU1fR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgQVI5MzAwX05VTV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBBUjcwMTBfTlVNX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgIDE2CiAKICNkZWZpbmUgQVJfR1BJT19JTl9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwNDgKICNkZWZpbmUgQVJfR1BJT19JTl9WQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRkZDMDAwCkBAIC05OTIsNiArMTAxMyw4IEBACiAjZGVmaW5lIEFSOTI3MV9HUElPX0lOX1ZBTF9TICAgICAgICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgQVI5MzAwX0dQSU9fSU5fVkFMICAgICAgICAgICAgICAgICAgICAgICAweDAwMDFGRkZGCiAjZGVmaW5lIEFSOTMwMF9HUElPX0lOX1ZBTF9TICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUjcwMTBfR1BJT19JTl9WQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgQVI3MDEwX0dQSU9fSU5fVkFMX1MgICAgICAgICAgICAgICAgICAgICAwCiAKICNkZWZpbmUgQVJfR1BJT19PRV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSA/IDB4NDA1MCA6IDB4NDA0YykKICNkZWZpbmUgQVJfR1BJT19PRV9PVVRfRFJWICAgICAgICAgICAgICAgICAgICAgICAweDMKQEAgLTEwMDAsNiArMTAyMywyMSBAQAogI2RlZmluZSBBUl9HUElPX09FX09VVF9EUlZfSEkgICAgICAgICAgICAgICAgICAgIDB4MgogI2RlZmluZSBBUl9HUElPX09FX09VVF9EUlZfQUxMICAgICAgICAgICAgICAgICAgIDB4MwogCisjZGVmaW5lIEFSNzAxMF9HUElPX09FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MjAwMAorI2RlZmluZSBBUjcwMTBfR1BJT19PRV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBBUjcwMTBfR1BJT19PRV9BU19PVVRQVVQgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBBUjcwMTBfR1BJT19PRV9BU19JTlBVVCAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBBUjcwMTBfR1BJT19JTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTIwMDQKKyNkZWZpbmUgQVI3MDEwX0dQSU9fT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDUyMDA4CisjZGVmaW5lIEFSNzAxMF9HUElPX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MjAwQworI2RlZmluZSBBUjcwMTBfR1BJT19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTIwMTAKKyNkZWZpbmUgQVI3MDEwX0dQSU9fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDUyMDE0CisjZGVmaW5lIEFSNzAxMF9HUElPX0lOVF9UWVBFICAgICAgICAgICAgICAgICAgICAgMHg1MjAxOAorI2RlZmluZSBBUjcwMTBfR1BJT19JTlRfUE9MQVJJVFkgICAgICAgICAgICAgICAgIDB4NTIwMUMKKyNkZWZpbmUgQVI3MDEwX0dQSU9fUEVORElORyAgICAgICAgICAgICAgICAgICAgICAweDUyMDIwCisjZGVmaW5lIEFSNzAxMF9HUElPX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg1MjAyNAorI2RlZmluZSBBUjcwMTBfR1BJT19GVU5DVElPTiAgICAgICAgICAgICAgICAgICAgIDB4NTIwMjgKKwogI2RlZmluZSBBUl9HUElPX0lOVFJfUE9MICAgICAgICAgICAgICAgICAgICAgICAgIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpID8gMHg0MDU4IDogMHg0MDUwKQogI2RlZmluZSBBUl9HUElPX0lOVFJfUE9MX1ZBTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMUZGRkYKICNkZWZpbmUgQVJfR1BJT19JTlRSX1BPTF9WQUxfUyAgICAgICAgICAgICAgICAgICAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvdmlydHVhbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3ZpcnR1YWwuYwppbmRleCAxMDVhZDQwLi5mZDIwMjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvdmlydHVhbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay92aXJ0dWFsLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCWluZm8tPmNvbnRyb2wucmF0ZXNbMV0uaWR4ID0gLTE7CiAKIAltZW1zZXQoJnR4Y3RsLCAwLCBzaXplb2Yoc3RydWN0IGF0aF90eF9jb250cm9sKSk7Ci0JdHhjdGwudHhxID0gJnNjLT50eC50eHFbc2MtPnR4Lmh3cV9tYXBbQVRIOUtfV01FX0FDX1ZPXV07CisJdHhjdGwudHhxID0gJnNjLT50eC50eHFbc2MtPnR4Lmh3cV9tYXBbV01FX0FDX1ZPXV07CiAJdHhjdGwuZnJhbWVfdHlwZSA9IHBzID8gQVRIOUtfSUZUX1BBVVNFIDogQVRIOUtfSUZUX1VOUEFVU0U7CiAKIAlpZiAoYXRoX3R4X3N0YXJ0KGFwaHktPmh3LCBza2IsICZ0eGN0bCkgIT0gMCkKQEAgLTY5NSwxNiArNjk1LDE4IEBACiAJCSAgaWRsZSA/ICJpZGxlIiA6ICJub3QtaWRsZSIpOwogfQogLyogT25seSBib3RoZXIgc3RhcnRpbmcgYSBxdWV1ZSBvbiBhbiBhY3RpdmUgdmlydHVhbCB3aXBoeSAqLwotdm9pZCBhdGhfbWFjODAyMTFfc3RhcnRfcXVldWUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHUxNiBza2JfcXVldWUpCitib29sIGF0aF9tYWM4MDIxMV9zdGFydF9xdWV1ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTE2IHNrYl9xdWV1ZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHNjLT5wcmlfd2lwaHktPmh3OwogCXVuc2lnbmVkIGludCBpOworCWJvb2wgdHhxX3N0YXJ0ZWQgPSBmYWxzZTsKIAogCXNwaW5fbG9ja19iaCgmc2MtPndpcGh5X2xvY2spOwogCiAJLyogU3RhcnQgdGhlIHByaW1hcnkgd2lwaHkgKi8KIAlpZiAoc2MtPnByaV93aXBoeS0+c3RhdGUgPT0gQVRIX1dJUEhZX0FDVElWRSkgewogCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShodywgc2tiX3F1ZXVlKTsKKwkJdHhxX3N0YXJ0ZWQgPSB0cnVlOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTcxOCwxMSArNzIwLDEzIEBACiAKIAkJaHcgPSBhcGh5LT5odzsKIAkJaWVlZTgwMjExX3dha2VfcXVldWUoaHcsIHNrYl9xdWV1ZSk7CisJCXR4cV9zdGFydGVkID0gdHJ1ZTsKIAkJYnJlYWs7CiAJfQogCiB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfYmgoJnNjLT53aXBoeV9sb2NrKTsKKwlyZXR1cm4gdHhxX3N0YXJ0ZWQ7CiB9CiAKIC8qIEdvIGFoZWFkIGFuZCBwcm9wYWdhdGUgaW5mb3JtYXRpb24gdG8gYWxsIHZpcnR1YWwgd2lwaHlzLCBpdCB3b24ndCBodXJ0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmMKaW5kZXggZTIzMTcyYy4uNjI2MGZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay93bWkuYwpAQCAtMjc5LDkgKzI3OSw2IEBACiAJaWYgKHdtaS0+ZHJ2X3ByaXYtPm9wX2ZsYWdzICYgT1BfVU5QTFVHR0VEKQogCQlyZXR1cm4gMDsKIAotCWlmICghd21pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXNrYiA9IGFsbG9jX3NrYihoZWFkcm9vbSArIGNtZF9sZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IDg1OWFhNGEuLjUwMWI3MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtMzI4LDYgKzMyOCw3IEBACiAJdTMyIGJhW1dNRV9CQV9CTVBfU0laRSA+PiA1XTsKIAlpbnQgaXNhZ2dyLCB0eGZhaWwsIHR4cGVuZGluZywgc2VuZGJhciA9IDAsIG5lZWRyZXNldCA9IDAsIG5iYWQgPSAwOwogCWJvb2wgcmNfdXBkYXRlID0gdHJ1ZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgcmF0ZXNbNF07CiAKIAlza2IgPSBiZi0+YmZfbXBkdTsKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0zMzUsMTggKzMzNiw0NCBAQAogCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJaHcgPSBiZi0+YXBoeS0+aHc7CiAKKwltZW1jcHkocmF0ZXMsIHR4X2luZm8tPmNvbnRyb2wucmF0ZXMsIHNpemVvZihyYXRlcykpOworCiAJcmN1X3JlYWRfbG9jaygpOwogCiAJLyogWFhYOiB1c2UgaWVlZTgwMjExX2ZpbmRfc3RhISAqLwogCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YV9ieV9odyhodywgaGRyLT5hZGRyMSk7CiAJaWYgKCFzdGEpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJSU5JVF9MSVNUX0hFQUQoJmJmX2hlYWQpOworCQl3aGlsZSAoYmYpIHsKKwkJCWJmX25leHQgPSBiZi0+YmZfbmV4dDsKKworCQkJYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX1hSRVRSWTsKKwkJCWlmICgoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgfHwKKwkJCSAgICAhYmYtPmJmX3N0YWxlIHx8IGJmX25leHQgIT0gTlVMTCkKKwkJCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKKworCQkJYXRoX3R4X3JjX3N0YXR1cyhiZiwgdHMsIDAsIDAsIGZhbHNlKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCB0cywKKwkJCQkwLCAwKTsKKworCQkJYmYgPSBiZl9uZXh0OworCQl9CiAJCXJldHVybjsKIAl9CiAKIAlhbiA9IChzdHJ1Y3QgYXRoX25vZGUgKilzdGEtPmRydl9wcml2OwogCXRpZCA9IEFUSF9BTl8yX1RJRChhbiwgYmYtPmJmX3RpZG5vKTsKIAorCS8qCisJICogVGhlIGhhcmR3YXJlIG9jY2FzaW9uYWxseSBzZW5kcyBhIHR4IHN0YXR1cyBmb3IgdGhlIHdyb25nIFRJRC4KKwkgKiBJbiB0aGlzIGNhc2UsIHRoZSBCQSBzdGF0dXMgY2Fubm90IGJlIGNvbnNpZGVyZWQgdmFsaWQgYW5kIGFsbAorCSAqIHN1YmZyYW1lcyBuZWVkIHRvIGJlIHJldHJhbnNtaXR0ZWQKKwkgKi8KKwlpZiAoYmYtPmJmX3RpZG5vICE9IHRzLT50aWQpCisJCXR4b2sgPSBmYWxzZTsKKwogCWlzYWdnciA9IGJmX2lzYWdncihiZik7CiAJbWVtc2V0KGJhLCAwLCBXTUVfQkFfQk1QX1NJWkUgPj4gMyk7CiAKQEAgLTM3NSw2ICs0MDIsOSBAQAogCQl0eGZhaWwgPSB0eHBlbmRpbmcgPSAwOwogCQliZl9uZXh0ID0gYmYtPmJmX25leHQ7CiAKKwkJc2tiID0gYmYtPmJmX21wZHU7CisJCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKIAkJaWYgKEFUSF9CQV9JU1NFVChiYSwgQVRIX0JBX0lOREVYKHNlcV9zdCwgYmYtPmJmX3NlcW5vKSkpIHsKIAkJCS8qIHRyYW5zbWl0IGNvbXBsZXRpb24sIHN1YmZyYW1lIGlzCiAJCQkgKiBhY2tlZCBieSBibG9jayBhY2sgKi8KQEAgLTQyOCw2ICs0NTgsNyBAQAogCQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJCQlpZiAocmNfdXBkYXRlICYmIChhY2tlZF9jbnQgPT0gMSB8fCB0eGZhaWxfY250ID09IDEpKSB7CisJCQkJbWVtY3B5KHR4X2luZm8tPmNvbnRyb2wucmF0ZXMsIHJhdGVzLCBzaXplb2YocmF0ZXMpKTsKIAkJCQlhdGhfdHhfcmNfc3RhdHVzKGJmLCB0cywgbmJhZCwgdHhvaywgdHJ1ZSk7CiAJCQkJcmNfdXBkYXRlID0gZmFsc2U7CiAJCQl9IGVsc2UgewpAQCAtNDg3LDYgKzUxOCwxNCBAQAogCQliZiA9IGJmX25leHQ7CiAJfQogCisJLyogcHJlcGVuZCB1bi1hY2tlZCBmcmFtZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGVuZGluZyBmcmFtZSBxdWV1ZSAqLworCWlmICghbGlzdF9lbXB0eSgmYmZfcGVuZGluZykpIHsKKwkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJbGlzdF9zcGxpY2UoJmJmX3BlbmRpbmcsICZ0aWQtPmJ1Zl9xKTsKKwkJYXRoX3R4X3F1ZXVlX3RpZCh0eHEsIHRpZCk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwl9CisKIAlpZiAodGlkLT5zdGF0ZSAmIEFHR1JfQ0xFQU5VUCkgewogCQlpZiAodGlkLT5iYXdfaGVhZCA9PSB0aWQtPmJhd190YWlsKSB7CiAJCQl0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOwpAQCAtNDk5LDE0ICs1MzgsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogcHJlcGVuZCB1bi1hY2tlZCBmcmFtZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGVuZGluZyBmcmFtZSBxdWV1ZSAqLwotCWlmICghbGlzdF9lbXB0eSgmYmZfcGVuZGluZykpIHsKLQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQkJbGlzdF9zcGxpY2UoJmJmX3BlbmRpbmcsICZ0aWQtPmJ1Zl9xKTsKLQkJYXRoX3R4X3F1ZXVlX3RpZCh0eHEsIHRpZCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQl9Ci0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChuZWVkcmVzZXQpCkBAIC05NDEsNiArOTcyLDcgQEAKIAlpZiAoIUFUSF9UWFFfU0VUVVAoc2MsIHFudW0pKSB7CiAJCXN0cnVjdCBhdGhfdHhxICp0eHEgPSAmc2MtPnR4LnR4cVtxbnVtXTsKIAorCQl0eHEtPmF4cV9jbGFzcyA9IHN1YnR5cGU7CiAJCXR4cS0+YXhxX3FudW0gPSBxbnVtOwogCQl0eHEtPmF4cV9saW5rID0gTlVMTDsKIAkJSU5JVF9MSVNUX0hFQUQoJnR4cS0+YXhxX3EpOwpAQCAtOTU4LDU4ICs5OTAsNiBAQAogCXJldHVybiAmc2MtPnR4LnR4cVtxbnVtXTsKIH0KIAotaW50IGF0aF90eF9nZXRfcW51bShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IHF0eXBlLCBpbnQgaGFsdHlwZSkKLXsKLQlpbnQgcW51bTsKLQotCXN3aXRjaCAocXR5cGUpIHsKLQljYXNlIEFUSDlLX1RYX1FVRVVFX0RBVEE6Ci0JCWlmIChoYWx0eXBlID49IEFSUkFZX1NJWkUoc2MtPnR4Lmh3cV9tYXApKSB7Ci0JCQlhdGhfcHJpbnQoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksIEFUSF9EQkdfRkFUQUwsCi0JCQkJICAiSEFMIEFDICV1IG91dCBvZiByYW5nZSwgbWF4ICV6dSFcbiIsCi0JCQkJICBoYWx0eXBlLCBBUlJBWV9TSVpFKHNjLT50eC5od3FfbWFwKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcW51bSA9IHNjLT50eC5od3FfbWFwW2hhbHR5cGVdOwotCQlicmVhazsKLQljYXNlIEFUSDlLX1RYX1FVRVVFX0JFQUNPTjoKLQkJcW51bSA9IHNjLT5iZWFjb24uYmVhY29ucTsKLQkJYnJlYWs7Ci0JY2FzZSBBVEg5S19UWF9RVUVVRV9DQUI6Ci0JCXFudW0gPSBzYy0+YmVhY29uLmNhYnEtPmF4cV9xbnVtOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlxbnVtID0gLTE7Ci0JfQotCXJldHVybiBxbnVtOwotfQotCi1zdHJ1Y3QgYXRoX3R4cSAqYXRoX3Rlc3RfZ2V0X3R4cShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgYXRoX3R4cSAqdHhxID0gTlVMTDsKLQl1MTYgc2tiX3F1ZXVlID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7Ci0JaW50IHFudW07Ci0KLQlxbnVtID0gYXRoX2dldF9oYWxfcW51bShza2JfcXVldWUsIHNjKTsKLQl0eHEgPSAmc2MtPnR4LnR4cVtxbnVtXTsKLQotCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0KLQlpZiAodHhxLT5heHFfZGVwdGggPj0gKEFUSF9UWEJVRiAtIDIwKSkgewotCQlhdGhfcHJpbnQoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksIEFUSF9EQkdfWE1JVCwKLQkJCSAgIlRYIHF1ZXVlOiAlZCBpcyBmdWxsLCBkZXB0aDogJWRcbiIsCi0JCQkgIHFudW0sIHR4cS0+YXhxX2RlcHRoKTsKLQkJYXRoX21hYzgwMjExX3N0b3BfcXVldWUoc2MsIHNrYl9xdWV1ZSk7Ci0JCXR4cS0+c3RvcHBlZCA9IDE7Ci0JCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCi0JcmV0dXJuIHR4cTsKLX0KLQogaW50IGF0aF90eHFfdXBkYXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBpbnQgcW51bSwKIAkJICAgc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gKnFpbmZvKQogewpAQCAtMTY4OCwxMiArMTY2OCwxNSBAQAogCQliZi0+YmZfZnJtbGVuIC09IHBhZHNpemU7CiAJfQogCi0JaWYgKGNvbmZfaXNfaHQoJmh3LT5jb25mKSkgeworCWlmICghdHhjdGwtPnBhcHJkICYmIGNvbmZfaXNfaHQoJmh3LT5jb25mKSkgewogCQliZi0+YmZfc3RhdGUuYmZfdHlwZSB8PSBCVUZfSFQ7CiAJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTERQQykKIAkJCXVzZV9sZHBjID0gdHJ1ZTsKIAl9CiAKKwliZi0+YmZfc3RhdGUuYmZzX3BhcHJkID0gdHhjdGwtPnBhcHJkOworCWlmICh0eGN0bC0+cGFwcmQpCisJCWJmLT5iZl9zdGF0ZS5iZnNfcGFwcmRfdGltZXN0YW1wID0gamlmZmllczsKIAliZi0+YmZfZmxhZ3MgPSBzZXR1cF90eF9mbGFncyhza2IsIHVzZV9sZHBjKTsKIAogCWJmLT5iZl9rZXl0eXBlID0gZ2V0X2h3X2NyeXB0b19rZXl0eXBlKHNrYik7CkBAIC0xNzY4LDYgKzE3NTEsOSBAQAogCQkJICAgIGJmLT5iZl9idWZfYWRkciwKIAkJCSAgICB0eGN0bC0+dHhxLT5heHFfcW51bSk7CiAKKwlpZiAoYmYtPmJmX3N0YXRlLmJmc19wYXByZCkKKwkJYXI5MDAzX2h3X3NldF9wYXByZF90eGRlc2MoYWgsIGRzLCBiZi0+YmZfc3RhdGUuYmZzX3BhcHJkKTsKKwogCXNwaW5fbG9ja19iaCgmdHhjdGwtPnR4cS0+YXhxX2xvY2spOwogCiAJaWYgKGJmX2lzaHQoYmYpICYmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpICYmCkBAIC0xODA5LDggKzE3OTUsOSBAQAogCXN0cnVjdCBhdGhfd2lwaHkgKmFwaHkgPSBody0+cHJpdjsKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGFwaHktPnNjOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwlzdHJ1Y3QgYXRoX3R4cSAqdHhxID0gdHhjdGwtPnR4cTsKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmY7Ci0JaW50IHI7CisJaW50IHEsIHI7CiAKIAliZiA9IGF0aF90eF9nZXRfYnVmZmVyKHNjKTsKIAlpZiAoIWJmKSB7CkBAIC0xODIwLDggKzE4MDcsNiBAQAogCiAJciA9IGF0aF90eF9zZXR1cF9idWZmZXIoaHcsIGJmLCBza2IsIHR4Y3RsKTsKIAlpZiAodW5saWtlbHkocikpIHsKLQkJc3RydWN0IGF0aF90eHEgKnR4cSA9IHR4Y3RsLT50eHE7Ci0KIAkJYXRoX3ByaW50KGNvbW1vbiwgQVRIX0RCR19GQVRBTCwgIlRYIG1lbSBhbGxvYyBmYWlsdXJlXG4iKTsKIAogCQkvKiB1cG9uIGF0aF90eF9wcm9jZXNzcSgpIHRoaXMgVFggcXVldWUgd2lsbCBiZSByZXN1bWVkLCB3ZQpAQCAtMTgyOSw3ICsxODE0LDcgQEAKIAkJICogd2Ugd2lsbCBhdCBsZWFzdCBoYXZlIHRvIHJ1biBUWCBjb21wbGV0aW9ub24gb25lIGJ1ZmZlcgogCQkgKiBvbiB0aGUgcXVldWUgKi8KIAkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQkJaWYgKHNjLT50eC50eHFbdHhxLT5heHFfcW51bV0uYXhxX2RlcHRoID4gMSkgeworCQlpZiAoIXR4cS0+c3RvcHBlZCAmJiB0eHEtPmF4cV9kZXB0aCA+IDEpIHsKIAkJCWF0aF9tYWM4MDIxMV9zdG9wX3F1ZXVlKHNjLCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CiAJCQl0eHEtPnN0b3BwZWQgPSAxOwogCQl9CkBAIC0xODQwLDYgKzE4MjUsMTcgQEAKIAkJcmV0dXJuIHI7CiAJfQogCisJcSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCWlmIChxID49IDQpCisJCXEgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlpZiAoKytzYy0+dHgucGVuZGluZ19mcmFtZXNbcV0gPiBBVEhfTUFYX1FERVBUSCAmJiAhdHhxLT5zdG9wcGVkKSB7CisJCWF0aF9tYWM4MDIxMV9zdG9wX3F1ZXVlKHNjLCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisJCXR4cS0+c3RvcHBlZCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwogCWF0aF90eF9zdGFydF9kbWEoc2MsIGJmLCB0eGN0bCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE5MDksNyArMTkwNSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlpbnQgcGFkcG9zLCBwYWRzaXplOworCWludCBxLCBwYWRwb3MsIHBhZHNpemU7CiAKIAlhdGhfcHJpbnQoY29tbW9uLCBBVEhfREJHX1hNSVQsICJUWCBjb21wbGV0ZTogc2tiOiAlcFxuIiwgc2tiKTsKIApAQCAtMTk0OCw4ICsxOTQ0LDE2IEBACiAKIAlpZiAodW5saWtlbHkodHhfaW5mby0+cGFkWzBdICYgQVRIX1RYX0lORk9fRlJBTUVfVFlQRV9JTlRFUk5BTCkpCiAJCWF0aDlrX3R4X3N0YXR1cyhodywgc2tiKTsKLQllbHNlCisJZWxzZSB7CisJCXEgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwkJaWYgKHEgPj0gNCkKKwkJCXEgPSAwOworCisJCWlmICgtLXNjLT50eC5wZW5kaW5nX2ZyYW1lc1txXSA8IDApCisJCQlzYy0+dHgucGVuZGluZ19mcmFtZXNbcV0gPSAwOworCiAJCWllZWU4MDIxMV90eF9zdGF0dXMoaHcsIHNrYik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCkBAIC0xOTcxLDggKzE5NzUsMTggQEAKIAl9CiAKIAlkbWFfdW5tYXBfc2luZ2xlKHNjLT5kZXYsIGJmLT5iZl9kbWFjb250ZXh0LCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIGJmLT5hcGh5LCB0eF9mbGFncyk7Ci0JYXRoX2RlYnVnX3N0YXRfdHgoc2MsIHR4cSwgYmYsIHRzKTsKKworCWlmIChiZi0+YmZfc3RhdGUuYmZzX3BhcHJkKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkgICAgICAgYmYtPmJmX3N0YXRlLmJmc19wYXByZF90aW1lc3RhbXAgKworCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoQVRIX1BBUFJEX1RJTUVPVVQpKSkKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWVsc2UKKwkJCWNvbXBsZXRlKCZzYy0+cGFwcmRfY29tcGxldGUpOworCX0gZWxzZSB7CisJCWF0aF90eF9jb21wbGV0ZShzYywgc2tiLCBiZi0+YXBoeSwgdHhfZmxhZ3MpOworCQlhdGhfZGVidWdfc3RhdF90eChzYywgdHhxLCBiZiwgdHMpOworCX0KIAogCS8qCiAJICogUmV0dXJuIHRoZSBsaXN0IG9mIGF0aF9idWYgb2YgdGhpcyBtcGR1IHRvIGZyZWUgcXVldWUKQEAgLTIwNTAsMjEgKzIwNjQsMjEgQEAKIAkJdHhfaW5mby0+c3RhdHVzLnJhdGVzW2ldLmlkeCA9IC0xOwogCX0KIAotCXR4X2luZm8tPnN0YXR1cy5yYXRlc1t0eF9yYXRlaW5kZXhdLmNvdW50ID0gYmYtPmJmX3JldHJpZXMgKyAxOworCXR4X2luZm8tPnN0YXR1cy5yYXRlc1t0eF9yYXRlaW5kZXhdLmNvdW50ID0gdHMtPnRzX2xvbmdyZXRyeSArIDE7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF93YWtlX21hYzgwMjExX3F1ZXVlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKQogewogCWludCBxbnVtOwogCisJcW51bSA9IGF0aF9nZXRfbWFjODAyMTFfcW51bSh0eHEtPmF4cV9jbGFzcywgc2MpOworCWlmIChxbnVtID09IC0xKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCWlmICh0eHEtPnN0b3BwZWQgJiYKLQkgICAgc2MtPnR4LnR4cVt0eHEtPmF4cV9xbnVtXS5heHFfZGVwdGggPD0gKEFUSF9UWEJVRiAtIDIwKSkgewotCQlxbnVtID0gYXRoX2dldF9tYWM4MDIxMV9xbnVtKHR4cS0+YXhxX3FudW0sIHNjKTsKLQkJaWYgKHFudW0gIT0gLTEpIHsKLQkJCWF0aF9tYWM4MDIxMV9zdGFydF9xdWV1ZShzYywgcW51bSk7CisJaWYgKHR4cS0+c3RvcHBlZCAmJiBzYy0+dHgucGVuZGluZ19mcmFtZXNbcW51bV0gPCBBVEhfTUFYX1FERVBUSCkgeworCQlpZiAoYXRoX21hYzgwMjExX3N0YXJ0X3F1ZXVlKHNjLCBxbnVtKSkKIAkJCXR4cS0+c3RvcHBlZCA9IDA7Ci0JCX0KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogfQpAQCAtMjE2MSw3ICsyMTc1LDYgQEAKIAkJCSAqIFRoaXMgZnJhbWUgaXMgc2VudCBvdXQgYXMgYSBzaW5nbGUgZnJhbWUuCiAJCQkgKiBVc2UgaGFyZHdhcmUgcmV0cnkgc3RhdHVzIGZvciB0aGlzIGZyYW1lLgogCQkJICovCi0JCQliZi0+YmZfcmV0cmllcyA9IHRzLnRzX2xvbmdyZXRyeTsKIAkJCWlmICh0cy50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9YUkVUUlkpCiAJCQkJYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX1hSRVRSWTsKIAkJCWF0aF90eF9yY19zdGF0dXMoYmYsICZ0cywgMCwgdHhvaywgdHJ1ZSk7CkBAIC0yMjc5LDggKzIyOTIsMTggQEAKIAogCQl0eG9rID0gISh0eHMudHNfc3RhdHVzICYgQVRIOUtfVFhFUlJfTUFTSyk7CiAKKwkJLyoKKwkJICogTWFrZSBzdXJlIG51bGwgZnVuYyBmcmFtZSBpcyBhY2tlZCBiZWZvcmUgY29uZmlndXJpbmcKKwkJICogaHcgaW50byBwcyBtb2RlLgorCQkgKi8KKwkJaWYgKGJmLT5iZl9pc251bGxmdW5jICYmIHR4b2spIHsKKwkJCWlmICgoc2MtPnBzX2ZsYWdzICYgUFNfRU5BQkxFRCkpCisJCQkJYXRoOWtfZW5hYmxlX3BzKHNjKTsKKwkJCWVsc2UKKwkJCQlzYy0+cHNfZmxhZ3MgfD0gUFNfTlVMTEZVTkNfQ09NUExFVEVEOworCQl9CisKIAkJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewotCQkJYmYtPmJmX3JldHJpZXMgPSB0eHMudHNfbG9uZ3JldHJ5OwogCQkJaWYgKHR4cy50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9YUkVUUlkpCiAJCQkJYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX1hSRVRSWTsKIAkJCWF0aF90eF9yY19zdGF0dXMoYmYsICZ0eHMsIDAsIHR4b2ssIHRydWUpOwpAQCAtMjQyNCw2MiArMjQ0Nyw0NCBAQAogCWZvciAoYWNubyA9IDAsIGFjID0gJmFuLT5hY1thY25vXTsKIAkgICAgIGFjbm8gPCBXTUVfTlVNX0FDOyBhY25vKyssIGFjKyspIHsKIAkJYWMtPnNjaGVkICAgID0gZmFsc2U7CisJCWFjLT5xbnVtID0gc2MtPnR4Lmh3cV9tYXBbYWNub107CiAJCUlOSVRfTElTVF9IRUFEKCZhYy0+dGlkX3EpOwotCi0JCXN3aXRjaCAoYWNubykgewotCQljYXNlIFdNRV9BQ19CRToKLQkJCWFjLT5xbnVtID0gYXRoX3R4X2dldF9xbnVtKHNjLAotCQkJCSAgIEFUSDlLX1RYX1FVRVVFX0RBVEEsIEFUSDlLX1dNRV9BQ19CRSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTUVfQUNfQks6Ci0JCQlhYy0+cW51bSA9IGF0aF90eF9nZXRfcW51bShzYywKLQkJCQkgICBBVEg5S19UWF9RVUVVRV9EQVRBLCBBVEg5S19XTUVfQUNfQkspOwotCQkJYnJlYWs7Ci0JCWNhc2UgV01FX0FDX1ZJOgotCQkJYWMtPnFudW0gPSBhdGhfdHhfZ2V0X3FudW0oc2MsCi0JCQkJICAgQVRIOUtfVFhfUVVFVUVfREFUQSwgQVRIOUtfV01FX0FDX1ZJKTsKLQkJCWJyZWFrOwotCQljYXNlIFdNRV9BQ19WTzoKLQkJCWFjLT5xbnVtID0gYXRoX3R4X2dldF9xbnVtKHNjLAotCQkJCSAgIEFUSDlLX1RYX1FVRVVFX0RBVEEsIEFUSDlLX1dNRV9BQ19WTyk7Ci0JCQlicmVhazsKLQkJfQogCX0KIH0KIAogdm9pZCBhdGhfdHhfbm9kZV9jbGVhbnVwKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX25vZGUgKmFuKQogewotCWludCBpOwotCXN0cnVjdCBhdGhfYXR4X2FjICphYywgKmFjX3RtcDsKLQlzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwgKnRpZF90bXA7CisJc3RydWN0IGF0aF9hdHhfYWMgKmFjOworCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkOwogCXN0cnVjdCBhdGhfdHhxICp0eHE7CisJaW50IGksIHRpZG5vOwogCi0JZm9yIChpID0gMDsgaSA8IEFUSDlLX05VTV9UWF9RVUVVRVM7IGkrKykgewotCQlpZiAoQVRIX1RYUV9TRVRVUChzYywgaSkpIHsKLQkJCXR4cSA9ICZzYy0+dHgudHhxW2ldOworCWZvciAodGlkbm8gPSAwLCB0aWQgPSAmYW4tPnRpZFt0aWRub107CisJICAgICB0aWRubyA8IFdNRV9OVU1fVElEOyB0aWRubysrLCB0aWQrKykgeworCQlpID0gdGlkLT5hYy0+cW51bTsKIAotCQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJaWYgKCFBVEhfVFhRX1NFVFVQKHNjLCBpKSkKKwkJCWNvbnRpbnVlOwogCi0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWMsCi0JCQkJCWFjX3RtcCwgJnR4cS0+YXhxX2FjcSwgbGlzdCkgewotCQkJCXRpZCA9IGxpc3RfZmlyc3RfZW50cnkoJmFjLT50aWRfcSwKLQkJCQkJCXN0cnVjdCBhdGhfYXR4X3RpZCwgbGlzdCk7Ci0JCQkJaWYgKHRpZCAmJiB0aWQtPmFuICE9IGFuKQotCQkJCQljb250aW51ZTsKLQkJCQlsaXN0X2RlbCgmYWMtPmxpc3QpOwotCQkJCWFjLT5zY2hlZCA9IGZhbHNlOworCQl0eHEgPSAmc2MtPnR4LnR4cVtpXTsKKwkJYWMgPSB0aWQtPmFjOwogCi0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRpZCwKLQkJCQkJCXRpZF90bXAsICZhYy0+dGlkX3EsIGxpc3QpIHsKLQkJCQkJbGlzdF9kZWwoJnRpZC0+bGlzdCk7Ci0JCQkJCXRpZC0+c2NoZWQgPSBmYWxzZTsKLQkJCQkJYXRoX3RpZF9kcmFpbihzYywgdHhxLCB0aWQpOwotCQkJCQl0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOwotCQkJCQl0aWQtPnN0YXRlICY9IH5BR0dSX0NMRUFOVVA7Ci0JCQkJfQotCQkJfQorCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCi0JCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCWlmICh0aWQtPnNjaGVkKSB7CisJCQlsaXN0X2RlbCgmdGlkLT5saXN0KTsKKwkJCXRpZC0+c2NoZWQgPSBmYWxzZTsKIAkJfQorCisJCWlmIChhYy0+c2NoZWQpIHsKKwkJCWxpc3RfZGVsKCZhYy0+bGlzdCk7CisJCQl0aWQtPmFjLT5zY2hlZCA9IGZhbHNlOworCQl9CisKKwkJYXRoX3RpZF9kcmFpbihzYywgdHhxLCB0aWQpOworCQl0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOworCQl0aWQtPnN0YXRlICY9IH5BR0dSX0NMRUFOVVA7CisKKwkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCmluZGV4IGMyNzQ2ZmMuLjNiNjMyMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMTkxLDI1ICsxOTAsMjMgQEAKIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKIAogCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgJj0gfklPX0RBVEFfUEFUSF9XSURUSDsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PQorCQkJCQlwY21jaWFfaW9fY2ZnX2RhdGFfd2lkdGgoaW8tPmZsYWdzKTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKIAkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOwotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZmxhZ3MgPSBwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gaW8tPndpblsxXS5sZW47CiAJCX0KIAl9CiAKIAkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIGludCBhdG1lbF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCkBAIC0yNTQsNyArMjUxLDcgQEAKIAogCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9CiAJCWluaXRfYXRtZWxfY2FyZChsaW5rLT5pcnEsCi0JCQkJbGluay0+aW8uQmFzZVBvcnQxLAorCQkJCWxpbmstPnJlc291cmNlWzBdLT5zdGFydCwKIAkJCQlkaWQgPyBkaWQtPmRyaXZlcl9pbmZvIDogQVRNRUxfRldfVFlQRV9OT05FLAogCQkJCSZsaW5rLT5kZXYsCiAJCQkJY2FyZF9wcmVzZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCmluZGV4IDNhMDAzZTYuLjg2NzRhOTkzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaApAQCAtNTMwLDcgKzUzMCw3IEBACiAJLyogU2l6ZSBvZiB0aGUgZGF0YS4gRm9yIHVjb2RlIGFuZCBQQ00gdGhpcyBpcyBpbiBieXRlcy4KIAkgKiBGb3IgSVYgdGhpcyBpcyBudW1iZXItb2YtaXZzLiAqLwogCV9fYmUzMiBzaXplOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAvKiBJbml0aWFsIFZhbHVlIGZpbGUgZm9ybWF0ICovCiAjZGVmaW5lIEI0M19JVl9PRkZTRVRfTUFTSwkweDdGRkYKQEAgLTU0MCw4ICs1NDAsOCBAQAogCXVuaW9uIHsKIAkJX19iZTE2IGQxNjsKIAkJX19iZTMyIGQzMjsKLQl9IGRhdGEgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisJfSBkYXRhIF9fcGFja2VkOworfSBfX3BhY2tlZDsKIAogCiAvKiBEYXRhIHN0cnVjdHVyZXMgZm9yIERNQSB0cmFuc21pc3Npb24sIHBlciA4MDIxMSBjb3JlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jCmluZGV4IGZhNDBmZGYuLjEwZDBhYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmMKQEAgLTMzMywxMSArMzMzLDExIEBACiAJZG1hX2FkZHJfdCBkbWFhZGRyOwogCiAJaWYgKHR4KSB7Ci0JCWRtYWFkZHIgPSBzc2JfZG1hX21hcF9zaW5nbGUocmluZy0+ZGV2LT5kZXYsCi0JCQkJCSAgICAgYnVmLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQlkbWFhZGRyID0gZG1hX21hcF9zaW5nbGUocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCisJCQkJCSBidWYsIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAJfSBlbHNlIHsKLQkJZG1hYWRkciA9IHNzYl9kbWFfbWFwX3NpbmdsZShyaW5nLT5kZXYtPmRldiwKLQkJCQkJICAgICBidWYsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJZG1hYWRkciA9IGRtYV9tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAorCQkJCQkgYnVmLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CiAJfQogCiAJcmV0dXJuIGRtYWFkZHI7CkBAIC0zNDgsMTEgKzM0OCwxMSBAQAogCQkJICBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBsZW4sIGludCB0eCkKIHsKIAlpZiAodHgpIHsKLQkJc3NiX2RtYV91bm1hcF9zaW5nbGUocmluZy0+ZGV2LT5kZXYsCi0JCQkJICAgICBhZGRyLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQlkbWFfdW5tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAorCQkJCSBhZGRyLCBsZW4sIERNQV9UT19ERVZJQ0UpOwogCX0gZWxzZSB7Ci0JCXNzYl9kbWFfdW5tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LAotCQkJCSAgICAgYWRkciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkbWFfdW5tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAorCQkJCSBhZGRyLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CiAJfQogfQogCkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJCQkgZG1hX2FkZHJfdCBhZGRyLCBzaXplX3QgbGVuKQogewogCUI0M19XQVJOX09OKHJpbmctPnR4KTsKLQlzc2JfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocmluZy0+ZGV2LT5kZXYsCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCiAJCQkJICAgIGFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIH0KIApAQCAtMzcwLDggKzM3MCw4IEBACiAJCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IGxlbikKIHsKIAlCNDNfV0FSTl9PTihyaW5nLT50eCk7Ci0Jc3NiX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJpbmctPmRldi0+ZGV2LAotCQkJCSAgICAgICBhZGRyLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCisJCQkJICAgYWRkciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwogfQogCiBzdGF0aWMgaW5saW5lCkBAIC00MDEsOSArNDAxLDkgQEAKIAkgKi8KIAlpZiAocmluZy0+dHlwZSA9PSBCNDNfRE1BXzY0QklUKQogCQlmbGFncyB8PSBHRlBfRE1BOwotCXJpbmctPmRlc2NiYXNlID0gc3NiX2RtYV9hbGxvY19jb25zaXN0ZW50KHJpbmctPmRldi0+ZGV2LAotCQkJCQkJICBCNDNfRE1BX1JJTkdNRU1TSVpFLAotCQkJCQkJICAmKHJpbmctPmRtYWJhc2UpLCBmbGFncyk7CisJcmluZy0+ZGVzY2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCisJCQkJCSAgICBCNDNfRE1BX1JJTkdNRU1TSVpFLAorCQkJCQkgICAgJihyaW5nLT5kbWFiYXNlKSwgZmxhZ3MpOwogCWlmICghcmluZy0+ZGVzY2Jhc2UpIHsKIAkJYjQzZXJyKHJpbmctPmRldi0+d2wsICJETUEgcmluZ21lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDIwLDggKzQyMCw4IEBACiAJaWYgKHJpbmctPnR5cGUgPT0gQjQzX0RNQV82NEJJVCkKIAkJZmxhZ3MgfD0gR0ZQX0RNQTsKIAotCXNzYl9kbWFfZnJlZV9jb25zaXN0ZW50KHJpbmctPmRldi0+ZGV2LCBCNDNfRE1BX1JJTkdNRU1TSVpFLAotCQkJCXJpbmctPmRlc2NiYXNlLCByaW5nLT5kbWFiYXNlLCBmbGFncyk7CisJZG1hX2ZyZWVfY29oZXJlbnQocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsIEI0M19ETUFfUklOR01FTVNJWkUsCisJCQkgIHJpbmctPmRlc2NiYXNlLCByaW5nLT5kbWFiYXNlKTsKIH0KIAogLyogUmVzZXQgdGhlIFJYIERNQSBjaGFubmVsICovCkBAIC01MjgsNyArNTI4LDcgQEAKIAkJCQkgIGRtYV9hZGRyX3QgYWRkciwKIAkJCQkgIHNpemVfdCBidWZmZXJzaXplLCBib29sIGRtYV90b19kZXZpY2UpCiB7Ci0JaWYgKHVubGlrZWx5KHNzYl9kbWFfbWFwcGluZ19lcnJvcihyaW5nLT5kZXYtPmRldiwgYWRkcikpKQorCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwgYWRkcikpKQogCQlyZXR1cm4gMTsKIAogCXN3aXRjaCAocmluZy0+dHlwZSkgewpAQCAtODc0LDEwICs4NzQsMTAgQEAKIAkJCWdvdG8gZXJyX2tmcmVlX21ldGE7CiAKIAkJLyogdGVzdCBmb3IgYWJpbGl0eSB0byBkbWEgdG8gdHhoZHJfY2FjaGUgKi8KLQkJZG1hX3Rlc3QgPSBzc2JfZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYsCi0JCQkJCSAgICAgIHJpbmctPnR4aGRyX2NhY2hlLAotCQkJCQkgICAgICBiNDNfdHhoZHJfc2l6ZShkZXYpLAotCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwkJZG1hX3Rlc3QgPSBkbWFfbWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwKKwkJCQkJICByaW5nLT50eGhkcl9jYWNoZSwKKwkJCQkJICBiNDNfdHhoZHJfc2l6ZShkZXYpLAorCQkJCQkgIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmIChiNDNfZG1hX21hcHBpbmdfZXJyb3IocmluZywgZG1hX3Rlc3QsCiAJCQkJCSAgYjQzX3R4aGRyX3NpemUoZGV2KSwgMSkpIHsKQEAgLTg4OSwxMCArODg5LDEwIEBACiAJCQlpZiAoIXJpbmctPnR4aGRyX2NhY2hlKQogCQkJCWdvdG8gZXJyX2tmcmVlX21ldGE7CiAKLQkJCWRtYV90ZXN0ID0gc3NiX2RtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LAotCQkJCQkJICAgICAgcmluZy0+dHhoZHJfY2FjaGUsCi0JCQkJCQkgICAgICBiNDNfdHhoZHJfc2l6ZShkZXYpLAotCQkJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7CisJCQlkbWFfdGVzdCA9IGRtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LT5kbWFfZGV2LAorCQkJCQkJICByaW5nLT50eGhkcl9jYWNoZSwKKwkJCQkJCSAgYjQzX3R4aGRyX3NpemUoZGV2KSwKKwkJCQkJCSAgRE1BX1RPX0RFVklDRSk7CiAKIAkJCWlmIChiNDNfZG1hX21hcHBpbmdfZXJyb3IocmluZywgZG1hX3Rlc3QsCiAJCQkJCQkgIGI0M190eGhkcl9zaXplKGRldiksIDEpKSB7CkBAIC05MDMsOSArOTAzLDkgQEAKIAkJCX0KIAkJfQogCi0JCXNzYl9kbWFfdW5tYXBfc2luZ2xlKGRldi0+ZGV2LAotCQkJCSAgICAgZG1hX3Rlc3QsIGI0M190eGhkcl9zaXplKGRldiksCi0JCQkJICAgICBETUFfVE9fREVWSUNFKTsKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwKKwkJCQkgZG1hX3Rlc3QsIGI0M190eGhkcl9zaXplKGRldiksCisJCQkJIERNQV9UT19ERVZJQ0UpOwogCX0KIAogCWVyciA9IGFsbG9jX3JpbmdtZW1vcnkocmluZyk7CkBAIC0xMDE4LDkgKzEwMTgsMTIgQEAKIAkvKiBUcnkgdG8gc2V0IHRoZSBETUEgbWFzay4gSWYgaXQgZmFpbHMsIHRyeSBmYWxsaW5nIGJhY2sgdG8gYQogCSAqIGxvd2VyIG1hc2ssIGFzIHdlIGNhbiBhbHdheXMgYWxzbyBzdXBwb3J0IGEgbG93ZXIgb25lLiAqLwogCXdoaWxlICgxKSB7Ci0JCWVyciA9IHNzYl9kbWFfc2V0X21hc2soZGV2LT5kZXYsIG1hc2spOwotCQlpZiAoIWVycikKLQkJCWJyZWFrOworCQllcnIgPSBkbWFfc2V0X21hc2soZGV2LT5kZXYtPmRtYV9kZXYsIG1hc2spOworCQlpZiAoIWVycikgeworCQkJZXJyID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKGRldi0+ZGV2LT5kbWFfZGV2LCBtYXNrKTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CiAJCWlmIChtYXNrID09IERNQV9CSVRfTUFTSyg2NCkpIHsKIAkJCW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCQkJZmFsbGJhY2sgPSAxOwpAQCAtMTIyMSwxNCArMTIyNCwxNCBAQAogCW1ldGEtPmRtYWFkZHIgPSBtYXBfZGVzY2J1ZmZlcihyaW5nLCBza2ItPmRhdGEsIHNrYi0+bGVuLCAxKTsKIAkvKiBjcmVhdGUgYSBib3VuY2UgYnVmZmVyIGluIHpvbmVfZG1hIG9uIG1hcHBpbmcgZmFpbHVyZS4gKi8KIAlpZiAoYjQzX2RtYV9tYXBwaW5nX2Vycm9yKHJpbmcsIG1ldGEtPmRtYWFkZHIsIHNrYi0+bGVuLCAxKSkgewotCQlwcml2X2luZm8tPmJvdW5jZWJ1ZmZlciA9IGttYWxsb2Moc2tiLT5sZW4sIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwkJcHJpdl9pbmZvLT5ib3VuY2VidWZmZXIgPSBrbWVtZHVwKHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJCQkgIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKIAkJaWYgKCFwcml2X2luZm8tPmJvdW5jZWJ1ZmZlcikgewogCQkJcmluZy0+Y3VycmVudF9zbG90ID0gb2xkX3RvcF9zbG90OwogCQkJcmluZy0+dXNlZF9zbG90cyA9IG9sZF91c2VkX3Nsb3RzOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0X3VubWFwX2hkcjsKIAkJfQotCQltZW1jcHkocHJpdl9pbmZvLT5ib3VuY2VidWZmZXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCiAJCW1ldGEtPmRtYWFkZHIgPSBtYXBfZGVzY2J1ZmZlcihyaW5nLCBwcml2X2luZm8tPmJvdW5jZWJ1ZmZlciwgc2tiLT5sZW4sIDEpOwogCQlpZiAoYjQzX2RtYV9tYXBwaW5nX2Vycm9yKHJpbmcsIG1ldGEtPmRtYWFkZHIsIHNrYi0+bGVuLCAxKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5oCmluZGV4IGRjOTE5NDQuLmEwMWMyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmgKQEAgLTY3LDcgKzY3LDcgQEAKIHN0cnVjdCBiNDNfZG1hZGVzYzMyIHsKIAlfX2xlMzIgY29udHJvbDsKIAlfX2xlMzIgYWRkcmVzczsKLX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAjZGVmaW5lIEI0M19ETUEzMl9EQ1RMX0JZVEVDTlQJCTB4MDAwMDFGRkYKICNkZWZpbmUgQjQzX0RNQTMyX0RDVExfQUREUkVYVF9NQVNLCQkweDAwMDMwMDAwCiAjZGVmaW5lIEI0M19ETUEzMl9EQ1RMX0FERFJFWFRfU0hJRlQJMTYKQEAgLTE0MCw3ICsxNDAsNyBAQAogCV9fbGUzMiBjb250cm9sMTsKIAlfX2xlMzIgYWRkcmVzc19sb3c7CiAJX19sZTMyIGFkZHJlc3NfaGlnaDsKLX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAjZGVmaW5lIEI0M19ETUE2NF9EQ1RMMF9EVEFCTEVFTkQJCTB4MTAwMDAwMDAKICNkZWZpbmUgQjQzX0RNQTY0X0RDVEwwX0lSUQkJCTB4MjAwMDAwMDAKICNkZWZpbmUgQjQzX0RNQTY0X0RDVEwwX0ZSQU1FRU5ECQkweDQwMDAwMDAwCkBAIC0xNTMsOCArMTUzLDggQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBiNDNfZG1hZGVzYzMyIGRtYTMyOwogCQlzdHJ1Y3QgYjQzX2RtYWRlc2M2NCBkbWE2NDsKLQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Ci19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisJfSBfX3BhY2tlZDsKK30gX19wYWNrZWQ7CiAKIC8qIE1pc2MgRE1BIGNvbnN0YW50cyAqLwogI2RlZmluZSBCNDNfRE1BX1JJTkdNRU1TSVpFCQlQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCmluZGV4IDc5NjViNzAuLjIwNjMxYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwpAQCAtMTA4LDcgKzEwOCw3IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQodmVyYm9zZSwgYjQzX21vZHBhcmFtX3ZlcmJvc2UsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJMb2cgbWVzc2FnZSB2ZXJib3NpdHk6IDA9ZXJyb3IsIDE9d2FybiwgMj1pbmZvKGRlZmF1bHQpLCAzPWRlYnVnIik7CiAKLWludCBiNDNfbW9kcGFyYW1fcGlvID0gQjQzX1BJT19ERUZBVUxUOworc3RhdGljIGludCBiNDNfbW9kcGFyYW1fcGlvID0gQjQzX1BJT19ERUZBVUxUOwogbW9kdWxlX3BhcmFtX25hbWVkKHBpbywgYjQzX21vZHBhcmFtX3BpbywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocGlvLCAiVXNlIFBJTyBhY2Nlc3NlcyBieSBkZWZhdWx0OiAwPURNQSwgMT1QSU8iKTsKIApAQCAtMTgwNCw3ICsxODA0LDcgQEAKIAkJCSAgICAgICBkbWFfcmVhc29uWzJdLCBkbWFfcmVhc29uWzNdLAogCQkJICAgICAgIGRtYV9yZWFzb25bNF0sIGRtYV9yZWFzb25bNV0pOwogCQkJYjQzZXJyKGRldi0+d2wsICJUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IERNQSAiCi0JCQkgICAgICAgIm9uIHlvdXIgc3lzdGVtLiBQbGVhc2UgdXNlIFBJTyBpbnN0ZWFkLlxuIik7CisJCQkgICAgICAgIm9uIHlvdXIgc3lzdGVtLiBJdCB3aWxsIG5vdyBiZSBzd2l0Y2hlZCB0byBQSU8uXG4iKTsKIAkJCS8qIEZhbGwgYmFjayB0byBQSU8gdHJhbnNmZXJzIGlmIHdlIGdldCBmYXRhbCBETUEgZXJyb3JzISAqLwogCQkJZGV2LT51c2VfcGlvID0gMTsKIAkJCWI0M19jb250cm9sbGVyX3Jlc3RhcnQoZGV2LCAiRE1BIGVycm9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMKaW5kZXggMGU5OWI2My4uZGZiYzQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9wY21jaWEuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTY1LDcgKzY0LDYgQEAKIHsKIAlzdHJ1Y3Qgc3NiX2J1cyAqc3NiOwogCXdpbl9yZXFfdCB3aW47Ci0JbWVtcmVxX3QgbWVtOwogCWludCBlcnIgPSAtRU5PTUVNOwogCWludCByZXMgPSAwOwogCkBAIC03OCwxMiArNzYsNyBAQAogCWRldi0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCWRldi0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAKLQlkZXYtPmlvLkJhc2VQb3J0MiA9IDA7Ci0JZGV2LT5pby5OdW1Qb3J0czIgPSAwOwotCWRldi0+aW8uQXR0cmlidXRlczIgPSAwOwotCi0Jd2luLkF0dHJpYnV0ZXMgPSBXSU5fQUREUl9TUEFDRV9NRU0gfCBXSU5fTUVNT1JZX1RZUEVfQ00gfAotCQkJIFdJTl9FTkFCTEUgfCBXSU5fREFUQV9XSURUSF8xNiB8CisJd2luLkF0dHJpYnV0ZXMgPSAgV0lOX0VOQUJMRSB8IFdJTl9EQVRBX1dJRFRIXzE2IHwKIAkJCSBXSU5fVVNFX1dBSVQ7CiAJd2luLkJhc2UgPSAwOwogCXdpbi5TaXplID0gU1NCX0NPUkVfU0laRTsKQEAgLTkyLDkgKzg1LDcgQEAKIAlpZiAocmVzICE9IDApCiAJCWdvdG8gZXJyX2tmcmVlX3NzYjsKIAotCW1lbS5DYXJkT2Zmc2V0ID0gMDsKLQltZW0uUGFnZSA9IDA7Ci0JcmVzID0gcGNtY2lhX21hcF9tZW1fcGFnZShkZXYsIGRldi0+d2luLCAmbWVtKTsKKwlyZXMgPSBwY21jaWFfbWFwX21lbV9wYWdlKGRldiwgZGV2LT53aW4sIDApOwogCWlmIChyZXMgIT0gMCkKIAkJZ290byBlcnJfZGlzYWJsZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYwppbmRleCAyOWJmMzRjLi4wZGMzM2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYwpAQCAtOTcyLDcgKzk3Miw3IEBACiAJCWI0M19waHlfbWFza3NldChkZXYsIDB4MDRBMiwgMHhGRkYwLCAweDAwMEIpOwogCiAJCWlmIChwaHktPnJldiA+PSAzKSB7Ci0JCQliNDNfcGh5X21hc2soZGV2LCAweDA0OEEsICh1MTYpfjB4ODAwMCk7CisJCQliNDNfcGh5X21hc2soZGV2LCAweDA0OEEsIDB4N0ZGRik7CiAJCQliNDNfcGh5X21hc2tzZXQoZGV2LCAweDA0MTUsIDB4ODAwMCwgMHgzNkQ4KTsKIAkJCWI0M19waHlfbWFza3NldChkZXYsIDB4MDQxNiwgMHg4MDAwLCAweDM2RDgpOwogCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgMHgwNDE3LCAweEZFMDAsIDB4MDE2RCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmMKaW5kZXggYzZhZmU5ZC4uZmQ1MGViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9scC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYwpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIAkJQjQzX1dBUk5fT04oMSk7CiAJfQogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UWF9QV1JfQ1RMX0NNRCwKLQkJCSh1MTYpfkI0M19MUFBIWV9UWF9QV1JfQ1RMX0NNRF9NT0RFLCBjdGwpOworCQkJfkI0M19MUFBIWV9UWF9QV1JfQ1RMX0NNRF9NT0RFICYgMHhGRkZGLCBjdGwpOwogfQogCiBzdGF0aWMgdm9pZCBscHBoeV9zZXRfdHhfcG93ZXJfY29udHJvbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCkBAIC0xNTIyLDExICsxNTIyLDExIEBACiAJYjQzX3BoeV9tYXNrKGRldiwgQjQzX0xQUEhZX1RYX1BXUl9DVExfREVMVEFQV1JfTElNSVQsIDB4RkYpOwogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTFBQSFlfVFhfUFdSX0NUTF9ERUxUQVBXUl9MSU1JVCwgMHhBKTsKIAliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFhfUFdSX0NUTF9DTUQsCi0JCQkodTE2KX5CNDNfTFBQSFlfVFhfUFdSX0NUTF9DTURfTU9ERSwKKwkJCX5CNDNfTFBQSFlfVFhfUFdSX0NUTF9DTURfTU9ERSAmIDB4RkZGRiwKIAkJCUI0M19MUFBIWV9UWF9QV1JfQ1RMX0NNRF9NT0RFX09GRik7CiAJYjQzX3BoeV9tYXNrKGRldiwgQjQzX0xQUEhZX1RYX1BXUl9DVExfTk5VTSwgMHhGOEZGKTsKIAliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFhfUFdSX0NUTF9DTUQsCi0JCQkodTE2KX5CNDNfTFBQSFlfVFhfUFdSX0NUTF9DTURfTU9ERSwKKwkJCX5CNDNfTFBQSFlfVFhfUFdSX0NUTF9DTURfTU9ERSAmIDB4RkZGRiwKIAkJCUI0M19MUFBIWV9UWF9QV1JfQ1RMX0NNRF9NT0RFX1NXKTsKIAogCWlmIChkZXYtPnBoeS5yZXYgPCAyKSB7CkBAIC0yNjk4LDcgKzI2OTgsNyBAQAogCXJldHVybiBCNDNfVFhQV1JfUkVTX0RPTkU7CiB9CiAKLXZvaWQgYjQzX2xwcGh5X29wX3N3aXRjaF9hbmFsb2coc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIG9uKQorc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX3N3aXRjaF9hbmFsb2coc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIG9uKQogewogICAgICAgIGlmIChvbikgewogICAgICAgICAgICAgICAgYjQzX3BoeV9tYXNrKGRldiwgQjQzX0xQUEhZX0FGRV9DVExfT1ZSLCAweGZmZjgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwppbmRleCAzZDZiMzM3Li41YTcyNTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwpAQCAtNTA5LDcgKzUwOSw4IEBACiAJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUEFQRF9FTjAsIH4weDAwMDEpOwogCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1BBUERfRU4xLCB+MHgwMDAxKTsKIAotCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGU0VRQ0EsICh1MTYpfkI0M19OUEhZX1JGU0VRQ0FfUlhESVMsCisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfUkZTRVFDQSwKKwkJCX5CNDNfTlBIWV9SRlNFUUNBX1JYRElTICYgMHhGRkZGLAogCQkJKCgxIC0gY29yZSkgPDwgQjQzX05QSFlfUkZTRVFDQV9SWERJU19TSElGVCkpOwogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGU0VRQ0EsIH5CNDNfTlBIWV9SRlNFUUNBX1RYRU4sCiAJCQkoKDEgLSBjb3JlKSA8PCBCNDNfTlBIWV9SRlNFUUNBX1RYRU5fU0hJRlQpKTsKQEAgLTc2Miw3ICs3NjMsNyBAQAogCWlmICh0bXAgJiAweDEpCiAJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfU0FNUF9DTUQsIEI0M19OUEhZX1NBTVBfQ01EX1NUT1ApOwogCWVsc2UgaWYgKHRtcCAmIDB4MikKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfSVFMT0NBTF9DTURHQ1RMLCAodTE2KX4weDgwMDApOworCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9JUUxPQ0FMX0NNREdDVEwsIDB4N0ZGRik7CiAKIAliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9TQU1QX0NNRCwgfjB4MDAwNCk7CiAKQEAgLTEwMDksNyArMTAxMCw3IEBACiAJCQliNDNfbnBoeV9zZXRfcmZfc2VxdWVuY2UoZGV2LCA1LAogCQkJCQlyZnNlcV9ldmVudHMsIHJmc2VxX2RlbGF5cywgMyk7CiAJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9PVkVSX0RHQUlOMSwKLQkJCQkodTE2KX5CNDNfTlBIWV9PVkVSX0RHQUlOX0NDS0RHRUNWLAorCQkJCX5CNDNfTlBIWV9PVkVSX0RHQUlOX0NDS0RHRUNWICYgMHhGRkZGLAogCQkJCTB4NUEgPDwgQjQzX05QSFlfT1ZFUl9ER0FJTl9DQ0tER0VDVl9TSElGVCk7CiAKIAkJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopCkBAIC0xMTE2LDcgKzExMTcsNyBAQAogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMiwgMHgyMCk7CiAKIAkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUElMX0RXMSwKLQkJCQkodTE2KX5CNDNfTlBIWV9QSUxfRFdfNjRRQU0pOworCQkJCX5CNDNfTlBIWV9QSUxfRFdfNjRRQU0gJiAweEZGRkYpOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzIwQ09fUzJCMSwgMHhCNSk7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWEZfMjBDT19TMkIyLCAweEE0KTsKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RYRl8yMENPX1MyQjMsIDB4MDApOwpAQCAtMjQ1NSw3ICsyNDU2LDggQEAKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSLCB0bXAgfCAweDA2MDApOwogCiAJCXJlZ3NbNF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9CQkNGRyk7Ci0JCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0JCQ0ZHLCAodTE2KX5CNDNfTlBIWV9CQkNGR19SU1RSWCk7CisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0JCQ0ZHLAorCQkJICAgICB+QjQzX05QSFlfQkJDRkdfUlNUUlggJiAweEZGRkYpOwogCiAJCXRtcCA9IGI0M19udGFiX3JlYWQoZGV2LCBCNDNfTlRBQjE2KDgsIDMpKTsKIAkJcmVnc1s1XSA9IHRtcDsKQEAgLTI5MzAsNyArMjkzMiw3IEBACiAJCXRtcFs1XSA9IGI0M19waHlfcmVhZChkZXYsIHJmY3RsWzFdKTsKIAogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRlNFUUNBLAotCQkJCSh1MTYpfkI0M19OUEhZX1JGU0VRQ0FfUlhESVMsCisJCQkJfkI0M19OUEhZX1JGU0VRQ0FfUlhESVMgJiAweEZGRkYsCiAJCQkJKCgxIC0gaSkgPDwgQjQzX05QSFlfUkZTRVFDQV9SWERJU19TSElGVCkpOwogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRlNFUUNBLCB+QjQzX05QSFlfUkZTRVFDQV9UWEVOLAogCQkJCSgxIC0gaSkpOwpAQCAtMzI5MSw3ICszMjkzLDcgQEAKIAkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQkFORENUTCwgfkI0M19OUEhZX0JBTkRDVExfNUdIWik7CiAJCXRtcDMyID0gYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX1BTTV9QSFlfSERSKTsKIAkJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19QU01fUEhZX0hEUiwgdG1wMzIgfCA0KTsKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX1BIWV9CX0JCQ0ZHLCAodTE2KX4weEMwMDApOworCQliNDNfcGh5X21hc2soZGV2LCBCNDNfUEhZX0JfQkJDRkcsIDB4M0ZGRik7CiAJCWI0M193cml0ZTMyKGRldiwgQjQzX01NSU9fUFNNX1BIWV9IRFIsIHRtcDMyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc2Rpby5jCmluZGV4IDRlNTZiN2IuLjQ1OTMzY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3NkaW8uYwpAQCAtMTgyLDYgKzE4Miw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgYjQzX3NkaW9faWRzW10gPSB7CiAJeyBTRElPX0RFVklDRSgweDAyZDAsIDB4MDQ0YikgfSwgLyogTmludGVuZG8gV2lpIFdMQU4gZGF1Z2h0ZXIgY2FyZCAqLworCXsgU0RJT19ERVZJQ0UoMHgwMDkyLCAweDAwMDQpIH0sIC8qIEMtZ3V5cywgSW5jLiBFVy1DRzExMDJHQyAqLwogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My93YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKaW5kZXggOTdjNzkxNi4uOWEzMzVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfQUdDMSwgMywgMjUpOwogCX0KIAotCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfQ0NLU0hJRlRCSVRTX1dBLCAodTE2KX4weEZGMDAsIDB4NTcwMCk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9DQ0tTSElGVEJJVFNfV0EsIDB4MDBGRiwgMHg1NzAwKTsKIAliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX09GRE0oMHgxQSksIH4weDAwN0YsIDB4MDAwRik7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4MUEpLCB+MHgzRjgwLCAweDJCODApOwogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfQU5UV1JTRVRULCAweEYwRkYsIDB4MDMwMCk7CkBAIC00MDAsOSArNDAwLDkgQEAKIAliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX09GRE0oMHg4OSksIH4weDAwRkYsIDB4MDAyMCk7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4ODkpLCB+MHgzRjAwLCAweDAyMDApOwogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfT0ZETSgweDgyKSwgfjB4MDBGRiwgMHgwMDJFKTsKLQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX09GRE0oMHg5NiksICh1MTYpfjB4RkYwMCwgMHgxQTAwKTsKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX09GRE0oMHg5NiksIDB4MDBGRiwgMHgxQTAwKTsKIAliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX09GRE0oMHg4MSksIH4weDAwRkYsIDB4MDAyOCk7Ci0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4ODEpLCAodTE2KX4weEZGMDAsIDB4MkMwMCk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4ODEpLCAweDAwRkYsIDB4MkMwMCk7CiAJaWYgKHBoeS0+cmV2ID09IDEpIHsKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEVBS19DT1VOVCwgMHgwOTJCKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4MUIpLCB+MHgwMDFFLCAweDAwMDIpOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfTFBGR0FJTkNUTCwgfjB4MDAwRiwgMHgwMDA0KTsKIAkJaWYgKHBoeS0+cmV2ID49IDYpIHsKIAkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHgyMiksIDB4Mjg3QSk7Ci0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX0xQRkdBSU5DVEwsICh1MTYpfjB4RjAwMCwgMHgzMDAwKTsKKwkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfTFBGR0FJTkNUTCwgMHgwRkZGLCAweDMwMDApOwogCQl9CiAJfQogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfRElWU1JDSElEWCwgMHg4MDgwLCAweDc4NzQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmgKaW5kZXggZDIzZmY5Zi4uZDRjZjliMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMveG1pdC5oCkBAIC0xMCw4ICsxMCw4IEBACiAJCXVuaW9uIHsJCQkJXAogCQkJX19sZTMyIGRhdGE7CQlcCiAJCQlfX3U4IHJhd1tzaXplXTsJCVwKLQkJfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CVwKLQl9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorCQl9IF9fcGFja2VkOwlcCisJfSBfX3BhY2tlZAogCiAvKiBzdHJ1Y3QgYjQzX3BsY3BfaGRyNCAqLwogX2I0M19kZWNsYXJlX3BsY3BfaGRyKDQpOwpAQCAtNTcsNyArNTcsNyBAQAogCQkJX191OCBydHNfZnJhbWVbMTZdOwkJLyogVGhlIFJUUyBmcmFtZSAoaWYgdXNlZCkgKi8KIAkJCVBBRF9CWVRFUygyKTsKIAkJCXN0cnVjdCBiNDNfcGxjcF9oZHI2IHBsY3A7CS8qIE1haW4gUExDUCBoZWFkZXIgKi8KLQkJfSBuZXdfZm9ybWF0IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisJCX0gbmV3X2Zvcm1hdCBfX3BhY2tlZDsKIAogCQkvKiBUaGUgb2xkIHIzNTEgZm9ybWF0LiAqLwogCQlzdHJ1Y3QgewpAQCAtNjgsMTAgKzY4LDEwIEBACiAJCQlfX3U4IHJ0c19mcmFtZVsxNl07CQkvKiBUaGUgUlRTIGZyYW1lIChpZiB1c2VkKSAqLwogCQkJUEFEX0JZVEVTKDIpOwogCQkJc3RydWN0IGI0M19wbGNwX2hkcjYgcGxjcDsJLyogTWFpbiBQTENQIGhlYWRlciAqLwotCQl9IG9sZF9mb3JtYXQgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwkJfSBvbGRfZm9ybWF0IF9fcGFja2VkOwogCi0JfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCX0gX19wYWNrZWQ7Cit9IF9fcGFja2VkOwogCiAvKiBNQUMgVFggY29udHJvbCAqLwogI2RlZmluZSBCNDNfVFhIX01BQ19VU0VGQlIJCTB4MTAwMDAwMDAgLyogVXNlIGZhbGxiYWNrIHJhdGUgZm9yIHRoaXMgQU1QRFUgKi8KQEAgLTIxOCwyMCArMjE4LDIwIEBACiAJCXN0cnVjdCB7CiAJCQlfX3U4IGpzc2k7CS8qIFBIWSBSWCBTdGF0dXMgMTogSlNTSSAqLwogCQkJX191OCBzaWdfcXVhbDsJLyogUEhZIFJYIFN0YXR1cyAxOiBTaWduYWwgUXVhbGl0eSAqLwotCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisJCX0gX19wYWNrZWQ7CiAKIAkJLyogUlNTSSBmb3IgTi1QSFlzICovCiAJCXN0cnVjdCB7CiAJCQlfX3M4IHBvd2VyMDsJLyogUEhZIFJYIFN0YXR1cyAxOiBQb3dlciAwICovCiAJCQlfX3M4IHBvd2VyMTsJLyogUEhZIFJYIFN0YXR1cyAxOiBQb3dlciAxICovCi0JCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKLQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisJCX0gX19wYWNrZWQ7CisJfSBfX3BhY2tlZDsKIAlfX2xlMTYgcGh5X3N0YXR1czI7CS8qIFBIWSBSWCBTdGF0dXMgMiAqLwogCV9fbGUxNiBwaHlfc3RhdHVzMzsJLyogUEhZIFJYIFN0YXR1cyAzICovCiAJX19sZTMyIG1hY19zdGF0dXM7CS8qIE1BQyBSWCBzdGF0dXMgKi8KIAlfX2xlMTYgbWFjX3RpbWU7CiAJX19sZTE2IGNoYW5uZWw7Ci19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAvKiBQSFkgUlggU3RhdHVzIDAgKi8KICNkZWZpbmUgQjQzX1JYX1BIWVNUMF9HQUlOQ1RMCQkweDQwMDAgLyogR2FpbiBDb250cm9sICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmgKaW5kZXggODlmZTJmOS4uYzgxYjJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9iNDNsZWdhY3kuaApAQCAtMzcyLDcgKzM3Miw3IEBACiAJLyogU2l6ZSBvZiB0aGUgZGF0YS4gRm9yIHVjb2RlIGFuZCBQQ00gdGhpcyBpcyBpbiBieXRlcy4KIAkgKiBGb3IgSVYgdGhpcyBpcyBudW1iZXItb2YtaXZzLiAqLwogCV9fYmUzMiBzaXplOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAvKiBJbml0aWFsIFZhbHVlIGZpbGUgZm9ybWF0ICovCiAjZGVmaW5lIEI0M2xlZ2FjeV9JVl9PRkZTRVRfTUFTSwkweDdGRkYKQEAgLTM4Miw4ICszODIsOCBAQAogCXVuaW9uIHsKIAkJX19iZTE2IGQxNjsKIAkJX19iZTMyIGQzMjsKLQl9IGRhdGEgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisJfSBkYXRhIF9fcGFja2VkOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBCNDNsZWdhY3lfUEhZTU9ERShwaHl0eXBlKQkoMSA8PCAocGh5dHlwZSkpCiAjZGVmaW5lIEI0M2xlZ2FjeV9QSFlNT0RFX0IJCUI0M2xlZ2FjeV9QSFlNT0RFCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuYwppbmRleCBlOTE1MjBkLi5lMDNlMDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5jCkBAIC0zOTQsMTEgKzM5NCwxMSBAQAogCWRtYV9hZGRyX3QgZG1hYWRkcjsKIAogCWlmICh0eCkKLQkJZG1hYWRkciA9IHNzYl9kbWFfbWFwX3NpbmdsZShyaW5nLT5kZXYtPmRldiwKKwkJZG1hYWRkciA9IGRtYV9tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAogCQkJCQkgICAgIGJ1ZiwgbGVuLAogCQkJCQkgICAgIERNQV9UT19ERVZJQ0UpOwogCWVsc2UKLQkJZG1hYWRkciA9IHNzYl9kbWFfbWFwX3NpbmdsZShyaW5nLT5kZXYtPmRldiwKKwkJZG1hYWRkciA9IGRtYV9tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAogCQkJCQkgICAgIGJ1ZiwgbGVuLAogCQkJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CiAKQEAgLTQxMiwxMSArNDEyLDExIEBACiAJCSAgICAgIGludCB0eCkKIHsKIAlpZiAodHgpCi0JCXNzYl9kbWFfdW5tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LAorCQlkbWFfdW5tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAogCQkJCSAgICAgYWRkciwgbGVuLAogCQkJCSAgICAgRE1BX1RPX0RFVklDRSk7CiAJZWxzZQotCQlzc2JfZG1hX3VubWFwX3NpbmdsZShyaW5nLT5kZXYtPmRldiwKKwkJZG1hX3VubWFwX3NpbmdsZShyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwKIAkJCQkgICAgIGFkZHIsIGxlbiwKIAkJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CiB9CkBAIC00MjgsOCArNDI4LDggQEAKIHsKIAlCNDNsZWdhY3lfV0FSTl9PTihyaW5nLT50eCk7CiAKLQlzc2JfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocmluZy0+ZGV2LT5kZXYsCi0JCQkJICAgIGFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwKKwkJCQlhZGRyLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTQzOSw4ICs0MzksOCBAQAogewogCUI0M2xlZ2FjeV9XQVJOX09OKHJpbmctPnR4KTsKIAotCXNzYl9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShyaW5nLT5kZXYtPmRldiwKLQkJCQkgICAgICAgYWRkciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAorCQkJCSAgIGFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIH0KIAogc3RhdGljIGlubGluZQpAQCAtNDYwLDEwICs0NjAsMTAgQEAKIHN0YXRpYyBpbnQgYWxsb2NfcmluZ21lbW9yeShzdHJ1Y3QgYjQzbGVnYWN5X2RtYXJpbmcgKnJpbmcpCiB7CiAJLyogR0ZQIGZsYWdzIG11c3QgbWF0Y2ggdGhlIGZsYWdzIGluIGZyZWVfcmluZ21lbW9yeSgpISAqLwotCXJpbmctPmRlc2NiYXNlID0gc3NiX2RtYV9hbGxvY19jb25zaXN0ZW50KHJpbmctPmRldi0+ZGV2LAotCQkJCQkJICBCNDNsZWdhY3lfRE1BX1JJTkdNRU1TSVpFLAotCQkJCQkJICAmKHJpbmctPmRtYWJhc2UpLAotCQkJCQkJICBHRlBfS0VSTkVMKTsKKwlyaW5nLT5kZXNjYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwKKwkJCQkJICAgIEI0M2xlZ2FjeV9ETUFfUklOR01FTVNJWkUsCisJCQkJCSAgICAmKHJpbmctPmRtYWJhc2UpLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyaW5nLT5kZXNjYmFzZSkgewogCQliNDNsZWdhY3llcnIocmluZy0+ZGV2LT53bCwgIkRNQSByaW5nbWVtb3J5IGFsbG9jYXRpb24iCiAJCQkgICAgICIgZmFpbGVkXG4iKTsKQEAgLTQ3Niw4ICs0NzYsOCBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX3JpbmdtZW1vcnkoc3RydWN0IGI0M2xlZ2FjeV9kbWFyaW5nICpyaW5nKQogewotCXNzYl9kbWFfZnJlZV9jb25zaXN0ZW50KHJpbmctPmRldi0+ZGV2LCBCNDNsZWdhY3lfRE1BX1JJTkdNRU1TSVpFLAotCQkJCXJpbmctPmRlc2NiYXNlLCByaW5nLT5kbWFiYXNlLCBHRlBfS0VSTkVMKTsKKwlkbWFfZnJlZV9jb2hlcmVudChyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwgQjQzbGVnYWN5X0RNQV9SSU5HTUVNU0laRSwKKwkJCSAgcmluZy0+ZGVzY2Jhc2UsIHJpbmctPmRtYWJhc2UpOwogfQogCiAvKiBSZXNldCB0aGUgUlggRE1BIGNoYW5uZWwgKi8KQEAgLTU4OSw3ICs1ODksNyBAQAogCQkJCQkgc2l6ZV90IGJ1ZmZlcnNpemUsCiAJCQkJCSBib29sIGRtYV90b19kZXZpY2UpCiB7Ci0JaWYgKHVubGlrZWx5KHNzYl9kbWFfbWFwcGluZ19lcnJvcihyaW5nLT5kZXYtPmRldiwgYWRkcikpKQorCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwgYWRkcikpKQogCQlyZXR1cm4gMTsKIAogCXN3aXRjaCAocmluZy0+dHlwZSkgewpAQCAtOTA2LDcgKzkwNiw3IEBACiAJCQlnb3RvIGVycl9rZnJlZV9tZXRhOwogCiAJCS8qIHRlc3QgZm9yIGFiaWxpdHkgdG8gZG1hIHRvIHR4aGRyX2NhY2hlICovCi0JCWRtYV90ZXN0ID0gc3NiX2RtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LCByaW5nLT50eGhkcl9jYWNoZSwKKwkJZG1hX3Rlc3QgPSBkbWFfbWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwgcmluZy0+dHhoZHJfY2FjaGUsCiAJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYjQzbGVnYWN5X3R4aGRyX2Z3MyksCiAJCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOwogCkBAIC05MjAsNyArOTIwLDcgQEAKIAkJCWlmICghcmluZy0+dHhoZHJfY2FjaGUpCiAJCQkJZ290byBlcnJfa2ZyZWVfbWV0YTsKIAotCQkJZG1hX3Rlc3QgPSBzc2JfZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYsCisJCQlkbWFfdGVzdCA9IGRtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LT5kbWFfZGV2LAogCQkJCQlyaW5nLT50eGhkcl9jYWNoZSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBiNDNsZWdhY3lfdHhoZHJfZnczKSwKIAkJCQkJRE1BX1RPX0RFVklDRSk7CkBAIC05MzAsOSArOTMwLDkgQEAKIAkJCQlnb3RvIGVycl9rZnJlZV90eGhkcl9jYWNoZTsKIAkJfQogCi0JCXNzYl9kbWFfdW5tYXBfc2luZ2xlKGRldi0+ZGV2LCBkbWFfdGVzdCwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYjQzbGVnYWN5X3R4aGRyX2Z3MyksCi0JCQkJICAgICBETUFfVE9fREVWSUNFKTsKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwgZG1hX3Rlc3QsCisJCQkJIHNpemVvZihzdHJ1Y3QgYjQzbGVnYWN5X3R4aGRyX2Z3MyksCisJCQkJIERNQV9UT19ERVZJQ0UpOwogCX0KIAogCXJpbmctPm5yX3Nsb3RzID0gbnJfc2xvdHM7CkBAIC0xMDQwLDkgKzEwNDAsMTIgQEAKIAkvKiBUcnkgdG8gc2V0IHRoZSBETUEgbWFzay4gSWYgaXQgZmFpbHMsIHRyeSBmYWxsaW5nIGJhY2sgdG8gYQogCSAqIGxvd2VyIG1hc2ssIGFzIHdlIGNhbiBhbHdheXMgYWxzbyBzdXBwb3J0IGEgbG93ZXIgb25lLiAqLwogCXdoaWxlICgxKSB7Ci0JCWVyciA9IHNzYl9kbWFfc2V0X21hc2soZGV2LT5kZXYsIG1hc2spOwotCQlpZiAoIWVycikKLQkJCWJyZWFrOworCQllcnIgPSBkbWFfc2V0X21hc2soZGV2LT5kZXYtPmRtYV9kZXYsIG1hc2spOworCQlpZiAoIWVycikgeworCQkJZXJyID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKGRldi0+ZGV2LT5kbWFfZGV2LCBtYXNrKTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CiAJCWlmIChtYXNrID09IERNQV9CSVRfTUFTSyg2NCkpIHsKIAkJCW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCQkJZmFsbGJhY2sgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5oCmluZGV4IGY5NjgxMDQuLmY4OWMzNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmgKQEAgLTcyLDcgKzcyLDcgQEAKIHN0cnVjdCBiNDNsZWdhY3lfZG1hZGVzYzMyIHsKIAlfX2xlMzIgY29udHJvbDsKIAlfX2xlMzIgYWRkcmVzczsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKICNkZWZpbmUgQjQzbGVnYWN5X0RNQTMyX0RDVExfQllURUNOVAkJMHgwMDAwMUZGRgogI2RlZmluZSBCNDNsZWdhY3lfRE1BMzJfRENUTF9BRERSRVhUX01BU0sJMHgwMDAzMDAwMAogI2RlZmluZSBCNDNsZWdhY3lfRE1BMzJfRENUTF9BRERSRVhUX1NISUZUCTE2CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAlfX2xlMzIgY29udHJvbDE7CiAJX19sZTMyIGFkZHJlc3NfbG93OwogCV9fbGUzMiBhZGRyZXNzX2hpZ2g7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAjZGVmaW5lIEI0M2xlZ2FjeV9ETUE2NF9EQ1RMMF9EVEFCTEVFTkQJCTB4MTAwMDAwMDAKICNkZWZpbmUgQjQzbGVnYWN5X0RNQTY0X0RDVEwwX0lSUQkJMHgyMDAwMDAwMAogI2RlZmluZSBCNDNsZWdhY3lfRE1BNjRfRENUTDBfRlJBTUVFTkQJCTB4NDAwMDAwMDAKQEAgLTE2Miw4ICsxNjIsOCBAQAogCXVuaW9uIHsKIAkJc3RydWN0IGI0M2xlZ2FjeV9kbWFkZXNjMzIgZG1hMzI7CiAJCXN0cnVjdCBiNDNsZWdhY3lfZG1hZGVzYzY0IGRtYTY0OwotCX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisJfSBfX3BhY2tlZDsKK30gX19wYWNrZWQ7CiAKIAogLyogTWlzYyBETUEgY29uc3RhbnRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kveG1pdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3htaXQuaAppbmRleCA5MTYzMzA4Li4yODlkYjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kveG1pdC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS94bWl0LmgKQEAgLTksOCArOSw4IEBACiAJCXVuaW9uIHsJCQkJXAogCQkJX19sZTMyIGRhdGE7CQlcCiAJCQlfX3U4IHJhd1tzaXplXTsJCVwKLQkJfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CVwKLQl9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorCQl9IF9fcGFja2VkOwlcCisJfSBfX3BhY2tlZAogCiAvKiBzdHJ1Y3QgYjQzbGVnYWN5X3BsY3BfaGRyNCAqLwogX2I0M2xlZ2FjeV9kZWNsYXJlX3BsY3BfaGRyKDQpOwpAQCAtMzksNyArMzksNyBAQAogCXN0cnVjdCBiNDNsZWdhY3lfcGxjcF9oZHI2IHJ0c19wbGNwOwkvKiBSVFMgUExDUCAqLwogCV9fdTggcnRzX2ZyYW1lWzE4XTsJCQkvKiBUaGUgUlRTIGZyYW1lIChpZiB1c2VkKSAqLwogCXN0cnVjdCBiNDNsZWdhY3lfcGxjcF9oZHI2IHBsY3A7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAKIC8qIE1BQyBUWCBjb250cm9sICovCiAjZGVmaW5lIEI0M2xlZ2FjeV9UWDRfTUFDX0tFWUlEWAkweDBGRjAwMDAwIC8qIFNlY3VyaXR5IGtleSBpbmRleCAqLwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJX19sZTE2IHNlcTsKIAl1OCBwaHlfc3RhdDsKIAlQQURfQllURVMoMSk7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAKIAogLyogUmVjZWl2ZSBoZWFkZXIgZm9yIHYzIGZpcm13YXJlLiAqLwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJX19sZTE2IG1hY19zdGF0dXM7CS8qIE1BQyBSWCBzdGF0dXMgKi8KIAlfX2xlMTYgbWFjX3RpbWU7CiAJX19sZTE2IGNoYW5uZWw7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKK30gX19wYWNrZWQ7CiAKIAogLyogUEhZIFJYIFN0YXR1cyAwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExLmgKaW5kZXggN2Y5ZDhkOS4uZWQ5OGNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTEuaApAQCAtMTksMzUgKzE5LDM1IEBACiAJCQlfX2xlMTYgc3RhdHVzX2NvZGU7CiAJCQkvKiBwb3NzaWJseSBmb2xsb3dlZCBieSBDaGFsbGVuZ2UgdGV4dCAqLwogCQkJdTggdmFyaWFibGVbMF07Ci0JCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF1dGg7CisJCX0gX19wYWNrZWQgYXV0aDsKIAkJc3RydWN0IHsKIAkJCV9fbGUxNiByZWFzb25fY29kZTsKLQkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGVhdXRoOworCQl9IF9fcGFja2VkIGRlYXV0aDsKIAkJc3RydWN0IHsKIAkJCV9fbGUxNiBjYXBhYl9pbmZvOwogCQkJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKIAkJCS8qIGZvbGxvd2VkIGJ5IFNTSUQgYW5kIFN1cHBvcnRlZCByYXRlcyAqLwogCQkJdTggdmFyaWFibGVbMF07Ci0JCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFzc29jX3JlcTsKKwkJfSBfX3BhY2tlZCBhc3NvY19yZXE7CiAJCXN0cnVjdCB7CiAJCQlfX2xlMTYgY2FwYWJfaW5mbzsKIAkJCV9fbGUxNiBzdGF0dXNfY29kZTsKIAkJCV9fbGUxNiBhaWQ7CiAJCQkvKiBmb2xsb3dlZCBieSBTdXBwb3J0ZWQgcmF0ZXMgKi8KIAkJCXU4IHZhcmlhYmxlWzBdOwotCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhc3NvY19yZXNwLCByZWFzc29jX3Jlc3A7CisJCX0gX19wYWNrZWQgYXNzb2NfcmVzcCwgcmVhc3NvY19yZXNwOwogCQlzdHJ1Y3QgewogCQkJX19sZTE2IGNhcGFiX2luZm87CiAJCQlfX2xlMTYgbGlzdGVuX2ludGVydmFsOwogCQkJdTggY3VycmVudF9hcFs2XTsKIAkJCS8qIGZvbGxvd2VkIGJ5IFNTSUQgYW5kIFN1cHBvcnRlZCByYXRlcyAqLwogCQkJdTggdmFyaWFibGVbMF07Ci0JCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHJlYXNzb2NfcmVxOworCQl9IF9fcGFja2VkIHJlYXNzb2NfcmVxOwogCQlzdHJ1Y3QgewogCQkJX19sZTE2IHJlYXNvbl9jb2RlOwotCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkaXNhc3NvYzsKKwkJfSBfX3BhY2tlZCBkaXNhc3NvYzsKIAkJc3RydWN0IHsKLQkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcHJvYmVfcmVxOworCQl9IF9fcGFja2VkIHByb2JlX3JlcTsKIAkJc3RydWN0IHsKIAkJCXU4IHRpbWVzdGFtcFs4XTsKIAkJCV9fbGUxNiBiZWFjb25faW50OwpAQCAtNTUsOSArNTUsOSBAQAogCQkJLyogZm9sbG93ZWQgYnkgc29tZSBvZiBTU0lELCBTdXBwb3J0ZWQgcmF0ZXMsCiAJCQkgKiBGSCBQYXJhbXMsIERTIFBhcmFtcywgQ0YgUGFyYW1zLCBJQlNTIFBhcmFtcywgVElNICovCiAJCQl1OCB2YXJpYWJsZVswXTsKLQkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYmVhY29uLCBwcm9iZV9yZXNwOworCQl9IF9fcGFja2VkIGJlYWNvbiwgcHJvYmVfcmVzcDsKIAl9IHU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKaW5kZXggMjMxZGJkNy4uZGJiOTg2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYwpAQCAtNjg4LDcgKzY4OCw3IEBACiAJc3RydWN0IGFwX2RhdGEgKmFwID0gZGF0YTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXAtPmxvY2FsLT5kZXY7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQl1MTYgZmMsIHN0YXR1czsKKwl1MTYgc3RhdHVzOwogCV9fbGUxNiAqcG9zOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gTlVMTDsKIAljaGFyICp0eHQgPSBOVUxMOwpAQCAtNjk5LDcgKzY5OSw2IEBACiAJfQogCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CiAJaWYgKCghaWVlZTgwMjExX2lzX2Fzc29jX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCSAgICAgIWllZWU4MDIxMV9pc19yZWFzc29jX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKSkgfHwKIAkgICAgc2tiLT5sZW4gPCBJRUVFODAyMTFfTUdNVF9IRFJfTEVOICsgNCkgewpAQCAtMTIyNSw3ICsxMjI0LDcgQEAKIAogCiAvKiBHZW5lcmF0ZSBjaGFsbGVuZ2UgZGF0YSBmb3Igc2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbi4gSUVFRSA4MDIuMTEgc3BlY2lmaWVzCi0gKiB0aGF0IFdFUCBhbGdvcml0aG0gaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBjaGFsbGFuZ2UuIFRoaXMgc2hvdWxkIGJlIHVuaXF1ZSwKKyAqIHRoYXQgV0VQIGFsZ29yaXRobSBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIGNoYWxsZW5nZS4gVGhpcyBzaG91bGQgYmUgdW5pcXVlLAogICogYnV0IG90aGVyd2lzZSB0aGVyZSBpcyBub3QgcmVhbGx5IG5lZWQgZm9yIHJhbmRvbW5lc3MgZXRjLiBJbml0aWFsaXplIFdFUAogICogd2l0aCBwc2V1ZG8gcmFuZG9tIGtleSBhbmQgdGhlbiB1c2UgaW5jcmVhc2luZyBJViB0byBnZXQgdW5pcXVlIGNoYWxsZW5nZQogICogc3RyZWFtcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oCmluZGV4IDkwYjY0YjA5Li40MjMwMTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29tbW9uLmgKQEAgLTE3OSw3ICsxNzksNyBAQAogCV9fbGUxNiB2YXJpYW50OwogCV9fbGUxNiBtYWpvcjsKIAlfX2xlMTYgbWlub3I7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSEZBMzg0WF9DT01QX0lEX1BSSSAweDE1CiAjZGVmaW5lIEhGQTM4NFhfQ09NUF9JRF9TVEEgMHgxZgpAQCAtMTkyLDE0ICsxOTIsMTQgQEAKIAlfX2xlMTYgdmFyaWFudDsKIAlfX2xlMTYgYm90dG9tOwogCV9fbGUxNiB0b3A7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogc3RydWN0IGhmYTM4NHhfYnVpbGRfaWQKIHsKIAlfX2xlMTYgcHJpX3NlcTsKIAlfX2xlMTYgc2VjX3NlcTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogRkQwMSAtIERvd25sb2FkIEJ1ZmZlciAqLwogc3RydWN0IGhmYTM4NHhfcmlkX2Rvd25sb2FkX2J1ZmZlcgpAQCAtMjA3LDE0ICsyMDcsMTQgQEAKIAlfX2xlMTYgcGFnZTsKIAlfX2xlMTYgb2Zmc2V0OwogCV9fbGUxNiBsZW5ndGg7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIEJTUyBjb25uZWN0aW9uIHF1YWxpdHkgKFJJRCBGRDQzIHJhbmdlLCBSSUQgRkQ1MSBkQm0tbm9ybWFsaXplZCkgKi8KIHN0cnVjdCBoZmEzODR4X2NvbW1zX3F1YWxpdHkgewogCV9fbGUxNiBjb21tX3F1YWw7IC8qIDAgLi4gOTIgKi8KIAlfX2xlMTYgc2lnbmFsX2xldmVsOyAvKiAyNyAuLiAxNTQgKi8KIAlfX2xlMTYgbm9pc2VfbGV2ZWw7IC8qIDI3IC4uIDE1NCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qIG5ldGRldmljZSBwcml2YXRlIGlvY3RscyAodXNlZCwgZS5nLiwgd2l0aCBpd3ByaXYgZnJvbSB1c2VyIHNwYWNlKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCmluZGV4IDI5YjMxYTYuLmJhNTRkMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMjMsNyArMjIsNyBAQAogI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCiAKIAotc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiaG9zdGFwX2NzIjsKK3N0YXRpYyBjaGFyICpkZXZfaW5mbyA9ICJob3N0YXBfY3MiOwogCiBNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEludGVyc2lsIFByaXNtMi1iYXNlZCA4MDIuMTEgd2lyZWxlc3MgTEFOICIKQEAgLTIyNSwyNyArMjI0LDE4IEBACiBzdGF0aWMgdm9pZCBzYW5kaXNrX3NldF9pb2Jhc2UobG9jYWxfaW5mb190ICpsb2NhbCkKIHsKIAlpbnQgcmVzOwotCWNvbmZfcmVnX3QgcmVnOwogCXN0cnVjdCBob3N0YXBfY3NfcHJpdiAqaHdfcHJpdiA9IGxvY2FsLT5od19wcml2OwogCi0JcmVnLkZ1bmN0aW9uID0gMDsKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IDB4MTA7IC8qIDB4M2YwIElPIGJhc2UgMSAqLwotCXJlZy5WYWx1ZSA9IGh3X3ByaXYtPmxpbmstPmlvLkJhc2VQb3J0MSAmIDB4MDBmZjsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCAweDEwLAorCQkJCWh3X3ByaXYtPmxpbmstPnJlc291cmNlWzBdLT5zdGFydCAmIDB4MDBmZik7CiAJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJQcmlzbTMgU2FuRGlzayAtIGZhaWxlZCB0byBzZXQgSS9PIGJhc2UgMCAtIgogCQkgICAgICAgIiByZXM9JWRcbiIsIHJlcyk7CiAJfQogCXVkZWxheSgxMCk7CiAKLQlyZWcuRnVuY3Rpb24gPSAwOwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gMHgxMjsgLyogMHgzZjIgSU8gYmFzZSAyICovCi0JcmVnLlZhbHVlID0gKGh3X3ByaXYtPmxpbmstPmlvLkJhc2VQb3J0MSAmIDB4ZmYwMCkgPj4gODsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCAweDEyLAorCQkJCShod19wcml2LT5saW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPj4gOCkgJiAweDAwZmYpOwogCWlmIChyZXMgIT0gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiUHJpc20zIFNhbkRpc2sgLSBmYWlsZWQgdG8gc2V0IEkvTyBiYXNlIDEgLSIKIAkJICAgICAgICIgcmVzPSVkXG4iLCByZXMpOwpAQCAtMjcxLDEyICsyNjEsMTEgQEAKIHN0YXRpYyBpbnQgc2FuZGlza19lbmFibGVfd2lyZWxlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzLCByZXQgPSAwOwotCWNvbmZfcmVnX3QgcmVnOwogCXN0cnVjdCBob3N0YXBfaW50ZXJmYWNlICppZmFjZSA9IG5ldGRldl9wcml2KGRldik7CiAJbG9jYWxfaW5mb190ICpsb2NhbCA9IGlmYWNlLT5sb2NhbDsKIAlzdHJ1Y3QgaG9zdGFwX2NzX3ByaXYgKmh3X3ByaXYgPSBsb2NhbC0+aHdfcHJpdjsKIAotCWlmIChod19wcml2LT5saW5rLT5pby5OdW1Qb3J0czEgPCAweDQyKSB7CisJaWYgKHJlc291cmNlX3NpemUoaHdfcHJpdi0+bGluay0+cmVzb3VyY2VbMF0pIDwgMHg0MikgewogCQkvKiBOb3QgZW5vdWdoIHBvcnRzIHRvIGJlIFNhbkRpc2sgbXVsdGktZnVuY3Rpb24gY2FyZCAqLwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGRvbmU7CkBAIC0yOTgsMTIgKzI4Nyw4IEBACiAJICAgICAgICIgLSB1c2luZyB2ZW5kb3Itc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiIsIGRldi0+bmFtZSk7CiAJaHdfcHJpdi0+c2FuZGlza19jb25uZWN0cGx1cyA9IDE7CiAKLQlyZWcuRnVuY3Rpb24gPSAwOwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLQlyZWcuVmFsdWUgPSBDT1JfU09GVF9SRVNFVDsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCBDSVNSRUdfQ09SLAorCQkJCUNPUl9TT0ZUX1JFU0VUKTsKIAlpZiAocmVzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTYW5EaXNrIC0gQ09SIHNyZXNldCBmYWlsZWQgKCVkKVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgcmVzKTsKQEAgLTMxMSwxNiArMjk2LDEzIEBACiAJfQogCW1kZWxheSg1KTsKIAotCXJlZy5GdW5jdGlvbiA9IDA7Ci0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOwogCS8qCiAJICogRG8gbm90IGVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUgdG8gYXZvaWQgc29tZSBib2d1cyBldmVudHMuIEludGVycnVwdHMKIAkgKiB3aWxsIGJlIGVuYWJsZWQgZHVyaW5nIHRoZSBmaXJzdCBjb3Jfc3Jlc2V0IGNhbGwuCiAJICovCi0JcmVnLlZhbHVlID0gQ09SX0xFVkVMX1JFUSB8IDB4OCB8IENPUl9BRERSX0RFQ09ERSB8IENPUl9GVU5DX0VOQTsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCBDSVNSRUdfQ09SLAorCQkJCShDT1JfTEVWRUxfUkVRIHwgMHg4IHwgQ09SX0FERFJfREVDT0RFIHwKKwkJCQkJQ09SX0ZVTkNfRU5BKSk7CiAJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2FuRGlzayAtIENPUiBzcmVzZXQgZmFpbGVkICglZClcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIHJlcyk7CkBAIC0zNDMsMzAgKzMyNSwyMyBAQAogc3RhdGljIHZvaWQgcHJpc20yX3BjY2FyZF9jb3Jfc3Jlc2V0KGxvY2FsX2luZm9fdCAqbG9jYWwpCiB7CiAJaW50IHJlczsKLQljb25mX3JlZ190IHJlZzsKKwl1OCB2YWw7CiAJc3RydWN0IGhvc3RhcF9jc19wcml2ICpod19wcml2ID0gbG9jYWwtPmh3X3ByaXY7CiAKIAlpZiAoIXByaXNtMl9wY2NhcmRfY2FyZF9wcmVzZW50KGxvY2FsKSkKIAkgICAgICAgcmV0dXJuOwogCi0JcmVnLkZ1bmN0aW9uID0gMDsKLQlyZWcuQWN0aW9uID0gQ1NfUkVBRDsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLQlyZWcuVmFsdWUgPSAwOwotCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAotCQkJCQkJICAgJnJlZyk7CisJcmVzID0gcGNtY2lhX3JlYWRfY29uZmlnX2J5dGUoaHdfcHJpdi0+bGluaywgQ0lTUkVHX0NPUiwgJnZhbCk7CiAJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2Nvcl9zcmVzZXQgZmFpbGVkIDEgKCVkKVxuIiwKIAkJICAgICAgIHJlcyk7CiAJCXJldHVybjsKIAl9CiAJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfY29yX3NyZXNldDogb3JpZ2luYWwgQ09SICUwMnhcbiIsCi0JICAgICAgIHJlZy5WYWx1ZSk7CisJCXZhbCk7CiAKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLlZhbHVlIHw9IENPUl9TT0ZUX1JFU0VUOwotCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAotCQkJCQkJICAgJnJlZyk7CisJdmFsIHw9IENPUl9TT0ZUX1JFU0VUOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCBDSVNSRUdfQ09SLCB2YWwpOwogCWlmIChyZXMgIT0gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAicHJpc20yX3BjY2FyZF9jb3Jfc3Jlc2V0IGZhaWxlZCAyICglZClcbiIsCiAJCSAgICAgICByZXMpOwpAQCAtMzc1LDExICszNTAsMTAgQEAKIAogCW1kZWxheShod19wcml2LT5zYW5kaXNrX2Nvbm5lY3RwbHVzID8gNSA6IDIpOwogCi0JcmVnLlZhbHVlICY9IH5DT1JfU09GVF9SRVNFVDsKKwl2YWwgJj0gfkNPUl9TT0ZUX1JFU0VUOwogCWlmIChod19wcml2LT5zYW5kaXNrX2Nvbm5lY3RwbHVzKQotCQlyZWcuVmFsdWUgfD0gQ09SX0lSRVFfRU5BOwotCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAotCQkJCQkJICAgJnJlZyk7CisJCXZhbCB8PSBDT1JfSVJFUV9FTkE7CisJcmVzID0gcGNtY2lhX3dyaXRlX2NvbmZpZ19ieXRlKGh3X3ByaXYtPmxpbmssIENJU1JFR19DT1IsIHZhbCk7CiAJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2Nvcl9zcmVzZXQgZmFpbGVkIDMgKCVkKVxuIiwKIAkJICAgICAgIHJlcyk7CkBAIC0zOTYsOCArMzcwLDcgQEAKIHN0YXRpYyB2b2lkIHByaXNtMl9wY2NhcmRfZ2VuZXNpc19yZXNldChsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgaGNyKQogewogCWludCByZXM7Ci0JY29uZl9yZWdfdCByZWc7Ci0JaW50IG9sZF9jb3I7CisJdTggb2xkX2NvcjsKIAlzdHJ1Y3QgaG9zdGFwX2NzX3ByaXYgKmh3X3ByaXYgPSBsb2NhbC0+aHdfcHJpdjsKIAogCWlmICghcHJpc20yX3BjY2FyZF9jYXJkX3ByZXNlbnQobG9jYWwpKQpAQCAtNDA4LDI1ICszODEsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJlZy5GdW5jdGlvbiA9IDA7Ci0JcmVnLkFjdGlvbiA9IENTX1JFQUQ7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0JcmVnLlZhbHVlID0gMDsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV9yZWFkX2NvbmZpZ19ieXRlKGh3X3ByaXYtPmxpbmssIENJU1JFR19DT1IsICZvbGRfY29yKTsKIAlpZiAocmVzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfZ2VuZXNpc19zcmVzZXQgZmFpbGVkIDEgIgogCQkgICAgICAgIiglZClcbiIsIHJlcyk7CiAJCXJldHVybjsKIAl9CiAJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfZ2VuZXNpc19zcmVzZXQ6IG9yaWdpbmFsIENPUiAlMDJ4XG4iLAotCSAgICAgICByZWcuVmFsdWUpOwotCW9sZF9jb3IgPSByZWcuVmFsdWU7CisJCW9sZF9jb3IpOwogCi0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5WYWx1ZSB8PSBDT1JfU09GVF9SRVNFVDsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCBDSVNSRUdfQ09SLAorCQkJCW9sZF9jb3IgfCBDT1JfU09GVF9SRVNFVCk7CiAJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2dlbmVzaXNfc3Jlc2V0IGZhaWxlZCAyICIKIAkJICAgICAgICIoJWQpXG4iLCByZXMpOwpAQCAtNDM2LDExICs0MDEsNyBAQAogCW1kZWxheSgxMCk7CiAKIAkvKiBTZXR1cCBHZW5lc2lzIG1vZGUgKi8KLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLlZhbHVlID0gaGNyOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ0NTUjsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCBDSVNSRUdfQ0NTUiwgaGNyKTsKIAlpZiAocmVzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfZ2VuZXNpc19zcmVzZXQgZmFpbGVkIDMgIgogCQkgICAgICAgIiglZClcbiIsIHJlcyk7CkBAIC00NDgsMTEgKzQwOSw4IEBACiAJfQogCW1kZWxheSgxMCk7CiAKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0JcmVnLlZhbHVlID0gb2xkX2NvciAmIH5DT1JfU09GVF9SRVNFVDsKLQlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKLQkJCQkJCSAgICZyZWcpOworCXJlcyA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShod19wcml2LT5saW5rLCBDSVNSRUdfQ09SLAorCQkJCW9sZF9jb3IgJiB+Q09SX1NPRlRfUkVTRVQpOwogCWlmIChyZXMgIT0gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAicHJpc20yX3BjY2FyZF9nZW5lc2lzX3NyZXNldCBmYWlsZWQgNCAiCiAJCSAgICAgICAiKCVkKVxuIiwgcmVzKTsKQEAgLTU2MSwzMCArNTE5LDI0IEBACiAJUERFQlVHKERFQlVHX0VYVFJBLCAiSU8gd2luZG93IHNldHRpbmdzOiBjZmctPmlvLm53aW49JWQgIgogCSAgICAgICAiZGZsdC0+aW8ubndpbj0lZFxuIiwKIAkgICAgICAgY2ZnLT5pby5ud2luLCBkZmx0LT5pby5ud2luKTsKLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IDA7CiAJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CiAJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87Ci0JCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQlQREVCVUcoREVCVUdfRVhUUkEsICJpby0+ZmxhZ3MgPSAweCUwNFgsICIKLQkJICAgICAgICJpby5iYXNlPTB4JTA0eCwgbGVuPSVkXG4iLCBpby0+ZmxhZ3MsCi0JCSAgICAgICBpby0+d2luWzBdLmJhc2UsIGlvLT53aW5bMF0ubGVuKTsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmCi0JCQlDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0KKwkJCQkJcGNtY2lhX2lvX2NmZ19kYXRhX3dpZHRoKGlvLT5mbGFncyk7CisJCXBfZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOwogCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5mbGFncyA9IHBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3M7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSBpby0+d2luWzFdLmxlbjsKIAkJfQogCX0KIAogCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpOwogfQogCiBzdGF0aWMgaW50IHByaXNtMl9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCkBAIC02NDYsNyArNTk4LDcgQEAKIAkJZ290byBmYWlsZWRfdW5sb2NrOwogCiAJZGV2LT5pcnEgPSBsaW5rLT5pcnE7Ci0JZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+aXJxX2luaXRfbG9jaywgZmxhZ3MpOwogCkBAIC02NTgsMTIgKzYxMCwxMCBAQAogCQkgICAgICAgbGluay0+Y29uZi5WcHAgJSAxMCk7CiAJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKIAkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKLQkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCi0JCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCi0JCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKLQkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7CisJaWYgKGxpbmstPnJlc291cmNlWzBdKQorCQlwcmludGsoIiAmICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMV0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMV0pOwogCXByaW50aygiXG4iKTsKIAogCWxvY2FsLT5zaHV0ZG93biA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMKaW5kZXggMmY5OTlmYy4uZTlkOWQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYwpAQCAtMTg5Niw3ICsxODk2LDcgQEAKIC8qIFNvbWUgU01QIHN5c3RlbXMgaGF2ZSByZXBvcnRlZCBudW1iZXIgb2Ygb2RkIGVycm9ycyB3aXRoIGhvc3RhcF9wY2kuIGZpZAogICogcmVnaXN0ZXIgaGFzIGNoYW5nZWQgdmFsdWVzIGJldHdlZW4gY29uc2VjdXRpdmUgcmVhZHMgZm9yIGFuIHVua25vd24gcmVhc29uLgogICogVGhpcyBzaG91bGQgcmVhbGx5IG5vdCBoYXBwZW4sIHNvIG1vcmUgZGVidWdnaW5nIGlzIG5lZWRlZC4gVGhpcyB0ZXN0Ci0gKiB2ZXJzaW9uIGlzIGEgYmlnIHNsb3dlciwgYnV0IGl0IHdpbGwgZGV0ZWN0IG1vc3Qgb2Ygc3VjaCByZWdpc3RlciBjaGFuZ2VzCisgKiB2ZXJzaW9uIGlzIGEgYml0IHNsb3dlciwgYnV0IGl0IHdpbGwgZGV0ZWN0IG1vc3Qgb2Ygc3VjaCByZWdpc3RlciBjaGFuZ2VzCiAgKiBhbmQgd2lsbCB0cnkgdG8gZ2V0IHRoZSBjb3JyZWN0IGZpZCBldmVudHVhbGx5LiAqLwogI2RlZmluZSBFWFRSQV9GSURfUkVBRF9URVNUUwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCmluZGV4IGViNTdkMWUuLjI1YTI3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAkJcmV0dXJuIC1FTk9CVUZTOwogCiAJLyogdmVyaWZ5IHRoYXQgdGhlcmUgaXMgcm9vbSBmb3Igd2RzIyBwb3N0Zml4IGluIHRoZSBpbnRlcmZhY2UgbmFtZSAqLwotCWlmIChzdHJsZW4obG9jYWwtPmRldi0+bmFtZSkgPiBJRk5BTVNJWiAtIDUpIHsKKwlpZiAoc3RybGVuKGxvY2FsLT5kZXYtPm5hbWUpID49IElGTkFNU0laIC0gNSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJyVzJyB0b28gbG9uZyBiYXNlIGRldmljZSBuYW1lXG4iLAogCQkgICAgICAgbG9jYWwtPmRldi0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzQxLDkgKzc0MSw3IEBACiAJbG9jYWxfaW5mb190ICpsb2NhbCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBsb2NhbF9pbmZvX3QsIHNldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7Ci0Jc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOwogCi0JaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChob3N0YXBfc2V0X3dvcmQoZGV2LCBIRkEzODRYX1JJRF9QUk9NSVNDVU9VU01PREUsCiAJCQkgICAgbG9jYWwtPmlzX3Byb21pc2MpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc2FibGluZyBwcm9taXNjdW91cyBtb2RlIGZhaWxlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKaW5kZXggMWJhMzNiZS4uMWM2NmIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKQEAgLTMxLDE0ICszMSwxNCBAQAogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1cywgbGVuOwogCXUzMiBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGludXhfd2xhbl9uZ19wcmlzbV9oZHIgewogCXUzMiBtc2djb2RlLCBtc2dsZW47CiAJY2hhciBkZXZuYW1lWzE2XTsKIAlzdHJ1Y3QgbGludXhfd2xhbl9uZ192YWwgaG9zdHRpbWUsIG1hY3RpbWUsIGNoYW5uZWwsIHJzc2ksIHNxLCBzaWduYWwsCiAJCW5vaXNlLCByYXRlLCBpc3R4LCBmcm1sZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaW51eF93bGFuX25nX2NhcF9oZHIgewogCV9fYmUzMiB2ZXJzaW9uOwpAQCAtNTUsNyArNTUsNyBAQAogCV9fYmUzMiBzc2lfbm9pc2U7CiAJX19iZTMyIHByZWFtYmxlOwogCV9fYmUzMiBlbmNvZGluZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RhcF9yYWRpb3RhcF9yeCB7CiAJc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgaGRyOwpAQCAtNjYsNyArNjYsNyBAQAogCV9fbGUxNiBjaGFuX2ZsYWdzOwogCXM4IGRibV9hbnRzaWduYWw7CiAJczggZGJtX2FudG5vaXNlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIExXTkdfQ0FQX0RJRF9CQVNFICAgKDQgfCAoMSA8PCA2KSkgLyogc2VjdGlvbiA0LCBncm91cCAxICovCiAjZGVmaW5lIExXTkdfQ0FQSERSX1ZFUlNJT04gMHg4MDIxMTAwMQpAQCAtOTcsNyArOTcsNyBAQAogCV9fYmUxNiBsZW47CiAKIAkvKiBmb2xsb3dlZCBieSBmcmFtZSBkYXRhOyBtYXggMjMwNCBieXRlcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lIHsKQEAgLTEyNiwxNCArMTI2LDE0IEBACiAJX19iZTE2IGxlbjsKIAogCS8qIGZvbGxvd2VkIGJ5IGZyYW1lIGRhdGE7IG1heCAyMzA0IGJ5dGVzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogc3RydWN0IGhmYTM4NHhfcmlkX2hkcgogewogCV9fbGUxNiBsZW47CiAJX19sZTE2IHJpZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKiBNYWNybyBmb3IgY29udmVydGluZyBzaWduYWwgbGV2ZWxzIChyYW5nZSAyNyAuLiAxNTQpIHRvIHdpcmVsZXNzIGV4dApAQCAtMTQ1LDI0ICsxNDUsMjQgQEAKIHN0cnVjdCBoZmEzODR4X3NjYW5fcmVxdWVzdCB7CiAJX19sZTE2IGNoYW5uZWxfbGlzdDsKIAlfX2xlMTYgdHhyYXRlOyAvKiBIRkEzODRYX1JBVEVTXyogKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhmYTM4NHhfaG9zdHNjYW5fcmVxdWVzdCB7CiAJX19sZTE2IGNoYW5uZWxfbGlzdDsKIAlfX2xlMTYgdHhyYXRlOwogCV9fbGUxNiB0YXJnZXRfc3NpZF9sZW47CiAJdTggdGFyZ2V0X3NzaWRbMzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaGZhMzg0eF9qb2luX3JlcXVlc3QgewogCXU4IGJzc2lkWzZdOwogCV9fbGUxNiBjaGFubmVsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaGZhMzg0eF9pbmZvX2ZyYW1lIHsKIAlfX2xlMTYgbGVuOwogCV9fbGUxNiB0eXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaGZhMzg0eF9jb21tX3RhbGxpZXMgewogCV9fbGUxNiB0eF91bmljYXN0X2ZyYW1lczsKQEAgLTE4Niw3ICsxODYsNyBAQAogCV9fbGUxNiByeF9kaXNjYXJkc193ZXBfdW5kZWNyeXB0YWJsZTsKIAlfX2xlMTYgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOwogCV9fbGUxNiByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaGZhMzg0eF9jb21tX3RhbGxpZXMzMiB7CiAJX19sZTMyIHR4X3VuaWNhc3RfZnJhbWVzOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJX19sZTMyIHJ4X2Rpc2NhcmRzX3dlcF91bmRlY3J5cHRhYmxlOwogCV9fbGUzMiByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CiAJX19sZTMyIHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBoZmEzODR4X3NjYW5fcmVzdWx0X2hkciB7CiAJX19sZTE2IHJlc2VydmVkOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAjZGVmaW5lIEhGQTM4NFhfU0NBTl9IT1NUX0lOSVRJQVRFRCAxCiAjZGVmaW5lIEhGQTM4NFhfU0NBTl9GSVJNV0FSRV9JTklUSUFURUQgMgogI2RlZmluZSBIRkEzODRYX1NDQU5fSU5RVUlSWV9GUk9NX0hPU1QgMwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhGQTM4NFhfU0NBTl9NQVhfUkVTVUxUUyAzMgogCkBAIC0yMzQsNyArMjM0LDcgQEAKIAl1OCBzc2lkWzMyXTsKIAl1OCBzdXBfcmF0ZXNbMTBdOwogCV9fbGUxNiByYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQgewogCV9fbGUxNiBjaGlkOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJdTggc3VwX3JhdGVzWzEwXTsKIAlfX2xlMTYgcmF0ZTsKIAlfX2xlMTYgYXRpbTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNvbW1fdGFsbGllc19zdW1zIHsKIAl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCmluZGV4IDBiZDRkZmEuLmMyNGM1ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCkBAIC0xNzQsNyArMTc0LDcgQEAKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJJbnRlbChSKSBQUk8vV2lyZWxlc3MgMjEwMCBOZXR3b3JrIERyaXZlciIKICNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiQ29weXJpZ2h0KGMpIDIwMDMtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbiIKIAotc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3QgKmlwdzIxMDBfcG1fcW9zX3JlcTsKK3N0YXRpYyBzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCBpcHcyMTAwX3BtX3Fvc19yZXE7CiAKIC8qIERlYnVnZ2luZyBzdHVmZiAqLwogI2lmZGVmIENPTkZJR19JUFcyMTAwX0RFQlVHCkBAIC0xNzQxLDcgKzE3NDEsNyBAQAogCS8qIHRoZSBpcHcyMTAwIGhhcmR3YXJlIHJlYWxseSBkb2Vzbid0IHdhbnQgcG93ZXIgbWFuYWdlbWVudCBkZWxheXMKIAkgKiBsb25nZXIgdGhhbiAxNzV1c2VjCiAJICovCi0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KGlwdzIxMDBfcG1fcW9zX3JlcSwgMTc1KTsKKwlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmlwdzIxMDBfcG1fcW9zX3JlcSwgMTc1KTsKIAogCS8qIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCwgdHVybiBpdCBvZmYuLi4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKQEAgLTE4ODksNyArMTg4OSw3IEBACiAJaXB3MjEwMF9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKIAotCXBtX3Fvc191cGRhdGVfcmVxdWVzdChpcHcyMTAwX3BtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKKwlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmlwdzIxMDBfcG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwogCiAJLyogV2UgaGF2ZSB0byBzaWduYWwgYW55IHN1cHBsaWNhbnQgaWYgd2UgYXJlIGRpc2Fzc29jaWF0aW5nICovCiAJaWYgKGFzc29jaWF0ZWQpCkBAIC0zNDY3LDEwICszNDY3LDggQEAKIAlkbWFfYWRkcl90IHA7CiAKIAlwcml2LT5tc2dfYnVmZmVycyA9Ci0JICAgIChzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQgKilrbWFsbG9jKElQV19DT01NQU5EX1BPT0xfU0laRSAqCi0JCQkJCQlzaXplb2Yoc3RydWN0Ci0JCQkJCQkgICAgICAgaXB3MjEwMF90eF9wYWNrZXQpLAotCQkJCQkJR0ZQX0tFUk5FTCk7CisJICAgIGttYWxsb2MoSVBXX0NPTU1BTkRfUE9PTF9TSVpFICogc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCksCisJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYtPm1zZ19idWZmZXJzKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlczogUENJIGFsbG9jIGZhaWxlZCBmb3IgbXNnICIKIAkJICAgICAgICJidWZmZXJzLlxuIiwgcHJpdi0+bmV0X2Rldi0+bmFtZSk7CkBAIC00NDk5LDEwICs0NDk3LDggQEAKIAl9CiAKIAlwcml2LT50eF9idWZmZXJzID0KLQkgICAgKHN0cnVjdCBpcHcyMTAwX3R4X3BhY2tldCAqKWttYWxsb2MoVFhfUEVOREVEX1FVRVVFX0xFTkdUSCAqCi0JCQkJCQlzaXplb2Yoc3RydWN0Ci0JCQkJCQkgICAgICAgaXB3MjEwMF90eF9wYWNrZXQpLAotCQkJCQkJR0ZQX0FUT01JQyk7CisJICAgIGttYWxsb2MoVFhfUEVOREVEX1FVRVVFX0xFTkdUSCAqIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF90eF9wYWNrZXQpLAorCQkgICAgR0ZQX0FUT01JQyk7CiAJaWYgKCFwcml2LT50eF9idWZmZXJzKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQogCQkgICAgICAgIjogJXM6IGFsbG9jIGZhaWxlZCBmb3JtIHR4IGJ1ZmZlcnMuXG4iLApAQCAtNDY1MSw5ICs0NjQ3LDkgQEAKIAkvKgogCSAqIGFsbG9jYXRlIHBhY2tldHMKIAkgKi8KLQlwcml2LT5yeF9idWZmZXJzID0gKHN0cnVjdCBpcHcyMTAwX3J4X3BhY2tldCAqKQotCSAgICBrbWFsbG9jKFJYX1FVRVVFX0xFTkdUSCAqIHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9yeF9wYWNrZXQpLAotCQkgICAgR0ZQX0tFUk5FTCk7CisJcHJpdi0+cnhfYnVmZmVycyA9IGttYWxsb2MoUlhfUVVFVUVfTEVOR1RIICoKKwkJCQkgICBzaXplb2Yoc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0KSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYtPnJ4X2J1ZmZlcnMpIHsKIAkJSVBXX0RFQlVHX0lORk8oImNhbid0IGFsbG9jYXRlIHJ4IHBhY2tldCBidWZmZXIgdGFibGVcbiIpOwogCkBAIC01MjMzLDcgKzUyMjksNyBAQAogCXU4IGF1dGhfbW9kZTsKIAl1OCByZXBsYXlfY291bnRlcnNfbnVtYmVyOwogCXU4IHVuaWNhc3RfdXNpbmdfZ3JvdXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQgaXB3MjEwMF9zZXRfc2VjdXJpdHlfaW5mb3JtYXRpb24oc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKIAkJCQkJICAgIGludCBhdXRoX21vZGUsCkBAIC02NjY5LDggKzY2NjUsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaXB3MjEwMF9wbV9xb3NfcmVxID0gcG1fcW9zX2FkZF9yZXF1ZXN0KFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7CisJcG1fcW9zX2FkZF9yZXF1ZXN0KCZpcHcyMTAwX3BtX3Fvc19yZXEsIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCisJCQkgICBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CiAjaWZkZWYgQ09ORklHX0lQVzIxMDBfREVCVUcKIAlpcHcyMTAwX2RlYnVnX2xldmVsID0gZGVidWc7CiAJcmV0ID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZpcHcyMTAwX3BjaV9kcml2ZXIuZHJpdmVyLApAQCAtNjY5Miw3ICs2Njg4LDcgQEAKIAkJCSAgICZkcml2ZXJfYXR0cl9kZWJ1Z19sZXZlbCk7CiAjZW5kaWYKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlwdzIxMDBfcGNpX2RyaXZlcik7Ci0JcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KGlwdzIxMDBfcG1fcW9zX3JlcSk7CisJcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZpcHcyMTAwX3BtX3Fvc19yZXEpOwogfQogCiBtb2R1bGVfaW5pdChpcHcyMTAwX2luaXQpOwpAQCAtODQ3NSw3ICs4NDcxLDcgQEAKIAlzaG9ydCBtb2RlOwogCXVuc2lnbmVkIGludCBmd19zaXplOwogCXVuc2lnbmVkIGludCB1Y19zaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IGlwdzIxMDBfbW9kX2Zpcm13YXJlX2xvYWQoc3RydWN0IGlwdzIxMDBfZncgKmZ3KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuaAppbmRleCAxZWFiMGQ2Li44MzgwMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuaApAQCAtMTY0LDcgKzE2NCw3IEBACiAJCX0gZmllbGRzOwogCQl1OCBmaWVsZDsKIAl9IGluZm87Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHcyMTAwX2JkIHsKIAl1MzIgaG9zdF9hZGRyOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJICogMXN0IFRCRCkgKi8KIAl1OCBudW1fZnJhZ21lbnRzOwogCXU4IHJlc2VydmVkWzZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElQV19CRF9RVUVVRV9MRU5HVEgobikgKDE8PG4pCiAjZGVmaW5lIElQV19CRF9BTElHTk1FTlQoTCkgICAgKEwqc2l6ZW9mKHN0cnVjdCBpcHcyMTAwX2JkKSkKQEAgLTIzMiw3ICsyMzIsNyBAQAogI2RlZmluZSBJUFdfU1RBVFVTX0ZMQUdfV0VQX0VOQ1JZUFRFRAkoMTw8MSkKICNkZWZpbmUgSVBXX1NUQVRVU19GTEFHX0NSQ19FUlJPUiAgICAgICAoMTw8MikKIAl1OCByc3NpOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3MjEwMF9zdGF0dXNfcXVldWUgewogCS8qIGRyaXZlciAodmlydHVhbCkgcG9pbnRlciB0byBxdWV1ZSAqLwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJdTMyIHJlc2VydmVkMVszXTsKIAl1MzIgKm9yZGluYWwxX3B0cjsKIAl1MzIgKm9yZGluYWwyX3B0cjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGlwdzIxMDBfZGF0YV9oZWFkZXIgewogCXUzMiBob3N0X2NvbW1hbmRfcmVnOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJdTggc3JjX2FkZHJbRVRIX0FMRU5dOwogCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKIAl1MTYgZnJhZ21lbnRfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogSG9zdCBjb21tYW5kIGRhdGEgc3RydWN0dXJlICovCiBzdHJ1Y3QgaG9zdF9jb21tYW5kIHsKQEAgLTMxNiw3ICszMTYsNyBAQAogCXUzMiBob3N0X2NvbW1hbmRfc2VxdWVuY2U7CS8vIFVOSVFVRSBDT01NQU5EIE5VTUJFUiAoSUQpCiAJdTMyIGhvc3RfY29tbWFuZF9sZW5ndGg7CS8vIExFTkdUSAogCXUzMiBob3N0X2NvbW1hbmRfcGFyYW1ldGVyc1tIT1NUX0NPTU1BTkRfUEFSQU1TX1JFR19MRU5dOwkvLyBDT01NQU5EIFBBUkFNRVRFUlMKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogdHlwZWRlZiBlbnVtIHsKIAlQT1dFUl9PTl9SRVNFVCwKQEAgLTM4Miw3ICszODIsNyBAQAogCXUzMiBobmhkcl9zaXplOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBkYXRhCiAJCQkJICAgb3IgbnVtYmVyIG9mIGVudHJpZXMsIGlmIHRhYmxlLgogCQkJCSAgIERvZXMgTk9UIGluY2x1ZGUgaGVhZGVyICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTUFYX0tFWV9TSVpFCTE2CiAjZGVmaW5lCU1BWF9LRVlTCTgKQEAgLTgxNCw3ICs4MTQsNyBAQAogCQlzdHJ1Y3QgaXB3MjEwMF9ub3RpZmljYXRpb24gbm90aWZpY2F0aW9uOwogCQlzdHJ1Y3QgaXB3MjEwMF9jbWRfaGVhZGVyIGNvbW1hbmQ7CiAJfSByeF9kYXRhOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBCaXQgMC03IGFyZSBmb3IgODAyLjExYiB0eCByYXRlcyAtIC4gIEJpdCA1LTcgYXJlIHJlc2VydmVkICovCiAjZGVmaW5lIFRYX1JBVEVfMV9NQklUICAgICAgICAgICAgICAweDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKaW5kZXggM2FhM2JiMS4uY2IyNTUyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKQEAgLTk2LDcgKzk2LDcgQEAKIHN0YXRpYyB1MzIgaXB3X2RlYnVnX2xldmVsOwogc3RhdGljIGludCBhc3NvY2lhdGU7CiBzdGF0aWMgaW50IGF1dG9fY3JlYXRlID0gMTsKLXN0YXRpYyBpbnQgbGVkX3N1cHBvcnQgPSAwOworc3RhdGljIGludCBsZWRfc3VwcG9ydCA9IDE7CiBzdGF0aWMgaW50IGRpc2FibGUgPSAwOwogc3RhdGljIGludCBidF9jb2V4aXN0ID0gMDsKIHN0YXRpYyBpbnQgaHdjcnlwdG8gPSAwOwpAQCAtNjYyNCwxMyArNjYyNCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkgewotCQlidWYgPSBrbWFsbG9jKHdycXUtPmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJYnVmID0ga21lbWR1cChleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOwogCQlpZiAoYnVmID09IE5VTEwpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCW1lbWNweShidWYsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CiAJCWtmcmVlKGllZWUtPndwYV9pZSk7CiAJCWllZWUtPndwYV9pZSA9IGJ1ZjsKIAkJaWVlZS0+d3BhX2llX2xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOwpAQCAtMTIwODMsNyArMTIwODIsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhhdXRvX2NyZWF0ZSwgImF1dG8gY3JlYXRlIGFkaG9jIG5ldHdvcmsgKGRlZmF1bHQgb24pIik7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChsZWQsIGxlZF9zdXBwb3J0LCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhsZWQsICJlbmFibGUgbGVkIGNvbnRyb2wgb24gc29tZSBzeXN0ZW1zIChkZWZhdWx0IDAgb2ZmKSIpOworTU9EVUxFX1BBUk1fREVTQyhsZWQsICJlbmFibGUgbGVkIGNvbnRyb2wgb24gc29tZSBzeXN0ZW1zIChkZWZhdWx0IDEgb24pIik7CiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuaAppbmRleCBiZjBlZWIyLi5kN2QwNDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuaApAQCAtMzg4LDcgKzM4OCw3IEBACiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsJCS8qKjwgcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLwogCWludCBsb3dfbWFyazsJCSAgICAgICAvKio8IGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlIHNwYWNlIG1vcmUgdGhhbiB0aGlzICovCiAJaW50IGhpZ2hfbWFyazsJCSAgICAgICAvKio8IGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbGVzcyB0aGFuIHRoaXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAvKiBYWFggKi8KK30gX19wYWNrZWQ7IC8qIFhYWCAqLwogCiBzdHJ1Y3QgbWFjaGRyMzIgewogCV9fbGUxNiBmcmFtZV9jdGw7CkBAIC0zOTksNyArMzk5LDcgQEAKIAlfX2xlMTYgc2VxX2N0cmw7CQkvLyBtb3JlIGVuZGlhbnMhCiAJdTggYWRkcjRbTUFDQURSUl9CWVRFX0xFTl07CiAJX19sZTE2IHFvc19jdHJsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbWFjaGRyMzAgewogCV9fbGUxNiBmcmFtZV9jdGw7CkBAIC00MDksNyArNDA5LDcgQEAKIAl1OCBhZGRyM1tNQUNBRFJSX0JZVEVfTEVOXTsKIAlfX2xlMTYgc2VxX2N0cmw7CQkvLyBtb3JlIGVuZGlhbnMhCiAJdTggYWRkcjRbTUFDQURSUl9CWVRFX0xFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtYWNoZHIyNiB7CiAJX19sZTE2IGZyYW1lX2N0bDsKQEAgLTQxOSw3ICs0MTksNyBAQAogCXU4IGFkZHIzW01BQ0FEUlJfQllURV9MRU5dOwogCV9fbGUxNiBzZXFfY3RybDsJCS8vIG1vcmUgZW5kaWFucyEKIAlfX2xlMTYgcW9zX2N0cmw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtYWNoZHIyNCB7CiAJX19sZTE2IGZyYW1lX2N0bDsKQEAgLTQyOCwyMCArNDI4LDIwIEBACiAJdTggYWRkcjJbTUFDQURSUl9CWVRFX0xFTl07CiAJdTggYWRkcjNbTUFDQURSUl9CWVRFX0xFTl07CiAJX19sZTE2IHNlcV9jdHJsOwkJLy8gbW9yZSBlbmRpYW5zIQotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvLyBUWCBURkQgd2l0aCAzMiBieXRlIE1BQyBIZWFkZXIKIHN0cnVjdCB0eF90ZmRfMzIgewogCXN0cnVjdCBtYWNoZHIzMiBtY2hkcjsJLy8gMzIKIAlfX2xlMzIgdWl2cGxhY2Vob2xkZXJbMl07CS8vIDgKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLy8gVFggVEZEIHdpdGggMzAgYnl0ZSBNQUMgSGVhZGVyCiBzdHJ1Y3QgdHhfdGZkXzMwIHsKIAlzdHJ1Y3QgbWFjaGRyMzAgbWNoZHI7CS8vIDMwCiAJdTggcmVzZXJ2ZWRbMl07CQkvLyAyCiAJX19sZTMyIHVpdnBsYWNlaG9sZGVyWzJdOwkvLyA4Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8vIHR4IHRmZCB3aXRoIDI2IGJ5dGUgbWFjIGhlYWRlcgogc3RydWN0IHR4X3RmZF8yNiB7CkBAIC00NDksMTQgKzQ0OSwxNCBAQAogCXU4IHJlc2VydmVkMVsyXTsJLy8gMgogCV9fbGUzMiB1aXZwbGFjZWhvbGRlclsyXTsJLy8gOAogCXU4IHJlc2VydmVkMls0XTsJLy8gNAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvLyB0eCB0ZmQgd2l0aCAyNCBieXRlIG1hYyBoZWFkZXIKIHN0cnVjdCB0eF90ZmRfMjQgewogCXN0cnVjdCBtYWNoZHIyNCBtY2hkcjsJLy8gMjQKIAlfX2xlMzIgdWl2cGxhY2Vob2xkZXJbMl07CS8vIDgKIAl1OCByZXNlcnZlZFs4XTsJCS8vIDgKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBEQ1RfV0VQX0tFWV9GSUVMRF9MRU5HVEggMTYKIApAQCAtNDY1LDcgKzQ2NSw3IEBACiAJdTggbGVuZ3RoOwogCV9fbGUxNiByZXNlcnZlZDsKIAl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdGZkX2RhdGEgewogCS8qIEhlYWRlciAqLwpAQCAtNTA0LDE0ICs1MDQsMTQgQEAKIAlfX2xlMzIgbnVtX2NodW5rczsKIAlfX2xlMzIgY2h1bmtfcHRyW05VTV9URkRfQ0hVTktTXTsKIAlfX2xlMTYgY2h1bmtfbGVuW05VTV9URkRfQ0hVTktTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHR4cnhfY29udHJvbF9mbGFncyB7CiAJdTggbWVzc2FnZV90eXBlOwogCXU4IHJ4X3NlcV9udW07CiAJdTggY29udHJvbF9iaXRzOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lICBURkRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSAgVEZEX0NNRF9JTU1FRElBVEVfUEFZTE9BRF9MRU5HVEggICAoVEZEX1NJWkUgLSBzaXplb2Yoc3RydWN0IHR4cnhfY29udHJvbF9mbGFncykpCkBAIC01MjMsNyArNTIzLDcgQEAKIAkJc3RydWN0IHRmZF9jb21tYW5kIGNtZDsKIAkJdTggcmF3W1RGRF9DTURfSU1NRURJQVRFX1BBWUxPQURfTEVOR1RIXTsKIAl9IHU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHR5cGVkZWYgdm9pZCBkZXN0cnVjdG9yX2Z1bmMoY29uc3Qgdm9pZCAqKTsKIApAQCAtNTU5LDcgKzU1OSw3IEBACiAJCV9fbGUzMiBiW1NVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTXTsKIAkJX19sZTMyIGdbU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFNdOwogCX0gZmFpbGVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBzdGF0aXN0aWNzIGNvbW1hbmQgcmVzcG9uc2UgKi8KIHN0cnVjdCBpcHdfY21kX3N0YXRzIHsKQEAgLTU4NiwxMyArNTg2LDEzIEBACiAJX19sZTE2IHJ4X2F1dG9kZXRlY19ub19vZmRtOwogCV9fbGUxNiByeF9hdXRvZGV0ZWNfbm9fYmFya2VyOwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5vdGlmX2NoYW5uZWxfcmVzdWx0IHsKIAl1OCBjaGFubmVsX251bTsKIAlzdHJ1Y3QgaXB3X2NtZF9zdGF0cyBzdGF0czsKIAl1OCB1UmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgU0NBTl9DT01QTEVURURfU1RBVFVTX0NPTVBMRVRFICAxCiAjZGVmaW5lIFNDQU5fQ09NUExFVEVEX1NUQVRVU19BQk9SVEVEICAgMgpAQCAtNjAyLDI0ICs2MDIsMjQgQEAKIAl1OCBudW1fY2hhbm5lbHM7CiAJdTggc3RhdHVzOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgbm90aWZfZnJhZ19sZW5ndGggewogCV9fbGUxNiBmcmFnX2xlbmd0aDsKIAlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBub3RpZl9iZWFjb25fc3RhdGUgewogCV9fbGUzMiBzdGF0ZTsKIAlfX2xlMzIgbnVtYmVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgbm90aWZfdGdpX3R4X2tleSB7CiAJdTgga2V5X3N0YXRlOwogCXU4IHNlY3VyaXR5X3R5cGU7CiAJdTggc3RhdGlvbl9pbmRleDsKIAl1OCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTSUxFTkNFX09WRVJfVEhSRVNIICgxKQogI2RlZmluZSBTSUxFTkNFX1VOREVSX1RIUkVTSCAoMikKQEAgLTYzMSwyNSArNjMxLDI1IEBACiAJc3RydWN0IHJhdGVfaGlzdG9ncmFtIGhpc3RvZ3JhbTsKIAl1OCBzaWxlbmNlX25vdGlmaWNhdGlvbl90eXBlOwkvKiBTSUxFTkNFX09WRVIvVU5ERVJfVEhSRVNIICovCiAJX19sZTE2IHNpbGVuY2VfY291bnQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBub3RpZl9hc3NvY2lhdGlvbiB7CiAJdTggc3RhdGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBub3RpZl9hdXRoZW50aWNhdGUgewogCXU4IHN0YXRlOwogCXN0cnVjdCBtYWNoZHIyNCBhZGRyOwogCV9fbGUxNiBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBub3RpZl9jYWxpYnJhdGlvbiB7CiAJdTggZGF0YVsxMDRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgbm90aWZfbm9pc2UgewogCV9fbGUzMiB2YWx1ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGlwd19yeF9ub3RpZmljYXRpb24gewogCXU4IHJlc2VydmVkWzhdOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJCXN0cnVjdCBub3RpZl9ub2lzZSBub2lzZTsKIAkJdTggcmF3WzBdOwogCX0gdTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGlwd19yeF9mcmFtZSB7CiAJX19sZTMyIHJlc2VydmVkMTsKQEAgLTY5MiwxNCArNjkyLDE0IEBACiAJdTggcnRzY3RzX3NlZW47CQkvLyAweDEgUlRTIHNlZW4gOyAweDIgQ1RTIHNlZW4KIAlfX2xlMTYgbGVuZ3RoOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfcnhfaGVhZGVyIHsKIAl1OCBtZXNzYWdlX3R5cGU7CiAJdTggcnhfc2VxX251bTsKIAl1OCBjb250cm9sX2JpdHM7CiAJdTggcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfcnhfcGFja2V0IHsKIAlzdHJ1Y3QgaXB3X3J4X2hlYWRlciBoZWFkZXI7CkBAIC03MDcsNyArNzA3LDcgQEAKIAkJc3RydWN0IGlwd19yeF9mcmFtZSBmcmFtZTsKIAkJc3RydWN0IGlwd19yeF9ub3RpZmljYXRpb24gbm90aWZpY2F0aW9uOwogCX0gdTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJUFdfUlhfTk9USUZJQ0FUSU9OX1NJWkUgc2l6ZW9mKHN0cnVjdCBpcHdfcnhfaGVhZGVyKSArIDEyCiAjZGVmaW5lIElQV19SWF9GUkFNRV9TSVpFICAgICAgICAodW5zaWduZWQgaW50KShzaXplb2Yoc3RydWN0IGlwd19yeF9oZWFkZXIpICsgXApAQCAtNzE3LDcgKzcxNyw3IEBACiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07CQkJCS8qIE5vdCB0cmFuc2ZlcnJlZCBvdmVyIG5ldHdvcmssIHNvIG5vdCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICovCit9OwkJCQkvKiBOb3QgdHJhbnNmZXJyZWQgb3ZlciBuZXR3b3JrLCBzbyBub3QgIF9fcGFja2VkICovCiAKIHN0cnVjdCBpcHdfcnhfcXVldWUgewogCXN0cnVjdCBpcHdfcnhfbWVtX2J1ZmZlciBwb29sW1JYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlNdOwpAQCAtNzMwLDcgKzczMCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCByeF9mcmVlOwkvKiBPd24gYW4gU0tCcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcnhfdXNlZDsJLyogTm8gU0tCIGFsbG9jYXRlZCAqLwogCXNwaW5sb2NrX3QgbG9jazsKLX07CQkJCS8qIE5vdCB0cmFuc2ZlcnJlZCBvdmVyIG5ldHdvcmssIHNvIG5vdCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICovCit9OwkJCQkvKiBOb3QgdHJhbnNmZXJyZWQgb3ZlciBuZXR3b3JrLCBzbyBub3QgIF9fcGFja2VkICovCiAKIHN0cnVjdCBhbGl2ZV9jb21tYW5kX3Jlc3BvbmNlIHsKIAl1OCBhbGl2ZV9jb21tYW5kOwpAQCAtNzQ1LDIxICs3NDUsMjEgQEAKIAlfX2xlMTYgcmVzZXJ2ZWQ0OwogCXU4IHRpbWVfc3RhbXBbNV07CS8qIG1vbnRoLCBkYXksIHllYXIsIGhvdXJzLCBtaW51dGVzICovCiAJdTggdWNvZGVfdmFsaWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSVBXX01BWF9SQVRFUyAxMgogCiBzdHJ1Y3QgaXB3X3JhdGVzIHsKIAl1OCBudW1fcmF0ZXM7CiAJdTggcmF0ZXNbSVBXX01BWF9SQVRFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjb21tYW5kX2Jsb2NrIHsKIAl1bnNpZ25lZCBpbnQgY29udHJvbDsKIAl1MzIgc291cmNlX2FkZHI7CiAJdTMyIGRlc3RfYWRkcjsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIENCX05VTUJFUl9PRl9FTEVNRU5UU19TTUFMTCA2NAogc3RydWN0IGZ3X2ltYWdlX2Rlc2MgewpAQCAtNzkyLDcgKzc5Miw3IEBACiAJdTggYWNjZXB0X2FsbF9tZ210X2ZyYW1lczsKIAl1OCBwYXNzX25vaXNlX3N0YXRzX3RvX2hvc3Q7CiAJdTggcmVzZXJ2ZWQzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X211bHRpY2FzdF9hZGRyIHsKIAl1OCBudW1fb2ZfbXVsdGljYXN0X2FkZHJlc3NlczsKQEAgLTgwMSw3ICs4MDEsNyBAQAogCXU4IG1hYzJbNl07CiAJdTggbWFjM1s2XTsKIAl1OCBtYWM0WzZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIERDV19XRVBfS0VZX0lOREVYX01BU0sJCTB4MDMJLyogYml0cyBbMDoxXSAqLwogI2RlZmluZSBEQ1dfV0VQX0tFWV9TRUNfVFlQRV9NQVNLCTB4MzAJLyogYml0cyBbNDo1XSAqLwpAQCAtODIyLDcgKzgyMiw3IEBACiAJdTgga2V5X2luZGV4OwogCXU4IGtleV9zaXplOwogCXU4IGtleVsxNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfdGdpX3R4X2tleSB7CiAJdTgga2V5X2lkOwpAQCAtODMxLDcgKzgzMSw3IEBACiAJdTggZmxhZ3M7CiAJdTgga2V5WzE2XTsKIAlfX2xlMzIgdHhfY291bnRlclsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJUFdfU0NBTl9DSEFOTkVMUyA1NAogCkBAIC04NDAsNyArODQwLDcgQEAKIAlfX2xlMTYgZHdlbGxfdGltZTsKIAl1OCBjaGFubmVsc19saXN0W0lQV19TQ0FOX0NIQU5ORUxTXTsKIAl1OCBjaGFubmVsc19yZXNlcnZlZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSB7CiAJSVBXX1NDQU5fUEFTU0lWRV9USUxMX0ZJUlNUX0JFQUNPTl9TQ0FOID0gMCwKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCXU4IHNjYW5fdHlwZVtJUFdfU0NBTl9DSEFOTkVMUyAvIDJdOwogCXU4IHJlc2VydmVkOwogCV9fbGUxNiBkd2VsbF90aW1lW0lQV19TQ0FOX1RZUEVTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGlubGluZSB1OCBpcHdfZ2V0X3NjYW5fdHlwZShzdHJ1Y3QgaXB3X3NjYW5fcmVxdWVzdF9leHQgKnNjYW4sIHU4IGluZGV4KQogewpAQCAtOTAyLDcgKzkwMiw3IEBACiAJdTggc21yOwogCXU4IHJlc2VydmVkMTsKIAlfX2xlMTYgcmVzZXJ2ZWQyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyB7CiAJdTggaWVlZV9tb2RlOwpAQCAtOTEwLDM2ICs5MTAsMzYgQEAKIAl1OCBwdXJwb3NlOwogCXU4IHJlc2VydmVkOwogCXU4IHN1cHBvcnRlZF9yYXRlc1tJUFdfTUFYX1JBVEVTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGlwd19ydHNfdGhyZXNob2xkIHsKIAlfX2xlMTYgcnRzX3RocmVzaG9sZDsKIAlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfZnJhZ190aHJlc2hvbGQgewogCV9fbGUxNiBmcmFnX3RocmVzaG9sZDsKIAlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfcmV0cnlfbGltaXQgewogCXU4IHNob3J0X3JldHJ5X2xpbWl0OwogCXU4IGxvbmdfcmV0cnlfbGltaXQ7CiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X2Rpbm9fY29uZmlnIHsKIAlfX2xlMzIgZGlub19jb25maWdfYWRkcjsKIAlfX2xlMTYgZGlub19jb25maWdfc2l6ZTsKIAl1OCBkaW5vX3Jlc3BvbnNlOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X2Fpcm9uZXRfaW5mbyB7CiAJdTggaWQ7CiAJdTggbGVuZ3RoOwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGlwd19yeF9rZXkgewogCXU4IHN0YXRpb25faW5kZXg7CkBAIC05NTAsMjUgKzk1MCwyNSBAQAogCXU4IHN0YXRpb25fYWRkcmVzc1s2XTsKIAl1OCBrZXlfaW5kZXg7CiAJdTggcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfY291bnRyeV9jaGFubmVsX2luZm8gewogCXU4IGZpcnN0X2NoYW5uZWw7CiAJdTggbm9fY2hhbm5lbHM7CiAJczggbWF4X3R4X3Bvd2VyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X2NvdW50cnlfaW5mbyB7CiAJdTggaWQ7CiAJdTggbGVuZ3RoOwogCXU4IGNvdW50cnlfc3RyWzNdOwogCXN0cnVjdCBpcHdfY291bnRyeV9jaGFubmVsX2luZm8gZ3JvdXBzWzddOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X2NoYW5uZWxfdHhfcG93ZXIgewogCXU4IGNoYW5uZWxfbnVtYmVyOwogCXM4IHR4X3Bvd2VyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFNDQU5fQVNTT0NJQVRFRF9JTlRFUlZBTCAoSFopCiAjZGVmaW5lIFNDQU5fSU5URVJWQUwgKEhaIC8gMTApCkBAIC05NzksMTggKzk3OSwxOCBAQAogCXU4IG51bV9jaGFubmVsczsKIAl1OCBpZWVlX21vZGU7CiAJc3RydWN0IGlwd19jaGFubmVsX3R4X3Bvd2VyIGNoYW5uZWxzX3R4X3Bvd2VyW01BWF9BX0NIQU5ORUxTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGlwd19yc25fY2FwYWJpbGl0aWVzIHsKIAl1OCBpZDsKIAl1OCBsZW5ndGg7CiAJX19sZTE2IHZlcnNpb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfc2Vuc2l0aXZpdHlfY2FsaWIgewogCV9fbGUxNiBiZWFjb25fcnNzaV9yYXc7CiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioKICAqIEhvc3QgY29tbWFuZCBzdHJ1Y3R1cmUuCkBAIC0xMDE5LDcgKzEwMTksNyBAQAogICAgKiBuUGFyYW1zPShsZW4rMykvNCtzdGF0dXNfbGVuCiAgICAqLwogCXUzMiBwYXJhbVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTVEFUVVNfSENNRF9BQ1RJVkUgICAgICAoMTw8MCkJLyoqPCBob3N0IGNvbW1hbmQgaW4gcHJvZ3Jlc3MgKi8KIApAQCAtMTExNCw3ICsxMTE0LDcgQEAKIAl1MzIgZXZlbnQ7CiAJdTMyIHRpbWU7CiAJdTMyIGRhdGE7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpcHdfZndfZXJyb3IgewkgLyogWFhYICovCiAJdW5zaWduZWQgbG9uZyBqaWZmaWVzOwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAlzdHJ1Y3QgaXB3X2Vycm9yX2VsZW0gKmVsZW07CiAJc3RydWN0IGlwd19ldmVudCAqbG9nOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNpZmRlZiBDT05GSUdfSVBXMjIwMF9QUk9NSVNDVU9VUwogCkBAIC0xMTcwLDcgKzExNzAsNyBAQAogCXM4IHJ0X2RibW5vaXNlOwogCXU4IHJ0X2FudGVubmE7CS8qIGFudGVubmEgbnVtYmVyICovCiAJdTggcGF5bG9hZFswXTsgIC8qIHBheWxvYWQuLi4gKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKICNlbmRpZgogCiBzdHJ1Y3QgaXB3X3ByaXYgewpAQCAtMTk1Nyw3ICsxOTU3LDcgQEAKIHN0cnVjdCBpcHdfZml4ZWRfcmF0ZSB7CiAJX19sZTE2IHR4X3JhdGVzOwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJUFdfSU5ESVJFQ1RfQUREUl9NQVNLICh+MHgzdWwpCiAKQEAgLTE5NjYsMTQgKzE5NjYsMTQgQEAKIAl1OCBsZW47CiAJdTE2IHJlc2VydmVkOwogCXUzMiAqcGFyYW07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsJLyogWFhYICovCit9IF9fcGFja2VkOwkvKiBYWFggKi8KIAogc3RydWN0IGNtZGxvZ19ob3N0X2NtZCB7CiAJdTggY21kOwogCXU4IGxlbjsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CiAJY2hhciBwYXJhbVsxMjRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXB3X2NtZF9sb2cgewogCXVuc2lnbmVkIGxvbmcgamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwdy5oCmluZGV4IDI4NGIwZTQuLjcwZjU1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHcuaApAQCAtMTU0LDcgKzE1NCw3IEBACiAJdTggY3RybDsJCS8qIGFsd2F5cyAweDAzICovCiAJdTggb3VpW1A4MDIxMV9PVUlfTEVOXTsJLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCiAKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBsaWJpcHdfc25hcF9oZHIpCiAKQEAgLTMyMyw3ICszMjMsNyBAQAogCXU4IGtleXNbV0VQX0tFWVNdW1NDTV9LRVlfTEVOXTsKIAl1OCBsZXZlbDsKIAl1MTYgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAKQEAgLTM0Nyw3ICszNDcsNyBAQAogCV9fbGUxNiBkdXJhdGlvbl9pZDsKIAl1OCBhZGRyMVtFVEhfQUxFTl07CiAJdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19oZHJfMmFkZHIgewogCV9fbGUxNiBmcmFtZV9jdGw7CkBAIC0zNTUsNyArMzU1LDcgQEAKIAl1OCBhZGRyMVtFVEhfQUxFTl07CiAJdTggYWRkcjJbRVRIX0FMRU5dOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfaGRyXzNhZGRyIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMzY1LDcgKzM2NSw3IEBACiAJdTggYWRkcjNbRVRIX0FMRU5dOwogCV9fbGUxNiBzZXFfY3RsOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfaGRyXzRhZGRyIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMzc2LDcgKzM3Niw3IEBACiAJX19sZTE2IHNlcV9jdGw7CiAJdTggYWRkcjRbRVRIX0FMRU5dOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfaGRyXzNhZGRycW9zIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMzg3LDEzICszODcsMTMgQEAKIAlfX2xlMTYgc2VxX2N0bDsKIAl1OCBwYXlsb2FkWzBdOwogCV9fbGUxNiBxb3NfY3RsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGliaXB3X2luZm9fZWxlbWVudCB7CiAJdTggaWQ7CiAJdTggbGVuOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKQEAgLTQwNiw3ICs0MDYsNyBAQAogCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAJc3RydWN0IHsKIAkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCX0gX19wYWNrZWQ7CiAJdTMyIHRpbWVfc3RhbXBbMl07CiAJdTE2IHJlYXNvbjsKIAl1MTYgc3RhdHVzOwpAQCAtNDE5LDcgKzQxOSw3IEBACiAJX19sZTE2IHN0YXR1czsKIAkvKiBjaGFsbGVuZ2UgKi8KIAlzdHJ1Y3QgbGliaXB3X2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfY2hhbm5lbF9zd2l0Y2ggewogCXU4IGlkOwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJdTggbW9kZTsKIAl1OCBjaGFubmVsOwogCXU4IGNvdW50OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGliaXB3X2FjdGlvbiB7CiAJc3RydWN0IGxpYmlwd19oZHJfM2FkZHIgaGVhZGVyOwpAQCAtNDQxLDEyICs0NDEsMTIgQEAKIAkJc3RydWN0IGxpYmlwd19jaGFubmVsX3N3aXRjaCBjaGFubmVsX3N3aXRjaDsKIAogCX0gZm9ybWF0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGliaXB3X2Rpc2Fzc29jIHsKIAlzdHJ1Y3QgbGliaXB3X2hkcl8zYWRkciBoZWFkZXI7CiAJX19sZTE2IHJlYXNvbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQWxpYXMgZGVhdXRoIGZvciBkaXNhc3NvYyAqLwogI2RlZmluZSBsaWJpcHdfZGVhdXRoIGxpYmlwd19kaXNhc3NvYwpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJc3RydWN0IGxpYmlwd19oZHJfM2FkZHIgaGVhZGVyOwogCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLwogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19wcm9iZV9yZXNwb25zZSB7CiAJc3RydWN0IGxpYmlwd19oZHJfM2FkZHIgaGVhZGVyOwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBGSCBwYXJhbXMsIERTIHBhcmFtcywKIAkgKiBDRiBwYXJhbXMsIElCU1MgcGFyYW1zLCBUSU0gKGlmIGJlYWNvbiksIFJTTiAqLwogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQWxpYXMgYmVhY29uIGZvciBwcm9iZV9yZXNwb25zZSAqLwogI2RlZmluZSBsaWJpcHdfYmVhY29uIGxpYmlwd19wcm9iZV9yZXNwb25zZQpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKIAkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLwogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19yZWFzc29jX3JlcXVlc3QgewogCXN0cnVjdCBsaWJpcHdfaGRyXzNhZGRyIGhlYWRlcjsKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CiAJc3RydWN0IGxpYmlwd19pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGliaXB3X2Fzc29jX3Jlc3BvbnNlIHsKIAlzdHJ1Y3QgbGliaXB3X2hkcl8zYWRkciBoZWFkZXI7CkBAIC00OTMsNyArNDkzLDcgQEAKIAlfX2xlMTYgYWlkOwogCS8qIHN1cHBvcnRlZCByYXRlcyAqLwogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd190eGIgewogCXU4IG5yX2ZyYWdzOwpAQCAtNTU1LDE5ICs1NTUsMTkgQEAKIAl1OCBxdWlfc3VidHlwZTsKIAl1OCB2ZXJzaW9uOwogCXU4IGFjX2luZm87Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfcW9zX2FjX3BhcmFtZXRlciB7CiAJdTggYWNpX2FpZnNuOwogCXU4IGVjd19taW5fbWF4OwogCV9fbGUxNiB0eF9vcF9saW1pdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19xb3NfcGFyYW1ldGVyX2luZm8gewogCXN0cnVjdCBsaWJpcHdfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgaW5mb19lbGVtZW50OwogCXU4IHJlc2VydmVkOwogCXN0cnVjdCBsaWJpcHdfcW9zX2FjX3BhcmFtZXRlciBhY19wYXJhbXNfcmVjb3JkW1FPU19RVUVVRV9OVU1dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGliaXB3X3Fvc19wYXJhbWV0ZXJzIHsKIAlfX2xlMTYgY3dfbWluW1FPU19RVUVVRV9OVU1dOwpAQCAtNTc1LDcgKzU3NSw3IEBACiAJdTggYWlmc1tRT1NfUVVFVUVfTlVNXTsKIAl1OCBmbGFnW1FPU19RVUVVRV9OVU1dOwogCV9fbGUxNiB0eF9vcF9saW1pdFtRT1NfUVVFVUVfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19xb3NfZGF0YSB7CiAJc3RydWN0IGxpYmlwd19xb3NfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOwpAQCAtNTg4LDcgKzU4OCw3IEBACiBzdHJ1Y3QgbGliaXB3X3RpbV9wYXJhbWV0ZXJzIHsKIAl1OCB0aW1fY291bnQ7CiAJdTggdGltX3BlcmlvZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTYwNiw3ICs2MDYsNyBAQAogCV9fbGU2NCBzdGFydF90aW1lOwogCV9fbGUxNiBkdXJhdGlvbjsKIAl1OCBtYXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewkJCQkvKiBsaWJpcHdfbWVhc3VyZW1lbnRfcmVxdWVzdC5tb2RlICovCiAJLyogQml0IDAgaXMgcmVzZXJ2ZWQgKi8KQEAgLTYyNyw3ICs2MjcsNyBAQAogCXU4IGNoYW5uZWw7CiAJX19sZTY0IHN0YXJ0X3RpbWU7CiAJX19sZTE2IGR1cmF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGliaXB3X21lYXN1cmVtZW50X3JlcXVlc3QgewogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGllOwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJdTggbW9kZTsKIAl1OCB0eXBlOwogCXN0cnVjdCBsaWJpcHdfbWVhc3VyZW1lbnRfcGFyYW1zIHBhcmFtc1swXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19tZWFzdXJlbWVudF9yZXBvcnQgewogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGllOwpAQCAtNjQ1LDE3ICs2NDUsMTcgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBsaWJpcHdfYmFzaWNfcmVwb3J0IGJhc2ljWzBdOwogCX0gdTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd190cGNfcmVwb3J0IHsKIAl1OCB0cmFuc21pdF9wb3dlcjsKIAl1OCBsaW5rX21hcmdpbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxpYmlwd19jaGFubmVsX21hcCB7CiAJdTggY2hhbm5lbDsKIAl1OCBtYXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfaWJzc19kZnMgewogCXN0cnVjdCBsaWJpcHdfaW5mb19lbGVtZW50IGllOwpAQCAtNjY4LDE0ICs2NjgsMTQgQEAKIAl1OCBtb2RlOwogCXU4IGNoYW5uZWw7CiAJdTggY291bnQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfcXVpZXQgewogCXU4IGNvdW50OwogCXU4IHBlcmlvZDsKIAl1OCBkdXJhdGlvbjsKIAl1OCBvZmZzZXQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsaWJpcHdfbmV0d29yayB7CiAJLyogVGhlc2UgZW50cmllcyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIHVuaXF1ZSBuZXR3b3JrICovCkBAIC04MjgsNyArODI4LDYgQEAKIAlpbnQgaG9zdF9zdHJpcF9pdl9pY3Y7CiAKIAlpbnQgaG9zdF9vcGVuX2ZyYWc7Ci0JaW50IGhvc3RfYnVpbGRfaXY7CiAJaW50IGllZWU4MDJfMXg7CQkvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCiAKIAkvKiBXUEEgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfbW9kdWxlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYwppbmRleCA1NTk2NTQwLi4zMmRlZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYwpAQCAtNjIsOCArNjIsOCBAQAogTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RydWN0IGNmZzgwMjExX29wcyBsaWJpcHdfY29uZmlnX29wcyA9IHsgfTsKLXZvaWQgKmxpYmlwd193aXBoeV9wcml2aWQgPSAmbGliaXB3X3dpcGh5X3ByaXZpZDsKK3N0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIGxpYmlwd19jb25maWdfb3BzID0geyB9Oworc3RhdGljIHZvaWQgKmxpYmlwd193aXBoeV9wcml2aWQgPSAmbGliaXB3X3dpcGh5X3ByaXZpZDsKIAogc3RhdGljIGludCBsaWJpcHdfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IGxpYmlwd19kZXZpY2UgKmllZWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd190eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfdHguYwppbmRleCBkYThiZWFjLi4wMWM4OGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd190eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X3R4LmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogCWludCBpLCBieXRlc19wZXJfZnJhZywgbnJfZnJhZ3MsIGJ5dGVzX2xhc3RfZnJhZywgZnJhZ19zaXplLAogCSAgICBydHNfcmVxdWlyZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW5jcnlwdCwgaG9zdF9lbmNyeXB0LCBob3N0X2VuY3J5cHRfbXNkdSwgaG9zdF9idWlsZF9pdjsKKwlpbnQgZW5jcnlwdCwgaG9zdF9lbmNyeXB0LCBob3N0X2VuY3J5cHRfbXNkdTsKIAlfX2JlMTYgZXRoZXJfdHlwZTsKIAlpbnQgYnl0ZXMsIGZjLCBoZHJfbGVuOwogCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKQEAgLTMwMSw3ICszMDEsNiBAQAogCiAJaG9zdF9lbmNyeXB0ID0gaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGVuY3J5cHQgJiYgY3J5cHQ7CiAJaG9zdF9lbmNyeXB0X21zZHUgPSBpZWVlLT5ob3N0X2VuY3J5cHRfbXNkdSAmJiBlbmNyeXB0ICYmIGNyeXB0OwotCWhvc3RfYnVpbGRfaXYgPSBpZWVlLT5ob3N0X2J1aWxkX2l2ICYmIGVuY3J5cHQgJiYgY3J5cHQ7CiAKIAlpZiAoIWVuY3J5cHQgJiYgaWVlZS0+aWVlZTgwMl8xeCAmJgogCSAgICBpZWVlLT5kcm9wX3VuZW5jcnlwdGVkICYmIGV0aGVyX3R5cGUgIT0gaHRvbnMoRVRIX1BfUEFFKSkgewpAQCAtMzEzLDcgKzMxMiw3IEBACiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGRlc3QsIEVUSF9BTEVOKTsKIAlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIEVUSF9BTEVOLCBzcmMsIEVUSF9BTEVOKTsKIAotCWlmIChob3N0X2VuY3J5cHQgfHwgaG9zdF9idWlsZF9pdikKKwlpZiAoaG9zdF9lbmNyeXB0KQogCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEEgfAogCQkgICAgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEOwogCWVsc2UKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogCWZvciAoOyBpIDwgbnJfZnJhZ3M7IGkrKykgewogCQlza2JfZnJhZyA9IHR4Yi0+ZnJhZ21lbnRzW2ldOwogCi0JCWlmIChob3N0X2VuY3J5cHQgfHwgaG9zdF9idWlsZF9pdikKKwkJaWYgKGhvc3RfZW5jcnlwdCkKIAkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLAogCQkJCSAgICBjcnlwdC0+b3BzLT5leHRyYV9tcGR1X3ByZWZpeF9sZW4pOwogCkBAIC01MDIsMTUgKzUwMSw2IEBACiAJCSAqIHRvIGluc2VydCB0aGUgSVYgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLwogCQlpZiAoaG9zdF9lbmNyeXB0KQogCQkJbGliaXB3X2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiX2ZyYWcsIGhkcl9sZW4pOwotCQllbHNlIGlmIChob3N0X2J1aWxkX2l2KSB7Ci0JCQlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKLQkJCWlmIChjcnlwdC0+b3BzLT5idWlsZF9pdikKLQkJCQljcnlwdC0+b3BzLT5idWlsZF9pdihza2JfZnJhZywgaGRyX2xlbiwKLQkJCQkgICAgICBpZWVlLT5zZWMua2V5c1tpZWVlLT5zZWMuYWN0aXZlX2tleV0sCi0JCQkJICAgICAgaWVlZS0+c2VjLmtleV9zaXplc1tpZWVlLT5zZWMuYWN0aXZlX2tleV0sCi0JCQkJICAgICAgY3J5cHQtPnByaXYpOwotCQkJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7Ci0JCX0KIAogCQlpZiAoaWVlZS0+Y29uZmlnICYKIAkJICAgIChDRkdfTElCSVBXX0NPTVBVVEVfRkNTIHwgQ0ZHX0xJQklQV19SRVNFUlZFX0ZDUykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd193eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfd3guYwppbmRleCAzNjMzYzY2Li5kN2JkNmNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfd3guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd193eC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAl9OwogCWludCBpLCBrZXksIGtleV9wcm92aWRlZCwgbGVuOwogCXN0cnVjdCBsaWI4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7Ci0JaW50IGhvc3RfY3J5cHRvID0gaWVlZS0+aG9zdF9lbmNyeXB0IHx8IGllZWUtPmhvc3RfZGVjcnlwdCB8fCBpZWVlLT5ob3N0X2J1aWxkX2l2OworCWludCBob3N0X2NyeXB0byA9IGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQ7CiAJREVDTEFSRV9TU0lEX0JVRihzc2lkKTsKIAogCUxJQklQV19ERUJVR19XWCgiU0VUX0VOQ09ERVxuIik7CkBAIC00MTEsMTAgKzQxMSw2IEBACiAKIAkvKiBJZiBhIG5ldyBrZXkgd2FzIHByb3ZpZGVkLCBzZXQgaXQgdXAgKi8KIAlpZiAoZXJxLT5sZW5ndGggPiAwKSB7Ci0jaWZkZWYgQ09ORklHX0xJQklQV19ERUJVRwotCQlERUNMQVJFX1NTSURfQlVGKHNzaWQpOwotI2VuZGlmCi0KIAkJbGVuID0gZXJxLT5sZW5ndGggPD0gNSA/IDUgOiAxMzsKIAkJbWVtY3B5KHNlYy5rZXlzW2tleV0sIGtleWJ1ZiwgZXJxLT5sZW5ndGgpOwogCQlpZiAobGVuID4gZXJxLT5sZW5ndGgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL0tjb25maWcKaW5kZXggZGM4ZWQxNS4uYTUxZTRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvS2NvbmZpZwpAQCAtMzAsOSArMzAsMTEgQEAKIAogY29uZmlnIElXTFdJRklfREVCVUdGUwogICAgICAgICBib29sICJpd2xhZ24gZGVidWdmcyBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIElXTFdJRkkgJiYgSVdMV0lGSV9ERUJVRyAmJiBNQUM4MDIxMV9ERUJVR0ZTCisgICAgICAgIGRlcGVuZHMgb24gSVdMV0lGSSAmJiBNQUM4MDIxMV9ERUJVR0ZTCiAgICAgICAgIC0tLWhlbHAtLS0KLQkgIEVuYWJsZSBjcmVhdGlvbiBvZiBkZWJ1Z2ZzIGZpbGVzIGZvciB0aGUgaXdsd2lmaSBkcml2ZXJzLgorCSAgRW5hYmxlIGNyZWF0aW9uIG9mIGRlYnVnZnMgZmlsZXMgZm9yIHRoZSBpd2x3aWZpIGRyaXZlcnMuIFRoaXMKKwkgIGlzIGEgbG93LWltcGFjdCBvcHRpb24gdGhhdCBhbGxvd3MgZ2V0dGluZyBpbnNpZ2h0IGludG8gdGhlCisJICBkcml2ZXIncyBzdGF0ZSBhdCBydW50aW1lLgogCiBjb25maWcgSVdMV0lGSV9ERVZJQ0VfVFJBQ0lORwogCWJvb2wgIml3bHdpZmkgZGV2aWNlIGFjY2VzcyB0cmFjaW5nIgpAQCAtODUsMTAgKzg3LDE1IEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEludGVsIFdpcmVsZXNzIFdpRmkgTGluayA0OTY1QUdOCiAKIGNvbmZpZyBJV0w1MDAwCi0JYm9vbCAiSW50ZWwgV2lyZWxlc3MgV2lGaSA1MDAwQUdOOyBJbnRlbCBXaUZpIExpbmsgMTAwMCwgNjAwMCwgYW5kIDYwNTAgU2VyaWVzIgorCWJvb2wgIkludGVsIFdpcmVsZXNzLU4vQWR2YW5jZWQtTi9VbHRpbWF0ZS1OIFdpRmkgTGluayIKIAlkZXBlbmRzIG9uIElXTEFHTgogCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgSW50ZWwgV2lyZWxlc3MgV2lGaSBMaW5rIDUwMDBBR04gRmFtaWx5CisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHVzZSB3aXRoIHRoZSBmb2xsb3dpbmcgaGFyZHdhcmU6CisJCUludGVsIFdpcmVsZXNzIFdpRmkgTGluayA2MjUwQUdOIEFkYXB0ZXIKKwkJSW50ZWwgNjAwMCBTZXJpZXMgV2ktRmkgQWRhcHRlcnMgKDYyMDBBR04gYW5kIDYzMDBBR04pCisJCUludGVsIFdpRmkgTGluayAxMDAwQkdOCisJCUludGVsIFdpcmVsZXNzIFdpRmkgNTE1MEFHTgorCQlJbnRlbCBXaXJlbGVzcyBXaUZpIDUxMDBBR04sIDUzMDBBR04sIGFuZCA1MzUwQUdOCiAKIGNvbmZpZyBJV0wzOTQ1CiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAzOTQ1QUJHL0JHIE5ldHdvcmsgQ29ubmVjdGlvbiAoaXdsMzk0NSkiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZQppbmRleCA3YzcyMzUzLi43MjhiYjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmotJChDT05GSUdfSVdMV0lGSSkJKz0gaXdsY29yZS5vCiBpd2xjb3JlLW9ianMgCQk6PSBpd2wtY29yZS5vIGl3bC1lZXByb20ubyBpd2wtaGNtZC5vIGl3bC1wb3dlci5vCi1pd2xjb3JlLW9ianMgCQkrPSBpd2wtcngubyBpd2wtdHgubyBpd2wtc3RhLm8gaXdsLWNhbGliLm8KK2l3bGNvcmUtb2JqcyAJCSs9IGl3bC1yeC5vIGl3bC10eC5vIGl3bC1zdGEubwogaXdsY29yZS1vYmpzIAkJKz0gaXdsLXNjYW4ubyBpd2wtbGVkLm8KIGl3bGNvcmUtJChDT05GSUdfSVdMV0lGSV9ERUJVR0ZTKSArPSBpd2wtZGVidWdmcy5vCiBpd2xjb3JlLSQoQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcpICs9IGl3bC1kZXZ0cmFjZS5vCkBAIC0xMSw3ICsxMSw3IEBACiBvYmotJChDT05GSUdfSVdMQUdOKQkrPSBpd2xhZ24ubwogaXdsYWduLW9ianMJCTo9IGl3bC1hZ24ubyBpd2wtYWduLXJzLm8gaXdsLWFnbi1sZWQubyBpd2wtYWduLWljdC5vCiBpd2xhZ24tb2JqcwkJKz0gaXdsLWFnbi11Y29kZS5vIGl3bC1hZ24taGNtZC5vIGl3bC1hZ24tdHgubwotaXdsYWduLW9ianMJCSs9IGl3bC1hZ24tbGliLm8KK2l3bGFnbi1vYmpzCQkrPSBpd2wtYWduLWxpYi5vIGl3bC1hZ24tcngubyBpd2wtYWduLWNhbGliLm8KIGl3bGFnbi0kKENPTkZJR19JV0xXSUZJX0RFQlVHRlMpICs9IGl3bC1hZ24tZGVidWdmcy5vCiAKIGl3bGFnbi0kKENPTkZJR19JV0w0OTY1KSArPSBpd2wtNDk2NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKaW5kZXggNmJlMjk5Mi4uODg0ODMzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYwpAQCAtMTI5LDggKzEyOSw4IEBACiAJCQlwcml2LT5jZmctPm51bV9vZl9xdWV1ZXMgKgogCQkJc2l6ZW9mKHN0cnVjdCBpd2xhZ25fc2NkX2JjX3RibCk7CiAJcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKTsKLQlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMNTAwMF9TVEFUSU9OX0NPVU5UOwotCXByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQgPSBJV0w1MDAwX0JST0FEQ0FTVF9JRDsKKwlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMQUdOX1NUQVRJT05fQ09VTlQ7CisJcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlwcml2LT5od19wYXJhbXMubWF4X2RhdGFfc2l6ZSA9IElXTEFHTl9SVENfREFUQV9TSVpFOwogCXByaXYtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplID0gSVdMQUdOX1JUQ19JTlNUX1NJWkU7CkBAIC0xNTcsNiArMTU3LDEwIEBACiAJCQlCSVQoSVdMX0NBTElCX1RYX0lRKSAJCXwKIAkJCUJJVChJV0xfQ0FMSUJfVFhfSVFfUEVSRCkJfAogCQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOworCWlmIChwcml2LT5jZmctPm5lZWRfZGNfY2FsaWIpCisJCXByaXYtPmh3X3BhcmFtcy5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0RDKTsKKworCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElXTEFHTl9FWFRfQkVBQ09OX1RJTUVfUE9TOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTMsMTQgKzIxNywxOCBAQAogCQkuc2V0X2N0X2tpbGwgPSBpd2wxMDAwX3NldF9jdF90aHJlc2hvbGQsCiAJIH0sCiAJLm1hbmFnZV9pYnNzX3N0YXRpb24gPSBpd2xhZ25fbWFuYWdlX2lic3Nfc3RhdGlvbiwKKwkudXBkYXRlX2JjYXN0X3N0YXRpb24gPSBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24sCiAJLmRlYnVnZnNfb3BzID0gewogCQkucnhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV9yeF9zdGF0c19yZWFkLAogCQkudHhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV90eF9zdGF0c19yZWFkLAogCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsX3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZCwKKwkJLmJ0X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfYnRfc3RhdHNfcmVhZCwKIAl9LAogCS5yZWNvdmVyX2Zyb21fdHhfc3RhbGwgPSBpd2xfYmdfbW9uaXRvcl9yZWNvdmVyLAogCS5jaGVja19wbGNwX2hlYWx0aCA9IGl3bF9nb29kX3BsY3BfaGVhbHRoLAogCS5jaGVja19hY2tfaGVhbHRoID0gaXdsX2dvb2RfYWNrX2hlYWx0aCwKKwkudHhmaWZvX2ZsdXNoID0gaXdsYWduX3R4Zmlmb19mbHVzaCwKKwkuZGV2X3R4Zmlmb19mbHVzaCA9IGl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDEwMDBfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWRlYnVnZnMuYwppbmRleCA2YTljNjRhLi5lZjA4MzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWRlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWRlYnVnZnMuYwpAQCAtMjgsNiArMjgsMjggQEAKIAogI2luY2x1ZGUgIml3bC0zOTQ1LWRlYnVnZnMuaCIKIAorCitzdGF0aWMgaW50IGl3bDM5NDVfc3RhdGlzdGljc19mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY2hhciAqYnVmLCBpbnQgYnVmc3opCit7CisJaW50IHAgPSAwOworCisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiU3RhdGlzdGljcyBGbGFnKDB4JVgpOlxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZmxhZykpOworCWlmIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKKwkJCVVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKQorCQlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsCisJCQkgICAgICAgIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7CisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAorCQkgICAgICAgKGxlMzJfdG9fY3B1KHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZmxhZykgJgorCQkJVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLKQorCQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKKwkJICAgICAgIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKKwkJCVVDT0RFX1NUQVRJU1RJQ1NfTkFSUk9XX0JBTkRfTVNLKQorCQkJPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlyZXR1cm4gcDsKK30KKwogc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC03MCw3ICs5Miw3IEBACiAJbWF4X2NjayA9ICZwcml2LT5fMzk0NS5tYXhfZGVsdGEucnguY2NrOwogCW1heF9nZW5lcmFsID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOwogCi0JcG9zICs9IGl3bF9kYmdmc19zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7CisJcG9zICs9IGl3bDM5NDVfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgogCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKIAkJCSAiU3RhdGlzdGljc19SeCAtIE9GRE06Iik7CkBAIC0zMzEsNyArMzUzLDcgQEAKIAlhY2N1bV90eCA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLnR4OwogCWRlbHRhX3R4ID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MudHg7CiAJbWF4X3R4ID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS50eDsKLQlwb3MgKz0gaXdsX2RiZ2ZzX3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0gaXdsMzk0NV9zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCiAJCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAogCQkJICJTdGF0aXN0aWNzX1R4OiIpOwpAQCAtNDM4LDcgKzQ2MCw3IEBACiAJYWNjdW1fZGl2ID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5kaXY7CiAJZGVsdGFfZGl2ID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5kaXY7CiAJbWF4X2RpdiA9ICZwcml2LT5fMzk0NS5tYXhfZGVsdGEuZ2VuZXJhbC5kaXY7Ci0JcG9zICs9IGl3bF9kYmdmc19zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7CisJcG9zICs9IGl3bDM5NDVfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgogCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKIAkJCSAiU3RhdGlzdGljc19HZW5lcmFsOiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1maC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1maC5oCmluZGV4IDA0MmY2YmMuLjJjOWVkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtZmguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWZoLmgKQEAgLTE3NSwxMyArMTc1LDEzIEBACiBzdHJ1Y3QgaXdsMzk0NV90ZmRfdGIgewogCV9fbGUzMiBhZGRyOwogCV9fbGUzMiBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd2wzOTQ1X3RmZCB7CiAJX19sZTMyIGNvbnRyb2xfZmxhZ3M7CiAJc3RydWN0IGl3bDM5NDVfdGZkX3RiIHRic1s0XTsKIAl1OCBfX3BhZFsyOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogI2VuZGlmIC8qIF9faXdsXzM5NDVfZmhfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWh3LmgKaW5kZXggOTFiY2I0ZS4uN2M3MzFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtaHcuaApAQCAtOTYsNyArOTYsNyBAQAogCXU4IGdhaW5faW5kZXg7CQkvKiBpbmRleCBpbnRvIHBvd2VyIChnYWluKSBzZXR1cCB0YWJsZSAuLi4gKi8KIAlzOCBwb3dlcjsJCS8qIC4uLiBmb3IgdGhpcyBwd3IgbGV2ZWwgZm9yIHRoaXMgY2hubCBncm91cCAqLwogCXUxNiB2X2RldDsJCS8qIFBBIG91dHB1dCB2b2x0YWdlICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBNYXBwaW5ncyBvZiBUeCBwb3dlciBsZXZlbHMgLT4gbm9taW5hbCByYWRpby9EU1AgZ2FpbiB0YWJsZSBpbmRleGVzLgpAQCAtMTE3LDcgKzExNyw3IEBACiAJdTggZ3JvdXBfY2hhbm5lbDsJLyogInJlcHJlc2VudGF0aXZlIiBjaGFubmVsICMgaW4gdGhpcyBiYW5kICovCiAJczE2IHRlbXBlcmF0dXJlOwkvKiBoL3cgdGVtcGVyYXR1cmUgYXQgZmFjdG9yeSBjYWxpYiB0aGlzIGJhbmQKIAkJCQkgKiAoc2lnbmVkKSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogVGVtcGVyYXR1cmUtYmFzZWQgVHgtcG93ZXIgY29tcGVuc2F0aW9uIGRhdGEsIG5vdCBiYW5kLXNwZWNpZmljLgpAQCAtMTMxLDcgKzEzMSw3IEBACiAJdTMyIFRjOwogCXUzMiBUZDsKIAl1MzIgVGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBFRVBST00gbWFwCkBAIC0yMTUsNyArMjE1LDcgQEAKIC8qIGFicy5vZnM6IDUxMiAqLwogCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90ZW1wZXJhdHVyZV9jb3JyIGNvcnJlY3Rpb25zOyAgLyogYWJzLm9mczogODMyICovCiAJdTggcmVzZXJ2ZWQxNlsxNzJdOwkvKiBmaWxsIG91dCB0byBmdWxsIDEwMjQgYnl0ZSBibG9jayAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElXTDM5NDVfRUVQUk9NX0lNR19TSVpFIDEwMjQKIApAQCAtMjc0LDcgKzI3NCw3IEBACiAgKiBhbmQgJml3bDM5NDVfc2hhcmVkLnJ4X3JlYWRfcHRyWzBdIGlzIHByb3ZpZGVkIHRvIEZIX1JDU1JfUlBUUl9BRERSKDApICovCiBzdHJ1Y3QgaXdsMzk0NV9zaGFyZWQgewogCV9fbGUzMiB0eF9iYXNlX3B0cls4XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGlubGluZSB1OCBpd2wzOTQ1X2h3X2dldF9yYXRlKF9fbGUxNiByYXRlX25fZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LmMKaW5kZXggYzQ0YTMwMy4uYTA3MzEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYwpAQCAtMjc5LDggKzI3OSw4IEBACiAJCXEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgewogCiAJCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKLQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCB0eF9pbmZvLT5za2JbMF0pOwotCQl0eF9pbmZvLT5za2JbMF0gPSBOVUxMOworCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIHR4X2luZm8tPnNrYik7CisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CiAJCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChwcml2LCB0eHEpOwogCX0KIApAQCAtMzE1LDcgKzMxNSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYlswXSk7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IpOwogCWllZWU4MDIxMV90eF9pbmZvX2NsZWFyX3N0YXR1cyhpbmZvKTsKIAogCS8qIEZpbGwgdGhlIE1SUiBjaGFpbiB3aXRoIHNvbWUgaW5mbyBhYm91dCBvbi1jaGlwIHJldHJhbnNtaXNzaW9ucyAqLwpAQCAtMzUyLDcgKzM1Miw3IEBACiAgKiAgUlggaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiAvKgogICogIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIG9mIGFsbCBzdGF0aXN0aWNzIGNvdW50ZXIgYXJlIGluIERXT1JECiAgKiAgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGRlYnVnZ2luZywgZG8gbm90IGRlYWwgd2l0aApAQCAtNDA2LDYgKzQwNiwxMSBAQAogCXVuc2lnbmVkIGludCBwbGNwX21zZWM7CiAJdW5zaWduZWQgbG9uZyBwbGNwX3JlY2VpdmVkX2ppZmZpZXM7CiAKKwlpZiAocHJpdi0+Y2ZnLT5wbGNwX2RlbHRhX3RocmVzaG9sZCA9PQorCSAgICBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ESVNBQkxFKSB7CisJCUlXTF9ERUJVR19SQURJTyhwcml2LCAicGxjcF9lcnIgY2hlY2sgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQogCW1lbWNweSgmY3VycmVudF9zdGF0LCBwa3QtPnUucmF3LCBzaXplb2Yoc3RydWN0CiAJCQlpd2wzOTQ1X25vdGlmX3N0YXRpc3RpY3MpKTsKIAkvKgpAQCAtNDYwLDcgKzQ2NSw3IEBACiAJSVdMX0RFQlVHX1JYKHByaXYsICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKIAkJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKSwKIAkJICAgICBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAlpd2wzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnJhdyk7CiAjZW5kaWYKIAlpd2xfcmVjb3Zlcl9mcm9tX3N0YXRpc3RpY3MocHJpdiwgcGt0KTsKQEAgLTQ3NSw3ICs0ODAsNyBAQAogCV9fbGUzMiAqZmxhZyA9IChfX2xlMzIgKikmcGt0LT51LnJhdzsKIAogCWlmIChsZTMyX3RvX2NwdSgqZmxhZykgJiBVQ09ERV9TVEFUSVNUSUNTX0NMRUFSX01TSykgewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCQltZW1zZXQoJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MsIDAsCiAJCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcykpOwogCQltZW1zZXQoJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MsIDAsCkBAIC00OTQsMTU4ICs0OTksNiBAQAogICogTWlzYy4gaW50ZXJuYWwgc3RhdGUgYW5kIGhlbHBlciBmdW5jdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0KLS8qKgotICogaXdsMzk0NV9yZXBvcnRfZnJhbWUgLSBkdW1wIGZyYW1lIHRvIHN5c2xvZyBkdXJpbmcgZGVidWcgc2Vzc2lvbnMKLSAqCi0gKiBZb3UgbWF5IGhhY2sgdGhpcyBmdW5jdGlvbiB0byBzaG93IGRpZmZlcmVudCBhc3BlY3RzIG9mIHJlY2VpdmVkIGZyYW1lcywKLSAqIGluY2x1ZGluZyBzZWxlY3RpdmUgZnJhbWUgZHVtcHMuCi0gKiBncm91cDEwMCBwYXJhbWV0ZXIgc2VsZWN0cyB3aGV0aGVyIHRvIHNob3cgMSBvdXQgb2YgMTAwIGdvb2QgZnJhbWVzLgotICovCi1zdGF0aWMgdm9pZCBfaXdsMzk0NV9kYmdfcmVwb3J0X2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCwKLQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwgaW50IGdyb3VwMTAwKQotewotCXUzMiB0b191czsKLQl1MzIgcHJpbnRfc3VtbWFyeSA9IDA7Ci0JdTMyIHByaW50X2R1bXAgPSAwOwkvKiBzZXQgdG8gMSB0byBkdW1wIGFsbCBmcmFtZXMnIGNvbnRlbnRzICovCi0JdTMyIGh1bmRyZWQgPSAwOwotCXUzMiBkYXRhZnJhbWUgPSAwOwotCV9fbGUxNiBmYzsKLQl1MTYgc2VxX2N0bDsKLQl1MTYgY2hhbm5lbDsKLQl1MTYgcGh5X2ZsYWdzOwotCXUxNiBsZW5ndGg7Ci0JdTE2IHN0YXR1czsKLQl1MTYgYmNuX3RtcjsKLQl1MzIgdHNmX2xvdzsKLQl1NjQgdHNmOwotCXU4IHJzc2k7Ci0JdTggYWdjOwotCXUxNiBzaWdfYXZnOwotCXUxNiBub2lzZV9kaWZmOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX3N0YXRzICpyeF9zdGF0cyA9IElXTF9SWF9TVEFUUyhwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciAqcnhfaGRyID0gSVdMX1JYX0hEUihwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2VuZCAqcnhfZW5kID0gSVdMX1JYX0VORChwa3QpOwotCXU4ICpkYXRhID0gSVdMX1JYX0RBVEEocGt0KTsKLQotCS8qIE1BQyBoZWFkZXIgKi8KLQlmYyA9IGhlYWRlci0+ZnJhbWVfY29udHJvbDsKLQlzZXFfY3RsID0gbGUxNl90b19jcHUoaGVhZGVyLT5zZXFfY3RybCk7Ci0KLQkvKiBtZXRhZGF0YSAqLwotCWNoYW5uZWwgPSBsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpOwotCXBoeV9mbGFncyA9IGxlMTZfdG9fY3B1KHJ4X2hkci0+cGh5X2ZsYWdzKTsKLQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9oZHItPmxlbik7Ci0KLQkvKiBlbmQtb2YtZnJhbWUgc3RhdHVzIGFuZCB0aW1lc3RhbXAgKi8KLQlzdGF0dXMgPSBsZTMyX3RvX2NwdShyeF9lbmQtPnN0YXR1cyk7Ci0JYmNuX3RtciA9IGxlMzJfdG9fY3B1KHJ4X2VuZC0+YmVhY29uX3RpbWVzdGFtcCk7Ci0JdHNmX2xvdyA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKSAmIDB4MGZmZmZmZmZmOwotCXRzZiA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKTsKLQotCS8qIHNpZ25hbCBzdGF0aXN0aWNzICovCi0JcnNzaSA9IHJ4X3N0YXRzLT5yc3NpOwotCWFnYyA9IHJ4X3N0YXRzLT5hZ2M7Ci0Jc2lnX2F2ZyA9IGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5zaWdfYXZnKTsKLQlub2lzZV9kaWZmID0gbGUxNl90b19jcHUocnhfc3RhdHMtPm5vaXNlX2RpZmYpOwotCi0JdG9fdXMgPSAhY29tcGFyZV9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEsIHByaXYtPm1hY19hZGRyKTsKLQotCS8qIGlmIGRhdGEgZnJhbWUgaXMgdG8gdXMgYW5kIGFsbCBpcyBnb29kLAotCSAqICAgKG9wdGlvbmFsbHkpIHByaW50IHN1bW1hcnkgZm9yIG9ubHkgMSBvdXQgb2YgZXZlcnkgMTAwICovCi0JaWYgKHRvX3VzICYmIChmYyAmIH5jcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpKSA9PQotCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRlRZUEVfREFUQSkpIHsKLQkJZGF0YWZyYW1lID0gMTsKLQkJaWYgKCFncm91cDEwMCkKLQkJCXByaW50X3N1bW1hcnkgPSAxOwkvKiBwcmludCBlYWNoIGZyYW1lICovCi0JCWVsc2UgaWYgKHByaXYtPmZyYW1lY250X3RvX3VzIDwgMTAwKSB7Ci0JCQlwcml2LT5mcmFtZWNudF90b191cysrOwotCQkJcHJpbnRfc3VtbWFyeSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwcml2LT5mcmFtZWNudF90b191cyA9IDA7Ci0JCQlwcmludF9zdW1tYXJ5ID0gMTsKLQkJCWh1bmRyZWQgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogcHJpbnQgc3VtbWFyeSBmb3IgYWxsIG90aGVyIGZyYW1lcyAqLwotCQlwcmludF9zdW1tYXJ5ID0gMTsKLQl9Ci0KLQlpZiAocHJpbnRfc3VtbWFyeSkgewotCQljaGFyICp0aXRsZTsKLQkJaW50IHJhdGU7Ci0KLQkJaWYgKGh1bmRyZWQpCi0JCQl0aXRsZSA9ICIxMDBGcmFtZXMiOwotCQllbHNlIGlmIChpZWVlODAyMTFfaGFzX3JldHJ5KGZjKSkKLQkJCXRpdGxlID0gIlJldHJ5IjsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3Jlc3AoZmMpKQotCQkJdGl0bGUgPSAiQXNjUnNwIjsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVzcChmYykpCi0JCQl0aXRsZSA9ICJSYXNSc3AiOwotCQllbHNlIGlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpIHsKLQkJCXRpdGxlID0gIlByYlJzcCI7Ci0JCQlwcmludF9kdW1wID0gMTsJLyogZHVtcCBmcmFtZSBjb250ZW50cyAqLwotCQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19iZWFjb24oZmMpKSB7Ci0JCQl0aXRsZSA9ICJCZWFjb24iOwotCQkJcHJpbnRfZHVtcCA9IDE7CS8qIGR1bXAgZnJhbWUgY29udGVudHMgKi8KLQkJfSBlbHNlIGlmIChpZWVlODAyMTFfaXNfYXRpbShmYykpCi0JCQl0aXRsZSA9ICJBVElNIjsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQotCQkJdGl0bGUgPSAiQXV0aCI7Ci0JCWVsc2UgaWYgKGllZWU4MDIxMV9pc19kZWF1dGgoZmMpKQotCQkJdGl0bGUgPSAiRGVBdXRoIjsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Rpc2Fzc29jKGZjKSkKLQkJCXRpdGxlID0gIkRpc0Fzc29jIjsKLQkJZWxzZQotCQkJdGl0bGUgPSAiRnJhbWUiOwotCi0JCXJhdGUgPSBpd2wzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeChyeF9oZHItPnJhdGUpOwotCQlpZiAocmF0ZSA9PSAtMSkKLQkJCXJhdGUgPSAwOwotCQllbHNlCi0JCQlyYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlXS5pZWVlIC8gMjsKLQotCQkvKiBwcmludCBmcmFtZSBzdW1tYXJ5LgotCQkgKiBNQUMgYWRkcmVzc2VzIHNob3cganVzdCB0aGUgbGFzdCBieXRlIChmb3IgYnJldml0eSksCi0JCSAqICAgIGJ1dCB5b3UgY2FuIGhhY2sgaXQgdG8gc2hvdyBtb3JlLCBpZiB5b3UnZCBsaWtlIHRvLiAqLwotCQlpZiAoZGF0YWZyYW1lKQotCQkJSVdMX0RFQlVHX1JYKHByaXYsICIlczogbWhkPTB4JTA0eCwgZHN0PTB4JTAyeCwgIgotCQkJCSAgICAgImxlbj0ldSwgcnNzaT0lZCwgY2hubD0lZCwgcmF0ZT0lZCxcbiIsCi0JCQkJICAgICB0aXRsZSwgbGUxNl90b19jcHUoZmMpLCBoZWFkZXItPmFkZHIxWzVdLAotCQkJCSAgICAgbGVuZ3RoLCByc3NpLCBjaGFubmVsLCByYXRlKTsKLQkJZWxzZSB7Ci0JCQkvKiBzcmMvZHN0IGFkZHJlc3NlcyBhc3N1bWUgbWFuYWdlZCBtb2RlICovCi0JCQlJV0xfREVCVUdfUlgocHJpdiwgIiVzOiAweCUwNHgsIGRzdD0weCUwMngsICIKLQkJCQkgICAgICJzcmM9MHglMDJ4LCByc3NpPSV1LCB0aW09JWx1IHVzZWMsICIKLQkJCQkgICAgICJwaHk9MHglMDJ4LCBjaG5sPSVkXG4iLAotCQkJCSAgICAgdGl0bGUsIGxlMTZfdG9fY3B1KGZjKSwgaGVhZGVyLT5hZGRyMVs1XSwKLQkJCQkgICAgIGhlYWRlci0+YWRkcjNbNV0sIHJzc2ksCi0JCQkJICAgICB0c2ZfbG93IC0gcHJpdi0+c2Nhbl9zdGFydF90c2YsCi0JCQkJICAgICBwaHlfZmxhZ3MsIGNoYW5uZWwpOwotCQl9Ci0JfQotCWlmIChwcmludF9kdW1wKQotCQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1JYLCBkYXRhLCBsZW5ndGgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2RiZ19yZXBvcnRfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAotCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLCBpbnQgZ3JvdXAxMDApCi17Ci0JaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfUlgpCi0JCV9pd2wzOTQ1X2RiZ19yZXBvcnRfZnJhbWUocHJpdiwgcGt0LCBoZWFkZXIsIGdyb3VwMTAwKTsKLX0KLQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2wzOTQ1X2RiZ19yZXBvcnRfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAotCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLCBpbnQgZ3JvdXAxMDApCi17Ci19Ci0jZW5kaWYKIAogLyogVGhpcyBpcyBuZWNlc3Nhcnkgb25seSBmb3IgYSBudW1iZXIgb2Ygc3RhdGlzdGljcywgc2VlIHRoZSBjYWxsZXIuICovCiBzdGF0aWMgaW50IGl3bDM5NDVfaXNfbmV0d29ya19wYWNrZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtNzc3LDggKzYzMCw2IEBACiAJCQkgICAgICByeF9zdGF0dXMuc2lnbmFsLCByeF9zdGF0dXMuc2lnbmFsLAogCQkJICAgICAgcnhfc3RhdHVzLnJhdGVfaWR4KTsKIAotCS8qIFNldCAiMSIgdG8gcmVwb3J0IGdvb2QgZGF0YSBmcmFtZXMgaW4gZ3JvdXBzIG9mIDEwMCAqLwotCWl3bDM5NDVfZGJnX3JlcG9ydF9mcmFtZShwcml2LCBwa3QsIGhlYWRlciwgMSk7CiAJaXdsX2RiZ19sb2dfcnhfZGF0YV9mcmFtZShwcml2LCBsZTE2X3RvX2NwdShyeF9oZHItPmxlbiksIGhlYWRlcik7CiAKIAlpZiAobmV0d29ya19wYWNrZXQpIHsKQEAgLTg1MCwyNSArNzAxLDI4IEBACiAJLyogVW5tYXAgdHhfY21kICovCiAJaWYgKGNvdW50ZXIpCiAJCXBjaV91bm1hcF9zaW5nbGUoZGV2LAotCQkJCXBjaV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKLQkJCQlwY2lfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAorCQkJCWRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKKwkJCQlkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAogCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCiAJLyogdW5tYXAgY2h1bmtzIGlmIGFueSAqLwogCi0JZm9yIChpID0gMTsgaSA8IGNvdW50ZXI7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBjb3VudGVyOyBpKyspCiAJCXBjaV91bm1hcF9zaW5nbGUoZGV2LCBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5hZGRyKSwKIAkJCSBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5sZW4pLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJaWYgKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiWzBdKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2JbMF07Ci0JCQlpZiAodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2JbMF0pIHsKLQkJCQkvKiBDYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKi8KLQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCXR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiWzBdID0gTlVMTDsKLQkJCX0KKworCS8qIGZyZWUgU0tCICovCisJaWYgKHR4cS0+dHhiKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2I7CisKKwkJLyogY2FuIGJlIGNhbGxlZCBmcm9tIGlycXMtZGlzYWJsZWQgY29udGV4dCAqLworCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOwogCQl9CiAJfQotCXJldHVybiA7CiB9CiAKIC8qKgpAQCAtOTQ3LDggKzgwMSw3IEBACiAJCSAgICAgICB0eF9jbWQtPnN1cHBfcmF0ZXNbMV0sIHR4X2NtZC0+c3VwcF9yYXRlc1swXSk7CiB9CiAKLXN0YXRpYyB1OCBpd2wzOTQ1X3N5bmNfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwKLQkJCSAgIHUxNiB0eF9yYXRlLCB1OCBmbGFncykKK3N0YXRpYyB1OCBpd2wzOTQ1X3N5bmNfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwgdTE2IHR4X3JhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwogCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKQEAgLTk2MiwxMCArODE1LDkgQEAKIAlzdGF0aW9uLT5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9UWF9SQVRFX01TSzsKIAlzdGF0aW9uLT5zdGEucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYodHhfcmF0ZSk7CiAJc3RhdGlvbi0+c3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCisJaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhdGlvbi0+c3RhLCBDTURfQVNZTkMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAotCWl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YXRpb24tPnN0YSwgZmxhZ3MpOwogCUlXTF9ERUJVR19SQVRFKHByaXYsICJTQ0FMRSBzeW5jIHN0YXRpb24gJWQgdG8gcmF0ZSAlZFxuIiwKIAkJCXN0YV9pZCwgdHhfcmF0ZSk7CiAJcmV0dXJuIHN0YV9pZDsKQEAgLTk5Nyw3ICs4NDksNyBAQAogCiBzdGF0aWMgaW50IGl3bDM5NDVfcnhfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKIHsKLQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1JCRF9CQVNFKDApLCByeHEtPmRtYV9hZGRyKTsKKwlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1JCRF9CQVNFKDApLCByeHEtPmJkX2RtYSk7CiAJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9SUFRSX0FERFIoMCksIHJ4cS0+cmJfc3R0c19kbWEpOwogCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1JDU1JfV1BUUigwKSwgMCk7CiAJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9DT05GSUcoMCksCkBAIC0yNDczLDggKzIzMjUsNyBAQAogCiAJCWl3bDM5NDVfc3luY19zdGEocHJpdiwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAogCQkJCSAocHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSA/Ci0JCQkJIElXTF9SQVRFXzZNX1BMQ1AgOiBJV0xfUkFURV8xTV9QTENQLAotCQkJCSBDTURfQVNZTkMpOworCQkJCSBJV0xfUkFURV82TV9QTENQIDogSVdMX1JBVEVfMU1fUExDUCk7CiAJCWl3bDM5NDVfcmF0ZV9zY2FsZV9pbml0KHByaXYtPmh3LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOwogCiAJCXJldHVybiAwOwpAQCAtMjU5MCw2ICsyNDQxLDcgQEAKIAogCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIMzlfUlNDU1JfQ0hOTDBfV1BUUjsKIAlwcml2LT5od19wYXJhbXMubWF4X2JlYWNvbl9pdHJ2bCA9IElXTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUw7CisJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSVdMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LWh3LmgKaW5kZXggY2Q0YjYxYS4uOTE2Njc5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNDk2NS1ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTQ5NjUtaHcuaApAQCAtNzg3LDYgKzc4Nyw2IEBACiBzdHJ1Y3QgaXdsNDk2NV9zY2RfYmNfdGJsIHsKIAlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07CiAJdTggcGFkWzEwMjQgLSAoVEZEX1FVRVVFX0JDX1NJWkUpICogc2l6ZW9mKF9fbGUxNildOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZW5kaWYgLyogIV9faXdsXzQ5NjVfaHdfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LmMKaW5kZXggZDNhZmRkYS4uZDY1MzFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNDk2NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTQ5NjUuYwpAQCAtMzQ2LDkgKzM0NiwxOSBAQAogewogCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICYocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YSk7CiAKLQlpZiAoKGRhdGEtPnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRSkgJiYgaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikpIHsKKwlpZiAoKGRhdGEtPnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRSkgJiYKKwkgICAgIGl3bF9pc19hc3NvY2lhdGVkKHByaXYpKSB7CiAJCXN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7CiAKKwkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCisJCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOworCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKKwkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7CisJCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKKwkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOworCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7CisJCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7CisKIAkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAkJY21kLmhkci5vcF9jb2RlID0gSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRDsKIAkJY21kLmRpZmZfZ2Fpbl9hID0gMDsKQEAgLTQxOSwxMyArNDI5LDYgQEAKIAkJLyogTWFyayBzbyB3ZSBydW4gdGhpcyBhbGdvIG9ubHkgb25jZSEgKi8KIAkJZGF0YS0+c3RhdGUgPSBJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRDsKIAl9Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IDA7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYiA9IDA7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7Ci0JZGF0YS0+Y2hhaW5fc2lnbmFsX2EgPSAwOwotCWRhdGEtPmNoYWluX3NpZ25hbF9iID0gMDsKLQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7Ci0JZGF0YS0+YmVhY29uX2NvdW50ID0gMDsKIH0KIAogc3RhdGljIHZvaWQgaXdsNDk2NV9iZ190eHBvd2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNjY5LDYgKzY3Miw3IEBACiAJCXByaXYtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnNldF9jdF9raWxsKHByaXYpOwogCiAJcHJpdi0+aHdfcGFyYW1zLnNlbnMgPSAmaXdsNDk2NV9zZW5zaXRpdml0eTsKKwlwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMgPSBJV0xBR05fRVhUX0JFQUNPTl9USU1FX1BPUzsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ0MSw3ICsxNDQ1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgY2hhbm5lbCkKK3N0YXRpYyBpbnQgaXdsNDk2NV9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCiB7CiAJaW50IHJjOwogCXU4IGJhbmQgPSAwOwpAQCAtMTQ0OSwxMSArMTQ1NCwxNCBAQAogCXU4IGN0cmxfY2hhbl9oaWdoID0gMDsKIAlzdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3N3aXRjaF9jbWQgY21kOwogCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCisJdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOworCXUxNiBjaDsKKwl1MzIgdHNmX2xvdzsKKwl1OCBzd2l0Y2hfY291bnQ7CisJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KHByaXYtPnJ4b25fdGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHByaXYtPnZpZjsKIAliYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwogCi0JY2hfaW5mbyA9IGl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsIGNoYW5uZWwpOwotCiAJaXNfaHQ0MCA9IGlzX2h0NDBfY2hhbm5lbChwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MpOwogCiAJaWYgKGlzX2h0NDAgJiYKQEAgLTE0NjIsMjYgKzE0NzAsNTYgQEAKIAogCWNtZC5iYW5kID0gYmFuZDsKIAljbWQuZXhwZWN0X2JlYWNvbiA9IDA7Ci0JY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKKwljaCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjaF9zd2l0Y2gtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKIAljbWQucnhvbl9mbGFncyA9IHByaXYtPnN0YWdpbmdfcnhvbi5mbGFnczsKIAljbWQucnhvbl9maWx0ZXJfZmxhZ3MgPSBwcml2LT5zdGFnaW5nX3J4b24uZmlsdGVyX2ZsYWdzOwotCWNtZC5zd2l0Y2hfdGltZSA9IGNwdV90b19sZTMyKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lKTsKKwlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OworCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOworCS8qCisJICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCisJICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKKwkgKi8KKwlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7CisJCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLworCQkgICAgYmVhY29uX2ludGVydmFsKSkgeworCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCisJCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7CisJCX0gZWxzZQorCQkJc3dpdGNoX2NvdW50ID0gMDsKKwl9CisJaWYgKHN3aXRjaF9jb3VudCA8PSAxKQorCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7CisJZWxzZSB7CisJCXN3aXRjaF90aW1lX2luX3VzZWMgPQorCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOworCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF91c2Vjc190b19iZWFjb25zKHByaXYsCisJCQkJCQkJIHN3aXRjaF90aW1lX2luX3VzZWMsCisJCQkJCQkJIGJlYWNvbl9pbnRlcnZhbCk7CisJCWNtZC5zd2l0Y2hfdGltZSA9IGl3bF9hZGRfYmVhY29uX3RpbWUocHJpdiwKKwkJCQkJCSAgICAgIHByaXYtPnVjb2RlX2JlYWNvbl90aW1lLAorCQkJCQkJICAgICAgdWNvZGVfc3dpdGNoX3RpbWUsCisJCQkJCQkgICAgICBiZWFjb25faW50ZXJ2YWwpOworCX0KKwlJV0xfREVCVUdfMTFIKHByaXYsICJ1Q29kZSB0aW1lIGZvciB0aGUgc3dpdGNoIGlzIDB4JXhcbiIsCisJCSAgICAgIGNtZC5zd2l0Y2hfdGltZSk7CisJY2hfaW5mbyA9IGl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsIGNoKTsKIAlpZiAoY2hfaW5mbykKIAkJY21kLmV4cGVjdF9iZWFjb24gPSBpc19jaGFubmVsX3JhZGFyKGNoX2luZm8pOwogCWVsc2UgewogCQlJV0xfRVJSKHByaXYsICJpbnZhbGlkIGNoYW5uZWwgc3dpdGNoIGZyb20gJXUgdG8gJXVcbiIsCi0JCQlwcml2LT5hY3RpdmVfcnhvbi5jaGFubmVsLCBjaGFubmVsKTsKKwkJCXByaXYtPmFjdGl2ZV9yeG9uLmNoYW5uZWwsIGNoKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmMgPSBpd2w0OTY1X2ZpbGxfdHhwb3dlcl90YmwocHJpdiwgYmFuZCwgY2hhbm5lbCwgaXNfaHQ0MCwKKwlyYyA9IGl3bDQ5NjVfZmlsbF90eHBvd2VyX3RibChwcml2LCBiYW5kLCBjaCwgaXNfaHQ0MCwKIAkJCQkgICAgICBjdHJsX2NoYW5faGlnaCwgJmNtZC50eF9wb3dlcik7CiAJaWYgKHJjKSB7CiAJCUlXTF9ERUJVR18xMUgocHJpdiwgImVycm9yOiVkICBmaWxsIHR4cG93ZXJfdGJsXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7CisJcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwogCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7CiAKIAlyZXR1cm4gaXdsX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9DSEFOTkVMX1NXSVRDSCwgc2l6ZW9mKGNtZCksICZjbWQpOwpAQCAtMTU0Miw3ICsxNTgwLDggQEAKIAl1MzIgUjQ7CiAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSAmJgotCQkocHJpdi0+c3RhdGlzdGljcy5mbGFnICYgU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykpIHsKKwkgICAgKHByaXYtPl9hZ24uc3RhdGlzdGljcy5mbGFnICYKKwkJCVNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSB7CiAJCUlXTF9ERUJVR19URU1QKHByaXYsICJSdW5uaW5nIEhUNDAgdGVtcGVyYXR1cmUgY2FsaWJyYXRpb25cbiIpOwogCQlSMSA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IxWzFdKTsKIAkJUjIgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yMlsxXSk7CkBAIC0xNTY2LDggKzE2MDUsOCBAQAogCWlmICghdGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSkKIAkJdnQgPSBzaWduX2V4dGVuZChSNCwgMjMpOwogCWVsc2UKLQkJdnQgPSBzaWduX2V4dGVuZCgKLQkJCWxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3MuZ2VuZXJhbC50ZW1wZXJhdHVyZSksIDIzKTsKKwkJdnQgPSBzaWduX2V4dGVuZChsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3MuCisJCQkJIGdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlKSwgMjMpOwogCiAJSVdMX0RFQlVHX1RFTVAocHJpdiwgIkNhbGliIHZhbHVlcyBSWzEtM106ICVkICVkICVkIFI0OiAlZFxuIiwgUjEsIFIyLCBSMywgdnQpOwogCkBAIC0xNzQ3LDYgKzE3ODYsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IHJhX3RpZDsKKwlpbnQgcmV0OwogCiAJaWYgKChJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKIAkgICAgKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsgcHJpdi0+Y2ZnLT5udW1fb2ZfYW1wZHVfcXVldWVzCkBAIC0xNzYyLDcgKzE4MDIsOSBAQAogCXJhX3RpZCA9IEJVSUxEX1JBeFRJRChzdGFfaWQsIHRpZCk7CiAKIAkvKiBNb2RpZnkgZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSB0byBUeCB0aGlzIFRJRCAqLwotCWl3bF9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQocHJpdiwgc3RhX2lkLCB0aWQpOworCXJldCA9IGl3bF9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQocHJpdiwgc3RhX2lkLCB0aWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCkBAIC0xODcwLDcgKzE5MTIsNyBAQAogCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIFN0YXJ0SWR4PSVkIGlkeD0lZFxuIiwKIAkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCBhZ2ctPnN0YXJ0X2lkeCwgaWR4KTsKIAotCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2JbMF0pOworCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpOwogCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKIAkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7CiAJCWluZm8tPmZsYWdzIHw9IGl3bF90eF9zdGF0dXNfdG9fbWFjODAyMTEoc3RhdHVzKTsKQEAgLTIwMjYsNiArMjA2OCw3IEBACiAJaW50IHN0YV9pZDsKIAlpbnQgZnJlZWQ7CiAJdTggKnFjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKChpbmRleCA+PSB0eHEtPnEubl9iZCkgfHwgKGl3bF9xdWV1ZV91c2VkKCZ0eHEtPnEsIGluZGV4KSA9PSAwKSkgewogCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxX2lkICglZCkgaW5kZXggJWQgIgpAQCAtMjAzNSw3ICsyMDc4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiWzBdKTsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYik7CiAJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKIAogCWhkciA9IGl3bF90eF9xdWV1ZV9nZXRfaGRyKHByaXYsIHR4cV9pZCwgaW5kZXgpOwpAQCAtMjA1MCwxMCArMjA5MywxMCBAQAogCQlyZXR1cm47CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiAJaWYgKHR4cS0+c2NoZWRfcmV0cnkpIHsKIAkJY29uc3QgdTMyIHNjZF9zc24gPSBpd2w0OTY1X2dldF9zY2Rfc3NuKHR4X3Jlc3ApOwogCQlzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnID0gTlVMTDsKLQogCQlXQVJOX09OKCFxYyk7CiAKIAkJYWdnID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOwpAQCAtMjExMCw2ICsyMTUzLDggQEAKIAkJaXdsYWduX3R4cV9jaGVja19lbXB0eShwcml2LCBzdGFfaWQsIHRpZCwgdHhxX2lkKTsKIAogCWl3bF9jaGVja19hYm9ydF9zdGF0dXMocHJpdiwgdHhfcmVzcC0+ZnJhbWVfY291bnQsIHN0YXR1cyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IGl3bDQ5NjVfY2FsY19yc3NpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTIyMzUsMTEgKzIyODAsMTQgQEAKIAkJLnNldF9jdF9raWxsID0gaXdsNDk2NV9zZXRfY3RfdGhyZXNob2xkLAogCX0sCiAJLm1hbmFnZV9pYnNzX3N0YXRpb24gPSBpd2xhZ25fbWFuYWdlX2lic3Nfc3RhdGlvbiwKKwkudXBkYXRlX2JjYXN0X3N0YXRpb24gPSBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24sCiAJLmRlYnVnZnNfb3BzID0gewogCQkucnhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV9yeF9zdGF0c19yZWFkLAogCQkudHhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV90eF9zdGF0c19yZWFkLAogCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsX3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZCwKKwkJLmJ0X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfYnRfc3RhdHNfcmVhZCwKIAl9LAorCS5yZWNvdmVyX2Zyb21fdHhfc3RhbGwgPSBpd2xfYmdfbW9uaXRvcl9yZWNvdmVyLAogCS5jaGVja19wbGNwX2hlYWx0aCA9IGl3bF9nb29kX3BsY3BfaGVhbHRoLAogfTsKIApAQCAtMjI4NSw3ICsyMzMzLDcgQEAKIAkgKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgZm9yIHNjYW4gUlggb24gNSBHSHogYmFuZAogCSAqIGJlY2F1c2UgdGhlIGRldmljZSBoYXMgb2ZmLWNoYW5uZWwgcmVjZXB0aW9uIG9uIGNoYWluIEEuCiAJICovCi0JLnNjYW5fYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCisJLnNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCiB9OwogCiAvKiBNb2R1bGUgZmlybXdhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwppbmRleCBhMjhhZjdlLi44MDkzY2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCkBAIC0xNzksOCArMTc5LDggQEAKIAkJCXByaXYtPmNmZy0+bnVtX29mX3F1ZXVlcyAqCiAJCQlzaXplb2Yoc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsKTsKIAlwcml2LT5od19wYXJhbXMudGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF90ZmQpOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJV0w1MDAwX1NUQVRJT05fQ09VTlQ7Ci0JcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZCA9IElXTDUwMDBfQlJPQURDQVNUX0lEOworCXByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJV0xBR05fU1RBVElPTl9DT1VOVDsKKwlwcml2LT5od19wYXJhbXMuYmNhc3Rfc3RhX2lkID0gSVdMQUdOX0JST0FEQ0FTVF9JRDsKIAogCXByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSVdMQUdOX1JUQ19EQVRBX1NJWkU7CiAJcHJpdi0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUgPSBJV0xBR05fUlRDX0lOU1RfU0laRTsKQEAgLTIwOCw2ICsyMDgsOCBAQAogCQlCSVQoSVdMX0NBTElCX1RYX0lRX1BFUkQpCXwKIAkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwogCisJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSVdMQUdOX0VYVF9CRUFDT05fVElNRV9QT1M7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI0LDggKzIyNiw4IEBACiAJCQlwcml2LT5jZmctPm51bV9vZl9xdWV1ZXMgKgogCQkJc2l6ZW9mKHN0cnVjdCBpd2xhZ25fc2NkX2JjX3RibCk7CiAJcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKTsKLQlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMNTAwMF9TVEFUSU9OX0NPVU5UOwotCXByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQgPSBJV0w1MDAwX0JST0FEQ0FTVF9JRDsKKwlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMQUdOX1NUQVRJT05fQ09VTlQ7CisJcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlwcml2LT5od19wYXJhbXMubWF4X2RhdGFfc2l6ZSA9IElXTEFHTl9SVENfREFUQV9TSVpFOwogCXByaXYtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplID0gSVdMQUdOX1JUQ19JTlNUX1NJWkU7CkBAIC0yNDcsMTAgKzI0OSwxMyBAQAogCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCXByaXYtPmh3X3BhcmFtcy5zZW5zID0gJml3bDUxNTBfc2Vuc2l0aXZpdHk7CiAJcHJpdi0+aHdfcGFyYW1zLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9EQykJCXwKIAkJQklUKElXTF9DQUxJQl9MTykJCXwKIAkJQklUKElXTF9DQUxJQl9UWF9JUSkJCXwKIAkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOworCWlmIChwcml2LT5jZmctPm5lZWRfZGNfY2FsaWIpCisJCXByaXYtPmh3X3BhcmFtcy5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0RDKTsKKworCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElXTEFHTl9FWFRfQkVBQ09OX1RJTUVfUE9TOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjAsNDAgKzI2NSw3NiBAQAogCXUzMiB2dCA9IDA7CiAJczMyIG9mZnNldCA9ICBpd2xfdGVtcF9jYWxpYl90b19vZmZzZXQocHJpdik7CiAKLQl2dCA9IGxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3MuZ2VuZXJhbC50ZW1wZXJhdHVyZSk7CisJdnQgPSBsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpOwogCXZ0ID0gdnQgLyBJV0xfNTE1MF9WT0xUQUdFX1RPX1RFTVBFUkFUVVJFX0NPRUZGICsgb2Zmc2V0OwogCS8qIG5vdyB2dCBob2xkIHRoZSB0ZW1wZXJhdHVyZSBpbiBLZWx2aW4gKi8KIAlwcml2LT50ZW1wZXJhdHVyZSA9IEtFTFZJTl9UT19DRUxTSVVTKHZ0KTsKIAlpd2xfdHRfaGFuZGxlcihwcml2KTsKIH0KIAotc3RhdGljIGludCBpd2w1MDAwX2h3X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGNoYW5uZWwpCitzdGF0aWMgaW50IGl3bDUwMDBfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQogewogCXN0cnVjdCBpd2w1MDAwX2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7CiAJY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOworCXUxNiBjaDsKKwl1MzIgdHNmX2xvdzsKKwl1OCBzd2l0Y2hfY291bnQ7CisJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KHByaXYtPnJ4b25fdGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHByaXYtPnZpZjsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGhjbWQgPSB7CiAJCS5pZCA9IFJFUExZX0NIQU5ORUxfU1dJVENILAogCQkubGVuID0gc2l6ZW9mKGNtZCksCi0JCS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCisJCS5mbGFncyA9IENNRF9TWU5DLAogCQkuZGF0YSA9ICZjbWQsCiAJfTsKIAotCUlXTF9ERUJVR18xMUgocHJpdiwgImNoYW5uZWwgc3dpdGNoIGZyb20gJWQgdG8gJWRcbiIsCi0JCXByaXYtPmFjdGl2ZV9yeG9uLmNoYW5uZWwsIGNoYW5uZWwpOwogCWNtZC5iYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwotCWNtZC5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7CisJY2ggPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hfc3dpdGNoLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJSVdMX0RFQlVHXzExSChwcml2LCAiY2hhbm5lbCBzd2l0Y2ggZnJvbSAlZCB0byAlZFxuIiwKKwkJcHJpdi0+YWN0aXZlX3J4b24uY2hhbm5lbCwgY2gpOworCWNtZC5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOwogCWNtZC5yeG9uX2ZsYWdzID0gcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzOwogCWNtZC5yeG9uX2ZpbHRlcl9mbGFncyA9IHByaXYtPnN0YWdpbmdfcnhvbi5maWx0ZXJfZmxhZ3M7Ci0JY21kLnN3aXRjaF90aW1lID0gY3B1X3RvX2xlMzIocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUpOwotCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBwcml2LT5iYW5kLCBjaGFubmVsKTsKKwlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OworCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOworCS8qCisJICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCisJICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKKwkgKi8KKwlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7CisJCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLworCQkgICAgYmVhY29uX2ludGVydmFsKSkgeworCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCisJCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7CisJCX0gZWxzZQorCQkJc3dpdGNoX2NvdW50ID0gMDsKKwl9CisJaWYgKHN3aXRjaF9jb3VudCA8PSAxKQorCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7CisJZWxzZSB7CisJCXN3aXRjaF90aW1lX2luX3VzZWMgPQorCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOworCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF91c2Vjc190b19iZWFjb25zKHByaXYsCisJCQkJCQkJIHN3aXRjaF90aW1lX2luX3VzZWMsCisJCQkJCQkJIGJlYWNvbl9pbnRlcnZhbCk7CisJCWNtZC5zd2l0Y2hfdGltZSA9IGl3bF9hZGRfYmVhY29uX3RpbWUocHJpdiwKKwkJCQkJCSAgICAgIHByaXYtPnVjb2RlX2JlYWNvbl90aW1lLAorCQkJCQkJICAgICAgdWNvZGVfc3dpdGNoX3RpbWUsCisJCQkJCQkgICAgICBiZWFjb25faW50ZXJ2YWwpOworCX0KKwlJV0xfREVCVUdfMTFIKHByaXYsICJ1Q29kZSB0aW1lIGZvciB0aGUgc3dpdGNoIGlzIDB4JXhcbiIsCisJCSAgICAgIGNtZC5zd2l0Y2hfdGltZSk7CisJY2hfaW5mbyA9IGl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsIGNoKTsKIAlpZiAoY2hfaW5mbykKIAkJY21kLmV4cGVjdF9iZWFjb24gPSBpc19jaGFubmVsX3JhZGFyKGNoX2luZm8pOwogCWVsc2UgewogCQlJV0xfRVJSKHByaXYsICJpbnZhbGlkIGNoYW5uZWwgc3dpdGNoIGZyb20gJXUgdG8gJXVcbiIsCi0JCQlwcml2LT5hY3RpdmVfcnhvbi5jaGFubmVsLCBjaGFubmVsKTsKKwkJCXByaXYtPmFjdGl2ZV9yeG9uLmNoYW5uZWwsIGNoKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKKwlwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsID0gY21kLmNoYW5uZWw7CiAJcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAogCXJldHVybiBpd2xfc2VuZF9jbWRfc3luYyhwcml2LCAmaGNtZCk7CkBAIC0zNTIsMTQgKzM5MywxOCBAQAogCQkuc2V0X2N0X2tpbGwgPSBpd2w1MDAwX3NldF9jdF90aHJlc2hvbGQsCiAJIH0sCiAJLm1hbmFnZV9pYnNzX3N0YXRpb24gPSBpd2xhZ25fbWFuYWdlX2lic3Nfc3RhdGlvbiwKKwkudXBkYXRlX2JjYXN0X3N0YXRpb24gPSBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24sCiAJLmRlYnVnZnNfb3BzID0gewogCQkucnhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV9yeF9zdGF0c19yZWFkLAogCQkudHhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV90eF9zdGF0c19yZWFkLAogCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsX3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZCwKKwkJLmJ0X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfYnRfc3RhdHNfcmVhZCwKIAl9LAogCS5yZWNvdmVyX2Zyb21fdHhfc3RhbGwgPSBpd2xfYmdfbW9uaXRvcl9yZWNvdmVyLAogCS5jaGVja19wbGNwX2hlYWx0aCA9IGl3bF9nb29kX3BsY3BfaGVhbHRoLAogCS5jaGVja19hY2tfaGVhbHRoID0gaXdsX2dvb2RfYWNrX2hlYWx0aCwKKwkudHhmaWZvX2ZsdXNoID0gaXdsYWduX3R4Zmlmb19mbHVzaCwKKwkuZGV2X3R4Zmlmb19mbHVzaCA9IGl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoLAogfTsKIAogc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2w1MTUwX2xpYiA9IHsKQEAgLTQxNCw2ICs0NTksNyBAQAogCQkuc2V0X2N0X2tpbGwgPSBpd2w1MTUwX3NldF9jdF90aHJlc2hvbGQsCiAJIH0sCiAJLm1hbmFnZV9pYnNzX3N0YXRpb24gPSBpd2xhZ25fbWFuYWdlX2lic3Nfc3RhdGlvbiwKKwkudXBkYXRlX2JjYXN0X3N0YXRpb24gPSBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24sCiAJLmRlYnVnZnNfb3BzID0gewogCQkucnhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV9yeF9zdGF0c19yZWFkLAogCQkudHhfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV90eF9zdGF0c19yZWFkLApAQCAtNDIyLDYgKzQ2OCw4IEBACiAJLnJlY292ZXJfZnJvbV90eF9zdGFsbCA9IGl3bF9iZ19tb25pdG9yX3JlY292ZXIsCiAJLmNoZWNrX3BsY3BfaGVhbHRoID0gaXdsX2dvb2RfcGxjcF9oZWFsdGgsCiAJLmNoZWNrX2Fja19oZWFsdGggPSBpd2xfZ29vZF9hY2tfaGVhbHRoLAorCS50eGZpZm9fZmx1c2ggPSBpd2xhZ25fdHhmaWZvX2ZsdXNoLAorCS5kZXZfdHhmaWZvX2ZsdXNoID0gaXdsYWduX2Rldl90eGZpZm9fZmx1c2gsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsNTAwMF9vcHMgPSB7CkBAIC02MjAsNiArNjY4LDcgQEAKIAkudWNvZGVfdHJhY2luZyA9IHRydWUsCiAJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCiAJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAogfTsKIAogc3RydWN0IGl3bF9jZmcgaXdsNTE1MF9hYmdfY2ZnID0gewpAQCAtNjQ5LDYgKzY5OCw3IEBACiAJLnVjb2RlX3RyYWNpbmcgPSB0cnVlLAogCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAogCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKIH07CiAKIE1PRFVMRV9GSVJNV0FSRShJV0w1MDAwX01PRFVMRV9GSVJNV0FSRShJV0w1MDAwX1VDT0RFX0FQSV9NQVgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwppbmRleCA5ZmJmNTRjLi41ODI3MDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCkBAIC03MSw2ICs3MSwxMCBAQAogI2RlZmluZSBfSVdMNjAwMEcyQV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDAwRzJBX0ZXX1BSRSAjYXBpICIudWNvZGUiCiAjZGVmaW5lIElXTDYwMDBHMkFfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lXTDYwMDBHMkFfTU9EVUxFX0ZJUk1XQVJFKGFwaSkKIAorI2RlZmluZSBJV0w2MDAwRzJCX0ZXX1BSRSAiaXdsd2lmaS02MDAwZzJiLSIKKyNkZWZpbmUgX0lXTDYwMDBHMkJfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAwMEcyQl9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w2MDAwRzJCX01PRFVMRV9GSVJNV0FSRShhcGkpIF9JV0w2MDAwRzJCX01PRFVMRV9GSVJNV0FSRShhcGkpCisKIAogc3RhdGljIHZvaWQgaXdsNjAwMF9zZXRfY3RfdGhyZXNob2xkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKQEAgLTgwLDkgKzg0LDEwIEBACiB9CiAKIC8qIEluZGljYXRlIGNhbGlicmF0aW9uIHZlcnNpb24gdG8gdUNvZGUuICovCi1zdGF0aWMgdm9pZCBpd2w2MDUwX3NldF9jYWxpYl92ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGl3bDYwMDBfc2V0X2NhbGliX3ZlcnNpb24oc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLmNhbGliX3ZlcnNpb24ocHJpdikgPj0gNikKKwlpZiAocHJpdi0+Y2ZnLT5uZWVkX2RjX2NhbGliICYmCisJICAgIChwcml2LT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLmNhbGliX3ZlcnNpb24ocHJpdikgPj0gNikpCiAJCWl3bF9zZXRfYml0KHByaXYsIENTUl9HUF9EUklWRVJfUkVHLAogCQkJCUNTUl9HUF9EUklWRVJfUkVHX0JJVF9DQUxJQl9WRVJTSU9ONik7CiB9CkBAIC0xNTUsOCArMTYwLDggQEAKIAkJCXByaXYtPmNmZy0+bnVtX29mX3F1ZXVlcyAqCiAJCQlzaXplb2Yoc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsKTsKIAlwcml2LT5od19wYXJhbXMudGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF90ZmQpOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJV0w1MDAwX1NUQVRJT05fQ09VTlQ7Ci0JcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZCA9IElXTDUwMDBfQlJPQURDQVNUX0lEOworCXByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJV0xBR05fU1RBVElPTl9DT1VOVDsKKwlwcml2LT5od19wYXJhbXMuYmNhc3Rfc3RhX2lkID0gSVdMQUdOX0JST0FEQ0FTVF9JRDsKIAogCXByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSVdMNjBfUlRDX0RBVEFfU0laRTsKIAlwcml2LT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSA9IElXTDYwX1JUQ19JTlNUX1NJWkU7CkBAIC0xODIsODMgKzE4Nyw3NyBAQAogCQlCSVQoSVdMX0NBTElCX0xPKQkJfAogCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAogCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7CisJaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKKwkJcHJpdi0+aHdfcGFyYW1zLmNhbGliX2luaXRfY2ZnIHw9IEJJVChJV0xfQ0FMSUJfREMpOworCisJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSVdMQUdOX0VYVF9CRUFDT05fVElNRV9QT1M7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpd2w2MDUwX2h3X3NldF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPj0gSVdMX01JTl9OVU1fUVVFVUVTICYmCi0JICAgIHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA8PSBJV0xBR05fTlVNX1FVRVVFUykKLQkJcHJpdi0+Y2ZnLT5udW1fb2ZfcXVldWVzID0KLQkJCXByaXYtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKLQotCXByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bSA9IHByaXYtPmNmZy0+bnVtX29mX3F1ZXVlczsKLQlwcml2LT5od19wYXJhbXMuZG1hX2NobmxfbnVtID0gRkg1MF9UQ1NSX0NITkxfTlVNOwotCXByaXYtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplID0KLQkJCXByaXYtPmNmZy0+bnVtX29mX3F1ZXVlcyAqCi0JCQlzaXplb2Yoc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsKTsKLQlwcml2LT5od19wYXJhbXMudGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF90ZmQpOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJV0w1MDAwX1NUQVRJT05fQ09VTlQ7Ci0JcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZCA9IElXTDUwMDBfQlJPQURDQVNUX0lEOwotCi0JcHJpdi0+aHdfcGFyYW1zLm1heF9kYXRhX3NpemUgPSBJV0w2MF9SVENfREFUQV9TSVpFOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplID0gSVdMNjBfUlRDX0lOU1RfU0laRTsKLQotCXByaXYtPmh3X3BhcmFtcy5tYXhfYnNtX3NpemUgPSAwOwotCXByaXYtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgPSAgQklUKElFRUU4MDIxMV9CQU5EXzJHSFopIHwKLQkJCQkJQklUKElFRUU4MDIxMV9CQU5EXzVHSFopOwotCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIX1JTQ1NSX0NITkwwX1dQVFI7Ci0KLQlwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQpOwotCXByaXYtPmh3X3BhcmFtcy5yeF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3J4X2FudCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCA9IHByaXYtPmNmZy0+dmFsaWRfdHhfYW50OwotCXByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3J4X2FudDsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy5zZXRfY3Rfa2lsbCkKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dGVtcF9vcHMuc2V0X2N0X2tpbGwocHJpdik7Ci0KLQkvKiBTZXQgaW5pdGlhbCBzZW5zaXRpdml0eSBwYXJhbWV0ZXJzICovCi0JLyogU2V0IGluaXRpYWwgY2FsaWJyYXRpb24gc2V0ICovCi0JcHJpdi0+aHdfcGFyYW1zLnNlbnMgPSAmaXdsNjAwMF9zZW5zaXRpdml0eTsKLQlwcml2LT5od19wYXJhbXMuY2FsaWJfaW5pdF9jZmcgPQotCQlCSVQoSVdMX0NBTElCX1hUQUwpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfREMpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfTE8pCQl8Ci0JCUJJVChJV0xfQ0FMSUJfVFhfSVEpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfQkFTRV9CQU5EKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bDYwMDBfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgY2hhbm5lbCkKK3N0YXRpYyBpbnQgaXdsNjAwMF9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCiB7CiAJc3RydWN0IGl3bDYwMDBfY2hhbm5lbF9zd2l0Y2hfY21kIGNtZDsKIAljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwl1MzIgc3dpdGNoX3RpbWVfaW5fdXNlYywgdWNvZGVfc3dpdGNoX3RpbWU7CisJdTE2IGNoOworCXUzMiB0c2ZfbG93OworCXU4IHN3aXRjaF9jb3VudDsKKwl1MTYgYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUocHJpdi0+cnhvbl90aW1pbmcuYmVhY29uX2ludGVydmFsKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gcHJpdi0+dmlmOwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsCiAJCS5sZW4gPSBzaXplb2YoY21kKSwKLQkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKKwkJLmZsYWdzID0gQ01EX1NZTkMsCiAJCS5kYXRhID0gJmNtZCwKIAl9OwogCi0JSVdMX0RFQlVHXzExSChwcml2LCAiY2hhbm5lbCBzd2l0Y2ggZnJvbSAlZCB0byAlZFxuIiwKLQkJcHJpdi0+YWN0aXZlX3J4b24uY2hhbm5lbCwgY2hhbm5lbCk7Ci0KIAljbWQuYmFuZCA9IHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoYW5uZWwpOworCWNoID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoX3N3aXRjaC0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCUlXTF9ERUJVR18xMUgocHJpdiwgImNoYW5uZWwgc3dpdGNoIGZyb20gJXUgdG8gJXVcbiIsCisJCSAgICAgIHByaXYtPmFjdGl2ZV9yeG9uLmNoYW5uZWwsIGNoKTsKKwljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKIAljbWQucnhvbl9mbGFncyA9IHByaXYtPnN0YWdpbmdfcnhvbi5mbGFnczsKIAljbWQucnhvbl9maWx0ZXJfZmxhZ3MgPSBwcml2LT5zdGFnaW5nX3J4b24uZmlsdGVyX2ZsYWdzOwotCWNtZC5zd2l0Y2hfdGltZSA9IGNwdV90b19sZTMyKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lKTsKLQljaF9pbmZvID0gaXdsX2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2hhbm5lbCk7CisJc3dpdGNoX2NvdW50ID0gY2hfc3dpdGNoLT5jb3VudDsKKwl0c2ZfbG93ID0gY2hfc3dpdGNoLT50aW1lc3RhbXAgJiAweDBmZmZmZmZmZjsKKwkvKgorCSAqIGNhbGN1bGF0ZSB0aGUgdWNvZGUgY2hhbm5lbCBzd2l0Y2ggdGltZQorCSAqIGFkZGluZyBUU0YgYXMgb25lIG9mIHRoZSBmYWN0b3IgZm9yIHdoZW4gdG8gc3dpdGNoCisJICovCisJaWYgKChwcml2LT51Y29kZV9iZWFjb25fdGltZSA+IHRzZl9sb3cpICYmIGJlYWNvbl9pbnRlcnZhbCkgeworCQlpZiAoc3dpdGNoX2NvdW50ID4gKChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtIHRzZl9sb3cpIC8KKwkJICAgIGJlYWNvbl9pbnRlcnZhbCkpIHsKKwkJCXN3aXRjaF9jb3VudCAtPSAocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgLQorCQkJCXRzZl9sb3cpIC8gYmVhY29uX2ludGVydmFsOworCQl9IGVsc2UKKwkJCXN3aXRjaF9jb3VudCA9IDA7CisJfQorCWlmIChzd2l0Y2hfY291bnQgPD0gMSkKKwkJY21kLnN3aXRjaF90aW1lID0gY3B1X3RvX2xlMzIocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUpOworCWVsc2UgeworCQlzd2l0Y2hfdGltZV9pbl91c2VjID0KKwkJCXZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCAqIHN3aXRjaF9jb3VudCAqIFRJTUVfVU5JVDsKKwkJdWNvZGVfc3dpdGNoX3RpbWUgPSBpd2xfdXNlY3NfdG9fYmVhY29ucyhwcml2LAorCQkJCQkJCSBzd2l0Y2hfdGltZV9pbl91c2VjLAorCQkJCQkJCSBiZWFjb25faW50ZXJ2YWwpOworCQljbWQuc3dpdGNoX3RpbWUgPSBpd2xfYWRkX2JlYWNvbl90aW1lKHByaXYsCisJCQkJCQkgICAgICBwcml2LT51Y29kZV9iZWFjb25fdGltZSwKKwkJCQkJCSAgICAgIHVjb2RlX3N3aXRjaF90aW1lLAorCQkJCQkJICAgICAgYmVhY29uX2ludGVydmFsKTsKKwl9CisJSVdMX0RFQlVHXzExSChwcml2LCAidUNvZGUgdGltZSBmb3IgdGhlIHN3aXRjaCBpcyAweCV4XG4iLAorCQkgICAgICBjbWQuc3dpdGNoX3RpbWUpOworCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBwcml2LT5iYW5kLCBjaCk7CiAJaWYgKGNoX2luZm8pCiAJCWNtZC5leHBlY3RfYmVhY29uID0gaXNfY2hhbm5lbF9yYWRhcihjaF9pbmZvKTsKIAllbHNlIHsKIAkJSVdMX0VSUihwcml2LCAiaW52YWxpZCBjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAotCQkJcHJpdi0+YWN0aXZlX3J4b24uY2hhbm5lbCwgY2hhbm5lbCk7CisJCQlwcml2LT5hY3RpdmVfcnhvbi5jaGFubmVsLCBjaCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7CisJcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwogCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7CiAKIAlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwpAQCAtMzE2LDE2ICszMTUsMjEgQEAKIAkudGVtcF9vcHMgPSB7CiAJCS50ZW1wZXJhdHVyZSA9IGl3bGFnbl90ZW1wZXJhdHVyZSwKIAkJLnNldF9jdF9raWxsID0gaXdsNjAwMF9zZXRfY3RfdGhyZXNob2xkLAorCQkuc2V0X2NhbGliX3ZlcnNpb24gPSBpd2w2MDAwX3NldF9jYWxpYl92ZXJzaW9uLAogCSB9LAogCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaXdsYWduX21hbmFnZV9pYnNzX3N0YXRpb24sCisJLnVwZGF0ZV9iY2FzdF9zdGF0aW9uID0gaXdsX3VwZGF0ZV9iY2FzdF9zdGF0aW9uLAogCS5kZWJ1Z2ZzX29wcyA9IHsKIAkJLnJ4X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfcnhfc3RhdHNfcmVhZCwKIAkJLnR4X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfdHhfc3RhdHNfcmVhZCwKIAkJLmdlbmVyYWxfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCisJCS5idF9zdGF0c19yZWFkID0gaXdsX3Vjb2RlX2J0X3N0YXRzX3JlYWQsCiAJfSwKIAkucmVjb3Zlcl9mcm9tX3R4X3N0YWxsID0gaXdsX2JnX21vbml0b3JfcmVjb3ZlciwKIAkuY2hlY2tfcGxjcF9oZWFsdGggPSBpd2xfZ29vZF9wbGNwX2hlYWx0aCwKIAkuY2hlY2tfYWNrX2hlYWx0aCA9IGl3bF9nb29kX2Fja19oZWFsdGgsCisJLnR4Zmlmb19mbHVzaCA9IGl3bGFnbl90eGZpZm9fZmx1c2gsCisJLmRldl90eGZpZm9fZmx1c2ggPSBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX29wcyBpd2w2MDAwX29wcyA9IHsKQEAgLTMzNSw3OSArMzM5LDI1IEBACiAJLmxlZCA9ICZpd2xhZ25fbGVkX29wcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsNjA1MF9saWIgPSB7Ci0JLnNldF9od19wYXJhbXMgPSBpd2w2MDUwX2h3X3NldF9od19wYXJhbXMsCi0JLnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsID0gaXdsYWduX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsLAotCS50eHFfaW52YWxfYnl0ZV9jbnRfdGJsID0gaXdsYWduX3R4cV9pbnZhbF9ieXRlX2NudF90YmwsCi0JLnR4cV9zZXRfc2NoZWQgPSBpd2xhZ25fdHhxX3NldF9zY2hlZCwKLQkudHhxX2FnZ19lbmFibGUgPSBpd2xhZ25fdHhxX2FnZ19lbmFibGUsCi0JLnR4cV9hZ2dfZGlzYWJsZSA9IGl3bGFnbl90eHFfYWdnX2Rpc2FibGUsCi0JLnR4cV9hdHRhY2hfYnVmX3RvX3RmZCA9IGl3bF9od190eHFfYXR0YWNoX2J1Zl90b190ZmQsCi0JLnR4cV9mcmVlX3RmZCA9IGl3bF9od190eHFfZnJlZV90ZmQsCi0JLnR4cV9pbml0ID0gaXdsX2h3X3R4X3F1ZXVlX2luaXQsCi0JLnJ4X2hhbmRsZXJfc2V0dXAgPSBpd2xhZ25fcnhfaGFuZGxlcl9zZXR1cCwKLQkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bGFnbl9zZXR1cF9kZWZlcnJlZF93b3JrLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCi0JLmxvYWRfdWNvZGUgPSBpd2xhZ25fbG9hZF91Y29kZSwKLQkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsX2R1bXBfbmljX2V2ZW50X2xvZywKLQkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsX2R1bXBfbmljX2Vycm9yX2xvZywKLQkuZHVtcF9jc3IgPSBpd2xfZHVtcF9jc3IsCi0JLmR1bXBfZmggPSBpd2xfZHVtcF9maCwKLQkuaW5pdF9hbGl2ZV9zdGFydCA9IGl3bGFnbl9pbml0X2FsaXZlX3N0YXJ0LAotCS5hbGl2ZV9ub3RpZnkgPSBpd2xhZ25fYWxpdmVfbm90aWZ5LAotCS5zZW5kX3R4X3Bvd2VyID0gaXdsYWduX3NlbmRfdHhfcG93ZXIsCi0JLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bF91cGRhdGVfY2hhaW5fZmxhZ3MsCi0JLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDYwMDBfaHdfY2hhbm5lbF9zd2l0Y2gsCi0JLmFwbV9vcHMgPSB7Ci0JCS5pbml0ID0gaXdsX2FwbV9pbml0LAotCQkuc3RvcCA9IGl3bF9hcG1fc3RvcCwKLQkJLmNvbmZpZyA9IGl3bDYwMDBfbmljX2NvbmZpZywKLQkJLnNldF9wd3Jfc3JjID0gaXdsX3NldF9wd3Jfc3JjLAotCX0sCi0JLmVlcHJvbV9vcHMgPSB7Ci0JCS5yZWd1bGF0b3J5X2JhbmRzID0gewotCQkJRUVQUk9NX1JFR19CQU5EXzFfQ0hBTk5FTFMsCi0JCQlFRVBST01fUkVHX0JBTkRfMl9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdfQkFORF8zX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR19CQU5EXzRfQ0hBTk5FTFMsCi0JCQlFRVBST01fUkVHX0JBTkRfNV9DSEFOTkVMUywKLQkJCUVFUFJPTV82MDAwX1JFR19CQU5EXzI0X0hUNDBfQ0hBTk5FTFMsCi0JCQlFRVBST01fUkVHX0JBTkRfNTJfSFQ0MF9DSEFOTkVMUwotCQl9LAotCQkudmVyaWZ5X3NpZ25hdHVyZSAgPSBpd2xjb3JlX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlLAotCQkuYWNxdWlyZV9zZW1hcGhvcmUgPSBpd2xjb3JlX2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZSwKLQkJLnJlbGVhc2Vfc2VtYXBob3JlID0gaXdsY29yZV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUsCi0JCS5jYWxpYl92ZXJzaW9uCT0gaXdsYWduX2VlcHJvbV9jYWxpYl92ZXJzaW9uLAotCQkucXVlcnlfYWRkciA9IGl3bGFnbl9lZXByb21fcXVlcnlfYWRkciwKLQkJLnVwZGF0ZV9lbmhhbmNlZF90eHBvd2VyID0gaXdsY29yZV9lZXByb21fZW5oYW5jZWRfdHhwb3dlciwKLQl9LAotCS5wb3N0X2Fzc29jaWF0ZSA9IGl3bF9wb3N0X2Fzc29jaWF0ZSwKLQkuaXNyID0gaXdsX2lzcl9pY3QsCi0JLmNvbmZpZ19hcCA9IGl3bF9jb25maWdfYXAsCi0JLnRlbXBfb3BzID0gewotCQkudGVtcGVyYXR1cmUgPSBpd2xhZ25fdGVtcGVyYXR1cmUsCi0JCS5zZXRfY3Rfa2lsbCA9IGl3bDYwMDBfc2V0X2N0X3RocmVzaG9sZCwKLQkJLnNldF9jYWxpYl92ZXJzaW9uID0gaXdsNjA1MF9zZXRfY2FsaWJfdmVyc2lvbiwKLQkgfSwKLQkubWFuYWdlX2lic3Nfc3RhdGlvbiA9IGl3bGFnbl9tYW5hZ2VfaWJzc19zdGF0aW9uLAotCS5kZWJ1Z2ZzX29wcyA9IHsKLQkJLnJ4X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfcnhfc3RhdHNfcmVhZCwKLQkJLnR4X3N0YXRzX3JlYWQgPSBpd2xfdWNvZGVfdHhfc3RhdHNfcmVhZCwKLQkJLmdlbmVyYWxfc3RhdHNfcmVhZCA9IGl3bF91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCi0JfSwKLQkucmVjb3Zlcl9mcm9tX3R4X3N0YWxsID0gaXdsX2JnX21vbml0b3JfcmVjb3ZlciwKLQkuY2hlY2tfcGxjcF9oZWFsdGggPSBpd2xfZ29vZF9wbGNwX2hlYWx0aCwKLQkuY2hlY2tfYWNrX2hlYWx0aCA9IGl3bF9nb29kX2Fja19oZWFsdGgsCitzdGF0aWMgdm9pZCBkb19ub3Rfc2VuZF9idF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworfQorCitzdGF0aWMgc3RydWN0IGl3bF9oY21kX29wcyBpd2w2MDAwZzJiX2hjbWQgPSB7CisJLnJ4b25fYXNzb2MgPSBpd2xhZ25fc2VuZF9yeG9uX2Fzc29jLAorCS5jb21taXRfcnhvbiA9IGl3bF9jb21taXRfcnhvbiwKKwkuc2V0X3J4b25fY2hhaW4gPSBpd2xfc2V0X3J4b25fY2hhaW4sCisJLnNldF90eF9hbnQgPSBpd2xhZ25fc2VuZF90eF9hbnRfY29uZmlnLAorCS5zZW5kX2J0X2NvbmZpZyA9IGRvX25vdF9zZW5kX2J0X2NvbmZpZywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX29wcyBpd2w2MDUwX29wcyA9IHsKLQkubGliID0gJml3bDYwNTBfbGliLAotCS5oY21kID0gJml3bGFnbl9oY21kLAorc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDYwMDBnMmJfb3BzID0geworCS5saWIgPSAmaXdsNjAwMF9saWIsCisJLmhjbWQgPSAmaXdsNjAwMGcyYl9oY21kLAogCS51dGlscyA9ICZpd2xhZ25faGNtZF91dGlscywKIAkubGVkID0gJml3bGFnbl9sZWRfb3BzLAogfTsKIAotCiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJhXzJhZ25fY2ZnID0gewogCS5uYW1lID0gIjYwMDAgU2VyaWVzIDJ4MiBBR04gR2VuMmEiLAogCS5md19uYW1lX3ByZSA9IElXTDYwMDBHMkFfRldfUFJFLApAQCAtNDQzLDYgKzM5MywyOTkgQEAKIAkudWNvZGVfdHJhY2luZyA9IHRydWUsCiAJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCiAJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAorfTsKKworc3RydWN0IGl3bF9jZmcgaXdsNjAwMGcyYV8yYWJnX2NmZyA9IHsKKwkubmFtZSA9ICI2MDAwIFNlcmllcyAyeDIgQUJHIEdlbjJhIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w2MDAwRzJBX0ZXX1BSRSwKKwkudWNvZGVfYXBpX21heCA9IElXTDYwMDBHMl9VQ09ERV9BUElfTUFYLAorCS51Y29kZV9hcGlfbWluID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NSU4sCisJLnNrdSA9IElXTF9TS1VfQXxJV0xfU0tVX0csCisJLm9wcyA9ICZpd2w2MDAwX29wcywKKwkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNjAwMEcyX0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDBHMl9UWF9QT1dFUl9WRVJTSU9OLAorCS5udW1fb2ZfcXVldWVzID0gSVdMQUdOX05VTV9RVUVVRVMsCisJLm51bV9vZl9hbXBkdV9xdWV1ZXMgPSBJV0xBR05fTlVNX0FNUERVX1FVRVVFUywKKwkubW9kX3BhcmFtcyA9ICZpd2xhZ25fbW9kX3BhcmFtcywKKwkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAorCS52YWxpZF9yeF9hbnQgPSBBTlRfQUIsCisJLnBsbF9jZmdfdmFsID0gMCwKKwkuc2V0X2wwcyA9IHRydWUsCisJLnVzZV9ic20gPSBmYWxzZSwKKwkucGFfdHlwZSA9IElXTF9QQV9TWVNURU0sCisJLm1heF9sbF9pdGVtcyA9IE9UUF9NQVhfTExfSVRFTVNfNngwMCwKKwkuc2hhZG93X3JhbV9zdXBwb3J0ID0gdHJ1ZSwKKwkubGVkX2NvbXBlbnNhdGlvbiA9IDUxLAorCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElXTF9DQUxfTlVNX0JFQUNPTlMsCisJLnN1cHBvcnRzX2lkbGUgPSB0cnVlLAorCS5hZHZfdGhlcm1hbF90aHJvdHRsZSA9IHRydWUsCisJLnN1cHBvcnRfY3Rfa2lsbF9leGl0ID0gdHJ1ZSwKKwkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCisJLmNoYWluX25vaXNlX3NjYWxlID0gMTAwMCwKKwkubW9uaXRvcl9yZWNvdmVyX3BlcmlvZCA9IElXTF9NT05JVE9SSU5HX1BFUklPRCwKKwkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAorCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKK307CisKK3N0cnVjdCBpd2xfY2ZnIGl3bDYwMDBnMmFfMmJnX2NmZyA9IHsKKwkubmFtZSA9ICI2MDAwIFNlcmllcyAyeDIgQkcgR2VuMmEiLAorCS5md19uYW1lX3ByZSA9IElXTDYwMDBHMkFfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDAwRzJfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSVdMX1NLVV9HLAorCS5vcHMgPSAmaXdsNjAwMF9vcHMsCisJLmVlcHJvbV9zaXplID0gT1RQX0xPV19JTUFHRV9TSVpFLAorCS5lZXByb21fdmVyID0gRUVQUk9NXzYwMDBHMl9FRVBST01fVkVSU0lPTiwKKwkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDAwRzJfVFhfUE9XRVJfVkVSU0lPTiwKKwkubnVtX29mX3F1ZXVlcyA9IElXTEFHTl9OVU1fUVVFVUVTLAorCS5udW1fb2ZfYW1wZHVfcXVldWVzID0gSVdMQUdOX05VTV9BTVBEVV9RVUVVRVMsCisJLm1vZF9wYXJhbXMgPSAmaXdsYWduX21vZF9wYXJhbXMsCisJLnZhbGlkX3R4X2FudCA9IEFOVF9BQiwKKwkudmFsaWRfcnhfYW50ID0gQU5UX0FCLAorCS5wbGxfY2ZnX3ZhbCA9IDAsCisJLnNldF9sMHMgPSB0cnVlLAorCS51c2VfYnNtID0gZmFsc2UsCisJLnBhX3R5cGUgPSBJV0xfUEFfU1lTVEVNLAorCS5tYXhfbGxfaXRlbXMgPSBPVFBfTUFYX0xMX0lURU1TXzZ4MDAsCisJLnNoYWRvd19yYW1fc3VwcG9ydCA9IHRydWUsCisJLmxlZF9jb21wZW5zYXRpb24gPSA1MSwKKwkuY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMgPSBJV0xfQ0FMX05VTV9CRUFDT05TLAorCS5zdXBwb3J0c19pZGxlID0gdHJ1ZSwKKwkuYWR2X3RoZXJtYWxfdGhyb3R0bGUgPSB0cnVlLAorCS5zdXBwb3J0X2N0X2tpbGxfZXhpdCA9IHRydWUsCisJLnBsY3BfZGVsdGFfdGhyZXNob2xkID0gSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfREVGLAorCS5jaGFpbl9ub2lzZV9zY2FsZSA9IDEwMDAsCisJLm1vbml0b3JfcmVjb3Zlcl9wZXJpb2QgPSBJV0xfTU9OSVRPUklOR19QRVJJT0QsCisJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKKwkuc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyID0gdHJ1ZSwKKwkuY2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyID0gdHJ1ZSwKKwkubmVlZF9kY19jYWxpYiA9IHRydWUsCit9OworCitzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiXzJhZ25fY2ZnID0geworCS5uYW1lID0gIjYwMDAgU2VyaWVzIDJ4MiBBR04gR2VuMmIiLAorCS5md19uYW1lX3ByZSA9IElXTDYwMDBHMkJfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDAwRzJfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSVdMX1NLVV9BfElXTF9TS1VfR3xJV0xfU0tVX04sCisJLm9wcyA9ICZpd2w2MDAwZzJiX29wcywKKwkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNjAwMEcyX0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDBHMl9UWF9QT1dFUl9WRVJTSU9OLAorCS5udW1fb2ZfcXVldWVzID0gSVdMQUdOX05VTV9RVUVVRVMsCisJLm51bV9vZl9hbXBkdV9xdWV1ZXMgPSBJV0xBR05fTlVNX0FNUERVX1FVRVVFUywKKwkubW9kX3BhcmFtcyA9ICZpd2xhZ25fbW9kX3BhcmFtcywKKwkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAorCS52YWxpZF9yeF9hbnQgPSBBTlRfQUIsCisJLnBsbF9jZmdfdmFsID0gMCwKKwkuc2V0X2wwcyA9IHRydWUsCisJLnVzZV9ic20gPSBmYWxzZSwKKwkucGFfdHlwZSA9IElXTF9QQV9TWVNURU0sCisJLm1heF9sbF9pdGVtcyA9IE9UUF9NQVhfTExfSVRFTVNfNngwMCwKKwkuc2hhZG93X3JhbV9zdXBwb3J0ID0gdHJ1ZSwKKwkuaHRfZ3JlZW5maWVsZF9zdXBwb3J0ID0gdHJ1ZSwKKwkubGVkX2NvbXBlbnNhdGlvbiA9IDUxLAorCS51c2VfcnRzX2Zvcl9odCA9IHRydWUsIC8qIHVzZSBydHMvY3RzIHByb3RlY3Rpb24gKi8KKwkuY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMgPSBJV0xfQ0FMX05VTV9CRUFDT05TLAorCS5zdXBwb3J0c19pZGxlID0gdHJ1ZSwKKwkuYWR2X3RoZXJtYWxfdGhyb3R0bGUgPSB0cnVlLAorCS5zdXBwb3J0X2N0X2tpbGxfZXhpdCA9IHRydWUsCisJLnBsY3BfZGVsdGFfdGhyZXNob2xkID0gSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfREVGLAorCS5jaGFpbl9ub2lzZV9zY2FsZSA9IDEwMDAsCisJLm1vbml0b3JfcmVjb3Zlcl9wZXJpb2QgPSBJV0xfTU9OSVRPUklOR19QRVJJT0QsCisJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKKwkuc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyID0gdHJ1ZSwKKwkuY2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyID0gdHJ1ZSwKKwkubmVlZF9kY19jYWxpYiA9IHRydWUsCisJLmJ0X3N0YXRpc3RpY3MgPSB0cnVlLAorfTsKKworc3RydWN0IGl3bF9jZmcgaXdsNjAwMGcyYl8yYWJnX2NmZyA9IHsKKwkubmFtZSA9ICI2MDAwIFNlcmllcyAyeDIgQUJHIEdlbjJiIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w2MDAwRzJCX0ZXX1BSRSwKKwkudWNvZGVfYXBpX21heCA9IElXTDYwMDBHMl9VQ09ERV9BUElfTUFYLAorCS51Y29kZV9hcGlfbWluID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NSU4sCisJLnNrdSA9IElXTF9TS1VfQXxJV0xfU0tVX0csCisJLm9wcyA9ICZpd2w2MDAwZzJiX29wcywKKwkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNjAwMEcyX0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDBHMl9UWF9QT1dFUl9WRVJTSU9OLAorCS5udW1fb2ZfcXVldWVzID0gSVdMQUdOX05VTV9RVUVVRVMsCisJLm51bV9vZl9hbXBkdV9xdWV1ZXMgPSBJV0xBR05fTlVNX0FNUERVX1FVRVVFUywKKwkubW9kX3BhcmFtcyA9ICZpd2xhZ25fbW9kX3BhcmFtcywKKwkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAorCS52YWxpZF9yeF9hbnQgPSBBTlRfQUIsCisJLnBsbF9jZmdfdmFsID0gMCwKKwkuc2V0X2wwcyA9IHRydWUsCisJLnVzZV9ic20gPSBmYWxzZSwKKwkucGFfdHlwZSA9IElXTF9QQV9TWVNURU0sCisJLm1heF9sbF9pdGVtcyA9IE9UUF9NQVhfTExfSVRFTVNfNngwMCwKKwkuc2hhZG93X3JhbV9zdXBwb3J0ID0gdHJ1ZSwKKwkubGVkX2NvbXBlbnNhdGlvbiA9IDUxLAorCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElXTF9DQUxfTlVNX0JFQUNPTlMsCisJLnN1cHBvcnRzX2lkbGUgPSB0cnVlLAorCS5hZHZfdGhlcm1hbF90aHJvdHRsZSA9IHRydWUsCisJLnN1cHBvcnRfY3Rfa2lsbF9leGl0ID0gdHJ1ZSwKKwkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCisJLmNoYWluX25vaXNlX3NjYWxlID0gMTAwMCwKKwkubW9uaXRvcl9yZWNvdmVyX3BlcmlvZCA9IElXTF9NT05JVE9SSU5HX1BFUklPRCwKKwkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAorCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKKwkuYnRfc3RhdGlzdGljcyA9IHRydWUsCit9OworCitzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiXzJiZ25fY2ZnID0geworCS5uYW1lID0gIjYwMDAgU2VyaWVzIDJ4MiBCR04gR2VuMmIiLAorCS5md19uYW1lX3ByZSA9IElXTDYwMDBHMkJfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDAwRzJfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSVdMX1NLVV9HfElXTF9TS1VfTiwKKwkub3BzID0gJml3bDYwMDBnMmJfb3BzLAorCS5lZXByb21fc2l6ZSA9IE9UUF9MT1dfSU1BR0VfU0laRSwKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV82MDAwRzJfRUVQUk9NX1ZFUlNJT04sCisJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAwMEcyX1RYX1BPV0VSX1ZFUlNJT04sCisJLm51bV9vZl9xdWV1ZXMgPSBJV0xBR05fTlVNX1FVRVVFUywKKwkubnVtX29mX2FtcGR1X3F1ZXVlcyA9IElXTEFHTl9OVU1fQU1QRFVfUVVFVUVTLAorCS5tb2RfcGFyYW1zID0gJml3bGFnbl9tb2RfcGFyYW1zLAorCS52YWxpZF90eF9hbnQgPSBBTlRfQUIsCisJLnZhbGlkX3J4X2FudCA9IEFOVF9BQiwKKwkucGxsX2NmZ192YWwgPSAwLAorCS5zZXRfbDBzID0gdHJ1ZSwKKwkudXNlX2JzbSA9IGZhbHNlLAorCS5wYV90eXBlID0gSVdMX1BBX1NZU1RFTSwKKwkubWF4X2xsX2l0ZW1zID0gT1RQX01BWF9MTF9JVEVNU182eDAwLAorCS5zaGFkb3dfcmFtX3N1cHBvcnQgPSB0cnVlLAorCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLAorCS5sZWRfY29tcGVuc2F0aW9uID0gNTEsCisJLnVzZV9ydHNfZm9yX2h0ID0gdHJ1ZSwgLyogdXNlIHJ0cy9jdHMgcHJvdGVjdGlvbiAqLworCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElXTF9DQUxfTlVNX0JFQUNPTlMsCisJLnN1cHBvcnRzX2lkbGUgPSB0cnVlLAorCS5hZHZfdGhlcm1hbF90aHJvdHRsZSA9IHRydWUsCisJLnN1cHBvcnRfY3Rfa2lsbF9leGl0ID0gdHJ1ZSwKKwkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCisJLmNoYWluX25vaXNlX3NjYWxlID0gMTAwMCwKKwkubW9uaXRvcl9yZWNvdmVyX3BlcmlvZCA9IElXTF9NT05JVE9SSU5HX1BFUklPRCwKKwkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAorCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKKwkuYnRfc3RhdGlzdGljcyA9IHRydWUsCit9OworCitzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiXzJiZ19jZmcgPSB7CisJLm5hbWUgPSAiNjAwMCBTZXJpZXMgMngyIEJHIEdlbjJiIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w2MDAwRzJCX0ZXX1BSRSwKKwkudWNvZGVfYXBpX21heCA9IElXTDYwMDBHMl9VQ09ERV9BUElfTUFYLAorCS51Y29kZV9hcGlfbWluID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NSU4sCisJLnNrdSA9IElXTF9TS1VfRywKKwkub3BzID0gJml3bDYwMDBnMmJfb3BzLAorCS5lZXByb21fc2l6ZSA9IE9UUF9MT1dfSU1BR0VfU0laRSwKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV82MDAwRzJfRUVQUk9NX1ZFUlNJT04sCisJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAwMEcyX1RYX1BPV0VSX1ZFUlNJT04sCisJLm51bV9vZl9xdWV1ZXMgPSBJV0xBR05fTlVNX1FVRVVFUywKKwkubnVtX29mX2FtcGR1X3F1ZXVlcyA9IElXTEFHTl9OVU1fQU1QRFVfUVVFVUVTLAorCS5tb2RfcGFyYW1zID0gJml3bGFnbl9tb2RfcGFyYW1zLAorCS52YWxpZF90eF9hbnQgPSBBTlRfQUIsCisJLnZhbGlkX3J4X2FudCA9IEFOVF9BQiwKKwkucGxsX2NmZ192YWwgPSAwLAorCS5zZXRfbDBzID0gdHJ1ZSwKKwkudXNlX2JzbSA9IGZhbHNlLAorCS5wYV90eXBlID0gSVdMX1BBX1NZU1RFTSwKKwkubWF4X2xsX2l0ZW1zID0gT1RQX01BWF9MTF9JVEVNU182eDAwLAorCS5zaGFkb3dfcmFtX3N1cHBvcnQgPSB0cnVlLAorCS5sZWRfY29tcGVuc2F0aW9uID0gNTEsCisJLmNoYWluX25vaXNlX251bV9iZWFjb25zID0gSVdMX0NBTF9OVU1fQkVBQ09OUywKKwkuc3VwcG9ydHNfaWRsZSA9IHRydWUsCisJLmFkdl90aGVybWFsX3Rocm90dGxlID0gdHJ1ZSwKKwkuc3VwcG9ydF9jdF9raWxsX2V4aXQgPSB0cnVlLAorCS5wbGNwX2RlbHRhX3RocmVzaG9sZCA9IElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX0RFRiwKKwkuY2hhaW5fbm9pc2Vfc2NhbGUgPSAxMDAwLAorCS5tb25pdG9yX3JlY292ZXJfcGVyaW9kID0gSVdMX01PTklUT1JJTkdfUEVSSU9ELAorCS5tYXhfZXZlbnRfbG9nX3NpemUgPSA1MTIsCisJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAorCS5idF9zdGF0aXN0aWNzID0gdHJ1ZSwKK307CisKK3N0cnVjdCBpd2xfY2ZnIGl3bDYwMDBnMmJfYmduX2NmZyA9IHsKKwkubmFtZSA9ICI2MDAwIFNlcmllcyAxeDIgQkdOIEdlbjJiIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w2MDAwRzJCX0ZXX1BSRSwKKwkudWNvZGVfYXBpX21heCA9IElXTDYwMDBHMl9VQ09ERV9BUElfTUFYLAorCS51Y29kZV9hcGlfbWluID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NSU4sCisJLnNrdSA9IElXTF9TS1VfR3xJV0xfU0tVX04sCisJLm9wcyA9ICZpd2w2MDAwZzJiX29wcywKKwkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNjAwMEcyX0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDBHMl9UWF9QT1dFUl9WRVJTSU9OLAorCS5udW1fb2ZfcXVldWVzID0gSVdMQUdOX05VTV9RVUVVRVMsCisJLm51bV9vZl9hbXBkdV9xdWV1ZXMgPSBJV0xBR05fTlVNX0FNUERVX1FVRVVFUywKKwkubW9kX3BhcmFtcyA9ICZpd2xhZ25fbW9kX3BhcmFtcywKKwkudmFsaWRfdHhfYW50ID0gQU5UX0EsCisJLnZhbGlkX3J4X2FudCA9IEFOVF9BQiwKKwkucGxsX2NmZ192YWwgPSAwLAorCS5zZXRfbDBzID0gdHJ1ZSwKKwkudXNlX2JzbSA9IGZhbHNlLAorCS5wYV90eXBlID0gSVdMX1BBX1NZU1RFTSwKKwkubWF4X2xsX2l0ZW1zID0gT1RQX01BWF9MTF9JVEVNU182eDAwLAorCS5zaGFkb3dfcmFtX3N1cHBvcnQgPSB0cnVlLAorCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLAorCS5sZWRfY29tcGVuc2F0aW9uID0gNTEsCisJLnVzZV9ydHNfZm9yX2h0ID0gdHJ1ZSwgLyogdXNlIHJ0cy9jdHMgcHJvdGVjdGlvbiAqLworCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElXTF9DQUxfTlVNX0JFQUNPTlMsCisJLnN1cHBvcnRzX2lkbGUgPSB0cnVlLAorCS5hZHZfdGhlcm1hbF90aHJvdHRsZSA9IHRydWUsCisJLnN1cHBvcnRfY3Rfa2lsbF9leGl0ID0gdHJ1ZSwKKwkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCisJLmNoYWluX25vaXNlX3NjYWxlID0gMTAwMCwKKwkubW9uaXRvcl9yZWNvdmVyX3BlcmlvZCA9IElXTF9NT05JVE9SSU5HX1BFUklPRCwKKwkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAorCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKKwkuYnRfc3RhdGlzdGljcyA9IHRydWUsCit9OworCitzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiX2JnX2NmZyA9IHsKKwkubmFtZSA9ICI2MDAwIFNlcmllcyAxeDIgQkcgR2VuMmIiLAorCS5md19uYW1lX3ByZSA9IElXTDYwMDBHMkJfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDAwRzJfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSVdMX1NLVV9HLAorCS5vcHMgPSAmaXdsNjAwMGcyYl9vcHMsCisJLmVlcHJvbV9zaXplID0gT1RQX0xPV19JTUFHRV9TSVpFLAorCS5lZXByb21fdmVyID0gRUVQUk9NXzYwMDBHMl9FRVBST01fVkVSU0lPTiwKKwkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDAwRzJfVFhfUE9XRVJfVkVSU0lPTiwKKwkubnVtX29mX3F1ZXVlcyA9IElXTEFHTl9OVU1fUVVFVUVTLAorCS5udW1fb2ZfYW1wZHVfcXVldWVzID0gSVdMQUdOX05VTV9BTVBEVV9RVUVVRVMsCisJLm1vZF9wYXJhbXMgPSAmaXdsYWduX21vZF9wYXJhbXMsCisJLnZhbGlkX3R4X2FudCA9IEFOVF9BLAorCS52YWxpZF9yeF9hbnQgPSBBTlRfQUIsCisJLnBsbF9jZmdfdmFsID0gMCwKKwkuc2V0X2wwcyA9IHRydWUsCisJLnVzZV9ic20gPSBmYWxzZSwKKwkucGFfdHlwZSA9IElXTF9QQV9TWVNURU0sCisJLm1heF9sbF9pdGVtcyA9IE9UUF9NQVhfTExfSVRFTVNfNngwMCwKKwkuc2hhZG93X3JhbV9zdXBwb3J0ID0gdHJ1ZSwKKwkubGVkX2NvbXBlbnNhdGlvbiA9IDUxLAorCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElXTF9DQUxfTlVNX0JFQUNPTlMsCisJLnN1cHBvcnRzX2lkbGUgPSB0cnVlLAorCS5hZHZfdGhlcm1hbF90aHJvdHRsZSA9IHRydWUsCisJLnN1cHBvcnRfY3Rfa2lsbF9leGl0ID0gdHJ1ZSwKKwkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCisJLmNoYWluX25vaXNlX3NjYWxlID0gMTAwMCwKKwkubW9uaXRvcl9yZWNvdmVyX3BlcmlvZCA9IElXTF9NT05JVE9SSU5HX1BFUklPRCwKKwkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAorCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKKwkuYnRfc3RhdGlzdGljcyA9IHRydWUsCiB9OwogCiAvKgpAQCAtNTYxLDcgKzgwNCw3IEBACiAJLnVjb2RlX2FwaV9tYXggPSBJV0w2MDUwX1VDT0RFX0FQSV9NQVgsCiAJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDUwX1VDT0RFX0FQSV9NSU4sCiAJLnNrdSA9IElXTF9TS1VfQXxJV0xfU0tVX0d8SVdMX1NLVV9OLAotCS5vcHMgPSAmaXdsNjA1MF9vcHMsCisJLm9wcyA9ICZpd2w2MDAwX29wcywKIAkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjA1MF9FRVBST01fVkVSU0lPTiwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDUwX1RYX1BPV0VSX1ZFUlNJT04sCkBAIC01OTAsNiArODMzLDQ1IEBACiAJLnVjb2RlX3RyYWNpbmcgPSB0cnVlLAogCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAogCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKK307CisKK3N0cnVjdCBpd2xfY2ZnIGl3bDYwNTBnMl9iZ25fY2ZnID0geworCS5uYW1lID0gIjYwNTAgU2VyaWVzIDF4MiBCR04gR2VuMiIsCisJLmZ3X25hbWVfcHJlID0gSVdMNjA1MF9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJV0w2MDUwX1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDUwX1VDT0RFX0FQSV9NSU4sCisJLnNrdSA9IElXTF9TS1VfR3xJV0xfU0tVX04sCisJLm9wcyA9ICZpd2w2MDAwX29wcywKKwkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNjA1MEcyX0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwNTBHMl9UWF9QT1dFUl9WRVJTSU9OLAorCS5udW1fb2ZfcXVldWVzID0gSVdMQUdOX05VTV9RVUVVRVMsCisJLm51bV9vZl9hbXBkdV9xdWV1ZXMgPSBJV0xBR05fTlVNX0FNUERVX1FVRVVFUywKKwkubW9kX3BhcmFtcyA9ICZpd2xhZ25fbW9kX3BhcmFtcywKKwkudmFsaWRfdHhfYW50ID0gQU5UX0EsCisJLnZhbGlkX3J4X2FudCA9IEFOVF9BQiwKKwkucGxsX2NmZ192YWwgPSAwLAorCS5zZXRfbDBzID0gdHJ1ZSwKKwkudXNlX2JzbSA9IGZhbHNlLAorCS5wYV90eXBlID0gSVdMX1BBX1NZU1RFTSwKKwkubWF4X2xsX2l0ZW1zID0gT1RQX01BWF9MTF9JVEVNU182eDUwLAorCS5zaGFkb3dfcmFtX3N1cHBvcnQgPSB0cnVlLAorCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLAorCS5sZWRfY29tcGVuc2F0aW9uID0gNTEsCisJLnVzZV9ydHNfZm9yX2h0ID0gdHJ1ZSwgLyogdXNlIHJ0cy9jdHMgcHJvdGVjdGlvbiAqLworCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElXTF9DQUxfTlVNX0JFQUNPTlMsCisJLnN1cHBvcnRzX2lkbGUgPSB0cnVlLAorCS5hZHZfdGhlcm1hbF90aHJvdHRsZSA9IHRydWUsCisJLnN1cHBvcnRfY3Rfa2lsbF9leGl0ID0gdHJ1ZSwKKwkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCisJLmNoYWluX25vaXNlX3NjYWxlID0gMTUwMCwKKwkubW9uaXRvcl9yZWNvdmVyX3BlcmlvZCA9IElXTF9NT05JVE9SSU5HX1BFUklPRCwKKwkubWF4X2V2ZW50X2xvZ19zaXplID0gMTAyNCwKKwkudWNvZGVfdHJhY2luZyA9IHRydWUsCisJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAogfTsKIAogc3RydWN0IGl3bF9jZmcgaXdsNjA1MF8yYWJnX2NmZyA9IHsKQEAgLTU5OCw3ICs4ODAsNyBAQAogCS51Y29kZV9hcGlfbWF4ID0gSVdMNjA1MF9VQ09ERV9BUElfTUFYLAogCS51Y29kZV9hcGlfbWluID0gSVdMNjA1MF9VQ09ERV9BUElfTUlOLAogCS5za3UgPSBJV0xfU0tVX0F8SVdMX1NLVV9HLAotCS5vcHMgPSAmaXdsNjA1MF9vcHMsCisJLm9wcyA9ICZpd2w2MDAwX29wcywKIAkuZWVwcm9tX3NpemUgPSBPVFBfTE9XX0lNQUdFX1NJWkUsCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjA1MF9FRVBST01fVkVSU0lPTiwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDUwX1RYX1BPV0VSX1ZFUlNJT04sCkBAIC02MjUsNiArOTA3LDcgQEAKIAkudWNvZGVfdHJhY2luZyA9IHRydWUsCiAJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCiAJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAogfTsKIAogc3RydWN0IGl3bF9jZmcgaXdsNjAwMF8zYWduX2NmZyA9IHsKQEAgLTY2NywzICs5NTAsNCBAQAogTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfVUNPREVfQVBJX01BWCkpOwogTU9EVUxFX0ZJUk1XQVJFKElXTDYwNTBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwNTBfVUNPREVfQVBJX01BWCkpOwogTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBHMkFfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBHMl9VQ09ERV9BUElfTUFYKSk7CitNT0RVTEVfRklSTVdBUkUoSVdMNjAwMEcyQl9NT0RVTEVfRklSTVdBUkUoSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjNTY5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5jCkBAIC0wLDAgKzEsMTAxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgIml3bC1kZXYuaCIKKyNpbmNsdWRlICJpd2wtY29yZS5oIgorI2luY2x1ZGUgIml3bC1jYWxpYi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVQgY2FsaWJyYXRpb25zIGZyYW1ld29yaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2RhdGEgeworCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2E7CisJdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYjsKKwl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9jOworCXUzMiBiZWFjb25fZW5lcmd5X2E7CisJdTMyIGJlYWNvbl9lbmVyZ3lfYjsKKwl1MzIgYmVhY29uX2VuZXJneV9jOworfTsKKworaW50IGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWludCByZXQgPSAwOworCWludCBpID0gMDsKKworCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKKwkJLmlkID0gUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCwKKwkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgeworCQlpZiAoKEJJVChpKSAmIHByaXYtPmh3X3BhcmFtcy5jYWxpYl9pbml0X2NmZykgJiYKKwkJICAgIHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmKSB7CisJCQloY21kLmxlbiA9IHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbjsKKwkJCWhjbWQuZGF0YSA9IHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmOworCQkJcmV0ID0gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOworCQkJaWYgKHJldCkgeworCQkJCUlXTF9FUlIocHJpdiwgIkVycm9yICVkIGl0ZXJhdGlvbiAlZFxuIiwKKwkJCQkJcmV0LCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpd2xfY2FsaWJfc2V0KHN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXMsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCit7CisJaWYgKHJlcy0+YnVmX2xlbiAhPSBsZW4pIHsKKwkJa2ZyZWUocmVzLT5idWYpOworCQlyZXMtPmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwl9CisJaWYgKHVubGlrZWx5KHJlcy0+YnVmID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcy0+YnVmX2xlbiA9IGxlbjsKKwltZW1jcHkocmVzLT5idWYsIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpd2xfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJV0xfQ0FMSUJfTUFYOyBpKyspIHsKKwkJa2ZyZWUocHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWYpOworCQlwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZiA9IE5VTEw7CisJCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbiA9IDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJVTlRJTUUgY2FsaWJyYXRpb25zIGZyYW1ld29yaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAiZmFsc2UgYWxhcm1zIiBhcmUgc2lnbmFscyB0aGF0IG91ciBEU1AgdHJpZXMgdG8gbG9jayBvbnRvLAorICogICBidXQgdGhlbiBkZXRlcm1pbmVzIHRoYXQgdGhleSBhcmUgZWl0aGVyIG5vaXNlLCBvciB0cmFuc21pc3Npb25zCisgKiAgIGZyb20gYSBkaXN0YW50IHdpcmVsZXNzIG5ldHdvcmsgKGFsc28gIm5vaXNlIiwgcmVhbGx5KSB0aGF0IGdldAorICogICAic3RlcHBlZCBvbiIgYnkgc3Ryb25nZXIgdHJhbnNtaXNzaW9ucyB3aXRoaW4gb3VyIG93biBuZXR3b3JrLgorICogVGhpcyBhbGdvcml0aG0gYXR0ZW1wdHMgdG8gc2V0IGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdCBpcyBoaWdoCisgKiAgIGVub3VnaCB0byByZWNlaXZlIGFsbCBvZiBvdXIgb3duIG5ldHdvcmsgdHJhZmZpYywgYnV0IG5vdCBzbworICogICBoaWdoIHRoYXQgb3VyIERTUCBnZXRzIHRvbyBidXN5IHRyeWluZyB0byBsb2NrIG9udG8gbm9uLW5ldHdvcmsKKyAqICAgYWN0aXZpdHkvbm9pc2UuICovCitzdGF0aWMgaW50IGl3bF9zZW5zX2VuZXJneV9jY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgIHUzMiBub3JtX2ZhLAorCQkJCSAgIHUzMiByeF9lbmFibGVfdGltZSwKKwkJCQkgICBzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2RhdGEgKnJ4X2luZm8pCit7CisJdTMyIG1heF9ucmdfY2NrID0gMDsKKwlpbnQgaSA9IDA7CisJdTggbWF4X3NpbGVuY2VfcnNzaSA9IDA7CisJdTMyIHNpbGVuY2VfcmVmID0gMDsKKwl1OCBzaWxlbmNlX3Jzc2lfYSA9IDA7CisJdTggc2lsZW5jZV9yc3NpX2IgPSAwOworCXU4IHNpbGVuY2VfcnNzaV9jID0gMDsKKwl1MzIgdmFsOworCisJLyogImZhbHNlX2FsYXJtcyIgdmFsdWVzIGJlbG93IGFyZSBjcm9zcy1tdWx0aXBsaWNhdGlvbnMgdG8gYXNzZXNzIHRoZQorCSAqICAgbnVtYmVycyBvZiBmYWxzZSBhbGFybXMgd2l0aGluIHRoZSBtZWFzdXJlZCBwZXJpb2Qgb2YgYWN0dWFsIFJ4CisJICogICAoUnggaXMgb2ZmIHdoZW4gd2UncmUgdHhpbmcpLCB2cyB0aGUgbWluL21heCBleHBlY3RlZCBmYWxzZSBhbGFybXMKKwkgKiAgIChzb21lIHNob3VsZCBiZSBleHBlY3RlZCBpZiByeCBpcyBzZW5zaXRpdmUgZW5vdWdoKSBpbiBhCisJICogICBoeXBvdGhldGljYWwgbGlzdGVuaW5nIHBlcmlvZCBvZiAyMDAgdGltZSB1bml0cyAoVFUpLCAyMDQuOCBtc2VjOgorCSAqCisJICogTUlOX0ZBL2ZpeGVkLXRpbWUgPCBmYWxzZV9hbGFybXMvYWN0dWFsLXJ4LXRpbWUgPCBNQVhfRkEvYmVhY29uLXRpbWUKKwkgKgorCSAqICovCisJdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OworCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOworCXUzMiBtaW5fZmFsc2VfYWxhcm1zID0gTUlOX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOworCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IHByaXYtPmh3X3BhcmFtcy5zZW5zOworCisJZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA9IDA7CisKKwkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLgorCSAqIFRoaXMgaXMgYmFja2dyb3VuZCBub2lzZSwgd2hpY2ggbWF5IGluY2x1ZGUgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCisJICogICAgbmV0d29ya3MsIG1lYXN1cmVkIGR1cmluZyBzaWxlbmNlIGJlZm9yZSBvdXIgbmV0d29yaydzIGJlYWNvbiAqLworCXNpbGVuY2VfcnNzaV9hID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hICYKKwkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOworCXNpbGVuY2VfcnNzaV9iID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iICYKKwkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOworCXNpbGVuY2VfcnNzaV9jID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jICYKKwkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOworCisJdmFsID0gbWF4KHNpbGVuY2VfcnNzaV9iLCBzaWxlbmNlX3Jzc2lfYyk7CisJbWF4X3NpbGVuY2VfcnNzaSA9IG1heChzaWxlbmNlX3Jzc2lfYSwgKHU4KSB2YWwpOworCisJLyogU3RvcmUgc2lsZW5jZSByc3NpIGluIDIwLWJlYWNvbiBoaXN0b3J5IHRhYmxlICovCisJZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtkYXRhLT5ucmdfc2lsZW5jZV9pZHhdID0gbWF4X3NpbGVuY2VfcnNzaTsKKwlkYXRhLT5ucmdfc2lsZW5jZV9pZHgrKzsKKwlpZiAoZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID49IE5SR19OVU1fUFJFVl9TVEFUX0wpCisJCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7CisKKwkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYWNyb3NzIDIwIGJlYWNvbiBoaXN0b3J5ICovCisJZm9yIChpID0gMDsgaSA8IE5SR19OVU1fUFJFVl9TVEFUX0w7IGkrKykgeworCQl2YWwgPSBkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldOworCQlzaWxlbmNlX3JlZiA9IG1heChzaWxlbmNlX3JlZiwgdmFsKTsKKwl9CisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIDIwLWJjbiBtYXggJXVcbiIsCisJCQlzaWxlbmNlX3Jzc2lfYSwgc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jLAorCQkJc2lsZW5jZV9yZWYpOworCisJLyogRmluZCBtYXggcnggZW5lcmd5IChtaW4gdmFsdWUhKSBhbW9uZyBhbGwgMyByZWNlaXZlcnMsCisJICogICBtZWFzdXJlZCBkdXJpbmcgYmVhY29uIGZyYW1lLgorCSAqIFNhdmUgaXQgaW4gMTAtYmVhY29uIGhpc3RvcnkgdGFibGUuICovCisJaSA9IGRhdGEtPm5yZ19lbmVyZ3lfaWR4OworCXZhbCA9IG1pbihyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IsIHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYyk7CisJZGF0YS0+bnJnX3ZhbHVlW2ldID0gbWluKHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSwgdmFsKTsKKworCWRhdGEtPm5yZ19lbmVyZ3lfaWR4Kys7CisJaWYgKGRhdGEtPm5yZ19lbmVyZ3lfaWR4ID49IDEwKQorCQlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7CisKKwkvKiBGaW5kIG1pbiByeCBlbmVyZ3kgKG1heCB2YWx1ZSkgYWNyb3NzIDEwIGJlYWNvbiBoaXN0b3J5LgorCSAqIFRoaXMgaXMgdGhlIG1pbmltdW0gc2lnbmFsIGxldmVsIHRoYXQgd2Ugd2FudCB0byByZWNlaXZlIHdlbGwuCisJICogQWRkIGJhY2tvZmYgKG1hcmdpbiBzbyB3ZSBkb24ndCBtaXNzIHNsaWdodGx5IGxvd2VyIGVuZXJneSBmcmFtZXMpLgorCSAqIFRoaXMgZXN0YWJsaXNoZXMgYW4gdXBwZXIgYm91bmQgKG1pbiB2YWx1ZSkgZm9yIGVuZXJneSB0aHJlc2hvbGQuICovCisJbWF4X25yZ19jY2sgPSBkYXRhLT5ucmdfdmFsdWVbMF07CisJZm9yIChpID0gMTsgaSA8IDEwOyBpKyspCisJCW1heF9ucmdfY2NrID0gKHUzMikgbWF4KG1heF9ucmdfY2NrLCAoZGF0YS0+bnJnX3ZhbHVlW2ldKSk7CisJbWF4X25yZ19jY2sgKz0gNjsKKworCUlXTF9ERUJVR19DQUxJQihwcml2LCAicnggZW5lcmd5IGEgJXUsIGIgJXUsIGMgJXUsIDEwLWJjbiBtYXgvbWluICV1XG4iLAorCQkJcnhfaW5mby0+YmVhY29uX2VuZXJneV9hLCByeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IsCisJCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MsIG1heF9ucmdfY2NrIC0gNik7CisKKwkvKiBDb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmVhY29ucyB3aXRoIGZld2VyLXRoYW4tZGVzaXJlZAorCSAqICAgZmFsc2UgYWxhcm1zLiAqLworCWlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKQorCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKys7CisJZWxzZQorCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKKwlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNvbnNlY3V0aXZlIGJjbnMgd2l0aCBmZXcgZmFsc2UgYWxhcm1zID0gJXVcbiIsCisJCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKTsKKworCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KKwlpZiAoKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpICYmCisJCShkYXRhLT5hdXRvX2NvcnJfY2NrID4gQVVUT19DT1JSX01BWF9USF9DQ0spKSB7CisJCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA+IG1heCBGQSAldVxuIiwKKwkJICAgICBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOworCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiByZWR1Y2luZyBzZW5zaXRpdml0eVxuIik7CisJCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOworCQkvKiBTdG9yZSBmb3IgImZld2VyIHRoYW4gZGVzaXJlZCIgb24gbGF0ZXIgYmVhY29uICovCisJCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOworCisJCS8qIGluY3JlYXNlIGVuZXJneSB0aHJlc2hvbGQgKHJlZHVjZSBucmcgdmFsdWUpCisJCSAqICAgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwkJZGF0YS0+bnJnX3RoX2NjayA9IGRhdGEtPm5yZ190aF9jY2sgLSBOUkdfU1RFUF9DQ0s7CisJLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCX0gZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgeworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9UT09fRkVXOworCisJCS8qIENvbXBhcmUgc2lsZW5jZSBsZXZlbCB3aXRoIHNpbGVuY2UgbGV2ZWwgZm9yIG1vc3QgcmVjZW50CisJCSAqICAgaGVhbHRoeSBudW1iZXIgb3IgdG9vIG1hbnkgZmFsc2UgYWxhcm1zICovCisJCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0gKHMzMilkYXRhLT5ucmdfc2lsZW5jZV9yZWYgLQorCQkJCQkJICAgKHMzMilzaWxlbmNlX3JlZjsKKworCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXUsIHNpbGVuY2UgZGlmZiAlZFxuIiwKKwkJCSBmYWxzZV9hbGFybXMsIG1pbl9mYWxzZV9hbGFybXMsCisJCQkgZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYpOworCisJCS8qIEluY3JlYXNlIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5LCBidXQgb25seSBpZjoKKwkJICogMWEpIHByZXZpb3VzIGJlYWNvbiBkaWQgKm5vdCogaGF2ZSAqdG9vIG1hbnkqIGZhbHNlIGFsYXJtcworCQkgKiAxYikgQU5EIHRoZXJlJ3MgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIFJ4IGxldmVscworCQkgKiAgICAgIGZyb20gYSBwcmV2aW91cyBiZWFjb24gd2l0aCB0b28gbWFueSwgb3IgaGVhbHRoeSAjIEZBcworCQkgKiBPUiAyKSBXZSd2ZSBzZWVuIGEgbG90IG9mIGJlYWNvbnMgKDEwMCkgd2l0aCB0b28gZmV3CisJCSAqICAgICAgIGZhbHNlIGFsYXJtcyAqLworCQlpZiAoKGRhdGEtPm5yZ19wcmV2X3N0YXRlICE9IElXTF9GQV9UT09fTUFOWSkgJiYKKwkJCSgoZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPiBOUkdfRElGRikgfHwKKwkJCShkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSkgeworCisJCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiBpbmNyZWFzaW5nIHNlbnNpdGl2aXR5XG4iKTsKKwkJCS8qIEluY3JlYXNlIG5yZyB2YWx1ZSB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCQkJdmFsID0gZGF0YS0+bnJnX3RoX2NjayArIE5SR19TVEVQX0NDSzsKKwkJCWRhdGEtPm5yZ190aF9jY2sgPSBtaW4oKHUzMilyYW5nZXMtPm1pbl9ucmdfY2NrLCB2YWwpOworCQl9IGVsc2UgeworCQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICIuLi4gYnV0IG5vdCBjaGFuZ2luZyBzZW5zaXRpdml0eVxuIik7CisJCX0KKworCS8qIEVsc2Ugd2UgZ290IGEgaGVhbHRoeSBudW1iZXIgb2YgZmFsc2UgYWxhcm1zLCBrZWVwIHN0YXR1cyBxdW8gKi8KKwl9IGVsc2UgeworCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIiBGQSBpbiBzYWZlIHpvbmVcbiIpOworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9HT09EX1JBTkdFOworCisJCS8qIFN0b3JlIGZvciB1c2UgaW4gImZld2VyIHRoYW4gZGVzaXJlZCIgd2l0aCBsYXRlciBiZWFjb24gKi8KKwkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmID0gc2lsZW5jZV9yZWY7CisKKwkJLyogSWYgcHJldmlvdXMgYmVhY29uIGhhZCB0b28gbWFueSBmYWxzZSBhbGFybXMsCisJCSAqICAgZ2l2ZSBpdCBzb21lIGV4dHJhIG1hcmdpbiBieSByZWR1Y2luZyBzZW5zaXRpdml0eSBhZ2FpbgorCQkgKiAgIChidXQgZG9uJ3QgZ28gYmVsb3cgbWVhc3VyZWQgZW5lcmd5IG9mIGRlc2lyZWQgUngpICovCisJCWlmIChJV0xfRkFfVE9PX01BTlkgPT0gZGF0YS0+bnJnX3ByZXZfc3RhdGUpIHsKKwkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIGluY3JlYXNpbmcgbWFyZ2luXG4iKTsKKwkJCWlmIChkYXRhLT5ucmdfdGhfY2NrID4gKG1heF9ucmdfY2NrICsgTlJHX01BUkdJTikpCisJCQkJZGF0YS0+bnJnX3RoX2NjayAtPSBOUkdfTUFSR0lOOworCQkJZWxzZQorCQkJCWRhdGEtPm5yZ190aF9jY2sgPSBtYXhfbnJnX2NjazsKKwkJfQorCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgZW5lcmd5IHRocmVzaG9sZCBkb2VzIG5vdCBnbyBhYm92ZSB0aGUgbWVhc3VyZWQKKwkgKiBlbmVyZ3kgb2YgdGhlIGRlc2lyZWQgUnggc2lnbmFscyAocmVkdWNlZCBieSBiYWNrb2ZmIG1hcmdpbiksCisJICogb3IgZWxzZSB3ZSBtaWdodCBzdGFydCBtaXNzaW5nIFJ4IGZyYW1lcy4KKwkgKiBMb3dlciB2YWx1ZSBpcyBoaWdoZXIgZW5lcmd5LCBzbyB3ZSB1c2UgbWF4KCkhCisJICovCisJZGF0YS0+bnJnX3RoX2NjayA9IG1heChtYXhfbnJnX2NjaywgZGF0YS0+bnJnX3RoX2Njayk7CisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJuZXcgbnJnX3RoX2NjayAldVxuIiwgZGF0YS0+bnJnX3RoX2Njayk7CisKKwlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IGRhdGEtPm5yZ19jdXJyX3N0YXRlOworCisJLyogQXV0by1jb3JyZWxhdGlvbiBDQ0sgYWxnb3JpdGhtICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1pbl9mYWxzZV9hbGFybXMpIHsKKworCQkvKiBpbmNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5CisJCSAqIHNvIHRoZSBEU1Agd29uJ3QgYmUgZGlzdHVyYmVkIGJ5IHRoZSBub2lzZQorCQkgKi8KKwkJaWYgKGRhdGEtPmF1dG9fY29ycl9jY2sgPCBBVVRPX0NPUlJfTUFYX1RIX0NDSykKKwkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPSBBVVRPX0NPUlJfTUFYX1RIX0NDSyArIDE7CisJCWVsc2UgeworCQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayArIEFVVE9fQ09SUl9TVEVQX0NDSzsKKwkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPQorCQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9jY2ssIHZhbCk7CisJCX0KKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgKyBBVVRPX0NPUlJfU1RFUF9DQ0s7CisJCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjID0KKwkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9jY2tfbXJjLCB2YWwpOworCX0gZWxzZSBpZiAoKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpICYmCisJICAgKChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGKSB8fAorCSAgIChkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSkgeworCisJCS8qIERlY3JlYXNlIGF1dG9fY29yciB2YWx1ZXMgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayAtIEFVVE9fQ09SUl9TVEVQX0NDSzsKKwkJZGF0YS0+YXV0b19jb3JyX2NjayA9CisJCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrLCB2YWwpOworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyAtIEFVVE9fQ09SUl9TVEVQX0NDSzsKKwkJZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPQorCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2Nja19tcmMsIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpd2xfc2Vuc19hdXRvX2NvcnJfb2ZkbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICAgICAgIHUzMiBub3JtX2ZhLAorCQkJCSAgICAgICB1MzIgcnhfZW5hYmxlX3RpbWUpCit7CisJdTMyIHZhbDsKKwl1MzIgZmFsc2VfYWxhcm1zID0gbm9ybV9mYSAqIDIwMCAqIDEwMjQ7CisJdTMyIG1heF9mYWxzZV9hbGFybXMgPSBNQVhfRkFfT0ZETSAqIHJ4X2VuYWJsZV90aW1lOworCXUzMiBtaW5fZmFsc2VfYWxhcm1zID0gTUlOX0ZBX09GRE0gKiByeF9lbmFibGVfdGltZTsKKwlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBwcml2LT5od19wYXJhbXMuc2VuczsKKworCWRhdGEgPSAmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpOworCisJLyogSWYgd2UgZ290IHRvbyBtYW55IGZhbHNlIGFsYXJtcyB0aGlzIHRpbWUsIHJlZHVjZSBzZW5zaXRpdml0eSAqLworCWlmIChmYWxzZV9hbGFybXMgPiBtYXhfZmFsc2VfYWxhcm1zKSB7CisKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJub3JtIEZBICV1ID4gbWF4IEZBICV1KVxuIiwKKwkJCSAgICAgZmFsc2VfYWxhcm1zLCBtYXhfZmFsc2VfYWxhcm1zKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSArIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtID0KKwkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtLCB2YWwpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyArIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9CisJCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmMsIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1feDEgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSA9CisJCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV94MSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPQorCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxLCB2YWwpOworCX0KKworCS8qIEVsc2UgaWYgd2UgZ290IGZld2VyIHRoYW4gZGVzaXJlZCwgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwllbHNlIGlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKSB7CisKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJub3JtIEZBICV1IDwgbWluIEZBICV1XG4iLAorCQkJICAgICBmYWxzZV9hbGFybXMsIG1pbl9mYWxzZV9hbGFybXMpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG0gPQorCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG0sIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0KKwkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yYywgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxID0KKwkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX3gxLCB2YWwpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9CisJCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmNfeDEsIHZhbCk7CisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJtaW4gRkEgJXUgPCBub3JtIEZBICV1IDwgbWF4IEZBICV1IE9LXG4iLAorCQkJIG1pbl9mYWxzZV9hbGFybXMsIGZhbHNlX2FsYXJtcywgbWF4X2ZhbHNlX2FsYXJtcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpd2xfcHJlcGFyZV9sZWdhY3lfc2Vuc2l0aXZpdHlfdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEsCisJCQkJX19sZTE2ICp0YmwpCit7CisJdGJsW0hEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSU5ERVhdID0KKwkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtKTsKKwl0YmxbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KKwkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyk7CisJdGJsW0hEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSU5ERVhdID0KKwkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxKTsKKwl0YmxbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KKwkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSk7CisKKwl0YmxbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JTkRFWF0gPQorCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX2Njayk7CisJdGJsW0hEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYXSA9CisJCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyk7CisKKwl0YmxbSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYXSA9CisJCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5ucmdfdGhfY2NrKTsKKwl0YmxbSERfTUlOX0VORVJHWV9PRkRNX0RFVF9JTkRFWF0gPQorCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+bnJnX3RoX29mZG0pOworCisJdGJsW0hEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fSU5ERVhdID0KKwkJCQljcHVfdG9fbGUxNihkYXRhLT5iYXJrZXJfY29ycl90aF9taW4pOworCXRibFtIRF9CQVJLRVJfQ09SUl9USF9BRERfTUlOX01SQ19JTkRFWF0gPQorCQkJCWNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMpOworCXRibFtIRF9PRkRNX0VORVJHWV9USF9JTl9JTkRFWF0gPQorCQkJCWNwdV90b19sZTE2KGRhdGEtPm5yZ190aF9jY2EpOworCisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJvZmRtOiBhYyAldSBtcmMgJXUgeDEgJXUgbXJjX3gxICV1IHRocmVzaCAldVxuIiwKKwkJCWRhdGEtPmF1dG9fY29ycl9vZmRtLCBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMsCisJCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSwgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxLAorCQkJZGF0YS0+bnJnX3RoX29mZG0pOworCisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJjY2s6IGFjICV1IG1yYyAldSB0aHJlc2ggJXVcbiIsCisJCQlkYXRhLT5hdXRvX2NvcnJfY2NrLCBkYXRhLT5hdXRvX2NvcnJfY2NrX21yYywKKwkJCWRhdGEtPm5yZ190aF9jY2spOworfQorCisvKiBQcmVwYXJlIGEgU0VOU0lUSVZJVFlfQ01ELCBzZW5kIHRvIHVDb2RlIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWQgKi8KK3N0YXRpYyBpbnQgaXdsX3NlbnNpdGl2aXR5X3dyaXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCBjbWQ7CisJc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZF9vdXQgPSB7CisJCS5pZCA9IFNFTlNJVElWSVRZX0NNRCwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCksCisJCS5mbGFncyA9IENNRF9BU1lOQywKKwkJLmRhdGEgPSAmY21kLAorCX07CisKKwlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisKKwlpd2xfcHJlcGFyZV9sZWdhY3lfc2Vuc2l0aXZpdHlfdGJsKHByaXYsIGRhdGEsICZjbWQudGFibGVbMF0pOworCisJLyogVXBkYXRlIHVDb2RlJ3MgIndvcmsiIHRhYmxlLCBhbmQgY29weSBpdCB0byBEU1AgKi8KKwljbWQuY29udHJvbCA9IFNFTlNJVElWSVRZX0NNRF9DT05UUk9MX1dPUktfVEFCTEU7CisKKwkvKiBEb24ndCBzZW5kIGNvbW1hbmQgdG8gdUNvZGUgaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLworCWlmICghbWVtY21wKCZjbWQudGFibGVbMF0sICYocHJpdi0+c2Vuc2l0aXZpdHlfdGJsWzBdKSwKKwkJICAgIHNpemVvZih1MTYpKkhEX1RBQkxFX1NJWkUpKSB7CisJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiTm8gY2hhbmdlIGluIFNFTlNJVElWSVRZX0NNRFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENvcHkgdGFibGUgZm9yIGNvbXBhcmlzb24gbmV4dCB0aW1lICovCisJbWVtY3B5KCYocHJpdi0+c2Vuc2l0aXZpdHlfdGJsWzBdKSwgJihjbWQudGFibGVbMF0pLAorCSAgICAgICBzaXplb2YodTE2KSpIRF9UQUJMRV9TSVpFKTsKKworCXJldHVybiBpd2xfc2VuZF9jbWQocHJpdiwgJmNtZF9vdXQpOworfQorCisvKiBQcmVwYXJlIGEgU0VOU0lUSVZJVFlfQ01ELCBzZW5kIHRvIHVDb2RlIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWQgKi8KK3N0YXRpYyBpbnQgaXdsX2VuaGFuY2Vfc2Vuc2l0aXZpdHlfd3JpdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpd2xfZW5oYW5jZV9zZW5zaXRpdml0eV9jbWQgY21kOworCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7CisJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWRfb3V0ID0geworCQkuaWQgPSBTRU5TSVRJVklUWV9DTUQsCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9lbmhhbmNlX3NlbnNpdGl2aXR5X2NtZCksCisJCS5mbGFncyA9IENNRF9BU1lOQywKKwkJLmRhdGEgPSAmY21kLAorCX07CisKKwlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisKKwlpd2xfcHJlcGFyZV9sZWdhY3lfc2Vuc2l0aXZpdHlfdGJsKHByaXYsIGRhdGEsICZjbWQuZW5oYW5jZV90YWJsZVswXSk7CisKKwljbWQuZW5oYW5jZV90YWJsZVtIRF9JTkFfTk9OX1NRVUFSRV9ERVRfT0ZETV9JTkRFWF0gPQorCQlIRF9JTkFfTk9OX1NRVUFSRV9ERVRfT0ZETV9EQVRBOworCWNtZC5lbmhhbmNlX3RhYmxlW0hEX0lOQV9OT05fU1FVQVJFX0RFVF9DQ0tfSU5ERVhdID0KKwkJSERfSU5BX05PTl9TUVVBUkVfREVUX0NDS19EQVRBOworCWNtZC5lbmhhbmNlX3RhYmxlW0hEX0NPUlJfMTFfSU5TVEVBRF9PRl9DT1JSXzlfRU5fSU5ERVhdID0KKwkJSERfQ09SUl8xMV9JTlNURUFEX09GX0NPUlJfOV9FTl9EQVRBOworCWNtZC5lbmhhbmNlX3RhYmxlW0hEX09GRE1fTk9OX1NRVUFSRV9ERVRfU0xPUEVfTVJDX0lOREVYXSA9CisJCUhEX09GRE1fTk9OX1NRVUFSRV9ERVRfU0xPUEVfTVJDX0RBVEE7CisJY21kLmVuaGFuY2VfdGFibGVbSERfT0ZETV9OT05fU1FVQVJFX0RFVF9JTlRFUkNFUFRfTVJDX0lOREVYXSA9CisJCUhEX09GRE1fTk9OX1NRVUFSRV9ERVRfSU5URVJDRVBUX01SQ19EQVRBOworCWNtZC5lbmhhbmNlX3RhYmxlW0hEX09GRE1fTk9OX1NRVUFSRV9ERVRfU0xPUEVfSU5ERVhdID0KKwkJSERfT0ZETV9OT05fU1FVQVJFX0RFVF9TTE9QRV9EQVRBOworCWNtZC5lbmhhbmNlX3RhYmxlW0hEX09GRE1fTk9OX1NRVUFSRV9ERVRfSU5URVJDRVBUX0lOREVYXSA9CisJCUhEX09GRE1fTk9OX1NRVUFSRV9ERVRfSU5URVJDRVBUX0RBVEE7CisJY21kLmVuaGFuY2VfdGFibGVbSERfQ0NLX05PTl9TUVVBUkVfREVUX1NMT1BFX01SQ19JTkRFWF0gPQorCQlIRF9DQ0tfTk9OX1NRVUFSRV9ERVRfU0xPUEVfTVJDX0RBVEE7CisJY21kLmVuaGFuY2VfdGFibGVbSERfQ0NLX05PTl9TUVVBUkVfREVUX0lOVEVSQ0VQVF9NUkNfSU5ERVhdID0KKwkJSERfQ0NLX05PTl9TUVVBUkVfREVUX0lOVEVSQ0VQVF9NUkNfREFUQTsKKwljbWQuZW5oYW5jZV90YWJsZVtIRF9DQ0tfTk9OX1NRVUFSRV9ERVRfU0xPUEVfSU5ERVhdID0KKwkJSERfQ0NLX05PTl9TUVVBUkVfREVUX1NMT1BFX0RBVEE7CisJY21kLmVuaGFuY2VfdGFibGVbSERfQ0NLX05PTl9TUVVBUkVfREVUX0lOVEVSQ0VQVF9JTkRFWF0gPQorCQlIRF9DQ0tfTk9OX1NRVUFSRV9ERVRfSU5URVJDRVBUX0RBVEE7CisKKwkvKiBVcGRhdGUgdUNvZGUncyAid29yayIgdGFibGUsIGFuZCBjb3B5IGl0IHRvIERTUCAqLworCWNtZC5jb250cm9sID0gU0VOU0lUSVZJVFlfQ01EX0NPTlRST0xfV09SS19UQUJMRTsKKworCS8qIERvbid0IHNlbmQgY29tbWFuZCB0byB1Q29kZSBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKCFtZW1jbXAoJmNtZC5lbmhhbmNlX3RhYmxlWzBdLCAmKHByaXYtPnNlbnNpdGl2aXR5X3RibFswXSksCisJCSAgICBzaXplb2YodTE2KSpIRF9UQUJMRV9TSVpFKSAmJgorCSAgICAhbWVtY21wKCZjbWQuZW5oYW5jZV90YWJsZVtIRF9JTkFfTk9OX1NRVUFSRV9ERVRfT0ZETV9JTkRFWF0sCisJCSAgICAmKHByaXYtPmVuaGFuY2Vfc2Vuc2l0aXZpdHlfdGJsWzBdKSwKKwkJICAgIHNpemVvZih1MTYpKkVOSEFOQ0VfSERfVEFCTEVfRU5UUklFUykpIHsKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJObyBjaGFuZ2UgaW4gU0VOU0lUSVZJVFlfQ01EXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29weSB0YWJsZSBmb3IgY29tcGFyaXNvbiBuZXh0IHRpbWUgKi8KKwltZW1jcHkoJihwcml2LT5zZW5zaXRpdml0eV90YmxbMF0pLCAmKGNtZC5lbmhhbmNlX3RhYmxlWzBdKSwKKwkgICAgICAgc2l6ZW9mKHUxNikqSERfVEFCTEVfU0laRSk7CisJbWVtY3B5KCYocHJpdi0+ZW5oYW5jZV9zZW5zaXRpdml0eV90YmxbMF0pLAorCSAgICAgICAmKGNtZC5lbmhhbmNlX3RhYmxlW0hEX0lOQV9OT05fU1FVQVJFX0RFVF9PRkRNX0lOREVYXSksCisJICAgICAgIHNpemVvZih1MTYpKkVOSEFOQ0VfSERfVEFCTEVfRU5UUklFUyk7CisKKwlyZXR1cm4gaXdsX3NlbmRfY21kKHByaXYsICZjbWRfb3V0KTsKK30KKwordm9pZCBpd2xfaW5pdF9zZW5zaXRpdml0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisJc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyAqcmFuZ2VzID0gcHJpdi0+aHdfcGFyYW1zLnNlbnM7CisKKwlpZiAocHJpdi0+ZGlzYWJsZV9zZW5zX2NhbCkKKwkJcmV0dXJuOworCisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJTdGFydCBpd2xfaW5pdF9zZW5zaXRpdml0eVxuIik7CisKKwkvKiBDbGVhciBkcml2ZXIncyBzZW5zaXRpdml0eSBhbGdvIGRhdGEgKi8KKwlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKKworCWlmIChyYW5nZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEpKTsKKworCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPSAwOworCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOworCWRhdGEtPm5yZ19wcmV2X3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOworCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IDA7CisJZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKKwlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJZGF0YS0+bnJnX3ZhbHVlW2ldID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBpKyspCisJCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV0gPSAwOworCisJZGF0YS0+YXV0b19jb3JyX29mZG0gPSAgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG07CisJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0gcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjOworCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxICA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX3gxOworCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MTsKKwlkYXRhLT5hdXRvX2NvcnJfY2NrID0gQVVUT19DT1JSX0NDS19NSU5fVkFMX0RFRjsKKwlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2tfbXJjOworCWRhdGEtPm5yZ190aF9jY2sgPSByYW5nZXMtPm5yZ190aF9jY2s7CisJZGF0YS0+bnJnX3RoX29mZG0gPSByYW5nZXMtPm5yZ190aF9vZmRtOworCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbiA9IHJhbmdlcy0+YmFya2VyX2NvcnJfdGhfbWluOworCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMgPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmM7CisJZGF0YS0+bnJnX3RoX2NjYSA9IHJhbmdlcy0+bnJnX3RoX2NjYTsKKworCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSAwOworCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSAwOworCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IDA7CisJZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gMDsKKworCWlmIChwcml2LT5lbmhhbmNlX3NlbnNpdGl2aXR5X3RhYmxlKQorCQlyZXQgfD0gaXdsX2VuaGFuY2Vfc2Vuc2l0aXZpdHlfd3JpdGUocHJpdik7CisJZWxzZQorCQlyZXQgfD0gaXdsX3NlbnNpdGl2aXR5X3dyaXRlKHByaXYpOworCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDxyZXR1cm4gMHglWFxuIiwgcmV0KTsKK30KKwordm9pZCBpd2xfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpyZXNwKQoreworCXUzMiByeF9lbmFibGVfdGltZTsKKwl1MzIgZmFfY2NrOworCXUzMiBmYV9vZmRtOworCXUzMiBiYWRfcGxjcF9jY2s7CisJdTMyIGJhZF9wbGNwX29mZG07CisJdTMyIG5vcm1fZmFfb2ZkbTsKKwl1MzIgbm9ybV9mYV9jY2s7CisJc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpyeF9pbmZvOworCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSAqb2ZkbSwgKmNjazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfZGF0YSBzdGF0aXM7CisKKwlpZiAocHJpdi0+ZGlzYWJsZV9zZW5zX2NhbCkKKwkJcmV0dXJuOworCisJZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwlpZiAoIWl3bF9pc19hc3NvY2lhdGVkKHByaXYpKSB7CisJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDwgLSBub3QgYXNzb2NpYXRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmIChwcml2LT5jZmctPmJ0X3N0YXRpc3RpY3MpIHsKKwkJcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+CisJCQkgICAgICByeC5nZW5lcmFsLmNvbW1vbik7CisJCW9mZG0gPSAmKCgoc3RydWN0IGl3bF9idF9ub3RpZl9zdGF0aXN0aWNzICopcmVzcCktPnJ4Lm9mZG0pOworCQljY2sgPSAmKCgoc3RydWN0IGl3bF9idF9ub3RpZl9zdGF0aXN0aWNzICopcmVzcCktPnJ4LmNjayk7CisJfSBlbHNlIHsKKwkJcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+cnguZ2VuZXJhbCk7CisJCW9mZG0gPSAmKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopcmVzcCktPnJ4Lm9mZG0pOworCQljY2sgPSAmKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopcmVzcCktPnJ4LmNjayk7CisJfQorCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgeworCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IGludmFsaWQgZGF0YS5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBFeHRyYWN0IFN0YXRpc3RpY3M6ICovCisJcnhfZW5hYmxlX3RpbWUgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5jaGFubmVsX2xvYWQpOworCWZhX2NjayA9IGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KTsKKwlmYV9vZmRtID0gbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KTsKKwliYWRfcGxjcF9jY2sgPSBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKTsKKwliYWRfcGxjcF9vZmRtID0gbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpOworCisJc3RhdGlzLmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSA9CisJCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpOworCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2IgPQorCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9jID0KKwkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7CisJc3RhdGlzLmJlYWNvbl9lbmVyZ3lfYSA9CisJCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EpOworCXN0YXRpcy5iZWFjb25fZW5lcmd5X2IgPQorCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9iKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9jID0KKwkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlJV0xfREVCVUdfQ0FMSUIocHJpdiwgInJ4X2VuYWJsZV90aW1lID0gJXUgdXNlY3NcbiIsIHJ4X2VuYWJsZV90aW1lKTsKKworCWlmICghcnhfZW5hYmxlX3RpbWUpIHsKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICI8PCBSWCBFbmFibGUgVGltZSA9PSAwIVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGVzZSBzdGF0aXN0aWNzIGluY3JlYXNlIG1vbm90b25pY2FsbHksIGFuZCBkbyBub3QgcmVzZXQKKwkgKiAgIGF0IGVhY2ggYmVhY29uLiAgQ2FsY3VsYXRlIGRpZmZlcmVuY2UgZnJvbSBsYXN0IHZhbHVlLCBvciBqdXN0CisJICogICB1c2UgdGhlIG5ldyBzdGF0aXN0aWNzIHZhbHVlIGlmIGl0IGhhcyByZXNldCBvciB3cmFwcGVkIGFyb3VuZC4gKi8KKwlpZiAoZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrID4gYmFkX3BsY3BfY2NrKQorCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSBiYWRfcGxjcF9jY2s7CisJZWxzZSB7CisJCWJhZF9wbGNwX2NjayAtPSBkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2s7CisJCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayArPSBiYWRfcGxjcF9jY2s7CisJfQorCisJaWYgKGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPiBiYWRfcGxjcF9vZmRtKQorCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gYmFkX3BsY3Bfb2ZkbTsKKwllbHNlIHsKKwkJYmFkX3BsY3Bfb2ZkbSAtPSBkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtOworCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtICs9IGJhZF9wbGNwX29mZG07CisJfQorCisJaWYgKGRhdGEtPmxhc3RfZmFfY250X29mZG0gPiBmYV9vZmRtKQorCQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gZmFfb2ZkbTsKKwllbHNlIHsKKwkJZmFfb2ZkbSAtPSBkYXRhLT5sYXN0X2ZhX2NudF9vZmRtOworCQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtICs9IGZhX29mZG07CisJfQorCisJaWYgKGRhdGEtPmxhc3RfZmFfY250X2NjayA+IGZhX2NjaykKKwkJZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gZmFfY2NrOworCWVsc2UgeworCQlmYV9jY2sgLT0gZGF0YS0+bGFzdF9mYV9jbnRfY2NrOworCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2sgKz0gZmFfY2NrOworCX0KKworCS8qIFRvdGFsIGFib3J0ZWQgc2lnbmFsIGxvY2tzICovCisJbm9ybV9mYV9vZmRtID0gZmFfb2ZkbSArIGJhZF9wbGNwX29mZG07CisJbm9ybV9mYV9jY2sgPSBmYV9jY2sgKyBiYWRfcGxjcF9jY2s7CisKKwlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNjazogZmEgJXUgYmFkcCAldSAgb2ZkbTogZmEgJXUgYmFkcCAldVxuIiwgZmFfY2NrLAorCQkJYmFkX3BsY3BfY2NrLCBmYV9vZmRtLCBiYWRfcGxjcF9vZmRtKTsKKworCWl3bF9zZW5zX2F1dG9fY29ycl9vZmRtKHByaXYsIG5vcm1fZmFfb2ZkbSwgcnhfZW5hYmxlX3RpbWUpOworCWl3bF9zZW5zX2VuZXJneV9jY2socHJpdiwgbm9ybV9mYV9jY2ssIHJ4X2VuYWJsZV90aW1lLCAmc3RhdGlzKTsKKwlpZiAocHJpdi0+ZW5oYW5jZV9zZW5zaXRpdml0eV90YWJsZSkKKwkJaXdsX2VuaGFuY2Vfc2Vuc2l0aXZpdHlfd3JpdGUocHJpdik7CisJZWxzZQorCQlpd2xfc2Vuc2l0aXZpdHlfd3JpdGUocHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZmluZF9maXJzdF9jaGFpbih1OCBtYXNrKQoreworCWlmIChtYXNrICYgQU5UX0EpCisJCXJldHVybiBDSEFJTl9BOworCWlmIChtYXNrICYgQU5UX0IpCisJCXJldHVybiBDSEFJTl9COworCXJldHVybiBDSEFJTl9DOworfQorCisvKgorICogQWNjdW11bGF0ZSAyMCBiZWFjb25zIG9mIHNpZ25hbCBhbmQgbm9pc2Ugc3RhdGlzdGljcyBmb3IgZWFjaCBvZgorICogICAzIHJlY2VpdmVycy9hbnRlbm5hcy9yeC1jaGFpbnMsIHRoZW4gZmlndXJlIG91dDoKKyAqIDEpICBXaGljaCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgorICogMikgIERpZmZlcmVudGlhbCByeCBnYWluIHNldHRpbmdzIHRvIGJhbGFuY2UgdGhlIDMgcmVjZWl2ZXJzLgorICovCit2b2lkIGl3bF9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnN0YXRfcmVzcCkKK3sKKwlzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEgKmRhdGEgPSBOVUxMOworCisJdTMyIGNoYWluX25vaXNlX2E7CisJdTMyIGNoYWluX25vaXNlX2I7CisJdTMyIGNoYWluX25vaXNlX2M7CisJdTMyIGNoYWluX3NpZ19hOworCXUzMiBjaGFpbl9zaWdfYjsKKwl1MzIgY2hhaW5fc2lnX2M7CisJdTMyIGF2ZXJhZ2Vfc2lnW05VTV9SWF9DSEFJTlNdID0ge0lOSVRJQUxJWkFUSU9OX1ZBTFVFfTsKKwl1MzIgYXZlcmFnZV9ub2lzZVtOVU1fUlhfQ0hBSU5TXSA9IHtJTklUSUFMSVpBVElPTl9WQUxVRX07CisJdTMyIG1heF9hdmVyYWdlX3NpZzsKKwl1MTYgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaTsKKwl1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UgPSBNSU5fQVZFUkFHRV9OT0lTRV9NQVhfVkFMVUU7CisJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOworCXUxNiBpID0gMDsKKwl1MTYgcnhvbl9jaG51bSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOworCXUxNiBzdGF0X2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7CisJdTggcnhvbl9iYW5kMjQ7CisJdTggc3RhdF9iYW5kMjQ7CisJdTMyIGFjdGl2ZV9jaGFpbnMgPSAwOworCXU4IG51bV90eF9jaGFpbnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpyeF9pbmZvOworCXU4IGZpcnN0X2NoYWluOworCisJaWYgKHByaXYtPmRpc2FibGVfY2hhaW5fbm9pc2VfY2FsKQorCQlyZXR1cm47CisKKwlkYXRhID0gJihwcml2LT5jaGFpbl9ub2lzZV9kYXRhKTsKKworCS8qCisJICogQWNjdW11bGF0ZSBqdXN0IHRoZSBmaXJzdCAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiIGFmdGVyCisJICogdGhlIGZpcnN0IGFzc29jaWF0aW9uLCB0aGVuIHdlJ3JlIGRvbmUgZm9yZXZlci4KKwkgKi8KKwlpZiAoZGF0YS0+c3RhdGUgIT0gSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEUpIHsKKwkJaWYgKGRhdGEtPnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRSkKKwkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiV2FpdCBmb3Igbm9pc2UgY2FsaWIgcmVzZXRcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKSB7CisJCXJ4X2luZm8gPSAmKCgoc3RydWN0IGl3bF9idF9ub3RpZl9zdGF0aXN0aWNzICopc3RhdF9yZXNwKS0+CisJCQkgICAgICByeC5nZW5lcmFsLmNvbW1vbik7CisJfSBlbHNlIHsKKwkJcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilzdGF0X3Jlc3ApLT4KKwkJCSAgICAgIHJ4LmdlbmVyYWwpOworCX0KKwlpZiAocnhfaW5mby0+aW50ZXJmZXJlbmNlX2RhdGFfZmxhZyAhPSBJTlRFUkZFUkVOQ0VfREFUQV9BVkFJTEFCTEUpIHsKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICIgPDwgSW50ZXJmZXJlbmNlIGRhdGEgdW5hdmFpbGFibGVcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlyeG9uX2JhbmQyNCA9ICEhKHByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSyk7CisJcnhvbl9jaG51bSA9IGxlMTZfdG9fY3B1KHByaXYtPnN0YWdpbmdfcnhvbi5jaGFubmVsKTsKKwlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKSB7CisJCXN0YXRfYmFuZDI0ID0gISEoKChzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3MgKikKKwkJCQkgc3RhdF9yZXNwKS0+ZmxhZyAmCisJCQkJIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0JBTkRfMjRHX01TSyk7CisJCXN0YXRfY2hudW0gPSBsZTMyX3RvX2NwdSgoKHN0cnVjdCBpd2xfYnRfbm90aWZfc3RhdGlzdGljcyAqKQorCQkJCQkgc3RhdF9yZXNwKS0+ZmxhZykgPj4gMTY7CisJfSBlbHNlIHsKKwkJc3RhdF9iYW5kMjQgPSAhISgoKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqKQorCQkJCSBzdGF0X3Jlc3ApLT5mbGFnICYKKwkJCQkgU1RBVElTVElDU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLKTsKKwkJc3RhdF9jaG51bSA9IGxlMzJfdG9fY3B1KCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopCisJCQkJCSBzdGF0X3Jlc3ApLT5mbGFnKSA+PiAxNjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgYWNjdW11bGF0ZSBkYXRhIGZvciBqdXN0IHRoZSBhc3NvY2lhdGVkIGNoYW5uZWwKKwkgKiAgIChldmVuIGlmIHNjYW5uaW5nKS4gKi8KKwlpZiAoKHJ4b25fY2hudW0gIT0gc3RhdF9jaG51bSkgfHwgKHJ4b25fYmFuZDI0ICE9IHN0YXRfYmFuZDI0KSkgeworCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlN0YXRzIG5vdCBmcm9tIGNoYW49JWQsIGJhbmQyND0lZFxuIiwKKwkJCQlyeG9uX2NobnVtLCByeG9uX2JhbmQyNCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIEFjY3VtdWxhdGUgYmVhY29uIHN0YXRpc3RpY3MgdmFsdWVzIGFjcm9zcworCSAqICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIKKwkgKi8KKwljaGFpbl9ub2lzZV9hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmCisJCQkJSU5fQkFORF9GSUxURVI7CisJY2hhaW5fbm9pc2VfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYikgJgorCQkJCUlOX0JBTkRfRklMVEVSOworCWNoYWluX25vaXNlX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYKKwkJCQlJTl9CQU5EX0ZJTFRFUjsKKworCWNoYWluX3NpZ19hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKKwljaGFpbl9zaWdfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJY2hhaW5fc2lnX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJZGF0YS0+YmVhY29uX2NvdW50Kys7CisKKwlkYXRhLT5jaGFpbl9ub2lzZV9hID0gKGNoYWluX25vaXNlX2EgKyBkYXRhLT5jaGFpbl9ub2lzZV9hKTsKKwlkYXRhLT5jaGFpbl9ub2lzZV9iID0gKGNoYWluX25vaXNlX2IgKyBkYXRhLT5jaGFpbl9ub2lzZV9iKTsKKwlkYXRhLT5jaGFpbl9ub2lzZV9jID0gKGNoYWluX25vaXNlX2MgKyBkYXRhLT5jaGFpbl9ub2lzZV9jKTsKKworCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gKGNoYWluX3NpZ19hICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOworCWRhdGEtPmNoYWluX3NpZ25hbF9iID0gKGNoYWluX3NpZ19iICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOworCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gKGNoYWluX3NpZ19jICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2MpOworCisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJjaGFuPSVkLCBiYW5kMjQ9JWQsIGJlYWNvbj0lZFxuIiwKKwkJCXJ4b25fY2hudW0sIHJ4b25fYmFuZDI0LCBkYXRhLT5iZWFjb25fY291bnQpOworCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhaW5fc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwKKwkJCWNoYWluX3NpZ19hLCBjaGFpbl9zaWdfYiwgY2hhaW5fc2lnX2MpOworCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhaW5fbm9pc2U6IGEgJWQgYiAlZCBjICVkXG4iLAorCQkJY2hhaW5fbm9pc2VfYSwgY2hhaW5fbm9pc2VfYiwgY2hhaW5fbm9pc2VfYyk7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiLCBkZXRlcm1pbmU6CisJICogMSkgIERpc2Nvbm5lY3RlZCBhbnRlbm5hcyAodXNpbmcgc2lnbmFsIHN0cmVuZ3RocykKKwkgKiAyKSAgRGlmZmVyZW50aWFsIGdhaW4gKHVzaW5nIHNpbGVuY2Ugbm9pc2UpIHRvIGJhbGFuY2UgcmVjZWl2ZXJzICovCisJaWYgKGRhdGEtPmJlYWNvbl9jb3VudCAhPSBwcml2LT5jZmctPmNoYWluX25vaXNlX251bV9iZWFjb25zKQorCQlyZXR1cm47CisKKwkvKiBBbmFseXplIHNpZ25hbCBmb3IgZGlzY29ubmVjdGVkIGFudGVubmEgKi8KKwlhdmVyYWdlX3NpZ1swXSA9CisJCShkYXRhLT5jaGFpbl9zaWduYWxfYSkgLyBwcml2LT5jZmctPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCWF2ZXJhZ2Vfc2lnWzFdID0KKwkJKGRhdGEtPmNoYWluX3NpZ25hbF9iKSAvIHByaXYtPmNmZy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7CisJYXZlcmFnZV9zaWdbMl0gPQorCQkoZGF0YS0+Y2hhaW5fc2lnbmFsX2MpIC8gcHJpdi0+Y2ZnLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKworCWlmIChhdmVyYWdlX3NpZ1swXSA+PSBhdmVyYWdlX3NpZ1sxXSkgeworCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1swXTsKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDA7CisJCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKwl9IGVsc2UgeworCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1sxXTsKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDE7CisJCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKwl9CisKKwlpZiAoYXZlcmFnZV9zaWdbMl0gPj0gbWF4X2F2ZXJhZ2Vfc2lnKSB7CisJCW1heF9hdmVyYWdlX3NpZyA9IGF2ZXJhZ2Vfc2lnWzJdOworCQltYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pID0gMjsKKwkJYWN0aXZlX2NoYWlucyA9ICgxIDw8IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOworCX0KKworCUlXTF9ERUJVR19DQUxJQihwcml2LCAiYXZlcmFnZV9zaWc6IGEgJWQgYiAlZCBjICVkXG4iLAorCQkgICAgIGF2ZXJhZ2Vfc2lnWzBdLCBhdmVyYWdlX3NpZ1sxXSwgYXZlcmFnZV9zaWdbMl0pOworCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWF4X2F2ZXJhZ2Vfc2lnID0gJWQsIGFudGVubmEgJWRcbiIsCisJCSAgICAgbWF4X2F2ZXJhZ2Vfc2lnLCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKworCS8qIENvbXBhcmUgc2lnbmFsIHN0cmVuZ3RocyBmb3IgYWxsIDMgcmVjZWl2ZXJzLiAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKKwkJaWYgKGkgIT0gbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSkgeworCQkJczMyIHJzc2lfZGVsdGEgPSAobWF4X2F2ZXJhZ2Vfc2lnIC0gYXZlcmFnZV9zaWdbaV0pOworCisJCQkvKiBJZiBzaWduYWwgaXMgdmVyeSB3ZWFrLCBjb21wYXJlZCB3aXRoCisJCQkgKiBzdHJvbmdlc3QsIG1hcmsgaXQgYXMgZGlzY29ubmVjdGVkLiAqLworCQkJaWYgKHJzc2lfZGVsdGEgPiBNQVhJTVVNX0FMTE9XRURfUEFUSExPU1MpCisJCQkJZGF0YS0+ZGlzY29ubl9hcnJheVtpXSA9IDE7CisJCQllbHNlCisJCQkJYWN0aXZlX2NoYWlucyB8PSAoMSA8PCBpKTsKKwkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiaSA9ICVkICByc3NpRGVsdGEgPSAlZCAgIgorCQkJICAgICAiZGlzY29ubl9hcnJheVtpXSA9ICVkXG4iLAorCQkJICAgICBpLCByc3NpX2RlbHRhLCBkYXRhLT5kaXNjb25uX2FycmF5W2ldKTsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGFib3ZlIGFsZ29yaXRobSBzb21ldGltZXMgZmFpbHMgd2hlbiB0aGUgdWNvZGUKKwkgKiByZXBvcnRzIDAgZm9yIGFsbCBjaGFpbnMuIEl0J3Mgbm90IGNsZWFyIHdoeSB0aGF0CisJICogaGFwcGVucyB0byBzdGFydCB3aXRoLCBidXQgaXQgaXMgdGhlbiBjYXVzaW5nIHRyb3VibGUKKwkgKiBiZWNhdXNlIHRoaXMgY2FuIG1ha2UgdXMgZW5hYmxlIG1vcmUgY2hhaW5zIHRoYW4gdGhlCisJICogaGFyZHdhcmUgcmVhbGx5IGhhcy4KKwkgKgorCSAqIFRvIGJlIHNhZmUsIHNpbXBseSBtYXNrIG91dCBhbnkgY2hhaW5zIHRoYXQgd2Uga25vdworCSAqIGFyZSBub3Qgb24gdGhlIGRldmljZS4KKwkgKi8KKwlhY3RpdmVfY2hhaW5zICY9IHByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7CisKKwludW1fdHhfY2hhaW5zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7CisJCS8qIGxvb3BzIG9uIGFsbCB0aGUgYml0cyBvZgorCQkgKiBwcml2LT5od19zZXR0aW5nLnZhbGlkX3R4X2FudCAqLworCQl1OCBhbnRfbXNrID0gKDEgPDwgaSk7CisJCWlmICghKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBhbnRfbXNrKSkKKwkJCWNvbnRpbnVlOworCisJCW51bV90eF9jaGFpbnMrKzsKKwkJaWYgKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gPT0gMCkKKwkJCS8qIHRoZXJlIGlzIGEgVHggYW50ZW5uYSBjb25uZWN0ZWQgKi8KKwkJCWJyZWFrOworCQlpZiAobnVtX3R4X2NoYWlucyA9PSBwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bSAmJgorCQkgICAgZGF0YS0+ZGlzY29ubl9hcnJheVtpXSkgeworCQkJLyoKKwkJCSAqIElmIGFsbCBjaGFpbnMgYXJlIGRpc2Nvbm5lY3RlZAorCQkJICogY29ubmVjdCB0aGUgZmlyc3QgdmFsaWQgdHggY2hhaW4KKwkJCSAqLworCQkJZmlyc3RfY2hhaW4gPQorCQkJCWZpbmRfZmlyc3RfY2hhaW4ocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQpOworCQkJZGF0YS0+ZGlzY29ubl9hcnJheVtmaXJzdF9jaGFpbl0gPSAwOworCQkJYWN0aXZlX2NoYWlucyB8PSBCSVQoZmlyc3RfY2hhaW4pOworCQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJBbGwgVHggY2hhaW5zIGFyZSBkaXNjb25uZWN0ZWQgVy9BIC0gZGVjbGFyZSAlZCBhcyBjb25uZWN0ZWRcbiIsCisJCQkJCWZpcnN0X2NoYWluKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGFjdGl2ZV9jaGFpbnMgIT0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCAmJgorCSAgICBhY3RpdmVfY2hhaW5zICE9IHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsCisJCQkJIkRldGVjdGVkIHRoYXQgbm90IGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkISAiCisJCQkJIkNvbm5lY3RlZDogJSN4LCB2YWxpZDogJSN4LlxuIiwKKwkJCQlhY3RpdmVfY2hhaW5zLCBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50KTsKKworCS8qIFNhdmUgZm9yIHVzZSB3aXRoaW4gUlhPTiwgVFgsIFNDQU4gY29tbWFuZHMsIGV0Yy4gKi8KKwlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMgPSBhY3RpdmVfY2hhaW5zOworCUlXTF9ERUJVR19DQUxJQihwcml2LCAiYWN0aXZlX2NoYWlucyAoYml0d2lzZSkgPSAweCV4XG4iLAorCQkJYWN0aXZlX2NoYWlucyk7CisKKwkvKiBBbmFseXplIG5vaXNlIGZvciByeCBiYWxhbmNlICovCisJYXZlcmFnZV9ub2lzZVswXSA9CisJCSgoZGF0YS0+Y2hhaW5fbm9pc2VfYSkgLyBwcml2LT5jZmctPmNoYWluX25vaXNlX251bV9iZWFjb25zKTsKKwlhdmVyYWdlX25vaXNlWzFdID0KKwkJKChkYXRhLT5jaGFpbl9ub2lzZV9iKSAvIHByaXYtPmNmZy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMpOworCWF2ZXJhZ2Vfbm9pc2VbMl0gPQorCQkoKGRhdGEtPmNoYWluX25vaXNlX2MpIC8gcHJpdi0+Y2ZnLT5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7CisJCWlmICghKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pICYmCisJCSAgIChhdmVyYWdlX25vaXNlW2ldIDw9IG1pbl9hdmVyYWdlX25vaXNlKSkgeworCQkJLyogVGhpcyBtZWFucyB0aGF0IGNoYWluIGkgaXMgYWN0aXZlIGFuZCBoYXMKKwkJCSAqIGxvd2VyIG5vaXNlIHZhbHVlcyBzbyBmYXI6ICovCisJCQltaW5fYXZlcmFnZV9ub2lzZSA9IGF2ZXJhZ2Vfbm9pc2VbaV07CisJCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kgPSBpOworCQl9CisJfQorCisJSVdMX0RFQlVHX0NBTElCKHByaXYsICJhdmVyYWdlX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwKKwkJCWF2ZXJhZ2Vfbm9pc2VbMF0sIGF2ZXJhZ2Vfbm9pc2VbMV0sCisJCQlhdmVyYWdlX25vaXNlWzJdKTsKKworCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWluX2F2ZXJhZ2Vfbm9pc2UgPSAlZCwgYW50ZW5uYSAlZFxuIiwKKwkJCW1pbl9hdmVyYWdlX25vaXNlLCBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kpOworCisJaWYgKHByaXYtPmNmZy0+b3BzLT51dGlscy0+Z2Fpbl9jb21wdXRhdGlvbikKKwkJcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5nYWluX2NvbXB1dGF0aW9uKHByaXYsIGF2ZXJhZ2Vfbm9pc2UsCisJCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCBtaW5fYXZlcmFnZV9ub2lzZSwKKwkJCQlmaW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSk7CisKKwkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCisJICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KKwkgKi8KKwlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQorCQlwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MocHJpdik7CisKKwlkYXRhLT5zdGF0ZSA9IElXTF9DSEFJTl9OT0lTRV9ET05FOworCWl3bF9wb3dlcl91cGRhdGVfbW9kZShwcml2LCBmYWxzZSk7Cit9CisKK3ZvaWQgaXdsX3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKwltZW1zZXQoJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSkpOworCW1lbXNldCgmKHByaXYtPmNoYWluX25vaXNlX2RhdGEpLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhKSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykKKwkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5kZWx0YV9nYWluX2NvZGVbaV0gPQorCQkJCUNIQUlOX05PSVNFX0RFTFRBX0dBSU5fSU5JVF9WQUw7CisKKwkvKiBBc2sgZm9yIHN0YXRpc3RpY3Mgbm93LCB0aGUgdUNvZGUgd2lsbCBzZW5kIG5vdGlmaWNhdGlvbgorCSAqIHBlcmlvZGljYWxseSBhZnRlciBhc3NvY2lhdGlvbiAqLworCWl3bF9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfQVNZTkMsIHRydWUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1kZWJ1Z2ZzLmMKaW5kZXggNDhjMDIzYi4uZjA1MmM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWRlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tZGVidWdmcy5jCkBAIC0yOCw2ICsyOCwzMCBAQAogCiAjaW5jbHVkZSAiaXdsLWFnbi1kZWJ1Z2ZzLmgiCiAKK3N0YXRpYyBpbnQgaXdsX3N0YXRpc3RpY3NfZmxhZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6KQoreworCWludCBwID0gMDsKKwl1MzIgZmxhZzsKKworCWlmIChwcml2LT5jZmctPmJ0X3N0YXRpc3RpY3MpCisJCWZsYWcgPSBsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQuZmxhZyk7CisJZWxzZQorCQlmbGFnID0gbGUzMl90b19jcHUocHJpdi0+X2Fnbi5zdGF0aXN0aWNzLmZsYWcpOworCisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiU3RhdGlzdGljcyBGbGFnKDB4JVgpOlxuIiwgZmxhZyk7CisJaWYgKGZsYWcgJiBVQ09ERV9TVEFUSVNUSUNTX0NMRUFSX01TSykKKwkJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLAorCQkiXHRTdGF0aXN0aWNzIGhhdmUgYmVlbiBjbGVhcmVkXG4iKTsKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJcdE9wZXJhdGlvbmFsIEZyZXF1ZW5jeTogJXNcbiIsCisJCShmbGFnICYgVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLKQorCQk/ICIyLjQgR0h6IiA6ICI1LjIgR0h6Iik7CisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRUR2ogTmFycm93IEJhbmQ6ICVzXG4iLAorCQkoZmxhZyAmIFVDT0RFX1NUQVRJU1RJQ1NfTkFSUk9XX0JBTkRfTVNLKQorCQkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCXJldHVybiBwOworfQorCiBzc2l6ZV90IGl3bF91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiAgIHsKQEAgLTU4LDI0ICs4Miw0NSBAQAogCSAqIHRoZSBsYXN0IHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKIAkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQogCSAqLwotCW9mZG0gPSAmcHJpdi0+c3RhdGlzdGljcy5yeC5vZmRtOwotCWNjayA9ICZwcml2LT5zdGF0aXN0aWNzLnJ4LmNjazsKLQlnZW5lcmFsID0gJnByaXYtPnN0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQlodCA9ICZwcml2LT5zdGF0aXN0aWNzLnJ4Lm9mZG1faHQ7Ci0JYWNjdW1fb2ZkbSA9ICZwcml2LT5hY2N1bV9zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JYWNjdW1fY2NrID0gJnByaXYtPmFjY3VtX3N0YXRpc3RpY3MucnguY2NrOwotCWFjY3VtX2dlbmVyYWwgPSAmcHJpdi0+YWNjdW1fc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWFjY3VtX2h0ID0gJnByaXYtPmFjY3VtX3N0YXRpc3RpY3Mucngub2ZkbV9odDsKLQlkZWx0YV9vZmRtID0gJnByaXYtPmRlbHRhX3N0YXRpc3RpY3Mucngub2ZkbTsKLQlkZWx0YV9jY2sgPSAmcHJpdi0+ZGVsdGFfc3RhdGlzdGljcy5yeC5jY2s7Ci0JZGVsdGFfZ2VuZXJhbCA9ICZwcml2LT5kZWx0YV9zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JZGVsdGFfaHQgPSAmcHJpdi0+ZGVsdGFfc3RhdGlzdGljcy5yeC5vZmRtX2h0OwotCW1heF9vZmRtID0gJnByaXYtPm1heF9kZWx0YS5yeC5vZmRtOwotCW1heF9jY2sgPSAmcHJpdi0+bWF4X2RlbHRhLnJ4LmNjazsKLQltYXhfZ2VuZXJhbCA9ICZwcml2LT5tYXhfZGVsdGEucnguZ2VuZXJhbDsKLQltYXhfaHQgPSAmcHJpdi0+bWF4X2RlbHRhLnJ4Lm9mZG1faHQ7CisJaWYgKHByaXYtPmNmZy0+YnRfc3RhdGlzdGljcykgeworCQlvZmRtID0gJnByaXYtPl9hZ24uc3RhdGlzdGljc19idC5yeC5vZmRtOworCQljY2sgPSAmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzX2J0LnJ4LmNjazsKKwkJZ2VuZXJhbCA9ICZwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQucnguZ2VuZXJhbC5jb21tb247CisJCWh0ID0gJnByaXYtPl9hZ24uc3RhdGlzdGljc19idC5yeC5vZmRtX2h0OworCQlhY2N1bV9vZmRtID0gJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljc19idC5yeC5vZmRtOworCQlhY2N1bV9jY2sgPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzX2J0LnJ4LmNjazsKKwkJYWNjdW1fZ2VuZXJhbCA9CisJCQkmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzX2J0LnJ4LmdlbmVyYWwuY29tbW9uOworCQlhY2N1bV9odCA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3NfYnQucngub2ZkbV9odDsKKwkJZGVsdGFfb2ZkbSA9ICZwcml2LT5fYWduLmRlbHRhX3N0YXRpc3RpY3NfYnQucngub2ZkbTsKKwkJZGVsdGFfY2NrID0gJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljc19idC5yeC5jY2s7CisJCWRlbHRhX2dlbmVyYWwgPQorCQkJJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljc19idC5yeC5nZW5lcmFsLmNvbW1vbjsKKwkJZGVsdGFfaHQgPSAmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzX2J0LnJ4Lm9mZG1faHQ7CisJCW1heF9vZmRtID0gJnByaXYtPl9hZ24ubWF4X2RlbHRhX2J0LnJ4Lm9mZG07CisJCW1heF9jY2sgPSAmcHJpdi0+X2Fnbi5tYXhfZGVsdGFfYnQucnguY2NrOworCQltYXhfZ2VuZXJhbCA9ICZwcml2LT5fYWduLm1heF9kZWx0YV9idC5yeC5nZW5lcmFsLmNvbW1vbjsKKwkJbWF4X2h0ID0gJnByaXYtPl9hZ24ubWF4X2RlbHRhX2J0LnJ4Lm9mZG1faHQ7CisJfSBlbHNlIHsKKwkJb2ZkbSA9ICZwcml2LT5fYWduLnN0YXRpc3RpY3Mucngub2ZkbTsKKwkJY2NrID0gJnByaXYtPl9hZ24uc3RhdGlzdGljcy5yeC5jY2s7CisJCWdlbmVyYWwgPSAmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7CisJCWh0ID0gJnByaXYtPl9hZ24uc3RhdGlzdGljcy5yeC5vZmRtX2h0OworCQlhY2N1bV9vZmRtID0gJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljcy5yeC5vZmRtOworCQlhY2N1bV9jY2sgPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzLnJ4LmNjazsKKwkJYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKKwkJYWNjdW1faHQgPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzLnJ4Lm9mZG1faHQ7CisJCWRlbHRhX29mZG0gPSAmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzLnJ4Lm9mZG07CisJCWRlbHRhX2NjayA9ICZwcml2LT5fYWduLmRlbHRhX3N0YXRpc3RpY3MucnguY2NrOworCQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljcy5yeC5nZW5lcmFsOworCQlkZWx0YV9odCA9ICZwcml2LT5fYWduLmRlbHRhX3N0YXRpc3RpY3Mucngub2ZkbV9odDsKKwkJbWF4X29mZG0gPSAmcHJpdi0+X2Fnbi5tYXhfZGVsdGEucngub2ZkbTsKKwkJbWF4X2NjayA9ICZwcml2LT5fYWduLm1heF9kZWx0YS5yeC5jY2s7CisJCW1heF9nZW5lcmFsID0gJnByaXYtPl9hZ24ubWF4X2RlbHRhLnJ4LmdlbmVyYWw7CisJCW1heF9odCA9ICZwcml2LT5fYWduLm1heF9kZWx0YS5yeC5vZmRtX2h0OworCX0KIAotCXBvcyArPSBpd2xfZGJnZnNfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOworCXBvcyArPSBpd2xfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgogCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKIAkJCSAiU3RhdGlzdGljc19SeCAtIE9GRE06Iik7CkBAIC01MzksMTEgKzU4NCwxOSBAQAogCSAgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCiAJICAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CiAJICAqLwotCXR4ID0gJnByaXYtPnN0YXRpc3RpY3MudHg7Ci0JYWNjdW1fdHggPSAmcHJpdi0+YWNjdW1fc3RhdGlzdGljcy50eDsKLQlkZWx0YV90eCA9ICZwcml2LT5kZWx0YV9zdGF0aXN0aWNzLnR4OwotCW1heF90eCA9ICZwcml2LT5tYXhfZGVsdGEudHg7Ci0JcG9zICs9IGl3bF9kYmdmc19zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7CisJaWYgKHByaXYtPmNmZy0+YnRfc3RhdGlzdGljcykgeworCQl0eCA9ICZwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQudHg7CisJCWFjY3VtX3R4ID0gJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljc19idC50eDsKKwkJZGVsdGFfdHggPSAmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzX2J0LnR4OworCQltYXhfdHggPSAmcHJpdi0+X2Fnbi5tYXhfZGVsdGFfYnQudHg7CisJfSBlbHNlIHsKKwkJdHggPSAmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzLnR4OworCQlhY2N1bV90eCA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3MudHg7CisJCWRlbHRhX3R4ID0gJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljcy50eDsKKwkJbWF4X3R4ID0gJnByaXYtPl9hZ24ubWF4X2RlbHRhLnR4OworCX0KKworCXBvcyArPSBpd2xfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgICIlLTMycyAgICAgY3VycmVudCIKIAkJCSAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCiAJCQkgIlN0YXRpc3RpY3NfVHg6Iik7CkBAIC03MzgsOCArNzkxLDggQEAKIAljaGFyICpidWY7CiAJaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWwpICogMTAgKyAzMDA7CiAJc3NpemVfdCByZXQ7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbCAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbCAqZGVsdGFfZ2VuZXJhbCwgKm1heF9nZW5lcmFsOworCXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZGVsdGFfZ2VuZXJhbCwgKm1heF9nZW5lcmFsOwogCXN0cnVjdCBzdGF0aXN0aWNzX2RiZyAqZGJnLCAqYWNjdW1fZGJnLCAqZGVsdGFfZGJnLCAqbWF4X2RiZzsKIAlzdHJ1Y3Qgc3RhdGlzdGljc19kaXYgKmRpdiwgKmFjY3VtX2RpdiwgKmRlbHRhX2RpdiwgKm1heF9kaXY7CiAKQEAgLTc1NiwxOSArODA5LDM1IEBACiAJICAqIHRoZSBsYXN0IHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKIAkgICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKIAkgICovCi0JZ2VuZXJhbCA9ICZwcml2LT5zdGF0aXN0aWNzLmdlbmVyYWw7Ci0JZGJnID0gJnByaXYtPnN0YXRpc3RpY3MuZ2VuZXJhbC5kYmc7Ci0JZGl2ID0gJnByaXYtPnN0YXRpc3RpY3MuZ2VuZXJhbC5kaXY7Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWw7Ci0JZGVsdGFfZ2VuZXJhbCA9ICZwcml2LT5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWw7Ci0JbWF4X2dlbmVyYWwgPSAmcHJpdi0+bWF4X2RlbHRhLmdlbmVyYWw7Ci0JYWNjdW1fZGJnID0gJnByaXYtPmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5kYmc7Ci0JZGVsdGFfZGJnID0gJnByaXYtPmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5kYmc7Ci0JbWF4X2RiZyA9ICZwcml2LT5tYXhfZGVsdGEuZ2VuZXJhbC5kYmc7Ci0JYWNjdW1fZGl2ID0gJnByaXYtPmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5kaXY7Ci0JZGVsdGFfZGl2ID0gJnByaXYtPmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5kaXY7Ci0JbWF4X2RpdiA9ICZwcml2LT5tYXhfZGVsdGEuZ2VuZXJhbC5kaXY7Ci0JcG9zICs9IGl3bF9kYmdmc19zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7CisJaWYgKHByaXYtPmNmZy0+YnRfc3RhdGlzdGljcykgeworCQlnZW5lcmFsID0gJnByaXYtPl9hZ24uc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbjsKKwkJZGJnID0gJnByaXYtPl9hZ24uc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbi5kYmc7CisJCWRpdiA9ICZwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQuZ2VuZXJhbC5jb21tb24uZGl2OworCQlhY2N1bV9nZW5lcmFsID0gJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbjsKKwkJYWNjdW1fZGJnID0gJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbi5kYmc7CisJCWFjY3VtX2RpdiA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3NfYnQuZ2VuZXJhbC5jb21tb24uZGl2OworCQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbjsKKwkJbWF4X2dlbmVyYWwgPSAmcHJpdi0+X2Fnbi5tYXhfZGVsdGFfYnQuZ2VuZXJhbC5jb21tb247CisJCWRlbHRhX2RiZyA9ICZwcml2LT5fYWduLmRlbHRhX3N0YXRpc3RpY3NfYnQuZ2VuZXJhbC5jb21tb24uZGJnOworCQltYXhfZGJnID0gJnByaXYtPl9hZ24ubWF4X2RlbHRhX2J0LmdlbmVyYWwuY29tbW9uLmRiZzsKKwkJZGVsdGFfZGl2ID0gJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbi5kaXY7CisJCW1heF9kaXYgPSAmcHJpdi0+X2Fnbi5tYXhfZGVsdGFfYnQuZ2VuZXJhbC5jb21tb24uZGl2OworCX0gZWxzZSB7CisJCWdlbmVyYWwgPSAmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uOworCQlkYmcgPSAmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRiZzsKKwkJZGl2ID0gJnByaXYtPl9hZ24uc3RhdGlzdGljcy5nZW5lcmFsLmNvbW1vbi5kaXY7CisJCWFjY3VtX2dlbmVyYWwgPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uOworCQlhY2N1bV9kYmcgPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRiZzsKKwkJYWNjdW1fZGl2ID0gJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLmNvbW1vbi5kaXY7CisJCWRlbHRhX2dlbmVyYWwgPSAmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uOworCQltYXhfZ2VuZXJhbCA9ICZwcml2LT5fYWduLm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbjsKKwkJZGVsdGFfZGJnID0gJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljcy5nZW5lcmFsLmNvbW1vbi5kYmc7CisJCW1heF9kYmcgPSAmcHJpdi0+X2Fnbi5tYXhfZGVsdGEuZ2VuZXJhbC5jb21tb24uZGJnOworCQlkZWx0YV9kaXYgPSAmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKKwkJbWF4X2RpdiA9ICZwcml2LT5fYWduLm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbi5kaXY7CisJfQorCisJcG9zICs9IGl3bF9zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCiAJCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAogCQkJICJTdGF0aXN0aWNzX0dlbmVyYWw6Iik7CkBAIC03OTIsNiArODYxLDEzIEBACiAJCQkgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKIAkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAorCQkJICJ3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY291bnQ6IiwKKwkJCSBsZTMyX3RvX2NwdShkYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQpLAorCQkJIGFjY3VtX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKKwkJCSBkZWx0YV9kYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQsCisJCQkgbWF4X2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCk7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCiAJCQkgInNsZWVwX3RpbWU6IiwKIAkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbGVlcF90aW1lKSwKIAkJCSBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLApAQCAtODQ4LDMgKzkyNCw5MCBAQAogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KKworc3NpemVfdCBpd2xfdWNvZGVfYnRfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gKHNpemVvZihzdHJ1Y3Qgc3RhdGlzdGljc19idF9hY3Rpdml0eSkgKiAyNCkgKyAyMDA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHN0YXRpc3RpY3NfYnRfYWN0aXZpdHkgKmJ0LCAqYWNjdW1fYnQ7CisKKwlpZiAoIWl3bF9pc19hbGl2ZShwcml2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBtYWtlIHJlcXVlc3QgdG8gdUNvZGUgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBpbmZvcm1hdGlvbiAqLworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlyZXQgPSBpd2xfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgQ01EX1NZTkMsIGZhbHNlKTsKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LAorCQkJIkVycm9yIHNlbmRpbmcgc3RhdGlzdGljcyByZXF1ZXN0OiAlemRcbiIsIHJldCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCisJICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKKwkgKi8KKwlidCA9ICZwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQuZ2VuZXJhbC5hY3Rpdml0eTsKKwlhY2N1bV9idCA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3NfYnQuZ2VuZXJhbC5hY3Rpdml0eTsKKworCXBvcyArPSBpd2xfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlN0YXRpc3RpY3NfQlQ6XG4iKTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkiXHRcdFx0Y3VycmVudFx0XHRcdGFjY3VtdWxhdGl2ZVxuIik7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICJoaV9wcmlvcml0eV90eF9yZXFfY250Olx0XHQldVx0XHRcdCV1XG4iLAorCQkJIGxlMzJfdG9fY3B1KGJ0LT5oaV9wcmlvcml0eV90eF9yZXFfY250KSwKKwkJCSBhY2N1bV9idC0+aGlfcHJpb3JpdHlfdHhfcmVxX2NudCk7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICJoaV9wcmlvcml0eV90eF9kZW5pZWRfY250Olx0JXVcdFx0XHQldVxuIiwKKwkJCSBsZTMyX3RvX2NwdShidC0+aGlfcHJpb3JpdHlfdHhfZGVuaWVkX2NudCksCisJCQkgYWNjdW1fYnQtPmhpX3ByaW9yaXR5X3R4X2RlbmllZF9jbnQpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAibG9fcHJpb3JpdHlfdHhfcmVxX2NudDpcdFx0JXVcdFx0XHQldVxuIiwKKwkJCSBsZTMyX3RvX2NwdShidC0+bG9fcHJpb3JpdHlfdHhfcmVxX2NudCksCisJCQkgYWNjdW1fYnQtPmxvX3ByaW9yaXR5X3R4X3JlcV9jbnQpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAibG9fcHJpb3JpdHlfcnhfZGVuaWVkX2NudDpcdCV1XHRcdFx0JXVcbiIsCisJCQkgbGUzMl90b19jcHUoYnQtPmxvX3ByaW9yaXR5X3R4X2RlbmllZF9jbnQpLAorCQkJIGFjY3VtX2J0LT5sb19wcmlvcml0eV90eF9kZW5pZWRfY250KTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgImhpX3ByaW9yaXR5X3J4X3JlcV9jbnQ6XHRcdCV1XHRcdFx0JXVcbiIsCisJCQkgbGUzMl90b19jcHUoYnQtPmhpX3ByaW9yaXR5X3J4X3JlcV9jbnQpLAorCQkJIGFjY3VtX2J0LT5oaV9wcmlvcml0eV9yeF9yZXFfY250KTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgImhpX3ByaW9yaXR5X3J4X2RlbmllZF9jbnQ6XHQldVx0XHRcdCV1XG4iLAorCQkJIGxlMzJfdG9fY3B1KGJ0LT5oaV9wcmlvcml0eV9yeF9kZW5pZWRfY250KSwKKwkJCSBhY2N1bV9idC0+aGlfcHJpb3JpdHlfcnhfZGVuaWVkX2NudCk7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICJsb19wcmlvcml0eV9yeF9yZXFfY250Olx0XHQldVx0XHRcdCV1XG4iLAorCQkJIGxlMzJfdG9fY3B1KGJ0LT5sb19wcmlvcml0eV9yeF9yZXFfY250KSwKKwkJCSBhY2N1bV9idC0+bG9fcHJpb3JpdHlfcnhfcmVxX2NudCk7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICJsb19wcmlvcml0eV9yeF9kZW5pZWRfY250Olx0JXVcdFx0XHQldVxuIiwKKwkJCSBsZTMyX3RvX2NwdShidC0+bG9fcHJpb3JpdHlfcnhfZGVuaWVkX2NudCksCisJCQkgYWNjdW1fYnQtPmxvX3ByaW9yaXR5X3J4X2RlbmllZF9jbnQpOworCisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICIocngpbnVtX2J0X2tpbGxzOlx0XHQldVx0XHRcdCV1XG4iLAorCQkJIGxlMzJfdG9fY3B1KHByaXYtPl9hZ24uc3RhdGlzdGljc19idC5yeC4KKwkJCQlnZW5lcmFsLm51bV9idF9raWxscyksCisJCQkgcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzX2J0LnJ4LgorCQkJCWdlbmVyYWwubnVtX2J0X2tpbGxzKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1kZWJ1Z2ZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tZGVidWdmcy5oCmluZGV4IDU5YjFmMjUuLmJiZGNlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1kZWJ1Z2ZzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWRlYnVnZnMuaApAQCAtMzcsNiArMzcsOCBAQAogCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKIHNzaXplX3QgaXdsX3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBpd2xfdWNvZGVfYnRfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKICNlbHNlCiBzdGF0aWMgc3NpemVfdCBpd2xfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTUzLDQgKzU1LDkgQEAKIHsKIAlyZXR1cm4gMDsKIH0KK3N0YXRpYyBzc2l6ZV90IGl3bF91Y29kZV9idF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taGNtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWhjbWQuYwppbmRleCAwMTY1OGNmLi5hNzIxNmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taGNtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJpd2wtaW8uaCIKICNpbmNsdWRlICJpd2wtYWduLmgiCiAKLXN0YXRpYyBpbnQgaXdsYWduX3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitpbnQgaXdsYWduX3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGl3bDUwMDBfcnhvbl9hc3NvY19jbWQgcnhvbl9hc3NvYzsKQEAgLTg0LDcgKzg0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGl3bGFnbl9zZW5kX3R4X2FudF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCB2YWxpZF90eF9hbnQpCitpbnQgaXdsYWduX3NlbmRfdHhfYW50X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHZhbGlkX3R4X2FudCkKIHsKIAlzdHJ1Y3QgaXdsX3R4X2FudF9jb25maWdfY21kIHR4X2FudF9jbWQgPSB7CiAJICAudmFsaWQgPSBjcHVfdG9fbGUzMih2YWxpZF90eF9hbnQpLApAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAotCQljbWQuaGRyLm9wX2NvZGUgPSBJV0xfUEhZX0NBTElCUkFURV9DSEFJTl9OT0lTRV9HQUlOX0NNRDsKKwkJY21kLmhkci5vcF9jb2RlID0gcHJpdi0+X2Fnbi5waHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7CiAJCWNtZC5oZHIuZmlyc3RfZ3JvdXAgPSAwOwogCQljbWQuaGRyLmdyb3Vwc19udW0gPSAxOwogCQljbWQuaGRyLmRhdGFfdmFsaWQgPSAxOwpAQCAtMTc2LDE0ICsxNzYsNiBAQAogCQlkYXRhLT5yYWRpb193cml0ZSA9IDE7CiAJCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0NBTElCUkFURUQ7CiAJfQotCi0JZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IDA7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYiA9IDA7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7Ci0JZGF0YS0+Y2hhaW5fc2lnbmFsX2EgPSAwOwotCWRhdGEtPmNoYWluX3NpZ25hbF9iID0gMDsKLQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7Ci0JZGF0YS0+YmVhY29uX2NvdW50ID0gMDsKIH0KIAogc3RhdGljIHZvaWQgaXdsYWduX2NoYWluX25vaXNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKQEAgLTE5MSwxMSArMTgzLDIxIEBACiAJc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJnByaXYtPmNoYWluX25vaXNlX2RhdGE7CiAJaW50IHJldDsKIAotCWlmICgoZGF0YS0+c3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0FMSVZFKSAmJiBpd2xfaXNfYXNzb2NpYXRlZChwcml2KSkgeworCWlmICgoZGF0YS0+c3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0FMSVZFKSAmJgorCSAgICAgaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikpIHsKIAkJc3RydWN0IGl3bF9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQgY21kOwotCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCi0JCWNtZC5oZHIub3BfY29kZSA9IElXTF9QSFlfQ0FMSUJSQVRFX0NIQUlOX05PSVNFX1JFU0VUX0NNRDsKKwkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCisJCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOworCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKKwkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7CisJCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKKwkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOworCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7CisJCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmhkci5vcF9jb2RlID0gcHJpdi0+X2Fnbi5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kOwogCQljbWQuaGRyLmZpcnN0X2dyb3VwID0gMDsKIAkJY21kLmhkci5ncm91cHNfbnVtID0gMTsKIAkJY21kLmhkci5kYXRhX3ZhbGlkID0gMTsKQEAgLTIxMiw3ICsyMTQsNyBAQAogc3RhdGljIHZvaWQgaXdsYWduX3J0c190eF9jbWRfZmxhZyhzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCiAJCQlfX2xlMzIgKnR4X2ZsYWdzKQogewotCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1JUU19DVFNfTVNLOworCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1BST1RfUkVRVUlSRV9NU0s7CiB9CiAKIC8qIENhbGMgbWF4IHNpZ25hbCBsZXZlbCAoZEJtKSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaAppbmRleCBmOWEzZmJiLi5hNTJiODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaApAQCAtMTEyLDcgKzExMiw3IEBACiAgKi8KIHN0cnVjdCBpd2xhZ25fc2NkX2JjX3RibCB7CiAJX19sZTE2IHRmZF9vZmZzZXRbVEZEX1FVRVVFX0JDX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKICNlbmRpZiAvKiBfX2l3bF9hZ25faHdfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMKaW5kZXggMGYyOTJhMi4uYTFiNmQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1saWIuYwpAQCAtNzcsNyArNzcsNyBAQAogCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIFN0YXJ0SWR4PSVkIGlkeD0lZFxuIiwKIAkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCBhZ2ctPnN0YXJ0X2lkeCwgaWR4KTsKIAotCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2JbMF0pOworCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpOwogCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKIAkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7CiAJCWluZm8tPmZsYWdzIHw9IGl3bF90eF9zdGF0dXNfdG9fbWFjODAyMTEoc3RhdHVzKTsKQEAgLTkzLDYgKzkzLDEyIEBACiAJfSBlbHNlIHsKIAkJLyogVHdvIG9yIG1vcmUgZnJhbWVzIHdlcmUgYXR0ZW1wdGVkOyBleHBlY3QgYmxvY2stYWNrICovCiAJCXU2NCBiaXRtYXAgPSAwOworCisJCS8qCisJCSAqIFN0YXJ0IGlzIHRoZSBsb3dlc3QgZnJhbWUgc2VudC4gSXQgbWF5IG5vdCBiZSB0aGUgZmlyc3QKKwkJICogZnJhbWUgaW4gdGhlIGJhdGNoOyB3ZSBmaWd1cmUgdGhpcyBvdXQgZHluYW1pY2FsbHkgZHVyaW5nCisJCSAqIHRoZSBmb2xsb3dpbmcgbG9vcC4KKwkJICovCiAJCWludCBzdGFydCA9IGFnZy0+c3RhcnRfaWR4OwogCiAJCS8qIENvbnN0cnVjdCBiaXQtbWFwIG9mIHBlbmRpbmcgZnJhbWVzIHdpdGhpbiBUeCB3aW5kb3cgKi8KQEAgLTEzMSwyNSArMTM3LDU4IEBACiAJCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkFHRyBGcmFtZSBpPSVkIGlkeCAlZCBzZXE9JWRcbiIsCiAJCQkJCSAgIGksIGlkeCwgU0VRX1RPX1NOKHNjKSk7CiAKKwkJCS8qCisJCQkgKiBzaCAtPiBob3cgbWFueSBmcmFtZXMgYWhlYWQgb2YgdGhlIHN0YXJ0aW5nIGZyYW1lIGlzCisJCQkgKiB0aGUgY3VycmVudCBvbmU/CisJCQkgKgorCQkJICogTm90ZSB0aGF0IGFsbCBmcmFtZXMgc2VudCBpbiB0aGUgYmF0Y2ggbXVzdCBiZSBpbiBhCisJCQkgKiA2NC1mcmFtZSB3aW5kb3csIHNvIHRoaXMgbnVtYmVyIHNob3VsZCBiZSBpbiBbMCw2M10uCisJCQkgKiBJZiBvdXRzaWRlIG9mIHRoaXMgd2luZG93LCB0aGVuIHdlJ3ZlIGZvdW5kIGEgbmV3CisJCQkgKiAiZmlyc3QiIGZyYW1lIGluIHRoZSBiYXRjaCBhbmQgbmVlZCB0byBjaGFuZ2Ugc3RhcnQuCisJCQkgKi8KIAkJCXNoID0gaWR4IC0gc3RhcnQ7Ci0JCQlpZiAoc2ggPiA2NCkgewotCQkJCXNoID0gKHN0YXJ0IC0gaWR4KSArIDB4ZmY7CisKKwkJCS8qCisJCQkgKiBJZiA+PSA2NCwgb3V0IG9mIHdpbmRvdy4gc3RhcnQgbXVzdCBiZSBhdCB0aGUgZnJvbnQKKwkJCSAqIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsIGlkeCBtdXN0IGJlIG5lYXIgdGhlIGVuZCBvZgorCQkJICogdGhlIGJ1ZmZlciwgYW5kIGlkeCBpcyB0aGUgbmV3ICJmaXJzdCIgZnJhbWUuIFNoaWZ0CisJCQkgKiB0aGUgaW5kaWNlcyBhcm91bmQuCisJCQkgKi8KKwkJCWlmIChzaCA+PSA2NCkgeworCQkJCS8qIFNoaWZ0IGJpdG1hcCBieSBzdGFydCAtIGlkeCwgd3JhcHBlZCAqLworCQkJCXNoID0gMHgxMDAgLSBpZHggKyBzdGFydDsKIAkJCQliaXRtYXAgPSBiaXRtYXAgPDwgc2g7CisJCQkJLyogTm93IGlkeCBpcyB0aGUgbmV3IHN0YXJ0IHNvIHNoID0gMCAqLwogCQkJCXNoID0gMDsKIAkJCQlzdGFydCA9IGlkeDsKLQkJCX0gZWxzZSBpZiAoc2ggPCAtNjQpCi0JCQkJc2ggID0gMHhmZiAtIChzdGFydCAtIGlkeCk7Ci0JCQllbHNlIGlmIChzaCA8IDApIHsKKwkJCS8qCisJCQkgKiBJZiA8PSAtNjQgdGhlbiB3cmFwcyB0aGUgMjU2LXBrdCBjaXJjdWxhciBidWZmZXIKKwkJCSAqIChlLmcuLCBzdGFydCA9IDI1NSBhbmQgaWR4ID0gMCwgc2ggc2hvdWxkIGJlIDEpCisJCQkgKi8KKwkJCX0gZWxzZSBpZiAoc2ggPD0gLTY0KSB7CisJCQkJc2ggID0gMHgxMDAgLSBzdGFydCArIGlkeDsKKwkJCS8qCisJCQkgKiBJZiA8IDAgYnV0ID4gLTY0LCBvdXQgb2Ygd2luZG93LiBpZHggaXMgYmVmb3JlIHN0YXJ0CisJCQkgKiBidXQgbm90IHdyYXBwZWQuIFNoaWZ0IHRoZSBpbmRpY2VzIGFyb3VuZC4KKwkJCSAqLworCQkJfSBlbHNlIGlmIChzaCA8IDApIHsKKwkJCQkvKiBTaGlmdCBieSBob3cgZmFyIHN0YXJ0IGlzIGFoZWFkIG9mIGlkeCAqLwogCQkJCXNoID0gc3RhcnQgLSBpZHg7Ci0JCQkJc3RhcnQgPSBpZHg7CiAJCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOworCQkJCS8qIE5vdyBpZHggaXMgdGhlIG5ldyBzdGFydCBzbyBzaCA9IDAgKi8KKwkJCQlzdGFydCA9IGlkeDsKIAkJCQlzaCA9IDA7CiAJCQl9CisJCQkvKiBTZXF1ZW5jZSBudW1iZXIgc3RhcnQgKyBzaCB3YXMgc2VudCBpbiB0aGlzIGJhdGNoICovCiAJCQliaXRtYXAgfD0gMVVMTCA8PCBzaDsKIAkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAic3RhcnQ9JWQgYml0bWFwPTB4JWxseFxuIiwKIAkJCQkJICAgc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpYml0bWFwKTsKIAkJfQogCisJCS8qCisJCSAqIFN0b3JlIHRoZSBiaXRtYXAgYW5kIHBvc3NpYmx5IHRoZSBuZXcgc3RhcnQsIGlmIHdlIHdyYXBwZWQKKwkJICogdGhlIGJ1ZmZlciBhYm92ZQorCQkgKi8KIAkJYWdnLT5iaXRtYXAgPSBiaXRtYXA7CiAJCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnQ7CiAJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiRnJhbWVzICVkIHN0YXJ0X2lkeD0lZCBiaXRtYXA9MHglbGx4XG4iLApAQCAtMTY2LDcgKzIwNSw5IEBACiAJCQkgICAgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpCiB7CiAJaWYgKGZyYW1lX2NvdW50ID09IDEgJiYgc3RhdHVzID09IFRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCkgewotCQlJV0xfRVJSKHByaXYsICJUT0RPOiBJbXBsZW1lbnQgVHggZmx1c2ggY29tbWFuZCEhIVxuIik7CisJCUlXTF9FUlIocHJpdiwgIlR4IGZsdXNoIGNvbW1hbmQgdG8gZmx1c2ggb3V0IGFsbCBmcmFtZXNcbiIpOworCQlpZiAoIXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQorCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT50eF9mbHVzaCk7CiAJfQogfQogCkBAIC0xODQsNiArMjI1LDcgQEAKIAlpbnQgdGlkOwogCWludCBzdGFfaWQ7CiAJaW50IGZyZWVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoKGluZGV4ID49IHR4cS0+cS5uX2JkKSB8fCAoaXdsX3F1ZXVlX3VzZWQoJnR4cS0+cSwgaW5kZXgpID09IDApKSB7CiAJCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpbmRleCAlZCAiCkBAIC0xOTMsMTUgKzIzNSwxNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2JbMF0pOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiKTsKIAltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOwogCiAJdGlkID0gKHR4X3Jlc3AtPnJhX3RpZCAmIElXTDUwX1RYX1JFU19USURfTVNLKSA+PiBJV0w1MF9UWF9SRVNfVElEX1BPUzsKIAlzdGFfaWQgPSAodHhfcmVzcC0+cmFfdGlkICYgSVdMNTBfVFhfUkVTX1JBX01TSykgPj4gSVdMNTBfVFhfUkVTX1JBX1BPUzsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCWlmICh0eHEtPnNjaGVkX3JldHJ5KSB7CiAJCWNvbnN0IHUzMiBzY2Rfc3NuID0gaXdsYWduX2dldF9zY2Rfc3NuKHR4X3Jlc3ApOwotCQlzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnID0gTlVMTDsKKwkJc3RydWN0IGl3bF9odF9hZ2cgKmFnZzsKIAogCQlhZ2cgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2c7CiAKQEAgLTI1Niw2ICsyOTksNyBAQAogCWl3bGFnbl90eHFfY2hlY2tfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQsIHR4cV9pZCk7CiAKIAlpd2xfY2hlY2tfYWJvcnRfc3RhdHVzKHByaXYsIHR4X3Jlc3AtPmZyYW1lX2NvdW50LCBzdGF0dXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQgaXdsYWduX3J4X2hhbmRsZXJfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQpAQCAtMzE5LDcgKzM2Myw4IEBACiB2b2lkIGl3bGFnbl90ZW1wZXJhdHVyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJLyogc3RvcmUgdGVtcGVyYXR1cmUgZnJvbSBzdGF0aXN0aWNzIChpbiBDZWxzaXVzKSAqLwotCXByaXYtPnRlbXBlcmF0dXJlID0gbGUzMl90b19jcHUocHJpdi0+c3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlKTsKKwlwcml2LT50ZW1wZXJhdHVyZSA9CisJCWxlMzJfdG9fY3B1KHByaXYtPl9hZ24uc3RhdGlzdGljcy5nZW5lcmFsLmNvbW1vbi50ZW1wZXJhdHVyZSk7CiAJaXdsX3R0X2hhbmRsZXIocHJpdik7CiB9CiAKQEAgLTQ0NCw3ICs0ODksNyBAQAogCiAJLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBSQkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gKi8KIAlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcsCi0JCQkgICAodTMyKShyeHEtPmRtYV9hZGRyID4+IDgpKTsKKwkJCSAgICh1MzIpKHJ4cS0+YmRfZG1hID4+IDgpKTsKIAogCS8qIFRlbGwgZGV2aWNlIHdoZXJlIGluIERSQU0gdG8gdXBkYXRlIGl0cyBSeCBzdGF0dXMgKi8KIAlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKQEAgLTcwOSw3ICs3NTQsNyBAQAogCX0KIAogCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAotCQkJICByeHEtPmRtYV9hZGRyKTsKKwkJCSAgcnhxLT5iZF9kbWEpOwogCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgaXdsX3JiX3N0YXR1cyksCiAJCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7CiAJcnhxLT5iZCA9IE5VTEw7CkBAIC03NTUsMTMyICs4MDAsNiBAQAogCXJldHVybiBwcml2LT5jZmctPm9wcy0+dXRpbHMtPmNhbGNfcnNzaShwcml2LCByeF9yZXNwKTsKIH0KIAotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0vKioKLSAqIGl3bGFnbl9kYmdfcmVwb3J0X2ZyYW1lIC0gZHVtcCBmcmFtZSB0byBzeXNsb2cgZHVyaW5nIGRlYnVnIHNlc3Npb25zCi0gKgotICogWW91IG1heSBoYWNrIHRoaXMgZnVuY3Rpb24gdG8gc2hvdyBkaWZmZXJlbnQgYXNwZWN0cyBvZiByZWNlaXZlZCBmcmFtZXMsCi0gKiBpbmNsdWRpbmcgc2VsZWN0aXZlIGZyYW1lIGR1bXBzLgotICogZ3JvdXAxMDAgcGFyYW1ldGVyIHNlbGVjdHMgd2hldGhlciB0byBzaG93IDEgb3V0IG9mIDEwMCBnb29kIGRhdGEgZnJhbWVzLgotICogICAgQWxsIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgZnJhbWVzIGFyZSBwcmludGVkLgotICovCi1zdGF0aWMgdm9pZCBpd2xhZ25fZGJnX3JlcG9ydF9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgIHN0cnVjdCBpd2xfcnhfcGh5X3JlcyAqcGh5X3JlcywgdTE2IGxlbmd0aCwKLQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwgaW50IGdyb3VwMTAwKQotewotCXUzMiB0b191czsKLQl1MzIgcHJpbnRfc3VtbWFyeSA9IDA7Ci0JdTMyIHByaW50X2R1bXAgPSAwOwkvKiBzZXQgdG8gMSB0byBkdW1wIGFsbCBmcmFtZXMnIGNvbnRlbnRzICovCi0JdTMyIGh1bmRyZWQgPSAwOwotCXUzMiBkYXRhZnJhbWUgPSAwOwotCV9fbGUxNiBmYzsKLQl1MTYgc2VxX2N0bDsKLQl1MTYgY2hhbm5lbDsKLQl1MTYgcGh5X2ZsYWdzOwotCXUzMiByYXRlX25fZmxhZ3M7Ci0JdTMyIHRzZl9sb3c7Ci0JaW50IHJzc2k7Ci0KLQlpZiAobGlrZWx5KCEoaXdsX2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9SWCkpKQotCQlyZXR1cm47Ci0KLQkvKiBNQUMgaGVhZGVyICovCi0JZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7Ci0Jc2VxX2N0bCA9IGxlMTZfdG9fY3B1KGhlYWRlci0+c2VxX2N0cmwpOwotCi0JLyogbWV0YWRhdGEgKi8KLQljaGFubmVsID0gbGUxNl90b19jcHUocGh5X3Jlcy0+Y2hhbm5lbCk7Ci0JcGh5X2ZsYWdzID0gbGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKTsKLQlyYXRlX25fZmxhZ3MgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5yYXRlX25fZmxhZ3MpOwotCi0JLyogc2lnbmFsIHN0YXRpc3RpY3MgKi8KLQlyc3NpID0gaXdsYWduX2NhbGNfcnNzaShwcml2LCBwaHlfcmVzKTsKLQl0c2ZfbG93ID0gbGU2NF90b19jcHUocGh5X3Jlcy0+dGltZXN0YW1wKSAmIDB4MGZmZmZmZmZmOwotCi0JdG9fdXMgPSAhY29tcGFyZV9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEsIHByaXYtPm1hY19hZGRyKTsKLQotCS8qIGlmIGRhdGEgZnJhbWUgaXMgdG8gdXMgYW5kIGFsbCBpcyBnb29kLAotCSAqICAgKG9wdGlvbmFsbHkpIHByaW50IHN1bW1hcnkgZm9yIG9ubHkgMSBvdXQgb2YgZXZlcnkgMTAwICovCi0JaWYgKHRvX3VzICYmIChmYyAmIH5jcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpKSA9PQotCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRlRZUEVfREFUQSkpIHsKLQkJZGF0YWZyYW1lID0gMTsKLQkJaWYgKCFncm91cDEwMCkKLQkJCXByaW50X3N1bW1hcnkgPSAxOwkvKiBwcmludCBlYWNoIGZyYW1lICovCi0JCWVsc2UgaWYgKHByaXYtPmZyYW1lY250X3RvX3VzIDwgMTAwKSB7Ci0JCQlwcml2LT5mcmFtZWNudF90b191cysrOwotCQkJcHJpbnRfc3VtbWFyeSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwcml2LT5mcmFtZWNudF90b191cyA9IDA7Ci0JCQlwcmludF9zdW1tYXJ5ID0gMTsKLQkJCWh1bmRyZWQgPSAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogcHJpbnQgc3VtbWFyeSBmb3IgYWxsIG90aGVyIGZyYW1lcyAqLwotCQlwcmludF9zdW1tYXJ5ID0gMTsKLQl9Ci0KLQlpZiAocHJpbnRfc3VtbWFyeSkgewotCQljaGFyICp0aXRsZTsKLQkJaW50IHJhdGVfaWR4OwotCQl1MzIgYml0cmF0ZTsKLQotCQlpZiAoaHVuZHJlZCkKLQkJCXRpdGxlID0gIjEwMEZyYW1lcyI7Ci0JCWVsc2UgaWYgKGllZWU4MDIxMV9oYXNfcmV0cnkoZmMpKQotCQkJdGl0bGUgPSAiUmV0cnkiOwotCQllbHNlIGlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVzcChmYykpCi0JCQl0aXRsZSA9ICJBc2NSc3AiOwotCQllbHNlIGlmIChpZWVlODAyMTFfaXNfcmVhc3NvY19yZXNwKGZjKSkKLQkJCXRpdGxlID0gIlJhc1JzcCI7Ci0JCWVsc2UgaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkgewotCQkJdGl0bGUgPSAiUHJiUnNwIjsKLQkJCXByaW50X2R1bXAgPSAxOwkvKiBkdW1wIGZyYW1lIGNvbnRlbnRzICovCi0JCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX2JlYWNvbihmYykpIHsKLQkJCXRpdGxlID0gIkJlYWNvbiI7Ci0JCQlwcmludF9kdW1wID0gMTsJLyogZHVtcCBmcmFtZSBjb250ZW50cyAqLwotCQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19hdGltKGZjKSkKLQkJCXRpdGxlID0gIkFUSU0iOwotCQllbHNlIGlmIChpZWVlODAyMTFfaXNfYXV0aChmYykpCi0JCQl0aXRsZSA9ICJBdXRoIjsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX2RlYXV0aChmYykpCi0JCQl0aXRsZSA9ICJEZUF1dGgiOwotCQllbHNlIGlmIChpZWVlODAyMTFfaXNfZGlzYXNzb2MoZmMpKQotCQkJdGl0bGUgPSAiRGlzQXNzb2MiOwotCQllbHNlCi0JCQl0aXRsZSA9ICJGcmFtZSI7Ci0KLQkJcmF0ZV9pZHggPSBpd2xfaHdyYXRlX3RvX3BsY3BfaWR4KHJhdGVfbl9mbGFncyk7Ci0JCWlmICh1bmxpa2VseSgocmF0ZV9pZHggPCAwKSB8fCAocmF0ZV9pZHggPj0gSVdMX1JBVEVfQ09VTlQpKSkgewotCQkJYml0cmF0ZSA9IDA7Ci0JCQlXQVJOX09OX09OQ0UoMSk7Ci0JCX0gZWxzZSB7Ci0JCQliaXRyYXRlID0gaXdsX3JhdGVzW3JhdGVfaWR4XS5pZWVlIC8gMjsKLQkJfQotCi0JCS8qIHByaW50IGZyYW1lIHN1bW1hcnkuCi0JCSAqIE1BQyBhZGRyZXNzZXMgc2hvdyBqdXN0IHRoZSBsYXN0IGJ5dGUgKGZvciBicmV2aXR5KSwKLQkJICogICAgYnV0IHlvdSBjYW4gaGFjayBpdCB0byBzaG93IG1vcmUsIGlmIHlvdSdkIGxpa2UgdG8uICovCi0JCWlmIChkYXRhZnJhbWUpCi0JCQlJV0xfREVCVUdfUlgocHJpdiwgIiVzOiBtaGQ9MHglMDR4LCBkc3Q9MHglMDJ4LCAiCi0JCQkJICAgICAibGVuPSV1LCByc3NpPSVkLCBjaG5sPSVkLCByYXRlPSV1LFxuIiwKLQkJCQkgICAgIHRpdGxlLCBsZTE2X3RvX2NwdShmYyksIGhlYWRlci0+YWRkcjFbNV0sCi0JCQkJICAgICBsZW5ndGgsIHJzc2ksIGNoYW5uZWwsIGJpdHJhdGUpOwotCQllbHNlIHsKLQkJCS8qIHNyYy9kc3QgYWRkcmVzc2VzIGFzc3VtZSBtYW5hZ2VkIG1vZGUgKi8KLQkJCUlXTF9ERUJVR19SWChwcml2LCAiJXM6IDB4JTA0eCwgZHN0PTB4JTAyeCwgc3JjPTB4JTAyeCwgIgotCQkJCSAgICAgImxlbj0ldSwgcnNzaT0lZCwgdGltPSVsdSB1c2VjLCAiCi0JCQkJICAgICAicGh5PTB4JTAyeCwgY2hubD0lZFxuIiwKLQkJCQkgICAgIHRpdGxlLCBsZTE2X3RvX2NwdShmYyksIGhlYWRlci0+YWRkcjFbNV0sCi0JCQkJICAgICBoZWFkZXItPmFkZHIzWzVdLCBsZW5ndGgsIHJzc2ksCi0JCQkJICAgICB0c2ZfbG93IC0gcHJpdi0+c2Nhbl9zdGFydF90c2YsCi0JCQkJICAgICBwaHlfZmxhZ3MsIGNoYW5uZWwpOwotCQl9Ci0JfQotCWlmIChwcmludF9kdW1wKQotCQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1JYLCBoZWFkZXIsIGxlbmd0aCk7Ci19Ci0jZW5kaWYKLQogc3RhdGljIHUzMiBpd2xhZ25fdHJhbnNsYXRlX3J4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZWNyeXB0X2luKQogewogCXUzMiBkZWNyeXB0X291dCA9IDA7CkBAIC05ODgsNyArOTA3LDcgQEAKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKIAlzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKnBoeV9yZXM7CiAJX19sZTMyIHJ4X3BrdF9zdGF0dXM7Ci0Jc3RydWN0IGl3bDQ5NjVfcnhfbXBkdV9yZXNfc3RhcnQgKmFtc2R1OworCXN0cnVjdCBpd2xfcnhfbXBkdV9yZXNfc3RhcnQgKmFtc2R1OwogCXUzMiBsZW47CiAJdTMyIGFtcGR1X3N0YXR1czsKIAl1MzIgcmF0ZV9uX2ZsYWdzOwpAQCAtMTAxNyw3ICs5MzYsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCXBoeV9yZXMgPSAmcHJpdi0+X2Fnbi5sYXN0X3BoeV9yZXM7Ci0JCWFtc2R1ID0gKHN0cnVjdCBpd2w0OTY1X3J4X21wZHVfcmVzX3N0YXJ0ICopcGt0LT51LnJhdzsKKwkJYW1zZHUgPSAoc3RydWN0IGl3bF9yeF9tcGR1X3Jlc19zdGFydCAqKXBrdC0+dS5yYXc7CiAJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkpOwogCQlsZW4gPSBsZTE2X3RvX2NwdShhbXNkdS0+Ynl0ZV9jb3VudCk7CiAJCXJ4X3BrdF9zdGF0dXMgPSAqKF9fbGUzMiAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkgKyBsZW4pOwpAQCAtMTA2MCwxMSArOTc5LDYgQEAKIAkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLwogCXJ4X3N0YXR1cy5zaWduYWwgPSBpd2xhZ25fY2FsY19yc3NpKHByaXYsIHBoeV9yZXMpOwogCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLQkvKiBTZXQgIjEiIHRvIHJlcG9ydCBnb29kIGRhdGEgZnJhbWVzIGluIGdyb3VwcyBvZiAxMDAgKi8KLQlpZiAodW5saWtlbHkoaXdsX2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9SWCkpCi0JCWl3bGFnbl9kYmdfcmVwb3J0X2ZyYW1lKHByaXYsIHBoeV9yZXMsIGxlbiwgaGVhZGVyLCAxKTsKLSNlbmRpZgogCWl3bF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUocHJpdiwgbGVuLCBoZWFkZXIpOwogCUlXTF9ERUJVR19TVEFUU19MSU1JVChwcml2LCAiUnNzaSAlZCwgVFNGICVsbHVcbiIsCiAJCXJ4X3N0YXR1cy5zaWduYWwsICh1bnNpZ25lZCBsb25nIGxvbmcpcnhfc3RhdHVzLm1hY3RpbWUpOwpAQCAtMTI1Miw2ICsxMTY2LDcgQEAKIAlib29sIGlzX2FjdGl2ZSA9IGZhbHNlOwogCWludCAgY2hhbl9tb2Q7CiAJdTggYWN0aXZlX2NoYWluczsKKwl1OCBzY2FuX3R4X2FudGVubmFzID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKIAogCWNvbmYgPSBpZWVlODAyMTFfZ2V0X2h3X2NvbmYocHJpdi0+aHcpOwogCkBAIC0xMzE5LDcgKzEyMzQsMTAgQEAKIAogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWludGVydmFsID0gdmlmID8gdmlmLT5ic3NfY29uZi5iZWFjb25faW50IDogMDsKKwkJaWYgKHByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4pCisJCQlpbnRlcnZhbCA9IDA7CisJCWVsc2UKKwkJCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAkJc2Nhbi0+c3VzcGVuZF90aW1lID0gMDsKQEAgLTE0MDMsMTEgKzEzMjEsMTQgQEAKIAogCWJhbmQgPSBwcml2LT5zY2FuX2JhbmQ7CiAKLQlpZiAocHJpdi0+Y2ZnLT5zY2FuX2FudGVubmFzW2JhbmRdKQotCQlyeF9hbnQgPSBwcml2LT5jZmctPnNjYW5fYW50ZW5uYXNbYmFuZF07CisJaWYgKHByaXYtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXSkKKwkJcnhfYW50ID0gcHJpdi0+Y2ZnLT5zY2FuX3J4X2FudGVubmFzW2JhbmRdOwogCi0JcHJpdi0+c2Nhbl90eF9hbnRbYmFuZF0gPQotCQkJaXdsX3RvZ2dsZV90eF9hbnQocHJpdiwgcHJpdi0+c2Nhbl90eF9hbnRbYmFuZF0pOworCWlmIChwcml2LT5jZmctPnNjYW5fdHhfYW50ZW5uYXNbYmFuZF0pCisJCXNjYW5fdHhfYW50ZW5uYXMgPSBwcml2LT5jZmctPnNjYW5fdHhfYW50ZW5uYXNbYmFuZF07CisKKwlwcml2LT5zY2FuX3R4X2FudFtiYW5kXSA9IGl3bF90b2dnbGVfdHhfYW50KHByaXYsIHByaXYtPnNjYW5fdHhfYW50W2JhbmRdLAorCQkJCQkJICAgIHNjYW5fdHhfYW50ZW5uYXMpOwogCXJhdGVfZmxhZ3MgfD0gaXdsX2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+c2Nhbl90eF9hbnRbYmFuZF0pOwogCXNjYW4tPnR4X2NtZC5yYXRlX25fZmxhZ3MgPSBpd2xfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLCByYXRlX2ZsYWdzKTsKIApAQCAtMTQzMywxMyArMTM1NCwxNSBAQAogCWlmICghcHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbikgewogCQljbWRfbGVuID0gaXdsX2ZpbGxfcHJvYmVfcmVxKHByaXYsCiAJCQkJCShzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAorCQkJCQl2aWYtPmFkZHIsCiAJCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+aWUsCiAJCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+aWVfbGVuLAogCQkJCQlJV0xfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpOwogCX0gZWxzZSB7CisJCS8qIHVzZSBiY2FzdCBhZGRyLCB3aWxsIG5vdCBiZSB0cmFuc21pdHRlZCBidXQgbXVzdCBiZSB2YWxpZCAqLwogCQljbWRfbGVuID0gaXdsX2ZpbGxfcHJvYmVfcmVxKHByaXYsCiAJCQkJCShzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAotCQkJCQlOVUxMLCAwLAorCQkJCQlpd2xfYmNhc3RfYWRkciwgTlVMTCwgMCwKIAkJCQkJSVdMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKIAogCX0KQEAgLTE1MDIsMyArMTQyNSw5NiBAQAogCXJldHVybiBpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAogCQkJCSAgdmlmLT5ic3NfY29uZi5ic3NpZCk7CiB9CisKK3ZvaWQgaXdsX2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKQoreworCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZwcml2LT5zdGFfbG9jaykpOworCisJaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSA+PSBmcmVlZCkKKwkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlIC09IGZyZWVkOworCWVsc2UgeworCQlJV0xfREVCVUdfVFgocHJpdiwgImZyZWUgbW9yZSB0aGFuIHRmZHNfaW5fcXVldWUgKCV1OiVkKVxuIiwKKwkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSwKKwkJCWZyZWVkKTsKKwkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlID0gMDsKKwl9Cit9CisKKyNkZWZpbmUgSVdMX0ZMVVNIX1dBSVRfTVMJMjAwMAorCitpbnQgaXdsYWduX3dhaXRfdHhfcXVldWVfZW1wdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cTsKKwlzdHJ1Y3QgaXdsX3F1ZXVlICpxOworCWludCBjbnQ7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCByZXQgPSAwOworCisJLyogd2FpdGluZyBmb3IgYWxsIHRoZSB0eCBmcmFtZXMgY29tcGxldGUgbWlnaHQgdGFrZSBhIHdoaWxlICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGNudCsrKSB7CisJCWlmIChjbnQgPT0gSVdMX0NNRF9RVUVVRV9OVU0pCisJCQljb250aW51ZTsKKwkJdHhxID0gJnByaXYtPnR4cVtjbnRdOworCQlxID0gJnR4cS0+cTsKKwkJd2hpbGUgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0ciAmJiAhdGltZV9hZnRlcihqaWZmaWVzLAorCQkgICAgICAgbm93ICsgbXNlY3NfdG9famlmZmllcyhJV0xfRkxVU0hfV0FJVF9NUykpKQorCQkJCW1zbGVlcCgxKTsKKworCQlpZiAocS0+cmVhZF9wdHIgIT0gcS0+d3JpdGVfcHRyKSB7CisJCQlJV0xfRVJSKHByaXYsICJmYWlsIHRvIGZsdXNoIGFsbCB0eCBmaWZvIHF1ZXVlc1xuIik7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBJV0xfVFhfUVVFVUVfTVNLCTB4ZmZmZmYKKworLyoqCisgKiBpd2xhZ25fdHhmaWZvX2ZsdXNoOiBzZW5kIFJFUExZX1RYRklGT19GTFVTSCBjb21tYW5kIHRvIHVDb2RlCisgKgorICogcHJlLXJlcXVpcmVtZW50czoKKyAqICAxLiBhY3F1aXJlIG11dGV4IGJlZm9yZSBjYWxsaW5nCisgKiAgMi4gbWFrZSBzdXJlIHJmIGlzIG9uIGFuZCBub3QgaW4gZXhpdCBzdGF0ZQorICovCitpbnQgaXdsYWduX3R4Zmlmb19mbHVzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKQoreworCXN0cnVjdCBpd2xfdHhmaWZvX2ZsdXNoX2NtZCBmbHVzaF9jbWQ7CisJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IFJFUExZX1RYRklGT19GTFVTSCwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3R4Zmlmb19mbHVzaF9jbWQpLAorCQkuZmxhZ3MgPSBDTURfU1lOQywKKwkJLmRhdGEgPSAmZmx1c2hfY21kLAorCX07CisKKwltaWdodF9zbGVlcCgpOworCisJbWVtc2V0KCZmbHVzaF9jbWQsIDAsIHNpemVvZihmbHVzaF9jbWQpKTsKKwlmbHVzaF9jbWQuZmlmb19jb250cm9sID0gSVdMX1RYX0ZJRk9fVk9fTVNLIHwgSVdMX1RYX0ZJRk9fVklfTVNLIHwKKwkJCQkgSVdMX1RYX0ZJRk9fQkVfTVNLIHwgSVdMX1RYX0ZJRk9fQktfTVNLOworCWlmIChwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikKKwkJZmx1c2hfY21kLmZpZm9fY29udHJvbCB8PSBJV0xfQUdHX1RYX1FVRVVFX01TSzsKKworCUlXTF9ERUJVR19JTkZPKHByaXYsICJmaWZvIHF1ZXVlIGNvbnRyb2w6IDBYJXhcbiIsCisJCSAgICAgICBmbHVzaF9jbWQuZmlmb19jb250cm9sKTsKKwlmbHVzaF9jbWQuZmx1c2hfY29udHJvbCA9IGNwdV90b19sZTE2KGZsdXNoX2NvbnRyb2wpOworCisJcmV0dXJuIGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKK30KKwordm9pZCBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKQoreworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOworCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKSkgeworCQlJV0xfRVJSKHByaXYsICJmbHVzaCByZXF1ZXN0IGZhaWxcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCUlXTF9ERUJVR19JTkZPKHByaXYsICJ3YWl0IHRyYW5zbWl0L2ZsdXNoIGFsbCBmcmFtZXNcbiIpOworCWl3bGFnbl93YWl0X3R4X3F1ZXVlX2VtcHR5KHByaXYpOworZG9uZToKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYwppbmRleCBjZjRhOTViLi4zNWM4NmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYwpAQCAtMzEzLDggKzMxMyw3IEBACiAJCQkgKi8KIAkJCUlXTF9ERUJVR19IVChwcml2LCAiRmFpbCBzdGFydCBUeCBhZ2cgb24gdGlkOiAlZFxuIiwKIAkJCQl0aWQpOwotCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdGEsIHRpZCwKLQkJCQkJCVdMQU5fQkFDS19JTklUSUFUT1IpOworCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdGEsIHRpZCk7CiAJCX0KIAl9IGVsc2UKIAkJSVdMX0VSUihwcml2LCAiRmFpbCBmaW5kaW5nIHZhbGlkIGFnZ3JlZ2F0aW9uIHRpZDogJWRcbiIsIHRpZCk7CkBAIC0zMjUsMTggKzMyNCwxMSBAQAogCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsCiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewotCWlmICgodGlkIDwgVElEX01BWF9MT0FEX0NPVU5UKSAmJgotCSAgICAhcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChwcml2LCBscV9kYXRhLCB0aWQsIHN0YSkpIHsKLQkJaWYgKHByaXYtPmNmZy0+dXNlX3J0c19mb3JfaHQpIHsKLQkJCS8qCi0JCQkgKiBzd2l0Y2ggdG8gUlRTL0NUUyBpZiBpdCBpcyB0aGUgcHJlZmVyIHByb3RlY3Rpb24KLQkJCSAqIG1ldGhvZCBmb3IgSFQgdHJhZmZpYwotCQkJICovCi0JCQlJV0xfREVCVUdfSFQocHJpdiwgInVzZSBSVFMvQ1RTIHByb3RlY3Rpb24gZm9yIEhUXG4iKTsKLQkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPSB+UlhPTl9GTEdfU0VMRl9DVFNfRU47Ci0JCQlpd2xjb3JlX2NvbW1pdF9yeG9uKHByaXYpOwotCQl9Ci0JfQorCWlmICh0aWQgPCBUSURfTUFYX0xPQURfQ09VTlQpCisJCXJzX3RsX3R1cm5fb25fYWdnX2Zvcl90aWQocHJpdiwgbHFfZGF0YSwgdGlkLCBzdGEpOworCWVsc2UKKwkJSVdMX0VSUihwcml2LCAidGlkIGV4Y2VlZHMgbWF4IGxvYWQgY291bnQ6ICVkLyVkXG4iLAorCQkJdGlkLCBUSURfTUFYX0xPQURfQ09VTlQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeC5jCkBAIC0wLDAgKzEsMzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAiaXdsLWRldi5oIgorI2luY2x1ZGUgIml3bC1jb3JlLmgiCisjaW5jbHVkZSAiaXdsLWNhbGliLmgiCisjaW5jbHVkZSAiaXdsLXN0YS5oIgorI2luY2x1ZGUgIml3bC1pby5oIgorI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCisjaW5jbHVkZSAiaXdsLWFnbi1ody5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKwordm9pZCBpd2xfcnhfbWlzc2VkX2JlYWNvbl9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCisKK3sKKwlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaXdsX21pc3NlZF9iZWFjb25fbm90aWYgKm1pc3NlZF9iZWFjb247CisKKwltaXNzZWRfYmVhY29uID0gJnBrdC0+dS5taXNzZWRfYmVhY29uOworCWlmIChsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucykgPgorCSAgICBwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCkgeworCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKKwkJICAgICJtaXNzZWQgYmNuIGNuc3EgJWQgdG90bCAlZCByY2QgJWQgZXhwY3RkICVkXG4iLAorCQkgICAgbGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+Y29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnMpLAorCQkgICAgbGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+dG90YWxfbWlzc2VkX2JlY29ucyksCisJCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5udW1fcmVjdmRfYmVhY29ucyksCisJCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5udW1fZXhwZWN0ZWRfYmVhY29ucykpOworCQlpZiAoIXRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpCisJCQlpd2xfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKKwl9Cit9CisKKy8qIENhbGN1bGF0ZSBub2lzZSBsZXZlbCwgYmFzZWQgb24gbWVhc3VyZW1lbnRzIGR1cmluZyBuZXR3b3JrIHNpbGVuY2UganVzdAorICogICBiZWZvcmUgYXJyaXZpbmcgYmVhY29uLiAgVGhpcyBtZWFzdXJlbWVudCBjYW4gYmUgZG9uZSBvbmx5IGlmIHdlIGtub3cKKyAqICAgZXhhY3RseSB3aGVuIHRvIGV4cGVjdCBiZWFjb25zLCB0aGVyZWZvcmUgb25seSB3aGVuIHdlJ3JlIGFzc29jaWF0ZWQuICovCitzdGF0aWMgdm9pZCBpd2xfcnhfY2FsY19ub2lzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSAqcnhfaW5mbzsKKwlpbnQgbnVtX2FjdGl2ZV9yeCA9IDA7CisJaW50IHRvdGFsX3NpbGVuY2UgPSAwOworCWludCBiY25fc2lsZW5jZV9hLCBiY25fc2lsZW5jZV9iLCBiY25fc2lsZW5jZV9jOworCWludCBsYXN0X3J4X25vaXNlOworCisJaWYgKHByaXYtPmNmZy0+YnRfc3RhdGlzdGljcykKKwkJcnhfaW5mbyA9ICYocHJpdi0+X2Fnbi5zdGF0aXN0aWNzX2J0LnJ4LmdlbmVyYWwuY29tbW9uKTsKKwllbHNlCisJCXJ4X2luZm8gPSAmKHByaXYtPl9hZ24uc3RhdGlzdGljcy5yeC5nZW5lcmFsKTsKKwliY25fc2lsZW5jZV9hID0KKwkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmIElOX0JBTkRfRklMVEVSOworCWJjbl9zaWxlbmNlX2IgPQorCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJYmNuX3NpbGVuY2VfYyA9CisJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYykgJiBJTl9CQU5EX0ZJTFRFUjsKKworCWlmIChiY25fc2lsZW5jZV9hKSB7CisJCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYTsKKwkJbnVtX2FjdGl2ZV9yeCsrOworCX0KKwlpZiAoYmNuX3NpbGVuY2VfYikgeworCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2I7CisJCW51bV9hY3RpdmVfcngrKzsKKwl9CisJaWYgKGJjbl9zaWxlbmNlX2MpIHsKKwkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9jOworCQludW1fYWN0aXZlX3J4Kys7CisJfQorCisJLyogQXZlcmFnZSBhbW9uZyBhY3RpdmUgYW50ZW5uYXMgKi8KKwlpZiAobnVtX2FjdGl2ZV9yeCkKKwkJbGFzdF9yeF9ub2lzZSA9ICh0b3RhbF9zaWxlbmNlIC8gbnVtX2FjdGl2ZV9yeCkgLSAxMDc7CisJZWxzZQorCQlsYXN0X3J4X25vaXNlID0gSVdMX05PSVNFX01FQVNfTk9UX0FWQUlMQUJMRTsKKworCUlXTF9ERUJVR19DQUxJQihwcml2LCAiaW5iYW5kIHNpbGVuY2UgYSAldSwgYiAldSwgYyAldSwgZEJtICVkXG4iLAorCQkJYmNuX3NpbGVuY2VfYSwgYmNuX3NpbGVuY2VfYiwgYmNuX3NpbGVuY2VfYywKKwkJCWxhc3Rfcnhfbm9pc2UpOworfQorCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUworLyoKKyAqICBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiBvZiBhbGwgc3RhdGlzdGljcyBjb3VudGVyIGFyZSBpbiBEV09SRAorICogIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBkZWJ1Z2dpbmcsIGRvIG5vdCBkZWFsIHdpdGgKKyAqICB0aGUgY2FzZSBvZiBjb3VudGVycyByb2xsLW92ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGl3bF9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJCV9fbGUzMiAqc3RhdHMpCit7CisJaW50IGksIHNpemU7CisJX19sZTMyICpwcmV2X3N0YXRzOworCXUzMiAqYWNjdW1fc3RhdHM7CisJdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IHN0YXRpc3RpY3NfdHggKnR4LCAqYWNjdW1fdHg7CisKKwlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKSB7CisJCXByZXZfc3RhdHMgPSAoX19sZTMyICopJnByaXYtPl9hZ24uc3RhdGlzdGljc19idDsKKwkJYWNjdW1fc3RhdHMgPSAodTMyICopJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljc19idDsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3MpOworCQlnZW5lcmFsID0gJnByaXYtPl9hZ24uc3RhdGlzdGljc19idC5nZW5lcmFsLmNvbW1vbjsKKwkJYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3NfYnQuZ2VuZXJhbC5jb21tb247CisJCXR4ID0gJnByaXYtPl9hZ24uc3RhdGlzdGljc19idC50eDsKKwkJYWNjdW1fdHggPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzX2J0LnR4OworCQlkZWx0YSA9ICh1MzIgKikmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzX2J0OworCQltYXhfZGVsdGEgPSAodTMyICopJnByaXYtPl9hZ24ubWF4X2RlbHRhX2J0OworCX0gZWxzZSB7CisJCXByZXZfc3RhdHMgPSAoX19sZTMyICopJnByaXYtPl9hZ24uc3RhdGlzdGljczsKKwkJYWNjdW1fc3RhdHMgPSAodTMyICopJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljczsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpOworCQlnZW5lcmFsID0gJnByaXYtPl9hZ24uc3RhdGlzdGljcy5nZW5lcmFsLmNvbW1vbjsKKwkJYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fYWduLmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247CisJCXR4ID0gJnByaXYtPl9hZ24uc3RhdGlzdGljcy50eDsKKwkJYWNjdW1fdHggPSAmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzLnR4OworCQlkZWx0YSA9ICh1MzIgKikmcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzOworCQltYXhfZGVsdGEgPSAodTMyICopJnByaXYtPl9hZ24ubWF4X2RlbHRhOworCX0KKwlmb3IgKGkgPSBzaXplb2YoX19sZTMyKTsgaSA8IHNpemU7CisJICAgICBpICs9IHNpemVvZihfX2xlMzIpLCBzdGF0cysrLCBwcmV2X3N0YXRzKyssIGRlbHRhKyssCisJICAgICBtYXhfZGVsdGErKywgYWNjdW1fc3RhdHMrKykgeworCQlpZiAobGUzMl90b19jcHUoKnN0YXRzKSA+IGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSkgeworCQkJKmRlbHRhID0gKGxlMzJfdG9fY3B1KCpzdGF0cykgLQorCQkJCWxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSk7CisJCQkqYWNjdW1fc3RhdHMgKz0gKmRlbHRhOworCQkJaWYgKCpkZWx0YSA+ICptYXhfZGVsdGEpCisJCQkJKm1heF9kZWx0YSA9ICpkZWx0YTsKKwkJfQorCX0KKworCS8qIHJlc2V0IGFjY3VtdWxhdGl2ZSBzdGF0aXN0aWNzIGZvciAibm8tY291bnRlciIgdHlwZSBzdGF0aXN0aWNzICovCisJYWNjdW1fZ2VuZXJhbC0+dGVtcGVyYXR1cmUgPSBnZW5lcmFsLT50ZW1wZXJhdHVyZTsKKwlhY2N1bV9nZW5lcmFsLT50ZW1wZXJhdHVyZV9tID0gZ2VuZXJhbC0+dGVtcGVyYXR1cmVfbTsKKwlhY2N1bV9nZW5lcmFsLT50dGxfdGltZXN0YW1wID0gZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcDsKKwlhY2N1bV90eC0+dHhfcG93ZXIuYW50X2EgPSB0eC0+dHhfcG93ZXIuYW50X2E7CisJYWNjdW1fdHgtPnR4X3Bvd2VyLmFudF9iID0gdHgtPnR4X3Bvd2VyLmFudF9iOworCWFjY3VtX3R4LT50eF9wb3dlci5hbnRfYyA9IHR4LT50eF9wb3dlci5hbnRfYzsKK30KKyNlbmRpZgorCisjZGVmaW5lIFJFR19SRUNBTElCX1BFUklPRCAoNjApCisKKy8qKgorICogaXdsX2dvb2RfcGxjcF9oZWFsdGggLSBjaGVja3MgZm9yIHBsY3AgZXJyb3IuCisgKgorICogV2hlbiB0aGUgcGxjcCBlcnJvciBpcyBleGNlZWRpbmcgdGhlIHRocmVzaG9sZHMsIHJlc2V0IHRoZSByYWRpbworICogdG8gaW1wcm92ZSB0aGUgdGhyb3VnaHB1dC4KKyAqLworYm9vbCBpd2xfZ29vZF9wbGNwX2hlYWx0aChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKK3sKKwlib29sIHJjID0gdHJ1ZTsKKwlpbnQgY29tYmluZWRfcGxjcF9kZWx0YTsKKwl1bnNpZ25lZCBpbnQgcGxjcF9tc2VjOworCXVuc2lnbmVkIGxvbmcgcGxjcF9yZWNlaXZlZF9qaWZmaWVzOworCisJaWYgKHByaXYtPmNmZy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPT0KKwkgICAgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfRElTQUJMRSkgeworCQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInBsY3BfZXJyIGNoZWNrIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qCisJICogY2hlY2sgZm9yIHBsY3BfZXJyIGFuZCB0cmlnZ2VyIHJhZGlvIHJlc2V0IGlmIGl0IGV4Y2VlZHMKKwkgKiB0aGUgcGxjcCBlcnJvciB0aHJlc2hvbGQgcGxjcF9kZWx0YS4KKwkgKi8KKwlwbGNwX3JlY2VpdmVkX2ppZmZpZXMgPSBqaWZmaWVzOworCXBsY3BfbXNlYyA9IGppZmZpZXNfdG9fbXNlY3MoKGxvbmcpIHBsY3BfcmVjZWl2ZWRfamlmZmllcyAtCisJCQkJCShsb25nKSBwcml2LT5wbGNwX2ppZmZpZXMpOworCXByaXYtPnBsY3BfamlmZmllcyA9IHBsY3BfcmVjZWl2ZWRfamlmZmllczsKKwkvKgorCSAqIGNoZWNrIHRvIG1ha2Ugc3VyZSBwbGNwX21zZWMgaXMgbm90IDAgdG8gcHJldmVudCBkaXZpc2lvbgorCSAqIGJ5IHplcm8uCisJICovCisJaWYgKHBsY3BfbXNlYykgeworCQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgKm9mZG07CisJCXN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSAqb2ZkbV9odDsKKworCQlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKSB7CisJCQlvZmRtID0gJnBrdC0+dS5zdGF0c19idC5yeC5vZmRtOworCQkJb2ZkbV9odCA9ICZwa3QtPnUuc3RhdHNfYnQucngub2ZkbV9odDsKKwkJCWNvbWJpbmVkX3BsY3BfZGVsdGEgPQorCQkJICAgKGxlMzJfdG9fY3B1KG9mZG0tPnBsY3BfZXJyKSAtCisJCQkgICBsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQuCisJCQkJICAgICAgIHJ4Lm9mZG0ucGxjcF9lcnIpKSArCisJCQkgICAobGUzMl90b19jcHUob2ZkbV9odC0+cGxjcF9lcnIpIC0KKwkJCSAgIGxlMzJfdG9fY3B1KHByaXYtPl9hZ24uc3RhdGlzdGljc19idC4KKwkJCQkgICAgICAgcngub2ZkbV9odC5wbGNwX2VycikpOworCQl9IGVsc2UgeworCQkJb2ZkbSA9ICZwa3QtPnUuc3RhdHMucngub2ZkbTsKKwkJCW9mZG1faHQgPSAmcGt0LT51LnN0YXRzLnJ4Lm9mZG1faHQ7CisJCQljb21iaW5lZF9wbGNwX2RlbHRhID0KKwkJCSAgICAobGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpIC0KKwkJCSAgICBsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3MuCisJCQkJCXJ4Lm9mZG0ucGxjcF9lcnIpKSArCisJCQkgICAgKGxlMzJfdG9fY3B1KG9mZG1faHQtPnBsY3BfZXJyKSAtCisJCQkgICAgbGUzMl90b19jcHUocHJpdi0+X2Fnbi5zdGF0aXN0aWNzLgorCQkJCQlyeC5vZmRtX2h0LnBsY3BfZXJyKSk7CisJCX0KKworCQlpZiAoKGNvbWJpbmVkX3BsY3BfZGVsdGEgPiAwKSAmJgorCQkgICAgKChjb21iaW5lZF9wbGNwX2RlbHRhICogMTAwKSAvIHBsY3BfbXNlYykgPgorCQkJcHJpdi0+Y2ZnLT5wbGNwX2RlbHRhX3RocmVzaG9sZCkgeworCQkJLyoKKwkJCSAqIGlmIHBsY3BfZXJyIGV4Y2VlZCB0aGUgdGhyZXNob2xkLAorCQkJICogdGhlIGZvbGxvd2luZyBkYXRhIGlzIHByaW50ZWQgaW4gY3N2IGZvcm1hdDoKKwkJCSAqICAgIFRleHQ6IHBsY3BfZXJyIGV4Y2VlZGVkICVkLAorCQkJICogICAgUmVjZWl2ZWQgb2ZkbS5wbGNwX2VyciwKKwkJCSAqICAgIEN1cnJlbnQgb2ZkbS5wbGNwX2VyciwKKwkJCSAqICAgIFJlY2VpdmVkIG9mZG1faHQucGxjcF9lcnIsCisJCQkgKiAgICBDdXJyZW50IG9mZG1faHQucGxjcF9lcnIsCisJCQkgKiAgICBjb21iaW5lZF9wbGNwX2RlbHRhLAorCQkJICogICAgcGxjcF9tc2VjCisJCQkgKi8KKwkJCUlXTF9ERUJVR19SQURJTyhwcml2LCAicGxjcF9lcnIgZXhjZWVkZWQgJXUsICIKKwkJCQkgICAgIiV1LCAldSwgJXUsICV1LCAlZCwgJXUgbVNlY3NcbiIsCisJCQkJICAgIHByaXYtPmNmZy0+cGxjcF9kZWx0YV90aHJlc2hvbGQsCisJCQkJICAgIGxlMzJfdG9fY3B1KG9mZG0tPnBsY3BfZXJyKSwKKwkJCQkgICAgbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpLAorCQkJCSAgICBsZTMyX3RvX2NwdShvZmRtX2h0LT5wbGNwX2VyciksCisJCQkJICAgIGxlMzJfdG9fY3B1KG9mZG1faHQtPnBsY3BfZXJyKSwKKwkJCQkgICAgY29tYmluZWRfcGxjcF9kZWx0YSwgcGxjcF9tc2VjKTsKKworCQkJcmMgPSBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgaXdsX3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCit7CisJaW50IGNoYW5nZTsKKwlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCWlmIChwcml2LT5jZmctPmJ0X3N0YXRpc3RpY3MpIHsKKwkJSVdMX0RFQlVHX1JYKHByaXYsCisJCQkgICAgICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKKwkJCSAgICAgKGludClzaXplb2Yoc3RydWN0IGl3bF9idF9ub3RpZl9zdGF0aXN0aWNzKSwKKwkJCSAgICAgbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJgorCQkJICAgICBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7CisKKwkJY2hhbmdlID0gKChwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUgIT0KKwkJCSAgIHBrdC0+dS5zdGF0c19idC5nZW5lcmFsLmNvbW1vbi50ZW1wZXJhdHVyZSkgfHwKKwkJCSAgICgocHJpdi0+X2Fnbi5zdGF0aXN0aWNzX2J0LmZsYWcgJgorCQkJICAgU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykgIT0KKwkJCSAgIChwa3QtPnUuc3RhdHNfYnQuZmxhZyAmCisJCQkgICBTVEFUSVNUSUNTX1JFUExZX0ZMR19IVDQwX01PREVfTVNLKSkpOworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKKwkJaXdsX2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnN0YXRzX2J0KTsKKyNlbmRpZgorCisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX1JYKHByaXYsCisJCQkgICAgICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKKwkJCSAgICAgKGludClzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKSwKKwkJCSAgICAgbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJgorCQkJICAgICBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7CisKKwkJY2hhbmdlID0gKChwcml2LT5fYWduLnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUgIT0KKwkJCSAgIHBrdC0+dS5zdGF0cy5nZW5lcmFsLmNvbW1vbi50ZW1wZXJhdHVyZSkgfHwKKwkJCSAgICgocHJpdi0+X2Fnbi5zdGF0aXN0aWNzLmZsYWcgJgorCQkJICAgU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykgIT0KKwkJCSAgIChwa3QtPnUuc3RhdHMuZmxhZyAmCisJCQkgICBTVEFUSVNUSUNTX1JFUExZX0ZMR19IVDQwX01PREVfTVNLKSkpOworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKKwkJaXdsX2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnN0YXRzKTsKKyNlbmRpZgorCisJfQorCisJaXdsX3JlY292ZXJfZnJvbV9zdGF0aXN0aWNzKHByaXYsIHBrdCk7CisKKwlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKQorCQltZW1jcHkoJnByaXYtPl9hZ24uc3RhdGlzdGljc19idCwgJnBrdC0+dS5zdGF0c19idCwKKwkJCXNpemVvZihwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQpKTsKKwllbHNlCisJCW1lbWNweSgmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzLCAmcGt0LT51LnN0YXRzLAorCQkJc2l6ZW9mKHByaXYtPl9hZ24uc3RhdGlzdGljcykpOworCisJc2V0X2JpdChTVEFUVVNfU1RBVElTVElDUywgJnByaXYtPnN0YXR1cyk7CisKKwkvKiBSZXNjaGVkdWxlIHRoZSBzdGF0aXN0aWNzIHRpbWVyIHRvIG9jY3VyIGluCisJICogUkVHX1JFQ0FMSUJfUEVSSU9EIHNlY29uZHMgdG8gZW5zdXJlIHdlIGdldCBhCisJICogdGhlcm1hbCB1cGRhdGUgZXZlbiBpZiB0aGUgdUNvZGUgZG9lc24ndCBnaXZlCisJICogdXMgb25lICovCisJbW9kX3RpbWVyKCZwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljLCBqaWZmaWVzICsKKwkJICBtc2Vjc190b19qaWZmaWVzKFJFR19SRUNBTElCX1BFUklPRCAqIDEwMDApKTsKKworCWlmICh1bmxpa2VseSghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgJiYKKwkgICAgKHBrdC0+aGRyLmNtZCA9PSBTVEFUSVNUSUNTX05PVElGSUNBVElPTikpIHsKKwkJaXdsX3J4X2NhbGNfbm9pc2UocHJpdik7CisJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7CisJfQorCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCisJCXByaXYtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlKHByaXYpOworfQorCit2b2lkIGl3bF9yZXBseV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQoreworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCisJaWYgKGxlMzJfdG9fY3B1KHBrdC0+dS5zdGF0cy5mbGFnKSAmIFVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKSB7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUworCQltZW1zZXQoJnByaXYtPl9hZ24uYWNjdW1fc3RhdGlzdGljcywgMCwKKwkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKKwkJbWVtc2V0KCZwcml2LT5fYWduLmRlbHRhX3N0YXRpc3RpY3MsIDAsCisJCQlzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKSk7CisJCW1lbXNldCgmcHJpdi0+X2Fnbi5tYXhfZGVsdGEsIDAsCisJCQlzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKSk7CisJCW1lbXNldCgmcHJpdi0+X2Fnbi5hY2N1bV9zdGF0aXN0aWNzX2J0LCAwLAorCQkJc2l6ZW9mKHN0cnVjdCBpd2xfYnRfbm90aWZfc3RhdGlzdGljcykpOworCQltZW1zZXQoJnByaXYtPl9hZ24uZGVsdGFfc3RhdGlzdGljc19idCwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3MpKTsKKwkJbWVtc2V0KCZwcml2LT5fYWduLm1heF9kZWx0YV9idCwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3MpKTsKKyNlbmRpZgorCQlJV0xfREVCVUdfUlgocHJpdiwgIlN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCX0KKwlpd2xfcnhfc3RhdGlzdGljcyhwcml2LCByeGIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYwppbmRleCA3ZDYxNGM0Li41NWExYjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYwpAQCAtMjMzLDYgKzIzMyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgcmFfdGlkOworCWludCByZXQ7CiAKIAlpZiAoKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKIAkgICAgKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArIHByaXYtPmNmZy0+bnVtX29mX2FtcGR1X3F1ZXVlcwpAQCAtMjQ4LDcgKzI0OSw5IEBACiAJcmFfdGlkID0gQlVJTERfUkF4VElEKHN0YV9pZCwgdGlkKTsKIAogCS8qIE1vZGlmeSBkZXZpY2UncyBzdGF0aW9uIHRhYmxlIHRvIFR4IHRoaXMgVElEICovCi0JaXdsX3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChwcml2LCBzdGFfaWQsIHRpZCk7CisJcmV0ID0gaXdsX3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChwcml2LCBzdGFfaWQsIHRpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ2OSw3ICs0NzIsOCBAQAogCX0KIAogCS8qIFNldCB1cCBhbnRlbm5hcyAqLwotCXByaXYtPm1nbXRfdHhfYW50ID0gaXdsX3RvZ2dsZV90eF9hbnQocHJpdiwgcHJpdi0+bWdtdF90eF9hbnQpOworCXByaXYtPm1nbXRfdHhfYW50ID0gaXdsX3RvZ2dsZV90eF9hbnQocHJpdiwgcHJpdi0+bWdtdF90eF9hbnQsCisJCQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwogCXJhdGVfZmxhZ3MgfD0gaXdsX2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+bWdtdF90eF9hbnQpOwogCiAJLyogU2V0IHRoZSByYXRlIGluIHRoZSBUWCBjbWQgKi8KQEAgLTU2NywxMCArNTcxLDcgQEAKIAloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7CiAKIAkvKiBGaW5kIGluZGV4IGludG8gc3RhdGlvbiB0YWJsZSBmb3IgZGVzdGluYXRpb24gc3RhdGlvbiAqLwotCWlmICghaW5mby0+Y29udHJvbC5zdGEpCi0JCXN0YV9pZCA9IHByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQ7Ci0JZWxzZQotCQlzdGFfaWQgPSBpd2xfc3RhX2lkKGluZm8tPmNvbnRyb2wuc3RhKTsKKwlzdGFfaWQgPSBpd2xfc3RhX2lkX29yX2Jyb2FkY2FzdChwcml2LCBpbmZvLT5jb250cm9sLnN0YSk7CiAJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7CiAJCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLAogCQkJICAgICAgIGhkci0+YWRkcjEpOwpAQCAtNTk4LDExICs1OTksMTcgQEAKIAl9CiAKIAl0eHFfaWQgPSBnZXRfcXVldWVfZnJvbV9hYyhza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisKKwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQvc2F2ZWQgYWJvdmUgd2hlbiBsb2NraW5nIHByaXYtPmxvY2sgKi8KKwlzcGluX2xvY2soJnByaXYtPnN0YV9sb2NrKTsKKwogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CiAJCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CiAJCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7Ci0JCWlmICh1bmxpa2VseSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpCisJCWlmIChXQVJOX09OX09OQ0UodGlkID49IE1BWF9USURfQ09VTlQpKSB7CisJCQlzcGluX3VubG9jaygmcHJpdi0+c3RhX2xvY2spOwogCQkJZ290byBkcm9wX3VubG9jazsKKwkJfQogCQlzZXFfbnVtYmVyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5zZXFfbnVtYmVyOwogCQlzZXFfbnVtYmVyICY9IElFRUU4MDIxMV9TQ1RMX1NFUTsKIAkJaGRyLT5zZXFfY3RybCA9IGhkci0+c2VxX2N0cmwgJgpAQCAtNjIwLDE1ICs2MjcsMjIgQEAKIAlzd3FfaWQgPSB0eHEtPnN3cV9pZDsKIAlxID0gJnR4cS0+cTsKIAotCWlmICh1bmxpa2VseShpd2xfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKQorCWlmICh1bmxpa2VseShpd2xfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKSB7CisJCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7CiAJCWdvdG8gZHJvcF91bmxvY2s7CisJfQogCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKIAkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlKys7CisJCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoZmMpKQorCQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5zZXFfbnVtYmVyID0gc2VxX251bWJlcjsKKwl9CisKKwlzcGluX3VubG9jaygmcHJpdi0+c3RhX2xvY2spOwogCiAJLyogU2V0IHVwIGRyaXZlciBkYXRhIGZvciB0aGlzIFRGRCAqLwogCW1lbXNldCgmKHR4cS0+dHhiW3EtPndyaXRlX3B0cl0pLCAwLCBzaXplb2Yoc3RydWN0IGl3bF90eF9pbmZvKSk7Ci0JdHhxLT50eGJbcS0+d3JpdGVfcHRyXS5za2JbMF0gPSBza2I7CisJdHhxLT50eGJbcS0+d3JpdGVfcHRyXS5za2IgPSBza2I7CiAKIAkvKiBTZXQgdXAgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLwogCW91dF9jbWQgPSB0eHEtPmNtZFtxLT53cml0ZV9wdHJdOwpAQCAtNjk0LDggKzcwOCw4IEBACiAJdHhjbWRfcGh5cyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCiAJCQkJICAgICZvdXRfY21kLT5oZHIsIGxlbiwKIAkJCQkgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlwY2lfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOwotCXBjaV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGxlbik7CisJZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCB0eGNtZF9waHlzKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBsZW4pOwogCS8qIEFkZCBidWZmZXIgY29udGFpbmluZyBUeCBjb21tYW5kIGFuZCBNQUMoISkgaGVhZGVyIHRvIFRGRCdzCiAJICogZmlyc3QgZW50cnkgKi8KIAlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLApAQCAtNzAzLDggKzcxNyw2IEBACiAKIAlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCWlmIChxYykKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlciA9IHNlcV9udW1iZXI7CiAJfSBlbHNlIHsKIAkJd2FpdF93cml0ZV9wdHIgPSAxOwogCQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKQEAgLTkzOCw5ICs5NTAsMTIgQEAKIAkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwsIGFuZCB3YWl0IGZvciBpdCB0byBiZSBpZGxlICovCiAJZm9yIChjaCA9IDA7IGNoIDwgcHJpdi0+aHdfcGFyYW1zLmRtYV9jaG5sX251bTsgY2grKykgewogCQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2gpLCAweDApOwotCQlpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIX1RTU1JfVFhfU1RBVFVTX1JFRywKKwkJaWYgKGl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgRkhfVFNTUl9UWF9TVEFUVVNfUkVHLAogCQkJCSAgICBGSF9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShjaCksCi0JCQkJICAgIDEwMDApOworCQkJCSAgICAxMDAwKSkKKwkJCUlXTF9FUlIocHJpdiwgIkZhaWxpbmcgb24gdGltZW91dCB3aGlsZSBzdG9wcGluZyIKKwkJCSAgICAiIERNQSBjaGFubmVsICVkIFsweCUwOHhdIiwgY2gsCisJCQkgICAgaXdsX3JlYWRfZGlyZWN0MzIocHJpdiwgRkhfVFNTUl9UWF9TVEFUVVNfUkVHKSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTEwMDksNiArMTAyNCw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07CiAJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKIAkJSVdMX0RFQlVHX0hUKHByaXYsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7CiAJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09OOwpAQCAtMTAxOCw2ICsxMDM1LDcgQEAKIAkJCSAgICAgdGlkX2RhdGEtPnRmZHNfaW5fcXVldWUpOwogCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNDAsMTEgKzEwNTgsMTQgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwogCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSA9PQogCQkJCUlXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQSkgewogCQlJV0xfREVCVUdfSFQocHJpdiwgIkFHRyBzdG9wIGJlZm9yZSBzZXR1cCBkb25lXG4iKTsKIAkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKIAkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPSBJV0xfQUdHX09GRjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMDYyLDEzICsxMDgzLDE3IEBACiAJCUlXTF9ERUJVR19IVChwcml2LCAiU3RvcHBpbmcgYSBub24gZW1wdHkgQUdHIEhXIFFVRVVFXG4iKTsKIAkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPQogCQkJCUlXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJSVdMX0RFQlVHX0hUKHByaXYsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7CiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPSBJV0xfQUdHX09GRjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJLyogZG8gbm90IHJlc3RvcmUvc2F2ZSBpcnFzICovCisJc3Bpbl91bmxvY2soJnByaXYtPnN0YV9sb2NrKTsKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCiAJLyoKIAkgKiB0aGUgb25seSByZWFzb24gdGhpcyBjYWxsIGNhbiBmYWlsIGlzIHF1ZXVlIG51bWJlciBvdXQgb2YgcmFuZ2UsCiAJICogd2hpY2ggY2FuIGhhcHBlbiBpZiB1Q29kZSBpcyByZWxvYWRlZCBhbmQgYWxsIHRoZSBzdGF0aW9uCkBAIC0xMDkyLDYgKzExMTcsOCBAQAogCXU4ICphZGRyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7CiAJc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKIAorCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZwcml2LT5zdGFfbG9jaykpOworCiAJc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewogCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgogCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlICovCkBAIC0xMTE2LDYgKzExNDMsNyBAQAogCQl9CiAJCWJyZWFrOwogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMTU5LDEyICsxMTg3LDEyIEBACiAJICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKIAogCQl0eF9pbmZvID0gJnR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl07Ci0JCWl3bGFnbl90eF9zdGF0dXMocHJpdiwgdHhfaW5mby0+c2tiWzBdKTsKKwkJaXdsYWduX3R4X3N0YXR1cyhwcml2LCB0eF9pbmZvLT5za2IpOwogCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYlswXS0+ZGF0YTsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfaW5mby0+c2tiLT5kYXRhOwogCQlpZiAoaGRyICYmIGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQogCQkJbmZyZWVkKys7Ci0JCXR4X2luZm8tPnNrYlswXSA9IE5VTEw7CisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CiAKIAkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9pbnZhbF9ieXRlX2NudF90YmwpCiAJCQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHByaXYsIHR4cSk7CkBAIC0xMTg4LDcgKzEyMTYsNyBAQAogCWludCBpLCBzaCwgYWNrOwogCXUxNiBzZXFfY3RsID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2VxX2N0bCk7CiAJdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCXU2NCBiaXRtYXA7CisJdTY0IGJpdG1hcCwgc2VudF9iaXRtYXA7CiAJaW50IHN1Y2Nlc3NlcyA9IDA7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCkBAIC0xMjE2LDI0ICsxMjQ0LDI2IEBACiAKIAkvKiBjaGVjayBmb3Igc3VjY2VzcyBvciBmYWlsdXJlIGFjY29yZGluZyB0byB0aGUKIAkgKiB0cmFuc21pdHRlZCBiaXRtYXAgYW5kIGJsb2NrLWFjayBiaXRtYXAgKi8KLQliaXRtYXAgJj0gYWdnLT5iaXRtYXA7CisJc2VudF9iaXRtYXAgPSBiaXRtYXAgJiBhZ2ctPmJpdG1hcDsKIAogCS8qIEZvciBlYWNoIGZyYW1lIGF0dGVtcHRlZCBpbiBhZ2dyZWdhdGlvbiwKIAkgKiB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIHR4IGZyYW1lJ3Mgc3RhdHVzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBhZ2ctPmZyYW1lX2NvdW50IDsgaSsrKSB7Ci0JCWFjayA9IGJpdG1hcCAmICgxVUxMIDw8IGkpOwotCQlzdWNjZXNzZXMgKz0gISFhY2s7CisJaSA9IDA7CisJd2hpbGUgKHNlbnRfYml0bWFwKSB7CisJCWFjayA9IHNlbnRfYml0bWFwICYgMVVMTDsKKwkJc3VjY2Vzc2VzICs9IGFjazsKIAkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICIlcyBPTiBpPSVkIGlkeD0lZCByYXc9JWRcbiIsCiAJCQlhY2sgPyAiQUNLIiA6ICJOQUNLIiwgaSwgKGFnZy0+c3RhcnRfaWR4ICsgaSkgJiAweGZmLAogCQkJYWdnLT5zdGFydF9pZHggKyBpKTsKKwkJc2VudF9iaXRtYXAgPj49IDE7CisJCSsraTsKIAl9CiAKLQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbc2NkX2Zsb3ddLnR4YlthZ2ctPnN0YXJ0X2lkeF0uc2tiWzBdKTsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbc2NkX2Zsb3ddLnR4YlthZ2ctPnN0YXJ0X2lkeF0uc2tiKTsKIAltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOwogCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKIAlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVTsKIAlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9IHN1Y2Nlc3NlczsKLQlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX21hcCA9IGJpdG1hcDsKIAlpbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gYWdnLT5mcmFtZV9jb3VudDsKIAlpd2xhZ25faHdyYXRlX3RvX3R4X2NvbnRyb2wocHJpdiwgYWdnLT5yYXRlX25fZmxhZ3MsIGluZm8pOwogCkBAIC0xMjgxLDYgKzEzMTEsNyBAQAogCWludCBpbmRleDsKIAlpbnQgc3RhX2lkOwogCWludCB0aWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qICJmbG93IiBjb3JyZXNwb25kcyB0byBUeCBxdWV1ZSAqLwogCXUxNiBzY2RfZmxvdyA9IGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNjZF9mbG93KTsKQEAgLTEzMDgsNyArMTMzOSw3IEBACiAJLyogRmluZCBpbmRleCBqdXN0IGJlZm9yZSBibG9jay1hY2sgd2luZG93ICovCiAJaW5kZXggPSBpd2xfcXVldWVfZGVjX3dyYXAoYmFfcmVzcF9zY2Rfc3NuICYgMHhmZiwgdHhxLT5xLm5fYmQpOwogCi0JLyogVE9ETzogTmVlZCB0byBnZXQgdGhpcyBjb3B5IG1vcmUgc2FmZWx5IC0gbm93IGdvb2QgZm9yIGRlYnVnICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIlJFUExZX0NPTVBSRVNTRURfQkEgWyVkXSBSZWNlaXZlZCBmcm9tICVwTSwgIgogCQkJICAgInN0YV9pZCA9ICVkXG4iLApAQCAtMTM0NCw0ICsxMzc1LDYgQEAKIAogCQlpd2xhZ25fdHhxX2NoZWNrX2VtcHR5KHByaXYsIHN0YV9pZCwgdGlkLCBzY2RfZmxvdyk7CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi11Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKaW5kZXggNjM3Mjg2Yy4uNmY3NzQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKQEAgLTQyMywzICs0MjMsMTI2IEBACiAKIAlyZXR1cm4gMDsKIH0KKworCisvKioKKyAqIGl3bF92ZXJpZnlfaW5zdF9zcGFyc2UgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAorICogICB1c2luZyBzYW1wbGUgZGF0YSAxMDAgYnl0ZXMgYXBhcnQuICBJZiB0aGVzZSBzYW1wbGUgcG9pbnRzIGFyZSBnb29kLAorICogICBpdCdzIGEgcHJldHR5IGdvb2QgYmV0IHRoYXQgZXZlcnl0aGluZyBiZXR3ZWVuIHRoZW0gaXMgZ29vZCwgdG9vLgorICovCitzdGF0aWMgaW50IGl3bGNvcmVfdmVyaWZ5X2luc3Rfc3BhcnNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwgdTMyIGxlbikKK3sKKwl1MzIgdmFsOworCWludCByZXQgPSAwOworCXUzMiBlcnJjbnQgPSAwOworCXUzMiBpOworCisJSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAvc2l6ZW9mKHUzMikpIHsKKwkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCisJCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZworCQkgKiBpZiBJV0xfRExfSU8gaXMgc2V0ICovCisJCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAorCQkJaSArIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJCXZhbCA9IF9pd2xfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQllcnJjbnQrKzsKKwkJCWlmIChlcnJjbnQgPj0gMykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXdsY29yZV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgorICovCitzdGF0aWMgaW50IGl3bF92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwKKwkJCQkgdTMyIGxlbikKK3sKKwl1MzIgdmFsOworCXUzMiBzYXZlX2xlbiA9IGxlbjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgZXJyY250OworCisJSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAorCQkJICAgSVdMQUdOX1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKworCWVycmNudCA9IDA7CisJZm9yICg7IGxlbiA+IDA7IGxlbiAtPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgeworCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KKwkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCisJCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KKwkJdmFsID0gX2l3bF9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgorCQkJCSAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKKwkJCQkgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJcmV0ID0gLUVJTzsKKwkJCWVycmNudCsrOworCQkJaWYgKGVycmNudCA+PSAyMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZXJyY250KQorCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkgICAgInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXdsX3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAorICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKKyAqLworaW50IGl3bF92ZXJpZnlfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCV9fbGUzMiAqaW1hZ2U7CisJdTMyIGxlbjsKKwlpbnQgcmV0OworCisJLyogVHJ5IGJvb3RzdHJhcCAqLworCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyOworCWxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOworCXJldCA9IGl3bGNvcmVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOworCWlmICghcmV0KSB7CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJCb290c3RyYXAgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgaW5pdGlhbGl6ZSAqLworCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2luaXQudl9hZGRyOworCWxlbiA9IHByaXYtPnVjb2RlX2luaXQubGVuOworCXJldCA9IGl3bGNvcmVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOworCWlmICghcmV0KSB7CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXplIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVHJ5IHJ1bnRpbWUvcHJvdG9jb2wgKi8KKwlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9jb2RlLnZfYWRkcjsKKwlsZW4gPSBwcml2LT51Y29kZV9jb2RlLmxlbjsKKwlyZXQgPSBpd2xjb3JlX3ZlcmlmeV9pbnN0X3NwYXJzZShwcml2LCBpbWFnZSwgbGVuKTsKKwlpZiAoIXJldCkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCUlXTF9FUlIocHJpdiwgIk5PIFZBTElEIFVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0hIVxuIik7CisKKwkvKiBTaW5jZSBub3RoaW5nIHNlZW1zIHRvIG1hdGNoLCBzaG93IGZpcnN0IHNldmVyYWwgZGF0YSBlbnRyaWVzIGluCisJICogaW5zdHJ1Y3Rpb24gU1JBTSwgc28gbWF5YmUgdmlzdWFsIGluc3BlY3Rpb24gd2lsbCBnaXZlIGEgY2x1ZS4KKwkgKiBTZWxlY3Rpb24gb2YgYm9vdHN0cmFwIGltYWdlICh2cy4gb3RoZXIgaW1hZ2VzKSBpcyBhcmJpdHJhcnkuICovCisJaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7CisJbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47CisJcmV0ID0gaXdsX3ZlcmlmeV9pbnN0X2Z1bGwocHJpdiwgaW1hZ2UsIGxlbik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwppbmRleCAyNGFmZjY1Li4zNTMzN2IxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEyMCw3ICsxMjIsNyBAQAogCSAgICAocHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCAhPSBwcml2LT5zdGFnaW5nX3J4b24uY2hhbm5lbCkpIHsKIAkJSVdMX0RFQlVHXzExSChwcml2LCAiYWJvcnQgY2hhbm5lbCBzd2l0Y2ggb24gJWRcbiIsCiAJCSAgICAgIGxlMTZfdG9fY3B1KHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwpKTsKLQkJcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCWl3bF9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKIAl9CiAKIAkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKQEAgLTI5Miw5ICsyOTQsNyBAQAogCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCiAJCQkJCSAgaW50IGxlZnQpCiB7Ci0JaWYgKCFpd2xfaXNfYXNzb2NpYXRlZChwcml2KSB8fCAhcHJpdi0+aWJzc19iZWFjb24gfHwKLQkgICAgKChwcml2LT5pd19tb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJgotCSAgICAgKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApKSkKKwlpZiAoIXByaXYtPmlic3NfYmVhY29uKQogCQlyZXR1cm4gMDsKIAogCWlmIChwcml2LT5pYnNzX2JlYWNvbi0+bGVuID4gbGVmdCkKQEAgLTM2Nyw3ICszNjcsOCBAQAogCiAJLyogU2V0IHVwIHBhY2tldCByYXRlIGFuZCBmbGFncyAqLwogCXJhdGUgPSBpd2xfcmF0ZV9nZXRfbG93ZXN0X3BsY3AocHJpdik7Ci0JcHJpdi0+bWdtdF90eF9hbnQgPSBpd2xfdG9nZ2xlX3R4X2FudChwcml2LCBwcml2LT5tZ210X3R4X2FudCk7CisJcHJpdi0+bWdtdF90eF9hbnQgPSBpd2xfdG9nZ2xlX3R4X2FudChwcml2LCBwcml2LT5tZ210X3R4X2FudCwKKwkJCQkJICAgICAgcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7CiAJcmF0ZV9mbGFncyA9IGl3bF9hbnRfaWR4X3RvX2ZsYWdzKHByaXYtPm1nbXRfdHhfYW50KTsKIAlpZiAoKHJhdGUgPj0gSVdMX0ZJUlNUX0NDS19SQVRFKSAmJiAocmF0ZSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkpCiAJCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKQEAgLTQ3NCwxOCArNDc1LDI1IEBACiAJLyogVW5tYXAgdHhfY21kICovCiAJaWYgKG51bV90YnMpCiAJCXBjaV91bm1hcF9zaW5nbGUoZGV2LAotCQkJCXBjaV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKLQkJCQlwY2lfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAorCQkJCWRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKKwkJCQlkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAogCQkJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAKIAkvKiBVbm1hcCBjaHVua3MsIGlmIGFueS4gKi8KLQlmb3IgKGkgPSAxOyBpIDwgbnVtX3RiczsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKIAkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGl3bF90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKIAkJCQlpd2xfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwgUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJaWYgKHR4cS0+dHhiKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiW2kgLSAxXSk7Ci0JCQl0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYltpIC0gMV0gPSBOVUxMOworCS8qIGZyZWUgU0tCICovCisJaWYgKHR4cS0+dHhiKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2I7CisKKwkJLyogY2FuIGJlIGNhbGxlZCBmcm9tIGlycXMtZGlzYWJsZWQgY29udGV4dCAqLworCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOwogCQl9CiAJfQogfQpAQCAtODUxLDYgKzg1OSwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpd2xfYmdfdHhfZmx1c2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIHR4X2ZsdXNoKTsKKworCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJLyogZG8gbm90aGluZyBpZiByZi1raWxsIGlzIG9uICovCisJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdikpCisJCXJldHVybjsKKworCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50eGZpZm9fZmx1c2gpIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgImRldmljZSByZXF1ZXN0OiBmbHVzaCBhbGwgdHggZnJhbWVzXG4iKTsKKwkJaXdsYWduX2Rldl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKTsKKwl9Cit9CisKIC8qKgogICogaXdsX3NldHVwX3J4X2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcwogICoKQEAgLTkzMyw2ICs5NTksOCBAQAogCQlmaWxsX3J4ID0gMTsKIAogCXdoaWxlIChpICE9IHIpIHsKKwkJaW50IGxlbjsKKwogCQlyeGIgPSByeHEtPnF1ZXVlW2ldOwogCiAJCS8qIElmIGFuIFJYQiBkb2Vzbid0IGhhdmUgYSBSeCBxdWV1ZSBzbG90IGFzc29jaWF0ZWQgd2l0aCBpdCwKQEAgLTk0Nyw4ICs5NzUsOSBAQAogCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CiAKLQkJdHJhY2VfaXdsd2lmaV9kZXZfcngocHJpdiwgcGt0LAotCQkJbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7CisJCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KKwkJdHJhY2VfaXdsd2lmaV9kZXZfcngocHJpdiwgcGt0LCBsZW4pOwogCiAJCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKIAkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KQEAgLTE0NTAsMTMgKzE0NzksMTMgQEAKIAogCWFjdHVhbF9hY2tfY250X2RlbHRhID0KIAkJbGUzMl90b19jcHUocGt0LT51LnN0YXRzLnR4LmFjdHVhbF9hY2tfY250KSAtCi0JCWxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3MudHguYWN0dWFsX2Fja19jbnQpOworCQlsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3MudHguYWN0dWFsX2Fja19jbnQpOwogCWV4cGVjdGVkX2Fja19jbnRfZGVsdGEgPQogCQlsZTMyX3RvX2NwdShwa3QtPnUuc3RhdHMudHguZXhwZWN0ZWRfYWNrX2NudCkgLQotCQlsZTMyX3RvX2NwdShwcml2LT5zdGF0aXN0aWNzLnR4LmV4cGVjdGVkX2Fja19jbnQpOworCQlsZTMyX3RvX2NwdShwcml2LT5fYWduLnN0YXRpc3RpY3MudHguZXhwZWN0ZWRfYWNrX2NudCk7CiAJYmFfdGltZW91dF9kZWx0YSA9CiAJCWxlMzJfdG9fY3B1KHBrdC0+dS5zdGF0cy50eC5hZ2cuYmFfdGltZW91dCkgLQotCQlsZTMyX3RvX2NwdShwcml2LT5zdGF0aXN0aWNzLnR4LmFnZy5iYV90aW1lb3V0KTsKKwkJbGUzMl90b19jcHUocHJpdi0+X2Fnbi5zdGF0aXN0aWNzLnR4LmFnZy5iYV90aW1lb3V0KTsKIAlpZiAoKHByaXYtPl9hZ24uYWdnX3RpZHNfY291bnQgPiAwKSAmJgogCSAgICAoZXhwZWN0ZWRfYWNrX2NudF9kZWx0YSA+IDApICYmCiAJICAgICgoKGFjdHVhbF9hY2tfY250X2RlbHRhICogMTAwKSAvIGV4cGVjdGVkX2Fja19jbnRfZGVsdGEpCkBAIC0xNDY2LDEyICsxNDk1LDE3IEBACiAJCQkJIiBleHBlY3RlZF9hY2tfY250ID0gJWRcbiIsCiAJCQkJYWN0dWFsX2Fja19jbnRfZGVsdGEsIGV4cGVjdGVkX2Fja19jbnRfZGVsdGEpOwogCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCisJCS8qCisJCSAqIFRoaXMgaXMgaWZkZWYnZWQgb24gREVCVUdGUyBiZWNhdXNlIG90aGVyd2lzZSB0aGUKKwkJICogc3RhdGlzdGljcyBhcmVuJ3QgYXZhaWxhYmxlLiBJZiBERUJVR0ZTIGlzIHNldCBidXQKKwkJICogREVCVUcgaXMgbm90LCB0aGVzZSB3aWxsIGp1c3QgY29tcGlsZSBvdXQuCisJCSAqLwogCQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInJ4X2RldGVjdGVkX2NudCBkZWx0YSA9ICVkXG4iLAotCQkJCXByaXYtPmRlbHRhX3N0YXRpc3RpY3MudHgucnhfZGV0ZWN0ZWRfY250KTsKKwkJCQlwcml2LT5fYWduLmRlbHRhX3N0YXRpc3RpY3MudHgucnhfZGV0ZWN0ZWRfY250KTsKIAkJSVdMX0RFQlVHX1JBRElPKHByaXYsCiAJCQkJImFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbiBkZWx0YSA9ICVkXG4iLAotCQkJCXByaXYtPmRlbHRhX3N0YXRpc3RpY3MudHguCisJCQkJcHJpdi0+X2Fnbi5kZWx0YV9zdGF0aXN0aWNzLnR4LgogCQkJCWFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbik7CiAjZW5kaWYKIAkJSVdMX0RFQlVHX1JBRElPKHByaXYsICJhZ2cgYmFfdGltZW91dCBkZWx0YSA9ICVkXG4iLApAQCAtMTY1OCw2ICsxNjkyLDcgQEAKIAogc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgewogCXUzMiBtYXhfcHJvYmVfbGVuZ3RoOworCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKIH07CiAKIHN0YXRpYyB2b2lkIGl3bF91Y29kZV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3Jhdywgdm9pZCAqY29udGV4dCk7CkBAIC0xNjk0LDYgKzE3MjksOSBAQAogCXNpemVfdCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOwogCiAJdTMyIGJ1aWxkOworCisJdTMyIGluaXRfZXZ0bG9nX3B0ciwgaW5pdF9ldnRsb2dfc2l6ZSwgaW5pdF9lcnJsb2dfcHRyOworCXUzMiBpbnN0X2V2dGxvZ19wdHIsIGluc3RfZXZ0bG9nX3NpemUsIGluc3RfZXJybG9nX3B0cjsKIH07CiAKIHN0YXRpYyBpbnQgaXdsYWduX2xvYWRfbGVnYWN5X2Zpcm13YXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTE3ODcsMTIgKzE4MjUsMjAgQEAKIAljb25zdCB1OCAqZGF0YTsKIAlpbnQgd2FudGVkX2FsdGVybmF0aXZlID0gaXdsYWduX3dhbnRlZF91Y29kZV9hbHRlcm5hdGl2ZSwgdG1wOwogCXU2NCBhbHRlcm5hdGl2ZXM7CisJdTMyIHRsdl9sZW47CisJZW51bSBpd2xfdWNvZGVfdGx2X3R5cGUgdGx2X3R5cGU7CisJY29uc3QgdTggKnRsdl9kYXRhOwogCi0JaWYgKGxlbiA8IHNpemVvZigqdWNvZGUpKQorCWlmIChsZW4gPCBzaXplb2YoKnVjb2RlKSkgeworCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBoYXMgaW52YWxpZCBsZW5ndGg6ICV6ZFxuIiwgbGVuKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKHVjb2RlLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihJV0xfVExWX1VDT0RFX01BR0lDKSkKKwlpZiAodWNvZGUtPm1hZ2ljICE9IGNwdV90b19sZTMyKElXTF9UTFZfVUNPREVfTUFHSUMpKSB7CisJCUlXTF9FUlIocHJpdiwgImludmFsaWQgdUNvZGUgbWFnaWM6IDBYJXhcbiIsCisJCQlsZTMyX3RvX2NwdSh1Y29kZS0+bWFnaWMpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyoKIAkgKiBDaGVjayB3aGljaCBhbHRlcm5hdGl2ZXMgYXJlIHByZXNlbnQsIGFuZCAiZG93bmdyYWRlIgpAQCAtMTgxOCwxMCArMTg2NCw3IEBACiAJbGVuIC09IHNpemVvZigqdWNvZGUpOwogCiAJd2hpbGUgKGxlbiA+PSBzaXplb2YoKnRsdikpIHsKLQkJdTMyIHRsdl9sZW47Ci0JCWVudW0gaXdsX3Vjb2RlX3Rsdl90eXBlIHRsdl90eXBlOwogCQl1MTYgdGx2X2FsdDsKLQkJY29uc3QgdTggKnRsdl9kYXRhOwogCiAJCWxlbiAtPSBzaXplb2YoKnRsdik7CiAJCXRsdiA9ICh2b2lkICopZGF0YTsKQEAgLTE4MzEsOCArMTg3NCwxMSBAQAogCQl0bHZfYWx0ID0gbGUxNl90b19jcHUodGx2LT5hbHRlcm5hdGl2ZSk7CiAJCXRsdl9kYXRhID0gdGx2LT5kYXRhOwogCi0JCWlmIChsZW4gPCB0bHZfbGVuKQorCQlpZiAobGVuIDwgdGx2X2xlbikgeworCQkJSVdMX0VSUihwcml2LCAiaW52YWxpZCBUTFYgbGVuOiAlemQvJXVcbiIsCisJCQkJbGVuLCB0bHZfbGVuKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCWxlbiAtPSBBTElHTih0bHZfbGVuLCA0KTsKIAkJZGF0YSArPSBzaXplb2YoKnRsdikgKyBBTElHTih0bHZfbGVuLCA0KTsKIApAQCAtMTg2NiwyMCArMTkxMiw3NyBAQAogCQkJcGllY2VzLT5ib290X3NpemUgPSB0bHZfbGVuOwogCQkJYnJlYWs7CiAJCWNhc2UgSVdMX1VDT0RFX1RMVl9QUk9CRV9NQVhfTEVOOgotCQkJaWYgKHRsdl9sZW4gIT0gNCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh0bHZfbGVuICE9IHNpemVvZih1MzIpKQorCQkJCWdvdG8gaW52YWxpZF90bHZfbGVuOwogCQkJY2FwYS0+bWF4X3Byb2JlX2xlbmd0aCA9Ci0JCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKil0bHZfZGF0YSk7CisJCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopdGx2X2RhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSVdMX1VDT0RFX1RMVl9JTklUX0VWVExPR19QVFI6CisJCQlpZiAodGx2X2xlbiAhPSBzaXplb2YodTMyKSkKKwkJCQlnb3RvIGludmFsaWRfdGx2X2xlbjsKKwkJCXBpZWNlcy0+aW5pdF9ldnRsb2dfcHRyID0KKwkJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKil0bHZfZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJV0xfVUNPREVfVExWX0lOSVRfRVZUTE9HX1NJWkU6CisJCQlpZiAodGx2X2xlbiAhPSBzaXplb2YodTMyKSkKKwkJCQlnb3RvIGludmFsaWRfdGx2X2xlbjsKKwkJCXBpZWNlcy0+aW5pdF9ldnRsb2dfc2l6ZSA9CisJCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopdGx2X2RhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSVdMX1VDT0RFX1RMVl9JTklUX0VSUkxPR19QVFI6CisJCQlpZiAodGx2X2xlbiAhPSBzaXplb2YodTMyKSkKKwkJCQlnb3RvIGludmFsaWRfdGx2X2xlbjsKKwkJCXBpZWNlcy0+aW5pdF9lcnJsb2dfcHRyID0KKwkJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKil0bHZfZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJV0xfVUNPREVfVExWX1JVTlRfRVZUTE9HX1BUUjoKKwkJCWlmICh0bHZfbGVuICE9IHNpemVvZih1MzIpKQorCQkJCWdvdG8gaW52YWxpZF90bHZfbGVuOworCQkJcGllY2VzLT5pbnN0X2V2dGxvZ19wdHIgPQorCQkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKXRsdl9kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElXTF9VQ09ERV9UTFZfUlVOVF9FVlRMT0dfU0laRToKKwkJCWlmICh0bHZfbGVuICE9IHNpemVvZih1MzIpKQorCQkJCWdvdG8gaW52YWxpZF90bHZfbGVuOworCQkJcGllY2VzLT5pbnN0X2V2dGxvZ19zaXplID0KKwkJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKil0bHZfZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJV0xfVUNPREVfVExWX1JVTlRfRVJSTE9HX1BUUjoKKwkJCWlmICh0bHZfbGVuICE9IHNpemVvZih1MzIpKQorCQkJCWdvdG8gaW52YWxpZF90bHZfbGVuOworCQkJcGllY2VzLT5pbnN0X2VycmxvZ19wdHIgPQorCQkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKXRsdl9kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElXTF9VQ09ERV9UTFZfRU5IQU5DRV9TRU5TX1RCTDoKKwkJCWlmICh0bHZfbGVuKQorCQkJCWdvdG8gaW52YWxpZF90bHZfbGVuOworCQkJcHJpdi0+ZW5oYW5jZV9zZW5zaXRpdml0eV90YWJsZSA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBJV0xfVUNPREVfVExWX1BIWV9DQUxJQlJBVElPTl9TSVpFOgorCQkJaWYgKHRsdl9sZW4gIT0gc2l6ZW9mKHUzMikpCisJCQkJZ290byBpbnZhbGlkX3Rsdl9sZW47CisJCQljYXBhLT5zdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSA9CisJCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopdGx2X2RhdGEpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CisJCQlJV0xfV0FSTihwcml2LCAidW5rbm93biBUTFY6ICVkXG4iLCB0bHZfdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmIChsZW4pCisJaWYgKGxlbikgeworCQlJV0xfRVJSKHByaXYsICJpbnZhbGlkIFRMViBhZnRlciBwYXJzaW5nOiAlemRcbiIsIGxlbik7CisJCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfRlcsICh1OCAqKWRhdGEsIGxlbik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiAwOworCisgaW52YWxpZF90bHZfbGVuOgorCUlXTF9FUlIocHJpdiwgIlRMViAlZCBoYXMgaW52YWxpZCBzaXplOiAldVxuIiwgdGx2X3R5cGUsIHRsdl9sZW4pOworCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfRlcsIHRsdl9kYXRhLCB0bHZfbGVuKTsKKworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKQEAgLTE5MDEsNiArMjAwNCw4IEBACiAJdTMyIGJ1aWxkOwogCXN0cnVjdCBpd2xhZ25fdWNvZGVfY2FwYWJpbGl0aWVzIHVjb2RlX2NhcGEgPSB7CiAJCS5tYXhfcHJvYmVfbGVuZ3RoID0gMjAwLAorCQkuc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemUgPQorCQkJSVdMX01BWF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFLAogCX07CiAKIAltZW1zZXQoJnBpZWNlcywgMCwgc2l6ZW9mKHBpZWNlcykpOwpAQCAtMjA2Myw2ICsyMTY4LDI2IEBACiAJCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAJfQogCisJLyogTm93IHRoYXQgd2UgY2FuIG5vIGxvbmdlciBmYWlsLCBjb3B5IGluZm9ybWF0aW9uICovCisKKwkvKgorCSAqIFRoZSAoc2l6ZSAtIDE2KSAvIDEyIGZvcm11bGEgaXMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHJlY29yZGVkCisJICogZm9yIGVhY2ggZXZlbnQsIHdoaWNoIGlzIG9mIG1vZGUgMSAoaW5jbHVkaW5nIHRpbWVzdGFtcCkgZm9yIGFsbAorCSAqIG5ldyBtaWNyb2NvZGVzIHRoYXQgaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uLgorCSAqLworCXByaXYtPl9hZ24uaW5pdF9ldnRsb2dfcHRyID0gcGllY2VzLmluaXRfZXZ0bG9nX3B0cjsKKwlpZiAocGllY2VzLmluaXRfZXZ0bG9nX3NpemUpCisJCXByaXYtPl9hZ24uaW5pdF9ldnRsb2dfc2l6ZSA9IChwaWVjZXMuaW5pdF9ldnRsb2dfc2l6ZSAtIDE2KS8xMjsKKwllbHNlCisJCXByaXYtPl9hZ24uaW5pdF9ldnRsb2dfc2l6ZSA9IHByaXYtPmNmZy0+bWF4X2V2ZW50X2xvZ19zaXplOworCXByaXYtPl9hZ24uaW5pdF9lcnJsb2dfcHRyID0gcGllY2VzLmluaXRfZXJybG9nX3B0cjsKKwlwcml2LT5fYWduLmluc3RfZXZ0bG9nX3B0ciA9IHBpZWNlcy5pbnN0X2V2dGxvZ19wdHI7CisJaWYgKHBpZWNlcy5pbnN0X2V2dGxvZ19zaXplKQorCQlwcml2LT5fYWduLmluc3RfZXZ0bG9nX3NpemUgPSAocGllY2VzLmluc3RfZXZ0bG9nX3NpemUgLSAxNikvMTI7CisJZWxzZQorCQlwcml2LT5fYWduLmluc3RfZXZ0bG9nX3NpemUgPSBwcml2LT5jZmctPm1heF9ldmVudF9sb2dfc2l6ZTsKKwlwcml2LT5fYWduLmluc3RfZXJybG9nX3B0ciA9IHBpZWNlcy5pbnN0X2VycmxvZ19wdHI7CisKIAkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLwogCiAJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KQEAgLTIxMDIsNiArMjIyNywyMCBAQAogCQkJcGllY2VzLmJvb3Rfc2l6ZSk7CiAJbWVtY3B5KHByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyLCBwaWVjZXMuYm9vdCwgcGllY2VzLmJvb3Rfc2l6ZSk7CiAKKwkvKgorCSAqIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBvZiBjaGFpbiBub2lzZSByZXNldCBhbmQgZ2FpbiBjb21tYW5kcworCSAqIGJhc2Ugb24gdGhlIHNpemUgb2Ygc3RhbmRhcmQgcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzIHRhYmxlIHNpemUKKwkgKi8KKwlpZiAodWNvZGVfY2FwYS5zdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSA+CisJICAgIElXTF9NQVhfUEhZX0NBTElCUkFURV9UQkxfU0laRSkKKwkJdWNvZGVfY2FwYS5zdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSA9CisJCQlJV0xfTUFYX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkU7CisKKwlwcml2LT5fYWduLnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQgPQorCQl1Y29kZV9jYXBhLnN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplOworCXByaXYtPl9hZ24ucGh5X2NhbGliX2NoYWluX25vaXNlX2dhaW5fY21kID0KKwkJdWNvZGVfY2FwYS5zdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSArIDE7CisKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkgKiBUaGlzIGlzIHN0aWxsIHBhcnQgb2YgcHJvYmUoKSBpbiBhIHNlbnNlLi4uCiAJICoKQEAgLTIxNzIsMTcgKzIzMTEsNDEgQEAKIAkiREVCVUdfMSIsCiAJIkRFQlVHXzIiLAogCSJERUJVR18zIiwKLQkiQURWQU5DRUQgU1lTQVNTRVJUIgogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmRlc2NfbG9va3VwKGludCBpKQorc3RhdGljIHN0cnVjdCB7IGNoYXIgKm5hbWU7IHU4IG51bTsgfSBhZHZhbmNlZF9sb29rdXBbXSA9IHsKKwl7ICJOTUlfSU5URVJSVVBUX1dERyIsIDB4MzQgfSwKKwl7ICJTWVNBU1NFUlQiLCAweDM1IH0sCisJeyAiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsIDB4MzcgfSwKKwl7ICJCQURfQ09NTUFORCIsIDB4MzggfSwKKwl7ICJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwgMHgzQyB9LAorCXsgIkZBVEFMX0VSUk9SIiwgMHgzRCB9LAorCXsgIk5NSV9UUk1fSFdfRVJSIiwgMHg0NiB9LAorCXsgIk5NSV9JTlRFUlJVUFRfVFJNIiwgMHg0QyB9LAorCXsgIk5NSV9JTlRFUlJVUFRfQlJFQUtfUE9JTlQiLCAweDU0IH0sCisJeyAiTk1JX0lOVEVSUlVQVF9XREdfUlhGX0ZVTEwiLCAweDVDIH0sCisJeyAiTk1JX0lOVEVSUlVQVF9XREdfTk9fUkJEX1JYRl9GVUxMIiwgMHg2NCB9LAorCXsgIk5NSV9JTlRFUlJVUFRfSE9TVCIsIDB4NjYgfSwKKwl7ICJOTUlfSU5URVJSVVBUX0FDVElPTl9QVCIsIDB4N0MgfSwKKwl7ICJOTUlfSU5URVJSVVBUX1VOS05PV04iLCAweDg0IH0sCisJeyAiTk1JX0lOVEVSUlVQVF9JTlNUX0FDVElPTl9QVCIsIDB4ODYgfSwKKwl7ICJBRFZBTkNFRF9TWVNBU1NFUlQiLCAwIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZGVzY19sb29rdXAodTMyIG51bSkKIHsKLQlpbnQgbWF4ID0gQVJSQVlfU0laRShkZXNjX2xvb2t1cF90ZXh0KSAtIDE7CisJaW50IGk7CisJaW50IG1heCA9IEFSUkFZX1NJWkUoZGVzY19sb29rdXBfdGV4dCk7CiAKLQlpZiAoaSA8IDAgfHwgaSA+IG1heCkKLQkJaSA9IG1heDsKKwlpZiAobnVtIDwgbWF4KQorCQlyZXR1cm4gZGVzY19sb29rdXBfdGV4dFtudW1dOwogCi0JcmV0dXJuIGRlc2NfbG9va3VwX3RleHRbaV07CisJbWF4ID0gQVJSQVlfU0laRShhZHZhbmNlZF9sb29rdXApIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJaWYgKGFkdmFuY2VkX2xvb2t1cFtpXS5udW0gPT0gbnVtKQorCQkJYnJlYWs7OworCX0KKwlyZXR1cm4gYWR2YW5jZWRfbG9va3VwW2ldLm5hbWU7CiB9CiAKICNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQpAQCAtMjE5NSwxMCArMjM1OCwxNSBAQAogCXUzMiBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazI7CiAJdTMyIHBjLCBoY21kOwogCi0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKKwlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKSB7CiAJCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKLQllbHNlCisJCWlmICghYmFzZSkKKwkJCWJhc2UgPSBwcml2LT5fYWduLmluaXRfZXJybG9nX3B0cjsKKwl9IGVsc2UgewogCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCQlpZiAoIWJhc2UpCisJCQliYXNlID0gcHJpdi0+X2Fnbi5pbnN0X2VycmxvZ19wdHI7CisJfQogCiAJaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT5pc192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CiAJCUlXTF9FUlIocHJpdiwKQEAgLTIyMzAsOSArMjM5OCw5IEBACiAJdHJhY2VfaXdsd2lmaV9kZXZfdWNvZGVfZXJyb3IocHJpdiwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lLAogCQkJCSAgICAgIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMik7CiAKLQlJV0xfRVJSKHByaXYsICJEZXNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgIgorCUlXTF9FUlIocHJpdiwgIkRlc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICAiCiAJCSJkYXRhMSAgICAgIGRhdGEyICAgICAgbGluZVxuIik7Ci0JSVdMX0VSUihwcml2LCAiJS0yOHMgKCMlMDJkKSAlMDEwdSAweCUwOFggMHglMDhYICV1XG4iLAorCUlXTF9FUlIocHJpdiwgIiUtMjhzICgweCUwNFgpICUwMTB1IDB4JTA4WCAweCUwOFggJXVcbiIsCiAJCWRlc2NfbG9va3VwKGRlc2MpLCBkZXNjLCB0aW1lLCBkYXRhMSwgZGF0YTIsIGxpbmUpOwogCUlXTF9FUlIocHJpdiwgInBjICAgICAgYmxpbmsxICBibGluazIgIGlsaW5rMSAgaWxpbmsyICBoY21kXG4iKTsKIAlJV0xfRVJSKHByaXYsICIweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WFxuIiwKQEAgLTIyNTgsMTAgKzI0MjYsMTYgQEAKIAogCWlmIChudW1fZXZlbnRzID09IDApCiAJCXJldHVybiBwb3M7Ci0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKKworCWlmIChwcml2LT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpIHsKIAkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQllbHNlCisJCWlmICghYmFzZSkKKwkJCWJhc2UgPSBwcml2LT5fYWduLmluaXRfZXZ0bG9nX3B0cjsKKwl9IGVsc2UgewogCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKKwkJaWYgKCFiYXNlKQorCQkJYmFzZSA9IHByaXYtPl9hZ24uaW5zdF9ldnRsb2dfcHRyOworCX0KIAogCWlmIChtb2RlID09IDApCiAJCWV2ZW50X3NpemUgPSAyICogc2l6ZW9mKHUzMik7CkBAIC0yMzYzLDEzICsyNTM3LDIxIEBACiAJdTMyIG51bV93cmFwczsgIC8qICMgdGltZXMgdUNvZGUgd3JhcHBlZCB0byB0b3Agb2YgbG9nICovCiAJdTMyIG5leHRfZW50cnk7IC8qIGluZGV4IG9mIG5leHQgZW50cnkgdG8gYmUgd3JpdHRlbiBieSB1Q29kZSAqLwogCXUzMiBzaXplOyAgICAgICAvKiAjIGVudHJpZXMgdGhhdCB3ZSdsbCBwcmludCAqLworCXUzMiBsb2dzaXplOwogCWludCBwb3MgPSAwOwogCXNpemVfdCBidWZzeiA9IDA7CiAKLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQorCWlmIChwcml2LT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpIHsKIAkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQllbHNlCisJCWxvZ3NpemUgPSBwcml2LT5fYWduLmluaXRfZXZ0bG9nX3NpemU7CisJCWlmICghYmFzZSkKKwkJCWJhc2UgPSBwcml2LT5fYWduLmluaXRfZXZ0bG9nX3B0cjsKKwl9IGVsc2UgewogCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKKwkJbG9nc2l6ZSA9IHByaXYtPl9hZ24uaW5zdF9ldnRsb2dfc2l6ZTsKKwkJaWYgKCFiYXNlKQorCQkJYmFzZSA9IHByaXYtPl9hZ24uaW5zdF9ldnRsb2dfcHRyOworCX0KIAogCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewogCQlJV0xfRVJSKHByaXYsCkBAIC0yMzg0LDE2ICsyNTY2LDE2IEBACiAJbnVtX3dyYXBzID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgyICogc2l6ZW9mKHUzMikpKTsKIAluZXh0X2VudHJ5ID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgzICogc2l6ZW9mKHUzMikpKTsKIAotCWlmIChjYXBhY2l0eSA+IHByaXYtPmNmZy0+bWF4X2V2ZW50X2xvZ19zaXplKSB7CisJaWYgKGNhcGFjaXR5ID4gbG9nc2l6ZSkgewogCQlJV0xfRVJSKHByaXYsICJMb2cgY2FwYWNpdHkgJWQgaXMgYm9ndXMsIGxpbWl0IHRvICVkIGVudHJpZXNcbiIsCi0JCQljYXBhY2l0eSwgcHJpdi0+Y2ZnLT5tYXhfZXZlbnRfbG9nX3NpemUpOwotCQljYXBhY2l0eSA9IHByaXYtPmNmZy0+bWF4X2V2ZW50X2xvZ19zaXplOworCQkJY2FwYWNpdHksIGxvZ3NpemUpOworCQljYXBhY2l0eSA9IGxvZ3NpemU7CiAJfQogCi0JaWYgKG5leHRfZW50cnkgPiBwcml2LT5jZmctPm1heF9ldmVudF9sb2dfc2l6ZSkgeworCWlmIChuZXh0X2VudHJ5ID4gbG9nc2l6ZSkgewogCQlJV0xfRVJSKHByaXYsICJMb2cgd3JpdGUgaW5kZXggJWQgaXMgYm9ndXMsIGxpbWl0IHRvICVkXG4iLAotCQkJbmV4dF9lbnRyeSwgcHJpdi0+Y2ZnLT5tYXhfZXZlbnRfbG9nX3NpemUpOwotCQluZXh0X2VudHJ5ID0gcHJpdi0+Y2ZnLT5tYXhfZXZlbnRfbG9nX3NpemU7CisJCQluZXh0X2VudHJ5LCBsb2dzaXplKTsKKwkJbmV4dF9lbnRyeSA9IGxvZ3NpemU7CiAJfQogCiAJc2l6ZSA9IG51bV93cmFwcyA/IGNhcGFjaXR5IDogbmV4dF9lbnRyeTsKQEAgLTI1MTgsOCArMjcwMCw2IEBACiAKIAkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKIAkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2KTsKLQotCQltZW1jcHkocHJpdi0+c3RhZ2luZ19yeG9uLm5vZGVfYWRkciwgcHJpdi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAl9CiAKIAkvKiBDb25maWd1cmUgQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBzdXBwb3J0ICovCkBAIC0yODQzLDkgKzMwMjMsMTcgQEAKIAl9CiAKIAlpZiAocHJpdi0+c3RhcnRfY2FsaWIpIHsKLQkJaXdsX2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHByaXYsICZwcml2LT5zdGF0aXN0aWNzKTsKLQotCQlpd2xfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24ocHJpdiwgJnByaXYtPnN0YXRpc3RpY3MpOworCQlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKSB7CisJCQlpd2xfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24ocHJpdiwKKwkJCQkJKHZvaWQgKikmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzX2J0KTsKKwkJCWl3bF9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihwcml2LAorCQkJCQkodm9pZCAqKSZwcml2LT5fYWduLnN0YXRpc3RpY3NfYnQpOworCQl9IGVsc2UgeworCQkJaXdsX2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHByaXYsCisJCQkJCSh2b2lkICopJnByaXYtPl9hZ24uc3RhdGlzdGljcyk7CisJCQlpd2xfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24ocHJpdiwKKwkJCQkJKHZvaWQgKikmcHJpdi0+X2Fnbi5zdGF0aXN0aWNzKTsKKwkJfQogCX0KIAogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwpAQCAtMjkzNCwyMCArMzEyMiwxNiBAQAogCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiYXNzb2MgaWQgJWQgYmVhY29uIGludGVydmFsICVkXG4iLAogCQkJdmlmLT5ic3NfY29uZi5haWQsIHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7CiAKLQlpZiAodmlmLT5ic3NfY29uZi5hc3NvY19jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKIAllbHNlCiAJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwogCiAJaWYgKHByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgewotCQlpZiAodmlmLT5ic3NfY29uZi5hc3NvY19jYXBhYmlsaXR5ICYKLQkJCQkJV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSkKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CiAJCWVsc2UKIAkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0KLQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CiAJfQogCiAJaXdsY29yZV9jb21taXRfcnhvbihwcml2KTsKQEAgLTMxNzMsOCArMzM1Nyw3IEBACiAKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmFzc29jX2lkID0gMDsKIAotCQlpZiAodmlmLT5ic3NfY29uZi5hc3NvY19jYXBhYmlsaXR5ICYKLQkJCQkJCVdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzIHw9CiAJCQkJUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwogCQllbHNlCkBAIC0zMTgyLDE3ICszMzY1LDEyIEBACiAJCQkJflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKIAogCQlpZiAocHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCQlpZiAodmlmLT5ic3NfY29uZi5hc3NvY19jYXBhYmlsaXR5ICYKLQkJCQkJCVdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUUpCisJCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKIAkJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0KIAkJCQkJUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CiAJCQllbHNlCiAJCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9CiAJCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQotCQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0KLQkJCQkJflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCQl9CiAJCS8qIHJlc3RvcmUgUlhPTiBhc3NvYyAqLwogCQlwcml2LT5zdGFnaW5nX3J4b24uZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKQEAgLTMyMzgsMTcgKzM0MTYsOSBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JaWYgKHN0YSkgewotCQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7Ci0KLQkJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gJXBNIG5vdCBpbiBzdGF0aW9uIG1hcC5cbiIsCi0JCQkJCSAgIHN0YS0+YWRkcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0YV9pZCA9IHByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQ7Ci0JfQorCXN0YV9pZCA9IGl3bF9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApOwpAQCAtMzI5NCwxMyArMzQ2NCwzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBzd2l0Y2ggdG8gUlRTL0NUUyBmb3IgVFgKKyAqLworc3RhdGljIHZvaWQgaXdsX2VuYWJsZV9ydHNfY3RzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKworCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TRUxGX0NUU19FTjsKKwlpZiAoIXRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInVzZSBSVFMvQ1RTIHByb3RlY3Rpb25cbiIpOworCQlpd2xjb3JlX2NvbW1pdF9yeG9uKHByaXYpOworCX0gZWxzZSB7CisJCS8qIHNjYW5uaW5nLCBkZWZlciB0aGUgcmVxdWVzdCB1bnRpbCBzY2FuIGNvbXBsZXRlZCAqLworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZGVmZXIgc2V0dGluZyBSVFMvQ1RTIHByb3RlY3Rpb25cbiIpOworCX0KK30KKwogc3RhdGljIGludCBpd2xfbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCWVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbikKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OworCWludCByZXQgPSAtRUlOVkFMOwogCiAJSVdMX0RFQlVHX0hUKHByaXYsICJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwKIAkJICAgICBzdGEtPmFkZHIsIHRpZCk7CkBAIC0zMzA4LDE3ICszNDk3LDE5IEBACiAJaWYgKCEocHJpdi0+Y2ZnLT5za3UgJiBJV0xfU0tVX04pKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAorCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6CiAJCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgUnhcbiIpOwotCQlyZXR1cm4gaXdsX3N0YV9yeF9hZ2dfc3RhcnQocHJpdiwgc3RhLCB0aWQsICpzc24pOworCQlyZXQgPSBpd2xfc3RhX3J4X2FnZ19zdGFydChwcml2LCBzdGEsIHRpZCwgKnNzbik7CisJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CiAJCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBSeFxuIik7CiAJCXJldCA9IGl3bF9zdGFfcnhfYWdnX3N0b3AocHJpdiwgc3RhLCB0aWQpOwogCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIHJldDsKKwkJCXJldCA9IDA7CisJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgogCQlJV0xfREVCVUdfSFQocHJpdiwgInN0YXJ0IFR4XG4iKTsKIAkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdGFydChwcml2LCB2aWYsIHN0YSwgdGlkLCBzc24pOwpAQCAtMzMyNyw3ICszNTE4LDcgQEAKIAkJCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+X2Fnbi5hZ2dfdGlkc19jb3VudCA9ICV1XG4iLAogCQkJCSAgICAgcHJpdi0+X2Fnbi5hZ2dfdGlkc19jb3VudCk7CiAJCX0KLQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKIAkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFR4XG4iKTsKIAkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdG9wKHByaXYsIHZpZiwgc3RhLCB0aWQpOwpAQCAtMzMzNywxOCArMzUyOCwyMiBAQAogCQkJCSAgICAgcHJpdi0+X2Fnbi5hZ2dfdGlkc19jb3VudCk7CiAJCX0KIAkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiByZXQ7CisJCQlyZXQgPSAwOworCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKLQkJLyogZG8gbm90aGluZyAqLwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JZGVmYXVsdDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJ1bmtub3duXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChwcml2LT5jZmctPnVzZV9ydHNfZm9yX2h0KSB7CisJCQkvKgorCQkJICogc3dpdGNoIHRvIFJUUy9DVFMgaWYgaXQgaXMgdGhlIHByZWZlciBwcm90ZWN0aW9uCisJCQkgKiBtZXRob2QgZm9yIEhUIHRyYWZmaWMKKwkJCSAqLworCQkJaXdsX2VuYWJsZV9ydHNfY3RzKHByaXYpOworCQl9CisJCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gMDsKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9tYWNfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTM0MjMsNiArMzYxOCwxMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaXdsX21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCXN0cnVjdCBpd2xfaHRfY29uZmlnICpodF9jb25mID0gJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnOworCXUxNiBjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJaWYgKGl3bF9pc19yZmtpbGwocHJpdikpCisJCWdvdG8gb3V0X2V4aXQ7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkJZ290byBvdXRfZXhpdDsKKworCWlmICghaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikpCisJCWdvdG8gb3V0X2V4aXQ7CisKKwkvKiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcyAqLworCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPT0gdHJ1ZSkKKwkJZ290byBvdXRfZXhpdDsKKworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKSB7CisKKwkJY2ggPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCisJCQljaF9zd2l0Y2gtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJaWYgKGxlMTZfdG9fY3B1KHByaXYtPmFjdGl2ZV9yeG9uLmNoYW5uZWwpICE9IGNoKSB7CisJCQljaF9pbmZvID0gaXdsX2dldF9jaGFubmVsX2luZm8ocHJpdiwKKwkJCQkJCSAgICAgICBjb25mLT5jaGFubmVsLT5iYW5kLAorCQkJCQkJICAgICAgIGNoKTsKKwkJCWlmICghaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7CisKKwkJCS8qIENvbmZpZ3VyZSBIVDQwIGNoYW5uZWxzICovCisJCQlodF9jb25mLT5pc19odCA9IGNvbmZfaXNfaHQoY29uZik7CisJCQlpZiAoaHRfY29uZi0+aXNfaHQpIHsKKwkJCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7CisJCQkJCWh0X2NvbmYtPmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKKwkJCQkJaHRfY29uZi0+aXNfNDBtaHogPSB0cnVlOworCQkJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKKwkJCQkJaHRfY29uZi0+ZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOworCQkJCQlodF9jb25mLT5pc180MG1oeiA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaHRfY29uZi0+ZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCQkJCWh0X2NvbmYtPmlzXzQwbWh6ID0gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJaHRfY29uZi0+aXNfNDBtaHogPSBmYWxzZTsKKworCQkJLyogaWYgd2UgYXJlIHN3aXRjaGluZyBmcm9tIGh0IHRvIDIuNCBjbGVhciBmbGFncworCQkJICogZnJvbSBhbnkgaHQgcmVsYXRlZCBpbmZvIHNpbmNlIDIuNCBkb2VzIG5vdAorCQkJICogc3VwcG9ydCBodCAqLworCQkJaWYgKChsZTE2X3RvX2NwdShwcml2LT5zdGFnaW5nX3J4b24uY2hhbm5lbCkgIT0gY2gpKQorCQkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyA9IDA7CisKKwkJCWl3bF9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNvbmYtPmNoYW5uZWwpOworCQkJaXdsX3NldF9yeG9uX2h0KHByaXYsIGh0X2NvbmYpOworCQkJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjb25mLT5jaGFubmVsLT5iYW5kLAorCQkJCQkgICAgICAgcHJpdi0+dmlmKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCQkJaXdsX3NldF9yYXRlKHByaXYpOworCQkJLyoKKwkJCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCisJCQkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAorCQkJICovCisJCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKHByaXYsCisJCQkJCQkJCSAgICBjaF9zd2l0Y2gpKQorCQkJCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQl9CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworb3V0X2V4aXQ6CisJaWYgKCFwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpCisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKHByaXYtPnZpZiwgZmFsc2UpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCitzdGF0aWMgdm9pZCBpd2xfbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwkvKiBkbyBub3Qgc3VwcG9ydCAiZmx1c2giICovCisJaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT50eGZpZm9fZmx1c2gpCisJCWdvdG8gZG9uZTsKKworCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkgeworCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBkZXZpY2Ugc2h1dGRvd25cbiIpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChpd2xfaXNfcmZraWxsKHByaXYpKSB7CisJCUlXTF9ERUJVR19UWChwcml2LCAiQWJvcnRpbmcgZmx1c2ggZHVlIHRvIFJGIEtpbGxcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBtYWM4MDIxMSB3aWxsIG5vdCBwdXNoIGFueSBtb3JlIGZyYW1lcyBmb3IgdHJhbnNtaXQKKwkgKiB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGVkCisJICovCisJaWYgKGRyb3ApIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJzZW5kIGZsdXNoIGNvbW1hbmRcbiIpOworCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhmaWZvX2ZsdXNoKHByaXYsIElXTF9EUk9QX0FMTCkpIHsKKwkJCUlXTF9FUlIocHJpdiwgImZsdXNoIHJlcXVlc3QgZmFpbFxuIik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJ3YWl0IHRyYW5zbWl0L2ZsdXNoIGFsbCBmcmFtZXNcbiIpOworCWl3bGFnbl93YWl0X3R4X3F1ZXVlX2VtcHR5KHByaXYpOworZG9uZToKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgpAQCAtMzQzOSw2ICszNzY0LDcgQEAKIAlJTklUX1dPUksoJnByaXYtPnJ4X3JlcGxlbmlzaCwgaXdsX2JnX3J4X3JlcGxlbmlzaCk7CiAJSU5JVF9XT1JLKCZwcml2LT5iZWFjb25fdXBkYXRlLCBpd2xfYmdfYmVhY29uX3VwZGF0ZSk7CiAJSU5JVF9XT1JLKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrLCBpd2xfYmdfcnVuX3RpbWVfY2FsaWJfd29yayk7CisJSU5JVF9XT1JLKCZwcml2LT50eF9mbHVzaCwgaXdsX2JnX3R4X2ZsdXNoKTsKIAlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aW5pdF9hbGl2ZV9zdGFydCwgaXdsX2JnX2luaXRfYWxpdmVfc3RhcnQpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5hbGl2ZV9zdGFydCwgaXdsX2JnX2FsaXZlX3N0YXJ0KTsKIApAQCAtMzQ3OSw2ICszODA1LDcgQEAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5zdGFydF9pbnRlcm5hbF9zY2FuKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hbGl2ZV9zdGFydCk7CisJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+YmVhY29uX3VwZGF0ZSk7CiAJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMpOwogCWRlbF90aW1lcl9zeW5jKCZwcml2LT51Y29kZV90cmFjZSk7CkBAIC0zNTk0LDYgKzM5MjEsOCBAQAogCS5zdGFfbm90aWZ5ID0gaXdsX21hY19zdGFfbm90aWZ5LAogCS5zdGFfYWRkID0gaXdsYWduX21hY19zdGFfYWRkLAogCS5zdGFfcmVtb3ZlID0gaXdsX21hY19zdGFfcmVtb3ZlLAorCS5jaGFubmVsX3N3aXRjaCA9IGl3bF9tYWNfY2hhbm5lbF9zd2l0Y2gsCisJLmZsdXNoID0gaXdsX21hY19mbHVzaCwKIH07CiAKIHN0YXRpYyBpbnQgaXdsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKQEAgLTM2MDMsNyArMzkzMiw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJc3RydWN0IGl3bF9jZmcgKmNmZyA9IChzdHJ1Y3QgaXdsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiBwY2lfY21kOworCXUxNiBwY2lfY21kLCBudW1fbWFjOwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIDEuIEFsbG9jYXRpbmcgSFcgZGF0YQpAQCAtMzYzMyw5ICszOTYyLDYgQEAKIAlwcml2LT5wY2lfZGV2ID0gcGRldjsKIAlwcml2LT5pbnRhX21hc2sgPSBDU1JfSU5JX1NFVF9NQVNLOwogCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLQlhdG9taWNfc2V0KCZwcml2LT5yZXN0cmljdF9yZWZjbnQsIDApOwotI2VuZGlmCiAJaWYgKGl3bF9hbGxvY190cmFmZmljX21lbShwcml2KSkKIAkJSVdMX0VSUihwcml2LCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwogCkBAIC0zNzI0LDkgKzQwNTAsMTcgQEAKIAkJZ290byBvdXRfZnJlZV9lZXByb207CiAKIAkvKiBleHRyYWN0IE1BQyBBZGRyZXNzICovCi0JaXdsX2VlcHJvbV9nZXRfbWFjKHByaXYsIHByaXYtPm1hY19hZGRyKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiTUFDIGFkZHJlc3M6ICVwTVxuIiwgcHJpdi0+bWFjX2FkZHIpOwotCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKHByaXYtPmh3LCBwcml2LT5tYWNfYWRkcik7CisJaXdsX2VlcHJvbV9nZXRfbWFjKHByaXYsIHByaXYtPmFkZHJlc3Nlc1swXS5hZGRyKTsKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiTUFDIGFkZHJlc3M6ICVwTVxuIiwgcHJpdi0+YWRkcmVzc2VzWzBdLmFkZHIpOworCXByaXYtPmh3LT53aXBoeS0+YWRkcmVzc2VzID0gcHJpdi0+YWRkcmVzc2VzOworCXByaXYtPmh3LT53aXBoeS0+bl9hZGRyZXNzZXMgPSAxOworCW51bV9tYWMgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX05VTV9NQUNfQUREUkVTUyk7CisJaWYgKG51bV9tYWMgPiAxKSB7CisJCW1lbWNweShwcml2LT5hZGRyZXNzZXNbMV0uYWRkciwgcHJpdi0+YWRkcmVzc2VzWzBdLmFkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisJCXByaXYtPmFkZHJlc3Nlc1sxXS5hZGRyWzVdKys7CisJCXByaXYtPmh3LT53aXBoeS0+bl9hZGRyZXNzZXMrKzsKKwl9CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogNS4gU2V0dXAgSFcgY29uc3RhbnRzCkBAIC0zOTkzLDYgKzQzMjcsNDcgQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEyMDEsIGl3bDYwMDBnMmFfMmFnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg1LCAweDEyMTEsIGl3bDYwMDBnMmFfMmFnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEyMjEsIGl3bDYwMDBnMmFfMmFnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEyMDYsIGl3bDYwMDBnMmFfMmFiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg1LCAweDEyMTYsIGl3bDYwMDBnMmFfMmFiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEyMjYsIGl3bDYwMDBnMmFfMmFiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEyMDcsIGl3bDYwMDBnMmFfMmJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTMwMSwgaXdsNjAwMGcyYV8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTMwNiwgaXdsNjAwMGcyYV8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTMwNywgaXdsNjAwMGcyYV8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzIxLCBpd2w2MDAwZzJhXzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzI2LCBpd2w2MDAwZzJhXzJhYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NSwgMHgxMzExLCBpd2w2MDAwZzJhXzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NSwgMHgxMzE2LCBpd2w2MDAwZzJhXzJhYmdfY2ZnKX0sCisKKy8qIDZ4MDAgU2VyaWVzIEdlbjJiICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4RiwgMHg1MTA1LCBpd2w2MDAwZzJiX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkwLCAweDUxMTUsIGl3bDYwMDBnMmJfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEYsIDB4NTEyNSwgaXdsNjAwMGcyYl9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4RiwgMHg1MTA3LCBpd2w2MDAwZzJiX2JnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEYsIDB4NTIwMSwgaXdsNjAwMGcyYl8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTAsIDB4NTIxMSwgaXdsNjAwMGcyYl8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEYsIDB4NTIyMSwgaXdsNjAwMGcyYl8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEYsIDB4NTIwNiwgaXdsNjAwMGcyYl8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTAsIDB4NTIxNiwgaXdsNjAwMGcyYl8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEYsIDB4NTIyNiwgaXdsNjAwMGcyYl8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEYsIDB4NTIwNywgaXdsNjAwMGcyYl8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4QSwgMHg1MzAxLCBpd2w2MDAwZzJiX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhBLCAweDUzMDUsIGl3bDYwMDBnMmJfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEEsIDB4NTMwNywgaXdsNjAwMGcyYl9iZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhBLCAweDUzMjEsIGl3bDYwMDBnMmJfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOEEsIDB4NTMyNSwgaXdsNjAwMGcyYl9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4QiwgMHg1MzExLCBpd2w2MDAwZzJiX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhCLCAweDUzMTUsIGl3bDYwMDBnMmJfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTAsIDB4NTIxMSwgaXdsNjAwMGcyYl8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTAsIDB4NTIxNSwgaXdsNjAwMGcyYl8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTAsIDB4NTIxNiwgaXdsNjAwMGcyYl8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIwMSwgaXdsNjAwMGcyYl8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIwNSwgaXdsNjAwMGcyYl8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIwNiwgaXdsNjAwMGcyYl8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIwNywgaXdsNjAwMGcyYl8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjIxLCBpd2w2MDAwZzJiXzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjI1LCBpd2w2MDAwZzJiXzJiZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjI2LCBpd2w2MDAwZzJiXzJhYmdfY2ZnKX0sCiAKIC8qIDZ4NTAgV2lGaS9XaU1heCBTZXJpZXMgKi8KIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg3LCAweDEzMDEsIGl3bDYwNTBfMmFnbl9jZmcpfSwKQEAgLTQwMDIsNiArNDM3NywxNCBAQAogCXtJV0xfUENJX0RFVklDRSgweDAwODksIDB4MTMxMSwgaXdsNjA1MF8yYWduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDAwODksIDB4MTMxNiwgaXdsNjA1MF8yYWJnX2NmZyl9LAogCisvKiA2eDUwIFdpRmkvV2lNYXggU2VyaWVzIEdlbjIgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMDUsIGl3bDYwNTBnMl9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzA2LCBpd2w2MDUwZzJfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMyNSwgaXdsNjA1MGcyX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMjYsIGl3bDYwNTBnMl9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NiwgMHgxMzE1LCBpd2w2MDUwZzJfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODYsIDB4MTMxNiwgaXdsNjA1MGcyX2Jnbl9jZmcpfSwKKwogLyogMTAwMCBTZXJpZXMgV2lGaSAqLwogCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTIwNSwgaXdsMTAwMF9iZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MywgMHgxMzA1LCBpd2wxMDAwX2Jnbl9jZmcpfSwKQEAgLTQwMzYsMTkgKzQ0MTksMTggQEAKIHsKIAogCWludCByZXQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOwotCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIjogIiBEUlZfQ09QWVJJR0hUICJcbiIpOworCXByX2luZm8oRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7CisJcHJfaW5mbyhEUlZfQ09QWVJJR0hUICJcbiIpOwogCiAJcmV0ID0gaXdsYWduX3JhdGVfY29udHJvbF9yZWdpc3RlcigpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCi0JCSAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIHJhdGUgY29udHJvbCBhbGdvcml0aG06ICVkXG4iLCByZXQpOworCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciByYXRlIGNvbnRyb2wgYWxnb3JpdGhtOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpd2xfZHJpdmVyKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiVW5hYmxlIHRvIGluaXRpYWxpemUgUENJIG1vZHVsZVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGluaXRpYWxpemUgUENJIG1vZHVsZVxuIik7CiAJCWdvdG8gZXJyb3JfcmVnaXN0ZXI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCmluZGV4IDJkNzQ4MDUuLmNjNjQ2NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCkBAIC02NSw2ICs2NSwzNCBAQAogCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogCisvKiBjb25maWd1cmF0aW9uIGZvciB0aGUgX2FnbiBkZXZpY2VzICovCitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNDk2NV9hZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDUzMDBfYWduX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTAwX2Fnbl9jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNTM1MF9hZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDUxMDBfYmduX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTAwX2FiZ19jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNTE1MF9hZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDUxNTBfYWJnX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJhXzJhZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMDBnMmFfMmFiZ19jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAwMGcyYV8yYmdfY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMDBnMmJfYmduX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiX2JnX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiXzJhZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMDBnMmJfMmFiZ19jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAwMGcyYl8yYmduX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwZzJiXzJiZ19jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAwMGlfMmFnbl9jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAwMGlfMmFiZ19jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAwMGlfMmJnX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwXzNhZ25fY2ZnOworZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwNTBfMmFnbl9jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjA1MF8yYWJnX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDUwZzJfYmduX2NmZzsKK2V4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDAwX2Jnbl9jZmc7CitleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTAwMF9iZ19jZmc7CisKIGV4dGVybiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsYWduX21vZF9wYXJhbXM7CiBleHRlcm4gc3RydWN0IGl3bF9oY21kX29wcyBpd2xhZ25faGNtZDsKIGV4dGVybiBzdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIGl3bGFnbl9oY21kX3V0aWxzOwpAQCAtOTMsNiArMTIxLDggQEAKIGludCBpd2xhZ25fdHhxX2FnZ19kaXNhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IHR4cV9pZCwKIAkJCSAgIHUxNiBzc25faWR4LCB1OCB0eF9maWZvKTsKIHZvaWQgaXdsYWduX3R4cV9zZXRfc2NoZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgbWFzayk7Cit2b2lkIGl3bF9mcmVlX3RmZHNfaW5fcXVldWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgIGludCBzdGFfaWQsIGludCB0aWQsIGludCBmcmVlZCk7CiAKIC8qIHVDb2RlICovCiBpbnQgaXdsYWduX2xvYWRfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKQEAgLTEwMiw2ICsxMzIsNyBAQAogCQkJICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwogdm9pZCBpd2xhZ25faW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl9hbGl2ZV9ub3RpZnkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2ludCBpd2xfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAKIC8qIGxpYiAqLwogdm9pZCBpd2xfY2hlY2tfYWJvcnRfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTExNyw2ICsxNDgsOSBAQAogdm9pZCBpd2xhZ25fcnhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpOwogaW50IGl3bGFnbl9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKIGludCBpd2xhZ25faHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2ludCBpd2xhZ25fd2FpdF90eF9xdWV1ZV9lbXB0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworaW50IGl3bGFnbl90eGZpZm9fZmx1c2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgZmx1c2hfY29udHJvbCk7Cit2b2lkIGl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGZsdXNoX2NvbnRyb2wpOwogCiAvKiByeCAqLwogdm9pZCBpd2xhZ25fcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpAQCAtMTcxLDYgKzIwNSwxNiBAQAogCSAgICAgICAoc3RhdHVzID09IFRYX1NUQVRVU19ESVJFQ1RfRE9ORSk7CiB9CiAKKy8qIHJ4ICovCit2b2lkIGl3bF9yeF9taXNzZWRfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Citib29sIGl3bF9nb29kX3BsY3BfaGVhbHRoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7Cit2b2lkIGl3bF9yeF9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJICAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKK3ZvaWQgaXdsX3JlcGx5X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7CisKIC8qIHNjYW4gKi8KIHZvaWQgaXdsYWduX3JlcXVlc3Rfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogCkBAIC0xNzgsNCArMjIyLDggQEAKIGludCBpd2xhZ25fbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBhZGQpOwogCisvKiBoY21kICovCitpbnQgaXdsYWduX3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworaW50IGl3bGFnbl9zZW5kX3R4X2FudF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCB2YWxpZF90eF9hbnQpOworCiAjZW5kaWYgLyogX19pd2xfYWduX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNhbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODIyNzc3My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jYWxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtY2FsaWIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJTklUIGNhbGlicmF0aW9ucyBmcmFtZXdvcmsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9kYXRhIHsKLQl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9hOwotCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2I7Ci0JdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYzsKLQl1MzIgYmVhY29uX2VuZXJneV9hOwotCXUzMiBiZWFjb25fZW5lcmd5X2I7Ci0JdTMyIGJlYWNvbl9lbmVyZ3lfYzsKLX07Ci0KLWludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGhjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQsCi0JCS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCi0JfTsKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfQ0FMSUJfTUFYOyBpKyspIHsKLQkJaWYgKChCSVQoaSkgJiBwcml2LT5od19wYXJhbXMuY2FsaWJfaW5pdF9jZmcpICYmCi0JCSAgICBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZikgewotCQkJaGNtZC5sZW4gPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zl9sZW47Ci0JCQloY21kLmRhdGEgPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZjsKLQkJCXJldCA9IGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlJV0xfRVJSKHByaXYsICJFcnJvciAlZCBpdGVyYXRpb24gJWRcbiIsIHJldCwgaSk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX3NlbmRfY2FsaWJfcmVzdWx0cyk7Ci0KLWludCBpd2xfY2FsaWJfc2V0KHN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXMsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCi17Ci0JaWYgKHJlcy0+YnVmX2xlbiAhPSBsZW4pIHsKLQkJa2ZyZWUocmVzLT5idWYpOwotCQlyZXMtPmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQl9Ci0JaWYgKHVubGlrZWx5KHJlcy0+YnVmID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJlcy0+YnVmX2xlbiA9IGxlbjsKLQltZW1jcHkocmVzLT5idWYsIGJ1ZiwgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2NhbGliX3NldCk7Ci0KLXZvaWQgaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMX0NBTElCX01BWDsgaSsrKSB7Ci0JCWtmcmVlKHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmKTsKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWYgPSBOVUxMOwotCQlwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zl9sZW4gPSAwOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUlVOVElNRSBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICJmYWxzZSBhbGFybXMiIGFyZSBzaWduYWxzIHRoYXQgb3VyIERTUCB0cmllcyB0byBsb2NrIG9udG8sCi0gKiAgIGJ1dCB0aGVuIGRldGVybWluZXMgdGhhdCB0aGV5IGFyZSBlaXRoZXIgbm9pc2UsIG9yIHRyYW5zbWlzc2lvbnMKLSAqICAgZnJvbSBhIGRpc3RhbnQgd2lyZWxlc3MgbmV0d29yayAoYWxzbyAibm9pc2UiLCByZWFsbHkpIHRoYXQgZ2V0Ci0gKiAgICJzdGVwcGVkIG9uIiBieSBzdHJvbmdlciB0cmFuc21pc3Npb25zIHdpdGhpbiBvdXIgb3duIG5ldHdvcmsuCi0gKiBUaGlzIGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZXQgYSBzZW5zaXRpdml0eSBsZXZlbCB0aGF0IGlzIGhpZ2gKLSAqICAgZW5vdWdoIHRvIHJlY2VpdmUgYWxsIG9mIG91ciBvd24gbmV0d29yayB0cmFmZmljLCBidXQgbm90IHNvCi0gKiAgIGhpZ2ggdGhhdCBvdXIgRFNQIGdldHMgdG9vIGJ1c3kgdHJ5aW5nIHRvIGxvY2sgb250byBub24tbmV0d29yawotICogICBhY3Rpdml0eS9ub2lzZS4gKi8KLXN0YXRpYyBpbnQgaXdsX3NlbnNfZW5lcmd5X2NjayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgdTMyIG5vcm1fZmEsCi0JCQkJICAgdTMyIHJ4X2VuYWJsZV90aW1lLAotCQkJCSAgIHN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfZGF0YSAqcnhfaW5mbykKLXsKLQl1MzIgbWF4X25yZ19jY2sgPSAwOwotCWludCBpID0gMDsKLQl1OCBtYXhfc2lsZW5jZV9yc3NpID0gMDsKLQl1MzIgc2lsZW5jZV9yZWYgPSAwOwotCXU4IHNpbGVuY2VfcnNzaV9hID0gMDsKLQl1OCBzaWxlbmNlX3Jzc2lfYiA9IDA7Ci0JdTggc2lsZW5jZV9yc3NpX2MgPSAwOwotCXUzMiB2YWw7Ci0KLQkvKiAiZmFsc2VfYWxhcm1zIiB2YWx1ZXMgYmVsb3cgYXJlIGNyb3NzLW11bHRpcGxpY2F0aW9ucyB0byBhc3Nlc3MgdGhlCi0JICogICBudW1iZXJzIG9mIGZhbHNlIGFsYXJtcyB3aXRoaW4gdGhlIG1lYXN1cmVkIHBlcmlvZCBvZiBhY3R1YWwgUngKLQkgKiAgIChSeCBpcyBvZmYgd2hlbiB3ZSdyZSB0eGluZyksIHZzIHRoZSBtaW4vbWF4IGV4cGVjdGVkIGZhbHNlIGFsYXJtcwotCSAqICAgKHNvbWUgc2hvdWxkIGJlIGV4cGVjdGVkIGlmIHJ4IGlzIHNlbnNpdGl2ZSBlbm91Z2gpIGluIGEKLQkgKiAgIGh5cG90aGV0aWNhbCBsaXN0ZW5pbmcgcGVyaW9kIG9mIDIwMCB0aW1lIHVuaXRzIChUVSksIDIwNC44IG1zZWM6Ci0JICoKLQkgKiBNSU5fRkEvZml4ZWQtdGltZSA8IGZhbHNlX2FsYXJtcy9hY3R1YWwtcngtdGltZSA8IE1BWF9GQS9iZWFjb24tdGltZQotCSAqCi0JICogKi8KLQl1MzIgZmFsc2VfYWxhcm1zID0gbm9ybV9mYSAqIDIwMCAqIDEwMjQ7Ci0JdTMyIG1heF9mYWxzZV9hbGFybXMgPSBNQVhfRkFfQ0NLICogcnhfZW5hYmxlX3RpbWU7Ci0JdTMyIG1pbl9mYWxzZV9hbGFybXMgPSBNSU5fRkFfQ0NLICogcnhfZW5hYmxlX3RpbWU7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyAqcmFuZ2VzID0gcHJpdi0+aHdfcGFyYW1zLnNlbnM7Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0gMDsKLQotCS8qIEZpbmQgbWF4IHNpbGVuY2UgcnNzaSBhbW9uZyBhbGwgMyByZWNlaXZlcnMuCi0JICogVGhpcyBpcyBiYWNrZ3JvdW5kIG5vaXNlLCB3aGljaCBtYXkgaW5jbHVkZSB0cmFuc21pc3Npb25zIGZyb20gb3RoZXIKLQkgKiAgICBuZXR3b3JrcywgbWVhc3VyZWQgZHVyaW5nIHNpbGVuY2UgYmVmb3JlIG91ciBuZXR3b3JrJ3MgYmVhY29uICovCi0Jc2lsZW5jZV9yc3NpX2EgPSAodTgpKChyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EgJgotCQkJICAgIEFMTF9CQU5EX0ZJTFRFUikgPj4gOCk7Ci0Jc2lsZW5jZV9yc3NpX2IgPSAodTgpKChyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IgJgotCQkJICAgIEFMTF9CQU5EX0ZJTFRFUikgPj4gOCk7Ci0Jc2lsZW5jZV9yc3NpX2MgPSAodTgpKChyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MgJgotCQkJICAgIEFMTF9CQU5EX0ZJTFRFUikgPj4gOCk7Ci0KLQl2YWwgPSBtYXgoc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jKTsKLQltYXhfc2lsZW5jZV9yc3NpID0gbWF4KHNpbGVuY2VfcnNzaV9hLCAodTgpIHZhbCk7Ci0KLQkvKiBTdG9yZSBzaWxlbmNlIHJzc2kgaW4gMjAtYmVhY29uIGhpc3RvcnkgdGFibGUgKi8KLQlkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2RhdGEtPm5yZ19zaWxlbmNlX2lkeF0gPSBtYXhfc2lsZW5jZV9yc3NpOwotCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCsrOwotCWlmIChkYXRhLT5ucmdfc2lsZW5jZV9pZHggPj0gTlJHX05VTV9QUkVWX1NUQVRfTCkKLQkJZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKLQotCS8qIEZpbmQgbWF4IHNpbGVuY2UgcnNzaSBhY3Jvc3MgMjAgYmVhY29uIGhpc3RvcnkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgaSsrKSB7Ci0JCXZhbCA9IGRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV07Ci0JCXNpbGVuY2VfcmVmID0gbWF4KHNpbGVuY2VfcmVmLCB2YWwpOwotCX0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgInNpbGVuY2UgYSAldSwgYiAldSwgYyAldSwgMjAtYmNuIG1heCAldVxuIiwKLQkJCXNpbGVuY2VfcnNzaV9hLCBzaWxlbmNlX3Jzc2lfYiwgc2lsZW5jZV9yc3NpX2MsCi0JCQlzaWxlbmNlX3JlZik7Ci0KLQkvKiBGaW5kIG1heCByeCBlbmVyZ3kgKG1pbiB2YWx1ZSEpIGFtb25nIGFsbCAzIHJlY2VpdmVycywKLQkgKiAgIG1lYXN1cmVkIGR1cmluZyBiZWFjb24gZnJhbWUuCi0JICogU2F2ZSBpdCBpbiAxMC1iZWFjb24gaGlzdG9yeSB0YWJsZS4gKi8KLQlpID0gZGF0YS0+bnJnX2VuZXJneV9pZHg7Ci0JdmFsID0gbWluKHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYiwgcnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKLQlkYXRhLT5ucmdfdmFsdWVbaV0gPSBtaW4ocnhfaW5mby0+YmVhY29uX2VuZXJneV9hLCB2YWwpOwotCi0JZGF0YS0+bnJnX2VuZXJneV9pZHgrKzsKLQlpZiAoZGF0YS0+bnJnX2VuZXJneV9pZHggPj0gMTApCi0JCWRhdGEtPm5yZ19lbmVyZ3lfaWR4ID0gMDsKLQotCS8qIEZpbmQgbWluIHJ4IGVuZXJneSAobWF4IHZhbHVlKSBhY3Jvc3MgMTAgYmVhY29uIGhpc3RvcnkuCi0JICogVGhpcyBpcyB0aGUgbWluaW11bSBzaWduYWwgbGV2ZWwgdGhhdCB3ZSB3YW50IHRvIHJlY2VpdmUgd2VsbC4KLQkgKiBBZGQgYmFja29mZiAobWFyZ2luIHNvIHdlIGRvbid0IG1pc3Mgc2xpZ2h0bHkgbG93ZXIgZW5lcmd5IGZyYW1lcykuCi0JICogVGhpcyBlc3RhYmxpc2hlcyBhbiB1cHBlciBib3VuZCAobWluIHZhbHVlKSBmb3IgZW5lcmd5IHRocmVzaG9sZC4gKi8KLQltYXhfbnJnX2NjayA9IGRhdGEtPm5yZ192YWx1ZVswXTsKLQlmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKLQkJbWF4X25yZ19jY2sgPSAodTMyKSBtYXgobWF4X25yZ19jY2ssIChkYXRhLT5ucmdfdmFsdWVbaV0pKTsKLQltYXhfbnJnX2NjayArPSA2OwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJyeCBlbmVyZ3kgYSAldSwgYiAldSwgYyAldSwgMTAtYmNuIG1heC9taW4gJXVcbiIsCi0JCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EsIHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYiwKLQkJCXJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYywgbWF4X25yZ19jY2sgLSA2KTsKLQotCS8qIENvdW50IG51bWJlciBvZiBjb25zZWN1dGl2ZSBiZWFjb25zIHdpdGggZmV3ZXItdGhhbi1kZXNpcmVkCi0JICogICBmYWxzZSBhbGFybXMuICovCi0JaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpCi0JCWRhdGEtPm51bV9pbl9jY2tfbm9fZmErKzsKLQllbHNlCi0JCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPSAwOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY29uc2VjdXRpdmUgYmNucyB3aXRoIGZldyBmYWxzZSBhbGFybXMgPSAldVxuIiwKLQkJCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEpOwotCi0JLyogSWYgd2UgZ290IHRvbyBtYW55IGZhbHNlIGFsYXJtcyB0aGlzIHRpbWUsIHJlZHVjZSBzZW5zaXRpdml0eSAqLwotCWlmICgoZmFsc2VfYWxhcm1zID4gbWF4X2ZhbHNlX2FsYXJtcykgJiYKLQkJKGRhdGEtPmF1dG9fY29ycl9jY2sgPiBBVVRPX0NPUlJfTUFYX1RIX0NDSykpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJub3JtIEZBICV1ID4gbWF4IEZBICV1XG4iLAotCQkgICAgIGZhbHNlX2FsYXJtcywgbWF4X2ZhbHNlX2FsYXJtcyk7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIHJlZHVjaW5nIHNlbnNpdGl2aXR5XG4iKTsKLQkJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJV0xfRkFfVE9PX01BTlk7Ci0JCS8qIFN0b3JlIGZvciAiZmV3ZXIgdGhhbiBkZXNpcmVkIiBvbiBsYXRlciBiZWFjb24gKi8KLQkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmID0gc2lsZW5jZV9yZWY7Ci0KLQkJLyogaW5jcmVhc2UgZW5lcmd5IHRocmVzaG9sZCAocmVkdWNlIG5yZyB2YWx1ZSkKLQkJICogICB0byBkZWNyZWFzZSBzZW5zaXRpdml0eSAqLwotCQlkYXRhLT5ucmdfdGhfY2NrID0gZGF0YS0+bnJnX3RoX2NjayAtIE5SR19TVEVQX0NDSzsKLQkvKiBFbHNlIGlmIHdlIGdvdCBmZXdlciB0aGFuIGRlc2lyZWQsIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JfSBlbHNlIGlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKSB7Ci0JCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19GRVc7Ci0KLQkJLyogQ29tcGFyZSBzaWxlbmNlIGxldmVsIHdpdGggc2lsZW5jZSBsZXZlbCBmb3IgbW9zdCByZWNlbnQKLQkJICogICBoZWFsdGh5IG51bWJlciBvciB0b28gbWFueSBmYWxzZSBhbGFybXMgKi8KLQkJZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPSAoczMyKWRhdGEtPm5yZ19zaWxlbmNlX3JlZiAtCi0JCQkJCQkgICAoczMyKXNpbGVuY2VfcmVmOwotCi0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA8IG1pbiBGQSAldSwgc2lsZW5jZSBkaWZmICVkXG4iLAotCQkJIGZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcywKLQkJCSBkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZik7Ci0KLQkJLyogSW5jcmVhc2UgdmFsdWUgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHksIGJ1dCBvbmx5IGlmOgotCQkgKiAxYSkgcHJldmlvdXMgYmVhY29uIGRpZCAqbm90KiBoYXZlICp0b28gbWFueSogZmFsc2UgYWxhcm1zCi0JCSAqIDFiKSBBTkQgdGhlcmUncyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gUnggbGV2ZWxzCi0JCSAqICAgICAgZnJvbSBhIHByZXZpb3VzIGJlYWNvbiB3aXRoIHRvbyBtYW55LCBvciBoZWFsdGh5ICMgRkFzCi0JCSAqIE9SIDIpIFdlJ3ZlIHNlZW4gYSBsb3Qgb2YgYmVhY29ucyAoMTAwKSB3aXRoIHRvbyBmZXcKLQkJICogICAgICAgZmFsc2UgYWxhcm1zICovCi0JCWlmICgoZGF0YS0+bnJnX3ByZXZfc3RhdGUgIT0gSVdMX0ZBX1RPT19NQU5ZKSAmJgotCQkJKChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGKSB8fAotCQkJKGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpKSB7Ci0KLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIGluY3JlYXNpbmcgc2Vuc2l0aXZpdHlcbiIpOwotCQkJLyogSW5jcmVhc2UgbnJnIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JCQl2YWwgPSBkYXRhLT5ucmdfdGhfY2NrICsgTlJHX1NURVBfQ0NLOwotCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1pbigodTMyKXJhbmdlcy0+bWluX25yZ19jY2ssIHZhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiBidXQgbm90IGNoYW5naW5nIHNlbnNpdGl2aXR5XG4iKTsKLQkJfQotCi0JLyogRWxzZSB3ZSBnb3QgYSBoZWFsdGh5IG51bWJlciBvZiBmYWxzZSBhbGFybXMsIGtlZXAgc3RhdHVzIHF1byAqLwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiIEZBIGluIHNhZmUgem9uZVxuIik7Ci0JCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX0dPT0RfUkFOR0U7Ci0KLQkJLyogU3RvcmUgZm9yIHVzZSBpbiAiZmV3ZXIgdGhhbiBkZXNpcmVkIiB3aXRoIGxhdGVyIGJlYWNvbiAqLwotCQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYgPSBzaWxlbmNlX3JlZjsKLQotCQkvKiBJZiBwcmV2aW91cyBiZWFjb24gaGFkIHRvbyBtYW55IGZhbHNlIGFsYXJtcywKLQkJICogICBnaXZlIGl0IHNvbWUgZXh0cmEgbWFyZ2luIGJ5IHJlZHVjaW5nIHNlbnNpdGl2aXR5IGFnYWluCi0JCSAqICAgKGJ1dCBkb24ndCBnbyBiZWxvdyBtZWFzdXJlZCBlbmVyZ3kgb2YgZGVzaXJlZCBSeCkgKi8KLQkJaWYgKElXTF9GQV9UT09fTUFOWSA9PSBkYXRhLT5ucmdfcHJldl9zdGF0ZSkgewotCQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICIuLi4gaW5jcmVhc2luZyBtYXJnaW5cbiIpOwotCQkJaWYgKGRhdGEtPm5yZ190aF9jY2sgPiAobWF4X25yZ19jY2sgKyBOUkdfTUFSR0lOKSkKLQkJCQlkYXRhLT5ucmdfdGhfY2NrIC09IE5SR19NQVJHSU47Ci0JCQllbHNlCi0JCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1heF9ucmdfY2NrOwotCQl9Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoZSBlbmVyZ3kgdGhyZXNob2xkIGRvZXMgbm90IGdvIGFib3ZlIHRoZSBtZWFzdXJlZAotCSAqIGVuZXJneSBvZiB0aGUgZGVzaXJlZCBSeCBzaWduYWxzIChyZWR1Y2VkIGJ5IGJhY2tvZmYgbWFyZ2luKSwKLQkgKiBvciBlbHNlIHdlIG1pZ2h0IHN0YXJ0IG1pc3NpbmcgUnggZnJhbWVzLgotCSAqIExvd2VyIHZhbHVlIGlzIGhpZ2hlciBlbmVyZ3ksIHNvIHdlIHVzZSBtYXgoKSEKLQkgKi8KLQlkYXRhLT5ucmdfdGhfY2NrID0gbWF4KG1heF9ucmdfY2NrLCBkYXRhLT5ucmdfdGhfY2NrKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5ldyBucmdfdGhfY2NrICV1XG4iLCBkYXRhLT5ucmdfdGhfY2NrKTsKLQotCWRhdGEtPm5yZ19wcmV2X3N0YXRlID0gZGF0YS0+bnJnX2N1cnJfc3RhdGU7Ci0KLQkvKiBBdXRvLWNvcnJlbGF0aW9uIENDSyBhbGdvcml0aG0gKi8KLQlpZiAoZmFsc2VfYWxhcm1zID4gbWluX2ZhbHNlX2FsYXJtcykgewotCi0JCS8qIGluY3JlYXNlIGF1dG9fY29yciB2YWx1ZXMgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkKLQkJICogc28gdGhlIERTUCB3b24ndCBiZSBkaXN0dXJiZWQgYnkgdGhlIG5vaXNlCi0JCSAqLwotCQlpZiAoZGF0YS0+YXV0b19jb3JyX2NjayA8IEFVVE9fQ09SUl9NQVhfVEhfQ0NLKQotCQkJZGF0YS0+YXV0b19jb3JyX2NjayA9IEFVVE9fQ09SUl9NQVhfVEhfQ0NLICsgMTsKLQkJZWxzZSB7Ci0JCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrICsgQVVUT19DT1JSX1NURVBfQ0NLOwotCQkJZGF0YS0+YXV0b19jb3JyX2NjayA9Ci0JCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X2NjaywgdmFsKTsKLQkJfQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyArIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X2Nja19tcmMsIHZhbCk7Ci0JfSBlbHNlIGlmICgoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgJiYKLQkgICAoKGRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID4gTlJHX0RJRkYpIHx8Ci0JICAgKGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpKSB7Ci0KLQkJLyogRGVjcmVhc2UgYXV0b19jb3JyIHZhbHVlcyB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLwotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrIC0gQVVUT19DT1JSX1NURVBfQ0NLOwotCQlkYXRhLT5hdXRvX2NvcnJfY2NrID0KLQkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2ssIHZhbCk7Ci0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjIC0gQVVUT19DT1JSX1NURVBfQ0NLOwotCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrX21yYywgdmFsKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGl3bF9zZW5zX2F1dG9fY29ycl9vZmRtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICAgdTMyIG5vcm1fZmEsCi0JCQkJICAgICAgIHUzMiByeF9lbmFibGVfdGltZSkKLXsKLQl1MzIgdmFsOwotCXUzMiBmYWxzZV9hbGFybXMgPSBub3JtX2ZhICogMjAwICogMTAyNDsKLQl1MzIgbWF4X2ZhbHNlX2FsYXJtcyA9IE1BWF9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7Ci0JdTMyIG1pbl9mYWxzZV9hbGFybXMgPSBNSU5fRkFfT0ZETSAqIHJ4X2VuYWJsZV90aW1lOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IHByaXYtPmh3X3BhcmFtcy5zZW5zOwotCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCi0JaWYgKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpIHsKLQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vcm0gRkEgJXUgPiBtYXggRkEgJXUpXG4iLAotCQkJICAgICBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG0gPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG0sIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX21yYywgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSArIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX3gxLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSArIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9Ci0JCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmNfeDEsIHZhbCk7Ci0JfQotCi0JLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLwotCWVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKLQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXVcbiIsCi0JCQkgICAgIGZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcyk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG0gLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbSwgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1feDEsIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxID0KLQkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MSwgdmFsKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1pbiBGQSAldSA8IG5vcm0gRkEgJXUgPCBtYXggRkEgJXUgT0tcbiIsCi0JCQkgbWluX2ZhbHNlX2FsYXJtcywgZmFsc2VfYWxhcm1zLCBtYXhfZmFsc2VfYWxhcm1zKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFByZXBhcmUgYSBTRU5TSVRJVklUWV9DTUQsIHNlbmQgdG8gdUNvZGUgaWYgdmFsdWVzIGhhdmUgY2hhbmdlZCAqLwotc3RhdGljIGludCBpd2xfc2Vuc2l0aXZpdHlfd3JpdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfY21kIGNtZCA7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZF9vdXQgPSB7Ci0JCS5pZCA9IFNFTlNJVElWSVRZX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCksCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmRhdGEgPSAmY21kLAotCX07Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQljbWQudGFibGVbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG0pOwotCWNtZC50YWJsZVtIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjKTsKLQljbWQudGFibGVbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1feDEpOwotCWNtZC50YWJsZVtIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKLQotCWNtZC50YWJsZVtIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5hdXRvX2NvcnJfY2NrKTsKLQljbWQudGFibGVbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKLQotCWNtZC50YWJsZVtIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPm5yZ190aF9jY2spOwotCWNtZC50YWJsZVtIRF9NSU5fRU5FUkdZX09GRE1fREVUX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5ucmdfdGhfb2ZkbSk7Ci0KLQljbWQudGFibGVbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbik7Ci0JY21kLnRhYmxlW0hEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fTVJDX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoZGF0YS0+YmFya2VyX2NvcnJfdGhfbWluX21yYyk7Ci0JY21kLnRhYmxlW0hEX09GRE1fRU5FUkdZX1RIX0lOX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoZGF0YS0+bnJnX3RoX2NjYSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm9mZG06IGFjICV1IG1yYyAldSB4MSAldSBtcmNfeDEgJXUgdGhyZXNoICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX29mZG0sIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYywKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxLCBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEsCi0JCQlkYXRhLT5ucmdfdGhfb2ZkbSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNjazogYWMgJXUgbXJjICV1IHRocmVzaCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2ssIGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjLAotCQkJZGF0YS0+bnJnX3RoX2Njayk7Ci0KLQkvKiBVcGRhdGUgdUNvZGUncyAid29yayIgdGFibGUsIGFuZCBjb3B5IGl0IHRvIERTUCAqLwotCWNtZC5jb250cm9sID0gU0VOU0lUSVZJVFlfQ01EX0NPTlRST0xfV09SS19UQUJMRTsKLQotCS8qIERvbid0IHNlbmQgY29tbWFuZCB0byB1Q29kZSBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKCFtZW1jbXAoJmNtZC50YWJsZVswXSwgJihwcml2LT5zZW5zaXRpdml0eV90YmxbMF0pLAotCQkgICAgc2l6ZW9mKHUxNikqSERfVEFCTEVfU0laRSkpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJObyBjaGFuZ2UgaW4gU0VOU0lUSVZJVFlfQ01EXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogQ29weSB0YWJsZSBmb3IgY29tcGFyaXNvbiBuZXh0IHRpbWUgKi8KLQltZW1jcHkoJihwcml2LT5zZW5zaXRpdml0eV90YmxbMF0pLCAmKGNtZC50YWJsZVswXSksCi0JICAgICAgIHNpemVvZih1MTYpKkhEX1RBQkxFX1NJWkUpOwotCi0JcmV0dXJuIGl3bF9zZW5kX2NtZChwcml2LCAmY21kX291dCk7Ci19Ci0KLXZvaWQgaXdsX2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCWludCBpOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IHByaXYtPmh3X3BhcmFtcy5zZW5zOwotCi0JaWYgKHByaXYtPmRpc2FibGVfc2Vuc19jYWwpCi0JCXJldHVybjsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiU3RhcnQgaXdsX2luaXRfc2Vuc2l0aXZpdHlcbiIpOwotCi0JLyogQ2xlYXIgZHJpdmVyJ3Mgc2Vuc2l0aXZpdHkgYWxnbyBkYXRhICovCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQlpZiAocmFuZ2VzID09IE5VTEwpCi0JCXJldHVybjsKLQotCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhKSk7Ci0KLQlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKLQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9UT09fTUFOWTsKLQlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IElXTF9GQV9UT09fTUFOWTsKLQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYgPSAwOwotCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7Ci0JZGF0YS0+bnJnX2VuZXJneV9pZHggPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JCWRhdGEtPm5yZ192YWx1ZVtpXSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgaSsrKQotCQlkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldID0gMDsKLQotCWRhdGEtPmF1dG9fY29ycl9vZmRtID0gIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtOwotCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yYzsKLQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSAgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MTsKLQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmNfeDE7Ci0JZGF0YS0+YXV0b19jb3JyX2NjayA9IEFVVE9fQ09SUl9DQ0tfTUlOX1ZBTF9ERUY7Ci0JZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrX21yYzsKLQlkYXRhLT5ucmdfdGhfY2NrID0gcmFuZ2VzLT5ucmdfdGhfY2NrOwotCWRhdGEtPm5yZ190aF9vZmRtID0gcmFuZ2VzLT5ucmdfdGhfb2ZkbTsKLQlkYXRhLT5iYXJrZXJfY29ycl90aF9taW4gPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbjsKLQlkYXRhLT5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gcmFuZ2VzLT5iYXJrZXJfY29ycl90aF9taW5fbXJjOwotCWRhdGEtPm5yZ190aF9jY2EgPSByYW5nZXMtPm5yZ190aF9jY2E7Ci0KLQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gMDsKLQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gMDsKLQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSAwOwotCWRhdGEtPmxhc3RfZmFfY250X2NjayA9IDA7Ci0KLQlyZXQgfD0gaXdsX3NlbnNpdGl2aXR5X3dyaXRlKHByaXYpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDxyZXR1cm4gMHglWFxuIiwgcmV0KTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2luaXRfc2Vuc2l0aXZpdHkpOwotCi12b2lkIGl3bF9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqcmVzcCkKLXsKLQl1MzIgcnhfZW5hYmxlX3RpbWU7Ci0JdTMyIGZhX2NjazsKLQl1MzIgZmFfb2ZkbTsKLQl1MzIgYmFkX3BsY3BfY2NrOwotCXUzMiBiYWRfcGxjcF9vZmRtOwotCXUzMiBub3JtX2ZhX29mZG07Ci0JdTMyIG5vcm1fZmFfY2NrOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSAqcnhfaW5mbyA9ICYocmVzcC0+cnguZ2VuZXJhbCk7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfcnggKnN0YXRpc3RpY3MgPSAmKHJlc3AtPnJ4KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfZGF0YSBzdGF0aXM7Ci0KLQlpZiAocHJpdi0+ZGlzYWJsZV9zZW5zX2NhbCkKLQkJcmV0dXJuOwotCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQlpZiAoIWl3bF9pc19hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDwgLSBub3QgYXNzb2NpYXRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IGludmFsaWQgZGF0YS5cbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBFeHRyYWN0IFN0YXRpc3RpY3M6ICovCi0JcnhfZW5hYmxlX3RpbWUgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5jaGFubmVsX2xvYWQpOwotCWZhX2NjayA9IGxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmNjay5mYWxzZV9hbGFybV9jbnQpOwotCWZhX29mZG0gPSBsZTMyX3RvX2NwdShzdGF0aXN0aWNzLT5vZmRtLmZhbHNlX2FsYXJtX2NudCk7Ci0JYmFkX3BsY3BfY2NrID0gbGUzMl90b19jcHUoc3RhdGlzdGljcy0+Y2NrLnBsY3BfZXJyKTsKLQliYWRfcGxjcF9vZmRtID0gbGUzMl90b19jcHUoc3RhdGlzdGljcy0+b2ZkbS5wbGNwX2Vycik7Ci0KLQlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9hID0KLQkJCWxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmdlbmVyYWwuYmVhY29uX3NpbGVuY2VfcnNzaV9hKTsKLQlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9iID0KLQkJCWxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmdlbmVyYWwuYmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKLQlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9jID0KLQkJCWxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmdlbmVyYWwuYmVhY29uX3NpbGVuY2VfcnNzaV9jKTsKLQlzdGF0aXMuYmVhY29uX2VuZXJneV9hID0KLQkJCWxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmdlbmVyYWwuYmVhY29uX2VuZXJneV9hKTsKLQlzdGF0aXMuYmVhY29uX2VuZXJneV9iID0KLQkJCWxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmdlbmVyYWwuYmVhY29uX2VuZXJneV9iKTsKLQlzdGF0aXMuYmVhY29uX2VuZXJneV9jID0KLQkJCWxlMzJfdG9fY3B1KHN0YXRpc3RpY3MtPmdlbmVyYWwuYmVhY29uX2VuZXJneV9jKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAicnhfZW5hYmxlX3RpbWUgPSAldSB1c2Vjc1xuIiwgcnhfZW5hYmxlX3RpbWUpOwotCi0JaWYgKCFyeF9lbmFibGVfdGltZSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IFJYIEVuYWJsZSBUaW1lID09IDAhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoZXNlIHN0YXRpc3RpY3MgaW5jcmVhc2UgbW9ub3RvbmljYWxseSwgYW5kIGRvIG5vdCByZXNldAotCSAqICAgYXQgZWFjaCBiZWFjb24uICBDYWxjdWxhdGUgZGlmZmVyZW5jZSBmcm9tIGxhc3QgdmFsdWUsIG9yIGp1c3QKLQkgKiAgIHVzZSB0aGUgbmV3IHN0YXRpc3RpY3MgdmFsdWUgaWYgaXQgaGFzIHJlc2V0IG9yIHdyYXBwZWQgYXJvdW5kLiAqLwotCWlmIChkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPiBiYWRfcGxjcF9jY2spCi0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IGJhZF9wbGNwX2NjazsKLQllbHNlIHsKLQkJYmFkX3BsY3BfY2NrIC09IGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjazsKLQkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrICs9IGJhZF9wbGNwX2NjazsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSA+IGJhZF9wbGNwX29mZG0pCi0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSBiYWRfcGxjcF9vZmRtOwotCWVsc2UgewotCQliYWRfcGxjcF9vZmRtIC09IGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG07Ci0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gKz0gYmFkX3BsY3Bfb2ZkbTsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSA+IGZhX29mZG0pCi0JCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSBmYV9vZmRtOwotCWVsc2UgewotCQlmYV9vZmRtIC09IGRhdGEtPmxhc3RfZmFfY250X29mZG07Ci0JCWRhdGEtPmxhc3RfZmFfY250X29mZG0gKz0gZmFfb2ZkbTsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9mYV9jbnRfY2NrID4gZmFfY2NrKQotCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2sgPSBmYV9jY2s7Ci0JZWxzZSB7Ci0JCWZhX2NjayAtPSBkYXRhLT5sYXN0X2ZhX2NudF9jY2s7Ci0JCWRhdGEtPmxhc3RfZmFfY250X2NjayArPSBmYV9jY2s7Ci0JfQotCi0JLyogVG90YWwgYWJvcnRlZCBzaWduYWwgbG9ja3MgKi8KLQlub3JtX2ZhX29mZG0gPSBmYV9vZmRtICsgYmFkX3BsY3Bfb2ZkbTsKLQlub3JtX2ZhX2NjayA9IGZhX2NjayArIGJhZF9wbGNwX2NjazsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2NrOiBmYSAldSBiYWRwICV1ICBvZmRtOiBmYSAldSBiYWRwICV1XG4iLCBmYV9jY2ssCi0JCQliYWRfcGxjcF9jY2ssIGZhX29mZG0sIGJhZF9wbGNwX29mZG0pOwotCi0JaXdsX3NlbnNfYXV0b19jb3JyX29mZG0ocHJpdiwgbm9ybV9mYV9vZmRtLCByeF9lbmFibGVfdGltZSk7Ci0JaXdsX3NlbnNfZW5lcmd5X2Njayhwcml2LCBub3JtX2ZhX2NjaywgcnhfZW5hYmxlX3RpbWUsICZzdGF0aXMpOwotCWl3bF9zZW5zaXRpdml0eV93cml0ZShwcml2KTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX3NlbnNpdGl2aXR5X2NhbGlicmF0aW9uKTsKLQotc3RhdGljIGlubGluZSB1OCBmaW5kX2ZpcnN0X2NoYWluKHU4IG1hc2spCi17Ci0JaWYgKG1hc2sgJiBBTlRfQSkKLQkJcmV0dXJuIENIQUlOX0E7Ci0JaWYgKG1hc2sgJiBBTlRfQikKLQkJcmV0dXJuIENIQUlOX0I7Ci0JcmV0dXJuIENIQUlOX0M7Ci19Ci0KLS8qCi0gKiBBY2N1bXVsYXRlIDIwIGJlYWNvbnMgb2Ygc2lnbmFsIGFuZCBub2lzZSBzdGF0aXN0aWNzIGZvciBlYWNoIG9mCi0gKiAgIDMgcmVjZWl2ZXJzL2FudGVubmFzL3J4LWNoYWlucywgdGhlbiBmaWd1cmUgb3V0OgotICogMSkgIFdoaWNoIGFudGVubmFzIGFyZSBjb25uZWN0ZWQuCi0gKiAyKSAgRGlmZmVyZW50aWFsIHJ4IGdhaW4gc2V0dGluZ3MgdG8gYmFsYW5jZSB0aGUgMyByZWNlaXZlcnMuCi0gKi8KLXZvaWQgaXdsX2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICpzdGF0X3Jlc3ApCi17Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gTlVMTDsKLQotCXUzMiBjaGFpbl9ub2lzZV9hOwotCXUzMiBjaGFpbl9ub2lzZV9iOwotCXUzMiBjaGFpbl9ub2lzZV9jOwotCXUzMiBjaGFpbl9zaWdfYTsKLQl1MzIgY2hhaW5fc2lnX2I7Ci0JdTMyIGNoYWluX3NpZ19jOwotCXUzMiBhdmVyYWdlX3NpZ1tOVU1fUlhfQ0hBSU5TXSA9IHtJTklUSUFMSVpBVElPTl9WQUxVRX07Ci0JdTMyIGF2ZXJhZ2Vfbm9pc2VbTlVNX1JYX0NIQUlOU10gPSB7SU5JVElBTElaQVRJT05fVkFMVUV9OwotCXUzMiBtYXhfYXZlcmFnZV9zaWc7Ci0JdTE2IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2k7Ci0JdTMyIG1pbl9hdmVyYWdlX25vaXNlID0gTUlOX0FWRVJBR0VfTk9JU0VfTUFYX1ZBTFVFOwotCXUxNiBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kgPSBJTklUSUFMSVpBVElPTl9WQUxVRTsKLQl1MTYgaSA9IDA7Ci0JdTE2IHJ4b25fY2hudW0gPSBJTklUSUFMSVpBVElPTl9WQUxVRTsKLQl1MTYgc3RhdF9jaG51bSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOwotCXU4IHJ4b25fYmFuZDI0OwotCXU4IHN0YXRfYmFuZDI0OwotCXUzMiBhY3RpdmVfY2hhaW5zID0gMDsKLQl1OCBudW1fdHhfY2hhaW5zOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSAqcnhfaW5mbyA9ICYoc3RhdF9yZXNwLT5yeC5nZW5lcmFsKTsKLQl1OCBmaXJzdF9jaGFpbjsKLQotCWlmIChwcml2LT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCkKLQkJcmV0dXJuOwotCi0JZGF0YSA9ICYocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YSk7Ci0KLQkvKgotCSAqIEFjY3VtdWxhdGUganVzdCB0aGUgZmlyc3QgImNoYWluX25vaXNlX251bV9iZWFjb25zIiBhZnRlcgotCSAqIHRoZSBmaXJzdCBhc3NvY2lhdGlvbiwgdGhlbiB3ZSdyZSBkb25lIGZvcmV2ZXIuCi0JICovCi0JaWYgKGRhdGEtPnN0YXRlICE9IElXTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFKSB7Ci0JCWlmIChkYXRhLT5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfQUxJVkUpCi0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIldhaXQgZm9yIG5vaXNlIGNhbGliIHJlc2V0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiIDw8IEludGVyZmVyZW5jZSBkYXRhIHVuYXZhaWxhYmxlXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0Jcnhvbl9iYW5kMjQgPSAhIShwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOwotCXJ4b25fY2hudW0gPSBsZTE2X3RvX2NwdShwcml2LT5zdGFnaW5nX3J4b24uY2hhbm5lbCk7Ci0Jc3RhdF9iYW5kMjQgPSAhIShzdGF0X3Jlc3AtPmZsYWcgJiBTVEFUSVNUSUNTX1JFUExZX0ZMR19CQU5EXzI0R19NU0spOwotCXN0YXRfY2hudW0gPSBsZTMyX3RvX2NwdShzdGF0X3Jlc3AtPmZsYWcpID4+IDE2OwotCi0JLyogTWFrZSBzdXJlIHdlIGFjY3VtdWxhdGUgZGF0YSBmb3IganVzdCB0aGUgYXNzb2NpYXRlZCBjaGFubmVsCi0JICogICAoZXZlbiBpZiBzY2FubmluZykuICovCi0JaWYgKChyeG9uX2NobnVtICE9IHN0YXRfY2hudW0pIHx8IChyeG9uX2JhbmQyNCAhPSBzdGF0X2JhbmQyNCkpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJTdGF0cyBub3QgZnJvbSBjaGFuPSVkLCBiYW5kMjQ9JWRcbiIsCi0JCQkJcnhvbl9jaG51bSwgcnhvbl9iYW5kMjQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqICBBY2N1bXVsYXRlIGJlYWNvbiBzdGF0aXN0aWNzIHZhbHVlcyBhY3Jvc3MKLQkgKiAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiCi0JICovCi0JY2hhaW5fbm9pc2VfYSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSkgJgotCQkJCUlOX0JBTkRfRklMVEVSOwotCWNoYWluX25vaXNlX2IgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYKLQkJCQlJTl9CQU5EX0ZJTFRFUjsKLQljaGFpbl9ub2lzZV9jID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKSAmCi0JCQkJSU5fQkFORF9GSUxURVI7Ci0KLQljaGFpbl9zaWdfYSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2EpICYgSU5fQkFORF9GSUxURVI7Ci0JY2hhaW5fc2lnX2IgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9iKSAmIElOX0JBTkRfRklMVEVSOwotCWNoYWluX3NpZ19jID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYykgJiBJTl9CQU5EX0ZJTFRFUjsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWRhdGEtPmJlYWNvbl9jb3VudCsrOwotCi0JZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IChjaGFpbl9ub2lzZV9hICsgZGF0YS0+Y2hhaW5fbm9pc2VfYSk7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYiA9IChjaGFpbl9ub2lzZV9iICsgZGF0YS0+Y2hhaW5fbm9pc2VfYik7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IChjaGFpbl9ub2lzZV9jICsgZGF0YS0+Y2hhaW5fbm9pc2VfYyk7Ci0KLQlkYXRhLT5jaGFpbl9zaWduYWxfYSA9IChjaGFpbl9zaWdfYSArIGRhdGEtPmNoYWluX3NpZ25hbF9hKTsKLQlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IChjaGFpbl9zaWdfYiArIGRhdGEtPmNoYWluX3NpZ25hbF9iKTsKLQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IChjaGFpbl9zaWdfYyArIGRhdGEtPmNoYWluX3NpZ25hbF9jKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhbj0lZCwgYmFuZDI0PSVkLCBiZWFjb249JWRcbiIsCi0JCQlyeG9uX2NobnVtLCByeG9uX2JhbmQyNCwgZGF0YS0+YmVhY29uX2NvdW50KTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNoYWluX3NpZzogYSAlZCBiICVkIGMgJWRcbiIsCi0JCQljaGFpbl9zaWdfYSwgY2hhaW5fc2lnX2IsIGNoYWluX3NpZ19jKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNoYWluX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWNoYWluX25vaXNlX2EsIGNoYWluX25vaXNlX2IsIGNoYWluX25vaXNlX2MpOwotCi0JLyogSWYgdGhpcyBpcyB0aGUgImNoYWluX25vaXNlX251bV9iZWFjb25zIiwgZGV0ZXJtaW5lOgotCSAqIDEpICBEaXNjb25uZWN0ZWQgYW50ZW5uYXMgKHVzaW5nIHNpZ25hbCBzdHJlbmd0aHMpCi0JICogMikgIERpZmZlcmVudGlhbCBnYWluICh1c2luZyBzaWxlbmNlIG5vaXNlKSB0byBiYWxhbmNlIHJlY2VpdmVycyAqLwotCWlmIChkYXRhLT5iZWFjb25fY291bnQgIT0gcHJpdi0+Y2ZnLT5jaGFpbl9ub2lzZV9udW1fYmVhY29ucykKLQkJcmV0dXJuOwotCi0JLyogQW5hbHl6ZSBzaWduYWwgZm9yIGRpc2Nvbm5lY3RlZCBhbnRlbm5hICovCi0JYXZlcmFnZV9zaWdbMF0gPQotCQkoZGF0YS0+Y2hhaW5fc2lnbmFsX2EpIC8gcHJpdi0+Y2ZnLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKLQlhdmVyYWdlX3NpZ1sxXSA9Ci0JCShkYXRhLT5jaGFpbl9zaWduYWxfYikgLyBwcml2LT5jZmctPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCWF2ZXJhZ2Vfc2lnWzJdID0KLQkJKGRhdGEtPmNoYWluX3NpZ25hbF9jKSAvIHByaXYtPmNmZy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0KLQlpZiAoYXZlcmFnZV9zaWdbMF0gPj0gYXZlcmFnZV9zaWdbMV0pIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMF07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAwOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfSBlbHNlIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMV07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAxOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfQotCi0JaWYgKGF2ZXJhZ2Vfc2lnWzJdID49IG1heF9hdmVyYWdlX3NpZykgewotCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1syXTsKLQkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDI7Ci0JCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKLQl9Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImF2ZXJhZ2Vfc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJICAgICBhdmVyYWdlX3NpZ1swXSwgYXZlcmFnZV9zaWdbMV0sIGF2ZXJhZ2Vfc2lnWzJdKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1heF9hdmVyYWdlX3NpZyA9ICVkLCBhbnRlbm5hICVkXG4iLAotCQkgICAgIG1heF9hdmVyYWdlX3NpZywgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0KLQkvKiBDb21wYXJlIHNpZ25hbCBzdHJlbmd0aHMgZm9yIGFsbCAzIHJlY2VpdmVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCWlmIChpICE9IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpIHsKLQkJCXMzMiByc3NpX2RlbHRhID0gKG1heF9hdmVyYWdlX3NpZyAtIGF2ZXJhZ2Vfc2lnW2ldKTsKLQotCQkJLyogSWYgc2lnbmFsIGlzIHZlcnkgd2VhaywgY29tcGFyZWQgd2l0aAotCQkJICogc3Ryb25nZXN0LCBtYXJrIGl0IGFzIGRpc2Nvbm5lY3RlZC4gKi8KLQkJCWlmIChyc3NpX2RlbHRhID4gTUFYSU1VTV9BTExPV0VEX1BBVEhMT1NTKQotCQkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gPSAxOwotCQkJZWxzZQotCQkJCWFjdGl2ZV9jaGFpbnMgfD0gKDEgPDwgaSk7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImkgPSAlZCAgcnNzaURlbHRhID0gJWQgICIKLQkJCSAgICAgImRpc2Nvbm5fYXJyYXlbaV0gPSAlZFxuIiwKLQkJCSAgICAgaSwgcnNzaV9kZWx0YSwgZGF0YS0+ZGlzY29ubl9hcnJheVtpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBhYm92ZSBhbGdvcml0aG0gc29tZXRpbWVzIGZhaWxzIHdoZW4gdGhlIHVjb2RlCi0JICogcmVwb3J0cyAwIGZvciBhbGwgY2hhaW5zLiBJdCdzIG5vdCBjbGVhciB3aHkgdGhhdAotCSAqIGhhcHBlbnMgdG8gc3RhcnQgd2l0aCwgYnV0IGl0IGlzIHRoZW4gY2F1c2luZyB0cm91YmxlCi0JICogYmVjYXVzZSB0aGlzIGNhbiBtYWtlIHVzIGVuYWJsZSBtb3JlIGNoYWlucyB0aGFuIHRoZQotCSAqIGhhcmR3YXJlIHJlYWxseSBoYXMuCi0JICoKLQkgKiBUbyBiZSBzYWZlLCBzaW1wbHkgbWFzayBvdXQgYW55IGNoYWlucyB0aGF0IHdlIGtub3cKLQkgKiBhcmUgbm90IG9uIHRoZSBkZXZpY2UuCi0JICovCi0JYWN0aXZlX2NoYWlucyAmPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCi0JbnVtX3R4X2NoYWlucyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQkvKiBsb29wcyBvbiBhbGwgdGhlIGJpdHMgb2YKLQkJICogcHJpdi0+aHdfc2V0dGluZy52YWxpZF90eF9hbnQgKi8KLQkJdTggYW50X21zayA9ICgxIDw8IGkpOwotCQlpZiAoIShwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgYW50X21zaykpCi0JCQljb250aW51ZTsKLQotCQludW1fdHhfY2hhaW5zKys7Ci0JCWlmIChkYXRhLT5kaXNjb25uX2FycmF5W2ldID09IDApCi0JCQkvKiB0aGVyZSBpcyBhIFR4IGFudGVubmEgY29ubmVjdGVkICovCi0JCQlicmVhazsKLQkJaWYgKG51bV90eF9jaGFpbnMgPT0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gJiYKLQkJICAgIGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pIHsKLQkJCS8qCi0JCQkgKiBJZiBhbGwgY2hhaW5zIGFyZSBkaXNjb25uZWN0ZWQKLQkJCSAqIGNvbm5lY3QgdGhlIGZpcnN0IHZhbGlkIHR4IGNoYWluCi0JCQkgKi8KLQkJCWZpcnN0X2NoYWluID0KLQkJCQlmaW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKLQkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbZmlyc3RfY2hhaW5dID0gMDsKLQkJCWFjdGl2ZV9jaGFpbnMgfD0gQklUKGZpcnN0X2NoYWluKTsKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiQWxsIFR4IGNoYWlucyBhcmUgZGlzY29ubmVjdGVkIFcvQSAtIGRlY2xhcmUgJWQgYXMgY29ubmVjdGVkXG4iLAotCQkJCQlmaXJzdF9jaGFpbik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIFNhdmUgZm9yIHVzZSB3aXRoaW4gUlhPTiwgVFgsIFNDQU4gY29tbWFuZHMsIGV0Yy4gKi8KLQlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMgPSBhY3RpdmVfY2hhaW5zOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiYWN0aXZlX2NoYWlucyAoYml0d2lzZSkgPSAweCV4XG4iLAotCQkJYWN0aXZlX2NoYWlucyk7Ci0KLQkvKiBBbmFseXplIG5vaXNlIGZvciByeCBiYWxhbmNlICovCi0JYXZlcmFnZV9ub2lzZVswXSA9Ci0JCSgoZGF0YS0+Y2hhaW5fbm9pc2VfYSkgLyBwcml2LT5jZmctPmNoYWluX25vaXNlX251bV9iZWFjb25zKTsKLQlhdmVyYWdlX25vaXNlWzFdID0KLQkJKChkYXRhLT5jaGFpbl9ub2lzZV9iKSAvIHByaXYtPmNmZy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMpOwotCWF2ZXJhZ2Vfbm9pc2VbMl0gPQotCQkoKGRhdGEtPmNoYWluX25vaXNlX2MpIC8gcHJpdi0+Y2ZnLT5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCWlmICghKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pICYmCi0JCSAgIChhdmVyYWdlX25vaXNlW2ldIDw9IG1pbl9hdmVyYWdlX25vaXNlKSkgewotCQkJLyogVGhpcyBtZWFucyB0aGF0IGNoYWluIGkgaXMgYWN0aXZlIGFuZCBoYXMKLQkJCSAqIGxvd2VyIG5vaXNlIHZhbHVlcyBzbyBmYXI6ICovCi0JCQltaW5fYXZlcmFnZV9ub2lzZSA9IGF2ZXJhZ2Vfbm9pc2VbaV07Ci0JCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kgPSBpOwotCQl9Ci0JfQotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJhdmVyYWdlX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWF2ZXJhZ2Vfbm9pc2VbMF0sIGF2ZXJhZ2Vfbm9pc2VbMV0sCi0JCQlhdmVyYWdlX25vaXNlWzJdKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWluX2F2ZXJhZ2Vfbm9pc2UgPSAlZCwgYW50ZW5uYSAlZFxuIiwKLQkJCW1pbl9hdmVyYWdlX25vaXNlLCBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kpOwotCi0JaWYgKHByaXYtPmNmZy0+b3BzLT51dGlscy0+Z2Fpbl9jb21wdXRhdGlvbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5nYWluX2NvbXB1dGF0aW9uKHByaXYsIGF2ZXJhZ2Vfbm9pc2UsCi0JCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCBtaW5fYXZlcmFnZV9ub2lzZSwKLQkJCQlmaW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSk7Ci0KLQkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCi0JICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KLQkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MocHJpdik7Ci0KLQlkYXRhLT5zdGF0ZSA9IElXTF9DSEFJTl9OT0lTRV9ET05FOwotCWl3bF9wb3dlcl91cGRhdGVfbW9kZShwcml2LCBmYWxzZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbik7Ci0KLQotdm9pZCBpd2xfcmVzZXRfcnVuX3RpbWVfY2FsaWIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBpOwotCW1lbXNldCgmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhKSk7Ci0JbWVtc2V0KCYocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YSksIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEpKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKQotCQlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLmRlbHRhX2dhaW5fY29kZVtpXSA9Ci0JCQkJQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTDsKLQotCS8qIEFzayBmb3Igc3RhdGlzdGljcyBub3csIHRoZSB1Q29kZSB3aWxsIHNlbmQgbm90aWZpY2F0aW9uCi0JICogcGVyaW9kaWNhbGx5IGFmdGVyIGFzc29jaWF0aW9uICovCi0JaXdsX3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KHByaXYsIENNRF9BU1lOQywgdHJ1ZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9yZXNldF9ydW5fdGltZV9jYWxpYik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNhbGliLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jYWxpYi5oCmluZGV4IDJiN2IxZGYuLmJhOTUyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNhbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2FsaWIuaApAQCAtNjYsMTAgKzY2LDggQEAKICNpbmNsdWRlICJpd2wtY29yZS5oIgogI2luY2x1ZGUgIml3bC1jb21tYW5kcy5oIgogCi12b2lkIGl3bF9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICpzdGF0X3Jlc3ApOwotdm9pZCBpd2xfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqcmVzcCk7Cit2b2lkIGl3bF9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnN0YXRfcmVzcCk7Cit2b2lkIGl3bF9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnJlc3ApOwogCiB2b2lkIGl3bF9pbml0X3NlbnNpdGl2aXR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9yZXNldF9ydW5fdGltZV9jYWxpYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKaW5kZXggOWFhYjAyMC4uNjA3MjVhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCkBAIC05NSw4ICs5NSw5IEBACiAKIAkvKiBNdWx0aS1TdGF0aW9uIHN1cHBvcnQgKi8KIAlSRVBMWV9BRERfU1RBID0gMHgxOCwKLQlSRVBMWV9SRU1PVkVfU1RBID0gMHgxOSwJLyogbm90IHVzZWQgKi8KKwlSRVBMWV9SRU1PVkVfU1RBID0gMHgxOSwKIAlSRVBMWV9SRU1PVkVfQUxMX1NUQSA9IDB4MWEsCS8qIG5vdCB1c2VkICovCisJUkVQTFlfVFhGSUZPX0ZMVVNIID0gMHgxZSwKIAogCS8qIFNlY3VyaXR5ICovCiAJUkVQTFlfV0VQS0VZID0gMHgyMCwKQEAgLTIyNyw3ICsyMjgsNyBAQAogCiAJLyogY29tbWFuZCBvciByZXNwb25zZS9ub3RpZmljYXRpb24gZGF0YSBmb2xsb3dzIGltbWVkaWF0ZWx5ICovCiAJdTggZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKioKQEAgLTI0Nyw3ICsyNDgsNyBAQAogc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgewogCXU4IHR4X2dhaW47CQkvKiBnYWluIGZvciBhbmFsb2cgcmFkaW8gKi8KIAl1OCBkc3BfYXR0ZW47CQkvKiBnYWluIGZvciBEU1AgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBzdHJ1Y3QgaXdsMzk0NV9wb3dlcl9wZXJfcmF0ZQpAQCAtMjU4LDcgKzI1OSw3IEBACiAJdTggcmF0ZTsJCS8qIHBsY3AgKi8KIAlzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciB0cGM7CiAJdTggcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogaXdsYWduIHJhdGVfbl9mbGFncyBiaXQgZmllbGRzCkBAIC0zODksNyArMzkwLDcgQEAKICAqLwogc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKIAlfX2xlMzIgZHc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogc3RydWN0IGl3bDQ5NjVfdHhfcG93ZXJfZGIKQEAgLTM5OCw3ICszOTksNyBAQAogICovCiBzdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiB7CiAJc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHBvd2VyX3RibFtQT1dFUl9UQUJMRV9OVU1fRU5UUklFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogQ29tbWFuZCBSRVBMWV9UWF9QT1dFUl9EQk1fQ01EID0gMHg5OApAQCAtNDEyLDcgKzQxMyw3IEBACiAJdTggZmxhZ3M7CiAJczggc3J2X2NoYW5fbG10OyAvKmluIGhhbGYtZEJtIChlLmcuIDMwID0gMTUgZEJtKSAqLwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioKICAqIENvbW1hbmQgVFhfQU5UX0NPTkZJR1VSQVRJT05fQ01EID0gMHg5OApAQCAtNDIyLDcgKzQyMyw3IEBACiAgKi8KIHN0cnVjdCBpd2xfdHhfYW50X2NvbmZpZ19jbWQgewogCV9fbGUzMiB2YWxpZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDBhKQpAQCAtNDc4LDcgKzQ3OSw3IEBACiAJX19sZTMyIHRoZXJtX3I0WzJdOwkvKiBzaWduZWQgKi8KIAlfX2xlMzIgdHhfYXR0ZW5bNV1bMl07CS8qIHNpZ25lZCBNSU1PIGdhaW4gY29tcCwgNSBmcmVxIGdyb3VwcywKIAkJCQkgKiAyIFR4IGNoYWlucyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qKgpAQCAtNTcwLDcgKzU3MSw3IEBACiAJX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIGZvciBlcnJvciBsb2cgKi8KIAlfX2xlMzIgdGltZXN0YW1wOwogCV9fbGUzMiBpc192YWxpZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFJFUExZX0VSUk9SID0gMHgyIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQpAQCAtNTgyLDcgKzU4Myw3IEBACiAJX19sZTE2IGJhZF9jbWRfc2VxX251bTsKIAlfX2xlMzIgZXJyb3JfaW5mbzsKIAlfX2xlNjQgdGltZXN0YW1wOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAoMSkKQEAgLTcxOCw3ICs3MTksNyBAQAogCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CiAJX19sZTE2IGNoYW5uZWw7CiAJX19sZTE2IHJlc2VydmVkNTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDQ5NjVfcnhvbl9jbWQgewogCXU4IG5vZGVfYWRkcls2XTsKQEAgLTczOCw3ICs3MzksNyBAQAogCV9fbGUxNiBjaGFubmVsOwogCXU4IG9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlczsKIAl1OCBvZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiA1MDAwIEhXIGp1c3QgZXh0ZW5kIHRoaXMgY29tbWFuZCAqLwogc3RydWN0IGl3bF9yeG9uX2NtZCB7CkBAIC03NjMsNyArNzY0LDcgQEAKIAl1OCByZXNlcnZlZDU7CiAJX19sZTE2IGFjcXVpc2l0aW9uX2RhdGE7CiAJX19sZTE2IHJlc2VydmVkNjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFJFUExZX1JYT05fQVNTT0MgPSAweDExIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCkBAIC03NzQsNyArNzc1LDcgQEAKIAl1OCBvZmRtX2Jhc2ljX3JhdGVzOwogCXU4IGNja19iYXNpY19yYXRlczsKIAlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd2w0OTY1X3J4b25fYXNzb2NfY21kIHsKIAlfX2xlMzIgZmxhZ3M7CkBAIC03ODUsNyArNzg2LDcgQEAKIAl1OCBvZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOwogCV9fbGUxNiByeF9jaGFpbl9zZWxlY3RfZmxhZ3M7CiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsNTAwMF9yeG9uX2Fzc29jX2NtZCB7CiAJX19sZTMyIGZsYWdzOwpAQCAtODAwLDcgKzgwMSw3IEBACiAJX19sZTE2IHJ4X2NoYWluX3NlbGVjdF9mbGFnczsKIAlfX2xlMTYgYWNxdWlzaXRpb25fZGF0YTsKIAlfX2xlMzIgcmVzZXJ2ZWQzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUwJMTAKICNkZWZpbmUgSVdMX01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJNCAvKiA0MDk2ICovCkBAIC04MTYsNyArODE3LDcgQEAKIAlfX2xlMzIgYmVhY29uX2luaXRfdmFsOwogCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUkVQTFlfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCkBAIC04MjksNyArODMwLDcgQEAKIAlfX2xlMzIgcnhvbl9maWx0ZXJfZmxhZ3M7CiAJX19sZTMyIHN3aXRjaF90aW1lOwogCXN0cnVjdCBpd2wzOTQ1X3Bvd2VyX3Blcl9yYXRlIHBvd2VyW0lXTF9NQVhfUkFURVNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3N3aXRjaF9jbWQgewogCXU4IGJhbmQ7CkBAIC04MzksNyArODQwLDcgQEAKIAlfX2xlMzIgcnhvbl9maWx0ZXJfZmxhZ3M7CiAJX19sZTMyIHN3aXRjaF90aW1lOwogCXN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioKICAqIHN0cnVjdCBpd2w1MDAwX2NoYW5uZWxfc3dpdGNoX2NtZApAQCAtODYwLDcgKzg2MSw3IEBACiAJX19sZTMyIHJ4b25fZmlsdGVyX2ZsYWdzOwogCV9fbGUzMiBzd2l0Y2hfdGltZTsKIAlfX2xlMzIgcmVzZXJ2ZWRbMl1bSVdMX1BXUl9OVU1fSFRfT0ZETV9FTlRSSUVTICsgSVdMX1BXUl9DQ0tfRU5UUklFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogc3RydWN0IGl3bDYwMDBfY2hhbm5lbF9zd2l0Y2hfY21kCkBAIC04ODEsNyArODgyLDcgQEAKIAlfX2xlMzIgcnhvbl9maWx0ZXJfZmxhZ3M7CiAJX19sZTMyIHN3aXRjaF90aW1lOwogCV9fbGUzMiByZXNlcnZlZFszXVtJV0xfUFdSX05VTV9IVF9PRkRNX0VOVFJJRVMgKyBJV0xfUFdSX0NDS19FTlRSSUVTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIENIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTiA9IDB4NzMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQpAQCAtODkwLDcgKzg5MSw3IEBACiAJX19sZTE2IGJhbmQ7CiAJX19sZTE2IGNoYW5uZWw7CiAJX19sZTMyIHN0YXR1czsJCS8qIDAgLSBPSywgMSAtIGZhaWwgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDIpCkBAIC05MjAsNyArOTIxLDcgQEAKIAl1OCBhaWZzbjsKIAl1OCByZXNlcnZlZDE7CiAJX19sZTE2IGVkY2FfdHhvcDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogUW9TIGZsYWdzIGRlZmluZXMgKi8KICNkZWZpbmUgUU9TX1BBUkFNX0ZMR19VUERBVEVfRURDQV9NU0sJY3B1X3RvX2xlMzIoMHgwMSkKQEAgLTkzOSw3ICs5NDAsNyBAQAogc3RydWN0IGl3bF9xb3NwYXJhbV9jbWQgewogCV9fbGUzMiBxb3NfZmxhZ3M7CiAJc3RydWN0IGl3bF9hY19xb3MgYWNbQUNfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDMpCkBAIC05NTIsMjAgKzk1MywxOSBAQAogCiAvKiBTcGVjaWFsLCBkZWRpY2F0ZWQgbG9jYXRpb25zIHdpdGhpbiBkZXZpY2UncyBzdGF0aW9uIHRhYmxlICovCiAjZGVmaW5lCUlXTF9BUF9JRAkJMAotI2RlZmluZSBJV0xfTVVMVElDQVNUX0lECTEKICNkZWZpbmUJSVdMX1NUQV9JRAkJMgogI2RlZmluZQlJV0wzOTQ1X0JST0FEQ0FTVF9JRAkyNAogI2RlZmluZSBJV0wzOTQ1X1NUQVRJT05fQ09VTlQJMjUKICNkZWZpbmUgSVdMNDk2NV9CUk9BRENBU1RfSUQJMzEKICNkZWZpbmUJSVdMNDk2NV9TVEFUSU9OX0NPVU5UCTMyCi0jZGVmaW5lIElXTDUwMDBfQlJPQURDQVNUX0lECTE1Ci0jZGVmaW5lCUlXTDUwMDBfU1RBVElPTl9DT1VOVAkxNgorI2RlZmluZSBJV0xBR05fQlJPQURDQVNUX0lECTE1CisjZGVmaW5lCUlXTEFHTl9TVEFUSU9OX0NPVU5UCTE2CiAKICNkZWZpbmUJSVdMX1NUQVRJT05fQ09VTlQJMzIgCS8qIE1BWCgzOTQ1LDQ5NjUpKi8KICNkZWZpbmUJSVdMX0lOVkFMSURfU1RBVElPTiAJMjU1CiAKLSNkZWZpbmUgU1RBX0ZMR19UWF9SQVRFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyKTsKLSNkZWZpbmUgU1RBX0ZMR19QV1JfU0FWRV9NU0sJCWNwdV90b19sZTMyKDEgPDwgOCk7CisjZGVmaW5lIFNUQV9GTEdfVFhfUkFURV9NU0sJCWNwdV90b19sZTMyKDEgPDwgMikKKyNkZWZpbmUgU1RBX0ZMR19QV1JfU0FWRV9NU0sJCWNwdV90b19sZTMyKDEgPDwgOCkKICNkZWZpbmUgU1RBX0ZMR19SVFNfTUlNT19QUk9UX01TSwljcHVfdG9fbGUzMigxIDw8IDE3KQogI2RlZmluZSBTVEFfRkxHX0FHR19NUERVXzhVU19NU0sJY3B1X3RvX2xlMzIoMSA8PCAxOCkKICNkZWZpbmUgU1RBX0ZMR19NQVhfQUdHX1NJWkVfUE9TCSgxOSkKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAJdTgga2V5X29mZnNldDsKIAl1OCByZXNlcnZlZDI7CiAJdTgga2V5WzE2XTsJCS8qIDE2LWJ5dGUgdW5pY2FzdCBkZWNyeXB0aW9uIGtleSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiA1MDAwICovCiBzdHJ1Y3QgaXdsX2tleWluZm8gewpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAlfX2xlNjQgdHhfc2VjdXJfc2VxX2NudDsKIAlfX2xlNjQgaHdfdGtpcF9taWNfcnhfa2V5OwogCV9fbGU2NCBod190a2lwX21pY190eF9rZXk7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogc3RydWN0IHN0YV9pZF9tb2RpZnkKQEAgLTEwNDksNyArMTA0OSw3IEBACiAJdTggc3RhX2lkOwogCXU4IG1vZGlmeV9tYXNrOwogCV9fbGUxNiByZXNlcnZlZDI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBSRVBMWV9BRERfU1RBID0gMHgxOCAoY29tbWFuZCkKQEAgLTExMDMsNyArMTEwMyw3IEBACiAJLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciBhZGRlZCBibG9jay1hY2sgc3VwcG9ydC4KIAkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KIAlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgewogCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLwpAQCAtMTE0MCw3ICsxMTQwLDcgQEAKIAlfX2xlMTYgc2xlZXBfdHhfY291bnQ7CiAKIAlfX2xlMTYgcmVzZXJ2ZWQyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiA1MDAwICovCiBzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgewpAQCAtMTE3OCw3ICsxMTc4LDcgQEAKIAlfX2xlMTYgc2xlZXBfdHhfY291bnQ7CiAKIAlfX2xlMTYgcmVzZXJ2ZWQyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKICNkZWZpbmUgQUREX1NUQV9TVUNDRVNTX01TSwkJMHgxCkBAIC0xMTkwLDcgKzExOTAsNyBAQAogICovCiBzdHJ1Y3QgaXdsX2FkZF9zdGFfcmVzcCB7CiAJdTggc3RhdHVzOwkvKiBBRERfU1RBXyogKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBSRU1fU1RBX1NVQ0NFU1NfTVNLICAgICAgICAgICAgICAweDEKIC8qCkBAIC0xMTk4LDcgKzExOTgsNyBAQAogICovCiBzdHJ1Y3QgaXdsX3JlbV9zdGFfcmVzcCB7CiAJdTggc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogIFJFUExZX1JFTV9TVEEgPSAweDE5IChjb21tYW5kKQpAQCAtMTIwOCw3ICsxMjA4LDQ0IEBACiAJdTggcmVzZXJ2ZWRbM107CiAJdTggYWRkcltFVEhfQUxFTl07IC8qIE1BQyBhZGRyIG9mIHRoZSBmaXJzdCBzdGF0aW9uICovCiAJdTggcmVzZXJ2ZWQyWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElXTF9UWF9GSUZPX0JLX01TSwkJY3B1X3RvX2xlMzIoQklUKDApKQorI2RlZmluZSBJV0xfVFhfRklGT19CRV9NU0sJCWNwdV90b19sZTMyKEJJVCgxKSkKKyNkZWZpbmUgSVdMX1RYX0ZJRk9fVklfTVNLCQljcHVfdG9fbGUzMihCSVQoMikpCisjZGVmaW5lIElXTF9UWF9GSUZPX1ZPX01TSwkJY3B1X3RvX2xlMzIoQklUKDMpKQorI2RlZmluZSBJV0xfQUdHX1RYX1FVRVVFX01TSwkJY3B1X3RvX2xlMzIoMHhmZmMwMCkKKworI2RlZmluZSBJV0xfRFJPUF9TSU5HTEUJCTAKKyNkZWZpbmUgSVdMX0RST1BfU0VMRUNURUQJMQorI2RlZmluZSBJV0xfRFJPUF9BTEwJCTIKKworLyoKKyAqIFJFUExZX1RYRklGT19GTFVTSCA9IDB4MWUoY29tbWFuZCBhbmQgcmVzcG9uc2UpCisgKgorICogV2hlbiB1c2luZyBmdWxsIEZJRk8gZmx1c2ggdGhpcyBjb21tYW5kIGNoZWNrcyB0aGUgc2NoZWR1bGVyIEhXIGJsb2NrIFdSL1JECisgKiBwb2ludGVycyB0byBjaGVjayBpZiBhbGwgdGhlIGZyYW1lcyB3ZXJlIHRyYW5zZmVycmVkIGJ5IERNQSBpbnRvIHRoZQorICogcmVsZXZhbnQgVFggRklGTyBxdWV1ZS4gT25seSB3aGVuIHRoZSBETUEgaXMgZmluaXNoZWQgYW5kIHRoZSBxdWV1ZSBpcworICogZW1wdHkgdGhlIGNvbW1hbmQgY2FuIGZpbmlzaC4KKyAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGZsdXNoIHRoZSBUWEZJRk8gZnJvbSB0cmFuc21pdCBjb21tYW5kcywgaXQgbWF5CisgKiBvcGVyYXRlIG9uIHNpbmdsZSBvciBtdWx0aXBsZSBxdWV1ZXMsIHRoZSBjb21tYW5kIHF1ZXVlIGNhbid0IGJlIGZsdXNoZWQgYnkKKyAqIHRoaXMgY29tbWFuZC4gVGhlIGNvbW1hbmQgcmVzcG9uc2UgaXMgcmV0dXJuZWQgd2hlbiBhbGwgdGhlIHF1ZXVlIGZsdXNoCisgKiBvcGVyYXRpb25zIGFyZSBkb25lLiBFYWNoIFRYIGNvbW1hbmQgZmx1c2hlZCByZXR1cm4gcmVzcG9uc2Ugd2l0aCB0aGUgRkxVU0gKKyAqIHN0YXR1cyBzZXQgaW4gdGhlIFRYIHJlc3BvbnNlIHN0YXR1cy4gV2hlbiBGSUZPIGZsdXNoIG9wZXJhdGlvbiBpcyB1c2VkLAorICogdGhlIGZsdXNoIG9wZXJhdGlvbiBlbmRzIHdoZW4gYm90aCB0aGUgc2NoZWR1bGVyIERNQSBkb25lIGFuZCBUWEZJRk8gZW1wdHkKKyAqIGFyZSBzZXQuCisgKgorICogQGZpZm9fY29udHJvbDogYml0IG1hc2sgZm9yIHdoaWNoIHF1ZXVlcyB0byBmbHVzaAorICogQGZsdXNoX2NvbnRyb2w6IGZsdXNoIGNvbnRyb2xzCisgKgkwOiBEdW1wIHNpbmdsZSBNU0RVCisgKgkxOiBEdW1wIG11bHRpcGxlIE1TRFUgYWNjb3JkaW5nIHRvIFBTLCBJTlZBTElEIFNUQSwgVFRMLCBUSUQgZGlzYWJsZS4KKyAqCTI6IER1bXAgYWxsIEZJRk8KKyAqLworc3RydWN0IGl3bF90eGZpZm9fZmx1c2hfY21kIHsKKwlfX2xlMzIgZmlmb19jb250cm9sOworCV9fbGUxNiBmbHVzaF9jb250cm9sOworCV9fbGUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBSRVBMWV9XRVBfS0VZID0gMHgyMApAQCAtMTIyMCw3ICsxMjU3LDcgQEAKIAl1OCBrZXlfc2l6ZTsKIAl1OCByZXNlcnZlZDJbM107CiAJdTgga2V5WzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bF93ZXBfY21kIHsKIAl1OCBudW1fa2V5czsKQEAgLTEyMjgsNyArMTI2NSw3IEBACiAJdTggZmxhZ3M7CiAJdTggcmVzZXJ2ZWQ7CiAJc3RydWN0IGl3bF93ZXBfa2V5IGtleVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBXRVBfS0VZX1dFUF9UWVBFIDEKICNkZWZpbmUgV0VQX0tFWVNfTUFYIDQKQEAgLTEyODIsNyArMTMxOSw3IEBACiAJX19sZTE2IHNpZ19hdmc7CiAJX19sZTE2IG5vaXNlX2RpZmY7CiAJdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyIHsKIAlfX2xlMTYgY2hhbm5lbDsKQEAgLTEyOTEsMTMgKzEzMjgsMTMgQEAKIAl1OCByYXRlOwogCV9fbGUxNiBsZW47CiAJdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfZW5kIHsKIAlfX2xlMzIgc3RhdHVzOwogCV9fbGU2NCB0aW1lc3RhbXA7CiAJX19sZTMyIGJlYWNvbl90aW1lc3RhbXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBSRVBMWV8zOTQ1X1JYID0gMHgxYiAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKQEAgLTEzMTEsNyArMTM0OCw3IEBACiAJc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfc3RhdHMgc3RhdHM7CiAJc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyIGhkcjsKIAlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgZW5kOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElXTDM5X1JYX0ZSQU1FX1NJWkUJKDQgKyBzaXplb2Yoc3RydWN0IGl3bDM5NDVfcnhfZnJhbWUpKQogCkBAIC0xMzI3LDcgKzEzNjQsNyBAQAogCV9fbGUxNiBhZ2NfaW5mbzsJLyogYWdjIGNvZGUgMDo2LCBhZ2MgZEIgNzoxMywgcmVzZXJ2ZWQgMTQ6MTUgKi8KIAl1OCByc3NpX2luZm9bNl07CS8qIHdlIHVzZSBldmVuIGVudHJpZXMsIDAvMi80IGZvciBBL0IvQyByc3NpICovCiAJdTggcGFkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKICNkZWZpbmUgSVdMNTBfUlhfUkVTX1BIWV9DTlQgOApAQCAtMTM0NSw3ICsxMzgyLDcgQEAKIAogc3RydWN0IGl3bDUwMDBfbm9uX2NmZ19waHkgewogCV9fbGUzMiBub25fY2ZnX3BoeVtJV0w1MF9SWF9SRVNfUEhZX0NOVF07ICAvKiB1cCB0byA4IHBoeSBlbnRyaWVzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyoKQEAgLTEzNjUsMTIgKzE0MDIsMTIgQEAKIAlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qICovCiAJX19sZTE2IGJ5dGVfY291bnQ7CS8qIGZyYW1lJ3MgYnl0ZS1jb3VudCAqLwogCV9fbGUxNiByZXNlcnZlZDM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2w0OTY1X3J4X21wZHVfcmVzX3N0YXJ0IHsKK3N0cnVjdCBpd2xfcnhfbXBkdV9yZXNfc3RhcnQgewogCV9fbGUxNiBieXRlX2NvdW50OwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDAwLDE4ICsxNDM3LDI3IEBACiAKIC8qIFJFUExZX1RYIFR4IGZsYWdzIGZpZWxkICovCiAKLS8qIDE6IFVzZSBSVFMvQ1RTIHByb3RvY29sIG9yIENUUy10by1zZWxmIGlmIHNwZWMgYWxsb3dzIGl0CisvKgorICogMTogVXNlIFJUUy9DVFMgcHJvdG9jb2wgb3IgQ1RTLXRvLXNlbGYgaWYgc3BlYyBhbGxvd3MgaXQKICAqIGJlZm9yZSB0aGlzIGZyYW1lLiBpZiBDVFMtdG8tc2VsZiByZXF1aXJlZCBjaGVjawotICogUlhPTl9GTEdfU0VMRl9DVFNfRU4gc3RhdHVzLiAqLwotI2RlZmluZSBUWF9DTURfRkxHX1JUU19DVFNfTVNLIGNwdV90b19sZTMyKDEgPDwgMCkKKyAqIFJYT05fRkxHX1NFTEZfQ1RTX0VOIHN0YXR1cy4KKyAqIHVudXNlZCBpbiAzOTQ1LzQ5NjUsIHVzZWQgaW4gNTAwMCBzZXJpZXMgYW5kIGFmdGVyCisgKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19QUk9UX1JFUVVJUkVfTVNLIGNwdV90b19sZTMyKDEgPDwgMCkKIAotLyogMTogVXNlIFJlcXVlc3QtVG8tU2VuZCBwcm90b2NvbCBiZWZvcmUgdGhpcyBmcmFtZS4KLSAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19DVFNfTVNLLiAqLworLyoKKyAqIDE6IFVzZSBSZXF1ZXN0LVRvLVNlbmQgcHJvdG9jb2wgYmVmb3JlIHRoaXMgZnJhbWUuCisgKiBNdXR1YWxseSBleGNsdXNpdmUgdnMuIFRYX0NNRF9GTEdfQ1RTX01TSy4KKyAqIHVzZWQgaW4gMzk0NS80OTY1LCB1bnVzZWQgaW4gNTAwMCBzZXJpZXMgYW5kIGFmdGVyCisgKi8KICNkZWZpbmUgVFhfQ01EX0ZMR19SVFNfTVNLIGNwdV90b19sZTMyKDEgPDwgMSkKIAotLyogMTogVHJhbnNtaXQgQ2xlYXItVG8tU2VuZCB0byBzZWxmIGJlZm9yZSB0aGlzIGZyYW1lLgorLyoKKyAqIDE6IFRyYW5zbWl0IENsZWFyLVRvLVNlbmQgdG8gc2VsZiBiZWZvcmUgdGhpcyBmcmFtZS4KICAqIERyaXZlciBzaG91bGQgc2V0IHRoaXMgZm9yIEFVVEgvREVBVVRIL0FTU09DLVJFUS9SRUFTU09DIG1nbW50IGZyYW1lcy4KLSAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19SVFNfTVNLLiAqLworICogTXV0dWFsbHkgZXhjbHVzaXZlIHZzLiBUWF9DTURfRkxHX1JUU19NU0suCisgKiB1c2VkIGluIDM5NDUvNDk2NSwgdW51c2VkIGluIDUwMDAgc2VyaWVzIGFuZCBhZnRlcgorICovCiAjZGVmaW5lIFRYX0NNRF9GTEdfQ1RTX01TSyBjcHVfdG9fbGUzMigxIDw8IDIpCiAKIC8qIDE6IEV4cGVjdCBBQ0sgZnJvbSByZWNlaXZpbmcgc3RhdGlvbgpAQCAtMTQzMSw4ICsxNDc3LDExIEBACiAgKiBTZXQgd2hlbiBUeGluZyBhIGJsb2NrLWFjayByZXF1ZXN0IGZyYW1lLiAgQWxzbyBzZXQgVFhfQ01EX0ZMR19BQ0tfTVNLLiAqLwogI2RlZmluZSBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSyAgY3B1X3RvX2xlMzIoMSA8PCA2KQogCi0vKiAxOiBGcmFtZSByZXF1aXJlcyBmdWxsIFR4LU9wIHByb3RlY3Rpb24uCi0gKiBTZXQgdGhpcyBpZiBlaXRoZXIgUlRTIG9yIENUUyBUeCBGbGFnIGdldHMgc2V0LiAqLworLyoKKyAqIDE6IEZyYW1lIHJlcXVpcmVzIGZ1bGwgVHgtT3AgcHJvdGVjdGlvbi4KKyAqIFNldCB0aGlzIGlmIGVpdGhlciBSVFMgb3IgQ1RTIFR4IEZsYWcgZ2V0cyBzZXQuCisgKiB1c2VkIGluIDM5NDUvNDk2NSwgdW51c2VkIGluIDUwMDAgc2VyaWVzIGFuZCBhZnRlcgorICovCiAjZGVmaW5lIFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLIGNwdV90b19sZTMyKDEgPDwgNykKIAogLyogVHggYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQ7IHVzZWQgb25seSBmb3IgMzk0NSwgcmVzZXJ2ZWQgKDApIGZvciA0OTY1LgpAQCAtMTU1Nyw3ICsxNjA2LDcgQEAKIAkgKi8KIAl1OCBwYXlsb2FkWzBdOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyIGhkclswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFJFUExZX1RYID0gMHgxYyAocmVzcG9uc2UpCkBAIC0xNTY5LDcgKzE2MTgsNyBAQAogCXU4IHJhdGU7CiAJX19sZTMyIHdpcmVsZXNzX21lZGlhX3RpbWU7CiAJX19sZTMyIHN0YXR1czsJCS8qIFRYIHN0YXR1cyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qCkBAIC0xNTgxLDcgKzE2MzAsNyBAQAogCXU4IHRyeV9jbnQ7CQkvKiBUeCBhdHRlbXB0cyAqLwogCXU4IGJ0X2tpbGxfY250OwkJLyogVHggYXR0ZW1wdHMgYmxvY2tlZCBieSBCbHVldG9vdGggZGV2aWNlICovCiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX3R4X2NtZCB7CiAJLyoKQEAgLTE2NjAsNyArMTcwOSw3IEBACiAJICovCiAJdTggcGF5bG9hZFswXTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZHJbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRYIGNvbW1hbmQgcmVzcG9uc2UgaXMgc2VudCBhZnRlciAqMzk0NSogdHJhbnNtaXNzaW9uIGF0dGVtcHRzLgogICoKQEAgLTE4MjYsNyArMTg3NSw3IEBACiBzdHJ1Y3QgYWdnX3R4X3N0YXR1cyB7CiAJX19sZTE2IHN0YXR1czsKIAlfX2xlMTYgc2VxdWVuY2U7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgewogCXU4IGZyYW1lX2NvdW50OwkJLyogMSBubyBhZ2dyZWdhdGlvbiwgPjEgYWdncmVnYXRpb24gKi8KQEAgLTE4NjMsNyArMTkxMiw3IEBACiAJCV9fbGUzMiBzdGF0dXM7CiAJCXN0cnVjdCBhZ2dfdHhfc3RhdHVzIGFnZ19zdGF0dXNbMF07IC8qIGZvciBlYWNoIGFnZyBmcmFtZSAqLwogCX0gdTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIGRlZmluaXRpb25zIGZvciBpbml0aWFsIHJhdGUgaW5kZXggZmllbGQKQEAgLTE5MjcsNyArMTk3Niw3IEBACiAJICovCiAJc3RydWN0IGFnZ190eF9zdGF0dXMgc3RhdHVzOwkvKiBUWCBzdGF0dXMgKGluIGFnZ3JlZ2F0aW9uIC0KIAkJCQkJICogc3RhdHVzIG9mIDFzdCBmcmFtZSkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIC8qCiAgKiBSRVBMWV9DT01QUkVTU0VEX0JBID0gMHhjNSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKICAqCkBAIC0xOTQ1LDcgKzE5OTQsNyBAQAogCV9fbGU2NCBiaXRtYXA7CiAJX19sZTE2IHNjZF9mbG93OwogCV9fbGUxNiBzY2Rfc3NuOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCA9IDB4OTcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKQEAgLTE5NTgsMTQgKzIwMDcsMTQgQEAKIAl1OCByZXNlcnZlZDsKIAlfX2xlMTYgY2hhbm5lbDsKIAlzdHJ1Y3QgaXdsMzk0NV9wb3dlcl9wZXJfcmF0ZSBwb3dlcltJV0xfTUFYX1JBVEVTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCB7CiAJdTggYmFuZDsJCS8qIDA6IDUgR0h6LCAxOiAyLjQgR0h6ICovCiAJdTggcmVzZXJ2ZWQ7CiAJX19sZTE2IGNoYW5uZWw7CiAJc3RydWN0IGl3bDQ5NjVfdHhfcG93ZXJfZGIgdHhfcG93ZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyoqCkBAIC0xOTg3LDEzICsyMDM2LDEzIEBACiAJX19sZTE2IHJhdGVfbl9mbGFnczsKIAl1OCB0cnlfY250OwogCXU4IG5leHRfcmF0ZV9pbmRleDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2NtZCB7CiAJdTggdGFibGVfaWQ7CiAJdTggcmVzZXJ2ZWRbM107CiAJc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gdGFibGVbSVdMX01BWF9SQVRFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLypSU19ORVdfQVBJOiBvbmx5IFRMQ19SVFMgcmVtYWlucyBhbmQgbW92ZWQgdG8gYml0IDAgKi8KQEAgLTIwNDAsNyArMjA4OSw3IEBACiAJICogVFggRklGT3MgYWJvdmUgMyB1c2Ugc2FtZSB2YWx1ZSAodHlwaWNhbGx5IDApIGFzIFRYIEZJRk8gMy4KIAkgKi8KIAl1OCBzdGFydF9yYXRlX2luZGV4W0xJTktfUVVBTF9BQ19OVU1dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYJKDQwMDApIC8qIDQgbWlsbGlzZWNvbmRzICovCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9NQVgJKDY1NTM1KQpAQCAtMjA4MSw3ICsyMTMwLDcgQEAKIAl1OCBhZ2dfZnJhbWVfY250X2xpbWl0OwogCiAJX19sZTMyIHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCA9IDB4NGUgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKQEAgLTIyODcsNyArMjMzNiw3IEBACiAJCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyosIElXTF9SQVRFXyogKi8KIAl9IHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXTsKIAlfX2xlMzIgcmVzZXJ2ZWQyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogQlQgY29uZmlndXJhdGlvbiBlbmFibGUgZmxhZ3M6CkBAIC0yMzI4LDcgKzIzNzcsNyBAQAogCXU4IHJlc2VydmVkOwogCV9fbGUzMiBraWxsX2Fja19tYXNrOwogCV9fbGUzMiBraWxsX2N0c19tYXNrOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAoNikKQEAgLTIzNTMsNyArMjQwMiw3IEBACiAJdTggY2hhbm5lbDsJCS8qIGNoYW5uZWwgdG8gbWVhc3VyZSAqLwogCXU4IHR5cGU7CQkvKiBzZWUgZW51bSBpd2xfbWVhc3VyZV90eXBlICovCiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EID0gMHg3NCAoY29tbWFuZCkKQEAgLTIzNzIsNyArMjQyMSw3IEBACiAJX19sZTE2IGNoYW5uZWxfY291bnQ7CS8qIG1pbmltdW0gMSwgbWF4aW11bSAxMCAqLwogCV9fbGUxNiByZXNlcnZlZDM7CiAJc3RydWN0IGl3bF9tZWFzdXJlX2NoYW5uZWwgY2hhbm5lbHNbMTBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EID0gMHg3NCAocmVzcG9uc2UpCkBAIC0yMzgzLDcgKzI0MzIsNyBAQAogCV9fbGUxNiBzdGF0dXM7CQkvKiAwIC0gY29tbWFuZCB3aWxsIGJlIGhhbmRsZWQKIAkJCQkgKiAxIC0gY2Fubm90IGhhbmRsZSAoY29uZmxpY3RzIHdpdGggYW5vdGhlcgogCQkJCSAqICAgICBtZWFzdXJlbWVudCkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSBpd2xfbWVhc3VyZW1lbnRfc3RhdGUgewogCUlXTF9NRUFTVVJFTUVOVF9TVEFSVCA9IDAsCkBAIC0yNDA2LDEzICsyNDU1LDEzIEBACiBzdHJ1Y3QgaXdsX21lYXN1cmVtZW50X2hpc3RvZ3JhbSB7CiAJX19sZTMyIG9mZG1bTlVNX0VMRU1FTlRTX0lOX0hJU1RPR1JBTV07CS8qIGluIDAuOHVzZWMgY291bnRzICovCiAJX19sZTMyIGNja1tOVU1fRUxFTUVOVFNfSU5fSElTVE9HUkFNXTsJLyogaW4gMXVzZWMgY291bnRzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIGNsZWFyIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNvdW50ZXJzICovCiBzdHJ1Y3QgaXdsX21lYXN1cmVtZW50X2NjYV9jb3VudGVycyB7CiAJX19sZTMyIG9mZG07CiAJX19sZTMyIGNjazsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSBpd2xfbWVhc3VyZV90eXBlIHsKIAlJV0xfTUVBU1VSRV9CQVNJQyA9ICgxIDw8IDApLApAQCAtMjQ0OCw3ICsyNDk3LDcgQEAKIAlzdHJ1Y3QgaXdsX21lYXN1cmVtZW50X2hpc3RvZ3JhbSBoaXN0b2dyYW07CiAJX19sZTMyIHN0b3BfdGltZTsJLyogbG93ZXIgMzItYml0cyBvZiBUU0YgKi8KIAlfX2xlMzIgc3RhdHVzOwkJLyogc2VlIGl3bF9tZWFzdXJlbWVudF9zdGF0dXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDcpCkBAIC0yNTA0LDcgKzI1NTMsNyBAQAogCV9fbGUzMiByeF9kYXRhX3RpbWVvdXQ7CiAJX19sZTMyIHR4X2RhdGFfdGltZW91dDsKIAlfX2xlMzIgc2xlZXBfaW50ZXJ2YWxbSVdMX1BPV0VSX1ZFQ19TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCB7CiAJX19sZTE2IGZsYWdzOwpAQCAtMjUxNCw3ICsyNTYzLDcgQEAKIAlfX2xlMzIgdHhfZGF0YV90aW1lb3V0OwogCV9fbGUzMiBzbGVlcF9pbnRlcnZhbFtJV0xfUE9XRVJfVkVDX1NJWkVdOwogCV9fbGUzMiBrZWVwX2FsaXZlX2JlYWNvbnM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBQTV9TTEVFUF9OT1RJRklDQVRJT04gPSAweDdBIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKQEAgLTI1MjcsNyArMjU3Niw3IEBACiAJX19sZTMyIHNsZWVwX3RpbWU7CiAJX19sZTMyIHRzZl9sb3c7CiAJX19sZTMyIGJjb25fdGltZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFNsZWVwIHN0YXRlcy4gIDM5NDUgYW5kIDQ5NjUgaWRlbnRpY2FsLiAqLwogZW51bSB7CkBAIC0yNTUyLDE0ICsyNjAxLDE0IEBACiAjZGVmaW5lIENBUkRfU1RBVEVfQ01EX0hBTFQgICAgMHgwMgkvKiBQb3dlciBkb3duIHBlcm1hbmVudGx5ICovCiBzdHJ1Y3QgaXdsX2NhcmRfc3RhdGVfY21kIHsKIAlfX2xlMzIgc3RhdHVzOwkJLyogQ0FSRF9TVEFURV9DTURfKiByZXF1ZXN0IG5ldyBwb3dlciBzdGF0ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogQ0FSRF9TVEFURV9OT1RJRklDQVRJT04gPSAweGExIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKICAqLwogc3RydWN0IGl3bF9jYXJkX3N0YXRlX25vdGlmIHsKIAlfX2xlMzIgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSFdfQ0FSRF9ESVNBQkxFRCAgIDB4MDEKICNkZWZpbmUgU1dfQ0FSRF9ESVNBQkxFRCAgIDB4MDIKQEAgLTI1NzAsMTQgKzI2MTksMTQgQEAKIAlfX2xlMzIgICByZXNlcnZlZDsKIAlfX2xlMzIgICBjcml0aWNhbF90ZW1wZXJhdHVyZV9NOwogCV9fbGUzMiAgIGNyaXRpY2FsX3RlbXBlcmF0dXJlX1I7Ci19ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9ICBfX3BhY2tlZDsKIAogLyogMTAwMCwgYW5kIDZ4MDAgKi8KIHN0cnVjdCBpd2xfY3Rfa2lsbF90aHJvdHRsaW5nX2NvbmZpZyB7CiAJX19sZTMyICAgY3JpdGljYWxfdGVtcGVyYXR1cmVfZXhpdDsKIAlfX2xlMzIgICByZXNlcnZlZDsKIAlfX2xlMzIgICBjcml0aWNhbF90ZW1wZXJhdHVyZV9lbnRlcjsKLX0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gIF9fcGFja2VkOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAoOCkKQEAgLTI2MjIsNyArMjY3MSw3IEBACiAJc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgdHBjOwogCV9fbGUxNiBhY3RpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCA1LTUwICovCiAJX19sZTE2IHBhc3NpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCAyMC01MDAgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogc2V0IG51bWJlciBvZiBkaXJlY3QgcHJvYmVzIHU4IHR5cGUgKi8KICNkZWZpbmUgSVdMMzlfU0NBTl9QUk9CRV9NQVNLKG4pICgoQklUKG4pIHwgKEJJVChuKSAtIEJJVCgxKSkpKQpAQCAtMjY0MSw3ICsyNjkwLDcgQEAKIAl1OCBkc3BfYXR0ZW47CQkvKiBnYWluIGZvciBEU1AgKi8KIAlfX2xlMTYgYWN0aXZlX2R3ZWxsOwkvKiBpbiAxMDI0LXVTZWMgVFUgKHRpbWUgdW5pdHMpLCB0eXAgNS01MCAqLwogCV9fbGUxNiBwYXNzaXZlX2R3ZWxsOwkvKiBpbiAxMDI0LXVTZWMgVFUgKHRpbWUgdW5pdHMpLCB0eXAgMjAtNTAwICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyBfX2xlMzIgdHlwZSAqLwogI2RlZmluZSBJV0xfU0NBTl9QUk9CRV9NQVNLKG4pIAljcHVfdG9fbGUzMigoQklUKG4pIHwgKEJJVChuKSAtIEJJVCgxKSkpKQpAQCAtMjY1OCw3ICsyNzA3LDcgQEAKIAl1OCBpZDsKIAl1OCBsZW47CiAJdTggc3NpZFszMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWF8zOTQ1CQk0CiAjZGVmaW5lIFBST0JFX09QVElPTl9NQVgJCTIwCkBAIC0yNzY0LDcgKzI4MTMsNyBAQAogCSAqIGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgc2Nhbi4KIAkgKi8KIAl1OCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX3NjYW5fY21kIHsKIAlfX2xlMTYgbGVuOwpAQCAtMjgwOCw3ICsyODU3LDcgQEAKIAkgKiBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIHNjYW4uCiAJICovCiAJdTggZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQ2FuIGFib3J0IHdpbGwgbm90aWZ5IGJ5IGNvbXBsZXRlIG5vdGlmaWNhdGlvbiB3aXRoIGFib3J0IHN0YXR1cy4gKi8KICNkZWZpbmUgQ0FOX0FCT1JUX1NUQVRVUwljcHVfdG9fbGUzMigweDEpCkBAIC0yODIwLDcgKzI4NjksNyBAQAogICovCiBzdHJ1Y3QgaXdsX3NjYW5yZXFfbm90aWZpY2F0aW9uIHsKIAlfX2xlMzIgc3RhdHVzOwkJLyogMTogb2theSwgMjogY2Fubm90IGZ1bGZpbGwgcmVxdWVzdCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogU0NBTl9TVEFSVF9OT1RJRklDQVRJT04gPSAweDgyIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKQEAgLTI4MzMsNyArMjg4Miw3IEBACiAJdTggYmFuZDsKIAl1OCByZXNlcnZlZFsyXTsKIAlfX2xlMzIgc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lICBTQ0FOX09XTkVSX1NUQVRVUyAweDE7CiAjZGVmaW5lICBNRUFTVVJFX09XTkVSX1NUQVRVUyAweDI7CkBAIC0yODQ5LDcgKzI4OTgsNyBAQAogCV9fbGUzMiB0c2ZfbG93OwogCV9fbGUzMiB0c2ZfaGlnaDsKIAlfX2xlMzIgc3RhdGlzdGljc1tOVU1CRVJfT0ZfU1RBVElTVElDU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTiA9IDB4ODQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQpAQCAtMjg2MSw3ICsyOTEwLDcgQEAKIAl1OCBsYXN0X2NoYW5uZWw7CiAJX19sZTMyIHRzZl9sb3c7CiAJX19sZTMyIHRzZl9oaWdoOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4NzksMTQgKzI5MjgsMTQgQEAKIAlfX2xlMzIgbG93X3RzZjsKIAlfX2xlMzIgaGlnaF90c2Y7CiAJX19sZTMyIGlic3NfbWdyX3N0YXR1czsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDQ5NjVfYmVhY29uX25vdGlmIHsKIAlzdHJ1Y3QgaXdsNDk2NV90eF9yZXNwIGJlYWNvbl9ub3RpZnlfaGRyOwogCV9fbGUzMiBsb3dfdHNmOwogCV9fbGUzMiBoaWdoX3RzZjsKIAlfX2xlMzIgaWJzc19tZ3Jfc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUkVQTFlfVFhfQkVBQ09OID0gMHg5MSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQpAQCAtMjg5OCw3ICsyOTQ3LDcgQEAKIAl1OCB0aW1fc2l6ZTsKIAl1OCByZXNlcnZlZDE7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgewogCXN0cnVjdCBpd2xfdHhfY21kIHR4OwpAQCAtMjkwNiw3ICsyOTU1LDcgQEAKIAl1OCB0aW1fc2l6ZTsKIAl1OCByZXNlcnZlZDE7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAoMTApCkBAIC0yOTMyLDcgKzI5ODEsNyBAQAogCQlfX2xlMzIgYltTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMU107CiAJCV9fbGUzMiBnW1NVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTXTsKIAl9IGZhaWxlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogc3RhdGlzdGljcyBjb21tYW5kIHJlc3BvbnNlICovCiAKQEAgLTI5NTIsNyArMzAwMSw3IEBACiAJX19sZTMyIHJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuOwogCV9fbGUzMiBzZW50X2Fja19jbnQ7CiAJX19sZTMyIHNlbnRfY3RzX2NudDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDM5X3N0YXRpc3RpY3Nfcnhfbm9uX3BoeSB7CiAJX19sZTMyIGJvZ3VzX2N0czsJLyogQ1RTIHJlY2VpdmVkIHdoZW4gbm90IGV4cGVjdGluZyBDVFMgKi8KQEAgLTI5NjMsMTMgKzMwMTIsMTMgQEAKIAkJCQkgKiBmaWx0ZXJpbmcgcHJvY2VzcyAqLwogCV9fbGUzMiBub25fY2hhbm5lbF9iZWFjb25zOwkvKiBiZWFjb25zIHdpdGggb3VyIGJzcyBpZCBidXQgbm90IG9uCiAJCQkJCSAqIG91ciBzZXJ2aW5nIGNoYW5uZWwgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnggewogCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSBvZmRtOwogCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSBjY2s7CiAJc3RydWN0IGl3bDM5X3N0YXRpc3RpY3Nfcnhfbm9uX3BoeSBnZW5lcmFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc190eCB7CiAJX19sZTMyIHByZWFtYmxlX2NudDsKQEAgLTI5ODEsMjAgKzMwMzAsMjEgQEAKIAlfX2xlMzIgYWNrX3RpbWVvdXQ7CiAJX19sZTMyIGV4cGVjdGVkX2Fja19jbnQ7CiAJX19sZTMyIGFjdHVhbF9hY2tfY250OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgewogCV9fbGUzMiBidXJzdF9jaGVjazsKIAlfX2xlMzIgYnVyc3RfY291bnQ7Ci0JX19sZTMyIHJlc2VydmVkWzRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJX19sZTMyIHdhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQ7CisJX19sZTMyIHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZGl2IHsKIAlfX2xlMzIgdHhfb25fYTsKIAlfX2xlMzIgdHhfb25fYjsKIAlfX2xlMzIgZXhlY190aW1lOwogCV9fbGUzMiBwcm9iZV90aW1lOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19nZW5lcmFsIHsKIAlfX2xlMzIgdGVtcGVyYXR1cmU7CkBAIC0zMDA0LDcgKzMwNTQsNyBAQAogCV9fbGUzMiBzbG90c19pZGxlOwogCV9fbGUzMiB0dGxfdGltZXN0YW1wOwogCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2RpdiBkaXY7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSB7CiAJX19sZTMyIGluYV9jbnQ7CkBAIC0zMDI3LDcgKzMwNzcsNyBAQAogCV9fbGUzMiBtaF9mb3JtYXRfZXJyOwogCV9fbGUzMiByZV9hY3FfbWFpbl9yc3NpX3N1bTsKIAlfX2xlMzIgcmVzZXJ2ZWQzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc3RhdGlzdGljc19yeF9odF9waHkgewogCV9fbGUzMiBwbGNwX2VycjsKQEAgLTMwNDAsNyArMzA5MCw3IEBACiAJX19sZTMyIGFnZ19tcGR1X2NudDsKIAlfX2xlMzIgYWdnX2NudDsKIAlfX2xlMzIgdW5zdXBwb3J0X21jczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJTlRFUkZFUkVOQ0VfREFUQV9BVkFJTEFCTEUgICAgICBjcHVfdG9fbGUzMigxKQogCkBAIC0zMDc1LDE0ICszMTI1LDI4IEBACiAJX19sZTMyIGJlYWNvbl9lbmVyZ3lfYTsKIAlfX2xlMzIgYmVhY29uX2VuZXJneV9iOwogCV9fbGUzMiBiZWFjb25fZW5lcmd5X2M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHlfYnQgeworCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgY29tbW9uOworCS8qIGFkZGl0aW9uYWwgc3RhdHMgZm9yIGJ0ICovCisJX19sZTMyIG51bV9idF9raWxsczsKKwlfX2xlMzIgcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc3RhdGlzdGljc19yeCB7CiAJc3RydWN0IHN0YXRpc3RpY3NfcnhfcGh5IG9mZG07CiAJc3RydWN0IHN0YXRpc3RpY3NfcnhfcGh5IGNjazsKIAlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5IGdlbmVyYWw7CiAJc3RydWN0IHN0YXRpc3RpY3NfcnhfaHRfcGh5IG9mZG1faHQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0aXN0aWNzX3J4X2J0IHsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgb2ZkbTsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgY2NrOworCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHlfYnQgZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9odF9waHkgb2ZkbV9odDsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogc3RydWN0IHN0YXRpc3RpY3NfdHhfcG93ZXIgLSBjdXJyZW50IHR4IHBvd2VyCkBAIC0zMDk2LDcgKzMxNjAsNyBAQAogCXU4IGFudF9iOwogCXU4IGFudF9jOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc3RhdGlzdGljc190eF9ub25fcGh5X2FnZyB7CiAJX19sZTMyIGJhX3RpbWVvdXQ7CkBAIC0zMTA5LDcgKzMxNzMsNyBAQAogCV9fbGUzMiB1bmRlcnJ1bjsKIAlfX2xlMzIgYnRfcHJpb19raWxsOwogCV9fbGUzMiByeF9iYV9yc3BfY250OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc3RhdGlzdGljc190eCB7CiAJX19sZTMyIHByZWFtYmxlX2NudDsKQEAgLTMxMzQsNyArMzE5OCw3IEBACiAJICovCiAJc3RydWN0IHN0YXRpc3RpY3NfdHhfcG93ZXIgdHhfcG93ZXI7CiAJX19sZTMyIHJlc2VydmVkMTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBzdHJ1Y3Qgc3RhdGlzdGljc19kaXYgewpAQCAtMzE0NCw5ICszMjA4LDkgQEAKIAlfX2xlMzIgcHJvYmVfdGltZTsKIAlfX2xlMzIgcmVzZXJ2ZWQxOwogCV9fbGUzMiByZXNlcnZlZDI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWwgeworc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gewogCV9fbGUzMiB0ZW1wZXJhdHVyZTsgICAvKiByYWRpbyB0ZW1wZXJhdHVyZSAqLwogCV9fbGUzMiB0ZW1wZXJhdHVyZV9tOyAvKiBmb3IgNTAwMCBhbmQgdXAsIHRoaXMgaXMgcmFkaW8gdm9sdGFnZSAqLwogCXN0cnVjdCBzdGF0aXN0aWNzX2RiZyBkYmc7CkBAIC0zMTYyLDkgKzMyMjYsMzMgQEAKIAkgKiAgaW4gb3JkZXIgdG8gZ2V0IG91dCBvZiBiYWQgUEhZIHN0YXR1cwogCSAqLwogCV9fbGUzMiBudW1fb2Zfc29zX3N0YXRlczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0aXN0aWNzX2J0X2FjdGl2aXR5IHsKKwkvKiBUeCBzdGF0aXN0aWNzICovCisJX19sZTMyIGhpX3ByaW9yaXR5X3R4X3JlcV9jbnQ7CisJX19sZTMyIGhpX3ByaW9yaXR5X3R4X2RlbmllZF9jbnQ7CisJX19sZTMyIGxvX3ByaW9yaXR5X3R4X3JlcV9jbnQ7CisJX19sZTMyIGxvX3ByaW9yaXR5X3R4X2RlbmllZF9jbnQ7CisJLyogUnggc3RhdGlzdGljcyAqLworCV9fbGUzMiBoaV9wcmlvcml0eV9yeF9yZXFfY250OworCV9fbGUzMiBoaV9wcmlvcml0eV9yeF9kZW5pZWRfY250OworCV9fbGUzMiBsb19wcmlvcml0eV9yeF9yZXFfY250OworCV9fbGUzMiBsb19wcmlvcml0eV9yeF9kZW5pZWRfY250OworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbCB7CisJc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gY29tbW9uOwogCV9fbGUzMiByZXNlcnZlZDI7CiAJX19sZTMyIHJlc2VydmVkMzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9idCB7CisJc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gY29tbW9uOworCXN0cnVjdCBzdGF0aXN0aWNzX2J0X2FjdGl2aXR5IGFjdGl2aXR5OworCV9fbGUzMiByZXNlcnZlZDI7CisJX19sZTMyIHJlc2VydmVkMzsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0sJCSgweDEgPDwgMCkKICNkZWZpbmUgVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLCQkoMHgxIDw8IDEpCkBAIC0zMTg5LDcgKzMyNzcsNyBAQAogI2RlZmluZSBJV0xfU1RBVFNfQ09ORl9ESVNBQkxFX05PVElGIGNwdV90b19sZTMyKDB4MikvKiBzZWUgYWJvdmUgKi8KIHN0cnVjdCBpd2xfc3RhdGlzdGljc19jbWQgewogCV9fbGUzMiBjb25maWd1cmF0aW9uX2ZsYWdzOwkvKiBJV0xfU1RBVFNfQ09ORl8qICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBTVEFUSVNUSUNTX05PVElGSUNBVElPTiA9IDB4OWQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQpAQCAtMzIxNCwxNSArMzMwMiwyMSBAQAogCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4IHJ4OwogCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3R4IHR4OwogCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgZ2VuZXJhbDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIHsKIAlfX2xlMzIgZmxhZzsKIAlzdHJ1Y3Qgc3RhdGlzdGljc19yeCByeDsKIAlzdHJ1Y3Qgc3RhdGlzdGljc190eCB0eDsKIAlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsIGdlbmVyYWw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKK3N0cnVjdCBpd2xfYnRfbm90aWZfc3RhdGlzdGljcyB7CisJX19sZTMyIGZsYWc7CisJc3RydWN0IHN0YXRpc3RpY3NfcnhfYnQgcng7CisJc3RydWN0IHN0YXRpc3RpY3NfdHggdHg7CisJc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9idCBnZW5lcmFsOworfSBfX3BhY2tlZDsKIAogLyoKICAqIE1JU1NFRF9CRUFDT05TX05PVElGSUNBVElPTiA9IDB4YTIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQpAQCAtMzI1Myw3ICszMzQ3LDcgQEAKIAlfX2xlMzIgdG90YWxfbWlzc2VkX2JlY29uczsKIAlfX2xlMzIgbnVtX2V4cGVjdGVkX2JlYWNvbnM7CiAJX19sZTMyIG51bV9yZWN2ZF9iZWFjb25zOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0NDEsNiArMzUzNSw0MSBAQAogI2RlZmluZSBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYICAgICAgICAgICg5KQogI2RlZmluZSBIRF9PRkRNX0VORVJHWV9USF9JTl9JTkRFWCAgICAgICAgICAgICAgICAgICgxMCkKIAorLyoKKyAqIEFkZGl0aW9uYWwgdGFibGUgZW50cmllcyBpbiBlbmhhbmNlIFNFTlNJVElWSVRZX0NNRAorICovCisjZGVmaW5lIEhEX0lOQV9OT05fU1FVQVJFX0RFVF9PRkRNX0lOREVYCQkoMTEpCisjZGVmaW5lIEhEX0lOQV9OT05fU1FVQVJFX0RFVF9DQ0tfSU5ERVgJCQkoMTIpCisjZGVmaW5lIEhEX0NPUlJfMTFfSU5TVEVBRF9PRl9DT1JSXzlfRU5fSU5ERVgJCSgxMykKKyNkZWZpbmUgSERfT0ZETV9OT05fU1FVQVJFX0RFVF9TTE9QRV9NUkNfSU5ERVgJCSgxNCkKKyNkZWZpbmUgSERfT0ZETV9OT05fU1FVQVJFX0RFVF9JTlRFUkNFUFRfTVJDX0lOREVYCSgxNSkKKyNkZWZpbmUgSERfT0ZETV9OT05fU1FVQVJFX0RFVF9TTE9QRV9JTkRFWAkJKDE2KQorI2RlZmluZSBIRF9PRkRNX05PTl9TUVVBUkVfREVUX0lOVEVSQ0VQVF9JTkRFWAkJKDE3KQorI2RlZmluZSBIRF9DQ0tfTk9OX1NRVUFSRV9ERVRfU0xPUEVfTVJDX0lOREVYCQkoMTgpCisjZGVmaW5lIEhEX0NDS19OT05fU1FVQVJFX0RFVF9JTlRFUkNFUFRfTVJDX0lOREVYCSgxOSkKKyNkZWZpbmUgSERfQ0NLX05PTl9TUVVBUkVfREVUX1NMT1BFX0lOREVYCQkoMjApCisjZGVmaW5lIEhEX0NDS19OT05fU1FVQVJFX0RFVF9JTlRFUkNFUFRfSU5ERVgJCSgyMSkKKyNkZWZpbmUgSERfUkVTRVJWRUQJCQkJCSgyMikKKworLyogbnVtYmVyIG9mIGVudHJpZXMgZm9yIGVuaGFuY2VkIHRibCAqLworI2RlZmluZSBFTkhBTkNFX0hEX1RBQkxFX1NJWkUgICgyMykKKworLyogbnVtYmVyIG9mIGFkZGl0aW9uYWwgZW50cmllcyBmb3IgZW5oYW5jZWQgdGJsICovCisjZGVmaW5lIEVOSEFOQ0VfSERfVEFCTEVfRU5UUklFUyAgKEVOSEFOQ0VfSERfVEFCTEVfU0laRSAtIEhEX1RBQkxFX1NJWkUpCisKKyNkZWZpbmUgSERfSU5BX05PTl9TUVVBUkVfREVUX09GRE1fREFUQQkJCWNwdV90b19sZTE2KDApCisjZGVmaW5lIEhEX0lOQV9OT05fU1FVQVJFX0RFVF9DQ0tfREFUQQkJCWNwdV90b19sZTE2KDApCisjZGVmaW5lIEhEX0NPUlJfMTFfSU5TVEVBRF9PRl9DT1JSXzlfRU5fREFUQQkJY3B1X3RvX2xlMTYoMCkKKyNkZWZpbmUgSERfT0ZETV9OT05fU1FVQVJFX0RFVF9TTE9QRV9NUkNfREFUQQkJY3B1X3RvX2xlMTYoNjY4KQorI2RlZmluZSBIRF9PRkRNX05PTl9TUVVBUkVfREVUX0lOVEVSQ0VQVF9NUkNfREFUQQljcHVfdG9fbGUxNig0KQorI2RlZmluZSBIRF9PRkRNX05PTl9TUVVBUkVfREVUX1NMT1BFX0RBVEEJCWNwdV90b19sZTE2KDQ4NikKKyNkZWZpbmUgSERfT0ZETV9OT05fU1FVQVJFX0RFVF9JTlRFUkNFUFRfREFUQQkJY3B1X3RvX2xlMTYoMzcpCisjZGVmaW5lIEhEX0NDS19OT05fU1FVQVJFX0RFVF9TTE9QRV9NUkNfREFUQQkJY3B1X3RvX2xlMTYoODUzKQorI2RlZmluZSBIRF9DQ0tfTk9OX1NRVUFSRV9ERVRfSU5URVJDRVBUX01SQ19EQVRBCWNwdV90b19sZTE2KDQpCisjZGVmaW5lIEhEX0NDS19OT05fU1FVQVJFX0RFVF9TTE9QRV9EQVRBCQljcHVfdG9fbGUxNig0NzYpCisjZGVmaW5lIEhEX0NDS19OT05fU1FVQVJFX0RFVF9JTlRFUkNFUFRfREFUQQkJY3B1X3RvX2xlMTYoOTkpCisKKwogLyogQ29udHJvbCBmaWVsZCBpbiBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCAqLwogI2RlZmluZSBTRU5TSVRJVklUWV9DTURfQ09OVFJPTF9ERUZBVUxUX1RBQkxFCWNwdV90b19sZTE2KDApCiAjZGVmaW5lIFNFTlNJVElWSVRZX0NNRF9DT05UUk9MX1dPUktfVEFCTEUJY3B1X3RvX2xlMTYoMSkKQEAgLTM0NTUsNyArMzU4NCwxNSBAQAogc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQgewogCV9fbGUxNiBjb250cm9sOwkJCS8qIGFsd2F5cyB1c2UgIjEiICovCiAJX19sZTE2IHRhYmxlW0hEX1RBQkxFX1NJWkVdOwkvKiB1c2UgSERfKiBhcyBpbmRleCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOworCisvKgorICoKKyAqLworc3RydWN0IGl3bF9lbmhhbmNlX3NlbnNpdGl2aXR5X2NtZCB7CisJX19sZTE2IGNvbnRyb2w7CQkJLyogYWx3YXlzIHVzZSAiMSIgKi8KKwlfX2xlMTYgZW5oYW5jZV90YWJsZVtFTkhBTkNFX0hEX1RBQkxFX1NJWkVdOwkvKiB1c2UgSERfKiBhcyBpbmRleCAqLworfSBfX3BhY2tlZDsKIAogCiAvKioKQEAgLTM1MjMsMTAgKzM2NjAsMTAgQEAKIAlJV0xfUEhZX0NBTElCUkFURV9DUllTVEFMX0ZSUV9DTUQJPSAxNSwKIAlJV0xfUEhZX0NBTElCUkFURV9CQVNFX0JBTkRfQ01ECQk9IDE2LAogCUlXTF9QSFlfQ0FMSUJSQVRFX1RYX0lRX1BFUkRfQ01ECT0gMTcsCi0JSVdMX1BIWV9DQUxJQlJBVEVfQ0hBSU5fTk9JU0VfUkVTRVRfQ01ECT0gMTgsCi0JSVdMX1BIWV9DQUxJQlJBVEVfQ0hBSU5fTk9JU0VfR0FJTl9DTUQJPSAxOSwKKwlJV0xfTUFYX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJPSAxOCwKIH07CiAKKyNkZWZpbmUgSVdMX01BWF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCQkoMjUzKQogCiAjZGVmaW5lIElXTF9DQUxJQl9JTklUX0NGR19BTEwJY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikKIApAQCAtMzUzNiwzMSArMzY3MywzMSBAQAogCV9fbGUzMiBzZW5kX3JlczsKIAlfX2xlMzIgYXBwbHlfcmVzOwogCV9fbGUzMiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bF9jYWxpYl9jZmdfc3RhdHVzX3MgewogCXN0cnVjdCBpd2xfY2FsaWJfY2ZnX2VsbW50X3Mgb25jZTsKIAlzdHJ1Y3QgaXdsX2NhbGliX2NmZ19lbG1udF9zIHBlcmQ7CiAJX19sZTMyIGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX2NhbGliX2NmZ19jbWQgewogCXN0cnVjdCBpd2xfY2FsaWJfY2ZnX3N0YXR1c19zIHVjZF9jYWxpYl9jZmc7CiAJc3RydWN0IGl3bF9jYWxpYl9jZmdfc3RhdHVzX3MgZHJ2X2NhbGliX2NmZzsKIAlfX2xlMzIgcmVzZXJ2ZWQxOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX2NhbGliX2hkciB7CiAJdTggb3BfY29kZTsKIAl1OCBmaXJzdF9ncm91cDsKIAl1OCBncm91cHNfbnVtOwogCXU4IGRhdGFfdmFsaWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd2xfY2FsaWJfY21kIHsKIAlzdHJ1Y3QgaXdsX2NhbGliX2hkciBoZHI7CiAJdTggZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRCAoNykgKi8KIHN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCB7CkBAIC0zNTY5LDE0ICszNzA2LDE0IEBACiAJczggZGlmZl9nYWluX2I7CiAJczggZGlmZl9nYWluX2M7CiAJdTggcmVzZXJ2ZWQxOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX2NhbGliX3h0YWxfZnJlcV9jbWQgewogCXN0cnVjdCBpd2xfY2FsaWJfaGRyIGhkcjsKIAl1OCBjYXBfcGluMTsKIAl1OCBjYXBfcGluMjsKIAl1OCBwYWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIElXTF9QSFlfQ0FMSUJSQVRFX0NIQUlOX05PSVNFX1JFU0VUX0NNRCAqLwogc3RydWN0IGl3bF9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQgewpAQCAtMzU5MCw3ICszNzI3LDcgQEAKIAl1OCBkZWx0YV9nYWluXzE7CiAJdTggZGVsdGFfZ2Fpbl8yOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDEyKQpAQCAtMzYxMyw3ICszNzUwLDcgQEAKIAl1OCBvbjsJCQkvKiAjIGludGVydmFscyBvbiB3aGlsZSBibGlua2luZzsKIAkJCQkgKiAiMCIsIHJlZ2FyZGxlc3Mgb2YgIm9mZiIsIHR1cm5zIExFRCBvZmYgKi8KIAl1OCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIHN0YXRpb24gcHJpb3JpdHkgdGFibGUgZW50cmllcwpAQCAtMzc0OSw3ICszODg2LDcgQEAKIAl1OCB3aW5fbWVkaXVtX3ByaW87CiAJdTggcmVzZXJ2ZWQ7CiAJdTggZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIENPRVggZmxhZyBtYXNrcyAqLwogCkBAIC0zNzY2LDcgKzM5MDMsNyBAQAogCXU4IGZsYWdzOwogCXU4IHJlc2VydmVkWzNdOwogCXN0cnVjdCBpd2xfd2ltYXhfY29leF9ldmVudF9lbnRyeSBzdGFfcHJpb1tDT0VYX05VTV9PRl9FVkVOVFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogQ29leGlzdGVuY2UgTUVESVVNIE5PVElGSUNBVElPTgpAQCAtMzc5NSw3ICszOTMyLDcgQEAKIHN0cnVjdCBpd2xfY29leF9tZWRpdW1fbm90aWZpY2F0aW9uIHsKIAlfX2xlMzIgc3RhdHVzOwogCV9fbGUzMiBldmVudHM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBDb2V4aXN0ZW5jZSBFVkVOVCAgQ29tbWFuZApAQCAtMzgxMCwxMSArMzk0NywxMSBAQAogCXU4IGZsYWdzOwogCXU4IGV2ZW50OwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bF9jb2V4X2V2ZW50X3Jlc3AgewogCV9fbGUzMiBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzg1MSw2ICszOTg4LDcgQEAKIAkJc3RydWN0IGl3bF9zbGVlcF9ub3RpZmljYXRpb24gc2xlZXBfbm90aWY7CiAJCXN0cnVjdCBpd2xfc3BlY3RydW1fcmVzcCBzcGVjdHJ1bTsKIAkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIHN0YXRzOworCQlzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3Mgc3RhdHNfYnQ7CiAJCXN0cnVjdCBpd2xfY29tcHJlc3NlZF9iYV9yZXNwIGNvbXByZXNzZWRfYmE7CiAJCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiBtaXNzZWRfYmVhY29uOwogCQlzdHJ1Y3QgaXdsX2NvZXhfbWVkaXVtX25vdGlmaWNhdGlvbiBjb2V4X21lZGl1bV9ub3RpZjsKQEAgLTM4NTgsNyArMzk5Niw3IEBACiAJCV9fbGUzMiBzdGF0dXM7CiAJCXU4IHJhd1swXTsKIAl9IHU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGludCBpd2xfYWduX2NoZWNrX3J4b25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYwppbmRleCA1YmJjNTI5Li44MDI0ZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCkBAIC0xNDEsMTMgKzE0MSwxNCBAQAogfQogRVhQT1JUX1NZTUJPTChpd2xfaHdyYXRlX3RvX3BsY3BfaWR4KTsKIAotdTggaXdsX3RvZ2dsZV90eF9hbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhbnQpCit1OCBpd2xfdG9nZ2xlX3R4X2FudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGFudCwgdTggdmFsaWQpCiB7CiAJaW50IGk7CiAJdTggaW5kID0gYW50OworCiAJZm9yIChpID0gMDsgaSA8IFJBVEVfQU5UX05VTSAtIDE7IGkrKykgewogCQlpbmQgPSAoaW5kICsgMSkgPCBSQVRFX0FOVF9OVU0gPyAgaW5kICsgMSA6IDA7Ci0JCWlmIChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQklUKGluZCkpCisJCWlmICh2YWxpZCAmIEJJVChpbmQpKQogCQkJcmV0dXJuIGluZDsKIAl9CiAJcmV0dXJuIGFudDsKQEAgLTE2OSw3ICsxNzAsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0KIAkJaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgaXdsX3ByaXYpLCBod19vcHMpOwogCWlmIChodyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbiBub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIsCisJCXByX2VycigiJXM6IENhbiBub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIsCiAJCSAgICAgICBjZmctPm5hbWUpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00NTcsNyArNDU4LDcgQEAKIAkJaWYgKCFzdGFfaHRfaW5mLT5odF9zdXBwb3J0ZWQpCiAJCQlyZXR1cm4gMDsKIAl9Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiAJaWYgKHByaXYtPmRpc2FibGVfaHQ0MCkKIAkJcmV0dXJuIDA7CiAjZW5kaWYKQEAgLTUwNiwxMSArNTA3LDExIEBACiAJfQogCiAJYmVhY29uX2ludCA9IGl3bF9hZGp1c3RfYmVhY29uX2ludGVydmFsKGJlYWNvbl9pbnQsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgKiAxMDI0KTsKKwkJCQlwcml2LT5od19wYXJhbXMubWF4X2JlYWNvbl9pdHJ2bCAqIFRJTUVfVU5JVCk7CiAJcHJpdi0+cnhvbl90aW1pbmcuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYoYmVhY29uX2ludCk7CiAKIAl0c2YgPSBwcml2LT50aW1lc3RhbXA7IC8qIHRzZiBpcyBtb2RpZmVkIGJ5IGRvX2RpdjogY29weSBpdCAqLwotCWludGVydmFsX3RtID0gYmVhY29uX2ludCAqIDEwMjQ7CisJaW50ZXJ2YWxfdG0gPSBiZWFjb25faW50ICogVElNRV9VTklUOwogCXJlbSA9IGRvX2Rpdih0c2YsIGludGVydmFsX3RtKTsKIAlwcml2LT5yeG9uX3RpbWluZy5iZWFjb25faW5pdF92YWwgPSBjcHVfdG9fbGUzMihpbnRlcnZhbF90bSAtIHJlbSk7CiAKQEAgLTkzMiw5ICs5MzMsOSBAQAogfQogRVhQT1JUX1NZTUJPTChpd2xfc2V0X3J4b25fY2hhbm5lbCk7CiAKLXN0YXRpYyB2b2lkIGl3bF9zZXRfZmxhZ3NfZm9yX2JhbmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQordm9pZCBpd2xfc2V0X2ZsYWdzX2Zvcl9iYW5kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKIAlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CiAJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPQpAQCAtOTQzLDE5ICs5NDQsMTcgQEAKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCX0gZWxzZSB7CiAJCS8qIENvcGllZCBmcm9tIGl3bF9wb3N0X2Fzc29jaWF0ZSgpICovCi0JCWlmICh2aWYgJiYgdmlmLT5ic3NfY29uZi5hc3NvY19jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSkKKwkJaWYgKHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCQllbHNlCiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCi0JCWlmICh2aWYgJiYgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOwogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLOwogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX0NDS19NU0s7CiAJfQogfQorRVhQT1JUX1NZTUJPTChpd2xfc2V0X2ZsYWdzX2Zvcl9iYW5kKTsKIAogLyoKICAqIGluaXRpYWxpemUgcnhvbiBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcyBmcm9tIGVlcHJvbQpAQCAtMTAyMSwxNSArMTAyMCwxNyBAQAogCS8qIGNsZWFyIGJvdGggTUlYIGFuZCBQVVJFNDAgbW9kZSBmbGFnICovCiAJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH4oUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVEIHwKIAkJCQkJUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDApOwotCW1lbWNweShwcml2LT5zdGFnaW5nX3J4b24ubm9kZV9hZGRyLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShwcml2LT5zdGFnaW5nX3J4b24ud2xhcF9ic3NpZF9hZGRyLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOworCisJaWYgKHZpZikKKwkJbWVtY3B5KHByaXYtPnN0YWdpbmdfcnhvbi5ub2RlX2FkZHIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOworCiAJcHJpdi0+c3RhZ2luZ19yeG9uLm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyA9IDB4ZmY7CiAJcHJpdi0+c3RhZ2luZ19yeG9uLm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOwogCXByaXYtPnN0YWdpbmdfcnhvbi5vZmRtX2h0X3RyaXBsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOwogfQogRVhQT1JUX1NZTUJPTChpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyk7CiAKLXN0YXRpYyB2b2lkIGl3bF9zZXRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit2b2lkIGl3bF9zZXRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqaHcgPSBOVUxMOwogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZTsKQEAgLTEwNTcsNiArMTA1OCwyMSBAQAogCXByaXYtPnN0YWdpbmdfcnhvbi5vZmRtX2Jhc2ljX3JhdGVzID0KIAkgICAoSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyA+PiBJV0xfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7CiB9CitFWFBPUlRfU1lNQk9MKGl3bF9zZXRfcmF0ZSk7CisKK3ZvaWQgaXdsX2Noc3dpdGNoX2RvbmUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGlzX3N1Y2Nlc3MpCit7CisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKHByaXYtPnZpZiwgaXNfc3VjY2Vzcyk7CisJCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwkJcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaXdsX2Noc3dpdGNoX2RvbmUpOwogCiB2b2lkIGl3bF9yeF9jc2Eoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKIHsKQEAgLTEwNzEsMTEgKzEwODcsMTIgQEAKIAkJCXByaXYtPnN0YWdpbmdfcnhvbi5jaGFubmVsID0gY3NhLT5jaGFubmVsOwogCQkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAogCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCX0gZWxzZQorCQkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7CisJCX0gZWxzZSB7CiAJCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKIAkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCi0JCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOworCQl9CiAJfQogfQogRVhQT1JUX1NZTUJPTChpd2xfcnhfY3NhKTsKQEAgLTE1MDcsMTMwICsxNTI0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXdsX3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KTsKIAotLyoqCi0gKiBpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKLSAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KLSAqLwotc3RhdGljIGludCBpd2xjb3JlX3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIF9fbGUzMiAqaW1hZ2UsIHUzMiBsZW4pCi17Ci0JdTMyIHZhbDsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZXJyY250ID0gMDsKLQl1MzIgaTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEwMCwgaW1hZ2UgKz0gMTAwL3NpemVvZih1MzIpKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKLQkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCWkgKyBJV0w0OV9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JCXZhbCA9IF9pd2xfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQllcnJjbnQrKzsKLQkJCWlmIChlcnJjbnQgPj0gMykKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsY29yZV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgotICovCi1zdGF0aWMgaW50IGl3bF92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwKLQkJCQkgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCXUzMiBzYXZlX2xlbiA9IGxlbjsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZXJyY250OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJICAgSVdMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCi0JZXJyY250ID0gMDsKLQlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKLQkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQl2YWwgPSBfaXdsX3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCi0JCQkJICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAotCQkJCSAgc2F2ZV9sZW4gLSBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZXJyY250Kys7Ci0JCQlpZiAoZXJyY250ID49IDIwKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCFlcnJjbnQpCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSAgICAidWNvZGUgaW1hZ2UgaW4gSU5TVFJVQ1RJT04gbWVtb3J5IGlzIGdvb2RcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2xfdmVyaWZ5X3Vjb2RlIC0gZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGltYWdlIGlzIGluIFNSQU0sCi0gKiAgICBhbmQgdmVyaWZ5IGl0cyBjb250ZW50cwotICovCi1pbnQgaXdsX3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JX19sZTMyICppbWFnZTsKLQl1MzIgbGVuOwotCWludCByZXQ7Ci0KLQkvKiBUcnkgYm9vdHN0cmFwICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JcmV0ID0gaXdsY29yZV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIFRyeSBpbml0aWFsaXplICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfaW5pdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5sZW47Ci0JcmV0ID0gaXdsY29yZV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgcnVudGltZS9wcm90b2NvbCAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2NvZGUudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2NvZGUubGVuOwotCXJldCA9IGl3bGNvcmVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmICghcmV0KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKLQotCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KLQkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgotCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyZXQgPSBpd2xfdmVyaWZ5X2luc3RfZnVsbChwcml2LCBpbWFnZSwgbGVuKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF92ZXJpZnlfdWNvZGUpOwotCi0KIHZvaWQgaXdsX3JmX2tpbGxfY3RfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaXdsX2N0X2tpbGxfY29uZmlnIGNtZDsKQEAgLTE4NTUsNiArMTc0OCwzNyBAQAogCWl3bGNvcmVfY29tbWl0X3J4b24ocHJpdik7CiB9CiAKK3N0YXRpYyBpbnQgaXdsX21hY19iZWFjb25fdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX19sZTY0IHRpbWVzdGFtcDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdikpIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocHJpdi0+aWJzc19iZWFjb24pCisJCWRldl9rZnJlZV9za2IocHJpdi0+aWJzc19iZWFjb24pOworCisJcHJpdi0+aWJzc19iZWFjb24gPSBza2I7CisKKwl0aW1lc3RhbXAgPSAoKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNrYi0+ZGF0YSktPnUuYmVhY29uLnRpbWVzdGFtcDsKKwlwcml2LT50aW1lc3RhbXAgPSBsZTY0X3RvX2NwdSh0aW1lc3RhbXApOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+cG9zdF9hc3NvY2lhdGUocHJpdiwgcHJpdi0+dmlmKTsKKworCXJldHVybiAwOworfQorCiB2b2lkIGl3bF9ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKQEAgLTE4NzAsNiArMTc5NCwxNSBAQAogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9RT1MpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlwcml2LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gYnNzX2NvbmYtPnFvczsKKwkJaXdsX3VwZGF0ZV9xb3MocHJpdik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9CisKIAlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTiAmJiB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJZGV2X2tmcmVlX3NrYihwcml2LT5pYnNzX2JlYWNvbik7CiAJCXByaXYtPmlic3NfYmVhY29uID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7CkBAIC0yMDEyLDM4ICsxOTQ1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXdsX2Jzc19pbmZvX2NoYW5nZWQpOwogCi1pbnQgaXdsX21hY19iZWFjb25fdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTY0IHRpbWVzdGFtcDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocHJpdi0+aWJzc19iZWFjb24pCi0JCWRldl9rZnJlZV9za2IocHJpdi0+aWJzc19iZWFjb24pOwotCi0JcHJpdi0+aWJzc19iZWFjb24gPSBza2I7Ci0KLQl0aW1lc3RhbXAgPSAoKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNrYi0+ZGF0YSktPnUuYmVhY29uLnRpbWVzdGFtcDsKLQlwcml2LT50aW1lc3RhbXAgPSBsZTY0X3RvX2NwdSh0aW1lc3RhbXApOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+cG9zdF9hc3NvY2lhdGUocHJpdiwgcHJpdi0+dmlmKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbWFjX2JlYWNvbl91cGRhdGUpOwotCiBzdGF0aWMgaW50IGl3bF9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CiAJaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgdmlmKTsKQEAgLTIwNTEsOCArMTk1Miw2IEBACiAJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKIAkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYpOwogCi0JbWVtY3B5KHByaXYtPnN0YWdpbmdfcnhvbi5ub2RlX2FkZHIsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0KIAlyZXR1cm4gaXdsY29yZV9jb21taXRfcnhvbihwcml2KTsKIH0KIApAQCAtMjA2MSw3ICsxOTYwLDggQEAKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlpbnQgZXJyID0gMDsKIAotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXI6IHR5cGUgJWRcbiIsIHZpZi0+dHlwZSk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogdHlwZSAlZCwgYWRkciAlcE1cbiIsCisJCQkgICB2aWYtPnR5cGUsIHZpZi0+YWRkcik7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKQEAgLTIwNzksOSArMTk3OSw2IEBACiAJcHJpdi0+dmlmID0gdmlmOwogCXByaXYtPml3X21vZGUgPSB2aWYtPnR5cGU7CiAKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIlNldCAlcE1cbiIsIHZpZi0+YWRkcik7Ci0JbWVtY3B5KHByaXYtPm1hY19hZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKLQogCWVyciA9IGl3bF9zZXRfbW9kZShwcml2LCB2aWYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2VycjsKQEAgLTIxMTUsNiArMjAxMiwxMSBAQAogCX0KIAlpZiAocHJpdi0+dmlmID09IHZpZikgewogCQlwcml2LT52aWYgPSBOVUxMOworCQlpZiAocHJpdi0+c2Nhbl92aWYgPT0gdmlmKSB7CisJCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQocHJpdi0+aHcsIHRydWUpOworCQkJcHJpdi0+c2Nhbl92aWYgPSBOVUxMOworCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKwkJfQogCQltZW1zZXQocHJpdi0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CkBAIC0yMjE1LDIyICsyMTE3LDEwIEBACiAKIAkJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjb25mLT5jaGFubmVsLT5iYW5kLCBwcml2LT52aWYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWlmIChpd2xfaXNfYXNzb2NpYXRlZChwcml2KSAmJgotCQkgICAgKGxlMTZfdG9fY3B1KHByaXYtPmFjdGl2ZV9yeG9uLmNoYW5uZWwpICE9IGNoKSAmJgotCQkgICAgcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKSB7Ci0JCQlpd2xfc2V0X3JhdGUocHJpdik7Ci0JCQkvKgotCQkJICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKLQkJCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCi0JCQkgKi8KLQkJCXJldCA9IHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LAotCQkJCWNoKTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJaXdsX3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdik7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQorCisJCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfYmNhc3Rfc3RhdGlvbikKKwkJCXJldCA9IHByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9iY2FzdF9zdGF0aW9uKHByaXYpOworCiAgc2V0X2NoX291dDoKIAkJLyogVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHJhdGVzIGFuZCByYXRlIG1hc2sgY2FuIGJlIGRpZmZlcmVudAogCQkgKiBmb3IgZWFjaCBiYW5kOyBzaW5jZSB0aGUgYmFuZCBtYXkgaGF2ZSBjaGFuZ2VkLCByZXNldApAQCAtMjI1MiwxNSArMjE0Miw2IEBACiAJCWl3bF9zZXRfdHhfcG93ZXIocHJpdiwgY29uZi0+cG93ZXJfbGV2ZWwsIGZhbHNlKTsKIAl9CiAKLQlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9RT1MpIHsKLQkJYm9vbCBxb3NfYWN0aXZlID0gISEoY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9RT1MpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXByaXYtPnFvc19kYXRhLnFvc19hY3RpdmUgPSBxb3NfYWN0aXZlOwotCQlpd2xfdXBkYXRlX3Fvcyhwcml2KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCX0KLQogCWlmICghaXdsX2lzX3JlYWR5KHByaXYpKSB7CiAJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBub3QgcmVhZHlcbiIpOwogCQlnb3RvIG91dDsKQEAgLTI1ODgsNyArMjQ2OSw3IEBACiBFWFBPUlRfU1lNQk9MKGl3bF91cGRhdGVfc3RhdHMpOwogI2VuZGlmCiAKLWNvbnN0IHN0YXRpYyBjaGFyICpnZXRfY3NyX3N0cmluZyhpbnQgY21kKQorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9jc3Jfc3RyaW5nKGludCBjbWQpCiB7CiAJc3dpdGNoIChjbWQpIHsKIAkJSVdMX0NNRChDU1JfSFdfSUZfQ09ORklHX1JFRyk7CkBAIC0yNjU5LDcgKzI1NDAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChpd2xfZHVtcF9jc3IpOwogCi1jb25zdCBzdGF0aWMgY2hhciAqZ2V0X2ZoX3N0cmluZyhpbnQgY21kKQorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9maF9zdHJpbmcoaW50IGNtZCkKIHsKIAlzd2l0Y2ggKGNtZCkgewogCQlJV0xfQ01EKEZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcpOwpAQCAtMjc0NSw3ICsyNjI2LDcgQEAKIH0KIAogCi1pbnQgaXdsX2ZvcmNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IG1vZGUpCitpbnQgaXdsX2ZvcmNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IG1vZGUsIGJvb2wgZXh0ZXJuYWwpCiB7CiAJc3RydWN0IGl3bF9mb3JjZV9yZXNldCAqZm9yY2VfcmVzZXQ7CiAKQEAgLTI3NTgsMTIgKzI2MzksMTQgQEAKIAl9CiAJZm9yY2VfcmVzZXQgPSAmcHJpdi0+Zm9yY2VfcmVzZXRbbW9kZV07CiAJZm9yY2VfcmVzZXQtPnJlc2V0X3JlcXVlc3RfY291bnQrKzsKLQlpZiAoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyAmJgotCSAgICB0aW1lX2FmdGVyKGZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgKwotCSAgICBmb3JjZV9yZXNldC0+cmVzZXRfZHVyYXRpb24sIGppZmZpZXMpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJmb3JjZSByZXNldCByZWplY3RlZFxuIik7Ci0JCWZvcmNlX3Jlc2V0LT5yZXNldF9yZWplY3RfY291bnQrKzsKLQkJcmV0dXJuIC1FQUdBSU47CisJaWYgKCFleHRlcm5hbCkgeworCQlpZiAoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyAmJgorCQkgICAgdGltZV9hZnRlcihmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzICsKKwkJICAgIGZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbiwgamlmZmllcykpIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJmb3JjZSByZXNldCByZWplY3RlZFxuIik7CisJCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50Kys7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQogCX0KIAlmb3JjZV9yZXNldC0+cmVzZXRfc3VjY2Vzc19jb3VudCsrOwogCWZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgPSBqaWZmaWVzOwpAQCAtMjc3Myw2ICsyNjU2LDE5IEBACiAJCWl3bF9mb3JjZV9yZl9yZXNldChwcml2KTsKIAkJYnJlYWs7CiAJY2FzZSBJV0xfRldfUkVTRVQ6CisJCS8qCisJCSAqIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gZXh0ZXJuYWwoZXg6IGRlYnVnZnMpLAorCQkgKiB0aGVuIGFsd2F5cyBwZXJmb3JtIHRoZSByZXF1ZXN0IGluIHJlZ2FyZGxlc3MgdGhlIG1vZHVsZQorCQkgKiBwYXJhbWV0ZXIgc2V0dGluZworCQkgKiBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGludGVybmFsICh1Q29kZSBlcnJvciBvciBkcml2ZXIKKwkJICogZGV0ZWN0IGZhaWx1cmUpLCB0aGVuIGZ3X3Jlc3RhcnQgbW9kdWxlIHBhcmFtZXRlcgorCQkgKiBuZWVkIHRvIGJlIGNoZWNrIGJlZm9yZSBwZXJmb3JtaW5nIGZpcm13YXJlIHJlbG9hZAorCQkgKi8KKwkJaWYgKCFleHRlcm5hbCAmJiAhcHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KSB7CisJCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ2FuY2VsIGZpcm13YXJlIHJlbG9hZCBiYXNlZCBvbiAiCisJCQkJICAgICAgICJtb2R1bGUgcGFyYW1ldGVyIHNldHRpbmdcbiIpOworCQkJYnJlYWs7CisJCX0KIAkJSVdMX0VSUihwcml2LCAiT24gZGVtYW5kIGZpcm13YXJlIHJlbG9hZFxuIik7CiAJCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGl3bF9kb3duICovCiAJCXNldF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKTsKQEAgLTI4MzEsNyArMjcyNyw3IEBACiAJCQkJCSJxdWV1ZSAlZCBzdHVjayAlZCB0aW1lLiBGdyByZWxvYWQuXG4iLAogCQkJCQlxLT5pZCwgcS0+cmVwZWF0X3NhbWVfcmVhZF9wdHIpOwogCQkJCXEtPnJlcGVhdF9zYW1lX3JlYWRfcHRyID0gMDsKLQkJCQlpd2xfZm9yY2VfcmVzZXQocHJpdiwgSVdMX0ZXX1JFU0VUKTsKKwkJCQlpd2xfZm9yY2VfcmVzZXQocHJpdiwgSVdMX0ZXX1JFU0VULCBmYWxzZSk7CiAJCQl9IGVsc2UgewogCQkJCXEtPnJlcGVhdF9zYW1lX3JlYWRfcHRyKys7CiAJCQkJSVdMX0RFQlVHX1JBRElPKHByaXYsCkBAIC0yODgxLDYgKzI3NzcsNjEgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXdsX2JnX21vbml0b3JfcmVjb3Zlcik7CiAKKworLyoKKyAqIGV4dGVuZGVkIGJlYWNvbiB0aW1lIGZvcm1hdAorICogdGltZSBpbiB1c2VjIHdpbGwgYmUgY2hhbmdlZCBpbnRvIGEgMzItYml0IHZhbHVlIGluIGV4dGVuZGVkOmludGVybmFsIGZvcm1hdAorICogdGhlIGV4dGVuZGVkIHBhcnQgaXMgdGhlIGJlYWNvbiBjb3VudHMKKyAqIHRoZSBpbnRlcm5hbCBwYXJ0IGlzIHRoZSB0aW1lIGluIHVzZWMgd2l0aGluIG9uZSBiZWFjb24gaW50ZXJ2YWwKKyAqLwordTMyIGl3bF91c2Vjc190b19iZWFjb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHVzZWMsIHUzMiBiZWFjb25faW50ZXJ2YWwpCit7CisJdTMyIHF1b3Q7CisJdTMyIHJlbTsKKwl1MzIgaW50ZXJ2YWwgPSBiZWFjb25faW50ZXJ2YWwgKiBUSU1FX1VOSVQ7CisKKwlpZiAoIWludGVydmFsIHx8ICF1c2VjKQorCQlyZXR1cm4gMDsKKworCXF1b3QgPSAodXNlYyAvIGludGVydmFsKSAmCisJCShpd2xfYmVhY29uX3RpbWVfbWFza19oaWdoKHByaXYsCisJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cykgPj4KKwkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKKwlyZW0gPSAodXNlYyAlIGludGVydmFsKSAmIGl3bF9iZWFjb25fdGltZV9tYXNrX2xvdyhwcml2LAorCQkJCSAgIHByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7CisKKwlyZXR1cm4gKHF1b3QgPDwgcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSArIHJlbTsKK30KK0VYUE9SVF9TWU1CT0woaXdsX3VzZWNzX3RvX2JlYWNvbnMpOworCisvKiBiYXNlIGlzIHVzdWFsbHkgd2hhdCB3ZSBnZXQgZnJvbSB1Y29kZSB3aXRoIGVhY2ggcmVjZWl2ZWQgZnJhbWUsCisgKiB0aGUgc2FtZSBhcyBIVyB0aW1lciBjb3VudGVyIGNvdW50aW5nIGRvd24KKyAqLworX19sZTMyIGl3bF9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYmFzZSwKKwkJCSAgIHUzMiBhZGRvbiwgdTMyIGJlYWNvbl9pbnRlcnZhbCkKK3sKKwl1MzIgYmFzZV9sb3cgPSBiYXNlICYgaXdsX2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCisJCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7CisJdTMyIGFkZG9uX2xvdyA9IGFkZG9uICYgaXdsX2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCisJCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7CisJdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOworCXUzMiByZXMgPSAoYmFzZSAmIGl3bF9iZWFjb25fdGltZV9tYXNrX2hpZ2gocHJpdiwKKwkJCQlwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpKSArCisJCQkJKGFkZG9uICYgaXdsX2JlYWNvbl90aW1lX21hc2tfaGlnaChwcml2LAorCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cykpOworCisJaWYgKGJhc2VfbG93ID4gYWRkb25fbG93KQorCQlyZXMgKz0gYmFzZV9sb3cgLSBhZGRvbl9sb3c7CisJZWxzZSBpZiAoYmFzZV9sb3cgPCBhZGRvbl9sb3cpIHsKKwkJcmVzICs9IGludGVydmFsICsgYmFzZV9sb3cgLSBhZGRvbl9sb3c7CisJCXJlcyArPSAoMSA8PCBwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCX0gZWxzZQorCQlyZXMgKz0gKDEgPDwgcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKKworCXJldHVybiBjcHVfdG9fbGUzMihyZXMpOworfQorRVhQT1JUX1NZTUJPTChpd2xfYWRkX2JlYWNvbl90aW1lKTsKKwogI2lmZGVmIENPTkZJR19QTQogCiBpbnQgaXdsX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC0yOTA4LDYgKzI4NTksNyBAQAogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgcmV0OworCWJvb2wgaHdfcmZraWxsID0gZmFsc2U7CiAKIAkvKgogCSAqIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKQEAgLTI5MjIsNiArMjg3NCwxNyBAQAogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKIAorCWlmICghKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCisJCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpKQorCQlod19yZmtpbGwgPSB0cnVlOworCisJaWYgKGh3X3Jma2lsbCkKKwkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7CisJZWxzZQorCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOworCisJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIGh3X3Jma2lsbCk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woaXdsX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDMxNzc1YmQuLmU5ZDIzZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTc5LDYgKzc5LDggQEAKIAkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IChzdWJkZXYpLCBcCiAJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSYoY2ZnKQogCisjZGVmaW5lIFRJTUVfVU5JVAkJMTAyNAorCiAjZGVmaW5lIElXTF9TS1VfRyAgICAgICAweDEKICNkZWZpbmUgSVdMX1NLVV9BICAgICAgIDB4MgogI2RlZmluZSBJV0xfU0tVX04gICAgICAgMHg4CkBAIC0xMjMsNiArMTI1LDggQEAKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwogCXNzaXplX3QgKCpnZW5lcmFsX3N0YXRzX3JlYWQpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCXNzaXplX3QgKCpidF9zdGF0c19yZWFkKShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CiB9OwogCiBzdHJ1Y3QgaXdsX3RlbXBfb3BzIHsKQEAgLTE3Myw3ICsxNzcsOCBAQAogCXZvaWQgKCpkdW1wX25pY19lcnJvcl9sb2cpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAJdm9pZCAoKmR1bXBfY3NyKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCWludCAoKmR1bXBfZmgpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KTsKLQlpbnQgKCpzZXRfY2hhbm5lbF9zd2l0Y2gpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGNoYW5uZWwpOworCWludCAoKnNldF9jaGFubmVsX3N3aXRjaCkoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKIAkvKiBwb3dlciBtYW5hZ2VtZW50ICovCiAJc3RydWN0IGl3bF9hcG1fb3BzIGFwbV9vcHM7CiAKQEAgLTE5Myw2ICsxOTgsNyBAQAogCS8qIHN0YXRpb24gbWFuYWdlbWVudCAqLwogCWludCAoKm1hbmFnZV9pYnNzX3N0YXRpb24pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGFkZCk7CisJaW50ICgqdXBkYXRlX2JjYXN0X3N0YXRpb24pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAJLyogcmVjb3ZlciBmcm9tIHR4IHF1ZXVlIHN0YWxsICovCiAJdm9pZCAoKnJlY292ZXJfZnJvbV90eF9zdGFsbCkodW5zaWduZWQgbG9uZyBkYXRhKTsKIAkvKiBjaGVjayBmb3IgcGxjcCBoZWFsdGggKi8KQEAgLTIwMSw2ICsyMDcsOSBAQAogCS8qIGNoZWNrIGZvciBhY2sgaGVhbHRoICovCiAJYm9vbCAoKmNoZWNrX2Fja19oZWFsdGgpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7CisJaW50ICgqdHhmaWZvX2ZsdXNoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKTsKKwl2b2lkICgqZGV2X3R4Zmlmb19mbHVzaCkoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgZmx1c2hfY29udHJvbCk7CisKIAlzdHJ1Y3QgaXdsX2RlYnVnZnNfb3BzIGRlYnVnZnNfb3BzOwogfTsKIApAQCAtMzI1LDcgKzMzNCwxMCBAQAogCWNvbnN0IGJvb2wgdWNvZGVfdHJhY2luZzsKIAljb25zdCBib29sIHNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcjsKIAljb25zdCBib29sIGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjsKLQl1OCBzY2FuX2FudGVubmFzW0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107CisJdTggc2Nhbl90eF9hbnRlbm5hc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKKwljb25zdCBib29sIG5lZWRfZGNfY2FsaWI7CisJY29uc3QgYm9vbCBidF9zdGF0aXN0aWNzOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzQzLDYgKzM1NSw5IEBACiBpbnQgaXdsX2Z1bGxfcnhvbl9yZXF1aXJlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfc2V0X3J4b25fY2hhaW4oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xfc2V0X3J4b25fY2hhbm5lbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2gpOwordm9pZCBpd2xfc2V0X2ZsYWdzX2Zvcl9iYW5kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiB1OCBpd2xfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwogdm9pZCBpd2xfc2V0X3J4b25faHQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZik7CkBAIC0zNTAsNiArMzY1LDcgQEAKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKnN0YV9odF9pbmYpOwogdm9pZCBpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit2b2lkIGl3bF9zZXRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9zZXRfZGVjcnlwdGVkX2ZsYWcoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKIAkJCSAgIHUzMiBkZWNyeXB0X3JlcywKQEAgLTM2NCw3ICszODAsNiBAQAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCSAgICAgdTMyIGNoYW5nZXMpOwotaW50IGl3bF9tYWNfYmVhY29uX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgaXdsX2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsX21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKQEAgLTQ0NywyMCArNDYyLDExIEBACiBpbnQgaXdsX3J4X3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpOwogdm9pZCBpd2xfdHhfY21kX2NvbXBsZXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwogLyogSGFuZGxlcnMgKi8KLXZvaWQgaXdsX3J4X21pc3NlZF9iZWFjb25fbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKIHZvaWQgaXdsX3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLWJvb2wgaXdsX2dvb2RfcGxjcF9oZWFsdGgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KTsKLWJvb2wgaXdsX2dvb2RfYWNrX2hlYWx0aChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpOwogdm9pZCBpd2xfcmVjb3Zlcl9mcm9tX3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpOwotdm9pZCBpd2xfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bF9yZXBseV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwordm9pZCBpd2xfY2hzd2l0Y2hfZG9uZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfc3VjY2Vzcyk7CiB2b2lkIGl3bF9yeF9jc2Eoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7CiAKIC8qIFRYIGhlbHBlcnMgKi8KQEAgLTQ3NCw4ICs0ODAsNiBAQAogCQkJCSBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIHU4IHJlc2V0LCB1OCBwYWQpOwogaW50IGl3bF9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotdm9pZCBpd2xfZnJlZV90ZmRzX2luX3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBpbnQgc3RhX2lkLCBpbnQgdGlkLCBpbnQgZnJlZWQpOwogdm9pZCBpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwogaW50IGl3bF90eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAogCQkgICAgICBpbnQgc2xvdHNfbnVtLCB1MzIgdHhxX2lkKTsKQEAgLTQ5NSw3ICs0OTksNyBAQAogCiB1OCBpd2xfcmF0ZV9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAotdTggaXdsX3RvZ2dsZV90eF9hbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhbnRfaWR4KTsKK3U4IGl3bF90b2dnbGVfdHhfYW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYW50X2lkeCwgdTggdmFsaWQpOwogCiBzdGF0aWMgaW5saW5lIHUzMiBpd2xfYW50X2lkeF90b19mbGFncyh1OCBhbnRfaWR4KQogewpAQCAtNTI2LDkgKzUzMCw5IEBACiAJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwogdm9pZCBpd2xfYmdfc3RhcnRfaW50ZXJuYWxfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBpd2xfaW50ZXJuYWxfc2hvcnRfaHdfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9mb3JjZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBtb2RlKTsKK2ludCBpd2xfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgbW9kZSwgYm9vbCBleHRlcm5hbCk7CiB1MTYgaXdsX2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKLQkJICAgICAgIGNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgaW50IGxlZnQpOworCQkgICAgICAgY29uc3QgdTggKnRhLCBjb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIGludCBsZWZ0KTsKIHZvaWQgaXdsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHUxNiBpd2xfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKQEAgLTU5NSw2ICs1OTksOSBAQAogfQogCiB2b2lkIGl3bF9iZ19tb25pdG9yX3JlY292ZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3UzMiBpd2xfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKTsKK19fbGUzMiBpd2xfYWRkX2JlYWNvbl90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGJhc2UsCisJCQkgICB1MzIgYWRkb24sIHUzMiBiZWFjb25faW50ZXJ2YWwpOwogCiAjaWZkZWYgQ09ORklHX1BNCiBpbnQgaXdsX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpAQCAtNjkzLDcgKzcwMCw2IEBACiBleHRlcm4gdm9pZCBpd2xfc2VuZF9idF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGV4dGVybiBpbnQgaXdsX3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkgICAgICAgdTggZmxhZ3MsIGJvb2wgY2xlYXIpOwotZXh0ZXJuIGludCBpd2xfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBleHRlcm4gaW50IGl3bF9zZW5kX2xxX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEsIHU4IGZsYWdzLCBib29sIGluaXQpOwogdm9pZCBpd2xfYXBtX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY3NyLmgKaW5kZXggMjU0YzM1YS4uZWNmOThlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY3NyLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY3NyLmgKQEAgLTI5OCw2ICsyOTgsNyBAQAogI2RlZmluZSBDU1JfSFdfUkVWX1RZUEVfMTAwMCAgICAgICAgICAgKDB4MDAwMDA2MCkKICNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzZ4MDAgICAgICAgICAgICgweDAwMDAwNzApCiAjZGVmaW5lIENTUl9IV19SRVZfVFlQRV82eDUwICAgICAgICAgICAoMHgwMDAwMDgwKQorI2RlZmluZSBDU1JfSFdfUkVWX1RZUEVfNng1MGcyICAgICAgICAgKDB4MDAwMDA4NCkKICNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzZ4MDBnMiAgICAgICAgICgweDAwMDAwQjApCiAjZGVmaW5lIENTUl9IV19SRVZfVFlQRV9OT05FICAgICAgICAgICAoMHgwMDAwMEYwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMKaW5kZXggOTY1OWM1ZC4uZTk2YTFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYwpAQCAtMTA2LDI3ICsxMDYsNiBAQAogCS5vcGVuID0gaXdsX2RiZ2ZzX29wZW5fZmlsZV9nZW5lcmljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9OwogCi1pbnQgaXdsX2RiZ2ZzX3N0YXRpc3RpY3NfZmxhZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6KQotewotCWludCBwID0gMDsKLQotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsCi0JCSAgICAgICBsZTMyX3RvX2NwdShwcml2LT5zdGF0aXN0aWNzLmZsYWcpKTsKLQlpZiAobGUzMl90b19jcHUocHJpdi0+c3RhdGlzdGljcy5mbGFnKSAmIFVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKQotCQlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsCi0JCQkgICAgICAgIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAotCQkgICAgICAgKGxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3MuZmxhZykgJgotCQkJVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLKQotCQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKLQkJICAgICAgIChsZTMyX3RvX2NwdShwcml2LT5zdGF0aXN0aWNzLmZsYWcpICYKLQkJCVVDT0RFX1NUQVRJU1RJQ1NfTkFSUk9XX0JBTkRfTVNLKQotCQkJPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQlyZXR1cm4gcDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2RiZ2ZzX3N0YXRpc3RpY3NfZmxhZyk7Ci0KIHN0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc190eF9zdGF0aXN0aWNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewpAQCAtMzMwLDQ1ICszMDksMzUgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBtYXhfc3RhOyBpKyspIHsKIAkJc3RhdGlvbiA9ICZwcml2LT5zdGF0aW9uc1tpXTsKLQkJaWYgKHN0YXRpb24tPnVzZWQpIHsKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJInN0YXRpb24gJWQ6XG5nZW5lcmFsIGRhdGE6XG4iLCBpKzEpOwotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiaWQ6ICV1XG4iLAotCQkJCQlzdGF0aW9uLT5zdGEuc3RhLnN0YV9pZCk7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJtb2RlOiAldVxuIiwKLQkJCQkJc3RhdGlvbi0+c3RhLm1vZGUpOwotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkiZmxhZ3M6IDB4JXhcbiIsCi0JCQkJCXN0YXRpb24tPnN0YS5zdGF0aW9uX2ZsYWdzX21zayk7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ0aWQgZGF0YTpcbiIpOwotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkic2VxX251bVx0XHR0eHFfaWQiKTsKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJIlx0ZnJhbWVfY291bnRcdHdhaXRfZm9yX2JhXHQiKTsKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJInN0YXJ0X2lkeFx0Yml0bWFwMFx0Iik7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCSJiaXRtYXAxXHRyYXRlX25fZmxhZ3MiKTsKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJCWlmICghc3RhdGlvbi0+dXNlZCkKKwkJCWNvbnRpbnVlOworCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICJzdGF0aW9uICVkIC0gYWRkcjogJXBNLCBmbGFnczogJSN4XG4iLAorCQkJCSBpLCBzdGF0aW9uLT5zdGEuc3RhLmFkZHIsCisJCQkJIHN0YXRpb24tPnN0YS5zdGF0aW9uX2ZsYWdzX21zayk7CisJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkiVElEXHRzZXFfbnVtXHR0eHFfaWRcdGZyYW1lc1x0dGZkc1x0Iik7CisJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkic3RhcnRfaWR4XHRiaXRtYXBcdFx0XHRyYXRlX25fZmxhZ3NcbiIpOwogCi0JCQlmb3IgKGogPSAwOyBqIDwgTUFYX1RJRF9DT1VOVDsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfVElEX0NPVU5UOyBqKyspIHsKKwkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkiJWQ6XHQlI3hcdCUjeFx0JXVcdCV1XHQldVx0XHQlIy4xNmxseFx0JSN4IiwKKwkJCQlqLCBzdGF0aW9uLT50aWRbal0uc2VxX251bWJlciwKKwkJCQlzdGF0aW9uLT50aWRbal0uYWdnLnR4cV9pZCwKKwkJCQlzdGF0aW9uLT50aWRbal0uYWdnLmZyYW1lX2NvdW50LAorCQkJCXN0YXRpb24tPnRpZFtqXS50ZmRzX2luX3F1ZXVlLAorCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cuc3RhcnRfaWR4LAorCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cuYml0bWFwLAorCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cucmF0ZV9uX2ZsYWdzKTsKKworCQkJaWYgKHN0YXRpb24tPnRpZFtqXS5hZ2cud2FpdF9mb3JfYmEpCiAJCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkJIlslZF06XHRcdCV1IiwgaiwKLQkJCQkJCXN0YXRpb24tPnRpZFtqXS5zZXFfbnVtYmVyKTsKLQkJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCQkiXHQldVx0XHQldVx0XHQldVx0XHQiLAotCQkJCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy50eHFfaWQsCi0JCQkJCQlzdGF0aW9uLT50aWRbal0uYWdnLmZyYW1lX2NvdW50LAotCQkJCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy53YWl0X2Zvcl9iYSk7Ci0JCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkJIiV1XHQlbGx1XHQldSIsCi0JCQkJCQlzdGF0aW9uLT50aWRbal0uYWdnLnN0YXJ0X2lkeCwKLQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc3RhdGlvbi0+dGlkW2pdLmFnZy5iaXRtYXAsCi0JCQkJCQlzdGF0aW9uLT50aWRbal0uYWdnLnJhdGVfbl9mbGFncyk7Ci0JCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQkJCX0KKwkJCQkJCSAiIC0gd2FpdGZvcmJhIik7CiAJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwogCQl9CisKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKIAl9CiAKIAlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKQEAgLTEwNDksOCArMTAxOCwxMyBAQAogCQkJCQkJcnhxLT53cml0ZSk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZnJlZV9jb3VudDogJXVcbiIsCiAJCQkJCQlyeHEtPmZyZWVfY291bnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNsb3NlZF9yYl9udW06ICV1XG4iLAorCWlmIChyeHEtPnJiX3N0dHMpIHsKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2xvc2VkX3JiX251bTogJXVcbiIsCiAJCQkgbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkYpOworCX0gZWxzZSB7CisJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkJImNsb3NlZF9yYl9udW06IE5vdCBBbGxvY2F0ZWRcbiIpOworCX0KIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CiB9CiAKQEAgLTEyOTMsNyArMTI2Nyw3IEBACiAJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKIAotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCBwb3MgPSAwOwogCWNoYXIgYnVmWzEyOF07CiAJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CkBAIC0xMzQzLDcgKzEzMTcsNyBAQAogCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKIAotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCBsZW4gPSAwOwogCWNoYXIgYnVmWzIwXTsKIApAQCAtMTM1NSw3ICsxMzI5LDcgQEAKIAkJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7CiAKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgbGVuID0gMDsKIAljaGFyIGJ1ZlsyMF07CiAKQEAgLTEzNjgsNyArMTM0Miw3IEBACiAJCQkJCSBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyICpidWY7CiAJaW50IHBvcyA9IDA7CiAJc3NpemVfdCByZXQgPSAtRUZBVUxUOwpAQCAtMTQzMCw3ICsxNDA0LDcgQEAKIAkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewogCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHBvcyA9IDA7CiAJY2hhciBidWZbMTJdOwogCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOwpAQCAtMTQ1NiwxMCArMTQzMCwxMCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnBsY3ApICE9IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICgocGxjcCA8PSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9NSU4pIHx8CisJaWYgKChwbGNwIDwgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfTUlOKSB8fAogCQkocGxjcCA+IElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX01BWCkpCiAJCXByaXYtPmNmZy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPQotCQkJSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfREVGOworCQkJSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfRElTQUJMRTsKIAllbHNlCiAJCXByaXYtPmNmZy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPSBwbGNwOwogCXJldHVybiBjb3VudDsKQEAgLTE1MTMsNyArMTQ4Nyw3IEBACiAJc3dpdGNoIChyZXNldCkgewogCWNhc2UgSVdMX1JGX1JFU0VUOgogCWNhc2UgSVdMX0ZXX1JFU0VUOgotCQlyZXQgPSBpd2xfZm9yY2VfcmVzZXQocHJpdiwgcmVzZXQpOworCQlyZXQgPSBpd2xfZm9yY2VfcmVzZXQocHJpdiwgcmVzZXQsIHRydWUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1MjEsNiArMTQ5NSw0MCBAQAogCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX3R4Zmlmb19mbHVzaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgeworCisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgZmx1c2g7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZmx1c2gpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGl3bF9pc19yZmtpbGwocHJpdikpCisJCXJldHVybiAtRUZBVUxUOworCisJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZGV2X3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfdWNvZGVfYnRfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLmJ0X3N0YXRzX3JlYWQoZmlsZSwKKwkJCXVzZXJfYnVmLCBjb3VudCwgcHBvcyk7Cit9CisKIERFQlVHRlNfUkVBRF9GSUxFX09QUyhyeF9zdGF0aXN0aWNzKTsKIERFQlVHRlNfUkVBRF9GSUxFX09QUyh0eF9zdGF0aXN0aWNzKTsKIERFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyh0cmFmZmljX2xvZyk7CkBAIC0xNTQyLDYgKzE1NTAsOCBAQAogREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGZvcmNlX3Jlc2V0KTsKIERFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZsYWdzKTsKIERFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZpbHRlcl9mbGFncyk7CitERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKHR4Zmlmb19mbHVzaCk7CitERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfYnRfc3RhdHMpOwogCiAvKgogICogQ3JlYXRlIHRoZSBkZWJ1Z2ZzIGZpbGVzIGFuZCBkaXJlY3RvcmllcwpAQCAtMTYwMCw2ICsxNjEwLDggQEAKIAlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX3J4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfdHhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CiAJREVCVUdGU19BRERfRklMRSh1Y29kZV9nZW5lcmFsX3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5kZXZfdHhmaWZvX2ZsdXNoKQorCQlERUJVR0ZTX0FERF9GSUxFKHR4Zmlmb19mbHVzaCwgZGlyX2RlYnVnLCBTX0lXVVNSKTsKIAogCWlmIChwcml2LT5jZmctPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKIAkJREVCVUdGU19BRERfRklMRShzZW5zaXRpdml0eSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKQEAgLTE2MDcsNiArMTYxOSw4IEBACiAJCURFQlVHRlNfQUREX0ZJTEUoY2hhaW5fbm9pc2UsIGRpcl9kZWJ1ZywgU19JUlVTUik7CiAJaWYgKHByaXYtPmNmZy0+dWNvZGVfdHJhY2luZykKIAkJREVCVUdGU19BRERfRklMRSh1Y29kZV90cmFjaW5nLCBkaXJfZGVidWcsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwlpZiAocHJpdi0+Y2ZnLT5idF9zdGF0aXN0aWNzKQorCQlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX2J0X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUocnhvbl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmlsdGVyX2ZsYWdzLCBkaXJfZGVidWcsIFNfSVdVU1IpOwogCWlmIChwcml2LT5jZmctPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKaW5kZXggZjNmMzQ3My4uZjM1YmNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKQEAgLTQ4LDI1ICs0OCw2IEBACiAjaW5jbHVkZSAiaXdsLXBvd2VyLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi1ycy5oIgogCi0vKiBjb25maWd1cmF0aW9uIGZvciB0aGUgaXdsNDk2NSAqLwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDQ5NjVfYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w1MzAwX2Fnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNTEwMF9hZ25fY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDUzNTBfYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTAwX2Jnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNTEwMF9hYmdfY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDUxNTBfYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTUwX2FiZ19jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAwMGcyYV8yYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwaV8yYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwaV8yYWJnX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDAwaV8yYmdfY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMDBfM2Fnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjA1MF8yYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDUwXzJhYmdfY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEwMDBfYmduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDAwX2JnX2NmZzsKLQogc3RydWN0IGl3bF90eF9xdWV1ZTsKIAogLyogQ1QtS0lMTCBjb25zdGFudHMgKi8KQEAgLTEzMyw4ICsxMTQsOCBAQAogCSAqIHN0cnVjdHVyZSBpcyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2hhcmVkIHF1ZXVlIG1lbW9yeS4gKi8KIAl1MzIgZmxhZ3M7CiAKLQlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCi0JREVDTEFSRV9QQ0lfVU5NQVBfTEVOKGxlbikKKwlERUZJTkVfRE1BX1VOTUFQX0FERFIobWFwcGluZyk7CisJREVGSU5FX0RNQV9VTk1BUF9MRU4obGVuKTsKIH07CiAKIC8qCkBAIC0xNTcsMTEgKzEzOCwxMSBAQAogCQkJCSogc3BhY2UgbW9yZSB0aGFuIHRoaXMgKi8KIAlpbnQgaGlnaF9tYXJrOyAgICAgICAgIC8qIGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUKIAkJCQkqIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE9uZSBmb3IgZWFjaCBURkQgKi8KIHN0cnVjdCBpd2xfdHhfaW5mbyB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYltJV0xfTlVNX09GX1RCUyAtIDFdOworCXN0cnVjdCBza19idWZmICpza2I7CiB9OwogCiAvKioKQEAgLTM0Myw4ICszMjQsOCBAQAogCQlzdHJ1Y3QgaXdsX3R4X2NtZCB0eDsKIAkJc3RydWN0IGl3bDYwMDBfY2hhbm5lbF9zd2l0Y2hfY21kIGNoc3dpdGNoOwogCQl1OCBwYXlsb2FkW0RFRl9DTURfUEFZTE9BRF9TSVpFXTsKLQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBjbWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl9IF9fcGFja2VkIGNtZDsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVEZEX01BWF9QQVlMT0FEX1NJWkUgKHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpKQogCkBAIC0zNjcsNyArMzQ4LDcgQEAKIC8qKgogICogc3RydWN0IGl3bF9yeF9xdWV1ZSAtIFJ4IHF1ZXVlCiAgKiBAYmQ6IGRyaXZlcidzIHBvaW50ZXIgdG8gYnVmZmVyIG9mIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzIChyYmQpCi0gKiBAZG1hX2FkZHI6IGJ1cyBhZGRyZXNzIG9mIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQorICogQGJkX2RtYTogYnVzIGFkZHJlc3Mgb2YgYnVmZmVyIG9mIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzIChyYmQpCiAgKiBAcmVhZDogU2hhcmVkIGluZGV4IHRvIG5ld2VzdCBhdmFpbGFibGUgUnggYnVmZmVyCiAgKiBAd3JpdGU6IFNoYXJlZCBpbmRleCB0byBvbGRlc3Qgd3JpdHRlbiBSeCBwYWNrZXQKICAqIEBmcmVlX2NvdW50OiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGluIHJ4X2ZyZWUKQEAgLTM4MSw3ICszNjIsNyBAQAogICovCiBzdHJ1Y3QgaXdsX3J4X3F1ZXVlIHsKIAlfX2xlMzIgKmJkOwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJZG1hX2FkZHJfdCBiZF9kbWE7CiAJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyIHBvb2xbUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSU107CiAJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpxdWV1ZVtSWF9RVUVVRV9TSVpFXTsKIAl1MzIgcmVhZDsKQEAgLTQzMyw3ICs0MTQsNyBAQAogCiAKIHN0cnVjdCBpd2xfdGlkX2RhdGEgewotCXUxNiBzZXFfbnVtYmVyOworCXUxNiBzZXFfbnVtYmVyOyAvKiBhZ24gb25seSAqLwogCXUxNiB0ZmRzX2luX3F1ZXVlOwogCXN0cnVjdCBpd2xfaHRfYWdnIGFnZzsKIH07CkBAIC01ODMsNiArNTY0LDE0IEBACiAJSVdMX1VDT0RFX1RMVl9JTklUX0RBVEEJCT0gNCwKIAlJV0xfVUNPREVfVExWX0JPT1QJCT0gNSwKIAlJV0xfVUNPREVfVExWX1BST0JFX01BWF9MRU4JPSA2LCAvKiBhIHUzMiB2YWx1ZSAqLworCUlXTF9VQ09ERV9UTFZfUlVOVF9FVlRMT0dfUFRSCT0gOCwKKwlJV0xfVUNPREVfVExWX1JVTlRfRVZUTE9HX1NJWkUJPSA5LAorCUlXTF9VQ09ERV9UTFZfUlVOVF9FUlJMT0dfUFRSCT0gMTAsCisJSVdMX1VDT0RFX1RMVl9JTklUX0VWVExPR19QVFIJPSAxMSwKKwlJV0xfVUNPREVfVExWX0lOSVRfRVZUTE9HX1NJWkUJPSAxMiwKKwlJV0xfVUNPREVfVExWX0lOSVRfRVJSTE9HX1BUUgk9IDEzLAorCUlXTF9VQ09ERV9UTFZfRU5IQU5DRV9TRU5TX1RCTAk9IDE0LAorCUlXTF9VQ09ERV9UTFZfUEhZX0NBTElCUkFUSU9OX1NJWkUgPSAxNSwKIH07CiAKIHN0cnVjdCBpd2xfdWNvZGVfdGx2IHsKQEAgLTU5MCw3ICs1NzksNyBAQAogCV9fbGUxNiBhbHRlcm5hdGl2ZTsJLyogc2VlIGNvbW1lbnQgKi8KIAlfX2xlMzIgbGVuZ3RoOwkJLyogbm90IGluY2x1ZGluZyB0eXBlL2xlbmd0aCBmaWVsZHMgKi8KIAl1OCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElXTF9UTFZfVUNPREVfTUFHSUMJMHgwYTRjNTc0OQogCkBAIC02NzUsNiArNjY0LDcgQEAKICAqIEBzd19jcnlwdG86IDAgZm9yIGh3LCAxIGZvciBzdwogICogQG1heF94eHhfc2l6ZTogZm9yIHVjb2RlIHVzZXMKICAqIEBjdF9raWxsX3RocmVzaG9sZDogdGVtcGVyYXR1cmUgdGhyZXNob2xkCisgKiBAYmVhY29uX3RpbWVfdHNmX2JpdHM6IG51bWJlciBvZiB2YWxpZCB0c2YgYml0cyBmb3IgYmVhY29uIHRpbWUKICAqIEBjYWxpYl9pbml0X2NmZzogc2V0dXAgaW5pdGlhbCBjYWxpYnJhdGlvbnMgZm9yIHRoZSBodwogICogQHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzOiByYW5nZSBvZiBzZW5zaXRpdml0eSB2YWx1ZXMKICAqLwpAQCAtNzAxLDYgKzY5MSw3IEBACiAJdTMyIGN0X2tpbGxfdGhyZXNob2xkOyAvKiB2YWx1ZSBpbiBody1kZXBlbmRlbnQgdW5pdHMgKi8KIAl1MzIgY3Rfa2lsbF9leGl0X3RocmVzaG9sZDsgLyogdmFsdWUgaW4gaHctZGVwZW5kZW50IHVuaXRzICovCiAJCQkJICAgIC8qIGZvciAxMDAwLCA2MDAwIHNlcmllcyBhbmQgdXAgKi8KKwl1MTYgYmVhY29uX3RpbWVfdHNmX2JpdHM7CiAJdTMyIGNhbGliX2luaXRfY2ZnOwogCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpzZW5zOwogfTsKQEAgLTEwNDcsMTEgKzEwMzgsMTIgQEAKICAqIFRoaXMgaXMgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiBwbGNwIGVycm9yIHJhdGUgcGVyIDEwMG1TZWNzLiAgSXQgaXMKICAqIHVzZWQgdG8gc2V0IGFuZCBjaGVjayBmb3IgdGhlIHZhbGlkaXR5IG9mIHBsY3BfZGVsdGEuCiAgKi8KLSNkZWZpbmUgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfTUlOCSgwKQorI2RlZmluZSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9NSU4JKDEpCiAjZGVmaW5lIElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX0RFRgkoNTApCiAjZGVmaW5lIElXTF9NQVhfUExDUF9FUlJfTE9OR19USFJFU0hPTERfREVGCSgxMDApCiAjZGVmaW5lIElXTF9NQVhfUExDUF9FUlJfRVhUX0xPTkdfVEhSRVNIT0xEX0RFRgkoMjAwKQogI2RlZmluZSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9NQVgJKDI1NSkKKyNkZWZpbmUgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfRElTQUJMRQkoMCkKIAogI2RlZmluZSBJV0xfREVMQVlfTkVYVF9GT1JDRV9SRl9SRVNFVCAgKEhaKjMpCiAjZGVmaW5lIElXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRCAoSFoqNSkKQEAgLTEwNzUsNiArMTA2NywyMCBAQAogCXVuc2lnbmVkIGxvbmcgbGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzOwogfTsKIAorLyogZXh0ZW5kIGJlYWNvbiB0aW1lIGZvcm1hdCBiaXQgc2hpZnRpbmcgICovCisvKgorICogZm9yIF8zOTQ1IGRldmljZXMKKyAqIGJpdHMgMzE6MjQgLSBleHRlbmRlZAorICogYml0cyAyMzowICAtIGludGVydmFsCisgKi8KKyNkZWZpbmUgSVdMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TCTI0CisvKgorICogZm9yIF9hZ24gZGV2aWNlcworICogYml0cyAzMToyMiAtIGV4dGVuZGVkCisgKiBiaXRzIDIxOjAgIC0gaW50ZXJ2YWwKKyAqLworI2RlZmluZSBJV0xBR05fRVhUX0JFQUNPTl9USU1FX1BPUwkyMgorCiBzdHJ1Y3QgaXdsX3ByaXYgewogCiAJLyogaWVlZSBkZXZpY2UgdXNlZCBieSBnZW5lcmljIGllZWUgcHJvY2Vzc2luZyBjb2RlICovCkBAIC0xMTA5LDcgKzExMTUsNyBAQAogCS8qIGZvcmNlIHJlc2V0ICovCiAJc3RydWN0IGl3bF9mb3JjZV9yZXNldCBmb3JjZV9yZXNldFtJV0xfTUFYX0ZPUkNFX1JFU0VUXTsKIAotCS8qIHdlIGFsbG9jYXRlIGFycmF5IG9mIGl3bDQ5NjVfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KKwkvKiB3ZSBhbGxvY2F0ZSBhcnJheSBvZiBpd2xfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KIAkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpbmRleCBhcnJheSAqLwogCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaGFubmVsX2luZm87CS8qIGNoYW5uZWwgaW5mbyBhcnJheSAqLwogCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgb2YgY2hhbm5lbHMgKi8KQEAgLTExMjcsNiArMTEzMyw3IEBACiAJdm9pZCAqc2Nhbl9jbWQ7CiAJZW51bSBpZWVlODAyMTFfYmFuZCBzY2FuX2JhbmQ7CiAJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OworCXN0cnVjdCBpZWVlODAyMTFfdmlmICpzY2FuX3ZpZjsKIAlib29sIGlzX2ludGVybmFsX3Nob3J0X3NjYW47CiAJdTggc2Nhbl90eF9hbnRbSUVFRTgwMjExX05VTV9CQU5EU107CiAJdTggbWdtdF90eF9hbnQ7CkBAIC0xMTQ3LDYgKzExNTQsOSBAQAogCXUzMiAgaHdfd2FfcmV2OwogCXU4ICAgcmV2X2lkOwogCisJLyogRUVQUk9NIE1BQyBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgbWFjX2FkZHJlc3MgYWRkcmVzc2VzWzJdOworCiAJLyogdUNvZGUgaW1hZ2VzLCBzYXZlIHRvIHJlbG9hZCBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KIAlpbnQgZndfaW5kZXg7CQkJLyogZmlybXdhcmUgd2UncmUgdHJ5aW5nIHRvIGxvYWQgKi8KIAl1MzIgdWNvZGVfdmVyOwkJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKQEAgLTExNzQsNyArMTE4NCw3IEBACiAJc3RydWN0IGl3bF9zd2l0Y2hfcnhvbiBzd2l0Y2hfcnhvbjsKIAogCS8qIDFzdCByZXNwb25zZXMgZnJvbSBpbml0aWFsaXplIGFuZCBydW50aW1lIHVDb2RlIGltYWdlcy4KLQkgKiA0OTY1J3MgaW5pdGlhbGl6ZSBhbGl2ZSByZXNwb25zZSBjb250YWlucyBzb21lIGNhbGlicmF0aW9uIGRhdGEuICovCisJICogX2FnbidzIGluaXRpYWxpemUgYWxpdmUgcmVzcG9uc2UgY29udGFpbnMgc29tZSBjYWxpYnJhdGlvbiBkYXRhLiAqLwogCXN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmVfaW5pdDsKIAlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgY2FyZF9hbGl2ZTsKIApAQCAtMTE4OCw3ICsxMTk4LDkgQEAKIAl1OCBzdGFydF9jYWxpYjsKIAlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgc2Vuc2l0aXZpdHlfZGF0YTsKIAlzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEgY2hhaW5fbm9pc2VfZGF0YTsKKwlib29sIGVuaGFuY2Vfc2Vuc2l0aXZpdHlfdGFibGU7CiAJX19sZTE2IHNlbnNpdGl2aXR5X3RibFtIRF9UQUJMRV9TSVpFXTsKKwlfX2xlMTYgZW5oYW5jZV9zZW5zaXRpdml0eV90YmxbRU5IQU5DRV9IRF9UQUJMRV9FTlRSSUVTXTsKIAogCXN0cnVjdCBpd2xfaHRfY29uZmlnIGN1cnJlbnRfaHRfY29uZmlnOwogCkBAIC0xMjIwLDE4ICsxMjMyLDEyIEBACiAJc3RydWN0IGl3bF9wb3dlcl9tZ3IgcG93ZXJfZGF0YTsKIAlzdHJ1Y3QgaXdsX3R0X21nbXQgdGhlcm1hbF90aHJvdHRsZTsKIAotCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBzdGF0aXN0aWNzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0Jc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIGFjY3VtX3N0YXRpc3RpY3M7Ci0Jc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIGRlbHRhX3N0YXRpc3RpY3M7Ci0Jc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIG1heF9kZWx0YTsKLSNlbmRpZgotCiAJLyogY29udGV4dCBpbmZvcm1hdGlvbiAqLwogCXU4IGJzc2lkW0VUSF9BTEVOXTsgLyogdXNlZCBvbmx5IG9uIDM5NDUgYnV0IGZpbGxlZCBieSBjb3JlICovCi0JdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogCi0JLypzdGF0aW9uIHRhYmxlIHZhcmlhYmxlcyAqLworCS8qIHN0YXRpb24gdGFibGUgdmFyaWFibGVzICovCisKKwkvKiBOb3RlOiBpZiBsb2NrIGFuZCBzdGFfbG9jayBhcmUgbmVlZGVkLCBsb2NrIG11c3QgYmUgYWNxdWlyZWQgZmlyc3QgKi8KIAlzcGlubG9ja190IHN0YV9sb2NrOwogCWludCBudW1fc3RhdGlvbnM7CiAJc3RydWN0IGl3bF9zdGF0aW9uX2VudHJ5IHN0YXRpb25zW0lXTF9TVEFUSU9OX0NPVU5UXTsKQEAgLTEyNzMsNyArMTI3OSw3IEBACiAJCQlzdHJ1Y3QgZGVsYXllZF93b3JrIHJma2lsbF9wb2xsOwogCiAJCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiAJCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIGFjY3VtX3N0YXRpc3RpY3M7CiAJCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIGRlbHRhX3N0YXRpc3RpY3M7CiAJCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIG1heF9kZWx0YTsKQEAgLTEzMTUsNiArMTMyMSwyOCBAQAogCQkJYm9vbCBsYXN0X3BoeV9yZXNfdmFsaWQ7CiAKIAkJCXN0cnVjdCBjb21wbGV0aW9uIGZpcm13YXJlX2xvYWRpbmdfY29tcGxldGU7CisKKwkJCXUzMiBpbml0X2V2dGxvZ19wdHIsIGluaXRfZXZ0bG9nX3NpemUsIGluaXRfZXJybG9nX3B0cjsKKwkJCXUzMiBpbnN0X2V2dGxvZ19wdHIsIGluc3RfZXZ0bG9nX3NpemUsIGluc3RfZXJybG9nX3B0cjsKKworCQkJLyoKKwkJCSAqIGNoYWluIG5vaXNlIHJlc2V0IGFuZCBnYWluIGNvbW1hbmRzIGFyZSB0aGUKKwkJCSAqIHR3byBleHRyYSBjYWxpYnJhdGlvbiBjb21tYW5kcyBmb2xsb3dzIHRoZSBzdGFuZGFyZAorCQkJICogcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzCisJCQkgKi8KKwkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQ7CisJCQl1OCBwaHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7CisKKwkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBzdGF0aXN0aWNzOworCQkJc3RydWN0IGl3bF9idF9ub3RpZl9zdGF0aXN0aWNzIHN0YXRpc3RpY3NfYnQ7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUworCQkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIGFjY3VtX3N0YXRpc3RpY3M7CisJCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgZGVsdGFfc3RhdGlzdGljczsKKwkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBtYXhfZGVsdGE7CisJCQlzdHJ1Y3QgaXdsX2J0X25vdGlmX3N0YXRpc3RpY3MgYWNjdW1fc3RhdGlzdGljc19idDsKKwkJCXN0cnVjdCBpd2xfYnRfbm90aWZfc3RhdGlzdGljcyBkZWx0YV9zdGF0aXN0aWNzX2J0OworCQkJc3RydWN0IGl3bF9idF9ub3RpZl9zdGF0aXN0aWNzIG1heF9kZWx0YV9idDsKKyNlbmRpZgogCQl9IF9hZ247CiAjZW5kaWYKIAl9OwpAQCAtMTMzNiw2ICsxMzY0LDcgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3RfZW50ZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0IGN0X2V4aXQ7CiAJc3RydWN0IHdvcmtfc3RydWN0IHN0YXJ0X2ludGVybmFsX3NjYW47CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOwogCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OwogCkBAIC0xMzUzLDkgKzEzODIsNyBAQAogCS8qIGRlYnVnZ2luZyBpbmZvICovCiAJdTMyIGRlYnVnX2xldmVsOyAvKiBwZXIgZGV2aWNlIGRlYnVnZ2luZyB3aWxsIG92ZXJyaWRlIGdsb2JhbAogCQkJICAgIGl3bF9kZWJ1Z19sZXZlbCBpZiBzZXQgKi8KLQl1MzIgZnJhbWVjbnRfdG9fdXM7Ci0JYXRvbWljX3QgcmVzdHJpY3RfcmVmY250OwotCWJvb2wgZGlzYWJsZV9odDQwOworI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0RFQlVHICovCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCS8qIGRlYnVnZnMgKi8KIAl1MTYgdHhfdHJhZmZpY19pZHg7CkBAIC0xMzY0LDggKzEzOTEsOCBAQAogCXU4ICpyeF90cmFmZmljOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOwogCXUzMiBkYmdmc19zcmFtX29mZnNldCwgZGJnZnNfc3JhbV9sZW47CisJYm9vbCBkaXNhYmxlX2h0NDA7CiAjZW5kaWYgLyogQ09ORklHX0lXTFdJRklfREVCVUdGUyAqLwotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0RFQlVHICovCiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhwb3dlcl93b3JrOwogCXUzMiBkaXNhYmxlX3NlbnNfY2FsOwpAQCAtMTQxOSw5ICsxNDQ2LDkgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9oZHIgKml3bF90eF9xdWV1ZV9nZXRfaGRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkJCQkgaW50IHR4cV9pZCwgaW50IGlkeCkKIHsKLQlpZiAocHJpdi0+dHhxW3R4cV9pZF0udHhiW2lkeF0uc2tiWzBdKQorCWlmIChwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpCiAJCXJldHVybiAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwcml2LT50eHFbdHhxX2lkXS4KLQkJCQl0eGJbaWR4XS5za2JbMF0tPmRhdGE7CisJCQkJdHhiW2lkeF0uc2tiLT5kYXRhOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jCmluZGV4IGVlMTE0NTIuLmE0NWQwMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jCkBAIC02MjksNiArNjI5LDkgQEAKIAkgICAgY2FsaWJfdmVyIDwgcHJpdi0+Y2ZnLT5lZXByb21fY2FsaWJfdmVyKQogCQlnb3RvIGVycjsKIAorCUlXTF9JTkZPKHByaXYsICJkZXZpY2UgRUVQUk9NIFZFUj0weCV4LCBDQUxJQj0weCV4XG4iLAorCQkgZWVwcm9tX3ZlciwgY2FsaWJfdmVyKTsKKwogCXJldHVybiAwOwogZXJyOgogCUlXTF9FUlIocHJpdiwgIlVuc3VwcG9ydGVkICh0b28gb2xkKSBFRVBST00gVkVSPTB4JXggPCAweCV4IENBTElCPTB4JXggPCAweCV4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uaAppbmRleCA5NWFhMjAyLi5hNDc3MmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uaApAQCAtMTE4LDcgKzExOCw3IEBACiBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIHsKIAl1OCBmbGFnczsJCS8qIEVFUFJPTV9DSEFOTkVMXyogZmxhZ3MgY29waWVkIGZyb20gRUVQUk9NICovCiAJczggbWF4X3Bvd2VyX2F2ZzsJLyogbWF4IHBvd2VyIChkQm0pIG9uIHRoaXMgY2hubCwgbGltaXQgMzEgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBpd2xfZWVwcm9tX2VuaGFuY2VkX3R4cHdyIHN0cnVjdHVyZQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJczggcmVzZXJ2ZWQ7CiAJczggbWltbzJfbWF4OwogCXM4IG1pbW8zX21heDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogMzk0NSBTcGVjaWZpYyAqLwogI2RlZmluZSBFRVBST01fMzk0NV9FRVBST01fVkVSU0lPTgkoMHgyZikKQEAgLTI3Niw2ICsyNzYsMTAgQEAKICNkZWZpbmUgRUVQUk9NXzYwNTBfVFhfUE9XRVJfVkVSU0lPTiAgICAoNCkKICNkZWZpbmUgRUVQUk9NXzYwNTBfRUVQUk9NX1ZFUlNJT04JKDB4NTMyKQogCisvKiA2eDUwZzIgU3BlY2lmaWMgKi8KKyNkZWZpbmUgRUVQUk9NXzYwNTBHMl9UWF9QT1dFUl9WRVJTSU9OICAgICg2KQorI2RlZmluZSBFRVBST01fNjA1MEcyX0VFUFJPTV9WRVJTSU9OCSgweDU1MykKKwogLyogNngwMGcyIFNwZWNpZmljICovCiAjZGVmaW5lIEVFUFJPTV82MDAwRzJfVFhfUE9XRVJfVkVSU0lPTiAgICAoNikKICNkZWZpbmUgRUVQUk9NXzYwMDBHMl9FRVBST01fVkVSU0lPTgkoMHg3MDkpCkBAIC0zMTIsNyArMzE2LDcgQEAKIAl1OCBnYWluX2lkeDsJCS8qIEluZGV4IGludG8gZ2FpbiB0YWJsZSAqLwogCXU4IGFjdHVhbF9wb3c7CQkvKiBNZWFzdXJlZCBSRiBvdXRwdXQgcG93ZXIsIGhhbGYtZEJtICovCiAJczggcGFfZGV0OwkJLyogUG93ZXIgYW1wIGRldGVjdG9yIGxldmVsIChub3QgdXNlZCkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKgpAQCAtMzI4LDcgKzMzMiw3IEBACiAJc3RydWN0IGl3bF9lZXByb21fY2FsaWJfbWVhc3VyZQogCQltZWFzdXJlbWVudHNbRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOU10KIAkJCVtFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIHR4cG93ZXIgc3ViYmFuZCBpbmZvLgpAQCAtMzQ1LDcgKzM0OSw3IEBACiAJdTggY2hfdG87CS8qIGNoYW5uZWwgbnVtYmVyIG9mIGhpZ2hlc3QgY2hhbm5lbCBpbiBzdWJiYW5kICovCiAJc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDE7CiAJc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyoKQEAgLTM3NCw3ICszNzgsNyBAQAogCV9fbGUxNiB2b2x0YWdlOwkJLyogc2lnbmVkICovCiAJc3RydWN0IGl3bF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvCiAJCWJhbmRfaW5mb1tFRVBST01fVFhfUE9XRVJfQkFORFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKICNkZWZpbmUgQUREUkVTU19NU0sgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKQEAgLTM5OCw2ICs0MDIsNyBAQAogI2RlZmluZSBFRVBST01fV09XTEFOX01PREUgICAgICAgICAgICAgICAgICAoMioweDQ3KQkvKiAyICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fUkFESU9fQ09ORklHICAgICAgICAgICAgICAgICAoMioweDQ4KQkvKiAyICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fMzk0NV9NX1ZFUlNJT04gICAgICAgICAgICAgICAoMioweDRBKQkvKiAxICBieXRlcyAqLworI2RlZmluZSBFRVBST01fTlVNX01BQ19BRERSRVNTICAgICAgICAgICAgICAoMioweDRDKQkvKiAyICBieXRlcyAqLwogCiAvKiBUaGUgZm9sbG93aW5nIG1hc2tzIGFyZSB0byBiZSBhcHBsaWVkIG9uIEVFUFJPTV9SQURJT19DT05GSUcgKi8KICNkZWZpbmUgRUVQUk9NX1JGX0NGR19UWVBFX01TSyh4KSAgICh4ICYgMHgzKSAgICAgICAgIC8qIGJpdHMgMC0xICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1maC5oCmluZGV4IDExM2MzNjYuLjU1YjgzNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZmguaApAQCAtMzk4LDEyICszOTgsNyBAQAogICovCiAjZGVmaW5lIEZIX1RTU1JfVFhfRVJST1JfUkVHCQkoRkhfVFNTUl9MT1dFUl9CT1VORCArIDB4MDE4KQogCi0jZGVmaW5lIEZIX1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfQlVGU19FTVBUWShfY2hubCkgKCgxIDw8IChfY2hubCkpIDw8IDI0KQotI2RlZmluZSBGSF9UU1NSX1RYX1NUQVRVU19SRUdfQklUX05PX1BFTkRfUkVRKF9jaG5sKSAoKDEgPDwgKF9jaG5sKSkgPDwgMTYpCi0KLSNkZWZpbmUgRkhfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUoX2NobmwpIFwKLQkoRkhfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9CVUZTX0VNUFRZKF9jaG5sKSB8IFwKLQlGSF9UU1NSX1RYX1NUQVRVU19SRUdfQklUX05PX1BFTkRfUkVRKF9jaG5sKSkKKyNkZWZpbmUgRkhfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUoX2NobmwpICgoMSA8PCAoX2NobmwpKSA8PCAxNikKIAogLyogVHggc2VydmljZSBjaGFubmVscyAqLwogI2RlZmluZSBGSF9TUlZDX0NITkwJCSg5KQpAQCAtNDQ5LDcgKzQ0NCw3IEBACiAJX19sZTE2IGZpbmlzaGVkX3JiX251bTsKIAlfX2xlMTYgZmluaXNoZWRfZnJfbmFtOwogCV9fbGUzMiBfX3VudXNlZDsgLyogMzk0NSBvbmx5ICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogI2RlZmluZSBURkRfUVVFVUVfU0laRV9NQVggICAgICAoMjU2KQpAQCAtNDc1LDcgKzQ3MCw3IEBACiBzdHJ1Y3QgaXdsX3RmZF90YiB7CiAJX19sZTMyIGxvOwogCV9fbGUxNiBoaV9uX2xlbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioKICAqIHN0cnVjdCBpd2xfdGZkCkBAIC01MTAsNyArNTA1LDcgQEAKIAl1OCBudW1fdGJzOwogCXN0cnVjdCBpd2xfdGZkX3RiIHRic1tJV0xfTlVNX09GX1RCU107CiAJX19sZTMyIF9fcGFkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBLZWVwIFdhcm0gU2l6ZSAqLwogI2RlZmluZSBJV0xfS1dfU0laRSAweDEwMDAJLyogNGsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYwppbmRleCA1MWY4OWU3Li4yNThkMDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jCkBAIC00OSw2ICs0OSw3IEBACiAJCUlXTF9DTUQoUkVQTFlfQUREX1NUQSk7CiAJCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX1NUQSk7CiAJCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX0FMTF9TVEEpOworCQlJV0xfQ01EKFJFUExZX1RYRklGT19GTFVTSCk7CiAJCUlXTF9DTUQoUkVQTFlfV0VQS0VZKTsKIAkJSVdMX0NNRChSRVBMWV8zOTQ1X1JYKTsKIAkJSVdMX0NNRChSRVBMWV9UWCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oZWxwZXJzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oZWxwZXJzLmgKaW5kZXggM2ZmNmI5ZC4uNjIxYWJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGVscGVycy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhlbHBlcnMuaApAQCAtOTIsNiArOTIsMTEgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF9hbGxvY19md19kZXNjKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAogCQkJCSAgICBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKIHsKKwlpZiAoIWRlc2MtPmxlbikgeworCQlkZXNjLT52X2FkZHIgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlkZXNjLT52X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBjaV9kZXYtPmRldiwgZGVzYy0+bGVuLAogCQkJCQkgICZkZXNjLT5wX2FkZHIsIEdGUF9LRVJORUwpOwogCXJldHVybiAoZGVzYy0+dl9hZGRyICE9IE5VTEwpID8gMCA6IC1FTk9NRU07CkBAIC0xNzAsNCArMTc1LDI2IEBACiAJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVF9NQVNLLCBwcml2LT5pbnRhX21hc2spOwogfQogCisvKioKKyAqIGl3bF9iZWFjb25fdGltZV9tYXNrX2xvdyAtIG1hc2sgb2YgbG93ZXIgMzIgYml0IG9mIGJlYWNvbiB0aW1lCisgKiBAcHJpdiAtLSBwb2ludGVyIHRvIGl3bF9wcml2IGRhdGEgc3RydWN0dXJlCisgKiBAdHNmX2JpdHMgLS0gbnVtYmVyIG9mIGJpdHMgbmVlZCB0byBzaGlmdCBmb3IgbWFza2luZykKKyAqLworc3RhdGljIGlubGluZSB1MzIgaXdsX2JlYWNvbl90aW1lX21hc2tfbG93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkJICAgdTE2IHRzZl9iaXRzKQoreworCXJldHVybiAoMSA8PCB0c2ZfYml0cykgLSAxOworfQorCisvKioKKyAqIGl3bF9iZWFjb25fdGltZV9tYXNrX2hpZ2ggLSBtYXNrIG9mIGhpZ2hlciAzMiBiaXQgb2YgYmVhY29uIHRpbWUKKyAqIEBwcml2IC0tIHBvaW50ZXIgdG8gaXdsX3ByaXYgZGF0YSBzdHJ1Y3R1cmUKKyAqIEB0c2ZfYml0cyAtLSBudW1iZXIgb2YgYml0cyBuZWVkIHRvIHNoaWZ0IGZvciBtYXNraW5nKQorICovCitzdGF0aWMgaW5saW5lIHUzMiBpd2xfYmVhY29uX3RpbWVfbWFza19oaWdoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkJICAgIHUxNiB0c2ZfYml0cykKK3sKKwlyZXR1cm4gKCgxIDw8ICgzMiAtIHRzZl9iaXRzKSkgLSAxKSA8PCB0c2ZfYml0czsKK30KKwogI2VuZGlmCQkJCS8qIF9faXdsX2hlbHBlcnNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYwppbmRleCAwYTVkN2NmLi43OTc3M2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOwogCiAJLyogQWxsb2MgdGhlIGNpcmN1bGFyIGJ1ZmZlciBvZiBSZWFkIEJ1ZmZlciBEZXNjcmlwdG9ycyAoUkJEcykgKi8KLQlyeHEtPmJkID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgNCAqIFJYX1FVRVVFX1NJWkUsICZyeHEtPmRtYV9hZGRyLAorCXJ4cS0+YmQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgJnJ4cS0+YmRfZG1hLAogCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyeHEtPmJkKQogCQlnb3RvIGVycl9iZDsKQEAgLTE5OSwzMiArMTk5LDEyIEBACiAKIGVycl9yYjoKIAlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKLQkJCSAgcnhxLT5kbWFfYWRkcik7CisJCQkgIHJ4cS0+YmRfZG1hKTsKIGVycl9iZDoKIAlyZXR1cm4gLUVOT01FTTsKIH0KIEVYUE9SVF9TWU1CT0woaXdsX3J4X3F1ZXVlX2FsbG9jKTsKIAotdm9pZCBpd2xfcnhfbWlzc2VkX2JlYWNvbl9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi0KLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX21pc3NlZF9iZWFjb25fbm90aWYgKm1pc3NlZF9iZWFjb247Ci0KLQltaXNzZWRfYmVhY29uID0gJnBrdC0+dS5taXNzZWRfYmVhY29uOwotCWlmIChsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucykgPgotCSAgICBwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1pc3NlZCBiY24gY25zcSAlZCB0b3RsICVkIHJjZCAlZCBleHBjdGQgJWRcbiIsCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucyksCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT50b3RhbF9taXNzZWRfYmVjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9yZWN2ZF9iZWFjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9leHBlY3RlZF9iZWFjb25zKSk7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCWl3bF9pbml0X3NlbnNpdGl2aXR5KHByaXYpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX3J4X21pc3NlZF9iZWFjb25fbm90aWYpOwogCiB2b2lkIGl3bF9yeF9zcGVjdHJ1bV9tZWFzdXJlX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkJICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKQEAgLTI0MywxNjEgKzIyMyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9yeF9zcGVjdHJ1bV9tZWFzdXJlX25vdGlmKTsKIAotCi0KLS8qIENhbGN1bGF0ZSBub2lzZSBsZXZlbCwgYmFzZWQgb24gbWVhc3VyZW1lbnRzIGR1cmluZyBuZXR3b3JrIHNpbGVuY2UganVzdAotICogICBiZWZvcmUgYXJyaXZpbmcgYmVhY29uLiAgVGhpcyBtZWFzdXJlbWVudCBjYW4gYmUgZG9uZSBvbmx5IGlmIHdlIGtub3cKLSAqICAgZXhhY3RseSB3aGVuIHRvIGV4cGVjdCBiZWFjb25zLCB0aGVyZWZvcmUgb25seSB3aGVuIHdlJ3JlIGFzc29jaWF0ZWQuICovCi1zdGF0aWMgdm9pZCBpd2xfcnhfY2FsY19ub2lzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSAqcnhfaW5mbwotCQkJCT0gJihwcml2LT5zdGF0aXN0aWNzLnJ4LmdlbmVyYWwpOwotCWludCBudW1fYWN0aXZlX3J4ID0gMDsKLQlpbnQgdG90YWxfc2lsZW5jZSA9IDA7Ci0JaW50IGJjbl9zaWxlbmNlX2EgPQotCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpICYgSU5fQkFORF9GSUxURVI7Ci0JaW50IGJjbl9zaWxlbmNlX2IgPQotCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7Ci0JaW50IGJjbl9zaWxlbmNlX2MgPQotCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYgSU5fQkFORF9GSUxURVI7Ci0JaW50IGxhc3Rfcnhfbm9pc2U7Ci0KLQlpZiAoYmNuX3NpbGVuY2VfYSkgewotCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2E7Ci0JCW51bV9hY3RpdmVfcngrKzsKLQl9Ci0JaWYgKGJjbl9zaWxlbmNlX2IpIHsKLQkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9iOwotCQludW1fYWN0aXZlX3J4Kys7Ci0JfQotCWlmIChiY25fc2lsZW5jZV9jKSB7Ci0JCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYzsKLQkJbnVtX2FjdGl2ZV9yeCsrOwotCX0KLQotCS8qIEF2ZXJhZ2UgYW1vbmcgYWN0aXZlIGFudGVubmFzICovCi0JaWYgKG51bV9hY3RpdmVfcngpCi0JCWxhc3Rfcnhfbm9pc2UgPSAodG90YWxfc2lsZW5jZSAvIG51bV9hY3RpdmVfcngpIC0gMTA3OwotCWVsc2UKLQkJbGFzdF9yeF9ub2lzZSA9IElXTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEU7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImluYmFuZCBzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIGRCbSAlZFxuIiwKLQkJCWJjbl9zaWxlbmNlX2EsIGJjbl9zaWxlbmNlX2IsIGJjbl9zaWxlbmNlX2MsCi0JCQlsYXN0X3J4X25vaXNlKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0vKgotICogIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIG9mIGFsbCBzdGF0aXN0aWNzIGNvdW50ZXIgYXJlIGluIERXT1JECi0gKiAgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGRlYnVnZ2luZywgZG8gbm90IGRlYWwgd2l0aAotICogIHRoZSBjYXNlIG9mIGNvdW50ZXJzIHJvbGwtb3Zlci4KLSAqLwotc3RhdGljIHZvaWQgaXdsX2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJX19sZTMyICpzdGF0cykKLXsKLQlpbnQgaTsKLQlfX2xlMzIgKnByZXZfc3RhdHM7Ci0JdTMyICphY2N1bV9zdGF0czsKLQl1MzIgKmRlbHRhLCAqbWF4X2RlbHRhOwotCi0JcHJldl9zdGF0cyA9IChfX2xlMzIgKikmcHJpdi0+c3RhdGlzdGljczsKLQlhY2N1bV9zdGF0cyA9ICh1MzIgKikmcHJpdi0+YWNjdW1fc3RhdGlzdGljczsKLQlkZWx0YSA9ICh1MzIgKikmcHJpdi0+ZGVsdGFfc3RhdGlzdGljczsKLQltYXhfZGVsdGEgPSAodTMyICopJnByaXYtPm1heF9kZWx0YTsKLQotCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZW9mKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyk7Ci0JICAgICBpICs9IHNpemVvZihfX2xlMzIpLCBzdGF0cysrLCBwcmV2X3N0YXRzKyssIGRlbHRhKyssCi0JICAgICBtYXhfZGVsdGErKywgYWNjdW1fc3RhdHMrKykgewotCQlpZiAobGUzMl90b19jcHUoKnN0YXRzKSA+IGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSkgewotCQkJKmRlbHRhID0gKGxlMzJfdG9fY3B1KCpzdGF0cykgLQotCQkJCWxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSk7Ci0JCQkqYWNjdW1fc3RhdHMgKz0gKmRlbHRhOwotCQkJaWYgKCpkZWx0YSA+ICptYXhfZGVsdGEpCi0JCQkJKm1heF9kZWx0YSA9ICpkZWx0YTsKLQkJfQotCX0KLQotCS8qIHJlc2V0IGFjY3VtdWxhdGl2ZSBzdGF0aXN0aWNzIGZvciAibm8tY291bnRlciIgdHlwZSBzdGF0aXN0aWNzICovCi0JcHJpdi0+YWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlID0KLQkJcHJpdi0+c3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlOwotCXByaXYtPmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC50ZW1wZXJhdHVyZV9tID0KLQkJcHJpdi0+c3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlX207Ci0JcHJpdi0+YWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLnR0bF90aW1lc3RhbXAgPQotCQlwcml2LT5zdGF0aXN0aWNzLmdlbmVyYWwudHRsX3RpbWVzdGFtcDsKLQlwcml2LT5hY2N1bV9zdGF0aXN0aWNzLnR4LnR4X3Bvd2VyLmFudF9hID0KLQkJcHJpdi0+c3RhdGlzdGljcy50eC50eF9wb3dlci5hbnRfYTsKLQlwcml2LT5hY2N1bV9zdGF0aXN0aWNzLnR4LnR4X3Bvd2VyLmFudF9iID0KLQkJcHJpdi0+c3RhdGlzdGljcy50eC50eF9wb3dlci5hbnRfYjsKLQlwcml2LT5hY2N1bV9zdGF0aXN0aWNzLnR4LnR4X3Bvd2VyLmFudF9jID0KLQkJcHJpdi0+c3RhdGlzdGljcy50eC50eF9wb3dlci5hbnRfYzsKLX0KLSNlbmRpZgotCi0jZGVmaW5lIFJFR19SRUNBTElCX1BFUklPRCAoNjApCi0KLS8qKgotICogaXdsX2dvb2RfcGxjcF9oZWFsdGggLSBjaGVja3MgZm9yIHBsY3AgZXJyb3IuCi0gKgotICogV2hlbiB0aGUgcGxjcCBlcnJvciBpcyBleGNlZWRpbmcgdGhlIHRocmVzaG9sZHMsIHJlc2V0IHRoZSByYWRpbwotICogdG8gaW1wcm92ZSB0aGUgdGhyb3VnaHB1dC4KLSAqLwotYm9vbCBpd2xfZ29vZF9wbGNwX2hlYWx0aChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKLXsKLQlib29sIHJjID0gdHJ1ZTsKLQlpbnQgY29tYmluZWRfcGxjcF9kZWx0YTsKLQl1bnNpZ25lZCBpbnQgcGxjcF9tc2VjOwotCXVuc2lnbmVkIGxvbmcgcGxjcF9yZWNlaXZlZF9qaWZmaWVzOwotCi0JLyoKLQkgKiBjaGVjayBmb3IgcGxjcF9lcnIgYW5kIHRyaWdnZXIgcmFkaW8gcmVzZXQgaWYgaXQgZXhjZWVkcwotCSAqIHRoZSBwbGNwIGVycm9yIHRocmVzaG9sZCBwbGNwX2RlbHRhLgotCSAqLwotCXBsY3BfcmVjZWl2ZWRfamlmZmllcyA9IGppZmZpZXM7Ci0JcGxjcF9tc2VjID0gamlmZmllc190b19tc2VjcygobG9uZykgcGxjcF9yZWNlaXZlZF9qaWZmaWVzIC0KLQkJCQkJKGxvbmcpIHByaXYtPnBsY3BfamlmZmllcyk7Ci0JcHJpdi0+cGxjcF9qaWZmaWVzID0gcGxjcF9yZWNlaXZlZF9qaWZmaWVzOwotCS8qCi0JICogY2hlY2sgdG8gbWFrZSBzdXJlIHBsY3BfbXNlYyBpcyBub3QgMCB0byBwcmV2ZW50IGRpdmlzaW9uCi0JICogYnkgemVyby4KLQkgKi8KLQlpZiAocGxjcF9tc2VjKSB7Ci0JCWNvbWJpbmVkX3BsY3BfZGVsdGEgPQotCQkJKGxlMzJfdG9fY3B1KHBrdC0+dS5zdGF0cy5yeC5vZmRtLnBsY3BfZXJyKSAtCi0JCQlsZTMyX3RvX2NwdShwcml2LT5zdGF0aXN0aWNzLnJ4Lm9mZG0ucGxjcF9lcnIpKSArCi0JCQkobGUzMl90b19jcHUocGt0LT51LnN0YXRzLnJ4Lm9mZG1faHQucGxjcF9lcnIpIC0KLQkJCWxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3Mucngub2ZkbV9odC5wbGNwX2VycikpOwotCi0JCWlmICgoY29tYmluZWRfcGxjcF9kZWx0YSA+IDApICYmCi0JCSAgICAoKGNvbWJpbmVkX3BsY3BfZGVsdGEgKiAxMDApIC8gcGxjcF9tc2VjKSA+Ci0JCQlwcml2LT5jZmctPnBsY3BfZGVsdGFfdGhyZXNob2xkKSB7Ci0JCQkvKgotCQkJICogaWYgcGxjcF9lcnIgZXhjZWVkIHRoZSB0aHJlc2hvbGQsCi0JCQkgKiB0aGUgZm9sbG93aW5nIGRhdGEgaXMgcHJpbnRlZCBpbiBjc3YgZm9ybWF0OgotCQkJICogICAgVGV4dDogcGxjcF9lcnIgZXhjZWVkZWQgJWQsCi0JCQkgKiAgICBSZWNlaXZlZCBvZmRtLnBsY3BfZXJyLAotCQkJICogICAgQ3VycmVudCBvZmRtLnBsY3BfZXJyLAotCQkJICogICAgUmVjZWl2ZWQgb2ZkbV9odC5wbGNwX2VyciwKLQkJCSAqICAgIEN1cnJlbnQgb2ZkbV9odC5wbGNwX2VyciwKLQkJCSAqICAgIGNvbWJpbmVkX3BsY3BfZGVsdGEsCi0JCQkgKiAgICBwbGNwX21zZWMKLQkJCSAqLwotCQkJSVdMX0RFQlVHX1JBRElPKHByaXYsICJwbGNwX2VyciBleGNlZWRlZCAldSwgIgotCQkJCSIldSwgJXUsICV1LCAldSwgJWQsICV1IG1TZWNzXG4iLAotCQkJCXByaXYtPmNmZy0+cGxjcF9kZWx0YV90aHJlc2hvbGQsCi0JCQkJbGUzMl90b19jcHUocGt0LT51LnN0YXRzLnJ4Lm9mZG0ucGxjcF9lcnIpLAotCQkJCWxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3Mucngub2ZkbS5wbGNwX2VyciksCi0JCQkJbGUzMl90b19jcHUocGt0LT51LnN0YXRzLnJ4Lm9mZG1faHQucGxjcF9lcnIpLAotCQkJCWxlMzJfdG9fY3B1KAotCQkJCSAgcHJpdi0+c3RhdGlzdGljcy5yeC5vZmRtX2h0LnBsY3BfZXJyKSwKLQkJCQljb21iaW5lZF9wbGNwX2RlbHRhLCBwbGNwX21zZWMpOwotCQkJcmMgPSBmYWxzZTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9nb29kX3BsY3BfaGVhbHRoKTsKLQogdm9pZCBpd2xfcmVjb3Zlcl9mcm9tX3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpCiB7CkBAIC00MTMsNyArMjM4LDcgQEAKIAkJCQkgKi8KIAkJCQlJV0xfRVJSKHByaXYsICJsb3cgYWNrIGNvdW50IGRldGVjdGVkLCAiCiAJCQkJCSJyZXN0YXJ0IGZpcm13YXJlXG4iKTsKLQkJCQlpZiAoIWl3bF9mb3JjZV9yZXNldChwcml2LCBJV0xfRldfUkVTRVQpKQorCQkJCWlmICghaXdsX2ZvcmNlX3Jlc2V0KHByaXYsIElXTF9GV19SRVNFVCwgZmFsc2UpKQogCQkJCQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTQyNCw3NiArMjQ5LDEzIEBACiAJCQkJICogaGlnaCBwbGNwIGVycm9yIGRldGVjdGVkCiAJCQkJICogcmVzZXQgUmFkaW8KIAkJCQkgKi8KLQkJCQlpd2xfZm9yY2VfcmVzZXQocHJpdiwgSVdMX1JGX1JFU0VUKTsKKwkJCQlpd2xfZm9yY2VfcmVzZXQocHJpdiwgSVdMX1JGX1JFU0VULCBmYWxzZSk7CiAJCQl9CiAJCX0KIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9yZWNvdmVyX2Zyb21fc3RhdGlzdGljcyk7CiAKLXZvaWQgaXdsX3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0JaW50IGNoYW5nZTsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKLQkJICAgICAoaW50KXNpemVvZihwcml2LT5zdGF0aXN0aWNzKSwKLQkJICAgICBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLKTsKLQotCWNoYW5nZSA9ICgocHJpdi0+c3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlICE9Ci0JCSAgIHBrdC0+dS5zdGF0cy5nZW5lcmFsLnRlbXBlcmF0dXJlKSB8fAotCQkgICgocHJpdi0+c3RhdGlzdGljcy5mbGFnICYKLQkJICAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spICE9Ci0JCSAgIChwa3QtPnUuc3RhdHMuZmxhZyAmIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwotCWl3bF9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhwcml2LCAoX19sZTMyICopJnBrdC0+dS5zdGF0cyk7Ci0jZW5kaWYKLQlpd2xfcmVjb3Zlcl9mcm9tX3N0YXRpc3RpY3MocHJpdiwgcGt0KTsKLQotCW1lbWNweSgmcHJpdi0+c3RhdGlzdGljcywgJnBrdC0+dS5zdGF0cywgc2l6ZW9mKHByaXYtPnN0YXRpc3RpY3MpKTsKLQotCXNldF9iaXQoU1RBVFVTX1NUQVRJU1RJQ1MsICZwcml2LT5zdGF0dXMpOwotCi0JLyogUmVzY2hlZHVsZSB0aGUgc3RhdGlzdGljcyB0aW1lciB0byBvY2N1ciBpbgotCSAqIFJFR19SRUNBTElCX1BFUklPRCBzZWNvbmRzIHRvIGVuc3VyZSB3ZSBnZXQgYQotCSAqIHRoZXJtYWwgdXBkYXRlIGV2ZW4gaWYgdGhlIHVDb2RlIGRvZXNuJ3QgZ2l2ZQotCSAqIHVzIG9uZSAqLwotCW1vZF90aW1lcigmcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYywgamlmZmllcyArCi0JCSAgbXNlY3NfdG9famlmZmllcyhSRUdfUkVDQUxJQl9QRVJJT0QgKiAxMDAwKSk7Ci0KLQlpZiAodW5saWtlbHkoIXRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpICYmCi0JICAgIChwa3QtPmhkci5jbWQgPT0gU1RBVElTVElDU19OT1RJRklDQVRJT04pKSB7Ci0JCWl3bF9yeF9jYWxjX25vaXNlKHByaXYpOwotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ1bl90aW1lX2NhbGliX3dvcmspOwotCX0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dGVtcF9vcHMudGVtcGVyYXR1cmUgJiYgY2hhbmdlKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZShwcml2KTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX3J4X3N0YXRpc3RpY3MpOwotCi12b2lkIGl3bF9yZXBseV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JaWYgKGxlMzJfdG9fY3B1KHBrdC0+dS5zdGF0cy5mbGFnKSAmIFVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKSB7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLQkJbWVtc2V0KCZwcml2LT5hY2N1bV9zdGF0aXN0aWNzLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPmRlbHRhX3N0YXRpc3RpY3MsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKSk7Ci0JCW1lbXNldCgmcHJpdi0+bWF4X2RlbHRhLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcykpOwotI2VuZGlmCi0JCUlXTF9ERUJVR19SWChwcml2LCAiU3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JfQotCWl3bF9yeF9zdGF0aXN0aWNzKHByaXYsIHJ4Yik7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9yZXBseV9zdGF0aXN0aWNzKTsKLQogLyoKICAqIHJldHVybnMgbm9uLXplcm8gaWYgcGFja2V0IHNob3VsZCBiZSBkcm9wcGVkCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYwppbmRleCAzODZjNWY5Li5iMGM2YjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jCkBAIC0zMzMsNyArMzMzLDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7CisJaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgJiYKKwkgICAgIXByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4pIHsKIAkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gYWxyZWFkeSBpbiBwcm9ncmVzcy5cbiIpOwogCQlyZXQgPSAtRUFHQUlOOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0zNDgsOCArMzQ5LDE2IEBACiAJLyogbWFjODAyMTEgd2lsbCBvbmx5IGFzayBmb3Igb25lIGJhbmQgYXQgYSB0aW1lICovCiAJcHJpdi0+c2Nhbl9iYW5kID0gcmVxLT5jaGFubmVsc1swXS0+YmFuZDsKIAlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7CisJcHJpdi0+c2Nhbl92aWYgPSB2aWY7CiAKLQlyZXQgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCB2aWYpOworCS8qCisJICogSWYgYW4gaW50ZXJuYWwgc2NhbiBpcyBpbiBwcm9ncmVzcywganVzdCBzZXQKKwkgKiB1cCB0aGUgc2Nhbl9yZXF1ZXN0IGFzIHBlciBhYm92ZS4KKwkgKi8KKwlpZiAocHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbikKKwkJcmV0ID0gMDsKKwllbHNlCisJCXJldCA9IGl3bF9zY2FuX2luaXRpYXRlKHByaXYsIHZpZik7CiAKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKIApAQCAtNDIwLDExICs0MjksMTAgQEAKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOX0FCT1JUSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBjb21wbGV0aW9uIHdhdGNoZG9nIHJlc2V0dGluZyAiCi0JCQkiYWRhcHRlciAoJWRtcylcbiIsCi0JCQlqaWZmaWVzX3RvX21zZWNzKElXTF9TQ0FOX0NIRUNLX1dBVENIRE9HKSk7CisJaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgJiYKKwkgICAgIXRlc3RfYml0KFNUQVRVU19TQ0FOX0FCT1JUSU5HLCAmcHJpdi0+c3RhdHVzKSkgeworCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBjb21wbGV0aW9uIHdhdGNoZG9nICglZG1zKVxuIiwKKwkJCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKElXTF9TQ0FOX0NIRUNLX1dBVENIRE9HKSk7CiAKIAkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJCWl3bF9zZW5kX3NjYW5fYWJvcnQocHJpdik7CkBAIC00MzgsNyArNDQ2LDcgQEAKICAqLwogCiB1MTYgaXdsX2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKLQkJICAgICAgIGNvbnN0IHU4ICppZXMsIGludCBpZV9sZW4sIGludCBsZWZ0KQorCQkgICAgICAgY29uc3QgdTggKnRhLCBjb25zdCB1OCAqaWVzLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCkKIHsKIAlpbnQgbGVuID0gMDsKIAl1OCAqcG9zID0gTlVMTDsKQEAgLTQ1MSw3ICs0NTksNyBAQAogCiAJZnJhbWUtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKIAltZW1jcHkoZnJhbWUtPmRhLCBpd2xfYmNhc3RfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShmcmFtZS0+c2EsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGZyYW1lLT5zYSwgdGEsIEVUSF9BTEVOKTsKIAltZW1jcHkoZnJhbWUtPmJzc2lkLCBpd2xfYmNhc3RfYWRkciwgRVRIX0FMRU4pOwogCWZyYW1lLT5zZXFfY3RybCA9IDA7CiAKQEAgLTQ4OSwxMiArNDk3LDExIEBACiAJICAgICF0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKKwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+c2Nhbl9jaGVjayk7Ci0Jc2V0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cyk7Ci0JaXdsX3NlbmRfc2Nhbl9hYm9ydChwcml2KTsKLQorCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cykpCisJCWl3bF9zZW5kX3NjYW5fYWJvcnQocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9iZ19hYm9ydF9zY2FuKTsKQEAgLTUxNCw3ICs1MjEsMzAgQEAKIAkJcHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbiA9IGZhbHNlOwogCQlJV0xfREVCVUdfU0NBTihwcml2LCAiaW50ZXJuYWwgc2hvcnQgc2NhbiBjb21wbGV0ZWRcbiIpOwogCQlpbnRlcm5hbCA9IHRydWU7CisJfSBlbHNlIHsKKwkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKwkJcHJpdi0+c2Nhbl92aWYgPSBOVUxMOwogCX0KKworCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW50ZXJuYWwgJiYgcHJpdi0+c2Nhbl9yZXF1ZXN0KQorCQlpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCBwcml2LT5zY2FuX3ZpZik7CisKKwkvKiBTaW5jZSBzZXR0aW5nIHRoZSBUWFBPV0VSIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgKi8KKwlpd2xfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10LCB0cnVlKTsKKworCS8qCisJICogU2luY2Ugc2V0dGluZyB0aGUgUlhPTiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCisJICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmIGlmIG5lZWRlZAorCSAqLworCWlmIChtZW1jbXAoJnByaXYtPmFjdGl2ZV9yeG9uLAorCQkgICAmcHJpdi0+c3RhZ2luZ19yeG9uLCBzaXplb2YocHJpdi0+c3RhZ2luZ19yeG9uKSkpCisJCWl3bGNvcmVfY29tbWl0X3J4b24ocHJpdik7CisKKyBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAKIAkvKgpAQCAtNTI0LDE1ICs1NTQsNiBAQAogCSAqLwogCWlmICghaW50ZXJuYWwpCiAJCWllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZChwcml2LT5odywgZmFsc2UpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBTaW5jZSBzZXR0aW5nIHRoZSBUWFBPV0VSIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKLQkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgKi8KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXdsX3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl91c2VyX2xtdCwgdHJ1ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9iZ19zY2FuX2NvbXBsZXRlZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNwZWN0cnVtLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zcGVjdHJ1bS5oCmluZGV4IGFmNmJhYmUuLmM0Y2EwYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNwZWN0cnVtLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3BlY3RydW0uaApAQCAtNDIsNyArNDIsNyBAQAogCV9fbGU2NCBzdGFydF90aW1lOwogCV9fbGUxNiBkdXJhdGlvbjsKIAl1OCBtYXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewkJCQkvKiBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcmVxdWVzdC5tb2RlICovCiAJLyogQml0IDAgaXMgcmVzZXJ2ZWQgKi8KQEAgLTYzLDEzICs2MywxMyBAQAogCXU4IGNoYW5uZWw7CiAJX19sZTY0IHN0YXJ0X3RpbWU7CiAJX19sZTE2IGR1cmF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CiAJdTggaWQ7CiAJdTggbGVuOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcmVxdWVzdCB7CiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaWU7CkBAIC03Nyw3ICs3Nyw3IEBACiAJdTggbW9kZTsKIAl1OCB0eXBlOwogCXN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zIHBhcmFtc1swXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9tZWFzdXJlbWVudF9yZXBvcnQgewogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGllOwpAQCAtODcsNiArODcsNiBAQAogCXVuaW9uIHsKIAkJc3RydWN0IGllZWU4MDIxMV9iYXNpY19yZXBvcnQgYmFzaWNbMF07CiAJfSB1OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKaW5kZXggYzI3YzEzZi4uOTUxMWYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCkBAIC01NCwxOCArNTUsMTkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9wcm9jZXNzX2FkZF9zdGFfcmVzcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKmFkZHN0YSwKLQkJCQkgICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsCi0JCQkJICAgICBib29sIHN5bmMpCitzdGF0aWMgaW50IGl3bF9wcm9jZXNzX2FkZF9zdGFfcmVzcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBpd2xfYWRkc3RhX2NtZCAqYWRkc3RhLAorCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAorCQkJCSAgICBib29sIHN5bmMpCiB7CiAJdTggc3RhX2lkID0gYWRkc3RhLT5zdGEuc3RhX2lkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU87CiAKIAlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJV0xfQ01EX0ZBSUxFRF9NU0spIHsKIAkJSVdMX0VSUihwcml2LCAiQmFkIHJldHVybiBmcm9tIFJFUExZX0FERF9TVEEgKDB4JTA4WClcbiIsCiAJCQlwa3QtPmhkci5mbGFncyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlJV0xfREVCVUdfSU5GTyhwcml2LCAiUHJvY2Vzc2luZyByZXNwb25zZSBmb3IgYWRkaW5nIHN0YXRpb24gJXVcbiIsCkBAIC03Nyw2ICs3OSw3IEBACiAJY2FzZSBBRERfU1RBX1NVQ0NFU1NfTVNLOgogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUkVQTFlfQUREX1NUQSBQQVNTRURcbiIpOwogCQlpd2xfc3RhX3Vjb2RlX2FjdGl2YXRlKHByaXYsIHN0YV9pZCk7CisJCXJldCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgQUREX1NUQV9OT19ST09NX0lOX1RBQkxFOgogCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlZCBmYWlsZWQsIG5vIHJvb20gaW4gdGFibGUuXG4iLApAQCAtMTE0LDYgKzExNyw4IEBACiAJCSAgICAgICBTVEFfQ09OVFJPTF9NT0RJRllfTVNLID8gIk1vZGlmaWVkIiA6ICJBZGRlZCIsCiAJCSAgICAgICBhZGRzdGEtPnN0YS5hZGRyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgaXdsX2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtMTQ1LDggKzE1MCwxMCBAQAogCiAJaWYgKGZsYWdzICYgQ01EX0FTWU5DKQogCQljbWQuY2FsbGJhY2sgPSBpd2xfYWRkX3N0YV9jYWxsYmFjazsKLQllbHNlCisJZWxzZSB7CiAJCWNtZC5mbGFncyB8PSBDTURfV0FOVF9TS0I7CisJCW1pZ2h0X3NsZWVwKCk7CisJfQogCiAJY21kLmxlbiA9IHByaXYtPmNmZy0+b3BzLT51dGlscy0+YnVpbGRfYWRkc3RhX2hjbWQoc3RhLCBkYXRhKTsKIAlyZXQgPSBpd2xfc2VuZF9jbWQocHJpdiwgJmNtZCk7CkBAIC0xNTYsNyArMTYzLDcgQEAKIAogCWlmIChyZXQgPT0gMCkgewogCQlwa3QgPSAoc3RydWN0IGl3bF9yeF9wYWNrZXQgKiljbWQucmVwbHlfcGFnZTsKLQkJaXdsX3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIHN0YSwgcGt0LCB0cnVlKTsKKwkJcmV0ID0gaXdsX3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIHN0YSwgcGt0LCB0cnVlKTsKIAl9CiAJaXdsX2ZyZWVfcGFnZXMocHJpdiwgY21kLnJlcGx5X3BhZ2UpOwogCkBAIC0zMTEsMTAgKzMxOCwxMCBAQAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9pbmZvLAogCQkJCSAgdTggKnN0YV9pZF9yKQogewotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAJaW50IHJldCA9IDA7CiAJdTggc3RhX2lkOworCXN0cnVjdCBpd2xfYWRkc3RhX2NtZCBzdGFfY21kOwogCiAJKnN0YV9pZF9yID0gMDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwpAQCAtMzQ3LDE0ICszNTQsMTUgQEAKIAl9CiAKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOwotCXN0YXRpb24gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXTsKKwltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAogCS8qIEFkZCBzdGF0aW9uIHRvIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KLQlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGF0aW9uLT5zdGEsIENNRF9TWU5DKTsKKwlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CiAJaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwgc3RhdGlvbi0+c3RhLnN0YS5hZGRyKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCisJCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CiAJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwogCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwpAQCAtNDg4LDcgKzQ5Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXdsX3NlbmRfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbikKKwkJCQkgICBjb25zdCB1OCAqYWRkciwgaW50IHN0YV9pZCkKIHsKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwogCWludCByZXQ7CkBAIC01MDUsNyArNTEzLDcgQEAKIAogCW1lbXNldCgmcm1fc3RhX2NtZCwgMCwgc2l6ZW9mKHJtX3N0YV9jbWQpKTsKIAlybV9zdGFfY21kLm51bV9zdGEgPSAxOwotCW1lbWNweSgmcm1fc3RhX2NtZC5hZGRyLCAmc3RhdGlvbi0+c3RhLnN0YS5hZGRyICwgRVRIX0FMRU4pOworCW1lbWNweSgmcm1fc3RhX2NtZC5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAKIAljbWQuZmxhZ3MgfD0gQ01EX1dBTlRfU0tCOwogCkBAIC01MjUsNyArNTMzLDcgQEAKIAkJc3dpdGNoIChwa3QtPnUucmVtX3N0YS5zdGF0dXMpIHsKIAkJY2FzZSBSRU1fU1RBX1NVQ0NFU1NfTVNLOgogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCWl3bF9zdGFfdWNvZGVfZGVhY3RpdmF0ZShwcml2LCBzdGF0aW9uLT5zdGEuc3RhLnN0YV9pZCk7CisJCQlpd2xfc3RhX3Vjb2RlX2RlYWN0aXZhdGUocHJpdiwgc3RhX2lkKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAkJCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiUkVQTFlfUkVNT1ZFX1NUQSBQQVNTRURcbiIpOwogCQkJYnJlYWs7CkBAIC01NDYsNyArNTU0LDYgQEAKIGludCBpd2xfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCBzdGFfaWQsCiAJCSAgICAgICBjb25zdCB1OCAqYWRkcikKIHsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghaXdsX2lzX3JlYWR5KHByaXYpKSB7CkBAIC01OTIsMTAgKzU5OSw5IEBACiAKIAlCVUdfT04ocHJpdi0+bnVtX3N0YXRpb25zIDwgMCk7CiAKLQlzdGF0aW9uID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF07CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAotCXJldHVybiBpd2xfc2VuZF9yZW1vdmVfc3RhdGlvbihwcml2LCBzdGF0aW9uKTsKKwlyZXR1cm4gaXdsX3NlbmRfcmVtb3ZlX3N0YXRpb24ocHJpdiwgYWRkciwgc3RhX2lkKTsKIG91dF9lcnI6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTY0MywxMSArNjQ5LDEzIEBACiAgKi8KIHZvaWQgaXdsX3Jlc3RvcmVfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKKwlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKwlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7CiAJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwogCWludCBpOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAlpbnQgcmV0OworCWJvb2wgc2VuZF9scTsKIAogCWlmICghaXdsX2lzX3JlYWR5KHByaXYpKSB7CiAJCUlXTF9ERUJVR19JTkZPKHByaXYsICJOb3QgcmVhZHkgeWV0LCBub3QgcmVzdG9yaW5nIGFueSBzdGF0aW9ucy5cbiIpOwpAQCAtNjY5LDEzICs2NzcsMjAgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKIAkJaWYgKChwcml2LT5zdGF0aW9uc1tpXS51c2VkICYgSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSkgeworCQkJbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbaV0uc3RhLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQpKTsKKwkJCXNlbmRfbHEgPSBmYWxzZTsKKwkJCWlmIChwcml2LT5zdGF0aW9uc1tpXS5scSkgeworCQkJCW1lbWNweSgmbHEsIHByaXYtPnN0YXRpb25zW2ldLmxxLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kKSk7CisJCQkJc2VuZF9scSA9IHRydWU7CisJCQl9CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCQlzdGF0aW9uID0gJnByaXYtPnN0YXRpb25zW2ldOwotCQkJcmV0ID0gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbaV0uc3RhLCBDTURfU1lOQyk7CisJCQlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCi0JCQkJCXN0YXRpb24tPnN0YS5zdGEuYWRkcik7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKKwkJCQkJcHJpdi0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyKTsKIAkJCQlwcml2LT5zdGF0aW9uc1tpXS51c2VkICY9IH5JV0xfU1RBX0RSSVZFUl9BQ1RJVkU7CiAJCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKQEAgLTY4NCw4ICs2OTksOCBAQAogCQkJICogUmF0ZSBzY2FsaW5nIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsIHNlbmQKIAkJCSAqIGN1cnJlbnQgTFEgY29tbWFuZAogCQkJICovCi0JCQlpZiAoc3RhdGlvbi0+bHEpCi0JCQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIHN0YXRpb24tPmxxLCBDTURfU1lOQywgdHJ1ZSk7CisJCQlpZiAoc2VuZF9scSkKKwkJCQlpd2xfc2VuZF9scV9jbWQocHJpdiwgJmxxLCBDTURfU1lOQywgdHJ1ZSk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOwogCQl9CkBAIC04MjMsNyArODM4LDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOwotCWludCByZXQ7CisJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKIAlrZXljb25mLT5mbGFncyAmPSB+SUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwogCkBAIC04NjMsMTEgKzg4MCwxMCBAQAogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7CiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CiAKLQlyZXQgPSBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKLQorCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKIH0KIAogc3RhdGljIGludCBpd2xfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC04NzYsNyArODkyLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOwotCWludCByZXQ7CisJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKIAlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX0NDTVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7CiAJa2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOwpAQCAtOTExLDExICs5MjksMTAgQEAKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwogCi0JcmV0ID0gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0KKwltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CiB9CiAKIHN0YXRpYyBpbnQgaXdsX3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtOTcyLDI0ICs5ODksMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JaWYgKHN0YSkgewotCQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7Ci0KLQkJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gJXBNIG5vdCBpbml0aWFsaXNlZC5cbiIsCi0JCQkJCSAgIHN0YS0+YWRkcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UKLQkJc3RhX2lkID0gcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZDsKLQotCiAJaWYgKGl3bF9zY2FuX2NhbmNlbChwcml2KSkgewogCQkvKiBjYW5jZWwgc2NhbiBmYWlsZWQsIGp1c3QgbGl2ZSB3LyBiYWQga2V5IGFuZCByZWx5CiAJCSAgIGJyaWVmbHkgb24gU1cgZGVjcnlwdGlvbiAqLwogCQlyZXR1cm47CiAJfQogCisJc3RhX2lkID0gaXdsX3N0YV9pZF9vcl9icm9hZGNhc3QocHJpdiwgc3RhKTsKKwlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOwpAQCAtMTAxMyw5ICsxMDIyLDExIEBACiAJCQkJdTggc3RhX2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7CiAJdTE2IGtleV9mbGFnczsKIAl1OCBrZXlpZHg7CisJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKIAlwcml2LT5rZXlfbWFwcGluZ19rZXktLTsKIApAQCAtMTA2Miw5ICsxMDczLDEwIEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KLQlyZXQgPSAgaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7CisJbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIHNpemVvZihzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwogfQogRVhQT1JUX1NZTUJPTChpd2xfcmVtb3ZlX2R5bmFtaWNfa2V5KTsKIApAQCAtMTA3Myw2ICsxMDg1LDggQEAKIHsKIAlpbnQgcmV0OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOworCiAJcHJpdi0+a2V5X21hcHBpbmdfa2V5Kys7CiAJa2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9EWU5BTUlDOwogCkBAIC0xMjQ1LDYgKzEyNTksMzYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGl3bF9hbGxvY19iY2FzdF9zdGF0aW9uKTsKIAorLyoqCisgKiBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24gLSB1cGRhdGUgYnJvYWRjYXN0IHN0YXRpb24ncyBMUSBjb21tYW5kCisgKgorICogT25seSB1c2VkIGJ5IGl3bGFnbi4gUGxhY2VkIGhlcmUgdG8gaGF2ZSBhbGwgYmNhc3Qgc3RhdGlvbiBtYW5hZ2VtZW50CisgKiBjb2RlIHRvZ2V0aGVyLgorICovCitpbnQgaXdsX3VwZGF0ZV9iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7CisJdTggc3RhX2lkID0gcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZDsKKworCWxpbmtfY21kID0gaXdsX3N0YV9hbGxvY19scShwcml2LCBzdGFfaWQpOworCWlmICghbGlua19jbWQpIHsKKwkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nIGZvciBiY2FzdCBzdGF0aW9uLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKQorCQlrZnJlZShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKKwllbHNlCisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJCY2FzdCBzdGF0aW9uIHJhdGUgc2NhbGluZyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuIik7CisJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGl3bF91cGRhdGVfYmNhc3Rfc3RhdGlvbik7CisKIHZvaWQgaXdsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEyNjgsMTggKzEzMTIsMjIgQEAKIC8qKgogICogaXdsX3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZCAtIEVuYWJsZSBUeCBmb3IgdGhpcyBUSUQgaW4gc3RhdGlvbiB0YWJsZQogICovCi12b2lkIGl3bF9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkKQoraW50IGl3bF9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKIAkvKiBSZW1vdmUgImRpc2FibGUiIGZsYWcsIHRvIGVuYWJsZSBUeCBmb3IgdGhpcyBUSUQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX1RJRF9ESVNBQkxFX1RYOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnRpZF9kaXNhYmxlX3R4ICY9IGNwdV90b19sZTE2KH4oMSA8PCB0aWQpKTsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiAKLQlpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKKwlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwogfQogRVhQT1JUX1NZTUJPTChpd2xfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKTsKIApAQCAtMTI4OCw2ICsxMzM2LDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGFfaWQ7CisJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKIAlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7CiAJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQpAQCAtMTI5OSwxMCArMTM1MCwxMCBAQAogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmFkZF9pbW1lZGlhdGVfYmFfdGlkID0gKHU4KXRpZDsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5hZGRfaW1tZWRpYXRlX2JhX3NzbiA9IGNwdV90b19sZTE2KHNzbik7CiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisJbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIHNpemVvZihzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAotCQkJCUNNRF9BU1lOQyk7CisJcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKIH0KIEVYUE9SVF9TWU1CT0woaXdsX3N0YV9yeF9hZ2dfc3RhcnQpOwogCkBAIC0xMzExLDYgKzEzNjIsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YV9pZDsKKwlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKIAogCXN0YV9pZCA9IGl3bF9zdGFfaWQoc3RhKTsKIAlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKQEAgLTEzMjMsMTAgKzEzNzcsMTAgQEAKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0s7CiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEucmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQgPSAodTgpdGlkOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAotCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCQkJQ01EX0FTWU5DKTsKKwlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwogfQogRVhQT1JUX1NZTUJPTChpd2xfc3RhX3J4X2FnZ19zdG9wKTsKIApAQCAtMTM0MCw5ICsxMzk0LDkgQEAKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSAwOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnNsZWVwX3R4X2NvdW50ID0gMDsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwlpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCi0JaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9zdGFfbW9kaWZ5X3BzX3dha2UpOwogCkBAIC0xMzU3LDkgKzE0MTEsOSBAQAogCQkJCQlTVEFfTU9ESUZZX1NMRUVQX1RYX0NPVU5UX01TSzsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IGNwdV90b19sZTE2KGNudCk7CiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisJaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAotCWl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOwogfQogRVhQT1JUX1NZTUJPTChpd2xfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmgKaW5kZXggZGM0M2ViZC4uZDM4YTM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmgKQEAgLTYwLDYgKzYwLDcgQEAKIHZvaWQgaXdsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsX2FsbG9jX2JjYXN0X3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGluaXRfbHEpOwogdm9pZCBpd2xfZGVhbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CitpbnQgaXdsX3VwZGF0ZV9iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsX2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9zZW5kX2FkZF9zdGEoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkgICAgIHN0cnVjdCBpd2xfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncyk7CkBAIC03Myw3ICs3NCw3IEBACiAJCSAgICAgICBjb25zdCB1OCAqYWRkcik7CiBpbnQgaXdsX21hY19zdGFfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7Ci12b2lkIGl3bF9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkKTsKK2ludCBpd2xfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwgaW50IHRpZCk7CiBpbnQgaXdsX3N0YV9yeF9hZ2dfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkJIGludCB0aWQsIHUxNiBzc24pOwogaW50IGl3bF9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLApAQCAtMTE4LDQgKzExOSwzMyBAQAogCiAJcmV0dXJuICgoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uICopc3RhLT5kcnZfcHJpdiktPnN0YV9pZDsKIH0KKworLyoqCisgKiBpd2xfc3RhX2lkX29yX2Jyb2FkY2FzdCAtIHJldHVybiBzdGFfaWQgb3IgYnJvYWRjYXN0IHN0YQorICogQHByaXY6IGl3bCBwcml2CisgKiBAc3RhOiBtYWM4MDIxMSBzdGF0aW9uCisgKgorICogSW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzIG1hYzgwMjExIHBhc3NlcyBhIHN0YXRpb24gcG9pbnRlcgorICogdGhhdCBtYXkgYmUgJU5VTEwsIGZvciBleGFtcGxlIGR1cmluZyBUWCBvciBrZXkgc2V0dXAuIEluCisgKiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gdXNlIHRoZSBicm9hZGNhc3Qgc3RhdGlvbiwgc28gdGhpcworICogaW5saW5lIHdyYXBzIHRoYXQgcGF0dGVybi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXdsX3N0YV9pZF9vcl9icm9hZGNhc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJaW50IHN0YV9pZDsKKworCWlmICghc3RhKQorCQlyZXR1cm4gcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZDsKKworCXN0YV9pZCA9IGl3bF9zdGFfaWQoc3RhKTsKKworCS8qCisJICogbWFjODAyMTEgc2hvdWxkIG5vdCBiZSBwYXNzaW5nIGEgcGFydGlhbGx5CisJICogaW5pdGlhbGlzZWQgc3RhdGlvbiEKKwkgKi8KKwlXQVJOX09OKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKTsKKworCXJldHVybiBzdGFfaWQ7Cit9CiAjZW5kaWYgLyogX19pd2xfc3RhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKaW5kZXggMWVjZTJlYS4uYTgxOTg5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jCkBAIC03NywyMSArNzcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIpOwogCi0KLXZvaWQgaXdsX2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKQotewotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPj0gZnJlZWQpCi0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSAtPSBmcmVlZDsKLQllbHNlIHsKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJmcmVlIG1vcmUgdGhhbiB0ZmRzX2luX3F1ZXVlICgldTolZClcbiIsCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUsCi0JCQlmcmVlZCk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSA9IDA7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfZnJlZV90ZmRzX2luX3F1ZXVlKTsKLQogLyoqCiAgKiBpd2xfdHhfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgogICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KQEAgLTE2OSwxNSArMTU0LDE1IEBACiAJCX0KIAogCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJIHBjaV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCSBwY2lfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCisJCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAorCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCiAJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJfQogCWlmIChodWdlKSB7CiAJCWkgPSBxLT5uX3dpbmRvdzsKIAkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LAotCQkJCSBwY2lfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2ldLCBtYXBwaW5nKSwKLQkJCQkgcGNpX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAorCQkJCSBkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2ldLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAogCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCX0KIApAQCAtMjg3LDcgKzI3Miw3IEBACiAJLyogRHJpdmVyIHByaXZhdGUgZGF0YSwgb25seSBmb3IgVHggKG5vdCBjb21tYW5kKSBxdWV1ZXMsCiAJICogbm90IHNoYXJlZCB3aXRoIGRldmljZS4gKi8KIAlpZiAoaWQgIT0gSVdMX0NNRF9RVUVVRV9OVU0pIHsKLQkJdHhxLT50eGIgPSBrbWFsbG9jKHNpemVvZih0eHEtPnR4YlswXSkgKgorCQl0eHEtPnR4YiA9IGt6YWxsb2Moc2l6ZW9mKHR4cS0+dHhiWzBdKSAqCiAJCQkJICAgVEZEX1FVRVVFX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF0eHEtPnR4YikgewogCQkJSVdMX0VSUihwcml2LCAia21hbGxvYyBmb3IgYXV4aWxpYXJ5IEJEICIKQEAgLTUzMSw4ICs1MTYsOCBAQAogCiAJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwgJm91dF9jbWQtPmhkciwKIAkJCQkgICBmaXhfc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlwY2lfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHBoeXNfYWRkcik7Ci0JcGNpX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgZml4X3NpemUpOworCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgcGh5c19hZGRyKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBmaXhfc2l6ZSk7CiAKIAl0cmFjZV9pd2x3aWZpX2Rldl9oY21kKHByaXYsICZvdXRfY21kLT5oZHIsIGZpeF9zaXplLCBjbWQtPmZsYWdzKTsKIApAQCAtNjI2LDggKzYxMSw4IEBACiAJbWV0YSA9ICZ0eHEtPm1ldGFbY21kX2luZGV4XTsKIAogCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCSBwY2lfdW5tYXBfYWRkcihtZXRhLCBtYXBwaW5nKSwKLQkJCSBwY2lfdW5tYXBfbGVuKG1ldGEsIGxlbiksCisJCQkgZG1hX3VubWFwX2FkZHIobWV0YSwgbWFwcGluZyksCisJCQkgZG1hX3VubWFwX2xlbihtZXRhLCBsZW4pLAogCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAKIAkvKiBJbnB1dCBlcnJvciBjaGVja2luZyBpcyBkb25lIHdoZW4gY29tbWFuZHMgYXJlIGFkZGVkIHRvIHF1ZXVlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wzOTQ1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsMzk0NS1iYXNlLmMKaW5kZXggYTI3ODcyZC4uZDI0ZWI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wzOTQ1LWJhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bDM5NDUtYmFzZS5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xOTcsNiArMTk5LDcgQEAKIHN0YXRpYyBpbnQgaXdsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBzdGFfaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgc3RhX2NtZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCW1lbXNldCgmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9od19rZXkpKTsKQEAgLTIwNSwxMSArMjA4LDExIEBACiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IFNUQV9LRVlfRkxHX05PX0VOQzsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAogCUlXTF9ERUJVR19JTkZPKHByaXYsICJod2NyeXB0bzogY2xlYXIgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7Ci0JaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIDApOwotCXJldHVybiAwOworCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CiB9CiAKIHN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtMzEwLDkgKzMxMyw3IEBACiAJCQkJaW50IGxlZnQpCiB7CiAKLQlpZiAoIWl3bF9pc19hc3NvY2lhdGVkKHByaXYpIHx8ICFwcml2LT5pYnNzX2JlYWNvbiB8fAotCSAgICAoKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCi0JICAgICAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkpKQorCWlmICghaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikgfHwgIXByaXYtPmlic3NfYmVhY29uKQogCQlyZXR1cm4gMDsKIAogCWlmIChwcml2LT5pYnNzX2JlYWNvbi0+bGVuID4gbGVmdCkKQEAgLTQ3NCwxMCArNDc1LDggQEAKIAl1OCB1bmljYXN0OwogCXU4IHN0YV9pZDsKIAl1OCB0aWQgPSAwOwotCXUxNiBzZXFfbnVtYmVyID0gMDsKIAlfX2xlMTYgZmM7CiAJdTggd2FpdF93cml0ZV9wdHIgPSAwOwotCXU4ICpxYyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC01MTAsMTAgKzUwOSw3IEBACiAJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOwogCiAJLyogRmluZCBpbmRleCBpbnRvIHN0YXRpb24gdGFibGUgZm9yIGRlc3RpbmF0aW9uIHN0YXRpb24gKi8KLQlpZiAoIWluZm8tPmNvbnRyb2wuc3RhKQotCQlzdGFfaWQgPSBwcml2LT5od19wYXJhbXMuYmNhc3Rfc3RhX2lkOwotCWVsc2UKLQkJc3RhX2lkID0gaXdsX3N0YV9pZChpbmZvLT5jb250cm9sLnN0YSk7CisJc3RhX2lkID0gaXdsX3N0YV9pZF9vcl9icm9hZGNhc3QocHJpdiwgaW5mby0+Y29udHJvbC5zdGEpOwogCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewogCQlJV0xfREVCVUdfRFJPUChwcml2LCAiRHJvcHBpbmcgLSBJTlZBTElEIFNUQVRJT046ICVwTVxuIiwKIAkJCSAgICAgICBoZHItPmFkZHIxKTsKQEAgLTUyMywxNiArNTE5LDEwIEBACiAJSVdMX0RFQlVHX1JBVEUocHJpdiwgInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7CiAKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewotCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKIAkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKIAkJaWYgKHVubGlrZWx5KHRpZCA+PSBNQVhfVElEX0NPVU5UKSkKIAkJCWdvdG8gZHJvcDsKLQkJc2VxX251bWJlciA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlciAmCi0JCQkJSUVFRTgwMjExX1NDVExfU0VROwotCQloZHItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoc2VxX251bWJlcikgfAotCQkJKGhkci0+c2VxX2N0cmwgJgotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpKTsKLQkJc2VxX251bWJlciArPSAweDEwOwogCX0KIAogCS8qIERlc2NyaXB0b3IgZm9yIGNob3NlbiBUeCBxdWV1ZSAqLwpAQCAtNTQ4LDcgKzUzOCw3IEBACiAKIAkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCiAJbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2luZm8pKTsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYlswXSA9IHNrYjsKKwl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKIAogCS8qIEluaXQgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLwogCW91dF9jbWQgPSB0eHEtPmNtZFtpZHhdOwpAQCAtNTkxLDggKzU4MSw2IEBACiAKIAlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCWlmIChxYykKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlciA9IHNlcV9udW1iZXI7CiAJfSBlbHNlIHsKIAkJd2FpdF93cml0ZV9wdHIgPSAxOwogCQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKQEAgLTYzMSw4ICs2MTksOCBAQAogCQkJCSAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogCS8qIHdlIGRvIG5vdCBtYXAgbWV0YSBkYXRhIC4uLiBzbyB3ZSBjYW4gc2FmZWx5IGFjY2VzcyBhZGRyZXNzIHRvCiAJICogcHJvdmlkZSB0byB1bm1hcCBjb21tYW5kKi8KLQlwY2lfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOwotCXBjaV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGxlbik7CisJZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCB0eGNtZF9waHlzKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBsZW4pOwogCiAJLyogQWRkIGJ1ZmZlciBjb250YWluaW5nIFR4IGNvbW1hbmQgYW5kIE1BQyghKSBoZWFkZXIgdG8gVEZEJ3MKIAkgKiBmaXJzdCBlbnRyeSAqLwpAQCAtNjc3LDU1ICs2NjUsNiBAQAogCXJldHVybiAtMTsKIH0KIAotI2RlZmluZSBCRUFDT05fVElNRV9NQVNLX0xPVwkweDAwRkZGRkZGCi0jZGVmaW5lIEJFQUNPTl9USU1FX01BU0tfSElHSAkweEZGMDAwMDAwCi0jZGVmaW5lIFRJTUVfVU5JVAkJMTAyNAotCi0vKgotICogZXh0ZW5kZWQgYmVhY29uIHRpbWUgZm9ybWF0Ci0gKiB0aW1lIGluIHVzZWMgd2lsbCBiZSBjaGFuZ2VkIGludG8gYSAzMi1iaXQgdmFsdWUgaW4gODoyNCBmb3JtYXQKLSAqIHRoZSBoaWdoIDEgYnl0ZSBpcyB0aGUgYmVhY29uIGNvdW50cwotICogdGhlIGxvd2VyIDMgYnl0ZXMgaXMgdGhlIHRpbWUgaW4gdXNlYyB3aXRoaW4gb25lIGJlYWNvbiBpbnRlcnZhbAotICovCi0KLXN0YXRpYyB1MzIgaXdsMzk0NV91c2Vjc190b19iZWFjb25zKHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKQotewotCXUzMiBxdW90OwotCXUzMiByZW07Ci0JdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogMTAyNDsKLQotCWlmICghaW50ZXJ2YWwgfHwgIXVzZWMpCi0JCXJldHVybiAwOwotCi0JcXVvdCA9ICh1c2VjIC8gaW50ZXJ2YWwpICYgKEJFQUNPTl9USU1FX01BU0tfSElHSCA+PiAyNCk7Ci0JcmVtID0gKHVzZWMgJSBpbnRlcnZhbCkgJiBCRUFDT05fVElNRV9NQVNLX0xPVzsKLQotCXJldHVybiAocXVvdCA8PCAyNCkgKyByZW07Ci19Ci0KLS8qIGJhc2UgaXMgdXN1YWxseSB3aGF0IHdlIGdldCBmcm9tIHVjb2RlIHdpdGggZWFjaCByZWNlaXZlZCBmcmFtZSwKLSAqIHRoZSBzYW1lIGFzIEhXIHRpbWVyIGNvdW50ZXIgY291bnRpbmcgZG93bgotICovCi0KLXN0YXRpYyBfX2xlMzIgaXdsMzk0NV9hZGRfYmVhY29uX3RpbWUodTMyIGJhc2UsIHUzMiBhZGRvbiwgdTMyIGJlYWNvbl9pbnRlcnZhbCkKLXsKLQl1MzIgYmFzZV9sb3cgPSBiYXNlICYgQkVBQ09OX1RJTUVfTUFTS19MT1c7Ci0JdTMyIGFkZG9uX2xvdyA9IGFkZG9uICYgQkVBQ09OX1RJTUVfTUFTS19MT1c7Ci0JdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOwotCXUzMiByZXMgPSAoYmFzZSAmIEJFQUNPTl9USU1FX01BU0tfSElHSCkgKwotCSAgICAoYWRkb24gJiBCRUFDT05fVElNRV9NQVNLX0hJR0gpOwotCi0JaWYgKGJhc2VfbG93ID4gYWRkb25fbG93KQotCQlyZXMgKz0gYmFzZV9sb3cgLSBhZGRvbl9sb3c7Ci0JZWxzZSBpZiAoYmFzZV9sb3cgPCBhZGRvbl9sb3cpIHsKLQkJcmVzICs9IGludGVydmFsICsgYmFzZV9sb3cgLSBhZGRvbl9sb3c7Ci0JCXJlcyArPSAoMSA8PCAyNCk7Ci0JfSBlbHNlCi0JCXJlcyArPSAoMSA8PCAyNCk7Ci0KLQlyZXR1cm4gY3B1X3RvX2xlMzIocmVzKTsKLX0KLQogc3RhdGljIGludCBpd2wzOTQ1X2dldF9tZWFzdXJlbWVudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9tZWFzdXJlbWVudF9wYXJhbXMgKnBhcmFtcywKIAkJCSAgICAgICB1OCB0eXBlKQpAQCAtNzQzLDggKzY4Miw3IEBACiAJaW50IGR1cmF0aW9uID0gbGUxNl90b19jcHUocGFyYW1zLT5kdXJhdGlvbik7CiAKIAlpZiAoaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikpCi0JCWFkZF90aW1lID0KLQkJICAgIGl3bDM5NDVfdXNlY3NfdG9fYmVhY29ucygKKwkJYWRkX3RpbWUgPSBpd2xfdXNlY3NfdG9fYmVhY29ucyhwcml2LAogCQkJbGU2NF90b19jcHUocGFyYW1zLT5zdGFydF90aW1lKSAtIHByaXYtPl8zOTQ1Lmxhc3RfdHNmLAogCQkJbGUxNl90b19jcHUocHJpdi0+cnhvbl90aW1pbmcuYmVhY29uX2ludGVydmFsKSk7CiAKQEAgLTc1OSw4ICs2OTcsOCBAQAogCiAJaWYgKGl3bF9pc19hc3NvY2lhdGVkKHByaXYpKQogCQlzcGVjdHJ1bS5zdGFydF90aW1lID0KLQkJICAgIGl3bDM5NDVfYWRkX2JlYWNvbl90aW1lKHByaXYtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUsCi0JCQkJYWRkX3RpbWUsCisJCQlpd2xfYWRkX2JlYWNvbl90aW1lKHByaXYsCisJCQkJcHJpdi0+XzM5NDUubGFzdF9iZWFjb25fdGltZSwgYWRkX3RpbWUsCiAJCQkJbGUxNl90b19jcHUocHJpdi0+cnhvbl90aW1pbmcuYmVhY29uX2ludGVydmFsKSk7CiAJZWxzZQogCQlzcGVjdHJ1bS5zdGFydF90aW1lID0gMDsKQEAgLTEyMzMsNyArMTE3MSw3IEBACiAJfQogCiAJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCi0JCQkgIHJ4cS0+ZG1hX2FkZHIpOworCQkJICByeHEtPmJkX2RtYSk7CiAJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpd2xfcmJfc3RhdHVzKSwKIAkJCSAgcnhxLT5yYl9zdHRzLCByeHEtPnJiX3N0dHNfZG1hKTsKIAlyeHEtPmJkID0gTlVMTDsKQEAgLTEzMTQsNiArMTI1Miw4IEBACiAJCUlXTF9ERUJVR19SWChwcml2LCAiciA9ICVkLCBpID0gJWRcbiIsIHIsIGkpOwogCiAJd2hpbGUgKGkgIT0gcikgeworCQlpbnQgbGVuOworCiAJCXJ4YiA9IHJ4cS0+cXVldWVbaV07CiAKIAkJLyogSWYgYW4gUlhCIGRvZXNuJ3QgaGF2ZSBhIFJ4IHF1ZXVlIHNsb3QgYXNzb2NpYXRlZCB3aXRoIGl0LApAQCAtMTMyOCw4ICsxMjY4LDkgQEAKIAkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlwa3QgPSByeGJfYWRkcihyeGIpOwogCi0JCXRyYWNlX2l3bHdpZmlfZGV2X3J4KHByaXYsIHBrdCwKLQkJCWxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0spOworCQlsZW4gPSBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLOworCQlsZW4gKz0gc2l6ZW9mKHUzMik7IC8qIGFjY291bnQgZm9yIHN0YXR1cyB3b3JkICovCisJCXRyYWNlX2l3bHdpZmlfZGV2X3J4KHByaXYsIHBrdCwgbGVuKTsKIAogCQkvKiBSZWNsYWltIGEgY29tbWFuZCBidWZmZXIgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlCiAJCSAqICAgdG8gYSAoZHJpdmVyLW9yaWdpbmF0ZWQpIGNvbW1hbmQuCkBAIC0xNDgzLDcgKzE0MjQsNyBAQAogCQkgICAgaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyA2ICogc2l6ZW9mKHUzMikpOwogCiAJCUlXTF9FUlIocHJpdiwKLQkJCSIlLTEzcyAoIyVkKSAlMDEwdSAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggJXVcblxuIiwKKwkJCSIlLTEzcyAoMHglWCkgJTAxMHUgMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYICV1XG5cbiIsCiAJCQlkZXNjX2xvb2t1cChkZXNjKSwgZGVzYywgdGltZSwgYmxpbmsxLCBibGluazIsCiAJCQlpbGluazEsIGlsaW5rMiwgZGF0YTEpOwogCQl0cmFjZV9pd2x3aWZpX2Rldl91Y29kZV9lcnJvcihwcml2LCBkZXNjLCB0aW1lLCBkYXRhMSwgMCwKQEAgLTI5NDIsNyArMjg4MywxMCBAQAogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJaW50ZXJ2YWwgPSB2aWYgPyB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOworCQlpZiAocHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbikKKwkJCWludGVydmFsID0gMDsKKwkJZWxzZQorCQkJaW50ZXJ2YWwgPSB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQ7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSAwOwpAQCAtMzAyMiwxNCArMjk2NiwxNiBAQAogCQlzY2FuLT50eF9jbWQubGVuID0gY3B1X3RvX2xlMTYoCiAJCQlpd2xfZmlsbF9wcm9iZV9yZXEocHJpdiwKIAkJCQkoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKKwkJCQl2aWYtPmFkZHIsCiAJCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5pZSwKIAkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKIAkJCQlJV0xfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpKTsKIAl9IGVsc2UgeworCQkvKiB1c2UgYmNhc3QgYWRkciwgd2lsbCBub3QgYmUgdHJhbnNtaXR0ZWQgYnV0IG11c3QgYmUgdmFsaWQgKi8KIAkJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KAogCQkJaXdsX2ZpbGxfcHJvYmVfcmVxKHByaXYsCiAJCQkJKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNjYW4tPmRhdGEsCi0JCQkJTlVMTCwgMCwKKwkJCQlpd2xfYmNhc3RfYWRkciwgTlVMTCwgMCwKIAkJCQlJV0xfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpKTsKIAl9CiAJLyogc2VsZWN0IFJ4IGFudGVubmFzICovCkBAIC0zMTU4LDE5ICszMTA0LDE2IEBACiAJSVdMX0RFQlVHX0FTU09DKHByaXYsICJhc3NvYyBpZCAlZCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsCiAJCQl2aWYtPmJzc19jb25mLmFpZCwgdmlmLT5ic3NfY29uZi5iZWFjb25faW50KTsKIAotCWlmICh2aWYtPmJzc19jb25mLmFzc29jX2NhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwogCWVsc2UKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CiAKIAlpZiAocHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCWlmICh2aWYtPmJzc19jb25mLmFzc29jX2NhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FKQorCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKIAkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKIAkJZWxzZQogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQotCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKIAl9CiAKIAlpd2xjb3JlX2NvbW1pdF9yeG9uKHByaXYpOwpAQCAtMzMzNCw4ICszMjc3LDcgQEAKIAogCQlwcml2LT5zdGFnaW5nX3J4b24uYXNzb2NfaWQgPSAwOwogCi0JCWlmICh2aWYtPmJzc19jb25mLmFzc29jX2NhcGFiaWxpdHkgJgotCQkJCQlXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKIAkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyB8PQogCQkJCVJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKIAkJZWxzZQpAQCAtMzM0MywxNyArMzI4NSwxMiBAQAogCQkJCX5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CiAKIAkJaWYgKHByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgewotCQkJaWYgKHZpZi0+YnNzX2NvbmYuYXNzb2NfY2FwYWJpbGl0eSAmCi0JCQkJCVdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUUpCisJCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKIAkJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0KIAkJCQkJUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CiAJCQllbHNlCiAJCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9CiAJCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQotCQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0KLQkJCQkJflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCQl9CiAJCS8qIHJlc3RvcmUgUlhPTiBhc3NvYyAqLwogCQlwcml2LT5zdGFnaW5nX3J4b24uZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKQEAgLTMzODYsMTcgKzMzMjMsOSBAQAogCXN0YXRpY19rZXkgPSAhaXdsX2lzX2Fzc29jaWF0ZWQocHJpdik7CiAKIAlpZiAoIXN0YXRpY19rZXkpIHsKLQkJaWYgKCFzdGEpIHsKLQkJCXN0YV9pZCA9IHByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQ7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7Ci0JCQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwKLQkJCQkJCSAgICJsZWF2ZSAtICVwTSBub3QgaW4gc3RhdGlvbiBtYXAuXG4iLAotCQkJCQkJICAgc3RhLT5hZGRyKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQorCQlzdGFfaWQgPSBpd2xfc3RhX2lkX29yX2Jyb2FkY2FzdChwcml2LCBzdGEpOworCQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CkBAIC00MDA2LDcgKzM5MzUsNyBAQAogCSAqICAgc3BhY2UgZm9yIHRoaXMgZHJpdmVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KIAlodyA9IGl3bF9hbGxvY19hbGwoY2ZnLCAmaXdsMzk0NV9od19vcHMpOwogCWlmIChodyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7CisJCXByX2VycigiQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQwMjgsOSArMzk1Nyw2IEBACiAJcHJpdi0+cGNpX2RldiA9IHBkZXY7CiAJcHJpdi0+aW50YV9tYXNrID0gQ1NSX0lOSV9TRVRfTUFTSzsKIAotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0JYXRvbWljX3NldCgmcHJpdi0+cmVzdHJpY3RfcmVmY250LCAwKTsKLSNlbmRpZgogCWlmIChpd2xfYWxsb2NfdHJhZmZpY19tZW0ocHJpdikpCiAJCUlXTF9FUlIocHJpdiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGdlbmVyYXRlIHRyYWZmaWMgbG9nXG4iKTsKIApAQCAtNDA5OSw5ICs0MDI1LDggQEAKIAl9CiAJLyogTUFDIEFkZHJlc3MgbG9jYXRpb24gaW4gRUVQUk9NIHNhbWUgZm9yIDM5NDUvNDk2NSAqLwogCWVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JbWVtY3B5KHByaXYtPm1hY19hZGRyLCBlZXByb20tPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIk1BQyBhZGRyZXNzOiAlcE1cbiIsIHByaXYtPm1hY19hZGRyKTsKLQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgcHJpdi0+bWFjX2FkZHIpOworCUlXTF9ERUJVR19JTkZPKHByaXYsICJNQUMgYWRkcmVzczogJXBNXG4iLCBlZXByb20tPm1hY19hZGRyZXNzKTsKKwlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgZWVwcm9tLT5tYWNfYWRkcmVzcyk7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioKIAkgKiA1LiBTZXR1cCBIVyBDb25zdGFudHMKQEAgLTQzMDIsMTkgKzQyMjcsMTggQEAKIHsKIAogCWludCByZXQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOwotCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIjogIiBEUlZfQ09QWVJJR0hUICJcbiIpOworCXByX2luZm8oRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7CisJcHJfaW5mbyhEUlZfQ09QWVJJR0hUICJcbiIpOwogCiAJcmV0ID0gaXdsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQotCQkgICAgICAgIlVuYWJsZSB0byByZWdpc3RlciByYXRlIGNvbnRyb2wgYWxnb3JpdGhtOiAlZFxuIiwgcmV0KTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgcmF0ZSBjb250cm9sIGFsZ29yaXRobTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaXdsMzk0NV9kcml2ZXIpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKIAkJZ290byBlcnJvcl9yZWdpc3RlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NmZzgwMjExLmMKaW5kZXggOTAyZTk1Zi4uNjA2MTk2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NmZzgwMjExLmMKQEAgLTY3MCwyMCArNjcwLDI0IEBACiB9CiAKIHN0YXRpYyBpbnQgaXdtX2NmZzgwMjExX3NldF90eHBvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIGVudW0gdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgZGJtKQorCQkJCSAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgbWJtKQogewogCXN0cnVjdCBpd21fcHJpdiAqaXdtID0gd2lwaHlfdG9faXdtKHdpcGh5KTsKIAlpbnQgcmV0OwogCiAJc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBUWF9QT1dFUl9BVVRPTUFUSUM6CisJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0FVVE9NQVRJQzoKIAkJcmV0dXJuIDA7Ci0JY2FzZSBUWF9QT1dFUl9GSVhFRDoKKwljYXNlIE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6CisJCWlmIChtYm0gPCAwIHx8IChtYm0gJSAxMDApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJCWlmICghdGVzdF9iaXQoSVdNX1NUQVRVU19SRUFEWSwgJml3bS0+c3RhdHVzKSkKIAkJCXJldHVybiAwOwogCiAJCXJldCA9IGl3bV91bWFjX3NldF9jb25maWdfZml4KGl3bSwgVU1BQ19QQVJBTV9UQkxfQ0ZHX0ZJWCwKLQkJCQkJICAgICAgQ0ZHX1RYX1BXUl9MSU1JVF9VU1IsIGRibSAqIDIpOworCQkJCQkgICAgICBDRkdfVFhfUFdSX0xJTUlUX1VTUiwKKwkJCQkJICAgICAgTUJNX1RPX0RCTShtYm0pICogMik7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY29tbWFuZHMuaAppbmRleCA3ZTE2YmNmLi42NDIxNjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY29tbWFuZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY29tbWFuZHMuaApAQCAtNTYsNyArNTYsNyBAQAogCiBzdHJ1Y3QgaXdtX3VtYWNfY21kX3Jlc2V0IHsKIAlfX2xlMzIgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19QQVJBTV9UQkxfT1JEX0ZJWCAgICAweDAKICNkZWZpbmUgVU1BQ19QQVJBTV9UQkxfT1JEX1ZBUiAgICAweDEKQEAgLTIyMCwzNyArMjIwLDM3IEBACiAJX19sZTE2IHRibDsKIAlfX2xlMTYga2V5OwogCV9fbGUzMiB2YWx1ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX2NtZF9zZXRfcGFyYW1fdmFyIHsKIAlfX2xlMTYgdGJsOwogCV9fbGUxNiBrZXk7CiAJX19sZTE2IGxlbjsKIAlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19jbWRfZ2V0X3BhcmFtIHsKIAlfX2xlMTYgdGJsOwogCV9fbGUxNiBrZXk7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19jbWRfZ2V0X3BhcmFtX3Jlc3AgewogCV9fbGUxNiB0Ymw7CiAJX19sZTE2IGtleTsKIAlfX2xlMTYgbGVuOwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX2NtZF9lZXByb21fcHJveHlfaGRyIHsKIAlfX2xlMzIgdHlwZTsKIAlfX2xlMzIgb2Zmc2V0OwogCV9fbGUzMiBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19jbWRfZWVwcm9tX3Byb3h5IHsKIAlzdHJ1Y3QgaXdtX3VtYWNfY21kX2VlcHJvbV9wcm94eV9oZHIgaGRyOwogCXU4IGJ1ZlswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJV01fVU1BQ19DTURfRUVQUk9NX1RZUEVfUkVBRCAgICAgICAweDEKICNkZWZpbmUgSVdNX1VNQUNfQ01EX0VFUFJPTV9UWVBFX1dSSVRFICAgICAgMHgyCkBAIC0yNjcsMTMgKzI2NywxMyBAQAogCXU4IHJlc2VydmVkOwogCXU4IGZsYWdzOwogCV9fbGUzMiBjaGFubmVsc19tYXNrOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfY21kX2dldF9jaGFubmVsX2xpc3QgewogCV9fbGUxNiBjb3VudDsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CiAJc3RydWN0IGl3bV91bWFjX2NoYW5uZWxfaW5mbyBjaFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKiBVTUFDIFdpRmkgaW50ZXJmYWNlIGNvbW1hbmRzICovCkBAIC0zMDQsNyArMzA0LDcgQEAKIAl1OCBzc2lkX2xlbjsKIAl1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dOwogCXU4IHJlc2VydmVkWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfY21kX3NjYW5fcmVxdWVzdCB7CiAJc3RydWN0IGl3bV91bWFjX3dpZmlfaWYgaGRyOwpAQCAtMzE0LDcgKzMxNCw3IEBACiAJdTggdGltZW91dDsgLyogSW4gc2Vjb25kcyAqLwogCXU4IHJlc2VydmVkOwogCXN0cnVjdCBpd21fdW1hY19zc2lkIHNzaWRzW1VNQUNfV0lGSV9JRl9QUk9CRV9PUFRJT05fTUFYXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBVTUFDX0NJUEhFUl9UWVBFX05PTkUJCTB4RkYKICNkZWZpbmUgVU1BQ19DSVBIRVJfVFlQRV9VU0VfR1JPVVBDQVNUCTB4MDAKQEAgLTM1Nyw3ICszNTcsNyBAQAogCXU4IHVjYXN0X2NpcGhlcjsKIAl1OCBtY2FzdF9jaXBoZXI7CiAJdTggZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19pYnNzIHsKIAl1OCBiZWFjb25faW50ZXJ2YWw7CS8qIGluIG1pbGxpc2Vjb25kICovCkBAIC0zNjYsNyArMzY2LDcgQEAKIAl1OCBiYW5kOwogCXU4IGNoYW5uZWw7CiAJdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19NT0RFX0JTUwkwCiAjZGVmaW5lIFVNQUNfTU9ERV9JQlNTCTEKQEAgLTM4NSwxMyArMzg1LDEzIEBACiAJX19sZTE2IGZsYWdzOwogCXU4IHdpcmVsZXNzX21vZGU7CiAJdTggYnNzX251bTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX2ludmFsaWRhdGVfcHJvZmlsZSB7CiAJc3RydWN0IGl3bV91bWFjX3dpZmlfaWYgaGRyOwogCXU4IHJlYXNvbjsKIAl1OCByZXNlcnZlZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogRW5jcnlwdGlvbiBrZXkgY29tbWFuZHMgKi8KIHN0cnVjdCBpd21fdW1hY19rZXlfd2VwNDAgewpAQCAtNDAwLDcgKzQwMCw3IEBACiAJdTgga2V5W1dMQU5fS0VZX0xFTl9XRVA0MF07CiAJdTggc3RhdGljX2tleTsKIAl1OCByZXNlcnZlZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX2tleV93ZXAxMDQgewogCXN0cnVjdCBpd21fdW1hY193aWZpX2lmIGhkcjsKQEAgLTQwOCw3ICs0MDgsNyBAQAogCXU4IGtleVtXTEFOX0tFWV9MRU5fV0VQMTA0XTsKIAl1OCBzdGF0aWNfa2V5OwogCXU4IHJlc2VydmVkWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElXTV9US0lQX0tFWV9TSVpFIDE2CiAjZGVmaW5lIElXTV9US0lQX01JQ19TSVpFIDgKQEAgLTQyMCw3ICs0MjAsNyBAQAogCXU4IHRraXBfa2V5W0lXTV9US0lQX0tFWV9TSVpFXTsKIAl1OCBtaWNfcnhfa2V5W0lXTV9US0lQX01JQ19TSVpFXTsKIAl1OCBtaWNfdHhfa2V5W0lXTV9US0lQX01JQ19TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX2tleV9jY21wIHsKIAlzdHJ1Y3QgaXdtX3VtYWNfd2lmaV9pZiBoZHI7CkBAIC00MjgsMjcgKzQyOCwyNyBAQAogCXU4IGl2X2NvdW50WzZdOwogCXU4IHJlc2VydmVkWzJdOwogCXU4IGtleVtXTEFOX0tFWV9MRU5fQ0NNUF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19rZXlfcmVtb3ZlIHsKIAlzdHJ1Y3QgaXdtX3VtYWNfd2lmaV9pZiBoZHI7CiAJc3RydWN0IGl3bV91bWFjX2tleV9oZHIga2V5X2hkcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX3R4X2tleV9pZCB7CiAJc3RydWN0IGl3bV91bWFjX3dpZmlfaWYgaGRyOwogCXU4IGtleV9pZHg7CiAJdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19wd3JfdHJpZ2dlciB7CiAJc3RydWN0IGl3bV91bWFjX3dpZmlfaWYgaGRyOwogCV9fbGUzMiByZXNldmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfY21kX3N0YXRzX3JlcSB7CiAJX19sZTMyIGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfY21kX3N0b3BfcmVzdW1lX3R4IHsKIAl1OCBmbGFnczsKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCV9fbGUxNiBzdG9wX3Jlc3VtZV90aWRfbXNrOwogCV9fbGUxNiBsYXN0X3NlcV9udW1bSVdNX1VNQUNfVElEX05SXTsKIAl1MTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSVdNX0NNRF9QTUtJRF9BREQgICAxCiAjZGVmaW5lIElXTV9DTURfUE1LSURfREVMICAgMgpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCV9fbGUxNiByZXNlcnZlZDsKIAl1OCBwbWtpZFtXTEFOX1BNS0lEX0xFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIExNQUMgY29tbWFuZHMgKi8KIGludCBpd21fcmVhZF9tYWMoc3RydWN0IGl3bV9wcml2ICppd20sIHU4ICptYWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2hhbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2hhbC5jCmluZGV4IDk1MzFiMTguLjkwN2FjODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9oYWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvaGFsLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqICAgTE1BQy4gSWYgeW91IGxvb2sgYXQgTE1BQyBjb21tYW5kcyB5b3UnbGwgc2UgdGhhdCB0aGV5CiAgKiAgIGFyZSBhY3R1YWxseSByZWd1bGFyIGl3bHdpZmkgdGFyZ2V0IGNvbW1hbmRzIGVuY2Fwc3VsYXRlZAogICogICBpbnRvIGEgc3BlY2lhbCBVTUFDIGNvbW1hbmQgY2FsbGVkIFVNQUMgcGFzc3Rocm91Z2guCi0gKiAgIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoZSB0aGUgaG9zdCB0YWxrcyBleGNsdXNpdmVseQorICogICBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGUgaG9zdCB0YWxrcyBleGNsdXNpdmVseQogICogICB0byB0aGUgVU1BQyBhbmQgc28gdGhlcmUgbmVlZHMgdG8gYmUgYSBzcGVjaWFsIFVNQUMKICAqICAgY29tbWFuZCBmb3IgdGFsa2luZyB0byB0aGUgTE1BQy4KICAqICAgVGhpcyBpcyBob3cgYSB3aWZpIGNvbW1hbmQgaXMgbGF5ZWQgb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2l3bS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2l3bS5oCmluZGV4IDEzMjY2YzMuLjUxZDdlZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9pd20uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvaXdtLmgKQEAgLTE2Miw3ICsxNjIsNyBAQAogCXU4IG1hY1tFVEhfQUxFTl07CiAJdTgga2V5X2lkeDsKIAl1OCBtdWx0aWNhc3Q7IC8qIEJDYXN0IGVuY3J5cHQgJiBCQ2FzdCBkZWNyeXB0IG9mIGZyYW1lcyBGUk9NIG1hYyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX2tleSB7CiAJc3RydWN0IGl3bV91bWFjX2tleV9oZHIgaGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2xtYWMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9sbWFjLmgKaW5kZXggYTg1NWE5OS4uNWRkY2RmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2xtYWMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvbG1hYy5oCkBAIC00Myw3ICs0Myw3IEBACiAJdTggaWQ7CiAJdTggZmxhZ3M7CiAJX19sZTE2IHNlcV9udW07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIExNQUMgY29tbWFuZHMgKi8KICNkZWZpbmUgQ0FMSUJfQ0ZHX0ZMQUdfU0VORF9DT01QTEVURV9OVEZZX0FGVEVSX01TSyAgMHgxCkBAIC01NCwyMyArNTQsMjMgQEAKIAlfX2xlMzIgc2VuZF9yZXM7IC8qIDEgZm9yIHNlbmRpbmcgYmFjayByZXN1bHRzICovCiAJX19sZTMyIGFwcGx5X3JlczsgLyogMSBmb3IgYXBwbHlpbmcgY2FsaWJyYXRpb24gcmVzdWx0cyB0byBIVyAqLwogCV9fbGUzMiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV9sbWFjX2NhbF9jZmdfc3RhdHVzIHsKIAlzdHJ1Y3QgaXdtX2xtYWNfY2FsX2NmZ19lbHQgaW5pdDsKIAlzdHJ1Y3QgaXdtX2xtYWNfY2FsX2NmZ19lbHQgcGVyaW9kaWM7CiAJX19sZTMyIGZsYWdzOyAvKiBDQUxJQl9DRkdfRkxBR19TRU5EX0NPTVBMRVRFX05URllfQUZURVJfTVNLICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fbG1hY19jYWxfY2ZnX2NtZCB7CiAJc3RydWN0IGl3bV9sbWFjX2NhbF9jZmdfc3RhdHVzIHVjb2RlX2NmZzsKIAlzdHJ1Y3QgaXdtX2xtYWNfY2FsX2NmZ19zdGF0dXMgZHJpdmVyX2NmZzsKIAlfX2xlMzIgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fbG1hY19jYWxfY2ZnX3Jlc3AgewogCV9fbGUzMiBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSVdNX0NBUkRfU1RBVEVfU1dfSFdfRU5BQkxFRAkweDAwCiAjZGVmaW5lIElXTV9DQVJEX1NUQVRFX0hXX0RJU0FCTEVECTB4MDEKQEAgLTgwLDcgKzgwLDcgQEAKIAogc3RydWN0IGl3bV9sbWFjX2NhcmRfc3RhdGUgewogCV9fbGUzMiBmbGFnczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBDT0VYX1BSSU9SSVRZX1RBQkxFX0NNRApAQCAtMTMxLDcgKzEzMSw3IEBACiAJdTggd2luX21lZF9wcmlvOwogCXU4IHJlc2VydmVkOwogCXU4IGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIENPRVhfRkxBR1NfU1RBX1RBQkxFX1ZBTElEX01TSwkJMHgxCiAjZGVmaW5lIENPRVhfRkxBR1NfVU5BU1NPQ19XQUtFVVBfVU1BU0tfTVNLCTB4NApAQCAtMTQyLDcgKzE0Miw3IEBACiAJdTggZmxhZ3M7CiAJdTggcmVzZXJ2ZWRbM107CiAJc3RydWN0IGNvZXhfZXZlbnQgc3RhX3ByaW9bQ09FWF9FVkVOVFNfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQ29leGlzdGVuY2UgZGVmaW5pdGlvbnMKICAqCkBAIC0xOTIsNyArMTkyLDcgQEAKIAl1MzIgZXhpdF90aHJlc2hvbGQ7CiAJdTMyIHJlc2VydmVkOwogCXUzMiBlbnRyeV90aHJlc2hvbGQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyogTE1BQyBPUCBDT0RFUyAqLwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJdTggZmlyc3RfZ3JwOwogCXU4IGdycF9udW07CiAJdTggYWxsX2RhdGFfdmFsaWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSVdNX0xNQUNfQ0FMSUJfRlJFUV9HUk9VUFNfTlIJNwogI2RlZmluZSBJV01fQ0FMSUJfRlJFUV9HUk9VUFNfTlIJNQpAQCAtNDM3LDIwICs0MzcsMjAgQEAKIHN0cnVjdCBpd21fY2FsaWJfcnhpcV9lbnRyeSB7CiAJdTE2IHB0YW1fcG9zdGRpc3RfYXJzOwogCXUxNiBwdGFtX3Bvc3RkaXN0X2FyYzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV9jYWxpYl9yeGlxX2dyb3VwIHsKIAlzdHJ1Y3QgaXdtX2NhbGliX3J4aXFfZW50cnkgbW9kZVtJV01fQ0FMSUJfRENfTU9ERVNfTlJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX2xtYWNfY2FsaWJfcnhpcSB7CiAJc3RydWN0IGl3bV9jYWxpYl9yeGlxX2dyb3VwIGdyb3VwW0lXTV9MTUFDX0NBTElCX0ZSRVFfR1JPVVBTX05SXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV9jYWxpYl9yeGlxIHsKIAlzdHJ1Y3QgaXdtX2xtYWNfY2FsaWJfaGRyIGhkcjsKIAlzdHJ1Y3QgaXdtX2NhbGliX3J4aXFfZ3JvdXAgZ3JvdXBbSVdNX0NBTElCX0ZSRVFfR1JPVVBTX05SXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBMTUFDX1NUQV9JRF9TRUVECTB4MGYKICNkZWZpbmUgTE1BQ19TVEFfSURfUE9TCQkwCkBAIC00NjMsNyArNDYzLDcgQEAKIAl1OCBwYV9pbnRlZ19yZXNfQVszXTsKIAl1OCBwYV9pbnRlZ19yZXNfQlszXTsKIAl1OCBwYV9pbnRlZ19yZXNfQ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV9sbWFjX3R4X3Jlc3AgewogCXU4IGZyYW1lX2NudDsgLyogMS1ubyBhZ2dyZWdhdGlvbiwgZ3JlYXRlciB0aGVuIDEgLSBhZ2dyZWdhdGlvbiAqLwpAQCAtNDc5LDYgKzQ3OSw2IEBACiAJdTggcmFfdGlkOwogCV9fbGUxNiBmcmFtZV9jdGw7CiAJX19sZTMyIHN0YXR1czsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9yeC5jCmluZGV4IGUxMTg0ZGUuLmMwMmZjZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9yeC5jCkBAIC0zMjEsMTQgKzMyMSwxNCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQl0aWNrZXRfbm9kZS0+dGlja2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bV9yeF90aWNrZXQpLCBHRlBfS0VSTkVMKTsKKwl0aWNrZXRfbm9kZS0+dGlja2V0ID0ga21lbWR1cCh0aWNrZXQsIHNpemVvZihzdHJ1Y3QgaXdtX3J4X3RpY2tldCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0aWNrZXRfbm9kZS0+dGlja2V0KSB7CiAJCUlXTV9FUlIoaXdtLCAiQ291bGRuJ3QgYWxsb2NhdGUgUlggdGlja2V0XG4iKTsKIAkJa2ZyZWUodGlja2V0X25vZGUpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQltZW1jcHkodGlja2V0X25vZGUtPnRpY2tldCwgdGlja2V0LCBzaXplb2Yoc3RydWN0IGl3bV9yeF90aWNrZXQpKTsKIAlJTklUX0xJU1RfSEVBRCgmdGlja2V0X25vZGUtPm5vZGUpOwogCiAJcmV0dXJuIHRpY2tldF9ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3VtYWMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS91bWFjLmgKaW5kZXggMGNiYmEzZS4uNGExMzdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3VtYWMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvdW1hYy5oCkBAIC00MiwxOSArNDIsMTkgQEAKIHN0cnVjdCBpd21fdWRtYV9pbl9oZHIgewogCV9fbGUzMiBjbWQ7CiAJX19sZTMyIHNpemU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdWRtYV9vdXRfbm9ud2lmaV9oZHIgewogCV9fbGUzMiBjbWQ7CiAJX19sZTMyIGFkZHI7CiAJX19sZTMyIG9wMV9zejsKIAlfX2xlMzIgb3AyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VkbWFfb3V0X3dpZmlfaGRyIHsKIAlfX2xlMzIgY21kOwogCV9fbGUzMiBtZXRhX2RhdGE7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFNlcXVlbmNlIG51bWJlcmluZyAqLwogI2RlZmluZSBVTUFDX1dJRklfU0VRX05VTV9CQVNFCQkxCkBAIC00MDgsMTIgKzQwOCwxMiBAQAogCV9fbGUxNiBmbGFnczsKIAl1OCBwYXlsb2FkX29mZnNldDsgLyogaW5jbHVkZXM6IE1BQyBoZWFkZXIsIHBhZCwgSVYgKi8KIAl1OCB0YWlsX2xlbjsgLyogaW5jbHVkZXM6IE1JQywgSUNWLCBDUkMgKHcvbyBTVEFUVVMpICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fcnhfbXBkdV9oZHIgewogCV9fbGUxNiBsZW47CiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBVTUFDIFNXIFdJRkkgQVBJICovCiAKQEAgLTQyMSwzMSArNDIxLDMxIEBACiAJdTggY21kOwogCXU4IGZsYWdzOwogCV9fbGUxNiBzZXFfbnVtOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfZndfY21kX2hkciB7CiAJX19sZTMyIG1ldGFfZGF0YTsKIAlzdHJ1Y3QgaXdtX2Rldl9jbWRfaGRyIGNtZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX3dpZmlfb3V0X2hkciB7CiAJc3RydWN0IGl3bV91ZG1hX291dF93aWZpX2hkciBod19oZHI7CiAJc3RydWN0IGl3bV91bWFjX2Z3X2NtZF9oZHIgc3dfaGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfbm9ud2lmaV9vdXRfaGRyIHsKIAlzdHJ1Y3QgaXdtX3VkbWFfb3V0X25vbndpZmlfaGRyIGh3X2hkcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX3dpZmlfaW5faGRyIHsKIAlzdHJ1Y3QgaXdtX3VkbWFfaW5faGRyIGh3X2hkcjsKIAlzdHJ1Y3QgaXdtX3VtYWNfZndfY21kX2hkciBzd19oZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19ub253aWZpX2luX2hkciB7CiAJc3RydWN0IGl3bV91ZG1hX2luX2hkciBod19oZHI7CiAJX19sZTMyIHRpbWVfc3RhbXA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSVdNX1VNQUNfUEFHRV9TSVpFCTB4MjAwCiAKQEAgLTUyMSw3ICs1MjEsNyBAQAogCXU4IHN0YXR1czsKIAl1OCBmbGFnczsKIAlfX2xlMTYgYnVmX3NpemU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19ST0FNX1JFQVNPTl9GSVJTVF9TRUxFQ1RJT04JMHgxCiAjZGVmaW5lIFVNQUNfUk9BTV9SRUFTT05fQVBfREVBVVRICQkweDIKQEAgLTUzNSw3ICs1MzUsNyBAQAogCV9fbGUzMiByb2FtX3JlYXNvbjsKIAl1OCBic3NpZFtFVEhfQUxFTl07CiAJdTggcmVzZXJ2ZWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19BU1NPQ19DT01QTEVURV9TVUNDRVNTCQkweDAKICNkZWZpbmUgVU1BQ19BU1NPQ19DT01QTEVURV9GQUlMVVJFCQkweDEKQEAgLTU0Niw3ICs1NDYsNyBAQAogCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1OCBiYW5kOwogCXU4IGNoYW5uZWw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19QUk9GSUxFX0lOVkFMSURfQVNTT0NfVElNRU9VVAkweDAKICNkZWZpbmUgVU1BQ19QUk9GSUxFX0lOVkFMSURfUk9BTV9USU1FT1VUCTB4MQpAQCAtNTU2LDcgKzU1Niw3IEBACiBzdHJ1Y3QgaXdtX3VtYWNfbm90aWZfcHJvZmlsZV9pbnZhbGlkYXRlIHsKIAlzdHJ1Y3QgaXdtX3VtYWNfbm90aWZfd2lmaV9pZiBtbG1lX2hkcjsKIAlfX2xlMzIgcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFVNQUNfU0NBTl9SRVNVTFRfU1VDQ0VTUyAgMHgwCiAjZGVmaW5lIFVNQUNfU0NBTl9SRVNVTFRfQUJPUlRFRCAgMHgxCkBAIC01NjgsNyArNTY4LDcgQEAKIAlfX2xlMzIgdHlwZTsKIAlfX2xlMzIgcmVzdWx0OwogCXU4IHNlcV9udW07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19PUENPREVfQUREX01PRElGWQkweDAKICNkZWZpbmUgVU1BQ19PUENPREVfUkVNT1ZFCTB4MQpAQCAtNTgyLDcgKzU4Miw3IEBACiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogCXU4IHN0YV9pZDsgLyogYml0cyAwLTM6IHN0YXRpb24gSUQsIGJpdHMgNC03OiBzdGF0aW9uIGNvbG9yICovCiAJdTggZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVU1BQ19CQU5EXzJHSFogMAogI2RlZmluZSBVTUFDX0JBTkRfNUdIWiAxCkBAIC02MDEsNyArNjAxLDcgQEAKIAlzOCByc3NpOwogCXU4IHJlc2VydmVkOwogCXU4IGZyYW1lX2J1ZlsxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJV01fQlNTX1JFTU9WRV9JTkRFWF9NU0sgICAgICAgICAgIDB4MGZmZgogI2RlZmluZSBJV01fQlNTX1JFTU9WRV9GTEFHU19NU0sgICAgICAgICAgIDB4ZmMwMApAQCAtNjE0LDEzICs2MTQsMTMgQEAKIAlzdHJ1Y3QgaXdtX3VtYWNfbm90aWZfd2lmaV9pZiBtbG1lX2hkcjsKIAlfX2xlMzIgY291bnQ7CiAJX19sZTE2IGVudHJpZXNbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19ub3RpZl9tZ3RfZnJhbWUgewogCXN0cnVjdCBpd21fdW1hY19ub3RpZl93aWZpX2lmIG1sbWVfaGRyOwogCV9fbGUxNiBsZW47CiAJdTggZnJhbWVbMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd21fdW1hY19ub3RpZl9hbGl2ZSB7CiAJc3RydWN0IGl3bV91bWFjX3dpZmlfaW5faGRyIGhkcjsKQEAgLTYzMCwxMyArNjMwLDEzIEBACiAJX19sZTE2IHJlc2VydmVkMjsKIAlfX2xlMTYgcGFnZV9ncnBfY291bnQ7CiAJX19sZTMyIHBhZ2VfZ3JwX3N0YXRlW0lXTV9NQUNTX09VVF9HUk9VUFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfbm90aWZfaW5pdF9jb21wbGV0ZSB7CiAJc3RydWN0IGl3bV91bWFjX3dpZmlfaW5faGRyIGhkcjsKIAlfX2xlMTYgc3RhdHVzOwogCV9fbGUxNiByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogZXJyb3IgY2F0ZWdvcmllcyAqLwogZW51bSB7CkBAIC02NjcsMTIgKzY2NywxMiBAQAogCV9fbGUzMiBkYm1fYnVmX2VuZDsKIAlfX2xlMzIgZGJtX2J1Zl93cml0ZV9wdHI7CiAJX19sZTMyIGRibV9idWZfY3ljbGVfY250OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfbm90aWZfZXJyb3IgewogCXN0cnVjdCBpd21fdW1hY193aWZpX2luX2hkciBoZHI7CiAJc3RydWN0IGl3bV9md19lcnJvcl9oZHIgZXJyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFVNQUNfREVBTExPQ19OVEZZX0NIQU5HRVNfQ05UX1BPUwkwCiAjZGVmaW5lIFVNQUNfREVBTExPQ19OVEZZX0NIQU5HRVNfQ05UX1NFRUQJMHhmZgpAQCAtNjg3LDIwICs2ODcsMjAgQEAKIAlzdHJ1Y3QgaXdtX3VtYWNfd2lmaV9pbl9oZHIgaGRyOwogCV9fbGUzMiBjaGFuZ2VzOwogCV9fbGUzMiBncnBfaW5mb1tJV01fTUFDU19PVVRfR1JPVVBTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3bV91bWFjX25vdGlmX3dpZmlfc3RhdHVzIHsKIAlzdHJ1Y3QgaXdtX3VtYWNfd2lmaV9pbl9oZHIgaGRyOwogCV9fbGUxNiBzdGF0dXM7CiAJX19sZTE2IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdtX3VtYWNfbm90aWZfcnhfdGlja2V0IHsKIAlzdHJ1Y3QgaXdtX3VtYWNfd2lmaV9pbl9oZHIgaGRyOwogCXU4IG51bV90aWNrZXRzOwogCXU4IHJlc2VydmVkWzNdOwogCXN0cnVjdCBpd21fcnhfdGlja2V0IHRpY2tldHNbMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFR4L1J4IHJhdGVzIHdpbmRvdyAobnVtYmVyIG9mIG1heCBvZiBsYXN0IHVwZGF0ZSB3aW5kb3cgcGVyIHNlY29uZCkgKi8KICNkZWZpbmUgVU1BQ19OVEZfUkFURV9TQU1QTEVfTlIJNApAQCAtNzU4LDcgKzc1OCw3IEBACiAJX19sZTMyIHJvYW1fdW5hc3NvYzsKIAlfX2xlMzIgcm9hbV9kZWF1dGg7CiAJX19sZTMyIHJvYW1fYXBfbG9hZGJsYW5jZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBVTUFDX1NUT1BfVFhfRkxBRyAgICAweDEKICNkZWZpbmUgVU1BQ19SRVNVTUVfVFhfRkxBRyAgMHgyCkBAIC03NzAsNyArNzcwLDcgQEAKIAl1OCBmbGFnczsgLyogVU1BQ18qX1RYX0ZMQUdfKiAqLwogCXU4IHN0YV9pZDsKIAlfX2xlMTYgc3RvcF9yZXN1bWVfdGlkX21zazsgLyogdGlkIGJpdG1hc2sgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBVTUFDX01BWF9OVU1fUE1LSURTIDQKIApAQCAtNzc5LDcgKzc3OSw3IEBACiAJdTggb2lkOwogCXU4IGZsYWdzOwogCV9fbGUxNiBidWZfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBJV01fU0VRX05VTV9IT1NUX01TSwkweDAwMDAKICNkZWZpbmUgSVdNX1NFUV9OVU1fVU1BQ19NU0sJMHg0MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlCmluZGV4IDQ1ZTg3MGUuLmY3ZDAxYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlCkBAIC0xLDQgKzEsMyBAQAotbGliZXJ0YXMteSArPSBhc3NvYy5vCiBsaWJlcnRhcy15ICs9IGNmZy5vCiBsaWJlcnRhcy15ICs9IGNtZC5vCiBsaWJlcnRhcy15ICs9IGNtZHJlc3AubwpAQCAtNiw5ICs1LDcgQEAKIGxpYmVydGFzLXkgKz0gZXRodG9vbC5vCiBsaWJlcnRhcy15ICs9IG1haW4ubwogbGliZXJ0YXMteSArPSByeC5vCi1saWJlcnRhcy15ICs9IHNjYW4ubwogbGliZXJ0YXMteSArPSB0eC5vCi1saWJlcnRhcy15ICs9IHdleHQubwogbGliZXJ0YXMtJChDT05GSUdfTElCRVJUQVNfTUVTSCkgKz0gbWVzaC5vCiAKIHVzYjh4eHgtb2JqcyArPSBpZl91c2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvUkVBRE1FIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvUkVBRE1FCmluZGV4IDI3MjZjMDQuLjYwZmQxYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL1JFQURNRQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9SRUFETUUKQEAgLTIyNiw2ICsyMjYsMTggQEAKICAgICBBbGwgZW50cmllcyBpbiB0aGUgc2NhbiB0YWJsZSAobm90IGp1c3QgdGhlIG5ldyBzY2FuIGRhdGEgd2hlbiBrZWVwPTEpCiAgICAgd2lsbCBiZSBkaXNwbGF5ZWQgdXBvbiBjb21wbGV0aW9uIGJ5IHVzZSBvZiB0aGUgZ2V0c2NhbnRhYmxlIGlvY3RsLgogCitob3N0c2xlZXAKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBlbmFibGUvZGlzYWJsZSBob3N0IHNsZWVwLgorCU5vdGU6IEhvc3Qgc2xlZXAgcGFyYW1ldGVycyBzaG91bGQgYmUgY29uZmlndXJlZCB1c2luZworCSJldGh0b29sIC1zIGV0aFggd29sIFgiIGNvbW1hbmQgYmVmb3JlIGVuYWJsaW5nIGhvc3Qgc2xlZXAuCisKKwlQYXRoOiAvc3lzL2tlcm5lbC9kZWJ1Zy9saWJlcnRhc193aXJlbGVzcy9ldGhYLworCisJVXNhZ2U6CisJCWNhdCBob3N0c2xlZXA6IHJlYWRzIHRoZSBjdXJyZW50IGhvc3RzbGVlcCBzdGF0ZQorCQllY2hvICIxIiA+IGhvc3RzbGVlcCA6IGVuYWJsZSBob3N0IHNsZWVwLgorCQllY2hvICIwIiA+IGhvc3RzbGVlcCA6IGRpc2FibGUgaG9zdCBzbGVlcAorCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIElXQ09ORklHIENPTU1BTkRTCiA9PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTA2MDcwZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDYsIFJlZCBIYXQsIEluYy4gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L2xpYjgwMjExLmg+Ci0KLSNpbmNsdWRlICJhc3NvYy5oIgotI2luY2x1ZGUgImRlY2wuaCIKLSNpbmNsdWRlICJob3N0LmgiCi0jaW5jbHVkZSAic2Nhbi5oIgotI2luY2x1ZGUgImNtZC5oIgotCi1zdGF0aWMgY29uc3QgdTggYnNzaWRfYW55W0VUSF9BTEVOXSAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDIpKSkgPQotCXsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9Owotc3RhdGljIGNvbnN0IHU4IGJzc2lkX29mZltFVEhfQUxFTl0gIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgyKSkpID0KLQl7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotLyogVGhlIGZpcm13YXJlIG5lZWRzIHRoZSBmb2xsb3dpbmcgYml0cyBtYXNrZWQgb3V0IG9mIHRoZSBiZWFjb24tZGVyaXZlZAotICogY2FwYWJpbGl0eSBmaWVsZCB3aGVuIGFzc29jaWF0aW5nL2pvaW5pbmcgdG8gYSBCU1M6Ci0gKiAgOSAoUW9TKSwgMTEgKEFQU0QpLCAxMiAodW51c2VkKSwgMTQgKHVudXNlZCksIDE1ICh1bnVzZWQpCi0gKi8KLSNkZWZpbmUgQ0FQSU5GT19NQVNLCSh+KDB4ZGEwMCkpCi0KLS8qKgotICogODAyLjExYi9nIHN1cHBvcnRlZCBiaXRyYXRlcyAoaW4gNTAwS2IvcyB1bml0cykKLSAqLwotdTggbGJzX2JnX3JhdGVzW01BWF9SQVRFU10gPQotICAgIHsgMHgwMiwgMHgwNCwgMHgwYiwgMHgxNiwgMHgwYywgMHgxMiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwgMHg2YywKLTB4MDAsIDB4MDAgfTsKLQotCi1zdGF0aWMgaW50IGFzc29jX2hlbHBlcl93ZXBfa2V5cyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEpOwotCi0vKioKLSAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyBjb21tb24gcmF0ZXMgYmV0d2VlbiByYXRlcyBhbmQgY2FyZCByYXRlcy4KLSAqCi0gKiBJdCB3aWxsIGZpbGwgY29tbW9uIHJhdGVzIGluIHJhdGVzIGFzIG91dHB1dCBpZiBmb3VuZC4KLSAqCi0gKiBOT1RFOiBTZXR0aW5nIHRoZSBNU0Igb2YgdGhlIGJhc2ljIHJhdGVzIG5lZWQgdG8gYmUgdGFrZW4KLSAqICAgY2FyZSwgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHJhdGVzICAgICAgIHRoZSBidWZmZXIgd2hpY2gga2VlcHMgaW5wdXQgYW5kIG91dHB1dAotICogIEBwYXJhbSByYXRlc19zaXplICB0aGUgc2l6ZSBvZiByYXRlcyBidWZmZXI7IG5ldyBzaXplIG9mIGJ1ZmZlciBvbiByZXR1cm4sCi0gKiAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG9yaWdpbmFsIHJhdGVzX3NpemUKLSAqCi0gKiAgQHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IKLSAqLwotc3RhdGljIGludCBnZXRfY29tbW9uX3JhdGVzKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQl1OCAqcmF0ZXMsCi0JdTE2ICpyYXRlc19zaXplKQotewotCWludCBpLCBqOwotCXU4IGludGVyc2VjdGlvbltNQVhfUkFURVNdOwotCXUxNiBpbnRlcnNlY3Rpb25fc2l6ZTsKLQl1MTYgbnVtX3JhdGVzID0gMDsKLQotCWludGVyc2VjdGlvbl9zaXplID0gbWluX3QodTE2LCAqcmF0ZXNfc2l6ZSwgQVJSQVlfU0laRShpbnRlcnNlY3Rpb24pKTsKLQotCS8qIEFsbG93IGVhY2ggcmF0ZSBmcm9tICdyYXRlcycgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGJzX2JnX3JhdGVzKSAmJiBsYnNfYmdfcmF0ZXNbaV07IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgaW50ZXJzZWN0aW9uX3NpemUgJiYgcmF0ZXNbal07IGorKykgewotCQkJaWYgKHJhdGVzW2pdID09IGxic19iZ19yYXRlc1tpXSkKLQkJCQlpbnRlcnNlY3Rpb25bbnVtX3JhdGVzKytdID0gcmF0ZXNbal07Ci0JCX0KLQl9Ci0KLQlsYnNfZGViX2hleChMQlNfREVCX0pPSU4sICJBUCByYXRlcyAgICAiLCByYXRlcywgKnJhdGVzX3NpemUpOwotCWxic19kZWJfaGV4KExCU19ERUJfSk9JTiwgImNhcmQgcmF0ZXMgICIsIGxic19iZ19yYXRlcywKLQkJCUFSUkFZX1NJWkUobGJzX2JnX3JhdGVzKSk7Ci0JbGJzX2RlYl9oZXgoTEJTX0RFQl9KT0lOLCAiY29tbW9uIHJhdGVzIiwgaW50ZXJzZWN0aW9uLCBudW1fcmF0ZXMpOwotCWxic19kZWJfam9pbigiVFggZGF0YSByYXRlIDB4JTAyeFxuIiwgcHJpdi0+Y3VyX3JhdGUpOwotCi0JaWYgKCFwcml2LT5lbmFibGVod2F1dG8pIHsKLQkJZm9yIChpID0gMDsgaSA8IG51bV9yYXRlczsgaSsrKSB7Ci0JCQlpZiAoaW50ZXJzZWN0aW9uW2ldID09IHByaXYtPmN1cl9yYXRlKQotCQkJCWdvdG8gZG9uZTsKLQkJfQotCQlsYnNfcHJfYWxlcnQoIlByZXZpb3VzbHkgc2V0IGZpeGVkIGRhdGEgcmF0ZSAlI3ggaXNuJ3QgIgotCQkgICAgICAgImNvbXBhdGlibGUgd2l0aCB0aGUgbmV0d29yay5cbiIsIHByaXYtPmN1cl9yYXRlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotZG9uZToKLQltZW1zZXQocmF0ZXMsIDAsICpyYXRlc19zaXplKTsKLQkqcmF0ZXNfc2l6ZSA9IG51bV9yYXRlczsKLQltZW1jcHkocmF0ZXMsIGludGVyc2VjdGlvbiwgbnVtX3JhdGVzKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqICBAYnJpZWYgU2V0cyB0aGUgTVNCIG9uIGJhc2ljIHJhdGVzIGFzIHRoZSBmaXJtd2FyZSByZXF1aXJlcwotICoKLSAqIFNjYW4gdGhyb3VnaCBhbiBhcnJheSBhbmQgc2V0IHRoZSBNU0IgZm9yIGJhc2ljIGRhdGEgcmF0ZXMuCi0gKgotICogIEBwYXJhbSByYXRlcyAgICAgYnVmZmVyIG9mIGRhdGEgcmF0ZXMKLSAqICBAcGFyYW0gbGVuICAgICAgIHNpemUgb2YgYnVmZmVyCi0gKi8KLXN0YXRpYyB2b2lkIGxic19zZXRfYmFzaWNfcmF0ZV9mbGFncyh1OCAqcmF0ZXMsIHNpemVfdCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKHJhdGVzW2ldID09IDB4MDIgfHwgcmF0ZXNbaV0gPT0gMHgwNCB8fAotCQkgICAgcmF0ZXNbaV0gPT0gMHgwYiB8fCByYXRlc1tpXSA9PSAweDE2KQotCQkJcmF0ZXNbaV0gfD0gMHg4MDsKLQl9Ci19Ci0KLQotc3RhdGljIHU4IGl3X2F1dGhfdG9faWVlZV9hdXRoKHU4IGF1dGgpCi17Ci0JaWYgKGF1dGggPT0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCi0JCXJldHVybiAweDAwOwotCWVsc2UgaWYgKGF1dGggPT0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKLQkJcmV0dXJuIDB4MDE7Ci0JZWxzZSBpZiAoYXV0aCA9PSBJV19BVVRIX0FMR19MRUFQKQotCQlyZXR1cm4gMHg4MDsKLQotCWxic19kZWJfam9pbigiJXM6IGludmFsaWQgYXV0aCBhbGcgMHglWFxuIiwgX19mdW5jX18sIGF1dGgpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgYXV0aGVudGljYXRlIGNvbW1hbmQuICBBVVRIRU5USUNBVEUgb25seQotICogIHNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIHN1aXRlIGZvciBmdXR1cmUgYXNzb2NpYXRpb25zLCBhcyB0aGUgZmlybXdhcmUKLSAqICBoYW5kbGVzIGF1dGhlbnRpY2F0aW9uIGludGVybmFsbHkgZHVyaW5nIHRoZSBBU1NPQ0lBVEUgY29tbWFuZC4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSBic3NpZCAgICAgVGhlIHBlZXIgQlNTSUQgd2l0aCB3aGljaCB0byBhdXRoZW50aWNhdGUKLSAqICBAcGFyYW0gYXV0aCAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiBtb2RlIHRvIHVzZSAoZnJvbSB3aXJlbGVzcy5oKQotICoKLSAqICBAcmV0dXJuICAgICAgICAgMCBvciAtMQotICovCi1zdGF0aWMgaW50IGxic19zZXRfYXV0aGVudGljYXRpb24oc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCBic3NpZFs2XSwgdTggYXV0aCkKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgY21kOwotCWludCByZXQgPSAtMTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9KT0lOKTsKLQotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQltZW1jcHkoY21kLmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCi0JY21kLmF1dGh0eXBlID0gaXdfYXV0aF90b19pZWVlX2F1dGgoYXV0aCk7Ci0KLQlsYnNfZGViX2pvaW4oIkFVVEhfQ01EOiBCU1NJRCAlcE0sIGF1dGggMHgleFxuIiwgYnNzaWQsIGNtZC5hdXRodHlwZSk7Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9BVVRIRU5USUNBVEUsICZjbWQpOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfSk9JTiwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1pbnQgbGJzX2NtZF84MDJfMTFfc2V0X3dlcChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNtZF9hY3Rpb24sCi0JCQkgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2MpCi17Ci0Jc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCBjbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmhkci5jb21tYW5kID0gY3B1X3RvX2xlMTYoQ01EXzgwMl8xMV9TRVRfV0VQKTsKLQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7Ci0KLQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7Ci0KLQlpZiAoY21kX2FjdGlvbiA9PSBDTURfQUNUX0FERCkgewotCQlpbnQgaTsKLQotCQkvKiBkZWZhdWx0IHR4IGtleSBpbmRleCAqLwotCQljbWQua2V5aW5kZXggPSBjcHVfdG9fbGUxNihhc3NvYy0+d2VwX3R4X2tleWlkeCAmCi0JCQkJCSAgIENNRF9XRVBfS0VZX0lOREVYX01BU0spOwotCi0JCS8qIENvcHkga2V5IHR5cGVzIGFuZCBtYXRlcmlhbCB0byBob3N0IGNvbW1hbmQgc3RydWN0dXJlICovCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCXN0cnVjdCBlbmNfa2V5ICpwa2V5ID0gJmFzc29jLT53ZXBfa2V5c1tpXTsKLQotCQkJc3dpdGNoIChwa2V5LT5sZW4pIHsKLQkJCWNhc2UgS0VZX0xFTl9XRVBfNDA6Ci0JCQkJY21kLmtleXR5cGVbaV0gPSBDTURfVFlQRV9XRVBfNDBfQklUOwotCQkJCW1lbW1vdmUoY21kLmtleW1hdGVyaWFsW2ldLCBwa2V5LT5rZXksIHBrZXktPmxlbik7Ci0JCQkJbGJzX2RlYl9jbWQoIlNFVF9XRVA6IGFkZCBrZXkgJWQgKDQwIGJpdClcbiIsIGkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBLRVlfTEVOX1dFUF8xMDQ6Ci0JCQkJY21kLmtleXR5cGVbaV0gPSBDTURfVFlQRV9XRVBfMTA0X0JJVDsKLQkJCQltZW1tb3ZlKGNtZC5rZXltYXRlcmlhbFtpXSwgcGtleS0+a2V5LCBwa2V5LT5sZW4pOwotCQkJCWxic19kZWJfY21kKCJTRVRfV0VQOiBhZGQga2V5ICVkICgxMDQgYml0KVxuIiwgaSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWxic19kZWJfY21kKCJTRVRfV0VQOiBpbnZhbGlkIGtleSAlZCwgbGVuZ3RoICVkXG4iLAotCQkJCQkgICAgaSwgcGtleS0+bGVuKTsKLQkJCQlyZXQgPSAtMTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGNtZF9hY3Rpb24gPT0gQ01EX0FDVF9SRU1PVkUpIHsKLQkJLyogQUNUX1JFTU9WRSBjbGVhcnMgX2FsbF8gV0VQIGtleXMgKi8KLQotCQkvKiBkZWZhdWx0IHR4IGtleSBpbmRleCAqLwotCQljbWQua2V5aW5kZXggPSBjcHVfdG9fbGUxNihwcml2LT53ZXBfdHhfa2V5aWR4ICYKLQkJCQkJICAgQ01EX1dFUF9LRVlfSU5ERVhfTUFTSyk7Ci0JCWxic19kZWJfY21kKCJTRVRfV0VQOiByZW1vdmUga2V5ICVkXG4iLCBwcml2LT53ZXBfdHhfa2V5aWR4KTsKLQl9Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9TRVRfV0VQLCAmY21kKTsKLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbGJzX2NtZF84MDJfMTFfZW5hYmxlX3JzbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNtZF9hY3Rpb24sCi0JCQkgICAgICB1aW50MTZfdCAqZW5hYmxlKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX2VuYWJsZV9yc24gY21kOwotCWludCByZXQ7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKLQotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7Ci0KLQlpZiAoY21kX2FjdGlvbiA9PSBDTURfQUNUX0dFVCkKLQkJY21kLmVuYWJsZSA9IDA7Ci0JZWxzZSB7Ci0JCWlmICgqZW5hYmxlKQotCQkJY21kLmVuYWJsZSA9IGNwdV90b19sZTE2KENNRF9FTkFCTEVfUlNOKTsKLQkJZWxzZQotCQkJY21kLmVuYWJsZSA9IGNwdV90b19sZTE2KENNRF9ESVNBQkxFX1JTTik7Ci0JCWxic19kZWJfY21kKCJFTkFCTEVfUlNOOiAlZFxuIiwgKmVuYWJsZSk7Ci0JfQotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfRU5BQkxFX1JTTiwgJmNtZCk7Ci0JaWYgKCFyZXQgJiYgY21kX2FjdGlvbiA9PSBDTURfQUNUX0dFVCkKLQkJKmVuYWJsZSA9IGxlMTZfdG9fY3B1KGNtZC5lbmFibGUpOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzZXRfb25lX3dwYV9rZXkoc3RydWN0IE1ydmxJRXR5cGVfa2V5UGFyYW1TZXQgKmtleXBhcmFtLAotCQlzdHJ1Y3QgZW5jX2tleSAqa2V5KQotewotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JaWYgKGtleS0+ZmxhZ3MgJiBLRVlfSU5GT19XUEFfRU5BQkxFRCkKLQkJa2V5cGFyYW0tPmtleWluZm8gfD0gY3B1X3RvX2xlMTYoS0VZX0lORk9fV1BBX0VOQUJMRUQpOwotCWlmIChrZXktPmZsYWdzICYgS0VZX0lORk9fV1BBX1VOSUNBU1QpCi0JCWtleXBhcmFtLT5rZXlpbmZvIHw9IGNwdV90b19sZTE2KEtFWV9JTkZPX1dQQV9VTklDQVNUKTsKLQlpZiAoa2V5LT5mbGFncyAmIEtFWV9JTkZPX1dQQV9NQ0FTVCkKLQkJa2V5cGFyYW0tPmtleWluZm8gfD0gY3B1X3RvX2xlMTYoS0VZX0lORk9fV1BBX01DQVNUKTsKLQotCWtleXBhcmFtLT50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfS0VZX01BVEVSSUFMKTsKLQlrZXlwYXJhbS0+a2V5dHlwZWlkID0gY3B1X3RvX2xlMTYoa2V5LT50eXBlKTsKLQlrZXlwYXJhbS0+a2V5bGVuID0gY3B1X3RvX2xlMTYoa2V5LT5sZW4pOwotCW1lbWNweShrZXlwYXJhbS0+a2V5LCBrZXktPmtleSwga2V5LT5sZW4pOwotCi0JLyogTGVuZ3RoIGZpZWxkIGRvZXNuJ3QgaW5jbHVkZSB0aGUge3R5cGUsbGVuZ3RofSBoZWFkZXIgKi8KLQlrZXlwYXJhbS0+bGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCprZXlwYXJhbSkgLSA0KTsKLQlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKLX0KLQotaW50IGxic19jbWRfODAyXzExX2tleV9tYXRlcmlhbChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNtZF9hY3Rpb24sCi0JCQkJc3RydWN0IGFzc29jX3JlcXVlc3QgKmFzc29jKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCBjbWQ7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQotCWlmIChjbWRfYWN0aW9uID09IENNRF9BQ1RfR0VUKSB7Ci0JCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2hlYWRlcikgKyAyKTsKLQl9IGVsc2UgewotCQltZW1zZXQoY21kLmtleVBhcmFtU2V0LCAwLCBzaXplb2YoY21kLmtleVBhcmFtU2V0KSk7Ci0KLQkJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWSwgJmFzc29jLT5mbGFncykpIHsKLQkJCXNldF9vbmVfd3BhX2tleSgmY21kLmtleVBhcmFtU2V0W2luZGV4XSwKLQkJCQkJJmFzc29jLT53cGFfdW5pY2FzdF9rZXkpOwotCQkJaW5kZXgrKzsKLQkJfQotCi0JCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1dQQV9NQ0FTVF9LRVksICZhc3NvYy0+ZmxhZ3MpKSB7Ci0JCQlzZXRfb25lX3dwYV9rZXkoJmNtZC5rZXlQYXJhbVNldFtpbmRleF0sCi0JCQkJCSZhc3NvYy0+d3BhX21jYXN0X2tleSk7Ci0JCQlpbmRleCsrOwotCQl9Ci0KLQkJLyogVGhlIGNvbW1vbiBoZWFkZXIgYW5kIGFzIG1hbnkga2V5cyBhcyB3ZSBpbmNsdWRlZCAqLwotCQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihvZmZzZXRvZih0eXBlb2YoY21kKSwKLQkJCQkJCSAgICBrZXlQYXJhbVNldFtpbmRleF0pKTsKLQl9Ci0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfS0VZX01BVEVSSUFMLCAmY21kKTsKLQkvKiBDb3B5IHRoZSByZXR1cm5lZCBrZXkgdG8gZHJpdmVyIHByaXZhdGUgZGF0YSAqLwotCWlmICghcmV0ICYmIGNtZF9hY3Rpb24gPT0gQ01EX0FDVF9HRVQpIHsKLQkJdm9pZCAqYnVmX3B0ciA9IGNtZC5rZXlQYXJhbVNldDsKLQkJdm9pZCAqcmVzcF9lbmQgPSAmKCZjbWQpWzFdOwotCi0JCXdoaWxlIChidWZfcHRyIDwgcmVzcF9lbmQpIHsKLQkJCXN0cnVjdCBNcnZsSUV0eXBlX2tleVBhcmFtU2V0ICprZXlwYXJhbSA9IGJ1Zl9wdHI7Ci0JCQlzdHJ1Y3QgZW5jX2tleSAqa2V5OwotCQkJdWludDE2X3QgcGFyYW1fc2V0X2xlbiA9IGxlMTZfdG9fY3B1KGtleXBhcmFtLT5sZW5ndGgpOwotCQkJdWludDE2X3Qga2V5X2xlbiA9IGxlMTZfdG9fY3B1KGtleXBhcmFtLT5rZXlsZW4pOwotCQkJdWludDE2X3Qga2V5X2ZsYWdzID0gbGUxNl90b19jcHUoa2V5cGFyYW0tPmtleWluZm8pOwotCQkJdWludDE2X3Qga2V5X3R5cGUgPSBsZTE2X3RvX2NwdShrZXlwYXJhbS0+a2V5dHlwZWlkKTsKLQkJCXZvaWQgKmVuZDsKLQotCQkJZW5kID0gKHZvaWQgKilrZXlwYXJhbSArIHNpemVvZihrZXlwYXJhbS0+dHlwZSkKLQkJCQkrIHNpemVvZihrZXlwYXJhbS0+bGVuZ3RoKSArIHBhcmFtX3NldF9sZW47Ci0KLQkJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBhY2Nlc3MgcGFzdCB0aGUgZW5kIG9mIHRoZSBJRXMgKi8KLQkJCWlmIChlbmQgPiByZXNwX2VuZCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGtleV9mbGFncyAmIEtFWV9JTkZPX1dQQV9VTklDQVNUKQotCQkJCWtleSA9ICZwcml2LT53cGFfdW5pY2FzdF9rZXk7Ci0JCQllbHNlIGlmIChrZXlfZmxhZ3MgJiBLRVlfSU5GT19XUEFfTUNBU1QpCi0JCQkJa2V5ID0gJnByaXYtPndwYV9tY2FzdF9rZXk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIENvcHkgcmV0dXJuZWQga2V5IGludG8gZHJpdmVyICovCi0JCQltZW1zZXQoa2V5LCAwLCBzaXplb2Yoc3RydWN0IGVuY19rZXkpKTsKLQkJCWlmIChrZXlfbGVuID4gc2l6ZW9mKGtleS0+a2V5KSkKLQkJCQlicmVhazsKLQkJCWtleS0+dHlwZSA9IGtleV90eXBlOwotCQkJa2V5LT5mbGFncyA9IGtleV9mbGFnczsKLQkJCWtleS0+bGVuID0ga2V5X2xlbjsKLQkJCW1lbWNweShrZXktPmtleSwga2V5cGFyYW0tPmtleSwga2V5LT5sZW4pOwotCi0JCQlidWZfcHRyID0gZW5kICsgMTsKLQkJfQotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9fbGUxNiBsYnNfcmF0ZV90b19md19iaXRtYXAoaW50IHJhdGUsIGludCBsb3dlcl9yYXRlc19vaykKLXsKLS8qCQlCaXQgIAlSYXRlCi0qCQkxNToxMyBSZXNlcnZlZAotKgkJMTIgICAgNTQgTWJwcwotKgkJMTEgICAgNDggTWJwcwotKgkJMTAgICAgMzYgTWJwcwotKgkJOSAgICAgMjQgTWJwcwotKgkJOCAgICAgMTggTWJwcwotKgkJNyAgICAgMTIgTWJwcwotKgkJNiAgICAgOSBNYnBzCi0qCQk1ICAgICA2IE1icHMKLSoJCTQgICAgIFJlc2VydmVkCi0qCQkzICAgICAxMSBNYnBzCi0qCQkyICAgICA1LjUgTWJwcwotKgkJMSAgICAgMiBNYnBzCi0qCQkwICAgICAxIE1icHMKLSoqLwotCi0JdWludDE2X3QgcmF0ZW1hc2s7Ci0JaW50IGkgPSBsYnNfZGF0YV9yYXRlX3RvX2Z3X2luZGV4KHJhdGUpOwotCWlmIChsb3dlcl9yYXRlc19vaykKLQkJcmF0ZW1hc2sgPSAoMHgxZmVmID4+ICgxMiAtIGkpKTsKLQllbHNlCi0JCXJhdGVtYXNrID0gKDEgPDwgaSk7Ci0JcmV0dXJuIGNwdV90b19sZTE2KHJhdGVtYXNrKTsKLX0KLQotaW50IGxic19jbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJICAgICAgdWludDE2X3QgY21kX2FjdGlvbikKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQgY21kOwotCWludCByZXQ7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKLQotCWlmICghcHJpdi0+Y3VyX3JhdGUgJiYgIXByaXYtPmVuYWJsZWh3YXV0bykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7Ci0KLQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7Ci0JY21kLmVuYWJsZWh3YXV0byA9IGNwdV90b19sZTE2KHByaXYtPmVuYWJsZWh3YXV0byk7Ci0JY21kLmJpdG1hcCA9IGxic19yYXRlX3RvX2Z3X2JpdG1hcChwcml2LT5jdXJfcmF0ZSwgcHJpdi0+ZW5hYmxlaHdhdXRvKTsKLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9SQVRFX0FEQVBUX1JBVEVTRVQsICZjbWQpOwotCWlmICghcmV0ICYmIGNtZF9hY3Rpb24gPT0gQ01EX0FDVF9HRVQpCi0JCXByaXYtPmVuYWJsZWh3YXV0byA9IGxlMTZfdG9fY3B1KGNtZC5lbmFibGVod2F1dG8pOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqICBAYnJpZWYgU2V0IHRoZSBkYXRhIHJhdGUKLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHJhdGUgIAlUaGUgZGVzaXJlZCBkYXRhIHJhdGUsIG9yIDAgdG8gY2xlYXIgYSBsb2NrZWQgcmF0ZQotICoKLSAqICBAcmV0dXJuIAkgICAJMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCi0gKi8KLWludCBsYnNfc2V0X2RhdGFfcmF0ZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4IHJhdGUpCi17Ci0Jc3RydWN0IGNtZF9kc184MDJfMTFfZGF0YV9yYXRlIGNtZDsKLQlpbnQgcmV0ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7Ci0KLQlpZiAocmF0ZSA+IDApIHsKLQkJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfU0VUX1RYX0ZJWF9SQVRFKTsKLQkJY21kLnJhdGVzWzBdID0gbGJzX2RhdGFfcmF0ZV90b19md19pbmRleChyYXRlKTsKLQkJaWYgKGNtZC5yYXRlc1swXSA9PSAwKSB7Ci0JCQlsYnNfZGViX2NtZCgiREFUQV9SQVRFOiBpbnZhbGlkIHJlcXVlc3RlZCByYXRlIG9mIgotCQkJCSIgMHglMDJYXG4iLCByYXRlKTsKLQkJCXJldCA9IDA7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlsYnNfZGViX2NtZCgiREFUQV9SQVRFOiBzZXQgZml4ZWQgMHglMDJYXG4iLCBjbWQucmF0ZXNbMF0pOwotCX0gZWxzZSB7Ci0JCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVF9UWF9BVVRPKTsKLQkJbGJzX2RlYl9jbWQoIkRBVEFfUkFURTogc2V0dGluZyBhdXRvXG4iKTsKLQl9Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9EQVRBX1JBVEUsICZjbWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JbGJzX2RlYl9oZXgoTEJTX0RFQl9DTUQsICJEQVRBX1JBVEVfUkVTUCIsICh1OCAqKSAmY21kLCBzaXplb2YoY21kKSk7Ci0KLQkvKiBGSVhNRTogZ2V0IGFjdHVhbCByYXRlcyBGVyBjYW4gZG8gaWYgdGhpcyBjb21tYW5kIGFjdHVhbGx5IHJldHVybnMKLQkgKiBhbGwgZGF0YSByYXRlcyBzdXBwb3J0ZWQuCi0JICovCi0JcHJpdi0+Y3VyX3JhdGUgPSBsYnNfZndfaW5kZXhfdG9fZGF0YV9yYXRlKGNtZC5yYXRlc1swXSk7Ci0JbGJzX2RlYl9jbWQoIkRBVEFfUkFURTogY3VycmVudCByYXRlIGlzIDB4JTAyeFxuIiwgcHJpdi0+Y3VyX3JhdGUpOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLWludCBsYnNfY21kXzgwMl8xMV9yc3NpKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCkKLXsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfUlNTSSk7Ci0JY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2kpICsKLQkJc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0JY21kLT5wYXJhbXMucnNzaS5OID0gY3B1X3RvX2xlMTYoREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUik7Ci0KLQkvKiByZXNldCBCZWFjb24gU05SL05GL1JTU0kgdmFsdWVzICovCi0JcHJpdi0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9IDA7Ci0JcHJpdi0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gPSAwOwotCXByaXYtPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9IDA7Ci0JcHJpdi0+TkZbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9IDA7Ci0JcHJpdi0+UlNTSVtUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPSAwOwotCXByaXYtPlJTU0lbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9IDA7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGxic19yZXRfODAyXzExX3Jzc2koc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yc3NpX3JzcCAqcnNzaXJzcCA9ICZyZXNwLT5wYXJhbXMucnNzaXJzcDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JLyogc3RvcmUgdGhlIG5vbiBhdmVyYWdlIHZhbHVlICovCi0JcHJpdi0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9IGdldF91bmFsaWduZWRfbGUxNigmcnNzaXJzcC0+U05SKTsKLQlwcml2LT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPQotCQlnZXRfdW5hbGlnbmVkX2xlMTYoJnJzc2lyc3AtPm5vaXNlZmxvb3IpOwotCi0JcHJpdi0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gPSBnZXRfdW5hbGlnbmVkX2xlMTYoJnJzc2lyc3AtPmF2Z1NOUik7Ci0JcHJpdi0+TkZbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9Ci0JCWdldF91bmFsaWduZWRfbGUxNigmcnNzaXJzcC0+YXZnbm9pc2VmbG9vcik7Ci0KLQlwcml2LT5SU1NJW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9Ci0JICAgIENBTF9SU1NJKHByaXYtPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10sCi0JCSAgICAgcHJpdi0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKLQotCXByaXYtPlJTU0lbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9Ci0JICAgIENBTF9SU1NJKHByaXYtPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9BVkddIC8gQVZHX1NDQUxFLAotCQkgICAgIHByaXYtPk5GW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUpOwotCi0JbGJzX2RlYl9jbWQoIlJTU0k6IGJlYWNvbiAlZCwgYXZnICVkXG4iLAotCSAgICAgICBwcml2LT5SU1NJW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSwKLQkgICAgICAgcHJpdi0+UlNTSVtUWVBFX0JFQUNPTl1bVFlQRV9BVkddKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOwotfQotCi0KLWludCBsYnNfY21kX2Jjbl9jdHJsKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQl1MTYgY21kX2FjdGlvbikKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9iZWFjb25fY29udHJvbAotCQkqYmNuX2N0cmwgPSAmY21kLT5wYXJhbXMuYmNuX2N0cmw7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKLQljbWQtPnNpemUgPQotCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfYmVhY29uX2NvbnRyb2wpCi0JCQkgICAgICsgc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0JY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoQ01EXzgwMl8xMV9CRUFDT05fQ1RSTCk7Ci0KLQliY25fY3RybC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7Ci0JYmNuX2N0cmwtPmJlYWNvbl9lbmFibGUgPSBjcHVfdG9fbGUxNihwcml2LT5iZWFjb25fZW5hYmxlKTsKLQliY25fY3RybC0+YmVhY29uX3BlcmlvZCA9IGNwdV90b19sZTE2KHByaXYtPmJlYWNvbl9wZXJpb2QpOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NNRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBsYnNfcmV0XzgwMl8xMV9iY25fY3RybChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9iZWFjb25fY29udHJvbCAqYmNuX2N0cmwgPQotCSAgICAmcmVzcC0+cGFyYW1zLmJjbl9jdHJsOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7Ci0KLQlpZiAoYmNuX2N0cmwtPmFjdGlvbiA9PSBDTURfQUNUX0dFVCkgewotCQlwcml2LT5iZWFjb25fZW5hYmxlID0gKHU4KSBsZTE2X3RvX2NwdShiY25fY3RybC0+YmVhY29uX2VuYWJsZSk7Ci0JCXByaXYtPmJlYWNvbl9wZXJpb2QgPSBsZTE2X3RvX2NwdShiY25fY3RybC0+YmVhY29uX3BlcmlvZCk7Ci0JfQotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGxic19hc3NvY19wb3N0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCSAgc3RydWN0IGNtZF9kc184MDJfMTFfYXNzb2NpYXRlX3Jlc3BvbnNlICpyZXNwKQotewotCWludCByZXQgPSAwOwotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKmJzczsKLQl1MTYgc3RhdHVzX2NvZGU7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQVNTT0MpOwotCi0JaWYgKCFwcml2LT5pbl9wcm9ncmVzc19hc3NvY19yZXEpIHsKLQkJbGJzX2RlYl9hc3NvYygiQVNTT0NfUkVTUDogbm8gaW4tcHJvZ3Jlc3MgYXNzb2MgcmVxdWVzdFxuIik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCWJzcyA9ICZwcml2LT5pbl9wcm9ncmVzc19hc3NvY19yZXEtPmJzczsKLQotCS8qCi0JICogT2xkZXIgRlcgdmVyc2lvbnMgbWFwIHRoZSBJRUVFIDgwMi4xMSBTdGF0dXMgQ29kZSBpbiB0aGUgYXNzb2NpYXRpb24KLQkgKiByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIHZhbHVlcyByZXR1cm5lZCBpbiByZXNwLT5zdGF0dXNjb2RlOgotCSAqCi0JICogICAgSUVFRSBTdGF0dXMgQ29kZSAgICAgICAgICAgICAgICBNYXJ2ZWxsIFN0YXR1cyBDb2RlCi0JICogICAgMCAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAweDAwMDAgQVNTT0NfUkVTVUxUX1NVQ0NFU1MKLQkgKiAgICAxMyAgICAgICAgICAgICAgICAgICAgICAtPiAgICAgIDB4MDAwNCBBU1NPQ19SRVNVTFRfQVVUSF9SRUZVU0VECi0JICogICAgMTQgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAweDAwMDQgQVNTT0NfUkVTVUxUX0FVVEhfUkVGVVNFRAotCSAqICAgIDE1ICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgMHgwMDA0IEFTU09DX1JFU1VMVF9BVVRIX1JFRlVTRUQKLQkgKiAgICAxNiAgICAgICAgICAgICAgICAgICAgICAtPiAgICAgIDB4MDAwNCBBU1NPQ19SRVNVTFRfQVVUSF9SRUZVU0VECi0JICogICAgb3RoZXJzICAgICAgICAgICAgICAgICAgLT4gICAgICAweDAwMDMgQVNTT0NfUkVTVUxUX1JFRlVTRUQKLQkgKgotCSAqIE90aGVyIHJlc3BvbnNlIGNvZGVzOgotCSAqICAgIDB4MDAwMSAtPiBBU1NPQ19SRVNVTFRfSU5WQUxJRF9QQVJBTUVURVJTICh1bnVzZWQpCi0JICogICAgMHgwMDAyIC0+IEFTU09DX1JFU1VMVF9USU1FT1VUIChpbnRlcm5hbCB0aW1lciBleHBpcmVkIHdhaXRpbmcgZm9yCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbiByZXNwb25zZSBmcm9tIHRoZSBBUCkKLQkgKi8KLQotCXN0YXR1c19jb2RlID0gbGUxNl90b19jcHUocmVzcC0+c3RhdHVzY29kZSk7Ci0JaWYgKHByaXYtPmZ3cmVsZWFzZSA8IDB4MDkwMDAwMDApIHsKLQkJc3dpdGNoIChzdGF0dXNfY29kZSkgewotCQljYXNlIDB4MDA6Ci0JCQlicmVhazsKLQkJY2FzZSAweDAxOgotCQkJbGJzX2RlYl9hc3NvYygiQVNTT0NfUkVTUDogaW52YWxpZCBwYXJhbWV0ZXJzXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDI6Ci0JCQlsYnNfZGViX2Fzc29jKCJBU1NPQ19SRVNQOiBpbnRlcm5hbCB0aW1lciAiCi0JCQkJImV4cGlyZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIEFQXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDM6Ci0JCQlsYnNfZGViX2Fzc29jKCJBU1NPQ19SRVNQOiBhc3NvY2lhdGlvbiAiCi0JCQkJInJlZnVzZWQgYnkgQVBcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwNDoKLQkJCWxic19kZWJfYXNzb2MoIkFTU09DX1JFU1A6IGF1dGhlbnRpY2F0aW9uICIKLQkJCQkicmVmdXNlZCBieSBBUFxuIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWxic19kZWJfYXNzb2MoIkFTU09DX1JFU1A6IGZhaWx1cmUgcmVhc29uIDB4JTAyeCAiCi0JCQkJIiB1bmtub3duXG4iLCBzdGF0dXNfY29kZSk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIHY5KyByZXR1cm5zIHRoZSBBUCdzIGFzc29jaWF0aW9uIHJlc3BvbnNlICovCi0JCWxic19kZWJfYXNzb2MoIkFTU09DX1JFU1A6IGZhaWx1cmUgcmVhc29uIDB4JTAyeFxuIiwgc3RhdHVzX2NvZGUpOwotCX0KLQotCWlmIChzdGF0dXNfY29kZSkgewotCQlsYnNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZChwcml2KTsKLQkJcmV0ID0gc3RhdHVzX2NvZGU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlsYnNfZGViX2hleChMQlNfREVCX0FTU09DLCAiQVNTT0NfUkVTUCIsCi0JCSAgICAodm9pZCAqKSAocmVzcCArIHNpemVvZiAocmVzcC0+aGRyKSksCi0JCSAgICBsZTE2X3RvX2NwdShyZXNwLT5oZHIuc2l6ZSkgLSBzaXplb2YgKHJlc3AtPmhkcikpOwotCi0JLyogU2VuZCBhIE1lZGlhIENvbm5lY3RlZCBldmVudCwgYWNjb3JkaW5nIHRvIHRoZSBTcGVjICovCi0JcHJpdi0+Y29ubmVjdF9zdGF0dXMgPSBMQlNfQ09OTkVDVEVEOwotCi0JLyogVXBkYXRlIGN1cnJlbnQgU1NJRCBhbmQgQlNTSUQgKi8KLQltZW1jcHkoJnByaXYtPmN1cmJzc3BhcmFtcy5zc2lkLCAmYnNzLT5zc2lkLCBJRUVFODAyMTFfTUFYX1NTSURfTEVOKTsKLQlwcml2LT5jdXJic3NwYXJhbXMuc3NpZF9sZW4gPSBic3MtPnNzaWRfbGVuOwotCW1lbWNweShwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCXByaXYtPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSA9IDA7Ci0JcHJpdi0+TkZbVFlQRV9SWFBEXVtUWVBFX0FWR10gPSAwOwotCi0JbWVtc2V0KHByaXYtPnJhd1NOUiwgMHgwMCwgc2l6ZW9mKHByaXYtPnJhd1NOUikpOwotCW1lbXNldChwcml2LT5yYXdORiwgMHgwMCwgc2l6ZW9mKHByaXYtPnJhd05GKSk7Ci0JcHJpdi0+bmV4dFNOUk5GID0gMDsKLQlwcml2LT5udW1TTlJORiA9IDA7Ci0KLQluZXRpZl9jYXJyaWVyX29uKHByaXYtPmRldik7Ci0JaWYgKCFwcml2LT50eF9wZW5kaW5nX2xlbikKLQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOwotCi0JbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsIEVUSF9BTEVOKTsKLQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotZG9uZToKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYW4gYXNzb2NpYXRpb24tY2xhc3MgY29tbWFuZC4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSBhc3NvY19yZXEgVGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZGVzY3JpYmluZyB0aGUgQlNTIHRvIGFzc29jaWF0ZQotICogICAgICAgICAgICAgICAgICAgb3IgcmVhc3NvY2lhdGUgd2l0aAotICogIEBwYXJhbSBjb21tYW5kICAgVGhlIGFjdHVhbCBjb21tYW5kLCBlaXRoZXIgQ01EXzgwMl8xMV9BU1NPQ0lBVEUgb3IKLSAqICAgICAgICAgICAgICAgICAgIENNRF84MDJfMTFfUkVBU1NPQ0lBVEUKLSAqCi0gKiAgQHJldHVybiAgICAgICAgIDAgb3IgLTEKLSAqLwotc3RhdGljIGludCBsYnNfYXNzb2NpYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCSBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxLAotCQkJIHUxNiBjb21tYW5kKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZSBjbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGJzc19kZXNjcmlwdG9yICpic3MgPSAmYXNzb2NfcmVxLT5ic3M7Ci0JdTggKnBvcyA9ICYoY21kLmllYnVmWzBdKTsKLQl1MTYgdG1wY2FwLCB0bXBsZW4sIHRtcGF1dGg7Ci0Jc3RydWN0IG1ydmxfaWVfc3NpZF9wYXJhbV9zZXQgKnNzaWQ7Ci0Jc3RydWN0IG1ydmxfaWVfZHNfcGFyYW1fc2V0ICpkczsKLQlzdHJ1Y3QgbXJ2bF9pZV9jZl9wYXJhbV9zZXQgKmNmOwotCXN0cnVjdCBtcnZsX2llX3JhdGVzX3BhcmFtX3NldCAqcmF0ZXM7Ci0Jc3RydWN0IG1ydmxfaWVfcnNuX3BhcmFtX3NldCAqcnNuOwotCXN0cnVjdCBtcnZsX2llX2F1dGhfdHlwZSAqYXV0aDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9BU1NPQyk7Ci0KLQlCVUdfT04oKGNvbW1hbmQgIT0gQ01EXzgwMl8xMV9BU1NPQ0lBVEUpICYmCi0JCShjb21tYW5kICE9IENNRF84MDJfMTFfUkVBU1NPQ0lBVEUpKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmhkci5jb21tYW5kID0gY3B1X3RvX2xlMTYoY29tbWFuZCk7Ci0KLQkvKiBGaWxsIGluIHN0YXRpYyBmaWVsZHMgKi8KLQltZW1jcHkoY21kLmJzc2lkLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JY21kLmxpc3RlbmludGVydmFsID0gY3B1X3RvX2xlMTYoTVJWRFJWX0RFRkFVTFRfTElTVEVOX0lOVEVSVkFMKTsKLQotCS8qIENhcGFiaWxpdHkgaW5mbyAqLwotCXRtcGNhcCA9IChic3MtPmNhcGFiaWxpdHkgJiBDQVBJTkZPX01BU0spOwotCWlmIChic3MtPm1vZGUgPT0gSVdfTU9ERV9JTkZSQSkKLQkJdG1wY2FwIHw9IFdMQU5fQ0FQQUJJTElUWV9FU1M7Ci0JY21kLmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNih0bXBjYXApOwotCWxic19kZWJfYXNzb2MoIkFTU09DX0NNRDogY2FwYWJpbGl0eSAweCUwNHhcbiIsIHRtcGNhcCk7Ci0KLQkvKiBTU0lEICovCi0Jc3NpZCA9IChzdHJ1Y3QgbXJ2bF9pZV9zc2lkX3BhcmFtX3NldCAqKSBwb3M7Ci0Jc3NpZC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9TU0lEKTsKLQl0bXBsZW4gPSBic3MtPnNzaWRfbGVuOwotCXNzaWQtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNih0bXBsZW4pOwotCW1lbWNweShzc2lkLT5zc2lkLCBic3MtPnNzaWQsIHRtcGxlbik7Ci0JcG9zICs9IHNpemVvZihzc2lkLT5oZWFkZXIpICsgdG1wbGVuOwotCi0JZHMgPSAoc3RydWN0IG1ydmxfaWVfZHNfcGFyYW1fc2V0ICopIHBvczsKLQlkcy0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9QSFlfRFMpOwotCWRzLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoMSk7Ci0JZHMtPmNoYW5uZWwgPSBic3MtPnBoeS5kcy5jaGFubmVsOwotCXBvcyArPSBzaXplb2YoZHMtPmhlYWRlcikgKyAxOwotCi0JY2YgPSAoc3RydWN0IG1ydmxfaWVfY2ZfcGFyYW1fc2V0ICopIHBvczsKLQljZi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9DRik7Ci0JdG1wbGVuID0gc2l6ZW9mKCpjZikgLSBzaXplb2YgKGNmLT5oZWFkZXIpOwotCWNmLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYodG1wbGVuKTsKLQkvKiBJRSBwYXlsb2FkIHNob3VsZCBiZSB6ZXJvZWQsIGZpcm13YXJlIGZpbGxzIGl0IGluIGZvciB1cyAqLwotCXBvcyArPSBzaXplb2YoKmNmKTsKLQotCXJhdGVzID0gKHN0cnVjdCBtcnZsX2llX3JhdGVzX3BhcmFtX3NldCAqKSBwb3M7Ci0JcmF0ZXMtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfUkFURVMpOwotCXRtcGxlbiA9IG1pbl90KHUxNiwgQVJSQVlfU0laRShic3MtPnJhdGVzKSwgTUFYX1JBVEVTKTsKLQltZW1jcHkoJnJhdGVzLT5yYXRlcywgJmJzcy0+cmF0ZXMsIHRtcGxlbik7Ci0JaWYgKGdldF9jb21tb25fcmF0ZXMocHJpdiwgcmF0ZXMtPnJhdGVzLCAmdG1wbGVuKSkgewotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQlwb3MgKz0gc2l6ZW9mKHJhdGVzLT5oZWFkZXIpICsgdG1wbGVuOwotCXJhdGVzLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYodG1wbGVuKTsKLQlsYnNfZGViX2Fzc29jKCJBU1NPQ19DTUQ6IG51bSByYXRlcyAldVxuIiwgdG1wbGVuKTsKLQotCS8qIENvcHkgdGhlIGluZnJhLiBhc3NvY2lhdGlvbiByYXRlcyBpbnRvIEN1cnJlbnQgQlNTIHN0YXRlIHN0cnVjdHVyZSAqLwotCW1lbXNldCgmcHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzLCAwLCBzaXplb2YocHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzKSk7Ci0JbWVtY3B5KCZwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMsICZyYXRlcy0+cmF0ZXMsIHRtcGxlbik7Ci0KLQkvKiBTZXQgTVNCIG9uIGJhc2ljIHJhdGVzIGFzIHRoZSBmaXJtd2FyZSByZXF1aXJlcywgYnV0IF9hZnRlcl8KLQkgKiBjb3B5aW5nIHRvIGN1cnJlbnQgYnNzIHJhdGVzLgotCSAqLwotCWxic19zZXRfYmFzaWNfcmF0ZV9mbGFncyhyYXRlcy0+cmF0ZXMsIHRtcGxlbik7Ci0KLQkvKiBGaXJtd2FyZSB2OSsgaW5kaWNhdGUgYXV0aGVudGljYXRpb24gc3VpdGVzIGFzIGEgVExWICovCi0JaWYgKHByaXYtPmZ3cmVsZWFzZSA+PSAweDA5MDAwMDAwKSB7Ci0JCWF1dGggPSAoc3RydWN0IG1ydmxfaWVfYXV0aF90eXBlICopIHBvczsKLQkJYXV0aC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9BVVRIX1RZUEUpOwotCQlhdXRoLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoMik7Ci0JCXRtcGF1dGggPSBpd19hdXRoX3RvX2llZWVfYXV0aChwcml2LT5zZWNpbmZvLmF1dGhfbW9kZSk7Ci0JCWF1dGgtPmF1dGggPSBjcHVfdG9fbGUxNih0bXBhdXRoKTsKLQkJcG9zICs9IHNpemVvZihhdXRoLT5oZWFkZXIpICsgMjsKLQotCQlsYnNfZGViX2pvaW4oIkFVVEhfQ01EOiBCU1NJRCAlcE0sIGF1dGggMHgleFxuIiwKLQkJCWJzcy0+YnNzaWQsIHByaXYtPnNlY2luZm8uYXV0aF9tb2RlKTsKLQl9Ci0KLQkvKiBXUEEvV1BBMiBJRXMgKi8KLQlpZiAoYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgfHwgYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7Ci0JCXJzbiA9IChzdHJ1Y3QgbXJ2bF9pZV9yc25fcGFyYW1fc2V0ICopIHBvczsKLQkJLyogV1BBX0lFIG9yIFdQQTJfSUUgKi8KLQkJcnNuLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KCh1MTYpIGFzc29jX3JlcS0+d3BhX2llWzBdKTsKLQkJdG1wbGVuID0gKHUxNikgYXNzb2NfcmVxLT53cGFfaWVbMV07Ci0JCXJzbi0+aGVhZGVyLmxlbiA9IGNwdV90b19sZTE2KHRtcGxlbik7Ci0JCW1lbWNweShyc24tPnJzbmllLCAmYXNzb2NfcmVxLT53cGFfaWVbMl0sIHRtcGxlbik7Ci0JCWxic19kZWJfaGV4KExCU19ERUJfSk9JTiwgIkFTU09DX0NNRDogV1BBL1JTTiBJRSIsICh1OCAqKSByc24sCi0JCQlzaXplb2YocnNuLT5oZWFkZXIpICsgdG1wbGVuKTsKLQkJcG9zICs9IHNpemVvZihyc24tPmhlYWRlcikgKyB0bXBsZW47Ci0JfQotCi0JY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoKHNpemVvZihjbWQpIC0gc2l6ZW9mKGNtZC5pZWJ1ZikpICsKLQkJCQkgICAodTE2KShwb3MgLSAodTggKikgJmNtZC5pZWJ1ZikpOwotCi0JLyogdXBkYXRlIGN1cmJzc3BhcmFtcyAqLwotCXByaXYtPmNoYW5uZWwgPSBic3MtPnBoeS5kcy5jaGFubmVsOwotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIGNvbW1hbmQsICZjbWQpOwotCWlmIChyZXQgPT0gMCkgewotCQlyZXQgPSBsYnNfYXNzb2NfcG9zdChwcml2LAotCQkJKHN0cnVjdCBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZV9yZXNwb25zZSAqKSAmY21kKTsKLQl9Ci0KLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQVNTT0MsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogIEBicmllZiBBc3NvY2lhdGUgdG8gYSBzcGVjaWZpYyBCU1MgZGlzY292ZXJlZCBpbiBhIHNjYW4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSBhc3NvY19yZXEgVGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZGVzY3JpYmluZyB0aGUgQlNTIHRvIGFzc29jaWF0ZSB3aXRoCi0gKgotICogIEByZXR1cm4gICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IGxic190cnlfYXNzb2NpYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxKQotewotCWludCByZXQ7Ci0JdTggcHJlYW1ibGUgPSBSQURJT19QUkVBTUJMRV9MT05HOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCS8qIEZXIHY5IGFuZCBoaWdoZXIgaW5kaWNhdGUgYXV0aGVudGljYXRpb24gc3VpdGVzIGFzIGEgVExWIGluIHRoZQotCSAqIGFzc29jaWF0aW9uIGNvbW1hbmQsIG5vdCBhcyBhIHNlcGFyYXRlIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmQuCi0JICovCi0JaWYgKHByaXYtPmZ3cmVsZWFzZSA8IDB4MDkwMDAwMDApIHsKLQkJcmV0ID0gbGJzX3NldF9hdXRoZW50aWNhdGlvbihwcml2LCBhc3NvY19yZXEtPmJzcy5ic3NpZCwKLQkJCQkJICAgICBwcml2LT5zZWNpbmZvLmF1dGhfbW9kZSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBVc2Ugc2hvcnQgcHJlYW1ibGUgb25seSB3aGVuIGJvdGggdGhlIEJTUyBhbmQgZmlybXdhcmUgc3VwcG9ydCBpdCAqLwotCWlmIChhc3NvY19yZXEtPmJzcy5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQotCQlwcmVhbWJsZSA9IFJBRElPX1BSRUFNQkxFX1NIT1JUOwotCi0JcmV0ID0gbGJzX3NldF9yYWRpbyhwcml2LCBwcmVhbWJsZSwgMSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBsYnNfYXNzb2NpYXRlKHByaXYsIGFzc29jX3JlcSwgQ01EXzgwMl8xMV9BU1NPQ0lBVEUpOwotCS8qIElmIHRoZSBhc3NvY2lhdGlvbiBmYWlscyB3aXRoIGN1cnJlbnQgYXV0aCBtb2RlLCBsZXQncwotCSAqIHRyeSBieSBjaGFuZ2luZyB0aGUgYXV0aCBtb2RlCi0JICovCi0JaWYgKChwcml2LT5hdXRodHlwZV9hdXRvKSAmJgotCQkJKHJldCA9PSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHKSAmJgotCQkJKGFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCkgJiYKLQkJCShwcml2LT5jb25uZWN0X3N0YXR1cyAhPSBMQlNfQ09OTkVDVEVEKSkgewotCQlpZiAocHJpdi0+c2VjaW5mby5hdXRoX21vZGUgPT0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCi0JCQlwcml2LT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX1NIQVJFRF9LRVk7Ci0JCWVsc2UKLQkJCXByaXYtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0JCWlmICghYXNzb2NfaGVscGVyX3dlcF9rZXlzKHByaXYsIGFzc29jX3JlcSkpCi0JCQlyZXQgPSBsYnNfYXNzb2NpYXRlKHByaXYsIGFzc29jX3JlcSwKLQkJCQkJCUNNRF84MDJfMTFfQVNTT0NJQVRFKTsKLQl9Ci0KLQlpZiAocmV0KQotCQlyZXQgPSAtMTsKLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsYnNfYWRob2NfcG9zdChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkgIHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgKnJlc3ApCi17Ci0JaW50IHJldCA9IDA7Ci0JdTE2IGNvbW1hbmQgPSBsZTE2X3RvX2NwdShyZXNwLT5oZHIuY29tbWFuZCk7Ci0JdTE2IHJlc3VsdCA9IGxlMTZfdG9fY3B1KHJlc3AtPmhkci5yZXN1bHQpOwotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKmJzczsKLQlERUNMQVJFX1NTSURfQlVGKHNzaWQpOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0pPSU4pOwotCi0JaWYgKCFwcml2LT5pbl9wcm9ncmVzc19hc3NvY19yZXEpIHsKLQkJbGJzX2RlYl9qb2luKCJBREhPQ19SRVNQOiBubyBpbi1wcm9ncmVzcyBhc3NvY2lhdGlvbiAiCi0JCQkicmVxdWVzdFxuIik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCWJzcyA9ICZwcml2LT5pbl9wcm9ncmVzc19hc3NvY19yZXEtPmJzczsKLQotCS8qCi0JICogSm9pbiByZXN1bHQgY29kZSAwIC0tPiBTVUNDRVNTCi0JICovCi0JaWYgKHJlc3VsdCkgewotCQlsYnNfZGViX2pvaW4oIkFESE9DX1JFU1A6IGZhaWxlZCAocmVzdWx0IDB4JVgpXG4iLCByZXN1bHQpOwotCQlpZiAocHJpdi0+Y29ubmVjdF9zdGF0dXMgPT0gTEJTX0NPTk5FQ1RFRCkKLQkJCWxic19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOwotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNlbmQgYSBNZWRpYSBDb25uZWN0ZWQgZXZlbnQsIGFjY29yZGluZyB0byB0aGUgU3BlYyAqLwotCXByaXYtPmNvbm5lY3Rfc3RhdHVzID0gTEJTX0NPTk5FQ1RFRDsKLQotCWlmIChjb21tYW5kID09IENNRF9SRVQoQ01EXzgwMl8xMV9BRF9IT0NfU1RBUlQpKSB7Ci0JCS8qIFVwZGF0ZSB0aGUgY3JlYXRlZCBuZXR3b3JrIGRlc2NyaXB0b3Igd2l0aCB0aGUgbmV3IEJTU0lEICovCi0JCW1lbWNweShic3MtPmJzc2lkLCByZXNwLT5ic3NpZCwgRVRIX0FMRU4pOwotCX0KLQotCS8qIFNldCB0aGUgQlNTSUQgZnJvbSB0aGUgam9pbmVkL3N0YXJ0ZWQgZGVzY3JpcHRvciAqLwotCW1lbWNweSgmcHJpdi0+Y3VyYnNzcGFyYW1zLmJzc2lkLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQkvKiBTZXQgdGhlIG5ldyBTU0lEIHRvIGN1cnJlbnQgU1NJRCAqLwotCW1lbWNweSgmcHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWQsICZic3MtPnNzaWQsIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pOwotCXByaXYtPmN1cmJzc3BhcmFtcy5zc2lkX2xlbiA9IGJzcy0+c3NpZF9sZW47Ci0KLQluZXRpZl9jYXJyaWVyX29uKHByaXYtPmRldik7Ci0JaWYgKCFwcml2LT50eF9wZW5kaW5nX2xlbikKLQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOwotCi0JbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcHJpdi0+Y3VyYnNzcGFyYW1zLmJzc2lkLCBFVEhfQUxFTik7Ci0Jd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0KLQlsYnNfZGViX2pvaW4oIkFESE9DX1JFU1A6IEpvaW5lZC9zdGFydGVkICclcycsIEJTU0lEICVwTSwgY2hhbm5lbCAlZFxuIiwKLQkJICAgICBwcmludF9zc2lkKHNzaWQsIGJzcy0+c3NpZCwgYnNzLT5zc2lkX2xlbiksCi0JCSAgICAgcHJpdi0+Y3VyYnNzcGFyYW1zLmJzc2lkLAotCQkgICAgIHByaXYtPmNoYW5uZWwpOwotCi1kb25lOgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0pPSU4sICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogIEBicmllZiBKb2luIGFuIGFkaG9jIG5ldHdvcmsgZm91bmQgaW4gYSBwcmV2aW91cyBzY2FuCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gYXNzb2NfcmVxICAgIFRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGRlc2NyaWJpbmcgdGhlIEJTUyB0byBqb2luCi0gKgotICogIEByZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgbGJzX2FkaG9jX2pvaW4oc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEpCi17Ci0Jc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX2pvaW4gY21kOwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqYnNzID0gJmFzc29jX3JlcS0+YnNzOwotCXU4IHByZWFtYmxlID0gUkFESU9fUFJFQU1CTEVfTE9ORzsKLQlERUNMQVJFX1NTSURfQlVGKHNzaWQpOwotCXUxNiByYXRlc2l6ZSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQVNTT0MpOwotCi0JbGJzX2RlYl9qb2luKCJjdXJyZW50IFNTSUQgJyVzJywgc3NpZCBsZW5ndGggJXVcbiIsCi0JCXByaW50X3NzaWQoc3NpZCwgcHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWQsCi0JCXByaXYtPmN1cmJzc3BhcmFtcy5zc2lkX2xlbiksCi0JCXByaXYtPmN1cmJzc3BhcmFtcy5zc2lkX2xlbik7Ci0JbGJzX2RlYl9qb2luKCJyZXF1ZXN0ZWQgc3NpZCAnJXMnLCBzc2lkIGxlbmd0aCAldVxuIiwKLQkJcHJpbnRfc3NpZChzc2lkLCBic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pLAotCQlic3MtPnNzaWRfbGVuKTsKLQotCS8qIGNoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgU1NJRCBpcyBhbHJlYWR5IGpvaW5lZCAqLwotCWlmIChwcml2LT5jdXJic3NwYXJhbXMuc3NpZF9sZW4gJiYKLQkgICAgIWxic19zc2lkX2NtcChwcml2LT5jdXJic3NwYXJhbXMuc3NpZCwKLQkJCXByaXYtPmN1cmJzc3BhcmFtcy5zc2lkX2xlbiwKLQkJCWJzcy0+c3NpZCwgYnNzLT5zc2lkX2xlbikgJiYKLQkgICAgKHByaXYtPm1vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYKLQkgICAgKHByaXYtPmNvbm5lY3Rfc3RhdHVzID09IExCU19DT05ORUNURUQpKSB7Ci0JCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQotCQlsYnNfZGViX2pvaW4oIkFESE9DX0pfQ01EOiBOZXcgYWQtaG9jIFNTSUQgaXMgdGhlIHNhbWUgYXMgIgotCQkJImN1cnJlbnQsIG5vdCBhdHRlbXB0aW5nIHRvIHJlLWpvaW4iKTsKLQotCQkvKiBTZW5kIHRoZSByZS1hc3NvY2lhdGlvbiBldmVudCB0aG91Z2gsIGJlY2F1c2UgdGhlIGFzc29jaWF0aW9uCi0JCSAqIHJlcXVlc3QgcmVhbGx5IHdhcyBzdWNjZXNzZnVsLCBldmVuIGlmIGp1c3QgYSBudWxsLW9wLgotCQkgKi8KLQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHByaXYtPmN1cmJzc3BhcmFtcy5ic3NpZCwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQkJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBVc2Ugc2hvcnQgcHJlYW1ibGUgb25seSB3aGVuIGJvdGggdGhlIEJTUyBhbmQgZmlybXdhcmUgc3VwcG9ydCBpdCAqLwotCWlmIChic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpIHsKLQkJbGJzX2RlYl9qb2luKCJBZGhvY0pvaW46IFNob3J0IHByZWFtYmxlXG4iKTsKLQkJcHJlYW1ibGUgPSBSQURJT19QUkVBTUJMRV9TSE9SVDsKLQl9Ci0KLQlyZXQgPSBsYnNfc2V0X3JhZGlvKHByaXYsIHByZWFtYmxlLCAxKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWxic19kZWJfam9pbigiQWRob2NKb2luOiBjaGFubmVsID0gJWRcbiIsIGFzc29jX3JlcS0+Y2hhbm5lbCk7Ci0JbGJzX2RlYl9qb2luKCJBZGhvY0pvaW46IGJhbmQgPSAlY1xuIiwgYXNzb2NfcmVxLT5iYW5kKTsKLQotCXByaXYtPmFkaG9jY3JlYXRlID0gMDsKLQlwcml2LT5jaGFubmVsID0gYnNzLT5jaGFubmVsOwotCi0JLyogQnVpbGQgdGhlIGpvaW4gY29tbWFuZCAqLwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOwotCi0JY21kLmJzcy50eXBlID0gQ01EX0JTU19UWVBFX0lCU1M7Ci0JY21kLmJzcy5iZWFjb25wZXJpb2QgPSBjcHVfdG9fbGUxNihic3MtPmJlYWNvbnBlcmlvZCk7Ci0KLQltZW1jcHkoJmNtZC5ic3MuYnNzaWQsICZic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KCZjbWQuYnNzLnNzaWQsICZic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pOwotCi0JbWVtY3B5KCZjbWQuYnNzLmRzLCAmYnNzLT5waHkuZHMsIHNpemVvZihzdHJ1Y3QgaWVlZV9pZV9kc19wYXJhbV9zZXQpKTsKLQotCW1lbWNweSgmY21kLmJzcy5pYnNzLCAmYnNzLT5zcy5pYnNzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWVfaWVfaWJzc19wYXJhbV9zZXQpKTsKLQotCWNtZC5ic3MuY2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGJzcy0+Y2FwYWJpbGl0eSAmIENBUElORk9fTUFTSyk7Ci0JbGJzX2RlYl9qb2luKCJBREhPQ19KX0NNRDogdG1wY2FwPSU0WCBDQVBJTkZPX01BU0s9JTRYXG4iLAotCSAgICAgICBic3MtPmNhcGFiaWxpdHksIENBUElORk9fTUFTSyk7Ci0KLQkvKiBpbmZvcm1hdGlvbiBvbiBCU1NJRCBkZXNjcmlwdG9yIHBhc3NlZCB0byBGVyAqLwotCWxic19kZWJfam9pbigiQURIT0NfSl9DTUQ6IEJTU0lEID0gJXBNLCBTU0lEID0gJyVzJ1xuIiwKLQkJCWNtZC5ic3MuYnNzaWQsIGNtZC5ic3Muc3NpZCk7Ci0KLQkvKiBPbmx5IHY4IGFuZCBiZWxvdyBzdXBwb3J0IHNldHRpbmcgdGhlc2UgKi8KLQlpZiAocHJpdi0+ZndyZWxlYXNlIDwgMHgwOTAwMDAwMCkgewotCQkvKiBmYWlsdGltZW91dCAqLwotCQljbWQuZmFpbHRpbWVvdXQgPSBjcHVfdG9fbGUxNihNUlZEUlZfQVNTT0NJQVRJT05fVElNRV9PVVQpOwotCQkvKiBwcm9iZWRlbGF5ICovCi0JCWNtZC5wcm9iZWRlbGF5ID0gY3B1X3RvX2xlMTYoQ01EX1NDQU5fUFJPQkVfREVMQVlfVElNRSk7Ci0JfQotCi0JLyogQ29weSBEYXRhIHJhdGVzIGZyb20gdGhlIHJhdGVzIHJlY29yZGVkIGluIHNjYW4gcmVzcG9uc2UgKi8KLQltZW1zZXQoY21kLmJzcy5yYXRlcywgMCwgc2l6ZW9mKGNtZC5ic3MucmF0ZXMpKTsKLQlyYXRlc2l6ZSA9IG1pbl90KHUxNiwgQVJSQVlfU0laRShjbWQuYnNzLnJhdGVzKSwgQVJSQVlfU0laRSAoYnNzLT5yYXRlcykpOwotCW1lbWNweShjbWQuYnNzLnJhdGVzLCBic3MtPnJhdGVzLCByYXRlc2l6ZSk7Ci0JaWYgKGdldF9jb21tb25fcmF0ZXMocHJpdiwgY21kLmJzcy5yYXRlcywgJnJhdGVzaXplKSkgewotCQlsYnNfZGViX2pvaW4oIkFESE9DX0pPSU46IGdldF9jb21tb25fcmF0ZXMgcmV0dXJuZWQgZXJyb3IuXG4iKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENvcHkgdGhlIGFkLWhvYyBjcmVhdGlvbiByYXRlcyBpbnRvIEN1cnJlbnQgQlNTIHN0YXRlIHN0cnVjdHVyZSAqLwotCW1lbXNldCgmcHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzLCAwLCBzaXplb2YocHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzKSk7Ci0JbWVtY3B5KCZwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMsIGNtZC5ic3MucmF0ZXMsIHJhdGVzaXplKTsKLQotCS8qIFNldCBNU0Igb24gYmFzaWMgcmF0ZXMgYXMgdGhlIGZpcm13YXJlIHJlcXVpcmVzLCBidXQgX2FmdGVyXwotCSAqIGNvcHlpbmcgdG8gY3VycmVudCBic3MgcmF0ZXMuCi0JICovCi0JbGJzX3NldF9iYXNpY19yYXRlX2ZsYWdzKGNtZC5ic3MucmF0ZXMsIHJhdGVzaXplKTsKLQotCWNtZC5ic3MuaWJzcy5hdGltd2luZG93ID0gYnNzLT5hdGltd2luZG93OwotCi0JaWYgKGFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCkgewotCQl1MTYgdG1wID0gbGUxNl90b19jcHUoY21kLmJzcy5jYXBhYmlsaXR5KTsKLQkJdG1wIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCQljbWQuYnNzLmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNih0bXApOwotCX0KLQotCWlmIChwcml2LT5wc21vZGUgPT0gTEJTODAyXzExUE9XRVJNT0RFTUFYX1BTUCkgewotCQlfX2xlMzIgbG9jYWxfcHNfbW9kZSA9IGNwdV90b19sZTMyKExCUzgwMl8xMVBPV0VSTU9ERUNBTSk7Ci0KLQkJLyogd2FrZSB1cCBmaXJzdCAqLwotCQlyZXQgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIENNRF84MDJfMTFfUFNfTU9ERSwKLQkJCQkJCSAgIENNRF9BQ1RfU0VULCAwLCAwLAotCQkJCQkJICAgJmxvY2FsX3BzX21vZGUpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtMTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQURfSE9DX0pPSU4sICZjbWQpOwotCWlmIChyZXQgPT0gMCkgewotCQlyZXQgPSBsYnNfYWRob2NfcG9zdChwcml2LAotCQkJCSAgICAgKHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgKikmY21kKTsKLQl9Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFN0YXJ0IGFuIEFkaG9jIE5ldHdvcmsKLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSBhc3NvY19yZXEgICAgVGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZGVzY3JpYmluZyB0aGUgQlNTIHRvIHN0YXJ0Ci0gKgotICogIEByZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgbGJzX2FkaG9jX3N0YXJ0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdGFydCBjbWQ7Ci0JdTggcHJlYW1ibGUgPSBSQURJT19QUkVBTUJMRV9TSE9SVDsKLQlzaXplX3QgcmF0ZXNpemUgPSAwOwotCXUxNiB0bXBjYXAgPSAwOwotCWludCByZXQgPSAwOwotCURFQ0xBUkVfU1NJRF9CVUYoc3NpZCk7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQVNTT0MpOwotCi0JcmV0ID0gbGJzX3NldF9yYWRpbyhwcml2LCBwcmVhbWJsZSwgMSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBCdWlsZCB0aGUgc3RhcnQgY29tbWFuZCAqLwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOwotCi0JbWVtY3B5KGNtZC5zc2lkLCBhc3NvY19yZXEtPnNzaWQsIGFzc29jX3JlcS0+c3NpZF9sZW4pOwotCi0JbGJzX2RlYl9qb2luKCJBREhPQ19TVEFSVDogU1NJRCAnJXMnLCBzc2lkIGxlbmd0aCAldVxuIiwKLQkJcHJpbnRfc3NpZChzc2lkLCBhc3NvY19yZXEtPnNzaWQsIGFzc29jX3JlcS0+c3NpZF9sZW4pLAotCQlhc3NvY19yZXEtPnNzaWRfbGVuKTsKLQotCWNtZC5ic3N0eXBlID0gQ01EX0JTU19UWVBFX0lCU1M7Ci0KLQlpZiAocHJpdi0+YmVhY29uX3BlcmlvZCA9PSAwKQotCQlwcml2LT5iZWFjb25fcGVyaW9kID0gTVJWRFJWX0JFQUNPTl9JTlRFUlZBTDsKLQljbWQuYmVhY29ucGVyaW9kID0gY3B1X3RvX2xlMTYocHJpdi0+YmVhY29uX3BlcmlvZCk7Ci0KLQlXQVJOX09OKCFhc3NvY19yZXEtPmNoYW5uZWwpOwotCi0JLyogc2V0IFBoeXNpY2FsIHBhcmFtZXRlciBzZXQgKi8KLQljbWQuZHMuaGVhZGVyLmlkID0gV0xBTl9FSURfRFNfUEFSQU1TOwotCWNtZC5kcy5oZWFkZXIubGVuID0gMTsKLQljbWQuZHMuY2hhbm5lbCA9IGFzc29jX3JlcS0+Y2hhbm5lbDsKLQotCS8qIHNldCBJQlNTIHBhcmFtZXRlciBzZXQgKi8KLQljbWQuaWJzcy5oZWFkZXIuaWQgPSBXTEFOX0VJRF9JQlNTX1BBUkFNUzsKLQljbWQuaWJzcy5oZWFkZXIubGVuID0gMjsKLQljbWQuaWJzcy5hdGltd2luZG93ID0gY3B1X3RvX2xlMTYoMCk7Ci0KLQkvKiBzZXQgY2FwYWJpbGl0eSBpbmZvICovCi0JdG1wY2FwID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7Ci0JaWYgKGFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCB8fAotCSAgICBhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCB8fAotCSAgICBhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKLQkJbGJzX2RlYl9qb2luKCJBREhPQ19TVEFSVDogV0VQL1dQQSBlbmFibGVkLCBwcml2YWN5IG9uXG4iKTsKLQkJdG1wY2FwIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCX0gZWxzZQotCQlsYnNfZGViX2pvaW4oIkFESE9DX1NUQVJUOiBXRVAgZGlzYWJsZWQsIHByaXZhY3kgb2ZmXG4iKTsKLQotCWNtZC5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYodG1wY2FwKTsKLQotCS8qIE9ubHkgdjggYW5kIGJlbG93IHN1cHBvcnQgc2V0dGluZyBwcm9iZSBkZWxheSAqLwotCWlmIChwcml2LT5md3JlbGVhc2UgPCAweDA5MDAwMDAwKQotCQljbWQucHJvYmVkZWxheSA9IGNwdV90b19sZTE2KENNRF9TQ0FOX1BST0JFX0RFTEFZX1RJTUUpOwotCi0JcmF0ZXNpemUgPSBtaW4oc2l6ZW9mKGNtZC5yYXRlcyksIHNpemVvZihsYnNfYmdfcmF0ZXMpKTsKLQltZW1jcHkoY21kLnJhdGVzLCBsYnNfYmdfcmF0ZXMsIHJhdGVzaXplKTsKLQotCS8qIENvcHkgdGhlIGFkLWhvYyBjcmVhdGluZyByYXRlcyBpbnRvIEN1cnJlbnQgQlNTIHN0YXRlIHN0cnVjdHVyZSAqLwotCW1lbXNldCgmcHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzLCAwLCBzaXplb2YocHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzKSk7Ci0JbWVtY3B5KCZwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMsICZjbWQucmF0ZXMsIHJhdGVzaXplKTsKLQotCS8qIFNldCBNU0Igb24gYmFzaWMgcmF0ZXMgYXMgdGhlIGZpcm13YXJlIHJlcXVpcmVzLCBidXQgX2FmdGVyXwotCSAqIGNvcHlpbmcgdG8gY3VycmVudCBic3MgcmF0ZXMuCi0JICovCi0JbGJzX3NldF9iYXNpY19yYXRlX2ZsYWdzKGNtZC5yYXRlcywgcmF0ZXNpemUpOwotCi0JbGJzX2RlYl9qb2luKCJBREhPQ19TVEFSVDogcmF0ZXM9JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkgICAgICAgY21kLnJhdGVzWzBdLCBjbWQucmF0ZXNbMV0sIGNtZC5yYXRlc1syXSwgY21kLnJhdGVzWzNdKTsKLQotCWxic19kZWJfam9pbigiQURIT0NfU1RBUlQ6IFN0YXJ0aW5nIEFkLUhvYyBCU1Mgb24gY2hhbm5lbCAlZCwgYmFuZCAlZFxuIiwKLQkJICAgICBhc3NvY19yZXEtPmNoYW5uZWwsIGFzc29jX3JlcS0+YmFuZCk7Ci0KLQlwcml2LT5hZGhvY2NyZWF0ZSA9IDE7Ci0JcHJpdi0+bW9kZSA9IElXX01PREVfQURIT0M7Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9BRF9IT0NfU1RBUlQsICZjbWQpOwotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gbGJzX2FkaG9jX3Bvc3QocHJpdiwKLQkJCQkgICAgIChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0ICopJmNtZCk7Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFN0b3AgYW5kIEFkLUhvYyBuZXR3b3JrIGFuZCBleGl0IEFkLUhvYyBtb2RlCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuICAgICAgICAgICAgIDAgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IKLSAqLwotaW50IGxic19hZGhvY19zdG9wKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RvcCBjbWQ7Ci0JaW50IHJldDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9KT0lOKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YgKGNtZCkpOwotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2IChzaXplb2YgKGNtZCkpOwotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQURfSE9DX1NUT1AsICZjbWQpOwotCi0JLyogQ2xlYW4gdXAgZXZlcnl0aGluZyBldmVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLwotCWxic19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQVNTT0MsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1hdGNoX2Jzc19ub19zZWN1cml0eShzdHJ1Y3QgbGJzXzgwMl8xMV9zZWN1cml0eSAqc2VjaW5mbywKLQkJCQkJc3RydWN0IGJzc19kZXNjcmlwdG9yICptYXRjaF9ic3MpCi17Ci0JaWYgKCFzZWNpbmZvLT53ZXBfZW5hYmxlZCAmJgotCSAgICAhc2VjaW5mby0+V1BBZW5hYmxlZCAmJiAhc2VjaW5mby0+V1BBMmVuYWJsZWQgJiYKLQkgICAgbWF0Y2hfYnNzLT53cGFfaWVbMF0gIT0gV0xBTl9FSURfR0VORVJJQyAmJgotCSAgICBtYXRjaF9ic3MtPnJzbl9pZVswXSAhPSBXTEFOX0VJRF9SU04gJiYKLQkgICAgIShtYXRjaF9ic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1hdGNoX2Jzc19zdGF0aWNfd2VwKHN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5ICpzZWNpbmZvLAotCQkJCSAgICAgICBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKm1hdGNoX2JzcykKLXsKLQlpZiAoc2VjaW5mby0+d2VwX2VuYWJsZWQgJiYKLQkgICAgIXNlY2luZm8tPldQQWVuYWJsZWQgJiYgIXNlY2luZm8tPldQQTJlbmFibGVkICYmCi0JICAgIChtYXRjaF9ic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1hdGNoX2Jzc193cGEoc3RydWN0IGxic184MDJfMTFfc2VjdXJpdHkgKnNlY2luZm8sCi0JCQkJc3RydWN0IGJzc19kZXNjcmlwdG9yICptYXRjaF9ic3MpCi17Ci0JaWYgKCFzZWNpbmZvLT53ZXBfZW5hYmxlZCAmJiBzZWNpbmZvLT5XUEFlbmFibGVkICYmCi0JICAgIChtYXRjaF9ic3MtPndwYV9pZVswXSA9PSBXTEFOX0VJRF9HRU5FUklDKQotCSAgICAvKiBwcml2YWN5IGJpdCBtYXkgTk9UIGJlIHNldCBpbiBzb21lIEFQcyBsaWtlIExpbmtTeXMgV1JUNTRHCi0JICAgICYmIChtYXRjaF9ic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgKi8KLQkgICApCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1hdGNoX2Jzc193cGEyKHN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5ICpzZWNpbmZvLAotCQkJCSBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKm1hdGNoX2JzcykKLXsKLQlpZiAoIXNlY2luZm8tPndlcF9lbmFibGVkICYmIHNlY2luZm8tPldQQTJlbmFibGVkICYmCi0JICAgIChtYXRjaF9ic3MtPnJzbl9pZVswXSA9PSBXTEFOX0VJRF9SU04pCi0JICAgIC8qIHByaXZhY3kgYml0IG1heSBOT1QgYmUgc2V0IGluIHNvbWUgQVBzIGxpa2UgTGlua1N5cyBXUlQ1NEcKLQkgICAgKG1hdGNoX2Jzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSAqLwotCSAgICkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfYnNzX2R5bmFtaWNfd2VwKHN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5ICpzZWNpbmZvLAotCQkJCQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKm1hdGNoX2JzcykKLXsKLQlpZiAoIXNlY2luZm8tPndlcF9lbmFibGVkICYmCi0JICAgICFzZWNpbmZvLT5XUEFlbmFibGVkICYmICFzZWNpbmZvLT5XUEEyZW5hYmxlZCAmJgotCSAgICAobWF0Y2hfYnNzLT53cGFfaWVbMF0gIT0gV0xBTl9FSURfR0VORVJJQykgJiYKLQkgICAgKG1hdGNoX2Jzcy0+cnNuX2llWzBdICE9IFdMQU5fRUlEX1JTTikgJiYKLQkgICAgKG1hdGNoX2Jzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIENoZWNrIGlmIGEgc2Nhbm5lZCBuZXR3b3JrIGNvbXBhdGlibGUgd2l0aCB0aGUgZHJpdmVyIHNldHRpbmdzCi0gKgotICogICBXRVAgICAgIFdQQSAgICAgV1BBMiAgICBhZC1ob2MgIGVuY3J5cHQgICAgICAgICAgICAgICAgICAgICAgTmV0d29yawotICogZW5hYmxlZCBlbmFibGVkICBlbmFibGVkICAgQUVTICAgICBtb2RlICAgcHJpdmFjeSAgV1BBICBXUEEyICBDb21wYXRpYmxlCi0gKiAgICAwICAgICAgIDAgICAgICAgIDAgICAgICAgMCAgICAgIE5PTkUgICAgICAwICAgICAgMCAgICAwICAgeWVzIE5vIHNlY3VyaXR5Ci0gKiAgICAxICAgICAgIDAgICAgICAgIDAgICAgICAgMCAgICAgIE5PTkUgICAgICAxICAgICAgMCAgICAwICAgeWVzIFN0YXRpYyBXRVAKLSAqICAgIDAgICAgICAgMSAgICAgICAgMCAgICAgICAwICAgICAgIHggICAgICAgIDF4ICAgICAxICAgIHggICB5ZXMgV1BBCi0gKiAgICAwICAgICAgIDAgICAgICAgIDEgICAgICAgMCAgICAgICB4ICAgICAgICAxeCAgICAgeCAgICAxICAgeWVzIFdQQTIKLSAqICAgIDAgICAgICAgMCAgICAgICAgMCAgICAgICAxICAgICAgTk9ORSAgICAgIDEgICAgICAwICAgIDAgICB5ZXMgQWQtaG9jIEFFUwotICogICAgMCAgICAgICAwICAgICAgICAwICAgICAgIDAgICAgICE9Tk9ORSAgICAgMSAgICAgIDAgICAgMCAgIHllcyBEeW5hbWljIFdFUAotICoKLSAqCi0gKiAgQHBhcmFtIHByaXYgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZQotICogIEBwYXJhbSBpbmRleCAgIEluZGV4IGluIHNjYW50YWJsZSB0byBjaGVjayBhZ2FpbnN0IGN1cnJlbnQgZHJpdmVyIHNldHRpbmdzCi0gKiAgQHBhcmFtIG1vZGUgICAgTmV0d29yayBtb2RlOiBJbmZyYXN0cnVjdHVyZSBvciBJQlNTCi0gKgotICogIEByZXR1cm4gICAgICAgIEluZGV4IGluIHNjYW50YWJsZSwgb3IgZXJyb3IgY29kZSBpZiBuZWdhdGl2ZQotICovCi1zdGF0aWMgaW50IGlzX25ldHdvcmtfY29tcGF0aWJsZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJIHN0cnVjdCBic3NfZGVzY3JpcHRvciAqYnNzLCB1aW50OF90IG1vZGUpCi17Ci0JaW50IG1hdGNoZWQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1NDQU4pOwotCi0JaWYgKGJzcy0+bW9kZSAhPSBtb2RlKQotCQlnb3RvIGRvbmU7Ci0KLQltYXRjaGVkID0gbWF0Y2hfYnNzX25vX3NlY3VyaXR5KCZwcml2LT5zZWNpbmZvLCBic3MpOwotCWlmIChtYXRjaGVkKQotCQlnb3RvIGRvbmU7Ci0JbWF0Y2hlZCA9IG1hdGNoX2Jzc19zdGF0aWNfd2VwKCZwcml2LT5zZWNpbmZvLCBic3MpOwotCWlmIChtYXRjaGVkKQotCQlnb3RvIGRvbmU7Ci0JbWF0Y2hlZCA9IG1hdGNoX2Jzc193cGEoJnByaXYtPnNlY2luZm8sIGJzcyk7Ci0JaWYgKG1hdGNoZWQpIHsKLQkJbGJzX2RlYl9zY2FuKCJpc19uZXR3b3JrX2NvbXBhdGlibGUoKSBXUEE6IHdwYV9pZSAweCV4ICIKLQkJCSAgICAgIndwYTJfaWUgMHgleCBXRVAgJXMgV1BBICVzIFdQQTIgJXMgIgotCQkJICAgICAicHJpdmFjeSAweCV4XG4iLCBic3MtPndwYV9pZVswXSwgYnNzLT5yc25faWVbMF0sCi0JCQkgICAgIHByaXYtPnNlY2luZm8ud2VwX2VuYWJsZWQgPyAiZSIgOiAiZCIsCi0JCQkgICAgIHByaXYtPnNlY2luZm8uV1BBZW5hYmxlZCA/ICJlIiA6ICJkIiwKLQkJCSAgICAgcHJpdi0+c2VjaW5mby5XUEEyZW5hYmxlZCA/ICJlIiA6ICJkIiwKLQkJCSAgICAgKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbWF0Y2hlZCA9IG1hdGNoX2Jzc193cGEyKCZwcml2LT5zZWNpbmZvLCBic3MpOwotCWlmIChtYXRjaGVkKSB7Ci0JCWxic19kZWJfc2NhbigiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgV1BBMjogd3BhX2llIDB4JXggIgotCQkJICAgICAid3BhMl9pZSAweCV4IFdFUCAlcyBXUEEgJXMgV1BBMiAlcyAiCi0JCQkgICAgICJwcml2YWN5IDB4JXhcbiIsIGJzcy0+d3BhX2llWzBdLCBic3MtPnJzbl9pZVswXSwKLQkJCSAgICAgcHJpdi0+c2VjaW5mby53ZXBfZW5hYmxlZCA/ICJlIiA6ICJkIiwKLQkJCSAgICAgcHJpdi0+c2VjaW5mby5XUEFlbmFibGVkID8gImUiIDogImQiLAotCQkJICAgICBwcml2LT5zZWNpbmZvLldQQTJlbmFibGVkID8gImUiIDogImQiLAotCQkJICAgICAoYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpKTsKLQkJZ290byBkb25lOwotCX0KLQltYXRjaGVkID0gbWF0Y2hfYnNzX2R5bmFtaWNfd2VwKCZwcml2LT5zZWNpbmZvLCBic3MpOwotCWlmIChtYXRjaGVkKSB7Ci0JCWxic19kZWJfc2NhbigiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgZHluYW1pYyBXRVA6ICIKLQkJCSAgICAgIndwYV9pZSAweCV4IHdwYTJfaWUgMHgleCBwcml2YWN5IDB4JXhcbiIsCi0JCQkgICAgIGJzcy0+d3BhX2llWzBdLCBic3MtPnJzbl9pZVswXSwKLQkJCSAgICAgKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBic3Mgc2VjdXJpdHkgc2V0dGluZ3MgZG9uJ3QgbWF0Y2ggdGhvc2UgY29uZmlndXJlZCBvbiBjYXJkICovCi0JbGJzX2RlYl9zY2FuKCJpc19uZXR3b3JrX2NvbXBhdGlibGUoKSBGQUlMRUQ6IHdwYV9pZSAweCV4ICIKLQkJICAgICAid3BhMl9pZSAweCV4IFdFUCAlcyBXUEEgJXMgV1BBMiAlcyBwcml2YWN5IDB4JXhcbiIsCi0JCSAgICAgYnNzLT53cGFfaWVbMF0sIGJzcy0+cnNuX2llWzBdLAotCQkgICAgIHByaXYtPnNlY2luZm8ud2VwX2VuYWJsZWQgPyAiZSIgOiAiZCIsCi0JCSAgICAgcHJpdi0+c2VjaW5mby5XUEFlbmFibGVkID8gImUiIDogImQiLAotCQkgICAgIHByaXYtPnNlY2luZm8uV1BBMmVuYWJsZWQgPyAiZSIgOiAiZCIsCi0JCSAgICAgKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSk7Ci0KLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfU0NBTiwgIm1hdGNoZWQ6ICVkIiwgbWF0Y2hlZCk7Ci0JcmV0dXJuIG1hdGNoZWQ7Ci19Ci0KLS8qKgotICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgc3BlY2lmaWMgY29tcGF0aWJsZSBCU1NJRCBpbiB0aGUgc2NhbiBsaXN0Ci0gKgotICogIFVzZWQgaW4gYXNzb2NpYXRpb24gY29kZQotICoKLSAqICBAcGFyYW0gcHJpdiAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZQotICogIEBwYXJhbSBic3NpZCAgICBCU1NJRCB0byBmaW5kIGluIHRoZSBzY2FuIGxpc3QKLSAqICBAcGFyYW0gbW9kZSAgICAgTmV0d29yayBtb2RlOiBJbmZyYXN0cnVjdHVyZSBvciBJQlNTCi0gKgotICogIEByZXR1cm4gICAgICAgICBpbmRleCBpbiBCU1NJRCBsaXN0LCBvciBlcnJvciByZXR1cm4gY29kZSAoPCAwKQotICovCi1zdGF0aWMgc3RydWN0IGJzc19kZXNjcmlwdG9yICpsYnNfZmluZF9ic3NpZF9pbl9saXN0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkJICAgICAgdWludDhfdCAqYnNzaWQsIHVpbnQ4X3QgbW9kZSkKLXsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKml0ZXJfYnNzOwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqZm91bmRfYnNzID0gTlVMTDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9TQ0FOKTsKLQotCWlmICghYnNzaWQpCi0JCWdvdG8gb3V0OwotCi0JbGJzX2RlYl9oZXgoTEJTX0RFQl9TQ0FOLCAibG9va2luZyBmb3IiLCBic3NpZCwgRVRIX0FMRU4pOwotCi0JLyogTG9vayB0aHJvdWdoIHRoZSBzY2FuIHRhYmxlIGZvciBhIGNvbXBhdGlibGUgbWF0Y2guICBUaGUgbG9vcCB3aWxsCi0JICogICBjb250aW51ZSBwYXN0IGEgbWF0Y2hlZCBic3NpZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIGluIGNhc2UgdGhlcmUKLQkgKiAgIGlzIGFuIEFQIHdpdGggbXVsdGlwbGUgU1NJRHMgYXNzaWduZWQgdG8gdGhlIHNhbWUgQlNTSUQKLQkgKi8KLQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXJfYnNzLCAmcHJpdi0+bmV0d29ya19saXN0LCBsaXN0KSB7Ci0JCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoaXRlcl9ic3MtPmJzc2lkLCBic3NpZCkpCi0JCQljb250aW51ZTsgLyogYnNzaWQgZG9lc24ndCBtYXRjaCAqLwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBJV19NT0RFX0lORlJBOgotCQljYXNlIElXX01PREVfQURIT0M6Ci0JCQlpZiAoIWlzX25ldHdvcmtfY29tcGF0aWJsZShwcml2LCBpdGVyX2JzcywgbW9kZSkpCi0JCQkJYnJlYWs7Ci0JCQlmb3VuZF9ic3MgPSBpdGVyX2JzczsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZm91bmRfYnNzID0gaXRlcl9ic3M7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfU0NBTiwgImZvdW5kX2JzcyAlcCIsIGZvdW5kX2Jzcyk7Ci0JcmV0dXJuIGZvdW5kX2JzczsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZmluZHMgc3NpZCBpbiBzc2lkIGxpc3QuCi0gKgotICogIFVzZWQgaW4gYXNzb2NpYXRpb24gY29kZQotICoKLSAqICBAcGFyYW0gcHJpdiAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZQotICogIEBwYXJhbSBzc2lkICAgICBTU0lEIHRvIGZpbmQgaW4gdGhlIGxpc3QKLSAqICBAcGFyYW0gYnNzaWQgICAgQlNTSUQgdG8gcXVhbGlmeSB0aGUgU1NJRCBzZWxlY3Rpb24gKGlmIHByb3ZpZGVkKQotICogIEBwYXJhbSBtb2RlICAgICBOZXR3b3JrIG1vZGU6IEluZnJhc3RydWN0dXJlIG9yIElCU1MKLSAqCi0gKiAgQHJldHVybiAgICAgICAgIGluZGV4IGluIEJTU0lEIGxpc3QKLSAqLwotc3RhdGljIHN0cnVjdCBic3NfZGVzY3JpcHRvciAqbGJzX2ZpbmRfc3NpZF9pbl9saXN0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkJICAgICB1aW50OF90ICpzc2lkLCB1aW50OF90IHNzaWRfbGVuLAotCQkJCQkgICAgIHVpbnQ4X3QgKmJzc2lkLCB1aW50OF90IG1vZGUsCi0JCQkJCSAgICAgaW50IGNoYW5uZWwpCi17Ci0JdTMyIGJlc3Ryc3NpID0gMDsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKml0ZXJfYnNzID0gTlVMTDsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKmZvdW5kX2JzcyA9IE5VTEw7Ci0Jc3RydWN0IGJzc19kZXNjcmlwdG9yICp0bXBfb2xkZXN0ID0gTlVMTDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9TQ0FOKTsKLQotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyX2JzcywgJnByaXYtPm5ldHdvcmtfbGlzdCwgbGlzdCkgewotCQlpZiAoIXRtcF9vbGRlc3QgfHwKLQkJICAgIChpdGVyX2Jzcy0+bGFzdF9zY2FubmVkIDwgdG1wX29sZGVzdC0+bGFzdF9zY2FubmVkKSkKLQkJCXRtcF9vbGRlc3QgPSBpdGVyX2JzczsKLQotCQlpZiAobGJzX3NzaWRfY21wKGl0ZXJfYnNzLT5zc2lkLCBpdGVyX2Jzcy0+c3NpZF9sZW4sCi0JCQkJIHNzaWQsIHNzaWRfbGVuKSAhPSAwKQotCQkJY29udGludWU7IC8qIHNzaWQgZG9lc24ndCBtYXRjaCAqLwotCQlpZiAoYnNzaWQgJiYgY29tcGFyZV9ldGhlcl9hZGRyKGl0ZXJfYnNzLT5ic3NpZCwgYnNzaWQpICE9IDApCi0JCQljb250aW51ZTsgLyogYnNzaWQgZG9lc24ndCBtYXRjaCAqLwotCQlpZiAoKGNoYW5uZWwgPiAwKSAmJiAoaXRlcl9ic3MtPmNoYW5uZWwgIT0gY2hhbm5lbCkpCi0JCQljb250aW51ZTsgLyogY2hhbm5lbCBkb2Vzbid0IG1hdGNoICovCi0KLQkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJY2FzZSBJV19NT0RFX0FESE9DOgotCQkJaWYgKCFpc19uZXR3b3JrX2NvbXBhdGlibGUocHJpdiwgaXRlcl9ic3MsIG1vZGUpKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoYnNzaWQpIHsKLQkJCQkvKiBGb3VuZCByZXF1ZXN0ZWQgQlNTSUQgKi8KLQkJCQlmb3VuZF9ic3MgPSBpdGVyX2JzczsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJaWYgKFNDQU5fUlNTSShpdGVyX2Jzcy0+cnNzaSkgPiBiZXN0cnNzaSkgewotCQkJCWJlc3Ryc3NpID0gU0NBTl9SU1NJKGl0ZXJfYnNzLT5yc3NpKTsKLQkJCQlmb3VuZF9ic3MgPSBpdGVyX2JzczsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElXX01PREVfQVVUTzoKLQkJZGVmYXVsdDoKLQkJCWlmIChTQ0FOX1JTU0koaXRlcl9ic3MtPnJzc2kpID4gYmVzdHJzc2kpIHsKLQkJCQliZXN0cnNzaSA9IFNDQU5fUlNTSShpdGVyX2Jzcy0+cnNzaSk7Ci0JCQkJZm91bmRfYnNzID0gaXRlcl9ic3M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfU0NBTiwgImZvdW5kX2JzcyAlcCIsIGZvdW5kX2Jzcyk7Ci0JcmV0dXJuIGZvdW5kX2JzczsKLX0KLQotc3RhdGljIGludCBhc3NvY19oZWxwZXJfZXNzaWQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGJzc19kZXNjcmlwdG9yICogYnNzOwotCWludCBjaGFubmVsID0gLTE7Ci0JREVDTEFSRV9TU0lEX0JVRihzc2lkKTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9BU1NPQyk7Ci0KLQkvKiBGSVhNRTogdGFrZSBjaGFubmVsIGludG8gYWNjb3VudCB3aGVuIHBpY2tpbmcgU1NJRHMgaWYgYSBjaGFubmVsCi0JICogaXMgc2V0LgotCSAqLwotCi0JaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfQ0hBTk5FTCwgJmFzc29jX3JlcS0+ZmxhZ3MpKQotCQljaGFubmVsID0gYXNzb2NfcmVxLT5jaGFubmVsOwotCi0JbGJzX2RlYl9hc3NvYygiU1NJRCAnJXMnIHJlcXVlc3RlZFxuIiwKLQkgICAgICAgICAgICAgIHByaW50X3NzaWQoc3NpZCwgYXNzb2NfcmVxLT5zc2lkLCBhc3NvY19yZXEtPnNzaWRfbGVuKSk7Ci0JaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0lORlJBKSB7Ci0JCWxic19zZW5kX3NwZWNpZmljX3NzaWRfc2Nhbihwcml2LCBhc3NvY19yZXEtPnNzaWQsCi0JCQlhc3NvY19yZXEtPnNzaWRfbGVuKTsKLQotCQlic3MgPSBsYnNfZmluZF9zc2lkX2luX2xpc3QocHJpdiwgYXNzb2NfcmVxLT5zc2lkLAotCQkJCWFzc29jX3JlcS0+c3NpZF9sZW4sIE5VTEwsIElXX01PREVfSU5GUkEsIGNoYW5uZWwpOwotCQlpZiAoYnNzICE9IE5VTEwpIHsKLQkJCW1lbWNweSgmYXNzb2NfcmVxLT5ic3MsIGJzcywgc2l6ZW9mKHN0cnVjdCBic3NfZGVzY3JpcHRvcikpOwotCQkJcmV0ID0gbGJzX3RyeV9hc3NvY2lhdGUocHJpdiwgYXNzb2NfcmVxKTsKLQkJfSBlbHNlIHsKLQkJCWxic19kZWJfYXNzb2MoIlNTSUQgbm90IGZvdW5kOyBjYW5ub3QgYXNzb2NpYXRlXG4iKTsKLQkJfQotCX0gZWxzZSBpZiAoYXNzb2NfcmVxLT5tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJLyogU2NhbiBmb3IgdGhlIG5ldHdvcmssIGRvIG5vdCBzYXZlIHByZXZpb3VzIHJlc3VsdHMuICBTdGFsZQotCQkgKiAgIHNjYW4gZGF0YSB3aWxsIGNhdXNlIHVzIHRvIGpvaW4gYSBub24tZXhpc3RhbnQgYWRob2MgbmV0d29yawotCQkgKi8KLQkJbGJzX3NlbmRfc3BlY2lmaWNfc3NpZF9zY2FuKHByaXYsIGFzc29jX3JlcS0+c3NpZCwKLQkJCWFzc29jX3JlcS0+c3NpZF9sZW4pOwotCi0JCS8qIFNlYXJjaCBmb3IgdGhlIHJlcXVlc3RlZCBTU0lEIGluIHRoZSBzY2FuIHRhYmxlICovCi0JCWJzcyA9IGxic19maW5kX3NzaWRfaW5fbGlzdChwcml2LCBhc3NvY19yZXEtPnNzaWQsCi0JCQkJYXNzb2NfcmVxLT5zc2lkX2xlbiwgTlVMTCwgSVdfTU9ERV9BREhPQywgY2hhbm5lbCk7Ci0JCWlmIChic3MgIT0gTlVMTCkgewotCQkJbGJzX2RlYl9hc3NvYygiU1NJRCBmb3VuZCwgd2lsbCBqb2luXG4iKTsKLQkJCW1lbWNweSgmYXNzb2NfcmVxLT5ic3MsIGJzcywgc2l6ZW9mKHN0cnVjdCBic3NfZGVzY3JpcHRvcikpOwotCQkJbGJzX2FkaG9jX2pvaW4ocHJpdiwgYXNzb2NfcmVxKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGVsc2Ugc2VuZCBTVEFSVCBjb21tYW5kICovCi0JCQlsYnNfZGViX2Fzc29jKCJTU0lEIG5vdCBmb3VuZCwgY3JlYXRpbmcgYWRob2MgbmV0d29ya1xuIik7Ci0JCQltZW1jcHkoJmFzc29jX3JlcS0+YnNzLnNzaWQsICZhc3NvY19yZXEtPnNzaWQsCi0JCQkJSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JCQlhc3NvY19yZXEtPmJzcy5zc2lkX2xlbiA9IGFzc29jX3JlcS0+c3NpZF9sZW47Ci0JCQlsYnNfYWRob2Nfc3RhcnQocHJpdiwgYXNzb2NfcmVxKTsKLQkJfQotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0FTU09DLCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgYXNzb2NfaGVscGVyX2Jzc2lkKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqIGJzczsKLQotCWxic19kZWJfZW50ZXJfYXJncyhMQlNfREVCX0FTU09DLCAiQlNTSUQgJXBNIiwgYXNzb2NfcmVxLT5ic3NpZCk7Ci0KLQkvKiBTZWFyY2ggZm9yIGluZGV4IHBvc2l0aW9uIGluIGxpc3QgZm9yIHJlcXVlc3RlZCBNQUMgKi8KLQlic3MgPSBsYnNfZmluZF9ic3NpZF9pbl9saXN0KHByaXYsIGFzc29jX3JlcS0+YnNzaWQsCi0JCQkgICAgYXNzb2NfcmVxLT5tb2RlKTsKLQlpZiAoYnNzID09IE5VTEwpIHsKLQkJbGJzX2RlYl9hc3NvYygiQVNTT0M6IFdBUDogQlNTSUQgJXBNIG5vdCBmb3VuZCwgIgotCQkJImNhbm5vdCBhc3NvY2lhdGUuXG4iLCBhc3NvY19yZXEtPmJzc2lkKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtY3B5KCZhc3NvY19yZXEtPmJzcywgYnNzLCBzaXplb2Yoc3RydWN0IGJzc19kZXNjcmlwdG9yKSk7Ci0JaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0lORlJBKSB7Ci0JCXJldCA9IGxic190cnlfYXNzb2NpYXRlKHByaXYsIGFzc29jX3JlcSk7Ci0JCWxic19kZWJfYXNzb2MoIkFTU09DOiBsYnNfdHJ5X2Fzc29jaWF0ZShic3NpZCkgcmV0dXJuZWQgJWRcbiIsCi0JCQkgICAgICByZXQpOwotCX0gZWxzZSBpZiAoYXNzb2NfcmVxLT5tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJbGJzX2FkaG9jX2pvaW4ocHJpdiwgYXNzb2NfcmVxKTsKLQl9Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGFzc29jX2hlbHBlcl9hc3NvY2lhdGUoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwLCBkb25lID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9BU1NPQyk7Ci0KLQkvKiBJZiB3ZSdyZSBnaXZlbiBhbmQgJ2FueScgQlNTSUQsIHRyeSBhc3NvY2lhdGluZyBiYXNlZCBvbiBTU0lEICovCi0KLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoYnNzaWRfYW55LCBhc3NvY19yZXEtPmJzc2lkKSAmJgotCQkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGJzc2lkX29mZiwgYXNzb2NfcmVxLT5ic3NpZCkpIHsKLQkJCXJldCA9IGFzc29jX2hlbHBlcl9ic3NpZChwcml2LCBhc3NvY19yZXEpOwotCQkJZG9uZSA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIWRvbmUgJiYgdGVzdF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJcmV0ID0gYXNzb2NfaGVscGVyX2Vzc2lkKHByaXYsIGFzc29jX3JlcSk7Ci0JfQotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQVNTT0MsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBhc3NvY19oZWxwZXJfbW9kZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gcHJpdi0+bW9kZSkKLQkJZ290byBkb25lOwotCi0JaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0lORlJBKSB7Ci0JCWlmIChwcml2LT5wc3N0YXRlICE9IFBTX1NUQVRFX0ZVTExfUE9XRVIpCi0JCQlsYnNfcHNfd2FrZXVwKHByaXYsIENNRF9PUFRJT05fV0FJVEZPUlJTUCk7Ci0JCXByaXYtPnBzbW9kZSA9IExCUzgwMl8xMVBPV0VSTU9ERUNBTTsKLQl9Ci0KLQlwcml2LT5tb2RlID0gYXNzb2NfcmVxLT5tb2RlOwotCXJldCA9IGxic19zZXRfc25tcF9taWIocHJpdiwgU05NUF9NSUJfT0lEX0JTU19UWVBFLAotCQlhc3NvY19yZXEtPm1vZGUgPT0gSVdfTU9ERV9BREhPQyA/IDIgOiAxKTsKLQotZG9uZToKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhc3NvY19oZWxwZXJfY2hhbm5lbChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCXJldCA9IGxic191cGRhdGVfY2hhbm5lbChwcml2KTsKLQlpZiAocmV0KSB7Ci0JCWxic19kZWJfYXNzb2MoIkFTU09DOiBjaGFubmVsOiBlcnJvciBnZXR0aW5nIGNoYW5uZWwuXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhc3NvY19yZXEtPmNoYW5uZWwgPT0gcHJpdi0+Y2hhbm5lbCkKLQkJZ290byBkb25lOwotCi0JaWYgKHByaXYtPm1lc2hfZGV2KSB7Ci0JCS8qIENoYW5nZSBtZXNoIGNoYW5uZWwgZmlyc3Q7IDIxLnAyMSBmaXJtd2FyZSB3b24ndCBsZXQKLQkJICAgeW91IGNoYW5nZSBjaGFubmVsIG90aGVyd2lzZSAoZXZlbiB0aG91Z2ggaXQnbGwgcmV0dXJuCi0JCSAgIGFuIGVycm9yIHRvIHRoaXMgKi8KLQkJbGJzX21lc2hfY29uZmlnKHByaXYsIENNRF9BQ1RfTUVTSF9DT05GSUdfU1RPUCwKLQkJCQlhc3NvY19yZXEtPmNoYW5uZWwpOwotCX0KLQotCWxic19kZWJfYXNzb2MoIkFTU09DOiBjaGFubmVsOiAlZCAtPiAlZFxuIiwKLQkJICAgICAgcHJpdi0+Y2hhbm5lbCwgYXNzb2NfcmVxLT5jaGFubmVsKTsKLQotCXJldCA9IGxic19zZXRfY2hhbm5lbChwcml2LCBhc3NvY19yZXEtPmNoYW5uZWwpOwotCWlmIChyZXQgPCAwKQotCQlsYnNfZGViX2Fzc29jKCJBU1NPQzogY2hhbm5lbDogZXJyb3Igc2V0dGluZyBjaGFubmVsLlxuIik7Ci0KLQkvKiBGSVhNRTogc2hvdWxkbid0IG5lZWQgdG8gZ3JhYiB0aGUgY2hhbm5lbCBfYWdhaW5fIGFmdGVyIHNldHRpbmcKLQkgKiBpdCBzaW5jZSB0aGUgZmlybXdhcmUgaXMgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBuZXcgY2hhbm5lbCwgYnV0Ci0JICogd2hhdGV2ZXIuLi4gKi8KLQlyZXQgPSBsYnNfdXBkYXRlX2NoYW5uZWwocHJpdik7Ci0JaWYgKHJldCkgewotCQlsYnNfZGViX2Fzc29jKCJBU1NPQzogY2hhbm5lbDogZXJyb3IgZ2V0dGluZyBjaGFubmVsLlxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYXNzb2NfcmVxLT5jaGFubmVsICE9IHByaXYtPmNoYW5uZWwpIHsKLQkJbGJzX2RlYl9hc3NvYygiQVNTT0M6IGNoYW5uZWw6IGZhaWxlZCB0byB1cGRhdGUgY2hhbm5lbCB0byAlZFxuIiwKLQkJICAgICAgICAgICAgICBhc3NvY19yZXEtPmNoYW5uZWwpOwotCQlnb3RvIHJlc3RvcmVfbWVzaDsKLQl9Ci0KLQlpZiAoYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkICYmCi0JICAgIChhc3NvY19yZXEtPndlcF9rZXlzWzBdLmxlbiB8fCBhc3NvY19yZXEtPndlcF9rZXlzWzFdLmxlbiB8fAotCSAgICAgYXNzb2NfcmVxLT53ZXBfa2V5c1syXS5sZW4gfHwgYXNzb2NfcmVxLT53ZXBfa2V5c1szXS5sZW4pKSB7Ci0JCS8qIE1ha2Ugc3VyZSBXRVAga2V5cyBhcmUgcmUtc2VudCB0byBmaXJtd2FyZSAqLwotCQlzZXRfYml0KEFTU09DX0ZMQUdfV0VQX0tFWVMsICZhc3NvY19yZXEtPmZsYWdzKTsKLQl9Ci0KLQkvKiBNdXN0IHJlc3RhcnQvcmVqb2luIGFkaG9jIG5ldHdvcmtzIGFmdGVyIGNoYW5uZWwgY2hhbmdlICovCi0gCXNldF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0KLSByZXN0b3JlX21lc2g6Ci0JaWYgKHByaXYtPm1lc2hfZGV2KQotCQlsYnNfbWVzaF9jb25maWcocHJpdiwgQ01EX0FDVF9NRVNIX0NPTkZJR19TVEFSVCwKLQkJCQlwcml2LT5jaGFubmVsKTsKLQotIGRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQVNTT0MsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBhc3NvY19oZWxwZXJfd2VwX2tleXMoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCSBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxKQotewotCWludCBpOwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCS8qIFNldCBvciByZW1vdmUgV0VQIGtleXMgKi8KLQlpZiAoYXNzb2NfcmVxLT53ZXBfa2V5c1swXS5sZW4gfHwgYXNzb2NfcmVxLT53ZXBfa2V5c1sxXS5sZW4gfHwKLQkgICAgYXNzb2NfcmVxLT53ZXBfa2V5c1syXS5sZW4gfHwgYXNzb2NfcmVxLT53ZXBfa2V5c1szXS5sZW4pCi0JCXJldCA9IGxic19jbWRfODAyXzExX3NldF93ZXAocHJpdiwgQ01EX0FDVF9BREQsIGFzc29jX3JlcSk7Ci0JZWxzZQotCQlyZXQgPSBsYnNfY21kXzgwMl8xMV9zZXRfd2VwKHByaXYsIENNRF9BQ1RfUkVNT1ZFLCBhc3NvY19yZXEpOwotCi0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBlbmFibGUvZGlzYWJsZSB0aGUgTUFDJ3MgV0VQIHBhY2tldCBmaWx0ZXIgKi8KLQlpZiAoYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkKQotCQlwcml2LT5tYWNfY29udHJvbCB8PSBDTURfQUNUX01BQ19XRVBfRU5BQkxFOwotCWVsc2UKLQkJcHJpdi0+bWFjX2NvbnRyb2wgJj0gfkNNRF9BQ1RfTUFDX1dFUF9FTkFCTEU7Ci0KLQlsYnNfc2V0X21hY19jb250cm9sKHByaXYpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0KLQkvKiBDb3B5IFdFUCBrZXlzIGludG8gcHJpdiB3ZXAga2V5IGZpZWxkcyAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbWVtY3B5KCZwcml2LT53ZXBfa2V5c1tpXSwgJmFzc29jX3JlcS0+d2VwX2tleXNbaV0sCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGVuY19rZXkpKTsKLQl9Ci0JcHJpdi0+d2VwX3R4X2tleWlkeCA9IGFzc29jX3JlcS0+d2VwX3R4X2tleWlkeDsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhc3NvY19oZWxwZXJfc2VjaW5mbyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwOwotCXVpbnQxNl90IGRvX3dwYTsKLQl1aW50MTZfdCByc24gPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCW1lbWNweSgmcHJpdi0+c2VjaW5mbywgJmFzc29jX3JlcS0+c2VjaW5mbywKLQkJc2l6ZW9mKHN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5KSk7Ci0KLQlsYnNfc2V0X21hY19jb250cm9sKHByaXYpOwotCi0JLyogSWYgUlNOIGlzIGFscmVhZHkgZW5hYmxlZCwgZG9uJ3QgdHJ5IHRvIGVuYWJsZSBpdCBhZ2Fpbiwgc2luY2UKLQkgKiBFTkFCTEVfUlNOIHJlc2V0cyBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcyBhbmQgd2lsbCBjbG9iYmVyIHRoZQotCSAqIDQtd2F5IFdQQSBoYW5kc2hha2UuCi0JICovCi0KLQkvKiBHZXQgUlNOIGVuYWJsZWQvZGlzYWJsZWQgKi8KLQlyZXQgPSBsYnNfY21kXzgwMl8xMV9lbmFibGVfcnNuKHByaXYsIENNRF9BQ1RfR0VULCAmcnNuKTsKLQlpZiAocmV0KSB7Ci0JCWxic19kZWJfYXNzb2MoIkZhaWxlZCB0byBnZXQgUlNOIHN0YXR1czogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIERvbid0IHJlLWVuYWJsZSBSU04gaWYgaXQncyBhbHJlYWR5IGVuYWJsZWQgKi8KLQlkb193cGEgPSBhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCB8fCBhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQ7Ci0JaWYgKGRvX3dwYSA9PSByc24pCi0JCWdvdG8gb3V0OwotCi0JLyogU2V0IFJTTiBlbmFibGVkL2Rpc2FibGVkICovCi0JcmV0ID0gbGJzX2NtZF84MDJfMTFfZW5hYmxlX3Jzbihwcml2LCBDTURfQUNUX1NFVCwgJmRvX3dwYSk7Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGFzc29jX2hlbHBlcl93cGFfa2V5cyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBhc3NvY19yZXEtPmZsYWdzOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCS8qIFdvcmsgYXJvdW5kIG9sZGVyIGZpcm13YXJlIGJ1ZyB3aGVyZSBXUEEgdW5pY2FzdCBhbmQgbXVsdGljYXN0Ci0JICoga2V5cyBtdXN0IGJlIHNldCBpbmRlcGVuZGVudGx5LiAgU2VlbiBpbiBTRElPIHBhcnRzIHdpdGggZmlybXdhcmUKLQkgKiB2ZXJzaW9uIDUuMC4xMXAwLgotCSAqLwotCi0JaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCWNsZWFyX2JpdChBU1NPQ19GTEFHX1dQQV9NQ0FTVF9LRVksICZhc3NvY19yZXEtPmZsYWdzKTsKLQkJcmV0ID0gbGJzX2NtZF84MDJfMTFfa2V5X21hdGVyaWFsKHByaXYsIENNRF9BQ1RfU0VULCBhc3NvY19yZXEpOwotCQlhc3NvY19yZXEtPmZsYWdzID0gZmxhZ3M7Ci0JfQotCi0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQltZW1jcHkoJnByaXYtPndwYV91bmljYXN0X2tleSwgJmFzc29jX3JlcS0+d3BhX3VuaWNhc3Rfa2V5LAotCQkJc2l6ZW9mKHN0cnVjdCBlbmNfa2V5KSk7Ci0KLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfTUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJY2xlYXJfYml0KEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCi0JCXJldCA9IGxic19jbWRfODAyXzExX2tleV9tYXRlcmlhbChwcml2LCBDTURfQUNUX1NFVCwgYXNzb2NfcmVxKTsKLQkJYXNzb2NfcmVxLT5mbGFncyA9IGZsYWdzOwotCi0JCW1lbWNweSgmcHJpdi0+d3BhX21jYXN0X2tleSwgJmFzc29jX3JlcS0+d3BhX21jYXN0X2tleSwKLQkJCQlzaXplb2Yoc3RydWN0IGVuY19rZXkpKTsKLQl9Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGFzc29jX2hlbHBlcl93cGFfaWUoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQotCWlmIChhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCB8fCBhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKLQkJbWVtY3B5KCZwcml2LT53cGFfaWUsICZhc3NvY19yZXEtPndwYV9pZSwgYXNzb2NfcmVxLT53cGFfaWVfbGVuKTsKLQkJcHJpdi0+d3BhX2llX2xlbiA9IGFzc29jX3JlcS0+d3BhX2llX2xlbjsKLQl9IGVsc2UgewotCQltZW1zZXQoJnByaXYtPndwYV9pZSwgMCwgTUFYX1dQQV9JRV9MRU4pOwotCQlwcml2LT53cGFfaWVfbGVuID0gMDsKLQl9Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IHNob3VsZF9kZWF1dGhfaW5mcmFzdHJ1Y3R1cmUoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHByaXYtPmNvbm5lY3Rfc3RhdHVzICE9IExCU19DT05ORUNURUQpCi0JCXJldHVybiAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0FTU09DKTsKLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJbGJzX2RlYl9hc3NvYygiRGVhdXRoZW50aWNhdGluZyBkdWUgdG8gbmV3IFNTSURcbiIpOwotCQlyZXQgPSAxOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJaWYgKHByaXYtPnNlY2luZm8uYXV0aF9tb2RlICE9IGFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUpIHsKLQkJCWxic19kZWJfYXNzb2MoIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIG5ldyBzZWN1cml0eVxuIik7Ci0JCQlyZXQgPSAxOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCWxic19kZWJfYXNzb2MoIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIG5ldyBCU1NJRFxuIik7Ci0JCXJldCA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX0NIQU5ORUwsICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlsYnNfZGViX2Fzc29jKCJEZWF1dGhlbnRpY2F0aW5nIGR1ZSB0byBjaGFubmVsIHN3aXRjaFxuIik7Ci0JCXJldCA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEZJWE1FOiBkZWFsIHdpdGggJ2F1dG8nIG1vZGUgc29tZWhvdyAqLwotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlpZiAoYXNzb2NfcmVxLT5tb2RlICE9IElXX01PREVfSU5GUkEpIHsKLQkJCWxic19kZWJfYXNzb2MoIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIGxlYXZpbmcgIgotCQkJCSJpbmZyYSBtb2RlXG4iKTsKLQkJCXJldCA9IDE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotb3V0OgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0FTU09DLCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgc2hvdWxkX3N0b3BfYWRob2Moc3RydWN0IGxic19wcml2YXRlICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKLXsKLQlsYnNfZGViX2VudGVyKExCU19ERUJfQVNTT0MpOwotCi0JaWYgKHByaXYtPmNvbm5lY3Rfc3RhdHVzICE9IExCU19DT05ORUNURUQpCi0JCXJldHVybiAwOwotCi0JaWYgKGxic19zc2lkX2NtcChwcml2LT5jdXJic3NwYXJhbXMuc3NpZCwKLQkgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWRfbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICBhc3NvY19yZXEtPnNzaWQsIGFzc29jX3JlcS0+c3NpZF9sZW4pICE9IDApCi0JCXJldHVybiAxOwotCi0JLyogRklYTUU6IGRlYWwgd2l0aCAnYXV0bycgbW9kZSBzb21laG93ICovCi0JaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCWlmIChhc3NvY19yZXEtPm1vZGUgIT0gSVdfTU9ERV9BREhPQykKLQkJCXJldHVybiAxOwotCX0KLQotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX0NIQU5ORUwsICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlpZiAoYXNzb2NfcmVxLT5jaGFubmVsICE9IHByaXYtPmNoYW5uZWwpCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfQVNTT0MpOwotCXJldHVybiAwOwotfQotCi0KLS8qKgotICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBiZXN0IFNTSUQgaW4gdGhlIFNjYW4gTGlzdAotICoKLSAqICBTZWFyY2ggdGhlIHNjYW4gdGFibGUgZm9yIHRoZSBiZXN0IFNTSUQgdGhhdCBhbHNvIG1hdGNoZXMgdGhlIGN1cnJlbnQKLSAqICAgYWRhcHRlciBuZXR3b3JrIHByZWZlcmVuY2UgKGluZnJhc3RydWN0dXJlIG9yIGFkaG9jKQotICoKLSAqICBAcGFyYW0gcHJpdiAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZQotICoKLSAqICBAcmV0dXJuICAgICAgICAgaW5kZXggaW4gQlNTSUQgbGlzdAotICovCi1zdGF0aWMgc3RydWN0IGJzc19kZXNjcmlwdG9yICpsYnNfZmluZF9iZXN0X3NzaWRfaW5fbGlzdCgKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQ4X3QgbW9kZSkKLXsKLQl1aW50OF90IGJlc3Ryc3NpID0gMDsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKml0ZXJfYnNzOwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqYmVzdF9ic3MgPSBOVUxMOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1NDQU4pOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXJfYnNzLCAmcHJpdi0+bmV0d29ya19saXN0LCBsaXN0KSB7Ci0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIElXX01PREVfSU5GUkE6Ci0JCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkJCWlmICghaXNfbmV0d29ya19jb21wYXRpYmxlKHByaXYsIGl0ZXJfYnNzLCBtb2RlKSkKLQkJCQlicmVhazsKLQkJCWlmIChTQ0FOX1JTU0koaXRlcl9ic3MtPnJzc2kpIDw9IGJlc3Ryc3NpKQotCQkJCWJyZWFrOwotCQkJYmVzdHJzc2kgPSBTQ0FOX1JTU0koaXRlcl9ic3MtPnJzc2kpOwotCQkJYmVzdF9ic3MgPSBpdGVyX2JzczsKLQkJCWJyZWFrOwotCQljYXNlIElXX01PREVfQVVUTzoKLQkJZGVmYXVsdDoKLQkJCWlmIChTQ0FOX1JTU0koaXRlcl9ic3MtPnJzc2kpIDw9IGJlc3Ryc3NpKQotCQkJCWJyZWFrOwotCQkJYmVzdHJzc2kgPSBTQ0FOX1JTU0koaXRlcl9ic3MtPnJzc2kpOwotCQkJYmVzdF9ic3MgPSBpdGVyX2JzczsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9TQ0FOLCAiYmVzdF9ic3MgJXAiLCBiZXN0X2Jzcyk7Ci0JcmV0dXJuIGJlc3RfYnNzOwotfQotCi0vKioKLSAqICBAYnJpZWYgRmluZCB0aGUgYmVzdCBBUAotICoKLSAqICBVc2VkIGZyb20gYXNzb2NpYXRpb24gd29ya2VyLgotICoKLSAqICBAcGFyYW0gcHJpdiAgICAgICAgIEEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHBTU0lEICAgICAgICBBIHBvaW50ZXIgdG8gQVAncyBzc2lkCi0gKgotICogIEByZXR1cm4gICAgICAgICAgICAgMC0tc3VjY2Vzcywgb3RoZXJ3aXNlLS1mYWlsCi0gKi8KLXN0YXRpYyBpbnQgbGJzX2ZpbmRfYmVzdF9uZXR3b3JrX3NzaWQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCXVpbnQ4X3QgKm91dF9zc2lkLCB1aW50OF90ICpvdXRfc3NpZF9sZW4sIHVpbnQ4X3QgcHJlZmVycmVkX21vZGUsCi0JdWludDhfdCAqb3V0X21vZGUpCi17Ci0JaW50IHJldCA9IC0xOwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqZm91bmQ7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfU0NBTik7Ci0KLQlwcml2LT5zY2FuX3NzaWRfbGVuID0gMDsKLQlsYnNfc2Nhbl9uZXR3b3Jrcyhwcml2LCAxKTsKLQlpZiAocHJpdi0+c3VycHJpc2VyZW1vdmVkKQotCQlnb3RvIG91dDsKLQotCWZvdW5kID0gbGJzX2ZpbmRfYmVzdF9zc2lkX2luX2xpc3QocHJpdiwgcHJlZmVycmVkX21vZGUpOwotCWlmIChmb3VuZCAmJiAoZm91bmQtPnNzaWRfbGVuID4gMCkpIHsKLQkJbWVtY3B5KG91dF9zc2lkLCAmZm91bmQtPnNzaWQsIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pOwotCQkqb3V0X3NzaWRfbGVuID0gZm91bmQtPnNzaWRfbGVuOwotCQkqb3V0X21vZGUgPSBmb3VuZC0+bW9kZTsKLQkJcmV0ID0gMDsKLQl9Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9TQ0FOLCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXZvaWQgbGJzX2Fzc29jaWF0aW9uX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsYnNfcHJpdmF0ZSwKLQkJYXNzb2Nfd29yay53b3JrKTsKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGZpbmRfYW55X3NzaWQgPSAwOwotCURFQ0xBUkVfU1NJRF9CVUYoc3NpZCk7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQVNTT0MpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JYXNzb2NfcmVxID0gcHJpdi0+cGVuZGluZ19hc3NvY19yZXE7Ci0JcHJpdi0+cGVuZGluZ19hc3NvY19yZXEgPSBOVUxMOwotCXByaXYtPmluX3Byb2dyZXNzX2Fzc29jX3JlcSA9IGFzc29jX3JlcTsKLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi0JaWYgKCFhc3NvY19yZXEpCi0JCWdvdG8gZG9uZTsKLQotCWxic19kZWJfYXNzb2MoCi0JCSJBc3NvY2lhdGlvbiBSZXF1ZXN0OlxuIgotCQkiICAgIGZsYWdzOiAgICAgMHglMDhseFxuIgotCQkiICAgIFNTSUQ6ICAgICAgJyVzJ1xuIgotCQkiICAgIGNoYW5uOiAgICAgJWRcbiIKLQkJIiAgICBiYW5kOiAgICAgICVkXG4iCi0JCSIgICAgbW9kZTogICAgICAlZFxuIgotCQkiICAgIEJTU0lEOiAgICAgJXBNXG4iCi0JCSIgICAgc2VjaW5mbzogICVzJXMlc1xuIgotCQkiICAgIGF1dGhfbW9kZTogJWRcbiIsCi0JCWFzc29jX3JlcS0+ZmxhZ3MsCi0JCXByaW50X3NzaWQoc3NpZCwgYXNzb2NfcmVxLT5zc2lkLCBhc3NvY19yZXEtPnNzaWRfbGVuKSwKLQkJYXNzb2NfcmVxLT5jaGFubmVsLCBhc3NvY19yZXEtPmJhbmQsIGFzc29jX3JlcS0+bW9kZSwKLQkJYXNzb2NfcmVxLT5ic3NpZCwKLQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPyAiIFdQQSIgOiAiIiwKLQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID8gIiBXUEEyIiA6ICIiLAotCQlhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQgPyAiIFdFUCIgOiAiIiwKLQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSk7Ci0KLQkvKiBJZiAnYW55JyBTU0lEIHdhcyBzcGVjaWZpZWQsIGZpbmQgYW4gU1NJRCB0byBhc3NvY2lhdGUgd2l0aCAqLwotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKSAmJgotCSAgICAhYXNzb2NfcmVxLT5zc2lkX2xlbikKLQkJZmluZF9hbnlfc3NpZCA9IDE7Ci0KLQkvKiBCdXQgZG9uJ3QgdXNlICdhbnknIFNTSUQgaWYgdGhlcmUncyBhIHZhbGlkIGxvY2tlZCBCU1NJRCB0byB1c2UgKi8KLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoYXNzb2NfcmVxLT5ic3NpZCwgYnNzaWRfYW55KSAmJgotCQkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGFzc29jX3JlcS0+YnNzaWQsIGJzc2lkX29mZikpCi0JCQlmaW5kX2FueV9zc2lkID0gMDsKLQl9Ci0KLQlpZiAoZmluZF9hbnlfc3NpZCkgewotCQl1OCBuZXdfbW9kZSA9IGFzc29jX3JlcS0+bW9kZTsKLQotCQlyZXQgPSBsYnNfZmluZF9iZXN0X25ldHdvcmtfc3NpZChwcml2LCBhc3NvY19yZXEtPnNzaWQsCi0JCQkJJmFzc29jX3JlcS0+c3NpZF9sZW4sIGFzc29jX3JlcS0+bW9kZSwgJm5ld19tb2RlKTsKLQkJaWYgKHJldCkgewotCQkJbGJzX2RlYl9hc3NvYygiQ291bGQgbm90IGZpbmQgYmVzdCBuZXR3b3JrXG4iKTsKLQkJCXJldCA9IC1FTkVUVU5SRUFDSDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJLyogRW5zdXJlIHdlIHN3aXRjaCB0byB0aGUgbW9kZSBvZiB0aGUgQVAgKi8KLQkJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0FVVE8pIHsKLQkJCXNldF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0JCQlhc3NvY19yZXEtPm1vZGUgPSBuZXdfbW9kZTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgY2hhbmdpbmcgcmVxdWlyZSBkZWF1dGhlbnRpY2F0aW9uCi0JICogZnJvbSB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgaW5mcmFzdHJ1Y3R1cmUgYWNjZXNzIHBvaW50LgotCSAqLwotCWlmIChwcml2LT5tb2RlID09IElXX01PREVfSU5GUkEpIHsKLQkJaWYgKHNob3VsZF9kZWF1dGhfaW5mcmFzdHJ1Y3R1cmUocHJpdiwgYXNzb2NfcmVxKSkgewotCQkJcmV0ID0gbGJzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShwcml2LAotCQkJCQkJCSAgIHByaXYtPmN1cmJzc3BhcmFtcy5ic3NpZCwKLQkJCQkJCQkgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJbGJzX2RlYl9hc3NvYygiRGVhdXRoZW50aWNhdGlvbiBkdWUgdG8gbmV3ICIKLQkJCQkJImNvbmZpZ3VyYXRpb24gcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLAotCQkJCQlyZXQpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChwcml2LT5tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJaWYgKHNob3VsZF9zdG9wX2FkaG9jKHByaXYsIGFzc29jX3JlcSkpIHsKLQkJCXJldCA9IGxic19hZGhvY19zdG9wKHByaXYpOwotCQkJaWYgKHJldCkgewotCQkJCWxic19kZWJfYXNzb2MoIlRlYXJkb3duIG9mIEFkSG9jIG5ldHdvcmsgZHVlIHRvICIKLQkJCQkJIm5ldyBjb25maWd1cmF0aW9uIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKLQkJCQkJcmV0KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyogU2VuZCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIGJpdHMgdG8gdGhlIGZpcm13YXJlICovCi0JaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCXJldCA9IGFzc29jX2hlbHBlcl9tb2RlKHByaXYsIGFzc29jX3JlcSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19DSEFOTkVMLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJcmV0ID0gYXNzb2NfaGVscGVyX2NoYW5uZWwocHJpdiwgYXNzb2NfcmVxKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlyZXQgPSBhc3NvY19oZWxwZXJfc2VjaW5mbyhwcml2LCBhc3NvY19yZXEpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX0lFLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJcmV0ID0gYXNzb2NfaGVscGVyX3dwYV9pZShwcml2LCBhc3NvY19yZXEpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiB2MTAgRlcgd2FudHMgV1BBIGtleXMgdG8gYmUgc2V0L2NsZWFyZWQgYmVmb3JlIFdFUCBrZXkgb3BlcmF0aW9ucywKLQkgKiBvdGhlcndpc2UgaXQgd2lsbCBmYWlsIHRvIGNvcnJlY3RseSBhc3NvY2lhdGUgdG8gV0VQIG5ldHdvcmtzLgotCSAqIE90aGVyIGZpcm13YXJlIHZlcnNpb25zIGRvbid0IGFwcGVhciB0byBjYXJlLgotCSAqLwotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1dQQV9NQ0FTVF9LRVksICZhc3NvY19yZXEtPmZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChBU1NPQ19GTEFHX1dQQV9VQ0FTVF9LRVksICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlyZXQgPSBhc3NvY19oZWxwZXJfd3BhX2tleXMocHJpdiwgYXNzb2NfcmVxKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJcmV0ID0gYXNzb2NfaGVscGVyX3dlcF9rZXlzKHByaXYsIGFzc29jX3JlcSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQotCS8qIFNTSUQvQlNTSUQgc2hvdWxkIGJlIHRoZSBfbGFzdF8gY29uZmlnIG9wdGlvbiBzZXQsIGJlY2F1c2UgdGhleQotCSAqIHRyaWdnZXIgdGhlIGFzc29jaWF0aW9uIGF0dGVtcHQuCi0JICovCi0JaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlpbnQgc3VjY2VzcyA9IDE7Ci0KLQkJcmV0ID0gYXNzb2NfaGVscGVyX2Fzc29jaWF0ZShwcml2LCBhc3NvY19yZXEpOwotCQlpZiAocmV0KSB7Ci0JCQlsYnNfZGViX2Fzc29jKCJBU1NPQzogYXNzb2NpYXRpb24gdW5zdWNjZXNzZnVsOiAlZFxuIiwKLQkJCQlyZXQpOwotCQkJc3VjY2VzcyA9IDA7Ci0JCX0KLQotCQlpZiAocHJpdi0+Y29ubmVjdF9zdGF0dXMgIT0gTEJTX0NPTk5FQ1RFRCkgewotCQkJbGJzX2RlYl9hc3NvYygiQVNTT0M6IGFzc29jaWF0aW9uIHVuc3VjY2Vzc2Z1bCwgIgotCQkJCSJub3QgY29ubmVjdGVkXG4iKTsKLQkJCXN1Y2Nlc3MgPSAwOwotCQl9Ci0KLQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCWxic19kZWJfYXNzb2MoImFzc29jaWF0ZWQgdG8gJXBNXG4iLAotCQkJCXByaXYtPmN1cmJzc3BhcmFtcy5ic3NpZCk7Ci0JCQlsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJQ01EXzgwMl8xMV9SU1NJLAotCQkJCTAsIENNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgTlVMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSAtMTsKLQkJfQotCX0KLQotb3V0OgotCWlmIChyZXQpIHsKLQkJbGJzX2RlYl9hc3NvYygiQVNTT0M6IHJlY29uZmlndXJhdGlvbiBhdHRlbXB0IHVuc3VjY2Vzc2Z1bDogJWRcbiIsCi0JCQlyZXQpOwotCX0KLQotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCXByaXYtPmluX3Byb2dyZXNzX2Fzc29jX3JlcSA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKLQlrZnJlZShhc3NvY19yZXEpOwotCi1kb25lOgotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9BU1NPQyk7Ci19Ci0KLQotLyoKLSAqIENhbGxlciBNVVNUIGhvbGQgYW55IG5lY2Vzc2FyeSBsb2NrcwotICovCi1zdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqbGJzX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKLXsKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9BU1NPQyk7Ci0JaWYgKCFwcml2LT5wZW5kaW5nX2Fzc29jX3JlcSkgewotCQlwcml2LT5wZW5kaW5nX2Fzc29jX3JlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19yZXF1ZXN0KSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIXByaXYtPnBlbmRpbmdfYXNzb2NfcmVxKSB7Ci0JCQlsYnNfcHJfaW5mbygiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgYXNzb2NpYXRpb24iCi0JCQkJIiByZXF1ZXN0IVxuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCS8qIENvcHkgY3VycmVudCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QsCi0JICogYnV0IGRvbid0IG92ZXJ3cml0ZSBhbnkgdGhhdCBhcmUgYWxyZWFkeSBzZXQuCi0JICovCi0JYXNzb2NfcmVxID0gcHJpdi0+cGVuZGluZ19hc3NvY19yZXE7Ci0JaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQltZW1jcHkoJmFzc29jX3JlcS0+c3NpZCwgJnByaXYtPmN1cmJzc3BhcmFtcy5zc2lkLAotCQkgICAgICAgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JCWFzc29jX3JlcS0+c3NpZF9sZW4gPSBwcml2LT5jdXJic3NwYXJhbXMuc3NpZF9sZW47Ci0JfQotCi0JaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX0NIQU5ORUwsICZhc3NvY19yZXEtPmZsYWdzKSkKLQkJYXNzb2NfcmVxLT5jaGFubmVsID0gcHJpdi0+Y2hhbm5lbDsKLQotCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19CQU5ELCAmYXNzb2NfcmVxLT5mbGFncykpCi0JCWFzc29jX3JlcS0+YmFuZCA9IHByaXYtPmN1cmJzc3BhcmFtcy5iYW5kOwotCi0JaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKSkKLQkJYXNzb2NfcmVxLT5tb2RlID0gcHJpdi0+bW9kZTsKLQotCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCW1lbWNweSgmYXNzb2NfcmVxLT5ic3NpZCwgcHJpdi0+Y3VyYnNzcGFyYW1zLmJzc2lkLAotCQkJRVRIX0FMRU4pOwotCX0KLQotCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XRVBfS0VZUywgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQltZW1jcHkoJmFzc29jX3JlcS0+d2VwX2tleXNbaV0sICZwcml2LT53ZXBfa2V5c1tpXSwKLQkJCQlzaXplb2Yoc3RydWN0IGVuY19rZXkpKTsKLQkJfQotCX0KLQotCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYLCAmYXNzb2NfcmVxLT5mbGFncykpCi0JCWFzc29jX3JlcS0+d2VwX3R4X2tleWlkeCA9IHByaXYtPndlcF90eF9rZXlpZHg7Ci0KLQlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX01DQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCW1lbWNweSgmYXNzb2NfcmVxLT53cGFfbWNhc3Rfa2V5LCAmcHJpdi0+d3BhX21jYXN0X2tleSwKLQkJCXNpemVvZihzdHJ1Y3QgZW5jX2tleSkpOwotCX0KLQotCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfVUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJbWVtY3B5KCZhc3NvY19yZXEtPndwYV91bmljYXN0X2tleSwgJnByaXYtPndwYV91bmljYXN0X2tleSwKLQkJCXNpemVvZihzdHJ1Y3QgZW5jX2tleSkpOwotCX0KLQotCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJbWVtY3B5KCZhc3NvY19yZXEtPnNlY2luZm8sICZwcml2LT5zZWNpbmZvLAotCQkJc2l6ZW9mKHN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5KSk7Ci0JfQotCi0JaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX1dQQV9JRSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7Ci0JCW1lbWNweSgmYXNzb2NfcmVxLT53cGFfaWUsICZwcml2LT53cGFfaWUsCi0JCQlNQVhfV1BBX0lFX0xFTik7Ci0JCWFzc29jX3JlcS0+d3BhX2llX2xlbiA9IHByaXYtPndwYV9pZV9sZW47Ci0JfQotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0FTU09DKTsKLQlyZXR1cm4gYXNzb2NfcmVxOwotfQotCi0KLS8qKgotICogIEBicmllZiBEZWF1dGhlbnRpY2F0ZSBmcm9tIGEgc3BlY2lmaWMgQlNTCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSBic3NpZCAgICAgICBUaGUgc3BlY2lmaWMgQlNTIHRvIGRlYXV0aGVudGljYXRlIGZyb20KLSAqICBAcGFyYW0gcmVhc29uICAgICAgVGhlIDgwMi4xMSBzZWMuIDcuMy4xLjcgUmVhc29uIENvZGUgZm9yIGRlYXV0aGVudGljYXRpbmcKLSAqCi0gKiAgQHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQotICovCi1pbnQgbGJzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4IGJzc2lkW0VUSF9BTEVOXSwKLQkJCQkgdTE2IHJlYXNvbikKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSBjbWQ7Ci0JaW50IHJldDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9KT0lOKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOwotCW1lbWNweShjbWQubWFjYWRkciwgJmJzc2lkWzBdLCBFVEhfQUxFTik7Ci0JY21kLnJlYXNvbmNvZGUgPSBjcHVfdG9fbGUxNihyZWFzb24pOwotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfREVBVVRIRU5USUNBVEUsICZjbWQpOwotCi0JLyogQ2xlYW4gdXAgZXZlcnl0aGluZyBldmVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvcjsgY2FuJ3QgYXNzdW1lIHRoYXQKLQkgKiB3ZSdyZSBzdGlsbCBhdXRoZW50aWNhdGVkIHRvIHRoZSBBUCBhZnRlciB0cnlpbmcgdG8gZGVhdXRoLgotCSAqLwotCWxic19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0pPSU4pOwotCXJldHVybiByZXQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDYyMWI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDA2LCBSZWQgSGF0LCBJbmMuICovCi0KLSNpZm5kZWYgX0xCU19BU1NPQ19IXwotI2RlZmluZSBfTEJTX0FTU09DX0hfCi0KLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJob3N0LmgiCi0KLQotc3RydWN0IGxic19wcml2YXRlOwotCi0vKgotICogSW4gdGhlb3J5LCB0aGUgSUUgaXMgbGltaXRlZCB0byB0aGUgSUUgbGVuZ3RoLCAyNTUsCi0gKiBidXQgaW4gcHJhY3RpY2UgNjQgYnl0ZXMgYXJlIGVub3VnaC4KLSAqLwotI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAotCi0KLQotc3RydWN0IGxic184MDJfMTFfc2VjdXJpdHkgewotCXU4IFdQQWVuYWJsZWQ7Ci0JdTggV1BBMmVuYWJsZWQ7Ci0JdTggd2VwX2VuYWJsZWQ7Ci0JdTggYXV0aF9tb2RlOwotCXUzMiBrZXlfbWdtdDsKLX07Ci0KLS8qKiBDdXJyZW50IEJhc2ljIFNlcnZpY2UgU2V0IFN0YXRlIFN0cnVjdHVyZSAqLwotc3RydWN0IGN1cnJlbnRfYnNzX3BhcmFtcyB7Ci0JLyoqIGJzc2lkICovCi0JdTggYnNzaWRbRVRIX0FMRU5dOwotCS8qKiBzc2lkICovCi0JdTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMV07Ci0JdTggc3NpZF9sZW47Ci0KLQkvKiogYmFuZCAqLwotCXU4IGJhbmQ7Ci0JLyoqIGNoYW5uZWwgaXMgZGlyZWN0bHkgaW4gcHJpdi0+Y2hhbm5lbCAqLwotCS8qKiB6ZXJvLXRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3VwcG9ydGVkIGRhdGEgcmF0ZXMgKi8KLQl1OCByYXRlc1tNQVhfUkFURVMgKyAxXTsKLX07Ci0KLS8qKgotICogIEBicmllZiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKLSAqLwotc3RydWN0IGJzc19kZXNjcmlwdG9yIHsKLQl1OCBic3NpZFtFVEhfQUxFTl07Ci0KLQl1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyAxXTsKLQl1OCBzc2lkX2xlbjsKLQotCXUxNiBjYXBhYmlsaXR5OwotCXUzMiByc3NpOwotCXUzMiBjaGFubmVsOwotCXUxNiBiZWFjb25wZXJpb2Q7Ci0JX19sZTE2IGF0aW13aW5kb3c7Ci0KLQkvKiBJV19NT0RFX0FVVE8sIElXX01PREVfQURIT0MsIElXX01PREVfSU5GUkEgKi8KLQl1OCBtb2RlOwotCi0JLyogemVyby10ZXJtaW5hdGVkIGFycmF5IG9mIHN1cHBvcnRlZCBkYXRhIHJhdGVzICovCi0JdTggcmF0ZXNbTUFYX1JBVEVTICsgMV07Ci0KLQl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKLQotCXVuaW9uIGllZWVfcGh5X3BhcmFtX3NldCBwaHk7Ci0JdW5pb24gaWVlZV9zc19wYXJhbV9zZXQgc3M7Ci0KLQl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOwotCXNpemVfdCB3cGFfaWVfbGVuOwotCXU4IHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07Ci0Jc2l6ZV90IHJzbl9pZV9sZW47Ci0KLQl1OCBtZXNoOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotLyoqIEFzc29jaWF0aW9uIHJlcXVlc3QKLSAqCi0gKiBFbmNhcHN1bGF0ZXMgYWxsIHRoZSBvcHRpb25zIHRoYXQgZGVzY3JpYmUgYSBzcGVjaWZpYyBhc3NvY2F0aW9uIHJlcXVlc3QKLSAqIG9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHdpcmVsZXNzIGNhcmQncyByYWRpbywgbW9kZSwgYW5kIHNlY3VyaXR5IHNldHRpbmdzLgotICovCi1zdHJ1Y3QgYXNzb2NfcmVxdWVzdCB7Ci0jZGVmaW5lIEFTU09DX0ZMQUdfU1NJRAkJCTEKLSNkZWZpbmUgQVNTT0NfRkxBR19DSEFOTkVMCQkyCi0jZGVmaW5lIEFTU09DX0ZMQUdfQkFORAkJCTMKLSNkZWZpbmUgQVNTT0NfRkxBR19NT0RFCQkJNAotI2RlZmluZSBBU1NPQ19GTEFHX0JTU0lECQk1Ci0jZGVmaW5lIEFTU09DX0ZMQUdfV0VQX0tFWVMJCTYKLSNkZWZpbmUgQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYCTcKLSNkZWZpbmUgQVNTT0NfRkxBR19XUEFfTUNBU1RfS0VZCTgKLSNkZWZpbmUgQVNTT0NfRkxBR19XUEFfVUNBU1RfS0VZCTkKLSNkZWZpbmUgQVNTT0NfRkxBR19TRUNJTkZPCQkxMAotI2RlZmluZSBBU1NPQ19GTEFHX1dQQV9JRQkJMTEKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JdTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMV07Ci0JdTggc3NpZF9sZW47Ci0JdTggY2hhbm5lbDsKLQl1OCBiYW5kOwotCXU4IG1vZGU7Ci0JdTggYnNzaWRbRVRIX0FMRU5dIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgyKSkpOwotCi0JLyoqIFdFUCBrZXlzICovCi0Jc3RydWN0IGVuY19rZXkgd2VwX2tleXNbNF07Ci0JdTE2IHdlcF90eF9rZXlpZHg7Ci0KLQkvKiogV1BBIGtleXMgKi8KLQlzdHJ1Y3QgZW5jX2tleSB3cGFfbWNhc3Rfa2V5OwotCXN0cnVjdCBlbmNfa2V5IHdwYV91bmljYXN0X2tleTsKLQotCXN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5IHNlY2luZm87Ci0KLQkvKiogV1BBIEluZm9ybWF0aW9uIEVsZW1lbnRzKi8KLQl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOwotCXU4IHdwYV9pZV9sZW47Ci0KLQkvKiBCU1MgdG8gYXNzb2NpYXRlIHdpdGggZm9yIGluZnJhc3RydWN0dXJlIG9mIEFkLUhvYyBqb2luICovCi0Jc3RydWN0IGJzc19kZXNjcmlwdG9yIGJzczsKLX07Ci0KLQotZXh0ZXJuIHU4IGxic19iZ19yYXRlc1tNQVhfUkFURVNdOwotCi12b2lkIGxic19hc3NvY2lhdGlvbl93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0cnVjdCBhc3NvY19yZXF1ZXN0ICpsYnNfZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3Qoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKLQotaW50IGxic19hZGhvY19zdG9wKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7Ci0KLWludCBsYnNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgdTggYnNzaWRbRVRIX0FMRU5dLCB1MTYgcmVhc29uKTsKLQotaW50IGxic19jbWRfODAyXzExX3Jzc2koc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKTsKLWludCBsYnNfcmV0XzgwMl8xMV9yc3NpKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOwotCi1pbnQgbGJzX2NtZF9iY25fY3RybChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCi0JCQkJdTE2IGNtZF9hY3Rpb24pOwotaW50IGxic19yZXRfODAyXzExX2Jjbl9jdHJsKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKLQotaW50IGxic19jbWRfODAyXzExX3NldF93ZXAoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1aW50MTZfdCBjbWRfYWN0aW9uLAotCQkJICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKmFzc29jKTsKLQotaW50IGxic19jbWRfODAyXzExX2VuYWJsZV9yc24oc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1aW50MTZfdCBjbWRfYWN0aW9uLAotCQkJICAgICAgdWludDE2X3QgKmVuYWJsZSk7Ci0KLWludCBsYnNfY21kXzgwMl8xMV9rZXlfbWF0ZXJpYWwoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1aW50MTZfdCBjbWRfYWN0aW9uLAotCQkJCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvYyk7Ci0KLSNlbmRpZiAvKiBfTEJTX0FTU09DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKaW5kZXggOWQ1ZDNjYy4uMjVmOTAyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKQEAgLTcsOCArNywxMSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCisjaW5jbHVkZSAiZGVjbC5oIgogI2luY2x1ZGUgImNmZy5oIgogI2luY2x1ZGUgImNtZC5oIgogCkBAIC0zOSwyNiArNDIsMjcgQEAKIAlDSEFOMkcoMTQsIDI0ODQsIDApLAogfTsKIAotI2RlZmluZSBSQVRFVEFCX0VOVChfcmF0ZSwgX3JhdGVpZCwgX2ZsYWdzKSB7IFwKLQkuYml0cmF0ZSAgPSAoX3JhdGUpLCAgICAgICAgICAgICAgICAgIFwKLQkuaHdfdmFsdWUgPSAoX3JhdGVpZCksICAgICAgICAgICAgICAgIFwKLQkuZmxhZ3MgICAgPSAoX2ZsYWdzKSwgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgUkFURVRBQl9FTlQoX3JhdGUsIF9od192YWx1ZSwgX2ZsYWdzKSB7IFwKKwkuYml0cmF0ZSAgPSAoX3JhdGUpLCAgICAgICAgICAgICAgICAgICAgXAorCS5od192YWx1ZSA9IChfaHdfdmFsdWUpLCAgICAgICAgICAgICAgICBcCisJLmZsYWdzICAgID0gKF9mbGFncyksICAgICAgICAgICAgICAgICAgIFwKIH0KIAogCisvKiBUYWJsZSA2IGluIHNlY3Rpb24gMy4yLjEuMSAqLwogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBsYnNfcmF0ZXNbXSA9IHsKLQlSQVRFVEFCX0VOVCgxMCwgIDB4MSwgICAwKSwKLQlSQVRFVEFCX0VOVCgyMCwgIDB4MiwgICAwKSwKLQlSQVRFVEFCX0VOVCg1NSwgIDB4NCwgICAwKSwKLQlSQVRFVEFCX0VOVCgxMTAsIDB4OCwgICAwKSwKLQlSQVRFVEFCX0VOVCg2MCwgIDB4MTAsICAwKSwKLQlSQVRFVEFCX0VOVCg5MCwgIDB4MjAsICAwKSwKLQlSQVRFVEFCX0VOVCgxMjAsIDB4NDAsICAwKSwKLQlSQVRFVEFCX0VOVCgxODAsIDB4ODAsICAwKSwKLQlSQVRFVEFCX0VOVCgyNDAsIDB4MTAwLCAwKSwKLQlSQVRFVEFCX0VOVCgzNjAsIDB4MjAwLCAwKSwKLQlSQVRFVEFCX0VOVCg0ODAsIDB4NDAwLCAwKSwKLQlSQVRFVEFCX0VOVCg1NDAsIDB4ODAwLCAwKSwKKwlSQVRFVEFCX0VOVCgxMCwgIDAsICAwKSwKKwlSQVRFVEFCX0VOVCgyMCwgIDEsICAwKSwKKwlSQVRFVEFCX0VOVCg1NSwgIDIsICAwKSwKKwlSQVRFVEFCX0VOVCgxMTAsIDMsICAwKSwKKwlSQVRFVEFCX0VOVCg2MCwgIDksICAwKSwKKwlSQVRFVEFCX0VOVCg5MCwgIDYsICAwKSwKKwlSQVRFVEFCX0VOVCgxMjAsIDcsICAwKSwKKwlSQVRFVEFCX0VOVCgxODAsIDgsICAwKSwKKwlSQVRFVEFCX0VOVCgyNDAsIDksICAwKSwKKwlSQVRFVEFCX0VOVCgzNjAsIDEwLCAwKSwKKwlSQVRFVEFCX0VOVCg0ODAsIDExLCAwKSwKKwlSQVRFVEFCX0VOVCg1NDAsIDEyLCAwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIGxic19iYW5kXzJnaHogPSB7CkBAIC03NiwyMiArODAsNjM5IEBACiAJV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCwKIH07CiAKKy8qIFRpbWUgdG8gc3RheSBvbiB0aGUgY2hhbm5lbCAqLworI2RlZmluZSBMQlNfRFdFTExfUEFTU0lWRSAxMDAKKyNkZWZpbmUgTEJTX0RXRUxMX0FDVElWRSAgNDAKIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNaXNjIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogVExWcyBhcmUgTWFydmVsbCBzcGVjaWZpYy4gVGhleSBhcmUgdmVyeSBzaW1pbGFyIHRvIElFcywgdGhleSBoYXZlIHRoZQorICogc2FtZSBzdHJ1Y3R1cmU6IHR5cGUsIGxlbmd0aCwgZGF0YSouIFRoZSBvbmx5IGRpZmZlcmVuY2U6IGZvciBJRXMsIHRoZQorICogdHlwZSBhbmQgbGVuZ3RoIGFyZSB1OCwgYnV0IGZvciBUTFZzIHRoZXkncmUgX19sZTE2LgorICovCisKKy8qCisgKiBDb252ZXJ0IE5MODAyMTEncyBhdXRoX3R5cGUgdG8gdGhlIG9uZSBmcm9tIExpYmVydGFzLCBzZWUgY2hhcHRlciA1LjkuMQorICogaW4gdGhlIGZpcm13YXJlIHNwZWMKKyAqLworc3RhdGljIHU4IGxic19hdXRoX3RvX2F1dGh0eXBlKGVudW0gbmw4MDIxMV9hdXRoX3R5cGUgYXV0aF90eXBlKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisKKwlzd2l0Y2ggKGF1dGhfdHlwZSkgeworCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKKwljYXNlIE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWToKKwkJcmV0ID0gYXV0aF90eXBlOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOgorCQlyZXQgPSBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6CisJCXJldCA9IDB4ODA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNpbGVuY2UgY29tcGlsZXIgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworLyogVmFyaW91cyBmaXJtd2FyZSBjb21tYW5kcyBuZWVkIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCByYXRlcywgYnV0IHdpdGgKKyAgIHRoZSBoaWdodC1iaXQgc2V0IGZvciBiYXNpYyByYXRlcyAqLworc3RhdGljIGludCBsYnNfYWRkX3JhdGVzKHU4ICpyYXRlcykKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxic19yYXRlcyk7IGkrKykgeworCQl1OCByYXRlID0gbGJzX3JhdGVzW2ldLmJpdHJhdGUgLyA1OworCQlpZiAocmF0ZSA9PSAweDAyIHx8IHJhdGUgPT0gMHgwNCB8fAorCQkgICAgcmF0ZSA9PSAweDBiIHx8IHJhdGUgPT0gMHgxNikKKwkJCXJhdGUgfD0gMHg4MDsKKwkJcmF0ZXNbaV0gPSByYXRlOworCX0KKwlyZXR1cm4gQVJSQVlfU0laRShsYnNfcmF0ZXMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRMViB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIFRMVnMgYXJlIE1hcnZlbGwgc3BlY2lmaWMuIFRoZXkgYXJlIHZlcnkgc2ltaWxhciB0byBJRXMsIHRoZXkgaGF2ZSB0aGUKKyAqIHNhbWUgc3RydWN0dXJlOiB0eXBlLCBsZW5ndGgsIGRhdGEqLiBUaGUgb25seSBkaWZmZXJlbmNlOiBmb3IgSUVzLCB0aGUKKyAqIHR5cGUgYW5kIGxlbmd0aCBhcmUgdTgsIGJ1dCBmb3IgVExWcyB0aGV5J3JlIF9fbGUxNi4KKyAqLworCisKKy8qCisgKiBBZGQgc3NpZCBUTFYKKyAqLworI2RlZmluZSBMQlNfTUFYX1NTSURfVExWX1NJWkUJCQlcCisJKHNpemVvZihzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIpCQlcCisJICsgSUVFRTgwMjExX01BWF9TU0lEX0xFTikKKworc3RhdGljIGludCBsYnNfYWRkX3NzaWRfdGx2KHU4ICp0bHYsIGNvbnN0IHU4ICpzc2lkLCBpbnQgc3NpZF9sZW4pCit7CisJc3RydWN0IG1ydmxfaWVfc3NpZF9wYXJhbV9zZXQgKnNzaWRfdGx2ID0gKHZvaWQgKil0bHY7CisKKwkvKgorCSAqIFRMVi1JRCBTU0lEICAwMCAwMAorCSAqIGxlbmd0aCAgICAgICAwNiAwMAorCSAqIHNzaWQgICAgICAgICA0ZCA0ZSA1NCA0NSA1MyA1NAorCSAqLworCXNzaWRfdGx2LT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1NTSUQpOworCXNzaWRfdGx2LT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoc3NpZF9sZW4pOworCW1lbWNweShzc2lkX3Rsdi0+c3NpZCwgc3NpZCwgc3NpZF9sZW4pOworCXJldHVybiBzaXplb2Yoc3NpZF90bHYtPmhlYWRlcikgKyBzc2lkX2xlbjsKK30KKworCisvKgorICogQWRkIGNoYW5uZWwgbGlzdCBUTFYgKHNlY3Rpb24gOC40LjIpCisgKgorICogQWN0dWFsIGNoYW5uZWwgZGF0YSBjb21lcyBmcm9tIHByaXYtPndkZXYtPndpcGh5LT5jaGFubmVscy4KKyAqLworI2RlZmluZSBMQlNfTUFYX0NIQU5ORUxfTElTVF9UTFZfU0laRQkJCQkJXAorCShzaXplb2Yoc3RydWN0IG1ydmxfaWVfaGVhZGVyKQkJCQkJXAorCSArIChMQlNfU0NBTl9CRUZPUkVfTkFQICogc2l6ZW9mKHN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0KSkpCisKK3N0YXRpYyBpbnQgbGJzX2FkZF9jaGFubmVsX2xpc3RfdGx2KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTggKnRsdiwKKwkJCQkgICAgaW50IGxhc3RfY2hhbm5lbCwgaW50IGFjdGl2ZV9zY2FuKQoreworCWludCBjaGFuc2NhbnBhcmFtc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCkgKgorCQkobGFzdF9jaGFubmVsIC0gcHJpdi0+c2Nhbl9jaGFubmVsKTsKKworCXN0cnVjdCBtcnZsX2llX2hlYWRlciAqaGVhZGVyID0gKHZvaWQgKikgdGx2OworCisJLyoKKwkgKiBUTFYtSUQgQ0hBTkxJU1QgIDAxIDAxCisJICogbGVuZ3RoICAgICAgICAgICAwZSAwMAorCSAqIGNoYW5uZWwgICAgICAgICAgMDAgMDEgMDAgMDAgMDAgNjQgMDAKKwkgKiAgIHJhZGlvIHR5cGUgICAgIDAwCisJICogICBjaGFubmVsICAgICAgICAgICAwMQorCSAqICAgc2NhbiB0eXBlICAgICAgICAgICAgMDAKKwkgKiAgIG1pbiBzY2FuIHRpbWUgICAgICAgICAgIDAwIDAwCisJICogICBtYXggc2NhbiB0aW1lICAgICAgICAgICAgICAgICA2NCAwMAorCSAqIGNoYW5uZWwgMiAgICAgICAgMDAgMDIgMDAgMDAgMDAgNjQgMDAKKwkgKgorCSAqLworCisJaGVhZGVyLT50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfQ0hBTkxJU1QpOworCWhlYWRlci0+bGVuICA9IGNwdV90b19sZTE2KGNoYW5zY2FucGFyYW1zaXplKTsKKwl0bHYgKz0gc2l6ZW9mKHN0cnVjdCBtcnZsX2llX2hlYWRlcik7CisKKwkvKiBsYnNfZGViX3NjYW4oInNjYW46IGNoYW5uZWxzICVkIHRvICVkXG4iLCBwcml2LT5zY2FuX2NoYW5uZWwsCisJCSAgICAgbGFzdF9jaGFubmVsKTsgKi8KKwltZW1zZXQodGx2LCAwLCBjaGFuc2NhbnBhcmFtc2l6ZSk7CisKKwl3aGlsZSAocHJpdi0+c2Nhbl9jaGFubmVsIDwgbGFzdF9jaGFubmVsKSB7CisJCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICpwYXJhbSA9ICh2b2lkICopIHRsdjsKKworCQlwYXJhbS0+cmFkaW90eXBlID0gQ01EX1NDQU5fUkFESU9fVFlQRV9CRzsKKwkJcGFyYW0tPmNoYW5udW1iZXIgPQorCQkJcHJpdi0+c2Nhbl9yZXEtPmNoYW5uZWxzW3ByaXYtPnNjYW5fY2hhbm5lbF0tPmh3X3ZhbHVlOworCQlpZiAoYWN0aXZlX3NjYW4pIHsKKwkJCXBhcmFtLT5tYXhzY2FudGltZSA9IGNwdV90b19sZTE2KExCU19EV0VMTF9BQ1RJVkUpOworCQl9IGVsc2UgeworCQkJcGFyYW0tPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiA9IDE7CisJCQlwYXJhbS0+bWF4c2NhbnRpbWUgPSBjcHVfdG9fbGUxNihMQlNfRFdFTExfUEFTU0lWRSk7CisJCX0KKwkJdGx2ICs9IHNpemVvZihzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCk7CisJCXByaXYtPnNjYW5fY2hhbm5lbCsrOworCX0KKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBtcnZsX2llX2hlYWRlcikgKyBjaGFuc2NhbnBhcmFtc2l6ZTsKK30KKworCisvKgorICogQWRkIHJhdGVzIFRMVgorICoKKyAqIFRoZSByYXRlcyBhcmUgaW4gbGJzX2JnX3JhdGVzW10sIGJ1dCBmb3IgdGhlIDgwMi4xMWIKKyAqIHJhdGVzIHRoZSBoaWdoIGJpdCBpcyBzZXQuIFdlIGFkZCB0aGlzIFRMViBvbmx5IGJlY2F1c2UKKyAqIHRoZXJlJ3MgYSBmaXJtd2FyZSB3aGljaCBvdGhlcndpc2UgZG9lc24ndCByZXBvcnQgYWxsCisgKiBBUHMgaW4gcmFuZ2UuCisgKi8KKyNkZWZpbmUgTEJTX01BWF9SQVRFU19UTFZfU0laRQkJCVwKKwkoc2l6ZW9mKHN0cnVjdCBtcnZsX2llX2hlYWRlcikJCVwKKwkgKyAoQVJSQVlfU0laRShsYnNfcmF0ZXMpKSkKKworLyogQWRkcyBhIFRMViB3aXRoIGFsbCByYXRlcyB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgKi8KK3N0YXRpYyBpbnQgbGJzX2FkZF9zdXBwb3J0ZWRfcmF0ZXNfdGx2KHU4ICp0bHYpCit7CisJc2l6ZV90IGk7CisJc3RydWN0IG1ydmxfaWVfcmF0ZXNfcGFyYW1fc2V0ICpyYXRlX3RsdiA9ICh2b2lkICopdGx2OworCisJLyoKKwkgKiBUTFYtSUQgUkFURVMgIDAxIDAwCisJICogbGVuZ3RoICAgICAgICAwZSAwMAorCSAqIHJhdGVzICAgICAgICAgODIgODQgOGIgOTYgMGMgMTIgMTggMjQgMzAgNDggNjAgNmMKKwkgKi8KKwlyYXRlX3Rsdi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9SQVRFUyk7CisJdGx2ICs9IHNpemVvZihyYXRlX3Rsdi0+aGVhZGVyKTsKKwlpID0gbGJzX2FkZF9yYXRlcyh0bHYpOworCXRsdiArPSBpOworCXJhdGVfdGx2LT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoaSk7CisJcmV0dXJuIHNpemVvZihyYXRlX3Rsdi0+aGVhZGVyKSArIGk7Cit9CisKKworLyoKKyAqIEFkZHMgYSBUTFYgd2l0aCBhbGwgcmF0ZXMgdGhlIGhhcmR3YXJlICphbmQqIEJTUyBzdXBwb3J0cy4KKyAqLworc3RhdGljIGludCBsYnNfYWRkX2NvbW1vbl9yYXRlc190bHYodTggKnRsdiwgc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzKQoreworCXN0cnVjdCBtcnZsX2llX3JhdGVzX3BhcmFtX3NldCAqcmF0ZV90bHYgPSAodm9pZCAqKXRsdjsKKwljb25zdCB1OCAqcmF0ZXNfZWlkID0gaWVlZTgwMjExX2Jzc19nZXRfaWUoYnNzLCBXTEFOX0VJRF9TVVBQX1JBVEVTKTsKKwlpbnQgbjsKKworCS8qCisJICogMDEgMDAgICAgICAgICAgICAgICAgICAgVExWX1RZUEVfUkFURVMKKwkgKiAwNCAwMCAgICAgICAgICAgICAgICAgICBsZW4KKwkgKiA4MiA4NCA4YiA5NiAgICAgICAgICAgICByYXRlcworCSAqLworCXJhdGVfdGx2LT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1JBVEVTKTsKKwl0bHYgKz0gc2l6ZW9mKHJhdGVfdGx2LT5oZWFkZXIpOworCisJaWYgKCFyYXRlc19laWQpIHsKKwkJLyogRmFsbGJhY2s6IGFkZCBiYXNpYyA4MDIuMTFiIHJhdGVzICovCisJCSp0bHYrKyA9IDB4ODI7CisJCSp0bHYrKyA9IDB4ODQ7CisJCSp0bHYrKyA9IDB4OGI7CisJCSp0bHYrKyA9IDB4OTY7CisJCW4gPSA0OworCX0gZWxzZSB7CisJCWludCBodywgYXA7CisJCXU4IGFwX21heCA9IHJhdGVzX2VpZFsxXTsKKwkJbiA9IDA7CisJCWZvciAoaHcgPSAwOyBodyA8IEFSUkFZX1NJWkUobGJzX3JhdGVzKTsgaHcrKykgeworCQkJdTggaHdfcmF0ZSA9IGxic19yYXRlc1tod10uYml0cmF0ZSAvIDU7CisJCQlmb3IgKGFwID0gMDsgYXAgPCBhcF9tYXg7IGFwKyspIHsKKwkJCQlpZiAoaHdfcmF0ZSA9PSAocmF0ZXNfZWlkW2FwKzJdICYgMHg3ZikpIHsKKwkJCQkJKnRsdisrID0gcmF0ZXNfZWlkW2FwKzJdOworCQkJCQluKys7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmF0ZV90bHYtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihuKTsKKwlyZXR1cm4gc2l6ZW9mKHJhdGVfdGx2LT5oZWFkZXIpICsgbjsKK30KKworCisvKgorICogQWRkIGF1dGggdHlwZSBUTFYuCisgKgorICogVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgbmV3ZXIgZmlybXdhcmUgKFY5IGFuZCB1cCkuCisgKi8KKyNkZWZpbmUgTEJTX01BWF9BVVRIX1RZUEVfVExWX1NJWkUgXAorCXNpemVvZihzdHJ1Y3QgbXJ2bF9pZV9hdXRoX3R5cGUpCisKK3N0YXRpYyBpbnQgbGJzX2FkZF9hdXRoX3R5cGVfdGx2KHU4ICp0bHYsIGVudW0gbmw4MDIxMV9hdXRoX3R5cGUgYXV0aF90eXBlKQoreworCXN0cnVjdCBtcnZsX2llX2F1dGhfdHlwZSAqYXV0aCA9ICh2b2lkICopIHRsdjsKKworCS8qCisJICogMWYgMDEgIFRMVl9UWVBFX0FVVEhfVFlQRQorCSAqIDAxIDAwICBsZW4KKwkgKiAwMSAgICAgYXV0aCB0eXBlCisJICovCisJYXV0aC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9BVVRIX1RZUEUpOworCWF1dGgtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKmF1dGgpLXNpemVvZihhdXRoLT5oZWFkZXIpKTsKKwlhdXRoLT5hdXRoID0gY3B1X3RvX2xlMTYobGJzX2F1dGhfdG9fYXV0aHR5cGUoYXV0aF90eXBlKSk7CisJcmV0dXJuIHNpemVvZigqYXV0aCk7Cit9CisKKworLyoKKyAqIEFkZCBjaGFubmVsIChwaHkgZHMpIFRMVgorICovCisjZGVmaW5lIExCU19NQVhfQ0hBTk5FTF9UTFZfU0laRSBcCisJc2l6ZW9mKHN0cnVjdCBtcnZsX2llX2hlYWRlcikKKworc3RhdGljIGludCBsYnNfYWRkX2NoYW5uZWxfdGx2KHU4ICp0bHYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IG1ydmxfaWVfZHNfcGFyYW1fc2V0ICpkcyA9ICh2b2lkICopIHRsdjsKKworCS8qCisJICogMDMgMDAgIFRMVl9UWVBFX1BIWV9EUworCSAqIDAxIDAwICBsZW4KKwkgKiAwNiAgICAgY2hhbm5lbAorCSAqLworCWRzLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1BIWV9EUyk7CisJZHMtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKmRzKS1zaXplb2YoZHMtPmhlYWRlcikpOworCWRzLT5jaGFubmVsID0gY2hhbm5lbDsKKwlyZXR1cm4gc2l6ZW9mKCpkcyk7Cit9CisKKworLyoKKyAqIEFkZCAoZW1wdHkpIENGIHBhcmFtIFRMViBvZiB0aGUgZm9ybToKKyAqLworI2RlZmluZSBMQlNfTUFYX0NGX1BBUkFNX1RMVl9TSVpFCQlcCisJc2l6ZW9mKHN0cnVjdCBtcnZsX2llX2hlYWRlcikKKworc3RhdGljIGludCBsYnNfYWRkX2NmX3BhcmFtX3Rsdih1OCAqdGx2KQoreworCXN0cnVjdCBtcnZsX2llX2NmX3BhcmFtX3NldCAqY2YgPSAodm9pZCAqKXRsdjsKKworCS8qCisJICogMDQgMDAgIFRMVl9UWVBFX0NGCisJICogMDYgMDAgIGxlbgorCSAqIDAwICAgICBjZnBjbnQKKwkgKiAwMCAgICAgY2ZwcGVyaW9kCisJICogMDAgMDAgIGNmcG1heGR1cmF0aW9uCisJICogMDAgMDAgIGNmcGR1cmF0aW9ucmVtYWluaW5nCisJICovCisJY2YtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfQ0YpOworCWNmLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjZiktc2l6ZW9mKGNmLT5oZWFkZXIpKTsKKwlyZXR1cm4gc2l6ZW9mKCpjZik7Cit9CisKKy8qCisgKiBBZGQgV1BBIFRMVgorICovCisjZGVmaW5lIExCU19NQVhfV1BBX1RMVl9TSVpFCQkJXAorCShzaXplb2Yoc3RydWN0IG1ydmxfaWVfaGVhZGVyKQkJXAorCSArIDEyOCAvKiBUT0RPOiBJIGd1ZXNzZWQgdGhlIHNpemUgKi8pCisKK3N0YXRpYyBpbnQgbGJzX2FkZF93cGFfdGx2KHU4ICp0bHYsIGNvbnN0IHU4ICppZSwgdTggaWVfbGVuKQoreworCXNpemVfdCB0bHZfbGVuOworCisJLyoKKwkgKiBXZSBuZWVkIGp1c3QgY29udmVydCBhbiBJRSB0byBhbiBUTFYuIElFcyB1c2UgdTggZm9yIHRoZSBoZWFkZXIsCisJICogICB1OCAgICAgIHR5cGUKKwkgKiAgIHU4ICAgICAgbGVuCisJICogICB1OFtdICAgIGRhdGEKKwkgKiBidXQgVExWcyB1c2UgX19sZTE2IGluc3RlYWQ6CisJICogICBfX2xlMTYgIHR5cGUKKwkgKiAgIF9fbGUxNiAgbGVuCisJICogICB1OFtdICAgIGRhdGEKKwkgKi8KKwkqdGx2KysgPSAqaWUrKzsKKwkqdGx2KysgPSAwOworCXRsdl9sZW4gPSAqdGx2KysgPSAqaWUrKzsKKwkqdGx2KysgPSAwOworCXdoaWxlICh0bHZfbGVuLS0pCisJCSp0bHYrKyA9ICppZSsrOworCS8qIHRoZSBUTFYgaXMgdHdvIGJ5dGVzIGxhcmdlciB0aGFuIHRoZSBJRSAqLworCXJldHVybiBpZV9sZW4gKyAyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgQ2hhbm5lbAorICovCisKIHN0YXRpYyBpbnQgbGJzX2NmZ19zZXRfY2hhbm5lbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKIAllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSkKIHsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAlpbnQgcmV0ID0gLUVOT1RTVVBQOwogCi0JbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJmcmVxICVkLCB0eXBlICVkIiwgY2hhbi0+Y2VudGVyX2ZyZXEsIGNoYW5uZWxfdHlwZSk7CisJbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJmcmVxICVkLCB0eXBlICVkIiwKKwkJCSAgIGNoYW5uZWwtPmNlbnRlcl9mcmVxLCBjaGFubmVsX3R5cGUpOwogCiAJaWYgKGNoYW5uZWxfdHlwZSAhPSBOTDgwMjExX0NIQU5fTk9fSFQpCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gbGJzX3NldF9jaGFubmVsKHByaXYsIGNoYW4tPmh3X3ZhbHVlKTsKKwlyZXQgPSBsYnNfc2V0X2NoYW5uZWwocHJpdiwgY2hhbm5lbC0+aHdfdmFsdWUpOworCisgb3V0OgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NGRzgwMjExLCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2Nhbm5pbmcKKyAqLworCisvKgorICogV2hlbiBzY2FubmluZywgdGhlIGZpcm13YXJlIGRvZXNuJ3Qgc2VuZCBhIG51bCBwYWNrZXQgd2l0aCB0aGUgcG93ZXItc2FmZQorICogYml0IHRvIHRoZSBBUC4gU28gd2UgY2Fubm90IHN0YXkgYXdheSBmcm9tIG91ciBjdXJyZW50IGNoYW5uZWwgdG9vIGxvbmcsCisgKiBvdGhlcndpc2Ugd2UgbG9vc2UgZGF0YS4gU28gdGFrZSBhICJuYXAiIHdoaWxlIHNjYW5uaW5nIGV2ZXJ5IG90aGVyCisgKiB3aGlsZS4KKyAqLworI2RlZmluZSBMQlNfU0NBTl9CRUZPUkVfTkFQIDQKKworCisvKgorICogV2hlbiB0aGUgZmlybXdhcmUgcmVwb3J0cyBiYWNrIGEgc2Nhbi1yZXN1bHQsIGl0IGdpdmVzIHVzIGFuICJ1OCByc3NpIiwKKyAqIHdoaWNoIGlzbid0IHJlYWxseSBhbiBSU1NJLCBhcyBpdCBiZWNvbWVzIGxhcmdlciB3aGVuIG1vdmluZyBhd2F5IGZyb20KKyAqIHRoZSBBUC4gQW55d2F5LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhhdCBpbnRvIG1CbS4KKyAqLworI2RlZmluZSBMQlNfU0NBTl9SU1NJX1RPX01CTShyc3NpKSBcCisJKCgtKGludClyc3NpICsgMykqMTAwKQorCitzdGF0aWMgaW50IGxic19yZXRfc2NhbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZHVtbXksCisJc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2Nhbl9yc3AgKnNjYW5yZXNwID0gKHZvaWQgKilyZXNwOworCWludCBic3NzaXplOworCWNvbnN0IHU4ICpwb3M7CisJdTE2IG5yX3NldHM7CisJY29uc3QgdTggKnRzZmRlc2M7CisJaW50IHRzZnNpemU7CisJaW50IGk7CisJaW50IHJldCA9IC1FSUxTRVE7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJYnNzc2l6ZSA9IGdldF91bmFsaWduZWRfbGUxNigmc2NhbnJlc3AtPmJzc2Rlc2NyaXB0c2l6ZSk7CisJbnJfc2V0cyA9IGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpOworCisJLyoKKwkgKiBUaGUgZ2VuZXJhbCBsYXlvdXQgb2YgdGhlIHNjYW4gcmVzcG9uc2UgaXMgZGVzY3JpYmVkIGluIGNoYXB0ZXIKKwkgKiA1LjcuMS4gQmFzaWNhbGx5IHdlIGhhdmUgYSBjb21tb24gcGFydCwgdGhlbiBhbnkgbnVtYmVyIG9mIEJTUworCSAqIGRlc2NyaXB0b3Igc2VjdGlvbnMuIEZpbmFsbHkgd2UgaGF2ZSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbnVtYmVyCisJICogb2YgVFNGcy4KKwkgKgorCSAqIGNtZF9kc184MDJfMTFfc2Nhbl9yc3AKKwkgKiAgIGNtZF9oZWFkZXIKKwkgKiAgIHBvc19zaXplCisJICogICBucl9zZXRzCisJICogICBic3NkZXNjIDEKKwkgKiAgICAgYnNzaWQKKwkgKiAgICAgcnNzaQorCSAqICAgICB0aW1lc3RhbXAKKwkgKiAgICAgaW50dmwKKwkgKiAgICAgY2FwYQorCSAqICAgICBJRXMKKwkgKiAgIGJzc2Rlc2MgMgorCSAqICAgYnNzZGVzYyBuCisJICogICBNcnZsSUV0eXBlc19Uc2ZGaW1lc3RhbXBfdAorCSAqICAgICBUU0YgZm9yIEJTUyAxCisJICogICAgIFRTRiBmb3IgQlNTIDIKKwkgKiAgICAgVFNGIGZvciBCU1MgbgorCSAqLworCisJcG9zID0gc2NhbnJlc3AtPmJzc2Rlc2NfYW5kX3RsdmJ1ZmZlcjsKKworCXRzZmRlc2MgPSBwb3MgKyBic3NzaXplOworCXRzZnNpemUgPSA0ICsgOCAqIHNjYW5yZXNwLT5ucl9zZXRzOworCisJLyogVmFsaWRpdHkgY2hlY2s6IHdlIGV4cGVjdCBhIE1hcnZlbGwtTG9jYWwgVExWICovCisJaSA9IGdldF91bmFsaWduZWRfbGUxNih0c2ZkZXNjKTsKKwl0c2ZkZXNjICs9IDI7CisJaWYgKGkgIT0gVExWX1RZUEVfVFNGVElNRVNUQU1QKQorCQlnb3RvIGRvbmU7CisJLyogVmFsaWRpdHkgY2hlY2s6IHRoZSBUTFYgaG9sZHMgVFNGIHZhbHVlcyB3aXRoIDggYnl0ZXMgZWFjaCwgc28KKwkgKiB0aGUgc2l6ZSBpbiB0aGUgVExWIG11c3QgbWF0Y2ggdGhlIG5yX3NldHMgdmFsdWUgKi8KKwlpID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHRzZmRlc2MpOworCXRzZmRlc2MgKz0gMjsKKwlpZiAoaSAvIDggIT0gc2NhbnJlc3AtPm5yX3NldHMpCisJCWdvdG8gZG9uZTsKKworCWZvciAoaSA9IDA7IGkgPCBzY2FucmVzcC0+bnJfc2V0czsgaSsrKSB7CisJCWNvbnN0IHU4ICpic3NpZDsKKwkJY29uc3QgdTggKmllOworCQlpbnQgbGVmdDsKKwkJaW50IGllbGVuOworCQlpbnQgcnNzaTsKKwkJdTE2IGludHZsOworCQl1MTYgY2FwYTsKKwkJaW50IGNoYW5fbm8gPSAtMTsKKwkJY29uc3QgdTggKnNzaWQgPSBOVUxMOworCQl1OCBzc2lkX2xlbiA9IDA7CisJCURFQ0xBUkVfU1NJRF9CVUYoc3NpZF9idWYpOworCisJCWludCBsZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYocG9zKTsKKwkJcG9zICs9IDI7CisKKwkJLyogQlNTSUQgKi8KKwkJYnNzaWQgPSBwb3M7CisJCXBvcyArPSBFVEhfQUxFTjsKKwkJLyogUlNTSSAqLworCQlyc3NpID0gKnBvcysrOworCQkvKiBQYWNrZXQgdGltZSBzdGFtcCAqLworCQlwb3MgKz0gODsKKwkJLyogQmVhY29uIGludGVydmFsICovCisJCWludHZsID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHBvcyk7CisJCXBvcyArPSAyOworCQkvKiBDYXBhYmlsaXRpZXMgKi8KKwkJY2FwYSA9IGdldF91bmFsaWduZWRfbGUxNihwb3MpOworCQlwb3MgKz0gMjsKKworCQkvKiBUbyBmaW5kIG91dCB0aGUgY2hhbm5lbCwgd2UgbXVzdCBwYXJzZSB0aGUgSUVzICovCisJCWllID0gcG9zOworCQkvKiA2KzErOCsyKzI6IHNpemUgb2YgQlNTSUQsIFJTU0ksIHRpbWUgc3RhbXAsIGJlYWNvbgorCQkgICBpbnRlcnZhbCwgY2FwYWJpbGl0aWVzICovCisJCWllbGVuID0gbGVmdCA9IGxlbiAtICg2ICsgMSArIDggKyAyICsgMik7CisJCXdoaWxlIChsZWZ0ID49IDIpIHsKKwkJCXU4IGlkLCBlbGVuOworCQkJaWQgPSAqcG9zKys7CisJCQllbGVuID0gKnBvcysrOworCQkJbGVmdCAtPSAyOworCQkJaWYgKGVsZW4gPiBsZWZ0IHx8IGVsZW4gPT0gMCkKKwkJCQlnb3RvIGRvbmU7CisJCQlpZiAoaWQgPT0gV0xBTl9FSURfRFNfUEFSQU1TKQorCQkJCWNoYW5fbm8gPSAqcG9zOworCQkJaWYgKGlkID09IFdMQU5fRUlEX1NTSUQpIHsKKwkJCQlzc2lkID0gcG9zOworCQkJCXNzaWRfbGVuID0gZWxlbjsKKwkJCX0KKwkJCWxlZnQgLT0gZWxlbjsKKwkJCXBvcyArPSBlbGVuOworCQl9CisKKwkJLyogTm8gY2hhbm5lbCwgbm8gbHVjayAqLworCQlpZiAoY2hhbl9ubyAhPSAtMSkgeworCQkJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHByaXYtPndkZXYtPndpcGh5OworCQkJaW50IGZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbl9ubyk7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPQorCQkJCWllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSk7CisKKwkJCWxic19kZWJfc2Nhbigic2NhbjogJXBNLCBjYXBhICUwNHgsIGNoYW4gJTJkLCAlcywgIgorCQkJCSAgICAgIiVkIGRCbVxuIiwKKwkJCQkgICAgIGJzc2lkLCBjYXBhLCBjaGFuX25vLAorCQkJCSAgICAgcHJpbnRfc3NpZChzc2lkX2J1Ziwgc3NpZCwgc3NpZF9sZW4pLAorCQkJCSAgICAgTEJTX1NDQU5fUlNTSV9UT19NQk0ocnNzaSkvMTAwKTsKKworCQkJaWYgKGNoYW5uZWwgfHwKKwkJCSAgICAhKGNoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKQorCQkJCWNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsCisJCQkJCWJzc2lkLCBsZTY0X3RvX2NwdSgqKF9fbGU2NCAqKXRzZmRlc2MpLAorCQkJCQljYXBhLCBpbnR2bCwgaWUsIGllbGVuLAorCQkJCQlMQlNfU0NBTl9SU1NJX1RPX01CTShyc3NpKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCX0KKwkJdHNmZGVzYyArPSA4OworCX0KKwlyZXQgPSAwOworCisgZG9uZToKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9TQ0FOLCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBPdXIgc2NhbiBjb21tYW5kIGNvbnRhaW5zIGEgVExWLCBjb25zdGluZyBvZiBhIFNTSUQgVExWLCBhIGNoYW5uZWwgbGlzdAorICogVExWIGFuZCBhIHJhdGVzIFRMVi4gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlbToKKyAqLworI2RlZmluZSBMQlNfU0NBTl9NQVhfQ01EX1NJWkUJCQlcCisJKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuKQlcCisJICsgTEJTX01BWF9TU0lEX1RMVl9TSVpFCQlcCisJICsgTEJTX01BWF9DSEFOTkVMX0xJU1RfVExWX1NJWkUJXAorCSArIExCU19NQVhfUkFURVNfVExWX1NJWkUpCisKKy8qCisgKiBBc3N1bWVzIHByaXYtPnNjYW5fcmVxIGlzIGluaXRpYWxpemVkIGFuZCB2YWxpZAorICogQXNzdW1lcyBwcml2LT5zY2FuX2NoYW5uZWwgaXMgaW5pdGlhbGl6ZWQKKyAqLworc3RhdGljIHZvaWQgbGJzX3NjYW5fd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGxic19wcml2YXRlLCBzY2FuX3dvcmsud29yayk7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2NhbiAqc2Nhbl9jbWQ7CisJdTggKnRsdjsgLyogcG9pbnRlciBpbnRvIG91ciBjdXJyZW50LCBncm93aW5nIFRMViBzdG9yYWdlIGFyZWEgKi8KKwlpbnQgbGFzdF9jaGFubmVsOworCWludCBydW5uaW5nLCBjYXJyaWVyOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX1NDQU4pOworCisJc2Nhbl9jbWQgPSBremFsbG9jKExCU19TQ0FOX01BWF9DTURfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNjYW5fY21kID09IE5VTEwpCisJCWdvdG8gb3V0X25vX3NjYW5fY21kOworCisJLyogcHJlcGFyZSBmaXhlZCBwYXJ0IG9mIHNjYW4gY29tbWFuZCAqLworCXNjYW5fY21kLT5ic3N0eXBlID0gQ01EX0JTU19UWVBFX0FOWTsKKworCS8qIHN0b3AgbmV0d29yayB3aGlsZSB3ZSdyZSBhd2F5IGZyb20gb3VyIG1haW4gY2hhbm5lbCAqLworCXJ1bm5pbmcgPSAhbmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5kZXYpOworCWNhcnJpZXIgPSBuZXRpZl9jYXJyaWVyX29rKHByaXYtPmRldik7CisJaWYgKHJ1bm5pbmcpCisJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+ZGV2KTsKKwlpZiAoY2FycmllcikKKwkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+ZGV2KTsKKworCS8qIHByZXBhcmUgZml4ZWQgcGFydCBvZiBzY2FuIGNvbW1hbmQgKi8KKwl0bHYgPSBzY2FuX2NtZC0+dGx2YnVmZmVyOworCisJLyogYWRkIFNTSUQgVExWICovCisJaWYgKHByaXYtPnNjYW5fcmVxLT5uX3NzaWRzKQorCQl0bHYgKz0gbGJzX2FkZF9zc2lkX3Rsdih0bHYsCisJCQkJCXByaXYtPnNjYW5fcmVxLT5zc2lkc1swXS5zc2lkLAorCQkJCQlwcml2LT5zY2FuX3JlcS0+c3NpZHNbMF0uc3NpZF9sZW4pOworCisJLyogYWRkIGNoYW5uZWwgVExWcyAqLworCWxhc3RfY2hhbm5lbCA9IHByaXYtPnNjYW5fY2hhbm5lbCArIExCU19TQ0FOX0JFRk9SRV9OQVA7CisJaWYgKGxhc3RfY2hhbm5lbCA+IHByaXYtPnNjYW5fcmVxLT5uX2NoYW5uZWxzKQorCQlsYXN0X2NoYW5uZWwgPSBwcml2LT5zY2FuX3JlcS0+bl9jaGFubmVsczsKKwl0bHYgKz0gbGJzX2FkZF9jaGFubmVsX2xpc3RfdGx2KHByaXYsIHRsdiwgbGFzdF9jaGFubmVsLAorCQlwcml2LT5zY2FuX3JlcS0+bl9zc2lkcyk7CisKKwkvKiBhZGQgcmF0ZXMgVExWICovCisJdGx2ICs9IGxic19hZGRfc3VwcG9ydGVkX3JhdGVzX3Rsdih0bHYpOworCisJaWYgKHByaXYtPnNjYW5fY2hhbm5lbCA8IHByaXYtPnNjYW5fcmVxLT5uX2NoYW5uZWxzKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNjYW5fd29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrX3RocmVhZCwgJnByaXYtPnNjYW5fd29yaywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoMzAwKSk7CisJfQorCisJLyogVGhpcyBpcyB0aGUgZmluYWwgZGF0YSB3ZSBhcmUgYWJvdXQgdG8gc2VuZCAqLworCXNjYW5fY21kLT5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHRsdiAtICh1OCAqKXNjYW5fY21kKTsKKwlsYnNfZGViX2hleChMQlNfREVCX1NDQU4sICJTQ0FOX0NNRCIsICh2b2lkICopc2Nhbl9jbWQsCisJCSAgICBzaXplb2YoKnNjYW5fY21kKSk7CisJbGJzX2RlYl9oZXgoTEJTX0RFQl9TQ0FOLCAiU0NBTl9UTFYiLCBzY2FuX2NtZC0+dGx2YnVmZmVyLAorCQkgICAgdGx2IC0gc2Nhbl9jbWQtPnRsdmJ1ZmZlcik7CisKKwlfX2xic19jbWQocHJpdiwgQ01EXzgwMl8xMV9TQ0FOLCAmc2Nhbl9jbWQtPmhkciwKKwkJbGUxNl90b19jcHUoc2Nhbl9jbWQtPmhkci5zaXplKSwKKwkJbGJzX3JldF9zY2FuLCAwKTsKKworCWlmIChwcml2LT5zY2FuX2NoYW5uZWwgPj0gcHJpdi0+c2Nhbl9yZXEtPm5fY2hhbm5lbHMpIHsKKwkJLyogTWFyayBzY2FuIGRvbmUgKi8KKwkJY2ZnODAyMTFfc2Nhbl9kb25lKHByaXYtPnNjYW5fcmVxLCBmYWxzZSk7CisJCXByaXYtPnNjYW5fcmVxID0gTlVMTDsKKwl9CisKKwkvKiBSZXN0YXJ0IG5ldHdvcmsgKi8KKwlpZiAoY2FycmllcikKKwkJbmV0aWZfY2Fycmllcl9vbihwcml2LT5kZXYpOworCWlmIChydW5uaW5nICYmICFwcml2LT50eF9wZW5kaW5nX2xlbikKKwkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOworCisJa2ZyZWUoc2Nhbl9jbWQpOworCisgb3V0X25vX3NjYW5fY21kOgorCWxic19kZWJfbGVhdmUoTEJTX0RFQl9TQ0FOKTsKK30KKworCitzdGF0aWMgaW50IGxic19jZmdfc2NhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlpbnQgcmV0ID0gMDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwlpZiAocHJpdi0+c2Nhbl9yZXEgfHwgZGVsYXllZF93b3JrX3BlbmRpbmcoJnByaXYtPnNjYW5fd29yaykpIHsKKwkJLyogb2xkIHNjYW4gcmVxdWVzdCBub3QgeWV0IHByb2Nlc3NlZCAqLworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwlsYnNfZGViX3NjYW4oInNjYW46IHNzaWRzICVkLCBjaGFubmVscyAlZCwgaWVfbGVuICV6ZFxuIiwKKwkJcmVxdWVzdC0+bl9zc2lkcywgcmVxdWVzdC0+bl9jaGFubmVscywgcmVxdWVzdC0+aWVfbGVuKTsKKworCXByaXYtPnNjYW5fY2hhbm5lbCA9IDA7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtfdGhyZWFkLCAmcHJpdi0+c2Nhbl93b3JrLAorCQltc2Vjc190b19qaWZmaWVzKDUwKSk7CisKKwlpZiAocHJpdi0+c3VycHJpc2VyZW1vdmVkKQorCQlyZXQgPSAtRUlPOworCisJcHJpdi0+c2Nhbl9yZXEgPSByZXF1ZXN0OwogCiAgb3V0OgogCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NGRzgwMjExLCAicmV0ICVkIiwgcmV0KTsKQEAgLTEwMSw4ICs3MjIsMTE0NSBAQAogCiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXZlbnRzCisgKi8KKwordm9pZCBsYnNfc2VuZF9kaXNjb25uZWN0X25vdGlmaWNhdGlvbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCit7CisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChwcml2LT5kZXYsCisJCTAsCisJCU5VTEwsIDAsCisJCUdGUF9LRVJORUwpOworCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NGRzgwMjExKTsKK30KKwordm9pZCBsYnNfc2VuZF9taWNfZmFpbHVyZWV2ZW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGV2ZW50KQoreworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHByaXYtPmRldiwKKwkJcHJpdi0+YXNzb2NfYnNzLAorCQlldmVudCA9PSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9NVUxUSUNBU1QgPworCQkJTkw4MDIxMV9LRVlUWVBFX0dST1VQIDoKKwkJCU5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSwKKwkJLTEsCisJCU5VTEwsCisJCUdGUF9LRVJORUwpOworCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NGRzgwMjExKTsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29ubmVjdC9kaXNjb25uZWN0CisgKi8KKworCisvKgorICogVGhpcyByZW1vdmVzIGFsbCBXRVAga2V5cworICovCitzdGF0aWMgaW50IGxic19yZW1vdmVfd2VwX2tleXMoc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3NldF93ZXAgY21kOworCWludCByZXQ7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmtleWluZGV4ID0gY3B1X3RvX2xlMTYocHJpdi0+d2VwX3R4X2tleSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfUkVNT1ZFKTsKKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1NFVF9XRVAsICZjbWQpOworCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NGRzgwMjExKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2V0IFdFUCBrZXlzCisgKi8KK3N0YXRpYyBpbnQgbGJzX3NldF93ZXBfa2V5cyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCBjbWQ7CisJaW50IGk7CisJaW50IHJldDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwkvKgorCSAqIGNvbW1hbmQgICAgICAgICAxMyAwMAorCSAqIHNpemUgICAgICAgICAgICA1MCAwMAorCSAqIHNlcXVlbmNlICAgICAgICB4eCB4eAorCSAqIHJlc3VsdCAgICAgICAgICAwMCAwMAorCSAqIGFjdGlvbiAgICAgICAgICAwMiAwMCAgICAgQUNUX0FERAorCSAqIHRyYW5zbWl0IGtleSAgICAwMCAwMAorCSAqIHR5cGUgZm9yIGtleSAxICAwMSAgICAgICAgV0VQNDAKKwkgKiB0eXBlIGZvciBrZXkgMiAgMDAKKwkgKiB0eXBlIGZvciBrZXkgMyAgMDAKKwkgKiB0eXBlIGZvciBrZXkgNCAgMDAKKwkgKiBrZXkgMSAgICAgICAgICAgMzkgMzkgMzkgMzkgMzkgMDAgMDAgMDAKKwkgKiAgICAgICAgICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiBrZXkgMiAgICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiAgICAgICAgICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiBrZXkgMyAgICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiAgICAgICAgICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiBrZXkgNCAgICAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKi8KKwlpZiAocHJpdi0+d2VwX2tleV9sZW5bMF0gfHwgcHJpdi0+d2VwX2tleV9sZW5bMV0gfHwKKwkgICAgcHJpdi0+d2VwX2tleV9sZW5bMl0gfHwgcHJpdi0+d2VwX2tleV9sZW5bM10pIHsKKwkJLyogT25seSBzZXQgd2VwIGtleXMgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgb2YgdGhlbSAqLworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJCWNtZC5rZXlpbmRleCA9IGNwdV90b19sZTE2KHByaXYtPndlcF90eF9rZXkpOworCQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9BREQpOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXN3aXRjaCAocHJpdi0+d2VwX2tleV9sZW5baV0pIHsKKwkJCWNhc2UgV0xBTl9LRVlfTEVOX1dFUDQwOgorCQkJCWNtZC5rZXl0eXBlW2ldID0gQ01EX1RZUEVfV0VQXzQwX0JJVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0xBTl9LRVlfTEVOX1dFUDEwNDoKKwkJCQljbWQua2V5dHlwZVtpXSA9IENNRF9UWVBFX1dFUF8xMDRfQklUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljbWQua2V5dHlwZVtpXSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoY21kLmtleW1hdGVyaWFsW2ldLCBwcml2LT53ZXBfa2V5W2ldLAorCQkJICAgICAgIHByaXYtPndlcF9rZXlfbGVuW2ldKTsKKwkJfQorCisJCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1NFVF9XRVAsICZjbWQpOworCX0gZWxzZSB7CisJCS8qIE90aGVyd2lzZSByZW1vdmUgYWxsIHdlcCBrZXlzICovCisJCXJldCA9IGxic19yZW1vdmVfd2VwX2tleXMocHJpdik7CisJfQorCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NGRzgwMjExKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBFbmFibGUvRGlzYWJsZSBSU04gc3RhdHVzCisgKi8KK3N0YXRpYyBpbnQgbGJzX2VuYWJsZV9yc24oc3RydWN0IGxic19wcml2YXRlICpwcml2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2VuYWJsZV9yc24gY21kOworCWludCByZXQ7CisKKwlsYnNfZGViX2VudGVyX2FyZ3MoTEJTX0RFQl9DRkc4MDIxMSwgIiVkIiwgZW5hYmxlKTsKKworCS8qCisJICogY21kICAgICAgIDJmIDAwCisJICogc2l6ZSAgICAgIDBjIDAwCisJICogc2VxdWVuY2UgIHh4IHh4CisJICogcmVzdWx0ICAgIDAwIDAwCisJICogYWN0aW9uICAgIDAxIDAwICAgIEFDVF9TRVQKKwkgKiBlbmFibGUgICAgMDEgMDAKKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCWNtZC5lbmFibGUgPSBjcHVfdG9fbGUxNihlbmFibGUpOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfRU5BQkxFX1JTTiwgJmNtZCk7CisKKwlsYnNfZGViX2xlYXZlKExCU19ERUJfQ0ZHODAyMTEpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFNldCBXUEEvV1BBIGtleSBtYXRlcmlhbAorICovCisKKy8qIGxpa2UgInN0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCIsIGJ1dCB3aXRoIGNtZF9oZWFkZXIuIE9uY2Ugd2UKKyAqIGdldCByaWQgb2YgV0VYVCwgdGhpcyBzaG91bGQgZ28gaW50byBob3N0LmggKi8KKworc3RydWN0IGNtZF9rZXlfbWF0ZXJpYWwgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJc3RydWN0IE1ydmxJRXR5cGVfa2V5UGFyYW1TZXQgcGFyYW07Cit9IF9fcGFja2VkOworCitzdGF0aWMgaW50IGxic19zZXRfa2V5X21hdGVyaWFsKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKKwkJCQlpbnQga2V5X3R5cGUsCisJCQkJaW50IGtleV9pbmZvLAorCQkJCXU4ICprZXksIHUxNiBrZXlfbGVuKQoreworCXN0cnVjdCBjbWRfa2V5X21hdGVyaWFsIGNtZDsKKwlpbnQgcmV0OworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCS8qCisJICogRXhhbXBsZSBmb3IgV1BBIChUS0lQKToKKwkgKgorCSAqIGNtZCAgICAgICA1ZSAwMAorCSAqIHNpemUgICAgICAzNCAwMAorCSAqIHNlcXVlbmNlICB4eCB4eAorCSAqIHJlc3VsdCAgICAwMCAwMAorCSAqIGFjdGlvbiAgICAwMSAwMAorCSAqIFRMViB0eXBlICAwMCAwMSAgICBrZXkgcGFyYW0KKwkgKiBsZW5ndGggICAgMDAgMjYKKwkgKiBrZXkgdHlwZSAgMDEgMDAgICAgVEtJUAorCSAqIGtleSBpbmZvICAwNiAwMCAgICBVTklDQVNUIHwgRU5BQkxFRAorCSAqIGtleSBsZW4gICAyMCAwMAorCSAqIGtleSAgICAgICAzMiBieXRlcworCSAqLworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7CisJY21kLnBhcmFtLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9LRVlfTUFURVJJQUwpOworCWNtZC5wYXJhbS5sZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoY21kLnBhcmFtKSAtIDQpOworCWNtZC5wYXJhbS5rZXl0eXBlaWQgPSBjcHVfdG9fbGUxNihrZXlfdHlwZSk7CisJY21kLnBhcmFtLmtleWluZm8gPSBjcHVfdG9fbGUxNihrZXlfaW5mbyk7CisJY21kLnBhcmFtLmtleWxlbiA9IGNwdV90b19sZTE2KGtleV9sZW4pOworCWlmIChrZXkgJiYga2V5X2xlbikKKwkJbWVtY3B5KGNtZC5wYXJhbS5rZXksIGtleSwga2V5X2xlbik7CisKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9LRVlfTUFURVJJQUwsICZjbWQpOworCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NGRzgwMjExKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBTZXRzIHRoZSBhdXRoIHR5cGUgKG9wZW4sIHNoYXJlZCwgZXRjKSBpbiB0aGUgZmlybXdhcmUuIFRoYXQKKyAqIHdlIHVzZSBDTURfODAyXzExX0FVVEhFTlRJQ0FURSBpcyBtaXNsZWFkaW5nLCB0aGlzIGZpcm13YXJlCisgKiBjb21tYW5kIGRvZXNuJ3Qgc2VuZCBhbiBhdXRoZW50aWNhdGlvbiBmcmFtZSBhdCBhbGwsIGl0IGp1c3QKKyAqIHN0b3JlcyB0aGUgYXV0aF90eXBlLgorICovCitzdGF0aWMgaW50IGxic19zZXRfYXV0aHR5cGUoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2F1dGhlbnRpY2F0ZSBjbWQ7CisJaW50IHJldDsKKworCWxic19kZWJfZW50ZXJfYXJncyhMQlNfREVCX0NGRzgwMjExLCAiJWQiLCBzbWUtPmF1dGhfdHlwZSk7CisKKwkvKgorCSAqIGNtZCAgICAgICAgMTEgMDAKKwkgKiBzaXplICAgICAgIDE5IDAwCisJICogc2VxdWVuY2UgICB4eCB4eAorCSAqIHJlc3VsdCAgICAgMDAgMDAKKwkgKiBCU1MgaWQgICAgIDAwIDEzIDE5IDgwIGRhIDMwCisJICogYXV0aCB0eXBlICAwMAorCSAqIHJlc2VydmVkICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwlpZiAoc21lLT5ic3NpZCkKKwkJbWVtY3B5KGNtZC5ic3NpZCwgc21lLT5ic3NpZCwgRVRIX0FMRU4pOworCS8qIGNvbnZlcnQgYXV0aF90eXBlICovCisJcmV0ID0gbGJzX2F1dGhfdG9fYXV0aHR5cGUoc21lLT5hdXRoX3R5cGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwljbWQuYXV0aHR5cGUgPSByZXQ7CisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQVVUSEVOVElDQVRFLCAmY21kKTsKKworIGRvbmU6CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhc3NvY2lhdGlvbiByZXF1ZXN0CisgKi8KKyNkZWZpbmUgTEJTX0FTU09DX01BWF9DTURfU0laRSAgICAgICAgICAgICAgICAgICAgIFwKKwkoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZSkgICAgXAorCSAtIDUxMiAvKiBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZS5pZWJ1ZiAqLyBcCisJICsgTEJTX01BWF9TU0lEX1RMVl9TSVpFICAgICAgICAgICAgICAgICAgIFwKKwkgKyBMQlNfTUFYX0NIQU5ORUxfVExWX1NJWkUgICAgICAgICAgICAgICAgXAorCSArIExCU19NQVhfQ0ZfUEFSQU1fVExWX1NJWkUgICAgICAgICAgICAgICBcCisJICsgTEJTX01BWF9BVVRIX1RZUEVfVExWX1NJWkUgICAgICAgICAgICAgIFwKKwkgKyBMQlNfTUFYX1dQQV9UTFZfU0laRSkKKworc3RhdGljIGludCBsYnNfYXNzb2NpYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKKwkJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzLAorCQlzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnNtZSkKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGVfcmVzcG9uc2UgKnJlc3A7CisJc3RydWN0IGNtZF9kc184MDJfMTFfYXNzb2NpYXRlICpjbWQgPSBremFsbG9jKExCU19BU1NPQ19NQVhfQ01EX1NJWkUsCisJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwljb25zdCB1OCAqc3NpZF9laWQ7CisJc2l6ZV90IGxlbiwgcmVzcF9pZV9sZW47CisJaW50IHN0YXR1czsKKwlpbnQgcmV0OworCXU4ICpwb3MgPSAmKGNtZC0+aWVidWZbMF0pOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCWlmICghY21kKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIGNtZCAgICAgICAgICAgICAgNTAgMDAKKwkgKiBsZW5ndGggICAgICAgICAgIDM0IDAwCisJICogc2VxdWVuY2UgICAgICAgICB4eCB4eAorCSAqIHJlc3VsdCAgICAgICAgICAgMDAgMDAKKwkgKiBCU1MgaWQgICAgICAgICAgIDAwIDEzIDE5IDgwIGRhIDMwCisJICogY2FwYWJpbGl0aWVzICAgICAxMSAwMAorCSAqIGxpc3RlbiBpbnRlcnZhbCAgMGEgMDAKKwkgKiBiZWFjb24gaW50ZXJ2YWwgIDAwIDAwCisJICogRFRJTSBwZXJpb2QgICAgICAwMAorCSAqIFRMVnMgICAgICAgICAgICAgeHggICAodXAgdG8gNTEyIGJ5dGVzKQorCSAqLworCWNtZC0+aGRyLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX0FTU09DSUFURSk7CisKKwkvKiBGaWxsIGluIHN0YXRpYyBmaWVsZHMgKi8KKwltZW1jcHkoY21kLT5ic3NpZCwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOworCWNtZC0+bGlzdGVuaW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihNUlZEUlZfREVGQVVMVF9MSVNURU5fSU5URVJWQUwpOworCWNtZC0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGJzcy0+Y2FwYWJpbGl0eSk7CisKKwkvKiBhZGQgU1NJRCBUTFYgKi8KKwlzc2lkX2VpZCA9IGllZWU4MDIxMV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfU1NJRCk7CisJaWYgKHNzaWRfZWlkKQorCQlwb3MgKz0gbGJzX2FkZF9zc2lkX3Rsdihwb3MsIHNzaWRfZWlkICsgMiwgc3NpZF9laWRbMV0pOworCWVsc2UKKwkJbGJzX2RlYl9hc3NvYygibm8gU1NJRFxuIik7CisKKwkvKiBhZGQgRFMgcGFyYW0gVExWICovCisJaWYgKGJzcy0+Y2hhbm5lbCkKKwkJcG9zICs9IGxic19hZGRfY2hhbm5lbF90bHYocG9zLCBic3MtPmNoYW5uZWwtPmh3X3ZhbHVlKTsKKwllbHNlCisJCWxic19kZWJfYXNzb2MoIm5vIGNoYW5uZWxcbiIpOworCisJLyogYWRkIChlbXB0eSkgQ0YgcGFyYW0gVExWICovCisJcG9zICs9IGxic19hZGRfY2ZfcGFyYW1fdGx2KHBvcyk7CisKKwkvKiBhZGQgcmF0ZXMgVExWICovCisJcG9zICs9IGxic19hZGRfY29tbW9uX3JhdGVzX3Rsdihwb3MsIGJzcyk7CisKKwkvKiBhZGQgYXV0aCB0eXBlIFRMViAqLworCWlmIChwcml2LT5md3JlbGVhc2UgPj0gMHgwOTAwMDAwMCkKKwkJcG9zICs9IGxic19hZGRfYXV0aF90eXBlX3Rsdihwb3MsIHNtZS0+YXV0aF90eXBlKTsKKworCS8qIGFkZCBXUEEvV1BBMiBUTFYgKi8KKwlpZiAoc21lLT5pZSAmJiBzbWUtPmllX2xlbikKKwkJcG9zICs9IGxic19hZGRfd3BhX3Rsdihwb3MsIHNtZS0+aWUsIHNtZS0+aWVfbGVuKTsKKworCWxlbiA9IChzaXplb2YoKmNtZCkgLSBzaXplb2YoY21kLT5pZWJ1ZikpICsKKwkJKHUxNikocG9zIC0gKHU4ICopICZjbWQtPmllYnVmKTsKKwljbWQtPmhkci5zaXplID0gY3B1X3RvX2xlMTYobGVuKTsKKworCS8qIHN0b3JlIGZvciBsYXRlciB1c2UgKi8KKwltZW1jcHkocHJpdi0+YXNzb2NfYnNzLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7CisKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9BU1NPQ0lBVEUsIGNtZCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisKKwkvKiBnZW5lcmF0ZSBjb25uZWN0IG1lc3NhZ2UgdG8gY2ZnODAyMTEgKi8KKworCXJlc3AgPSAodm9pZCAqKSBjbWQ7IC8qIHJlY2FzdCBmb3IgZWFzaWVyIGZpZWxkIGFjY2VzcyAqLworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KHJlc3AtPnN0YXR1c2NvZGUpOworCisJLyogQ29udmVydCBzdGF0aXMgY29kZSBvZiBvbGQgZmlybXdhcmUgKi8KKwlpZiAocHJpdi0+ZndyZWxlYXNlIDwgMHgwOTAwMDAwMCkKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWxic19kZWJfYXNzb2MoImludmFsaWQgYXNzb2NpYXRpb24gcGFyYW1ldGVyc1xuIik7CisJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWxic19kZWJfYXNzb2MoInRpbWVyIGV4cGlyZWQgd2hpbGUgd2FpdGluZyBmb3IgQVBcbiIpOworCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWxic19kZWJfYXNzb2MoImFzc29jaWF0aW9uIHJlZnVzZWQgYnkgQVBcbiIpOworCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlsYnNfZGViX2Fzc29jKCJhdXRoZW50aWNhdGlvbiByZWZ1c2VkIGJ5IEFQXG4iKTsKKwkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbGJzX2RlYl9hc3NvYygiYXNzb2NpYXRpb24gZmFpbHVyZSAlZFxuIiwgc3RhdHVzKTsKKwkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CisJfQorCisJbGJzX2RlYl9hc3NvYygic3RhdHVzICVkLCBjYXBhYmlsaXR5IDB4JTA0eFxuIiwgc3RhdHVzLAorCQkgICAgICBsZTE2X3RvX2NwdShyZXNwLT5jYXBhYmlsaXR5KSk7CisKKwlyZXNwX2llX2xlbiA9IGxlMTZfdG9fY3B1KHJlc3AtPmhkci5zaXplKQorCQktIHNpemVvZihyZXNwLT5oZHIpCisJCS0gNjsKKwljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChwcml2LT5kZXYsCisJCQkJcHJpdi0+YXNzb2NfYnNzLAorCQkJCXNtZS0+aWUsIHNtZS0+aWVfbGVuLAorCQkJCXJlc3AtPmllYnVmLCByZXNwX2llX2xlbiwKKwkJCQlzdGF0dXMsCisJCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyogVE9ETzogZ2V0IHJpZCBvZiBwcml2LT5jb25uZWN0X3N0YXR1cyAqLworCQlwcml2LT5jb25uZWN0X3N0YXR1cyA9IExCU19DT05ORUNURUQ7CisJCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+ZGV2KTsKKwkJaWYgKCFwcml2LT50eF9wZW5kaW5nX2xlbikKKwkJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhwcml2LT5kZXYpOworCX0KKworCitkb25lOgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NGRzgwMjExLCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGludCBsYnNfY2ZnX2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKQoreworCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzcyA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJdTggcHJlYW1ibGUgPSBSQURJT19QUkVBTUJMRV9TSE9SVDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwlpZiAoc21lLT5ic3NpZCkgeworCQlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdpcGh5LCBzbWUtPmNoYW5uZWwsIHNtZS0+YnNzaWQsCisJCQlzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4sCisJCQlXTEFOX0NBUEFCSUxJVFlfRVNTLCBXTEFOX0NBUEFCSUxJVFlfRVNTKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBIZXJlIHdlIGhhdmUgYW4gaW1wZWRhbmNlIG1pc21hdGNoLiBUaGUgZmlybXdhcmUgY29tbWFuZAorCQkgKiBDTURfODAyXzExX0FTU09DSUFURSBhbHdheXMgbmVlZHMgYSBCU1NJRCwgaXQgY2Fubm90CisJCSAqIGNvbm5lY3Qgb3RoZXJ3aXNlLiBIb3dldmVyLCBmb3IgdGhlIGNvbm5lY3QtQVBJIG9mCisJCSAqIGNmZzgwMjExIHRoZSBic3NpZCBpcyBwdXJlbHkgb3B0aW9uYWwuIFdlIGRvbid0IGdldCBvbmUsCisJCSAqIGV4Y2VwdCB0aGUgdXNlciBzcGVjaWZpZXMgb25lIG9uIHRoZSAiaXciIGNvbW1hbmQgbGluZS4KKwkJICoKKwkJICogSWYgd2UgZG9uJ3QgZ290IG9uZSwgd2UgY291bGQgaW5pdGlhdGUgYSBzY2FuIGFuZCBsb29rCisJCSAqIGZvciB0aGUgYmVzdCBtYXRjaGluZyBjZmc4MDIxMV9ic3MgZW50cnkuCisJCSAqCisJCSAqIE9yLCBiZXR0ZXIgeWV0LCBuZXQvd2lyZWxlc3Mvc21lLmMgZ2V0J3MgcmV3cml0dGVuIGludG8KKwkJICogc29tZXRoaW5nIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bC4KKwkJICovCisJCWxic19wcl9lcnIoIlRPRE86IG5vIEJTUyBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRU5PVFNVUFA7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCWlmICghYnNzKSB7CisJCWxic19wcl9lcnIoImFzc2ljYXRlOiBic3MgJXBNIG5vdCBpbiBzY2FuIHJlc3VsdHNcbiIsCisJCQkgICBzbWUtPmJzc2lkKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBkb25lOworCX0KKwlsYnNfZGViX2Fzc29jKCJ0cnlpbmcgJXBNIiwgc21lLT5ic3NpZCk7CisJbGJzX2RlYl9hc3NvYygiY2lwaGVyIDB4JXgsIGtleSBpbmRleCAlZCwga2V5IGxlbiAlZFxuIiwKKwkJICAgICAgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwLAorCQkgICAgICBzbWUtPmtleV9pZHgsIHNtZS0+a2V5X2xlbik7CisKKwkvKiBBcyB0aGlzIGlzIGEgbmV3IGNvbm5lY3Rpb24sIGNsZWFyIGxvY2FsbHkgc3RvcmVkIFdFUCBrZXlzICovCisJcHJpdi0+d2VwX3R4X2tleSA9IDA7CisJbWVtc2V0KHByaXYtPndlcF9rZXksIDAsIHNpemVvZihwcml2LT53ZXBfa2V5KSk7CisJbWVtc2V0KHByaXYtPndlcF9rZXlfbGVuLCAwLCBzaXplb2YocHJpdi0+d2VwX2tleV9sZW4pKTsKKworCS8qIHNldC9yZW1vdmUgV0VQIGtleXMgKi8KKwlzd2l0Y2ggKHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CisJCS8qIFN0b3JlIHByb3ZpZGVkIFdFUCBrZXlzIGluIHByaXYtPiAqLworCQlwcml2LT53ZXBfdHhfa2V5ID0gc21lLT5rZXlfaWR4OworCQlwcml2LT53ZXBfa2V5X2xlbltzbWUtPmtleV9pZHhdID0gc21lLT5rZXlfbGVuOworCQltZW1jcHkocHJpdi0+d2VwX2tleVtzbWUtPmtleV9pZHhdLCBzbWUtPmtleSwgc21lLT5rZXlfbGVuKTsKKwkJLyogU2V0IFdFUCBrZXlzIGFuZCBXRVAgbW9kZSAqLworCQlsYnNfc2V0X3dlcF9rZXlzKHByaXYpOworCQlwcml2LT5tYWNfY29udHJvbCB8PSBDTURfQUNUX01BQ19XRVBfRU5BQkxFOworCQlsYnNfc2V0X21hY19jb250cm9sKHByaXYpOworCQkvKiBObyBSU04gbW9kZSBmb3IgV0VQICovCisJCWxic19lbmFibGVfcnNuKHByaXYsIDApOworCQlicmVhazsKKwljYXNlIDA6IC8qIHRoZXJlJ3Mgbm8gV0xBTl9DSVBIRVJfU1VJVEVfTk9ORSBkZWZpbml0aW9uICovCisJCS8qCisJCSAqIElmIHdlIGRvbid0IGhhdmUgbm8gV0VQLCBubyBXUEEgYW5kIG5vIFdQQTIsCisJCSAqIHdlIHJlbW92ZSBhbGwga2V5cyBsaWtlIGluIHRoZSBXUEEvV1BBMiBzZXR1cCwKKwkJICogd2UganVzdCBkb24ndCBzZXQgUlNOLgorCQkgKgorCQkgKiBUaGVyZWZvcmU6IGZhbGwtdGhyb3VnaHQKKwkJICovCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJLyogUmVtb3ZlIFdFUCBrZXlzIGFuZCBXRVAgbW9kZSAqLworCQlsYnNfcmVtb3ZlX3dlcF9rZXlzKHByaXYpOworCQlwcml2LT5tYWNfY29udHJvbCAmPSB+Q01EX0FDVF9NQUNfV0VQX0VOQUJMRTsKKwkJbGJzX3NldF9tYWNfY29udHJvbChwcml2KTsKKworCQkvKiBjbGVhciB0aGUgV1BBL1dQQTIga2V5cyAqLworCQlsYnNfc2V0X2tleV9tYXRlcmlhbChwcml2LAorCQkJS0VZX1RZUEVfSURfV0VQLCAvKiBkb2Vzbid0IG1hdHRlciAqLworCQkJS0VZX0lORk9fV1BBX1VOSUNBU1QsCisJCQlOVUxMLCAwKTsKKwkJbGJzX3NldF9rZXlfbWF0ZXJpYWwocHJpdiwKKwkJCUtFWV9UWVBFX0lEX1dFUCwgLyogZG9lc24ndCBtYXR0ZXIgKi8KKwkJCUtFWV9JTkZPX1dQQV9NQ0FTVCwKKwkJCU5VTEwsIDApOworCQkvKiBSU04gbW9kZSBmb3IgV1BBL1dQQTIgKi8KKwkJbGJzX2VuYWJsZV9yc24ocHJpdiwgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwICE9IDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfZXJyKCJ1bnN1cHBvcnRlZCBjaXBoZXIgZ3JvdXAgMHgleFxuIiwKKwkJCSAgIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCk7CisJCXJldCA9IC1FTk9UU1VQUDsKKwkJZ290byBkb25lOworCX0KKworCWxic19zZXRfYXV0aHR5cGUocHJpdiwgc21lKTsKKwlsYnNfc2V0X3JhZGlvKHByaXYsIHByZWFtYmxlLCAxKTsKKworCS8qIERvIHRoZSBhY3R1YWwgYXNzb2NpYXRpb24gKi8KKwlsYnNfYXNzb2NpYXRlKHByaXYsIGJzcywgc21lKTsKKworIGRvbmU6CisJaWYgKGJzcykKKwkJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NGRzgwMjExLCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxic19jZmdfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUxNiByZWFzb25fY29kZSkKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSBjbWQ7CisKKwlsYnNfZGViX2VudGVyX2FyZ3MoTEJTX0RFQl9DRkc4MDIxMSwgInJlYXNvbl9jb2RlICVkIiwgcmVhc29uX2NvZGUpOworCisJLyogc3RvcmUgZm9yIGxic19jZmdfcmV0X2Rpc2Nvbm5lY3QoKSAqLworCXByaXYtPmRpc2Fzc29jX3JlYXNvbiA9IHJlYXNvbl9jb2RlOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJLyogTWlsZGx5IHVnbHkgdG8gdXNlIGEgbG9jYWxseSBzdG9yZSBteSBvd24gQlNTSUQgLi4uICovCisJbWVtY3B5KGNtZC5tYWNhZGRyLCAmcHJpdi0+YXNzb2NfYnNzLCBFVEhfQUxFTik7CisJY21kLnJlYXNvbmNvZGUgPSBjcHVfdG9fbGUxNihyZWFzb25fY29kZSk7CisKKwlpZiAobGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfREVBVVRIRU5USUNBVEUsICZjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChwcml2LT5kZXYsCisJCQlwcml2LT5kaXNhc3NvY19yZWFzb24sCisJCQlOVUxMLCAwLAorCQkJR0ZQX0tFUk5FTCk7CisJcHJpdi0+Y29ubmVjdF9zdGF0dXMgPSBMQlNfRElTQ09OTkVDVEVEOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBsYnNfY2ZnX3NldF9kZWZhdWx0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgdTgga2V5X2luZGV4KQoreworCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCWlmIChrZXlfaW5kZXggIT0gcHJpdi0+d2VwX3R4X2tleSkgeworCQlsYnNfZGViX2Fzc29jKCJzZXRfZGVmYXVsdF9rZXk6IHRvICVkXG4iLCBrZXlfaW5kZXgpOworCQlwcml2LT53ZXBfdHhfa2V5ID0ga2V5X2luZGV4OworCQlsYnNfc2V0X3dlcF9rZXlzKHByaXYpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbGJzX2NmZ19hZGRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICB1OCBpZHgsIGNvbnN0IHU4ICptYWNfYWRkciwKKwkJCSAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJdTE2IGtleV9pbmZvOworCXUxNiBrZXlfdHlwZTsKKwlpbnQgcmV0ID0gMDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwlsYnNfZGViX2Fzc29jKCJhZGRfa2V5OiBjaXBoZXIgMHgleCwgbWFjX2FkZHIgJXBNXG4iLAorCQkgICAgICBwYXJhbXMtPmNpcGhlciwgbWFjX2FkZHIpOworCWxic19kZWJfYXNzb2MoImFkZF9rZXk6IGtleSBpbmRleCAlZCwga2V5IGxlbiAlZFxuIiwKKwkJICAgICAgaWR4LCBwYXJhbXMtPmtleV9sZW4pOworCWlmIChwYXJhbXMtPmtleV9sZW4pCisJCWxic19kZWJfaGV4KExCU19ERUJfQ0ZHODAyMTEsICJLRVkiLAorCQkJICAgIHBhcmFtcy0+a2V5LCBwYXJhbXMtPmtleV9sZW4pOworCisJbGJzX2RlYl9hc3NvYygiYWRkX2tleTogc2VxIGxlbiAlZFxuIiwgcGFyYW1zLT5zZXFfbGVuKTsKKwlpZiAocGFyYW1zLT5zZXFfbGVuKQorCQlsYnNfZGViX2hleChMQlNfREVCX0NGRzgwMjExLCAiU0VRIiwKKwkJCSAgICBwYXJhbXMtPnNlcSwgcGFyYW1zLT5zZXFfbGVuKTsKKworCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQkvKiBhY3R1YWxseSBjb21wYXJlIGlmIHNvbWV0aGluZyBoYXMgY2hhbmdlZCAuLi4gKi8KKwkJaWYgKChwcml2LT53ZXBfa2V5X2xlbltpZHhdICE9IHBhcmFtcy0+a2V5X2xlbikgfHwKKwkJCW1lbWNtcChwcml2LT53ZXBfa2V5W2lkeF0sCisJCQkgICAgICAgcGFyYW1zLT5rZXksIHBhcmFtcy0+a2V5X2xlbikgIT0gMCkgeworCQkJcHJpdi0+d2VwX2tleV9sZW5baWR4XSA9IHBhcmFtcy0+a2V5X2xlbjsKKwkJCW1lbWNweShwcml2LT53ZXBfa2V5W2lkeF0sCisJCQkgICAgICAgcGFyYW1zLT5rZXksIHBhcmFtcy0+a2V5X2xlbik7CisJCQlsYnNfc2V0X3dlcF9rZXlzKHByaXYpOworCQl9CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCWtleV9pbmZvID0gS0VZX0lORk9fV1BBX0VOQUJMRUQgfCAoKGlkeCA9PSAwKQorCQkJCQkJICAgPyBLRVlfSU5GT19XUEFfVU5JQ0FTVAorCQkJCQkJICAgOiBLRVlfSU5GT19XUEFfTUNBU1QpOworCQlrZXlfdHlwZSA9IChwYXJhbXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKQorCQkJPyBLRVlfVFlQRV9JRF9US0lQCisJCQk6IEtFWV9UWVBFX0lEX0FFUzsKKwkJbGJzX3NldF9rZXlfbWF0ZXJpYWwocHJpdiwKKwkJCQkgICAgIGtleV90eXBlLAorCQkJCSAgICAga2V5X2luZm8sCisJCQkJICAgICBwYXJhbXMtPmtleSwgcGFyYW1zLT5rZXlfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2VycigidW5oYW5kbGVkIGNpcGhlciAweCV4XG4iLCBwYXJhbXMtPmNpcGhlcik7CisJCXJldCA9IC1FTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGxic19jZmdfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgdTgga2V5X2luZGV4LCBjb25zdCB1OCAqbWFjX2FkZHIpCit7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJbGJzX2RlYl9hc3NvYygiZGVsX2tleToga2V5X2lkeCAlZCwgbWFjX2FkZHIgJXBNXG4iLAorCQkgICAgICBrZXlfaW5kZXgsIG1hY19hZGRyKTsKKworI2lmZGVmIFRPRE8KKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwkvKgorCSAqIEkgdGhpbmsgY2FuIGtlZXAgdGhpcyBhIE5PLU9QLCBiZWNhdXNlOgorCisJICogLSB3ZSBjbGVhciBhbGwga2V5cyB3aGVuZXZlciB3ZSBkbyBsYnNfY2ZnX2Nvbm5lY3QoKSBhbnl3YXkKKwkgKiAtIG5laXRoZXIgIml3IiBub3IgIndwYV9zdXBwbGljYW50IiB3b24ndCBjYWxsIHRoaXMgZHVyaW5nCisJICogICBhbiBvbmdvaW5nIGNvbm5lY3Rpb24KKwkgKiAtIFRPRE86IGJ1dCBJIGhhdmUgdG8gY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB0cnVlIHdoZW4KKwkgKiAgIEkgc2V0IHRoZSBBUCB0byBwZXJpb2RpYyByZS1rZXlpbmcKKwkgKiAtIHdlJ3ZlIG5vdCBremFsbGVjKCkgc29tZXRoaW5nIHdoZW4gd2UndmUgYWRkZWQgYSBrZXkgYXQKKwkgKiAgIGxic19jZmdfY29ubmVjdCgpIG9yIGxic19jZmdfYWRkX2tleSgpLgorCSAqCisJICogVGhpcyBjYXVzZXMgbGJzX2NmZ19kZWxfa2V5KCkgb25seSBjYWxsZWQgYXQgZGlzY29ubmVjdCB0aW1lLAorCSAqIHdoZXJlIHdlJ2QganVzdCB3YXN0ZSB0aW1lIGRlbGV0aW5nIGEga2V5IHRoYXQgaXMgbm90IGdvaW5nCisJICogdG8gYmUgdXNlZCBhbnl3YXkuCisJICovCisJaWYgKGtleV9pbmRleCA8IDMgJiYgcHJpdi0+d2VwX2tleV9sZW5ba2V5X2luZGV4XSkgeworCQlwcml2LT53ZXBfa2V5X2xlbltrZXlfaW5kZXhdID0gMDsKKwkJbGJzX3NldF93ZXBfa2V5cyhwcml2KTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldCBzdGF0aW9uCisgKi8KKworc3RhdGljIGludCBsYnNfY2ZnX2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzOCBzaWduYWwsIG5vaXNlOworCWludCByZXQ7CisJc2l6ZV90IGk7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fVFhfQllURVMgfAorCQkJIFNUQVRJT05fSU5GT19UWF9QQUNLRVRTIHwKKwkJCSBTVEFUSU9OX0lORk9fUlhfQllURVMgfAorCQkJIFNUQVRJT05fSU5GT19SWF9QQUNLRVRTOworCXNpbmZvLT50eF9ieXRlcyA9IHByaXYtPmRldi0+c3RhdHMudHhfYnl0ZXM7CisJc2luZm8tPnR4X3BhY2tldHMgPSBwcml2LT5kZXYtPnN0YXRzLnR4X3BhY2tldHM7CisJc2luZm8tPnJ4X2J5dGVzID0gcHJpdi0+ZGV2LT5zdGF0cy5yeF9ieXRlczsKKwlzaW5mby0+cnhfcGFja2V0cyA9IHByaXYtPmRldi0+c3RhdHMucnhfcGFja2V0czsKKworCS8qIEdldCBjdXJyZW50IFJTU0kgKi8KKwlyZXQgPSBsYnNfZ2V0X3Jzc2kocHJpdiwgJnNpZ25hbCwgJm5vaXNlKTsKKwlpZiAocmV0ID09IDApIHsKKwkJc2luZm8tPnNpZ25hbCA9IHNpZ25hbDsKKwkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fU0lHTkFMOworCX0KKworCS8qIENvbnZlcnQgcHJpdi0+Y3VyX3JhdGUgZnJvbSBod192YWx1ZSB0byBOTDgwMjExIHZhbHVlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGJzX3JhdGVzKTsgaSsrKSB7CisJCWlmIChwcml2LT5jdXJfcmF0ZSA9PSBsYnNfcmF0ZXNbaV0uaHdfdmFsdWUpIHsKKwkJCXNpbmZvLT50eHJhdGUubGVnYWN5ID0gbGJzX3JhdGVzW2ldLmJpdHJhdGU7CisJCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CSVRSQVRFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIlNpdGUgc3VydmV5IiwgaGVyZSBqdXN0IGN1cnJlbnQgY2hhbm5lbCBhbmQgbm9pc2UgbGV2ZWwKKyAqLworCitzdGF0aWMgaW50IGxic19nZXRfc3VydmV5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJaW50IGlkeCwgc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpCit7CisJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJczggc2lnbmFsLCBub2lzZTsKKwlpbnQgcmV0OworCisJaWYgKGlkeCAhPSAwKQorCQlyZXQgPSAtRU5PRU5UOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCXN1cnZleS0+Y2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwKKwkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KHByaXYtPmNoYW5uZWwpKTsKKworCXJldCA9IGxic19nZXRfcnNzaShwcml2LCAmc2lnbmFsLCAmbm9pc2UpOworCWlmIChyZXQgPT0gMCkgeworCQlzdXJ2ZXktPmZpbGxlZCA9IFNVUlZFWV9JTkZPX05PSVNFX0RCTTsKKwkJc3VydmV5LT5ub2lzZSA9IG5vaXNlOworCX0KKworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NGRzgwMjExLCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGFuZ2UgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIGludCBsYnNfY2hhbmdlX2ludGYoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCisJICAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCQlyZXQgPSBsYnNfc2V0X21vbml0b3JfbW9kZShwcml2LCAxKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlpZiAocHJpdi0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCisJCQlyZXQgPSBsYnNfc2V0X21vbml0b3JfbW9kZShwcml2LCAwKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBsYnNfc2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9CU1NfVFlQRSwgMSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWlmIChwcml2LT53ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKKwkJCXJldCA9IGxic19zZXRfbW9uaXRvcl9tb2RlKHByaXYsIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGxic19zZXRfc25tcF9taWIocHJpdiwgU05NUF9NSUJfT0lEX0JTU19UWVBFLCAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1RTVVBQOworCX0KKworCWlmICghcmV0KQorCQlwcml2LT53ZGV2LT5pZnR5cGUgPSB0eXBlOworCisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJQlNTIChBZC1Ib2MpCisgKi8KKworLyogVGhlIGZpcm13YXJlIG5lZWRzIHRoZSBmb2xsb3dpbmcgYml0cyBtYXNrZWQgb3V0IG9mIHRoZSBiZWFjb24tZGVyaXZlZAorICogY2FwYWJpbGl0eSBmaWVsZCB3aGVuIGFzc29jaWF0aW5nL2pvaW5pbmcgdG8gYSBCU1M6CisgKiAgOSAoUW9TKSwgMTEgKEFQU0QpLCAxMiAodW51c2VkKSwgMTQgKHVudXNlZCksIDE1ICh1bnVzZWQpCisgKi8KKyNkZWZpbmUgQ0FQSU5GT19NQVNLICh+KDB4ZGEwMCkpCisKKworc3RhdGljIHZvaWQgbGJzX2pvaW5fcG9zdChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCisJCQkgIHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyAqcGFyYW1zLAorCQkJICB1OCAqYnNzaWQsIHUxNiBjYXBhYmlsaXR5KQoreworCXU4IGZha2VfaWVbMiArIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyAvKiBzc2lkICovCisJCSAgIDIgKyA0ICsgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgcmF0ZXMgKi8KKwkJICAgMiArIDEgKyAgICAgICAgICAgICAgICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgKi8KKwkJICAgMiArIDIgKyAgICAgICAgICAgICAgICAgICAgICAvKiBhdGltICovCisJCSAgIDIgKyA4XTsgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgcmF0ZXMgKi8KKwl1OCAqZmFrZSA9IGZha2VfaWU7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJLyoKKwkgKiBGb3IgY2ZnODAyMTFfaW5mb3JtX2Jzcywgd2UnbGwgbmVlZCBhIGZha2UgSUUsIGFzIHdlIGNhbid0IGdldAorCSAqIHRoZSByZWFsIElFIGZyb20gdGhlIGZpcm13YXJlLiBTbyB3ZSBmYWJyaWNhdGUgYSBmYWtlIElFIGJhc2VkIG9uCisJICogd2hhdCB0aGUgZmlybXdhcmUgYWN0dWFsbHkgc2VuZHMgKHNuaWZmZWQgd2l0aCB3aXJlc2hhcmspLgorCSAqLworCS8qIEZha2UgU1NJRCBJRSAqLworCSpmYWtlKysgPSBXTEFOX0VJRF9TU0lEOworCSpmYWtlKysgPSBwYXJhbXMtPnNzaWRfbGVuOworCW1lbWNweShmYWtlLCBwYXJhbXMtPnNzaWQsIHBhcmFtcy0+c3NpZF9sZW4pOworCWZha2UgKz0gcGFyYW1zLT5zc2lkX2xlbjsKKwkvKiBGYWtlIHN1cHBvcnRlZCBiYXNpYyByYXRlcyBJRSAqLworCSpmYWtlKysgPSBXTEFOX0VJRF9TVVBQX1JBVEVTOworCSpmYWtlKysgPSA0OworCSpmYWtlKysgPSAweDgyOworCSpmYWtlKysgPSAweDg0OworCSpmYWtlKysgPSAweDhiOworCSpmYWtlKysgPSAweDk2OworCS8qIEZha2UgRFMgY2hhbm5lbCBJRSAqLworCSpmYWtlKysgPSBXTEFOX0VJRF9EU19QQVJBTVM7CisJKmZha2UrKyA9IDE7CisJKmZha2UrKyA9IHBhcmFtcy0+Y2hhbm5lbC0+aHdfdmFsdWU7CisJLyogRmFrZSBJQlNTIHBhcmFtcyBJRSAqLworCSpmYWtlKysgPSBXTEFOX0VJRF9JQlNTX1BBUkFNUzsKKwkqZmFrZSsrID0gMjsKKwkqZmFrZSsrID0gMDsgLyogQVRJTT0wICovCisJKmZha2UrKyA9IDA7CisJLyogRmFrZSBleHRlbmRlZCByYXRlcyBJRSwgVE9ETzogZG9uJ3QgYWRkIHRoaXMgZm9yIDgwMi4xMWIgb25seSwKKwkgKiBidXQgSSBkb24ndCBrbm93IGhvdyB0aGlzIGNvdWxkIGJlIGNoZWNrZWQgKi8KKwkqZmFrZSsrID0gV0xBTl9FSURfRVhUX1NVUFBfUkFURVM7CisJKmZha2UrKyA9IDg7CisJKmZha2UrKyA9IDB4MGM7CisJKmZha2UrKyA9IDB4MTI7CisJKmZha2UrKyA9IDB4MTg7CisJKmZha2UrKyA9IDB4MjQ7CisJKmZha2UrKyA9IDB4MzA7CisJKmZha2UrKyA9IDB4NDg7CisJKmZha2UrKyA9IDB4NjA7CisJKmZha2UrKyA9IDB4NmM7CisJbGJzX2RlYl9oZXgoTEJTX0RFQl9DRkc4MDIxMSwgIklFIiwgZmFrZV9pZSwgZmFrZSAtIGZha2VfaWUpOworCisJY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LT53aXBoeSwKKwkJCSAgICBwYXJhbXMtPmNoYW5uZWwsCisJCQkgICAgYnNzaWQsCisJCQkgICAgMCwKKwkJCSAgICBjYXBhYmlsaXR5LAorCQkJICAgIHBhcmFtcy0+YmVhY29uX2ludGVydmFsLAorCQkJICAgIGZha2VfaWUsIGZha2UgLSBmYWtlX2llLAorCQkJICAgIDAsIEdGUF9LRVJORUwpOworCisJbWVtY3B5KHByaXYtPndkZXYtPnNzaWQsIHBhcmFtcy0+c3NpZCwgcGFyYW1zLT5zc2lkX2xlbik7CisJcHJpdi0+d2Rldi0+c3NpZF9sZW4gPSBwYXJhbXMtPnNzaWRfbGVuOworCisJY2ZnODAyMTFfaWJzc19qb2luZWQocHJpdi0+ZGV2LCBic3NpZCwgR0ZQX0tFUk5FTCk7CisKKwkvKiBUT0RPOiBjb25zaWRlciBkb2luZyB0aGlzIGF0IE1BQ1JFR19JTlRfQ09ERV9MSU5LX1NFTlNFRCB0aW1lICovCisJcHJpdi0+Y29ubmVjdF9zdGF0dXMgPSBMQlNfQ09OTkVDVEVEOworCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+ZGV2KTsKKwlpZiAoIXByaXYtPnR4X3BlbmRpbmdfbGVuKQorCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPmRldik7CisKKwlsYnNfZGViX2xlYXZlKExCU19ERUJfQ0ZHODAyMTEpOworfQorCitzdGF0aWMgaW50IGxic19pYnNzX2pvaW5fZXhpc3Rpbmcoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorCXN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyAqcGFyYW1zLAorCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzcykKK3sKKwljb25zdCB1OCAqcmF0ZXNfZWlkID0gaWVlZTgwMjExX2Jzc19nZXRfaWUoYnNzLCBXTEFOX0VJRF9TVVBQX1JBVEVTKTsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfam9pbiBjbWQ7CisJdTggcHJlYW1ibGUgPSBSQURJT19QUkVBTUJMRV9TSE9SVDsKKwlpbnQgcmV0ID0gMDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwkvKiBUT0RPOiBzZXQgcHJlYW1ibGUgYmFzZWQgb24gc2NhbiByZXN1bHQgKi8KKwlyZXQgPSBsYnNfc2V0X3JhZGlvKHByaXYsIHByZWFtYmxlLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogRXhhbXBsZSBDTURfODAyXzExX0FEX0hPQ19KT0lOIGNvbW1hbmQ6CisJICoKKwkgKiBjb21tYW5kICAgICAgICAgMmMgMDAgICAgICAgICBDTURfODAyXzExX0FEX0hPQ19KT0lOCisJICogc2l6ZSAgICAgICAgICAgIDY1IDAwCisJICogc2VxdWVuY2UgICAgICAgIHh4IHh4CisJICogcmVzdWx0ICAgICAgICAgIDAwIDAwCisJICogYnNzaWQgICAgICAgICAgIDAyIDI3IDI3IDk3IDJmIDk2CisJICogc3NpZCAgICAgICAgICAgIDQ5IDQyIDUzIDUzIDAwIDAwIDAwIDAwCisJICogICAgICAgICAgICAgICAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisJICogICAgICAgICAgICAgICAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisJICogICAgICAgICAgICAgICAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisJICogdHlwZSAgICAgICAgICAgIDAyICAgICAgICAgICAgQ01EX0JTU19UWVBFX0lCU1MKKwkgKiBiZWFjb24gcGVyaW9kICAgNjQgMDAKKwkgKiBkdGltIHBlcmlvZCAgICAgMDAKKwkgKiB0aW1lc3RhbXAgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiBsb2NhbHRpbWUgICAgICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKKwkgKiBJRSBEUyAgICAgICAgICAgMDMKKwkgKiBJRSBEUyBsZW4gICAgICAgMDEKKwkgKiBJRSBEUyBjaGFubmVsICAgMDEKKwkgKiByZXNlcnZlZWQgICAgICAgMDAgMDAgMDAgMDAKKwkgKiBJRSBJQlNTICAgICAgICAgMDYKKwkgKiBJRSBJQlNTIGxlbiAgICAgMDIKKwkgKiBJRSBJQlNTIGF0aW0gICAgMDAgMDAKKwkgKiByZXNlcnZlZCAgICAgICAgMDAgMDAgMDAgMDAKKwkgKiBjYXBhYmlsaXR5ICAgICAgMDIgMDAKKwkgKiByYXRlcyAgICAgICAgICAgODIgODQgOGIgOTYgMGMgMTIgMTggMjQgMzAgNDggNjAgNmMgMDAKKwkgKiBmYWlsIHRpbWVvdXQgICAgZmYgMDAKKwkgKiBwcm9iZSBkZWxheSAgICAgMDAgMDAKKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKworCW1lbWNweShjbWQuYnNzLmJzc2lkLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGNtZC5ic3Muc3NpZCwgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuKTsKKwljbWQuYnNzLnR5cGUgPSBDTURfQlNTX1RZUEVfSUJTUzsKKwljbWQuYnNzLmJlYWNvbnBlcmlvZCA9IGNwdV90b19sZTE2KHBhcmFtcy0+YmVhY29uX2ludGVydmFsKTsKKwljbWQuYnNzLmRzLmhlYWRlci5pZCA9IFdMQU5fRUlEX0RTX1BBUkFNUzsKKwljbWQuYnNzLmRzLmhlYWRlci5sZW4gPSAxOworCWNtZC5ic3MuZHMuY2hhbm5lbCA9IHBhcmFtcy0+Y2hhbm5lbC0+aHdfdmFsdWU7CisJY21kLmJzcy5pYnNzLmhlYWRlci5pZCA9IFdMQU5fRUlEX0lCU1NfUEFSQU1TOworCWNtZC5ic3MuaWJzcy5oZWFkZXIubGVuID0gMjsKKwljbWQuYnNzLmlic3MuYXRpbXdpbmRvdyA9IDA7CisJY21kLmJzcy5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoYnNzLT5jYXBhYmlsaXR5ICYgQ0FQSU5GT19NQVNLKTsKKworCS8qIHNldCByYXRlcyB0byB0aGUgaW50ZXJzZWN0aW9uIG9mIG91ciByYXRlcyBhbmQgdGhlIHJhdGVzIGluIHRoZQorCSAgIGJzcyAqLworCWlmICghcmF0ZXNfZWlkKSB7CisJCWxic19hZGRfcmF0ZXMoY21kLmJzcy5yYXRlcyk7CisJfSBlbHNlIHsKKwkJaW50IGh3LCBpOworCQl1OCByYXRlc19tYXggPSByYXRlc19laWRbMV07CisJCXU4ICpyYXRlcyA9IGNtZC5ic3MucmF0ZXM7CisJCWZvciAoaHcgPSAwOyBodyA8IEFSUkFZX1NJWkUobGJzX3JhdGVzKTsgaHcrKykgeworCQkJdTggaHdfcmF0ZSA9IGxic19yYXRlc1tod10uYml0cmF0ZSAvIDU7CisJCQlmb3IgKGkgPSAwOyBpIDwgcmF0ZXNfbWF4OyBpKyspIHsKKwkJCQlpZiAoaHdfcmF0ZSA9PSAocmF0ZXNfZWlkW2krMl0gJiAweDdmKSkgeworCQkJCQl1OCByYXRlID0gcmF0ZXNfZWlkW2krMl07CisJCQkJCWlmIChyYXRlID09IDB4MDIgfHwgcmF0ZSA9PSAweDA0IHx8CisJCQkJCSAgICByYXRlID09IDB4MGIgfHwgcmF0ZSA9PSAweDE2KQorCQkJCQkJcmF0ZSB8PSAweDgwOworCQkJCQkqcmF0ZXMrKyA9IHJhdGU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogT25seSB2OCBhbmQgYmVsb3cgc3VwcG9ydCBzZXR0aW5nIHRoaXMgKi8KKwlpZiAoTVJWTF9GV19NQUpPUl9SRVYocHJpdi0+ZndyZWxlYXNlKSA8PSA4KSB7CisJCWNtZC5mYWlsdGltZW91dCA9IGNwdV90b19sZTE2KE1SVkRSVl9BU1NPQ0lBVElPTl9USU1FX09VVCk7CisJCWNtZC5wcm9iZWRlbGF5ID0gY3B1X3RvX2xlMTYoQ01EX1NDQU5fUFJPQkVfREVMQVlfVElNRSk7CisJfQorCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX0FEX0hPQ19KT0lOLCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogVGhpcyBpcyBhIHNhbXBsZSByZXNwb25zZSB0byBDTURfODAyXzExX0FEX0hPQ19KT0lOOgorCSAqCisJICogcmVzcG9uc2UgICAgICAgIDJjIDgwCisJICogc2l6ZSAgICAgICAgICAgIDA5IDAwCisJICogc2VxdWVuY2UgICAgICAgIHh4IHh4CisJICogcmVzdWx0ICAgICAgICAgIDAwIDAwCisJICogcmVzZXJ2ZWQgICAgICAgIDAwCisJICovCisJbGJzX2pvaW5fcG9zdChwcml2LCBwYXJhbXMsIGJzcy0+YnNzaWQsIGJzcy0+Y2FwYWJpbGl0eSk7CisKKyBvdXQ6CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgaW50IGxic19pYnNzX3N0YXJ0X25ldyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCisJc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX3N0YXJ0IGNtZDsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0ICpyZXNwID0KKwkJKHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgKikgJmNtZDsKKwl1OCBwcmVhbWJsZSA9IFJBRElPX1BSRUFNQkxFX1NIT1JUOworCWludCByZXQgPSAwOworCXUxNiBjYXBhYmlsaXR5OworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCXJldCA9IGxic19zZXRfcmFkaW8ocHJpdiwgcHJlYW1ibGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBFeGFtcGxlIENNRF84MDJfMTFfQURfSE9DX1NUQVJUIGNvbW1hbmQ6CisJICoKKwkgKiBjb21tYW5kICAgICAgICAgMmIgMDAgICAgICAgICBDTURfODAyXzExX0FEX0hPQ19TVEFSVAorCSAqIHNpemUgICAgICAgICAgICBiMSAwMAorCSAqIHNlcXVlbmNlICAgICAgICB4eCB4eAorCSAqIHJlc3VsdCAgICAgICAgICAwMCAwMAorCSAqIHNzaWQgICAgICAgICAgICA1NCA0NSA1MyA1NCAwMCAwMCAwMCAwMAorCSAqICAgICAgICAgICAgICAgICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorCSAqICAgICAgICAgICAgICAgICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorCSAqICAgICAgICAgICAgICAgICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorCSAqIGJzcyB0eXBlICAgICAgICAwMgorCSAqIGJlYWNvbiBwZXJpb2QgICA2NCAwMAorCSAqIGR0aW0gcGVyaW9kICAgICAwMAorCSAqIElFIElCU1MgICAgICAgICAwNgorCSAqIElFIElCU1MgbGVuICAgICAwMgorCSAqIElFIElCU1MgYXRpbSAgICAwMCAwMAorCSAqIHJlc2VydmVkICAgICAgICAwMCAwMCAwMCAwMAorCSAqIElFIERTICAgICAgICAgICAwMworCSAqIElFIERTIGxlbiAgICAgICAwMQorCSAqIElFIERTIGNoYW5uZWwgICAwMQorCSAqIHJlc2VydmVkICAgICAgICAwMCAwMCAwMCAwMAorCSAqIHByb2JlIGRlbGF5ICAgICAwMCAwMAorCSAqIGNhcGFiaWxpdHkgICAgICAwMiAwMAorCSAqIHJhdGVzICAgICAgICAgICA4MiA4NCA4YiA5NiAgIChiYXNpYyByYXRlcyB3aXRoIGhhdmUgYml0IDcgc2V0KQorCSAqICAgICAgICAgICAgICAgICAwYyAxMiAxOCAyNCAzMCA0OCA2MCA2YworCSAqIHBhZGRpbmcgICAgICAgICAxMDAgYnl0ZXMKKwkgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwltZW1jcHkoY21kLnNzaWQsIHBhcmFtcy0+c3NpZCwgcGFyYW1zLT5zc2lkX2xlbik7CisJY21kLmJzc3R5cGUgPSBDTURfQlNTX1RZUEVfSUJTUzsKKwljbWQuYmVhY29ucGVyaW9kID0gY3B1X3RvX2xlMTYocGFyYW1zLT5iZWFjb25faW50ZXJ2YWwpOworCWNtZC5pYnNzLmhlYWRlci5pZCA9IFdMQU5fRUlEX0lCU1NfUEFSQU1TOworCWNtZC5pYnNzLmhlYWRlci5sZW4gPSAyOworCWNtZC5pYnNzLmF0aW13aW5kb3cgPSAwOworCWNtZC5kcy5oZWFkZXIuaWQgPSBXTEFOX0VJRF9EU19QQVJBTVM7CisJY21kLmRzLmhlYWRlci5sZW4gPSAxOworCWNtZC5kcy5jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsLT5od192YWx1ZTsKKwkvKiBPbmx5IHY4IGFuZCBiZWxvdyBzdXBwb3J0IHNldHRpbmcgcHJvYmUgZGVsYXkgKi8KKwlpZiAoTVJWTF9GV19NQUpPUl9SRVYocHJpdi0+ZndyZWxlYXNlKSA8PSA4KQorCQljbWQucHJvYmVkZWxheSA9IGNwdV90b19sZTE2KENNRF9TQ0FOX1BST0JFX0RFTEFZX1RJTUUpOworCS8qIFRPRE86IG1peCBpbiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSAqLworCWNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKwljbWQuY2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGNhcGFiaWxpdHkpOworCWxic19hZGRfcmF0ZXMoY21kLnJhdGVzKTsKKworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQURfSE9DX1NUQVJULCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogVGhpcyBpcyBhIHNhbXBsZSByZXNwb25zZSB0byBDTURfODAyXzExX0FEX0hPQ19KT0lOOgorCSAqCisJICogcmVzcG9uc2UgICAgICAgIDJiIDgwCisJICogc2l6ZSAgICAgICAgICAgIDE0IDAwCisJICogc2VxdWVuY2UgICAgICAgIHh4IHh4CisJICogcmVzdWx0ICAgICAgICAgIDAwIDAwCisJICogcmVzZXJ2ZWQgICAgICAgIDAwCisJICogYnNzaWQgICAgICAgICAgIDAyIDJiIDdiIDBmIDg2IDBlCisJICovCisJbGJzX2pvaW5fcG9zdChwcml2LCBwYXJhbXMsIHJlc3AtPmJzc2lkLCBjYXBhYmlsaXR5KTsKKworIG91dDoKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DRkc4MDIxMSwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGxic19qb2luX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOworCURFQ0xBUkVfU1NJRF9CVUYoc3NpZF9idWYpOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKKworCWlmICghcGFyYW1zLT5jaGFubmVsKSB7CisJCXJldCA9IC1FTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbGJzX3NldF9jaGFubmVsKHByaXYsIHBhcmFtcy0+Y2hhbm5lbC0+aHdfdmFsdWUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogU2VhcmNoIGlmIHNvbWVvbmUgaXMgYmVhY29uaW5nLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUKKwkgKiBic3MgbGlzdCBpcyBwb3B1bGF0ZWQgYWxyZWFkeSAqLworCWJzcyA9IGNmZzgwMjExX2dldF9ic3Mod2lwaHksIHBhcmFtcy0+Y2hhbm5lbCwgcGFyYW1zLT5ic3NpZCwKKwkJcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuLAorCQlXTEFOX0NBUEFCSUxJVFlfSUJTUywgV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCisJaWYgKGJzcykgeworCQlyZXQgPSBsYnNfaWJzc19qb2luX2V4aXN0aW5nKHByaXYsIHBhcmFtcywgYnNzKTsKKwkJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCX0gZWxzZQorCQlyZXQgPSBsYnNfaWJzc19zdGFydF9uZXcocHJpdiwgcGFyYW1zKTsKKworCisgb3V0OgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NGRzgwMjExLCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbGJzX2xlYXZlX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RvcCBjbWQ7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQURfSE9DX1NUT1AsICZjbWQpOworCisJLyogVE9ETzogY29uc2lkZXIgZG9pbmcgdGhpcyBhdCBNQUNSRUdfSU5UX0NPREVfQURIT0NfQkNOX0xPU1QgdGltZSAqLworCWxic19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOworCisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemF0aW9uCisgKi8KKwogc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgbGJzX2NmZzgwMjExX29wcyA9IHsKIAkuc2V0X2NoYW5uZWwgPSBsYnNfY2ZnX3NldF9jaGFubmVsLAorCS5zY2FuID0gbGJzX2NmZ19zY2FuLAorCS5jb25uZWN0ID0gbGJzX2NmZ19jb25uZWN0LAorCS5kaXNjb25uZWN0ID0gbGJzX2NmZ19kaXNjb25uZWN0LAorCS5hZGRfa2V5ID0gbGJzX2NmZ19hZGRfa2V5LAorCS5kZWxfa2V5ID0gbGJzX2NmZ19kZWxfa2V5LAorCS5zZXRfZGVmYXVsdF9rZXkgPSBsYnNfY2ZnX3NldF9kZWZhdWx0X2tleSwKKwkuZ2V0X3N0YXRpb24gPSBsYnNfY2ZnX2dldF9zdGF0aW9uLAorCS5kdW1wX3N1cnZleSA9IGxic19nZXRfc3VydmV5LAorCS5jaGFuZ2VfdmlydHVhbF9pbnRmID0gbGJzX2NoYW5nZV9pbnRmLAorCS5qb2luX2lic3MgPSBsYnNfam9pbl9pYnNzLAorCS5sZWF2ZV9pYnNzID0gbGJzX2xlYXZlX2lic3MsCiB9OwogCiAKQEAgLTE0Miw2ICsxOTAwLDM2IEBACiB9CiAKIAorc3RhdGljIHZvaWQgbGJzX2NmZ19zZXRfcmVndWxhdG9yeV9oaW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgcmVnaW9uX2NvZGVfbWFwcGluZyB7CisJCWNvbnN0IGNoYXIgKmNuOworCQlpbnQgY29kZTsKKwl9OworCisJLyogU2VjdGlvbiA1LjE3LjIgKi8KKwlzdGF0aWMgc3RydWN0IHJlZ2lvbl9jb2RlX21hcHBpbmcgcmVnbWFwW10gPSB7CisJCXsiVVMgIiwgMHgxMH0sIC8qIFVTIEZDQyAqLworCQl7IkNBICIsIDB4MjB9LCAvKiBDYW5hZGEgKi8KKwkJeyJFVSAiLCAweDMwfSwgLyogRVRTSSAgICovCisJCXsiRVMgIiwgMHgzMX0sIC8qIFNwYWluICAqLworCQl7IkZSICIsIDB4MzJ9LCAvKiBGcmFuY2UgKi8KKwkJeyJKUCAiLCAweDQwfSwgLyogSmFwYW4gICovCisJfTsKKwlzaXplX3QgaTsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdtYXApOyBpKyspCisJCWlmIChyZWdtYXBbaV0uY29kZSA9PSBwcml2LT5yZWdpb25jb2RlKSB7CisJCQlyZWd1bGF0b3J5X2hpbnQocHJpdi0+d2Rldi0+d2lwaHksIHJlZ21hcFtpXS5jbik7CisJCQlicmVhazsKKwkJfQorCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NGRzgwMjExKTsKK30KKworCiAvKgogICogVGhpcyBmdW5jdGlvbiBnZXQncyBjYWxsZWQgYWZ0ZXIgbGJzX3NldHVwX2Zpcm13YXJlKCkgZGV0ZXJtaW5lZCB0aGUKICAqIGZpcm13YXJlIGNhcGFiaXRpZXMuIFNvIHdlIGNhbiBzZXR1cCB0aGUgd2lwaHkgYWNjb3JkaW5nIHRvIG91cgpAQCAtMTU3LDEwICsxOTQ1LDEyIEBACiAJd2Rldi0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gMTsKIAl3ZGV2LT53aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07CiAKLQkvKiBUT0RPOiBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOyAqLwotCXdkZXYtPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7CisJd2Rldi0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJCQlCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAorCQkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKKwlpZiAobGJzX3J0YXBfc3VwcG9ydGVkKHByaXYpKQorCQl3ZGV2LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9NT05JVE9SKTsKIAotCS8qIFRPRE86IGhvbm9yIHByaXYtPnJlZ2lvbmNvZGUgKi8KIAl3ZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmbGJzX2JhbmRfMmdoejsKIAogCS8qCkBAIC0xNjksNiArMTk1OSw3IEBACiAJICovCiAJd2Rldi0+d2lwaHktPmNpcGhlcl9zdWl0ZXMgPSBjaXBoZXJfc3VpdGVzOwogCXdkZXYtPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMgPSBBUlJBWV9TSVpFKGNpcGhlcl9zdWl0ZXMpOworCXdkZXYtPndpcGh5LT5yZWdfbm90aWZpZXIgPSBsYnNfcmVnX25vdGlmaWVyOwogCiAJcmV0ID0gd2lwaHlfcmVnaXN0ZXIod2Rldi0+d2lwaHkpOwogCWlmIChyZXQgPCAwKQpAQCAtMTgwLDEwICsxOTcxLDM2IEBACiAJaWYgKHJldCkKIAkJbGJzX3ByX2VycigiY2Fubm90IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAorCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5zY2FuX3dvcmssIGxic19zY2FuX3dvcmtlcik7CisKKwlsYnNfY2ZnX3NldF9yZWd1bGF0b3J5X2hpbnQocHJpdik7CisKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DRkc4MDIxMSwgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGxic19yZWdfbm90aWZpZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlpbnQgcmV0OworCisJbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfQ0ZHODAyMTEsICJjZmc4MDIxMSByZWd1bGF0b3J5IGRvbWFpbiAiCisJCQkiY2FsbGJhY2sgZm9yIGRvbWFpbiAlYyVjXG4iLCByZXF1ZXN0LT5hbHBoYTJbMF0sCisJCQlyZXF1ZXN0LT5hbHBoYTJbMV0pOworCisJcmV0ID0gbGJzX3NldF8xMWRfZG9tYWluX2luZm8ocHJpdiwgcmVxdWVzdCwgd2lwaHktPmJhbmRzKTsKKworCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DRkc4MDIxMSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBsYnNfc2Nhbl9kZWluaXQoc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5zY2FuX3dvcmspOworfQorCiAKIHZvaWQgbGJzX2NmZ19mcmVlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmgKaW5kZXggZTA5YTE5My4uNGY0NmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmgKQEAgLTEsMTYgKzEsMjEgQEAKICNpZm5kZWYgX19MQlNfQ0ZHODAyMTFfSF9fCiAjZGVmaW5lIF9fTEJTX0NGRzgwMjExX0hfXwogCi0jaW5jbHVkZSAiZGV2LmgiCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGxic19wcml2YXRlOworc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdDsKK3N0cnVjdCB3aXBoeTsKIAogc3RydWN0IHdpcmVsZXNzX2RldiAqbGJzX2NmZ19hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwogaW50IGxic19jZmdfcmVnaXN0ZXIoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIHZvaWQgbGJzX2NmZ19mcmVlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7CiAKLWludCBsYnNfc2VuZF9zcGVjaWZpY19zc2lkX3NjYW4oc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCAqc3NpZCwKLQl1OCBzc2lkX2xlbik7Ci1pbnQgbGJzX3NjYW5fbmV0d29ya3Moc3RydWN0IGxic19wcml2YXRlICpwcml2LCBpbnQgZnVsbF9zY2FuKTsKLXZvaWQgbGJzX2NmZ19zY2FuX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworaW50IGxic19yZWdfbm90aWZpZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCk7CiAKK3ZvaWQgbGJzX3NlbmRfZGlzY29ubmVjdF9ub3RpZmljYXRpb24oc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKK3ZvaWQgbGJzX3NlbmRfbWljX2ZhaWx1cmVldmVudChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUzMiBldmVudCk7CisKK3ZvaWQgbGJzX3NjYW5fZGVpbml0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwppbmRleCBjZGI5Yjk2Li43MDc0NTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwpAQCAtNiwxOCArNiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAKLSNpbmNsdWRlICJob3N0LmgiCiAjaW5jbHVkZSAiZGVjbC5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJkZXYuaCIKLSNpbmNsdWRlICJhc3NvYy5oIgotI2luY2x1ZGUgIndleHQuaCIKLSNpbmNsdWRlICJzY2FuLmgiCisjaW5jbHVkZSAiY2ZnLmgiCiAjaW5jbHVkZSAiY21kLmgiCiAKLQotc3RhdGljIHN0cnVjdCBjbWRfY3RybF9ub2RlICpsYnNfZ2V0X2NtZF9jdHJsX25vZGUoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKKyNkZWZpbmUgQ0FMX05GKG5mKQkJKChzMzIpKC0oczMyKShuZikpKQorI2RlZmluZSBDQUxfUlNTSShzbnIsIG5mKQkoKHMzMikoKHMzMikoc25yKSArIENBTF9ORihuZikpKQogCiAvKioKICAqICBAYnJpZWYgU2ltcGxlIGNhbGxiYWNrIHRoYXQgY29waWVzIHJlc3BvbnNlIGJhY2sgaW50byBjb21tYW5kCkBAIC03MCw2ICs2Niw4IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENNRF84MDJfMTFfUlNTSToKIAkJcmV0dXJuIDE7CisJY2FzZSBDTURfODAyXzExX0hPU1RfU0xFRVBfQ0ZHOgorCQlyZXR1cm4gMTsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC03NywzMCArNzUsNiBAQAogfQogCiAvKioKLSAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNvbW1hbmQgaXMgYWxsb3dlZC4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHJldHVybiAgICAgICAgICAgICBhbGxvd2VkIG9yIG5vdCBhbGxvd2VkLgotICovCi0KLXN0YXRpYyBpbnQgbGJzX2lzX2NtZF9hbGxvd2VkKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JaWYgKCFwcml2LT5pc19hdXRvX2RlZXBfc2xlZXBfZW5hYmxlZCkgewotCQlpZiAocHJpdi0+aXNfZGVlcF9zbGVlcCkgewotCQkJbGJzX2RlYl9jbWQoImNvbW1hbmQgbm90IGFsbG93ZWQgaW4gZGVlcCBzbGVlcFxuIik7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JfQotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NNRCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCiAgKiAgQGJyaWVmIFVwZGF0ZXMgdGhlIGhhcmR3YXJlIGRldGFpbHMgbGlrZSBNQUMgYWRkcmVzcyBhbmQgcmVndWxhdG9yeSByZWdpb24KICAqCiAgKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCkBAIC0xNzUsMTYgKzE0OSwyOCBAQAogCWlmIChwcml2LT5tZXNoX2RldikKIAkJbWVtY3B5KHByaXYtPm1lc2hfZGV2LT5kZXZfYWRkciwgcHJpdi0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CiAKLQlpZiAobGJzX3NldF9yZWdpb250YWJsZShwcml2LCBwcml2LT5yZWdpb25jb2RlLCAwKSkgewotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCiBvdXQ6CiAJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NNRCk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBsYnNfcmV0X2hvc3Rfc2xlZXBfY2ZnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBkdW1teSwKKwkJCXN0cnVjdCBjbWRfaGVhZGVyICpyZXNwKQoreworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOworCWlmIChwcml2LT5pc19ob3N0X3NsZWVwX2FjdGl2YXRlZCkgeworCQlwcml2LT5pc19ob3N0X3NsZWVwX2NvbmZpZ3VyZWQgPSAwOworCQlpZiAocHJpdi0+cHNzdGF0ZSA9PSBQU19TVEFURV9GVUxMX1BPV0VSKSB7CisJCQlwcml2LT5pc19ob3N0X3NsZWVwX2FjdGl2YXRlZCA9IDA7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmhvc3Rfc2xlZXBfcSk7CisJCX0KKwl9IGVsc2UgeworCQlwcml2LT5pc19ob3N0X3NsZWVwX2NvbmZpZ3VyZWQgPSAxOworCX0KKwlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IGxic19ob3N0X3NsZWVwX2NmZyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQzMl90IGNyaXRlcmlhLAogCQlzdHJ1Y3Qgd29sX2NvbmZpZyAqcF93b2xfY29uZmlnKQogewpAQCAtMjAyLDEyICsxODgsMTEgQEAKIAllbHNlCiAJCWNtZF9jb25maWcud29sX2NvbmYuYWN0aW9uID0gQ01EX0FDVF9BQ1RJT05fTk9ORTsKIAotCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX0hPU1RfU0xFRVBfQ0ZHLCAmY21kX2NvbmZpZyk7CisJcmV0ID0gX19sYnNfY21kKHByaXYsIENNRF84MDJfMTFfSE9TVF9TTEVFUF9DRkcsICZjbWRfY29uZmlnLmhkciwKKwkJCWxlMTZfdG9fY3B1KGNtZF9jb25maWcuaGRyLnNpemUpLAorCQkJbGJzX3JldF9ob3N0X3NsZWVwX2NmZywgMCk7CiAJaWYgKCFyZXQpIHsKLQkJaWYgKGNyaXRlcmlhKSB7Ci0JCQlsYnNfZGViX2NtZCgiU2V0IFdPTCBjcml0ZXJpYSB0byAleFxuIiwgY3JpdGVyaWEpOwotCQkJcHJpdi0+d29sX2NyaXRlcmlhID0gY3JpdGVyaWE7Ci0JCX0gZWxzZQorCQlpZiAocF93b2xfY29uZmlnKQogCQkJbWVtY3B5KCh1aW50OF90ICopIHBfd29sX2NvbmZpZywKIAkJCQkJKHVpbnQ4X3QgKikmY21kX2NvbmZpZy53b2xfY29uZiwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB3b2xfY29uZmlnKSk7CkBAIC0yMTksNDIgKzIwNCw0OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobGJzX2hvc3Rfc2xlZXBfY2ZnKTsKIAotc3RhdGljIGludCBsYnNfY21kXzgwMl8xMV9wc19tb2RlKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCSAgIHUxNiBjbWRfYWN0aW9uKQorLyoqCisgKiAgQGJyaWVmIFNldHMgdGhlIFBvd2VyIFNhdmUgbW9kZQorICoKKyAqICBAcGFyYW0gcHJpdiAgICAJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gY21kX2FjdGlvbglUaGUgUG93ZXIgU2F2ZSBvcGVyYXRpb24gKFBTX01PREVfQUNUSU9OX0VOVEVSX1BTIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBQU19NT0RFX0FDVElPTl9FWElUX1BTKQorICogIEBwYXJhbSBibG9jawlXaGV0aGVyIHRvIGJsb2NrIG9uIGEgcmVzcG9uc2Ugb3Igbm90CisgKgorICogIEByZXR1cm4gCSAgIAkwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGxic19zZXRfcHNfbW9kZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUxNiBjbWRfYWN0aW9uLCBib29sIGJsb2NrKQogewotCXN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUgKnBzbSA9ICZjbWQtPnBhcmFtcy5wc21vZGU7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcHNfbW9kZSBjbWQ7CisJaW50IHJldCA9IDA7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKIAotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfUFNfTU9ERSk7Ci0JY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUpICsKLQkJCQlzaXplb2Yoc3RydWN0IGNtZF9oZWFkZXIpKTsKLQlwc20tPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwotCXBzbS0+bXVsdGlwbGVkdGltID0gMDsKLQlzd2l0Y2ggKGNtZF9hY3Rpb24pIHsKLQljYXNlIENNRF9TVUJDTURfRU5URVJfUFM6Ci0JCWxic19kZWJfY21kKCJQUyBjb21tYW5kOiIgIlN1YkNvZGUtIEVudGVyIFBTXG4iKTsKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CiAKLQkJcHNtLT5sb2NhbGxpc3RlbmludGVydmFsID0gMDsKLQkJcHNtLT5udWxscGt0aW50ZXJ2YWwgPSAwOwotCQlwc20tPm11bHRpcGxlZHRpbSA9Ci0JCSAgICBjcHVfdG9fbGUxNihNUlZEUlZfREVGQVVMVF9NVUxUSVBMRV9EVElNKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TVUJDTURfRVhJVF9QUzoKLQkJbGJzX2RlYl9jbWQoIlBTIGNvbW1hbmQ6IiAiU3ViQ29kZS0gRXhpdCBQU1xuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfU1VCQ01EX1NMRUVQX0NPTkZJUk1FRDoKLQkJbGJzX2RlYl9jbWQoIlBTIGNvbW1hbmQ6IFN1YkNvZGUtIHNsZWVwIGNvbmZpcm1cbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCWlmIChjbWRfYWN0aW9uID09IFBTX01PREVfQUNUSU9OX0VOVEVSX1BTKSB7CisJCWxic19kZWJfY21kKCJQU19NT0RFOiBhY3Rpb24gRU5URVJfUFNcbiIpOworCQljbWQubXVsdGlwbGVkdGltID0gY3B1X3RvX2xlMTYoMSk7ICAvKiBEZWZhdWx0IERUSU0gbXVsdGlwbGUgKi8KKwl9IGVsc2UgaWYgKGNtZF9hY3Rpb24gPT0gUFNfTU9ERV9BQ1RJT05fRVhJVF9QUykgeworCQlsYnNfZGViX2NtZCgiUFNfTU9ERTogYWN0aW9uIEVYSVRfUFNcbiIpOworCX0gZWxzZSB7CisJCS8qIFdlIGRvbid0IGhhbmRsZSBDT05GSVJNX1NMRUVQIGhlcmUgYmVjYXVzZSBpdCBuZWVkcyB0bworCQkgKiBiZSBmYXN0cGF0aGVkIHRvIHRoZSBmaXJtd2FyZS4KKwkJICovCisJCWxic19kZWJfY21kKCJQU19NT0RFOiB1bmtub3duIGFjdGlvbiAweCVYXG4iLCBjbWRfYWN0aW9uKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OwogCX0KIAotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOworCWlmIChibG9jaykKKwkJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfUFNfTU9ERSwgJmNtZCk7CisJZWxzZQorCQlsYnNfY21kX2FzeW5jKHByaXYsIENNRF84MDJfMTFfUFNfTU9ERSwgJmNtZC5oZHIsIHNpemVvZiAoY21kKSk7CisKK291dDoKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DTUQsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBsYnNfY21kXzgwMl8xMV9zbGVlcF9wYXJhbXMoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1aW50MTZfdCBjbWRfYWN0aW9uLApAQCAtMzUzLDYgKzM0NSw2NSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgbGJzX3JldF9ob3N0X3NsZWVwX2FjdGl2YXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKKwkJdW5zaWduZWQgbG9uZyBkdW1teSwKKwkJc3RydWN0IGNtZF9oZWFkZXIgKmNtZCkKK3sKKwlsYnNfZGViX2VudGVyKExCU19ERUJfRlcpOworCXByaXYtPmlzX2hvc3Rfc2xlZXBfYWN0aXZhdGVkID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmhvc3Rfc2xlZXBfcSk7CisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0ZXKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxic19zZXRfaG9zdF9zbGVlcChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGludCBob3N0X3NsZWVwKQoreworCXN0cnVjdCBjbWRfaGVhZGVyIGNtZDsKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCBjcml0ZXJpYSA9IEVIU19SRU1PVkVfV0FLRVVQOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CisKKwlpZiAoaG9zdF9zbGVlcCkgeworCQlpZiAocHJpdi0+aXNfaG9zdF9zbGVlcF9hY3RpdmF0ZWQgIT0gMSkgeworCQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJCXJldCA9IGxic19ob3N0X3NsZWVwX2NmZyhwcml2LCBwcml2LT53b2xfY3JpdGVyaWEsCisJCQkJCShzdHJ1Y3Qgd29sX2NvbmZpZyAqKU5VTEwpOworCQkJaWYgKHJldCkgeworCQkJCWxic19wcl9pbmZvKCJIb3N0IHNsZWVwIGNvbmZpZ3VyYXRpb24gZmFpbGVkOiAiCisJCQkJCQkiJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChwcml2LT5wc3N0YXRlID09IFBTX1NUQVRFX0ZVTExfUE9XRVIpIHsKKwkJCQlyZXQgPSBfX2xic19jbWQocHJpdiwKKwkJCQkJCUNNRF84MDJfMTFfSE9TVF9TTEVFUF9BQ1RJVkFURSwKKwkJCQkJCSZjbWQsCisJCQkJCQlzaXplb2YoY21kKSwKKwkJCQkJCWxic19yZXRfaG9zdF9zbGVlcF9hY3RpdmF0ZSwgMCk7CisJCQkJaWYgKHJldCkKKwkJCQkJbGJzX3ByX2luZm8oIkhPU1RfU0xFRVBfQUNUSVZBVEUgIgorCQkJCQkJCSJmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJfQorCisJCQlpZiAoIXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCQkJcHJpdi0+aG9zdF9zbGVlcF9xLAorCQkJCQkJcHJpdi0+aXNfaG9zdF9zbGVlcF9hY3RpdmF0ZWQsCisJCQkJCQkoMTAgKiBIWikpKSB7CisJCQkJbGJzX3ByX2VycigiaG9zdF9zbGVlcF9xOiB0aW1lciBleHBpcmVkXG4iKTsKKwkJCQlyZXQgPSAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxic19wcl9lcnIoImhvc3Qgc2xlZXA6IGFscmVhZHkgZW5hYmxlZFxuIik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocHJpdi0+aXNfaG9zdF9zbGVlcF9hY3RpdmF0ZWQpCisJCQlyZXQgPSBsYnNfaG9zdF9zbGVlcF9jZmcocHJpdiwgY3JpdGVyaWEsCisJCQkJCShzdHJ1Y3Qgd29sX2NvbmZpZyAqKU5VTEwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogIEBicmllZiBTZXQgYW4gU05NUCBNSUIgdmFsdWUKICAqCkBAIC01MDksMjMgKzU2MCwzNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbGJzX2NtZF84MDJfMTFfbW9uaXRvcl9tb2RlKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCSAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCisvKioKKyAqICBAYnJpZWYgRW5hYmxlIG9yIGRpc2FibGUgbW9uaXRvciBtb2RlIChvbmx5IGltcGxlbWVudGVkIG9uIE9MUEMgdXNiODM4OCBGVykKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgIEEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGVuYWJsZSAgICAgIDEgdG8gZW5hYmxlIG1vbml0b3IgbW9kZSwgMCB0byBkaXNhYmxlCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGxic19zZXRfbW9uaXRvcl9tb2RlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IGVuYWJsZSkKIHsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9tb25pdG9yX21vZGUgKm1vbml0b3IgPSAmY21kLT5wYXJhbXMubW9uaXRvcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9tb25pdG9yX21vZGUgY21kOworCWludCByZXQ7CiAKLQljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX01PTklUT1JfTU9ERSk7Ci0JY21kLT5zaXplID0KLQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX21vbml0b3JfbW9kZSkgKwotCQkJICAgICBzaXplb2Yoc3RydWN0IGNtZF9oZWFkZXIpKTsKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCWlmIChlbmFibGUpCisJCWNtZC5tb2RlID0gY3B1X3RvX2xlMTYoMHgxKTsKIAotCW1vbml0b3ItPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwotCWlmIChjbWRfYWN0aW9uID09IENNRF9BQ1RfU0VUKSB7Ci0JCW1vbml0b3ItPm1vZGUgPQotCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgKCoodTMyICopIHBkYXRhX2J1ZikpOworCWxic19kZWJfY21kKCJTRVRfTU9OSVRPUl9NT0RFOiAlZFxuIiwgZW5hYmxlKTsKKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX01PTklUT1JfTU9ERSwgJmNtZCk7CisJaWYgKHJldCA9PSAwKSB7CisJCXByaXYtPmRldi0+dHlwZSA9IGVuYWJsZSA/IEFSUEhSRF9JRUVFODAyMTFfUkFESU9UQVAgOgorCQkJCQkJQVJQSFJEX0VUSEVSOwogCX0KIAotCXJldHVybiAwOworCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtNjEwLDc4ICs2NzMsMjQyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsYnNfY21kX3JlZ19hY2Nlc3Moc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWRwdHIsCi0JCQkgICAgICAgdTggY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQorLyoqCisgKiAgQGJyaWVmIEdldCBjdXJyZW50IFJTU0kgYW5kIG5vaXNlIGZsb29yCisgKgorICogIEBwYXJhbSBwcml2CQlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSByc3NpCQlPbiBzdWNjZXNzZnVsIHJldHVybiwgc2lnbmFsIGxldmVsIGluIG1CbQorICoKKyAqICBAcmV0dXJuIAkgICAJVGhlIGNoYW5uZWwgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgbGJzX2dldF9yc3NpKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgczggKnJzc2ksIHM4ICpuZikKIHsKLQlzdHJ1Y3QgbGJzX29mZnNldF92YWx1ZSAqb2ZmdmFsOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2kgY21kOworCWludCByZXQgPSAwOwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CiAKLQlvZmZ2YWwgPSAoc3RydWN0IGxic19vZmZzZXRfdmFsdWUgKilwZGF0YV9idWY7CisJQlVHX09OKHJzc2kgPT0gTlVMTCk7CisJQlVHX09OKG5mID09IE5VTEwpOwogCi0Jc3dpdGNoIChsZTE2X3RvX2NwdShjbWRwdHItPmNvbW1hbmQpKSB7Ci0JY2FzZSBDTURfTUFDX1JFR19BQ0NFU1M6Ci0JCXsKLQkJCXN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgKm1hY3JlZzsKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwkvKiBBdmVyYWdlIFNOUiBvdmVyIGxhc3QgOCBiZWFjb25zICovCisJY21kLm5fb3Jfc25yID0gY3B1X3RvX2xlMTYoOCk7CiAKLQkJCWNtZHB0ci0+c2l6ZSA9Ci0JCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mIChzdHJ1Y3QgY21kX2RzX21hY19yZWdfYWNjZXNzKQotCQkJCQkrIHNpemVvZihzdHJ1Y3QgY21kX2hlYWRlcikpOwotCQkJbWFjcmVnID0KLQkJCSAgICAoc3RydWN0IGNtZF9kc19tYWNfcmVnX2FjY2VzcyAqKSZjbWRwdHItPnBhcmFtcy4KLQkJCSAgICBtYWNyZWc7Ci0KLQkJCW1hY3JlZy0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7Ci0JCQltYWNyZWctPm9mZnNldCA9IGNwdV90b19sZTE2KCh1MTYpIG9mZnZhbC0+b2Zmc2V0KTsKLQkJCW1hY3JlZy0+dmFsdWUgPSBjcHVfdG9fbGUzMihvZmZ2YWwtPnZhbHVlKTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgQ01EX0JCUF9SRUdfQUNDRVNTOgotCQl7Ci0JCQlzdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzICpiYnByZWc7Ci0KLQkJCWNtZHB0ci0+c2l6ZSA9Ci0JCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mCi0JCQkJCSAgICAgKHN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MpCi0JCQkJCSAgICAgKyBzaXplb2Yoc3RydWN0IGNtZF9oZWFkZXIpKTsKLQkJCWJicHJlZyA9Ci0JCQkgICAgKHN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgKikmY21kcHRyLT5wYXJhbXMuCi0JCQkgICAgYmJwcmVnOwotCi0JCQliYnByZWctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwotCQkJYmJwcmVnLT5vZmZzZXQgPSBjcHVfdG9fbGUxNigodTE2KSBvZmZ2YWwtPm9mZnNldCk7Ci0JCQliYnByZWctPnZhbHVlID0gKHU4KSBvZmZ2YWwtPnZhbHVlOwotCi0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBDTURfUkZfUkVHX0FDQ0VTUzoKLQkJewotCQkJc3RydWN0IGNtZF9kc19yZl9yZWdfYWNjZXNzICpyZnJlZzsKLQotCQkJY21kcHRyLT5zaXplID0KLQkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YKLQkJCQkJICAgICAoc3RydWN0IGNtZF9kc19yZl9yZWdfYWNjZXNzKSArCi0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0JCQlyZnJlZyA9Ci0JCQkgICAgKHN0cnVjdCBjbWRfZHNfcmZfcmVnX2FjY2VzcyAqKSZjbWRwdHItPnBhcmFtcy4KLQkJCSAgICByZnJlZzsKLQotCQkJcmZyZWctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwotCQkJcmZyZWctPm9mZnNldCA9IGNwdV90b19sZTE2KCh1MTYpIG9mZnZhbC0+b2Zmc2V0KTsKLQkJCXJmcmVnLT52YWx1ZSA9ICh1OCkgb2ZmdmFsLT52YWx1ZTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1JTU0ksICZjbWQpOworCWlmIChyZXQgPT0gMCkgeworCQkqbmYgPSBDQUxfTkYobGUxNl90b19jcHUoY21kLm5mKSk7CisJCSpyc3NpID0gQ0FMX1JTU0kobGUxNl90b19jcHUoY21kLm5fb3Jfc25yKSwgbGUxNl90b19jcHUoY21kLm5mKSk7CiAJfQogCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NNRCk7Ci0JcmV0dXJuIDA7CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgU2VuZCByZWd1bGF0b3J5IGFuZCA4MDIuMTFkIGRvbWFpbiBpbmZvcm1hdGlvbiB0byB0aGUgZmlybXdhcmUKKyAqCisgKiAgQHBhcmFtIHByaXYJCXBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlCisgKiAgQHBhcmFtIHJlcXVlc3QJY2ZnODAyMTEgcmVndWxhdG9yeSByZXF1ZXN0IHN0cnVjdHVyZQorICogIEBwYXJhbSBiYW5kcwl0aGUgZGV2aWNlJ3Mgc3VwcG9ydGVkIGJhbmRzIGFuZCBjaGFubmVscworICoKKyAqICBAcmV0dXJuCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZmFpbHVyZQorKi8KK2ludCBsYnNfc2V0XzExZF9kb21haW5faW5mbyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCisJCQkgICAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICoqYmFuZHMpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFkX2RvbWFpbl9pbmZvIGNtZDsKKwlzdHJ1Y3QgbXJ2bF9pZV9kb21haW5fcGFyYW1fc2V0ICpkb21haW4gPSAmY21kLmRvbWFpbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvdW50cnlfaWVfdHJpcGxldCAqdDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaDsKKwl1OCBudW1fdHJpcGxldCA9IDA7CisJdTggbnVtX3BhcnNlZF9jaGFuID0gMDsKKwl1OCBmaXJzdF9jaGFubmVsID0gMCwgbmV4dF9jaGFuID0gMCwgbWF4X3B3ciA9IDA7CisJdTggaSwgZmxhZyA9IDA7CisJc2l6ZV90IHRyaXBsZXRfc2l6ZTsKKwlpbnQgcmV0OworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCXzExRCk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7CisKKwlsYnNfZGViXzExZCgiU2V0dGluZyBjb3VudHJ5IGNvZGUgJyVjJWMnXG4iLAorCQkgICAgcmVxdWVzdC0+YWxwaGEyWzBdLCByZXF1ZXN0LT5hbHBoYTJbMV0pOworCisJZG9tYWluLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0RPTUFJTik7CisKKwkvKiBTZXQgY291bnRyeSBjb2RlICovCisJZG9tYWluLT5jb3VudHJ5X2NvZGVbMF0gPSByZXF1ZXN0LT5hbHBoYTJbMF07CisJZG9tYWluLT5jb3VudHJ5X2NvZGVbMV0gPSByZXF1ZXN0LT5hbHBoYTJbMV07CisJZG9tYWluLT5jb3VudHJ5X2NvZGVbMl0gPSAnICc7CisKKwkvKiBOb3cgc2V0IHVwIHRoZSBjaGFubmVsIHRyaXBsZXRzOyBmaXJtd2FyZSBpcyBzb21ld2hhdCBwaWNreSBoZXJlCisJICogYW5kIGRvZXNuJ3QgdmFsaWRhdGUgY2hhbm5lbCBudW1iZXJzIGFuZCBzcGFuczsgaGVuY2UgaXQgd291bGQKKwkgKiBpbnRlcnByZXQgYSB0cmlwbGV0IG9mICgzNiwgNCwgMjApIGFzIGNoYW5uZWxzIDM2LCAzNywgMzgsIDM5LiAgU2luY2UKKwkgKiB0aGUgbGFzdCAzIGFyZW4ndCB2YWxpZCBjaGFubmVscywgdGhlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IKKwkgKiBzcGxpdHRpbmcgdGhhdCB1cCBpbnRvIDQgdHJpcGxldCBwYWlycyBvZiAoMzYsIDEsIDIwKSArICg0MCwgMSwgMjApCisJICogZXRjLgorCSAqLworCWZvciAoYmFuZCA9IDA7CisJICAgICAoYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFMpICYmIChudW1fdHJpcGxldCA8IE1BWF8xMURfVFJJUExFVFMpOworCSAgICAgYmFuZCsrKSB7CisKKwkJaWYgKCFiYW5kc1tiYW5kXSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7CisJCSAgICAgKGkgPCBiYW5kc1tiYW5kXS0+bl9jaGFubmVscykgJiYgKG51bV90cmlwbGV0IDwgTUFYXzExRF9UUklQTEVUUyk7CisJCSAgICAgaSsrKSB7CisJCQljaCA9ICZiYW5kc1tiYW5kXS0+Y2hhbm5lbHNbaV07CisJCQlpZiAoY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpCisJCQkJY29udGludWU7CisKKwkJCWlmICghZmxhZykgeworCQkJCWZsYWcgPSAxOworCQkJCW5leHRfY2hhbiA9IGZpcnN0X2NoYW5uZWwgPSAodTMyKSBjaC0+aHdfdmFsdWU7CisJCQkJbWF4X3B3ciA9IGNoLT5tYXhfcG93ZXI7CisJCQkJbnVtX3BhcnNlZF9jaGFuID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKChjaC0+aHdfdmFsdWUgPT0gbmV4dF9jaGFuICsgMSkgJiYKKwkJCQkJKGNoLT5tYXhfcG93ZXIgPT0gbWF4X3B3cikpIHsKKwkJCQkvKiBDb25zb2xpZGF0ZSBhZGphY2VudCBjaGFubmVscyAqLworCQkJCW5leHRfY2hhbisrOworCQkJCW51bV9wYXJzZWRfY2hhbisrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBZGQgdGhpcyB0cmlwbGV0ICovCisJCQkJbGJzX2RlYl8xMWQoIjExRCB0cmlwbGV0ICglZCwgJWQsICVkKVxuIiwKKwkJCQkJZmlyc3RfY2hhbm5lbCwgbnVtX3BhcnNlZF9jaGFuLAorCQkJCQltYXhfcHdyKTsKKwkJCQl0ID0gJmRvbWFpbi0+dHJpcGxldFtudW1fdHJpcGxldF07CisJCQkJdC0+Y2hhbnMuZmlyc3RfY2hhbm5lbCA9IGZpcnN0X2NoYW5uZWw7CisJCQkJdC0+Y2hhbnMubnVtX2NoYW5uZWxzID0gbnVtX3BhcnNlZF9jaGFuOworCQkJCXQtPmNoYW5zLm1heF9wb3dlciA9IG1heF9wd3I7CisJCQkJbnVtX3RyaXBsZXQrKzsKKwkJCQlmbGFnID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChmbGFnKSB7CisJCQkvKiBBZGQgbGFzdCB0cmlwbGV0ICovCisJCQlsYnNfZGViXzExZCgiMTFEIHRyaXBsZXQgKCVkLCAlZCwgJWQpXG4iLCBmaXJzdF9jaGFubmVsLAorCQkJCW51bV9wYXJzZWRfY2hhbiwgbWF4X3B3cik7CisJCQl0ID0gJmRvbWFpbi0+dHJpcGxldFtudW1fdHJpcGxldF07CisJCQl0LT5jaGFucy5maXJzdF9jaGFubmVsID0gZmlyc3RfY2hhbm5lbDsKKwkJCXQtPmNoYW5zLm51bV9jaGFubmVscyA9IG51bV9wYXJzZWRfY2hhbjsKKwkJCXQtPmNoYW5zLm1heF9wb3dlciA9IG1heF9wd3I7CisJCQludW1fdHJpcGxldCsrOworCQl9CisJfQorCisJbGJzX2RlYl8xMWQoIiMgdHJpcGxldHMgJWRcbiIsIG51bV90cmlwbGV0KTsKKworCS8qIFNldCBjb21tYW5kIGhlYWRlciBzaXplcyAqLworCXRyaXBsZXRfc2l6ZSA9IG51bV90cmlwbGV0ICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY291bnRyeV9pZV90cmlwbGV0KTsKKwlkb21haW4tPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoZG9tYWluLT5jb3VudHJ5X2NvZGUpICsKKwkJCQkJdHJpcGxldF9zaXplKTsKKworCWxic19kZWJfaGV4KExCU19ERUJfMTFELCAiODAyLjExRCBkb21haW4gcGFyYW0gc2V0IiwKKwkJCSh1OCAqKSAmY21kLmRvbWFpbi5jb3VudHJ5X2NvZGUsCisJCQlsZTE2X3RvX2NwdShkb21haW4tPmhlYWRlci5sZW4pKTsKKworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQuaGRyKSArCisJCQkJICAgc2l6ZW9mKGNtZC5hY3Rpb24pICsKKwkJCQkgICBzaXplb2YoY21kLmRvbWFpbi5oZWFkZXIpICsKKwkJCQkgICBzaXplb2YoY21kLmRvbWFpbi5jb3VudHJ5X2NvZGUpICsKKwkJCQkgICB0cmlwbGV0X3NpemUpOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFEX0RPTUFJTl9JTkZPLCAmY21kKTsKKworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCXzExRCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFJlYWQgYSBNQUMsIEJhc2ViYW5kLCBvciBSRiByZWdpc3RlcgorICoKKyAqICBAcGFyYW0gcHJpdgkJcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUKKyAqICBAcGFyYW0gY21kCQlyZWdpc3RlciBjb21tYW5kLCBvbmUgb2YgQ01EX01BQ19SRUdfQUNDRVNTLAorICogICAgICAgICAgICAgICAgICAgICAgICBDTURfQkJQX1JFR19BQ0NFU1MsIG9yIENNRF9SRl9SRUdfQUNDRVNTCisgKiAgQHBhcmFtIG9mZnNldCAgICAgICBieXRlIG9mZnNldCBvZiB0aGUgcmVnaXN0ZXIgdG8gZ2V0CisgKiAgQHBhcmFtIHZhbHVlICAgICAgICBvbiBzdWNjZXNzLCB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGF0ICdvZmZzZXQnCisgKgorICogIEByZXR1cm4JCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisqLworaW50IGxic19nZXRfcmVnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTE2IHJlZywgdTE2IG9mZnNldCwgdTMyICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgY21kX2RzX3JlZ19hY2Nlc3MgY21kOworCWludCByZXQgPSAwOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CisKKwlCVUdfT04odmFsdWUgPT0gTlVMTCk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9HRVQpOworCisJaWYgKHJlZyAhPSBDTURfTUFDX1JFR19BQ0NFU1MgJiYKKwkgICAgcmVnICE9IENNRF9CQlBfUkVHX0FDQ0VTUyAmJgorCSAgICByZWcgIT0gQ01EX1JGX1JFR19BQ0NFU1MpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIHJlZywgJmNtZCk7CisJaWYgKHJldCkgeworCQlpZiAocmVnID09IENNRF9CQlBfUkVHX0FDQ0VTUyB8fCByZWcgPT0gQ01EX1JGX1JFR19BQ0NFU1MpCisJCQkqdmFsdWUgPSBjbWQudmFsdWUuYmJwX3JmOworCQllbHNlIGlmIChyZWcgPT0gQ01EX01BQ19SRUdfQUNDRVNTKQorCQkJKnZhbHVlID0gbGUzMl90b19jcHUoY21kLnZhbHVlLm1hYyk7CisJfQorCitvdXQ6CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgV3JpdGUgYSBNQUMsIEJhc2ViYW5kLCBvciBSRiByZWdpc3RlcgorICoKKyAqICBAcGFyYW0gcHJpdgkJcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUKKyAqICBAcGFyYW0gY21kCQlyZWdpc3RlciBjb21tYW5kLCBvbmUgb2YgQ01EX01BQ19SRUdfQUNDRVNTLAorICogICAgICAgICAgICAgICAgICAgICAgICBDTURfQkJQX1JFR19BQ0NFU1MsIG9yIENNRF9SRl9SRUdfQUNDRVNTCisgKiAgQHBhcmFtIG9mZnNldCAgICAgICBieXRlIG9mZnNldCBvZiB0aGUgcmVnaXN0ZXIgdG8gc2V0CisgKiAgQHBhcmFtIHZhbHVlICAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIGF0ICdvZmZzZXQnCisgKgorICogIEByZXR1cm4JCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisqLworaW50IGxic19zZXRfcmVnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTE2IHJlZywgdTE2IG9mZnNldCwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBjbWRfZHNfcmVnX2FjY2VzcyBjbWQ7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7CisKKwlpZiAocmVnID09IENNRF9CQlBfUkVHX0FDQ0VTUyB8fCByZWcgPT0gQ01EX1JGX1JFR19BQ0NFU1MpCisJCWNtZC52YWx1ZS5iYnBfcmYgPSAodTgpICh2YWx1ZSAmIDB4RkYpOworCWVsc2UgaWYgKHJlZyA9PSBDTURfTUFDX1JFR19BQ0NFU1MpCisJCWNtZC52YWx1ZS5tYWMgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisJZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCByZWcsICZjbWQpOworCitvdXQ6CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBsYnNfcXVldWVfY21kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKQEAgLTcwNCwxNCArOTMxLDE3IEBACiAKIAkvKiBFeGl0X1BTIGNvbW1hbmQgbmVlZHMgdG8gYmUgcXVldWVkIGluIHRoZSBoZWFkZXIgYWx3YXlzLiAqLwogCWlmIChsZTE2X3RvX2NwdShjbWRub2RlLT5jbWRidWYtPmNvbW1hbmQpID09IENNRF84MDJfMTFfUFNfTU9ERSkgewotCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlICpwc20gPSAodm9pZCAqKSAmY21kbm9kZS0+Y21kYnVmWzFdOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlICpwc20gPSAodm9pZCAqKSAmY21kbm9kZS0+Y21kYnVmOwogCi0JCWlmIChwc20tPmFjdGlvbiA9PSBjcHVfdG9fbGUxNihDTURfU1VCQ01EX0VYSVRfUFMpKSB7CisJCWlmIChwc20tPmFjdGlvbiA9PSBjcHVfdG9fbGUxNihQU19NT0RFX0FDVElPTl9FWElUX1BTKSkgewogCQkJaWYgKHByaXYtPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikKIAkJCQlhZGR0YWlsID0gMDsKIAkJfQogCX0KIAorCWlmIChsZTE2X3RvX2NwdShjbWRub2RlLT5jbWRidWYtPmNvbW1hbmQpID09IENNRF84MDJfMTFfV0FLRVVQX0NPTkZJUk0pCisJCWFkZHRhaWwgPSAwOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAKIAlpZiAoYWRkdGFpbCkKQEAgLTc0NCw3ICs5NzQsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJcHJpdi0+Y3VyX2NtZCA9IGNtZG5vZGU7Ci0JcHJpdi0+Y3VyX2NtZF9yZXRjb2RlID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCiAJY21kc2l6ZSA9IGxlMTZfdG9fY3B1KGNtZC0+c2l6ZSk7CkBAIC04MTcsOSArMTA0Niw2IEBACiB2b2lkIGxic19jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZCwKIAkJCSAgaW50IHJlc3VsdCkKIHsKLQlpZiAoY21kID09IHByaXYtPmN1cl9jbWQpCi0JCXByaXYtPmN1cl9jbWRfcmV0Y29kZSA9IHJlc3VsdDsKLQogCWNtZC0+cmVzdWx0ID0gcmVzdWx0OwogCWNtZC0+Y21kd2FpdHF3b2tlbiA9IDE7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbWQtPmNtZHdhaXRfcSk7CkBAIC04ODcsMTc1ICsxMTEzLDYgQEAKIH0KIAogLyoqCi0gKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJlcGFyZSB0aGUgY29tbWFuZCBiZWZvcmUgc2VuZCB0byBmaXJtd2FyZS4KLSAqCi0gKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIGNtZF9ubwljb21tYW5kIG51bWJlcgotICogIEBwYXJhbSBjbWRfYWN0aW9uCWNvbW1hbmQgYWN0aW9uOiBHRVQgb3IgU0VUCi0gKiAgQHBhcmFtIHdhaXRfb3B0aW9uCXdhaXQgb3B0aW9uOiB3YWl0IHJlc3BvbnNlIG9yIG5vdAotICogIEBwYXJhbSBjbWRfb2lkCWNtZCBvaWQ6IHRyZWF0ZWQgYXMgc3ViIGNvbW1hbmQKLSAqICBAcGFyYW0gcGRhdGFfYnVmCUEgcG9pbnRlciB0byBpbmZvcm1haW9uIGJ1ZmZlcgotICogIEByZXR1cm4gCQkwIG9yIC0xCi0gKi8KLWludCBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCSAgdTE2IGNtZF9ubywKLQkJCSAgdTE2IGNtZF9hY3Rpb24sCi0JCQkgIHUxNiB3YWl0X29wdGlvbiwgdTMyIGNtZF9vaWQsIHZvaWQgKnBkYXRhX2J1ZikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZTsKLQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZHB0cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0hPU1QpOwotCi0JaWYgKCFwcml2KSB7Ci0JCWxic19kZWJfaG9zdCgiUFJFUF9DTUQ6IHByaXYgaXMgTlVMTFxuIik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHByaXYtPnN1cnByaXNlcmVtb3ZlZCkgewotCQlsYnNfZGViX2hvc3QoIlBSRVBfQ01EOiBjYXJkIHJlbW92ZWRcbiIpOwotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghbGJzX2lzX2NtZF9hbGxvd2VkKHByaXYpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWNtZG5vZGUgPSBsYnNfZ2V0X2NtZF9jdHJsX25vZGUocHJpdik7Ci0KLQlpZiAoY21kbm9kZSA9PSBOVUxMKSB7Ci0JCWxic19kZWJfaG9zdCgiUFJFUF9DTUQ6IGNtZG5vZGUgaXMgTlVMTFxuIik7Ci0KLQkJLyogV2FrZSB1cCBtYWluIHRocmVhZCB0byBleGVjdXRlIG5leHQgY29tbWFuZCAqLwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRxKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljbWRub2RlLT5jYWxsYmFjayA9IE5VTEw7Ci0JY21kbm9kZS0+Y2FsbGJhY2tfYXJnID0gKHVuc2lnbmVkIGxvbmcpcGRhdGFfYnVmOwotCi0JY21kcHRyID0gKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqKWNtZG5vZGUtPmNtZGJ1ZjsKLQotCWxic19kZWJfaG9zdCgiUFJFUF9DTUQ6IGNvbW1hbmQgMHglMDR4XG4iLCBjbWRfbm8pOwotCi0JLyogU2V0IHNlcXVlbmNlIG51bWJlciwgY29tbWFuZCBhbmQgSU5UIG9wdGlvbiAqLwotCXByaXYtPnNlcW51bSsrOwotCWNtZHB0ci0+c2VxbnVtID0gY3B1X3RvX2xlMTYocHJpdi0+c2VxbnVtKTsKLQotCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9ubyk7Ci0JY21kcHRyLT5yZXN1bHQgPSAwOwotCi0Jc3dpdGNoIChjbWRfbm8pIHsKLQljYXNlIENNRF84MDJfMTFfUFNfTU9ERToKLQkJcmV0ID0gbGJzX2NtZF84MDJfMTFfcHNfbW9kZShjbWRwdHIsIGNtZF9hY3Rpb24pOwotCQlicmVhazsKLQotCWNhc2UgQ01EX01BQ19SRUdfQUNDRVNTOgotCWNhc2UgQ01EX0JCUF9SRUdfQUNDRVNTOgotCWNhc2UgQ01EX1JGX1JFR19BQ0NFU1M6Ci0JCXJldCA9IGxic19jbWRfcmVnX2FjY2VzcyhjbWRwdHIsIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfODAyXzExX01PTklUT1JfTU9ERToKLQkJcmV0ID0gbGJzX2NtZF84MDJfMTFfbW9uaXRvcl9tb2RlKGNtZHB0ciwKLQkJCQkgICAgICAgICAgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF84MDJfMTFfUlNTSToKLQkJcmV0ID0gbGJzX2NtZF84MDJfMTFfcnNzaShwcml2LCBjbWRwdHIpOwotCQlicmVhazsKLQotCWNhc2UgQ01EXzgwMl8xMV9TRVRfQUZDOgotCWNhc2UgQ01EXzgwMl8xMV9HRVRfQUZDOgotCi0JCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9ubyk7Ci0JCWNtZHB0ci0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMpICsKLQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0KLQkJbWVtbW92ZSgmY21kcHRyLT5wYXJhbXMuYWZjLAotCQkJcGRhdGFfYnVmLCBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfYWZjKSk7Ci0KLQkJcmV0ID0gMDsKLQkJZ290byBkb25lOwotCi0JY2FzZSBDTURfODAyXzExX1RQQ19DRkc6Ci0JCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfVFBDX0NGRyk7Ci0JCWNtZHB0ci0+c2l6ZSA9Ci0JCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfdHBjX2NmZykgKwotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0KLQkJbWVtbW92ZSgmY21kcHRyLT5wYXJhbXMudHBjY2ZnLAotCQkJcGRhdGFfYnVmLCBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfdHBjX2NmZykpOwotCi0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCi0jaWZkZWYgQ09ORklHX0xJQkVSVEFTX01FU0gKLQotCWNhc2UgQ01EX0JUX0FDQ0VTUzoKLQkJcmV0ID0gbGJzX2NtZF9idF9hY2Nlc3MoY21kcHRyLCBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOwotCQlicmVhazsKLQotCWNhc2UgQ01EX0ZXVF9BQ0NFU1M6Ci0JCXJldCA9IGxic19jbWRfZnd0X2FjY2VzcyhjbWRwdHIsIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7Ci0JCWJyZWFrOwotCi0jZW5kaWYKLQotCWNhc2UgQ01EXzgwMl8xMV9CRUFDT05fQ1RSTDoKLQkJcmV0ID0gbGJzX2NtZF9iY25fY3RybChwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENNRF84MDJfMTFfREVFUF9TTEVFUDoKLQkJY21kcHRyLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoQ01EXzgwMl8xMV9ERUVQX1NMRUVQKTsKLQkJY21kcHRyLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWxic19wcl9lcnIoIlBSRVBfQ01EOiB1bmtub3duIGNvbW1hbmQgMHglMDR4XG4iLCBjbWRfbm8pOwotCQlyZXQgPSAtMTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogcmV0dXJuIGVycm9yLCBzaW5jZSB0aGUgY29tbWFuZCBwcmVwYXJhdGlvbiBmYWlsZWQgKi8KLQlpZiAocmV0ICE9IDApIHsKLQkJbGJzX2RlYl9ob3N0KCJQUkVQX0NNRDogY29tbWFuZCBwcmVwYXJhdGlvbiBmYWlsZWRcbiIpOwotCQlsYnNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBjbWRub2RlKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljbWRub2RlLT5jbWR3YWl0cXdva2VuID0gMDsKLQotCWxic19xdWV1ZV9jbWQocHJpdiwgY21kbm9kZSk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT53YWl0cSk7Ci0KLQlpZiAod2FpdF9vcHRpb24gJiBDTURfT1BUSU9OX1dBSVRGT1JSU1ApIHsKLQkJbGJzX2RlYl9ob3N0KCJQUkVQX0NNRDogd2FpdCBmb3IgcmVzcG9uc2VcbiIpOwotCQltaWdodF9zbGVlcCgpOwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY21kbm9kZS0+Y21kd2FpdF9xLAotCQkJCQkgY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JaWYgKHByaXYtPmN1cl9jbWRfcmV0Y29kZSkgewotCQlsYnNfZGViX2hvc3QoIlBSRVBfQ01EOiBjb21tYW5kIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkXG4iLAotCQkgICAgICAgcHJpdi0+Y3VyX2NtZF9yZXRjb2RlKTsKLQkJcHJpdi0+Y3VyX2NtZF9yZXRjb2RlID0gMDsKLQkJcmV0ID0gLTE7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0KLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfSE9TVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCiAgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBhbmQgbGluawogICogIGl0IHRvIGNvbW1hbmQgZnJlZSBxdWV1ZS4KICAqCkBAIC0xMTQ4LDcgKzEyMDUsNyBAQAogICogIEBwYXJhbSBwcml2CQlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQogICogIEByZXR1cm4gY21kX2N0cmxfbm9kZSBBIHBvaW50ZXIgdG8gY21kX2N0cmxfbm9kZSBzdHJ1Y3R1cmUgb3IgTlVMTAogICovCi1zdGF0aWMgc3RydWN0IGNtZF9jdHJsX25vZGUgKmxic19nZXRfY21kX2N0cmxfbm9kZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCitzdGF0aWMgc3RydWN0IGNtZF9jdHJsX25vZGUgKmxic19nZXRfZnJlZV9jbWRfbm9kZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IGNtZF9jdHJsX25vZGUgKnRlbXBub2RlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMjMxLDEwICsxMjg4LDEwIEBACiAJCQkvKgogCQkJICogMS4gTm9uLVBTIGNvbW1hbmQ6CiAJCQkgKiBRdWV1ZSBpdC4gc2V0IG5lZWR0b3dha2V1cCB0byBUUlVFIGlmIGN1cnJlbnQgc3RhdGUKLQkJCSAqIGlzIFNMRUVQLCBvdGhlcndpc2UgY2FsbCBsYnNfcHNfd2FrZXVwIHRvIHNlbmQgRXhpdF9QUy4KLQkJCSAqIDIuIFBTIGNvbW1hbmQgYnV0IG5vdCBFeGl0X1BTOgorCQkJICogaXMgU0xFRVAsIG90aGVyd2lzZSBjYWxsIHNlbmQgRVhJVF9QUy4KKwkJCSAqIDIuIFBTIGNvbW1hbmQgYnV0IG5vdCBFWElUX1BTOgogCQkJICogSWdub3JlIGl0LgotCQkJICogMy4gUFMgY29tbWFuZCBFeGl0X1BTOgorCQkJICogMy4gUFMgY29tbWFuZCBFWElUX1BTOgogCQkJICogU2V0IG5lZWR0b3dha2V1cCB0byBUUlVFIGlmIGN1cnJlbnQgc3RhdGUgaXMgU0xFRVAsCiAJCQkgKiBvdGhlcndpc2Ugc2VuZCB0aGlzIGNvbW1hbmQgZG93biB0byBmaXJtd2FyZQogCQkJICogaW1tZWRpYXRlbHkuCkBAIC0xMjQ4LDggKzEzMDUsMTEgQEAKIAkJCQkJLyogdy8gbmV3IHNjaGVtZSwgaXQgd2lsbCBub3QgcmVhY2ggaGVyZS4KIAkJCQkJICAgc2luY2UgaXQgaXMgYmxvY2tlZCBpbiBtYWluX3RocmVhZC4gKi8KIAkJCQkJcHJpdi0+bmVlZHRvd2FrZXVwID0gMTsKLQkJCQl9IGVsc2UKLQkJCQkJbGJzX3BzX3dha2V1cChwcml2LCAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsYnNfc2V0X3BzX21vZGUocHJpdiwKKwkJCQkJCQlQU19NT0RFX0FDVElPTl9FWElUX1BTLAorCQkJCQkJCWZhbHNlKTsKKwkJCQl9CiAKIAkJCQlyZXQgPSAwOwogCQkJCWdvdG8gZG9uZTsKQEAgLTEyNjQsNyArMTMyNCw3IEBACiAJCQkJICAgICAgICJFWEVDX05FWFRfQ01EOiBQUyBjbWQsIGFjdGlvbiAweCUwMnhcbiIsCiAJCQkJICAgICAgIHBzbS0+YWN0aW9uKTsKIAkJCQlpZiAocHNtLT5hY3Rpb24gIT0KLQkJCQkgICAgY3B1X3RvX2xlMTYoQ01EX1NVQkNNRF9FWElUX1BTKSkgeworCQkJCSAgICBjcHVfdG9fbGUxNihQU19NT0RFX0FDVElPTl9FWElUX1BTKSkgewogCQkJCQlsYnNfZGViX2hvc3QoCiAJCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogaWdub3JlIEVOVEVSX1BTIGNtZFxuIik7CiAJCQkJCWxpc3RfZGVsKCZjbWRub2RlLT5saXN0KTsKQEAgLTEzMDMsNiArMTM2MywxNSBAQAogCQkgKiBjaGVjayBpZiBpbiBwb3dlciBzYXZlIG1vZGUsIGlmIHllcywgcHV0IHRoZSBkZXZpY2UgYmFjawogCQkgKiB0byBQUyBtb2RlCiAJCSAqLworI2lmZGVmIFRPRE8KKwkJLyoKKwkJICogVGhpcyB3YXMgdGhlIG9sZCBjb2RlIGZvciBsaWJlcnRhcyt3ZXh0LiBTb21lb25lIHRoYXQKKwkJICogdW5kZXJzdGFuZHMgdGhpcyBiZWFzdCBzaG91bGQgcmUtY29kZSBpdCBpbiBhIHNhbmUgd2F5LgorCQkgKgorCQkgKiBJIGFjdHVhbGx5IGRvbid0IHVuZGVyc3RhbmQgd2h5IHRoaXMgaXMgcmVsYXRlZCB0byBXUEEKKwkJICogYW5kIHRvIGNvbm5lY3Rpb24gc3RhdHVzLCBzaG91bGRuJ3QgcG93ZXJpbmcgc2hvdWxkIGJlCisJCSAqIGluZGVwZW5kIG9mIHN1Y2ggdGhpbmdzPworCQkgKi8KIAkJaWYgKChwcml2LT5wc21vZGUgIT0gTEJTODAyXzExUE9XRVJNT0RFQ0FNKSAmJgogCQkgICAgKHByaXYtPnBzc3RhdGUgPT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgJiYKIAkJICAgICgocHJpdi0+Y29ubmVjdF9zdGF0dXMgPT0gTEJTX0NPTk5FQ1RFRCkgfHwKQEAgLTEzMTUsMTUgKzEzODQsMTkgQEAKIAkJCQkJbGJzX2RlYl9ob3N0KAogCQkJCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IFdQQSBlbmFibGVkIGFuZCBHVEtfU0VUIgogCQkJCQkgICAgICAgIiBnbyBiYWNrIHRvIFBTX1NMRUVQIik7Ci0JCQkJCWxic19wc19zbGVlcChwcml2LCAwKTsKKwkJCQkJbGJzX3NldF9wc19tb2RlKHByaXYsCisJCQkJCQkJUFNfTU9ERV9BQ1RJT05fRU5URVJfUFMsCisJCQkJCQkJZmFsc2UpOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJbGJzX2RlYl9ob3N0KAogCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogY21kcGVuZGluZ3EgZW1wdHksICIKIAkJCQkgICAgICAgImdvIGJhY2sgdG8gUFNfU0xFRVAiKTsKLQkJCQlsYnNfcHNfc2xlZXAocHJpdiwgMCk7CisJCQkJbGJzX3NldF9wc19tb2RlKHByaXYsIFBTX01PREVfQUNUSU9OX0VOVEVSX1BTLAorCQkJCQkJZmFsc2UpOwogCQkJfQogCQl9CisjZW5kaWYKIAl9CiAKIAlyZXQgPSAwOwpAQCAtMTM1Myw2ICsxNDI2LDExIEBACiAJLyogV2UgZG9uJ3QgZ2V0IGEgcmVzcG9uc2Ugb24gdGhlIHNsZWVwLWNvbmZpcm1hdGlvbiAqLwogCXByaXYtPmRubGRfc2VudCA9IEROTERfUkVTX1JFQ0VJVkVEOwogCisJaWYgKHByaXYtPmlzX2hvc3Rfc2xlZXBfY29uZmlndXJlZCkgeworCQlwcml2LT5pc19ob3N0X3NsZWVwX2FjdGl2YXRlZCA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+aG9zdF9zbGVlcF9xKTsKKwl9CisKIAkvKiBJZiBub3RoaW5nIHRvIGRvLCBnbyBiYWNrIHRvIHNsZWVwICg/KSAqLwogCWlmICgha2ZpZm9fbGVuKCZwcml2LT5ldmVudF9maWZvKSAmJiAhcHJpdi0+cmVzcF9sZW5bcHJpdi0+cmVzcF9pZHhdKQogCQlwcml2LT5wc3N0YXRlID0gUFNfU1RBVEVfU0xFRVA7CkBAIC0xMzYzLDQzICsxNDQxLDYgQEAKIAlsYnNfZGViX2xlYXZlKExCU19ERUJfSE9TVCk7CiB9CiAKLXZvaWQgbGJzX3BzX3NsZWVwKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IHdhaXRfb3B0aW9uKQotewotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9IT1NUKTsKLQotCS8qCi0JICogUFMgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGluIEluZnJhc3RydWN0dXJlIG1vZGUKLQkgKiBSZW1vdmUgdGhpcyBjaGVjayBpZiBpdCBpcyB0byBiZSBzdXBwb3J0ZWQgaW4gSUJTUyBtb2RlIGFsc28KLQkgKi8KLQotCWxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9QU19NT0RFLAotCQkJICAgICAgQ01EX1NVQkNNRF9FTlRFUl9QUywgd2FpdF9vcHRpb24sIDAsIE5VTEwpOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0hPU1QpOwotfQotCi0vKioKLSAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBzZW5kcyBFeGl0X1BTIGNvbW1hbmQgdG8gZmlybXdhcmUuCi0gKgotICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSB3YWl0X29wdGlvbgl3YWl0IHJlc3BvbnNlIG9yIG5vdAotICogIEByZXR1cm4gCSAgIAluL2EKLSAqLwotdm9pZCBsYnNfcHNfd2FrZXVwKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IHdhaXRfb3B0aW9uKQotewotCV9fbGUzMiBMb2NhbHBzbW9kZTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9IT1NUKTsKLQotCUxvY2FscHNtb2RlID0gY3B1X3RvX2xlMzIoTEJTODAyXzExUE9XRVJNT0RFQ0FNKTsKLQotCWxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9QU19NT0RFLAotCQkJICAgICAgQ01EX1NVQkNNRF9FWElUX1BTLAotCQkJICAgICAgd2FpdF9vcHRpb24sIDAsICZMb2NhbHBzbW9kZSk7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfSE9TVCk7Ci19Ci0KIC8qKgogICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBjb25kaXRpb24gYW5kIHByZXBhcmVzIHRvCiAgKiAgc2VuZCBzbGVlcCBjb25maXJtIGNvbW1hbmQgdG8gZmlybXdhcmUgaWYgb2suCkBAIC0xNTI0LDEyICsxNTY1LDE4IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoIWxic19pc19jbWRfYWxsb3dlZChwcml2KSkgewotCQljbWRub2RlID0gRVJSX1BUUigtRUJVU1kpOwotCQlnb3RvIGRvbmU7CisJLyogTm8gY29tbWFuZHMgYXJlIGFsbG93ZWQgaW4gRGVlcCBTbGVlcCB1bnRpbCB3ZSB0b2dnbGUgdGhlIEdQSU8KKwkgKiB0byB3YWtlIHVwIHRoZSBjYXJkIGFuZCBpdCBoYXMgc2lnbmFsZWQgdGhhdCBpdCdzIHJlYWR5LgorCSAqLworCWlmICghcHJpdi0+aXNfYXV0b19kZWVwX3NsZWVwX2VuYWJsZWQpIHsKKwkJaWYgKHByaXYtPmlzX2RlZXBfc2xlZXApIHsKKwkJCWxic19kZWJfY21kKCJjb21tYW5kIG5vdCBhbGxvd2VkIGluIGRlZXAgc2xlZXBcbiIpOworCQkJY21kbm9kZSA9IEVSUl9QVFIoLUVCVVNZKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQogCX0KIAotCWNtZG5vZGUgPSBsYnNfZ2V0X2NtZF9jdHJsX25vZGUocHJpdik7CisJY21kbm9kZSA9IGxic19nZXRfZnJlZV9jbWRfbm9kZShwcml2KTsKIAlpZiAoY21kbm9kZSA9PSBOVUxMKSB7CiAJCWxic19kZWJfaG9zdCgiUFJFUF9DTUQ6IGNtZG5vZGUgaXMgTlVMTFxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmgKaW5kZXggY2I0MTM4YS4uNzEwOWQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmgKQEAgLTMsNiArMyw4IEBACiAjaWZuZGVmIF9MQlNfQ01EX0hfCiAjZGVmaW5lIF9MQlNfQ01EX0hfCiAKKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKwogI2luY2x1ZGUgImhvc3QuaCIKICNpbmNsdWRlICJkZXYuaCIKIApAQCAtMzcsMTEgKzM5LDYgQEAKICNkZWZpbmUgbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIGNtZG5yLCBjbWQpCVwKIAlsYnNfY21kKHByaXYsIGNtZG5yLCBjbWQsIGxic19jbWRfY29weWJhY2ssICh1bnNpZ25lZCBsb25nKSAoY21kKSkKIAotaW50IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCXUxNiBjbWRfbm8sCi0JdTE2IGNtZF9hY3Rpb24sCi0JdTE2IHdhaXRfb3B0aW9uLCB1MzIgY21kX29pZCwgdm9pZCAqcGRhdGFfYnVmKTsKLQogdm9pZCBsYnNfY21kX2FzeW5jKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgY29tbWFuZCwKIAlzdHJ1Y3QgY21kX2hlYWRlciAqaW5fY21kLCBpbnQgaW5fY21kX3NpemUpOwogCkBAIC05MiwxMCArODksNiBAQAogaW50IGxic19jbWRfODAyXzExX3NsZWVwX3BhcmFtcyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNtZF9hY3Rpb24sCiAJCQkJc3RydWN0IHNsZWVwX3BhcmFtcyAqc3ApOwogCi12b2lkIGxic19wc19zbGVlcChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGludCB3YWl0X29wdGlvbik7Ci0KLXZvaWQgbGJzX3BzX3dha2V1cChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGludCB3YWl0X29wdGlvbik7Ci0KIHZvaWQgbGJzX3BzX2NvbmZpcm1fc2xlZXAoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIAogaW50IGxic19zZXRfcmFkaW8oc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCBwcmVhbWJsZSwgdTggcmFkaW9fb24pOwpAQCAtMTI3LDQgKzEyMCwyMCBAQAogCiBpbnQgbGJzX3NldF9kZWVwX3NsZWVwKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IGRlZXBfc2xlZXApOwogCitpbnQgbGJzX3NldF9ob3N0X3NsZWVwKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IGhvc3Rfc2xlZXApOworCitpbnQgbGJzX3NldF9tb25pdG9yX21vZGUoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBpbnQgZW5hYmxlKTsKKworaW50IGxic19nZXRfcnNzaShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHM4ICpzbnIsIHM4ICpuZik7CisKK2ludCBsYnNfc2V0XzExZF9kb21haW5faW5mbyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCisJCQkgICAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICoqYmFuZHMpOworCitpbnQgbGJzX2dldF9yZWcoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1MTYgcmVnLCB1MTYgb2Zmc2V0LCB1MzIgKnZhbHVlKTsKKworaW50IGxic19zZXRfcmVnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTE2IHJlZywgdTE2IG9mZnNldCwgdTMyIHZhbHVlKTsKKworaW50IGxic19zZXRfcHNfbW9kZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUxNiBjbWRfYWN0aW9uLCBib29sIGJsb2NrKTsKKwogI2VuZGlmIC8qIF9MQlNfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwppbmRleCA4OGY3MTMxLi41ZTk1ZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kcmVzcC5jCkBAIC01LDE4ICs1LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KIAotI2luY2x1ZGUgImhvc3QuaCIKLSNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiY2ZnLmgiCiAjaW5jbHVkZSAiY21kLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImRldi5oIgotI2luY2x1ZGUgImFzc29jLmgiCi0jaW5jbHVkZSAid2V4dC5oIgogCiAvKioKICAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGRpc2Nvbm5lY3QgZXZlbnQuIGl0CkBAIC0zOCw3ICszMSw5IEBACiAJICogSXQgY2F1c2VzIHByb2JsZW0gaW4gdGhlIFN1cHBsaWNhbnQKIAkgKi8KIAltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKLQlsYnNfc2VuZF9kaXNjb25uZWN0X25vdGlmaWNhdGlvbihwcml2KTsKKworCWlmIChwcml2LT53ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJbGJzX3NlbmRfZGlzY29ubmVjdF9ub3RpZmljYXRpb24ocHJpdik7CiAKIAkvKiByZXBvcnQgZGlzY29ubmVjdCB0byB1cHBlciBsYXllciAqLwogCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+ZGV2KTsKQEAgLTQ5LDE0MSArNDQsMTYgQEAKIAlwcml2LT5jdXJyZW50dHhza2IgPSBOVUxMOwogCXByaXYtPnR4X3BlbmRpbmdfbGVuID0gMDsKIAotCS8qIHJlc2V0IFNOUi9ORi9SU1NJIHZhbHVlcyAqLwotCW1lbXNldChwcml2LT5TTlIsIDB4MDAsIHNpemVvZihwcml2LT5TTlIpKTsKLQltZW1zZXQocHJpdi0+TkYsIDB4MDAsIHNpemVvZihwcml2LT5ORikpOwotCW1lbXNldChwcml2LT5SU1NJLCAweDAwLCBzaXplb2YocHJpdi0+UlNTSSkpOwotCW1lbXNldChwcml2LT5yYXdTTlIsIDB4MDAsIHNpemVvZihwcml2LT5yYXdTTlIpKTsKLQltZW1zZXQocHJpdi0+cmF3TkYsIDB4MDAsIHNpemVvZihwcml2LT5yYXdORikpOwotCXByaXYtPm5leHRTTlJORiA9IDA7Ci0JcHJpdi0+bnVtU05STkYgPSAwOwogCXByaXYtPmNvbm5lY3Rfc3RhdHVzID0gTEJTX0RJU0NPTk5FQ1RFRDsKIAotCS8qIENsZWFyIG91dCBhc3NvY2lhdGVkIFNTSUQgYW5kIEJTU0lEIHNpbmNlIGNvbm5lY3Rpb24gaXMKLQkgKiBubyBsb25nZXIgdmFsaWQuCi0JICovCi0JbWVtc2V0KCZwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsIDAsIEVUSF9BTEVOKTsKLQltZW1zZXQoJnByaXYtPmN1cmJzc3BhcmFtcy5zc2lkLCAwLCBJRUVFODAyMTFfTUFYX1NTSURfTEVOKTsKLQlwcml2LT5jdXJic3NwYXJhbXMuc3NpZF9sZW4gPSAwOwotCiAJaWYgKHByaXYtPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgewogCQkvKiBtYWtlIGZpcm13YXJlIHRvIGV4aXQgUFMgbW9kZSAqLwogCQlsYnNfZGViX2NtZCgiZGlzY29ubmVjdGVkLCBzbyBleGl0IFBTIG1vZGVcbiIpOwotCQlsYnNfcHNfd2FrZXVwKHByaXYsIDApOworCQlsYnNfc2V0X3BzX21vZGUocHJpdiwgUFNfTU9ERV9BQ1RJT05fRVhJVF9QUywgZmFsc2UpOwogCX0KIAlsYnNfZGViX2xlYXZlKExCU19ERUJfQVNTT0MpOwogfQogCi1zdGF0aWMgaW50IGxic19yZXRfcmVnX2FjY2VzcyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkgICAgICAgdTE2IHR5cGUsIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBDTURfUkVUKENNRF9NQUNfUkVHX0FDQ0VTUyk6Ci0JCXsKLQkJCXN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgKnJlZyA9ICZyZXNwLT5wYXJhbXMubWFjcmVnOwotCi0JCQlwcml2LT5vZmZzZXR2YWx1ZS5vZmZzZXQgPSAodTMyKWxlMTZfdG9fY3B1KHJlZy0+b2Zmc2V0KTsKLQkJCXByaXYtPm9mZnNldHZhbHVlLnZhbHVlID0gbGUzMl90b19jcHUocmVnLT52YWx1ZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBDTURfUkVUKENNRF9CQlBfUkVHX0FDQ0VTUyk6Ci0JCXsKLQkJCXN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgKnJlZyA9ICZyZXNwLT5wYXJhbXMuYmJwcmVnOwotCi0JCQlwcml2LT5vZmZzZXR2YWx1ZS5vZmZzZXQgPSAodTMyKWxlMTZfdG9fY3B1KHJlZy0+b2Zmc2V0KTsKLQkJCXByaXYtPm9mZnNldHZhbHVlLnZhbHVlID0gcmVnLT52YWx1ZTsKLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIENNRF9SRVQoQ01EX1JGX1JFR19BQ0NFU1MpOgotCQl7Ci0JCQlzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgKnJlZyA9ICZyZXNwLT5wYXJhbXMucmZyZWc7Ci0KLQkJCXByaXYtPm9mZnNldHZhbHVlLm9mZnNldCA9ICh1MzIpbGUxNl90b19jcHUocmVnLT5vZmZzZXQpOwotCQkJcHJpdi0+b2Zmc2V0dmFsdWUudmFsdWUgPSByZWctPnZhbHVlOwotCQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCXJldCA9IC0xOwotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaGFuZGxlX2NtZF9yZXNwb25zZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGNtZF9oZWFkZXIgKmNtZF9yZXNwb25zZSkKLXsKLQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3AgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopIGNtZF9yZXNwb25zZTsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQxNl90IHJlc3BjbWQgPSBsZTE2X3RvX2NwdShyZXNwLT5jb21tYW5kKTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9IT1NUKTsKLQotCXN3aXRjaCAocmVzcGNtZCkgewotCWNhc2UgQ01EX1JFVChDTURfTUFDX1JFR19BQ0NFU1MpOgotCWNhc2UgQ01EX1JFVChDTURfQkJQX1JFR19BQ0NFU1MpOgotCWNhc2UgQ01EX1JFVChDTURfUkZfUkVHX0FDQ0VTUyk6Ci0JCXJldCA9IGxic19yZXRfcmVnX2FjY2Vzcyhwcml2LCByZXNwY21kLCByZXNwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9TRVRfQUZDKToKLQljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9HRVRfQUZDKToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JCW1lbW1vdmUoKHZvaWQgKilwcml2LT5jdXJfY21kLT5jYWxsYmFja19hcmcsICZyZXNwLT5wYXJhbXMuYWZjLAotCQkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2FmYykpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBDTURfUkVUKENNRF84MDJfMTFfQkVBQ09OX1NUT1ApOgotCQlicmVhazsKLQotCWNhc2UgQ01EX1JFVChDTURfODAyXzExX1JTU0kpOgotCQlyZXQgPSBsYnNfcmV0XzgwMl8xMV9yc3NpKHByaXYsIHJlc3ApOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1JFVChDTURfODAyXzExX1RQQ19DRkcpOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKLQkJbWVtbW92ZSgodm9pZCAqKXByaXYtPmN1cl9jbWQtPmNhbGxiYWNrX2FyZywgJnJlc3AtPnBhcmFtcy50cGNjZmcsCi0JCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfdHBjX2NmZykpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1JFVChDTURfQlRfQUNDRVNTKToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JCWlmIChwcml2LT5jdXJfY21kLT5jYWxsYmFja19hcmcpCi0JCQltZW1jcHkoKHZvaWQgKilwcml2LT5jdXJfY21kLT5jYWxsYmFja19hcmcsCi0JCQkgICAgICAgJnJlc3AtPnBhcmFtcy5idC5hZGRyMSwgMiAqIEVUSF9BTEVOKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfUkVUKENNRF9GV1RfQUNDRVNTKToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JCWlmIChwcml2LT5jdXJfY21kLT5jYWxsYmFja19hcmcpCi0JCQltZW1jcHkoKHZvaWQgKilwcml2LT5jdXJfY21kLT5jYWxsYmFja19hcmcsICZyZXNwLT5wYXJhbXMuZnd0LAotCQkJICAgICAgIHNpemVvZihyZXNwLT5wYXJhbXMuZnd0KSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX1JFVChDTURfODAyXzExX0JFQUNPTl9DVFJMKToKLQkJcmV0ID0gbGJzX3JldF84MDJfMTFfYmNuX2N0cmwocHJpdiwgcmVzcCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJbGJzX3ByX2VycigiQ01EX1JFU1A6IHVua25vd24gY21kIHJlc3BvbnNlIDB4JTA0eFxuIiwKLQkJCSAgIGxlMTZfdG9fY3B1KHJlc3AtPmNvbW1hbmQpKTsKLQkJYnJlYWs7Ci0JfQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9IT1NUKTsKLQlyZXR1cm4gcmV0OwotfQotCiBpbnQgbGJzX3Byb2Nlc3NfY29tbWFuZF9yZXNwb25zZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4ICpkYXRhLCB1MzIgbGVuKQogewogCXVpbnQxNl90IHJlc3BjbWQsIGN1cmNtZDsKQEAgLTI0Miw5ICsxMTIsNiBAQAogCWRlbF90aW1lcigmcHJpdi0+Y29tbWFuZF90aW1lcik7CiAJcHJpdi0+Y21kX3RpbWVkX291dCA9IDA7CiAKLQkvKiBTdG9yZSB0aGUgcmVzcG9uc2UgY29kZSB0byBjdXJfY21kX3JldGNvZGUuICovCi0JcHJpdi0+Y3VyX2NtZF9yZXRjb2RlID0gcmVzdWx0OwotCiAJaWYgKHJlc3BjbWQgPT0gQ01EX1JFVChDTURfODAyXzExX1BTX01PREUpKSB7CiAJCXN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUgKnBzbW9kZSA9ICh2b2lkICopICZyZXNwWzFdOwogCQl1MTYgYWN0aW9uID0gbGUxNl90b19jcHUocHNtb2RlLT5hY3Rpb24pOwpAQCAtMjYxLDEwICsxMjgsMTAgQEAKIAkJCSAqIGFkLWhvYyBtb2RlLiBJdCB0YWtlcyBwbGFjZSBpbgogCQkJICogbGJzX2V4ZWN1dGVfbmV4dF9jb21tYW5kKCkuCiAJCQkgKi8KLQkJCWlmIChwcml2LT5tb2RlID09IElXX01PREVfQURIT0MgJiYKLQkJCSAgICBhY3Rpb24gPT0gQ01EX1NVQkNNRF9FTlRFUl9QUykKKwkJCWlmIChwcml2LT53ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgorCQkJICAgIGFjdGlvbiA9PSBQU19NT0RFX0FDVElPTl9FTlRFUl9QUykKIAkJCQlwcml2LT5wc21vZGUgPSBMQlM4MDJfMTFQT1dFUk1PREVDQU07Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IENNRF9TVUJDTURfRU5URVJfUFMpIHsKKwkJfSBlbHNlIGlmIChhY3Rpb24gPT0gUFNfTU9ERV9BQ1RJT05fRU5URVJfUFMpIHsKIAkJCXByaXYtPm5lZWR0b3dha2V1cCA9IDA7CiAJCQlwcml2LT5wc3N0YXRlID0gUFNfU1RBVEVfQVdBS0U7CiAKQEAgLTI3OSwxMSArMTQ2LDEyIEBACiAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCQkJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0JCQkJbGJzX3BzX3dha2V1cChwcml2LCAwKTsKKwkJCQlsYnNfc2V0X3BzX21vZGUocHJpdiwgUFNfTU9ERV9BQ1RJT05fRVhJVF9QUywKKwkJCQkJCWZhbHNlKTsKIAkJCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAkJCX0KLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gQ01EX1NVQkNNRF9FWElUX1BTKSB7CisJCX0gZWxzZSBpZiAoYWN0aW9uID09IFBTX01PREVfQUNUSU9OX0VYSVRfUFMpIHsKIAkJCXByaXYtPm5lZWR0b3dha2V1cCA9IDA7CiAJCQlwcml2LT5wc3N0YXRlID0gUFNfU1RBVEVfRlVMTF9QT1dFUjsKIAkJCWxic19kZWJfaG9zdCgiQ01EX1JFU1A6IEVYSVRfUFMgY29tbWFuZCByZXNwb25zZVxuIik7CkBAIC0zMjQsOCArMTkyLDcgQEAKIAlpZiAocHJpdi0+Y3VyX2NtZCAmJiBwcml2LT5jdXJfY21kLT5jYWxsYmFjaykgewogCQlyZXQgPSBwcml2LT5jdXJfY21kLT5jYWxsYmFjayhwcml2LCBwcml2LT5jdXJfY21kLT5jYWxsYmFja19hcmcsCiAJCQkJcmVzcCk7Ci0JfSBlbHNlCi0JCXJldCA9IGhhbmRsZV9jbWRfcmVzcG9uc2UocHJpdiwgcmVzcCk7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAKQEAgLTM0MSwzMiArMjA4LDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsYnNfc2VuZF9jb25maXJtd2FrZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0Jc3RydWN0IGNtZF9oZWFkZXIgY21kOwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0hPU1QpOwotCi0JY21kLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX1dBS0VVUF9DT05GSVJNKTsKLQljbWQuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQljbWQuc2VxbnVtID0gY3B1X3RvX2xlMTYoKytwcml2LT5zZXFudW0pOwotCWNtZC5yZXN1bHQgPSAwOwotCi0JbGJzX2RlYl9oZXgoTEJTX0RFQl9IT1NULCAid2FrZSBjb25maXJtIiwgKHU4ICopICZjbWQsCi0JCXNpemVvZihjbWQpKTsKLQotCXJldCA9IHByaXYtPmh3X2hvc3RfdG9fY2FyZChwcml2LCBNVk1TX0NNRCwgKHU4ICopICZjbWQsIHNpemVvZihjbWQpKTsKLQlpZiAocmV0KQotCQlsYnNfcHJfYWxlcnQoIlNFTkRfV0FLRUNfQ01EOiBIb3N0IHRvIENhcmQgZmFpbGVkIGZvciBDb25maXJtIFdha2VcbiIpOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfSE9TVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQogaW50IGxic19wcm9jZXNzX2V2ZW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGV2ZW50KQogewogCWludCByZXQgPSAwOworCXN0cnVjdCBjbWRfaGVhZGVyIGNtZDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwogCkBAIC00MTAsNyArMjU1LDEwIEBACiAJCWlmIChwcml2LT5yZXNldF9kZWVwX3NsZWVwX3dha2V1cCkKIAkJCXByaXYtPnJlc2V0X2RlZXBfc2xlZXBfd2FrZXVwKHByaXYpOwogCQlwcml2LT5pc19kZWVwX3NsZWVwID0gMDsKLQkJbGJzX3NlbmRfY29uZmlybXdha2UocHJpdik7CisJCWxic19jbWRfYXN5bmMocHJpdiwgQ01EXzgwMl8xMV9XQUtFVVBfQ09ORklSTSwgJmNtZCwKKwkJCQlzaXplb2YoY21kKSk7CisJCXByaXYtPmlzX2hvc3Rfc2xlZXBfYWN0aXZhdGVkID0gMDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5ob3N0X3NsZWVwX3EpOwogCQlicmVhazsKIAogCWNhc2UgTUFDUkVHX0lOVF9DT0RFX0RFRVBfU0xFRVBfQVdBS0U6CkBAIC00NDEsNyArMjg5LDcgQEAKIAkJCSAqIGluIGxic19wc193YWtldXAoKQogCQkJICovCiAJCQlsYnNfZGViX2NtZCgid2FraW5nIHVwIC4uLlxuIik7Ci0JCQlsYnNfcHNfd2FrZXVwKHByaXYsIDApOworCQkJbGJzX3NldF9wc19tb2RlKHByaXYsIFBTX01PREVfQUNUSU9OX0VYSVRfUFMsIGZhbHNlKTsKIAkJfQogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCmluZGV4IGRlMmNhYWMuLjY1MWE3OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKQEAgLTEsMTggKzEsMTMgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgogCi0jaW5jbHVkZSAiZGV2LmgiCiAjaW5jbHVkZSAiZGVjbC5oIgotI2luY2x1ZGUgImhvc3QuaCIKLSNpbmNsdWRlICJkZWJ1Z2ZzLmgiCiAjaW5jbHVkZSAiY21kLmgiCisjaW5jbHVkZSAiZGVidWdmcy5oIgogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbGJzX2RpcjsKIHN0YXRpYyBjaGFyICpzelN0YXRlc1tdID0gewpAQCAtNjAsNTEgKzU1LDYgQEAKIAlyZXR1cm4gcmVzOwogfQogCi0KLXN0YXRpYyBzc2l6ZV90IGxic19nZXRzY2FudGFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNpemVfdCBwb3MgPSAwOwotCWludCBudW1zY2Fuc2RvbmUgPSAwLCByZXM7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKLQlERUNMQVJFX1NTSURfQlVGKHNzaWQpOwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqIGl0ZXJfYnNzOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLAotCQkiIyB8IGNoICB8IHJzc2kgfCAgICAgICBic3NpZCAgICAgICB8ICAgY2FwICAgIHwgUXVhbCB8IFNTSURcbiIpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSAoaXRlcl9ic3MsICZwcml2LT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKLQkJdTE2IGlic3MgPSAoaXRlcl9ic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7Ci0JCXUxNiBwcml2YWN5ID0gKGl0ZXJfYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOwotCQl1MTYgc3BlY3RydW1fbWdtdCA9IChpdGVyX2Jzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TUEVDVFJVTV9NR01UKTsKLQotCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiUwMnV8ICUwM2QgfCAlMDRkIHwgJXBNIHwiLAotCQkJbnVtc2NhbnNkb25lLCBpdGVyX2Jzcy0+Y2hhbm5lbCwgaXRlcl9ic3MtPnJzc2ksCi0JCQlpdGVyX2Jzcy0+YnNzaWQpOwotCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiAlMDR4LSIsIGl0ZXJfYnNzLT5jYXBhYmlsaXR5KTsKLQkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIlYyVjJWMgfCIsCi0JCQkJaWJzcyA/ICdBJyA6ICdJJywgcHJpdmFjeSA/ICdQJyA6ICcgJywKLQkJCQlzcGVjdHJ1bV9tZ210ID8gJ1MnIDogJyAnKTsKLQkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIgJTA0ZCB8IiwgU0NBTl9SU1NJKGl0ZXJfYnNzLT5yc3NpKSk7Ci0JCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiICVzXG4iLAotCQkgICAgICAgICAgICAgICAgcHJpbnRfc3NpZChzc2lkLCBpdGVyX2Jzcy0+c3NpZCwKLQkJCQkJICAgaXRlcl9ic3MtPnNzaWRfbGVuKSk7Ci0KLQkJbnVtc2NhbnNkb25lKys7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLQlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCi0JZnJlZV9wYWdlKGFkZHIpOwotCXJldHVybiByZXM7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGxic19zbGVlcHBhcmFtc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKIAkJCQlsb2ZmX3QgKnBwb3MpCkBAIC0xNzQsNiArMTI0LDcwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHNzaXplX3QgbGJzX2hvc3Rfc2xlZXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IGJ1Zl9zaXplLCByZXQ7CisJaW50IGhvc3Rfc2xlZXA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJldCA9IHNzY2FuZihidWYsICIlZCIsICZob3N0X3NsZWVwKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChob3N0X3NsZWVwID09IDApCisJCXJldCA9IGxic19zZXRfaG9zdF9zbGVlcChwcml2LCAwKTsKKwllbHNlIGlmIChob3N0X3NsZWVwID09IDEpIHsKKwkJaWYgKHByaXYtPndvbF9jcml0ZXJpYSA9PSBFSFNfUkVNT1ZFX1dBS0VVUCkgeworCQkJbGJzX3ByX2luZm8oIndha2UgcGFyYW1ldGVycyBub3QgY29uZmlndXJlZCIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlyZXQgPSBsYnNfc2V0X2hvc3Rfc2xlZXAocHJpdiwgMSk7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2VycigiaW52YWxpZCBvcHRpb25cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmICghcmV0KQorCQlyZXQgPSBjb3VudDsKKworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgbGJzX2hvc3Rfc2xlZXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3MgKz0gc25wcmludGYoYnVmLCBsZW4sICIlZFxuIiwgcHJpdi0+aXNfaG9zdF9zbGVlcF9hY3RpdmF0ZWQpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKworCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogV2hlbiBjYWxsaW5nIENNRF84MDJfMTFfU1VCU0NSSUJFX0VWRU5UIHdpdGggQ01EX0FDVF9HRVQsIG1lIG1pZ2h0CiAgKiBnZXQgYSBidW5jaCBvZiB2ZW5kb3Itc3BlY2lmaWMgVExWcyAoYS5rLmEuIElFcykgYmFjayBmcm9tIHRoZQpAQCAtNDMyLDMwICs0NDYsMjQgQEAKIH0KIAogCi0KIHN0YXRpYyBzc2l6ZV90IGxic19yZG1hY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKIAkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbGJzX29mZnNldF92YWx1ZSBvZmZ2YWw7CiAJc3NpemVfdCBwb3MgPSAwOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKwl1MzIgdmFsID0gMDsKKwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW9mZnZhbC5vZmZzZXQgPSBwcml2LT5tYWNfb2Zmc2V0OwotCW9mZnZhbC52YWx1ZSA9IDA7Ci0KLQlyZXQgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJQ01EX01BQ19SRUdfQUNDRVNTLCAwLAotCQkJCUNNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgJm9mZnZhbCk7CisJcmV0ID0gbGJzX2dldF9yZWcocHJpdiwgQ01EX01BQ19SRUdfQUNDRVNTLCBwcml2LT5tYWNfb2Zmc2V0LCAmdmFsKTsKIAltZGVsYXkoMTApOwogCWlmICghcmV0KSB7Ci0JCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiTUFDWzB4JXhdID0gMHglMDh4XG4iLAotCQkJCXByaXYtPm1hY19vZmZzZXQsIHByaXYtPm9mZnNldHZhbHVlLnZhbHVlKTsKLQorCQlwb3MgPSBzbnByaW50ZihidWYsIGxlbiwgIk1BQ1sweCV4XSA9IDB4JTA4eFxuIiwKKwkJCQlwcml2LT5tYWNfb2Zmc2V0LCB2YWwpOwogCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwogCX0KIAlmcmVlX3BhZ2UoYWRkcik7CkBAIC00OTMsNyArNTAxLDYgQEAKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3NpemVfdCByZXMsIGJ1Zl9zaXplOwogCXUzMiBvZmZzZXQsIHZhbHVlOwotCXN0cnVjdCBsYnNfb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOwogCWlmICghYnVmKQpAQCAtNTEwLDExICs1MTcsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0Jb2ZmdmFsLm9mZnNldCA9IG9mZnNldDsKLQlvZmZ2YWwudmFsdWUgPSB2YWx1ZTsKLQlyZXMgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJQ01EX01BQ19SRUdfQUNDRVNTLCAxLAotCQkJCUNNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgJm9mZnZhbCk7CisJcmVzID0gbGJzX3NldF9yZWcocHJpdiwgQ01EX01BQ19SRUdfQUNDRVNTLCBvZmZzZXQsIHZhbHVlKTsKIAltZGVsYXkoMTApOwogCiAJaWYgKCFyZXMpCkBAIC01MjgsMjUgKzUzMSwyMCBAQAogCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBsYnNfb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKIAlzc2l6ZV90IHBvcyA9IDA7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCXUzMiB2YWw7CisKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlvZmZ2YWwub2Zmc2V0ID0gcHJpdi0+YmJwX29mZnNldDsKLQlvZmZ2YWwudmFsdWUgPSAwOwotCi0JcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCUNNRF9CQlBfUkVHX0FDQ0VTUywgMCwKLQkJCQlDTURfT1BUSU9OX1dBSVRGT1JSU1AsIDAsICZvZmZ2YWwpOworCXJldCA9IGxic19nZXRfcmVnKHByaXYsIENNRF9CQlBfUkVHX0FDQ0VTUywgcHJpdi0+YmJwX29mZnNldCwgJnZhbCk7CiAJbWRlbGF5KDEwKTsKIAlpZiAoIXJldCkgewotCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIkJCUFsweCV4XSA9IDB4JTA4eFxuIiwKLQkJCQlwcml2LT5iYnBfb2Zmc2V0LCBwcml2LT5vZmZzZXR2YWx1ZS52YWx1ZSk7Ci0KKwkJcG9zID0gc25wcmludGYoYnVmLCBsZW4sICJCQlBbMHgleF0gPSAweCUwOHhcbiIsCisJCQkJcHJpdi0+YmJwX29mZnNldCwgdmFsKTsKIAkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKIAl9CiAJZnJlZV9wYWdlKGFkZHIpOwpAQCAtNTg1LDcgKzU4Myw2IEBACiAJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKIAl1MzIgb2Zmc2V0LCB2YWx1ZTsKLQlzdHJ1Y3QgbGJzX29mZnNldF92YWx1ZSBvZmZ2YWw7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKIAlpZiAoIWJ1ZikKQEAgLTYwMiwxMSArNTk5LDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCW9mZnZhbC5vZmZzZXQgPSBvZmZzZXQ7Ci0Jb2ZmdmFsLnZhbHVlID0gdmFsdWU7Ci0JcmVzID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCUNNRF9CQlBfUkVHX0FDQ0VTUywgMSwKLQkJCQlDTURfT1BUSU9OX1dBSVRGT1JSU1AsIDAsICZvZmZ2YWwpOworCXJlcyA9IGxic19zZXRfcmVnKHByaXYsIENNRF9CQlBfUkVHX0FDQ0VTUywgb2Zmc2V0LCB2YWx1ZSk7CiAJbWRlbGF5KDEwKTsKIAogCWlmICghcmVzKQpAQCAtNjIwLDI1ICs2MTMsMjAgQEAKIAkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbGJzX29mZnNldF92YWx1ZSBvZmZ2YWw7CiAJc3NpemVfdCBwb3MgPSAwOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKwl1MzIgdmFsOworCiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jb2ZmdmFsLm9mZnNldCA9IHByaXYtPnJmX29mZnNldDsKLQlvZmZ2YWwudmFsdWUgPSAwOwotCi0JcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCUNNRF9SRl9SRUdfQUNDRVNTLCAwLAotCQkJCUNNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgJm9mZnZhbCk7CisJcmV0ID0gbGJzX2dldF9yZWcocHJpdiwgQ01EX1JGX1JFR19BQ0NFU1MsIHByaXYtPnJmX29mZnNldCwgJnZhbCk7CiAJbWRlbGF5KDEwKTsKIAlpZiAoIXJldCkgewotCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIlJGWzB4JXhdID0gMHglMDh4XG4iLAotCQkJCXByaXYtPnJmX29mZnNldCwgcHJpdi0+b2Zmc2V0dmFsdWUudmFsdWUpOwotCisJCXBvcyA9IHNucHJpbnRmKGJ1ZiwgbGVuLCAiUkZbMHgleF0gPSAweCUwOHhcbiIsCisJCQkJcHJpdi0+cmZfb2Zmc2V0LCB2YWwpOwogCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwogCX0KIAlmcmVlX3BhZ2UoYWRkcik7CkBAIC02NzcsNyArNjY1LDYgQEAKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3NpemVfdCByZXMsIGJ1Zl9zaXplOwogCXUzMiBvZmZzZXQsIHZhbHVlOwotCXN0cnVjdCBsYnNfb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOwogCWlmICghYnVmKQpAQCAtNjk0LDExICs2ODEsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0Jb2ZmdmFsLm9mZnNldCA9IG9mZnNldDsKLQlvZmZ2YWwudmFsdWUgPSB2YWx1ZTsKLQlyZXMgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJQ01EX1JGX1JFR19BQ0NFU1MsIDEsCi0JCQkJQ01EX09QVElPTl9XQUlURk9SUlNQLCAwLCAmb2ZmdmFsKTsKKwlyZXMgPSBsYnNfc2V0X3JlZyhwcml2LCBDTURfUkZfUkVHX0FDQ0VTUywgb2Zmc2V0LCB2YWx1ZSk7CiAJbWRlbGF5KDEwKTsKIAogCWlmICghcmVzKQpAQCAtNzIzLDEwICs3MDYsMTAgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsYnNfZGVidWdmc19maWxlcyBkZWJ1Z2ZzX2ZpbGVzW10gPSB7CiAJeyAiaW5mbyIsIDA0NDQsIEZPUFMobGJzX2Rldl9pbmZvLCB3cml0ZV9maWxlX2R1bW15KSwgfSwKLQl7ICJnZXRzY2FudGFibGUiLCAwNDQ0LCBGT1BTKGxic19nZXRzY2FudGFibGUsCi0JCQkJCXdyaXRlX2ZpbGVfZHVtbXkpLCB9LAogCXsgInNsZWVwcGFyYW1zIiwgMDY0NCwgRk9QUyhsYnNfc2xlZXBwYXJhbXNfcmVhZCwKIAkJCQlsYnNfc2xlZXBwYXJhbXNfd3JpdGUpLCB9LAorCXsgImhvc3RzbGVlcCIsIDA2NDQsIEZPUFMobGJzX2hvc3Rfc2xlZXBfcmVhZCwKKwkJCQlsYnNfaG9zdF9zbGVlcF93cml0ZSksIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxic19kZWJ1Z2ZzX2ZpbGVzIGRlYnVnZnNfZXZlbnRzX2ZpbGVzW10gPSB7CkBAIC04OTEsNyArODc0LDcgQEAKIAogCXAgPSBidWY7CiAKLQlkID0gKHN0cnVjdCBkZWJ1Z19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2l0ZW1zOyBpKyspIHsKIAkJaWYgKGRbaV0uc2l6ZSA9PSAxKQpAQCAtOTMwLDcgKzkxMyw3IEBACiAJY2hhciAqcDA7CiAJY2hhciAqcDE7CiAJY2hhciAqcDI7Ci0Jc3RydWN0IGRlYnVnX2RhdGEgKmQgPSAoc3RydWN0IGRlYnVnX2RhdGEgKilmLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRlYnVnX2RhdGEgKmQgPSBmLT5wcml2YXRlX2RhdGE7CiAKIAlwZGF0YSA9IGttYWxsb2MoY250LCBHRlBfS0VSTkVMKTsKIAlpZiAocGRhdGEgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlY2wuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlY2wuaAppbmRleCA3MDlmZmNhLi4xZDE0MWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWNsLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVjbC5oCkBAIC0xLDMgKzEsNCBAQAorCiAvKioKICAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9uIHJlZmVycmluZyB0bwogICAqICBmdW5jdGlvbnMgZGVmaW5lZCBpbiBvdGhlciBzb3VyY2UgZmlsZXMKQEAgLTEyLDYgKzEzLDcgQEAKIHN0cnVjdCBsYnNfcHJpdmF0ZTsKIHN0cnVjdCBza19idWZmOwogc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgY21kX2RzX2NvbW1hbmQ7CiAKIAogLyogZXRodG9vbC5jICovCkBAIC0zNCwxMSArMzYsMTMgQEAKIHZvaWQgbGJzX3N0b3BfY2FyZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOwogdm9pZCBsYnNfaG9zdF90b19jYXJkX2RvbmUoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIAoraW50IGxic19ydGFwX3N1cHBvcnRlZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOworCiBpbnQgbGJzX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKIHZvaWQgbGJzX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogaW50IGxic19zdXNwZW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7Ci12b2lkIGxic19yZXN1bWUoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKK2ludCBsYnNfcmVzdW1lKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7CiAKIHZvaWQgbGJzX3F1ZXVlX2V2ZW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGV2ZW50KTsKIHZvaWQgbGJzX25vdGlmeV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTggcmVzcF9pZHgpOwpAQCAtNDksNSArNTMsNCBAQAogdTMyIGxic19md19pbmRleF90b19kYXRhX3JhdGUodTggaW5kZXgpOwogdTggbGJzX2RhdGFfcmF0ZV90b19md19pbmRleCh1MzIgcmF0ZSk7CiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmgKaW5kZXggZWEzZjEwZS4uZDAwYzcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlZnMuaApAQCAtMTcyLDExICsxNzIsNiBAQAogI2RlZmluZSBNUlZEUlZfTUFYX0JTU19ERVNDUklQVFMJCTE2CiAjZGVmaW5lIE1SVkRSVl9NQVhfUkVHSU9OX0NPREUJCQk2CiAKLSNkZWZpbmUgTVJWRFJWX0lHTk9SRV9NVUxUSVBMRV9EVElNCQkweGZmZmUKLSNkZWZpbmUgTVJWRFJWX01JTl9NVUxUSVBMRV9EVElNCQkxCi0jZGVmaW5lIE1SVkRSVl9NQVhfTVVMVElQTEVfRFRJTQkJNQotI2RlZmluZSBNUlZEUlZfREVGQVVMVF9NVUxUSVBMRV9EVElNCQkxCi0KICNkZWZpbmUgTVJWRFJWX0RFRkFVTFRfTElTVEVOX0lOVEVSVkFMCQkxMAogCiAjZGVmaW5lCU1SVkRSVl9DSEFOTkVMU19QRVJfU0NBTgkJNApAQCAtMzAxLDE5ICsyOTYsNiBAQAogI2RlZmluZQlCQU5EX0cJCQkoMHgwMikKICNkZWZpbmUgQUxMXzgwMl8xMV9CQU5EUwkoQkFORF9CIHwgQkFORF9HKQogCi0vKiogTUFDUk8gREVGSU5JVElPTlMgKi8KLSNkZWZpbmUgQ0FMX05GKE5GKQkJCSgoczMyKSgtKHMzMikoTkYpKSkKLSNkZWZpbmUgQ0FMX1JTU0koU05SLCBORikgCQkoKHMzMikoKHMzMikoU05SKSArIENBTF9ORihORikpKQotI2RlZmluZSBTQ0FOX1JTU0koUlNTSSkJCQkoMHgxMDAgLSAoKHU4KShSU1NJKSkpCi0KLSNkZWZpbmUgREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUgkJOAotI2RlZmluZSBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUgkJOAotI2RlZmluZSBBVkdfU0NBTEUJCQkxMDAKLSNkZWZpbmUgQ0FMX0FWR19TTlJfTkYoQVZHLCBTTlJORiwgTikgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKChBVkcpID09IDApID8gKCh1MTYpKFNOUk5GKSAqIEFWR19TQ0FMRSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KShBVkcpICogKE4gLTEpKSArICgodTE2KShTTlJORikgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBBVkdfU0NBTEUpKSAgLyBOKSkKLQogI2RlZmluZSBNQVhfUkFURVMJCQkxNAogCiAjZGVmaW5lCU1BWF9MRURTCQkJOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaAppbmRleCBhNTQ4ODBlLi4zYzdlMjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaApAQCAtNyw4ICs3LDggQEAKICNkZWZpbmUgX0xCU19ERVZfSF8KIAogI2luY2x1ZGUgIm1lc2guaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiYXNzb2MuaCIKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaG9zdC5oIgogCiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KIApAQCAtMjksNyArMjksNiBAQAogCS8qIEJhc2ljIG5ldHdvcmtpbmcgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXUzMiBjb25uZWN0X3N0YXR1czsKLQlpbnQgaW5mcmFfb3BlbjsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbWNhc3Rfd29yazsKIAl1MzIgbnJfb2ZfbXVsdGljYXN0bWFjYWRkcjsKIAl1OCBtdWx0aWNhc3RsaXN0W01SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRV1bRVRIX0FMRU5dOwpAQCAtMzcsNiArMzYsOSBAQAogCS8qIENGRzgwMjExICovCiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAlib29sIHdpcGh5X3JlZ2lzdGVyZWQ7CisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXE7CisJdTggYXNzb2NfYnNzW0VUSF9BTEVOXTsKKwl1OCBkaXNhc3NvY19yZWFzb247CiAKIAkvKiBNZXNoICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm1lc2hfZGV2OyAvKiBWaXJ0dWFsIGRldmljZSAqLwpAQCAtNDksMTAgKzUxLDYgQEAKIAl1OCBtZXNoX3NzaWRfbGVuOwogI2VuZGlmCiAKLQkvKiBNb25pdG9yIG1vZGUgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAqcnRhcF9uZXRfZGV2OwotCXUzMiBtb25pdG9ybW9kZTsKLQogCS8qIERlYnVnZnMgKi8KIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RpcjsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RlYnVnOwpAQCAtNjYsNyArNjQsNiBAQAogCXUzMiBtYWNfb2Zmc2V0OwogCXUzMiBiYnBfb2Zmc2V0OwogCXUzMiByZl9vZmZzZXQ7Ci0Jc3RydWN0IGxic19vZmZzZXRfdmFsdWUgb2Zmc2V0dmFsdWU7CiAKIAkvKiBQb3dlciBtYW5hZ2VtZW50ICovCiAJdTE2IHBzbW9kZTsKQEAgLTc1LDYgKzcyLDcgQEAKIAogCS8qIERlZXAgc2xlZXAgKi8KIAlpbnQgaXNfZGVlcF9zbGVlcDsKKwlpbnQgZGVlcF9zbGVlcF9yZXF1aXJlZDsKIAlpbnQgaXNfYXV0b19kZWVwX3NsZWVwX2VuYWJsZWQ7CiAJaW50IHdha2V1cF9kZXZfcmVxdWlyZWQ7CiAJaW50IGlzX2FjdGl2aXR5X2RldGVjdGVkOwpAQCAtODIsNiArODAsMTEgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkc19hd2FrZV9xOwogCXN0cnVjdCB0aW1lcl9saXN0IGF1dG9fZGVlcHNsZWVwX3RpbWVyOwogCisJLyogSG9zdCBzbGVlcCovCisJaW50IGlzX2hvc3Rfc2xlZXBfY29uZmlndXJlZDsKKwlpbnQgaXNfaG9zdF9zbGVlcF9hY3RpdmF0ZWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaG9zdF9zbGVlcF9xOworCiAJLyogSGFyZHdhcmUgYWNjZXNzICovCiAJdm9pZCAqY2FyZDsKIAl1OCBmd19yZWFkeTsKQEAgLTEwOCwxMiArMTExLDEwIEBACiAJc3RydWN0IGNtZF9jdHJsX25vZGUgKmN1cl9jbWQ7CiAJc3RydWN0IGxpc3RfaGVhZCBjbWRmcmVlcTsgICAgLyogZnJlZSBjb21tYW5kIGJ1ZmZlcnMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNtZHBlbmRpbmdxOyAvKiBwZW5kaW5nIGNvbW1hbmQgYnVmZmVycyAqLwotCXdhaXRfcXVldWVfaGVhZF90IGNtZF9wZW5kaW5nOwogCXN0cnVjdCB0aW1lcl9saXN0IGNvbW1hbmRfdGltZXI7CiAJaW50IGNtZF90aW1lZF9vdXQ7CiAKIAkvKiBDb21tYW5kIHJlc3BvbnNlcyBzZW50IGZyb20gdGhlIGhhcmR3YXJlIHRvIHRoZSBkcml2ZXIgKi8KLQlpbnQgY3VyX2NtZF9yZXRjb2RlOwogCXU4IHJlc3BfaWR4OwogCXU4IHJlc3BfYnVmWzJdW0xCU19VUExEX1NJWkVdOwogCXUzMiByZXNwX2xlblsyXTsKQEAgLTEyNywxNCArMTI4LDEwIEBACiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtfdGhyZWFkOwogCiAJLyoqIEVuY3J5cHRpb24gc3R1ZmYgKi8KLQlzdHJ1Y3QgbGJzXzgwMl8xMV9zZWN1cml0eSBzZWNpbmZvOwotCXN0cnVjdCBlbmNfa2V5IHdwYV9tY2FzdF9rZXk7Ci0Jc3RydWN0IGVuY19rZXkgd3BhX3VuaWNhc3Rfa2V5OwotCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07Ci0JdTggd3BhX2llX2xlbjsKLQl1MTYgd2VwX3R4X2tleWlkeDsKLQlzdHJ1Y3QgZW5jX2tleSB3ZXBfa2V5c1s0XTsKIAl1OCBhdXRodHlwZV9hdXRvOworCXU4IHdlcF90eF9rZXk7CisJdTggd2VwX2tleVs0XVtXTEFOX0tFWV9MRU5fV0VQMTA0XTsKKwl1OCB3ZXBfa2V5X2xlbls0XTsKIAogCS8qIFdha2UgT24gTEFOICovCiAJdWludDMyX3Qgd29sX2NyaXRlcmlhOwpAQCAtMTU1LDYgKzE1Miw3IEBACiAJLyogTklDL2xpbmsgb3BlcmF0aW9uIGNoYXJhY3RlcmlzdGljcyAqLwogCXUxNiBtYWNfY29udHJvbDsKIAl1OCByYWRpb19vbjsKKwl1OCBjdXJfcmF0ZTsKIAl1OCBjaGFubmVsOwogCXMxNiB0eHBvd2VyX2N1cjsKIAlzMTYgdHhwb3dlcl9taW47CkBAIC0xNjMsNDIgKzE2MSw2IEBACiAJLyoqIFNjYW5uaW5nICovCiAJc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX3dvcms7CiAJaW50IHNjYW5fY2hhbm5lbDsKLQkvKiByZW1lbWJlciB3aGljaCBjaGFubmVsIHdhcyBzY2FubmVkIGxhc3QsICE9IDAgaWYgY3VycmVudGx5IHNjYW5uaW5nICovCi0JdTggc2Nhbl9zc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyAxXTsKLQl1OCBzY2FuX3NzaWRfbGVuOwotCi0JLyogQXNzb2NpYXRpbmcgKi8KLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jX3dvcms7Ci0Jc3RydWN0IGN1cnJlbnRfYnNzX3BhcmFtcyBjdXJic3NwYXJhbXM7Ci0JdTggbW9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfZnJlZV9saXN0OwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqbmV0d29ya3M7Ci0Jc3RydWN0IGFzc29jX3JlcXVlc3QgKiBwZW5kaW5nX2Fzc29jX3JlcTsKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGluX3Byb2dyZXNzX2Fzc29jX3JlcTsKLQl1aW50MTZfdCBlbmFibGVod2F1dG87Ci0KLQkvKiBBREhPQyAqLwotCXUxNiBiZWFjb25fcGVyaW9kOwotCXU4IGJlYWNvbl9lbmFibGU7Ci0JdTggYWRob2NjcmVhdGU7Ci0KLQkvKiBXRVhUICovCi0JY2hhciBuYW1lW0RFVl9OQU1FX0xFTl07Ci0JdTggbm9kZW5hbWVbMTZdOwotCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKLQl1OCBjdXJfcmF0ZTsKLSNkZWZpbmUJTUFYX1JFR0lPTl9DSEFOTkVMX05VTQkyCi0Jc3RydWN0IHJlZ2lvbl9jaGFubmVsIHJlZ2lvbl9jaGFubmVsW01BWF9SRUdJT05fQ0hBTk5FTF9OVU1dOwotCi0JLyoqIFJlcXVlc3RlZCBTaWduYWwgU3RyZW5ndGgqLwotCXUxNiBTTlJbTUFYX1RZUEVfQl1bTUFYX1RZUEVfQVZHXTsKLQl1MTYgTkZbTUFYX1RZUEVfQl1bTUFYX1RZUEVfQVZHXTsKLQl1OCBSU1NJW01BWF9UWVBFX0JdW01BWF9UWVBFX0FWR107Ci0JdTggcmF3U05SW0RFRkFVTFRfREFUQV9BVkdfRkFDVE9SXTsKLQl1OCByYXdORltERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUl07Ci0JdTE2IG5leHRTTlJORjsKLQl1MTYgbnVtU05STkY7CiB9OwogCiBleHRlcm4gc3RydWN0IGNtZF9jb25maXJtX3NsZWVwIGNvbmZpcm1fc2xlZXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKaW5kZXggMzgwNGE1OC4uNTAxOTNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYwpAQCAtMiwxMyArMiw4IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlICJob3N0LmgiCiAjaW5jbHVkZSAiZGVjbC5oIgotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJkZXYuaCIKLSNpbmNsdWRlICJ3ZXh0LmgiCiAjaW5jbHVkZSAiY21kLmgiCi0jaW5jbHVkZSAibWVzaC5oIgogCiAKIHN0YXRpYyB2b2lkIGxic19ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC02OSwxNCArNjQsMTEgQEAKIHsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7CiAKLQlpZiAocHJpdi0+d29sX2NyaXRlcmlhID09IDB4ZmZmZmZmZmYpIHsKLQkJLyogSW50ZXJmYWNlIGRyaXZlciBkaWRuJ3QgY29uZmlndXJlIHdha2UgKi8KLQkJd29sLT5zdXBwb3J0ZWQgPSB3b2wtPndvbG9wdHMgPSAwOwotCQlyZXR1cm47Ci0JfQotCiAJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1VDQVNUfFdBS0VfTUNBU1R8V0FLRV9CQ0FTVHxXQUtFX1BIWTsKIAorCWlmIChwcml2LT53b2xfY3JpdGVyaWEgPT0gRUhTX1JFTU9WRV9XQUtFVVApCisJCXJldHVybjsKKwogCWlmIChwcml2LT53b2xfY3JpdGVyaWEgJiBFSFNfV0FLRV9PTl9VTklDQVNUX0RBVEEpCiAJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOwogCWlmIChwcml2LT53b2xfY3JpdGVyaWEgJiBFSFNfV0FLRV9PTl9NVUxUSUNBU1RfREFUQSkKQEAgLTkxLDIzICs4MywyMiBAQAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JdWludDMyX3QgY3JpdGVyaWEgPSAwOwogCiAJaWYgKHdvbC0+d29sb3B0cyAmIH4oV0FLRV9VQ0FTVHxXQUtFX01DQVNUfFdBS0VfQkNBU1R8V0FLRV9QSFkpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwlwcml2LT53b2xfY3JpdGVyaWEgPSAwOwogCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKQotCQljcml0ZXJpYSB8PSBFSFNfV0FLRV9PTl9VTklDQVNUX0RBVEE7CisJCXByaXYtPndvbF9jcml0ZXJpYSB8PSBFSFNfV0FLRV9PTl9VTklDQVNUX0RBVEE7CiAJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUNBU1QpCi0JCWNyaXRlcmlhIHw9IEVIU19XQUtFX09OX01VTFRJQ0FTVF9EQVRBOworCQlwcml2LT53b2xfY3JpdGVyaWEgfD0gRUhTX1dBS0VfT05fTVVMVElDQVNUX0RBVEE7CiAJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfQkNBU1QpCi0JCWNyaXRlcmlhIHw9IEVIU19XQUtFX09OX0JST0FEQ0FTVF9EQVRBOworCQlwcml2LT53b2xfY3JpdGVyaWEgfD0gRUhTX1dBS0VfT05fQlJPQURDQVNUX0RBVEE7CiAJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfUEhZKQotCQljcml0ZXJpYSB8PSBFSFNfV0FLRV9PTl9NQUNfRVZFTlQ7CisJCXByaXYtPndvbF9jcml0ZXJpYSB8PSBFSFNfV0FLRV9PTl9NQUNfRVZFTlQ7CiAJaWYgKHdvbC0+d29sb3B0cyA9PSAwKQotCQljcml0ZXJpYSB8PSBFSFNfUkVNT1ZFX1dBS0VVUDsKLQotCXJldHVybiBsYnNfaG9zdF9zbGVlcF9jZmcocHJpdiwgY3JpdGVyaWEsIChzdHJ1Y3Qgd29sX2NvbmZpZyAqKU5VTEwpOworCQlwcml2LT53b2xfY3JpdGVyaWEgfD0gRUhTX1JFTU9WRV9XQUtFVVA7CisJcmV0dXJuIDA7CiB9CiAKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBsYnNfZXRodG9vbF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0LmgKaW5kZXggMzgwOWMwYi4uNWVhYzEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3QuaApAQCAtOTQsMTEgKzk0LDkgQEAKICNkZWZpbmUgQ01EXzgwMl8xMV9CRUFDT05fQ1RSTCAgICAgICAgICAgICAgICAgIDB4MDBiMAogCiAvKiBGb3IgdGhlIElFRUUgUG93ZXIgU2F2ZSAqLwotI2RlZmluZSBDTURfU1VCQ01EX0VOVEVSX1BTICAgICAgICAgICAgICAgICAgICAgMHgwMDMwCi0jZGVmaW5lIENNRF9TVUJDTURfRVhJVF9QUyAgICAgICAgICAgICAgICAgICAgICAweDAwMzEKLSNkZWZpbmUgQ01EX1NVQkNNRF9TTEVFUF9DT05GSVJNRUQgICAgICAgICAgICAgIDB4MDAzNAotI2RlZmluZSBDTURfU1VCQ01EX0ZVTExfUE9XRVJET1dOICAgICAgICAgICAgICAgMHgwMDM1Ci0jZGVmaW5lIENNRF9TVUJDTURfRlVMTF9QT1dFUlVQICAgICAgICAgICAgICAgICAweDAwMzYKKyNkZWZpbmUgUFNfTU9ERV9BQ1RJT05fRU5URVJfUFMgICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBQU19NT0RFX0FDVElPTl9FWElUX1BTICAgICAgICAgICAgICAgICAgMHgwMDMxCisjZGVmaW5lIFBTX01PREVfQUNUSU9OX1NMRUVQX0NPTkZJUk1FRCAgICAgICAgICAweDAwMzQKIAogI2RlZmluZSBDTURfRU5BQkxFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIENNRF9ESVNBQkxFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKQEAgLTE2MywxMSArMTYxLDYgQEAKICNkZWZpbmUgQ01EX0FDVF9TRVRfVFhfRklYX1JBVEUgICAgICAgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBDTURfQUNUX0dFVF9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCiAKLS8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1BTX01PREUgKi8KLSNkZWZpbmUgQ01EX1RZUEVfQ0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBDTURfVFlQRV9NQVhfUFNQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIENNRF9UWVBFX0ZBU1RfUFNQICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKLQogLyogT3B0aW9ucyBmb3IgQ01EXzgwMl8xMV9GV19XQUtFX01FVEhPRCAqLwogI2RlZmluZSBDTURfV0FLRV9NRVRIT0RfVU5DSEFOR0VEICAgICAgICAgICAgICAgMHgwMDAwCiAjZGVmaW5lIENNRF9XQUtFX01FVEhPRF9DT01NQU5EX0lOVCAgICAgICAgICAgICAweDAwMDEKQEAgLTMyNiw3ICszMTksNyBAQAogCXU4IHBrdGRlbGF5XzJtczsKIAkvKiByZXNlcnZlZCAqLwogCXU4IHJlc2VydmVkMTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogUnhQRCBEZXNjcmlwdG9yICovCiBzdHJ1Y3QgcnhwZCB7CkBAIC0zMzksOCArMzMyLDggQEAKIAkJCXU4IGJzc190eXBlOwogCQkJLyogQlNTIG51bWJlciAqLwogCQkJdTggYnNzX251bTsKLQkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYnNzOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHU7CisJCX0gX19wYWNrZWQgYnNzOworCX0gX19wYWNrZWQgdTsKIAogCS8qIFNOUiAqLwogCXU4IHNucjsKQEAgLTM2NiwxNCArMzU5LDE0IEBACiAJLyogUGt0IFByaW9yaXR5ICovCiAJdTggcHJpb3JpdHk7CiAJdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfaGVhZGVyIHsKIAlfX2xlMTYgY29tbWFuZDsKIAlfX2xlMTYgc2l6ZTsKIAlfX2xlMTYgc2VxbnVtOwogCV9fbGUxNiByZXN1bHQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIEdlbmVyaWMgc3RydWN0dXJlIHRvIGhvbGQgYWxsIGtleSB0eXBlcy4gKi8KIHN0cnVjdCBlbmNfa2V5IHsKQEAgLTM4Nyw3ICszODAsMjMgQEAKIHN0cnVjdCBsYnNfb2Zmc2V0X3ZhbHVlIHsKIAl1MzIgb2Zmc2V0OwogCXUzMiB2YWx1ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNQVhfMTFEX1RSSVBMRVRTCTgzCisKK3N0cnVjdCBtcnZsX2llX2RvbWFpbl9wYXJhbV9zZXQgeworCXN0cnVjdCBtcnZsX2llX2hlYWRlciBoZWFkZXI7CisKKwl1OCBjb3VudHJ5X2NvZGVbM107CisJc3RydWN0IGllZWU4MDIxMV9jb3VudHJ5X2llX3RyaXBsZXQgdHJpcGxldFtNQVhfMTFEX1RSSVBMRVRTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjbWRfZHNfODAyXzExZF9kb21haW5faW5mbyB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCisJX19sZTE2IGFjdGlvbjsKKwlzdHJ1Y3QgbXJ2bF9pZV9kb21haW5fcGFyYW1fc2V0IGRvbWFpbjsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBEZWZpbmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIENNRF9HRVRfSFdfU1BFQwpAQCAtNDI2LDcgKzQzNSw3IEBACiAKIAkvKkZXL0hXIGNhcGFiaWxpdHkgKi8KIAlfX2xlMzIgZndjYXBpbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTQ0MCw3ICs0NDksNyBAQAogCSAqIGJ1bXAgdGhpcyB1cCBhIGJpdC4KIAkgKi8KIAl1aW50OF90IHRsdlsxMjhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogVGhpcyBzY2FuIGhhbmRsZSBDb3VudHJ5IEluZm9ybWF0aW9uIElFKDgwMi4xMWQgY29tcGxpYW50KQpAQCAtNDUyLDcgKzQ2MSw3IEBACiAJdWludDhfdCBic3N0eXBlOwogCXVpbnQ4X3QgYnNzaWRbRVRIX0FMRU5dOwogCXVpbnQ4X3QgdGx2YnVmZmVyWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuX3JzcCB7CiAJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwpAQCAtNDYwLDcgKzQ2OSw3IEBACiAJX19sZTE2IGJzc2Rlc2NyaXB0c2l6ZTsKIAl1aW50OF90IG5yX3NldHM7CiAJdWludDhfdCBic3NkZXNjX2FuZF90bHZidWZmZXJbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTQ3OCwyMCArNDg3LDIwIEBACiAJX19sZTMyIGZjc2Vycm9yOwogCV9fbGUzMiB0eGZyYW1lOwogCV9fbGUzMiB3ZXB1bmRlY3J5cHRhYmxlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CiAJX19sZTE2IGFjdGlvbjsKIAl1MTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfbWFjX211bHRpY2FzdF9hZHIgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAlfX2xlMTYgYWN0aW9uOwogCV9fbGUxNiBucl9vZl9hZHJzOwogCXU4IG1hY2xpc3RbRVRIX0FMRU4gKiBNUlZEUlZfTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTQ5OSwxNCArNTA4LDE0IEBACiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IGF1dGh0eXBlOwogCXU4IHJlc2VydmVkWzEwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfZGVhdXRoZW50aWNhdGUgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAogCXU4IG1hY2FkZHJbRVRIX0FMRU5dOwogCV9fbGUxNiByZWFzb25jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGUgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTUxNyw3ICs1MjYsNyBAQAogCV9fbGUxNiBiY25wZXJpb2Q7CiAJdTggZHRpbXBlcmlvZDsKIAl1OCBpZWJ1Zls1MTJdOyAgICAvKiBFbm91Z2ggZm9yIHJlcXVpcmVkIGFuZCBtb3N0IG9wdGlvbmFsIElFcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGVfcmVzcG9uc2UgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTUyNiw3ICs1MzUsNyBAQAogCV9fbGUxNiBzdGF0dXNjb2RlOwogCV9fbGUxNiBhaWQ7CiAJdTggaWVidWZbNTEyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCB7CiAJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwpAQCAtNTQwLDcgKzU0OSw3IEBACiAJLyogNDAsIDEyOGJpdCBvciBUWFdFUCAqLwogCXVpbnQ4X3Qga2V5dHlwZVs0XTsKIAl1aW50OF90IGtleW1hdGVyaWFsWzRdWzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfc25tcF9taWIgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTU0OSw0MCArNTU4LDMzIEBACiAJX19sZTE2IG9pZDsKIAlfX2xlMTYgYnVmc2l6ZTsKIAl1OCB2YWx1ZVsxMjhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCi1zdHJ1Y3QgY21kX2RzX21hY19yZWdfYWNjZXNzIHsKK3N0cnVjdCBjbWRfZHNfcmVnX2FjY2VzcyB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCiAJX19sZTE2IGFjdGlvbjsKIAlfX2xlMTYgb2Zmc2V0OwotCV9fbGUzMiB2YWx1ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzIHsKLQlfX2xlMTYgYWN0aW9uOwotCV9fbGUxNiBvZmZzZXQ7Ci0JdTggdmFsdWU7Ci0JdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGNtZF9kc19yZl9yZWdfYWNjZXNzIHsKLQlfX2xlMTYgYWN0aW9uOwotCV9fbGUxNiBvZmZzZXQ7Ci0JdTggdmFsdWU7Ci0JdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1bmlvbiB7CisJCXU4IGJicF9yZjsgIC8qIGZvciBCQlAgYW5kIFJGIHJlZ2lzdGVycyAqLworCQlfX2xlMzIgbWFjOyAvKiBmb3IgTUFDIHJlZ2lzdGVycyAqLworCX0gdmFsdWU7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYWRpb19jb250cm9sIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CiAKIAlfX2xlMTYgYWN0aW9uOwogCV9fbGUxNiBjb250cm9sOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9iZWFjb25fY29udHJvbCB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCiAJX19sZTE2IGFjdGlvbjsKIAlfX2xlMTYgYmVhY29uX2VuYWJsZTsKIAlfX2xlMTYgYmVhY29uX3BlcmlvZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfc2xlZXBfcGFyYW1zIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CkBAIC02MDcsNyArNjA5LDcgQEAKIAogCS8qIHJlc2VydmVkIGZpZWxkLCBzaG91bGQgYmUgc2V0IHRvIHplcm8gKi8KIAlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX3JmX2NoYW5uZWwgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTYxNywzMCArNjE5LDMwIEBACiAJX19sZTE2IHJmdHlwZTsgICAgICAvKiB1bnVzZWQgKi8KIAlfX2xlMTYgcmVzZXJ2ZWQ7ICAgIC8qIHVudXNlZCAqLwogCXU4IGNoYW5uZWxsaXN0WzMyXTsgLyogdW51c2VkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2kgewotCS8qIHdlaWdodGluZyBmYWN0b3IgKi8KLQlfX2xlMTYgTjsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CiAKLQlfX2xlMTYgcmVzZXJ2ZWRfMDsKLQlfX2xlMTYgcmVzZXJ2ZWRfMTsKLQlfX2xlMTYgcmVzZXJ2ZWRfMjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCS8qIHJlcXVlc3Q6ICBudW1iZXIgb2YgYmVhY29ucyAoTikgdG8gYXZlcmFnZSB0aGUgU05SIGFuZCBORiBvdmVyCisJICogcmVzcG9uc2U6IFNOUiBvZiBtb3N0IHJlY2VudCBiZWFjb24KKwkgKi8KKwlfX2xlMTYgbl9vcl9zbnI7CiAKLXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2lfcnNwIHsKLQlfX2xlMTYgU05SOwotCV9fbGUxNiBub2lzZWZsb29yOwotCV9fbGUxNiBhdmdTTlI7Ci0JX19sZTE2IGF2Z25vaXNlZmxvb3I7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBzZXQgaW4gdGhlIHJlc3BvbnNlLgorCSAqIEluIHRoZSByZXF1ZXN0IHRoZXNlIGFyZSByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHNldCB0byAwLgorCSAqLworCV9fbGUxNiBuZjsgICAgICAgLyogbW9zdCByZWNlbnQgYmVhY29uIG5vaXNlIGZsb29yICovCisJX19sZTE2IGF2Z19zbnI7ICAvKiBhdmVyYWdlIFNOUiB3ZWlnaHRlZCBieSBOIGZyb20gcmVxdWVzdCAqLworCV9fbGUxNiBhdmdfbmY7ICAgLyogYXZlcmFnZSBub2lzZSBmbG9vciB3ZWlnaHRlZCBieSBOIGZyb20gcmVxdWVzdCAqLworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfbWFjX2FkZHJlc3MgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAogCV9fbGUxNiBhY3Rpb247CiAJdTggbWFjYWRkW0VUSF9BTEVOXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfcmZfdHhfcG93ZXIgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTY0OSwzNCArNjUxLDYxIEBACiAJX19sZTE2IGN1cmxldmVsOwogCXM4IG1heGxldmVsOwogCXM4IG1pbmxldmVsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCisvKiBNT05JVE9SX01PREUgb25seSBleGlzdHMgaW4gT0xQQyB2NSBmaXJtd2FyZSAqLwogc3RydWN0IGNtZF9kc184MDJfMTFfbW9uaXRvcl9tb2RlIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKIAlfX2xlMTYgYWN0aW9uOwogCV9fbGUxNiBtb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzX3NldF9ib290Ml92ZXIgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAogCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IHZlcnNpb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX2Z3X3dha2VfbWV0aG9kIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CiAKIAlfX2xlMTYgYWN0aW9uOwogCV9fbGUxNiBtZXRob2Q7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKwogCV9fbGUxNiBhY3Rpb247CisKKwkvKiBJbnRlcnZhbCBmb3Iga2VlcGFsaXZlIGluIFBTIG1vZGU6CisJICogMHgwMDAwID0gZG9uJ3QgY2hhbmdlCisJICogMHgwMDFFID0gZmlybXdhcmUgZGVmYXVsdAorCSAqIDB4RkZGRiA9IGRpc2FibGUKKwkgKi8KIAlfX2xlMTYgbnVsbHBrdGludGVydmFsOworCisJLyogTnVtYmVyIG9mIERUSU0gaW50ZXJ2YWxzIHRvIHdha2UgdXAgZm9yOgorCSAqIDAgPSBkb24ndCBjaGFuZ2UKKwkgKiAxID0gZmlybXdhcmUgZGVmYXVsdAorCSAqIDUgPSBtYXgKKwkgKi8KIAlfX2xlMTYgbXVsdGlwbGVkdGltOworCiAJX19sZTE2IHJlc2VydmVkOwogCV9fbGUxNiBsb2NhbGxpc3RlbmludGVydmFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKwkvKiBBZEhvYyBhd2FrZSBwZXJpb2QgKEZXIHY5KyBvbmx5KToKKwkgKiAwID0gZG9uJ3QgY2hhbmdlCisJICogMSA9IGFsd2F5cyBhd2FrZSAoSUVFRSBzdGFuZGFyZCBiZWhhdmlvcikKKwkgKiAyIC0gMzEgPSBzbGVlcCBmb3IgKG4gLSAxKSBwZXJpb2RzIGFuZCBhd2FrZSBmb3IgMSBwZXJpb2QKKwkgKiAzMiAtIDI1NCA9IGludmFsaWQKKwkgKiAyNTUgPSBzbGVlcCBhdCBlYWNoIEFUSU0KKwkgKi8KKwlfX2xlMTYgYWRob2NfYXdha2VfcGVyaW9kOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9jb25maXJtX3NsZWVwIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CkBAIC02ODYsNyArNzE1LDcgQEAKIAlfX2xlMTYgbXVsdGlwbGVkdGltOwogCV9fbGUxNiByZXNlcnZlZDsKIAlfX2xlMTYgbG9jYWxsaXN0ZW5pbnRlcnZhbDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfZGF0YV9yYXRlIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CkBAIC02OTQsMTQgKzcyMywxNCBAQAogCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IHJlc2VydmVkOwogCXU4IHJhdGVzW01BWF9SQVRFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCB7CiAJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwogCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IGVuYWJsZWh3YXV0bzsKIAlfX2xlMTYgYml0bWFwOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTcxOCwxNCArNzQ3LDE0IEBACiAJX19sZTE2IGNhcGFiaWxpdHk7CiAJdTggcmF0ZXNbTUFYX1JBVEVTXTsKIAl1OCB0bHZfbWVtb3J5X3NpemVfcGFkWzEwMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAogCXU4IHBhZFszXTsKIAl1OCBic3NpZFtFVEhfQUxFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhZGhvY19ic3NkZXNjIHsKIAl1OCBic3NpZFtFVEhfQUxFTl07CkBAIC03NDYsNyArNzc1LDcgQEAKIAkgKiBBZGhvYyBqb2luIGNvbW1hbmQgYW5kIHdpbGwgY2F1c2UgYSBiaW5hcnkgbGF5b3V0IG1pc21hdGNoIHdpdGgKIAkgKiB0aGUgZmlybXdhcmUKIAkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX2pvaW4gewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTc1NCwxOCArNzgzLDE4IEBACiAJc3RydWN0IGFkaG9jX2Jzc2Rlc2MgYnNzOwogCV9fbGUxNiBmYWlsdGltZW91dDsgICAvKiBSZXNlcnZlZCBvbiB2OSBhbmQgbGF0ZXIgKi8KIAlfX2xlMTYgcHJvYmVkZWxheTsgICAgLyogUmVzZXJ2ZWQgb24gdjkgYW5kIGxhdGVyICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdG9wIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX2VuYWJsZV9yc24gewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAogCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IGVuYWJsZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IE1ydmxJRXR5cGVfa2V5UGFyYW1TZXQgewogCS8qIHR5cGUgSUQgKi8KQEAgLTc4NSw3ICs4MTQsNyBAQAogCiAJLyoga2V5IG1hdGVyaWFsIG9mIHNpemUga2V5bGVuICovCiAJdTgga2V5WzMyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNQVhfV09MX1JVTEVTIAkJMTYKIApAQCAtNzk3LDcgKzgyNiw3IEBACiAJX19sZTE2IHJlc2VydmU7CiAJX19iZTMyIHNpZ19tYXNrOwogCV9fYmUzMiBzaWduYXR1cmU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3b2xfY29uZmlnIHsKIAl1aW50OF90IGFjdGlvbjsKQEAgLTgwNSw3ICs4MzQsNyBAQAogCXVpbnQ4X3Qgbm9fcnVsZXNfaW5fY21kOwogCXVpbnQ4X3QgcmVzdWx0OwogCXN0cnVjdCBob3N0X3dvbF9ydWxlIHJ1bGVbTUFYX1dPTF9SVUxFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfaG9zdF9zbGVlcCB7CiAJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwpAQCAtODEzLDcgKzg0Miw3IEBACiAJdWludDhfdCBncGlvOwogCXVpbnQxNl90IGdhcDsKIAlzdHJ1Y3Qgd29sX2NvbmZpZyB3b2xfY29uZjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAKQEAgLTgyMiw3ICs4NTEsNyBAQAogCiAJX19sZTE2IGFjdGlvbjsKIAlzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCBrZXlQYXJhbVNldFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfZWVwcm9tX2FjY2VzcyB7CiAJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwpAQCAtODMyLDcgKzg2MSw3IEBACiAJLyogZmlybXdhcmUgc2F5cyBpdCByZXR1cm5zIGEgbWF4aW11bSBvZiAyMCBieXRlcyAqLwogI2RlZmluZSBMQlNfRUVQUk9NX1JFQURfTEVOIDIwCiAJdTggdmFsdWVbTEJTX0VFUFJPTV9SRUFEX0xFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKQEAgLTg0Myw3ICs4NzIsNyBAQAogCWludDhfdCBQMTsKIAlpbnQ4X3QgUDI7CiAJdWludDhfdCB1c2VzbnI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogc3RydWN0IGNtZF9kc184MDJfMTFfcGFfY2ZnIHsKQEAgLTg1NCwxNiArODgzLDIxIEBACiAJaW50OF90IFAwOwogCWludDhfdCBQMTsKIAlpbnQ4X3QgUDI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKwogCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IG51bWxlZDsKIAl1OCBkYXRhWzI1Nl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKKy8qIEF1dG9tYXRpYyBGcmVxdWVuY3kgQ29udHJvbCAqLwogc3RydWN0IGNtZF9kc184MDJfMTFfYWZjIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKIAlfX2xlMTYgYWZjX2F1dG87CiAJdW5pb24gewogCQlzdHJ1Y3QgewpAQCAtODc1LDI0ICs5MDksMjggQEAKIAkJCV9fbGUxNiBjYXJyaWVyX29mZnNldDsgLyogc2lnbmVkICovCiAJCX07CiAJfTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF90eF9yYXRlX3F1ZXJ5IHsKIAlfX2xlMTYgdHhyYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzX2dldF90c2YgewogCV9fbGU2NCB0c2Z2YWx1ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKwogCV9fbGUxNiBhY3Rpb247CiAJX19sZTMyIGlkOwogCXU4IGFkZHIxW0VUSF9BTEVOXTsKIAl1OCBhZGRyMltFVEhfQUxFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCiAJX19sZTE2IGFjdGlvbjsKIAlfX2xlMzIgaWQ7CiAJdTggdmFsaWQ7CkBAIC05MTAsNyArOTQ4LDcgQEAKIAlfX2xlMzIgc25yOwogCV9fbGUzMiByZWZlcmVuY2VzOwogCXU4IHByZWNbRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzX21lc2hfY29uZmlnIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CkBAIC05MjAsNDMgKzk1OCwxNSBAQAogCV9fbGUxNiB0eXBlOwogCV9fbGUxNiBsZW5ndGg7CiAJdTggZGF0YVsxMjhdOwkvKiBsYXN0IHBvc2l0aW9uIHJlc2VydmVkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgewogCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKIAogCV9fbGUxNiBhY3Rpb247CiAJX19sZTMyIGRhdGFbMzJdOwkvKiBsYXN0IHBvc2l0aW9uIHJlc2VydmVkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE51bWJlciBvZiBzdGF0cyBjb3VudGVycyByZXR1cm5lZCBieSB0aGUgZmlybXdhcmUgKi8KICNkZWZpbmUgTUVTSF9TVEFUU19OVU0gOAotCi1zdHJ1Y3QgY21kX2RzX2NvbW1hbmQgewotCS8qIGNvbW1hbmQgaGVhZGVyICovCi0JX19sZTE2IGNvbW1hbmQ7Ci0JX19sZTE2IHNpemU7Ci0JX19sZTE2IHNlcW51bTsKLQlfX2xlMTYgcmVzdWx0OwotCi0JLyogY29tbWFuZCBCb2R5ICovCi0JdW5pb24gewotCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlIHBzbW9kZTsKLQkJc3RydWN0IGNtZF9kc184MDJfMTFfbW9uaXRvcl9tb2RlIG1vbml0b3I7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2kgcnNzaTsKLQkJc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaV9yc3AgcnNzaXJzcDsKLQkJc3RydWN0IGNtZF9kc19tYWNfcmVnX2FjY2VzcyBtYWNyZWc7Ci0JCXN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgYmJwcmVnOwotCQlzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgcmZyZWc7Ci0KLQkJc3RydWN0IGNtZF9kc184MDJfMTFfdHBjX2NmZyB0cGNjZmc7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX2FmYyBhZmM7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX2xlZF9jdHJsIGxlZGdwaW87Ci0KLQkJc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgYnQ7Ci0JCXN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3Q7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX2JlYWNvbl9jb250cm9sIGJjbl9jdHJsOwotCX0gcGFyYW1zOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2NzLmMKaW5kZXggMDhlNGUzOS4uOWMyOTgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9jcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTgwMiw5ICs4MDEsOSBAQAogCQkJIHVuc2lnbmVkIGludCB2Y2MsCiAJCQkgdm9pZCAqcHJpdl9kYXRhKQogewotCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZmctPmlvLndpblswXS5iYXNlOwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBjZmctPmlvLndpblswXS5sZW47CisJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGNmZy0+aW8ud2luWzBdLmxlbjsKIAogCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwogCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwpAQCAtODE2LDcgKzgxNSw3IEBACiAJfQogCiAJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2Rldik7CiB9CiAKIHN0YXRpYyBpbnQgaWZfY3NfcHJvYmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQpAQCAtODU0LDcgKzg1Myw4IEBACiAJCWdvdG8gb3V0MTsKIAogCS8qIEluaXRpYWxpemUgaW8gYWNjZXNzICovCi0JY2FyZC0+aW9iYXNlID0gaW9wb3J0X21hcChwX2Rldi0+aW8uQmFzZVBvcnQxLCBwX2Rldi0+aW8uTnVtUG9ydHMxKTsKKwljYXJkLT5pb2Jhc2UgPSBpb3BvcnRfbWFwKHBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShwX2Rldi0+cmVzb3VyY2VbMF0pKTsKIAlpZiAoIWNhcmQtPmlvYmFzZSkgewogCQlsYnNfcHJfZXJyKCJlcnJvciBpbiBpb3BvcnRfbWFwXG4iKTsKIAkJcmV0ID0gLUVJTzsKQEAgLTg3Myw5ICs4NzMsNyBAQAogCX0KIAogCS8qIEZpbmFsbHksIHJlcG9ydCB3aGF0IHdlJ3ZlIGRvbmUgKi8KLQlsYnNfZGViX2NzKCJpcnEgJWQsIGlvIDB4JTA0eC0weCUwNHhcbiIsCi0JICAgICAgIHBfZGV2LT5pcnEsIHBfZGV2LT5pby5CYXNlUG9ydDEsCi0JICAgICAgIHBfZGV2LT5pby5CYXNlUG9ydDEgKyBwX2Rldi0+aW8uTnVtUG9ydHMxIC0gMSk7CisJbGJzX2RlYl9jcygiaXJxICVkLCBpbyAlcFIiLCBwX2Rldi0+aXJxLCBwX2Rldi0+cmVzb3VyY2VbMF0pOwogCiAJLyoKIAkgKiBNb3N0IG9mIHRoZSBsaWJlcnRhcyBjYXJkcyBjYW4gZG8gdW5hbGlnbmVkIHJlZ2lzdGVyIGFjY2VzcywgYnV0IHNvbWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYwppbmRleCA2NGRkMzQ1Li42ZTcxMzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCkBAIC0xMTgyLDExICsxMTgyLDY5IEBACiAJbGJzX2RlYl9sZWF2ZShMQlNfREVCX1NESU8pOwogfQogCitzdGF0aWMgaW50IGlmX3NkaW9fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBpZl9zZGlvX2NhcmQgKmNhcmQgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCisJbW1jX3BtX2ZsYWdfdCBmbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKKworCWxic19wcl9pbmZvKCIlczogc3VzcGVuZDogUE0gZmxhZ3MgPSAweCV4XG4iLAorCQkJCQkJc2Rpb19mdW5jX2lkKGZ1bmMpLCBmbGFncyk7CisKKwkvKiBJZiB3ZSBhcmVuJ3QgYmVpbmcgYXNrZWQgdG8gd2FrZSBvbiBhbnl0aGluZywgd2Ugc2hvdWxkIGJhaWwgb3V0CisJICogYW5kIGxldCB0aGUgU0Qgc3RhY2sgcG93ZXIgZG93biB0aGUgY2FyZC4KKwkgKi8KKwlpZiAoY2FyZC0+cHJpdi0+d29sX2NyaXRlcmlhID09IEVIU19SRU1PVkVfV0FLRVVQKSB7CisJCWxic19wcl9pbmZvKCJTdXNwZW5kIHdpdGhvdXQgd2FrZSBwYXJhbXMgLS0gIgorCQkJCQkJInBvd2VyaW5nIGRvd24gY2FyZC4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKCEoZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikpIHsKKwkJbGJzX3ByX2VycigiJXM6IGNhbm5vdCByZW1haW4gYWxpdmUgd2hpbGUgaG9zdCBpcyBzdXNwZW5kZWRcbiIsCisJCQlzZGlvX2Z1bmNfaWQoZnVuYykpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9LRUVQX1BPV0VSKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbGJzX3N1c3BlbmQoY2FyZC0+cHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9XQUtFX1NESU9fSVJRKTsKK30KKworc3RhdGljIGludCBpZl9zZGlvX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZGV2KTsKKwlzdHJ1Y3QgaWZfc2Rpb19jYXJkICpjYXJkID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlpbnQgcmV0OworCisJbGJzX3ByX2luZm8oIiVzOiByZXN1bWU6IHdlJ3JlIGJhY2tcbiIsIHNkaW9fZnVuY19pZChmdW5jKSk7CisKKwlyZXQgPSBsYnNfcmVzdW1lKGNhcmQtPnByaXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGlmX3NkaW9fcG1fb3BzID0geworCS5zdXNwZW5kCT0gaWZfc2Rpb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWZfc2Rpb19yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHNkaW9fZHJpdmVyIGlmX3NkaW9fZHJpdmVyID0gewogCS5uYW1lCQk9ICJsaWJlcnRhc19zZGlvIiwKIAkuaWRfdGFibGUJPSBpZl9zZGlvX2lkcywKIAkucHJvYmUJCT0gaWZfc2Rpb19wcm9iZSwKIAkucmVtb3ZlCQk9IGlmX3NkaW9fcmVtb3ZlLAorCS5kcnYgPSB7CisJCS5wbSA9ICZpZl9zZGlvX3BtX29wcywKKwl9LAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCmluZGV4IGY0MTU5NGMuLjA3ZWNlOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCkBAIC00MzMsNyArNDMzLDcgQEAKIAogc3RhdGljIGludCBpZl91c2JfcmVzZXRfZGV2aWNlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApCiB7Ci0Jc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQgPSBjYXJkcC0+ZXBfb3V0X2J1ZiArIDQ7CisJc3RydWN0IGNtZF9oZWFkZXIgKmNtZCA9IGNhcmRwLT5lcF9vdXRfYnVmICsgNDsKIAlpbnQgcmV0OwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1VTQik7CkBAIC00NDEsNyArNDQxLDcgQEAKIAkqKF9fbGUzMiAqKWNhcmRwLT5lcF9vdXRfYnVmID0gY3B1X3RvX2xlMzIoQ01EX1RZUEVfUkVRVUVTVCk7CiAKIAljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX1JFU0VUKTsKLQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9oZWFkZXIpKTsKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CiAJY21kLT5yZXN1bHQgPSBjcHVfdG9fbGUxNigwKTsKIAljbWQtPnNlcW51bSA9IGNwdV90b19sZTE2KDB4NWE1YSk7CiAJdXNiX3R4X2Jsb2NrKGNhcmRwLCBjYXJkcC0+ZXBfb3V0X2J1ZiwgNCArIHNpemVvZihzdHJ1Y3QgY21kX2hlYWRlcikpOwpAQCAtNjEzLDE2ICs2MTMsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCXN5bmNmd2hlYWRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmd3N5bmNoZWFkZXIpLCBHRlBfQVRPTUlDKTsKKwlzeW5jZndoZWFkZXIgPSBrbWVtZHVwKHNrYi0+ZGF0YSArIElQRklFTERfQUxJR05fT0ZGU0VULAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZndzeW5jaGVhZGVyKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzeW5jZndoZWFkZXIpIHsKIAkJbGJzX2RlYl91c2JkKCZjYXJkcC0+dWRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvY2F0ZSBzeW5jZndoZWFkZXJcbiIpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KIAotCW1lbWNweShzeW5jZndoZWFkZXIsIHNrYi0+ZGF0YSArIElQRklFTERfQUxJR05fT0ZGU0VULAotCSAgICAgICBzaXplb2Yoc3RydWN0IGZ3c3luY2hlYWRlcikpOwotCiAJaWYgKCFzeW5jZndoZWFkZXItPmNtZCkgewogCQlsYnNfZGViX3VzYjIoJmNhcmRwLT51ZGV2LT5kZXYsICJGVyByZWNlaXZlZCBCbGsgd2l0aCBjb3JyZWN0IENSQ1xuIik7CiAJCWxic19kZWJfdXNiMigmY2FyZHAtPnVkZXYtPmRldiwgIkZXIHJlY2VpdmVkIEJsayBzZXFudW0gPSAlZFxuIiwKQEAgLTEwNDMsNiArMTA0MSwxMiBAQAogCWlmIChwcml2LT5wc3N0YXRlICE9IFBTX1NUQVRFX0ZVTExfUE9XRVIpCiAJCXJldHVybiAtMTsKIAorCWlmIChwcml2LT53b2xfY3JpdGVyaWEgPT0gRUhTX1JFTU9WRV9XQUtFVVApIHsKKwkJbGJzX3ByX2luZm8oIlN1c3BlbmQgYXR0ZW1wdCB3aXRob3V0ICIKKwkJCQkJCSJjb25maWd1cmluZyB3YWtlIHBhcmFtcyFcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKIAlyZXQgPSBsYnNfc3VzcGVuZChwcml2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwppbmRleCBkOWI4ZWUxLi4yNTg5NjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCkBAIC0xMSwyMCArMTEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KIAogI2luY2x1ZGUgImhvc3QuaCIKICNpbmNsdWRlICJkZWNsLmgiCiAjaW5jbHVkZSAiZGV2LmgiCi0jaW5jbHVkZSAid2V4dC5oIgogI2luY2x1ZGUgImNmZy5oIgogI2luY2x1ZGUgImRlYnVnZnMuaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiYXNzb2MuaCIKICNpbmNsdWRlICJjbWQuaCIKIAogI2RlZmluZSBEUklWRVJfUkVMRUFTRV9WRVJTSU9OICIzMjMucDAiCkBAIC05Niw3MiArOTAsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgbGJzX2FkZF9ydGFwKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7Ci1zdGF0aWMgdm9pZCBsYnNfcmVtb3ZlX3J0YXAoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKLQotCi0vKioKLSAqIEdldCBmdW5jdGlvbiBmb3Igc3lzZnMgYXR0cmlidXRlIHJ0YXAKLSAqLwotc3RhdGljIHNzaXplX3QgbGJzX3J0YXBfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gdG9fbmV0X2RldihkZXYpLT5tbF9wcml2OwotCXJldHVybiBzbnByaW50ZihidWYsIDUsICIweCVYXG4iLCBwcml2LT5tb25pdG9ybW9kZSk7Ci19Ci0KLS8qKgotICogIFNldCBmdW5jdGlvbiBmb3Igc3lzZnMgYXR0cmlidXRlIHJ0YXAKLSAqLwotc3RhdGljIHNzaXplX3QgbGJzX3J0YXBfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgbW9uaXRvcl9tb2RlOwotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IHRvX25ldF9kZXYoZGV2KS0+bWxfcHJpdjsKLQotCXNzY2FuZihidWYsICIleCIsICZtb25pdG9yX21vZGUpOwotCWlmIChtb25pdG9yX21vZGUpIHsKLQkJaWYgKHByaXYtPm1vbml0b3Jtb2RlID09IG1vbml0b3JfbW9kZSkKLQkJCXJldHVybiBzdHJsZW4oYnVmKTsKLQkJaWYgKCFwcml2LT5tb25pdG9ybW9kZSkgewotCQkJaWYgKHByaXYtPmluZnJhX29wZW4gfHwgbGJzX21lc2hfb3Blbihwcml2KSkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJaWYgKHByaXYtPm1vZGUgPT0gSVdfTU9ERV9JTkZSQSkKLQkJCQlsYnNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHByaXYsCi0JCQkJCQkJICAgICBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsCi0JCQkJCQkJICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCQllbHNlIGlmIChwcml2LT5tb2RlID09IElXX01PREVfQURIT0MpCi0JCQkJbGJzX2FkaG9jX3N0b3AocHJpdik7Ci0JCQlsYnNfYWRkX3J0YXAocHJpdik7Ci0JCX0KLQkJcHJpdi0+bW9uaXRvcm1vZGUgPSBtb25pdG9yX21vZGU7Ci0JfSBlbHNlIHsKLQkJaWYgKCFwcml2LT5tb25pdG9ybW9kZSkKLQkJCXJldHVybiBzdHJsZW4oYnVmKTsKLQkJcHJpdi0+bW9uaXRvcm1vZGUgPSAwOwotCQlsYnNfcmVtb3ZlX3J0YXAocHJpdik7Ci0KLQkJaWYgKHByaXYtPmN1cnJlbnR0eHNrYikgewotCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+Y3VycmVudHR4c2tiKTsKLQkJCXByaXYtPmN1cnJlbnR0eHNrYiA9IE5VTEw7Ci0JCX0KLQotCQkvKiBXYWtlIHF1ZXVlcywgY29tbWFuZCB0aHJlYWQsIGV0Yy4gKi8KLQkJbGJzX2hvc3RfdG9fY2FyZF9kb25lKHByaXYpOwotCX0KLQotCWxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKLQkJCUNNRF84MDJfMTFfTU9OSVRPUl9NT0RFLCBDTURfQUNUX1NFVCwKLQkJCUNNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgJnByaXYtPm1vbml0b3Jtb2RlKTsKLQlyZXR1cm4gc3RybGVuKGJ1Zik7Ci19Ci0KLS8qKgotICogbGJzX3J0YXAgYXR0cmlidXRlIHRvIGJlIGV4cG9ydGVkIHBlciBldGhYIGludGVyZmFjZQotICogdGhyb3VnaCBzeXNmcyAoL3N5cy9jbGFzcy9uZXQvZXRoWC9sYnNfcnRhcCkKLSAqLwotc3RhdGljIERFVklDRV9BVFRSKGxic19ydGFwLCAwNjQ0LCBsYnNfcnRhcF9nZXQsIGxic19ydGFwX3NldCApOwotCiAvKioKICAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZXRoWCBpbnRlcmZhY2UKICAqCkBAIC0xNzcsMTMgKzEwNSw2IEBACiAKIAlzcGluX2xvY2tfaXJxKCZwcml2LT5kcml2ZXJfbG9jayk7CiAKLQlpZiAocHJpdi0+bW9uaXRvcm1vZGUpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwcml2LT5pbmZyYV9vcGVuID0gMTsKLQogCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKQogCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJZWxzZQpAQCAtMTkxLDcgKzExMiw2IEBACiAKIAlpZiAoIXByaXYtPnR4X3BlbmRpbmdfbGVuKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0gb3V0OgogCiAJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5kcml2ZXJfbG9jayk7CiAJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfTkVULCAicmV0ICVkIiwgcmV0KTsKQEAgLTIxMSw3ICsxMzEsNiBAQAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9ORVQpOwogCiAJc3Bpbl9sb2NrX2lycSgmcHJpdi0+ZHJpdmVyX2xvY2spOwotCXByaXYtPmluZnJhX29wZW4gPSAwOwogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAlzcGluX3VubG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKIApAQCAtMjM4LDEyICsxNTcsNyBAQAogCSAgIHRvIGtpY2sgaXQgc29tZWhvdz8gKi8KIAlsYnNfaG9zdF90b19jYXJkX2RvbmUocHJpdik7CiAKLQkvKiBNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGlzIGFjdHVhbGx5IGhhcHBlbnMgYmVjYXVzZSB0aGUKLQkgICBmaXJtd2FyZSBoYXMgY3JhcHBlZCBpdHNlbGYgLS0gcmF0aGVyIHRoYW4ganVzdCBhIHZlcnkKLQkgICBidXN5IG1lZGl1bS4gU28gc2VuZCBhIGhhcm1sZXNzIGNvbW1hbmQsIGFuZCBpZi93aGVuCi0JICAgX3RoYXRfIHRpbWVzIG91dCwgd2UnbGwga2ljayBpdCBpbiB0aGUgaGVhZC4gKi8KLQlsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIENNRF84MDJfMTFfUlNTSSwgMCwKLQkJCQkgICAgIDAsIDAsIE5VTEwpOworCS8qIEZJWE1FOiByZXNldCB0aGUgY2FyZCAqLwogCiAJbGJzX2RlYl9sZWF2ZShMQlNfREVCX1RYKTsKIH0KQEAgLTU4OCwxMiArNTAyLDYgQEAKIAkJaWYgKCFwcml2LT5kbmxkX3NlbnQgJiYgIXByaXYtPmN1cl9jbWQpCiAJCQlsYnNfZXhlY3V0ZV9uZXh0X2NvbW1hbmQocHJpdik7CiAKLQkJLyogV2FrZS11cCBjb21tYW5kIHdhaXRlcnMgd2hpY2ggY2FuJ3Qgc2xlZXAgaW4KLQkJICogbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZAotCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5jbWRwZW5kaW5ncSkpCi0JCQl3YWtlX3VwX2FsbCgmcHJpdi0+Y21kX3BlbmRpbmcpOwotCiAJCXNwaW5fbG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKIAkJaWYgKCFwcml2LT5kbmxkX3NlbnQgJiYgcHJpdi0+dHhfcGVuZGluZ19sZW4gPiAwKSB7CiAJCQlpbnQgcmV0ID0gcHJpdi0+aHdfaG9zdF90b19jYXJkKHByaXYsIE1WTVNfREFULApAQCAtNjE5LDY2ICs1MjcsNTggQEAKIAogCWRlbF90aW1lcigmcHJpdi0+Y29tbWFuZF90aW1lcik7CiAJZGVsX3RpbWVyKCZwcml2LT5hdXRvX2RlZXBzbGVlcF90aW1lcik7Ci0Jd2FrZV91cF9hbGwoJnByaXYtPmNtZF9wZW5kaW5nKTsKIAogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9USFJFQUQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxic19zdXNwZW5kX2NhbGxiYWNrKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBkdW1teSwKLQkJCQlzdHJ1Y3QgY21kX2hlYWRlciAqY21kKQotewotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9GVyk7Ci0KLQluZXRpZl9kZXZpY2VfZGV0YWNoKHByaXYtPmRldik7Ci0JaWYgKHByaXYtPm1lc2hfZGV2KQotCQluZXRpZl9kZXZpY2VfZGV0YWNoKHByaXYtPm1lc2hfZGV2KTsKLQotCXByaXYtPmZ3X3JlYWR5ID0gMDsKLQlsYnNfZGViX2xlYXZlKExCU19ERUJfRlcpOwotCXJldHVybiAwOwotfQotCiBpbnQgbGJzX3N1c3BlbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2KQogewotCXN0cnVjdCBjbWRfaGVhZGVyIGNtZDsKIAlpbnQgcmV0OwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX0ZXKTsKIAotCWlmIChwcml2LT53b2xfY3JpdGVyaWEgPT0gMHhmZmZmZmZmZikgewotCQlsYnNfcHJfaW5mbygiU3VzcGVuZCBhdHRlbXB0IHdpdGhvdXQgY29uZmlndXJpbmcgd2FrZSBwYXJhbXMhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHByaXYtPmlzX2RlZXBfc2xlZXApIHsKKwkJcmV0ID0gbGJzX3NldF9kZWVwX3NsZWVwKHByaXYsIDApOworCQlpZiAocmV0KSB7CisJCQlsYnNfcHJfZXJyKCJkZWVwIHNsZWVwIGNhbmNlbGxhdGlvbiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlwcml2LT5kZWVwX3NsZWVwX3JlcXVpcmVkID0gMTsKIAl9CiAKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCXJldCA9IGxic19zZXRfaG9zdF9zbGVlcChwcml2LCAxKTsKIAotCXJldCA9IF9fbGJzX2NtZChwcml2LCBDTURfODAyXzExX0hPU1RfU0xFRVBfQUNUSVZBVEUsICZjbWQsCi0JCQlzaXplb2YoY21kKSwgbGJzX3N1c3BlbmRfY2FsbGJhY2ssIDApOwotCWlmIChyZXQpCi0JCWxic19wcl9pbmZvKCJIT1NUX1NMRUVQX0FDVElWQVRFIGZhaWxlZDogJWRcbiIsIHJldCk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChwcml2LT5kZXYpOworCWlmIChwcml2LT5tZXNoX2RldikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChwcml2LT5tZXNoX2Rldik7CiAKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9GVywgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxic19zdXNwZW5kKTsKIAotdm9pZCBsYnNfcmVzdW1lKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKK2ludCBsYnNfcmVzdW1lKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKIHsKKwlpbnQgcmV0OworCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX0ZXKTsKIAotCXByaXYtPmZ3X3JlYWR5ID0gMTsKLQotCS8qIEZpcm13YXJlIGRvZXNuJ3Qgc2VlbSB0byBnaXZlIHVzIFJYIHBhY2tldHMgYW55IG1vcmUKLQkgICB1bnRpbCB3ZSBzZW5kIGl0IHNvbWUgY29tbWFuZC4gTWlnaHQgYXMgd2VsbCB1cGRhdGUgKi8KLQlsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIENNRF84MDJfMTFfUlNTSSwgMCwKLQkJCQkgICAgIDAsIDAsIE5VTEwpOworCXJldCA9IGxic19zZXRfaG9zdF9zbGVlcChwcml2LCAwKTsKIAogCW5ldGlmX2RldmljZV9hdHRhY2gocHJpdi0+ZGV2KTsKIAlpZiAocHJpdi0+bWVzaF9kZXYpCiAJCW5ldGlmX2RldmljZV9hdHRhY2gocHJpdi0+bWVzaF9kZXYpOwogCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0ZXKTsKKwlpZiAocHJpdi0+ZGVlcF9zbGVlcF9yZXF1aXJlZCkgeworCQlwcml2LT5kZWVwX3NsZWVwX3JlcXVpcmVkID0gMDsKKwkJcmV0ID0gbGJzX3NldF9kZWVwX3NsZWVwKHByaXYsIDEpOworCQlpZiAocmV0KQorCQkJbGJzX3ByX2VycigiZGVlcCBzbGVlcCBhY3RpdmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJfQorCisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfRlcsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsYnNfcmVzdW1lKTsKIApAQCAtNzEwLDYgKzYxMCw5IEBACiAJCXByaXYtPnR4cG93ZXJfbWF4ID0gbWF4bGV2ZWw7CiAJfQogCisJLyogU2VuZCBjbWQgdG8gRlcgdG8gZW5hYmxlIDExRCBmdW5jdGlvbiAqLworCXJldCA9IGxic19zZXRfc25tcF9taWIocHJpdiwgU05NUF9NSUJfT0lEXzExRF9FTkFCTEUsIDEpOworCiAJbGJzX3NldF9tYWNfY29udHJvbChwcml2KTsKIGRvbmU6CiAJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfRlcsICJyZXQgJWQiLCByZXQpOwpAQCAtNzQ4LDcgKzY1MSw2IEBACiBzdGF0aWMgdm9pZCBhdXRvX2RlZXBzbGVlcF90aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBsYnNfcHJpdmF0ZSAqKWRhdGE7Ci0JaW50IHJldDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwogCkBAIC03NTYsMTQgKzY1OCwxNSBAQAogCQlwcml2LT5pc19hY3Rpdml0eV9kZXRlY3RlZCA9IDA7CiAJfSBlbHNlIHsKIAkJaWYgKHByaXYtPmlzX2F1dG9fZGVlcF9zbGVlcF9lbmFibGVkICYmCi0JCQkJKCFwcml2LT53YWtldXBfZGV2X3JlcXVpcmVkKSAmJgotCQkJCShwcml2LT5jb25uZWN0X3N0YXR1cyAhPSBMQlNfQ09OTkVDVEVEKSkgeworCQkgICAgKCFwcml2LT53YWtldXBfZGV2X3JlcXVpcmVkKSAmJgorCQkgICAgKHByaXYtPmNvbm5lY3Rfc3RhdHVzICE9IExCU19DT05ORUNURUQpKSB7CisJCQlzdHJ1Y3QgY21kX2hlYWRlciBjbWQ7CisKIAkJCWxic19kZWJfbWFpbigiRW50ZXJpbmcgYXV0byBkZWVwIHNsZWVwIG1vZGUuLi5cbiIpOwotCQkJcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCQlDTURfODAyXzExX0RFRVBfU0xFRVAsIDAsCi0JCQkJCTAsIDAsIE5VTEwpOwotCQkJaWYgKHJldCkKLQkJCQlsYnNfcHJfZXJyKCJFbnRlciBEZWVwIFNsZWVwIGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCQljbWQuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwkJCWxic19jbWRfYXN5bmMocHJpdiwgQ01EXzgwMl8xMV9ERUVQX1NMRUVQLCAmY21kLAorCQkJCQlzaXplb2YoY21kKSk7CiAJCX0KIAl9CiAJbW9kX3RpbWVyKCZwcml2LT5hdXRvX2RlZXBzbGVlcF90aW1lciAsIGppZmZpZXMgKwpAQCAtNzk5LDQ1ICs3MDIsMjcgQEAKIAogc3RhdGljIGludCBsYnNfaW5pdF9hZGFwdGVyKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKIHsKLQlzaXplX3QgYnVmc2l6ZTsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX01BSU4pOwogCi0JLyogQWxsb2NhdGUgYnVmZmVyIHRvIHN0b3JlIHRoZSBCU1NJRCBsaXN0ICovCi0JYnVmc2l6ZSA9IE1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBic3NfZGVzY3JpcHRvcik7Ci0JcHJpdi0+bmV0d29ya3MgPSBremFsbG9jKGJ1ZnNpemUsIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+bmV0d29ya3MpIHsKLQkJbGJzX3ByX2VycigiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIpOwotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBzY2FuIHJlc3VsdCBsaXN0cyAqLwotCUlOSVRfTElTVF9IRUFEKCZwcml2LT5uZXR3b3JrX2ZyZWVfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPm5ldHdvcmtfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9ORVRXT1JLX0NPVU5UOyBpKyspIHsKLQkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+bmV0d29ya3NbaV0ubGlzdCwKLQkJCSAgICAgICZwcml2LT5uZXR3b3JrX2ZyZWVfbGlzdCk7Ci0JfQotCiAJbWVtc2V0KHByaXYtPmN1cnJlbnRfYWRkciwgMHhmZiwgRVRIX0FMRU4pOwogCiAJcHJpdi0+Y29ubmVjdF9zdGF0dXMgPSBMQlNfRElTQ09OTkVDVEVEOwotCXByaXYtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0JcHJpdi0+bW9kZSA9IElXX01PREVfSU5GUkE7CiAJcHJpdi0+Y2hhbm5lbCA9IERFRkFVTFRfQURfSE9DX0NIQU5ORUw7CiAJcHJpdi0+bWFjX2NvbnRyb2wgPSBDTURfQUNUX01BQ19SWF9PTiB8IENNRF9BQ1RfTUFDX1RYX09OOwogCXByaXYtPnJhZGlvX29uID0gMTsKLQlwcml2LT5lbmFibGVod2F1dG8gPSAxOwogCXByaXYtPnBzbW9kZSA9IExCUzgwMl8xMVBPV0VSTU9ERUNBTTsKIAlwcml2LT5wc3N0YXRlID0gUFNfU1RBVEVfRlVMTF9QT1dFUjsKIAlwcml2LT5pc19kZWVwX3NsZWVwID0gMDsKIAlwcml2LT5pc19hdXRvX2RlZXBfc2xlZXBfZW5hYmxlZCA9IDA7CisJcHJpdi0+ZGVlcF9zbGVlcF9yZXF1aXJlZCA9IDA7CiAJcHJpdi0+d2FrZXVwX2Rldl9yZXF1aXJlZCA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+ZHNfYXdha2VfcSk7CiAJcHJpdi0+YXV0aHR5cGVfYXV0byA9IDE7Ci0KKwlwcml2LT5pc19ob3N0X3NsZWVwX2NvbmZpZ3VyZWQgPSAwOworCXByaXYtPmlzX2hvc3Rfc2xlZXBfYWN0aXZhdGVkID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5ob3N0X3NsZWVwX3EpOwogCW11dGV4X2luaXQoJnByaXYtPmxvY2spOwogCiAJc2V0dXBfdGltZXIoJnByaXYtPmNvbW1hbmRfdGltZXIsIGxic19jbWRfdGltZW91dF9oYW5kbGVyLApAQCAtODQ5LDcgKzczNCw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmNtZHBlbmRpbmdxKTsKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5kcml2ZXJfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+Y21kX3BlbmRpbmcpOwogCiAJLyogQWxsb2NhdGUgdGhlIGNvbW1hbmQgYnVmZmVycyAqLwogCWlmIChsYnNfYWxsb2NhdGVfY21kX2J1ZmZlcihwcml2KSkgewpAQCAtODgxLDggKzc2NSw2IEBACiAJa2ZpZm9fZnJlZSgmcHJpdi0+ZXZlbnRfZmlmbyk7CiAJZGVsX3RpbWVyKCZwcml2LT5jb21tYW5kX3RpbWVyKTsKIAlkZWxfdGltZXIoJnByaXYtPmF1dG9fZGVlcHNsZWVwX3RpbWVyKTsKLQlrZnJlZShwcml2LT5uZXR3b3Jrcyk7Ci0JcHJpdi0+bmV0d29ya3MgPSBOVUxMOwogCiAJbGJzX2RlYl9sZWF2ZShMQlNfREVCX01BSU4pOwogfQpAQCAtOTE5LDcgKzgwMSw3IEBACiAJCWxic19wcl9lcnIoImNmZzgwMjExIGluaXQgZmFpbGVkXG4iKTsKIAkJZ290byBkb25lOwogCX0KLQkvKiBUT0RPPyAqLworCiAJd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKIAlwcml2ID0gd2Rldl9wcml2KHdkZXYpOwogCXByaXYtPndkZXYgPSB3ZGV2OwpAQCAtOTI5LDcgKzgxMSw2IEBACiAJCWdvdG8gZXJyX3dkZXY7CiAJfQogCi0JLy9UT0RPPyBkZXYgPSBhbGxvY19uZXRkZXZfbXEoMCwgIndsYW4lZCIsIGV0aGVyX3NldHVwLCBJV01fVFhfUVVFVUVTKTsKIAlkZXYgPSBhbGxvY19uZXRkZXYoMCwgIndsYW4lZCIsIGV0aGVyX3NldHVwKTsKIAlpZiAoIWRldikgewogCQlkZXZfZXJyKGRtZGV2LCAibm8gbWVtb3J5IGZvciBuZXR3b3JrIGRldmljZSBpbnN0YW5jZVxuIik7CkBAIC05NDUsMjAgKzgyNiwxMCBAQAogIAlkZXYtPm5ldGRldl9vcHMgPSAmbGJzX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmxic19ldGh0b29sX29wczsKLSNpZmRlZglXSVJFTEVTU19FWFQKLQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmxic19oYW5kbGVyX2RlZjsKLSNlbmRpZgogCWRldi0+ZmxhZ3MgfD0gSUZGX0JST0FEQ0FTVCB8IElGRl9NVUxUSUNBU1Q7CiAKLQotCS8vIFRPRE86IGt6YWxsb2MgKyBpd21faW5pdF9kZWZhdWx0X3Byb2ZpbGUoaXdtLCBpd20tPnVtYWNfcHJvZmlsZSk7ID8/Ci0KLQogCXByaXYtPmNhcmQgPSBjYXJkOwotCXByaXYtPmluZnJhX29wZW4gPSAwOwogCi0KLQlwcml2LT5ydGFwX25ldF9kZXYgPSBOVUxMOwogCXN0cmNweShkZXYtPm5hbWUsICJ3bGFuJWQiKTsKIAogCWxic19kZWJfdGhyZWFkKCJTdGFydGluZyBtYWluIHRocmVhZC4uLlxuIik7CkBAIC05NzAsMTIgKzg0MSwxMSBAQAogCX0KIAogCXByaXYtPndvcmtfdGhyZWFkID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImxic193b3JrZXIiKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+YXNzb2Nfd29yaywgbGJzX2Fzc29jaWF0aW9uX3dvcmtlcik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnNjYW5fd29yaywgbGJzX3NjYW5fd29ya2VyKTsKIAlJTklUX1dPUksoJnByaXYtPm1jYXN0X3dvcmssIGxic19zZXRfbWNhc3Rfd29ya2VyKTsKIAogCXByaXYtPndvbF9jcml0ZXJpYSA9IDB4ZmZmZmZmZmY7CiAJcHJpdi0+d29sX2dwaW8gPSAweGZmOworCXByaXYtPndvbF9nYXAgPSAyMDsKIAogCWdvdG8gZG9uZTsKIApAQCAtMTAwNCwxMiArODc0LDEwIEBACiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX01BSU4pOwogCiAJbGJzX3JlbW92ZV9tZXNoKHByaXYpOwotCWxic19yZW1vdmVfcnRhcChwcml2KTsKKwlsYnNfc2Nhbl9kZWluaXQocHJpdik7CiAKIAlkZXYgPSBwcml2LT5kZXY7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnNjYW5fd29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5hc3NvY193b3JrKTsKIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5tY2FzdF93b3JrKTsKIAogCS8qIHdvcmtlciB0aHJlYWQgZGVzdHJ1Y3Rpb24gYmxvY2tzIG9uIHRoZSBpbi1mbGlnaHQgY29tbWFuZCB3aGljaApAQCAtMTAyMSwxNiArODg5LDE4IEBACiAKIAlpZiAocHJpdi0+cHNtb2RlID09IExCUzgwMl8xMVBPV0VSTU9ERU1BWF9QU1ApIHsKIAkJcHJpdi0+cHNtb2RlID0gTEJTODAyXzExUE9XRVJNT0RFQ0FNOwotCQlsYnNfcHNfd2FrZXVwKHByaXYsIENNRF9PUFRJT05fV0FJVEZPUlJTUCk7CisJCWxic19zZXRfcHNfbW9kZShwcml2LCBQU19NT0RFX0FDVElPTl9FWElUX1BTLCB0cnVlKTsKIAl9CiAKLQlsYnNfc2VuZF9kaXNjb25uZWN0X25vdGlmaWNhdGlvbihwcml2KTsKLQogCWlmIChwcml2LT5pc19kZWVwX3NsZWVwKSB7CiAJCXByaXYtPmlzX2RlZXBfc2xlZXAgPSAwOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmRzX2F3YWtlX3EpOwogCX0KIAorCXByaXYtPmlzX2hvc3Rfc2xlZXBfY29uZmlndXJlZCA9IDA7CisJcHJpdi0+aXNfaG9zdF9zbGVlcF9hY3RpdmF0ZWQgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+aG9zdF9zbGVlcF9xKTsKKwogCS8qIFN0b3AgdGhlIHRocmVhZCBzZXJ2aWNpbmcgdGhlIGludGVycnVwdHMgKi8KIAlwcml2LT5zdXJwcmlzZXJlbW92ZWQgPSAxOwogCWt0aHJlYWRfc3RvcChwcml2LT5tYWluX3RocmVhZCk7CkBAIC0xMDQ2LDcgKzkxNiw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChsYnNfcmVtb3ZlX2NhcmQpOwogCiAKLXN0YXRpYyBpbnQgbGJzX3J0YXBfc3VwcG9ydGVkKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKK2ludCBsYnNfcnRhcF9zdXBwb3J0ZWQoc3RydWN0IGxic19wcml2YXRlICpwcml2KQogewogCWlmIChNUlZMX0ZXX01BSk9SX1JFVihwcml2LT5md3JlbGVhc2UpID09IE1SVkxfRldfVjUpCiAJCXJldHVybiAxOwpAQCAtMTA3OCwxNiArOTQ4LDYgQEAKIAogCWxic19pbml0X21lc2gocHJpdik7CiAKLQkvKgotCSAqIFdoaWxlIHJ0YXAgaXNuJ3QgcmVsYXRlZCB0byBtZXNoLCBvbmx5IG1lc2gtZW5hYmxlZAotCSAqIGZpcm13YXJlIGltcGxlbWVudHMgdGhlIHJ0YXAgZnVuY3Rpb25hbGl0eSB2aWEKLQkgKiBDTURfODAyXzExX01PTklUT1JfTU9ERS4KLQkgKi8KLQlpZiAobGJzX3J0YXBfc3VwcG9ydGVkKHByaXYpKSB7Ci0JCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbGJzX3J0YXApKQotCQkJbGJzX3ByX2VycigiY2Fubm90IHJlZ2lzdGVyIGxic19ydGFwIGF0dHJpYnV0ZVxuIik7Ci0JfQotCiAJbGJzX2RlYnVnZnNfaW5pdF9vbmUocHJpdiwgZGV2KTsKIAogCWxic19wcl9pbmZvKCIlczogTWFydmVsbCBXTEFOIDgwMi4xMSBhZGFwdGVyXG4iLCBkZXYtPm5hbWUpOwpAQCAtMTExOSw5ICs5NzksNiBAQAogCWxic19kZWJ1Z2ZzX3JlbW92ZV9vbmUocHJpdik7CiAJbGJzX2RlaW5pdF9tZXNoKHByaXYpOwogCi0JaWYgKGxic19ydGFwX3N1cHBvcnRlZChwcml2KSkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2xic19ydGFwKTsKLQogCS8qIERlbGV0ZSB0aGUgdGltZW91dCBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NpbmcgY29tbWFuZCAqLwogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5jb21tYW5kX3RpbWVyKTsKIAlkZWxfdGltZXJfc3luYygmcHJpdi0+YXV0b19kZWVwc2xlZXBfdGltZXIpOwpAQCAtMTE5NSw3ICsxMDUyLDcgQEAKIAltZW1zZXQoJmNvbmZpcm1fc2xlZXAsIDAsIHNpemVvZihjb25maXJtX3NsZWVwKSk7CiAJY29uZmlybV9zbGVlcC5oZHIuY29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfUFNfTU9ERSk7CiAJY29uZmlybV9zbGVlcC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjb25maXJtX3NsZWVwKSk7Ci0JY29uZmlybV9zbGVlcC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfU1VCQ01EX1NMRUVQX0NPTkZJUk1FRCk7CisJY29uZmlybV9zbGVlcC5hY3Rpb24gPSBjcHVfdG9fbGUxNihQU19NT0RFX0FDVElPTl9TTEVFUF9DT05GSVJNRUQpOwogCWxic19kZWJ1Z2ZzX2luaXQoKTsKIAlsYnNfZGViX2xlYXZlKExCU19ERUJfTUFJTik7CiAJcmV0dXJuIDA7CkBAIC0xMjA4LDg3ICsxMDY1LDYgQEAKIAlsYnNfZGViX2xlYXZlKExCU19ERUJfTUFJTik7CiB9CiAKLS8qCi0gKiBydGFwIGludGVyZmFjZSBzdXBwb3J0IGZ1Y3Rpb25zCi0gKi8KLQotc3RhdGljIGludCBsYnNfcnRhcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JLyogWWVzLCBfc3RvcF8gdGhlIHF1ZXVlLiBCZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgaW5qZWN0aW9uICovCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX01BSU4pOwotCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9MRUFWRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX3J0YXBfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9NQUlOKTsKLQlsYnNfZGViX2xlYXZlKExCU19ERUJfTUFJTik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBuZXRkZXZfdHhfdCBsYnNfcnRhcF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCXJldHVybiBORVRERVZfVFhfQlVTWTsKLX0KLQotc3RhdGljIHZvaWQgbGJzX3JlbW92ZV9ydGFwKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKLXsKLQlsYnNfZGViX2VudGVyKExCU19ERUJfTUFJTik7Ci0JaWYgKHByaXYtPnJ0YXBfbmV0X2RldiA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQl1bnJlZ2lzdGVyX25ldGRldihwcml2LT5ydGFwX25ldF9kZXYpOwotCWZyZWVfbmV0ZGV2KHByaXYtPnJ0YXBfbmV0X2Rldik7Ci0JcHJpdi0+cnRhcF9uZXRfZGV2ID0gTlVMTDsKLW91dDoKLQlsYnNfZGViX2xlYXZlKExCU19ERUJfTUFJTik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnRhcF9uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbiA9IGxic19ydGFwX29wZW4sCi0JLm5kb19zdG9wID0gbGJzX3J0YXBfc3RvcCwKLQkubmRvX3N0YXJ0X3htaXQgPSBsYnNfcnRhcF9oYXJkX3N0YXJ0X3htaXQsCi19OwotCi1zdGF0aWMgaW50IGxic19hZGRfcnRhcChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJ0YXBfZGV2OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX01BSU4pOwotCWlmIChwcml2LT5ydGFwX25ldF9kZXYpIHsKLQkJcmV0ID0gLUVQRVJNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlydGFwX2RldiA9IGFsbG9jX25ldGRldigwLCAicnRhcCVkIiwgZXRoZXJfc2V0dXApOwotCWlmIChydGFwX2RldiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1lbWNweShydGFwX2Rldi0+ZGV2X2FkZHIsIHByaXYtPmN1cnJlbnRfYWRkciwgRVRIX0FMRU4pOwotCXJ0YXBfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUDsKLQlydGFwX2Rldi0+bmV0ZGV2X29wcyA9ICZydGFwX25ldGRldl9vcHM7Ci0JcnRhcF9kZXYtPm1sX3ByaXYgPSBwcml2OwotCVNFVF9ORVRERVZfREVWKHJ0YXBfZGV2LCBwcml2LT5kZXYtPmRldi5wYXJlbnQpOwotCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KHJ0YXBfZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWZyZWVfbmV0ZGV2KHJ0YXBfZGV2KTsKLQkJZ290byBvdXQ7Ci0JfQotCXByaXYtPnJ0YXBfbmV0X2RldiA9IHJ0YXBfZGV2OwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfTUFJTiwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQogbW9kdWxlX2luaXQobGJzX2luaXRfbW9kdWxlKTsKIG1vZHVsZV9leGl0KGxic19leGl0X21vZHVsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21lc2guYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21lc2guYwppbmRleCBlMzg1YWYxLi4xOTQ3NjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tZXNoLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWVzaC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogCiAjaW5jbHVkZSAibWVzaC5oIgogI2luY2x1ZGUgImRlY2wuaCIKQEAgLTMxNCw3ICszMTUsNyBAQAogCiAJc3Bpbl9sb2NrX2lycSgmcHJpdi0+ZHJpdmVyX2xvY2spOwogCi0JaWYgKHByaXYtPm1vbml0b3Jtb2RlKSB7CisJaWYgKHByaXYtPndkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzY5LDkgKzM3MCw2IEBACiAKIAlTRVRfTkVUREVWX0RFVihwcml2LT5tZXNoX2RldiwgcHJpdi0+ZGV2LT5kZXYucGFyZW50KTsKIAotI2lmZGVmCVdJUkVMRVNTX0VYVAotCW1lc2hfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZtZXNoX2hhbmRsZXJfZGVmOwotI2VuZGlmCiAJbWVzaF9kZXYtPmZsYWdzIHw9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOwogCS8qIFJlZ2lzdGVyIHZpcnR1YWwgbWVzaCBpbnRlcmZhY2UgKi8KIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOwpAQCAtNDU3LDY1ICs0NTUsMTg5IEBACiAgKiBNZXNoIGNvbW1hbmQgaGFuZGxpbmcKICAqLwogCi1pbnQgbGJzX2NtZF9idF9hY2Nlc3Moc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCi0JCQkgICAgICAgdTE2IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1ZikKKy8qKgorICogIEBicmllZiBBZGQgb3IgZGVsZXRlIE1lc2ggQmxpbmRpbmcgVGFibGUgZW50cmllcworICoKKyAqICBAcGFyYW0gcHJpdiAgICAJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gYWRkICAJVFJVRSB0byBhZGQgdGhlIGVudHJ5LCBGQUxTRSB0byBkZWxldGUgaXQKKyAqICBAcGFyYW0gYWRkcjEgICAgICAgIERlc3RpbmF0aW9uIGFkZHJlc3MgdG8gYmxpbmQgb3IgdW5ibGluZAorICoKKyAqICBAcmV0dXJuIAkgICAJMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCisgKi8KK2ludCBsYnNfbWVzaF9idF9hZGRfZGVsKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgYm9vbCBhZGQsIHU4ICphZGRyMSkKIHsKLQlzdHJ1Y3QgY21kX2RzX2J0X2FjY2VzcyAqYnRfYWNjZXNzID0gJmNtZC0+cGFyYW1zLmJ0OwotCWxic19kZWJfZW50ZXJfYXJncyhMQlNfREVCX0NNRCwgImFjdGlvbiAlZCIsIGNtZF9hY3Rpb24pOworCXN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzIGNtZDsKKwlpbnQgcmV0ID0gMDsKIAotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF9CVF9BQ0NFU1MpOwotCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2J0X2FjY2VzcykgKwotCQlzaXplb2Yoc3RydWN0IGNtZF9oZWFkZXIpKTsKLQljbWQtPnJlc3VsdCA9IDA7Ci0JYnRfYWNjZXNzLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKIAotCXN3aXRjaCAoY21kX2FjdGlvbikgewotCWNhc2UgQ01EX0FDVF9CVF9BQ0NFU1NfQUREOgotCQltZW1jcHkoYnRfYWNjZXNzLT5hZGRyMSwgcGRhdGFfYnVmLCAyICogRVRIX0FMRU4pOworCUJVR19PTihhZGRyMSA9PSBOVUxMKTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCW1lbWNweShjbWQuYWRkcjEsIGFkZHIxLCBFVEhfQUxFTik7CisJaWYgKGFkZCkgeworCQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfQUREKTsKIAkJbGJzX2RlYl9oZXgoTEJTX0RFQl9NRVNILCAiQlRfQUREOiBibGluZGVkIE1BQyBhZGRyIiwKLQkJCWJ0X2FjY2Vzcy0+YWRkcjEsIDYpOwotCQlicmVhazsKLQljYXNlIENNRF9BQ1RfQlRfQUNDRVNTX0RFTDoKLQkJbWVtY3B5KGJ0X2FjY2Vzcy0+YWRkcjEsIHBkYXRhX2J1ZiwgMSAqIEVUSF9BTEVOKTsKKwkJCWFkZHIxLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfQlRfQUNDRVNTX0RFTCk7CiAJCWxic19kZWJfaGV4KExCU19ERUJfTUVTSCwgIkJUX0RFTDogYmxpbmRlZCBNQUMgYWRkciIsCi0JCQlidF9hY2Nlc3MtPmFkZHIxLCA2KTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQUNUX0JUX0FDQ0VTU19MSVNUOgotCQlidF9hY2Nlc3MtPmlkID0gY3B1X3RvX2xlMzIoKih1MzIgKikgcGRhdGFfYnVmKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQUNUX0JUX0FDQ0VTU19SRVNFVDoKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQUNUX0JUX0FDQ0VTU19TRVRfSU5WRVJUOgotCQlidF9hY2Nlc3MtPmlkID0gY3B1X3RvX2xlMzIoKih1MzIgKikgcGRhdGFfYnVmKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQUNUX0JUX0FDQ0VTU19HRVRfSU5WRVJUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJCWFkZHIxLCBFVEhfQUxFTik7CiAJfQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF9CVF9BQ0NFU1MsICZjbWQpOworCisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX2NtZF9md3RfYWNjZXNzKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAotCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCisvKioKKyAqICBAYnJpZWYgUmVzZXQvY2xlYXIgdGhlIG1lc2ggYmxpbmRpbmcgdGFibGUKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKgorICogIEByZXR1cm4gCSAgIAkwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGxic19tZXNoX2J0X3Jlc2V0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKIHsKLQlzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgKmZ3dF9hY2Nlc3MgPSAmY21kLT5wYXJhbXMuZnd0OworCXN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzIGNtZDsKKwlpbnQgcmV0ID0gMDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfQlRfQUNDRVNTX1JFU0VUKTsKKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfQlRfQUNDRVNTLCAmY21kKTsKKworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldHMgdGhlIGludmVydGVkIHN0YXR1cyBvZiB0aGUgbWVzaCBibGluZGluZyB0YWJsZQorICoKKyAqICBOb3JtYWxseSB0aGUgZmlybXdhcmUgImJsaW5kcyIgb3IgaWdub3JlcyB0cmFmZmljIGZyb20gbWVzaCBub2RlcyBpbiB0aGUKKyAqICB0YWJsZSwgYnV0IGFuIGludmVydGVkIHRhYmxlIGFsbG93cyAqb25seSogdHJhZmZpYyBmcm9tIG5vZGVzIGxpc3RlZCBpbgorICogIHRoZSB0YWJsZS4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGludmVydCAgCU9uIHN1Y2Nlc3MsIFRSVUUgaWYgdGhlIGJsaW5kaW5nIHRhYmxlIGlzIGludmVydGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiBpdCBpcyBub3QgaW52ZXJ0ZWQKKyAqCisgKiAgQHJldHVybiAJICAgCTAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgbGJzX21lc2hfYnRfZ2V0X2ludmVydGVkKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgYm9vbCAqaW52ZXJ0ZWQpCit7CisJc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgY21kOworCWludCByZXQgPSAwOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CisKKwlCVUdfT04oaW52ZXJ0ZWQgPT0gTlVMTCk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfR0VUX0lOVkVSVCk7CisKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0JUX0FDQ0VTUywgJmNtZCk7CisJaWYgKHJldCA9PSAwKQorCQkqaW52ZXJ0ZWQgPSAhIWNtZC5pZDsKKworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldHMgdGhlIGludmVydGVkIHN0YXR1cyBvZiB0aGUgbWVzaCBibGluZGluZyB0YWJsZQorICoKKyAqICBOb3JtYWxseSB0aGUgZmlybXdhcmUgImJsaW5kcyIgb3IgaWdub3JlcyB0cmFmZmljIGZyb20gbWVzaCBub2RlcyBpbiB0aGUKKyAqICB0YWJsZSwgYnV0IGFuIGludmVydGVkIHRhYmxlIGFsbG93cyAqb25seSogdHJhZmZpYyBmcm9tIG5vZGVzIGxpc3RlZCBpbgorICogIHRoZSB0YWJsZS4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGludmVydCAgCVRSVUUgdG8gaW52ZXJ0IHRoZSBibGluZGluZyB0YWJsZSAob25seSB0cmFmZmljIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlZCBub2RlcyBhbGxvd2VkKSwgRkFMU0UgdG8gcmV0dXJuIGl0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0byBub3JtYWwgc3RhdGUgKGxpc3RlZCBub2RlcyBpZ25vcmVkKQorICoKKyAqICBAcmV0dXJuIAkgICAJMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCisgKi8KK2ludCBsYnNfbWVzaF9idF9zZXRfaW52ZXJ0ZWQoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBib29sIGludmVydGVkKQoreworCXN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzIGNtZDsKKwlpbnQgcmV0ID0gMDsKKworCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfQlRfQUNDRVNTX1NFVF9JTlZFUlQpOworCWNtZC5pZCA9ICEhaW52ZXJ0ZWQ7CisKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0JUX0FDQ0VTUywgJmNtZCk7CisKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DTUQsICJyZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBMaXN0IGFuIGVudHJ5IGluIHRoZSBtZXNoIGJsaW5kaW5nIHRhYmxlCisgKgorICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpZAkJVGhlIElEIG9mIHRoZSBlbnRyeSB0byBsaXN0CisgKiAgQHBhcmFtIGFkZHIxCU1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGUgZW50cnkKKyAqCisgKiAgQHJldHVybiAJICAgCTAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgbGJzX21lc2hfYnRfZ2V0X2VudHJ5KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGlkLCB1OCAqYWRkcjEpCit7CisJc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgY21kOworCWludCByZXQgPSAwOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CisKKwlCVUdfT04oYWRkcjEgPT0gTlVMTCk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfU0VUX0lOVkVSVCk7CisJY21kLmlkID0gY3B1X3RvX2xlMzIoaWQpOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF9CVF9BQ0NFU1MsICZjbWQpOworCWlmIChyZXQgPT0gMCkKKwkJbWVtY3B5KGFkZHIxLCBjbWQuYWRkcjEsIHNpemVvZihjbWQuYWRkcjEpKTsKKworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEFjY2VzcyB0aGUgbWVzaCBmb3J3YXJkaW5nIHRhYmxlCisgKgorICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBjbWRfYWN0aW9uCVRoZSBmb3J3YXJkaW5nIHRhYmxlIGFjdGlvbiB0byBwZXJmb3JtCisgKiAgQHBhcmFtIGNtZAkJVGhlIHByZS1maWxsZWQgRldUX0FDQ0VTUyBjb21tYW5kCisgKgorICogIEByZXR1cm4gCSAgIAkwIG9uIHN1Y2Nlc3MgYW5kICdjbWQnIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlJ3MgcmVzcG9uc2UKKyAqLworaW50IGxic19jbWRfZnd0X2FjY2VzcyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUxNiBjbWRfYWN0aW9uLAorCQkJc3RydWN0IGNtZF9kc19md3RfYWNjZXNzICpjbWQpCit7CisJaW50IHJldDsKKwogCWxic19kZWJfZW50ZXJfYXJncyhMQlNfREVCX0NNRCwgImFjdGlvbiAlZCIsIGNtZF9hY3Rpb24pOwogCi0JY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoQ01EX0ZXVF9BQ0NFU1MpOwotCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MpICsKLQkJc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0JY21kLT5yZXN1bHQgPSAwOworCWNtZC0+aGRyLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfRldUX0FDQ0VTUyk7CisJY21kLT5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MpKTsKKwljbWQtPmhkci5yZXN1bHQgPSAwOworCWNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CiAKLQlpZiAocGRhdGFfYnVmKQotCQltZW1jcHkoZnd0X2FjY2VzcywgcGRhdGFfYnVmLCBzaXplb2YoKmZ3dF9hY2Nlc3MpKTsKLQllbHNlCi0JCW1lbXNldChmd3RfYWNjZXNzLCAwLCBzaXplb2YoKmZ3dF9hY2Nlc3MpKTsKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0ZXVF9BQ0NFU1MsIGNtZCk7CiAKLQlmd3RfYWNjZXNzLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOworCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21lc2guaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21lc2guaAppbmRleCBlMjU3MzMwLi5hZmIyZThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tZXNoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWVzaC5oCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAjaW5jbHVkZSA8bmV0L2xpYjgwMjExLmg+CiAKKyNpbmNsdWRlICJob3N0LmgiCiAKICNpZmRlZiBDT05GSUdfTElCRVJUQVNfTUVTSAogCkBAIC01MSwxMCArNTIsMTUgQEAKIHN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3M7CiBzdHJ1Y3QgY21kX2RzX21lc2hfY29uZmlnOwogCi1pbnQgbGJzX2NtZF9idF9hY2Nlc3Moc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCi0JdTE2IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1Zik7Ci1pbnQgbGJzX2NtZF9md3RfYWNjZXNzKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAotCXUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpOworaW50IGxic19tZXNoX2J0X2FkZF9kZWwoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBib29sIGFkZCwgdTggKmFkZHIxKTsKK2ludCBsYnNfbWVzaF9idF9yZXNldChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOworaW50IGxic19tZXNoX2J0X2dldF9pbnZlcnRlZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGJvb2wgKmludmVydGVkKTsKK2ludCBsYnNfbWVzaF9idF9zZXRfaW52ZXJ0ZWQoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBib29sIGludmVydGVkKTsKK2ludCBsYnNfbWVzaF9idF9nZXRfZW50cnkoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1MzIgaWQsIHU4ICphZGRyMSk7CisKK2ludCBsYnNfY21kX2Z3dF9hY2Nlc3Moc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1MTYgY21kX2FjdGlvbiwKKwkJCXN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyAqY21kKTsKKwogaW50IGxic19tZXNoX2FjY2VzcyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNtZF9hY3Rpb24sCiAJCSAgICBzdHJ1Y3QgY21kX2RzX21lc2hfYWNjZXNzICpjbWQpOwogaW50IGxic19tZXNoX2NvbmZpZ19zZW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKQEAgLTcwLDExICs3Niw2IEBACiB2b2lkIGxic19wZXJzaXN0X2NvbmZpZ19yZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCk7CiAKIAotLyogV0VYVCBoYW5kbGVyICovCi0KLWV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgbWVzaF9oYW5kbGVyX2RlZjsKLQotCiAvKiBFdGh0b29sIHN0YXRpc3RpY3MgKi8KIAogc3RydWN0IGV0aHRvb2xfc3RhdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yYWRpb3RhcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcmFkaW90YXAuaAppbmRleCBkMTZiMjY0Li5iM2M4ZWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yYWRpb3RhcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3JhZGlvdGFwLmgKQEAgLTYsNyArNiw3IEBACiAJdTggdHhwb3dlcjsKIAl1OCBydHNfcmV0cmllczsKIAl1OCBkYXRhX3JldHJpZXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVFhfUkFESU9UQVBfUFJFU0VOVCAoCQkJCVwKIAkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgfAkJXApAQCAtMzQsNyArMzQsNyBAQAogCXU4IGZsYWdzOwogCXU4IHJhdGU7CiAJdTggYW50c2lnbmFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFJYX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKIAkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKaW5kZXggN2EzNzdmNS4uYTRkMGJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCkBAIC00LDE4ICs0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KIAorI2luY2x1ZGUgImRlZnMuaCIKICNpbmNsdWRlICJob3N0LmgiCiAjaW5jbHVkZSAicmFkaW90YXAuaCIKICNpbmNsdWRlICJkZWNsLmgiCiAjaW5jbHVkZSAiZGV2LmgiCi0jaW5jbHVkZSAid2V4dC5oIgogCiBzdHJ1Y3QgZXRoODAzaGRyIHsKIAl1OCBkZXN0X2FkZHJbNl07CiAJdTggc3JjX2FkZHJbNl07CiAJdTE2IGg4MDNfbGVuOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcmZjMTA0MmhkciB7CiAJdTggbGxjX2RzYXA7CkBAIC0yMywxMTQgKzI0LDIyIEBACiAJdTggbGxjX2N0cmw7CiAJdTggc25hcF9vdWlbM107CiAJdTE2IHNuYXBfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJ4cGFja2V0aGRyIHsKIAlzdHJ1Y3QgZXRoODAzaGRyIGV0aDgwM19oZHI7CiAJc3RydWN0IHJmYzEwNDJoZHIgcmZjMTA0Ml9oZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByeDgwMjExcGFja2V0aGRyIHsKIAlzdHJ1Y3QgcnhwZCByeF9wZDsKIAl2b2lkICpldGg4MDIxMV9oZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAogCXN0cnVjdCBza19idWZmICpza2IpOwogCiAvKioKLSAqICBAYnJpZWYJVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgYXZnU05SIC4KLSAqCi0gKiAgQHBhcmFtCXByaXYJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuCWF2Z1NOUgotICovCi1zdGF0aWMgdTggbGJzX2dldGF2Z3NucihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0JdTggaTsKLQl1MTYgdGVtcCA9IDA7Ci0JaWYgKHByaXYtPm51bVNOUk5GID09IDApCi0JCXJldHVybiAwOwotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1TTlJORjsgaSsrKQotCQl0ZW1wICs9IHByaXYtPnJhd1NOUltpXTsKLQlyZXR1cm4gKHU4KSAodGVtcCAvIHByaXYtPm51bVNOUk5GKTsKLQotfQotCi0vKioKLSAqICBAYnJpZWYJVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgQXZnTkYKLSAqCi0gKiAgQHBhcmFtCXByaXYJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuCUF2Z05GCi0gKi8KLXN0YXRpYyB1OCBsYnNfZ2V0YXZnbmYoc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCXU4IGk7Ci0JdTE2IHRlbXAgPSAwOwotCWlmIChwcml2LT5udW1TTlJORiA9PSAwKQotCQlyZXR1cm4gMDsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtU05STkY7IGkrKykKLQkJdGVtcCArPSBwcml2LT5yYXdORltpXTsKLQlyZXR1cm4gKHU4KSAodGVtcCAvIHByaXYtPm51bVNOUk5GKTsKLQotfQotCi0vKioKLSAqICBAYnJpZWYJVGhpcyBmdW5jdGlvbiBzYXZlIHRoZSByYXcgU05SL05GIHRvIG91ciBpbnRlcm5lbCBidWZmZXIKLSAqCi0gKiAgQHBhcmFtCXByaXYJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0JcHJ4cGQJQSBwb2ludGVyIHRvIHJ4cGQgc3RydWN0dXJlIG9mIHJlY2VpdmVkIHBhY2tldAotICogIEByZXR1cm4Jbi9hCi0gKi8KLXN0YXRpYyB2b2lkIGxic19zYXZlX3Jhd1NOUk5GKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IHJ4cGQgKnBfcnhfcGQpCi17Ci0JaWYgKHByaXYtPm51bVNOUk5GIDwgREVGQVVMVF9EQVRBX0FWR19GQUNUT1IpCi0JCXByaXYtPm51bVNOUk5GKys7Ci0JcHJpdi0+cmF3U05SW3ByaXYtPm5leHRTTlJORl0gPSBwX3J4X3BkLT5zbnI7Ci0JcHJpdi0+cmF3TkZbcHJpdi0+bmV4dFNOUk5GXSA9IHBfcnhfcGQtPm5mOwotCXByaXYtPm5leHRTTlJORisrOwotCWlmIChwcml2LT5uZXh0U05STkYgPj0gREVGQVVMVF9EQVRBX0FWR19GQUNUT1IpCi0JCXByaXYtPm5leHRTTlJORiA9IDA7Ci19Ci0KLS8qKgotICogIEBicmllZglUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBSU1NJIGluIHJlY2VpdmVkIHBhY2tldC4KLSAqCi0gKiAgQHBhcmFtCXByaXYJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0JcHJ4cGQJQSBwb2ludGVyIHRvIHJ4cGQgc3RydWN0dXJlIG9mIHJlY2VpdmVkIHBhY2tldAotICogIEByZXR1cm4Jbi9hCi0gKi8KLXN0YXRpYyB2b2lkIGxic19jb21wdXRlX3Jzc2koc3RydWN0IGxic19wcml2YXRlICpwcml2LCBzdHJ1Y3QgcnhwZCAqcF9yeF9wZCkKLXsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9SWCk7Ci0KLQlsYnNfZGViX3J4KCJyeHBkOiBTTlIgJWQsIE5GICVkXG4iLCBwX3J4X3BkLT5zbnIsIHBfcnhfcGQtPm5mKTsKLQlsYnNfZGViX3J4KCJiZWZvcmUgY29tcHV0aW5nIFNOUjogU05SLWF2ZyA9ICVkLCBORi1hdmcgPSAlZFxuIiwKLQkgICAgICAgcHJpdi0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFLAotCSAgICAgICBwcml2LT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSk7Ci0KLQlwcml2LT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSA9IHBfcnhfcGQtPnNucjsKLQlwcml2LT5ORltUWVBFX1JYUERdW1RZUEVfTk9BVkddID0gcF9yeF9wZC0+bmY7Ci0JbGJzX3NhdmVfcmF3U05STkYocHJpdiwgcF9yeF9wZCk7Ci0KLQlwcml2LT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gPSBsYnNfZ2V0YXZnc25yKHByaXYpICogQVZHX1NDQUxFOwotCXByaXYtPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddID0gbGJzX2dldGF2Z25mKHByaXYpICogQVZHX1NDQUxFOwotCWxic19kZWJfcngoImFmdGVyIGNvbXB1dGluZyBTTlI6IFNOUi1hdmcgPSAlZCwgTkYtYXZnID0gJWRcbiIsCi0JICAgICAgIHByaXYtPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSwKLQkgICAgICAgcHJpdi0+TkZbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUpOwotCi0JcHJpdi0+UlNTSVtUWVBFX1JYUERdW1RZUEVfTk9BVkddID0KLQkgICAgQ0FMX1JTU0kocHJpdi0+U05SW1RZUEVfUlhQRF1bVFlQRV9OT0FWR10sCi0JCSAgICAgcHJpdi0+TkZbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSk7Ci0KLQlwcml2LT5SU1NJW1RZUEVfUlhQRF1bVFlQRV9BVkddID0KLQkgICAgQ0FMX1JTU0kocHJpdi0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFLAotCQkgICAgIHByaXYtPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9SWCk7Ci19Ci0KLS8qKgogICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyByZWNlaXZlZCBwYWNrZXQgYW5kIGZvcndhcmRzIGl0CiAgKiAgdG8ga2VybmVsL3VwcGVyIGxheWVyCiAgKgpAQCAtMTU0LDcgKzYzLDcgQEAKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAotCWlmIChwcml2LT5tb25pdG9ybW9kZSkKKwlpZiAocHJpdi0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCiAJCXJldHVybiBwcm9jZXNzX3J4ZWRfODAyXzExX3BhY2tldChwcml2LCBza2IpOwogCiAJcF9yeF9wZCA9IChzdHJ1Y3QgcnhwZCAqKSBza2ItPmRhdGE7CkBAIC0yMjUsMTMgKzEzNCw3IEBACiAJICovCiAJc2tiX3B1bGwoc2tiLCBoZHJjaG9wKTsKIAotCS8qIFRha2UgdGhlIGRhdGEgcmF0ZSBmcm9tIHRoZSByeHBkIHN0cnVjdHVyZQotCSAqIG9ubHkgaWYgdGhlIHJhdGUgaXMgYXV0bwotCSAqLwotCWlmIChwcml2LT5lbmFibGVod2F1dG8pCi0JCXByaXYtPmN1cl9yYXRlID0gbGJzX2Z3X2luZGV4X3RvX2RhdGFfcmF0ZShwX3J4X3BkLT5yeF9yYXRlKTsKLQotCWxic19jb21wdXRlX3Jzc2kocHJpdiwgcF9yeF9wZCk7CisJcHJpdi0+Y3VyX3JhdGUgPSBsYnNfZndfaW5kZXhfdG9fZGF0YV9yYXRlKHBfcnhfcGQtPnJ4X3JhdGUpOwogCiAJbGJzX2RlYl9yeCgicnggZGF0YTogc2l6ZSBvZiBhY3R1YWwgcGFja2V0ICVkXG4iLCBza2ItPmxlbik7CiAJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKQEAgLTM1MiwyMCArMjU1LDE4IEBACiAJcHJhZGlvdGFwX2hkciA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcikpOwogCW1lbWNweShwcmFkaW90YXBfaGRyLCAmcmFkaW90YXBfaGRyLCBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcikpOwogCi0JLyogVGFrZSB0aGUgZGF0YSByYXRlIGZyb20gdGhlIHJ4cGQgc3RydWN0dXJlCi0JICogb25seSBpZiB0aGUgcmF0ZSBpcyBhdXRvCi0JICovCi0JaWYgKHByaXYtPmVuYWJsZWh3YXV0bykKLQkJcHJpdi0+Y3VyX3JhdGUgPSBsYnNfZndfaW5kZXhfdG9fZGF0YV9yYXRlKHByeHBkLT5yeF9yYXRlKTsKLQotCWxic19jb21wdXRlX3Jzc2kocHJpdiwgcHJ4cGQpOworCXByaXYtPmN1cl9yYXRlID0gbGJzX2Z3X2luZGV4X3RvX2RhdGFfcmF0ZShwcnhwZC0+cnhfcmF0ZSk7CiAKIAlsYnNfZGViX3J4KCJyeCBkYXRhOiBzaXplIG9mIGFjdHVhbCBwYWNrZXQgJWRcbiIsIHNrYi0+bGVuKTsKIAlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCi0Jc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+cnRhcF9uZXRfZGV2KTsKLQluZXRpZl9yeChza2IpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHByaXYtPmRldik7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCW5ldGlmX3J4KHNrYik7CisJZWxzZQorCQluZXRpZl9yeF9uaShza2IpOwogCiAJcmV0ID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNkNTRiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NjYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNTQgKzAsMCBAQAotLyoqCi0gICogRnVuY3Rpb25zIGltcGxlbWVudGluZyB3bGFuIHNjYW4gSU9DVEwgYW5kIGZpcm13YXJlIGNvbW1hbmQgQVBJcwotICAqCi0gICogSU9DVEwgaGFuZGxlcnMgYXMgd2VsbCBhcyBjb21tYW5kIHByZXBlcmF0aW9uIGFuZCByZXNwb25zZSByb3V0aW5lcwotICAqICBmb3Igc2VuZGluZyBzY2FuIGNvbW1hbmRzIHRvIHRoZSBmaXJtd2FyZS4KLSAgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlIDxuZXQvbGliODAyMTEuaD4KLQotI2luY2x1ZGUgImhvc3QuaCIKLSNpbmNsdWRlICJkZXYuaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiYXNzb2MuaCIKLSNpbmNsdWRlICJ3ZXh0LmgiCi0jaW5jbHVkZSAiY21kLmgiCi0KLS8vISBBcHByb3hpbWF0ZSBhbW91bnQgb2YgZGF0YSBuZWVkZWQgdG8gcGFzcyBhIHNjYW4gcmVzdWx0IGJhY2sgdG8gaXdsaXN0Ci0jZGVmaW5lIE1BWF9TQ0FOX0NFTExfU0laRSAgKElXX0VWX0FERFJfTEVOICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJRUVFODAyMTFfTUFYX1NTSURfTEVOICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIElXX0VWX1VJTlRfTEVOICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSVdfRVZfRlJFUV9MRU4gICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJV19FVl9RVUFMX0xFTiAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4gICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSVdfRVZfUEFSQU1fTEVOICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyA0MCkJLyogNDAgZm9yIFdQQUlFICovCi0KLS8vISBNZW1vcnkgbmVlZGVkIHRvIHN0b3JlIGEgbWF4IHNpemVkIGNoYW5uZWwgTGlzdCBUTFYgZm9yIGEgZmlybXdhcmUgc2NhbgotI2RlZmluZSBDSEFOX1RMVl9NQVhfU0laRSAgKHNpemVvZihzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIpICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChNUlZEUlZfTUFYX0NIQU5ORUxTX1BFUl9TQ0FOICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2Yoc3RydWN0IGNoYW5zY2FucGFyYW1zZXQpKSkKLQotLy8hIE1lbW9yeSBuZWVkZWQgdG8gc3RvcmUgYSBtYXggbnVtYmVyL3NpemUgU1NJRCBUTFYgZm9yIGEgZmlybXdhcmUgc2NhbgotI2RlZmluZSBTU0lEX1RMVl9NQVhfU0laRSAgKDEgKiBzaXplb2Yoc3RydWN0IG1ydmxfaWVfc3NpZF9wYXJhbV9zZXQpKQotCi0vLyEgTWF4aW11bSBtZW1vcnkgbmVlZGVkIGZvciBhIGNtZF9kc184MDJfMTFfc2NhbiB3aXRoIGFsbCBUTFZzIGF0IG1heAotI2RlZmluZSBNQVhfU0NBTl9DRkdfQUxMT0MgKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuKQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDSEFOX1RMVl9NQVhfU0laRSArIFNTSURfVExWX01BWF9TSVpFKQotCi0vLyEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRoZSBmaXJtd2FyZSBjYW4gc2NhbiBwZXIgY29tbWFuZAotI2RlZmluZSBNUlZEUlZfTUFYX0NIQU5ORUxTX1BFUl9TQ0FOICAgMTQKLQotLyoqCi0gKiBAYnJpZWYgTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gcGVyIGZpcm13YXJlIHNjYW4gY29tbWFuZCBpc3N1YW5jZS4KLSAqCi0gKiAgTnVtYmVyIHJlc3RyaWN0ZWQgdG8gcHJldmVudCBoaXR0aW5nIHRoZSBsaW1pdCBvbiB0aGUgYW1vdW50IG9mIHNjYW4gZGF0YQotICogIHJldHVybmVkIGluIGEgc2luZ2xlIGZpcm13YXJlIHNjYW4gY29tbWFuZC4KLSAqLwotI2RlZmluZSBNUlZEUlZfQ0hBTk5FTFNfUEVSX1NDQU5fQ01EICAgNAotCi0vLyEgU2NhbiB0aW1lIHNwZWNpZmllZCBpbiB0aGUgY2hhbm5lbCBUTFYgZm9yIGVhY2ggY2hhbm5lbCBmb3IgcGFzc2l2ZSBzY2FucwotI2RlZmluZSBNUlZEUlZfUEFTU0lWRV9TQ0FOX0NIQU5fVElNRSAgMTAwCi0KLS8vISBTY2FuIHRpbWUgc3BlY2lmaWVkIGluIHRoZSBjaGFubmVsIFRMViBmb3IgZWFjaCBjaGFubmVsIGZvciBhY3RpdmUgc2NhbnMKLSNkZWZpbmUgTVJWRFJWX0FDVElWRV9TQ0FOX0NIQU5fVElNRSAgIDEwMAotCi0jZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQotCi1zdGF0aWMgaW50IGxic19yZXRfODAyMTFfc2NhbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZHVtbXksCi0JCQkgICAgICBzdHJ1Y3QgY21kX2hlYWRlciAqcmVzcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1pc2MgaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICBAYnJpZWYgVW5zZXRzIHRoZSBNU0Igb24gYmFzaWMgcmF0ZXMKLSAqCi0gKiBTY2FuIHRocm91Z2ggYW4gYXJyYXkgYW5kIHVuc2V0IHRoZSBNU0IgZm9yIGJhc2ljIGRhdGEgcmF0ZXMuCi0gKgotICogIEBwYXJhbSByYXRlcyAgICAgYnVmZmVyIG9mIGRhdGEgcmF0ZXMKLSAqICBAcGFyYW0gbGVuICAgICAgIHNpemUgb2YgYnVmZmVyCi0gKi8KLXN0YXRpYyB2b2lkIGxic191bnNldF9iYXNpY19yYXRlX2ZsYWdzKHU4ICpyYXRlcywgc2l6ZV90IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJcmF0ZXNbaV0gJj0gMHg3ZjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYnNzX2Rlc2NyaXB0b3Ioc3RydWN0IGJzc19kZXNjcmlwdG9yICpic3MpCi17Ci0JLyogRG9uJ3QgYmxvdyBhd2F5IC0+bGlzdCwganVzdCBCU1MgZGF0YSAqLwotCW1lbXNldChic3MsIDAsIG9mZnNldG9mKHN0cnVjdCBic3NfZGVzY3JpcHRvciwgbGlzdCkpOwotfQotCi0vKioKLSAqICBAYnJpZWYgQ29tcGFyZSB0d28gU1NJRHMKLSAqCi0gKiAgQHBhcmFtIHNzaWQxICAgIEEgcG9pbnRlciB0byBzc2lkIHRvIGNvbXBhcmUKLSAqICBAcGFyYW0gc3NpZDIgICAgQSBwb2ludGVyIHRvIHNzaWQgdG8gY29tcGFyZQotICoKLSAqICBAcmV0dXJuICAgICAgICAgMDogc3NpZCBpcyBzYW1lLCBvdGhlcndpc2UgaXMgZGlmZmVyZW50Ci0gKi8KLWludCBsYnNfc3NpZF9jbXAodWludDhfdCAqc3NpZDEsIHVpbnQ4X3Qgc3NpZDFfbGVuLCB1aW50OF90ICpzc2lkMiwKLQkJIHVpbnQ4X3Qgc3NpZDJfbGVuKQotewotCWlmIChzc2lkMV9sZW4gIT0gc3NpZDJfbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gbWVtY21wKHNzaWQxLCBzc2lkMiwgc3NpZDFfbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXNfc2FtZV9uZXR3b3JrKHN0cnVjdCBic3NfZGVzY3JpcHRvciAqc3JjLAotCQkJCSAgc3RydWN0IGJzc19kZXNjcmlwdG9yICpkc3QpCi17Ci0JLyogQSBuZXR3b3JrIGlzIG9ubHkgYSBkdXBsaWNhdGUgaWYgdGhlIGNoYW5uZWwsIEJTU0lELCBhbmQgRVNTSUQKLQkgKiBhbGwgbWF0Y2guICBXZSB0cmVhdCBhbGwgPGhpZGRlbj4gd2l0aCB0aGUgc2FtZSBCU1NJRCBhbmQgY2hhbm5lbAotCSAqIGFzIG9uZSBuZXR3b3JrICovCi0JcmV0dXJuICgoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSAmJgotCQkoc3JjLT5jaGFubmVsID09IGRzdC0+Y2hhbm5lbCkgJiYKLQkJIWNvbXBhcmVfZXRoZXJfYWRkcihzcmMtPmJzc2lkLCBkc3QtPmJzc2lkKSAmJgotCQkhbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlZ2lvbiBjaGFubmVsIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMQlNfVFhfUFdSX0RFRkFVTFQJCTIwCS8qMTAwbVcgKi8KLSNkZWZpbmUgTEJTX1RYX1BXUl9VU19ERUZBVUxUCQkyMAkvKjEwMG1XICovCi0jZGVmaW5lIExCU19UWF9QV1JfSlBfREVGQVVMVAkJMTYJLyo1MG1XICovCi0jZGVmaW5lIExCU19UWF9QV1JfRlJfREVGQVVMVAkJMjAJLyoxMDBtVyAqLwotI2RlZmluZSBMQlNfVFhfUFdSX0VNRUFfREVGQVVMVAkyMAkvKjEwMG1XICovCi0KLS8qIEZvcm1hdCB7IGNoYW5uZWwsIGZyZXF1ZW5jeSAoTUh6KSwgbWF4dHhwb3dlciB9ICovCi0vKiBiYW5kOiAnQi9HJywgcmVnaW9uOiBVU0EgRkNDL0NhbmFkYSBJQyAqLwotc3RhdGljIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHW10gPSB7Ci0JezEsIDI0MTIsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezIsIDI0MTcsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezMsIDI0MjIsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezQsIDI0MjcsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezUsIDI0MzIsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezYsIDI0MzcsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezcsIDI0NDIsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezgsIDI0NDcsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezksIDI0NTIsIExCU19UWF9QV1JfVVNfREVGQVVMVH0sCi0JezEwLCAyNDU3LCBMQlNfVFhfUFdSX1VTX0RFRkFVTFR9LAotCXsxMSwgMjQ2MiwgTEJTX1RYX1BXUl9VU19ERUZBVUxUfQotfTsKLQotLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogRXVyb3BlIEVUU0kgKi8KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9FVV9CR1tdID0gewotCXsxLCAyNDEyLCBMQlNfVFhfUFdSX0VNRUFfREVGQVVMVH0sCi0JezIsIDI0MTcsIExCU19UWF9QV1JfRU1FQV9ERUZBVUxUfSwKLQl7MywgMjQyMiwgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAotCXs0LCAyNDI3LCBMQlNfVFhfUFdSX0VNRUFfREVGQVVMVH0sCi0JezUsIDI0MzIsIExCU19UWF9QV1JfRU1FQV9ERUZBVUxUfSwKLQl7NiwgMjQzNywgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAotCXs3LCAyNDQyLCBMQlNfVFhfUFdSX0VNRUFfREVGQVVMVH0sCi0JezgsIDI0NDcsIExCU19UWF9QV1JfRU1FQV9ERUZBVUxUfSwKLQl7OSwgMjQ1MiwgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAotCXsxMCwgMjQ1NywgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAotCXsxMSwgMjQ2MiwgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAotCXsxMiwgMjQ2NywgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAotCXsxMywgMjQ3MiwgTEJTX1RYX1BXUl9FTUVBX0RFRkFVTFR9Ci19OwotCi0vKiBiYW5kOiAnQi9HJywgcmVnaW9uOiBTcGFpbiAqLwotc3RhdGljIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgY2hhbm5lbF9mcmVxX3Bvd2VyX1NQTl9CR1tdID0gewotCXsxMCwgMjQ1NywgTEJTX1RYX1BXUl9ERUZBVUxUfSwKLQl7MTEsIDI0NjIsIExCU19UWF9QV1JfREVGQVVMVH0KLX07Ci0KLS8qIGJhbmQ6ICdCL0cnLCByZWdpb246IEZyYW5jZSAqLwotc3RhdGljIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgY2hhbm5lbF9mcmVxX3Bvd2VyX0ZSX0JHW10gPSB7Ci0JezEwLCAyNDU3LCBMQlNfVFhfUFdSX0ZSX0RFRkFVTFR9LAotCXsxMSwgMjQ2MiwgTEJTX1RYX1BXUl9GUl9ERUZBVUxUfSwKLQl7MTIsIDI0NjcsIExCU19UWF9QV1JfRlJfREVGQVVMVH0sCi0JezEzLCAyNDcyLCBMQlNfVFhfUFdSX0ZSX0RFRkFVTFR9Ci19OwotCi0vKiBiYW5kOiAnQi9HJywgcmVnaW9uOiBKYXBhbiAqLwotc3RhdGljIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgY2hhbm5lbF9mcmVxX3Bvd2VyX0pQTl9CR1tdID0gewotCXsxLCAyNDEyLCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXsyLCAyNDE3LCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXszLCAyNDIyLCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXs0LCAyNDI3LCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXs1LCAyNDMyLCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXs2LCAyNDM3LCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXs3LCAyNDQyLCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXs4LCAyNDQ3LCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXs5LCAyNDUyLCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXsxMCwgMjQ1NywgTEJTX1RYX1BXUl9KUF9ERUZBVUxUfSwKLQl7MTEsIDI0NjIsIExCU19UWF9QV1JfSlBfREVGQVVMVH0sCi0JezEyLCAyNDY3LCBMQlNfVFhfUFdSX0pQX0RFRkFVTFR9LAotCXsxMywgMjQ3MiwgTEJTX1RYX1BXUl9KUF9ERUZBVUxUfSwKLQl7MTQsIDI0ODQsIExCU19UWF9QV1JfSlBfREVGQVVMVH0KLX07Ci0KLS8qKgotICogdGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCwgZnJlcXVlbmN5IGFuZCBwb3dlcgotICovCi1zdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSB7Ci0JdTggcmVnaW9uOwotCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcF9CRzsKLQlpbnQgY2ZwX25vX0JHOwotfTsKLQotLyoqCi0gKiB0aGUgc3RydWN0dXJlIGZvciB0aGUgbWFwcGluZyBiZXR3ZWVuIHJlZ2lvbiBhbmQgQ0ZQCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSByZWdpb25fY2ZwX3RhYmxlW10gPSB7Ci0JezB4MTAsCQkJLypVUyBGQ0MgKi8KLQkgY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHLAotCSBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcV9wb3dlcl9VU19CRyksCi0JIH0KLQksCi0JezB4MjAsCQkJLypDQU5BREEgSUMgKi8KLQkgY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHLAotCSBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcV9wb3dlcl9VU19CRyksCi0JIH0KLQksCi0JezB4MzAsIC8qRVUqLyBjaGFubmVsX2ZyZXFfcG93ZXJfRVVfQkcsCi0JIEFSUkFZX1NJWkUoY2hhbm5lbF9mcmVxX3Bvd2VyX0VVX0JHKSwKLQkgfQotCSwKLQl7MHgzMSwgLypTUEFJTiovIGNoYW5uZWxfZnJlcV9wb3dlcl9TUE5fQkcsCi0JIEFSUkFZX1NJWkUoY2hhbm5lbF9mcmVxX3Bvd2VyX1NQTl9CRyksCi0JIH0KLQksCi0JezB4MzIsIC8qRlJBTkNFKi8gY2hhbm5lbF9mcmVxX3Bvd2VyX0ZSX0JHLAotCSBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcV9wb3dlcl9GUl9CRyksCi0JIH0KLQksCi0JezB4NDAsIC8qSkFQQU4qLyBjaGFubmVsX2ZyZXFfcG93ZXJfSlBOX0JHLAotCSBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcV9wb3dlcl9KUE5fQkcpLAotCSB9Ci0JLAotLypBZGQgbmV3IHJlZ2lvbiBoZXJlICovCi19OwotCi0vKioKLSAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgQ0ZQIGluCi0gKiAgcmVnaW9uX2NmcF90YWJsZSBiYXNlZCBvbiByZWdpb24gYW5kIGJhbmQgcGFyYW1ldGVyLgotICoKLSAqICBAcGFyYW0gcmVnaW9uICBUaGUgcmVnaW9uIGNvZGUKLSAqICBAcGFyYW0gYmFuZAkgICBUaGUgYmFuZAotICogIEBwYXJhbSBjZnBfbm8gIEEgcG9pbnRlciB0byBDRlAgbnVtYmVyCi0gKiAgQHJldHVybiAJICAgQSBwb2ludGVyIHRvIENGUAotICovCi1zdGF0aWMgc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGJzX2dldF9yZWdpb25fY2ZwX3RhYmxlKHU4IHJlZ2lvbiwgaW50ICpjZnBfbm8pCi17Ci0JaW50IGksIGVuZDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9NQUlOKTsKLQotCWVuZCA9IEFSUkFZX1NJWkUocmVnaW9uX2NmcF90YWJsZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZW5kIDsgaSsrKSB7Ci0JCWxic19kZWJfbWFpbigicmVnaW9uX2NmcF90YWJsZVtpXS5yZWdpb249JWRcbiIsCi0JCQlyZWdpb25fY2ZwX3RhYmxlW2ldLnJlZ2lvbik7Ci0JCWlmIChyZWdpb25fY2ZwX3RhYmxlW2ldLnJlZ2lvbiA9PSByZWdpb24pIHsKLQkJCSpjZnBfbm8gPSByZWdpb25fY2ZwX3RhYmxlW2ldLmNmcF9ub19CRzsKLQkJCWxic19kZWJfbGVhdmUoTEJTX0RFQl9NQUlOKTsKLQkJCXJldHVybiByZWdpb25fY2ZwX3RhYmxlW2ldLmNmcF9CRzsKLQkJfQotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX01BSU4sICJyZXQgTlVMTCIpOwotCXJldHVybiBOVUxMOwotfQotCi1pbnQgbGJzX3NldF9yZWdpb250YWJsZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4IHJlZ2lvbiwgdTggYmFuZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7Ci0JaW50IGNmcF9ubzsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9NQUlOKTsKLQotCW1lbXNldChwcml2LT5yZWdpb25fY2hhbm5lbCwgMCwgc2l6ZW9mKHByaXYtPnJlZ2lvbl9jaGFubmVsKSk7Ci0KLQljZnAgPSBsYnNfZ2V0X3JlZ2lvbl9jZnBfdGFibGUocmVnaW9uLCAmY2ZwX25vKTsKLQlpZiAoY2ZwICE9IE5VTEwpIHsKLQkJcHJpdi0+cmVnaW9uX2NoYW5uZWxbaV0ubnJjZnAgPSBjZnBfbm87Ci0JCXByaXYtPnJlZ2lvbl9jaGFubmVsW2ldLkNGUCA9IGNmcDsKLQl9IGVsc2UgewotCQlsYnNfZGViX21haW4oIndyb25nIHJlZ2lvbiBjb2RlICUjeCBpbiBiYW5kIEIvR1xuIiwKLQkJICAgICAgIHJlZ2lvbik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0JcHJpdi0+cmVnaW9uX2NoYW5uZWxbaV0udmFsaWQgPSAxOwotCXByaXYtPnJlZ2lvbl9jaGFubmVsW2ldLnJlZ2lvbiA9IHJlZ2lvbjsKLQlwcml2LT5yZWdpb25fY2hhbm5lbFtpXS5iYW5kID0gYmFuZDsKLQlpKys7Ci1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfTUFJTiwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFpbiBzY2FubmluZyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogIEBicmllZiBDcmVhdGUgYSBjaGFubmVsIGxpc3QgZm9yIHRoZSBkcml2ZXIgdG8gc2NhbiBiYXNlZCBvbiByZWdpb24gaW5mbwotICoKLSAqICBPbmx5IHVzZWQgZnJvbSBsYnNfc2Nhbl9zZXR1cF9zY2FuX2NvbmZpZygpCi0gKgotICogIFVzZSB0aGUgZHJpdmVyIHJlZ2lvbi9iYW5kIGluZm9ybWF0aW9uIHRvIGNvbnN0cnVjdCBhIGNvbXByZWhlbnNpdmUgbGlzdAotICogICAgb2YgY2hhbm5lbHMgdG8gc2Nhbi4gIFRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBhbnkgc2NhbiB0aGF0IGlzIG5vdAotICogICAgcHJvdmlkZWQgYSBzcGVjaWZpYyBjaGFubmVsIGxpc3QgdG8gc2Nhbi4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gc2NhbmNoYW5saXN0ICBPdXRwdXQgcGFyYW1ldGVyOiByZXN1bHRpbmcgY2hhbm5lbCBsaXN0IHRvIHNjYW4KLSAqCi0gKiAgQHJldHVybiAgICAgICAgICAgICAgdm9pZAotICovCi1zdGF0aWMgaW50IGxic19zY2FuX2NyZWF0ZV9jaGFubmVsX2xpc3Qoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCQlzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCAqc2NhbmNoYW5saXN0KQotewotCXN0cnVjdCByZWdpb25fY2hhbm5lbCAqc2NhbnJlZ2lvbjsKLQlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7Ci0JaW50IHJnbmlkeDsKLQlpbnQgY2hhbmlkeDsKLQlpbnQgbmV4dGNoYW47Ci0JdWludDhfdCBzY2FudHlwZTsKLQotCWNoYW5pZHggPSAwOwotCi0JLyogU2V0IHRoZSBkZWZhdWx0IHNjYW4gdHlwZSB0byB0aGUgdXNlciBzcGVjaWZpZWQgdHlwZSwgd2lsbCBsYXRlcgotCSAqICAgYmUgY2hhbmdlZCB0byBwYXNzaXZlIG9uIGEgcGVyIGNoYW5uZWwgYmFzaXMgaWYgcmVzdHJpY3RlZCBieQotCSAqICAgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgKDExZCBvciAxMWgpCi0JICovCi0Jc2NhbnR5cGUgPSBDTURfU0NBTl9UWVBFX0FDVElWRTsKLQotCWZvciAocmduaWR4ID0gMDsgcmduaWR4IDwgQVJSQVlfU0laRShwcml2LT5yZWdpb25fY2hhbm5lbCk7IHJnbmlkeCsrKSB7Ci0JCWlmICghcHJpdi0+cmVnaW9uX2NoYW5uZWxbcmduaWR4XS52YWxpZCkKLQkJCWNvbnRpbnVlOwotCQlzY2FucmVnaW9uID0gJnByaXYtPnJlZ2lvbl9jaGFubmVsW3JnbmlkeF07Ci0KLQkJZm9yIChuZXh0Y2hhbiA9IDA7IG5leHRjaGFuIDwgc2NhbnJlZ2lvbi0+bnJjZnA7IG5leHRjaGFuKyssIGNoYW5pZHgrKykgewotCQkJc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgKmNoYW4gPSAmc2NhbmNoYW5saXN0W2NoYW5pZHhdOwotCi0JCQljZnAgPSBzY2FucmVnaW9uLT5DRlAgKyBuZXh0Y2hhbjsKLQotCQkJaWYgKHNjYW5yZWdpb24tPmJhbmQgPT0gQkFORF9CIHx8IHNjYW5yZWdpb24tPmJhbmQgPT0gQkFORF9HKQotCQkJCWNoYW4tPnJhZGlvdHlwZSA9IENNRF9TQ0FOX1JBRElPX1RZUEVfQkc7Ci0KLQkJCWlmIChzY2FudHlwZSA9PSBDTURfU0NBTl9UWVBFX1BBU1NJVkUpIHsKLQkJCQljaGFuLT5tYXhzY2FudGltZSA9IGNwdV90b19sZTE2KE1SVkRSVl9QQVNTSVZFX1NDQU5fQ0hBTl9USU1FKTsKLQkJCQljaGFuLT5jaGFuc2Nhbm1vZGUucGFzc2l2ZXNjYW4gPSAxOwotCQkJfSBlbHNlIHsKLQkJCQljaGFuLT5tYXhzY2FudGltZSA9IGNwdV90b19sZTE2KE1SVkRSVl9BQ1RJVkVfU0NBTl9DSEFOX1RJTUUpOwotCQkJCWNoYW4tPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiA9IDA7Ci0JCQl9Ci0KLQkJCWNoYW4tPmNoYW5udW1iZXIgPSBjZnAtPmNoYW5uZWw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNoYW5pZHg7Ci19Ci0KLS8qCi0gKiBBZGQgU1NJRCBUTFYgb2YgdGhlIGZvcm06Ci0gKgotICogVExWLUlEIFNTSUQgICAgIDAwIDAwCi0gKiBsZW5ndGggICAgICAgICAgMDYgMDAKLSAqIHNzaWQgICAgICAgICAgICA0ZCA0ZSA1NCA0NSA1MyA1NAotICovCi1zdGF0aWMgaW50IGxic19zY2FuX2FkZF9zc2lkX3RsdihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4ICp0bHYpCi17Ci0Jc3RydWN0IG1ydmxfaWVfc3NpZF9wYXJhbV9zZXQgKnNzaWRfdGx2ID0gKHZvaWQgKil0bHY7Ci0KLQlzc2lkX3Rsdi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9TU0lEKTsKLQlzc2lkX3Rsdi0+aGVhZGVyLmxlbiA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fc3NpZF9sZW4pOwotCW1lbWNweShzc2lkX3Rsdi0+c3NpZCwgcHJpdi0+c2Nhbl9zc2lkLCBwcml2LT5zY2FuX3NzaWRfbGVuKTsKLQlyZXR1cm4gc2l6ZW9mKHNzaWRfdGx2LT5oZWFkZXIpICsgcHJpdi0+c2Nhbl9zc2lkX2xlbjsKLX0KLQotLyoKLSAqIEFkZCBDSEFOTElTVCBUTFYgb2YgdGhlIGZvcm0KLSAqCi0gKiBUTFYtSUQgQ0hBTkxJU1QgMDEgMDEKLSAqIGxlbmd0aCAgICAgICAgICA1YiAwMAotICogY2hhbm5lbCAxICAgICAgIDAwIDAxIDAwIDAwIDAwIDY0IDAwCi0gKiAgIHJhZGlvIHR5cGUgICAgMDAKLSAqICAgY2hhbm5lbCAgICAgICAgICAwMQotICogICBzY2FuIHR5cGUgICAgICAgICAgIDAwCi0gKiAgIG1pbiBzY2FuIHRpbWUgICAgICAgICAgMDAgMDAKLSAqICAgbWF4IHNjYW4gdGltZSAgICAgICAgICAgICAgICA2NCAwMAotICogY2hhbm5lbCAyICAgICAgIDAwIDAyIDAwIDAwIDAwIDY0IDAwCi0gKiBjaGFubmVsIDMgICAgICAgMDAgMDMgMDAgMDAgMDAgNjQgMDAKLSAqIGNoYW5uZWwgNCAgICAgICAwMCAwNCAwMCAwMCAwMCA2NCAwMAotICogY2hhbm5lbCA1ICAgICAgIDAwIDA1IDAwIDAwIDAwIDY0IDAwCi0gKiBjaGFubmVsIDYgICAgICAgMDAgMDYgMDAgMDAgMDAgNjQgMDAKLSAqIGNoYW5uZWwgNyAgICAgICAwMCAwNyAwMCAwMCAwMCA2NCAwMAotICogY2hhbm5lbCA4ICAgICAgIDAwIDA4IDAwIDAwIDAwIDY0IDAwCi0gKiBjaGFubmVsIDkgICAgICAgMDAgMDkgMDAgMDAgMDAgNjQgMDAKLSAqIGNoYW5uZWwgMTAgICAgICAwMCAwYSAwMCAwMCAwMCA2NCAwMAotICogY2hhbm5lbCAxMSAgICAgIDAwIDBiIDAwIDAwIDAwIDY0IDAwCi0gKiBjaGFubmVsIDEyICAgICAgMDAgMGMgMDAgMDAgMDAgNjQgMDAKLSAqIGNoYW5uZWwgMTMgICAgICAwMCAwZCAwMCAwMCAwMCA2NCAwMAotICoKLSAqLwotc3RhdGljIGludCBsYnNfc2Nhbl9hZGRfY2hhbmxpc3RfdGx2KHVpbnQ4X3QgKnRsdiwKLQkJCQkgICAgIHN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICpjaGFuX2xpc3QsCi0JCQkJICAgICBpbnQgY2hhbl9jb3VudCkKLXsKLQlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCkgKmNoYW5fY291bnQ7Ci0Jc3RydWN0IG1ydmxfaWVfY2hhbmxpc3RfcGFyYW1fc2V0ICpjaGFuX3RsdiA9ICh2b2lkICopdGx2OwotCi0JY2hhbl90bHYtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfQ0hBTkxJU1QpOwotCW1lbWNweShjaGFuX3Rsdi0+Y2hhbnNjYW5wYXJhbSwgY2hhbl9saXN0LCBzaXplKTsKLQljaGFuX3Rsdi0+aGVhZGVyLmxlbiA9IGNwdV90b19sZTE2KHNpemUpOwotCXJldHVybiBzaXplb2YoY2hhbl90bHYtPmhlYWRlcikgKyBzaXplOwotfQotCi0vKgotICogQWRkIFJBVEVTIFRMViBvZiB0aGUgZm9ybQotICoKLSAqIFRMVi1JRCBSQVRFUyAgICAwMSAwMAotICogbGVuZ3RoICAgICAgICAgIDBlIDAwCi0gKiByYXRlcyAgICAgICAgICAgODIgODQgOGIgOTYgMGMgMTIgMTggMjQgMzAgNDggNjAgNmMKLSAqCi0gKiBUaGUgcmF0ZXMgYXJlIGluIGxic19iZ19yYXRlc1tdLCBidXQgZm9yIHRoZSA4MDIuMTFiCi0gKiByYXRlcyB0aGUgaGlnaCBiaXQgaXNuJ3Qgc2V0LgotICovCi1zdGF0aWMgaW50IGxic19zY2FuX2FkZF9yYXRlc190bHYodWludDhfdCAqdGx2KQotewotCWludCBpOwotCXN0cnVjdCBtcnZsX2llX3JhdGVzX3BhcmFtX3NldCAqcmF0ZV90bHYgPSAodm9pZCAqKXRsdjsKLQotCXJhdGVfdGx2LT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1JBVEVTKTsKLQl0bHYgKz0gc2l6ZW9mKHJhdGVfdGx2LT5oZWFkZXIpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfUkFURVM7IGkrKykgewotCQkqdGx2ID0gbGJzX2JnX3JhdGVzW2ldOwotCQlpZiAoKnRsdiA9PSAwKQotCQkJYnJlYWs7Ci0JCS8qIFRoaXMgY29kZSBtYWtlcyBzdXJlIHRoYXQgdGhlIDgwMi4xMWIgcmF0ZXMgKDEgTUJpdC9zLCAyCi0JCSAgIE1CaXQvcywgNS41IE1CaXQvcyBhbmQgMTEgTUJpdC9zIGdldCdzIHRoZSBoaWdoIGJpdCBzZXQuCi0JCSAgIE5vdGUgdGhhdCB0aGUgdmFsdWVzIGFyZSBNQml0L3MgKiAyLCB0byBtYXJrIHRoZW0gYXMKLQkJICAgYmFzaWMgcmF0ZXMgc28gdGhhdCB0aGUgZmlybXdhcmUgbGlrZXMgaXQgYmV0dGVyICovCi0JCWlmICgqdGx2ID09IDB4MDIgfHwgKnRsdiA9PSAweDA0IHx8Ci0JCSAgICAqdGx2ID09IDB4MGIgfHwgKnRsdiA9PSAweDE2KQotCQkJKnRsdiB8PSAweDgwOwotCQl0bHYrKzsKLQl9Ci0JcmF0ZV90bHYtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihpKTsKLQlyZXR1cm4gc2l6ZW9mKHJhdGVfdGx2LT5oZWFkZXIpICsgaTsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIHRoZSBDTURfODAyXzExX1NDQU4gY29tbWFuZCB3aXRoIHRoZSBwcm9wZXIgdGx2Ci0gKiBmb3IgYSBidW5jaCBvZiBjaGFubmVscy4KLSAqLwotc3RhdGljIGludCBsYnNfZG9fc2NhbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQ4X3QgYnNzdHlwZSwKLQkJICAgICAgIHN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICpjaGFuX2xpc3QsIGludCBjaGFuX2NvdW50KQotewotCWludCByZXQgPSAtRU5PTUVNOwotCXN0cnVjdCBjbWRfZHNfODAyXzExX3NjYW4gKnNjYW5fY21kOwotCXVpbnQ4X3QgKnRsdjsJLyogcG9pbnRlciBpbnRvIG91ciBjdXJyZW50LCBncm93aW5nIFRMViBzdG9yYWdlIGFyZWEgKi8KLQotCWxic19kZWJfZW50ZXJfYXJncyhMQlNfREVCX1NDQU4sICJic3N0eXBlICVkLCBjaGFubGlzdFtdLmNoYW4gJWQsIGNoYW5fY291bnQgJWQiLAotCQlic3N0eXBlLCBjaGFuX2xpc3QgPyBjaGFuX2xpc3RbMF0uY2hhbm51bWJlciA6IC0xLAotCQljaGFuX2NvdW50KTsKLQotCS8qIGNyZWF0ZSB0aGUgZml4ZWQgcGFydCBmb3Igc2NhbiBjb21tYW5kICovCi0Jc2Nhbl9jbWQgPSBremFsbG9jKE1BWF9TQ0FOX0NGR19BTExPQywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNjYW5fY21kID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JdGx2ID0gc2Nhbl9jbWQtPnRsdmJ1ZmZlcjsKLQkvKiBUT0RPOiBkbyB3ZSBuZWVkIHRvIHNjYW4gZm9yIGEgc3BlY2lmaWMgQlNTSUQ/Ci0JbWVtY3B5KHNjYW5fY21kLT5ic3NpZCwgcHJpdi0+c2Nhbl9ic3NpZCwgRVRIX0FMRU4pOyAqLwotCXNjYW5fY21kLT5ic3N0eXBlID0gYnNzdHlwZTsKLQotCS8qIGFkZCBUTFZzICovCi0JaWYgKHByaXYtPnNjYW5fc3NpZF9sZW4pCi0JCXRsdiArPSBsYnNfc2Nhbl9hZGRfc3NpZF90bHYocHJpdiwgdGx2KTsKLQlpZiAoY2hhbl9saXN0ICYmIGNoYW5fY291bnQpCi0JCXRsdiArPSBsYnNfc2Nhbl9hZGRfY2hhbmxpc3RfdGx2KHRsdiwgY2hhbl9saXN0LCBjaGFuX2NvdW50KTsKLQl0bHYgKz0gbGJzX3NjYW5fYWRkX3JhdGVzX3Rsdih0bHYpOwotCi0JLyogVGhpcyBpcyB0aGUgZmluYWwgZGF0YSB3ZSBhcmUgYWJvdXQgdG8gc2VuZCAqLwotCXNjYW5fY21kLT5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHRsdiAtICh1aW50OF90ICopc2Nhbl9jbWQpOwotCWxic19kZWJfaGV4KExCU19ERUJfU0NBTiwgIlNDQU5fQ01EIiwgKHZvaWQgKilzY2FuX2NtZCwKLQkJICAgIHNpemVvZigqc2Nhbl9jbWQpKTsKLQlsYnNfZGViX2hleChMQlNfREVCX1NDQU4sICJTQ0FOX1RMViIsIHNjYW5fY21kLT50bHZidWZmZXIsCi0JCSAgICB0bHYgLSBzY2FuX2NtZC0+dGx2YnVmZmVyKTsKLQotCXJldCA9IF9fbGJzX2NtZChwcml2LCBDTURfODAyXzExX1NDQU4sICZzY2FuX2NtZC0+aGRyLAotCQkJbGUxNl90b19jcHUoc2Nhbl9jbWQtPmhkci5zaXplKSwKLQkJCWxic19yZXRfODAyMTFfc2NhbiwgMCk7Ci0KLW91dDoKLQlrZnJlZShzY2FuX2NtZCk7Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfU0NBTiwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gc3RhcnQgYSBzY2FuIGJhc2VkIG9uIGFuIGlucHV0IGNvbmZpZwotICoKLSAqICBVc2UgdGhlIGlucHV0IHVzZXIgc2NhbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gcHJvdmlkZWQgaW4KLSAqICAgIG9yZGVyIHRvIHNlbmQgdGhlIGFwcHJvcHJpYXRlIHNjYW4gY29tbWFuZHMgdG8gZmlybXdhcmUgdG8gcG9wdWxhdGUgb3IKLSAqICAgIHVwZGF0ZSB0aGUgaW50ZXJuYWwgZHJpdmVyIHNjYW4gdGFibGUKLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gZnVsbF9zY2FuICAgICBEbyBhIGZ1bGwtc2NhbiAoYmxvY2tpbmcpCi0gKgotICogIEByZXR1cm4gICAgICAgICAgICAgIDAgb3IgPCAwIGlmIGVycm9yCi0gKi8KLWludCBsYnNfc2Nhbl9uZXR3b3JrcyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGludCBmdWxsX3NjYW4pCi17Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0Jc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgKmNoYW5fbGlzdDsKLQlzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCAqY3Vycl9jaGFuczsKLQlpbnQgY2hhbl9jb3VudDsKLQl1aW50OF90IGJzc3R5cGUgPSBDTURfQlNTX1RZUEVfQU5ZOwotCWludCBudW1jaGFubmVscyA9IE1SVkRSVl9DSEFOTkVMU19QRVJfU0NBTl9DTUQ7Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotI2lmZGVmIENPTkZJR19MSUJFUlRBU19ERUJVRwotCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqaXRlcjsKLQlpbnQgaSA9IDA7Ci0JREVDTEFSRV9TU0lEX0JVRihzc2lkKTsKLSNlbmRpZgotCi0JbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfU0NBTiwgImZ1bGxfc2NhbiAlZCIsIGZ1bGxfc2Nhbik7Ci0KLQkvKiBDYW5jZWwgYW55IHBhcnRpYWwgb3V0c3RhbmRpbmcgcGFydGlhbCBzY2FucyBpZiB0aGlzIHNjYW4KLQkgKiBpcyBhIGZ1bGwgc2Nhbi4KLQkgKi8KLQlpZiAoZnVsbF9zY2FuICYmIGRlbGF5ZWRfd29ya19wZW5kaW5nKCZwcml2LT5zY2FuX3dvcmspKQotCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX3dvcmspOwotCi0JLyogVXNlci1zcGVjaWZpZWQgYnNzdHlwZSBvciBjaGFubmVsIGxpc3QKLQlUT0RPOiB0aGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBpZiBzb21lIHVzZXItc3BhY2UgYXBwbGljYXRpb24KLQluZWVkIHRoZSBmZWF0dXJlLiBGb3JtZXJseSwgaXQgd2FzIGFjY2Vzc2libGUgZnJvbSBkZWJ1Z2ZzLAotCWJ1dCB0aGVuIG5vd2hlcmUgdXNlZC4KLQlpZiAodXNlcl9jZmcpIHsKLQkJaWYgKHVzZXJfY2ZnLT5ic3N0eXBlKQotCQlic3N0eXBlID0gdXNlcl9jZmctPmJzc3R5cGU7Ci0JfSAqLwotCi0JbGJzX2RlYl9zY2FuKCJudW1jaGFubmVscyAlZCwgYnNzdHlwZSAlZFxuIiwgbnVtY2hhbm5lbHMsIGJzc3R5cGUpOwotCi0JLyogQ3JlYXRlIGxpc3Qgb2YgY2hhbm5lbHMgdG8gc2NhbiAqLwotCWNoYW5fbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0KSAqCi0JCQkgICAgTEJTX0lPQ1RMX1VTRVJfU0NBTl9DSEFOX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFuX2xpc3QpIHsKLQkJbGJzX3ByX2FsZXJ0KCJTQ0FOOiBjaGFuX2xpc3QgZW1wdHlcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBXZSB3YW50IHRvIHNjYW4gYWxsIGNoYW5uZWxzICovCi0JY2hhbl9jb3VudCA9IGxic19zY2FuX2NyZWF0ZV9jaGFubmVsX2xpc3QocHJpdiwgY2hhbl9saXN0KTsKLQotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+ZGV2KTsKLQlpZiAocHJpdi0+bWVzaF9kZXYpCi0JCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bWVzaF9kZXYpOwotCi0JLyogUHJlcGFyZSB0byBjb250aW51ZSBhbiBpbnRlcnJ1cHRlZCBzY2FuICovCi0JbGJzX2RlYl9zY2FuKCJjaGFuX2NvdW50ICVkLCBzY2FuX2NoYW5uZWwgJWRcbiIsCi0JCSAgICAgY2hhbl9jb3VudCwgcHJpdi0+c2Nhbl9jaGFubmVsKTsKLQljdXJyX2NoYW5zID0gY2hhbl9saXN0OwotCS8qIGFkdmFuY2UgY2hhbm5lbCBsaXN0IGJ5IGFscmVhZHktc2Nhbm5lZC1jaGFubmVscyAqLwotCWlmIChwcml2LT5zY2FuX2NoYW5uZWwgPiAwKSB7Ci0JCWN1cnJfY2hhbnMgKz0gcHJpdi0+c2Nhbl9jaGFubmVsOwotCQljaGFuX2NvdW50IC09IHByaXYtPnNjYW5fY2hhbm5lbDsKLQl9Ci0KLQkvKiBTZW5kIHNjYW4gY29tbWFuZChzKQotCSAqIG51bWNoYW5uZWxzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgd2Ugc2hvdWxkIG1heGltYWxseSBzY2FuCi0JICogY2hhbl9jb3VudCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KLQkgKi8KLQotCXdoaWxlIChjaGFuX2NvdW50KSB7Ci0JCWludCB0b19zY2FuID0gbWluKG51bWNoYW5uZWxzLCBjaGFuX2NvdW50KTsKLQkJbGJzX2RlYl9zY2FuKCJzY2FubmluZyAlZCBvZiAlZCBjaGFubmVsc1xuIiwKLQkJCSAgICAgdG9fc2NhbiwgY2hhbl9jb3VudCk7Ci0JCXJldCA9IGxic19kb19zY2FuKHByaXYsIGJzc3R5cGUsIGN1cnJfY2hhbnMsCi0JCQkJICB0b19zY2FuKTsKLQkJaWYgKHJldCkgewotCQkJbGJzX3ByX2VycigiU0NBTl9DTUQgZmFpbGVkXG4iKTsKLQkJCWdvdG8gb3V0MjsKLQkJfQotCQljdXJyX2NoYW5zICs9IHRvX3NjYW47Ci0JCWNoYW5fY291bnQgLT0gdG9fc2NhbjsKLQotCQkvKiBzb21laG93IHNjaGVkdWxlIHRoZSBuZXh0IHBhcnQgb2YgdGhlIHNjYW4gKi8KLQkJaWYgKGNoYW5fY291bnQgJiYgIWZ1bGxfc2NhbiAmJgotCQkgICAgIXByaXYtPnN1cnByaXNlcmVtb3ZlZCkgewotCQkJLyogLTEgbWFya3MganVzdCB0aGF0IHdlJ3JlIGN1cnJlbnRseSBzY2FubmluZyAqLwotCQkJaWYgKHByaXYtPnNjYW5fY2hhbm5lbCA8IDApCi0JCQkJcHJpdi0+c2Nhbl9jaGFubmVsID0gdG9fc2NhbjsKLQkJCWVsc2UKLQkJCQlwcml2LT5zY2FuX2NoYW5uZWwgKz0gdG9fc2NhbjsKLQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNjYW5fd29yayk7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya190aHJlYWQsICZwcml2LT5zY2FuX3dvcmssCi0JCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMzAwKSk7Ci0JCQkvKiBza2lwIG92ZXIgR0lXU0NBTiBldmVudCAqLwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCX0KLQltZW1zZXQoJndycXUsIDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5kZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7Ci0KLSNpZmRlZiBDT05GSUdfTElCRVJUQVNfREVCVUcKLQkvKiBEdW1wIHRoZSBzY2FuIHRhYmxlICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JbGJzX2RlYl9zY2FuKCJzY2FuIHRhYmxlOlxuIik7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmcHJpdi0+bmV0d29ya19saXN0LCBsaXN0KQotCQlsYnNfZGViX3NjYW4oIiUwMmQ6IEJTU0lEICVwTSwgUlNTSSAlZCwgU1NJRCAnJXMnXG4iLAotCQkJICAgICBpKyssIGl0ZXItPmJzc2lkLCBpdGVyLT5yc3NpLAotCQkJICAgICBwcmludF9zc2lkKHNzaWQsIGl0ZXItPnNzaWQsIGl0ZXItPnNzaWRfbGVuKSk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKLSNlbmRpZgotCi1vdXQyOgotCXByaXYtPnNjYW5fY2hhbm5lbCA9IDA7Ci0KLW91dDoKLQlpZiAocHJpdi0+Y29ubmVjdF9zdGF0dXMgPT0gTEJTX0NPTk5FQ1RFRCAmJiAhcHJpdi0+dHhfcGVuZGluZ19sZW4pCi0JCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKLQotCWlmIChwcml2LT5tZXNoX2RldiAmJiBsYnNfbWVzaF9jb25uZWN0ZWQocHJpdikgJiYKLQkgICAgIXByaXYtPnR4X3BlbmRpbmdfbGVuKQotCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm1lc2hfZGV2KTsKLQotCWtmcmVlKGNoYW5fbGlzdCk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9TQ0FOLCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGxic19zY2FuX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsYnNfcHJpdmF0ZSwgc2Nhbl93b3JrLndvcmspOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1NDQU4pOwotCWxic19zY2FuX25ldHdvcmtzKHByaXYsIDApOwotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9TQ0FOKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXN1bHQgaW50ZXJwcmV0YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiAgQGJyaWVmIEludGVycHJldCBhIEJTUyBzY2FuIHJlc3BvbnNlIHJldHVybmVkIGZyb20gdGhlIGZpcm13YXJlCi0gKgotICogIFBhcnNlIHRoZSB2YXJpb3VzIGZpeGVkIGZpZWxkcyBhbmQgSUVzIHBhc3NlZCBiYWNrIGZvciBhIGEgQlNTIHByb2JlCi0gKiAgcmVzcG9uc2Ugb3IgYmVhY29uIGZyb20gdGhlIHNjYW4gY29tbWFuZC4gIFJlY29yZCBpbmZvcm1hdGlvbiBhcyBuZWVkZWQKLSAqICBpbiB0aGUgc2NhbiB0YWJsZSBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgZm9yIHRoYXQgZW50cnkuCi0gKgotICogIEBwYXJhbSBic3MgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIEJTUyBFbnRyeQotICoKLSAqICBAcmV0dXJuICAgICAgICAgICAgIDAgb3IgLTEKLSAqLwotc3RhdGljIGludCBsYnNfcHJvY2Vzc19ic3Moc3RydWN0IGJzc19kZXNjcmlwdG9yICpic3MsCi0JCQkgICB1aW50OF90ICoqcGJlYWNvbmluZm8sIGludCAqYnl0ZXNsZWZ0KQotewotCXN0cnVjdCBpZWVlX2llX2ZoX3BhcmFtX3NldCAqZmg7Ci0Jc3RydWN0IGllZWVfaWVfZHNfcGFyYW1fc2V0ICpkczsKLQlzdHJ1Y3QgaWVlZV9pZV9jZl9wYXJhbV9zZXQgKmNmOwotCXN0cnVjdCBpZWVlX2llX2lic3NfcGFyYW1fc2V0ICppYnNzOwotCURFQ0xBUkVfU1NJRF9CVUYoc3NpZCk7Ci0JdWludDhfdCAqcG9zLCAqZW5kLCAqcDsKLQl1aW50OF90IG5fZXhfcmF0ZXMgPSAwLCBnb3RfYmFzaWNfcmF0ZXMgPSAwLCBuX2Jhc2ljX3JhdGVzID0gMDsKLQl1aW50MTZfdCBiZWFjb25zaXplID0gMDsKLQlpbnQgcmV0OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1NDQU4pOwotCi0JaWYgKCpieXRlc2xlZnQgPj0gc2l6ZW9mKGJlYWNvbnNpemUpKSB7Ci0JCS8qIEV4dHJhY3QgJiBjb252ZXJ0IGJlYWNvbiBzaXplIGZyb20gdGhlIGNvbW1hbmQgYnVmZmVyICovCi0JCWJlYWNvbnNpemUgPSBnZXRfdW5hbGlnbmVkX2xlMTYoKnBiZWFjb25pbmZvKTsKLQkJKmJ5dGVzbGVmdCAtPSBzaXplb2YoYmVhY29uc2l6ZSk7Ci0JCSpwYmVhY29uaW5mbyArPSBzaXplb2YoYmVhY29uc2l6ZSk7Ci0JfQotCi0JaWYgKGJlYWNvbnNpemUgPT0gMCB8fCBiZWFjb25zaXplID4gKmJ5dGVzbGVmdCkgewotCQkqcGJlYWNvbmluZm8gKz0gKmJ5dGVzbGVmdDsKLQkJKmJ5dGVzbGVmdCA9IDA7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgY3VycmVudCB3b3JraW5nIGJlYWNvbiBwb2ludGVyIGZvciB0aGlzIEJTUyBpdGVyYXRpb24gKi8KLQlwb3MgPSAqcGJlYWNvbmluZm87Ci0JZW5kID0gcG9zICsgYmVhY29uc2l6ZTsKLQotCS8qIEFkdmFuY2UgdGhlIHJldHVybiBiZWFjb24gcG9pbnRlciBwYXN0IHRoZSBjdXJyZW50IGJlYWNvbiAqLwotCSpwYmVhY29uaW5mbyArPSBiZWFjb25zaXplOwotCSpieXRlc2xlZnQgLT0gYmVhY29uc2l6ZTsKLQotCW1lbWNweShic3MtPmJzc2lkLCBwb3MsIEVUSF9BTEVOKTsKLQlsYnNfZGViX3NjYW4oInByb2Nlc3NfYnNzOiBCU1NJRCAlcE1cbiIsIGJzcy0+YnNzaWQpOwotCXBvcyArPSBFVEhfQUxFTjsKLQotCWlmICgoZW5kIC0gcG9zKSA8IDEyKSB7Ci0JCWxic19kZWJfc2NhbigicHJvY2Vzc19ic3M6IE5vdCBlbm91Z2ggYnl0ZXMgbGVmdFxuIik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoKLQkgKiBuZXh0IDQgZmllbGRzIGFyZSBSU1NJLCB0aW1lIHN0YW1wLCBiZWFjb24gaW50ZXJ2YWwsCi0JICogICBhbmQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbgotCSAqLwotCi0JLyogUlNTSSBpcyAxIGJ5dGUgbG9uZyAqLwotCWJzcy0+cnNzaSA9ICpwb3M7Ci0JbGJzX2RlYl9zY2FuKCJwcm9jZXNzX2JzczogUlNTSSAlZFxuIiwgKnBvcyk7Ci0JcG9zKys7Ci0KLQkvKiB0aW1lIHN0YW1wIGlzIDggYnl0ZXMgbG9uZyAqLwotCXBvcyArPSA4OwotCi0JLyogYmVhY29uIGludGVydmFsIGlzIDIgYnl0ZXMgbG9uZyAqLwotCWJzcy0+YmVhY29ucGVyaW9kID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHBvcyk7Ci0JcG9zICs9IDI7Ci0KLQkvKiBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIGlzIDIgYnl0ZXMgbG9uZyAqLwotCWJzcy0+Y2FwYWJpbGl0eSA9IGdldF91bmFsaWduZWRfbGUxNihwb3MpOwotCWxic19kZWJfc2NhbigicHJvY2Vzc19ic3M6IGNhcGFiaWxpdGllcyAweCUwNHhcbiIsIGJzcy0+Y2FwYWJpbGl0eSk7Ci0JcG9zICs9IDI7Ci0KLQlpZiAoYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCi0JCWxic19kZWJfc2NhbigicHJvY2Vzc19ic3M6IFdFUCBlbmFibGVkXG4iKTsKLQlpZiAoYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCi0JCWJzcy0+bW9kZSA9IElXX01PREVfQURIT0M7Ci0JZWxzZQotCQlic3MtPm1vZGUgPSBJV19NT0RFX0lORlJBOwotCi0JLyogcmVzdCBvZiB0aGUgY3VycmVudCBidWZmZXIgYXJlIElFJ3MgKi8KLQlsYnNfZGViX3NjYW4oInByb2Nlc3NfYnNzOiBJRSBsZW4gJXpkXG4iLCBlbmQgLSBwb3MpOwotCWxic19kZWJfaGV4KExCU19ERUJfU0NBTiwgInByb2Nlc3NfYnNzOiBJRSBpbmZvIiwgcG9zLCBlbmQgLSBwb3MpOwotCi0JLyogcHJvY2VzcyB2YXJpYWJsZSBJRSAqLwotCXdoaWxlIChwb3MgPD0gZW5kIC0gMikgewotCQlpZiAocG9zICsgcG9zWzFdID4gZW5kKSB7Ci0JCQlsYnNfZGViX3NjYW4oInByb2Nlc3NfYnNzOiBlcnJvciBpbiBwcm9jZXNzaW5nIElFLCAiCi0JCQkJICAgICAiYnl0ZXMgbGVmdCA8IElFIGxlbmd0aFxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN3aXRjaCAocG9zWzBdKSB7Ci0JCWNhc2UgV0xBTl9FSURfU1NJRDoKLQkJCWJzcy0+c3NpZF9sZW4gPSBtaW5fdChpbnQsIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4sIHBvc1sxXSk7Ci0JCQltZW1jcHkoYnNzLT5zc2lkLCBwb3MgKyAyLCBic3MtPnNzaWRfbGVuKTsKLQkJCWxic19kZWJfc2NhbigiZ290IFNTSUQgSUU6ICclcycsIGxlbiAldVxuIiwKLQkJCSAgICAgICAgICAgICBwcmludF9zc2lkKHNzaWQsIGJzcy0+c3NpZCwgYnNzLT5zc2lkX2xlbiksCi0JCQkgICAgICAgICAgICAgYnNzLT5zc2lkX2xlbik7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6Ci0JCQluX2Jhc2ljX3JhdGVzID0gbWluX3QodWludDhfdCwgTUFYX1JBVEVTLCBwb3NbMV0pOwotCQkJbWVtY3B5KGJzcy0+cmF0ZXMsIHBvcyArIDIsIG5fYmFzaWNfcmF0ZXMpOwotCQkJZ290X2Jhc2ljX3JhdGVzID0gMTsKLQkJCWxic19kZWJfc2NhbigiZ290IFJBVEVTIElFXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgotCQkJZmggPSAoc3RydWN0IGllZWVfaWVfZmhfcGFyYW1fc2V0ICopIHBvczsKLQkJCW1lbWNweSgmYnNzLT5waHkuZmgsIGZoLCBzaXplb2YoKmZoKSk7Ci0JCQlsYnNfZGViX3NjYW4oImdvdCBGSCBJRVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKLQkJCWRzID0gKHN0cnVjdCBpZWVlX2llX2RzX3BhcmFtX3NldCAqKSBwb3M7Ci0JCQlic3MtPmNoYW5uZWwgPSBkcy0+Y2hhbm5lbDsKLQkJCW1lbWNweSgmYnNzLT5waHkuZHMsIGRzLCBzaXplb2YoKmRzKSk7Ci0JCQlsYnNfZGViX3NjYW4oImdvdCBEUyBJRSwgY2hhbm5lbCAlZFxuIiwgYnNzLT5jaGFubmVsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9FSURfQ0ZfUEFSQU1TOgotCQkJY2YgPSAoc3RydWN0IGllZWVfaWVfY2ZfcGFyYW1fc2V0ICopIHBvczsKLQkJCW1lbWNweSgmYnNzLT5zcy5jZiwgY2YsIHNpemVvZigqY2YpKTsKLQkJCWxic19kZWJfc2NhbigiZ290IENGIElFXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9FSURfSUJTU19QQVJBTVM6Ci0JCQlpYnNzID0gKHN0cnVjdCBpZWVlX2llX2lic3NfcGFyYW1fc2V0ICopIHBvczsKLQkJCWJzcy0+YXRpbXdpbmRvdyA9IGlic3MtPmF0aW13aW5kb3c7Ci0JCQltZW1jcHkoJmJzcy0+c3MuaWJzcywgaWJzcywgc2l6ZW9mKCppYnNzKSk7Ci0JCQlsYnNfZGViX3NjYW4oImdvdCBJQlNTIElFXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9FSURfRVhUX1NVUFBfUkFURVM6Ci0JCQkvKiBvbmx5IHByb2Nlc3MgZXh0ZW5kZWQgc3VwcG9ydGVkIHJhdGUgaWYgZGF0YSByYXRlIGlzCi0JCQkgKiBhbHJlYWR5IGZvdW5kLiBEYXRhIHJhdGUgSUUgc2hvdWxkIGNvbWUgYmVmb3JlCi0JCQkgKiBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZSBJRQotCQkJICovCi0JCQlsYnNfZGViX3NjYW4oImdvdCBSQVRFU0VYIElFXG4iKTsKLQkJCWlmICghZ290X2Jhc2ljX3JhdGVzKSB7Ci0JCQkJbGJzX2RlYl9zY2FuKCIuLi4gYnV0IGlnbm9yaW5nIGl0XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbl9leF9yYXRlcyA9IHBvc1sxXTsKLQkJCWlmIChuX2Jhc2ljX3JhdGVzICsgbl9leF9yYXRlcyA+IE1BWF9SQVRFUykKLQkJCQluX2V4X3JhdGVzID0gTUFYX1JBVEVTIC0gbl9iYXNpY19yYXRlczsKLQotCQkJcCA9IGJzcy0+cmF0ZXMgKyBuX2Jhc2ljX3JhdGVzOwotCQkJbWVtY3B5KHAsIHBvcyArIDIsIG5fZXhfcmF0ZXMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0VJRF9HRU5FUklDOgotCQkJaWYgKHBvc1sxXSA+PSA0ICYmCi0JCQkgICAgcG9zWzJdID09IDB4MDAgJiYgcG9zWzNdID09IDB4NTAgJiYKLQkJCSAgICBwb3NbNF0gPT0gMHhmMiAmJiBwb3NbNV0gPT0gMHgwMSkgewotCQkJCWJzcy0+d3BhX2llX2xlbiA9IG1pbihwb3NbMV0gKyAyLCBNQVhfV1BBX0lFX0xFTik7Ci0JCQkJbWVtY3B5KGJzcy0+d3BhX2llLCBwb3MsIGJzcy0+d3BhX2llX2xlbik7Ci0JCQkJbGJzX2RlYl9zY2FuKCJnb3QgV1BBIElFXG4iKTsKLQkJCQlsYnNfZGViX2hleChMQlNfREVCX1NDQU4sICJXUEEgSUUiLCBic3MtPndwYV9pZSwKLQkJCQkJICAgIGJzcy0+d3BhX2llX2xlbik7Ci0JCQl9IGVsc2UgaWYgKHBvc1sxXSA+PSBNQVJWRUxMX01FU0hfSUVfTEVOR1RIICYmCi0JCQkJICAgcG9zWzJdID09IDB4MDAgJiYgcG9zWzNdID09IDB4NTAgJiYKLQkJCQkgICBwb3NbNF0gPT0gMHg0MyAmJiBwb3NbNV0gPT0gMHgwNCkgewotCQkJCWxic19kZWJfc2NhbigiZ290IG1lc2ggSUVcbiIpOwotCQkJCWJzcy0+bWVzaCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWxic19kZWJfc2NhbigiZ290IGdlbmVyaWMgSUU6ICUwMng6JTAyeDolMDJ4OiUwMngsIGxlbiAlZFxuIiwKLQkJCQkJcG9zWzJdLCBwb3NbM10sCi0JCQkJCXBvc1s0XSwgcG9zWzVdLAotCQkJCQlwb3NbMV0pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQlsYnNfZGViX3NjYW4oImdvdCBSU04gSUVcbiIpOwotCQkJYnNzLT5yc25faWVfbGVuID0gbWluKHBvc1sxXSArIDIsIE1BWF9XUEFfSUVfTEVOKTsKLQkJCW1lbWNweShic3MtPnJzbl9pZSwgcG9zLCBic3MtPnJzbl9pZV9sZW4pOwotCQkJbGJzX2RlYl9oZXgoTEJTX0RFQl9TQ0FOLCAicHJvY2Vzc19ic3M6IFJTTl9JRSIsCi0JCQkJICAgIGJzcy0+cnNuX2llLCBic3MtPnJzbl9pZV9sZW4pOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWxic19kZWJfc2NhbigiZ290IElFIDB4JTA0eCwgbGVuICVkXG4iLAotCQkJCSAgICAgcG9zWzBdLCBwb3NbMV0pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwb3MgKz0gcG9zWzFdICsgMjsKLQl9Ci0KLQkvKiBUaW1lc3RhbXAgKi8KLQlic3MtPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Ci0JbGJzX3Vuc2V0X2Jhc2ljX3JhdGVfZmxhZ3MoYnNzLT5yYXRlcywgc2l6ZW9mKGJzcy0+cmF0ZXMpKTsKLQotCXJldCA9IDA7Ci0KLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfU0NBTiwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFNlbmQgYSBzY2FuIGNvbW1hbmQgZm9yIGFsbCBhdmFpbGFibGUgY2hhbm5lbHMgZmlsdGVyZWQgb24gYSBzcGVjCi0gKgotICogIFVzZWQgaW4gYXNzb2NpYXRpb24gY29kZSBhbmQgZnJvbSBkZWJ1Z2ZzCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgIEEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHNzaWQgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBTU0lEIHRvIHNjYW4gZm9yCi0gKiAgQHBhcmFtIHNzaWRfbGVuICAgICAgICAgTGVuZ3RoIG9mIHRoZSBTU0lECi0gKgotICogIEByZXR1cm4gICAgICAgICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1pbnQgbGJzX3NlbmRfc3BlY2lmaWNfc3NpZF9zY2FuKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdWludDhfdCAqc3NpZCwKLQkJCQl1aW50OF90IHNzaWRfbGVuKQotewotCURFQ0xBUkVfU1NJRF9CVUYoc3NpZF9idWYpOwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfU0NBTiwgIlNTSUQgJyVzJ1xuIiwKLQkJCSAgIHByaW50X3NzaWQoc3NpZF9idWYsIHNzaWQsIHNzaWRfbGVuKSk7Ci0KLQlpZiAoIXNzaWRfbGVuKQotCQlnb3RvIG91dDsKLQotCW1lbWNweShwcml2LT5zY2FuX3NzaWQsIHNzaWQsIHNzaWRfbGVuKTsKLQlwcml2LT5zY2FuX3NzaWRfbGVuID0gc3NpZF9sZW47Ci0KLQlsYnNfc2Nhbl9uZXR3b3Jrcyhwcml2LCAxKTsKLQlpZiAocHJpdi0+c3VycHJpc2VyZW1vdmVkKSB7Ci0JCXJldCA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9TQ0FOLCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTdXBwb3J0IGZvciBXaXJlbGVzcyBFeHRlbnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciAqbGJzX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJCSAgICBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwKLQkJCQkJICAgIHN0cnVjdCBic3NfZGVzY3JpcHRvciAqYnNzKQotewotCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKLQljaGFyICpjdXJyZW50X3ZhbDsJLyogRm9yIHJhdGVzICovCi0Jc3RydWN0IGl3X2V2ZW50IGl3ZTsJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLwotCWludCBqOwotI2RlZmluZSBQRVJGRUNUX1JTU0kgKCh1aW50OF90KTUwKQotI2RlZmluZSBXT1JTVF9SU1NJICAgKCh1aW50OF90KTApCi0jZGVmaW5lIFJTU0lfRElGRiAgICAoKHVpbnQ4X3QpKFBFUkZFQ1RfUlNTSSAtIFdPUlNUX1JTU0kpKQotCXVpbnQ4X3QgcnNzaTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9TQ0FOKTsKLQotCWNmcCA9IGxic19maW5kX2NmcF9ieV9iYW5kX2FuZF9jaGFubmVsKHByaXYsIDAsIGJzcy0+Y2hhbm5lbCk7Ci0JaWYgKCFjZnApIHsKLQkJbGJzX2RlYl9zY2FuKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyICVkXG4iLCBic3MtPmNoYW5uZWwpOwotCQlzdGFydCA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQlNTSUQgKi8KLQlpd2UuY21kID0gU0lPQ0dJV0FQOwotCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0Jc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwotCi0JLyogU1NJRCAqLwotCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7Ci0JaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0JaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4oKHVpbnQzMl90KSBic3MtPnNzaWRfbGVuLCAodWludDMyX3QpIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pOwotCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJzcy0+c3NpZCk7Ci0KLQkvKiBNb2RlICovCi0JaXdlLmNtZCA9IFNJT0NHSVdNT0RFOwotCWl3ZS51Lm1vZGUgPSBic3MtPm1vZGU7Ci0Jc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOwotCi0JLyogRnJlcXVlbmN5ICovCi0JaXdlLmNtZCA9IFNJT0NHSVdGUkVROwotCWl3ZS51LmZyZXEubSA9IChsb25nKWNmcC0+ZnJlcSAqIDEwMDAwMDsKLQlpd2UudS5mcmVxLmUgPSAxOwotCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKLQotCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KLQlpd2UuY21kID0gSVdFVlFVQUw7Ci0JaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRDsKLQlpd2UudS5xdWFsLmxldmVsID0gU0NBTl9SU1NJKGJzcy0+cnNzaSk7Ci0KLQlyc3NpID0gaXdlLnUucXVhbC5sZXZlbCAtIE1SVkRSVl9ORl9ERUZBVUxUX1NDQU5fVkFMVUU7Ci0JaXdlLnUucXVhbC5xdWFsID0KLQkJKDEwMCAqIFJTU0lfRElGRiAqIFJTU0lfRElGRiAtIChQRVJGRUNUX1JTU0kgLSByc3NpKSAqCi0JCSAoMTUgKiAoUlNTSV9ESUZGKSArIDYyICogKFBFUkZFQ1RfUlNTSSAtIHJzc2kpKSkgLwotCQkoUlNTSV9ESUZGICogUlNTSV9ESUZGKTsKLQlpZiAoaXdlLnUucXVhbC5xdWFsID4gMTAwKQotCQlpd2UudS5xdWFsLnF1YWwgPSAxMDA7Ci0KLQlpZiAocHJpdi0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddID09IDApIHsKLQkJaXdlLnUucXVhbC5ub2lzZSA9IE1SVkRSVl9ORl9ERUZBVUxUX1NDQU5fVkFMVUU7Ci0JfSBlbHNlIHsKLQkJaXdlLnUucXVhbC5ub2lzZSA9IENBTF9ORihwcml2LT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10pOwotCX0KLQotCS8qIExvY2FsbHkgY3JlYXRlZCBhZC1ob2MgQlNTcyB3b24ndCBoYXZlIGJlYWNvbnMgaWYgdGhpcyBpcyB0aGUKLQkgKiBvbmx5IHN0YXRpb24gaW4gdGhlIGFkaG9jIG5ldHdvcms7IHNvIGdldCBzaWduYWwgc3RyZW5ndGgKLQkgKiBmcm9tIHJlY2VpdmUgc3RhdGlzdGljcy4KLQkgKi8KLQlpZiAoKHByaXYtPm1vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgcHJpdi0+YWRob2NjcmVhdGUKLQkgICAgJiYgIWxic19zc2lkX2NtcChwcml2LT5jdXJic3NwYXJhbXMuc3NpZCwKLQkJCSAgICAgcHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWRfbGVuLAotCQkJICAgICBic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pKSB7Ci0JCWludCBzbnIsIG5mOwotCQlzbnIgPSBwcml2LT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEU7Ci0JCW5mID0gcHJpdi0+TkZbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEU7Ci0JCWl3ZS51LnF1YWwubGV2ZWwgPSBDQUxfUlNTSShzbnIsIG5mKTsKLQl9Ci0Jc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwotCi0JLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLwotCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOwotCWlmIChic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7Ci0JfSBlbHNlIHsKLQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQl9Ci0JaXdlLnUuZGF0YS5sZW5ndGggPSAwOwotCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJzcy0+c3NpZCk7Ci0KLQljdXJyZW50X3ZhbCA9IHN0YXJ0ICsgaXdlX3N0cmVhbV9sY3BfbGVuKGluZm8pOwotCi0JaXdlLmNtZCA9IFNJT0NHSVdSQVRFOwotCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSAwOwotCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOwotCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAwOwotCi0JZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYnNzLT5yYXRlcykgJiYgYnNzLT5yYXRlc1tqXTsgaisrKSB7Ci0JCS8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICovCi0JCWl3ZS51LmJpdHJhdGUudmFsdWUgPSBic3MtPnJhdGVzW2pdICogNTAwMDAwOwotCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGluZm8sIHN0YXJ0LCBjdXJyZW50X3ZhbCwKLQkJCQkJCSAgIHN0b3AsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7Ci0JfQotCWlmICgoYnNzLT5tb2RlID09IElXX01PREVfQURIT0MpICYmIHByaXYtPmFkaG9jY3JlYXRlCi0JICAgICYmICFsYnNfc3NpZF9jbXAocHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWQsCi0JCQkgICAgIHByaXYtPmN1cmJzc3BhcmFtcy5zc2lkX2xlbiwKLQkJCSAgICAgYnNzLT5zc2lkLCBic3MtPnNzaWRfbGVuKSkgewotCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gMjIgKiA1MDAwMDA7Ci0JCWN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoaW5mbywgc3RhcnQsIGN1cnJlbnRfdmFsLAotCQkJCQkJICAgc3RvcCwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKLQl9Ci0JLyogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50ICovCi0JaWYgKChjdXJyZW50X3ZhbCAtIHN0YXJ0KSA+IGl3ZV9zdHJlYW1fbGNwX2xlbihpbmZvKSkKLQkJc3RhcnQgPSBjdXJyZW50X3ZhbDsKLQotCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JaWYgKGJzcy0+d3BhX2llX2xlbikgewotCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07Ci0JCW1lbWNweShidWYsIGJzcy0+d3BhX2llLCBic3MtPndwYV9pZV9sZW4pOwotCQlpd2UuY21kID0gSVdFVkdFTklFOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IGJzcy0+d3BhX2llX2xlbjsKLQkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLQl9Ci0KLQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCWlmIChic3MtPnJzbl9pZV9sZW4pIHsKLQkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOwotCQltZW1jcHkoYnVmLCBic3MtPnJzbl9pZSwgYnNzLT5yc25faWVfbGVuKTsKLQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPnJzbl9pZV9sZW47Ci0JCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7Ci0JfQotCi0JaWYgKGJzcy0+bWVzaCkgewotCQljaGFyIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl07Ci0JCWNoYXIgKnAgPSBjdXN0b207Ci0KLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4sICJtZXNoLXR5cGU6IG9scGMiKTsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOwotCQlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCi0JCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLAotCQkJCQkJICAgICAmaXdlLCBjdXN0b20pOwotCX0KLQotb3V0OgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1NDQU4sICJzdGFydCAlcCIsIHN0YXJ0KTsKLQlyZXR1cm4gc3RhcnQ7Ci19Ci0KLQotLyoqCi0gKiAgQGJyaWVmIEhhbmRsZSBTY2FuIE5ldHdvcmsgaW9jdGwKLSAqCi0gKiAgQHBhcmFtIGRldiAgICAgICAgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gaW5mbyAgICAgICAgIEEgcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8gc3RydWN0dXJlCi0gKiAgQHBhcmFtIHZ3cnEgICAgICAgICBBIHBvaW50ZXIgdG8gaXdfcGFyYW0gc3RydWN0dXJlCi0gKiAgQHBhcmFtIGV4dHJhICAgICAgICBBIHBvaW50ZXIgdG8gZXh0cmEgZGF0YSBidWYKLSAqCi0gKiAgQHJldHVybiAgICAgICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotaW50IGxic19zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JREVDTEFSRV9TU0lEX0JVRihzc2lkKTsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAoIXByaXYtPnJhZGlvX29uKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXJldCA9IC1FTkVURE9XTjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogbWFjODAyMTEgZG9lcyB0aGlzOgotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoc2RhdGEtPnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfeHh4KSB7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKLQl9Ci0JKi8KLQotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSAmJgotCSAgICB3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKSB7Ci0JCXN0cnVjdCBpd19zY2FuX3JlcSAqcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKWV4dHJhOwotCQlwcml2LT5zY2FuX3NzaWRfbGVuID0gcmVxLT5lc3NpZF9sZW47Ci0JCW1lbWNweShwcml2LT5zY2FuX3NzaWQsIHJlcS0+ZXNzaWQsIHByaXYtPnNjYW5fc3NpZF9sZW4pOwotCQlsYnNfZGViX3dleHQoInNldF9zY2FuLCBlc3NpZCAnJXMnXG4iLAotCQkJcHJpbnRfc3NpZChzc2lkLCBwcml2LT5zY2FuX3NzaWQsIHByaXYtPnNjYW5fc3NpZF9sZW4pKTsKLQl9IGVsc2UgewotCQlwcml2LT5zY2FuX3NzaWRfbGVuID0gMDsKLQl9Ci0KLQlpZiAoIWRlbGF5ZWRfd29ya19wZW5kaW5nKCZwcml2LT5zY2FuX3dvcmspKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya190aHJlYWQsICZwcml2LT5zY2FuX3dvcmssCi0JCQkJICAgbXNlY3NfdG9famlmZmllcyg1MCkpOwotCS8qIHNldCBtYXJrZXIgdGhhdCBjdXJyZW50bHkgYSBzY2FuIGlzIHRha2luZyBwbGFjZSAqLwotCXByaXYtPnNjYW5fY2hhbm5lbCA9IC0xOwotCi0JaWYgKHByaXYtPnN1cnByaXNlcmVtb3ZlZCkKLQkJcmV0ID0gLUVJTzsKLQotb3V0OgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoqCi0gKiAgQGJyaWVmICBIYW5kbGUgUmV0cmlldmUgc2NhbiB0YWJsZSBpb2N0bAotICoKLSAqICBAcGFyYW0gZGV2ICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQotICogIEBwYXJhbSBpbmZvICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gZHdycSAgICAgICAgIEEgcG9pbnRlciB0byBpd19wb2ludCBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gZXh0cmEgICAgICAgIEEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgotICoKLSAqICBAcmV0dXJuICAgICAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1pbnQgbGJzX2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQotewotI2RlZmluZSBTQ0FOX0lURU1fU0laRSAxMjgKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IGVyciA9IDA7Ci0JY2hhciAqZXYgPSBleHRyYTsKLQljaGFyICpzdG9wID0gZXYgKyBkd3JxLT5sZW5ndGg7Ci0Jc3RydWN0IGJzc19kZXNjcmlwdG9yICppdGVyX2JzczsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnNhZmU7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQkvKiBpd2xpc3Qgc2hvdWxkIHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgc2NhbiBpcyBmaW5pc2hlZCAqLwotCWlmIChwcml2LT5zY2FuX2NoYW5uZWwpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JLyogVXBkYXRlIFJTU0kgaWYgY3VycmVudCBCU1MgaXMgYSBsb2NhbGx5IGNyZWF0ZWQgYWQtaG9jIEJTUyAqLwotCWlmICgocHJpdi0+bW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiBwcml2LT5hZGhvY2NyZWF0ZSkgewotCQllcnIgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIENNRF84MDJfMTFfUlNTSSwgMCwKLQkJCQlDTURfT1BUSU9OX1dBSVRGT1JSU1AsIDAsIE5VTEwpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIChpdGVyX2Jzcywgc2FmZSwgJnByaXYtPm5ldHdvcmtfbGlzdCwgbGlzdCkgewotCQljaGFyICpuZXh0X2V2OwotCQl1bnNpZ25lZCBsb25nIHN0YWxlX3RpbWU7Ci0KLQkJaWYgKHN0b3AgLSBldiA8IFNDQU5fSVRFTV9TSVpFKSB7Ci0JCQllcnIgPSAtRTJCSUc7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIEZvciBtZXNoIGRldmljZSwgbGlzdCBvbmx5IG1lc2ggbmV0d29ya3MgKi8KLQkJaWYgKGRldiA9PSBwcml2LT5tZXNoX2RldiAmJiAhaXRlcl9ic3MtPm1lc2gpCi0JCQljb250aW51ZTsKLQotCQkvKiBQcnVuZSBvbGQgYW4gb2xkIHNjYW4gcmVzdWx0ICovCi0JCXN0YWxlX3RpbWUgPSBpdGVyX2Jzcy0+bGFzdF9zY2FubmVkICsgREVGQVVMVF9NQVhfU0NBTl9BR0U7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YWxlX3RpbWUpKSB7Ci0JCQlsaXN0X21vdmVfdGFpbCgmaXRlcl9ic3MtPmxpc3QsICZwcml2LT5uZXR3b3JrX2ZyZWVfbGlzdCk7Ci0JCQljbGVhcl9ic3NfZGVzY3JpcHRvcihpdGVyX2Jzcyk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIFRyYW5zbGF0ZSB0byBXRSBmb3JtYXQgdGhpcyBlbnRyeSAqLwotCQluZXh0X2V2ID0gbGJzX3RyYW5zbGF0ZV9zY2FuKHByaXYsIGluZm8sIGV2LCBzdG9wLCBpdGVyX2Jzcyk7Ci0JCWlmIChuZXh0X2V2ID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJZXYgPSBuZXh0X2V2OwotCX0KLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi0JZHdycS0+bGVuZ3RoID0gKGV2IC0gZXh0cmEpOwotCWR3cnEtPmZsYWdzID0gMDsKLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb21tYW5kIGV4ZWN1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioKLSAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlIG9mIHNjYW4KLSAqCi0gKiAgQ2FsbGVkIGZyb20gaGFuZGxlX2NtZF9yZXNwb25zZSgpIGluIGNtZHJlc3BjLgotICoKLSAqICAgVGhlIHJlc3BvbnNlIGJ1ZmZlciBmb3IgdGhlIHNjYW4gY29tbWFuZCBoYXMgdGhlIGZvbGxvd2luZwotICogICAgICBtZW1vcnkgbGF5b3V0OgotICoKLSAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0gKiAgICAgfCAgaGVhZGVyICg0ICogc2l6ZW9mKHUxNikpOiAgU3RhbmRhcmQgY29tbWFuZCByZXNwb25zZSBoZHIgfAotICogICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLSAqICAgICB8ICBidWZzaXplICh1MTYpIDogc2l6ZW9mIHRoZSBCU1MgRGVzY3JpcHRpb24gZGF0YSAgICAgICAgICB8Ci0gKiAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotICogICAgIHwgIE51bU9mU2V0ICh1OCkgOiBOdW1iZXIgb2YgQlNTIERlc2NzIHJldHVybmVkICAgICAgICAgICAgIHwKLSAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi0gKiAgICAgfCAgQlNTRGVzY3JpcHRpb24gZGF0YSAodmFyaWFibGUsIHNpemUgZ2l2ZW4gaW4gYnVmc2l6ZSkgICAgfAotICogICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLSAqICAgICB8ICBUTFYgZGF0YSAodmFyaWFibGUsIHNpemUgY2FsY3VsYXRlZCB1c2luZyBoZWFkZXItPnNpemUsICB8Ci0gKiAgICAgfCAgICAgICAgICAgIGJ1ZnNpemUgYW5kIHNpemVvZiB0aGUgZml4ZWQgZmllbGRzIGFib3ZlKSAgICAgfAotICogICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gcmVzcCAgICBBIHBvaW50ZXIgdG8gY21kX2RzX2NvbW1hbmQKLSAqCi0gKiAgQHJldHVybiAgICAgICAgMCBvciAtMQotICovCi1zdGF0aWMgaW50IGxic19yZXRfODAyMTFfc2NhbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZHVtbXksCi0JCQkgICAgICBzdHJ1Y3QgY21kX2hlYWRlciAqcmVzcCkKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuX3JzcCAqc2NhbnJlc3AgPSAodm9pZCAqKXJlc3A7Ci0Jc3RydWN0IGJzc19kZXNjcmlwdG9yICppdGVyX2JzczsKLQlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnNhZmU7Ci0JdWludDhfdCAqYnNzaW5mbzsKLQl1aW50MTZfdCBzY2FucmVzcHNpemU7Ci0JaW50IGJ5dGVzbGVmdDsKLQlpbnQgaWR4OwotCWludCB0bHZidWZzaXplOwotCWludCByZXQ7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfU0NBTik7Ci0KLQkvKiBQcnVuZSBvbGQgZW50cmllcyBmcm9tIHNjYW4gdGFibGUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKGl0ZXJfYnNzLCBzYWZlLCAmcHJpdi0+bmV0d29ya19saXN0LCBsaXN0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhbGVfdGltZSA9IGl0ZXJfYnNzLT5sYXN0X3NjYW5uZWQgKyBERUZBVUxUX01BWF9TQ0FOX0FHRTsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHN0YWxlX3RpbWUpKQotCQkJY29udGludWU7Ci0JCWxpc3RfbW92ZV90YWlsICgmaXRlcl9ic3MtPmxpc3QsICZwcml2LT5uZXR3b3JrX2ZyZWVfbGlzdCk7Ci0JCWNsZWFyX2Jzc19kZXNjcmlwdG9yKGl0ZXJfYnNzKTsKLQl9Ci0KLQlpZiAoc2NhbnJlc3AtPm5yX3NldHMgPiBNQVhfTkVUV09SS19DT1VOVCkgewotCQlsYnNfZGViX3NjYW4oIlNDQU5fUkVTUDogdG9vIG1hbnkgc2NhbiByZXN1bHRzICglZCwgbWF4ICVkKVxuIiwKLQkJCSAgICAgc2NhbnJlc3AtPm5yX3NldHMsIE1BWF9ORVRXT1JLX0NPVU5UKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlieXRlc2xlZnQgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJnNjYW5yZXNwLT5ic3NkZXNjcmlwdHNpemUpOwotCWxic19kZWJfc2NhbigiU0NBTl9SRVNQOiBic3NkZXNjcmlwdHNpemUgJWRcbiIsIGJ5dGVzbGVmdCk7Ci0KLQlzY2FucmVzcHNpemUgPSBsZTE2X3RvX2NwdShyZXNwLT5zaXplKTsKLQlsYnNfZGViX3NjYW4oIlNDQU5fUkVTUDogc2NhbiByZXN1bHRzICVkXG4iLCBzY2FucmVzcC0+bnJfc2V0cyk7Ci0KLQlic3NpbmZvID0gc2NhbnJlc3AtPmJzc2Rlc2NfYW5kX3RsdmJ1ZmZlcjsKLQotCS8qIFRoZSBzaXplIG9mIHRoZSBUTFYgYnVmZmVyIGlzIGVxdWFsIHRvIHRoZSBlbnRpcmUgY29tbWFuZCByZXNwb25zZQotCSAqICAgc2l6ZSAoc2NhbnJlc3BzaXplKSBtaW51cyB0aGUgZml4ZWQgZmllbGRzIChzaXplb2YoKSdzKSwgdGhlCi0JICogICBCU1MgRGVzY3JpcHRpb25zIChic3NkZXNjcmlwdHNpemUgYXMgYnl0ZXNMZWYpIGFuZCB0aGUgY29tbWFuZAotCSAqICAgcmVzcG9uc2UgaGVhZGVyIChzaXplb2Yoc3RydWN0IGNtZF9oZWFkZXIpKQotCSAqLwotCXRsdmJ1ZnNpemUgPSBzY2FucmVzcHNpemUgLSAoYnl0ZXNsZWZ0ICsgc2l6ZW9mKHNjYW5yZXNwLT5ic3NkZXNjcmlwdHNpemUpCi0JCQkJICAgICArIHNpemVvZihzY2FucmVzcC0+bnJfc2V0cykKLQkJCQkgICAgICsgc2l6ZW9mKHN0cnVjdCBjbWRfaGVhZGVyKSk7Ci0KLQkvKgotCSAqICBQcm9jZXNzIGVhY2ggc2NhbiByZXNwb25zZSByZXR1cm5lZCAoc2NhbnJlc3AtPm5yX3NldHMpLiBTYXZlCi0JICogICAgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBuZXdic3NlbnRyeSBhbmQgdGhlbiBpbnNlcnQgaW50byB0aGUKLQkgKiAgICBkcml2ZXIgc2NhbiB0YWJsZSBlaXRoZXIgYXMgYW4gdXBkYXRlIHRvIGFuIGV4aXN0aW5nIGVudHJ5Ci0JICogICAgb3IgYXMgYW4gYWRkaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNjYW5yZXNwLT5ucl9zZXRzICYmIGJ5dGVzbGVmdDsgaWR4KyspIHsKLQkJc3RydWN0IGJzc19kZXNjcmlwdG9yIG5ldzsKLQkJc3RydWN0IGJzc19kZXNjcmlwdG9yICpmb3VuZCA9IE5VTEw7Ci0JCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqb2xkZXN0ID0gTlVMTDsKLQotCQkvKiBQcm9jZXNzIHRoZSBkYXRhIGZpZWxkcyBhbmQgSUVzIHJldHVybmVkIGZvciB0aGlzIEJTUyAqLwotCQltZW1zZXQoJm5ldywgMCwgc2l6ZW9mIChzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IpKTsKLQkJaWYgKGxic19wcm9jZXNzX2JzcygmbmV3LCAmYnNzaW5mbywgJmJ5dGVzbGVmdCkgIT0gMCkgewotCQkJLyogZXJyb3IgcGFyc2luZyB0aGUgc2NhbiByZXNwb25zZSwgc2tpcHBlZCAqLwotCQkJbGJzX2RlYl9zY2FuKCJTQ0FOX1JFU1A6IHByb2Nlc3NfYnNzIHJldHVybmVkIEVSUk9SXG4iKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogVHJ5IHRvIGZpbmQgdGhpcyBic3MgaW4gdGhlIHNjYW4gdGFibGUgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSAoaXRlcl9ic3MsICZwcml2LT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKLQkJCWlmIChpc19zYW1lX25ldHdvcmsoaXRlcl9ic3MsICZuZXcpKSB7Ci0JCQkJZm91bmQgPSBpdGVyX2JzczsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKChvbGRlc3QgPT0gTlVMTCkgfHwKLQkJCSAgICAoaXRlcl9ic3MtPmxhc3Rfc2Nhbm5lZCA8IG9sZGVzdC0+bGFzdF9zY2FubmVkKSkKLQkJCQlvbGRlc3QgPSBpdGVyX2JzczsKLQkJfQotCi0JCWlmIChmb3VuZCkgewotCQkJLyogZm91bmQsIGNsZWFyIGl0ICovCi0JCQljbGVhcl9ic3NfZGVzY3JpcHRvcihmb3VuZCk7Ci0JCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJnByaXYtPm5ldHdvcmtfZnJlZV9saXN0KSkgewotCQkJLyogUHVsbCBvbmUgZnJvbSB0aGUgZnJlZSBsaXN0ICovCi0JCQlmb3VuZCA9IGxpc3RfZW50cnkocHJpdi0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKLQkJCQkJICAgc3RydWN0IGJzc19kZXNjcmlwdG9yLCBsaXN0KTsKLQkJCWxpc3RfbW92ZV90YWlsKCZmb3VuZC0+bGlzdCwgJnByaXYtPm5ldHdvcmtfbGlzdCk7Ci0JCX0gZWxzZSBpZiAob2xkZXN0KSB7Ci0JCQkvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzbG90cywgZXhwaXJlIHRoZSBvbGRlc3QgKi8KLQkJCWZvdW5kID0gb2xkZXN0OwotCQkJY2xlYXJfYnNzX2Rlc2NyaXB0b3IoZm91bmQpOwotCQkJbGlzdF9tb3ZlX3RhaWwoJmZvdW5kLT5saXN0LCAmcHJpdi0+bmV0d29ya19saXN0KTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJbGJzX2RlYl9zY2FuKCJTQ0FOX1JFU1A6IEJTU0lEICVwTVxuIiwgbmV3LmJzc2lkKTsKLQotCQkvKiBDb3B5IHRoZSBsb2NhbGx5IGNyZWF0ZWQgbmV3YnNzZW50cnkgdG8gdGhlIHNjYW4gdGFibGUgKi8KLQkJbWVtY3B5KGZvdW5kLCAmbmV3LCBvZmZzZXRvZihzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IsIGxpc3QpKTsKLQl9Ci0KLQlyZXQgPSAwOwotCi1kb25lOgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1NDQU4sICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjE3MDYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqCi0gICogSW50ZXJmYWNlIGZvciB0aGUgd2xhbiBuZXR3b3JrIHNjYW4gcm91dGluZXMKLSAgKgotICAqIERyaXZlciBpbnRlcmZhY2UgZnVuY3Rpb25zIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHNjYW4gbW9kdWxlCi0gICogaW1wbGVtZW50ZWQgaW4gc2Nhbi5jLgotICAqLwotI2lmbmRlZiBfTEJTX1NDQU5fSAotI2RlZmluZSBfTEJTX1NDQU5fSAotCi0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLQotc3RydWN0IGxic19wcml2YXRlOwotCi0jZGVmaW5lIE1BWF9ORVRXT1JLX0NPVU5UIDEyOAotCi0vKiogQ2hhbi1mcmVxLVR4UG93ZXIgbWFwcGluZyB0YWJsZSovCi1zdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIHsKLQkvKiogY2hhbm5lbCBOdW1iZXIJCSovCi0JdTE2IGNoYW5uZWw7Ci0JLyoqIGZyZXF1ZW5jeSBvZiB0aGlzIGNoYW5uZWwJKi8KLQl1MzIgZnJlcTsKLQkvKiogTWF4IGFsbG93ZWQgVHggcG93ZXIgbGV2ZWwJKi8KLQl1MTYgbWF4dHhwb3dlcjsKLQkvKiogVFJVRTpjaGFubmVsIHVuc3VwcG9ydGVkOyAgRkxBU0U6c3VwcG9ydGVkKi8KLQl1OCB1bnN1cHBvcnRlZDsKLX07Ci0KLS8qKiByZWdpb24tYmFuZCBtYXBwaW5nIHRhYmxlKi8KLXN0cnVjdCByZWdpb25fY2hhbm5lbCB7Ci0JLyoqIFRSVUUgaWYgdGhpcyBlbnRyeSBpcyB2YWxpZAkJICAgICAqLwotCXU4IHZhbGlkOwotCS8qKiByZWdpb24gY29kZSBmb3IgVVMsIEphcGFuIC4uLgkgICAgICovCi0JdTggcmVnaW9uOwotCS8qKiBiYW5kIEIvRy9BLCB1c2VkIGZvciBCQU5EX0NPTkZJRyBjbWQJICAgICAqLwotCXU4IGJhbmQ7Ci0JLyoqIEFjdHVhbCBOby4gb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IGJlbG93ICovCi0JdTggbnJjZnA7Ci0JLyoqIGNoYW4tZnJlcS10eHBvd2VyIG1hcHBpbmcgdGFibGUqLwotCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKkNGUDsKLX07Ci0KLS8qKgotICogIEBicmllZiBNYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBzZW50IGluIGEgc2V0dXNlcnNjYW4gaW9jdGwKLSAqLwotI2RlZmluZSBMQlNfSU9DVExfVVNFUl9TQ0FOX0NIQU5fTUFYICA1MAotCi1pbnQgbGJzX3NzaWRfY21wKHU4ICpzc2lkMSwgdTggc3NpZDFfbGVuLCB1OCAqc3NpZDIsIHU4IHNzaWQyX2xlbik7Ci0KLWludCBsYnNfc2V0X3JlZ2lvbnRhYmxlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTggcmVnaW9uLCB1OCBiYW5kKTsKLQotaW50IGxic19zZW5kX3NwZWNpZmljX3NzaWRfc2NhbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4ICpzc2lkLAotCQkJCXU4IHNzaWRfbGVuKTsKLQotaW50IGxic19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpOwotaW50IGxic19zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotaW50IGxic19zY2FuX25ldHdvcmtzKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IGZ1bGxfc2Nhbik7Ci0KLXZvaWQgbGJzX3NjYW5fd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKaW5kZXggYTliZjY1OC4uODAwMGNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCkBAIC00LDEzICs0LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogCiAjaW5jbHVkZSAiaG9zdC5oIgogI2luY2x1ZGUgInJhZGlvdGFwLmgiCiAjaW5jbHVkZSAiZGVjbC5oIgogI2luY2x1ZGUgImRlZnMuaCIKICNpbmNsdWRlICJkZXYuaCIKLSNpbmNsdWRlICJ3ZXh0LmgiCiAKIC8qKgogICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIFR4L1J4IHJhdGVzIGZyb20gSUVFRTgwMjExX1JBRElPVEFQX1JBVEUKQEAgLTExMSw3ICsxMTEsNyBAQAogCXA4MDJ4X2hkciA9IHNrYi0+ZGF0YTsKIAlwa3RfbGVuID0gc2tiLT5sZW47CiAKLQlpZiAoZGV2ID09IHByaXYtPnJ0YXBfbmV0X2RldikgeworCWlmIChwcml2LT53ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikgewogCQlzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyICpydGFwX2hkciA9ICh2b2lkICopc2tiLT5kYXRhOwogCiAJCS8qIHNldCB0eHBkIGZpZWxkcyBmcm9tIHRoZSByYWRpb3RhcCBoZWFkZXIgKi8KQEAgLTE0Nyw3ICsxNDcsNyBAQAogCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKLQlpZiAocHJpdi0+bW9uaXRvcm1vZGUpIHsKKwlpZiAocHJpdi0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJLyogS2VlcCB0aGUgc2tiIHRvIGVjaG8gaXQgYmFjayBvbmNlIFR4IGZlZWRiYWNrIGlzCiAJCSAgIHJlY2VpdmVkIGZyb20gRlcgKi8KIAkJc2tiX29ycGhhbihza2IpOwpAQCAtMTU4LDYgKzE1OCw3IEBACiAgZnJlZToKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CisKICB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAl3YWtlX3VwKCZwcml2LT53YWl0cSk7CkBAIC0xNzksNyArMTgwLDggQEAKIHsKIAlzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyICpyYWRpb3RhcF9oZHI7CiAKLQlpZiAoIXByaXYtPm1vbml0b3Jtb2RlIHx8IHByaXYtPmN1cnJlbnR0eHNrYiA9PSBOVUxMKQorCWlmIChwcml2LT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiB8fAorCSAgICBwcml2LT5jdXJyZW50dHhza2IgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJcmFkaW90YXBfaGRyID0gKHN0cnVjdCB0eF9yYWRpb3RhcF9oZHIgKilwcml2LT5jdXJyZW50dHhza2ItPmRhdGE7CkBAIC0xODgsNyArMTkwLDcgQEAKIAkJKDEgKyBwcml2LT50eHJldHJ5Y291bnQgLSB0cnlfY291bnQpIDogMDsKIAogCXByaXYtPmN1cnJlbnR0eHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwcml2LT5jdXJyZW50dHhza2IsCi0JCQkJCQkgICAgICBwcml2LT5ydGFwX25ldF9kZXYpOworCQkJCQkJICAgICAgcHJpdi0+ZGV2KTsKIAluZXRpZl9yeChwcml2LT5jdXJyZW50dHhza2IpOwogCiAJcHJpdi0+Y3VycmVudHR4c2tiID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R5cGVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eXBlcy5oCmluZGV4IDNlNzJjODYuLjQ2MmZiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R5cGVzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHlwZXMuaApAQCAtMTEsNyArMTEsNyBAQAogc3RydWN0IGllZWVfaWVfaGVhZGVyIHsKIAl1OCBpZDsKIAl1OCBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlX2llX2NmX3BhcmFtX3NldCB7CiAJc3RydWN0IGllZWVfaWVfaGVhZGVyIGhlYWRlcjsKQEAgLTIwLDE5ICsyMCwxOSBAQAogCXU4IGNmcHBlcmlvZDsKIAlfX2xlMTYgY2ZwbWF4ZHVyYXRpb247CiAJX19sZTE2IGNmcGR1cmF0aW9ucmVtYWluaW5nOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIHN0cnVjdCBpZWVlX2llX2lic3NfcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgaWVlZV9pZV9oZWFkZXIgaGVhZGVyOwogCiAJX19sZTE2IGF0aW13aW5kb3c7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHVuaW9uIGllZWVfc3NfcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgaWVlZV9pZV9jZl9wYXJhbV9zZXQgY2Y7CiAJc3RydWN0IGllZWVfaWVfaWJzc19wYXJhbV9zZXQgaWJzczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWVfaWVfZmhfcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgaWVlZV9pZV9oZWFkZXIgaGVhZGVyOwpAQCAtNDEsMTggKzQxLDE4IEBACiAJdTggaG9wc2V0OwogCXU4IGhvcHBhdHRlcm47CiAJdTggaG9waW5kZXg7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlX2llX2RzX3BhcmFtX3NldCB7CiAJc3RydWN0IGllZWVfaWVfaGVhZGVyIGhlYWRlcjsKIAogCXU4IGNoYW5uZWw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHVuaW9uIGllZWVfcGh5X3BhcmFtX3NldCB7CiAJc3RydWN0IGllZWVfaWVfZmhfcGFyYW1fc2V0IGZoOwogCXN0cnVjdCBpZWVlX2llX2RzX3BhcmFtX3NldCBkczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqIFRMViAgdHlwZSBJRCBkZWZpbml0aW9uICovCiAjZGVmaW5lIFBST1BSSUVUQVJZX1RMVl9CQVNFX0lECQkweDAxMDAKQEAgLTEwMCwyOCArMTAwLDI4IEBACiBzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgewogCV9fbGUxNiB0eXBlOwogCV9fbGUxNiBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtcnZsX2llX2RhdGEgewogCXN0cnVjdCBtcnZsX2llX2hlYWRlciBoZWFkZXI7CiAJdTggRGF0YVsxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1ydmxfaWVfcmF0ZXNfcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCXU4IHJhdGVzWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXJ2bF9pZV9zc2lkX3BhcmFtX3NldCB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKIAl1OCBzc2lkWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXJ2bF9pZV93aWxkY2FyZF9zc2lkX3BhcmFtX3NldCB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKIAl1OCBNYXhTc2lkbGVuZ3RoOwogCXU4IHNzaWRbMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjaGFuc2Nhbm1vZGUgewogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRApAQCAtMTMzLDcgKzEzMyw3IEBACiAJdTggZGlzYWJsZWNoYW5maWx0OjE7CiAJdTggcmVzZXJ2ZWRfMl83OjY7CiAjZW5kaWYKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgewogCXU4IHJhZGlvdHlwZTsKQEAgLTE0MSwxMiArMTQxLDEyIEBACiAJc3RydWN0IGNoYW5zY2FubW9kZSBjaGFuc2Nhbm1vZGU7CiAJX19sZTE2IG1pbnNjYW50aW1lOwogCV9fbGUxNiBtYXhzY2FudGltZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1ydmxfaWVfY2hhbmxpc3RfcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0IGNoYW5zY2FucGFyYW1bMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtcnZsX2llX2NmX3BhcmFtX3NldCB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKQEAgLTE1NCw4NiArMTU0LDg2IEBACiAJdTggY2ZwcGVyaW9kOwogCV9fbGUxNiBjZnBtYXhkdXJhdGlvbjsKIAlfX2xlMTYgY2ZwZHVyYXRpb25yZW1haW5pbmc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtcnZsX2llX2RzX3BhcmFtX3NldCB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKIAl1OCBjaGFubmVsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXJ2bF9pZV9yc25fcGFyYW1fc2V0IHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCXU4IHJzbmllWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXJ2bF9pZV90c2ZfdGltZXN0YW1wIHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCV9fbGU2NCB0c2Z0YWJsZVsxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogdjkgYW5kIGxhdGVyIGZpcm13YXJlIG9ubHkgKi8KIHN0cnVjdCBtcnZsX2llX2F1dGhfdHlwZSB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKIAlfX2xlMTYgYXV0aDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqICBMb2NhbCBQb3dlciBjYXBhYmlsaXR5ICovCiBzdHJ1Y3QgbXJ2bF9pZV9wb3dlcl9jYXBhYmlsaXR5IHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCXM4IG1pbnBvd2VyOwogCXM4IG1heHBvd2VyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiB1c2VkIGluIENNRF84MDJfMTFfU1VCU0NSSUJFX0VWRU5UIGZvciBTTlIsIFJTU0kgYW5kIEZhaWx1cmUgKi8KIHN0cnVjdCBtcnZsX2llX3RocmVzaG9sZHMgewogCXN0cnVjdCBtcnZsX2llX2hlYWRlciBoZWFkZXI7CiAJdTggdmFsdWU7CiAJdTggZnJlcTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1ydmxfaWVfYmVhY29uc19taXNzZWQgewogCXN0cnVjdCBtcnZsX2llX2hlYWRlciBoZWFkZXI7CiAJdTggYmVhY29ubWlzc2VkOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXJ2bF9pZV9udW1fcHJvYmVzIHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCV9fbGUxNiBudW1wcm9iZXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtcnZsX2llX2JjYXN0X3Byb2JlIHsKIAlzdHJ1Y3QgbXJ2bF9pZV9oZWFkZXIgaGVhZGVyOwogCV9fbGUxNiBiY2FzdHByb2JlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXJ2bF9pZV9udW1fc3NpZF9wcm9iZSB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKIAlfX2xlMTYgbnVtc3NpZHByb2JlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGVkX3BpbiB7CiAJdTggbGVkOwogCXU4IHBpbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1ydmxfaWVfbGVkZ3BpbyB7CiAJc3RydWN0IG1ydmxfaWVfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgbGVkX3BpbiBsZWRwaW5bMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsZWRfYmh2IHsKIAl1aW50OF90CWZpcm13YXJlc3RhdGU7CiAJdWludDhfdAlsZWQ7CiAJdWludDhfdAlsZWRzdGF0ZTsKIAl1aW50OF90CWxlZGFyZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBzdHJ1Y3QgbXJ2bF9pZV9sZWRiaHYgewogCXN0cnVjdCBtcnZsX2llX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IGxlZF9iaHYgbGVkYmh2WzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBNZWFudCB0byBiZSBwYWNrZWQgYXMgdGhlIHZhbHVlIG1lbWJlciBvZiBhIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50LgogICogTm90ZSB0aGF0IHRoZSBsZW4gbWVtYmVyIG9mIHRoZSBpZWVlODAyMTFfaW5mb19lbGVtZW50IHZhcmllcyBkZXBlbmRpbmcgb24KQEAgLTI0OCwxMiArMjQ4LDEyIEBACiAJdWludDhfdCBtZXNoX2NhcGFiaWxpdHk7CiAJdWludDhfdCBtZXNoX2lkX2xlbjsKIAl1aW50OF90IG1lc2hfaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtcnZsX21lc2hpZSB7CiAJdTggaWQsIGxlbjsKIAlzdHJ1Y3QgbXJ2bF9tZXNoaWVfdmFsIHZhbDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG1ydmxfbWVzaF9kZWZhdWx0cyB7CiAJX19sZTMyIGJvb3RmbGFnOwpAQCAtMjYxLDYgKzI2MSw2IEBACiAJdWludDhfdCByZXNlcnZlZDsKIAlfX2xlMTYgY2hhbm5lbDsKIAlzdHJ1Y3QgbXJ2bF9tZXNoaWUgbWVzaGllOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2YTk2MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUzICswLDAgQEAKLS8qKgotICAqIFRoaXMgZmlsZSBjb250YWlucyBpb2N0bCBmdW5jdGlvbnMKLSAgKi8KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0KLSNpbmNsdWRlICJob3N0LmgiCi0jaW5jbHVkZSAicmFkaW90YXAuaCIKLSNpbmNsdWRlICJkZWNsLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImRldi5oIgotI2luY2x1ZGUgIndleHQuaCIKLSNpbmNsdWRlICJzY2FuLmgiCi0jaW5jbHVkZSAiYXNzb2MuaCIKLSNpbmNsdWRlICJjbWQuaCIKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsoc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCWlmIChwcml2LT5zdXJwcmlzZXJlbW92ZWQpCi0JCXJldHVybjsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hc3NvY193b3JrKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya190aHJlYWQsICZwcml2LT5hc3NvY193b3JrLCBIWiAvIDIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGJzX2RvX2Fzc29jaWF0aW9uX3dvcmsoc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCWlmIChwcml2LT5zdXJwcmlzZXJlbW92ZWQpCi0JCXJldHVybjsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hc3NvY193b3JrKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya190aHJlYWQsICZwcml2LT5hc3NvY193b3JrLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxic19jYW5jZWxfYXNzb2NpYXRpb25fd29yayhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YXNzb2Nfd29yayk7Ci0Ja2ZyZWUocHJpdi0+cGVuZGluZ19hc3NvY19yZXEpOwotCXByaXYtPnBlbmRpbmdfYXNzb2NfcmVxID0gTlVMTDsKLX0KLQotdm9pZCBsYnNfc2VuZF9kaXNjb25uZWN0X25vdGlmaWNhdGlvbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCi0JbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAweDAwLCBFVEhfQUxFTik7Ci0Jd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxic19zZW5kX2l3ZXZjdXN0b21fZXZlbnQoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBzOCAqc3RyKQotewotCXVuaW9uIGl3cmVxX2RhdGEgaXdycTsKLQl1OCBidWZbNTBdOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbWVtc2V0KCZpd3JxLCAwLCBzaXplb2YodW5pb24gaXdyZXFfZGF0YSkpOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiJXMiLCBzdHIpOwotCi0JaXdycS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpICsgMSArIElXX0VWX0xDUF9MRU47Ci0KLQkvKiBTZW5kIEV2ZW50IHRvIHVwcGVyIGxheWVyICovCi0JbGJzX2RlYl93ZXh0KCJldmVudCBpbmRpY2F0aW9uIHN0cmluZyAlc1xuIiwgKGNoYXIgKilidWYpOwotCWxic19kZWJfd2V4dCgiZXZlbnQgaW5kaWNhdGlvbiBsZW5ndGggJWRcbiIsIGl3cnEuZGF0YS5sZW5ndGgpOwotCWxic19kZWJfd2V4dCgic2VuZGluZyB3aXJlbGVzcyBldmVudCBJV0VWQ1VTVE9NIGZvciAlc1xuIiwgc3RyKTsKLQotCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+ZGV2LCBJV0VWQ1VTVE9NLCAmaXdycSwgYnVmKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBNSUMgZmFpbHVyZSBldmVudC4KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYSAgZXZlbnQgICB0aGUgZXZlbnQgaWQKLSAqICBAcmV0dXJuIAkgICBuL2EKLSAqLwotdm9pZCBsYnNfc2VuZF9taWNfZmFpbHVyZWV2ZW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGV2ZW50KQotewotCWNoYXIgYnVmWzUwXTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCXNwcmludGYoYnVmLCAiJXMiLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uICIpOwotCi0JaWYgKGV2ZW50ID09IE1BQ1JFR19JTlRfQ09ERV9NSUNfRVJSX1VOSUNBU1QpCi0JCXN0cmNhdChidWYsICJ1bmljYXN0ICIpOwotCWVsc2UKLQkJc3RyY2F0KGJ1ZiwgIm11bHRpY2FzdCAiKTsKLQotCWxic19zZW5kX2l3ZXZjdXN0b21fZXZlbnQocHJpdiwgYnVmKTsKLQlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIEZpbmQgdGhlIGNoYW5uZWwgZnJlcXVlbmN5IHBvd2VyIGluZm8gd2l0aCBzcGVjaWZpYyBjaGFubmVsCi0gKgotICogIEBwYXJhbSBwcml2IAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSBiYW5kCQlpdCBjYW4gYmUgQkFORF9BLCBCQU5EX0cgb3IgQkFORF9CCi0gKiAgQHBhcmFtIGNoYW5uZWwgICAgICB0aGUgY2hhbm5lbCBmb3IgbG9va2luZwotICogIEByZXR1cm4gCSAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGNoYW5fZnJlcV9wb3dlciBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBub3QgZmluZC4KLSAqLwotc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGJzX2ZpbmRfY2ZwX2J5X2JhbmRfYW5kX2NoYW5uZWwoCi0Jc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCXU4IGJhbmQsCi0JdTE2IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwID0gTlVMTDsKLQlzdHJ1Y3QgcmVnaW9uX2NoYW5uZWwgKnJjOwotCWludCBpLCBqOwotCi0JZm9yIChqID0gMDsgIWNmcCAmJiAoaiA8IEFSUkFZX1NJWkUocHJpdi0+cmVnaW9uX2NoYW5uZWwpKTsgaisrKSB7Ci0JCXJjID0gJnByaXYtPnJlZ2lvbl9jaGFubmVsW2pdOwotCi0JCWlmICghcmMtPnZhbGlkIHx8ICFyYy0+Q0ZQKQotCQkJY29udGludWU7Ci0JCWlmIChyYy0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0JCWZvciAoaSA9IDA7IGkgPCByYy0+bnJjZnA7IGkrKykgewotCQkJaWYgKHJjLT5DRlBbaV0uY2hhbm5lbCA9PSBjaGFubmVsKSB7Ci0JCQkJY2ZwID0gJnJjLT5DRlBbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIWNmcCAmJiBjaGFubmVsKQotCQlsYnNfZGViX3dleHQoImxic19maW5kX2NmcF9ieV9iYW5kX2FuZF9jaGFubmVsOiBjYW4ndCBmaW5kICIKLQkJICAgICAgICJjZnAgYnkgYmFuZCAlZCAvIGNoYW5uZWwgJWRcbiIsIGJhbmQsIGNoYW5uZWwpOwotCi0JcmV0dXJuIGNmcDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIEZpbmQgdGhlIGNoYW5uZWwgZnJlcXVlbmN5IHBvd2VyIGluZm8gd2l0aCBzcGVjaWZpYyBmcmVxdWVuY3kKLSAqCi0gKiAgQHBhcmFtIHByaXYgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIGJhbmQJCWl0IGNhbiBiZSBCQU5EX0EsIEJBTkRfRyBvciBCQU5EX0IKLSAqICBAcGFyYW0gZnJlcQkgICAgICAgIHRoZSBmcmVxdWVuY3kgZm9yIGxvb2tpbmcKLSAqICBAcmV0dXJuIAkgICAJQSBwb2ludGVyIHRvIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZpbmQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxKAotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQl1OCBiYW5kLAotCXUzMiBmcmVxKQotewotCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcCA9IE5VTEw7Ci0Jc3RydWN0IHJlZ2lvbl9jaGFubmVsICpyYzsKLQlpbnQgaSwgajsKLQotCWZvciAoaiA9IDA7ICFjZnAgJiYgKGogPCBBUlJBWV9TSVpFKHByaXYtPnJlZ2lvbl9jaGFubmVsKSk7IGorKykgewotCQlyYyA9ICZwcml2LT5yZWdpb25fY2hhbm5lbFtqXTsKLQotCQlpZiAoIXJjLT52YWxpZCB8fCAhcmMtPkNGUCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocmMtPmJhbmQgIT0gYmFuZCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKGkgPSAwOyBpIDwgcmMtPm5yY2ZwOyBpKyspIHsKLQkJCWlmIChyYy0+Q0ZQW2ldLmZyZXEgPT0gZnJlcSkgewotCQkJCWNmcCA9ICZyYy0+Q0ZQW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFjZnAgJiYgZnJlcSkKLQkJbGJzX2RlYl93ZXh0KCJmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxbDogY2FuJ3QgZmluZCBjZnAgYnkgIgotCQkgICAgICAgImJhbmQgJWQgLyBmcmVxICVkXG4iLCBiYW5kLCBmcmVxKTsKLQotCXJldHVybiBjZnA7Ci19Ci0KLS8qKgotICogIEBicmllZiBDb3B5IGFjdGl2ZSBkYXRhIHJhdGVzIGJhc2VkIG9uIGFkYXB0ZXIgbW9kZSBhbmQgc3RhdHVzCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSByYXRlCQkgICAgICAgIFRoZSBidWYgdG8gcmV0dXJuIHRoZSBhY3RpdmUgcmF0ZXMKLSAqLwotc3RhdGljIHZvaWQgY29weV9hY3RpdmVfZGF0YV9yYXRlcyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4ICpyYXRlcykKLXsKLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAoKHByaXYtPmNvbm5lY3Rfc3RhdHVzICE9IExCU19DT05ORUNURUQpICYmCi0JCSFsYnNfbWVzaF9jb25uZWN0ZWQocHJpdikpCi0JCW1lbWNweShyYXRlcywgbGJzX2JnX3JhdGVzLCBNQVhfUkFURVMpOwotCWVsc2UKLQkJbWVtY3B5KHJhdGVzLCBwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMsIE1BWF9SQVRFUyk7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgY2hhciAqY3dycSwgY2hhciAqZXh0cmEpCi17Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQkvKiBXZSBjb3VsZCBhZGQgc3VwcG9ydCBmb3IgODAyLjExbiBoZXJlIGFzIG5lZWRlZC4gSmVhbiBJSSAqLwotCXNucHJpbnRmKGN3cnEsIElGTkFNU0laLCAiSUVFRSA4MDIuMTFiL2ciKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsYnNfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWNmcCA9IGxic19maW5kX2NmcF9ieV9iYW5kX2FuZF9jaGFubmVsKHByaXYsIDAsCi0JCQkJCSAgIHByaXYtPmNoYW5uZWwpOwotCi0JaWYgKCFjZnApIHsKLQkJaWYgKHByaXYtPmNoYW5uZWwpCi0JCQlsYnNfZGViX3dleHQoImludmFsaWQgY2hhbm5lbCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5jaGFubmVsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZndycS0+bSA9IChsb25nKWNmcC0+ZnJlcSAqIDEwMDAwMDsKLQlmd3JxLT5lID0gMTsKLQotCWxic19kZWJfd2V4dCgiZnJlcSAldVxuIiwgZndycS0+bSk7Ci0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX1dFWFQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxic19nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKSB7Ci0JCW1lbWNweShhd3JxLT5zYV9kYXRhLCBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQltZW1zZXQoYXdycS0+c2FfZGF0YSwgMCwgRVRIX0FMRU4pOwotCX0KLQlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX3NldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQkvKgotCSAqIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKLQkgKi8KLQotCWlmIChkd3JxLT5sZW5ndGggPiAxNikgewotCQlyZXR1cm4gLUUyQklHOwotCX0KLQotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCW1lbXNldChwcml2LT5ub2RlbmFtZSwgMCwgc2l6ZW9mKHByaXYtPm5vZGVuYW1lKSk7Ci0JbWVtY3B5KHByaXYtPm5vZGVuYW1lLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX1dFWFQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxic19nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JZHdycS0+bGVuZ3RoID0gc3RybGVuKHByaXYtPm5vZGVuYW1lKTsKLQltZW1jcHkoZXh0cmEsIHByaXYtPm5vZGVuYW1lLCBkd3JxLT5sZW5ndGgpOwotCWV4dHJhW2R3cnEtPmxlbmd0aF0gPSAnXDAnOwotCi0JZHdycS0+ZmxhZ3MgPSAxOwkvKiBhY3RpdmUgKi8KLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19MSUJFUlRBU19NRVNICi1zdGF0aWMgaW50IG1lc2hfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCS8qIFVzZSBuaWNrbmFtZSB0byBpbmRpY2F0ZSB0aGF0IG1lc2ggaXMgb24gKi8KLQotCWlmIChsYnNfbWVzaF9jb25uZWN0ZWQocHJpdikpIHsKLQkJc3RybmNweShleHRyYSwgIk1lc2giLCAxMik7Ci0JCWV4dHJhWzEyXSA9ICdcMCc7Ci0JCWR3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSk7Ci0JfQotCi0JZWxzZSB7Ci0JCWV4dHJhWzBdID0gJ1wwJzsKLQkJZHdycS0+bGVuZ3RoID0gMDsKLQl9Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBsYnNfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JdTMyIHZhbCA9IHZ3cnEtPnZhbHVlOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JaWYgKHZ3cnEtPmRpc2FibGVkKQotCQl2YWwgPSBNUlZEUlZfUlRTX01BWF9WQUxVRTsKLQotCWlmICh2YWwgPiBNUlZEUlZfUlRTX01BWF9WQUxVRSkgLyogbWluIHJ0cyB2YWx1ZSBpcyAwICovCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gbGJzX3NldF9zbm1wX21pYihwcml2LCBTTk1QX01JQl9PSURfUlRTX1RIUkVTSE9MRCwgKHUxNikgdmFsKTsKLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXQgPSAwOwotCXUxNiB2YWwgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JcmV0ID0gbGJzX2dldF9zbm1wX21pYihwcml2LCBTTk1QX01JQl9PSURfUlRTX1RIUkVTSE9MRCwgJnZhbCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQl2d3JxLT52YWx1ZSA9IHZhbDsKLQl2d3JxLT5kaXNhYmxlZCA9IHZhbCA+IE1SVkRSVl9SVFNfTUFYX1ZBTFVFOyAvKiBtaW4gcnRzIHZhbHVlIGlzIDAgKi8KLQl2d3JxLT5maXhlZCA9IDE7Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxic19zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXQgPSAwOwotCXUzMiB2YWwgPSB2d3JxLT52YWx1ZTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWlmICh2d3JxLT5kaXNhYmxlZCkKLQkJdmFsID0gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFOwotCi0JaWYgKHZhbCA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSB8fCB2YWwgPiBNUlZEUlZfRlJBR19NQVhfVkFMVUUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gbGJzX3NldF9zbm1wX21pYihwcml2LCBTTk1QX01JQl9PSURfRlJBR19USFJFU0hPTEQsICh1MTYpIHZhbCk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxic19nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXQgPSAwOwotCXUxNiB2YWwgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JcmV0ID0gbGJzX2dldF9zbm1wX21pYihwcml2LCBTTk1QX01JQl9PSURfRlJBR19USFJFU0hPTEQsICZ2YWwpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JdndycS0+dmFsdWUgPSB2YWw7Ci0JdndycS0+ZGlzYWJsZWQgPSAoKHZhbCA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSkKLQkJCSAgfHwgKHZhbCA+IE1SVkRSVl9GUkFHX01BWF9WQUxVRSkpOwotCXZ3cnEtPmZpeGVkID0gMTsKLQotb3V0OgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgdTMyICogdXdycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JKnV3cnEgPSBwcml2LT5tb2RlOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX1dFWFQpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0xJQkVSVEFTX01FU0gKLXN0YXRpYyBpbnQgbWVzaF93bGFuX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgdTMyICogdXdycSwKLQkJCSAgICAgIGNoYXIgKmV4dHJhKQotewotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCSp1d3JxID0gSVdfTU9ERV9SRVBFQVQ7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBsYnNfZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCXMxNiBjdXJsZXZlbCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAoIXByaXYtPnJhZGlvX29uKSB7Ci0JCWxic19kZWJfd2V4dCgidHggcG93ZXIgb2ZmXG4iKTsKLQkJdndycS0+dmFsdWUgPSAwOwotCQl2d3JxLT5kaXNhYmxlZCA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IGxic19nZXRfdHhfcG93ZXIocHJpdiwgJmN1cmxldmVsLCBOVUxMLCBOVUxMKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWxic19kZWJfd2V4dCgidHggcG93ZXIgbGV2ZWwgJWQgZGJtXG4iLCBjdXJsZXZlbCk7Ci0JcHJpdi0+dHhwb3dlcl9jdXIgPSBjdXJsZXZlbDsKLQotCXZ3cnEtPnZhbHVlID0gY3VybGV2ZWw7Ci0JdndycS0+Zml4ZWQgPSAxOwotCXZ3cnEtPmRpc2FibGVkID0gMDsKLQl2d3JxLT5mbGFncyA9IElXX1RYUE9XX0RCTTsKLQotb3V0OgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgc2xpbWl0ID0gMCwgbGxpbWl0ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotICAgICAgICBpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfVFlQRSkgIT0gSVdfUkVUUllfTElNSVQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogVGhlIE1BQyBoYXMgYSA0LWJpdCBUb3RhbF9UeF9Db3VudCByZWdpc3RlcgotCSAgIFRvdGFsX1R4X0NvdW50ID0gMSArIFR4X1JldHJ5X0NvdW50ICovCi0jZGVmaW5lIFRYX1JFVFJZX01JTiAwCi0jZGVmaW5lIFRYX1JFVFJZX01BWCAxNAotCWlmICh2d3JxLT52YWx1ZSA8IFRYX1JFVFJZX01JTiB8fCB2d3JxLT52YWx1ZSA+IFRYX1JFVFJZX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBBZGQgMSB0byBjb252ZXJ0IHJldHJ5IGNvdW50IHRvIHRyeSBjb3VudCAqLwotCWlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX1NIT1JUKQotCQlzbGltaXQgPSAodTE2KSAodndycS0+dmFsdWUgKyAxKTsKLQllbHNlIGlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xPTkcpCi0JCWxsaW1pdCA9ICh1MTYpICh2d3JxLT52YWx1ZSArIDEpOwotCWVsc2UKLQkJc2xpbWl0ID0gbGxpbWl0ID0gKHUxNikgKHZ3cnEtPnZhbHVlICsgMSk7IC8qIHNldCBib3RoICovCi0KLQlpZiAobGxpbWl0KSB7Ci0JCXJldCA9IGxic19zZXRfc25tcF9taWIocHJpdiwgU05NUF9NSUJfT0lEX0xPTkdfUkVUUllfTElNSVQsCi0JCQkJICAgICAgIGxsaW1pdCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoc2xpbWl0KSB7Ci0JCS8qIHR4cmV0cnljb3VudCBmb2xsb3dzIHRoZSBzaG9ydCByZXRyeSBsaW1pdCAqLwotCQlwcml2LT50eHJldHJ5Y291bnQgPSBzbGltaXQ7Ci0JCXJldCA9IGxic19zZXRfc25tcF9taWIocHJpdiwgU05NUF9NSUJfT0lEX1NIT1JUX1JFVFJZX0xJTUlULAotCQkJCSAgICAgICBzbGltaXQpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsYnNfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXQgPSAwOwotCXUxNiB2YWwgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JdndycS0+ZGlzYWJsZWQgPSAwOwotCi0JaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTE9ORykgewotCQlyZXQgPSBsYnNfZ2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9MT05HX1JFVFJZX0xJTUlULCAmdmFsKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIFN1YnRyYWN0IDEgdG8gY29udmVydCB0cnkgY291bnQgdG8gcmV0cnkgY291bnQgKi8KLQkJdndycS0+dmFsdWUgPSB2YWwgLSAxOwotCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTE9ORzsKLQl9IGVsc2UgewotCQlyZXQgPSBsYnNfZ2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9TSE9SVF9SRVRSWV9MSU1JVCwgJnZhbCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQkvKiB0eHJldHJ5IGNvdW50IGZvbGxvd3MgdGhlIHNob3J0IHJldHJ5IGxpbWl0ICovCi0JCXByaXYtPnR4cmV0cnljb3VudCA9IHZhbDsKLQkJLyogU3VidHJhY3QgMSB0byBjb252ZXJ0IHRyeSBjb3VudCB0byByZXRyeSBjb3VudCAqLwotCQl2d3JxLT52YWx1ZSA9IHZhbCAtIDE7Ci0JCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9TSE9SVDsKLQl9Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc29ydF9jaGFubmVscyhzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgaW50IG51bSkKLXsKLQlpbnQgaSwgajsKLQlzdHJ1Y3QgaXdfZnJlcSB0ZW1wOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bTsgaisrKQotCQkJaWYgKGZyZXFbaV0uaSA+IGZyZXFbal0uaSkgewotCQkJCXRlbXAuaSA9IGZyZXFbaV0uaTsKLQkJCQl0ZW1wLm0gPSBmcmVxW2ldLm07Ci0KLQkJCQlmcmVxW2ldLmkgPSBmcmVxW2pdLmk7Ci0JCQkJZnJlcVtpXS5tID0gZnJlcVtqXS5tOwotCi0JCQkJZnJlcVtqXS5pID0gdGVtcC5pOwotCQkJCWZyZXFbal0ubSA9IHRlbXAubTsKLQkJCX0KLX0KLQotLyogZGF0YSByYXRlIGxpc3RpbmcKLQlNVUxUSV9CQU5EUzoKLQkJYWJnCQlhCWIJYi9nCi0gICBJbmZyYSAJRygxMikJCUEoOCkJQig0KQlHKDEyKQotICAgQWRob2MgCUErQigxMikJCUEoOCkJQig0KQlCKDQpCi0KLQlub24tTVVMVElfQkFORFM6Ci0JCQkJCWIJYi9nCi0gICBJbmZyYSAJICAgICAJCSAgICAJQig0KQlHKDEyKQotICAgQWRob2MgCSAgICAgIAkJICAgIAlCKDQpCUIoNCkKLSAqLwotLyoqCi0gKiAgQGJyaWVmIEdldCBSYW5nZSBJbmZvCi0gKgotICogIEBwYXJhbSBkZXYgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gaW5mbwkJCUEgcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8gc3RydWN0dXJlCi0gKiAgQHBhcmFtIHZ3cnEgCQlBIHBvaW50ZXIgdG8gaXdfcGFyYW0gc3RydWN0dXJlCi0gKiAgQHBhcmFtIGV4dHJhCQlBIHBvaW50ZXIgdG8gZXh0cmEgZGF0YSBidWYKLSAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IGxic19nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgaSwgajsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKLQlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7Ci0JdTggcmF0ZXNbTUFYX1JBVEVTICsgMV07Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlkd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKLQltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKLQotCXJhbmdlLT5taW5fbndpZCA9IDA7Ci0JcmFuZ2UtPm1heF9ud2lkID0gMDsKLQotCW1lbXNldChyYXRlcywgMCwgc2l6ZW9mKHJhdGVzKSk7Ci0JY29weV9hY3RpdmVfZGF0YV9yYXRlcyhwcml2LCByYXRlcyk7Ci0JcmFuZ2UtPm51bV9iaXRyYXRlcyA9IHN0cm5sZW4ocmF0ZXMsIElXX01BWF9CSVRSQVRFUyk7Ci0JZm9yIChpID0gMDsgaSA8IHJhbmdlLT5udW1fYml0cmF0ZXM7IGkrKykKLQkJcmFuZ2UtPmJpdHJhdGVbaV0gPSByYXRlc1tpXSAqIDUwMDAwMDsKLQlyYW5nZS0+bnVtX2JpdHJhdGVzID0gaTsKLQlsYnNfZGViX3dleHQoIklXX01BWF9CSVRSQVRFUyAlZCwgbnVtX2JpdHJhdGVzICVkXG4iLCBJV19NQVhfQklUUkFURVMsCi0JICAgICAgIHJhbmdlLT5udW1fYml0cmF0ZXMpOwotCi0JcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOwotCi0JcmFuZ2UtPnNjYW5fY2FwYSA9IElXX1NDQU5fQ0FQQV9FU1NJRDsKLQotCWZvciAoaiA9IDA7IChyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA8IElXX01BWF9GUkVRVUVOQ0lFUykKLQkgICAgICYmIChqIDwgQVJSQVlfU0laRShwcml2LT5yZWdpb25fY2hhbm5lbCkpOyBqKyspIHsKLQkJY2ZwID0gcHJpdi0+cmVnaW9uX2NoYW5uZWxbal0uQ0ZQOwotCQlmb3IgKGkgPSAwOyAocmFuZ2UtPm51bV9mcmVxdWVuY3kgPCBJV19NQVhfRlJFUVVFTkNJRVMpCi0JCSAgICAgJiYgcHJpdi0+cmVnaW9uX2NoYW5uZWxbal0udmFsaWQKLQkJICAgICAmJiBjZnAKLQkJICAgICAmJiAoaSA8IHByaXYtPnJlZ2lvbl9jaGFubmVsW2pdLm5yY2ZwKTsgaSsrKSB7Ci0JCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0uaSA9Ci0JCQkgICAgKGxvbmcpY2ZwLT5jaGFubmVsOwotCQkJcmFuZ2UtPmZyZXFbcmFuZ2UtPm51bV9mcmVxdWVuY3ldLm0gPQotCQkJICAgIChsb25nKWNmcC0+ZnJlcSAqIDEwMDAwMDsKLQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5lID0gMTsKLQkJCWNmcCsrOwotCQkJcmFuZ2UtPm51bV9mcmVxdWVuY3krKzsKLQkJfQotCX0KLQotCWxic19kZWJfd2V4dCgiSVdfTUFYX0ZSRVFVRU5DSUVTICVkLCBudW1fZnJlcXVlbmN5ICVkXG4iLAotCSAgICAgICBJV19NQVhfRlJFUVVFTkNJRVMsIHJhbmdlLT5udW1fZnJlcXVlbmN5KTsKLQotCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeTsKLQotCXNvcnRfY2hhbm5lbHMoJnJhbmdlLT5mcmVxWzBdLCByYW5nZS0+bnVtX2ZyZXF1ZW5jeSk7Ci0KLQkvKgotCSAqIFNldCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBtYXggVENQIHRocm91Z2hwdXQgaW4gYml0L3MgdGhhdCB3ZSBjYW4KLQkgKiBleHBlY3QgdXNpbmcgdGhpcyBpbnRlcmZhY2UKLQkgKi8KLQlpZiAoaSA+IDIpCi0JCXJhbmdlLT50aHJvdWdocHV0ID0gNTAwMCAqIDEwMDA7Ci0JZWxzZQotCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDE1MDAgKiAxMDAwOwotCi0JcmFuZ2UtPm1pbl9ydHMgPSBNUlZEUlZfUlRTX01JTl9WQUxVRTsKLQlyYW5nZS0+bWF4X3J0cyA9IE1SVkRSVl9SVFNfTUFYX1ZBTFVFOwotCXJhbmdlLT5taW5fZnJhZyA9IE1SVkRSVl9GUkFHX01JTl9WQUxVRTsKLQlyYW5nZS0+bWF4X2ZyYWcgPSBNUlZEUlZfRlJBR19NQVhfVkFMVUU7Ci0KLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7Ci0JcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKLQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKLQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDQ7Ci0KLQkvKgotCSAqIFJpZ2h0IG5vdyB3ZSBzdXBwb3J0IG9ubHkgIml3Y29uZmlnIGV0aFggcG93ZXIgb258b2ZmIgotCSAqLwotCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfT047Ci0KLQkvKgotCSAqIE1pbmltdW0gdmVyc2lvbiB3ZSByZWNvbW1lbmQKLQkgKi8KLQlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNTsKLQotCS8qCi0JICogVmVyc2lvbiB3ZSBhcmUgY29tcGlsZWQgd2l0aAotCSAqLwotCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwotCi0JcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKLQlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKLQotCXJhbmdlLT5taW5fcmV0cnkgPSBUWF9SRVRSWV9NSU47Ci0JcmFuZ2UtPm1heF9yZXRyeSA9IFRYX1JFVFJZX01BWDsKLQotCS8qCi0JICogU2V0IHRoZSBxdWFsLCBsZXZlbCBhbmQgbm9pc2UgcmFuZ2UgdmFsdWVzCi0JICovCi0JcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7Ci0JcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKLQlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOwotCi0JcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA3MDsKLQkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sZCB2YWx1ZSBmb3IgUlNTSSAqLwotCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDA7Ci0JcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKLQlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKLQotCXJhbmdlLT5zZW5zaXRpdml0eSA9IDA7Ci0KLQkvKiBTZXR1cCB0aGUgc3VwcG9ydGVkIHBvd2VyIGxldmVsIHJhbmdlcyAqLwotCW1lbXNldChyYW5nZS0+dHhwb3dlciwgMCwgc2l6ZW9mKHJhbmdlLT50eHBvd2VyKSk7Ci0JcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTSB8IElXX1RYUE9XX1JBTkdFOwotCXJhbmdlLT50eHBvd2VyWzBdID0gcHJpdi0+dHhwb3dlcl9taW47Ci0JcmFuZ2UtPnR4cG93ZXJbMV0gPSBwcml2LT50eHBvd2VyX21heDsKLQlyYW5nZS0+bnVtX3R4cG93ZXIgPSAyOwotCi0JcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAotCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKLQkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1NDQU4pKTsKLQlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOwotCi0JaWYgKHByaXYtPmZ3Y2FwaW5mbyAmIEZXX0NBUElORk9fV1BBKSB7Ci0JCXJhbmdlLT5lbmNfY2FwYSA9ICAgSVdfRU5DX0NBUEFfV1BBCi0JCSAgICAgICAgICAgICAgICAgIHwgSVdfRU5DX0NBUEFfV1BBMgotCQkgICAgICAgICAgICAgICAgICB8IElXX0VOQ19DQVBBX0NJUEhFUl9US0lQCi0JCSAgICAgICAgICAgICAgICAgIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7Ci0JfQotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX1dFWFQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxic19zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAoIShwcml2LT5md2NhcGluZm8gJiBGV19DQVBJTkZPX1BTKSkgewotCQlpZiAodndycS0+ZGlzYWJsZWQpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUFMgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGluIEluZnJhc3RydWN0dXJlIG1vZGUKLQkgKiBSZW1vdmUgdGhpcyBjaGVjayBpZiBpdCBpcyB0byBiZSBzdXBwb3J0ZWQgaW4gSUJTUyBtb2RlIGFsc28KLQkgKi8KLQotCWlmICh2d3JxLT5kaXNhYmxlZCkgewotCQlwcml2LT5wc21vZGUgPSBMQlM4MDJfMTFQT1dFUk1PREVDQU07Ci0JCWlmIChwcml2LT5wc3N0YXRlICE9IFBTX1NUQVRFX0ZVTExfUE9XRVIpIHsKLQkJCWxic19wc193YWtldXAocHJpdiwgQ01EX09QVElPTl9XQUlURk9SUlNQKTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQotCWlmICgodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7Ci0JCWxic19kZWJfd2V4dCgKLQkJICAgICAgICJzZXR0aW5nIHBvd2VyIHRpbWVvdXQgaXMgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZSBpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfUEVSSU9EKSB7Ci0JCXZ3cnEtPnZhbHVlID0gdndycS0+dmFsdWUgLyAxMDAwOwotCQlpZiAoIXByaXYtPmVudGVyX2RlZXBfc2xlZXApIHsKLQkJCWxic19wcl9lcnIoImRlZXAgc2xlZXAgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgIgotCQkJCQkiZm9yIHRoaXMgaW50ZXJmYWNlIGRyaXZlclxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKSB7Ci0JCQlpZiAoKHByaXYtPmlzX2F1dG9fZGVlcF9zbGVlcF9lbmFibGVkKSAmJgotCQkJCQkJKHZ3cnEtPnZhbHVlID09IC0xMDAwKSkgewotCQkJCWxic19leGl0X2F1dG9fZGVlcF9zbGVlcChwcml2KTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJbGJzX3ByX2VycigiY2FuJ3QgdXNlIGRlZXAgc2xlZXAgY21kIGluICIKLQkJCQkJCSJjb25uZWN0ZWQgc3RhdGVcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJaWYgKCh2d3JxLT52YWx1ZSA8IDApICYmICh2d3JxLT52YWx1ZSAhPSAtMTAwMCkpIHsKLQkJCWxic19wcl9lcnIoInVua25vd24gb3B0aW9uXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHZ3cnEtPnZhbHVlID4gMCkgewotCQkJaWYgKCFwcml2LT5pc19hdXRvX2RlZXBfc2xlZXBfZW5hYmxlZCkgewotCQkJCXByaXYtPmlzX2FjdGl2aXR5X2RldGVjdGVkID0gMDsKLQkJCQlwcml2LT5hdXRvX2RlZXBfc2xlZXBfdGltZW91dCA9IHZ3cnEtPnZhbHVlOwotCQkJCWxic19lbnRlcl9hdXRvX2RlZXBfc2xlZXAocHJpdik7Ci0JCQl9IGVsc2UgewotCQkJCXByaXYtPmF1dG9fZGVlcF9zbGVlcF90aW1lb3V0ID0gdndycS0+dmFsdWU7Ci0JCQkJbGJzX2RlYl9kZWJ1Z2ZzKCJhdXRvIGRlZXAgc2xlZXA6ICIKLQkJCQkJCSJhbHJlYWR5IGVuYWJsZWRcbiIpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHJpdi0+aXNfYXV0b19kZWVwX3NsZWVwX2VuYWJsZWQpIHsKLQkJCQlsYnNfZXhpdF9hdXRvX2RlZXBfc2xlZXAocHJpdik7Ci0JCQkJLyogVHJ5IHRvIGV4aXQgZGVlcCBzbGVlcCBpZiBhdXRvICovCi0JCQkJLypkZWVwIHNsZWVwIGRpc2FibGVkICovCi0JCQkJcmV0ID0gbGJzX3NldF9kZWVwX3NsZWVwKHByaXYsIDApOwotCQkJfQotCQkJaWYgKHZ3cnEtPnZhbHVlID09IDApCi0JCQkJcmV0ID0gbGJzX3NldF9kZWVwX3NsZWVwKHByaXYsIDEpOwotCQkJZWxzZSBpZiAodndycS0+dmFsdWUgPT0gLTEwMDApCi0JCQkJcmV0ID0gbGJzX3NldF9kZWVwX3NsZWVwKHByaXYsIDApOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCWlmIChwcml2LT5wc21vZGUgIT0gTEJTODAyXzExUE9XRVJNT0RFQ0FNKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXByaXYtPnBzbW9kZSA9IExCUzgwMl8xMVBPV0VSTU9ERU1BWF9QU1A7Ci0KLQlpZiAocHJpdi0+Y29ubmVjdF9zdGF0dXMgPT0gTEJTX0NPTk5FQ1RFRCkgewotCQlsYnNfcHNfc2xlZXAocHJpdiwgQ01EX09QVElPTl9XQUlURk9SUlNQKTsKLQl9Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsYnNfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JdndycS0+dmFsdWUgPSAwOwotCXZ3cnEtPmZsYWdzID0gMDsKLQl2d3JxLT5kaXNhYmxlZCA9IHByaXYtPnBzbW9kZSA9PSBMQlM4MDJfMTFQT1dFUk1PREVDQU0KLQkJfHwgcHJpdi0+Y29ubmVjdF9zdGF0dXMgPT0gTEJTX0RJU0NPTk5FQ1RFRDsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpsYnNfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZW51bSB7Ci0JCVBPT1IgPSAzMCwKLQkJRkFJUiA9IDYwLAotCQlHT09EID0gODAsCi0JCVZFUllfR09PRCA9IDkwLAotCQlFWENFTExFTlQgPSA5NSwKLQkJUEVSRkVDVCA9IDEwMAotCX07Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCXUzMiByc3NpX3F1YWw7Ci0JdTMyIHR4X3F1YWw7Ci0JdTMyIHF1YWxpdHkgPSAwOwotCWludCByZXQsIHN0YXRzX3ZhbGlkID0gMDsKLQl1OCByc3NpOwotCXUzMiB0eF9yZXRyaWVzOwotCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgbG9nOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JcHJpdi0+d3N0YXRzLnN0YXR1cyA9IHByaXYtPm1vZGU7Ci0KLQkvKiBJZiB3ZSdyZSBub3QgYXNzb2NpYXRlZCwgYWxsIHF1YWxpdHkgdmFsdWVzIGFyZSBtZWFuaW5nbGVzcyAqLwotCWlmICgocHJpdi0+Y29ubmVjdF9zdGF0dXMgIT0gTEJTX0NPTk5FQ1RFRCkgJiYKLQkgICAgIWxic19tZXNoX2Nvbm5lY3RlZChwcml2KSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBRdWFsaXR5IGJ5IFJTU0kgKi8KLQlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9Ci0JICAgIENBTF9SU1NJKHByaXYtPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10sCi0JICAgICBwcml2LT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10pOwotCi0JaWYgKHByaXYtPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9PSAwKSB7Ci0JCXByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0gTVJWRFJWX05GX0RFRkFVTFRfU0NBTl9WQUxVRTsKLQl9IGVsc2UgewotCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9Ci0JCSAgICBDQUxfTkYocHJpdi0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKLQl9Ci0KLQlsYnNfZGViX3dleHQoInNpZ25hbCBsZXZlbCAlI3hcbiIsIHByaXYtPndzdGF0cy5xdWFsLmxldmVsKTsKLQlsYnNfZGViX3dleHQoIm5vaXNlICUjeFxuIiwgcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UpOwotCi0JcnNzaSA9IHByaXYtPndzdGF0cy5xdWFsLmxldmVsIC0gcHJpdi0+d3N0YXRzLnF1YWwubm9pc2U7Ci0JaWYgKHJzc2kgPCAxNSkKLQkJcnNzaV9xdWFsID0gcnNzaSAqIFBPT1IgLyAxMDsKLQllbHNlIGlmIChyc3NpIDwgMjApCi0JCXJzc2lfcXVhbCA9IChyc3NpIC0gMTUpICogKEZBSVIgLSBQT09SKSAvIDUgKyBQT09SOwotCWVsc2UgaWYgKHJzc2kgPCAzMCkKLQkJcnNzaV9xdWFsID0gKHJzc2kgLSAyMCkgKiAoR09PRCAtIEZBSVIpIC8gNSArIEZBSVI7Ci0JZWxzZSBpZiAocnNzaSA8IDQwKQotCQlyc3NpX3F1YWwgPSAocnNzaSAtIDMwKSAqIChWRVJZX0dPT0QgLSBHT09EKSAvCi0JCSAgICAxMCArIEdPT0Q7Ci0JZWxzZQotCQlyc3NpX3F1YWwgPSAocnNzaSAtIDQwKSAqIChQRVJGRUNUIC0gVkVSWV9HT09EKSAvCi0JCSAgICAxMCArIFZFUllfR09PRDsKLQlxdWFsaXR5ID0gcnNzaV9xdWFsOwotCi0JLyogUXVhbGl0eSBieSBUWCBlcnJvcnMgKi8KLQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzID0gZGV2LT5zdGF0cy50eF9lcnJvcnM7Ci0KLQltZW1zZXQoJmxvZywgMCwgc2l6ZW9mKGxvZykpOwotCWxvZy5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihsb2cpKTsKLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9HRVRfTE9HLCAmbG9nKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCXR4X3JldHJpZXMgPSBsZTMyX3RvX2NwdShsb2cucmV0cnkpOwotCi0JaWYgKHR4X3JldHJpZXMgPiA3NSkKLQkJdHhfcXVhbCA9ICg5MCAtIHR4X3JldHJpZXMpICogUE9PUiAvIDE1OwotCWVsc2UgaWYgKHR4X3JldHJpZXMgPiA3MCkKLQkJdHhfcXVhbCA9ICg3NSAtIHR4X3JldHJpZXMpICogKEZBSVIgLSBQT09SKSAvIDUgKyBQT09SOwotCWVsc2UgaWYgKHR4X3JldHJpZXMgPiA2NSkKLQkJdHhfcXVhbCA9ICg3MCAtIHR4X3JldHJpZXMpICogKEdPT0QgLSBGQUlSKSAvIDUgKyBGQUlSOwotCWVsc2UgaWYgKHR4X3JldHJpZXMgPiA1MCkKLQkJdHhfcXVhbCA9ICg2NSAtIHR4X3JldHJpZXMpICogKFZFUllfR09PRCAtIEdPT0QpIC8KLQkJICAgIDE1ICsgR09PRDsKLQllbHNlCi0JCXR4X3F1YWwgPSAoNTAgLSB0eF9yZXRyaWVzKSAqCi0JCSAgICAoUEVSRkVDVCAtIFZFUllfR09PRCkgLyA1MCArIFZFUllfR09PRDsKLQlxdWFsaXR5ID0gbWluKHF1YWxpdHksIHR4X3F1YWwpOwotCi0JcHJpdi0+d3N0YXRzLmRpc2NhcmQuY29kZSA9IGxlMzJfdG9fY3B1KGxvZy53ZXB1bmRlY3J5cHRhYmxlKTsKLQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzID0gdHhfcmV0cmllczsKLQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjID0gbGUzMl90b19jcHUobG9nLmFja2ZhaWx1cmUpOwotCi0JLyogQ2FsY3VsYXRlIHF1YWxpdHkgKi8KLQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gbWluX3QodTgsIHF1YWxpdHksIDEwMCk7Ci0JcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKLQlzdGF0c192YWxpZCA9IDE7Ci0KLQkvKiB1cGRhdGUgc3RhdHMgYXN5bmNocm9ub3VzbHkgZm9yIGZ1dHVyZSBjYWxscyAqLwotCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9SU1NJLCAwLAotCQkJCQkwLCAwLCBOVUxMKTsKLQlpZiAocmV0KQotCQlsYnNfcHJfZXJyKCJSU1NJIGNvbW1hbmQgZmFpbGVkXG4iKTsKLW91dDoKLQlpZiAoIXN0YXRzX3ZhbGlkKSB7Ci0JCXByaXYtPndzdGF0cy5taXNzLmJlYWNvbiA9IDA7Ci0JCXByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMgPSAwOwotCQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gMDsKLQkJcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwgPSAwOwotCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9IDA7Ci0JCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEOwotCQlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRCB8Ci0JCSAgICBJV19RVUFMX1FVQUxfSU5WQUxJRCB8IElXX1FVQUxfTEVWRUxfSU5WQUxJRDsKLQl9Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci0JcmV0dXJuICZwcml2LT53c3RhdHM7Ci0KLQotfQotCi1zdGF0aWMgaW50IGxic19zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgIHN0cnVjdCBpd19mcmVxICpmd3JxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOwotCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JYXNzb2NfcmVxID0gbGJzX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYpOwotCWlmICghYXNzb2NfcmVxKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIElmIHNldHRpbmcgYnkgZnJlcXVlbmN5LCBjb252ZXJ0IHRvIGEgY2hhbm5lbCAqLwotCWlmIChmd3JxLT5lID09IDEpIHsKLQkJbG9uZyBmID0gZndycS0+bSAvIDEwMDAwMDsKLQotCQljZnAgPSBmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxKHByaXYsIDAsIGYpOwotCQlpZiAoIWNmcCkgewotCQkJbGJzX2RlYl93ZXh0KCJpbnZhbGlkIGZyZXEgJWxkXG4iLCBmKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZndycS0+ZSA9IDA7Ci0JCWZ3cnEtPm0gPSAoaW50KSBjZnAtPmNoYW5uZWw7Ci0JfQotCi0JLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLwotCWlmIChmd3JxLT5tID4gMTAwMCB8fCBmd3JxLT5lID4gMCkgewotCQlnb3RvIG91dDsKLQl9Ci0KLQljZnAgPSBsYnNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbChwcml2LCAwLCBmd3JxLT5tKTsKLQlpZiAoIWNmcCkgewotCQlnb3RvIG91dDsKLQl9Ci0KLQlhc3NvY19yZXEtPmNoYW5uZWwgPSBmd3JxLT5tOwotCXJldCA9IDA7Ci0KLW91dDoKLQlpZiAocmV0ID09IDApIHsKLQkJc2V0X2JpdChBU1NPQ19GTEFHX0NIQU5ORUwsICZhc3NvY19yZXEtPmZsYWdzKTsKLQkJbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfSBlbHNlIHsKLQkJbGJzX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHByaXYpOwotCX0KLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIENPTkZJR19MSUJFUlRBU19NRVNICi1zdGF0aWMgaW50IGxic19tZXNoX3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHN0cnVjdCBpd19mcmVxICpmd3JxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JLyogSWYgc2V0dGluZyBieSBmcmVxdWVuY3ksIGNvbnZlcnQgdG8gYSBjaGFubmVsICovCi0JaWYgKGZ3cnEtPmUgPT0gMSkgewotCQlsb25nIGYgPSBmd3JxLT5tIC8gMTAwMDAwOwotCi0JCWNmcCA9IGZpbmRfY2ZwX2J5X2JhbmRfYW5kX2ZyZXEocHJpdiwgMCwgZik7Ci0JCWlmICghY2ZwKSB7Ci0JCQlsYnNfZGViX3dleHQoImludmFsaWQgZnJlcSAlbGRcbiIsIGYpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlmd3JxLT5lID0gMDsKLQkJZndycS0+bSA9IChpbnQpIGNmcC0+Y2hhbm5lbDsKLQl9Ci0KLQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCi0JaWYgKGZ3cnEtPm0gPiAxMDAwIHx8IGZ3cnEtPmUgPiAwKSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWNmcCA9IGxic19maW5kX2NmcF9ieV9iYW5kX2FuZF9jaGFubmVsKHByaXYsIDAsIGZ3cnEtPm0pOwotCWlmICghY2ZwKSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChmd3JxLT5tICE9IHByaXYtPmNoYW5uZWwpIHsKLQkJbGJzX2RlYl93ZXh0KCJtZXNoIGNoYW5uZWwgY2hhbmdlIGZvcmNlcyBldGggZGlzY29ubmVjdFxuIik7Ci0JCWlmIChwcml2LT5tb2RlID09IElXX01PREVfSU5GUkEpCi0JCQlsYnNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHByaXYsCi0JCQkJCQkgICAgIHByaXYtPmN1cmJzc3BhcmFtcy5ic3NpZCwKLQkJCQkJCSAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCQllbHNlIGlmIChwcml2LT5tb2RlID09IElXX01PREVfQURIT0MpCi0JCQlsYnNfYWRob2Nfc3RvcChwcml2KTsKLQl9Ci0JbGJzX21lc2hfY29uZmlnKHByaXYsIENNRF9BQ1RfTUVTSF9DT05GSUdfU1RBUlQsIGZ3cnEtPm0pOwotCWxic191cGRhdGVfY2hhbm5lbChwcml2KTsKLQlyZXQgPSAwOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGxic19zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCXU4IG5ld19yYXRlID0gMDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQl1OCByYXRlc1tNQVhfUkFURVMgKyAxXTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWxic19kZWJfd2V4dCgidndycS0+dmFsdWUgJWRcbiIsIHZ3cnEtPnZhbHVlKTsKLQlsYnNfZGViX3dleHQoInZ3cnEtPmZpeGVkICVkXG4iLCB2d3JxLT5maXhlZCk7Ci0KLQlpZiAodndycS0+Zml4ZWQgJiYgdndycS0+dmFsdWUgPT0gLTEpCi0JCWdvdG8gb3V0OwotCi0JLyogQXV0byByYXRlPyAqLwotCXByaXYtPmVuYWJsZWh3YXV0byA9ICF2d3JxLT5maXhlZDsKLQotCWlmICh2d3JxLT52YWx1ZSA9PSAtMSkKLQkJcHJpdi0+Y3VyX3JhdGUgPSAwOwotCWVsc2UgewotCQlpZiAodndycS0+dmFsdWUgJSAxMDAwMDApCi0JCQlnb3RvIG91dDsKLQotCQluZXdfcmF0ZSA9IHZ3cnEtPnZhbHVlIC8gNTAwMDAwOwotCQlwcml2LT5jdXJfcmF0ZSA9IG5ld19yYXRlOwotCQkvKiB0aGUgcmVzdCBpcyBvbmx5IG5lZWRlZCBmb3IgbGJzX3NldF9kYXRhX3JhdGUoKSAqLwotCQltZW1zZXQocmF0ZXMsIDAsIHNpemVvZihyYXRlcykpOwotCQljb3B5X2FjdGl2ZV9kYXRhX3JhdGVzKHByaXYsIHJhdGVzKTsKLQkJaWYgKCFtZW1jaHIocmF0ZXMsIG5ld19yYXRlLCBzaXplb2YocmF0ZXMpKSkgewotCQkJbGJzX3ByX2FsZXJ0KCJmaXhlZCBkYXRhIHJhdGUgMHglWCBvdXQgb2YgcmFuZ2VcbiIsCi0JCQkJbmV3X3JhdGUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKHByaXYtPmZ3cmVsZWFzZSA8IDB4MDkwMDAwMDApIHsKLQkJCXJldCA9IGxic19zZXRfcG93ZXJfYWRhcHRfY2ZnKHByaXYsIDAsCi0JCQkJCVBPV19BREFQVF9ERUZBVUxUX1AwLAotCQkJCQlQT1dfQURBUFRfREVGQVVMVF9QMSwKLQkJCQkJUE9XX0FEQVBUX0RFRkFVTFRfUDIpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIG91dDsKLQkJfQotCQlyZXQgPSBsYnNfc2V0X3RwY19jZmcocHJpdiwgMCwgVFBDX0RFRkFVTFRfUDAsIFRQQ19ERUZBVUxUX1AxLAotCQkJCVRQQ19ERUZBVUxUX1AyLCAxKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCS8qIFRyeSB0aGUgbmV3ZXIgY29tbWFuZCBmaXJzdCAoRmlybXdhcmUgU3BlYyA1LjEgYW5kIGFib3ZlKSAqLwotCXJldCA9IGxic19jbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldChwcml2LCBDTURfQUNUX1NFVCk7Ci0KLQkvKiBGYWxsYmFjayB0byBvbGRlciB2ZXJzaW9uICovCi0JaWYgKHJldCkKLQkJcmV0ID0gbGJzX3NldF9kYXRhX3JhdGUocHJpdiwgbmV3X3JhdGUpOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsYnNfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKSB7Ci0JCXZ3cnEtPnZhbHVlID0gcHJpdi0+Y3VyX3JhdGUgKiA1MDAwMDA7Ci0KLQkJaWYgKHByaXYtPmVuYWJsZWh3YXV0bykKLQkJCXZ3cnEtPmZpeGVkID0gMDsKLQkJZWxzZQotCQkJdndycS0+Zml4ZWQgPSAxOwotCi0JfSBlbHNlIHsKLQkJdndycS0+Zml4ZWQgPSAwOwotCQl2d3JxLT52YWx1ZSA9IDA7Ci0JfQotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX1dFWFQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxic19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHUzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWlmICggICAoKnV3cnEgIT0gSVdfTU9ERV9BREhPQykKLQkgICAgJiYgKCp1d3JxICE9IElXX01PREVfSU5GUkEpCi0JICAgICYmICgqdXdycSAhPSBJV19NT0RFX0FVVE8pKSB7Ci0JCWxic19kZWJfd2V4dCgiSW52YWxpZCBtb2RlOiAweCV4XG4iLCAqdXdycSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCWFzc29jX3JlcSA9IGxic19nZXRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2KTsKLQlpZiAoIWFzc29jX3JlcSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlsYnNfY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfSBlbHNlIHsKLQkJYXNzb2NfcmVxLT5tb2RlID0gKnV3cnE7Ci0JCXNldF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0JCWxic19wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOwotCQlsYnNfZGViX3dleHQoIlN3aXRjaGluZyB0byBtb2RlOiAweCV4XG4iLCAqdXdycSk7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLW91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICogIEBicmllZiBHZXQgRW5jcnlwdGlvbiBrZXkKLSAqCi0gKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQotICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgotICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCi0gKi8KLXN0YXRpYyBpbnQgbGJzX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIHU4ICogZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbGJzX2RlYl93ZXh0KCJmbGFncyAweCV4LCBpbmRleCAlZCwgbGVuZ3RoICVkLCB3ZXBfdHhfa2V5aWR4ICVkXG4iLAotCSAgICAgICBkd3JxLT5mbGFncywgaW5kZXgsIGR3cnEtPmxlbmd0aCwgcHJpdi0+d2VwX3R4X2tleWlkeCk7Ci0KLQlkd3JxLT5mbGFncyA9IDA7Ci0KLQkvKiBBdXRoZW50aWNhdGlvbiBtZXRob2QgKi8KLQlzd2l0Y2ggKHByaXYtPnNlY2luZm8uYXV0aF9tb2RlKSB7Ci0JY2FzZSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTToKLQkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfT1BFTjsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfQUxHX1NIQVJFRF9LRVk6Ci0JY2FzZSBJV19BVVRIX0FMR19MRUFQOgotCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRCB8IElXX0VOQ09ERV9PUEVOOwotCQlicmVhazsKLQl9Ci0KLQltZW1zZXQoZXh0cmEsIDAsIDE2KTsKLQotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCi0JLyogRGVmYXVsdCB0byByZXR1cm5pbmcgY3VycmVudCB0cmFuc21pdCBrZXkgKi8KLQlpZiAoaW5kZXggPCAwKQotCQlpbmRleCA9IHByaXYtPndlcF90eF9rZXlpZHg7Ci0KLQlpZiAoKHByaXYtPndlcF9rZXlzW2luZGV4XS5sZW4pICYmIHByaXYtPnNlY2luZm8ud2VwX2VuYWJsZWQpIHsKLQkJbWVtY3B5KGV4dHJhLCBwcml2LT53ZXBfa2V5c1tpbmRleF0ua2V5LAotCQkgICAgICAgcHJpdi0+d2VwX2tleXNbaW5kZXhdLmxlbik7Ci0JCWR3cnEtPmxlbmd0aCA9IHByaXYtPndlcF9rZXlzW2luZGV4XS5sZW47Ci0KLQkJZHdycS0+ZmxhZ3MgfD0gKGluZGV4ICsgMSk7Ci0JCS8qIFJldHVybiBXRVAgZW5hYmxlZCAqLwotCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOwotCX0gZWxzZSBpZiAoKHByaXYtPnNlY2luZm8uV1BBZW5hYmxlZCkKLQkJICAgfHwgKHByaXYtPnNlY2luZm8uV1BBMmVuYWJsZWQpKSB7Ci0JCS8qIHJldHVybiBXUEEgZW5hYmxlZCAqLwotCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOwotCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7Ci0JfSBlbHNlIHsKLQkJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLQlsYnNfZGViX3dleHQoImtleTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngsIGtleWxlbiAlZFxuIiwKLQkgICAgICAgZXh0cmFbMF0sIGV4dHJhWzFdLCBleHRyYVsyXSwKLQkgICAgICAgZXh0cmFbM10sIGV4dHJhWzRdLCBleHRyYVs1XSwgZHdycS0+bGVuZ3RoKTsKLQotCWxic19kZWJfd2V4dCgicmV0dXJuIGZsYWdzIDB4JXhcbiIsIGR3cnEtPmZsYWdzKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFNldCBFbmNyeXB0aW9uIGtleSAoaW50ZXJuYWwpCi0gKgotICogIEBwYXJhbSBwcml2CQkJQSBwb2ludGVyIHRvIHByaXZhdGUgY2FyZCBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0ga2V5X21hdGVyaWFsCQlBIHBvaW50ZXIgdG8ga2V5IG1hdGVyaWFsCi0gKiAgQHBhcmFtIGtleV9sZW5ndGgJCWxlbmd0aCBvZiBrZXkgbWF0ZXJpYWwKLSAqICBAcGFyYW0gaW5kZXgJCWtleSBpbmRleCB0byBzZXQKLSAqICBAcGFyYW0gc2V0X3R4X2tleQkJRm9yY2Ugc2V0IFRYIGtleSAoMSA9IHllcywgMCA9IG5vKQotICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCi0gKi8KLXN0YXRpYyBpbnQgbGJzX3NldF93ZXBfa2V5KHN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEsCi0JCQkgICAgY29uc3QgY2hhciAqa2V5X21hdGVyaWFsLAotCQkJICAgIHUxNiBrZXlfbGVuZ3RoLAotCQkJICAgIHUxNiBpbmRleCwKLQkJCSAgICBpbnQgc2V0X3R4X2tleSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZW5jX2tleSAqcGtleTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCS8qIFBhcmFub2lkIHZhbGlkYXRpb24gb2Yga2V5IGluZGV4ICovCi0JaWYgKGluZGV4ID4gMykgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiB2YWxpZGF0ZSBtYXgga2V5IGxlbmd0aCAqLwotCWlmIChrZXlfbGVuZ3RoID4gS0VZX0xFTl9XRVBfMTA0KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXBrZXkgPSAmYXNzb2NfcmVxLT53ZXBfa2V5c1tpbmRleF07Ci0KLQlpZiAoa2V5X2xlbmd0aCA+IDApIHsKLQkJbWVtc2V0KHBrZXksIDAsIHNpemVvZihzdHJ1Y3QgZW5jX2tleSkpOwotCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfV0VQOwotCi0JCS8qIFN0YW5kYXJkaXplIHRoZSBrZXkgbGVuZ3RoICovCi0JCXBrZXktPmxlbiA9IChrZXlfbGVuZ3RoID4gS0VZX0xFTl9XRVBfNDApID8KLQkJICAgICAgICAgICAgICAgIEtFWV9MRU5fV0VQXzEwNCA6IEtFWV9MRU5fV0VQXzQwOwotCQltZW1jcHkocGtleS0+a2V5LCBrZXlfbWF0ZXJpYWwsIGtleV9sZW5ndGgpOwotCX0KLQotCWlmIChzZXRfdHhfa2V5KSB7Ci0JCS8qIEVuc3VyZSB0aGUgY2hvc2VuIGtleSBpcyB2YWxpZCAqLwotCQlpZiAoIXBrZXktPmxlbikgewotCQkJbGJzX2RlYl93ZXh0KCJrZXkgbm90IHNldCwgc28gY2Fubm90IGVuYWJsZSBpdFxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJYXNzb2NfcmVxLT53ZXBfdHhfa2V5aWR4ID0gaW5kZXg7Ci0JfQotCi0JYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkID0gMTsKLQotb3V0OgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfa2V5X2luZGV4KHUxNiBkZWZfaW5kZXgsIHUxNiByYXdfaW5kZXgsCi0JCQkgICAgICB1MTYgKm91dF9pbmRleCwgdTE2ICppc19kZWZhdWx0KQotewotCWlmICghb3V0X2luZGV4IHx8ICFpc19kZWZhdWx0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFZlcmlmeSBpbmRleCBpZiBwcmVzZW50LCBvdGhlcndpc2UgdXNlIGRlZmF1bHQgVFgga2V5IGluZGV4ICovCi0JaWYgKHJhd19pbmRleCA+IDApIHsKLQkJaWYgKHJhd19pbmRleCA+IDQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJKm91dF9pbmRleCA9IHJhd19pbmRleCAtIDE7Ci0JfSBlbHNlIHsKLQkJKm91dF9pbmRleCA9IGRlZl9pbmRleDsKLQkJKmlzX2RlZmF1bHQgPSAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGlzYWJsZV93ZXAoc3RydWN0IGFzc29jX3JlcXVlc3QgKmFzc29jX3JlcSkKLXsKLQlpbnQgaTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCS8qIFNldCBPcGVuIFN5c3RlbSBhdXRoIG1vZGUgKi8KLQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0KLQkvKiBDbGVhciBXRVAga2V5cyBhbmQgbWFyayBXRVAgYXMgZGlzYWJsZWQgKi8KLQlhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWFzc29jX3JlcS0+d2VwX2tleXNbaV0ubGVuID0gMDsKLQotCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0Jc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfd3BhKHN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEpCi17Ci0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbWVtc2V0KCZhc3NvY19yZXEtPndwYV9tY2FzdF9rZXksIDAsIHNpemVvZiAoc3RydWN0IGVuY19rZXkpKTsKLQlhc3NvY19yZXEtPndwYV9tY2FzdF9rZXkuZmxhZ3MgPSBLRVlfSU5GT19XUEFfTUNBU1Q7Ci0Jc2V0X2JpdChBU1NPQ19GTEFHX1dQQV9NQ0FTVF9LRVksICZhc3NvY19yZXEtPmZsYWdzKTsKLQotCW1lbXNldCgmYXNzb2NfcmVxLT53cGFfdW5pY2FzdF9rZXksIDAsIHNpemVvZiAoc3RydWN0IGVuY19rZXkpKTsKLQlhc3NvY19yZXEtPndwYV91bmljYXN0X2tleS5mbGFncyA9IEtFWV9JTkZPX1dQQV9VTklDQVNUOwotCXNldF9iaXQoQVNTT0NfRkxBR19XUEFfVUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0KLQlhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCA9IDA7Ci0JYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKLQlzZXRfYml0KEFTU09DX0ZMQUdfU0VDSU5GTywgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX1dFWFQpOwotfQotCi0vKioKLSAqICBAYnJpZWYgU2V0IEVuY3J5cHRpb24ga2V5Ci0gKgotICogIEBwYXJhbSBkZXYgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gaW5mbwkJCUEgcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8gc3RydWN0dXJlCi0gKiAgQHBhcmFtIHZ3cnEgCQlBIHBvaW50ZXIgdG8gaXdfcGFyYW0gc3RydWN0dXJlCi0gKiAgQHBhcmFtIGV4dHJhCQlBIHBvaW50ZXIgdG8gZXh0cmEgZGF0YSBidWYKLSAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IGxic19zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7Ci0JdTE2IGlzX2RlZmF1bHQgPSAwLCBpbmRleCA9IDAsIHNldF90eF9rZXkgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JYXNzb2NfcmVxID0gbGJzX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYpOwotCWlmICghYXNzb2NfcmVxKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewotCQlkaXNhYmxlX3dlcCAoYXNzb2NfcmVxKTsKLQkJZGlzYWJsZV93cGEgKGFzc29jX3JlcSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IHZhbGlkYXRlX2tleV9pbmRleChhc3NvY19yZXEtPndlcF90eF9rZXlpZHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmlzX2RlZmF1bHQpOwotCWlmIChyZXQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogSWYgV0VQIGlzbid0IGVuYWJsZWQsIG9yIGlmIHRoZXJlIGlzIG5vIGtleSBkYXRhIGJ1dCBhIHZhbGlkCi0JICogaW5kZXgsIHNldCB0aGUgVFgga2V5LgotCSAqLwotCWlmICghYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkIHx8IChkd3JxLT5sZW5ndGggPT0gMCAmJiAhaXNfZGVmYXVsdCkpCi0JCXNldF90eF9rZXkgPSAxOwotCi0JcmV0ID0gbGJzX3NldF93ZXBfa2V5KGFzc29jX3JlcSwgZXh0cmEsIGR3cnEtPmxlbmd0aCwgaW5kZXgsIHNldF90eF9rZXkpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGR3cnEtPmxlbmd0aCkKLQkJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0JaWYgKHNldF90eF9rZXkpCi0JCXNldF9iaXQoQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0KLQlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkgewotCQlwcml2LT5hdXRodHlwZV9hdXRvID0gMDsKLQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX1NIQVJFRF9LRVk7Ci0JfSBlbHNlIGlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7Ci0JCXByaXYtPmF1dGh0eXBlX2F1dG8gPSAwOwotCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0JfQotCi1vdXQ6Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0JCWxic19wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOwotCX0gZWxzZSB7Ci0JCWxic19jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogIEBicmllZiBHZXQgRXh0ZW5kZWQgRW5jcnlwdGlvbiBrZXkgKFdQQS84MDIuMXggYW5kIFdFUCkKLSAqCi0gKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQotICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgotICogIEByZXR1cm4gCSAgIAkJMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFpbHVyZQotICovCi1zdGF0aWMgaW50IGxic19nZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAotCQkJICAgICAgY2hhciAqZXh0cmEpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKLQlpbnQgaW5kZXgsIG1heF9rZXlfbGVuOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbWF4X2tleV9sZW4gPSBkd3JxLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7Ci0JaWYgKG1heF9rZXlfbGVuIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlpbmRleCA9IGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCWlmIChpbmRleCkgewotCQlpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNCkKLQkJCWdvdG8gb3V0OwotCQlpbmRleC0tOwotCX0gZWxzZSB7Ci0JCWluZGV4ID0gcHJpdi0+d2VwX3R4X2tleWlkeDsKLQl9Ci0KLQlpZiAoIShleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSAmJgotCSAgICBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkgewotCQlpZiAoaW5kZXggIT0gMCB8fCBwcml2LT5tb2RlICE9IElXX01PREVfSU5GUkEpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkd3JxLT5mbGFncyA9IGluZGV4ICsgMTsKLQltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOwotCi0JaWYgKCAgICFwcml2LT5zZWNpbmZvLndlcF9lbmFibGVkCi0JICAgICYmICFwcml2LT5zZWNpbmZvLldQQWVuYWJsZWQKLQkgICAgJiYgIXByaXYtPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKLQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7Ci0JCWV4dC0+a2V5X2xlbiA9IDA7Ci0JCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQl9IGVsc2UgewotCQl1OCAqa2V5ID0gTlVMTDsKLQotCQlpZiAoICAgcHJpdi0+c2VjaW5mby53ZXBfZW5hYmxlZAotCQkgICAgJiYgIXByaXYtPnNlY2luZm8uV1BBZW5hYmxlZAotCQkgICAgJiYgIXByaXYtPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKLQkJCS8qIFdFUCAqLwotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKLQkJCWV4dC0+a2V5X2xlbiA9IHByaXYtPndlcF9rZXlzW2luZGV4XS5sZW47Ci0JCQlrZXkgPSAmcHJpdi0+d2VwX2tleXNbaW5kZXhdLmtleVswXTsKLQkJfSBlbHNlIGlmICggICAhcHJpdi0+c2VjaW5mby53ZXBfZW5hYmxlZAotCQkgICAgICAgICAgICYmIChwcml2LT5zZWNpbmZvLldQQWVuYWJsZWQgfHwKLQkJICAgICAgICAgICAgICAgcHJpdi0+c2VjaW5mby5XUEEyZW5hYmxlZCkpIHsKLQkJCS8qIFdQQSAqLwotCQkJc3RydWN0IGVuY19rZXkgKiBwa2V5ID0gTlVMTDsKLQotCQkJaWYgKCAgIHByaXYtPndwYV9tY2FzdF9rZXkubGVuCi0JCQkgICAgJiYgKHByaXYtPndwYV9tY2FzdF9rZXkuZmxhZ3MgJiBLRVlfSU5GT19XUEFfRU5BQkxFRCkpCi0JCQkJcGtleSA9ICZwcml2LT53cGFfbWNhc3Rfa2V5OwotCQkJZWxzZSBpZiAoICAgcHJpdi0+d3BhX3VuaWNhc3Rfa2V5LmxlbgotCQkJICAgICAgICAgJiYgKHByaXYtPndwYV91bmljYXN0X2tleS5mbGFncyAmIEtFWV9JTkZPX1dQQV9FTkFCTEVEKSkKLQkJCQlwa2V5ID0gJnByaXYtPndwYV91bmljYXN0X2tleTsKLQotCQkJaWYgKHBrZXkpIHsKLQkJCQlpZiAocGtleS0+dHlwZSA9PSBLRVlfVFlQRV9JRF9BRVMpIHsKLQkJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7Ci0JCQkJfQotCQkJCWV4dC0+a2V5X2xlbiA9IHBrZXktPmxlbjsKLQkJCQlrZXkgPSAmcGtleS0+a2V5WzBdOwotCQkJfSBlbHNlIHsKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKLQkJCQlleHQtPmtleV9sZW4gPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoZXh0LT5rZXlfbGVuID4gbWF4X2tleV9sZW4pIHsKLQkJCXJldCA9IC1FMkJJRzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGV4dC0+a2V5X2xlbikKLQkJCW1lbWNweShleHQtPmtleSwga2V5LCBleHQtPmtleV9sZW4pOwotCQllbHNlCi0JCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7Ci0JCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwotCX0KLQlyZXQgPSAwOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiAgQGJyaWVmIFNldCBFbmNyeXB0aW9uIGtleSBFeHRlbmRlZCAoV1BBLzgwMi4xeCBhbmQgV0VQKQotICoKLSAqICBAcGFyYW0gZGV2ICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCi0gKiAgQHBhcmFtIGluZm8JCQlBIHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvIHN0cnVjdHVyZQotICogIEBwYXJhbSB2d3JxIAkJQSBwb2ludGVyIHRvIGl3X3BhcmFtIHN0cnVjdHVyZQotICogIEBwYXJhbSBleHRyYQkJQSBwb2ludGVyIHRvIGV4dHJhIGRhdGEgYnVmCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCBsYnNfc2V0X2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKLQkJCSAgICAgIGNoYXIgKmV4dHJhKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7Ci0JaW50IGFsZyA9IGV4dC0+YWxnOwotCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0JYXNzb2NfcmVxID0gbGJzX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYpOwotCWlmICghYXNzb2NfcmVxKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgoYWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgfHwgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkgewotCQlkaXNhYmxlX3dlcCAoYXNzb2NfcmVxKTsKLQkJZGlzYWJsZV93cGEgKGFzc29jX3JlcSk7Ci0JfSBlbHNlIGlmIChhbGcgPT0gSVdfRU5DT0RFX0FMR19XRVApIHsKLQkJdTE2IGlzX2RlZmF1bHQgPSAwLCBpbmRleCwgc2V0X3R4X2tleSA9IDA7Ci0KLQkJcmV0ID0gdmFsaWRhdGVfa2V5X2luZGV4KGFzc29jX3JlcS0+d2VwX3R4X2tleWlkeCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCksCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsICZpc19kZWZhdWx0KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIElmIFdFUCBpc24ndCBlbmFibGVkLCBvciBpZiB0aGVyZSBpcyBubyBrZXkgZGF0YSBidXQgYSB2YWxpZAotCQkgKiBpbmRleCwgb3IgaWYgdGhlIHNldC1UWC1rZXkgZmxhZyB3YXMgcGFzc2VkLCBzZXQgdGhlIFRYIGtleS4KLQkJICovCi0JCWlmICggICAhYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkCi0JCSAgICB8fCAoZHdycS0+bGVuZ3RoID09IDAgJiYgIWlzX2RlZmF1bHQpCi0JCSAgICB8fCAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpKQotCQkJc2V0X3R4X2tleSA9IDE7Ci0KLQkJLyogQ29weSBrZXkgdG8gZHJpdmVyICovCi0JCXJldCA9IGxic19zZXRfd2VwX2tleShhc3NvY19yZXEsIGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGluZGV4LAotCQkJCQlzZXRfdHhfa2V5KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB7Ci0JCQlwcml2LT5hdXRodHlwZV9hdXRvID0gMDsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19TSEFSRURfS0VZOwotCQl9IGVsc2UgaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pIHsKLQkJCXByaXYtPmF1dGh0eXBlX2F1dG8gPSAwOwotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwotCQl9Ci0KLQkJLyogTWFyayB0aGUgdmFyaW91cyBXRVAgYml0cyBhcyBtb2RpZmllZCAqLwotCQlzZXRfYml0KEFTU09DX0ZMQUdfU0VDSU5GTywgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCQlpZiAoZHdycS0+bGVuZ3RoKQotCQkJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7Ci0JCWlmIChzZXRfdHhfa2V5KQotCQkJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9UWF9LRVlJRFgsICZhc3NvY19yZXEtPmZsYWdzKTsKLQl9IGVsc2UgaWYgKChhbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB8fCAoYWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkpIHsKLQkJc3RydWN0IGVuY19rZXkgKiBwa2V5OwotCi0JCS8qIHZhbGlkYXRlIGtleSBsZW5ndGggKi8KLQkJaWYgKCgoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkKLQkJCSYmIChleHQtPmtleV9sZW4gIT0gS0VZX0xFTl9XUEFfVEtJUCkpCi0JCSAgICB8fCAoKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApCi0JCSAgICAgICAgJiYgKGV4dC0+a2V5X2xlbiAhPSBLRVlfTEVOX1dQQV9BRVMpKSkgewotCQkJCWxic19kZWJfd2V4dCgiaW52YWxpZCBzaXplICVkIGZvciBrZXkgb2YgYWxnICIKLQkJCQkgICAgICAgInR5cGUgJWRcbiIsCi0JCQkJICAgICAgIGV4dC0+a2V5X2xlbiwKLQkJCQkgICAgICAgYWxnKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKLQkJCXBrZXkgPSAmYXNzb2NfcmVxLT53cGFfbWNhc3Rfa2V5OwotCQkJc2V0X2JpdChBU1NPQ19GTEFHX1dQQV9NQ0FTVF9LRVksICZhc3NvY19yZXEtPmZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCXBrZXkgPSAmYXNzb2NfcmVxLT53cGFfdW5pY2FzdF9rZXk7Ci0JCQlzZXRfYml0KEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCQl9Ci0KLQkJbWVtc2V0KHBrZXksIDAsIHNpemVvZiAoc3RydWN0IGVuY19rZXkpKTsKLQkJbWVtY3B5KHBrZXktPmtleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7Ci0JCXBrZXktPmxlbiA9IGV4dC0+a2V5X2xlbjsKLQkJaWYgKHBrZXktPmxlbikKLQkJCXBrZXktPmZsYWdzIHw9IEtFWV9JTkZPX1dQQV9FTkFCTEVEOwotCi0JCS8qIERvIHRoaXMgYWZ0ZXIgemVyb2luZyBrZXkgc3RydWN0dXJlICovCi0JCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSB7Ci0JCQlwa2V5LT5mbGFncyB8PSBLRVlfSU5GT19XUEFfTUNBU1Q7Ci0JCX0gZWxzZSB7Ci0JCQlwa2V5LT5mbGFncyB8PSBLRVlfSU5GT19XUEFfVU5JQ0FTVDsKLQkJfQotCi0JCWlmIChhbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB7Ci0JCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfVEtJUDsKLQkJfSBlbHNlIGlmIChhbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7Ci0JCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfQUVTOwotCQl9Ci0KLQkJLyogSWYgV1BBIGlzbid0IGVuYWJsZWQgeWV0LCBkbyB0aGF0IG5vdyAqLwotCQlpZiAoICAgYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPT0gMAotCQkgICAgJiYgYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID09IDApIHsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEFlbmFibGVkID0gMTsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7Ci0JCQlzZXRfYml0KEFTU09DX0ZMQUdfU0VDSU5GTywgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCQl9Ci0KLQkJLyogT25seSBkaXNhYmxlIHdlcCBpZiBuZWNlc3Nhcnk6IGNhbid0IHdhc3RlIHRpbWUgaGVyZS4gKi8KLQkJaWYgKHByaXYtPm1hY19jb250cm9sICYgQ01EX0FDVF9NQUNfV0VQX0VOQUJMRSkKLQkJCWRpc2FibGVfd2VwKGFzc29jX3JlcSk7Ci0JfQotCi1vdXQ6Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCS8qIDgwMi4xeCBhbmQgV1BBIHJla2V5aW5nIG11c3QgaGFwcGVuIGFzIHF1aWNrbHkgYXMgcG9zc2libGUsCi0JCSAqIGVzcGVjaWFsbHkgZHVyaW5nIHRoZSA0LXdheSBoYW5kc2hha2U7IHRodXMgaWYgaW4KLQkJICogaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgYW5kIGVpdGhlciAoYSkgODAyLjF4IGlzIGVuYWJsZWQgb3IKLQkJICogKGIpIFdQQSBpcyBiZWluZyB1c2VkLCBzZXQgdGhlIGtleSByaWdodCBhd2F5LgotCQkgKi8KLQkJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0lORlJBICYmCi0JCSAgICAoKGFzc29jX3JlcS0+c2VjaW5mby5rZXlfbWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSB8fAotCQkgICAgIChhc3NvY19yZXEtPnNlY2luZm8ua2V5X21nbXQgJiBJV19BVVRIX0tFWV9NR01UX1BTSykgfHwKLQkJICAgICAgYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgfHwKLQkJICAgICAgYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSkgewotCQkJbGJzX2RvX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JCX0gZWxzZQotCQkJbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfSBlbHNlIHsKLQkJbGJzX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHByaXYpOwotCX0KLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGxic19zZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAotCQkJICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKLQlhc3NvY19yZXEgPSBsYnNfZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdik7Ci0JaWYgKCFhc3NvY19yZXEpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGR3cnEtPmxlbmd0aCA+IE1BWF9XUEFfSUVfTEVOIHx8Ci0JICAgIChkd3JxLT5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGR3cnEtPmxlbmd0aCkgewotCQltZW1jcHkoJmFzc29jX3JlcS0+d3BhX2llWzBdLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKLQkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gZHdycS0+bGVuZ3RoOwotCX0gZWxzZSB7Ci0JCW1lbXNldCgmYXNzb2NfcmVxLT53cGFfaWVbMF0sIDAsIHNpemVvZihwcml2LT53cGFfaWUpKTsKLQkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gMDsKLQl9Ci0KLW91dDoKLQlpZiAocmV0ID09IDApIHsKLQkJc2V0X2JpdChBU1NPQ19GTEFHX1dQQV9JRSwgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCQlsYnNfcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayhwcml2KTsKLQl9IGVsc2UgewotCQlsYnNfY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxic19nZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAotCQkJICBjaGFyICpleHRyYSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAocHJpdi0+d3BhX2llX2xlbiA9PSAwKSB7Ci0JCWR3cnEtPmxlbmd0aCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChkd3JxLT5sZW5ndGggPCBwcml2LT53cGFfaWVfbGVuKSB7Ci0JCXJldCA9IC1FMkJJRzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZHdycS0+bGVuZ3RoID0gcHJpdi0+d3BhX2llX2xlbjsKLQltZW1jcHkoZXh0cmEsICZwcml2LT53cGFfaWVbMF0sIHByaXYtPndwYV9pZV9sZW4pOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGxic19zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BhcmFtICpkd3JxLAotCQkJIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgdXBkYXRlZCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKLQlhc3NvY19yZXEgPSBsYnNfZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdik7Ci0JaWYgKCFhc3NvY19yZXEpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3dpdGNoIChkd3JxLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLQljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgotCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKLQljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKLQljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgotCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgotCQkvKgotCQkgKiBsaWJlcnRhcyBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycwotCQkgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0JCWFzc29jX3JlcS0+c2VjaW5mby5rZXlfbWdtdCA9IGR3cnEtPnZhbHVlOwotCQl1cGRhdGVkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046Ci0JCWlmIChkd3JxLT52YWx1ZSAmIElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQpIHsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEFlbmFibGVkID0gMDsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDA7Ci0JCQlkaXNhYmxlX3dwYSAoYXNzb2NfcmVxKTsKLQkJfQotCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkgewotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOwotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkID0gMDsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKLQkJfQotCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpIHsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7Ci0JCQlhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQgPSAwOwotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwotCQl9Ci0JCXVwZGF0ZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLQkJaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkgewotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX1NIQVJFRF9LRVk7Ci0JCX0gZWxzZSBpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkgewotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwotCQl9IGVsc2UgaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9BTEdfTEVBUCkgewotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX0xFQVA7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQl9Ci0JCXVwZGF0ZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLQkJaWYgKGR3cnEtPnZhbHVlKSB7Ci0JCQlpZiAoIWFzc29jX3JlcS0+c2VjaW5mby5XUEFlbmFibGVkICYmCi0JCQkgICAgIWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCkgewotCQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEFlbmFibGVkID0gMTsKLQkJCQlhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAxOwotCQkJCWFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCA9IDA7Ci0JCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOwotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKLQkJCWRpc2FibGVfd3BhIChhc3NvY19yZXEpOwotCQl9Ci0JCXVwZGF0ZWQgPSAxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlicmVhazsKLQl9Ci0KLW91dDoKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKHVwZGF0ZWQpCi0JCQlzZXRfYml0KEFTU09DX0ZMQUdfU0VDSU5GTywgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCQlsYnNfcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayhwcml2KTsKLQl9IGVsc2UgaWYgKHJldCAhPSAtRU9QTk9UU1VQUCkgewotCQlsYnNfY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxic19nZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BhcmFtICpkd3JxLAotCQkJIGNoYXIgKmV4dHJhKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCXN3aXRjaCAoZHdycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7Ci0JY2FzZSBJV19BVVRIX0tFWV9NR01UOgotCQlkd3JxLT52YWx1ZSA9IHByaXYtPnNlY2luZm8ua2V5X21nbXQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgotCQlkd3JxLT52YWx1ZSA9IDA7Ci0JCWlmIChwcml2LT5zZWNpbmZvLldQQWVuYWJsZWQpCi0JCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTsKLQkJaWYgKHByaXYtPnNlY2luZm8uV1BBMmVuYWJsZWQpCi0JCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTI7Ci0JCWlmICghZHdycS0+dmFsdWUpCi0JCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOwotCQlicmVhazsKLQotCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLQkJZHdycS0+dmFsdWUgPSBwcml2LT5zZWNpbmZvLmF1dGhfbW9kZTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0JCWlmIChwcml2LT5zZWNpbmZvLldQQWVuYWJsZWQgJiYgcHJpdi0+c2VjaW5mby5XUEEyZW5hYmxlZCkKLQkJCWR3cnEtPnZhbHVlID0gMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgbGJzX3NldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKLQlzMTYgZGJtID0gKHMxNikgdndycS0+dmFsdWU7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAodndycS0+ZGlzYWJsZWQpIHsKLQkJbGJzX3NldF9yYWRpbyhwcml2LCBSQURJT19QUkVBTUJMRV9BVVRPLCAwKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHZ3cnEtPmZpeGVkID09IDApIHsKLQkJLyogVXNlciByZXF1ZXN0cyBhdXRvbWF0aWMgdHggcG93ZXIgY29udHJvbCwgaG93ZXZlciB0aGVyZSBhcmUKLQkJICogbWFueSBhdXRvIHR4IHNldHRpbmdzLiAgRm9yIG5vdyB1c2UgZmlybXdhcmUgZGVmYXVsdHMgdW50aWwKLQkJICogd2UgY29tZSB1cCB3aXRoIGEgZ29vZCB3YXkgdG8gZXhwb3NlIHRoZXNlIHRvIHRoZSB1c2VyLiAqLwotCQlpZiAocHJpdi0+ZndyZWxlYXNlIDwgMHgwOTAwMDAwMCkgewotCQkJcmV0ID0gbGJzX3NldF9wb3dlcl9hZGFwdF9jZmcocHJpdiwgMSwKLQkJCQkJUE9XX0FEQVBUX0RFRkFVTFRfUDAsCi0JCQkJCVBPV19BREFQVF9ERUZBVUxUX1AxLAotCQkJCQlQT1dfQURBUFRfREVGQVVMVF9QMik7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gb3V0OwotCQl9Ci0JCXJldCA9IGxic19zZXRfdHBjX2NmZyhwcml2LCAwLCBUUENfREVGQVVMVF9QMCwgVFBDX0RFRkFVTFRfUDEsCi0JCQkJVFBDX0RFRkFVTFRfUDIsIDEpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JCWRibSA9IHByaXYtPnR4cG93ZXJfbWF4OwotCX0gZWxzZSB7Ci0JCS8qIFVzZXJzcGFjZSBjaGVjayBpbiBpd3JhbmdlIGlmIGl0IHNob3VsZCB1c2UgZEJtIG9yIG1XLAotCQkgKiB0aGVyZWZvcmUgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uIEplYW4gSUkgKi8KLQkJaWYgKCh2d3JxLT5mbGFncyAmIElXX1RYUE9XX1RZUEUpICE9IElXX1RYUE9XX0RCTSkgewotCQkJcmV0ID0gLUVPUE5PVFNVUFA7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qIFZhbGlkYXRlIHJlcXVlc3RlZCBwb3dlciBsZXZlbCBhZ2FpbnN0IGZpcm13YXJlIGFsbG93ZWQKLQkJICogbGV2ZWxzICovCi0JCWlmIChwcml2LT50eHBvd2VyX21pbiAmJiAoZGJtIDwgcHJpdi0+dHhwb3dlcl9taW4pKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAocHJpdi0+dHhwb3dlcl9tYXggJiYgKGRibSA+IHByaXYtPnR4cG93ZXJfbWF4KSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChwcml2LT5md3JlbGVhc2UgPCAweDA5MDAwMDAwKSB7Ci0JCQlyZXQgPSBsYnNfc2V0X3Bvd2VyX2FkYXB0X2NmZyhwcml2LCAwLAotCQkJCQlQT1dfQURBUFRfREVGQVVMVF9QMCwKLQkJCQkJUE9XX0FEQVBUX0RFRkFVTFRfUDEsCi0JCQkJCVBPV19BREFQVF9ERUZBVUxUX1AyKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQkJcmV0ID0gbGJzX3NldF90cGNfY2ZnKHByaXYsIDAsIFRQQ19ERUZBVUxUX1AwLCBUUENfREVGQVVMVF9QMSwKLQkJCQlUUENfREVGQVVMVF9QMiwgMSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBJZiB0aGUgcmFkaW8gd2FzIG9mZiwgdHVybiBpdCBvbiAqLwotCWlmICghcHJpdi0+cmFkaW9fb24pIHsKLQkJcmV0ID0gbGJzX3NldF9yYWRpbyhwcml2LCBSQURJT19QUkVBTUJMRV9BVVRPLCAxKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWxic19kZWJfd2V4dCgidHhwb3dlciBzZXQgJWQgZEJtXG4iLCBkYm0pOwotCi0JcmV0ID0gbGJzX3NldF90eF9wb3dlcihwcml2LCBkYm0pOwotCi1vdXQ6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsYnNfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JLyoKLQkgKiBOb3RlIDogaWYgZHdycS0+ZmxhZ3MgIT0gMCwgd2Ugc2hvdWxkIGdldCB0aGUgcmVsZXZhbnQgU1NJRCBmcm9tCi0JICogdGhlIFNTSUQgbGlzdC4uLgotCSAqLwotCi0JLyoKLQkgKiBHZXQgdGhlIGN1cnJlbnQgU1NJRAotCSAqLwotCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKSB7Ci0JCW1lbWNweShleHRyYSwgcHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWQsCi0JCSAgICAgICBwcml2LT5jdXJic3NwYXJhbXMuc3NpZF9sZW4pOwotCX0gZWxzZSB7Ci0JCW1lbXNldChleHRyYSwgMCwgMzIpOwotCX0KLQkvKgotCSAqIElmIG5vbmUsIHdlIG1heSB3YW50IHRvIGdldCB0aGUgb25lIHRoYXQgd2FzIHNldAotCSAqLwotCi0JZHdycS0+bGVuZ3RoID0gcHJpdi0+Y3VyYnNzcGFyYW1zLnNzaWRfbGVuOwotCi0JZHdycS0+ZmxhZ3MgPSAxOwkvKiBhY3RpdmUgKi8KLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsYnNfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXQgPSAwOwotCXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07Ci0JdTggc3NpZF9sZW4gPSAwOwotCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOwotCWludCBpbl9zc2lkX2xlbiA9IGR3cnEtPmxlbmd0aDsKLQlERUNMQVJFX1NTSURfQlVGKHNzaWRfYnVmKTsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKLQotCWlmICghcHJpdi0+cmFkaW9fb24pIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLwotCWlmIChpbl9zc2lkX2xlbiA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKLQkJcmV0ID0gLUUyQklHOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltZW1zZXQoJnNzaWQsIDAsIHNpemVvZihzc2lkKSk7Ci0KLQlpZiAoIWR3cnEtPmZsYWdzIHx8ICFpbl9zc2lkX2xlbikgewotCQkvKiAiYW55IiBTU0lEIHJlcXVlc3RlZDsgbGVhdmUgU1NJRCBibGFuayAqLwotCX0gZWxzZSB7Ci0JCS8qIFNwZWNpZmljIFNTSUQgcmVxdWVzdGVkICovCi0JCW1lbWNweSgmc3NpZCwgZXh0cmEsIGluX3NzaWRfbGVuKTsKLQkJc3NpZF9sZW4gPSBpbl9zc2lkX2xlbjsKLQl9Ci0KLQlpZiAoIXNzaWRfbGVuKSB7Ci0JCWxic19kZWJfd2V4dCgicmVxdWVzdGVkIGFueSBTU0lEXG4iKTsKLQl9IGVsc2UgewotCQlsYnNfZGViX3dleHQoInJlcXVlc3RlZCBTU0lEICclcydcbiIsCi0JCSAgICAgICAgICAgICBwcmludF9zc2lkKHNzaWRfYnVmLCBzc2lkLCBzc2lkX2xlbikpOwotCX0KLQotb3V0OgotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCWlmIChyZXQgPT0gMCkgewotCQkvKiBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KLQkJYXNzb2NfcmVxID0gbGJzX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYpOwotCQlpZiAoIWFzc29jX3JlcSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJfSBlbHNlIHsKLQkJCS8qIENvcHkgdGhlIFNTSUQgdG8gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KLQkJCW1lbWNweSgmYXNzb2NfcmVxLT5zc2lkLCAmc3NpZCwgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JCQlhc3NvY19yZXEtPnNzaWRfbGVuID0gc3NpZF9sZW47Ci0JCQlzZXRfYml0KEFTU09DX0ZMQUdfU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpOwotCQkJbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JCX0KLQl9Ci0KLQkvKiBDYW5jZWwgdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgaWYgdGhlcmUgd2FzIGFuIGVycm9yICovCi0JaWYgKHJldCAhPSAwKSB7Ci0JCWxic19jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIENPTkZJR19MSUJFUlRBU19NRVNICi1zdGF0aWMgaW50IGxic19tZXNoX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwotCi0JbWVtY3B5KGV4dHJhLCBwcml2LT5tZXNoX3NzaWQsIHByaXYtPm1lc2hfc3NpZF9sZW4pOwotCi0JZHdycS0+bGVuZ3RoID0gcHJpdi0+bWVzaF9zc2lkX2xlbjsKLQotCWR3cnEtPmZsYWdzID0gMTsJLyogYWN0aXZlICovCi0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfV0VYVCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGJzX21lc2hfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAoIXByaXYtPnJhZGlvX29uKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgKi8KLQlpZiAoZHdycS0+bGVuZ3RoID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgewotCQlyZXQgPSAtRTJCSUc7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghZHdycS0+ZmxhZ3MgfHwgIWR3cnEtPmxlbmd0aCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgewotCQkvKiBTcGVjaWZpYyBTU0lEIHJlcXVlc3RlZCAqLwotCQltZW1jcHkocHJpdi0+bWVzaF9zc2lkLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKLQkJcHJpdi0+bWVzaF9zc2lkX2xlbiA9IGR3cnEtPmxlbmd0aDsKLQl9Ci0KLQlsYnNfbWVzaF9jb25maWcocHJpdiwgQ01EX0FDVF9NRVNIX0NPTkZJR19TVEFSVCwKLQkJCXByaXYtPmNoYW5uZWwpOwotIG91dDoKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLS8qKgotICogIEBicmllZiBDb25uZWN0IHRvIHRoZSBBUCBvciBBZC1ob2MgTmV0d29yayB3aXRoIHNwZWNpZmljIGJzc2lkCi0gKgotICogIEBwYXJhbSBkZXYgICAgICAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCi0gKiAgQHBhcmFtIGluZm8gICAgICAgICBBIHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvIHN0cnVjdHVyZQotICogIEBwYXJhbSBhd3JxICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3BhcmFtIHN0cnVjdHVyZQotICogIEBwYXJhbSBleHRyYSAgICAgICAgQSBwb2ludGVyIHRvIGV4dHJhIGRhdGEgYnVmCi0gKiAgQHJldHVybiAgICAgICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCBsYnNfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAoIXByaXYtPnJhZGlvX29uKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWxic19kZWJfd2V4dCgiQVNTT0M6IFdBUDogc2FfZGF0YSAlcE1cbiIsIGF3cnEtPnNhX2RhdGEpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7Ci0KLQkvKiBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KLQlhc3NvY19yZXEgPSBsYnNfZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdik7Ci0JaWYgKCFhc3NvY19yZXEpIHsKLQkJbGJzX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHByaXYpOwotCQlyZXQgPSAtRU5PTUVNOwotCX0gZWxzZSB7Ci0JCS8qIENvcHkgdGhlIEJTU0lEIHRvIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0ICovCi0JCW1lbWNweSgmYXNzb2NfcmVxLT5ic3NpZCwgYXdycS0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCQlzZXRfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKTsKLQkJbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBpd2NvbmZpZyBzZXR0YWJsZSBjYWxsYmFja3MKLSAqLwotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgbGJzX2hhbmRsZXJbXSA9IHsKLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV0NPTU1JVCAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X25hbWUsCS8qIFNJT0NHSVdOQU1FICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdOV0lEICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdOV0lEICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfZnJlcSwJLyogU0lPQ1NJV0ZSRVEgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9mcmVxLAkvKiBTSU9DR0lXRlJFUSAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X21vZGUsCS8qIFNJT0NTSVdNT0RFICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfbW9kZSwJLyogU0lPQ0dJV01PREUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1NFTlMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1NFTlMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1JBTkdFICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfcmFuZ2UsCS8qIFNJT0NHSVdSQU5HRSAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUFJJViAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUFJJViAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXU1RBVFMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1NUQVRTICovCi0JaXdfaGFuZGxlcl9zZXRfc3B5LAkvKiBTSU9DU0lXU1BZICovCi0JaXdfaGFuZGxlcl9nZXRfc3B5LAkvKiBTSU9DR0lXU1BZICovCi0JaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkvKiBTSU9DU0lXVEhSU1BZICovCi0JaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAkvKiBTSU9DR0lXVEhSU1BZICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfd2FwLAkvKiBTSU9DU0lXQVAgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF93YXAsCS8qIFNJT0NHSVdBUCAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXTUxNRSAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXQVBMSVNUIC0gZGVwcmVjYXRlZCAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X3NjYW4sCS8qIFNJT0NTSVdTQ0FOICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfc2NhbiwJLyogU0lPQ0dJV1NDQU4gKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9lc3NpZCwJLyogU0lPQ1NJV0VTU0lEICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfZXNzaWQsCS8qIFNJT0NHSVdFU1NJRCAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X25pY2ssCS8qIFNJT0NTSVdOSUNLTiAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X25pY2ssCS8qIFNJT0NHSVdOSUNLTiAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9yYXRlLAkvKiBTSU9DU0lXUkFURSAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X3JhdGUsCS8qIFNJT0NHSVdSQVRFICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfcnRzLAkvKiBTSU9DU0lXUlRTICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfcnRzLAkvKiBTSU9DR0lXUlRTICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfZnJhZywJLyogU0lPQ1NJV0ZSQUcgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9mcmFnLAkvKiBTSU9DR0lXRlJBRyAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X3R4cG93LAkvKiBTSU9DU0lXVFhQT1cgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF90eHBvdywJLyogU0lPQ0dJV1RYUE9XICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfcmV0cnksCS8qIFNJT0NTSVdSRVRSWSAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X3JldHJ5LAkvKiBTSU9DR0lXUkVUUlkgKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9lbmNvZGUsCS8qIFNJT0NTSVdFTkNPREUgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9lbmNvZGUsCS8qIFNJT0NHSVdFTkNPREUgKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9wb3dlciwJLyogU0lPQ1NJV1BPV0VSICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfcG93ZXIsCS8qIFNJT0NHSVdQT1dFUiAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9nZW5pZSwJLyogU0lPQ1NJV0dFTklFICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfZ2VuaWUsCS8qIFNJT0NHSVdHRU5JRSAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X2F1dGgsCS8qIFNJT0NTSVdBVVRIICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfYXV0aCwJLyogU0lPQ0dJV0FVVEggKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9lbmNvZGVleHQsLyogU0lPQ1NJV0VOQ09ERUVYVCAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X2VuY29kZWV4dCwvKiBTSU9DR0lXRU5DT0RFRVhUICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkvKiBTSU9DU0lXUE1LU0EgKi8KLX07Ci1zdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgbGJzX2hhbmRsZXJfZGVmID0gewotCS5udW1fc3RhbmRhcmQJPSBBUlJBWV9TSVpFKGxic19oYW5kbGVyKSwKLQkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBsYnNfaGFuZGxlciwKLQkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gbGJzX2dldF93aXJlbGVzc19zdGF0cywKLX07Ci0KLSNpZmRlZiBDT05GSUdfTElCRVJUQVNfTUVTSAotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgbWVzaF93bGFuX2hhbmRsZXJbXSA9IHsKLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV0NPTU1JVCAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X25hbWUsCS8qIFNJT0NHSVdOQU1FICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdOV0lEICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdOV0lEICovCi0JKGl3X2hhbmRsZXIpIGxic19tZXNoX3NldF9mcmVxLAkvKiBTSU9DU0lXRlJFUSAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X2ZyZXEsCS8qIFNJT0NHSVdGUkVRICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkvKiBTSU9DU0lXTU9ERSAqLwotCShpd19oYW5kbGVyKSBtZXNoX3dsYW5fZ2V0X21vZGUsCS8qIFNJT0NHSVdNT0RFICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdTRU5TICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdTRU5TICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdSQU5HRSAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X3JhbmdlLAkvKiBTSU9DR0lXUkFOR0UgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1BSSVYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1BSSVYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1NUQVRTICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdTVEFUUyAqLwotCWl3X2hhbmRsZXJfc2V0X3NweSwJLyogU0lPQ1NJV1NQWSAqLwotCWl3X2hhbmRsZXJfZ2V0X3NweSwJLyogU0lPQ0dJV1NQWSAqLwotCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJLyogU0lPQ1NJV1RIUlNQWSAqLwotCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJLyogU0lPQ0dJV1RIUlNQWSAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXQVAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV0FQICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdNTE1FICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdBUExJU1QgLSBkZXByZWNhdGVkICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfc2NhbiwJLyogU0lPQ1NJV1NDQU4gKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9zY2FuLAkvKiBTSU9DR0lXU0NBTiAqLwotCShpd19oYW5kbGVyKSBsYnNfbWVzaF9zZXRfZXNzaWQsLyogU0lPQ1NJV0VTU0lEICovCi0JKGl3X2hhbmRsZXIpIGxic19tZXNoX2dldF9lc3NpZCwvKiBTSU9DR0lXRVNTSUQgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCS8qIFNJT0NTSVdOSUNLTiAqLwotCShpd19oYW5kbGVyKSBtZXNoX2dldF9uaWNrLAkvKiBTSU9DR0lXTklDS04gKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfcmF0ZSwJLyogU0lPQ1NJV1JBVEUgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9yYXRlLAkvKiBTSU9DR0lXUkFURSAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X3J0cywJLyogU0lPQ1NJV1JUUyAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X3J0cywJLyogU0lPQ0dJV1JUUyAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X2ZyYWcsCS8qIFNJT0NTSVdGUkFHICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfZnJhZywJLyogU0lPQ0dJV0ZSQUcgKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF90eHBvdywJLyogU0lPQ1NJV1RYUE9XICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfdHhwb3csCS8qIFNJT0NHSVdUWFBPVyAqLwotCShpd19oYW5kbGVyKSBsYnNfc2V0X3JldHJ5LAkvKiBTSU9DU0lXUkVUUlkgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9yZXRyeSwJLyogU0lPQ0dJV1JFVFJZICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfZW5jb2RlLAkvKiBTSU9DU0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIGxic19nZXRfZW5jb2RlLAkvKiBTSU9DR0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfcG93ZXIsCS8qIFNJT0NTSVdQT1dFUiAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X3Bvd2VyLAkvKiBTSU9DR0lXUE9XRVIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfZ2VuaWUsCS8qIFNJT0NTSVdHRU5JRSAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X2dlbmllLAkvKiBTSU9DR0lXR0VOSUUgKi8KLQkoaXdfaGFuZGxlcikgbGJzX3NldF9hdXRoLAkvKiBTSU9DU0lXQVVUSCAqLwotCShpd19oYW5kbGVyKSBsYnNfZ2V0X2F1dGgsCS8qIFNJT0NHSVdBVVRIICovCi0JKGl3X2hhbmRsZXIpIGxic19zZXRfZW5jb2RlZXh0LC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLQkoaXdfaGFuZGxlcikgbGJzX2dldF9lbmNvZGVleHQsLyogU0lPQ0dJV0VOQ09ERUVYVCAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJLyogU0lPQ1NJV1BNS1NBICovCi19OwotCi1zdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgbWVzaF9oYW5kbGVyX2RlZiA9IHsKLQkubnVtX3N0YW5kYXJkCT0gQVJSQVlfU0laRShtZXNoX3dsYW5faGFuZGxlciksCi0JLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgbWVzaF93bGFuX2hhbmRsZXIsCi0JLmdldF93aXJlbGVzc19zdGF0cyA9IGxic19nZXRfd2lyZWxlc3Nfc3RhdHMsCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjE5ZmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqCi0gICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb24gZm9yIElPQ1RMIGNhbGwuCi0gICovCi0jaWZuZGVmCV9MQlNfV0VYVF9IXwotI2RlZmluZQlfTEJTX1dFWFRfSF8KLQotdm9pZCBsYnNfc2VuZF9kaXNjb25uZWN0X25vdGlmaWNhdGlvbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOwotdm9pZCBsYnNfc2VuZF9taWNfZmFpbHVyZWV2ZW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGV2ZW50KTsKLQotc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGJzX2ZpbmRfY2ZwX2J5X2JhbmRfYW5kX2NoYW5uZWwoCi0Jc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCXU4IGJhbmQsCi0JdTE2IGNoYW5uZWwpOwotCi1leHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIGxic19oYW5kbGVyX2RlZjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2lmX3VzYi5jCmluZGV4IGM0NDU1MDAuLmIxNzJmNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2lmX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2lmX3VzYi5jCkBAIC01MzgsNyArNTM4LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCXN5bmNmd2hlYWRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmd3N5bmNoZWFkZXIpLCBHRlBfQVRPTUlDKTsKKwlzeW5jZndoZWFkZXIgPSBrbWVtZHVwKHNrYi0+ZGF0YSwgc2l6ZW9mKHN0cnVjdCBmd3N5bmNoZWFkZXIpLAorCQkJICAgICAgIEdGUF9BVE9NSUMpOwogCWlmICghc3luY2Z3aGVhZGVyKSB7CiAJCWxidGZfZGViX3VzYmQoJmNhcmRwLT51ZGV2LT5kZXYsICJGYWlsdXJlIHRvIGFsbG9jYXRlIHN5bmNmd2hlYWRlclxuIik7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtNTQ2LDggKzU0Nyw2IEBACiAJCXJldHVybjsKIAl9CiAKLQltZW1jcHkoc3luY2Z3aGVhZGVyLCBza2ItPmRhdGEsIHNpemVvZihzdHJ1Y3QgZndzeW5jaGVhZGVyKSk7Ci0KIAlpZiAoIXN5bmNmd2hlYWRlci0+Y21kKSB7CiAJCWxidGZfZGViX3VzYjIoJmNhcmRwLT51ZGV2LT5kZXYsICJGVyByZWNlaXZlZCBCbGsgd2l0aCBjb3JyZWN0IENSQ1xuIik7CiAJCWxidGZfZGViX3VzYjIoJmNhcmRwLT51ZGV2LT5kZXYsICJGVyByZWNlaXZlZCBCbGsgc2VxbnVtID0gJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9saWJlcnRhc190Zi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbGliZXJ0YXNfdGYuaAppbmRleCBmYmJhYWFlLi5hZDc3YjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9saWJlcnRhc190Zi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2xpYmVydGFzX3RmLmgKQEAgLTI1Myw2ICsyNTMsOSBAQAogCXU4IGZ3X3JlYWR5OwogCXU4IHN1cnByaXNlcmVtb3ZlZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGJjX3BzX2J1ZjsKKworCS8qIE1vc3QgcmVjZW50bHkgcmVwb3J0ZWQgbm9pc2UgaW4gZEJtICovCisJczggbm9pc2U7CiB9OwogCiAvKiA4MDIuMTEtcmVsYXRlZCBkZWZpbml0aW9ucyAqLwpAQCAtMzE2LDcgKzMxOSw3IEBACiAJX19sZTE2IHNpemU7CiAJX19sZTE2IHNlcW51bTsKIAlfX2xlMTYgcmVzdWx0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2N0cmxfbm9kZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMzY5LDcgKzM3Miw3IEBACiAKIAkvKkZXL0hXIGNhcGFiaWxpdHkgKi8KIAlfX2xlMzIgZndjYXBpbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sIHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKaW5kZXggODE3ZmZmYy4uOTI3OGIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYwpAQCAtNTI1LDYgKzUyNSwyMiBAQAogCWxidGZfZGViX2xlYXZlKExCVEZfREVCX01BQ09QUyk7CiB9CiAKK3N0YXRpYyBpbnQgbGJ0Zl9vcF9nZXRfc3VydmV5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgaWR4LAorCQkJCXN0cnVjdCBzdXJ2ZXlfaW5mbyAqc3VydmV5KQoreworCXN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CisKKwlpZiAoaWR4ICE9IDApCisJCXJldHVybiAtRU5PRU5UOworCisJc3VydmV5LT5jaGFubmVsID0gY29uZi0+Y2hhbm5lbDsKKwlzdXJ2ZXktPmZpbGxlZCA9IFNVUlZFWV9JTkZPX05PSVNFX0RCTTsKKwlzdXJ2ZXktPm5vaXNlID0gcHJpdi0+bm9pc2U7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIGxidGZfb3BzID0gewogCS50eAkJCT0gbGJ0Zl9vcF90eCwKIAkuc3RhcnQJCQk9IGxidGZfb3Bfc3RhcnQsCkBAIC01MzUsNiArNTUxLDcgQEAKIAkucHJlcGFyZV9tdWx0aWNhc3QJPSBsYnRmX29wX3ByZXBhcmVfbXVsdGljYXN0LAogCS5jb25maWd1cmVfZmlsdGVyCT0gbGJ0Zl9vcF9jb25maWd1cmVfZmlsdGVyLAogCS5ic3NfaW5mb19jaGFuZ2VkCT0gbGJ0Zl9vcF9ic3NfaW5mb19jaGFuZ2VkLAorCS5nZXRfc3VydmV5CQk9IGxidGZfb3BfZ2V0X3N1cnZleSwKIH07CiAKIGludCBsYnRmX3J4KHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC01NTUsNiArNTcyLDcgQEAKIAlzdGF0cy5mcmVxID0gcHJpdi0+Y3VyX2ZyZXE7CiAJc3RhdHMuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CiAJc3RhdHMuc2lnbmFsID0gcHJ4cGQtPnNucjsKKwlwcml2LT5ub2lzZSA9IHByeHBkLT5uZjsKIAkvKiBNYXJ2ZWxsIHJhdGUgaW5kZXggaGFzIGEgaG9sZSBhdCB2YWx1ZSA0ICovCiAJaWYgKHByeHBkLT5yeF9yYXRlID4gNCkKIAkJLS1wcnhwZC0+cnhfcmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCmluZGV4IDZmOGNiM2UuLjAxYWQ3ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwpAQCAtMzE3LDcgKzMxNyw3IEBACiAJdTggcnRfcmF0ZTsKIAlfX2xlMTYgcnRfY2hhbm5lbDsKIAlfX2xlMTYgcnRfY2hiaXRtYXNrOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIHN0YXRpYyBuZXRkZXZfdHhfdCBod3NpbV9tb25feG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNDg2LDggKzQ4Niw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwogCiAJaWYgKGRhdGEtPmlkbGUpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcnlpbmcgdG8gVFggd2hlbiBpZGxlIC0gcmVqZWN0XG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAidHJ5aW5nIHRvIHR4IHdoZW4gaWRsZSAtIHJlamVjdFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTU3Niw3ICs1NzUsNyBAQAogc3RhdGljIGludCBtYWM4MDIxMV9od3NpbV9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgbWFjODAyMTFfaHdzaW1fZGF0YSAqZGF0YSA9IGh3LT5wcml2OwotCXByaW50ayhLRVJOX0RFQlVHICIlczolc1xuIiwgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXyk7CisJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlkYXRhLT5zdGFydGVkID0gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU4NywxNiArNTg2LDE1IEBACiAJc3RydWN0IG1hYzgwMjExX2h3c2ltX2RhdGEgKmRhdGEgPSBody0+cHJpdjsKIAlkYXRhLT5zdGFydGVkID0gMDsKIAlkZWxfdGltZXIoJmRhdGEtPmJlYWNvbl90aW1lcik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzXG4iLCB3aXBoeV9uYW1lKGh3LT53aXBoeSksIF9fZnVuY19fKTsKKwl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICIlc1xuIiwgX19mdW5jX18pOwogfQogCiAKIHN0YXRpYyBpbnQgbWFjODAyMTFfaHdzaW1fYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMgKHR5cGU9JWQgbWFjX2FkZHI9JXBNKVxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXywgdmlmLT50eXBlLAotCSAgICAgICB2aWYtPmFkZHIpOworCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwgIiVzICh0eXBlPSVkIG1hY19hZGRyPSVwTSlcbiIsCisJCSAgICBfX2Z1bmNfXywgdmlmLT50eXBlLCB2aWYtPmFkZHIpOwogCWh3c2ltX3NldF9tYWdpYyh2aWYpOwogCXJldHVybiAwOwogfQpAQCAtNjA1LDkgKzYwMyw4IEBACiBzdGF0aWMgdm9pZCBtYWM4MDIxMV9od3NpbV9yZW1vdmVfaW50ZXJmYWNlKAogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCXByaW50ayhLRVJOX0RFQlVHICIlczolcyAodHlwZT0lZCBtYWNfYWRkcj0lcE0pXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksIF9fZnVuY19fLCB2aWYtPnR5cGUsCi0JICAgICAgIHZpZi0+YWRkcik7CisJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiJXMgKHR5cGU9JWQgbWFjX2FkZHI9JXBNKVxuIiwKKwkJICAgIF9fZnVuY19fLCB2aWYtPnR5cGUsIHZpZi0+YWRkcik7CiAJaHdzaW1fY2hlY2tfbWFnaWModmlmKTsKIAlod3NpbV9jbGVhcl9tYWdpYyh2aWYpOwogfQpAQCAtNjcwLDEzICs2NjcsMTQgQEAKIAkJW0lFRUU4MDIxMV9TTVBTX0RZTkFNSUNdID0gImR5bmFtaWMiLAogCX07CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMgKGZyZXE9JWQvJXMgaWRsZT0lZCBwcz0lZCBzbXBzPSVzKVxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXywKLQkgICAgICAgY29uZi0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXEsCi0JICAgICAgIGh3c2ltX2NoYW50eXBlc1tjb25mLT5jaGFubmVsX3R5cGVdLAotCSAgICAgICAhIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpLAotCSAgICAgICAhIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTKSwKLQkgICAgICAgc21wc19tb2Rlc1tjb25mLT5zbXBzX21vZGVdKTsKKwl3aXBoeV9kZWJ1Zyhody0+d2lwaHksCisJCSAgICAiJXMgKGZyZXE9JWQvJXMgaWRsZT0lZCBwcz0lZCBzbXBzPSVzKVxuIiwKKwkJICAgIF9fZnVuY19fLAorCQkgICAgY29uZi0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXEsCisJCSAgICBod3NpbV9jaGFudHlwZXNbY29uZi0+Y2hhbm5lbF90eXBlXSwKKwkJICAgICEhKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSksCisJCSAgICAhIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTKSwKKwkJICAgIHNtcHNfbW9kZXNbY29uZi0+c21wc19tb2RlXSk7CiAKIAlkYXRhLT5pZGxlID0gISEoY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKTsKIApAQCAtNjk2LDcgKzY5NCw3IEBACiB7CiAJc3RydWN0IG1hYzgwMjExX2h3c2ltX2RhdGEgKmRhdGEgPSBody0+cHJpdjsKIAotCXByaW50ayhLRVJOX0RFQlVHICIlczolc1xuIiwgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXyk7CisJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWRhdGEtPnJ4X2ZpbHRlciA9IDA7CiAJaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykKQEAgLTcxNywyNiArNzE1LDIzIEBACiAKIAlod3NpbV9jaGVja19tYWdpYyh2aWYpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzKGNoYW5nZWQ9MHgleClcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgX19mdW5jX18sIGNoYW5nZWQpOworCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwgIiVzKGNoYW5nZWQ9MHgleClcbiIsIF9fZnVuY19fLCBjaGFuZ2VkKTsKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiBCU1NJRCBjaGFuZ2VkOiAlcE1cbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksIF9fZnVuY19fLAotCQkgICAgICAgaW5mby0+YnNzaWQpOworCQl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICIlczogQlNTSUQgY2hhbmdlZDogJXBNXG4iLAorCQkJICAgIF9fZnVuY19fLCBpbmZvLT5ic3NpZCk7CiAJCW1lbWNweSh2cC0+YnNzaWQsIGluZm8tPmJzc2lkLCBFVEhfQUxFTik7CiAJfQogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9BU1NPQykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAlczogQVNTT0M6IGFzc29jPSVkIGFpZD0lZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgaW5mby0+YXNzb2MsIGluZm8tPmFpZCk7CisJCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwgIiAgQVNTT0M6IGFzc29jPSVkIGFpZD0lZFxuIiwKKwkJCSAgICBpbmZvLT5hc3NvYywgaW5mby0+YWlkKTsKIAkJdnAtPmFzc29jID0gaW5mby0+YXNzb2M7CiAJCXZwLT5haWQgPSBpbmZvLT5haWQ7CiAJfQogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIgICVzOiBCQ05JTlQ6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBpbmZvLT5iZWFjb25faW50KTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBCQ05JTlQ6ICVkXG4iLCBpbmZvLT5iZWFjb25faW50KTsKIAkJZGF0YS0+YmVhY29uX2ludCA9IDEwMjQgKiBpbmZvLT5iZWFjb25faW50IC8gMTAwMCAqIEhaIC8gMTAwMDsKIAkJaWYgKFdBUk5fT04oIWRhdGEtPmJlYWNvbl9pbnQpKQogCQkJZGF0YS0+YmVhY29uX2ludCA9IDE7CkBAIC03NDYsMzEgKzc0MSwyOCBAQAogCX0KIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIgICVzOiBFUlBfQ1RTX1BST1Q6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBpbmZvLT51c2VfY3RzX3Byb3QpOworCQl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICIgIEVSUF9DVFNfUFJPVDogJWRcbiIsCisJCQkgICAgaW5mby0+dXNlX2N0c19wcm90KTsKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAlczogRVJQX1BSRUFNQkxFOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgaW5mby0+dXNlX3Nob3J0X3ByZWFtYmxlKTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBFUlBfUFJFQU1CTEU6ICVkXG4iLAorCQkJICAgIGluZm8tPnVzZV9zaG9ydF9wcmVhbWJsZSk7CiAJfQogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfU0xPVCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAlczogRVJQX1NMT1Q6ICVkXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBpbmZvLT51c2Vfc2hvcnRfc2xvdCk7CisJCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwgIiAgRVJQX1NMT1Q6ICVkXG4iLCBpbmZvLT51c2Vfc2hvcnRfc2xvdCk7CiAJfQogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9IVCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAlczogSFQ6IG9wX21vZGU9MHgleCwgY2hhbnR5cGU9JXNcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksCi0JCSAgICAgICBpbmZvLT5odF9vcGVyYXRpb25fbW9kZSwKLQkJICAgICAgIGh3c2ltX2NoYW50eXBlc1tpbmZvLT5jaGFubmVsX3R5cGVdKTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBIVDogb3BfbW9kZT0weCV4LCBjaGFudHlwZT0lc1xuIiwKKwkJCSAgICBpbmZvLT5odF9vcGVyYXRpb25fbW9kZSwKKwkJCSAgICBod3NpbV9jaGFudHlwZXNbaW5mby0+Y2hhbm5lbF90eXBlXSk7CiAJfQogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAlczogQkFTSUNfUkFURVM6IDB4JWxseFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGluZm8tPmJhc2ljX3JhdGVzKTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBCQVNJQ19SQVRFUzogMHglbGx4XG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGluZm8tPmJhc2ljX3JhdGVzKTsKIAl9CiB9CiAKQEAgLTgyNCwxMCArODE2LDExIEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBxdWV1ZSwKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQogewotCXByaW50ayhLRVJOX0RFQlVHICIlczolcyAocXVldWU9JWQgdHhvcD0lZCBjd19taW49JWQgY3dfbWF4PSVkICIKLQkgICAgICAgImFpZnM9JWQpXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksIF9fZnVuY19fLCBxdWV1ZSwKLQkgICAgICAgcGFyYW1zLT50eG9wLCBwYXJhbXMtPmN3X21pbiwgcGFyYW1zLT5jd19tYXgsIHBhcmFtcy0+YWlmcyk7CisJd2lwaHlfZGVidWcoaHctPndpcGh5LAorCQkgICAgIiVzIChxdWV1ZT0lZCB0eG9wPSVkIGN3X21pbj0lZCBjd19tYXg9JWQgYWlmcz0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywgcXVldWUsCisJCSAgICBwYXJhbXMtPnR4b3AsIHBhcmFtcy0+Y3dfbWluLAorCQkgICAgcGFyYW1zLT5jd19tYXgsIHBhcmFtcy0+YWlmcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgzNyw4ICs4MzAsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKIAotCXByaW50ayhLRVJOX0RFQlVHICIlczolcyAoaWR4PSVkKVxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXywgaWR4KTsKKwl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICIlcyAoaWR4PSVkKVxuIiwgX19mdW5jX18sIGlkeCk7CiAKIAlpZiAoaWR4ICE9IDApCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTEwOCw4ICsxMTAwLDkgQEAKIAlpZiAoIXZwLT5hc3NvYykKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiBzZW5kIFBTLVBvbGwgdG8gJXBNIGZvciBhaWQgJWRcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoZGF0YS0+aHctPndpcGh5KSwgX19mdW5jX18sIHZwLT5ic3NpZCwgdnAtPmFpZCk7CisJd2lwaHlfZGVidWcoZGF0YS0+aHctPndpcGh5LAorCQkgICAgIiVzOiBzZW5kIFBTLVBvbGwgdG8gJXBNIGZvciBhaWQgJWRcbiIsCisJCSAgICBfX2Z1bmNfXywgdnAtPmJzc2lkLCB2cC0+YWlkKTsKIAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCpwc3BvbGwpKTsKIAlpZiAoIXNrYikKQEAgLTExMzcsOCArMTEzMCw5IEBACiAJaWYgKCF2cC0+YXNzb2MpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0RFQlVHICIlczolczogc2VuZCBkYXRhOjpudWxsZnVuYyB0byAlcE0gcHM9JWRcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoZGF0YS0+aHctPndpcGh5KSwgX19mdW5jX18sIHZwLT5ic3NpZCwgcHMpOworCXdpcGh5X2RlYnVnKGRhdGEtPmh3LT53aXBoeSwKKwkJICAgICIlczogc2VuZCBkYXRhOjpudWxsZnVuYyB0byAlcE0gcHM9JWRcbiIsCisJCSAgICBfX2Z1bmNfXywgdnAtPmJzc2lkLCBwcyk7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqaGRyKSk7CiAJaWYgKCFza2IpCkBAIC0xMjkxLDYgKzEyODUsMTEgQEAKIAkJaHctPndpcGh5LT5uX2FkZHJlc3NlcyA9IDI7CiAJCWh3LT53aXBoeS0+YWRkcmVzc2VzID0gZGF0YS0+YWRkcmVzc2VzOwogCisJCWlmIChmYWtlX2h3X3NjYW4pIHsKKwkJCWh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSAyNTU7CisJCQlody0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9IElFRUU4MDIxMV9NQVhfREFUQV9MRU47CisJCX0KKwogCQlody0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDE7CiAJCWh3LT5xdWV1ZXMgPSA0OwogCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CkBAIC0xNDY4LDkgKzE0NjcsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGh3YWRkciAlcE0gcmVnaXN0ZXJlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwKLQkJICAgICAgIGh3LT53aXBoeS0+cGVybV9hZGRyKTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiaHdhZGRyICVwbSByZWdpc3RlcmVkXG4iLAorCQkJICAgIGh3LT53aXBoeS0+cGVybV9hZGRyKTsKIAogCQlkYXRhLT5kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKCJod3NpbSIsCiAJCQkJCQkgICBody0+d2lwaHktPmRlYnVnZnNkaXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKaW5kZXggODA4YWRiOS4uZDc2MWVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCkBAIC04Niw3ICs4Niw3IEBACiAJdm9pZCAoKnJ4ZF9pbml0KSh2b2lkICpyeGQsIGRtYV9hZGRyX3QgbmV4dF9kbWFfYWRkcik7CiAJdm9pZCAoKnJ4ZF9yZWZpbGwpKHZvaWQgKnJ4ZCwgZG1hX2FkZHJfdCBhZGRyLCBpbnQgbGVuKTsKIAlpbnQgKCpyeGRfcHJvY2Vzcykodm9pZCAqcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAotCQkJICAgX19sZTE2ICpxb3MpOworCQkJICAgX19sZTE2ICpxb3MsIHM4ICpub2lzZSk7CiB9OwogCiBzdHJ1Y3QgbXdsOGtfZGV2aWNlX2luZm8gewpAQCAtMTA5LDcgKzEwOSw3IEBACiAJZG1hX2FkZHJfdCByeGRfZG1hOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCURFQ0xBUkVfUENJX1VOTUFQX0FERFIoZG1hKQorCQlERUZJTkVfRE1BX1VOTUFQX0FERFIoZG1hKTsKIAl9ICpidWY7CiB9OwogCkBAIC0yMDcsNiArMjA3LDkgQEAKIAogCS8qIFRhc2tsZXQgdG8gcGVyZm9ybSBSWC4gICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHBvbGxfcnhfdGFzazsKKworCS8qIE1vc3QgcmVjZW50bHkgcmVwb3J0ZWQgbm9pc2UgaW4gZEJtICovCisJczggbm9pc2U7CiB9OwogCiAvKiBQZXIgaW50ZXJmYWNlIHNwZWNpZmljIHByaXZhdGUgZGF0YSAqLwpAQCAtMzE0LDEzICszMTcsMTUgQEAKICNkZWZpbmUgTVdMOEtfQ01EX1NFVF9ORVdfU1ROCQkweDExMTEJCS8qIHBlci12aWYgKi8KICNkZWZpbmUgTVdMOEtfQ01EX1VQREFURV9TVEFEQgkJMHgxMTIzCiAKLXN0YXRpYyBjb25zdCBjaGFyICptd2w4a19jbWRfbmFtZSh1MTYgY21kLCBjaGFyICpidWYsIGludCBidWZzaXplKQorc3RhdGljIGNvbnN0IGNoYXIgKm13bDhrX2NtZF9uYW1lKF9fbGUxNiBjbWQsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpCiB7CisJdTE2IGNvbW1hbmQgPSBsZTE2X3RvX2NwdShjbWQpOworCiAjZGVmaW5lIE1XTDhLX0NNRE5BTUUoeCkJY2FzZSBNV0w4S19DTURfIyN4OiBkbyB7XAogCQkJCQlzbnByaW50ZihidWYsIGJ1ZnNpemUsICIlcyIsICN4KTtcCiAJCQkJCXJldHVybiBidWY7XAogCQkJCQl9IHdoaWxlICgwKQotCXN3aXRjaCAoY21kICYgfjB4ODAwMCkgeworCXN3aXRjaCAoY29tbWFuZCAmIH4weDgwMDApIHsKIAkJTVdMOEtfQ01ETkFNRShDT0RFX0ROTEQpOwogCQlNV0w4S19DTUROQU1FKEdFVF9IV19TUEVDKTsKIAkJTVdMOEtfQ01ETkFNRShTRVRfSFdfU1BFQyk7CkBAIC00MjYsNyArNDMxLDcgQEAKIAlfX3U4CW1hY2lkOwogCV9fbGUxNglyZXN1bHQ7CiAJY2hhcglwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBGaXJtd2FyZSBsb2FkaW5nLgpAQCAtNjMyLDcgKzYzNyw3IEBACiAJX19sZTE2IGZ3bGVuOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyIHdoOwogCWNoYXIgZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBSb3V0aW5lcyB0byBhZGQvcmVtb3ZlIERNQSBoZWFkZXIgZnJvbSBza2IuICAqLwogc3RhdGljIGlubGluZSB2b2lkIG13bDhrX3JlbW92ZV9kbWFfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIF9fbGUxNiBxb3MpCkBAIC03MTEsNyArNzE2LDcgQEAKIAlfX3U4IHJ4X3N0YXR1czsKIAlfX3U4IGNoYW5uZWw7CiAJX191OCByeF9jdHJsOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTVdMOEtfODM2Nl9BUF9SQVRFX0lORk9fTUNTX0ZPUk1BVAkweDgwCiAjZGVmaW5lIE1XTDhLXzgzNjZfQVBfUkFURV9JTkZPXzQwTUhaCQkweDQwCkBAIC03MzksNyArNzQ0LDcgQEAKIAogc3RhdGljIGludAogbXdsOGtfcnhkXzgzNjZfYXBfcHJvY2Vzcyh2b2lkICpfcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAotCQkJICBfX2xlMTYgKnFvcykKKwkJCSAgX19sZTE2ICpxb3MsIHM4ICpub2lzZSkKIHsKIAlzdHJ1Y3QgbXdsOGtfcnhkXzgzNjZfYXAgKnJ4ZCA9IF9yeGQ7CiAKQEAgLTc1MCw2ICs3NTUsNyBAQAogCW1lbXNldChzdGF0dXMsIDAsIHNpemVvZigqc3RhdHVzKSk7CiAKIAlzdGF0dXMtPnNpZ25hbCA9IC1yeGQtPnJzc2k7CisJKm5vaXNlID0gLXJ4ZC0+bm9pc2VfZmxvb3I7CiAKIAlpZiAocnhkLT5yYXRlICYgTVdMOEtfODM2Nl9BUF9SQVRFX0lORk9fTUNTX0ZPUk1BVCkgewogCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19IVDsKQEAgLTgwNiw3ICs4MTIsNyBAQAogCV9fdTggcnhfY3RybDsKIAlfX3U4IHJ4X3N0YXR1czsKIAlfX3U4IHBhZDJbMl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNV0w4S19TVEFfUkFURV9JTkZPX1NIT1JUUFJFCQkweDgwMDAKICNkZWZpbmUgTVdMOEtfU1RBX1JBVEVfSU5GT19BTlRTRUxFQ1QoeCkJKCgoeCkgPj4gMTEpICYgMHgzKQpAQCAtODM3LDcgKzg0Myw3IEBACiAKIHN0YXRpYyBpbnQKIG13bDhrX3J4ZF9zdGFfcHJvY2Vzcyh2b2lkICpfcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAotCQkgICAgICAgX19sZTE2ICpxb3MpCisJCSAgICAgICBfX2xlMTYgKnFvcywgczggKm5vaXNlKQogewogCXN0cnVjdCBtd2w4a19yeGRfc3RhICpyeGQgPSBfcnhkOwogCXUxNiByYXRlX2luZm87CkBAIC04NTEsNiArODU3LDcgQEAKIAltZW1zZXQoc3RhdHVzLCAwLCBzaXplb2YoKnN0YXR1cykpOwogCiAJc3RhdHVzLT5zaWduYWwgPSAtcnhkLT5yc3NpOworCSpub2lzZSA9IC1yeGQtPm5vaXNlX2xldmVsOwogCXN0YXR1cy0+YW50ZW5uYSA9IE1XTDhLX1NUQV9SQVRFX0lORk9fQU5UU0VMRUNUKHJhdGVfaW5mbyk7CiAJc3RhdHVzLT5yYXRlX2lkeCA9IE1XTDhLX1NUQV9SQVRFX0lORk9fUkFURUlEKHJhdGVfaW5mbyk7CiAKQEAgLTkwMywxNiArOTEwLDE0IEBACiAKIAlyeHEtPnJ4ZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemUsICZyeHEtPnJ4ZF9kbWEpOwogCWlmIChyeHEtPnJ4ZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvYyBSWCBkZXNjcmlwdG9yc1xuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgdG8gYWxsb2MgcnggZGVzY3JpcHRvcnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtc2V0KHJ4cS0+cnhkLCAwLCBzaXplKTsKIAogCXJ4cS0+YnVmID0ga21hbGxvYyhNV0w4S19SWF9ERVNDUyAqIHNpemVvZigqcnhxLT5idWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAocnhxLT5idWYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2MgUlggc2tidWZmIGxpc3RcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIHRvIGFsbG9jIHJ4IHNrYnVmZiBsaXN0XG4iKTsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LCBzaXplLCByeHEtPnJ4ZCwgcnhxLT5yeGRfZG1hKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtOTYzLDcgKzk2OCw3IEBACiAJCWlmIChyeHEtPnRhaWwgPT0gTVdMOEtfUlhfREVTQ1MpCiAJCQlyeHEtPnRhaWwgPSAwOwogCQlyeHEtPmJ1ZltyeF0uc2tiID0gc2tiOwotCQlwY2lfdW5tYXBfYWRkcl9zZXQoJnJ4cS0+YnVmW3J4XSwgZG1hLCBhZGRyKTsKKwkJZG1hX3VubWFwX2FkZHJfc2V0KCZyeHEtPmJ1ZltyeF0sIGRtYSwgYWRkcik7CiAKIAkJcnhkID0gcnhxLT5yeGQgKyAocnggKiBwcml2LT5yeGRfb3BzLT5yeGRfc2l6ZSk7CiAJCXByaXYtPnJ4ZF9vcHMtPnJ4ZF9yZWZpbGwocnhkLCBhZGRyLCBNV0w4S19SWF9NQVhTWik7CkBAIC05ODQsOSArOTg5LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTVdMOEtfUlhfREVTQ1M7IGkrKykgewogCQlpZiAocnhxLT5idWZbaV0uc2tiICE9IE5VTEwpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKLQkJCQkJIHBjaV91bm1hcF9hZGRyKCZyeHEtPmJ1ZltpXSwgZG1hKSwKKwkJCQkJIGRtYV91bm1hcF9hZGRyKCZyeHEtPmJ1ZltpXSwgZG1hKSwKIAkJCQkJIE1XTDhLX1JYX01BWFNaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJcGNpX3VubWFwX2FkZHJfc2V0KCZyeHEtPmJ1ZltpXSwgZG1hLCAwKTsKKwkJCWRtYV91bm1hcF9hZGRyX3NldCgmcnhxLT5idWZbaV0sIGRtYSwgMCk7CiAKIAkJCWtmcmVlX3NrYihyeHEtPmJ1ZltpXS5za2IpOwogCQkJcnhxLT5idWZbaV0uc2tiID0gTlVMTDsKQEAgLTEwNTMsMTYgKzEwNTgsMTcgQEAKIAogCQlyeGQgPSByeHEtPnJ4ZCArIChyeHEtPmhlYWQgKiBwcml2LT5yeGRfb3BzLT5yeGRfc2l6ZSk7CiAKLQkJcGt0X2xlbiA9IHByaXYtPnJ4ZF9vcHMtPnJ4ZF9wcm9jZXNzKHJ4ZCwgJnN0YXR1cywgJnFvcyk7CisJCXBrdF9sZW4gPSBwcml2LT5yeGRfb3BzLT5yeGRfcHJvY2VzcyhyeGQsICZzdGF0dXMsICZxb3MsCisJCQkJCQkJJnByaXYtPm5vaXNlKTsKIAkJaWYgKHBrdF9sZW4gPCAwKQogCQkJYnJlYWs7CiAKIAkJcnhxLT5idWZbcnhxLT5oZWFkXS5za2IgPSBOVUxMOwogCiAJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKLQkJCQkgcGNpX3VubWFwX2FkZHIoJnJ4cS0+YnVmW3J4cS0+aGVhZF0sIGRtYSksCisJCQkJIGRtYV91bm1hcF9hZGRyKCZyeHEtPmJ1ZltyeHEtPmhlYWRdLCBkbWEpLAogCQkJCSBNV0w4S19SWF9NQVhTWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJcGNpX3VubWFwX2FkZHJfc2V0KCZyeHEtPmJ1ZltyeHEtPmhlYWRdLCBkbWEsIDApOworCQlkbWFfdW5tYXBfYWRkcl9zZXQoJnJ4cS0+YnVmW3J4cS0+aGVhZF0sIGRtYSwgMCk7CiAKIAkJcnhxLT5oZWFkKys7CiAJCWlmIChyeHEtPmhlYWQgPT0gTVdMOEtfUlhfREVTQ1MpCkBAIC0xMTIwLDcgKzExMjYsNyBAQAogCV9fbGUxNiByYXRlX2luZm87CiAJX191OCBwZWVyX2lkOwogCV9fdTggdHhfZnJhZ19jbnQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNV0w4S19UWF9ERVNDUwkJMTI4CiAKQEAgLTExMzksMTYgKzExNDUsMTQgQEAKIAogCXR4cS0+dHhkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZSwgJnR4cS0+dHhkX2RtYSk7CiAJaWYgKHR4cS0+dHhkID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jIFRYIGRlc2NyaXB0b3JzXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCB0byBhbGxvYyB0eCBkZXNjcmlwdG9yc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQodHhxLT50eGQsIDAsIHNpemUpOwogCiAJdHhxLT5za2IgPSBrbWFsbG9jKE1XTDhLX1RYX0RFU0NTICogc2l6ZW9mKCp0eHEtPnNrYiksIEdGUF9LRVJORUwpOwogCWlmICh0eHEtPnNrYiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvYyBUWCBza2J1ZmYgbGlzdFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgdG8gYWxsb2MgdHggc2tidWZmIGxpc3RcbiIpOwogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemUsIHR4cS0+dHhkLCB0eHEtPnR4ZF9kbWEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMjA0LDExICsxMjA4LDEyIEBACiAJCQkJdW51c2VkKys7CiAJCX0KIAotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0eHFbJWRdIGxlbj0lZCBoZWFkPSVkIHRhaWw9JWQgIgotCQkgICAgICAgImZ3X293bmVkPSVkIGRydl9vd25lZD0lZCB1bnVzZWQ9JWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksIGksCi0JCSAgICAgICB0eHEtPmxlbiwgdHhxLT5oZWFkLCB0eHEtPnRhaWwsCi0JCSAgICAgICBmd19vd25lZCwgZHJ2X293bmVkLCB1bnVzZWQpOworCQl3aXBoeV9lcnIoaHctPndpcGh5LAorCQkJICAidHhxWyVkXSBsZW49JWQgaGVhZD0lZCB0YWlsPSVkICIKKwkJCSAgImZ3X293bmVkPSVkIGRydl9vd25lZD0lZCB1bnVzZWQ9JWRcbiIsCisJCQkgIGksCisJCQkgIHR4cS0+bGVuLCB0eHEtPmhlYWQsIHR4cS0+dGFpbCwKKwkJCSAgZndfb3duZWQsIGRydl9vd25lZCwgdW51c2VkKTsKIAl9CiB9CiAKQEAgLTEyNTIsMjUgKzEyNTcsMjMgQEAKIAkJaWYgKHRpbWVvdXQpIHsKIAkJCVdBUk5fT04ocHJpdi0+cGVuZGluZ190eF9wa3RzKTsKIAkJCWlmIChyZXRyeSkgewotCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHR4IHJpbmdzIGRyYWluZWRcbiIsCi0JCQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCQkJd2lwaHlfbm90aWNlKGh3LT53aXBoeSwgInR4IHJpbmdzIGRyYWluZWRcbiIpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAocHJpdi0+cGVuZGluZ190eF9wa3RzIDwgb2xkY291bnQpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHdhaXRpbmcgZm9yIHR4IHJpbmdzICIKLQkJCSAgICAgICAidG8gZHJhaW4gKCVkIC0+ICVkIHBrdHMpXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgb2xkY291bnQsCi0JCQkgICAgICAgcHJpdi0+cGVuZGluZ190eF9wa3RzKTsKKwkJCXdpcGh5X25vdGljZShody0+d2lwaHksCisJCQkJICAgICAid2FpdGluZyBmb3IgdHggcmluZ3MgdG8gZHJhaW4gKCVkIC0+ICVkIHBrdHMpXG4iLAorCQkJCSAgICAgb2xkY291bnQsIHByaXYtPnBlbmRpbmdfdHhfcGt0cyk7CiAJCQlyZXRyeSA9IDE7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCXByaXYtPnR4X3dhaXQgPSBOVUxMOwogCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHR4IHJpbmdzIHN0dWNrIGZvciAlZCBtc1xuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgTVdMOEtfVFhfV0FJVF9USU1FT1VUX01TKTsKKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgInR4IHJpbmdzIHN0dWNrIGZvciAlZCBtc1xuIiwKKwkJCSAgTVdMOEtfVFhfV0FJVF9USU1FT1VUX01TKTsKIAkJbXdsOGtfZHVtcF90eF9yaW5ncyhodyk7CiAKIAkJcmMgPSAtRVRJTUVET1VUOwpAQCAtMTQyMSw4ICsxNDI0LDggQEAKIAkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAKIAlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHByaXYtPnBkZXYsIGRtYSkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gZG1hIG1hcCBza2IsICIKLQkJICAgICAgICJkcm9wcGluZyBUWCBmcmFtZS5cbiIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwKKwkJCSAgICAiZmFpbGVkIHRvIGRtYSBtYXAgc2tiLCBkcm9wcGluZyBUWCBmcmFtZS5cbiIpOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQpAQCAtMTUzOCw3ICsxNTQxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAwOwogCXU4IGJ1ZlszMl07CiAKLQljbWQtPnJlc3VsdCA9IDB4ZmZmZjsKKwljbWQtPnJlc3VsdCA9IChfX2ZvcmNlIF9fbGUxNikgMHhmZmZmOwogCWRtYV9zaXplID0gbGUxNl90b19jcHUoY21kLT5sZW5ndGgpOwogCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgY21kLCBkbWFfc2l6ZSwKIAkJCQkgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CkBAIC0xNTcwLDEwICsxNTczLDkgQEAKIAkJCQkJUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAogCWlmICghdGltZW91dCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb21tYW5kICVzIHRpbWVvdXQgYWZ0ZXIgJXUgbXNcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksCi0JCSAgICAgICBtd2w4a19jbWRfbmFtZShjbWQtPmNvZGUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLAotCQkgICAgICAgTVdMOEtfQ01EX1RJTUVPVVRfTVMpOworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY29tbWFuZCAlcyB0aW1lb3V0IGFmdGVyICV1IG1zXG4iLAorCQkJICBtd2w4a19jbWRfbmFtZShjbWQtPmNvZGUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLAorCQkJICBNV0w4S19DTURfVElNRU9VVF9NUyk7CiAJCXJjID0gLUVUSU1FRE9VVDsKIAl9IGVsc2UgewogCQlpbnQgbXM7CkBAIC0xNTgyLDE1ICsxNTg0LDE0IEBACiAKIAkJcmMgPSBjbWQtPnJlc3VsdCA/IC1FSU5WQUwgOiAwOwogCQlpZiAocmMpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb21tYW5kICVzIGVycm9yIDB4JXhcbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLAotCQkJICAgICAgIG13bDhrX2NtZF9uYW1lKGNtZC0+Y29kZSwgYnVmLCBzaXplb2YoYnVmKSksCi0JCQkgICAgICAgbGUxNl90b19jcHUoY21kLT5yZXN1bHQpKTsKKwkJCXdpcGh5X2Vycihody0+d2lwaHksICJjb21tYW5kICVzIGVycm9yIDB4JXhcbiIsCisJCQkJICBtd2w4a19jbWRfbmFtZShjbWQtPmNvZGUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLAorCQkJCSAgbGUxNl90b19jcHUoY21kLT5yZXN1bHQpKTsKIAkJZWxzZSBpZiAobXMgPiAyMDAwKQotCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQ29tbWFuZCAlcyB0b29rICVkIG1zXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwKLQkJCSAgICAgICBtd2w4a19jbWRfbmFtZShjbWQtPmNvZGUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLAotCQkJICAgICAgIG1zKTsKKwkJCXdpcGh5X25vdGljZShody0+d2lwaHksICJjb21tYW5kICVzIHRvb2sgJWQgbXNcbiIsCisJCQkJICAgICBtd2w4a19jbWRfbmFtZShjbWQtPmNvZGUsCisJCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSksCisJCQkJICAgICBtcyk7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtMTY2Niw3ICsxNjY3LDcgQEAKIAlfX2xlMzIgY2FwczI7CiAJX19sZTMyIG51bV90eF9kZXNjX3Blcl9xdWV1ZTsKIAlfX2xlMzIgdG90YWxfcnhkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTVdMOEtfQ0FQX01BWF9BTVNEVQkJMHgyMDAwMDAwMAogI2RlZmluZSBNV0w4S19DQVBfR1JFRU5GSUVMRAkJMHgwODAwMDAwMApAQCAtMTgxMCw3ICsxODExLDcgQEAKIAlfX2xlMzIgd2NiYmFzZTE7CiAJX19sZTMyIHdjYmJhc2UyOwogCV9fbGUzMiB3Y2JiYXNlMzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9nZXRfaHdfc3BlY19hcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKQEAgLTE4NDIsMjIgKzE4NDMsMjIgQEAKIAkJcHJpdi0+c3RhX21hY2lkc19zdXBwb3J0ZWQgPSAweDAwMDAwMDAwOwogCiAJCW9mZiA9IGxlMzJfdG9fY3B1KGNtZC0+d2NiYmFzZTApICYgMHhmZmZmOwotCQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIocHJpdi0+dHhxWzBdLnR4ZF9kbWEpLCBwcml2LT5zcmFtICsgb2ZmKTsKKwkJaW93cml0ZTMyKHByaXYtPnR4cVswXS50eGRfZG1hLCBwcml2LT5zcmFtICsgb2ZmKTsKIAogCQlvZmYgPSBsZTMyX3RvX2NwdShjbWQtPnJ4d3JwdHIpICYgMHhmZmZmOwotCQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIocHJpdi0+cnhxWzBdLnJ4ZF9kbWEpLCBwcml2LT5zcmFtICsgb2ZmKTsKKwkJaW93cml0ZTMyKHByaXYtPnJ4cVswXS5yeGRfZG1hLCBwcml2LT5zcmFtICsgb2ZmKTsKIAogCQlvZmYgPSBsZTMyX3RvX2NwdShjbWQtPnJ4cmRwdHIpICYgMHhmZmZmOwotCQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIocHJpdi0+cnhxWzBdLnJ4ZF9kbWEpLCBwcml2LT5zcmFtICsgb2ZmKTsKKwkJaW93cml0ZTMyKHByaXYtPnJ4cVswXS5yeGRfZG1hLCBwcml2LT5zcmFtICsgb2ZmKTsKIAogCQlvZmYgPSBsZTMyX3RvX2NwdShjbWQtPndjYmJhc2UxKSAmIDB4ZmZmZjsKLQkJaW93cml0ZTMyKGNwdV90b19sZTMyKHByaXYtPnR4cVsxXS50eGRfZG1hKSwgcHJpdi0+c3JhbSArIG9mZik7CisJCWlvd3JpdGUzMihwcml2LT50eHFbMV0udHhkX2RtYSwgcHJpdi0+c3JhbSArIG9mZik7CiAKIAkJb2ZmID0gbGUzMl90b19jcHUoY21kLT53Y2JiYXNlMikgJiAweGZmZmY7Ci0JCWlvd3JpdGUzMihjcHVfdG9fbGUzMihwcml2LT50eHFbMl0udHhkX2RtYSksIHByaXYtPnNyYW0gKyBvZmYpOworCQlpb3dyaXRlMzIocHJpdi0+dHhxWzJdLnR4ZF9kbWEsIHByaXYtPnNyYW0gKyBvZmYpOwogCiAJCW9mZiA9IGxlMzJfdG9fY3B1KGNtZC0+d2NiYmFzZTMpICYgMHhmZmZmOwotCQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIocHJpdi0+dHhxWzNdLnR4ZF9kbWEpLCBwcml2LT5zcmFtICsgb2ZmKTsKKwkJaW93cml0ZTMyKHByaXYtPnR4cVszXS50eGRfZG1hLCBwcml2LT5zcmFtICsgb2ZmKTsKIAl9CiAKIAlrZnJlZShjbWQpOwpAQCAtMTg4Myw3ICsxODg0LDcgQEAKIAlfX2xlMzIgZmxhZ3M7CiAJX19sZTMyIG51bV90eF9kZXNjX3Blcl9xdWV1ZTsKIAlfX2xlMzIgdG90YWxfcnhkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19IT1NUX0RFQ1JfTUdNVAkJMHgwMDAwMDA4MAogI2RlZmluZSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RGT1JNX1BST0JFUkVTUAkweDAwMDAwMDIwCkBAIC0xOTg1LDcgKzE5ODYsNyBAQAogc3RydWN0IG13bDhrX2NtZF9nZXRfc3RhdCB7CiAJc3RydWN0IG13bDhrX2NtZF9wa3QgaGVhZGVyOwogCV9fbGUzMiBzdGF0c1s2NF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNV0w4S19TVEFUX0FDS19GQUlMVVJFCTkKICNkZWZpbmUgTVdMOEtfU1RBVF9SVFNfRkFJTFVSRQkxMgpAQCAtMjAyOSw3ICsyMDMwLDcgQEAKIAlfX2xlMTYgYWN0aW9uOwogCV9fbGUxNiBjb250cm9sOwogCV9fbGUxNiByYWRpb19vbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50CiBtd2w4a19jbWRfcmFkaW9fY29udHJvbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBlbmFibGUsIGJvb2wgZm9yY2UpCkBAIC0yMDkyLDcgKzIwOTMsNyBAQAogCV9fbGUxNiBjdXJyZW50X2xldmVsOwogCV9fbGUxNiByZXNlcnZlZDsKIAlfX2xlMTYgcG93ZXJfbGV2ZWxfbGlzdFtNV0w4S19UWF9QT1dFUl9MRVZFTF9UT1RBTF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGludCBtd2w4a19jbWRfcmZfdHhfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBkQm0pCiB7CkBAIC0yMTIxLDcgKzIxMjIsNyBAQAogCXN0cnVjdCBtd2w4a19jbWRfcGt0IGhlYWRlcjsKIAlfX2xlMTYgYW50ZW5uYTsKIAlfX2xlMTYgbW9kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1XTDhLX1JGX0FOVEVOTkFfUlgJCTEKICNkZWZpbmUgTVdMOEtfUkZfQU5URU5OQV9UWAkJMgpAQCAtMjE4Miw3ICsyMTgzLDcgQEAKICAqLwogc3RydWN0IG13bDhrX2NtZF9zZXRfcHJlX3NjYW4gewogCXN0cnVjdCBtd2w4a19jbWRfcGt0IGhlYWRlcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9zZXRfcHJlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CkBAIC0yMjA5LDcgKzIyMTAsNyBAQAogCXN0cnVjdCBtd2w4a19jbWRfcGt0IGhlYWRlcjsKIAlfX2xlMzIgaXNpYnNzOwogCV9fdTggYnNzaWRbRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQKIG13bDhrX2NtZF9zZXRfcG9zdF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBjb25zdCBfX3U4ICptYWMpCkBAIC0yMjQwLDcgKzIyNDEsNyBAQAogCV9fbGUxNiBhY3Rpb247CiAJX191OCBjdXJyZW50X2NoYW5uZWw7CiAJX19sZTMyIGNoYW5uZWxfZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGludCBtd2w4a19jbWRfc2V0X3JmX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKQEAgLTIyOTMsNyArMjI5NCw3IEBACiAJX191OAlic3NpZFtFVEhfQUxFTl07CiAJX19sZTE2CXByb3RlY3Rpb25fbW9kZTsKIAlfX3U4CXN1cHBfcmF0ZXNbMTRdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyB2b2lkIGxlZ2FjeV9yYXRlX21hc2tfdG9fYXJyYXkodTggKnJhdGVzLCB1MzIgbWFzaykKIHsKQEAgLTIzNjQsNyArMjM2NSw3IEBACiAJLyogQml0bWFwIGZvciBzdXBwb3J0ZWQgTUNTIGNvZGVzLiAgKi8KIAlfX3U4CW1jc19zZXRbMTZdOwogCV9fdTgJcmVzZXJ2ZWRbMTZdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQKIG13bDhrX2NtZF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKQEAgLTIzOTcsNyArMjM5OCw3IEBACiAJc3RydWN0IG13bDhrX2NtZF9wa3QgaGVhZGVyOwogCV9fbGUzMiBzbGVlcF9pbnRlcnZhbDsJLyogTnVtYmVyIG9mIGJlYWNvbiBwZXJpb2RzIHRvIHNsZWVwICovCiAJX191OCBiZWFjb25fZGF0YVtNV0w4S19GSl9CRUFDT05fTUFYTEVOXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9maW5hbGl6ZV9qb2luKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB2b2lkICpmcmFtZSwKIAkJCQkgICBpbnQgZnJhbWVsZW4sIGludCBkdGltKQpAQCAtMjQzNiw3ICsyNDM3LDcgQEAKIAlzdHJ1Y3QgbXdsOGtfY21kX3BrdCBoZWFkZXI7CiAJX19sZTE2IGFjdGlvbjsKIAlfX2xlMTYgdGhyZXNob2xkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQKIG13bDhrX2NtZF9zZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IHJ0c190aHJlc2gpCkBAIC0yNDY2LDcgKzI0NjcsNyBAQAogCXN0cnVjdCBtd2w4a19jbWRfcGt0IGhlYWRlcjsKIAlfX2xlMTYgYWN0aW9uOwogCV9fdTggc2hvcnRfc2xvdDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9zZXRfc2xvdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBzaG9ydF9zbG90X3RpbWUpCiB7CkBAIC0yNTI4LDcgKzI1MjksNyBAQAogCQkJX191OCB0eHE7CiAJCX0gc3RhOwogCX07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNV0w4S19TRVRfRURDQV9DVwkweDAxCiAjZGVmaW5lIE1XTDhLX1NFVF9FRENBX1RYT1AJMHgwMgpAQCAtMjU3OSw3ICsyNTgwLDcgQEAKIHN0cnVjdCBtd2w4a19jbWRfc2V0X3dtbV9tb2RlIHsKIAlzdHJ1Y3QgbXdsOGtfY21kX3BrdCBoZWFkZXI7CiAJX19sZTE2IGFjdGlvbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9zZXRfd21tX21vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZW5hYmxlKQogewpAQCAtMjYxMiw3ICsyNjEzLDcgQEAKIAlfX2xlMzIgYWN0aW9uOwogCV9fdTggcnhfYW50ZW5uYV9tYXA7CiAJX191OCB0eF9hbnRlbm5hX21hcDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9taW1vX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgX191OCByeCwgX191OCB0eCkKIHsKQEAgLTI2NTIsNyArMjY1Myw3IEBACiAJX19sZTMyIHJhdGVfdHlwZTsKIAlfX2xlMzIgcmVzZXJ2ZWQxOwogCV9fbGUzMiByZXNlcnZlZDI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNV0w4S19VU0VfQVVUT19SQVRFCTB4MDAwMgogI2RlZmluZSBNV0w4S19VQ0FTVF9SQVRFCTAKQEAgLTI2OTQsNyArMjY5NSw3IEBACiAJdTggbXVsdGljYXN0X3JhdGU7CiAJdTggbXVsdGljYXN0X3JhdGVfdHlwZTsKIAl1OCBtYW5hZ2VtZW50X3JhdGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGludAogbXdsOGtfY21kX3VzZV9maXhlZF9yYXRlX2FwKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgbWNhc3QsIGludCBtZ210KQpAQCAtMjcyNCw3ICsyNzI1LDcgQEAKIHN0cnVjdCBtd2w4a19jbWRfZW5hYmxlX3NuaWZmZXIgewogCXN0cnVjdCBtd2w4a19jbWRfcGt0IGhlYWRlcjsKIAlfX2xlMzIgYWN0aW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbnQgbXdsOGtfY21kX2VuYWJsZV9zbmlmZmVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJsZSkKIHsKQEAgLTI3NTcsNyArMjc1OCw3IEBACiAJCX0gbWJzczsKIAkJX191OCBtYWNfYWRkcltFVEhfQUxFTl07CiAJfTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1XTDhLX01BQ19UWVBFX1BSSU1BUllfQ0xJRU5UCQkwCiAjZGVmaW5lIE1XTDhLX01BQ19UWVBFX1NFQ09OREFSWV9DTElFTlQJCTEKQEAgLTI4MTIsNyArMjgxMyw3IEBACiAJc3RydWN0IG13bDhrX2NtZF9wa3QgaGVhZGVyOwogCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IG1vZGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIGludCBtd2w4a19jbWRfc2V0X3JhdGVhZGFwdF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBfX3UxNiBtb2RlKQogewpAQCAtMjg0MCw3ICsyODQxLDcgQEAKIHN0cnVjdCBtd2w4a19jbWRfYnNzX3N0YXJ0IHsKIAlzdHJ1Y3QgbXdsOGtfY21kX3BrdCBoZWFkZXI7CiAJX19sZTMyIGVuYWJsZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW50IG13bDhrX2NtZF9ic3Nfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgaW50IGVuYWJsZSkKQEAgLTI4ODUsNyArMjg4Niw3IEBACiAJX191OCBhZGRfcW9zX2luZm87CiAJX191OCBpc19xb3Nfc3RhOwogCV9fbGUzMiBmd19zdGFfcHRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTVdMOEtfU1RBX0FDVElPTl9BREQJCTAKICNkZWZpbmUgTVdMOEtfU1RBX0FDVElPTl9SRU1PVkUJCTIKQEAgLTI5NzgsNyArMjk3OSw3IEBACiAJX19sZTE2CWNvbnRyb2wxOwogCV9fbGUxNgljb250cm9sMjsKIAlfX2xlMTYJY29udHJvbDM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHBlZXJfY2FwYWJpbGl0eV9pbmZvIHsKIAkvKiBQZWVyIHR5cGUgLSBBUCB2cy4gU1RBLiAgKi8KQEAgLTMwMDcsNyArMzAwOCw3IEBACiAJX191OAlwYWQyOwogCV9fdTgJc3RhdGlvbl9pZDsKIAlfX2xlMTYJYW1zZHVfZW5hYmxlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXdsOGtfY21kX3VwZGF0ZV9zdGFkYiB7CiAJc3RydWN0IG13bDhrX2NtZF9wa3QgaGVhZGVyOwpAQCAtMzAyMiw3ICszMDIzLDcgQEAKIAogCS8qIFBlZXIgaW5mbyAtIHZhbGlkIGR1cmluZyBhZGQvdXBkYXRlLiAgKi8KIAlzdHJ1Y3QgcGVlcl9jYXBhYmlsaXR5X2luZm8JcGVlcl9pbmZvOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTVdMOEtfU1RBX0RCX01PRElGWV9FTlRSWQkxCiAjZGVmaW5lIE1XTDhLX1NUQV9EQl9ERUxfRU5UUlkJCTIKQEAgLTMwNTIsNyArMzA1Myw3IEBACiAJcC0+cGVlcl90eXBlID0gTVdMOEtfUEVFUl9UWVBFX0FDQ0VTU1BPSU5UOwogCXAtPmJhc2ljX2NhcHMgPSBjcHVfdG9fbGUxNih2aWYtPmJzc19jb25mLmFzc29jX2NhcGFiaWxpdHkpOwogCXAtPmh0X3N1cHBvcnQgPSBzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQ7Ci0JcC0+aHRfY2FwcyA9IHN0YS0+aHRfY2FwLmNhcDsKKwlwLT5odF9jYXBzID0gY3B1X3RvX2xlMTYoc3RhLT5odF9jYXAuY2FwKTsKIAlwLT5leHRlbmRlZF9odF9jYXBzID0gKHN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvciAmIDMpIHwKIAkJKChzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5ICYgNykgPDwgMik7CiAJaWYgKGh3LT5jb25mLmNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKQEAgLTMxOTAsOCArMzE5MSw4IEBACiAJaW50IHJjOwogCiAJaWYgKCFwcml2LT5yYWRpb19vbikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgVFggZnJhbWUgc2luY2UgcmFkaW8gIgotCQkgICAgICAgImRpc2FibGVkXG4iLCB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQl3aXBoeV9kZWJ1Zyhody0+d2lwaHksCisJCQkgICAgImRyb3BwZWQgVFggZnJhbWUgc2luY2UgcmFkaW8gZGlzYWJsZWRcbiIpOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQpAQCAtMzIwOSw4ICszMjEwLDcgQEAKIAlyYyA9IHJlcXVlc3RfaXJxKHByaXYtPnBkZXYtPmlycSwgbXdsOGtfaW50ZXJydXB0LAogCQkJIElSUUZfU0hBUkVELCBNV0w4S19OQU1FLCBodyk7CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBJUlEgaGFuZGxlclxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgdG8gcmVnaXN0ZXIgaXJxIGhhbmRsZXJcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTMyOTcsOSArMzI5Nyw4IEBACiAJICogbW9kZS4gIChTbmlmZmVyIG1vZGUgaXMgb25seSB1c2VkIG9uIFNUQSBmaXJtd2FyZS4pCiAJICovCiAJaWYgKHByaXYtPnNuaWZmZXJfZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5hYmxlIHRvIGNyZWF0ZSBTVEEgIgotCQkgICAgICAgImludGVyZmFjZSBkdWUgdG8gc25pZmZlciBtb2RlIGJlaW5nIGVuYWJsZWRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQl3aXBoeV9pbmZvKGh3LT53aXBoeSwKKwkJCSAgICJ1bmFibGUgdG8gY3JlYXRlIFNUQSBpbnRlcmZhY2UgYmVjYXVzZSBzbmlmZmVyIG1vZGUgaXMgZW5hYmxlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzU4MSw5ICszNTgwLDggQEAKIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPnZpZl9saXN0KSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vdCBlbmFibGluZyBzbmlmZmVyICIKLQkJCSAgICAgICAibW9kZSBiZWNhdXNlIFNUQSBpbnRlcmZhY2UgaXMgYWN0aXZlXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCQl3aXBoeV9pbmZvKGh3LT53aXBoeSwKKwkJCQkgICAibm90IGVuYWJsaW5nIHNuaWZmZXIgbW9kZSBiZWNhdXNlIFNUQSBpbnRlcmZhY2UgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNzYzLDYgKzM3NjEsMjIgQEAKIAlyZXR1cm4gbXdsOGtfY21kX2dldF9zdGF0KGh3LCBzdGF0cyk7CiB9CiAKK3N0YXRpYyBpbnQgbXdsOGtfZ2V0X3N1cnZleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IGlkeCwKKwkJCQlzdHJ1Y3Qgc3VydmV5X2luZm8gKnN1cnZleSkKK3sKKwlzdHJ1Y3QgbXdsOGtfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKworCWlmIChpZHggIT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlzdXJ2ZXktPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOworCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fTk9JU0VfREJNOworCXN1cnZleS0+bm9pc2UgPSBwcml2LT5ub2lzZTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBtd2w4a19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKQEAgLTM3OTQsNiArMzgwOCw3IEBACiAJLnN0YV9yZW1vdmUJCT0gbXdsOGtfc3RhX3JlbW92ZSwKIAkuY29uZl90eAkJPSBtd2w4a19jb25mX3R4LAogCS5nZXRfc3RhdHMJCT0gbXdsOGtfZ2V0X3N0YXRzLAorCS5nZXRfc3VydmV5CQk9IG13bDhrX2dldF9zdXJ2ZXksCiAJLmFtcGR1X2FjdGlvbgkJPSBtd2w4a19hbXBkdV9hY3Rpb24sCiB9OwogCkBAIC0zOTExLDggKzM5MjYsNyBAQAogCiAJcHJpdi0+c3JhbSA9IHBjaV9pb21hcChwZGV2LCAwLCAweDEwMDAwKTsKIAlpZiAocHJpdi0+c3JhbSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBtYXAgZGV2aWNlIFNSQU1cbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY2Fubm90IG1hcCBkZXZpY2Ugc3JhbVxuIik7CiAJCWdvdG8gZXJyX2lvdW5tYXA7CiAJfQogCkBAIC0zOTI0LDggKzM5MzgsNyBAQAogCWlmIChwcml2LT5yZWdzID09IE5VTEwpIHsKIAkJcHJpdi0+cmVncyA9IHBjaV9pb21hcChwZGV2LCAyLCAweDEwMDAwKTsKIAkJaWYgKHByaXYtPnJlZ3MgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKIAkJCWdvdG8gZXJyX2lvdW5tYXA7CiAJCX0KIAl9CkBAIC0zOTM3LDE2ICszOTUwLDE0IEBACiAJLyogQXNrIHVzZXJsYW5kIGhvdHBsdWcgZGFlbW9uIGZvciB0aGUgZGV2aWNlIGZpcm13YXJlICovCiAJcmMgPSBtd2w4a19yZXF1ZXN0X2Zpcm13YXJlKHByaXYpOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGaXJtd2FyZSBmaWxlcyBub3QgZm91bmRcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmlybXdhcmUgZmlsZXMgbm90IGZvdW5kXG4iKTsKIAkJZ290byBlcnJfc3RvcF9maXJtd2FyZTsKIAl9CiAKIAkvKiBMb2FkIGZpcm13YXJlIGludG8gaGFyZHdhcmUgKi8KIAlyYyA9IG13bDhrX2xvYWRfZmlybXdhcmUoaHcpOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3Qgc3RhcnQgZmlybXdhcmVcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY2Fubm90IHN0YXJ0IGZpcm13YXJlXG4iKTsKIAkJZ290byBlcnJfc3RvcF9maXJtd2FyZTsKIAl9CiAKQEAgLTM5NTcsOSArMzk2OCw4IEBACiAJaWYgKHByaXYtPmFwX2Z3KSB7CiAJCXByaXYtPnJ4ZF9vcHMgPSBwcml2LT5kZXZpY2VfaW5mby0+YXBfcnhkX29wczsKIAkJaWYgKHByaXYtPnJ4ZF9vcHMgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRHJpdmVyIGRvZXMgbm90IGhhdmUgQVAgIgotCQkJICAgICAgICJmaXJtd2FyZSBpbWFnZSBzdXBwb3J0IGZvciB0aGlzIGhhcmR3YXJlXG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCQl3aXBoeV9lcnIoaHctPndpcGh5LAorCQkJCSAgIkRyaXZlciBkb2VzIG5vdCBoYXZlIEFQIGZpcm13YXJlIGltYWdlIHN1cHBvcnQgZm9yIHRoaXMgaGFyZHdhcmVcbiIpOwogCQkJZ290byBlcnJfc3RvcF9maXJtd2FyZTsKIAkJfQogCX0gZWxzZSB7CkBAIC00MDM3LDggKzQwNDcsNyBAQAogCXJjID0gcmVxdWVzdF9pcnEocHJpdi0+cGRldi0+aXJxLCBtd2w4a19pbnRlcnJ1cHQsCiAJCQkgSVJRRl9TSEFSRUQsIE1XTDhLX05BTUUsIGh3KTsKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCB0byByZWdpc3RlciBpcnEgaGFuZGxlclxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfcXVldWVzOwogCX0KIApAQCAtNDA1OCw4ICs0MDY3LDcgQEAKIAkJcmMgPSBtd2w4a19jbWRfZ2V0X2h3X3NwZWNfc3RhKGh3KTsKIAl9CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBpbml0aWFsaXNlIGZpcm13YXJlXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImNhbm5vdCBpbml0aWFsaXNlIGZpcm13YXJlXG4iKTsKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCkBAIC00MDczLDE1ICs0MDgxLDE0IEBACiAJLyogVHVybiByYWRpbyBvZmYgKi8KIAlyYyA9IG13bDhrX2NtZF9yYWRpb19kaXNhYmxlKGh3KTsKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGRpc2FibGVcbiIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2Vycihody0+d2lwaHksICJjYW5ub3QgZGlzYWJsZVxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfaXJxOwogCX0KIAogCS8qIENsZWFyIE1BQyBhZGRyZXNzICovCiAJcmMgPSBtd2w4a19jbWRfc2V0X21hY19hZGRyKGh3LCBOVUxMLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIik7CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBjbGVhciBNQUMgYWRkcmVzc1xuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2Vycihody0+d2lwaHksICJjYW5ub3QgY2xlYXIgbWFjIGFkZHJlc3NcbiIpOwogCQlnb3RvIGVycl9mcmVlX2lycTsKIAl9CiAKQEAgLTQwOTEsMTcgKzQwOTgsMTYgQEAKIAogCXJjID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGh3KTsKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlZ2lzdGVyIGRldmljZVxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCXdpcGh5X2Vycihody0+d2lwaHksICJjYW5ub3QgcmVnaXN0ZXIgZGV2aWNlXG4iKTsKIAkJZ290byBlcnJfZnJlZV9xdWV1ZXM7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHYlZCwgJXBNLCAlcyBmaXJtd2FyZSAldS4ldS4ldS4ldVxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBwcml2LT5kZXZpY2VfaW5mby0+cGFydF9uYW1lLAotCSAgICAgICBwcml2LT5od19yZXYsIGh3LT53aXBoeS0+cGVybV9hZGRyLAotCSAgICAgICBwcml2LT5hcF9mdyA/ICJBUCIgOiAiU1RBIiwKLQkgICAgICAgKHByaXYtPmZ3X3JldiA+PiAyNCkgJiAweGZmLCAocHJpdi0+ZndfcmV2ID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChwcml2LT5md19yZXYgPj4gOCkgJiAweGZmLCBwcml2LT5md19yZXYgJiAweGZmKTsKKwl3aXBoeV9pbmZvKGh3LT53aXBoeSwgIiVzIHYlZCwgJXBtLCAlcyBmaXJtd2FyZSAldS4ldS4ldS4ldVxuIiwKKwkJICAgcHJpdi0+ZGV2aWNlX2luZm8tPnBhcnRfbmFtZSwKKwkJICAgcHJpdi0+aHdfcmV2LCBody0+d2lwaHktPnBlcm1fYWRkciwKKwkJICAgcHJpdi0+YXBfZncgPyAiQVAiIDogIlNUQSIsCisJCSAgIChwcml2LT5md19yZXYgPj4gMjQpICYgMHhmZiwgKHByaXYtPmZ3X3JldiA+PiAxNikgJiAweGZmLAorCQkgICAocHJpdi0+ZndfcmV2ID4+IDgpICYgMHhmZiwgcHJpdi0+ZndfcmV2ICYgMHhmZik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9jZmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vY2ZnLmMKaW5kZXggOGM0MTY5Yy4uMDlmYWUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9jZmcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2NmZy5jCkBAIC0xMTcsOSArMTE3LDggQEAKIAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJaWYgKHByaXYtPmJyb2tlbl9tb25pdG9yICYmICFmb3JjZV9tb25pdG9yKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTW9uaXRvciBtb2RlIHN1cHBvcnQgaXMgIgotCQkJICAgICAgICJidWdneSBpbiB0aGlzIGZpcm13YXJlLCBub3QgZW5hYmxpbmdcbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZSh3aXBoeSkpOworCQkJd2lwaHlfd2Fybih3aXBoeSwKKwkJCQkgICAiTW9uaXRvciBtb2RlIHN1cHBvcnQgaXMgYnVnZ3kgaW4gdGhpcyBmaXJtd2FyZSwgbm90IGVuYWJsaW5nXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmMKaW5kZXggM2UxOTQ3ZC4uMjU5ZDc1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuYwpAQCAtNDksNyArNDksNyBAQAogCV9fbGUzMiBwcmlfb2Zmc2V0OyAgICAgIC8qIE9mZnNldCB0byBwcmltYXJ5IHBsdWcgZGF0YSAqLwogCV9fbGUzMiBjb21wYXRfb2Zmc2V0OyAgIC8qIE9mZnNldCB0byBjb21wYXRpYmlsaXR5IGRhdGEqLwogCWNoYXIgc2lnbmF0dXJlWzBdOyAgICAgIC8qIEZXIHNpZ25hdHVyZSBsZW5ndGggaGVhZGVyc2l6ZS0yMCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgdmFyaW91cyBoZWFkZXIgZW50cmllcy4gUmV0dXJuIGEgcG9pbnRlciB0byBhCiAgKiBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSwgb3IgTlVMTCBpZiBldmVyeXRoaW5nIGNoZWNrcyBvdXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXMuaAppbmRleCA5Y2EzNGU3Li5kOWYxOGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzLmgKQEAgLTIwNSw3ICsyMDUsNyBAQAogCXU4IHJldHJ5X2NvdW50OwogCXU4IHR4X3JhdGU7CiAJX19sZTE2IHR4X2NvbnRyb2w7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSEVSTUVTX1RYU1RBVF9SRVRSWUVSUgkJKDB4MDAwMSkKICNkZWZpbmUgSEVSTUVTX1RYU1RBVF9BR0VERVJSCQkoMHgwMDAyKQpAQCAtMjU0LDcgKzI1NCw3IEBACiAJLyogVGhvc2UgbGFzdCBhcmUgcHJvYmFibHkgbm90IGF2YWlsYWJsZSBpbiB2ZXJ5IG9sZCBmaXJtd2FyZXMgKi8KIAlfX2xlMTYgUnhEaXNjYXJkc19XRVBJQ1ZFcnJvcjsKIAlfX2xlMTYgUnhEaXNjYXJkc19XRVBFeGNsdWRlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogR3JhYmJlZCBmcm9tIHdsYW4tbmcgLSBUaGFua3MgTWFyay4uLiAtIEplYW4gSUkKICAqIFRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHNjYW4gaW5xdWlyeSBjb21tYW5kICovCkBAIC0yNzEsNyArMjcxLDcgQEAKIAl1OCByYXRlc1sxMF07CQkvKiBCaXQgcmF0ZSBzdXBwb3J0ZWQgKi8KIAlfX2xlMTYgcHJvYmVyZXNwX3JhdGU7CS8qIERhdGEgcmF0ZSBvZiB0aGUgcmVzcG9uc2UgZnJhbWUgKi8KIAlfX2xlMTYgYXRpbTsJCS8qIEFUSU0gd2luZG93IHRpbWUsIEt1cyAoaG9zdHNjYW4gb25seSkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogU2FtZSBzdHVmZiBmb3IgdGhlIEx1Y2VudC9BZ2VyZSBjYXJkLgogICogVGhhbmtzIHRvIGgxa2FyaSA8aDFrYXJpIEFUIGRhY2hiMGRlbi5jb20+IC0gSmVhbiBJSSAqLwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJLyogYml0czogMC1lc3MsIDEtaWJzcywgNC1wcml2YWN5IFt3ZXBdICovCiAJX19sZTE2IGVzc2lkX2xlbjsJLyogRVNTSUQgbGVuZ3RoICovCiAJdTggZXNzaWRbMzJdOwkJLyogRVNTSUQgb2YgdGhlIG5ldHdvcmsgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogTW91c3RhZmE6IFNjYW4gc3RydWN0dXJlIGZvciBTeW1ib2wgY2FyZHMgKi8KIHN0cnVjdCBzeW1ib2xfc2Nhbl9hcGluZm8gewpAQCAtMzAzLDcgKzMwMyw3IEBACiAJX19sZTE2IGJhc2ljX3JhdGVzOwkvKiBCYXNpYyByYXRlcyBiaXRtYXNrICovCiAJdTggdW5rbm93bjJbNl07CQkvKiBBbHdheXMgRkY6RkY6RkY6RkY6MDA6MDAgKi8KIAl1OCB1bmtub3duM1s4XTsJCS8qIEFsd2F5cyAwLCBhcHBlYXJlZCBpbiBmL3cgMy45MS02OCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB1bmlvbiBoZXJtZXNfc2Nhbl9pbmZvIHsKIAlzdHJ1Y3QgYWdlcmVfc2Nhbl9hcGluZm8JYTsKQEAgLTM0Myw3ICszNDMsNyBAQAogCV9fbGUxNgliZWFjb25faW50ZXJ2YWw7CiAJX19sZTE2CWNhcGFiaWxpdGllczsKIAl1OAlkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX05PVF9DT05ORUNURUQgICAoMHgwMDAwKQogI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQgICAgICAgKDB4MDAwMSkKQEAgLTM1NSw3ICszNTUsNyBAQAogCiBzdHJ1Y3QgaGVybWVzX2xpbmtzdGF0dXMgewogCV9fbGUxNiBsaW5rc3RhdHVzOyAgICAgICAgIC8qIExpbmsgc3RhdHVzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgewogCXUxNiBzdGF0dXMsIHJlc3AwLCByZXNwMSwgcmVzcDI7CkBAIC0zNjUsMTEgKzM2NSwxMSBAQAogc3RydWN0IGhlcm1lc19pZHN0cmluZyB7CiAJX19sZTE2IGxlbjsKIAlfX2xlMTYgdmFsWzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhlcm1lc19tdWx0aWNhc3QgewogCXU4IGFkZHJbSEVSTUVTX01BWF9NVUxUSUNBU1RdW0VUSF9BTEVOXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVGltZW91dHMgKi8KICNkZWZpbmUgSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQgKDEwMDAwKSAvKiBJbiBpdGVyYXRpb25zIG9mIH4xdXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzX2RsZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMKaW5kZXggNmRhODVlNy4uMmIyYjlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMKQEAgLTY1LDEwICs2NSwxMCBAQAogCV9fbGUzMiBhZGRyOwkJLyogYWRhcHRlciBhZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBibG9jayAqLwogCV9fbGUxNiBsZW47CQkvKiBsZW5ndGggb2YgdGhlIGRhdGEgb25seSwgaW4gYnl0ZXMgKi8KIAljaGFyIGRhdGFbMF07CQkvKiBkYXRhIHRvIGJlIHdyaXR0ZW4gKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKLSAqIFBsdWcgRGF0YSBSZWZlcmVuY2VzIGFyZSBsb2NhdGVkIGluIGluIHRoZSBpbWFnZSBhZnRlciB0aGUgbGFzdCBkYXRhCisgKiBQbHVnIERhdGEgUmVmZXJlbmNlcyBhcmUgbG9jYXRlZCBpbiB0aGUgaW1hZ2UgYWZ0ZXIgdGhlIGxhc3QgZGF0YQogICogYmxvY2suICBUaGV5IHJlZmVyIHRvIGFyZWFzIGluIHRoZSBhZGFwdGVyIG1lbW9yeSB3aGVyZSB0aGUgcGx1ZyBkYXRhCiAgKiBpdGVtcyB3aXRoIG1hdGNoaW5nIElEIHNob3VsZCBiZSB3cml0dGVuLgogICovCkBAIC03Nyw3ICs3Nyw3IEBACiAJX19sZTMyIGFkZHI7CQkvKiBhZGFwdGVyIGFkZHJlc3Mgd2hlcmUgdG8gd3JpdGUgdGhlIGRhdGEgKi8KIAlfX2xlMzIgbGVuOwkJLyogZXhwZWN0ZWQgbGVuZ3RoIG9mIHRoZSBkYXRhLCBpbiBieXRlcyAqLwogCWNoYXIgbmV4dFswXTsJCS8qIG5leHQgUERSIHN0YXJ0cyBoZXJlICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBQbHVnIERhdGEgSXRlbXMgYXJlIGxvY2F0ZWQgaW4gdGhlIEVFUFJPTSByZWFkIGZyb20gdGhlIGFkYXB0ZXIgYnkKQEAgLTg4LDcgKzg4LDcgQEAKIAlfX2xlMTYgbGVuOwkJLyogbGVuZ3RoIG9mIElEIGFuZCBkYXRhLCBpbiB3b3JkcyAqLwogCV9fbGUxNiBpZDsJCS8qIHJlY29yZCBJRCAqLwogCWNoYXIgZGF0YVswXTsJCS8qIHBsdWcgZGF0YSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioqIEZXIGRhdGEgYmxvY2sgYWNjZXNzIGZ1bmN0aW9ucyAqKiovCiAKQEAgLTMxNyw3ICszMTcsNyBAQAogCV9fbGUxNiBsZW47CQkJCQkJCVwKIAlfX2xlMTYgaWQ7CQkJCQkJCVwKIAl1OCB2YWxbbGVuZ3RoXTsJCQkJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGVmYXVsdF9wZHJfZGF0YV8jI3BpZCA9IHsJCQlcCit9IF9fcGFja2VkIGRlZmF1bHRfcGRyX2RhdGFfIyNwaWQgPSB7CQkJXAogCWNwdV90b19sZTE2KChzaXplb2YoZGVmYXVsdF9wZHJfZGF0YV8jI3BpZCkvCQkJXAogCQkJCXNpemVvZihfX2xlMTYpKSAtIDEpLAkJCVwKIAljcHVfdG9fbGUxNihwaWQpLAkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuYwppbmRleCA2ZmJkNzg4Li4wNzdiYWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5jCkBAIC00NSw3ICs0NSw3IEBACiAvKiBGaXJtd2FyZSB2ZXJzaW9uIGVuY29kaW5nICovCiBzdHJ1Y3QgY29tcF9pZCB7CiAJdTE2IGlkLCB2YXJpYW50LCBtYWpvciwgbWlub3I7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyBpbmxpbmUgZnd0eXBlX3QgZGV0ZXJtaW5lX2Zpcm13YXJlX3R5cGUoc3RydWN0IGNvbXBfaWQgKm5pY19pZCkKIHsKQEAgLTk5NSw3ICs5OTUsNyBAQAogCQl1OCB0eF9taWNbTUlDX0tFWUxFTl07CiAJCXU4IHJ4X21pY1tNSUNfS0VZTEVOXTsKIAkJdTggdHNjW09SSU5PQ09fU0VRX0xFTl07Ci0JfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYnVmOworCX0gX19wYWNrZWQgYnVmOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKIAlpbnQgcmV0OwogCWludCBlcnI7CkBAIC0xMzI2LDcgKzEzMjYsNyBAQAogCXN0cnVjdCB7CiAJCXU4IGFkZHJbRVRIX0FMRU5dOwogCQlfX2xlMTYgcmVhc29uX2NvZGU7Ci0JfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYnVmOworCX0gX19wYWNrZWQgYnVmOwogCiAJLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IFdQQSBlbmFibGVkIEFnZXJlIGZ3ICovCiAJaWYgKCFwcml2LT5oYXNfd3BhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL21haW4uYwppbmRleCBjYTcxZjA4Li5lOGUyZDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL21haW4uYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJX19sZTE2IGZyYW1lX2N0bDsKIAlfX2xlMTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcjFbRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBSeCBmcmFtZSBoZWFkZXIgZXhjZXB0IGNvbXBhdGliaWxpdHkgODAyLjMgaGVhZGVyICovCiBzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgewpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIAkvKiBEYXRhIGxlbmd0aCAqLwogCV9fbGUxNiBkYXRhX2xlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9yaW5vY29fcnhfZGF0YSB7CiAJc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yICpkZXNjOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCXN0cnVjdCBoZWFkZXJfc3RydWN0IHsKIAkJCXN0cnVjdCBldGhoZHIgZXRoOwkvKiA4MDIuMyBoZWFkZXIgKi8KIAkJCXU4IGVuY2FwWzZdOwkJLyogODAyLjIgaGVhZGVyICovCi0JCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGhkcjsKKwkJfSBfX3BhY2tlZCBoZHI7CiAJCWludCBsZW4gPSBza2ItPmxlbiArIHNpemVvZihlbmNhcHNfaGRyKSAtICgyICogRVRIX0FMRU4pOwogCiAJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IEVOQ0FQU19PVkVSSEVBRCkgewpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAlzdHJ1Y3Qgam9pbl9yZXEgewogCQl1OCBic3NpZFtFVEhfQUxFTl07CiAJCV9fbGUxNiBjaGFubmVsOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHJlcTsKKwl9IF9fcGFja2VkIHJlcTsKIAljb25zdCBpbnQgYXRvbV9sZW4gPSBvZmZzZXRvZihzdHJ1Y3QgcHJpc20yX3NjYW5fYXBpbmZvLCBhdGltKTsKIAlzdHJ1Y3QgcHJpc20yX3NjYW5fYXBpbmZvICphdG9tID0gTlVMTDsKIAlpbnQgb2Zmc2V0ID0gNDsKQEAgLTE0MTAsNyArMTQxMCw3IEBACiAJc3RydWN0IHsKIAkJX19sZTE2IGxlbjsKIAkJX19sZTE2IHR5cGU7Ci0JfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW5mbzsKKwl9IF9fcGFja2VkIGluZm87CiAJaW50IGxlbiwgdHlwZTsKIAlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY28uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5oCmluZGV4IGE2ZGE4NmUuLjI1NTcxMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5oCkBAIC0zMiw3ICszMiw3IEBACiBzdHJ1Y3Qgb3Jpbm9jb19rZXkgewogCV9fbGUxNiBsZW47CS8qIGFsd2F5cyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAqLwogCWNoYXIgZGF0YVtPUklOT0NPX01BWF9LRVlfU0laRV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgVEtJUF9LRVlMRU4JMTYKICNkZWZpbmUgTUlDX0tFWUxFTgk4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jCmluZGV4IGIxNmQ1ZGIuLmVmNDZhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTE5MiwyNSArMTkxLDIzIEBACiAJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CiAKIAkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IDA7CiAJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CiAJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87Ci0JCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJcF9kZXYtPmlvX2xpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgJj0gfklPX0RBVEFfUEFUSF9XSURUSDsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PQorCQkJcGNtY2lhX2lvX2NmZ19kYXRhX3dpZHRoKGlvLT5mbGFncyk7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gaW8tPndpblswXS5sZW47CiAJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMiA9IHBfZGV2LT5pby5BdHRyaWJ1dGVzMTsKLQkJCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQlwX2Rldi0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmZsYWdzID0gcF9kZXYtPnJlc291cmNlWzBdLT5mbGFnczsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+c3RhcnQgPSBpby0+d2luWzFdLmJhc2U7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IGlvLT53aW5bMV0ubGVuOwogCQl9CiAKIAkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSAhPSAwKQorCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpICE9IDApCiAJCQlnb3RvIG5leHRfZW50cnk7CiAJfQogCXJldHVybiAwOwpAQCAtMjU4LDcgKzI1NSw4IEBACiAJLyogV2UgaW5pdGlhbGl6ZSB0aGUgaGVybWVzIHN0cnVjdHVyZSBiZWZvcmUgY29tcGxldGluZyBQQ01DSUEKIAkgKiBjb25maWd1cmF0aW9uIGp1c3QgaW4gY2FzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0cwogCSAqIGNhbGxlZC4gKi8KLQltZW0gPSBpb3BvcnRfbWFwKGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uTnVtUG9ydHMxKTsKKwltZW0gPSBpb3BvcnRfbWFwKGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwKKwkJCXJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMF0pKTsKIAlpZiAoIW1lbSkKIAkJZ290byBmYWlsZWQ7CiAKQEAgLTI4MCw3ICsyNzgsNyBAQAogCX0KIAogCS8qIFJlZ2lzdGVyIGFuIGludGVyZmFjZSB3aXRoIHRoZSBzdGFjayAqLwotCWlmIChvcmlub2NvX2lmX2FkZChwcml2LCBsaW5rLT5pby5CYXNlUG9ydDEsCisJaWYgKG9yaW5vY29faWZfYWRkKHByaXYsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwKIAkJCSAgIGxpbmstPmlycSwgTlVMTCkgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJvcmlub2NvX2lmX2FkZCgpIGZhaWxlZFxuIik7CiAJCWdvdG8gZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3VzYi5jCmluZGV4IDc4ZjA4OWIuLmEzOGE3YmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3VzYi5jCkBAIC05MCw3ICs5MCw3IEBACiAJLyogU05BUCAqLwogCXU4IG91aVszXTsKIAlfX2JlMTYgZXRoZXJ0eXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgZXpfdXNiX2Z3IHsKIAl1MTYgc2l6ZTsKQEAgLTIyMiw3ICsyMjIsNyBAQAogCV9fbGUxNiBoZXJtZXNfbGVuOwogCV9fbGUxNiBoZXJtZXNfcmlkOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIG9yIG1heSB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBlenVzYl90YWJsZVtdID0gewpAQCAtMzU2LDEyICszNTYsMTAgQEAKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9jb250ZXh0ICpjdHg7CiAKLQljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0FUT01JQyk7CisJY3R4ID0ga3phbGxvYyhzaXplb2YoKmN0eCksIEdGUF9BVE9NSUMpOwogCWlmICghY3R4KQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7Ci0KIAljdHgtPmJ1ZiA9IGttYWxsb2MoQlVMS19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjdHgtPmJ1ZikgewogCQlrZnJlZShjdHgpOwpAQCAtMTUwNCwxNiArMTUwMiwxNiBAQAogCSAgICBlenVzYl9jdHhfY29tcGxldGUobGlzdF9lbnRyeShpdGVtLAogCQkJCQkgIHN0cnVjdCByZXF1ZXN0X2NvbnRleHQsIGxpc3QpKTsKIAotCWlmICh1cHJpdi0+cmVhZF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJaWYgKHVwcml2LT5yZWFkX3VyYiAmJiB1cHJpdi0+cmVhZF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlNvbWUgVVJCIGluIHByb2dyZXNzXG4iKTsKIAogCW11dGV4X3VubG9jaygmdXByaXYtPm10eCk7CiAKLQlrZnJlZSh1cHJpdi0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JaWYgKHVwcml2LT5iYXBfYnVmICE9IE5VTEwpCi0JCWtmcmVlKHVwcml2LT5iYXBfYnVmKTsKLQlpZiAodXByaXYtPnJlYWRfdXJiICE9IE5VTEwpCisJaWYgKHVwcml2LT5yZWFkX3VyYikgeworCQlrZnJlZSh1cHJpdi0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAJCXVzYl9mcmVlX3VyYih1cHJpdi0+cmVhZF91cmIpOworCX0KKwlrZnJlZSh1cHJpdi0+YmFwX2J1Zik7CiAJaWYgKHVwcml2LT5kZXYpIHsKIAkJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5kZXZfcHJpdih1cHJpdi0+ZGV2KTsKIAkJb3Jpbm9jb19pZl9kZWwocHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NwZWN0cnVtX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NwZWN0cnVtX2NzLmMKaW5kZXggYjUxYTlhZC4uODczODc3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9zcGVjdHJ1bV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vc3BlY3RydW1fY3MuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC04MCwzNSArNzksMjcgQEAKIHNwZWN0cnVtX3Jlc2V0KHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rLCBpbnQgaWRsZSkKIHsKIAlpbnQgcmV0OwotCWNvbmZfcmVnX3QgcmVnOwotCXVfaW50IHNhdmVfY29yOworCXU4IHNhdmVfY29yOworCXU4IGNjc3I7CiAKIAkvKiBEb2luZyBpdCBpZiBoYXJkd2FyZSBpcyBnb25lIGlzIGd1YXJhbnRlZWQgY3Jhc2ggKi8KIAlpZiAoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBTYXZlIG9yaWdpbmFsIENPUiB2YWx1ZSAqLwotCXJlZy5GdW5jdGlvbiA9IDA7Ci0JcmVnLkFjdGlvbiA9IENTX1JFQUQ7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0JcmV0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmssICZyZWcpOworCXJldCA9IHBjbWNpYV9yZWFkX2NvbmZpZ19ieXRlKGxpbmssIENJU1JFR19DT1IsICZzYXZlX2Nvcik7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7Ci0Jc2F2ZV9jb3IgPSByZWcuVmFsdWU7CiAKIAkvKiBTb2Z0LVJlc2V0IGNhcmQgKi8KLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0JcmVnLlZhbHVlID0gKHNhdmVfY29yIHwgQ09SX1NPRlRfUkVTRVQpOwotCXJldCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLCAmcmVnKTsKKwlyZXQgPSBwY21jaWFfd3JpdGVfY29uZmlnX2J5dGUobGluaywgQ0lTUkVHX0NPUiwKKwkJCQkoc2F2ZV9jb3IgfCBDT1JfU09GVF9SRVNFVCkpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCXVkZWxheSgxMDAwKTsKIAogCS8qIFJlYWQgQ0NTUiAqLwotCXJlZy5BY3Rpb24gPSBDU19SRUFEOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ0NTUjsKLQlyZXQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluaywgJnJlZyk7CisJcmV0ID0gcGNtY2lhX3JlYWRfY29uZmlnX2J5dGUobGluaywgQ0lTUkVHX0NDU1IsICZjY3NyKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIApAQCAtMTE2LDE5ICsxMDcsMTUgQEAKIAkgKiBTdGFydCBvciBzdG9wIHRoZSBmaXJtd2FyZS4gIE1lbW9yeSB3aWR0aCBiaXQgc2hvdWxkIGJlCiAJICogcHJlc2VydmVkIGZyb20gdGhlIHZhbHVlIHdlJ3ZlIGp1c3QgcmVhZC4KIAkgKi8KLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DQ1NSOwotCXJlZy5WYWx1ZSA9IChpZGxlID8gSENSX0lETEUgOiBIQ1JfUlVOKSB8IChyZWcuVmFsdWUgJiBIQ1JfTUVNMTYpOwotCXJldCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLCAmcmVnKTsKKwljY3NyID0gKGlkbGUgPyBIQ1JfSURMRSA6IEhDUl9SVU4pIHwgKGNjc3IgJiBIQ1JfTUVNMTYpOworCXJldCA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShsaW5rLCBDSVNSRUdfQ0NTUiwgY2Nzcik7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7CiAJdWRlbGF5KDEwMDApOwogCiAJLyogUmVzdG9yZSBvcmlnaW5hbCBDT1IgY29uZmlndXJhdGlvbiBpbmRleCAqLwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLQlyZWcuVmFsdWUgPSAoc2F2ZV9jb3IgJiB+Q09SX1NPRlRfUkVTRVQpOwotCXJldCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLCAmcmVnKTsKKwlyZXQgPSBwY21jaWFfd3JpdGVfY29uZmlnX2J5dGUobGluaywgQ0lTUkVHX0NPUiwKKwkJCQkoc2F2ZV9jb3IgJiB+Q09SX1NPRlRfUkVTRVQpKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIAl1ZGVsYXkoMTAwMCk7CkBAIC0yNjYsMjUgKzI1MywyMyBAQAogCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwogCiAJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAwOwogCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgewogCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOwotCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCXBfZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0KKwkJCXBjbWNpYV9pb19jZmdfZGF0YV93aWR0aChpby0+ZmxhZ3MpOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOwogCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5mbGFncyA9IHBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3M7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSBpby0+d2luWzFdLmxlbjsKIAkJfQogCiAJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSAhPSAwKQogCQkJZ290byBuZXh0X2VudHJ5OwogCX0KIAlyZXR1cm4gMDsKQEAgLTMzMiw3ICszMTcsOCBAQAogCS8qIFdlIGluaXRpYWxpemUgdGhlIGhlcm1lcyBzdHJ1Y3R1cmUgYmVmb3JlIGNvbXBsZXRpbmcgUENNQ0lBCiAJICogY29uZmlndXJhdGlvbiBqdXN0IGluIGNhc2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMKIAkgKiBjYWxsZWQuICovCi0JbWVtID0gaW9wb3J0X21hcChsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlvLk51bVBvcnRzMSk7CisJbWVtID0gaW9wb3J0X21hcChsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQsCisJCQlyZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzBdKSk7CiAJaWYgKCFtZW0pCiAJCWdvdG8gZmFpbGVkOwogCkBAIC0zNTksNyArMzQ1LDcgQEAKIAl9CiAKIAkvKiBSZWdpc3RlciBhbiBpbnRlcmZhY2Ugd2l0aCB0aGUgc3RhY2sgKi8KLQlpZiAob3Jpbm9jb19pZl9hZGQocHJpdiwgbGluay0+aW8uQmFzZVBvcnQxLAorCWlmIChvcmlub2NvX2lmX2FkZChwcml2LCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQsCiAJCQkgICBsaW5rLT5pcnEsIE5VTEwpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAib3Jpbm9jb19pZl9hZGQoKSBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vd2V4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby93ZXh0LmMKaW5kZXggNTc3NTEyNC4uY2Y3YmUxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby93ZXh0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby93ZXh0LmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCB7CiAJCQlfX2xlMTYgcXVhbCwgc2lnbmFsLCBub2lzZSwgdW51c2VkOwotCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBjcTsKKwkJfSBfX3BhY2tlZCBjcTsKIAogCQllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLAogCQkJCQkgSEVSTUVTX1JJRF9DT01NU1FVQUxJVFksICZjcSk7CkBAIC05OTMsMTEgKzk5Myw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHdycXUtPmRhdGEubGVuZ3RoKSB7Ci0JCWJ1ZiA9IGttYWxsb2Mod3JxdS0+ZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQlidWYgPSBrbWVtZHVwKGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChidWYgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCW1lbWNweShidWYsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CiAJfSBlbHNlCiAJCWJ1ZiA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9lZXByb20uYwppbmRleCAxODdlMjYzLi5kNjg3Y2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2VlcHJvbS5jCkBAIC0xNDksMTYgKzE0OSwxNSBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKGxpc3QtPmNoYW5uZWxzW2ldLmRhdGEgIT0gQ0hBTl9IQVNfQUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiVzJXMlcyBpcy9hcmUgbWlzc2luZyBmb3IgIgotCQkJCQkiY2hhbm5lbDolZCBbJWQgTUh6XS5cbiIsCi0JCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwKLQkJCSAgICAgICAobGlzdC0+Y2hhbm5lbHNbaV0uZGF0YSAmIENIQU5fSEFTX0NBTCA/ICIiIDoKLQkJCQkiIFtpcWF1dG8gY2FsaWJyYXRpb24gZGF0YV0iKSwKLQkJCSAgICAgICAobGlzdC0+Y2hhbm5lbHNbaV0uZGF0YSAmIENIQU5fSEFTX0xJTUlUID8gIiIgOgotCQkJCSIgW291dHB1dCBwb3dlciBsaW1pdHNdIiksCi0JCQkgICAgICAgKGxpc3QtPmNoYW5uZWxzW2ldLmRhdGEgJiBDSEFOX0hBU19DVVJWRSA/ICIiIDoKLQkJCQkiIFtjdXJ2ZSBkYXRhXSIpLAotCQkJICAgICAgIGxpc3QtPmNoYW5uZWxzW2ldLmluZGV4LCBsaXN0LT5jaGFubmVsc1tpXS5mcmVxKTsKKwkJCXdpcGh5X2VycihkZXYtPndpcGh5LAorCQkJCSAgIiVzJXMlcyBpcy9hcmUgbWlzc2luZyBmb3IgY2hhbm5lbDolZCBbJWQgTUh6XS5cbiIsCisJCQkJICAobGlzdC0+Y2hhbm5lbHNbaV0uZGF0YSAmIENIQU5fSEFTX0NBTCA/ICIiIDoKKwkJCQkgICAiIFtpcWF1dG8gY2FsaWJyYXRpb24gZGF0YV0iKSwKKwkJCQkgIChsaXN0LT5jaGFubmVsc1tpXS5kYXRhICYgQ0hBTl9IQVNfTElNSVQgPyAiIiA6CisJCQkJICAgIiBbb3V0cHV0IHBvd2VyIGxpbWl0c10iKSwKKwkJCQkgIChsaXN0LT5jaGFubmVsc1tpXS5kYXRhICYgQ0hBTl9IQVNfQ1VSVkUgPyAiIiA6CisJCQkJICAgIiBbY3VydmUgZGF0YV0iKSwKKwkJCQkgIGxpc3QtPmNoYW5uZWxzW2ldLmluZGV4LCBsaXN0LT5jaGFubmVsc1tpXS5mcmVxKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTE2OCw5ICsxNjcsOCBAQAogCX0KIAogCWlmIChqID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRGlzYWJsaW5nIHRvdGFsbHkgZGFtYWdlZCAlcyBiYW5kLlxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8KLQkJICAgICAgICIyIEdIeiIgOiAiNSBHSHoiKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJkaXNhYmxpbmcgdG90YWxseSBkYW1hZ2VkICVkIEdIeiBiYW5kXG4iLAorCQkJICAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSA/IDIgOiA1KTsKIAogCQlyZXQgPSAtRU5PREFUQTsKIAkJZ290byBlcnJfb3V0OwpAQCAtMjQ0LDkgKzI0Miw5IEBACiAKIAlpZiAoKHByaXYtPmlxX2F1dG9jYWxfbGVuICE9IHByaXYtPmN1cnZlX2RhdGEtPmVudHJpZXMpIHx8CiAJICAgIChwcml2LT5pcV9hdXRvY2FsX2xlbiAhPSBwcml2LT5vdXRwdXRfbGltaXQtPmVudHJpZXMpKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbnN1cHBvcnRlZCBvciBkYW1hZ2VkIEVFUFJPTSBkZXRlY3RlZC4gIgotCQkJCSJZb3UgbWF5IG5vdCBiZSBhYmxlIHRvIHVzZSBhbGwgY2hhbm5lbHMuXG4iLAotCQkJCXdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQl3aXBoeV9lcnIoZGV2LT53aXBoeSwKKwkJCSAgIlVuc3VwcG9ydGVkIG9yIGRhbWFnZWQgRUVQUk9NIGRldGVjdGVkLiAiCisJCQkgICJZb3UgbWF5IG5vdCBiZSBhYmxlIHRvIHVzZSBhbGwgY2hhbm5lbHMuXG4iKTsKIAogCW1heF9jaGFubmVsX251bSA9IG1heF90KHVuc2lnbmVkIGludCwgcHJpdi0+b3V0cHV0X2xpbWl0LT5lbnRyaWVzLAogCQkJCXByaXYtPmlxX2F1dG9jYWxfbGVuKTsKQEAgLTQxOSwxNSArNDE3LDE0IEBACiAJaW50IGk7CiAKIAlpZiAobGVuICE9IChlbnRyeV9zaXplICogbnVtX2VudHJpZXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVua25vd24gcnNzaSBjYWxpYnJhdGlvbiBkYXRhIHBhY2tpbmcgIgotCQkJCSAiIHR5cGU6KCV4KSBsZW46JWQuXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwgdHlwZSwgbGVuKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksCisJCQkgICJ1bmtub3duIHJzc2kgY2FsaWJyYXRpb24gZGF0YSBwYWNraW5nIHR5cGU6KCV4KSBsZW46JWQuXG4iLAorCQkJICB0eXBlLCBsZW4pOwogCiAJCXByaW50X2hleF9kdW1wX2J5dGVzKCJyc3NpY2FsOiIsIERVTVBfUFJFRklYX05PTkUsCiAJCQkJICAgICBkYXRhLCBsZW4pOwogCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSByZXBvcnQgdGhpcyBpc3N1ZS5cbiIsCi0JCQl3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJwbGVhc2UgcmVwb3J0IHRoaXMgaXNzdWUuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDQ1LDE1ICs0NDIsMTQgQEAKIAlzdHJ1Y3QgcGRhX2NvdW50cnkgKmNvdW50cnk7CiAKIAlpZiAobGVuICE9IHNpemVvZigqY291bnRyeSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZm91bmQgcG9zc2libGUgaW52YWxpZCBkZWZhdWx0IGNvdW50cnkgIgotCQkJCSJlZXByb20gZW50cnkuIChlbnRyeSBzaXplOiAlZClcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBsZW4pOworCQl3aXBoeV9lcnIoZGV2LT53aXBoeSwKKwkJCSAgImZvdW5kIHBvc3NpYmxlIGludmFsaWQgZGVmYXVsdCBjb3VudHJ5IGVlcHJvbSBlbnRyeS4gKGVudHJ5IHNpemU6ICVkKVxuIiwKKwkJCSAgbGVuKTsKIAogCQlwcmludF9oZXhfZHVtcF9ieXRlcygiY291bnRyeToiLCBEVU1QX1BSRUZJWF9OT05FLAogCQkJCSAgICAgZGF0YSwgbGVuKTsKIAotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbGVhc2UgcmVwb3J0IHRoaXMgaXNzdWUuXG4iLAotCQkJd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7CisJCXdpcGh5X2VycihkZXYtPndpcGh5LCAicGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlLlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ3OCw4ICs0NzQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChkYXRhWzBdICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5rbm93biBvdXRwdXQgcG93ZXIgZGIgcmV2aXNpb246JXhcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBkYXRhWzBdKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJ1bmtub3duIG91dHB1dCBwb3dlciBkYiByZXZpc2lvbjoleFxuIiwKKwkJCSAgZGF0YVswXSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTg3LDEwICs1ODMsOSBAQAogCQkJCWVyciA9IHA1NF9jb252ZXJ0X3JldjEoZGV2LCBjdXJ2ZV9kYXRhKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5rbm93biBjdXJ2ZSBkYXRhICIKLQkJCQkJCSJyZXZpc2lvbiAlZFxuIiwKLQkJCQkJCXdpcGh5X25hbWUoZGV2LT53aXBoeSksCi0JCQkJCQljdXJ2ZV9kYXRhLT5jYWxfbWV0aG9kX3Jldik7CisJCQkJd2lwaHlfZXJyKGRldi0+d2lwaHksCisJCQkJCSAgInVua25vd24gY3VydmUgZGF0YSByZXZpc2lvbiAlZFxuIiwKKwkJCQkJICBjdXJ2ZV9kYXRhLT5jYWxfbWV0aG9kX3Jldik7CiAJCQkJZXJyID0gLUVOT0RFVjsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTU5OSwxMyArNTk0LDEzIEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQRFJfUFJJU01fWklGX1RYX0lRX0NBTElCUkFUSU9OOgotCQkJcHJpdi0+aXFfYXV0b2NhbCA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOworCQkJcHJpdi0+aXFfYXV0b2NhbCA9IGttZW1kdXAoZW50cnktPmRhdGEsIGRhdGFfbGVuLAorCQkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXByaXYtPmlxX2F1dG9jYWwpIHsKIAkJCQllcnIgPSAtRU5PTUVNOwogCQkJCWdvdG8gZXJyOwogCQkJfQogCi0JCQltZW1jcHkocHJpdi0+aXFfYXV0b2NhbCwgZW50cnktPmRhdGEsIGRhdGFfbGVuKTsKIAkJCXByaXYtPmlxX2F1dG9jYWxfbGVuID0gZGF0YV9sZW4gLyBzaXplb2Yoc3RydWN0IHBkYV9pcV9hdXRvY2FsX2VudHJ5KTsKIAkJCWJyZWFrOwogCQljYXNlIFBEUl9ERUZBVUxUX0NPVU5UUlk6CkBAIC02NzIsOCArNjY3LDggQEAKIAogCWlmICghc3ludGggfHwgIXByaXYtPmlxX2F1dG9jYWwgfHwgIXByaXYtPm91dHB1dF9saW1pdCB8fAogCSAgICAhcHJpdi0+Y3VydmVfZGF0YSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub3QgYWxsIHJlcXVpcmVkIGVudHJpZXMgZm91bmQgaW4gZWVwcm9tIVxuIiwKLQkJCXdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQl3aXBoeV9lcnIoZGV2LT53aXBoeSwKKwkJCSAgIm5vdCBhbGwgcmVxdWlyZWQgZW50cmllcyBmb3VuZCBpbiBlZXByb20hXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQpAQCAtNjk5LDE1ICs2OTQsMTUgQEAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT53aXBoeS0+cGVybV9hZGRyKSkgewogCQl1OCBwZXJtX2FkZHJbRVRIX0FMRU5dOwogCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIGh3YWRkciEgVXNpbmcgcmFuZG9tbHkgZ2VuZXJhdGVkIE1BQyBhZGRyXG4iLAotCQkJd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7CisJCXdpcGh5X3dhcm4oZGV2LT53aXBoeSwKKwkJCSAgICJpbnZhbGlkIGh3YWRkciEgdXNpbmcgcmFuZG9tbHkgZ2VuZXJhdGVkIG1hYyBhZGRyXG4iKTsKIAkJcmFuZG9tX2V0aGVyX2FkZHIocGVybV9hZGRyKTsKIAkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoZGV2LCBwZXJtX2FkZHIpOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBod2FkZHIgJXBNLCBNQUM6aXNsMzglMDJ4IFJGOiVzXG4iLAotCQl3aXBoeV9uYW1lKGRldi0+d2lwaHkpLAlkZXYtPndpcGh5LT5wZXJtX2FkZHIsIHByaXYtPnZlcnNpb24sCi0JCXA1NF9yZl9jaGlwc1twcml2LT5yeGh3XSk7CisJd2lwaHlfaW5mbyhkZXYtPndpcGh5LCAiaHdhZGRyICVwbSwgbWFjOmlzbDM4JTAyeCByZjolc1xuIiwKKwkJICAgZGV2LT53aXBoeS0+cGVybV9hZGRyLCBwcml2LT52ZXJzaW9uLAorCQkgICBwNTRfcmZfY2hpcHNbcHJpdi0+cnhod10pOwogCiAJcmV0dXJuIDA7CiAKQEAgLTcxOSw4ICs3MTQsNyBAQAogCXByaXYtPm91dHB1dF9saW1pdCA9IE5VTEw7CiAJcHJpdi0+Y3VydmVfZGF0YSA9IE5VTEw7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBlZXByb20gcGFyc2UgZmFpbGVkIVxuIiwKLQkJd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7CisJd2lwaHlfZXJyKGRldi0+d2lwaHksICJlZXByb20gcGFyc2UgZmFpbGVkIVxuIik7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHA1NF9wYXJzZV9lZXByb20pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9md2lvLmMKaW5kZXggYzQzYTVkNC4uNDcwMDZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZndpby5jCkBAIC02MiwxNiArNjIsMTUgQEAKIAkJCWNhc2UgRldfTE0yMDoKIAkJCWNhc2UgRldfTE04NzogewogCQkJCWNoYXIgKmlmdHlwZSA9IChjaGFyICopYm9vdHJlYy0+ZGF0YTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogcDU0IGRldGVjdGVkIGEgTE0lYyVjICIKLQkJCQkJCSAiZmlybXdhcmVcbiIsCi0JCQkJCXdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKLQkJCQkJaWZ0eXBlWzJdLCBpZnR5cGVbM10pOworCQkJCXdpcGh5X2luZm8ocHJpdi0+aHctPndpcGh5LAorCQkJCQkgICAicDU0IGRldGVjdGVkIGEgTE0lYyVjIGZpcm13YXJlXG4iLAorCQkJCQkgICBpZnR5cGVbMl0sIGlmdHlwZVszXSk7CiAJCQkJYnJlYWs7CiAJCQkJfQogCQkJY2FzZSBGV19GTUFDOgogCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnN1cHBvcnRlZCBmaXJtd2FyZVxuIiwKLQkJCQkJd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKKwkJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJCQkgICJ1bnN1cHBvcnRlZCBmaXJtd2FyZVxuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAJCQlicmVhazsKQEAgLTEyNSwxNSArMTI0LDE1IEBACiAJfQogCiAJaWYgKGZ3X3ZlcnNpb24pCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBGVyByZXYgJXMgLSBTb2Z0bWFjIHByb3RvY29sICV4LiV4XG4iLAotCQkJd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBmd192ZXJzaW9uLAotCQkJcHJpdi0+ZndfdmFyID4+IDgsIHByaXYtPmZ3X3ZhciAmIDB4ZmYpOworCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgICJmdyByZXYgJXMgLSBzb2Z0bWFjIHByb3RvY29sICV4LiV4XG4iLAorCQkJICAgZndfdmVyc2lvbiwgcHJpdi0+ZndfdmFyID4+IDgsIHByaXYtPmZ3X3ZhciAmIDB4ZmYpOwogCiAJaWYgKHByaXYtPmZ3X3ZhciA8IDB4NTAwKQotCQlwcmludGsoS0VSTl9JTkZPICIlczogeW91IGFyZSB1c2luZyBhbiBvYnNvbGV0ZSBmaXJtd2FyZS4gIgotCQkgICAgICAgInZpc2l0IGh0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL3VzZXJzL0RyaXZlcnMvcDU0ICIKLQkJICAgICAgICJhbmQgZ3JhYiBvbmUgZm9yIFwia2VybmVsID49IDIuNi4yOFwiIVxuIiwKLQkJCXdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSk7CisJCXdpcGh5X2luZm8ocHJpdi0+aHctPndpcGh5LAorCQkJICAgInlvdSBhcmUgdXNpbmcgYW4gb2Jzb2xldGUgZmlybXdhcmUuICIKKwkJCSAgICJ2aXNpdCBodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi91c2Vycy9Ecml2ZXJzL3A1NCAiCisJCQkgICAiYW5kIGdyYWIgb25lIGZvciBcImtlcm5lbCA+PSAyLjYuMjhcIiFcbiIpOwogCiAJaWYgKHByaXYtPmZ3X3ZhciA+PSAweDMwMCkgewogCQkvKiBGaXJtd2FyZSBzdXBwb3J0cyBRb1MsIHVzZSBpdCEgKi8KQEAgLTE1MiwxMyArMTUxLDE0IEBACiAJCXByaXYtPmh3LT5xdWV1ZXMgPSBQNTRfUVVFVUVfQUNfTlVNOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBjcnlwdG9ncmFwaGljIGFjY2VsZXJhdG9yICIKLQkgICAgICAgIldFUDolcywgVEtJUDolcywgQ0NNUDolc1xuIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAotCQkocHJpdi0+cHJpdmFjeV9jYXBzICYgQlJfREVTQ19QUklWX0NBUF9XRVApID8gIllFUyIgOgotCQkibm8iLCAocHJpdi0+cHJpdmFjeV9jYXBzICYgKEJSX0RFU0NfUFJJVl9DQVBfVEtJUCB8Ci0JCUJSX0RFU0NfUFJJVl9DQVBfTUlDSEFFTCkpID8gIllFUyIgOiAibm8iLAotCQkocHJpdi0+cHJpdmFjeV9jYXBzICYgQlJfREVTQ19QUklWX0NBUF9BRVNDQ01QKSA/Ci0JCSJZRVMiIDogIm5vIik7CisJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksCisJCSAgICJjcnlwdG9ncmFwaGljIGFjY2VsZXJhdG9yIFdFUDolcywgVEtJUDolcywgQ0NNUDolc1xuIiwKKwkJICAgKHByaXYtPnByaXZhY3lfY2FwcyAmIEJSX0RFU0NfUFJJVl9DQVBfV0VQKSA/ICJZRVMiIDogIm5vIiwKKwkJICAgKHByaXYtPnByaXZhY3lfY2FwcyAmCisJCSAgICAoQlJfREVTQ19QUklWX0NBUF9US0lQIHwgQlJfREVTQ19QUklWX0NBUF9NSUNIQUVMKSkKKwkJICAgPyAiWUVTIiA6ICJubyIsCisJCSAgIChwcml2LT5wcml2YWN5X2NhcHMgJiBCUl9ERVNDX1BSSVZfQ0FQX0FFU0NDTVApCisJCSAgID8gIllFUyIgOiAibm8iKTsKIAogCWlmIChwcml2LT5yeF9rZXljYWNoZV9zaXplKSB7CiAJCS8qCkBAIC0yNDcsOCArMjQ3LDcgQEAKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCiAJICAgICAmcHJpdi0+ZWVwcm9tX2NvbXAsIEhaKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZXZpY2UgZG9lcyBub3QgcmVzcG9uZCFcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQhXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCX0KIAlwcml2LT5lZXByb20gPSBOVUxMOwpAQCAtNTIzLDkgKzUyMiw5IEBACiAJcmV0dXJuIDA7CiAKIGVycjoKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBmcmVxdWVuY3kgY2hhbmdlIHRvIGNoYW5uZWwgJWQgZmFpbGVkLlxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCi0JICAgICAgIHByaXYtPmh3LT5jb25mLmNoYW5uZWwtPmNlbnRlcl9mcmVxKSk7CisJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImZyZXF1ZW5jeSBjaGFuZ2UgdG8gY2hhbm5lbCAlZCBmYWlsZWQuXG4iLAorCQkgIGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKKwkJCSAgcHJpdi0+aHctPmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXEpKTsKIAogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC02NzYsOCArNjc1LDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtOiAlZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgYWxnbyk7CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksCisJCQkgICJpbnZhbGlkIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtOiAlZFxuIiwgYWxnbyk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2xlZC5jCmluZGV4IDk1NzVhYzAuLmVhOTFmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbGVkLmMKQEAgLTU3LDggKzU3LDggQEAKIAogCWVyciA9IHA1NF9zZXRfbGVkcyhwcml2KTsKIAlpZiAoZXJyICYmIG5ldF9yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVwZGF0ZSBMRURzICglZCkuXG4iLAotCQkJd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBlcnIpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAiZmFpbGVkIHRvIHVwZGF0ZSBsZWRzICglZCkuXG4iLCBlcnIpOwogCiAJaWYgKHJlcnVuKQogCQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LCAmcHJpdi0+bGVkX3dvcmssCkBAIC0xMDIsOCArMTAyLDggQEAKIAogCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3Rlcih3aXBoeV9kZXYocHJpdi0+aHctPndpcGh5KSwgJmxlZC0+bGVkX2Rldik7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHJlZ2lzdGVyICVzIExFRC5cbiIsCi0JCQl3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIG5hbWUpOworCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LAorCQkJICAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIGxlZC5cbiIsIG5hbWUpOwogCWVsc2UKIAkJbGVkLT5yZWdpc3RlcmVkID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMKaW5kZXggYzA3MmY0MS4uNDdkYjQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCkBAIC01MDcsNiArNTA3LDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBwNTRfZ2V0X3N1cnZleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIGludCBpZHgsCisJCQkJc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpCit7CisJc3RydWN0IHA1NF9jb21tb24gKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmRldi0+Y29uZjsKKworCWlmIChpZHggIT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlzdXJ2ZXktPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOworCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fTk9JU0VfREJNOworCXN1cnZleS0+bm9pc2UgPSBjbGFtcF90KHM4LCBwcml2LT5ub2lzZSwgLTEyOCwgMTI3KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgcDU0X29wcyA9IHsKIAkudHgJCQk9IHA1NF90eF84MDIxMSwKIAkuc3RhcnQJCQk9IHA1NF9zdGFydCwKQEAgLTUyMyw2ICs1MzksNyBAQAogCS5jb25maWd1cmVfZmlsdGVyCT0gcDU0X2NvbmZpZ3VyZV9maWx0ZXIsCiAJLmNvbmZfdHgJCT0gcDU0X2NvbmZfdHgsCiAJLmdldF9zdGF0cwkJPSBwNTRfZ2V0X3N0YXRzLAorCS5nZXRfc3VydmV5CQk9IHA1NF9nZXRfc3VydmV5LAogfTsKIAogc3RydWN0IGllZWU4MDIxMV9odyAqcDU0X2luaXRfY29tbW9uKHNpemVfdCBwcml2X2RhdGFfbGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L25ldDIyODAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9uZXQyMjgwLmgKaW5kZXggNDkxNWQ5ZC4uZTNlZDg5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L25ldDIyODAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbmV0MjI4MC5oCkBAIC0yMzIsNyArMjMyLDcgQEAKICNkZWZpbmUgR1BJTzJfSU5URVJSVVBUCQkJCQkJMgogI2RlZmluZSBHUElPMV9JTlRFUlJVUFQJCQkJCQkxCiAjZGVmaW5lIEdQSU8wX0lOVEVSUlVQVAkJCQkJCTAKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogdXNiIGNvbnRyb2wsIEJBUjAgKyAweDAwODAgKi8KIHN0cnVjdCBuZXQyMjgwX3VzYl9yZWdzIHsKQEAgLTI5Niw3ICsyOTYsNyBAQAogI2RlZmluZSBGT1JDRV9JTU1FRElBVEUJCQkJCQk3CiAjZGVmaW5lIE9VUl9VU0JfQUREUkVTUwkJCQkJCTAKIAlfX2xlMzIJCQlvdXJjb25maWc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHBjaSBjb250cm9sLCBCQVIwICsgMHgwMTAwICovCiBzdHJ1Y3QgbmV0MjI4MF9wY2lfcmVncyB7CkBAIC0zMjMsNyArMzIzLDcgQEAKICNkZWZpbmUgUENJX0FSQklURVJfQ0xFQVIJCQkJCTIKICNkZWZpbmUgUENJX0VYVEVSTkFMX0FSQklURVIJCQkJCTEKICNkZWZpbmUgUENJX0hPU1RfTU9ERQkJCQkJCTAKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogZG1hIGNvbnRyb2wsIEJBUjAgKyAweDAxODAgLi4uIGFycmF5IG9mIGZvdXIgc3RydWN0cyBsaWtlIHRoaXMsCiAgKiBmb3IgY2hhbm5lbHMgMC4uMy4gIHNlZSBhbHNvIHN0cnVjdCBuZXQyMjgwX2RtYTogIGRlc2NyaXB0b3IKQEAgLTM2NCw3ICszNjQsNyBAQAogCV9fbGUzMgkJCWRtYWFkZHI7CiAJX19sZTMyCQkJZG1hZGVzYzsKIAl1MzIJCQlfdW51c2VkMTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogZGVkaWNhdGVkIGVuZHBvaW50IHJlZ2lzdGVycywgQkFSMCArIDB4MDIwMCAqLwogCkBAIC0zNzQsNyArMzc0LDcgQEAKIAkvKiBvZmZzZXQgMHgwMjA0LCAweDAyMTQsIDB4MjI0LCAweDIzNCwgMHgyNDQgKi8KIAlfX2xlMzIJCQlkZXBfcnNwOwogCXUzMgkJCV91bnVzZWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIGNvbmZpZ3VyYWJsZSBlbmRwb2ludCByZWdpc3RlcnMsIEJBUjAgKyAweDAzMDAgLi4uIGFycmF5IG9mIHNldmVuIHN0cnVjdHMKICAqIGxpa2UgdGhpcywgZm9yIGVwMCB0aGVuIHRoZSBjb25maWd1cmFibGUgZW5kcG9pbnRzIEEuLkYKQEAgLTQzNywxNiArNDM3LDE2IEBACiAJX19sZTMyCQkJZXBfYXZhaWw7CiAJX19sZTMyCQkJZXBfZGF0YTsKIAl1MzIJCQlfdW51c2VkMFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5ldDIyODBfcmVnX3dyaXRlIHsKIAlfX2xlMTYgcG9ydDsKIAlfX2xlMzIgYWRkcjsKIAlfX2xlMzIgdmFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbmV0MjI4MF9yZWdfcmVhZCB7CiAJX19sZTE2IHBvcnQ7CiAJX19sZTMyIGFkZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAjZW5kaWYgLyogTkVUMjI4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmMKaW5kZXggYTVlYTg5Yy4uODIyZjhkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYwpAQCAtNDY2LDggKzQ2Niw3IEBACiAJUDU0UF9SRUFEKGRldl9pbnQpOwogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcHJpdi0+Ym9vdF9jb21wLCBIWikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGJvb3QgZmlybXdhcmUhXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7CisJCXdpcGh5X2VycihkZXYtPndpcGh5LCAiY2Fubm90IGJvb3QgZmlybXdhcmUhXG4iKTsKIAkJcDU0cF9zdG9wKGRldik7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuaAppbmRleCAyZmVlYWQ2Li5lZTliYzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5oCkBAIC02NSw3ICs2NSw3IEBACiAJdTggdW51c2VkXzZbMTkyNF07CiAJdTggY2FyZGJ1c19jaXNbMHg4MDBdOwogCXU4IGRpcmVjdF9tZW1fd2luWzB4MTAwMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHVzYiBiYWNrZW5kIG9ubHkgbmVlZHMgdGhlIHJlZ2lzdGVyIGRlZmluZXMgYWJvdmUgKi8KICNpZm5kZWYgUDU0VVNCX0gKQEAgLTc0LDcgKzc0LDcgQEAKIAlfX2xlMzIgZGV2aWNlX2FkZHI7CiAJX19sZTE2IGxlbjsKIAlfX2xlMTYgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBwNTRwX3JpbmdfY29udHJvbCB7CiAJX19sZTMyIGhvc3RfaWR4WzRdOwpAQCAtODMsNyArODMsNyBAQAogCXN0cnVjdCBwNTRwX2Rlc2MgdHhfZGF0YVszMl07CiAJc3RydWN0IHA1NHBfZGVzYyByeF9tZ210WzRdOwogCXN0cnVjdCBwNTRwX2Rlc2MgdHhfbWdtdFs0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBQNTRQX1JFQUQocikgKF9fZm9yY2UgX19sZTMyKV9fcmF3X3JlYWRsKCZwcml2LT5tYXAtPnIpCiAjZGVmaW5lIFA1NFBfV1JJVEUociwgdmFsKSBfX3Jhd193cml0ZWwoKF9fZm9yY2UgdTMyKShfX2xlMzIpKHZhbCksICZwcml2LT5tYXAtPnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmMKaW5kZXggYzhmMDlkYS4uMDg3YmYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRzcGkuYwpAQCAtNjk3LDkgKzY5Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwNTRzcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS8qIHVzZSBjeDMxMTB4IG5hbWUgYmVjYXVzZSBib2FyZC1uODAwLmMgdXNlcyB0aGF0IGZvciB0aGUKLQkJICogU1BJIHBvcnQgKi8KLQkJLm5hbWUJCT0gImN4MzExMHgiLAorCQkubmFtZQkJPSAicDU0c3BpIiwKIAkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJfSwKQEAgLTczMywzICs3MzEsNCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXN0aWFuIExhbXBhcnRlciA8Y2h1bmtlZXlAd2ViLmRlPiIpOwogTU9EVUxFX0FMSUFTKCJzcGk6Y3gzMTEweCIpOworTU9EVUxFX0FMSUFTKCJzcGk6cDU0c3BpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmgKaW5kZXggN2ZiZThkOC4uZGZhYTYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRzcGkuaApAQCAtOTYsNyArOTYsNyBAQAogCV9fbGUxNiBjbWQ7CiAJX19sZTE2IGxlbjsKIAlfX2xlMzIgYWRkcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHA1NHNfdHhfaW5mbyB7CiAJc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jCmluZGV4IDczMDczMjUuLmFkNTk1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMKQEAgLTY5LDcgKzY5LDggQEAKIAl7VVNCX0RFVklDRSgweDA5MTUsIDB4MjAwMil9LAkvKiBDb2hpYmEgUHJvdG8gYm9hcmQgKi8KIAl7VVNCX0RFVklDRSgweDBiYWYsIDB4MDExOCl9LCAgIC8qIFUuUy4gUm9ib3RpY3MgVTUgODAyLjExZyBBZGFwdGVyKi8KIAl7VVNCX0RFVklDRSgweDBiZjgsIDB4MTAwOSl9LCAgIC8qIEZVSklUU1UgRS01NDAwIFVTQiBEMTcwMCovCi0Je1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDYpfSwgICAvKiBNZWRpb24gTUQ0MDkwMCAqLworCS8qIHtVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDA2KX0sICogTWVkaW9uIE1ENDA5MDAgYWxyZWFkeSBsaXN0ZWQgYWJvdmUsCisJCQkJCSAqIGp1c3Qgbm90aW5nIGl0IGhlcmUgZm9yIGNsYXJpdHkgKi8KIAl7VVNCX0RFVklDRSgweDBjZGUsIDB4MDAwOCl9LAkvKiBTYWdlbSBYRzcwM0EgKi8KIAl7VVNCX0RFVklDRSgweDBjZGUsIDB4MDAxNSl9LAkvKiBaY29tYXggWEctNzA1QSAqLwogCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHgzNzYyKX0sCS8qIERMaW5rIERXTC1HMTIwIENvaGliYSAqLwpAQCAtNDM0LDEwICs0MzUsOSBAQAogCXU4ICpidWY7CiAJaW50IHJldDsKIAotCWJ1ZiA9IGttYWxsb2MoNCwgR0ZQX0tFUk5FTCk7CisJYnVmID0ga21lbWR1cChwNTR1X3JvbWJvb3RfMzg4NywgNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweShidWYsIHA1NHVfcm9tYm9vdF8zODg3LCA0KTsKIAlyZXQgPSBwNTR1X2J1bGtfbXNnKHByaXYsIFA1NFVfUElQRV9EQVRBLAogCQkJICAgIGJ1ZiwgNCk7CiAJa2ZyZWUoYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuaAppbmRleCBlOTM1Yjc5Li5lZDQwMzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5oCkBAIC03MCwxMiArNzAsMTIgQEAKIAlfX2xlMTYgbGVuOwogCV9fbGUxNiBmb2xsb3dlcjsJLyogPyAqLwogCXU4IHBhZGRpbmdbOF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGxtODdfdHhfaGRyIHsKIAlfX2xlMzIgZGV2aWNlX2FkZHI7CiAJX19sZTMyIGNoa3N1bTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBTb21lIGZsYWdzIGZvciB0aGUgaXNsIGhhcmR3YXJlIHJlZ2lzdGVycyBjb250cm9sbGluZyBETUEgaW5zaWRlIHRoZQogICogY2hpcCAqLwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJX19sZTMyIGZ3X2xvYWRfYWRkcjsKIAlfX2xlMzIgZndfbGVuZ3RoOwogCV9fbGUzMiBjcmM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogcGlwZXMgMyBhbmQgNCBhcmUgbm90IHVzZWQgYnkgdGhlIGRyaXZlciAqLwogI2RlZmluZSBQNTRVX1BJUEVfTlVNQkVSIDkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jCmluZGV4IDRlNjg5MTAuLjQyN2I0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3R4cnguYwpAQCAtMzgsOCArMzgsOCBAQAogCXUzMiBsYXJnZXN0X2hvbGUgPSAwLCBmcmVlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X3F1ZXVlLmxvY2ssIGZsYWdzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC8gLS0tIHR4IHF1ZXVlIGR1bXAgKCVkIGVudHJpZXMpIC0tLVxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBza2JfcXVldWVfbGVuKCZwcml2LT50eF9xdWV1ZSkpOworCXdpcGh5X2RlYnVnKHByaXYtPmh3LT53aXBoeSwgIi8gLS0tIHR4IHF1ZXVlIGR1bXAgKCVkIGVudHJpZXMpIC0tLVxuIiwKKwkJICAgIHNrYl9xdWV1ZV9sZW4oJnByaXYtPnR4X3F1ZXVlKSk7CiAKIAlwcmV2X2FkZHIgPSBwcml2LT5yeF9zdGFydDsKIAlza2JfcXVldWVfd2FsaygmcHJpdi0+dHhfcXVldWUsIHNrYikgewpAQCAtNDgsMjEgKzQ4LDIzIEBACiAJCWhkciA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAogCQlmcmVlID0gcmFuZ2UtPnN0YXJ0X2FkZHIgLSBwcmV2X2FkZHI7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogfCBbJTAyZF0gPT4gW3NrYjolcCBza2JfbGVuOjB4JTA0eCAiCi0JCSAgICAgICAiaGRyOntmbGFnczolMDJ4IGxlbjolMDR4IHJlcV9pZDolMDR4IHR5cGU6JTAyeH0gIgotCQkgICAgICAgIm1lbTp7c3RhcnQ6JTA0eCBlbmQ6JTA0eCwgZnJlZTolZH1dXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBpKyssIHNrYiwgc2tiLT5sZW4sCi0JCSAgICAgICBsZTE2X3RvX2NwdShoZHItPmZsYWdzKSwgbGUxNl90b19jcHUoaGRyLT5sZW4pLAotCQkgICAgICAgbGUzMl90b19jcHUoaGRyLT5yZXFfaWQpLCBsZTE2X3RvX2NwdShoZHItPnR5cGUpLAotCQkgICAgICAgcmFuZ2UtPnN0YXJ0X2FkZHIsIHJhbmdlLT5lbmRfYWRkciwgZnJlZSk7CisJCXdpcGh5X2RlYnVnKHByaXYtPmh3LT53aXBoeSwKKwkJCSAgICAifCBbJTAyZF0gPT4gW3NrYjolcCBza2JfbGVuOjB4JTA0eCAiCisJCQkgICAgImhkcjp7ZmxhZ3M6JTAyeCBsZW46JTA0eCByZXFfaWQ6JTA0eCB0eXBlOiUwMnh9ICIKKwkJCSAgICAibWVtOntzdGFydDolMDR4IGVuZDolMDR4LCBmcmVlOiVkfV1cbiIsCisJCQkgICAgaSsrLCBza2IsIHNrYi0+bGVuLAorCQkJICAgIGxlMTZfdG9fY3B1KGhkci0+ZmxhZ3MpLCBsZTE2X3RvX2NwdShoZHItPmxlbiksCisJCQkgICAgbGUzMl90b19jcHUoaGRyLT5yZXFfaWQpLCBsZTE2X3RvX2NwdShoZHItPnR5cGUpLAorCQkJICAgIHJhbmdlLT5zdGFydF9hZGRyLCByYW5nZS0+ZW5kX2FkZHIsIGZyZWUpOwogCiAJCXByZXZfYWRkciA9IHJhbmdlLT5lbmRfYWRkcjsKIAkJbGFyZ2VzdF9ob2xlID0gbWF4KGxhcmdlc3RfaG9sZSwgZnJlZSk7CiAJfQogCWZyZWUgPSBwcml2LT5yeF9lbmQgLSBwcmV2X2FkZHI7CiAJbGFyZ2VzdF9ob2xlID0gbWF4KGxhcmdlc3RfaG9sZSwgZnJlZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBcXCAtLS0gW2ZyZWU6ICVkXSwgbGFyZ2VzdCBmcmVlIGJsb2NrOiAlZCAtLS1cbiIsCi0JICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgZnJlZSwgbGFyZ2VzdF9ob2xlKTsKKwl3aXBoeV9kZWJ1Zyhwcml2LT5ody0+d2lwaHksCisJCSAgICAiXFwgLS0tIFtmcmVlOiAlZF0sIGxhcmdlc3QgZnJlZSBibG9jazogJWQgLS0tXG4iLAorCQkgICAgZnJlZSwgbGFyZ2VzdF9ob2xlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9xdWV1ZS5sb2NrLCBmbGFncyk7CiB9CiAjZW5kaWYgLyogUDU0X01NX0RFQlVHICovCkBAIC01MzgsOCArNTQwLDcgQEAKIAljYXNlIFA1NF9UUkFQX0JFQUNPTl9UWDoKIAkJYnJlYWs7CiAJY2FzZSBQNTRfVFJBUF9SQURBUjoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJhZGFyIChmcmVxOiVkIE1IeilcbiIsCi0JCQl3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGZyZXEpOworCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwgInJhZGFyIChmcmVxOiVkIG1oeilcbiIsIGZyZXEpOwogCQlicmVhazsKIAljYXNlIFA1NF9UUkFQX05PX0JFQUNPTjoKIAkJaWYgKHByaXYtPnZpZikKQEAgLTU1OCw4ICs1NTksOCBAQAogCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwgZmFsc2UpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgZXZlbnQ6JXggZnJlcTolZFxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgZXZlbnQsIGZyZXEpOworCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwgInJlY2VpdmVkIGV2ZW50OiV4IGZyZXE6JWRcbiIsCisJCQkgICBldmVudCwgZnJlcSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTU4NCw4ICs1ODUsOSBAQAogCQlwNTRfcnhfZWVwcm9tX3JlYWRiYWNrKHByaXYsIHNrYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogbm90IGhhbmRsaW5nIDB4JTAyeCB0eXBlIGNvbnRyb2wgZnJhbWVcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KGhkci0+dHlwZSkpOworCQl3aXBoeV9kZWJ1Zyhwcml2LT5ody0+d2lwaHksCisJCQkgICAgIm5vdCBoYW5kbGluZyAweCUwMnggdHlwZSBjb250cm9sIGZyYW1lXG4iLAorCQkJICAgIGxlMTZfdG9fY3B1KGhkci0+dHlwZSkpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCA4ZDExOTBjLi43N2NkNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTIwNjcsNyArMjA2Nyw3IEBACiAJbWVtcHRyID0ga21hbGxvYyhJV19DVVNUT01fTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbXB0cikKIAkJcmV0dXJuOwotCUJVR19PTihuID4gSVdfQ1VTVE9NX01BWCk7CisJQlVHX09OKG4gPj0gSVdfQ1VTVE9NX01BWCk7CiAJd3JxdS5kYXRhLnBvaW50ZXIgPSBtZW1wdHI7CiAJd3JxdS5kYXRhLmxlbmd0aCA9IG47CiAJc3RyY3B5KG1lbXB0ciwgc3RyKTsKQEAgLTIxMDEsNyArMjEwMSw3IEBACiAJdTggdGltZXN0YW1wWzhdOwogCXUxNiBiZWFjb25faW50OwogCXUxNiBjYXBhYl9pbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdMQU5fRUlEX0dFTkVSSUMgMHhkZAogc3RhdGljIHU4IHdwYV9vaWRbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKQEAgLTI3NTEsMTQgKzI3NTEsOSBAQAogICAgICAgICAgICBwLT5sZW5ndGggPiBQUklTTTJfSE9TVEFQRF9NQVhfQlVGX1NJWkUgfHwgIXAtPnBvaW50ZXIpCiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIHBhcmFtID0ga21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOwotICAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQotICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0KLSAgICAgICBpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKLSAgICAgICAgICAgICAgIGtmcmVlKHBhcmFtKTsKLSAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgIH0KKwlwYXJhbSA9IG1lbWR1cF91c2VyKHAtPnBvaW50ZXIsIHAtPmxlbmd0aCk7CisJaWYgKElTX0VSUihwYXJhbSkpCisJCXJldHVybiBQVFJfRVJSKHBhcmFtKTsKIAogICAgICAgIHN3aXRjaCAocGFyYW0tPmNtZCkgewogICAgICAgIGNhc2UgUFJJU00yX1NFVF9FTkNSWVBUSU9OOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaAppbmRleCBiNzUzNGMyLi41OWUzMTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaApAQCAtMjksMjAgKzI5LDIwIEBACiBzdHJ1Y3Qgb2JqX3NzaWQgewogCXU4IGxlbmd0aDsKIAljaGFyIG9jdGV0c1szM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBvYmpfa2V5IHsKIAl1OCB0eXBlOwkJLyogZG90MTFfcHJpdl90ICovCiAJdTggbGVuZ3RoOwogCWNoYXIga2V5WzMyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9ial9tbG1lIHsKIAl1OCBhZGRyZXNzWzZdOwogCXUxNiBpZDsKIAl1MTYgc3RhdGU7CiAJdTE2IGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBvYmpfbWxtZWV4IHsKIAl1OCBhZGRyZXNzWzZdOwpAQCAtNTEsMTIgKzUxLDEyIEBACiAJdTE2IGNvZGU7CiAJdTE2IHNpemU7CiAJdTggZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9ial9idWZmZXIgewogCXUzMiBzaXplOwogCXUzMiBhZGRyOwkJLyogMzJiaXQgYnVzIGFkZHJlc3MgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9ial9ic3MgewogCXU4IGFkZHJlc3NbNl07CkBAIC03NywxNyArNzcsMTcgQEAKIAlzaG9ydCByYXRlczsKIAlzaG9ydCBiYXNpY19yYXRlczsKIAlpbnQ6MTY7CQkJLyogcGFkZGluZyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgb2JqX2Jzc2xpc3QgewogCXUzMiBucjsKIAlzdHJ1Y3Qgb2JqX2JzcyBic3NsaXN0WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzIHsKIAl1MTYgbnI7CiAJdTE2IG1oelswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG9ial9hdHRhY2htZW50IHsKIAljaGFyIHR5cGU7CkBAIC05NSw3ICs5NSw3IEBACiAJc2hvcnQgaWQ7CiAJc2hvcnQgc2l6ZTsKIAljaGFyIGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIGluIGNhc2UgZXZlcnl0aGluZydzIG9rLCB0aGUgaW5saW5lZCBmdW5jdGlvbiBiZWxvdyB3aWxsIGJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCmluZGV4IDU0ZjlhNGIuLjZjYTMwYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCkBAIC0zNCwxMyArMzQsMTMgQEAKIAlfX2xlMTYgdW5rMzsKIAl1OCByc3NpOwogCXU4IHBhZGRpbmdbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByeF9hbm5leF9oZWFkZXIgewogCXU4IGFkZHIxW0VUSF9BTEVOXTsKIAl1OCBhZGRyMltFVEhfQUxFTl07CiAJc3RydWN0IHJmbW9uX2hlYWRlciByZm1vbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogd2xhbi1uZyAoYW5kIGhvcGVmdWxseSBvdGhlcnMpIEFWUyBoZWFkZXIsIHZlcnNpb24gb25lLiAgRmllbGRzIGluCiAgKiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCmluZGV4IDBiMjdlNTAuLjBkYjkzZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCkBAIC0xMDEsNyArMTAxLDcgQEAKIAl1OCBkZXZpY2VfaWQ7CiAJdTggZmxhZ3M7CiAJdTMyIGxlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCit9IF9fcGFja2VkCiBwaW1mb3JfaGVhZGVyX3Q7CiAKIC8qIEEgcmVjZWl2ZWQgYW5kIGludGVycnVwdC1wcm9jZXNzZWQgbWFuYWdlbWVudCBmcmFtZSwgZWl0aGVyIGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwppbmRleCBhYmZmODkzLi44ODU2MGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC05Nyw3ICs5Niw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJheV9oYW5kbGVyX2RlZjsKIAogLyoqKioqIFByb3RvdHlwZXMgZm9yIHJheWxpbmsgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBhc2NfdG9faW50KGNoYXIgYSk7CiBzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCk7CiBzdGF0aWMgaW50IGJ1aWxkX2F1dGhfZnJhbWUocmF5X2Rldl90ICpsb2NhbCwgVUNIQVIgKmRlc3QsIGludCBhdXRoX3R5cGUpOwogc3RhdGljIHZvaWQgYXV0aGVudGljYXRlX3RpbWVvdXQodV9sb25nKTsKQEAgLTMxNiw5ICszMTQsOCBAQAogCWxvY2FsLT5maW5kZXIgPSBwX2RldjsKIAogCS8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZy4gTm9uZSB1c2VkIGhlcmUgKi8KLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gMDsKLQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSA1OworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCiAJLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLwogCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CkBAIC0zOTUsNyArMzkyLDYgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKIAl3aW5fcmVxX3QgcmVxOwotCW1lbXJlcV90IG1lbTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbGluay0+cHJpdjsKIAlyYXlfZGV2X3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNDMyLDkgKzQyOCw3IEBACiAJcmV0ID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KGxpbmssICZyZXEsICZsaW5rLT53aW4pOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwotCW1lbS5DYXJkT2Zmc2V0ID0gMHgwMDAwOwotCW1lbS5QYWdlID0gMDsKLQlyZXQgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmssIGxpbmstPndpbiwgJm1lbSk7CisJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsaW5rLT53aW4sIDApOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCWxvY2FsLT5zcmFtID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOwpAQCAtNDQ4LDkgKzQ0Miw3IEBACiAJcmV0ID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KGxpbmssICZyZXEsICZsb2NhbC0+cm1lbV9oYW5kbGUpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwotCW1lbS5DYXJkT2Zmc2V0ID0gMHg4MDAwOwotCW1lbS5QYWdlID0gMDsKLQlyZXQgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmssIGxvY2FsLT5ybWVtX2hhbmRsZSwgJm1lbSk7CisJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLCBsb2NhbC0+cm1lbV9oYW5kbGUsIDB4ODAwMCk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7CiAJbG9jYWwtPnJtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CkBAIC00NjQsOSArNDU2LDcgQEAKIAlyZXQgPSBwY21jaWFfcmVxdWVzdF93aW5kb3cobGluaywgJnJlcSwgJmxvY2FsLT5hbWVtX2hhbmRsZSk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7Ci0JbWVtLkNhcmRPZmZzZXQgPSAweDAwMDA7Ci0JbWVtLlBhZ2UgPSAwOwotCXJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluaywgbG9jYWwtPmFtZW1faGFuZGxlLCAmbWVtKTsKKwlyZXQgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmssIGxvY2FsLT5hbWVtX2hhbmRsZSwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7CiAJbG9jYWwtPmFtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CkBAIC03OTQsNyArNzg0LDYgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKIAlyYXlfZGV2X3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgaTsKIAogCWRldl9kYmcoJmxpbmstPmRldiwgInJheV9yZWxlYXNlXG4iKTsKIApAQCAtODAzLDEzICs3OTIsNiBAQAogCWlvdW5tYXAobG9jYWwtPnNyYW0pOwogCWlvdW5tYXAobG9jYWwtPnJtZW0pOwogCWlvdW5tYXAobG9jYWwtPmFtZW0pOwotCS8qIERvIGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KLQlpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmssIGxvY2FsLT5hbWVtX2hhbmRsZSk7Ci0JaWYgKGkgIT0gMCkKLQkJZGV2X2RiZygmbGluay0+ZGV2LCAiUmVsZWFzZVdpbmRvdyhsb2NhbC0+YW1lbSkgcmV0ID0gJXhcbiIsIGkpOwotCWkgPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluaywgbG9jYWwtPnJtZW1faGFuZGxlKTsKLQlpZiAoaSAhPSAwKQotCQlkZXZfZGJnKCZsaW5rLT5kZXYsICJSZWxlYXNlV2luZG93KGxvY2FsLT5ybWVtKSByZXQgPSAleFxuIiwgaSk7CiAJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwogCiAJZGV2X2RiZygmbGluay0+ZGV2LCAicmF5X3JlbGVhc2UgZW5kaW5nXG4iKTsKQEAgLTE3MTcsMjQgKzE2OTksNiBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGFzY190b19pbnQoY2hhciBhKQotewotCWlmIChhIDwgJzAnKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGEgPD0gJzknKQotCQlyZXR1cm4gKGEgLSAnMCcpOwotCWlmIChhIDwgJ0EnKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGEgPD0gJ0YnKQotCQlyZXR1cm4gKDEwICsgYSAtICdBJyk7Ci0JaWYgKGEgPCAnYScpCi0JCXJldHVybiAtMTsKLQlpZiAoYSA8PSAnZicpCi0JCXJldHVybiAoMTAgKyBhIC0gJ2EnKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIHN0YXRpYyBpbnQgcGFyc2VfYWRkcihjaGFyICppbl9zdHIsIFVDSEFSICpvdXQpCiB7CiAJaW50IGxlbjsKQEAgLTE3NTQsMTQgKzE3MTgsMTQgQEAKIAlpID0gNTsKIAogCXdoaWxlIChqID4gMCkgewotCQlpZiAoKGsgPSBhc2NfdG9faW50KGluX3N0cltqLS1dKSkgIT0gLTEpCisJCWlmICgoayA9IGhleF90b19iaW4oaW5fc3RyW2otLV0pKSAhPSAtMSkKIAkJCW91dFtpXSA9IGs7CiAJCWVsc2UKIAkJCXJldHVybiAwOwogCiAJCWlmIChqID09IDApCiAJCQlicmVhazsKLQkJaWYgKChrID0gYXNjX3RvX2ludChpbl9zdHJbai0tXSkpICE9IC0xKQorCQlpZiAoKGsgPSBoZXhfdG9fYmluKGluX3N0cltqLS1dKSkgIT0gLTEpCiAJCQlvdXRbaV0gKz0gayA8PCA0OwogCQllbHNlCiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwppbmRleCA0YmQ2MWVlLi43MTk1NzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCkBAIC0yMzgsMTkgKzIzOCwxOSBAQAogCXU4IGJzc2lkWzZdOwogCXU4IHBhZGRpbmdbMl07CiAJX19sZTMyIGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX3Bta2lkX2NhbmRpZGF0ZSB7CiAJdTggYnNzaWRbNl07CiAJdTggcGFkZGluZ1syXTsKIAlfX2xlMzIgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfcG1raWRfY2FuZF9saXN0IHsKIAlfX2xlMzIgdmVyc2lvbjsKIAlfX2xlMzIgbnVtX2NhbmRpZGF0ZXM7CiAJc3RydWN0IG5kaXNfODAyMTFfcG1raWRfY2FuZGlkYXRlIGNhbmRpZGF0ZV9saXN0WzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX3N0YXR1c19pbmRpY2F0aW9uIHsKIAlfX2xlMzIgc3RhdHVzX3R5cGU7CkBAIC0yNjAsMTkgKzI2MCwxOSBAQAogCQlzdHJ1Y3QgbmRpc184MDIxMV9hdXRoX3JlcXVlc3QJCWF1dGhfcmVxdWVzdFswXTsKIAkJc3RydWN0IG5kaXNfODAyMTFfcG1raWRfY2FuZF9saXN0CWNhbmRfbGlzdDsKIAl9IHU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfc3NpZCB7CiAJX19sZTMyIGxlbmd0aDsKIAl1OCBlc3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfY29uZl9mcmVxX2hvcCB7CiAJX19sZTMyIGxlbmd0aDsKIAlfX2xlMzIgaG9wX3BhdHRlcm47CiAJX19sZTMyIGhvcF9zZXQ7CiAJX19sZTMyIGR3ZWxsX3RpbWU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfY29uZiB7CiAJX19sZTMyIGxlbmd0aDsKQEAgLTI4MCw3ICsyODAsNyBAQAogCV9fbGUzMiBhdGltX3dpbmRvdzsKIAlfX2xlMzIgZHNfY29uZmlnOwogCXN0cnVjdCBuZGlzXzgwMjExX2NvbmZfZnJlcV9ob3AgZmhfY29uZmlnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2V4IHsKIAlfX2xlMzIgbGVuZ3RoOwpAQCAtMjk1LDI1ICsyOTUsMjUgQEAKIAl1OCByYXRlc1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOwogCV9fbGUzMiBpZV9sZW5ndGg7CiAJdTggaWVzWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2xpc3RfZXggewogCV9fbGUzMiBudW1faXRlbXM7CiAJc3RydWN0IG5kaXNfODAyMTFfYnNzaWRfZXggYnNzaWRbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfZml4ZWRfaWVzIHsKIAl1OCB0aW1lc3RhbXBbOF07CiAJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKIAlfX2xlMTYgY2FwYWJpbGl0aWVzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX3dlcF9rZXkgewogCV9fbGUzMiBzaXplOwogCV9fbGUzMiBpbmRleDsKIAlfX2xlMzIgbGVuZ3RoOwogCXU4IG1hdGVyaWFsWzMyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbmRpc184MDIxMV9rZXkgewogCV9fbGUzMiBzaXplOwpAQCAtMzIzLDE0ICszMjMsMTQgQEAKIAl1OCBwYWRkaW5nWzZdOwogCXU4IHJzY1s4XTsKIAl1OCBtYXRlcmlhbFszMl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfcmVtb3ZlX2tleSB7CiAJX19sZTMyIHNpemU7CiAJX19sZTMyIGluZGV4OwogCXU4IGJzc2lkWzZdOwogCXU4IHBhZGRpbmdbMl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfY29uZmlnX3BhcmFtIHsKIAlfX2xlMzIgbmFtZV9vZmZzOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJX19sZTMyIHR5cGU7CiAJX19sZTMyIHZhbHVlX29mZnM7CiAJX19sZTMyIHZhbHVlX2xlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbmRpc184MDIxMV9hc3NvY19pbmZvIHsKIAlfX2xlMzIgbGVuZ3RoOwpAQCAtMzU4LDEyICszNTgsMTIgQEAKIAl9IHJlc3BfaWU7CiAJX19sZTMyIHJlc3BfaWVfbGVuZ3RoOwogCV9fbGUzMiBvZmZzZXRfcmVzcF9pZXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfYXV0aF9lbmNyX3BhaXIgewogCV9fbGUzMiBhdXRoX21vZGU7CiAJX19sZTMyIGVuY3JfbW9kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbmRpc184MDIxMV9jYXBhYmlsaXR5IHsKIAlfX2xlMzIgbGVuZ3RoOwpAQCAtMzcxLDcgKzM3MSw3IEBACiAJX19sZTMyIG51bV9wbWtpZHM7CiAJX19sZTMyIG51bV9hdXRoX2VuY3JfcGFpcjsKIAlzdHJ1Y3QgbmRpc184MDIxMV9hdXRoX2VuY3JfcGFpciBhdXRoX2VuY3JfcGFpclswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbmRpc184MDIxMV9ic3NpZF9pbmZvIHsKIAl1OCBic3NpZFs2XTsKQEAgLTUyMCw4ICs1MjAsOSBAQAogCiBzdGF0aWMgaW50IHJuZGlzX3NldF93aXBoeV9wYXJhbXMoc3RydWN0IHdpcGh5ICp3aXBoeSwgdTMyIGNoYW5nZWQpOwogCi1zdGF0aWMgaW50IHJuZGlzX3NldF90eF9wb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlbnVtIHR4X3Bvd2VyX3NldHRpbmcgdHlwZSwKLQkJCQlpbnQgZGJtKTsKK3N0YXRpYyBpbnQgcm5kaXNfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLAorCQkJICAgICAgaW50IG1ibSk7CiBzdGF0aWMgaW50IHJuZGlzX2dldF90eF9wb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBpbnQgKmRibSk7CiAKIHN0YXRpYyBpbnQgcm5kaXNfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTg1NiwyMCArMTg1NywyNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJuZGlzX3NldF90eF9wb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlbnVtIHR4X3Bvd2VyX3NldHRpbmcgdHlwZSwKLQkJCQlpbnQgZGJtKQorc3RhdGljIGludCBybmRpc19zZXRfdHhfcG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsCisJCQkgICAgICBpbnQgbWJtKQogewogCXN0cnVjdCBybmRpc193bGFuX3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAlzdHJ1Y3QgdXNibmV0ICp1c2JkZXYgPSBwcml2LT51c2JkZXY7CiAKLQluZXRkZXZfZGJnKHVzYmRldi0+bmV0LCAiJXMoKTogdHlwZToweCV4IGRibTolaVxuIiwKLQkJICAgX19mdW5jX18sIHR5cGUsIGRibSk7CisJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgIiVzKCk6IHR5cGU6MHgleCBtYm06JWlcbiIsCisJCSAgIF9fZnVuY19fLCB0eXBlLCBtYm0pOworCisJaWYgKG1ibSA8IDAgfHwgKG1ibSAlIDEwMCkpCisJCXJldHVybiAtRU5PVFNVUFA7CiAKIAkvKiBEZXZpY2UgZG9lc24ndCBzdXBwb3J0IGNoYW5naW5nIHR4cG93ZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIG9ubHkKIAkgKiB0dXJuIG9mZi9vbiByYWRpby4gU3VwcG9ydCAnYXV0bycgbW9kZSBhbmQgc2V0dGluZyBzYW1lIGRCbSB0aGF0IGlzCiAJICogY3VycmVudGx5IHVzZWQuCiAJICovCi0JaWYgKHR5cGUgPT0gVFhfUE9XRVJfQVVUT01BVElDIHx8IGRibSA9PSBnZXRfYmNtNDMyMF9wb3dlcl9kYm0ocHJpdikpIHsKKwlpZiAodHlwZSA9PSBOTDgwMjExX1RYX1BPV0VSX0FVVE9NQVRJQyB8fAorCSAgICBNQk1fVE9fREJNKG1ibSkgPT0gZ2V0X2JjbTQzMjBfcG93ZXJfZGJtKHByaXYpKSB7CiAJCWlmICghcHJpdi0+cmFkaW9fb24pCiAJCQlkaXNhc3NvY2lhdGUodXNiZGV2LCB0cnVlKTsgLyogdHVybiBvbiByYWRpbyAqLwogCkBAIC0yNDk1LDggKzI1MDEsNyBAQAogc3RhdGljIHZvaWQgcm5kaXNfd2xhbl9kb19saW5rX3VwX3dvcmsoc3RydWN0IHVzYm5ldCAqdXNiZGV2KQogewogCXN0cnVjdCBybmRpc193bGFuX3ByaXZhdGUgKnByaXYgPSBnZXRfcm5kaXNfd2xhbl9wcml2KHVzYmRldik7Ci0Jc3RydWN0IG5kaXNfODAyMTFfYXNzb2NfaW5mbyAqaW5mbzsKLQl1OCBhc3NvY19idWZbc2l6ZW9mKCppbmZvKSArIElXX0NVU1RPTV9NQVggKyAzMl07CisJc3RydWN0IG5kaXNfODAyMTFfYXNzb2NfaW5mbyAqaW5mbyA9IE5VTEw7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCWludCByZXNwX2llX2xlbiwgcmVxX2llX2xlbjsKIAl1OCAqcmVxX2llLCAqcmVzcF9pZTsKQEAgLTI1MTUsMjMgKzI1MjAsNDMgQEAKIAlyZXNwX2llID0gTlVMTDsKIAogCWlmIChwcml2LT5pbmZyYV9tb2RlID09IE5ESVNfODAyMTFfSU5GUkFfSU5GUkEpIHsKLQkJbWVtc2V0KGFzc29jX2J1ZiwgMCwgc2l6ZW9mKGFzc29jX2J1ZikpOwotCQlpbmZvID0gKHZvaWQgKilhc3NvY19idWY7CisJCWluZm8gPSBremFsbG9jKENPTlRST0xfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIWluZm8pIHsKKwkJCS8qIE5vIG1lbW9yeT8gVHJ5IHJlc3VtZSB3b3JrIGxhdGVyICovCisJCQlzZXRfYml0KFdPUktfTElOS19VUCwgJnByaXYtPndvcmtfcGVuZGluZyk7CisJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPndvcmspOworCQkJcmV0dXJuOworCQl9CiAKLQkJLyogR2V0IGFzc29jaWF0aW9uIGluZm8gSUVzIGZyb20gZGV2aWNlIGFuZCBzZW5kIHRoZW0gYmFjayB0bwotCQkgKiB1c2Vyc3BhY2UuICovCi0JCXJldCA9IGdldF9hc3NvY2lhdGlvbl9pbmZvKHVzYmRldiwgaW5mbywgc2l6ZW9mKGFzc29jX2J1ZikpOworCQkvKiBHZXQgYXNzb2NpYXRpb24gaW5mbyBJRXMgZnJvbSBkZXZpY2UuICovCisJCXJldCA9IGdldF9hc3NvY2lhdGlvbl9pbmZvKHVzYmRldiwgaW5mbywgQ09OVFJPTF9CVUZGRVJfU0laRSk7CiAJCWlmICghcmV0KSB7CiAJCQlyZXFfaWVfbGVuID0gbGUzMl90b19jcHUoaW5mby0+cmVxX2llX2xlbmd0aCk7CiAJCQlpZiAocmVxX2llX2xlbiA+IDApIHsKIAkJCQlvZmZzZXQgPSBsZTMyX3RvX2NwdShpbmZvLT5vZmZzZXRfcmVxX2llcyk7CisKKwkJCQlpZiAob2Zmc2V0ID4gQ09OVFJPTF9CVUZGRVJfU0laRSkKKwkJCQkJb2Zmc2V0ID0gQ09OVFJPTF9CVUZGRVJfU0laRTsKKwogCQkJCXJlcV9pZSA9ICh1OCAqKWluZm8gKyBvZmZzZXQ7CisKKwkJCQlpZiAob2Zmc2V0ICsgcmVxX2llX2xlbiA+IENPTlRST0xfQlVGRkVSX1NJWkUpCisJCQkJCXJlcV9pZV9sZW4gPQorCQkJCQkJQ09OVFJPTF9CVUZGRVJfU0laRSAtIG9mZnNldDsKIAkJCX0KIAogCQkJcmVzcF9pZV9sZW4gPSBsZTMyX3RvX2NwdShpbmZvLT5yZXNwX2llX2xlbmd0aCk7CiAJCQlpZiAocmVzcF9pZV9sZW4gPiAwKSB7CiAJCQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoaW5mby0+b2Zmc2V0X3Jlc3BfaWVzKTsKKworCQkJCWlmIChvZmZzZXQgPiBDT05UUk9MX0JVRkZFUl9TSVpFKQorCQkJCQlvZmZzZXQgPSBDT05UUk9MX0JVRkZFUl9TSVpFOworCiAJCQkJcmVzcF9pZSA9ICh1OCAqKWluZm8gKyBvZmZzZXQ7CisKKwkJCQlpZiAob2Zmc2V0ICsgcmVzcF9pZV9sZW4gPiBDT05UUk9MX0JVRkZFUl9TSVpFKQorCQkJCQlyZXNwX2llX2xlbiA9CisJCQkJCQlDT05UUk9MX0JVRkZFUl9TSVpFIC0gb2Zmc2V0OwogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChXQVJOX09OKHByaXYtPmluZnJhX21vZGUgIT0gTkRJU184MDIxMV9JTkZSQV9BREhPQykpCkBAIC0yNTYzLDYgKzI1ODgsOSBAQAogCX0gZWxzZSBpZiAocHJpdi0+aW5mcmFfbW9kZSA9PSBORElTXzgwMjExX0lORlJBX0FESE9DKQogCQljZmc4MDIxMV9pYnNzX2pvaW5lZCh1c2JkZXYtPm5ldCwgYnNzaWQsIEdGUF9LRVJORUwpOwogCisJaWYgKGluZm8gIT0gTlVMTCkKKwkJa2ZyZWUoaW5mbyk7CisKIAlwcml2LT5jb25uZWN0ZWQgPSB0cnVlOwogCW1lbWNweShwcml2LT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjQwMHBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjQwMHBjaS5jCmluZGV4IGFkMmM5OGEuLjUwNjNlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI0MDBwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmMKQEAgLTU4Niw5ICs1ODYsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBydDI0MDBwY2lfc2V0X3ZnYyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCSAgICAgc3RydWN0IGxpbmtfcXVhbCAqcXVhbCwgdTggdmdjX2xldmVsKQogewotCXJ0MjQwMHBjaV9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMywgdmdjX2xldmVsKTsKLQlxdWFsLT52Z2NfbGV2ZWwgPSB2Z2NfbGV2ZWw7Ci0JcXVhbC0+dmdjX2xldmVsX3JlZyA9IHZnY19sZXZlbDsKKwlpZiAocXVhbC0+dmdjX2xldmVsX3JlZyAhPSB2Z2NfbGV2ZWwpIHsKKwkJcnQyNDAwcGNpX2JicF93cml0ZShydDJ4MDBkZXYsIDEzLCB2Z2NfbGV2ZWwpOworCQlxdWFsLT52Z2NfbGV2ZWwgPSB2Z2NfbGV2ZWw7CisJCXF1YWwtPnZnY19sZXZlbF9yZWcgPSB2Z2NfbGV2ZWw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBydDI0MDBwY2lfcmVzZXRfdHVuZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTg3Nyw3ICs4NzksOCBAQAogc3RhdGljIHZvaWQgcnQyNDAwcGNpX3RvZ2dsZV9pcnEoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCQkgZW51bSBkZXZfc3RhdGUgc3RhdGUpCiB7Ci0JaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09GRik7CisJaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09GRikgfHwKKwkJICAgKHN0YXRlID09IFNUQVRFX1JBRElPX0lSUV9PRkZfSVNSKTsKIAl1MzIgcmVnOwogCiAJLyoKQEAgLTk3OCw3ICs5ODEsOSBAQAogCQlydDI0MDBwY2lfdG9nZ2xlX3J4KHJ0MngwMGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PTjoKKwljYXNlIFNUQVRFX1JBRElPX0lSUV9PTl9JU1I6CiAJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09GRl9JU1I6CiAJCXJ0MjQwMHBjaV90b2dnbGVfaXJxKHJ0MngwMGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX0RFRVBfU0xFRVA6CkBAIC0xMDc2LDkgKzEwODEsNiBAQAogCQkJCSAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7Ci0Jc3RydWN0IHF1ZXVlX2VudHJ5X3ByaXZfcGNpICplbnRyeV9wcml2ID0gZW50cnktPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc2tiX2ZyYW1lX2Rlc2MgKnNrYmRlc2MgPSBnZXRfc2tiX2ZyYW1lX2Rlc2MoZW50cnktPnNrYik7Ci0JdTMyIHdvcmQ7CiAJdTMyIHJlZzsKIAogCS8qCkBAIC0xMDkxLDkgKzEwOTMsMTUgQEAKIAogCXJ0MngwMHF1ZXVlX21hcF90eHNrYihydDJ4MDBkZXYsIGVudHJ5LT5za2IpOwogCi0JcnQyeDAwX2Rlc2NfcmVhZChlbnRyeV9wcml2LT5kZXNjLCAxLCAmd29yZCk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfQlVGRkVSX0FERFJFU1MsIHNrYmRlc2MtPnNrYl9kbWEpOwotCXJ0MngwMF9kZXNjX3dyaXRlKGVudHJ5X3ByaXYtPmRlc2MsIDEsIHdvcmQpOworCS8qCisJICogV3JpdGUgdGhlIFRYIGRlc2NyaXB0b3IgZm9yIHRoZSBiZWFjb24uCisJICovCisJcnQyNDAwcGNpX3dyaXRlX3R4X2Rlc2MocnQyeDAwZGV2LCBlbnRyeS0+c2tiLCB0eGRlc2MpOworCisJLyoKKwkgKiBEdW1wIGJlYWNvbiB0byB1c2Vyc3BhY2UgdGhyb3VnaCBkZWJ1Z2ZzLgorCSAqLworCXJ0MngwMGRlYnVnX2R1bXBfZnJhbWUocnQyeDAwZGV2LCBEVU1QX0ZSQU1FX0JFQUNPTiwgZW50cnktPnNrYik7CiAKIAkvKgogCSAqIEVuYWJsZSBiZWFjb25pbmcgYWdhaW4uCkBAIC0xMjMwLDIzICsxMjM4LDEwIEBACiAJfQogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgcnQyNDAwcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCitzdGF0aWMgaXJxcmV0dXJuX3QgcnQyNDAwcGNpX2ludGVycnVwdF90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBkZXZfaW5zdGFuY2U7Ci0JdTMyIHJlZzsKLQotCS8qCi0JICogR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlLgotCSAqIFdyaXRlIHJlZ2lzdGVyIHZhbHVlIGJhY2sgdG8gY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzLgotCSAqLwotCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQ1NSNywgJnJlZyk7Ci0JcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQ1NSNywgcmVnKTsKLQotCWlmICghcmVnKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCi0JCXJldHVybiBJUlFfSEFORExFRDsKKwl1MzIgcmVnID0gcnQyeDAwZGV2LT5pcnF2YWx1ZVswXTsKIAogCS8qCiAJICogSGFuZGxlIGludGVycnVwdHMsIHdhbGsgdGhyb3VnaCBhbGwgYml0cwpAQCAtMTI4NCw5ICsxMjc5LDQwIEBACiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIENTUjdfVFhET05FX1RYUklORykpCiAJCXJ0MjQwMHBjaV90eGRvbmUocnQyeDAwZGV2LCBRSURfQUNfQkspOwogCisJLyogRW5hYmxlIGludGVycnVwdHMgYWdhaW4uICovCisJcnQyeDAwZGV2LT5vcHMtPmxpYi0+c2V0X2RldmljZV9zdGF0ZShydDJ4MDBkZXYsCisJCQkJCSAgICAgIFNUQVRFX1JBRElPX0lSUV9PTl9JU1IpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGlycXJldHVybl90IHJ0MjQwMHBjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBkZXZfaW5zdGFuY2U7CisJdTMyIHJlZzsKKworCS8qCisJICogR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlLgorCSAqIFdyaXRlIHJlZ2lzdGVyIHZhbHVlIGJhY2sgdG8gY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzLgorCSAqLworCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQ1NSNywgJnJlZyk7CisJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQ1NSNywgcmVnKTsKKworCWlmICghcmVnKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCS8qIFN0b3JlIGlycXZhbHVlcyBmb3IgdXNlIGluIHRoZSBpbnRlcnJ1cHQgdGhyZWFkLiAqLworCXJ0MngwMGRldi0+aXJxdmFsdWVbMF0gPSByZWc7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHdpbGwgYmUgZW5hYmxlZCBhZ2FpbiBpbiB0aGUgaW50ZXJydXB0IHRocmVhZC4gKi8KKwlydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwKKwkJCQkJICAgICAgU1RBVEVfUkFESU9fSVJRX09GRl9JU1IpOworCisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKwogLyoKICAqIERldmljZSBwcm9iZSBmdW5jdGlvbnMuCiAgKi8KQEAgLTEzOTYsOCArMTQyMiw4IEBACiAJLyoKIAkgKiBDaGVjayBpZiB0aGUgQkJQIHR1bmluZyBzaG91bGQgYmUgZW5hYmxlZC4KIAkgKi8KLQlpZiAoIXJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9BTlRFTk5BX1JYX0FHQ1ZHQ19UVU5JTkcpKQotCQlfX3NldF9iaXQoQ09ORklHX0RJU0FCTEVfTElOS19UVU5JTkcsICZydDJ4MDBkZXYtPmZsYWdzKTsKKwlpZiAocnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX0FOVEVOTkFfUlhfQUdDVkdDX1RVTklORykpCisJCV9fc2V0X2JpdChEUklWRVJfU1VQUE9SVF9MSU5LX1RVTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTYzLDcgKzE1ODksOCBAQAogCS5yZW1vdmVfaW50ZXJmYWNlCT0gcnQyeDAwbWFjX3JlbW92ZV9pbnRlcmZhY2UsCiAJLmNvbmZpZwkJCT0gcnQyeDAwbWFjX2NvbmZpZywKIAkuY29uZmlndXJlX2ZpbHRlcgk9IHJ0MngwMG1hY19jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfdGltCQk9IHJ0MngwMG1hY19zZXRfdGltLAorCS5zd19zY2FuX3N0YXJ0CQk9IHJ0MngwMG1hY19zd19zY2FuX3N0YXJ0LAorCS5zd19zY2FuX2NvbXBsZXRlCT0gcnQyeDAwbWFjX3N3X3NjYW5fY29tcGxldGUsCiAJLmdldF9zdGF0cwkJPSBydDJ4MDBtYWNfZ2V0X3N0YXRzLAogCS5ic3NfaW5mb19jaGFuZ2VkCT0gcnQyeDAwbWFjX2Jzc19pbmZvX2NoYW5nZWQsCiAJLmNvbmZfdHgJCT0gcnQyNDAwcGNpX2NvbmZfdHgsCkBAIC0xNTc0LDYgKzE2MDEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MngwMGxpYl9vcHMgcnQyNDAwcGNpX3J0MngwMF9vcHMgPSB7CiAJLmlycV9oYW5kbGVyCQk9IHJ0MjQwMHBjaV9pbnRlcnJ1cHQsCisJLmlycV9oYW5kbGVyX3RocmVhZAk9IHJ0MjQwMHBjaV9pbnRlcnJ1cHRfdGhyZWFkLAogCS5wcm9iZV9odwkJPSBydDI0MDBwY2lfcHJvYmVfaHcsCiAJLmluaXRpYWxpemUJCT0gcnQyeDAwcGNpX2luaXRpYWxpemUsCiAJLnVuaW5pdGlhbGl6ZQkJPSBydDJ4MDBwY2lfdW5pbml0aWFsaXplLApAQCAtMTU4NSw3ICsxNjEzLDYgQEAKIAkucmVzZXRfdHVuZXIJCT0gcnQyNDAwcGNpX3Jlc2V0X3R1bmVyLAogCS5saW5rX3R1bmVyCQk9IHJ0MjQwMHBjaV9saW5rX3R1bmVyLAogCS53cml0ZV90eF9kZXNjCQk9IHJ0MjQwMHBjaV93cml0ZV90eF9kZXNjLAotCS53cml0ZV90eF9kYXRhCQk9IHJ0MngwMHBjaV93cml0ZV90eF9kYXRhLAogCS53cml0ZV9iZWFjb24JCT0gcnQyNDAwcGNpX3dyaXRlX2JlYWNvbiwKIAkua2lja190eF9xdWV1ZQkJPSBydDI0MDBwY2lfa2lja190eF9xdWV1ZSwKIAkua2lsbF90eF9xdWV1ZQkJPSBydDI0MDBwY2lfa2lsbF90eF9xdWV1ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYwppbmRleCA0MWRhM2QyLi5jMmE1NTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHBjaS5jCkBAIC02MjYsNiArNjI2LDcgQEAKIHsKIAlpZiAocXVhbC0+dmdjX2xldmVsX3JlZyAhPSB2Z2NfbGV2ZWwpIHsKIAkJcnQyNTAwcGNpX2JicF93cml0ZShydDJ4MDBkZXYsIDE3LCB2Z2NfbGV2ZWwpOworCQlxdWFsLT52Z2NfbGV2ZWwgPSB2Z2NfbGV2ZWw7CiAJCXF1YWwtPnZnY19sZXZlbF9yZWcgPSB2Z2NfbGV2ZWw7CiAJfQogfQpAQCAtNzAwLDEzICs3MDEsMTAgQEAKIAkgKiBSMTcgaXMgaW5zaWRlIHRoZSBkeW5hbWljIHR1bmluZyByYW5nZSwKIAkgKiBzdGFydCB0dW5pbmcgdGhlIGxpbmsgYmFzZWQgb24gdGhlIGZhbHNlIGNjYSBjb3VudGVyLgogCSAqLwotCWlmIChxdWFsLT5mYWxzZV9jY2EgPiA1MTIgJiYgcXVhbC0+dmdjX2xldmVsX3JlZyA8IDB4NDApIHsKKwlpZiAocXVhbC0+ZmFsc2VfY2NhID4gNTEyICYmIHF1YWwtPnZnY19sZXZlbF9yZWcgPCAweDQwKQogCQlydDI1MDBwY2lfc2V0X3ZnYyhydDJ4MDBkZXYsIHF1YWwsICsrcXVhbC0+dmdjX2xldmVsX3JlZyk7Ci0JCXF1YWwtPnZnY19sZXZlbCA9IHF1YWwtPnZnY19sZXZlbF9yZWc7Ci0JfSBlbHNlIGlmIChxdWFsLT5mYWxzZV9jY2EgPCAxMDAgJiYgcXVhbC0+dmdjX2xldmVsX3JlZyA+IDB4MzIpIHsKKwllbHNlIGlmIChxdWFsLT5mYWxzZV9jY2EgPCAxMDAgJiYgcXVhbC0+dmdjX2xldmVsX3JlZyA+IDB4MzIpCiAJCXJ0MjUwMHBjaV9zZXRfdmdjKHJ0MngwMGRldiwgcXVhbCwgLS1xdWFsLT52Z2NfbGV2ZWxfcmVnKTsKLQkJcXVhbC0+dmdjX2xldmVsID0gcXVhbC0+dmdjX2xldmVsX3JlZzsKLQl9CiB9CiAKIC8qCkBAIC0xMDM1LDcgKzEwMzMsOCBAQAogc3RhdGljIHZvaWQgcnQyNTAwcGNpX3RvZ2dsZV9pcnEoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCQkgZW51bSBkZXZfc3RhdGUgc3RhdGUpCiB7Ci0JaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09GRik7CisJaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09GRikgfHwKKwkJICAgKHN0YXRlID09IFNUQVRFX1JBRElPX0lSUV9PRkZfSVNSKTsKIAl1MzIgcmVnOwogCiAJLyoKQEAgLTExMzYsNyArMTEzNSw5IEBACiAJCXJ0MjUwMHBjaV90b2dnbGVfcngocnQyeDAwZGV2LCBzdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgU1RBVEVfUkFESU9fSVJRX09OOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09OX0lTUjoKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PRkY6CisJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGX0lTUjoKIAkJcnQyNTAwcGNpX3RvZ2dsZV9pcnEocnQyeDAwZGV2LCBzdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgU1RBVEVfREVFUF9TTEVFUDoKQEAgLTEyMzMsOSArMTIzNCw2IEBACiAJCQkJICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKLQlzdHJ1Y3QgcXVldWVfZW50cnlfcHJpdl9wY2kgKmVudHJ5X3ByaXYgPSBlbnRyeS0+cHJpdl9kYXRhOwotCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhlbnRyeS0+c2tiKTsKLQl1MzIgd29yZDsKIAl1MzIgcmVnOwogCiAJLyoKQEAgLTEyNDgsOSArMTI0NiwxNSBAQAogCiAJcnQyeDAwcXVldWVfbWFwX3R4c2tiKHJ0MngwMGRldiwgZW50cnktPnNrYik7CiAKLQlydDJ4MDBfZGVzY19yZWFkKGVudHJ5X3ByaXYtPmRlc2MsIDEsICZ3b3JkKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMV9CVUZGRVJfQUREUkVTUywgc2tiZGVzYy0+c2tiX2RtYSk7Ci0JcnQyeDAwX2Rlc2Nfd3JpdGUoZW50cnlfcHJpdi0+ZGVzYywgMSwgd29yZCk7CisJLyoKKwkgKiBXcml0ZSB0aGUgVFggZGVzY3JpcHRvciBmb3IgdGhlIGJlYWNvbi4KKwkgKi8KKwlydDI1MDBwY2lfd3JpdGVfdHhfZGVzYyhydDJ4MDBkZXYsIGVudHJ5LT5za2IsIHR4ZGVzYyk7CisKKwkvKgorCSAqIER1bXAgYmVhY29uIHRvIHVzZXJzcGFjZSB0aHJvdWdoIGRlYnVnZnMuCisJICovCisJcnQyeDAwZGVidWdfZHVtcF9mcmFtZShydDJ4MDBkZXYsIERVTVBfRlJBTUVfQkVBQ09OLCBlbnRyeS0+c2tiKTsKIAogCS8qCiAJICogRW5hYmxlIGJlYWNvbmluZyBhZ2Fpbi4KQEAgLTEzNjYsMjMgKzEzNzAsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBydDI1MDBwY2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBydDI1MDBwY2lfaW50ZXJydXB0X3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGRldl9pbnN0YW5jZTsKLQl1MzIgcmVnOwotCi0JLyoKLQkgKiBHZXQgdGhlIGludGVycnVwdCBzb3VyY2VzICYgc2F2ZWQgdG8gbG9jYWwgdmFyaWFibGUuCi0JICogV3JpdGUgcmVnaXN0ZXIgdmFsdWUgYmFjayB0byBjbGVhciBwZW5kaW5nIGludGVycnVwdHMuCi0JICovCi0JcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBDU1I3LCAmcmVnKTsKLQlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBDU1I3LCByZWcpOwotCi0JaWYgKCFyZWcpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOworCXUzMiByZWcgPSBydDJ4MDBkZXYtPmlycXZhbHVlWzBdOwogCiAJLyoKIAkgKiBIYW5kbGUgaW50ZXJydXB0cywgd2FsayB0aHJvdWdoIGFsbCBiaXRzCkBAIC0xNDIwLDkgKzE0MTEsNDEgQEAKIAlpZiAocnQyeDAwX2dldF9maWVsZDMyKHJlZywgQ1NSN19UWERPTkVfVFhSSU5HKSkKIAkJcnQyNTAwcGNpX3R4ZG9uZShydDJ4MDBkZXYsIFFJRF9BQ19CSyk7CiAKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhZ2Fpbi4gKi8KKwlydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwKKwkJCQkJICAgICAgU1RBVEVfUkFESU9fSVJRX09OX0lTUik7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBydDI1MDBwY2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZGV2X2luc3RhbmNlOworCXUzMiByZWc7CisKKwkvKgorCSAqIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgJiBzYXZlZCB0byBsb2NhbCB2YXJpYWJsZS4KKwkgKiBXcml0ZSByZWdpc3RlciB2YWx1ZSBiYWNrIHRvIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4KKwkgKi8KKwlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIENTUjcsICZyZWcpOworCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIENTUjcsIHJlZyk7CisKKwlpZiAoIXJlZykKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBTdG9yZSBpcnF2YWx1ZXMgZm9yIHVzZSBpbiB0aGUgaW50ZXJydXB0IHRocmVhZC4gKi8KKwlydDJ4MDBkZXYtPmlycXZhbHVlWzBdID0gcmVnOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCB3aWxsIGJlIGVuYWJsZWQgYWdhaW4gaW4gdGhlIGludGVycnVwdCB0aHJlYWQuICovCisJcnQyeDAwZGV2LT5vcHMtPmxpYi0+c2V0X2RldmljZV9zdGF0ZShydDJ4MDBkZXYsCisJCQkJCSAgICAgIFNUQVRFX1JBRElPX0lSUV9PRkZfSVNSKTsKKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKIC8qCiAgKiBEZXZpY2UgcHJvYmUgZnVuY3Rpb25zLgogICovCkBAIC0xNTU0LDkgKzE1NzcsOCBAQAogCSAqIENoZWNrIGlmIHRoZSBCQlAgdHVuaW5nIHNob3VsZCBiZSBlbmFibGVkLgogCSAqLwogCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9OSUMsICZlZXByb20pOwotCi0JaWYgKHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9OSUNfRFlOX0JCUF9UVU5FKSkKLQkJX19zZXRfYml0KENPTkZJR19ESVNBQkxFX0xJTktfVFVOSU5HLCAmcnQyeDAwZGV2LT5mbGFncyk7CisJaWYgKCFydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fTklDX0RZTl9CQlBfVFVORSkpCisJCV9fc2V0X2JpdChEUklWRVJfU1VQUE9SVF9MSU5LX1RVTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBSU1NJIDwtPiBkQm0gb2Zmc2V0IGluZm9ybWF0aW9uLgpAQCAtMTg2MSw3ICsxODgzLDggQEAKIAkucmVtb3ZlX2ludGVyZmFjZQk9IHJ0MngwMG1hY19yZW1vdmVfaW50ZXJmYWNlLAogCS5jb25maWcJCQk9IHJ0MngwMG1hY19jb25maWcsCiAJLmNvbmZpZ3VyZV9maWx0ZXIJPSBydDJ4MDBtYWNfY29uZmlndXJlX2ZpbHRlciwKLQkuc2V0X3RpbQkJPSBydDJ4MDBtYWNfc2V0X3RpbSwKKwkuc3dfc2Nhbl9zdGFydAkJPSBydDJ4MDBtYWNfc3dfc2Nhbl9zdGFydCwKKwkuc3dfc2Nhbl9jb21wbGV0ZQk9IHJ0MngwMG1hY19zd19zY2FuX2NvbXBsZXRlLAogCS5nZXRfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF9zdGF0cywKIAkuYnNzX2luZm9fY2hhbmdlZAk9IHJ0MngwMG1hY19ic3NfaW5mb19jaGFuZ2VkLAogCS5jb25mX3R4CQk9IHJ0MngwMG1hY19jb25mX3R4LApAQCAtMTg3Miw2ICsxODk1LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydDJ4MDBsaWJfb3BzIHJ0MjUwMHBjaV9ydDJ4MDBfb3BzID0gewogCS5pcnFfaGFuZGxlcgkJPSBydDI1MDBwY2lfaW50ZXJydXB0LAorCS5pcnFfaGFuZGxlcl90aHJlYWQJPSBydDI1MDBwY2lfaW50ZXJydXB0X3RocmVhZCwKIAkucHJvYmVfaHcJCT0gcnQyNTAwcGNpX3Byb2JlX2h3LAogCS5pbml0aWFsaXplCQk9IHJ0MngwMHBjaV9pbml0aWFsaXplLAogCS51bmluaXRpYWxpemUJCT0gcnQyeDAwcGNpX3VuaW5pdGlhbGl6ZSwKQEAgLTE4ODMsNyArMTkwNyw2IEBACiAJLnJlc2V0X3R1bmVyCQk9IHJ0MjUwMHBjaV9yZXNldF90dW5lciwKIAkubGlua190dW5lcgkJPSBydDI1MDBwY2lfbGlua190dW5lciwKIAkud3JpdGVfdHhfZGVzYwkJPSBydDI1MDBwY2lfd3JpdGVfdHhfZGVzYywKLQkud3JpdGVfdHhfZGF0YQkJPSBydDJ4MDBwY2lfd3JpdGVfdHhfZGF0YSwKIAkud3JpdGVfYmVhY29uCQk9IHJ0MjUwMHBjaV93cml0ZV9iZWFjb24sCiAJLmtpY2tfdHhfcXVldWUJCT0gcnQyNTAwcGNpX2tpY2tfdHhfcXVldWUsCiAJLmtpbGxfdHhfcXVldWUJCT0gcnQyNTAwcGNpX2tpbGxfdHhfcXVldWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMKaW5kZXggOWFlOTZhNi4uY2RhZjkzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYwpAQCAtMzQ1LDEyICszNDUsMjAgQEAKIAkJCQlzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byAqY3J5cHRvLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKIHsKLQlpbnQgdGltZW91dDsKIAl1MzIgbWFzazsKIAl1MTYgcmVnOworCWVudW0gY2lwaGVyIGN1cnJfY2lwaGVyOwogCiAJaWYgKGNyeXB0by0+Y21kID09IFNFVF9LRVkpIHsKIAkJLyoKKwkJICogRGlzYWxsb3cgdG8gc2V0IFdFUCBrZXkgb3RoZXIgdGhhbiB3aXRoIGluZGV4IDAsCisJCSAqIGl0IGlzIGtub3duIHRoYXQgbm90IHdvcmsgYXQgbGVhc3Qgb24gc29tZSBoYXJkd2FyZS4KKwkJICogU1cgY3J5cHRvIHdpbGwgYmUgdXNlZCBpbiB0aGF0IGNhc2UuCisJCSAqLworCQlpZiAoa2V5LT5hbGcgPT0gQUxHX1dFUCAmJiBrZXktPmtleWlkeCAhPSAwKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCS8qCiAJCSAqIFBhaXJ3aXNlIGtleSB3aWxsIGFsd2F5cyBiZSBlbnRyeSAwLCBidXQgdGhpcwogCQkgKiBjb3VsZCBjb2xsaWRlIHdpdGggYSBzaGFyZWQga2V5IG9uIHRoZSBzYW1lCiAJCSAqIHBvc2l0aW9uLi4uCkBAIC0zNTgsNiArMzY2LDcgQEAKIAkJbWFzayA9IFRYUlhfQ1NSMF9LRVlfSUQuYml0X21hc2s7CiAKIAkJcnQyNTAwdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWFJYX0NTUjAsICZyZWcpOworCQljdXJyX2NpcGhlciA9IHJ0MngwMF9nZXRfZmllbGQxNihyZWcsIFRYUlhfQ1NSMF9BTEdPUklUSE0pOwogCQlyZWcgJj0gbWFzazsKIAogCQlpZiAocmVnICYmIHJlZyA9PSBtYXNrKQpAQCAtMzY2LDE5ICszNzUsMTcgQEAKIAkJcmVnID0gcnQyeDAwX2dldF9maWVsZDE2KHJlZywgVFhSWF9DU1IwX0tFWV9JRCk7CiAKIAkJa2V5LT5od19rZXlfaWR4ICs9IHJlZyA/IGZmeihyZWcpIDogMDsKLQogCQkvKgotCQkgKiBUaGUgZW5jcnlwdGlvbiBrZXkgZG9lc24ndCBmaXQgd2l0aGluIHRoZSBDU1IgY2FjaGUsCi0JCSAqIHRoaXMgbWVhbnMgd2Ugc2hvdWxkIGFsbG9jYXRlIGl0IHNlcGFyYXRlbHkgYW5kIHVzZQotCQkgKiBydDJ4MDB1c2JfdmVuZG9yX3JlcXVlc3QoKSB0byBzZW5kIHRoZSBrZXkgdG8gdGhlIGhhcmR3YXJlLgorCQkgKiBIYXJkd2FyZSByZXF1aXJlcyB0aGF0IGFsbCBrZXlzIHVzZSB0aGUgc2FtZSBjaXBoZXIKKwkJICogKGUuZy4gVEtJUC1vbmx5LCBBRVMtb25seSwgYnV0IG5vdCBUS0lQK0FFUykuCisJCSAqIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBrZXksIGNvbXBhcmUgdGhlIGNpcGhlciB3aXRoIHRoZQorCQkgKiBmaXJzdCBvbmUgYW5kIGZhbGwgYmFjayB0byBTVyBjcnlwdG8gaWYgbm90IHRoZSBzYW1lLgogCQkgKi8KLQkJcmVnID0gS0VZX0VOVFJZKGtleS0+aHdfa2V5X2lkeCk7Ci0JCXRpbWVvdXQgPSBSRUdJU1RFUl9USU1FT1VUMzIoc2l6ZW9mKGNyeXB0by0+a2V5KSk7Ci0JCXJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9sYXJnZV9idWZmKHJ0MngwMGRldiwgVVNCX01VTFRJX1dSSVRFLAotCQkJCQkJICAgIFVTQl9WRU5ET1JfUkVRVUVTVF9PVVQsIHJlZywKLQkJCQkJCSAgICBjcnlwdG8tPmtleSwKLQkJCQkJCSAgICBzaXplb2YoY3J5cHRvLT5rZXkpLAotCQkJCQkJICAgIHRpbWVvdXQpOworCQlpZiAoa2V5LT5od19rZXlfaWR4ID4gMCAmJiBjcnlwdG8tPmNpcGhlciAhPSBjdXJyX2NpcGhlcikKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQlydDI1MDB1c2JfcmVnaXN0ZXJfbXVsdGl3cml0ZShydDJ4MDBkZXYsIEtFWV9FTlRSWShrZXktPmh3X2tleV9pZHgpLAorCQkJCQkgICAgICBjcnlwdG8tPmtleSwgc2l6ZW9mKGNyeXB0by0+a2V5KSk7CiAKIAkJLyoKIAkJICogVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJVi9FSVYgZ2VuZXJhdGlvbgpAQCAtODE4LDYgKzgyNSw3IEBACiAJcnQyNTAwdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgTUFDX0NTUjgsIHJlZyk7CiAKIAlydDI1MDB1c2JfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYUlhfQ1NSMCwgJnJlZyk7CisJcnQyeDAwX3NldF9maWVsZDE2KCZyZWcsIFRYUlhfQ1NSMF9BTEdPUklUSE0sIENJUEhFUl9OT05FKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMTYoJnJlZywgVFhSWF9DU1IwX0lWX09GRlNFVCwgSUVFRTgwMjExX0hFQURFUik7CiAJcnQyeDAwX3NldF9maWVsZDE2KCZyZWcsIFRYUlhfQ1NSMF9LRVlfSUQsIDApOwogCXJ0MjUwMHVzYl9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYUlhfQ1NSMCwgcmVnKTsKQEAgLTEwMDUsNyArMTAxMyw5IEBACiAJCXJ0MjUwMHVzYl90b2dnbGVfcngocnQyeDAwZGV2LCBzdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgU1RBVEVfUkFESU9fSVJRX09OOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09OX0lTUjoKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PRkY6CisJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGX0lTUjoKIAkJLyogTm8gc3VwcG9ydCwgYnV0IG5vIGVycm9yIGVpdGhlciAqLwogCQlicmVhazsKIAljYXNlIFNUQVRFX0RFRVBfU0xFRVA6CkBAIC0xMDM0LDcgKzEwNDQsNyBAQAogCQkJCSAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpCiB7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKHNrYik7Ci0JX19sZTMyICp0eGQgPSAoX19sZTMyICopKHNrYi0+ZGF0YSAtIFRYRF9ERVNDX1NJWkUpOworCV9fbGUzMiAqdHhkID0gKF9fbGUzMiAqKSBza2ItPmRhdGE7CiAJdTMyIHdvcmQ7CiAKIAkvKgpAQCAtMTA4MCw2ICsxMDkwLDcgQEAKIAkvKgogCSAqIFJlZ2lzdGVyIGRlc2NyaXB0b3IgZGV0YWlscyBpbiBza2IgZnJhbWUgZGVzY3JpcHRvci4KIAkgKi8KKwlza2JkZXNjLT5mbGFncyB8PSBTS0JERVNDX0RFU0NfSU5fU0tCOwogCXNrYmRlc2MtPmRlc2MgPSB0eGQ7CiAJc2tiZGVzYy0+ZGVzY19sZW4gPSBUWERfREVTQ19TSVpFOwogfQpAQCAtMTEwOCw5ICsxMTE5LDIwIEBACiAJcnQyNTAwdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1IxOSwgcmVnKTsKIAogCS8qCi0JICogVGFrZSB0aGUgZGVzY3JpcHRvciBpbiBmcm9udCBvZiB0aGUgc2tiIGludG8gYWNjb3VudC4KKwkgKiBBZGQgc3BhY2UgZm9yIHRoZSBkZXNjcmlwdG9yIGluIGZyb250IG9mIHRoZSBza2IuCiAJICovCiAJc2tiX3B1c2goZW50cnktPnNrYiwgVFhEX0RFU0NfU0laRSk7CisJbWVtc2V0KGVudHJ5LT5za2ItPmRhdGEsIDAsIFRYRF9ERVNDX1NJWkUpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgVFggZGVzY3JpcHRvciBmb3IgdGhlIGJlYWNvbi4KKwkgKi8KKwlydDI1MDB1c2Jfd3JpdGVfdHhfZGVzYyhydDJ4MDBkZXYsIGVudHJ5LT5za2IsIHR4ZGVzYyk7CisKKwkvKgorCSAqIER1bXAgYmVhY29uIHRvIHVzZXJzcGFjZSB0aHJvdWdoIGRlYnVnZnMuCisJICovCisJcnQyeDAwZGVidWdfZHVtcF9mcmFtZShydDJ4MDBkZXYsIERVTVBfRlJBTUVfQkVBQ09OLCBlbnRyeS0+c2tiKTsKIAogCS8qCiAJICogVVNCIGRldmljZXMgY2Fubm90IGJsaW5kbHkgcGFzcyB0aGUgc2tiLT5sZW4gYXMgdGhlCkBAIC0xNDYwLDEzICsxNDgyLDYgQEAKIAkJX19zZXRfYml0KENPTkZJR19TVVBQT1JUX0hXX0JVVFRPTiwgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKLQkgKiBDaGVjayBpZiB0aGUgQkJQIHR1bmluZyBzaG91bGQgYmUgZGlzYWJsZWQuCi0JICovCi0JcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX05JQywgJmVlcHJvbSk7Ci0JaWYgKHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9OSUNfRFlOX0JCUF9UVU5FKSkKLQkJX19zZXRfYml0KENPTkZJR19ESVNBQkxFX0xJTktfVFVOSU5HLCAmcnQyeDAwZGV2LT5mbGFncyk7Ci0KLQkvKgogCSAqIFJlYWQgdGhlIFJTU0kgPC0+IGRCbSBvZmZzZXQgaW5mb3JtYXRpb24uCiAJICovCiAJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQsICZlZXByb20pOwpAQCAtMTczMiw3ICsxNzQ3LDcgQEAKIAkJX19zZXRfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCQlfX3NldF9iaXQoRFJJVkVSX1JFUVVJUkVfQ09QWV9JViwgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCX0KLQlfX3NldF9iaXQoQ09ORklHX0RJU0FCTEVfTElOS19UVU5JTkcsICZydDJ4MDBkZXYtPmZsYWdzKTsKKwlfX3NldF9iaXQoRFJJVkVSX1NVUFBPUlRfV0FUQ0hET0csICZydDJ4MDBkZXYtPmZsYWdzKTsKIAogCS8qCiAJICogU2V0IHRoZSByc3NpIG9mZnNldC4KQEAgLTE3NTIsNiArMTc2Nyw4IEBACiAJLmNvbmZpZ3VyZV9maWx0ZXIJPSBydDJ4MDBtYWNfY29uZmlndXJlX2ZpbHRlciwKIAkuc2V0X3RpbQkJPSBydDJ4MDBtYWNfc2V0X3RpbSwKIAkuc2V0X2tleQkJPSBydDJ4MDBtYWNfc2V0X2tleSwKKwkuc3dfc2Nhbl9zdGFydAkJPSBydDJ4MDBtYWNfc3dfc2Nhbl9zdGFydCwKKwkuc3dfc2Nhbl9jb21wbGV0ZQk9IHJ0MngwMG1hY19zd19zY2FuX2NvbXBsZXRlLAogCS5nZXRfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF9zdGF0cywKIAkuYnNzX2luZm9fY2hhbmdlZAk9IHJ0MngwMG1hY19ic3NfaW5mb19jaGFuZ2VkLAogCS5jb25mX3R4CQk9IHJ0MngwMG1hY19jb25mX3R4LApAQCAtMTc2Nyw4ICsxNzg0LDggQEAKIAkucmZraWxsX3BvbGwJCT0gcnQyNTAwdXNiX3Jma2lsbF9wb2xsLAogCS5saW5rX3N0YXRzCQk9IHJ0MjUwMHVzYl9saW5rX3N0YXRzLAogCS5yZXNldF90dW5lcgkJPSBydDI1MDB1c2JfcmVzZXRfdHVuZXIsCisJLndhdGNoZG9nCQk9IHJ0MngwMHVzYl93YXRjaGRvZywKIAkud3JpdGVfdHhfZGVzYwkJPSBydDI1MDB1c2Jfd3JpdGVfdHhfZGVzYywKLQkud3JpdGVfdHhfZGF0YQkJPSBydDJ4MDB1c2Jfd3JpdGVfdHhfZGF0YSwKIAkud3JpdGVfYmVhY29uCQk9IHJ0MjUwMHVzYl93cml0ZV9iZWFjb24sCiAJLmdldF90eF9kYXRhX2xlbgk9IHJ0MjUwMHVzYl9nZXRfdHhfZGF0YV9sZW4sCiAJLmtpY2tfdHhfcXVldWUJCT0gcnQyeDAwdXNiX2tpY2tfdHhfcXVldWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwLmgKaW5kZXggMmFhMDM3NS4uZWQ0ZWJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDAuaApAQCAtNjMsNyArNjMsNiBAQAogICovCiAjZGVmaW5lIFJFVl9SVDI4NjBDCQkJMHgwMTAwCiAjZGVmaW5lIFJFVl9SVDI4NjBECQkJMHgwMTAxCi0jZGVmaW5lIFJFVl9SVDI4NzBECQkJMHgwMTAxCiAjZGVmaW5lIFJFVl9SVDI4NzJFCQkJMHgwMjAwCiAjZGVmaW5lIFJFVl9SVDMwNzBFCQkJMHgwMjAwCiAjZGVmaW5lIFJFVl9SVDMwNzBGCQkJMHgwMjAxCkBAIC03NSw3ICs3NCw3IEBACiAgKiBTaWduYWwgaW5mb3JtYXRpb24uCiAgKiBEZWZhdWx0IG9mZnNldCBpcyByZXF1aXJlZCBmb3IgUlNTSSA8LT4gZEJtIGNvbnZlcnNpb24uCiAgKi8KLSNkZWZpbmUgREVGQVVMVF9SU1NJX09GRlNFVAkJMTIwIC8qIEZJWE1FICovCisjZGVmaW5lIERFRkFVTFRfUlNTSV9PRkZTRVQJCTEyMAogCiAvKgogICogUmVnaXN0ZXIgbGF5b3V0IGluZm9ybWF0aW9uLgpAQCAtOTksNiArOTgsMjEgQEAKICAqLwogCiAvKgorICogRTJQUk9NX0NTUjogUENJIEVFUFJPTSBjb250cm9sIHJlZ2lzdGVyLgorICogUkVMT0FEOiBXcml0ZSAxIHRvIHJlbG9hZCBlZXByb20gY29udGVudC4KKyAqIFRZUEU6IDA6IDkzYzQ2LCAxOjkzYzY2LgorICogTE9BRF9TVEFUVVM6IDE6bG9hZGluZywgMDpkb25lLgorICovCisjZGVmaW5lIEUyUFJPTV9DU1IJCQkweDAwMDQKKyNkZWZpbmUgRTJQUk9NX0NTUl9EQVRBX0NMT0NLCQlGSUVMRDMyKDB4MDAwMDAwMDEpCisjZGVmaW5lIEUyUFJPTV9DU1JfQ0hJUF9TRUxFQ1QJCUZJRUxEMzIoMHgwMDAwMDAwMikKKyNkZWZpbmUgRTJQUk9NX0NTUl9EQVRBX0lOCQlGSUVMRDMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIEUyUFJPTV9DU1JfREFUQV9PVVQJCUZJRUxEMzIoMHgwMDAwMDAwOCkKKyNkZWZpbmUgRTJQUk9NX0NTUl9UWVBFCQkJRklFTEQzMigweDAwMDAwMDMwKQorI2RlZmluZSBFMlBST01fQ1NSX0xPQURfU1RBVFVTCQlGSUVMRDMyKDB4MDAwMDAwNDApCisjZGVmaW5lIEUyUFJPTV9DU1JfUkVMT0FECQlGSUVMRDMyKDB4MDAwMDAwODApCisKKy8qCiAgKiBPUFRfMTQ6IFVua25vd24gcmVnaXN0ZXIgdXNlZCBieSBydDN4eHggZGV2aWNlcy4KICAqLwogI2RlZmluZSBPUFRfMTRfQ1NSCQkJMHgwMTE0CkBAIC0zMjIsNiArMzM2LDM5IEBACiAjZGVmaW5lIFJYX0RSWF9JRFgJCQkweDAyOWMKIAogLyoKKyAqIFVTQl9ETUFfQ0ZHCisgKiBSWF9CVUxLX0FHR19USU1FT1VUOiBSeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgaW4gdW5pdCBvZiAzM25zLgorICogUlhfQlVMS19BR0dfTElNSVQ6IFJ4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgaW4gdW5pdCBvZiAyNTYgYnl0ZXMuCisgKiBQSFlfQ0xFQVI6IHBoeSB3YXRjaCBkb2cgZW5hYmxlLgorICogVFhfQ0xFQVI6IENsZWFyIFVTQiBETUEgVFggcGF0aC4KKyAqIFRYT1BfSEFMVDogSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KKyAqIFJYX0JVTEtfQUdHX0VOOiBFbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbi4KKyAqIFJYX0JVTEtfRU46IEVuYWJsZSBVU0IgRE1BIFJ4LgorICogVFhfQlVMS19FTjogRW5hYmxlIFVTQiBETUEgVHguCisgKiBFUF9PVVRfVkFMSUQ6IE9VVCBlbmRwb2ludCBkYXRhIHZhbGlkLgorICogUlhfQlVTWTogVVNCIERNQSBSWCBGU00gYnVzeS4KKyAqIFRYX0JVU1k6IFVTQiBETUEgVFggRlNNIGJ1c3kuCisgKi8KKyNkZWZpbmUgVVNCX0RNQV9DRkcJCQkweDAyYTAKKyNkZWZpbmUgVVNCX0RNQV9DRkdfUlhfQlVMS19BR0dfVElNRU9VVAlGSUVMRDMyKDB4MDAwMDAwZmYpCisjZGVmaW5lIFVTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX0xJTUlUCUZJRUxEMzIoMHgwMDAwZmYwMCkKKyNkZWZpbmUgVVNCX0RNQV9DRkdfUEhZX0NMRUFSCQlGSUVMRDMyKDB4MDAwMTAwMDApCisjZGVmaW5lIFVTQl9ETUFfQ0ZHX1RYX0NMRUFSCQlGSUVMRDMyKDB4MDAwODAwMDApCisjZGVmaW5lIFVTQl9ETUFfQ0ZHX1RYT1BfSEFMVAkJRklFTEQzMigweDAwMTAwMDAwKQorI2RlZmluZSBVU0JfRE1BX0NGR19SWF9CVUxLX0FHR19FTglGSUVMRDMyKDB4MDAyMDAwMDApCisjZGVmaW5lIFVTQl9ETUFfQ0ZHX1JYX0JVTEtfRU4JCUZJRUxEMzIoMHgwMDQwMDAwMCkKKyNkZWZpbmUgVVNCX0RNQV9DRkdfVFhfQlVMS19FTgkJRklFTEQzMigweDAwODAwMDAwKQorI2RlZmluZSBVU0JfRE1BX0NGR19FUF9PVVRfVkFMSUQJRklFTEQzMigweDNmMDAwMDAwKQorI2RlZmluZSBVU0JfRE1BX0NGR19SWF9CVVNZCQlGSUVMRDMyKDB4NDAwMDAwMDApCisjZGVmaW5lIFVTQl9ETUFfQ0ZHX1RYX0JVU1kJCUZJRUxEMzIoMHg4MDAwMDAwMCkKKworLyoKKyAqIFVTX0NZQ19DTlQKKyAqLworI2RlZmluZSBVU19DWUNfQ05UCQkJMHgwMmE0CisjZGVmaW5lIFVTX0NZQ19DTlRfQ0xPQ0tfQ1lDTEUJCUZJRUxEMzIoMHgwMDAwMDBmZikKKworLyoKICAqIFBCRl9TWVNfQ1RSTAogICogSE9TVF9SQU1fV1JJVEU6IGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbgogICovCkBAIC02NzIsMTQgKzcxOSwyMCBAQAogI2RlZmluZSBUQlRUX1RJTUVSCQkJMHgxMTI0CiAKIC8qCi0gKiBJTlRfVElNRVJfQ0ZHOgorICogSU5UX1RJTUVSX0NGRzogdGltZXIgY29uZmlndXJhdGlvbgorICogUFJFX1RCVFRfVElNRVI6IGxlYWR0aW1lIHRvIHRidHQgZm9yIHByZXRidHQgaW50ZXJydXB0IGluIHVuaXRzIG9mIDEvMTYgVFUKKyAqIEdQX1RJTUVSOiBwZXJpb2Qgb2YgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIGluIHVuaXRzIG9mIDEvMTYgVFUKICAqLwogI2RlZmluZSBJTlRfVElNRVJfQ0ZHCQkJMHgxMTI4CisjZGVmaW5lIElOVF9USU1FUl9DRkdfUFJFX1RCVFRfVElNRVIJRklFTEQzMigweDAwMDBmZmZmKQorI2RlZmluZSBJTlRfVElNRVJfQ0ZHX0dQX1RJTUVSCQlGSUVMRDMyKDB4ZmZmZjAwMDApCiAKIC8qCiAgKiBJTlRfVElNRVJfRU46IEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlCiAgKi8KICNkZWZpbmUgSU5UX1RJTUVSX0VOCQkJMHgxMTJjCisjZGVmaW5lIElOVF9USU1FUl9FTl9QUkVfVEJUVF9USU1FUglGSUVMRDMyKDB4MDAwMDAwMDEpCisjZGVmaW5lIElOVF9USU1FUl9FTl9HUF9USU1FUgkJRklFTEQzMigweDAwMDAwMDAyKQogCiAvKgogICogQ0hfSURMRV9TVEE6IGNoYW5uZWwgaWRsZSB0aW1lCkBAIC03NTYsNiArODA5LDE4IEBACiAjZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkJCTB4MTMxMAogCiAvKgorICogVFhfUFdSX0NGRzoKKyAqLworI2RlZmluZSBUWF9QV1JfQ0ZHX1JBVEUwCQlGSUVMRDMyKDB4MDAwMDAwMGYpCisjZGVmaW5lIFRYX1BXUl9DRkdfUkFURTEJCUZJRUxEMzIoMHgwMDAwMDBmMCkKKyNkZWZpbmUgVFhfUFdSX0NGR19SQVRFMgkJRklFTEQzMigweDAwMDAwZjAwKQorI2RlZmluZSBUWF9QV1JfQ0ZHX1JBVEUzCQlGSUVMRDMyKDB4MDAwMGYwMDApCisjZGVmaW5lIFRYX1BXUl9DRkdfUkFURTQJCUZJRUxEMzIoMHgwMDBmMDAwMCkKKyNkZWZpbmUgVFhfUFdSX0NGR19SQVRFNQkJRklFTEQzMigweDAwZjAwMDAwKQorI2RlZmluZSBUWF9QV1JfQ0ZHX1JBVEU2CQlGSUVMRDMyKDB4MGYwMDAwMDApCisjZGVmaW5lIFRYX1BXUl9DRkdfUkFURTcJCUZJRUxEMzIoMHhmMDAwMDAwMCkKKworLyoKICAqIFRYX1BXUl9DRkdfMDoKICAqLwogI2RlZmluZSBUWF9QV1JfQ0ZHXzAJCQkweDEzMTQKQEAgLTEzNzAsMTcgKzE0MzUsMTcgQEAKIHN0cnVjdCBtYWNfd2NpZF9lbnRyeSB7CiAJdTggbWFjWzZdOwogCXU4IHJlc2VydmVkWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaHdfa2V5X2VudHJ5IHsKIAl1OCBrZXlbMTZdOwogCXU4IHR4X21pY1s4XTsKIAl1OCByeF9taWNbOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBtYWNfaXZlaXZfZW50cnkgewogCXU4IGl2WzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogTUFDX1dDSURfQVRUUklCVVRFOgpAQCAtMTM4OSw2ICsxNDU0LDEwIEBACiAjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9DSVBIRVIJRklFTEQzMigweDAwMDAwMDBlKQogI2RlZmluZSBNQUNfV0NJRF9BVFRSSUJVVEVfQlNTX0lEWAlGSUVMRDMyKDB4MDAwMDAwNzApCiAjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9SWF9XSVVERglGSUVMRDMyKDB4MDAwMDAzODApCisjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9DSVBIRVJfRVhUCUZJRUxEMzIoMHgwMDAwMDQwMCkKKyNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JTU19JRFhfRVhUCUZJRUxEMzIoMHgwMDAwMDgwMCkKKyNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX1dBUElfTUNCQwlGSUVMRDMyKDB4MDAwMDgwMDApCisjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9XQVBJX0tFWV9JRFgJRklFTEQzMigweGZmMDAwMDAwKQogCiAvKgogICogU0hBUkVEX0tFWV9NT0RFOgpAQCAtMTUxMCw3ICsxNTc5LDkgQEAKICAqLwogCiAvKgotICogQkJQIDE6IFRYIEFudGVubmEKKyAqIEJCUCAxOiBUWCBBbnRlbm5hICYgUG93ZXIKKyAqIFBPV0VSOiAwIC0gbm9ybWFsLCAxIC0gZHJvcCB0eCBwb3dlciBieSA2ZEJtLCAyIC0gZHJvcCB0eCBwb3dlciBieSAxMmRCbSwKKyAqCTMgLSBpbmNyZWFzZSB0eCBwb3dlciBieSA2ZEJtCiAgKi8KICNkZWZpbmUgQkJQMV9UWF9QT1dFUgkJCUZJRUxEOCgweDA3KQogI2RlZmluZSBCQlAxX1RYX0FOVEVOTkEJCQlGSUVMRDgoMHgxOCkKQEAgLTE4MDAsOSArMTg3MSwxNSBAQAogI2RlZmluZSBFRVBST01fVFhQT1dFUl9BXzIJCUZJRUxEMTYoMHhmZjAwKQogCiAvKgotICogRUVQUk9NIFRYcG93ZXIgYnlyYXRlOiAyME1IWiBwb3dlcgorICogRUVQUk9NIFRYUE9XRVIgYnkgcmF0ZTogdHggcG93ZXIgcGVyIHR4IHJhdGUgZm9yIEhUMjAgbW9kZQogICovCiAjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURQkJMHgwMDZmCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV9TSVpFCTkKKworI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfUkFURTAJRklFTEQxNigweDAwMGYpCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV9SQVRFMQlGSUVMRDE2KDB4MDBmMCkKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFX1JBVEUyCUZJRUxEMTYoMHgwZjAwKQorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfUkFURTMJRklFTEQxNigweGYwMDApCiAKIC8qCiAgKiBFRVBST00gQkJQLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCmluZGV4IGRiNDI1MGQuLmI2NmUwZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKQEAgLTEsOSArMSw5IEBACiAvKgorCUNvcHlyaWdodCAoQykgMjAxMCBJdm8gdmFuIERvb3JuIDxJdkRvb3JuQGdtYWlsLmNvbT4KIAlDb3B5cmlnaHQgKEMpIDIwMDkgQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8YnpvbG5pZXJAZ21haWwuY29tPgogCUNvcHlyaWdodCAoQykgMjAwOSBHZXJ0amFuIHZhbiBXaW5nZXJkZSA8Z3dpbmdlcmRlQGdtYWlsLmNvbT4KIAogCUJhc2VkIG9uIHRoZSBvcmlnaW5hbCBydDI4MDBwY2kuYyBhbmQgcnQyODAwdXNiLmMuCi0JICBDb3B5cmlnaHQgKEMpIDIwMDkgSXZvIHZhbiBEb29ybiA8SXZEb29ybkBnbWFpbC5jb20+CiAJICBDb3B5cmlnaHQgKEMpIDIwMDkgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CiAJICBDb3B5cmlnaHQgKEMpIDIwMDkgRmVsaXggRmlldGthdSA8bmJkQG9wZW53cnQub3JnPgogCSAgQ29weXJpZ2h0IChDKSAyMDA5IEx1aXMgQ29ycmVpYSA8bHVpcy5mLmNvcnJlaWFAZ21haWwuY29tPgpAQCAtMzMsMjEgKzMzLDE0IEBACiAJQWJzdHJhY3Q6IHJ0MjgwMCBnZW5lcmljIGRldmljZSByb3V0aW5lcy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAicnQyeDAwLmgiCi0jaWYgZGVmaW5lZChDT05GSUdfUlQyWDAwX0xJQl9VU0IpIHx8IGRlZmluZWQoQ09ORklHX1JUMlgwMF9MSUJfVVNCX01PRFVMRSkKLSNpbmNsdWRlICJydDJ4MDB1c2IuaCIKLSNlbmRpZgogI2luY2x1ZGUgInJ0MjgwMGxpYi5oIgogI2luY2x1ZGUgInJ0MjgwMC5oIgotI2luY2x1ZGUgInJ0MjgwMHVzYi5oIgotCi1NT0RVTEVfQVVUSE9SKCJCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInJ0MjgwMCBsaWJyYXJ5Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIC8qCiAgKiBSZWdpc3RlciBhY2Nlc3MuCkBAIC0xMDcsOCArMTAwLDcgQEAKIAkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJCUF9DU1JfQ0ZHX1JFR05VTSwgd29yZCk7CiAJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQlBfQ1NSX0NGR19CVVNZLCAxKTsKIAkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJCUF9DU1JfQ0ZHX1JFQURfQ09OVFJPTCwgMCk7Ci0JCWlmIChydDJ4MDBfaXNfcGNpKHJ0MngwMGRldikgfHwgcnQyeDAwX2lzX3NvYyhydDJ4MDBkZXYpKQotCQkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJCUF9DU1JfQ0ZHX0JCUF9SV19NT0RFLCAxKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJCUF9DU1JfQ0ZHX0JCUF9SV19NT0RFLCAxKTsKIAogCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGVfbG9jayhydDJ4MDBkZXYsIEJCUF9DU1JfQ0ZHLCByZWcpOwogCX0KQEAgLTEzNiw4ICsxMjgsNyBAQAogCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkJQX0NTUl9DRkdfUkVHTlVNLCB3b3JkKTsKIAkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJCUF9DU1JfQ0ZHX0JVU1ksIDEpOwogCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkJQX0NTUl9DRkdfUkVBRF9DT05UUk9MLCAxKTsKLQkJaWYgKHJ0MngwMF9pc19wY2kocnQyeDAwZGV2KSB8fCBydDJ4MDBfaXNfc29jKHJ0MngwMGRldikpCi0JCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkJQX0NTUl9DRkdfQkJQX1JXX01PREUsIDEpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkJQX0NTUl9DRkdfQkJQX1JXX01PREUsIDEpOwogCiAJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZV9sb2NrKHJ0MngwMGRldiwgQkJQX0NTUl9DRkcsIHJlZyk7CiAKQEAgLTI4Miw5ICsyNzMsMTYyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDI4MDBfd2FpdF93cGRtYV9yZWFkeSk7CiAKLXZvaWQgcnQyODAwX3dyaXRlX3R4d2koc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQorc3RhdGljIGJvb2wgcnQyODAwX2NoZWNrX2Zpcm13YXJlX2NyYyhjb25zdCB1OCAqZGF0YSwgY29uc3Qgc2l6ZV90IGxlbikKIHsKLQlfX2xlMzIgKnR4d2kgPSAoX19sZTMyICopKHNrYi0+ZGF0YSAtIFRYV0lfREVTQ19TSVpFKTsKKwl1MTYgZndfY3JjOworCXUxNiBjcmM7CisKKwkvKgorCSAqIFRoZSBsYXN0IDIgYnl0ZXMgaW4gdGhlIGZpcm13YXJlIGFycmF5IGFyZSB0aGUgY3JjIGNoZWNrc3VtIGl0c2VsZiwKKwkgKiB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5ldmVyIHBhc3MgdGhvc2UgMiBieXRlcyB0byB0aGUgY3JjCisJICogYWxnb3JpdGhtLgorCSAqLworCWZ3X2NyYyA9IChkYXRhW2xlbiAtIDJdIDw8IDggfCBkYXRhW2xlbiAtIDFdKTsKKworCS8qCisJICogVXNlIHRoZSBjcmMgY2NpdHQgYWxnb3JpdGhtLgorCSAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGxlZ2FjeSBkcml2ZXIgd2hpY2gKKwkgKiB1c2VkIGJpdCBvcmRlcmluZyByZXZlcnNpb24gb24gdGhlIGJvdGggdGhlIGZpcm13YXJlIGJ5dGVzCisJICogYmVmb3JlIGlucHV0IGlucHV0IGFzIHdlbGwgYXMgb24gdGhlIGZpbmFsIG91dHB1dC4KKwkgKiBPYnZpb3VzbHkgdXNpbmcgY3JjIGNjaXR0IGRpcmVjdGx5IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQuCisJICovCisJY3JjID0gY3JjX2NjaXR0KH4wLCBkYXRhLCBsZW4gLSAyKTsKKworCS8qCisJICogVGhlcmUgaXMgYSBzbWFsbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNyYy1pdHUtdCArIGJpdHJldiBhbmQKKwkgKiB0aGUgY3JjLWNjaXR0IGNyYyBjYWxjdWxhdGlvbi4gSW4gdGhlIGxhdHRlciBtZXRob2QgdGhlIDIgYnl0ZXMKKwkgKiB3aWxsIGJlIHN3YXBwZWQsIHVzZSBzd2FiMTYgdG8gY29udmVydCB0aGUgY3JjIHRvIHRoZSBjb3JyZWN0CisJICogdmFsdWUuCisJICovCisJY3JjID0gc3dhYjE2KGNyYyk7CisKKwlyZXR1cm4gZndfY3JjID09IGNyYzsKK30KKworaW50IHJ0MjgwMF9jaGVja19maXJtd2FyZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJICBjb25zdCB1OCAqZGF0YSwgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwlzaXplX3Qgb2Zmc2V0ID0gMDsKKwlzaXplX3QgZndfbGVuOworCWJvb2wgbXVsdGlwbGU7CisKKwkvKgorCSAqIFBDSShlKSAmIFNPQyBkZXZpY2VzIHJlcXVpcmUgZmlybXdhcmUgd2l0aCBhIGxlbmd0aAorCSAqIG9mIDhrYi4gVVNCIGRldmljZXMgcmVxdWlyZSBmaXJtd2FyZSBmaWxlcyB3aXRoIGEgbGVuZ3RoCisJICogb2YgNGtiLiBDZXJ0YWluIFVTQiBjaGlwc2V0cyBob3dldmVyIHJlcXVpcmUgZGlmZmVyZW50IGZpcm13YXJlLAorCSAqIHdoaWNoIFJhbGluayBvbmx5IHByb3ZpZGVzIGF0dGFjaGVkIHRvIHRoZSBvcmlnaW5hbCBmaXJtd2FyZQorCSAqIGZpbGUuIFRodXMgZm9yIFVTQiBkZXZpY2VzLCBmaXJtd2FyZSBmaWxlcyBoYXZlIGEgbGVuZ3RoCisJICogd2hpY2ggaXMgYSBtdWx0aXBsZSBvZiA0a2IuCisJICovCisJaWYgKHJ0MngwMF9pc191c2IocnQyeDAwZGV2KSkgeworCQlmd19sZW4gPSA0MDk2OworCQltdWx0aXBsZSA9IHRydWU7CisJfSBlbHNlIHsKKwkJZndfbGVuID0gODE5MjsKKwkJbXVsdGlwbGUgPSB0cnVlOworCX0KKworCS8qCisJICogVmFsaWRhdGUgdGhlIGZpcm13YXJlIGxlbmd0aAorCSAqLworCWlmIChsZW4gIT0gZndfbGVuICYmICghbXVsdGlwbGUgfHwgKGxlbiAlIGZ3X2xlbikgIT0gMCkpCisJCXJldHVybiBGV19CQURfTEVOR1RIOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgY2hpcHNldCByZXF1aXJlcyBvbmUgb2YgdGhlIHVwcGVyIHBhcnRzCisJICogb2YgdGhlIGZpcm13YXJlLgorCSAqLworCWlmIChydDJ4MDBfaXNfdXNiKHJ0MngwMGRldikgJiYKKwkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMjg2MCkgJiYKKwkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMjg3MikgJiYKKwkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzA3MCkgJiYKKwkgICAgKChsZW4gLyBmd19sZW4pID09IDEpKQorCQlyZXR1cm4gRldfQkFEX1ZFUlNJT047CisKKwkvKgorCSAqIDhrYiBmaXJtd2FyZSBmaWxlcyBtdXN0IGJlIGNoZWNrZWQgYXMgaWYgaXQgd2VyZQorCSAqIDIgc2VwYXJhdGUgZmlybXdhcmUgZmlsZXMuCisJICovCisJd2hpbGUgKG9mZnNldCA8IGxlbikgeworCQlpZiAoIXJ0MjgwMF9jaGVja19maXJtd2FyZV9jcmMoZGF0YSArIG9mZnNldCwgZndfbGVuKSkKKwkJCXJldHVybiBGV19CQURfQ1JDOworCisJCW9mZnNldCArPSBmd19sZW47CisJfQorCisJcmV0dXJuIEZXX09LOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnQyODAwX2NoZWNrX2Zpcm13YXJlKTsKKworaW50IHJ0MjgwMF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkgY29uc3QgdTggKmRhdGEsIGNvbnN0IHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHJlZzsKKworCS8qCisJICogV2FpdCBmb3Igc3RhYmxlIGhhcmR3YXJlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9CVVNZX0NPVU5UOyBpKyspIHsKKwkJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBNQUNfQ1NSMCwgJnJlZyk7CisJCWlmIChyZWcgJiYgcmVnICE9IH4wKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaSA9PSBSRUdJU1RFUl9CVVNZX0NPVU5UKSB7CisJCUVSUk9SKHJ0MngwMGRldiwgIlVuc3RhYmxlIGhhcmR3YXJlLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKHJ0MngwMF9pc19wY2kocnQyeDAwZGV2KSkKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUFdSX1BJTl9DRkcsIDB4MDAwMDAwMDIpOworCisJLyoKKwkgKiBEaXNhYmxlIERNQSwgd2lsbCBiZSByZWVuYWJsZWQgbGF0ZXIgd2hlbiBlbmFibGluZworCSAqIHRoZSByYWRpby4KKwkgKi8KKwlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFdQRE1BX0dMT19DRkcsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9HTE9fQ0ZHX0VOQUJMRV9UWF9ETUEsIDApOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9HTE9fQ0ZHX1RYX0RNQV9CVVNZLCAwKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfR0xPX0NGR19FTkFCTEVfUlhfRE1BLCAwKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfR0xPX0NGR19SWF9ETUFfQlVTWSwgMCk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX0dMT19DRkdfVFhfV1JJVEVCQUNLX0RPTkUsIDEpOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFdQRE1BX0dMT19DRkcsIHJlZyk7CisKKwkvKgorCSAqIFdyaXRlIGZpcm13YXJlIHRvIHRoZSBkZXZpY2UuCisJICovCisJcnQyODAwX2Rydl93cml0ZV9maXJtd2FyZShydDJ4MDBkZXYsIGRhdGEsIGxlbik7CisKKwkvKgorCSAqIFdhaXQgZm9yIGRldmljZSB0byBzdGFiaWxpemUuCisJICovCisJZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX0JVU1lfQ09VTlQ7IGkrKykgeworCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwgJnJlZyk7CisJCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBQQkZfU1lTX0NUUkxfUkVBRFkpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaSA9PSBSRUdJU1RFUl9CVVNZX0NPVU5UKSB7CisJCUVSUk9SKHJ0MngwMGRldiwgIlBCRiBzeXN0ZW0gcmVnaXN0ZXIgbm90IHJlYWR5LlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGZpcm13YXJlLgorCSAqLworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEgyTV9CQlBfQUdFTlQsIDApOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydDI4MDBfbG9hZF9maXJtd2FyZSk7CisKK3ZvaWQgcnQyODAwX3dyaXRlX3R4d2koX19sZTMyICp0eHdpLCBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpCit7CiAJdTMyIHdvcmQ7CiAKIAkvKgpAQCAtMzM2LDkgKzQ4MCw1MyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyODAwX3dyaXRlX3R4d2kpOwogCi12b2lkIHJ0MjgwMF9wcm9jZXNzX3J4d2koc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJ4ZG9uZV9lbnRyeV9kZXNjICpyeGRlc2MpCitzdGF0aWMgaW50IHJ0MjgwMF9hZ2NfdG9fcnNzaShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LCBpbnQgcnh3aV93MikKIHsKLQlfX2xlMzIgKnJ4d2kgPSAoX19sZTMyICopIHNrYi0+ZGF0YTsKKwlpbnQgcnNzaTAgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocnh3aV93MiwgUlhXSV9XMl9SU1NJMCk7CisJaW50IHJzc2kxID0gcnQyeDAwX2dldF9maWVsZDMyKHJ4d2lfdzIsIFJYV0lfVzJfUlNTSTEpOworCWludCByc3NpMiA9IHJ0MngwMF9nZXRfZmllbGQzMihyeHdpX3cyLCBSWFdJX1cyX1JTU0kyKTsKKwl1MTYgZWVwcm9tOworCXU4IG9mZnNldDA7CisJdTggb2Zmc2V0MTsKKwl1OCBvZmZzZXQyOworCisJaWYgKHJ0MngwMGRldi0+cnhfc3RhdHVzLmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgeworCQlydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fUlNTSV9CRywgJmVlcHJvbSk7CisJCW9mZnNldDAgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fUlNTSV9CR19PRkZTRVQwKTsKKwkJb2Zmc2V0MSA9IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX0JHX09GRlNFVDEpOworCQlydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fUlNTSV9CRzIsICZlZXByb20pOworCQlvZmZzZXQyID0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX1JTU0lfQkcyX09GRlNFVDIpOworCX0gZWxzZSB7CisJCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9SU1NJX0EsICZlZXByb20pOworCQlvZmZzZXQwID0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX1JTU0lfQV9PRkZTRVQwKTsKKwkJb2Zmc2V0MSA9IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX0FfT0ZGU0VUMSk7CisJCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9SU1NJX0EyLCAmZWVwcm9tKTsKKwkJb2Zmc2V0MiA9IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX0EyX09GRlNFVDIpOworCX0KKworCS8qCisJICogQ29udmVydCB0aGUgdmFsdWUgZnJvbSB0aGUgZGVzY3JpcHRvciBpbnRvIHRoZSBSU1NJIHZhbHVlCisJICogSWYgdGhlIHZhbHVlIGluIHRoZSBkZXNjcmlwdG9yIGlzIDAsIGl0IGlzIGNvbnNpZGVyZWQgaW52YWxpZAorCSAqIGFuZCB0aGUgZGVmYXVsdCAoZXh0cmVtZWx5IGxvdykgcnNzaSB2YWx1ZSBpcyBhc3N1bWVkCisJICovCisJcnNzaTAgPSAocnNzaTApID8gKC0xMiAtIG9mZnNldDAgLSBydDJ4MDBkZXYtPmxuYV9nYWluIC0gcnNzaTApIDogLTEyODsKKwlyc3NpMSA9IChyc3NpMSkgPyAoLTEyIC0gb2Zmc2V0MSAtIHJ0MngwMGRldi0+bG5hX2dhaW4gLSByc3NpMSkgOiAtMTI4OworCXJzc2kyID0gKHJzc2kyKSA/ICgtMTIgLSBvZmZzZXQyIC0gcnQyeDAwZGV2LT5sbmFfZ2FpbiAtIHJzc2kyKSA6IC0xMjg7CisKKwkvKgorCSAqIG1hYzgwMjExIG9ubHkgYWNjZXB0cyBhIHNpbmdsZSBSU1NJIHZhbHVlLiBDYWxjdWxhdGluZyB0aGUKKwkgKiBhdmVyYWdlIGRvZXNuJ3QgZGVsaXZlciBhIGZhaXIgYW5zd2VyIGVpdGhlciBzaW5jZSAtNjA6LTYwIHdvdWxkCisJICogYmUgY29uc2lkZXJlZCBlcXVhbGx5IGdvb2QgYXMgLTUwOi03MCB3aGlsZSB0aGUgc2Vjb25kIGlzIHRoZSBvbmUKKwkgKiB3aGljaCBnaXZlcyBsZXNzIGVuZXJneS4uLgorCSAqLworCXJzc2kwID0gbWF4KHJzc2kwLCByc3NpMSk7CisJcmV0dXJuIG1heChyc3NpMCwgcnNzaTIpOworfQorCit2b2lkIHJ0MjgwMF9wcm9jZXNzX3J4d2koc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKKwkJCSBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYykKK3sKKwlfX2xlMzIgKnJ4d2kgPSAoX19sZTMyICopIGVudHJ5LT5za2ItPmRhdGE7CiAJdTMyIHdvcmQ7CiAKIAlydDJ4MDBfZGVzY19yZWFkKHJ4d2ksIDAsICZ3b3JkKTsKQEAgLTM2OSwxNyArNTU3LDkzIEBACiAKIAlydDJ4MDBfZGVzY19yZWFkKHJ4d2ksIDIsICZ3b3JkKTsKIAotCXJ4ZGVzYy0+cnNzaSA9Ci0JICAgIChydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgUlhXSV9XMl9SU1NJMCkgKwotCSAgICAgcnQyeDAwX2dldF9maWVsZDMyKHdvcmQsIFJYV0lfVzJfUlNTSTEpKSAvIDI7CisJLyoKKwkgKiBDb252ZXJ0IGRlc2NyaXB0b3IgQUdDIHZhbHVlIHRvIFJTU0kgdmFsdWUuCisJICovCisJcnhkZXNjLT5yc3NpID0gcnQyODAwX2FnY190b19yc3NpKGVudHJ5LT5xdWV1ZS0+cnQyeDAwZGV2LCB3b3JkKTsKIAogCS8qCiAJICogUmVtb3ZlIFJYV0kgZGVzY3JpcHRvciBmcm9tIHN0YXJ0IG9mIGJ1ZmZlci4KIAkgKi8KLQlza2JfcHVsbChza2IsIFJYV0lfREVTQ19TSVpFKTsKKwlza2JfcHVsbChlbnRyeS0+c2tiLCBSWFdJX0RFU0NfU0laRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDI4MDBfcHJvY2Vzc19yeHdpKTsKIAordm9pZCBydDI4MDBfd3JpdGVfYmVhY29uKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKK3sKKwlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7CisJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKGVudHJ5LT5za2IpOworCXVuc2lnbmVkIGludCBiZWFjb25fYmFzZTsKKwl1MzIgcmVnOworCisJLyoKKwkgKiBEaXNhYmxlIGJlYWNvbmluZyB3aGlsZSB3ZSBhcmUgcmVsb2FkaW5nIHRoZSBiZWFjb24gZGF0YSwKKwkgKiBvdGhlcndpc2Ugd2UgbWlnaHQgYmUgc2VuZGluZyBvdXQgaW52YWxpZCBkYXRhLgorCSAqLworCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCAmcmVnKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkNOX1RJTUVfQ0ZHX0JFQUNPTl9HRU4sIDApOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEJDTl9USU1FX0NGRywgcmVnKTsKKworCS8qCisJICogQWRkIHNwYWNlIGZvciB0aGUgVFhXSSBpbiBmcm9udCBvZiB0aGUgc2tiLgorCSAqLworCXNrYl9wdXNoKGVudHJ5LT5za2IsIFRYV0lfREVTQ19TSVpFKTsKKwltZW1zZXQoZW50cnktPnNrYiwgMCwgVFhXSV9ERVNDX1NJWkUpOworCisJLyoKKwkgKiBSZWdpc3RlciBkZXNjcmlwdG9yIGRldGFpbHMgaW4gc2tiIGZyYW1lIGRlc2NyaXB0b3IuCisJICovCisJc2tiZGVzYy0+ZmxhZ3MgfD0gU0tCREVTQ19ERVNDX0lOX1NLQjsKKwlza2JkZXNjLT5kZXNjID0gZW50cnktPnNrYi0+ZGF0YTsKKwlza2JkZXNjLT5kZXNjX2xlbiA9IFRYV0lfREVTQ19TSVpFOworCisJLyoKKwkgKiBBZGQgdGhlIFRYV0kgZm9yIHRoZSBiZWFjb24gdG8gdGhlIHNrYi4KKwkgKi8KKwlydDI4MDBfd3JpdGVfdHh3aSgoX19sZTMyICopZW50cnktPnNrYi0+ZGF0YSwgdHhkZXNjKTsKKworCS8qCisJICogRHVtcCBiZWFjb24gdG8gdXNlcnNwYWNlIHRocm91Z2ggZGVidWdmcy4KKwkgKi8KKwlydDJ4MDBkZWJ1Z19kdW1wX2ZyYW1lKHJ0MngwMGRldiwgRFVNUF9GUkFNRV9CRUFDT04sIGVudHJ5LT5za2IpOworCisJLyoKKwkgKiBXcml0ZSBlbnRpcmUgYmVhY29uIHdpdGggVFhXSSB0byByZWdpc3Rlci4KKwkgKi8KKwliZWFjb25fYmFzZSA9IEhXX0JFQUNPTl9PRkZTRVQoZW50cnktPmVudHJ5X2lkeCk7CisJcnQyODAwX3JlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCBiZWFjb25fYmFzZSwKKwkJCQkgICBlbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5sZW4pOworCisJLyoKKwkgKiBFbmFibGUgYmVhY29uaW5nIGFnYWluLgorCSAqLworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfVFNGX1RJQ0tJTkcsIDEpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfVEJUVF9FTkFCTEUsIDEpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0dFTiwgMSk7CisJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCByZWcpOworCisJLyoKKwkgKiBDbGVhbiB1cCBiZWFjb24gc2tiLgorCSAqLworCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCWVudHJ5LT5za2IgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnQyODAwX3dyaXRlX2JlYWNvbik7CisKK3N0YXRpYyB2b2lkIGlubGluZSBydDI4MDBfY2xlYXJfYmVhY29uKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBiZWFjb25fYmFzZSkKK3sKKwlpbnQgaTsKKworCS8qCisJICogRm9yIHRoZSBCZWFjb24gYmFzZSByZWdpc3RlcnMgd2Ugb25seSBuZWVkIHRvIGNsZWFyCisJICogdGhlIHdob2xlIFRYV0kgd2hpY2ggKHdoZW4gc2V0IHRvIDApIHdpbGwgaW52YWxpZGF0ZQorCSAqIHRoZSBlbnRpcmUgYmVhY29uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBUWFdJX0RFU0NfU0laRTsgaSArPSBzaXplb2YoX19sZTMyKSkKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgYmVhY29uX2Jhc2UgKyBpLCAwKTsKK30KKwogI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMKIGNvbnN0IHN0cnVjdCBydDJ4MDBkZWJ1ZyBydDI4MDBfcnQyeDAwZGVidWcgPSB7CiAJLm93bmVyCT0gVEhJU19NT0RVTEUsCkBAIC01MDIsMTUgKzc2NiwyOCBAQAogCiAJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUl9FTlRSWShrZXktPmh3X2tleV9pZHgpOwogCi0JcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBvZmZzZXQsICZyZWcpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfV0NJRF9BVFRSSUJVVEVfS0VZVEFCLAotCQkJICAgISEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfV0NJRF9BVFRSSUJVVEVfQ0lQSEVSLAotCQkJICAgKGNyeXB0by0+Y21kID09IFNFVF9LRVkpICogY3J5cHRvLT5jaXBoZXIpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfV0NJRF9BVFRSSUJVVEVfQlNTX0lEWCwKLQkJCSAgIChjcnlwdG8tPmNtZCA9PSBTRVRfS0VZKSAqIGNyeXB0by0+YnNzaWR4KTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTUFDX1dDSURfQVRUUklCVVRFX1JYX1dJVURGLCBjcnlwdG8tPmNpcGhlcik7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgb2Zmc2V0LCByZWcpOworCWlmIChjcnlwdG8tPmNtZCA9PSBTRVRfS0VZKSB7CisJCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgb2Zmc2V0LCAmcmVnKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19XQ0lEX0FUVFJJQlVURV9LRVlUQUIsCisJCQkJICAgISEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpOworCQkvKgorCQkgKiBCb3RoIHRoZSBjaXBoZXIgYXMgdGhlIEJTUyBJZHggbnVtYmVycyBhcmUgc3BsaXQgaW4gYSBtYWluCisJCSAqIHZhbHVlIG9mIDMgYml0cywgYW5kIGEgZXh0ZW5kZWQgZmllbGQgZm9yIGFkZGluZyBvbmUgYWRkaXRpb25hbAorCQkgKiBiaXQgdG8gdGhlIHZhbHVlLgorCQkgKi8KKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19XQ0lEX0FUVFJJQlVURV9DSVBIRVIsCisJCQkJICAgKGNyeXB0by0+Y2lwaGVyICYgMHg3KSk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfV0NJRF9BVFRSSUJVVEVfQ0lQSEVSX0VYVCwKKwkJCQkgICAoY3J5cHRvLT5jaXBoZXIgJiAweDgpID4+IDMpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTUFDX1dDSURfQVRUUklCVVRFX0JTU19JRFgsCisJCQkJICAgKGNyeXB0by0+YnNzaWR4ICYgMHg3KSk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfV0NJRF9BVFRSSUJVVEVfQlNTX0lEWF9FWFQsCisJCQkJICAgKGNyeXB0by0+YnNzaWR4ICYgMHg4KSA+PiAzKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19XQ0lEX0FUVFJJQlVURV9SWF9XSVVERiwgY3J5cHRvLT5jaXBoZXIpOworCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBvZmZzZXQsIHJlZyk7CisJfSBlbHNlIHsKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgb2Zmc2V0LCAwKTsKKwl9CiAKIAlvZmZzZXQgPSBNQUNfSVZFSVZfRU5UUlkoa2V5LT5od19rZXlfaWR4KTsKIApAQCAtNjY4LDE5ICs5NDUsMTQgQEAKIHZvaWQgcnQyODAwX2NvbmZpZ19pbnRmKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsIHN0cnVjdCBydDJ4MDBfaW50ZiAqaW50ZiwKIAkJCXN0cnVjdCBydDJ4MDBpbnRmX2NvbmYgKmNvbmYsIGNvbnN0IHVuc2lnbmVkIGludCBmbGFncykKIHsKLQl1bnNpZ25lZCBpbnQgYmVhY29uX2Jhc2U7CiAJdTMyIHJlZzsKIAogCWlmIChmbGFncyAmIENPTkZJR19VUERBVEVfVFlQRSkgewogCQkvKgogCQkgKiBDbGVhciBjdXJyZW50IHN5bmNocm9uaXNhdGlvbiBzZXR1cC4KLQkJICogRm9yIHRoZSBCZWFjb24gYmFzZSByZWdpc3RlcnMgd2Ugb25seSBuZWVkIHRvIGNsZWFyCi0JCSAqIHRoZSBmaXJzdCBieXRlIHNpbmNlIHRoYXQgYnl0ZSBjb250YWlucyB0aGUgVkFMSUQgYW5kIE9XTkVSCi0JCSAqIGJpdHMgd2hpY2ggKHdoZW4gc2V0IHRvIDApIHdpbGwgaW52YWxpZGF0ZSB0aGUgZW50aXJlIGJlYWNvbi4KIAkJICovCi0JCWJlYWNvbl9iYXNlID0gSFdfQkVBQ09OX09GRlNFVChpbnRmLT5iZWFjb24tPmVudHJ5X2lkeCk7Ci0JCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIGJlYWNvbl9iYXNlLCAwKTsKLQorCQlydDI4MDBfY2xlYXJfYmVhY29uKHJ0MngwMGRldiwKKwkJCQkgICAgSFdfQkVBQ09OX09GRlNFVChpbnRmLT5iZWFjb24tPmVudHJ5X2lkeCkpOwogCQkvKgogCQkgKiBFbmFibGUgc3luY2hyb25pc2F0aW9uLgogCQkgKi8KQEAgLTY4OCw4ICs5NjAsMTggQEAKIAkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJDTl9USU1FX0NGR19UU0ZfVElDS0lORywgMSk7CiAJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfVFNGX1NZTkMsIGNvbmYtPnN5bmMpOwogCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkNOX1RJTUVfQ0ZHX1RCVFRfRU5BQkxFLAotCQkJCSAgIChjb25mLT5zeW5jID09IFRTRl9TWU5DX0JFQUNPTikpOworCQkJCSAgIChjb25mLT5zeW5jID09IFRTRl9TWU5DX0FESE9DIHx8CisJCQkJICAgIGNvbmYtPnN5bmMgPT0gVFNGX1NZTkNfQVBfTk9ORSkpOwogCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBCQ05fVElNRV9DRkcsIHJlZyk7CisKKwkJLyoKKwkJICogRW5hYmxlIHByZSB0YnR0IGludGVycnVwdCBmb3IgYmVhY29uaW5nIG1vZGVzCisJCSAqLworCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIElOVF9USU1FUl9FTiwgJnJlZyk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBJTlRfVElNRVJfRU5fUFJFX1RCVFRfVElNRVIsCisJCQkJICAgKGNvbmYtPnN5bmMgPT0gVFNGX1NZTkNfQVBfTk9ORSkpOworCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBJTlRfVElNRVJfRU4sIHJlZyk7CisKIAl9CiAKIAlpZiAoZmxhZ3MgJiBDT05GSUdfVVBEQVRFX01BQykgewpAQCAtNzAzLDggKzk4NSw4IEBACiAKIAlpZiAoZmxhZ3MgJiBDT05GSUdfVVBEQVRFX0JTU0lEKSB7CiAJCXJlZyA9IGxlMzJfdG9fY3B1KGNvbmYtPmJzc2lkWzFdKTsKLQkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19CU1NJRF9EVzFfQlNTX0lEX01BU0ssIDApOwotCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTUFDX0JTU0lEX0RXMV9CU1NfQkNOX05VTSwgMCk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfQlNTSURfRFcxX0JTU19JRF9NQVNLLCAzKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19CU1NJRF9EVzFfQlNTX0JDTl9OVU0sIDcpOwogCQljb25mLT5ic3NpZFsxXSA9IGNwdV90b19sZTMyKHJlZyk7CiAKIAkJcnQyODAwX3JlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCBNQUNfQlNTSURfRFcwLApAQCAtNzYyLDE0ICsxMDQ0LDEyIEBACiAJc3dpdGNoICgoaW50KWFudC0+dHgpIHsKIAljYXNlIDE6CiAJCXJ0MngwMF9zZXRfZmllbGQ4KCZyMSwgQkJQMV9UWF9BTlRFTk5BLCAwKTsKLQkJaWYgKHJ0MngwMF9pc19wY2kocnQyeDAwZGV2KSB8fCBydDJ4MDBfaXNfc29jKHJ0MngwMGRldikpCi0JCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcjMsIEJCUDNfUlhfQU5URU5OQSwgMCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJcnQyeDAwX3NldF9maWVsZDgoJnIxLCBCQlAxX1RYX0FOVEVOTkEsIDIpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCS8qIERvIG5vdGhpbmcgKi8KKwkJcnQyeDAwX3NldF9maWVsZDgoJnIxLCBCQlAxX1RYX0FOVEVOTkEsIDApOwogCQlicmVhazsKIAl9CiAKQEAgLTEwMTYsNjYgKzEyOTYsMTE1IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJ0MjgwMF9jb25maWdfdHhwb3dlcihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAotCQkJCSAgY29uc3QgaW50IHR4cG93ZXIpCisJCQkJICBjb25zdCBpbnQgbWF4X3R4cG93ZXIpCiB7CisJdTggdHhwb3dlcjsKKwl1OCBtYXhfdmFsdWUgPSAodTgpbWF4X3R4cG93ZXI7CisJdTE2IGVlcHJvbTsKKwlpbnQgaTsKIAl1MzIgcmVnOwotCXUzMiB2YWx1ZSA9IFRYUE9XRVJfR19UT19ERVYodHhwb3dlcik7CiAJdTggcjE7CisJdTMyIG9mZnNldDsKIAorCS8qCisJICogc2V0IHRvIG5vcm1hbCB0eCBwb3dlciBtb2RlOiArLy0gMGRCbQorCSAqLwogCXJ0MjgwMF9iYnBfcmVhZChydDJ4MDBkZXYsIDEsICZyMSk7Ci0JcnQyeDAwX3NldF9maWVsZDgoJnJlZywgQkJQMV9UWF9QT1dFUiwgMCk7CisJcnQyeDAwX3NldF9maWVsZDgoJnIxLCBCQlAxX1RYX1BPV0VSLCAwKTsKIAlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgMSwgcjEpOwogCi0JcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWF9QV1JfQ0ZHXzAsICZyZWcpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzBfMU1CUywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzBfMk1CUywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzBfNTVNQlMsIHZhbHVlKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR18wXzExTUJTLCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfMF82TUJTLCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfMF85TUJTLCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfMF8xMk1CUywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzBfMThNQlMsIHZhbHVlKTsKLQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9QV1JfQ0ZHXzAsIHJlZyk7CisJLyoKKwkgKiBUaGUgZWVwcm9tIGNvbnRhaW5zIHRoZSB0eCBwb3dlciB2YWx1ZXMgZm9yIGVhY2ggcmF0ZS4gVGhlc2UKKwkgKiB2YWx1ZXMgbWFwIHRvIDEwMCUgdHggcG93ZXIuIEVhY2ggMTZiaXQgd29yZCBjb250YWlucyBmb3VyIHR4CisJICogcG93ZXIgdmFsdWVzIGFuZCB0aGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdXNlZCBpbiB0aGUgVFhfUFdSX0NGRworCSAqIHJlZ2lzdGVycy4KKwkgKi8KKwlvZmZzZXQgPSBUWF9QV1JfQ0ZHXzA7CiAKLQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYX1BXUl9DRkdfMSwgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfMV8yNE1CUywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzFfMzZNQlMsIHZhbHVlKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR18xXzQ4TUJTLCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfMV81NE1CUywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzFfTUNTMCwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzFfTUNTMSwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzFfTUNTMiwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzFfTUNTMywgdmFsdWUpOwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1BXUl9DRkdfMSwgcmVnKTsKKwlmb3IgKGkgPSAwOyBpIDwgRUVQUk9NX1RYUE9XRVJfQllSQVRFX1NJWkU7IGkgKz0gMikgeworCQkvKiBqdXN0IHRvIGJlIHNhZmUgKi8KKwkJaWYgKG9mZnNldCA+IFRYX1BXUl9DRkdfNCkKKwkJCWJyZWFrOwogCi0JcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWF9QV1JfQ0ZHXzIsICZyZWcpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTNCwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTNSwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTNiwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTNywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTOCwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTOSwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzJfTUNTMTAsIHZhbHVlKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR18yX01DUzExLCB2YWx1ZSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfUFdSX0NGR18yLCByZWcpOworCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIG9mZnNldCwgJnJlZyk7CiAKLQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYX1BXUl9DRkdfMywgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfM19NQ1MxMiwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzNfTUNTMTMsIHZhbHVlKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR18zX01DUzE0LCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfM19NQ1MxNSwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzNfVUtOT1dOMSwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzNfVUtOT1dOMiwgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzNfVUtOT1dOMywgdmFsdWUpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHXzNfVUtOT1dONCwgdmFsdWUpOwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1BXUl9DRkdfMywgcmVnKTsKKwkJLyogcmVhZCB0aGUgbmV4dCBmb3VyIHR4cG93ZXIgdmFsdWVzICovCisJCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9UWFBPV0VSX0JZUkFURSArIGksCisJCQkJICAgJmVlcHJvbSk7CiAKLQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYX1BXUl9DRkdfNCwgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfNF9VS05PV041LCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfNF9VS05PV042LCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfNF9VS05PV043LCB2YWx1ZSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfNF9VS05PV044LCB2YWx1ZSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfUFdSX0NGR180LCByZWcpOworCQkvKiBUWF9QV1JfQ0ZHXzA6IDFNQlMsIFRYX1BXUl9DRkdfMTogMjRNQlMsCisJCSAqIFRYX1BXUl9DRkdfMjogTUNTNCwgVFhfUFdSX0NGR18zOiBNQ1MxMiwKKwkJICogVFhfUFdSX0NGR180OiB1bmtub3duICovCisJCXR4cG93ZXIgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLAorCQkJCQkgICAgIEVFUFJPTV9UWFBPV0VSX0JZUkFURV9SQVRFMCk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHX1JBVEUwLAorCQkJCSAgIG1pbih0eHBvd2VyLCBtYXhfdmFsdWUpKTsKKworCQkvKiBUWF9QV1JfQ0ZHXzA6IDJNQlMsIFRYX1BXUl9DRkdfMTogMzZNQlMsCisJCSAqIFRYX1BXUl9DRkdfMjogTUNTNSwgVFhfUFdSX0NGR18zOiBNQ1MxMywKKwkJICogVFhfUFdSX0NGR180OiB1bmtub3duICovCisJCXR4cG93ZXIgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLAorCQkJCQkgICAgIEVFUFJPTV9UWFBPV0VSX0JZUkFURV9SQVRFMSk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHX1JBVEUxLAorCQkJCSAgIG1pbih0eHBvd2VyLCBtYXhfdmFsdWUpKTsKKworCQkvKiBUWF9QV1JfQ0ZHXzA6IDU1TUJTLCBUWF9QV1JfQ0ZHXzE6IDQ4TUJTLAorCQkgKiBUWF9QV1JfQ0ZHXzI6IE1DUzYsICBUWF9QV1JfQ0ZHXzM6IE1DUzE0LAorCQkgKiBUWF9QV1JfQ0ZHXzQ6IHVua25vd24gKi8KKwkJdHhwb3dlciA9IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sCisJCQkJCSAgICAgRUVQUk9NX1RYUE9XRVJfQllSQVRFX1JBVEUyKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYX1BXUl9DRkdfUkFURTIsCisJCQkJICAgbWluKHR4cG93ZXIsIG1heF92YWx1ZSkpOworCisJCS8qIFRYX1BXUl9DRkdfMDogMTFNQlMsIFRYX1BXUl9DRkdfMTogNTRNQlMsCisJCSAqIFRYX1BXUl9DRkdfMjogTUNTNywgIFRYX1BXUl9DRkdfMzogTUNTMTUsCisJCSAqIFRYX1BXUl9DRkdfNDogdW5rbm93biAqLworCQl0eHBvd2VyID0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwKKwkJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfUkFURTMpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR19SQVRFMywKKwkJCQkgICBtaW4odHhwb3dlciwgbWF4X3ZhbHVlKSk7CisKKwkJLyogcmVhZCB0aGUgbmV4dCBmb3VyIHR4cG93ZXIgdmFsdWVzICovCisJCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9UWFBPV0VSX0JZUkFURSArIGkgKyAxLAorCQkJCSAgICZlZXByb20pOworCisJCS8qIFRYX1BXUl9DRkdfMDogNk1CUywgVFhfUFdSX0NGR18xOiBNQ1MwLAorCQkgKiBUWF9QV1JfQ0ZHXzI6IE1DUzgsIFRYX1BXUl9DRkdfMzogdW5rbm93biwKKwkJICogVFhfUFdSX0NGR180OiB1bmtub3duICovCisJCXR4cG93ZXIgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLAorCQkJCQkgICAgIEVFUFJPTV9UWFBPV0VSX0JZUkFURV9SQVRFMCk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWF9QV1JfQ0ZHX1JBVEU0LAorCQkJCSAgIG1pbih0eHBvd2VyLCBtYXhfdmFsdWUpKTsKKworCQkvKiBUWF9QV1JfQ0ZHXzA6IDlNQlMsIFRYX1BXUl9DRkdfMTogTUNTMSwKKwkJICogVFhfUFdSX0NGR18yOiBNQ1M5LCBUWF9QV1JfQ0ZHXzM6IHVua25vd24sCisJCSAqIFRYX1BXUl9DRkdfNDogdW5rbm93biAqLworCQl0eHBvd2VyID0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwKKwkJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfUkFURTEpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR19SQVRFNSwKKwkJCQkgICBtaW4odHhwb3dlciwgbWF4X3ZhbHVlKSk7CisKKwkJLyogVFhfUFdSX0NGR18wOiAxMk1CUywgVFhfUFdSX0NGR18xOiBNQ1MyLAorCQkgKiBUWF9QV1JfQ0ZHXzI6IE1DUzEwLCBUWF9QV1JfQ0ZHXzM6IHVua25vd24sCisJCSAqIFRYX1BXUl9DRkdfNDogdW5rbm93biAqLworCQl0eHBvd2VyID0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwKKwkJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfUkFURTIpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR19SQVRFNiwKKwkJCQkgICBtaW4odHhwb3dlciwgbWF4X3ZhbHVlKSk7CisKKwkJLyogVFhfUFdSX0NGR18wOiAxOE1CUywgVFhfUFdSX0NGR18xOiBNQ1MzLAorCQkgKiBUWF9QV1JfQ0ZHXzI6IE1DUzExLCBUWF9QV1JfQ0ZHXzM6IHVua25vd24sCisJCSAqIFRYX1BXUl9DRkdfNDogdW5rbm93biAqLworCQl0eHBvd2VyID0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwKKwkJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfUkFURTMpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfUFdSX0NGR19SQVRFNywKKwkJCQkgICBtaW4odHhwb3dlciwgbWF4X3ZhbHVlKSk7CisKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgb2Zmc2V0LCByZWcpOworCisJCS8qIG5leHQgVFhfUFdSX0NGRyByZWdpc3RlciAqLworCQlvZmZzZXQgKz0gNDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHJ0MjgwMF9jb25maWdfcmV0cnlfbGltaXQoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTEyMTIsNiArMTU0MSw3IEBACiAJdTMyIHJlZzsKIAl1MTYgZWVwcm9tOwogCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CiAKIAlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFdQRE1BX0dMT19DRkcsICZyZWcpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9HTE9fQ0ZHX0VOQUJMRV9UWF9ETUEsIDApOwpAQCAtMTIyMSw1OSArMTU1MSw5IEBACiAJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX0dMT19DRkdfVFhfV1JJVEVCQUNLX0RPTkUsIDEpOwogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFdQRE1BX0dMT19DRkcsIHJlZyk7CiAKLQlpZiAocnQyeDAwX2lzX3VzYihydDJ4MDBkZXYpKSB7Ci0JCS8qCi0JCSAqIFdhaXQgdW50aWwgQkJQIGFuZCBSRiBhcmUgcmVhZHkuCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfQlVTWV9DT1VOVDsgaSsrKSB7Ci0JCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIE1BQ19DU1IwLCAmcmVnKTsKLQkJCWlmIChyZWcgJiYgcmVnICE9IH4wKQotCQkJCWJyZWFrOwotCQkJbXNsZWVwKDEpOwotCQl9Ci0KLQkJaWYgKGkgPT0gUkVHSVNURVJfQlVTWV9DT1VOVCkgewotCQkJRVJST1IocnQyeDAwZGV2LCAiVW5zdGFibGUgaGFyZHdhcmUuXG4iKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwgJnJlZyk7Ci0JCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwKLQkJCQkgICAgICByZWcgJiB+MHgwMDAwMjAwMCk7Ci0JfSBlbHNlIGlmIChydDJ4MDBfaXNfcGNpKHJ0MngwMGRldikgfHwgcnQyeDAwX2lzX3NvYyhydDJ4MDBkZXYpKSB7Ci0JCS8qCi0JCSAqIFJlc2V0IERNQSBpbmRleGVzCi0JCSAqLwotCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFdQRE1BX1JTVF9JRFgsICZyZWcpOwotCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfUlNUX0lEWF9EVFhfSURYMCwgMSk7Ci0JCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9SU1RfSURYX0RUWF9JRFgxLCAxKTsKLQkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX1JTVF9JRFhfRFRYX0lEWDIsIDEpOwotCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfUlNUX0lEWF9EVFhfSURYMywgMSk7Ci0JCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9SU1RfSURYX0RUWF9JRFg0LCAxKTsKLQkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX1JTVF9JRFhfRFRYX0lEWDUsIDEpOwotCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfUlNUX0lEWF9EUlhfSURYMCwgMSk7Ci0JCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFdQRE1BX1JTVF9JRFgsIHJlZyk7Ci0KLQkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUEJGX1NZU19DVFJMLCAweDAwMDAwZTFmKTsKLQkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUEJGX1NZU19DVFJMLCAweDAwMDAwZTAwKTsKLQotCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBQV1JfUElOX0NGRywgMHgwMDAwMDAwMyk7Ci0JfQotCi0JcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBNQUNfU1lTX0NUUkwsICZyZWcpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfU1lTX0NUUkxfUkVTRVRfQ1NSLCAxKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTUFDX1NZU19DVFJMX1JFU0VUX0JCUCwgMSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgTUFDX1NZU19DVFJMLCByZWcpOwotCi0JaWYgKHJ0MngwMF9pc191c2IocnQyeDAwZGV2KSkgewotCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBVU0JfRE1BX0NGRywgMHgwMDAwMDAwMCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUlQyWDAwX0xJQl9VU0IpIHx8IGRlZmluZWQoQ09ORklHX1JUMlgwMF9MSUJfVVNCX01PRFVMRSkKLQkJcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X3N3KHJ0MngwMGRldiwgVVNCX0RFVklDRV9NT0RFLCAwLAotCQkJCQkgICAgVVNCX01PREVfUkVTRVQsIFJFR0lTVEVSX1RJTUVPVVQpOwotI2VuZGlmCi0JfQotCi0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgTUFDX1NZU19DVFJMLCAweDAwMDAwMDAwKTsKKwlyZXQgPSBydDI4MDBfZHJ2X2luaXRfcmVnaXN0ZXJzKHJ0MngwMGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQkNOX09GRlNFVDAsICZyZWcpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fT0ZGU0VUMF9CQ04wLCAweGUwKTsgLyogMHgzODAwICovCkBAIC0xMjk1LDcgKzE1NzUsNyBAQAogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIE1BQ19TWVNfQ1RSTCwgMHgwMDAwMDAwMCk7CiAKIAlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIEJDTl9USU1FX0NGRywgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJDTl9USU1FX0NGR19CRUFDT05fSU5URVJWQUwsIDApOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0lOVEVSVkFMLCAxNjAwKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkNOX1RJTUVfQ0ZHX1RTRl9USUNLSU5HLCAwKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkNOX1RJTUVfQ0ZHX1RTRl9TWU5DLCAwKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQkNOX1RJTUVfQ0ZHX1RCVFRfRU5BQkxFLCAwKTsKQEAgLTEzMjgsNyArMTYwOCw2IEBACiAJCX0gZWxzZSB7CiAJCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcyLCAweDAwMDAwMDAwKTsKIAkJfQotCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcyLCByZWcpOwogCX0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDcwKSkgewogCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcwLCAweDAwMDAwNDAwKTsKIApAQCAtMTMzOSw2ICsxNjE4LDEwIEBACiAJCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcxLCAweDAwMDgwNjA2KTsKIAkJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1NXX0NGRzIsIDB4MDAwMDAwMDApOwogCQl9CisJfSBlbHNlIGlmIChydDI4MDBfaXNfMzA1eF9zb2MocnQyeDAwZGV2KSkgeworCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcwLCAweDAwMDAwNDAwKTsKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfU1dfQ0ZHMSwgMHgwMDAwMDAwMCk7CisJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1NXX0NGRzIsIDB4MDAwMDAwMWYpOwogCX0gZWxzZSB7CiAJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1NXX0NGRzAsIDB4MDAwMDAwMDApOwogCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcxLCAweDAwMDgwNjA2KTsKQEAgLTE1NDYsMjMgKzE4MjksMjAgQEAKIAogCS8qCiAJICogQ2xlYXIgYWxsIGJlYWNvbnMKLQkgKiBGb3IgdGhlIEJlYWNvbiBiYXNlIHJlZ2lzdGVycyB3ZSBvbmx5IG5lZWQgdG8gY2xlYXIKLQkgKiB0aGUgZmlyc3QgYnl0ZSBzaW5jZSB0aGF0IGJ5dGUgY29udGFpbnMgdGhlIFZBTElEIGFuZCBPV05FUgotCSAqIGJpdHMgd2hpY2ggKHdoZW4gc2V0IHRvIDApIHdpbGwgaW52YWxpZGF0ZSB0aGUgZW50aXJlIGJlYWNvbi4KIAkgKi8KLQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBIV19CRUFDT05fQkFTRTAsIDApOwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFMSwgMCk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgSFdfQkVBQ09OX0JBU0UyLCAwKTsKLQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBIV19CRUFDT05fQkFTRTMsIDApOwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFNCwgMCk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgSFdfQkVBQ09OX0JBU0U1LCAwKTsKLQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBIV19CRUFDT05fQkFTRTYsIDApOwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFNywgMCk7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFMCk7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFMSk7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFMik7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFMyk7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFNCk7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFNSk7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFNik7CisJcnQyODAwX2NsZWFyX2JlYWNvbihydDJ4MDBkZXYsIEhXX0JFQUNPTl9CQVNFNyk7CiAKIAlpZiAocnQyeDAwX2lzX3VzYihydDJ4MDBkZXYpKSB7Ci0JCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgVVNCX0NZQ19DRkcsICZyZWcpOwotCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVVNCX0NZQ19DRkdfQ0xPQ0tfQ1lDTEUsIDMwKTsKLQkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVVNCX0NZQ19DRkcsIHJlZyk7CisJCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgVVNfQ1lDX0NOVCwgJnJlZyk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBVU19DWUNfQ05UX0NMT0NLX0NZQ0xFLCAzMCk7CisJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFVTX0NZQ19DTlQsIHJlZyk7CiAJfQogCiAJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBIVF9GQktfQ0ZHMCwgJnJlZyk7CkBAIC0xNjE3LDYgKzE4OTcsMTMgQEAKIAlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYX1NUQV9DTlQxLCAmcmVnKTsKIAlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYX1NUQV9DTlQyLCAmcmVnKTsKIAorCS8qCisJICogU2V0dXAgbGVhZHRpbWUgZm9yIHByZSB0YnR0IGludGVycnVwdCB0byA2bXMKKwkgKi8KKwlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIElOVF9USU1FUl9DRkcsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBJTlRfVElNRVJfQ0ZHX1BSRV9UQlRUX1RJTUVSLCA2IDw8IDQpOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIElOVF9USU1FUl9DRkcsIHJlZyk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF9pbml0X3JlZ2lzdGVycyk7CkBAIC0xNzA2LDggKzE5OTMsNyBAQAogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4MiwgMHg2Mik7CiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDgzLCAweDZhKTsKIAotCWlmIChydDJ4MDBfcnRfcmV2KHJ0MngwMGRldiwgUlQyODYwLCBSRVZfUlQyODYwRCkgfHwKLQkgICAgcnQyeDAwX3J0X3JldihydDJ4MDBkZXYsIFJUMjg3MCwgUkVWX1JUMjg3MEQpKQorCWlmIChydDJ4MDBfcnRfcmV2KHJ0MngwMGRldiwgUlQyODYwLCBSRVZfUlQyODYwRCkpCiAJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4NCwgMHgxOSk7CiAJZWxzZQogCQlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgODQsIDB4OTkpOwpAQCAtMjAxMyw4ICsyMjk5LDcgQEAKIAlpZiAocnQyeDAwX3J0X3Jldl9sdChydDJ4MDBkZXYsIFJUMzA3MSwgUkVWX1JUMzA3MUUpIHx8CiAJICAgIHJ0MngwMF9ydF9yZXZfbHQocnQyeDAwZGV2LCBSVDMwOTAsIFJFVl9SVDMwOTBFKSB8fAogCSAgICBydDJ4MDBfcnRfcmV2X2x0KHJ0MngwMGRldiwgUlQzMzkwLCBSRVZfUlQzMzkwRSkpIHsKLQkJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX05JQywgJmVlcHJvbSk7Ci0JCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fTklDX0VYVEVSTkFMX0xOQV9CRykpCisJCWlmICh0ZXN0X2JpdChDT05GSUdfRVhURVJOQUxfTE5BX0JHLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMTdfUiwgMSk7CiAJfQogCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9UWE1JWEVSX0dBSU5fQkcsICZlZXByb20pOwpAQCAtMjE0Nyw3ICsyNDMyLDYgQEAKIAkJcnQyeDAwX2VlcHJvbV93cml0ZShydDJ4MDBkZXYsIEVFUFJPTV9BTlRFTk5BLCB3b3JkKTsKIAkJRUVQUk9NKHJ0MngwMGRldiwgIkFudGVubmE6IDB4JTA0eFxuIiwgd29yZCk7CiAJfSBlbHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDI4NjApIHx8Ci0JCSAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMjg3MCkgfHwKIAkJICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODcyKSkgewogCQkvKgogCQkgKiBUaGVyZSBpcyBhIG1heCBvZiAyIFJYIHN0cmVhbXMgZm9yIFJUMjh4MCBzZXJpZXMKQEAgLTIxNjksNiArMjQ1Myw4IEBACiAJCXJ0MngwMF9zZXRfZmllbGQxNigmd29yZCwgRUVQUk9NX05JQ19XUFNfUEJDLCAwKTsKIAkJcnQyeDAwX3NldF9maWVsZDE2KCZ3b3JkLCBFRVBST01fTklDX0JXNDBNX0JHLCAwKTsKIAkJcnQyeDAwX3NldF9maWVsZDE2KCZ3b3JkLCBFRVBST01fTklDX0JXNDBNX0EsIDApOworCQlydDJ4MDBfc2V0X2ZpZWxkMTYoJndvcmQsIEVFUFJPTV9OSUNfQU5UX0RJVkVSU0lUWSwgMCk7CisJCXJ0MngwMF9zZXRfZmllbGQxNigmd29yZCwgRUVQUk9NX05JQ19EQUNfVEVTVCwgMCk7CiAJCXJ0MngwMF9lZXByb21fd3JpdGUocnQyeDAwZGV2LCBFRVBST01fTklDLCB3b3JkKTsKIAkJRUVQUk9NKHJ0MngwMGRldiwgIk5JQzogMHglMDR4XG4iLCB3b3JkKTsKIAl9CkBAIC0yMTc2LDYgKzI0NjIsMTAgQEAKIAlydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fRlJFUSwgJndvcmQpOwogCWlmICgod29yZCAmIDB4MDBmZikgPT0gMHgwMGZmKSB7CiAJCXJ0MngwMF9zZXRfZmllbGQxNigmd29yZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCAwKTsKKwkJcnQyeDAwX2VlcHJvbV93cml0ZShydDJ4MDBkZXYsIEVFUFJPTV9GUkVRLCB3b3JkKTsKKwkJRUVQUk9NKHJ0MngwMGRldiwgIkZyZXE6IDB4JTA0eFxuIiwgd29yZCk7CisJfQorCWlmICgod29yZCAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB7CiAJCXJ0MngwMF9zZXRfZmllbGQxNigmd29yZCwgRUVQUk9NX0ZSRVFfTEVEX01PREUsCiAJCQkJICAgTEVEX01PREVfVFhSWF9BQ1RJVklUWSk7CiAJCXJ0MngwMF9zZXRfZmllbGQxNigmd29yZCwgRUVQUk9NX0ZSRVFfTEVEX1BPTEFSSVRZLCAwKTsKQEAgLTIxODMsNyArMjQ3Myw3IEBACiAJCXJ0MngwMF9lZXByb21fd3JpdGUocnQyeDAwZGV2LCBFRVBST01fTEVEMSwgMHg1NTU1KTsKIAkJcnQyeDAwX2VlcHJvbV93cml0ZShydDJ4MDBkZXYsIEVFUFJPTV9MRUQyLCAweDIyMjEpOwogCQlydDJ4MDBfZWVwcm9tX3dyaXRlKHJ0MngwMGRldiwgRUVQUk9NX0xFRDMsIDB4YTlmOCk7Ci0JCUVFUFJPTShydDJ4MDBkZXYsICJGcmVxOiAweCUwNHhcbiIsIHdvcmQpOworCQlFRVBST00ocnQyeDAwZGV2LCAiTGVkIE1vZGU6IDB4JTA0eFxuIiwgd29yZCk7CiAJfQogCiAJLyoKQEAgLTIyNTEsNyArMjU0MSw2IEBACiAJCQl2YWx1ZSwgcnQyeDAwX2dldF9maWVsZDMyKHJlZywgTUFDX0NTUjBfUkVWSVNJT04pKTsKIAogCWlmICghcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODYwKSAmJgotCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODcwKSAmJgogCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODcyKSAmJgogCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODgzKSAmJgogCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDcwKSAmJgpAQCAtMjQ4NCwxMyArMjc3MywyNiBAQAogCSAgICBJRUVFODAyMTFfSFdfSE9TVF9CUk9BRENBU1RfUFNfQlVGRkVSSU5HIHwKIAkgICAgSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAogCSAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAotCSAgICBJRUVFODAyMTFfSFdfUFNfTlVMTEZVTkNfU1RBQ0s7CisJICAgIElFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSyB8CisJICAgIElFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTjsKIAogCVNFVF9JRUVFODAyMTFfREVWKHJ0MngwMGRldi0+aHcsIHJ0MngwMGRldi0+ZGV2KTsKIAlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihydDJ4MDBkZXYtPmh3LAogCQkJCXJ0MngwMF9lZXByb21fYWRkcihydDJ4MDBkZXYsCiAJCQkJCQkgICBFRVBST01fTUFDX0FERFJfMCkpOwogCisJLyoKKwkgKiBBcyBydDI4MDAgaGFzIGEgZ2xvYmFsIGZhbGxiYWNrIHRhYmxlIHdlIGNhbm5vdCBzcGVjaWZ5CisJICogbW9yZSB0aGVuIG9uZSB0eCByYXRlIHBlciBmcmFtZSBidXQgc2luY2UgdGhlIGh3IHdpbGwKKwkgKiB0cnkgc2V2ZXJhbCByYXRlcyAoYmFzZWQgb24gdGhlIGZhbGxiYWNrIHRhYmxlKSB3ZSBzaG91bGQKKwkgKiBzdGlsbCBpbml0aWFsaXplIG1heF9yYXRlcyB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmF0ZXMKKwkgKiB3ZSBhcmUgZ29pbmcgdG8gdHJ5LiBPdGhlcndpc2UgbWFjODAyMTEgd2lsbCB0cnVuY2F0ZSBvdXIKKwkgKiByZXBvcnRlZCB0eCByYXRlcyBhbmQgdGhlIHJjIGFsZ29ydGlobSB3aWxsIGVuZCB1cCB3aXRoCisJICogaW5jb3JyZWN0IGRhdGEuCisJICovCisJcnQyeDAwZGV2LT5ody0+bWF4X3JhdGVzID0gNzsKKwlydDJ4MDBkZXYtPmh3LT5tYXhfcmF0ZV90cmllcyA9IDE7CisKIAlydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fQU5URU5OQSwgJmVlcHJvbSk7CiAKIAkvKgpAQCAtMjUyOCwxNiArMjgzMCwxOSBAQAogCWVsc2UKIAkJc3BlYy0+aHQuaHRfc3VwcG9ydGVkID0gZmFsc2U7CiAKLQkvKgotCSAqIERvbid0IHNldCBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCBmb3Igbm93IGFzIGl0IGNhdXNlcwotCSAqIHJlY2VwdGlvbiBwcm9ibGVtcyB3aXRoIEhUNDAgY2FwYWJsZSAxMW4gQVBzCi0JICovCiAJc3BlYy0+aHQuY2FwID0KKwkgICAgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfAogCSAgICBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAogCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8Ci0JICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9UWF9TVEJDIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDOworCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MDsKKworCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fQU5URU5OQV9UWFBBVEgpID49IDIpCisJCXNwZWMtPmh0LmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkM7CisKKwlzcGVjLT5odC5jYXAgfD0KKwkgICAgcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX0FOVEVOTkFfUlhQQVRIKSA8PAorCQlJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CisKIAlzcGVjLT5odC5hbXBkdV9mYWN0b3IgPSAzOwogCXNwZWMtPmh0LmFtcGR1X2RlbnNpdHkgPSA0OwogCXNwZWMtPmh0Lm1jcy50eF9wYXJhbXMgPQpAQCAtMjU5MSw4ICsyODk2LDggQEAKIC8qCiAgKiBJRUVFODAyMTEgc3RhY2sgY2FsbGJhY2sgZnVuY3Rpb25zLgogICovCi1zdGF0aWMgdm9pZCBydDI4MDBfZ2V0X3RraXBfc2VxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBod19rZXlfaWR4LAotCQkJCXUzMiAqaXYzMiwgdTE2ICppdjE2KQordm9pZCBydDI4MDBfZ2V0X3RraXBfc2VxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBod19rZXlfaWR4LCB1MzIgKml2MzIsCisJCQkgdTE2ICppdjE2KQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBody0+cHJpdjsKIAlzdHJ1Y3QgbWFjX2l2ZWl2X2VudHJ5IGl2ZWl2X2VudHJ5OwpAQCAtMjYwNSw4ICsyOTEwLDkgQEAKIAltZW1jcHkoaXYxNiwgJml2ZWl2X2VudHJ5Lml2WzBdLCBzaXplb2YoKml2MTYpKTsKIAltZW1jcHkoaXYzMiwgJml2ZWl2X2VudHJ5Lml2WzRdLCBzaXplb2YoKml2MzIpKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF9nZXRfdGtpcF9zZXEpOwogCi1zdGF0aWMgaW50IHJ0MjgwMF9zZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHZhbHVlKQoraW50IHJ0MjgwMF9zZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHZhbHVlKQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBody0+cHJpdjsKIAl1MzIgcmVnOwpAQCAtMjY0Miw5ICsyOTQ4LDEwIEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF9zZXRfcnRzX3RocmVzaG9sZCk7CiAKLXN0YXRpYyBpbnQgcnQyODAwX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBxdWV1ZV9pZHgsCi0JCQkgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCitpbnQgcnQyODAwX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBxdWV1ZV9pZHgsCisJCSAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGh3LT5wcml2OwogCXN0cnVjdCBkYXRhX3F1ZXVlICpxdWV1ZTsKQEAgLTI3MDksOCArMzAxNiw5IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF9jb25mX3R4KTsKIAotc3RhdGljIHU2NCBydDI4MDBfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3U2NCBydDI4MDBfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7CiAJdTY0IHRzZjsKQEAgLTI3MjMsMjMgKzMwMzEsMzcgQEAKIAogCXJldHVybiB0c2Y7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChydDI4MDBfZ2V0X3RzZik7CiAKLWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIHJ0MjgwMF9tYWM4MDIxMV9vcHMgPSB7Ci0JLnR4CQkJPSBydDJ4MDBtYWNfdHgsCi0JLnN0YXJ0CQkJPSBydDJ4MDBtYWNfc3RhcnQsCi0JLnN0b3AJCQk9IHJ0MngwMG1hY19zdG9wLAotCS5hZGRfaW50ZXJmYWNlCQk9IHJ0MngwMG1hY19hZGRfaW50ZXJmYWNlLAotCS5yZW1vdmVfaW50ZXJmYWNlCT0gcnQyeDAwbWFjX3JlbW92ZV9pbnRlcmZhY2UsCi0JLmNvbmZpZwkJCT0gcnQyeDAwbWFjX2NvbmZpZywKLQkuY29uZmlndXJlX2ZpbHRlcgk9IHJ0MngwMG1hY19jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfdGltCQk9IHJ0MngwMG1hY19zZXRfdGltLAotCS5zZXRfa2V5CQk9IHJ0MngwMG1hY19zZXRfa2V5LAotCS5nZXRfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF9zdGF0cywKLQkuZ2V0X3RraXBfc2VxCQk9IHJ0MjgwMF9nZXRfdGtpcF9zZXEsCi0JLnNldF9ydHNfdGhyZXNob2xkCT0gcnQyODAwX3NldF9ydHNfdGhyZXNob2xkLAotCS5ic3NfaW5mb19jaGFuZ2VkCT0gcnQyeDAwbWFjX2Jzc19pbmZvX2NoYW5nZWQsCi0JLmNvbmZfdHgJCT0gcnQyODAwX2NvbmZfdHgsCi0JLmdldF90c2YJCT0gcnQyODAwX2dldF90c2YsCi0JLnJma2lsbF9wb2xsCQk9IHJ0MngwMG1hY19yZmtpbGxfcG9sbCwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChydDI4MDBfbWFjODAyMTFfb3BzKTsKK2ludCBydDI4MDBfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24pCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgorCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CisJCS8qIHdlIGRvbid0IHN1cHBvcnQgUlggYWdncmVnYXRpb24geWV0ICovCisJCXJldCA9IC1FTk9UU1VQUDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CisJCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgorCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTklORygoc3RydWN0IHJ0MngwMF9kZXYgKilody0+cHJpdiwgIlVua25vd24gQU1QRFUgYWN0aW9uXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocnQyODAwX2FtcGR1X2FjdGlvbik7CisKK01PRFVMRV9BVVRIT1IoRFJWX1BST0pFQ1QgIiwgQmFydGxvbWllaiBab2xuaWVya2lld2ljeiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSYWxpbmsgUlQyODAwIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuaAppbmRleCA5NGRlOTk5Li4wOTE2NDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5oCkBAIC00MCwxMyArNDAsMTcgQEAKIAlpbnQgKCpyZWdidXN5X3JlYWQpKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkgICAgY29uc3QgdW5zaWduZWQgaW50IG9mZnNldCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgcnQyeDAwX2ZpZWxkMzIgZmllbGQsIHUzMiAqcmVnKTsKKworCWludCAoKmRydl93cml0ZV9maXJtd2FyZSkoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkgIGNvbnN0IHU4ICpkYXRhLCBjb25zdCBzaXplX3QgbGVuKTsKKwlpbnQgKCpkcnZfaW5pdF9yZWdpc3RlcnMpKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIHJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJCWNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCQkJCXUzMiAqdmFsdWUpCiB7Ci0JY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgKnJ0MjgwMG9wcyA9IHJ0MngwMGRldi0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgcnQyODAwX29wcyAqcnQyODAwb3BzID0gcnQyeDAwZGV2LT5vcHMtPmRydjsKIAogCXJ0MjgwMG9wcy0+cmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIG9mZnNldCwgdmFsdWUpOwogfQpAQCAtNTUsNyArNTksNyBAQAogCQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCQkJCSAgICAgdTMyICp2YWx1ZSkKIHsKLQljb25zdCBzdHJ1Y3QgcnQyODAwX29wcyAqcnQyODAwb3BzID0gcnQyeDAwZGV2LT5wcml2OworCWNvbnN0IHN0cnVjdCBydDI4MDBfb3BzICpydDI4MDBvcHMgPSBydDJ4MDBkZXYtPm9wcy0+ZHJ2OwogCiAJcnQyODAwb3BzLT5yZWdpc3Rlcl9yZWFkX2xvY2socnQyeDAwZGV2LCBvZmZzZXQsIHZhbHVlKTsKIH0KQEAgLTY0LDcgKzY4LDcgQEAKIAkJCQkJIGNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCQkJCSB1MzIgdmFsdWUpCiB7Ci0JY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgKnJ0MjgwMG9wcyA9IHJ0MngwMGRldi0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgcnQyODAwX29wcyAqcnQyODAwb3BzID0gcnQyeDAwZGV2LT5vcHMtPmRydjsKIAogCXJ0MjgwMG9wcy0+cmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBvZmZzZXQsIHZhbHVlKTsKIH0KQEAgLTczLDcgKzc3LDcgQEAKIAkJCQkJICAgICAgY29uc3QgdW5zaWduZWQgaW50IG9mZnNldCwKIAkJCQkJICAgICAgdTMyIHZhbHVlKQogewotCWNvbnN0IHN0cnVjdCBydDI4MDBfb3BzICpydDI4MDBvcHMgPSBydDJ4MDBkZXYtPnByaXY7CisJY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgKnJ0MjgwMG9wcyA9IHJ0MngwMGRldi0+b3BzLT5kcnY7CiAKIAlydDI4MDBvcHMtPnJlZ2lzdGVyX3dyaXRlX2xvY2socnQyeDAwZGV2LCBvZmZzZXQsIHZhbHVlKTsKIH0KQEAgLTgyLDcgKzg2LDcgQEAKIAkJCQkJICAgICBjb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCQkJCQkgICAgIHZvaWQgKnZhbHVlLCBjb25zdCB1MzIgbGVuZ3RoKQogewotCWNvbnN0IHN0cnVjdCBydDI4MDBfb3BzICpydDI4MDBvcHMgPSBydDJ4MDBkZXYtPnByaXY7CisJY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgKnJ0MjgwMG9wcyA9IHJ0MngwMGRldi0+b3BzLT5kcnY7CiAKIAlydDI4MDBvcHMtPnJlZ2lzdGVyX211bHRpcmVhZChydDJ4MDBkZXYsIG9mZnNldCwgdmFsdWUsIGxlbmd0aCk7CiB9CkBAIC05Miw3ICs5Niw3IEBACiAJCQkJCSAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAogCQkJCQkgICAgICBjb25zdCB1MzIgbGVuZ3RoKQogewotCWNvbnN0IHN0cnVjdCBydDI4MDBfb3BzICpydDI4MDBvcHMgPSBydDJ4MDBkZXYtPnByaXY7CisJY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgKnJ0MjgwMG9wcyA9IHJ0MngwMGRldi0+b3BzLT5kcnY7CiAKIAlydDI4MDBvcHMtPnJlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCBvZmZzZXQsIHZhbHVlLCBsZW5ndGgpOwogfQpAQCAtMTAyLDE3ICsxMDYsMzkgQEAKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcnQyeDAwX2ZpZWxkMzIgZmllbGQsCiAJCQkJICAgICAgdTMyICpyZWcpCiB7Ci0JY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgKnJ0MjgwMG9wcyA9IHJ0MngwMGRldi0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgcnQyODAwX29wcyAqcnQyODAwb3BzID0gcnQyeDAwZGV2LT5vcHMtPmRydjsKIAogCXJldHVybiBydDI4MDBvcHMtPnJlZ2J1c3lfcmVhZChydDJ4MDBkZXYsIG9mZnNldCwgZmllbGQsIHJlZyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHJ0MjgwMF9kcnZfd3JpdGVfZmlybXdhcmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkJICAgIGNvbnN0IHU4ICpkYXRhLCBjb25zdCBzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCBydDI4MDBfb3BzICpydDI4MDBvcHMgPSBydDJ4MDBkZXYtPm9wcy0+ZHJ2OworCisJcmV0dXJuIHJ0MjgwMG9wcy0+ZHJ2X3dyaXRlX2Zpcm13YXJlKHJ0MngwMGRldiwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnQyODAwX2Rydl9pbml0X3JlZ2lzdGVycyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQoreworCWNvbnN0IHN0cnVjdCBydDI4MDBfb3BzICpydDI4MDBvcHMgPSBydDJ4MDBkZXYtPm9wcy0+ZHJ2OworCisJcmV0dXJuIHJ0MjgwMG9wcy0+ZHJ2X2luaXRfcmVnaXN0ZXJzKHJ0MngwMGRldik7Cit9CisKIHZvaWQgcnQyODAwX21jdV9yZXF1ZXN0KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQljb25zdCB1OCBjb21tYW5kLCBjb25zdCB1OCB0b2tlbiwKIAkJCWNvbnN0IHU4IGFyZzAsIGNvbnN0IHU4IGFyZzEpOwogCi12b2lkIHJ0MjgwMF93cml0ZV90eHdpKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYyk7Ci12b2lkIHJ0MjgwMF9wcm9jZXNzX3J4d2koc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJ4ZG9uZV9lbnRyeV9kZXNjICp0eGRlc2MpOworaW50IHJ0MjgwMF9jaGVja19maXJtd2FyZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJICBjb25zdCB1OCAqZGF0YSwgY29uc3Qgc2l6ZV90IGxlbik7CitpbnQgcnQyODAwX2xvYWRfZmlybXdhcmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCSBjb25zdCB1OCAqZGF0YSwgY29uc3Qgc2l6ZV90IGxlbik7CisKK3ZvaWQgcnQyODAwX3dyaXRlX3R4d2koX19sZTMyICp0eHdpLCBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpOwordm9pZCBydDI4MDBfcHJvY2Vzc19yeHdpKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksIHN0cnVjdCByeGRvbmVfZW50cnlfZGVzYyAqdHhkZXNjKTsKKwordm9pZCBydDI4MDBfd3JpdGVfYmVhY29uKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYyk7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcnQyeDAwZGVidWcgcnQyODAwX3J0MngwMGRlYnVnOwogCkBAIC0xNDgsNiArMTc0LDE0IEBACiBpbnQgcnQyODAwX2luaXRfZWVwcm9tKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwogaW50IHJ0MjgwMF9wcm9iZV9od19tb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwogCi1leHRlcm4gY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgcnQyODAwX21hYzgwMjExX29wczsKK3ZvaWQgcnQyODAwX2dldF90a2lwX3NlcShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggaHdfa2V5X2lkeCwgdTMyICppdjMyLAorCQkJIHUxNiAqaXYxNik7CitpbnQgcnQyODAwX3NldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgdmFsdWUpOworaW50IHJ0MjgwMF9jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgcXVldWVfaWR4LAorCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKTsKK3U2NCBydDI4MDBfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CitpbnQgcnQyODAwX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCWVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKIAogI2VuZGlmIC8qIFJUMjgwMExJQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMKaW5kZXggYjJmMjMyNy4uMzliMzg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBwY2kuYwpAQCAtMzEsNyArMzEsNiBAQAogCVN1cHBvcnRlZCBjaGlwc2V0czogUlQyODAwRSAmIFJUMjgwMEVELgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNTEsNyArNTAsNyBAQAogLyoKICAqIEFsbG93IGhhcmR3YXJlIGVuY3J5cHRpb24gdG8gYmUgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0ID0gMTsKK3N0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0ID0gMDsKIG1vZHVsZV9wYXJhbV9uYW1lZChub2h3Y3J5cHQsIG1vZHBhcmFtX25vaHdjcnlwdCwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vaHdjcnlwdCwgIkRpc2FibGUgaGFyZHdhcmUgZW5jcnlwdGlvbi4iKTsKIApAQCAtMTM5LDggKzEzOCwxOCBAQAogCWVlcHJvbS5kYXRhID0gcnQyeDAwZGV2OwogCWVlcHJvbS5yZWdpc3Rlcl9yZWFkID0gcnQyODAwcGNpX2VlcHJvbXJlZ2lzdGVyX3JlYWQ7CiAJZWVwcm9tLnJlZ2lzdGVyX3dyaXRlID0gcnQyODAwcGNpX2VlcHJvbXJlZ2lzdGVyX3dyaXRlOwotCWVlcHJvbS53aWR0aCA9ICFydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBFMlBST01fQ1NSX1RZUEUpID8KLQkgICAgUENJX0VFUFJPTV9XSURUSF85M0M0NiA6IFBDSV9FRVBST01fV0lEVEhfOTNDNjY7CisJc3dpdGNoIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBFMlBST01fQ1NSX1RZUEUpKQorCXsKKwljYXNlIDA6CisJCWVlcHJvbS53aWR0aCA9IFBDSV9FRVBST01fV0lEVEhfOTNDNDY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZWVwcm9tLndpZHRoID0gUENJX0VFUFJPTV9XSURUSF85M0M2NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWVwcm9tLndpZHRoID0gUENJX0VFUFJPTV9XSURUSF85M0M4NjsKKwkJYnJlYWs7CisJfQogCWVlcHJvbS5yZWdfZGF0YV9pbiA9IDA7CiAJZWVwcm9tLnJlZ19kYXRhX291dCA9IDA7CiAJZWVwcm9tLnJlZ19kYXRhX2Nsb2NrID0gMDsKQEAgLTE4Miw4MiArMTkxLDE0IEBACiAJcmV0dXJuIEZJUk1XQVJFX1JUMjg2MDsKIH0KIAotc3RhdGljIGludCBydDI4MDBwY2lfY2hlY2tfZmlybXdhcmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKK3N0YXRpYyBpbnQgcnQyODAwcGNpX3dyaXRlX2Zpcm13YXJlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJICAgIGNvbnN0IHU4ICpkYXRhLCBjb25zdCBzaXplX3QgbGVuKQogewotCXUxNiBmd19jcmM7Ci0JdTE2IGNyYzsKLQotCS8qCi0JICogT25seSBzdXBwb3J0IDhrYiBmaXJtd2FyZSBmaWxlcy4KLQkgKi8KLQlpZiAobGVuICE9IDgxOTIpCi0JCXJldHVybiBGV19CQURfTEVOR1RIOwotCi0JLyoKLQkgKiBUaGUgbGFzdCAyIGJ5dGVzIGluIHRoZSBmaXJtd2FyZSBhcnJheSBhcmUgdGhlIGNyYyBjaGVja3N1bSBpdHNlbGYsCi0JICogdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBuZXZlciBwYXNzIHRob3NlIDIgYnl0ZXMgdG8gdGhlIGNyYwotCSAqIGFsZ29yaXRobS4KLQkgKi8KLQlmd19jcmMgPSAoZGF0YVtsZW4gLSAyXSA8PCA4IHwgZGF0YVtsZW4gLSAxXSk7Ci0KLQkvKgotCSAqIFVzZSB0aGUgY3JjIGNjaXR0IGFsZ29yaXRobS4KLQkgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBsZWdhY3kgZHJpdmVyIHdoaWNoCi0JICogdXNlZCBiaXQgb3JkZXJpbmcgcmV2ZXJzaW9uIG9uIHRoZSBib3RoIHRoZSBmaXJtd2FyZSBieXRlcwotCSAqIGJlZm9yZSBpbnB1dCBpbnB1dCBhcyB3ZWxsIGFzIG9uIHRoZSBmaW5hbCBvdXRwdXQuCi0JICogT2J2aW91c2x5IHVzaW5nIGNyYyBjY2l0dCBkaXJlY3RseSBpcyBtdWNoIG1vcmUgZWZmaWNpZW50LgotCSAqLwotCWNyYyA9IGNyY19jY2l0dCh+MCwgZGF0YSwgbGVuIC0gMik7Ci0KLQkvKgotCSAqIFRoZXJlIGlzIGEgc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjcmMtaXR1LXQgKyBiaXRyZXYgYW5kCi0JICogdGhlIGNyYy1jY2l0dCBjcmMgY2FsY3VsYXRpb24uIEluIHRoZSBsYXR0ZXIgbWV0aG9kIHRoZSAyIGJ5dGVzCi0JICogd2lsbCBiZSBzd2FwcGVkLCB1c2Ugc3dhYjE2IHRvIGNvbnZlcnQgdGhlIGNyYyB0byB0aGUgY29ycmVjdAotCSAqIHZhbHVlLgotCSAqLwotCWNyYyA9IHN3YWIxNihjcmMpOwotCi0JcmV0dXJuIChmd19jcmMgPT0gY3JjKSA/IEZXX09LIDogRldfQkFEX0NSQzsKLX0KLQotc3RhdGljIGludCBydDI4MDBwY2lfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAotCQkJCSAgIGNvbnN0IHU4ICpkYXRhLCBjb25zdCBzaXplX3QgbGVuKQotewotCXVuc2lnbmVkIGludCBpOwogCXUzMiByZWc7CiAKLQkvKgotCSAqIFdhaXQgZm9yIHN0YWJsZSBoYXJkd2FyZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfQlVTWV9DT1VOVDsgaSsrKSB7Ci0JCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgTUFDX0NTUjAsICZyZWcpOwotCQlpZiAocmVnICYmIHJlZyAhPSB+MCkKLQkJCWJyZWFrOwotCQltc2xlZXAoMSk7Ci0JfQotCi0JaWYgKGkgPT0gUkVHSVNURVJfQlVTWV9DT1VOVCkgewotCQlFUlJPUihydDJ4MDBkZXYsICJVbnN0YWJsZSBoYXJkd2FyZS5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFBXUl9QSU5fQ0ZHLCAweDAwMDAwMDAyKTsKIAlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBBVVRPV0FLRVVQX0NGRywgMHgwMDAwMDAwMCk7CiAKIAkvKgotCSAqIERpc2FibGUgRE1BLCB3aWxsIGJlIHJlZW5hYmxlZCBsYXRlciB3aGVuIGVuYWJsaW5nCi0JICogdGhlIHJhZGlvLgotCSAqLwotCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgV1BETUFfR0xPX0NGRywgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX0dMT19DRkdfRU5BQkxFX1RYX0RNQSwgMCk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX0dMT19DRkdfVFhfRE1BX0JVU1ksIDApOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9HTE9fQ0ZHX0VOQUJMRV9SWF9ETUEsIDApOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9HTE9fQ0ZHX1JYX0RNQV9CVVNZLCAwKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfR0xPX0NGR19UWF9XUklURUJBQ0tfRE9ORSwgMSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgV1BETUFfR0xPX0NGRywgcmVnKTsKLQotCS8qCiAJICogZW5hYmxlIEhvc3QgcHJvZ3JhbSByYW0gd3JpdGUgc2VsZWN0aW9uCiAJICovCiAJcmVnID0gMDsKQEAgLTI2OCwzNCArMjA5LDExIEBACiAJICogV3JpdGUgZmlybXdhcmUgdG8gZGV2aWNlLgogCSAqLwogCXJ0MjgwMF9yZWdpc3Rlcl9tdWx0aXdyaXRlKHJ0MngwMGRldiwgRklSTVdBUkVfSU1BR0VfQkFTRSwKLQkJCQkgICAgICBkYXRhLCBsZW4pOworCQkJCSAgIGRhdGEsIGxlbik7CiAKIAlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOwogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CiAKLQkvKgotCSAqIFdhaXQgZm9yIGRldmljZSB0byBzdGFiaWxpemUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX0JVU1lfQ09VTlQ7IGkrKykgewotCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwgJnJlZyk7Ci0JCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBQQkZfU1lTX0NUUkxfUkVBRFkpKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0KLQlpZiAoaSA9PSBSRUdJU1RFUl9CVVNZX0NPVU5UKSB7Ci0JCUVSUk9SKHJ0MngwMGRldiwgIlBCRiBzeXN0ZW0gcmVnaXN0ZXIgbm90IHJlYWR5LlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyoKLQkgKiBEaXNhYmxlIGludGVycnVwdHMKLQkgKi8KLQlydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwgU1RBVEVfUkFESU9fSVJRX09GRik7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKLQkgKi8KIAlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBIMk1fQkJQX0FHRU5ULCAwKTsKIAlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBIMk1fTUFJTEJPWF9DU1IsIDApOwogCkBAIC00MTIsNyArMzMwLDggQEAKIHN0YXRpYyB2b2lkIHJ0MjgwMHBjaV90b2dnbGVfaXJxKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJIGVudW0gZGV2X3N0YXRlIHN0YXRlKQogewotCWludCBtYXNrID0gKHN0YXRlID09IFNUQVRFX1JBRElPX0lSUV9PTik7CisJaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09OKSB8fAorCQkgICAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09OX0lTUik7CiAJdTMyIHJlZzsKIAogCS8qCkBAIC00NDYsNiArMzY1LDM4IEBACiAJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgSU5UX01BU0tfQ1NSLCByZWcpOwogfQogCitzdGF0aWMgaW50IHJ0MjgwMHBjaV9pbml0X3JlZ2lzdGVycyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQoreworCXUzMiByZWc7CisKKwkvKgorCSAqIFJlc2V0IERNQSBpbmRleGVzCisJICovCisJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBXUERNQV9SU1RfSURYLCAmcmVnKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfUlNUX0lEWF9EVFhfSURYMCwgMSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX1JTVF9JRFhfRFRYX0lEWDEsIDEpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9SU1RfSURYX0RUWF9JRFgyLCAxKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfUlNUX0lEWF9EVFhfSURYMywgMSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFdQRE1BX1JTVF9JRFhfRFRYX0lEWDQsIDEpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBXUERNQV9SU1RfSURYX0RUWF9JRFg1LCAxKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgV1BETUFfUlNUX0lEWF9EUlhfSURYMCwgMSk7CisJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgV1BETUFfUlNUX0lEWCwgcmVnKTsKKworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMGUxZik7CisJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUEJGX1NZU19DVFJMLCAweDAwMDAwZTAwKTsKKworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFBXUl9QSU5fQ0ZHLCAweDAwMDAwMDAzKTsKKworCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgTUFDX1NZU19DVFJMLCAmcmVnKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTUFDX1NZU19DVFJMX1JFU0VUX0NTUiwgMSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19TWVNfQ1RSTF9SRVNFVF9CQlAsIDEpOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIE1BQ19TWVNfQ1RSTCwgcmVnKTsKKworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIE1BQ19TWVNfQ1RSTCwgMHgwMDAwMDAwMCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBydDI4MDBwY2lfZW5hYmxlX3JhZGlvKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJdTMyIHJlZzsKQEAgLTQ2NSw3ICs0MTYsNyBAQAogCS8qCiAJICogU2VuZCBzaWduYWwgdG8gZmlybXdhcmUgZHVyaW5nIGJvb3QgdGltZS4KIAkgKi8KLQlydDI4MDBfbWN1X3JlcXVlc3QocnQyeDAwZGV2LCBNQ1VfQk9PVF9TSUdOQUwsIDB4ZmYsIDAsIDApOworCXJ0MjgwMF9tY3VfcmVxdWVzdChydDJ4MDBkZXYsIE1DVV9CT09UX1NJR05BTCwgMCwgMCwgMCk7CiAKIAkvKgogCSAqIEVuYWJsZSBSWC4KQEAgLTU4OSw3ICs1NDAsOSBAQAogCQlydDI4MDBwY2lfdG9nZ2xlX3J4KHJ0MngwMGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PTjoKKwljYXNlIFNUQVRFX1JBRElPX0lSUV9PTl9JU1I6CiAJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09GRl9JU1I6CiAJCXJ0MjgwMHBjaV90b2dnbGVfaXJxKHJ0MngwMGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX0RFRVBfU0xFRVA6CkBAIC02MTMsMTggKzU2NiwxMiBAQAogLyoKICAqIFRYIGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24KICAqLwotc3RhdGljIGludCBydDI4MDBwY2lfd3JpdGVfdHhfZGF0YShzdHJ1Y3QgcXVldWVfZW50cnkqIGVudHJ5LAotCQkJCSAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKK3N0YXRpYyB2b2lkIHJ0MjgwMHBjaV93cml0ZV90eF9kYXRhKHN0cnVjdCBxdWV1ZV9lbnRyeSogZW50cnksCisJCQkJICAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKIHsKLQlpbnQgcmV0OworCV9fbGUzMiAqdHh3aSA9IChfX2xlMzIgKikgZW50cnktPnNrYi0+ZGF0YTsKIAotCXJldCA9IHJ0MngwMHBjaV93cml0ZV90eF9kYXRhKGVudHJ5LCB0eGRlc2MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlydDI4MDBfd3JpdGVfdHh3aShlbnRyeS0+c2tiLCB0eGRlc2MpOwotCi0JcmV0dXJuIDA7CisJcnQyODAwX3dyaXRlX3R4d2kodHh3aSwgdHhkZXNjKTsKIH0KIAogCkBAIC02ODQsNDkgKzYzMSw2IEBACiAvKgogICogVFggZGF0YSBpbml0aWFsaXphdGlvbgogICovCi1zdGF0aWMgdm9pZCBydDI4MDBwY2lfd3JpdGVfYmVhY29uKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCi0JCQkJICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQotewotCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKLQl1bnNpZ25lZCBpbnQgYmVhY29uX2Jhc2U7Ci0JdTMyIHJlZzsKLQotCS8qCi0JICogRGlzYWJsZSBiZWFjb25pbmcgd2hpbGUgd2UgYXJlIHJlbG9hZGluZyB0aGUgYmVhY29uIGRhdGEsCi0JICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGJlIHNlbmRpbmcgb3V0IGludmFsaWQgZGF0YS4KLQkgKi8KLQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIEJDTl9USU1FX0NGRywgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJDTl9USU1FX0NGR19CRUFDT05fR0VOLCAwKTsKLQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBCQ05fVElNRV9DRkcsIHJlZyk7Ci0KLQkvKgotCSAqIEFkZCB0aGUgVFhXSSBmb3IgdGhlIGJlYWNvbiB0byB0aGUgc2tiLgotCSAqLwotCXJ0MjgwMF93cml0ZV90eHdpKGVudHJ5LT5za2IsIHR4ZGVzYyk7Ci0Jc2tiX3B1c2goZW50cnktPnNrYiwgVFhXSV9ERVNDX1NJWkUpOwotCi0JLyoKLQkgKiBXcml0ZSBlbnRpcmUgYmVhY29uIHdpdGggVFhXSSB0byByZWdpc3Rlci4KLQkgKi8KLQliZWFjb25fYmFzZSA9IEhXX0JFQUNPTl9PRkZTRVQoZW50cnktPmVudHJ5X2lkeCk7Ci0JcnQyODAwX3JlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCBiZWFjb25fYmFzZSwKLQkJCQkgICBlbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5sZW4pOwotCi0JLyoKLQkgKiBFbmFibGUgYmVhY29uaW5nIGFnYWluLgotCSAqLwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfVFNGX1RJQ0tJTkcsIDEpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfVEJUVF9FTkFCTEUsIDEpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0dFTiwgMSk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCByZWcpOwotCi0JLyoKLQkgKiBDbGVhbiB1cCBiZWFjb24gc2tiLgotCSAqLwotCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOwotCWVudHJ5LT5za2IgPSBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCBydDI4MDBwY2lfa2lja190eF9xdWV1ZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCSAgICBjb25zdCBlbnVtIGRhdGFfcXVldWVfcWlkIHF1ZXVlX2lkeCkKIHsKQEAgLTgxMiw3ICs3MTYsNyBAQAogCS8qCiAJICogUHJvY2VzcyB0aGUgUlhXSSBzdHJ1Y3R1cmUgdGhhdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KIAkgKi8KLQlydDI4MDBfcHJvY2Vzc19yeHdpKGVudHJ5LT5za2IsIHJ4ZGVzYyk7CisJcnQyODAwX3Byb2Nlc3Nfcnh3aShlbnRyeSwgcnhkZXNjKTsKIAogCS8qCiAJICogU2V0IFJYIElEWCBpbiByZWdpc3RlciB0byBpbmZvcm0gaGFyZHdhcmUgdGhhdCB3ZSBoYXZlIGhhbmRsZWQKQEAgLTgzMiwyOSArNzM2LDI0IEBACiAJc3RydWN0IHR4ZG9uZV9lbnRyeV9kZXNjIHR4ZGVzYzsKIAl1MzIgd29yZDsKIAl1MzIgcmVnOwotCXUzMiBvbGRfcmVnOwogCWludCB3Y2lkLCBhY2ssIHBpZCwgdHhfd2NpZCwgdHhfYWNrLCB0eF9waWQ7CiAJdTE2IG1jcywgcmVhbF9tY3M7CisJaW50IGk7CiAKIAkvKgotCSAqIER1cmluZyBlYWNoIGxvb3Agd2Ugd2lsbCBjb21wYXJlIHRoZSBmcmVzaGx5IHJlYWQKLQkgKiBUWF9TVEFfRklGTyByZWdpc3RlciB2YWx1ZSB3aXRoIHRoZSB2YWx1ZSByZWFkIGZyb20KLQkgKiB0aGUgcHJldmlvdXMgbG9vcC4gSWYgdGhlIDIgdmFsdWVzIGFyZSBlcXVhbCB0aGVuCi0JICogd2Ugc2hvdWxkIHN0b3AgcHJvY2Vzc2luZyBiZWNhdXNlIHRoZSBjaGFuY2UgaXQKLQkgKiBxdWl0ZSBiaWcgdGhhdCB0aGUgZGV2aWNlIGhhcyBiZWVuIHVucGx1Z2dlZCBhbmQKLQkgKiB3ZSByaXNrIGdvaW5nIGludG8gYW4gZW5kbGVzcyBsb29wLgorCSAqIFRYX1NUQV9GSUZPIGlzIGEgc3RhY2sgb2YgWCBlbnRyaWVzLCBoZW5jZSByZWFkIFRYX1NUQV9GSUZPCisJICogYXQgbW9zdCBYIHRpbWVzIGFuZCBhbHNvIHN0b3AgcHJvY2Vzc2luZyBvbmNlIHRoZSBUWF9TVEFfRklGT19WQUxJRAorCSAqIGZsYWcgaXMgbm90IHNldCBhbnltb3JlLgorCSAqCisJICogVGhlIGxlZ2FjeSBkcml2ZXJzIHVzZSBYPVRYX1JJTkdfU0laRSBidXQgc3RhdGUgaW4gYSBjb21tZW50CisJICogdGhhdCB0aGUgVFhfU1RBX0ZJRk8gc3RhY2sgaGFzIGEgc2l6ZSBvZiAxNi4gV2Ugc3RpY2sgdG8gb3VyCisJICogdHggcmluZyBzaXplIGZvciBub3cuCiAJICovCi0Jb2xkX3JlZyA9IDA7Ci0KLQl3aGlsZSAoMSkgeworCWZvciAoaSA9IDA7IGkgPCBUWF9FTlRSSUVTOyBpKyspIHsKIAkJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWF9TVEFfRklGTywgJnJlZyk7CiAJCWlmICghcnQyeDAwX2dldF9maWVsZDMyKHJlZywgVFhfU1RBX0ZJRk9fVkFMSUQpKQogCQkJYnJlYWs7CiAKLQkJaWYgKG9sZF9yZWcgPT0gcmVnKQotCQkJYnJlYWs7Ci0JCW9sZF9yZWcgPSByZWc7Ci0KIAkJd2NpZCAgICA9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIFRYX1NUQV9GSUZPX1dDSUQpOwogCQlhY2sgICAgID0gcnQyeDAwX2dldF9maWVsZDMyKHJlZywgVFhfU1RBX0ZJRk9fVFhfQUNLX1JFUVVJUkVEKTsKIAkJcGlkICAgICA9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIFRYX1NUQV9GSUZPX1BJRF9UWVBFKTsKQEAgLTg4MCw4ICs3NzksNyBAQAogCiAJCS8qIENoZWNrIGlmIHdlIGdvdCBhIG1hdGNoIGJ5IGxvb2tpbmcgYXQgV0NJRC9BQ0svUElECiAJCSAqIGZpZWxkcyAqLwotCQl0eHdpID0gKF9fbGUzMiAqKShlbnRyeS0+c2tiLT5kYXRhIC0KLQkJCQkgIHJ0MngwMGRldi0+b3BzLT5leHRyYV90eF9oZWFkcm9vbSk7CisJCXR4d2kgPSAoX19sZTMyICopIGVudHJ5LT5za2ItPmRhdGE7CiAKIAkJcnQyeDAwX2Rlc2NfcmVhZCh0eHdpLCAxLCAmd29yZCk7CiAJCXR4X3djaWQgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgVFhXSV9XMV9XSVJFTEVTU19DTElfSUQpOwpAQCAtOTIzLDggKzgyMSwxMiBAQAogCQkJdHhkZXNjLnJldHJ5ID0gNzsKIAkJfQogCi0JCV9fc2V0X2JpdChUWERPTkVfRkFMTEJBQ0ssICZ0eGRlc2MuZmxhZ3MpOwotCisJCS8qCisJCSAqIHRoZSBmcmFtZSB3YXMgcmV0cmllZCBhdCBsZWFzdCBvbmNlCisJCSAqIC0+IGh3IHVzZWQgZmFsbGJhY2sgcmF0ZXMKKwkJICovCisJCWlmICh0eGRlc2MucmV0cnkpCisJCQlfX3NldF9iaXQoVFhET05FX0ZBTExCQUNLLCAmdHhkZXNjLmZsYWdzKTsKIAogCQlydDJ4MDBsaWJfdHhkb25lKGVudHJ5LCAmdHhkZXNjKTsKIAl9CkBAIC05MzgsNiArODQwLDQ4IEBACiAJcnQyODAwX2NvbmZpZyhydDJ4MDBkZXYsICZsaWJjb25mLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgcnQyODAwcGNpX2ludGVycnVwdF90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBkZXZfaW5zdGFuY2U7CisJdTMyIHJlZyA9IHJ0MngwMGRldi0+aXJxdmFsdWVbMF07CisKKwkvKgorCSAqIDEgLSBQcmUgVEJUVCBpbnRlcnJ1cHQuCisJICovCisJaWYgKHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIElOVF9TT1VSQ0VfQ1NSX1BSRV9UQlRUKSkKKwkJcnQyeDAwbGliX3ByZXRidHQocnQyeDAwZGV2KTsKKworCS8qCisJICogMiAtIEJlYWNvbmRvbmUgaW50ZXJydXB0LgorCSAqLworCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBJTlRfU09VUkNFX0NTUl9UQlRUKSkKKwkJcnQyeDAwbGliX2JlYWNvbmRvbmUocnQyeDAwZGV2KTsKKworCS8qCisJICogMyAtIFJ4IHJpbmcgZG9uZSBpbnRlcnJ1cHQuCisJICovCisJaWYgKHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIElOVF9TT1VSQ0VfQ1NSX1JYX0RPTkUpKQorCQlydDJ4MDBwY2lfcnhkb25lKHJ0MngwMGRldik7CisKKwkvKgorCSAqIDQgLSBUeCBkb25lIGludGVycnVwdC4KKwkgKi8KKwlpZiAocnQyeDAwX2dldF9maWVsZDMyKHJlZywgSU5UX1NPVVJDRV9DU1JfVFhfRklGT19TVEFUVVMpKQorCQlydDI4MDBwY2lfdHhkb25lKHJ0MngwMGRldik7CisKKwkvKgorCSAqIDUgLSBBdXRvIHdha2V1cCBpbnRlcnJ1cHQuCisJICovCisJaWYgKHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIElOVF9TT1VSQ0VfQ1NSX0FVVE9fV0FLRVVQKSkKKwkJcnQyODAwcGNpX3dha2V1cChydDJ4MDBkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYWdhaW4uICovCisJcnQyeDAwZGV2LT5vcHMtPmxpYi0+c2V0X2RldmljZV9zdGF0ZShydDJ4MDBkZXYsCisJCQkJCSAgICAgIFNUQVRFX1JBRElPX0lSUV9PTl9JU1IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgcnQyODAwcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGRldl9pbnN0YW5jZTsKQEAgLTk1MywxOSArODk3LDE1IEBACiAJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKLQkvKgotCSAqIDEgLSBSeCByaW5nIGRvbmUgaW50ZXJydXB0LgotCSAqLwotCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBJTlRfU09VUkNFX0NTUl9SWF9ET05FKSkKLQkJcnQyeDAwcGNpX3J4ZG9uZShydDJ4MDBkZXYpOworCS8qIFN0b3JlIGlycXZhbHVlIGZvciB1c2UgaW4gdGhlIGludGVycnVwdCB0aHJlYWQuICovCisJcnQyeDAwZGV2LT5pcnF2YWx1ZVswXSA9IHJlZzsKIAotCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBJTlRfU09VUkNFX0NTUl9UWF9GSUZPX1NUQVRVUykpCi0JCXJ0MjgwMHBjaV90eGRvbmUocnQyeDAwZGV2KTsKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHdpbGwgYmUgZW5hYmxlZCBhZ2FpbiBpbiB0aGUgaW50ZXJydXB0IHRocmVhZC4gKi8KKwlydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwKKwkJCQkJICAgICAgU1RBVEVfUkFESU9fSVJRX09GRl9JU1IpOwogCi0JaWYgKHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIElOVF9TT1VSQ0VfQ1NSX0FVVE9fV0FLRVVQKSkKLQkJcnQyODAwcGNpX3dha2V1cChydDJ4MDBkZXYpOwogCi0JcmV0dXJuIElSUV9IQU5ETEVEOworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CiB9CiAKIC8qCkBAIC05ODYsMjQgKzkyNiwxMCBAQAogCXJldHVybiBydDI4MDBfdmFsaWRhdGVfZWVwcm9tKHJ0MngwMGRldik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnQyODAwX29wcyBydDI4MDBwY2lfcnQyODAwX29wcyA9IHsKLQkucmVnaXN0ZXJfcmVhZAkJPSBydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZCwKLQkucmVnaXN0ZXJfcmVhZF9sb2NrCT0gcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQsIC8qIHNhbWUgZm9yIFBDSSAqLwotCS5yZWdpc3Rlcl93cml0ZQkJPSBydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUsCi0JLnJlZ2lzdGVyX3dyaXRlX2xvY2sJPSBydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUsIC8qIHNhbWUgZm9yIFBDSSAqLwotCi0JLnJlZ2lzdGVyX211bHRpcmVhZAk9IHJ0MngwMHBjaV9yZWdpc3Rlcl9tdWx0aXJlYWQsCi0JLnJlZ2lzdGVyX211bHRpd3JpdGUJPSBydDJ4MDBwY2lfcmVnaXN0ZXJfbXVsdGl3cml0ZSwKLQotCS5yZWdidXN5X3JlYWQJCT0gcnQyeDAwcGNpX3JlZ2J1c3lfcmVhZCwKLX07Ci0KIHN0YXRpYyBpbnQgcnQyODAwcGNpX3Byb2JlX2h3KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJaW50IHJldHZhbDsKIAotCXJ0MngwMGRldi0+cHJpdiA9ICh2b2lkICopJnJ0MjgwMHBjaV9ydDI4MDBfb3BzOwotCiAJLyoKIAkgKiBBbGxvY2F0ZSBlZXByb20gZGF0YS4KIAkgKi8KQEAgLTEwMzAsNiArOTU2LDEyIEBACiAJX19zZXRfYml0KERSSVZFUl9TVVBQT1JUX0NPTlRST0xfRklMVEVSX1BTUE9MTCwgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKKwkgKiBUaGlzIGRldmljZSBoYXMgYSBwcmUgdGJ0dCBpbnRlcnJ1cHQgYW5kIHRodXMgZmV0Y2hlcworCSAqIGEgbmV3IGJlYWNvbiBkaXJlY3RseSBwcmlvciB0byB0cmFuc21pc3Npb24uCisJICovCisJX19zZXRfYml0KERSSVZFUl9TVVBQT1JUX1BSRV9UQlRUX0lOVEVSUlVQVCwgJnJ0MngwMGRldi0+ZmxhZ3MpOworCisJLyoKIAkgKiBUaGlzIGRldmljZSByZXF1aXJlcyBmaXJtd2FyZS4KIAkgKi8KIAlpZiAoIXJ0MngwMF9pc19zb2MocnQyeDAwZGV2KSkKQEAgLTEwMzgsNiArOTcwLDcgQEAKIAlfX3NldF9iaXQoRFJJVkVSX1JFUVVJUkVfTDJQQUQsICZydDJ4MDBkZXYtPmZsYWdzKTsKIAlpZiAoIW1vZHBhcmFtX25vaHdjcnlwdCkKIAkJX19zZXRfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCV9fc2V0X2JpdChEUklWRVJfU1VQUE9SVF9MSU5LX1RVTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKIAkgKiBTZXQgdGhlIHJzc2kgb2Zmc2V0LgpAQCAtMTA0NywxMiArOTgwLDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyBydDI4MDBwY2lfbWFjODAyMTFfb3BzID0geworCS50eAkJCT0gcnQyeDAwbWFjX3R4LAorCS5zdGFydAkJCT0gcnQyeDAwbWFjX3N0YXJ0LAorCS5zdG9wCQkJPSBydDJ4MDBtYWNfc3RvcCwKKwkuYWRkX2ludGVyZmFjZQkJPSBydDJ4MDBtYWNfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZQk9IHJ0MngwMG1hY19yZW1vdmVfaW50ZXJmYWNlLAorCS5jb25maWcJCQk9IHJ0MngwMG1hY19jb25maWcsCisJLmNvbmZpZ3VyZV9maWx0ZXIJPSBydDJ4MDBtYWNfY29uZmlndXJlX2ZpbHRlciwKKwkuc2V0X2tleQkJPSBydDJ4MDBtYWNfc2V0X2tleSwKKwkuc3dfc2Nhbl9zdGFydAkJPSBydDJ4MDBtYWNfc3dfc2Nhbl9zdGFydCwKKwkuc3dfc2Nhbl9jb21wbGV0ZQk9IHJ0MngwMG1hY19zd19zY2FuX2NvbXBsZXRlLAorCS5nZXRfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF9zdGF0cywKKwkuZ2V0X3RraXBfc2VxCQk9IHJ0MjgwMF9nZXRfdGtpcF9zZXEsCisJLnNldF9ydHNfdGhyZXNob2xkCT0gcnQyODAwX3NldF9ydHNfdGhyZXNob2xkLAorCS5ic3NfaW5mb19jaGFuZ2VkCT0gcnQyeDAwbWFjX2Jzc19pbmZvX2NoYW5nZWQsCisJLmNvbmZfdHgJCT0gcnQyODAwX2NvbmZfdHgsCisJLmdldF90c2YJCT0gcnQyODAwX2dldF90c2YsCisJLnJma2lsbF9wb2xsCQk9IHJ0MngwMG1hY19yZmtpbGxfcG9sbCwKKwkuYW1wZHVfYWN0aW9uCQk9IHJ0MjgwMF9hbXBkdV9hY3Rpb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgcnQyODAwcGNpX3J0MjgwMF9vcHMgPSB7CisJLnJlZ2lzdGVyX3JlYWQJCT0gcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQsCisJLnJlZ2lzdGVyX3JlYWRfbG9jawk9IHJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkLCAvKiBzYW1lIGZvciBQQ0kgKi8KKwkucmVnaXN0ZXJfd3JpdGUJCT0gcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlLAorCS5yZWdpc3Rlcl93cml0ZV9sb2NrCT0gcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlLCAvKiBzYW1lIGZvciBQQ0kgKi8KKwkucmVnaXN0ZXJfbXVsdGlyZWFkCT0gcnQyeDAwcGNpX3JlZ2lzdGVyX211bHRpcmVhZCwKKwkucmVnaXN0ZXJfbXVsdGl3cml0ZQk9IHJ0MngwMHBjaV9yZWdpc3Rlcl9tdWx0aXdyaXRlLAorCS5yZWdidXN5X3JlYWQJCT0gcnQyeDAwcGNpX3JlZ2J1c3lfcmVhZCwKKwkuZHJ2X3dyaXRlX2Zpcm13YXJlCT0gcnQyODAwcGNpX3dyaXRlX2Zpcm13YXJlLAorCS5kcnZfaW5pdF9yZWdpc3RlcnMJPSBydDI4MDBwY2lfaW5pdF9yZWdpc3RlcnMsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MngwMGxpYl9vcHMgcnQyODAwcGNpX3J0MngwMF9vcHMgPSB7CiAJLmlycV9oYW5kbGVyCQk9IHJ0MjgwMHBjaV9pbnRlcnJ1cHQsCisJLmlycV9oYW5kbGVyX3RocmVhZAk9IHJ0MjgwMHBjaV9pbnRlcnJ1cHRfdGhyZWFkLAogCS5wcm9iZV9odwkJPSBydDI4MDBwY2lfcHJvYmVfaHcsCiAJLmdldF9maXJtd2FyZV9uYW1lCT0gcnQyODAwcGNpX2dldF9maXJtd2FyZV9uYW1lLAotCS5jaGVja19maXJtd2FyZQkJPSBydDI4MDBwY2lfY2hlY2tfZmlybXdhcmUsCi0JLmxvYWRfZmlybXdhcmUJCT0gcnQyODAwcGNpX2xvYWRfZmlybXdhcmUsCisJLmNoZWNrX2Zpcm13YXJlCQk9IHJ0MjgwMF9jaGVja19maXJtd2FyZSwKKwkubG9hZF9maXJtd2FyZQkJPSBydDI4MDBfbG9hZF9maXJtd2FyZSwKIAkuaW5pdGlhbGl6ZQkJPSBydDJ4MDBwY2lfaW5pdGlhbGl6ZSwKIAkudW5pbml0aWFsaXplCQk9IHJ0MngwMHBjaV91bmluaXRpYWxpemUsCiAJLmdldF9lbnRyeV9zdGF0ZQk9IHJ0MjgwMHBjaV9nZXRfZW50cnlfc3RhdGUsCkBAIC0xMDY0LDcgKzEwMzEsNyBAQAogCS5saW5rX3R1bmVyCQk9IHJ0MjgwMF9saW5rX3R1bmVyLAogCS53cml0ZV90eF9kZXNjCQk9IHJ0MjgwMHBjaV93cml0ZV90eF9kZXNjLAogCS53cml0ZV90eF9kYXRhCQk9IHJ0MjgwMHBjaV93cml0ZV90eF9kYXRhLAotCS53cml0ZV9iZWFjb24JCT0gcnQyODAwcGNpX3dyaXRlX2JlYWNvbiwKKwkud3JpdGVfYmVhY29uCQk9IHJ0MjgwMF93cml0ZV9iZWFjb24sCiAJLmtpY2tfdHhfcXVldWUJCT0gcnQyODAwcGNpX2tpY2tfdHhfcXVldWUsCiAJLmtpbGxfdHhfcXVldWUJCT0gcnQyODAwcGNpX2tpbGxfdHhfcXVldWUsCiAJLmZpbGxfcnhkb25lCQk9IHJ0MjgwMHBjaV9maWxsX3J4ZG9uZSwKQEAgLTExMTAsNyArMTA3Nyw4IEBACiAJLnR4CQkJPSAmcnQyODAwcGNpX3F1ZXVlX3R4LAogCS5iY24JCQk9ICZydDI4MDBwY2lfcXVldWVfYmNuLAogCS5saWIJCQk9ICZydDI4MDBwY2lfcnQyeDAwX29wcywKLQkuaHcJCQk9ICZydDI4MDBfbWFjODAyMTFfb3BzLAorCS5kcnYJCQk9ICZydDI4MDBwY2lfcnQyODAwX29wcywKKwkuaHcJCQk9ICZydDI4MDBwY2lfbWFjODAyMTFfb3BzLAogI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMKIAkuZGVidWdmcwkJPSAmcnQyODAwX3J0MngwMGRlYnVnLAogI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBwY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBwY2kuaAppbmRleCBhZmM4ZTdkLi41YThkZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHBjaS5oCkBAIC0zNSwyNSArMzUsNiBAQAogI2RlZmluZSBSVDI4MDBQQ0lfSAogCiAvKgotICogUENJIHJlZ2lzdGVycy4KLSAqLwotCi0vKgotICogRTJQUk9NX0NTUjogRUVQUk9NIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKiBSRUxPQUQ6IFdyaXRlIDEgdG8gcmVsb2FkIGVlcHJvbSBjb250ZW50LgotICogVFlQRTogMDogOTNjNDYsIDE6OTNjNjYuCi0gKiBMT0FEX1NUQVRVUzogMTpsb2FkaW5nLCAwOmRvbmUuCi0gKi8KLSNkZWZpbmUgRTJQUk9NX0NTUgkJCTB4MDAwNAotI2RlZmluZSBFMlBST01fQ1NSX0RBVEFfQ0xPQ0sJCUZJRUxEMzIoMHgwMDAwMDAwMSkKLSNkZWZpbmUgRTJQUk9NX0NTUl9DSElQX1NFTEVDVAkJRklFTEQzMigweDAwMDAwMDAyKQotI2RlZmluZSBFMlBST01fQ1NSX0RBVEFfSU4JCUZJRUxEMzIoMHgwMDAwMDAwNCkKLSNkZWZpbmUgRTJQUk9NX0NTUl9EQVRBX09VVAkJRklFTEQzMigweDAwMDAwMDA4KQotI2RlZmluZSBFMlBST01fQ1NSX1RZUEUJCQlGSUVMRDMyKDB4MDAwMDAwMzApCi0jZGVmaW5lIEUyUFJPTV9DU1JfTE9BRF9TVEFUVVMJCUZJRUxEMzIoMHgwMDAwMDA0MCkKLSNkZWZpbmUgRTJQUk9NX0NTUl9SRUxPQUQJCUZJRUxEMzIoMHgwMDAwMDA4MCkKLQotLyoKICAqIFF1ZXVlIHJlZ2lzdGVyIG9mZnNldCBtYWNyb3MKICAqLwogI2RlZmluZSBUWF9RVUVVRV9SRUdfT0ZGU0VUCQkweDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKaW5kZXggMGY4Yjg0Yi4uNWEyZGZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYwpAQCAtMjgsNyArMjgsNiBAQAogCVN1cHBvcnRlZCBjaGlwc2V0czogUlQyODAwVS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTQ1LDcgKzQ0LDcgQEAKIC8qCiAgKiBBbGxvdyBoYXJkd2FyZSBlbmNyeXB0aW9uIHRvIGJlIGRpc2FibGVkLgogICovCi1zdGF0aWMgaW50IG1vZHBhcmFtX25vaHdjcnlwdCA9IDE7CitzdGF0aWMgaW50IG1vZHBhcmFtX25vaHdjcnlwdCA9IDA7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9od2NyeXB0LCBtb2RwYXJhbV9ub2h3Y3J5cHQsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhub2h3Y3J5cHQsICJEaXNhYmxlIGhhcmR3YXJlIGVuY3J5cHRpb24uIik7CiAKQEAgLTU3LDg0ICs1NiwxMCBAQAogCXJldHVybiBGSVJNV0FSRV9SVDI4NzA7CiB9CiAKLXN0YXRpYyBib29sIHJ0MjgwMHVzYl9jaGVja19jcmMoY29uc3QgdTggKmRhdGEsIGNvbnN0IHNpemVfdCBsZW4pCi17Ci0JdTE2IGZ3X2NyYzsKLQl1MTYgY3JjOwotCi0JLyoKLQkgKiBUaGUgbGFzdCAyIGJ5dGVzIGluIHRoZSBmaXJtd2FyZSBhcnJheSBhcmUgdGhlIGNyYyBjaGVja3N1bSBpdHNlbGYsCi0JICogdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBuZXZlciBwYXNzIHRob3NlIDIgYnl0ZXMgdG8gdGhlIGNyYwotCSAqIGFsZ29yaXRobS4KLQkgKi8KLQlmd19jcmMgPSAoZGF0YVtsZW4gLSAyXSA8PCA4IHwgZGF0YVtsZW4gLSAxXSk7Ci0KLQkvKgotCSAqIFVzZSB0aGUgY3JjIGNjaXR0IGFsZ29yaXRobS4KLQkgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBsZWdhY3kgZHJpdmVyIHdoaWNoCi0JICogdXNlZCBiaXQgb3JkZXJpbmcgcmV2ZXJzaW9uIG9uIHRoZSBib3RoIHRoZSBmaXJtd2FyZSBieXRlcwotCSAqIGJlZm9yZSBpbnB1dCBpbnB1dCBhcyB3ZWxsIGFzIG9uIHRoZSBmaW5hbCBvdXRwdXQuCi0JICogT2J2aW91c2x5IHVzaW5nIGNyYyBjY2l0dCBkaXJlY3RseSBpcyBtdWNoIG1vcmUgZWZmaWNpZW50LgotCSAqLwotCWNyYyA9IGNyY19jY2l0dCh+MCwgZGF0YSwgbGVuIC0gMik7Ci0KLQkvKgotCSAqIFRoZXJlIGlzIGEgc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjcmMtaXR1LXQgKyBiaXRyZXYgYW5kCi0JICogdGhlIGNyYy1jY2l0dCBjcmMgY2FsY3VsYXRpb24uIEluIHRoZSBsYXR0ZXIgbWV0aG9kIHRoZSAyIGJ5dGVzCi0JICogd2lsbCBiZSBzd2FwcGVkLCB1c2Ugc3dhYjE2IHRvIGNvbnZlcnQgdGhlIGNyYyB0byB0aGUgY29ycmVjdAotCSAqIHZhbHVlLgotCSAqLwotCWNyYyA9IHN3YWIxNihjcmMpOwotCi0JcmV0dXJuIGZ3X2NyYyA9PSBjcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcnQyODAwdXNiX2NoZWNrX2Zpcm13YXJlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCitzdGF0aWMgaW50IHJ0MjgwMHVzYl93cml0ZV9maXJtd2FyZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCSAgICBjb25zdCB1OCAqZGF0YSwgY29uc3Qgc2l6ZV90IGxlbikKIHsKLQlzaXplX3Qgb2Zmc2V0ID0gMDsKLQotCS8qCi0JICogRmlybXdhcmUgZmlsZXM6Ci0JICogVGhlcmUgYXJlIDIgdmFyaWF0aW9ucyBvZiB0aGUgcnQyODcwIGZpcm13YXJlLgotCSAqIGEpIHNpemU6IDRrYgotCSAqIGIpIHNpemU6IDhrYgotCSAqIE5vdGUgdGhhdCAoYikgY29udGFpbnMgMiBzZXBhcmF0ZSBmaXJtd2FyZSBibG9icyBvZiA0awotCSAqIHdpdGhpbiB0aGUgZmlsZS4gVGhlIGZpcnN0IGJsb2IgaXMgdGhlIHNhbWUgZmlybXdhcmUgYXMgKGEpLAotCSAqIGJ1dCB0aGUgc2Vjb25kIGJsb2IgaXMgZm9yIHRoZSBhZGRpdGlvbmFsIGNoaXBzZXRzLgotCSAqLwotCWlmIChsZW4gIT0gNDA5NiAmJiBsZW4gIT0gODE5MikKLQkJcmV0dXJuIEZXX0JBRF9MRU5HVEg7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHdlIG5lZWQgdGhlIHVwcGVyIDRrYiBmaXJtd2FyZSBkYXRhIG9yIG5vdC4KLQkgKi8KLQlpZiAoKGxlbiA9PSA0MDk2KSAmJgotCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODYwKSAmJgotCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQyODcyKSAmJgotCSAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDcwKSkKLQkJcmV0dXJuIEZXX0JBRF9WRVJTSU9OOwotCi0JLyoKLQkgKiA4a2IgZmlybXdhcmUgZmlsZXMgbXVzdCBiZSBjaGVja2VkIGFzIGlmIGl0IHdlcmUKLQkgKiAyIHNlcGFyYXRlIGZpcm13YXJlIGZpbGVzLgotCSAqLwotCXdoaWxlIChvZmZzZXQgPCBsZW4pIHsKLQkJaWYgKCFydDI4MDB1c2JfY2hlY2tfY3JjKGRhdGEgKyBvZmZzZXQsIDQwOTYpKQotCQkJcmV0dXJuIEZXX0JBRF9DUkM7Ci0KLQkJb2Zmc2V0ICs9IDQwOTY7Ci0JfQotCi0JcmV0dXJuIEZXX09LOwotfQotCi1zdGF0aWMgaW50IHJ0MjgwMHVzYl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCi0JCQkJICAgY29uc3QgdTggKmRhdGEsIGNvbnN0IHNpemVfdCBsZW4pCi17Ci0JdW5zaWduZWQgaW50IGk7CiAJaW50IHN0YXR1czsKLQl1MzIgcmVnOwogCXUzMiBvZmZzZXQ7CiAJdTMyIGxlbmd0aDsKIApAQCAtMTUyLDI4ICs3NywxMCBAQAogCX0KIAogCS8qCi0JICogV2FpdCBmb3Igc3RhYmxlIGhhcmR3YXJlLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9CVVNZX0NPVU5UOyBpKyspIHsKLQkJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBNQUNfQ1NSMCwgJnJlZyk7Ci0JCWlmIChyZWcgJiYgcmVnICE9IH4wKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0KLQlpZiAoaSA9PSBSRUdJU1RFUl9CVVNZX0NPVU5UKSB7Ci0JCUVSUk9SKHJ0MngwMGRldiwgIlVuc3RhYmxlIGhhcmR3YXJlLlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyoKIAkgKiBXcml0ZSBmaXJtd2FyZSB0byBkZXZpY2UuCiAJICovCi0JcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYocnQyeDAwZGV2LCBVU0JfTVVMVElfV1JJVEUsCi0JCQkJCSAgICBVU0JfVkVORE9SX1JFUVVFU1RfT1VULAotCQkJCQkgICAgRklSTVdBUkVfSU1BR0VfQkFTRSwKLQkJCQkJICAgIGRhdGEgKyBvZmZzZXQsIGxlbmd0aCwKLQkJCQkJICAgIFJFR0lTVEVSX1RJTUVPVVQzMihsZW5ndGgpKTsKKwlydDI4MDBfcmVnaXN0ZXJfbXVsdGl3cml0ZShydDJ4MDBkZXYsIEZJUk1XQVJFX0lNQUdFX0JBU0UsCisJCQkJICAgZGF0YSArIG9mZnNldCwgbGVuZ3RoKTsKIAogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEgyTV9NQUlMQk9YX0NJRCwgfjApOwogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEgyTV9NQUlMQk9YX1NUQVRVUywgfjApOwpAQCAtMTk2LDcgKzEwMyw3IEBACiAJLyoKIAkgKiBTZW5kIHNpZ25hbCB0byBmaXJtd2FyZSBkdXJpbmcgYm9vdCB0aW1lLgogCSAqLwotCXJ0MjgwMF9tY3VfcmVxdWVzdChydDJ4MDBkZXYsIE1DVV9CT09UX1NJR05BTCwgMHhmZiwgMCwgMCk7CisJcnQyODAwX21jdV9yZXF1ZXN0KHJ0MngwMGRldiwgTUNVX0JPT1RfU0lHTkFMLCAwLCAwLCAwKTsKIAogCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwNzApIHx8CiAJICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzA3MSkgfHwKQEAgLTIwNiwyOCArMTEzLDYgQEAKIAkJdWRlbGF5KDEwKTsKIAl9CiAKLQkvKgotCSAqIFdhaXQgZm9yIGRldmljZSB0byBzdGFiaWxpemUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX0JVU1lfQ09VTlQ7IGkrKykgewotCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFBCRl9TWVNfQ1RSTCwgJnJlZyk7Ci0JCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBQQkZfU1lTX0NUUkxfUkVBRFkpKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0KLQlpZiAoaSA9PSBSRUdJU1RFUl9CVVNZX0NPVU5UKSB7Ci0JCUVSUk9SKHJ0MngwMGRldiwgIlBCRiBzeXN0ZW0gcmVnaXN0ZXIgbm90IHJlYWR5LlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIGZpcm13YXJlLgotCSAqLwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEgyTV9CQlBfQUdFTlQsIDApOwotCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEgyTV9NQUlMQk9YX0NTUiwgMCk7Ci0JbXNsZWVwKDEpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0Niw2ICsxMzEsNDQgQEAKIAlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBNQUNfU1lTX0NUUkwsIHJlZyk7CiB9CiAKK3N0YXRpYyBpbnQgcnQyODAwdXNiX2luaXRfcmVnaXN0ZXJzKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJdTMyIHJlZzsKKwlpbnQgaTsKKworCS8qCisJICogV2FpdCB1bnRpbCBCQlAgYW5kIFJGIGFyZSByZWFkeS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfQlVTWV9DT1VOVDsgaSsrKSB7CisJCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgTUFDX0NTUjAsICZyZWcpOworCQlpZiAocmVnICYmIHJlZyAhPSB+MCkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfQorCisJaWYgKGkgPT0gUkVHSVNURVJfQlVTWV9DT1VOVCkgeworCQlFUlJPUihydDJ4MDBkZXYsICJVbnN0YWJsZSBoYXJkd2FyZS5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgUEJGX1NZU19DVFJMLCAmcmVnKTsKKwlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBQQkZfU1lTX0NUUkwsIHJlZyAmIH4weDAwMDAyMDAwKTsKKworCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgTUFDX1NZU19DVFJMLCAmcmVnKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTUFDX1NZU19DVFJMX1JFU0VUX0NTUiwgMSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE1BQ19TWVNfQ1RSTF9SRVNFVF9CQlAsIDEpOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIE1BQ19TWVNfQ1RSTCwgcmVnKTsKKworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFVTQl9ETUFfQ0ZHLCAweDAwMDAwMDAwKTsKKworCXJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9zdyhydDJ4MDBkZXYsIFVTQl9ERVZJQ0VfTU9ERSwgMCwKKwkJCQkgICAgVVNCX01PREVfUkVTRVQsIFJFR0lTVEVSX1RJTUVPVVQpOworCisJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgTUFDX1NZU19DVFJMLCAweDAwMDAwMDAwKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHJ0MjgwMHVzYl9lbmFibGVfcmFkaW8oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKIAl1MzIgcmVnOwpAQCAtMzcxLDcgKzI5NCw5IEBACiAJCXJ0MjgwMHVzYl90b2dnbGVfcngocnQyeDAwZGV2LCBzdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgU1RBVEVfUkFESU9fSVJRX09OOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09OX0lTUjoKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PRkY6CisJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGX0lTUjoKIAkJLyogTm8gc3VwcG9ydCwgYnV0IG5vIGVycm9yIGVpdGhlciAqLwogCQlicmVhazsKIAljYXNlIFNUQVRFX0RFRVBfU0xFRVA6CkBAIC0zOTUsMjUgKzMyMCwyOSBAQAogLyoKICAqIFRYIGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24KICAqLworc3RhdGljIHZvaWQgcnQyODAwdXNiX3dyaXRlX3R4X2RhdGEoc3RydWN0IHF1ZXVlX2VudHJ5KiBlbnRyeSwKKwkJCQkgICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQoreworCV9fbGUzMiAqdHh3aSA9IChfX2xlMzIgKikgKGVudHJ5LT5za2ItPmRhdGEgKyBUWElORk9fREVTQ19TSVpFKTsKKworCXJ0MjgwMF93cml0ZV90eHdpKHR4d2ksIHR4ZGVzYyk7Cit9CisKKwogc3RhdGljIHZvaWQgcnQyODAwdXNiX3dyaXRlX3R4X2Rlc2Moc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQogewogCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhza2IpOwotCV9fbGUzMiAqdHhpID0gKF9fbGUzMiAqKShza2ItPmRhdGEgLSBUWFdJX0RFU0NfU0laRSAtIFRYSU5GT19ERVNDX1NJWkUpOworCV9fbGUzMiAqdHhpID0gKF9fbGUzMiAqKSBza2ItPmRhdGE7CiAJdTMyIHdvcmQ7CiAKIAkvKgotCSAqIEluaXRpYWxpemUgVFhXSSBkZXNjcmlwdG9yCi0JICovCi0JcnQyODAwX3dyaXRlX3R4d2koc2tiLCB0eGRlc2MpOwotCi0JLyoKIAkgKiBJbml0aWFsaXplIFRYSU5GTyBkZXNjcmlwdG9yCiAJICovCiAJcnQyeDAwX2Rlc2NfcmVhZCh0eGksIDAsICZ3b3JkKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYSU5GT19XMF9VU0JfRE1BX1RYX1BLVF9MRU4sCi0JCQkgICBza2ItPmxlbiArIFRYV0lfREVTQ19TSVpFKTsKKwkJCSAgIHNrYi0+bGVuIC0gVFhJTkZPX0RFU0NfU0laRSk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWElORk9fVzBfV0lWLAogCQkJICAgIXRlc3RfYml0KEVOVFJZX1RYRF9FTkNSWVBUX0lWLCAmdHhkZXNjLT5mbGFncykpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhJTkZPX1cwX1FTRUwsIDIpOwpAQCAtNDI2LDYgKzM1NSw3IEBACiAJLyoKIAkgKiBSZWdpc3RlciBkZXNjcmlwdG9yIGRldGFpbHMgaW4gc2tiIGZyYW1lIGRlc2NyaXB0b3IuCiAJICovCisJc2tiZGVzYy0+ZmxhZ3MgfD0gU0tCREVTQ19ERVNDX0lOX1NLQjsKIAlza2JkZXNjLT5kZXNjID0gdHhpOwogCXNrYmRlc2MtPmRlc2NfbGVuID0gVFhJTkZPX0RFU0NfU0laRSArIFRYV0lfREVTQ19TSVpFOwogfQpAQCAtNDMzLDUxICszNjMsNiBAQAogLyoKICAqIFRYIGRhdGEgaW5pdGlhbGl6YXRpb24KICAqLwotc3RhdGljIHZvaWQgcnQyODAwdXNiX3dyaXRlX2JlYWNvbihzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAotCQkJCSAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKLXsKLQlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7Ci0JdW5zaWduZWQgaW50IGJlYWNvbl9iYXNlOwotCXUzMiByZWc7Ci0KLQkvKgotCSAqIERpc2FibGUgYmVhY29uaW5nIHdoaWxlIHdlIGFyZSByZWxvYWRpbmcgdGhlIGJlYWNvbiBkYXRhLAotCSAqIG90aGVyd2lzZSB3ZSBtaWdodCBiZSBzZW5kaW5nIG91dCBpbnZhbGlkIGRhdGEuCi0JICovCi0JcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBCQ05fVElNRV9DRkcsICZyZWcpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBCQ05fVElNRV9DRkdfQkVBQ09OX0dFTiwgMCk7Ci0JcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQkNOX1RJTUVfQ0ZHLCByZWcpOwotCi0JLyoKLQkgKiBBZGQgdGhlIFRYV0kgZm9yIHRoZSBiZWFjb24gdG8gdGhlIHNrYi4KLQkgKi8KLQlydDI4MDBfd3JpdGVfdHh3aShlbnRyeS0+c2tiLCB0eGRlc2MpOwotCXNrYl9wdXNoKGVudHJ5LT5za2IsIFRYV0lfREVTQ19TSVpFKTsKLQotCS8qCi0JICogV3JpdGUgZW50aXJlIGJlYWNvbiB3aXRoIGRlc2NyaXB0b3IgdG8gcmVnaXN0ZXIuCi0JICovCi0JYmVhY29uX2Jhc2UgPSBIV19CRUFDT05fT0ZGU0VUKGVudHJ5LT5lbnRyeV9pZHgpOwotCXJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9sYXJnZV9idWZmKHJ0MngwMGRldiwgVVNCX01VTFRJX1dSSVRFLAotCQkJCQkgICAgVVNCX1ZFTkRPUl9SRVFVRVNUX09VVCwgYmVhY29uX2Jhc2UsCi0JCQkJCSAgICBlbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5sZW4sCi0JCQkJCSAgICBSRUdJU1RFUl9USU1FT1VUMzIoZW50cnktPnNrYi0+bGVuKSk7Ci0KLQkvKgotCSAqIEVuYWJsZSBiZWFjb25pbmcgYWdhaW4uCi0JICovCi0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJDTl9USU1FX0NGR19UU0ZfVElDS0lORywgMSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJDTl9USU1FX0NGR19UQlRUX0VOQUJMRSwgMSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEJDTl9USU1FX0NGR19CRUFDT05fR0VOLCAxKTsKLQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBCQ05fVElNRV9DRkcsIHJlZyk7Ci0KLQkvKgotCSAqIENsZWFuIHVwIHRoZSBiZWFjb24gc2tiLgotCSAqLwotCWRldl9rZnJlZV9za2IoZW50cnktPnNrYik7Ci0JZW50cnktPnNrYiA9IE5VTEw7Ci19Ci0KIHN0YXRpYyBpbnQgcnQyODAwdXNiX2dldF90eF9kYXRhX2xlbihzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5KQogewogCWludCBsZW5ndGg7CkBAIC01NjgsNyArNDUzLDcgQEAKIAkvKgogCSAqIFByb2Nlc3MgdGhlIFJYV0kgc3RydWN0dXJlLgogCSAqLwotCXJ0MjgwMF9wcm9jZXNzX3J4d2koZW50cnktPnNrYiwgcnhkZXNjKTsKKwlydDI4MDBfcHJvY2Vzc19yeHdpKGVudHJ5LCByeGRlc2MpOwogfQogCiAvKgpAQCAtNTg1LDI0ICs0NzAsMTAgQEAKIAlyZXR1cm4gcnQyODAwX3ZhbGlkYXRlX2VlcHJvbShydDJ4MDBkZXYpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgcnQyODAwdXNiX3J0MjgwMF9vcHMgPSB7Ci0JLnJlZ2lzdGVyX3JlYWQJCT0gcnQyeDAwdXNiX3JlZ2lzdGVyX3JlYWQsCi0JLnJlZ2lzdGVyX3JlYWRfbG9jawk9IHJ0MngwMHVzYl9yZWdpc3Rlcl9yZWFkX2xvY2ssCi0JLnJlZ2lzdGVyX3dyaXRlCQk9IHJ0MngwMHVzYl9yZWdpc3Rlcl93cml0ZSwKLQkucmVnaXN0ZXJfd3JpdGVfbG9jawk9IHJ0MngwMHVzYl9yZWdpc3Rlcl93cml0ZV9sb2NrLAotCi0JLnJlZ2lzdGVyX211bHRpcmVhZAk9IHJ0MngwMHVzYl9yZWdpc3Rlcl9tdWx0aXJlYWQsCi0JLnJlZ2lzdGVyX211bHRpd3JpdGUJPSBydDJ4MDB1c2JfcmVnaXN0ZXJfbXVsdGl3cml0ZSwKLQotCS5yZWdidXN5X3JlYWQJCT0gcnQyeDAwdXNiX3JlZ2J1c3lfcmVhZCwKLX07Ci0KIHN0YXRpYyBpbnQgcnQyODAwdXNiX3Byb2JlX2h3KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJaW50IHJldHZhbDsKIAotCXJ0MngwMGRldi0+cHJpdiA9ICh2b2lkICopJnJ0MjgwMHVzYl9ydDI4MDBfb3BzOwotCiAJLyoKIAkgKiBBbGxvY2F0ZSBlZXByb20gZGF0YS4KIAkgKi8KQEAgLTYzNSw2ICs1MDYsOCBAQAogCV9fc2V0X2JpdChEUklWRVJfUkVRVUlSRV9MMlBBRCwgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCWlmICghbW9kcGFyYW1fbm9od2NyeXB0KQogCQlfX3NldF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQ1JZUFRPLCAmcnQyeDAwZGV2LT5mbGFncyk7CisJX19zZXRfYml0KERSSVZFUl9TVVBQT1JUX0xJTktfVFVOSU5HLCAmcnQyeDAwZGV2LT5mbGFncyk7CisJX19zZXRfYml0KERSSVZFUl9TVVBQT1JUX1dBVENIRE9HLCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAkvKgogCSAqIFNldCB0aGUgcnNzaSBvZmZzZXQuCkBAIC02NDQsMTEgKzUxNyw0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgcnQyODAwdXNiX21hYzgwMjExX29wcyA9IHsKKwkudHgJCQk9IHJ0MngwMG1hY190eCwKKwkuc3RhcnQJCQk9IHJ0MngwMG1hY19zdGFydCwKKwkuc3RvcAkJCT0gcnQyeDAwbWFjX3N0b3AsCisJLmFkZF9pbnRlcmZhY2UJCT0gcnQyeDAwbWFjX2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UJPSBydDJ4MDBtYWNfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnCQkJPSBydDJ4MDBtYWNfY29uZmlnLAorCS5jb25maWd1cmVfZmlsdGVyCT0gcnQyeDAwbWFjX2NvbmZpZ3VyZV9maWx0ZXIsCisJLnNldF90aW0JCT0gcnQyeDAwbWFjX3NldF90aW0sCisJLnNldF9rZXkJCT0gcnQyeDAwbWFjX3NldF9rZXksCisJLnN3X3NjYW5fc3RhcnQJCT0gcnQyeDAwbWFjX3N3X3NjYW5fc3RhcnQsCisJLnN3X3NjYW5fY29tcGxldGUJPSBydDJ4MDBtYWNfc3dfc2Nhbl9jb21wbGV0ZSwKKwkuZ2V0X3N0YXRzCQk9IHJ0MngwMG1hY19nZXRfc3RhdHMsCisJLmdldF90a2lwX3NlcQkJPSBydDI4MDBfZ2V0X3RraXBfc2VxLAorCS5zZXRfcnRzX3RocmVzaG9sZAk9IHJ0MjgwMF9zZXRfcnRzX3RocmVzaG9sZCwKKwkuYnNzX2luZm9fY2hhbmdlZAk9IHJ0MngwMG1hY19ic3NfaW5mb19jaGFuZ2VkLAorCS5jb25mX3R4CQk9IHJ0MjgwMF9jb25mX3R4LAorCS5nZXRfdHNmCQk9IHJ0MjgwMF9nZXRfdHNmLAorCS5yZmtpbGxfcG9sbAkJPSBydDJ4MDBtYWNfcmZraWxsX3BvbGwsCisJLmFtcGR1X2FjdGlvbgkJPSBydDI4MDBfYW1wZHVfYWN0aW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBydDI4MDBfb3BzIHJ0MjgwMHVzYl9ydDI4MDBfb3BzID0geworCS5yZWdpc3Rlcl9yZWFkCQk9IHJ0MngwMHVzYl9yZWdpc3Rlcl9yZWFkLAorCS5yZWdpc3Rlcl9yZWFkX2xvY2sJPSBydDJ4MDB1c2JfcmVnaXN0ZXJfcmVhZF9sb2NrLAorCS5yZWdpc3Rlcl93cml0ZQkJPSBydDJ4MDB1c2JfcmVnaXN0ZXJfd3JpdGUsCisJLnJlZ2lzdGVyX3dyaXRlX2xvY2sJPSBydDJ4MDB1c2JfcmVnaXN0ZXJfd3JpdGVfbG9jaywKKwkucmVnaXN0ZXJfbXVsdGlyZWFkCT0gcnQyeDAwdXNiX3JlZ2lzdGVyX211bHRpcmVhZCwKKwkucmVnaXN0ZXJfbXVsdGl3cml0ZQk9IHJ0MngwMHVzYl9yZWdpc3Rlcl9tdWx0aXdyaXRlLAorCS5yZWdidXN5X3JlYWQJCT0gcnQyeDAwdXNiX3JlZ2J1c3lfcmVhZCwKKwkuZHJ2X3dyaXRlX2Zpcm13YXJlCT0gcnQyODAwdXNiX3dyaXRlX2Zpcm13YXJlLAorCS5kcnZfaW5pdF9yZWdpc3RlcnMJPSBydDI4MDB1c2JfaW5pdF9yZWdpc3RlcnMsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MngwMGxpYl9vcHMgcnQyODAwdXNiX3J0MngwMF9vcHMgPSB7CiAJLnByb2JlX2h3CQk9IHJ0MjgwMHVzYl9wcm9iZV9odywKIAkuZ2V0X2Zpcm13YXJlX25hbWUJPSBydDI4MDB1c2JfZ2V0X2Zpcm13YXJlX25hbWUsCi0JLmNoZWNrX2Zpcm13YXJlCQk9IHJ0MjgwMHVzYl9jaGVja19maXJtd2FyZSwKLQkubG9hZF9maXJtd2FyZQkJPSBydDI4MDB1c2JfbG9hZF9maXJtd2FyZSwKKwkuY2hlY2tfZmlybXdhcmUJCT0gcnQyODAwX2NoZWNrX2Zpcm13YXJlLAorCS5sb2FkX2Zpcm13YXJlCQk9IHJ0MjgwMF9sb2FkX2Zpcm13YXJlLAogCS5pbml0aWFsaXplCQk9IHJ0MngwMHVzYl9pbml0aWFsaXplLAogCS51bmluaXRpYWxpemUJCT0gcnQyeDAwdXNiX3VuaW5pdGlhbGl6ZSwKIAkuY2xlYXJfZW50cnkJCT0gcnQyeDAwdXNiX2NsZWFyX2VudHJ5LApAQCAtNjU3LDkgKzU2NCwxMCBAQAogCS5saW5rX3N0YXRzCQk9IHJ0MjgwMF9saW5rX3N0YXRzLAogCS5yZXNldF90dW5lcgkJPSBydDI4MDBfcmVzZXRfdHVuZXIsCiAJLmxpbmtfdHVuZXIJCT0gcnQyODAwX2xpbmtfdHVuZXIsCisJLndhdGNoZG9nCQk9IHJ0MngwMHVzYl93YXRjaGRvZywKIAkud3JpdGVfdHhfZGVzYwkJPSBydDI4MDB1c2Jfd3JpdGVfdHhfZGVzYywKLQkud3JpdGVfdHhfZGF0YQkJPSBydDJ4MDB1c2Jfd3JpdGVfdHhfZGF0YSwKLQkud3JpdGVfYmVhY29uCQk9IHJ0MjgwMHVzYl93cml0ZV9iZWFjb24sCisJLndyaXRlX3R4X2RhdGEJCT0gcnQyODAwdXNiX3dyaXRlX3R4X2RhdGEsCisJLndyaXRlX2JlYWNvbgkJPSBydDI4MDBfd3JpdGVfYmVhY29uLAogCS5nZXRfdHhfZGF0YV9sZW4JPSBydDI4MDB1c2JfZ2V0X3R4X2RhdGFfbGVuLAogCS5raWNrX3R4X3F1ZXVlCQk9IHJ0MngwMHVzYl9raWNrX3R4X3F1ZXVlLAogCS5raWxsX3R4X3F1ZXVlCQk9IHJ0MngwMHVzYl9raWxsX3R4X3F1ZXVlLApAQCAtNzA2LDcgKzYxNCw4IEBACiAJLnR4CQkJPSAmcnQyODAwdXNiX3F1ZXVlX3R4LAogCS5iY24JCQk9ICZydDI4MDB1c2JfcXVldWVfYmNuLAogCS5saWIJCQk9ICZydDI4MDB1c2JfcnQyeDAwX29wcywKLQkuaHcJCQk9ICZydDI4MDBfbWFjODAyMTFfb3BzLAorCS5kcnYJCQk9ICZydDI4MDB1c2JfcnQyODAwX29wcywKKwkuaHcJCQk9ICZydDI4MDB1c2JfbWFjODAyMTFfb3BzLAogI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMKIAkuZGVidWdmcwkJPSAmcnQyODAwX3J0MngwMGRlYnVnLAogI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuaAppbmRleCAyYmNhNmE3Li4wNzIyYmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5oCkBAIC0zMiw0MyArMzIsNiBAQAogI2RlZmluZSBSVDI4MDBVU0JfSAogCiAvKgotICogVVNCIHJlZ2lzdGVycy4KLSAqLwotCi0vKgotICogVVNCX0RNQV9DRkcKLSAqIFJYX0JVTEtfQUdHX1RJTUVPVVQ6IFJ4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCBpbiB1bml0IG9mIDMzbnMuCi0gKiBSWF9CVUxLX0FHR19MSU1JVDogUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCBpbiB1bml0IG9mIDI1NiBieXRlcy4KLSAqIFBIWV9DTEVBUjogcGh5IHdhdGNoIGRvZyBlbmFibGUuCi0gKiBUWF9DTEVBUjogQ2xlYXIgVVNCIERNQSBUWCBwYXRoLgotICogVFhPUF9IQUxUOiBIYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgotICogUlhfQlVMS19BR0dfRU46IEVuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uLgotICogUlhfQlVMS19FTjogRW5hYmxlIFVTQiBETUEgUnguCi0gKiBUWF9CVUxLX0VOOiBFbmFibGUgVVNCIERNQSBUeC4KLSAqIEVQX09VVF9WQUxJRDogT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQuCi0gKiBSWF9CVVNZOiBVU0IgRE1BIFJYIEZTTSBidXN5LgotICogVFhfQlVTWTogVVNCIERNQSBUWCBGU00gYnVzeS4KLSAqLwotI2RlZmluZSBVU0JfRE1BX0NGRwkJCTB4MDJhMAotI2RlZmluZSBVU0JfRE1BX0NGR19SWF9CVUxLX0FHR19USU1FT1VUCUZJRUxEMzIoMHgwMDAwMDBmZikKLSNkZWZpbmUgVVNCX0RNQV9DRkdfUlhfQlVMS19BR0dfTElNSVQJRklFTEQzMigweDAwMDBmZjAwKQotI2RlZmluZSBVU0JfRE1BX0NGR19QSFlfQ0xFQVIJCUZJRUxEMzIoMHgwMDAxMDAwMCkKLSNkZWZpbmUgVVNCX0RNQV9DRkdfVFhfQ0xFQVIJCUZJRUxEMzIoMHgwMDA4MDAwMCkKLSNkZWZpbmUgVVNCX0RNQV9DRkdfVFhPUF9IQUxUCQlGSUVMRDMyKDB4MDAxMDAwMDApCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX0VOCUZJRUxEMzIoMHgwMDIwMDAwMCkKLSNkZWZpbmUgVVNCX0RNQV9DRkdfUlhfQlVMS19FTgkJRklFTEQzMigweDAwNDAwMDAwKQotI2RlZmluZSBVU0JfRE1BX0NGR19UWF9CVUxLX0VOCQlGSUVMRDMyKDB4MDA4MDAwMDApCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHX0VQX09VVF9WQUxJRAlGSUVMRDMyKDB4M2YwMDAwMDApCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHX1JYX0JVU1kJCUZJRUxEMzIoMHg0MDAwMDAwMCkKLSNkZWZpbmUgVVNCX0RNQV9DRkdfVFhfQlVTWQkJRklFTEQzMigweDgwMDAwMDAwKQotCi0vKgotICogVVNCX0NZQ19DRkcKLSAqLwotI2RlZmluZSBVU0JfQ1lDX0NGRwkJCTB4MDJhNAotI2RlZmluZSBVU0JfQ1lDX0NGR19DTE9DS19DWUNMRQkJRklFTEQzMigweDAwMDAwMGZmKQotCi0vKgogICogODA1MSBmaXJtd2FyZSBpbWFnZS4KICAqLwogI2RlZmluZSBGSVJNV0FSRV9SVDI4NzAJCQkicnQyODcwLmJpbiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaAppbmRleCA2YzFmZjRjLi5jMjFhZjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJydDJ4MDBkZWJ1Zy5oIgorI2luY2x1ZGUgInJ0MngwMGR1bXAuaCIKICNpbmNsdWRlICJydDJ4MDBsZWRzLmgiCiAjaW5jbHVkZSAicnQyeDAwcmVnLmgiCiAjaW5jbHVkZSAicnQyeDAwcXVldWUuaCIKQEAgLTE1OSw2ICsxNjAsNyBAQAogCiBlbnVtIHJ0MngwMF9jaGlwX2ludGYgewogCVJUMlgwMF9DSElQX0lOVEZfUENJLAorCVJUMlgwMF9DSElQX0lOVEZfUENJRSwKIAlSVDJYMDBfQ0hJUF9JTlRGX1VTQiwKIAlSVDJYMDBfQ0hJUF9JTlRGX1NPQywKIH07CkBAIC0xNzUsOCArMTc3LDcgQEAKICNkZWZpbmUgUlQyNTcwCQkweDI1NzAKICNkZWZpbmUgUlQyNjYxCQkweDI2NjEKICNkZWZpbmUgUlQyNTczCQkweDI1NzMKLSNkZWZpbmUgUlQyODYwCQkweDI4NjAJLyogMi40R0h6IFBDSS9DQiAqLwotI2RlZmluZSBSVDI4NzAJCTB4Mjg3MAorI2RlZmluZSBSVDI4NjAJCTB4Mjg2MAkvKiAyLjRHSHogKi8KICNkZWZpbmUgUlQyODcyCQkweDI4NzIJLyogV1NPQyAqLwogI2RlZmluZSBSVDI4ODMJCTB4Mjg4MwkvKiBXU09DICovCiAjZGVmaW5lIFJUMzA3MAkJMHgzMDcwCkBAIC0zMzEsNiArMzMyLDExIEBACiAJICogV29yayBzdHJ1Y3R1cmUgZm9yIHNjaGVkdWxpbmcgcGVyaW9kaWMgbGluayB0dW5pbmcuCiAJICovCiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworCisJLyoKKwkgKiBXb3JrIHN0cnVjdHVyZSBmb3Igc2NoZWR1bGluZyBwZXJpb2RpYyB3YXRjaGRvZyBtb25pdG9yaW5nLgorCSAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgd2F0Y2hkb2dfd29yazsKIH07CiAKIC8qCkBAIC01MDksNiArNTE1LDExIEBACiAJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlcjsKIAogCS8qCisJICogVGhyZWFkZWQgSW50ZXJydXB0IGhhbmRsZXJzLgorCSAqLworCWlycV9oYW5kbGVyX3QgaXJxX2hhbmRsZXJfdGhyZWFkOworCisJLyoKIAkgKiBEZXZpY2UgaW5pdCBoYW5kbGVycy4KIAkgKi8KIAlpbnQgKCpwcm9iZV9odykgKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwpAQCAtNTQyLDYgKzU1Myw3IEBACiAJCQkgICAgIHN0cnVjdCBsaW5rX3F1YWwgKnF1YWwpOwogCXZvaWQgKCpsaW5rX3R1bmVyKSAoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCSAgICBzdHJ1Y3QgbGlua19xdWFsICpxdWFsLCBjb25zdCB1MzIgY291bnQpOworCXZvaWQgKCp3YXRjaGRvZykgKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwogCiAJLyoKIAkgKiBUWCBjb250cm9sIGhhbmRsZXJzCkBAIC01NDksOCArNTYxLDggQEAKIAl2b2lkICgqd3JpdGVfdHhfZGVzYykgKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpOwotCWludCAoKndyaXRlX3R4X2RhdGEpIChzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAotCQkJICAgICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKTsKKwl2b2lkICgqd3JpdGVfdHhfZGF0YSkgKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCisJCQkgICAgICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKTsKIAl2b2lkICgqd3JpdGVfYmVhY29uKSAoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKIAkJCSAgICAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYyk7CiAJaW50ICgqZ2V0X3R4X2RhdGFfbGVuKSAoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSk7CkBAIC02MDksNiArNjIxLDcgQEAKIAljb25zdCBzdHJ1Y3QgZGF0YV9xdWV1ZV9kZXNjICpiY247CiAJY29uc3Qgc3RydWN0IGRhdGFfcXVldWVfZGVzYyAqYXRpbTsKIAljb25zdCBzdHJ1Y3QgcnQyeDAwbGliX29wcyAqbGliOworCWNvbnN0IHZvaWQgKmRydjsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyAqaHc7CiAjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfREVCVUdGUwogCWNvbnN0IHN0cnVjdCBydDJ4MDBkZWJ1ZyAqZGVidWdmczsKQEAgLTYyNyw2ICs2NDAsNyBAQAogCURFVklDRV9TVEFURV9JTklUSUFMSVpFRCwKIAlERVZJQ0VfU1RBVEVfU1RBUlRFRCwKIAlERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywKKwlERVZJQ0VfU1RBVEVfU0NBTk5JTkcsCiAKIAkvKgogCSAqIERyaXZlciByZXF1aXJlbWVudHMKQEAgLTY0NSw2ICs2NTksOSBAQAogCUNPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywKIAlEUklWRVJfU1VQUE9SVF9DT05UUk9MX0ZJTFRFUlMsCiAJRFJJVkVSX1NVUFBPUlRfQ09OVFJPTF9GSUxURVJfUFNQT0xMLAorCURSSVZFUl9TVVBQT1JUX1BSRV9UQlRUX0lOVEVSUlVQVCwKKwlEUklWRVJfU1VQUE9SVF9MSU5LX1RVTklORywKKwlEUklWRVJfU1VQUE9SVF9XQVRDSERPRywKIAogCS8qCiAJICogRHJpdmVyIGNvbmZpZ3VyYXRpb24KQEAgLTY1NCw3ICs2NzEsNiBAQAogCUNPTkZJR19FWFRFUk5BTF9MTkFfQSwKIAlDT05GSUdfRVhURVJOQUxfTE5BX0JHLAogCUNPTkZJR19ET1VCTEVfQU5URU5OQSwKLQlDT05GSUdfRElTQUJMRV9MSU5LX1RVTklORywKIAlDT05GSUdfQ0hBTk5FTF9IVDQwLAogfTsKIApAQCAtODYyLDkgKzg3OCwxMCBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAKIAkvKgotCSAqIERyaXZlciBzcGVjaWZpYyBkYXRhLgorCSAqIEludGVycnVwdCB2YWx1ZXMsIHN0b3JlZCBiZXR3ZWVuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKwkgKiBhbmQgaW50ZXJydXB0IHRocmVhZCByb3V0aW5lLgogCSAqLwotCXZvaWQgKnByaXY7CisJdTMyIGlycXZhbHVlWzJdOwogfTsKIAogLyoKQEAgLTk3OCw3ICs5OTUsMTMgQEAKIAogc3RhdGljIGlubGluZSBib29sIHJ0MngwMF9pc19wY2koc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKLQlyZXR1cm4gcnQyeDAwX2ludGYocnQyeDAwZGV2LCBSVDJYMDBfQ0hJUF9JTlRGX1BDSSk7CisJcmV0dXJuIHJ0MngwMF9pbnRmKHJ0MngwMGRldiwgUlQyWDAwX0NISVBfSU5URl9QQ0kpIHx8CisJICAgICAgIHJ0MngwMF9pbnRmKHJ0MngwMGRldiwgUlQyWDAwX0NISVBfSU5URl9QQ0lFKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHJ0MngwMF9pc19wY2llKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJcmV0dXJuIHJ0MngwMF9pbnRmKHJ0MngwMGRldiwgUlQyWDAwX0NISVBfSU5URl9QQ0lFKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHJ0MngwMF9pc191c2Ioc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKQEAgLTk5OSw2ICsxMDIyLDEzIEBACiB2b2lkIHJ0MngwMHF1ZXVlX21hcF90eHNrYihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogLyoqCisgKiBydDJ4MDBxdWV1ZV91bm1hcF9za2IgLSBVbm1hcCBhIHNrYiBmcm9tIERNQS4KKyAqIEBydDJ4MDBkZXY6IFBvaW50ZXIgdG8gJnN0cnVjdCBydDJ4MDBfZGV2LgorICogQHNrYjogVGhlIHNrYiB0byB1bm1hcC4KKyAqLwordm9pZCBydDJ4MDBxdWV1ZV91bm1hcF9za2Ioc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qKgogICogcnQyeDAwcXVldWVfZ2V0X3F1ZXVlIC0gQ29udmVydCBxdWV1ZSBpbmRleCB0byBxdWV1ZSBwb2ludGVyCiAgKiBAcnQyeDAwZGV2OiBQb2ludGVyIHRvICZzdHJ1Y3QgcnQyeDAwX2Rldi4KICAqIEBxdWV1ZTogcnQyeDAwIHF1ZXVlIGluZGV4IChzZWUgJmVudW0gZGF0YV9xdWV1ZV9xaWQpLgpAQCAtMTAxNSw5ICsxMDQ1LDMwIEBACiAJCQkJCSAgZW51bSBxdWV1ZV9pbmRleCBpbmRleCk7CiAKIC8qCisgKiBEZWJ1Z2ZzIGhhbmRsZXJzLgorICovCisvKioKKyAqIHJ0MngwMGRlYnVnX2R1bXBfZnJhbWUgLSBEdW1wIGEgZnJhbWUgdG8gdXNlcnNwYWNlIHRocm91Z2ggZGVidWdmcy4KKyAqIEBydDJ4MDBkZXY6IFBvaW50ZXIgdG8gJnN0cnVjdCBydDJ4MDBfZGV2LgorICogQHR5cGU6IFRoZSB0eXBlIG9mIGZyYW1lIHRoYXQgaXMgYmVpbmcgZHVtcGVkLgorICogQHNrYjogVGhlIHNrYiBjb250YWluaW5nIHRoZSBmcmFtZSB0byBiZSBkdW1wZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9ERUJVR0ZTCit2b2lkIHJ0MngwMGRlYnVnX2R1bXBfZnJhbWUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCSAgICBlbnVtIHJ0MngwMF9kdW1wX3R5cGUgdHlwZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHJ0MngwMGRlYnVnX2R1bXBfZnJhbWUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkJICBlbnVtIHJ0MngwMF9kdW1wX3R5cGUgdHlwZSwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMgKi8KKworLyoKICAqIEludGVycnVwdCBjb250ZXh0IGhhbmRsZXJzLgogICovCiB2b2lkIHJ0MngwMGxpYl9iZWFjb25kb25lKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwordm9pZCBydDJ4MDBsaWJfcHJldGJ0dChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KTsKIHZvaWQgcnQyeDAwbGliX3R4ZG9uZShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAogCQkgICAgICBzdHJ1Y3QgdHhkb25lX2VudHJ5X2Rlc2MgKnR4ZGVzYyk7CiB2b2lkIHJ0MngwMGxpYl9yeGRvbmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTEwNDcsNiArMTA5OCw4IEBACiAjZWxzZQogI2RlZmluZSBydDJ4MDBtYWNfc2V0X2tleQlOVUxMCiAjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfQ1JZUFRPICovCit2b2lkIHJ0MngwMG1hY19zd19zY2FuX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnQyeDAwbWFjX3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogaW50IHJ0MngwMG1hY19nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpOwogdm9pZCBydDJ4MDBtYWNfYnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYwppbmRleCAwOTgzMTVhLi45NTNkYzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY29uZmlnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNvbmZpZy5jCkBAIC00MSwxMCArNDEsMTIgQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWNvbmYuc3luYyA9IFRTRl9TWU5DX0FESE9DOworCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKLQkJY29uZi5zeW5jID0gVFNGX1NZTkNfQkVBQ09OOworCQljb25mLnN5bmMgPSBUU0ZfU1lOQ19BUF9OT05FOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWNvbmYuc3luYyA9IFRTRl9TWU5DX0lORlJBOwpAQCAtMTcwLDIzICsxNzIsMjcgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IGllZWU4MDIxMV9mbGFncykKIHsKIAlzdHJ1Y3QgcnQyeDAwbGliX2NvbmYgbGliY29uZjsKKwl1MTYgaHdfdmFsdWU7CiAKIAltZW1zZXQoJmxpYmNvbmYsIDAsIHNpemVvZihsaWJjb25mKSk7CiAKIAlsaWJjb25mLmNvbmYgPSBjb25mOwogCiAJaWYgKGllZWU4MDIxMV9mbGFncyAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSB7Ci0JCWlmIChjb25mX2lzX2h0NDAoY29uZikpCisJCWlmIChjb25mX2lzX2h0NDAoY29uZikpIHsKIAkJCV9fc2V0X2JpdChDT05GSUdfQ0hBTk5FTF9IVDQwLCAmcnQyeDAwZGV2LT5mbGFncyk7Ci0JCWVsc2UKKwkJCWh3X3ZhbHVlID0gcnQyeDAwaHRfY2VudGVyX2NoYW5uZWwocnQyeDAwZGV2LCBjb25mKTsKKwkJfSBlbHNlIHsKIAkJCV9fY2xlYXJfYml0KENPTkZJR19DSEFOTkVMX0hUNDAsICZydDJ4MDBkZXYtPmZsYWdzKTsKKwkJCWh3X3ZhbHVlID0gY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWU7CisJCX0KIAogCQltZW1jcHkoJmxpYmNvbmYucmYsCi0JCSAgICAgICAmcnQyeDAwZGV2LT5zcGVjLmNoYW5uZWxzW2NvbmYtPmNoYW5uZWwtPmh3X3ZhbHVlXSwKKwkJICAgICAgICZydDJ4MDBkZXYtPnNwZWMuY2hhbm5lbHNbaHdfdmFsdWVdLAogCQkgICAgICAgc2l6ZW9mKGxpYmNvbmYucmYpKTsKIAogCQltZW1jcHkoJmxpYmNvbmYuY2hhbm5lbCwKLQkJICAgICAgICZydDJ4MDBkZXYtPnNwZWMuY2hhbm5lbHNfaW5mb1tjb25mLT5jaGFubmVsLT5od192YWx1ZV0sCisJCSAgICAgICAmcnQyeDAwZGV2LT5zcGVjLmNoYW5uZWxzX2luZm9baHdfdmFsdWVdLAogCQkgICAgICAgc2l6ZW9mKGxpYmNvbmYuY2hhbm5lbCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYwppbmRleCBlOWZlOTNmLi5iMDQ5OGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYwpAQCAtMjExLDYgKzIxMSw3IEBACiAJaWYgKCF0ZXN0X2JpdChGUkFNRV9EVU1QX0ZJTEVfT1BFTiwgJmludGYtPmZyYW1lX2R1bXBfZmxhZ3MpKQogCQlza2JfcXVldWVfcHVyZ2UoJmludGYtPmZyYW1lX2R1bXBfc2ticXVldWUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwZGVidWdfZHVtcF9mcmFtZSk7CiAKIHN0YXRpYyBpbnQgcnQyeDAwZGVidWdfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCmluZGV4IGYyMGQzZWUuLjU4NWU4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKQEAgLTcwLDYgKzcwLDExIEBACiAJcnQyeDAwbGliX3RvZ2dsZV9yeChydDJ4MDBkZXYsIFNUQVRFX1JBRElPX1JYX09OKTsKIAogCS8qCisJICogU3RhcnQgd2F0Y2hkb2cgbW9uaXRvcmluZy4KKwkgKi8KKwlydDJ4MDBsaW5rX3N0YXJ0X3dhdGNoZG9nKHJ0MngwMGRldik7CisKKwkvKgogCSAqIFN0YXJ0IHRoZSBUWCBxdWV1ZXMuCiAJICovCiAJaWVlZTgwMjExX3dha2VfcXVldWVzKHJ0MngwMGRldi0+aHcpOwpAQCAtODksNiArOTQsMTEgQEAKIAlydDJ4MDBxdWV1ZV9zdG9wX3F1ZXVlcyhydDJ4MDBkZXYpOwogCiAJLyoKKwkgKiBTdG9wIHdhdGNoZG9nIG1vbml0b3JpbmcuCisJICovCisJcnQyeDAwbGlua19zdG9wX3dhdGNoZG9nKHJ0MngwMGRldik7CisKKwkvKgogCSAqIERpc2FibGUgUlguCiAJICovCiAJcnQyeDAwbGliX3RvZ2dsZV9yeChydDJ4MDBkZXYsIFNUQVRFX1JBRElPX1JYX09GRik7CkBAIC0xNjgsMTAgKzE3OCwzMiBAQAogLyoKICAqIEludGVycnVwdCBjb250ZXh0IGhhbmRsZXJzLgogICovCi1zdGF0aWMgdm9pZCBydDJ4MDBsaWJfYmVhY29uZG9uZV9pdGVyKHZvaWQgKmRhdGEsIHU4ICptYWMsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3N0YXRpYyB2b2lkIHJ0MngwMGxpYl9iY19idWZmZXJfaXRlcih2b2lkICpkYXRhLCB1OCAqbWFjLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQlzdHJ1Y3QgcnQyeDAwX2ludGYgKmludGYgPSB2aWZfdG9faW50Zih2aWYpOworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBkYXRhOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKgorCSAqIE9ubHkgQVAgbW9kZSBpbnRlcmZhY2VzIGRvIGJyb2FkLSBhbmQgbXVsdGljYXN0IGJ1ZmZlcmluZworCSAqLworCWlmICh2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCXJldHVybjsKKworCS8qCisJICogU2VuZCBvdXQgYnVmZmVyZWQgYnJvYWQtIGFuZCBtdWx0aWNhc3QgZnJhbWVzCisJICovCisJc2tiID0gaWVlZTgwMjExX2dldF9idWZmZXJlZF9iYyhydDJ4MDBkZXYtPmh3LCB2aWYpOworCXdoaWxlIChza2IpIHsKKwkJcnQyeDAwbWFjX3R4KHJ0MngwMGRldi0+aHcsIHNrYik7CisJCXNrYiA9IGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMocnQyeDAwZGV2LT5odywgdmlmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0MngwMGxpYl9iZWFjb251cGRhdGVfaXRlcih2b2lkICpkYXRhLCB1OCAqbWFjLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBkYXRhOwogCiAJaWYgKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgogCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKQEAgLTE3OSw5ICsyMTEsNyBAQAogCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfV0RTKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJmludGYtPmxvY2spOwotCWludGYtPmRlbGF5ZWRfZmxhZ3MgfD0gREVMQVlFRF9VUERBVEVfQkVBQ09OOwotCXNwaW5fdW5sb2NrKCZpbnRmLT5sb2NrKTsKKwlydDJ4MDBxdWV1ZV91cGRhdGVfYmVhY29uKHJ0MngwMGRldiwgdmlmLCB0cnVlKTsKIH0KIAogdm9pZCBydDJ4MDBsaWJfYmVhY29uZG9uZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQpAQCAtMTg5LDE0ICsyMTksMzcgQEAKIAlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAotCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhydDJ4MDBkZXYtPmh3LAotCQkJCQkJICAgcnQyeDAwbGliX2JlYWNvbmRvbmVfaXRlciwKLQkJCQkJCSAgIHJ0MngwMGRldik7CisJLyogc2VuZCBidWZmZXJlZCBiYy9tYyBmcmFtZXMgb3V0IGZvciBldmVyeSBic3NpZCAqLworCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKHJ0MngwMGRldi0+aHcsCisJCQkJCSAgICBydDJ4MDBsaWJfYmNfYnVmZmVyX2l0ZXIsCisJCQkJCSAgICBydDJ4MDBkZXYpOworCS8qCisJICogRGV2aWNlcyB3aXRoIHByZSB0YnR0IGludGVycnVwdCBkb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgYmVhY29uCisJICogaGVyZSBhcyB0aGV5IHdpbGwgZmV0Y2ggdGhlIG5leHQgYmVhY29uIGRpcmVjdGx5IHByaW9yIHRvCisJICogdHJhbnNtaXNzaW9uLgorCSAqLworCWlmICh0ZXN0X2JpdChEUklWRVJfU1VQUE9SVF9QUkVfVEJUVF9JTlRFUlJVUFQsICZydDJ4MDBkZXYtPmZsYWdzKSkKKwkJcmV0dXJuOwogCi0JaWVlZTgwMjExX3F1ZXVlX3dvcmsocnQyeDAwZGV2LT5odywgJnJ0MngwMGRldi0+aW50Zl93b3JrKTsKKwkvKiBmZXRjaCBuZXh0IGJlYWNvbiAqLworCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKHJ0MngwMGRldi0+aHcsCisJCQkJCSAgICBydDJ4MDBsaWJfYmVhY29udXBkYXRlX2l0ZXIsCisJCQkJCSAgICBydDJ4MDBkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbGliX2JlYWNvbmRvbmUpOwogCit2b2lkIHJ0MngwMGxpYl9wcmV0YnR0KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwkvKiBmZXRjaCBuZXh0IGJlYWNvbiAqLworCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKHJ0MngwMGRldi0+aHcsCisJCQkJCSAgICBydDJ4MDBsaWJfYmVhY29udXBkYXRlX2l0ZXIsCisJCQkJCSAgICBydDJ4MDBkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbGliX3ByZXRidHQpOworCiB2b2lkIHJ0MngwMGxpYl90eGRvbmUoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKIAkJICAgICAgc3RydWN0IHR4ZG9uZV9lbnRyeV9kZXNjICp0eGRlc2MpCiB7CkBAIC0yMTYsNiArMjY5LDE2IEBACiAJcnQyeDAwcXVldWVfdW5tYXBfc2tiKHJ0MngwMGRldiwgZW50cnktPnNrYik7CiAKIAkvKgorCSAqIFJlbW92ZSB0aGUgZXh0cmEgdHggaGVhZHJvb20gZnJvbSB0aGUgc2tiLgorCSAqLworCXNrYl9wdWxsKGVudHJ5LT5za2IsIHJ0MngwMGRldi0+b3BzLT5leHRyYV90eF9oZWFkcm9vbSk7CisKKwkvKgorCSAqIFNpZ25hbCB0aGF0IHRoZSBUWCBkZXNjcmlwdG9yIGlzIG5vIGxvbmdlciBpbiB0aGUgc2tiLgorCSAqLworCXNrYmRlc2MtPmZsYWdzICY9IH5TS0JERVNDX0RFU0NfSU5fU0tCOworCisJLyoKIAkgKiBSZW1vdmUgTDIgcGFkZGluZyB3aGljaCB3YXMgYWRkZWQgZHVyaW5nCiAJICovCiAJaWYgKHRlc3RfYml0KERSSVZFUl9SRVFVSVJFX0wyUEFELCAmcnQyeDAwZGV2LT5mbGFncykpCkBAIC0yMjQsNyArMjg3LDcgQEAKIAkvKgogCSAqIElmIHRoZSBJVi9FSVYgZGF0YSB3YXMgc3RyaXBwZWQgZnJvbSB0aGUgZnJhbWUgYmVmb3JlIGl0IHdhcwogCSAqIHBhc3NlZCB0byB0aGUgaGFyZHdhcmUsIHdlIHNob3VsZCBub3cgcmVpbnNlcnQgaXQgYWdhaW4gYmVjYXVzZQotCSAqIG1hYzgwMjExIHdpbGwgZXhwZWN0IHRoZSB0aGUgc2FtZSBkYXRhIHRvIGJlIHByZXNlbnQgaXQgdGhlCisJICogbWFjODAyMTEgd2lsbCBleHBlY3QgdGhlIHNhbWUgZGF0YSB0byBiZSBwcmVzZW50IGl0IHRoZQogCSAqIGZyYW1lIGFzIGl0IHdhcyBwYXNzZWQgdG8gdXMuCiAJICovCiAJaWYgKHRlc3RfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQpAQCAtMjQxLDggKzMwNCw3IEBACiAJICovCiAJc3VjY2VzcyA9CiAJICAgIHRlc3RfYml0KFRYRE9ORV9TVUNDRVNTLCAmdHhkZXNjLT5mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoVFhET05FX1VOS05PV04sICZ0eGRlc2MtPmZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChUWERPTkVfRkFMTEJBQ0ssICZ0eGRlc2MtPmZsYWdzKTsKKwkgICAgdGVzdF9iaXQoVFhET05FX1VOS05PV04sICZ0eGRlc2MtPmZsYWdzKTsKIAogCS8qCiAJICogVXBkYXRlIFRYIHN0YXRpc3RpY3MuCkBAIC0yNjQsMTEgKzMyNiwyMiBAQAogCS8qCiAJICogRnJhbWUgd2FzIHNlbmQgd2l0aCByZXRyaWVzLCBoYXJkd2FyZSB0cmllZAogCSAqIGRpZmZlcmVudCByYXRlcyB0byBzZW5kIG91dCB0aGUgZnJhbWUsIGF0IGVhY2gKLQkgKiByZXRyeSBpdCBsb3dlcmVkIHRoZSByYXRlIDEgc3RlcC4KKwkgKiByZXRyeSBpdCBsb3dlcmVkIHRoZSByYXRlIDEgc3RlcCBleGNlcHQgd2hlbiB0aGUKKwkgKiBsb3dlc3QgcmF0ZSB3YXMgdXNlZC4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcmV0cnlfcmF0ZXMgJiYgaSA8IElFRUU4MDIxMV9UWF9NQVhfUkFURVM7IGkrKykgewogCQl0eF9pbmZvLT5zdGF0dXMucmF0ZXNbaV0uaWR4ID0gcmF0ZV9pZHggLSBpOwogCQl0eF9pbmZvLT5zdGF0dXMucmF0ZXNbaV0uZmxhZ3MgPSByYXRlX2ZsYWdzOworCisJCWlmIChyYXRlX2lkeCAtIGkgPT0gMCkgeworCQkJLyoKKwkJCSAqIFRoZSBsb3dlc3QgcmF0ZSAoaW5kZXggMCkgd2FzIHVzZWQgdW50aWwgdGhlCisJCQkgKiBudW1iZXIgb2YgbWF4IHJldHJpZXMgd2FzIHJlYWNoZWQuCisJCQkgKi8KKwkJCXR4X2luZm8tPnN0YXR1cy5yYXRlc1tpXS5jb3VudCA9IHJldHJ5X3JhdGVzIC0gaTsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CiAJCXR4X2luZm8tPnN0YXR1cy5yYXRlc1tpXS5jb3VudCA9IDE7CiAJfQogCWlmIChpIDwgKElFRUU4MDIxMV9UWF9NQVhfUkFURVMgLSAxKSkKQEAgLTI4MSw2ICszNTQsMjEgQEAKIAkJCXJ0MngwMGRldi0+bG93X2xldmVsX3N0YXRzLmRvdDExQUNLRmFpbHVyZUNvdW50Kys7CiAJfQogCisJLyoKKwkgKiBFdmVyeSBzaW5nbGUgZnJhbWUgaGFzIGl0J3Mgb3duIHR4IHN0YXR1cywgaGVuY2UgcmVwb3J0CisJICogZXZlcnkgZnJhbWUgYXMgYW1wZHUgb2Ygc2l6ZSAxLgorCSAqCisJICogVE9ETzogaWYgd2UgY2FuIGZpbmQgb3V0IGhvdyBtYW55IGZyYW1lcyB3ZXJlIGFnZ3JlZ2F0ZWQKKwkgKiBieSB0aGUgaHcgd2UgY291bGQgcHJvdmlkZSB0aGUgcmVhbCBhbXBkdV9sZW4gdG8gbWFjODAyMTEKKwkgKiB3aGljaCB3b3VsZCBhbGxvdyB0aGUgcmMgYWxnb3JpdGhtIHRvIGJldHRlciBkZWNpZGUgb24KKwkgKiB3aGljaCByYXRlcyBhcmUgc3VpdGFibGUuCisJICovCisJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgeworCQl0eF9pbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVTsKKwkJdHhfaW5mby0+c3RhdHVzLmFtcGR1X2xlbiA9IDE7CisJCXR4X2luZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gc3VjY2VzcyA/IDEgOiAwOworCX0KKwogCWlmIChyYXRlX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7CiAJCWlmIChzdWNjZXNzKQogCQkJcnQyeDAwZGV2LT5sb3dfbGV2ZWxfc3RhdHMuZG90MTFSVFNTdWNjZXNzQ291bnQrKzsKQEAgLTI5NSw5ICszODMsMTcgQEAKIAkgKiBzZW5kIHRoZSBzdGF0dXMgcmVwb3J0IGJhY2suCiAJICovCiAJaWYgKCEoc2tiZGVzY19mbGFncyAmIFNLQkRFU0NfTk9UX01BQzgwMjExKSkKLQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHJ0MngwMGRldi0+aHcsIGVudHJ5LT5za2IpOworCQkvKgorCQkgKiBPbmx5IFBDSSBhbmQgU09DIGRldmljZXMgcHJvY2VzcyB0aGUgdHggc3RhdHVzIGluIHByb2Nlc3MKKwkJICogY29udGV4dC4gSGVuY2UgdXNlIGllZWU4MDIxMV90eF9zdGF0dXMgZm9yIFBDSSBhbmQgU09DCisJCSAqIGRldmljZXMgYW5kIHN0aWNrIHRvIGllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZSBmb3IgVVNCLgorCQkgKi8KKwkJaWYgKHJ0MngwMF9pc191c2IocnQyeDAwZGV2KSkKKwkJCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShydDJ4MDBkZXYtPmh3LCBlbnRyeS0+c2tiKTsKKwkJZWxzZQorCQkJaWVlZTgwMjExX3R4X3N0YXR1cyhydDJ4MDBkZXYtPmh3LCBlbnRyeS0+c2tiKTsKIAllbHNlCi0JCWRldl9rZnJlZV9za2JfaXJxKGVudHJ5LT5za2IpOworCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKIAogCS8qCiAJICogTWFrZSB0aGlzIGVudHJ5IGF2YWlsYWJsZSBmb3IgcmV1c2UuCkBAIC00NDQsNyArNTQwLDE2IEBACiAJICovCiAJcnQyeDAwZGVidWdfZHVtcF9mcmFtZShydDJ4MDBkZXYsIERVTVBfRlJBTUVfUlhET05FLCBlbnRyeS0+c2tiKTsKIAltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKGVudHJ5LT5za2IpLCByeF9zdGF0dXMsIHNpemVvZigqcnhfc3RhdHVzKSk7Ci0JaWVlZTgwMjExX3J4X2lycXNhZmUocnQyeDAwZGV2LT5odywgZW50cnktPnNrYik7CisKKwkvKgorCSAqIEN1cnJlbnRseSBvbmx5IFBDSSBhbmQgU09DIGRldmljZXMgaGFuZGxlIHJ4IGludGVycnVwdHMgaW4gcHJvY2VzcworCSAqIGNvbnRleHQuIEhlbmNlLCB1c2UgaWVlZTgwMjExX3J4X2lycXNhZmUgZm9yIFVTQiBhbmQgaWVlZTgwMjExX3J4X25pCisJICogZm9yIFBDSSBhbmQgU09DIGRldmljZXMuCisJICovCisJaWYgKHJ0MngwMF9pc191c2IocnQyeDAwZGV2KSkKKwkJaWVlZTgwMjExX3J4X2lycXNhZmUocnQyeDAwZGV2LT5odywgZW50cnktPnNrYik7CisJZWxzZQorCQlpZWVlODAyMTFfcnhfbmkocnQyeDAwZGV2LT5odywgZW50cnktPnNrYik7CiAKIAkvKgogCSAqIFJlcGxhY2UgdGhlIHNrYiB3aXRoIHRoZSBmcmVzaGx5IGFsbG9jYXRlZCBvbmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZHVtcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGR1bXAuaAppbmRleCBlZDMwM2I0Li41ZDZlMGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZHVtcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkdW1wLmgKQEAgLTIwLDcgKzIwLDEyIEBACiAKIC8qCiAJTW9kdWxlOiBydDJ4MDBkdW1wCi0JQWJzdHJhY3Q6IERhdGEgc3RydWN0dXJlcyBmb3IgdGhlIHJ0MngwMGRlYnVnICYgdXNlcnNwYWNlLgorCUFic3RyYWN0OgorCQlEYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBydDJ4MDBkZWJ1ZyAmIHVzZXJzcGFjZS4KKworCQlUaGUgZGVjbGFyYXRpb25zIGluIHRoaXMgZmlsZSBjYW4gYmUgdXNlZCBieSBib3RoIHJ0MngwMAorCQlhbmQgdXNlcnNwYWNlIGFuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIGtlcHQgdG9nZXRoZXIgaW4KKwkJdGhpcyBmaWxlLgogICovCiAKICNpZm5kZWYgUlQyWDAwRFVNUF9ICkBAIC0xMTEsNyArMTE2LDcgQEAKIAogCV9fbGUxNiBjaGlwX3J0OwogCV9fbGUxNiBjaGlwX3JmOwotCV9fbGUzMiBjaGlwX3JldjsKKwlfX2xlMTYgY2hpcF9yZXY7CiAKIAlfX2xlMTYgdHlwZTsKIAlfX3U4IHF1ZXVlX2luZGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGh0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwaHQuYwppbmRleCA1YTQwNzYwLi5jMDA0Y2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwaHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwaHQuYwpAQCAtNDQsMTEgKzQ0LDIyIEBACiAJCXR4ZGVzYy0+bXBkdV9kZW5zaXR5ID0gMDsKIAogCXR4ZGVzYy0+YmFfc2l6ZSA9IDc7CS8qIEZJWE1FOiBXaGF0IHZhbHVlIGlzIG5lZWRlZD8gKi8KLQl0eGRlc2MtPnN0YmMgPSAwOwkvKiBGSVhNRTogV2hhdCB2YWx1ZSBpcyBuZWVkZWQ/ICovCiAKLQl0eGRlc2MtPm1jcyA9IHJ0MngwMF9nZXRfcmF0ZV9tY3MoaHdyYXRlLT5tY3MpOwotCWlmICh0eHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRSkKLQkJdHhkZXNjLT5tY3MgfD0gMHgwODsKKwl0eGRlc2MtPnN0YmMgPQorCSAgICAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1NUQkMpID4+IElFRUU4MDIxMV9UWF9DVExfU1RCQ19TSElGVDsKKworCS8qCisJICogSWYgSUVFRTgwMjExX1RYX1JDX01DUyBpcyBzZXQgdHhyYXRlLT5pZHgganVzdCBjb250YWlucyB0aGUKKwkgKiBtY3MgcmF0ZSB0byBiZSB1c2VkCisJICovCisJaWYgKHR4cmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSB7CisJCXR4ZGVzYy0+bWNzID0gdHhyYXRlLT5pZHg7CisJfSBlbHNlIHsKKwkJdHhkZXNjLT5tY3MgPSBydDJ4MDBfZ2V0X3JhdGVfbWNzKGh3cmF0ZS0+bWNzKTsKKwkJaWYgKHR4cmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFKQorCQkJdHhkZXNjLT5tY3MgfD0gMHgwODsKKwl9CisKIAogCS8qCiAJICogQ29udmVydCBmbGFncwpAQCAtODQsMyArOTUsMzEgQEAKIAllbHNlCiAJCXR4ZGVzYy0+dHhvcCA9IFRYT1BfSFRUWE9QOwogfQorCit1MTYgcnQyeDAwaHRfY2VudGVyX2NoYW5uZWwoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGh3X21vZGVfc3BlYyAqc3BlYyA9ICZydDJ4MDBkZXYtPnNwZWM7CisJaW50IGNlbnRlcl9jaGFubmVsOworCXUxNiBpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGNlbnRlciBjaGFubmVsIHRvIGN1cnJlbnQgY2hhbm5lbC4KKwkgKi8KKwljZW50ZXJfY2hhbm5lbCA9IHNwZWMtPmNoYW5uZWxzW2NvbmYtPmNoYW5uZWwtPmh3X3ZhbHVlXS5jaGFubmVsOworCisJLyoKKwkgKiBBZGp1c3QgY2VudGVyIGNoYW5uZWwgdG8gSFQ0MCsgYW5kIEhUNDAtIG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpCisJCWNlbnRlcl9jaGFubmVsICs9IDI7CisJZWxzZSBpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKQorCQljZW50ZXJfY2hhbm5lbCAtPSAoY2VudGVyX2NoYW5uZWwgPT0gMTQpID8gMSA6IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2NoYW5uZWxzOyBpKyspCisJCWlmIChzcGVjLT5jaGFubmVsc1tpXS5jaGFubmVsID09IGNlbnRlcl9jaGFubmVsKQorCQkJcmV0dXJuIGk7CisKKwlXQVJOX09OKDEpOworCXJldHVybiBjb25mLT5jaGFubmVsLT5od192YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaAppbmRleCBiZTJlMzdmLi5kYzVjNjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oCkBAIC0yNywxMSArMjcsMTAgQEAKICNpZm5kZWYgUlQyWDAwTElCX0gKICNkZWZpbmUgUlQyWDAwTElCX0gKIAotI2luY2x1ZGUgInJ0MngwMGR1bXAuaCIKLQogLyoKICAqIEludGVydmFsIGRlZmluZXMKICAqLworI2RlZmluZSBXQVRDSERPR19JTlRFUlZBTAlyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKQogI2RlZmluZSBMSU5LX1RVTkVfSU5URVJWQUwJcm91bmRfamlmZmllc19yZWxhdGl2ZShIWikKIAogLyoKQEAgLTEwNywxMyArMTA2LDYgQEAKIAkJCQkJc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSk7CiAKIC8qKgotICogcnQyeDAwcXVldWVfdW5tYXBfc2tiIC0gVW5tYXAgYSBza2IgZnJvbSBETUEuCi0gKiBAcnQyeDAwZGV2OiBQb2ludGVyIHRvICZzdHJ1Y3QgcnQyeDAwX2Rldi4KLSAqIEBza2I6IFRoZSBza2IgdG8gdW5tYXAuCi0gKi8KLXZvaWQgcnQyeDAwcXVldWVfdW5tYXBfc2tiKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwotCi0vKioKICAqIHJ0MngwMHF1ZXVlX2ZyZWVfc2tiIC0gZnJlZSBhIHNrYgogICogQHJ0MngwMGRldjogUG9pbnRlciB0byAmc3RydWN0IHJ0MngwMF9kZXYuCiAgKiBAc2tiOiBUaGUgc2tiIHRvIGZyZWUuCkBAIC0yNjYsMTEgKzI1OCwzMCBAQAogdm9pZCBydDJ4MDBsaW5rX3Jlc2V0X3R1bmVyKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsIGJvb2wgYW50ZW5uYSk7CiAKIC8qKgotICogcnQyeDAwbGlua19yZWdpc3RlciAtIEluaXRpYWxpemUgbGluayB0dW5pbmcgZnVuY3Rpb25hbGl0eQorICogcnQyeDAwbGlua19zdGFydF93YXRjaGRvZyAtIFN0YXJ0IHBlcmlvZGljIHdhdGNoZG9nIG1vbml0b3JpbmcKICAqIEBydDJ4MDBkZXY6IFBvaW50ZXIgdG8gJnN0cnVjdCBydDJ4MDBfZGV2LgogICoKLSAqIEluaXRpYWxpemUgd29yayBzdHJ1Y3R1cmUgYW5kIGFsbCBsaW5rIHR1bmluZyByZWxhdGVkCi0gKiBwYXJhbWV0ZXJzLiBUaGlzIHdpbGwgbm90IHN0YXJ0IHRoZSBsaW5rIHR1bmluZyBwcm9jZXNzIGl0c2VsZi4KKyAqIFRoaXMgc3RhcnQgdGhlIHdhdGNoZG9nIHBlcmlvZGljIHdvcmssIHRoaXMgd29yayB3aWxsCisgKmJlIGV4ZWN1dGVkIHBlcmlvZGljYWxseSB1bnRpbCAmcnQyeDAwbGlua19zdG9wX3dhdGNoZG9nIGhhcworICogYmVlbiBjYWxsZWQuCisgKi8KK3ZvaWQgcnQyeDAwbGlua19zdGFydF93YXRjaGRvZyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KTsKKworLyoqCisgKiBydDJ4MDBsaW5rX3N0b3Bfd2F0Y2hkb2cgLSBTdG9wIHBlcmlvZGljIHdhdGNoZG9nIG1vbml0b3JpbmcKKyAqIEBydDJ4MDBkZXY6IFBvaW50ZXIgdG8gJnN0cnVjdCBydDJ4MDBfZGV2LgorICoKKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gY29tcGxldGVkIHRoZSB3YXRjaGRvZyBtb25pdG9yaW5nIHdpbGwgbm90CisgKiBiZSBydW5uaW5nIHVudGlsICZydDJ4MDBsaW5rX3N0YXJ0X3dhdGNoZG9nIGlzIGNhbGxlZC4KKyAqLwordm9pZCBydDJ4MDBsaW5rX3N0b3Bfd2F0Y2hkb2coc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldik7CisKKy8qKgorICogcnQyeDAwbGlua19yZWdpc3RlciAtIEluaXRpYWxpemUgbGluayB0dW5pbmcgJiB3YXRjaGRvZyBmdW5jdGlvbmFsaXR5CisgKiBAcnQyeDAwZGV2OiBQb2ludGVyIHRvICZzdHJ1Y3QgcnQyeDAwX2Rldi4KKyAqCisgKiBJbml0aWFsaXplIHdvcmsgc3RydWN0dXJlIGFuZCBhbGwgbGluayB0dW5pbmcgYW5kIHdhdGNoZG9nIHJlbGF0ZWQKKyAqIHBhcmFtZXRlcnMuIFRoaXMgd2lsbCBub3Qgc3RhcnQgdGhlIHBlcmlvZGljIHdvcmsgaXRzZWxmLgogICovCiB2b2lkIHJ0MngwMGxpbmtfcmVnaXN0ZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldik7CiAKQEAgLTI5Niw4ICszMDcsNiBAQAogI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMKIHZvaWQgcnQyeDAwZGVidWdfcmVnaXN0ZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldik7CiB2b2lkIHJ0MngwMGRlYnVnX2RlcmVnaXN0ZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldik7Ci12b2lkIHJ0MngwMGRlYnVnX2R1bXBfZnJhbWUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKLQkJCSAgICBlbnVtIHJ0MngwMF9kdW1wX3R5cGUgdHlwZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIHJ0MngwMGRlYnVnX3VwZGF0ZV9jcnlwdG8oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCSAgICAgICBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYyk7CiAjZWxzZQpAQCAtMzA5LDEyICszMTgsNiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwZGVidWdfZHVtcF9mcmFtZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAotCQkJCQkgIGVudW0gcnQyeDAwX2R1bXBfdHlwZSB0eXBlLAotCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBydDJ4MDBkZWJ1Z191cGRhdGVfY3J5cHRvKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJCSAgICAgc3RydWN0IHJ4ZG9uZV9lbnRyeV9kZXNjICpyeGRlc2MpCiB7CkBAIC0zODQsMTIgKzM4NywyMSBAQAogdm9pZCBydDJ4MDBodF9jcmVhdGVfdHhfZGVzY3JpcHRvcihzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAogCQkJCSAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYywKIAkJCQkgICBjb25zdCBzdHJ1Y3QgcnQyeDAwX3JhdGUgKmh3cmF0ZSk7CisKK3UxNiBydDJ4MDBodF9jZW50ZXJfY2hhbm5lbChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZik7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHJ0MngwMGh0X2NyZWF0ZV90eF9kZXNjcmlwdG9yKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCiAJCQkJCQkgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjLAogCQkJCQkJIGNvbnN0IHN0cnVjdCBydDJ4MDBfcmF0ZSAqaHdyYXRlKQogewogfQorCitzdGF0aWMgaW5saW5lIHUxNiBydDJ4MDBodF9jZW50ZXJfY2hhbm5lbChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKK3sKKwlyZXR1cm4gY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWU7Cit9CiAjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfSFQgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaW5rLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGluay5jCmluZGV4IDBlZmJmNWEuLjY2NmNlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaW5rLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpbmsuYwpAQCAtMjcxLDExICsyNzEsMjAgQEAKIAogCS8qCiAJICogTGluayB0dW5pbmcgc2hvdWxkIG9ubHkgYmUgcGVyZm9ybWVkIHdoZW4KLQkgKiBhbiBhY3RpdmUgc3RhIG9yIG1hc3RlciBpbnRlcmZhY2UgZXhpc3RzLgotCSAqIFNpbmdsZSBtb25pdG9yIG1vZGUgaW50ZXJmYWNlcyBzaG91bGQgbmV2ZXIgaGF2ZQotCSAqIHdvcmsgd2l0aCBsaW5rIHR1bmVycy4KKwkgKiBhbiBhY3RpdmUgc3RhIGludGVyZmFjZSBleGlzdHMuIEFQIGludGVyZmFjZXMKKwkgKiBkb24ndCBuZWVkIGxpbmsgdHVuaW5nIGFuZCBtb25pdG9yIG1vZGUgaW50ZXJmYWNlcworCSAqIHNob3VsZCBuZXZlciBoYXZlIHRvIHdvcmsgd2l0aCBsaW5rIHR1bmVycy4KIAkgKi8KLQlpZiAoIXJ0MngwMGRldi0+aW50Zl9hcF9jb3VudCAmJiAhcnQyeDAwZGV2LT5pbnRmX3N0YV9jb3VudCkKKwlpZiAoIXJ0MngwMGRldi0+aW50Zl9zdGFfY291bnQpCisJCXJldHVybjsKKworCS8qKgorCSAqIFdoaWxlIHNjYW5uaW5nLCBsaW5rIHR1bmluZyBpcyBkaXNhYmxlZC4gQnkgZGVmYXVsdAorCSAqIHRoZSBtb3N0IHNlbnNpdGl2ZSBzZXR0aW5ncyB3aWxsIGJlIHVzZWQgdG8gbWFrZSBzdXJlCisJICogdGhhdCBhbGwgYmVhY29ucyBhbmQgcHJvYmUgcmVzcG9uc2VzIHdpbGwgYmUgcmVjaWV2ZWQKKwkgKiBkdXJpbmcgdGhlIHNjYW4uCisJICovCisJaWYgKHRlc3RfYml0KERFVklDRV9TVEFURV9TQ0FOTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKIAlydDJ4MDBsaW5rX3Jlc2V0X3R1bmVyKHJ0MngwMGRldiwgZmFsc2UpOwpAQCAtMjkzLDYgKzMwMiw3IEBACiB2b2lkIHJ0MngwMGxpbmtfcmVzZXRfdHVuZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwgYm9vbCBhbnRlbm5hKQogewogCXN0cnVjdCBsaW5rX3F1YWwgKnF1YWwgPSAmcnQyeDAwZGV2LT5saW5rLnF1YWw7CisJdTggdmdjX2xldmVsID0gcXVhbC0+dmdjX2xldmVsX3JlZzsKIAogCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuOwpAQCAtMzA5LDYgKzMxOSwxMyBAQAogCW1lbXNldChxdWFsLCAwLCBzaXplb2YoKnF1YWwpKTsKIAogCS8qCisJICogUmVzdG9yZSB0aGUgVkdDIGxldmVsIGFzIHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXJzLAorCSAqIHRoZSBkcml2ZXIgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgcmVnaXN0ZXIKKwkgKiBtdXN0IGJlIHVwZGF0ZWQgZHVyaW5nIHJlc2V0IG9yIG5vdC4KKwkgKi8KKwlxdWFsLT52Z2NfbGV2ZWxfcmVnID0gdmdjX2xldmVsOworCisJLyoKIAkgKiBSZXNldCB0aGUgbGluayB0dW5lci4KIAkgKi8KIAlydDJ4MDBkZXYtPm9wcy0+bGliLT5yZXNldF90dW5lcihydDJ4MDBkZXYsIHF1YWwpOwpAQCAtMzM4LDcgKzM1NSw4IEBACiAJICogV2hlbiB0aGUgcmFkaW8gaXMgc2h1dHRpbmcgZG93biB3ZSBzaG91bGQKIAkgKiBpbW1lZGlhdGVseSBjZWFzZSBhbGwgbGluayB0dW5pbmcuCiAJICovCi0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChERVZJQ0VfU1RBVEVfU0NBTk5JTkcsICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTM1OSwxMCArMzc3LDExIEBACiAJCXF1YWwtPnJzc2kgPSBsaW5rLT5hdmdfcnNzaS5hdmc7CiAKIAkvKgotCSAqIE9ubHkgcGVyZm9ybSB0aGUgbGluayB0dW5pbmcgd2hlbiBMaW5rIHR1bmluZwotCSAqIGhhcyBiZWVuIGVuYWJsZWQgKFRoaXMgY291bGQgaGF2ZSBiZWVuIGRpc2FibGVkIGZyb20gdGhlIEVFUFJPTSkuCisJICogQ2hlY2sgaWYgbGluayB0dW5pbmcgaXMgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSwgc29tZSBoYXJkd2FyZQorCSAqIGRvIG5vdCBzdXBwb3J0IGxpbmsgdHVuaW5nIGF0IGFsbCwgd2hpbGUgb3RoZXIgZGV2aWNlcyBjYW4gZGlzYWJsZQorCSAqIHRoZSBmZWF0dXJlIGZyb20gdGhlIEVFUFJPTS4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KENPTkZJR19ESVNBQkxFX0xJTktfVFVOSU5HLCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KERSSVZFUl9TVVBQT1JUX0xJTktfVFVOSU5HLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJ0MngwMGRldi0+b3BzLT5saWItPmxpbmtfdHVuZXIocnQyeDAwZGV2LCBxdWFsLCBsaW5rLT5jb3VudCk7CiAKIAkvKgpAQCAtMzg4LDcgKzQwNyw0NSBAQAogCQkJCQkgICAgICZsaW5rLT53b3JrLCBMSU5LX1RVTkVfSU5URVJWQUwpOwogfQogCit2b2lkIHJ0MngwMGxpbmtfc3RhcnRfd2F0Y2hkb2coc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKK3sKKwlzdHJ1Y3QgbGluayAqbGluayA9ICZydDJ4MDBkZXYtPmxpbms7CisKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykgfHwKKwkgICAgIXRlc3RfYml0KERSSVZFUl9TVVBQT1JUX1dBVENIRE9HLCAmcnQyeDAwZGV2LT5mbGFncykpCisJCXJldHVybjsKKworCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsocnQyeDAwZGV2LT5odywKKwkJCQkgICAgICZsaW5rLT53YXRjaGRvZ193b3JrLCBXQVRDSERPR19JTlRFUlZBTCk7Cit9CisKK3ZvaWQgcnQyeDAwbGlua19zdG9wX3dhdGNoZG9nKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydDJ4MDBkZXYtPmxpbmsud2F0Y2hkb2dfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0MngwMGxpbmtfd2F0Y2hkb2coc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPQorCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0MngwMF9kZXYsIGxpbmsud2F0Y2hkb2dfd29yay53b3JrKTsKKwlzdHJ1Y3QgbGluayAqbGluayA9ICZydDJ4MDBkZXYtPmxpbms7CisKKwkvKgorCSAqIFdoZW4gdGhlIHJhZGlvIGlzIHNodXR0aW5nIGRvd24gd2Ugc2hvdWxkCisJICogaW1tZWRpYXRlbHkgY2Vhc2UgdGhlIHdhdGNoZG9nIG1vbml0b3JpbmcuCisJICovCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlydDJ4MDBkZXYtPm9wcy0+bGliLT53YXRjaGRvZyhydDJ4MDBkZXYpOworCisJaWYgKHRlc3RfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpCisJCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsocnQyeDAwZGV2LT5odywKKwkJCQkJICAgICAmbGluay0+d2F0Y2hkb2dfd29yaywgV0FUQ0hET0dfSU5URVJWQUwpOworfQorCiB2b2lkIHJ0MngwMGxpbmtfcmVnaXN0ZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKKwlJTklUX0RFTEFZRURfV09SSygmcnQyeDAwZGV2LT5saW5rLndhdGNoZG9nX3dvcmssIHJ0MngwMGxpbmtfd2F0Y2hkb2cpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZydDJ4MDBkZXYtPmxpbmsud29yaywgcnQyeDAwbGlua190dW5lcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKaW5kZXggYWJiZDg1Ny4uMjM1ZTAzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwpAQCAtMjczLDE2ICsyNzMsMjQgQEAKIAltdXRleF9pbml0KCZpbnRmLT5iZWFjb25fc2tiX211dGV4KTsKIAlpbnRmLT5iZWFjb24gPSBlbnRyeTsKIAotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCi0JCW1lbWNweSgmaW50Zi0+YnNzaWQsIHZpZi0+YWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSgmaW50Zi0+bWFjLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKLQogCS8qCiAJICogVGhlIE1BQyBhZGRkcmVzcyBtdXN0IGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIGRldmljZQogCSAqIGhhcyBiZWVuIGluaXRpYWxpemVkLiBPdGhlcndpc2UgdGhlIGRldmljZSBjYW4gcmVzZXQKIAkgKiB0aGUgTUFDIHJlZ2lzdGVycy4KKwkgKiBUaGUgQlNTSUQgYWRkcmVzcyBtdXN0IG9ubHkgYmUgY29uZmlndXJlZCBpbiBBUCBtb2RlLAorCSAqIGhvd2V2ZXIgd2Ugc2hvdWxkIG5vdCBzZW5kIGFuIGVtcHR5IEJTU0lEIGFkZHJlc3MgZm9yCisJICogU1RBIGludGVyZmFjZXMgYXQgdGhpcyB0aW1lLCBzaW5jZSB0aGlzIGNhbiBjYXVzZQorCSAqIGludmFsaWQgYmVoYXZpb3IgaW4gdGhlIGRldmljZS4KIAkgKi8KLQlydDJ4MDBsaWJfY29uZmlnX2ludGYocnQyeDAwZGV2LCBpbnRmLCB2aWYtPnR5cGUsIGludGYtPm1hYywgTlVMTCk7CisJbWVtY3B5KCZpbnRmLT5tYWMsIHZpZi0+YWRkciwgRVRIX0FMRU4pOworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJbWVtY3B5KCZpbnRmLT5ic3NpZCwgdmlmLT5hZGRyLCBFVEhfQUxFTik7CisJCXJ0MngwMGxpYl9jb25maWdfaW50ZihydDJ4MDBkZXYsIGludGYsIHZpZi0+dHlwZSwKKwkJCQkgICAgICBpbnRmLT5tYWMsIGludGYtPmJzc2lkKTsKKwl9IGVsc2UgeworCQlydDJ4MDBsaWJfY29uZmlnX2ludGYocnQyeDAwZGV2LCBpbnRmLCB2aWYtPnR5cGUsCisJCQkJICAgICAgaW50Zi0+bWFjLCBOVUxMKTsKKwl9CiAKIAkvKgogCSAqIFNvbWUgZmlsdGVycyBkZXBlbmQgb24gdGhlIGN1cnJlbnQgd29ya2luZyBtb2RlLiBXZSBjYW4gZm9yY2UKQEAgLTM0Niw5ICszNTQsMTEgQEAKIAkvKgogCSAqIFNvbWUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIChlLmcuIGNoYW5uZWwgYW5kIGFudGVubmEgdmFsdWVzKSBjYW4KIAkgKiBvbmx5IGJlIHNldCB3aGVuIHRoZSByYWRpbyBpcyBlbmFibGVkLCBidXQgZG8gcmVxdWlyZSB0aGUgUlggdG8KLQkgKiBiZSBvZmYuCisJICogYmUgb2ZmLiBEdXJpbmcgdGhpcyBwZXJpb2Qgd2Ugc2hvdWxkIGtlZXAgbGluayB0dW5pbmcgZW5hYmxlZCwKKwkgKiBpZiBmb3IgYW55IHJlYXNvbiB0aGUgbGluayB0dW5lciBtdXN0IGJlIHJlc2V0LCB0aGlzIHdpbGwgYmUKKwkgKiBoYW5kbGVkIGJ5IHJ0MngwMGxpYl9jb25maWcoKS4KIAkgKi8KLQlydDJ4MDBsaWJfdG9nZ2xlX3J4KHJ0MngwMGRldiwgU1RBVEVfUkFESU9fUlhfT0ZGKTsKKwlydDJ4MDBsaWJfdG9nZ2xlX3J4KHJ0MngwMGRldiwgU1RBVEVfUkFESU9fUlhfT0ZGX0xJTkspOwogCiAJLyoKIAkgKiBXaGVuIHdlJ3ZlIGp1c3QgdHVybmVkIG9uIHRoZSByYWRpbywgd2Ugd2FudCB0byByZXByb2dyYW0KQEAgLTM2Niw3ICszNzYsNyBAQAogCXJ0MngwMGxpYl9jb25maWdfYW50ZW5uYShydDJ4MDBkZXYsIHJ0MngwMGRldi0+ZGVmYXVsdF9hbnQpOwogCiAJLyogVHVybiBSWCBiYWNrIG9uICovCi0JcnQyeDAwbGliX3RvZ2dsZV9yeChydDJ4MDBkZXYsIFNUQVRFX1JBRElPX1JYX09OKTsKKwlydDJ4MDBsaWJfdG9nZ2xlX3J4KHJ0MngwMGRldiwgU1RBVEVfUkFESU9fUlhfT05fTElOSyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQzMCwxMiArNDQwLDM2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBtYWNfY29uZmlndXJlX2ZpbHRlcik7CiAKK3N0YXRpYyB2b2lkIHJ0MngwMG1hY19zZXRfdGltX2l0ZXIodm9pZCAqZGF0YSwgdTggKm1hYywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBydDJ4MDBfaW50ZiAqaW50ZiA9IHZpZl90b19pbnRmKHZpZik7CisKKwlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgorCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCAmJgorCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfV0RTKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmludGYtPmxvY2spOworCWludGYtPmRlbGF5ZWRfZmxhZ3MgfD0gREVMQVlFRF9VUERBVEVfQkVBQ09OOworCXNwaW5fdW5sb2NrKCZpbnRmLT5sb2NrKTsKK30KKwogaW50IHJ0MngwMG1hY19zZXRfdGltKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkgICAgICBib29sIHNldCkKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7CiAKLQlydDJ4MDBsaWJfYmVhY29uZG9uZShydDJ4MDBkZXYpOworCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19hdG9taWMocnQyeDAwZGV2LT5odywKKwkJCQkJCSAgIHJ0MngwMG1hY19zZXRfdGltX2l0ZXIsCisJCQkJCQkgICBydDJ4MDBkZXYpOworCisJLyogcXVldWUgd29yayB0byB1cG9kYXRlIHRoZSBiZWFjb24gdGVtcGxhdGUgKi8KKwlpZWVlODAyMTFfcXVldWVfd29yayhydDJ4MDBkZXYtPmh3LCAmcnQyeDAwZGV2LT5pbnRmX3dvcmspOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbWFjX3NldF90aW0pOwpAQCAtNTM5LDYgKzU3MywyMiBAQAogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbWFjX3NldF9rZXkpOwogI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0NSWVBUTyAqLwogCit2b2lkIHJ0MngwMG1hY19zd19zY2FuX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBody0+cHJpdjsKKwlfX3NldF9iaXQoREVWSUNFX1NUQVRFX1NDQU5OSU5HLCAmcnQyeDAwZGV2LT5mbGFncyk7CisJcnQyeDAwbGlua19zdG9wX3R1bmVyKHJ0MngwMGRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBtYWNfc3dfc2Nhbl9zdGFydCk7CisKK3ZvaWQgcnQyeDAwbWFjX3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGh3LT5wcml2OworCV9fY2xlYXJfYml0KERFVklDRV9TVEFURV9TQ0FOTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCXJ0MngwMGxpbmtfc3RhcnRfdHVuZXIocnQyeDAwZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMG1hY19zd19zY2FuX2NvbXBsZXRlKTsKKwogaW50IHJ0MngwMG1hY19nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCiB7CkBAIC01NjIsNyArNjEyLDYgQEAKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7CiAJc3RydWN0IHJ0MngwMF9pbnRmICppbnRmID0gdmlmX3RvX2ludGYodmlmKTsKLQlpbnQgdXBkYXRlX2Jzc2lkID0gMDsKIAogCS8qCiAJICogbWFjODAyMTEgbWlnaHQgYmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdoaWxlIHdlIGFyZSB0cnlpbmcKQEAgLTU3NywxMCArNjI2LDggQEAKIAkgKiBjb25mLT5ic3NpZCBjYW4gYmUgTlVMTCBpZiBjb21pbmcgZnJvbSB0aGUgaW50ZXJuYWwKIAkgKiBiZWFjb24gdXBkYXRlIHJvdXRpbmUuCiAJICovCi0JaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgewotCQl1cGRhdGVfYnNzaWQgPSAxOworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQlNTSUQpCiAJCW1lbWNweSgmaW50Zi0+YnNzaWQsIGJzc19jb25mLT5ic3NpZCwgRVRIX0FMRU4pOwotCX0KIAogCXNwaW5fdW5sb2NrKCZpbnRmLT5sb2NrKTsKIApAQCAtNTkyLDcgKzYzOSw3IEBACiAJICovCiAJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CU1NJRCkKIAkJcnQyeDAwbGliX2NvbmZpZ19pbnRmKHJ0MngwMGRldiwgaW50ZiwgdmlmLT50eXBlLCBOVUxMLAotCQkJCSAgICAgIHVwZGF0ZV9ic3NpZCA/IGJzc19jb25mLT5ic3NpZCA6IE5VTEwpOworCQkJCSAgICAgIGJzc19jb25mLT5ic3NpZCk7CiAKIAkvKgogCSAqIFVwZGF0ZSB0aGUgYmVhY29uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHBjaS5jCmluZGV4IGY3MWVlZTYuLjE5YjI2MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcGNpLmMKQEAgLTYwLDM0ICs2MCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBwY2lfcmVnYnVzeV9yZWFkKTsKIAotLyoKLSAqIFRYIGRhdGEgaGFuZGxlcnMuCi0gKi8KLWludCBydDJ4MDBwY2lfd3JpdGVfdHhfZGF0YShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAotCQkJICAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKLXsKLQlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7Ci0KLQkvKgotCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHdlIGFscmVhZHkgY2hlY2tlZCB0aGUgZW50cnkKLQkgKiB3YXMgb3Vycy4gV2hlbiB0aGUgaGFyZHdhcmUgZGlzYWdyZWVzIHRoZXJlIGhhcyBiZWVuCi0JICogYSBxdWV1ZSBjb3JydXB0aW9uIQotCSAqLwotCWlmICh1bmxpa2VseShydDJ4MDBkZXYtPm9wcy0+bGliLT5nZXRfZW50cnlfc3RhdGUoZW50cnkpKSkgewotCQlFUlJPUihydDJ4MDBkZXYsCi0JCSAgICAgICJDb3JydXB0IHF1ZXVlICVkLCBhY2Nlc3NpbmcgZW50cnkgd2hpY2ggaXMgbm90IG91cnMuXG4iCi0JCSAgICAgICJQbGVhc2UgZmlsZSBidWcgcmVwb3J0IHRvICVzLlxuIiwKLQkJICAgICAgZW50cnktPnF1ZXVlLT5xaWQsIERSVl9QUk9KRUNUKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBwY2lfd3JpdGVfdHhfZGF0YSk7Ci0KLS8qCi0gKiBUWC9SWCBkYXRhIGhhbmRsZXJzLgotICovCiB2b2lkIHJ0MngwMHBjaV9yeGRvbmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKIAlzdHJ1Y3QgZGF0YV9xdWV1ZSAqcXVldWUgPSBydDJ4MDBkZXYtPnJ4OwpAQCAtMTgxLDggKzE1MywxMCBAQAogCS8qCiAJICogUmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIuCiAJICovCi0Jc3RhdHVzID0gcmVxdWVzdF9pcnEocnQyeDAwZGV2LT5pcnEsIHJ0MngwMGRldi0+b3BzLT5saWItPmlycV9oYW5kbGVyLAotCQkJICAgICBJUlFGX1NIQVJFRCwgcnQyeDAwZGV2LT5uYW1lLCBydDJ4MDBkZXYpOworCXN0YXR1cyA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHJ0MngwMGRldi0+aXJxLAorCQkJCSAgICAgIHJ0MngwMGRldi0+b3BzLT5saWItPmlycV9oYW5kbGVyLAorCQkJCSAgICAgIHJ0MngwMGRldi0+b3BzLT5saWItPmlycV9oYW5kbGVyX3RocmVhZCwKKwkJCQkgICAgICBJUlFGX1NIQVJFRCwgcnQyeDAwZGV2LT5uYW1lLCBydDJ4MDBkZXYpOwogCWlmIChzdGF0dXMpIHsKIAkJRVJST1IocnQyeDAwZGV2LCAiSVJRICVkIGFsbG9jYXRpb24gZmFpbGVkIChlcnJvciAlZCkuXG4iLAogCQkgICAgICBydDJ4MDBkZXYtPmlycSwgc3RhdHVzKTsKQEAgLTMwNSw3ICsyNzksMTAgQEAKIAlydDJ4MDBkZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKIAlydDJ4MDBkZXYtPm5hbWUgPSBwY2lfbmFtZShwY2lfZGV2KTsKIAotCXJ0MngwMF9zZXRfY2hpcF9pbnRmKHJ0MngwMGRldiwgUlQyWDAwX0NISVBfSU5URl9QQ0kpOworCWlmIChwY2lfZGV2LT5pc19wY2llKQorCQlydDJ4MDBfc2V0X2NoaXBfaW50ZihydDJ4MDBkZXYsIFJUMlgwMF9DSElQX0lOVEZfUENJRSk7CisJZWxzZQorCQlydDJ4MDBfc2V0X2NoaXBfaW50ZihydDJ4MDBkZXYsIFJUMlgwMF9DSElQX0lOVEZfUENJKTsKIAogCXJldHZhbCA9IHJ0MngwMHBjaV9hbGxvY19yZWcocnQyeDAwZGV2KTsKIAlpZiAocmV0dmFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHBjaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHBjaS5oCmluZGV4IDUxYmNlZjMuLmI4NTRkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBwY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcGNpLmgKQEAgLTg2LDE2ICs4Niw2IEBACiAJCQkgICB1MzIgKnJlZyk7CiAKIC8qKgotICogcnQyeDAwcGNpX3dyaXRlX3R4X2RhdGEgLSBJbml0aWFsaXplIGRhdGEgZm9yIFRYIG9wZXJhdGlvbgotICogQGVudHJ5OiBUaGUgZW50cnkgd2hlcmUgdGhlIGZyYW1lIGlzIGxvY2F0ZWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgRE1BIGFuZCBza2IgZGVzY3JpcHRvcgotICogdG8gcHJlcGFyZSB0aGUgZW50cnkgZm9yIHRoZSBhY3R1YWwgVFggb3BlcmF0aW9uLgotICovCi1pbnQgcnQyeDAwcGNpX3dyaXRlX3R4X2RhdGEoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKLQkJCSAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpOwotCi0vKioKICAqIHN0cnVjdCBxdWV1ZV9lbnRyeV9wcml2X3BjaTogUGVyIGVudHJ5IFBDSSBzcGVjaWZpYyBpbmZvcm1hdGlvbgogICoKICAqIEBkZXNjOiBQb2ludGVyIHRvIGRldmljZSBkZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCmluZGV4IDIwZGJkZDYuLmEzNDAxZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCkBAIC0xMDAsMjEgKzEwMCw4IEBACiB7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKHNrYik7CiAKLQkvKgotCSAqIElmIGRldmljZSBoYXMgcmVxdWVzdGVkIGhlYWRyb29tLCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQKLQkgKiBpcyBhbHNvIG1hcHBlZCB0byB0aGUgRE1BIHNvIGl0IGNhbiBiZSB1c2VkIGZvciB0cmFuc2ZlcmluZwotCSAqIGFkZGl0aW9uYWwgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0byB0aGUgaGFyZHdhcmUuCi0JICovCi0Jc2tiX3B1c2goc2tiLCBydDJ4MDBkZXYtPm9wcy0+ZXh0cmFfdHhfaGVhZHJvb20pOwotCiAJc2tiZGVzYy0+c2tiX2RtYSA9CiAJICAgIGRtYV9tYXBfc2luZ2xlKHJ0MngwMGRldi0+ZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQotCS8qCi0JICogUmVzdG9yZSBkYXRhIHBvaW50ZXIgdG8gb3JpZ2luYWwgbG9jYXRpb24gYWdhaW4uCi0JICovCi0Jc2tiX3B1bGwoc2tiLCBydDJ4MDBkZXYtPm9wcy0+ZXh0cmFfdHhfaGVhZHJvb20pOwotCiAJc2tiZGVzYy0+ZmxhZ3MgfD0gU0tCREVTQ19ETUFfTUFQUEVEX1RYOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwcXVldWVfbWFwX3R4c2tiKTsKQEAgLTEzMCwxNiArMTE3LDEyIEBACiAJfQogCiAJaWYgKHNrYmRlc2MtPmZsYWdzICYgU0tCREVTQ19ETUFfTUFQUEVEX1RYKSB7Ci0JCS8qCi0JCSAqIEFkZCBoZWFkcm9vbSB0byB0aGUgc2tiIGxlbmd0aCwgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCQkgKiBieSB0aGUgZHJpdmVyLCBidXQgaXQgd2FzIGFjdHVhbGx5IG1hcHBlZCB0byBETUEuCi0JCSAqLwotCQlkbWFfdW5tYXBfc2luZ2xlKHJ0MngwMGRldi0+ZGV2LCBza2JkZXNjLT5za2JfZG1hLAotCQkJCSBza2ItPmxlbiArIHJ0MngwMGRldi0+b3BzLT5leHRyYV90eF9oZWFkcm9vbSwKKwkJZG1hX3VubWFwX3NpbmdsZShydDJ4MDBkZXYtPmRldiwgc2tiZGVzYy0+c2tiX2RtYSwgc2tiLT5sZW4sCiAJCQkJIERNQV9UT19ERVZJQ0UpOwogCQlza2JkZXNjLT5mbGFncyAmPSB+U0tCREVTQ19ETUFfTUFQUEVEX1RYOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMHF1ZXVlX3VubWFwX3NrYik7CiAKIHZvaWQgcnQyeDAwcXVldWVfZnJlZV9za2Ioc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTM3MCwxMyArMzUzLDE4IEBACiAJLyoKIAkgKiBDaGVjayBpZiBtb3JlIGZyYWdtZW50cyBhcmUgcGVuZGluZwogCSAqLwotCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpIHx8Ci0JICAgICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTU9SRV9GUkFNRVMpKSB7CisJaWYgKGllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJX19zZXRfYml0KEVOVFJZX1RYRF9CVVJTVCwgJnR4ZGVzYy0+ZmxhZ3MpOwogCQlfX3NldF9iaXQoRU5UUllfVFhEX01PUkVfRlJBRywgJnR4ZGVzYy0+ZmxhZ3MpOwogCX0KIAogCS8qCisJICogQ2hlY2sgaWYgbW9yZSBmcmFtZXMgKCE9IGZyYWdtZW50cykgYXJlIHBlbmRpbmcKKwkgKi8KKwlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX01PUkVfRlJBTUVTKQorCQlfX3NldF9iaXQoRU5UUllfVFhEX0JVUlNULCAmdHhkZXNjLT5mbGFncyk7CisKKwkvKgogCSAqIEJlYWNvbnMgYW5kIHByb2JlIHJlc3BvbnNlcyByZXF1aXJlIHRoZSB0c2YgdGltZXN0YW1wCiAJICogdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZnJhbWUsIGV4Y2VwdCBmb3IgYSBmcmFtZSB0aGF0IGhhcyBiZWVuIGluamVjdGVkCiAJICogdGhyb3VnaCBhIG1vbml0b3IgaW50ZXJmYWNlLiBUaGlzIGxhdHRlciBpcyBuZWVkZWQgZm9yIHRlc3RpbmcgYQpAQCAtNDE2LDEyICs0MDQsNTEgQEAKIAlydDJ4MDBxdWV1ZV9jcmVhdGVfdHhfZGVzY3JpcHRvcl9wbGNwKGVudHJ5LCB0eGRlc2MsIGh3cmF0ZSk7CiB9CiAKK3N0YXRpYyBpbnQgcnQyeDAwcXVldWVfd3JpdGVfdHhfZGF0YShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAorCQkJCSAgICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKKworCS8qCisJICogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgd2UgYWxyZWFkeSBjaGVja2VkIHRoZSBlbnRyeQorCSAqIHdhcyBvdXJzLiBXaGVuIHRoZSBoYXJkd2FyZSBkaXNhZ3JlZXMgdGhlcmUgaGFzIGJlZW4KKwkgKiBhIHF1ZXVlIGNvcnJ1cHRpb24hCisJICovCisJaWYgKHVubGlrZWx5KHJ0MngwMGRldi0+b3BzLT5saWItPmdldF9lbnRyeV9zdGF0ZSAmJgorCQkgICAgIHJ0MngwMGRldi0+b3BzLT5saWItPmdldF9lbnRyeV9zdGF0ZShlbnRyeSkpKSB7CisJCUVSUk9SKHJ0MngwMGRldiwKKwkJICAgICAgIkNvcnJ1cHQgcXVldWUgJWQsIGFjY2Vzc2luZyBlbnRyeSB3aGljaCBpcyBub3Qgb3Vycy5cbiIKKwkJICAgICAgIlBsZWFzZSBmaWxlIGJ1ZyByZXBvcnQgdG8gJXMuXG4iLAorCQkgICAgICBlbnRyeS0+cXVldWUtPnFpZCwgRFJWX1BST0pFQ1QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEFkZCB0aGUgcmVxdWVzdGVkIGV4dHJhIHR4IGhlYWRyb29tIGluIGZyb250IG9mIHRoZSBza2IuCisJICovCisJc2tiX3B1c2goZW50cnktPnNrYiwgcnQyeDAwZGV2LT5vcHMtPmV4dHJhX3R4X2hlYWRyb29tKTsKKwltZW1zZXQoZW50cnktPnNrYi0+ZGF0YSwgMCwgcnQyeDAwZGV2LT5vcHMtPmV4dHJhX3R4X2hlYWRyb29tKTsKKworCS8qCisJICogQ2FsbCB0aGUgZHJpdmVyJ3Mgd3JpdGVfdHhfZGF0YSBmdW5jdGlvbiwgaWYgaXQgZXhpc3RzLgorCSAqLworCWlmIChydDJ4MDBkZXYtPm9wcy0+bGliLT53cml0ZV90eF9kYXRhKQorCQlydDJ4MDBkZXYtPm9wcy0+bGliLT53cml0ZV90eF9kYXRhKGVudHJ5LCB0eGRlc2MpOworCisJLyoKKwkgKiBNYXAgdGhlIHNrYiB0byBETUEuCisJICovCisJaWYgKHRlc3RfYml0KERSSVZFUl9SRVFVSVJFX0RNQSwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlydDJ4MDBxdWV1ZV9tYXBfdHhza2IocnQyeDAwZGV2LCBlbnRyeS0+c2tiKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBydDJ4MDBxdWV1ZV93cml0ZV90eF9kZXNjcmlwdG9yKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCiAJCQkJCSAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpCiB7CiAJc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlID0gZW50cnktPnF1ZXVlOwogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBxdWV1ZS0+cnQyeDAwZGV2OwotCWVudW0gcnQyeDAwX2R1bXBfdHlwZSBkdW1wX3R5cGU7CiAKIAlydDJ4MDBkZXYtPm9wcy0+bGliLT53cml0ZV90eF9kZXNjKHJ0MngwMGRldiwgZW50cnktPnNrYiwgdHhkZXNjKTsKIApAQCAtNDI5LDkgKzQ1Niw3IEBACiAJICogQWxsIHByb2Nlc3Npbmcgb24gdGhlIGZyYW1lIGhhcyBiZWVuIGNvbXBsZXRlZCwgdGhpcyBtZWFucwogCSAqIGl0IGlzIG5vdyByZWFkeSB0byBiZSBkdW1wZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggZGVidWdmcy4KIAkgKi8KLQlkdW1wX3R5cGUgPSAodHhkZXNjLT5xdWV1ZSA9PSBRSURfQkVBQ09OKSA/Ci0JCQkJCURVTVBfRlJBTUVfQkVBQ09OIDogRFVNUF9GUkFNRV9UWDsKLQlydDJ4MDBkZWJ1Z19kdW1wX2ZyYW1lKHJ0MngwMGRldiwgZHVtcF90eXBlLCBlbnRyeS0+c2tiKTsKKwlydDJ4MDBkZWJ1Z19kdW1wX2ZyYW1lKHJ0MngwMGRldiwgRFVNUF9GUkFNRV9UWCwgZW50cnktPnNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0MngwMHF1ZXVlX2tpY2tfdHhfcXVldWUoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKQEAgLTUzMCwxNiArNTU1LDEyIEBACiAJICogY2FsbCBmYWlsZWQuIFNpbmNlIHdlIGFsd2F5cyByZXR1cm4gTkVUREVWX1RYX09LIHRvIG1hYzgwMjExLAogCSAqIHRoaXMgZnJhbWUgd2lsbCBzaW1wbHkgYmUgZHJvcHBlZC4KIAkgKi8KLQlpZiAodW5saWtlbHkocXVldWUtPnJ0MngwMGRldi0+b3BzLT5saWItPndyaXRlX3R4X2RhdGEoZW50cnksCi0JCQkJCQkJICAgICAgICZ0eGRlc2MpKSkgeworCWlmICh1bmxpa2VseShydDJ4MDBxdWV1ZV93cml0ZV90eF9kYXRhKGVudHJ5LCAmdHhkZXNjKSkpIHsKIAkJY2xlYXJfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLCAmZW50cnktPmZsYWdzKTsKIAkJZW50cnktPnNrYiA9IE5VTEw7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICh0ZXN0X2JpdChEUklWRVJfUkVRVUlSRV9ETUEsICZxdWV1ZS0+cnQyeDAwZGV2LT5mbGFncykpCi0JCXJ0MngwMHF1ZXVlX21hcF90eHNrYihxdWV1ZS0+cnQyeDAwZGV2LCBza2IpOwotCiAJc2V0X2JpdChFTlRSWV9EQVRBX1BFTkRJTkcsICZlbnRyeS0+ZmxhZ3MpOwogCiAJcnQyeDAwcXVldWVfaW5kZXhfaW5jKHF1ZXVlLCBRX0lOREVYKTsKQEAgLTU5NSwxMSArNjE2LDYgQEAKIAlza2JkZXNjLT5lbnRyeSA9IGludGYtPmJlYWNvbjsKIAogCS8qCi0JICogV3JpdGUgVFggZGVzY3JpcHRvciBpbnRvIHJlc2VydmVkIHJvb20gaW4gZnJvbnQgb2YgdGhlIGJlYWNvbi4KLQkgKi8KLQlydDJ4MDBxdWV1ZV93cml0ZV90eF9kZXNjcmlwdG9yKGludGYtPmJlYWNvbiwgJnR4ZGVzYyk7Ci0KLQkvKgogCSAqIFNlbmQgYmVhY29uIHRvIGhhcmR3YXJlIGFuZCBlbmFibGUgYmVhY29uIGdlbmFyYXRpb24uLgogCSAqLwogCXJ0MngwMGRldi0+b3BzLT5saWItPndyaXRlX2JlYWNvbihpbnRmLT5iZWFjb24sICZ0eGRlc2MpOwpAQCAtNjcyLDkgKzY4OCwxMSBAQAogCiAJaWYgKGluZGV4ID09IFFfSU5ERVgpIHsKIAkJcXVldWUtPmxlbmd0aCsrOworCQlxdWV1ZS0+bGFzdF9pbmRleCA9IGppZmZpZXM7CiAJfSBlbHNlIGlmIChpbmRleCA9PSBRX0lOREVYX0RPTkUpIHsKIAkJcXVldWUtPmxlbmd0aC0tOwogCQlxdWV1ZS0+Y291bnQrKzsKKwkJcXVldWUtPmxhc3RfaW5kZXhfZG9uZSA9IGppZmZpZXM7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGlycWZsYWdzKTsKQEAgLTY4OCw2ICs3MDYsOCBAQAogCiAJcXVldWUtPmNvdW50ID0gMDsKIAlxdWV1ZS0+bGVuZ3RoID0gMDsKKwlxdWV1ZS0+bGFzdF9pbmRleCA9IGppZmZpZXM7CisJcXVldWUtPmxhc3RfaW5kZXhfZG9uZSA9IGppZmZpZXM7CiAJbWVtc2V0KHF1ZXVlLT5pbmRleCwgMCwgc2l6ZW9mKHF1ZXVlLT5pbmRleCkpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGlycWZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmgKaW5kZXggZjc5MTcwOC4uMTkxZTc3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmgKQEAgLTIxMyw5ICsyMTMsMTYgQEAKIC8qKgogICogZW51bSB0eGRvbmVfZW50cnlfZGVzY19mbGFnczogRmxhZ3MgZm9yICZzdHJ1Y3QgdHhkb25lX2VudHJ5X2Rlc2MKICAqCisgKiBFdmVyeSB0eGRvbmUgcmVwb3J0IGhhcyB0byBjb250YWluIHRoZSBiYXNpYyByZXN1bHQgb2YgdGhlCisgKiB0cmFuc21pc3Npb24sIGVpdGhlciAmVFhET05FX1VOS05PV04sICZUWERPTkVfU1VDQ0VTUyBvcgorICogJlRYRE9ORV9GQUlMVVJFLiBUaGUgZmxhZyAmVFhET05FX0ZBTExCQUNLIGNhbiBiZSB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIGFsbCBvZiB0aGVzZSBmbGFncyBidXQgc2hvdWxkIG9ubHkgYmUgc2V0CisgKiBpZiByZXRpcmVzID4gMC4gVGhlIGZsYWcgJlRYRE9ORV9FWENFU1NJVkVfUkVUUlkgY2FuIG9ubHkgYmUgdXNlZAorICogaW4gY29uanVuY3Rpb24gd2l0aCAmVFhET05FX0ZBSUxVUkUuCisgKgogICogQFRYRE9ORV9VTktOT1dOOiBIYXJkd2FyZSBjb3VsZCBub3QgZGV0ZXJtaW5lIHN1Y2Nlc3Mgb2YgdHJhbnNtaXNzaW9uLgogICogQFRYRE9ORV9TVUNDRVNTOiBGcmFtZSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbmQKLSAqIEBUWERPTkVfRkFMTEJBQ0s6IEZyYW1lIHdhcyBzdWNjZXNzZnVsbHkgc2VuZCB1c2luZyBhIGZhbGxiYWNrIHJhdGUuCisgKiBAVFhET05FX0ZBTExCQUNLOiBIYXJkd2FyZSB1c2VkIGZhbGxiYWNrIHJhdGVzIGZvciByZXRyaWVzCiAgKiBAVFhET05FX0ZBSUxVUkU6IEZyYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IHNlbmQKICAqIEBUWERPTkVfRVhDRVNTSVZFX1JFVFJZOiBJbiBhZGRpdGlvbiB0byAmVFhET05FX0ZBSUxVUkUsIHRoZQogICoJZnJhbWUgdHJhbnNtaXNzaW9uIGZhaWxlZCBkdWUgdG8gZXhjZXNzaXZlIHJldHJpZXMuCkBAIC00MzksNiArNDQ2LDggQEAKIAllbnVtIGRhdGFfcXVldWVfcWlkIHFpZDsKIAogCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4X2RvbmU7CiAJdW5zaWduZWQgaW50IGNvdW50OwogCXVuc2lnbmVkIHNob3J0IGxpbWl0OwogCXVuc2lnbmVkIHNob3J0IHRocmVzaG9sZDsKQEAgLTU5Miw2ICs2MDEsMTUgQEAKIH0KIAogLyoqCisgKiBydDJ4MDBxdWV1ZV90aW1lb3V0IC0gQ2hlY2sgaWYgYSB0aW1lb3V0IG9jY3VyZWQgZm9yIHRoaXMgcXVldWUKKyAqIEBxdWV1ZTogUXVldWUgdG8gY2hlY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0MngwMHF1ZXVlX3RpbWVvdXQoc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlKQoreworCXJldHVybiB0aW1lX2FmdGVyKHF1ZXVlLT5sYXN0X2luZGV4LCBxdWV1ZS0+bGFzdF9pbmRleF9kb25lICsgKEhaIC8gMTApKTsKK30KKworLyoqCiAgKiBfcnQyeDAwX2Rlc2NfcmVhZCAtIFJlYWQgYSB3b3JkIGZyb20gdGhlIGhhcmR3YXJlIGRlc2NyaXB0b3IuCiAgKiBAZGVzYzogQmFzZSBkZXNjcmlwdG9yIGFkZHJlc3MKICAqIEB3b3JkOiBXb3JkIGluZGV4IGZyb20gd2hlcmUgdGhlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHJlYWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcmVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcmVnLmgKaW5kZXggYjlmZTk0OC4uY2VmOTQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHJlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDByZWcuaApAQCAtNjMsNyArNjMsOCBAQAogZW51bSB0c2Zfc3luYyB7CiAJVFNGX1NZTkNfTk9ORSA9IDAsCiAJVFNGX1NZTkNfSU5GUkEgPSAxLAotCVRTRl9TWU5DX0JFQUNPTiA9IDIsCisJVFNGX1NZTkNfQURIT0MgPSAyLAorCVRTRl9TWU5DX0FQX05PTkUgPSAzLAogfTsKIAogLyoKQEAgLTg4LDYgKzg5LDggQEAKIAlTVEFURV9SQURJT19SWF9PRkZfTElOSywKIAlTVEFURV9SQURJT19JUlFfT04sCiAJU1RBVEVfUkFESU9fSVJRX09GRiwKKwlTVEFURV9SQURJT19JUlFfT05fSVNSLAorCVNUQVRFX1JBRElPX0lSUV9PRkZfSVNSLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYwppbmRleCBiZDE1NDZiLi5mZjNhMzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jCkBAIC0xMTMsMjYgKzExMyw2IEBACiAJCQkJICBjb25zdCB1MTYgb2Zmc2V0LCB2b2lkICpidWZmZXIsCiAJCQkJICBjb25zdCB1MTYgYnVmZmVyX2xlbmd0aCwgY29uc3QgaW50IHRpbWVvdXQpCiB7Ci0JaW50IHN0YXR1czsKLQotCW11dGV4X2xvY2soJnJ0MngwMGRldi0+Y3NyX211dGV4KTsKLQotCXN0YXR1cyA9IHJ0MngwMHVzYl92ZW5kb3JfcmVxX2J1ZmZfbG9jayhydDJ4MDBkZXYsIHJlcXVlc3QsCi0JCQkJCQlyZXF1ZXN0dHlwZSwgb2Zmc2V0LCBidWZmZXIsCi0JCQkJCQlidWZmZXJfbGVuZ3RoLCB0aW1lb3V0KTsKLQotCW11dGV4X3VubG9jaygmcnQyeDAwZGV2LT5jc3JfbXV0ZXgpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9idWZmKTsKLQotaW50IHJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9sYXJnZV9idWZmKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCi0JCQkJCWNvbnN0IHU4IHJlcXVlc3QsIGNvbnN0IHU4IHJlcXVlc3R0eXBlLAotCQkJCQljb25zdCB1MTYgb2Zmc2V0LCBjb25zdCB2b2lkICpidWZmZXIsCi0JCQkJCWNvbnN0IHUxNiBidWZmZXJfbGVuZ3RoLAotCQkJCQljb25zdCBpbnQgdGltZW91dCkKLXsKIAlpbnQgc3RhdHVzID0gMDsKIAl1bnNpZ25lZCBjaGFyICp0YjsKIAl1MTYgb2ZmLCBsZW4sIGJzaXplOwpAQCAtMTU3LDcgKzEzNyw3IEBACiAKIAlyZXR1cm4gc3RhdHVzOwogfQotRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYpOworRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2J1ZmYpOwogCiBpbnQgcnQyeDAwdXNiX3JlZ2J1c3lfcmVhZChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJICAgY29uc3QgdW5zaWduZWQgaW50IG9mZnNldCwKQEAgLTIxNiw0OCArMTk2LDI4IEBACiAJcnQyeDAwbGliX3R4ZG9uZShlbnRyeSwgJnR4ZGVzYyk7CiB9CiAKLWludCBydDJ4MDB1c2Jfd3JpdGVfdHhfZGF0YShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAotCQkJICAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDJ4MDB1c2Jfa2lja190eF9lbnRyeShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHRvX3VzYl9kZXZpY2VfaW50ZihydDJ4MDBkZXYtPmRldik7CiAJc3RydWN0IHF1ZXVlX2VudHJ5X3ByaXZfdXNiICplbnRyeV9wcml2ID0gZW50cnktPnByaXZfZGF0YTsKIAl1MzIgbGVuZ3RoOwogCi0JLyoKLQkgKiBBZGQgdGhlIGRlc2NyaXB0b3IgaW4gZnJvbnQgb2YgdGhlIHNrYi4KLQkgKi8KLQlza2JfcHVzaChlbnRyeS0+c2tiLCBlbnRyeS0+cXVldWUtPmRlc2Nfc2l6ZSk7Ci0JbWVtc2V0KGVudHJ5LT5za2ItPmRhdGEsIDAsIGVudHJ5LT5xdWV1ZS0+ZGVzY19zaXplKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVOVFJZX0RBVEFfUEVORElORywgJmVudHJ5LT5mbGFncykpIHsKKwkJLyoKKwkJICogVVNCIGRldmljZXMgY2Fubm90IGJsaW5kbHkgcGFzcyB0aGUgc2tiLT5sZW4gYXMgdGhlCisJCSAqIGxlbmd0aCBvZiB0aGUgZGF0YSB0byB1c2JfZmlsbF9idWxrX3VyYi4gUGFzcyB0aGUgc2tiCisJCSAqIHRvIHRoZSBkcml2ZXIgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxlbmd0aCBzaG91bGQgYmUuCisJCSAqLworCQlsZW5ndGggPSBydDJ4MDBkZXYtPm9wcy0+bGliLT5nZXRfdHhfZGF0YV9sZW4oZW50cnkpOwogCi0JLyoKLQkgKiBVU0IgZGV2aWNlcyBjYW5ub3QgYmxpbmRseSBwYXNzIHRoZSBza2ItPmxlbiBhcyB0aGUKLQkgKiBsZW5ndGggb2YgdGhlIGRhdGEgdG8gdXNiX2ZpbGxfYnVsa191cmIuIFBhc3MgdGhlIHNrYgotCSAqIHRvIHRoZSBkcml2ZXIgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxlbmd0aCBzaG91bGQgYmUuCi0JICovCi0JbGVuZ3RoID0gcnQyeDAwZGV2LT5vcHMtPmxpYi0+Z2V0X3R4X2RhdGFfbGVuKGVudHJ5KTsKKwkJdXNiX2ZpbGxfYnVsa191cmIoZW50cnlfcHJpdi0+dXJiLCB1c2JfZGV2LAorCQkJCSAgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIGVudHJ5LT5xdWV1ZS0+dXNiX2VuZHBvaW50KSwKKwkJCQkgIGVudHJ5LT5za2ItPmRhdGEsIGxlbmd0aCwKKwkJCQkgIHJ0MngwMHVzYl9pbnRlcnJ1cHRfdHhkb25lLCBlbnRyeSk7CiAKLQl1c2JfZmlsbF9idWxrX3VyYihlbnRyeV9wcml2LT51cmIsIHVzYl9kZXYsCi0JCQkgIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBlbnRyeS0+cXVldWUtPnVzYl9lbmRwb2ludCksCi0JCQkgIGVudHJ5LT5za2ItPmRhdGEsIGxlbmd0aCwKLQkJCSAgcnQyeDAwdXNiX2ludGVycnVwdF90eGRvbmUsIGVudHJ5KTsKLQotCS8qCi0JICogTWFrZSBzdXJlIHRoZSBza2ItPmRhdGEgcG9pbnRlciBwb2ludHMgdG8gdGhlIGZyYW1lLCBub3QgdGhlCi0JICogZGVzY3JpcHRvci4KLQkgKi8KLQlza2JfcHVsbChlbnRyeS0+c2tiLCBlbnRyeS0+cXVldWUtPmRlc2Nfc2l6ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMHVzYl93cml0ZV90eF9kYXRhKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHJ0MngwMHVzYl9raWNrX3R4X2VudHJ5KHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnkpCi17Ci0Jc3RydWN0IHF1ZXVlX2VudHJ5X3ByaXZfdXNiICplbnRyeV9wcml2ID0gZW50cnktPnByaXZfZGF0YTsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRU5UUllfREFUQV9QRU5ESU5HLCAmZW50cnktPmZsYWdzKSkKIAkJdXNiX3N1Ym1pdF91cmIoZW50cnlfcHJpdi0+dXJiLCBHRlBfQVRPTUlDKTsKKwl9CiB9CiAKIHZvaWQgcnQyeDAwdXNiX2tpY2tfdHhfcXVldWUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTMzMiw2ICsyOTIsNTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMHVzYl9raWxsX3R4X3F1ZXVlKTsKIAorc3RhdGljIHZvaWQgcnQyeDAwdXNiX3dhdGNoZG9nX3Jlc2V0X3R4KHN0cnVjdCBkYXRhX3F1ZXVlICpxdWV1ZSkKK3sKKwlzdHJ1Y3QgcXVldWVfZW50cnlfcHJpdl91c2IgKmVudHJ5X3ByaXY7CisJdW5zaWduZWQgc2hvcnQgdGhyZXNob2xkID0gcXVldWUtPnRocmVzaG9sZDsKKworCVdBUk5JTkcocXVldWUtPnJ0MngwMGRldiwgIlRYIHF1ZXVlICVkIHRpbWVkIG91dCwgaW52b2tlIHJlc2V0IiwgcXVldWUtPnFpZCk7CisKKwkvKgorCSAqIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIFRYIHF1ZXVlLCB0aGlzIHdpbGwgZm9yY2UgbWFjODAyMTEKKwkgKiB0byB1c2UgdGhlIG90aGVyIHF1ZXVlcyB1bnRpbCB0aGlzIHF1ZXVlIGhhcyBiZWVuIHJlc3RvcmVkLgorCSAqCisJICogU2V0IHRoZSBxdWV1ZSB0aHJlc2hvbGQgdG8gdGhlIHF1ZXVlIGxpbWl0LiBUaGlzIHByZXZlbnRzIHRoZQorCSAqIHF1ZXVlIGZyb20gYmVpbmcgZW5hYmxlZCBkdXJpbmcgdGhlIHR4ZG9uZSBoYW5kbGVyLgorCSAqLworCXF1ZXVlLT50aHJlc2hvbGQgPSBxdWV1ZS0+bGltaXQ7CisJaWVlZTgwMjExX3N0b3BfcXVldWUocXVldWUtPnJ0MngwMGRldi0+aHcsIHF1ZXVlLT5xaWQpOworCisJLyoKKwkgKiBSZXNldCBhbGwgY3VycmVudGx5IHVwbG9hZGVkIFRYIGZyYW1lcy4KKwkgKi8KKwl3aGlsZSAoIXJ0MngwMHF1ZXVlX2VtcHR5KHF1ZXVlKSkgeworCQllbnRyeV9wcml2ID0gcnQyeDAwcXVldWVfZ2V0X2VudHJ5KHF1ZXVlLCBRX0lOREVYX0RPTkUpLT5wcml2X2RhdGE7CisJCXVzYl9raWxsX3VyYihlbnRyeV9wcml2LT51cmIpOworCisJCS8qCisJCSAqIFdlIG5lZWQgYSBzaG9ydCBkZWxheSBoZXJlIHRvIHdhaXQgZm9yCisJCSAqIHRoZSBVUkIgdG8gYmUgY2FuY2VsZWQgYW5kIGludm9rZWQgdGhlIHR4X2RvbmUgaGFuZGxlci4KKwkJICovCisJCXVkZWxheSgyMDApOworCX0KKworCS8qCisJICogVGhlIHF1ZXVlIGhhcyBiZWVuIHJlc2V0LCBhbmQgbWFjODAyMTEgaXMgYWxsb3dlZCB0byB1c2UgdGhlCisJICogcXVldWUgYWdhaW4uCisJICovCisJcXVldWUtPnRocmVzaG9sZCA9IHRocmVzaG9sZDsKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZShxdWV1ZS0+cnQyeDAwZGV2LT5odywgcXVldWUtPnFpZCk7Cit9CisKK3ZvaWQgcnQyeDAwdXNiX3dhdGNoZG9nKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlOworCisJdHhfcXVldWVfZm9yX2VhY2gocnQyeDAwZGV2LCBxdWV1ZSkgeworCQlpZiAocnQyeDAwcXVldWVfdGltZW91dChxdWV1ZSkpCisJCQlydDJ4MDB1c2Jfd2F0Y2hkb2dfcmVzZXRfdHgocXVldWUpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMHVzYl93YXRjaGRvZyk7CisKIC8qCiAgKiBSWCBkYXRhIGhhbmRsZXJzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmgKaW5kZXggNjIxZDBmOC4uZDNkM2RkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuaApAQCAtMTY3LDI1ICsxNjcsNiBAQAogCQkJCSAgIGNvbnN0IHUxNiBidWZmZXJfbGVuZ3RoLCBjb25zdCBpbnQgdGltZW91dCk7CiAKIC8qKgotICogcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYgLSBTZW5kIHJlZ2lzdGVyIGNvbW1hbmQgdG8gZGV2aWNlIChidWZmZXJlZCkKLSAqIEBydDJ4MDBkZXY6IFBvaW50ZXIgdG8gJnN0cnVjdCBydDJ4MDBfZGV2Ci0gKiBAcmVxdWVzdDogVVNCIHZlbmRvciBjb21tYW5kIChTZWUgJmVudW0gcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0KQotICogQHJlcXVlc3R0eXBlOiBSZXF1ZXN0IHR5cGUgJlVTQl9WRU5ET1JfUkVRVUVTVF8qCi0gKiBAb2Zmc2V0OiBSZWdpc3RlciBzdGFydCBvZmZzZXQgdG8gcGVyZm9ybSBhY3Rpb24gb24KLSAqIEBidWZmZXI6IEJ1ZmZlciB3aGVyZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlYWQvd3JpdHRlbiB0byBieSBkZXZpY2UKLSAqIEBidWZmZXJfbGVuZ3RoOiBTaXplIG9mICZidWZmZXIKLSAqIEB0aW1lb3V0OiBPcGVyYXRpb24gdGltZW91dAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmFuc2ZlciByZWdpc3RlciBkYXRhIGluIGJsb2NrcyBsYXJnZXIKLSAqIHRoZW4gQ1NSX0NBQ0hFX1NJWkUuIFVzZSBmb3IgZmlybXdhcmUgdXBsb2FkLCBrZXlzIGFuZCBiZWFjb25zLgotICovCi1pbnQgcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKLQkJCQkJY29uc3QgdTggcmVxdWVzdCwgY29uc3QgdTggcmVxdWVzdHR5cGUsCi0JCQkJCWNvbnN0IHUxNiBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLQkJCQkJY29uc3QgdTE2IGJ1ZmZlcl9sZW5ndGgsCi0JCQkJCWNvbnN0IGludCB0aW1lb3V0KTsKLQotLyoqCiAgKiBydDJ4MDB1c2JfdmVuZG9yX3JlcXVlc3Rfc3cgLSBTZW5kIHNpbmdsZSByZWdpc3RlciBjb21tYW5kIHRvIGRldmljZQogICogQHJ0MngwMGRldjogUG9pbnRlciB0byAmc3RydWN0IHJ0MngwMF9kZXYKICAqIEByZXF1ZXN0OiBVU0IgdmVuZG9yIGNvbW1hbmQgKFNlZSAmZW51bSBydDJ4MDB1c2JfdmVuZG9yX3JlcXVlc3QpCkBAIC0zNzAsMTYgKzM1MSw2IEBACiB2b2lkIHJ0MngwMHVzYl9kaXNhYmxlX3JhZGlvKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOwogCiAvKioKLSAqIHJ0MngwMHVzYl93cml0ZV90eF9kYXRhIC0gSW5pdGlhbGl6ZSBVUkIgZm9yIFRYIG9wZXJhdGlvbgotICogQGVudHJ5OiBUaGUgZW50cnkgd2hlcmUgdGhlIGZyYW1lIGlzIGxvY2F0ZWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgVVJCIGFuZCBza2IgZGVzY3JpcHRvcgotICogdG8gcHJlcGFyZSB0aGUgZW50cnkgZm9yIHRoZSBhY3R1YWwgVFggb3BlcmF0aW9uLgotICovCi1pbnQgcnQyeDAwdXNiX3dyaXRlX3R4X2RhdGEoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKLQkJCSAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpOwotCi0vKioKICAqIHN0cnVjdCBxdWV1ZV9lbnRyeV9wcml2X3VzYjogUGVyIGVudHJ5IFVTQiBzcGVjaWZpYyBpbmZvcm1hdGlvbgogICoKICAqIEB1cmI6IFVyYiBzdHJ1Y3R1cmUgdXNlZCBmb3IgZGV2aWNlIGNvbW11bmljYXRpb24uCkBAIC00MjgsNiArMzk5LDE2IEBACiB2b2lkIHJ0MngwMHVzYl9raWxsX3R4X3F1ZXVlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkgICAgICBjb25zdCBlbnVtIGRhdGFfcXVldWVfcWlkIHFpZCk7CiAKKy8qKgorICogcnQyeDAwdXNiX3dhdGNoZG9nIC0gV2F0Y2hkb2cgZm9yIFVTQiBjb21tdW5pY2F0aW9uCisgKiBAcnQyeDAwZGV2OiBQb2ludGVyIHRvICZzdHJ1Y3QgcnQyeDAwX2RldgorICoKKyAqIENoZWNrIHRoZSBoZWFsdGggb2YgdGhlIFVTQiBjb21tdW5pY2F0aW9uIGFuZCBkZXRlcm1pbmUKKyAqIGlmIHRpbWVvdXRzIGhhdmUgb2NjdXJlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhpcyBmdW5jdGlvbgorICogd2lsbCByZXNldCBhbGwgY29tbXVuaWNhdGlvbiB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkgYWdhaW4uCisgKi8KK3ZvaWQgcnQyeDAwdXNiX3dhdGNoZG9nKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpOworCiAvKgogICogRGV2aWNlIGluaXRpYWxpemF0aW9uIGhhbmRsZXJzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuYwppbmRleCA2YTc0YmFmLi5lNTM5YzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMKQEAgLTkzMSw2ICs5MzEsOSBAQAogCXUzMiByZWc7CiAKIAlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFRYUlhfQ1NSNCwgJnJlZyk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYUlhfQ1NSNF9PRkRNX1RYX1JBVEVfRE9XTiwgMSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYUlhfQ1NSNF9PRkRNX1RYX1JBVEVfU1RFUCwgMCk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYUlhfQ1NSNF9PRkRNX1RYX0ZBTExCQUNLX0NDSywgMCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFRYUlhfQ1NSNF9MT05HX1JFVFJZX0xJTUlULAogCQkJICAgbGliY29uZi0+Y29uZi0+bG9uZ19mcmFtZV9tYXhfdHhfY291bnQpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjRfU0hPUlRfUkVUUllfTElNSVQsCkBAIC0xNjE5LDcgKzE2MjIsOCBAQAogc3RhdGljIHZvaWQgcnQ2MXBjaV90b2dnbGVfaXJxKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkgICAgICAgZW51bSBkZXZfc3RhdGUgc3RhdGUpCiB7Ci0JaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09GRik7CisJaW50IG1hc2sgPSAoc3RhdGUgPT0gU1RBVEVfUkFESU9fSVJRX09GRikgfHwKKwkJICAgKHN0YXRlID09IFNUQVRFX1JBRElPX0lSUV9PRkZfSVNSKTsKIAl1MzIgcmVnOwogCiAJLyoKQEAgLTE3MzYsNyArMTc0MCw5IEBACiAJCXJ0NjFwY2lfdG9nZ2xlX3J4KHJ0MngwMGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PTjoKKwljYXNlIFNUQVRFX1JBRElPX0lSUV9PTl9JU1I6CiAJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09GRl9JU1I6CiAJCXJ0NjFwY2lfdG9nZ2xlX2lycShydDJ4MDBkZXYsIHN0YXRlKTsKIAkJYnJlYWs7CiAJY2FzZSBTVEFURV9ERUVQX1NMRUVQOgpAQCAtMTg3NCw2ICsxODgwLDE2IEBACiAJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1I5LCByZWcpOwogCiAJLyoKKwkgKiBXcml0ZSB0aGUgVFggZGVzY3JpcHRvciBmb3IgdGhlIGJlYWNvbi4KKwkgKi8KKwlydDYxcGNpX3dyaXRlX3R4X2Rlc2MocnQyeDAwZGV2LCBlbnRyeS0+c2tiLCB0eGRlc2MpOworCisJLyoKKwkgKiBEdW1wIGJlYWNvbiB0byB1c2Vyc3BhY2UgdGhyb3VnaCBkZWJ1Z2ZzLgorCSAqLworCXJ0MngwMGRlYnVnX2R1bXBfZnJhbWUocnQyeDAwZGV2LCBEVU1QX0ZSQU1FX0JFQUNPTiwgZW50cnktPnNrYik7CisKKwkvKgogCSAqIFdyaXRlIGVudGlyZSBiZWFjb24gd2l0aCBkZXNjcmlwdG9yIHRvIHJlZ2lzdGVyLgogCSAqLwogCWJlYWNvbl9iYXNlID0gSFdfQkVBQ09OX09GRlNFVChlbnRyeS0+ZW50cnlfaWR4KTsKQEAgLTIwMzksMjkgKzIwNTUsMjQgQEAKIAlzdHJ1Y3QgdHhkb25lX2VudHJ5X2Rlc2MgdHhkZXNjOwogCXUzMiB3b3JkOwogCXUzMiByZWc7Ci0JdTMyIG9sZF9yZWc7CiAJaW50IHR5cGU7CiAJaW50IGluZGV4OworCWludCBpOwogCiAJLyoKLQkgKiBEdXJpbmcgZWFjaCBsb29wIHdlIHdpbGwgY29tcGFyZSB0aGUgZnJlc2hseSByZWFkCi0JICogU1RBX0NTUjQgcmVnaXN0ZXIgdmFsdWUgd2l0aCB0aGUgdmFsdWUgcmVhZCBmcm9tCi0JICogdGhlIHByZXZpb3VzIGxvb3AuIElmIHRoZSAyIHZhbHVlcyBhcmUgZXF1YWwgdGhlbgotCSAqIHdlIHNob3VsZCBzdG9wIHByb2Nlc3NpbmcgYmVjYXVzZSB0aGUgY2hhbmNlIGlzCi0JICogcXVpdGUgYmlnIHRoYXQgdGhlIGRldmljZSBoYXMgYmVlbiB1bnBsdWdnZWQgYW5kCi0JICogd2UgcmlzayBnb2luZyBpbnRvIGFuIGVuZGxlc3MgbG9vcC4KKwkgKiBUWF9TVEFfRklGTyBpcyBhIHN0YWNrIG9mIFggZW50cmllcywgaGVuY2UgcmVhZCBUWF9TVEFfRklGTworCSAqIGF0IG1vc3QgWCB0aW1lcyBhbmQgYWxzbyBzdG9wIHByb2Nlc3Npbmcgb25jZSB0aGUgVFhfU1RBX0ZJRk9fVkFMSUQKKwkgKiBmbGFnIGlzIG5vdCBzZXQgYW55bW9yZS4KKwkgKgorCSAqIFRoZSBsZWdhY3kgZHJpdmVycyB1c2UgWD1UWF9SSU5HX1NJWkUgYnV0IHN0YXRlIGluIGEgY29tbWVudAorCSAqIHRoYXQgdGhlIFRYX1NUQV9GSUZPIHN0YWNrIGhhcyBhIHNpemUgb2YgMTYuIFdlIHN0aWNrIHRvIG91cgorCSAqIHR4IHJpbmcgc2l6ZSBmb3Igbm93LgogCSAqLwotCW9sZF9yZWcgPSAwOwotCi0Jd2hpbGUgKDEpIHsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfRU5UUklFUzsgaSsrKSB7CiAJCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgU1RBX0NTUjQsICZyZWcpOwogCQlpZiAoIXJ0MngwMF9nZXRfZmllbGQzMihyZWcsIFNUQV9DU1I0X1ZBTElEKSkKIAkJCWJyZWFrOwogCi0JCWlmIChvbGRfcmVnID09IHJlZykKLQkJCWJyZWFrOwotCQlvbGRfcmVnID0gcmVnOwotCiAJCS8qCiAJCSAqIFNraXAgdGhpcyBlbnRyeSB3aGVuIGl0IGNvbnRhaW5zIGFuIGludmFsaWQKIAkJICogcXVldWUgaWRlbnRpY2F0aW9uIG51bWJlci4KQEAgLTIxMjAsNiArMjEzMSwxMyBAQAogCQl9CiAJCXR4ZGVzYy5yZXRyeSA9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIFNUQV9DU1I0X1JFVFJZX0NPVU5UKTsKIAorCQkvKgorCQkgKiB0aGUgZnJhbWUgd2FzIHJldHJpZWQgYXQgbGVhc3Qgb25jZQorCQkgKiAtPiBodyB1c2VkIGZhbGxiYWNrIHJhdGVzCisJCSAqLworCQlpZiAodHhkZXNjLnJldHJ5KQorCQkJX19zZXRfYml0KFRYRE9ORV9GQUxMQkFDSywgJnR4ZGVzYy5mbGFncyk7CisKIAkJcnQyeDAwbGliX3R4ZG9uZShlbnRyeSwgJnR4ZGVzYyk7CiAJfQogfQpAQCAtMjEzMiwyNyArMjE1MCwxMSBAQAogCXJ0NjFwY2lfY29uZmlnKHJ0MngwMGRldiwgJmxpYmNvbmYsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUyk7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBydDYxcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCitzdGF0aWMgaXJxcmV0dXJuX3QgcnQ2MXBjaV9pbnRlcnJ1cHRfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZGV2X2luc3RhbmNlOwotCXUzMiByZWdfbWN1OwotCXUzMiByZWc7Ci0KLQkvKgotCSAqIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgJiBzYXZlZCB0byBsb2NhbCB2YXJpYWJsZS4KLQkgKiBXcml0ZSByZWdpc3RlciB2YWx1ZSBiYWNrIHRvIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4KLQkgKi8KLQlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIE1DVV9JTlRfU09VUkNFX0NTUiwgJnJlZ19tY3UpOwotCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIE1DVV9JTlRfU09VUkNFX0NTUiwgcmVnX21jdSk7Ci0KLQlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIElOVF9TT1VSQ0VfQ1NSLCAmcmVnKTsKLQlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBJTlRfU09VUkNFX0NTUiwgcmVnKTsKLQotCWlmICghcmVnICYmICFyZWdfbWN1KQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCi0JCXJldHVybiBJUlFfSEFORExFRDsKKwl1MzIgcmVnID0gcnQyeDAwZGV2LT5pcnF2YWx1ZVswXTsKKwl1MzIgcmVnX21jdSA9IHJ0MngwMGRldi0+aXJxdmFsdWVbMV07CiAKIAkvKgogCSAqIEhhbmRsZSBpbnRlcnJ1cHRzLCB3YWxrIHRocm91Z2ggYWxsIGJpdHMKQEAgLTIxODUsOSArMjE4Nyw1MSBAQAogCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnX21jdSwgTUNVX0lOVF9TT1VSQ0VfQ1NSX1RXQUtFVVApKQogCQlydDYxcGNpX3dha2V1cChydDJ4MDBkZXYpOwogCisJLyoKKwkgKiA1IC0gQmVhY29uIGRvbmUgaW50ZXJydXB0LgorCSAqLworCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBJTlRfU09VUkNFX0NTUl9CRUFDT05fRE9ORSkpCisJCXJ0MngwMGxpYl9iZWFjb25kb25lKHJ0MngwMGRldik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhZ2Fpbi4gKi8KKwlydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwKKwkJCQkJICAgICAgU1RBVEVfUkFESU9fSVJRX09OX0lTUik7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBydDYxcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGRldl9pbnN0YW5jZTsKKwl1MzIgcmVnX21jdTsKKwl1MzIgcmVnOworCisJLyoKKwkgKiBHZXQgdGhlIGludGVycnVwdCBzb3VyY2VzICYgc2F2ZWQgdG8gbG9jYWwgdmFyaWFibGUuCisJICogV3JpdGUgcmVnaXN0ZXIgdmFsdWUgYmFjayB0byBjbGVhciBwZW5kaW5nIGludGVycnVwdHMuCisJICovCisJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBNQ1VfSU5UX1NPVVJDRV9DU1IsICZyZWdfbWN1KTsKKwlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBNQ1VfSU5UX1NPVVJDRV9DU1IsIHJlZ19tY3UpOworCisJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBJTlRfU09VUkNFX0NTUiwgJnJlZyk7CisJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgSU5UX1NPVVJDRV9DU1IsIHJlZyk7CisKKwlpZiAoIXJlZyAmJiAhcmVnX21jdSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBTdG9yZSBpcnF2YWx1ZXMgZm9yIHVzZSBpbiB0aGUgaW50ZXJydXB0IHRocmVhZC4gKi8KKwlydDJ4MDBkZXYtPmlycXZhbHVlWzBdID0gcmVnOworCXJ0MngwMGRldi0+aXJxdmFsdWVbMV0gPSByZWdfbWN1OworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCB3aWxsIGJlIGVuYWJsZWQgYWdhaW4gaW4gdGhlIGludGVycnVwdCB0aHJlYWQuICovCisJcnQyeDAwZGV2LT5vcHMtPmxpYi0+c2V0X2RldmljZV9zdGF0ZShydDJ4MDBkZXYsCisJCQkJCSAgICAgIFNUQVRFX1JBRElPX0lSUV9PRkZfSVNSKTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCiAvKgogICogRGV2aWNlIHByb2JlIGZ1bmN0aW9ucy4KICAqLwpAQCAtMjU3Nyw2ICsyNjIxLDE4IEBACiAJCQkJCQkgICBFRVBST01fTUFDX0FERFJfMCkpOwogCiAJLyoKKwkgKiBBcyBydDYxIGhhcyBhIGdsb2JhbCBmYWxsYmFjayB0YWJsZSB3ZSBjYW5ub3Qgc3BlY2lmeQorCSAqIG1vcmUgdGhlbiBvbmUgdHggcmF0ZSBwZXIgZnJhbWUgYnV0IHNpbmNlIHRoZSBodyB3aWxsCisJICogdHJ5IHNldmVyYWwgcmF0ZXMgKGJhc2VkIG9uIHRoZSBmYWxsYmFjayB0YWJsZSkgd2Ugc2hvdWxkCisJICogc3RpbGwgaW5pdGlhbGl6ZSBtYXhfcmF0ZXMgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJhdGVzCisJICogd2UgYXJlIGdvaW5nIHRvIHRyeS4gT3RoZXJ3aXNlIG1hYzgwMjExIHdpbGwgdHJ1bmNhdGUgb3VyCisJICogcmVwb3J0ZWQgdHggcmF0ZXMgYW5kIHRoZSByYyBhbGdvcnRpaG0gd2lsbCBlbmQgdXAgd2l0aAorCSAqIGluY29ycmVjdCBkYXRhLgorCSAqLworCXJ0MngwMGRldi0+aHctPm1heF9yYXRlcyA9IDc7CisJcnQyeDAwZGV2LT5ody0+bWF4X3JhdGVfdHJpZXMgPSAxOworCisJLyoKIAkgKiBJbml0aWFsaXplIGh3X21vZGUgaW5mb3JtYXRpb24uCiAJICovCiAJc3BlYy0+c3VwcG9ydGVkX2JhbmRzID0gU1VQUE9SVF9CQU5EXzJHSFo7CkBAIC0yNjU3LDYgKzI3MTMsNyBAQAogCV9fc2V0X2JpdChEUklWRVJfUkVRVUlSRV9ETUEsICZydDJ4MDBkZXYtPmZsYWdzKTsKIAlpZiAoIW1vZHBhcmFtX25vaHdjcnlwdCkKIAkJX19zZXRfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCV9fc2V0X2JpdChEUklWRVJfU1VQUE9SVF9MSU5LX1RVTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKIAkgKiBTZXQgdGhlIHJzc2kgb2Zmc2V0LgpAQCAtMjc0OCw4ICsyODA1LDkgQEAKIAkucmVtb3ZlX2ludGVyZmFjZQk9IHJ0MngwMG1hY19yZW1vdmVfaW50ZXJmYWNlLAogCS5jb25maWcJCQk9IHJ0MngwMG1hY19jb25maWcsCiAJLmNvbmZpZ3VyZV9maWx0ZXIJPSBydDJ4MDBtYWNfY29uZmlndXJlX2ZpbHRlciwKLQkuc2V0X3RpbQkJPSBydDJ4MDBtYWNfc2V0X3RpbSwKIAkuc2V0X2tleQkJPSBydDJ4MDBtYWNfc2V0X2tleSwKKwkuc3dfc2Nhbl9zdGFydAkJPSBydDJ4MDBtYWNfc3dfc2Nhbl9zdGFydCwKKwkuc3dfc2Nhbl9jb21wbGV0ZQk9IHJ0MngwMG1hY19zd19zY2FuX2NvbXBsZXRlLAogCS5nZXRfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF9zdGF0cywKIAkuYnNzX2luZm9fY2hhbmdlZAk9IHJ0MngwMG1hY19ic3NfaW5mb19jaGFuZ2VkLAogCS5jb25mX3R4CQk9IHJ0NjFwY2lfY29uZl90eCwKQEAgLTI3NTksNiArMjgxNyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnQyeDAwbGliX29wcyBydDYxcGNpX3J0MngwMF9vcHMgPSB7CiAJLmlycV9oYW5kbGVyCQk9IHJ0NjFwY2lfaW50ZXJydXB0LAorCS5pcnFfaGFuZGxlcl90aHJlYWQJPSBydDYxcGNpX2ludGVycnVwdF90aHJlYWQsCiAJLnByb2JlX2h3CQk9IHJ0NjFwY2lfcHJvYmVfaHcsCiAJLmdldF9maXJtd2FyZV9uYW1lCT0gcnQ2MXBjaV9nZXRfZmlybXdhcmVfbmFtZSwKIAkuY2hlY2tfZmlybXdhcmUJCT0gcnQ2MXBjaV9jaGVja19maXJtd2FyZSwKQEAgLTI3NzMsNyArMjgzMiw2IEBACiAJLnJlc2V0X3R1bmVyCQk9IHJ0NjFwY2lfcmVzZXRfdHVuZXIsCiAJLmxpbmtfdHVuZXIJCT0gcnQ2MXBjaV9saW5rX3R1bmVyLAogCS53cml0ZV90eF9kZXNjCQk9IHJ0NjFwY2lfd3JpdGVfdHhfZGVzYywKLQkud3JpdGVfdHhfZGF0YQkJPSBydDJ4MDBwY2lfd3JpdGVfdHhfZGF0YSwKIAkud3JpdGVfYmVhY29uCQk9IHJ0NjFwY2lfd3JpdGVfYmVhY29uLAogCS5raWNrX3R4X3F1ZXVlCQk9IHJ0NjFwY2lfa2lja190eF9xdWV1ZSwKIAkua2lsbF90eF9xdWV1ZQkJPSBydDYxcGNpX2tpbGxfdHhfcXVldWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuaAppbmRleCBkZjgwZjFhLi5lMmU3MjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmgKQEAgLTE1MywxMyArMTUzLDEzIEBACiAJdTgga2V5WzE2XTsKIAl1OCB0eF9taWNbOF07CiAJdTggcnhfbWljWzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaHdfcGFpcndpc2VfdGFfZW50cnkgewogCXU4IGFkZHJlc3NbNl07CiAJdTggY2lwaGVyOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogT3RoZXIgb24tY2hpcCBzaGFyZWQgbWVtb3J5IHNwYWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKaW5kZXggNmUwZDgyZS4uYWE5ZGUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCkBAIC0yNzAsNyArMjcwLDYgQEAKIHsKIAlzdHJ1Y3QgaHdfa2V5X2VudHJ5IGtleV9lbnRyeTsKIAlzdHJ1Y3QgcnQyeDAwX2ZpZWxkMzIgZmllbGQ7Ci0JaW50IHRpbWVvdXQ7CiAJdTMyIG1hc2s7CiAJdTMyIHJlZzsKIApAQCAtMzA2LDEyICszMDUsOCBAQAogCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS5yeF9taWMpKTsKIAogCQlyZWcgPSBTSEFSRURfS0VZX0VOVFJZKGtleS0+aHdfa2V5X2lkeCk7Ci0JCXRpbWVvdXQgPSBSRUdJU1RFUl9USU1FT1VUMzIoc2l6ZW9mKGtleV9lbnRyeSkpOwotCQlydDJ4MDB1c2JfdmVuZG9yX3JlcXVlc3RfbGFyZ2VfYnVmZihydDJ4MDBkZXYsIFVTQl9NVUxUSV9XUklURSwKLQkJCQkJCSAgICBVU0JfVkVORE9SX1JFUVVFU1RfT1VULCByZWcsCi0JCQkJCQkgICAgJmtleV9lbnRyeSwKLQkJCQkJCSAgICBzaXplb2Yoa2V5X2VudHJ5KSwKLQkJCQkJCSAgICB0aW1lb3V0KTsKKwkJcnQyeDAwdXNiX3JlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCByZWcsCisJCQkJCSAgICAgICZrZXlfZW50cnksIHNpemVvZihrZXlfZW50cnkpKTsKIAogCQkvKgogCQkgKiBUaGUgY2lwaGVyIHR5cGVzIGFyZSBzdG9yZWQgb3ZlciAyIHJlZ2lzdGVycy4KQEAgLTM3Miw3ICszNjcsNiBAQAogewogCXN0cnVjdCBod19wYWlyd2lzZV90YV9lbnRyeSBhZGRyX2VudHJ5OwogCXN0cnVjdCBod19rZXlfZW50cnkga2V5X2VudHJ5OwotCWludCB0aW1lb3V0OwogCXUzMiBtYXNrOwogCXUzMiByZWc7CiAKQEAgLTQwNywxNyArNDAxLDExIEBACiAJCSAgICAgICBzaXplb2Yoa2V5X2VudHJ5LnJ4X21pYykpOwogCiAJCXJlZyA9IFBBSVJXSVNFX0tFWV9FTlRSWShrZXktPmh3X2tleV9pZHgpOwotCQl0aW1lb3V0ID0gUkVHSVNURVJfVElNRU9VVDMyKHNpemVvZihrZXlfZW50cnkpKTsKLQkJcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYocnQyeDAwZGV2LCBVU0JfTVVMVElfV1JJVEUsCi0JCQkJCQkgICAgVVNCX1ZFTkRPUl9SRVFVRVNUX09VVCwgcmVnLAotCQkJCQkJICAgICZrZXlfZW50cnksCi0JCQkJCQkgICAgc2l6ZW9mKGtleV9lbnRyeSksCi0JCQkJCQkgICAgdGltZW91dCk7CisJCXJ0MngwMHVzYl9yZWdpc3Rlcl9tdWx0aXdyaXRlKHJ0MngwMGRldiwgcmVnLAorCQkJCQkgICAgICAma2V5X2VudHJ5LCBzaXplb2Yoa2V5X2VudHJ5KSk7CiAKIAkJLyoKIAkJICogU2VuZCB0aGUgYWRkcmVzcyBhbmQgY2lwaGVyIHR5cGUgdG8gdGhlIGhhcmR3YXJlIHJlZ2lzdGVyLgotCQkgKiBUaGlzIGRhdGEgZml0cyB3aXRoaW4gdGhlIENTUiBjYWNoZSBzaXplLCBzbyB3ZSBjYW4gdXNlCi0JCSAqIHJ0MngwMHVzYl9yZWdpc3Rlcl9tdWx0aXdyaXRlKCkgZGlyZWN0bHkuCiAJCSAqLwogCQltZW1zZXQoJmFkZHJfZW50cnksIDAsIHNpemVvZihhZGRyX2VudHJ5KSk7CiAJCW1lbWNweSgmYWRkcl9lbnRyeSwgY3J5cHRvLT5hZGRyZXNzLCBFVEhfQUxFTik7CkBAIC04MjgsNiArODE2LDkgQEAKIAl1MzIgcmVnOwogCiAJcnQyeDAwdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBUWFJYX0NTUjQsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjRfT0ZETV9UWF9SQVRFX0RPV04sIDEpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjRfT0ZETV9UWF9SQVRFX1NURVAsIDApOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjRfT0ZETV9UWF9GQUxMQkFDS19DQ0ssIDApOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBUWFJYX0NTUjRfTE9OR19SRVRSWV9MSU1JVCwKIAkJCSAgIGxpYmNvbmYtPmNvbmYtPmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhSWF9DU1I0X1NIT1JUX1JFVFJZX0xJTUlULApAQCAtMTA5MiwxMSArMTA4Myw3IEBACiAJLyoKIAkgKiBXcml0ZSBmaXJtd2FyZSB0byBkZXZpY2UuCiAJICovCi0JcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYocnQyeDAwZGV2LCBVU0JfTVVMVElfV1JJVEUsCi0JCQkJCSAgICBVU0JfVkVORE9SX1JFUVVFU1RfT1VULAotCQkJCQkgICAgRklSTVdBUkVfSU1BR0VfQkFTRSwKLQkJCQkJICAgIGRhdGEsIGxlbiwKLQkJCQkJICAgIFJFR0lTVEVSX1RJTUVPVVQzMihsZW4pKTsKKwlydDJ4MDB1c2JfcmVnaXN0ZXJfbXVsdGl3cml0ZShydDJ4MDBkZXYsIEZJUk1XQVJFX0lNQUdFX0JBU0UsIGRhdGEsIGxlbik7CiAKIAkvKgogCSAqIFNlbmQgZmlybXdhcmUgcmVxdWVzdCB0byBkZXZpY2UgdG8gbG9hZCBmaXJtd2FyZSwKQEAgLTE0MTMsNyArMTQwMCw5IEBACiAJCXJ0NzN1c2JfdG9nZ2xlX3J4KHJ0MngwMGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX1JBRElPX0lSUV9PTjoKKwljYXNlIFNUQVRFX1JBRElPX0lSUV9PTl9JU1I6CiAJY2FzZSBTVEFURV9SQURJT19JUlFfT0ZGOgorCWNhc2UgU1RBVEVfUkFESU9fSVJRX09GRl9JU1I6CiAJCS8qIE5vIHN1cHBvcnQsIGJ1dCBubyBlcnJvciBlaXRoZXIgKi8KIAkJYnJlYWs7CiAJY2FzZSBTVEFURV9ERUVQX1NMRUVQOgpAQCAtMTQ0Miw3ICsxNDMxLDcgQEAKIAkJCQkgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKIHsKIAlzdHJ1Y3Qgc2tiX2ZyYW1lX2Rlc2MgKnNrYmRlc2MgPSBnZXRfc2tiX2ZyYW1lX2Rlc2Moc2tiKTsKLQlfX2xlMzIgKnR4ZCA9IChfX2xlMzIgKikoc2tiLT5kYXRhIC0gVFhEX0RFU0NfU0laRSk7CisJX19sZTMyICp0eGQgPSAoX19sZTMyICopIHNrYi0+ZGF0YTsKIAl1MzIgd29yZDsKIAogCS8qCkBAIC0xNTA1LDYgKzE0OTQsNyBAQAogCS8qCiAJICogUmVnaXN0ZXIgZGVzY3JpcHRvciBkZXRhaWxzIGluIHNrYiBmcmFtZSBkZXNjcmlwdG9yLgogCSAqLworCXNrYmRlc2MtPmZsYWdzIHw9IFNLQkRFU0NfREVTQ19JTl9TS0I7CiAJc2tiZGVzYy0+ZGVzYyA9IHR4ZDsKIAlza2JkZXNjLT5kZXNjX2xlbiA9IFRYRF9ERVNDX1NJWkU7CiB9CkBAIC0xNTI4LDE4ICsxNTE4LDI3IEBACiAJcnQyeDAwdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1I5LCByZWcpOwogCiAJLyoKLQkgKiBUYWtlIHRoZSBkZXNjcmlwdG9yIGluIGZyb250IG9mIHRoZSBza2IgaW50byBhY2NvdW50LgorCSAqIEFkZCBzcGFjZSBmb3IgdGhlIGRlc2NyaXB0b3IgaW4gZnJvbnQgb2YgdGhlIHNrYi4KIAkgKi8KIAlza2JfcHVzaChlbnRyeS0+c2tiLCBUWERfREVTQ19TSVpFKTsKKwltZW1zZXQoZW50cnktPnNrYi0+ZGF0YSwgMCwgVFhEX0RFU0NfU0laRSk7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBUWCBkZXNjcmlwdG9yIGZvciB0aGUgYmVhY29uLgorCSAqLworCXJ0NzN1c2Jfd3JpdGVfdHhfZGVzYyhydDJ4MDBkZXYsIGVudHJ5LT5za2IsIHR4ZGVzYyk7CisKKwkvKgorCSAqIER1bXAgYmVhY29uIHRvIHVzZXJzcGFjZSB0aHJvdWdoIGRlYnVnZnMuCisJICovCisJcnQyeDAwZGVidWdfZHVtcF9mcmFtZShydDJ4MDBkZXYsIERVTVBfRlJBTUVfQkVBQ09OLCBlbnRyeS0+c2tiKTsKIAogCS8qCiAJICogV3JpdGUgZW50aXJlIGJlYWNvbiB3aXRoIGRlc2NyaXB0b3IgdG8gcmVnaXN0ZXIuCiAJICovCiAJYmVhY29uX2Jhc2UgPSBIV19CRUFDT05fT0ZGU0VUKGVudHJ5LT5lbnRyeV9pZHgpOwotCXJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9sYXJnZV9idWZmKHJ0MngwMGRldiwgVVNCX01VTFRJX1dSSVRFLAotCQkJCQkgICAgVVNCX1ZFTkRPUl9SRVFVRVNUX09VVCwgYmVhY29uX2Jhc2UsCi0JCQkJCSAgICBlbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5sZW4sCi0JCQkJCSAgICBSRUdJU1RFUl9USU1FT1VUMzIoZW50cnktPnNrYi0+bGVuKSk7CisJcnQyeDAwdXNiX3JlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCBiZWFjb25fYmFzZSwKKwkJCQkgICAgICBlbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5sZW4pOwogCiAJLyoKIAkgKiBFbmFibGUgYmVhY29uaW5nIGFnYWluLgpAQCAtMjEzOCw2ICsyMTM3LDggQEAKIAlfX3NldF9iaXQoRFJJVkVSX1JFUVVJUkVfRklSTVdBUkUsICZydDJ4MDBkZXYtPmZsYWdzKTsKIAlpZiAoIW1vZHBhcmFtX25vaHdjcnlwdCkKIAkJX19zZXRfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCV9fc2V0X2JpdChEUklWRVJfU1VQUE9SVF9MSU5LX1RVTklORywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCV9fc2V0X2JpdChEUklWRVJfU1VQUE9SVF9XQVRDSERPRywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKIAkgKiBTZXQgdGhlIHJzc2kgb2Zmc2V0LgpAQCAtMjIzMSw2ICsyMjMyLDggQEAKIAkuY29uZmlndXJlX2ZpbHRlcgk9IHJ0MngwMG1hY19jb25maWd1cmVfZmlsdGVyLAogCS5zZXRfdGltCQk9IHJ0MngwMG1hY19zZXRfdGltLAogCS5zZXRfa2V5CQk9IHJ0MngwMG1hY19zZXRfa2V5LAorCS5zd19zY2FuX3N0YXJ0CQk9IHJ0MngwMG1hY19zd19zY2FuX3N0YXJ0LAorCS5zd19zY2FuX2NvbXBsZXRlCT0gcnQyeDAwbWFjX3N3X3NjYW5fY29tcGxldGUsCiAJLmdldF9zdGF0cwkJPSBydDJ4MDBtYWNfZ2V0X3N0YXRzLAogCS5ic3NfaW5mb19jaGFuZ2VkCT0gcnQyeDAwbWFjX2Jzc19pbmZvX2NoYW5nZWQsCiAJLmNvbmZfdHgJCT0gcnQ3M3VzYl9jb25mX3R4LApAQCAtMjI1MSw4ICsyMjU0LDggQEAKIAkubGlua19zdGF0cwkJPSBydDczdXNiX2xpbmtfc3RhdHMsCiAJLnJlc2V0X3R1bmVyCQk9IHJ0NzN1c2JfcmVzZXRfdHVuZXIsCiAJLmxpbmtfdHVuZXIJCT0gcnQ3M3VzYl9saW5rX3R1bmVyLAorCS53YXRjaGRvZwkJPSBydDJ4MDB1c2Jfd2F0Y2hkb2csCiAJLndyaXRlX3R4X2Rlc2MJCT0gcnQ3M3VzYl93cml0ZV90eF9kZXNjLAotCS53cml0ZV90eF9kYXRhCQk9IHJ0MngwMHVzYl93cml0ZV90eF9kYXRhLAogCS53cml0ZV9iZWFjb24JCT0gcnQ3M3VzYl93cml0ZV9iZWFjb24sCiAJLmdldF90eF9kYXRhX2xlbgk9IHJ0NzN1c2JfZ2V0X3R4X2RhdGFfbGVuLAogCS5raWNrX3R4X3F1ZXVlCQk9IHJ0MngwMHVzYl9raWNrX3R4X3F1ZXVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmgKaW5kZXggN2FiZTdlYi4uNDRkNWIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5oCkBAIC0xMDgsMTMgKzEwOCwxMyBAQAogCXU4IGtleVsxNl07CiAJdTggdHhfbWljWzhdOwogCXU4IHJ4X21pY1s4XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGh3X3BhaXJ3aXNlX3RhX2VudHJ5IHsKIAl1OCBhZGRyZXNzWzZdOwogCXU4IGNpcGhlcjsKIAl1OCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFNpbmNlIE5VTEwgZnJhbWUgd29uJ3QgYmUgdGhhdCBsb25nICgyNTYgYnl0ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC5oCmluZGV4IDRiYWYwY2YuLjMwNTIzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC5oCkBAIC0zNiw3ICszNiw3IEBACiAJdTggYWdjOwogCXU4IGZsYWdzMjsKIAl1MzIgcmVzZXJ2ZWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBydGw4MTgwX3J4X2Rlc2MgewogCV9fbGUzMiBmbGFnczsKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJX19sZTMyIHJ4X2J1ZjsKIAkJX19sZTY0IHRzZnQ7CiAJfTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJ0bDgxODBfdHhfcmluZyB7CiAJc3RydWN0IHJ0bDgxODBfdHhfZGVzYyAqZGVzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9kZXYuYwppbmRleCA1MTU4MTdkLi4xZDgxNzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX2Rldi5jCkBAIC0xMDMsNiArMTAzLDcgQEAKIHsKIAlzdHJ1Y3QgcnRsODE4MF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDMyOworCXU4IHNpZ25hbCwgYWdjLCBzcTsKIAogCXdoaWxlIChjb3VudC0tKSB7CiAJCXN0cnVjdCBydGw4MTgwX3J4X2Rlc2MgKmVudHJ5ID0gJnByaXYtPnJ4X3JpbmdbcHJpdi0+cnhfaWR4XTsKQEAgLTEzMCwxMCArMTMxLDE4IEBACiAJCQlza2JfcHV0KHNrYiwgZmxhZ3MgJiAweEZGRik7CiAKIAkJCXJ4X3N0YXR1cy5hbnRlbm5hID0gKGZsYWdzMiA+PiAxNSkgJiAxOwotCQkJLyogVE9ETzogaW1wcm92ZSBzaWduYWwvcnNzaSByZXBvcnRpbmcgKi8KLQkJCXJ4X3N0YXR1cy5zaWduYWwgPSAoZmxhZ3MyID4+IDgpICYgMHg3RjsKLQkJCS8qIFhYWDogaXMgdGhpcyBjb3JyZWN0PyAqLwogCQkJcnhfc3RhdHVzLnJhdGVfaWR4ID0gKGZsYWdzID4+IDIwKSAmIDB4RjsKKwkJCWFnYyA9IChmbGFnczIgPj4gMTcpICYgMHg3RjsKKwkJCWlmIChwcml2LT5yODE4NSkgeworCQkJCWlmIChyeF9zdGF0dXMucmF0ZV9pZHggPiAzKQorCQkJCQlzaWduYWwgPSA5MCAtIGNsYW1wX3QodTgsIGFnYywgMjUsIDkwKTsKKwkJCQllbHNlCisJCQkJCXNpZ25hbCA9IDk1IC0gY2xhbXBfdCh1OCwgYWdjLCAzMCwgOTUpOworCQkJfSBlbHNlIHsKKwkJCQlzcSA9IGZsYWdzMiAmIDB4ZmY7CisJCQkJc2lnbmFsID0gcHJpdi0+cmYtPmNhbGNfcnNzaShhZ2MsIHNxKTsKKwkJCX0KKwkJCXJ4X3N0YXR1cy5zaWduYWwgPSBzaWduYWw7CiAJCQlyeF9zdGF0dXMuZnJlcSA9IGRldi0+Y29uZi5jaGFubmVsLT5jZW50ZXJfZnJlcTsKIAkJCXJ4X3N0YXR1cy5iYW5kID0gZGV2LT5jb25mLmNoYW5uZWwtPmJhbmQ7CiAJCQlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KGVudHJ5LT50c2Z0KTsKQEAgLTM1Miw3ICszNjEsNyBAQAogCiAJLyogY2hlY2sgc3VjY2VzcyBvZiByZXNldCAqLwogCWlmIChydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+Q01EKSAmIFJUTDgxOFhfQ01EX1JFU0VUKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlc2V0IHRpbWVvdXQhXG4iLCB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJyZXNldCB0aW1lb3V0IVxuIik7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIApAQCAtNDM2LDggKzQ0NSw3IEBACiAJCQkJCSAgICAgJnByaXYtPnJ4X3JpbmdfZG1hKTsKIAogCWlmICghcHJpdi0+cnhfcmluZyB8fCAodW5zaWduZWQgbG9uZylwcml2LT5yeF9yaW5nICYgMHhGRikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgUlggcmluZ1xuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQl3aXBoeV9lcnIoZGV2LT53aXBoeSwgImNhbm5vdCBhbGxvY2F0ZSByeCByaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00OTQsOCArNTAyLDggQEAKIAogCXJpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wZGV2LCBzaXplb2YoKnJpbmcpICogZW50cmllcywgJmRtYSk7CiAJaWYgKCFyaW5nIHx8ICh1bnNpZ25lZCBsb25nKXJpbmcgJiAweEZGKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBhbGxvY2F0ZSBUWCByaW5nIChwcmlvID0gJWQpXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwgcHJpbyk7CisJCXdpcGh5X2VycihkZXYtPndpcGh5LCAiY2Fubm90IGFsbG9jYXRlIHR4IHJpbmcgKHByaW8gPSAlZClcbiIsCisJCQkgIHByaW8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU2MCw4ICs1NjgsNyBAQAogCXJldCA9IHJlcXVlc3RfaXJxKHByaXYtPnBkZXYtPmlycSwgcnRsODE4MF9pbnRlcnJ1cHQsCiAJCQkgIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBJUlEgaGFuZGxlclxuIiwKLQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQl3aXBoeV9lcnIoZGV2LT53aXBoeSwgImZhaWxlZCB0byByZWdpc3RlciBpcnEgaGFuZGxlclxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfcmluZ3M7CiAJfQogCkBAIC02NzEsNyArNjc4LDcgQEAKIAkgICAgICAgKHU2NCkocnRsODE4eF9pb3JlYWQzMihwcml2LCAmcHJpdi0+bWFwLT5UU0ZUWzFdKSkgPDwgMzI7CiB9CiAKLXZvaWQgcnRsODE4MF9iZWFjb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBydGw4MTgwX2JlYWNvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcnRsODE4MF92aWYgKnZpZl9wcml2ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGw4MTgwX3ZpZiwgYmVhY29uX3dvcmsud29yayk7CkBAIC0xMDk4LDkgKzExMDUsOCBAQAogCQlnb3RvIGVycl9pb3VubWFwOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBod2FkZHIgJXBNLCAlcyArICVzXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBtYWNfYWRkciwKLQkgICAgICAgY2hpcF9uYW1lLCBwcml2LT5yZi0+bmFtZSk7CisJd2lwaHlfaW5mbyhkZXYtPndpcGh5LCAiaHdhZGRyICVwbSwgJXMgKyAlc1xuIiwKKwkJICAgbWFjX2FkZHIsIGNoaXBfbmFtZSwgcHJpdi0+cmYtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9ncmY1MTAxLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfZ3JmNTEwMS5jCmluZGV4IDk0N2VlNTUuLjVjYWI5ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9ncmY1MTAxLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX2dyZjUxMDEuYwpAQCAtNjksNiArNjksMTUgQEAKIAlydGw4MTgwX3dyaXRlX3BoeShkZXYsIDB4MTAsIGFudCk7CiB9CiAKK3N0YXRpYyB1OCBncmY1MTAxX3JmX2NhbGNfcnNzaSh1OCBhZ2MsIHU4IHNxKQoreworCWlmIChhZ2MgPiA2MCkKKwkJcmV0dXJuIDY1OworCisJLyogVE9ETyg/KToganVzdCByZXR1cm4gYWdjIChvciBhZ2MgKyA1KSB0byBhdm9pZCBtdWx0IC8gZGl2ICovCisJcmV0dXJuIDY1ICogYWdjIC8gNjA7Cit9CisKIHN0YXRpYyB2b2lkIGdyZjUxMDFfcmZfc2V0X2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKIHsKQEAgLTE3Niw1ICsxODUsNiBAQAogCS5uYW1lCQk9ICJHQ1QiLAogCS5pbml0CQk9IGdyZjUxMDFfcmZfaW5pdCwKIAkuc3RvcAkJPSBncmY1MTAxX3JmX3N0b3AsCi0JLnNldF9jaGFuCT0gZ3JmNTEwMV9yZl9zZXRfY2hhbm5lbAorCS5zZXRfY2hhbgk9IGdyZjUxMDFfcmZfc2V0X2NoYW5uZWwsCisJLmNhbGNfcnNzaQk9IGdyZjUxMDFfcmZfY2FsY19yc3NpLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9tYXgyODIwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfbWF4MjgyMC5jCmluZGV4IDZjODI1ZmQuLjE2YzQ2NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9tYXgyODIwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX21heDI4MjAuYwpAQCAtNzQsNiArNzQsMjIgQEAKIAlydGw4MTgwX3dyaXRlX3BoeShkZXYsIDB4MTAsIGFudCk7CiB9CiAKK3N0YXRpYyB1OCBtYXgyODIwX3JmX2NhbGNfcnNzaSh1OCBhZ2MsIHU4IHNxKQoreworCWJvb2wgb2RkOworCisJb2RkID0gISEoYWdjICYgMSk7CisKKwlhZ2MgPj49IDE7CisJaWYgKG9kZCkKKwkJYWdjICs9IDc2OworCWVsc2UKKwkJYWdjICs9IDY2OworCisJLyogVE9ETzogY2hhbmdlIGFkZGVuZHMgYWJvdmUgdG8gYXZvaWQgbXVsdCAvIGRpdiBiZWxvdyAqLworCXJldHVybiA2NSAqIGFnYyAvIDEwMDsKK30KKwogc3RhdGljIHZvaWQgbWF4MjgyMF9yZl9zZXRfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mKQogewpAQCAtMTQ4LDUgKzE2NCw2IEBACiAJLm5hbWUJCT0gIk1heGltIiwKIAkuaW5pdAkJPSBtYXgyODIwX3JmX2luaXQsCiAJLnN0b3AJCT0gbWF4MjgyMF9yZl9zdG9wLAotCS5zZXRfY2hhbgk9IG1heDI4MjBfcmZfc2V0X2NoYW5uZWwKKwkuc2V0X2NoYW4JPSBtYXgyODIwX3JmX3NldF9jaGFubmVsLAorCS5jYWxjX3Jzc2kJPSBtYXgyODIwX3JmX2NhbGNfcnNzaSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfcnRsODIyNS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX3J0bDgyMjUuYwppbmRleCA0ZDJiZTBkLi42OWU0ZDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfcnRsODIyNS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9ydGw4MjI1LmMKQEAgLTUwLDcgKzUwLDEwIEBACiAJdWRlbGF5KDEwKTsKIAogCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgewotCQl1MTYgcmVnID0gcmVnODAgfCAhIShiYW5nZGF0YSAmICgxIDw8IGkpKTsKKwkJdTE2IHJlZyA9IHJlZzgwOworCisJCWlmIChiYW5nZGF0YSAmICgxIDw8IGkpKQorCQkJcmVnIHw9IDE7CiAKIAkJaWYgKGkgJiAxKQogCQkJcnRsODE4eF9pb3dyaXRlMTYocHJpdiwgJnByaXYtPm1hcC0+UkZQaW5zT3V0cHV0LCByZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX3NhMjQwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX3NhMjQwMC5jCmluZGV4IGNlYTRlMGMuLmQwNjRmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9zYTI0MDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfc2EyNDAwLmMKQEAgLTc2LDYgKzc2LDMxIEBACiAKIH0KIAorc3RhdGljIHU4IHNhMjQwMF9yZl9yc3NpX21hcFtdID0geworCTB4NjQsIDB4NjQsIDB4NjMsIDB4NjIsIDB4NjEsIDB4NjAsIDB4NWYsIDB4NWUsCisJMHg1ZCwgMHg1YywgMHg1YiwgMHg1YSwgMHg1NywgMHg1NCwgMHg1MiwgMHg1MCwKKwkweDRlLCAweDRjLCAweDRhLCAweDQ4LCAweDQ2LCAweDQ0LCAweDQxLCAweDNmLAorCTB4M2MsIDB4M2EsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MWMsIDB4MWMsIDB4MWIsCisJMHgxYiwgMHgxYSwgMHgxYSwgMHgxOSwgMHgxOSwgMHgxOCwgMHgxOCwgMHgxNywKKwkweDE3LCAweDE2LCAweDE2LCAweDE1LCAweDE1LCAweDE0LCAweDE0LCAweDEzLAorCTB4MTMsIDB4MTIsIDB4MTIsIDB4MTEsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MGYsCisJMHgwZiwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYiwKKwkweDBiLCAweDBhLCAweDBhLCAweDA5LCAweDA5LCAweDA4LCAweDA4LCAweDA3LAorCTB4MDcsIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsCit9OworCitzdGF0aWMgdTggc2EyNDAwX3JmX2NhbGNfcnNzaSh1OCBhZ2MsIHU4IHNxKQoreworCWlmIChzcSA9PSAweDgwKQorCQlyZXR1cm4gMTsKKworCWlmIChzcSA+IDc4KQorCQlyZXR1cm4gMzI7CisKKwkvKiBUT0RPOiByZWNhbGMgc2EyNDAwX3JmX3Jzc2lfbWFwIHRvIGF2b2lkIG11bHQgLyBkaXYgKi8KKwlyZXR1cm4gNjUgKiBzYTI0MDBfcmZfcnNzaV9tYXBbc3FdIC8gMTAwOworfQorCiBzdGF0aWMgdm9pZCBzYTI0MDBfcmZfc2V0X2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mKQogewpAQCAtMTk4LDUgKzIyMyw2IEBACiAJLm5hbWUJCT0gIlBoaWxpcHMiLAogCS5pbml0CQk9IHNhMjQwMF9yZl9pbml0LAogCS5zdG9wCQk9IHNhMjQwMF9yZl9zdG9wLAotCS5zZXRfY2hhbgk9IHNhMjQwMF9yZl9zZXRfY2hhbm5lbAorCS5zZXRfY2hhbgk9IHNhMjQwMF9yZl9zZXRfY2hhbm5lbCwKKwkuY2FsY19yc3NpCT0gc2EyNDAwX3JmX2NhbGNfcnNzaSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny5oCmluZGV4IDZiYjMyMTEuLjk4ODc4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny5oCkBAIC00Nyw3ICs0Nyw3IEBACiAJdTggYWdjOwogCXU4IHJlc2VydmVkOwogCV9fbGU2NCBtYWNfdGltZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcnRsODE4N2JfcnhfaGRyIHsKIAlfX2xlMzIgZmxhZ3M7CkBAIC01OSw3ICs1OSw3IEBACiAJX19sZTE2IHNucl9sb25nMmVuZDsKIAlzOCBwd2RiX2cxMjsKIAl1OCBmb3Q7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoge3J0bDgxODcscnRsODE4N2J9X3R4X2luZm8gaXMgaW4gc2tiICovCiAKQEAgLTY4LDcgKzY4LDcgQEAKIAlfX2xlMTYgcnRzX2R1cmF0aW9uOwogCV9fbGUxNiBsZW47CiAJX19sZTMyIHJldHJ5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBydGw4MTg3Yl90eF9oZHIgewogCV9fbGUzMiBmbGFnczsKQEAgLTgwLDcgKzgwLDcgQEAKIAlfX2xlMzIgdW51c2VkXzM7CiAJX19sZTMyIHJldHJ5OwogCV9fbGUzMiB1bnVzZWRfNFsyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHsKIAlERVZJQ0VfUlRMODE4NywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19kZXYuYwppbmRleCA4OTFiODQ5Li41NzM4YTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X2Rldi5jCkBAIC01NzMsNyArNTczLDcgQEAKIAl9IHdoaWxlICgtLWkpOwogCiAJaWYgKCFpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0IHRpbWVvdXQhXG4iLCB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJyZXNldCB0aW1lb3V0IVxuIik7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIApAQCAtNTg5LDggKzU4OSw3IEBACiAJfSB3aGlsZSAoLS1pKTsKIAogCWlmICghaSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlZXByb20gcmVzZXQgdGltZW91dCFcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKKwkJd2lwaHlfZXJyKGRldi0+d2lwaHksICJlZXByb20gcmVzZXQgdGltZW91dCFcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKQEAgLTE1MjcsOSArMTUyNiw5IEBACiAJbXV0ZXhfaW5pdCgmcHJpdi0+Y29uZl9tdXRleCk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+Yl90eF9zdGF0dXMucXVldWUpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGh3YWRkciAlcE0sICVzIFYlZCArICVzLCByZmtpbGwgbWFzayAlZFxuIiwKLQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwgbWFjX2FkZHIsCi0JICAgICAgIGNoaXBfbmFtZSwgcHJpdi0+YXNpY19yZXYsIHByaXYtPnJmLT5uYW1lLCBwcml2LT5yZmtpbGxfbWFzayk7CisJd2lwaHlfaW5mbyhkZXYtPndpcGh5LCAiaHdhZGRyICVwbSwgJXMgdiVkICsgJXMsIHJma2lsbCBtYXNrICVkXG4iLAorCQkgICBtYWNfYWRkciwgY2hpcF9uYW1lLCBwcml2LT5hc2ljX3JldiwgcHJpdi0+cmYtPm5hbWUsCisJCSAgIHByaXYtPnJma2lsbF9tYXNrKTsKIAogI2lmZGVmIENPTkZJR19SVEw4MTg3X0xFRFMKIAllZXByb21fOTNjeDZfcmVhZCgmZWVwcm9tLCAweDNGLCAmcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19ydGw4MjI1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfcnRsODIyNS5jCmluZGV4IGEwOTgxOTMuLmZkOTZmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19ydGw4MjI1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X3J0bDgyMjUuYwpAQCAtMzY2LDggKzM2Niw4IEBACiAJCXJ0bDgyMjVfd3JpdGUoZGV2LCAweDAyLCAweDA0NGQpOwogCQltc2xlZXAoMTAwKTsKIAkJaWYgKCEocnRsODIyNV9yZWFkKGRldiwgNikgJiAoMSA8PCA3KSkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUkYgQ2FsaWJyYXRpb24gRmFpbGVkISAleFxuIiwKLQkJCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCBydGw4MjI1X3JlYWQoZGV2LCA2KSk7CisJCQl3aXBoeV93YXJuKGRldi0+d2lwaHksICJyZiBjYWxpYnJhdGlvbiBmYWlsZWQhICV4XG4iLAorCQkJCSAgIHJ0bDgyMjVfcmVhZChkZXYsIDYpKTsKIAl9CiAKIAlydGw4MjI1X3dyaXRlKGRldiwgMHgwLCAweDEyNyk7CkBAIC03MzUsOCArNzM1LDggQEAKIAkJcnRsODIyNV93cml0ZShkZXYsIDB4MDIsIDB4MDQ0RCk7CiAJCW1zbGVlcCgxMDApOwogCQlpZiAoIShydGw4MjI1X3JlYWQoZGV2LCA2KSAmICgxIDw8IDcpKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSRiBDYWxpYnJhdGlvbiBGYWlsZWQhICV4XG4iLAotCQkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksIHJ0bDgyMjVfcmVhZChkZXYsIDYpKTsKKwkJCXdpcGh5X3dhcm4oZGV2LT53aXBoeSwgInJmIGNhbGlicmF0aW9uIGZhaWxlZCEgJXhcbiIsCisJCQkJICAgcnRsODIyNV9yZWFkKGRldiwgNikpOwogCX0KIAogCW1zbGVlcCgyMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxOHguaAppbmRleCA4NTIyNDkwLi4xNjE1ZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxOHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxOHguaApAQCAtMTg1LDcgKzE4NSw3IEBACiAJdTgJcmVzZXJ2ZWRfMjJbNF07CiAJX19sZTE2CVRBTExZX0NOVDsKIAl1OAlUQUxMWV9TRUw7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJ0bDgxOHhfcmZfb3BzIHsKIAljaGFyICpuYW1lOwpAQCAtMTkzLDYgKzE5Myw3IEBACiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBpZWVlODAyMTFfaHcgKik7CiAJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICosIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqKTsKIAl2b2lkICgqY29uZl9lcnApKHN0cnVjdCBpZWVlODAyMTFfaHcgKiwgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqKTsKKwl1OCAoKmNhbGNfcnNzaSkodTggYWdjLCB1OCBzcSk7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L0tjb25maWcKaW5kZXggMzM3ZmM3Yi4uMmY5ODA1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L0tjb25maWcKQEAgLTQxLDcgKzQxLDcgQEAKIAogY29uZmlnIFdMMTI3MQogCXRyaXN0YXRlICJUSSB3bDEyNzEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFdMMTJYWCAmJiBTUElfTUFTVEVSICYmIEdFTkVSSUNfSEFSRElSUVMKKwlkZXBlbmRzIG9uIFdMMTJYWCAmJiBHRU5FUklDX0hBUkRJUlFTCiAJZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBDUkM3CkBAIC02NSw3ICs2NSw3IEBACiAKIGNvbmZpZyBXTDEyNzFfU0RJTwogCXRyaXN0YXRlICJUSSB3bDEyNzEgU0RJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0wxMjcxICYmIE1NQyAmJiBBUk0KKwlkZXBlbmRzIG9uIFdMMTI3MSAmJiBNTUMKIAktLS1oZWxwLS0tCiAJICBUaGlzIG1vZHVsZSBhZGRzIHN1cHBvcnQgZm9yIHRoZSBTRElPIGludGVyZmFjZSBvZiBhZGFwdGVycyB1c2luZwogCSAgVEkgd2wxMjcxIGNoaXBzZXQuICBTZWxlY3QgdGhpcyBpZiB5b3VyIHBsYXRmb3JtIGlzIHVzaW5nCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvTWFrZWZpbGUKaW5kZXggMjdkZGQyYi4uMDc4YjQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNyBAQAogd2wxMjcxLW9ianMJCT0gd2wxMjcxX21haW4ubyAgd2wxMjcxX2NtZC5vIHdsMTI3MV9pby5vIFwKIAkJCSAgd2wxMjcxX2V2ZW50Lm8gd2wxMjcxX3R4Lm8gIHdsMTI3MV9yeC5vICAgXAogCQkJICB3bDEyNzFfcHMubyAgICB3bDEyNzFfYWN4Lm8gd2wxMjcxX2Jvb3QubyBcCi0JCQkgIHdsMTI3MV9pbml0Lm8gIHdsMTI3MV9kZWJ1Z2ZzLm8KKwkJCSAgd2wxMjcxX2luaXQubyAgd2wxMjcxX2RlYnVnZnMubyB3bDEyNzFfc2Nhbi5vCiAKIHdsMTI3MS0kKENPTkZJR19OTDgwMjExX1RFU1RNT0RFKQkrPSB3bDEyNzFfdGVzdG1vZGUubwogb2JqLSQoQ09ORklHX1dMMTI3MSkJKz0gd2wxMjcxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTEuaAppbmRleCA0ZjVmMDJhLi42Yjk0MmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MS5oCkBAIC0zODEsNiArMzgxLDkgQEAKIAogCXUzMiBjaGlwX2lkOwogCWNoYXIgZndfdmVyWzIxXTsKKworCS8qIE1vc3QgcmVjZW50bHkgcmVwb3J0ZWQgbm9pc2UgaW4gZEJtICovCisJczggbm9pc2U7CiB9OwogCiBpbnQgd2wxMjUxX3BsdF9zdGFydChzdHJ1Y3Qgd2wxMjUxICp3bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX2FjeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9hY3guaAppbmRleCAyNjE2MGM0Li44NDJkZjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX2FjeC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfYWN4LmgKQEAgLTYwLDcgKzYwLDcgQEAKIAkvKiB0aGUgbnVtYmVyIG9mIG1pc3NlZCBzZXF1ZW5jZSBudW1iZXJzIGluIHRoZSBzcXVlbnRpYWxseSAqLwogCS8qIHZhbHVlcyBvZiBmcmFtZXMgc2VxIG51bWJlcnMgKi8KIAl1MzIgc2VxX251bV9taXNzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3JldmlzaW9uIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC04OSw3ICs4OSw3IEBACiAJICogYml0cyAyNCAtIDMxOiBDaGlwIElEIC0gVGhlIFdpTGluayBjaGlwIElELgogCSAqLwogCXUzMiBod192ZXJzaW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHdsMTI1MV9wc21fbW9kZSB7CiAJLyogQWN0aXZlIG1vZGUgKi8KQEAgLTExMSw3ICsxMTEsNyBAQAogCS8qIDIgLSBFTFAgbW9kZTogRGVlcCAvIE1heCBzbGVlcCovCiAJdTggIHNsZWVwX2F1dGg7CiAJdTggIHBhZGRpbmdbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewogCUhPU1RJRl9QQ0lfTUFTVEVSX0hPU1RfSU5ESVJFQ1QsCkBAIC0xNTksNyArMTU5LDcgQEAKIAkgKiBjb21wbGV0ZSByaW5nIHVudGlsIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQuCiAJICovCiAJdTMyIHR4X2NvbXBsZXRlX3RpbWVvdXQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogc3RydWN0IGFjeF9kYXRhX3BhdGhfcGFyYW1zX3Jlc3AgewpAQCAtMTgwLDcgKzE4MCw3IEBACiAJdTMyIHR4X2NvbnRyb2xfYWRkcjsKIAogCXUzMiB0eF9jb21wbGV0ZV9hZGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFRYX01TRFVfTElGRVRJTUVfTUlOICAgICAgIDAKICNkZWZpbmUgVFhfTVNEVV9MSUZFVElNRV9NQVggICAgICAgMzAwMApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJICogZmlybXdhcmUgZGlzY2FyZHMgdGhlIE1TRFUuCiAJICovCiAJdTMyIGxpZmV0aW1lOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogUlggQ29uZmlnIE9wdGlvbnMgVGFibGUKQEAgLTI4NSw3ICsyODUsNyBAQAogCiAJdTMyIGNvbmZpZ19vcHRpb25zOwogCXUzMiBmaWx0ZXJfb3B0aW9uczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSB7CiAJUU9TX0FDX0JFID0gMCwKQEAgLTMyNSwxMyArMzI1LDEzIEBACiAKIAkvKiBMb3dlc3QgbWVtb3J5IGJsb2NrcyBndWFyYW50ZWVkIGZvciB0aGlzIHF1ZXVlICovCiAJdTE2IGxvd190aHJlc2hvbGQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfcGFja2V0X2RldGVjdGlvbiB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCiAJdTMyIHRocmVzaG9sZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBlbnVtIGFjeF9zbG90X3R5cGUgewpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJdTggd29uZV9pbmRleDsgLyogUmVzZXJ2ZWQgKi8KIAl1OCBzbG90X3RpbWU7CiAJdTggcmVzZXJ2ZWRbNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogI2RlZmluZSBBRERSRVNTX0dST1VQX01BWAkoOCkKQEAgLTM2Miw3ICszNjIsNyBAQAogCXU4IG51bV9ncm91cHM7CiAJdTggcGFkWzJdOwogCXU4IG1hY190YWJsZVtBRERSRVNTX0dST1VQX01BWF9MRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKICNkZWZpbmUgIFJYX1RJTUVPVVRfUFNfUE9MTF9NSU4gICAgMApAQCAtMzg4LDcgKzM4OCw3IEBACiAJICogZnJvbSBhbiBVUFNEIGVuYWJsZWQgcXVldWUuCiAJICovCiAJdTE2IHVwc2RfdGltZW91dDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBSVFNfVEhSRVNIT0xEX01JTiAgICAgICAgICAgICAgMAogI2RlZmluZSBSVFNfVEhSRVNIT0xEX01BWCAgICAgICAgICAgICAgNDA5NgpAQCAtMzk5LDcgKzM5OSw3IEBACiAKIAl1MTYgdGhyZXNob2xkOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9iZWFjb25fZmlsdGVyX29wdGlvbiB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtNDE1LDcgKzQxNSw3IEBACiAJICovCiAJdTggbWF4X251bV9iZWFjb25zOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIEFDWEJlYWNvbkZpbHRlckVudHJ5IChub3QgMjIxKQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJdTggbnVtX2llOwogCXU4IHRhYmxlW0JFQUNPTl9GSUxURVJfVEFCTEVfTUFYX1NJWkVdOwogCXU4IHBhZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTWU5DSF9GQUlMX0RFRkFVTFRfVEhSRVNIT0xEICAgIDEwICAgICAvKiBudW1iZXIgb2YgYmVhY29ucyAqLwogI2RlZmluZSBOT19CRUFDT05fREVGQVVMVF9USU1FT1VUICAgICAgICg1MDApIC8qIGluIG1pY3Jvc2Vjb25kcyAqLwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJICovCiAJdTggZW5hYmxlOwogCXU4IHBhZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBQVEFfQU5URU5OQV9UWVBFX0RFRgkJICAoMCkKICNkZWZpbmUgUFRBX0JUX0hQX01BWFRJTUVfREVGCQkgICgyMDAwKQpAQCAtNjQ4LDcgKzY0OCw3IEBACiAKIAkvKiByYW5nZTogMCAtIDIwICBkZWZhdWx0OiAxICovCiAJdTggYnRfaHBfcmVzcGVjdGVkX251bTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBDQ0FfVEhSU0hfRU5BQkxFX0VORVJHWV9EICAgICAgIDB4MTQwQQogI2RlZmluZSBDQ0FfVEhSU0hfRElTQUJMRV9FTkVSR1lfRCAgICAgIDB4RkZFRgpAQCAtNjYwLDcgKzY2MCw3IEBACiAJdTE2IHJ4X2NjYV90aHJlc2hvbGQ7CiAJdTggdHhfZW5lcmd5X2RldGVjdGlvbjsKIAl1OCBwYWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgQkNOX1JYX1RJTUVPVVRfREVGX1ZBTFVFICAgICAgICAxMDAwMAogI2RlZmluZSBCUk9BRENBU1RfUlhfVElNRU9VVF9ERUZfVkFMVUUgIDIwMDAwCkBAIC02NzksMTQgKzY3OSwxNCBAQAogCS8qIENvbnNlY3V0aXZlIFBTIFBvbGwgZmFpbHVyZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBob3N0ICovCiAJdTggcHNfcG9sbF90aHJlc2hvbGQ7CiAJdTggcGFkWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2V2ZW50X21hc2sgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKIAogCXUzMiBldmVudF9tYXNrOwogCXUzMiBoaWdoX2V2ZW50X21hc2s7IC8qIFVudXNlZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIENGR19SWF9GQ1MJCUJJVCgyKQogI2RlZmluZSBDRkdfUlhfQUxMX0dPT0QJCUJJVCgzKQpAQCAtNzI5LDcgKzcyOSw3IEBACiAJdTggdHhfY3RybF9mcmFtZV9tb2Q7IC8qIENDS18qIG9yIFBCQ0NfKiAqLwogCXU4IHR4X21ndF9mcmFtZV9yYXRlOwogCXU4IHR4X21ndF9mcmFtZV9tb2Q7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFNUQSBNQUMgKi8KIHN0cnVjdCBhY3hfZG90MTFfc3RhdGlvbl9pZCB7CkBAIC03MzcsMjggKzczNywyOCBAQAogCiAJdTggbWFjW0VUSF9BTEVOXTsKIAl1OCBwYWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfZmVhdHVyZV9jb25maWcgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKIAogCXUzMiBvcHRpb25zOwogCXUzMiBkYXRhX2Zsb3dfb3B0aW9uczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9jdXJyZW50X3R4X3Bvd2VyIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CiAKIAl1OCAgY3VycmVudF90eF9wb3dlcjsKIAl1OCAgcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9kb3QxMV9kZWZhdWx0X2tleSB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCiAJdTggaWQ7CiAJdTggcGFkWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3RzZl9pbmZvIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC03NjksNyArNzY5LDcgQEAKIAl1MzIgbGFzdF9UQlRUX2xzYjsKIAl1OCBsYXN0X2R0aW1fY291bnQ7CiAJdTggcGFkWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIGFjeF93YWtlX3VwX2V2ZW50IHsKIAlXQUtFX1VQX0VWRU5UX0JFQUNPTl9CSVRNQVAJPSAweDAxLCAvKiBXYWtlIG9uIGV2ZXJ5IEJlYWNvbiovCkBAIC03ODUsNyArNzg1LDcgQEAKIAl1OCB3YWtlX3VwX2V2ZW50OyAvKiBPbmx5IG9uZSBiaXQgY2FuIGJlIHNldCAqLwogCXU4IGxpc3Rlbl9pbnRlcnZhbDsKIAl1OCBwYWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfYWlkIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC03OTUsNyArNzk1LDcgQEAKIAkgKi8KIAl1MTYgYWlkOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSBhY3hfcHJlYW1ibGVfdHlwZSB7CiAJQUNYX1BSRUFNQkxFX0xPTkcgPSAwLApAQCAtODExLDcgKzgxMSw3IEBACiAJICovCiAJdTggcHJlYW1ibGU7CiAJdTggcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSBhY3hfY3RzcHJvdGVjdF90eXBlIHsKIAlDVFNQUk9URUNUX0RJU0FCTEUgPSAwLApAQCAtODIyLDExICs4MjIsMTEgQEAKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CiAJdTggY3RzcHJvdGVjdDsKIAl1OCBwYWRkaW5nWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3R4X3N0YXRpc3RpY3MgewogCXUzMiBpbnRlcm5hbF9kZXNjX292ZXJmbG93OwotfSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSAgX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfcnhfc3RhdGlzdGljcyB7CiAJdTMyIG91dF9vZl9tZW07CkBAIC04MzcsMTQgKzgzNywxNCBAQAogCXUzMiB4ZnJfaGludF90cmlnOwogCXUzMiBwYXRoX3Jlc2V0OwogCXUzMiByZXNldF9jb3VudGVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2RtYV9zdGF0aXN0aWNzIHsKIAl1MzIgcnhfcmVxdWVzdGVkOwogCXUzMiByeF9lcnJvcnM7CiAJdTMyIHR4X3JlcXVlc3RlZDsKIAl1MzIgdHhfZXJyb3JzOwotfSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSAgX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfaXNyX3N0YXRpc3RpY3MgewogCS8qIGhvc3QgY29tbWFuZCBjb21wbGV0ZSAqLwpAQCAtOTAzLDcgKzkwMyw3IEBACiAKIAkvKiAoSU5UX1NUU19ORCAmIElOVF9UUklHX0xPV19SU1NJKSAqLwogCXUzMiBsb3dfcnNzaTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF93ZXBfc3RhdGlzdGljcyB7CiAJLyogV0VQIGFkZHJlc3Mga2V5cyBjb25maWd1cmVkICovCkBAIC05MjUsNyArOTI1LDcgQEAKIAogCS8qIFdFUCBkZWNyeXB0IGludGVycnVwdHMgKi8KIAl1MzIgaW50ZXJydXB0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEFDWF9NSVNTRURfQkVBQ09OU19TUFJFQUQgMTAKIApAQCAtOTg1LDEyICs5ODUsMTIgQEAKIAogCS8qIHRoZSBudW1iZXIgb2YgYmVhY29ucyBpbiBhd2FrZSBtb2RlICovCiAJdTMyIHJjdmRfYXdha2VfYmVhY29uczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9taWNfc3RhdGlzdGljcyB7CiAJdTMyIHJ4X3BrdHM7CiAJdTMyIGNhbGNfZmFpbHVyZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9hZXNfc3RhdGlzdGljcyB7CiAJdTMyIGVuY3J5cHRfZmFpbDsKQEAgLTk5OSw3ICs5OTksNyBAQAogCXUzMiBkZWNyeXB0X3BhY2tldHM7CiAJdTMyIGVuY3J5cHRfaW50ZXJydXB0OwogCXUzMiBkZWNyeXB0X2ludGVycnVwdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9ldmVudF9zdGF0aXN0aWNzIHsKIAl1MzIgaGVhcnRfYmVhdDsKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAJdTMyIG9vbV9sYXRlOwogCXUzMiBwaHlfdHJhbnNtaXRfZXJyb3I7CiAJdTMyIHR4X3N0dWNrOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3BzX3N0YXRpc3RpY3MgewogCXUzMiBwc3BvbGxfdGltZW91dHM7CkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogCXUzMiBwc3BvbGxfbWF4X2FwdHVybjsKIAl1MzIgcHNwb2xsX3V0aWxpemF0aW9uOwogCXUzMiB1cHNkX3V0aWxpemF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3J4cGlwZV9zdGF0aXN0aWNzIHsKIAl1MzIgcnhfcHJlcF9iZWFjb25fZHJvcDsKQEAgLTEwMjgsNyArMTAyOCw3IEBACiAJdTMyIGJlYWNvbl9idWZmZXJfdGhyZXNfaG9zdF9pbnRfdHJpZ19yeF9kYXRhOwogCXUzMiBtaXNzZWRfYmVhY29uX2hvc3RfaW50X3RyaWdfcnhfZGF0YTsKIAl1MzIgdHhfeGZyX2hvc3RfaW50X3RyaWdfcnhfZGF0YTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9zdGF0aXN0aWNzIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCXN0cnVjdCBhY3hfZXZlbnRfc3RhdGlzdGljcyBldmVudDsKIAlzdHJ1Y3QgYWN4X3BzX3N0YXRpc3RpY3MgcHM7CiAJc3RydWN0IGFjeF9yeHBpcGVfc3RhdGlzdGljcyByeHBpcGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgQUNYX01BWF9SQVRFX0NMQVNTRVMgICAgICAgOAogI2RlZmluZSBBQ1hfUkFURV9NQVNLX1VOU1BFQ0lGSUVEICAwCkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogCiAJdTMyIHJhdGVfY2xhc3NfY250OwogCXN0cnVjdCBhY3hfcmF0ZV9jbGFzcyByYXRlX2NsYXNzW0FDWF9NQVhfUkFURV9DTEFTU0VTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTI1MV9hY3hfbWVtb3J5IHsKIAlfX2xlMTYgbnVtX3N0YXRpb25zOyAvKiBudW1iZXIgb2YgU1RBcyB0byBiZSBzdXBwb3J0ZWQuICovCkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCXU4IHR4X21pbl9tZW1fYmxvY2tfbnVtOwogCXU4IG51bV9zc2lkX3Byb2ZpbGVzOwogCV9fbGUxNiBkZWJ1Z19idWZmZXJfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAjZGVmaW5lIEFDWF9SWF9ERVNDX01JTiAgICAgICAgICAgICAgICAxCkBAIC0xMDk0LDcgKzEwOTQsNyBAQAogCXU4IHR5cGU7CiAJdTggcHJpb3JpdHk7CiAJX19sZTMyIGRtYV9hZGRyZXNzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEFDWF9UWF9ERVNDX01JTiAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEFDWF9UWF9ERVNDX01BWCAgICAgICAgICAgICAgICAxMjcKQEAgLTExMDMsNyArMTEwMyw3IEBACiAgICAgdTggbnVtX2Rlc2NzOwogICAgIHU4IHBhZFsyXTsKICAgICB1OCBhdHRyaWJ1dGVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1BWF9UWF9RVUVVRV9DT05GSUdTIDUKICNkZWZpbmUgTUFYX1RYX1FVRVVFUyA0CkBAIC0xMTEzLDcgKzExMTMsNyBAQAogCXN0cnVjdCB3bDEyNTFfYWN4X21lbW9yeSBtZW1fY29uZmlnOwogCXN0cnVjdCB3bDEyNTFfYWN4X3J4X3F1ZXVlX2NvbmZpZyByeF9xdWV1ZV9jb25maWc7CiAJc3RydWN0IHdsMTI1MV9hY3hfdHhfcXVldWVfY29uZmlnIHR4X3F1ZXVlX2NvbmZpZ1tNQVhfVFhfUVVFVUVfQ09ORklHU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNTFfYWN4X21lbV9tYXAgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAKIAkvKiBOdW1iZXIgb2YgYmxvY2tzIEZXIGFsbG9jYXRlZCBmb3IgUlggcGFja2V0cyAqLwogCXUzMiBudW1fcnhfbWVtX2Jsb2NrczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBzdHJ1Y3Qgd2wxMjUxX2FjeF93cl90YnR0X2FuZF9kdGltIHsKQEAgLTExNjQsNyArMTE2NCw3IEBACiAJKi8KIAl1OCAgZHRpbTsKIAl1OCAgcGFkZGluZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTI1MV9hY3hfYWNfY2ZnIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC0xMTk0LDcgKzExOTQsNyBAQAogCiAJLyogVGhlIFRYIE9wIExpbWl0IChpbiBtaWNyb3NlY29uZHMpIGZvciB0aGUgYWNjZXNzIGNsYXNzLiAqLwogCXUxNiB0eG9wX2xpbWl0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIGVudW0gd2wxMjUxX2FjeF9jaGFubmVsX3R5cGUgewpAQCAtMTI0NSw3ICsxMjQ1LDcgQEAKIAogCS8qIG5vdCBzdXBwb3J0ZWQgKi8KIAl1MzIgYXBzZGNvbmZbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfYm9vdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9ib290LmMKaW5kZXggMjU0NTEyMy4uNjVlMDQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9ib290LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9ib290LmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogaW50IHdsMTI1MV9ib290X3J1bl9maXJtd2FyZShzdHJ1Y3Qgd2wxMjUxICp3bCkKIHsKIAlpbnQgbG9vcCwgcmV0OwotCXUzMiBjaGlwX2lkLCBpbnRlcnJ1cHQ7CisJdTMyIGNoaXBfaWQsIGFjeF9pbnRyOwogCiAJd2wxMjUxX2Jvb3Rfc2V0X2VjcHVfY3RybCh3bCwgRUNQVV9DT05UUk9MX0hBTFQpOwogCkBAIC0yNDIsMTUgKzI0MiwxNSBAQAogCWxvb3AgPSAwOwogCXdoaWxlIChsb29wKysgPCBJTklUX0xPT1ApIHsKIAkJdWRlbGF5KElOSVRfTE9PUF9ERUxBWSk7Ci0JCWludGVycnVwdCA9IHdsMTI1MV9yZWdfcmVhZDMyKHdsLCBBQ1hfUkVHX0lOVEVSUlVQVF9OT19DTEVBUik7CisJCWFjeF9pbnRyID0gd2wxMjUxX3JlZ19yZWFkMzIod2wsIEFDWF9SRUdfSU5URVJSVVBUX05PX0NMRUFSKTsKIAotCQlpZiAoaW50ZXJydXB0ID09IDB4ZmZmZmZmZmYpIHsKKwkJaWYgKGFjeF9pbnRyID09IDB4ZmZmZmZmZmYpIHsKIAkJCXdsMTI1MV9lcnJvcigiZXJyb3IgcmVhZGluZyBoYXJkd2FyZSBjb21wbGV0ZSAiCiAJCQkJICAgICAiaW5pdCBpbmRpY2F0aW9uIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQkvKiBjaGVjayB0aGF0IEFDWF9JTlRSX0lOSVRfQ09NUExFVEUgaXMgZW5hYmxlZCAqLwotCQllbHNlIGlmIChpbnRlcnJ1cHQgJiBXTDEyNTFfQUNYX0lOVFJfSU5JVF9DT01QTEVURSkgeworCQllbHNlIGlmIChhY3hfaW50ciAmIFdMMTI1MV9BQ1hfSU5UUl9JTklUX0NPTVBMRVRFKSB7CiAJCQl3bDEyNTFfcmVnX3dyaXRlMzIod2wsIEFDWF9SRUdfSU5URVJSVVBUX0FDSywKIAkJCQkJICAgV0wxMjUxX0FDWF9JTlRSX0lOSVRfQ09NUExFVEUpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX2NtZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9jbWQuaAppbmRleCA0YWQ2N2NhLi5hOWU0OTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfY21kLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXUxNiBzdGF0dXM7CiAJLyogcGF5bG9hZCAqLwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCAgd2wxMjUxX2NvbW1hbmQgewogCXN0cnVjdCB3bDEyNTFfY21kX2hlYWRlciBoZWFkZXI7CkBAIC0xNzUsOCArMTc1LDggQEAKICNkZWZpbmUgV0wxMjUxX1NDQU5fTlVNX1BST0JFUyAzCiAKIHN0cnVjdCB3bDEyNTFfc2Nhbl9wYXJhbWV0ZXJzIHsKLQl1MzIgcnhfY29uZmlnX29wdGlvbnM7Ci0JdTMyIHJ4X2ZpbHRlcl9vcHRpb25zOworCV9fbGUzMiByeF9jb25maWdfb3B0aW9uczsKKwlfX2xlMzIgcnhfZmlsdGVyX29wdGlvbnM7CiAKIAkvKgogCSAqIFNjYW4gb3B0aW9uczoKQEAgLTE4Niw3ICsxODYsNyBAQAogCSAqIGJpdCAyOiB2b2ljZSBtb2RlLCAwIGZvciBub3JtYWwgc2Nhbi4KIAkgKiBiaXQgMzogc2NhbiBwcmlvcml0eSwgMSBmb3IgaGlnaCBwcmlvcml0eS4KIAkgKi8KLQl1MTYgc2Nhbl9vcHRpb25zOworCV9fbGUxNiBzY2FuX29wdGlvbnM7CiAKIAkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbiAqLwogCXU4IG51bV9jaGFubmVsczsKQEAgLTE5NSwxNyArMTk1LDE3IEBACiAJdTggbnVtX3Byb2JlX3JlcXVlc3RzOwogCiAJLyogUmF0ZSBhbmQgbW9kdWxhdGlvbiBmb3IgcHJvYmUgcmVxdWVzdHMgKi8KLQl1MTYgdHhfcmF0ZTsKKwlfX2xlMTYgdHhfcmF0ZTsKIAogCXU4IHRpZF90cmlnZ2VyOwogCXU4IHNzaWRfbGVuOwogCXU4IHNzaWRbMzJdOwogCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNTFfc2Nhbl9jaF9wYXJhbWV0ZXJzIHsKLQl1MzIgbWluX2R1cmF0aW9uOyAvKiBpbiBUVSAqLwotCXUzMiBtYXhfZHVyYXRpb247IC8qIGluIFRVICovCisJX19sZTMyIG1pbl9kdXJhdGlvbjsgLyogaW4gVFUgKi8KKwlfX2xlMzIgbWF4X2R1cmF0aW9uOyAvKiBpbiBUVSAqLwogCXUzMiBic3NpZF9sc2I7CiAJdTE2IGJzc2lkX21zYjsKIApAQCAtMjE4LDcgKzIxOCw3IEBACiAJdTggdHhfcG93ZXJfYXR0OwogCXU4IGNoYW5uZWw7CiAJdTggcGFkWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBTQ0FOIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgU0NBTl9NQVhfTlVNX09GX0NIQU5ORUxTIDE2CkBAIC0yMjgsNyArMjI4LDcgQEAKIAogCXN0cnVjdCB3bDEyNTFfc2Nhbl9wYXJhbWV0ZXJzIHBhcmFtczsKIAlzdHJ1Y3Qgd2wxMjUxX3NjYW5fY2hfcGFyYW1ldGVycyBjaGFubmVsc1tTQ0FOX01BWF9OVU1fT0ZfQ0hBTk5FTFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHsKIAlCU1NfVFlQRV9JQlNTID0gMCwKQEAgLTI3NiwxNCArMjc2LDE0IEBACiAJdTggdHhfbWd0X2ZyYW1lX3JhdGU7IC8qIE9CU09MRVRFICovCiAJdTggdHhfbWd0X2ZyYW1lX21vZDsgIC8qIE9CU09MRVRFICovCiAJdTggcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZW5hYmxlZGlzYWJsZV9wYXRoIHsKIAlzdHJ1Y3Qgd2wxMjUxX2NtZF9oZWFkZXIgaGVhZGVyOwogCiAJdTggY2hhbm5lbDsKIAl1OCBwYWRkaW5nWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdMMTI1MV9NQVhfVEVNUExBVEVfU0laRSAzMDAKIApAQCAtMjkyLDcgKzI5Miw3IEBACiAKIAlfX2xlMTYgc2l6ZTsKIAl1OCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFRJTV9FTEVfSUQgICAgNQogI2RlZmluZSBQQVJUSUFMX1ZCTV9NQVggICAgMjUxCkBAIC0zMDQsNyArMzA0LDcgQEAKIAl1OCBkdGltX3BlcmlvZDsKIAl1OCBiaXRtYXBfY3RybDsKIAl1OCBwdmJfZmllbGRbUEFSVElBTF9WQk1fTUFYXTsgLyogUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBWaXJ0dWFsIEJpdCBNYXAgdXBkYXRlICovCiBzdHJ1Y3Qgd2wxMjUxX2NtZF92Ym1fdXBkYXRlIHsKQEAgLTMxMiw3ICszMTIsNyBAQAogCV9fbGUxNiBsZW47CiAJdTggIHBhZGRpbmdbMl07CiAJc3RydWN0IHdsMTI1MV90aW0gdGltOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHdsMTI1MV9jbWRfcHNfbW9kZSB7CiAJU1RBVElPTl9BQ1RJVkVfTU9ERSwKQEAgLTMzMyw3ICszMzMsNyBAQAogCXU4IGhhbmdfb3Zlcl9wZXJpb2Q7CiAJdTE2IG51bGxfZGF0YV9yYXRlOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTI1MV9jbWRfdHJpZ2dlcl9zY2FuX3RvIHsKIAlzdHJ1Y3Qgd2wxMjUxX2NtZF9oZWFkZXIgaGVhZGVyOwpAQCAtNDExLDcgKzQxMSw3IEBACiAJdTgga2V5W01BWF9LRVlfU0laRV07CiAJdTE2IGFjX3NlcV9udW0xNltOVU1fQUNDRVNTX0NBVEVHT1JJRVNfQ09QWV07CiAJdTMyIGFjX3NlcV9udW0zMltOVU1fQUNDRVNTX0NBVEVHT1JJRVNfQ09QWV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogI2VuZGlmIC8qIF9fV0wxMjUxX0NNRF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfZXZlbnQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfZXZlbnQuaAppbmRleCBiZTBhYzU0Li5mNDhhMmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX2V2ZW50LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9ldmVudC5oCkBAIC04Miw3ICs4Miw3IEBACiAJdTMyIHJlcG9ydF8xOwogCXUzMiByZXBvcnRfMjsKIAl1MzIgcmVwb3J0XzM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBldmVudF9tYWlsYm94IHsKIAl1MzIgZXZlbnRzX3ZlY3RvcjsKQEAgLTExMiw3ICsxMTIsNyBAQAogCXN0cnVjdCBldmVudF9kZWJ1Z19yZXBvcnQgcmVwb3J0OwogCXU4IGF2ZXJhZ2Vfc25yX2xldmVsOwogCXU4IHBhZGRpbmdbMTldOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBpbnQgd2wxMjUxX2V2ZW50X3VubWFzayhzdHJ1Y3Qgd2wxMjUxICp3bCk7CiB2b2lkIHdsMTI1MV9ldmVudF9tYm94X2NvbmZpZyhzdHJ1Y3Qgd2wxMjUxICp3bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfbWFpbi5jCmluZGV4IDAwYjI0MjguLjg2MWE1ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfbWFpbi5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAl9CiAKIAl3bC0+bnZzX2xlbiA9IGZ3LT5zaXplOwotCXdsLT5udnMgPSBrbWFsbG9jKHdsLT5udnNfbGVuLCBHRlBfS0VSTkVMKTsKKwl3bC0+bnZzID0ga21lbWR1cChmdy0+ZGF0YSwgd2wtPm52c19sZW4sIEdGUF9LRVJORUwpOwogCiAJaWYgKCF3bC0+bnZzKSB7CiAJCXdsMTI1MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG52cyBmaWxlIik7CkBAIC0xMzIsOCArMTMyLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbWVtY3B5KHdsLT5udnMsIGZ3LT5kYXRhLCB3bC0+bnZzX2xlbik7Ci0KIAlyZXQgPSAwOwogCiBvdXQ6CkBAIC00MTMsNiArNDExLDcgQEAKIHN0YXRpYyBpbnQgd2wxMjUxX29wX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCB3bDEyNTEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGh3LT53aXBoeTsKIAlpbnQgcmV0ID0gMDsKIAogCXdsMTI1MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHN0YXJ0Iik7CkBAIC00NDYsNiArNDQ1LDEwIEBACiAKIAl3bDEyNTFfaW5mbygiZmlybXdhcmUgYm9vdGVkICglcykiLCB3bC0+ZndfdmVyKTsKIAorCS8qIHVwZGF0ZSBody9mdyB2ZXJzaW9uIGluZm8gaW4gd2lwaHkgc3RydWN0ICovCisJd2lwaHktPmh3X3ZlcnNpb24gPSB3bC0+Y2hpcF9pZDsKKwlzdHJuY3B5KHdpcGh5LT5md192ZXJzaW9uLCB3bC0+ZndfdmVyLCBzaXplb2Yod2lwaHktPmZ3X3ZlcnNpb24pKTsKKwogb3V0OgogCWlmIChyZXQgPCAwKQogCQl3bDEyNTFfcG93ZXJfb2ZmKHdsKTsKQEAgLTExNzQsNiArMTE3NywyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgd2wxMjUxX29wX2dldF9zdXJ2ZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBpZHgsCisJCQkJc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpCit7CisJc3RydWN0IHdsMTI1MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CisgCisJaWYgKGlkeCAhPSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKyAKKwlzdXJ2ZXktPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOworCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fTk9JU0VfREJNOworCXN1cnZleS0+bm9pc2UgPSB3bC0+bm9pc2U7CisgCisJcmV0dXJuIDA7Cit9CisKIC8qIGNhbid0IGJlIGNvbnN0LCBtYWM4MDIxMSB3cml0ZXMgdG8gdGhpcyAqLwogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2wxMjUxX2JhbmRfMmdoeiA9IHsKIAkuY2hhbm5lbHMgPSB3bDEyNTFfY2hhbm5lbHMsCkBAIC0xMTk1LDYgKzEyMTQsNyBAQAogCS5ic3NfaW5mb19jaGFuZ2VkID0gd2wxMjUxX29wX2Jzc19pbmZvX2NoYW5nZWQsCiAJLnNldF9ydHNfdGhyZXNob2xkID0gd2wxMjUxX29wX3NldF9ydHNfdGhyZXNob2xkLAogCS5jb25mX3R4ID0gd2wxMjUxX29wX2NvbmZfdHgsCisJLmdldF9zdXJ2ZXkgPSB3bDEyNTFfb3BfZ2V0X3N1cnZleSwKIH07CiAKIHN0YXRpYyBpbnQgd2wxMjUxX3JlYWRfZWVwcm9tX2J5dGUoc3RydWN0IHdsMTI1MSAqd2wsIG9mZl90IG9mZnNldCwgdTggKmRhdGEpCkBAIC0xNDE5LDUgKzE0MzksNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSB3bDEyNTEgV2lyZWxlcyBMQU4gRHJpdmVyIENvcmUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkthbGxlIFZhbG8gPGthbGxlLnZhbG9Abm9raWEuY29tPiIpOwotTU9EVUxFX0FMSUFTKCJzcGk6d2wxMjUxIik7CiBNT0RVTEVfRklSTVdBUkUoV0wxMjUxX0ZXX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9yeC5jCmluZGV4IDg1MTUxNTguLjFiNjI5NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX3J4LmMKQEAgLTc0LDYgKzc0LDEyIEBACiAKIAlzdGF0dXMtPnNpZ25hbCA9IGRlc2MtPnJzc2k7CiAKKwkvKgorCSAqIEZJWE1FOiBndWVzc2luZyB0aGF0IHNuciBuZWVkcyB0byBiZSBkaXZpZGVkIGJ5IHR3bywgb3RoZXJ3aXNlCisJICogdGhlIHZhbHVlcyBkb24ndCBtYWtlIGFueSBzZW5zZQorCSAqLworCXdsLT5ub2lzZSA9IGRlc2MtPnJzc2kgLSBkZXNjLT5zbnIgLyAyOworCiAJc3RhdHVzLT5mcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGRlc2MtPmNoYW5uZWwpOwogCiAJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfVFNGVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfcnguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfcnguaAppbmRleCA1NjNhM2ZkLi5kYTRlNTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX3J4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9yeC5oCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlzOCByc3NpOyAvKiBpbiBkQiAqLwogCXU4IHJjcGk7IC8qIGluIGRCICovCiAJdTggc25yOyAvKiBpbiBkQiAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiB2b2lkIHdsMTI1MV9yeChzdHJ1Y3Qgd2wxMjUxICp3bCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9zZGlvLmMKaW5kZXggYzU2MTMzMi4uYjkwMWI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9zZGlvLmMKQEAgLTM3LDExICszNywxNyBAQAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9USV9XTDEyNTEJMHg5MDY2CiAjZW5kaWYKIAorc3RydWN0IHdsMTI1MV9zZGlvIHsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jOworCXUzMiBlbHBfdmFsOworfTsKKwogc3RhdGljIHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqd2wxMnh4X2JvYXJkX2RhdGE7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Rpb19mdW5jICp3bF90b19mdW5jKHN0cnVjdCB3bDEyNTEgKndsKQogewotCXJldHVybiB3bC0+aWZfcHJpdjsKKwlzdHJ1Y3Qgd2wxMjUxX3NkaW8gKndsX3NkaW8gPSB3bC0+aWZfcHJpdjsKKwlyZXR1cm4gd2xfc2Rpby0+ZnVuYzsKIH0KIAogc3RhdGljIHZvaWQgd2wxMjUxX3NkaW9faW50ZXJydXB0KHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCkBAIC05MCwxMCArOTYsMTcgQEAKIHN0YXRpYyB2b2lkIHdsMTI1MV9zZGlvX3JlYWRfZWxwKHN0cnVjdCB3bDEyNTEgKndsLCBpbnQgYWRkciwgdTMyICp2YWwpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3RvX2Z1bmMod2wpOworCXN0cnVjdCB3bDEyNTFfc2RpbyAqd2xfc2RpbyA9IHdsLT5pZl9wcml2OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF9zZGlvLT5mdW5jOwogCisJLyoKKwkgKiBUaGUgaGFyZHdhcmUgb25seSBzdXBwb3J0cyBSQVcgKHJlYWQgYWZ0ZXIgd3JpdGUpIGFjY2VzcyBmb3IKKwkgKiByZWFkaW5nLCByZWd1bGFyIHNkaW9fcmVhZGIgd29uJ3Qgd29yayBoZXJlIChpdCBpbnRlcnByZXRzCisJICogdGhlIHVudXNlZCBiaXRzIG9mIENNRDUyIGFzIHdyaXRlIGRhdGEgZXZlbiBpZiB3ZSBzZW5kIHJlYWQKKwkgKiByZXF1ZXN0KS4KKwkgKi8KIAlzZGlvX2NsYWltX2hvc3QoZnVuYyk7Ci0JKnZhbCA9IHNkaW9fcmVhZGIoZnVuYywgYWRkciwgJnJldCk7CisJKnZhbCA9IHNkaW9fd3JpdGViX3JlYWRiKGZ1bmMsIHdsX3NkaW8tPmVscF92YWwsIGFkZHIsICZyZXQpOwogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwogCiAJaWYgKHJldCkKQEAgLTEwMyw3ICsxMTYsOCBAQAogc3RhdGljIHZvaWQgd2wxMjUxX3NkaW9fd3JpdGVfZWxwKHN0cnVjdCB3bDEyNTEgKndsLCBpbnQgYWRkciwgdTMyIHZhbCkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gd2xfdG9fZnVuYyh3bCk7CisJc3RydWN0IHdsMTI1MV9zZGlvICp3bF9zZGlvID0gd2wtPmlmX3ByaXY7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3NkaW8tPmZ1bmM7CiAKIAlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CiAJc2Rpb193cml0ZWIoZnVuYywgdmFsLCBhZGRyLCAmcmV0KTsKQEAgLTExMSw2ICsxMjUsOCBAQAogCiAJaWYgKHJldCkKIAkJd2wxMjUxX2Vycm9yKCJzZGlvX3dyaXRlYiBmYWlsZWQgKCVkKSIsIHJldCk7CisJZWxzZQorCQl3bF9zZGlvLT5lbHBfdmFsID0gdmFsOwogfQogCiBzdGF0aWMgdm9pZCB3bDEyNTFfc2Rpb19yZXNldChzdHJ1Y3Qgd2wxMjUxICp3bCkKQEAgLTE5Nyw2ICsyMTMsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHdsMTI1MSAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IHdsMTI1MV9zZGlvICp3bF9zZGlvOwogCiAJaHcgPSB3bDEyNTFfYWxsb2NfaHcoKTsKIAlpZiAoSVNfRVJSKGh3KSkKQEAgLTIwNCw2ICsyMjEsMTIgQEAKIAogCXdsID0gaHctPnByaXY7CiAKKwl3bF9zZGlvID0ga3phbGxvYyhzaXplb2YoKndsX3NkaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAod2xfc2RpbyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfaHc7CisJfQorCiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCXJldCA9IHNkaW9fZW5hYmxlX2Z1bmMoZnVuYyk7CiAJaWYgKHJldCkKQEAgLTIxMyw3ICsyMzYsOCBAQAogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwogCiAJU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZmdW5jLT5kZXYpOwotCXdsLT5pZl9wcml2ID0gZnVuYzsKKwl3bF9zZGlvLT5mdW5jID0gZnVuYzsKKwl3bC0+aWZfcHJpdiA9IHdsX3NkaW87CiAJd2wtPmlmX29wcyA9ICZ3bDEyNTFfc2Rpb19vcHM7CiAJd2wtPnNldF9wb3dlciA9IHdsMTI1MV9zZGlvX3NldF9wb3dlcjsKIApAQCAtMjU5LDYgKzI4Myw4IEBACiAJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CiByZWxlYXNlOgogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCWtmcmVlKHdsX3NkaW8pOworb3V0X2ZyZWVfaHc6CiAJd2wxMjUxX2ZyZWVfaHcod2wpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNjYsOSArMjkyLDExIEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2wxMjUxX3NkaW9fcmVtb3ZlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7CiAJc3RydWN0IHdsMTI1MSAqd2wgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCXN0cnVjdCB3bDEyNTFfc2RpbyAqd2xfc2RpbyA9IHdsLT5pZl9wcml2OwogCiAJaWYgKHdsLT5pcnEpCiAJCWZyZWVfaXJxKHdsLT5pcnEsIHdsKTsKKwlrZnJlZSh3bF9zZGlvKTsKIAl3bDEyNTFfZnJlZV9odyh3bCk7CiAKIAlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX3NwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9zcGkuYwppbmRleCBlODE0NzQyLi4yN2ZkZmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfc3BpLmMKQEAgLTM0NSwzICszNDUsNCBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJLYWxsZSBWYWxvIDxrYWxsZS52YWxvQG5va2lhLmNvbT4iKTsKK01PRFVMRV9BTElBUygic3BpOndsMTI1MSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV90eC5jCmluZGV4IGM4MjIzMTguLmEzOGVjMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX3R4LmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCWZyYWdfdGhyZXNob2xkID0gSUVFRTgwMjExX01BWF9GUkFHX1RIUkVTSE9MRDsKIAl0eF9oZHItPmZyYWdfdGhyZXNob2xkID0gY3B1X3RvX2xlMTYoZnJhZ190aHJlc2hvbGQpOwogCi0JcGF5bG9hZF9sZW4gPSB0eF9oZHItPmxlbmd0aCArIE1BWF9NU0RVX1NFQ1VSSVRZX0xFTkdUSDsKKwlwYXlsb2FkX2xlbiA9IGxlMTZfdG9fY3B1KHR4X2hkci0+bGVuZ3RoKSArIE1BWF9NU0RVX1NFQ1VSSVRZX0xFTkdUSDsKIAogCWlmIChwYXlsb2FkX2xlbiA+IGZyYWdfdGhyZXNob2xkKSB7CiAJCW1lbV9ibG9ja3NfcGVyX2ZyYWcgPQpAQCAtMTkxLDExICsxOTEsMTMgQEAKIAlpZiAoY29udHJvbC0+Y29udHJvbC5od19rZXkgJiYKIAkgICAgY29udHJvbC0+Y29udHJvbC5od19rZXktPmFsZyA9PSBBTEdfVEtJUCkgewogCQlpbnQgaGRybGVuOwotCQl1MTYgZmM7CisJCV9fbGUxNiBmYzsKKwkJdTE2IGxlbmd0aDsKIAkJdTggKnBvczsKIAotCQlmYyA9ICoodTE2ICopKHNrYi0+ZGF0YSArIHNpemVvZigqdHhfaGRyKSk7Ci0JCXR4X2hkci0+bGVuZ3RoICs9IFdMMTI1MV9US0lQX0lWX1NQQUNFOworCQlmYyA9ICooX19sZTE2ICopKHNrYi0+ZGF0YSArIHNpemVvZigqdHhfaGRyKSk7CisJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHR4X2hkci0+bGVuZ3RoKSArIFdMMTI1MV9US0lQX0lWX1NQQUNFOworCQl0eF9oZHItPmxlbmd0aCA9IGNwdV90b19sZTE2KGxlbmd0aCk7CiAKIAkJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfdHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNTFfdHguaAppbmRleCA1NTg1NmM2Li5mNDBlZWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX3R4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV90eC5oCkBAIC0xMDksMTIgKzEwOSwxMiBAQAogCXVuc2lnbmVkIHhmZXJfcGFkOjE7CiAKIAl1bnNpZ25lZCByZXNlcnZlZDo3OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIHN0cnVjdCB0eF9kb3VibGVfYnVmZmVyX2Rlc2MgewogCS8qIExlbmd0aCBvZiBwYXlsb2FkLCBpbmNsdWRpbmcgaGVhZGVycy4gKi8KLQl1MTYgbGVuZ3RoOworCV9fbGUxNiBsZW5ndGg7CiAKIAkvKgogCSAqIEEgYml0IG1hc2sgdGhhdCBzcGVjaWZpZXMgdGhlIGluaXRpYWwgcmF0ZSB0byBiZSB1c2VkCkBAIC0xMzMsMTAgKzEzMywxMCBAQAogCSAqIDB4MDgwMCAtIDQ4TWJpdHMKIAkgKiAweDEwMDAgLSA1NE1iaXRzCiAJICovCi0JdTE2IHJhdGU7CisJX19sZTE2IHJhdGU7CiAKIAkvKiBUaW1lIGluIHVzIHRoYXQgYSBwYWNrZXQgY2FuIHNwZW5kIGluIHRoZSB0YXJnZXQgKi8KLQl1MzIgZXhwaXJ5X3RpbWU7CisJX19sZTMyIGV4cGlyeV90aW1lOwogCiAJLyogaW5kZXggb2YgdGhlIFRYIHF1ZXVlIHVzZWQgZm9yIHRoaXMgcGFja2V0ICovCiAJdTggeG1pdF9xdWV1ZTsKQEAgLTE1MCwxMyArMTUwLDEzIEBACiAJICogVGhlIEZXIHNob3VsZCBjdXQgdGhlIHBhY2tldCBpbnRvIGZyYWdtZW50cwogCSAqIG9mIHRoaXMgc2l6ZS4KIAkgKi8KLQl1MTYgZnJhZ190aHJlc2hvbGQ7CisJX19sZTE2IGZyYWdfdGhyZXNob2xkOwogCiAJLyogTnVtYmVycyBvZiBIVyBxdWV1ZSBibG9ja3MgdG8gYmUgYWxsb2NhdGVkICovCiAJdTggbnVtX21lbV9ibG9ja3M7CiAKIAl1OCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSB7CiAJVFhfU1VDQ0VTUyAgICAgICAgICAgICAgPSAwLApAQCAtMjA4LDcgKzIwOCw3IEBACiAKIAkvKiBTZWUgZG9uZV8xICovCiAJdTggZG9uZV8yOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIGludCB3bDEyNTFfdHhfZ2V0X3F1ZXVlKGludCBxdWV1ZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzEuaAppbmRleCA2ZjFiNmI1Li5kZDNjZWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MS5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJ3bDEyNzFfY29uZi5oIgorI2luY2x1ZGUgIndsMTI3MV9pbmkuaCIKIAogI2RlZmluZSBEUklWRVJfTkFNRSAid2wxMjcxIgogI2RlZmluZSBEUklWRVJfUFJFRklYIERSSVZFUl9OQU1FICI6ICIKQEAgLTExNiwzMyArMTE3LDYgQEAKICNkZWZpbmUgV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYocykgKCh1MTYpKChzKSAmIDB4ZmZmZikpCiAjZGVmaW5lIFdMMTI3MV9UWF9TRUNVUklUWV9ISTMyKHMpICgodTMyKSgoKHMpID4+IDE2KSAmIDB4ZmZmZmZmZmYpKQogCi0vKiBOVlMgZGF0YSBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgV0wxMjcxX05WU19TRUNUSU9OX1NJWkUgICAgICAgICAgICAgICAgICA0NjgKLQotI2RlZmluZSBXTDEyNzFfTlZTX0dFTkVSQUxfUEFSQU1TX1NJWkUgICAgICAgICAgICA1NwotI2RlZmluZSBXTDEyNzFfTlZTX0dFTkVSQUxfUEFSQU1TX1NJWkVfUEFEREVEIFwKLQkoV0wxMjcxX05WU19HRU5FUkFMX1BBUkFNU19TSVpFICsgMSkKLSNkZWZpbmUgV0wxMjcxX05WU19TVEFUX1JBRElPX1BBUkFNU19TSVpFICAgICAgICAgMTcKLSNkZWZpbmUgV0wxMjcxX05WU19TVEFUX1JBRElPX1BBUkFNU19TSVpFX1BBRERFRCBcCi0JKFdMMTI3MV9OVlNfU1RBVF9SQURJT19QQVJBTVNfU0laRSArIDEpCi0jZGVmaW5lIFdMMTI3MV9OVlNfRFlOX1JBRElPX1BBUkFNU19TSVpFICAgICAgICAgIDY1Ci0jZGVmaW5lIFdMMTI3MV9OVlNfRFlOX1JBRElPX1BBUkFNU19TSVpFX1BBRERFRCBcCi0JKFdMMTI3MV9OVlNfRFlOX1JBRElPX1BBUkFNU19TSVpFICsgMSkKLSNkZWZpbmUgV0wxMjcxX05WU19GRU1fQ09VTlQgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgV0wxMjcxX05WU19JTklfU1BBUkVfU0laRSAgICAgICAgICAgICAgICAxMjQKLQotc3RydWN0IHdsMTI3MV9udnNfZmlsZSB7Ci0JLyogTlZTIHNlY3Rpb24gKi8KLQl1OCBudnNbV0wxMjcxX05WU19TRUNUSU9OX1NJWkVdOwotCi0JLyogSU5JIHNlY3Rpb24gKi8KLQl1OCBnZW5lcmFsX3BhcmFtc1tXTDEyNzFfTlZTX0dFTkVSQUxfUEFSQU1TX1NJWkVfUEFEREVEXTsKLQl1OCBzdGF0X3JhZGlvX3BhcmFtc1tXTDEyNzFfTlZTX1NUQVRfUkFESU9fUEFSQU1TX1NJWkVfUEFEREVEXTsKLQl1OCBkeW5fcmFkaW9fcGFyYW1zW1dMMTI3MV9OVlNfRkVNX0NPVU5UXQotCQkJICAgW1dMMTI3MV9OVlNfRFlOX1JBRElPX1BBUkFNU19TSVpFX1BBRERFRF07Ci0JdTggaW5pX3NwYXJlW1dMMTI3MV9OVlNfSU5JX1NQQVJFX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KIC8qCiAgKiBFbmFibGUvZGlzYWJsZSA4MDIuMTFhIHN1cHBvcnQgZm9yIFdMMTI3MwogICovCkBAIC0zMTcsNyArMjkxLDcgQEAKIAlfX2xlMzIgdHhfcmVsZWFzZWRfYmxrc1tOVU1fVFhfUVVFVUVTXTsKIAlfX2xlMzIgZndfbG9jYWx0aW1lOwogCV9fbGUzMiBwYWRkaW5nWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wxMjcxX3J4X21lbV9wb29sX2FkZHIgewogCXUzMiBhZGRyOwpAQCAtMzI1LDEyICsyOTksMTEgQEAKIH07CiAKIHN0cnVjdCB3bDEyNzFfc2NhbiB7CisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxOworCWJvb2wgKnNjYW5uZWRfY2g7CiAJdTggc3RhdGU7CiAJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKIAlzaXplX3Qgc3NpZF9sZW47Ci0JdTggYWN0aXZlOwotCXU4IGhpZ2hfcHJpbzsKLQl1OCBwcm9iZV9yZXF1ZXN0czsKIH07CiAKIHN0cnVjdCB3bDEyNzFfaWZfb3BlcmF0aW9ucyB7CkBAIC0zNjgsMTMgKzM0MSwxNCBAQAogI2RlZmluZSBXTDEyNzFfRkxBR19KT0lORUQgICAgICAgICAgICAgKDIpCiAjZGVmaW5lIFdMMTI3MV9GTEFHX0dQSU9fUE9XRVIgICAgICAgICAoMykKICNkZWZpbmUgV0wxMjcxX0ZMQUdfVFhfUVVFVUVfU1RPUFBFRCAgICg0KQotI2RlZmluZSBXTDEyNzFfRkxBR19TQ0FOTklORyAgICAgICAgICAgKDUpCi0jZGVmaW5lIFdMMTI3MV9GTEFHX0lOX0VMUCAgICAgICAgICAgICAoNikKLSNkZWZpbmUgV0wxMjcxX0ZMQUdfUFNNICAgICAgICAgICAgICAgICg3KQotI2RlZmluZSBXTDEyNzFfRkxBR19QU01fUkVRVUVTVEVEICAgICAgKDgpCi0jZGVmaW5lIFdMMTI3MV9GTEFHX0lSUV9QRU5ESU5HICAgICAgICAoOSkKLSNkZWZpbmUgV0wxMjcxX0ZMQUdfSVJRX1JVTk5JTkcgICAgICAgKDEwKQotI2RlZmluZSBXTDEyNzFfRkxBR19JRExFICAgICAgICAgICAgICAoMTEpCisjZGVmaW5lIFdMMTI3MV9GTEFHX0lOX0VMUCAgICAgICAgICAgICAoNSkKKyNkZWZpbmUgV0wxMjcxX0ZMQUdfUFNNICAgICAgICAgICAgICAgICg2KQorI2RlZmluZSBXTDEyNzFfRkxBR19QU01fUkVRVUVTVEVEICAgICAgKDcpCisjZGVmaW5lIFdMMTI3MV9GTEFHX0lSUV9QRU5ESU5HICAgICAgICAoOCkKKyNkZWZpbmUgV0wxMjcxX0ZMQUdfSVJRX1JVTk5JTkcgICAgICAgICg5KQorI2RlZmluZSBXTDEyNzFfRkxBR19JRExFICAgICAgICAgICAgICAoMTApCisjZGVmaW5lIFdMMTI3MV9GTEFHX0lETEVfUkVRVUVTVEVEICAgICgxMSkKKyNkZWZpbmUgV0wxMjcxX0ZMQUdfUFNQT0xMX0ZBSUxVUkUgICAgKDEyKQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzdHJ1Y3Qgd2wxMjcxX3BhcnRpdGlvbl9zZXQgcGFydDsKQEAgLTQyMSw2ICszOTUsNyBAQAogCiAJLyogUGVuZGluZyBUWCBmcmFtZXMgKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAqdHhfZnJhbWVzW0FDWF9UWF9ERVNDUklQVE9SU107CisJaW50IHR4X2ZyYW1lc19jbnQ7CiAKIAkvKiBTZWN1cml0eSBzZXF1ZW5jZSBudW1iZXIgY291bnRlcnMgKi8KIAl1OCB0eF9zZWN1cml0eV9sYXN0X3NlcTsKQEAgLTQ2OCw2ICs0NDMsMTAgQEAKIAogCXN0cnVjdCBjb21wbGV0aW9uICplbHBfY29tcGw7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBlbHBfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHBzcG9sbF93b3JrOworCisJLyogY291bnRlciBmb3IgcHMtcG9sbCBkZWxpdmVyeSBmYWlsdXJlcyAqLworCWludCBwc19wb2xsX2ZhaWx1cmVzOwogCiAJLyogcmV0cnkgY291bnRlciBmb3IgUFNNIGVudHJpZXMgKi8KIAl1OCBwc21fZW50cnlfcmV0cnk7CkBAIC00OTYsNiArNDc1LDkgQEAKIAlib29sIHNnX2VuYWJsZWQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBNb3N0IHJlY2VudGx5IHJlcG9ydGVkIG5vaXNlIGluIGRCbSAqLworCXM4IG5vaXNlOwogfTsKIAogaW50IHdsMTI3MV9wbHRfc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9hY3guYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfYWN4LmMKaW5kZXggZTE5ZTJmOC4uYmIyNDVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9hY3guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2FjeC5jCkBAIC0xMDc1LDggKzEwNzUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLCB1OCAqYWRkcmVzcywKLQkJCSAgICAgdTggdmVyc2lvbikKK2ludCB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLCBfX2JlMzIgYWRkcmVzcykKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2FjeF9hcnBfZmlsdGVyICphY3g7CiAJaW50IHJldDsKQEAgLTEwODksMTcgKzEwODgsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT52ZXJzaW9uID0gdmVyc2lvbjsKKwlhY3gtPnZlcnNpb24gPSBBQ1hfSVBWNF9WRVJTSU9OOwogCWFjeC0+ZW5hYmxlID0gZW5hYmxlOwogCi0JaWYgKGVuYWJsZSA9PSB0cnVlKSB7Ci0JCWlmICh2ZXJzaW9uID09IEFDWF9JUFY0X1ZFUlNJT04pCi0JCQltZW1jcHkoYWN4LT5hZGRyZXNzLCBhZGRyZXNzLCBBQ1hfSVBWNF9BRERSX1NJWkUpOwotCQllbHNlIGlmICh2ZXJzaW9uID09IEFDWF9JUFY2X1ZFUlNJT04pCi0JCQltZW1jcHkoYWN4LT5hZGRyZXNzLCBhZGRyZXNzLCBzaXplb2YoYWN4LT5hZGRyZXNzKSk7Ci0JCWVsc2UKLQkJCXdsMTI3MV9lcnJvcigiSW52YWxpZCBJUCB2ZXJzaW9uIik7Ci0JfQorCWlmIChlbmFibGUgPT0gdHJ1ZSkKKwkJbWVtY3B5KGFjeC0+YWRkcmVzcywgJmFkZHJlc3MsIEFDWF9JUFY0X0FERFJfU0laRSk7CiAKIAlyZXQgPSB3bDEyNzFfY21kX2NvbmZpZ3VyZSh3bCwgQUNYX0FSUF9JUF9GSUxURVIsCiAJCQkJICAgYWN4LCBzaXplb2YoKmFjeCkpOwpAQCAtMTI2NiwzICsxMjU5LDI5IEBACiAJa2ZyZWUoYWN4KTsKIAlyZXR1cm4gcmV0OwogfQorCitpbnQgd2wxMjcxX2FjeF90c2ZfaW5mbyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTY0ICptYWN0aW1lKQoreworCXN0cnVjdCB3bDEyNzFfYWN4X2Z3X3RzZl9pbmZvcm1hdGlvbiAqdHNmX2luZm87CisJaW50IHJldDsKKworCXRzZl9pbmZvID0ga3phbGxvYyhzaXplb2YoKnRzZl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0c2ZfaW5mbykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bDEyNzFfY21kX2ludGVycm9nYXRlKHdsLCBBQ1hfVFNGX0lORk8sCisJCQkJICAgICB0c2ZfaW5mbywgc2l6ZW9mKCp0c2ZfaW5mbykpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV93YXJuaW5nKCJhY3ggdHNmIGluZm8gaW50ZXJyb2dhdGUgZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCSptYWN0aW1lID0gbGUzMl90b19jcHUodHNmX2luZm8tPmN1cnJlbnRfdHNmX2xvdykgfAorCQkoKHU2NCkgbGUzMl90b19jcHUodHNmX2luZm8tPmN1cnJlbnRfdHNmX2hpZ2gpIDw8IDMyKTsKKworb3V0OgorCWtmcmVlKHRzZl9pbmZvKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9hY3guaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfYWN4LmgKaW5kZXggNDIwZTdlMi4uNDIzNWJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9hY3guaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2FjeC5oCkBAIC03NSw3ICs3NSw3IEBACiAKIAkvKiBwYXlsb2FkIGxlbmd0aCAobm90IGluY2x1ZGluZyBoZWFkZXJzICovCiAJX19sZTE2IGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9lcnJvcl9jb3VudGVyIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC05OCw3ICs5OCw3IEBACiAJLyogdGhlIG51bWJlciBvZiBtaXNzZWQgc2VxdWVuY2UgbnVtYmVycyBpbiB0aGUgc3F1ZW50aWFsbHkgKi8KIAkvKiB2YWx1ZXMgb2YgZnJhbWVzIHNlcSBudW1iZXJzICovCiAJX19sZTMyIHNlcV9udW1fbWlzczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9yZXZpc2lvbiB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJICogYml0cyAyNCAtIDMxOiBDaGlwIElEIC0gVGhlIFdpTGluayBjaGlwIElELgogCSAqLwogCV9fbGUzMiBod192ZXJzaW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHdsMTI3MV9wc21fbW9kZSB7CiAJLyogQWN0aXZlIG1vZGUgKi8KQEAgLTE0OSw3ICsxNDksNyBAQAogCS8qIDIgLSBFTFAgbW9kZTogRGVlcCAvIE1heCBzbGVlcCovCiAJdTggIHNsZWVwX2F1dGg7CiAJdTggIHBhZGRpbmdbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewogCUhPU1RJRl9QQ0lfTUFTVEVSX0hPU1RfSU5ESVJFQ1QsCkBAIC0xODcsNyArMTg3LDcgQEAKIAkgKiBmaXJtd2FyZSBkaXNjYXJkcyB0aGUgTVNEVS4KIAkgKi8KIAlfX2xlMzIgbGlmZXRpbWU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBSWCBDb25maWcgT3B0aW9ucyBUYWJsZQpAQCAtMjc1LDEzICsyNzUsMTMgQEAKIAogCV9fbGUzMiBjb25maWdfb3B0aW9uczsKIAlfX2xlMzIgZmlsdGVyX29wdGlvbnM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfcGFja2V0X2RldGVjdGlvbiB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCiAJX19sZTMyIHRocmVzaG9sZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBlbnVtIGFjeF9zbG90X3R5cGUgewpAQCAtMjk5LDcgKzI5OSw3IEBACiAJdTggd29uZV9pbmRleDsgLyogUmVzZXJ2ZWQgKi8KIAl1OCBzbG90X3RpbWU7CiAJdTggcmVzZXJ2ZWRbNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogI2RlZmluZSBBQ1hfTUNfQUREUkVTU19HUk9VUF9NQVgJKDgpCkBAIC0zMTIsMjEgKzMxMiwyMSBAQAogCXU4IG51bV9ncm91cHM7CiAJdTggcGFkWzJdOwogCXU4IG1hY190YWJsZVtBRERSRVNTX0dST1VQX01BWF9MRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3J4X3RpbWVvdXQgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKIAogCV9fbGUxNiBwc19wb2xsX3RpbWVvdXQ7CiAJX19sZTE2IHVwc2RfdGltZW91dDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9ydHNfdGhyZXNob2xkIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CiAKIAlfX2xlMTYgdGhyZXNob2xkOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9iZWFjb25fZmlsdGVyX29wdGlvbiB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtMzQyLDcgKzM0Miw3IEBACiAJICovCiAJdTggbWF4X251bV9iZWFjb25zOwogCXU4IHBhZFsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIEFDWEJlYWNvbkZpbHRlckVudHJ5IChub3QgMjIxKQpAQCAtMzgzLDIxICszODMsMjEgQEAKIAl1OCBudW1faWU7CiAJdTggcGFkWzNdOwogCXU4IHRhYmxlW0JFQUNPTl9GSUxURVJfVEFCTEVfTUFYX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2Nvbm5fbW9uaXRfcGFyYW1zIHsKICAgICAgICBzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CiAKICAgICAgICBfX2xlMzIgc3luY2hfZmFpbF90aG9sZDsgLyogbnVtYmVyIG9mIGJlYWNvbnMgbWlzc2VkICovCiAgICAgICAgX19sZTMyIGJzc19sb3NlX3RpbWVvdXQ7IC8qIG51bWJlciBvZiBUVSdzIGZyb20gc3luY2ggZmFpbCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2J0X3dsYW5fY29leCB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCiAJdTggZW5hYmxlOwogCXU4IHBhZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9idF93bGFuX2NvZXhfcGFyYW0gewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKQEAgLTQwNSw3ICs0MDUsNyBAQAogCV9fbGUzMiBwYXJhbXNbQ09ORl9TR19QQVJBTVNfTUFYXTsKIAl1OCBwYXJhbV9pZHg7CiAJdTggcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9kY29faXRyaW1fcGFyYW1zIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC00MTMsNyArNDEzLDcgQEAKIAl1OCBlbmFibGU7CiAJdTggcGFkZGluZ1szXTsKIAlfX2xlMzIgdGltZW91dDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9lbmVyZ3lfZGV0ZWN0aW9uIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC00MjIsNyArNDIyLDcgQEAKIAlfX2xlMTYgcnhfY2NhX3RocmVzaG9sZDsKIAl1OCB0eF9lbmVyZ3lfZGV0ZWN0aW9uOwogCXU4IHBhZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9iZWFjb25fYnJvYWRjYXN0IHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC00MzYsMTQgKzQzNiwxNCBAQAogCS8qIENvbnNlY3V0aXZlIFBTIFBvbGwgZmFpbHVyZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBob3N0ICovCiAJdTggcHNfcG9sbF90aHJlc2hvbGQ7CiAJdTggcGFkWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2V2ZW50X21hc2sgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKIAogCV9fbGUzMiBldmVudF9tYXNrOwogCV9fbGUzMiBoaWdoX2V2ZW50X21hc2s7IC8qIFVudXNlZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIENGR19SWF9GQ1MJCUJJVCgyKQogI2RlZmluZSBDRkdfUlhfQUxMX0dPT0QJCUJJVCgzKQpAQCAtNDg4LDE0ICs0ODgsMTQgQEAKIAogCV9fbGUzMiBvcHRpb25zOwogCV9fbGUzMiBkYXRhX2Zsb3dfb3B0aW9uczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9jdXJyZW50X3R4X3Bvd2VyIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CiAKIAl1OCAgY3VycmVudF90eF9wb3dlcjsKIAl1OCAgcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF93YWtlX3VwX2NvbmRpdGlvbiB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJdTggd2FrZV91cF9ldmVudDsgLyogT25seSBvbmUgYml0IGNhbiBiZSBzZXQgKi8KIAl1OCBsaXN0ZW5faW50ZXJ2YWw7CiAJdTggcGFkWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2FpZCB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtNTEzLDcgKzUxMyw3IEBACiAJICovCiAJX19sZTE2IGFpZDsKIAl1OCBwYWRbMl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gYWN4X3ByZWFtYmxlX3R5cGUgewogCUFDWF9QUkVBTUJMRV9MT05HID0gMCwKQEAgLTUyOSw3ICs1MjksNyBAQAogCSAqLwogCXU4IHByZWFtYmxlOwogCXU4IHBhZGRpbmdbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gYWN4X2N0c3Byb3RlY3RfdHlwZSB7CiAJQ1RTUFJPVEVDVF9ESVNBQkxFID0gMCwKQEAgLTU0MCwxMSArNTQwLDExIEBACiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCXU4IGN0c3Byb3RlY3Q7CiAJdTggcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF90eF9zdGF0aXN0aWNzIHsKIAlfX2xlMzIgaW50ZXJuYWxfZGVzY19vdmVyZmxvdzsKLX0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gIF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3J4X3N0YXRpc3RpY3MgewogCV9fbGUzMiBvdXRfb2ZfbWVtOwpAQCAtNTU1LDE0ICs1NTUsMTQgQEAKIAlfX2xlMzIgeGZyX2hpbnRfdHJpZzsKIAlfX2xlMzIgcGF0aF9yZXNldDsKIAlfX2xlMzIgcmVzZXRfY291bnRlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9kbWFfc3RhdGlzdGljcyB7CiAJX19sZTMyIHJ4X3JlcXVlc3RlZDsKIAlfX2xlMzIgcnhfZXJyb3JzOwogCV9fbGUzMiB0eF9yZXF1ZXN0ZWQ7CiAJX19sZTMyIHR4X2Vycm9yczsKLX0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gIF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X2lzcl9zdGF0aXN0aWNzIHsKIAkvKiBob3N0IGNvbW1hbmQgY29tcGxldGUgKi8KQEAgLTYyMSw3ICs2MjEsNyBAQAogCiAJLyogKElOVF9TVFNfTkQgJiBJTlRfVFJJR19MT1dfUlNTSSkgKi8KIAlfX2xlMzIgbG93X3Jzc2k7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfd2VwX3N0YXRpc3RpY3MgewogCS8qIFdFUCBhZGRyZXNzIGtleXMgY29uZmlndXJlZCAqLwpAQCAtNjQzLDcgKzY0Myw3IEBACiAKIAkvKiBXRVAgZGVjcnlwdCBpbnRlcnJ1cHRzICovCiAJX19sZTMyIGludGVycnVwdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBBQ1hfTUlTU0VEX0JFQUNPTlNfU1BSRUFEIDEwCiAKQEAgLTcwMywxMiArNzAzLDEyIEBACiAKIAkvKiB0aGUgbnVtYmVyIG9mIGJlYWNvbnMgaW4gYXdha2UgbW9kZSAqLwogCV9fbGUzMiByY3ZkX2F3YWtlX2JlYWNvbnM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfbWljX3N0YXRpc3RpY3MgewogCV9fbGUzMiByeF9wa3RzOwogCV9fbGUzMiBjYWxjX2ZhaWx1cmU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfYWVzX3N0YXRpc3RpY3MgewogCV9fbGUzMiBlbmNyeXB0X2ZhaWw7CkBAIC03MTcsNyArNzE3LDcgQEAKIAlfX2xlMzIgZGVjcnlwdF9wYWNrZXRzOwogCV9fbGUzMiBlbmNyeXB0X2ludGVycnVwdDsKIAlfX2xlMzIgZGVjcnlwdF9pbnRlcnJ1cHQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfZXZlbnRfc3RhdGlzdGljcyB7CiAJX19sZTMyIGhlYXJ0X2JlYXQ7CkBAIC03MjgsNyArNzI4LDcgQEAKIAlfX2xlMzIgb29tX2xhdGU7CiAJX19sZTMyIHBoeV90cmFuc21pdF9lcnJvcjsKIAlfX2xlMzIgdHhfc3R1Y2s7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfcHNfc3RhdGlzdGljcyB7CiAJX19sZTMyIHBzcG9sbF90aW1lb3V0czsKQEAgLTczOCw3ICs3MzgsNyBAQAogCV9fbGUzMiBwc3BvbGxfbWF4X2FwdHVybjsKIAlfX2xlMzIgcHNwb2xsX3V0aWxpemF0aW9uOwogCV9fbGUzMiB1cHNkX3V0aWxpemF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3J4cGlwZV9zdGF0aXN0aWNzIHsKIAlfX2xlMzIgcnhfcHJlcF9iZWFjb25fZHJvcDsKQEAgLTc0Niw3ICs3NDYsNyBAQAogCV9fbGUzMiBiZWFjb25fYnVmZmVyX3RocmVzX2hvc3RfaW50X3RyaWdfcnhfZGF0YTsKIAlfX2xlMzIgbWlzc2VkX2JlYWNvbl9ob3N0X2ludF90cmlnX3J4X2RhdGE7CiAJX19sZTMyIHR4X3hmcl9ob3N0X2ludF90cmlnX3J4X2RhdGE7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfc3RhdGlzdGljcyB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtNzYyLDcgKzc2Miw3IEBACiAJc3RydWN0IGFjeF9ldmVudF9zdGF0aXN0aWNzIGV2ZW50OwogCXN0cnVjdCBhY3hfcHNfc3RhdGlzdGljcyBwczsKIAlzdHJ1Y3QgYWN4X3J4cGlwZV9zdGF0aXN0aWNzIHJ4cGlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9yYXRlX2NsYXNzIHsKIAlfX2xlMzIgZW5hYmxlZF9yYXRlczsKQEAgLTc4MCw3ICs3ODAsNyBAQAogCiAJX19sZTMyIHJhdGVfY2xhc3NfY250OwogCXN0cnVjdCBhY3hfcmF0ZV9jbGFzcyByYXRlX2NsYXNzW0NPTkZfVFhfTUFYX1JBVEVfQ0xBU1NFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfYWNfY2ZnIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC03OTAsNyArNzkwLDcgQEAKIAl1OCBhaWZzbjsKIAl1OCByZXNlcnZlZDsKIAlfX2xlMTYgdHhfb3BfbGltaXQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBhY3hfdGlkX2NvbmZpZyB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwpAQCAtODAxLDE5ICs4MDEsMTkgQEAKIAl1OCBhY2tfcG9saWN5OwogCXU4IHBhZGRpbmdbM107CiAJX19sZTMyIGFwc2RfY29uZlsyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGFjeF9mcmFnX3RocmVzaG9sZCB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCV9fbGUxNiBmcmFnX3RocmVzaG9sZDsKIAl1OCBwYWRkaW5nWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYWN4X3R4X2NvbmZpZ19vcHRpb25zIHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CiAJX19sZTE2IHR4X2NvbXBsX3RpbWVvdXQ7ICAgICAvKiBtc2VjICovCiAJX19sZTE2IHR4X2NvbXBsX3RocmVzaG9sZDsgICAvKiBudW1iZXIgb2YgcGFja2V0cyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEFDWF9SWF9NRU1fQkxPQ0tTICAgICA3MAogI2RlZmluZSBBQ1hfVFhfTUlOX01FTV9CTE9DS1MgNDAKQEAgLTgyOCw3ICs4MjgsNyBAQAogCXU4IG51bV9zdGF0aW9uczsKIAl1OCBudW1fc3NpZF9wcm9maWxlczsKIAlfX2xlMzIgdG90YWxfdHhfZGVzY3JpcHRvcnM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNzFfYWN4X21lbV9tYXAgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKQEAgLTg3Miw3ICs4NzIsNyBAQAogCXU4ICpyeF9jYnVmOwogCV9fbGUzMiByeF9jdHJsOwogCV9fbGUzMiB0eF9jdHJsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wxMjcxX2FjeF9yeF9jb25maWdfb3B0IHsKIAlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CkBAIC04ODIsNyArODgyLDcgQEAKIAlfX2xlMTYgdGltZW91dDsKIAl1OCBxdWV1ZV90eXBlOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIHN0cnVjdCB3bDEyNzFfYWN4X2JldF9lbmFibGUgewpAQCAtODkxLDcgKzg5MSw3IEBACiAJdTggZW5hYmxlOwogCXU4IG1heF9jb25zZWN1dGl2ZTsKIAl1OCBwYWRkaW5nWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEFDWF9JUFY0X1ZFUlNJT04gNAogI2RlZmluZSBBQ1hfSVBWNl9WRVJTSU9OIDYKQEAgLTkwNSw3ICs5MDUsNyBAQAogCQkJICAgICAgIHJlcXVlc3RzIGRpcmVjdGVkIHRvIHRoaXMgSVAgYWRkcmVzcyB3aWxsIHBhc3MKIAkJCSAgICAgICB0aHJvdWdoLiBGb3IgSVB2NCwgdGhlIGZpcnN0IGZvdXIgYnl0ZXMgYXJlCiAJCQkgICAgICAgdXNlZC4gKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wxMjcxX2FjeF9wbV9jb25maWcgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKQEAgLTkxMywxNCArOTEzLDE0IEBACiAJX19sZTMyIGhvc3RfY2xrX3NldHRsaW5nX3RpbWU7CiAJdTggaG9zdF9mYXN0X3dha2V1cF9zdXBwb3J0OwogCXU4IHBhZGRpbmdbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfbW9kZSB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCiAJdTggZW5hYmxlZDsKIAl1OCBwYWRkaW5nWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHsKIAlBQ1hfS0VFUF9BTElWRV9OT19UWCA9IDAsCkBAIC05NDAsNyArOTQwLDcgQEAKIAl1OCB0cGxfdmFsaWRhdGlvbjsKIAl1OCB0cmlnZ2VyOwogCXU4IHBhZGRpbmc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewogCVdMMTI3MV9BQ1hfVFJJR19UWVBFX0xFVkVMID0gMCwKQEAgLTk5Myw2ICs5OTMsMTcgQEAKIAl1OCBzbnJfZGF0YTsKIH07CiAKK3N0cnVjdCB3bDEyNzFfYWN4X2Z3X3RzZl9pbmZvcm1hdGlvbiB7CisJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOworCisJX19sZTMyIGN1cnJlbnRfdHNmX2hpZ2g7CisJX19sZTMyIGN1cnJlbnRfdHNmX2xvdzsKKwlfX2xlMzIgbGFzdF9idHR0X2hpZ2g7CisJX19sZTMyIGxhc3RfdGJ0dF9sb3c7CisJdTggbGFzdF9kdGltX2NvdW50OworCXU4IHBhZGRpbmdbM107Cit9IF9fcGFja2VkOworCiBlbnVtIHsKIAlBQ1hfV0FLRV9VUF9DT05ESVRJT05TICAgICAgPSAweDAwMDIsCiAJQUNYX01FTV9DRkcgICAgICAgICAgICAgICAgID0gMHgwMDAzLApAQCAtMTEwNiwxMyArMTExNywxMyBAQAogaW50IHdsMTI3MV9hY3hfaW5pdF9yeF9pbnRlcnJ1cHQoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9hY3hfc21hcnRfcmVmbGV4KHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfYWN4X2JldF9lbmFibGUoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKTsKLWludCB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLCB1OCAqYWRkcmVzcywKLQkJCSAgICAgdTggdmVyc2lvbik7CitpbnQgd2wxMjcxX2FjeF9hcnBfaXBfZmlsdGVyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSwgX19iZTMyIGFkZHJlc3MpOwogaW50IHdsMTI3MV9hY3hfcG1fY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfbW9kZShzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOwogaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGluZGV4LCB1OCB0cGxfdmFsaWQpOwogaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfdHJpZ2dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUsCiAJCQkJczE2IHRob2xkLCB1OCBoeXN0KTsKIGludCB3bDEyNzFfYWN4X3Jzc2lfc25yX2F2Z193ZWlnaHRzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfYWN4X3RzZl9pbmZvKHN0cnVjdCB3bDEyNzEgKndsLCB1NjQgKm1hY3RpbWUpOwogCiAjZW5kaWYgLyogX19XTDEyNzFfQUNYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9ib290LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2Jvb3QuYwppbmRleCAxYTM2ZDhhLi5mMzY0MzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2Jvb3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2Jvb3QuYwpAQCAtNDE0LDcgKzQxNCw5IEBACiAJCVBTX1JFUE9SVF9FVkVOVF9JRCB8CiAJCUpPSU5fRVZFTlRfQ09NUExFVEVfSUQgfAogCQlESVNDT05ORUNUX0VWRU5UX0NPTVBMRVRFX0lEIHwKLQkJUlNTSV9TTlJfVFJJR0dFUl8wX0VWRU5UX0lEOworCQlSU1NJX1NOUl9UUklHR0VSXzBfRVZFTlRfSUQgfAorCQlQU1BPTExfREVMSVZFUllfRkFJTFVSRV9FVkVOVF9JRCB8CisJCVNPRlRfR0VNSU5JX1NFTlNFX0VWRU5UX0lEOwogCiAJcmV0ID0gd2wxMjcxX2V2ZW50X3VubWFzayh3bCk7CiAJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2NtZC5jCmluZGV4IDE5MzkzZTIuLmNlNTAzZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9jbWQuYwpAQCAtMTA0LDEwMCArMTA0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9jbWRfY2FsX2NoYW5uZWxfdHVuZShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfY2hhbm5lbF90dW5lICpjbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY21kLT50ZXN0LmlkID0gVEVTVF9DTURfQ0hBTk5FTF9UVU5FOwotCi0JY21kLT5iYW5kID0gV0wxMjcxX0NIQU5ORUxfVFVORV9CQU5EXzJfNDsKLQkvKiBzZXQgdXAgYW55IGNoYW5uZWwsIDcgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2UgKi8KLQljbWQtPmNoYW5uZWwgPSA3OwotCi0JcmV0ID0gd2wxMjcxX2NtZF90ZXN0KHdsLCBjbWQsIHNpemVvZigqY21kKSwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXdsMTI3MV93YXJuaW5nKCJURVNUX0NNRF9DSEFOTkVMX1RVTkUgZmFpbGVkIik7Ci0KLQlrZnJlZShjbWQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2wxMjcxX2NtZF9jYWxfdXBkYXRlX3JlZl9wb2ludChzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3Qgd2wxMjcxX2NtZF9jYWxfdXBkYXRlX3JlZl9wb2ludCAqY21kOwotCWludCByZXQgPSAwOwotCi0JY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwotCWlmICghY21kKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNtZC0+dGVzdC5pZCA9IFRFU1RfQ01EX1VQREFURV9QRF9SRUZFUkVOQ0VfUE9JTlQ7Ci0KLQkvKiBGSVhNRTogc3RpbGwgd2FpdGluZyBmb3IgdGhlIGNvcnJlY3QgdmFsdWVzICovCi0JY21kLT5yZWZfcG93ZXIgICAgPSAwOwotCWNtZC0+cmVmX2RldGVjdG9yID0gMDsKLQotCWNtZC0+c3ViX2JhbmQgICAgID0gV0wxMjcxX1BEX1JFRkVSRU5DRV9QT0lOVF9CQU5EX0JfRzsKLQotCXJldCA9IHdsMTI3MV9jbWRfdGVzdCh3bCwgY21kLCBzaXplb2YoKmNtZCksIDApOwotCWlmIChyZXQgPCAwKQotCQl3bDEyNzFfd2FybmluZygiVEVTVF9DTURfVVBEQVRFX1BEX1JFRkVSRU5DRV9QT0lOVCBmYWlsZWQiKTsKLQotCWtmcmVlKGNtZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfY21kX2NhbF9wMmcoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0Jc3RydWN0IHdsMTI3MV9jbWRfY2FsX3AyZyAqY21kOwotCWludCByZXQgPSAwOwotCi0JY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwotCWlmICghY21kKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNtZC0+dGVzdC5pZCA9IFRFU1RfQ01EX1AyR19DQUw7Ci0KLQljbWQtPnN1Yl9iYW5kX21hc2sgPSBXTDEyNzFfQ0FMX1AyR19CQU5EX0JfRzsKLQotCXJldCA9IHdsMTI3MV9jbWRfdGVzdCh3bCwgY21kLCBzaXplb2YoKmNtZCksIDApOwotCWlmIChyZXQgPCAwKQotCQl3bDEyNzFfd2FybmluZygiVEVTVF9DTURfUDJHX0NBTCBmYWlsZWQiKTsKLQotCWtmcmVlKGNtZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfY21kX2NhbChzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQkvKgotCSAqIEZJWE1FOiB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCBzbGVlcGluZyB3aGVuIGNhbGlicmF0aW9uCi0JICogaXMgZG9uZQotCSAqLwotCWludCByZXQ7Ci0KLQl3bDEyNzFfbm90aWNlKCJwZXJmb3JtaW5nIHR4IGNhbGlicmF0aW9uIik7Ci0KLQlyZXQgPSB3bDEyNzFfY21kX2NhbF9jaGFubmVsX3R1bmUod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gd2wxMjcxX2NtZF9jYWxfdXBkYXRlX3JlZl9wb2ludCh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB3bDEyNzFfY21kX2NhbF9wMmcod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHJldDsKLX0KLQogaW50IHdsMTI3MV9jbWRfZ2VuZXJhbF9wYXJtcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2dlbmVyYWxfcGFybXNfY21kICpnZW5fcGFybXM7CkBAIC0yMTIsOCArMTE4LDggQEAKIAogCWdlbl9wYXJtcy0+dGVzdC5pZCA9IFRFU1RfQ01EX0lOSV9GSUxFX0dFTkVSQUxfUEFSQU07CiAKLQltZW1jcHkoZ2VuX3Bhcm1zLT5wYXJhbXMsIHdsLT5udnMtPmdlbmVyYWxfcGFyYW1zLAotCSAgICAgICBXTDEyNzFfTlZTX0dFTkVSQUxfUEFSQU1TX1NJWkUpOworCW1lbWNweSgmZ2VuX3Bhcm1zLT5nZW5lcmFsX3BhcmFtcywgJndsLT5udnMtPmdlbmVyYWxfcGFyYW1zLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHdsMTI3MV9pbmlfZ2VuZXJhbF9wYXJhbXMpKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfdGVzdCh3bCwgZ2VuX3Bhcm1zLCBzaXplb2YoKmdlbl9wYXJtcyksIDApOwogCWlmIChyZXQgPCAwKQpAQCAtMjI2LDcgKzEzMiw3IEBACiBpbnQgd2wxMjcxX2NtZF9yYWRpb19wYXJtcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX3JhZGlvX3Bhcm1zX2NtZCAqcmFkaW9fcGFybXM7Ci0Jc3RydWN0IGNvbmZfcmFkaW9fcGFybXMgKnJwYXJhbSA9ICZ3bC0+Y29uZi5pbml0LnJhZGlvcGFyYW07CisJc3RydWN0IHdsMTI3MV9pbmlfZ2VuZXJhbF9wYXJhbXMgKmdwID0gJndsLT5udnMtPmdlbmVyYWxfcGFyYW1zOwogCWludCByZXQ7CiAKIAlpZiAoIXdsLT5udnMpCkBAIC0yMzgsMTMgKzE0NCwyMCBAQAogCiAJcmFkaW9fcGFybXMtPnRlc3QuaWQgPSBURVNUX0NNRF9JTklfRklMRV9SQURJT19QQVJBTTsKIAotCW1lbWNweShyYWRpb19wYXJtcy0+c3RhdF9yYWRpb19wYXJhbXMsIHdsLT5udnMtPnN0YXRfcmFkaW9fcGFyYW1zLAotCSAgICAgICBXTDEyNzFfTlZTX1NUQVRfUkFESU9fUEFSQU1TX1NJWkUpOwotCW1lbWNweShyYWRpb19wYXJtcy0+ZHluX3JhZGlvX3BhcmFtcywKLQkgICAgICAgd2wtPm52cy0+ZHluX3JhZGlvX3BhcmFtc1tycGFyYW0tPmZlbV0sCi0JICAgICAgIFdMMTI3MV9OVlNfRFlOX1JBRElPX1BBUkFNU19TSVpFKTsKKwkvKiAyLjRHSHogcGFyYW1ldGVycyAqLworCW1lbWNweSgmcmFkaW9fcGFybXMtPnN0YXRpY19wYXJhbXNfMiwgJndsLT5udnMtPnN0YXRfcmFkaW9fcGFyYW1zXzIsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX2luaV9iYW5kX3BhcmFtc18yKSk7CisJbWVtY3B5KCZyYWRpb19wYXJtcy0+ZHluX3BhcmFtc18yLAorCSAgICAgICAmd2wtPm52cy0+ZHluX3JhZGlvX3BhcmFtc18yW2dwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlcl0ucGFyYW1zLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc18yKSk7CiAKLQkvKiBGSVhNRTogY3VycmVudCBOVlMgaXMgbWlzc2luZyA1R0h6IHBhcmFtZXRlcnMgKi8KKwkvKiA1R0h6IHBhcmFtZXRlcnMgKi8KKwltZW1jcHkoJnJhZGlvX3Bhcm1zLT5zdGF0aWNfcGFyYW1zXzUsCisJICAgICAgICZ3bC0+bnZzLT5zdGF0X3JhZGlvX3BhcmFtc181LAorCSAgICAgICBzaXplb2Yoc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfNSkpOworCW1lbWNweSgmcmFkaW9fcGFybXMtPmR5bl9wYXJhbXNfNSwKKwkgICAgICAgJndsLT5udnMtPmR5bl9yYWRpb19wYXJhbXNfNVtncC0+dHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXJdLnBhcmFtcywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfNSkpOwogCiAJd2wxMjcxX2R1bXAoREVCVUdfQ01ELCAiVEVTVF9DTURfSU5JX0ZJTEVfUkFESU9fUEFSQU06ICIsCiAJCSAgICByYWRpb19wYXJtcywgc2l6ZW9mKCpyYWRpb19wYXJtcykpOwpAQCAtMjg4LDIwICsyMDEsMTAgQEAKIAogaW50IHdsMTI3MV9jbWRfam9pbihzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggYnNzX3R5cGUpCiB7Ci0Jc3RhdGljIGJvb2wgZG9fY2FsID0gdHJ1ZTsKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF9qb2luICpqb2luOwogCWludCByZXQsIGk7CiAJdTggKmJzc2lkOwogCi0JLyogRklYTUU6IHJlbW92ZSB3aGVuIHdlIGdldCBjYWxpYnJhdGlvbiBmcm9tIHRoZSBmYWN0b3J5ICovCi0JaWYgKGRvX2NhbCkgewotCQlyZXQgPSB3bDEyNzFfY21kX2NhbCh3bCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJd2wxMjcxX3dhcm5pbmcoImNvdWxkbid0IGNhbGlicmF0ZSIpOwotCQllbHNlCi0JCQlkb19jYWwgPSBmYWxzZTsKLQl9Ci0KIAlqb2luID0ga3phbGxvYyhzaXplb2YoKmpvaW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWpvaW4pIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTMyOSwxMiArMjMyLDYgQEAKIAlqb2luLT5jaGFubmVsID0gd2wtPmNoYW5uZWw7CiAJam9pbi0+c3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47CiAJbWVtY3B5KGpvaW4tPnNzaWQsIHdsLT5zc2lkLCB3bC0+c3NpZF9sZW4pOwotCWpvaW4tPmN0cmwgPSBXTDEyNzFfSk9JTl9DTURfQ1RSTF9UWF9GTFVTSDsKLQotCS8qIGluY3JlbWVudCB0aGUgc2Vzc2lvbiBjb3VudGVyICovCi0Jd2wtPnNlc3Npb25fY291bnRlcisrOwotCWlmICh3bC0+c2Vzc2lvbl9jb3VudGVyID49IFNFU1NJT05fQ09VTlRFUl9NQVgpCi0JCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOwogCiAJam9pbi0+Y3RybCB8PSB3bC0+c2Vzc2lvbl9jb3VudGVyIDw8IFdMMTI3MV9KT0lOX0NNRF9UWF9TRVNTSU9OX09GRlNFVDsKIApAQCAtNTE3LDcgKzQxNCw3IEBACiAJcHNfcGFyYW1zLT5zZW5kX251bGxfZGF0YSA9IHNlbmQ7CiAJcHNfcGFyYW1zLT5yZXRyaWVzID0gNTsKIAlwc19wYXJhbXMtPmhhbmdfb3Zlcl9wZXJpb2QgPSAxOwotCXBzX3BhcmFtcy0+bnVsbF9kYXRhX3JhdGUgPSBjcHVfdG9fbGUzMigxKTsgLyogMSBNYnBzICovCisJcHNfcGFyYW1zLT5udWxsX2RhdGFfcmF0ZSA9IGNwdV90b19sZTMyKHdsLT5iYXNpY19yYXRlX3NldCk7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9TRVRfUFNfTU9ERSwgcHNfcGFyYW1zLAogCQkJICAgICAgc2l6ZW9mKCpwc19wYXJhbXMpLCAwKTsKQEAgLTU2NiwxNDAgKzQ2Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9jbWRfc2NhbihzdHJ1Y3Qgd2wxMjcxICp3bCwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKLQkJICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgdTggYWN0aXZlX3NjYW4sCi0JCSAgICB1OCBoaWdoX3ByaW8sIHU4IGJhbmQsIHU4IHByb2JlX3JlcXVlc3RzKQotewotCi0Jc3RydWN0IHdsMTI3MV9jbWRfdHJpZ2dlcl9zY2FuX3RvICp0cmlnZ2VyID0gTlVMTDsKLQlzdHJ1Y3Qgd2wxMjcxX2NtZF9zY2FuICpwYXJhbXMgPSBOVUxMOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbHM7Ci0JdTMyIHJhdGU7Ci0JaW50IGksIGosIG5fY2gsIHJldDsKLQl1MTYgc2Nhbl9vcHRpb25zID0gMDsKLQl1OCBpZWVlX2JhbmQ7Ci0KLQlpZiAoYmFuZCA9PSBXTDEyNzFfU0NBTl9CQU5EXzJfNF9HSFopIHsKLQkJaWVlZV9iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQkJcmF0ZSA9IHdsLT5jb25mLnR4LmJhc2ljX3JhdGU7Ci0JfSBlbHNlIGlmIChiYW5kID09IFdMMTI3MV9TQ0FOX0JBTkRfRFVBTCAmJiB3bDEyNzFfMTFhX2VuYWJsZWQoKSkgewotCQlpZWVlX2JhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCQlyYXRlID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZTsKLQl9IGVsc2UgaWYgKGJhbmQgPT0gV0wxMjcxX1NDQU5fQkFORF81X0dIWiAmJiB3bDEyNzFfMTFhX2VuYWJsZWQoKSkgewotCQlpZWVlX2JhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOwotCQlyYXRlID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZV81OwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh3bC0+aHctPndpcGh5LT5iYW5kc1tpZWVlX2JhbmRdLT5jaGFubmVscyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNoYW5uZWxzID0gd2wtPmh3LT53aXBoeS0+YmFuZHNbaWVlZV9iYW5kXS0+Y2hhbm5lbHM7Ci0Jbl9jaCA9IHdsLT5ody0+d2lwaHktPmJhbmRzW2llZWVfYmFuZF0tPm5fY2hhbm5lbHM7Ci0KLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU0NBTk5JTkcsICZ3bC0+ZmxhZ3MpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmFtcyA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhcmFtcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwYXJhbXMtPnBhcmFtcy5yeF9jb25maWdfb3B0aW9ucyA9IGNwdV90b19sZTMyKENGR19SWF9BTExfR09PRCk7Ci0JcGFyYW1zLT5wYXJhbXMucnhfZmlsdGVyX29wdGlvbnMgPQotCQljcHVfdG9fbGUzMihDRkdfUlhfUFJTUF9FTiB8IENGR19SWF9NR01UX0VOIHwgQ0ZHX1JYX0JDTl9FTik7Ci0KLQlpZiAoIWFjdGl2ZV9zY2FuKQotCQlzY2FuX29wdGlvbnMgfD0gV0wxMjcxX1NDQU5fT1BUX1BBU1NJVkU7Ci0JaWYgKGhpZ2hfcHJpbykKLQkJc2Nhbl9vcHRpb25zIHw9IFdMMTI3MV9TQ0FOX09QVF9QUklPUklUWV9ISUdIOwotCXBhcmFtcy0+cGFyYW1zLnNjYW5fb3B0aW9ucyA9IGNwdV90b19sZTE2KHNjYW5fb3B0aW9ucyk7Ci0KLQlwYXJhbXMtPnBhcmFtcy5udW1fcHJvYmVfcmVxdWVzdHMgPSBwcm9iZV9yZXF1ZXN0czsKLQlwYXJhbXMtPnBhcmFtcy50eF9yYXRlID0gY3B1X3RvX2xlMzIocmF0ZSk7Ci0JcGFyYW1zLT5wYXJhbXMudGlkX3RyaWdnZXIgPSAwOwotCXBhcmFtcy0+cGFyYW1zLnNjYW5fdGFnID0gV0wxMjcxX1NDQU5fREVGQVVMVF9UQUc7Ci0KLQlpZiAoYmFuZCA9PSBXTDEyNzFfU0NBTl9CQU5EX0RVQUwpCi0JCXBhcmFtcy0+cGFyYW1zLmJhbmQgPSBXTDEyNzFfU0NBTl9CQU5EXzJfNF9HSFo7Ci0JZWxzZQotCQlwYXJhbXMtPnBhcmFtcy5iYW5kID0gYmFuZDsKLQotCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbl9jaCAmJiBpIDwgV0wxMjcxX1NDQU5fTUFYX0NIQU5ORUxTOyBpKyspIHsKLQkJaWYgKCEoY2hhbm5lbHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkpIHsKLQkJCXBhcmFtcy0+Y2hhbm5lbHNbal0ubWluX2R1cmF0aW9uID0KLQkJCQljcHVfdG9fbGUzMihXTDEyNzFfU0NBTl9DSEFOX01JTl9EVVJBVElPTik7Ci0JCQlwYXJhbXMtPmNoYW5uZWxzW2pdLm1heF9kdXJhdGlvbiA9Ci0JCQkJY3B1X3RvX2xlMzIoV0wxMjcxX1NDQU5fQ0hBTl9NQVhfRFVSQVRJT04pOwotCQkJbWVtc2V0KCZwYXJhbXMtPmNoYW5uZWxzW2pdLmJzc2lkX2xzYiwgMHhmZiwgNCk7Ci0JCQltZW1zZXQoJnBhcmFtcy0+Y2hhbm5lbHNbal0uYnNzaWRfbXNiLCAweGZmLCAyKTsKLQkJCXBhcmFtcy0+Y2hhbm5lbHNbal0uZWFybHlfdGVybWluYXRpb24gPSAwOwotCQkJcGFyYW1zLT5jaGFubmVsc1tqXS50eF9wb3dlcl9hdHQgPQotCQkJCVdMMTI3MV9TQ0FOX0NVUlJFTlRfVFhfUFdSOwotCQkJcGFyYW1zLT5jaGFubmVsc1tqXS5jaGFubmVsID0gY2hhbm5lbHNbaV0uaHdfdmFsdWU7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0KLQlwYXJhbXMtPnBhcmFtcy5udW1fY2hhbm5lbHMgPSBqOwotCi0JaWYgKHNzaWRfbGVuICYmIHNzaWQpIHsKLQkJcGFyYW1zLT5wYXJhbXMuc3NpZF9sZW4gPSBzc2lkX2xlbjsKLQkJbWVtY3B5KHBhcmFtcy0+cGFyYW1zLnNzaWQsIHNzaWQsIHNzaWRfbGVuKTsKLQl9Ci0KLQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgc3NpZCwgc3NpZF9sZW4sCi0JCQkJCSBpZSwgaWVfbGVuLCBpZWVlX2JhbmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiUFJPQkUgcmVxdWVzdCB0ZW1wbGF0ZSBmYWlsZWQiKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdHJpZ2dlciA9IGt6YWxsb2Moc2l6ZW9mKCp0cmlnZ2VyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cmlnZ2VyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGRpc2FibGUgdGhlIHRpbWVvdXQgKi8KLQl0cmlnZ2VyLT50aW1lb3V0ID0gMDsKLQotCXJldCA9IHdsMTI3MV9jbWRfc2VuZCh3bCwgQ01EX1RSSUdHRVJfU0NBTl9UTywgdHJpZ2dlciwKLQkJCSAgICAgIHNpemVvZigqdHJpZ2dlciksIDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigidHJpZ2dlciBzY2FuIHRvIGZhaWxlZCBmb3IgaHcgc2NhbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3bDEyNzFfZHVtcChERUJVR19TQ0FOLCAiU0NBTjogIiwgcGFyYW1zLCBzaXplb2YoKnBhcmFtcykpOwotCi0Jc2V0X2JpdChXTDEyNzFfRkxBR19TQ0FOTklORywgJndsLT5mbGFncyk7Ci0JaWYgKHdsMTI3MV8xMWFfZW5hYmxlZCgpKSB7Ci0JCXdsLT5zY2FuLnN0YXRlID0gYmFuZDsKLQkJaWYgKGJhbmQgPT0gV0wxMjcxX1NDQU5fQkFORF9EVUFMKSB7Ci0JCQl3bC0+c2Nhbi5hY3RpdmUgPSBhY3RpdmVfc2NhbjsKLQkJCXdsLT5zY2FuLmhpZ2hfcHJpbyA9IGhpZ2hfcHJpbzsKLQkJCXdsLT5zY2FuLnByb2JlX3JlcXVlc3RzID0gcHJvYmVfcmVxdWVzdHM7Ci0JCQlpZiAoc3NpZF9sZW4gJiYgc3NpZCkgewotCQkJCXdsLT5zY2FuLnNzaWRfbGVuID0gc3NpZF9sZW47Ci0JCQkJbWVtY3B5KHdsLT5zY2FuLnNzaWQsIHNzaWQsIHNzaWRfbGVuKTsKLQkJCX0gZWxzZQotCQkJCXdsLT5zY2FuLnNzaWRfbGVuID0gMDsKLQkJfQotCX0KLQotCXJldCA9IHdsMTI3MV9jbWRfc2VuZCh3bCwgQ01EX1NDQU4sIHBhcmFtcywgc2l6ZW9mKCpwYXJhbXMpLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoIlNDQU4gZmFpbGVkIik7Ci0JCWNsZWFyX2JpdChXTDEyNzFfRkxBR19TQ0FOTklORywgJndsLT5mbGFncyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotb3V0OgotCWtmcmVlKHBhcmFtcyk7Ci0Ja2ZyZWUodHJpZ2dlcik7Ci0JcmV0dXJuIHJldDsKLX0KLQogaW50IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgdGVtcGxhdGVfaWQsCiAJCQkgICAgdm9pZCAqYnVmLCBzaXplX3QgYnVmX2xlbiwgaW50IGluZGV4LCB1MzIgcmF0ZXMpCiB7CkBAIC04MDQsNyArNTY3LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1BTX1BPTEwsIHNrYi0+ZGF0YSwKLQkJCQkgICAgICBza2ItPmxlbiwgMCwgd2wtPmJhc2ljX3JhdGUpOworCQkJCSAgICAgIHNrYi0+bGVuLCAwLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwogCiBvdXQ6CiAJZGV2X2tmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9jbWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfY21kLmgKaW5kZXggZjI4MjBiNC4uYWY1NzdlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9jbWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2NtZC5oCkBAIC00MSw5ICs0MSw2IEBACiBpbnQgd2wxMjcxX2NtZF9wc19tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBwc19tb2RlLCBib29sIHNlbmQpOwogaW50IHdsMTI3MV9jbWRfcmVhZF9tZW1vcnkoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiBhZGRyLCB2b2lkICphbnN3ZXIsCiAJCQkgICBzaXplX3QgbGVuKTsKLWludCB3bDEyNzFfY21kX3NjYW4oc3RydWN0IHdsMTI3MSAqd2wsIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCi0JCSAgICBjb25zdCB1OCAqaWUsIHNpemVfdCBpZV9sZW4sIHU4IGFjdGl2ZV9zY2FuLAotCQkgICAgdTggaGlnaF9wcmlvLCB1OCBiYW5kLCB1OCBwcm9iZV9yZXF1ZXN0cyk7CiBpbnQgd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiB0ZW1wbGF0ZV9pZCwKIAkJCSAgICB2b2lkICpidWYsIHNpemVfdCBidWZfbGVuLCBpbnQgaW5kZXgsIHUzMiByYXRlcyk7CiBpbnQgd2wxMjcxX2NtZF9idWlsZF9udWxsX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wpOwpAQCAtMTM2LDE0ICsxMzMsMTQgQEAKIAlfX2xlMTYgc3RhdHVzOwogCS8qIHBheWxvYWQgKi8KIAl1OCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdMMTI3MV9DTURfTUFYX1BBUkFNUyA1NzIKIAogc3RydWN0IHdsMTI3MV9jb21tYW5kIHsKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF9oZWFkZXIgaGVhZGVyOwogCXU4ICBwYXJhbWV0ZXJzW1dMMTI3MV9DTURfTUFYX1BBUkFNU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewogCUNNRF9NQUlMQk9YX0lETEUJCT0gIDAsCkBAIC0xOTYsNyArMTkzLDcgQEAKIAkgICBvZiB0aGlzIGZpZWxkIGlzIHRoZSBIb3N0IGluIFdSSVRFIGNvbW1hbmQgb3IgdGhlIFdpbGluayBpbiBSRUFECiAJICAgY29tbWFuZC4gKi8KIAl1OCB2YWx1ZVtNQVhfUkVBRF9TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBDTURNQk9YX0hFQURFUl9MRU4gNAogI2RlZmluZSBDTURNQk9YX0lORk9fRUxFTV9IRUFERVJfTEVOIDQKQEAgLTI0MywxNCArMjQwLDE0IEBACiAJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRV07CiAJdTggY3RybDsgLyogSk9JTl9DTURfQ1RSTF8qICovCiAJdTggcmVzZXJ2ZWRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjbWRfZW5hYmxlZGlzYWJsZV9wYXRoIHsKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF9oZWFkZXIgaGVhZGVyOwogCiAJdTggY2hhbm5lbDsKIAl1OCBwYWRkaW5nWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdMMTI3MV9SQVRFX0FVVE9NQVRJQyAgMAogCkBAIC0yNjYsNyArMjYzLDcgQEAKIAl1OCBhZmxhZ3M7CiAJdTggcmVzZXJ2ZWQ7CiAJdTggdGVtcGxhdGVfZGF0YVtXTDEyNzFfQ01EX1RFTVBMX01BWF9TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBUSU1fRUxFX0lEICAgIDUKICNkZWZpbmUgUEFSVElBTF9WQk1fTUFYICAgIDI1MQpAQCAtMjc4LDcgKzI3NSw3IEBACiAJdTggZHRpbV9wZXJpb2Q7CiAJdTggYml0bWFwX2N0cmw7CiAJdTggcHZiX2ZpZWxkW1BBUlRJQUxfVkJNX01BWF07IC8qIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSB3bDEyNzFfY21kX3BzX21vZGUgewogCVNUQVRJT05fQUNUSVZFX01PREUsCkBAIC0yOTgsNyArMjk1LDcgQEAKIAkgICovCiAJdTggaGFuZ19vdmVyX3BlcmlvZDsKIAlfX2xlMzIgbnVsbF9kYXRhX3JhdGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIEhXIGVuY3J5cHRpb24ga2V5cyAqLwogI2RlZmluZSBOVU1fQUNDRVNTX0NBVEVHT1JJRVNfQ09QWSA0CkBAIC0zNDgsNzcgKzM0NSwxMiBAQAogCXU4IGtleVtNQVhfS0VZX1NJWkVdOwogCV9fbGUxNiBhY19zZXFfbnVtMTZbTlVNX0FDQ0VTU19DQVRFR09SSUVTX0NPUFldOwogCV9fbGUzMiBhY19zZXFfbnVtMzJbTlVNX0FDQ0VTU19DQVRFR09SSUVTX0NPUFldOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotI2RlZmluZSBXTDEyNzFfU0NBTl9NQVhfQ0hBTk5FTFMgICAgICAgMjQKLSNkZWZpbmUgV0wxMjcxX1NDQU5fREVGQVVMVF9UQUcgICAgICAgIDEKLSNkZWZpbmUgV0wxMjcxX1NDQU5fQ1VSUkVOVF9UWF9QV1IgICAgIDAKLSNkZWZpbmUgV0wxMjcxX1NDQU5fT1BUX0FDVElWRSAgICAgICAgIDAKLSNkZWZpbmUgV0wxMjcxX1NDQU5fT1BUX1BBU1NJVkUJICAgICAgIDEKLSNkZWZpbmUgV0wxMjcxX1NDQU5fT1BUX1BSSU9SSVRZX0hJR0ggIDQKLSNkZWZpbmUgV0wxMjcxX1NDQU5fQ0hBTl9NSU5fRFVSQVRJT04gIDMwMDAwICAvKiBUVSAqLwotI2RlZmluZSBXTDEyNzFfU0NBTl9DSEFOX01BWF9EVVJBVElPTiAgNjAwMDAgIC8qIFRVICovCi0jZGVmaW5lIFdMMTI3MV9TQ0FOX0JBTkRfMl80X0dIWiAwCi0jZGVmaW5lIFdMMTI3MV9TQ0FOX0JBTkRfNV9HSFogMQotI2RlZmluZSBXTDEyNzFfU0NBTl9CQU5EX0RVQUwgMgotCi1zdHJ1Y3QgYmFzaWNfc2Nhbl9wYXJhbXMgewotCV9fbGUzMiByeF9jb25maWdfb3B0aW9uczsKLQlfX2xlMzIgcnhfZmlsdGVyX29wdGlvbnM7Ci0JLyogU2NhbiBvcHRpb24gZmxhZ3MgKFdMMTI3MV9TQ0FOX09QVF8qKSAqLwotCV9fbGUxNiBzY2FuX29wdGlvbnM7Ci0JLyogTnVtYmVyIG9mIHNjYW4gY2hhbm5lbHMgaW4gdGhlIGxpc3QgKG1heGltdW0gMzApICovCi0JdTggbnVtX2NoYW5uZWxzOwotCS8qIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcHJvYmUgcmVxdWVzdHMgdG8gc2VuZAotCSAgIHBlciBjaGFubmVsIGZvciBhbiBhY3RpdmUgc2NhbiAqLwotCXU4IG51bV9wcm9iZV9yZXF1ZXN0czsKLQkvKiBSYXRlIGJpdCBmaWVsZCBmb3Igc2VuZGluZyB0aGUgcHJvYmVzICovCi0JX19sZTMyIHR4X3JhdGU7Ci0JdTggdGlkX3RyaWdnZXI7Ci0JdTggc3NpZF9sZW47Ci0JLyogaW4gb3JkZXIgdG8gYWxpZ24gKi8KLQl1OCBwYWRkaW5nMVsyXTsKLQl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsKLQkvKiBCYW5kIHRvIHNjYW4gKi8KLQl1OCBiYW5kOwotCXU4IHVzZV9zc2lkX2xpc3Q7Ci0JdTggc2Nhbl90YWc7Ci0JdTggcGFkZGluZzI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGJhc2ljX3NjYW5fY2hhbm5lbF9wYXJhbXMgewotCS8qIER1cmF0aW9uIGluIFRVIHRvIHdhaXQgZm9yIGZyYW1lcyBvbiBhIGNoYW5uZWwgZm9yIGFjdGl2ZSBzY2FuICovCi0JX19sZTMyIG1pbl9kdXJhdGlvbjsKLQlfX2xlMzIgbWF4X2R1cmF0aW9uOwotCV9fbGUzMiBic3NpZF9sc2I7Ci0JX19sZTE2IGJzc2lkX21zYjsKLQl1OCBlYXJseV90ZXJtaW5hdGlvbjsKLQl1OCB0eF9wb3dlcl9hdHQ7Ci0JdTggY2hhbm5lbDsKLQkvKiBGVyBpbnRlcm5hbCB1c2Ugb25seSEgKi8KLQl1OCBkZnNfY2FuZGlkYXRlOwotCXU4IGFjdGl2aXR5X2RldGVjdGVkOwotCXU4IHBhZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3Qgd2wxMjcxX2NtZF9zY2FuIHsKLQlzdHJ1Y3Qgd2wxMjcxX2NtZF9oZWFkZXIgaGVhZGVyOwotCi0Jc3RydWN0IGJhc2ljX3NjYW5fcGFyYW1zIHBhcmFtczsKLQlzdHJ1Y3QgYmFzaWNfc2Nhbl9jaGFubmVsX3BhcmFtcyBjaGFubmVsc1tXTDEyNzFfU0NBTl9NQVhfQ0hBTk5FTFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCB3bDEyNzFfY21kX3RyaWdnZXJfc2Nhbl90byB7Ci0Jc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIGhlYWRlcjsKLQotCV9fbGUzMiB0aW1lb3V0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wxMjcxX2NtZF90ZXN0X2hlYWRlciB7CiAJdTggaWQ7CiAJdTggcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogZW51bSB3bDEyNzFfY2hhbm5lbF90dW5lX2JhbmRzIHsKIAlXTDEyNzFfQ0hBTk5FTF9UVU5FX0JBTkRfMl80LApAQCAtNDM5LDI1ICszNzEsMzEgQEAKIAogCXN0cnVjdCB3bDEyNzFfY21kX3Rlc3RfaGVhZGVyIHRlc3Q7CiAKLQl1OCBwYXJhbXNbV0wxMjcxX05WU19HRU5FUkFMX1BBUkFNU19TSVpFXTsKLQlzOCByZXNlcnZlZFsyM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwlzdHJ1Y3Qgd2wxMjcxX2luaV9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKIAotI2RlZmluZSBXTDEyNzFfU1RBVF9SQURJT19QQVJBTVNfNV9TSVpFICAgIDI5Ci0jZGVmaW5lIFdMMTI3MV9EWU5fUkFESU9fUEFSQU1TXzVfU0laRSAgICAxMDQKKwl1OCBzcl9kZWJ1Z190YWJsZVtXTDEyNzFfSU5JX01BWF9TTUFSVF9SRUZMRVhfUEFSQU1dOworCXU4IHNyX3Nlbl9uX3A7CisJdTggc3Jfc2VuX25fcF9nYWluOworCXU4IHNyX3Nlbl9ucm47CisJdTggc3Jfc2VuX3BybjsKKwl1OCBwYWRkaW5nWzNdOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTI3MV9yYWRpb19wYXJtc19jbWQgewogCXN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CiAKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF90ZXN0X2hlYWRlciB0ZXN0OwogCi0JdTggc3RhdF9yYWRpb19wYXJhbXNbV0wxMjcxX05WU19TVEFUX1JBRElPX1BBUkFNU19TSVpFXTsKLQl1OCBzdGF0X3JhZGlvX3BhcmFtc181W1dMMTI3MV9TVEFUX1JBRElPX1BBUkFNU181X1NJWkVdOworCS8qIFN0YXRpYyByYWRpbyBwYXJhbWV0ZXJzICovCisJc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfMiBzdGF0aWNfcGFyYW1zXzI7CisJc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfNSBzdGF0aWNfcGFyYW1zXzU7CiAKLQl1OCBkeW5fcmFkaW9fcGFyYW1zW1dMMTI3MV9OVlNfRFlOX1JBRElPX1BBUkFNU19TSVpFXTsKLQl1OCByZXNlcnZlZDsKLQl1OCBkeW5fcmFkaW9fcGFyYW1zXzVbV0wxMjcxX0RZTl9SQURJT19QQVJBTVNfNV9TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCS8qIER5bmFtaWMgcmFkaW8gcGFyYW1ldGVycyAqLworCXN0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfMiBkeW5fcGFyYW1zXzI7CisJdTggcGFkZGluZzI7CisJc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc181IGR5bl9wYXJhbXNfNTsKKwl1OCBwYWRkaW5nM1syXTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNzFfY21kX2NhbF9jaGFubmVsX3R1bmUgewogCXN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CkBAIC00NjgsNyArNDA2LDcgQEAKIAl1OCBjaGFubmVsOwogCiAJX19sZTE2IHJhZGlvX3N0YXR1czsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTI3MV9jbWRfY2FsX3VwZGF0ZV9yZWZfcG9pbnQgewogCXN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CkBAIC00NzksNyArNDE3LDcgQEAKIAlfX2xlMzIgcmVmX2RldGVjdG9yOwogCXU4ICBzdWJfYmFuZDsKIAl1OCAgcGFkZGluZ1szXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNQVhfVExWX0xFTkdUSCAgICAgICAgIDQwMAogI2RlZmluZQlNQVhfTlZTX1ZFUlNJT05fTEVOR1RIIDEyCkBAIC01MDEsNyArNDM5LDcgQEAKIAogCXU4ICBzdWJfYmFuZF9tYXNrOwogCXU4ICBwYWRkaW5nMjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKgpAQCAtNTI5LDYgKzQ2Nyw2IEBACiAJdTggIHR5cGU7CiAKIAl1OCAgcGFkZGluZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2VuZGlmIC8qIF9fV0wxMjcxX0NNRF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfY29uZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9jb25mLmgKaW5kZXggZDA0NmQwNC4uMDQzNWZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9jb25mLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9jb25mLmgKQEAgLTg3NCw2ICs4NzQsMTMgQEAKIAl1OCBwc19wb2xsX3RocmVzaG9sZDsKIAogCS8qCisJICogUFMgUG9sbCBmYWlsdXJlIHJlY292ZXJ5IEFDVElWRSBwZXJpb2QgbGVuZ3RoCisJICoKKwkgKiBSYW5nZTogdTMyIChtcykKKwkgKi8KKwl1MzIgcHNfcG9sbF9yZWNvdmVyeV9wZXJpb2Q7CisKKwkvKgogCSAqIENvbmZpZ3VyYXRpb24gb2Ygc2lnbmFsIGF2ZXJhZ2Ugd2VpZ2h0cy4KIAkgKi8KIAlzdHJ1Y3QgY29uZl9zaWdfd2VpZ2h0cyBzaWdfd2VpZ2h0czsKQEAgLTk0OCwxNCArOTU1LDYgQEAKIAl1OCBmZW07CiB9OwogCi1zdHJ1Y3QgY29uZl9pbml0X3NldHRpbmdzIHsKLQkvKgotCSAqIENvbmZpZ3VyZSByYWRpbyBwYXJhbWV0ZXJzLgotCSAqLwotCXN0cnVjdCBjb25mX3JhZGlvX3Bhcm1zIHJhZGlvcGFyYW07Ci0KLX07Ci0KIHN0cnVjdCBjb25mX2l0cmltX3NldHRpbmdzIHsKIAkvKiBlbmFibGUgZGNvIGl0cmltICovCiAJdTggZW5hYmxlOwpAQCAtMTAyMiw3ICsxMDIxLDYgQEAKIAlzdHJ1Y3QgY29uZl9yeF9zZXR0aW5ncyByeDsKIAlzdHJ1Y3QgY29uZl90eF9zZXR0aW5ncyB0eDsKIAlzdHJ1Y3QgY29uZl9jb25uX3NldHRpbmdzIGNvbm47Ci0Jc3RydWN0IGNvbmZfaW5pdF9zZXR0aW5ncyBpbml0OwogCXN0cnVjdCBjb25mX2l0cmltX3NldHRpbmdzIGl0cmltOwogCXN0cnVjdCBjb25mX3BtX2NvbmZpZ19zZXR0aW5ncyBwbV9jb25maWc7CiAJc3RydWN0IGNvbmZfcm9hbV90cmlnZ2VyX3NldHRpbmdzIHJvYW1fdHJpZ2dlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfZXZlbnQuYwppbmRleCBjZjM3YWE2Li4yNWNlMmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2V2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9ldmVudC5jCkBAIC0yNiwzNiArMjYsNjQgQEAKICNpbmNsdWRlICJ3bDEyNzFfaW8uaCIKICNpbmNsdWRlICJ3bDEyNzFfZXZlbnQuaCIKICNpbmNsdWRlICJ3bDEyNzFfcHMuaCIKKyNpbmNsdWRlICJ3bDEyNzFfc2Nhbi5oIgogI2luY2x1ZGUgIndsMTJ4eF84MDIxMS5oIgogCi1zdGF0aWMgaW50IHdsMTI3MV9ldmVudF9zY2FuX2NvbXBsZXRlKHN0cnVjdCB3bDEyNzEgKndsLAotCQkJCSAgICAgIHN0cnVjdCBldmVudF9tYWlsYm94ICptYm94KQordm9pZCB3bDEyNzFfcHNwb2xsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwgInN0YXR1czogMHgleCIsCi0JCSAgICAgbWJveC0+c2NoZWR1bGVkX3NjYW5fc3RhdHVzKTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgd2wxMjcxICp3bDsKIAotCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19TQ0FOTklORywgJndsLT5mbGFncykpIHsKLQkJaWYgKHdsLT5zY2FuLnN0YXRlID09IFdMMTI3MV9TQ0FOX0JBTkRfRFVBTCkgewotCQkJLyogMi40IEdIeiBiYW5kIHNjYW5uZWQsIHNjYW4gNSBHSHogYmFuZCwgcHJldGVuZAotCQkJICogdG8gdGhlIHdsMTI3MV9jbWRfc2NhbiBmdW5jdGlvbiB0aGF0IHdlIGFyZSBub3QKLQkJCSAqIHNjYW5uaW5nIGFzIGl0IGNoZWNrcyB0aGF0LgotCQkJICovCi0JCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfU0NBTk5JTkcsICZ3bC0+ZmxhZ3MpOwotCQkJLyogRklYTUU6IGllIG1pc3NpbmchICovCi0JCQl3bDEyNzFfY21kX3NjYW4od2wsIHdsLT5zY2FuLnNzaWQsIHdsLT5zY2FuLnNzaWRfbGVuLAotCQkJCQkJTlVMTCwgMCwKLQkJCQkJCXdsLT5zY2FuLmFjdGl2ZSwKLQkJCQkJCXdsLT5zY2FuLmhpZ2hfcHJpbywKLQkJCQkJCVdMMTI3MV9TQ0FOX0JBTkRfNV9HSFosCi0JCQkJCQl3bC0+c2Nhbi5wcm9iZV9yZXF1ZXN0cyk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJndsLT5tdXRleCk7Ci0JCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQod2wtPmh3LCBmYWxzZSk7Ci0JCQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NDQU5OSU5HLCAmd2wtPmZsYWdzKTsKLQkJfQorCWR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXdsID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3Qgd2wxMjcxLCBwc3BvbGxfd29yayk7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJwc3BvbGwgd29yayIpOworCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2wtPmZsYWdzKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIGlmIHdlIGVuZCB1cCBoZXJlLCB0aGVuIHdlIHdlcmUgaW4gcG93ZXJzYXZlIHdoZW4gdGhlIHBzcG9sbAorCSAqIGRlbGl2ZXJ5IGZhaWx1cmUgb2NjdXJyZWQsIGFuZCBuby1vbmUgY2hhbmdlZCBzdGF0ZSBzaW5jZSwgc28KKwkgKiB3ZSBzaG91bGQgZ28gYmFjayB0byBwb3dlcnNhdmUuCisJICovCisJd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERSwgdHJ1ZSk7CisKK291dDoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7Cit9OworCitzdGF0aWMgdm9pZCB3bDEyNzFfZXZlbnRfcHNwb2xsX2RlbGl2ZXJ5X2ZhaWwoc3RydWN0IHdsMTI3MSAqd2wpCit7CisJaW50IGRlbGF5ID0gd2wtPmNvbmYuY29ubi5wc19wb2xsX3JlY292ZXJ5X3BlcmlvZDsKKwlpbnQgcmV0OworCisJd2wtPnBzX3BvbGxfZmFpbHVyZXMrKzsKKwlpZiAod2wtPnBzX3BvbGxfZmFpbHVyZXMgPT0gMSkKKwkJd2wxMjcxX2luZm8oIkFQIHdpdGggZHlzZnVuY3Rpb25hbCBwcy1wb2xsLCAiCisJCQkgICAgInRyeWluZyB0byB3b3JrIGFyb3VuZCBpdC4iKTsKKworCS8qIGZvcmNlIGFjdGl2ZSBtb2RlIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBBUCAqLworCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpKSB7CisJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgU1RBVElPTl9BQ1RJVkVfTU9ERSwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuOworCQlzZXRfYml0KFdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2wtPmZsYWdzKTsKKwkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayh3bC0+aHcsICZ3bC0+cHNwb2xsX3dvcmssCisJCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCX0KLQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgYWxyZWFkeSBpbiBhY3RpdmUgbW9kZSwgbGV0cyB3ZSBzaG91bGQgYmUgZ2V0dGluZyBkYXRhIGZyb20KKwkgKiB0aGUgQVAgcmlnaHQgYXdheS4gSWYgd2UgZW50ZXIgUFNNIHRvbyBmYXN0IGFmdGVyIHRoaXMsIGFuZCBkYXRhCisJICogcmVtYWlucyBvbiB0aGUgQVAsIHdlIHdpbGwgZ2V0IGFub3RoZXIgZXZlbnQgbGlrZSB0aGlzLCBhbmQgd2UnbGwKKwkgKiBnbyBpbnRvIGFjdGl2ZSBvbmNlIG1vcmUuCisJICovCiB9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX2V2ZW50X3BzX3JlcG9ydChzdHJ1Y3Qgd2wxMjcxICp3bCwKQEAgLTE2Myw5ICsxOTEsMTkgQEAKIAl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJ2ZWN0b3I6IDB4JXgiLCB2ZWN0b3IpOwogCiAJaWYgKHZlY3RvciAmIFNDQU5fQ09NUExFVEVfRVZFTlRfSUQpIHsKLQkJcmV0ID0gd2wxMjcxX2V2ZW50X3NjYW5fY29tcGxldGUod2wsIG1ib3gpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwgInN0YXR1czogMHgleCIsCisJCQkgICAgIG1ib3gtPnNjaGVkdWxlZF9zY2FuX3N0YXR1cyk7CisKKwkJd2wxMjcxX3NjYW5fc3RtKHdsKTsKKwl9CisKKwkvKiBkaXNhYmxlIGR5bmFtaWMgUFMgd2hlbiByZXF1ZXN0ZWQgYnkgdGhlIGZpcm13YXJlICovCisJaWYgKHZlY3RvciAmIFNPRlRfR0VNSU5JX1NFTlNFX0VWRU5UX0lEICYmCisJICAgIHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKSB7CisJCWlmIChtYm94LT5zb2Z0X2dlbWluaV9zZW5zZV9pbmZvKQorCQkJaWVlZTgwMjExX2Rpc2FibGVfZHluX3BzKHdsLT52aWYpOworCQllbHNlCisJCQlpZWVlODAyMTFfZW5hYmxlX2R5bl9wcyh3bC0+dmlmKTsKIAl9CiAKIAkvKgpAQCAtMTkxLDYgKzIyOSw5IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmICh2ZWN0b3IgJiBQU1BPTExfREVMSVZFUllfRkFJTFVSRV9FVkVOVF9JRCkKKwkJd2wxMjcxX2V2ZW50X3BzcG9sbF9kZWxpdmVyeV9mYWlsKHdsKTsKKwogCWlmICh2ZWN0b3IgJiBSU1NJX1NOUl9UUklHR0VSXzBfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiUlNTSV9TTlJfVFJJR0dFUl8wX0VWRU5UIik7CiAJCWlmICh3bC0+dmlmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9ldmVudC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9ldmVudC5oCmluZGV4IDU4MzcxMDAuLmU0NzUxNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfZXZlbnQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2V2ZW50LmgKQEAgLTg1LDcgKzg1LDcgQEAKIAlfX2xlMzIgcmVwb3J0XzE7CiAJX19sZTMyIHJlcG9ydF8yOwogCV9fbGUzMiByZXBvcnRfMzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBOVU1fT0ZfUlNTSV9TTlJfVFJJR0dFUlMgOAogCkBAIC0xMTYsMTAgKzExNiwxMSBAQAogCXU4IHBzX3N0YXR1czsKIAogCXU4IHJlc2VydmVkXzVbMjldOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBpbnQgd2wxMjcxX2V2ZW50X3VubWFzayhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiB2b2lkIHdsMTI3MV9ldmVudF9tYm94X2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX2V2ZW50X2hhbmRsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggbWJveCk7Cit2b2lkIHdsMTI3MV9wc3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfaW5pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2luaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTMwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX2luaS5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2Ygd2wxMjcxCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdDogTHVjaWFubyBDb2VsaG8gPGx1Y2lhbm8uY29lbGhvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19XTDEyNzFfSU5JX0hfXworI2RlZmluZSBfX1dMMTI3MV9JTklfSF9fCisKKyNkZWZpbmUgV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNIDE2CisKK3N0cnVjdCB3bDEyNzFfaW5pX2dlbmVyYWxfcGFyYW1zIHsKKwl1OCByZWZfY2xvY2s7CisJdTggc2V0dGxpbmdfdGltZTsKKwl1OCBjbGtfdmFsaWRfb25fd2FrZXVwOworCXU4IGRjMmRjX21vZGU7CisJdTggZHVhbF9tb2RlX3NlbGVjdDsKKwl1OCB0eF9iaXBfZmVtX2F1dG9fZGV0ZWN0OworCXU4IHR4X2JpcF9mZW1fbWFudWZhY3R1cmVyOworCXU4IGdlbmVyYWxfc2V0dGluZ3M7CisJdTggc3Jfc3RhdGU7CisJdTggc3JmMVtXTDEyNzFfSU5JX01BWF9TTUFSVF9SRUZMRVhfUEFSQU1dOworCXU4IHNyZjJbV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNXTsKKwl1OCBzcmYzW1dMMTI3MV9JTklfTUFYX1NNQVJUX1JFRkxFWF9QQVJBTV07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFdMMTI3MV9JTklfUlNTSV9QUk9DRVNTX0NPTVBFTlNfU0laRSAxNQorCitzdHJ1Y3Qgd2wxMjcxX2luaV9iYW5kX3BhcmFtc18yIHsKKwl1OCByeF90cmFjZV9pbnNlcnRpb25fbG9zczsKKwl1OCB0eF90cmFjZV9sb3NzOworCXU4IHJ4X3Jzc2lfcHJvY2Vzc19jb21wZW5zW1dMMTI3MV9JTklfUlNTSV9QUk9DRVNTX0NPTVBFTlNfU0laRV07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFdMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVCA2CisjZGVmaW5lIFdMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yIDE0CisKK3N0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfMiB7CisJX19sZTE2IHR4X2JpcF9yZWZfcGRfdm9sdGFnZTsKKwl1OCB0eF9iaXBfcmVmX3Bvd2VyOworCXU4IHR4X2JpcF9yZWZfb2Zmc2V0OworCXU4IHR4X3Blcl9yYXRlX3B3cl9saW1pdHNfbm9ybWFsW1dMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVF07CisJdTggdHhfcGVyX3JhdGVfcHdyX2xpbWl0c19kZWdyYWRlZFtXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOworCXU4IHR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZXh0cmVtZVtXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOworCXU4IHR4X3Blcl9jaGFuX3B3cl9saW1pdHNfMTFiW1dMMTI3MV9JTklfQ0hBTk5FTF9DT1VOVF8yXTsKKwl1OCB0eF9wZXJfY2hhbl9wd3JfbGltaXRzX29mZG1bV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzJdOworCXU4IHR4X3BkX3ZzX3JhdGVfb2Zmc2V0c1tXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOworCXU4IHR4X2liaWFzW1dMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVF07CisJdTggcnhfZmVtX2luc2VydGlvbl9sb3NzOworCXU4IGRlZ3JhZGVkX2xvd190b19ub3JtYWxfdGhyOworCXU4IG5vcm1hbF90b19kZWdyYWRlZF9oaWdoX3RocjsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgV0wxMjcxX0lOSV9DSEFOTkVMX0NPVU5UXzUgMzUKKyNkZWZpbmUgV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81IDcKKworc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfNSB7CisJdTggcnhfdHJhY2VfaW5zZXJ0aW9uX2xvc3NbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKKwl1OCB0eF90cmFjZV9sb3NzW1dMMTI3MV9JTklfU1VCX0JBTkRfQ09VTlRfNV07CisJdTggcnhfcnNzaV9wcm9jZXNzX2NvbXBlbnNbV0wxMjcxX0lOSV9SU1NJX1BST0NFU1NfQ09NUEVOU19TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfNSB7CisJX19sZTE2IHR4X2JpcF9yZWZfcGRfdm9sdGFnZVtXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzVdOworCXU4IHR4X2JpcF9yZWZfcG93ZXJbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKKwl1OCB0eF9iaXBfcmVmX29mZnNldFtXTDEyNzFfSU5JX1NVQl9CQU5EX0NPVU5UXzVdOworCXU4IHR4X3Blcl9yYXRlX3B3cl9saW1pdHNfbm9ybWFsW1dMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVF07CisJdTggdHhfcGVyX3JhdGVfcHdyX2xpbWl0c19kZWdyYWRlZFtXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOworCXU4IHR4X3Blcl9yYXRlX3B3cl9saW1pdHNfZXh0cmVtZVtXTDEyNzFfSU5JX1JBVEVfR1JPVVBfQ09VTlRdOworCXU4IHR4X3Blcl9jaGFuX3B3cl9saW1pdHNfb2ZkbVtXTDEyNzFfSU5JX0NIQU5ORUxfQ09VTlRfNV07CisJdTggdHhfcGRfdnNfcmF0ZV9vZmZzZXRzW1dMMTI3MV9JTklfUkFURV9HUk9VUF9DT1VOVF07CisJdTggdHhfaWJpYXNbV0wxMjcxX0lOSV9SQVRFX0dST1VQX0NPVU5UXTsKKwl1OCByeF9mZW1faW5zZXJ0aW9uX2xvc3NbV0wxMjcxX0lOSV9TVUJfQkFORF9DT1VOVF81XTsKKwl1OCBkZWdyYWRlZF9sb3dfdG9fbm9ybWFsX3RocjsKKwl1OCBub3JtYWxfdG9fZGVncmFkZWRfaGlnaF90aHI7Cit9IF9fcGFja2VkOworCisKKy8qIE5WUyBkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZSBXTDEyNzFfSU5JX05WU19TRUNUSU9OX1NJWkUJCSAgICAgNDY4CisjZGVmaW5lIFdMMTI3MV9JTklfRkVNX01PRFVMRV9DT1VOVCAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBXTDEyNzFfSU5JX0xFR0FDWV9OVlNfRklMRV9TSVpFICAgICAgICAgICAgICA4MDAKKworc3RydWN0IHdsMTI3MV9udnNfZmlsZSB7CisJLyogTlZTIHNlY3Rpb24gKi8KKwl1OCBudnNbV0wxMjcxX0lOSV9OVlNfU0VDVElPTl9TSVpFXTsKKworCS8qIElOSSBzZWN0aW9uICovCisJc3RydWN0IHdsMTI3MV9pbmlfZ2VuZXJhbF9wYXJhbXMgZ2VuZXJhbF9wYXJhbXM7CisJdTggcGFkZGluZzE7CisJc3RydWN0IHdsMTI3MV9pbmlfYmFuZF9wYXJhbXNfMiBzdGF0X3JhZGlvX3BhcmFtc18yOworCXU4IHBhZGRpbmcyOworCXN0cnVjdCB7CisJCXN0cnVjdCB3bDEyNzFfaW5pX2ZlbV9wYXJhbXNfMiBwYXJhbXM7CisJCXU4IHBhZGRpbmc7CisJfSBkeW5fcmFkaW9fcGFyYW1zXzJbV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UXTsKKwlzdHJ1Y3Qgd2wxMjcxX2luaV9iYW5kX3BhcmFtc181IHN0YXRfcmFkaW9fcGFyYW1zXzU7CisJdTggcGFkZGluZzM7CisJc3RydWN0IHsKKwkJc3RydWN0IHdsMTI3MV9pbmlfZmVtX3BhcmFtc181IHBhcmFtczsKKwkJdTggcGFkZGluZzsKKwl9IGR5bl9yYWRpb19wYXJhbXNfNVtXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlRdOworfSBfX3BhY2tlZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfbWFpbi5jCmluZGV4IGI3ZDkxMzcuLjlkNjhmMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfbWFpbi5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC00NSw2ICs0NCw3IEBACiAjaW5jbHVkZSAid2wxMjcxX2NtZC5oIgogI2luY2x1ZGUgIndsMTI3MV9ib290LmgiCiAjaW5jbHVkZSAid2wxMjcxX3Rlc3Rtb2RlLmgiCisjaW5jbHVkZSAid2wxMjcxX3NjYW4uaCIKIAogI2RlZmluZSBXTDEyNzFfQk9PVF9SRVRSSUVTIDMKIApAQCAtNTUsNyArNTUsNyBAQAogCQkJW0NPTkZfU0dfSFYzX01BWF9PVkVSUklERV0gICAgICAgICAgICAgICAgICA9IDAsCiAJCQlbQ09ORl9TR19CVF9ORlNfU0FNUExFX0lOVEVSVkFMXSAgICAgICAgICAgID0gNDAwLAogCQkJW0NPTkZfU0dfQlRfTE9BRF9SQVRJT10gICAgICAgICAgICAgICAgICAgICA9IDUwLAotCQkJW0NPTkZfU0dfQVVUT19QU19NT0RFXSAgICAgICAgICAgICAgICAgICAgICA9IDAsCisJCQlbQ09ORl9TR19BVVRPX1BTX01PREVdICAgICAgICAgICAgICAgICAgICAgID0gMSwKIAkJCVtDT05GX1NHX0FVVE9fU0NBTl9QUk9CRV9SRVFdICAgICAgICAgICAgICAgPSAxNzAsCiAJCQlbQ09ORl9TR19BQ1RJVkVfU0NBTl9EVVJBVElPTl9GQUNUT1JfSFYzXSAgID0gNTAsCiAJCQlbQ09ORl9TR19BTlRFTk5BX0NPTkZJR1VSQVRJT05dICAgICAgICAgICAgID0gMCwKQEAgLTIzNCwxOCArMjM0LDE0IEBACiAJCS5iZWFjb25fcnhfdGltZW91dCAgICAgICAgICAgPSAxMDAwMCwKIAkJLmJyb2FkY2FzdF90aW1lb3V0ICAgICAgICAgICA9IDIwMDAwLAogCQkucnhfYnJvYWRjYXN0X2luX3BzICAgICAgICAgID0gMSwKLQkJLnBzX3BvbGxfdGhyZXNob2xkICAgICAgICAgICA9IDIwLAorCQkucHNfcG9sbF90aHJlc2hvbGQgICAgICAgICAgID0gMTAsCisJCS5wc19wb2xsX3JlY292ZXJ5X3BlcmlvZCAgICAgPSA3MDAsCiAJCS5iZXRfZW5hYmxlICAgICAgICAgICAgICAgICAgPSBDT05GX0JFVF9NT0RFX0VOQUJMRSwKIAkJLmJldF9tYXhfY29uc2VjdXRpdmUgICAgICAgICA9IDEwLAogCQkucHNtX2VudHJ5X3JldHJpZXMgICAgICAgICAgID0gMywKIAkJLmtlZXBfYWxpdmVfaW50ZXJ2YWwgICAgICAgICA9IDU1MDAwLAogCQkubWF4X2xpc3Rlbl9pbnRlcnZhbCAgICAgICAgID0gMjAsCiAJfSwKLQkuaW5pdCA9IHsKLQkJLnJhZGlvcGFyYW0gPSB7Ci0JCQkuZmVtICAgICAgICAgICAgICAgICA9IDEsCi0JCX0KLQl9LAogCS5pdHJpbSA9IHsKIAkJLmVuYWJsZSA9IGZhbHNlLAogCQkudGltZW91dCA9IDUwMDAwLApAQCAtNTY2LDE0ICs1NjIsMjEgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoZnctPnNpemUgIT0gc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpKSB7CisJLyoKKwkgKiBGSVhNRTogdGhlIExFR0FDWSBOVlMgaW1hZ2Ugc3VwcG9ydCAoTlZTJ3MgbWlzc2luZyB0aGUgNUdIeiBiYW5kCisJICogY29uZmlndXJhdGlvbnMpIGNhbiBiZSByZW1vdmVkIHdoZW4gdGhvc2UgTlZTIGZpbGVzIHN0b3AgZmxvYXRpbmcKKwkgKiBhcm91bmQuCisJICovCisJaWYgKGZ3LT5zaXplICE9IHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSAmJgorCSAgICAoZnctPnNpemUgIT0gV0wxMjcxX0lOSV9MRUdBQ1lfTlZTX0ZJTEVfU0laRSB8fAorCSAgICAgd2wxMjcxXzExYV9lbmFibGVkKCkpKSB7CiAJCXdsMTI3MV9lcnJvcigibnZzIHNpemUgaXMgbm90IGFzIGV4cGVjdGVkOiAlenUgIT0gJXp1IiwKIAkJCSAgICAgZnctPnNpemUsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSk7CiAJCXJldCA9IC1FSUxTRVE7CiAJCWdvdG8gb3V0OwogCX0KIAotCXdsLT5udnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSwgR0ZQX0tFUk5FTCk7CisJd2wtPm52cyA9IGttZW1kdXAoZnctPmRhdGEsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXdsLT5udnMpIHsKIAkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbnZzIGZpbGUiKTsKQEAgLTU4MSw4ICs1ODQsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQltZW1jcHkod2wtPm52cywgZnctPmRhdGEsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSk7Ci0KIG91dDoKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIApAQCAtODExLDkzICs4MTIsNiBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2Rldl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICptZSwgdW5zaWduZWQgbG9uZyB3aGF0LAotCQkJICAgICB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXN0cnVjdCB3aXBoeSAqd2lwaHk7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0Jc3RydWN0IHdsMTI3MSAqd2w7Ci0Jc3RydWN0IHdsMTI3MSAqd2xfdGVtcDsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppZGV2OwotCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGFyZzsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIEZJWE1FOiB0aGlzIHVnbHkgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5IGJlIGltcGxlbWVudGVkIGluIHRoZQotCSAqIG1hYzgwMjExLCBhbmQgaGVyZSBzaG91bGQgb25seSBiZSBhIHNpbXBsZSBjYWxsYmFjayBoYW5kbGluZyBhY3R1YWwKLQkgKiBzZXR0aW5nIG9mIHRoZSBmaWx0ZXJzLiBOb3cgd2UgbmVlZCB0byBkaWcgdXAgcmVmZXJlbmNlcyB0bwotCSAqIHZhcmlvdXMgc3RydWN0dXJlcyB0byBnYWluIGFjY2VzcyB0byB3aGF0IHdlIG5lZWQuCi0JICogQWxzbywgYmVjYXVzZSBvZiB0aGlzLCB0aGVyZSBpcyBubyAiaW5pdGlhbCIgc2V0dGluZyBvZiB0aGUgZmlsdGVyCi0JICogaW4gIm9wX3N0YXJ0IiwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRpZyB1cCBzdHJ1Y3QgbmV0X2RldmljZQotCSAqIHRoZXJlIC0gdGhlIGZpbHRlciB3aWxsIGJlIHNldCB1cG9uIGZpcnN0IGNoYW5nZSBvZiB0aGUgaW50ZXJmYWNlCi0JICogSVAgYWRkcmVzcy4gKi8KLQotCWRldiA9IGlmYS0+aWZhX2Rldi0+ZGV2OwotCi0Jd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKLQlpZiAod2RldiA9PSBOVUxMKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQl3aXBoeSA9IHdkZXYtPndpcGh5OwotCWlmICh3aXBoeSA9PSBOVUxMKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQlodyA9IHdpcGh5X3ByaXYod2lwaHkpOwotCWlmIChodyA9PSBOVUxMKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQkvKiBDaGVjayB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgb25lIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4gKi8KLQl3bF90ZW1wID0gaHctPnByaXY7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3bCwgJndsX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHdsID09IHdsX3RlbXApCi0JCQlicmVhazsKLQl9Ci0JaWYgKHdsICE9IHdsX3RlbXApCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCS8qIEdldCB0aGUgaW50ZXJmYWNlIElQIGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UuICJpZmEiIHdpbGwgYmVjb21lCi0JICAgTlVMTCBpZjoKLQkgICAgIC0gdGhlcmUgaXMgbm8gSVBWNCBwcm90b2NvbCBhZGRyZXNzIGNvbmZpZ3VyZWQKLQkgICAgIC0gdGhlcmUgYXJlIG11bHRpcGxlICh2aXJ0dWFsKSBJUFY0IGFkZHJlc3NlcyBjb25maWd1cmVkCi0JICAgV2hlbiAiaWZhIiBpcyBOVUxMLCBmaWx0ZXJpbmcgd2lsbCBiZSBkaXNhYmxlZC4KLQkqLwotCWlmYSA9IE5VTEw7Ci0JaWRldiA9IGRldi0+aXBfcHRyOwotCWlmIChpZGV2KQotCQlpZmEgPSBpZGV2LT5pZmFfbGlzdDsKLQotCWlmIChpZmEgJiYgaWZhLT5pZmFfbmV4dCkKLQkJaWZhID0gTlVMTDsKLQotCW11dGV4X2xvY2soJndsLT5tdXRleCk7Ci0KLQlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0JaWYgKGlmYSkKLQkJcmV0ID0gd2wxMjcxX2FjeF9hcnBfaXBfZmlsdGVyKHdsLCB0cnVlLAotCQkJCQkgICAgICAgKHU4ICopJmlmYS0+aWZhX2FkZHJlc3MsCi0JCQkJCSAgICAgICBBQ1hfSVBWNF9WRVJTSU9OKTsKLQllbHNlCi0JCXJldCA9IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcih3bCwgZmFsc2UsIE5VTEwsCi0JCQkJCSAgICAgICBBQ1hfSVBWNF9WRVJTSU9OKTsKLQl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2wxMjcxX2Rldl9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHdsMTI3MV9kZXZfbm90aWZ5LAotfTsKLQotCiBzdGF0aWMgaW50IHdsMTI3MV9vcF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBzdGFydCIpOwpAQCAtOTI1LDYgKzgzOSw3IEBACiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSBody0+d2lwaHk7CiAJaW50IHJldHJpZXMgPSBXTDEyNzFfQk9PVF9SRVRSSUVTOwogCWludCByZXQgPSAwOwogCkBAIC05NzgsNiArODkzLDEyIEBACiAKIAkJd2wtPnN0YXRlID0gV0wxMjcxX1NUQVRFX09OOwogCQl3bDEyNzFfaW5mbygiZmlybXdhcmUgYm9vdGVkICglcykiLCB3bC0+Y2hpcC5md192ZXIpOworCisJCS8qIHVwZGF0ZSBody9mdyB2ZXJzaW9uIGluZm8gaW4gd2lwaHkgc3RydWN0ICovCisJCXdpcGh5LT5od192ZXJzaW9uID0gd2wtPmNoaXAuaWQ7CisJCXN0cm5jcHkod2lwaHktPmZ3X3ZlcnNpb24sIHdsLT5jaGlwLmZ3X3ZlciwKKwkJCXNpemVvZih3aXBoeS0+ZndfdmVyc2lvbikpOworCiAJCWdvdG8gb3V0OwogCiBpcnFfZGlzYWJsZToKQEAgLTEwMDEsMTAgKzkyMiw4IEBACiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JaWYgKCFyZXQpIHsKKwlpZiAoIXJldCkKIAkJbGlzdF9hZGQoJndsLT5saXN0LCAmd2xfbGlzdCk7Ci0JCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZ3bDEyNzFfZGV2X25vdGlmaWVyKTsKLQl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAxNSw4ICs5MzQsNiBAQAogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CiAJaW50IGk7CiAKLQl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZ3bDEyNzFfZGV2X25vdGlmaWVyKTsKLQogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgcmVtb3ZlIGludGVyZmFjZSIpOwogCkBAIC0xMDI2LDEwICs5NDMsMTcgQEAKIAogCVdBUk5fT04od2wtPnN0YXRlICE9IFdMMTI3MV9TVEFURV9PTik7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NDQU5OSU5HLCAmd2wtPmZsYWdzKSkgeworCS8qIGVuYWJsZSBkeW4gcHMganVzdCBpbiBjYXNlIChpZiBsZWZ0IG9uIGR1ZSB0byBmdyBjcmFzaCBldGMpICovCisJaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKQorCQlpZWVlODAyMTFfZW5hYmxlX2R5bl9wcyh3bC0+dmlmKTsKKworCWlmICh3bC0+c2Nhbi5zdGF0ZSAhPSBXTDEyNzFfU0NBTl9TVEFURV9JRExFKSB7CiAJCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHdsLT5odywgdHJ1ZSk7CiAJCW11dGV4X2xvY2soJndsLT5tdXRleCk7CisJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRTsKKwkJa2ZyZWUod2wtPnNjYW4uc2Nhbm5lZF9jaCk7CisJCXdsLT5zY2FuLnNjYW5uZWRfY2ggPSBOVUxMOwogCX0KIAogCXdsLT5zdGF0ZSA9IFdMMTI3MV9TVEFURV9PRkY7CkBAIC0xMDQwLDExICs5NjQsMTIgQEAKIAogCWNhbmNlbF93b3JrX3N5bmMoJndsLT5pcnFfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmd2wtPnR4X3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd2wtPnBzcG9sbF93b3JrKTsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKIAkvKiBsZXQncyBub3RpZnkgTUFDODAyMTEgYWJvdXQgdGhlIHJlbWFpbmluZyBwZW5kaW5nIFRYIGZyYW1lcyAqLwotCXdsMTI3MV90eF9mbHVzaCh3bCk7CisJd2wxMjcxX3R4X3Jlc2V0KHdsKTsKIAl3bDEyNzFfcG93ZXJfb2ZmKHdsKTsKIAogCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKQEAgLTEyNDEsNiArMTE2Niw0MiBAQAogCXJldHVybiByYXRlOwogfQogCitzdGF0aWMgaW50IHdsMTI3MV9oYW5kbGVfaWRsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBpZGxlKQoreworCWludCByZXQ7CisKKwlpZiAoaWRsZSkgeworCQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfSk9JTkVELCAmd2wtPmZsYWdzKSkgeworCQkJcmV0ID0gd2wxMjcxX3Vuam9pbih3bCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQl3bC0+cmF0ZV9zZXQgPSB3bDEyNzFfbWluX3JhdGVfZ2V0KHdsKTsKKwkJd2wtPnN0YV9yYXRlX3NldCA9IDA7CisJCXJldCA9IHdsMTI3MV9hY3hfcmF0ZV9wb2xpY2llcyh3bCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9jb25maWcoCisJCQl3bCwgQ01EX1RFTVBMX0tMVl9JRFhfTlVMTF9EQVRBLAorCQkJQUNYX0tFRVBfQUxJVkVfVFBMX0lOVkFMSUQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlzZXRfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIGluY3JlbWVudCB0aGUgc2Vzc2lvbiBjb3VudGVyICovCisJCXdsLT5zZXNzaW9uX2NvdW50ZXIrKzsKKwkJaWYgKHdsLT5zZXNzaW9uX2NvdW50ZXIgPj0gU0VTU0lPTl9DT1VOVEVSX01BWCkKKwkJCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOworCQlyZXQgPSB3bDEyNzFfZHVtbXlfam9pbih3bCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCWNsZWFyX2JpdChXTDEyNzFfRkxBR19JRExFLCAmd2wtPmZsYWdzKTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHdsMTI3MV9vcF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CkBAIC0xMjU1LDYgKzEyMTYsMTUgQEAKIAkJICAgICBjb25mLT5wb3dlcl9sZXZlbCwKIAkJICAgICBjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUgPyAiaWRsZSIgOiAiaW4gdXNlIik7CiAKKwkvKgorCSAqIG1hYzgwMjExIHdpbGwgZ28gdG8gaWRsZSBuZWFybHkgaW1tZWRpYXRlbHkgYWZ0ZXIgdHJhbnNtaXR0aW5nIHNvbWUKKwkgKiBmcmFtZXMsIHN1Y2ggYXMgdGhlIGRlYXV0aC4gVG8gbWFrZSBzdXJlIHRob3NlIGZyYW1lcyByZWFjaCB0aGUgYWlyLAorCSAqIHdhaXQgaGVyZSB1bnRpbCB0aGUgVFggcXVldWUgaXMgZnVsbHkgZmx1c2hlZC4KKwkgKi8KKwlpZiAoKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfSURMRSkgJiYKKwkgICAgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSkpCisJCXdsMTI3MV90eF9mbHVzaCh3bCk7CisKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCiAJaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkKQEAgLTEyOTUsMjQgKzEyNjUsMTggQEAKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFKSB7Ci0JCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUgJiYKLQkJICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX0pPSU5FRCwgJndsLT5mbGFncykpCi0JCQl3bDEyNzFfdW5qb2luKHdsKTsKLQkJZWxzZSBpZiAoIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpKQotCQkJd2wxMjcxX2R1bW15X2pvaW4od2wpOwotCi0JCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpIHsKLQkJCXdsLT5yYXRlX3NldCA9IHdsMTI3MV9taW5fcmF0ZV9nZXQod2wpOwotCQkJd2wtPnN0YV9yYXRlX3NldCA9IDA7Ci0JCQl3bDEyNzFfYWN4X3JhdGVfcG9saWNpZXMod2wpOwotCQkJd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZygKLQkJCQl3bCwgQ01EX1RFTVBMX0tMVl9JRFhfTlVMTF9EQVRBLAotCQkJCUFDWF9LRUVQX0FMSVZFX1RQTF9JTlZBTElEKTsKLQkJCXNldF9iaXQoV0wxMjcxX0ZMQUdfSURMRSwgJndsLT5mbGFncyk7Ci0JCX0gZWxzZQotCQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpOworCQlyZXQgPSB3bDEyNzFfaGFuZGxlX2lkbGUod2wsIGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSk7CisJCWlmIChyZXQgPCAwKQorCQkJd2wxMjcxX3dhcm5pbmcoImlkbGUgbW9kZSBjaGFuZ2UgZmFpbGVkICVkIiwgcmV0KTsKIAl9CiAKKwkvKgorCSAqIGlmIG1hYzgwMjExIGNoYW5nZXMgdGhlIFBTTSBtb2RlLCBtYWtlIHN1cmUgdGhlIG1vZGUgaXMgbm90CisJICogaW5jb3JyZWN0bHkgY2hhbmdlZCBhZnRlciB0aGUgcHNwb2xsIGZhaWx1cmUgYWN0aXZlIHdpbmRvdy4KKwkgKi8KKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykKKwkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2wtPmZsYWdzKTsKKwogCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTICYmCiAJICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU01fUkVRVUVTVEVELCAmd2wtPmZsYWdzKSkgewogCQlzZXRfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpOwpAQCAtMTU5NSwxMyArMTU1OSw5IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHdsMTI3MV8xMWFfZW5hYmxlZCgpKQotCQlyZXQgPSB3bDEyNzFfY21kX3NjYW4oaHctPnByaXYsIHNzaWQsIGxlbiwKLQkJCQkgICAgICByZXEtPmllLCByZXEtPmllX2xlbiwgMSwgMCwKLQkJCQkgICAgICBXTDEyNzFfU0NBTl9CQU5EX0RVQUwsIDMpOworCQlyZXQgPSB3bDEyNzFfc2Nhbihody0+cHJpdiwgc3NpZCwgbGVuLCByZXEpOwogCWVsc2UKLQkJcmV0ID0gd2wxMjcxX2NtZF9zY2FuKGh3LT5wcml2LCBzc2lkLCBsZW4sCi0JCQkJICAgICAgcmVxLT5pZSwgcmVxLT5pZV9sZW4sIDEsIDAsCi0JCQkJICAgICAgV0wxMjcxX1NDQU5fQkFORF8yXzRfR0haLCAzKTsKKwkJcmV0ID0gd2wxMjcxX3NjYW4oaHctPnByaXYsIHNzaWQsIGxlbiwgcmVxKTsKIAogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwogCkBAIC0xNzc0LDYgKzE3MzQsOCBAQAogCQkJd2wtPmFpZCA9IGJzc19jb25mLT5haWQ7CiAJCQlzZXRfYXNzb2MgPSB0cnVlOwogCisJCQl3bC0+cHNfcG9sbF9mYWlsdXJlcyA9IDA7CisKIAkJCS8qCiAJCQkgKiB1c2UgYmFzaWMgcmF0ZXMgZnJvbSBBUCwgYW5kIGRldGVybWluZSBsb3dlc3QgcmF0ZQogCQkJICogdG8gdXNlIHdpdGggY29udHJvbCBmcmFtZXMuCkBAIC0xODIzLDYgKzE3ODUsOSBAQAogCQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKTsKIAkJCXdsLT5haWQgPSAwOwogCisJCQkvKiByZS1lbmFibGUgZHluYW1pYyBwcyAtIGp1c3QgaW4gY2FzZSAqLworCQkJaWVlZTgwMjExX2VuYWJsZV9keW5fcHMod2wtPnZpZik7CisKIAkJCS8qIHJldmVydCBiYWNrIHRvIG1pbmltdW0gcmF0ZXMgZm9yIHRoZSBjdXJyZW50IGJhbmQgKi8KIAkJCXdsMTI3MV9zZXRfYmFuZF9yYXRlKHdsKTsKIAkJCXdsLT5iYXNpY19yYXRlID0gd2wxMjcxX21pbl9yYXRlX2dldCh3bCk7CkBAIC0xODcxLDYgKzE4MzYsMTkgQEAKIAkJfQogCX0KIAorCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVJQX0ZJTFRFUikgeworCQlfX2JlMzIgYWRkciA9IGJzc19jb25mLT5hcnBfYWRkcl9saXN0WzBdOworCQlXQVJOX09OKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKTsKKworCQlpZiAoYnNzX2NvbmYtPmFycF9hZGRyX2NudCA9PSAxICYmIGJzc19jb25mLT5hcnBfZmlsdGVyX2VuYWJsZWQpCisJCQlyZXQgPSB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIod2wsIHRydWUsIGFkZHIpOworCQllbHNlCisJCQlyZXQgPSB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIod2wsIGZhbHNlLCBhZGRyKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X3NsZWVwOworCX0KKwogCWlmIChkb19qb2luKSB7CiAJCXJldCA9IHdsMTI3MV9qb2luKHdsLCBzZXRfYXNzb2MpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtMTkyOSw2ICsxOTA3LDQ4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHU2NCB3bDEyNzFfb3BfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKworCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJdTY0IG1hY3RpbWUgPSBVTExPTkdfTUFYOworCWludCByZXQ7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBnZXQgdHNmIik7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB3bDEyNzFfYWN4X3RzZl9pbmZvKHdsLCAmbWFjdGltZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3NsZWVwOworCitvdXRfc2xlZXA6CisJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CisKK291dDoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisJcmV0dXJuIG1hY3RpbWU7Cit9CisKK3N0YXRpYyBpbnQgd2wxMjcxX29wX2dldF9zdXJ2ZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBpZHgsCisJCQkJc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CisgCisJaWYgKGlkeCAhPSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKyAKKwlzdXJ2ZXktPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOworCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fTk9JU0VfREJNOworCXN1cnZleS0+bm9pc2UgPSB3bC0+bm9pc2U7CisgCisJcmV0dXJuIDA7Cit9CiAKIC8qIGNhbid0IGJlIGNvbnN0LCBtYWM4MDIxMSB3cml0ZXMgdG8gdGhpcyAqLwogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSB3bDEyNzFfcmF0ZXNbXSA9IHsKQEAgLTE5OTEsNyArMjAxMSw3IEBACiB9OwogCiAvKiBtYXBwaW5nIHRvIGluZGV4ZXMgZm9yIHdsMTI3MV9yYXRlcyAqLwotY29uc3Qgc3RhdGljIHU4IHdsMTI3MV9yYXRlX3RvX2lkeF8yZ2h6W10gPSB7CitzdGF0aWMgY29uc3QgdTggd2wxMjcxX3JhdGVfdG9faWR4XzJnaHpbXSA9IHsKIAkvKiBNQ1MgcmF0ZXMgYXJlIHVzZWQgb25seSB3aXRoIDExbiAqLwogCUNPTkZfSFdfUlhUWF9SQVRFX1VOU1VQUE9SVEVELCAvKiBDT05GX0hXX1JYVFhfUkFURV9NQ1M3ICovCiAJQ09ORl9IV19SWFRYX1JBVEVfVU5TVVBQT1JURUQsIC8qIENPTkZfSFdfUlhUWF9SQVRFX01DUzYgKi8KQEAgLTIxMDMsNyArMjEyMyw3IEBACiB9OwogCiAvKiBtYXBwaW5nIHRvIGluZGV4ZXMgZm9yIHdsMTI3MV9yYXRlc181Z2h6ICovCi1jb25zdCBzdGF0aWMgdTggd2wxMjcxX3JhdGVfdG9faWR4XzVnaHpbXSA9IHsKK3N0YXRpYyBjb25zdCB1OCB3bDEyNzFfcmF0ZV90b19pZHhfNWdoeltdID0gewogCS8qIE1DUyByYXRlcyBhcmUgdXNlZCBvbmx5IHdpdGggMTFuICovCiAJQ09ORl9IV19SWFRYX1JBVEVfVU5TVVBQT1JURUQsIC8qIENPTkZfSFdfUlhUWF9SQVRFX01DUzcgKi8KIAlDT05GX0hXX1JYVFhfUkFURV9VTlNVUFBPUlRFRCwgLyogQ09ORl9IV19SWFRYX1JBVEVfTUNTNiAqLwpAQCAtMjEzOSw3ICsyMTU5LDcgQEAKIAkubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUod2wxMjcxX3JhdGVzXzVnaHopLAogfTsKIAotY29uc3Qgc3RhdGljIHU4ICp3bDEyNzFfYmFuZF9yYXRlX3RvX2lkeFtdID0geworc3RhdGljIGNvbnN0IHU4ICp3bDEyNzFfYmFuZF9yYXRlX3RvX2lkeFtdID0gewogCVtJRUVFODAyMTFfQkFORF8yR0haXSA9IHdsMTI3MV9yYXRlX3RvX2lkeF8yZ2h6LAogCVtJRUVFODAyMTFfQkFORF81R0haXSA9IHdsMTI3MV9yYXRlX3RvX2lkeF81Z2h6CiB9OwpAQCAtMjE1OCw2ICsyMTc4LDggQEAKIAkuYnNzX2luZm9fY2hhbmdlZCA9IHdsMTI3MV9vcF9ic3NfaW5mb19jaGFuZ2VkLAogCS5zZXRfcnRzX3RocmVzaG9sZCA9IHdsMTI3MV9vcF9zZXRfcnRzX3RocmVzaG9sZCwKIAkuY29uZl90eCA9IHdsMTI3MV9vcF9jb25mX3R4LAorCS5nZXRfdHNmID0gd2wxMjcxX29wX2dldF90c2YsCisJLmdldF9zdXJ2ZXkgPSB3bDEyNzFfb3BfZ2V0X3N1cnZleSwKIAlDRkc4MDIxMV9URVNUTU9ERV9DTUQod2wxMjcxX3RtX2NtZCkKIH07CiAKQEAgLTIzNTAsMTUgKzIzNzIsMTMgQEAKIAkJZ290byBlcnJfaHdfYWxsb2M7CiAJfQogCi0JcGxhdF9kZXYgPSBrbWFsbG9jKHNpemVvZih3bDEyNzFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJcGxhdF9kZXYgPSBrbWVtZHVwKCZ3bDEyNzFfZGV2aWNlLCBzaXplb2Yod2wxMjcxX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghcGxhdF9kZXYpIHsKIAkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgcGxhdGZvcm1fZGV2aWNlIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3BsYXRfYWxsb2M7CiAJfQogCi0JbWVtY3B5KHBsYXRfZGV2LCAmd2wxMjcxX2RldmljZSwgc2l6ZW9mKHdsMTI3MV9kZXZpY2UpKTsKLQogCXdsID0gaHctPnByaXY7CiAJbWVtc2V0KHdsLCAwLCBzaXplb2YoKndsKSk7CiAKQEAgLTIzNzAsNiArMjM5MCw3IEBACiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd2wtPnR4X3F1ZXVlKTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZ3bC0+ZWxwX3dvcmssIHdsMTI3MV9lbHBfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJndsLT5wc3BvbGxfd29yaywgd2wxMjcxX3BzcG9sbF93b3JrKTsKIAl3bC0+Y2hhbm5lbCA9IFdMMTI3MV9ERUZBVUxUX0NIQU5ORUw7CiAJd2wtPmJlYWNvbl9pbnQgPSBXTDEyNzFfREVGQVVMVF9CRUFDT05fSU5UOwogCXdsLT5kZWZhdWx0X2tleSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3J4LmMKaW5kZXggYjk4ZmI2NC4uMDE5YWE3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfcnguYwpAQCAtNTMsMTQgKzUzLDE1IEBACiAJc3RhdHVzLT5iYW5kID0gd2wtPmJhbmQ7CiAJc3RhdHVzLT5yYXRlX2lkeCA9IHdsMTI3MV9yYXRlX3RvX2lkeCh3bCwgZGVzYy0+cmF0ZSk7CiAKLQkvKgotCSAqIEZJWE1FOiBBZGQgbWFjdGltZSBoYW5kbGluZy4gIEZvciBJQlNTIChhZC1ob2MpIHdlIG5lZWQgdG8gZ2V0IHRoZQotCSAqIHRpbWVzdGFtcCBmcm9tIHRoZSBiZWFjb24gKGFjeF90c2ZfaW5mbykuICBJbiBCU1MgbW9kZSAoaW5mcmEpIHdlCi0JICogb25seSBuZWVkIHRoZSBtYWN0aW1lIGZvciBtb25pdG9yIG1vZGUuICBGb3Igbm93IHRoZSBtYWN0aW1lIGlzCi0JICogbm90IHZhbGlkLCBzbyBSWF9GTEFHX1RTRlQgc2hvdWxkIG5vdCBiZSBzZXQKLQkgKi8KIAlzdGF0dXMtPnNpZ25hbCA9IGRlc2MtPnJzc2k7CiAKKwkvKgorCSAqIEZJWE1FOiBJbiB3bDEyNTEsIHRoZSBTTlIgc2hvdWxkIGJlIGRpdmlkZWQgYnkgdHdvLiAgSW4gd2wxMjcxIHdlCisJICogbmVlZCB0byBkaXZpZGUgYnkgdHdvIGZvciBub3csIGJ1dCBUSSBoYXMgYmVlbiBkaXNjdXNzaW5nIGFib3V0CisJICogY2hhbmdpbmcgaXQuICBUaGlzIG5lZWRzIHRvIGJlIHJlY2hlY2tlZC4KKwkgKi8KKwl3bC0+bm9pc2UgPSBkZXNjLT5yc3NpIC0gKGRlc2MtPnNuciA+PiAxKTsKKwogCXN0YXR1cy0+ZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShkZXNjLT5jaGFubmVsKTsKIAogCWlmIChkZXNjLT5mbGFncyAmIFdMMTI3MV9SWF9ERVNDX0VOQ1JZUFRfTUFTSykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9yeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9yeC5oCmluZGV4IGI4OWJlNDcuLjEzYTIzMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfcnguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3J4LmgKQEAgLTExMyw3ICsxMTMsNyBAQAogCXU4ICBwcm9jZXNzX2lkOwogCXU4ICBwYWRfbGVuOwogCXU4ICByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogdm9pZCB3bDEyNzFfcngoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyNzFfZndfc3RhdHVzICpzdGF0dXMpOwogdTggd2wxMjcxX3JhdGVfdG9faWR4KHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgcmF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYzQzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NjYW4uYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHdsMTI3MQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdDogTHVjaWFubyBDb2VsaG8gPGx1Y2lhbm8uY29lbGhvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKworI2luY2x1ZGUgIndsMTI3MS5oIgorI2luY2x1ZGUgIndsMTI3MV9jbWQuaCIKKyNpbmNsdWRlICJ3bDEyNzFfc2Nhbi5oIgorI2luY2x1ZGUgIndsMTI3MV9hY3guaCIKKworc3RhdGljIGludCB3bDEyNzFfZ2V0X3NjYW5fY2hhbm5lbHMoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IGJhc2ljX3NjYW5fY2hhbm5lbF9wYXJhbXMgKmNoYW5uZWxzLAorCQkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsIGJvb2wgcGFzc2l2ZSkKK3sKKwlpbnQgaSwgajsKKwl1MzIgZmxhZ3M7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsKKwkgICAgIGkgPCByZXEtPm5fY2hhbm5lbHMgJiYgaiA8IFdMMTI3MV9TQ0FOX01BWF9DSEFOTkVMUzsKKwkgICAgIGkrKykgeworCisJCWZsYWdzID0gcmVxLT5jaGFubmVsc1tpXS0+ZmxhZ3M7CisKKwkJaWYgKCF3bC0+c2Nhbi5zY2FubmVkX2NoW2ldICYmCisJCSAgICAhKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpICYmCisJCSAgICAoKCEhKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkgPT0gcGFzc2l2ZSkgJiYKKwkJICAgIChyZXEtPmNoYW5uZWxzW2ldLT5iYW5kID09IGJhbmQpKSB7CisKKwkJCXdsMTI3MV9kZWJ1ZyhERUJVR19TQ0FOLCAiYmFuZCAlZCwgY2VudGVyX2ZyZXEgJWQgIiwKKwkJCQkgICAgIHJlcS0+Y2hhbm5lbHNbaV0tPmJhbmQsCisJCQkJICAgICByZXEtPmNoYW5uZWxzW2ldLT5jZW50ZXJfZnJlcSk7CisJCQl3bDEyNzFfZGVidWcoREVCVUdfU0NBTiwgImh3X3ZhbHVlICVkLCBmbGFncyAlWCIsCisJCQkJICAgICByZXEtPmNoYW5uZWxzW2ldLT5od192YWx1ZSwKKwkJCQkgICAgIHJlcS0+Y2hhbm5lbHNbaV0tPmZsYWdzKTsKKwkJCXdsMTI3MV9kZWJ1ZyhERUJVR19TQ0FOLAorCQkJCSAgICAgIm1heF9hbnRlbm5hX2dhaW4gJWQsIG1heF9wb3dlciAlZCIsCisJCQkJICAgICByZXEtPmNoYW5uZWxzW2ldLT5tYXhfYW50ZW5uYV9nYWluLAorCQkJCSAgICAgcmVxLT5jaGFubmVsc1tpXS0+bWF4X3Bvd2VyKTsKKwkJCXdsMTI3MV9kZWJ1ZyhERUJVR19TQ0FOLCAiYmVhY29uX2ZvdW5kICVkIiwKKwkJCQkgICAgIHJlcS0+Y2hhbm5lbHNbaV0tPmJlYWNvbl9mb3VuZCk7CisKKwkJCWNoYW5uZWxzW2pdLm1pbl9kdXJhdGlvbiA9CisJCQkJY3B1X3RvX2xlMzIoV0wxMjcxX1NDQU5fQ0hBTl9NSU5fRFVSQVRJT04pOworCQkJY2hhbm5lbHNbal0ubWF4X2R1cmF0aW9uID0KKwkJCQljcHVfdG9fbGUzMihXTDEyNzFfU0NBTl9DSEFOX01BWF9EVVJBVElPTik7CisJCQljaGFubmVsc1tqXS5lYXJseV90ZXJtaW5hdGlvbiA9IDA7CisJCQljaGFubmVsc1tqXS50eF9wb3dlcl9hdHQgPSByZXEtPmNoYW5uZWxzW2ldLT5tYXhfcG93ZXI7CisJCQljaGFubmVsc1tqXS5jaGFubmVsID0gcmVxLT5jaGFubmVsc1tpXS0+aHdfdmFsdWU7CisKKwkJCW1lbXNldCgmY2hhbm5lbHNbal0uYnNzaWRfbHNiLCAweGZmLCA0KTsKKwkJCW1lbXNldCgmY2hhbm5lbHNbal0uYnNzaWRfbXNiLCAweGZmLCAyKTsKKworCQkJLyogTWFyayB0aGUgY2hhbm5lbHMgd2UgYWxyZWFkeSB1c2VkICovCisJCQl3bC0+c2Nhbi5zY2FubmVkX2NoW2ldID0gdHJ1ZTsKKworCQkJaisrOworCQl9CisJfQorCisJcmV0dXJuIGo7Cit9CisKKyNkZWZpbmUgV0wxMjcxX05PVEhJTkdfVE9fU0NBTiAxCisKK3N0YXRpYyBpbnQgd2wxMjcxX3NjYW5fc2VuZChzdHJ1Y3Qgd2wxMjcxICp3bCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICAgICBib29sIHBhc3NpdmUsIHUzMiBiYXNpY19yYXRlKQoreworCXN0cnVjdCB3bDEyNzFfY21kX3NjYW4gKmNtZDsKKwlzdHJ1Y3Qgd2wxMjcxX2NtZF90cmlnZ2VyX3NjYW5fdG8gKnRyaWdnZXI7CisJaW50IHJldDsKKwl1MTYgc2Nhbl9vcHRpb25zID0gMDsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwl0cmlnZ2VyID0ga3phbGxvYyhzaXplb2YoKnRyaWdnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCB8fCAhdHJpZ2dlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXZSBhbHdheXMgdXNlIGhpZ2ggcHJpb3JpdHkgc2NhbnMgKi8KKwlzY2FuX29wdGlvbnMgPSBXTDEyNzFfU0NBTl9PUFRfUFJJT1JJVFlfSElHSDsKKwlpZihwYXNzaXZlKQorCQlzY2FuX29wdGlvbnMgfD0gV0wxMjcxX1NDQU5fT1BUX1BBU1NJVkU7CisJY21kLT5wYXJhbXMuc2Nhbl9vcHRpb25zID0gY3B1X3RvX2xlMTYoc2Nhbl9vcHRpb25zKTsKKworCWNtZC0+cGFyYW1zLm5fY2ggPSB3bDEyNzFfZ2V0X3NjYW5fY2hhbm5lbHMod2wsIHdsLT5zY2FuLnJlcSwKKwkJCQkJCSAgICBjbWQtPmNoYW5uZWxzLAorCQkJCQkJICAgIGJhbmQsIHBhc3NpdmUpOworCWlmIChjbWQtPnBhcmFtcy5uX2NoID09IDApIHsKKwkJcmV0ID0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTjsKKwkJZ290byBvdXQ7CisJfQorCisJY21kLT5wYXJhbXMudHhfcmF0ZSA9IGNwdV90b19sZTMyKGJhc2ljX3JhdGUpOworCWNtZC0+cGFyYW1zLnJ4X2NvbmZpZ19vcHRpb25zID0gY3B1X3RvX2xlMzIoQ0ZHX1JYX0FMTF9HT09EKTsKKwljbWQtPnBhcmFtcy5yeF9maWx0ZXJfb3B0aW9ucyA9CisJCWNwdV90b19sZTMyKENGR19SWF9QUlNQX0VOIHwgQ0ZHX1JYX01HTVRfRU4gfCBDRkdfUlhfQkNOX0VOKTsKKworCWNtZC0+cGFyYW1zLm5fcHJvYmVfcmVxcyA9IFdMMTI3MV9TQ0FOX1BST0JFX1JFUVM7CisJY21kLT5wYXJhbXMudHhfcmF0ZSA9IGNwdV90b19sZTMyKGJhc2ljX3JhdGUpOworCWNtZC0+cGFyYW1zLnRpZF90cmlnZ2VyID0gMDsKKwljbWQtPnBhcmFtcy5zY2FuX3RhZyA9IFdMMTI3MV9TQ0FOX0RFRkFVTFRfVEFHOworCisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKKwkJY21kLT5wYXJhbXMuYmFuZCA9IFdMMTI3MV9TQ0FOX0JBTkRfMl80X0dIWjsKKwllbHNlCisJCWNtZC0+cGFyYW1zLmJhbmQgPSBXTDEyNzFfU0NBTl9CQU5EXzVfR0haOworCisJaWYgKHdsLT5zY2FuLnNzaWRfbGVuICYmIHdsLT5zY2FuLnNzaWQpIHsKKwkJY21kLT5wYXJhbXMuc3NpZF9sZW4gPSB3bC0+c2Nhbi5zc2lkX2xlbjsKKwkJbWVtY3B5KGNtZC0+cGFyYW1zLnNzaWQsIHdsLT5zY2FuLnNzaWQsIHdsLT5zY2FuLnNzaWRfbGVuKTsKKwl9CisKKwlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgd2wtPnNjYW4uc3NpZCwgd2wtPnNjYW4uc3NpZF9sZW4sCisJCQkJCSB3bC0+c2Nhbi5yZXEtPmllLCB3bC0+c2Nhbi5yZXEtPmllX2xlbiwKKwkJCQkJIGJhbmQpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV9lcnJvcigiUFJPQkUgcmVxdWVzdCB0ZW1wbGF0ZSBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZGlzYWJsZSB0aGUgdGltZW91dCAqLworCXRyaWdnZXItPnRpbWVvdXQgPSAwOworCXJldCA9IHdsMTI3MV9jbWRfc2VuZCh3bCwgQ01EX1RSSUdHRVJfU0NBTl9UTywgdHJpZ2dlciwKKwkJCSAgICAgIHNpemVvZigqdHJpZ2dlciksIDApOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV9lcnJvcigidHJpZ2dlciBzY2FuIHRvIGZhaWxlZCBmb3IgaHcgc2NhbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwl3bDEyNzFfZHVtcChERUJVR19TQ0FOLCAiU0NBTjogIiwgY21kLCBzaXplb2YoKmNtZCkpOworCisJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfU0NBTiwgY21kLCBzaXplb2YoKmNtZCksIDApOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV9lcnJvcigiU0NBTiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJa2ZyZWUoY21kKTsKKwlrZnJlZSh0cmlnZ2VyKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHdsMTI3MV9zY2FuX3N0bShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoICh3bC0+c2Nhbi5zdGF0ZSkgeworCWNhc2UgV0wxMjcxX1NDQU5fU1RBVEVfSURMRToKKwkJYnJlYWs7CisKKwljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFXzJHSFpfQUNUSVZFOgorCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCBJRUVFODAyMTFfQkFORF8yR0haLCBmYWxzZSwKKwkJCQkgICAgICAgd2wtPmNvbmYudHguYmFzaWNfcmF0ZSk7CisJCWlmIChyZXQgPT0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTikgeworCQkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV8yR0haX1BBU1NJVkU7CisJCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFXzJHSFpfUEFTU0lWRToKKwkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgSUVFRTgwMjExX0JBTkRfMkdIWiwgdHJ1ZSwKKwkJCQkgICAgICAgd2wtPmNvbmYudHguYmFzaWNfcmF0ZSk7CisJCWlmIChyZXQgPT0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTikgeworCQkJaWYgKHdsMTI3MV8xMWFfZW5hYmxlZCgpKQorCQkJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfNUdIWl9BQ1RJVkU7CisJCQllbHNlCisJCQkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV9ET05FOworCQkJd2wxMjcxX3NjYW5fc3RtKHdsKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBXTDEyNzFfU0NBTl9TVEFURV81R0haX0FDVElWRToKKwkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgSUVFRTgwMjExX0JBTkRfNUdIWiwgZmFsc2UsCisJCQkJICAgICAgIHdsLT5jb25mLnR4LmJhc2ljX3JhdGVfNSk7CisJCWlmIChyZXQgPT0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTikgeworCQkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV81R0haX1BBU1NJVkU7CisJCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFXzVHSFpfUEFTU0lWRToKKwkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgSUVFRTgwMjExX0JBTkRfNUdIWiwgdHJ1ZSwKKwkJCQkgICAgICAgd2wtPmNvbmYudHguYmFzaWNfcmF0ZV81KTsKKwkJaWYgKHJldCA9PSBXTDEyNzFfTk9USElOR19UT19TQ0FOKSB7CisJCQl3bC0+c2Nhbi5zdGF0ZSA9IFdMMTI3MV9TQ0FOX1NUQVRFX0RPTkU7CisJCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFX0RPTkU6CisJCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKwkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHdsLT5odywgZmFsc2UpOworCQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJCWtmcmVlKHdsLT5zY2FuLnNjYW5uZWRfY2gpOworCQl3bC0+c2Nhbi5zY2FubmVkX2NoID0gTlVMTDsKKworCQl3bC0+c2Nhbi5zdGF0ZSA9IFdMMTI3MV9TQ0FOX1NUQVRFX0lETEU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJd2wxMjcxX2Vycm9yKCJpbnZhbGlkIHNjYW4gc3RhdGUiKTsKKwkJYnJlYWs7CisJfQorfQorCitpbnQgd2wxMjcxX3NjYW4oc3RydWN0IHdsMTI3MSAqd2wsIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCisJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAod2wtPnNjYW4uc3RhdGUgIT0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfMkdIWl9BQ1RJVkU7CisKKwlpZiAoc3NpZF9sZW4gJiYgc3NpZCkgeworCQl3bC0+c2Nhbi5zc2lkX2xlbiA9IHNzaWRfbGVuOworCQltZW1jcHkod2wtPnNjYW4uc3NpZCwgc3NpZCwgc3NpZF9sZW4pOworCX0gZWxzZSB7CisJCXdsLT5zY2FuLnNzaWRfbGVuID0gMDsKKwl9CisKKwl3bC0+c2Nhbi5yZXEgPSByZXE7CisKKwl3bC0+c2Nhbi5zY2FubmVkX2NoID0ga3phbGxvYyhyZXEtPm5fY2hhbm5lbHMgKgorCQkJCSAgICAgIHNpemVvZigqd2wtPnNjYW4uc2Nhbm5lZF9jaCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJd2wxMjcxX3NjYW5fc3RtKHdsKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9zY2FuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NjYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgxNTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9zY2FuLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB3bDEyNzEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IEx1Y2lhbm8gQ29lbGhvIDxsdWNpYW5vLmNvZWxob0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fV0wxMjcxX1NDQU5fSF9fCisjZGVmaW5lIF9fV0wxMjcxX1NDQU5fSF9fCisKKyNpbmNsdWRlICJ3bDEyNzEuaCIKKworaW50IHdsMTI3MV9zY2FuKHN0cnVjdCB3bDEyNzEgKndsLCBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAorCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOworaW50IHdsMTI3MV9zY2FuX2J1aWxkX3Byb2JlX3JlcShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQljb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAorCQkJCWNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgdTggYmFuZCk7Cit2b2lkIHdsMTI3MV9zY2FuX3N0bShzdHJ1Y3Qgd2wxMjcxICp3bCk7CisKKyNkZWZpbmUgV0wxMjcxX1NDQU5fTUFYX0NIQU5ORUxTICAgICAgIDI0CisjZGVmaW5lIFdMMTI3MV9TQ0FOX0RFRkFVTFRfVEFHICAgICAgICAxCisjZGVmaW5lIFdMMTI3MV9TQ0FOX0NVUlJFTlRfVFhfUFdSICAgICAwCisjZGVmaW5lIFdMMTI3MV9TQ0FOX09QVF9BQ1RJVkUgICAgICAgICAwCisjZGVmaW5lIFdMMTI3MV9TQ0FOX09QVF9QQVNTSVZFCSAgICAgICAxCisjZGVmaW5lIFdMMTI3MV9TQ0FOX09QVF9QUklPUklUWV9ISUdIICA0CisjZGVmaW5lIFdMMTI3MV9TQ0FOX0NIQU5fTUlOX0RVUkFUSU9OICAzMDAwMCAgLyogVFUgKi8KKyNkZWZpbmUgV0wxMjcxX1NDQU5fQ0hBTl9NQVhfRFVSQVRJT04gIDYwMDAwICAvKiBUVSAqLworI2RlZmluZSBXTDEyNzFfU0NBTl9CQU5EXzJfNF9HSFogMAorI2RlZmluZSBXTDEyNzFfU0NBTl9CQU5EXzVfR0haIDEKKyNkZWZpbmUgV0wxMjcxX1NDQU5fUFJPQkVfUkVRUyAzCisKK2VudW0geworCVdMMTI3MV9TQ0FOX1NUQVRFX0lETEUsCisJV0wxMjcxX1NDQU5fU1RBVEVfMkdIWl9BQ1RJVkUsCisJV0wxMjcxX1NDQU5fU1RBVEVfMkdIWl9QQVNTSVZFLAorCVdMMTI3MV9TQ0FOX1NUQVRFXzVHSFpfQUNUSVZFLAorCVdMMTI3MV9TQ0FOX1NUQVRFXzVHSFpfUEFTU0lWRSwKKwlXTDEyNzFfU0NBTl9TVEFURV9ET05FCit9OworCitzdHJ1Y3QgYmFzaWNfc2Nhbl9wYXJhbXMgeworCV9fbGUzMiByeF9jb25maWdfb3B0aW9uczsKKwlfX2xlMzIgcnhfZmlsdGVyX29wdGlvbnM7CisJLyogU2NhbiBvcHRpb24gZmxhZ3MgKFdMMTI3MV9TQ0FOX09QVF8qKSAqLworCV9fbGUxNiBzY2FuX29wdGlvbnM7CisJLyogTnVtYmVyIG9mIHNjYW4gY2hhbm5lbHMgaW4gdGhlIGxpc3QgKG1heGltdW0gMzApICovCisJdTggbl9jaDsKKwkvKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHRvIHNlbmQKKwkgICBwZXIgY2hhbm5lbCBmb3IgYW4gYWN0aXZlIHNjYW4gKi8KKwl1OCBuX3Byb2JlX3JlcXM7CisJLyogUmF0ZSBiaXQgZmllbGQgZm9yIHNlbmRpbmcgdGhlIHByb2JlcyAqLworCV9fbGUzMiB0eF9yYXRlOworCXU4IHRpZF90cmlnZ2VyOworCXU4IHNzaWRfbGVuOworCS8qIGluIG9yZGVyIHRvIGFsaWduICovCisJdTggcGFkZGluZzFbMl07CisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRV07CisJLyogQmFuZCB0byBzY2FuICovCisJdTggYmFuZDsKKwl1OCB1c2Vfc3NpZF9saXN0OworCXU4IHNjYW5fdGFnOworCXU4IHBhZGRpbmcyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJhc2ljX3NjYW5fY2hhbm5lbF9wYXJhbXMgeworCS8qIER1cmF0aW9uIGluIFRVIHRvIHdhaXQgZm9yIGZyYW1lcyBvbiBhIGNoYW5uZWwgZm9yIGFjdGl2ZSBzY2FuICovCisJX19sZTMyIG1pbl9kdXJhdGlvbjsKKwlfX2xlMzIgbWF4X2R1cmF0aW9uOworCV9fbGUzMiBic3NpZF9sc2I7CisJX19sZTE2IGJzc2lkX21zYjsKKwl1OCBlYXJseV90ZXJtaW5hdGlvbjsKKwl1OCB0eF9wb3dlcl9hdHQ7CisJdTggY2hhbm5lbDsKKwkvKiBGVyBpbnRlcm5hbCB1c2Ugb25seSEgKi8KKwl1OCBkZnNfY2FuZGlkYXRlOworCXU4IGFjdGl2aXR5X2RldGVjdGVkOworCXU4IHBhZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3bDEyNzFfY21kX3NjYW4geworCXN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CisKKwlzdHJ1Y3QgYmFzaWNfc2Nhbl9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBiYXNpY19zY2FuX2NoYW5uZWxfcGFyYW1zIGNoYW5uZWxzW1dMMTI3MV9TQ0FOX01BWF9DSEFOTkVMU107Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2wxMjcxX2NtZF90cmlnZ2VyX3NjYW5fdG8geworCXN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7CisKKwlfX2xlMzIgdGltZW91dDsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX1dMMTI3MV9TQ0FOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NkaW8uYwppbmRleCBkM2Q2ZjMwLi43MDU5YjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NkaW8uYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgIndsMTI3MS5oIgogI2luY2x1ZGUgIndsMTJ4eF84MDIxMS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfc3BpLmMKaW5kZXggNTE4OWI4MS4uOTZkMjVmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV9zcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3NwaS5jCkBAIC00NjEsMyArNDYxLDQgQEAKIE1PRFVMRV9BVVRIT1IoIkx1Y2lhbm8gQ29lbGhvIDxsdWNpYW5vLmNvZWxob0Bub2tpYS5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJKdXVzbyBPaWthcmluZW4gPGp1dXNvLm9pa2FyaW5lbkBub2tpYS5jb20+Iik7CiBNT0RVTEVfRklSTVdBUkUoV0wxMjcxX0ZXX05BTUUpOworTU9EVUxFX0FMSUFTKCJzcGk6d2wxMjcxIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3Rlc3Rtb2RlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3Rlc3Rtb2RlLmMKaW5kZXggNTU0ZGViNC4uNmUwOTUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV90ZXN0bW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfdGVzdG1vZGUuYwpAQCAtMTk5LDcgKzE5OSwxNCBAQAogCWJ1ZiA9IG5sYV9kYXRhKHRiW1dMMTI3MV9UTV9BVFRSX0RBVEFdKTsKIAlsZW4gPSBubGFfbGVuKHRiW1dMMTI3MV9UTV9BVFRSX0RBVEFdKTsKIAotCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpKSB7CisJLyoKKwkgKiBGSVhNRTogdGhlIExFR0FDWSBOVlMgaW1hZ2Ugc3VwcG9ydCAoTlZTJ3MgbWlzc2luZyB0aGUgNUdIeiBiYW5kCisJICogY29uZmlndXJhdGlvbnMpIGNhbiBiZSByZW1vdmVkIHdoZW4gdGhvc2UgTlZTIGZpbGVzIHN0b3AgZmxvYXRpbmcKKwkgKiBhcm91bmQuCisJICovCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IHdsMTI3MV9udnNfZmlsZSkgJiYKKwkgICAgKGxlbiAhPSBXTDEyNzFfSU5JX0xFR0FDWV9OVlNfRklMRV9TSVpFIHx8CisJICAgICB3bDEyNzFfMTFhX2VuYWJsZWQoKSkpIHsKIAkJd2wxMjcxX2Vycm9yKCJudnMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAogCQkJICAgICBsZW4sIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSk7CiAJCXJldHVybiAtRU1TR1NJWkU7CkBAIC0yMDksNyArMjE2LDcgQEAKIAogCWtmcmVlKHdsLT5udnMpOwogCi0Jd2wtPm52cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpLCBHRlBfS0VSTkVMKTsKKwl3bC0+bnZzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsMTI3MV9udnNfZmlsZSksIEdGUF9LRVJORUwpOwogCWlmICghd2wtPm52cykgewogCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBudnMgZmlsZSIpOwogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV90eC5jCmluZGV4IDYyZGI3OTUuLmM1OTJjYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3R4LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQUNYX1RYX0RFU0NSSVBUT1JTOyBpKyspCiAJCWlmICh3bC0+dHhfZnJhbWVzW2ldID09IE5VTEwpIHsKIAkJCXdsLT50eF9mcmFtZXNbaV0gPSBza2I7CisJCQl3bC0+dHhfZnJhbWVzX2NudCsrOwogCQkJcmV0dXJuIGk7CiAJCX0KIApAQCAtNzMsOCArNzQsMTAgQEAKIAkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLAogCQkJICAgICAidHhfYWxsb2NhdGU6IHNpemU6ICVkLCBibG9ja3M6ICVkLCBpZDogJWQiLAogCQkJICAgICB0b3RhbF9sZW4sIHRvdGFsX2Jsb2NrcywgaWQpOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXdsLT50eF9mcmFtZXNbaWRdID0gTlVMTDsKKwkJd2wtPnR4X2ZyYW1lc19jbnQtLTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzU4LDYgKzM2MSw3IEBACiAJLyogcmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHN0YWNrICovCiAJaWVlZTgwMjExX3R4X3N0YXR1cyh3bC0+aHcsIHNrYik7CiAJd2wtPnR4X2ZyYW1lc1tyZXN1bHQtPmlkXSA9IE5VTEw7CisJd2wtPnR4X2ZyYW1lc19jbnQtLTsKIH0KIAogLyogQ2FsbGVkIHVwb24gcmVjZXB0aW9uIG9mIGEgVFggY29tcGxldGUgaW50ZXJydXB0ICovCkBAIC00MTIsNyArNDE2LDcgQEAKIH0KIAogLyogY2FsbGVyIG11c3QgaG9sZCB3bC0+bXV0ZXggKi8KLXZvaWQgd2wxMjcxX3R4X2ZsdXNoKHN0cnVjdCB3bDEyNzEgKndsKQordm9pZCB3bDEyNzFfdHhfcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaW50IGk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTQyMSw3ICs0MjUsNyBAQAogLyogCWNvbnRyb2wtPmZsYWdzID0gMDsgRklYTUUgKi8KIAogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndsLT50eF9xdWV1ZSkpKSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgImZsdXNoaW5nIHNrYiAweCVwIiwgc2tiKTsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLCAiZnJlZWluZyBza2IgMHglcCIsIHNrYik7CiAJCWllZWU4MDIxMV90eF9zdGF0dXMod2wtPmh3LCBza2IpOwogCX0KIApAQCAtNDI5LDYgKzQzMywzMiBAQAogCQlpZiAod2wtPnR4X2ZyYW1lc1tpXSAhPSBOVUxMKSB7CiAJCQlza2IgPSB3bC0+dHhfZnJhbWVzW2ldOwogCQkJd2wtPnR4X2ZyYW1lc1tpXSA9IE5VTEw7CisJCQl3bDEyNzFfZGVidWcoREVCVUdfVFgsICJmcmVlaW5nIHNrYiAweCVwIiwgc2tiKTsKIAkJCWllZWU4MDIxMV90eF9zdGF0dXMod2wtPmh3LCBza2IpOwogCQl9CisJd2wtPnR4X2ZyYW1lc19jbnQgPSAwOworfQorCisjZGVmaW5lIFdMMTI3MV9UWF9GTFVTSF9USU1FT1VUIDUwMDAwMAorCisvKiBjYWxsZXIgbXVzdCAqTk9UKiBob2xkIHdsLT5tdXRleCAqLwordm9pZCB3bDEyNzFfdHhfZmx1c2goc3RydWN0IHdsMTI3MSAqd2wpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXRpbWVvdXQgPSBqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyhXTDEyNzFfVFhfRkxVU0hfVElNRU9VVCk7CisKKwl3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLCAiZmx1c2hpbmcgdHggYnVmZmVyOiAlZCIsCisJCQkgICAgIHdsLT50eF9mcmFtZXNfY250KTsKKwkJaWYgKCh3bC0+dHhfZnJhbWVzX2NudCA9PSAwKSAmJgorCQkgICAgc2tiX3F1ZXVlX2VtcHR5KCZ3bC0+dHhfcXVldWUpKSB7CisJCQltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCQltc2xlZXAoMSk7CisJfQorCisJd2wxMjcxX3dhcm5pbmcoIlVuYWJsZSB0byBmbHVzaCBhbGwgVFggYnVmZmVycywgdGltZWQgb3V0LiIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV90eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI3MV90eC5oCmluZGV4IDNiOGI3YWMuLjQ4YmY5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyNzFfdHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjcxX3R4LmgKQEAgLTgwLDcgKzgwLDcgQEAKIAkvKiBJZGVudGlmaWVyIG9mIHRoZSByZW1vdGUgU1RBIGluIElCU1MsIDEgaW4gaW5mcmEtQlNTICovCiAJdTggYWlkOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBlbnVtIHdsMTI3MV90eF9od19yZXNfc3RhdHVzIHsKIAlUWF9TVUNDRVNTICAgICAgICAgID0gMCwKQEAgLTExNSwxMyArMTE1LDEzIEBACiAJdTggcmF0ZV9jbGFzc19pbmRleDsKIAkvKiBmb3IgNC1ieXRlIGFsaWdubWVudC4gKi8KIAl1OCBzcGFyZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTI3MV90eF9od19yZXNfaWYgewogCV9fbGUzMiB0eF9yZXN1bHRfZndfY291bnRlcjsKIAlfX2xlMzIgdHhfcmVzdWx0X2hvc3RfY291bnRlcjsKIAlzdHJ1Y3Qgd2wxMjcxX3R4X2h3X3Jlc19kZXNjciB0eF9yZXN1bHRzX3F1ZXVlW1RYX0hXX1JFU1VMVF9RVUVVRV9MRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIGludCB3bDEyNzFfdHhfZ2V0X3F1ZXVlKGludCBxdWV1ZSkKIHsKQEAgLTE1OCw2ICsxNTgsNyBAQAogCiB2b2lkIHdsMTI3MV90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIHdsMTI3MV90eF9jb21wbGV0ZShzdHJ1Y3Qgd2wxMjcxICp3bCk7Cit2b2lkIHdsMTI3MV90eF9yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiB2b2lkIHdsMTI3MV90eF9mbHVzaChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiB1OCB3bDEyNzFfcmF0ZV90b19pZHgoc3RydWN0IHdsMTI3MSAqd2wsIGludCByYXRlKTsKIHUzMiB3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiByYXRlX3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4XzgwMjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4XzgwMjExLmgKaW5kZXggMDU1ZDdiYy4uMTg0NjI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eF84MDIxMS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfODAyMTEuaApAQCAtNjYsNDEgKzY2LDQxIEBACiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCV9fbGUxNiBzZXFfY3RsOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyeHhfaWVfaGVhZGVyIHsKIAl1OCBpZDsKIAl1OCBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIElFcyAqLwogCiBzdHJ1Y3Qgd2wxMnh4X2llX3NzaWQgewogCXN0cnVjdCB3bDEyeHhfaWVfaGVhZGVyIGhlYWRlcjsKIAljaGFyIHNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wxMnh4X2llX3JhdGVzIHsKIAlzdHJ1Y3Qgd2wxMnh4X2llX2hlYWRlciBoZWFkZXI7CiAJdTggcmF0ZXNbTUFYX1NVUFBPUlRFRF9SQVRFU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyeHhfaWVfZHNfcGFyYW1zIHsKIAlzdHJ1Y3Qgd2wxMnh4X2llX2hlYWRlciBoZWFkZXI7CiAJdTggY2hhbm5lbDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNvdW50cnlfdHJpcGxldCB7CiAJdTggY2hhbm5lbDsKIAl1OCBudW1fY2hhbm5lbHM7CiAJdTggbWF4X3R4X3Bvd2VyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wxMnh4X2llX2NvdW50cnkgewogCXN0cnVjdCB3bDEyeHhfaWVfaGVhZGVyIGhlYWRlcjsKIAl1OCBjb3VudHJ5X3N0cmluZ1tDT1VOVFJZX1NUUklOR19MRU5dOwogCXN0cnVjdCBjb3VudHJ5X3RyaXBsZXQgdHJpcGxldHNbTUFYX0NPVU5UUllfVFJJUExFVFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qIFRlbXBsYXRlcyAqLwpAQCAtMTE1LDMwICsxMTUsMzAgQEAKIAlzdHJ1Y3Qgd2wxMnh4X2llX3JhdGVzIGV4dF9yYXRlczsKIAlzdHJ1Y3Qgd2wxMnh4X2llX2RzX3BhcmFtcyBkc19wYXJhbXM7CiAJc3RydWN0IHdsMTJ4eF9pZV9jb3VudHJ5IGNvdW50cnk7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyeHhfbnVsbF9kYXRhX3RlbXBsYXRlIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlciBoZWFkZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyeHhfcHNfcG9sbF90ZW1wbGF0ZSB7CiAJX19sZTE2IGZjOwogCV9fbGUxNiBhaWQ7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHRhW0VUSF9BTEVOXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMTJ4eF9xb3NfbnVsbF9kYXRhX3RlbXBsYXRlIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlciBoZWFkZXI7CiAJX19sZTE2IHFvc19jdGw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyeHhfcHJvYmVfcmVxX3RlbXBsYXRlIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IHdsMTJ4eF9pZV9zc2lkIHNzaWQ7CiAJc3RydWN0IHdsMTJ4eF9pZV9yYXRlcyByYXRlczsKIAlzdHJ1Y3Qgd2wxMnh4X2llX3JhdGVzIGV4dF9yYXRlczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBzdHJ1Y3Qgd2wxMnh4X3Byb2JlX3Jlc3BfdGVtcGxhdGUgewpAQCAtMTUxLDYgKzE1MSw2IEBACiAJc3RydWN0IHdsMTJ4eF9pZV9yYXRlcyBleHRfcmF0ZXM7CiAJc3RydWN0IHdsMTJ4eF9pZV9kc19wYXJhbXMgZHNfcGFyYW1zOwogCXN0cnVjdCB3bDEyeHhfaWVfY291bnRyeSBjb3VudHJ5OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmgKaW5kZXggODgxNmUzNy4uM2ZiZmQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmgKQEAgLTIzMSwxMiArMjMxLDEyIEBACiAJCSAgYnV0IHNpemVvZihlbnVtKSA+IHNpemVvZih1OCkgOi0oICovCiAJdTggbGVuOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgewogCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKIAl1OCAJCQkgICAgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICogQWNjb3JkaW5nIHRvIDgwMi4xMSBXaXJlbGVzcyBOZXRvd29ycywgdGhlIGRlZmluaXRpdmUgZ3VpZGUgLSBPJ1JlaWxseQpAQCAtMjQ3LDEyICsyNDcsMTIgQEAKIHN0cnVjdCBpd19tZ210X2RhdGFfcnNldCB7CiAJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOwogCXU4IAkJCSAgICBkYXRhX3JhdGVfbGFiZWxzW0lXX0RBVEFfUkFURV9NQVhfTEFCRUxTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGl3X21nbXRfZHNfcHNldCB7CiAJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOwogCXU4IAkJCSAgICBjaGFuOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdfbWdtdF9jZl9wc2V0IHsKIAlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CkBAIC0yNjAsMTIgKzI2MCwxMiBAQAogCXU4IAkJCSAgICBjZnBfcGVyaW9kOwogCXUxNiAJCQkgICAgY2ZwX21heF9kdXJhdGlvbjsKIAl1MTYgCQkJICAgIGNmcF9kdXJfcmVtYWluaW5nOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdfbWdtdF9pYnNzX3BzZXQgewogCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKIAl1MTYgCQkJICAgIGF0aW1fd2luZG93OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgd2wzNTAxX3R4X2hkciB7CiAJdTE2CXR4X2NudDsKQEAgLTU0NCwxMiArNTQ0LDEyIEBACiAJdTgJc2VydmljZTsKIAl1MTYJbGVuOwogCXUxNgljcmMxNjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHdsMzUwMV84MDIxMV90eF9oZHIgewogCXN0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIJcGNscF9oZHI7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIJCW1hY19oZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgICBSZXNlcnZlIHRoZSBiZWdpbm5pbmcgVHggc3BhY2UgZm9yIGRlc2NyaXB0b3IgdXNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwppbmRleCAzNzZjNmI5Li5hMWNjMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpAQCAtNDgsNyArNDgsNiBAQAogCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC04OSwxMyArODgsNiBAQAogc3RhdGljIGludCB3bDM1MDFfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKIHN0YXRpYyB2b2lkIHdsMzUwMV9yZWxlYXNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKIAotLyoKLSAqIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKLSAqIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCi0gKiBkYXRhYmFzZS4KLSAqLwotc3RhdGljIGRldl9pbmZvX3Qgd2wzNTAxX2Rldl9pbmZvID0gIndsMzUwMV9jcyI7Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludCByZWdfZG9tYWluOwogCWludCBtaW4sIG1heCwgZGVmbHQ7CkBAIC0xNDIxLDcgKzE0MTMsNyBAQAogCiBzdGF0aWMgdm9pZCB3bDM1MDFfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKLQlzdHJsY3B5KGluZm8tPmRyaXZlciwgd2wzNTAxX2Rldl9pbmZvLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsICJ3bDM1MDFfY3MiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0gewpAQCAtMTg5Miw5ICsxODg0LDggQEAKIAlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXM7CiAKIAkvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KLQlwX2Rldi0+aW8uTnVtUG9ydHMxCT0gMTY7Ci0JcF9kZXYtPmlvLkF0dHJpYnV0ZXMxCT0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JcF9kZXYtPmlvLklPQWRkckxpbmVzCT0gNTsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZAk9IDE2OworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MJPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKIAogCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzCT0gQ09ORl9FTkFCTEVfSVJROwpAQCAtMTk0MCwxMyArMTkzMSwxNCBAQAogCS8qIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuICBJZiB5b3UKIAkgKiB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0byBwaWNrIGFkZHJlc3NlcyAtLQogCSAqIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4gKi8KKwlsaW5rLT5pb19saW5lcyA9IDU7CiAKIAlmb3IgKGogPSAweDI4MDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKIAkJLyogVGhlICdeMHgzMDAnIGlzIHNvIHRoYXQgd2UgcHJvYmUgMHgzMDAtMHgzZmYgZmlyc3QsIHRoZW4KIAkJICogMHgyMDAtMHgyZmYsIGFuZCBzbyBvbiwgYmVjYXVzZSB0aGlzIHNlZW1zIHNhZmVyICovCi0JCWxpbmstPmlvLkJhc2VQb3J0MSA9IGo7Ci0JCWxpbmstPmlvLkJhc2VQb3J0MiA9IGxpbmstPmlvLkJhc2VQb3J0MSArIDB4MTA7Ci0JCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOworCQlsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgPSBqOworCQlsaW5rLT5yZXNvdXJjZVsxXS0+c3RhcnQgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweDEwOworCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluayk7CiAJCWlmIChpID09IDApCiAJCQlicmVhazsKIAl9CkBAIC0xOTY4LDcgKzE5NjAsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAogCWRldi0+aXJxID0gbGluay0+aXJxOwotCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCWRldi0+YmFzZV9hZGRyID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCVNFVF9ORVRERVZfREVWKGRldiwgJmxpbmstPmRldik7CiAJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAid2wzNTAxX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwppbmRleCBiMGI2NjYwLi40MzMwN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwpAQCAtNDIsNyArNDIsOCBAQAogCXsgWkRfUkVHRE9NQUlOX0lDLCAiQ0EiIH0sCiAJeyBaRF9SRUdET01BSU5fRVRTSSwgIkRFIiB9LCAvKiBHZW5lcmljIEVUU0ksIHVzZSBtb3N0IHJlc3RyaWN0aXZlICovCiAJeyBaRF9SRUdET01BSU5fSkFQQU4sICJKUCIgfSwKLQl7IFpEX1JFR0RPTUFJTl9KQVBBTl9BREQsICJKUCIgfSwKKwl7IFpEX1JFR0RPTUFJTl9KQVBBTl8yLCAiSlAiIH0sCisJeyBaRF9SRUdET01BSU5fSkFQQU5fMywgIkpQIiB9LAogCXsgWkRfUkVHRE9NQUlOX1NQQUlOLCAiRVMiIH0sCiAJeyBaRF9SRUdET01BSU5fRlJBTkNFLCAiRlIiIH0sCiB9OwpAQCAtODU1LDcgKzg1Niw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAobmVlZF9wYWRkaW5nKSB7Ci0JCS8qIE1ha2Ugc3VyZSB0aGUgdGhlIHBheWxvYWQgZGF0YSBpcyA0IGJ5dGUgYWxpZ25lZC4gKi8KKwkJLyogTWFrZSBzdXJlIHRoZSBwYXlsb2FkIGRhdGEgaXMgNCBieXRlIGFsaWduZWQuICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCmluZGV4IDYzMGMyOTguLmE2ZDg2YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCkBAIC0zNSw3ICszNSw3IEBACiAJX19sZTE2IGN1cnJlbnRfbGVuZ3RoOwogCXU4ICAgICBzZXJ2aWNlOwogCV9fbGUxNiAgbmV4dF9mcmFtZV9sZW5ndGg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBaRF9DU19SRVNFUlZFRF9TSVpFCTI1CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogc3RydWN0IHJ4X2xlbmd0aF9pbmZvIHsKIAlfX2xlMTYgbGVuZ3RoWzNdOwogCV9fbGUxNiB0YWc7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBSWF9MRU5HVEhfSU5GT19UQUcJCTB4Njk3ZQogCkBAIC0xMTcsNyArMTE3LDcgQEAKIAl1OCBzaWduYWxfcXVhbGl0eV9vZmRtOwogCXU4IGRlY3J5cHRpb25fdHlwZTsKIAl1OCBmcmFtZV9zdGF0dXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogcnhfc3RhdHVzIGZpZWxkIGRlY3J5cHRpb25fdHlwZSAqLwogI2RlZmluZSBaRF9SWF9OT19XRVAJMApAQCAtMTUzLDcgKzE1Myw3IEBACiAJdTggbWFjW0VUSF9BTEVOXTsKIAl1OCByZXRyeTsKIAl1OCBmYWlsdXJlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gbWFjX2ZsYWdzIHsKIAlNQUNfRklYRURfQ0hBTk5FTCA9IDB4MDEsCkBAIC0yMTIsOCArMjEyLDkgQEAKICNkZWZpbmUgWkRfUkVHRE9NQUlOX0VUU0kJMHgzMAogI2RlZmluZSBaRF9SRUdET01BSU5fU1BBSU4JMHgzMQogI2RlZmluZSBaRF9SRUdET01BSU5fRlJBTkNFCTB4MzIKLSNkZWZpbmUgWkRfUkVHRE9NQUlOX0pBUEFOX0FERAkweDQwCisjZGVmaW5lIFpEX1JFR0RPTUFJTl9KQVBBTl8yCTB4NDAKICNkZWZpbmUgWkRfUkVHRE9NQUlOX0pBUEFOCTB4NDEKKyNkZWZpbmUgWkRfUkVHRE9NQUlOX0pBUEFOXzMJMHg0OQogCiBlbnVtIHsKIAlNSU5fQ0hBTk5FTDI0ID0gMSwKQEAgLTIyNSw3ICsyMjYsNyBAQAogc3RydWN0IG9mZG1fcGxjcF9oZWFkZXIgewogCXU4IHByZWZpeFszXTsKIAlfX2xlMTYgc2VydmljZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIHU4IHpkX29mZG1fcGxjcF9oZWFkZXJfcmF0ZShjb25zdCBzdHJ1Y3Qgb2ZkbV9wbGNwX2hlYWRlciAqaGVhZGVyKQogewpAQCAtMjUyLDcgKzI1Myw3IEBACiAJdTggc2VydmljZTsKIAlfX2xlMTYgbGVuZ3RoOwogCV9fbGUxNiBjcmMxNjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIHU4IHpkX2Nja19wbGNwX2hlYWRlcl9zaWduYWwoY29uc3Qgc3RydWN0IGNja19wbGNwX2hlYWRlciAqaGVhZGVyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCBjMjU3OTQwLi44MThlMTQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKQEAgLTg0NCw3ICs4NDQsNyBAQAogICogQHVzYjogYSAmc3RydWN0IHpkX3VzYiBwb2ludGVyCiAgKiBAdXJiOiBVUkIgdG8gYmUgZnJlZWQKICAqCi0gKiBGcmVlcyB0aGUgdGhlIHRyYW5zbWlzc2lvbiBVUkIsIHdoaWNoIG1lYW5zIHRvIHB1dCBpdCBvbiB0aGUgZnJlZSBVUkIKKyAqIEZyZWVzIHRoZSB0cmFuc21pc3Npb24gVVJCLCB3aGljaCBtZWFucyB0byBwdXQgaXQgb24gdGhlIGZyZWUgVVJCCiAgKiBsaXN0LgogICovCiBzdGF0aWMgdm9pZCBmcmVlX3R4X3VyYihzdHJ1Y3QgemRfdXNiICp1c2IsIHN0cnVjdCB1cmIgKnVyYikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKaW5kZXggMDQ5ZjhiOS4uMWIxNjU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKQEAgLTc5LDE3ICs3OSwxNyBAQAogc3RydWN0IHVzYl9yZXFfcmVhZF9yZWdzIHsKIAlfX2xlMTYgaWQ7CiAJX19sZTE2IGFkZHJbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJlZ19kYXRhIHsKIAlfX2xlMTYgYWRkcjsKIAlfX2xlMTYgdmFsdWU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVzYl9yZXFfd3JpdGVfcmVncyB7CiAJX19sZTE2IGlkOwogCXN0cnVjdCByZWdfZGF0YSByZWdfd3JpdGVzWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIGVudW0gewogCVJGX0lGX0xFID0gMHgwMiwKQEAgLTEwNiw3ICsxMDYsNyBAQAogCS8qIFJGMjU5NTogMjQgKi8KIAlfX2xlMTYgYml0X3ZhbHVlc1swXTsKIAkvKiAoQ1IyMDMgJiB+KFJGX0lGX0xFIHwgUkZfQ0xLIHwgUkZfREFUQSkpIHwgKGJpdCA/IFJGX0RBVEEgOiAwKSAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFVTQiBpbnRlcnJ1cHQgKi8KIApAQCAtMTIzLDEyICsxMjMsMTIgQEAKIHN0cnVjdCB1c2JfaW50X2hlYWRlciB7CiAJdTggdHlwZTsJLyogbXVzdCBhbHdheXMgYmUgMSAqLwogCXU4IGlkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCB1c2JfaW50X3JlZ3MgewogCXN0cnVjdCB1c2JfaW50X2hlYWRlciBoZHI7CiAJc3RydWN0IHJlZ19kYXRhIHJlZ3NbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVzYl9pbnRfcmV0cnlfZmFpbCB7CiAJc3RydWN0IHVzYl9pbnRfaGVhZGVyIGhkcjsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCXU4IF9kdW1teTsKIAl1OCBhZGRyW0VUSF9BTEVOXTsKIAl1OCBpYnNzX3dha2V1cF9kZXN0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByZWFkX3JlZ3NfaW50IHsKIAlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwppbmRleCBkNTA0ZTJiLi5iNTBmZWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwpAQCAtMTYyMSw2ICsxNjIxLDcgQEAKIAkJaWYgKHhlbm5ldF9jb25uZWN0KG5ldGRldikgIT0gMCkKIAkJCWJyZWFrOwogCQl4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDb25uZWN0ZWQpOworCQluZXRpZl9ub3RpZnlfcGVlcnMobmV0ZGV2KTsKIAkJYnJlYWs7CiAKIAljYXNlIFhlbmJ1c1N0YXRlQ2xvc2luZzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jIGIvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKaW5kZXggZDA0YzViMi4uYjJjMmYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKKysrIGIvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3h0c29uaWMuYyBiL2RyaXZlcnMvbmV0L3h0c29uaWMuYwppbmRleCBmZGJhOWNiLi45ZjEyMDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94dHNvbmljLmMKKysrIGIvZHJpdmVycy9uZXQveHRzb25pYy5jCkBAIC05MywxMiArOTMsMjAgQEAKIAogc3RhdGljIGludCB4dHNvbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsc29uaWNfaW50ZXJydXB0LElSUUZfRElTQUJMRUQsInNvbmljIixkZXYpKSB7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzb25pY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQkJInNvbmljIiwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0JcmV0dXJuIHNvbmljX29wZW4oZGV2KTsKKworCXJldHZhbCA9IHNvbmljX29wZW4oZGV2KTsKKwlpZiAocmV0dmFsKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IHh0c29uaWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvS2NvbmZpZyBiL2RyaXZlcnMvb2YvS2NvbmZpZwppbmRleCA3Y2VjYzhmLi42YWNiZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL0tjb25maWcKKysrIGIvZHJpdmVycy9vZi9LY29uZmlnCkBAIC0xLDM1ICsxLDYxIEBACitjb25maWcgRFRDCisJYm9vbAorCitjb25maWcgT0YKKwlib29sCisKK21lbnUgIkZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBhbmQgT3BlbiBGaXJtd2FyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gT0YKKworY29uZmlnIFBST0NfREVWSUNFVFJFRQorCWJvb2wgIlN1cHBvcnQgZm9yIGRldmljZSB0cmVlIGluIC9wcm9jIgorCWRlcGVuZHMgb24gUFJPQ19GUyAmJiAhU1BBUkMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgZGV2aWNlLXRyZWUgZGlyZWN0b3J5IHVuZGVyIC9wcm9jIHdoaWNoIGNvbnRhaW5zCisJICBhbiBpbWFnZSBvZiB0aGUgZGV2aWNlIHRyZWUgdGhhdCB0aGUga2VybmVsIGNvcGllcyBmcm9tIE9wZW4KKwkgIEZpcm13YXJlIG9yIG90aGVyIGJvb3QgZmlybXdhcmUuIElmIHVuc3VyZSwgc2F5IFkgaGVyZS4KKwogY29uZmlnIE9GX0ZMQVRUUkVFCiAJYm9vbAotCWRlcGVuZHMgb24gT0YKKwlzZWxlY3QgRFRDCiAKIGNvbmZpZyBPRl9EWU5BTUlDCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gT0YgJiYgUFBDX09GCisJZGVwZW5kcyBvbiBQUENfT0YKKworY29uZmlnIE9GX0FERFJFU1MKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiAhU1BBUkMKKworY29uZmlnIE9GX0lSUQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uICFTUEFSQwogCiBjb25maWcgT0ZfREVWSUNFCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gT0YgJiYgKFNQQVJDIHx8IFBQQ19PRiB8fCBNSUNST0JMQVpFKQogCiBjb25maWcgT0ZfR1BJTwogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIE9GICYmIChQUENfT0YgfHwgTUlDUk9CTEFaRSkgJiYgR1BJT0xJQgorCWRlcGVuZHMgb24gR1BJT0xJQiAmJiAhU1BBUkMKIAloZWxwCiAJICBPcGVuRmlybXdhcmUgR1BJTyBhY2Nlc3NvcnMKIAogY29uZmlnIE9GX0kyQwogCWRlZl90cmlzdGF0ZSBJMkMKLQlkZXBlbmRzIG9uIChQUENfT0YgfHwgTUlDUk9CTEFaRSkgJiYgSTJDCisJZGVwZW5kcyBvbiBJMkMgJiYgIVNQQVJDCiAJaGVscAogCSAgT3BlbkZpcm13YXJlIEkyQyBhY2Nlc3NvcnMKIAogY29uZmlnIE9GX1NQSQogCWRlZl90cmlzdGF0ZSBTUEkKLQlkZXBlbmRzIG9uIE9GICYmIChQUENfT0YgfHwgTUlDUk9CTEFaRSkgJiYgU1BJCisJZGVwZW5kcyBvbiBTUEkgJiYgIVNQQVJDCiAJaGVscAogCSAgT3BlbkZpcm13YXJlIFNQSSBhY2Nlc3NvcnMKIAogY29uZmlnIE9GX01ESU8KIAlkZWZfdHJpc3RhdGUgUEhZTElCCi0JZGVwZW5kcyBvbiBPRiAmJiBQSFlMSUIKKwlkZXBlbmRzIG9uIFBIWUxJQgogCWhlbHAKIAkgIE9wZW5GaXJtd2FyZSBNRElPIGJ1cyAoRXRoZXJuZXQgUEhZKSBhY2Nlc3NvcnMKKworZW5kbWVudSAjIE9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL01ha2VmaWxlIGIvZHJpdmVycy9vZi9NYWtlZmlsZQppbmRleCBmMjMyY2M5Li4wMDUyYzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvb2YvTWFrZWZpbGUKQEAgLTEsNSArMSw3IEBACiBvYmoteSA9IGJhc2Uubwogb2JqLSQoQ09ORklHX09GX0ZMQVRUUkVFKSArPSBmZHQubworb2JqLSQoQ09ORklHX09GX0FERFJFU1MpICArPSBhZGRyZXNzLm8KK29iai0kKENPTkZJR19PRl9JUlEpICAgICs9IGlycS5vCiBvYmotJChDT05GSUdfT0ZfREVWSUNFKSArPSBkZXZpY2UubyBwbGF0Zm9ybS5vCiBvYmotJChDT05GSUdfT0ZfR1BJTykgICArPSBncGlvLm8KIG9iai0kKENPTkZJR19PRl9JMkMpCSs9IG9mX2kyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2FkZHJlc3MuYyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWRiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL29mL2FkZHJlc3MuYwpAQCAtMCwwICsxLDU5NSBAQAorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX3JlZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyogTWF4IGFkZHJlc3Mgc2l6ZSB3ZSBkZWFsIHdpdGggKi8KKyNkZWZpbmUgT0ZfTUFYX0FERFJfQ0VMTFMJNAorI2RlZmluZSBPRl9DSEVDS19DT1VOVFMobmEsIG5zKQkoKG5hKSA+IDAgJiYgKG5hKSA8PSBPRl9NQVhfQUREUl9DRUxMUyAmJiBcCisJCQkobnMpID4gMCkKKworc3RhdGljIHN0cnVjdCBvZl9idXMgKm9mX21hdGNoX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK3N0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmFkZHJwLAorCQkJCSAgICB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCSAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworCisvKiBEZWJ1ZyB1dGlsaXR5ICovCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIG9mX2R1bXBfYWRkcihjb25zdCBjaGFyICpzLCBjb25zdCB1MzIgKmFkZHIsIGludCBuYSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCBzKTsKKwl3aGlsZSAobmEtLSkKKwkJcHJpbnRrKCIgJTA4eCIsIGJlMzJfdG9fY3B1KCooYWRkcisrKSkpOworCXByaW50aygiXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgY29uc3QgdTMyICphZGRyLCBpbnQgbmEpIHsgfQorI2VuZGlmCisKKy8qIENhbGxiYWNrcyBmb3IgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3JzICovCitzdHJ1Y3Qgb2ZfYnVzIHsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IGNoYXIJKmFkZHJlc3NlczsKKwlpbnQJCSgqbWF0Y2gpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KTsKKwl2b2lkCQkoKmNvdW50X2NlbGxzKShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkLAorCQkJCSAgICAgICBpbnQgKmFkZHJjLCBpbnQgKnNpemVjKTsKKwl1NjQJCSgqbWFwKSh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsCisJCQkJaW50IG5hLCBpbnQgbnMsIGludCBwbmEpOworCWludAkJKCp0cmFuc2xhdGUpKHUzMiAqYWRkciwgdTY0IG9mZnNldCwgaW50IG5hKTsKKwl1bnNpZ25lZCBpbnQJKCpnZXRfZmxhZ3MpKGNvbnN0IHUzMiAqYWRkcik7Cit9OworCisvKgorICogRGVmYXVsdCB0cmFuc2xhdG9yIChnZW5lcmljIGJ1cykKKyAqLworCitzdGF0aWMgdm9pZCBvZl9idXNfZGVmYXVsdF9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJCQkgICAgICAgaW50ICphZGRyYywgaW50ICpzaXplYykKK3sKKwlpZiAoYWRkcmMpCisJCSphZGRyYyA9IG9mX25fYWRkcl9jZWxscyhkZXYpOworCWlmIChzaXplYykKKwkJKnNpemVjID0gb2Zfbl9zaXplX2NlbGxzKGRldik7Cit9CisKK3N0YXRpYyB1NjQgb2ZfYnVzX2RlZmF1bHRfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwKKwkJaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCit7CisJdTY0IGNwLCBzLCBkYTsKKworCWNwID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UsIG5hKTsKKwlzICA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlICsgbmEgKyBwbmEsIG5zKTsKKwlkYSA9IG9mX3JlYWRfbnVtYmVyKGFkZHIsIG5hKTsKKworCXByX2RlYnVnKCJPRjogZGVmYXVsdCBtYXAsIGNwPSVsbHgsIHM9JWxseCwgZGE9JWxseFxuIiwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpY3AsICh1bnNpZ25lZCBsb25nIGxvbmcpcywKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpZGEpOworCisJaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCisJCXJldHVybiBPRl9CQURfQUREUjsKKwlyZXR1cm4gZGEgLSBjcDsKK30KKworc3RhdGljIGludCBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpCit7CisJdTY0IGEgPSBvZl9yZWFkX251bWJlcihhZGRyLCBuYSk7CisJbWVtc2V0KGFkZHIsIDAsIG5hICogNCk7CisJYSArPSBvZmZzZXQ7CisJaWYgKG5hID4gMSkKKwkJYWRkcltuYSAtIDJdID0gY3B1X3RvX2JlMzIoYSA+PiAzMik7CisJYWRkcltuYSAtIDFdID0gY3B1X3RvX2JlMzIoYSAmIDB4ZmZmZmZmZmZ1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCit7CisJcmV0dXJuIElPUkVTT1VSQ0VfTUVNOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIFBDSSBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcgorICovCisKK3N0YXRpYyBpbnQgb2ZfYnVzX3BjaV9tYXRjaChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCS8qICJ2Y2kiIGlzIGZvciB0aGUgL2NoYW9zIGJyaWRnZSBvbiAxc3QtZ2VuIFBDSSBwb3dlcm1hY3MgKi8KKwlyZXR1cm4gIXN0cmNtcChucC0+dHlwZSwgInBjaSIpIHx8ICFzdHJjbXAobnAtPnR5cGUsICJ2Y2kiKTsKK30KKworc3RhdGljIHZvaWQgb2ZfYnVzX3BjaV9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCit7CisJaWYgKGFkZHJjKQorCQkqYWRkcmMgPSAzOworCWlmIChzaXplYykKKwkJKnNpemVjID0gMjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKKwl1MzIgdyA9IGFkZHJbMF07CisKKwlzd2l0Y2goKHcgPj4gMjQpICYgMHgwMykgeworCWNhc2UgMHgwMToKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JTzsKKwkJYnJlYWs7CisJY2FzZSAweDAyOiAvKiAzMiBiaXRzICovCisJY2FzZSAweDAzOiAvKiA2NCBiaXRzICovCisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOworCQlicmVhazsKKwl9CisJaWYgKHcgJiAweDQwMDAwMDAwKQorCQlmbGFncyB8PSBJT1JFU09VUkNFX1BSRUZFVENIOworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIHU2NCBvZl9idXNfcGNpX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQoreworCXU2NCBjcCwgcywgZGE7CisJdW5zaWduZWQgaW50IGFmLCByZjsKKworCWFmID0gb2ZfYnVzX3BjaV9nZXRfZmxhZ3MoYWRkcik7CisJcmYgPSBvZl9idXNfcGNpX2dldF9mbGFncyhyYW5nZSk7CisKKwkvKiBDaGVjayBhZGRyZXNzIHR5cGUgbWF0Y2ggKi8KKwlpZiAoKGFmIF4gcmYpICYgKElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9JTykpCisJCXJldHVybiBPRl9CQURfQUREUjsKKworCS8qIFJlYWQgYWRkcmVzcyB2YWx1ZXMsIHNraXBwaW5nIGhpZ2ggY2VsbCAqLworCWNwID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyAxLCBuYSAtIDEpOworCXMgID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOworCWRhID0gb2ZfcmVhZF9udW1iZXIoYWRkciArIDEsIG5hIC0gMSk7CisKKwlwcl9kZWJ1ZygiT0Y6IFBDSSBtYXAsIGNwPSVsbHgsIHM9JWxseCwgZGE9JWxseFxuIiwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpY3AsICh1bnNpZ25lZCBsb25nIGxvbmcpcywKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpZGEpOworCisJaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCisJCXJldHVybiBPRl9CQURfQUREUjsKKwlyZXR1cm4gZGEgLSBjcDsKK30KKworc3RhdGljIGludCBvZl9idXNfcGNpX3RyYW5zbGF0ZSh1MzIgKmFkZHIsIHU2NCBvZmZzZXQsIGludCBuYSkKK3sKKwlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlKGFkZHIgKyAxLCBvZmZzZXQsIG5hIC0gMSk7Cit9CisKK2NvbnN0IHUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLCB1NjQgKnNpemUsCisJCQl1bnNpZ25lZCBpbnQgKmZsYWdzKQoreworCWNvbnN0IHUzMiAqcHJvcDsKKwl1bnNpZ25lZCBpbnQgcHNpemU7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CisJc3RydWN0IG9mX2J1cyAqYnVzOworCWludCBvbmVzaXplLCBpLCBuYSwgbnM7CisKKwkvKiBHZXQgcGFyZW50ICYgbWF0Y2ggYnVzIHR5cGUgKi8KKwlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlidXMgPSBvZl9tYXRjaF9idXMocGFyZW50KTsKKwlpZiAoc3RyY21wKGJ1cy0+bmFtZSwgInBjaSIpKSB7CisJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJCXJldHVybiBOVUxMOworCX0KKwlidXMtPmNvdW50X2NlbGxzKGRldiwgJm5hLCAmbnMpOworCW9mX25vZGVfcHV0KHBhcmVudCk7CisJaWYgKCFPRl9DSEVDS19DT1VOVFMobmEsIG5zKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBHZXQgInJlZyIgb3IgImFzc2lnbmVkLWFkZHJlc3NlcyIgcHJvcGVydHkgKi8KKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgYnVzLT5hZGRyZXNzZXMsICZwc2l6ZSk7CisJaWYgKHByb3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcHNpemUgLz0gNDsKKworCW9uZXNpemUgPSBuYSArIG5zOworCWZvciAoaSA9IDA7IHBzaXplID49IG9uZXNpemU7IHBzaXplIC09IG9uZXNpemUsIHByb3AgKz0gb25lc2l6ZSwgaSsrKSB7CisJCXUzMiB2YWwgPSBiZTMyX3RvX2NwdShwcm9wWzBdKTsKKwkJaWYgKCh2YWwgJiAweGZmKSA9PSAoKGJhcl9ubyAqIDQpICsgUENJX0JBU0VfQUREUkVTU18wKSkgeworCQkJaWYgKHNpemUpCisJCQkJKnNpemUgPSBvZl9yZWFkX251bWJlcihwcm9wICsgbmEsIG5zKTsKKwkJCWlmIChmbGFncykKKwkJCQkqZmxhZ3MgPSBidXMtPmdldF9mbGFncyhwcm9wKTsKKwkJCXJldHVybiBwcm9wOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfcGNpX2FkZHJlc3MpOworCitpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCisJCQkgICAgICAgc3RydWN0IHJlc291cmNlICpyKQoreworCWNvbnN0IHUzMgkqYWRkcnA7CisJdTY0CQlzaXplOworCXVuc2lnbmVkIGludAlmbGFnczsKKworCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKGRldiwgYmFyLCAmc2l6ZSwgJmZsYWdzKTsKKwlpZiAoYWRkcnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIGFkZHJwLCBzaXplLCBmbGFncywgcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKgorICogSVNBIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9yCisgKi8KKworc3RhdGljIGludCBvZl9idXNfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJcmV0dXJuICFzdHJjbXAobnAtPm5hbWUsICJpc2EiKTsKK30KKworc3RhdGljIHZvaWQgb2ZfYnVzX2lzYV9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkLAorCQkJCSAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCit7CisJaWYgKGFkZHJjKQorCQkqYWRkcmMgPSAyOworCWlmIChzaXplYykKKwkJKnNpemVjID0gMTsKK30KKworc3RhdGljIHU2NCBvZl9idXNfaXNhX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQoreworCXU2NCBjcCwgcywgZGE7CisKKwkvKiBDaGVjayBhZGRyZXNzIHR5cGUgbWF0Y2ggKi8KKwlpZiAoKGFkZHJbMF0gXiByYW5nZVswXSkgJiAweDAwMDAwMDAxKQorCQlyZXR1cm4gT0ZfQkFEX0FERFI7CisKKwkvKiBSZWFkIGFkZHJlc3MgdmFsdWVzLCBza2lwcGluZyBoaWdoIGNlbGwgKi8KKwljcCA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlICsgMSwgbmEgLSAxKTsKKwlzICA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlICsgbmEgKyBwbmEsIG5zKTsKKwlkYSA9IG9mX3JlYWRfbnVtYmVyKGFkZHIgKyAxLCBuYSAtIDEpOworCisJcHJfZGVidWcoIk9GOiBJU0EgbWFwLCBjcD0lbGx4LCBzPSVsbHgsIGRhPSVsbHhcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKWNwLCAodW5zaWduZWQgbG9uZyBsb25nKXMsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKWRhKTsKKworCWlmIChkYSA8IGNwIHx8IGRhID49IChjcCArIHMpKQorCQlyZXR1cm4gT0ZfQkFEX0FERFI7CisJcmV0dXJuIGRhIC0gY3A7Cit9CisKK3N0YXRpYyBpbnQgb2ZfYnVzX2lzYV90cmFuc2xhdGUodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpCit7CisJcmV0dXJuIG9mX2J1c19kZWZhdWx0X3RyYW5zbGF0ZShhZGRyICsgMSwgb2Zmc2V0LCBuYSAtIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19pc2FfZ2V0X2ZsYWdzKGNvbnN0IHUzMiAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCXUzMiB3ID0gYWRkclswXTsKKworCWlmICh3ICYgMSkKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JTzsKKwllbHNlCisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOworCXJldHVybiBmbGFnczsKK30KKworLyoKKyAqIEFycmF5IG9mIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycworICovCisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfYnVzIG9mX2J1c3Nlc1tdID0geworI2lmZGVmIENPTkZJR19QQ0kKKwkvKiBQQ0kgKi8KKwl7CisJCS5uYW1lID0gInBjaSIsCisJCS5hZGRyZXNzZXMgPSAiYXNzaWduZWQtYWRkcmVzc2VzIiwKKwkJLm1hdGNoID0gb2ZfYnVzX3BjaV9tYXRjaCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX3BjaV9jb3VudF9jZWxscywKKwkJLm1hcCA9IG9mX2J1c19wY2lfbWFwLAorCQkudHJhbnNsYXRlID0gb2ZfYnVzX3BjaV90cmFuc2xhdGUsCisJCS5nZXRfZmxhZ3MgPSBvZl9idXNfcGNpX2dldF9mbGFncywKKwl9LAorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwkvKiBJU0EgKi8KKwl7CisJCS5uYW1lID0gImlzYSIsCisJCS5hZGRyZXNzZXMgPSAicmVnIiwKKwkJLm1hdGNoID0gb2ZfYnVzX2lzYV9tYXRjaCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX2lzYV9jb3VudF9jZWxscywKKwkJLm1hcCA9IG9mX2J1c19pc2FfbWFwLAorCQkudHJhbnNsYXRlID0gb2ZfYnVzX2lzYV90cmFuc2xhdGUsCisJCS5nZXRfZmxhZ3MgPSBvZl9idXNfaXNhX2dldF9mbGFncywKKwl9LAorCS8qIERlZmF1bHQgKi8KKwl7CisJCS5uYW1lID0gImRlZmF1bHQiLAorCQkuYWRkcmVzc2VzID0gInJlZyIsCisJCS5tYXRjaCA9IE5VTEwsCisJCS5jb3VudF9jZWxscyA9IG9mX2J1c19kZWZhdWx0X2NvdW50X2NlbGxzLAorCQkubWFwID0gb2ZfYnVzX2RlZmF1bHRfbWFwLAorCQkudHJhbnNsYXRlID0gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlLAorCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG9mX2J1cyAqb2ZfbWF0Y2hfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvZl9idXNzZXMpOyBpKyspCisJCWlmICghb2ZfYnVzc2VzW2ldLm1hdGNoIHx8IG9mX2J1c3Nlc1tpXS5tYXRjaChucCkpCisJCQlyZXR1cm4gJm9mX2J1c3Nlc1tpXTsKKwlCVUcoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBvZl90cmFuc2xhdGVfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBzdHJ1Y3Qgb2ZfYnVzICpidXMsCisJCQkgICAgc3RydWN0IG9mX2J1cyAqcGJ1cywgdTMyICphZGRyLAorCQkJICAgIGludCBuYSwgaW50IG5zLCBpbnQgcG5hLCBjb25zdCBjaGFyICpycHJvcCkKK3sKKwljb25zdCB1MzIgKnJhbmdlczsKKwl1bnNpZ25lZCBpbnQgcmxlbjsKKwlpbnQgcm9uZTsKKwl1NjQgb2Zmc2V0ID0gT0ZfQkFEX0FERFI7CisKKwkvKiBOb3JtYWxseSwgYW4gYWJzZW5jZSBvZiBhICJyYW5nZXMiIHByb3BlcnR5IG1lYW5zIHdlIGFyZQorCSAqIGNyb3NzaW5nIGEgbm9uLXRyYW5zbGF0YWJsZSBib3VuZGFyeSwgYW5kIHRodXMgdGhlIGFkZHJlc3NlcworCSAqIGJlbG93IHRoZSBjdXJyZW50IG5vdCBjYW5ub3QgYmUgY29udmVydGVkIHRvIENQVSBwaHlzaWNhbCBvbmVzLgorCSAqIFVuZm9ydHVuYXRlbHksIHdoaWxlIHRoaXMgaXMgdmVyeSBjbGVhciBpbiB0aGUgc3BlYywgaXQncyBub3QKKwkgKiB3aGF0IEFwcGxlIHVuZGVyc3Rvb2QsIGFuZCB0aGV5IGRvIGhhdmUgdGhpbmdzIGxpa2UgL3VuaS1uIG9yCisJICogL2h0IG5vZGVzIHdpdGggbm8gInJhbmdlcyIgcHJvcGVydHkgYW5kIGEgbG90IG9mIHBlcmZlY3RseQorCSAqIHVzZWFibGUgbWFwcGVkIGRldmljZXMgYmVsb3cgdGhlbS4gVGh1cyB3ZSB0cmVhdCB0aGUgYWJzZW5jZSBvZgorCSAqICJyYW5nZXMiIGFzIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgInJhbmdlcyIgcHJvcGVydHkgd2hpY2ggbWVhbnMKKwkgKiBhIDE6MSB0cmFuc2xhdGlvbiBhdCB0aGF0IGxldmVsLiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgbm90IHRvIHRyeQorCSAqIHRvIHRyYW5zbGF0ZSBhZGRyZXNzZXMgdGhhdCBhcmVuJ3Qgc3VwcG9zZWQgdG8gYmUgdHJhbnNsYXRlZCBpbgorCSAqIHRoZSBmaXJzdCBwbGFjZS4gLS1CZW5ILgorCSAqCisJICogQXMgZmFyIGFzIHdlIGtub3csIHRoaXMgZGFtYWdlIG9ubHkgZXhpc3RzIG9uIEFwcGxlIG1hY2hpbmVzLCBzbworCSAqIFRoaXMgY29kZSBpcyBvbmx5IGVuYWJsZWQgb24gcG93ZXJwYy4gLS1nY2wKKwkgKi8KKwlyYW5nZXMgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LCBycHJvcCwgJnJsZW4pOworI2lmICFkZWZpbmVkKENPTkZJR19QUEMpCisJaWYgKHJhbmdlcyA9PSBOVUxMKSB7CisJCXByX2VycigiT0Y6IG5vIHJhbmdlczsgY2Fubm90IHRyYW5zbGF0ZVxuIik7CisJCXJldHVybiAxOworCX0KKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUFBDKSAqLworCWlmIChyYW5nZXMgPT0gTlVMTCB8fCBybGVuID09IDApIHsKKwkJb2Zmc2V0ID0gb2ZfcmVhZF9udW1iZXIoYWRkciwgbmEpOworCQltZW1zZXQoYWRkciwgMCwgcG5hICogNCk7CisJCXByX2RlYnVnKCJPRjogZW1wdHkgcmFuZ2VzOyAxOjEgdHJhbnNsYXRpb25cbiIpOworCQlnb3RvIGZpbmlzaDsKKwl9CisKKwlwcl9kZWJ1ZygiT0Y6IHdhbGtpbmcgcmFuZ2VzLi4uXG4iKTsKKworCS8qIE5vdyB3YWxrIHRocm91Z2ggdGhlIHJhbmdlcyAqLworCXJsZW4gLz0gNDsKKwlyb25lID0gbmEgKyBwbmEgKyBuczsKKwlmb3IgKDsgcmxlbiA+PSByb25lOyBybGVuIC09IHJvbmUsIHJhbmdlcyArPSByb25lKSB7CisJCW9mZnNldCA9IGJ1cy0+bWFwKGFkZHIsIHJhbmdlcywgbmEsIG5zLCBwbmEpOworCQlpZiAob2Zmc2V0ICE9IE9GX0JBRF9BRERSKQorCQkJYnJlYWs7CisJfQorCWlmIChvZmZzZXQgPT0gT0ZfQkFEX0FERFIpIHsKKwkJcHJfZGVidWcoIk9GOiBub3QgZm91bmQgIVxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1jcHkoYWRkciwgcmFuZ2VzICsgbmEsIDQgKiBwbmEpOworCisgZmluaXNoOgorCW9mX2R1bXBfYWRkcigiT0Y6IHBhcmVudCB0cmFuc2xhdGlvbiBmb3I6IiwgYWRkciwgcG5hKTsKKwlwcl9kZWJ1ZygiT0Y6IHdpdGggb2Zmc2V0OiAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisKKwkvKiBUcmFuc2xhdGUgaXQgaW50byBwYXJlbnQgYnVzIHNwYWNlICovCisJcmV0dXJuIHBidXMtPnRyYW5zbGF0ZShhZGRyLCBvZmZzZXQsIHBuYSk7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgYW4gYWRkcmVzcyBmcm9tIHRoZSBkZXZpY2UtdHJlZSBpbnRvIGEgQ1BVIHBoeXNpY2FsIGFkZHJlc3MsCisgKiB0aGlzIHdhbGtzIHVwIHRoZSB0cmVlIGFuZCBhcHBsaWVzIHRoZSB2YXJpb3VzIGJ1cyBtYXBwaW5ncyBvbiB0aGUKKyAqIHdheS4KKyAqCisgKiBOb3RlOiBXZSBjb25zaWRlciB0aGF0IGNyb3NzaW5nIGFueSBsZXZlbCB3aXRoICNzaXplLWNlbGxzID09IDAgdG8gbWVhbgorICogdGhhdCB0cmFuc2xhdGlvbiBpcyBpbXBvc3NpYmxlICh0aGF0IGlzIHdlIGFyZSBub3QgZGVhbGluZyB3aXRoIGEgdmFsdWUKKyAqIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIGNwdSBwaHlzaWNhbCBhZGRyZXNzKS4gVGhpcyBpcyBub3QgcmVhbGx5IHNwZWNpZmllZAorICogdGhhdCB3YXksIGJ1dCB0aGlzIGlzIHRyYWRpdGlvbmFsbHkgdGhlIHdheSBJQk0gYXQgbGVhc3QgZG8gdGhpbmdzCisgKi8KK3U2NCBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmluX2FkZHIsCisJCQkgICBjb25zdCBjaGFyICpycHJvcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IG9mX2J1cyAqYnVzLCAqcGJ1czsKKwl1MzIgYWRkcltPRl9NQVhfQUREUl9DRUxMU107CisJaW50IG5hLCBucywgcG5hLCBwbnM7CisJdTY0IHJlc3VsdCA9IE9GX0JBRF9BRERSOworCisJcHJfZGVidWcoIk9GOiAqKiB0cmFuc2xhdGlvbiBmb3IgZGV2aWNlICVzICoqXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CisKKwkvKiBJbmNyZWFzZSByZWZjb3VudCBhdCBjdXJyZW50IGxldmVsICovCisJb2Zfbm9kZV9nZXQoZGV2KTsKKworCS8qIEdldCBwYXJlbnQgJiBtYXRjaCBidXMgdHlwZSAqLworCXBhcmVudCA9IG9mX2dldF9wYXJlbnQoZGV2KTsKKwlpZiAocGFyZW50ID09IE5VTEwpCisJCWdvdG8gYmFpbDsKKwlidXMgPSBvZl9tYXRjaF9idXMocGFyZW50KTsKKworCS8qIENvdW5kIGFkZHJlc3MgY2VsbHMgJiBjb3B5IGFkZHJlc3MgbG9jYWxseSAqLworCWJ1cy0+Y291bnRfY2VsbHMoZGV2LCAmbmEsICZucyk7CisJaWYgKCFPRl9DSEVDS19DT1VOVFMobmEsIG5zKSkgeworCQlwcmludGsoS0VSTl9FUlIgInByb21fcGFyc2U6IEJhZCBjZWxsIGNvdW50IGZvciAlc1xuIiwKKwkJICAgICAgIGRldi0+ZnVsbF9uYW1lKTsKKwkJZ290byBiYWlsOworCX0KKwltZW1jcHkoYWRkciwgaW5fYWRkciwgbmEgKiA0KTsKKworCXByX2RlYnVnKCJPRjogYnVzIGlzICVzIChuYT0lZCwgbnM9JWQpIG9uICVzXG4iLAorCSAgICBidXMtPm5hbWUsIG5hLCBucywgcGFyZW50LT5mdWxsX25hbWUpOworCW9mX2R1bXBfYWRkcigiT0Y6IHRyYW5zbGF0aW5nIGFkZHJlc3M6IiwgYWRkciwgbmEpOworCisJLyogVHJhbnNsYXRlICovCisJZm9yICg7OykgeworCQkvKiBTd2l0Y2ggdG8gcGFyZW50IGJ1cyAqLworCQlvZl9ub2RlX3B1dChkZXYpOworCQlkZXYgPSBwYXJlbnQ7CisJCXBhcmVudCA9IG9mX2dldF9wYXJlbnQoZGV2KTsKKworCQkvKiBJZiByb290LCB3ZSBoYXZlIGZpbmlzaGVkICovCisJCWlmIChwYXJlbnQgPT0gTlVMTCkgeworCQkJcHJfZGVidWcoIk9GOiByZWFjaGVkIHJvb3Qgbm9kZVxuIik7CisJCQlyZXN1bHQgPSBvZl9yZWFkX251bWJlcihhZGRyLCBuYSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEdldCBuZXcgcGFyZW50IGJ1cyBhbmQgY291bnRzICovCisJCXBidXMgPSBvZl9tYXRjaF9idXMocGFyZW50KTsKKwkJcGJ1cy0+Y291bnRfY2VsbHMoZGV2LCAmcG5hLCAmcG5zKTsKKwkJaWYgKCFPRl9DSEVDS19DT1VOVFMocG5hLCBwbnMpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInByb21fcGFyc2U6IEJhZCBjZWxsIGNvdW50IGZvciAlc1xuIiwKKwkJCSAgICAgICBkZXYtPmZ1bGxfbmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCJPRjogcGFyZW50IGJ1cyBpcyAlcyAobmE9JWQsIG5zPSVkKSBvbiAlc1xuIiwKKwkJICAgIHBidXMtPm5hbWUsIHBuYSwgcG5zLCBwYXJlbnQtPmZ1bGxfbmFtZSk7CisKKwkJLyogQXBwbHkgYnVzIHRyYW5zbGF0aW9uICovCisJCWlmIChvZl90cmFuc2xhdGVfb25lKGRldiwgYnVzLCBwYnVzLCBhZGRyLCBuYSwgbnMsIHBuYSwgcnByb3ApKQorCQkJYnJlYWs7CisKKwkJLyogQ29tcGxldGUgdGhlIG1vdmUgdXAgb25lIGxldmVsICovCisJCW5hID0gcG5hOworCQlucyA9IHBuczsKKwkJYnVzID0gcGJ1czsKKworCQlvZl9kdW1wX2FkZHIoIk9GOiBvbmUgbGV2ZWwgdHJhbnNsYXRpb246IiwgYWRkciwgbmEpOworCX0KKyBiYWlsOgorCW9mX25vZGVfcHV0KHBhcmVudCk7CisJb2Zfbm9kZV9wdXQoZGV2KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3U2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyKQoreworCXJldHVybiBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgaW5fYWRkciwgInJhbmdlcyIpOworfQorRVhQT1JUX1NZTUJPTChvZl90cmFuc2xhdGVfYWRkcmVzcyk7CisKK3U2NCBvZl90cmFuc2xhdGVfZG1hX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqaW5fYWRkcikKK3sKKwlyZXR1cm4gX19vZl90cmFuc2xhdGVfYWRkcmVzcyhkZXYsIGluX2FkZHIsICJkbWEtcmFuZ2VzIik7Cit9CitFWFBPUlRfU1lNQk9MKG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyk7CisKK2NvbnN0IHUzMiAqb2ZfZ2V0X2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwgdTY0ICpzaXplLAorCQkgICAgdW5zaWduZWQgaW50ICpmbGFncykKK3sKKwljb25zdCB1MzIgKnByb3A7CisJdW5zaWduZWQgaW50IHBzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCXN0cnVjdCBvZl9idXMgKmJ1czsKKwlpbnQgb25lc2l6ZSwgaSwgbmEsIG5zOworCisJLyogR2V0IHBhcmVudCAmIG1hdGNoIGJ1cyB0eXBlICovCisJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7CisJYnVzLT5jb3VudF9jZWxscyhkZXYsICZuYSwgJm5zKTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpCisJCXJldHVybiBOVUxMOworCisJLyogR2V0ICJyZWciIG9yICJhc3NpZ25lZC1hZGRyZXNzZXMiIHByb3BlcnR5ICovCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkZXYsIGJ1cy0+YWRkcmVzc2VzLCAmcHNpemUpOworCWlmIChwcm9wID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXBzaXplIC89IDQ7CisKKwlvbmVzaXplID0gbmEgKyBuczsKKwlmb3IgKGkgPSAwOyBwc2l6ZSA+PSBvbmVzaXplOyBwc2l6ZSAtPSBvbmVzaXplLCBwcm9wICs9IG9uZXNpemUsIGkrKykKKwkJaWYgKGkgPT0gaW5kZXgpIHsKKwkJCWlmIChzaXplKQorCQkJCSpzaXplID0gb2ZfcmVhZF9udW1iZXIocHJvcCArIG5hLCBucyk7CisJCQlpZiAoZmxhZ3MpCisJCQkJKmZsYWdzID0gYnVzLT5nZXRfZmxhZ3MocHJvcCk7CisJCQlyZXR1cm4gcHJvcDsKKwkJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfYWRkcmVzcyk7CisKK3N0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmFkZHJwLAorCQkJCSAgICB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCSAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJdTY0IHRhZGRyOworCisJaWYgKChmbGFncyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0YWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgYWRkcnApOworCWlmICh0YWRkciA9PSBPRl9CQURfQUREUikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KHIsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwkJcG9ydCA9IHBjaV9hZGRyZXNzX3RvX3Bpbyh0YWRkcik7CisJCWlmIChwb3J0ID09ICh1bnNpZ25lZCBsb25nKS0xKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXItPnN0YXJ0ID0gcG9ydDsKKwkJci0+ZW5kID0gcG9ydCArIHNpemUgLSAxOworCX0gZWxzZSB7CisJCXItPnN0YXJ0ID0gdGFkZHI7CisJCXItPmVuZCA9IHRhZGRyICsgc2l6ZSAtIDE7CisJfQorCXItPmZsYWdzID0gZmxhZ3M7CisJci0+bmFtZSA9IGRldi0+ZnVsbF9uYW1lOworCXJldHVybiAwOworfQorCisvKioKKyAqIG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UgLSBUcmFuc2xhdGUgZGV2aWNlIHRyZWUgYWRkcmVzcyBhbmQgcmV0dXJuIGFzIHJlc291cmNlCisgKgorICogTm90ZSB0aGF0IGlmIHlvdXIgYWRkcmVzcyBpcyBhIFBJTyBhZGRyZXNzLCB0aGUgY29udmVyc2lvbiB3aWxsIGZhaWwgaWYKKyAqIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGNhbid0IGJlIGludGVybmFsbHkgY29udmVydGVkIHRvIGFuIElPIHRva2VuIHdpdGgKKyAqIHBjaV9hZGRyZXNzX3RvX3BpbygpLCB0aGF0IGlzIGJlY2F1c2UgaXQncyBlaXRoZXIgY2FsbGVkIHRvIGVhcmx5IG9yIGl0CisgKiBjYW4ndCBiZSBtYXRjaGVkIHRvIGFueSBob3N0IGJyaWRnZSBJTyBzcGFjZQorICovCitpbnQgb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAorCQkJICAgc3RydWN0IHJlc291cmNlICpyKQoreworCWNvbnN0IHUzMgkqYWRkcnA7CisJdTY0CQlzaXplOworCXVuc2lnbmVkIGludAlmbGFnczsKKworCWFkZHJwID0gb2ZfZ2V0X2FkZHJlc3MoZGV2LCBpbmRleCwgJnNpemUsICZmbGFncyk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCBhZGRycCwgc2l6ZSwgZmxhZ3MsIHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfYWRkcmVzc190b19yZXNvdXJjZSk7CisKKworLyoqCisgKiBvZl9pb21hcCAtIE1hcHMgdGhlIG1lbW9yeSBtYXBwZWQgSU8gZm9yIGEgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqIEBkZXZpY2U6CXRoZSBkZXZpY2Ugd2hvc2UgaW8gcmFuZ2Ugd2lsbCBiZSBtYXBwZWQKKyAqIEBpbmRleDoJaW5kZXggb2YgdGhlIGlvIHJhbmdlCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1hcHBlZCBtZW1vcnkKKyAqLwordm9pZCBfX2lvbWVtICpvZl9pb21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHJlc291cmNlIHJlczsKKworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCBpbmRleCwgJnJlcykpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlvcmVtYXAocmVzLnN0YXJ0LCAxICsgcmVzLmVuZCAtIHJlcy5zdGFydCk7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2lvbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggYjVhZDk3NC4uYWE4MDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTU0NSw3NCArNTQ1LDI4IEBACiBFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZSk7CiAKIC8qKgotICogb2ZfbW9kYWxpYXNfdGFibGU6IFRhYmxlIG9mIGV4cGxpY2l0IGNvbXBhdGlibGUgPT0+IG1vZGFsaWFzIG1hcHBpbmdzCi0gKgotICogVGhpcyB0YWJsZSBhbGxvd3MgcGFydGljdWxhcmUgY29tcGF0aWJsZSBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgbWFwcGVkCi0gKiB0byBtb2RhbGlhcyBzdHJpbmdzLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGJ1c3NlcyB3aGljaCBkbyBub3QgZGlyZWN0bHkKLSAqIHVuZGVyc3RhbmQgdGhlIE9GIGRldmljZSB0cmVlIGJ1dCBhcmUgcG9wdWxhdGVkIGJhc2VkIG9uIGRhdGEgY29udGFpbmVkCi0gKiB3aXRoaW4gdGhlIGRldmljZSB0cmVlLiAgU1BJIGFuZCBJMkMgYXJlIHRoZSB0d28gY3VycmVudCB1c2VycyBvZiB0aGlzCi0gKiB0YWJsZS4KLSAqCi0gKiBJbiBtb3N0IGNhc2VzLCBkZXZpY2VzIGRvIG5vdCBuZWVkIHRvIGJlIGxpc3RlZCBpbiB0aGlzIHRhYmxlIGJlY2F1c2UKLSAqIHRoZSBtb2RhbGlhcyB2YWx1ZSBjYW4gYmUgZGVyaXZlZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wYXRpYmxlIHRhYmxlLgotICogSG93ZXZlciwgaWYgZm9yIGFueSByZWFzb24gYSB2YWx1ZSBjYW5ub3QgYmUgZGVyaXZlZCwgdGhlbiB0aGlzIHRhYmxlCi0gKiBwcm92aWRlcyBhIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgaW1wbGljaXQgZGVyaXZhdGlvbi4KLSAqCi0gKiBBdCB0aGUgbW9tZW50LCBhIHNpbmdsZSB0YWJsZSBpcyB1c2VkIGZvciBhbGwgYnVzIHR5cGVzIGJlY2F1c2UgaXQgaXMKLSAqIGFzc3VtZWQgdGhhdCB0aGUgZGF0YSBzaXplIGlzIHNtYWxsIGFuZCB0aGF0IHRoZSBjb21wYXRpYmxlIHZhbHVlcwotICogc2hvdWxkIGFscmVhZHkgYmUgZGlzdGluY3QgZW5vdWdoIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBTUEksIEkyQwotICogYW5kIG90aGVyIGRldmljZXMuCi0gKi8KLXN0cnVjdCBvZl9tb2RhbGlhc190YWJsZSB7Ci0JY2hhciAqb2ZfZGV2aWNlOwotCWNoYXIgKm1vZGFsaWFzOwotfTsKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbW9kYWxpYXNfdGFibGUgb2ZfbW9kYWxpYXNfdGFibGVbXSA9IHsKLQl7ICJmc2wsbWN1LW1wYzgzNDllbWl0eCIsICJtY3UtbXBjODM0OWVtaXR4IiB9LAotCXsgIm1tYy1zcGktc2xvdCIsICJtbWNfc3BpIiB9LAotfTsKLQotLyoqCiAgKiBvZl9tb2RhbGlhc19ub2RlIC0gTG9va3VwIGFwcHJvcHJpYXRlIG1vZGFsaWFzIGZvciBhIGRldmljZSBub2RlCiAgKiBAbm9kZToJcG9pbnRlciB0byBhIGRldmljZSB0cmVlIG5vZGUKICAqIEBtb2RhbGlhczoJUG9pbnRlciB0byBidWZmZXIgdGhhdCBtb2RhbGlhcyB2YWx1ZSB3aWxsIGJlIGNvcGllZCBpbnRvCiAgKiBAbGVuOglMZW5ndGggb2YgbW9kYWxpYXMgdmFsdWUKICAqCi0gKiBCYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhdGlibGUgcHJvcGVydHksIHRoaXMgcm91dGluZSB3aWxsIGRldGVybWluZQotICogYW4gYXBwcm9wcmlhdGUgbW9kYWxpYXMgdmFsdWUgZm9yIGEgcGFydGljdWxhciBkZXZpY2UgdHJlZSBub2RlLiAgVHdvCi0gKiBzZXBhcmF0ZSBtZXRob2RzIGFyZSBhdHRlbXB0ZWQgdG8gZGVyaXZlIGEgbW9kYWxpYXMgdmFsdWUuCisgKiBCYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhdGlibGUgcHJvcGVydHksIHRoaXMgcm91dGluZSB3aWxsIGF0dGVtcHQKKyAqIHRvIGNob29zZSBhbiBhcHByb3ByaWF0ZSBtb2RhbGlhcyB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGRldmljZSB0cmVlIG5vZGUuCisgKiBJdCBkb2VzIHRoaXMgYnkgc3RyaXBwaW5nIHRoZSBtYW51ZmFjdHVyZXIgcHJlZml4IChhcyBkZWxpbWl0ZWQgYnkgYSAnLCcpCisgKiBmcm9tIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgY29tcGF0aWJsZSBsaXN0IHByb3BlcnR5LgogICoKLSAqIEZpcnN0IG1ldGhvZCBpcyB0byBsb29rdXAgdGhlIGNvbXBhdGlibGUgdmFsdWUgaW4gb2ZfbW9kYWxpYXNfdGFibGUuCi0gKiBTZWNvbmQgaXMgdG8gc3RyaXAgb2ZmIHRoZSBtYW51ZmFjdHVyZXIgcHJlZml4IGZyb20gdGhlIGZpcnN0Ci0gKiBjb21wYXRpYmxlIGVudHJ5IGFuZCB1c2UgdGhlIHJlbWFpbmRlciBhcyBtb2RhbGlhcwotICoKLSAqIFRoaXMgcm91dGluZSByZXR1cm5zIDAgb24gc3VjY2VzcworICogVGhpcyByb3V0aW5lIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgogICovCiBpbnQgb2ZfbW9kYWxpYXNfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGNoYXIgKm1vZGFsaWFzLCBpbnQgbGVuKQogewotCWludCBpLCBjcGxlbjsKLQljb25zdCBjaGFyICpjb21wYXRpYmxlOwotCWNvbnN0IGNoYXIgKnA7Ci0KLQkvKiAxLiBzZWFyY2ggZm9yIGV4Y2VwdGlvbiBsaXN0IGVudHJ5ICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2ZfbW9kYWxpYXNfdGFibGUpOyBpKyspIHsKLQkJY29tcGF0aWJsZSA9IG9mX21vZGFsaWFzX3RhYmxlW2ldLm9mX2RldmljZTsKLQkJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCBjb21wYXRpYmxlKSkKLQkJCWNvbnRpbnVlOwotCQlzdHJsY3B5KG1vZGFsaWFzLCBvZl9tb2RhbGlhc190YWJsZVtpXS5tb2RhbGlhcywgbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWNvbnN0IGNoYXIgKmNvbXBhdGlibGUsICpwOworCWludCBjcGxlbjsKIAogCWNvbXBhdGlibGUgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOwotCWlmICghY29tcGF0aWJsZSkKKwlpZiAoIWNvbXBhdGlibGUgfHwgc3RybGVuKGNvbXBhdGlibGUpID4gY3BsZW4pCiAJCXJldHVybiAtRU5PREVWOwotCi0JLyogMi4gdGFrZSBmaXJzdCBjb21wYXRpYmxlIGVudHJ5IGFuZCBzdHJpcCBtYW51ZmFjdHVyZXIgKi8KIAlwID0gc3RyY2hyKGNvbXBhdGlibGUsICcsJyk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwKys7Ci0Jc3RybGNweShtb2RhbGlhcywgcCwgbGVuKTsKKwlzdHJsY3B5KG1vZGFsaWFzLCBwID8gcCArIDEgOiBjb21wYXRpYmxlLCBsZW4pOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob2ZfbW9kYWxpYXNfbm9kZSk7CkBAIC02NTEsMTQgKzYwNSwxNCBAQAogc3RydWN0IGRldmljZV9ub2RlICoKIG9mX3BhcnNlX3BoYW5kbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqcGhhbmRsZV9uYW1lLCBpbnQgaW5kZXgpCiB7Ci0JY29uc3QgcGhhbmRsZSAqcGhhbmRsZTsKKwljb25zdCBfX2JlMzIgKnBoYW5kbGU7CiAJaW50IHNpemU7CiAKIAlwaGFuZGxlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBwaGFuZGxlX25hbWUsICZzaXplKTsKIAlpZiAoKCFwaGFuZGxlKSB8fCAoc2l6ZSA8IHNpemVvZigqcGhhbmRsZSkgKiAoaW5kZXggKyAxKSkpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGVbaW5kZXhdKTsKKwlyZXR1cm4gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoYmUzMl90b19jcHVwKHBoYW5kbGUgKyBpbmRleCkpOwogfQogRVhQT1JUX1NZTUJPTChvZl9wYXJzZV9waGFuZGxlKTsKIApAQCAtNzE0LDE2ICs2NjgsMTYgQEAKIAogCXdoaWxlIChsaXN0IDwgbGlzdF9lbmQpIHsKIAkJY29uc3QgX19iZTMyICpjZWxsczsKLQkJY29uc3QgcGhhbmRsZSAqcGhhbmRsZTsKKwkJcGhhbmRsZSBwaGFuZGxlOwogCi0JCXBoYW5kbGUgPSBsaXN0Kys7CisJCXBoYW5kbGUgPSBiZTMyX3RvX2NwdXAobGlzdCsrKTsKIAkJYXJncyA9IGxpc3Q7CiAKIAkJLyogb25lIGNlbGwgaG9sZSBpbiB0aGUgbGlzdCA9IDw+OyAqLwotCQlpZiAoISpwaGFuZGxlKQorCQlpZiAoIXBoYW5kbGUpCiAJCQlnb3RvIG5leHQ7CiAKLQkJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaGFuZGxlKTsKKwkJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGUpOwogCQlpZiAoIW5vZGUpIHsKIAkJCXByX2RlYnVnKCIlczogY291bGQgbm90IGZpbmQgcGhhbmRsZVxuIiwKIAkJCQkgbnAtPmZ1bGxfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2RldmljZS5jIGIvZHJpdmVycy9vZi9kZXZpY2UuYwppbmRleCA3ZDE4ZjhlLi4wZDhhMDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2RldmljZS5jCisrKyBiL2RyaXZlcnMvb2YvZGV2aWNlLmMKQEAgLTIwLDEzICsyMCwxMyBAQAogY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+b2Zfbm9kZSkKKwlpZiAoKCFtYXRjaGVzKSB8fCAoIWRldi0+b2Zfbm9kZSkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGRldi0+b2Zfbm9kZSk7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX21hdGNoX2RldmljZSk7CiAKLXN0cnVjdCBvZl9kZXZpY2UgKm9mX2Rldl9nZXQoc3RydWN0IG9mX2RldmljZSAqZGV2KQorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZfZGV2X2dldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqdG1wOwogCkBAIC0zNCwxMyArMzQsMTMgQEAKIAkJcmV0dXJuIE5VTEw7CiAJdG1wID0gZ2V0X2RldmljZSgmZGV2LT5kZXYpOwogCWlmICh0bXApCi0JCXJldHVybiB0b19vZl9kZXZpY2UodG1wKTsKKwkJcmV0dXJuIHRvX3BsYXRmb3JtX2RldmljZSh0bXApOwogCWVsc2UKIAkJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX2Rldl9nZXQpOwogCi12b2lkIG9mX2Rldl9wdXQoc3RydWN0IG9mX2RldmljZSAqZGV2KQordm9pZCBvZl9kZXZfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2KQogCQlwdXRfZGV2aWNlKCZkZXYtPmRldik7CkBAIC01MCwyOCArNTAsMjUgQEAKIHN0YXRpYyBzc2l6ZV90IGRldnNwZWNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldjsKIAotCW9mZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJb2ZkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgb2ZkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXY7CiAKLQlvZmRldiA9IHRvX29mX2RldmljZShkZXYpOworCW9mZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG9mZGV2LT5kZXYub2Zfbm9kZS0+bmFtZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZkZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQlzc2l6ZV90IGxlbiA9IDA7Ci0KLQlsZW4gPSBvZl9kZXZpY2VfZ2V0X21vZGFsaWFzKG9mZGV2LCBidWYsIFBBR0VfU0laRSAtIDIpOworCXNzaXplX3QgbGVuID0gb2ZfZGV2aWNlX2dldF9tb2RhbGlhcyhkZXYsIGJ1ZiwgUEFHRV9TSVpFIC0gMik7CiAJYnVmW2xlbl0gPSAnXG4nOwogCWJ1ZltsZW4rMV0gPSAwOwogCXJldHVybiBsZW4rMTsKQEAgLTkzLDIwICs5MCwyNSBAQAogICovCiB2b2lkIG9mX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldjsKIAotCW9mZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJb2ZkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlvZl9ub2RlX3B1dChvZmRldi0+ZGV2Lm9mX25vZGUpOwogCWtmcmVlKG9mZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfcmVsZWFzZV9kZXYpOwogCi1pbnQgb2ZfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQoraW50IG9mX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKIHsKIAlCVUdfT04ob2ZkZXYtPmRldi5vZl9ub2RlID09IE5VTEwpOwogCiAJZGV2aWNlX2luaXRpYWxpemUoJm9mZGV2LT5kZXYpOwogCisJLyogbmFtZSBhbmQgaWQgaGF2ZSB0byBiZSBzZXQgc28gdGhhdCB0aGUgcGxhdGZvcm0gYnVzIGRvZXNuJ3QgZ2V0CisJICogY29uZnVzZWQgb24gbWF0Y2hpbmcgKi8KKwlvZmRldi0+bmFtZSA9IGRldl9uYW1lKCZvZmRldi0+ZGV2KTsKKwlvZmRldi0+aWQgPSAtMTsKKwogCS8qIGRldmljZV9hZGQgd2lsbCBhc3N1bWUgdGhhdCB0aGlzIGRldmljZSBpcyBvbiB0aGUgc2FtZSBub2RlIGFzCiAJICogdGhlIHBhcmVudC4gSWYgdGhlcmUgaXMgbm8gcGFyZW50IGRlZmluZWQsIHNldCB0aGUgbm9kZQogCSAqIGV4cGxpY2l0bHkgKi8KQEAgLTExNywyNSArMTE5LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2RldmljZV9yZWdpc3Rlcik7CiAKLXZvaWQgb2ZfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCit2b2lkIG9mX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQogewogCWRldmljZV91bnJlZ2lzdGVyKCZvZmRldi0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX3VucmVnaXN0ZXIpOwogCi1zc2l6ZV90IG9mX2RldmljZV9nZXRfbW9kYWxpYXMoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCi0JCQkJY2hhciAqc3RyLCBzc2l6ZV90IGxlbikKK3NzaXplX3Qgb2ZfZGV2aWNlX2dldF9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKnN0ciwgc3NpemVfdCBsZW4pCiB7CiAJY29uc3QgY2hhciAqY29tcGF0OwogCWludCBjcGxlbiwgaTsKIAlzc2l6ZV90IHRzaXplLCBjc2l6ZSwgcmVwZW5kOwogCiAJLyogTmFtZSAmIFR5cGUgKi8KLQljc2l6ZSA9IHNucHJpbnRmKHN0ciwgbGVuLCAib2Y6TiVzVCVzIiwgb2ZkZXYtPmRldi5vZl9ub2RlLT5uYW1lLAotCQkJIG9mZGV2LT5kZXYub2Zfbm9kZS0+dHlwZSk7CisJY3NpemUgPSBzbnByaW50ZihzdHIsIGxlbiwgIm9mOk4lc1QlcyIsIGRldi0+b2Zfbm9kZS0+bmFtZSwKKwkJCSBkZXYtPm9mX25vZGUtPnR5cGUpOwogCiAJLyogR2V0IGNvbXBhdGlibGUgcHJvcGVydHkgaWYgYW55ICovCi0JY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5kZXYub2Zfbm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKIAlpZiAoIWNvbXBhdCkKIAkJcmV0dXJuIGNzaXplOwogCkBAIC0xNzAsMyArMTcxLDUxIEBACiAKIAlyZXR1cm4gdHNpemU7CiB9CisKKy8qKgorICogb2ZfZGV2aWNlX3VldmVudCAtIERpc3BsYXkgT0YgcmVsYXRlZCB1ZXZlbnQgaW5mb3JtYXRpb24KKyAqLworaW50IG9mX2RldmljZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJY29uc3QgY2hhciAqY29tcGF0OworCWludCBzZWVuID0gMCwgY3BsZW4sIHNsOworCisJaWYgKCghZGV2KSB8fCAoIWRldi0+b2Zfbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk9GX05BTUU9JXMiLCBkZXYtPm9mX25vZGUtPm5hbWUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJPRl9UWVBFPSVzIiwgZGV2LT5vZl9ub2RlLT50eXBlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTaW5jZSB0aGUgY29tcGF0aWJsZSBmaWVsZCBjYW4gY29udGFpbiBwcmV0dHkgbXVjaCBhbnl0aGluZworCSAqIGl0J3Mgbm90IHJlYWxseSBsZWdhbCB0byBzcGxpdCBpdCBvdXQgd2l0aCBjb21tYXMuIFdlIHNwbGl0IGl0CisJICogdXAgdXNpbmcgYSBudW1iZXIgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluc3RlYWQuICovCisKKwljb21wYXQgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJd2hpbGUgKGNvbXBhdCAmJiAqY29tcGF0ICYmIGNwbGVuID4gMCkgeworCQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiT0ZfQ09NUEFUSUJMRV8lZD0lcyIsIHNlZW4sIGNvbXBhdCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlzbCA9IHN0cmxlbihjb21wYXQpICsgMTsKKwkJY29tcGF0ICs9IHNsOworCQljcGxlbiAtPSBzbDsKKwkJc2VlbisrOworCX0KKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJPRl9DT01QQVRJQkxFX049JWQiLCBzZWVuKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtb2RhbGlhcyBpcyB0cmlja2llciwgd2UgYWRkIGl0IGluIDIgc3RlcHMgKi8KKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9IikpCisJCXJldHVybiAtRU5PTUVNOworCisJc2wgPSBvZl9kZXZpY2VfZ2V0X21vZGFsaWFzKGRldiwgJmVudi0+YnVmW2Vudi0+YnVmbGVuLTFdLAorCQkJCSAgICBzaXplb2YoZW52LT5idWYpIC0gZW52LT5idWZsZW4pOworCWlmIChzbCA+PSAoc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZW52LT5idWZsZW4gKz0gc2w7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvZmR0LmMgYi9kcml2ZXJzL29mL2ZkdC5jCmluZGV4IGI2OTg3YmIuLjY1ZGE1YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZmR0LmMKKysrIGIvZHJpdmVycy9vZi9mZHQuYwpAQCAtNjksOSArNjksOSBAQAogCQkJdTMyIHN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKilwKTsKIAkJCXAgKz0gODsKIAkJCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCi0JCQkJcCA9IF9BTElHTihwLCBzeiA+PSA4ID8gOCA6IDQpOworCQkJCXAgPSBBTElHTihwLCBzeiA+PSA4ID8gOCA6IDQpOwogCQkJcCArPSBzejsKLQkJCXAgPSBfQUxJR04ocCwgNCk7CisJCQlwID0gQUxJR04ocCwgNCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAodGFnICE9IE9GX0RUX0JFR0lOX05PREUpIHsKQEAgLTgwLDcgKzgwLDcgQEAKIAkJfQogCQlkZXB0aCsrOwogCQlwYXRocCA9IChjaGFyICopcDsKLQkJcCA9IF9BTElHTihwICsgc3RybGVuKHBhdGhwKSArIDEsIDQpOworCQlwID0gQUxJR04ocCArIHN0cmxlbihwYXRocCkgKyAxLCA0KTsKIAkJaWYgKCgqcGF0aHApID09ICcvJykgewogCQkJY2hhciAqbHAsICpucDsKIAkJCWZvciAobHAgPSBOVUxMLCBucCA9IHBhdGhwOyAqbnA7IG5wKyspCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJcCArPSA0OwogCUJVR19PTihiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApICE9IE9GX0RUX0JFR0lOX05PREUpOwogCXAgKz0gNDsKLQlyZXR1cm4gX0FMSUdOKHAgKyBzdHJsZW4oKGNoYXIgKilwKSArIDEsIDQpOworCXJldHVybiBBTElHTihwICsgc3RybGVuKChjaGFyICopcCkgKyAxLCA0KTsKIH0KIAogLyoqCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJbm9mZiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKHAgKyA0KSk7CiAJCXAgKz0gODsKIAkJaWYgKGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPnZlcnNpb24pIDwgMHgxMCkKLQkJCXAgPSBfQUxJR04ocCwgc3ogPj0gOCA/IDggOiA0KTsKKwkJCXAgPSBBTElHTihwLCBzeiA+PSA4ID8gOCA6IDQpOwogCiAJCW5zdHIgPSBmaW5kX2ZsYXRfZHRfc3RyaW5nKG5vZmYpOwogCQlpZiAobnN0ciA9PSBOVUxMKSB7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJCXJldHVybiAodm9pZCAqKXA7CiAJCX0KIAkJcCArPSBzejsKLQkJcCA9IF9BTElHTihwLCA0KTsKKwkJcCA9IEFMSUdOKHAsIDQpOwogCX0gd2hpbGUgKDEpOwogfQogCkBAIC0xNjksNyArMTY5LDcgQEAKIAlpZiAoY3AgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJd2hpbGUgKGNwbGVuID4gMCkgewotCQlpZiAoc3RybmNhc2VjbXAoY3AsIGNvbXBhdCwgc3RybGVuKGNvbXBhdCkpID09IDApCisJCWlmIChvZl9jb21wYXRfY21wKGNwLCBjb21wYXQsIHN0cmxlbihjb21wYXQpKSA9PSAwKQogCQkJcmV0dXJuIDE7CiAJCWwgPSBzdHJsZW4oY3ApICsgMTsKIAkJY3AgKz0gbDsKQEAgLTE4NCw3ICsxODQsNyBAQAogewogCXZvaWQgKnJlczsKIAotCSptZW0gPSBfQUxJR04oKm1lbSwgYWxpZ24pOworCSptZW0gPSBBTElHTigqbWVtLCBhbGlnbik7CiAJcmVzID0gKHZvaWQgKikqbWVtOwogCSptZW0gKz0gc2l6ZTsKIApAQCAtMjIwLDcgKzIyMCw3IEBACiAJKnAgKz0gNDsKIAlwYXRocCA9IChjaGFyICopKnA7CiAJbCA9IGFsbG9jbCA9IHN0cmxlbihwYXRocCkgKyAxOwotCSpwID0gX0FMSUdOKCpwICsgbCwgNCk7CisJKnAgPSBBTElHTigqcCArIGwsIDQpOwogCiAJLyogdmVyc2lvbiAweDEwIGhhcyBhIG1vcmUgY29tcGFjdCB1bml0IG5hbWUgaGVyZSBpbnN0ZWFkIG9mIHRoZSBmdWxsCiAJICogcGF0aC4gd2UgYWNjdW11bGF0ZSB0aGUgZnVsbCBwYXRoIHNpemUgdXNpbmcgImZwc2l6ZSIsIHdlJ2xsIHJlYnVpbGQKQEAgLTI5OSw3ICsyOTksNyBAQAogCQlub2ZmID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikoKCpwKSArIDQpKTsKIAkJKnAgKz0gODsKIAkJaWYgKGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPnZlcnNpb24pIDwgMHgxMCkKLQkJCSpwID0gX0FMSUdOKCpwLCBzeiA+PSA4ID8gOCA6IDQpOworCQkJKnAgPSBBTElHTigqcCwgc3ogPj0gOCA/IDggOiA0KTsKIAogCQlwbmFtZSA9IGZpbmRfZmxhdF9kdF9zdHJpbmcobm9mZik7CiAJCWlmIChwbmFtZSA9PSBOVUxMKSB7CkBAIC0zMjAsMjAgKzMyMCwyMCBAQAogCQkJaWYgKChzdHJjbXAocG5hbWUsICJwaGFuZGxlIikgPT0gMCkgfHwKIAkJCSAgICAoc3RyY21wKHBuYW1lLCAibGludXgscGhhbmRsZSIpID09IDApKSB7CiAJCQkJaWYgKG5wLT5waGFuZGxlID09IDApCi0JCQkJCW5wLT5waGFuZGxlID0gKigodTMyICopKnApOworCQkJCQlucC0+cGhhbmRsZSA9IGJlMzJfdG9fY3B1cCgoX19iZTMyKikqcCk7CiAJCQl9CiAJCQkvKiBBbmQgd2UgcHJvY2VzcyB0aGUgImlibSxwaGFuZGxlIiBwcm9wZXJ0eQogCQkJICogdXNlZCBpbiBwU2VyaWVzIGR5bmFtaWMgZGV2aWNlIHRyZWUKIAkJCSAqIHN0dWZmICovCiAJCQlpZiAoc3RyY21wKHBuYW1lLCAiaWJtLHBoYW5kbGUiKSA9PSAwKQotCQkJCW5wLT5waGFuZGxlID0gKigodTMyICopKnApOworCQkJCW5wLT5waGFuZGxlID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikqcCk7CiAJCQlwcC0+bmFtZSA9IHBuYW1lOwogCQkJcHAtPmxlbmd0aCA9IHN6OwogCQkJcHAtPnZhbHVlID0gKHZvaWQgKikqcDsKIAkJCSpwcmV2X3BwID0gcHA7CiAJCQlwcmV2X3BwID0gJnBwLT5uZXh0OwogCQl9Ci0JCSpwID0gX0FMSUdOKCgqcCkgKyBzeiwgNCk7CisJCSpwID0gQUxJR04oKCpwKSArIHN6LCA0KTsKIAl9CiAJLyogd2l0aCB2ZXJzaW9uIDB4MTAgd2UgbWF5IG5vdCBoYXZlIHRoZSBuYW1lIHByb3BlcnR5LCByZWNyZWF0ZQogCSAqIGl0IGhlcmUgZnJvbSB0aGUgdW5pdCBuYW1lIGlmIGFic2VudApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9ncGlvLmMgYi9kcml2ZXJzL29mL2dwaW8uYwppbmRleCBhMWIzMWE0Li45MDU5NjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2dwaW8uYworKysgYi9kcml2ZXJzL29mL2dwaW8uYwpAQCAtMTEsMTMgKzExLDE0IEBACiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyoqCiAgKiBvZl9nZXRfZ3Bpb19mbGFncyAtIEdldCBhIEdQSU8gbnVtYmVyIGFuZCBmbGFncyB0byB1c2Ugd2l0aCBHUElPIEFQSQpAQCAtMzMsMzIgKzM0LDMyIEBACiAJCSAgICAgIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdjOwotCXN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mX2djID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdwaW9fbnA7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAJaW50IHNpemU7CiAJY29uc3Qgdm9pZCAqZ3Bpb19zcGVjOwogCWNvbnN0IF9fYmUzMiAqZ3Bpb19jZWxsczsKIAogCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVzX3dpdGhfYXJncyhucCwgImdwaW9zIiwgIiNncGlvLWNlbGxzIiwgaW5kZXgsCi0JCQkJCSAgJmdjLCAmZ3Bpb19zcGVjKTsKKwkJCQkJICAmZ3Bpb19ucCwgJmdwaW9fc3BlYyk7CiAJaWYgKHJldCkgewogCQlwcl9kZWJ1ZygiJXM6IGNhbid0IHBhcnNlIGdwaW9zIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyMDsKIAl9CiAKLQlvZl9nYyA9IGdjLT5kYXRhOwotCWlmICghb2ZfZ2MpIHsKKwlnYyA9IG9mX25vZGVfdG9fZ3Bpb2NoaXAoZ3Bpb19ucCk7CisJaWYgKCFnYykgewogCQlwcl9kZWJ1ZygiJXM6IGdwaW8gY29udHJvbGxlciAlcyBpc24ndCByZWdpc3RlcmVkXG4iLAotCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQkJIG5wLT5mdWxsX25hbWUsIGdwaW9fbnAtPmZ1bGxfbmFtZSk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyMTsKIAl9CiAKLQlncGlvX2NlbGxzID0gb2ZfZ2V0X3Byb3BlcnR5KGdjLCAiI2dwaW8tY2VsbHMiLCAmc2l6ZSk7CisJZ3Bpb19jZWxscyA9IG9mX2dldF9wcm9wZXJ0eShncGlvX25wLCAiI2dwaW8tY2VsbHMiLCAmc2l6ZSk7CiAJaWYgKCFncGlvX2NlbGxzIHx8IHNpemUgIT0gc2l6ZW9mKCpncGlvX2NlbGxzKSB8fAotCQkJYmUzMl90b19jcHVwKGdwaW9fY2VsbHMpICE9IG9mX2djLT5ncGlvX2NlbGxzKSB7CisJCQliZTMyX3RvX2NwdXAoZ3Bpb19jZWxscykgIT0gZ2MtPm9mX2dwaW9fbl9jZWxscykgewogCQlwcl9kZWJ1ZygiJXM6IHdyb25nICNncGlvLWNlbGxzIGZvciAlc1xuIiwKLQkJCSBucC0+ZnVsbF9uYW1lLCBnYy0+ZnVsbF9uYW1lKTsKKwkJCSBucC0+ZnVsbF9uYW1lLCBncGlvX25wLT5mdWxsX25hbWUpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjE7CiAJfQpAQCAtNjcsMTMgKzY4LDEzIEBACiAJaWYgKGZsYWdzKQogCQkqZmxhZ3MgPSAwOwogCi0JcmV0ID0gb2ZfZ2MtPnhsYXRlKG9mX2djLCBucCwgZ3Bpb19zcGVjLCBmbGFncyk7CisJcmV0ID0gZ2MtPm9mX3hsYXRlKGdjLCBucCwgZ3Bpb19zcGVjLCBmbGFncyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyMTsKIAotCXJldCArPSBvZl9nYy0+Z2MuYmFzZTsKKwlyZXQgKz0gZ2MtPmJhc2U7CiBlcnIxOgotCW9mX25vZGVfcHV0KGdjKTsKKwlvZl9ub2RlX3B1dChncGlvX25wKTsKIGVycjA6CiAJcHJfZGVidWcoIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTExNiw3ICsxMTcsNyBAQAogCiAvKioKICAqIG9mX2dwaW9fc2ltcGxlX3hsYXRlIC0gdHJhbnNsYXRlIGdwaW9fc3BlYyB0byB0aGUgR1BJTyBudW1iZXIgYW5kIGZsYWdzCi0gKiBAb2ZfZ2M6CXBvaW50ZXIgdG8gdGhlIG9mX2dwaW9fY2hpcCBzdHJ1Y3R1cmUKKyAqIEBnYzoJCXBvaW50ZXIgdG8gdGhlIGdwaW9fY2hpcCBzdHJ1Y3R1cmUKICAqIEBucDoJCWRldmljZSBub2RlIG9mIHRoZSBHUElPIGNoaXAKICAqIEBncGlvX3NwZWM6CWdwaW8gc3BlY2lmaWVyIGFzIGZvdW5kIGluIHRoZSBkZXZpY2UgdHJlZQogICogQGZsYWdzOglhIGZsYWdzIHBvaW50ZXIgdG8gZmlsbCBpbgpAQCAtMTI1LDggKzEyNiw4IEBACiAgKiBncGlvIGNoaXBzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG9ubHkgb25lIHNhbml0eSBjaGVjazogd2hldGhlciBncGlvCiAgKiBpcyBsZXNzIHRoYW4gbmdwaW9zICh0aGF0IGlzIHNwZWNpZmllZCBpbiB0aGUgZ3Bpb19jaGlwKS4KICAqLwotaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mX2djLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJIGNvbnN0IHZvaWQgKmdwaW9fc3BlYywgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncykKK3N0YXRpYyBpbnQgb2ZfZ3Bpb19zaW1wbGVfeGxhdGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3Qgdm9pZCAqZ3Bpb19zcGVjLCB1MzIgKmZsYWdzKQogewogCWNvbnN0IF9fYmUzMiAqZ3BpbyA9IGdwaW9fc3BlYzsKIAljb25zdCB1MzIgbiA9IGJlMzJfdG9fY3B1cChncGlvKTsKQEAgLTEzNywxMiArMTM4LDEyIEBACiAJICogbnVtYmVyIGFuZCB0aGUgZmxhZ3MgZnJvbSBhIHNpbmdsZSBncGlvIGNlbGwgLS0gdGhpcyBpcyBwb3NzaWJsZSwKIAkgKiBidXQgbm90IHJlY29tbWVuZGVkKS4KIAkgKi8KLQlpZiAob2ZfZ2MtPmdwaW9fY2VsbHMgPCAyKSB7CisJaWYgKGdjLT5vZl9ncGlvX25fY2VsbHMgPCAyKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChuID4gb2ZfZ2MtPmdjLm5ncGlvKQorCWlmIChuID4gZ2MtPm5ncGlvKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChmbGFncykKQEAgLTE1MCw3ICsxNTEsNiBAQAogCiAJcmV0dXJuIG47CiB9Ci1FWFBPUlRfU1lNQk9MKG9mX2dwaW9fc2ltcGxlX3hsYXRlKTsKIAogLyoqCiAgKiBvZl9tbV9ncGlvY2hpcF9hZGQgLSBBZGQgbWVtb3J5IG1hcHBlZCBHUElPIGNoaXAgKGJhbmspCkBAIC0xNjEsMTAgKzE2MSw4IEBACiAgKgogICogMSkgSW4gdGhlIGdwaW9fY2hpcCBzdHJ1Y3R1cmU6CiAgKiAgICAtIGFsbCB0aGUgY2FsbGJhY2tzCi0gKgotICogMikgSW4gdGhlIG9mX2dwaW9fY2hpcCBzdHJ1Y3R1cmU6Ci0gKiAgICAtIGdwaW9fY2VsbHMKLSAqICAgIC0geGxhdGUgY2FsbGJhY2sgKG9wdGlvbmFsKQorICogICAgLSBvZl9ncGlvX25fY2VsbHMKKyAqICAgIC0gb2ZfeGxhdGUgY2FsbGJhY2sgKG9wdGlvbmFsKQogICoKICAqIDMpIEluIHRoZSBvZl9tbV9ncGlvX2NoaXAgc3RydWN0dXJlOgogICogICAgLSBzYXZlX3JlZ3MgY2FsbGJhY2sgKG9wdGlvbmFsKQpAQCAtMTc3LDggKzE3NSw3IEBACiAJCSAgICAgICBzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKIHsKIAlpbnQgcmV0ID0gLUVOT01FTTsKLQlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7Ci0Jc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSAmb2ZfZ2MtPmdjOworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJm1tX2djLT5nYzsKIAogCWdjLT5sYWJlbCA9IGtzdHJkdXAobnAtPmZ1bGxfbmFtZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnYy0+bGFiZWwpCkBAIC0xOTAsMjYgKzE4NywxOSBAQAogCiAJZ2MtPmJhc2UgPSAtMTsKIAotCWlmICghb2ZfZ2MtPnhsYXRlKQotCQlvZl9nYy0+eGxhdGUgPSBvZl9ncGlvX3NpbXBsZV94bGF0ZTsKLQogCWlmIChtbV9nYy0+c2F2ZV9yZWdzKQogCQltbV9nYy0+c2F2ZV9yZWdzKG1tX2djKTsKIAotCW5wLT5kYXRhID0gb2ZfZ2M7CisJbW1fZ2MtPmdjLm9mX25vZGUgPSBucDsKIAogCXJldCA9IGdwaW9jaGlwX2FkZChnYyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnIyOwogCi0JLyogV2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBub2RlIGFuZCBpdHMgLT5kYXRhICovCi0Jb2Zfbm9kZV9nZXQobnApOwotCiAJcHJfZGVidWcoIiVzOiByZWdpc3RlcmVkIGFzIGdlbmVyaWMgR1BJTyBjaGlwLCBiYXNlIGlzICVkXG4iLAogCQkgbnAtPmZ1bGxfbmFtZSwgZ2MtPmJhc2UpOwogCXJldHVybiAwOwogZXJyMjoKLQlucC0+ZGF0YSA9IE5VTEw7CiAJaW91bm1hcChtbV9nYy0+cmVncyk7CiBlcnIxOgogCWtmcmVlKGdjLT5sYWJlbCk7CkBAIC0yMTksMyArMjA5LDM2IEBACiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfbW1fZ3Bpb2NoaXBfYWRkKTsKKwordm9pZCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKK3sKKwlpZiAoKCFjaGlwLT5vZl9ub2RlKSAmJiAoY2hpcC0+ZGV2KSkKKwkJY2hpcC0+b2Zfbm9kZSA9IGNoaXAtPmRldi0+b2Zfbm9kZTsKKworCWlmICghY2hpcC0+b2Zfbm9kZSkKKwkJcmV0dXJuOworCisJaWYgKCFjaGlwLT5vZl94bGF0ZSkgeworCQljaGlwLT5vZl9ncGlvX25fY2VsbHMgPSAyOworCQljaGlwLT5vZl94bGF0ZSA9IG9mX2dwaW9fc2ltcGxlX3hsYXRlOworCX0KKworCW9mX25vZGVfZ2V0KGNoaXAtPm9mX25vZGUpOworfQorCit2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQoreworCWlmIChjaGlwLT5vZl9ub2RlKQorCQlvZl9ub2RlX3B1dChjaGlwLT5vZl9ub2RlKTsKK30KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBmb3IgcmVzb2x2aW5nIG5vZGUgcG9pbnRlciB0byBncGlvX2NoaXAgKi8KK3N0YXRpYyBpbnQgb2ZfZ3Bpb2NoaXBfaXNfbWF0Y2goc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gY2hpcC0+b2Zfbm9kZSA9PSBkYXRhOworfQorCitzdHJ1Y3QgZ3Bpb19jaGlwICpvZl9ub2RlX3RvX2dwaW9jaGlwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJcmV0dXJuIGdwaW9jaGlwX2ZpbmQobnAsIG9mX2dwaW9jaGlwX2lzX21hdGNoKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvaXJxLmMgYi9kcml2ZXJzL29mL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTk1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL29mL2lycS5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogIERlcml2ZWQgZnJvbSBhcmNoL2kzODYva2VybmVsL2lycS5jCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqICBBZGFwdGVkIGZyb20gYXJjaC9pMzg2IGJ5IEdhcnkgVGhvbWFzCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKKyAqICBVcGRhdGVkIGFuZCBtb2RpZmllZCBieSBDb3J0IERvdWdhbiA8Y29ydEBmc21sYWJzLmNvbT4KKyAqICAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxIENvcnQgRG91Z2FuCisgKiAgQWRhcHRlZCBmb3IgUG93ZXIgTWFjaW50b3NoIGJ5IFBhdWwgTWFja2VycmFzCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHVzZWQgdG8gbWFrZSBJUlEgZGVzY3JpcHRpb25zIGluIHRoZQorICogZGV2aWNlIHRyZWUgdG8gYWN0dWFsIGlycSBudW1iZXJzIG9uIGFuIGludGVycnVwdCBjb250cm9sbGVyCisgKiBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoqCisgKiBpcnFfb2ZfcGFyc2VfYW5kX21hcCAtIFBhcnNlIGFuZCBtYXAgYW4gaW50ZXJydXB0IGludG8gbGludXggdmlycSBzcGFjZQorICogQGRldmljZTogRGV2aWNlIG5vZGUgb2YgdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgbWFwcGVkCisgKiBAaW5kZXg6IEluZGV4IG9mIHRoZSBpbnRlcnJ1cHQgdG8gbWFwCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgdGhhdCBjaGFpbnMgb2ZfaXJxX21hcF9vbmUoKSBhbmQKKyAqIGlycV9jcmVhdGVfb2ZfbWFwcGluZygpIHRvIG1ha2UgdGhpbmdzIGVhc2llciB0byBjYWxsZXJzCisgKi8KK3Vuc2lnbmVkIGludCBpcnFfb2ZfcGFyc2VfYW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBvZl9pcnEgb2lycTsKKworCWlmIChvZl9pcnFfbWFwX29uZShkZXYsIGluZGV4LCAmb2lycSkpCisJCXJldHVybiBOT19JUlE7CisKKwlyZXR1cm4gaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKG9pcnEuY29udHJvbGxlciwgb2lycS5zcGVjaWZpZXIsCisJCQkJICAgICBvaXJxLnNpemUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX29mX3BhcnNlX2FuZF9tYXApOworCisvKioKKyAqIG9mX2lycV9maW5kX3BhcmVudCAtIEdpdmVuIGEgZGV2aWNlIG5vZGUsIGZpbmQgaXRzIGludGVycnVwdCBwYXJlbnQgbm9kZQorICogQGNoaWxkOiBwb2ludGVyIHRvIGRldmljZSBub2RlCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVycnVwdCBwYXJlbnQgbm9kZSwgb3IgTlVMTCBpZiB0aGUgaW50ZXJydXB0CisgKiBwYXJlbnQgY291bGQgbm90IGJlIGRldGVybWluZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2lycV9maW5kX3BhcmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcDsKKwljb25zdCBfX2JlMzIgKnBhcnA7CisKKwlpZiAoIW9mX25vZGVfZ2V0KGNoaWxkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbyB7CisJCXBhcnAgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJpbnRlcnJ1cHQtcGFyZW50IiwgTlVMTCk7CisJCWlmIChwYXJwID09IE5VTEwpCisJCQlwID0gb2ZfZ2V0X3BhcmVudChjaGlsZCk7CisJCWVsc2UgeworCQkJaWYgKG9mX2lycV93b3JrYXJvdW5kcyAmIE9GX0lNQVBfTk9fUEhBTkRMRSkKKwkJCQlwID0gb2Zfbm9kZV9nZXQob2ZfaXJxX2RmbHRfcGljKTsKKwkJCWVsc2UKKwkJCQlwID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoYmUzMl90b19jcHVwKHBhcnApKTsKKwkJfQorCQlvZl9ub2RlX3B1dChjaGlsZCk7CisJCWNoaWxkID0gcDsKKwl9IHdoaWxlIChwICYmIG9mX2dldF9wcm9wZXJ0eShwLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpID09IE5VTEwpOworCisJcmV0dXJuIHA7Cit9CisKKy8qKgorICogb2ZfaXJxX21hcF9yYXcgLSBMb3cgbGV2ZWwgaW50ZXJydXB0IHRyZWUgcGFyc2luZworICogQHBhcmVudDoJdGhlIGRldmljZSBpbnRlcnJ1cHQgcGFyZW50CisgKiBAaW50c3BlYzoJaW50ZXJydXB0IHNwZWNpZmllciAoImludGVycnVwdHMiIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UpCisgKiBAb2ludHNpemU6ICAgc2l6ZSBvZiB0aGUgcGFzc2VkIGluIGludGVycnVwdCBzcGVjaWZpZXIKKyAqIEBhZGRyOglhZGRyZXNzIHNwZWNpZmllciAoc3RhcnQgb2YgInJlZyIgcHJvcGVydHkgb2YgdGhlIGRldmljZSkKKyAqIEBvdXRfaXJxOglzdHJ1Y3R1cmUgb2ZfaXJxIGZpbGxlZCBieSB0aGlzIGZ1bmN0aW9uCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBhIGxvdy1sZXZlbCBpbnRlcnJ1cHQgdHJlZSB3YWxraW5nIGZ1bmN0aW9uLiBJdAorICogY2FuIGJlIHVzZWQgdG8gZG8gYSBwYXJ0aWFsIHdhbGsgd2l0aCBzeW50aGV0aXplZCByZWcgYW5kIGludGVycnVwdHMKKyAqIHByb3BlcnRpZXMsIGZvciBleGFtcGxlIHdoZW4gcmVzb2x2aW5nIFBDSSBpbnRlcnJ1cHRzIHdoZW4gbm8gZGV2aWNlCisgKiBub2RlIGV4aXN0IGZvciB0aGUgcGFyZW50LgorICovCitpbnQgb2ZfaXJxX21hcF9yYXcoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIGNvbnN0IF9fYmUzMiAqaW50c3BlYywKKwkJICAgdTMyIG9pbnRzaXplLCBjb25zdCBfX2JlMzIgKmFkZHIsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCit7CisJc3RydWN0IGRldmljZV9ub2RlICppcGFyLCAqdG5vZGUsICpvbGQgPSBOVUxMLCAqbmV3cGFyID0gTlVMTDsKKwljb25zdCBfX2JlMzIgKnRtcCwgKmltYXAsICppbWFzazsKKwl1MzIgaW50c2l6ZSA9IDEsIGFkZHJzaXplLCBuZXdpbnRzaXplID0gMCwgbmV3YWRkcnNpemUgPSAwOworCWludCBpbWFwbGVuLCBtYXRjaCwgaTsKKworCXByX2RlYnVnKCJvZl9pcnFfbWFwX3JhdzogcGFyPSVzLGludHNwZWM9WzB4JTA4eCAweCUwOHguLi5dLG9pbnRzaXplPSVkXG4iLAorCQkgcGFyZW50LT5mdWxsX25hbWUsIGJlMzJfdG9fY3B1cChpbnRzcGVjKSwKKwkJIGJlMzJfdG9fY3B1cChpbnRzcGVjICsgMSksIG9pbnRzaXplKTsKKworCWlwYXIgPSBvZl9ub2RlX2dldChwYXJlbnQpOworCisJLyogRmlyc3QgZ2V0IHRoZSAjaW50ZXJydXB0LWNlbGxzIHByb3BlcnR5IG9mIHRoZSBjdXJyZW50IGN1cnNvcgorCSAqIHRoYXQgdGVsbHMgdXMgaG93IHRvIGludGVycHJldCB0aGUgcGFzc2VkLWluIGludHNwZWMuIElmIHRoZXJlCisJICogaXMgbm9uZSwgd2UgYXJlIG5pY2UgYW5kIGp1c3Qgd2FsayB1cCB0aGUgdHJlZQorCSAqLworCWRvIHsKKwkJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KGlwYXIsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCk7CisJCWlmICh0bXAgIT0gTlVMTCkgeworCQkJaW50c2l6ZSA9IGJlMzJfdG9fY3B1KCp0bXApOworCQkJYnJlYWs7CisJCX0KKwkJdG5vZGUgPSBpcGFyOworCQlpcGFyID0gb2ZfaXJxX2ZpbmRfcGFyZW50KGlwYXIpOworCQlvZl9ub2RlX3B1dCh0bm9kZSk7CisJfSB3aGlsZSAoaXBhcik7CisJaWYgKGlwYXIgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiIC0+IG5vIHBhcmVudCBmb3VuZCAhXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXByX2RlYnVnKCJvZl9pcnFfbWFwX3JhdzogaXBhcj0lcywgc2l6ZT0lZFxuIiwgaXBhci0+ZnVsbF9uYW1lLCBpbnRzaXplKTsKKworCWlmIChvaW50c2l6ZSAhPSBpbnRzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIExvb2sgZm9yIHRoaXMgI2FkZHJlc3MtY2VsbHMuIFdlIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBvbGQgbGludXgKKwkgKiB0cmljayBvZiBsb29raW5nIGZvciB0aGUgcGFyZW50IGhlcmUgYXMgc29tZSBkZXZpY2UtdHJlZXMgcmVseSBvbiBpdAorCSAqLworCW9sZCA9IG9mX25vZGVfZ2V0KGlwYXIpOworCWRvIHsKKwkJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG9sZCwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7CisJCXRub2RlID0gb2ZfZ2V0X3BhcmVudChvbGQpOworCQlvZl9ub2RlX3B1dChvbGQpOworCQlvbGQgPSB0bm9kZTsKKwl9IHdoaWxlIChvbGQgJiYgdG1wID09IE5VTEwpOworCW9mX25vZGVfcHV0KG9sZCk7CisJb2xkID0gTlVMTDsKKwlhZGRyc2l6ZSA9ICh0bXAgPT0gTlVMTCkgPyAyIDogYmUzMl90b19jcHUoKnRtcCk7CisKKwlwcl9kZWJ1ZygiIC0+IGFkZHJzaXplPSVkXG4iLCBhZGRyc2l6ZSk7CisKKwkvKiBOb3cgc3RhcnQgdGhlIGFjdHVhbCAicHJvcGVyIiB3YWxrIG9mIHRoZSBpbnRlcnJ1cHQgdHJlZSAqLworCXdoaWxlIChpcGFyICE9IE5VTEwpIHsKKwkJLyogTm93IGNoZWNrIGlmIGN1cnNvciBpcyBhbiBpbnRlcnJ1cHQtY29udHJvbGxlciBhbmQgaWYgaXQgaXMKKwkJICogdGhlbiB3ZSBhcmUgZG9uZQorCQkgKi8KKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiLCBOVUxMKSAhPQorCQkJCU5VTEwpIHsKKwkJCXByX2RlYnVnKCIgLT4gZ290IGl0ICFcbiIpOworCQkJZm9yIChpID0gMDsgaSA8IGludHNpemU7IGkrKykKKwkJCQlvdXRfaXJxLT5zcGVjaWZpZXJbaV0gPQorCQkJCQkJb2ZfcmVhZF9udW1iZXIoaW50c3BlYyAraSwgMSk7CisJCQlvdXRfaXJxLT5zaXplID0gaW50c2l6ZTsKKwkJCW91dF9pcnEtPmNvbnRyb2xsZXIgPSBpcGFyOworCQkJb2Zfbm9kZV9wdXQob2xkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogTm93IGxvb2sgZm9yIGFuIGludGVycnVwdC1tYXAgKi8KKwkJaW1hcCA9IG9mX2dldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LW1hcCIsICZpbWFwbGVuKTsKKwkJLyogTm8gaW50ZXJydXB0IG1hcCwgY2hlY2sgZm9yIGFuIGludGVycnVwdCBwYXJlbnQgKi8KKwkJaWYgKGltYXAgPT0gTlVMTCkgeworCQkJcHJfZGVidWcoIiAtPiBubyBtYXAsIGdldHRpbmcgcGFyZW50XG4iKTsKKwkJCW5ld3BhciA9IG9mX2lycV9maW5kX3BhcmVudChpcGFyKTsKKwkJCWdvdG8gc2tpcGxldmVsOworCQl9CisJCWltYXBsZW4gLz0gc2l6ZW9mKHUzMik7CisKKwkJLyogTG9vayBmb3IgYSBtYXNrICovCisJCWltYXNrID0gb2ZfZ2V0X3Byb3BlcnR5KGlwYXIsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKKworCQkvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBubyAicmVnIiBwcm9wZXJ0eSBhbmQgd2UgYXR0ZW1wdCB0byBwYXJzZQorCQkgKiBhbiBpbnRlcnJ1cHQtbWFwLCB0aGVuICNhZGRyZXNzLWNlbGxzIG11c3QgYmUgMC4KKwkJICogRmFpbCBpZiBpdCdzIG5vdC4KKwkJICovCisJCWlmIChhZGRyID09IE5VTEwgJiYgYWRkcnNpemUgIT0gMCkgeworCQkJcHJfZGVidWcoIiAtPiBubyByZWcgcGFzc2VkIGluIHdoZW4gbmVlZGVkICFcbiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJLyogUGFyc2UgaW50ZXJydXB0LW1hcCAqLworCQltYXRjaCA9IDA7CisJCXdoaWxlIChpbWFwbGVuID4gKGFkZHJzaXplICsgaW50c2l6ZSArIDEpICYmICFtYXRjaCkgeworCQkJLyogQ29tcGFyZSBzcGVjaWZpZXJzICovCisJCQltYXRjaCA9IDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgYWRkcnNpemUgJiYgbWF0Y2g7ICsraSkgeworCQkJCXUzMiBtYXNrID0gaW1hc2sgPyBpbWFza1tpXSA6IDB4ZmZmZmZmZmZ1OworCQkJCW1hdGNoID0gKChhZGRyW2ldIF4gaW1hcFtpXSkgJiBtYXNrKSA9PSAwOworCQkJfQorCQkJZm9yICg7IGkgPCAoYWRkcnNpemUgKyBpbnRzaXplKSAmJiBtYXRjaDsgKytpKSB7CisJCQkJdTMyIG1hc2sgPSBpbWFzayA/IGltYXNrW2ldIDogMHhmZmZmZmZmZnU7CisJCQkJbWF0Y2ggPQorCQkJCSAgICgoaW50c3BlY1tpLWFkZHJzaXplXSBeIGltYXBbaV0pICYgbWFzaykgPT0gMDsKKwkJCX0KKwkJCWltYXAgKz0gYWRkcnNpemUgKyBpbnRzaXplOworCQkJaW1hcGxlbiAtPSBhZGRyc2l6ZSArIGludHNpemU7CisKKwkJCXByX2RlYnVnKCIgLT4gbWF0Y2g9JWQgKGltYXBsZW49JWQpXG4iLCBtYXRjaCwgaW1hcGxlbik7CisKKwkJCS8qIEdldCB0aGUgaW50ZXJydXB0IHBhcmVudCAqLworCQkJaWYgKG9mX2lycV93b3JrYXJvdW5kcyAmIE9GX0lNQVBfTk9fUEhBTkRMRSkKKwkJCQluZXdwYXIgPSBvZl9ub2RlX2dldChvZl9pcnFfZGZsdF9waWMpOworCQkJZWxzZQorCQkJCW5ld3BhciA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGJlMzJfdG9fY3B1cChpbWFwKSk7CisJCQlpbWFwKys7CisJCQktLWltYXBsZW47CisKKwkJCS8qIENoZWNrIGlmIG5vdCBmb3VuZCAqLworCQkJaWYgKG5ld3BhciA9PSBOVUxMKSB7CisJCQkJcHJfZGVidWcoIiAtPiBpbWFwIHBhcmVudCBub3QgZm91bmQgIVxuIik7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQkvKiBHZXQgI2ludGVycnVwdC1jZWxscyBhbmQgI2FkZHJlc3MtY2VsbHMgb2YgbmV3CisJCQkgKiBwYXJlbnQKKwkJCSAqLworCQkJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG5ld3BhciwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKKwkJCWlmICh0bXAgPT0gTlVMTCkgeworCQkJCXByX2RlYnVnKCIgLT4gcGFyZW50IGxhY2tzICNpbnRlcnJ1cHQtY2VsbHMhXG4iKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQluZXdpbnRzaXplID0gYmUzMl90b19jcHUoKnRtcCk7CisJCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkobmV3cGFyLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKKwkJCW5ld2FkZHJzaXplID0gKHRtcCA9PSBOVUxMKSA/IDAgOiBiZTMyX3RvX2NwdSgqdG1wKTsKKworCQkJcHJfZGVidWcoIiAtPiBuZXdpbnRzaXplPSVkLCBuZXdhZGRyc2l6ZT0lZFxuIiwKKwkJCSAgICBuZXdpbnRzaXplLCBuZXdhZGRyc2l6ZSk7CisKKwkJCS8qIENoZWNrIGZvciBtYWxmb3JtZWQgcHJvcGVydGllcyAqLworCQkJaWYgKGltYXBsZW4gPCAobmV3YWRkcnNpemUgKyBuZXdpbnRzaXplKSkKKwkJCQlnb3RvIGZhaWw7CisKKwkJCWltYXAgKz0gbmV3YWRkcnNpemUgKyBuZXdpbnRzaXplOworCQkJaW1hcGxlbiAtPSBuZXdhZGRyc2l6ZSArIG5ld2ludHNpemU7CisKKwkJCXByX2RlYnVnKCIgLT4gaW1hcGxlbj0lZFxuIiwgaW1hcGxlbik7CisJCX0KKwkJaWYgKCFtYXRjaCkKKwkJCWdvdG8gZmFpbDsKKworCQlvZl9ub2RlX3B1dChvbGQpOworCQlvbGQgPSBvZl9ub2RlX2dldChuZXdwYXIpOworCQlhZGRyc2l6ZSA9IG5ld2FkZHJzaXplOworCQlpbnRzaXplID0gbmV3aW50c2l6ZTsKKwkJaW50c3BlYyA9IGltYXAgLSBpbnRzaXplOworCQlhZGRyID0gaW50c3BlYyAtIGFkZHJzaXplOworCisJc2tpcGxldmVsOgorCQkvKiBJdGVyYXRlIGFnYWluIHdpdGggbmV3IHBhcmVudCAqLworCQlwcl9kZWJ1ZygiIC0+IG5ldyBwYXJlbnQ6ICVzXG4iLCBuZXdwYXIgPyBuZXdwYXItPmZ1bGxfbmFtZSA6ICI8PiIpOworCQlvZl9ub2RlX3B1dChpcGFyKTsKKwkJaXBhciA9IG5ld3BhcjsKKwkJbmV3cGFyID0gTlVMTDsKKwl9CisgZmFpbDoKKwlvZl9ub2RlX3B1dChpcGFyKTsKKwlvZl9ub2RlX3B1dChvbGQpOworCW9mX25vZGVfcHV0KG5ld3Bhcik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfcmF3KTsKKworLyoqCisgKiBvZl9pcnFfbWFwX29uZSAtIFJlc29sdmUgYW4gaW50ZXJydXB0IGZvciBhIGRldmljZQorICogQGRldmljZTogdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgcmVzb2x2ZWQKKyAqIEBpbmRleDogaW5kZXggb2YgdGhlIGludGVycnVwdCB0byByZXNvbHZlCisgKiBAb3V0X2lycTogc3RydWN0dXJlIG9mX2lycSBmaWxsZWQgYnkgdGhpcyBmdW5jdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMgYW4gaW50ZXJydXB0LCB3YWxraW5nIHRoZSB0cmVlLCBmb3IgYSBnaXZlbgorICogZGV2aWNlLXRyZWUgbm9kZS4gSXQncyB0aGUgaGlnaCBsZXZlbCBwZW5kYW50IHRvIG9mX2lycV9tYXBfcmF3KCkuCisgKi8KK2ludCBvZl9pcnFfbWFwX29uZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4LCBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcDsKKwljb25zdCBfX2JlMzIgKmludHNwZWMsICp0bXAsICphZGRyOworCXUzMiBpbnRzaXplLCBpbnRsZW47CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlwcl9kZWJ1Zygib2ZfaXJxX21hcF9vbmU6IGRldj0lcywgaW5kZXg9JWRcbiIsIGRldmljZS0+ZnVsbF9uYW1lLCBpbmRleCk7CisKKwkvKiBPbGRXb3JsZCBtYWMgc3R1ZmYgaXMgInNwZWNpYWwiLCBoYW5kbGUgb3V0IG9mIGxpbmUgKi8KKwlpZiAob2ZfaXJxX3dvcmthcm91bmRzICYgT0ZfSU1BUF9PTERXT1JMRF9NQUMpCisJCXJldHVybiBvZl9pcnFfbWFwX29sZHdvcmxkKGRldmljZSwgaW5kZXgsIG91dF9pcnEpOworCisJLyogR2V0IHRoZSBpbnRlcnJ1cHRzIHByb3BlcnR5ICovCisJaW50c3BlYyA9IG9mX2dldF9wcm9wZXJ0eShkZXZpY2UsICJpbnRlcnJ1cHRzIiwgJmludGxlbik7CisJaWYgKGludHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaW50bGVuIC89IHNpemVvZigqaW50c3BlYyk7CisKKwlwcl9kZWJ1ZygiIGludHNwZWM9JWQgaW50bGVuPSVkXG4iLCBiZTMyX3RvX2NwdXAoaW50c3BlYyksIGludGxlbik7CisKKwkvKiBHZXQgdGhlIHJlZyBwcm9wZXJ0eSAoaWYgYW55KSAqLworCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAicmVnIiwgTlVMTCk7CisKKwkvKiBMb29rIGZvciB0aGUgaW50ZXJydXB0IHBhcmVudC4gKi8KKwlwID0gb2ZfaXJxX2ZpbmRfcGFyZW50KGRldmljZSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgc2l6ZSBvZiBpbnRlcnJ1cHQgc3BlY2lmaWVyICovCisJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KHAsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCk7CisJaWYgKHRtcCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpbnRzaXplID0gYmUzMl90b19jcHUoKnRtcCk7CisKKwlwcl9kZWJ1ZygiIGludHNpemU9JWQgaW50bGVuPSVkXG4iLCBpbnRzaXplLCBpbnRsZW4pOworCisJLyogQ2hlY2sgaW5kZXggKi8KKwlpZiAoKGluZGV4ICsgMSkgKiBpbnRzaXplID4gaW50bGVuKQorCQlnb3RvIG91dDsKKworCS8qIEdldCBuZXcgc3BlY2lmaWVyIGFuZCBtYXAgaXQgKi8KKwlyZXMgPSBvZl9pcnFfbWFwX3JhdyhwLCBpbnRzcGVjICsgaW5kZXggKiBpbnRzaXplLCBpbnRzaXplLAorCQkJICAgICBhZGRyLCBvdXRfaXJxKTsKKyBvdXQ6CisJb2Zfbm9kZV9wdXQocCk7CisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfb25lKTsKKworLyoqCisgKiBvZl9pcnFfdG9fcmVzb3VyY2UgLSBEZWNvZGUgYSBub2RlJ3MgSVJRIGFuZCByZXR1cm4gaXQgYXMgYSByZXNvdXJjZQorICogQGRldjogcG9pbnRlciB0byBkZXZpY2UgdHJlZSBub2RlCisgKiBAaW5kZXg6IHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGlycQorICogQHI6IHBvaW50ZXIgdG8gcmVzb3VyY2Ugc3RydWN0dXJlIHRvIHJldHVybiByZXN1bHQgaW50by4KKyAqLworaW50IG9mX2lycV90b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJaW50IGlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRldiwgaW5kZXgpOworCisJLyogT25seSBkZXJlZmVyZW5jZSB0aGUgcmVzb3VyY2UgaWYgYm90aCB0aGUKKwkgKiByZXNvdXJjZSBhbmQgdGhlIGlycSBhcmUgdmFsaWQuICovCisJaWYgKHIgJiYgaXJxICE9IE5PX0lSUSkgeworCQlyLT5zdGFydCA9IHItPmVuZCA9IGlycTsKKwkJci0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwkJci0+bmFtZSA9IGRldi0+ZnVsbF9uYW1lOworCX0KKworCXJldHVybiBpcnE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9pcnFfdG9fcmVzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9pMmMuYyBiL2RyaXZlcnMvb2Yvb2ZfaTJjLmMKaW5kZXggYWI2NTIyYy4uMGE2OTRkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9pMmMuYworKysgYi9kcml2ZXJzL29mL29mX2kyYy5jCkBAIC0xNCw1NyArMTQsNjUgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi12b2lkIG9mX3JlZ2lzdGVyX2kyY19kZXZpY2VzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICphZGFwX25vZGUpCit2b2lkIG9mX2kyY19yZWdpc3Rlcl9kZXZpY2VzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKIAl2b2lkICpyZXN1bHQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShhZGFwX25vZGUsIG5vZGUpIHsKKwkvKiBPbmx5IHJlZ2lzdGVyIGNoaWxkIGRldmljZXMgaWYgdGhlIGFkYXB0ZXIgaGFzIGEgbm9kZSBwb2ludGVyIHNldCAqLworCWlmICghYWRhcC0+ZGV2Lm9mX25vZGUpCisJCXJldHVybjsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIm9mX2kyYzogd2Fsa2luZyBjaGlsZCBub2Rlc1xuIik7CisKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGFkYXAtPmRldi5vZl9ub2RlLCBub2RlKSB7CiAJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvID0ge307CiAJCXN0cnVjdCBkZXZfYXJjaGRhdGEgZGV2X2FkID0ge307CiAJCWNvbnN0IF9fYmUzMiAqYWRkcjsKIAkJaW50IGxlbjsKIAotCQlpZiAob2ZfbW9kYWxpYXNfbm9kZShub2RlLCBpbmZvLnR5cGUsIHNpemVvZihpbmZvLnR5cGUpKSA8IDApCisJCWRldl9kYmcoJmFkYXAtPmRldiwgIm9mX2kyYzogcmVnaXN0ZXIgJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwkJaWYgKG9mX21vZGFsaWFzX25vZGUobm9kZSwgaW5mby50eXBlLCBzaXplb2YoaW5mby50eXBlKSkgPCAwKSB7CisJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJvZl9pMmM6IG1vZGFsaWFzIGZhaWx1cmUgb24gJXNcbiIsCisJCQkJbm9kZS0+ZnVsbF9uYW1lKTsKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgJmxlbik7Ci0JCWlmICghYWRkciB8fCBsZW4gPCBzaXplb2YoaW50KSB8fCAqYWRkciA+ICgxIDw8IDEwKSAtIDEpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJvZi1pMmM6IGludmFsaWQgaTJjIGRldmljZSBlbnRyeVxuIik7CisJCWlmICghYWRkciB8fCAobGVuIDwgc2l6ZW9mKGludCkpKSB7CisJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJvZl9pMmM6IGludmFsaWQgcmVnIG9uICVzXG4iLAorCQkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluZm8uYWRkciA9IGJlMzJfdG9fY3B1cChhZGRyKTsKKwkJaWYgKGluZm8uYWRkciA+ICgxIDw8IDEwKSAtIDEpIHsKKwkJCWRldl9lcnIoJmFkYXAtPmRldiwgIm9mX2kyYzogaW52YWxpZCBhZGRyPSV4IG9uICVzXG4iLAorCQkJCWluZm8uYWRkciwgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaW5mby5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKLQotCQlpbmZvLmFkZHIgPSBiZTMyX3RvX2NwdXAoYWRkcik7Ci0KLQkJaW5mby5vZl9ub2RlID0gbm9kZTsKKwkJaW5mby5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CiAJCWluZm8uYXJjaGRhdGEgPSAmZGV2X2FkOwogCiAJCXJlcXVlc3RfbW9kdWxlKCIlcyIsIGluZm8udHlwZSk7CiAKIAkJcmVzdWx0ID0gaTJjX25ld19kZXZpY2UoYWRhcCwgJmluZm8pOwogCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJvZi1pMmM6IEZhaWxlZCB0byBsb2FkIGRyaXZlciBmb3IgJXNcbiIsCi0JCQkgICAgICAgaW5mby50eXBlKTsKKwkJCWRldl9lcnIoJmFkYXAtPmRldiwgIm9mX2kyYzogRmFpbHVyZSByZWdpc3RlcmluZyAlc1xuIiwKKwkJCSAgICAgICAgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhpbmZvLmlycSk7CiAJCQljb250aW51ZTsKIAkJfQotCi0JCS8qCi0JCSAqIEdldCB0aGUgbm9kZSB0byBub3QgbG9zZSB0aGUgZGV2X2FyY2hkYXRhLT5vZl9ub2RlLgotCQkgKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gd2F5IHRvIHB1dCBpdCBiYWNrLCBhcyB3ZWxsIGFzIG5vCi0JCSAqIG9mX3VucmVnaXN0ZXJfaTJjX2RldmljZXMoKSBjYWxsLgotCQkgKi8KLQkJb2Zfbm9kZV9nZXQobm9kZSk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChvZl9yZWdpc3Rlcl9pMmNfZGV2aWNlcyk7CitFWFBPUlRfU1lNQk9MKG9mX2kyY19yZWdpc3Rlcl9kZXZpY2VzKTsKIAogc3RhdGljIGludCBvZl9kZXZfbm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX21kaW8uYyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCmluZGV4IDQyYTY3MTUuLjFmY2UwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9tZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2Zfc3BpLmMgYi9kcml2ZXJzL29mL29mX3NwaS5jCmluZGV4IDVmZWQ3ZTMuLjFkYmNlNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2Zfc3BpLmMKKysrIGIvZHJpdmVycy9vZi9vZl9zcGkuYwpAQCAtOSwxNyArOSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3NwaS5oPgogCiAvKioKICAqIG9mX3JlZ2lzdGVyX3NwaV9kZXZpY2VzIC0gUmVnaXN0ZXIgY2hpbGQgZGV2aWNlcyBvbnRvIHRoZSBTUEkgYnVzCiAgKiBAbWFzdGVyOglQb2ludGVyIHRvIHNwaV9tYXN0ZXIgZGV2aWNlCi0gKiBAbnA6CQlwYXJlbnQgbm9kZSBvZiBTUEkgZGV2aWNlIG5vZGVzCiAgKgotICogUmVnaXN0ZXJzIGFuIHNwaV9kZXZpY2UgZm9yIGVhY2ggY2hpbGQgbm9kZSBvZiAnbnAnIHdoaWNoIGhhcyBhICdyZWcnCisgKiBSZWdpc3RlcnMgYW4gc3BpX2RldmljZSBmb3IgZWFjaCBjaGlsZCBub2RlIG9mIG1hc3RlciBub2RlIHdoaWNoIGhhcyBhICdyZWcnCiAgKiBwcm9wZXJ0eS4KICAqLwotdm9pZCBvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQordm9pZCBvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CiAJc3RydWN0IGRldmljZV9ub2RlICpuYzsKQEAgLTI3LDcgKzI3LDEwIEBACiAJaW50IHJjOwogCWludCBsZW47CiAKLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBuYykgeworCWlmICghbWFzdGVyLT5kZXYub2Zfbm9kZSkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShtYXN0ZXItPmRldi5vZl9ub2RlLCBuYykgewogCQkvKiBBbGxvYyBhbiBzcGlfZGV2aWNlICovCiAJCXNwaSA9IHNwaV9hbGxvY19kZXZpY2UobWFzdGVyKTsKIAkJaWYgKCFzcGkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwppbmRleCA3ZGFjYzFlLi5iYjcyMjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCkBAIC0xNCw4ICsxNCwxMDUgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCitzdGF0aWMgaW50IG9mX2Rldl9ub2RlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGV2LT5vZl9ub2RlID09IGRhdGE7Cit9CisKKy8qKgorICogb2ZfZmluZF9kZXZpY2VfYnlfbm9kZSAtIEZpbmQgdGhlIHBsYXRmb3JtX2RldmljZSBhc3NvY2lhdGVkIHdpdGggYSBub2RlCisgKiBAbnA6IFBvaW50ZXIgdG8gZGV2aWNlIHRyZWUgbm9kZQorICoKKyAqIFJldHVybnMgcGxhdGZvcm1fZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCBucCwgb2ZfZGV2X25vZGVfbWF0Y2gpOworCXJldHVybiBkZXYgPyB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSA6IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUpOworCitzdGF0aWMgaW50IHBsYXRmb3JtX2RyaXZlcl9wcm9iZV9zaGltKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpvZnBkcnY7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisKKwlwZHJ2ID0gY29udGFpbmVyX29mKHBkZXYtPmRldi5kcml2ZXIsIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIsIGRyaXZlcik7CisJb2ZwZHJ2ID0gY29udGFpbmVyX29mKHBkcnYsIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIsIHBsYXRmb3JtX2RyaXZlcik7CisKKwkvKiBUaGVyZSBpcyBhbiB1bmxpa2VseSBjaGFuY2UgdGhhdCBhbiBvZl9wbGF0Zm9ybSBkcml2ZXIgbWlnaHQgbWF0Y2gKKwkgKiBvbiBhIG5vbi1PRiBwbGF0Zm9ybSBkZXZpY2UuICBJZiBzbywgdGhlbiBvZl9tYXRjaF9kZXZpY2UoKSB3aWxsCisJICogY29tZSB1cCBlbXB0eS4gIFJldHVybiAtRUlOVkFMIGluIHRoaXMgY2FzZSBzbyBvdGhlciBkcml2ZXJzIGdldAorCSAqIHRoZSBjaGFuY2UgdG8gYmluZC4gKi8KKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShwZGV2LT5kZXYuZHJpdmVyLT5vZl9tYXRjaF90YWJsZSwgJnBkZXYtPmRldik7CisJcmV0dXJuIG1hdGNoID8gb2ZwZHJ2LT5wcm9iZShwZGV2LCBtYXRjaCkgOiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBwbGF0Zm9ybV9kcml2ZXJfc2h1dGRvd25fc2hpbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqb2ZwZHJ2OworCisJcGRydiA9IGNvbnRhaW5lcl9vZihwZGV2LT5kZXYuZHJpdmVyLCBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyLCBkcml2ZXIpOworCW9mcGRydiA9IGNvbnRhaW5lcl9vZihwZHJ2LCBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyLCBwbGF0Zm9ybV9kcml2ZXIpOworCW9mcGRydi0+c2h1dGRvd24ocGRldik7Cit9CisKKy8qKgorICogb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyCisgKi8KK2ludCBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KQoreworCWNoYXIgKm9mX25hbWU7CisKKwkvKiBzZXR1cCBvZl9wbGF0Zm9ybV9kcml2ZXIgdG8gcGxhdGZvcm1fZHJpdmVyIGFkYXB0b3JzICovCisJZHJ2LT5wbGF0Zm9ybV9kcml2ZXIuZHJpdmVyID0gZHJ2LT5kcml2ZXI7CisKKwkvKiBQcmVmaXggdGhlIGRyaXZlciBuYW1lIHdpdGggJ29mOicgdG8gYXZvaWQgbmFtZXNwYWNlIGNvbGxpc2lvbnMKKwkgKiBhbmQgYm9ndXMgbWF0Y2hlcy4gIFRoZXJlIGFyZSBzb21lIGRyaXZlcnMgaW4gdGhlIHRyZWUgdGhhdAorCSAqIHJlZ2lzdGVyIGJvdGggYW4gb2ZfcGxhdGZvcm1fZHJpdmVyIGFuZCBhIHBsYXRmb3JtX2RyaXZlciB3aXRoCisJICogdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSB1bnRpbCB0aGV5IGFyZSBhbGwKKwkgKiBjbGVhbmVkIHVwIC0tZ2NsIEp1bHkgMjksIDIwMTAgKi8KKwlvZl9uYW1lID0ga21hbGxvYyhzdHJsZW4oZHJ2LT5kcml2ZXIubmFtZSkgKyA1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9mX25hbWUpCisJCXJldHVybiAtRU5PTUVNOworCXNwcmludGYob2ZfbmFtZSwgIm9mOiVzIiwgZHJ2LT5kcml2ZXIubmFtZSk7CisJZHJ2LT5wbGF0Zm9ybV9kcml2ZXIuZHJpdmVyLm5hbWUgPSBvZl9uYW1lOworCisJaWYgKGRydi0+cHJvYmUpCisJCWRydi0+cGxhdGZvcm1fZHJpdmVyLnByb2JlID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlX3NoaW07CisJZHJ2LT5wbGF0Zm9ybV9kcml2ZXIucmVtb3ZlID0gZHJ2LT5yZW1vdmU7CisJaWYgKGRydi0+c2h1dGRvd24pCisJCWRydi0+cGxhdGZvcm1fZHJpdmVyLnNodXRkb3duID0gcGxhdGZvcm1fZHJpdmVyX3NodXRkb3duX3NoaW07CisJZHJ2LT5wbGF0Zm9ybV9kcml2ZXIuc3VzcGVuZCA9IGRydi0+c3VzcGVuZDsKKwlkcnYtPnBsYXRmb3JtX2RyaXZlci5yZXN1bWUgPSBkcnYtPnJlc3VtZTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRydi0+cGxhdGZvcm1fZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKTsKKwordm9pZCBvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+cGxhdGZvcm1fZHJpdmVyKTsKKwlrZnJlZShkcnYtPnBsYXRmb3JtX2RyaXZlci5kcml2ZXIubmFtZSk7CisJZHJ2LT5wbGF0Zm9ybV9kcml2ZXIuZHJpdmVyLm5hbWUgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfRENSKQorI2luY2x1ZGUgPGFzbS9kY3IuaD4KKyNlbmRpZgogCiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgb2ZfcGxhdGZvcm1fZGV2aWNlX2F0dHJzW107CiAKQEAgLTMzLDExICsxMzAsMTEgQEAKIHsKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydjsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZfZGV2OwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlvZl9kZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAogCWlmICghZHJ2LT5wcm9iZSkKIAkJcmV0dXJuIGVycm9yOwpAQCAtNTUsNyArMTUyLDcgQEAKIAogc3RhdGljIGludCBvZl9wbGF0Zm9ybV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9kZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVtb3ZlKQpAQCAtNjUsNyArMTYyLDcgQEAKIAogc3RhdGljIHZvaWQgb2ZfcGxhdGZvcm1fZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9kZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c2h1dGRvd24pCkBAIC03Niw3ICsxNzMsNyBAQAogCiBzdGF0aWMgaW50IG9mX3BsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZfZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtODcsNyArMTg0LDcgQEAKIAogc3RhdGljIGludCBvZl9wbGF0Zm9ybV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9kZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCWludCByZXQgPSAwOwogCkBAIC0zODQsMTUgKzQ4MSwyODYgQEAKIAogaW50IG9mX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYsIHN0cnVjdCBidXNfdHlwZSAqYnVzKQogewotCWRydi0+ZHJpdmVyLmJ1cyA9IGJ1czsKKwkvKgorCSAqIFRlbXBvcmFyeTogb2ZfcGxhdGZvcm1fYnVzIHVzZWQgdG8gYmUgZGlzdGluY3QgZnJvbSB0aGUgcGxhdGZvcm0KKwkgKiBidXMuICBJdCBpc24ndCBhbnltb3JlLCBhbmQgc28gZHJpdmVycyBvbiB0aGUgcGxhdGZvcm0gYnVzIG5lZWQKKwkgKiB0byBiZSByZWdpc3RlcmVkIGluIGEgc3BlY2lhbCB3YXkuCisJICoKKwkgKiBBZnRlciBhbGwgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgZHJpdmVycyBhcmUgY29udmVydGVkIHRvCisJICogcGxhdGZvcm1fZHJpdmVycywgdGhpcyBleGNlcHRpb24gY2FuIGJlIHJlbW92ZWQuCisJICovCisJaWYgKGJ1cyA9PSAmcGxhdGZvcm1fYnVzX3R5cGUpCisJCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLworCWRydi0+ZHJpdmVyLmJ1cyA9IGJ1czsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX3JlZ2lzdGVyX2RyaXZlcik7CiAKIHZvaWQgb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KQogewotCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJaWYgKGRydi0+ZHJpdmVyLmJ1cyA9PSAmcGxhdGZvcm1fYnVzX3R5cGUpCisJCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKGRydik7CisJZWxzZQorCQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogfQogRVhQT1JUX1NZTUJPTChvZl91bnJlZ2lzdGVyX2RyaXZlcik7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1BBUkMpCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBzY2FuIGEgc3VidHJlZSBhbmQgcmVnaXN0ZXJzIGEgZGV2aWNlIGZvcgorICogZWFjaCBhcHBsaWNhYmxlIG5vZGUuCisgKgorICogTm90ZTogc3BhcmMgZG9lc24ndCB1c2UgdGhlc2Ugcm91dGluZXMgYmVjYXVzZSBpdCBoYXMgYSBkaWZmZXJlbnQKKyAqIG1lY2hhbmlzbSBmb3IgY3JlYXRpbmcgZGV2aWNlcyBmcm9tIGRldmljZSB0cmVlIG5vZGVzLgorICovCisKKy8qKgorICogb2ZfZGV2aWNlX21ha2VfYnVzX2lkIC0gVXNlIHRoZSBkZXZpY2Ugbm9kZSBkYXRhIHRvIGFzc2lnbiBhIHVuaXF1ZSBuYW1lCisgKiBAZGV2OiBwb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgdGhhdCBpcyBsaW5rZWQgdG8gYSBkZXZpY2UgdHJlZSBub2RlCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgZmlyc3QgdHJ5IHVzaW5nIGVpdGhlciB0aGUgZGNyLXJlZyBvciB0aGUgcmVnIHByb3BlcnR5CisgKiB2YWx1ZSB0byBkZXJpdmUgYSB1bmlxdWUgbmFtZS4gIEFzIGEgbGFzdCByZXNvcnQgaXQgd2lsbCB1c2UgdGhlIG5vZGUKKyAqIG5hbWUgZm9sbG93ZWQgYnkgYSB1bmlxdWUgbnVtYmVyLgorICovCit2b2lkIG9mX2RldmljZV9tYWtlX2J1c19pZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGF0b21pY190IGJ1c19ub19yZWdfbWFnaWM7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gZGV2LT5vZl9ub2RlOworCWNvbnN0IHUzMiAqcmVnOworCXU2NCBhZGRyOworCWludCBtYWdpYzsKKworI2lmZGVmIENPTkZJR19QUENfRENSCisJLyoKKwkgKiBJZiBpdCdzIGEgRENSIGJhc2VkIGRldmljZSwgdXNlICdkJyBmb3IgbmF0aXZlIERDUnMKKwkgKiBhbmQgJ0QnIGZvciBNTUlPIERDUnMuCisJICovCisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCk7CisJaWYgKHJlZykgeworI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQorCQlkZXZfc2V0X25hbWUoZGV2LCAiZCV4LiVzIiwgKnJlZywgbm9kZS0+bmFtZSk7CisjZWxzZSAvKiBDT05GSUdfUFBDX0RDUl9OQVRJVkUgKi8KKwkJdTY0IGFkZHIgPSBvZl90cmFuc2xhdGVfZGNyX2FkZHJlc3Mobm9kZSwgKnJlZywgTlVMTCk7CisJCWlmIChhZGRyICE9IE9GX0JBRF9BRERSKSB7CisJCQlkZXZfc2V0X25hbWUoZGV2LCAiRCVsbHguJXMiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyLCBub2RlLT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmIC8qICFDT05GSUdfUFBDX0RDUl9OQVRJVkUgKi8KKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19EQ1IgKi8KKworCS8qCisJICogRm9yIE1NSU8sIGdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcworCSAqLworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKHJlZykgeworCQlhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Mobm9kZSwgcmVnKTsKKwkJaWYgKGFkZHIgIT0gT0ZfQkFEX0FERFIpIHsKKwkJCWRldl9zZXRfbmFtZShkZXYsICIlbGx4LiVzIiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkciwgbm9kZS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIE5vIEJ1c0lELCB1c2UgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGEgZ2xvYmFsbHkgaW5jcmVtZW50ZWQKKwkgKiBjb3VudGVyIChhbmQgcHJheS4uLikKKwkgKi8KKwltYWdpYyA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZidXNfbm9fcmVnX21hZ2ljKTsKKwlkZXZfc2V0X25hbWUoZGV2LCAiJXMuJWQiLCBub2RlLT5uYW1lLCBtYWdpYyAtIDEpOworfQorCisvKioKKyAqIG9mX2RldmljZV9hbGxvYyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIG9mX2RldmljZQorICogQG5wOiBkZXZpY2Ugbm9kZSB0byBhc3NpZ24gdG8gZGV2aWNlCisgKiBAYnVzX2lkOiBOYW1lIHRvIGFzc2lnbiB0byB0aGUgZGV2aWNlLiAgTWF5IGJlIG51bGwgdG8gdXNlIGRlZmF1bHQgbmFtZS4KKyAqIEBwYXJlbnQ6IFBhcmVudCBkZXZpY2UuCisgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mX2RldmljZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgY29uc3QgY2hhciAqYnVzX2lkLAorCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwlpbnQgcmMsIGksIG51bV9yZWcgPSAwLCBudW1faXJxID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdGVtcF9yZXM7CisKKwkvKiBGaXJzdCBjb3VudCBob3cgbWFueSByZXNvdXJjZXMgYXJlIG5lZWRlZCAqLworCXdoaWxlIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCBudW1fcmVnLCAmdGVtcF9yZXMpID09IDApCisJCW51bV9yZWcrKzsKKwl3aGlsZSAob2ZfaXJxX3RvX3Jlc291cmNlKG5wLCBudW1faXJxLCAmdGVtcF9yZXMpICE9IE5PX0lSUSkKKwkJbnVtX2lycSsrOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBib3RoIHRoZSBzdHJ1Y3QgZGV2aWNlIGFuZCB0aGUgcmVzb3VyY2UgdGFibGUgKi8KKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSArIChzaXplb2YoKnJlcykgKiAobnVtX3JlZyArIG51bV9pcnEpKSwKKwkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCXJlcyA9IChzdHJ1Y3QgcmVzb3VyY2UgKikgJmRldlsxXTsKKworCS8qIFBvcHVsYXRlIHRoZSByZXNvdXJjZSB0YWJsZSAqLworCWlmIChudW1faXJxIHx8IG51bV9yZWcpIHsKKwkJZGV2LT5udW1fcmVzb3VyY2VzID0gbnVtX3JlZyArIG51bV9pcnE7CisJCWRldi0+cmVzb3VyY2UgPSByZXM7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnOyBpKyssIHJlcysrKSB7CisJCQlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGksIHJlcyk7CisJCQlXQVJOX09OKHJjKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2lycTsgaSsrLCByZXMrKykgeworCQkJcmMgPSBvZl9pcnFfdG9fcmVzb3VyY2UobnAsIGksIHJlcyk7CisJCQlXQVJOX09OKHJjID09IE5PX0lSUSk7CisJCX0KKwl9CisKKwlkZXYtPmRldi5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobnApOworI2lmIGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfTUlDUk9CTEFaRSkKKwlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmFyY2hkYXRhLmRtYV9tYXNrOworI2VuZGlmCisJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworCWRldi0+ZGV2LnJlbGVhc2UgPSBvZl9yZWxlYXNlX2RldjsKKworCWlmIChidXNfaWQpCisJCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlcyIsIGJ1c19pZCk7CisJZWxzZQorCQlvZl9kZXZpY2VfbWFrZV9idXNfaWQoJmRldi0+ZGV2KTsKKworCXJldHVybiBkZXY7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2RldmljZV9hbGxvYyk7CisKKy8qKgorICogb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSAtIEFsbG9jLCBpbml0aWFsaXplIGFuZCByZWdpc3RlciBhbiBvZl9kZXZpY2UKKyAqIEBucDogcG9pbnRlciB0byBub2RlIHRvIGNyZWF0ZSBkZXZpY2UgZm9yCisgKiBAYnVzX2lkOiBuYW1lIHRvIGFzc2lnbiBkZXZpY2UKKyAqIEBwYXJlbnQ6IExpbnV4IGRldmljZSBtb2RlbCBwYXJlbnQgZGV2aWNlLgorICovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2OworCisJZGV2ID0gb2ZfZGV2aWNlX2FsbG9jKG5wLCBidXNfaWQsIHBhcmVudCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKSB8fCBkZWZpbmVkKENPTkZJR19NSUNST0JMQVpFKQorCWRldi0+YXJjaGRhdGEuZG1hX21hc2sgPSAweGZmZmZmZmZmVUw7CisjZW5kaWYKKwlkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJZGV2LT5kZXYuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlOworCisJLyogV2UgZG8gbm90IGZpbGwgdGhlIERNQSBvcHMgZm9yIHBsYXRmb3JtIGRldmljZXMgYnkgZGVmYXVsdC4KKwkgKiBUaGlzIGlzIGN1cnJlbnRseSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHBsYXRmb3JtIGNvZGUKKwkgKiB0byBkbyBzdWNoLCBwb3NzaWJseSB1c2luZyBhIGRldmljZSBub3RpZmllcgorCSAqLworCisJaWYgKG9mX2RldmljZV9yZWdpc3RlcihkZXYpICE9IDApIHsKKwkJb2ZfZGV2aWNlX2ZyZWUoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRldjsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSk7CisKKy8qKgorICogb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZSAtIENyZWF0ZSBhbiBPRiBkZXZpY2UgZm9yIGEgYnVzIG5vZGUgYW5kIGFsbCBpdHMKKyAqIGNoaWxkcmVuLiBPcHRpb25hbGx5IHJlY3Vyc2l2ZWx5IGluc3RhbnRpYXRlIG1hdGNoaW5nIGJ1c3Nlcy4KKyAqIEBidXM6IGRldmljZSBub2RlIG9mIHRoZSBidXMgdG8gaW5zdGFudGlhdGUKKyAqIEBtYXRjaGVzOiBtYXRjaCB0YWJsZSwgTlVMTCB0byB1c2UgdGhlIGRlZmF1bHQsIE9GX05PX0RFRVBfUFJPQkUgdG8KKyAqIGRpc2FsbG93IHJlY3Vyc2l2ZSBjcmVhdGlvbiBvZiBjaGlsZCBidXNzZXMKKyAqLworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzLAorCQkJCSAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwlpbnQgcmMgPSAwOworCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShidXMsIGNoaWxkKSB7CisJCXByX2RlYnVnKCIgICBjcmVhdGUgY2hpbGQ6ICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKKwkJZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShjaGlsZCwgTlVMTCwgcGFyZW50KTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJcmMgPSAtRU5PTUVNOworCQllbHNlIGlmICghb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBjaGlsZCkpCisJCQljb250aW51ZTsKKwkJaWYgKHJjID09IDApIHsKKwkJCXByX2RlYnVnKCIgICBhbmQgc3ViIGJ1c3Nlc1xuIik7CisJCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7CisJCX0KKwkJaWYgKHJjKSB7CisJCQlvZl9ub2RlX3B1dChjaGlsZCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogb2ZfcGxhdGZvcm1fYnVzX3Byb2JlIC0gUHJvYmUgdGhlIGRldmljZS10cmVlIGZvciBwbGF0Zm9ybSBidXNzZXMKKyAqIEByb290OiBwYXJlbnQgb2YgdGhlIGZpcnN0IGxldmVsIHRvIHByb2JlIG9yIE5VTEwgZm9yIHRoZSByb290IG9mIHRoZSB0cmVlCisgKiBAbWF0Y2hlczogbWF0Y2ggdGFibGUsIE5VTEwgdG8gdXNlIHRoZSBkZWZhdWx0CisgKiBAcGFyZW50OiBwYXJlbnQgdG8gaG9vayBkZXZpY2VzIGZyb20sIE5VTEwgZm9yIHRvcGxldmVsCisgKgorICogTm90ZSB0aGF0IGNoaWxkcmVuIG9mIHRoZSBwcm92aWRlZCByb290IGFyZSBub3QgaW5zdGFudGlhdGVkIGFzIGRldmljZXMKKyAqIHVubGVzcyB0aGUgc3BlY2lmaWVkIHJvb3QgaXRzZWxmIG1hdGNoZXMgdGhlIGJ1cyBsaXN0IGFuZCBpcyBub3QgTlVMTC4KKyAqLworaW50IG9mX3BsYXRmb3JtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QsCisJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwlpbnQgcmMgPSAwOworCisJaWYgKFdBUk5fT04oIW1hdGNoZXMgfHwgbWF0Y2hlcyA9PSBPRl9OT19ERUVQX1BST0JFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJvb3QgPT0gTlVMTCkKKwkJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJZWxzZQorCQlvZl9ub2RlX2dldChyb290KTsKKwlpZiAocm9vdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCJvZl9wbGF0Zm9ybV9idXNfcHJvYmUoKVxuIik7CisJcHJfZGVidWcoIiBzdGFydGluZyBhdDogJXNcbiIsIHJvb3QtPmZ1bGxfbmFtZSk7CisKKwkvKiBEbyBhIHNlbGYgY2hlY2sgb2YgYnVzIHR5cGUsIGlmIHRoZXJlJ3MgYSBtYXRjaCwgY3JlYXRlCisJICogY2hpbGRyZW4KKwkgKi8KKwlpZiAob2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCByb290KSkgeworCQlwcl9kZWJ1ZygiIHJvb3QgbWF0Y2gsIGNyZWF0ZSBhbGwgc3ViIGRldmljZXNcbiIpOworCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHJvb3QsIE5VTEwsIHBhcmVudCk7CisJCWlmIChkZXYgPT0gTlVMTCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBiYWlsOworCQl9CisJCXByX2RlYnVnKCIgY3JlYXRlIGFsbCBzdWIgYnVzc2VzXG4iKTsKKwkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKHJvb3QsIG1hdGNoZXMsICZkZXYtPmRldik7CisJCWdvdG8gYmFpbDsKKwl9CisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShyb290LCBjaGlsZCkgeworCQlpZiAoIW9mX21hdGNoX25vZGUobWF0Y2hlcywgY2hpbGQpKQorCQkJY29udGludWU7CisKKwkJcHJfZGVidWcoIiAgbWF0Y2g6ICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKKwkJZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShjaGlsZCwgTlVMTCwgcGFyZW50KTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJcmMgPSAtRU5PTUVNOworCQllbHNlCisJCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7CisJCWlmIChyYykgeworCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisgYmFpbDoKKwlvZl9ub2RlX3B1dChyb290KTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG9mX3BsYXRmb3JtX2J1c19wcm9iZSk7CisjZW5kaWYgLyogIUNPTkZJR19TUEFSQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMKaW5kZXggNWRmNjBhNi4uZGQ4N2U4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkgKiBlY2hvIDEgPi9kZXYvb3Byb2ZpbGUvZW5hYmxlCiAJICovCiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiAKIGZhaWw6CiAJZGNvb2tpZV91bnJlZ2lzdGVyKGZpbGUtPnByaXZhdGVfZGF0YSk7CkBAIC0yMDUsNCArMjA1LDUgQEAKIAkub3BlbgkJPSBldmVudF9idWZmZXJfb3BlbiwKIAkucmVsZWFzZQk9IGV2ZW50X2J1ZmZlcl9yZWxlYXNlLAogCS5yZWFkCQk9IGV2ZW50X2J1ZmZlcl9yZWFkLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMgYi9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCmluZGV4IGY1MTFlNzAuLjc1YTgwZTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYworKysgYi9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCkBAIC0xMjQxLDEwICsxMjQxLDEwIEBACiB9OwogCiAvKioKLSAqIGNjaW9faW9jX2luaXQgLSBJbml0YWxpemUgdGhlIEkvTyBDb250cm9sbGVyCisgKiBjY2lvX2lvY19pbml0IC0gSW5pdGlhbGl6ZSB0aGUgSS9PIENvbnRyb2xsZXIKICAqIEBpb2M6IFRoZSBJL08gQ29udHJvbGxlci4KICAqCi0gKiBJbml0YWxpemUgdGhlIEkvTyBDb250cm9sbGVyIHdoaWNoIGluY2x1ZGVzIHNldHRpbmcgdXAgdGhlCisgKiBJbml0aWFsaXplIHRoZSBJL08gQ29udHJvbGxlciB3aGljaCBpbmNsdWRlcyBzZXR0aW5nIHVwIHRoZQogICogSS9PIFBhZ2UgRGlyZWN0b3J5LCB0aGUgcmVzb3VyY2UgbWFwLCBhbmQgaW5pdGFsaXppbmcgdGhlCiAgKiBVMi9VdHVybiBjaGlwIGludG8gdmlydHVhbCBtb2RlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9sZWQuYyBiL2RyaXZlcnMvcGFyaXNjL2xlZC5jCmluZGV4IDE4OGJjODQuLmM1YzE0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2xlZC5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2xlZC5jCkBAIC0xNzYsMTYgKzE3NiwxOCBAQAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7CiAJdm9pZCAqZGF0YSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKLQljaGFyICpjdXIsIGxidWZbY291bnQgKyAxXTsKKwljaGFyICpjdXIsIGxidWZbMzJdOwogCWludCBkOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCW1lbXNldChsYnVmLCAwLCBjb3VudCArIDEpOworCWlmIChjb3VudCA+PSBzaXplb2YobGJ1ZikpCisJCWNvdW50ID0gc2l6ZW9mKGxidWYpLTE7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIobGJ1ZiwgYnVmLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOworCWxidWZbY291bnRdID0gMDsKIAogCWN1ciA9IGxidWY7CiAKQEAgLTM1NSwxMiArMzU3LDEzIEBACiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX25ldGRldl9yY3UoJmluaXRfbmV0LCBkZXYpIHsKIAkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCSAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKIAkgICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShkZXYpOwogCSAgICBpZiAoIWluX2RldiB8fCAhaW5fZGV2LT5pZmFfbGlzdCkKIAkJY29udGludWU7CiAJICAgIGlmIChpcHY0X2lzX2xvb3BiYWNrKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbCkpCiAJCWNvbnRpbnVlOwotCSAgICBzdGF0cyA9IGRldl9nZXRfc3RhdHMoZGV2KTsKKwkgICAgc3RhdHMgPSBkZXZfZ2V0X3N0YXRzKGRldiwgJnRlbXApOwogCSAgICByeF90b3RhbCArPSBzdGF0cy0+cnhfcGFja2V0czsKIAkgICAgdHhfdG90YWwgKz0gc3RhdHMtPnR4X3BhY2tldHM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKaW5kZXggZmQ4Y2ZlOS4uMjNlNTBmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnRfcGMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTEwMiw4ICsxMDEsOCBAQAogICAgIGxpbmstPnByaXYgPSBpbmZvOwogICAgIGluZm8tPnBfZGV2ID0gbGluazsKIAotICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisgICAgbGluay0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKIApAQCAtMTQ0LDE2ICsxNDMsMTYgQEAKIHsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKKwkJcF9kZXYtPmlvX2xpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CiAJCWlmIChlcHBfbW9kZSkKIAkJCXBfZGV2LT5jb25mLkNvbmZpZ0luZGV4IHw9IEZPUkNFX0VQUF9NT0RFOwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOwogCQlpZiAoaW8tPm53aW4gPT0gMikgewotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+c3RhcnQgPSBpby0+d2luWzFdLmJhc2U7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IGlvLT53aW5bMV0ubGVuOwogCQl9Ci0JCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSAhPSAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCXJldHVybiAwOwogCX0KQEAgLTE3OCwxMiArMTc3LDE0IEBACiAgICAgaWYgKHJldCkKIAkgICAgZ290byBmYWlsZWQ7CiAKLSAgICBwID0gcGFycG9ydF9wY19wcm9iZV9wb3J0KGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uQmFzZVBvcnQyLAorICAgIHAgPSBwYXJwb3J0X3BjX3Byb2JlX3BvcnQobGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LAorCQkJICAgICAgbGluay0+cmVzb3VyY2VbMV0tPnN0YXJ0LAogCQkJICAgICAgbGluay0+aXJxLCBQQVJQT1JUX0RNQV9OT05FLAogCQkJICAgICAgJmxpbmstPmRldiwgSVJRRl9TSEFSRUQpOwogICAgIGlmIChwID09IE5VTEwpIHsKIAlwcmludGsoS0VSTl9OT1RJQ0UgInBhcnBvcnRfY3M6IHBhcnBvcnRfcGNfcHJvYmVfcG9ydCgpIGF0ICIKLQkgICAgICAgIjB4JTN4LCBpcnEgJXUgZmFpbGVkXG4iLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJICAgICAgICIweCUzeCwgaXJxICV1IGZhaWxlZFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LAogCSAgICAgICBsaW5rLT5pcnEpOwogCWdvdG8gZmFpbGVkOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc3VuYnBwLmMKaW5kZXggOWE1YjRiOC4uMjEwYTY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc3VuYnBwLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc3VuYnBwLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlzdHJ1Y3QgcGFycG9ydCAqcDsKIAotCWlycSA9IG9wLT5pcnFzWzBdOworCWlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCWJhc2UgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCiAJCQkgIHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSksCiAJCQkgICJzdW5icHAiKTsKQEAgLTM5MywxMiArMzkzLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnBvcnRfc3VuYnBwX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZicHBfc2J1c19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYnBwX3NidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBhcnBvcnRfc3VuYnBwX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmYnBwX3NidXNfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYnBwX3NidXNfZHJpdmVyKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiRGVycmljayBKIEJyYXNoZWFyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDBiNTE4NTcuLmRjMWFhMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC01NSw2ICs1NSw5IEBACiAjCiBvYmotJChDT05GSUdfQUNQSSkgICAgKz0gcGNpLWFjcGkubwogCisjIFNNQklPUyBwcm92aWRlZCBmaXJtd2FyZSBpbnN0YW5jZSBhbmQgbGFiZWxzCitvYmotJChDT05GSUdfRE1JKSAgICArPSBwY2ktbGFiZWwubworCiAjIENhcmRidXMgJiBDb21wYWN0UENJIHVzZSBzZXR1cC1idXMKIG9iai0kKENPTkZJR19IT1RQTFVHKSArPSBzZXR1cC1idXMubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9idXMuYyBiL2RyaXZlcnMvcGNpL2J1cy5jCmluZGV4IDYyOGVhMjAuLjdmMGFmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2J1cy5jCisrKyBiL2RyaXZlcnMvcGNpL2J1cy5jCkBAIC01Niw3ICs1Niw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUENJX0JSSURHRV9SRVNPVVJDRV9OVU07IGkrKykKLQkJYnVzLT5yZXNvdXJjZVtpXSA9IDA7CisJCWJ1cy0+cmVzb3VyY2VbaV0gPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1c19yZXMsIHRtcCwgJmJ1cy0+cmVzb3VyY2VzLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZidXNfcmVzLT5saXN0KTsKQEAgLTI0MCw2ICsyNDAsOCBAQAogCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgewogCQkJaWYgKCFwY2lfaXNfZW5hYmxlZChkZXYpKSB7CiAJCQkJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGVuYWJsaW5nIGJyaWRnZSAoJWQpLCBjb250aW51aW5nXG4iLCByZXR2YWwpOwogCQkJCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJCQl9CiAJCQlwY2lfZW5hYmxlX2JyaWRnZXMoZGV2LT5zdWJvcmRpbmF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCmluZGV4IDUzMTdlNGQ3Li4xN2QxMGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwogCiAJLyogQWRkIGV4aXN0aW5nIGRldmljZXMgKi8KLQl3aGlsZSAoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkpCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KQogCQlsZWdhY3lfYWRkX3Nsb3QocGRldik7CiAKIAkvKiBCZSBhbGVydGVkIG9mIGFueSBuZXcgb25lcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYwppbmRleCAyZmNlNzI2Li5hNDAzMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCQkJCSAiQ2Fubm90IHJlbW92ZSBkaXNwbGF5IGRldmljZSAlc1xuIiwKIAkJCQkJIHBjaV9uYW1lKHRlbXApKTsKIAkJCQlwY2lfZGV2X3B1dCh0ZW1wKTsKLQkJCQlyYyA9IEVJTlZBTDsKKwkJCQlyYyA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKaW5kZXggNWY1ZThkMi4uZDM5ODVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogI2RlZmluZSBDT05fUEZBVUxUX0lOVFJfTUFTSwkoMSA8PCAyOCkKICNkZWZpbmUgTVJMX0NIQU5HRV9TRVJSX01BU0sJKDEgPDwgMjkpCiAjZGVmaW5lIENPTl9QRkFVTFRfU0VSUl9NQVNLCSgxIDw8IDMwKQotI2RlZmluZSBTTE9UX1JFR19SU1ZEWl9NQVNLCSgxIDw8IDE1KSB8ICg3IDw8IDIxKQorI2RlZmluZSBTTE9UX1JFR19SU1ZEWl9NQVNLCSgoMSA8PCAxNSkgfCAoNyA8PCAyMSkpCiAKIC8qCiAgKiBTSFBDIENvbW1hbmQgQ29kZSBkZWZpbml0bmlvbnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfcGNpLmMKaW5kZXggOGMzZDMyMS4uYTJjY2ZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfcGNpLmMKQEAgLTYwLDEyICs2MCw2IEBACiAJCWRldiA9IHBjaV9nZXRfc2xvdChwYXJlbnQsIFBDSV9ERVZGTihwX3Nsb3QtPmRldmljZSwgZm4pKTsKIAkJaWYgKCFkZXYpCiAJCQljb250aW51ZTsKLQkJaWYgKChkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZKSB7Ci0JCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGhvdC1hZGQgZGlzcGxheSBkZXZpY2UgJXNcbiIsCi0JCQkJIHBjaV9uYW1lKGRldikpOwotCQkJcGNpX2Rldl9wdXQoZGV2KTsKLQkJCWNvbnRpbnVlOwotCQl9CiAJCWlmICgoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB8fAogCQkJCShkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKSkgewogCQkJLyogRmluZCBhbiB1bnVzZWQgYnVzIG51bWJlciBmb3IgdGhlIG5ldyBicmlkZ2UgKi8KQEAgLTExNCwxNyArMTA4LDExIEBACiAJY3RybF9kYmcoY3RybCwgIiVzOiBkb21haW46YnVzOmRldiA9ICUwNHg6JTAyeDolMDJ4XG4iLAogCQkgX19mdW5jX18sIHBjaV9kb21haW5fbnIocGFyZW50KSwgcF9zbG90LT5idXMsIHBfc2xvdC0+ZGV2aWNlKTsKIAotCWZvciAoaj0wOyBqPDggOyBqKyspIHsKLQkJc3RydWN0IHBjaV9kZXYqIHRlbXAgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LAorCWZvciAoaiA9IDA7IGogPCA4IDsgaisrKSB7CisJCXN0cnVjdCBwY2lfZGV2ICp0ZW1wID0gcGNpX2dldF9zbG90KHBhcmVudCwKIAkJCQkocF9zbG90LT5kZXZpY2UgPDwgMykgfCBqKTsKIAkJaWYgKCF0ZW1wKQogCQkJY29udGludWU7Ci0JCWlmICgodGVtcC0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpIHsKLQkJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgcmVtb3ZlIGRpc3BsYXkgZGV2aWNlICVzXG4iLAotCQkJCSBwY2lfbmFtZSh0ZW1wKSk7Ci0JCQlwY2lfZGV2X3B1dCh0ZW1wKTsKLQkJCWNvbnRpbnVlOwotCQl9CiAJCWlmICh0ZW1wLT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CiAJCQlwY2lfcmVhZF9jb25maWdfYnl0ZSh0ZW1wLCBQQ0lfQlJJREdFX0NPTlRST0wsICZiY3RsKTsKIAkJCWlmIChiY3RsICYgUENJX0JSSURHRV9DVExfVkdBKSB7CkBAIC0xMzIsNyArMTIwLDggQEAKIAkJCQkJICJDYW5ub3QgcmVtb3ZlIGRpc3BsYXkgZGV2aWNlICVzXG4iLAogCQkJCQkgcGNpX25hbWUodGVtcCkpOwogCQkJCXBjaV9kZXZfcHV0KHRlbXApOwotCQkJCWNvbnRpbnVlOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UodGVtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCBjOTE3MWJlLi42YTVhZjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTM2OTgsNiArMzY5OCw4IEBACiAKIAlpZiAoY2FwID09IElPTU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1kpCiAJCXJldHVybiBkbWFyX2RvbWFpbi0+aW9tbXVfc25vb3Bpbmc7CisJaWYgKGNhcCA9PSBJT01NVV9DQVBfSU5UUl9SRU1BUCkKKwkJcmV0dXJuIGludHJfcmVtYXBwaW5nX2VuYWJsZWQ7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCmluZGV4IDEzMTVhYzYuLjE2OTRhMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKKysrIGIvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYwpAQCAtMzExLDggKzMxMSw4IEBACiAJaW5kZXggPSBpcnFfaW9tbXUtPmlydGVfaW5kZXggKyBpcnFfaW9tbXUtPnN1Yl9oYW5kbGU7CiAJaXJ0ZSA9ICZpb21tdS0+aXJfdGFibGUtPmJhc2VbaW5kZXhdOwogCi0Jc2V0XzY0Yml0KCh1bnNpZ25lZCBsb25nICopJmlydGUtPmxvdywgaXJ0ZV9tb2RpZmllZC0+bG93KTsKLQlzZXRfNjRiaXQoKHVuc2lnbmVkIGxvbmcgKikmaXJ0ZS0+aGlnaCwgaXJ0ZV9tb2RpZmllZC0+aGlnaCk7CisJc2V0XzY0Yml0KCZpcnRlLT5sb3csIGlydGVfbW9kaWZpZWQtPmxvdyk7CisJc2V0XzY0Yml0KCZpcnRlLT5oaWdoLCBpcnRlX21vZGlmaWVkLT5oaWdoKTsKIAlfX2lvbW11X2ZsdXNoX2NhY2hlKGlvbW11LCBpcnRlLCBzaXplb2YoKmlydGUpKTsKIAogCXJjID0gcWlfZmx1c2hfaWVjKGlvbW11LCBpbmRleCwgMCk7CkBAIC0zOTMsOCArMzkzLDggQEAKIAllbmQgPSBzdGFydCArICgxIDw8IGlycV9pb21tdS0+aXJ0ZV9tYXNrKTsKIAogCWZvciAoZW50cnkgPSBzdGFydDsgZW50cnkgPCBlbmQ7IGVudHJ5KyspIHsKLQkJc2V0XzY0Yml0KCh1bnNpZ25lZCBsb25nICopJmVudHJ5LT5sb3csIDApOwotCQlzZXRfNjRiaXQoKHVuc2lnbmVkIGxvbmcgKikmZW50cnktPmhpZ2gsIDApOworCQlzZXRfNjRiaXQoJmVudHJ5LT5sb3csIDApOworCQlzZXRfNjRiaXQoJmVudHJ5LT5oaWdoLCAwKTsKIAl9CiAKIAlyZXR1cm4gcWlfZmx1c2hfaWVjKGlvbW11LCBpbmRleCwgaXJxX2lvbW11LT5pcnRlX21hc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmMgYi9kcml2ZXJzL3BjaS9tc2kuYwppbmRleCA3N2I2OGVhLi42OWI3YmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuYworKysgYi9kcml2ZXJzL3BjaS9tc2kuYwpAQCAtMTk2LDYgKzE5Niw5IEBACiB2b2lkIHJlYWRfbXNpX21zZ19kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZykKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5ID0gZ2V0X2lycV9kZXNjX21zaShkZXNjKTsKKworCUJVR19PTihlbnRyeS0+ZGV2LT5jdXJyZW50X3N0YXRlICE9IFBDSV9EMCk7CisKIAlpZiAoZW50cnktPm1zaV9hdHRyaWIuaXNfbXNpeCkgewogCQl2b2lkIF9faW9tZW0gKmJhc2UgPSBlbnRyeS0+bWFza19iYXNlICsKIAkJCWVudHJ5LT5tc2lfYXR0cmliLmVudHJ5X25yICogUENJX01TSVhfRU5UUllfU0laRTsKQEAgLTIyOSwxMCArMjMyLDMyIEBACiAJcmVhZF9tc2lfbXNnX2Rlc2MoZGVzYywgbXNnKTsKIH0KIAordm9pZCBnZXRfY2FjaGVkX21zaV9tc2dfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBtc2lfbXNnICptc2cpCit7CisJc3RydWN0IG1zaV9kZXNjICplbnRyeSA9IGdldF9pcnFfZGVzY19tc2koZGVzYyk7CisKKwkvKiBBc3NlcnQgdGhhdCB0aGUgY2FjaGUgaXMgdmFsaWQsIGFzc3VtaW5nIHRoYXQKKwkgKiB2YWxpZCBtZXNzYWdlcyBhcmUgbm90IGFsbC16ZXJvZXMuICovCisJQlVHX09OKCEoZW50cnktPm1zZy5hZGRyZXNzX2hpIHwgZW50cnktPm1zZy5hZGRyZXNzX2xvIHwKKwkJIGVudHJ5LT5tc2cuZGF0YSkpOworCisJKm1zZyA9IGVudHJ5LT5tc2c7Cit9CisKK3ZvaWQgZ2V0X2NhY2hlZF9tc2lfbXNnKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBtc2lfbXNnICptc2cpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWdldF9jYWNoZWRfbXNpX21zZ19kZXNjKGRlc2MsIG1zZyk7Cit9CisKIHZvaWQgd3JpdGVfbXNpX21zZ19kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZykKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5ID0gZ2V0X2lycV9kZXNjX21zaShkZXNjKTsKLQlpZiAoZW50cnktPm1zaV9hdHRyaWIuaXNfbXNpeCkgeworCisJaWYgKGVudHJ5LT5kZXYtPmN1cnJlbnRfc3RhdGUgIT0gUENJX0QwKSB7CisJCS8qIERvbid0IHRvdWNoIHRoZSBoYXJkd2FyZSBub3cgKi8KKwl9IGVsc2UgaWYgKGVudHJ5LT5tc2lfYXR0cmliLmlzX21zaXgpIHsKIAkJdm9pZCBfX2lvbWVtICpiYXNlOwogCQliYXNlID0gZW50cnktPm1hc2tfYmFzZSArCiAJCQllbnRyeS0+bXNpX2F0dHJpYi5lbnRyeV9uciAqIFBDSV9NU0lYX0VOVFJZX1NJWkU7CkBAIC00MzUsNyArNDYwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKm1zaXhfbWFwX3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBwb3MsCiAJCQkJCQkJdW5zaWduZWQgbnJfZW50cmllcykKIHsKLQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKKwlyZXNvdXJjZV9zaXplX3QgcGh5c19hZGRyOwogCXUzMiB0YWJsZV9vZmZzZXQ7CiAJdTggYmlyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCAyZTdhM2JmLi4xYWI5OGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAlpZiAoZXZlbnQgPT0gQUNQSV9OT1RJRllfREVWSUNFX1dBS0UgJiYgcGNpX2RldikgewogCQlwY2lfY2hlY2tfcG1lX3N0YXR1cyhwY2lfZGV2KTsKIAkJcG1fcnVudGltZV9yZXN1bWUoJnBjaV9kZXYtPmRldik7CisJCXBjaV93YWtldXBfZXZlbnQocGNpX2Rldik7CiAJCWlmIChwY2lfZGV2LT5zdWJvcmRpbmF0ZSkKIAkJCXBjaV9wbWVfd2FrZXVwX2J1cyhwY2lfZGV2LT5zdWJvcmRpbmF0ZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IGY5YTBhZWMuLjhhNmY3OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTI4OSw4ICsyODksMjYgQEAKIHN0YXRpYyBsb25nIGxvY2FsX3BjaV9wcm9iZSh2b2lkICpfZGRpKQogewogCXN0cnVjdCBkcnZfZGV2X2FuZF9pZCAqZGRpID0gX2RkaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGRpLT5kZXYtPmRldjsKKwlpbnQgcmM7CiAKLQlyZXR1cm4gZGRpLT5kcnYtPnByb2JlKGRkaS0+ZGV2LCBkZGktPmlkKTsKKwkvKiBVbmJvdW5kIFBDSSBkZXZpY2VzIGFyZSBhbHdheXMgc2V0IHRvIGRpc2FibGVkIGFuZCBzdXNwZW5kZWQuCisJICogRHVyaW5nIHByb2JlLCB0aGUgZGV2aWNlIGlzIHNldCB0byBlbmFibGVkIGFuZCBhY3RpdmUgYW5kIHRoZQorCSAqIHVzYWdlIGNvdW50IGlzIGluY3JlbWVudGVkLiAgSWYgdGhlIGRyaXZlciBzdXBwb3J0cyBydW50aW1lIFBNLAorCSAqIGl0IHNob3VsZCBjYWxsIHBtX3J1bnRpbWVfcHV0X25vaWRsZSgpIGluIGl0cyBwcm9iZSByb3V0aW5lIGFuZAorCSAqIHBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCkgaW4gaXRzIHJlbW92ZSByb3V0aW5lLgorCSAqLworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKworCXJjID0gZGRpLT5kcnYtPnByb2JlKGRkaS0+ZGV2LCBkZGktPmlkKTsKKwlpZiAocmMpIHsKKwkJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwl9CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHBjaV9jYWxsX3Byb2JlKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpkZXYsCkBAIC0zNjksMTEgKzM4NywxOSBAQAogCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwogCiAJaWYgKGRydikgewotCQlpZiAoZHJ2LT5yZW1vdmUpCisJCWlmIChkcnYtPnJlbW92ZSkgeworCQkJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwogCQkJZHJ2LT5yZW1vdmUocGNpX2Rldik7CisJCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwkJfQogCQlwY2lfZGV2LT5kcml2ZXIgPSBOVUxMOwogCX0KIAorCS8qIFVuZG8gdGhlIHJ1bnRpbWUgUE0gc2V0dGluZ3MgaW4gbG9jYWxfcGNpX3Byb2JlKCkgKi8KKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwogCS8qCiAJICogSWYgdGhlIGRldmljZSBpcyBzdGlsbCBvbiwgc2V0IHRoZSBwb3dlciBzdGF0ZSBhcyAidW5rbm93biIsCiAJICogc2luY2UgaXQgbWlnaHQgY2hhbmdlIGJ5IHRoZSBuZXh0IHRpbWUgd2UgbG9hZCB0aGUgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWxhYmVsLmMgYi9kcml2ZXJzL3BjaS9wY2ktbGFiZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMwYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcGNpLWxhYmVsLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBQdXJwb3NlOiBFeHBvcnQgdGhlIGZpcm13YXJlIGluc3RhbmNlIGFuZCBsYWJlbCBhc3NvY2lhdGVkIHdpdGgKKyAqIGEgcGNpIGRldmljZSB0byBzeXNmcworICogQ29weXJpZ2h0IChDKSAyMDEwIERlbGwgSW5jLgorICogYnkgTmFyZW5kcmEgSyA8TmFyZW5kcmFfS0BkZWxsLmNvbT4sCisgKiBKb3JkYW4gSGFyZ3JhdmUgPEpvcmRhbl9IYXJncmF2ZUBkZWxsLmNvbT4KKyAqCisgKiBTTUJJT1MgZGVmaW5lcyB0eXBlIDQxIGZvciBvbmJvYXJkIHBjaSBkZXZpY2VzLiBUaGlzIGNvZGUgcmV0cmlldmVzCisgKiB0aGUgaW5zdGFuY2UgbnVtYmVyIGFuZCBzdHJpbmcgZnJvbSB0aGUgdHlwZSA0MSByZWNvcmQgYW5kIGV4cG9ydHMKKyAqIGl0IHRvIHN5c2ZzLgorICoKKyAqIFBsZWFzZSBzZWUgaHR0cDovL2xpbnV4LmRlbGwuY29tL3dpa2kvaW5kZXgucGhwL09zcy9saWJuZXRkZXZuYW1lIGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAicGNpLmgiCisKK2VudW0gc21iaW9zX2F0dHJfZW51bSB7CisJU01CSU9TX0FUVFJfTk9ORSA9IDAsCisJU01CSU9TX0FUVFJfTEFCRUxfU0hPVywKKwlTTUJJT1NfQVRUUl9JTlNUQU5DRV9TSE9XLAorfTsKKworc3RhdGljIG1vZGVfdAorZmluZF9zbWJpb3NfaW5zdGFuY2Vfc3RyaW5nKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjaGFyICpidWYsCisJCQkgICAgZW51bSBzbWJpb3NfYXR0cl9lbnVtIGF0dHJpYnV0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgZG1pX2RldmljZSAqZG1pOworCXN0cnVjdCBkbWlfZGV2X29uYm9hcmQgKmRvbmJvYXJkOworCWludCBidXM7CisJaW50IGRldmZuOworCisJYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJZGV2Zm4gPSBwZGV2LT5kZXZmbjsKKworCWRtaSA9IE5VTEw7CisJd2hpbGUgKChkbWkgPSBkbWlfZmluZF9kZXZpY2UoRE1JX0RFVl9UWVBFX0RFVl9PTkJPQVJELAorCQkJCSAgICAgIE5VTEwsIGRtaSkpICE9IE5VTEwpIHsKKwkJZG9uYm9hcmQgPSBkbWktPmRldmljZV9kYXRhOworCQlpZiAoZG9uYm9hcmQgJiYgZG9uYm9hcmQtPmJ1cyA9PSBidXMgJiYKKwkJCQkJZG9uYm9hcmQtPmRldmZuID09IGRldmZuKSB7CisJCQlpZiAoYnVmKSB7CisJCQkJaWYgKGF0dHJpYnV0ZSA9PSBTTUJJT1NfQVRUUl9JTlNUQU5DRV9TSE9XKQorCQkJCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAorCQkJCQkJCSAiJWRcbiIsCisJCQkJCQkJIGRvbmJvYXJkLT5pbnN0YW5jZSk7CisJCQkJZWxzZSBpZiAoYXR0cmlidXRlID09IFNNQklPU19BVFRSX0xBQkVMX1NIT1cpCisJCQkJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCQkJCQkJICIlc1xuIiwKKwkJCQkJCQkgZG1pLT5uYW1lKTsKKwkJCX0KKwkJCXJldHVybiBzdHJsZW4oZG1pLT5uYW1lKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG1vZGVfdAorc21iaW9zX2luc3RhbmNlX3N0cmluZ19leGlzdChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlyZXR1cm4gZmluZF9zbWJpb3NfaW5zdGFuY2Vfc3RyaW5nKHBkZXYsIE5VTEwsIFNNQklPU19BVFRSX05PTkUpID8KKwkJCQkJICAgU19JUlVHTyA6IDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzbWJpb3NsYWJlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCisJcmV0dXJuIGZpbmRfc21iaW9zX2luc3RhbmNlX3N0cmluZyhwZGV2LCBidWYsCisJCQkJCSAgIFNNQklPU19BVFRSX0xBQkVMX1NIT1cpOworfQorCitzdGF0aWMgc3NpemVfdAorc21iaW9zaW5zdGFuY2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlyZXR1cm4gZmluZF9zbWJpb3NfaW5zdGFuY2Vfc3RyaW5nKHBkZXYsIGJ1ZiwKKwkJCQkJICAgU01CSU9TX0FUVFJfSU5TVEFOQ0VfU0hPVyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzbWJpb3NfYXR0cl9sYWJlbCA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJsYWJlbCIsIC5tb2RlID0gMDQ0NH0sCisJLnNob3cgPSBzbWJpb3NsYWJlbF9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNtYmlvc19hdHRyX2luc3RhbmNlID0geworCS5hdHRyID0gey5uYW1lID0gImluZGV4IiwgLm1vZGUgPSAwNDQ0fSwKKwkuc2hvdyA9IHNtYmlvc2luc3RhbmNlX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc21iaW9zX2F0dHJpYnV0ZXNbXSA9IHsKKwkmc21iaW9zX2F0dHJfbGFiZWwuYXR0ciwKKwkmc21iaW9zX2F0dHJfaW5zdGFuY2UuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc21iaW9zX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gc21iaW9zX2F0dHJpYnV0ZXMsCisJLmlzX3Zpc2libGUgPSBzbWJpb3NfaW5zdGFuY2Vfc3RyaW5nX2V4aXN0LAorfTsKKworc3RhdGljIGludAorcGNpX2NyZWF0ZV9zbWJpb3NuYW1lX2ZpbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKCFzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmc21iaW9zX2F0dHJfZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9yZW1vdmVfc21iaW9zbmFtZV9maWxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZzbWJpb3NfYXR0cl9ncm91cCk7Cit9CisKK3ZvaWQgcGNpX2NyZWF0ZV9maXJtd2FyZV9sYWJlbF9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAoIXBjaV9jcmVhdGVfc21iaW9zbmFtZV9maWxlKHBkZXYpKQorCQk7Cit9CisKK3ZvaWQgcGNpX3JlbW92ZV9maXJtd2FyZV9sYWJlbF9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlwY2lfcmVtb3ZlX3NtYmlvc25hbWVfZmlsZShwZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggYzk5NTdmNi4uYjVhN2Q5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTczNCw3ICs3MzQsNyBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwKIAkJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSAoc3RydWN0IHJlc291cmNlICopYXR0ci0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGF0dHItPnByaXZhdGU7CiAJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3R5cGU7CiAJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBlbmQ7CiAJaW50IGk7CkBAIC03NzgsNiArNzc4LDcwIEBACiAJcmV0dXJuIHBjaV9tbWFwX3Jlc291cmNlKGtvYmosIGF0dHIsIHZtYSwgMSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitwY2lfcmVzb3VyY2VfaW8oc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGJvb2wgd3JpdGUpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGNvbnRhaW5lcl9vZihrb2JqLAorCQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGF0dHItPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gb2ZmOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykKKwkJaWYgKHJlcyA9PSAmcGRldi0+cmVzb3VyY2VbaV0pCisJCQlicmVhazsKKwlpZiAoaSA+PSBQQ0lfUk9NX1JFU09VUkNFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBvcnQgKz0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCisJaWYgKHBvcnQgPiBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIGkpKQorCQlyZXR1cm4gMDsKKworCWlmIChwb3J0ICsgY291bnQgLSAxID4gcGNpX3Jlc291cmNlX2VuZChwZGV2LCBpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNvdW50KSB7CisJY2FzZSAxOgorCQlpZiAod3JpdGUpCisJCQlvdXRiKCoodTggKilidWYsIHBvcnQpOworCQllbHNlCisJCQkqKHU4ICopYnVmID0gaW5iKHBvcnQpOworCQlyZXR1cm4gMTsKKwljYXNlIDI6CisJCWlmICh3cml0ZSkKKwkJCW91dHcoKih1MTYgKilidWYsIHBvcnQpOworCQllbHNlCisJCQkqKHUxNiAqKWJ1ZiA9IGludyhwb3J0KTsKKwkJcmV0dXJuIDI7CisJY2FzZSA0OgorCQlpZiAod3JpdGUpCisJCQlvdXRsKCoodTMyICopYnVmLCBwb3J0KTsKKwkJZWxzZQorCQkJKih1MzIgKilidWYgPSBpbmwocG9ydCk7CisJCXJldHVybiA0OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QKK3BjaV9yZWFkX3Jlc291cmNlX2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQkgICAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gcGNpX3Jlc291cmNlX2lvKGZpbHAsIGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgZmFsc2UpOworfQorCitzdGF0aWMgc3NpemVfdAorcGNpX3dyaXRlX3Jlc291cmNlX2lvKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJICAgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBwY2lfcmVzb3VyY2VfaW8oZmlscCwga29iaiwgYXR0ciwgYnVmLCBvZmYsIGNvdW50LCB0cnVlKTsKK30KKwogLyoqCiAgKiBwY2lfcmVtb3ZlX3Jlc291cmNlX2ZpbGVzIC0gY2xlYW51cCByZXNvdXJjZSBmaWxlcwogICogQHBkZXY6IGRldiB0byBjbGVhbnVwCkBAIC04MjgsNiArODkyLDEwIEBACiAJCQlzcHJpbnRmKHJlc19hdHRyX25hbWUsICJyZXNvdXJjZSVkIiwgbnVtKTsKIAkJCXJlc19hdHRyLT5tbWFwID0gcGNpX21tYXBfcmVzb3VyY2VfdWM7CiAJCX0KKwkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBudW0pICYgSU9SRVNPVVJDRV9JTykgeworCQkJcmVzX2F0dHItPnJlYWQgPSBwY2lfcmVhZF9yZXNvdXJjZV9pbzsKKwkJCXJlc19hdHRyLT53cml0ZSA9IHBjaV93cml0ZV9yZXNvdXJjZV9pbzsKKwkJfQogCQlyZXNfYXR0ci0+YXR0ci5uYW1lID0gcmVzX2F0dHJfbmFtZTsKIAkJcmVzX2F0dHItPmF0dHIubW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOwogCQlyZXNfYXR0ci0+c2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgbnVtKTsKQEAgLTEwOTcsNiArMTE2NSw4IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJfdmdhX2ZpbGU7CiAKKwlwY2lfY3JlYXRlX2Zpcm13YXJlX2xhYmVsX2ZpbGVzKHBkZXYpOworCiAJcmV0dXJuIDA7CiAKIGVycl92Z2FfZmlsZToKQEAgLTExNjQsNiArMTIzNCw5IEBACiAJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosIHBkZXYtPnJvbV9hdHRyKTsKIAkJa2ZyZWUocGRldi0+cm9tX2F0dHIpOwogCX0KKworCXBjaV9yZW1vdmVfZmlybXdhcmVfbGFiZWxfZmlsZXMocGRldik7CisKIH0KIAogc3RhdGljIGludCBfX2luaXQgcGNpX3N5c2ZzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggNzQwZmI0ZS4uN2ZhM2NiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTEyNzUsNiArMTI3NSwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBUaW1lIHRvIHdhaXQgYmVmb3JlIHRoZSBzeXN0ZW0gY2FuIGJlIHB1dCBpbnRvIGEgc2xlZXAgc3RhdGUgYWZ0ZXIgcmVwb3J0aW5nCisgKiBhIHdha2V1cCBldmVudCBzaWduYWxlZCBieSBhIFBDSSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgUENJX1dBS0VVUF9DT09MRE9XTgkxMDAKKworLyoqCisgKiBwY2lfd2FrZXVwX2V2ZW50IC0gUmVwb3J0IGEgd2FrZXVwIGV2ZW50IHJlbGF0ZWQgdG8gYSBnaXZlbiBQQ0kgZGV2aWNlLgorICogQGRldjogRGV2aWNlIHRvIHJlcG9ydCB0aGUgd2FrZXVwIGV2ZW50IGZvci4KKyAqLwordm9pZCBwY2lfd2FrZXVwX2V2ZW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpCisJCXBtX3dha2V1cF9ldmVudCgmZGV2LT5kZXYsIFBDSV9XQUtFVVBfQ09PTERPV04pOworfQorCiAvKioKICAqIHBjaV9wbWVfd2FrZXVwIC0gV2FrZSB1cCBhIFBDSSBkZXZpY2UgaWYgaXRzIFBNRSBTdGF0dXMgYml0IGlzIHNldC4KICAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCkBAIC0xMjg1LDggKzEzMDEsMTAgQEAKICAqLwogc3RhdGljIGludCBwY2lfcG1lX3dha2V1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICppZ24pCiB7Ci0JaWYgKHBjaV9jaGVja19wbWVfc3RhdHVzKGRldikpCisJaWYgKHBjaV9jaGVja19wbWVfc3RhdHVzKGRldikpIHsKIAkJcG1fcmVxdWVzdF9yZXN1bWUoJmRldi0+ZGV2KTsKKwkJcGNpX3dha2V1cF9ldmVudChkZXYpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI5NCwyMSArMjMxMiwxNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX21zaV9vZmYpOwogCi0jaWZuZGVmIEhBVkVfQVJDSF9QQ0lfU0VUX0RNQV9NQVhfU0VHTUVOVF9TSVpFCiBpbnQgcGNpX3NldF9kbWFfbWF4X3NlZ19zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBzaXplKQogewogCXJldHVybiBkbWFfc2V0X21heF9zZWdfc2l6ZSgmZGV2LT5kZXYsIHNpemUpOwogfQogRVhQT1JUX1NZTUJPTChwY2lfc2V0X2RtYV9tYXhfc2VnX3NpemUpOwotI2VuZGlmCiAKLSNpZm5kZWYgSEFWRV9BUkNIX1BDSV9TRVRfRE1BX1NFR01FTlRfQk9VTkRBUlkKIGludCBwY2lfc2V0X2RtYV9zZWdfYm91bmRhcnkoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQogewogCXJldHVybiBkbWFfc2V0X3NlZ19ib3VuZGFyeSgmZGV2LT5kZXYsIG1hc2spOwogfQogRVhQT1JUX1NZTUJPTChwY2lfc2V0X2RtYV9zZWdfYm91bmRhcnkpOwotI2VuZGlmCiAKIHN0YXRpYyBpbnQgcGNpZV9mbHIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHByb2JlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCBmODA3N2IzLi42NzljMzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMTEsNiArMTEsMTUgQEAKIGV4dGVybiBpbnQgcGNpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudik7CiBleHRlcm4gaW50IHBjaV9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKyNpZm5kZWYgQ09ORklHX0RNSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9jcmVhdGVfZmlybXdhcmVfbGFiZWxfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9yZW1vdmVfZmlybXdhcmVfbGFiZWxfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7IHJldHVybjsgfQorI2Vsc2UKK2V4dGVybiB2b2lkIHBjaV9jcmVhdGVfZmlybXdhcmVfbGFiZWxfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9maXJtd2FyZV9sYWJlbF9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisjZW5kaWYKIGV4dGVybiB2b2lkIHBjaV9jbGVhbnVwX3JvbShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNpZmRlZiBIQVZFX1BDSV9NTUFQCiBleHRlcm4gaW50IHBjaV9tbWFwX2ZpdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNubywKQEAgLTU2LDYgKzY1LDcgQEAKIGV4dGVybiB2b2lkIHBjaV9kaXNhYmxlX2VuYWJsZWRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIGJvb2wgcGNpX2NoZWNrX3BtZV9zdGF0dXMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gaW50IHBjaV9maW5pc2hfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgcGNpX3dha2V1cF9ldmVudChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgX19wY2lfcG1lX3dha2V1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICppZ24pOwogZXh0ZXJuIHZvaWQgcGNpX3BtZV93YWtldXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogZXh0ZXJuIHZvaWQgcGNpX3BtX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL0tjb25maWcgYi9kcml2ZXJzL3BjaS9wY2llL0tjb25maWcKaW5kZXggYjhiNDk0Yi4uZGRhNzA5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZwpAQCAtMzEsMTQgKzMxLDIyIEBACiAjIFBDSSBFeHByZXNzIEFTUE0KICMKIGNvbmZpZyBQQ0lFQVNQTQotCWJvb2wgIlBDSSBFeHByZXNzIEFTUE0gc3VwcG9ydChFeHBlcmltZW50YWwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTCAmJiBQQ0lFUE9SVEJVUwotCWRlZmF1bHQgbgorCWJvb2wgIlBDSSBFeHByZXNzIEFTUE0gY29udHJvbCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFBDSSAmJiBQQ0lFUE9SVEJVUworCWRlZmF1bHQgeQogCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBQQ0kgRXhwcmVzcyBBU1BNIChBY3RpdmUgU3RhdGUgUG93ZXIgTWFuYWdlbWVudCkgYW5kCi0JICBDbG9jayBQb3dlciBNYW5hZ2VtZW50LiBBU1BNIHN1cHBvcnRzIHN0YXRlIEwwL0wwcy9MMS4KKwkgIFRoaXMgZW5hYmxlcyBPUyBjb250cm9sIG92ZXIgUENJIEV4cHJlc3MgQVNQTSAoQWN0aXZlIFN0YXRlCisJICBQb3dlciBNYW5hZ2VtZW50KSBhbmQgQ2xvY2sgUG93ZXIgTWFuYWdlbWVudC4gQVNQTSBzdXBwb3J0cworCSAgc3RhdGUgTDAvTDBzL0wxLgogCi0JICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KKwkgIEFTUE0gaXMgaW5pdGlhbGx5IHNldCB1cCB0aGUgdGhlIGZpcm13YXJlLiBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsCisJICBMaW51eCBjYW4gbW9kaWZ5IHRoaXMgc3RhdGUgaW4gb3JkZXIgdG8gZGlzYWJsZSBBU1BNIG9uIGtub3duLWJhZAorCSAgaGFyZHdhcmUgb3IgY29uZmlndXJhdGlvbnMgYW5kIGVuYWJsZSBpdCB3aGVuIGtub3duLXNhZmUuCisKKwkgIEFTUE0gY2FuIGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgYXQgcnVudGltZSB2aWEKKwkgIC9zeXMvbW9kdWxlL3BjaWVfYXNwbS9wYXJhbWV0ZXJzL3BvbGljeQorCisJICBXaGVuIGluIGRvdWJ0LCBzYXkgWS4KIGNvbmZpZyBQQ0lFQVNQTV9ERUJVRwogCWJvb2wgIkRlYnVnIFBDSSBFeHByZXNzIEFTUE0iCiAJZGVwZW5kcyBvbiBQQ0lFQVNQTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKaW5kZXggOGFmNGY2MS4uZmMwYjVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC03MjcsMjAgKzcyNywyMSBAQAogc3RhdGljIGludCBnZXRfZV9zb3VyY2Uoc3RydWN0IGFlcl9ycGMgKnJwYywgc3RydWN0IGFlcl9lcnJfc291cmNlICplX3NyYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwogCiAJLyogTG9jayBhY2Nlc3MgdG8gUm9vdCBlcnJvciBwcm9kdWNlci9jb25zdW1lciBpbmRleCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZycGMtPmVfbG9jaywgZmxhZ3MpOwotCWlmIChycGMtPnByb2RfaWR4ICE9IHJwYy0+Y29uc19pZHgpIHsKLQkJKmVfc3JjID0gcnBjLT5lX3NvdXJjZXNbcnBjLT5jb25zX2lkeF07Ci0JCXJwYy0+Y29uc19pZHgrKzsKLQkJaWYgKHJwYy0+Y29uc19pZHggPT0gQUVSX0VSUk9SX1NPVVJDRVNfTUFYKQotCQkJcnBjLT5jb25zX2lkeCA9IDA7Ci0JCXJldCA9IDE7CisJaWYgKHJwYy0+cHJvZF9pZHggPT0gcnBjLT5jb25zX2lkeCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycGMtPmVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKIAl9CisKKwkqZV9zcmMgPSBycGMtPmVfc291cmNlc1tycGMtPmNvbnNfaWR4XTsKKwlycGMtPmNvbnNfaWR4Kys7CisJaWYgKHJwYy0+Y29uc19pZHggPT0gQUVSX0VSUk9SX1NPVVJDRVNfTUFYKQorCQlycGMtPmNvbnNfaWR4ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycGMtPmVfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IGJlNTNkOTguLjcxMjIyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC01ODgsMTEgKzU4OCwyMyBAQAogCSAqIHVwZGF0ZSB0aHJvdWdoIHBjaWVfYXNwbV9jYXBfaW5pdCgpLgogCSAqLwogCXBjaWVfYXNwbV9jYXBfaW5pdChsaW5rLCBibGFja2xpc3QpOwotCXBjaWVfY29uZmlnX2FzcG1fcGF0aChsaW5rKTsKIAogCS8qIFNldHVwIGluaXRpYWwgQ2xvY2sgUE0gc3RhdGUgKi8KIAlwY2llX2Nsa3BtX2NhcF9pbml0KGxpbmssIGJsYWNrbGlzdCk7Ci0JcGNpZV9zZXRfY2xrcG0obGluaywgcG9saWN5X3RvX2Nsa3BtX3N0YXRlKGxpbmspKTsKKworCS8qCisJICogQXQgdGhpcyBzdGFnZSBkcml2ZXJzIGhhdmVuJ3QgaGFkIGFuIG9wcG9ydHVuaXR5IHRvIGNoYW5nZSB0aGUKKwkgKiBsaW5rIHBvbGljeSBzZXR0aW5nLiBFbmFibGluZyBBU1BNIG9uIGJyb2tlbiBoYXJkd2FyZSBjYW4gY3JpcHBsZQorCSAqIGl0IGV2ZW4gYmVmb3JlIHRoZSBkcml2ZXIgaGFzIGhhZCBhIGNoYW5jZSB0byBkaXNhYmxlIEFTUE0sIHNvCisJICogZGVmYXVsdCB0byBhIHNhZmUgbGV2ZWwgcmlnaHQgbm93LiBJZiB3ZSdyZSBlbmFibGluZyBBU1BNIGJleW9uZAorCSAqIHRoZSBCSU9TJ3MgZXhwZWN0YXRpb24sIHdlJ2xsIGRvIHNvIG9uY2UgcGNpX2VuYWJsZV9kZXZpY2UoKSBpcworCSAqIGNhbGxlZC4KKwkgKi8KKwlpZiAoYXNwbV9wb2xpY3kgIT0gUE9MSUNZX1BPV0VSU0FWRSkgeworCQlwY2llX2NvbmZpZ19hc3BtX3BhdGgobGluayk7CisJCXBjaWVfc2V0X2Nsa3BtKGxpbmssIHBvbGljeV90b19jbGtwbV9zdGF0ZShsaW5rKSk7CisJfQorCiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZhc3BtX2xvY2spOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wbWUvcGNpZV9wbWUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG1lL3BjaWVfcG1lLmMKaW5kZXggZDY3MmEwYS4uYmJkZWExOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wbWUvcGNpZV9wbWUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BtZS9wY2llX3BtZS5jCkBAIC0xNTQsNiArMTU0LDcgQEAKIAkJLyogU2tpcCBQQ0llIGRldmljZXMgaW4gY2FzZSB3ZSBzdGFydGVkIGZyb20gYSByb290IHBvcnQuICovCiAJCWlmICghcGNpX2lzX3BjaWUoZGV2KSAmJiBwY2lfY2hlY2tfcG1lX3N0YXR1cyhkZXYpKSB7CiAJCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmZGV2LT5kZXYpOworCQkJcGNpX3dha2V1cF9ldmVudChkZXYpOwogCQkJcmV0ID0gdHJ1ZTsKIAkJfQogCkBAIC0yNTQsOCArMjU1LDEwIEBACiAJaWYgKGZvdW5kKSB7CiAJCS8qIFRoZSBkZXZpY2UgaXMgdGhlcmUsIGJ1dCB3ZSBoYXZlIHRvIGNoZWNrIGl0cyBQTUUgc3RhdHVzLiAqLwogCQlmb3VuZCA9IHBjaV9jaGVja19wbWVfc3RhdHVzKGRldik7Ci0JCWlmIChmb3VuZCkKKwkJaWYgKGZvdW5kKSB7CiAJCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmZGV2LT5kZXYpOworCQkJcGNpX3dha2V1cF9ldmVudChkZXYpOworCQl9CiAJCXBjaV9kZXZfcHV0KGRldik7CiAJfSBlbHNlIGlmIChkZXZmbikgewogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggZjRhZGJhMi4uMTI2MjVkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0xNjMsOSArMTYzLDE2IEBACiAJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IHBvcykKIHsKIAl1MzIgbCwgc3osIG1hc2s7CisJdTE2IG9yaWdfY21kOwogCiAJbWFzayA9IHR5cGUgPyBQQ0lfUk9NX0FERFJFU1NfTUFTSyA6IH4wOwogCisJaWYgKCFkZXYtPm1taW9fYWx3YXlzX29uKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZvcmlnX2NtZCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELAorCQkJb3JpZ19jbWQgJiB+KFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPKSk7CisJfQorCiAJcmVzLT5uYW1lID0gcGNpX25hbWUoZGV2KTsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcywgJmwpOwpAQCAtMTczLDYgKzE4MCw5IEBACiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAmc3opOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MsIGwpOwogCisJaWYgKCFkZXYtPm1taW9fYWx3YXlzX29uKQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgb3JpZ19jbWQpOworCiAJLyoKIAkgKiBBbGwgYml0cyBzZXQgaW4gc3ogbWVhbnMgdGhlIGRldmljZSBpc24ndCB3b3JraW5nIHByb3Blcmx5LgogCSAqIElmIHRoZSBCQVIgaXNuJ3QgaW1wbGVtZW50ZWQsIGFsbCBiaXRzIG11c3QgYmUgMC4gIElmIGl0J3MgYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYy5jIGIvZHJpdmVycy9wY2kvcHJvYy5jCmluZGV4IDQ0OWU4OTAuLjAxZjAzMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2MuYworKysgYi9kcml2ZXJzL3BjaS9wcm9jLmMKQEAgLTQzMSw4ICs0MzEsNiBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKIAogCWlmICgoZSA9IGRldi0+cHJvY2VudCkpIHsKLQkJaWYgKGF0b21pY19yZWFkKCZlLT5jb3VudCkgPiAxKQotCQkJcmV0dXJuIC1FQlVTWTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoZS0+bmFtZSwgZGV2LT5idXMtPnByb2NkaXIpOwogCQlkZXYtPnByb2NlbnQgPSBOVUxMOwogCX0KQEAgLTQ4NSw5ICs0ODMsOSBAQAogCXByb2NfY3JlYXRlKCJkZXZpY2VzIiwgMCwgcHJvY19idXNfcGNpX2RpciwKIAkJICAgICZwcm9jX2J1c19wY2lfZGV2X29wZXJhdGlvbnMpOwogCXByb2NfaW5pdGlhbGl6ZWQgPSAxOwotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQogCQlwY2lfcHJvY19hdHRhY2hfZGV2aWNlKGRldik7Ci0JfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggNDc3MzQ1ZC4uODllZDE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTkxLDYgKzkxLDE5IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcXVpcmtfcmVzb3VyY2VfYWxpZ25tZW50KTsKIAorLyoKKyAqIERlY29kaW5nIHNob3VsZCBiZSBkaXNhYmxlZCBmb3IgYSBQQ0kgZGV2aWNlIGR1cmluZyBCQVIgc2l6aW5nIHRvIGF2b2lkCisgKiBjb25mbGljdC4gQnV0IGRvaW5nIHNvIG1heSBjYXVzZSBwcm9ibGVtcyBvbiBob3N0IGJyaWRnZSBhbmQgcGVyaGFwcyBvdGhlcgorICoga2V5IHN5c3RlbSBkZXZpY2VzLiBGb3IgZGV2aWNlcyB0aGF0IG5lZWQgdG8gaGF2ZSBtbWlvIGRlY29kaW5nIGFsd2F5cy1vbiwKKyAqIHdlIG5lZWQgdG8gc2V0IHRoZSBkZXYtPm1taW9fYWx3YXlzX29uIGJpdC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX21taW9fYWx3YXlzX29uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKChkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfSE9TVCkKKwkJZGV2LT5tbWlvX2Fsd2F5c19vbiA9IDE7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBxdWlya19tbWlvX2Fsd2F5c19vbik7CisKIC8qIFRoZSBNZWxsYW5veCBUYXZvciBkZXZpY2UgZ2l2ZXMgZmFsc2UgcG9zaXRpdmUgcGFyaXR5IGVycm9ycwogICogTWFyayB0aGlzIGRldmljZSB3aXRoIGEgYnJva2VuX3Bhcml0eV9zdGF0dXMsIHRvIGFsbG93CiAgKiBQQ0kgc2Nhbm5pbmcgY29kZSB0byAic2tpcCIgdGhpcyBub3cgYmxhY2tsaXN0ZWQgZGV2aWNlLgpAQCAtMTQ1OSw2ICsxNDcyLDcgQEAKIAlzd2l0Y2ggKHBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MDogLyogU0FUQSBzaW5nbGUgcG9ydCAqLwogCWNhc2UgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MjogLyogU0FUQSBkdWFsIHBvcnRzICovCisJY2FzZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY0OiAvKiBTQVRBIGR1YWwgcG9ydHMgKi8KIAkJLyogVGhlIGNvbnRyb2xsZXIgc2hvdWxkIGJlIGluIHNpbmdsZSBmdW5jdGlvbiBhaGNpIG1vZGUgKi8KIAkJY29uZjEgfD0gMHgwMDAyQTEwMDsgLyogU2V0IDgsIDEzLCAxNSwgMTcgKi8KIAkJYnJlYWs7CkBAIC0xNDcwLDYgKzE0ODQsNyBAQAogCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYzOgorCWNhc2UgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2OToKIAkJLyogRW5hYmxlIGR1YWwgZnVuY3Rpb24gbW9kZSwgQUhDSSBvbiBmbiAwLCBJREUgZm4xICovCiAJCS8qIFNldCB0aGUgY2xhc3MgY29kZXMgY29ycmVjdGx5IGFuZCB0aGVuIGRpcmVjdCBJREUgMCAqLwogCQljb25mMSB8PSAweDAwQzJBMUIzOyAvKiBTZXQgMCwgMSwgNCwgNSwgNywgOCwgMTMsIDE1LCAxNywgMjIsIDIzICovCkBAIC0xNDk2LDE2ICsxNTExLDIwIEBACiBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0pNSUNST04sIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjEsIHF1aXJrX2ptaWNyb25fYXRhKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MiwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9KTUlDUk9OLCBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYzLCBxdWlya19qbWljcm9uX2F0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0pNSUNST04sIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjQsIHF1aXJrX2ptaWNyb25fYXRhKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2NSwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9KTUlDUk9OLCBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY2LCBxdWlya19qbWljcm9uX2F0YSk7CiBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0pNSUNST04sIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjgsIHF1aXJrX2ptaWNyb25fYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2OSwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MCwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MSwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MiwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2MywgcXVpcmtfam1pY3Jvbl9hdGEpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2NCwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2NSwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2NiwgcXVpcmtfam1pY3Jvbl9hdGEpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2OCwgcXVpcmtfam1pY3Jvbl9hdGEpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM2OSwgcXVpcmtfam1pY3Jvbl9hdGEpOwogCiAjZW5kaWYKIApAQCAtMjExNSw2ICsyMTM0LDcgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV9WVDMzMzYsIHF1aXJrX2Rpc2FibGVfYWxsX21zaSk7CiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfVlQzMzUxLCBxdWlya19kaXNhYmxlX2FsbF9tc2kpOwogREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBX1ZUMzM2NCwgcXVpcmtfZGlzYWJsZV9hbGxfbXNpKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MzgwXzAsIHF1aXJrX2Rpc2FibGVfYWxsX21zaSk7CiAKIC8qIERpc2FibGUgTVNJIG9uIGNoaXBzZXRzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBzdXBwb3J0IGl0ICovCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfZGlzYWJsZV9tc2koc3RydWN0IHBjaV9kZXYgKmRldikKQEAgLTIxMjYsMTIgKzIxNDYsMjkgQEAKIAl9CiB9CiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfODEzMV9CUklER0UsIHF1aXJrX2Rpc2FibGVfbXNpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQU1ELCAweDk2MDIsIHF1aXJrX2Rpc2FibGVfbXNpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQVNVU1RFSywgMHg5NjAyLCBxdWlya19kaXNhYmxlX21zaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FJLCAweDk2MDIsIHF1aXJrX2Rpc2FibGVfbXNpKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLCAweGEyMzgsIHF1aXJrX2Rpc2FibGVfbXNpKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQVRJLCAweDVhM2YsIHF1aXJrX2Rpc2FibGVfbXNpKTsKIAorLyoKKyAqIFRoZSBBUEMgYnJpZGdlIGRldmljZSBpbiBBTUQgNzgwIGZhbWlseSBub3J0aGJyaWRnZXMgaGFzIHNvbWUgcmFuZG9tCisgKiBPRU0gc3Vic3lzdGVtIElEIGluIGl0cyB2ZW5kb3IgSUQgcmVnaXN0ZXIgKGVycmF0dW0gMTgpLCBzbyBpbnN0ZWFkCisgKiB3ZSB1c2UgdGhlIHBvc3NpYmxlIHZlbmRvci9kZXZpY2UgSURzIG9mIHRoZSBob3N0IGJyaWRnZSBmb3IgdGhlCisgKiBkZWNsYXJlZCBxdWlyaywgYW5kIHNlYXJjaCBmb3IgdGhlIEFQQyBicmlkZ2UgYnkgc2xvdCBudW1iZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19hbWRfNzgwX2FwY19tc2koc3RydWN0IHBjaV9kZXYgKmhvc3RfYnJpZGdlKQoreworCXN0cnVjdCBwY2lfZGV2ICphcGNfYnJpZGdlOworCisJYXBjX2JyaWRnZSA9IHBjaV9nZXRfc2xvdChob3N0X2JyaWRnZS0+YnVzLCBQQ0lfREVWRk4oMSwgMCkpOworCWlmIChhcGNfYnJpZGdlKSB7CisJCWlmIChhcGNfYnJpZGdlLT5kZXZpY2UgPT0gMHg5NjAyKQorCQkJcXVpcmtfZGlzYWJsZV9tc2koYXBjX2JyaWRnZSk7CisJCXBjaV9kZXZfcHV0KGFwY19icmlkZ2UpOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQU1ELCAweDk2MDAsIHF1aXJrX2FtZF83ODBfYXBjX21zaSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgMHg5NjAxLCBxdWlya19hbWRfNzgwX2FwY19tc2kpOworCiAvKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIEh5cGVydHJhbnNwb3J0IGNhcGFiaWxpdGllcyBhbmQKICAqIHJldHVybiAxIGlmIGEgSFQgTVNJIGNhcGFiaWxpdHkgaXMgZm91bmQgYW5kIGVuYWJsZWQgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IG1zaV9odF9jYXBfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtMjM5MCw2ICsyNDI3LDkgQEAKIAlpbnQgcG9zOwogCWludCBmb3VuZDsKIAorCWlmICghcGNpX21zaV9lbmFibGVkKCkpCisJCXJldHVybjsKKwogCS8qIGNoZWNrIGlmIHRoZXJlIGlzIEhUIE1TSSBjYXAgb3IgZW5hYmxlZCBvbiB0aGlzIGRldmljZSAqLwogCWZvdW5kID0gaHRfY2hlY2tfbXNpX21hcHBpbmcoZGV2KTsKIApAQCAtMjc0Miw3ICsyNzgyLDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogQ0xTICV1IGJ5dGVzXG4iLAogCQkgICAgICAgcGNpX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKIAotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2ZpbmFsLCBkZXYpOwogCQkvKgogCQkgKiBJZiBhcmNoIGhhc24ndCBzZXQgaXQgZXhwbGljaXRseSB5ZXQsIHVzZSB0aGUgQ0xTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZWFyY2guYyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCmluZGV4IDIwZDAzZjcuLjlkNzVkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jCisrKyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCWlmIChwY2lfZG9tYWluX25yKGRldi0+YnVzKSA9PSBkb21haW4gJiYKIAkJICAgIChkZXYtPmJ1cy0+bnVtYmVyID09IGJ1cyAmJiBkZXYtPmRldmZuID09IGRldmZuKSkKIAkJCXJldHVybiBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCmluZGV4IDE5YjExMTMuLjY2Y2I4ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC04NzQsMTkgKzg3NCwxNiBAQAogYWdhaW46CiAJcGNpX2J1c19zaXplX2JyaWRnZXMocGFyZW50KTsKIAlfX3BjaV9icmlkZ2VfYXNzaWduX3Jlc291cmNlcyhicmlkZ2UsICZoZWFkKTsKLQlyZXR2YWwgPSBwY2lfcmVlbmFibGVfZGV2aWNlKGJyaWRnZSk7Ci0JcGNpX3NldF9tYXN0ZXIoYnJpZGdlKTsKLQlwY2lfZW5hYmxlX2JyaWRnZXMocGFyZW50KTsKIAogCXRyaWVkX3RpbWVzKys7CiAKIAlpZiAoIWhlYWQubmV4dCkKLQkJcmV0dXJuOworCQlnb3RvIGVuYWJsZV9hbGw7CiAKIAlpZiAodHJpZWRfdGltZXMgPj0gMikgewogCQkvKiBzdGlsbCBmYWlsLCBkb24ndCBuZWVkIHRvIHRyeSBtb3JlICovCiAJCWZyZWVfZmFpbGVkX2xpc3QoJmhlYWQpOwotCQlyZXR1cm47CisJCWdvdG8gZW5hYmxlX2FsbDsKIAl9CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBOby4gJWQgdHJ5IHRvIGFzc2lnbiB1bmFzc2lnbmVkIHJlc1xuIiwKQEAgLTkxOSw1ICs5MTYsMTAgQEAKIAlmcmVlX2ZhaWxlZF9saXN0KCZoZWFkKTsKIAogCWdvdG8gYWdhaW47CisKK2VuYWJsZV9hbGw6CisJcmV0dmFsID0gcGNpX3JlZW5hYmxlX2RldmljZShicmlkZ2UpOworCXBjaV9zZXRfbWFzdGVyKGJyaWRnZSk7CisJcGNpX2VuYWJsZV9icmlkZ2VzKHBhcmVudCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfYXNzaWduX3VuYXNzaWduZWRfYnJpZGdlX3Jlc291cmNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1pcnEuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCmluZGV4IGFhNzk1ZmQuLmVlYzk3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCkBAIC01OSw3ICs1OSw2IEBACiAJICAgICAgIGludCAoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0Jd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJZm9yX2VhY2hfcGNpX2RldihkZXYpCiAJCXBkZXZfZml4dXBfaXJxKGRldiwgc3dpenpsZSwgbWFwX2lycSk7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvS2NvbmZpZyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKaW5kZXggZDBmNWFkMy4uYzk4ODUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCkBAIC0xNTcsMTEgKzE1NywxMSBAQAogCiBjb25maWcgUENNQ0lBX0FVMVgwMAogCXRyaXN0YXRlICJBdTF4MDAgcGNtY2lhIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT0NfQVUxWDAwICYmIFBDTUNJQQorCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZICYmIFBDTUNJQQogCiBjb25maWcgUENNQ0lBX0FMQ0hFTVlfREVWQk9BUkQKIAl0cmlzdGF0ZSAiQWxjaGVteSBEYi9QYjF4eHggUENNQ0lBIHNvY2tldCBzZXJ2aWNlcyIKLQlkZXBlbmRzIG9uIFNPQ19BVTFYMDAgJiYgUENNQ0lBCisJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkgJiYgUENNQ0lBCiAJc2VsZWN0IDY0QklUX1BIWVNfQUREUgogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIGRyaXZlciBvZiB5b3Ugd2FudCBQQ01DSUEgc3VwcG9ydCBvbiB5b3VyIEFsY2hlbXkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKaW5kZXggZDAwNmU4YmUuLjdhMmIxNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlCkBAIC03LDcgKzcsNiBAQAogb2JqLSQoQ09ORklHX1BDQ0FSRCkJCQkJKz0gcGNtY2lhX2NvcmUubwogCiBwY21jaWEteQkJCQkJKz0gZHMubyBwY21jaWFfcmVzb3VyY2UubyBjaXN0cGwubyBwY21jaWFfY2lzLm8KLXBjbWNpYS0kKENPTkZJR19QQ01DSUFfSU9DVEwpCQkJKz0gcGNtY2lhX2lvY3RsLm8KIG9iai0kKENPTkZJR19QQ01DSUEpCQkJCSs9IHBjbWNpYS5vCiAKIHBjbWNpYV9yc3JjLXkJCQkJCSs9IHJzcmNfbWdyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmggYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCmluZGV4IGEzMjRkMzIuLjY3NTMwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmgKKysrIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuaApAQCAtMjMsNyArMjMsNiBAQAogCiAvKiBpbmNsdWRlIHRoZSB3b3JsZCAqLwogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jCmluZGV4IDVhOTc5Y2IuLjgwN2YyZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfcGIxeDAwLmMKQEAgLTMxLDExICszMSw5IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2J1c19vcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2Npc3RwbC5jIGIvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKaW5kZXggODg0NGJjM2UuLjkxNDE0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2Npc3RwbC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2Npc3RwbC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTU0LDYgKzUzLDkgQEAKIC8qIFVwcGVyIGxpbWl0IG9uIHJlYXNvbmFibGUgIyBvZiB0dXBsZXMgKi8KICNkZWZpbmUgTUFYX1RVUExFUwkJMjAwCiAKKy8qIEJpdHMgaW4gSVJRSW5mbzEgZmllbGQgKi8KKyNkZWZpbmUgSVJRX0lORk8yX1ZBTElECQkweDEwCisKIC8qIDE2LWJpdCBDSVM/ICovCiBzdGF0aWMgaW50IGNpc193aWR0aDsKIG1vZHVsZV9wYXJhbShjaXNfd2lkdGgsIGludCwgMDQ0NCk7CkBAIC0yMTAsNyArMjEyLDcgQEAKICAqIFByb2JhYmx5IG9ubHkgdXNlZnVsIGZvciB3cml0aW5nIG9uZS1ieXRlIHJlZ2lzdGVycy4gTXVzdCBiZSBjYWxsZWQKICAqIHdpdGggb3BzX211dGV4IGhlbGQuCiAgKi8KLXZvaWQgcGNtY2lhX3dyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLCB1X2ludCBhZGRyLAoraW50IHBjbWNpYV93cml0ZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwgdV9pbnQgYWRkciwKIAkJICAgdV9pbnQgbGVuLCB2b2lkICpwdHIpCiB7CiAJdm9pZCBfX2lvbWVtICpzeXMsICplbmQ7CkBAIC0yMzIsNyArMjM0LDcgQEAKIAkJCQkoKGNpc193aWR0aCkgPyBNQVBfMTZCSVQgOiAwKSk7CiAJCWlmICghc3lzKSB7CiAJCQlkZXZfZGJnKCZzLT5kZXYsICJjb3VsZCBub3QgbWFwIG1lbW9yeVxuIik7Ci0JCQlyZXR1cm47IC8qIEZJWE1FOiBFcnJvciAqLworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQl3cml0ZWIoZmxhZ3MsIHN5cytDSVNSRUdfSUNUUkwwKTsKQEAgLTI1Nyw3ICsyNTksNyBAQAogCQkJc3lzID0gc2V0X2Npc19tYXAocywgY2FyZF9vZmZzZXQsIGZsYWdzKTsKIAkJCWlmICghc3lzKSB7CiAJCQkJZGV2X2RiZygmcy0+ZGV2LCAiY291bGQgbm90IG1hcCBtZW1vcnlcbiIpOwotCQkJCXJldHVybjsgLyogRklYTUU6IGVycm9yICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKIAkJCWVuZCA9IHN5cyArIHMtPm1hcF9zaXplOwpAQCAtMjcxLDYgKzI3Myw3IEBACiAJCQlhZGRyID0gMDsKIAkJfQogCX0KKwlyZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCA5NzZkODA3Li4yZWM4YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjUyLDM4ICsyNTEsNiBAQAogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3NvY2tldF9ieV9ucik7CiAKLS8qCi0gKiBUaGUgY2VudHJhbCBldmVudCBoYW5kbGVyLiAgU2VuZF9ldmVudCgpIHNlbmRzIGFuIGV2ZW50IHRvIHRoZQotICogMTYtYml0IHN1YnN5c3RlbSwgd2hpY2ggdGhlbiBjYWxscyB0aGUgcmVsZXZhbnQgZGV2aWNlIGRyaXZlcnMuCi0gKiBQYXJzZV9ldmVudHMoKSBpbnRlcnByZXRzIHRoZSBldmVudCBiaXRzIGZyb20KLSAqIGEgY2FyZCBzdGF0dXMgY2hhbmdlIHJlcG9ydC4gIERvX3NodXRkb3duKCkgaGFuZGxlcyB0aGUgaGlnaAotICogcHJpb3JpdHkgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIGEgY2FyZCByZW1vdmFsLgotICovCi0KLS8qIE5PVEU6IHNlbmRfZXZlbnQgbmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggc2t0LT5zZW0gaGVsZC4gKi8KLQotc3RhdGljIGludCBzZW5kX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpCi17Ci0JaW50IHJldDsKLQotCWlmICgocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykgJiYgKGV2ZW50ICE9IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkpCi0JCXJldHVybiAwOwotCi0JZGV2X2RiZygmcy0+ZGV2LCAic2VuZF9ldmVudChldmVudCAlZCwgcHJpICVkLCBjYWxsYmFjayAweCVwKVxuIiwKLQkgICBldmVudCwgcHJpb3JpdHksIHMtPmNhbGxiYWNrKTsKLQotCWlmICghcy0+Y2FsbGJhY2spCi0JCXJldHVybiAwOwotCWlmICghdHJ5X21vZHVsZV9nZXQocy0+Y2FsbGJhY2stPm93bmVyKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSBzLT5jYWxsYmFjay0+ZXZlbnQocywgZXZlbnQsIHByaW9yaXR5KTsKLQotCW1vZHVsZV9wdXQocy0+Y2FsbGJhY2stPm93bmVyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgc29ja2V0X3Jlc2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CiAJaW50IHN0YXR1cywgaTsKQEAgLTMyNiw3ICsyOTMsOCBAQAogCiAJZGV2X2RiZygmcy0+ZGV2LCAic2h1dGRvd25cbiIpOwogCi0Jc2VuZF9ldmVudChzLCBDU19FVkVOVF9DQVJEX1JFTU9WQUwsIENTX0VWRU5UX1BSSV9ISUdIKTsKKwlpZiAocy0+Y2FsbGJhY2spCisJCXMtPmNhbGxiYWNrLT5yZW1vdmUocyk7CiAKIAltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCXMtPnN0YXRlICY9IFNPQ0tFVF9JTlVTRSB8IFNPQ0tFVF9QUkVTRU5UOwpAQCAtNDc3LDcgKzQ0NSw4IEBACiAJCWRldl9kYmcoJnNrdC0+ZGV2LCAiaW5zZXJ0IGRvbmVcbiIpOwogCQltdXRleF91bmxvY2soJnNrdC0+b3BzX211dGV4KTsKIAotCQlzZW5kX2V2ZW50KHNrdCwgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04sIENTX0VWRU5UX1BSSV9MT1cpOworCQlpZiAoIShza3QtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpICYmIChza3QtPmNhbGxiYWNrKSkKKwkJCXNrdC0+Y2FsbGJhY2stPmFkZChza3QpOwogCX0gZWxzZSB7CiAJCW11dGV4X3VubG9jaygmc2t0LT5vcHNfbXV0ZXgpOwogCQlzb2NrZXRfc2h1dGRvd24oc2t0KTsKQEAgLTQ5NCw3ICs0NjMsNiBAQAogCW11dGV4X2xvY2soJnNrdC0+b3BzX211dGV4KTsKIAlza3QtPnN1c3BlbmRlZF9zdGF0ZSA9IHNrdC0+c3RhdGU7CiAKLQlzZW5kX2V2ZW50KHNrdCwgQ1NfRVZFTlRfUE1fU1VTUEVORCwgQ1NfRVZFTlRfUFJJX0xPVyk7CiAJc2t0LT5zb2NrZXQgPSBkZWFkX3NvY2tldDsKIAlza3QtPm9wcy0+c2V0X3NvY2tldChza3QsICZza3QtPnNvY2tldCk7CiAJaWYgKHNrdC0+b3BzLT5zdXNwZW5kKQpAQCAtNTU1LDggKzUyMyw4IEBACiAJCXJldHVybiAwOwogCX0KICNlbmRpZgotCi0Jc2VuZF9ldmVudChza3QsIENTX0VWRU5UX1BNX1JFU1VNRSwgQ1NfRVZFTlRfUFJJX0xPVyk7CisJaWYgKCEoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSAmJiAoc2t0LT5jYWxsYmFjaykpCisJCXNrdC0+Y2FsbGJhY2stPmVhcmx5X3Jlc3VtZShza3QpOwogCXJldHVybiAwOwogfQogCkBAIC02NTQsMTYgKzYyMiw4IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNrdC0+dGhyZWFkX2xvY2ssIGZsYWdzKTsKIAogCQltdXRleF9sb2NrKCZza3QtPnNrdF9tdXRleCk7Ci0JCWlmIChldmVudHMpIHsKLQkJCWlmIChldmVudHMgJiBTU19ERVRFQ1QpCi0JCQkJc29ja2V0X2RldGVjdF9jaGFuZ2Uoc2t0KTsKLQkJCWlmIChldmVudHMgJiBTU19CQVRERUFEKQotCQkJCXNlbmRfZXZlbnQoc2t0LCBDU19FVkVOVF9CQVRURVJZX0RFQUQsIENTX0VWRU5UX1BSSV9MT1cpOwotCQkJaWYgKGV2ZW50cyAmIFNTX0JBVFdBUk4pCi0JCQkJc2VuZF9ldmVudChza3QsIENTX0VWRU5UX0JBVFRFUllfTE9XLCBDU19FVkVOVF9QUklfTE9XKTsKLQkJCWlmIChldmVudHMgJiBTU19SRUFEWSkKLQkJCQlzZW5kX2V2ZW50KHNrdCwgQ1NfRVZFTlRfUkVBRFlfQ0hBTkdFLCBDU19FVkVOVF9QUklfTE9XKTsKLQkJfQorCQlpZiAoZXZlbnRzICYgU1NfREVURUNUKQorCQkJc29ja2V0X2RldGVjdF9jaGFuZ2Uoc2t0KTsKIAogCQlpZiAoc3lzZnNfZXZlbnRzKSB7CiAJCQlpZiAoc3lzZnNfZXZlbnRzICYgUENNQ0lBX1VFVkVOVF9FSkVDVCkKQEAgLTc4Myw3ICs3NDMsNyBAQAogCQlzLT5jYWxsYmFjayA9IGM7CiAKIAkJaWYgKChzLT5zdGF0ZSAmIChTT0NLRVRfUFJFU0VOVHxTT0NLRVRfQ0FSREJVUykpID09IFNPQ0tFVF9QUkVTRU5UKQotCQkJc2VuZF9ldmVudChzLCBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiwgQ1NfRVZFTlRfUFJJX0xPVyk7CisJCQlzLT5jYWxsYmFjay0+YWRkKHMpOwogCX0gZWxzZQogCQlzLT5jYWxsYmFjayA9IE5VTEw7CiAgZXJyOgpAQCAtODIzLDIwICs3ODMsMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0gc2VuZF9ldmVudChza3QsIENTX0VWRU5UX1JFU0VUX1JFUVVFU1QsIENTX0VWRU5UX1BSSV9MT1cpOwotCQlpZiAocmV0ID09IDApIHsKLQkJCXNlbmRfZXZlbnQoc2t0LCBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCwgQ1NfRVZFTlRfUFJJX0xPVyk7Ci0JCQlpZiAoc2t0LT5jYWxsYmFjaykKLQkJCQlza3QtPmNhbGxiYWNrLT5zdXNwZW5kKHNrdCk7Ci0JCQltdXRleF9sb2NrKCZza3QtPm9wc19tdXRleCk7Ci0JCQlyZXQgPSBzb2NrZXRfcmVzZXQoc2t0KTsKLQkJCW11dGV4X3VubG9jaygmc2t0LT5vcHNfbXV0ZXgpOwotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJc2VuZF9ldmVudChza3QsIENTX0VWRU5UX0NBUkRfUkVTRVQsIENTX0VWRU5UX1BSSV9MT1cpOwotCQkJCWlmIChza3QtPmNhbGxiYWNrKQotCQkJCQlza3QtPmNhbGxiYWNrLT5yZXN1bWUoc2t0KTsKLQkJCX0KLQkJfQorCQlpZiAoc2t0LT5jYWxsYmFjaykKKwkJCXNrdC0+Y2FsbGJhY2stPnN1c3BlbmQoc2t0KTsKKwkJbXV0ZXhfbG9jaygmc2t0LT5vcHNfbXV0ZXgpOworCQlyZXQgPSBzb2NrZXRfcmVzZXQoc2t0KTsKKwkJbXV0ZXhfdW5sb2NrKCZza3QtPm9wc19tdXRleCk7CisJCWlmICgocmV0ID09IDApICYmIChza3QtPmNhbGxiYWNrKSkKKwkJCXNrdC0+Y2FsbGJhY2stPnJlc3VtZShza3QpOwogCiAJCXJldCA9IDA7CiAJfSB3aGlsZSAoMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaAppbmRleCA0MTI2YTc1Li5kYTA1NWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKQEAgLTEwLDcgKzEwLDcgQEAKICAqIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIChDKSAxOTk5CQlEYXZpZCBBLiBIaW5kcwotICogKEMpIDIwMDMgLSAyMDA4CURvbWluaWsgQnJvZG93c2tpCisgKiAoQykgMjAwMyAtIDIwMTAJRG9taW5payBCcm9kb3dza2kKICAqCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIF9vbmx5XyBuZWVkZWQgYnkgdGhlIFBDTUNJQSBjb3JlIG1vZHVsZXMuCkBAIC0yNiw2ICsyNiw5IEBACiAvKiBGbGFncyBpbiBjbGllbnQgc3RhdGUgKi8KICNkZWZpbmUgQ0xJRU5UX1dJTl9SRVEoaSkJKDB4MTw8KGkpKQogCisvKiBGbGFnIHRvIGFjY2VzcyBhbGwgZnVuY3Rpb25zICovCisjZGVmaW5lIEJJTkRfRk5fQUxMCTB4ZmYKKwogLyogRWFjaCBjYXJkIGZ1bmN0aW9uIGdldHMgb25lIG9mIHRoZXNlIGd1eXMgKi8KIHR5cGVkZWYgc3RydWN0IGNvbmZpZ190IHsKIAlzdHJ1Y3Qga3JlZglyZWY7CkBAIC0zNSw3ICszOCwxMCBAQAogCXVuc2lnbmVkIGludAlDb25maWdCYXNlOwogCXVuc2lnbmVkIGNoYXIJU3RhdHVzLCBQaW4sIENvcHksIE9wdGlvbiwgRXh0U3RhdHVzOwogCXVuc2lnbmVkIGludAlDYXJkVmFsdWVzOwotCWlvX3JlcV90CWlvOworCisJc3RydWN0IHJlc291cmNlIGlvW01BWF9JT19XSU5dOyAvKiBpbyBwb3J0cyAqLworCXN0cnVjdCByZXNvdXJjZSBtZW1bTUFYX1dJTl07ICAgLyogbWVtIGFyZWFzICovCisKIAlzdHJ1Y3QgewogCQl1X2ludAlBdHRyaWJ1dGVzOwogCX0gaXJxOwpAQCAtNTYsMTggKzYyLDExIEBACiAJCQkJCSB1bnNpZ25lZCBpbnQgYXR0ciwKIAkJCQkJIHVuc2lnbmVkIGludCAqYmFzZSwKIAkJCQkJIHVuc2lnbmVkIGludCBudW0sCi0JCQkJCSB1bnNpZ25lZCBpbnQgYWxpZ24pOworCQkJCQkgdW5zaWduZWQgaW50IGFsaWduLAorCQkJCQkgc3RydWN0IHJlc291cmNlICoqcGFyZW50KTsKIAlzdHJ1Y3QgcmVzb3VyY2UqICgqZmluZF9tZW0pCSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnVtLAogCQkJCQkgdW5zaWduZWQgbG9uZyBhbGlnbiwgaW50IGxvdywKIAkJCQkJIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLQlpbnQJKCphZGRfaW8pCQkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJCSB1bnNpZ25lZCBpbnQgYWN0aW9uLAotCQkJCQkgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAotCQkJCQkgdW5zaWduZWQgbG9uZyByX2VuZCk7Ci0JaW50CSgqYWRkX21lbSkJCShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywKLQkJCQkJIHVuc2lnbmVkIGludCBhY3Rpb24sCi0JCQkJCSB1bnNpZ25lZCBsb25nIHJfc3RhcnQsCi0JCQkJCSB1bnNpZ25lZCBsb25nIHJfZW5kKTsKIAlpbnQJKCppbml0KQkJCShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiAJdm9pZAkoKmV4aXQpCQkJKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIH07CkBAIC0xMTQsMTEgKzExMywxMiBAQAogCiBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrewogCXN0cnVjdCBtb2R1bGUJKm93bmVyOwotCWludAkJKCpldmVudCkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAotCQkJCSAgZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5KTsKKwlpbnQJCSgqYWRkKSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworCWludAkJKCpyZW1vdmUpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiAJdm9pZAkJKCpyZXF1ZXJ5KSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwogCWludAkJKCp2YWxpZGF0ZSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgKmkpOwogCWludAkJKCpzdXNwZW5kKSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworCWludAkJKCplYXJseV9yZXN1bWUpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiAJaW50CQkoKnJlc3VtZSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIH07CiAKQEAgLTE0Niw2ICsxNDYsOCBAQAogLyogZHMuYyAqLwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwY21jaWFfYnVzX3R5cGU7CiAKK3N0cnVjdCBwY21jaWFfZGV2aWNlOworCiAvKiBwY21jaWFfcmVzb3VyY2UuYyAqLwogZXh0ZXJuIGludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CiBleHRlcm4gaW50IHBjbWNpYV92YWxpZGF0ZV9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwpAQCAtMTYzLDggKzE2NSw4IEBACiAKIGludCBwY21jaWFfcmVhZF9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwKIAkJCXVfaW50IGFkZHIsIHVfaW50IGxlbiwgdm9pZCAqcHRyKTsKLXZvaWQgcGNtY2lhX3dyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAotCQkJICB1X2ludCBhZGRyLCB1X2ludCBsZW4sIHZvaWQgKnB0cik7CitpbnQgcGNtY2lhX3dyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAorCQkJdV9pbnQgYWRkciwgdV9pbnQgbGVuLCB2b2lkICpwdHIpOwogdm9pZCByZWxlYXNlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwogdm9pZCBkZXN0cm95X2Npc19jYWNoZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiBpbnQgcGNjYXJkX3JlYWRfdHVwbGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKQEAgLTE4OCwzNCArMTkwLDQgQEAKIAogaW50IHBjY2FyZF9nZXRfdHVwbGVfZGF0YShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdHVwbGVfdCAqdHVwbGUpOwogCi0KLSNpZmRlZiBDT05GSUdfUENNQ0lBX0lPQ1RMCi0vKiBkcy5jICovCi1leHRlcm4gc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9nZXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7Ci1leHRlcm4gdm9pZCBwY21jaWFfcHV0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOwotCi1zdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2RldmljZV9hZGQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJCXVuc2lnbmVkIGludCBmdW5jdGlvbik7Ci0KLS8qIHBjbWNpYV9pb2N0bC5jICovCi1leHRlcm4gdm9pZCBfX2luaXQgcGNtY2lhX3NldHVwX2lvY3RsKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19leGl0IHBjbWNpYV9jbGVhbnVwX2lvY3RsKHZvaWQpOwotZXh0ZXJuIHZvaWQgaGFuZGxlX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KTsKLWV4dGVybiBpbnQgaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpOwotCi0jZWxzZSAvKiBDT05GSUdfUENNQ0lBX0lPQ1RMICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGNtY2lhX3NldHVwX2lvY3RsKHZvaWQpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHBjbWNpYV9jbGVhbnVwX2lvY3RsKHZvaWQpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KQotewotCXJldHVybjsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1BDTUNJQV9JT0NUTCAqLwotCiAjZW5kaWYgLyogX0xJTlVYX0NTX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RiMXh4eF9zcy5jIGIvZHJpdmVycy9wY21jaWEvZGIxeHh4X3NzLmMKaW5kZXggMGY0Y2MzZi4uMjc1NzVlNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RiMXh4eF9zcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RiMXh4eF9zcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IGVhYzk2MTQuLjU1NTcwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtMTAsNyArMTAsNyBAQAogICogYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogKEMpIDE5OTkJCURhdmlkIEEuIEhpbmRzCi0gKiAoQykgMjAwMyAtIDIwMDYJRG9taW5payBCcm9kb3dza2kKKyAqIChDKSAyMDAzIC0gMjAxMAlEb21pbmlrIEJyb2Rvd3NraQogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTIxMyw3ICsyMTIsNyBAQAogCiAvKiBwY21jaWFfZGV2aWNlIGhhbmRsaW5nICovCiAKLXN0cnVjdCBwY21jaWFfZGV2aWNlICpwY21jaWFfZ2V0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9nZXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICp0bXBfZGV2OwogCXRtcF9kZXYgPSBnZXRfZGV2aWNlKCZwX2Rldi0+ZGV2KTsKQEAgLTIyMiw3ICsyMjEsNyBAQAogCXJldHVybiB0b19wY21jaWFfZGV2KHRtcF9kZXYpOwogfQogCi12b2lkIHBjbWNpYV9wdXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKK3N0YXRpYyB2b2lkIHBjbWNpYV9wdXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKIHsKIAlpZiAocF9kZXYpCiAJCXB1dF9kZXZpY2UoJnBfZGV2LT5kZXYpOwpAQCAtMjk0LDcgKzI5Myw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmcy0+b3BzX211dGV4KTsKLQlpZiAoKHMtPnBjbWNpYV9zdGF0ZS5oYXNfcGZjKSAmJgorCWlmICgocy0+cGNtY2lhX3BmYykgJiYKIAkgICAgKHBfZGV2LT5zb2NrZXQtPmRldmljZV9jb3VudCA9PSAxKSAmJiAocF9kZXYtPmRldmljZV9ubyA9PSAwKSkKIAkJcGNtY2lhX3BhcnNlX3VldmVudHMocywgUENNQ0lBX1VFVkVOVF9SRVFVRVJZKTsKIAltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7CkBAIC0zNTksNyArMzU4LDcgQEAKIAkgKiBwc2V1ZG8gbXVsdGktZnVuY3Rpb24gY2FyZCwgd2UgbmVlZCB0byB1bmJpbmQKIAkgKiBhbGwgZGV2aWNlcwogCSAqLwotCWlmICgocF9kZXYtPnNvY2tldC0+cGNtY2lhX3N0YXRlLmhhc19wZmMpICYmCisJaWYgKChwX2Rldi0+c29ja2V0LT5wY21jaWFfcGZjKSAmJgogCSAgICAocF9kZXYtPnNvY2tldC0+ZGV2aWNlX2NvdW50ID4gMCkgJiYKIAkgICAgKHBfZGV2LT5kZXZpY2Vfbm8gPT0gMCkpCiAJCXBjbWNpYV9jYXJkX3JlbW92ZShwX2Rldi0+c29ja2V0LCBwX2Rldik7CkBAIC00NzcsNyArNDc2LDggQEAKIH0KIAogCi1zdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2RldmljZV9hZGQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbikKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2RldmljZV9hZGQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCAqdG1wX2RldjsKIAlpbnQgaTsKQEAgLTUzMSw3ICs1MzEsNiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KQogCQlpZiAocF9kZXYtPmZ1bmMgPT0gdG1wX2Rldi0+ZnVuYykgewogCQkJcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZyA9IHRtcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKLQkJCXBfZGV2LT5pbyA9IHRtcF9kZXYtPmlvOwogCQkJcF9kZXYtPmlycSA9IHRtcF9kZXYtPmlycTsKIAkJCWtyZWZfZ2V0KCZwX2Rldi0+ZnVuY3Rpb25fY29uZmlnLT5yZWYpOwogCQl9CkBAIC01NDQsMTUgKzU0MywyOSBAQAogCQkJIklSUSBzZXR1cCBmYWlsZWQgLS0gZGV2aWNlIG1pZ2h0IG5vdCB3b3JrXG4iKTsKIAogCWlmICghcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZykgeworCQljb25maWdfdCAqYzsKIAkJZGV2X2RiZygmcF9kZXYtPmRldiwgImNyZWF0aW5nIGNvbmZpZ190XG4iKTsKLQkJcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWdfdCksCi0JCQkJCQkgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZykgeworCQljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbmZpZ190KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYykgewogCQkJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCQkJZ290byBlcnJfdW5yZWc7CiAJCX0KLQkJa3JlZl9pbml0KCZwX2Rldi0+ZnVuY3Rpb25fY29uZmlnLT5yZWYpOworCQlwX2Rldi0+ZnVuY3Rpb25fY29uZmlnID0gYzsKKwkJa3JlZl9pbml0KCZjLT5yZWYpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7CisJCQljLT5pb1tpXS5uYW1lID0gcF9kZXYtPmRldm5hbWU7CisJCQljLT5pb1tpXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCX0KKwkJZm9yIChpID0gMDsgaTwgTUFYX1dJTjsgaSsrKSB7CisJCQljLT5tZW1baV0ubmFtZSA9IHBfZGV2LT5kZXZuYW1lOworCQkJYy0+bWVtW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCX0KIAl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykKKwkJcF9kZXYtPnJlc291cmNlW2ldID0gJnBfZGV2LT5mdW5jdGlvbl9jb25maWctPmlvW2ldOworCWZvciAoOyBpIDwgKE1BWF9JT19XSU4gKyBNQVhfV0lOKTsgaSsrKQorCQlwX2Rldi0+cmVzb3VyY2VbaV0gPSAmcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZy0+bWVtW2ktTUFYX0lPX1dJTl07CisKIAltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7CiAKIAlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmcF9kZXYtPmRldiwKQEAgLTY4MCw3ICs2OTMsNyBAQAogCSAqIGNhbGwgcGNtY2lhX2RldmljZV9hZGQoKSAtLSB3aGljaCB3aWxsIGZhaWwgaWYgYm90aAogCSAqIGRldmljZXMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZC4gKi8KIAltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCWhhc19wZmMgPSBzLT5wY21jaWFfc3RhdGUuaGFzX3BmYzsKKwloYXNfcGZjID0gcy0+cGNtY2lhX3BmYzsKIAltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7CiAJaWYgKGhhc19wZmMpCiAJCXBjbWNpYV9kZXZpY2VfYWRkKHMsIDApOwpAQCAtODEyLDcgKzgyNSw3IEBACiAJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTykgewogCQlkZXZfZGJnKCZkZXYtPmRldiwgInRoaXMgaXMgYSBwc2V1ZG8tbXVsdGktZnVuY3Rpb24gZGV2aWNlXG4iKTsKIAkJbXV0ZXhfbG9jaygmZGV2LT5zb2NrZXQtPm9wc19tdXRleCk7Ci0JCWRldi0+c29ja2V0LT5wY21jaWFfc3RhdGUuaGFzX3BmYyA9IDE7CisJCWRldi0+c29ja2V0LT5wY21jaWFfcGZjID0gMTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnNvY2tldC0+b3BzX211dGV4KTsKIAkJaWYgKGRldi0+ZGV2aWNlX25vICE9IGRpZC0+ZGV2aWNlX25vKQogCQkJcmV0dXJuIDA7CkBAIC04MjYsNyArODM5LDcgQEAKIAogCQkvKiBpZiB0aGlzIGlzIGEgcHNldWRvLW11bHRpLWZ1bmN0aW9uIGRldmljZSwKIAkJICogd2UgbmVlZCBleHBsaWNpdCBtYXRjaGVzICovCi0JCWlmIChkZXYtPnNvY2tldC0+cGNtY2lhX3N0YXRlLmhhc19wZmMpCisJCWlmIChkZXYtPnNvY2tldC0+cGNtY2lhX3BmYykKIAkJCXJldHVybiAwOwogCQlpZiAoZGV2LT5kZXZpY2Vfbm8pCiAJCQlyZXR1cm4gMDsKQEAgLTg4NSwxNCArODk4LDYgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwX2Rydi0+ZHluaWRzLmxvY2spOwogCi0jaWZkZWYgQ09ORklHX1BDTUNJQV9JT0NUTAotCS8qIG1hdGNoaW5nIGJ5IGNhcmRtZ3IgKi8KLQlpZiAocF9kZXYtPmNhcmRtZ3IgPT0gcF9kcnYpIHsKLQkJZGV2X2RiZyhkZXYsICJjYXJkbWdyIG1hdGNoZWQgdG8gJXNcbiIsIGRydi0+bmFtZSk7Ci0JCXJldHVybiAxOwotCX0KLSNlbmRpZgotCiAJd2hpbGUgKGRpZCAmJiBkaWQtPm1hdGNoX2ZsYWdzKSB7CiAJCWRldl9kYmcoZGV2LCAidHJ5aW5nIHRvIG1hdGNoIHRvICVzXG4iLCBkcnYtPm5hbWUpOwogCQlpZiAocGNtY2lhX2Rldm1hdGNoKHBfZGV2LCBkaWQpKSB7CkBAIC0xMDA2LDYgKzEwMTEsMTggQEAKIHBjbWNpYV9kZXZpY2Vfc3RyaW5nYXR0cihwcm9kX2lkMywgcHJvZF9pZFsyXSk7CiBwY21jaWFfZGV2aWNlX3N0cmluZ2F0dHIocHJvZF9pZDQsIHByb2RfaWRbM10pOwogCitzdGF0aWMgc3NpemVfdCBwY21jaWFfc2hvd19yZXNvdXJjZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CisJY2hhciAqc3RyID0gYnVmOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9OVU1fUkVTT1VSQ0VTOyBpKyspCisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVwclxuIiwgcF9kZXYtPnJlc291cmNlW2ldKTsKKworCXJldHVybiBzdHIgLSBidWY7Cit9CiAKIHN0YXRpYyBzc2l6ZV90IHBjbWNpYV9zaG93X3BtX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTEwNzYsNiArMTA5Myw3IEBACiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcGNtY2lhX2Rldl9hdHRyc1tdID0gewogCV9fQVRUUihmdW5jdGlvbiwgMDQ0NCwgZnVuY19zaG93LCBOVUxMKSwKIAlfX0FUVFIocG1fc3RhdGUsIDA2NDQsIHBjbWNpYV9zaG93X3BtX3N0YXRlLCBwY21jaWFfc3RvcmVfcG1fc3RhdGUpLAorCV9fQVRUUihyZXNvdXJjZXMsIDA0NDQsIHBjbWNpYV9zaG93X3Jlc291cmNlcywgTlVMTCksCiAJX19BVFRSX1JPKGZ1bmNfaWQpLAogCV9fQVRUUl9STyhtYW5mX2lkKSwKIAlfX0FUVFJfUk8oY2FyZF9pZCksCkBAIC0xMjE1LDg2ICsxMjMzLDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIE5vcm1hbGx5LCB0aGUgZXZlbnQgaXMgcGFzc2VkIHRvIGluZGl2aWR1YWwgZHJpdmVycyBhZnRlcgotICogaW5mb3JtaW5nIHVzZXJzcGFjZS4gT25seSBmb3IgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHRoaXMKLSAqIGlzIGludmVyc2VkIHRvIG1haW50YWluIGhpc3RvcmljIGNvbXBhdGliaWxpdHkuCi0gKi8KLQotc3RhdGljIGludCBkc19ldmVudChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0LCBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpCitzdGF0aWMgaW50IHBjbWNpYV9idXNfcmVtb3ZlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwY21jaWFfZ2V0X3NvY2tldChza3QpOworCWF0b21pY19zZXQoJnNrdC0+cHJlc2VudCwgMCk7CisJcGNtY2lhX2NhcmRfcmVtb3ZlKHNrdCwgTlVMTCk7CiAKLQlpZiAoIXMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnNrdC0+ZGV2LAotCQkJICAgIlBDTUNJQSBvYnRhaW5pbmcgcmVmZXJlbmNlIHRvIHNvY2tldCAiCVwKLQkJCSAgICJmYWlsZWQsIGV2ZW50IDB4JXggbG9zdCFcbiIsIGV2ZW50KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJbXV0ZXhfbG9jaygmc2t0LT5vcHNfbXV0ZXgpOworCWRlc3Ryb3lfY2lzX2NhY2hlKHNrdCk7CisJcGNtY2lhX2NsZWFudXBfaXJxKHNrdCk7CisJbXV0ZXhfdW5sb2NrKCZza3QtPm9wc19tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY21jaWFfYnVzX2FkZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWF0b21pY19zZXQoJnNrdC0+cHJlc2VudCwgMSk7CisKKwltdXRleF9sb2NrKCZza3QtPm9wc19tdXRleCk7CisJc2t0LT5wY21jaWFfcGZjID0gMDsKKwlkZXN0cm95X2Npc19jYWNoZShza3QpOyAvKiB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLi4uICovCisJbXV0ZXhfdW5sb2NrKCZza3QtPm9wc19tdXRleCk7CisKKwlwY21jaWFfY2FyZF9hZGQoc2t0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjbWNpYV9idXNfZWFybHlfcmVzdW1lKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCit7CisJaWYgKCF2ZXJpZnlfY2lzX2NhY2hlKHNrdCkpIHsKKwkJcGNtY2lhX3B1dF9zb2NrZXQoc2t0KTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JZGV2X2RiZygmc2t0LT5kZXYsICJkc19ldmVudCgweCUwNngsICVkLCAweCVwKVxuIiwKLQkJICAgZXZlbnQsIHByaW9yaXR5LCBza3QpOworCWRldl9kYmcoJnNrdC0+ZGV2LCAiY2lzIG1pc21hdGNoIC0gZGlmZmVyZW50IGNhcmRcbiIpOwogCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgotCQlhdG9taWNfc2V0KCZza3QtPnByZXNlbnQsIDApOwotCQlwY21jaWFfY2FyZF9yZW1vdmUoc2t0LCBOVUxMKTsKLQkJaGFuZGxlX2V2ZW50KHNrdCwgZXZlbnQpOwotCQltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCQlkZXN0cm95X2Npc19jYWNoZShzKTsKLQkJcGNtY2lhX2NsZWFudXBfaXJxKHMpOwotCQltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7Ci0JCWJyZWFrOworCS8qIGZpcnN0LCByZW1vdmUgdGhlIGNhcmQgKi8KKwlwY21jaWFfYnVzX3JlbW92ZShza3QpOwogCi0JY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKLQkJYXRvbWljX3NldCgmc2t0LT5wcmVzZW50LCAxKTsKLQkJbXV0ZXhfbG9jaygmcy0+b3BzX211dGV4KTsKLQkJcy0+cGNtY2lhX3N0YXRlLmhhc19wZmMgPSAwOwotCQlkZXN0cm95X2Npc19jYWNoZShzKTsgLyogdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4uLiAqLwotCQltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7Ci0JCXBjbWNpYV9jYXJkX2FkZChza3QpOwotCQloYW5kbGVfZXZlbnQoc2t0LCBldmVudCk7Ci0JCWJyZWFrOworCW11dGV4X2xvY2soJnNrdC0+b3BzX211dGV4KTsKKwlkZXN0cm95X2Npc19jYWNoZShza3QpOworCWtmcmVlKHNrdC0+ZmFrZV9jaXMpOworCXNrdC0+ZmFrZV9jaXMgPSBOVUxMOworCXNrdC0+ZnVuY3Rpb25zID0gMDsKKwltdXRleF91bmxvY2soJnNrdC0+b3BzX211dGV4KTsKIAotCWNhc2UgQ1NfRVZFTlRfRUpFQ1RJT05fUkVRVUVTVDoKLQkJYnJlYWs7CisJLyogbm93LCBhZGQgdGhlIG5ldyBjYXJkICovCisJcGNtY2lhX2J1c19hZGQoc2t0KTsKKwlyZXR1cm4gMDsKK30KIAotCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgotCQlpZiAodmVyaWZ5X2Npc19jYWNoZShza3QpICE9IDApIHsKLQkJCWRldl9kYmcoJnNrdC0+ZGV2LCAiY2lzIG1pc21hdGNoIC0gZGlmZmVyZW50IGNhcmRcbiIpOwotCQkJLyogZmlyc3QsIHJlbW92ZSB0aGUgY2FyZCAqLwotCQkJZHNfZXZlbnQoc2t0LCBDU19FVkVOVF9DQVJEX1JFTU9WQUwsIENTX0VWRU5UX1BSSV9ISUdIKTsKLQkJCW11dGV4X2xvY2soJnMtPm9wc19tdXRleCk7Ci0JCQlkZXN0cm95X2Npc19jYWNoZShza3QpOwotCQkJa2ZyZWUoc2t0LT5mYWtlX2Npcyk7Ci0JCQlza3QtPmZha2VfY2lzID0gTlVMTDsKLQkJCXMtPmZ1bmN0aW9ucyA9IDA7Ci0JCQltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7Ci0JCQkvKiBub3csIGFkZCB0aGUgbmV3IGNhcmQgKi8KLQkJCWRzX2V2ZW50KHNrdCwgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04sCi0JCQkJIENTX0VWRU5UX1BSSV9MT1cpOwotCQl9Ci0JCWhhbmRsZV9ldmVudChza3QsIGV2ZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6Ci0JY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKLQljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6Ci0JZGVmYXVsdDoKLQkJaGFuZGxlX2V2ZW50KHNrdCwgZXZlbnQpOwotCQlicmVhazsKLSAgICB9Ci0KLSAgICBwY21jaWFfcHV0X3NvY2tldChzKTsKLQotICAgIHJldHVybiAwOwotfSAvKiBkc19ldmVudCAqLwogCiAvKgogICogTk9URTogVGhpcyBpcyByYWN5LiBUaGVyZSdzIG5vIGd1YXJhbnRlZSB0aGUgY2FyZCB3aWxsIHN0aWxsIGJlCkBAIC0xMzIzLDEwICsxMzEyLDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrIHBjbWNpYV9idXNfY2FsbGJhY2sgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmV2ZW50ID0gZHNfZXZlbnQsCisJLmFkZCA9IHBjbWNpYV9idXNfYWRkLAorCS5yZW1vdmUgPSBwY21jaWFfYnVzX3JlbW92ZSwKIAkucmVxdWVyeSA9IHBjbWNpYV9yZXF1ZXJ5LAogCS52YWxpZGF0ZSA9IHBjY2FyZF92YWxpZGF0ZV9jaXMsCiAJLnN1c3BlbmQgPSBwY21jaWFfYnVzX3N1c3BlbmQsCisJLmVhcmx5X3Jlc3VtZSA9IHBjbWNpYV9idXNfZWFybHlfcmVzdW1lLAogCS5yZXN1bWUgPSBwY21jaWFfYnVzX3Jlc3VtZSwKIH07CiAKQEAgLTEzNTAsMTEgKzEzNDEsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotI2lmZGVmIENPTkZJR19QQ01DSUFfSU9DVEwKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb2NrZXQtPnF1ZXVlKTsKLSNlbmRpZgogCUlOSVRfTElTVF9IRUFEKCZzb2NrZXQtPmRldmljZXNfbGlzdCk7Ci0JbWVtc2V0KCZzb2NrZXQtPnBjbWNpYV9zdGF0ZSwgMCwgc2l6ZW9mKHU4KSk7CisJc29ja2V0LT5wY21jaWFfcGZjID0gMDsKIAlzb2NrZXQtPmRldmljZV9jb3VudCA9IDA7CiAJYXRvbWljX3NldCgmc29ja2V0LT5wcmVzZW50LCAwKTsKIApAQCAtMTQyOSw4ICsxNDE3LDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlwY21jaWFfc2V0dXBfaW9jdGwoKTsKLQogCXJldHVybiAwOwogfQogZnNfaW5pdGNhbGwoaW5pdF9wY21jaWFfYnVzKTsgLyogb25lIGxldmVsIGFmdGVyIHN1YnN5c19pbml0Y2FsbCBzbyB0aGF0CkBAIC0xNDM5LDggKzE0MjUsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wY21jaWFfYnVzKHZvaWQpCiB7Ci0JcGNtY2lhX2NsZWFudXBfaW9jdGwoKTsKLQogCWNsYXNzX2ludGVyZmFjZV91bnJlZ2lzdGVyKCZwY21jaWFfYnVzX2ludGVyZmFjZSk7CiAKIAlidXNfdW5yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2k4MjA5Mi5jIGIvZHJpdmVycy9wY21jaWEvaTgyMDkyLmMKaW5kZXggMzAwM2JiMy4uMDVkMDg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvaTgyMDkyLmMKKysrIGIvZHJpdmVycy9wY21jaWEvaTgyMDkyLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYyBiL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCmluZGV4IDllMmExNTYuLjYxNzQ2YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCmluZGV4IDdlMTZlZDguLjI0ZGU0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jIGIvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYwppbmRleCA2YzVjM2Y5Li44ZTQ3MjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMgYi9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCmluZGV4IDI1ZTVlMzAuLmYyZjkwYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYwpAQCAtNTksNyArNTksNiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZnNfcGQuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfY2lzLmMgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfY2lzLmMKaW5kZXggNGE2NWVhZi4uMGFjNTRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2Npcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9jaXMuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDdhMmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc3ICswLDAgQEAKLS8qCi0gKiBwY21jaWFfaW9jdGwuYyAtLSBpb2N0bCBpbnRlcmZhY2UgZm9yIGNhcmRtZ3IgYW5kIGNhcmRjdGwKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcwotICogPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKLSAqIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIChDKSAxOTk5CQlEYXZpZCBBLiBIaW5kcwotICogKEMpIDIwMDMgLSAyMDA0CURvbWluaWsgQnJvZG93c2tpCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSB3aWxsIGdvIGF3YXkgc29vbi4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLSNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLSNpbmNsdWRlIDxwY21jaWEvc3MuaD4KLQotI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCi0KLXN0YXRpYyBpbnQgbWFqb3JfZGV2ID0gLTE7Ci0KLQotLyogRGV2aWNlIHVzZXIgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgTUFYX0VWRU5UUwkzMgotI2RlZmluZSBVU0VSX01BR0lDCTB4N2VhNAotI2RlZmluZSBDSEVDS19VU0VSKHUpIFwKLSAgICAoKCh1KSA9PSBOVUxMKSB8fCAoKHUpLT51c2VyX21hZ2ljICE9IFVTRVJfTUFHSUMpKQotCi10eXBlZGVmIHN0cnVjdCB1c2VyX2luZm9fdCB7Ci0JdV9pbnQJCQl1c2VyX21hZ2ljOwotCWludAkJCWV2ZW50X2hlYWQsIGV2ZW50X3RhaWw7Ci0JZXZlbnRfdAkJCWV2ZW50W01BWF9FVkVOVFNdOwotCXN0cnVjdCB1c2VyX2luZm9fdAkqbmV4dDsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldAkqc29ja2V0OwotfSB1c2VyX2luZm9fdDsKLQotCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmdldF9wY21jaWFfZGV2aWNlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAotCQkJCQkJdW5zaWduZWQgaW50IGZ1bmN0aW9uKQotewotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IE5VTEw7Ci0KLQltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgewotCQlpZiAocF9kZXYtPmZ1bmMgPT0gZnVuY3Rpb24pIHsKLQkJCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKLQkJCXJldHVybiBwY21jaWFfZ2V0X2RldihwX2Rldik7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBhY2Nlc3Npbmcgb2YgZHJpdmVyIC0tLSBieSBuYW1lISAqLwotCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgKmdldF9wY21jaWFfZHJpdmVyKGRldl9pbmZvX3QgKmRldl9pbmZvKQotewotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OwotCi0JZHJ2ID0gZHJpdmVyX2ZpbmQoKGNoYXIgKikgZGV2X2luZm8sICZwY21jaWFfYnVzX3R5cGUpOwotCWlmICghZHJ2KQotCQlyZXR1cm4gTlVMTDsKLQotCXBfZHJ2ID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IHBjbWNpYV9kcml2ZXIsIGRydik7Ci0KLQlyZXR1cm4gcF9kcnY7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BjY2FyZDsKLQotc3RhdGljIGludCBwcm9jX3JlYWRfZHJpdmVyc19jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCB2b2lkICpfbSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBfbTsKLQlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnYgPSBjb250YWluZXJfb2YoZHJpdmVyLAotCQkJCQkJICAgc3RydWN0IHBjbWNpYV9kcml2ZXIsIGRydik7Ci0KLQlzZXFfcHJpbnRmKG0sICIlLTI0LjI0cyAxICVkXG4iLCBwX2Rydi0+ZHJ2Lm5hbWUsCi0jaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKLQkJICAgICAgKHBfZHJ2LT5vd25lcikgPyBtb2R1bGVfcmVmY291bnQocF9kcnYtPm93bmVyKSA6IDEKLSNlbHNlCi0JCSAgICAgIDEKLSNlbmRpZgotCSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNjYXJkX2RyaXZlcnNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlyZXR1cm4gYnVzX2Zvcl9lYWNoX2RydigmcGNtY2lhX2J1c190eXBlLCBOVUxMLAotCQkJCW0sIHByb2NfcmVhZF9kcml2ZXJzX2NhbGxiYWNrKTsKLX0KLQotc3RhdGljIGludCBwY2NhcmRfZHJpdmVyc19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHBjY2FyZF9kcml2ZXJzX3Byb2Nfc2hvdywgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjY2FyZF9kcml2ZXJzX3Byb2NfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gcGNjYXJkX2RyaXZlcnNfcHJvY19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi19OwotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKLQotc3RhdGljIGludCBhZGp1c3RfaXJxKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKQotewotCWludCBpcnE7Ci0JdTMyIG1hc2s7Ci0KLQlpcnEgPSBhZGotPnJlc291cmNlLmlycS5JUlE7Ci0JaWYgKChpcnEgPCAwKSB8fCAoaXJxID4gMTUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhZGotPkFjdGlvbiAhPSBSRU1PVkVfTUFOQUdFRF9SRVNPVVJDRSkKLQkJcmV0dXJuIDA7Ci0KLQltYXNrID0gMSA8PCBpcnE7Ci0KLQlpZiAoIShzLT5pcnFfbWFzayAmIG1hc2spKQotCQlyZXR1cm4gMDsKLQotCXMtPmlycV9tYXNrICY9IH5tYXNrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyBpbmxpbmUgaW50IGFkanVzdF9pcnEoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGFkanVzdF90ICphZGopCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW50IHBjbWNpYV9hZGp1c3RfcmVzb3VyY2VfaW5mbyhhZGp1c3RfdCAqYWRqKQotewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWludCByZXQgPSAtRU5PU1lTOwotCi0JZG93bl9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnBjbWNpYV9zb2NrZXRfbGlzdCwgc29ja2V0X2xpc3QpIHsKLQotCQlpZiAoYWRqLT5SZXNvdXJjZSA9PSBSRVNfSVJRKQotCQkJcmV0ID0gYWRqdXN0X2lycShzLCBhZGopOwotCi0JCWVsc2UgaWYgKHMtPnJlc291cmNlX29wcy0+YWRkX2lvKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGJlZ2luLCBlbmQ7Ci0KLQkJCS8qIHlvdSBjYW4ndCB1c2UgdGhlIG9sZCBpbnRlcmZhY2UgaWYgdGhlIG5ldwotCQkJICogb25lIHdhcyB1c2VkIGJlZm9yZSAqLwotCQkJbXV0ZXhfbG9jaygmcy0+b3BzX211dGV4KTsKLQkJCWlmICgocy0+cmVzb3VyY2Vfc2V0dXBfbmV3KSAmJgotCQkJICAgICEocy0+cmVzb3VyY2Vfc2V0dXBfb2xkKSkgewotCQkJCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoIShzLT5yZXNvdXJjZV9zZXR1cF9vbGQpKQotCQkJCXMtPnJlc291cmNlX3NldHVwX29sZCA9IDE7Ci0KLQkJCXN3aXRjaCAoYWRqLT5SZXNvdXJjZSkgewotCQkJY2FzZSBSRVNfTUVNT1JZX1JBTkdFOgotCQkJCWJlZ2luID0gYWRqLT5yZXNvdXJjZS5tZW1vcnkuQmFzZTsKLQkJCQllbmQgPSBhZGotPnJlc291cmNlLm1lbW9yeS5CYXNlICsgYWRqLT5yZXNvdXJjZS5tZW1vcnkuU2l6ZSAtIDE7Ci0JCQkJaWYgKHMtPnJlc291cmNlX29wcy0+YWRkX21lbSkKLQkJCQkJcmV0ID0gcy0+cmVzb3VyY2Vfb3BzLT5hZGRfbWVtKHMsIGFkai0+QWN0aW9uLCBiZWdpbiwgZW5kKTsKLQkJCWNhc2UgUkVTX0lPX1JBTkdFOgotCQkJCWJlZ2luID0gYWRqLT5yZXNvdXJjZS5pby5CYXNlUG9ydDsKLQkJCQllbmQgPSBhZGotPnJlc291cmNlLmlvLkJhc2VQb3J0ICsgYWRqLT5yZXNvdXJjZS5pby5OdW1Qb3J0cyAtIDE7Ci0JCQkJaWYgKHMtPnJlc291cmNlX29wcy0+YWRkX2lvKQotCQkJCQlyZXQgPSBzLT5yZXNvdXJjZV9vcHMtPmFkZF9pbyhzLCBhZGotPkFjdGlvbiwgYmVnaW4sIGVuZCk7Ci0JCQl9Ci0JCQlpZiAoIXJldCkgewotCQkJCS8qIGFzIHRoZXJlJ3Mgbm8gd2F5IHdlIGtub3cgdGhpcyBpcyB0aGUKLQkJCQkgKiBsYXN0IGNhbGwgdG8gYWRqdXN0X3Jlc291cmNlX2luZm8sIHdlCi0JCQkJICogYWx3YXlzIG5lZWQgdG8gYXNzdW1lIHRoaXMgaXMgdGhlIGxhdGVzdAotCQkJCSAqIG9uZS4uLiAqLwotCQkJCXMtPnJlc291cmNlX3NldHVwX2RvbmUgPSAxOwotCQkJfQotCQkJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCQl9Ci0JfQotCXVwX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKiBwY21jaWFfZ2V0X3dpbmRvdwotICovCi1zdGF0aWMgaW50IHBjbWNpYV9nZXRfd2luZG93KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB3aW5kb3dfaGFuZGxlX3QgKndoX291dCwKLQkJCXdpbmRvd19oYW5kbGVfdCB3aCwgd2luX3JlcV90ICpyZXEpCi17Ci0JcGNjYXJkX21lbV9tYXAgKndpbjsKLQl3aW5kb3dfaGFuZGxlX3QgdzsKLQotCXdoLS07Ci0JaWYgKCFzIHx8ICEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICh3aCA+PSBNQVhfV0lOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlmb3IgKHcgPSB3aDsgdyA8IE1BWF9XSU47IHcrKykKLQkJaWYgKHMtPnN0YXRlICYgU09DS0VUX1dJTl9SRVEodykpCi0JCQlicmVhazsKLQlpZiAodyA9PSBNQVhfV0lOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl3aW4gPSAmcy0+d2luW3ddOwotCXJlcS0+QmFzZSA9IHdpbi0+cmVzLT5zdGFydDsKLQlyZXEtPlNpemUgPSB3aW4tPnJlcy0+ZW5kIC0gd2luLT5yZXMtPnN0YXJ0ICsgMTsKLQlyZXEtPkFjY2Vzc1NwZWVkID0gd2luLT5zcGVlZDsKLQlyZXEtPkF0dHJpYnV0ZXMgPSAwOwotCWlmICh3aW4tPmZsYWdzICYgTUFQX0FUVFJJQikKLQkJcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9NRU1PUllfVFlQRV9BTTsKLQlpZiAod2luLT5mbGFncyAmIE1BUF9BQ1RJVkUpCi0JCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fRU5BQkxFOwotCWlmICh3aW4tPmZsYWdzICYgTUFQXzE2QklUKQotCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0RBVEFfV0lEVEhfMTY7Ci0JaWYgKHdpbi0+ZmxhZ3MgJiBNQVBfVVNFX1dBSVQpCi0JCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fVVNFX1dBSVQ7Ci0KLQkqd2hfb3V0ID0gdyArIDE7Ci0JcmV0dXJuIDA7Ci19IC8qIHBjbWNpYV9nZXRfd2luZG93ICovCi0KLQotLyoqIHBjbWNpYV9nZXRfbWVtX3BhZ2UKLSAqCi0gKiBDaGFuZ2UgdGhlIGNhcmQgYWRkcmVzcyBvZiBhbiBhbHJlYWR5IG9wZW4gbWVtb3J5IHdpbmRvdy4KLSAqLwotc3RhdGljIGludCBwY21jaWFfZ2V0X21lbV9wYWdlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QsIHdpbmRvd19oYW5kbGVfdCB3aCwKLQkJCW1lbXJlcV90ICpyZXEpCi17Ci0Jd2gtLTsKLQlpZiAod2ggPj0gTUFYX1dJTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXEtPlBhZ2UgPSAwOwotCXJlcS0+Q2FyZE9mZnNldCA9IHNrdC0+d2luW3doXS5jYXJkX3N0YXJ0OwotCXJldHVybiAwOwotfSAvKiBwY21jaWFfZ2V0X21lbV9wYWdlICovCi0KLQotLyoqIHBjY2FyZF9nZXRfc3RhdHVzCi0gKgotICogR2V0IHRoZSBjdXJyZW50IHNvY2tldCBzdGF0ZSBiaXRzLiAgV2UgZG9uJ3Qgc3VwcG9ydCB0aGUgbGF0Y2hlZAotICogU29ja2V0U3RhdGUgeWV0OiBJIGhhdmVuJ3Qgc2VlbiBhbnkgcG9pbnQgZm9yIGl0LgotICovCi0KLXN0YXRpYyBpbnQgcGNjYXJkX2dldF9zdGF0dXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkgICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKLQkJCSAgICAgY3Nfc3RhdHVzX3QgKnN0YXR1cykKLXsKLQljb25maWdfdCAqYzsKLQlpbnQgdmFsOwotCi0Jcy0+b3BzLT5nZXRfc3RhdHVzKHMsICZ2YWwpOwotCXN0YXR1cy0+Q2FyZFN0YXRlID0gc3RhdHVzLT5Tb2NrZXRTdGF0ZSA9IDA7Ci0Jc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTX0RFVEVDVCkgPyBDU19FVkVOVF9DQVJEX0RFVEVDVCA6IDA7Ci0Jc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTX0NBUkRCVVMpID8gQ1NfRVZFTlRfQ0JfREVURUNUIDogMDsKLQlzdGF0dXMtPkNhcmRTdGF0ZSB8PSAodmFsICYgU1NfM1ZDQVJEKSA/IENTX0VWRU5UXzNWQ0FSRCA6IDA7Ci0Jc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTX1hWQ0FSRCkgPyBDU19FVkVOVF9YVkNBUkQgOiAwOwotCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKQotCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PSBDU19FVkVOVF9QTV9TVVNQRU5EOwotCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWMgPSAocF9kZXYpID8gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZyA6IE5VTEw7Ci0KLQlpZiAoKGMgIT0gTlVMTCkgJiYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkgJiYKLQkgICAgKGMtPkludFR5cGUgJiAoSU5UX01FTU9SWV9BTkRfSU8gfCBJTlRfWk9PTUVEX1ZJREVPKSkpIHsKLQkJdV9jaGFyIHJlZzsKLQkJaWYgKGMtPkNhcmRWYWx1ZXMgJiBQUkVTRU5UX1BJTl9SRVBMQUNFKSB7Ci0JCQltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCQkJcGNtY2lhX3JlYWRfY2lzX21lbShzLCAxLCAoYy0+Q29uZmlnQmFzZStDSVNSRUdfUFJSKT4+MSwgMSwgJnJlZyk7Ci0JCQltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7Ci0JCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCQkJCShyZWcgJiBQUlJfV1BfU1RBVFVTKSA/IENTX0VWRU5UX1dSSVRFX1BST1RFQ1QgOiAwOwotCQkJc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJCQkocmVnICYgUFJSX1JFQURZX1NUQVRVUykgPyBDU19FVkVOVF9SRUFEWV9DSEFOR0UgOiAwOwotCQkJc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJCQkocmVnICYgUFJSX0JWRDJfU1RBVFVTKSA/IENTX0VWRU5UX0JBVFRFUllfTE9XIDogMDsKLQkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCQkJKHJlZyAmIFBSUl9CVkQxX1NUQVRVUykgPyBDU19FVkVOVF9CQVRURVJZX0RFQUQgOiAwOwotCQl9IGVsc2UgewotCQkJLyogTm8gUFJSPyAgVGhlbiBhc3N1bWUgd2UncmUgYWx3YXlzIHJlYWR5ICovCi0JCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PSBDU19FVkVOVF9SRUFEWV9DSEFOR0U7Ci0JCX0KLQkJaWYgKGMtPkNhcmRWYWx1ZXMgJiBQUkVTRU5UX0VYVF9TVEFUVVMpIHsKLQkJCW11dGV4X2xvY2soJnMtPm9wc19tdXRleCk7Ci0JCQlwY21jaWFfcmVhZF9jaXNfbWVtKHMsIDEsIChjLT5Db25maWdCYXNlK0NJU1JFR19FU1IpPj4xLCAxLCAmcmVnKTsKLQkJCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKLQkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCQkJKHJlZyAmIEVTUl9SRVFfQVRUTikgPyBDU19FVkVOVF9SRVFVRVNUX0FUVEVOVElPTiA6IDA7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCXN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCSh2YWwgJiBTU19XUlBST1QpID8gQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCA6IDA7Ci0Jc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJKHZhbCAmIFNTX0JBVERFQUQpID8gQ1NfRVZFTlRfQkFUVEVSWV9ERUFEIDogMDsKLQlzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCQkodmFsICYgU1NfQkFUV0FSTikgPyBDU19FVkVOVF9CQVRURVJZX0xPVyA6IDA7Ci0Jc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJKHZhbCAmIFNTX1JFQURZKSA/IENTX0VWRU5UX1JFQURZX0NIQU5HRSA6IDA7Ci0JcmV0dXJuIDA7Ci19IC8qIHBjY2FyZF9nZXRfc3RhdHVzICovCi0KLXN0YXRpYyBpbnQgcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCi0JCQkJICBjb25maWdfaW5mb190ICpjb25maWcpCi17Ci0JY29uZmlnX3QgKmM7Ci0KLQlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0JaWYgKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpIHsKLQkJbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZ19pbmZvX3QpKTsKLQkJY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOwotCQljb25maWctPlZwcDEgPSBjb25maWctPlZwcDIgPSBzLT5zb2NrZXQuVnBwOwotCQljb25maWctPk9wdGlvbiA9IHMtPmNiX2Rldi0+c3Vib3JkaW5hdGUtPm51bWJlcjsKLQkJaWYgKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVNfQ09ORklHKSB7Ci0JCQljb25maWctPkF0dHJpYnV0ZXMgPSBDT05GX1ZBTElEX0NMSUVOVDsKLQkJCWNvbmZpZy0+SW50VHlwZSA9IElOVF9DQVJEQlVTOwotCQkJY29uZmlnLT5Bc3NpZ25lZElSUSA9IHMtPnBjbWNpYV9pcnE7Ci0JCQlpZiAoY29uZmlnLT5Bc3NpZ25lZElSUSkKLQkJCQljb25maWctPkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCQkJaWYgKHMtPmlvWzBdLnJlcykgewotCQkJCWNvbmZpZy0+QmFzZVBvcnQxID0gcy0+aW9bMF0ucmVzLT5zdGFydDsKLQkJCQljb25maWctPk51bVBvcnRzMSA9IHMtPmlvWzBdLnJlcy0+ZW5kIC0KLQkJCQkJY29uZmlnLT5CYXNlUG9ydDEgKyAxOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCi0JaWYgKHBfZGV2KSB7Ci0JCWMgPSBwX2Rldi0+ZnVuY3Rpb25fY29uZmlnOwotCQljb25maWctPkZ1bmN0aW9uID0gcF9kZXYtPmZ1bmM7Ci0JfSBlbHNlIHsKLQkJYyA9IE5VTEw7Ci0JCWNvbmZpZy0+RnVuY3Rpb24gPSAwOwotCX0KLQotCWlmICgoYyA9PSBOVUxMKSB8fCAhKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpIHsKLQkJY29uZmlnLT5BdHRyaWJ1dGVzID0gMDsKLQkJY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOwotCQljb25maWctPlZwcDEgPSBjb25maWctPlZwcDIgPSBzLT5zb2NrZXQuVnBwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljb25maWctPkF0dHJpYnV0ZXMgPSBjLT5BdHRyaWJ1dGVzIHwgQ09ORl9WQUxJRF9DTElFTlQ7Ci0JY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOwotCWNvbmZpZy0+VnBwMSA9IGNvbmZpZy0+VnBwMiA9IHMtPnNvY2tldC5WcHA7Ci0JY29uZmlnLT5JbnRUeXBlID0gYy0+SW50VHlwZTsKLQljb25maWctPkNvbmZpZ0Jhc2UgPSBjLT5Db25maWdCYXNlOwotCWNvbmZpZy0+U3RhdHVzID0gYy0+U3RhdHVzOwotCWNvbmZpZy0+UGluID0gYy0+UGluOwotCWNvbmZpZy0+Q29weSA9IGMtPkNvcHk7Ci0JY29uZmlnLT5PcHRpb24gPSBjLT5PcHRpb247Ci0JY29uZmlnLT5FeHRTdGF0dXMgPSBjLT5FeHRTdGF0dXM7Ci0JY29uZmlnLT5QcmVzZW50ID0gY29uZmlnLT5DYXJkVmFsdWVzID0gYy0+Q2FyZFZhbHVlczsKLQljb25maWctPklSUUF0dHJpYnV0ZXMgPSBjLT5pcnEuQXR0cmlidXRlczsKLQljb25maWctPkFzc2lnbmVkSVJRID0gcy0+cGNtY2lhX2lycTsKLQljb25maWctPkJhc2VQb3J0MSA9IGMtPmlvLkJhc2VQb3J0MTsKLQljb25maWctPk51bVBvcnRzMSA9IGMtPmlvLk51bVBvcnRzMTsKLQljb25maWctPkF0dHJpYnV0ZXMxID0gYy0+aW8uQXR0cmlidXRlczE7Ci0JY29uZmlnLT5CYXNlUG9ydDIgPSBjLT5pby5CYXNlUG9ydDI7Ci0JY29uZmlnLT5OdW1Qb3J0czIgPSBjLT5pby5OdW1Qb3J0czI7Ci0JY29uZmlnLT5BdHRyaWJ1dGVzMiA9IGMtPmlvLkF0dHJpYnV0ZXMyOwotCWNvbmZpZy0+SU9BZGRyTGluZXMgPSBjLT5pby5JT0FkZHJMaW5lczsKLQotCXJldHVybiAwOwotfSAvKiBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgVGhlc2UgbWFuYWdlIGEgcmluZyBidWZmZXIgb2YgZXZlbnRzIHBlbmRpbmcgZm9yIG9uZSB1c2VyIHByb2Nlc3MKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotc3RhdGljIGludCBxdWV1ZV9lbXB0eSh1c2VyX2luZm9fdCAqdXNlcikKLXsKLSAgICByZXR1cm4gKHVzZXItPmV2ZW50X2hlYWQgPT0gdXNlci0+ZXZlbnRfdGFpbCk7Ci19Ci0KLXN0YXRpYyBldmVudF90IGdldF9xdWV1ZWRfZXZlbnQodXNlcl9pbmZvX3QgKnVzZXIpCi17Ci0gICAgdXNlci0+ZXZlbnRfdGFpbCA9ICh1c2VyLT5ldmVudF90YWlsKzEpICUgTUFYX0VWRU5UUzsKLSAgICByZXR1cm4gdXNlci0+ZXZlbnRbdXNlci0+ZXZlbnRfdGFpbF07Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2V2ZW50KHVzZXJfaW5mb190ICp1c2VyLCBldmVudF90IGV2ZW50KQotewotICAgIHVzZXItPmV2ZW50X2hlYWQgPSAodXNlci0+ZXZlbnRfaGVhZCsxKSAlIE1BWF9FVkVOVFM7Ci0gICAgaWYgKHVzZXItPmV2ZW50X2hlYWQgPT0gdXNlci0+ZXZlbnRfdGFpbCkKLQl1c2VyLT5ldmVudF90YWlsID0gKHVzZXItPmV2ZW50X3RhaWwrMSkgJSBNQVhfRVZFTlRTOwotICAgIHVzZXItPmV2ZW50W3VzZXItPmV2ZW50X2hlYWRdID0gZXZlbnQ7Ci19Ci0KLXZvaWQgaGFuZGxlX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KQotewotICAgIHVzZXJfaW5mb190ICp1c2VyOwotICAgIGZvciAodXNlciA9IHMtPnVzZXI7IHVzZXI7IHVzZXIgPSB1c2VyLT5uZXh0KQotCXF1ZXVlX2V2ZW50KHVzZXIsIGV2ZW50KTsKLSAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnMtPnF1ZXVlKTsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIGJpbmRfcmVxdWVzdCgpIGFuZCBiaW5kX2RldmljZSgpIGFyZSBtZXJnZWQgYnkgbm93LiBSZWdpc3Rlcl9jbGllbnQoKQotICAgIGlzIGNhbGxlZCByaWdodCBhdCB0aGUgZW5kIG9mIGJpbmRfcmVxdWVzdCgpLCBkdXJpbmcgdGhlIGRyaXZlcidzCi0gICAgLT5hdHRhY2goKSBjYWxsLiBJbmRpdmlkdWFsIGRlc2NyaXB0aW9uczoKLQotICAgIGJpbmRfcmVxdWVzdCgpIGNvbm5lY3RzIGEgc29ja2V0IHRvIGEgcGFydGljdWxhciBjbGllbnQgZHJpdmVyLgotICAgIEl0IGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZGV2aWNlIElEIGluIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQKLSAgICBkcml2ZXJzLCBiaW5kcyBpdCB0byB0aGUgc29ja2V0LCBhbmQgdHJpZXMgdG8gY3JlYXRlIGFuIGluc3RhbmNlCi0gICAgb2YgdGhlIGRldmljZS4gIHVuYmluZF9yZXF1ZXN0KCkgZGVsZXRlcyBhIGRyaXZlciBpbnN0YW5jZS4KLQotICAgIEJpbmRfZGV2aWNlKCkgYXNzb2NpYXRlcyBhIGRldmljZSBkcml2ZXIgd2l0aCBhIHBhcnRpY3VsYXIgc29ja2V0LgotICAgIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBieSBEcml2ZXIgU2VydmljZXMgYWZ0ZXIgaXQgaGFzIGlkZW50aWZpZWQKLSAgICBhIG5ld2x5IGluc2VydGVkIGNhcmQuICBBbiBpbnN0YW5jZSBvZiB0aGF0IGRyaXZlciB3aWxsIHRoZW4gYmUKLSAgICBlbGlnaWJsZSB0byByZWdpc3RlciBhcyBhIGNsaWVudCBvZiB0aGlzIHNvY2tldC4KLQotICAgIFJlZ2lzdGVyX2NsaWVudCgpIHVzZXMgdGhlIGRldl9pbmZvX3QgaGFuZGxlIHRvIG1hdGNoIHRoZQotICAgIGNhbGxlciB3aXRoIGEgc29ja2V0LiAgVGhlIGRyaXZlciBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGJvdW5kCi0gICAgdG8gYSBzb2NrZXQgd2l0aCBiaW5kX2RldmljZSgpIC0tIGluIGZhY3QsIGJpbmRfZGV2aWNlKCkKLSAgICBhbGxvY2F0ZXMgdGhlIGNsaWVudCBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlIHVzZWQuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IGJpbmRfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgYmluZF9pbmZvX3QgKmJpbmRfaW5mbykKLXsKLQlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnY7Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwotCWludCByZXQgPSAwOwotCi0JcyA9IHBjbWNpYV9nZXRfc29ja2V0KHMpOwotCWlmICghcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcl9kZWJ1ZygiYmluZF9yZXF1ZXN0KCVkLCAnJXMnKVxuIiwgcy0+c29jaywKLQkgICAgICAgKGNoYXIgKiliaW5kX2luZm8tPmRldl9pbmZvKTsKLQotCXBfZHJ2ID0gZ2V0X3BjbWNpYV9kcml2ZXIoJmJpbmRfaW5mby0+ZGV2X2luZm8pOwotCWlmICghcF9kcnYpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcHV0OwotCX0KLQotCWlmICghdHJ5X21vZHVsZV9nZXQocF9kcnYtPm93bmVyKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wdXRfZHJpdmVyOwotCX0KLQotCW11dGV4X2xvY2soJnMtPm9wc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KSB7Ci0JCWlmIChwX2Rldi0+ZnVuYyA9PSBiaW5kX2luZm8tPmZ1bmN0aW9uKSB7Ci0JCQlpZiAoKHBfZGV2LT5kZXYuZHJpdmVyID09ICZwX2Rydi0+ZHJ2KSkgewotCQkJCWlmIChwX2Rldi0+Y2FyZG1ncikgewotCQkJCQkvKiBpZiB0aGVyZSdzIGFscmVhZHkgYSBkZXZpY2UKLQkJCQkJICogcmVnaXN0ZXJlZCwgYW5kIGl0IHdhcyByZWdpc3RlcmVkCi0JCQkJCSAqIGJ5IHVzZXJzcGFjZSBiZWZvcmUsIHdlIG5lZWQgdG8KLQkJCQkJICogcmV0dXJuIHRoZSAiaW5zdGFuY2UiLiAqLwotCQkJCQltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7Ci0JCQkJCWJpbmRfaW5mby0+aW5zdGFuY2UgPSBwX2RldjsKLQkJCQkJcmV0ID0gLUVCVVNZOwotCQkJCQlnb3RvIGVycl9wdXRfbW9kdWxlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIHRoZSBjb3JyZWN0IGRyaXZlciBtYW5hZ2VkIHRvIGJpbmQKLQkJCQkJICogaXRzZWxmIG1hZ2ljYWxseSB0byB0aGUgY29ycmVjdAotCQkJCQkgKiBkZXZpY2UuICovCi0JCQkJCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKLQkJCQkJcF9kZXYtPmNhcmRtZ3IgPSBwX2RydjsKLQkJCQkJcmV0ID0gMDsKLQkJCQkJZ290byBlcnJfcHV0X21vZHVsZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFwX2Rldi0+ZGV2LmRyaXZlcikgewotCQkJCS8qIHRoZXJlJ3MgYWxyZWFkeSBhIGRldmljZSBhdmFpbGFibGUgd2hlcmUKLQkJCQkgKiBubyBkZXZpY2UgaGFzIGJlZW4gYm91bmQgdG8geWV0LiBTbyB3ZSBkb24ndAotCQkJCSAqIG5lZWQgdG8gcmVnaXN0ZXIgYSBkZXZpY2UhICovCi0JCQkJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCQkJCWdvdG8gcmVzY2FuOwotCQkJfQotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKLQotCXBfZGV2ID0gcGNtY2lhX2RldmljZV9hZGQocywgYmluZF9pbmZvLT5mdW5jdGlvbik7Ci0JaWYgKCFwX2RldikgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycl9wdXRfbW9kdWxlOwotCX0KLQotcmVzY2FuOgotCXBfZGV2LT5jYXJkbWdyID0gcF9kcnY7Ci0KLQkvKiBpZiBhIGRyaXZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIHdlIGNhbiBhYm9ydCAqLwotCWlmIChwX2Rldi0+ZGV2LmRyaXZlcikKLQkJZ290byBlcnJfcHV0X21vZHVsZTsKLQotCS8qCi0JICogUHJldmVudCB0aGlzIHJhY2luZyB3aXRoIGEgY2FyZCBpbnNlcnRpb24uCi0JICovCi0JbXV0ZXhfbG9jaygmcy0+c2t0X211dGV4KTsKLQlyZXQgPSBidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzLT5za3RfbXV0ZXgpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3B1dF9tb2R1bGU7Ci0KLQkvKiBjaGVjayB3aGV0aGVyIHRoZSBkcml2ZXIgaW5kZWVkIG1hdGNoZWQuIEkgZG9uJ3QgY2FyZSBpZiB0aGlzCi0JICogaXMgcmFjeSBvciBub3QsIGJlY2F1c2UgaXQgY2FuIG9ubHkgaGFwcGVuIG9uIGNhcmRtZ3IgYWNjZXNzCi0JICogcGF0aHMuLi4KLQkgKi8KLQlpZiAoIShwX2Rldi0+ZGV2LmRyaXZlciA9PSAmcF9kcnYtPmRydikpCi0JCXBfZGV2LT5jYXJkbWdyID0gTlVMTDsKLQotIGVycl9wdXRfbW9kdWxlOgotCW1vZHVsZV9wdXQocF9kcnYtPm93bmVyKTsKLSBlcnJfcHV0X2RyaXZlcjoKLQlwdXRfZHJpdmVyKCZwX2Rydi0+ZHJ2KTsKLSBlcnJfcHV0OgotCXBjbWNpYV9wdXRfc29ja2V0KHMpOwotCi0JcmV0dXJuIHJldDsKLX0gLyogYmluZF9yZXF1ZXN0ICovCi0KLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotCi1zdGF0aWMgc3RydWN0IHBjaV9idXMgKnBjbWNpYV9sb29rdXBfYnVzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQotewotCWlmICghcyB8fCAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBzLT5jYl9kZXYtPnN1Ym9yZGluYXRlOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmZvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBiaW5kX2luZm9fdCAqYmluZF9pbmZvLCBpbnQgZmlyc3QpCi17Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwotCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKLQlpbnQgcmV0ID0gMDsKLQotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0JLyoKLQkgKiBTb21lIHVuYmVsaWV2YWJseSB1Z2x5IGNvZGUgdG8gYXNzb2NpYXRlIHRoZSBQQ0kgY2FyZGJ1cwotCSAqIGRldmljZSBhbmQgaXRzIGRyaXZlciB3aXRoIHRoZSBQQ01DSUEgImJpbmQiIGluZm9ybWF0aW9uLgotCSAqLwotCXsKLQkJc3RydWN0IHBjaV9idXMgKmJ1czsKLQotCQlidXMgPSBwY21jaWFfbG9va3VwX2J1cyhzKTsKLQkJaWYgKGJ1cykgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQkJCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JCQlsaXN0ID0gYnVzLT5kZXZpY2VzLm5leHQ7Ci0JCQl3aGlsZSAobGlzdCAhPSAmYnVzLT5kZXZpY2VzKSB7Ci0JCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwY2lfZGV2X2IobGlzdCk7Ci0JCQkJbGlzdCA9IGxpc3QtPm5leHQ7Ci0KLQkJCQlpZiAoZmlyc3QpIHsKLQkJCQkJZGV2ID0gcGRldjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLyogVHJ5IHRvIGhhbmRsZSAibmV4dCIgaGVyZSBzb21lIHdheT8gKi8KLQkJCX0KLQkJCWlmIChkZXYgJiYgZGV2LT5kcml2ZXIpIHsKLQkJCQlzdHJsY3B5KGJpbmRfaW5mby0+bmFtZSwgZGV2LT5kcml2ZXItPm5hbWUsIERFVl9OQU1FX0xFTik7Ci0JCQkJYmluZF9pbmZvLT5tYWpvciA9IDA7Ci0JCQkJYmluZF9pbmZvLT5taW5vciA9IDA7Ci0JCQkJYmluZF9pbmZvLT5uZXh0ID0gTlVMTDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCi0JbXV0ZXhfbG9jaygmcy0+b3BzX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfZGV2LCAmcy0+ZGV2aWNlc19saXN0LCBzb2NrZXRfZGV2aWNlX2xpc3QpIHsKLQkJaWYgKHBfZGV2LT5mdW5jID09IGJpbmRfaW5mby0+ZnVuY3Rpb24pIHsKLQkJCXBfZGV2ID0gcGNtY2lhX2dldF9kZXYocF9kZXYpOwotCQkJaWYgKCFwX2RldikKLQkJCQljb250aW51ZTsKLQkJCWdvdG8gZm91bmQ7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCXJldHVybiAtRU5PREVWOwotCi0gZm91bmQ6Ci0JbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCi0JcF9kcnYgPSB0b19wY21jaWFfZHJ2KHBfZGV2LT5kZXYuZHJpdmVyKTsKLQlpZiAocF9kcnYgJiYgIXBfZGV2LT5fbG9ja2VkKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gZXJyX3B1dDsKLQl9Ci0KLQlpZiAoIWZpcnN0KSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3B1dDsKLQl9Ci0KLQlzdHJsY3B5KGJpbmRfaW5mby0+bmFtZSwgZGV2X25hbWUoJnBfZGV2LT5kZXYpLCBERVZfTkFNRV9MRU4pOwotCWJpbmRfaW5mby0+bmV4dCA9IE5VTEw7Ci0KLSBlcnJfcHV0OgotCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBnZXRfZGV2aWNlX2luZm8gKi8KLQotCi1zdGF0aWMgaW50IGRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgc29ja2V0X3QgaSA9IGltaW5vcihpbm9kZSk7Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgdXNlcl9pbmZvX3QgKnVzZXI7Ci0gICAgc3RhdGljIGludCB3YXJuaW5nX3ByaW50ZWQ7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBwcl9kZWJ1ZygiZHNfb3Blbihzb2NrZXQgJWQpXG4iLCBpKTsKLQotICAgIGxvY2tfa2VybmVsKCk7Ci0gICAgcyA9IHBjbWNpYV9nZXRfc29ja2V0X2J5X25yKGkpOwotICAgIGlmICghcykgewotCSAgICByZXQgPSAtRU5PREVWOwotCSAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcyA9IHBjbWNpYV9nZXRfc29ja2V0KHMpOwotICAgIGlmICghcykgewotCSAgICByZXQgPSAtRU5PREVWOwotCSAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7Ci0JICAgIGlmIChzLT5wY21jaWFfc3RhdGUuYnVzeSkgewotCQkgICAgcGNtY2lhX3B1dF9zb2NrZXQocyk7Ci0JCSAgICByZXQgPSAtRUJVU1k7Ci0JCSAgICBnb3RvIG91dDsKLQkgICAgfQotCWVsc2UKLQkgICAgcy0+cGNtY2lhX3N0YXRlLmJ1c3kgPSAxOwotICAgIH0KLQotICAgIHVzZXIgPSBrbWFsbG9jKHNpemVvZih1c2VyX2luZm9fdCksIEdGUF9LRVJORUwpOwotICAgIGlmICghdXNlcikgewotCSAgICBwY21jaWFfcHV0X3NvY2tldChzKTsKLQkgICAgcmV0ID0gLUVOT01FTTsKLQkgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHVzZXItPmV2ZW50X3RhaWwgPSB1c2VyLT5ldmVudF9oZWFkID0gMDsKLSAgICB1c2VyLT5uZXh0ID0gcy0+dXNlcjsKLSAgICB1c2VyLT51c2VyX21hZ2ljID0gVVNFUl9NQUdJQzsKLSAgICB1c2VyLT5zb2NrZXQgPSBzOwotICAgIHMtPnVzZXIgPSB1c2VyOwotICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IHVzZXI7Ci0KLSAgICBpZiAoIXdhcm5pbmdfcHJpbnRlZCkgewotCSAgICBwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IERldGVjdGVkIGRlcHJlY2F0ZWQgUENNQ0lBIGlvY3RsICIKLQkJCSJ1c2FnZSBmcm9tIHByb2Nlc3M6ICVzLlxuIiwgY3VycmVudC0+Y29tbSk7Ci0JICAgIHByaW50ayhLRVJOX0lORk8gInBjbWNpYTogVGhpcyBpbnRlcmZhY2Ugd2lsbCBzb29uIGJlIHJlbW92ZWQgZnJvbSAiCi0JCQkidGhlIGtlcm5lbDsgcGxlYXNlIGV4cGVjdCBicmVha2FnZSB1bmxlc3MgeW91IHVwZ3JhZGUgIgotCQkJInRvIG5ldyB0b29scy5cbiIpOwotCSAgICBwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IHNlZSBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4LyIKLQkJCSJ1dGlscy9rZXJuZWwvcGNtY2lhL3BjbWNpYS5odG1sIGZvciBkZXRhaWxzLlxuIik7Ci0JICAgIHdhcm5pbmdfcHJpbnRlZCA9IDE7Ci0gICAgfQotCi0gICAgaWYgKGF0b21pY19yZWFkKCZzLT5wcmVzZW50KSkKLQlxdWV1ZV9ldmVudCh1c2VyLCBDU19FVkVOVF9DQVJEX0lOU0VSVElPTik7Ci1vdXQ6Ci0gICAgdW5sb2NrX2tlcm5lbCgpOwotICAgIHJldHVybiByZXQ7Ci19IC8qIGRzX29wZW4gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBpbnQgZHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICB1c2VyX2luZm9fdCAqdXNlciwgKipsaW5rOwotCi0gICAgcHJfZGVidWcoImRzX3JlbGVhc2Uoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGlub2RlKSk7Ci0KLSAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQotCWdvdG8gb3V0OwotCi0gICAgcyA9IHVzZXItPnNvY2tldDsKLQotICAgIC8qIFVubGluayB1c2VyIGRhdGEgc3RydWN0dXJlICovCi0gICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkKLQlzLT5wY21jaWFfc3RhdGUuYnVzeSA9IDA7Ci0KLSAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotICAgIGZvciAobGluayA9ICZzLT51c2VyOyAqbGluazsgbGluayA9ICYoKmxpbmspLT5uZXh0KQotCWlmICgqbGluayA9PSB1c2VyKQotCQlicmVhazsKLSAgICBpZiAobGluayA9PSBOVUxMKQotCWdvdG8gb3V0OwotICAgICpsaW5rID0gdXNlci0+bmV4dDsKLSAgICB1c2VyLT51c2VyX21hZ2ljID0gMDsKLSAgICBrZnJlZSh1c2VyKTsKLSAgICBwY21jaWFfcHV0X3NvY2tldChzKTsKLW91dDoKLSAgICByZXR1cm4gMDsKLX0gLyogZHNfcmVsZWFzZSAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIHNzaXplX3QgZHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotICAgIGludCByZXQ7Ci0KLSAgICBwcl9kZWJ1ZygiZHNfcmVhZChzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwotCi0gICAgaWYgKGNvdW50IDwgNCkKLQlyZXR1cm4gLUVJTlZBTDsKLQotICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgaWYgKENIRUNLX1VTRVIodXNlcikpCi0JcmV0dXJuIC1FSU87Ci0KLSAgICBzID0gdXNlci0+c29ja2V0OwotICAgIHJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzLT5xdWV1ZSwgIXF1ZXVlX2VtcHR5KHVzZXIpKTsKLSAgICBpZiAocmV0ID09IDApCi0JcmV0ID0gcHV0X3VzZXIoZ2V0X3F1ZXVlZF9ldmVudCh1c2VyKSwgKGludCBfX3VzZXIgKilidWYpID8gLUVGQVVMVCA6IDQ7Ci0KLSAgICByZXR1cm4gcmV0OwotfSAvKiBkc19yZWFkICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgc3NpemVfdCBkc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgIHByX2RlYnVnKCJkc193cml0ZShzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwotCi0gICAgaWYgKGNvdW50ICE9IDQpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKLQlyZXR1cm4gLUVCQURGOwotCi0gICAgcmV0dXJuIC1FSU87Ci19IC8qIGRzX3dyaXRlICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBObyBrZXJuZWwgbG9jayAtIGZpbmUgKi8KLXN0YXRpYyB1X2ludCBkc19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQotewotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotCi0gICAgcHJfZGVidWcoImRzX3BvbGwoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKLQotICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgaWYgKENIRUNLX1VTRVIodXNlcikpCi0JcmV0dXJuIFBPTExFUlI7Ci0gICAgcyA9IHVzZXItPnNvY2tldDsKLSAgICAvKgotICAgICAqIFdlIGRvbid0IGNoZWNrIGZvciBhIGRlYWQgc29ja2V0IGhlcmUgc2luY2UgdGhhdAotICAgICAqIHdpbGwgc2VuZCBjYXJkbWdyIGludG8gYW4gZW5kbGVzcyBzcGluLgotICAgICAqLwotICAgIHBvbGxfd2FpdChmaWxlLCAmcy0+cXVldWUsIHdhaXQpOwotICAgIGlmICghcXVldWVfZW1wdHkodXNlcikpCi0JcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0gICAgcmV0dXJuIDA7Ci19IC8qIGRzX3BvbGwgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBpbnQgZHNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwgdV9sb25nIGFyZykKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICB2b2lkIF9fdXNlciAqdWFyZyA9IChjaGFyIF9fdXNlciAqKWFyZzsKLSAgICB1X2ludCBzaXplOwotICAgIGludCByZXQsIGVycjsKLSAgICBkc19pb2N0bF9hcmdfdCAqYnVmOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotCi0gICAgcHJfZGVidWcoImRzX2lvY3RsKHNvY2tldCAlZCwgJSN4LCAlI2x4KVxuIiwgaW1pbm9yKGlub2RlKSwgY21kLCBhcmcpOwotCi0gICAgdXNlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICBpZiAoQ0hFQ0tfVVNFUih1c2VyKSkKLQlyZXR1cm4gLUVJTzsKLQotICAgIHMgPSB1c2VyLT5zb2NrZXQ7Ci0KLSAgICBzaXplID0gKGNtZCAmIElPQ1NJWkVfTUFTSykgPj4gSU9DU0laRV9TSElGVDsKLSAgICBpZiAoc2l6ZSA+IHNpemVvZihkc19pb2N0bF9hcmdfdCkpCi0JcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAvKiBQZXJtaXNzaW9uIGNoZWNrICovCi0gICAgaWYgKCEoY21kICYgSU9DX09VVCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JcmV0dXJuIC1FUEVSTTsKLQotICAgIGlmIChjbWQgJiBJT0NfSU4pIHsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWFyZywgc2l6ZSkpIHsKLQkgICAgcHJfZGVidWcoImRzX2lvY3RsKCk6IHZlcmlmeV9yZWFkID0gJWRcbiIsIC1FRkFVTFQpOwotCSAgICByZXR1cm4gLUVGQVVMVDsKLQl9Ci0gICAgfQotICAgIGlmIChjbWQgJiBJT0NfT1VUKSB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YXJnLCBzaXplKSkgewotCSAgICBwcl9kZWJ1ZygiZHNfaW9jdGwoKTogdmVyaWZ5X3dyaXRlID0gJWRcbiIsIC1FRkFVTFQpOwotCSAgICByZXR1cm4gLUVGQVVMVDsKLQl9Ci0gICAgfQotICAgIGJ1ZiA9IGttYWxsb2Moc2l6ZW9mKGRzX2lvY3RsX2FyZ190KSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFidWYpCi0JcmV0dXJuIC1FTk9NRU07Ci0KLSAgICBlcnIgPSByZXQgPSAwOwotCi0gICAgaWYgKGNtZCAmIElPQ19JTikgewotCWlmIChfX2NvcHlfZnJvbV91c2VyKChjaGFyICopYnVmLCB1YXJnLCBzaXplKSkgewotCSAgICBlcnIgPSAtRUZBVUxUOwotCSAgICBnb3RvIGZyZWVfb3V0OwotCX0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGNtZCkgewotICAgIGNhc2UgRFNfQURKVVNUX1JFU09VUkNFX0lORk86Ci0JcmV0ID0gcGNtY2lhX2FkanVzdF9yZXNvdXJjZV9pbmZvKCZidWYtPmFkanVzdCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfQ09ORklHVVJBVElPTl9JTkZPOgotCWlmIChidWYtPmNvbmZpZy5GdW5jdGlvbiAmJgotCSAgIChidWYtPmNvbmZpZy5GdW5jdGlvbiA+PSBzLT5mdW5jdGlvbnMpKQotCSAgICByZXQgPSAtRUlOVkFMOwotCWVsc2UgewotCSAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSBnZXRfcGNtY2lhX2RldmljZShzLCBidWYtPmNvbmZpZy5GdW5jdGlvbik7Ci0JICAgIHJldCA9IHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHMsIHBfZGV2LCAmYnVmLT5jb25maWcpOwotCSAgICBwY21jaWFfcHV0X2RldihwX2Rldik7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0ZJUlNUX1RVUExFOgotCW11dGV4X2xvY2soJnMtPnNrdF9tdXRleCk7Ci0JcGNtY2lhX3ZhbGlkYXRlX21lbShzKTsKLQltdXRleF91bmxvY2soJnMtPnNrdF9tdXRleCk7Ci0JcmV0ID0gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+dHVwbGUpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX05FWFRfVFVQTEU6Ci0JcmV0ID0gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHMsIEJJTkRfRk5fQUxMLCAmYnVmLT50dXBsZSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfVFVQTEVfREFUQToKLQlidWYtPnR1cGxlLlR1cGxlRGF0YSA9IGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YTsKLQlidWYtPnR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYtPnR1cGxlX3BhcnNlLmRhdGEpOwotCXJldCA9IHBjY2FyZF9nZXRfdHVwbGVfZGF0YShzLCAmYnVmLT50dXBsZSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19QQVJTRV9UVVBMRToKLQlidWYtPnR1cGxlLlR1cGxlRGF0YSA9IGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YTsKLQlyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUoJmJ1Zi0+dHVwbGUsICZidWYtPnR1cGxlX3BhcnNlLnBhcnNlKTsKLQlicmVhazsKLSAgICBjYXNlIERTX1JFU0VUX0NBUkQ6Ci0JcmV0ID0gcGNtY2lhX3Jlc2V0X2NhcmQocyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfU1RBVFVTOgotCSAgICBpZiAoYnVmLT5zdGF0dXMuRnVuY3Rpb24gJiYKLQkJKGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uID49IHMtPmZ1bmN0aW9ucykpCi0JCSAgICByZXQgPSAtRUlOVkFMOwotCSAgICBlbHNlIHsKLQkJICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IGdldF9wY21jaWFfZGV2aWNlKHMsIGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uKTsKLQkJICAgIHJldCA9IHBjY2FyZF9nZXRfc3RhdHVzKHMsIHBfZGV2LCAmYnVmLT5zdGF0dXMpOwotCQkgICAgcGNtY2lhX3B1dF9kZXYocF9kZXYpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotICAgIGNhc2UgRFNfVkFMSURBVEVfQ0lTOgotCW11dGV4X2xvY2soJnMtPnNrdF9tdXRleCk7Ci0JcGNtY2lhX3ZhbGlkYXRlX21lbShzKTsKLQltdXRleF91bmxvY2soJnMtPnNrdF9tdXRleCk7Ci0JcmV0ID0gcGNjYXJkX3ZhbGlkYXRlX2NpcyhzLCAmYnVmLT5jaXNpbmZvLkNoYWlucyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19TVVNQRU5EX0NBUkQ6Ci0JcGNtY2lhX3BhcnNlX3VldmVudHMocywgUENNQ0lBX1VFVkVOVF9TVVNQRU5EKTsKLQlicmVhazsKLSAgICBjYXNlIERTX1JFU1VNRV9DQVJEOgotCXBjbWNpYV9wYXJzZV91ZXZlbnRzKHMsIFBDTUNJQV9VRVZFTlRfUkVTVU1FKTsKLQlicmVhazsKLSAgICBjYXNlIERTX0VKRUNUX0NBUkQ6Ci0JcGNtY2lhX3BhcnNlX3VldmVudHMocywgUENNQ0lBX1VFVkVOVF9FSkVDVCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19JTlNFUlRfQ0FSRDoKLQlwY21jaWFfcGFyc2VfdWV2ZW50cyhzLCBQQ01DSUFfVUVWRU5UX0lOU0VSVCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19BQ0NFU1NfQ09ORklHVVJBVElPTl9SRUdJU1RFUjoKLQlpZiAoKGJ1Zi0+Y29uZl9yZWcuQWN0aW9uID09IENTX1dSSVRFKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCSAgICBlcnIgPSAtRVBFUk07Ci0JICAgIGdvdG8gZnJlZV9vdXQ7Ci0JfQotCi0JcmV0ID0gLUVJTlZBTDsKLQotCWlmICghKGJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24gJiYKLQkgICAgIChidWYtPmNvbmZfcmVnLkZ1bmN0aW9uID49IHMtPmZ1bmN0aW9ucykpKSB7Ci0JCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IGdldF9wY21jaWFfZGV2aWNlKHMsIGJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24pOwotCQlpZiAocF9kZXYpIHsKLQkJCXJldCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihwX2RldiwgJmJ1Zi0+Y29uZl9yZWcpOwotCQkJcGNtY2lhX3B1dF9kZXYocF9kZXYpOwotCQl9Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0ZJUlNUX1JFR0lPTjoKLSAgICBjYXNlIERTX0dFVF9ORVhUX1JFR0lPTjoKLSAgICBjYXNlIERTX0JJTkRfTVREOgotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gZnJlZV9vdXQ7Ci0JfSBlbHNlIHsKLQkJCXByaW50a19vbmNlKEtFUk5fV0FSTklORwotCQkJCSIyLjYuIGtlcm5lbHMgdXNlIHBjbWNpYW10ZCBpbnN0ZWFkIG9mIG1lbW9yeV9jcy5jIGFuZCBkbyBub3QgcmVxdWlyZSBzcGVjaWFsXG4iKTsKLQkJCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAiTVREIGhhbmRsaW5nIGFueSBtb3JlLlxuIik7Ci0JfQotCWVyciA9IC1FSU5WQUw7Ci0JZ290byBmcmVlX291dDsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9GSVJTVF9XSU5ET1c6Ci0JcmV0ID0gcGNtY2lhX2dldF93aW5kb3cocywgJmJ1Zi0+d2luX2luZm8uaGFuZGxlLCAxLAotCQkJJmJ1Zi0+d2luX2luZm8ud2luZG93KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9ORVhUX1dJTkRPVzoKLQlyZXQgPSBwY21jaWFfZ2V0X3dpbmRvdyhzLCAmYnVmLT53aW5faW5mby5oYW5kbGUsCi0JCQlidWYtPndpbl9pbmZvLmhhbmRsZSArIDEsICZidWYtPndpbl9pbmZvLndpbmRvdyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfTUVNX1BBR0U6Ci0JcmV0ID0gcGNtY2lhX2dldF9tZW1fcGFnZShzLCBidWYtPndpbl9pbmZvLmhhbmRsZSwKLQkJCSAgICZidWYtPndpbl9pbmZvLm1hcCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19SRVBMQUNFX0NJUzoKLQlyZXQgPSBwY21jaWFfcmVwbGFjZV9jaXMocywgYnVmLT5jaXNkdW1wLkRhdGEsIGJ1Zi0+Y2lzZHVtcC5MZW5ndGgpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfQklORF9SRVFVRVNUOgotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gZnJlZV9vdXQ7Ci0JfQotCWVyciA9IGJpbmRfcmVxdWVzdChzLCAmYnVmLT5iaW5kX2luZm8pOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0RFVklDRV9JTkZPOgotCWVyciA9IGdldF9kZXZpY2VfaW5mbyhzLCAmYnVmLT5iaW5kX2luZm8sIDEpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX05FWFRfREVWSUNFOgotCWVyciA9IGdldF9kZXZpY2VfaW5mbyhzLCAmYnVmLT5iaW5kX2luZm8sIDApOwotCWJyZWFrOwotICAgIGNhc2UgRFNfVU5CSU5EX1JFUVVFU1Q6Ci0JZXJyID0gMDsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWVyciA9IC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKChlcnIgPT0gMCkgJiYgKHJldCAhPSAwKSkgewotCXByX2RlYnVnKCJkc19pb2N0bDogcmV0ID0gJWRcbiIsIHJldCk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIC1FTk9ERVY6Ci0JY2FzZSAtRUlOVkFMOgotCWNhc2UgLUVCVVNZOgotCWNhc2UgLUVOT1NZUzoKLQkgICAgZXJyID0gcmV0OwotCSAgICBicmVhazsKLQljYXNlIC1FTk9NRU06Ci0JICAgIGVyciA9IC1FTk9TUEM7IGJyZWFrOwotCWNhc2UgLUVOT1NQQzoKLQkgICAgZXJyID0gLUVOT0RBVEE7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGVyciA9IC1FSU87IGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoY21kICYgSU9DX09VVCkgewotCWlmIChfX2NvcHlfdG9fdXNlcih1YXJnLCAoY2hhciAqKWJ1Ziwgc2l6ZSkpCi0JCWVyciA9IC1FRkFVTFQ7Ci0gICAgfQotCi1mcmVlX291dDoKLSAgICBrZnJlZShidWYpOwotICAgIHJldHVybiBlcnI7Ci19IC8qIGRzX2lvY3RsICovCi0KLXN0YXRpYyBsb25nIGRzX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0OwotCi0JbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBkc19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHNfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gZHNfb3BlbiwKLQkucmVsZWFzZQk9IGRzX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gZHNfdW5sb2NrZWRfaW9jdGwsCi0JLnJlYWQJCT0gZHNfcmVhZCwKLQkud3JpdGUJCT0gZHNfd3JpdGUsCi0JLnBvbGwJCT0gZHNfcG9sbCwKLX07Ci0KLXZvaWQgX19pbml0IHBjbWNpYV9zZXR1cF9pb2N0bCh2b2lkKQotewotCWludCBpOwotCi0JLyogU2V0IHVwIGNoYXJhY3RlciBkZXZpY2UgZm9yIHVzZXIgbW9kZSBjbGllbnRzICovCi0JaSA9IHJlZ2lzdGVyX2NocmRldigwLCAicGNtY2lhIiwgJmRzX2ZvcHMpOwotCWlmIChpIDwgMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJ1bmFibGUgdG8gZmluZCBhIGZyZWUgZGV2aWNlICMgZm9yICIKLQkJICAgICAgICJEcml2ZXIgU2VydmljZXMgKGVycm9yPSVkKVxuIiwgaSk7Ci0JZWxzZQotCQltYWpvcl9kZXYgPSBpOwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlwcm9jX3BjY2FyZCA9IHByb2NfbWtkaXIoImJ1cy9wY2NhcmQiLCBOVUxMKTsKLQlpZiAocHJvY19wY2NhcmQpCi0JCXByb2NfY3JlYXRlKCJkcml2ZXJzIiwgMCwgcHJvY19wY2NhcmQsICZwY2NhcmRfZHJpdmVyc19wcm9jX2ZvcHMpOwotI2VuZGlmCi19Ci0KLQotdm9pZCBfX2V4aXQgcGNtY2lhX2NsZWFudXBfaW9jdGwodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWlmIChwcm9jX3BjY2FyZCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVycyIsIHByb2NfcGNjYXJkKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImJ1cy9wY2NhcmQiLCBOVUxMKTsKLQl9Ci0jZW5kaWYKLQlpZiAobWFqb3JfZGV2ICE9IC0xKQotCQl1bnJlZ2lzdGVyX2NocmRldihtYWpvcl9kZXYsICJwY21jaWEiKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKaW5kZXggYTRjZDlhZC4uNTRhYTFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTU3LDQ3ICs1NiwyMyBAQAogfQogCiAKLS8qKiBhbGxvY19pb19zcGFjZQotICoKLSAqIFNwZWNpYWwgc3R1ZmYgZm9yIG1hbmFnaW5nIElPIHdpbmRvd3MsIGJlY2F1c2UgdGhleSBhcmUgc2NhcmNlCi0gKi8KLQotc3RhdGljIGludCBhbGxvY19pb19zcGFjZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdV9pbnQgYXR0ciwKLQkJCSAgdW5zaWduZWQgaW50ICpiYXNlLCB1bnNpZ25lZCBpbnQgbnVtLCB1X2ludCBsaW5lcykKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaW9fc3BhY2Uoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewotCXVuc2lnbmVkIGludCBhbGlnbjsKLQotCWFsaWduID0gKCpiYXNlKSA/IChsaW5lcyA/IDE8PGxpbmVzIDogMCkgOiAxOwotCWlmIChhbGlnbiAmJiAoYWxpZ24gPCBudW0pKSB7Ci0JCWlmICgqYmFzZSkgewotCQkJZGV2X2RiZygmcy0+ZGV2LCAib2RkIElPIHJlcXVlc3Q6IG51bSAlI3ggYWxpZ24gJSN4XG4iLAotCQkJICAgICAgIG51bSwgYWxpZ24pOwotCQkJYWxpZ24gPSAwOwotCQl9IGVsc2UKLQkJCXdoaWxlIChhbGlnbiAmJiAoYWxpZ24gPCBudW0pKQotCQkJCWFsaWduIDw8PSAxOwotCX0KLQlpZiAoKmJhc2UgJiB+KGFsaWduLTEpKSB7Ci0JCWRldl9kYmcoJnMtPmRldiwgIm9kZCBJTyByZXF1ZXN0OiBiYXNlICUjeCBhbGlnbiAlI3hcbiIsCi0JCSAgICAgICAqYmFzZSwgYWxpZ24pOwotCQlhbGlnbiA9IDA7Ci0JfQotCi0JcmV0dXJuIHMtPnJlc291cmNlX29wcy0+ZmluZF9pbyhzLCBhdHRyLCBiYXNlLCBudW0sIGFsaWduKTsKLX0gLyogYWxsb2NfaW9fc3BhY2UgKi8KLQotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2lvX3NwYWNlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgYmFzZSwKLQkJCSAgICAgdW5zaWduZWQgaW50IG51bSkKLXsKKwlyZXNvdXJjZV9zaXplX3QgbnVtID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWludCBpOwogCisJZGV2X2RiZygmcy0+ZGV2LCAicmVsZWFzZV9pb19zcGFjZSBmb3IgJXBSXG4iLCByZXMpOworCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykgewogCQlpZiAoIXMtPmlvW2ldLnJlcykKIAkJCWNvbnRpbnVlOwotCQlpZiAoKHMtPmlvW2ldLnJlcy0+c3RhcnQgPD0gYmFzZSkgJiYKLQkJICAgIChzLT5pb1tpXS5yZXMtPmVuZCA+PSBiYXNlK251bS0xKSkgeworCQlpZiAoKHMtPmlvW2ldLnJlcy0+c3RhcnQgPD0gcmVzLT5zdGFydCkgJiYKKwkJICAgIChzLT5pb1tpXS5yZXMtPmVuZCA+PSByZXMtPmVuZCkpIHsKIAkJCXMtPmlvW2ldLkluVXNlIC09IG51bTsKKwkJCWlmIChyZXMtPnBhcmVudCkKKwkJCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CisJCQlyZXMtPnN0YXJ0ID0gcmVzLT5lbmQgPSAwOworCQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CiAJCQkvKiBGcmVlIHRoZSB3aW5kb3cgaWYgbm8gb25lIGVsc2UgaXMgdXNpbmcgaXQgKi8KIAkJCWlmIChzLT5pb1tpXS5JblVzZSA9PSAwKSB7CiAJCQkJcmVsZWFzZV9yZXNvdXJjZShzLT5pb1tpXS5yZXMpOwpAQCAtMTA4LDI2ICs4Myw4MCBAQAogCX0KIH0gLyogcmVsZWFzZV9pb19zcGFjZSAqLwogCi0KLS8qKiBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIKKy8qKiBhbGxvY19pb19zcGFjZQogICoKLSAqIEFjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKCkgcmVhZHMgYW5kIHdyaXRlcyBjb25maWd1cmF0aW9uCi0gKiByZWdpc3RlcnMgaW4gYXR0cmlidXRlIG1lbW9yeS4gIE1lbW9yeSB3aW5kb3cgMCBpcyByZXNlcnZlZCBmb3IKLSAqIHRoaXMgYW5kIHRoZSB0dXBsZSByZWFkaW5nIHNlcnZpY2VzLgorICogU3BlY2lhbCBzdHVmZiBmb3IgbWFuYWdpbmcgSU8gd2luZG93cywgYmVjYXVzZSB0aGV5IGFyZSBzY2FyY2UKICAqLworc3RhdGljIGludCBhbGxvY19pb19zcGFjZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQl1bnNpZ25lZCBpbnQgbGluZXMpCit7CisJdW5zaWduZWQgaW50IGFsaWduOworCXVuc2lnbmVkIGludCBiYXNlID0gcmVzLT5zdGFydDsKKwl1bnNpZ25lZCBpbnQgbnVtID0gcmVzLT5lbmQ7CisJaW50IHJldDsKIAotaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCi0JCQkJCSBjb25mX3JlZ190ICpyZWcpCisJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0lPOworCisJZGV2X2RiZygmcy0+ZGV2LCAiYWxsb2NfaW9fc3BhY2UgcmVxdWVzdCBmb3IgJXBSLCAlZCBsaW5lc1xuIiwKKwkJcmVzLCBsaW5lcyk7CisKKwlhbGlnbiA9IGJhc2UgPyAobGluZXMgPyAxPDxsaW5lcyA6IDApIDogMTsKKwlpZiAoYWxpZ24gJiYgKGFsaWduIDwgbnVtKSkgeworCQlpZiAoYmFzZSkgeworCQkJZGV2X2RiZygmcy0+ZGV2LCAib2RkIElPIHJlcXVlc3RcbiIpOworCQkJYWxpZ24gPSAwOworCQl9IGVsc2UKKwkJCXdoaWxlIChhbGlnbiAmJiAoYWxpZ24gPCBudW0pKQorCQkJCWFsaWduIDw8PSAxOworCX0KKwlpZiAoYmFzZSAmIH4oYWxpZ24tMSkpIHsKKwkJZGV2X2RiZygmcy0+ZGV2LCAib2RkIElPIHJlcXVlc3RcbiIpOworCQlhbGlnbiA9IDA7CisJfQorCisJcmV0ID0gcy0+cmVzb3VyY2Vfb3BzLT5maW5kX2lvKHMsIHJlcy0+ZmxhZ3MsICZiYXNlLCBudW0sIGFsaWduLAorCQkJCSZyZXMtPnBhcmVudCk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZzLT5kZXYsICJhbGxvY19pb19zcGFjZSByZXF1ZXN0IGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXMtPnN0YXJ0ID0gYmFzZTsKKwlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyBudW0gLSAxOworCisJaWYgKHJlcy0+cGFyZW50KSB7CisJCXJldCA9IHJlcXVlc3RfcmVzb3VyY2UocmVzLT5wYXJlbnQsIHJlcyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZzLT5kZXYsCisJCQkJInJlcXVlc3RfcmVzb3VyY2UgJXBSIGZhaWxlZDogJWRcbiIsIHJlcywgcmV0KTsKKwkJCXJlcy0+cGFyZW50ID0gTlVMTDsKKwkJCXJlbGVhc2VfaW9fc3BhY2UocywgcmVzKTsKKwkJfQorCX0KKwlkZXZfZGJnKCZzLT5kZXYsICJhbGxvY19pb19zcGFjZSByZXF1ZXN0IHJlc3VsdCAlZDogJXBSXG4iLCByZXQsIHJlcyk7CisJcmV0dXJuIHJldDsKK30gLyogYWxsb2NfaW9fc3BhY2UgKi8KKworCisvKioKKyAqIHBjbWNpYV9hY2Nlc3NfY29uZmlnKCkgLSByZWFkIG9yIHdyaXRlIGNhcmQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyAqCisgKiBwY21jaWFfYWNjZXNzX2NvbmZpZygpIHJlYWRzIGFuZCB3cml0ZXMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgaW4KKyAqIGF0dHJpYnV0ZSBtZW1vcnkuICBNZW1vcnkgd2luZG93IDAgaXMgcmVzZXJ2ZWQgZm9yIHRoaXMgYW5kIHRoZSB0dXBsZQorICogcmVhZGluZyBzZXJ2aWNlcy4gRHJpdmVycyBtdXN0IHVzZSBwY21jaWFfcmVhZF9jb25maWdfYnl0ZSgpIG9yCisgKiBwY21jaWFfd3JpdGVfY29uZmlnX2J5dGUoKS4KKyAqLworc3RhdGljIGludCBwY21jaWFfYWNjZXNzX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJb2ZmX3Qgd2hlcmUsIHU4ICp2YWwsCisJCQkJaW50ICgqYWNjZXNzZikgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkJCQkJaW50IGF0dHIsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJCQkJdW5zaWduZWQgaW50IGxlbiwgdm9pZCAqcHRyKSkKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKIAljb25maWdfdCAqYzsKIAlpbnQgYWRkcjsKLQl1X2NoYXIgdmFsOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFwX2RldiB8fCAhcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlzID0gcF9kZXYtPnNvY2tldDsKIAogCW11dGV4X2xvY2soJnMtPm9wc19tdXRleCk7CkBAIC0xMzksNDQgKzE2OCw1NyBAQAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlhZGRyID0gKGMtPkNvbmZpZ0Jhc2UgKyByZWctPk9mZnNldCkgPj4gMTsKKwlhZGRyID0gKGMtPkNvbmZpZ0Jhc2UgKyB3aGVyZSkgPj4gMTsKIAotCXN3aXRjaCAocmVnLT5BY3Rpb24pIHsKLQljYXNlIENTX1JFQUQ6Ci0JCXJldCA9IHBjbWNpYV9yZWFkX2Npc19tZW0ocywgMSwgYWRkciwgMSwgJnZhbCk7Ci0JCXJlZy0+VmFsdWUgPSB2YWw7Ci0JCWJyZWFrOwotCWNhc2UgQ1NfV1JJVEU6Ci0JCXZhbCA9IHJlZy0+VmFsdWU7Ci0JCXBjbWNpYV93cml0ZV9jaXNfbWVtKHMsIDEsIGFkZHIsIDEsICZ2YWwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZGJnKCZzLT5kZXYsICJJbnZhbGlkIGNvbmYgcmVnaXN0ZXIgcmVxdWVzdFxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KKwlyZXQgPSBhY2Nlc3NmKHMsIDEsIGFkZHIsIDEsIHZhbCk7CisKIAltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7CisKIAlyZXR1cm4gcmV0OwotfSAvKiBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIgKi8KLUVYUE9SVF9TWU1CT0wocGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKTsKK30gLyogcGNtY2lhX2FjY2Vzc19jb25maWcgKi8KKworCisvKioKKyAqIHBjbWNpYV9yZWFkX2NvbmZpZ19ieXRlKCkgLSByZWFkIGEgYnl0ZSBmcm9tIGEgY2FyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKgorICogcGNtY2lhX3JlYWRfY29uZmlnX2J5dGUoKSByZWFkcyBhIGJ5dGUgZnJvbSBhIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW4KKyAqIGF0dHJpYnV0ZSBtZW1vcnkuCisgKi8KK2ludCBwY21jaWFfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIG9mZl90IHdoZXJlLCB1OCAqdmFsKQoreworCXJldHVybiBwY21jaWFfYWNjZXNzX2NvbmZpZyhwX2Rldiwgd2hlcmUsIHZhbCwgcGNtY2lhX3JlYWRfY2lzX21lbSk7Cit9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWFkX2NvbmZpZ19ieXRlKTsKKworCisvKioKKyAqIHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZSgpIC0gd3JpdGUgYSBieXRlIHRvIGEgY2FyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKgorICogcGNtY2lhX3dyaXRlX2NvbmZpZ19ieXRlKCkgd3JpdGVzIGEgYnl0ZSB0byBhIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW4KKyAqIGF0dHJpYnV0ZSBtZW1vcnkuCisgKi8KK2ludCBwY21jaWFfd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBvZmZfdCB3aGVyZSwgdTggdmFsKQoreworCXJldHVybiBwY21jaWFfYWNjZXNzX2NvbmZpZyhwX2Rldiwgd2hlcmUsICZ2YWwsIHBjbWNpYV93cml0ZV9jaXNfbWVtKTsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3dyaXRlX2NvbmZpZ19ieXRlKTsKIAogCiBpbnQgcGNtY2lhX21hcF9tZW1fcGFnZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIHdpbmRvd19oYW5kbGVfdCB3aCwKLQkJCW1lbXJlcV90ICpyZXEpCisJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHdoOworCXVuc2lnbmVkIGludCB3OwogCWludCByZXQ7CiAKLQl3aC0tOwotCWlmICh3aCA+PSBNQVhfV0lOKQorCXcgPSAoKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMgJiBXSU5fRkxBR1NfUkVRKSA+PiAyKSAtIDE7CisJaWYgKHcgPj0gTUFYX1dJTikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHJlcS0+UGFnZSAhPSAwKSB7Ci0JCWRldl9kYmcoJnMtPmRldiwgImZhaWx1cmU6IHJlcXVlc3RlZCBwYWdlIGlzIHplcm9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCXMtPndpblt3aF0uY2FyZF9zdGFydCA9IHJlcS0+Q2FyZE9mZnNldDsKLQlyZXQgPSBzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZzLT53aW5bd2hdKTsKKwlzLT53aW5bd10uY2FyZF9zdGFydCA9IG9mZnNldDsKKwlyZXQgPSBzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZzLT53aW5bd10pOwogCWlmIChyZXQpCiAJCWRldl93YXJuKCZzLT5kZXYsICJmYWlsZWQgdG8gc2V0X21lbV9tYXBcbiIpOwogCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKQEAgLTMxNiwzMiArMzU4LDI2IEBACiAgKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIHBvcnQgcmFuZ2VzIGFnYWluc3QgdGhlIGN1cnJlbnQgc29ja2V0CiAgKiB2YWx1ZXMuCiAgKi8KLXN0YXRpYyBpbnQgcGNtY2lhX3JlbGVhc2VfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKQorc3RhdGljIGludCBwY21jaWFfcmVsZWFzZV9pbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OwogCWludCByZXQgPSAtRUlOVkFMOwogCWNvbmZpZ190ICpjOwogCiAJbXV0ZXhfbG9jaygmcy0+b3BzX211dGV4KTsKLQljID0gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKLQogCWlmICghcF9kZXYtPl9pbykKIAkJZ290byBvdXQ7CiAKKwljID0gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKKworCXJlbGVhc2VfaW9fc3BhY2UocywgJmMtPmlvWzBdKTsKKworCWlmIChjLT5pb1sxXS5lbmQpCisJCXJlbGVhc2VfaW9fc3BhY2UocywgJmMtPmlvWzFdKTsKKwogCXBfZGV2LT5faW8gPSAwOwotCi0JaWYgKChjLT5pby5CYXNlUG9ydDEgIT0gcmVxLT5CYXNlUG9ydDEpIHx8Ci0JICAgIChjLT5pby5OdW1Qb3J0czEgIT0gcmVxLT5OdW1Qb3J0czEpIHx8Ci0JICAgIChjLT5pby5CYXNlUG9ydDIgIT0gcmVxLT5CYXNlUG9ydDIpIHx8Ci0JICAgIChjLT5pby5OdW1Qb3J0czIgIT0gcmVxLT5OdW1Qb3J0czIpKQotCQlnb3RvIG91dDsKLQogCWMtPnN0YXRlICY9IH5DT05GSUdfSU9fUkVROwogCi0JcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MSwgcmVxLT5OdW1Qb3J0czEpOwotCWlmIChyZXEtPk51bVBvcnRzMikKLQkJcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MiwgcmVxLT5OdW1Qb3J0czIpOwotCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCkBAIC0zNDksMTkgKzM4NSwyMiBAQAogfSAvKiBwY21jaWFfcmVsZWFzZV9pbyAqLwogCiAKLWludCBwY21jaWFfcmVsZWFzZV93aW5kb3coc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB3aW5kb3dfaGFuZGxlX3Qgd2gpCitpbnQgcGNtY2lhX3JlbGVhc2Vfd2luZG93KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldiwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OwogCXBjY2FyZF9tZW1fbWFwICp3aW47CisJdW5zaWduZWQgaW50IHc7CiAKLQl3aC0tOwotCWlmICh3aCA+PSBNQVhfV0lOKQorCWRldl9kYmcoJnBfZGV2LT5kZXYsICJyZWxlYXNpbmcgd2luZG93ICVwUlxuIiwgcmVzKTsKKworCXcgPSAoKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMgJiBXSU5fRkxBR1NfUkVRKSA+PiAyKSAtIDE7CisJaWYgKHcgPj0gTUFYX1dJTikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwotCXdpbiA9ICZzLT53aW5bd2hdOworCXdpbiA9ICZzLT53aW5bd107CiAKLQlpZiAoIShwX2Rldi0+X3dpbiAmIENMSUVOVF9XSU5fUkVRKHdoKSkpIHsKKwlpZiAoIShwX2Rldi0+X3dpbiAmIENMSUVOVF9XSU5fUkVRKHcpKSkgewogCQlkZXZfZGJnKCZzLT5kZXYsICJub3QgcmVsZWFzaW5nIHVua25vd24gd2luZG93XG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3MCwxNSArNDA5LDE2IEBACiAJLyogU2h1dCBkb3duIG1lbW9yeSB3aW5kb3cgKi8KIAl3aW4tPmZsYWdzICY9IH5NQVBfQUNUSVZFOwogCXMtPm9wcy0+c2V0X21lbV9tYXAocywgd2luKTsKLQlzLT5zdGF0ZSAmPSB+U09DS0VUX1dJTl9SRVEod2gpOworCXMtPnN0YXRlICY9IH5TT0NLRVRfV0lOX1JFUSh3KTsKIAogCS8qIFJlbGVhc2Ugc3lzdGVtIG1lbW9yeSAqLwogCWlmICh3aW4tPnJlcykgeworCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJCXJlbGVhc2VfcmVzb3VyY2Uod2luLT5yZXMpOwogCQlrZnJlZSh3aW4tPnJlcyk7CiAJCXdpbi0+cmVzID0gTlVMTDsKIAl9Ci0JcF9kZXYtPl93aW4gJj0gfkNMSUVOVF9XSU5fUkVRKHdoKTsKKwlwX2Rldi0+X3dpbiAmPSB+Q0xJRU5UX1dJTl9SRVEodyk7CiAJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CkBAIC00NzMsMTMgKzUxMywxMyBAQAogCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19FU1IpPj4xLCAxLCAmYy0+RXh0U3RhdHVzKTsKIAl9CiAJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9CQVNFXzApIHsKLQkJdV9jaGFyIGIgPSBjLT5pby5CYXNlUG9ydDEgJiAweGZmOworCQl1OCBiID0gYy0+aW9bMF0uc3RhcnQgJiAweGZmOwogCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT0JBU0VfMCk+PjEsIDEsICZiKTsKLQkJYiA9IChjLT5pby5CYXNlUG9ydDEgPj4gOCkgJiAweGZmOworCQliID0gKGMtPmlvWzBdLnN0YXJ0ID4+IDgpICYgMHhmZjsKIAkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfSU9CQVNFXzEpPj4xLCAxLCAmYik7CiAJfQogCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0lPU0laRSkgewotCQl1X2NoYXIgYiA9IGMtPmlvLk51bVBvcnRzMSArIGMtPmlvLk51bVBvcnRzMiAtIDE7CisJCXU4IGIgPSByZXNvdXJjZV9zaXplKCZjLT5pb1swXSkgKyByZXNvdXJjZV9zaXplKCZjLT5pb1sxXSkgLSAxOwogCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT1NJWkUpPj4xLCAxLCAmYik7CiAJfQogCkBAIC01MTMsMjggKzU1MywyOSBAQAogRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKTsKIAogCi0vKiogcGNtY2lhX3JlcXVlc3RfaW8KKy8qKgorICogcGNtY2lhX3JlcXVlc3RfaW8oKSAtIGF0dGVtcHQgdG8gcmVzZXJ2ZSBwb3J0IHJhbmdlcyBmb3IgUENNQ0lBIGRldmljZXMKICAqCi0gKiBSZXF1ZXN0X2lvKCkgcmVzZXJ2ZXMgcmFuZ2VzIG9mIHBvcnQgYWRkcmVzc2VzIGZvciBhIHNvY2tldC4KLSAqIEkgaGF2ZSBub3QgaW1wbGVtZW50ZWQgcmFuZ2Ugc2hhcmluZyBvciBhbGlhcyBhZGRyZXNzaW5nLgorICogcGNtY2lhX3JlcXVlc3RfaW8oKSBhdHRlcHRzIHRvIHJlc2VydmUgdGhlIElPIHBvcnQgcmFuZ2VzIHNwZWNpZmllZCBpbgorICogJnN0cnVjdCBwY21jaWFfZGV2aWNlIEBwX2Rldi0+cmVzb3VyY2VbMF0gYW5kIEBwX2Rldi0+cmVzb3VyY2VbMV0uIFRoZQorICogInN0YXJ0IiB2YWx1ZSBpcyB0aGUgcmVxdWVzdGVkIHN0YXJ0IG9mIHRoZSBJTyBwb3J0IHJlc291cmNlOyAiZW5kIgorICogcmVmbGVjdHMgdGhlIG51bWJlciBvZiBwb3J0cyByZXF1ZXN0ZWQuIFRoZSBudW1iZXIgb2YgSU8gbGluZXMgcmVxdWVzdGVkCisgKiBpcyBzcGVjaWZpZWQgaW4gJnN0cnVjdCBwY21jaWFfZGV2aWNlIEBwX2Rldi0+aW9fbGluZXMuCiAgKi8KLWludCBwY21jaWFfcmVxdWVzdF9pbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGlvX3JlcV90ICpyZXEpCitpbnQgcGNtY2lhX3JlcXVlc3RfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKLQljb25maWdfdCAqYzsKKwljb25maWdfdCAqYyA9IHBfZGV2LT5mdW5jdGlvbl9jb25maWc7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOworCWRldl9kYmcoJnMtPmRldiwgInBjbWNpYV9yZXF1ZXN0X2lvOiAlcFIgLCAlcFIiLCAmYy0+aW9bMF0sICZjLT5pb1sxXSk7CiAKIAlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkgewotCQlkZXZfZGJnKCZzLT5kZXYsICJObyBjYXJkIHByZXNlbnRcbiIpOworCQlkZXZfZGJnKCZzLT5kZXYsICJwY21jaWFfcmVxdWVzdF9pbzogTm8gY2FyZCBwcmVzZW50XG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFyZXEpCi0JCWdvdG8gb3V0OwotCi0JYyA9IHBfZGV2LT5mdW5jdGlvbl9jb25maWc7CiAJaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkgewogCQlkZXZfZGJnKCZzLT5kZXYsICJDb25maWd1cmF0aW9uIGlzIGxvY2tlZFxuIik7CiAJCWdvdG8gb3V0OwpAQCAtNTQzLDQwICs1ODQsMjUgQEAKIAkJZGV2X2RiZygmcy0+ZGV2LCAiSU8gYWxyZWFkeSBjb25maWd1cmVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmIChyZXEtPkF0dHJpYnV0ZXMxICYgKElPX1NIQVJFRCB8IElPX0ZPUkNFX0FMSUFTX0FDQ0VTUykpIHsKLQkJZGV2X2RiZygmcy0+ZGV2LCAiYmFkIGF0dHJpYnV0ZSBzZXR0aW5nIGZvciBJTyByZWdpb24gMVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoKHJlcS0+TnVtUG9ydHMyID4gMCkgJiYKLQkgICAgKHJlcS0+QXR0cmlidXRlczIgJiAoSU9fU0hBUkVEIHwgSU9fRk9SQ0VfQUxJQVNfQUNDRVNTKSkpIHsKLQkJZGV2X2RiZygmcy0+ZGV2LCAiYmFkIGF0dHJpYnV0ZSBzZXR0aW5nIGZvciBJTyByZWdpb24gMlxuIik7Ci0JCWdvdG8gb3V0OwotCX0KIAotCWRldl9kYmcoJnMtPmRldiwgInRyeWluZyB0byBhbGxvY2F0ZSByZXNvdXJjZSAxXG4iKTsKLQlyZXQgPSBhbGxvY19pb19zcGFjZShzLCByZXEtPkF0dHJpYnV0ZXMxLCAmcmVxLT5CYXNlUG9ydDEsCi0JCQkgICAgIHJlcS0+TnVtUG9ydHMxLCByZXEtPklPQWRkckxpbmVzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9kYmcoJnMtPmRldiwgImFsbG9jYXRpb24gb2YgcmVzb3VyY2UgMSBmYWlsZWRcbiIpOworCXJldCA9IGFsbG9jX2lvX3NwYWNlKHMsICZjLT5pb1swXSwgcF9kZXYtPmlvX2xpbmVzKTsKKwlpZiAocmV0KQogCQlnb3RvIG91dDsKLQl9CiAKLQlpZiAocmVxLT5OdW1Qb3J0czIpIHsKLQkJZGV2X2RiZygmcy0+ZGV2LCAidHJ5aW5nIHRvIGFsbG9jYXRlIHJlc291cmNlIDJcbiIpOwotCQlyZXQgPSBhbGxvY19pb19zcGFjZShzLCByZXEtPkF0dHJpYnV0ZXMyLCAmcmVxLT5CYXNlUG9ydDIsCi0JCQkJICAgICByZXEtPk51bVBvcnRzMiwgcmVxLT5JT0FkZHJMaW5lcyk7CisJaWYgKGMtPmlvWzFdLmVuZCkgeworCQlyZXQgPSBhbGxvY19pb19zcGFjZShzLCAmYy0+aW9bMV0sIHBfZGV2LT5pb19saW5lcyk7CiAJCWlmIChyZXQpIHsKLQkJCWRldl9kYmcoJnMtPmRldiwgImFsbG9jYXRpb24gb2YgcmVzb3VyY2UgMiBmYWlsZWRcbiIpOwotCQkJcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MSwgcmVxLT5OdW1Qb3J0czEpOworCQkJcmVsZWFzZV9pb19zcGFjZShzLCAmYy0+aW9bMF0pOwogCQkJZ290byBvdXQ7CiAJCX0KLQl9CisJfSBlbHNlCisJCWMtPmlvWzFdLnN0YXJ0ID0gMDsKIAotCWMtPmlvID0gKnJlcTsKIAljLT5zdGF0ZSB8PSBDT05GSUdfSU9fUkVROwogCXBfZGV2LT5faW8gPSAxOwotCWRldl9kYmcoJnMtPmRldiwgImFsbG9jYXRpbmcgcmVzb3VyY2VzIHN1Y2NlZWRlZDogJWRcbiIsIHJldCk7CiAKKwlkZXZfZGJnKCZzLT5kZXYsICJwY21jaWFfcmVxdWVzdF9pbyBzdWNjZWVkZWQ6ICVwUiAsICVwUiIsCisJCSZjLT5pb1swXSwgJmMtPmlvWzFdKTsKIG91dDoKIAltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7CiAKQEAgLTY1MSw3ICs2NzcsNyBAQAogI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKIAogLyogbWFzayBvZiBJUlFzIGFscmVhZHkgcmVzZXJ2ZWQgYnkgb3RoZXIgY2FyZHMsIHdlIHNob3VsZCBhdm9pZCB1c2luZyB0aGVtICovCi1zdGF0aWMgdTggcGNtY2lhX3VzZWRfaXJxW05SX0lSUVNdOworc3RhdGljIHU4IHBjbWNpYV91c2VkX2lycVszMl07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0ZXN0X2FjdGlvbihpbnQgY3BsLCB2b2lkICpkZXZfaWQpCiB7CkBAIC02NzQsNiArNzAwLDkgQEAKIAlmb3IgKHRyeSA9IDA7IHRyeSA8IDY0OyB0cnkrKykgewogCQlpcnEgPSB0cnkgJSAzMjsKIAorCQlpZiAoaXJxID4gTlJfSVJRUykKKwkJCWNvbnRpbnVlOworCiAJCS8qIG1hcmtlZCBhcyBhdmFpbGFibGUgYnkgZHJpdmVyLCBub3QgYmxvY2tlZCBieSB1c2Vyc3BhY2U/ICovCiAJCWlmICghKChtYXNrID4+IGlycSkgJiAxKSkKIAkJCWNvbnRpbnVlOwpAQCAtNzY3LDIzICs3OTYsMTggQEAKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7CiAJcGNjYXJkX21lbV9tYXAgKndpbjsKIAl1X2xvbmcgYWxpZ247CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHc7CiAKIAlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkgewogCQlkZXZfZGJnKCZzLT5kZXYsICJObyBjYXJkIHByZXNlbnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKHJlcS0+QXR0cmlidXRlcyAmIChXSU5fUEFHRUQgfCBXSU5fU0hBUkVEKSkgewotCQlkZXZfZGJnKCZzLT5kZXYsICJiYWQgYXR0cmlidXRlIHNldHRpbmcgZm9yIGlvbWVtIHJlZ2lvblxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAogCS8qIFdpbmRvdyBzaXplIGRlZmF1bHRzIHRvIHNtYWxsZXN0IGF2YWlsYWJsZSAqLwogCWlmIChyZXEtPlNpemUgPT0gMCkKIAkJcmVxLT5TaXplID0gcy0+bWFwX3NpemU7Ci0JYWxpZ24gPSAoKChzLT5mZWF0dXJlcyAmIFNTX0NBUF9NRU1fQUxJR04pIHx8Ci0JCSAgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9TVFJJQ1RfQUxJR04pKSA/Ci0JCSByZXEtPlNpemUgOiBzLT5tYXBfc2l6ZSk7CisJYWxpZ24gPSAocy0+ZmVhdHVyZXMgJiBTU19DQVBfTUVNX0FMSUdOKSA/IHJlcS0+U2l6ZSA6IHMtPm1hcF9zaXplOwogCWlmIChyZXEtPlNpemUgJiAocy0+bWFwX3NpemUtMSkpIHsKIAkJZGV2X2RiZygmcy0+ZGV2LCAiaW52YWxpZCBtYXAgc2l6ZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzk3LDIwICs4MjEsMjEgQEAKIAkJYWxpZ24gPSAwOwogCiAJLyogQWxsb2NhdGUgc3lzdGVtIG1lbW9yeSB3aW5kb3cgKi8KKwltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCWZvciAodyA9IDA7IHcgPCBNQVhfV0lOOyB3KyspCiAJCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1dJTl9SRVEodykpKQogCQkJYnJlYWs7CiAJaWYgKHcgPT0gTUFYX1dJTikgewogCQlkZXZfZGJnKCZzLT5kZXYsICJhbGwgd2luZG93cyBhcmUgdXNlZCBhbHJlYWR5XG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCXdpbiA9ICZzLT53aW5bd107CiAKIAlpZiAoIShzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSkgewogCQl3aW4tPnJlcyA9IHBjbWNpYV9maW5kX21lbV9yZWdpb24ocmVxLT5CYXNlLCByZXEtPlNpemUsIGFsaWduLAotCQkJCQkJICAgICAgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9NQVBfQkVMT1dfMU1CKSwgcyk7CisJCQkJCQkwLCBzKTsKIAkJaWYgKCF3aW4tPnJlcykgewogCQkJZGV2X2RiZygmcy0+ZGV2LCAiYWxsb2NhdGluZyBtZW0gcmVnaW9uIGZhaWxlZFxuIik7CiAJCQltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7CkBAIC04MjEsMTYgKzg0Niw4IEBACiAKIAkvKiBDb25maWd1cmUgdGhlIHNvY2tldCBjb250cm9sbGVyICovCiAJd2luLT5tYXAgPSB3KzE7Ci0Jd2luLT5mbGFncyA9IDA7CisJd2luLT5mbGFncyA9IHJlcS0+QXR0cmlidXRlczsKIAl3aW4tPnNwZWVkID0gcmVxLT5BY2Nlc3NTcGVlZDsKLQlpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX01FTU9SWV9UWVBFKQotCQl3aW4tPmZsYWdzIHw9IE1BUF9BVFRSSUI7Ci0JaWYgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9FTkFCTEUpCi0JCXdpbi0+ZmxhZ3MgfD0gTUFQX0FDVElWRTsKLQlpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX0RBVEFfV0lEVEhfMTYpCi0JCXdpbi0+ZmxhZ3MgfD0gTUFQXzE2QklUOwotCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fVVNFX1dBSVQpCi0JCXdpbi0+ZmxhZ3MgfD0gTUFQX1VTRV9XQUlUOwogCXdpbi0+Y2FyZF9zdGFydCA9IDA7CiAKIAlpZiAocy0+b3BzLT5zZXRfbWVtX21hcChzLCB3aW4pICE9IDApIHsKQEAgLTg0Niw4ICs4NjMsMjEgQEAKIAllbHNlCiAJCXJlcS0+QmFzZSA9IHdpbi0+cmVzLT5zdGFydDsKIAorCS8qIGNvbnZlcnQgdG8gbmV3LXN0eWxlIHJlc291cmNlcyAqLworCXJlcyA9IHBfZGV2LT5yZXNvdXJjZVt3ICsgTUFYX0lPX1dJTl07CisJcmVzLT5zdGFydCA9IHJlcS0+QmFzZTsKKwlyZXMtPmVuZCA9IHJlcS0+QmFzZSArIHJlcS0+U2l6ZSAtIDE7CisJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9CSVRTOworCXJlcy0+ZmxhZ3MgfD0gKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9GTEFHU19NQVApIHwgKHdpbi0+bWFwIDw8IDIpOworCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07CisJcmVzLT5wYXJlbnQgPSB3aW4tPnJlczsKKwlpZiAod2luLT5yZXMpCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOworCisJZGV2X2RiZygmcy0+ZGV2LCAicmVxdWVzdF93aW5kb3cgcmVzdWx0cyBpbiAlcFJcbiIsIHJlcyk7CisKIAltdXRleF91bmxvY2soJnMtPm9wc19tdXRleCk7Ci0JKndoID0gdyArIDE7CisJKndoID0gcmVzOwogCiAJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyAqLwpAQCAtODU1LDEzICs4ODUsMTggQEAKIAogdm9pZCBwY21jaWFfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQogeworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfV0lOOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXMgPSBwX2Rldi0+cmVzb3VyY2VbTUFYX0lPX1dJTiArIGldOworCQlpZiAocmVzLT5mbGFncyAmIFdJTl9GTEFHU19SRVEpCisJCQlwY21jaWFfcmVsZWFzZV93aW5kb3cocF9kZXYsIHJlcyk7CisJfQorCiAJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihwX2Rldik7Ci0JcGNtY2lhX3JlbGVhc2VfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworCXBjbWNpYV9yZWxlYXNlX2lvKHBfZGV2KTsKIAlpZiAocF9kZXYtPl9pcnEpIHsKIAkJZnJlZV9pcnEocF9kZXYtPmlycSwgcF9kZXYtPnByaXYpOwogCQlwX2Rldi0+X2lycSA9IDA7CiAJfQotCWlmIChwX2Rldi0+d2luKQotCQlwY21jaWFfcmVsZWFzZV93aW5kb3cocF9kZXYsIHBfZGV2LT53aW4pOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZGlzYWJsZV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMgYi9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYwppbmRleCBiNjFhMTM2Li5iOGE4NjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggZjM3MDQ3Ni4uYWUwN2I0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfaW9keW4uYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfaW9keW4uYwppbmRleCBkMGJmMzUwLi44NTEwYzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9yc3JjX2lvZHluLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcnNyY19pb2R5bi5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC04OCw3ICs4Nyw3IEBACiAKIHN0YXRpYyBpbnQgaW9keW5fZmluZF9pbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGF0dHIsCiAJCQl1bnNpZ25lZCBpbnQgKmJhc2UsIHVuc2lnbmVkIGludCBudW0sCi0JCQl1bnNpZ25lZCBpbnQgYWxpZ24pCisJCQl1bnNpZ25lZCBpbnQgYWxpZ24sIHN0cnVjdCByZXNvdXJjZSAqKnBhcmVudCkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIApAQCAtMTI5LDYgKzEyOCw3IEBACiAJCQkJKChyZXMtPmZsYWdzICYgfklPUkVTT1VSQ0VfQklUUykgfAogCQkJCQkoYXR0ciAmIElPUkVTT1VSQ0VfQklUUykpOwogCQkJcy0+aW9baV0uSW5Vc2UgPSBudW07CisJCQkqcGFyZW50ID0gcmVzOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMTQwLDYgKzE0MCw3IEBACiAJCQkJY29udGludWU7CiAJCQkqYmFzZSA9IHRyeTsKIAkJCXMtPmlvW2ldLkluVXNlICs9IG51bTsKKwkJCSpwYXJlbnQgPSByZXM7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC0xNTIsNiArMTUzLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCSpiYXNlID0gdHJ5OwogCQkJcy0+aW9baV0uSW5Vc2UgKz0gbnVtOworCQkJKnBhcmVudCA9IHJlczsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMTY0LDggKzE2Niw2IEBACiAJLnZhbGlkYXRlX21lbSA9IE5VTEwsCiAJLmZpbmRfaW8gPSBpb2R5bl9maW5kX2lvLAogCS5maW5kX21lbSA9IE5VTEwsCi0JLmFkZF9pbyA9IE5VTEwsCi0JLmFkZF9tZW0gPSBOVUxMLAogCS5pbml0ID0gc3RhdGljX2luaXQsCiAJLmV4aXQgPSBOVUxMLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX21nci5jCmluZGV4IDE0MmVmYWMuLjRlODA0MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcnNyY19tZ3IuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtNDgsMTEgKzQ3LDEyIEBACiAKIHN0YXRpYyBpbnQgc3RhdGljX2ZpbmRfaW8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBhdHRyLAogCQkJdW5zaWduZWQgaW50ICpiYXNlLCB1bnNpZ25lZCBpbnQgbnVtLAotCQkJdW5zaWduZWQgaW50IGFsaWduKQorCQkJdW5zaWduZWQgaW50IGFsaWduLCBzdHJ1Y3QgcmVzb3VyY2UgKipwYXJlbnQpCiB7CiAJaWYgKCFzLT5pb19vZmZzZXQpCiAJCXJldHVybiAtRUlOVkFMOwogCSpiYXNlID0gcy0+aW9fb2Zmc2V0IHwgKCpiYXNlICYgMHgwZmZmKTsKKwkqcGFyZW50ID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtNjIsOCArNjIsNiBAQAogCS52YWxpZGF0ZV9tZW0gPSBOVUxMLAogCS5maW5kX2lvID0gc3RhdGljX2ZpbmRfaW8sCiAJLmZpbmRfbWVtID0gTlVMTCwKLQkuYWRkX2lvID0gTlVMTCwKLQkuYWRkX21lbSA9IE5VTEwsCiAJLmluaXQgPSBzdGF0aWNfaW5pdCwKIAkuZXhpdCA9IE5VTEwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKaW5kZXggZGNkMWE0YS4uOTZmMzQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCkBAIC0yOCw3ICsyOCw2IEBACiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02NCw2ICs2Myw5IEBACiAjZGVmaW5lIE1FTV9QUk9CRV9MT1cJKDEgPDwgMCkKICNkZWZpbmUgTUVNX1BST0JFX0hJR0gJKDEgPDwgMSkKIAorLyogQWN0aW9uIGZpZWxkICovCisjZGVmaW5lIFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFCQkxCisjZGVmaW5lIEFERF9NQU5BR0VEX1JFU09VUkNFCQkyCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC03MTYsNyArNzE4LDcgQEAKIAogc3RhdGljIGludCBub25zdGF0aWNfZmluZF9pbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGF0dHIsCiAJCQl1bnNpZ25lZCBpbnQgKmJhc2UsIHVuc2lnbmVkIGludCBudW0sCi0JCQl1bnNpZ25lZCBpbnQgYWxpZ24pCisJCQl1bnNpZ25lZCBpbnQgYWxpZ24sIHN0cnVjdCByZXNvdXJjZSAqKnBhcmVudCkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIApAQCAtNzU4LDYgKzc2MCw3IEBACiAJCQkJKChyZXMtPmZsYWdzICYgfklPUkVTT1VSQ0VfQklUUykgfAogCQkJCQkoYXR0ciAmIElPUkVTT1VSQ0VfQklUUykpOwogCQkJcy0+aW9baV0uSW5Vc2UgPSBudW07CisJCQkqcGFyZW50ID0gcmVzOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNzczLDYgKzc3Niw3IEBACiAJCQkJCWNvbnRpbnVlOwogCQkJCSpiYXNlID0gdHJ5OwogCQkJCXMtPmlvW2ldLkluVXNlICs9IG51bTsKKwkJCQkqcGFyZW50ID0gcmVzOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CkBAIC03OTEsNiArNzk1LDcgQEAKIAkJCQkJY29udGludWU7CiAJCQkJKmJhc2UgPSB0cnk7CiAJCQkJcy0+aW9baV0uSW5Vc2UgKz0gbnVtOworCQkJCSpwYXJlbnQgPSByZXM7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTEwNTUsOCArMTA2MCw2IEBACiAJLnZhbGlkYXRlX21lbSA9IHBjbWNpYV9ub25zdGF0aWNfdmFsaWRhdGVfbWVtLAogCS5maW5kX2lvID0gbm9uc3RhdGljX2ZpbmRfaW8sCiAJLmZpbmRfbWVtID0gbm9uc3RhdGljX2ZpbmRfbWVtX3JlZ2lvbiwKLQkuYWRkX2lvID0gYWRqdXN0X2lvLAotCS5hZGRfbWVtID0gYWRqdXN0X21lbW9yeSwKIAkuaW5pdCA9IG5vbnN0YXRpY19pbml0LAogCS5leGl0ID0gbm9uc3RhdGljX3JlbGVhc2VfcmVzb3VyY2VfZGIsCiB9OwpAQCAtMTExNSw4ICsxMTE4LDYgQEAKIAogCW11dGV4X2xvY2soJnMtPm9wc19tdXRleCk7CiAJcmV0ID0gYWRqdXN0X2lvKHMsIGFkZCwgc3RhcnRfYWRkciwgZW5kX2FkZHIpOwotCWlmICghcmV0KQotCQlzLT5yZXNvdXJjZV9zZXR1cF9uZXcgPSAxOwogCW11dGV4X3VubG9jaygmcy0+b3BzX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKQEAgLTExODMsOCArMTE4NCw2IEBACiAKIAltdXRleF9sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCXJldCA9IGFkanVzdF9tZW1vcnkocywgYWRkLCBzdGFydF9hZGRyLCBlbmRfYWRkcik7Ci0JaWYgKCFyZXQpCi0JCXMtPnJlc291cmNlX3NldHVwX25ldyA9IDE7CiAJbXV0ZXhfdW5sb2NrKCZzLT5vcHNfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMKaW5kZXggZWRiZDhjNC4uZTA5ODUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jCmluZGV4IGZhMjhkODkuLjBjNjJmZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAKIAlzaW5mby0+bnNrdCA9IG5yOwogCi0JLyogSW5pdGlsaWF6ZSBwcm9jZXNzb3Igc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgewogCQlza3QgPSAmc2luZm8tPnNrdFtpXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oCmluZGV4IGU0MDgyNGMuLjNmYmEzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaAorKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmgKQEAgLTExLDcgKzExLDYgQEAKIAogLyogaW5jbHVkZSB0aGUgd29ybGQgKi8KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwppbmRleCA4MGUzNmJjLi5jYjBkM2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS90Y2ljLmMgYi9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKaW5kZXggNTYwMDRhMS4uYmUwZDg0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdGNpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3RjaWMuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgInRjaWMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3h4czE1MDBfc3MuYyBiL2RyaXZlcnMvcGNtY2lhL3h4czE1MDBfc3MuYwppbmRleCAyMDFjY2ZhLi5mYTg4YzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS94eHMxNTAwX3NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEveHhzMTUwMF9zcy5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCmluZGV4IGYxZDQxMzcuLjQxNGQ5YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKaW5kZXggM2UxYjhhMi4uNzliYWE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCkBAIC01LDYgKzUsNyBAQAogbWVudWNvbmZpZyBYODZfUExBVEZPUk1fREVWSUNFUwogCWJvb2wgIlg4NiBQbGF0Zm9ybSBTcGVjaWZpYyBEZXZpY2UgRHJpdmVycyIKIAlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFg4NgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgdG8gZ2V0IHRvIHNlZSBvcHRpb25zIGZvciBkZXZpY2UgZHJpdmVycyBmb3IgdmFyaW91cwogCSAgeDg2IHBsYXRmb3JtcywgaW5jbHVkaW5nIHZlbmRvci1zcGVjaWZpYyBsYXB0b3AgZXh0ZW5zaW9uIGRyaXZlcnMuCkBAIC0xNTEsNiArMTUyLDcgQEAKIAlkZXBlbmRzIG9uIEFDUEkKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAlkZXBlbmRzIG9uIFJGS0lMTAorCWRlcGVuZHMgb24gU0VSSU9fSTgwNDIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBsYXB0b3BzIGJ1aWx0IGJ5IE1TSSAoTUlDUk8tU1RBUgogCSAgSU5URVJOQVRJT05BTCk6CkBAIC0xODEsNiArMTgzLDggQEAKIAlkZXBlbmRzIG9uIEFDUEkKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAlkZXBlbmRzIG9uIFJGS0lMTAorCWRlcGVuZHMgb24gSFdNT04KKwlkZXBlbmRzIG9uIFBPV0VSX1NVUFBMWQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGxhcHRvcHMgYnVpbHQgYnkgQ29tcGFsOgogCkBAIC01MjAsNiArNTI0LDcgQEAKIGNvbmZpZyBBQ1BJX0NNUEMKIAl0cmlzdGF0ZSAiQ01QQyBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gWDg2ICYmIEFDUEkKKwlkZXBlbmRzIG9uIFJGS0lMTCB8fCBSRktJTEw9bgogCXNlbGVjdCBJTlBVVAogCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJZGVmYXVsdCBuCkBAIC01MzcsNCArNTQyLDQzIEBACiAJICBzb21lIGVtYmVkZGVkIEludGVsIHg4NiBwbGF0Zm9ybXMuIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgUEMtdHlwZQogCSAgbWFjaGluZXMuCiAKK2NvbmZpZyBHUElPX0lOVEVMX1BNSUMKKwlib29sICJJbnRlbCBQTUlDIEdQSU8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElOVEVMX1NDVV9JUEMgJiYgR1BJT0xJQgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCBHUElPIHZpYSB0aGUgU0NVIElQQyBpbnRlcmZhY2UKKwkgIG9uIEludGVsIE1JRCBwbGF0Zm9ybXMuCisKK2NvbmZpZyBSQVJfUkVHSVNURVIKKwlib29sICJSZXN0cmljdGVkIEFjY2VzcyBSZWdpb24gUmVnaXN0ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gUENJICYmIFg4Nl9NUlNUCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgYWxsb3dzIG90aGVyIGtlcm5lbCBkcml2ZXJzIGFjY2VzcyB0byB0aGUKKwkgIGNvbnRlbnRzIG9mIHRoZSByZXN0cmljdGVkIGFjY2VzcyByZWdpb24gY29udHJvbCByZWdpc3RlcnMuCisKKwkgIFRoZSByZXN0cmljdGVkIGFjY2VzcyByZWdpb24gY29udHJvbCByZWdpc3RlcnMKKwkgIChyYXJfcmVnaXN0ZXJzKSBhcmUgdXNlZCB0byBwYXNzIGFkZHJlc3MgYW5kCisJICBsb2NraW5nIGluZm9ybWF0aW9uIG9uIHJlc3RyaWN0ZWQgYWNjZXNzIHJlZ2lvbnMKKwkgIHRvIG90aGVyIGRyaXZlcnMgdGhhdCB1c2UgcmVzdHJpY3RlZCBhY2Nlc3MgcmVnaW9ucy4KKworCSAgVGhlIHJlc3RyaWN0ZWQgYWNjZXNzIHJlZ2lvbnMgYXJlIHJlZ2lvbnMgb2YgbWVtb3J5CisJICBvbiB0aGUgSW50ZWwgTUlEIFBsYXRmb3JtIHRoYXQgYXJlIG5vdCBhY2Nlc3NpYmxlIHRvCisJICB0aGUgeDg2IHByb2Nlc3NvciwgYnV0IGFyZSBhY2Nlc3NpYmxlIHRvIGRlZGljYXRlZAorCSAgcHJvY2Vzc29ycyBvbiBib2FyZCBwZXJpcGhlcmFsIGRldmljZXMuCisKKwkgIFRoZSBwdXJwb3NlIG9mIHRoZSByZXN0cmljdGVkIGFjY2VzcyByZWdpb25zIGlzIHRvCisJICBwcm90ZWN0IHNlbnNpdGl2ZSBkYXRhIGZyb20gY29tcHJvbWlzZSBieSB1bmF1dGhvcml6ZWQKKwkgIHByb2dyYW1zIHJ1bm5pbmcgb24gdGhlIHg4NiBwcm9jZXNzb3IuCisKK2NvbmZpZyBJTlRFTF9JUFMKKwl0cmlzdGF0ZSAiSW50ZWwgSW50ZWxsaWdlbnQgUG93ZXIgU2hhcmluZyIKKwlkZXBlbmRzIG9uIEFDUEkKKwktLS1oZWxwLS0tCisJICBJbnRlbCBDYWxwZWxsYSBwbGF0Zm9ybXMgc3VwcG9ydCBkeW5hbWljIHBvd2VyIHNoYXJpbmcgYmV0d2VlbiB0aGUKKwkgIENQVSBhbmQgR1BVLCBtYXhpbWl6aW5nIHBlcmZvcm1hbmNlIGluIGEgZ2l2ZW4gVERQLiAgVGhpcyBkcml2ZXIsCisJICBhbG9uZyB3aXRoIHRoZSBDUFUgZnJlcXVlbmN5IGFuZCBpOTE1IGRyaXZlcnMsIHByb3ZpZGVzIHRoYXQKKwkgIGZ1bmN0aW9uYWxpdHkuICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZTsgaXQgd2lsbCBvbmx5IGxvYWQgb24KKwkgIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisKIGVuZGlmICMgWDg2X1BMQVRGT1JNX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L01ha2VmaWxlIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKaW5kZXggODc3MGJmZS4uNDc0NGM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKQEAgLTI2LDMgKzI2LDcgQEAKIG9iai0kKENPTkZJR19BQ1BJX1RPU0hJQkEpCSs9IHRvc2hpYmFfYWNwaS5vCiBvYmotJChDT05GSUdfVE9TSElCQV9CVF9SRktJTEwpCSs9IHRvc2hpYmFfYmx1ZXRvb3RoLm8KIG9iai0kKENPTkZJR19JTlRFTF9TQ1VfSVBDKQkrPSBpbnRlbF9zY3VfaXBjLm8KK29iai0kKENPTkZJR19SQVJfUkVHSVNURVIpCSs9IGludGVsX3Jhcl9yZWdpc3Rlci5vCitvYmotJChDT05GSUdfSU5URUxfSVBTKQkJKz0gaW50ZWxfaXBzLm8KK29iai0kKENPTkZJR19HUElPX0lOVEVMX1BNSUMpCSs9IGludGVsX3BtaWNfZ3Bpby5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCmluZGV4IDFlYTZjNDMuLjJiYWRlZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwpAQCAtNTAsMTcgKzUwLDYgQEAKICNkZWZpbmUgQUNFUl9JTkZPIEtFUk5fSU5GTyBBQ0VSX0xPR1BSRUZJWAogCiAvKgotICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHF1aXJrcyB0byBnZXQgc29tZSBzcGVjaWZpYyBmdW5jdGlvbnMgdG8gd29yawotICogd2hpY2ggYXJlIGtub3duIHRvIG5vdCBiZSBzdXBwb3J0ZWQgb3ZlciBBQ1BJLVdNSSAoc3VjaCBhcyB0aGUgbWFpbCBMRUQKLSAqIG9uIFdNSUQgYmFzZWQgQWNlcidzKQotICovCi1zdHJ1Y3QgYWNlcl9xdWlya3MgewotCWNvbnN0IGNoYXIgKnZlbmRvcjsKLQljb25zdCBjaGFyICptb2RlbDsKLQl1MTYgcXVpcmtzOwotfTsKLQotLyoKICAqIE1hZ2ljIE51bWJlcgogICogTWVhbmluZyBpcyB1bmtub3duIC0gdGhpcyBudW1iZXIgaXMgcmVxdWlyZWQgZm9yIHdyaXRpbmcgdG8gQUNQSSBmb3IgQU1XMAogICogKGl0J3MgYWxzbyB1c2VkIGluIGFjZXJoayB3aGVuIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgQklPUykKQEAgLTIwMCw3ICsxODksNyBAQAogc3RhdGljIGludCBkbWlfbWF0Y2hlZChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZG1pKQogewogCXF1aXJrcyA9IGRtaS0+ZHJpdmVyX2RhdGE7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcXVpcmtfZW50cnkgcXVpcmtfdW5rbm93biA9IHsKQEAgLTU1NSw2ICs1NDQsNyBAQAogCW9iai0+YnVmZmVyLmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IHdtYWJfcmV0KSkgewogCQlyZXQgPSAqKChzdHJ1Y3Qgd21hYl9yZXQgKikgb2JqLT5idWZmZXIucG9pbnRlcik7CiAJfSBlbHNlIHsKKwkJa2ZyZWUob3V0LnBvaW50ZXIpOwogCQlyZXR1cm4gQUVfRVJST1I7CiAJfQogCkBAIC01NzAsNyArNTYwLDcgQEAKIHsKIAlzdHJ1Y3Qgd21hYl9hcmdzIGFyZ3M7CiAJc3RydWN0IHdtYWJfcmV0IHJldDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwogCkBAIC01OTMsMTIgKzU4MywxMyBAQAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKIAotCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBvdXQucG9pbnRlcjsKKwlvYmogPSBvdXQucG9pbnRlcjsKIAlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSICYmCiAJb2JqLT5idWZmZXIubGVuZ3RoID09IHNpemVvZihzdHJ1Y3Qgd21hYl9yZXQpKSB7CiAJCXJldCA9ICooKHN0cnVjdCB3bWFiX3JldCAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKIAl9IGVsc2UgewotCQlyZXR1cm4gQUVfRVJST1I7CisJCXN0YXR1cyA9IEFFX0VSUk9SOworCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAocmV0LmVheCAmIDB4MSkKQEAgLTYwNywyMyArNTk4LDI2IEBACiAJYXJncy5lYnggPSAyIDw8IDg7CiAJYXJncy5lYnggfD0gQUNFUl9BTVcwX0JMVUVUT09USF9NQVNLOwogCisJLyoKKwkgKiBJdCdzIG9rIHRvIHVzZSBleGlzdGluZyBidWZmZXIgZm9yIG5leHQgd21hYl9leGVjdXRlIGNhbGwuCisJICogQnV0IHdlIG5lZWQgdG8ga2ZyZWUob3V0LnBvaW50ZXIpIGlmIG5leHQgd21hYl9leGVjdXRlIGZhaWwuCisJICovCiAJc3RhdHVzID0gd21hYl9leGVjdXRlKCZhcmdzLCAmb3V0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiBzdGF0dXM7CisJCWdvdG8gb3V0OwogCiAJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIG91dC5wb2ludGVyOwogCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIKIAkmJiBvYmotPmJ1ZmZlci5sZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCB3bWFiX3JldCkpIHsKIAkJcmV0ID0gKigoc3RydWN0IHdtYWJfcmV0ICopIG9iai0+YnVmZmVyLnBvaW50ZXIpOwogCX0gZWxzZSB7Ci0JCXJldHVybiBBRV9FUlJPUjsKKwkJc3RhdHVzID0gQUVfRVJST1I7CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZXQuZWF4ICYgMHgxKQogCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQkxVRVRPT1RIOwogCi0Ja2ZyZWUob3V0LnBvaW50ZXIpOwotCiAJLyoKIAkgKiBUaGlzIGFwcGVhcnMgdG8gYmUgc2FmZSB0byBlbmFibGUsIHNpbmNlIGFsbCBXaXN0cm9uIGJhc2VkIGxhcHRvcHMKIAkgKiBhcHBlYXIgdG8gdXNlIHRoZSBzYW1lIEVDIHJlZ2lzdGVyIGZvciBicmlnaHRuZXNzLCBldmVuIGlmIHRoZXkKQEAgLTYzMiw3ICs2MjYsMTAgQEAKIAlpZiAocXVpcmtzLT5icmlnaHRuZXNzID49IDApCiAJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9CUklHSFRORVNTOwogCi0JcmV0dXJuIEFFX09LOworCXN0YXR1cyA9IEFFX09LOworb3V0OgorCWtmcmVlKG91dC5wb2ludGVyKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgc3RydWN0IHdtaV9pbnRlcmZhY2UgQU1XMF9pbnRlcmZhY2UgPSB7CkBAIC03NzIsNiArNzY5LDcgQEAKIAkJb2JqLT5idWZmZXIubGVuZ3RoID09IHNpemVvZih1MzIpKSB7CiAJCWRldmljZXMgPSAqKCh1MzIgKikgb2JqLT5idWZmZXIucG9pbnRlcik7CiAJfSBlbHNlIHsKKwkJa2ZyZWUob3V0LnBvaW50ZXIpOwogCQlyZXR1cm4gQUVfRVJST1I7CiAJfQogCkBAIC03ODgsNiArNzg2LDcgQEAKIAlpZiAoIShkZXZpY2VzICYgMHgyMCkpCiAJCW1heF9icmlnaHRuZXNzID0gMHg5OwogCisJa2ZyZWUob3V0LnBvaW50ZXIpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEwODQsOCArMTA4Myw3IEBACiAJfQogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIoaW50ZXJmYWNlLCBTX0lXVUdPIHwgU19JUlVHTyB8IFNfSVdVU1IsCi0Jc2hvd19pbnRlcmZhY2UsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGludGVyZmFjZSwgU19JUlVHTywgc2hvd19pbnRlcmZhY2UsIE5VTEwpOwogCiAvKgogICogZGVidWdmcyBmdW5jdGlvbnMKQEAgLTEwOTUsNiArMTA5Myw3IEBACiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGRldmljZXMgPSAwOwogCiAJc3RhdHVzID0gd21pX3F1ZXJ5X2Jsb2NrKFdNSURfR1VJRDIsIDEsICZvdXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKQEAgLTExMDMsMTAgKzExMDIsMTEgQEAKIAlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgb3V0LnBvaW50ZXI7CiAJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUiAmJgogCQlvYmotPmJ1ZmZlci5sZW5ndGggPT0gc2l6ZW9mKHUzMikpIHsKLQkJcmV0dXJuICooKHUzMiAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKKwkJZGV2aWNlcyA9ICooKHUzMiAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKIAl9CisKKwlrZnJlZShvdXQucG9pbnRlcik7CisJcmV0dXJuIGRldmljZXM7CiB9CiAKIC8qCkBAIC0xMzI3LDIyICsxMzI3LDMxIEBACiAJCSAgICAgICAiZ2VuZXJpYyB2aWRlbyBkcml2ZXJcbiIpOwogCX0KIAotCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFjZXJfcGxhdGZvcm1fZHJpdmVyKSkgeworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWNlcl9wbGF0Zm9ybV9kcml2ZXIpOworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEFDRVJfRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLlxuIik7CiAJCWdvdG8gZXJyb3JfcGxhdGZvcm1fcmVnaXN0ZXI7CiAJfQorCiAJYWNlcl9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImFjZXItd21pIiwgLTEpOwotCXBsYXRmb3JtX2RldmljZV9hZGQoYWNlcl9wbGF0Zm9ybV9kZXZpY2UpOworCWlmICghYWNlcl9wbGF0Zm9ybV9kZXZpY2UpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9kZXZpY2VfYWxsb2M7CisJfQorCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhY2VyX3BsYXRmb3JtX2RldmljZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9kZXZpY2VfYWRkOwogCiAJZXJyID0gY3JlYXRlX3N5c2ZzKCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJvcl9jcmVhdGVfc3lzOwogCiAJaWYgKHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQyKSkgewogCQlpbnRlcmZhY2UtPmRlYnVnLndtaWRfZGV2aWNlcyA9IGdldF93bWlkX2RldmljZXMoKTsKIAkJZXJyID0gY3JlYXRlX2RlYnVnZnMoKTsKIAkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIGVycm9yX2NyZWF0ZV9kZWJ1Z2ZzOwogCX0KIAogCS8qIE92ZXJyaWRlIGFueSBpbml0aWFsIHNldHRpbmdzIHdpdGggdmFsdWVzIGZyb20gdGhlIGNvbW1hbmRsaW5lICovCkBAIC0xMzUwLDE1ICsxMzU5LDIzIEBACiAKIAlyZXR1cm4gMDsKIAorZXJyb3JfY3JlYXRlX2RlYnVnZnM6CisJcmVtb3ZlX3N5c2ZzKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKK2Vycm9yX2NyZWF0ZV9zeXM6CisJcGxhdGZvcm1fZGV2aWNlX2RlbChhY2VyX3BsYXRmb3JtX2RldmljZSk7CitlcnJvcl9kZXZpY2VfYWRkOgorCXBsYXRmb3JtX2RldmljZV9wdXQoYWNlcl9wbGF0Zm9ybV9kZXZpY2UpOworZXJyb3JfZGV2aWNlX2FsbG9jOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhY2VyX3BsYXRmb3JtX2RyaXZlcik7CiBlcnJvcl9wbGF0Zm9ybV9yZWdpc3RlcjoKLQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNlcl93bWlfZXhpdCh2b2lkKQogewogCXJlbW92ZV9zeXNmcyhhY2VyX3BsYXRmb3JtX2RldmljZSk7CiAJcmVtb3ZlX2RlYnVnZnMoKTsKLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhY2VyX3BsYXRmb3JtX2RldmljZSk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJfcGxhdGZvcm1fZHJpdmVyKTsKIAogCXByaW50ayhBQ0VSX0lORk8gIkFjZXIgTGFwdG9wIFdNSSBFeHRyYXMgdW5sb2FkZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlcmhkZi5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlcmhkZi5jCmluZGV4IDdiMjM4NGQuLjYwZjljZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXJoZGYuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyaGRmLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAqLwogI3VuZGVmIFNUQVJUX0lOX0tFUk5FTF9NT0RFCiAKLSNkZWZpbmUgRFJWX1ZFUiAiMC41LjIyIgorI2RlZmluZSBEUlZfVkVSICIwLjUuMjQiCiAKIC8qCiAgKiBBY2NvcmRpbmcgdG8gdGhlIEF0b20gTjI3MCBkYXRhc2hlZXQsCkBAIC05Miw5ICs5Miw5IEBACiBzdGF0aWMgY2hhciBmb3JjZV9iaW9zWzE2XTsKIHN0YXRpYyBjaGFyIGZvcmNlX3Byb2R1Y3RbMTZdOwogc3RhdGljIHVuc2lnbmVkIGludCBwcmV2X2ludGVydmFsOwotc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoel9kZXY7Ci1zdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2xfZGV2Owotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYWNlcmhkZl9kZXY7CitzdGF0aWMgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoel9kZXY7CitzdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNsX2RldjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphY2VyaGRmX2RldjsKIAogbW9kdWxlX3BhcmFtKGtlcm5lbG1vZGUsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhrZXJuZWxtb2RlLCAiS2VybmVsIG1vZGUgZmFuIGNvbnRyb2wgb24gLyBvZmYiKTsKQEAgLTExMiwxNCArMTEyLDEyIEBACiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3Byb2R1Y3QsICJGb3JjZSBCSU9TIHByb2R1Y3QgYW5kIG9taXQgQklPUyBjaGVjayIpOwogCiAvKgotICogY21kX29mZjogdG8gc3dpdGNoIHRoZSBmYW4gY29tcGxldGVseSBvZmYKLSAqIGNoa19vZmY6IHRvIGNoZWNrIGlmIHRoZSBmYW4gaXMgb2ZmCisgKiBjbWRfb2ZmOiB0byBzd2l0Y2ggdGhlIGZhbiBjb21wbGV0ZWx5IG9mZiBhbmQgY2hlY2sgaWYgdGhlIGZhbiBpcyBvZmYKICAqCWNtZF9hdXRvOiB0byBzZXQgdGhlIEJJT1MgaW4gY29udHJvbCBvZiB0aGUgZmFuLiBUaGUgQklPUyByZWd1bGF0ZXMgdGhlbgogICoJCXRoZSBmYW4gc3BlZWQgZGVwZW5kaW5nIG9uIHRoZSB0ZW1wZXJhdHVyZQogICovCiBzdHJ1Y3QgZmFuY21kIHsKIAl1OCBjbWRfb2ZmOwotCXU4IGNoa19vZmY7CiAJdTggY21kX2F1dG87CiB9OwogCkBAIC0xMzYsNDcgKzEzNCw4MSBAQAogLyogUmVnaXN0ZXIgYWRkcmVzc2VzIGFuZCB2YWx1ZXMgZm9yIGRpZmZlcmVudCBCSU9TIHZlcnNpb25zICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJpb3Nfc2V0dGluZ3NfdCBiaW9zX3RibFtdID0gewogCS8qIEFPQTExMCAqLwotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzEwOSIsIDB4NTUsIDB4NTgsIHsweDFmLCAweDFmLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzExNCIsIDB4NTUsIDB4NTgsIHsweDFmLCAweDFmLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwMSIsIDB4NTUsIDB4NTgsIHsweGFmLCAweGFmLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwNCIsIDB4NTUsIDB4NTgsIHsweGFmLCAweGFmLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwNSIsIDB4NTUsIDB4NTgsIHsweGFmLCAweGFmLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwNyIsIDB4NTUsIDB4NTgsIHsweGFmLCAweGFmLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwOCIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDIxLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwOSIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDIxLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMxMCIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDIxLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzEwOSIsIDB4NTUsIDB4NTgsIHsweDFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzExNCIsIDB4NTUsIDB4NTgsIHsweDFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwMSIsIDB4NTUsIDB4NTgsIHsweGFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwNCIsIDB4NTUsIDB4NTgsIHsweGFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwNSIsIDB4NTUsIDB4NTgsIHsweGFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwNyIsIDB4NTUsIDB4NTgsIHsweGFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwOCIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMwOSIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExMTAiLCAidjAuMzMxMCIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDAwfSB9LAogCS8qIEFPQTE1MCAqLwotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzExNCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwMSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwNCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwNSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwNyIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwOCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwOSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMxMCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzExNCIsIDB4NTUsIDB4NTgsIHsweDFmLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwMSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwNCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwNSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwNyIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwOCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMwOSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiQWNlciIsICJBT0ExNTAiLCAidjAuMzMxMCIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAogCS8qIEFjZXIgMTQxMCAqLwotCXsiQWNlciIsICJBc3BpcmUgMTQxMCIsICJ2MC4zMTIwIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4OWUsIDB4MDB9IH0sCi0JeyJBY2VyIiwgIkFzcGlyZSAxNDEwIiwgInYxLjMzMDMiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE0MTAiLCAidjAuMzEwOCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTQxMCIsICJ2MC4zMTEzIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxNDEwIiwgInYwLjMxMTUiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE0MTAiLCAidjAuMzExNyIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTQxMCIsICJ2MC4zMTE5IiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxNDEwIiwgInYwLjMxMjAiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE0MTAiLCAidjEuMzIwNCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTQxMCIsICJ2MS4zMzAzIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxNDEwIiwgInYxLjMzMDgiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE0MTAiLCAidjEuMzMxMCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAogCS8qIEFjZXIgMTgxMHh4ICovCi0JeyJBY2VyIiwgIkFzcGlyZSAxODEwVFoiLCAidjAuMzEyMCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDllLCAweDAwfSB9LAotCXsiQWNlciIsICJBc3BpcmUgMTgxMFQiLCAidjAuMzEyMCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDllLCAweDAwfSB9LAotCXsiQWNlciIsICJBc3BpcmUgMTgxMFQiLCAidjEuMzMwMyIsIDB4NTUsIDB4NTgsIHsweDllLCAweDllLCAweDAwfSB9LAotCXsiQWNlciIsICJBc3BpcmUgMTgxMFRaIiwgInYxLjMzMDMiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUWiIsICJ2MC4zMTA4IiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVCIsICAidjAuMzEwOCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTgxMFRaIiwgInYwLjMxMTMiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUIiwgICJ2MC4zMTEzIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVFoiLCAidjAuMzExNSIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTgxMFQiLCAgInYwLjMxMTUiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUWiIsICJ2MC4zMTE3IiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVCIsICAidjAuMzExNyIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTgxMFRaIiwgInYwLjMxMTkiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUIiwgICJ2MC4zMTE5IiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVFoiLCAidjAuMzEyMCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTgxMFQiLCAgInYwLjMxMjAiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUWiIsICJ2MS4zMjA0IiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVCIsICAidjEuMzIwNCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTgxMFRaIiwgInYxLjMzMDMiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUIiwgICJ2MS4zMzAzIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVFoiLCAidjEuMzMwOCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiQWNlciIsICJBc3BpcmUgMTgxMFQiLCAgInYxLjMzMDgiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IkFjZXIiLCAiQXNwaXJlIDE4MTBUWiIsICJ2MS4zMzEwIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJBY2VyIiwgIkFzcGlyZSAxODEwVCIsICAidjEuMzMxMCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCS8qIEFjZXIgNTMxICovCisJeyJBY2VyIiwgIkFPNTMxaCIsICJ2MC4zMjAxIiwgMHg1NSwgMHg1OCwgezB4MjAsIDB4MDB9IH0sCiAJLyogR2F0ZXdheSAqLwotCXsiR2F0ZXdheSIsICJBT0ExMTAiLCAidjAuMzEwMyIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDIxLCAweDAwfSB9LAotCXsiR2F0ZXdheSIsICJBT0ExNTAiLCAidjAuMzEwMyIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDIwLCAweDAwfSB9LAotCXsiR2F0ZXdheSIsICJMVDMxIiwgInYxLjMxMDMiLCAweDU1LCAweDU4LCB7MHgxMCwgMHgwZiwgMHgwMH0gfSwKLQl7IkdhdGV3YXkiLCAiTFQzMSIsICJ2MS4zMjAxIiwgMHg1NSwgMHg1OCwgezB4MTAsIDB4MGYsIDB4MDB9IH0sCi0JeyJHYXRld2F5IiwgIkxUMzEiLCAidjEuMzMwMiIsIDB4NTUsIDB4NTgsIHsweDEwLCAweDBmLCAweDAwfSB9LAorCXsiR2F0ZXdheSIsICJBT0ExMTAiLCAidjAuMzEwMyIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDAwfSB9LAorCXsiR2F0ZXdheSIsICJBT0ExNTAiLCAidjAuMzEwMyIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiR2F0ZXdheSIsICJMVDMxIiwgICAidjEuMzEwMyIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiR2F0ZXdheSIsICJMVDMxIiwgICAidjEuMzIwMSIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiR2F0ZXdheSIsICJMVDMxIiwgICAidjEuMzMwMiIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAogCS8qIFBhY2thcmQgQmVsbCAqLwotCXsiUGFja2FyZCBCZWxsIiwgIkRPQTE1MCIsICJ2MC4zMTA0IiwgMHg1NSwgMHg1OCwgezB4MjEsIDB4MjEsIDB4MDB9IH0sCi0JeyJQYWNrYXJkIEJlbGwiLCAiRE9BMTUwIiwgInYwLjMxMDUiLCAweDU1LCAweDU4LCB7MHgyMCwgMHgyMCwgMHgwMH0gfSwKLQl7IlBhY2thcmQgQmVsbCIsICJBT0ExMTAiLCAidjAuMzEwNSIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDIxLCAweDAwfSB9LAotCXsiUGFja2FyZCBCZWxsIiwgIkFPQTE1MCIsICJ2MC4zMTA1IiwgMHg1NSwgMHg1OCwgezB4MjAsIDB4MjAsIDB4MDB9IH0sCi0JeyJQYWNrYXJkIEJlbGwiLCAiRE9UTVUiLCAidjEuMzMwMyIsIDB4NTUsIDB4NTgsIHsweDllLCAweDllLCAweDAwfSB9LAotCXsiUGFja2FyZCBCZWxsIiwgIkRPVE1VIiwgInYwLjMxMjAiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHg5ZSwgMHgwMH0gfSwKKwl7IlBhY2thcmQgQmVsbCIsICJET0ExNTAiLCAidjAuMzEwNCIsIDB4NTUsIDB4NTgsIHsweDIxLCAweDAwfSB9LAorCXsiUGFja2FyZCBCZWxsIiwgIkRPQTE1MCIsICJ2MC4zMTA1IiwgMHg1NSwgMHg1OCwgezB4MjAsIDB4MDB9IH0sCisJeyJQYWNrYXJkIEJlbGwiLCAiQU9BMTEwIiwgInYwLjMxMDUiLCAweDU1LCAweDU4LCB7MHgyMSwgMHgwMH0gfSwKKwl7IlBhY2thcmQgQmVsbCIsICJBT0ExNTAiLCAidjAuMzEwNSIsIDB4NTUsIDB4NTgsIHsweDIwLCAweDAwfSB9LAorCXsiUGFja2FyZCBCZWxsIiwgIkRPVE1VIiwgICJ2MS4zMzAzIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJQYWNrYXJkIEJlbGwiLCAiRE9UTVUiLCAgInYwLjMxMjAiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IlBhY2thcmQgQmVsbCIsICJET1RNVSIsICAidjAuMzEwOCIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiUGFja2FyZCBCZWxsIiwgIkRPVE1VIiwgICJ2MC4zMTEzIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJQYWNrYXJkIEJlbGwiLCAiRE9UTVUiLCAgInYwLjMxMTUiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IlBhY2thcmQgQmVsbCIsICJET1RNVSIsICAidjAuMzExNyIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiUGFja2FyZCBCZWxsIiwgIkRPVE1VIiwgICJ2MC4zMTE5IiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCisJeyJQYWNrYXJkIEJlbGwiLCAiRE9UTVUiLCAgInYxLjMyMDQiLCAweDU1LCAweDU4LCB7MHg5ZSwgMHgwMH0gfSwKKwl7IlBhY2thcmQgQmVsbCIsICJET1RNQSIsICAidjEuMzIwMSIsIDB4NTUsIDB4NTgsIHsweDllLCAweDAwfSB9LAorCXsiUGFja2FyZCBCZWxsIiwgIkRPVE1BIiwgICJ2MS4zMzAyIiwgMHg1NSwgMHg1OCwgezB4OWUsIDB4MDB9IH0sCiAJLyogcGV3cGV3LXRlcm1pbmF0b3IgKi8KLQl7IiIsICIiLCAiIiwgMCwgMCwgezAsIDAsIDB9IH0KKwl7IiIsICIiLCAiIiwgMCwgMCwgezAsIDB9IH0KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmlvc19zZXR0aW5nc190ICpiaW9zX2NmZyBfX3JlYWRfbW9zdGx5OwpAQCAtMjAwLDcgKzIzMiw3IEBACiAJaWYgKGVjX3JlYWQoYmlvc19jZmctPmZhbnJlZywgJmZhbikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGZhbiAhPSBiaW9zX2NmZy0+Y21kLmNoa19vZmYpCisJaWYgKGZhbiAhPSBiaW9zX2NmZy0+Y21kLmNtZF9vZmYpCiAJCSpzdGF0ZSA9IEFDRVJIREZfRkFOX0FVVE87CiAJZWxzZQogCQkqc3RhdGUgPSBBQ0VSSERGX0ZBTl9PRkY7CkBAIC0zNzQsNyArNDA2LDcgQEAKIH0KIAogLyogYmluZCBjYWxsYmFjayBmdW5jdGlvbnMgdG8gdGhlcm1hbHpvbmUgKi8KLXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyBhY2VyaGRmX2Rldl9vcHMgPSB7CitzdGF0aWMgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Vfb3BzIGFjZXJoZGZfZGV2X29wcyA9IHsKIAkuYmluZCA9IGFjZXJoZGZfYmluZCwKIAkudW5iaW5kID0gYWNlcmhkZl91bmJpbmQsCiAJLmdldF90ZW1wID0gYWNlcmhkZl9nZXRfZWNfdGVtcCwKQEAgLTQ0OSw3ICs0ODEsNyBAQAogfQogCiAvKiBiaW5kIGZhbiBjYWxsYmFja3MgdG8gZmFuIGRldmljZSAqLwotc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGFjZXJoZGZfY29vbGluZ19vcHMgPSB7CitzdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGFjZXJoZGZfY29vbGluZ19vcHMgPSB7CiAJLmdldF9tYXhfc3RhdGUgPSBhY2VyaGRmX2dldF9tYXhfc3RhdGUsCiAJLmdldF9jdXJfc3RhdGUgPSBhY2VyaGRmX2dldF9jdXJfc3RhdGUsCiAJLnNldF9jdXJfc3RhdGUgPSBhY2VyaGRmX3NldF9jdXJfc3RhdGUsCkBAIC01MTgsNiArNTUwLDEwIEBACiAJdmVyc2lvbiA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVSU0lPTik7CiAJcHJvZHVjdCA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfTkFNRSk7CiAKKwlpZiAoIXZlbmRvciB8fCAhdmVyc2lvbiB8fCAhcHJvZHVjdCkgeworCQlwcl9lcnIoImVycm9yIGdldHRpbmcgaGFyZHdhcmUgaW5mb3JtYXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlwcl9pbmZvKCJBY2VyIEFzcGlyZSBPbmUgRmFuIGRyaXZlciwgdi4lc1xuIiwgRFJWX1ZFUik7CiAKQEAgLTU3OSwxNyArNjE1LDI2IEBACiAJCXJldHVybiBlcnI7CiAKIAlhY2VyaGRmX2RldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiYWNlcmhkZiIsIC0xKTsKLQlwbGF0Zm9ybV9kZXZpY2VfYWRkKGFjZXJoZGZfZGV2KTsKKwlpZiAoIWFjZXJoZGZfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RldmljZV9hbGxvYzsKKwl9CisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhY2VyaGRmX2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZGV2aWNlX2FkZDsKIAogCXJldHVybiAwOworCitlcnJfZGV2aWNlX2FkZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGFjZXJoZGZfZGV2KTsKK2Vycl9kZXZpY2VfYWxsb2M6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJoZGZfZHJpdmVyKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBhY2VyaGRmX3VucmVnaXN0ZXJfcGxhdGZvcm0odm9pZCkKIHsKLQlpZiAoIWFjZXJoZGZfZGV2KQotCQlyZXR1cm47Ci0KLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKGFjZXJoZGZfZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhY2VyaGRmX2Rldik7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJoZGZfZHJpdmVyKTsKIH0KIApAQCAtNjMzLDcgKzY3OCw3IEBACiAKIAllcnIgPSBhY2VyaGRmX3JlZ2lzdGVyX3BsYXRmb3JtKCk7CiAJaWYgKGVycikKLQkJZ290byBlcnJfdW5yZWc7CisJCWdvdG8gb3V0X2VycjsKIAogCWVyciA9IGFjZXJoZGZfcmVnaXN0ZXJfdGhlcm1hbCgpOwogCWlmIChlcnIpCkBAIC02NDYsNyArNjkxLDcgQEAKIAlhY2VyaGRmX3VucmVnaXN0ZXJfcGxhdGZvcm0oKTsKIAogb3V0X2VycjoKLQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNlcmhkZl9leGl0KHZvaWQpCkBAIC02NjIsMTEgKzcwNywxMyBAQAogTU9EVUxFX0FMSUFTKCJkbWk6KjoqQWNlcio6cG5BT0EqOiIpOwogTU9EVUxFX0FMSUFTKCJkbWk6KjoqQWNlcio6cG5Bc3BpcmUgMTQxMCo6Iik7CiBNT0RVTEVfQUxJQVMoImRtaToqOipBY2VyKjpwbkFzcGlyZSAxODEwKjoiKTsKK01PRFVMRV9BTElBUygiZG1pOio6KkFjZXIqOnBuQU81MzEqOiIpOwogTU9EVUxFX0FMSUFTKCJkbWk6KjoqR2F0ZXdheSo6cG5BT0EqOiIpOwogTU9EVUxFX0FMSUFTKCJkbWk6KjoqR2F0ZXdheSo6cG5MVDMxKjoiKTsKIE1PRFVMRV9BTElBUygiZG1pOio6KlBhY2thcmQgQmVsbCo6cG5BT0EqOiIpOwogTU9EVUxFX0FMSUFTKCJkbWk6KjoqUGFja2FyZCBCZWxsKjpwbkRPQSo6Iik7CiBNT0RVTEVfQUxJQVMoImRtaToqOipQYWNrYXJkIEJlbGwqOnBuRE9UTVUqOiIpOworTU9EVUxFX0FMSUFTKCJkbWk6KjoqUGFja2FyZCBCZWxsKjpwbkRPVE1BKjoiKTsKIAogbW9kdWxlX2luaXQoYWNlcmhkZl9pbml0KTsKIG1vZHVsZV9leGl0KGFjZXJoZGZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy1sYXB0b3AuYwppbmRleCBlZmU4ZjYzLi5iNzU2ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtbGFwdG9wLmMKQEAgLTc2LDE4ICs3NiwxOCBAQAogICogU28sIGlmIHNvbWV0aGluZyBkb2Vzbid0IHdvcmsgYXMgeW91IHdhbnQsIGp1c3QgdHJ5IG90aGVyIHZhbHVlcyA9KQogICovCiBzdGF0aWMgdWludCB3YXBmID0gMTsKLW1vZHVsZV9wYXJhbSh3YXBmLCB1aW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbSh3YXBmLCB1aW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mod2FwZiwgIldBUEYgdmFsdWUiKTsKIAogc3RhdGljIGludCB3bGFuX3N0YXR1cyA9IDE7CiBzdGF0aWMgaW50IGJsdWV0b290aF9zdGF0dXMgPSAxOwogCi1tb2R1bGVfcGFyYW0od2xhbl9zdGF0dXMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0od2xhbl9zdGF0dXMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHdsYW5fc3RhdHVzLCAiU2V0IHRoZSB3aXJlbGVzcyBzdGF0dXMgb24gYm9vdCAiCiAJCSAiKDAgPSBkaXNhYmxlZCwgMSA9IGVuYWJsZWQsIC0xID0gZG9uJ3QgZG8gYW55dGhpbmcpLiAiCiAJCSAiZGVmYXVsdCBpcyAxIik7CiAKLW1vZHVsZV9wYXJhbShibHVldG9vdGhfc3RhdHVzLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGJsdWV0b290aF9zdGF0dXMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGJsdWV0b290aF9zdGF0dXMsICJTZXQgdGhlIHdpcmVsZXNzIHN0YXR1cyBvbiBib290ICIKIAkJICIoMCA9IGRpc2FibGVkLCAxID0gZW5hYmxlZCwgLTEgPSBkb24ndCBkbyBhbnl0aGluZykuICIKIAkJICJkZWZhdWx0IGlzIDEiKTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWlmICghaGFuZGxlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOwogCiAJcGFyYW1zLmNvdW50ID0gMTsKIAlwYXJhbXMucG9pbnRlciA9ICZpbl9vYmo7CkBAIC03OTYsMTAgKzc5NiwxMSBAQAogCiAJcnYgPSBwYXJzZV9hcmcoYnVmLCBjb3VudCwgJnZhbHVlKTsKIAlpZiAocnYgPiAwKSB7Ci0JCWlmICh3cml0ZV9hY3BpX2ludChhc3VzLT5oYW5kbGUsIE1FVEhPRF9MRURELCB2YWx1ZSkpCisJCWlmICh3cml0ZV9hY3BpX2ludChhc3VzLT5oYW5kbGUsIE1FVEhPRF9MRURELCB2YWx1ZSkpIHsKIAkJCXByX3dhcm5pbmcoIkxFRCBkaXNwbGF5IHdyaXRlIGZhaWxlZFxuIik7Ci0JCWVsc2UKLQkJCWFzdXMtPmxlZGRfc3RhdHVzID0gKHUzMikgdmFsdWU7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlhc3VzLT5sZWRkX3N0YXR1cyA9ICh1MzIpIHZhbHVlOwogCX0KIAlyZXR1cm4gcnY7CiB9CkBAIC0xMTIzLDcgKzExMjQsNyBAQAogCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dCkgewogCQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpbnB1dC0+bmFtZSA9ICJBc3VzIExhcHRvcCBleHRyYSBidXR0b25zIjsKIAlpbnB1dC0+cGh5cyA9IEFTVVNfTEFQVE9QX0ZJTEUgIi9pbnB1dDAiOwpAQCAtMTEzNCwyMCArMTEzNSwyMCBAQAogCWVycm9yID0gc3BhcnNlX2tleW1hcF9zZXR1cChpbnB1dCwgYXN1c19rZXltYXAsIE5VTEwpOwogCWlmIChlcnJvcikgewogCQlwcl9lcnIoIlVuYWJsZSB0byBzZXR1cCBpbnB1dCBkZXZpY2Uga2V5bWFwXG4iKTsKLQkJZ290byBlcnJfa2V5bWFwOworCQlnb3RvIGVycl9mcmVlX2RldjsKIAl9CiAJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwogCWlmIChlcnJvcikgewogCQlwcl9pbmZvKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfZGV2aWNlOworCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKIAl9CiAKIAlhc3VzLT5pbnB1dGRldiA9IGlucHV0OwogCXJldHVybiAwOwogCi1lcnJfa2V5bWFwOgorZXJyX2ZyZWVfa2V5bWFwOgogCXNwYXJzZV9rZXltYXBfZnJlZShpbnB1dCk7Ci1lcnJfZGV2aWNlOgorZXJyX2ZyZWVfZGV2OgogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMzk3LDggKzEzOTgsMTAgQEAKIAkJfQogCX0KIAlhc3VzLT5uYW1lID0ga3N0cmR1cChzdHJpbmcsIEdGUF9LRVJORUwpOwotCWlmICghYXN1cy0+bmFtZSkKKwlpZiAoIWFzdXMtPm5hbWUpIHsKKwkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpZiAoKnN0cmluZykKIAkJcHJfbm90aWNlKCIgICVzIG1vZGVsIGRldGVjdGVkXG4iLCBzdHJpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1c19hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzX2FjcGkuYwppbmRleCA5MmZkMzBjLi5lMDU4YzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzX2FjcGkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzX2FjcGkuYwpAQCAtMTMzMCw2ICsxMzMwLDkgQEAKIAkJCWhvdGstPm1vZGVsID0gUDMwOwogCQkJcHJpbnRrKEtFUk5fTk9USUNFCiAJCQkgICAgICAgIiAgU2Ftc3VuZyBQMzAgZGV0ZWN0ZWQsIHN1cHBvcnRlZFxuIik7CisJCQlob3RrLT5tZXRob2RzID0gJm1vZGVsX2NvbmZbaG90ay0+bW9kZWxdOworCQkJa2ZyZWUobW9kZWwpOworCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CiAJCQlob3RrLT5tb2RlbCA9IE0yRTsKIAkJCXByaW50ayhLRVJOX05PVElDRSAiICB1bnN1cHBvcnRlZCBtb2RlbCAlcywgdHJ5aW5nICIKQEAgLTEzMzksOCArMTM0Miw2IEBACiAJCQlrZnJlZShtb2RlbCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlob3RrLT5tZXRob2RzID0gJm1vZGVsX2NvbmZbaG90ay0+bW9kZWxdOwotCQlyZXR1cm4gQUVfT0s7CiAJfQogCWhvdGstPm1ldGhvZHMgPSAmbW9kZWxfY29uZltob3RrLT5tb2RlbF07CiAJcHJpbnRrKEtFUk5fTk9USUNFICIgICVzIG1vZGVsIGRldGVjdGVkLCBzdXBwb3J0ZWRcbiIsIHN0cmluZyk7CkBAIC0xMzc0LDcgKzEzNzUsNyBAQAogCiAJa2ZyZWUobW9kZWwpOwogCi0JcmV0dXJuIEFFX09LOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFzdXNfaG90a19jaGVjayh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY2xhc3NtYXRlLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY2xhc3NtYXRlLWxhcHRvcC5jCmluZGV4IDNiZjM5OWYuLjM0MWNiZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NsYXNzbWF0ZS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jbGFzc21hdGUtbGFwdG9wLmMKQEAgLTIwOCw3ICsyMDgsNyBAQAogCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwogfQogCi1zdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjbXBjX2FjY2VsX3NlbnNpdGl2aXR5X2F0dHIgPSB7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgY21wY19hY2NlbF9zZW5zaXRpdml0eV9hdHRyID0gewogCS5hdHRyID0geyAubmFtZSA9ICJzZW5zaXRpdml0eSIsIC5tb2RlID0gMDY2MCB9LAogCS5zaG93ID0gY21wY19hY2NlbF9zZW5zaXRpdml0eV9zaG93LAogCS5zdG9yZSA9IGNtcGNfYWNjZWxfc2Vuc2l0aXZpdHlfc3RvcmUKQEAgLTU3MywxNiArNTczLDE3IEBACiAKIAlpcG1sLT5yZiA9IHJma2lsbF9hbGxvYygiY21wY19yZmtpbGwiLCAmYWNwaS0+ZGV2LCBSRktJTExfVFlQRV9XTEFOLAogCQkJCSZjbXBjX3Jma2lsbF9vcHMsIGFjcGktPmhhbmRsZSk7Ci0JLyogcmZraWxsX2FsbG9jIG1heSBmYWlsIGlmIFJGS0lMTCBpcyBkaXNhYmxlZC4gV2Ugc2hvdWxkIHN0aWxsIHdvcmsKLQkgKiBhbnl3YXkuICovCi0JaWYgKCFJU19FUlIoaXBtbC0+cmYpKSB7CisJLyoKKwkgKiBJZiBSRktJTEwgaXMgZGlzYWJsZWQsIHJma2lsbF9hbGxvYyB3aWxsIHJldHVybiBFUlJfUFRSKC1FTk9ERVYpLgorCSAqIFRoaXMgaXMgT0ssIGhvd2V2ZXIsIHNpbmNlIGFsbCBvdGhlciB1c2VzIG9mIHRoZSBkZXZpY2Ugd2lsbCBub3QKKwkgKiBkZXJlZmVuY2UgaXQuCisJICovCisJaWYgKGlwbWwtPnJmKSB7CiAJCXJldHZhbCA9IHJma2lsbF9yZWdpc3RlcihpcG1sLT5yZik7CiAJCWlmIChyZXR2YWwpIHsKIAkJCXJma2lsbF9kZXN0cm95KGlwbWwtPnJmKTsKIAkJCWlwbWwtPnJmID0gTlVMTDsKIAkJfQotCX0gZWxzZSB7Ci0JCWlwbWwtPnJmID0gTlVMTDsKIAl9CiAKIAlkZXZfc2V0X2RydmRhdGEoJmFjcGktPmRldiwgaXBtbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKaW5kZXggNzFmZjE1NC4uZDA3MWNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYwpAQCAtMjQsMTcgKzI0LDUwIEBACiAgKi8KIAogLyoKLSAqIGNvbWFwbC1sYXB0b3AuYyAtIENvbXBhbCBsYXB0b3Agc3VwcG9ydC4KKyAqIGNvbXBhbC1sYXB0b3AuYyAtIENvbXBhbCBsYXB0b3Agc3VwcG9ydC4KICAqCi0gKiBUaGUgZHJpdmVyIHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgcmZraWxsIHN1YnN5c3RlbSBhbmQKLSAqIHRoZSBMaW51eCBiYWNrbGlnaHQgY29udHJvbCBzdWJzeXN0ZW0uCisgKiBUaGlzIGRyaXZlciBleHBvcnRzIGEgZmV3IGZpbGVzIGluIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9jb21wYWwtbGFwdG9wLzoKKyAqICAgd2FrZV91cF9YWFggICBXaGV0aGVyIG9yIG5vdCB3ZSBsaXN0ZW4gdG8gc3VjaCB3YWtlIHVwIGV2ZW50cyAocncpCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhlc2UgcGxhdGZvcm0gZGV2aWNlIGF0dHJpYnV0ZXMgdGhlIGRyaXZlcgorICogcmVnaXN0ZXJzIGl0c2VsZiBpbiB0aGUgTGludXggYmFja2xpZ2h0IGNvbnRyb2wsIHBvd2VyX3N1cHBseSwgcmZraWxsCisgKiBhbmQgaHdtb24gc3Vic3lzdGVtIGFuZCBpcyBhdmFpbGFibGUgdG8gdXNlcnNwYWNlIHVuZGVyOgorICoKKyAqICAgL3N5cy9jbGFzcy9iYWNrbGlnaHQvY29tcGFsLWxhcHRvcC8KKyAqICAgL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvY29tcGFsLWxhcHRvcC8KKyAqICAgL3N5cy9jbGFzcy9yZmtpbGwvcmZraWxsWC8KKyAqICAgL3N5cy9jbGFzcy9od21vbi9od21vblgvCisgKgorICogTm90ZXMgb24gdGhlIHBvd2VyX3N1cHBseSBiYXR0ZXJ5IGludGVyZmFjZToKKyAqICAgLSB0aGUgIm1pbmltdW0iIGRlc2lnbiB2b2x0YWdlIGlzICp0aGUqIGRlc2lnbiB2b2x0YWdlCisgKiAgIC0gdGhlIGFtYmllbnQgdGVtcGVyYXR1cmUgaXMgdGhlIGF2ZXJhZ2UgYmF0dGVyeSB0ZW1wZXJhdHVyZQorICogICAgIGFuZCB0aGUgdmFsdWUgaXMgYW4gZWR1Y2F0ZWQgZ3Vlc3MgKHNlZSBjb21tZW50ZWQgY29kZSBiZWxvdykKKyAqCiAgKgogICogVGhpcyBkcml2ZXIgbWlnaHQgd29yayBvbiBvdGhlciBsYXB0b3BzIHByb2R1Y2VkIGJ5IENvbXBhbC4gSWYgeW91CiAgKiB3YW50IHRvIHRyeSBpdCB5b3UgY2FuIHBhc3MgZm9yY2U9MSBhcyBhcmd1bWVudCB0byB0aGUgbW9kdWxlIHdoaWNoCiAgKiB3aWxsIGZvcmNlIGl0IHRvIGxvYWQgZXZlbiB3aGVuIHRoZSBETUkgZGF0YSBkb2Vzbid0IGlkZW50aWZ5IHRoZQotICogbGFwdG9wIGFzIEZMOXguCisgKiBsYXB0b3AgYXMgY29tcGF0aWJsZS4KKyAqCisgKiBMb3RzIG9mIGRhdGEgYXZhaWxhYmxlIGF0OgorICogaHR0cDovL3NlcnZpY2UxLm1hcmFzc3QuY29tL0NvbXBhbC9KSEw5MF85MS9TZXJ2aWNlJTIwTWFudWFsLworICogSkhMOTAlMjBzZXJ2aWNlJTIwbWFudWFsLUZpbmFsLTA3MjUucGRmCisgKgorICoKKyAqCisgKiBTdXBwb3J0IGZvciB0aGUgQ29tcGFsIEpITDkwIGFkZGVkIGJ5IFJvYWxkIEZyZWRlcmlja3gKKyAqIChyb2FsZC5mcmVkZXJpY2t4QGdtYWlsLmNvbSk6CisgKiBEcml2ZXIgZ290IGxhcmdlIHJldmlzaW9uLiBBZGRlZCBmdW5jdGlvbmFsaXRpZXM6IGJhY2tsaWdodAorICogcG93ZXIsIHdha2Vfb25fWFhYLCBhIGh3bW9uIGFuZCBwb3dlcl9zdXBwbHkgaW50ZXJmYWNlLgorICoKKyAqIEluIGNhc2UgdGhpcyBnZXRzIG1lcmdlZCBpbnRvIHRoZSBrZXJuZWwgc291cmNlOiBJIHdhbnQgdG8gZGVkaWNhdGUgdGhpcworICogdG8gS2FzcGVyIE1lZXJ0cywgdGhlIGF3ZXNvbWUgZ3V5IHdobyBzaG93ZWQgbWUgTGludXggYW5kIEMhCiAgKi8KIAorLyogTk9URTogY3VycmVudGx5IHRoZSB3YWtlX29uX1hYWCwgaHdtb24gYW5kIHBvd2VyX3N1cHBseSBpbnRlcmZhY2VzIGFyZQorICogb25seSBlbmFibGVkIG9uIGEgSkhMOTAgYm9hcmQgdW50aWwgaXQgaXMgdmVyaWZpZWQgdGhhdCB0aGV5IHdvcmsgb24gdGhlCisgKiBvdGhlciBib2FyZHMgdG9vLiAgU2VlIHRoZSBleHRyYV9mZWF0dXJlcyB2YXJpYWJsZS4gKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTQzLDcxICs3NiwyOTYgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KIAotI2RlZmluZSBDT01QQUxfRFJJVkVSX1ZFUlNJT04gIjAuMi42IgogCi0jZGVmaW5lIENPTVBBTF9MQ0RfTEVWRUxfTUFYIDgKKy8qID09PT09PT0gKi8KKy8qIERlZmluZXMgKi8KKy8qID09PT09PT0gKi8KKyNkZWZpbmUgRFJJVkVSX05BTUUgImNvbXBhbC1sYXB0b3AiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjIuNyIKIAotI2RlZmluZSBDT01QQUxfRUNfQ09NTUFORF9XSVJFTEVTUyAweEJCCi0jZGVmaW5lIENPTVBBTF9FQ19DT01NQU5EX0xDRF9MRVZFTCAweEI5CisjZGVmaW5lIEJBQ0tMSUdIVF9MRVZFTF9BRERSCQkweEI5CisjZGVmaW5lIEJBQ0tMSUdIVF9MRVZFTF9NQVgJCTcKKyNkZWZpbmUgQkFDS0xJR0hUX1NUQVRFX0FERFIJCTB4NTkKKyNkZWZpbmUgQkFDS0xJR0hUX1NUQVRFX09OX0RBVEEJCTB4RTEKKyNkZWZpbmUgQkFDS0xJR0hUX1NUQVRFX09GRl9EQVRBCTB4RTIKIAotI2RlZmluZSBLSUxMU1dJVENIX01BU0sgMHgxMAotI2RlZmluZSBXTEFOX01BU0sJMHgwMQotI2RlZmluZSBCVF9NQVNLIAkweDAyCisjZGVmaW5lIFdBS0VfVVBfQUREUgkJCTB4QTQKKyNkZWZpbmUgV0FLRV9VUF9QTUUJCQkoMSA8PCAwKQorI2RlZmluZSBXQUtFX1VQX01PREVNCQkJKDEgPDwgMSkKKyNkZWZpbmUgV0FLRV9VUF9MQU4JCQkoMSA8PCAyKQorI2RlZmluZSBXQUtFX1VQX1dMQU4JCQkoMSA8PCA0KQorI2RlZmluZSBXQUtFX1VQX0tFWQkJCSgxIDw8IDYpCisjZGVmaW5lIFdBS0VfVVBfTU9VU0UJCQkoMSA8PCA3KQogCi1zdGF0aWMgc3RydWN0IHJma2lsbCAqd2lmaV9yZmtpbGw7Ci1zdGF0aWMgc3RydWN0IHJma2lsbCAqYnRfcmZraWxsOwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbXBhbF9kZXZpY2U7CisjZGVmaW5lIFdJUkVMRVNTX0FERFIJCQkweEJCCisjZGVmaW5lIFdJUkVMRVNTX1dMQU4JCQkoMSA8PCAwKQorI2RlZmluZSBXSVJFTEVTU19CVAkJCSgxIDw8IDEpCisjZGVmaW5lIFdJUkVMRVNTX1dMQU5fRVhJU1RTCQkoMSA8PCAyKQorI2RlZmluZSBXSVJFTEVTU19CVF9FWElTVFMJCSgxIDw8IDMpCisjZGVmaW5lIFdJUkVMRVNTX0tJTExTV0lUQ0gJCSgxIDw8IDQpCiAKKyNkZWZpbmUgUFdNX0FERFJFU1MJCQkweDQ2CisjZGVmaW5lIFBXTV9ESVNBQkxFX0FERFIJCTB4NTkKKyNkZWZpbmUgUFdNX0RJU0FCTEVfREFUQQkJMHhBNQorI2RlZmluZSBQV01fRU5BQkxFX0FERFIJCQkweDU5CisjZGVmaW5lIFBXTV9FTkFCTEVfREFUQQkJCTB4QTgKKworI2RlZmluZSBGQU5fQUREUkVTUwkJCTB4NDYKKyNkZWZpbmUgRkFOX0RBVEEJCQkweDgxCisjZGVmaW5lIEZBTl9GVUxMX09OX0NNRAkJCTB4NTkgLyogRG9lc24ndCBzZWVtIHRvIHdvcmsuIEp1c3QgKi8KKyNkZWZpbmUgRkFOX0ZVTExfT05fRU5BQkxFCQkweDc2IC8qIGZvcmNlIHRoZSBwd20gc2lnbmFsIHRvIGl0cyAqLworI2RlZmluZSBGQU5fRlVMTF9PTl9ESVNBQkxFCQkweDc3IC8qIG1heGltdW0gdmFsdWUgaW5zdGVhZCAqLworCisjZGVmaW5lIFRFTVBfQ1BVCQkJMHhCMAorI2RlZmluZSBURU1QX0NQVV9MT0NBTAkJCTB4QjEKKyNkZWZpbmUgVEVNUF9DUFVfRFRTCQkJMHhCNQorI2RlZmluZSBURU1QX05PUlRIQlJJREdFCQkweEI2CisjZGVmaW5lIFRFTVBfVkdBCQkJMHhCNAorI2RlZmluZSBURU1QX1NLSU4JCQkweEIyCisKKyNkZWZpbmUgQkFUX01BTlVGQUNUVVJFUl9OQU1FX0FERFIJMHgxMAorI2RlZmluZSBCQVRfTUFOVUZBQ1RVUkVSX05BTUVfTEVOCTkKKyNkZWZpbmUgQkFUX01PREVMX05BTUVfQUREUgkJMHgxOQorI2RlZmluZSBCQVRfTU9ERUxfTkFNRV9MRU4JCTYKKyNkZWZpbmUgQkFUX1NFUklBTF9OVU1CRVJfQUREUgkJMHhDNAorI2RlZmluZSBCQVRfU0VSSUFMX05VTUJFUl9MRU4JCTUKKyNkZWZpbmUgQkFUX0NIQVJHRV9OT1cJCQkweEMyCisjZGVmaW5lIEJBVF9DSEFSR0VfREVTSUdOCQkweENBCisjZGVmaW5lIEJBVF9WT0xUQUdFX05PVwkJCTB4QzYKKyNkZWZpbmUgQkFUX1ZPTFRBR0VfREVTSUdOCQkweEM4CisjZGVmaW5lIEJBVF9DVVJSRU5UX05PVwkJCTB4RDAKKyNkZWZpbmUgQkFUX0NVUlJFTlRfQVZHCQkJMHhEMgorI2RlZmluZSBCQVRfUE9XRVIJCQkweEQ0CisjZGVmaW5lIEJBVF9DQVBBQ0lUWQkJCTB4Q0UKKyNkZWZpbmUgQkFUX1RFTVAJCQkweEQ2CisjZGVmaW5lIEJBVF9URU1QX0FWRwkJCTB4RDcKKyNkZWZpbmUgQkFUX1NUQVRVUzAJCQkweEMxCisjZGVmaW5lIEJBVF9TVEFUVVMxCQkJMHhGMAorI2RlZmluZSBCQVRfU1RBVFVTMgkJCTB4RjEKKyNkZWZpbmUgQkFUX1NUT1BfQ0hBUkdFMQkJMHhGMgorI2RlZmluZSBCQVRfU1RPUF9DSEFSR0UyCQkweEYzCisKKyNkZWZpbmUgQkFUX1MwX0RJU0NIQVJHRQkJKDEgPDwgMCkKKyNkZWZpbmUgQkFUX1MwX0RJU0NIUkdfQ1JJVElDQUwJCSgxIDw8IDIpCisjZGVmaW5lIEJBVF9TMF9MT1cJCQkoMSA8PCAzKQorI2RlZmluZSBCQVRfUzBfQ0hBUkdJTkcJCQkoMSA8PCAxKQorI2RlZmluZSBCQVRfUzBfQUMJCQkoMSA8PCA3KQorI2RlZmluZSBCQVRfUzFfRVhJU1RTCQkJKDEgPDwgMCkKKyNkZWZpbmUgQkFUX1MxX0ZVTEwJCQkoMSA8PCAxKQorI2RlZmluZSBCQVRfUzFfRU1QVFkJCQkoMSA8PCAyKQorI2RlZmluZSBCQVRfUzFfTGlJT05fT1JfTmlNSAkJKDEgPDwgNykKKyNkZWZpbmUgQkFUX1MyX0xPV19MT1cJCQkoMSA8PCAwKQorI2RlZmluZSBCQVRfU1RPUF9DSFJHMV9CQURfQ0VMTAkJKDEgPDwgMSkKKyNkZWZpbmUgQkFUX1NUT1BfQ0hSRzFfQ09NTV9GQUlMCSgxIDw8IDIpCisjZGVmaW5lIEJBVF9TVE9QX0NIUkcxX09WRVJWT0xUQUdFCSgxIDw8IDYpCisjZGVmaW5lIEJBVF9TVE9QX0NIUkcxX09WRVJURU1QRVJBVFVSRQkoMSA8PCA3KQorCisKKy8qID09PT09PT0gKi8KKy8qIFN0cnVjdHMgKi8KKy8qID09PT09PT0gKi8KK3N0cnVjdCBjb21wYWxfZGF0YXsKKwkvKiBGYW4gY29udHJvbCAqLworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlpbnQgcHdtX2VuYWJsZTsgLyogMDpmdWxsIG9uLCAxOnNldCBieSBwd20xLCAyOmNvbnRyb2wgYnkgbW90ZXJib2FyZCAqLworCXVuc2lnbmVkIGNoYXIgY3Vycl9wd207CisKKwkvKiBQb3dlciBzdXBwbHkgKi8KKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2luZm8gcHN5X2luZm87CisJY2hhciBiYXRfbW9kZWxfbmFtZVtCQVRfTU9ERUxfTkFNRV9MRU4gKyAxXTsKKwljaGFyIGJhdF9tYW51ZmFjdHVyZXJfbmFtZVtCQVRfTUFOVUZBQ1RVUkVSX05BTUVfTEVOICsgMV07CisJY2hhciBiYXRfc2VyaWFsX251bWJlcltCQVRfU0VSSUFMX05VTUJFUl9MRU4gKyAxXTsKK307CisKKworLyogPT09PT09PT09PT09PT09ICovCisvKiBHZW5lcmFsIGdsb2JhbHMgKi8KKy8qID09PT09PT09PT09PT09PSAqLwogc3RhdGljIGludCBmb3JjZTsKIG1vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgZHJpdmVyIGxvYWQsIGlnbm9yZSBETUkgZGF0YSIpOwogCi0vKiBIYXJkd2FyZSBhY2Nlc3MgKi8KKy8qIFN1cHBvcnQgZm9yIHRoZSB3YWtlX29uX1hYWCwgaHdtb24gYW5kIHBvd2VyX3N1cHBseSBpbnRlcmZhY2UuIEN1cnJlbnRseQorICogb25seSBnZXRzIGVuYWJsZWQgb24gYSBKSEw5MCBib2FyZC4gTWlnaHQgd29yayB3aXRoIHRoZSBvdGhlcnMgdG9vICovCitzdGF0aWMgYm9vbCBleHRyYV9mZWF0dXJlczsKIAotc3RhdGljIGludCBzZXRfbGNkX2xldmVsKGludCBsZXZlbCkKKy8qIE5hc3R5IHN0dWZmLiBGb3Igc29tZSByZWFzb24gdGhlIGZhbiBjb250cm9sIGlzIHZlcnkgdW4tbGluZWFyLiAgSSd2ZQorICogY29tZSB1cCB3aXRoIHRoZXNlIHZhbHVlcyBieSBsb29waW5nIHRocm91Z2ggdGhlIHBvc3NpYmxlIGlucHV0cyBhbmQKKyAqIHdhdGNoaW5nIHRoZSBvdXRwdXQgb2YgYWRkcmVzcyAweDRGIChkbyBhbiBlY190cmFuc2FjdGlvbiB3cml0aW5nIDB4MzMKKyAqIGludG8gMHg0RiBhbmQgcmVhZCBhIGZldyBieXRlcyBmcm9tIHRoZSBvdXRwdXQsIGxpa2Ugc286CisgKgl1OCB3cml0ZURhdGEgPSAweDMzOworICoJZWNfdHJhbnNhY3Rpb24oMHg0RiwgJndyaXRlRGF0YSwgMSwgYnVmZmVyLCAzMiwgMCk7CisgKiBUaGF0IGFkZHJlc3MgaXMgbGFibGVkICJmYW4xIHRhYmxlIGluZm9ybWF0aW9uIiBpbiB0aGUgc2VydmljZSBtYW51YWwuCisgKiBJdCBzaG91bGQgYmUgY2xlYXIgd2hpY2ggdmFsdWUgaW4gJ2J1ZmZlcicgY2hhbmdlcykuIFRoaXMgc2VlbXMgdG8gYmUKKyAqIHJlbGF0ZWQgdG8gZmFuIHNwZWVkLiBJdCBpc24ndCBhIHByb3BlciAncmVhbHRpbWUnIGZhbiBzcGVlZCB2YWx1ZQorICogdGhvdWdoLCBiZWNhdXNlIHBoeXNpY2FsbHkgc3RvcHBpbmcgb3Igc3BlZWRpbmcgdXAgdGhlIGZhbiBkb2Vzbid0CisgKiBjaGFuZ2UgaXQuIEl0IG1pZ2h0IGJlIHRoZSBhdmVyYWdlIHZvbHRhZ2Ugb3IgY3VycmVudCBvZiB0aGUgcHdtIG91dHB1dC4KKyAqIE5ldmVydGhlbGVzcywgaXQgaXMgbW9yZSBmaW5lLWdyYWluZWQgdGhhbiB0aGUgYWN0dWFsIFJQTSByZWFkaW5nICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwd21fbG9va3VwX3RhYmxlWzI1Nl0gPSB7CisJMCwgMCwgMCwgMSwgMSwgMSwgMiwgMjUzLCAyNTQsIDMsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDUsIDYsIDYsIDYsCisJNywgNywgNywgOCwgODYsIDg2LCA5LCA5LCA5LCAxMCwgMTAsIDEwLCAxMSwgOTIsIDkyLCAxMiwgMTIsIDk1LAorCTEzLCA2NiwgNjYsIDE0LCAxNCwgOTgsIDE1LCAxNSwgMTUsIDE2LCAxNiwgNjcsIDE3LCAxNywgNzIsIDE4LCA3MCwKKwk3NSwgMTksIDkwLCA5MCwgNzMsIDczLCA3MywgMjEsIDIxLCA5MSwgOTEsIDkxLCA5NiwgMjMsIDk0LCA5NCwgOTQsCisJOTQsIDk0LCA5NCwgOTQsIDk0LCA5NCwgOTQsIDE0MSwgMTQxLCAyMzgsIDIyMywgMTkyLCAxMzksIDEzOSwgMTM5LAorCTEzOSwgMTM5LCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgNzgsIDc4LCA3OCwgNzgsIDc4LCA3NiwgNzYsIDc2LAorCTc2LCA3NiwgNzksIDc5LCA3OSwgNzksIDc5LCA3OSwgNzksIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjIsIDIyLCAyMiwKKwkyMiwgMjIsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDIxOSwgMjE5LCAyMTksIDIxOSwgMjE5LCAyMTksIDIxOSwKKwkyMTksIDI3LCAyNywgMTg4LCAxODgsIDI4LCAyOCwgMjgsIDI5LCAxODYsIDE4NiwgMTg2LCAxODYsIDE4NiwKKwkxODYsIDE4NiwgMTg2LCAxODYsIDE4NiwgMzEsIDMxLCAzMSwgMzEsIDMxLCAzMiwgMzIsIDMyLCA0MSwgMzMsCisJMzMsIDMzLCAzMywgMzMsIDI1MiwgMjUyLCAzNCwgMzQsIDM0LCA0MywgMzUsIDM1LCAzNSwgMzYsIDM2LCAzOCwKKwkyMDYsIDIwNiwgMjA2LCAyMDYsIDIwNiwgMjA2LCAyMDYsIDIwNiwgMjA2LCAzNywgMzcsIDM3LCA0NiwgNDYsCisJNDcsIDQ3LCAyMzIsIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMyLCAyMzIsIDQ4LCA0OCwKKwk0OCwgNDgsIDQ4LCA0MCwgNDAsIDQwLCA0OSwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0NCwKKwkxODksIDE4OSwgMTg5LCAxODksIDU0LCA1NCwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCAyNTEsCisJMTkxLCAxOTksIDE5OSwgMTk5LCAxOTksIDE5OSwgMjE1LCAyMTUsIDIxNSwgMjE1LCAxODcsIDE4NywgMTg3LAorCTE4NywgMTg3LCAxOTMsIDUwCit9OworCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBIYXJkd2FyZSBhY2Nlc3MgZnVuY3Rpb25zICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBHZW5lcmFsIGFjY2VzcyAqLworc3RhdGljIHU4IGVjX3JlYWRfdTgodTggYWRkcikKIHsKLQlpZiAobGV2ZWwgPCAwIHx8IGxldmVsID49IENPTVBBTF9MQ0RfTEVWRUxfTUFYKQorCXU4IHZhbHVlOworCWVjX3JlYWQoYWRkciwgJnZhbHVlKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBzOCBlY19yZWFkX3M4KHU4IGFkZHIpCit7CisJcmV0dXJuIChzOCllY19yZWFkX3U4KGFkZHIpOworfQorCitzdGF0aWMgdTE2IGVjX3JlYWRfdTE2KHU4IGFkZHIpCit7CisJaW50IGhpLCBsbzsKKwlsbyA9IGVjX3JlYWRfdTgoYWRkcik7CisJaGkgPSBlY19yZWFkX3U4KGFkZHIgKyAxKTsKKwlyZXR1cm4gKGhpIDw8IDgpICsgbG87Cit9CisKK3N0YXRpYyBzMTYgZWNfcmVhZF9zMTYodTggYWRkcikKK3sKKwlyZXR1cm4gKHMxNikgZWNfcmVhZF91MTYoYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGVjX3JlYWRfc2VxdWVuY2UodTggYWRkciwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWVjX3JlYWQoYWRkciArIGksIGJ1ZiArIGkpOworfQorCisKKy8qIEJhY2tsaWdodCBhY2Nlc3MgKi8KK3N0YXRpYyBpbnQgc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwpCit7CisJaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IEJBQ0tMSUdIVF9MRVZFTF9NQVgpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZWNfd3JpdGUoQ09NUEFMX0VDX0NPTU1BTkRfTENEX0xFVkVMLCBsZXZlbCk7CisJZWNfd3JpdGUoQkFDS0xJR0hUX0xFVkVMX0FERFIsIGxldmVsKTsKIAorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdldF9iYWNrbGlnaHRfbGV2ZWwodm9pZCkKK3sKKwlyZXR1cm4gKGludCkgZWNfcmVhZF91OChCQUNLTElHSFRfTEVWRUxfQUREUik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9iYWNrbGlnaHRfc3RhdGUoYm9vbCBvbikKK3sKKwl1OCBkYXRhID0gb24gPyBCQUNLTElHSFRfU1RBVEVfT05fREFUQSA6IEJBQ0tMSUdIVF9TVEFURV9PRkZfREFUQTsKKwllY190cmFuc2FjdGlvbihCQUNLTElHSFRfU1RBVEVfQUREUiwgJmRhdGEsIDEsIE5VTEwsIDAsIDApOworfQorCisKKy8qIEZhbiBjb250cm9sIGFjY2VzcyAqLworc3RhdGljIHZvaWQgcHdtX2VuYWJsZV9jb250cm9sKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB3cml0ZURhdGEgPSBQV01fRU5BQkxFX0RBVEE7CisJZWNfdHJhbnNhY3Rpb24oUFdNX0VOQUJMRV9BRERSLCAmd3JpdGVEYXRhLCAxLCBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgcHdtX2Rpc2FibGVfY29udHJvbCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgd3JpdGVEYXRhID0gUFdNX0RJU0FCTEVfREFUQTsKKwllY190cmFuc2FjdGlvbihQV01fRElTQUJMRV9BRERSLCAmd3JpdGVEYXRhLCAxLCBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3B3bShpbnQgcHdtKQoreworCWVjX3RyYW5zYWN0aW9uKFBXTV9BRERSRVNTLCAmcHdtX2xvb2t1cF90YWJsZVtwd21dLCAxLCBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIGludCBnZXRfZmFuX3JwbSh2b2lkKQoreworCXU4IHZhbHVlLCBkYXRhID0gRkFOX0RBVEE7CisJZWNfdHJhbnNhY3Rpb24oRkFOX0FERFJFU1MsICZkYXRhLCAxLCAmdmFsdWUsIDEsIDApOworCXJldHVybiAxMDAgKiAoaW50KXZhbHVlOworfQorCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09ICovCisvKiBJbnRlcmZhY2UgZnVuY3Rpb25zICovCisvKiA9PT09PT09PT09PT09PT09PT09ICovCisKKy8qIEJhY2tsaWdodCBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmIpCit7CisJcmV0dXJuIGdldF9iYWNrbGlnaHRfbGV2ZWwoKTsKK30KKworc3RhdGljIGludCBibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiKQoreworCWludCByZXQgPSBzZXRfYmFja2xpZ2h0X2xldmVsKGItPnByb3BzLmJyaWdodG5lc3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzZXRfYmFja2xpZ2h0X3N0YXRlKChiLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQkmJiAgICAhKGItPnByb3BzLnN0YXRlICYgQkxfQ09SRV9TVVNQRU5ERUQpCisJCSYmICAgICEoYi0+cHJvcHMuc3RhdGUgJiBCTF9DT1JFX0ZCQkxBTkspKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnZXRfbGNkX2xldmVsKHZvaWQpCi17Ci0JdTggcmVzdWx0Oworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGNvbXBhbGJsX29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MgPSBibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IGJsX3VwZGF0ZV9zdGF0dXMsCit9OwogCi0JZWNfcmVhZChDT01QQUxfRUNfQ09NTUFORF9MQ0RfTEVWRUwsICZyZXN1bHQpOwogCi0JcmV0dXJuIChpbnQpIHJlc3VsdDsKLX0KLQorLyogV2lyZWxlc3MgaW50ZXJmYWNlICovCiBzdGF0aWMgaW50IGNvbXBhbF9yZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJhZGlvID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JdTggcmVzdWx0LCB2YWx1ZTsKLQotCWVjX3JlYWQoQ09NUEFMX0VDX0NPTU1BTkRfV0lSRUxFU1MsICZyZXN1bHQpOworCXU4IHJlc3VsdCA9IGVjX3JlYWRfdTgoV0lSRUxFU1NfQUREUik7CisJdTggdmFsdWU7CiAKIAlpZiAoIWJsb2NrZWQpCiAJCXZhbHVlID0gKHU4KSAocmVzdWx0IHwgcmFkaW8pOwogCWVsc2UKIAkJdmFsdWUgPSAodTgpIChyZXN1bHQgJiB+cmFkaW8pOwotCWVjX3dyaXRlKENPTVBBTF9FQ19DT01NQU5EX1dJUkVMRVNTLCB2YWx1ZSk7CisJZWNfd3JpdGUoV0lSRUxFU1NfQUREUiwgdmFsdWUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbXBhbF9yZmtpbGxfcG9sbChzdHJ1Y3QgcmZraWxsICpyZmtpbGwsIHZvaWQgKmRhdGEpCiB7Ci0JdTggcmVzdWx0OwotCWJvb2wgaHdfYmxvY2tlZDsKLQotCWVjX3JlYWQoQ09NUEFMX0VDX0NPTU1BTkRfV0lSRUxFU1MsICZyZXN1bHQpOwotCi0JaHdfYmxvY2tlZCA9ICEocmVzdWx0ICYgS0lMTFNXSVRDSF9NQVNLKTsKKwl1OCByZXN1bHQgPSBlY19yZWFkX3U4KFdJUkVMRVNTX0FERFIpOworCWJvb2wgaHdfYmxvY2tlZCA9ICEocmVzdWx0ICYgV0lSRUxFU1NfS0lMTFNXSVRDSCk7CiAJcmZraWxsX3NldF9od19zdGF0ZShyZmtpbGwsIGh3X2Jsb2NrZWQpOwogfQogCkBAIC0xMTYsODAgKzM3NCw0MDQgQEAKIAkuc2V0X2Jsb2NrID0gY29tcGFsX3Jma2lsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IHNldHVwX3Jma2lsbCh2b2lkKQorCisvKiBXYWtlX3VwIGludGVyZmFjZSAqLworI2RlZmluZSBTSU1QTEVfTUFTS0VEX1NUT1JFX1NIT1coTkFNRSwgQUREUiwgTUFTSykJCQlcCitzdGF0aWMgc3NpemVfdCBOQU1FIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJCVwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoZWNfcmVhZF91OChBRERSKSAmIE1BU0spICE9IDApKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IE5BTUUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJCVwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJaW50IHN0YXRlOwkJCQkJCQlcCisJdTggb2xkX3ZhbCA9IGVjX3JlYWRfdTgoQUREUik7CQkJCQlcCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZzdGF0ZSkgIT0gMSB8fCAoc3RhdGUgPCAwIHx8IHN0YXRlID4gMSkpCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCWVjX3dyaXRlKEFERFIsIHN0YXRlID8gKG9sZF92YWwgfCBNQVNLKSA6IChvbGRfdmFsICYgfk1BU0spKTsJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCitTSU1QTEVfTUFTS0VEX1NUT1JFX1NIT1cod2FrZV91cF9wbWUsCVdBS0VfVVBfQUREUiwgV0FLRV9VUF9QTUUpCitTSU1QTEVfTUFTS0VEX1NUT1JFX1NIT1cod2FrZV91cF9tb2RlbSwJV0FLRV9VUF9BRERSLCBXQUtFX1VQX01PREVNKQorU0lNUExFX01BU0tFRF9TVE9SRV9TSE9XKHdha2VfdXBfbGFuLAlXQUtFX1VQX0FERFIsIFdBS0VfVVBfTEFOKQorU0lNUExFX01BU0tFRF9TVE9SRV9TSE9XKHdha2VfdXBfd2xhbiwJV0FLRV9VUF9BRERSLCBXQUtFX1VQX1dMQU4pCitTSU1QTEVfTUFTS0VEX1NUT1JFX1NIT1cod2FrZV91cF9rZXksCVdBS0VfVVBfQUREUiwgV0FLRV9VUF9LRVkpCitTSU1QTEVfTUFTS0VEX1NUT1JFX1NIT1cod2FrZV91cF9tb3VzZSwJV0FLRV9VUF9BRERSLCBXQUtFX1VQX01PVVNFKQorCisKKy8qIEdlbmVyYWwgaHdtb24gaW50ZXJmYWNlICovCitzdGF0aWMgc3NpemVfdCBod21vbl9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCWludCByZXQ7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIERSSVZFUl9OQU1FKTsKK30KIAotCXdpZmlfcmZraWxsID0gcmZraWxsX2FsbG9jKCJjb21wYWwtd2lmaSIsICZjb21wYWxfZGV2aWNlLT5kZXYsCi0JCQkJUkZLSUxMX1RZUEVfV0xBTiwgJmNvbXBhbF9yZmtpbGxfb3BzLAotCQkJCSh2b2lkICopIFdMQU5fTUFTSyk7Ci0JaWYgKCF3aWZpX3Jma2lsbCkKLQkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSByZmtpbGxfcmVnaXN0ZXIod2lmaV9yZmtpbGwpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3dpZmk7CisvKiBGYW4gY29udHJvbCBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzc2l6ZV90IHB3bV9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnB3bV9lbmFibGUpOworfQogCi0JYnRfcmZraWxsID0gcmZraWxsX2FsbG9jKCJjb21wYWwtYmx1ZXRvb3RoIiwgJmNvbXBhbF9kZXZpY2UtPmRldiwKLQkJCQlSRktJTExfVFlQRV9CTFVFVE9PVEgsICZjb21wYWxfcmZraWxsX29wcywKLQkJCQkodm9pZCAqKSBCVF9NQVNLKTsKLQlpZiAoIWJ0X3Jma2lsbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9hbGxvY2F0ZV9idDsKK3N0YXRpYyBzc2l6ZV90IHB3bV9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJbG9uZyB2YWw7CisJaW50IGVycjsKKwllcnIgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YS0+cHdtX2VuYWJsZSA9IHZhbDsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOiAgLyogRnVsbCBzcGVlZCAqLworCQlwd21fZW5hYmxlX2NvbnRyb2woKTsKKwkJc2V0X3B3bSgyNTUpOworCQlicmVhazsKKwljYXNlIDE6ICAvKiBBcyBzZXQgYnkgcHdtMSAqLworCQlwd21fZW5hYmxlX2NvbnRyb2woKTsKKwkJc2V0X3B3bShkYXRhLT5jdXJyX3B3bSk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIENvbnRyb2wgYnkgbW90aGVyYm9hcmQgKi8KKwkJcHdtX2Rpc2FibGVfY29udHJvbCgpOworCQlicmVhazsKIAl9Ci0JcmV0ID0gcmZraWxsX3JlZ2lzdGVyKGJ0X3Jma2lsbCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcmVnaXN0ZXJfYnQ7CiAKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3bV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY29tcGFsX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaGh1XG4iLCBkYXRhLT5jdXJyX3B3bSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3bV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY29tcGFsX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlsb25nIHZhbDsKKwlpbnQgZXJyOworCWVyciA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YS0+Y3Vycl9wd20gPSB2YWw7CisKKwlpZiAoZGF0YS0+cHdtX2VuYWJsZSAhPSAxKQorCQlyZXR1cm4gY291bnQ7CisJc2V0X3B3bSh2YWwpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBmYW5fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGdldF9mYW5fcnBtKCkpOworfQorCisKKy8qIFRlbXBlcmF0dXJlIGludGVyZmFjZSAqLworI2RlZmluZSBURU1QRVJBVFVSRV9TSE9XX1RFTVBfQU5EX0xBQkVMKFBPU1RGSVgsIEFERFJFU1MsIExBQkVMKQlcCitzdGF0aWMgc3NpemVfdCB0ZW1wXyMjUE9TVEZJWChzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgMTAwMCAqIChpbnQpZWNfcmVhZF9zOChBRERSRVNTKSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBsYWJlbF8jI1BPU1RGSVgoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIExBQkVMKTsJCQkJXAorfQorCisvKiBMYWJlbHMgYXMgaW4gc2VydmljZSBndWlkZSAqLworVEVNUEVSQVRVUkVfU0hPV19URU1QX0FORF9MQUJFTChjcHUsICAgICAgICBURU1QX0NQVSwgICAgICAgICJDUFVfVEVNUCIpOworVEVNUEVSQVRVUkVfU0hPV19URU1QX0FORF9MQUJFTChjcHVfbG9jYWwsICBURU1QX0NQVV9MT0NBTCwgICJDUFVfVEVNUF9MT0NBTCIpOworVEVNUEVSQVRVUkVfU0hPV19URU1QX0FORF9MQUJFTChjcHVfRFRTLCAgICBURU1QX0NQVV9EVFMsICAgICJDUFVfRFRTIik7CitURU1QRVJBVFVSRV9TSE9XX1RFTVBfQU5EX0xBQkVMKG5vcnRoYnJpZGdlLFRFTVBfTk9SVEhCUklER0UsIk5vcnRoQnJpZGdlIik7CitURU1QRVJBVFVSRV9TSE9XX1RFTVBfQU5EX0xBQkVMKHZnYSwgICAgICAgIFRFTVBfVkdBLCAgICAgICAgIlZHQV9URU1QIik7CitURU1QRVJBVFVSRV9TSE9XX1RFTVBfQU5EX0xBQkVMKFNLSU4sICAgICAgIFRFTVBfU0tJTiwgICAgICAgIlNLSU5fVEVNUDkwIik7CisKKworLyogUG93ZXIgc3VwcGx5IGludGVyZmFjZSAqLworc3RhdGljIGludCBiYXRfc3RhdHVzKHZvaWQpCit7CisJdTggc3RhdHVzMCA9IGVjX3JlYWRfdTgoQkFUX1NUQVRVUzApOworCXU4IHN0YXR1czEgPSBlY19yZWFkX3U4KEJBVF9TVEFUVVMxKTsKKworCWlmIChzdGF0dXMwICYgQkFUX1MwX0NIQVJHSU5HKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwlpZiAoc3RhdHVzMCAmIEJBVF9TMF9ESVNDSEFSR0UpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCWlmIChzdGF0dXMxICYgQkFUX1MxX0ZVTEwpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJcmV0dXJuIFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworfQorCitzdGF0aWMgaW50IGJhdF9oZWFsdGgodm9pZCkKK3sKKwl1OCBzdGF0dXMgPSBlY19yZWFkX3U4KEJBVF9TVE9QX0NIQVJHRTEpOworCisJaWYgKHN0YXR1cyAmIEJBVF9TVE9QX0NIUkcxX09WRVJURU1QRVJBVFVSRSkKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7CisJaWYgKHN0YXR1cyAmIEJBVF9TVE9QX0NIUkcxX09WRVJWT0xUQUdFKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwlpZiAoc3RhdHVzICYgQkFUX1NUT1BfQ0hSRzFfQkFEX0NFTEwpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJaWYgKHN0YXR1cyAmIEJBVF9TVE9QX0NIUkcxX0NPTU1fRkFJTCkKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworfQorCitzdGF0aWMgaW50IGJhdF9pc19wcmVzZW50KHZvaWQpCit7CisJdTggc3RhdHVzID0gZWNfcmVhZF91OChCQVRfU1RBVFVTMik7CisJcmV0dXJuICgoc3RhdHVzICYgQkFUX1MxX0VYSVNUUykgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYmF0X3RlY2hub2xvZ3kodm9pZCkKK3sKKwl1OCBzdGF0dXMgPSBlY19yZWFkX3U4KEJBVF9TVEFUVVMxKTsKKworCWlmIChzdGF0dXMgJiBCQVRfUzFfTGlJT05fT1JfTmlNSCkKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJT047CisJcmV0dXJuIFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX05pTUg7Cit9CisKK3N0YXRpYyBpbnQgYmF0X2NhcGFjaXR5X2xldmVsKHZvaWQpCit7CisJdTggc3RhdHVzMCA9IGVjX3JlYWRfdTgoQkFUX1NUQVRVUzApOworCXU4IHN0YXR1czEgPSBlY19yZWFkX3U4KEJBVF9TVEFUVVMxKTsKKwl1OCBzdGF0dXMyID0gZWNfcmVhZF91OChCQVRfU1RBVFVTMik7CisKKwlpZiAoc3RhdHVzMCAmIEJBVF9TMF9ESVNDSFJHX0NSSVRJQ0FMCisJCQl8fCBzdGF0dXMxICYgQkFUX1MxX0VNUFRZCisJCQl8fCBzdGF0dXMyICYgQkFUX1MyX0xPV19MT1cpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfQ1JJVElDQUw7CisJaWYgKHN0YXR1czAgJiBCQVRfUzBfTE9XKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0xPVzsKKwlpZiAoc3RhdHVzMSAmIEJBVF9TMV9GVUxMKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0ZVTEw7CisJcmV0dXJuIFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9OT1JNQUw7Cit9CisKK3N0YXRpYyBpbnQgYmF0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhOworCWRhdGEgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgY29tcGFsX2RhdGEsIHBzeSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IGJhdF9zdGF0dXMoKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCXZhbC0+aW50dmFsID0gYmF0X2hlYWx0aCgpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gYmF0X2lzX3ByZXNlbnQoKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQl2YWwtPmludHZhbCA9IGJhdF90ZWNobm9sb2d5KCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOiAvKiBUSEUgZGVzaWduIHZvbHRhZ2UuLi4gKi8KKwkJdmFsLT5pbnR2YWwgPSBlY19yZWFkX3UxNihCQVRfVk9MVEFHRV9ERVNJR04pICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBlY19yZWFkX3UxNihCQVRfVk9MVEFHRV9OT1cpICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBlY19yZWFkX3MxNihCQVRfQ1VSUkVOVF9OT1cpICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJdmFsLT5pbnR2YWwgPSBlY19yZWFkX3MxNihCQVRfQ1VSUkVOVF9BVkcpICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9OT1c6CisJCXZhbC0+aW50dmFsID0gZWNfcmVhZF91OChCQVRfUE9XRVIpICogMTAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046CisJCXZhbC0+aW50dmFsID0gZWNfcmVhZF91MTYoQkFUX0NIQVJHRV9ERVNJR04pICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCQl2YWwtPmludHZhbCA9IGVjX3JlYWRfdTE2KEJBVF9DSEFSR0VfTk9XKSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXZhbC0+aW50dmFsID0gZWNfcmVhZF91OChCQVRfQ0FQQUNJVFkpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMOgorCQl2YWwtPmludHZhbCA9IGJhdF9jYXBhY2l0eV9sZXZlbCgpOworCQlicmVhazsKKwkvKiBJdCBzbWVlcyB0aGF0IEJBVF9URU1QX0FWRyBpcyBhICgyJ3MgY29tcGxlbWVudD8pIHZhbHVlIHNob3dpbmcKKwkgKiB0aGUgbnVtYmVyIG9mIGRlZ3JlZXMsIHdoZXJlYXMgQkFUX1RFTVAgaXMgc29tZXdoYXQgbW9yZQorCSAqIGNvbXBsaWNhdGVkLiBJdCBsb29rcyBsaWtlIHRoaXMgaXMgYSBuZWdhdGl2ZSBuZW1iZXIgd2l0aCBhCisJICogMTAwLzI1NiBkaXZpZGVyIGFuZCBhbiBvZmZzZXQgb2YgMjIyLiBCb3RoIHdlcmUgZGV0ZXJtaW5lZAorCSAqIGV4cGVyaW1lbnRhbGx5IGJ5IGNvbXBhcmluZyBCQVRfVEVNUCBhbmQgQkFUX1RFTVBfQVZHLiAqLworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJdmFsLT5pbnR2YWwgPSAoKDIyMiAtIChpbnQpZWNfcmVhZF91OChCQVRfVEVNUCkpICogMTAwMCkgPj4gODsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlQ6IC8qIEFtYmllbnQsIEF2ZywgLi4uIHNhbWUgdGhpbmcgKi8KKwkJdmFsLT5pbnR2YWwgPSBlY19yZWFkX3M4KEJBVF9URU1QX0FWRykgKiAxMDsKKwkJYnJlYWs7CisJLyogTmVpdGhlciB0aGUgbW9kZWwgbmFtZSBub3IgbWFudWZhY3R1cmVyIG5hbWUgd29yayBmb3IgbWUuICovCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgorCQl2YWwtPnN0cnZhbCA9IGRhdGEtPmJhdF9tb2RlbF9uYW1lOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBkYXRhLT5iYXRfbWFudWZhY3R1cmVyX25hbWU7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBkYXRhLT5iYXRfc2VyaWFsX251bWJlcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCXJldHVybiAwOwotCi1lcnJfcmVnaXN0ZXJfYnQ6Ci0JcmZraWxsX2Rlc3Ryb3koYnRfcmZraWxsKTsKLQotZXJyX2FsbG9jYXRlX2J0OgotCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKLQotZXJyX3dpZmk6Ci0JcmZraWxsX2Rlc3Ryb3kod2lmaV9yZmtpbGwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogQmFja2xpZ2h0IGRldmljZSBzdHVmZiAqLwotCi1zdGF0aWMgaW50IGJsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiKQotewotCXJldHVybiBnZXRfbGNkX2xldmVsKCk7CiB9CiAKIAotc3RhdGljIGludCBibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiKQotewotCXJldHVybiBzZXRfbGNkX2xldmVsKGItPnByb3BzLmJyaWdodG5lc3MpOwotfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgY29tcGFsYmxfb3BzID0gewotCS5nZXRfYnJpZ2h0bmVzcyA9IGJsX2dldF9icmlnaHRuZXNzLAotCS51cGRhdGVfc3RhdHVzCT0gYmxfdXBkYXRlX3N0YXR1cywKKworCisvKiA9PT09PT09PT09PT09PSAqLworLyogRHJpdmVyIEdsb2JhbHMgKi8KKy8qID09PT09PT09PT09PT09ICovCitzdGF0aWMgREVWSUNFX0FUVFIod2FrZV91cF9wbWUsCisJCTA2NDQsIHdha2VfdXBfcG1lX3Nob3csCQl3YWtlX3VwX3BtZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIod2FrZV91cF9tb2RlbSwKKwkJMDY0NCwgd2FrZV91cF9tb2RlbV9zaG93LAl3YWtlX3VwX21vZGVtX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3YWtlX3VwX2xhbiwKKwkJMDY0NCwgd2FrZV91cF9sYW5fc2hvdywJd2FrZV91cF9sYW5fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHdha2VfdXBfd2xhbiwKKwkJMDY0NCwgd2FrZV91cF93bGFuX3Nob3csCXdha2VfdXBfd2xhbl9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIod2FrZV91cF9rZXksCisJCTA2NDQsIHdha2VfdXBfa2V5X3Nob3csCXdha2VfdXBfa2V5X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3YWtlX3VwX21vdXNlLAorCQkwNjQ0LCB3YWtlX3VwX21vdXNlX3Nob3csCXdha2VfdXBfbW91c2Vfc3RvcmUpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKG5hbWUsICAgICAgICBTX0lSVUdPLCBod21vbl9uYW1lX3Nob3csICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfaW5wdXQsICBTX0lSVUdPLCBmYW5fc2hvdywgICAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCB0ZW1wX2NwdSwgICAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCB0ZW1wX2NwdV9sb2NhbCwgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCB0ZW1wX2NwdV9EVFMsICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLCB0ZW1wX25vcnRoYnJpZGdlLCAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X2lucHV0LCBTX0lSVUdPLCB0ZW1wX3ZnYSwgICAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2lucHV0LCBTX0lSVUdPLCB0ZW1wX1NLSU4sICAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2xhYmVsLCBTX0lSVUdPLCBsYWJlbF9jcHUsICAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2xhYmVsLCBTX0lSVUdPLCBsYWJlbF9jcHVfbG9jYWwsICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2xhYmVsLCBTX0lSVUdPLCBsYWJlbF9jcHVfRFRTLCAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2xhYmVsLCBTX0lSVUdPLCBsYWJlbF9ub3J0aGJyaWRnZSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X2xhYmVsLCBTX0lSVUdPLCBsYWJlbF92Z2EsICAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2xhYmVsLCBTX0lSVUdPLCBsYWJlbF9TS0lOLCAgICAgICAgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLCBwd21fc2hvdywgcHdtX3N0b3JlLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMV9lbmFibGUsCisJCVNfSVJVR08gfCBTX0lXVVNSLCBwd21fZW5hYmxlX3Nob3csIHB3bV9lbmFibGVfc3RvcmUsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY29tcGFsX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfd2FrZV91cF9wbWUuYXR0ciwKKwkmZGV2X2F0dHJfd2FrZV91cF9tb2RlbS5hdHRyLAorCSZkZXZfYXR0cl93YWtlX3VwX2xhbi5hdHRyLAorCSZkZXZfYXR0cl93YWtlX3VwX3dsYW4uYXR0ciwKKwkmZGV2X2F0dHJfd2FrZV91cF9rZXkuYXR0ciwKKwkmZGV2X2F0dHJfd2FrZV91cF9tb3VzZS5hdHRyLAorCS8qIE1heWJlIHB1dCB0aGUgc2Vuc29yLXN0dWZmIGluIGEgc2VwYXJhdGUgaHdtb24tZHJpdmVyPyBUaGF0IHdheSwKKwkgKiB0aGUgaHdtb24gc3lzZnMgd29uJ3QgYmUgY2x1dHRlcmVkIHdpdGggdGhlIGFib3ZlIGZpbGVzLiAqLworCSZzZW5zb3JfZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9lbmFibGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2xhYmVsLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjb21wYWxfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGNvbXBhbF9hdHRyaWJ1dGVzCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjb21wYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgX19kZXZleGl0IGNvbXBhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbXBhbF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSBjb21wYWxfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGNvbXBhbF9yZW1vdmUpCit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgY29tcGFsX2JhdF9wcm9wZXJ0aWVzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9TRVJJQUxfTlVNQkVSLAogfTsKIAogc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpjb21wYWxibF9kZXZpY2U7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb21wYWxfZGV2aWNlOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjb21wYWxfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImNvbXBhbC1sYXB0b3AiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9Ci19Oworc3RhdGljIHN0cnVjdCByZmtpbGwgKndpZmlfcmZraWxsOworc3RhdGljIHN0cnVjdCByZmtpbGwgKmJ0X3Jma2lsbDsKIAotLyogSW5pdGlhbGl6YXRpb24gKi8KKworCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEluaXRpYWxpemF0aW9uICYgY2xlYW4tdXAgZnVuY3Rpb25zICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiBzdGF0aWMgaW50IGRtaV9jaGVja19jYihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY29tcGFsLWxhcHRvcDogSWRlbnRpZmllZCBsYXB0b3AgbW9kZWwgJyVzJy5cbiIsCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSI6IElkZW50aWZpZWQgbGFwdG9wIG1vZGVsICclcydcbiIsCiAJCWlkLT5pZGVudCk7CisJZXh0cmFfZmVhdHVyZXMgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KIAorc3RhdGljIGludCBkbWlfY2hlY2tfY2JfZXh0cmEoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUiOiBJZGVudGlmaWVkIGxhcHRvcCBtb2RlbCAnJXMnLCAiCisJCSJlbmFibGluZyBleHRyYSBmZWF0dXJlc1xuIiwKKwkJaWQtPmlkZW50KTsKKwlleHRyYV9mZWF0dXJlcyA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NCwyNyArODU2LDEwNiBAQAogCQl9LAogCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IKIAl9LAotCisJeworCQkuaWRlbnQgPSAiSkhMOTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkpITDkwIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFUlNJT04sICJSRUZFUkVOQ0UiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX2V4dHJhCisJfSwKIAl7IH0KIH07CiAKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfcG93ZXJfc3VwcGx5X2RhdGEoc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhKQoreworCWRhdGEtPnBzeS5uYW1lID0gRFJJVkVSX05BTUU7CisJZGF0YS0+cHN5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWRhdGEtPnBzeS5wcm9wZXJ0aWVzID0gY29tcGFsX2JhdF9wcm9wZXJ0aWVzOworCWRhdGEtPnBzeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoY29tcGFsX2JhdF9wcm9wZXJ0aWVzKTsKKwlkYXRhLT5wc3kuZ2V0X3Byb3BlcnR5ID0gYmF0X2dldF9wcm9wZXJ0eTsKKworCWVjX3JlYWRfc2VxdWVuY2UoQkFUX01BTlVGQUNUVVJFUl9OQU1FX0FERFIsCisJCQkJCWRhdGEtPmJhdF9tYW51ZmFjdHVyZXJfbmFtZSwKKwkJCQkJQkFUX01BTlVGQUNUVVJFUl9OQU1FX0xFTik7CisJZGF0YS0+YmF0X21hbnVmYWN0dXJlcl9uYW1lW0JBVF9NQU5VRkFDVFVSRVJfTkFNRV9MRU5dID0gMDsKKworCWVjX3JlYWRfc2VxdWVuY2UoQkFUX01PREVMX05BTUVfQUREUiwKKwkJCQkJZGF0YS0+YmF0X21vZGVsX25hbWUsCisJCQkJCUJBVF9NT0RFTF9OQU1FX0xFTik7CisJZGF0YS0+YmF0X21vZGVsX25hbWVbQkFUX01PREVMX05BTUVfTEVOXSA9IDA7CisKKwlzY25wcmludGYoZGF0YS0+YmF0X3NlcmlhbF9udW1iZXIsIEJBVF9TRVJJQUxfTlVNQkVSX0xFTiArIDEsICIlZCIsCisJCQkJZWNfcmVhZF91MTYoQkFUX1NFUklBTF9OVU1CRVJfQUREUikpOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2Zhbl9jb250cm9sX2RhdGEoc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhKQoreworCWRhdGEtPnB3bV9lbmFibGUgPSAyOyAvKiBLZWVwIG1vdGhlcmJvYXJkIGluIGNvbnRyb2wgZm9yIG5vdyAqLworCWRhdGEtPmN1cnJfcHdtID0gMjU1OyAvKiBUcnkgbm90IHRvIGNhdXNlIGEgQ1BVX29uX2ZpcmUgZXhjZXB0aW9uCisJCQkJIGlmIHdlIHRha2Ugb3Zlci4uLiAqLworfQorCitzdGF0aWMgaW50IHNldHVwX3Jma2lsbCh2b2lkKQoreworCWludCByZXQ7CisKKwl3aWZpX3Jma2lsbCA9IHJma2lsbF9hbGxvYygiY29tcGFsLXdpZmkiLCAmY29tcGFsX2RldmljZS0+ZGV2LAorCQkJCVJGS0lMTF9UWVBFX1dMQU4sICZjb21wYWxfcmZraWxsX29wcywKKwkJCQkodm9pZCAqKSBXSVJFTEVTU19XTEFOKTsKKwlpZiAoIXdpZmlfcmZraWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHJma2lsbF9yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfd2lmaTsKKworCWJ0X3Jma2lsbCA9IHJma2lsbF9hbGxvYygiY29tcGFsLWJsdWV0b290aCIsICZjb21wYWxfZGV2aWNlLT5kZXYsCisJCQkJUkZLSUxMX1RZUEVfQkxVRVRPT1RILCAmY29tcGFsX3Jma2lsbF9vcHMsCisJCQkJKHZvaWQgKikgV0lSRUxFU1NfQlQpOworCWlmICghYnRfcmZraWxsKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jYXRlX2J0OworCX0KKwlyZXQgPSByZmtpbGxfcmVnaXN0ZXIoYnRfcmZraWxsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWdpc3Rlcl9idDsKKworCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXJfYnQ6CisJcmZraWxsX2Rlc3Ryb3koYnRfcmZraWxsKTsKKworZXJyX2FsbG9jYXRlX2J0OgorCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKKworZXJyX3dpZmk6CisJcmZraWxsX2Rlc3Ryb3kod2lmaV9yZmtpbGwpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBfX2luaXQgY29tcGFsX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JaWYgKGFjcGlfZGlzYWJsZWQpCisJaWYgKGFjcGlfZGlzYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FIjogQUNQSSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciAiCisJCQkJCQkidGhpcyBkcml2ZXIgdG8gd29yayFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKLQlpZiAoIWZvcmNlICYmICFkbWlfY2hlY2tfc3lzdGVtKGNvbXBhbF9kbWlfdGFibGUpKQorCWlmICghZm9yY2UgJiYgIWRtaV9jaGVja19zeXN0ZW0oY29tcGFsX2RtaV90YWJsZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FIjogTW90aGVyYm9hcmQgbm90IHJlY29nbml6ZWQgKFlvdSAiCisJCQkJImNvdWxkIHRyeSB0aGUgbW9kdWxlJ3MgZm9yY2UtcGFyYW1ldGVyKSIpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIFJlZ2lzdGVyIGJhY2tsaWdodCBzdHVmZiAqLworCX0KIAogCWlmICghYWNwaV92aWRlb19iYWNrbGlnaHRfc3VwcG9ydCgpKSB7CiAJCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKIAkJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwotCQlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IENPTVBBTF9MQ0RfTEVWRUxfTUFYIC0gMTsKLQkJY29tcGFsYmxfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiY29tcGFsLWxhcHRvcCIsCisJCXByb3BzLm1heF9icmlnaHRuZXNzID0gQkFDS0xJR0hUX0xFVkVMX01BWDsKKwkJY29tcGFsYmxfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihEUklWRVJfTkFNRSwKIAkJCQkJCQkgICAgTlVMTCwgTlVMTCwKIAkJCQkJCQkgICAgJmNvbXBhbGJsX29wcywKIAkJCQkJCQkgICAgJnByb3BzKTsKQEAgLTMwNCw2NyArOTY1LDEyMiBAQAogCiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21wYWxfZHJpdmVyKTsKIAlpZiAocmV0KQotCQlnb3RvIGZhaWxfYmFja2xpZ2h0OworCQlnb3RvIGVycl9iYWNrbGlnaHQ7CiAKLQkvKiBSZWdpc3RlciBwbGF0Zm9ybSBzdHVmZiAqLwotCi0JY29tcGFsX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiY29tcGFsLWxhcHRvcCIsIC0xKTsKKwljb21wYWxfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSSVZFUl9OQU1FLCAtMSk7CiAJaWYgKCFjb21wYWxfZGV2aWNlKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9wbGF0Zm9ybV9kcml2ZXI7CisJCWdvdG8gZXJyX3BsYXRmb3JtX2RyaXZlcjsKIAl9CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGNvbXBhbF9kZXZpY2UpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoY29tcGFsX2RldmljZSk7IC8qIFRoaXMgY2FsbHMgY29tcGFsX3Byb2JlICovCiAJaWYgKHJldCkKLQkJZ290byBmYWlsX3BsYXRmb3JtX2RldmljZTsKKwkJZ290byBlcnJfcGxhdGZvcm1fZGV2aWNlOwogCiAJcmV0ID0gc2V0dXBfcmZraWxsKCk7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsX3Jma2lsbDsKKwkJZ290byBlcnJfcmZraWxsOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiY29tcGFsLWxhcHRvcDogZHJpdmVyICJDT01QQUxfRFJJVkVSX1ZFUlNJT04KLQkJIiBzdWNjZXNzZnVsbHkgbG9hZGVkLlxuIik7Ci0KKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FIjogRHJpdmVyICJEUklWRVJfVkVSU0lPTgorCQkJCQkJIiBzdWNjZXNzZnVsbHkgbG9hZGVkXG4iKTsKIAlyZXR1cm4gMDsKIAotZmFpbF9yZmtpbGw6CitlcnJfcmZraWxsOgogCXBsYXRmb3JtX2RldmljZV9kZWwoY29tcGFsX2RldmljZSk7CiAKLWZhaWxfcGxhdGZvcm1fZGV2aWNlOgotCitlcnJfcGxhdGZvcm1fZGV2aWNlOgogCXBsYXRmb3JtX2RldmljZV9wdXQoY29tcGFsX2RldmljZSk7CiAKLWZhaWxfcGxhdGZvcm1fZHJpdmVyOgotCitlcnJfcGxhdGZvcm1fZHJpdmVyOgogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21wYWxfZHJpdmVyKTsKIAotZmFpbF9iYWNrbGlnaHQ6Ci0KK2Vycl9iYWNrbGlnaHQ6CiAJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGNvbXBhbGJsX2RldmljZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjb21wYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBjb21wYWxfZGF0YSAqZGF0YTsKKworCWlmICghZXh0cmFfZmVhdHVyZXMpCisJCXJldHVybiAwOworCisJLyogRmFuIGNvbnRyb2wgKi8KKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbXBhbF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRpYWxpemVfZmFuX2NvbnRyb2xfZGF0YShkYXRhKTsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZjb21wYWxfYXR0cmlidXRlX2dyb3VwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCisJCQkJJmNvbXBhbF9hdHRyaWJ1dGVfZ3JvdXApOworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBQb3dlciBzdXBwbHkgKi8KKwlpbml0aWFsaXplX3Bvd2VyX3N1cHBseV9kYXRhKGRhdGEpOworCXBvd2VyX3N1cHBseV9yZWdpc3RlcigmY29tcGFsX2RldmljZS0+ZGV2LCAmZGF0YS0+cHN5KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBjb21wYWxfY2xlYW51cCh2b2lkKQogewotCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY29tcGFsX2RldmljZSk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNvbXBhbF9kcml2ZXIpOwogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihjb21wYWxibF9kZXZpY2UpOwogCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKLQlyZmtpbGxfZGVzdHJveSh3aWZpX3Jma2lsbCk7CiAJcmZraWxsX3VucmVnaXN0ZXIoYnRfcmZraWxsKTsKKwlyZmtpbGxfZGVzdHJveSh3aWZpX3Jma2lsbCk7CiAJcmZraWxsX2Rlc3Ryb3koYnRfcmZraWxsKTsKIAotCXByaW50ayhLRVJOX0lORk8gImNvbXBhbC1sYXB0b3A6IGRyaXZlciB1bmxvYWRlZC5cbiIpOworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUiOiBEcml2ZXIgdW5sb2FkZWRcbiIpOwogfQogCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjb21wYWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhOworCisJaWYgKCFleHRyYV9mZWF0dXJlcykKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FIjogVW5sb2FkaW5nOiByZXNldHRpbmcgZmFuIGNvbnRyb2wgIgorCQkJCQkJCSJ0byBtb3RoZXJib2FyZFxuIik7CisJcHdtX2Rpc2FibGVfY29udHJvbCgpOworCisJZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRhdGEtPnBzeSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShkYXRhKTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZjb21wYWxfYXR0cmlidXRlX2dyb3VwKTsKKworCXJldHVybiAwOworfQorCisKIG1vZHVsZV9pbml0KGNvbXBhbF9pbml0KTsKIG1vZHVsZV9leGl0KGNvbXBhbF9jbGVhbnVwKTsKIAogTU9EVUxFX0FVVEhPUigiQ2V6YXJ5IEphY2tpZXdpY3oiKTsKK01PRFVMRV9BVVRIT1IoIlJvYWxkIEZyZWRlcmlja3ggKHJvYWxkLmZyZWRlcmlja3hAZ21haWwuY29tKSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21wYWwgTGFwdG9wIFN1cHBvcnQiKTsKLU1PRFVMRV9WRVJTSU9OKENPTVBBTF9EUklWRVJfVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIE1PRFVMRV9BTElBUygiZG1pOio6cm5JRkw5MDpydnJJRlQwMDoqIik7CkBAIC0zNzIsNiArMTA4OCw3IEBACiBNT0RVTEVfQUxJQVMoImRtaToqOnJuSUZMOTE6cnZySUZUMDA6KiIpOwogTU9EVUxFX0FMSUFTKCJkbWk6KjpybkpGTDkyOnJ2cklGVDAwOioiKTsKIE1PRFVMRV9BTElBUygiZG1pOio6cm5JRlQwMDpydnJJRlQwMDoqIik7CitNT0RVTEVfQUxJQVMoImRtaToqOnJuSkhMOTA6cnZyUkVGRVJFTkNFOioiKTsKIE1PRFVMRV9BTElBUygiZG1pOio6c3ZuRGVsbEluYy46cG5JbnNwaXJvbjkxMDoqIik7CiBNT0RVTEVfQUxJQVMoImRtaToqOnN2bkRlbGxJbmMuOnBuSW5zcGlyb24xMDEwOioiKTsKIE1PRFVMRV9BTElBUygiZG1pOio6c3ZuRGVsbEluYy46cG5JbnNwaXJvbjEwMTE6KiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKaW5kZXggNjYxZTNhYy4uYjQxZWQ1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCkBAIC04Myw2ICs4MywxMiBAQAogCQl9LAogCX0sCiAJeworCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9DSEFTU0lTX1RZUEUsICI5IiksIC8qTGFwdG9wKi8KKwkJfSwKKwl9LAorCXsKIAkJLmlkZW50ID0gIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKQEAgLTQ2Nyw3ICs0NzMsNyBAQAogCS51cGRhdGVfc3RhdHVzICA9IGRlbGxfc2VuZF9pbnRlbnNpdHksCiB9OwogCi1ib29sIGRlbGxfbGFwdG9wX2k4MDQyX2ZpbHRlcih1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGNoYXIgc3RyLAorc3RhdGljIGJvb2wgZGVsbF9sYXB0b3BfaTgwNDJfZmlsdGVyKHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgY2hhciBzdHIsCiAJCQkgICAgICBzdHJ1Y3Qgc2VyaW8gKnBvcnQpCiB7CiAJc3RhdGljIGJvb2wgZXh0ZW5kZWQ7CkBAIC02MjEsNCArNjI3LDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3AgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoImRtaToqc3ZuRGVsbEluYy46KjpjdDg6KiIpOworTU9EVUxFX0FMSUFTKCJkbWk6KnN2bkRlbGxJbmMuOio6Y3Q5OioiKTsKIE1PRFVMRV9BTElBUygiZG1pOipzdm5EZWxsQ29tcHV0ZXJDb3Jwb3JhdGlvbi46KjpjdDg6KiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtd21pLmMKaW5kZXggNjZmNTNjMy4uMDhmYjcwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLXdtaS5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCWlmIChkZWxsX25ld19oa190eXBlKQorCQlpZiAoZGVsbF9uZXdfaGtfdHlwZSB8fCBidWZmZXJfZW50cnlbMV0gPT0gMHgwKQogCQkJcmVwb3J0ZWRfa2V5ID0gKGludClidWZmZXJfZW50cnlbMl07CiAJCWVsc2UKIAkJCXJlcG9ydGVkX2tleSA9IChpbnQpYnVmZmVyX2VudHJ5WzFdICYgMHhmZmZmOwpAQCAtMzM5LDEzICszMzksMTggQEAKIAlhY3BpX3ZpZGVvID0gYWNwaV92aWRlb19iYWNrbGlnaHRfc3VwcG9ydCgpOwogCiAJZXJyID0gZGVsbF93bWlfaW5wdXRfc2V0dXAoKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJaWYgKGRlbGxfbmV3X2hrX3R5cGUpCisJCQlrZnJlZShkZWxsX3dtaV9rZXltYXApOwogCQlyZXR1cm4gZXJyOworCX0KIAogCXN0YXR1cyA9IHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKERFTExfRVZFTlRfR1VJRCwKIAkJCQkJIGRlbGxfd21pX25vdGlmeSwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRlbGxfd21pX2lucHV0X2Rldik7CisJCWlmIChkZWxsX25ld19oa190eXBlKQorCQkJa2ZyZWUoZGVsbF93bWlfa2V5bWFwKTsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiZGVsbC13bWk6IFVuYWJsZSB0byByZWdpc3RlciBub3RpZnkgaGFuZGxlciAtICVkXG4iLAogCQkJc3RhdHVzKTsKQEAgLTM1OSw2ICszNjQsOCBAQAogewogCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoREVMTF9FVkVOVF9HVUlEKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkZWxsX3dtaV9pbnB1dF9kZXYpOworCWlmIChkZWxsX25ld19oa190eXBlKQorCQlrZnJlZShkZWxsX3dtaV9rZXltYXApOwogfQogCiBtb2R1bGVfaW5pdChkZWxsX3dtaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKaW5kZXggMDMwNjE3NC4uNmI4ZTA2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAogc3RhdGljIGJvb2wgaG90cGx1Z19kaXNhYmxlZDsKIAotbW9kdWxlX3BhcmFtKGhvdHBsdWdfZGlzYWJsZWQsIGJvb2wsIDA2NDQpOworbW9kdWxlX3BhcmFtKGhvdHBsdWdfZGlzYWJsZWQsIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhob3RwbHVnX2Rpc2FibGVkLAogCQkgIkRpc2FibGUgaG90cGx1ZyBmb3Igd2lyZWxlc3MgZGV2aWNlLiAiCiAJCSAiSWYgeW91ciBsYXB0b3AgbmVlZCB0aGF0LCBwbGVhc2UgcmVwb3J0IHRvICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCmluZGV4IGUzMjVhZWIuLmY0NGNkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiBzdGF0aWMgdm9pZCBsb2dvbGFtcF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKIAkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpOwogCi1zdHJ1Y3QgbGVkX2NsYXNzZGV2IGxvZ29sYW1wX2xlZCA9IHsKK3N0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxvZ29sYW1wX2xlZCA9IHsKICAubmFtZSA9ICJmdWppdHN1Ojpsb2dvbGFtcCIsCiAgLmJyaWdodG5lc3NfZ2V0ID0gbG9nb2xhbXBfZ2V0LAogIC5icmlnaHRuZXNzX3NldCA9IGxvZ29sYW1wX3NldApAQCAtMTkyLDcgKzE5Miw3IEBACiBzdGF0aWMgdm9pZCBrYmxhbXBzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAogCQkJICAgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcyk7CiAKLXN0cnVjdCBsZWRfY2xhc3NkZXYga2JsYW1wc19sZWQgPSB7CitzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBrYmxhbXBzX2xlZCA9IHsKICAubmFtZSA9ICJmdWppdHN1OjprYmxhbXBzIiwKICAuYnJpZ2h0bmVzc19nZXQgPSBrYmxhbXBzX2dldCwKICAuYnJpZ2h0bmVzc19zZXQgPSBrYmxhbXBzX3NldApAQCAtNjAzLDcgKzYwMyw3IEBACiAJZG1pX2NoZWNrX2NiX2NvbW1vbihpZCk7CiAJZnVqaXRzdS0+a2V5Y29kZTEgPSBLRVlfU0NSRUVOTE9DSzsJLyogIkxvY2siICovCiAJZnVqaXRzdS0+a2V5Y29kZTIgPSBLRVlfSEVMUDsJLyogIk1vYmlsaXR5IENlbnRlciIgKi8KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBkbWlfY2hlY2tfY2JfczY0MjAoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQpAQCAtNjExLDcgKzYxMSw3IEBACiAJZG1pX2NoZWNrX2NiX2NvbW1vbihpZCk7CiAJZnVqaXRzdS0+a2V5Y29kZTEgPSBLRVlfU0NSRUVOTE9DSzsJLyogIkxvY2siICovCiAJZnVqaXRzdS0+a2V5Y29kZTIgPSBLRVlfSEVMUDsJLyogIk1vYmlsaXR5IENlbnRlciIgKi8KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBkbWlfY2hlY2tfY2JfcDgwMTAoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQpAQCAtNjIwLDcgKzYyMCw3IEBACiAJZnVqaXRzdS0+a2V5Y29kZTEgPSBLRVlfSEVMUDsJLyogIlN1cHBvcnQiICovCiAJZnVqaXRzdS0+a2V5Y29kZTMgPSBLRVlfU1dJVENIVklERU9NT0RFOwkvKiAiUHJlc2VudGF0aW9uIiAqLwogCWZ1aml0c3UtPmtleWNvZGU0ID0gS0VZX1dXVzsJLyogIkludGVybmV0IiAqLwotCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgZnVqaXRzdV9kbWlfdGFibGVbXSA9IHsKQEAgLTcyNSw2ICs3MjUsNyBAQAogCiBlcnJfdW5yZWdpc3Rlcl9pbnB1dF9kZXY6CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlucHV0ID0gTlVMTDsKIGVycl9mcmVlX2lucHV0X2RldjoKIAlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CiBlcnJfc3RvcDoKQEAgLTczOCw4ICs3MzksNiBAQAogCiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwogCi0JaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOwotCiAJZnVqaXRzdS0+YWNwaV9oYW5kbGUgPSBOVUxMOwogCiAJcmV0dXJuIDA7CkBAIC05MzAsNiArOTI5LDcgQEAKIAogZXJyX3VucmVnaXN0ZXJfaW5wdXRfZGV2OgogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKKwlpbnB1dCA9IE5VTEw7CiBlcnJfZnJlZV9pbnB1dF9kZXY6CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOwogZXJyX2ZyZWVfZmlmbzoKQEAgLTk1Myw4ICs5NTMsNiBAQAogCiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwogCi0JaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOwotCiAJa2ZpZm9fZnJlZSgmZnVqaXRzdV9ob3RrZXktPmZpZm8pOwogCiAJZnVqaXRzdV9ob3RrZXktPmFjcGlfaGFuZGxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwLXdtaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMKaW5kZXggNTFjMDdhMC4uZjE1NTE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgpAQCAtNTIsMTIgKzUxLDI1IEBACiAjZGVmaW5lIEhQV01JX1dJUkVMRVNTX1FVRVJZIDB4NQogI2RlZmluZSBIUFdNSV9IT1RLRVlfUVVFUlkgMHhjCiAKKyNkZWZpbmUgUFJFRklYICJIUCBXTUk6ICIKKyNkZWZpbmUgVU5JTVAgIlVuaW1wbGVtZW50ZWQgIgorCiBlbnVtIGhwX3dtaV9yYWRpbyB7CiAJSFBXTUlfV0lGSSA9IDAsCiAJSFBXTUlfQkxVRVRPT1RIID0gMSwKIAlIUFdNSV9XV0FOID0gMiwKIH07CiAKK2VudW0gaHBfd21pX2V2ZW50X2lkcyB7CisJSFBXTUlfRE9DS19FVkVOVCA9IDEsCisJSFBXTUlfUEFSS19IREQgPSAyLAorCUhQV01JX1NNQVJUX0FEQVBURVIgPSAzLAorCUhQV01JX0JFWkVMX0JVVFRPTiA9IDQsCisJSFBXTUlfV0lSRUxFU1MgPSA1LAorCUhQV01JX0NQVV9CQVRURVJZX1RIUk9UVExFID0gNiwKKwlIUFdNSV9MT0NLX1NXSVRDSCA9IDcsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocF93bWlfYmlvc19zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBfX2V4aXQgaHBfd21pX2Jpb3NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGhwX3dtaV9yZXN1bWVfaGFuZGxlcihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwpAQCAtNjcsMTMgKzc5LDEyIEBACiAJdTMyIGNvbW1hbmQ7CiAJdTMyIGNvbW1hbmR0eXBlOwogCXUzMiBkYXRhc2l6ZTsKLQl1MzIgZGF0YTsKKwljaGFyICpkYXRhOwogfTsKIAogc3RydWN0IGJpb3NfcmV0dXJuIHsKIAl1MzIgc2lncGFzczsKIAl1MzIgcmV0dXJuX2NvZGU7Ci0JdTMyIHZhbHVlOwogfTsKIAogc3RydWN0IGtleV9lbnRyeSB7CkBAIC04OCw2ICs5OSw3IEBACiAJe0tFX0tFWSwgMHgwMiwgS0VZX0JSSUdIVE5FU1NVUH0sCiAJe0tFX0tFWSwgMHgwMywgS0VZX0JSSUdIVE5FU1NET1dOfSwKIAl7S0VfS0VZLCAweDIwZTYsIEtFWV9QUk9HMX0sCisJe0tFX0tFWSwgMHgyMGU4LCBLRVlfTUVESUF9LAogCXtLRV9LRVksIDB4MjE0MiwgS0VZX01FRElBfSwKIAl7S0VfS0VZLCAweDIxM2IsIEtFWV9JTkZPfSwKIAl7S0VfS0VZLCAweDIxNjksIEtFWV9ESVJFQ1RJT059LApAQCAtMTE3LDcgKzEyOSwyNyBAQAogCS5yZW1vdmUgPSBocF93bWlfYmlvc19yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KGludCBxdWVyeSwgaW50IHdyaXRlLCBpbnQgdmFsdWUpCisvKgorICogaHBfd21pX3BlcmZvcm1fcXVlcnkKKyAqCisgKiBxdWVyeToJVGhlIGNvbW1hbmR0eXBlIC0+IFdoYXQgc2hvdWxkIGJlIHF1ZXJpZWQKKyAqIHdyaXRlOglUaGUgY29tbWFuZCAtPiAwIHJlYWQsIDEgd3JpdGUsIDMgT0RNIHNwZWNpZmljCisgKiBidWZmZXI6CUJ1ZmZlciB1c2VkIGFzIGlucHV0IGFuZC9vciBvdXRwdXQKKyAqIGJ1ZmZlcnNpemU6CVNpemUgb2YgYnVmZmVyCisgKgorICogcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgYW4gSFAgV01JIHF1ZXJ5IHNwZWNpZmljIGVycm9yIGNvZGUgKHdoaWNoIGlzIHBvc2l0aXZlKQorICogICAgICAgICAtRUlOVkFMIGlmIHRoZSBxdWVyeSB3YXMgbm90IHN1Y2Nlc3NmdWwgYXQgYWxsCisgKiAgICAgICAgIC1FSU5WQUwgaWYgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBleGNlZWRzIGJ1ZmZlcnNpemUKKyAqCisgKiBOb3RlOiBUaGUgYnVmZmVyc2l6ZSBtdXN0IGF0IGxlYXN0IGJlIHRoZSBtYXhpbXVtIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0CisgKiAgICAgICBzaXplLiBFLmcuIEJhdHRlcnkgaW5mbyBxdWVyeSAoMHg3KSBpcyBkZWZpbmVkIHRvIGhhdmUgMSBieXRlIGlucHV0CisgKiAgICAgICBhbmQgMTI4IGJ5dGUgb3V0cHV0LiBUaGUgY2FsbGVyIHdvdWxkIGRvOgorICogICAgICAgYnVmZmVyID0ga3phbGxvYygxMjgsIEdGUF9LRVJORUwpOworICogICAgICAgcmV0ID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoMHg3LCAwLCBidWZmZXIsIDEyOCkKKyAqLworc3RhdGljIGludCBocF93bWlfcGVyZm9ybV9xdWVyeShpbnQgcXVlcnksIGludCB3cml0ZSwgY2hhciAqYnVmZmVyLAorCQkJCWludCBidWZmZXJzaXplKQogewogCXN0cnVjdCBiaW9zX3JldHVybiBiaW9zX3JldHVybjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC0xMjYsOCArMTU4LDggQEAKIAkJLnNpZ25hdHVyZSA9IDB4NTU0MzQ1NTMsCiAJCS5jb21tYW5kID0gd3JpdGUgPyAweDIgOiAweDEsCiAJCS5jb21tYW5kdHlwZSA9IHF1ZXJ5LAotCQkuZGF0YXNpemUgPSB3cml0ZSA/IDB4NCA6IDAsCi0JCS5kYXRhID0gdmFsdWUsCisJCS5kYXRhc2l6ZSA9IGJ1ZmZlcnNpemUsCisJCS5kYXRhID0gYnVmZmVyLAogCX07CiAJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyBzaXplb2Yoc3RydWN0IGJpb3NfYXJncyksICZhcmdzIH07CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKQEAgLTE0NCw1NCArMTc2LDkwIEBACiAJfQogCiAJYmlvc19yZXR1cm4gPSAqKChzdHJ1Y3QgYmlvc19yZXR1cm4gKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKworCWlmIChiaW9zX3JldHVybi5yZXR1cm5fY29kZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiUXVlcnkgJWQgcmV0dXJuZWQgJWRcbiIsIHF1ZXJ5LAorCQkgICAgICAgYmlvc19yZXR1cm4ucmV0dXJuX2NvZGUpOworCQlrZnJlZShvYmopOworCQlyZXR1cm4gYmlvc19yZXR1cm4ucmV0dXJuX2NvZGU7CisJfQorCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggLSBzaXplb2YoYmlvc19yZXR1cm4pID4gYnVmZmVyc2l6ZSkgeworCQlrZnJlZShvYmopOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoYnVmZmVyLCAwLCBidWZmZXJzaXplKTsKKwltZW1jcHkoYnVmZmVyLAorCSAgICAgICAoKGNoYXIgKilvYmotPmJ1ZmZlci5wb2ludGVyKSArIHNpemVvZihzdHJ1Y3QgYmlvc19yZXR1cm4pLAorCSAgICAgICBvYmotPmJ1ZmZlci5sZW5ndGggLSBzaXplb2YoYmlvc19yZXR1cm4pKTsKIAlrZnJlZShvYmopOwotCWlmIChiaW9zX3JldHVybi5yZXR1cm5fY29kZSA+IDApCi0JCXJldHVybiBiaW9zX3JldHVybi5yZXR1cm5fY29kZSAqIC0xOwotCWVsc2UKLQkJcmV0dXJuIGJpb3NfcmV0dXJuLnZhbHVlOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGhwX3dtaV9kaXNwbGF5X3N0YXRlKHZvaWQpCiB7Ci0JcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0RJU1BMQVlfUVVFUlksIDAsIDApOworCWludCBzdGF0ZTsKKwlpbnQgcmV0ID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfRElTUExBWV9RVUVSWSwgMCwgKGNoYXIgKikmc3RhdGUsCisJCQkJICAgICAgIHNpemVvZihzdGF0ZSkpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzdGF0ZTsKIH0KIAogc3RhdGljIGludCBocF93bWlfaGRkdGVtcF9zdGF0ZSh2b2lkKQogewotCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9IRERURU1QX1FVRVJZLCAwLCAwKTsKKwlpbnQgc3RhdGU7CisJaW50IHJldCA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0hERFRFTVBfUVVFUlksIDAsIChjaGFyICopJnN0YXRlLAorCQkJCSAgICAgICBzaXplb2Yoc3RhdGUpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3RhdGU7CiB9CiAKIHN0YXRpYyBpbnQgaHBfd21pX2Fsc19zdGF0ZSh2b2lkKQogewotCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9BTFNfUVVFUlksIDAsIDApOworCWludCBzdGF0ZTsKKwlpbnQgcmV0ID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfQUxTX1FVRVJZLCAwLCAoY2hhciAqKSZzdGF0ZSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0YXRlKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHN0YXRlOwogfQogCiBzdGF0aWMgaW50IGhwX3dtaV9kb2NrX3N0YXRlKHZvaWQpCiB7Ci0JaW50IHJldCA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0hBUkRXQVJFX1FVRVJZLCAwLCAwKTsKKwlpbnQgc3RhdGU7CisJaW50IHJldCA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0hBUkRXQVJFX1FVRVJZLCAwLCAoY2hhciAqKSZzdGF0ZSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0YXRlKSk7CiAKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiByZXQgJiAweDE7CisJcmV0dXJuIHN0YXRlICYgMHgxOwogfQogCiBzdGF0aWMgaW50IGhwX3dtaV90YWJsZXRfc3RhdGUodm9pZCkKIHsKLQlpbnQgcmV0ID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfSEFSRFdBUkVfUVVFUlksIDAsIDApOwotCi0JaWYgKHJldCA8IDApCisJaW50IHN0YXRlOworCWludCByZXQgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9IQVJEV0FSRV9RVUVSWSwgMCwgKGNoYXIgKikmc3RhdGUsCisJCQkJICAgICAgIHNpemVvZihzdGF0ZSkpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gKHJldCAmIDB4NCkgPyAxIDogMDsKKwlyZXR1cm4gKHN0YXRlICYgMHg0KSA/IDEgOiAwOwogfQogCiBzdGF0aWMgaW50IGhwX3dtaV9zZXRfYmxvY2sodm9pZCAqZGF0YSwgYm9vbCBibG9ja2VkKQogewogCWVudW0gaHBfd21pX3JhZGlvIHIgPSAoZW51bSBocF93bWlfcmFkaW8pIGRhdGE7CiAJaW50IHF1ZXJ5ID0gQklUKHIgKyA4KSB8ICgoIWJsb2NrZWQpIDw8IHIpOworCWludCByZXQ7CiAKLQlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDEsIHF1ZXJ5KTsKKwlyZXQgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9XSVJFTEVTU19RVUVSWSwgMSwKKwkJCQkgICAoY2hhciAqKSZxdWVyeSwgc2l6ZW9mKHF1ZXJ5KSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmZraWxsX29wcyBocF93bWlfcmZraWxsX29wcyA9IHsKQEAgLTIwMCw4ICsyNjgsMTMgQEAKIAogc3RhdGljIGJvb2wgaHBfd21pX2dldF9zd19zdGF0ZShlbnVtIGhwX3dtaV9yYWRpbyByKQogewotCWludCB3aXJlbGVzcyA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLCAwKTsKLQlpbnQgbWFzayA9IDB4MjAwIDw8IChyICogOCk7CisJaW50IHdpcmVsZXNzOworCWludCBtYXNrOworCWhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLAorCQkJICAgICAoY2hhciAqKSZ3aXJlbGVzcywgc2l6ZW9mKHdpcmVsZXNzKSk7CisJLyogVEJEOiBQYXNzIGVycm9yICovCisKKwltYXNrID0gMHgyMDAgPDwgKHIgKiA4KTsKIAogCWlmICh3aXJlbGVzcyAmIG1hc2spCiAJCXJldHVybiBmYWxzZTsKQEAgLTIxMSw4ICsyODQsMTMgQEAKIAogc3RhdGljIGJvb2wgaHBfd21pX2dldF9od19zdGF0ZShlbnVtIGhwX3dtaV9yYWRpbyByKQogewotCWludCB3aXJlbGVzcyA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLCAwKTsKLQlpbnQgbWFzayA9IDB4ODAwIDw8IChyICogOCk7CisJaW50IHdpcmVsZXNzOworCWludCBtYXNrOworCWhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLAorCQkJICAgICAoY2hhciAqKSZ3aXJlbGVzcywgc2l6ZW9mKHdpcmVsZXNzKSk7CisJLyogVEJEOiBQYXNzIGVycm9yICovCisKKwltYXNrID0gMHg4MDAgPDwgKHIgKiA4KTsKIAogCWlmICh3aXJlbGVzcyAmIG1hc2spCiAJCXJldHVybiBmYWxzZTsKQEAgLTI2OSw3ICszNDcsMTEgQEAKIAkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXUzMiB0bXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9BTFNfUVVFUlksIDEsIHRtcCk7CisJaW50IHJldCA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0FMU19RVUVSWSwgMSwgKGNoYXIgKikmdG1wLAorCQkJCSAgICAgICBzaXplb2YodG1wKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTMzOCw0NyArNDIwLDgyIEBACiAJc3RydWN0IGFjcGlfYnVmZmVyIHJlc3BvbnNlID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXN0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQlpbnQgZXZlbnRjb2RlOworCXUzMiBldmVudF9pZCwgZXZlbnRfZGF0YTsKKwlpbnQga2V5X2NvZGUsIHJldDsKKwl1MzIgKmxvY2F0aW9uOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCXN0YXR1cyA9IHdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKIAlpZiAoc3RhdHVzICE9IEFFX09LKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhwLXdtaTogYmFkIGV2ZW50IHN0YXR1cyAweCV4XG4iLCBzdGF0dXMpOworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiYmFkIGV2ZW50IHN0YXR1cyAweCV4XG4iLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCiAJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopcmVzcG9uc2UucG9pbnRlcjsKIAotCWlmICghb2JqIHx8IG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSIHx8IG9iai0+YnVmZmVyLmxlbmd0aCAhPSA4KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkhQIFdNSTogVW5rbm93biByZXNwb25zZSByZWNlaXZlZFxuIik7CisJaWYgKCFvYmopCisJCXJldHVybjsKKwlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaHAtd21pOiBVbmtub3duIHJlc3BvbnNlIHJlY2VpdmVkICVkXG4iLAorCQkgICAgICAgb2JqLT50eXBlKTsKIAkJa2ZyZWUob2JqKTsKIAkJcmV0dXJuOwogCX0KIAotCWV2ZW50Y29kZSA9ICooKHU4ICopIG9iai0+YnVmZmVyLnBvaW50ZXIpOworCS8qCisJICogRGVwZW5kaW5nIG9uIEFDUEkgdmVyc2lvbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBpZCBhbmQgZXZlbnQgZGF0YQorCSAqIGluc2lkZSBfV0VEIGZ1bmN0aW9uIHdpbGwgcmVzdWx0IGluIGEgOCBvciAxNiBieXRlIGJ1ZmZlci4KKwkgKi8KKwlsb2NhdGlvbiA9ICh1MzIgKilvYmotPmJ1ZmZlci5wb2ludGVyOworCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggPT0gOCkgeworCQlldmVudF9pZCA9ICpsb2NhdGlvbjsKKwkJZXZlbnRfZGF0YSA9ICoobG9jYXRpb24gKyAxKTsKKwl9IGVsc2UgaWYgKG9iai0+YnVmZmVyLmxlbmd0aCA9PSAxNikgeworCQlldmVudF9pZCA9ICpsb2NhdGlvbjsKKwkJZXZlbnRfZGF0YSA9ICoobG9jYXRpb24gKyAyKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJocC13bWk6IFVua25vd24gYnVmZmVyIGxlbmd0aCAlZFxuIiwKKwkJICAgICAgIG9iai0+YnVmZmVyLmxlbmd0aCk7CisJCWtmcmVlKG9iaik7CisJCXJldHVybjsKKwl9CiAJa2ZyZWUob2JqKTsKLQlpZiAoZXZlbnRjb2RlID09IDB4NCkKLQkJZXZlbnRjb2RlID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfSE9US0VZX1FVRVJZLCAwLAotCQkJCQkJMCk7Ci0Ja2V5ID0gaHBfd21pX2dldF9lbnRyeV9ieV9zY2FuY29kZShldmVudGNvZGUpOwotCWlmIChrZXkpIHsKLQkJc3dpdGNoIChrZXktPnR5cGUpIHsKLQkJY2FzZSBLRV9LRVk6Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGhwX3dtaV9pbnB1dF9kZXYsCi0JCQkJCSBrZXktPmtleWNvZGUsIDEpOwotCQkJaW5wdXRfc3luYyhocF93bWlfaW5wdXRfZGV2KTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoaHBfd21pX2lucHV0X2RldiwKLQkJCQkJIGtleS0+a2V5Y29kZSwgMCk7Ci0JCQlpbnB1dF9zeW5jKGhwX3dtaV9pbnB1dF9kZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGV2ZW50Y29kZSA9PSAweDEpIHsKKworCXN3aXRjaCAoZXZlbnRfaWQpIHsKKwljYXNlIEhQV01JX0RPQ0tfRVZFTlQ6CiAJCWlucHV0X3JlcG9ydF9zd2l0Y2goaHBfd21pX2lucHV0X2RldiwgU1dfRE9DSywKIAkJCQkgICAgaHBfd21pX2RvY2tfc3RhdGUoKSk7CiAJCWlucHV0X3JlcG9ydF9zd2l0Y2goaHBfd21pX2lucHV0X2RldiwgU1dfVEFCTEVUX01PREUsCiAJCQkJICAgIGhwX3dtaV90YWJsZXRfc3RhdGUoKSk7CiAJCWlucHV0X3N5bmMoaHBfd21pX2lucHV0X2Rldik7Ci0JfSBlbHNlIGlmIChldmVudGNvZGUgPT0gMHg1KSB7CisJCWJyZWFrOworCWNhc2UgSFBXTUlfUEFSS19IREQ6CisJCWJyZWFrOworCWNhc2UgSFBXTUlfU01BUlRfQURBUFRFUjoKKwkJYnJlYWs7CisJY2FzZSBIUFdNSV9CRVpFTF9CVVRUT046CisJCXJldCA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0hPVEtFWV9RVUVSWSwgMCwKKwkJCQkJICAgKGNoYXIgKikma2V5X2NvZGUsCisJCQkJCSAgIHNpemVvZihrZXlfY29kZSkpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWtleSA9IGhwX3dtaV9nZXRfZW50cnlfYnlfc2NhbmNvZGUoa2V5X2NvZGUpOworCQlpZiAoa2V5KSB7CisJCQlzd2l0Y2ggKGtleS0+dHlwZSkgeworCQkJY2FzZSBLRV9LRVk6CisJCQkJaW5wdXRfcmVwb3J0X2tleShocF93bWlfaW5wdXRfZGV2LAorCQkJCQkJIGtleS0+a2V5Y29kZSwgMSk7CisJCQkJaW5wdXRfc3luYyhocF93bWlfaW5wdXRfZGV2KTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGhwX3dtaV9pbnB1dF9kZXYsCisJCQkJCQkga2V5LT5rZXljb2RlLCAwKTsKKwkJCQlpbnB1dF9zeW5jKGhwX3dtaV9pbnB1dF9kZXYpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJVbmtub3duIGtleSBjb2RlIC0gMHgleFxuIiwKKwkJCSAgICAgICBrZXlfY29kZSk7CisJCWJyZWFrOworCWNhc2UgSFBXTUlfV0lSRUxFU1M6CiAJCWlmICh3aWZpX3Jma2lsbCkKIAkJCXJma2lsbF9zZXRfc3RhdGVzKHdpZmlfcmZraWxsLAogCQkJCQkgIGhwX3dtaV9nZXRfc3dfc3RhdGUoSFBXTUlfV0lGSSksCkBAIC0zOTEsOSArNTA4LDE4IEBACiAJCQlyZmtpbGxfc2V0X3N0YXRlcyh3d2FuX3Jma2lsbCwKIAkJCQkJICBocF93bWlfZ2V0X3N3X3N0YXRlKEhQV01JX1dXQU4pLAogCQkJCQkgIGhwX3dtaV9nZXRfaHdfc3RhdGUoSFBXTUlfV1dBTikpOwotCX0gZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICJIUCBXTUk6IFVua25vd24ga2V5IHByZXNzZWQgLSAleFxuIiwKLQkJCWV2ZW50Y29kZSk7CisJCWJyZWFrOworCWNhc2UgSFBXTUlfQ1BVX0JBVFRFUllfVEhST1RUTEU6CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYIFVOSU1QICJDUFUgdGhyb3R0bGUgYmVjYXVzZSBvZiAzIENlbGwiCisJCSAgICAgICAiIGJhdHRlcnkgZXZlbnQgZGV0ZWN0ZWRcbiIpOworCQlicmVhazsKKwljYXNlIEhQV01JX0xPQ0tfU1dJVENIOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiVW5rbm93biBldmVudF9pZCAtICVkIC0gMHgleFxuIiwKKwkJICAgICAgIGV2ZW50X2lkLCBldmVudF9kYXRhKTsKKwkJYnJlYWs7CisJfQogfQogCiBzdGF0aWMgaW50IF9faW5pdCBocF93bWlfaW5wdXRfc2V0dXAodm9pZCkKQEAgLTQwMiw2ICs1MjgsOCBAQAogCWludCBlcnI7CiAKIAlocF93bWlfaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFocF93bWlfaW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWhwX3dtaV9pbnB1dF9kZXYtPm5hbWUgPSAiSFAgV01JIGhvdGtleXMiOwogCWhwX3dtaV9pbnB1dF9kZXYtPnBoeXMgPSAid21pL2lucHV0MCI7CkBAIC00NTAsNyArNTc4LDEyIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocF93bWlfYmlvc19zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IGVycjsKLQlpbnQgd2lyZWxlc3MgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9XSVJFTEVTU19RVUVSWSwgMCwgMCk7CisJaW50IHdpcmVsZXNzOworCisJZXJyID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDAsIChjaGFyICopJndpcmVsZXNzLAorCQkJCSAgIHNpemVvZih3aXJlbGVzcykpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfZGlzcGxheSk7CiAJaWYgKGVycikKQEAgLTU4MSwyNyArNzE0LDUxIEBACiBzdGF0aWMgaW50IF9faW5pdCBocF93bWlfaW5pdCh2b2lkKQogewogCWludCBlcnI7CisJaW50IGV2ZW50X2NhcGFibGUgPSB3bWlfaGFzX2d1aWQoSFBXTUlfRVZFTlRfR1VJRCk7CisJaW50IGJpb3NfY2FwYWJsZSA9IHdtaV9oYXNfZ3VpZChIUFdNSV9CSU9TX0dVSUQpOwogCi0JaWYgKHdtaV9oYXNfZ3VpZChIUFdNSV9FVkVOVF9HVUlEKSkgeworCWlmIChldmVudF9jYXBhYmxlKSB7CiAJCWVyciA9IHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKEhQV01JX0VWRU5UX0dVSUQsCiAJCQkJCQkgaHBfd21pX25vdGlmeSwgTlVMTCk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1MoZXJyKSkKLQkJCWhwX3dtaV9pbnB1dF9zZXR1cCgpOworCQlpZiAoQUNQSV9GQUlMVVJFKGVycikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gaHBfd21pX2lucHV0X3NldHVwKCk7CisJCWlmIChlcnIpIHsKKwkJCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoSFBXTUlfRVZFTlRfR1VJRCk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJfQogCi0JaWYgKHdtaV9oYXNfZ3VpZChIUFdNSV9CSU9TX0dVSUQpKSB7CisJaWYgKGJpb3NfY2FwYWJsZSkgewogCQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmhwX3dtaV9kcml2ZXIpOwogCQlpZiAoZXJyKQotCQkJcmV0dXJuIDA7CisJCQlnb3RvIGVycl9kcml2ZXJfcmVnOwogCQlocF93bWlfcGxhdGZvcm1fZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJocC13bWkiLCAtMSk7CiAJCWlmICghaHBfd21pX3BsYXRmb3JtX2RldikgewotCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhwX3dtaV9kcml2ZXIpOwotCQkJcmV0dXJuIDA7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZGV2aWNlX2FsbG9jOwogCQl9Ci0JCXBsYXRmb3JtX2RldmljZV9hZGQoaHBfd21pX3BsYXRmb3JtX2Rldik7CisJCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoaHBfd21pX3BsYXRmb3JtX2Rldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9kZXZpY2VfYWRkOwogCX0KIAorCWlmICghYmlvc19jYXBhYmxlICYmICFldmVudF9jYXBhYmxlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJldHVybiAwOworCitlcnJfZGV2aWNlX2FkZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGhwX3dtaV9wbGF0Zm9ybV9kZXYpOworZXJyX2RldmljZV9hbGxvYzoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHBfd21pX2RyaXZlcik7CitlcnJfZHJpdmVyX3JlZzoKKwlpZiAod21pX2hhc19ndWlkKEhQV01JX0VWRU5UX0dVSUQpKSB7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGhwX3dtaV9pbnB1dF9kZXYpOworCQl3bWlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKEhQV01JX0VWRU5UX0dVSUQpOworCX0KKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBocF93bWlfZXhpdCh2b2lkKQpAQCAtNjExLDcgKzc2OCw3IEBACiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGhwX3dtaV9pbnB1dF9kZXYpOwogCX0KIAlpZiAoaHBfd21pX3BsYXRmb3JtX2RldikgewotCQlwbGF0Zm9ybV9kZXZpY2VfZGVsKGhwX3dtaV9wbGF0Zm9ybV9kZXYpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihocF93bWlfcGxhdGZvcm1fZGV2KTsKIAkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhwX3dtaV9kcml2ZXIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlODJlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jCkBAIC0wLDAgKzEsMTY2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKiBBdXRob3JzOgorICoJSmVzc2UgQmFybmVzIDxqYmFybmVzQHZpcnR1b3VzZ2Vlay5vcmc+CisgKi8KKworLyoKKyAqIFNvbWUgSW50ZWwgSWJleCBQZWFrIGJhc2VkIHBsYXRmb3JtcyBzdXBwb3J0IHNvLWNhbGxlZCAiaW50ZWxsaWdlbnQKKyAqIHBvd2VyIHNoYXJpbmciLCB3aGljaCBhbGxvd3MgdGhlIENQVSBhbmQgR1BVIHRvIGNvb3BlcmF0ZSB0byBtYXhpbWl6ZQorICogcGVyZm9ybWFuY2Ugd2l0aGluIGEgZ2l2ZW4gVERQICh0aGVybWFsIGRlc2lnbiBwb2ludCkuICBUaGlzIGRyaXZlcgorICogcGVyZm9ybXMgdGhlIGNvb3JkaW5hdGlvbiBiZXR3ZWVuIHRoZSBDUFUgYW5kIEdQVSwgbW9uaXRvcnMgdGhlcm1hbCBhbmQKKyAqIHBvd2VyIHN0YXRpc3RpY3MgaW4gdGhlIHBsYXRmb3JtLCBhbmQgaW5pdGlhbGl6ZXMgcG93ZXIgbW9uaXRvcmluZworICogaGFyZHdhcmUuICBJdCBhbHNvIHByb3ZpZGVzIGEgZmV3IHR1bmFibGVzIHRvIGNvbnRyb2wgYmVoYXZpb3IuICBJdHMKKyAqIHByaW1hcnkgcHVycG9zZSBpcyB0byBzYWZlbHkgYWxsb3cgQ1BVIGFuZCBHUFUgdHVyYm8gbW9kZXMgdG8gYmUgZW5hYmxlZAorICogYnkgdHJhY2tpbmcgcG93ZXIgYW5kIHRoZXJtYWwgYnVkZ2V0OyBzZWNvbmRhcmlseSBpdCBjYW4gYm9vc3QgdHVyYm8KKyAqIHBlcmZvcm1hbmNlIGJ5IGFsbG9jYXRpbmcgbW9yZSBwb3dlciBvciB0aGVybWFsIGJ1ZGdldCB0byB0aGUgQ1BVIG9yIEdQVQorICogYmFzZWQgb24gYXZhaWxhYmxlIGhlYWRyb29tIGFuZCBhY3Rpdml0eS4KKyAqCisgKiBUaGUgYmFzaWMgYWxnb3JpdGhtIGlzIGRyaXZlbiBieSBhIDVzIG1vdmluZyBhdmVyYWdlIG9mIHRlbXB1cmF0dXJlLiAgSWYKKyAqIHRoZXJtYWwgaGVhZHJvb20gaXMgYXZhaWxhYmxlLCB0aGUgQ1BVIGFuZC9vciBHUFUgcG93ZXIgY2xhbXBzIG1heSBiZQorICogYWRqdXN0ZWQgdXB3YXJkcy4gIElmIHdlIGhpdCB0aGUgdGhlcm1hbCBjZWlsaW5nIG9yIGEgdGhlcm1hbCB0cmlnZ2VyLAorICogd2Ugc2NhbGUgYmFjayB0aGUgY2xhbXAuICBBc2lkZSBmcm9tIHRyaWdnZXIgZXZlbnRzICh3aGVuIHdlJ3JlIGNyaXRpY2FsbHkKKyAqIGNsb3NlIG9yIG92ZXIgb3VyIFREUCkgd2UgZG9uJ3QgYWRqdXN0IHRoZSBjbGFtcHMgbW9yZSB0aGFuIG9uY2UgZXZlcnkKKyAqIGZpdmUgc2Vjb25kcy4KKyAqCisgKiBUaGUgdGhlcm1hbCBkZXZpY2UgKGRldmljZSAzMSwgZnVuY3Rpb24gNikgaGFzIGEgc2V0IG9mIHJlZ2lzdGVycyB0aGF0CisgKiBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZmlybXdhcmUuICBUaGUgTUUgc2hvdWxkIGFsc28gdGFrZSB0aGUgY2xhbXAgdmFsdWVzCisgKiB3cml0dGVuIHRvIHRob3NlIHJlZ2lzdGVycyBhbmQgd3JpdGUgdGhlbSB0byB0aGUgQ1BVLCBidXQgd2UgY3VycmVudGx5CisgKiBieXBhc3MgdGhhdCBmdW5jdGlvbmFsaXR5IGFuZCB3cml0ZSB0aGUgQ1BVIE1TUiBkaXJlY3RseS4KKyAqCisgKiBVTlNVUFBPUlRFRDoKKyAqICAgLSBkdWFsIE1DUCBjb25maWdzCisgKgorICogVE9ETzoKKyAqICAgLSBoYW5kbGUgQ1BVIGhvdHBsdWcKKyAqICAgLSBwcm92aWRlIHR1cmJvIGVuYWJsZS9kaXNhYmxlIGFwaQorICogICAtIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdHVyYm8gZW5hYmxlL2Rpc2FibGUgcmVnIGJhc2VkIG9uIE1JU0NfRU4KKyAqCisgKiBSZWxhdGVkIGRvY3VtZW50czoKKyAqICAgLSBDREkgNDAzNzc3LCA0MDM3NzggLSBBdWJ1cm5kYWxlIEVEUyB2b2wgMSAmIDIKKyAqICAgLSBDREkgNDAxMzc2IC0gSWJleCBQZWFrIEVEUworICogICAtIHJlZiAyNjAzNywgMjY2NDEgLSBJUFMgQklPUyBzcGVjCisgKiAgIC0gcmVmIDI2NDg5IC0gTmVoYWxlbSBCSU9TIHdyaXRlcidzIGd1aWRlCisgKiAgIC0gcmVmIDI2OTIxIC0gSWJleCBQZWFrIEJJT1MgU3BlY2lmaWNhdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGRybS9pOTE1X2RybS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9USEVSTUFMX1NFTlNPUiAweDNiMzIKKworLyoKKyAqIFBhY2thZ2UgbGV2ZWwgTVNScyBmb3IgbW9uaXRvci9jb250cm9sCisgKi8KKyNkZWZpbmUgUExBVEZPUk1fSU5GTwkweGNlCisjZGVmaW5lICAgUExBVEZPUk1fVERQCQkoMTw8MjkpCisjZGVmaW5lICAgUExBVEZPUk1fUkFUSU8JKDE8PDI4KQorCisjZGVmaW5lIElBMzJfTUlTQ19FTkFCTEUJMHgxYTAKKyNkZWZpbmUgICBJQTMyX01JU0NfVFVSQk9fRU4JKDFVTEw8PDM4KQorCisjZGVmaW5lIFRVUkJPX1BPV0VSX0NVUlJFTlRfTElNSVQJMHgxYWMKKyNkZWZpbmUgICBUVVJCT19URENfT1ZSX0VOCSgxVUw8PDMxKQorI2RlZmluZSAgIFRVUkJPX1REQ19NQVNLCSgweDAwMDAwMDAwN2ZmZjAwMDBVTCkKKyNkZWZpbmUgICBUVVJCT19URENfU0hJRlQJKDE2KQorI2RlZmluZSAgIFRVUkJPX1REUF9PVlJfRU4JKDFVTDw8MTUpCisjZGVmaW5lICAgVFVSQk9fVERQX01BU0sJKDB4MDAwMDAwMDAwMDAwM2ZmZlVMKQorCisvKgorICogQ29yZS90aHJlYWQgTVNScyBmb3IgbW9uaXRvcmluZworICovCisjZGVmaW5lIElBMzJfUEVSRl9DVEwJCTB4MTk5CisjZGVmaW5lICAgSUEzMl9QRVJGX1RVUkJPX0RJUwkoMVVMTDw8MzIpCisKKy8qCisgKiBUaGVybWFsIFBDSSBkZXZpY2UgcmVncworICovCisjZGVmaW5lIFRITV9DRkdfVEJBUgkweDEwCisjZGVmaW5lIFRITV9DRkdfVEJBUl9ISQkweDE0CisKKyNkZWZpbmUgVEhNX1RTSVUJMHgwMAorI2RlZmluZSBUSE1fVFNFCQkweDAxCisjZGVmaW5lICAgVFNFX0VOCTB4YjgKKyNkZWZpbmUgVEhNX1RTUwkJMHgwMgorI2RlZmluZSBUSE1fVFNUUgkweDAzCisjZGVmaW5lIFRITV9UU1RUUAkweDA0CisjZGVmaW5lIFRITV9UU0NPCTB4MDgKKyNkZWZpbmUgVEhNX1RTRVMJMHgwYworI2RlZmluZSBUSE1fVFNHUEVOCTB4MGQKKyNkZWZpbmUgICBUU0dQRU5fSE9UX0xPSEkJKDE8PDEpCisjZGVmaW5lICAgVFNHUEVOX0NSSVRfTE9ISQkoMTw8MikKKyNkZWZpbmUgVEhNX1RTUEMJMHgwZQorI2RlZmluZSBUSE1fUFBFQwkweDEwCisjZGVmaW5lIFRITV9DVEEJCTB4MTIKKyNkZWZpbmUgVEhNX1BUQQkJMHgxNAorI2RlZmluZSAgIFBUQV9TTE9QRV9NQVNLCSgweGZmMDApCisjZGVmaW5lICAgUFRBX1NMT1BFX1NISUZUCTgKKyNkZWZpbmUgICBQVEFfT0ZGU0VUX01BU0sJKDB4MDBmZikKKyNkZWZpbmUgVEhNX01HVEEJMHgxNgorI2RlZmluZSAgIE1HVEFfU0xPUEVfTUFTSwkoMHhmZjAwKQorI2RlZmluZSAgIE1HVEFfU0xPUEVfU0hJRlQJOAorI2RlZmluZSAgIE1HVEFfT0ZGU0VUX01BU0sJKDB4MDBmZikKKyNkZWZpbmUgVEhNX1RSQwkJMHgxYQorI2RlZmluZSAgIFRSQ19DT1JFMl9FTgkoMTw8MTUpCisjZGVmaW5lICAgVFJDX1RITV9FTgkoMTw8MTIpCisjZGVmaW5lICAgVFJDX0M2X1dBUgkoMTw8OCkKKyNkZWZpbmUgICBUUkNfQ09SRTFfRU4JKDE8PDcpCisjZGVmaW5lICAgVFJDX0NPUkVfUFdSCSgxPDw2KQorI2RlZmluZSAgIFRSQ19QQ0hfRU4JKDE8PDUpCisjZGVmaW5lICAgVFJDX01DSF9FTgkoMTw8NCkKKyNkZWZpbmUgICBUUkNfRElNTTQJKDE8PDMpCisjZGVmaW5lICAgVFJDX0RJTU0zCSgxPDwyKQorI2RlZmluZSAgIFRSQ19ESU1NMgkoMTw8MSkKKyNkZWZpbmUgICBUUkNfRElNTTEJKDE8PDApCisjZGVmaW5lIFRITV9URVMJCTB4MjAKKyNkZWZpbmUgVEhNX1RFTgkJMHgyMQorI2RlZmluZSAgIFRFTl9VUERBVEVfRU4JMQorI2RlZmluZSBUSE1fUFNDCQkweDI0CisjZGVmaW5lICAgUFNDX05URwkoMTw8MCkgLyogTm8gR0ZYIHR1cmJvIHN1cHBvcnQgKi8KKyNkZWZpbmUgICBQU0NfTlRQQwkoMTw8MSkgLyogTm8gQ1BVIHR1cmJvIHN1cHBvcnQgKi8KKyNkZWZpbmUgICBQU0NfUFBfREVGCSgwPDwyKSAvKiBQZXJmIHBvbGljeSB1cCB0byBkcml2ZXIgKi8KKyNkZWZpbmUgICBQU1BfUFBfUEMJKDE8PDIpIC8qIEJJT1MgcHJlZmVycyBDUFUgcGVyZiAqLworI2RlZmluZSAgIFBTUF9QUF9CQUwJKDI8PDIpIC8qIEJJT1Mgd2FudHMgYmFsYW5jZWQgcGVyZiAqLworI2RlZmluZSAgIFBTUF9QUF9HRlgJKDM8PDIpIC8qIEJJT1MgcHJlZmVycyBHRlggcGVyZiAqLworI2RlZmluZSAgIFBTUF9QQlJUCSgxPDw0KSAvKiBCSU9TIHJ1biB0aW1lIHN1cHBvcnQgKi8KKyNkZWZpbmUgVEhNX0NUVjEJMHgzMAorI2RlZmluZSAgIENUVl9URU1QX0VSUk9SICgxPDwxNSkKKyNkZWZpbmUgICBDVFZfVEVNUF9NQVNLCTB4M2YKKyNkZWZpbmUgICBDVFZfCisjZGVmaW5lIFRITV9DVFYyCTB4MzIKKyNkZWZpbmUgVEhNX0NFQwkJMHgzNCAvKiB1bmRvY3VtZW50ZWQgcG93ZXIgYWNjdW11bGF0b3IgaW4gam91bGVzICovCisjZGVmaW5lIFRITV9BRQkJMHgzZgorI2RlZmluZSBUSE1fSFRTCQkweDUwIC8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgICBIVFNfUENQTF9NQVNLCSgweDdmZTAwMDAwKQorI2RlZmluZSAgIEhUU19QQ1BMX1NISUZUIDIxCisjZGVmaW5lICAgSFRTX0dQTF9NQVNLICAoMHgwMDFmZjAwMCkKKyNkZWZpbmUgICBIVFNfR1BMX1NISUZUIDEyCisjZGVmaW5lICAgSFRTX1BQX01BU0sJKDB4MDAwMDBjMDApCisjZGVmaW5lICAgSFRTX1BQX1NISUZUICAxMAorI2RlZmluZSAgIEhUU19QUF9ERUYJMAorI2RlZmluZSAgIEhUU19QUF9QUk9DCTEKKyNkZWZpbmUgICBIVFNfUFBfQkFMCTIKKyNkZWZpbmUgICBIVFNfUFBfR0ZYCTMKKyNkZWZpbmUgICBIVFNfUENURF9ESVMJKDE8PDkpCisjZGVmaW5lICAgSFRTX0dURF9ESVMJKDE8PDgpCisjZGVmaW5lICAgSFRTX1BUTF9NQVNLICAoMHgwMDAwMDBmZSkKKyNkZWZpbmUgICBIVFNfUFRMX1NISUZUIDEKKyNkZWZpbmUgICBIVFNfTlZWCSgxPDwwKQorI2RlZmluZSBUSE1fSFRTSEkJMHg1NCAvKiAxNiBiaXRzICovCisjZGVmaW5lICAgSFRTMl9QUExfTUFTSwkJKDB4MDNmZikKKyNkZWZpbmUgICBIVFMyX1BSU1RfTUFTSwkoMHgzYzAwKQorI2RlZmluZSAgIEhUUzJfUFJTVF9TSElGVAkxMAorI2RlZmluZSAgIEhUUzJfUFJTVF9VTkxPQURFRAkwCisjZGVmaW5lICAgSFRTMl9QUlNUX1JVTk5JTkcJMQorI2RlZmluZSAgIEhUUzJfUFJTVF9URElTT1AJMiAvKiB0dXJibyBkaXNhYmxlZCBkdWUgdG8gcG93ZXIgKi8KKyNkZWZpbmUgICBIVFMyX1BSU1RfVERJU0hUCTMgLyogdHVyYm8gZGlzYWJsZWQgZHVlIHRvIGhpZ2ggdGVtcCAqLworI2RlZmluZSAgIEhUUzJfUFJTVF9URElTVVNSCTQgLyogdXNlciBkaXNhYmxlZCB0dXJibyAqLworI2RlZmluZSAgIEhUUzJfUFJTVF9URElTUExBVAk1IC8qIHBsYXRmb3JtIGRpc2FibGVkIHR1cmJvICovCisjZGVmaW5lICAgSFRTMl9QUlNUX1RESVNQTQk2IC8qIHBvd2VyIG1hbmFnZW1lbnQgZGlzYWJsZWQgdHVyYm8gKi8KKyNkZWZpbmUgICBIVFMyX1BSU1RfVERJU0VSUgk3IC8qIHNvbWUga2luZCBvZiBlcnJvciBkaXNhYmxlZCB0dXJibyAqLworI2RlZmluZSBUSE1fUFRMCQkweDU2CisjZGVmaW5lIFRITV9NR1RWCTB4NTgKKyNkZWZpbmUgICBUVl9NQVNLCTB4MDAwMDAwMDAwMDAwZmYwMAorI2RlZmluZSAgIFRWX1NISUZUCTgKKyNkZWZpbmUgVEhNX1BUVgkJMHg2MAorI2RlZmluZSAgIFBUVl9NQVNLCTB4MDBmZgorI2RlZmluZSBUSE1fTU1HUEMJMHg2NAorI2RlZmluZSBUSE1fTVBQQwkweDY2CisjZGVmaW5lIFRITV9NUENQQwkweDY4CisjZGVmaW5lIFRITV9UU1BJRU4JMHg4MgorI2RlZmluZSAgIFRTUElFTl9BVVhfTE9ISQkoMTw8MCkKKyNkZWZpbmUgICBUU1BJRU5fSE9UX0xPSEkJKDE8PDEpCisjZGVmaW5lICAgVFNQSUVOX0NSSVRfTE9ISQkoMTw8MikKKyNkZWZpbmUgICBUU1BJRU5fQVVYMl9MT0hJCSgxPDwzKQorI2RlZmluZSBUSE1fVFNMT0NLCTB4ODMKKyNkZWZpbmUgVEhNX0FUUgkJMHg4NAorI2RlZmluZSBUSE1fVE9GCQkweDg3CisjZGVmaW5lIFRITV9TVFMJCTB4OTgKKyNkZWZpbmUgICBTVFNfUENQTF9NQVNLCQkoMHg3ZmUwMDAwMCkKKyNkZWZpbmUgICBTVFNfUENQTF9TSElGVAkyMQorI2RlZmluZSAgIFNUU19HUExfTUFTSwkJKDB4MDAxZmYwMDApCisjZGVmaW5lICAgU1RTX0dQTF9TSElGVAkJMTIKKyNkZWZpbmUgICBTVFNfUFBfTUFTSwkJKDB4MDAwMDBjMDApCisjZGVmaW5lICAgU1RTX1BQX1NISUZUCQkxMAorI2RlZmluZSAgIFNUU19QUF9ERUYJCTAKKyNkZWZpbmUgICBTVFNfUFBfUFJPQwkJMQorI2RlZmluZSAgIFNUU19QUF9CQUwJCTIKKyNkZWZpbmUgICBTVFNfUFBfR0ZYCQkzCisjZGVmaW5lICAgU1RTX1BDVERfRElTCQkoMTw8OSkKKyNkZWZpbmUgICBTVFNfR1REX0RJUwkJKDE8PDgpCisjZGVmaW5lICAgU1RTX1BUTF9NQVNLCQkoMHgwMDAwMDBmZSkKKyNkZWZpbmUgICBTVFNfUFRMX1NISUZUCQkxCisjZGVmaW5lICAgU1RTX05WVgkJKDE8PDApCisjZGVmaW5lIFRITV9TRUMJCTB4OWMKKyNkZWZpbmUgICBTRUNfQUNLCSgxPDwwKQorI2RlZmluZSBUSE1fVEMzCQkweGE0CisjZGVmaW5lIFRITV9UQzEJCTB4YTgKKyNkZWZpbmUgICBTVFNfUFBMX01BU0sJCSgweDAwMDNmZjAwKQorI2RlZmluZSAgIFNUU19QUExfU0hJRlQJCTE2CisjZGVmaW5lIFRITV9UQzIJCTB4YWMKKyNkZWZpbmUgVEhNX0RUVgkJMHhiMAorI2RlZmluZSBUSE1fSVRWCQkweGQ4CisjZGVmaW5lICAgSVRWX01FX1NFUU5PX01BU0sgMHgwMDBmMDAwMCAvKiBNRSBzaG91bGQgdXBkYXRlIGV2ZXJ5IH4yMDBtcyAqLworI2RlZmluZSAgIElUVl9NRV9TRVFOT19TSElGVCAoMTYpCisjZGVmaW5lICAgSVRWX01DSF9URU1QX01BU0sgMHgwMDAwZmYwMAorI2RlZmluZSAgIElUVl9NQ0hfVEVNUF9TSElGVCAoOCkKKyNkZWZpbmUgICBJVFZfUENIX1RFTVBfTUFTSyAweDAwMDAwMGZmCisKKyNkZWZpbmUgdGhtX3JlYWRiKG9mZikgcmVhZGIoaXBzLT5yZWdtYXAgKyAob2ZmKSkKKyNkZWZpbmUgdGhtX3JlYWR3KG9mZikgcmVhZHcoaXBzLT5yZWdtYXAgKyAob2ZmKSkKKyNkZWZpbmUgdGhtX3JlYWRsKG9mZikgcmVhZGwoaXBzLT5yZWdtYXAgKyAob2ZmKSkKKyNkZWZpbmUgdGhtX3JlYWRxKG9mZikgcmVhZHEoaXBzLT5yZWdtYXAgKyAob2ZmKSkKKworI2RlZmluZSB0aG1fd3JpdGViKG9mZiwgdmFsKSB3cml0ZWIoKHZhbCksIGlwcy0+cmVnbWFwICsgKG9mZikpCisjZGVmaW5lIHRobV93cml0ZXcob2ZmLCB2YWwpIHdyaXRldygodmFsKSwgaXBzLT5yZWdtYXAgKyAob2ZmKSkKKyNkZWZpbmUgdGhtX3dyaXRlbChvZmYsIHZhbCkgd3JpdGVsKCh2YWwpLCBpcHMtPnJlZ21hcCArIChvZmYpKQorCitzdGF0aWMgY29uc3QgaW50IElQU19BREpVU1RfUEVSSU9EID0gNTAwMDsgLyogbXMgKi8KKworLyogRm9yIGluaXRpYWwgYXZlcmFnZSBjb2xsZWN0aW9uICovCitzdGF0aWMgY29uc3QgaW50IElQU19TQU1QTEVfUEVSSU9EID0gMjAwOyAvKiBtcyAqLworc3RhdGljIGNvbnN0IGludCBJUFNfU0FNUExFX1dJTkRPVyA9IDUwMDA7IC8qIDVzIG1vdmluZyB3aW5kb3cgb2Ygc2FtcGxlcyAqLworI2RlZmluZSBJUFNfU0FNUExFX0NPVU5UIChJUFNfU0FNUExFX1dJTkRPVyAvIElQU19TQU1QTEVfUEVSSU9EKQorCisvKiBQZXItU0tVIGxpbWl0cyAqLworc3RydWN0IGlwc19tY3BfbGltaXRzIHsKKwlpbnQgY3B1X2ZhbWlseTsKKwlpbnQgY3B1X21vZGVsOyAvKiBpbmNsdWRlcyBleHRlbmRlZCBtb2RlbC4uLiAqLworCWludCBtY3BfcG93ZXJfbGltaXQ7IC8qIG1XIHVuaXRzICovCisJaW50IGNvcmVfcG93ZXJfbGltaXQ7CisJaW50IG1jaF9wb3dlcl9saW1pdDsKKwlpbnQgY29yZV90ZW1wX2xpbWl0OyAvKiBkZWdyZWVzIEMgKi8KKwlpbnQgbWNoX3RlbXBfbGltaXQ7Cit9OworCisvKiBNYXggdGVtcHMgYXJlIC0xMCBkZWdyZWVzIEMgdG8gYXZvaWQgUFJPQ0hPVCMgKi8KKworc3RydWN0IGlwc19tY3BfbGltaXRzIGlwc19zdl9saW1pdHMgPSB7CisJLm1jcF9wb3dlcl9saW1pdCA9IDM1MDAwLAorCS5jb3JlX3Bvd2VyX2xpbWl0ID0gMjkwMDAsCisJLm1jaF9wb3dlcl9saW1pdCA9IDIwMDAwLAorCS5jb3JlX3RlbXBfbGltaXQgPSA5NSwKKwkubWNoX3RlbXBfbGltaXQgPSA5MAorfTsKKworc3RydWN0IGlwc19tY3BfbGltaXRzIGlwc19sdl9saW1pdHMgPSB7CisJLm1jcF9wb3dlcl9saW1pdCA9IDI1MDAwLAorCS5jb3JlX3Bvd2VyX2xpbWl0ID0gMjEwMDAsCisJLm1jaF9wb3dlcl9saW1pdCA9IDEzMDAwLAorCS5jb3JlX3RlbXBfbGltaXQgPSA5NSwKKwkubWNoX3RlbXBfbGltaXQgPSA5MAorfTsKKworc3RydWN0IGlwc19tY3BfbGltaXRzIGlwc191bHZfbGltaXRzID0geworCS5tY3BfcG93ZXJfbGltaXQgPSAxODAwMCwKKwkuY29yZV9wb3dlcl9saW1pdCA9IDE0MDAwLAorCS5tY2hfcG93ZXJfbGltaXQgPSAxMTAwMCwKKwkuY29yZV90ZW1wX2xpbWl0ID0gOTUsCisJLm1jaF90ZW1wX2xpbWl0ID0gOTAKK307CisKK3N0cnVjdCBpcHNfZHJpdmVyIHsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXZvaWQgKnJlZ21hcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1vbml0b3I7CisJc3RydWN0IHRhc2tfc3RydWN0ICphZGp1c3Q7CisJc3RydWN0IGRlbnRyeSAqZGVidWdfcm9vdDsKKworCS8qIEF2ZXJhZ2UgQ1BVIGNvcmUgdGVtcHMgKGFsbCBhdmVyYWdlcyBpbiAuMDEgZGVncmVlcyBDIGZvciBwcmVjaXNpb24pICovCisJdTE2IGN0djFfYXZnX3RlbXA7CisJdTE2IGN0djJfYXZnX3RlbXA7CisJLyogR01DSCBhdmVyYWdlICovCisJdTE2IG1jaF9hdmdfdGVtcDsKKwkvKiBBdmVyYWdlIGZvciB0aGUgQ1BVIChib3RoIGNvcmVzPykgKi8KKwl1MTYgbWNwX2F2Z190ZW1wOworCS8qIEF2ZXJhZ2UgcG93ZXIgY29uc3VtcHRpb24gKGluIG1XKSAqLworCXUzMiBjcHVfYXZnX3Bvd2VyOworCXUzMiBtY2hfYXZnX3Bvd2VyOworCisJLyogT2Zmc2V0IHZhbHVlcyAqLworCXUxNiBjdGFfdmFsOworCXUxNiBwdGFfdmFsOworCXUxNiBtZ3RhX3ZhbDsKKworCS8qIE1heGltdW1zICYgcHJlZnMsIHByb3RlY3RlZCBieSB0dXJibyBzdGF0dXMgbG9jayAqLworCXNwaW5sb2NrX3QgdHVyYm9fc3RhdHVzX2xvY2s7CisJdTE2IG1jcF90ZW1wX2xpbWl0OworCXUxNiBtY3BfcG93ZXJfbGltaXQ7CisJdTE2IGNvcmVfcG93ZXJfbGltaXQ7CisJdTE2IG1jaF9wb3dlcl9saW1pdDsKKwlib29sIGNwdV90dXJib19lbmFibGVkOworCWJvb2wgX19jcHVfdHVyYm9fb247CisJYm9vbCBncHVfdHVyYm9fZW5hYmxlZDsKKwlib29sIF9fZ3B1X3R1cmJvX29uOworCWJvb2wgZ3B1X3ByZWZlcnJlZDsKKwlib29sIHBvbGxfdHVyYm9fc3RhdHVzOworCWJvb2wgc2Vjb25kX2NwdTsKKwlzdHJ1Y3QgaXBzX21jcF9saW1pdHMgKmxpbWl0czsKKworCS8qIE9wdGlvbmFsIE1DSCBpbnRlcmZhY2VzIGZvciBpZiBpOTE1IGlzIGluIHVzZSAqLworCXVuc2lnbmVkIGxvbmcgKCpyZWFkX21jaF92YWwpKHZvaWQpOworCWJvb2wgKCpncHVfcmFpc2UpKHZvaWQpOworCWJvb2wgKCpncHVfbG93ZXIpKHZvaWQpOworCWJvb2wgKCpncHVfYnVzeSkodm9pZCk7CisJYm9vbCAoKmdwdV90dXJib19kaXNhYmxlKSh2b2lkKTsKKworCS8qIEZvciByZXN0b3JhdGlvbiBhdCB1bmxvYWQgKi8KKwl1NjQgb3JpZ190dXJib19saW1pdDsKKwl1NjQgb3JpZ190dXJib19yYXRpb3M7Cit9OworCisvKioKKyAqIGlwc19jcHVfYnVzeSAtIGlzIENQVSBidXN5PworICogQGlwczogSVBTIGRyaXZlciBzdHJ1Y3QKKyAqCisgKiBDaGVjayBDUFUgZm9yIGxvYWQgdG8gc2VlIHdoZXRoZXIgd2Ugc2hvdWxkIGluY3JlYXNlIGl0cyB0aGVybWFsIGJ1ZGdldC4KKyAqCisgKiBSRVRVUk5TOgorICogVHJ1ZSBpZiB0aGUgQ1BVIGNvdWxkIHVzZSBtb3JlIHBvd2VyLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIGlwc19jcHVfYnVzeShzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCWlmICgoYXZlbnJ1blswXSA+PiBGU0hJRlQpID4gMSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogaXBzX2NwdV9yYWlzZSAtIHJhaXNlIENQVSBwb3dlciBjbGFtcAorICogQGlwczogSVBTIGRyaXZlciBzdHJ1Y3QKKyAqCisgKiBSYWlzZSB0aGUgQ1BVIHBvd2VyIGNsYW1wIGJ5ICVJUFNfQ1BVX1NURVAsIGluIGFjY29yZGFuY2Ugd2l0aCBURFAgZm9yCisgKiB0aGlzIHBsYXRmb3JtLgorICoKKyAqIFdlIGRvIHRoaXMgYnkgYWRqdXN0aW5nIHRoZSBUVVJCT19QT1dFUl9DVVJSRU5UX0xJTUlUIE1TUiB1cHdhcmRzIChhcworICogbG9uZyBhcyB3ZSBoYXZlbid0IGhpdCB0aGUgVERQIGxpbWl0IGZvciB0aGUgU0tVKS4KKyAqLworc3RhdGljIHZvaWQgaXBzX2NwdV9yYWlzZShzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCXU2NCB0dXJib19vdmVycmlkZTsKKwl1MTYgY3VyX3RkcF9saW1pdCwgbmV3X3RkcF9saW1pdDsKKworCWlmICghaXBzLT5jcHVfdHVyYm9fZW5hYmxlZCkKKwkJcmV0dXJuOworCisJcmRtc3JsKFRVUkJPX1BPV0VSX0NVUlJFTlRfTElNSVQsIHR1cmJvX292ZXJyaWRlKTsKKworCWN1cl90ZHBfbGltaXQgPSB0dXJib19vdmVycmlkZSAmIFRVUkJPX1REUF9NQVNLOworCW5ld190ZHBfbGltaXQgPSBjdXJfdGRwX2xpbWl0ICsgODsgLyogMVcgaW5jcmVhc2UgKi8KKworCS8qIENsYW1wIHRvIFNLVSBURFAgbGltaXQgKi8KKwlpZiAoKChuZXdfdGRwX2xpbWl0ICogMTApIC8gOCkgPiBpcHMtPmNvcmVfcG93ZXJfbGltaXQpCisJCW5ld190ZHBfbGltaXQgPSBjdXJfdGRwX2xpbWl0OworCisJdGhtX3dyaXRldyhUSE1fTVBDUEMsIChuZXdfdGRwX2xpbWl0ICogMTApIC8gOCk7CisKKwl0dXJib19vdmVycmlkZSB8PSBUVVJCT19URENfT1ZSX0VOIHwgVFVSQk9fVERDX09WUl9FTjsKKwl3cm1zcmwoVFVSQk9fUE9XRVJfQ1VSUkVOVF9MSU1JVCwgdHVyYm9fb3ZlcnJpZGUpOworCisJdHVyYm9fb3ZlcnJpZGUgJj0gflRVUkJPX1REUF9NQVNLOworCXR1cmJvX292ZXJyaWRlIHw9IG5ld190ZHBfbGltaXQ7CisKKwl3cm1zcmwoVFVSQk9fUE9XRVJfQ1VSUkVOVF9MSU1JVCwgdHVyYm9fb3ZlcnJpZGUpOworfQorCisvKioKKyAqIGlwc19jcHVfbG93ZXIgLSBsb3dlciBDUFUgcG93ZXIgY2xhbXAKKyAqIEBpcHM6IElQUyBkcml2ZXIgc3RydWN0CisgKgorICogTG93ZXIgQ1BVIHBvd2VyIGNsYW1wIGIgJUlQU19DUFVfU1RFUCBpZiBwb3NzaWJsZS4KKyAqCisgKiBXZSBkbyB0aGlzIGJ5IGFkanVzdGluZyB0aGUgVFVSQk9fUE9XRVJfQ1VSUkVOVF9MSU1JVCBNU1IgZG93biwgZ29pbmcKKyAqIGFzIGxvdyBhcyB0aGUgcGxhdGZvcm0gbGltaXRzIHdpbGwgYWxsb3cgKHRob3VnaCB3ZSBjb3VsZCBnbyBsb3dlciB0aGVyZQorICogd291bGRuJ3QgYmUgbXVjaCBwb2ludCkuCisgKi8KK3N0YXRpYyB2b2lkIGlwc19jcHVfbG93ZXIoc3RydWN0IGlwc19kcml2ZXIgKmlwcykKK3sKKwl1NjQgdHVyYm9fb3ZlcnJpZGU7CisJdTE2IGN1cl9saW1pdCwgbmV3X2xpbWl0OworCisJcmRtc3JsKFRVUkJPX1BPV0VSX0NVUlJFTlRfTElNSVQsIHR1cmJvX292ZXJyaWRlKTsKKworCWN1cl9saW1pdCA9IHR1cmJvX292ZXJyaWRlICYgVFVSQk9fVERQX01BU0s7CisJbmV3X2xpbWl0ID0gY3VyX2xpbWl0IC0gODsgLyogMVcgZGVjcmVhc2UgKi8KKworCS8qIENsYW1wIHRvIFNLVSBURFAgbGltaXQgKi8KKwlpZiAoKChuZXdfbGltaXQgKiAxMCkgLyA4KSA8IChpcHMtPm9yaWdfdHVyYm9fbGltaXQgJiBUVVJCT19URFBfTUFTSykpCisJCW5ld19saW1pdCA9IGlwcy0+b3JpZ190dXJib19saW1pdCAmIFRVUkJPX1REUF9NQVNLOworCisJdGhtX3dyaXRldyhUSE1fTVBDUEMsIChuZXdfbGltaXQgKiAxMCkgLyA4KTsKKworCXR1cmJvX292ZXJyaWRlIHw9IFRVUkJPX1REQ19PVlJfRU4gfCBUVVJCT19URENfT1ZSX0VOOworCXdybXNybChUVVJCT19QT1dFUl9DVVJSRU5UX0xJTUlULCB0dXJib19vdmVycmlkZSk7CisKKwl0dXJib19vdmVycmlkZSAmPSB+VFVSQk9fVERQX01BU0s7CisJdHVyYm9fb3ZlcnJpZGUgfD0gbmV3X2xpbWl0OworCisJd3Jtc3JsKFRVUkJPX1BPV0VSX0NVUlJFTlRfTElNSVQsIHR1cmJvX292ZXJyaWRlKTsKK30KKworLyoqCisgKiBkb19lbmFibGVfY3B1X3R1cmJvIC0gaW50ZXJuYWwgdHVyYm8gZW5hYmxlIGZ1bmN0aW9uCisgKiBAZGF0YTogdW51c2VkCisgKgorICogSW50ZXJuYWwgZnVuY3Rpb24gZm9yIGFjdHVhbGx5IHVwZGF0aW5nIE1TUnMuICBXaGVuIHdlIGVuYWJsZS9kaXNhYmxlCisgKiB0dXJibywgd2UgbmVlZCB0byBkbyBpdCBvbiBlYWNoIENQVTsgdGhpcyBmdW5jdGlvbiBpcyB0aGUgb25lIGNhbGxlZAorICogYnkgb25fZWFjaF9jcHUoKSB3aGVuIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgZG9fZW5hYmxlX2NwdV90dXJibyh2b2lkICpkYXRhKQoreworCXU2NCBwZXJmX2N0bDsKKworCXJkbXNybChJQTMyX1BFUkZfQ1RMLCBwZXJmX2N0bCk7CisJaWYgKHBlcmZfY3RsICYgSUEzMl9QRVJGX1RVUkJPX0RJUykgeworCQlwZXJmX2N0bCAmPSB+SUEzMl9QRVJGX1RVUkJPX0RJUzsKKwkJd3Jtc3JsKElBMzJfUEVSRl9DVEwsIHBlcmZfY3RsKTsKKwl9Cit9CisKKy8qKgorICogaXBzX2VuYWJsZV9jcHVfdHVyYm8gLSBlbmFibGUgdHVyYm8gbW9kZSBvbiBhbGwgQ1BVcworICogQGlwczogSVBTIGRyaXZlciBzdHJ1Y3QKKyAqCisgKiBFbmFibGUgdHVyYm8gbW9kZSBieSBjbGVhcmluZyB0aGUgZGlzYWJsZSBiaXQgaW4gSUEzMl9QRVJGX0NUTCBvbgorICogYWxsIGxvZ2ljYWwgdGhyZWFkcy4KKyAqLworc3RhdGljIHZvaWQgaXBzX2VuYWJsZV9jcHVfdHVyYm8oc3RydWN0IGlwc19kcml2ZXIgKmlwcykKK3sKKwkvKiBBbHJlYWR5IG9uLCBubyBuZWVkIHRvIG1lc3Mgd2l0aCBNU1JzICovCisJaWYgKGlwcy0+X19jcHVfdHVyYm9fb24pCisJCXJldHVybjsKKworCW9uX2VhY2hfY3B1KGRvX2VuYWJsZV9jcHVfdHVyYm8sIGlwcywgMSk7CisKKwlpcHMtPl9fY3B1X3R1cmJvX29uID0gdHJ1ZTsKK30KKworLyoqCisgKiBkb19kaXNhYmxlX2NwdV90dXJibyAtIGludGVybmFsIHR1cmJvIGRpc2FibGUgZnVuY3Rpb24KKyAqIEBkYXRhOiB1bnVzZWQKKyAqCisgKiBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgYWN0dWFsbHkgdXBkYXRpbmcgTVNScy4gIFdoZW4gd2UgZW5hYmxlL2Rpc2FibGUKKyAqIHR1cmJvLCB3ZSBuZWVkIHRvIGRvIGl0IG9uIGVhY2ggQ1BVOyB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBvbmUgY2FsbGVkCisgKiBieSBvbl9lYWNoX2NwdSgpIHdoZW4gbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCBkb19kaXNhYmxlX2NwdV90dXJibyh2b2lkICpkYXRhKQoreworCXU2NCBwZXJmX2N0bDsKKworCXJkbXNybChJQTMyX1BFUkZfQ1RMLCBwZXJmX2N0bCk7CisJaWYgKCEocGVyZl9jdGwgJiBJQTMyX1BFUkZfVFVSQk9fRElTKSkgeworCQlwZXJmX2N0bCB8PSBJQTMyX1BFUkZfVFVSQk9fRElTOworCQl3cm1zcmwoSUEzMl9QRVJGX0NUTCwgcGVyZl9jdGwpOworCX0KK30KKworLyoqCisgKiBpcHNfZGlzYWJsZV9jcHVfdHVyYm8gLSBkaXNhYmxlIHR1cmJvIG1vZGUgb24gYWxsIENQVXMKKyAqIEBpcHM6IElQUyBkcml2ZXIgc3RydWN0CisgKgorICogRGlzYWJsZSB0dXJibyBtb2RlIGJ5IHNldHRpbmcgdGhlIGRpc2FibGUgYml0IGluIElBMzJfUEVSRl9DVEwgb24KKyAqIGFsbCBsb2dpY2FsIHRocmVhZHMuCisgKi8KK3N0YXRpYyB2b2lkIGlwc19kaXNhYmxlX2NwdV90dXJibyhzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCS8qIEFscmVhZHkgb2ZmLCBsZWF2ZSBpdCAqLworCWlmICghaXBzLT5fX2NwdV90dXJib19vbikKKwkJcmV0dXJuOworCisJb25fZWFjaF9jcHUoZG9fZGlzYWJsZV9jcHVfdHVyYm8sIGlwcywgMSk7CisKKwlpcHMtPl9fY3B1X3R1cmJvX29uID0gZmFsc2U7Cit9CisKKy8qKgorICogaXBzX2dwdV9idXN5IC0gaXMgR1BVIGJ1c3k/CisgKiBAaXBzOiBJUFMgZHJpdmVyIHN0cnVjdAorICoKKyAqIENoZWNrIEdQVSBmb3IgbG9hZCB0byBzZWUgd2hldGhlciB3ZSBzaG91bGQgaW5jcmVhc2UgaXRzIHRoZXJtYWwgYnVkZ2V0LgorICogV2UgbmVlZCB0byBjYWxsIGludG8gdGhlIGk5MTUgZHJpdmVyIGluIHRoaXMgY2FzZS4KKyAqCisgKiBSRVRVUk5TOgorICogVHJ1ZSBpZiB0aGUgR1BVIGNvdWxkIHVzZSBtb3JlIHBvd2VyLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIGlwc19ncHVfYnVzeShzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCWlmICghaXBzLT5ncHVfdHVyYm9fZW5hYmxlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIGlwcy0+Z3B1X2J1c3koKTsKK30KKworLyoqCisgKiBpcHNfZ3B1X3JhaXNlIC0gcmFpc2UgR1BVIHBvd2VyIGNsYW1wCisgKiBAaXBzOiBJUFMgZHJpdmVyIHN0cnVjdAorICoKKyAqIFJhaXNlIHRoZSBHUFUgZnJlcXVlbmN5L3Bvd2VyIGlmIHBvc3NpYmxlLiAgV2UgbmVlZCB0byBjYWxsIGludG8gdGhlCisgKiBpOTE1IGRyaXZlciBpbiB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyB2b2lkIGlwc19ncHVfcmFpc2Uoc3RydWN0IGlwc19kcml2ZXIgKmlwcykKK3sKKwlpZiAoIWlwcy0+Z3B1X3R1cmJvX2VuYWJsZWQpCisJCXJldHVybjsKKworCWlmICghaXBzLT5ncHVfcmFpc2UoKSkKKwkJaXBzLT5ncHVfdHVyYm9fZW5hYmxlZCA9IGZhbHNlOworCisJcmV0dXJuOworfQorCisvKioKKyAqIGlwc19ncHVfbG93ZXIgLSBsb3dlciBHUFUgcG93ZXIgY2xhbXAKKyAqIEBpcHM6IElQUyBkcml2ZXIgc3RydWN0CisgKgorICogTG93ZXIgR1BVIGZyZXF1ZW5jeS9wb3dlciBpZiBwb3NzaWJsZS4gIE5lZWQgdG8gY2FsbCBpOTE1LgorICovCitzdGF0aWMgdm9pZCBpcHNfZ3B1X2xvd2VyKHN0cnVjdCBpcHNfZHJpdmVyICppcHMpCit7CisJaWYgKCFpcHMtPmdwdV90dXJib19lbmFibGVkKQorCQlyZXR1cm47CisKKwlpZiAoIWlwcy0+Z3B1X2xvd2VyKCkpCisJCWlwcy0+Z3B1X3R1cmJvX2VuYWJsZWQgPSBmYWxzZTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBpcHNfZW5hYmxlX2dwdV90dXJibyAtIG5vdGlmeSB0aGUgZ2Z4IGRyaXZlciB0dXJibyBpcyBhdmFpbGFibGUKKyAqIEBpcHM6IElQUyBkcml2ZXIgc3RydWN0CisgKgorICogQ2FsbCBpbnRvIHRoZSBncmFwaGljcyBkcml2ZXIgaW5kaWNhdGluZyB0aGF0IGl0IGNhbiBzYWZlbHkgdXNlCisgKiB0dXJibyBtb2RlLgorICovCitzdGF0aWMgdm9pZCBpcHNfZW5hYmxlX2dwdV90dXJibyhzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCWlmIChpcHMtPl9fZ3B1X3R1cmJvX29uKQorCQlyZXR1cm47CisJaXBzLT5fX2dwdV90dXJib19vbiA9IHRydWU7Cit9CisKKy8qKgorICogaXBzX2Rpc2FibGVfZ3B1X3R1cmJvIC0gbm90aWZ5IHRoZSBnZnggZHJpdmVyIHRvIGRpc2FibGUgdHVyYm8gbW9kZQorICogQGlwczogSVBTIGRyaXZlciBzdHJ1Y3QKKyAqCisgKiBSZXF1ZXN0IHRoYXQgdGhlIGdyYXBoaWNzIGRyaXZlciBkaXNhYmxlIHR1cmJvIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGlwc19kaXNhYmxlX2dwdV90dXJibyhzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCS8qIEF2b2lkIGNhbGxpbmcgaTkxNSBpZiB0dXJibyBpcyBhbHJlYWR5IGRpc2FibGVkICovCisJaWYgKCFpcHMtPl9fZ3B1X3R1cmJvX29uKQorCQlyZXR1cm47CisKKwlpZiAoIWlwcy0+Z3B1X3R1cmJvX2Rpc2FibGUoKSkKKwkJZGV2X2VycigmaXBzLT5kZXYtPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIGdyYXBoaXMgdHVyYm9cbiIpOworCWVsc2UKKwkJaXBzLT5fX2dwdV90dXJib19vbiA9IGZhbHNlOworfQorCisvKioKKyAqIG1jcF9leGNlZWRlZCAtIGNoZWNrIHdoZXRoZXIgd2UncmUgb3V0c2lkZSBvdXIgdGhlcm1hbCAmIHBvd2VyIGxpbWl0cworICogQGlwczogSVBTIGRyaXZlciBzdHJ1Y3QKKyAqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBNQ1AgaXMgb3ZlciBpdHMgdGhlcm1hbCBvciBwb3dlciBidWRnZXQuCisgKi8KK3N0YXRpYyBib29sIG1jcF9leGNlZWRlZChzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrLCBmbGFncyk7CisJaWYgKGlwcy0+bWNwX2F2Z190ZW1wID4gKGlwcy0+bWNwX3RlbXBfbGltaXQgKiAxMDApKQorCQlyZXQgPSB0cnVlOworCWlmIChpcHMtPmNwdV9hdmdfcG93ZXIgKyBpcHMtPm1jaF9hdmdfcG93ZXIgPiBpcHMtPm1jcF9wb3dlcl9saW1pdCkKKwkJcmV0ID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0KQorCQlkZXZfaW5mbygmaXBzLT5kZXYtPmRldiwKKwkJCSAiTUNQIHBvd2VyIG9yIHRoZXJtYWwgbGltaXQgZXhjZWVkZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjcHVfZXhjZWVkZWQgLSBjaGVjayB3aGV0aGVyIGEgQ1BVIGNvcmUgaXMgb3V0c2lkZSBpdHMgbGltaXRzCisgKiBAaXBzOiBJUFMgZHJpdmVyIHN0cnVjdAorICogQGNwdTogQ1BVIG51bWJlciB0byBjaGVjaworICoKKyAqIENoZWNrIGEgZ2l2ZW4gQ1BVJ3MgYXZlcmFnZSB0ZW1wIG9yIHBvd2VyIGlzIG92ZXIgaXRzIGxpbWl0LgorICovCitzdGF0aWMgYm9vbCBjcHVfZXhjZWVkZWQoc3RydWN0IGlwc19kcml2ZXIgKmlwcywgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBhdmc7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrLCBmbGFncyk7CisJYXZnID0gY3B1ID8gaXBzLT5jdHYyX2F2Z190ZW1wIDogaXBzLT5jdHYxX2F2Z190ZW1wOworCWlmIChhdmcgPiAoaXBzLT5saW1pdHMtPmNvcmVfdGVtcF9saW1pdCAqIDEwMCkpCisJCXJldCA9IHRydWU7CisJaWYgKGlwcy0+Y3B1X2F2Z19wb3dlciA+IGlwcy0+Y29yZV9wb3dlcl9saW1pdCAqIDEwMCkKKwkJcmV0ID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0KQorCQlkZXZfaW5mbygmaXBzLT5kZXYtPmRldiwKKwkJCSAiQ1BVIHBvd2VyIG9yIHRoZXJtYWwgbGltaXQgZXhjZWVkZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtY2hfZXhjZWVkZWQgLSBjaGVjayB3aGV0aGVyIHRoZSBHUFUgaXMgb3ZlciBidWRnZXQKKyAqIEBpcHM6IElQUyBkcml2ZXIgc3RydWN0CisgKgorICogQ2hlY2sgdGhlIE1DSCB0ZW1wICYgcG93ZXIgYWdhaW5zdCB0aGVpciBtYXhpbXVtcy4KKyAqLworc3RhdGljIGJvb2wgbWNoX2V4Y2VlZGVkKHN0cnVjdCBpcHNfZHJpdmVyICppcHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHJldCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwcy0+dHVyYm9fc3RhdHVzX2xvY2ssIGZsYWdzKTsKKwlpZiAoaXBzLT5tY2hfYXZnX3RlbXAgPiAoaXBzLT5saW1pdHMtPm1jaF90ZW1wX2xpbWl0ICogMTAwKSkKKwkJcmV0ID0gdHJ1ZTsKKwlpZiAoaXBzLT5tY2hfYXZnX3Bvd2VyID4gaXBzLT5tY2hfcG93ZXJfbGltaXQpCisJCXJldCA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBzLT50dXJib19zdGF0dXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB1cGRhdGVfdHVyYm9fbGltaXRzIC0gZ2V0IHZhcmlvdXMgbGltaXRzICYgc2V0dGluZ3MgZnJvbSByZWdzCisgKiBAaXBzOiBJUFMgZHJpdmVyIHN0cnVjdAorICoKKyAqIFVwZGF0ZSB0aGUgSVBTIHBvd2VyICYgdGVtcCBsaW1pdHMsIGFsb25nIHdpdGggdHVyYm8gZW5hYmxlIGZsYWdzLAorICogYmFzZWQgb24gbGF0ZXN0IHJlZ2lzdGVyIGNvbnRlbnRzLgorICoKKyAqIFVzZWQgYXQgaW5pdCB0aW1lIGFuZCBmb3IgcnVudGltZSBCSU9TIHN1cHBvcnQsIHdoaWNoIHJlcXVpcmVzIHBvbGxpbmcKKyAqIHRoZSByZWdzIGZvciB1cGRhdGVzIChhcyBhIHJlc3VsdCBvZiBBQy0+REMgdHJhbnNpdGlvbiBmb3IgZXhhbXBsZSkuCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgdHVyYm9fc3RhdHVzX2xvY2sgKG91dHNpZGUgb2YgaW5pdCkKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3R1cmJvX2xpbWl0cyhzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCXUzMiBodHMgPSB0aG1fcmVhZGwoVEhNX0hUUyk7CisKKwlpcHMtPmNwdV90dXJib19lbmFibGVkID0gIShodHMgJiBIVFNfUENURF9ESVMpOworCWlwcy0+Z3B1X3R1cmJvX2VuYWJsZWQgPSAhKGh0cyAmIEhUU19HVERfRElTKTsKKwlpcHMtPmNvcmVfcG93ZXJfbGltaXQgPSB0aG1fcmVhZHcoVEhNX01QQ1BDKTsKKwlpcHMtPm1jaF9wb3dlcl9saW1pdCA9IHRobV9yZWFkdyhUSE1fTU1HUEMpOworCWlwcy0+bWNwX3RlbXBfbGltaXQgPSB0aG1fcmVhZHcoVEhNX1BUTCk7CisJaXBzLT5tY3BfcG93ZXJfbGltaXQgPSB0aG1fcmVhZHcoVEhNX01QUEMpOworCisJLyogSWdub3JlIEJJT1MgQ1BVIHZzIEdQVSBwcmVmICovCit9CisKKy8qKgorICogaXBzX2FkanVzdCAtIGFkanVzdCBwb3dlciBjbGFtcCBiYXNlZCBvbiB0aGVybWFsIHN0YXRlCisgKiBAZGF0YTogaXBzIGRyaXZlciBzdHJ1Y3R1cmUKKyAqCisgKiBXYWtlIHVwIGV2ZXJ5IDVzIG9yIHNvIGFuZCBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBhZGp1c3QgdGhlIHBvd2VyIGNsYW1wLgorICogQ2hlY2sgQ1BVIGFuZCBHUFUgbG9hZCB0byBkZXRlcm1pbmUgd2hpY2ggbmVlZHMgYWRqdXN0bWVudC4gIFRoZXJlIGFyZQorICogc2V2ZXJhbCB0aGluZ3MgdG8gY29uc2lkZXIgaGVyZToKKyAqICAgLSBkbyB3ZSBuZWVkIHRvIGFkanVzdCB1cCBvciBkb3duPworICogICAtIGlzIENQVSBidXN5PworICogICAtIGlzIEdQVSBidXN5PworICogICAtIGlzIENQVSBpbiB0dXJibz8KKyAqICAgLSBpcyBHUFUgaW4gdHVyYm8/CisgKiAgIC0gaXMgQ1BVIG9yIEdQVSBwcmVmZXJyZWQ/IChDUFUgaXMgZGVmYXVsdCkKKyAqCisgKiBTbywgZ2l2ZW4gdGhlIGFib3ZlLCB3ZSBkbyB0aGUgZm9sbG93aW5nOgorICogICAtIHVwIChURFAgYXZhaWxhYmxlKQorICogICAgIC0gQ1BVIG5vdCBidXN5LCBHUFUgbm90IGJ1c3kgLSBub3RoaW5nCisgKiAgICAgLSBDUFUgYnVzeSwgR1BVIG5vdCBidXN5IC0gYWRqdXN0IENQVSB1cAorICogICAgIC0gQ1BVIG5vdCBidXN5LCBHUFUgYnVzeSAtIGFkanVzdCBHUFUgdXAKKyAqICAgICAtIENQVSBidXN5LCBHUFUgYnVzeSAtIGFkanVzdCBwcmVmZXJyZWQgdW5pdCB1cCwgdGFraW5nIGhlYWRyb29tIGZyb20KKyAqICAgICAgIG5vbi1wcmVmZXJyZWQgdW5pdCBpZiBuZWNlc3NhcnkKKyAqICAgLSBkb3duIChhdCBURFAgbGltaXQpCisgKiAgICAgLSBhZGp1c3QgYm90aCBDUFUgYW5kIEdQVSBkb3duIGlmIHBvc3NpYmxlCisgKgorCQljcHUrIGdwdSsJY3B1K2dwdS0JY3B1LWdwdSsJY3B1LWdwdS0KK2NwdSA8IGdwdSA8CWNwdStncHUrCWNwdSsJCWdwdSsJCW5vdGhpbmcKK2NwdSA8IGdwdSA+PQljcHUrZ3B1LShtY3A8KQljcHUrZ3B1LShtY3A8KQlncHUtCQlncHUtCitjcHUgPj0gZ3B1IDwJY3B1LWdwdSsobWNwPCkJY3B1LQkJY3B1LWdwdSsobWNwPCkJY3B1LQorY3B1ID49IGdwdSA+PQljcHUtZ3B1LQljcHUtZ3B1LQljcHUtZ3B1LQljcHUtZ3B1LQorICoKKyAqLworc3RhdGljIGludCBpcHNfYWRqdXN0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwc19kcml2ZXIgKmlwcyA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlwcy0+ZGV2LT5kZXYsICJzdGFydGluZyBpcHMtYWRqdXN0IHRocmVhZFxuIik7CisKKwkvKgorCSAqIEFkanVzdCBDUFUgYW5kIEdQVSBjbGFtcHMgZXZlcnkgNXMgaWYgbmVlZGVkLiAgRG9pbmcgaXQgbW9yZQorCSAqIG9mdGVuIGlzbid0IHJlY29tbWVuZGVkIGR1ZSB0byBNRSBpbnRlcmFjdGlvbi4KKwkgKi8KKwlkbyB7CisJCWJvb2wgY3B1X2J1c3kgPSBpcHNfY3B1X2J1c3koaXBzKTsKKwkJYm9vbCBncHVfYnVzeSA9IGlwc19ncHVfYnVzeShpcHMpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrLCBmbGFncyk7CisJCWlmIChpcHMtPnBvbGxfdHVyYm9fc3RhdHVzKQorCQkJdXBkYXRlX3R1cmJvX2xpbWl0cyhpcHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrLCBmbGFncyk7CisKKwkJLyogVXBkYXRlIHR1cmJvIHN0YXR1cyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGlwcy0+Y3B1X3R1cmJvX2VuYWJsZWQpCisJCQlpcHNfZW5hYmxlX2NwdV90dXJibyhpcHMpOworCQllbHNlCisJCQlpcHNfZGlzYWJsZV9jcHVfdHVyYm8oaXBzKTsKKworCQlpZiAoaXBzLT5ncHVfdHVyYm9fZW5hYmxlZCkKKwkJCWlwc19lbmFibGVfZ3B1X3R1cmJvKGlwcyk7CisJCWVsc2UKKwkJCWlwc19kaXNhYmxlX2dwdV90dXJibyhpcHMpOworCisJCS8qIFdlJ3JlIG91dHNpZGUgb3VyIGNvbWZvcnQgem9uZSwgY3JhbmsgdGhlbSBkb3duICovCisJCWlmIChtY3BfZXhjZWVkZWQoaXBzKSkgeworCQkJaXBzX2NwdV9sb3dlcihpcHMpOworCQkJaXBzX2dwdV9sb3dlcihpcHMpOworCQkJZ290byBzbGVlcDsKKwkJfQorCisJCWlmICghY3B1X2V4Y2VlZGVkKGlwcywgMCkgJiYgY3B1X2J1c3kpCisJCQlpcHNfY3B1X3JhaXNlKGlwcyk7CisJCWVsc2UKKwkJCWlwc19jcHVfbG93ZXIoaXBzKTsKKworCQlpZiAoIW1jaF9leGNlZWRlZChpcHMpICYmIGdwdV9idXN5KQorCQkJaXBzX2dwdV9yYWlzZShpcHMpOworCQllbHNlCisJCQlpcHNfZ3B1X2xvd2VyKGlwcyk7CisKK3NsZWVwOgorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhJUFNfQURKVVNUX1BFUklPRCkpOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJZGV2X2RiZygmaXBzLT5kZXYtPmRldiwgImlwcy1hZGp1c3QgdGhyZWFkIHN0b3BwZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIZWxwZXJzIGZvciByZWFkaW5nIG91dCB0ZW1wL3Bvd2VyIHZhbHVlcyBhbmQgY2FsY3VsYXRpbmcgdGhlaXIKKyAqIGF2ZXJhZ2VzIGZvciB0aGUgZGVjaXNpb24gbWFraW5nIGFuZCBtb25pdG9yaW5nIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgdTE2IGNhbGNfYXZnX3RlbXAoc3RydWN0IGlwc19kcml2ZXIgKmlwcywgdTE2ICphcnJheSkKK3sKKwl1NjQgdG90YWwgPSAwOworCWludCBpOworCXUxNiBhdmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBTX1NBTVBMRV9DT1VOVDsgaSsrKQorCQl0b3RhbCArPSAodTY0KShhcnJheVtpXSAqIDEwMCk7CisKKwlkb19kaXYodG90YWwsIElQU19TQU1QTEVfQ09VTlQpOworCisJYXZnID0gKHUxNil0b3RhbDsKKworCXJldHVybiBhdmc7Cit9CisKK3N0YXRpYyB1MTYgcmVhZF9tZ3R2KHN0cnVjdCBpcHNfZHJpdmVyICppcHMpCit7CisJdTE2IHJldDsKKwl1NjQgc2xvcGUsIG9mZnNldDsKKwl1NjQgdmFsOworCisJdmFsID0gdGhtX3JlYWRxKFRITV9NR1RWKTsKKwl2YWwgPSAodmFsICYgVFZfTUFTSykgPj4gVFZfU0hJRlQ7CisKKwlzbG9wZSA9IG9mZnNldCA9IHRobV9yZWFkdyhUSE1fTUdUQSk7CisJc2xvcGUgPSAoc2xvcGUgJiBNR1RBX1NMT1BFX01BU0spID4+IE1HVEFfU0xPUEVfU0hJRlQ7CisJb2Zmc2V0ID0gb2Zmc2V0ICYgTUdUQV9PRkZTRVRfTUFTSzsKKworCXJldCA9ICgodmFsICogc2xvcGUgKyAweDQwKSA+PiA3KSArIG9mZnNldDsKKworCXJldHVybiAwOyAvKiBNQ0ggdGVtcCByZXBvcnRpbmcgYnVnZ3kgKi8KK30KKworc3RhdGljIHUxNiByZWFkX3B0dihzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCXUxNiB2YWwsIHNsb3BlLCBvZmZzZXQ7CisKKwlzbG9wZSA9IChpcHMtPnB0YV92YWwgJiBQVEFfU0xPUEVfTUFTSykgPj4gUFRBX1NMT1BFX1NISUZUOworCW9mZnNldCA9IGlwcy0+cHRhX3ZhbCAmIFBUQV9PRkZTRVRfTUFTSzsKKworCXZhbCA9IHRobV9yZWFkdyhUSE1fUFRWKSAmIFBUVl9NQVNLOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHUxNiByZWFkX2N0dihzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzLCBpbnQgY3B1KQoreworCWludCByZWcgPSBjcHUgPyBUSE1fQ1RWMiA6IFRITV9DVFYxOworCXUxNiB2YWw7CisKKwl2YWwgPSB0aG1fcmVhZHcocmVnKTsKKwlpZiAoISh2YWwgJiBDVFZfVEVNUF9FUlJPUikpCisJCXZhbCA9ICh2YWwpID4+IDY7IC8qIGRpc2NhcmQgZnJhY3Rpb25hbCBjb21wb25lbnQgKi8KKwllbHNlCisJCXZhbCA9IDA7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTMyIGdldF9jcHVfcG93ZXIoc3RydWN0IGlwc19kcml2ZXIgKmlwcywgdTMyICpsYXN0LCBpbnQgcGVyaW9kKQoreworCXUzMiB2YWw7CisJdTMyIHJldDsKKworCS8qCisJICogQ0VDIGlzIGluIGpvdWxlcy82NTUzNS4gIFRha2UgZGlmZmVyZW5jZSBvdmVyIHRpbWUgdG8KKwkgKiBnZXQgd2F0dHMuCisJICovCisJdmFsID0gdGhtX3JlYWRsKFRITV9DRUMpOworCisJLyogcGVyaW9kIGlzIGluIG1zIGFuZCB3ZSB3YW50IG1XICovCisJcmV0ID0gKCgodmFsIC0gKmxhc3QpICogMTAwMCkgLyBwZXJpb2QpOworCXJldCA9IChyZXQgKiAxMDAwKSAvIDY1NTM1OworCSpsYXN0ID0gdmFsOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHUxNiB0ZW1wX2RlY2F5X2ZhY3RvciA9IDI7CitzdGF0aWMgdTE2IHVwZGF0ZV9hdmVyYWdlX3RlbXAodTE2IGF2ZywgdTE2IHZhbCkKK3sKKwl1MTYgcmV0OworCisJLyogTXVsdGlwbHkgYnkgMTAwIGZvciBleHRyYSBwcmVjaXNpb24gKi8KKwlyZXQgPSAodmFsICogMTAwIC8gdGVtcF9kZWNheV9mYWN0b3IpICsKKwkJKCgodGVtcF9kZWNheV9mYWN0b3IgLSAxKSAqIGF2ZykgLyB0ZW1wX2RlY2F5X2ZhY3Rvcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHUxNiBwb3dlcl9kZWNheV9mYWN0b3IgPSAyOworc3RhdGljIHUxNiB1cGRhdGVfYXZlcmFnZV9wb3dlcih1MzIgYXZnLCB1MzIgdmFsKQoreworCXUzMiByZXQ7CisKKwlyZXQgPSAodmFsIC8gcG93ZXJfZGVjYXlfZmFjdG9yKSArCisJCSgoKHBvd2VyX2RlY2F5X2ZhY3RvciAtIDEpICogYXZnKSAvIHBvd2VyX2RlY2F5X2ZhY3Rvcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGNhbGNfYXZnX3Bvd2VyKHN0cnVjdCBpcHNfZHJpdmVyICppcHMsIHUzMiAqYXJyYXkpCit7CisJdTY0IHRvdGFsID0gMDsKKwl1MzIgYXZnOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElQU19TQU1QTEVfQ09VTlQ7IGkrKykKKwkJdG90YWwgKz0gYXJyYXlbaV07CisKKwlkb19kaXYodG90YWwsIElQU19TQU1QTEVfQ09VTlQpOworCWF2ZyA9ICh1MzIpdG90YWw7CisKKwlyZXR1cm4gYXZnOworfQorCitzdGF0aWMgdm9pZCBtb25pdG9yX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJd2FrZV91cF9wcm9jZXNzKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKilhcmcpOworfQorCisvKioKKyAqIGlwc19tb25pdG9yIC0gdGVtcC9wb3dlciBtb25pdG9yaW5nIHRocmVhZAorICogQGRhdGE6IGlwcyBkcml2ZXIgc3RydWN0dXJlCisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgdGhlIElQUyBkcml2ZXIuICBJdCBtb25pdG9ycyBwb3dlciBhbmQKKyAqIHRlbXB1cmF0dXJlIGluIHRoZSBNQ1AgYW5kIGFkanVzdHMgQ1BVIGFuZCBHUFUgcG93ZXIgY2xhbXMgYWNjb3JkaW5nbHkuCisgKgorICogV2Uga2VlcCBhIDVzIG1vdmluZyBhdmVyYWdlIG9mIHBvd2VyIGNvbnN1bXB0aW9uIGFuZCB0ZW1wdXJhdHVyZS4gIFVzaW5nCisgKiB0aGF0IGRhdGEsIGFsb25nIHdpdGggQ1BVIHZzIEdQVSBwcmVmZXJlbmNlLCB3ZSBhZGp1c3QgdGhlIHBvd2VyIGNsYW1wcworICogdXAgb3IgZG93bi4KKyAqLworc3RhdGljIGludCBpcHNfbW9uaXRvcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcHNfZHJpdmVyICppcHMgPSBkYXRhOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXVuc2lnbmVkIGxvbmcgc2Vxbm9fdGltZXN0YW1wLCBleHBpcmUsIGxhc3RfbXNlY3MsIGxhc3Rfc2FtcGxlX3BlcmlvZDsKKwlpbnQgaTsKKwl1MzIgKmNwdV9zYW1wbGVzLCAqbWNocF9zYW1wbGVzLCBvbGRfY3B1X3Bvd2VyOworCXUxNiAqbWNwX3NhbXBsZXMsICpjdHYxX3NhbXBsZXMsICpjdHYyX3NhbXBsZXMsICptY2hfc2FtcGxlczsKKwl1OCBjdXJfc2Vxbm8sIGxhc3Rfc2Vxbm87CisKKwltY3Bfc2FtcGxlcyA9IGt6YWxsb2Moc2l6ZW9mKHUxNikgKiBJUFNfU0FNUExFX0NPVU5ULCBHRlBfS0VSTkVMKTsKKwljdHYxX3NhbXBsZXMgPSBremFsbG9jKHNpemVvZih1MTYpICogSVBTX1NBTVBMRV9DT1VOVCwgR0ZQX0tFUk5FTCk7CisJY3R2Ml9zYW1wbGVzID0ga3phbGxvYyhzaXplb2YodTE2KSAqIElQU19TQU1QTEVfQ09VTlQsIEdGUF9LRVJORUwpOworCW1jaF9zYW1wbGVzID0ga3phbGxvYyhzaXplb2YodTE2KSAqIElQU19TQU1QTEVfQ09VTlQsIEdGUF9LRVJORUwpOworCWNwdV9zYW1wbGVzID0ga3phbGxvYyhzaXplb2YodTMyKSAqIElQU19TQU1QTEVfQ09VTlQsIEdGUF9LRVJORUwpOworCW1jaHBfc2FtcGxlcyA9IGt6YWxsb2Moc2l6ZW9mKHUzMikgKiBJUFNfU0FNUExFX0NPVU5ULCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jcF9zYW1wbGVzIHx8ICFjdHYxX3NhbXBsZXMgfHwgIWN0djJfc2FtcGxlcyB8fCAhbWNoX3NhbXBsZXMgfHwKKwkJCSFjcHVfc2FtcGxlcyB8fCAhbWNocF9zYW1wbGVzKSB7CisJCWRldl9lcnIoJmlwcy0+ZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIHNhbXBsZSBhcnJheSwgaXBzIGRpc2FibGVkXG4iKTsKKwkJa2ZyZWUobWNwX3NhbXBsZXMpOworCQlrZnJlZShjdHYxX3NhbXBsZXMpOworCQlrZnJlZShjdHYyX3NhbXBsZXMpOworCQlrZnJlZShtY2hfc2FtcGxlcyk7CisJCWtmcmVlKGNwdV9zYW1wbGVzKTsKKwkJa2ZyZWUobWNocF9zYW1wbGVzKTsKKwkJa3RocmVhZF9zdG9wKGlwcy0+YWRqdXN0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbGFzdF9zZXFubyA9ICh0aG1fcmVhZGwoVEhNX0lUVikgJiBJVFZfTUVfU0VRTk9fTUFTSykgPj4KKwkJSVRWX01FX1NFUU5PX1NISUZUOworCXNlcW5vX3RpbWVzdGFtcCA9IGdldF9qaWZmaWVzXzY0KCk7CisKKwlvbGRfY3B1X3Bvd2VyID0gdGhtX3JlYWRsKFRITV9DRUMpIC8gNjU1MzU7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoSVBTX1NBTVBMRV9QRVJJT0QpKTsKKworCS8qIENvbGxlY3QgYW4gaW5pdGlhbCBhdmVyYWdlICovCisJZm9yIChpID0gMDsgaSA8IElQU19TQU1QTEVfQ09VTlQ7IGkrKykgeworCQl1MzIgbWNocCwgY3B1X3Bvd2VyOworCQl1MTYgdmFsOworCisJCW1jcF9zYW1wbGVzW2ldID0gcmVhZF9wdHYoaXBzKTsKKworCQl2YWwgPSByZWFkX2N0dihpcHMsIDApOworCQljdHYxX3NhbXBsZXNbaV0gPSB2YWw7CisKKwkJdmFsID0gcmVhZF9jdHYoaXBzLCAxKTsKKwkJY3R2Ml9zYW1wbGVzW2ldID0gdmFsOworCisJCXZhbCA9IHJlYWRfbWd0dihpcHMpOworCQltY2hfc2FtcGxlc1tpXSA9IHZhbDsKKworCQljcHVfcG93ZXIgPSBnZXRfY3B1X3Bvd2VyKGlwcywgJm9sZF9jcHVfcG93ZXIsCisJCQkJCSAgSVBTX1NBTVBMRV9QRVJJT0QpOworCQljcHVfc2FtcGxlc1tpXSA9IGNwdV9wb3dlcjsKKworCQlpZiAoaXBzLT5yZWFkX21jaF92YWwpIHsKKwkJCW1jaHAgPSBpcHMtPnJlYWRfbWNoX3ZhbCgpOworCQkJbWNocF9zYW1wbGVzW2ldID0gbWNocDsKKwkJfQorCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKElQU19TQU1QTEVfUEVSSU9EKSk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwl9CisKKwlpcHMtPm1jcF9hdmdfdGVtcCA9IGNhbGNfYXZnX3RlbXAoaXBzLCBtY3Bfc2FtcGxlcyk7CisJaXBzLT5jdHYxX2F2Z190ZW1wID0gY2FsY19hdmdfdGVtcChpcHMsIGN0djFfc2FtcGxlcyk7CisJaXBzLT5jdHYyX2F2Z190ZW1wID0gY2FsY19hdmdfdGVtcChpcHMsIGN0djJfc2FtcGxlcyk7CisJaXBzLT5tY2hfYXZnX3RlbXAgPSBjYWxjX2F2Z190ZW1wKGlwcywgbWNoX3NhbXBsZXMpOworCWlwcy0+Y3B1X2F2Z19wb3dlciA9IGNhbGNfYXZnX3Bvd2VyKGlwcywgY3B1X3NhbXBsZXMpOworCWlwcy0+bWNoX2F2Z19wb3dlciA9IGNhbGNfYXZnX3Bvd2VyKGlwcywgbWNocF9zYW1wbGVzKTsKKwlrZnJlZShtY3Bfc2FtcGxlcyk7CisJa2ZyZWUoY3R2MV9zYW1wbGVzKTsKKwlrZnJlZShjdHYyX3NhbXBsZXMpOworCWtmcmVlKG1jaF9zYW1wbGVzKTsKKwlrZnJlZShjcHVfc2FtcGxlcyk7CisJa2ZyZWUobWNocF9zYW1wbGVzKTsKKworCS8qIFN0YXJ0IHRoZSBhZGp1c3RtZW50IHRocmVhZCBub3cgdGhhdCB3ZSBoYXZlIGRhdGEgKi8KKwl3YWtlX3VwX3Byb2Nlc3MoaXBzLT5hZGp1c3QpOworCisJLyoKKwkgKiBPaywgbm93IHdlIGhhdmUgYW4gaW5pdGlhbCBhdmcuICBGcm9tIGhlcmUgb24gb3V0LCB3ZSB0cmFjayB0aGUKKwkgKiBydW5uaW5nIGF2ZyB1c2luZyBhIGRlY2F5aW5nIGF2ZXJhZ2UgY2FsY3VsYXRpb24uICBUaGlzIGFsbG93cworCSAqIHVzIHRvIHJlZHVjZSB0aGUgc2FtcGxlIGZyZXF1ZW5jeSBpZiB0aGUgQ1BVIGFuZCBHUFUgYXJlIGlkbGUuCisJICovCisJb2xkX2NwdV9wb3dlciA9IHRobV9yZWFkbChUSE1fQ0VDKTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhJUFNfU0FNUExFX1BFUklPRCkpOworCWxhc3Rfc2FtcGxlX3BlcmlvZCA9IElQU19TQU1QTEVfUEVSSU9EOworCisJc2V0dXBfZGVmZXJyYWJsZV90aW1lcl9vbl9zdGFjaygmdGltZXIsIG1vbml0b3JfdGltZW91dCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7CisJZG8geworCQl1MzIgY3B1X3ZhbCwgbWNoX3ZhbDsKKwkJdTE2IHZhbDsKKworCQkvKiBNQ1AgaXRzZWxmICovCisJCXZhbCA9IHJlYWRfcHR2KGlwcyk7CisJCWlwcy0+bWNwX2F2Z190ZW1wID0gdXBkYXRlX2F2ZXJhZ2VfdGVtcChpcHMtPm1jcF9hdmdfdGVtcCwgdmFsKTsKKworCQkvKiBQcm9jZXNzb3IgMCAqLworCQl2YWwgPSByZWFkX2N0dihpcHMsIDApOworCQlpcHMtPmN0djFfYXZnX3RlbXAgPQorCQkJdXBkYXRlX2F2ZXJhZ2VfdGVtcChpcHMtPmN0djFfYXZnX3RlbXAsIHZhbCk7CisJCS8qIFBvd2VyICovCisJCWNwdV92YWwgPSBnZXRfY3B1X3Bvd2VyKGlwcywgJm9sZF9jcHVfcG93ZXIsCisJCQkJCWxhc3Rfc2FtcGxlX3BlcmlvZCk7CisJCWlwcy0+Y3B1X2F2Z19wb3dlciA9CisJCQl1cGRhdGVfYXZlcmFnZV9wb3dlcihpcHMtPmNwdV9hdmdfcG93ZXIsIGNwdV92YWwpOworCisJCWlmIChpcHMtPnNlY29uZF9jcHUpIHsKKwkJCS8qIFByb2Nlc3NvciAxICovCisJCQl2YWwgPSByZWFkX2N0dihpcHMsIDEpOworCQkJaXBzLT5jdHYyX2F2Z190ZW1wID0KKwkJCQl1cGRhdGVfYXZlcmFnZV90ZW1wKGlwcy0+Y3R2Ml9hdmdfdGVtcCwgdmFsKTsKKwkJfQorCisJCS8qIE1DSCAqLworCQl2YWwgPSByZWFkX21ndHYoaXBzKTsKKwkJaXBzLT5tY2hfYXZnX3RlbXAgPSB1cGRhdGVfYXZlcmFnZV90ZW1wKGlwcy0+bWNoX2F2Z190ZW1wLCB2YWwpOworCQkvKiBQb3dlciAqLworCQlpZiAoaXBzLT5yZWFkX21jaF92YWwpIHsKKwkJCW1jaF92YWwgPSBpcHMtPnJlYWRfbWNoX3ZhbCgpOworCQkJaXBzLT5tY2hfYXZnX3Bvd2VyID0KKwkJCQl1cGRhdGVfYXZlcmFnZV9wb3dlcihpcHMtPm1jaF9hdmdfcG93ZXIsCisJCQkJCQkgICAgIG1jaF92YWwpOworCQl9CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIE1FIGlzIHVwZGF0aW5nIHRoZXJtYWwgcmVncy4KKwkJICogTm90ZToKKwkJICogSWYgaXQncyBiZWVuIG1vcmUgdGhhbiBhIHNlY29uZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUsCisJCSAqIHRoZSBNRSBpcyBwcm9iYWJseSBodW5nLgorCQkgKi8KKwkJY3VyX3NlcW5vID0gKHRobV9yZWFkbChUSE1fSVRWKSAmIElUVl9NRV9TRVFOT19NQVNLKSA+PgorCQkJSVRWX01FX1NFUU5PX1NISUZUOworCQlpZiAoY3VyX3NlcW5vID09IGxhc3Rfc2Vxbm8gJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgc2Vxbm9fdGltZXN0YW1wICsgSFopKSB7CisJCQlkZXZfd2FybigmaXBzLT5kZXYtPmRldiwgIk1FIGZhaWxlZCB0byB1cGRhdGUgZm9yIG1vcmUgdGhhbiAxcywgbGlrZWx5IGh1bmdcbiIpOworCQl9IGVsc2UgeworCQkJc2Vxbm9fdGltZXN0YW1wID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwkJCWxhc3Rfc2Vxbm8gPSBjdXJfc2Vxbm87CisJCX0KKworCQlsYXN0X21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKKwkJZXhwaXJlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSVBTX1NBTVBMRV9QRVJJT0QpOworCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQltb2RfdGltZXIoJnRpbWVyLCBleHBpcmUpOworCQlzY2hlZHVsZSgpOworCisJCS8qIENhbGN1bGF0ZSBhY3R1YWwgc2FtcGxlIHBlcmlvZCBmb3IgcG93ZXIgYXZlcmFnaW5nICovCisJCWxhc3Rfc2FtcGxlX3BlcmlvZCA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcykgLSBsYXN0X21zZWNzOworCQlpZiAoIWxhc3Rfc2FtcGxlX3BlcmlvZCkKKwkJCWxhc3Rfc2FtcGxlX3BlcmlvZCA9IDE7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisKKwlkZWxfdGltZXJfc3luYygmdGltZXIpOworCWRlc3Ryb3lfdGltZXJfb25fc3RhY2soJnRpbWVyKTsKKworCWRldl9kYmcoJmlwcy0+ZGV2LT5kZXYsICJpcHMtbW9uaXRvciB0aHJlYWQgc3RvcHBlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKyNkZWZpbmUgVEhNX0RVTVBXKHJlZykgXAorCXsgXAorCXUxNiB2YWwgPSB0aG1fcmVhZHcocmVnKTsgXAorCWRldl9kYmcoJmlwcy0+ZGV2LT5kZXYsICNyZWcgIjogMHglMDR4XG4iLCB2YWwpOyBcCisJfQorI2RlZmluZSBUSE1fRFVNUEwocmVnKSBcCisJeyBcCisJdTMyIHZhbCA9IHRobV9yZWFkbChyZWcpOyBcCisJZGV2X2RiZygmaXBzLT5kZXYtPmRldiwgI3JlZyAiOiAweCUwOHhcbiIsIHZhbCk7IFwKKwl9CisjZGVmaW5lIFRITV9EVU1QUShyZWcpIFwKKwl7IFwKKwl1NjQgdmFsID0gdGhtX3JlYWRxKHJlZyk7IFwKKwlkZXZfZGJnKCZpcHMtPmRldi0+ZGV2LCAjcmVnICI6IDB4JTAxNnhcbiIsIHZhbCk7IFwKKwl9CisKK3N0YXRpYyB2b2lkIGR1bXBfdGhlcm1hbF9pbmZvKHN0cnVjdCBpcHNfZHJpdmVyICppcHMpCit7CisJdTE2IHB0bDsKKworCXB0bCA9IHRobV9yZWFkdyhUSE1fUFRMKTsKKwlkZXZfZGJnKCZpcHMtPmRldi0+ZGV2LCAiUHJvY2Vzc29yIHRlbXAgbGltaXQ6ICVkXG4iLCBwdGwpOworCisJVEhNX0RVTVBXKFRITV9DVEEpOworCVRITV9EVU1QVyhUSE1fVFJDKTsKKwlUSE1fRFVNUFcoVEhNX0NUVjEpOworCVRITV9EVU1QTChUSE1fU1RTKTsKKwlUSE1fRFVNUFcoVEhNX1BUVik7CisJVEhNX0RVTVBRKFRITV9NR1RWKTsKK30KKyNlbmRpZgorCisvKioKKyAqIGlwc19pcnFfaGFuZGxlciAtIGhhbmRsZSB0ZW1wZXJhdHVyZSB0cmlnZ2VycyBhbmQgb3RoZXIgSVBTIGV2ZW50cworICogQGlycTogaXJxIG51bWJlcgorICogQGFyZzogdW51c2VkCisgKgorICogSGFuZGxlIHRlbXBlcmF0dXJlIGxpbWl0IHRyaWdnZXIgZXZlbnRzLCBnZW5lcmFsbHkgYnkgbG93ZXJpbmcgdGhlIGNsYW1wcy4KKyAqIElmIHdlJ3JlIGF0IGEgY3JpdGljYWwgbGltaXQsIHdlIGNsYW1wIGJhY2sgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZQorICogdG8gcHJldmVudCBlbWVyZ2VuY3kgc2h1dGRvd24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpcHNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBpcHNfZHJpdmVyICppcHMgPSBhcmc7CisJdTggdHNlcyA9IHRobV9yZWFkYihUSE1fVFNFUyk7CisJdTggdGVzID0gdGhtX3JlYWRiKFRITV9URVMpOworCisJaWYgKCF0c2VzICYmICF0ZXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWRldl9pbmZvKCZpcHMtPmRldi0+ZGV2LCAiVFNFUzogMHglMDJ4XG4iLCB0c2VzKTsKKwlkZXZfaW5mbygmaXBzLT5kZXYtPmRldiwgIlRFUzogMHglMDJ4XG4iLCB0ZXMpOworCisJLyogU1RTIHVwZGF0ZSBmcm9tIEVDPyAqLworCWlmICh0ZXMgJiAxKSB7CisJCXUzMiBzdHMsIHRjMTsKKworCQlzdHMgPSB0aG1fcmVhZGwoVEhNX1NUUyk7CisJCXRjMSA9IHRobV9yZWFkbChUSE1fVEMxKTsKKworCQlpZiAoc3RzICYgU1RTX05WVikgeworCQkJc3Bpbl9sb2NrKCZpcHMtPnR1cmJvX3N0YXR1c19sb2NrKTsKKwkJCWlwcy0+Y29yZV9wb3dlcl9saW1pdCA9IChzdHMgJiBTVFNfUENQTF9NQVNLKSA+PgorCQkJCVNUU19QQ1BMX1NISUZUOworCQkJaXBzLT5tY2hfcG93ZXJfbGltaXQgPSAoc3RzICYgU1RTX0dQTF9NQVNLKSA+PgorCQkJCVNUU19HUExfU0hJRlQ7CisJCQkvKiBpZ25vcmUgRUMgQ1BVIHZzIEdQVSBwcmVmICovCisJCQlpcHMtPmNwdV90dXJib19lbmFibGVkID0gIShzdHMgJiBTVFNfUENURF9ESVMpOworCQkJaXBzLT5ncHVfdHVyYm9fZW5hYmxlZCA9ICEoc3RzICYgU1RTX0dURF9ESVMpOworCQkJaXBzLT5tY3BfdGVtcF9saW1pdCA9IChzdHMgJiBTVFNfUFRMX01BU0spID4+CisJCQkJU1RTX1BUTF9TSElGVDsKKwkJCWlwcy0+bWNwX3Bvd2VyX2xpbWl0ID0gKHRjMSAmIFNUU19QUExfTUFTSykgPj4KKwkJCQlTVFNfUFBMX1NISUZUOworCQkJc3Bpbl91bmxvY2soJmlwcy0+dHVyYm9fc3RhdHVzX2xvY2spOworCisJCQl0aG1fd3JpdGViKFRITV9TRUMsIFNFQ19BQ0spOworCQl9CisJCXRobV93cml0ZWIoVEhNX1RFUywgdGVzKTsKKwl9CisKKwkvKiBUaGVybWFsIHRyaXAgKi8KKwlpZiAodHNlcykgeworCQlkZXZfd2FybigmaXBzLT5kZXYtPmRldiwKKwkJCSAidGhlcm1hbCB0cmlwIG9jY3VycmVkLCB0c2VzOiAweCUwNHhcbiIsIHRzZXMpOworCQl0aG1fd3JpdGViKFRITV9UU0VTLCB0c2VzKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZm5kZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgdm9pZCBpcHNfZGVidWdmc19pbml0KHN0cnVjdCBpcHNfZHJpdmVyICppcHMpIHsgcmV0dXJuOyB9CitzdGF0aWMgdm9pZCBpcHNfZGVidWdmc19jbGVhbnVwKHN0cnVjdCBpcHNfZHJpdmVyICppcHMpIHsgcmV0dXJuOyB9CisjZWxzZQorCisvKiBFeHBvc2UgY3VycmVudCBzdGF0ZSBhbmQgbGltaXRzIGluIGRlYnVnZnMgaWYgcG9zc2libGUgKi8KKworc3RydWN0IGlwc19kZWJ1Z2ZzX25vZGUgeworCXN0cnVjdCBpcHNfZHJpdmVyICppcHM7CisJY2hhciAqbmFtZTsKKwlpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpOworfTsKKworc3RhdGljIGludCBzaG93X2NwdV90ZW1wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzID0gbS0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYobSwgIiVkLiUwMmRcbiIsIGlwcy0+Y3R2MV9hdmdfdGVtcCAvIDEwMCwKKwkJICAgaXBzLT5jdHYxX2F2Z190ZW1wICUgMTAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfY3B1X3Bvd2VyKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzID0gbS0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYobSwgIiVkbVdcbiIsIGlwcy0+Y3B1X2F2Z19wb3dlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X2NwdV9jbGFtcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCit7CisJdTY0IHR1cmJvX292ZXJyaWRlOworCWludCB0ZHAsIHRkYzsKKworCXJkbXNybChUVVJCT19QT1dFUl9DVVJSRU5UX0xJTUlULCB0dXJib19vdmVycmlkZSk7CisKKwl0ZHAgPSAoaW50KSh0dXJib19vdmVycmlkZSAmIFRVUkJPX1REUF9NQVNLKTsKKwl0ZGMgPSAoaW50KSgodHVyYm9fb3ZlcnJpZGUgJiBUVVJCT19URENfTUFTSykgPj4gVFVSQk9fVERDX1NISUZUKTsKKworCS8qIENvbnZlcnQgdG8gLjFXL0EgdW5pdHMgKi8KKwl0ZHAgPSB0ZHAgKiAxMCAvIDg7CisJdGRjID0gdGRjICogMTAgLyA4OworCisJLyogV2F0dHMgQW1wZXJlcyAqLworCXNlcV9wcmludGYobSwgIiVkLiVkVyAlZC4lZEFcbiIsIHRkcCAvIDEwLCB0ZHAgJSAxMCwKKwkJICAgdGRjIC8gMTAsIHRkYyAlIDEwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfbWNoX3RlbXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcHNfZHJpdmVyICppcHMgPSBtLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihtLCAiJWQuJTAyZFxuIiwgaXBzLT5tY2hfYXZnX3RlbXAgLyAxMDAsCisJCSAgIGlwcy0+bWNoX2F2Z190ZW1wICUgMTAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfbWNoX3Bvd2VyKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzID0gbS0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYobSwgIiVkbVdcbiIsIGlwcy0+bWNoX2F2Z19wb3dlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcHNfZGVidWdmc19ub2RlIGlwc19kZWJ1Z19maWxlc1tdID0geworCXsgTlVMTCwgImNwdV90ZW1wIiwgc2hvd19jcHVfdGVtcCB9LAorCXsgTlVMTCwgImNwdV9wb3dlciIsIHNob3dfY3B1X3Bvd2VyIH0sCisJeyBOVUxMLCAiY3B1X2NsYW1wIiwgc2hvd19jcHVfY2xhbXAgfSwKKwl7IE5VTEwsICJtY2hfdGVtcCIsIHNob3dfbWNoX3RlbXAgfSwKKwl7IE5VTEwsICJtY2hfcG93ZXIiLCBzaG93X21jaF9wb3dlciB9LAorfTsKKworc3RhdGljIGludCBpcHNfZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpcHNfZGVidWdmc19ub2RlICpub2RlID0gaW5vZGUtPmlfcHJpdmF0ZTsKKworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBub2RlLT5zaG93LCBub2RlLT5pcHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcHNfZGVidWdmc19vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBpcHNfZGVidWdmc19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgaXBzX2RlYnVnZnNfY2xlYW51cChzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCWlmIChpcHMtPmRlYnVnX3Jvb3QpCisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpcHMtPmRlYnVnX3Jvb3QpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaXBzX2RlYnVnZnNfaW5pdChzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzKQoreworCWludCBpOworCisJaXBzLT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJpcHMiLCBOVUxMKTsKKwlpZiAoIWlwcy0+ZGVidWdfcm9vdCkgeworCQlkZXZfZXJyKCZpcHMtPmRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBlbnRyaWVzOiAlbGRcbiIsCisJCQlQVFJfRVJSKGlwcy0+ZGVidWdfcm9vdCkpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXBzX2RlYnVnX2ZpbGVzKTsgaSsrKSB7CisJCXN0cnVjdCBkZW50cnkgKmVudDsKKwkJc3RydWN0IGlwc19kZWJ1Z2ZzX25vZGUgKm5vZGUgPSAmaXBzX2RlYnVnX2ZpbGVzW2ldOworCisJCW5vZGUtPmlwcyA9IGlwczsKKwkJZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShub2RlLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkJICBpcHMtPmRlYnVnX3Jvb3QsIG5vZGUsCisJCQkJCSAgJmlwc19kZWJ1Z2ZzX29wcyk7CisJCWlmICghZW50KSB7CisJCQlkZXZfZXJyKCZpcHMtPmRldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnIGZpbGU6ICVsZFxuIiwKKwkJCQlQVFJfRVJSKGVudCkpOworCQkJZ290byBlcnJfY2xlYW51cDsKKwkJfQorCX0KKworCXJldHVybjsKKworZXJyX2NsZWFudXA6CisJaXBzX2RlYnVnZnNfY2xlYW51cChpcHMpOworCXJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KKworLyoqCisgKiBpcHNfZGV0ZWN0X2NwdSAtIGRldGVjdCB3aGV0aGVyIENQVSBzdXBwb3J0cyBJUFMKKyAqCisgKiBXYWxrIG91ciBsaXN0IGFuZCBzZWUgaWYgd2UncmUgb24gYSBzdXBwb3J0ZWQgQ1BVLiAgSWYgd2UgZmluZCBvbmUsCisgKiByZXR1cm4gdGhlIGxpbWl0cyBmb3IgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBzX21jcF9saW1pdHMgKmlwc19kZXRlY3RfY3B1KHN0cnVjdCBpcHNfZHJpdmVyICppcHMpCit7CisJdTY0IHR1cmJvX3Bvd2VyLCBtaXNjX2VuOworCXN0cnVjdCBpcHNfbWNwX2xpbWl0cyAqbGltaXRzID0gTlVMTDsKKwl1MTYgdGRwOworCisJaWYgKCEoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiAmJiBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9PSAzNykpIHsKKwkJZGV2X2luZm8oJmlwcy0+ZGV2LT5kZXYsICJOb24tSVBTIENQVSBkZXRlY3RlZC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZG1zcmwoSUEzMl9NSVNDX0VOQUJMRSwgbWlzY19lbik7CisJLyoKKwkgKiBJZiB0aGUgdHVyYm8gZW5hYmxlIGJpdCBpc24ndCBzZXQsIHdlIHNob3VsZG4ndCB0cnkgdG8gZW5hYmxlL2Rpc2FibGUKKwkgKiB0dXJibyBtYW51YWxseSBvciB3ZSdsbCBnZXQgYW4gaWxsZWdhbCBNU1IgYWNjZXNzLCBldmVuIHRob3VnaAorCSAqIHR1cmJvIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlLgorCSAqLworCWlmICghKG1pc2NfZW4gJiBJQTMyX01JU0NfVFVSQk9fRU4pKQorCQk7IC8qIGFkZCB0dXJibyBNU1Igd3JpdGUgYWxsb3dlZCBmbGFnIGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKHN0cnN0cihib290X2NwdV9kYXRhLng4Nl9tb2RlbF9pZCwgIkNQVSAgICAgICBNIikpCisJCWxpbWl0cyA9ICZpcHNfc3ZfbGltaXRzOworCWVsc2UgaWYgKHN0cnN0cihib290X2NwdV9kYXRhLng4Nl9tb2RlbF9pZCwgIkNQVSAgICAgICBMIikpCisJCWxpbWl0cyA9ICZpcHNfbHZfbGltaXRzOworCWVsc2UgaWYgKHN0cnN0cihib290X2NwdV9kYXRhLng4Nl9tb2RlbF9pZCwgIkNQVSAgICAgICBVIikpCisJCWxpbWl0cyA9ICZpcHNfdWx2X2xpbWl0czsKKwllbHNlCisJCWRldl9pbmZvKCZpcHMtPmRldi0+ZGV2LCAiTm8gQ1BVSUQgbWF0Y2ggZm91bmQuXG4iKTsKKworCXJkbXNybChUVVJCT19QT1dFUl9DVVJSRU5UX0xJTUlULCB0dXJib19wb3dlcik7CisJdGRwID0gdHVyYm9fcG93ZXIgJiBUVVJCT19URFBfTUFTSzsKKworCS8qIFNhbml0eSBjaGVjayBURFAgYWdhaW5zdCBDUFUgKi8KKwlpZiAobGltaXRzLT5tY3BfcG93ZXJfbGltaXQgIT0gKHRkcCAvIDgpICogMTAwMCkgeworCQlkZXZfd2FybigmaXBzLT5kZXYtPmRldiwgIldhcm5pbmc6IENQVSBURFAgZG9lc24ndCBtYXRjaCBleHBlY3RlZCB2YWx1ZSAoZm91bmQgJWQsIGV4cGVjdGVkICVkKVxuIiwKKwkJCSB0ZHAgLyA4LCBsaW1pdHMtPm1jcF9wb3dlcl9saW1pdCAvIDEwMDApOworCX0KKworb3V0OgorCXJldHVybiBsaW1pdHM7Cit9CisKKy8qKgorICogaXBzX2dldF9pOTE1X3N5bXMgLSB0cnkgdG8gZ2V0IEdQVSBjb250cm9sIG1ldGhvZHMgZnJvbSBpOTE1IGRyaXZlcgorICogQGlwczogSVBTIGRyaXZlcgorICoKKyAqIFRoZSBpOTE1IGRyaXZlciBleHBvcnRzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBhbGxvdyB0aGUgSVBTIGRyaXZlciB0bworICogbW9uaXRvciBhbmQgY29udHJvbCBncmFwaGljcyB0dXJibyBtb2RlLiAgSWYgd2UgY2FuIGZpbmQgdGhlbSwgd2UgY2FuCisgKiBlbmFibGUgZ3JhcGhpY3MgdHVyYm8sIG90aGVyd2lzZSB3ZSBtdXN0IGRpc2FibGUgaXQgdG8gYXZvaWQgZXhjZWVkaW5nCisgKiB0aGVybWFsIGFuZCBwb3dlciBsaW1pdHMgaW4gdGhlIE1DUC4KKyAqLworc3RhdGljIGJvb2wgaXBzX2dldF9pOTE1X3N5bXMoc3RydWN0IGlwc19kcml2ZXIgKmlwcykKK3sKKwlpcHMtPnJlYWRfbWNoX3ZhbCA9IHN5bWJvbF9nZXQoaTkxNV9yZWFkX21jaF92YWwpOworCWlmICghaXBzLT5yZWFkX21jaF92YWwpCisJCWdvdG8gb3V0X2VycjsKKwlpcHMtPmdwdV9yYWlzZSA9IHN5bWJvbF9nZXQoaTkxNV9ncHVfcmFpc2UpOworCWlmICghaXBzLT5ncHVfcmFpc2UpCisJCWdvdG8gb3V0X3B1dF9tY2g7CisJaXBzLT5ncHVfbG93ZXIgPSBzeW1ib2xfZ2V0KGk5MTVfZ3B1X2xvd2VyKTsKKwlpZiAoIWlwcy0+Z3B1X2xvd2VyKQorCQlnb3RvIG91dF9wdXRfcmFpc2U7CisJaXBzLT5ncHVfYnVzeSA9IHN5bWJvbF9nZXQoaTkxNV9ncHVfYnVzeSk7CisJaWYgKCFpcHMtPmdwdV9idXN5KQorCQlnb3RvIG91dF9wdXRfbG93ZXI7CisJaXBzLT5ncHVfdHVyYm9fZGlzYWJsZSA9IHN5bWJvbF9nZXQoaTkxNV9ncHVfdHVyYm9fZGlzYWJsZSk7CisJaWYgKCFpcHMtPmdwdV90dXJib19kaXNhYmxlKQorCQlnb3RvIG91dF9wdXRfYnVzeTsKKworCXJldHVybiB0cnVlOworCitvdXRfcHV0X2J1c3k6CisJc3ltYm9sX3B1dChpOTE1X2dwdV90dXJib19kaXNhYmxlKTsKK291dF9wdXRfbG93ZXI6CisJc3ltYm9sX3B1dChpOTE1X2dwdV9sb3dlcik7CitvdXRfcHV0X3JhaXNlOgorCXN5bWJvbF9wdXQoaTkxNV9ncHVfcmFpc2UpOworb3V0X3B1dF9tY2g6CisJc3ltYm9sX3B1dChpOTE1X3JlYWRfbWNoX3ZhbCk7CitvdXRfZXJyOgorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlwc19pZF90YWJsZSkgPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF9USEVSTUFMX1NFTlNPUiksIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXBzX2lkX3RhYmxlKTsKKworc3RhdGljIGludCBpcHNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXU2NCBwbGF0Zm9ybV9pbmZvOworCXN0cnVjdCBpcHNfZHJpdmVyICppcHM7CisJdTMyIGh0czsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgaHRzaGksIHRyYywgdHJjX3JlcXVpcmVkX21hc2s7CisJdTggdHNlOworCisJaXBzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwc19kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBpcHMpOworCWlwcy0+ZGV2ID0gZGV2OworCisJaXBzLT5saW1pdHMgPSBpcHNfZGV0ZWN0X2NwdShpcHMpOworCWlmICghaXBzLT5saW1pdHMpIHsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiSVBTIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBDUFVcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmaXBzLT50dXJib19zdGF0dXNfbG9jayk7CisKKwlpZiAoIXBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiVEJBUiBub3QgYXNzaWduZWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhkZXYsICJpcHMgdGhlcm1hbCBzZW5zb3IiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAidGhlcm1hbCByZXNvdXJjZSBidXN5LCBhYm9ydGluZ1xuIik7CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJaXBzLT5yZWdtYXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAorCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwlpZiAoIWlwcy0+cmVnbWFwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCB0aGVybWFsIHJlZ3MsIGFib3J0aW5nXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycm9yX3JlbGVhc2U7CisJfQorCisJdHNlID0gdGhtX3JlYWRiKFRITV9UU0UpOworCWlmICh0c2UgIT0gVFNFX0VOKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAidGhlcm1hbCBkZXZpY2Ugbm90IGVuYWJsZWQgKDB4JTAyeCksIGFib3J0aW5nXG4iLCB0c2UpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyb3JfdW5tYXA7CisJfQorCisJdHJjID0gdGhtX3JlYWR3KFRITV9UUkMpOworCXRyY19yZXF1aXJlZF9tYXNrID0gVFJDX0NPUkUxX0VOIHwgVFJDX0NPUkVfUFdSIHwgVFJDX01DSF9FTjsKKwlpZiAoKHRyYyAmIHRyY19yZXF1aXJlZF9tYXNrKSAhPSB0cmNfcmVxdWlyZWRfbWFzaykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgInRoZXJtYWwgcmVwb3J0aW5nIGZvciByZXF1aXJlZCBkZXZpY2VzIG5vdCBlbmFibGVkLCBhYm9ydGluZ1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnJvcl91bm1hcDsKKwl9CisKKwlpZiAodHJjICYgVFJDX0NPUkUyX0VOKQorCQlpcHMtPnNlY29uZF9jcHUgPSB0cnVlOworCisJdXBkYXRlX3R1cmJvX2xpbWl0cyhpcHMpOworCWRldl9kYmcoJmRldi0+ZGV2LCAibWF4IGNwdSBwb3dlciBjbGFtcDogJWRXXG4iLAorCQlpcHMtPm1jcF9wb3dlcl9saW1pdCAvIDEwKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIm1heCBjb3JlIHBvd2VyIGNsYW1wOiAlZFdcbiIsCisJCWlwcy0+Y29yZV9wb3dlcl9saW1pdCAvIDEwKTsKKwkvKiBCSU9TIG1heSB1cGRhdGUgbGltaXRzIGF0IHJ1bnRpbWUgKi8KKwlpZiAodGhtX3JlYWRsKFRITV9QU0MpICYgUFNQX1BCUlQpCisJCWlwcy0+cG9sbF90dXJib19zdGF0dXMgPSB0cnVlOworCisJaWYgKCFpcHNfZ2V0X2k5MTVfc3ltcyhpcHMpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpOTE1IHN5bWJvbHMsIGdyYXBoaWNzIHR1cmJvIGRpc2FibGVkXG4iKTsKKwkJaXBzLT5ncHVfdHVyYm9fZW5hYmxlZCA9IGZhbHNlOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiZ3JhcGhpY3MgdHVyYm8gZW5hYmxlZFxuIik7CisJCWlwcy0+Z3B1X3R1cmJvX2VuYWJsZWQgPSB0cnVlOworCX0KKworCS8qCisJICogQ2hlY2sgUExBVEZPUk1fSU5GTyBNU1IgdG8gbWFrZSBzdXJlIHRoaXMgY2hpcCBpcworCSAqIHR1cmJvIGNhcGFibGUuCisJICovCisJcmRtc3JsKFBMQVRGT1JNX0lORk8sIHBsYXRmb3JtX2luZm8pOworCWlmICghKHBsYXRmb3JtX2luZm8gJiBQTEFURk9STV9URFApKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAicGxhdGZvcm0gaW5kaWNhdGVzIFREUCBvdmVycmlkZSB1bmF2YWlsYWJsZSwgYWJvcnRpbmdcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX3VubWFwOworCX0KKworCS8qCisJICogSVJRIGhhbmRsZXIgZm9yIE1FIGludGVyYWN0aW9uCisJICogTm90ZTogZG9uJ3QgdXNlIE1TSSBoZXJlIGFzIHRoZSBQQ0ggaGFzIGJ1Z3MuCisJICovCisJcGNpX2Rpc2FibGVfbXNpKGRldik7CisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGlwc19pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsICJpcHMiLAorCQkJICBpcHMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJyZXF1ZXN0IGlycSBmYWlsZWQsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJvcl91bm1hcDsKKwl9CisKKwkvKiBFbmFibGUgYXV4LCBob3QgJiBjcml0aWNhbCBpbnRlcnJ1cHRzICovCisJdGhtX3dyaXRlYihUSE1fVFNQSUVOLCBUU1BJRU5fQVVYMl9MT0hJIHwgVFNQSUVOX0NSSVRfTE9ISSB8CisJCSAgIFRTUElFTl9IT1RfTE9ISSB8IFRTUElFTl9BVVhfTE9ISSk7CisJdGhtX3dyaXRlYihUSE1fVEVOLCBURU5fVVBEQVRFX0VOKTsKKworCS8qIENvbGxlY3QgYWRqdXN0bWVudCB2YWx1ZXMgKi8KKwlpcHMtPmN0YV92YWwgPSB0aG1fcmVhZHcoVEhNX0NUQSk7CisJaXBzLT5wdGFfdmFsID0gdGhtX3JlYWR3KFRITV9QVEEpOworCWlwcy0+bWd0YV92YWwgPSB0aG1fcmVhZHcoVEhNX01HVEEpOworCisJLyogU2F2ZSB0dXJibyBsaW1pdHMgJiByYXRpb3MgKi8KKwlyZG1zcmwoVFVSQk9fUE9XRVJfQ1VSUkVOVF9MSU1JVCwgaXBzLT5vcmlnX3R1cmJvX2xpbWl0KTsKKworCWlwc19lbmFibGVfY3B1X3R1cmJvKGlwcyk7CisJaXBzLT5jcHVfdHVyYm9fZW5hYmxlZCA9IHRydWU7CisKKwkvKiBTZXQgdXAgdGhlIHdvcmsgcXVldWUgYW5kIG1vbml0b3IvYWRqdXN0IHRocmVhZHMgKi8KKwlpcHMtPm1vbml0b3IgPSBrdGhyZWFkX3J1bihpcHNfbW9uaXRvciwgaXBzLCAiaXBzLW1vbml0b3IiKTsKKwlpZiAoSVNfRVJSKGlwcy0+bW9uaXRvcikpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGNyZWF0ZSB0aGVybWFsIG1vbml0b3IgdGhyZWFkLCBhYm9ydGluZ1xuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CisJfQorCisJaXBzLT5hZGp1c3QgPSBrdGhyZWFkX2NyZWF0ZShpcHNfYWRqdXN0LCBpcHMsICJpcHMtYWRqdXN0Iik7CisJaWYgKElTX0VSUihpcHMtPmFkanVzdCkpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGNyZWF0ZSB0aGVybWFsIGFkanVzdCB0aHJlYWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl90aHJlYWRfY2xlYW51cDsKKwl9CisKKwlodHMgPSAoaXBzLT5jb3JlX3Bvd2VyX2xpbWl0IDw8IEhUU19QQ1BMX1NISUZUKSB8CisJCShpcHMtPm1jcF90ZW1wX2xpbWl0IDw8IEhUU19QVExfU0hJRlQpIHwgSFRTX05WVjsKKwlodHNoaSA9IEhUUzJfUFJTVF9SVU5OSU5HIDw8IEhUUzJfUFJTVF9TSElGVDsKKworCXRobV93cml0ZXcoVEhNX0hUU0hJLCBodHNoaSk7CisJdGhtX3dyaXRlbChUSE1fSFRTLCBodHMpOworCisJaXBzX2RlYnVnZnNfaW5pdChpcHMpOworCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiSVBTIGRyaXZlciBpbml0aWFsaXplZCwgTUNQIHRlbXAgbGltaXQgJWRcbiIsCisJCSBpcHMtPm1jcF90ZW1wX2xpbWl0KTsKKwlyZXR1cm4gcmV0OworCitlcnJvcl90aHJlYWRfY2xlYW51cDoKKwlrdGhyZWFkX3N0b3AoaXBzLT5tb25pdG9yKTsKK2Vycm9yX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlwcy0+ZGV2LT5pcnEsIGlwcyk7CitlcnJvcl91bm1hcDoKKwlpb3VubWFwKGlwcy0+cmVnbWFwKTsKK2Vycm9yX3JlbGVhc2U6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworZXJyb3JfZnJlZToKKwlrZnJlZShpcHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlwc19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaXBzX2RyaXZlciAqaXBzID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJdTY0IHR1cmJvX292ZXJyaWRlOworCisJaWYgKCFpcHMpCisJCXJldHVybjsKKworCWlwc19kZWJ1Z2ZzX2NsZWFudXAoaXBzKTsKKworCS8qIFJlbGVhc2UgaTkxNSBkcml2ZXIgKi8KKwlpZiAoaXBzLT5yZWFkX21jaF92YWwpCisJCXN5bWJvbF9wdXQoaTkxNV9yZWFkX21jaF92YWwpOworCWlmIChpcHMtPmdwdV9yYWlzZSkKKwkJc3ltYm9sX3B1dChpOTE1X2dwdV9yYWlzZSk7CisJaWYgKGlwcy0+Z3B1X2xvd2VyKQorCQlzeW1ib2xfcHV0KGk5MTVfZ3B1X2xvd2VyKTsKKwlpZiAoaXBzLT5ncHVfYnVzeSkKKwkJc3ltYm9sX3B1dChpOTE1X2dwdV9idXN5KTsKKwlpZiAoaXBzLT5ncHVfdHVyYm9fZGlzYWJsZSkKKwkJc3ltYm9sX3B1dChpOTE1X2dwdV90dXJib19kaXNhYmxlKTsKKworCXJkbXNybChUVVJCT19QT1dFUl9DVVJSRU5UX0xJTUlULCB0dXJib19vdmVycmlkZSk7CisJdHVyYm9fb3ZlcnJpZGUgJj0gfihUVVJCT19URENfT1ZSX0VOIHwgVFVSQk9fVERQX09WUl9FTik7CisJd3Jtc3JsKFRVUkJPX1BPV0VSX0NVUlJFTlRfTElNSVQsIHR1cmJvX292ZXJyaWRlKTsKKwl3cm1zcmwoVFVSQk9fUE9XRVJfQ1VSUkVOVF9MSU1JVCwgaXBzLT5vcmlnX3R1cmJvX2xpbWl0KTsKKworCWZyZWVfaXJxKGlwcy0+ZGV2LT5pcnEsIGlwcyk7CisJaWYgKGlwcy0+YWRqdXN0KQorCQlrdGhyZWFkX3N0b3AoaXBzLT5hZGp1c3QpOworCWlmIChpcHMtPm1vbml0b3IpCisJCWt0aHJlYWRfc3RvcChpcHMtPm1vbml0b3IpOworCWlvdW5tYXAoaXBzLT5yZWdtYXApOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlrZnJlZShpcHMpOworCWRldl9kYmcoJmRldi0+ZGV2LCAiSVBTIGRyaXZlciByZW1vdmVkXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBpcHNfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBzX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaXBzX3N1c3BlbmQgTlVMTAorI2RlZmluZSBpcHNfcmVzdW1lIE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQgaXBzX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpcHNfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJpbnRlbCBpcHMiLAorCS5pZF90YWJsZSA9IGlwc19pZF90YWJsZSwKKwkucHJvYmUgPSBpcHNfcHJvYmUsCisJLnJlbW92ZSA9IGlwc19yZW1vdmUsCisJLnN1c3BlbmQgPSBpcHNfc3VzcGVuZCwKKwkucmVzdW1lID0gaXBzX3Jlc3VtZSwKKwkuc2h1dGRvd24gPSBpcHNfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcHNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpcHNfcGNpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChpcHNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIGlwc19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcHNfcGNpX2RyaXZlcik7CisJcmV0dXJuOworfQorbW9kdWxlX2V4aXQoaXBzX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKZXNzZSBCYXJuZXMgPGpiYXJuZXNAdmlydHVvdXNnZWVrLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWxsaWdlbnQgUG93ZXIgU2hhcmluZyBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX21lbmxvdy5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfbWVubG93LmMKaW5kZXggMmY3OTVjZS4uZWFjZDVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfbWVubG93LmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfbWVubG93LmMKQEAgLTUzLDYgKzUzLDggQEAKICNkZWZpbmUgTUVNT1JZX0FSR19DVVJfQkFORFdJRFRIIDEKICNkZWZpbmUgTUVNT1JZX0FSR19NQVhfQkFORFdJRFRIIDAKIAorc3RhdGljIHZvaWQgaW50ZWxfbWVubG93X3VucmVnaXN0ZXJfc2Vuc29yKHZvaWQpOworCiAvKgogICogR1RIUyByZXR1cm5pbmcgJ24nIHdvdWxkIG1lYW4gdGhhdCBbMCxuLTFdIHN0YXRlcyBhcmUgc3VwcG9ydGVkCiAgKiBJbiB0aGF0IGNhc2UgbWF4X2NzdGF0ZSB3b3VsZCBiZSBuLTEKQEAgLTQwNiw4ICs0MDgsMTAgQEAKIAlhdHRyLT5oYW5kbGUgPSBoYW5kbGU7CiAKIAlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmYXR0ci0+YXR0cik7Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0KSB7CisJCWtmcmVlKGF0dHIpOwogCQlyZXR1cm4gcmVzdWx0OworCX0KIAogCW11dGV4X2xvY2soJmludGVsX21lbmxvd19hdHRyX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJmF0dHItPm5vZGUsICZpbnRlbF9tZW5sb3dfYXR0cl9saXN0KTsKQEAgLTQzMSwxMSArNDM1LDExIEBACiAJLyogX1RaIG11c3QgaGF2ZSB0aGUgQVVYMC8xIG1ldGhvZHMgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCBHRVRfQVVYMCwgJmR1bW15KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gbm90X2ZvdW5kOworCQlyZXR1cm4gKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpID8gQUVfT0sgOiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCBTRVRfQVVYMCwgJmR1bW15KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gbm90X2ZvdW5kOworCQlyZXR1cm4gKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpID8gQUVfT0sgOiBzdGF0dXM7CiAKIAlyZXN1bHQgPSBpbnRlbF9tZW5sb3dfYWRkX29uZV9hdHRyaWJ1dGUoImF1eDAiLCAwNjQ0LAogCQkJCQkJYXV4MF9zaG93LCBhdXgwX3N0b3JlLApAQCAtNDQ1LDE3ICs0NDksMTkgQEAKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsIEdFVF9BVVgxLCAmZHVtbXkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJZ290byBub3RfZm91bmQ7CisJCWdvdG8gYXV4MV9ub3RfZm91bmQ7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCBTRVRfQVVYMSwgJmR1bW15KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gbm90X2ZvdW5kOworCQlnb3RvIGF1eDFfbm90X2ZvdW5kOwogCiAJcmVzdWx0ID0gaW50ZWxfbWVubG93X2FkZF9vbmVfYXR0cmlidXRlKCJhdXgxIiwgMDY0NCwKIAkJCQkJCWF1eDFfc2hvdywgYXV4MV9zdG9yZSwKIAkJCQkJCSZ0aGVybWFsLT5kZXZpY2UsIGhhbmRsZSk7Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0KSB7CisJCWludGVsX21lbmxvd191bnJlZ2lzdGVyX3NlbnNvcigpOwogCQlyZXR1cm4gQUVfRVJST1I7CisJfQogCiAJLyoKIAkgKiBjcmVhdGUgdGhlICJkYWJuZXlfZW5hYmxlZCIgYXR0cmlidXRlIHdoaWNoIG1lYW5zIHRoZSB1c2VyIGFwcApAQCAtNDY1LDE0ICs0NzEsMTcgQEAKIAlyZXN1bHQgPSBpbnRlbF9tZW5sb3dfYWRkX29uZV9hdHRyaWJ1dGUoImJpb3NfZW5hYmxlZCIsIDA0NDQsCiAJCQkJCQliaW9zX2VuYWJsZWRfc2hvdywgTlVMTCwKIAkJCQkJCSZ0aGVybWFsLT5kZXZpY2UsIGhhbmRsZSk7Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0KSB7CisJCWludGVsX21lbmxvd191bnJlZ2lzdGVyX3NlbnNvcigpOwogCQlyZXR1cm4gQUVfRVJST1I7CisJfQogCi0gbm90X2ZvdW5kOgorIGF1eDFfbm90X2ZvdW5kOgogCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKQogCQlyZXR1cm4gQUVfT0s7Ci0JZWxzZQotCQlyZXR1cm4gc3RhdHVzOworCisJaW50ZWxfbWVubG93X3VucmVnaXN0ZXJfc2Vuc29yKCk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfbWVubG93X3VucmVnaXN0ZXJfc2Vuc29yKHZvaWQpCkBAIC01MTMsOCArNTIyLDEwIEBACiAJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfVEhFUk1BTCwgQUNQSV9ST09UX09CSkVDVCwKIAkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwKIAkJCQkgICAgIGludGVsX21lbmxvd19yZWdpc3Rlcl9zZW5zb3IsIE5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmludGVsX21lbmxvd19tZW1vcnlfZHJpdmVyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtaWNfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGNmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYwpAQCAtMCwwICsxLDM0MCBAQAorLyogTW9vcmVzdG93biBQTUlDIEdQSU8gKGFjY2VzcyB0aHJvdWdoIElQQykgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIE1vb3Jlc3Rvd24gcGxhdGZvcm0gUE1JQyBjaGlwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVsX3BtaWNfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJwbWljX2dwaW8iCisKKy8qIHJlZ2lzdGVyIG9mZnNldCB0aGF0IElQQyBkcml2ZXIgc2hvdWxkIHVzZQorICogOCBHUElPICsgOCBHUE9TVyAoNiBjb250cm9sbGFibGUpICsgOEdQTworICovCitlbnVtIHBtaWNfZ3Bpb19yZWdpc3RlciB7CisJR1BJTzAJCT0gMHhFMCwKKwlHUElPNwkJPSAweEU3LAorCUdQSU9JTlQJCT0gMHhFOCwKKwlHUE9TV0NUTDAJPSAweEVDLAorCUdQT1NXQ1RMNQk9IDB4RjEsCisJR1BPCQk9IDB4RjQsCit9OworCisvKiBiaXRzIGRlZmluaXRpb24gZm9yIEdQSU8gJiBHUE9TVyAqLworI2RlZmluZSBHUElPX0RSViAweDAxCisjZGVmaW5lIEdQSU9fRElSIDB4MDIKKyNkZWZpbmUgR1BJT19ESU4gMHgwNAorI2RlZmluZSBHUElPX0RPVSAweDA4CisjZGVmaW5lIEdQSU9fSU5UQ1RMIDB4MzAKKyNkZWZpbmUgR1BJT19EQkMgMHhjMAorCisjZGVmaW5lIEdQT1NXX0RSViAweDAxCisjZGVmaW5lIEdQT1NXX0RPVSAweDA4CisjZGVmaW5lIEdQT1NXX1JEUlYgMHgzMAorCisKKyNkZWZpbmUgTlVNX0dQSU8gMjQKKworc3RydWN0IHBtaWNfZ3Bpb19pcnEgeworCXNwaW5sb2NrX3QgbG9jazsKKwl1MzIgdHJpZ2dlcltOVU1fR1BJT107CisJdTMyIGRpcnR5OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworfTsKKworCitzdHJ1Y3QgcG1pY19ncGlvIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7CisJc3RydWN0IHBtaWNfZ3Bpb19pcnEJaXJxdHlwZXM7CisJdm9pZAkJCSpncGlvaW50cjsKKwlpbnQJCQlpcnE7CisJdW5zaWduZWQJCWlycV9iYXNlOworfTsKKworc3RhdGljIHZvaWQgcG1pY19wcm9ncmFtX2lycXR5cGUoaW50IGdwaW8sIGludCB0eXBlKQoreworCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCisJCWludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKEdQSU8wICsgZ3BpbywgMHgyMCwgMHgyMCk7CisJZWxzZQorCQlpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcihHUElPMCArIGdwaW8sIDB4MDAsIDB4MjApOworCisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCWludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKEdQSU8wICsgZ3BpbywgMHgxMCwgMHgxMCk7CisJZWxzZQorCQlpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcihHUElPMCArIGdwaW8sIDB4MDAsIDB4MTApOworfTsKKworc3RhdGljIHZvaWQgcG1pY19pcnF0eXBlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBwbWljX2dwaW9faXJxICp0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwbWljX2dwaW9faXJxLCB3b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCXUxNiB0eXBlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPmxvY2ssIGZsYWdzKTsKKwkvKiBBcyB3ZSBkcm9wIHRoZSBsb2NrLCB3ZSBtYXkgbmVlZCBtdWx0aXBsZSBzY2FucyBpZiB3ZSByYWNlIHRoZQorCSAgIHBtaWNfaXJxX3R5cGUgZnVuY3Rpb24gKi8KKwl3aGlsZSAodC0+ZGlydHkpIHsKKwkJLyoKKwkJICoJRm9yIGVhY2ggcGluIHRoYXQgaGFzIHRoZSBkaXJ0eSBiaXQgc2V0IHNlbmQgYW4gSVBDCisJCSAqCW1lc3NhZ2UgdG8gY29uZmlndXJlIHRoZSBoYXJkd2FyZSB2aWEgdGhlIFBNSUMKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BJTzsgaSsrKSB7CisJCQlpZiAoISh0LT5kaXJ0eSAmICgxIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKwkJCXQtPmRpcnR5ICY9IH4oMSA8PCBpKTsKKwkJCS8qIFdlIGNhbid0IHRydXN0IHRoZSBhcnJheSBlbnRyeSBvciBkaXJ0eQorCQkJICAgb25jZSB0aGUgbG9jayBpcyBkcm9wcGVkICovCisJCQl0eXBlID0gdC0+dHJpZ2dlcltpXTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPmxvY2ssIGZsYWdzKTsKKwkJCXBtaWNfcHJvZ3JhbV9pcnF0eXBlKGksIHR5cGUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcG1pY19ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaWYgKG9mZnNldCA+IDgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IG9ubHkgcGluIDAtNyBzdXBwb3J0IGlucHV0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsvKiB3ZSBvbmx5IGhhdmUgOCBHUElPIGNhbiB1c2UgYXMgaW5wdXQgKi8KKwl9CisJcmV0dXJuIGludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKEdQSU8wICsgb2Zmc2V0LAorCQkJCQkJCUdQSU9fRElSLCBHUElPX0RJUik7Cit9CisKK3N0YXRpYyBpbnQgcG1pY19ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWludCByYyA9IDA7CisKKwlpZiAob2Zmc2V0IDwgOCkvKiBpdCBpcyBHUElPICovCisJCXJjID0gaW50ZWxfc2N1X2lwY191cGRhdGVfcmVnaXN0ZXIoR1BJTzAgKyBvZmZzZXQsCisJCQkJR1BJT19EUlYgfCBHUElPX0RPVSB8IEdQSU9fRElSLAorCQkJCUdQSU9fRFJWIHwgKHZhbHVlID8gR1BJT19ET1UgOiAwKSk7CisJZWxzZSBpZiAob2Zmc2V0IDwgMTYpLyogaXQgaXMgR1BPU1cgKi8KKwkJcmMgPSBpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcihHUE9TV0NUTDAgKyBvZmZzZXQgLSA4LAorCQkJCUdQT1NXX0RSViB8IEdQT1NXX0RPVSB8IEdQT1NXX1JEUlYsCisJCQkJR1BPU1dfRFJWIHwgKHZhbHVlID8gR1BPU1dfRE9VIDogMCkpOworCWVsc2UgaWYgKG9mZnNldCA+IDE1ICYmIG9mZnNldCA8IDI0KS8qIGl0IGlzIEdQTyAqLworCQlyYyA9IGludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKEdQTywKKwkJCQkxIDw8IChvZmZzZXQgLSAxNiksCisJCQkJdmFsdWUgPyAxIDw8IChvZmZzZXQgLSAxNikgOiAwKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IGludmFsaWQgUE1JQyBHUElPIHBpbiAlZCFcbiIsIF9fZnVuY19fLCBvZmZzZXQpOworCQlXQVJOX09OKDEpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbWljX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl1OCByOworCWludCByZXQ7CisKKwkvKiB3ZSBvbmx5IGhhdmUgOCBHUElPIHBpbnMgd2UgY2FuIHVzZSBhcyBpbnB1dCAqLworCWlmIChvZmZzZXQgPiA4KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0ID0gaW50ZWxfc2N1X2lwY19pb3JlYWQ4KEdQSU8wICsgb2Zmc2V0LCAmcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHIgJiBHUElPX0RJTjsKK30KKworc3RhdGljIHZvaWQgcG1pY19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlpZiAob2Zmc2V0IDwgOCkvKiBpdCBpcyBHUElPICovCisJCWludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKEdQSU8wICsgb2Zmc2V0LAorCQkJR1BJT19EUlYgfCBHUElPX0RPVSwKKwkJCUdQSU9fRFJWIHwgKHZhbHVlID8gR1BJT19ET1UgOiAwKSk7CisJZWxzZSBpZiAob2Zmc2V0IDwgMTYpLyogaXQgaXMgR1BPU1cgKi8KKwkJaW50ZWxfc2N1X2lwY191cGRhdGVfcmVnaXN0ZXIoR1BPU1dDVEwwICsgb2Zmc2V0IC0gOCwKKwkJCUdQT1NXX0RSViB8IEdQT1NXX0RPVSB8IEdQT1NXX1JEUlYsCisJCQlHUE9TV19EUlYgfCAodmFsdWUgPyBHUE9TV19ET1UgOiAwKSk7CisJZWxzZSBpZiAob2Zmc2V0ID4gMTUgJiYgb2Zmc2V0IDwgMjQpIC8qIGl0IGlzIEdQTyAqLworCQlpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcihHUE8sCisJCQkxIDw8IChvZmZzZXQgLSAxNiksCisJCQl2YWx1ZSA/IDEgPDwgKG9mZnNldCAtIDE2KSA6IDApOworfQorCitzdGF0aWMgaW50IHBtaWNfaXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0eXBlKQoreworCXN0cnVjdCBwbWljX2dwaW8gKnBnID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwl1MzIgZ3BpbyA9IGlycSAtIHBnLT5pcnFfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGdwaW8gPiBwZy0+Y2hpcC5uZ3BpbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGctPmlycXR5cGVzLmxvY2ssIGZsYWdzKTsKKwlwZy0+aXJxdHlwZXMudHJpZ2dlcltncGlvXSA9IHR5cGU7CisJcGctPmlycXR5cGVzLmRpcnR5IHw9ICAoMSA8PCBncGlvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZy0+aXJxdHlwZXMubG9jaywgZmxhZ3MpOworCXNjaGVkdWxlX3dvcmsoJnBnLT5pcnF0eXBlcy53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcG1pY19ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHBtaWNfZ3BpbyAqcGcgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHBtaWNfZ3BpbywgY2hpcCk7CisKKwlyZXR1cm4gcGctPmlycV9iYXNlICsgb2Zmc2V0OworfQorCisvKiB0aGUgZ3Bpb2ludHIgcmVnaXN0ZXIgaXMgcmVhZC1jbGVhciwgc28ganVzdCBkbyBub3RoaW5nLiAqLworc3RhdGljIHZvaWQgcG1pY19pcnFfdW5tYXNrKHVuc2lnbmVkIGlycSkKK3sKK307CisKK3N0YXRpYyB2b2lkIHBtaWNfaXJxX21hc2sodW5zaWduZWQgaXJxKQoreworfTsKKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwbWljX2lycWNoaXAgPSB7CisJLm5hbWUJCT0gIlBNSUMtR1BJTyIsCisJLm1hc2sJCT0gcG1pY19pcnFfbWFzaywKKwkudW5tYXNrCQk9IHBtaWNfaXJxX3VubWFzaywKKwkuc2V0X3R5cGUJPSBwbWljX2lycV90eXBlLAorfTsKKworc3RhdGljIHZvaWQgcG1pY19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgcG1pY19ncGlvICpwZyA9IChzdHJ1Y3QgcG1pY19ncGlvICopZ2V0X2lycV9kYXRhKGlycSk7CisJdTggaW50c3RzID0gKigodTggKilwZy0+Z3Bpb2ludHIgKyA0KTsKKwlpbnQgZ3BpbzsKKworCWZvciAoZ3BpbyA9IDA7IGdwaW8gPCA4OyBncGlvKyspIHsKKwkJaWYgKGludHN0cyAmICgxIDw8IGdwaW8pKSB7CisJCQlwcl9kZWJ1ZygicG1pYyBwaW4gJWQgdHJpZ2dlcmVkXG4iLCBncGlvKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShwZy0+aXJxX2Jhc2UgKyBncGlvKTsKKwkJfQorCX0KKwlkZXNjLT5jaGlwLT5lb2koaXJxKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGxhdGZvcm1fcG1pY19ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlzdHJ1Y3QgaW50ZWxfcG1pY19ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJc3RydWN0IHBtaWNfZ3BpbyAqcGc7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKworCWlmIChpcnEgPCAwKSB7CisJCWRldl9kYmcoZGV2LCAibm8gSVJRIGxpbmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+Z3Bpb19iYXNlIHx8ICFwZGF0YS0+aXJxX2Jhc2UpIHsKKwkJZGV2X2RiZyhkZXYsICJpbmNvcnJlY3Qgb3IgbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGcgPSBremFsbG9jKHNpemVvZigqcGcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHBnKTsKKworCXBnLT5pcnEgPSBpcnE7CisJLyogc2V0dGluZyB1cCBTUkFNIG1hcHBpbmcgZm9yIEdQSU9JTlQgcmVnaXN0ZXIgKi8KKwlwZy0+Z3Bpb2ludHIgPSBpb3JlbWFwX25vY2FjaGUocGRhdGEtPmdwaW9pbnRyLCA4KTsKKwlpZiAoIXBnLT5ncGlvaW50cikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4gbm90IG1hcCBHUElPSU5ULlxuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycjI7CisJfQorCXBnLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKwlwZy0+Y2hpcC5sYWJlbCA9ICJpbnRlbF9wbWljIjsKKwlwZy0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBwbWljX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCXBnLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBwbWljX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwlwZy0+Y2hpcC5nZXQgPSBwbWljX2dwaW9fZ2V0OworCXBnLT5jaGlwLnNldCA9IHBtaWNfZ3Bpb19zZXQ7CisJcGctPmNoaXAudG9faXJxID0gcG1pY19ncGlvX3RvX2lycTsKKwlwZy0+Y2hpcC5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKwlwZy0+Y2hpcC5uZ3BpbyA9IE5VTV9HUElPOworCXBnLT5jaGlwLmNhbl9zbGVlcCA9IDE7CisJcGctPmNoaXAuZGV2ID0gZGV2OworCisJSU5JVF9XT1JLKCZwZy0+aXJxdHlwZXMud29yaywgcG1pY19pcnF0eXBlX3dvcmspOworCXNwaW5fbG9ja19pbml0KCZwZy0+aXJxdHlwZXMubG9jayk7CisKKwlwZy0+Y2hpcC5kZXYgPSBkZXY7CisJcmV0dmFsID0gZ3Bpb2NoaXBfYWRkKCZwZy0+Y2hpcCk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4gbm90IGFkZCBwbWljIGdwaW8gY2hpcC5cbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCXNldF9pcnFfZGF0YShwZy0+aXJxLCBwZyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIocGctPmlycSwgcG1pY19pcnFfaGFuZGxlcik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpICsgcGctPmlycV9iYXNlLCAmcG1pY19pcnFjaGlwLAorCQkJCQloYW5kbGVfc2ltcGxlX2lycSwgImRlbXV4Iik7CisJCXNldF9pcnFfY2hpcF9kYXRhKGkgKyBwZy0+aXJxX2Jhc2UsIHBnKTsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJaW91bm1hcChwZy0+Z3Bpb2ludHIpOworZXJyMjoKKwlrZnJlZShwZyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogYXQgdGhlIHNhbWUgdGltZSwgcmVnaXN0ZXIgYSBwbGF0Zm9ybSBkcml2ZXIKKyAqIHRoaXMgc3VwcG9ydHMgdGhlIHNmaSAwLjgxIGZ3ICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbGF0Zm9ybV9wbWljX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gcGxhdGZvcm1fcG1pY19ncGlvX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1fcG1pY19ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbGF0Zm9ybV9wbWljX2dwaW9fZHJpdmVyKTsKK30KKworc3Vic3lzX2luaXRjYWxsKHBsYXRmb3JtX3BtaWNfZ3Bpb19pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQWxlayBEdSA8YWxlay5kdUBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIE1vb3Jlc3Rvd24gUE1JQyBHUElPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcmFyX3JlZ2lzdGVyLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9yYXJfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Y4ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcmFyX3JlZ2lzdGVyLmMKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiAgcmFyX3JlZ2lzdGVyLmMgLSBBbiBJbnRlbCBSZXN0cmljdGVkIEFjY2VzcyBSZWdpb24gcmVnaXN0ZXIgZHJpdmVyCisgKgorICogIENvcHlyaWdodChjKSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAyMDA5MTIwNCBNYXJrIEFsbHluIDxtYXJrLmEuYWxseW5AaW50ZWwuY29tPgorICoJICAgICBPc3NhbWEgT3RobWFuIDxvc3NhbWEub3RobWFuQGludGVsLmNvbT4KKyAqCUNsZWFudXAgcGVyIGZlZWRiYWNrIGZyb20gQWxhbiBDb3ggYW5kIEFyamFuIFZhbiBEZSBWZW4KKyAqCisgKiAgMjAwOTA4MDYgT3NzYW1hIE90aG1hbiA8b3NzYW1hLm90aG1hbkBpbnRlbC5jb20+CisgKiAgICAgIFJldHVybiB6ZXJvIGhpZ2ggYWRkcmVzcyBpZiB1cHBlciAyMiBiaXRzIGlzIHplcm8uCisgKiAgICAgIENsZWFuZWQgdXAgY2hlY2twYXRjaCBlcnJvcnMuCisgKiAgICAgIENsYXJpZmllZCB0aGF0IGRyaXZlciBpcyBkZWFsaW5nIHdpdGggYnVzIGFkZHJlc3Nlcy4KKyAqCisgKiAgMjAwOTA3MDIgT3NzYW1hIE90aG1hbiA8b3NzYW1hLm90aG1hbkBpbnRlbC5jb20+CisgKiAgICAgIFJlbW92ZWQgdW5uZWNlc3NhcnkgaW5jbHVkZSBkaXJlY3RpdmVzCisgKiAgICAgIENsZWFuZWQgdXAgc3BpbmxvY2tzLgorICogICAgICBDbGVhbmVkIHVwIGxvZ2dpbmcuCisgKiAgICAgIEltcHJvdmVkIGludmFsaWQgcGFyYW1ldGVyIGNoZWNrcy4KKyAqICAgICAgRml4ZWQgYW5kIHNpbXBsaWZpZWQgUkFSIGFkZHJlc3MgcmV0cmlldmFsIGFuZCBSQVIgbG9ja2luZworICogICAgICBjb2RlLgorICoKKyAqICAyMDA5MDYyNiBNYXJrIEFsbHluIDxtYXJrLmEuYWxseW5AaW50ZWwuY29tPgorICogICAgICBJbml0aWFsIHB1Ymxpc2gKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KKworLyogPT09IExpbmNyb2Z0IE1lc3NhZ2UgQnVzIEludGVyZmFjZSA9PT0gKi8KKyNkZWZpbmUgTE5DX01DUl9PRkZTRVQJCTB4RDAJLyogTWVzc2FnZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIExOQ19NRFJfT0ZGU0VUCQkweEQ0CS8qIE1lc3NhZ2UgRGF0YSBSZWdpc3RlciAqLworCisvKiBNZXNzYWdlIE9wY29kZXMgKi8KKyNkZWZpbmUgTE5DX01FU1NBR0VfUkVBRF9PUENPREUJMHhEMAorI2RlZmluZSBMTkNfTUVTU0FHRV9XUklURV9PUENPREUgMHhFMAorCisvKiBNZXNzYWdlIFdyaXRlIEJ5dGUgRW5hYmxlcyAqLworI2RlZmluZSBMTkNfTUVTU0FHRV9CWVRFX1dSSVRFX0VOQUJMRVMJMHhGCisKKy8qIEItdW5pdCBQb3J0ICovCisjZGVmaW5lIExOQ19CVU5JVF9QT1JUCTB4MworCisvKiA9PT0gTGluY3JvZnQgQi1Vbml0IFJlZ2lzdGVycyAtIFByb2dyYW1tZWQgYnkgSUEzMiBmaXJtd2FyZSA9PT0gKi8KKyNkZWZpbmUgTE5DX0JSQVIwTAkweDEwCisjZGVmaW5lIExOQ19CUkFSMEgJMHgxMQorI2RlZmluZSBMTkNfQlJBUjFMCTB4MTIKKyNkZWZpbmUgTE5DX0JSQVIxSAkweDEzCisvKiBSZXNlcnZlZCBmb3IgU2VQICovCisjZGVmaW5lIExOQ19CUkFSMkwJMHgxNAorI2RlZmluZSBMTkNfQlJBUjJICTB4MTUKKworLyogTW9vcmVzdG93biBzdXBwb3J0cyB0aHJlZSByZXN0cmljdGVkIGFjY2VzcyByZWdpb25zLiAqLworI2RlZmluZSBNUlNUX05VTV9SQVIgMworCisvKiBSQVIgQnVzIEFkZHJlc3MgUmFuZ2UgKi8KK3N0cnVjdCByYXJfYWRkciB7CisJZG1hX2FkZHJfdCBsb3c7CisJZG1hX2FkZHJfdCBoaWdoOworfTsKKworLyoKKyAqCVdlIGNyZWF0ZSBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggUkFSCisgKi8KK3N0cnVjdCBjbGllbnQgeworCWludCAoKmNhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpOworCXVuc2lnbmVkIGxvbmcgZHJpdmVyX3ByaXY7CisJYm9vbCBidXN5OworfTsKKworc3RhdGljIERFRklORV9NVVRFWChyYXJfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChsbmNfcmVnX211dGV4KTsKKworLyoKKyAqCU9uZSBwZXIgUkFSIGRldmljZSAoY3VycmVudGx5IG9ubHkgb25lIGRldmljZSkKKyAqLworc3RydWN0IHJhcl9kZXZpY2UgeworCXN0cnVjdCByYXJfYWRkciByYXJfYWRkcltNUlNUX05VTV9SQVJdOworCXN0cnVjdCBwY2lfZGV2ICpyYXJfZGV2OworCWJvb2wgcmVnaXN0ZXJlZDsKKwlib29sIGFsbG9jYXRlZDsKKwlzdHJ1Y3QgY2xpZW50IGNsaWVudFtNUlNUX05VTV9SQVJdOworfTsKKworLyogQ3VycmVudCBwbGF0Zm9ybXMgaGF2ZSBvbmx5IG9uZSByYXJfZGV2aWNlIGZvciAzIHJhciByZWdpb25zICovCitzdGF0aWMgc3RydWN0IHJhcl9kZXZpY2UgbXlfcmFyX2RldmljZTsKKworLyoKKyAqCUFic3RyYWN0IG91dCBtdWx0aXBsZSBkZXZpY2Ugc3VwcG9ydC4gQ3VycmVudCBwbGF0Zm9ybXMgb25seQorICoJaGF2ZSBhIHNpbmdsZSBSQVIgZGV2aWNlLgorICovCisKKy8qKgorICoJYWxsb2NfcmFyX2RldmljZQktCXJldHVybiBhIG5ldyBSQVIgc3RydWN0dXJlCisgKgorICoJUmV0dXJuIGEgbmV3IChidXQgbm90IHlldCByZWFkeSkgUkFSIGRldmljZSBvYmplY3QKKyAqLworc3RhdGljIHN0cnVjdCByYXJfZGV2aWNlICphbGxvY19yYXJfZGV2aWNlKHZvaWQpCit7CisJaWYgKG15X3Jhcl9kZXZpY2UuYWxsb2NhdGVkKQorCQlyZXR1cm4gTlVMTDsKKwlteV9yYXJfZGV2aWNlLmFsbG9jYXRlZCA9IDE7CisJcmV0dXJuICZteV9yYXJfZGV2aWNlOworfQorCisvKioKKyAqCWZyZWVfcmFyX2RldmljZQkJLQlmcmVlIGEgUkFSIG9iamVjdAorICoJQHJhcjogdGhlIFJBUiBkZXZpY2UgYmVpbmcgZnJlZWQKKyAqCisgKglSZWxlYXNlIGEgUkFSIG9iamVjdCBhbmQgYW55IGF0dGFjaGVkIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBmcmVlX3Jhcl9kZXZpY2Uoc3RydWN0IHJhcl9kZXZpY2UgKnJhcikKK3sKKwlwY2lfZGV2X3B1dChyYXItPnJhcl9kZXYpOworCXJhci0+YWxsb2NhdGVkID0gMDsKK30KKworLyoqCisgKglfcmFyX3RvX2RldmljZQkJLQlyZXR1cm4gdGhlIGRldmljZSBoYW5kbGluZyB0aGlzIFJBUgorICoJQHJhcjogUkFSIG51bWJlcgorICoJQG9mZjogcmV0dXJuZWQgb2Zmc2V0CisgKgorICoJSW50ZXJuYWwgaGVscGVyIGZvciBsb29raW5nIHVwIFJBUiBkZXZpY2VzLiBUaGlzIGFuZCBhbGxvYyBhcmUgdGhlCisgKgl0d28gZnVuY3Rpb25zIHRoYXQgbmVlZCB0b3VjaGluZyB0byBnbyB0byBtdWx0aXBsZSBSQVIgZGV2aWNlcy4KKyAqLworc3RhdGljIHN0cnVjdCByYXJfZGV2aWNlICpfcmFyX3RvX2RldmljZShpbnQgcmFyLCBpbnQgKm9mZikKK3sKKwlpZiAocmFyID49IDAgJiYgcmFyIDw9IDMpIHsKKwkJKm9mZiA9IHJhcjsKKwkJcmV0dXJuICZteV9yYXJfZGV2aWNlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglyYXJfdG9fZGV2aWNlCQktCXJldHVybiB0aGUgZGV2aWNlIGhhbmRsaW5nIHRoaXMgUkFSCisgKglAcmFyOiBSQVIgbnVtYmVyCisgKglAb2ZmOiByZXR1cm5lZCBvZmZzZXQKKyAqCisgKglSZXR1cm4gdGhlIGRldmljZSB0aGlzIFJBUiBtYXBzIHRvIGlmIG9uZSBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAqCXJldHVybnMgTlVMTC4gUmVwb3J0cyB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoaXMKKyAqCVJBUiBkZXZpY2UgaW4gb2ZmLgorICovCitzdGF0aWMgc3RydWN0IHJhcl9kZXZpY2UgKnJhcl90b19kZXZpY2UoaW50IHJhciwgaW50ICpvZmYpCit7CisJc3RydWN0IHJhcl9kZXZpY2UgKnJhcl9kZXYgPSBfcmFyX3RvX2RldmljZShyYXIsIG9mZik7CisJaWYgKHJhcl9kZXYgPT0gTlVMTCB8fCAhcmFyX2Rldi0+cmVnaXN0ZXJlZCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJhcl9kZXY7Cit9CisKKy8qKgorICoJcmFyX3RvX2NsaWVudAkJLQlyZXR1cm4gdGhlIGNsaWVudCBoYW5kbGluZyB0aGlzIFJBUgorICoJQHJhcjogUkFSIG51bWJlcgorICoKKyAqCVJldHVybiB0aGUgY2xpZW50IHRoaXMgUkFSIG1hcHMgdG8gaWYgYSBtYXBwaW5nIGlzIGtub3duLCBvdGhlcndpc2UKKyAqCXJldHVybnMgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBjbGllbnQgKnJhcl90b19jbGllbnQoaW50IHJhcikKK3sKKwlpbnQgaWR4OworCXN0cnVjdCByYXJfZGV2aWNlICpyID0gX3Jhcl90b19kZXZpY2UocmFyLCAmaWR4KTsKKwlpZiAociAhPSBOVUxMKQorCQlyZXR1cm4gJnItPmNsaWVudFtpZHhdOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCXJhcl9yZWFkX2FkZHIJCS0JcmV0cmlldmUgYSBSQVIgbWFwcGluZworICoJQHBkZXY6IFBDSSBkZXZpY2UgZm9yIHRoZSBSQVIKKyAqCUBvZmZzZXQ6IG9mZnNldCBmb3IgbWVzc2FnZQorICoJQGFkZHI6IHJldHVybmVkIGFkZHJlc3MKKyAqCisgKglSZWFkcyB0aGUgYWRkcmVzcyBvZiBhIGdpdmVuIFJBUiByZWdpc3Rlci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAqCW9yIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCByYXJfcmVhZF9hZGRyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgb2Zmc2V0LCBkbWFfYWRkcl90ICphZGRyKQoreworCS8qCisJICogPT09PT09PT0gVGhlIExpbmNyb2Z0IE1lc3NhZ2UgQnVzIEludGVyZmFjZSA9PT09PT09PQorCSAqIExpbmNyb2Z0IHJlZ2lzdGVycyBtYXkgYmUgb2J0YWluZWQgdmlhIFBDSSBmcm9tCisJICogdGhlIGhvc3QgYnJpZGdlIHVzaW5nIHRoZSBMaW5jcm9mdCBNZXNzYWdlIEJ1cworCSAqIEludGVyZmFjZS4gIFRoYXQgbWVzc2FnZSBidXMgaW50ZXJmYWNlIGlzIGdlbmVyYWxseQorCSAqIGNvbXByaXNlZCBvZiB0d28gcmVnaXN0ZXJzOiBhIGNvbnRyb2wgcmVnaXN0ZXIgKE1DUiwgMHhETykKKwkgKiBhbmQgYSBkYXRhIHJlZ2lzdGVyIChNRFIsIDB4RDQpLgorCSAqCisJICogVGhlIE1DUiAobWVzc2FnZSBjb250cm9sIHJlZ2lzdGVyKSBmb3JtYXQgaXMgdGhlIGZvbGxvd2luZzoKKwkgKiAgIDEuICBbMzE6MjRdOiBPcGNvZGUKKwkgKiAgIDIuICBbMjM6MTZdOiBQb3J0CisJICogICAzLiAgWzE1OjhdOiBSZWdpc3RlciBPZmZzZXQKKwkgKiAgIDQuICBbNzo0XTogQnl0ZSBFbmFibGVzICh1c2UgMHhGIHRvIHNldCBhbGwgb2YgdGhlc2UgYml0cworCSAqICAgICAgICAgICAgICB0byAxKQorCSAqICAgNS4gIFszOjBdOiByZXNlcnZlZAorCSAqCisJICogIFJlYWQgKDB4RDApIGFuZCB3cml0ZSAoMHhFMCkgb3Bjb2RlcyBhcmUgd3JpdHRlbiB0byB0aGUKKwkgKiAgY29udHJvbCByZWdpc3RlciB3aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gTGluY3JvZnQKKwkgKiAgcmVnaXN0ZXJzLCByZXNwZWN0aXZlbHkuCisJICoKKwkgKiAgV2UncmUgaW50ZXJlc3RlZCBpbiByZWdpc3RlcnMgZm91bmQgaW4gdGhlIExpbmNyb2Z0CisJICogIEItdW5pdC4gIFRoZSBCLXVuaXQgcG9ydCBpcyAweDMuCisJICoKKwkgKiAgVGhlIHNpeCBCLXVuaXQgUkFSIHJlZ2lzdGVyIG9mZnNldHMgd2UgdXNlIGFyZSBsaXN0ZWQKKwkgKiAgZWFybGllciBpbiB0aGlzIGZpbGUuCisJICoKKwkgKiAgTGFzdGx5IHdyaXRpbmcgdG8gdGhlIE1DUiByZWdpc3RlciByZXF1aXJlcyB0aGUgIkJ5dGUKKwkgKiAgZW5hYmxlcyIgYml0cyB0byBiZSBzZXQgdG8gMS4gIFRoaXMgbWF5IGJlIGFjaGlldmVkIGJ5CisJICogIHdyaXRpbmcgMHhGIGF0IGJpdCA0LgorCSAqCisJICogVGhlIE1EUiAobWVzc2FnZSBkYXRhIHJlZ2lzdGVyKSBmb3JtYXQgaXMgdGhlIGZvbGxvd2luZzoKKwkgKiAgIDEuIFszMTowXTogUmVhZC9Xcml0ZSBEYXRhCisJICoKKwkgKiAgRGF0YSBiZWluZyByZWFkIGZyb20gdGhpcyByZWdpc3RlciBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlcgorCSAqICB3cml0aW5nIHRoZSBhcHByb3ByaWF0ZSBjb250cm9sIG1lc3NhZ2UgdG8gdGhlIE1DUgorCSAqICByZWdpc3Rlci4KKwkgKgorCSAqICBEYXRhIGJlaW5nIHdyaXR0ZW4gdG8gdGhpcyByZWdpc3RlciBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlCisJICogIHdyaXRpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbnRyb2wgbWVzc2FnZSB0byB0aGUgTUNSCisJICogIHJlZ2lzdGVyLgorCSovCisKKwlpbnQgcmVzdWx0OworCXUzMiBhZGRyMzI7CisKKwkvKiBDb25zdHJ1Y3QgY29udHJvbCBtZXNzYWdlICovCisJdTMyIGNvbnN0IG1lc3NhZ2UgPQorCQkgKExOQ19NRVNTQUdFX1JFQURfT1BDT0RFIDw8IDI0KQorCQkgfCAoTE5DX0JVTklUX1BPUlQgPDwgMTYpCisJCSB8IChvZmZzZXQgPDwgOCkKKwkJIHwgKExOQ19NRVNTQUdFX0JZVEVfV1JJVEVfRU5BQkxFUyA8PCA0KTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIk9mZnNldCBmb3IgJ2dldCcgTE5DIE1TRyBpcyAleFxuIiwgb2Zmc2V0KTsKKworCS8qCisJKiBXZSBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIExpbmNyb2Z0IE1DUiBhbmQgTURSIHJlZ2lzdGVycworCSogdW50aWwgQk9USCB0aGUgY29tbWFuZCBpcyBpc3N1ZWQgdGhyb3VnaCB0aGUgTUNSIHJlZ2lzdGVyCisJKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBpcyByZWFkIGZyb20gdGhlIE1EUiByZWdpc3Rlci4KKwkqIE90aGVyd2lzZSBhIHJhY2UgY29uZGl0aW9uIHdvdWxkIGV4aXN0IGJldHdlZW4gYWNjZXNzZXMgdG8KKwkqIGJvdGggcmVnaXN0ZXJzLgorCSovCisKKwltdXRleF9sb2NrKCZsbmNfcmVnX211dGV4KTsKKworCS8qIFNlbmQgdGhlIGNvbnRyb2wgbWVzc2FnZSAqLworCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTE5DX01DUl9PRkZTRVQsIG1lc3NhZ2UpOworCWlmICghcmVzdWx0KSB7CisJCS8qIFJlYWQgYmFjayB0aGUgYWRkcmVzcyBhcyBhIDMyYml0IHZhbHVlICovCisJCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMTkNfTURSX09GRlNFVCwgJmFkZHIzMik7CisJCSphZGRyID0gKGRtYV9hZGRyX3QpYWRkcjMyOworCX0KKwltdXRleF91bmxvY2soJmxuY19yZWdfbXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICoJcmFyX3NldF9hZGRyCQktCVNldCBhIFJBUiBtYXBwaW5nCisgKglAcGRldjogUENJIGRldmljZSBmb3IgdGhlIFJBUgorICoJQG9mZnNldDogb2Zmc2V0IGZvciBtZXNzYWdlCisgKglAYWRkcjogYWRkcmVzcyB0byBzZXQKKyAqCisgKglTZXRzIHRoZSBhZGRyZXNzIG9mIGEgZ2l2ZW4gUkFSIHJlZ2lzdGVyLiBSZXR1cm5zIDAgb24gc3VjY2VzcworICoJb3IgYW4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHJhcl9zZXRfYWRkcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwlpbnQgb2Zmc2V0LAorCWRtYV9hZGRyX3QgYWRkcikKK3sKKwkvKgorCSogRGF0YSBiZWluZyB3cml0dGVuIHRvIHRoaXMgcmVnaXN0ZXIgbXVzdCBiZSB3cml0dGVuIGJlZm9yZQorCSogd3JpdGluZyB0aGUgYXBwcm9wcmlhdGUgY29udHJvbCBtZXNzYWdlIHRvIHRoZSBNQ1IKKwkqIHJlZ2lzdGVyLgorCSogU2VlIHJhcl9nZXRfYWRkcnMoKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKwkqIG1lc3NhZ2UgYnVzIGludGVyZmFjZSBiZWluZyB1c2VkIGhlcmUuCisJKi8KKworCWludCByZXN1bHQ7CisKKwkvKiBDb25zdHJ1Y3QgY29udHJvbCBtZXNzYWdlICovCisJdTMyIGNvbnN0IG1lc3NhZ2UgPSAoTE5DX01FU1NBR0VfV1JJVEVfT1BDT0RFIDw8IDI0KQorCQl8IChMTkNfQlVOSVRfUE9SVCA8PCAxNikKKwkJfCAob2Zmc2V0IDw8IDgpCisJCXwgKExOQ19NRVNTQUdFX0JZVEVfV1JJVEVfRU5BQkxFUyA8PCA0KTsKKworCS8qCisJKiBXZSBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIExpbmNyb2Z0IE1DUiBhbmQgTURSIHJlZ2lzdGVycworCSogdW50aWwgQk9USCB0aGUgY29tbWFuZCBpcyBpc3N1ZWQgdGhyb3VnaCB0aGUgTUNSIHJlZ2lzdGVyCisJKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBpcyByZWFkIGZyb20gdGhlIE1EUiByZWdpc3Rlci4KKwkqIE90aGVyd2lzZSBhIHJhY2UgY29uZGl0aW9uIHdvdWxkIGV4aXN0IGJldHdlZW4gYWNjZXNzZXMgdG8KKwkqIGJvdGggcmVnaXN0ZXJzLgorCSovCisKKwltdXRleF9sb2NrKCZsbmNfcmVnX211dGV4KTsKKworCS8qIFNlbmQgdGhlIGNvbnRyb2wgbWVzc2FnZSAqLworCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTE5DX01EUl9PRkZTRVQsIGFkZHIpOworCWlmICghcmVzdWx0KQorCQkvKiBBbmQgYWRkcmVzcyAqLworCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIExOQ19NQ1JfT0ZGU0VULCBtZXNzYWdlKTsKKworCW11dGV4X3VubG9jaygmbG5jX3JlZ19tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqCXJhcl9pbml0X3BhcmFtcwkJLQlJbml0aWFsaXplIFJBUiBwYXJhbWV0ZXJzCisgKglAcmFyOiBSQVIgZGV2aWNlIHRvIGluaXRpYWxpc2UKKyAqCisgKglJbml0aWFsaXplIFJBUiBwYXJhbWV0ZXJzLCBzdWNoIGFzIGJ1cyBhZGRyZXNzZXMsIGV0Yy4gUmV0dXJucyAwCisgKglvbiBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9yYXJfcGFyYW1zKHN0cnVjdCByYXJfZGV2aWNlICpyYXIpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSByYXItPnJhcl9kZXY7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IG9mZnNldCA9IDB4MTA7CS8qIFJBUiAwIHRvIDIgaW4gb3JkZXIgbG93L2hpZ2gvbG93L2hpZ2gvLi4uICovCisKKwkvKiBSZXRyaWV2ZSBSQVIgc3RhcnQgYW5kIGVuZCBidXMgYWRkcmVzc2VzLgorCSogQWNjZXNzIHRoZSBSQVIgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIExpbmNyb2Z0IE1lc3NhZ2UgQnVzCisJKiBJbnRlcmZhY2Ugb24gUENJIGRldmljZTogMDA6MDAuMCBIb3N0IGJyaWRnZS4KKwkqLworCisJZm9yIChpID0gMDsgaSA8IE1SU1RfTlVNX1JBUjsgKytpKSB7CisJCXN0cnVjdCByYXJfYWRkciAqYWRkciA9ICZyYXItPnJhcl9hZGRyW2ldOworCisJCXJlc3VsdCA9IHJhcl9yZWFkX2FkZHIocGRldiwgb2Zmc2V0KyssICZhZGRyLT5sb3cpOworCQlpZiAocmVzdWx0ICE9IDApCisJCQlyZXR1cm4gcmVzdWx0OworCisJCXJlc3VsdCA9IHJhcl9yZWFkX2FkZHIocGRldiwgb2Zmc2V0KyssICZhZGRyLT5oaWdoKTsKKwkJaWYgKHJlc3VsdCAhPSAwKQorCQkJcmV0dXJuIHJlc3VsdDsKKworCisJCS8qCisJCSogT25seSB0aGUgdXBwZXIgMjIgYml0cyBvZiB0aGUgUkFSIGFkZHJlc3NlcyBhcmUKKwkJKiBzdG9yZWQgaW4gdGhlaXIgY29ycmVzcG9uZGluZyBSQVIgcmVnaXN0ZXJzIHNvIHdlCisJCSogbXVzdCBzZXQgdGhlIGxvd2VyIDEwIGJpdHMgYWNjb3JkaW5nbHkuCisKKwkJKiBUaGUgbG93IGFkZHJlc3MgaGFzIGl0cyBsb3dlciAxMCBiaXRzIGNsZWFyZWQsIGFuZAorCQkqIHRoZSBoaWdoIGFkZHJlc3MgaGFzIGFsbCBpdHMgbG93ZXIgMTAgYml0cyBzZXQsCisJCSogZS5nLjoKKwkJKiBsb3cgPSAweDJmZmZmYzAwCisJCSovCisKKwkJYWRkci0+bG93ICY9IChkbWFfYWRkcl90KTB4ZmZmZmZjMDB1OworCisJCS8qCisJCSogU2V0IGJpdHMgOTowIG9uIHVwcHNlciBhZGRyZXNzIGlmIGJpdHMgMzE6MTAgYXJlIG5vbgorCQkqIHplcm87IG90aGVyd2l6ZSBjbGVhciBhbGwgYml0cworCQkqLworCisJCWlmICgoYWRkci0+aGlnaCAmIDB4ZmZmZmZjMDB1KSA9PSAwKQorCQkJYWRkci0+aGlnaCA9IDA7CisJCWVsc2UKKwkJCWFkZHItPmhpZ2ggfD0gMHgzZmZ1OworCX0KKwkvKiBEb25lIGFjY2Vzc2luZyB0aGUgZGV2aWNlLiAqLworCisJaWYgKHJlc3VsdCA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgIT0gTVJTVF9OVU1fUkFSOyArK2kpIHsKKwkJCS8qCisJCQkqICJCUkFSIiByZWZlcnMgdG8gdGhlIFJBUiByZWdpc3RlcnMgaW4gdGhlCisJCQkqIExpbmNyb2Z0IEItdW5pdC4KKwkJCSovCisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQlJBUlsldV0gYnVzIGFkZHJlc3MgcmFuZ2UgPSAiCisJCQkgICJbJWx4LCAlbHhdXG4iLCBpLAorCQkJICAodW5zaWduZWQgbG9uZylyYXItPnJhcl9hZGRyW2ldLmxvdywKKwkJCSAgKHVuc2lnbmVkIGxvbmcpcmFyLT5yYXJfYWRkcltpXS5oaWdoKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqCXJhcl9nZXRfYWRkcmVzcwkJLQlnZXQgdGhlIGJ1cyBhZGRyZXNzIGluIGEgUkFSCisgKglAc3RhcnQ6IHJldHVybiB2YWx1ZSBvZiBzdGFydCBhZGRyZXNzIG9mIGJsb2NrCisgKglAZW5kOiByZXR1cm4gdmFsdWUgb2YgZW5kIGFkZHJlc3Mgb2YgYmxvY2sKKyAqCisgKglUaGUgcmFyX2dldF9hZGRyZXNzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb3RoZXIgZGV2aWNlIGRyaXZlcnMKKyAqCXRvIG9idGFpbiBSQVIgYWRkcmVzcyBpbmZvcm1hdGlvbiBvbiBhIFJBUi4gSXQgdGFrZXMgdGhyZWUKKyAqCXBhcmFtZXRlcnM6CisgKgorICoJVGhlIGZ1bmN0aW9uIHJldHVybnMgYSAwIHVwb24gc3VjY2VzcyBvciBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBSQVIKKyAqCWZhY2lsaXR5IG9uIHRoaXMgc3lzdGVtLgorICovCitpbnQgcmFyX2dldF9hZGRyZXNzKGludCByYXJfaW5kZXgsIGRtYV9hZGRyX3QgKnN0YXJ0LCBkbWFfYWRkcl90ICplbmQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgcmFyX2RldmljZSAqcmFyID0gcmFyX3RvX2RldmljZShyYXJfaW5kZXgsICZpZHgpOworCisJaWYgKHJhciA9PSBOVUxMKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCSpzdGFydCA9IHJhci0+cmFyX2FkZHJbaWR4XS5sb3c7CisJKmVuZCA9IHJhci0+cmFyX2FkZHJbaWR4XS5oaWdoOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChyYXJfZ2V0X2FkZHJlc3MpOworCisvKioKKyAqCXJhcl9sb2NrCS0JbG9jayBhIFJBUiByZWdpc3RlcgorICoJQHJhcl9pbmRleDogUkFSIHRvIGxvY2sgKDAtMikKKyAqCisgKglUaGUgcmFyX2xvY2sgZnVuY3Rpb24gaXMgdWVkIGJ5IG90aGVyIGRldmljZSBkcml2ZXJzIHRvIGxvY2sgYW4gUkFSLgorICoJb25jZSBhIFJBUiBpcyBsb2NrZWQsIGl0IHN0YXlzIGxvY2tlZCB1bnRpbCB0aGUgbmV4dCBzeXN0ZW0gcmVib290LgorICoKKyAqCVRoZSBmdW5jdGlvbiByZXR1cm5zIGEgMCB1cG9uIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gUkFSCisgKglmYWNpbGl0eSBvbiB0aGlzIHN5c3RlbSwgb3IgdGhlIGxvY2tpbmcgZmFpbHMKKyAqLworaW50IHJhcl9sb2NrKGludCByYXJfaW5kZXgpCit7CisJc3RydWN0IHJhcl9kZXZpY2UgKnJhcjsKKwlpbnQgcmVzdWx0OworCWludCBpZHg7CisJZG1hX2FkZHJfdCBsb3csIGhpZ2g7CisKKwlyYXIgPSByYXJfdG9fZGV2aWNlKHJhcl9pbmRleCwgJmlkeCk7CisKKwlpZiAocmFyID09IE5VTEwpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG93ID0gcmFyLT5yYXJfYWRkcltpZHhdLmxvdyAmIDB4ZmZmZmZjMDB1OworCWhpZ2ggPSByYXItPnJhcl9hZGRyW2lkeF0uaGlnaCAmIDB4ZmZmZmZjMDB1OworCisJLyoKKwkqIE9ubHkgYWxsb3cgSS9PIGZyb20gdGhlIGdyYXBoaWNzIGFuZCBMYW5nd2VsbDsKKwkqIG5vdCBmcm9tIHRoZSB4ODYgcHJvY2Vzc29yCisJKi8KKworCWlmIChyYXJfaW5kZXggPT0gUkFSX1RZUEVfVklERU8pIHsKKwkJbG93IHw9IDB4MDAwMDAwMDk7CisJCWhpZ2ggfD0gMHgwMDAwMDAxNTsKKwl9IGVsc2UgaWYgKHJhcl9pbmRleCA9PSBSQVJfVFlQRV9BVURJTykgeworCQkvKiBPbmx5IGFsbG93IEkvTyBmcm9tIExhbmd3ZWxsOyBub3RoaW5nIGZyb20geDg2ICovCisJCWxvdyB8PSAweDAwMDAwMDA4OworCQloaWdoIHw9IDB4MDAwMDAwMTg7CisJfSBlbHNlCisJCS8qIFJlYWQtb25seSBmcm9tIGFsbCBhZ2VudHMgKi8KKwkJaGlnaCB8PSAweDAwMDAwMDE4OworCisJLyoKKwkqIE5vdyBwcm9ncmFtIHRoZSByZWdpc3RlciB1c2luZyB0aGUgTGluY3JvZnQgbWVzc2FnZQorCSogYnVzIGludGVyZmFjZS4KKwkqLworCXJlc3VsdCA9IHJhcl9zZXRfYWRkcihyYXItPnJhcl9kZXYsCisJCQkJMiAqIGlkeCwgbG93KTsKKworCWlmIChyZXN1bHQgPT0gMCkKKwkJcmVzdWx0ID0gcmFyX3NldF9hZGRyKHJhci0+cmFyX2RldiwKKwkJCQkyICogaWR4ICsgMSwgaGlnaCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChyYXJfbG9jayk7CisKKy8qKgorICoJcmVnaXN0ZXJfcmFyCQktCXJlZ2lzdGVyIGEgUkFSIGhhbmRsZXIKKyAqCUBudW06IFJBUiB3ZSB3aXNoIHRvIHJlZ2lzdGVyIGZvcgorICoJQGNhbGxiYWNrOiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gUkFSIHN1cHBvcnQgaXMgYXZhaWxhYmxlCisgKglAZGF0YTogZGF0YSB0byBwYXNzIHRvIHRoaXMgZnVuY3Rpb24KKyAqCisgKglUaGUgcmVnaXN0ZXJfcmFyIGZ1bmN0aW9uIGlzIHRvIHVzZWQgYnkgb3RoZXIgZGV2aWNlIGRyaXZlcnMKKyAqCXRvIGVuc3VyZSB0aGF0IHRoaXMgZHJpdmVyIGlzIHJlYWR5LiBBcyB3ZSBjYW5ub3QgYmUgc3VyZSBvZgorICoJdGhlIGNvbXBpbGUvZXhlY3V0ZSBvcmRlciBvZiBkcml2ZXJzIGluIHRoZXIga2VybmVsLCBpdCBpcworICoJYmVzdCB0byBnaXZlIHRoaXMgZHJpdmVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuCisgKglpdCBpcyByZWFkeSB0byBnaXZlIG91dCBhZGRyZXNzZXMuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgorICoJd291bGQgaGF2ZSB0aG9zZSBzdGVwcyB0aGF0IGNvbnRpbnVlIHRoZSBpbml0aWFsaXphdGlvbiBvZgorICoJYSBkcml2ZXIgdGhhdCBkbyByZXF1aXJlIGEgdmFsaWQgUkFSIGFkZHJlc3MuIE9uZSBvZiB0aG9zZQorICoJc3RlcHMgd291bGQgYmUgdG8gY2FsbCByYXJfZ2V0X2FkZHJlc3MoKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmV0dXJuIDAgb24gc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCByZWdpc3Rlcl9yYXIoaW50IG51bSwgaW50ICgqY2FsbGJhY2spKHVuc2lnbmVkIGxvbmcgZGF0YSksCisJCQkJCQkJdW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIEZvciBub3cgd2UgaGFyZGNvZGUgYSBzaW5nbGUgUkFSIGRldmljZSAqLworCXN0cnVjdCByYXJfZGV2aWNlICpyYXI7CisJc3RydWN0IGNsaWVudCAqYzsKKwlpbnQgaWR4OworCWludCByZXR2YWwgPSAwOworCisJbXV0ZXhfbG9jaygmcmFyX211dGV4KTsKKworCS8qIERvIHdlIGhhdmUgYSBjbGllbnQgbWFwcGluZyBmb3IgdGhpcyBSQVIgbnVtYmVyID8gKi8KKwljID0gcmFyX3RvX2NsaWVudChudW0pOworCWlmIChjID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVSQU5HRTsKKwkJZ290byBkb25lOworCX0KKwkvKiBJcyBpdCBjbGFpbWVkID8gKi8KKwlpZiAoYy0+YnVzeSkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZG9uZTsKKwl9CisJYy0+YnVzeSA9IDE7CisKKwkvKiBTZWUgaWYgd2UgaGF2ZSBhIGhhbmRsZXIgZm9yIHRoaXMgUkFSIHlldCwgaWYgd2UgZG8gdGhlbiBmaXJlIGl0ICovCisJcmFyID0gcmFyX3RvX2RldmljZShudW0sICZpZHgpOworCisJaWYgKHJhcikgeworCQkvKgorCQkqIGlmIHRoZSBkcml2ZXIgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGVuIHdlIGNhbiBzaW1wbHkKKwkJKiBjYWxsIHRoZSBjYWxsYmFjayByaWdodCBub3cKKwkJKi8KKwkJKCpjYWxsYmFjaykoZGF0YSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBBcnJhbmdlIHRvIGJlIGNhbGxlZCBiYWNrIHdoZW4gdGhlIGhhcmR3YXJlIGlzIGZvdW5kICovCisJYy0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwljLT5kcml2ZXJfcHJpdiA9IGRhdGE7Citkb25lOgorCW11dGV4X3VubG9jaygmcmFyX211dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9yYXIpOworCisvKioKKyAqCXVucmVnaXN0ZXJfcmFyCS0JcmVsZWFzZSBhIFJBUiBhbGxvY2F0aW9uCisgKglAbnVtOiBSQVIgbnVtYmVyCisgKgorICoJUmVsZWFzZXMgYSBSQVIgYWxsb2NhdGlvbiwgb3IgcGVuZGluZyBhbGxvY2F0aW9uLiBJZiBhIGNhbGxiYWNrIGlzCisgKglwZW5kaW5nIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIGVpdGhlciBjb21wbGV0ZSBiZWZvcmUgdGhlIHVucmVnaXN0ZXIKKyAqCXJldHVybnMgb3Igbm90IGF0IGFsbC4KKyAqLworCit2b2lkIHVucmVnaXN0ZXJfcmFyKGludCBudW0pCit7CisJc3RydWN0IGNsaWVudCAqYzsKKworCW11dGV4X2xvY2soJnJhcl9tdXRleCk7CisJYyA9IHJhcl90b19jbGllbnQobnVtKTsKKwlpZiAoYyA9PSBOVUxMIHx8ICFjLT5idXN5KQorCQlXQVJOX09OKDEpOworCWVsc2UKKwkJYy0+YnVzeSA9IDA7CisJbXV0ZXhfdW5sb2NrKCZyYXJfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3Jhcik7CisKKy8qKgorICoJcmFyX2NhbGxiYWNrCQktCVByb2Nlc3MgY2FsbGJhY2tzCisgKglAcmFyOiBuZXcgUkFSIGRldmljZQorICoKKyAqCVByb2Nlc3MgdGhlIGNhbGxiYWNrcyBmb3IgYSBuZXdseSBmb3VuZCBSQVIgZGV2aWNlLgorICovCisKK3N0YXRpYyB2b2lkIHJhcl9jYWxsYmFjayhzdHJ1Y3QgcmFyX2RldmljZSAqcmFyKQoreworCXN0cnVjdCBjbGllbnQgKmMgPSAmcmFyLT5jbGllbnRbMF07CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZyYXJfbXV0ZXgpOworCisJcmFyLT5yZWdpc3RlcmVkID0gMTsJLyogRW5zdXJlIG5vIG1vcmUgY2FsbGJhY2tzIHF1ZXVlICovCisKKwlmb3IgKGkgPSAwOyBpIDwgTVJTVF9OVU1fUkFSOyBpKyspIHsKKwkJaWYgKGMtPmNhbGxiYWNrICYmIGMtPmJ1c3kpIHsKKwkJCWMtPmNhbGxiYWNrKGMtPmRyaXZlcl9wcml2KTsKKwkJCWMtPmNhbGxiYWNrID0gTlVMTDsKKwkJfQorCQljKys7CisJfQorCW11dGV4X3VubG9jaygmcmFyX211dGV4KTsKK30KKworLyoqCisgKglyYXJfcHJvYmUJCS0JUENJIHByb2JlIGNhbGxiYWNrCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAaWQ6IG1hdGNoaW5nIGVudHJ5IGluIHRoZSBtYXRjaCB0YWJsZQorICoKKyAqCUEgUkFSIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkLiBJbml0aWFsaXNlIGl0IGFuZCBpZiBzdWNjZXNzZnVsCisgKglwcm9jZXNzIGFueSBwZW5kaW5nIGNhbGxiYWNrcyB0aGF0IGNhbiBub3cgYmUgY29tcGxldGVkLgorICovCitzdGF0aWMgaW50IHJhcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycm9yOworCXN0cnVjdCByYXJfZGV2aWNlICpyYXI7CisKKwlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBwcm9iZSBzdGFydGluZ1xuIik7CisKKwlyYXIgPSBhbGxvY19yYXJfZGV2aWNlKCk7CisJaWYgKHJhciA9PSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogRW5hYmxlIHRoZSBkZXZpY2UgKi8KKwllcnJvciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIkVycm9yIGVuYWJsaW5nIFJBUiByZWdpc3RlciBQQ0kgZGV2aWNlXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmFyX2RldmljZSBzdHJ1Y3R1cmUgKi8KKwlyYXItPnJhcl9kZXYgPSBwY2lfZGV2X2dldChkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHJhcik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFJBUiBwYXJhbWV0ZXJzLCB3aGljaCBoYXZlIHRvIGJlIHJldHJpZXZlZAorCSAqIHZpYSB0aGUgbWVzc2FnZSBidXMgaW50ZXJmYWNlLgorCSAqLworCWVycm9yID0gaW5pdF9yYXJfcGFyYW1zKHJhcik7CisJaWYgKGVycm9yKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIHJldHJpZXZpbmcgUkFSIGFkZHJlc3Nlc1xuIik7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKwkvKiBub3cgY2FsbCBhbnlvbmUgd2hvIGhhcyByZWdpc3RlcmVkICh1c2luZyBjYWxsYmFja3MpICovCisJcmFyX2NhbGxiYWNrKHJhcik7CisJcmV0dXJuIDA7CitlbmRfZnVuY3Rpb246CisJZnJlZV9yYXJfZGV2aWNlKHJhcik7CisJcmV0dXJuIGVycm9yOworfQorCitjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCByYXJfcGNpX2lkX3RibFtdID0geworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NDExMCkgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJhcl9wY2lfaWRfdGJsKTsKKworY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKm15X2lkX3RhYmxlID0gcmFyX3BjaV9pZF90Ymw7CisKKy8qIGZpZWxkIGZvciByZWdpc3RlcmluZyBkcml2ZXIgdG8gUENJIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJhcl9wY2lfZHJpdmVyID0geworCS5uYW1lID0gInJhcl9yZWdpc3Rlcl9kcml2ZXIiLAorCS5pZF90YWJsZSA9IHJhcl9wY2lfaWRfdGJsLAorCS5wcm9iZSA9IHJhcl9wcm9iZSwKKwkvKiBDYW5ub3QgYmUgdW5wbHVnZ2VkIC0gbm8gcmVtb3ZlICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCByYXJfaW5pdF9oYW5kbGVyKHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJhcl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhcl9leGl0X2hhbmRsZXIodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJhcl9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocmFyX2luaXRfaGFuZGxlcik7Cittb2R1bGVfZXhpdChyYXJfZXhpdF9oYW5kbGVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBSZXN0cmljdGVkIEFjY2VzcyBSZWdpb24gUmVnaXN0ZXIgRHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKaW5kZXggYmIyZjFmYi4uOTQzZjkwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21yc3QuaD4KICNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgogCiAvKiBJUEMgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgdHlwZXMgKi8KQEAgLTM4LDEwICszOCw2IEBACiAjZGVmaW5lIElQQ19DTURfUENOVFJMX1IgICAgICAxIC8qIFJlZ2lzdGVyIHJlYWQgKi8KICNkZWZpbmUgSVBDX0NNRF9QQ05UUkxfTSAgICAgIDIgLyogUmVnaXN0ZXIgcmVhZC1tb2RpZnktd3JpdGUgKi8KIAotLyogTWlzY2VsYW5lb3VzIENvbW1hbmQgaWRzICovCi0jZGVmaW5lIElQQ19DTURfSU5ESVJFQ1RfUkQgICAyIC8qIDMyYml0IGluZGlyZWN0IHJlYWQgKi8KLSNkZWZpbmUgSVBDX0NNRF9JTkRJUkVDVF9XUiAgIDUgLyogMzJiaXQgaW5kaXJlY3Qgd3JpdGUgKi8KLQogLyoKICAqIElQQyByZWdpc3RlciBzdW1tYXJ5CiAgKgpAQCAtNjIsOCArNTgsOCBAQAogCiAjZGVmaW5lIElQQ19CQVNFX0FERFIgICAgIDB4RkYxMUMwMDAJLyogSVBDMSBiYXNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KICNkZWZpbmUgSVBDX01BWF9BRERSICAgICAgMHgxMDAJCS8qIE1heGltdW0gSVBDIHJlZ2lzZXJzICovCi0jZGVmaW5lIElQQ19XV0JVRl9TSVpFICAgIDE2CQkvKiBJUEMgV3JpdGUgYnVmZmVyIFNpemUgKi8KLSNkZWZpbmUgSVBDX1JXQlVGX1NJWkUgICAgMTYJCS8qIElQQyBSZWFkIGJ1ZmZlciBTaXplICovCisjZGVmaW5lIElQQ19XV0JVRl9TSVpFICAgIDIwCQkvKiBJUEMgV3JpdGUgYnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgSVBDX1JXQlVGX1NJWkUgICAgMjAJCS8qIElQQyBSZWFkIGJ1ZmZlciBTaXplICovCiAjZGVmaW5lIElQQ19JMkNfQkFTRSAgICAgIDB4RkYxMkIwMDAJLyogSTJDIGNvbnRyb2wgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCiAjZGVmaW5lIElQQ19JMkNfTUFYX0FERFIgIDB4MTAJCS8qIE1heGltdW0gSTJDIHJlZ2lzZXJzICovCiAKQEAgLTc4LDEyICs3NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfc2N1X2lwY19kZXYgIGlwY2RldjsgLyogT25seSBvbmUgZm9yIG5vdyAqLwogCi1zdGF0aWMgaW50IHBsYXRmb3JtID0gMTsKLW1vZHVsZV9wYXJhbShwbGF0Zm9ybSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocGxhdGZvcm0sICIxIGZvciBtb29yZXN0b3duIHBsYXRmb3JtIik7Ci0KLQotCitzdGF0aWMgaW50IHBsYXRmb3JtOwkJLyogUGxhdGZvcm0gdHlwZSAqLwogCiAvKgogICogSVBDIFJlYWQgQnVmZmVyIChSZWFkIE9ubHkpOgpAQCAtMTE5LDI0ICsxMTAsNiBAQAogfQogCiAvKgotICogSVBDIGRlc3RpbmF0aW9uIFBvaW50ZXIgKFdyaXRlIE9ubHkpOgotICogVXNlIGNvbnRlbnQgYXMgcG9pbnRlciBmb3IgZGVzdGluYXRpb24gd3JpdGUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGlwY193cml0ZV9kcHRyKHUzMiBkYXRhKSAvKiBXcml0ZSBkcHRyIGRhdGEgKi8KLXsKLQl3cml0ZWwoZGF0YSwgaXBjZGV2LmlwY19iYXNlICsgMHgwQyk7Ci19Ci0KLS8qCi0gKiBJUEMgU291cmNlIFBvaW50ZXIgKFdyaXRlIE9ubHkpOgotICogVXNlIGNvbnRlbnQgYXMgcG9pbnRlciBmb3IgcmVhZCBsb2NhdGlvbgotKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcGNfd3JpdGVfc3B0cih1MzIgZGF0YSkgLyogV3JpdGUgZHB0ciBkYXRhICovCi17Ci0Jd3JpdGVsKGRhdGEsIGlwY2Rldi5pcGNfYmFzZSArIDB4MDgpOwotfQotCi0vKgogICogU3RhdHVzIFJlZ2lzdGVyIChSZWFkIE9ubHkpOgogICogRHJpdmVyIHdpbGwgcmVhZCB0aGlzIHJlZ2lzdGVyIHRvIGdldCB0aGUgcmVhZHkvYnVzeSBzdGF0dXMgb2YgdGhlIElQQwogICogYmxvY2sgYW5kIGVycm9yIHN0YXR1cyBvZiB0aGUgSVBDIGNvbW1hbmQgdGhhdCB3YXMganVzdCBwcm9jZXNzZWQgYnkgU0NVCkBAIC0xNTQsNyArMTI3LDcgQEAKIAlyZXR1cm4gcmVhZGIoaXBjZGV2LmlwY19iYXNlICsgSVBDX1JFQURfQlVGRkVSICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIGlubGluZSB1OCBpcGNfZGF0YV9yZWFkbCh1MzIgb2Zmc2V0KSAvKiBSZWFkIGlwYyB1MzIgZGF0YSAqLworc3RhdGljIGlubGluZSB1MzIgaXBjX2RhdGFfcmVhZGwodTMyIG9mZnNldCkgLyogUmVhZCBpcGMgdTMyIGRhdGEgKi8KIHsKIAlyZXR1cm4gcmVhZGwoaXBjZGV2LmlwY19iYXNlICsgSVBDX1JFQURfQlVGRkVSICsgb2Zmc2V0KTsKIH0KQEAgLTE3NSw2MiArMTQ4LDczIEBACiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCX0KLQlyZXR1cm4gKHN0YXR1cyA+PiAxKSAmIDE7CisJaWYgKChzdGF0dXMgPj4gMSkgJiAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOwogfQogCiAvKiBSZWFkL1dyaXRlIHBvd2VyIGNvbnRyb2woUE1JQyBpbiBMYW5nd2VsbCwgTVNJQyBpbiBQZW5XZWxsKSByZWdpc3RlcnMgKi8KIHN0YXRpYyBpbnQgcHdyX3JlZ19yZHdyKHUxNiAqYWRkciwgdTggKmRhdGEsIHUzMiBjb3VudCwgdTMyIG9wLCB1MzIgaWQpCiB7Ci0JaW50IG5jOworCWludCBpLCBuYywgYnl0ZXMsIGQ7CiAJdTMyIG9mZnNldCA9IDA7CiAJdTMyIGVyciA9IDA7Ci0JdTggY2J1ZltJUENfV1dCVUZfU0laRV0gPSB7ICdcMCcgfTsKKwl1OCBjYnVmW0lQQ19XV0JVRl9TSVpFXSA9IHsgfTsKIAl1MzIgKndidWYgPSAodTMyICopJmNidWY7CiAKIAltdXRleF9sb2NrKCZpcGNsb2NrKTsKKworCW1lbXNldChjYnVmLCAwLCBzaXplb2YoY2J1ZikpOworCiAJaWYgKGlwY2Rldi5wZGV2ID09IE5VTEwpIHsKIAkJbXV0ZXhfdW5sb2NrKCZpcGNsb2NrKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKHBsYXRmb3JtID09IDEpIHsKLQkJLyogRW50cnkgaXMgNCBieXRlcyBmb3IgcmVhZC93cml0ZSwgNSBieXRlcyBmb3IgcmVhZCBtb2RpZnkgKi8KLQkJZm9yIChuYyA9IDA7IG5jIDwgY291bnQ7IG5jKyspIHsKKwlpZiAocGxhdGZvcm0gIT0gTVJTVF9DUFVfQ0hJUF9QRU5XRUxMKSB7CisJCWJ5dGVzID0gMDsKKwkJZCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQljYnVmW2J5dGVzKytdID0gYWRkcltpXTsKKwkJCWNidWZbYnl0ZXMrK10gPSBhZGRyW2ldID4+IDg7CisJCQlpZiAoaWQgIT0gSVBDX0NNRF9QQ05UUkxfUikKKwkJCQljYnVmW2J5dGVzKytdID0gZGF0YVtkKytdOworCQkJaWYgKGlkID09IElQQ19DTURfUENOVFJMX00pCisJCQkJY2J1ZltieXRlcysrXSA9IGRhdGFbZCsrXTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJCWlwY19kYXRhX3dyaXRlbCh3YnVmW2kvNF0sIGkpOworCQlpcGNfY29tbWFuZChieXRlcyA8PCAxNiB8ICBpZCA8PCAxMiB8IDAgPDwgOCB8IG9wKTsKKwl9IGVsc2UgeworCQlmb3IgKG5jID0gMDsgbmMgPCBjb3VudDsgbmMrKywgb2Zmc2V0ICs9IDIpIHsKIAkJCWNidWZbb2Zmc2V0XSA9IGFkZHJbbmNdOwogCQkJY2J1ZltvZmZzZXQgKyAxXSA9IGFkZHJbbmNdID4+IDg7Ci0JCQlpZiAoaWQgIT0gSVBDX0NNRF9QQ05UUkxfUikKLQkJCQljYnVmW29mZnNldCArIDJdID0gZGF0YVtuY107Ci0JCQlpZiAoaWQgPT0gSVBDX0NNRF9QQ05UUkxfTSkgewotCQkJCWNidWZbb2Zmc2V0ICsgM10gPSBkYXRhW25jICsgMV07Ci0JCQkJb2Zmc2V0ICs9IDE7Ci0JCQl9Ci0JCQlvZmZzZXQgKz0gMzsKIAkJfQotCQlmb3IgKG5jID0gMCwgb2Zmc2V0ID0gMDsgbmMgPCBjb3VudDsgbmMrKywgb2Zmc2V0ICs9IDQpCi0JCQlpcGNfZGF0YV93cml0ZWwod2J1ZltuY10sIG9mZnNldCk7IC8qIFdyaXRlIHdidWZmICovCiAKLQl9IGVsc2UgewotCQlmb3IgKG5jID0gMCwgb2Zmc2V0ID0gMDsgbmMgPCBjb3VudDsgbmMrKywgb2Zmc2V0ICs9IDIpCi0JCQlpcGNfZGF0YV93cml0ZWwoYWRkcltuY10sIG9mZnNldCk7IC8qIFdyaXRlIGFkZHJlc3NlcyAqLwotCQlpZiAoaWQgIT0gSVBDX0NNRF9QQ05UUkxfUikgewotCQkJZm9yIChuYyA9IDA7IG5jIDwgY291bnQ7IG5jKyssIG9mZnNldCsrKQotCQkJCWlwY19kYXRhX3dyaXRlbChkYXRhW25jXSwgb2Zmc2V0KTsgLyogV3JpdGUgZGF0YSAqLwotCQkJaWYgKGlkID09IElQQ19DTURfUENOVFJMX00pCi0JCQkJaXBjX2RhdGFfd3JpdGVsKGRhdGFbbmMgKyAxXSwgb2Zmc2V0KTsgLyogTWFzayB2YWx1ZSovCisJCWlmIChpZCA9PSBJUENfQ01EX1BDTlRSTF9SKSB7CisJCQlmb3IgKG5jID0gMCwgb2Zmc2V0ID0gMDsgbmMgPCBjb3VudDsgbmMrKywgb2Zmc2V0ICs9IDQpCisJCQkJaXBjX2RhdGFfd3JpdGVsKHdidWZbbmNdLCBvZmZzZXQpOworCQkJaXBjX2NvbW1hbmQoKGNvdW50KjIpIDw8IDE2IHwgIGlkIDw8IDEyIHwgMCA8PCA4IHwgb3ApOworCQl9IGVsc2UgaWYgKGlkID09IElQQ19DTURfUENOVFJMX1cpIHsKKwkJCWZvciAobmMgPSAwOyBuYyA8IGNvdW50OyBuYysrLCBvZmZzZXQgKz0gMSkKKwkJCQljYnVmW29mZnNldF0gPSBkYXRhW25jXTsKKwkJCWZvciAobmMgPSAwLCBvZmZzZXQgPSAwOyBuYyA8IGNvdW50OyBuYysrLCBvZmZzZXQgKz0gNCkKKwkJCQlpcGNfZGF0YV93cml0ZWwod2J1ZltuY10sIG9mZnNldCk7CisJCQlpcGNfY29tbWFuZCgoY291bnQqMykgPDwgMTYgfCAgaWQgPDwgMTIgfCAwIDw8IDggfCBvcCk7CisJCX0gZWxzZSBpZiAoaWQgPT0gSVBDX0NNRF9QQ05UUkxfTSkgeworCQkJY2J1ZltvZmZzZXRdID0gZGF0YVswXTsKKwkJCWNidWZbb2Zmc2V0ICsgMV0gPSBkYXRhWzFdOworCQkJaXBjX2RhdGFfd3JpdGVsKHdidWZbMF0sIDApOyAvKiBXcml0ZSB3YnVmZiAqLworCQkJaXBjX2NvbW1hbmQoNCA8PCAxNiB8ICBpZCA8PCAxMiB8IDAgPDwgOCB8IG9wKTsKIAkJfQogCX0KIAotCWlmIChpZCAhPSBJUENfQ01EX1BDTlRSTF9NKQotCQlpcGNfY29tbWFuZCgoY291bnQgKiAzKSA8PCAxNiB8ICBpZCA8PCAxMiB8IDAgPDwgOCB8IG9wKTsKLQllbHNlCi0JCWlwY19jb21tYW5kKChjb3VudCAqIDQpIDw8IDE2IHwgIGlkIDw8IDEyIHwgMCA8PCA4IHwgb3ApOwotCiAJZXJyID0gYnVzeV9sb29wKCk7Ci0KIAlpZiAoaWQgPT0gSVBDX0NNRF9QQ05UUkxfUikgeyAvKiBSZWFkIHJidWYgKi8KIAkJLyogV29ya2Fyb3VuZDogdmFsdWVzIGFyZSByZWFkIGFzIDAgd2l0aG91dCBtZW1jcHlfZnJvbWlvICovCi0JCW1lbWNweV9mcm9taW8oY2J1ZiwgaXBjZGV2LmlwY19iYXNlICsgSVBDX1JFQURfQlVGRkVSLCAxNik7Ci0JCWlmIChwbGF0Zm9ybSA9PSAxKSB7CisJCW1lbWNweV9mcm9taW8oY2J1ZiwgaXBjZGV2LmlwY19iYXNlICsgMHg5MCwgMTYpOworCQlpZiAocGxhdGZvcm0gIT0gTVJTVF9DUFVfQ0hJUF9QRU5XRUxMKSB7CiAJCQlmb3IgKG5jID0gMCwgb2Zmc2V0ID0gMjsgbmMgPCBjb3VudDsgbmMrKywgb2Zmc2V0ICs9IDMpCiAJCQkJZGF0YVtuY10gPSBpcGNfZGF0YV9yZWFkYihvZmZzZXQpOwogCQl9IGVsc2UgewpAQCAtNDA1LDcwICszODksNiBAQAogRVhQT1JUX1NZTUJPTChpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3Rlcik7CiAKIC8qKgotICoJaW50ZWxfc2N1X2lwY19yZWdpc3Rlcl9yZWFkCS0JMzJiaXQgaW5kaXJlY3QgcmVhZAotICoJQGFkZHI6IHJlZ2lzdGVyIGFkZHJlc3MKLSAqCUB2YWx1ZTogMzJiaXQgdmFsdWUgcmV0dXJuCi0gKgotICoJUGVyZm9ybXMgSUEgMzIgYml0IGluZGlyZWN0IHJlYWQsIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhbgotICoJZXJyb3IgY29kZS4KLSAqCi0gKglDYW4gYmUgdXNlZCB3aGVuIFNDQ0IoU3lzdGVtIENvbnRyb2xsZXIgQ29uZmlndXJhdGlvbiBCbG9jaykgcmVnaXN0ZXIKLSAqCUhSSU0oSG9ub3IgUmVzdHJpY3RlZCBJUEMgTWVzc2FnZXMpIGlzIHNldCAoYml0IDIzKQotICoKLSAqCVRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLiBMb2NraW5nIGZvciBTQ1UgYWNjZXNzZXMgaXMgaGFuZGxlZCBmb3IKLSAqCXRoZSBjYWxsZXIuCi0gKi8KLWludCBpbnRlbF9zY3VfaXBjX3JlZ2lzdGVyX3JlYWQodTMyIGFkZHIsIHUzMiAqdmFsdWUpCi17Ci0JdTMyIGVyciA9IDA7Ci0KLQltdXRleF9sb2NrKCZpcGNsb2NrKTsKLQlpZiAoaXBjZGV2LnBkZXYgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJmlwY2xvY2spOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaXBjX3dyaXRlX3NwdHIoYWRkcik7Ci0JaXBjX2NvbW1hbmQoNCA8PCAxNiB8IElQQ19DTURfSU5ESVJFQ1RfUkQpOwotCWVyciA9IGJ1c3lfbG9vcCgpOwotCSp2YWx1ZSA9IGlwY19kYXRhX3JlYWRsKDApOwotCW11dGV4X3VubG9jaygmaXBjbG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0woaW50ZWxfc2N1X2lwY19yZWdpc3Rlcl9yZWFkKTsKLQotLyoqCi0gKglpbnRlbF9zY3VfaXBjX3JlZ2lzdGVyX3dyaXRlCS0JMzJiaXQgaW5kaXJlY3Qgd3JpdGUKLSAqCUBhZGRyOiByZWdpc3RlciBhZGRyZXNzCi0gKglAdmFsdWU6IDMyYml0IHZhbHVlIHRvIHdyaXRlCi0gKgotICoJUGVyZm9ybXMgSUEgMzIgYml0IGluZGlyZWN0IHdyaXRlLCByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4KLSAqCWVycm9yIGNvZGUuCi0gKgotICoJQ2FuIGJlIHVzZWQgd2hlbiBTQ0NCKFN5c3RlbSBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24gQmxvY2spIHJlZ2lzdGVyCi0gKglIUklNKEhvbm9yIFJlc3RyaWN0ZWQgSVBDIE1lc3NhZ2VzKSBpcyBzZXQgKGJpdCAyMykKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4gTG9ja2luZyBmb3IgU0NVIGFjY2Vzc2VzIGlzIGhhbmRsZWQgZm9yCi0gKgl0aGUgY2FsbGVyLgotICovCi1pbnQgaW50ZWxfc2N1X2lwY19yZWdpc3Rlcl93cml0ZSh1MzIgYWRkciwgdTMyIHZhbHVlKQotewotCXUzMiBlcnIgPSAwOwotCi0JbXV0ZXhfbG9jaygmaXBjbG9jayk7Ci0JaWYgKGlwY2Rldi5wZGV2ID09IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZpcGNsb2NrKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlwY193cml0ZV9kcHRyKGFkZHIpOwotCWlwY19kYXRhX3dyaXRlbCh2YWx1ZSwgMCk7Ci0JaXBjX2NvbW1hbmQoNCA8PCAxNiB8IElQQ19DTURfSU5ESVJFQ1RfV1IpOwotCWVyciA9IGJ1c3lfbG9vcCgpOwotCW11dGV4X3VubG9jaygmaXBjbG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0woaW50ZWxfc2N1X2lwY19yZWdpc3Rlcl93cml0ZSk7Ci0KLS8qKgogICoJaW50ZWxfc2N1X2lwY19zaW1wbGVfY29tbWFuZAktCXNlbmQgYSBzaW1wbGUgY29tbWFuZAogICoJQGNtZDogY29tbWFuZAogICoJQHN1Yjogc3ViIHR5cGUKQEAgLTUyNCw3ICs0NDQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpbmxlbjsgaSsrKQogCQlpcGNfZGF0YV93cml0ZWwoKmluKyssIDQgKiBpKTsKIAotCWlwY19jb21tYW5kKChzdWIgPDwgMTIpIHwgY21kIHwgKGlubGVuIDw8IDE4KSk7CisJaXBjX2NvbW1hbmQoKGlubGVuIDw8IDE2KSB8IChzdWIgPDwgMTIpIHwgY21kKTsKIAllcnIgPSBidXN5X2xvb3AoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBvdXRsZW47IGkrKykKQEAgLTgwMyw2ICs3MjMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkc1tdID0gewogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgwZSl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgyYSl9LAogCXsgMCx9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZHMpOwpAQCAtODE3LDYgKzczOCw5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGludGVsX3NjdV9pcGNfaW5pdCh2b2lkKQogeworCXBsYXRmb3JtID0gbXJzdF9pZGVudGlmeV9jcHUoKTsKKwlpZiAocGxhdGZvcm0gPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJcmV0dXJuICBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpcGNfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXNpLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXNpLWxhcHRvcC5jCmluZGV4IGFmZDc2MmIuLjdlOWJiNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L21zaS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9tc2ktbGFwdG9wLmMKQEAgLTQzNCw3ICs0MzQsNyBAQAogewogCXByaW50ayhLRVJOX0lORk8gIm1zaS1sYXB0b3A6IElkZW50aWZpZWQgbGFwdG9wIG1vZGVsICclcycuXG4iLAogCSAgICAgICBpZC0+aWRlbnQpOwotCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBtc2lfZG1pX3RhYmxlW10gPSB7CkBAIC01NjIsMTUgKzU2MiwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHJma2lsbF9vcHMgcmZraWxsX2JsdWV0b290aF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJma2lsbF9vcHMgcmZraWxsX2JsdWV0b290aF9vcHMgPSB7CiAJLnNldF9ibG9jayA9IHJma2lsbF9ibHVldG9vdGhfc2V0CiB9OwogCi1zdGF0aWMgc3RydWN0IHJma2lsbF9vcHMgcmZraWxsX3dsYW5fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCByZmtpbGxfb3BzIHJma2lsbF93bGFuX29wcyA9IHsKIAkuc2V0X2Jsb2NrID0gcmZraWxsX3dsYW5fc2V0CiB9OwogCi1zdGF0aWMgc3RydWN0IHJma2lsbF9vcHMgcmZraWxsX3RocmVlZ19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJma2lsbF9vcHMgcmZraWxsX3RocmVlZ19vcHMgPSB7CiAJLnNldF9ibG9jayA9IHJma2lsbF90aHJlZWdfc2V0CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9tc2ktd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9tc2ktd21pLmMKaW5kZXggZDE3MzYwMC4uNDJhNTQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXNpLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L21zaS13bWkuYwpAQCAtNTcsNyArNTcsNyBAQAogfTsKIHN0YXRpYyBrdGltZV90IGxhc3RfcHJlc3NlZFtBUlJBWV9TSVpFKG1zaV93bWlfa2V5bWFwKSAtIDFdOwogCi1zdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0Oworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQ7CiAKIHN0YXRpYyBpbnQgYmFja2xpZ2h0X21hcFtdID0geyAweDAwLCAweDMzLCAweDY2LCAweDk5LCAweENDLCAweEZGIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3BhbmFzb25pYy1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3BhbmFzb25pYy1sYXB0b3AuYwppbmRleCAyZmI5YTMyLi5lYzAxYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9wYW5hc29uaWMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvcGFuYXNvbmljLWxhcHRvcC5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwY2MtPmhhbmRsZSwgTUVUSE9EX0hLRVlfU1NFVCwKIAkJCQkgICAgICAmcGFyYW1zLCBOVUxMKTsKIAotCXJldHVybiBzdGF0dXMgPT0gQUVfT0s7CisJcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spID8gMCA6IC1FSU87CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFjcGlfcGNjX2dldF9zcXR5KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQpAQCAtNTg2LDcgKzU4Niw2IEBACiBzdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHBjY19hY3BpICpwY2MgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAlpZiAoZGV2aWNlID09IE5VTEwgfHwgcGNjID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTk0LDkgKzU5Myw3IEBACiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlN0aWNreSBtb2RlIHJlc3RvcmU6ICVkXG4iLAogCQkJICBwY2MtPnN0aWNreV9tb2RlKSk7CiAKLQlzdGF0dXMgPSBhY3BpX3BjY193cml0ZV9zc2V0KHBjYywgU0lORl9TVElDS1lfS0VZLCBwY2MtPnN0aWNreV9tb2RlKTsKLQotCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPyAwIDogLUVJTlZBTDsKKwlyZXR1cm4gYWNwaV9wY2Nfd3JpdGVfc3NldChwY2MsIFNJTkZfU1RJQ0tZX0tFWSwgcGNjLT5zdGlja3lfbW9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCmluZGV4IDEzODdjNWYuLmUzMTU0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwpAQCAtNTYxLDggKzU2MSw3IEBACiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X3BmX3VzZXJzKSkKIAkJcmV0dXJuOwogCi0JcGxhdGZvcm1fZGV2aWNlX2RlbChzb255X3BmX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc29ueV9wZl9kZXZpY2UpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb255X3BmX2RyaXZlcik7CiB9CiAKQEAgLTExOTYsOSArMTE5NSwxMyBAQAogCX0KIAogCWRldmljZV9lbnVtID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIGJ1ZmZlci5wb2ludGVyOwotCWlmICghZGV2aWNlX2VudW0gfHwgZGV2aWNlX2VudW0tPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgU04wNiByZXR1cm4gb2JqZWN0IDB4JS4yeFxuIiwKLQkJCQlkZXZpY2VfZW51bS0+dHlwZSk7CisJaWYgKCFkZXZpY2VfZW51bSkgeworCQlwcl9lcnIoIkludmFsaWQgU04wNiByZXR1cm4gb2JqZWN0XG4iKTsKKwkJZ290byBvdXRfbm9fZW51bTsKKwl9CisJaWYgKGRldmljZV9lbnVtLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIFNOMDYgcmV0dXJuIG9iamVjdCB0eXBlIDB4JS4yeFxuIiwKKwkJICAgICAgIGRldmljZV9lbnVtLT50eXBlKTsKIAkJZ290byBvdXRfbm9fZW51bTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCA0YmRiMTM3Li41ZDYxMTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC01ODM4LDc1ICs1ODM4LDYgQEAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFQyBEdW1wIHN1YmRyaXZlcgotICovCi0KLXN0YXRpYyB1OCBlY2R1bXBfcmVnc1syNTZdOwotCi1zdGF0aWMgaW50IGVjZHVtcF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqbSkKLXsKLQlpbnQgaSwgajsKLQl1OCB2OwotCi0Jc2VxX3ByaW50ZihtLCAiRUMgICAgICAiCi0JCSAgICAgICAiICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDciCi0JCSAgICAgICAiICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGZcbiIpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMTYpIHsKLQkJc2VxX3ByaW50ZihtLCAiRUMgMHglMDJ4OiIsIGkpOwotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgewotCQkJaWYgKCFhY3BpX2VjX3JlYWQoaSArIGosICZ2KSkKLQkJCQlicmVhazsKLQkJCWlmICh2ICE9IGVjZHVtcF9yZWdzW2kgKyBqXSkKLQkJCQlzZXFfcHJpbnRmKG0sICIgKiUwMngiLCB2KTsKLQkJCWVsc2UKLQkJCQlzZXFfcHJpbnRmKG0sICIgICUwMngiLCB2KTsKLQkJCWVjZHVtcF9yZWdzW2kgKyBqXSA9IHY7Ci0JCX0KLQkJc2VxX3B1dGMobSwgJ1xuJyk7Ci0JCWlmIChqICE9IDE2KQotCQkJYnJlYWs7Ci0JfQotCi0JLyogVGhlc2UgYXJlIHdheSB0b28gZGFuZ2Vyb3VzIHRvIGFkdmVydGlzZSBvcGVubHkuLi4gKi8KLSNpZiAwCi0Jc2VxX3ByaW50ZihtLCAiY29tbWFuZHM6XHQweDxvZmZzZXQ+IDB4PHZhbHVlPiIKLQkJICAgICAgICIgKDxvZmZzZXQ+IGlzIDAwLWZmLCA8dmFsdWU+IGlzIDAwLWZmKVxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiY29tbWFuZHM6XHQweDxvZmZzZXQ+IDx2YWx1ZT4gICIKLQkJICAgICAgICIgKDxvZmZzZXQ+IGlzIDAwLWZmLCA8dmFsdWU+IGlzIDAtMjU1KVxuIik7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlY2R1bXBfd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQlpbnQgaSwgdjsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzc2NhbmYoY21kLCAiMHgleCAweCV4IiwgJmksICZ2KSA9PSAyKSB7Ci0JCQkvKiBpIGFuZCB2IHNldCAqLwotCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICIweCV4ICV1IiwgJmksICZ2KSA9PSAyKSB7Ci0JCQkvKiBpIGFuZCB2IHNldCAqLwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoaSA+PSAwICYmIGkgPCAyNTYgJiYgdiA+PSAwICYmIHYgPCAyNTYpIHsKLQkJCWlmICghYWNwaV9lY193cml0ZShpLCB2KSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGVjZHVtcF9kcml2ZXJfZGF0YSA9IHsKLQkubmFtZSA9ICJlY2R1bXAiLAotCS5yZWFkID0gZWNkdW1wX3JlYWQsCi0JLndyaXRlID0gZWNkdW1wX3dyaXRlLAotCS5mbGFncy5leHBlcmltZW50YWwgPSAxLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEJhY2tsaWdodC9icmlnaHRuZXNzIHN1YmRyaXZlcgogICovCiAKQEAgLTg4ODMsOSArODgxNCw2IEBACiAJCS5kYXRhID0gJnRoZXJtYWxfZHJpdmVyX2RhdGEsCiAJfSwKIAl7Ci0JCS5kYXRhID0gJmVjZHVtcF9kcml2ZXJfZGF0YSwKLQl9LAotCXsKIAkJLmluaXQgPSBicmlnaHRuZXNzX2luaXQsCiAJCS5kYXRhID0gJmJyaWdodG5lc3NfZHJpdmVyX2RhdGEsCiAJfSwKQEAgLTg5OTMsNyArODkyMSw2IEBACiBUUEFDUElfUEFSQU0oY21vcyk7CiBUUEFDUElfUEFSQU0obGVkKTsKIFRQQUNQSV9QQVJBTShiZWVwKTsKLVRQQUNQSV9QQVJBTShlY2R1bXApOwogVFBBQ1BJX1BBUkFNKGJyaWdodG5lc3MpOwogVFBBQ1BJX1BBUkFNKHZvbHVtZSk7CiBUUEFDUElfUEFSQU0oZmFuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9zaGliYV9hY3BpLmMKaW5kZXggMzdhYTE0Ny4uN2Q2N2E0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9zaGliYV9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9zaGliYV9hY3BpLmMKQEAgLTQsNiArNCw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IEpvaG4gQmVsbW9udGUKICAqICBDb3B5cmlnaHQgKEMpIDIwMDggUGhpbGlwIExhbmdkYWxlCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFBpZXJyZSBEdWNyb3F1ZXQKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDcsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xMjksNiArMTMxLDggQEAKIAogc3RhdGljIHN0cnVjdCBrZXlfZW50cnkgdG9zaGliYV9hY3BpX2tleW1hcFtdICA9IHsKIAl7S0VfS0VZLCAweDEwMSwgS0VZX01VVEV9LAorCXtLRV9LRVksIDB4MTAyLCBLRVlfWk9PTU9VVH0sCisJe0tFX0tFWSwgMHgxMDMsIEtFWV9aT09NSU59LAogCXtLRV9LRVksIDB4MTNiLCBLRVlfQ09GRkVFfSwKIAl7S0VfS0VZLCAweDEzYywgS0VZX0JBVFRFUll9LAogCXtLRV9LRVksIDB4MTNkLCBLRVlfU0xFRVB9LApAQCAtMjg1LDYgKzI4OSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcF9kZXY7CiAJc3RydWN0IHJma2lsbCAqYnRfcmZrOwogCXN0cnVjdCBpbnB1dF9kZXYgKmhvdGtleV9kZXY7CisJaW50IGlsbHVtaW5hdGlvbl9pbnN0YWxsZWQ7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCiAJY29uc3QgY2hhciAqYnRfbmFtZTsKQEAgLTI5Miw2ICsyOTcsMTEwIEBACiAJc3RydWN0IG11dGV4IG11dGV4OwogfTsKIAorLyogSWxsdW1pbmF0aW9uIHN1cHBvcnQgKi8KK3N0YXRpYyBpbnQgdG9zaGliYV9pbGx1bWluYXRpb25fYXZhaWxhYmxlKHZvaWQpCit7CisJdTMyIGluW0hDSV9XT1JEU10gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1MzIgb3V0W0hDSV9XT1JEU107CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaW5bMF0gPSAweGYxMDA7CisJc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKE1ZX0lORk8gIklsbHVtaW5hdGlvbiBkZXZpY2Ugbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAwOworCX0KKwlpblswXSA9IDB4ZjQwMDsKKwlzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB0b3NoaWJhX2lsbHVtaW5hdGlvbl9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCQkgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKK3sKKwl1MzIgaW5bSENJX1dPUkRTXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCXUzMiBvdXRbSENJX1dPUkRTXTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBGaXJzdCByZXF1ZXN0IDogaW5pdGlhbGl6ZSBjb21tdW5pY2F0aW9uLiAqLworCWluWzBdID0gMHhmMTAwOworCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhNWV9JTkZPICJJbGx1bWluYXRpb24gZGV2aWNlIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGJyaWdodG5lc3MpIHsKKwkJLyogU3dpdGNoIHRoZSBpbGx1bWluYXRpb24gb24gKi8KKwkJaW5bMF0gPSAweGY0MDA7CisJCWluWzFdID0gMHgxNGU7CisJCWluWzJdID0gMTsKKwkJc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoTVlfSU5GTyAiQUNQSSBjYWxsIGZvciBpbGx1bWluYXRpb24gZmFpbGVkLlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQkvKiBTd2l0Y2ggdGhlIGlsbHVtaW5hdGlvbiBvZmYgKi8KKwkJaW5bMF0gPSAweGY0MDA7CisJCWluWzFdID0gMHgxNGU7CisJCWluWzJdID0gMDsKKwkJc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoTVlfSU5GTyAiQUNQSSBjYWxsIGZvciBpbGx1bWluYXRpb24gZmFpbGVkLlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBMYXN0IHJlcXVlc3QgOiBjbG9zZSBjb21tdW5pY2F0aW9uLiAqLworCWluWzBdID0gMHhmMjAwOworCWluWzFdID0gMDsKKwlpblsyXSA9IDA7CisJaGNpX3Jhdyhpbiwgb3V0KTsKK30KKworc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgdG9zaGliYV9pbGx1bWluYXRpb25fZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYpCit7CisJdTMyIGluW0hDSV9XT1JEU10gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1MzIgb3V0W0hDSV9XT1JEU107CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWVudW0gbGVkX2JyaWdodG5lc3MgcmVzdWx0OworCisJLyrCoEZpcnN0IHJlcXVlc3QgOiBpbml0aWFsaXplIGNvbW11bmljYXRpb24uICovCisJaW5bMF0gPSAweGYxMDA7CisJc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKE1ZX0lORk8gIklsbHVtaW5hdGlvbiBkZXZpY2Ugbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiBMRURfT0ZGOworCX0KKworCS8qIENoZWNrIHRoZSBpbGx1bWluYXRpb24gKi8KKwlpblswXSA9IDB4ZjMwMDsKKwlpblsxXSA9IDB4MTRlOworCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhNWV9JTkZPICJBQ1BJIGNhbGwgZm9yIGlsbHVtaW5hdGlvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIExFRF9PRkY7CisJfQorCisJcmVzdWx0ID0gb3V0WzJdID8gTEVEX0ZVTEwgOiBMRURfT0ZGOworCisJLyogTGFzdCByZXF1ZXN0IDogY2xvc2UgY29tbXVuaWNhdGlvbi4gKi8KKwlpblswXSA9IDB4ZjIwMDsKKwlpblsxXSA9IDA7CisJaW5bMl0gPSAwOworCWhjaV9yYXcoaW4sIG91dCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiB0b3NoaWJhX2xlZCA9IHsKKwkubmFtZSAgICAgICAgICAgPSAidG9zaGliYTo6aWxsdW1pbmF0aW9uIiwKKwkubWF4X2JyaWdodG5lc3MgPSAxLAorCS5icmlnaHRuZXNzX3NldCA9IHRvc2hpYmFfaWxsdW1pbmF0aW9uX3NldCwKKwkuYnJpZ2h0bmVzc19nZXQgPSB0b3NoaWJhX2lsbHVtaW5hdGlvbl9nZXQsCit9OworCiBzdGF0aWMgc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgdG9zaGliYV9hY3BpID0gewogCS5idF9uYW1lID0gIlRvc2hpYmEgQmx1ZXRvb3RoIiwKIH07CkBAIC03MjAsMjUgKzgyOSwyMiBAQAogCiAjZGVmaW5lIFBST0NfVE9TSElCQQkJInRvc2hpYmEiCiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgYWRkX2RldmljZSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV90b3NoaWJhX3Byb2NfZW50cmllcyh2b2lkKQogewogCXByb2NfY3JlYXRlKCJsY2QiLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwgJmxjZF9wcm9jX2ZvcHMpOwogCXByb2NfY3JlYXRlKCJ2aWRlbyIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLCAmdmlkZW9fcHJvY19mb3BzKTsKIAlwcm9jX2NyZWF0ZSgiZmFuIiwgU19JUlVHTyB8IFNfSVdVU1IsIHRvc2hpYmFfcHJvY19kaXIsICZmYW5fcHJvY19mb3BzKTsKIAlwcm9jX2NyZWF0ZSgia2V5cyIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLCAma2V5c19wcm9jX2ZvcHMpOwogCXByb2NfY3JlYXRlKCJ2ZXJzaW9uIiwgU19JUlVHTywgdG9zaGliYV9wcm9jX2RpciwgJnZlcnNpb25fcHJvY19mb3BzKTsKLQotCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIHJlbW92ZV9kZXZpY2Uodm9pZCkKK3N0YXRpYyB2b2lkIHJlbW92ZV90b3NoaWJhX3Byb2NfZW50cmllcyh2b2lkKQogewogCXJlbW92ZV9wcm9jX2VudHJ5KCJsY2QiLCB0b3NoaWJhX3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgidmlkZW8iLCB0b3NoaWJhX3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgiZmFuIiwgdG9zaGliYV9wcm9jX2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImtleXMiLCB0b3NoaWJhX3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgidmVyc2lvbiIsIHRvc2hpYmFfcHJvY19kaXIpOwotCXJldHVybiBBRV9PSzsKIH0KIAogc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHRvc2hpYmFfYmFja2xpZ2h0X2RhdGEgPSB7CkBAIC05MDYsNyArMTAxMiw3IEBACiAJaWYgKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSkKIAkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSk7CiAKLQlyZW1vdmVfZGV2aWNlKCk7CisJcmVtb3ZlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKCk7CiAKIAlpZiAodG9zaGliYV9wcm9jX2RpcikKIAkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKQEAgLTkxNCw2ICsxMDIwLDkgQEAKIAlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcih0b3NoaWJhX2FjcGkuaGFuZGxlLCBBQ1BJX0RFVklDRV9OT1RJRlksCiAJCQkJICAgdG9zaGliYV9hY3BpX25vdGlmeSk7CiAKKwlpZiAodG9zaGliYV9hY3BpLmlsbHVtaW5hdGlvbl9pbnN0YWxsZWQpCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ0b3NoaWJhX2xlZCk7CisKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0b3NoaWJhX2FjcGkucF9kZXYpOwogCiAJcmV0dXJuOwpAQCAtOTIxLDcgKzEwMzAsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0b3NoaWJhX2FjcGlfaW5pdCh2b2lkKQogewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXUzMiBoY2lfcmVzdWx0OwogCWJvb2wgYnRfcHJlc2VudDsKIAlpbnQgcmV0ID0gMDsKQEAgLTk2OSwxMSArMTA3Nyw3IEBACiAJCXRvc2hpYmFfYWNwaV9leGl0KCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IGFkZF9kZXZpY2UoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQl0b3NoaWJhX2FjcGlfZXhpdCgpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwkJY3JlYXRlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKCk7CiAJfQogCiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBIQ0lfTENEX0JSSUdIVE5FU1NfTEVWRUxTIC0gMTsKQEAgLTEwMTMsNiArMTExNywxMyBAQAogCQl9CiAJfQogCisJdG9zaGliYV9hY3BpLmlsbHVtaW5hdGlvbl9pbnN0YWxsZWQgPSAwOworCWlmICh0b3NoaWJhX2lsbHVtaW5hdGlvbl9hdmFpbGFibGUoKSkgeworCQlpZiAoIWxlZF9jbGFzc2Rldl9yZWdpc3RlcigmKHRvc2hpYmFfYWNwaS5wX2Rldi0+ZGV2KSwKKwkJCQkJICAgJnRvc2hpYmFfbGVkKSkKKwkJCXRvc2hpYmFfYWNwaS5pbGx1bWluYXRpb25faW5zdGFsbGVkID0gMTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwppbmRleCBlNGVhYTE0Li5iMjk3OGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwpAQCAtNTE4LDggKzUxOCwxMyBAQAogewogCXN0cnVjdCBhY3BpX2J1ZmZlciByZXNwb25zZSA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKKwlzdGF0dXMgPSB3bWlfZ2V0X2V2ZW50X2RhdGEodmFsdWUsICZyZXNwb25zZSk7CisJaWYgKHN0YXR1cyAhPSBBRV9PSykgeworCQlwcmludGsoS0VSTl9JTkZPICJ3bWk6IGJhZCBldmVudCBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KIAogCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKXJlc3BvbnNlLnBvaW50ZXI7CiAKQEAgLTU0Myw2ICs1NDgsNyBAQAogCWRlZmF1bHQ6CiAJCXByaW50aygib2JqZWN0IHR5cGUgMHglWFxuIiwgb2JqLT50eXBlKTsKIAl9CisJa2ZyZWUob2JqKTsKIH0KIAogLyoqCkBAIC04MDQsNyArODEwLDcgQEAKIC8qCiAgKiBQYXJzZSB0aGUgX1dERyBtZXRob2QgZm9yIHRoZSBHVUlEIGRhdGEgYmxvY2tzCiAgKi8KLXN0YXRpYyBfX2luaXQgYWNwaV9zdGF0dXMgcGFyc2Vfd2RnKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBwYXJzZV93ZGcoYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXQgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CkBAIC04MjcsOCArODMzLDEwIEBACiAJdG90YWwgPSBvYmotPmJ1ZmZlci5sZW5ndGggLyBzaXplb2Yoc3RydWN0IGd1aWRfYmxvY2spOwogCiAJZ2Jsb2NrID0ga21lbWR1cChvYmotPmJ1ZmZlci5wb2ludGVyLCBvYmotPmJ1ZmZlci5sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghZ2Jsb2NrKQotCQlyZXR1cm4gQUVfTk9fTUVNT1JZOworCWlmICghZ2Jsb2NrKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBvdXRfZnJlZV9wb2ludGVyOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7CiAJCS8qCkBAIC04NDgsOCArODU2LDEwIEBACiAJCQl3bWlfZHVtcF93ZGcoJmdibG9ja1tpXSk7CiAKIAkJd2Jsb2NrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdtaV9ibG9jayksIEdGUF9LRVJORUwpOwotCQlpZiAoIXdibG9jaykKLQkJCXJldHVybiBBRV9OT19NRU1PUlk7CisJCWlmICghd2Jsb2NrKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIG91dF9mcmVlX2dibG9jazsKKwkJfQogCiAJCXdibG9jay0+Z2Jsb2NrID0gZ2Jsb2NrW2ldOwogCQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKQEAgLTg2MCw4ICs4NzAsMTAgQEAKIAkJbGlzdF9hZGRfdGFpbCgmd2Jsb2NrLT5saXN0LCAmd21pX2Jsb2Nrcy5saXN0KTsKIAl9CiAKLQlrZnJlZShvdXQucG9pbnRlcik7CitvdXRfZnJlZV9nYmxvY2s6CiAJa2ZyZWUoZ2Jsb2NrKTsKK291dF9mcmVlX3BvaW50ZXI6CisJa2ZyZWUob3V0LnBvaW50ZXIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTk0Nyw3ICs5NTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3dtaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfd21pX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50IHJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9jb3JlLmMKaW5kZXggNWRiYTkwOS4uODhiM2NkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2NvcmUuYwpAQCAtMTY0LDYgKzE2NCw5IEBACiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnBucF9nbG9iYWwpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+cHJvdG9jb2xfbGlzdCwgJmRldi0+cHJvdG9jb2wtPmRldmljZXMpOwogCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CisJaWYgKGRldi0+cHJvdG9jb2wtPmNhbl93YWtldXApCisJCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJmRldi0+ZGV2LAorCQkJCWRldi0+cHJvdG9jb2wtPmNhbl93YWtldXAoZGV2KSk7CiAJcmV0dXJuIGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCmluZGV4IGY3ZmY2MjguLmRjNGUzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCkBAIC0xMjIsMTcgKzEyMiwzNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKK3N0YXRpYyBib29sIHBucGFjcGlfY2FuX3dha2V1cChzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSBkZXYtPmRhdGE7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gYWNwaV9kZXYtPmhhbmRsZTsKKworCXJldHVybiBhY3BpX2J1c19jYW5fd2FrZXVwKGhhbmRsZSk7Cit9CisKIHN0YXRpYyBpbnQgcG5wYWNwaV9zdXNwZW5kKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gZGV2LT5kYXRhOwogCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFjcGlfZGV2LT5oYW5kbGU7CiAJaW50IHBvd2VyX3N0YXRlOwogCisJaWYgKGRldmljZV9jYW5fd2FrZXVwKCZkZXYtPmRldikpIHsKKwkJaW50IHJjID0gYWNwaV9wbV9kZXZpY2Vfc2xlZXBfd2FrZSgmZGV2LT5kZXYsCisJCQkJZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KSk7CisKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KIAlwb3dlcl9zdGF0ZSA9IGFjcGlfcG1fZGV2aWNlX3NsZWVwX3N0YXRlKCZkZXYtPmRldiwgTlVMTCk7CiAJaWYgKHBvd2VyX3N0YXRlIDwgMCkKIAkJcG93ZXJfc3RhdGUgPSAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pID8KIAkJCQlBQ1BJX1NUQVRFX0QwIDogQUNQSV9TVEFURV9EMzsKIAorCS8qIGFjcGlfYnVzX3NldF9wb3dlcigpIG9mdGVuIGZhaWxzIChrZXlib2FyZCBwb3J0IGNhbid0IGJlCisJICogcG93ZXJlZC1kb3duPyksIGFuZCBpbiBhbnkgY2FzZSwgb3VyIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkCisJICogYnkgcG5wX2J1c19zdXNwZW5kKCkuICBIZW5jZSB3ZSBkb24ndCByZXZlcnQgdGhlIHdha2V1cAorCSAqIHNldHRpbmcgaWYgdGhlIHNldF9wb3dlciBmYWlscy4KKwkgKi8KIAlyZXR1cm4gYWNwaV9idXNfc2V0X3Bvd2VyKGhhbmRsZSwgcG93ZXJfc3RhdGUpOwogfQogCkBAIC0xNDEsNiArMTYxLDggQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gZGV2LT5kYXRhOwogCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFjcGlfZGV2LT5oYW5kbGU7CiAKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KSkKKwkJYWNwaV9wbV9kZXZpY2Vfc2xlZXBfd2FrZSgmZGV2LT5kZXYsIGZhbHNlKTsKIAlyZXR1cm4gYWNwaV9idXNfc2V0X3Bvd2VyKGhhbmRsZSwgQUNQSV9TVEFURV9EMCk7CiB9CiAjZW5kaWYKQEAgLTE1MSw2ICsxNzMsNyBAQAogCS5zZXQJID0gcG5wYWNwaV9zZXRfcmVzb3VyY2VzLAogCS5kaXNhYmxlID0gcG5wYWNwaV9kaXNhYmxlX3Jlc291cmNlcywKICNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAorCS5jYW5fd2FrZXVwID0gcG5wYWNwaV9jYW5fd2FrZXVwLAogCS5zdXNwZW5kID0gcG5wYWNwaV9zdXNwZW5kLAogCS5yZXN1bWUgPSBwbnBhY3BpX3Jlc3VtZSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IDhlOWJhMTcuLjFlNTUwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTE0Miw0ICsxNDIsMTUgQEAKIAloZWxwCiAJIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgTlhQIFBDRjUwNjMzIE1haW4gQmF0dGVyeSBDaGFyZ2VyLgogCitjb25maWcgQkFUVEVSWV9KWjQ3NDAKKwl0cmlzdGF0ZSAiSW5nZW5pYyBKWjQ3NDAgYmF0dGVyeSIKKwlkZXBlbmRzIG9uIE1BQ0hfSlo0NzQwCisJZGVwZW5kcyBvbiBNRkRfSlo0NzQwX0FEQworCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBvbiBJbmdlbmljIEpaNDc0MCBiYXNlZAorCSAgYm9hcmRzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBqejQ3NDAtYmF0dGVyeS4KKwogZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCmluZGV4IDAwMDUwODAuLmNmOTUwMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQpAQCAtMzQsMyArMzQsNCBAQAogb2JqLSQoQ09ORklHX0JBVFRFUllfTUFYMTcwNDApCSs9IG1heDE3MDQwX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfWjIpCSs9IHoyX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0NIQVJHRVJfUENGNTA2MzMpCSs9IHBjZjUwNjMzLWNoYXJnZXIubworb2JqLSQoQ09ORklHX0JBVFRFUllfSlo0NzQwKQkrPSBqejQ3NDAtYmF0dGVyeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RzMjc4Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2RzMjc4Ml9iYXR0ZXJ5LmMKaW5kZXggMmFmYmVlYy4uODRkM2M0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9kczI3ODJfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZHMyNzgyX2JhdHRlcnkuYwpAQCAtNDMsMTAgKzQzLDkgQEAKIHN0cnVjdCBkczI3OHhfaW5mbzsKIAogc3RydWN0IGRzMjc4eF9iYXR0ZXJ5X29wcyB7Ci0JaW50CSgqZ2V0X2N1cnJlbnQpKHN0cnVjdCBkczI3OHhfaW5mbyAqaW5mbywgaW50ICpjdXJyZW50X3VBKTsKLQlpbnQJKCpnZXRfdm9sdGFnZSkoc3RydWN0IGRzMjc4eF9pbmZvICppbmZvLCBpbnQgKnZvbHRhZ2VfdUEpOwotCWludAkoKmdldF9jYXBhY2l0eSkoc3RydWN0IGRzMjc4eF9pbmZvICppbmZvLCBpbnQgKmNhcGFjaXR5X3VBKTsKLQorCWludCAoKmdldF9iYXR0ZXJ5X2N1cnJlbnQpKHN0cnVjdCBkczI3OHhfaW5mbyAqaW5mbywgaW50ICpjdXJyZW50X3VBKTsKKwlpbnQgKCpnZXRfYmF0dGVyeV92b2x0YWdlKShzdHJ1Y3QgZHMyNzh4X2luZm8gKmluZm8sIGludCAqdm9sdGFnZV91QSk7CisJaW50ICgqZ2V0X2JhdHRlcnlfY2FwYWNpdHkpKHN0cnVjdCBkczI3OHhfaW5mbyAqaW5mbywgaW50ICpjYXBhY2l0eV91QSk7CiB9OwogCiAjZGVmaW5lIHRvX2RzMjc4eF9pbmZvKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHMyNzh4X2luZm8sIGJhdHRlcnkpCkBAIC0yMTMsMTEgKzIxMiwxMSBAQAogCWludCBjdXJyZW50X3VBOwogCWludCBjYXBhY2l0eTsKIAotCWVyciA9IGluZm8tPm9wcy0+Z2V0X2N1cnJlbnQoaW5mbywgJmN1cnJlbnRfdUEpOworCWVyciA9IGluZm8tPm9wcy0+Z2V0X2JhdHRlcnlfY3VycmVudChpbmZvLCAmY3VycmVudF91QSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IGluZm8tPm9wcy0+Z2V0X2NhcGFjaXR5KGluZm8sICZjYXBhY2l0eSk7CisJZXJyID0gaW5mby0+b3BzLT5nZXRfYmF0dGVyeV9jYXBhY2l0eShpbmZvLCAmY2FwYWNpdHkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTI0NiwxNSArMjQ1LDE1IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKLQkJcmV0ID0gaW5mby0+b3BzLT5nZXRfY2FwYWNpdHkoaW5mbywgJnZhbC0+aW50dmFsKTsKKwkJcmV0ID0gaW5mby0+b3BzLT5nZXRfYmF0dGVyeV9jYXBhY2l0eShpbmZvLCAmdmFsLT5pbnR2YWwpOwogCQlicmVhazsKIAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6Ci0JCXJldCA9IGluZm8tPm9wcy0+Z2V0X3ZvbHRhZ2UoaW5mbywgJnZhbC0+aW50dmFsKTsKKwkJcmV0ID0gaW5mby0+b3BzLT5nZXRfYmF0dGVyeV92b2x0YWdlKGluZm8sICZ2YWwtPmludHZhbCk7CiAJCWJyZWFrOwogCiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJcmV0ID0gaW5mby0+b3BzLT5nZXRfY3VycmVudChpbmZvLCAmdmFsLT5pbnR2YWwpOworCQlyZXQgPSBpbmZvLT5vcHMtPmdldF9iYXR0ZXJ5X2N1cnJlbnQoaW5mbywgJnZhbC0+aW50dmFsKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CkBAIC0zMDcsMTQgKzMwNiwxNCBAQAogCiBzdGF0aWMgc3RydWN0IGRzMjc4eF9iYXR0ZXJ5X29wcyBkczI3OHhfb3BzW10gPSB7CiAJW0RTMjc4Ml0gPSB7Ci0JCS5nZXRfY3VycmVudCAgPSBkczI3ODJfZ2V0X2N1cnJlbnQsCi0JCS5nZXRfdm9sdGFnZSAgPSBkczI3ODJfZ2V0X3ZvbHRhZ2UsCi0JCS5nZXRfY2FwYWNpdHkgPSBkczI3ODJfZ2V0X2NhcGFjaXR5LAorCQkuZ2V0X2JhdHRlcnlfY3VycmVudCAgPSBkczI3ODJfZ2V0X2N1cnJlbnQsCisJCS5nZXRfYmF0dGVyeV92b2x0YWdlICA9IGRzMjc4Ml9nZXRfdm9sdGFnZSwKKwkJLmdldF9iYXR0ZXJ5X2NhcGFjaXR5ID0gZHMyNzgyX2dldF9jYXBhY2l0eSwKIAl9LAogCVtEUzI3ODZdID0gewotCQkuZ2V0X2N1cnJlbnQgID0gZHMyNzg2X2dldF9jdXJyZW50LAotCQkuZ2V0X3ZvbHRhZ2UgID0gZHMyNzg2X2dldF92b2x0YWdlLAotCQkuZ2V0X2NhcGFjaXR5ID0gZHMyNzg2X2dldF9jYXBhY2l0eSwKKwkJLmdldF9iYXR0ZXJ5X2N1cnJlbnQgID0gZHMyNzg2X2dldF9jdXJyZW50LAorCQkuZ2V0X2JhdHRlcnlfdm9sdGFnZSAgPSBkczI3ODZfZ2V0X3ZvbHRhZ2UsCisJCS5nZXRfYmF0dGVyeV9jYXBhY2l0eSA9IGRzMjc4Nl9nZXRfY2FwYWNpdHksCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9qejQ3NDAtYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9qejQ3NDAtYmF0dGVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzRiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5LmMKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBCYXR0ZXJ5IG1lYXN1cmVtZW50IGNvZGUgZm9yIEluZ2VuaWMgSlogU09DLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKaWVqaW5nIFpoYW5nIDxremplZWZAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBiYXNlZCBvbiB0b3NhX2JhdHRlcnkuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wb3dlci9qejQ3NDAtYmF0dGVyeS5oPgorI2luY2x1ZGUgPGxpbnV4L2p6NDc0MC1hZGMuaD4KKworc3RydWN0IGp6X2JhdHRlcnkgeworCXN0cnVjdCBqel9iYXR0ZXJ5X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwlpbnQgaXJxOworCWludCBjaGFyZ2VfaXJxOworCisJc3RydWN0IG1mZF9jZWxsICpjZWxsOworCisJaW50IHN0YXR1czsKKwlsb25nIHZvbHRhZ2U7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiByZWFkX2NvbXBsZXRpb247CisKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QganpfYmF0dGVyeSAqcHN5X3RvX2p6X2JhdHRlcnkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXJldHVybiBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QganpfYmF0dGVyeSwgYmF0dGVyeSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBqel9iYXR0ZXJ5X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBqel9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gZGV2aWQ7CisKKwljb21wbGV0ZSgmYmF0dGVyeS0+cmVhZF9jb21wbGV0aW9uKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBsb25nIGp6X2JhdHRlcnlfcmVhZF92b2x0YWdlKHN0cnVjdCBqel9iYXR0ZXJ5ICpiYXR0ZXJ5KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlsb25nIHZvbHRhZ2U7CisKKwlJTklUX0NPTVBMRVRJT04oYmF0dGVyeS0+cmVhZF9jb21wbGV0aW9uKTsKKworCWVuYWJsZV9pcnEoYmF0dGVyeS0+aXJxKTsKKwliYXR0ZXJ5LT5jZWxsLT5lbmFibGUoYmF0dGVyeS0+cGRldik7CisKKwl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmJhdHRlcnktPnJlYWRfY29tcGxldGlvbiwKKwkJSFopOworCisJaWYgKHQgPiAwKSB7CisJCXZhbCA9IHJlYWR3KGJhdHRlcnktPmJhc2UpICYgMHhmZmY7CisKKwkJaWYgKGJhdHRlcnktPnBkYXRhLT5pbmZvLnZvbHRhZ2VfbWF4X2Rlc2lnbiA8PSAyNTAwMDAwKQorCQkJdmFsID0gKHZhbCAqIDc4MTI1VUwpID4+IDdVTDsKKwkJZWxzZQorCQkJdmFsID0gKCh2YWwgKiA5MjQzNzVVTCkgPj4gOVVMKSArIDMzMDAwOworCQl2b2x0YWdlID0gKGxvbmcpdmFsOworCX0gZWxzZSB7CisJCXZvbHRhZ2UgPSB0ID8gdCA6IC1FVElNRURPVVQ7CisJfQorCisJYmF0dGVyeS0+Y2VsbC0+ZGlzYWJsZShiYXR0ZXJ5LT5wZGV2KTsKKwlkaXNhYmxlX2lycShiYXR0ZXJ5LT5pcnEpOworCisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKK3N0YXRpYyBpbnQganpfYmF0dGVyeV9nZXRfY2FwYWNpdHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXN0cnVjdCBqel9iYXR0ZXJ5ICpqel9iYXR0ZXJ5ID0gcHN5X3RvX2p6X2JhdHRlcnkocHN5KTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2luZm8gKmluZm8gPSAmanpfYmF0dGVyeS0+cGRhdGEtPmluZm87CisJbG9uZyB2b2x0YWdlOworCWludCByZXQ7CisJaW50IHZvbHRhZ2Vfc3BhbjsKKworCXZvbHRhZ2UgPSBqel9iYXR0ZXJ5X3JlYWRfdm9sdGFnZShqel9iYXR0ZXJ5KTsKKworCWlmICh2b2x0YWdlIDwgMCkKKwkJcmV0dXJuIHZvbHRhZ2U7CisKKwl2b2x0YWdlX3NwYW4gPSBpbmZvLT52b2x0YWdlX21heF9kZXNpZ24gLSBpbmZvLT52b2x0YWdlX21pbl9kZXNpZ247CisJcmV0ID0gKCh2b2x0YWdlIC0gaW5mby0+dm9sdGFnZV9taW5fZGVzaWduKSAqIDEwMCkgLyB2b2x0YWdlX3NwYW47CisKKwlpZiAocmV0ID4gMTAwKQorCQlyZXQgPSAxMDA7CisJZWxzZSBpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQganpfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QganpfYmF0dGVyeSAqanpfYmF0dGVyeSA9IHBzeV90b19qel9iYXR0ZXJ5KHBzeSk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvICppbmZvID0gJmp6X2JhdHRlcnktPnBkYXRhLT5pbmZvOworCWxvbmcgdm9sdGFnZTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXZhbC0+aW50dmFsID0ganpfYmF0dGVyeS0+c3RhdHVzOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCXZhbC0+aW50dmFsID0ganpfYmF0dGVyeS0+cGRhdGEtPmluZm8udGVjaG5vbG9neTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCXZvbHRhZ2UgPSBqel9iYXR0ZXJ5X3JlYWRfdm9sdGFnZShqel9iYXR0ZXJ5KTsKKwkJaWYgKHZvbHRhZ2UgPCBpbmZvLT52b2x0YWdlX21pbl9kZXNpZ24pCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXZhbC0+aW50dmFsID0ganpfYmF0dGVyeV9nZXRfY2FwYWNpdHkocHN5KTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBqel9iYXR0ZXJ5X3JlYWRfdm9sdGFnZShqel9iYXR0ZXJ5KTsKKwkJaWYgKHZhbC0+aW50dmFsIDwgMCkKKwkJCXJldHVybiB2YWwtPmludHZhbDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR046CisJCXZhbC0+aW50dmFsID0gaW5mby0+dm9sdGFnZV9tYXhfZGVzaWduOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBpbmZvLT52b2x0YWdlX21pbl9kZXNpZ247CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGp6X2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IGp6X2JhdHRlcnkgKmp6X2JhdHRlcnkgPSBwc3lfdG9fanpfYmF0dGVyeShwc3kpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmanpfYmF0dGVyeS0+d29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZqel9iYXR0ZXJ5LT53b3JrLCAwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGp6X2JhdHRlcnlfY2hhcmdlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBqel9iYXR0ZXJ5ICpqel9iYXR0ZXJ5ID0gZGF0YTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmp6X2JhdHRlcnktPndvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmanpfYmF0dGVyeS0+d29yaywgMCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGp6X2JhdHRlcnlfdXBkYXRlKHN0cnVjdCBqel9iYXR0ZXJ5ICpqel9iYXR0ZXJ5KQoreworCWludCBzdGF0dXM7CisJbG9uZyB2b2x0YWdlOworCWJvb2wgaGFzX2NoYW5nZWQgPSBmYWxzZTsKKwlpbnQgaXNfY2hhcmdpbmc7CisKKwlpZiAoZ3Bpb19pc192YWxpZChqel9iYXR0ZXJ5LT5wZGF0YS0+Z3Bpb19jaGFyZ2UpKSB7CisJCWlzX2NoYXJnaW5nID0gZ3Bpb19nZXRfdmFsdWUoanpfYmF0dGVyeS0+cGRhdGEtPmdwaW9fY2hhcmdlKTsKKwkJaXNfY2hhcmdpbmcgXj0ganpfYmF0dGVyeS0+cGRhdGEtPmdwaW9fY2hhcmdlX2FjdGl2ZV9sb3c7CisJCWlmIChpc19jaGFyZ2luZykKKwkJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWVsc2UKKwkJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCisJCWlmIChzdGF0dXMgIT0ganpfYmF0dGVyeS0+c3RhdHVzKSB7CisJCQlqel9iYXR0ZXJ5LT5zdGF0dXMgPSBzdGF0dXM7CisJCQloYXNfY2hhbmdlZCA9IHRydWU7CisJCX0KKwl9CisKKwl2b2x0YWdlID0ganpfYmF0dGVyeV9yZWFkX3ZvbHRhZ2UoanpfYmF0dGVyeSk7CisJaWYgKGFicyh2b2x0YWdlIC0ganpfYmF0dGVyeS0+dm9sdGFnZSkgPCA1MDAwMCkgeworCQlqel9iYXR0ZXJ5LT52b2x0YWdlID0gdm9sdGFnZTsKKwkJaGFzX2NoYW5nZWQgPSB0cnVlOworCX0KKworCWlmIChoYXNfY2hhbmdlZCkKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmp6X2JhdHRlcnktPmJhdHRlcnkpOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkganpfYmF0dGVyeV9wcm9wZXJ0aWVzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKK307CisKK3N0YXRpYyB2b2lkIGp6X2JhdHRlcnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLyogVG9vIHNtYWxsIGludGVydmFsIHdpbGwgaW5jcmVhc2Ugc3lzdGVtIHdvcmtsb2FkICovCisJY29uc3QgaW50IGludGVydmFsID0gSFogKiAzMDsKKwlzdHJ1Y3QganpfYmF0dGVyeSAqanpfYmF0dGVyeSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QganpfYmF0dGVyeSwKKwkJCQkJICAgIHdvcmsud29yayk7CisKKwlqel9iYXR0ZXJ5X3VwZGF0ZShqel9iYXR0ZXJ5KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmp6X2JhdHRlcnktPndvcmssIGludGVydmFsKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQganpfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBqel9iYXR0ZXJ5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QganpfYmF0dGVyeSAqanpfYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OworCisJanpfYmF0dGVyeSA9IGt6YWxsb2Moc2l6ZW9mKCpqel9iYXR0ZXJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqel9iYXR0ZXJ5KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJanpfYmF0dGVyeS0+Y2VsbCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJanpfYmF0dGVyeS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoanpfYmF0dGVyeS0+aXJxIDwgMCkgeworCQlyZXQgPSBqel9iYXR0ZXJ5LT5pcnE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGxhdGZvcm0gaXJxOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlqel9iYXR0ZXJ5LT5tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghanpfYmF0dGVyeS0+bWVtKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGxhdGZvcm0gbW1pbyByZXNvdXJjZVxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJanpfYmF0dGVyeS0+bWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKGp6X2JhdHRlcnktPm1lbS0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShqel9iYXR0ZXJ5LT5tZW0pLAlwZGV2LT5uYW1lKTsKKwlpZiAoIWp6X2JhdHRlcnktPm1lbSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IG1taW8gbWVtb3J5IHJlZ2lvblxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJanpfYmF0dGVyeS0+YmFzZSA9IGlvcmVtYXBfbm9jYWNoZShqel9iYXR0ZXJ5LT5tZW0tPnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUoanpfYmF0dGVyeS0+bWVtKSk7CisJaWYgKCFqel9iYXR0ZXJ5LT5iYXNlKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgbW1pbyBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJYmF0dGVyeSA9ICZqel9iYXR0ZXJ5LT5iYXR0ZXJ5OworCWJhdHRlcnktPm5hbWUgPSBwZGF0YS0+aW5mby5uYW1lOworCWJhdHRlcnktPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWJhdHRlcnktPnByb3BlcnRpZXMJPSBqel9iYXR0ZXJ5X3Byb3BlcnRpZXM7CisJYmF0dGVyeS0+bnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGp6X2JhdHRlcnlfcHJvcGVydGllcyk7CisJYmF0dGVyeS0+Z2V0X3Byb3BlcnR5ID0ganpfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJYmF0dGVyeS0+ZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IGp6X2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKKwliYXR0ZXJ5LT51c2VfZm9yX2FwbSA9IDE7CisKKwlqel9iYXR0ZXJ5LT5wZGF0YSA9IHBkYXRhOworCWp6X2JhdHRlcnktPnBkZXYgPSBwZGV2OworCisJaW5pdF9jb21wbGV0aW9uKCZqel9iYXR0ZXJ5LT5yZWFkX2NvbXBsZXRpb24pOworCisJSU5JVF9ERUxBWUVEX1dPUksoJmp6X2JhdHRlcnktPndvcmssIGp6X2JhdHRlcnlfd29yayk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShqel9iYXR0ZXJ5LT5pcnEsIGp6X2JhdHRlcnlfaXJxX2hhbmRsZXIsIDAsIHBkZXYtPm5hbWUsCisJCQlqel9iYXR0ZXJ5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisJZGlzYWJsZV9pcnEoanpfYmF0dGVyeS0+aXJxKTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX2NoYXJnZSkpIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ncGlvX2NoYXJnZSwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjaGFyZ2VyIHN0YXRlIGdwaW8gcmVxdWVzdCBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gZXJyX2ZyZWVfaXJxOworCQl9CisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHBkYXRhLT5ncGlvX2NoYXJnZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNoYXJnZXIgc3RhdGUgZ3BpbyBzZXQgZGlyZWN0aW9uIGZhaWxlZC5cbiIpOworCQkJZ290byBlcnJfZnJlZV9ncGlvOworCQl9CisKKwkJanpfYmF0dGVyeS0+Y2hhcmdlX2lycSA9IGdwaW9fdG9faXJxKHBkYXRhLT5ncGlvX2NoYXJnZSk7CisKKwkJaWYgKGp6X2JhdHRlcnktPmNoYXJnZV9pcnEgPj0gMCkgeworCQkJcmV0ID0gcmVxdWVzdF9pcnEoanpfYmF0dGVyeS0+Y2hhcmdlX2lycSwKKwkJCQkgICAganpfYmF0dGVyeV9jaGFyZ2VfaXJxLAorCQkJCSAgICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBqel9iYXR0ZXJ5KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBjaGFyZ2UgaXJxOiAlZFxuIiwgcmV0KTsKKwkJCQlnb3RvIGVycl9mcmVlX2dwaW87CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlqel9iYXR0ZXJ5LT5jaGFyZ2VfaXJxID0gLTE7CisJfQorCisJaWYgKGp6X2JhdHRlcnktPnBkYXRhLT5pbmZvLnZvbHRhZ2VfbWF4X2Rlc2lnbiA8PSAyNTAwMDAwKQorCQlqejQ3NDBfYWRjX3NldF9jb25maWcocGRldi0+ZGV2LnBhcmVudCwgSlpfQURDX0NPTkZJR19CQVRfTUIsCisJCQlKWl9BRENfQ09ORklHX0JBVF9NQik7CisJZWxzZQorCQlqejQ3NDBfYWRjX3NldF9jb25maWcocGRldi0+ZGV2LnBhcmVudCwgSlpfQURDX0NPTkZJR19CQVRfTUIsIDApOworCisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZqel9iYXR0ZXJ5LT5iYXR0ZXJ5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBvd2VyIHN1cHBseSBiYXR0ZXJ5IHJlZ2lzdGVyIGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9mcmVlX2NoYXJnZV9pcnE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwganpfYmF0dGVyeSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZqel9iYXR0ZXJ5LT53b3JrLCAwKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9jaGFyZ2VfaXJxOgorCWlmIChqel9iYXR0ZXJ5LT5jaGFyZ2VfaXJxID49IDApCisJCWZyZWVfaXJxKGp6X2JhdHRlcnktPmNoYXJnZV9pcnEsIGp6X2JhdHRlcnkpOworZXJyX2ZyZWVfZ3BpbzoKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19jaGFyZ2UpKQorCQlncGlvX2ZyZWUoanpfYmF0dGVyeS0+cGRhdGEtPmdwaW9fY2hhcmdlKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShqel9iYXR0ZXJ5LT5pcnEsIGp6X2JhdHRlcnkpOworZXJyX2lvdW5tYXA6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW91bm1hcChqel9iYXR0ZXJ5LT5iYXNlKTsKK2Vycl9yZWxlYXNlX21lbV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKGp6X2JhdHRlcnktPm1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoanpfYmF0dGVyeS0+bWVtKSk7CitlcnJfZnJlZToKKwlrZnJlZShqel9iYXR0ZXJ5KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBqel9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBqel9iYXR0ZXJ5ICpqel9iYXR0ZXJ5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmp6X2JhdHRlcnktPndvcmspOworCisJaWYgKGdwaW9faXNfdmFsaWQoanpfYmF0dGVyeS0+cGRhdGEtPmdwaW9fY2hhcmdlKSkgeworCQlpZiAoanpfYmF0dGVyeS0+Y2hhcmdlX2lycSA+PSAwKQorCQkJZnJlZV9pcnEoanpfYmF0dGVyeS0+Y2hhcmdlX2lycSwganpfYmF0dGVyeSk7CisJCWdwaW9fZnJlZShqel9iYXR0ZXJ5LT5wZGF0YS0+Z3Bpb19jaGFyZ2UpOworCX0KKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZqel9iYXR0ZXJ5LT5iYXR0ZXJ5KTsKKworCWZyZWVfaXJxKGp6X2JhdHRlcnktPmlycSwganpfYmF0dGVyeSk7CisKKwlpb3VubWFwKGp6X2JhdHRlcnktPmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihqel9iYXR0ZXJ5LT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGp6X2JhdHRlcnktPm1lbSkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQganpfYmF0dGVyeV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QganpfYmF0dGVyeSAqanpfYmF0dGVyeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZqel9iYXR0ZXJ5LT53b3JrKTsKKwlqel9iYXR0ZXJ5LT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqel9iYXR0ZXJ5X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGp6X2JhdHRlcnkgKmp6X2JhdHRlcnkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmanpfYmF0dGVyeS0+d29yaywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGp6X2JhdHRlcnlfcG1fb3BzID0geworCS5zdXNwZW5kCT0ganpfYmF0dGVyeV9zdXNwZW5kLAorCS5yZXN1bWUJCT0ganpfYmF0dGVyeV9yZXN1bWUsCit9OworCisjZGVmaW5lIEpaX0JBVFRFUllfUE1fT1BTICgmanpfYmF0dGVyeV9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBKWl9CQVRURVJZX1BNX09QUyBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIganpfYmF0dGVyeV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGp6X2JhdHRlcnlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChqel9iYXR0ZXJ5X3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiano0NzQwLWJhdHRlcnkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gSlpfQkFUVEVSWV9QTV9PUFMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGp6X2JhdHRlcnlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmp6X2JhdHRlcnlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGp6X2JhdHRlcnlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqel9iYXR0ZXJ5X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmanpfYmF0dGVyeV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoanpfYmF0dGVyeV9leGl0KTsKKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpqejQ3NDAtYmF0dGVyeSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkpaNDc0MCBTb0MgYmF0dGVyeSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9yaW8uYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8uYwppbmRleCAwOGZhNDUzLi43NGU5ZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vcmlvLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL3Jpby5jCkBAIC04MDgsNyArODA4LDcgQEAKIAogLyoqCiAgKiByaW9fc3RkX3JvdXRlX2dldF9lbnRyeSAtIFJlYWQgc3dpdGNoIHJvdXRlIHRhYmxlIGVudHJ5IChwb3J0IG51bWJlcikKLSAqICAgYXNzb3NpYXRlZCB3aXRoIHNwZWNpZmllZCBkZXN0SUQgdXNpbmcgc3RhbmRhcmQgcmVnaXN0ZXJzIGRlZmluZWQgaW4gUklPCisgKiAgIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQgZGVzdElEIHVzaW5nIHN0YW5kYXJkIHJlZ2lzdGVycyBkZWZpbmVkIGluIFJJTwogICogICBzcGVjaWZpY2F0aW9uIHJldi4xLjMKICAqIEBtcG9ydDogTWFzdGVyIHBvcnQgdG8gaXNzdWUgdHJhbnNhY3Rpb24KICAqIEBkZXN0aWQ6IERlc3RpbmF0aW9uIElEIG9mIHRoZSBkZXZpY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FiMzEwMC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYWIzMTAwLmMKaW5kZXggN2IxNGE2Ny4uMTE3OTA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYWIzMTAwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYWIzMTAwLmMKQEAgLTI4Niw3ICsyODYsNyBAQAogewogCXN0cnVjdCBhYjMxMDBfcmVndWxhdG9yICphYnJlZyA9IHJlZy0+cmVnX2RhdGE7CiAKLQlpZiAoc2VsZWN0b3IgPiBhYnJlZy0+dm9sdGFnZXNfbGVuKQorCWlmIChzZWxlY3RvciA+PSBhYnJlZy0+dm9sdGFnZXNfbGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gYWJyZWctPnR5cF92b2x0YWdlc1tzZWxlY3Rvcl07CiB9CkBAIC0zMTgsNyArMzE4LDcgQEAKIAlyZWd2YWwgJj0gMHhFMDsKIAlyZWd2YWwgPj49IDU7CiAKLQlpZiAocmVndmFsID4gYWJyZWctPnZvbHRhZ2VzX2xlbikgeworCWlmIChyZWd2YWwgPj0gYWJyZWctPnZvbHRhZ2VzX2xlbikgewogCQlkZXZfZXJyKCZyZWctPmRldiwKIAkJCSJyZWd1bGF0b3IgcmVnaXN0ZXIgJTAyeCBjb250YWlucyBhbiBpbGxlZ2FsIHZvbHRhZ2Ugc2V0dGluZ1xuIiwKIAkJCWFicmVnLT5yZWdyZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IDIyNDgwODcuLjQyMmE3MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTEwMjUsNyArMTAyNSw2IEBACiAJCWlmIChyZWd1bGF0b3ItPmRldl9hdHRyLmF0dHIubmFtZSA9PSBOVUxMKQogCQkJZ290byBhdHRyX25hbWVfZXJyOwogCi0JCXJlZ3VsYXRvci0+ZGV2X2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCQlyZWd1bGF0b3ItPmRldl9hdHRyLmF0dHIubW9kZSA9IDA0NDQ7CiAJCXJlZ3VsYXRvci0+ZGV2X2F0dHIuc2hvdyA9IGRldmljZV9yZXF1ZXN0ZWRfdUFfc2hvdzsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnJlZ3VsYXRvci0+ZGV2X2F0dHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwppbmRleCAxNGI0NTc2Mi4uODE1MmQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvdHBzNjUwN3guaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUwN3guaD4KQEAgLTEwMSw5ICsxMDIsMTIgQEAKIAl1bnNpZ25lZCBtYXhfdVY7CiAJdTggdGFibGVfbGVuOwogCWNvbnN0IHUxNiAqdGFibGU7CisKKwkvKiBEb2VzIERDREMgaGlnaCBvciB0aGUgbG93IHJlZ2lzdGVyIGRlZmluZXMgb3V0cHV0IHZvbHRhZ2U/ICovCisJYm9vbCBkZWZkY2RjX2RlZmF1bHQ7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRwc19pbmZvIHRwczY1MDd4X3BtaWNfcmVnc1tdID0geworc3RhdGljIHN0cnVjdCB0cHNfaW5mbyB0cHM2NTA3eF9wbWljX3JlZ3NbXSA9IHsKIAl7CiAJCS5uYW1lID0gIlZEQ0RDMSIsCiAJCS5taW5fdVYgPSA3MjUwMDAsCkBAIC0xNDUsNyArMTQ5LDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzY1tUUFM2NTA3WF9OVU1fUkVHVUxBVE9SXTsKIAlzdHJ1Y3QgdHBzNjUwN3hfZGV2ICptZmQ7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbVFBTNjUwN1hfTlVNX1JFR1VMQVRPUl07Ci0JY29uc3Qgc3RydWN0IHRwc19pbmZvICppbmZvW1RQUzY1MDdYX05VTV9SRUdVTEFUT1JdOworCXN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTA3WF9OVU1fUkVHVUxBVE9SXTsKIAlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKIH07CiBzdGF0aWMgaW5saW5lIGludCB0cHM2NTA3eF9wbWljX3JlYWQoc3RydWN0IHRwczY1MDd4X3BtaWMgKnRwcywgdTggcmVnKQpAQCAtMzQxLDEwICszNDUsMTYgQEAKIAkJcmVnID0gVFBTNjUwN1hfUkVHX0RFRkRDREMxOwogCQlicmVhazsKIAljYXNlIFRQUzY1MDdYX0RDRENfMjoKLQkJcmVnID0gVFBTNjUwN1hfUkVHX0RFRkRDREMyX0xPVzsKKwkJaWYgKHRwcy0+aW5mb1tkY2RjXS0+ZGVmZGNkY19kZWZhdWx0KQorCQkJcmVnID0gVFBTNjUwN1hfUkVHX0RFRkRDREMyX0hJR0g7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1MDdYX1JFR19ERUZEQ0RDMl9MT1c7CiAJCWJyZWFrOwogCWNhc2UgVFBTNjUwN1hfRENEQ18zOgotCQlyZWcgPSBUUFM2NTA3WF9SRUdfREVGRENEQzNfTE9XOworCQlpZiAodHBzLT5pbmZvW2RjZGNdLT5kZWZkY2RjX2RlZmF1bHQpCisJCQlyZWcgPSBUUFM2NTA3WF9SRUdfREVGRENEQzNfSElHSDsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjUwN1hfUkVHX0RFRkRDREMzX0xPVzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNzAsMTAgKzM4MCwxNiBAQAogCQlyZWcgPSBUUFM2NTA3WF9SRUdfREVGRENEQzE7CiAJCWJyZWFrOwogCWNhc2UgVFBTNjUwN1hfRENEQ18yOgotCQlyZWcgPSBUUFM2NTA3WF9SRUdfREVGRENEQzJfTE9XOworCQlpZiAodHBzLT5pbmZvW2RjZGNdLT5kZWZkY2RjX2RlZmF1bHQpCisJCQlyZWcgPSBUUFM2NTA3WF9SRUdfREVGRENEQzJfSElHSDsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjUwN1hfUkVHX0RFRkRDREMyX0xPVzsKIAkJYnJlYWs7CiAJY2FzZSBUUFM2NTA3WF9EQ0RDXzM6Ci0JCXJlZyA9IFRQUzY1MDdYX1JFR19ERUZEQ0RDM19MT1c7CisJCWlmICh0cHMtPmluZm9bZGNkY10tPmRlZmRjZGNfZGVmYXVsdCkKKwkJCXJlZyA9IFRQUzY1MDdYX1JFR19ERUZEQ0RDM19ISUdIOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTA3WF9SRUdfREVGRENEQzNfTE9XOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUzMiw3ICs1NDgsNyBAQAogewogCXN0cnVjdCB0cHM2NTA3eF9kZXYgKnRwczY1MDd4X2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdGF0aWMgaW50IGRlc2NfaWQ7Ci0JY29uc3Qgc3RydWN0IHRwc19pbmZvICppbmZvID0gJnRwczY1MDd4X3BtaWNfcmVnc1swXTsKKwlzdHJ1Y3QgdHBzX2luZm8gKmluZm8gPSAmdHBzNjUwN3hfcG1pY19yZWdzWzBdOwogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IHRwczY1MDd4X3BtaWMgKnRwczsKQEAgLTU2OSw2ICs1ODUsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgVFBTNjUwN1hfTlVNX1JFR1VMQVRPUjsgaSsrLCBpbmZvKyssIGluaXRfZGF0YSsrKSB7CiAJCS8qIFJlZ2lzdGVyIHRoZSByZWd1bGF0b3JzICovCiAJCXRwcy0+aW5mb1tpXSA9IGluZm87CisJCWlmIChpbml0X2RhdGEtPmRyaXZlcl9kYXRhKSB7CisJCQlzdHJ1Y3QgdHBzNjUwN3hfcmVnX3BsYXRmb3JtX2RhdGEgKmRhdGEgPQorCQkJCQkJCWluaXRfZGF0YS0+ZHJpdmVyX2RhdGE7CisJCQl0cHMtPmluZm9baV0tPmRlZmRjZGNfZGVmYXVsdCA9IGRhdGEtPmRlZmRjZGNfZGVmYXVsdDsKKwkJfQorCiAJCXRwcy0+ZGVzY1tpXS5uYW1lID0gaW5mby0+bmFtZTsKIAkJdHBzLT5kZXNjW2ldLmlkID0gZGVzY19pZCsrOwogCQl0cHMtPmRlc2NbaV0ubl92b2x0YWdlcyA9IG51bV92b2x0YWdlc1tpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwppbmRleCA3MjNjZDFmLi4wZTZlZDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCkBAIC0xNDk1LDcgKzE0OTUsNyBAQAogCWlmIChyZXQgIT0gMCkgewogCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlZDogJWRcbiIsCiAJCQlyZWcsIHJldCk7Ci0JCXBsYXRmb3JtX2RldmljZV9kZWwocGRldik7CisJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CiAJCXdtODM1MC0+cG1pYy5wZGV2W3JlZ10gPSBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggMTBiYTEyYy4uNDMwMWE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC03NzQsNyArNzc0LDcgQEAKIAogY29uZmlnIFJUQ19EUlZfQVUxWFhYCiAJdHJpc3RhdGUgIkF1MXh4eCBDb3VudGVyMCBSVEMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPQ19BVTFYMDAKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBBdTF4eHggb24tY2hpcCBDb3VudGVyMCAoVGltZS1PZi1ZZWFyCiAJICBjb3VudGVyKSB0byBiZSB1c2VkIGFzIGEgUlRDLgpAQCAtOTA1LDQgKzkwNSwxNSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtbXBjNTEyMS4KIAorY29uZmlnIFJUQ19EUlZfSlo0NzQwCisJdHJpc3RhdGUgIkluZ2VuaWMgSlo0NzQwIFNvQyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEluZ2VuaWMgSlo0NzQwIFNvQyBSVEMKKwkgIGNvbnRyb2xsZXIuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1qejQ3NDAuCisKIGVuZGlmICMgUlRDX0NMQVNTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IDVhZGJiYTcuLmZlZGY5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC00Nyw2ICs0Nyw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9GTTMxMzApCSs9IHJ0Yy1mbTMxMzAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfR0VORVJJQykJKz0gcnRjLWdlbmVyaWMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfSVNMMTIwOCkJKz0gcnRjLWlzbDEyMDgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfSlo0NzQwKQkrPSBydGMtano0NzQwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX000MVQ4MCkJKz0gcnRjLW00MXQ4MC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NNDFUOTQpCSs9IHJ0Yy1tNDF0OTQubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDM1KQkrPSBydGMtbTQ4dDM1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1mbTMxMzAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1mbTMxMzAuYwppbmRleCBmZjZmY2U2Li5lNGRlOGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZm0zMTMwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWZtMzEzMC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlpZiAoIWZtMzEzMC0+ZGF0YV92YWxpZCkgewogCQkvKiBXZSBoYXZlIGludmFsaWQgZGF0YSBpbiBSVEMsIHByb2JhYmx5IGR1ZQogCQl0byBiYXR0ZXJ5IGZhdWx0cyBvciBvdGhlciBwcm9ibGVtcy4gUmV0dXJuIEVJTwotCQlmb3Igbm93LCBpdCB3aWxsIGFsbG93IHVzIHRvIHNldCBkYXRhIGxhdGVyIGluc3RlZAorCQlmb3Igbm93LCBpdCB3aWxsIGFsbG93IHVzIHRvIHNldCBkYXRhIGxhdGVyIGluc3RlYWQKIAkJb2YgZXJyb3IgZHVyaW5nIHByb2Jpbmcgd2hpY2ggZGlzYWJsZXMgZGV2aWNlICovCiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1qejQ3NDAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1qejQ3NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE5ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWp6NDc0MC5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCSBKWjQ3NDAgU29DIFJUQyBkcml2ZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgSlpfUkVHX1JUQ19DVFJMCQkweDAwCisjZGVmaW5lIEpaX1JFR19SVENfU0VDCQkweDA0CisjZGVmaW5lIEpaX1JFR19SVENfU0VDX0FMQVJNCTB4MDgKKyNkZWZpbmUgSlpfUkVHX1JUQ19SRUdVTEFUT1IJMHgwQworI2RlZmluZSBKWl9SRUdfUlRDX0hJQkVSTkFURQkweDIwCisjZGVmaW5lIEpaX1JFR19SVENfU0NSQVRDSFBBRAkweDM0CisKKyNkZWZpbmUgSlpfUlRDX0NUUkxfV1JEWQlCSVQoNykKKyNkZWZpbmUgSlpfUlRDX0NUUkxfMUhaCQlCSVQoNikKKyNkZWZpbmUgSlpfUlRDX0NUUkxfMUhaX0lSUQlCSVQoNSkKKyNkZWZpbmUgSlpfUlRDX0NUUkxfQUYJCUJJVCg0KQorI2RlZmluZSBKWl9SVENfQ1RSTF9BRl9JUlEJQklUKDMpCisjZGVmaW5lIEpaX1JUQ19DVFJMX0FFCQlCSVQoMikKKyNkZWZpbmUgSlpfUlRDX0NUUkxfRU5BQkxFCUJJVCgwKQorCitzdHJ1Y3Qgano0NzQwX3J0YyB7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKworCXVuc2lnbmVkIGludCBpcnE7CisKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGp6NDc0MF9ydGNfcmVnX3JlYWQoc3RydWN0IGp6NDc0MF9ydGMgKnJ0Yywgc2l6ZV90IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwocnRjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3dhaXRfd3JpdGVfcmVhZHkoc3RydWN0IGp6NDc0MF9ydGMgKnJ0YykKK3sKKwl1aW50MzJfdCBjdHJsOworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCWRvIHsKKwkJY3RybCA9IGp6NDc0MF9ydGNfcmVnX3JlYWQocnRjLCBKWl9SRUdfUlRDX0NUUkwpOworCX0gd2hpbGUgKCEoY3RybCAmIEpaX1JUQ19DVFJMX1dSRFkpICYmIC0tdGltZW91dCk7CisKKwlyZXR1cm4gdGltZW91dCA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW5saW5lIGludCBqejQ3NDBfcnRjX3JlZ193cml0ZShzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjLCBzaXplX3QgcmVnLAorCXVpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGp6NDc0MF9ydGNfd2FpdF93cml0ZV9yZWFkeShydGMpOworCWlmIChyZXQgPT0gMCkKKwkJd3JpdGVsKHZhbCwgcnRjLT5iYXNlICsgcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgano0NzQwX3J0Y19jdHJsX3NldF9iaXRzKHN0cnVjdCBqejQ3NDBfcnRjICpydGMsIHVpbnQzMl90IG1hc2ssCisJYm9vbCBzZXQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IGN0cmw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5sb2NrLCBmbGFncyk7CisKKwljdHJsID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfQ1RSTCk7CisKKwkvKiBEb24ndCBjbGVhciBpbnRlcnJ1cHQgZmxhZ3MgYnkgYWNjaWRlbnQgKi8KKwljdHJsIHw9IEpaX1JUQ19DVFJMXzFIWiB8IEpaX1JUQ19DVFJMX0FGOworCisJaWYgKHNldCkKKwkJY3RybCB8PSBtYXNrOworCWVsc2UKKwkJY3RybCAmPSB+bWFzazsKKworCXJldCA9IGp6NDc0MF9ydGNfcmVnX3dyaXRlKHJ0YywgSlpfUkVHX1JUQ19DVFJMLCBjdHJsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdWludDMyX3Qgc2Vjcywgc2VjczI7CisJaW50IHRpbWVvdXQgPSA1OworCisJLyogSWYgdGhlIHNlY29uZHMgcmVnaXN0ZXIgaXMgcmVhZCB3aGlsZSBpdCBpcyB1cGRhdGVkLCBpdCBjYW4gY29udGFpbiBhCisJICogYm9ndXMgdmFsdWUuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIHN1cmUgdGhhdCB0d28gY29uc2VjdXRpdmUKKwkgKiByZWFkcyBoYXZlIHRoZSBzYW1lIHZhbHVlLgorCSAqLworCXNlY3MgPSBqejQ3NDBfcnRjX3JlZ19yZWFkKHJ0YywgSlpfUkVHX1JUQ19TRUMpOworCXNlY3MyID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfU0VDKTsKKworCXdoaWxlIChzZWNzICE9IHNlY3MyICYmIC0tdGltZW91dCkgeworCQlzZWNzID0gc2VjczI7CisJCXNlY3MyID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfU0VDKTsKKwl9CisKKwlpZiAodGltZW91dCA9PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsIHRpbWUpOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0aW1lKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQoreworCXN0cnVjdCBqejQ3NDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBqejQ3NDBfcnRjX3JlZ193cml0ZShydGMsIEpaX1JFR19SVENfU0VDLCBzZWNzKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdWludDMyX3Qgc2VjczsKKwl1aW50MzJfdCBjdHJsOworCisJc2VjcyA9IGp6NDc0MF9ydGNfcmVnX3JlYWQocnRjLCBKWl9SRUdfUlRDX1NFQ19BTEFSTSk7CisKKwljdHJsID0gano0NzQwX3J0Y19yZWdfcmVhZChydGMsIEpaX1JFR19SVENfQ1RSTCk7CisKKwlhbHJtLT5lbmFibGVkID0gISEoY3RybCAmIEpaX1JUQ19DVFJMX0FFKTsKKwlhbHJtLT5wZW5kaW5nID0gISEoY3RybCAmIEpaX1JUQ19DVFJMX0FGKTsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsICZhbHJtLT50aW1lKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0oJmFscm0tPnRpbWUpOworfQorCitzdGF0aWMgaW50IGp6NDc0MF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBzZWNzOworCisJcnRjX3RtX3RvX3RpbWUoJmFscm0tPnRpbWUsICZzZWNzKTsKKworCXJldCA9IGp6NDc0MF9ydGNfcmVnX3dyaXRlKHJ0YywgSlpfUkVHX1JUQ19TRUNfQUxBUk0sIHNlY3MpOworCWlmICghcmV0KQorCQlyZXQgPSBqejQ3NDBfcnRjX2N0cmxfc2V0X2JpdHMocnRjLCBKWl9SVENfQ1RSTF9BRSwgYWxybS0+ZW5hYmxlZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGp6NDc0MF9ydGNfdXBkYXRlX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBqejQ3NDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gano0NzQwX3J0Y19jdHJsX3NldF9iaXRzKHJ0YywgSlpfUlRDX0NUUkxfMUhaX0lSUSwgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBqejQ3NDBfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBqejQ3NDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gano0NzQwX3J0Y19jdHJsX3NldF9iaXRzKHJ0YywgSlpfUlRDX0NUUkxfQUZfSVJRLCBlbmFibGUpOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgano0NzQwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGp6NDc0MF9ydGNfcmVhZF90aW1lLAorCS5zZXRfbW1zcwk9IGp6NDc0MF9ydGNfc2V0X21tc3MsCisJLnJlYWRfYWxhcm0JPSBqejQ3NDBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IGp6NDc0MF9ydGNfc2V0X2FsYXJtLAorCS51cGRhdGVfaXJxX2VuYWJsZSA9IGp6NDc0MF9ydGNfdXBkYXRlX2lycV9lbmFibGUsCisJLmFsYXJtX2lycV9lbmFibGUgPSBqejQ3NDBfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3Qgano0NzQwX3J0Y19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gZGF0YTsKKwl1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKworCWN0cmwgPSBqejQ3NDBfcnRjX3JlZ19yZWFkKHJ0YywgSlpfUkVHX1JUQ19DVFJMKTsKKworCWlmIChjdHJsICYgSlpfUlRDX0NUUkxfMUhaKQorCQlldmVudHMgfD0gKFJUQ19VRiB8IFJUQ19JUlFGKTsKKworCWlmIChjdHJsICYgSlpfUlRDX0NUUkxfQUYpCisJCWV2ZW50cyB8PSAoUlRDX0FGIHwgUlRDX0lSUUYpOworCisJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIGV2ZW50cyk7CisKKwlqejQ3NDBfcnRjX2N0cmxfc2V0X2JpdHMocnRjLCBKWl9SVENfQ1RSTF8xSFogfCBKWl9SVENfQ1RSTF9BRiwgZmFsc2UpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCit2b2lkIGp6NDc0MF9ydGNfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBqejQ3NDBfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlqejQ3NDBfcnRjX3JlZ193cml0ZShydGMsIEpaX1JFR19SVENfSElCRVJOQVRFLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGp6NDc0MF9ydGNfcG93ZXJvZmYpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBqejQ3NDBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjOworCXVpbnQzMl90IHNjcmF0Y2hwYWQ7CisKKwlydGMgPSBremFsbG9jKHNpemVvZigqcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJcnRjLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChydGMtPmlycSA8IDApIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBpcnFcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJ0Yy0+bWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJ0Yy0+bWVtKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgcGxhdGZvcm0gbW1pbyBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJ0Yy0+bWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJ0Yy0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShydGMtPm1lbSksCisJCQkJCXBkZXYtPm5hbWUpOworCWlmICghcnRjLT5tZW0pIHsKKwkJcmV0ID0gLUVCVVNZOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBtbWlvIG1lbW9yeSByZWdpb25cbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJ0Yy0+YmFzZSA9IGlvcmVtYXBfbm9jYWNoZShydGMtPm1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUocnRjLT5tZW0pKTsKKwlpZiAoIXJ0Yy0+YmFzZSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIG1taW8gbWVtb3J5XG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKworCXNwaW5fbG9ja19pbml0KCZydGMtPmxvY2spOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCXJ0Yy0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LCAmano0NzQwX3J0Y19vcHMsCisJCQkJCVRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0Yy0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Yy0+cnRjKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJ0YyBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHJ0Yy0+aXJxLCBqejQ3NDBfcnRjX2lycSwgMCwKKwkJCQlwZGV2LT5uYW1lLCBydGMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgcnRjIGlycTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfcnRjOworCX0KKworCXNjcmF0Y2hwYWQgPSBqejQ3NDBfcnRjX3JlZ19yZWFkKHJ0YywgSlpfUkVHX1JUQ19TQ1JBVENIUEFEKTsKKwlpZiAoc2NyYXRjaHBhZCAhPSAweDEyMzQ1Njc4KSB7CisJCXJldCA9IGp6NDc0MF9ydGNfcmVnX3dyaXRlKHJ0YywgSlpfUkVHX1JUQ19TQ1JBVENIUEFELCAweDEyMzQ1Njc4KTsKKwkJcmV0ID0gano0NzQwX3J0Y19yZWdfd3JpdGUocnRjLCBKWl9SRUdfUlRDX1NFQywgMCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCB3cml0ZSB3cml0ZSB0byBSVEMgcmVnaXN0ZXJzXG4iKTsKKwkJCWdvdG8gZXJyX2ZyZWVfaXJxOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShydGMtPmlycSwgcnRjKTsKK2Vycl91bnJlZ2lzdGVyX3J0YzoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjLT5ydGMpOworZXJyX2lvdW5tYXA6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW91bm1hcChydGMtPmJhc2UpOworZXJyX3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocnRjLT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJ0Yy0+bWVtKSk7CitlcnJfZnJlZToKKwlrZnJlZShydGMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgano0NzQwX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgano0NzQwX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycShydGMtPmlycSwgcnRjKTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Yyk7CisKKwlpb3VubWFwKHJ0Yy0+YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJ0Yy0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShydGMtPm1lbSkpOworCisJa2ZyZWUocnRjKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgano0NzQwX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlID0gano0NzQwX3J0Y19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoano0NzQwX3J0Y19yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImp6NDc0MC1ydGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgano0NzQwX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmano0NzQwX3J0Y19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoano0NzQwX3J0Y19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGp6NDc0MF9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZqejQ3NDBfcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChqejQ3NDBfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGRyaXZlciBmb3IgdGhlIEpaNDc0MCBTb0NcbiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpqejQ3NDAtcnRjIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcGwwMzEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCmluZGV4IDM1ODdkOTkuLjcxYmJlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCkBAIC00NTYsNyArNDU2LDcgQEAKIAkuaXJxX3NldF9mcmVxID0gcGwwMzFfaXJxX3NldF9mcmVxLAogfTsKIAotc3RhdGljIHN0cnVjdCBhbWJhX2lkIHBsMDMxX2lkc1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwMzFfaWRzW10gPSB7CiAJewogCQkuaWQgPSAweDAwMDQxMDMxLAogCQkubWFzayA9IDB4MDAwZmZmZmYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcng4MDI1LmMgYi9kcml2ZXJzL3J0Yy9ydGMtcng4MDI1LmMKaW5kZXggNzg5ZjYyZi4uMTE0NmUzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXJ4ODAyNS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1yeDgwMjUuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAgKiBDbG9jayBwcmVjaXNpb24gYWRqdXN0bWVudCBzdXBwb3J0CiAgKgogICogQWNjb3JkaW5nIHRvIHRoZSBSWDgwMjUgU0EvTkIgYXBwbGljYXRpb24gbWFudWFsIHRoZSBmcmVxdWVuY3kgYW5kCi0gKiB0ZW1wZXJhdHVyZSBjaGFyYXRlcmlzdGljcyBjYW4gYmUgYXBwcm94aW1hdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAqIHRlbXBlcmF0dXJlIGNoYXJhY3RlcmlzdGljcyBjYW4gYmUgYXBwcm94aW1hdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcKICAqIGVxdWF0aW9uOgogICoKICAqICAgZGYgPSBhICogKHV0IC0gdCkqKjIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1yeDg1ODEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1yeDg1ODEuYwppbmRleCA5NzE4YWFhLi42MDBiODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcng4NTgxLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXJ4ODU4MS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfRkxBRywKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgUlg4NTgxX1JFR19DVFJMLAogCQkoZGF0YSB8IFJYODU4MV9DVFJMX1NUT1ApKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byB3cml0ZSBjb250cm9sIHJlZ2lzdGVyXG4iKTsKQEAgLTE4Miw2ICsxODIsMjAgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCisJLyogZ2V0IFZMRiBhbmQgY2xlYXIgaXQgKi8KKwlkYXRhID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgUlg4NTgxX1JFR19GTEFHKTsKKwlpZiAoZGF0YSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVhZCBmbGFnIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfRkxBRywKKwkJKGRhdGEgJiB+KFJYODU4MV9GTEFHX1ZMRikpKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gd3JpdGUgZmxhZyByZWdpc3RlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwogCS8qIFJlc3RhcnQgdGhlIGNsb2NrICovCiAJZGF0YSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfQ1RSTCk7CiAJaWYgKGRhdGEgPCAwKSB7CkBAIC0xODksOCArMjAzLDggQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfRkxBRywKLQkJKGRhdGEgfCB+KFJYODU4MV9DVFJMX1NUT1ApKSk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFJYODU4MV9SRUdfQ1RSTCwKKwkJKGRhdGEgJiB+KFJYODU4MV9DVFJMX1NUT1ApKSk7CiAJaWYgKGVyciAhPSAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHdyaXRlIGNvbnRyb2wgcmVnaXN0ZXJcbiIpOwogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19zZXR1cC5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMKaW5kZXggNjMyNmI2Ny4uMzRjN2U0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMKQEAgLTM2OCw2ICszNjgsOCBAQAogCWlmIChxZWJzbV9wb3NzaWJsZSgpKQogCQlpcnFfcHRyLT5xaWIucmZsYWdzIHw9IFFJQl9SRkxBR1NfRU5BQkxFX1FFQlNNOwogCisJaXJxX3B0ci0+cWliLnJmbGFncyB8PSBpbml0X2RhdGEtPnFpYl9yZmxhZ3M7CisKIAlpcnFfcHRyLT5xaWIucWZtdCA9IGluaXRfZGF0YS0+cV9mb3JtYXQ7CiAJaWYgKGluaXRfZGF0YS0+bm9faW5wdXRfcXMpCiAJCWlycV9wdHItPnFpYi5pc2xpYmEgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwppbmRleCAxNDdiYjFhLi5hNzVlZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJaW50IGVycjsKIAllcnIgPSBjY3dncm91cF9jcmVhdGVfZnJvbV9zdHJpbmcoY2xhd19yb290X2RldiwKIAkJCQkJICBjbGF3X2dyb3VwX2RyaXZlci5kcml2ZXJfaWQsCi0JCQkJCSAgJmNsYXdfY2N3X2RyaXZlciwgMywgYnVmKTsKKwkJCQkJICAmY2xhd19jY3dfZHJpdmVyLCAyLCBidWYpOwogCXJldHVybiBlcnIgPyBlcnIgOiBjb3VudDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKaW5kZXggN2E0NGMzOC4uZDEyNTc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCkBAIC00MCwxMSArNDAsNyBAQAogICovCiBlbnVtIHFldGhfZGJmX25hbWVzIHsKIAlRRVRIX0RCRl9TRVRVUCwKLQlRRVRIX0RCRl9RRVJSLAotCVFFVEhfREJGX1RSQUNFLAogCVFFVEhfREJGX01TRywKLQlRRVRIX0RCRl9TRU5TRSwKLQlRRVRIX0RCRl9NSVNDLAogCVFFVEhfREJGX0NUUkwsCiAJUUVUSF9EQkZfSU5GT1MJLyogbXVzdCBiZSBsYXN0IGVsZW1lbnQgKi8KIH07CkBAIC03MSw3ICs2NywxOSBAQAogCWRlYnVnX3NwcmludGZfZXZlbnQocWV0aF9kYmZbUUVUSF9EQkZfTVNHXS5pZCwgbGV2ZWwsIHRleHQpCiAKICNkZWZpbmUgUUVUSF9EQkZfVEVYVF8obmFtZSwgbGV2ZWwsIHRleHQuLi4pIFwKLQlxZXRoX2RiZl9sb25ndGV4dChRRVRIX0RCRl8jI25hbWUsIGxldmVsLCB0ZXh0KQorCXFldGhfZGJmX2xvbmd0ZXh0KHFldGhfZGJmW1FFVEhfREJGXyMjbmFtZV0uaWQsIGxldmVsLCB0ZXh0KQorCisjZGVmaW5lIFFFVEhfQ0FSRF9URVhUKGNhcmQsIGxldmVsLCB0ZXh0KSBcCisJZGVidWdfdGV4dF9ldmVudChjYXJkLT5kZWJ1ZywgbGV2ZWwsIHRleHQpCisKKyNkZWZpbmUgUUVUSF9DQVJEX0hFWChjYXJkLCBsZXZlbCwgYWRkciwgbGVuKSBcCisJZGVidWdfZXZlbnQoY2FyZC0+ZGVidWcsIGxldmVsLCAodm9pZCAqKShhZGRyKSwgbGVuKQorCisjZGVmaW5lIFFFVEhfQ0FSRF9NRVNTQUdFKGNhcmQsIHRleHQuLi4pIFwKKwlkZWJ1Z19zcHJpbnRmX2V2ZW50KGNhcmQtPmRlYnVnLCBsZXZlbCwgdGV4dCkKKworI2RlZmluZSBRRVRIX0NBUkRfVEVYVF8oY2FyZCwgbGV2ZWwsIHRleHQuLi4pIFwKKwlxZXRoX2RiZl9sb25ndGV4dChjYXJkLT5kZWJ1ZywgbGV2ZWwsIHRleHQpCiAKICNkZWZpbmUgU0VOU0VfQ09NTUFORF9SRUpFQ1RfQllURSAwCiAjZGVmaW5lIFNFTlNFX0NPTU1BTkRfUkVKRUNUX0ZMQUcgMHg4MApAQCAtMTgwLDggKzE4OCw3IEBACiAJCXFldGhfaXNfZW5hYmxlZDYoYywgZikgOiBxZXRoX2lzX2VuYWJsZWQoYywgZikpCiAKICNkZWZpbmUgUUVUSF9JRFhfRlVOQ19MRVZFTF9PU0QJCSAweDAxMDEKLSNkZWZpbmUgUUVUSF9JRFhfRlVOQ19MRVZFTF9JUURfRU5BX0lQQVQgMHg0MTA4Ci0jZGVmaW5lIFFFVEhfSURYX0ZVTkNfTEVWRUxfSVFEX0RJU19JUEFUIDB4NTEwOAorI2RlZmluZSBRRVRIX0lEWF9GVU5DX0xFVkVMX0lRRAkJIDB4NDEwOAogCiAjZGVmaW5lIFFFVEhfTU9ERUxMSVNUX0FSUkFZIFwKIAl7ezB4MTczMSwgMHgwMSwgMHgxNzMyLCBRRVRIX0NBUkRfVFlQRV9PU0QsIFFFVEhfTUFYX1FVRVVFUywgMH0sIFwKQEAgLTczMywxMiArNzQwLDE1IEBACiAJc3RydWN0IHFldGhfcWRpb19pbmZvIHFkaW87CiAJc3RydWN0IHFldGhfcGVyZl9zdGF0cyBwZXJmX3N0YXRzOwogCWludCB1c2VfaGFyZF9zdG9wOworCWludCByZWFkX29yX3dyaXRlX3Byb2JsZW07CiAJc3RydWN0IHFldGhfb3NuX2luZm8gb3NuX2luZm87CiAJc3RydWN0IHFldGhfZGlzY2lwbGluZSBkaXNjaXBsaW5lOwogCWF0b21pY190IGZvcmNlX2FsbG9jX3NrYjsKIAlzdHJ1Y3Qgc2VydmljZV9sZXZlbCBxZXRoX3NlcnZpY2VfbGV2ZWw7CiAJc3RydWN0IHFkaW9fc3NxZF9kZXNjIHNzcWQ7CisJZGVidWdfaW5mb190ICpkZWJ1ZzsKIAlzdHJ1Y3QgbXV0ZXggY29uZl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggZGlzY2lwbGluZV9tdXRleDsKIH07CiAKIHN0cnVjdCBxZXRoX2NhcmRfbGlzdF9zdHJ1Y3QgewpAQCAtODU3LDkgKzg2NywxMCBAQAogCQkJCXN0cnVjdCBldGh0b29sX3N0YXRzICosIHU2NCAqKTsKIHZvaWQgcWV0aF9jb3JlX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMiwgdTggKik7CiB2b2lkIHFldGhfY29yZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICopOwotdm9pZCBxZXRoX2RiZl9sb25ndGV4dChlbnVtIHFldGhfZGJmX25hbWVzIGRiZl9uaXgsIGludCBsZXZlbCwgY2hhciAqdGV4dCwgLi4uKTsKK3ZvaWQgcWV0aF9kYmZfbG9uZ3RleHQoZGVidWdfaW5mb190ICppZCwgaW50IGxldmVsLCBjaGFyICp0ZXh0LCAuLi4pOwogaW50IHFldGhfY29yZV9ldGh0b29sX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKik7CiBpbnQgcWV0aF9zZXRfYWNjZXNzX2N0cmxfb25saW5lKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpOworaW50IHFldGhfaGRyX2Noa19hbmRfYm91bmNlKHN0cnVjdCBza19idWZmICosIGludCk7CiAKIC8qIGV4cG9ydHMgZm9yIE9TTiAqLwogaW50IHFldGhfb3NuX2Fzc2lzdChzdHJ1Y3QgbmV0X2RldmljZSAqLCB2b2lkICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKaW5kZXggMTNlZjQ2Yi4uM2E1YTE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwpAQCAtMzIsMTYgKzMyLDggQEAKIAkvKiAgICAgICAgICAgICAgICAgICBOICBQICBBICAgIE0gIEwgIFYgICAgICAgICAgICAgICAgICAgICAgSCAgKi8KIAlbUUVUSF9EQkZfU0VUVVBdID0geyJxZXRoX3NldHVwIiwKIAkJCQk4LCAxLCAgIDgsIDUsICZkZWJ1Z19oZXhfYXNjaWlfdmlldywgTlVMTH0sCi0JW1FFVEhfREJGX1FFUlJdICA9IHsicWV0aF9xZXJyIiwKLQkJCQkyLCAxLCAgIDgsIDIsICZkZWJ1Z19oZXhfYXNjaWlfdmlldywgTlVMTH0sCi0JW1FFVEhfREJGX1RSQUNFXSA9IHsicWV0aF90cmFjZSIsCi0JCQkJNCwgMSwgICA4LCAzLCAmZGVidWdfaGV4X2FzY2lpX3ZpZXcsIE5VTEx9LAogCVtRRVRIX0RCRl9NU0ddICAgPSB7InFldGhfbXNnIiwKIAkJCQk4LCAxLCAxMjgsIDMsICZkZWJ1Z19zcHJpbnRmX3ZpZXcsICAgTlVMTH0sCi0JW1FFVEhfREJGX1NFTlNFXSA9IHsicWV0aF9zZW5zZSIsCi0JCQkJMiwgMSwgIDY0LCAyLCAmZGVidWdfaGV4X2FzY2lpX3ZpZXcsIE5VTEx9LAotCVtRRVRIX0RCRl9NSVNDXQkgPSB7InFldGhfbWlzYyIsCi0JCQkJMiwgMSwgMjU2LCAyLCAmZGVidWdfaGV4X2FzY2lpX3ZpZXcsIE5VTEx9LAogCVtRRVRIX0RCRl9DVFJMXSAgPSB7InFldGhfY29udHJvbCIsCiAJCTgsIDEsIFFFVEhfREJGX0NUUkxfTEVOLCA1LCAmZGVidWdfaGV4X2FzY2lpX3ZpZXcsIE5VTEx9LAogfTsKQEAgLTY1LDQ4ICs1Nyw2IEBACiBzdGF0aWMgaW50IHFldGhfcWRpb19lc3RhYmxpc2goc3RydWN0IHFldGhfY2FyZCAqKTsKIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19xZXRoX2ZpbGxfYnVmZmVyX2ZyYWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJc3RydWN0IHFkaW9fYnVmZmVyICpidWZmZXIsIGludCBpc190c28sCi0JCWludCAqbmV4dF9lbGVtZW50X3RvX2ZpbGwpCi17Ci0Jc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKLQlpbnQgZnJhZ25vOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlpbnQgZWxlbWVudCwgY250LCBkbGVuOwotCi0JZnJhZ25vID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKLQllbGVtZW50ID0gKm5leHRfZWxlbWVudF90b19maWxsOwotCWRsZW4gPSAwOwotCi0JaWYgKGlzX3RzbykKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCVNCQUxfRkxBR1NfTUlERExFX0ZSQUc7Ci0JZWxzZQotCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPQotCQkJU0JBTF9GTEFHU19GSVJTVF9GUkFHOwotCWRsZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47Ci0JaWYgKGRsZW4pIHsKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmFkZHIgPSBza2ItPmRhdGE7Ci0JCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5sZW5ndGggPSBkbGVuOwotCQllbGVtZW50Kys7Ci0JfQotCWZvciAoY250ID0gMDsgY250IDwgZnJhZ25vOyBjbnQrKykgewotCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbY250XTsKLQkJYWRkciA9IChwYWdlX3RvX3BmbihmcmFnLT5wYWdlKSA8PCBQQUdFX1NISUZUKSArCi0JCQlmcmFnLT5wYWdlX29mZnNldDsKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmFkZHIgPSAoY2hhciAqKWFkZHI7Ci0JCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5sZW5ndGggPSBmcmFnLT5zaXplOwotCQlpZiAoY250IDwgKGZyYWdubyAtIDEpKQotCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQlTQkFMX0ZMQUdTX01JRERMRV9GUkFHOwotCQllbHNlCi0JCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPQotCQkJCVNCQUxfRkxBR1NfTEFTVF9GUkFHOwotCQllbGVtZW50Kys7Ci0JfQotCSpuZXh0X2VsZW1lbnRfdG9fZmlsbCA9IGVsZW1lbnQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqcWV0aF9nZXRfY2FyZG5hbWUoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlpZiAoY2FyZC0+aW5mby5ndWVzdGxhbikgewpAQCAtMjMyLDcgKzE4Miw3IEBACiB7CiAJc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKnBvb2xfZW50cnksICp0bXA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA1LCAiY2x3cmtsc3QiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA1LCAiY2x3cmtsc3QiKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9vbF9lbnRyeSwgdG1wLAogCQkJICAgICZjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QsIGxpc3QpewogCQkJbGlzdF9kZWwoJnBvb2xfZW50cnktPmxpc3QpOwpAQCAtMjQ2LDcgKzE5Niw3IEBACiAJdm9pZCAqcHRyOwogCWludCBpLCBqOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNSwgImFsb2Nwb29sIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNSwgImFsb2Nwb29sIik7CiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPnFkaW8uaW5pdF9wb29sLmJ1Zl9jb3VudDsgKytpKSB7CiAJCXBvb2xfZW50cnkgPSBrbWFsbG9jKHNpemVvZigqcG9vbF9lbnRyeSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvb2xfZW50cnkpIHsKQEAgLTI3Myw3ICsyMjMsNyBAQAogCiBpbnQgcWV0aF9yZWFsbG9jX2J1ZmZlcl9wb29sKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIGludCBidWZjbnQpCiB7Ci0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgInJlYWxjYnAiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAicmVhbGNicCIpOwogCiAJaWYgKChjYXJkLT5zdGF0ZSAhPSBDQVJEX1NUQVRFX0RPV04pICYmCiAJICAgIChjYXJkLT5zdGF0ZSAhPSBDQVJEX1NUQVRFX1JFQ09WRVIpKQpAQCAtMjkzLDcgKzI0Myw3IEBACiAJaW50IHJjOwogCXN0cnVjdCBxZXRoX2NtZF9idWZmZXIgKmlvYjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJpc3NueHJkIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNSwgImlzc254cmQiKTsKIAlpZiAoY2FyZC0+cmVhZC5zdGF0ZSAhPSBDSF9TVEFURV9VUCkKIAkJcmV0dXJuIC1FSU87CiAJaW9iID0gcWV0aF9nZXRfYnVmZmVyKCZjYXJkLT5yZWFkKTsKQEAgLTMwNSwxMyArMjU1LDE0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlxZXRoX3NldHVwX2NjdygmY2FyZC0+cmVhZCwgaW9iLT5kYXRhLCBRRVRIX0JVRlNJWkUpOwotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDYsICJub2lycXBuZCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDYsICJub2lycXBuZCIpOwogCXJjID0gY2N3X2RldmljZV9zdGFydChjYXJkLT5yZWFkLmNjd2RldiwgJmNhcmQtPnJlYWQuY2N3LAogCQkJICAgICAgKGFkZHJfdCkgaW9iLCAwLCAwKTsKIAlpZiAocmMpIHsKIAkJUUVUSF9EQkZfTUVTU0FHRSgyLCAiJXMgZXJyb3IgaW4gc3RhcnRpbmcgbmV4dCByZWFkIGNjdyEgIgogCQkJInJjPSVpXG4iLCBkZXZfbmFtZSgmY2FyZC0+Z2Rldi0+ZGV2KSwgcmMpOwogCQlhdG9taWNfc2V0KCZjYXJkLT5yZWFkLmlycV9wZW5kaW5nLCAwKTsKKwkJY2FyZC0+cmVhZF9vcl93cml0ZV9wcm9ibGVtID0gMTsKIAkJcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShjYXJkKTsKIAkJd2FrZV91cCgmY2FyZC0+d2FpdF9xKTsKIAl9CkBAIC0zNjQsNyArMzE1LDcgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQgPSBOVUxMOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNSwgImNoa2lwYWQiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA1LCAiY2hraXBhZCIpOwogCWlmIChJU19JUEEoaW9iLT5kYXRhKSkgewogCQljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKSBQRFVfRU5DQVBTVUxBVElPTihpb2ItPmRhdGEpOwogCQlpZiAoSVNfSVBBX1JFUExZKGNtZCkpIHsKQEAgLTQwMCwxMCArMzUxLDEwIEBACiAJCQljYXNlIElQQV9DTURfTU9EQ0NJRDoKIAkJCQlyZXR1cm4gY21kOwogCQkJY2FzZSBJUEFfQ01EX1JFR0lTVEVSX0xPQ0FMX0FERFI6Ci0JCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImlybGEiKTsKKwkJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiaXJsYSIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJUEFfQ01EX1VOUkVHSVNURVJfTE9DQUxfQUREUjoKLQkJCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAidXJsYSIpOworCQkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJ1cmxhIik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVFFVEhfREJGX01FU1NBR0UoMiwgIlJlY2VpdmVkIGRhdGEgaXMgSVBBICIKQEAgLTQyMCw3ICszNzEsNyBAQAogCXN0cnVjdCBxZXRoX3JlcGx5ICpyZXBseSwgKnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJjbGlwYWxzdCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJjbGlwYWxzdCIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVwbHksIHIsICZjYXJkLT5jbWRfd2FpdGVyX2xpc3QsIGxpc3QpIHsKQEAgLTQzMiw2ICszODMsNyBAQAogCQlxZXRoX3B1dF9yZXBseShyZXBseSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlhdG9taWNfc2V0KCZjYXJkLT53cml0ZS5pcnFfcGVuZGluZywgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChxZXRoX2NsZWFyX2lwYWNtZF9saXN0KTsKIApAQCAtNDQ4LDkgKzQwMCw5IEBACiAJCQkgICBidWZmZXJbNF0sCiAJCQkgICAoKGJ1ZmZlcls0XSA9PSAweDIyKSA/CiAJCQkgICAgIiAtLSB0cnkgYW5vdGhlciBwb3J0bmFtZSIgOiAiIikpOwotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiY2tpZHhyZXMiKTsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIiBpZHh0ZXJtIik7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiICByYyVkIiwgLUVJTyk7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJja2lkeHJlcyIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiIGlkeHRlcm0iKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgIHJjJWQiLCAtRUlPKTsKIAkJaWYgKGJ1ZmZlcls0XSA9PSAweGY2KSB7CiAJCQlkZXZfZXJyKCZjYXJkLT5nZGV2LT5kZXYsCiAJCQkiVGhlIHFldGggZGV2aWNlIGlzIG5vdCBjb25maWd1cmVkICIKQEAgLTQ2Nyw4ICs0MTksOCBAQAogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAic2V0dXBjY3ciKTsKIAljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2hhbm5lbC0+Y2N3ZGV2KTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAic2V0dXBjY3ciKTsKIAlpZiAoY2hhbm5lbCA9PSAmY2FyZC0+cmVhZCkKIAkJbWVtY3B5KCZjaGFubmVsLT5jY3csIFJFQURfQ0NXLCBzaXplb2Yoc3RydWN0IGNjdzEpKTsKIAllbHNlCkBAIC00ODEsNyArNDMzLDcgQEAKIHsKIAlfX3U4IGluZGV4OwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNiwgImdldGJ1ZmYiKTsKKwlRRVRIX0NBUkRfVEVYVChDQVJEX0ZST01fQ0RFVihjaGFubmVsLT5jY3dkZXYpLCA2LCAiZ2V0YnVmZiIpOwogCWluZGV4ID0gY2hhbm5lbC0+aW9fYnVmX25vOwogCWRvIHsKIAkJaWYgKGNoYW5uZWwtPmlvYltpbmRleF0uc3RhdGUgPT0gQlVGX1NUQVRFX0ZSRUUpIHsKQEAgLTUwMiw3ICs0NTQsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAicmVsYnVmZiIpOworCVFFVEhfQ0FSRF9URVhUKENBUkRfRlJPTV9DREVWKGNoYW5uZWwtPmNjd2RldiksIDYsICJyZWxidWZmIik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPmlvYl9sb2NrLCBmbGFncyk7CiAJbWVtc2V0KGlvYi0+ZGF0YSwgMCwgUUVUSF9CVUZTSVpFKTsKIAlpb2ItPnN0YXRlID0gQlVGX1NUQVRFX0ZSRUU7CkBAIC01NTMsOSArNTA1LDggQEAKIAlpbnQga2VlcF9yZXBseTsKIAlpbnQgcmMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNuZGN0bGNiIik7Ci0KIAljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2hhbm5lbC0+Y2N3ZGV2KTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAic25kY3RsY2IiKTsKIAlyYyA9IHFldGhfY2hlY2tfaWR4X3Jlc3BvbnNlKGNhcmQsIGlvYi0+ZGF0YSk7CiAJc3dpdGNoIChyYykgewogCWNhc2UgMDoKQEAgLTU2Myw2ICs1MTQsNyBAQAogCWNhc2UgLUVJTzoKIAkJcWV0aF9jbGVhcl9pcGFjbWRfbGlzdChjYXJkKTsKIAkJcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShjYXJkKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJZGVmYXVsdDoKIAkJZ290byBvdXQ7CiAJfQpAQCAtNzIyLDcgKzY3NCw3IEBACiAKIHZvaWQgcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQogewotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJzdGFydHJlYyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJzdGFydHJlYyIpOwogCWlmIChxZXRoX3NldF90aHJlYWRfc3RhcnRfYml0KGNhcmQsIFFFVEhfUkVDT1ZFUl9USFJFQUQpID09IDApCiAJCXNjaGVkdWxlX3dvcmsoJmNhcmQtPmtlcm5lbF90aHJlYWRfc3RhcnRlcik7CiB9CkBAIC03MzIsMTUgKzY4NCwxNyBAQAogewogCWludCBkc3RhdCwgY3N0YXQ7CiAJY2hhciAqc2Vuc2U7CisJc3RydWN0IHFldGhfY2FyZCAqY2FyZDsKIAogCXNlbnNlID0gKGNoYXIgKikgaXJiLT5lY3c7CiAJY3N0YXQgPSBpcmItPnNjc3cuY21kLmNzdGF0OwogCWRzdGF0ID0gaXJiLT5zY3N3LmNtZC5kc3RhdDsKKwljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2Rldik7CiAKIAlpZiAoY3N0YXQgJiAoU0NITl9TVEFUX0NITl9DVFJMX0NISyB8IFNDSE5fU1RBVF9JTlRGX0NUUkxfQ0hLIHwKIAkJICAgICBTQ0hOX1NUQVRfQ0hOX0RBVEFfQ0hLIHwgU0NITl9TVEFUX0NIQUlOX0NIRUNLIHwKIAkJICAgICBTQ0hOX1NUQVRfUFJPVF9DSEVDSyB8IFNDSE5fU1RBVF9QUk9HX0NIRUNLKSkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiQ0dFTkNISyIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiQ0dFTkNISyIpOwogCQlkZXZfd2FybigmY2Rldi0+ZGV2LCAiVGhlIHFldGggZGV2aWNlIGRyaXZlciAiCiAJCQkiZmFpbGVkIHRvIHJlY292ZXIgYW4gZXJyb3Igb24gdGhlIGRldmljZVxuIik7CiAJCVFFVEhfREJGX01FU1NBR0UoMiwgIiVzIGNoZWNrIG9uIGRldmljZSBkc3RhdD14JXgsIGNzdGF0PXgleFxuIiwKQEAgLTc1MywyMyArNzA3LDIzIEBACiAJaWYgKGRzdGF0ICYgREVWX1NUQVRfVU5JVF9DSEVDSykgewogCQlpZiAoc2Vuc2VbU0VOU0VfUkVTRVRUSU5HX0VWRU5UX0JZVEVdICYKIAkJICAgIFNFTlNFX1JFU0VUVElOR19FVkVOVF9GTEFHKSB7Ci0JCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiUkVWSU5EIik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiUkVWSU5EIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlpZiAoc2Vuc2VbU0VOU0VfQ09NTUFORF9SRUpFQ1RfQllURV0gJgogCQkgICAgU0VOU0VfQ09NTUFORF9SRUpFQ1RfRkxBRykgewotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIkNNRFJFSmkiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJDTURSRUppIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlpZiAoKHNlbnNlWzJdID09IDB4YWYpICYmIChzZW5zZVszXSA9PSAweGZlKSkgewotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIkFGRkUiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJBRkZFIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlpZiAoKCFzZW5zZVswXSkgJiYgKCFzZW5zZVsxXSkgJiYgKCFzZW5zZVsyXSkgJiYgKCFzZW5zZVszXSkpIHsKLQkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJaRVJPU0VOIik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiWkVST1NFTiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIkRHRU5DSEsiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgIkRHRU5DSEsiKTsKIAkJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc3OCw2ICs3MzIsMTAgQEAKIHN0YXRpYyBsb25nIF9fcWV0aF9jaGVja19pcmJfZXJyb3Ioc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsCiAJCXVuc2lnbmVkIGxvbmcgaW50cGFybSwgc3RydWN0IGlyYiAqaXJiKQogeworCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQ7CisKKwljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2Rldik7CisKIAlpZiAoIUlTX0VSUihpcmIpKQogCQlyZXR1cm4gMDsKIApAQCAtNzg1LDE3ICs3NDMsMTUgQEAKIAljYXNlIC1FSU86CiAJCVFFVEhfREJGX01FU1NBR0UoMiwgIiVzIGkvby1lcnJvciBvbiBkZXZpY2VcbiIsCiAJCQlkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJja2lyYmVyciIpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgIiAgcmMlZCIsIC1FSU8pOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiY2tpcmJlcnIiKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgIHJjJWQiLCAtRUlPKTsKIAkJYnJlYWs7CiAJY2FzZSAtRVRJTUVET1VUOgogCQlkZXZfd2FybigmY2Rldi0+ZGV2LCAiQSBoYXJkd2FyZSBvcGVyYXRpb24gdGltZWQgb3V0IgogCQkJIiBvbiB0aGUgZGV2aWNlXG4iKTsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImNraXJiZXJyIik7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiICByYyVkIiwgLUVUSU1FRE9VVCk7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJja2lyYmVyciIpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiAgcmMlZCIsIC1FVElNRURPVVQpOwogCQlpZiAoaW50cGFybSA9PSBRRVRIX1JDRF9QQVJNKSB7Ci0JCQlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gQ0FSRF9GUk9NX0NERVYoY2Rldik7Ci0KIAkJCWlmIChjYXJkICYmIChjYXJkLT5kYXRhLmNjd2RldiA9PSBjZGV2KSkgewogCQkJCWNhcmQtPmRhdGEuc3RhdGUgPSBDSF9TVEFURV9ET1dOOwogCQkJCXdha2VfdXAoJmNhcmQtPndhaXRfcSk7CkBAIC04MDUsOCArNzYxLDggQEAKIAlkZWZhdWx0OgogCQlRRVRIX0RCRl9NRVNTQUdFKDIsICIlcyB1bmtub3duIGVycm9yICVsZCBvbiBkZXZpY2VcbiIsCiAJCQlkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgUFRSX0VSUihpcmIpKTsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImNraXJiZXJyIik7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICIgIHJjPz8/Iik7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJja2lyYmVyciIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiICByYz8/PyIpOwogCX0KIAlyZXR1cm4gUFRSX0VSUihpcmIpOwogfQpAQCAtODIyLDggKzc3OCw2IEBACiAJc3RydWN0IHFldGhfY21kX2J1ZmZlciAqaW9iOwogCV9fdTggaW5kZXg7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA1LCAiaXJxIik7Ci0KIAlpZiAoX19xZXRoX2NoZWNrX2lyYl9lcnJvcihjZGV2LCBpbnRwYXJtLCBpcmIpKQogCQlyZXR1cm47CiAJY3N0YXQgPSBpcmItPnNjc3cuY21kLmNzdGF0OwpAQCAtODMzLDE1ICs3ODcsMTcgQEAKIAlpZiAoIWNhcmQpCiAJCXJldHVybjsKIAorCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDUsICJpcnEiKTsKKwogCWlmIChjYXJkLT5yZWFkLmNjd2RldiA9PSBjZGV2KSB7CiAJCWNoYW5uZWwgPSAmY2FyZC0+cmVhZDsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgNSwgInJlYWQiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNSwgInJlYWQiKTsKIAl9IGVsc2UgaWYgKGNhcmQtPndyaXRlLmNjd2RldiA9PSBjZGV2KSB7CiAJCWNoYW5uZWwgPSAmY2FyZC0+d3JpdGU7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJ3cml0ZSIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCA1LCAid3JpdGUiKTsKIAl9IGVsc2UgewogCQljaGFubmVsID0gJmNhcmQtPmRhdGE7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJkYXRhIik7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDUsICJkYXRhIik7CiAJfQogCWF0b21pY19zZXQoJmNoYW5uZWwtPmlycV9wZW5kaW5nLCAwKTsKIApAQCAtODU3LDEyICs4MTMsMTIgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoaW50cGFybSA9PSBRRVRIX0NMRUFSX0NIQU5ORUxfUEFSTSkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAiY2xyY2hwYXIiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNiwgImNscmNocGFyIik7CiAJCS8qIHdlIGRvbid0IGhhdmUgdG8gaGFuZGxlIHRoaXMgZnVydGhlciAqLwogCQlpbnRwYXJtID0gMDsKIAl9CiAJaWYgKGludHBhcm0gPT0gUUVUSF9IQUxUX0NIQU5ORUxfUEFSTSkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAiaGx0Y2hwYXIiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNiwgImhsdGNocGFyIik7CiAJCS8qIHdlIGRvbid0IGhhdmUgdG8gaGFuZGxlIHRoaXMgZnVydGhlciAqLwogCQlpbnRwYXJtID0gMDsKIAl9CkBAIC05NjMsNyArOTE5LDcgQEAKIHsKIAlpbnQgaSwgajsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJjbGVhcnFkYmYiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiY2xlYXJxZGJmIik7CiAJLyogY2xlYXIgb3V0Ym91bmQgYnVmZmVycyB0byBmcmVlIHNrYnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+cWRpby5ub19vdXRfcXVldWVzOyArK2kpCiAJCWlmIChjYXJkLT5xZGlvLm91dF9xc1tpXSkgewpAQCAtOTc4LDcgKzkzNCw2IEBACiB7CiAJc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKnBvb2xfZW50cnksICp0bXA7CiAJaW50IGkgPSAwOwotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJmcmVlcG9vbCIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sX2VudHJ5LCB0bXAsCiAJCQkJICZjYXJkLT5xZGlvLmluaXRfcG9vbC5lbnRyeV9saXN0LCBpbml0X2xpc3QpewogCQlmb3IgKGkgPSAwOyBpIDwgUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpOyArK2kpCkBAIC05OTIsNyArOTQ3LDYgQEAKIHsKIAlpbnQgaSwgajsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJmcmVlcWRiZiIpOwogCWlmIChhdG9taWNfeGNoZygmY2FyZC0+cWRpby5zdGF0ZSwgUUVUSF9RRElPX1VOSU5JVElBTElaRUQpID09CiAJCVFFVEhfUURJT19VTklOSVRJQUxJWkVEKQogCQlyZXR1cm47CkBAIC0xMDg5LDcgKzEwNDMsNyBAQAogCWludCByYyA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGhyZWFkX21hc2tfbG9jaywgZmxhZ3MpOwotCVFFVEhfREJGX1RFWFRfKFRSQUNFLCA0LCAiICAlMDJ4JTAyeCUwMngiLAorCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAiICAlMDJ4JTAyeCUwMngiLAogCQkJKHU4KSBjYXJkLT50aHJlYWRfc3RhcnRfbWFzaywKIAkJCSh1OCkgY2FyZC0+dGhyZWFkX2FsbG93ZWRfbWFzaywKIAkJCSh1OCkgY2FyZC0+dGhyZWFkX3J1bm5pbmdfbWFzayk7CkBAIC0xMTAyLDcgKzEwNTYsNyBAQAogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFldGhfY2FyZCwKIAkJCQkJa2VybmVsX3RocmVhZF9zdGFydGVyKTsKLQlRRVRIX0RCRl9URVhUKFRSQUNFICwgMiwgInN0cnRocmQiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkICwgMiwgInN0cnRocmQiKTsKIAogCWlmIChjYXJkLT5yZWFkLnN0YXRlICE9IENIX1NUQVRFX1VQICYmCiAJICAgIGNhcmQtPndyaXRlLnN0YXRlICE9IENIX1NUQVRFX1VQKQpAQCAtMTEyNCw2ICsxMDc4LDcgQEAKIAljYXJkLT5zdGF0ZSA9IENBUkRfU1RBVEVfRE9XTjsKIAljYXJkLT5sYW5fb25saW5lID0gMDsKIAljYXJkLT51c2VfaGFyZF9zdG9wID0gMDsKKwljYXJkLT5yZWFkX29yX3dyaXRlX3Byb2JsZW0gPSAwOwogCWNhcmQtPmRldiA9IE5VTEw7CiAJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnZsYW5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bWNsb2NrKTsKQEAgLTExMzIsNiArMTA4Nyw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmlwX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZjYXJkLT50aHJlYWRfbWFza19sb2NrKTsKIAltdXRleF9pbml0KCZjYXJkLT5jb25mX211dGV4KTsKKwltdXRleF9pbml0KCZjYXJkLT5kaXNjaXBsaW5lX211dGV4KTsKIAljYXJkLT50aHJlYWRfc3RhcnRfbWFzayA9IDA7CiAJY2FyZC0+dGhyZWFkX2FsbG93ZWRfbWFzayA9IDA7CiAJY2FyZC0+dGhyZWFkX3J1bm5pbmdfbWFzayA9IDA7CkBAIC0xMjI5LDggKzExODUsOCBAQAogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQ7CiAJaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImNsZWFyY2giKTsKIAljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2hhbm5lbC0+Y2N3ZGV2KTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiY2xlYXJjaCIpOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CiAJcmMgPSBjY3dfZGV2aWNlX2NsZWFyKGNoYW5uZWwtPmNjd2RldiwgUUVUSF9DTEVBUl9DSEFOTkVMX1BBUk0pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKQEAgLTEyNTMsOCArMTIwOSw4IEBACiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZDsKIAlpbnQgcmM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAiaGFsdGNoIik7CiAJY2FyZCA9IENBUkRfRlJPTV9DREVWKGNoYW5uZWwtPmNjd2Rldik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImhhbHRjaCIpOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CiAJcmMgPSBjY3dfZGV2aWNlX2hhbHQoY2hhbm5lbC0+Y2N3ZGV2LCBRRVRIX0hBTFRfQ0hBTk5FTF9QQVJNKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CkBAIC0xMjc0LDcgKzEyMzAsNyBAQAogewogCWludCByYzEgPSAwLCByYzIgPSAwLCByYzMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImhhbHRjaHMiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiaGFsdGNocyIpOwogCXJjMSA9IHFldGhfaGFsdF9jaGFubmVsKCZjYXJkLT5yZWFkKTsKIAlyYzIgPSBxZXRoX2hhbHRfY2hhbm5lbCgmY2FyZC0+d3JpdGUpOwogCXJjMyA9IHFldGhfaGFsdF9jaGFubmVsKCZjYXJkLT5kYXRhKTsKQEAgLTEyODksNyArMTI0NSw3IEBACiB7CiAJaW50IHJjMSA9IDAsIHJjMiA9IDAsIHJjMyA9IDA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAiY2xlYXJjaHMiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiY2xlYXJjaHMiKTsKIAlyYzEgPSBxZXRoX2NsZWFyX2NoYW5uZWwoJmNhcmQtPnJlYWQpOwogCXJjMiA9IHFldGhfY2xlYXJfY2hhbm5lbCgmY2FyZC0+d3JpdGUpOwogCXJjMyA9IHFldGhfY2xlYXJfY2hhbm5lbCgmY2FyZC0+ZGF0YSk7CkBAIC0xMzA0LDggKzEyNjAsNyBAQAogewogCWludCByYyA9IDA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAiY2xoYWNyZCIpOwotCVFFVEhfREJGX0hFWChUUkFDRSwgMywgJmNhcmQsIHNpemVvZih2b2lkICopKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiY2xoYWNyZCIpOwogCiAJaWYgKGhhbHQpCiAJCXJjID0gcWV0aF9oYWx0X2NoYW5uZWxzKGNhcmQpOwpAQCAtMTMxOCw3ICsxMjczLDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInFkaW9jbHIiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAicWRpb2NsciIpOwogCXN3aXRjaCAoYXRvbWljX2NtcHhjaGcoJmNhcmQtPnFkaW8uc3RhdGUsIFFFVEhfUURJT19FU1RBQkxJU0hFRCwKIAkJUUVUSF9RRElPX0NMRUFOSU5HKSkgewogCWNhc2UgUUVUSF9RRElPX0VTVEFCTElTSEVEOgpAQCAtMTMyOSw3ICsxMjg0LDcgQEAKIAkJCXJjID0gcWRpb19zaHV0ZG93bihDQVJEX0RERVYoY2FyZCksCiAJCQkJUURJT19GTEFHX0NMRUFOVVBfVVNJTkdfQ0xFQVIpOwogCQlpZiAocmMpCi0JCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMywgIjFlcnIlZCIsIHJjKTsKKwkJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAzLCAiMWVyciVkIiwgcmMpOwogCQlxZGlvX2ZyZWUoQ0FSRF9EREVWKGNhcmQpKTsKIAkJYXRvbWljX3NldCgmY2FyZC0+cWRpby5zdGF0ZSwgUUVUSF9RRElPX0FMTE9DQVRFRCk7CiAJCWJyZWFrOwpAQCAtMTM0MCw3ICsxMjk1LDcgQEAKIAl9CiAJcmMgPSBxZXRoX2NsZWFyX2hhbHRfY2FyZChjYXJkLCB1c2VfaGFsdCk7CiAJaWYgKHJjKQotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMywgIjJlcnIlZCIsIHJjKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDMsICIyZXJyJWQiLCByYyk7CiAJY2FyZC0+c3RhdGUgPSBDQVJEX1NUQVRFX0RPV047CiAJcmV0dXJuIHJjOwogfQpAQCAtMTQzMiwxNCArMTM4NywxMCBAQAogewogCXN3aXRjaCAoY2FyZC0+aW5mby50eXBlKSB7CiAJY2FzZSBRRVRIX0NBUkRfVFlQRV9JUUQ6Ci0JCWlmIChjYXJkLT5pcGF0by5lbmFibGVkKQotCQkJY2FyZC0+aW5mby5mdW5jX2xldmVsID0KLQkJCQlRRVRIX0lEWF9GVU5DX0xFVkVMX0lRRF9FTkFfSVBBVDsKLQkJZWxzZQotCQkJY2FyZC0+aW5mby5mdW5jX2xldmVsID0KLQkJCQlRRVRIX0lEWF9GVU5DX0xFVkVMX0lRRF9ESVNfSVBBVDsKKwkJY2FyZC0+aW5mby5mdW5jX2xldmVsID0JUUVUSF9JRFhfRlVOQ19MRVZFTF9JUUQ7CiAJCWJyZWFrOwogCWNhc2UgUUVUSF9DQVJEX1RZUEVfT1NEOgorCWNhc2UgUUVUSF9DQVJEX1RZUEVfT1NOOgogCQljYXJkLT5pbmZvLmZ1bmNfbGV2ZWwgPSBRRVRIX0lEWF9GVU5DX0xFVkVMX09TRDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE2MzcsMTUgKzE1ODgsMTggQEAKIAkJCQkiaG9zdFxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBRRVRIX0lEWF9BQ1RfRVJSX0FVVEg6CisJCWNhc2UgUUVUSF9JRFhfQUNUX0VSUl9BVVRIX1VTRVI6CiAJCQlkZXZfZXJyKCZjYXJkLT5yZWFkLmNjd2Rldi0+ZGV2LAogCQkJCSJTZXR0aW5nIHRoZSBkZXZpY2Ugb25saW5lIGZhaWxlZCBiZWNhdXNlIG9mICIKLQkJCQkiaW5zdWZmaWNpZW50IExQQVIgYXV0aG9yaXphdGlvblxuIik7CisJCQkJImluc3VmZmljaWVudCBhdXRob3JpemF0aW9uXG4iKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUUVUSF9EQkZfTUVTU0FHRSgyLCAiJXMgSURYX0FDVElWQVRFIG9uIHJlYWQgY2hhbm5lbDoiCiAJCQkJIiBuZWdhdGl2ZSByZXBseVxuIiwKIAkJCQlkZXZfbmFtZSgmY2FyZC0+cmVhZC5jY3dkZXYtPmRldikpOwogCQl9CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiaWR4cmVhZCVjIiwKKwkJCVFFVEhfSURYX0FDVF9DQVVTRV9DT0RFKGlvYi0+ZGF0YSkpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE3MDUsOCArMTY1OSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dCwgZXZlbnRfdGltZW91dDsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAic2VuZGN0bCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJzZW5kY3RsIik7CiAKKwlpZiAoY2FyZC0+cmVhZF9vcl93cml0ZV9wcm9ibGVtKSB7CisJCXFldGhfcmVsZWFzZV9idWZmZXIoaW9iLT5jaGFubmVsLCBpb2IpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcmVwbHkgPSBxZXRoX2FsbG9jX3JlcGx5KGNhcmQpOwogCWlmICghcmVwbHkpIHsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNzMyLDcgKzE2OTAsNyBAQAogCQlldmVudF90aW1lb3V0ID0gUUVUSF9USU1FT1VUOwogCXRpbWVvdXQgPSBqaWZmaWVzICsgZXZlbnRfdGltZW91dDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDYsICJub2lycXBuZCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDYsICJub2lycXBuZCIpOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjYXJkLT53cml0ZS5jY3dkZXYpLCBmbGFncyk7CiAJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNhcmQtPndyaXRlLmNjd2RldiwgJmNhcmQtPndyaXRlLmNjdywKIAkJCSAgICAgIChhZGRyX3QpIGlvYiwgMCwgMCk7CkBAIC0xNzQxLDcgKzE2OTksNyBAQAogCQlRRVRIX0RCRl9NRVNTQUdFKDIsICIlcyBxZXRoX3NlbmRfY29udHJvbF9kYXRhOiAiCiAJCQkiY2N3X2RldmljZV9zdGFydCByYyA9ICVpXG4iLAogCQkJZGV2X25hbWUoJmNhcmQtPndyaXRlLmNjd2Rldi0+ZGV2KSwgcmMpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgIiBlcnIlZCIsIHJjKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgZXJyJWQiLCByYyk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsX2luaXQoJnJlcGx5LT5saXN0KTsKIAkJcWV0aF9wdXRfcmVwbHkocmVwbHkpOwpAQCAtMTc3OCw2ICsxNzM2LDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXBseS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCXJlcGx5LT5yYyA9IC1FVElNRTsKIAlhdG9taWNfaW5jKCZyZXBseS0+cmVjZWl2ZWQpOworCWF0b21pY19zZXQoJmNhcmQtPndyaXRlLmlycV9wZW5kaW5nLCAwKTsKKwlxZXRoX3JlbGVhc2VfYnVmZmVyKGlvYi0+Y2hhbm5lbCwgaW9iKTsKKwljYXJkLT53cml0ZS5idWZfbm8gPSAoY2FyZC0+d3JpdGUuYnVmX25vICsgMSkgJSBRRVRIX0NNRF9CVUZGRVJfTk87CiAJd2FrZV91cCgmcmVwbHktPndhaXRfcSk7CiAJcmMgPSByZXBseS0+cmM7CiAJcWV0aF9wdXRfcmVwbHkocmVwbHkpOwpAQCAtMTk3OCw3ICsxOTM5LDcgQEAKIAkJY2FyZC0+aW5mby5saW5rX3R5cGUgPSBsaW5rX3R5cGU7CiAJfSBlbHNlCiAJCWNhcmQtPmluZm8ubGlua190eXBlID0gMDsKLQlRRVRIX0RCRl9URVhUXyhTRVRVUCwgMiwgImxpbmslZCIsIGxpbmtfdHlwZSk7CisJUUVUSF9EQkZfVEVYVF8oU0VUVVAsIDIsICJsaW5rJWQiLCBjYXJkLT5pbmZvLmxpbmtfdHlwZSk7CiAJUUVUSF9EQkZfVEVYVF8oU0VUVVAsIDIsICIgIHJjJWQiLCBpb2ItPnJjKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMzUsNyArMTk5Niw3IEBACiAJCVFFVEhfREJGX1RFWFQoU0VUVVAsIDIsICJvbG1saW1pdCIpOwogCQlkZXZfZXJyKCZjYXJkLT5nZGV2LT5kZXYsICJBIGNvbm5lY3Rpb24gY291bGQgbm90IGJlICIKIAkJCSJlc3RhYmxpc2hlZCBiZWNhdXNlIG9mIGFuIE9MTSBsaW1pdFxuIik7Ci0JCXJjID0gLUVNTElOSzsKKwkJaW9iLT5yYyA9IC1FTUxJTks7CiAJfQogCVFFVEhfREJGX1RFWFRfKFNFVFVQLCAyLCAiICByYyVkIiwgaW9iLT5yYyk7CiAJcmV0dXJuIHJjOwpAQCAtMjMzNSw3ICsyMjk2LDcgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqZW50cnk7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA1LCAiaW53cmtsc3QiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA1LCAiaW53cmtsc3QiKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksCiAJCQkgICAgJmNhcmQtPnFkaW8uaW5pdF9wb29sLmVudHJ5X2xpc3QsIGluaXRfbGlzdCkgewpAQCAtMjUyMiw3ICsyNDgzLDcgQEAKIAlpbnQgcmM7CiAJY2hhciBwcm90X3R5cGU7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAic2VuZGlwYSIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzZW5kaXBhIik7CiAKIAlpZiAoY2FyZC0+b3B0aW9ucy5sYXllcjIpCiAJCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfT1NOKQpAQCAtMjUzNCw2ICsyNDk1LDEwIEBACiAJcWV0aF9wcmVwYXJlX2lwYV9jbWQoY2FyZCwgaW9iLCBwcm90X3R5cGUpOwogCXJjID0gcWV0aF9zZW5kX2NvbnRyb2xfZGF0YShjYXJkLCBJUEFfQ01EX0xFTkdUSCwKIAkJCQkJCWlvYiwgcmVwbHlfY2IsIHJlcGx5X3BhcmFtKTsKKwlpZiAocmMgPT0gLUVUSU1FKSB7CisJCXFldGhfY2xlYXJfaXBhY21kX2xpc3QoY2FyZCk7CisJCXFldGhfc2NoZWR1bGVfcmVjb3ZlcnkoY2FyZCk7CisJfQogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHFldGhfc2VuZF9pcGFfY21kKTsKQEAgLTI1ODIsNyArMjU0Nyw3IEBACiB7CiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImRlZmFkcGNiIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImRlZmFkcGNiIik7CiAKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKSBkYXRhOwogCWlmIChjbWQtPmhkci5yZXR1cm5fY29kZSA9PSAwKQpAQCAtMjU5Nyw3ICsyNTYyLDcgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAicXV5YWRwY2IiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAicXV5YWRwY2IiKTsKIAogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopIGRhdGE7CiAJaWYgKGNtZC0+ZGF0YS5zZXRhZGFwdGVycGFybXMuZGF0YS5xdWVyeV9jbWRzX3N1cHAubGFuX3R5cGUgJiAweDdmKSB7CkBAIC0yNjMzLDcgKzI1OTgsNyBAQAogCWludCByYzsKIAlzdHJ1Y3QgcWV0aF9jbWRfYnVmZmVyICppb2I7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAicXVlcnlhZHAiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAicXVlcnlhZHAiKTsKIAlpb2IgPSBxZXRoX2dldF9hZGFwdGVyX2NtZChjYXJkLCBJUEFfU0VUQURQX1FVRVJZX0NPTU1BTkRTX1NVUFBPUlRFRCwKIAkJCQkgICBzaXplb2Yoc3RydWN0IHFldGhfaXBhY21kX3NldGFkcHBhcm1zKSk7CiAJcmMgPSBxZXRoX3NlbmRfaXBhX2NtZChjYXJkLCBpb2IsIHFldGhfcXVlcnlfc2V0YWRhcHRlcnBhcm1zX2NiLCBOVUxMKTsKQEAgLTI2NDUsMTMgKzI2MTAsMTIgQEAKIAkJdW5zaWduZWQgaW50IHFkaW9fZXJyb3IsIGNvbnN0IGNoYXIgKmRiZnRleHQpCiB7CiAJaWYgKHFkaW9fZXJyb3IpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgZGJmdGV4dCk7Ci0JCVFFVEhfREJGX1RFWFQoUUVSUiwgMiwgZGJmdGV4dCk7Ci0JCVFFVEhfREJGX1RFWFRfKFFFUlIsIDIsICIgRjE1PSUwMlgiLAorCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCBkYmZ0ZXh0KTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgRjE1PSUwMlgiLAogCQkJICAgICAgIGJ1Zi0+ZWxlbWVudFsxNV0uZmxhZ3MgJiAweGZmKTsKLQkJUUVUSF9EQkZfVEVYVF8oUUVSUiwgMiwgIiBGMTQ9JTAyWCIsCisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiIEYxND0lMDJYIiwKIAkJCSAgICAgICBidWYtPmVsZW1lbnRbMTRdLmZsYWdzICYgMHhmZik7Ci0JCVFFVEhfREJGX1RFWFRfKFFFUlIsIDIsICIgcWVycj0lWCIsIHFkaW9fZXJyb3IpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiBxZXJyPSVYIiwgcWRpb19lcnJvcik7CiAJCWlmICgoYnVmLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmYpID09IDB4MTIpIHsKIAkJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXJldHVybiAwOwpAQCAtMjcxNyw4ICsyNjgxLDcgQEAKIAkJaWYgKHJjKSB7CiAJCQlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LAogCQkJCSJRRElPIHJlcG9ydGVkIGFuIGVycm9yLCByYz0laVxuIiwgcmMpOwotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgInFpbmJlcnIiKTsKLQkJCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiJXMiLCBDQVJEX0JVU19JRChjYXJkKSk7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAicWluYmVyciIpOwogCQl9CiAJCXF1ZXVlLT5uZXh0X2J1Zl90b19pbml0ID0gKHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0ICsgY291bnQpICUKIAkJCQkJICBRRElPX01BWF9CVUZGRVJTX1BFUl9ROwpAQCAtMjczMSw3ICsyNjk0LDcgQEAKIHsKIAlpbnQgc2JhbGYxNSA9IGJ1ZmZlci0+YnVmZmVyLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmY7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAiaGRzbmRlcnIiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA2LCAiaGRzbmRlcnIiKTsKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX0lRRCkgewogCQlpZiAoc2JhbGYxNSA9PSAwKSB7CiAJCQlxZGlvX2VyciA9IDA7CkBAIC0yNzQ3LDkgKzI3MTAsOCBAQAogCWlmICgoc2JhbGYxNSA+PSAxNSkgJiYgKHNiYWxmMTUgPD0gMzEpKQogCQlyZXR1cm4gUUVUSF9TRU5EX0VSUk9SX1JFVFJZOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMSwgImxua2ZhaWwiKTsKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiVzIiwgQ0FSRF9CVVNfSUQoY2FyZCkpOwotCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAxLCAiJTA0eCAlMDJ4IiwKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAxLCAibG5rZmFpbCIpOworCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAxLCAiJTA0eCAlMDJ4IiwKIAkJICAgICAgICh1MTYpcWRpb19lcnIsICh1OClzYmFsZjE1KTsKIAlyZXR1cm4gUUVUSF9TRU5EX0VSUk9SX0xJTktfRkFJTFVSRTsKIH0KQEAgLTI3NjQsNyArMjcyNiw3IEBACiAJCWlmIChhdG9taWNfcmVhZCgmcXVldWUtPnVzZWRfYnVmZmVycykKIAkJICAgID49IFFFVEhfSElHSF9XQVRFUk1BUktfUEFDSyl7CiAJCQkvKiBzd2l0Y2ggbm9uLVBBQ0tJTkcgLT4gUEFDS0lORyAqLwotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgNiwgIm5wLT5wYWNrIik7CisJCQlRRVRIX0NBUkRfVEVYVChxdWV1ZS0+Y2FyZCwgNiwgIm5wLT5wYWNrIik7CiAJCQlpZiAocXVldWUtPmNhcmQtPm9wdGlvbnMucGVyZm9ybWFuY2Vfc3RhdHMpCiAJCQkJcXVldWUtPmNhcmQtPnBlcmZfc3RhdHMuc2NfZHBfcCsrOwogCQkJcXVldWUtPmRvX3BhY2sgPSAxOwpAQCAtMjc4Nyw3ICsyNzQ5LDcgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZxdWV1ZS0+dXNlZF9idWZmZXJzKQogCQkgICAgPD0gUUVUSF9MT1dfV0FURVJNQVJLX1BBQ0spIHsKIAkJCS8qIHN3aXRjaCBQQUNLSU5HIC0+IG5vbi1QQUNLSU5HICovCi0JCQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAicGFjay0+bnAiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKHF1ZXVlLT5jYXJkLCA2LCAicGFjay0+bnAiKTsKIAkJCWlmIChxdWV1ZS0+Y2FyZC0+b3B0aW9ucy5wZXJmb3JtYW5jZV9zdGF0cykKIAkJCQlxdWV1ZS0+Y2FyZC0+cGVyZl9zdGF0cy5zY19wX2RwKys7CiAJCQlxdWV1ZS0+ZG9fcGFjayA9IDA7CkBAIC0yODk2LDkgKzI4NTgsOCBAQAogCQkvKiBpZ25vcmUgdGVtcG9yYXJ5IFNJR0EgZXJyb3JzIHdpdGhvdXQgYnVzeSBjb25kaXRpb24gKi8KIAkJaWYgKHJjID09IFFESU9fRVJST1JfU0lHQV9UQVJHRVQpCiAJCQlyZXR1cm47Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJmbHVzaGJ1ZiIpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgIiBlcnIlZCIsIHJjKTsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDIsICIlcyIsIENBUkRfRERFVl9JRChxdWV1ZS0+Y2FyZCkpOworCQlRRVRIX0NBUkRfVEVYVChxdWV1ZS0+Y2FyZCwgMiwgImZsdXNoYnVmIik7CisJCVFFVEhfQ0FSRF9URVhUXyhxdWV1ZS0+Y2FyZCwgMiwgIiBlcnIlZCIsIHJjKTsKIAogCQkvKiB0aGlzIG11c3Qgbm90IGhhcHBlbiB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gaWYgaXQKIAkJICogaGFwcGVucyBzb21ldGhpbmcgaXMgcmVhbGx5IHdyb25nIC0+IHJlY292ZXIgKi8KQEAgLTI5NjAsMTAgKzI5MjEsOSBAQAogCWludCBpOwogCXVuc2lnbmVkIHFldGhfc2VuZF9lcnI7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAicWRvdWhkbCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDYsICJxZG91aGRsIik7CiAJaWYgKHFkaW9fZXJyb3IgJiBRRElPX0VSUk9SX0FDVElWQVRFX0NIRUNLX0NPTkRJVElPTikgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiYWNoa2NvbmQiKTsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDIsICIlcyIsIENBUkRfQlVTX0lEKGNhcmQpKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImFjaGtjb25kIik7CiAJCW5ldGlmX3N0b3BfcXVldWUoY2FyZC0+ZGV2KTsKIAkJcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShjYXJkKTsKIAkJcmV0dXJuOwpAQCAtMzAzMywxMyArMjk5MywxMSBAQAogaW50IHFldGhfZ2V0X2VsZW1lbnRzX25vKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIHZvaWQgKmhkciwKIAkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZWxlbXMpCiB7Ci0JaW50IGVsZW1lbnRzX25lZWRlZCA9IDA7CisJaW50IGRsZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CisJaW50IGVsZW1lbnRzX25lZWRlZCA9IFBGTl9VUCgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyBkbGVuIC0gMSkgLQorCQlQRk5fRE9XTigodW5zaWduZWQgbG9uZylza2ItPmRhdGEpOwogCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiAwKQotCQllbGVtZW50c19uZWVkZWQgPSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpOwotCWlmIChlbGVtZW50c19uZWVkZWQgPT0gMCkKLQkJZWxlbWVudHNfbmVlZGVkID0gMSArICgoKCgodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhKSAlCi0JCQkJUEFHRV9TSVpFKSArIHNrYi0+bGVuKSA+PiBQQUdFX1NISUZUKTsKKwllbGVtZW50c19uZWVkZWQgKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAlpZiAoKGVsZW1lbnRzX25lZWRlZCArIGVsZW1zKSA+IFFFVEhfTUFYX0JVRkZFUl9FTEVNRU5UUyhjYXJkKSkgewogCQlRRVRIX0RCRl9NRVNTQUdFKDIsICJJbnZhbGlkIHNpemUgb2YgSVAgcGFja2V0ICIKIAkJCSIoTnVtYmVyPSVkIC8gTGVuZ3RoPSVkKS4gRGlzY2FyZGVkLlxuIiwKQEAgLTMwNTAsMTUgKzMwMDgsMzUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHFldGhfZ2V0X2VsZW1lbnRzX25vKTsKIAoraW50IHFldGhfaGRyX2Noa19hbmRfYm91bmNlKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCit7CisJaW50IGhyb29tLCBpbnBhZ2UsIHJlc3Q7CisKKwlpZiAoKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSAmIFBBR0VfTUFTSykgIT0KKwkgICAgKCgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyBsZW4gLSAxKSAmIFBBR0VfTUFTSykpIHsKKwkJaHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwkJaW5wYWdlID0gUEFHRV9TSVpFIC0gKCh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEgJSBQQUdFX1NJWkUpOworCQlyZXN0ID0gbGVuIC0gaW5wYWdlOworCQlpZiAocmVzdCA+IGhyb29tKQorCQkJcmV0dXJuIDE7CisJCW1lbW1vdmUoc2tiLT5kYXRhIC0gcmVzdCwgc2tiLT5kYXRhLCBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pOworCQlza2ItPmRhdGEgLT0gcmVzdDsKKwkJUUVUSF9EQkZfTUVTU0FHRSgyLCAic2tiIGJvdW5jZSBsZW46ICVkIHJlc3Q6ICVkXG4iLCBsZW4sIHJlc3QpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFldGhfaGRyX2Noa19hbmRfYm91bmNlKTsKKwogc3RhdGljIGlubGluZSB2b2lkIF9fcWV0aF9maWxsX2J1ZmZlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCXN0cnVjdCBxZGlvX2J1ZmZlciAqYnVmZmVyLCBpbnQgaXNfdHNvLCBpbnQgKm5leHRfZWxlbWVudF90b19maWxsLAogCWludCBvZmZzZXQpCiB7Ci0JaW50IGxlbmd0aCA9IHNrYi0+bGVuOworCWludCBsZW5ndGggPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CiAJaW50IGxlbmd0aF9oZXJlOwogCWludCBlbGVtZW50OwogCWNoYXIgKmRhdGE7Ci0JaW50IGZpcnN0X2xhcCA7CisJaW50IGZpcnN0X2xhcCwgY250OworCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CiAKIAllbGVtZW50ID0gKm5leHRfZWxlbWVudF90b19maWxsOwogCWRhdGEgPSBza2ItPmRhdGE7CkBAIC0zMDgxLDEwICszMDU5LDE0IEBACiAJCWxlbmd0aCAtPSBsZW5ndGhfaGVyZTsKIAkJaWYgKCFsZW5ndGgpIHsKIAkJCWlmIChmaXJzdF9sYXApCi0JCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0gMDsKKwkJCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKKwkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KKwkJCQkJCVNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJCQllbHNlCisJCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9IDA7CiAJCQllbHNlCiAJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQkgICAgU0JBTF9GTEFHU19MQVNUX0ZSQUc7CisJCQkJICAgIFNCQUxfRkxBR1NfTUlERExFX0ZSQUc7CiAJCX0gZWxzZSB7CiAJCQlpZiAoZmlyc3RfbGFwKQogCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9CkBAIC0zMDk3LDYgKzMwNzksMTggQEAKIAkJZWxlbWVudCsrOwogCQlmaXJzdF9sYXAgPSAwOwogCX0KKworCWZvciAoY250ID0gMDsgY250IDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgY250KyspIHsKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2NudF07CisJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5hZGRyID0gKGNoYXIgKilwYWdlX3RvX3BoeXMoZnJhZy0+cGFnZSkKKwkJCSsgZnJhZy0+cGFnZV9vZmZzZXQ7CisJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5sZW5ndGggPSBmcmFnLT5zaXplOworCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPSBTQkFMX0ZMQUdTX01JRERMRV9GUkFHOworCQllbGVtZW50Kys7CisJfQorCisJaWYgKGJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50IC0gMV0uZmxhZ3MpCisJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50IC0gMV0uZmxhZ3MgPSBTQkFMX0ZMQUdTX0xBU1RfRlJBRzsKIAkqbmV4dF9lbGVtZW50X3RvX2ZpbGwgPSBlbGVtZW50OwogfQogCkBAIC0zMTM3LDIwICszMTMxLDE2IEBACiAJCWJ1Zi0+bmV4dF9lbGVtZW50X3RvX2ZpbGwrKzsKIAl9CiAKLQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKQotCQlfX3FldGhfZmlsbF9idWZmZXIoc2tiLCBidWZmZXIsIGxhcmdlX3NlbmQsCi0JCQkJKGludCAqKSZidWYtPm5leHRfZWxlbWVudF90b19maWxsLCBvZmZzZXQpOwotCWVsc2UKLQkJX19xZXRoX2ZpbGxfYnVmZmVyX2ZyYWcoc2tiLCBidWZmZXIsIGxhcmdlX3NlbmQsCi0JCQkJCShpbnQgKikmYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCk7CisJX19xZXRoX2ZpbGxfYnVmZmVyKHNrYiwgYnVmZmVyLCBsYXJnZV9zZW5kLAorCQkoaW50ICopJmJ1Zi0+bmV4dF9lbGVtZW50X3RvX2ZpbGwsIG9mZnNldCk7CiAKIAlpZiAoIXF1ZXVlLT5kb19wYWNrKSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDYsICJmaWxsYmZucCIpOworCQlRRVRIX0NBUkRfVEVYVChxdWV1ZS0+Y2FyZCwgNiwgImZpbGxiZm5wIik7CiAJCS8qIHNldCBzdGF0ZSB0byBQUklNRUQgLT4gd2lsbCBiZSBmbHVzaGVkICovCiAJCWF0b21pY19zZXQoJmJ1Zi0+c3RhdGUsIFFFVEhfUURJT19CVUZfUFJJTUVEKTsKIAkJZmx1c2hfY250ID0gMTsKIAl9IGVsc2UgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCA2LCAiZmlsbGJmcGEiKTsKKwkJUUVUSF9DQVJEX1RFWFQocXVldWUtPmNhcmQsIDYsICJmaWxsYmZwYSIpOwogCQlpZiAocXVldWUtPmNhcmQtPm9wdGlvbnMucGVyZm9ybWFuY2Vfc3RhdHMpCiAJCQlxdWV1ZS0+Y2FyZC0+cGVyZl9zdGF0cy5za2JzX3NlbnRfcGFjaysrOwogCQlpZiAoYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCA+PQpAQCAtMzIxMCw3ICszMjAwLDcgQEAKIAkJCXJjID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQlRRVRIX0RCRl9URVhUKFFFUlIsIDIsICJxcmRyb3AiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJxcmRyb3AiKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTMzMTIsMTQgKzMzMDIsMTQgQEAKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAJc3RydWN0IHFldGhfaXBhY21kX3NldGFkcHBhcm1zICpzZXRwYXJtczsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJwcm1hZHBjYiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJwcm1hZHBjYiIpOwogCiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikgZGF0YTsKIAlzZXRwYXJtcyA9ICYoY21kLT5kYXRhLnNldGFkYXB0ZXJwYXJtcyk7CiAKIAlxZXRoX2RlZmF1bHRfc2V0YWRhcHRlcnBhcm1zX2NiKGNhcmQsIHJlcGx5LCAodW5zaWduZWQgbG9uZyljbWQpOwogCWlmIChjbWQtPmhkci5yZXR1cm5fY29kZSkgewotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgInBybXJjJTIuMngiLCBjbWQtPmhkci5yZXR1cm5fY29kZSk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAicHJtcmMlMi4yeCIsIGNtZC0+aGRyLnJldHVybl9jb2RlKTsKIAkJc2V0cGFybXMtPmRhdGEubW9kZSA9IFNFVF9QUk9NSVNDX01PREVfT0ZGOwogCX0KIAljYXJkLT5pbmZvLnByb21pc2NfbW9kZSA9IHNldHBhcm1zLT5kYXRhLm1vZGU7CkBAIC0zMzMzLDcgKzMzMjMsNyBAQAogCXN0cnVjdCBxZXRoX2NtZF9idWZmZXIgKmlvYjsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAic2V0cHJvbSIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzZXRwcm9tIik7CiAKIAlpZiAoKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmCiAJICAgICAoY2FyZC0+aW5mby5wcm9taXNjX21vZGUgPT0gU0VUX1BST01JU0NfTU9ERV9PTikpIHx8CkBAIC0zMzQzLDcgKzMzMzMsNyBAQAogCW1vZGUgPSBTRVRfUFJPTUlTQ19NT0RFX09GRjsKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQogCQltb2RlID0gU0VUX1BST01JU0NfTU9ERV9PTjsKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgIm1vZGU6JXgiLCBtb2RlKTsKKwlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgNCwgIm1vZGU6JXgiLCBtb2RlKTsKIAogCWlvYiA9IHFldGhfZ2V0X2FkYXB0ZXJfY21kKGNhcmQsIElQQV9TRVRBRFBfU0VUX1BST01JU0NfTU9ERSwKIAkJCXNpemVvZihzdHJ1Y3QgcWV0aF9pcGFjbWRfc2V0YWRwcGFybXMpKTsKQEAgLTMzNjAsOSArMzM1MCw5IEBACiAKIAljYXJkID0gZGV2LT5tbF9wcml2OwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImNoZ210dSIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJjaGdtdHUiKTsKIAlzcHJpbnRmKGRiZl90ZXh0LCAiJTh4IiwgbmV3X210dSk7Ci0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgZGJmX3RleHQpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsIGRiZl90ZXh0KTsKIAogCWlmIChuZXdfbXR1IDwgNjQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzM4Miw3ICszMzcyLDcgQEAKIAogCWNhcmQgPSBkZXYtPm1sX3ByaXY7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA1LCAiZ2V0c3RhdCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDUsICJnZXRzdGF0Iik7CiAKIAlyZXR1cm4gJmNhcmQtPnN0YXRzOwogfQpAQCAtMzM5Myw3ICszMzgzLDcgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiY2hnbWFjY2IiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiY2hnbWFjY2IiKTsKIAogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopIGRhdGE7CiAJaWYgKCFjYXJkLT5vcHRpb25zLmxheWVyMiB8fApAQCAtMzQxMyw3ICszNDAzLDcgQEAKIAlzdHJ1Y3QgcWV0aF9jbWRfYnVmZmVyICppb2I7CiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImNoZ21hYyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJjaGdtYWMiKTsKIAogCWlvYiA9IHFldGhfZ2V0X2FkYXB0ZXJfY21kKGNhcmQsIElQQV9TRVRBRFBfQUxURVJfTUFDX0FERFJFU1MsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBxZXRoX2lwYWNtZF9zZXRhZHBwYXJtcykpOwpAQCAtMzQzMyw5ICszNDIzLDggQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAJc3RydWN0IHFldGhfc2V0X2FjY2Vzc19jdHJsICphY2Nlc3NfY3RybF9yZXE7Ci0JaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNldGFjY2IiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAic2V0YWNjYiIpOwogCiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikgZGF0YTsKIAlhY2Nlc3NfY3RybF9yZXEgPSAmY21kLT5kYXRhLnNldGFkYXB0ZXJwYXJtcy5kYXRhLnNldF9hY2Nlc3NfY3RybDsKQEAgLTM0NjAsNyArMzQ0OSw2IEBACiAJCQljYXJkLT5nZGV2LT5kZXYua29iai5uYW1lLAogCQkJYWNjZXNzX2N0cmxfcmVxLT5zdWJjbWRfY29kZSwKIAkJCWNtZC0+ZGF0YS5zZXRhZGFwdGVycGFybXMuaGRyLnJldHVybl9jb2RlKTsKLQkJcmMgPSAwOwogCQlicmVhazsKIAl9CiAJY2FzZSBTRVRfQUNDRVNTX0NUUkxfUkNfTk9UX1NVUFBPUlRFRDoKQEAgLTM0NzQsNyArMzQ2Miw2IEBACiAKIAkJLyogZW5zdXJlIGlzb2xhdGlvbiBtb2RlIGlzICJub25lIiAqLwogCQljYXJkLT5vcHRpb25zLmlzb2xhdGlvbiA9IElTT0xBVElPTl9NT0RFX05PTkU7Ci0JCXJjID0gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOwogCX0KIAljYXNlIFNFVF9BQ0NFU1NfQ1RSTF9SQ19OT05FX1NIQVJFRF9BREFQVEVSOgpAQCAtMzQ4OSw3ICszNDc2LDYgQEAKIAogCQkvKiBlbnN1cmUgaXNvbGF0aW9uIG1vZGUgaXMgIm5vbmUiICovCiAJCWNhcmQtPm9wdGlvbnMuaXNvbGF0aW9uID0gSVNPTEFUSU9OX01PREVfTk9ORTsKLQkJcmMgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CiAJfQogCWNhc2UgU0VUX0FDQ0VTU19DVFJMX1JDX0FDVElWRV9DSEVDS1NVTV9PRkY6CkBAIC0zNTAzLDcgKzM0ODksNiBAQAogCiAJCS8qIGVuc3VyZSBpc29sYXRpb24gbW9kZSBpcyAibm9uZSIgKi8KIAkJY2FyZC0+b3B0aW9ucy5pc29sYXRpb24gPSBJU09MQVRJT05fTU9ERV9OT05FOwotCQlyYyA9IC1FUEVSTTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CkBAIC0zNTE3LDEyICszNTAyLDExIEBACiAKIAkJLyogZW5zdXJlIGlzb2xhdGlvbiBtb2RlIGlzICJub25lIiAqLwogCQljYXJkLT5vcHRpb25zLmlzb2xhdGlvbiA9IElTT0xBVElPTl9NT0RFX05PTkU7Ci0JCXJjID0gMDsKIAkJYnJlYWs7CiAJfQogCX0KIAlxZXRoX2RlZmF1bHRfc2V0YWRhcHRlcnBhcm1zX2NiKGNhcmQsIHJlcGx5LCAodW5zaWduZWQgbG9uZykgY21kKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcWV0aF9zZXRhZHBwYXJtc19zZXRfYWNjZXNzX2N0cmwoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKQEAgLTM1MzMsNyArMzUxNyw3IEBACiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCXN0cnVjdCBxZXRoX3NldF9hY2Nlc3NfY3RybCAqYWNjZXNzX2N0cmxfcmVxOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNldGFjY3RsIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInNldGFjY3RsIik7CiAKIAlRRVRIX0RCRl9URVhUXyhTRVRVUCwgMiwgInNldGFjY3RsIik7CiAJUUVUSF9EQkZfVEVYVF8oU0VUVVAsIDIsICIlcyIsIGNhcmQtPmdkZXYtPmRldi5rb2JqLm5hbWUpOwpAQCAtMzU1NSw3ICszNTM5LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNldGFjdGxvIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInNldGFjdGxvIik7CiAKIAlpZiAoKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU0QgfHwKIAkgICAgIGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU1gpICYmCkBAIC0zNTgzLDggKzM1NjcsOCBAQAogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAidHh0aW1lbyIpOwogCWNhcmQgPSBkZXYtPm1sX3ByaXY7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInR4dGltZW8iKTsKIAljYXJkLT5zdGF0cy50eF9lcnJvcnMrKzsKIAlxZXRoX3NjaGVkdWxlX3JlY292ZXJ5KGNhcmQpOwogfQpAQCAtMzY2Myw3ICszNjQ3LDcgQEAKIHsKIAl1MTYgczEsIHMyOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNlbmRzbm1wIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInNlbmRzbm1wIik7CiAKIAltZW1jcHkoaW9iLT5kYXRhLCBJUEFfUERVX0hFQURFUiwgSVBBX1BEVV9IRUFERVJfU0laRSk7CiAJbWVtY3B5KFFFVEhfSVBBX0NNRF9ERVNUX0FERFIoaW9iLT5kYXRhKSwKQEAgLTM2ODgsNyArMzY3Miw3IEBACiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAlfX3UxNiBkYXRhX2xlbjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJzbnBjbWRjYiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJzbnBjbWRjYiIpOwogCiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikgc2RhdGE7CiAJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKChjaGFyICopY21kIC0gcmVwbHktPm9mZnNldCk7CkBAIC0zNjk2LDEzICszNjgwLDEzIEBACiAJc25tcCA9ICZjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmRhdGEuc25tcDsKIAogCWlmIChjbWQtPmhkci5yZXR1cm5fY29kZSkgewotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgInNjZXIxJWkiLCBjbWQtPmhkci5yZXR1cm5fY29kZSk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAic2NlcjElaSIsIGNtZC0+aGRyLnJldHVybl9jb2RlKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci5yZXR1cm5fY29kZSkgewogCQljbWQtPmhkci5yZXR1cm5fY29kZSA9CiAJCQljbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci5yZXR1cm5fY29kZTsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICJzY2VyMiVpIiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgNCwgInNjZXIyJWkiLCBjbWQtPmhkci5yZXR1cm5fY29kZSk7CiAJCXJldHVybiAwOwogCX0KIAlkYXRhX2xlbiA9ICooKF9fdTE2ICopUUVUSF9JUEFfUERVX0xFTl9QRFUxKGRhdGEpKTsKQEAgLTM3MTMsMTMgKzM2OTcsMTMgQEAKIAogCS8qIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHVzZXJzcGFjZSAqLwogCWlmICgocWluZm8tPnVkYXRhX2xlbiAtIHFpbmZvLT51ZGF0YV9vZmZzZXQpIDwgZGF0YV9sZW4pIHsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICJzY2VyMyVpIiwgLUVOT01FTSk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAic2NlcjMlaSIsIC1FTk9NRU0pOwogCQljbWQtPmhkci5yZXR1cm5fY29kZSA9IC1FTk9NRU07CiAJCXJldHVybiAwOwogCX0KLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgInNub3JlJWkiLAorCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAic25vcmUlaSIsCiAJCSAgICAgICBjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci51c2VkX3RvdGFsKTsKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgInNzZXFuJWkiLAorCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAic3NlcW4laSIsCiAJCWNtZC0+ZGF0YS5zZXRhZGFwdGVycGFybXMuaGRyLnNlcV9ubyk7CiAJLypjb3B5IGVudHJpZXMgdG8gdXNlciBidWZmZXIqLwogCWlmIChjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci5zZXFfbm8gPT0gMSkgewpAQCAtMzczMyw5ICszNzE3LDkgQEAKIAl9CiAJcWluZm8tPnVkYXRhX29mZnNldCArPSBkYXRhX2xlbjsKIAkvKiBjaGVjayBpZiBhbGwgcmVwbGllcyByZWNlaXZlZCAuLi4gKi8KLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICJzcnRvdCVpIiwKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJzcnRvdCVpIiwKIAkJCSAgICAgICBjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci51c2VkX3RvdGFsKTsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICJzcnNlcSVpIiwKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJzcnNlcSVpIiwKIAkJCSAgICAgICBjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci5zZXFfbm8pOwogCWlmIChjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci5zZXFfbm8gPAogCSAgICBjbWQtPmRhdGEuc2V0YWRhcHRlcnBhcm1zLmhkci51c2VkX3RvdGFsKQpAQCAtMzc1Miw3ICszNzM2LDcgQEAKIAlzdHJ1Y3QgcWV0aF9hcnBfcXVlcnlfaW5mbyBxaW5mbyA9IHswLCB9OwogCWludCByYyA9IDA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic25tcGNtZCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJzbm1wY21kIik7CiAKIAlpZiAoY2FyZC0+aW5mby5ndWVzdGxhbikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzc2NCwxNSArMzc0OCwxMCBAQAogCS8qIHNraXAgNCBieXRlcyAoZGF0YV9sZW4gc3RydWN0IG1lbWJlcikgdG8gZ2V0IHJlcV9sZW4gKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcV9sZW4sIHVkYXRhICsgc2l6ZW9mKGludCksIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JdXJlcSA9IGttYWxsb2MocmVxX2xlbitzaXplb2Yoc3RydWN0IHFldGhfc25tcF91cmVxX2hkciksIEdGUF9LRVJORUwpOwotCWlmICghdXJlcSkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAic25tcG5vbWUiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcih1cmVxLCB1ZGF0YSwKLQkJCXJlcV9sZW4gKyBzaXplb2Yoc3RydWN0IHFldGhfc25tcF91cmVxX2hkcikpKSB7Ci0JCWtmcmVlKHVyZXEpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwl1cmVxID0gbWVtZHVwX3VzZXIodWRhdGEsIHJlcV9sZW4gKyBzaXplb2Yoc3RydWN0IHFldGhfc25tcF91cmVxX2hkcikpOworCWlmIChJU19FUlIodXJlcSkpIHsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgInNubXBub21lIik7CisJCXJldHVybiBQVFJfRVJSKHVyZXEpOwogCX0KIAlxaW5mby51ZGF0YV9sZW4gPSB1cmVxLT5oZHIuZGF0YV9sZW47CiAJcWluZm8udWRhdGEgPSBremFsbG9jKHFpbmZvLnVkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CkBAIC0zOTkxLDYgKzM5NzAsNyBAQAogCQllbHNlCiAJCQlnb3RvIHJldHJ5OwogCX0KKwljYXJkLT5yZWFkX29yX3dyaXRlX3Byb2JsZW0gPSAwOwogCXJjID0gcWV0aF9tcGNfaW5pdGlhbGl6ZShjYXJkKTsKIAlpZiAocmMpIHsKIAkJUUVUSF9EQkZfVEVYVF8oU0VUVVAsIDIsICI1ZXJyJWQiLCByYyk7CkBAIC00MTIwLDEzICs0MTAwLDggQEAKIAkJc2tiX2xlbiAtPSBkYXRhX2xlbjsKIAkJaWYgKHNrYl9sZW4pIHsKIAkJCWlmIChxZXRoX2lzX2xhc3Rfc2JhbGUoZWxlbWVudCkpIHsKLQkJCQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAidW5leGVvYiIpOwotCQkJCVFFVEhfREJGX1RFWFRfKFRSQUNFLCA0LCAiJXMiLAotCQkJCQlDQVJEX0JVU19JRChjYXJkKSk7Ci0JCQkJUUVUSF9EQkZfVEVYVChRRVJSLCAyLCAidW5leGVvYiIpOwotCQkJCVFFVEhfREJGX1RFWFRfKFFFUlIsIDIsICIlcyIsCi0JCQkJCUNBUkRfQlVTX0lEKGNhcmQpKTsKLQkJCQlRRVRIX0RCRl9IRVgoTUlTQywgNCwgYnVmZmVyLCBzaXplb2YoKmJ1ZmZlcikpOworCQkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJ1bmV4ZW9iIik7CisJCQkJUUVUSF9DQVJEX0hFWChjYXJkLCAyLCBidWZmZXIsIHNpemVvZih2b2lkICopKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJCWNhcmQtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCXJldHVybiBOVUxMOwpAQCAtNDE0Nyw4ICs0MTIyLDcgQEAKIAlyZXR1cm4gc2tiOwogbm9fbWVtOgogCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIm5vc2tibWVtIik7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiJXMiLCBDQVJEX0JVU19JRChjYXJkKSk7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJub3NrYm1lbSIpOwogCX0KIAljYXJkLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJcmV0dXJuIE5VTEw7CkBAIC00MTY0LDE3ICs0MTM4LDE3IEBACiAJfQogfQogCi12b2lkIHFldGhfZGJmX2xvbmd0ZXh0KGVudW0gcWV0aF9kYmZfbmFtZXMgZGJmX25peCwgaW50IGxldmVsLCBjaGFyICpmbXQsIC4uLikKK3ZvaWQgcWV0aF9kYmZfbG9uZ3RleHQoZGVidWdfaW5mb190ICppZCwgaW50IGxldmVsLCBjaGFyICpmbXQsIC4uLikKIHsKIAljaGFyIGRiZl90eHRfYnVmWzMyXTsKIAl2YV9saXN0IGFyZ3M7CiAKLQlpZiAobGV2ZWwgPiAocWV0aF9kYmZbZGJmX25peF0uaWQpLT5sZXZlbCkKKwlpZiAobGV2ZWwgPiBpZC0+bGV2ZWwpCiAJCXJldHVybjsKIAl2YV9zdGFydChhcmdzLCBmbXQpOwogCXZzbnByaW50ZihkYmZfdHh0X2J1Ziwgc2l6ZW9mKGRiZl90eHRfYnVmKSwgZm10LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7Ci0JZGVidWdfdGV4dF9ldmVudChxZXRoX2RiZltkYmZfbml4XS5pZCwgbGV2ZWwsIGRiZl90eHRfYnVmKTsKKwlkZWJ1Z190ZXh0X2V2ZW50KGlkLCBsZXZlbCwgZGJmX3R4dF9idWYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocWV0aF9kYmZfbG9uZ3RleHQpOwogCkBAIC00MjgyLDYgKzQyNTYsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIGRiZl9uYW1lWzIwXTsKIAogCVFFVEhfREJGX1RFWFQoU0VUVVAsIDIsICJwcm9iZWRldiIpOwogCkBAIC00Mjk3LDYgKzQyNzIsMTcgQEAKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9kZXY7CiAJfQorCisJc25wcmludGYoZGJmX25hbWUsIHNpemVvZihkYmZfbmFtZSksICJxZXRoX2NhcmRfJXMiLAorCQlkZXZfbmFtZSgmZ2Rldi0+ZGV2KSk7CisJY2FyZC0+ZGVidWcgPSBkZWJ1Z19yZWdpc3RlcihkYmZfbmFtZSwgMiwgMSwgOCk7CisJaWYgKCFjYXJkLT5kZWJ1ZykgeworCQlRRVRIX0RCRl9URVhUXyhTRVRVUCwgMiwgIiVzIiwgInFjZGJmIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfY2FyZDsKKwl9CisJZGVidWdfcmVnaXN0ZXJfdmlldyhjYXJkLT5kZWJ1ZywgJmRlYnVnX2hleF9hc2NpaV92aWV3KTsKKwogCWNhcmQtPnJlYWQuY2N3ZGV2ICA9IGdkZXYtPmNkZXZbMF07CiAJY2FyZC0+d3JpdGUuY2N3ZGV2ID0gZ2Rldi0+Y2RldlsxXTsKIAljYXJkLT5kYXRhLmNjd2RldiAgPSBnZGV2LT5jZGV2WzJdOwpAQCAtNDMwOSwxMiArNDI5NSwxMiBAQAogCXJjID0gcWV0aF9kZXRlcm1pbmVfY2FyZF90eXBlKGNhcmQpOwogCWlmIChyYykgewogCQlRRVRIX0RCRl9URVhUXyhTRVRVUCwgMiwgIjNlcnIlZCIsIHJjKTsKLQkJZ290byBlcnJfY2FyZDsKKwkJZ290byBlcnJfZGJmOwogCX0KIAlyYyA9IHFldGhfc2V0dXBfY2FyZChjYXJkKTsKIAlpZiAocmMpIHsKIAkJUUVUSF9EQkZfVEVYVF8oU0VUVVAsIDIsICIyZXJyJWQiLCByYyk7Ci0JCWdvdG8gZXJyX2NhcmQ7CisJCWdvdG8gZXJyX2RiZjsKIAl9CiAKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TTikKQEAgLTQzMjIsNyArNDMwOCw3IEBACiAJZWxzZQogCQlyYyA9IHFldGhfY29yZV9jcmVhdGVfZGV2aWNlX2F0dHJpYnV0ZXMoZGV2KTsKIAlpZiAocmMpCi0JCWdvdG8gZXJyX2NhcmQ7CisJCWdvdG8gZXJyX2RiZjsKIAlzd2l0Y2ggKGNhcmQtPmluZm8udHlwZSkgewogCWNhc2UgUUVUSF9DQVJEX1RZUEVfT1NOOgogCWNhc2UgUUVUSF9DQVJEX1RZUEVfT1NNOgpAQCAtNDM1Miw2ICs0MzM4LDggQEAKIAkJcWV0aF9jb3JlX3JlbW92ZV9vc25fYXR0cmlidXRlcyhkZXYpOwogCWVsc2UKIAkJcWV0aF9jb3JlX3JlbW92ZV9kZXZpY2VfYXR0cmlidXRlcyhkZXYpOworZXJyX2RiZjoKKwlkZWJ1Z191bnJlZ2lzdGVyKGNhcmQtPmRlYnVnKTsKIGVycl9jYXJkOgogCXFldGhfY29yZV9mcmVlX2NhcmQoY2FyZCk7CiBlcnJfZGV2OgpAQCAtNDM2NSwxNiArNDM1MywxOSBAQAogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmdkZXYtPmRldik7CiAKIAlRRVRIX0RCRl9URVhUKFNFVFVQLCAyLCAicmVtb3ZlZHYiKTsKLQlpZiAoY2FyZC0+ZGlzY2lwbGluZS5jY3dnZHJpdmVyKSB7Ci0JCWNhcmQtPmRpc2NpcGxpbmUuY2N3Z2RyaXZlci0+cmVtb3ZlKGdkZXYpOwotCQlxZXRoX2NvcmVfZnJlZV9kaXNjaXBsaW5lKGNhcmQpOwotCX0KIAogCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfT1NOKSB7CiAJCXFldGhfY29yZV9yZW1vdmVfb3NuX2F0dHJpYnV0ZXMoJmdkZXYtPmRldik7CiAJfSBlbHNlIHsKIAkJcWV0aF9jb3JlX3JlbW92ZV9kZXZpY2VfYXR0cmlidXRlcygmZ2Rldi0+ZGV2KTsKIAl9CisKKwlpZiAoY2FyZC0+ZGlzY2lwbGluZS5jY3dnZHJpdmVyKSB7CisJCWNhcmQtPmRpc2NpcGxpbmUuY2N3Z2RyaXZlci0+cmVtb3ZlKGdkZXYpOworCQlxZXRoX2NvcmVfZnJlZV9kaXNjaXBsaW5lKGNhcmQpOworCX0KKworCWRlYnVnX3VucmVnaXN0ZXIoY2FyZC0+ZGVidWcpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmcWV0aF9jb3JlX2NhcmRfbGlzdC5yd2xvY2ssIGZsYWdzKTsKIAlsaXN0X2RlbCgmY2FyZC0+bGlzdCk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnFldGhfY29yZV9jYXJkX2xpc3Qucndsb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tcGMuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21wYy5oCmluZGV4IGY5ZWQyNGQuLmUzN2RkOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21wYy5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21wYy5oCkBAIC02MTYsOCArNjE2LDkgQEAKICNkZWZpbmUgUUVUSF9JU19JRFhfQUNUX1BPU19SRVBMWShidWZmZXIpICgoKGJ1ZmZlcilbMHgwOF0gJiAzKSA9PSAyKQogI2RlZmluZSBRRVRIX0lEWF9SRVBMWV9MRVZFTChidWZmZXIpIChidWZmZXIgKyAweDEyKQogI2RlZmluZSBRRVRIX0lEWF9BQ1RfQ0FVU0VfQ09ERShidWZmZXIpIChidWZmZXIpWzB4MDldCi0jZGVmaW5lIFFFVEhfSURYX0FDVF9FUlJfRVhDTAkweDE5Ci0jZGVmaW5lIFFFVEhfSURYX0FDVF9FUlJfQVVUSAkweDFFCisjZGVmaW5lIFFFVEhfSURYX0FDVF9FUlJfRVhDTAkJMHgxOQorI2RlZmluZSBRRVRIX0lEWF9BQ1RfRVJSX0FVVEgJCTB4MUUKKyNkZWZpbmUgUUVUSF9JRFhfQUNUX0VSUl9BVVRIX1VTRVIJMHgyMAogCiAjZGVmaW5lIFBEVV9FTkNBUFNVTEFUSU9OKGJ1ZmZlcikgXAogCShidWZmZXIgKyAqKGJ1ZmZlciArICgqKGJ1ZmZlciArIDB4MGIpKSArIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX3N5cy5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfc3lzLmMKaW5kZXggMmViMDIyZi4uNDJmYTc4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfc3lzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfc3lzLmMKQEAgLTQxMSw3ICs0MTEsNyBAQAogCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZjYXJkLT5jb25mX211dGV4KTsKKwltdXRleF9sb2NrKCZjYXJkLT5kaXNjaXBsaW5lX211dGV4KTsKIAlpZiAoY2FyZC0+c3RhdGUgIT0gQ0FSRF9TVEFURV9ET1dOKSB7CiAJCXJjID0gLUVQRVJNOwogCQlnb3RvIG91dDsKQEAgLTQzMyw2ICs0MzMsNyBAQAogCWlmIChjYXJkLT5vcHRpb25zLmxheWVyMiA9PSBuZXdkaXMpCiAJCWdvdG8gb3V0OwogCWVsc2UgeworCQljYXJkLT5pbmZvLm1hY19iaXRzICA9IDA7CiAJCWlmIChjYXJkLT5kaXNjaXBsaW5lLmNjd2dkcml2ZXIpIHsKIAkJCWNhcmQtPmRpc2NpcGxpbmUuY2N3Z2RyaXZlci0+cmVtb3ZlKGNhcmQtPmdkZXYpOwogCQkJcWV0aF9jb3JlX2ZyZWVfZGlzY2lwbGluZShjYXJkKTsKQEAgLTQ0NSw3ICs0NDYsNyBAQAogCiAJcmMgPSBjYXJkLT5kaXNjaXBsaW5lLmNjd2dkcml2ZXItPnByb2JlKGNhcmQtPmdkZXYpOwogb3V0OgotCW11dGV4X3VubG9jaygmY2FyZC0+Y29uZl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjYXJkLT5kaXNjaXBsaW5lX211dGV4KTsKIAlyZXR1cm4gcmMgPyByYyA6IGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwppbmRleCBkNDNmNTdhLi44MzBkNjM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCkBAIC03OSw3ICs3OSw3IEBACiAJCXJjID0gLUVPUE5PVFNVUFA7CiAJfQogCWlmIChyYykKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDIsICJpb2NlJWQiLCByYyk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiaW9jZSVkIiwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTMwLDcgKzEzMCw3IEBACiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCV9fdTggKm1hYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJMMlNnbWFjYiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJMMlNnbWFjYiIpOwogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopIGRhdGE7CiAJbWFjID0gJmNtZC0+ZGF0YS5zZXRkZWxtYWMubWFjWzBdOwogCS8qIE1BQyBhbHJlYWR5IHJlZ2lzdGVyZWQsIG5lZWRlZCBpbiBjb3VwbGUvdW5jb3VwbGUgY2FzZSAqLwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKIHN0YXRpYyBpbnQgcWV0aF9sMl9zZW5kX3NldGdyb3VwbWFjKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIF9fdTggKm1hYykKIHsKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiTDJTZ21hYyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJMMlNnbWFjIik7CiAJcmV0dXJuIHFldGhfbDJfc2VuZF9zZXRkZWxtYWMoY2FyZCwgbWFjLCBJUEFfQ01EX1NFVEdNQUMsCiAJCQkJCSAgcWV0aF9sMl9zZW5kX3NldGdyb3VwbWFjX2NiKTsKIH0KQEAgLTE1OSw3ICsxNTksNyBAQAogCXN0cnVjdCBxZXRoX2lwYV9jbWQgKmNtZDsKIAlfX3U4ICptYWM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiTDJEZ21hY2IiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiTDJEZ21hY2IiKTsKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKSBkYXRhOwogCW1hYyA9ICZjbWQtPmRhdGEuc2V0ZGVsbWFjLm1hY1swXTsKIAlpZiAoY21kLT5oZHIucmV0dXJuX2NvZGUpCkBAIC0xNzAsNyArMTcwLDcgQEAKIAogc3RhdGljIGludCBxZXRoX2wyX3NlbmRfZGVsZ3JvdXBtYWMoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgX191OCAqbWFjKQogewotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJMMkRnbWFjIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgIkwyRGdtYWMiKTsKIAlyZXR1cm4gcWV0aF9sMl9zZW5kX3NldGRlbG1hYyhjYXJkLCBtYWMsIElQQV9DTURfREVMR01BQywKIAkJCQkJICBxZXRoX2wyX3NlbmRfZGVsZ3JvdXBtYWNfY2IpOwogfQpAQCAtMjYyLDE1ICsyNjIsMTQgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiTDJzZHZjYiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJMMnNkdmNiIik7CiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikgZGF0YTsKIAlpZiAoY21kLT5oZHIucmV0dXJuX2NvZGUpIHsKIAkJUUVUSF9EQkZfTUVTU0FHRSgyLCAiRXJyb3IgaW4gcHJvY2Vzc2luZyBWTEFOICVpIG9uICVzOiAweCV4LiAiCiAJCQkgICJDb250aW51aW5nXG4iLCBjbWQtPmRhdGEuc2V0ZGVsdmxhbi52bGFuX2lkLAogCQkJICBRRVRIX0NBUkRfSUZOQU1FKGNhcmQpLCBjbWQtPmhkci5yZXR1cm5fY29kZSk7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiTDJWTCU0eCIsIGNtZC0+aGRyLmNvbW1hbmQpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgIkwyJXMiLCBDQVJEX0JVU19JRChjYXJkKSk7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiZXJyJWQiLCBjbWQtPmhkci5yZXR1cm5fY29kZSk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiTDJWTCU0eCIsIGNtZC0+aGRyLmNvbW1hbmQpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgImVyciVkIiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI4MSw3ICsyODAsNyBAQAogCXN0cnVjdCBxZXRoX2lwYV9jbWQgKmNtZDsKIAlzdHJ1Y3QgcWV0aF9jbWRfYnVmZmVyICppb2I7CiAKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgIkwyc2R2JXgiLCBpcGFjbWQpOworCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAiTDJzZHYleCIsIGlwYWNtZCk7CiAJaW9iID0gcWV0aF9nZXRfaXBhY21kX2J1ZmZlcihjYXJkLCBpcGFjbWQsIFFFVEhfUFJPVF9JUFY0KTsKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKShpb2ItPmRhdGErSVBBX1BEVV9IRUFERVJfU0laRSk7CiAJY21kLT5kYXRhLnNldGRlbHZsYW4udmxhbl9pZCA9IGk7CkBAIC0yOTIsNyArMjkxLDcgQEAKIHN0YXRpYyB2b2lkIHFldGhfbDJfcHJvY2Vzc192bGFucyhzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBpbnQgY2xlYXIpCiB7CiAJc3RydWN0IHFldGhfdmxhbl92aWQgKmlkOwotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJMMnByY3ZsbiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJMMnByY3ZsbiIpOwogCXNwaW5fbG9ja19iaCgmY2FyZC0+dmxhbmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaWQsICZjYXJkLT52aWRfbGlzdCwgbGlzdCkgewogCQlpZiAoY2xlYXIpCkBAIC0zMTAsMTMgKzMwOSwxMyBAQAogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IHFldGhfdmxhbl92aWQgKmlkOwogCi0JUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICJhaWQ6JWQiLCB2aWQpOworCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAiYWlkOiVkIiwgdmlkKTsKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TTSkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAiYWlkT1NNIik7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJhaWRPU00iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAocWV0aF93YWl0X2Zvcl90aHJlYWRzKGNhcmQsIFFFVEhfUkVDT1ZFUl9USFJFQUQpKSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJhaWRSRUMiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImFpZFJFQyIpOwogCQlyZXR1cm47CiAJfQogCWlkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHFldGhfdmxhbl92aWQpLCBHRlBfQVRPTUlDKTsKQEAgLTMzNCwxMyArMzMzLDEzIEBACiAJc3RydWN0IHFldGhfdmxhbl92aWQgKmlkLCAqdG1waWQgPSBOVUxMOwogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgImtpZDolZCIsIHZpZCk7CisJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJraWQ6JWQiLCB2aWQpOwogCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfT1NNKSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJraWRPU00iKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImtpZE9TTSIpOwogCQlyZXR1cm47CiAJfQogCWlmIChxZXRoX3dhaXRfZm9yX3RocmVhZHMoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImtpZFJFQyIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAia2lkUkVDIik7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl9sb2NrX2JoKCZjYXJkLT52bGFubG9jayk7CkBAIC00NTYsNyArNDU1LDcgQEAKIAkJCS8qIGVsc2UgdW5rbm93biAqLwogCQlkZWZhdWx0OgogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJpbmJ1bmtubyIpOworCQkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImluYnVua25vIik7CiAJCQlRRVRIX0RCRl9IRVgoQ1RSTCwgMywgaGRyLCBRRVRIX0RCRl9DVFJMX0xFTik7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNDc0LDcgKzQ3Myw3IEBACiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCXN0cnVjdCBxZXRoX2NtZF9idWZmZXIgKmlvYjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJMMnNkbWFjIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgIkwyc2RtYWMiKTsKIAlpb2IgPSBxZXRoX2dldF9pcGFjbWRfYnVmZmVyKGNhcmQsIGlwYWNtZCwgUUVUSF9QUk9UX0lQVjQpOwogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopKGlvYi0+ZGF0YStJUEFfUERVX0hFQURFUl9TSVpFKTsKIAljbWQtPmRhdGEuc2V0ZGVsbWFjLm1hY19sZW5ndGggPSBPU0FfQUREUl9MRU47CkBAIC00ODgsMTAgKzQ4NywxMCBAQAogewogCXN0cnVjdCBxZXRoX2lwYV9jbWQgKmNtZDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJMMlNtYWNjYiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJMMlNtYWNjYiIpOwogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopIGRhdGE7CiAJaWYgKGNtZC0+aGRyLnJldHVybl9jb2RlKSB7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiTDJlciV4IiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIkwyZXIleCIsIGNtZC0+aGRyLnJldHVybl9jb2RlKTsKIAkJY2FyZC0+aW5mby5tYWNfYml0cyAmPSB+UUVUSF9MQVlFUjJfTUFDX1JFR0lTVEVSRUQ7CiAJCXN3aXRjaCAoY21kLT5oZHIucmV0dXJuX2NvZGUpIHsKIAkJY2FzZSBJUEFfUkNfTDJfRFVQX01BQzoKQEAgLTUyMyw3ICs1MjIsNyBAQAogCiBzdGF0aWMgaW50IHFldGhfbDJfc2VuZF9zZXRtYWMoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgX191OCAqbWFjKQogewotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJMMlNldG1hYyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJMMlNldG1hYyIpOwogCXJldHVybiBxZXRoX2wyX3NlbmRfc2V0ZGVsbWFjKGNhcmQsIG1hYywgSVBBX0NNRF9TRVRWTUFDLAogCQkJCQkgIHFldGhfbDJfc2VuZF9zZXRtYWNfY2IpOwogfQpAQCAtNTM0LDEwICs1MzMsMTAgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiTDJEbWFjY2IiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiTDJEbWFjY2IiKTsKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKSBkYXRhOwogCWlmIChjbWQtPmhkci5yZXR1cm5fY29kZSkgewotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgImVyciVkIiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgImVyciVkIiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOwogCQljbWQtPmhkci5yZXR1cm5fY29kZSA9IC1FSU87CiAJCXJldHVybiAwOwogCX0KQEAgLTU0OCw3ICs1NDcsNyBAQAogCiBzdGF0aWMgaW50IHFldGhfbDJfc2VuZF9kZWxtYWMoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgX191OCAqbWFjKQogewotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJMMkRlbG1hYyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJMMkRlbG1hYyIpOwogCWlmICghKGNhcmQtPmluZm8ubWFjX2JpdHMgJiBRRVRIX0xBWUVSMl9NQUNfUkVHSVNURVJFRCkpCiAJCXJldHVybiAwOwogCXJldHVybiBxZXRoX2wyX3NlbmRfc2V0ZGVsbWFjKGNhcmQsIG1hYywgSVBBX0NNRF9ERUxWTUFDLApAQCAtNTk0LDIzICs1OTMsMjIgQEAKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwogCWludCByYyA9IDA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic2V0bWFjIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgInNldG1hYyIpOwogCiAJaWYgKHFldGhfbDJfdmVyaWZ5X2RldihkZXYpICE9IFFFVEhfUkVBTF9DQVJEKSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJzZXRtY0lOViIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic2V0bWNJTlYiKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAogCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfT1NOIHx8CiAJICAgIGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU00gfHwKIAkgICAgY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TWCkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic2V0bWNUWVAiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgInNldG1jVFlQIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9Ci0JUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDMsICIlcyIsIENBUkRfQlVTX0lEKGNhcmQpKTsKLQlRRVRIX0RCRl9IRVgoVFJBQ0UsIDMsIGFkZHItPnNhX2RhdGEsIE9TQV9BRERSX0xFTik7CisJUUVUSF9DQVJEX0hFWChjYXJkLCAzLCBhZGRyLT5zYV9kYXRhLCBPU0FfQUREUl9MRU4pOwogCWlmIChxZXRoX3dhaXRfZm9yX3RocmVhZHMoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInNldG1jUkVDIik7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJzZXRtY1JFQyIpOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAlyYyA9IHFldGhfbDJfc2VuZF9kZWxtYWMoY2FyZCwgJmNhcmQtPmRldi0+ZGV2X2FkZHJbMF0pOwpAQCAtNjI3LDcgKzYyNSw3IEBACiAJaWYgKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9PU04pCiAJCXJldHVybiA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic2V0bXVsdGkiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic2V0bXVsdGkiKTsKIAlpZiAocWV0aF90aHJlYWRzX3J1bm5pbmcoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkgJiYKIAkgICAgKGNhcmQtPnN0YXRlICE9IENBUkRfU1RBVEVfVVApKQogCQlyZXR1cm47CkBAIC03MTQsMTAgKzcxMiwxMyBAQAogCQlnb3RvIHR4X2Ryb3A7CiAJfQogCi0JaWYgKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9JUUQpCisJaWYgKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9JUUQpIHsKKwkJaWYgKHFldGhfaGRyX2Noa19hbmRfYm91bmNlKG5ld19za2IsCisJCSAgICBzaXplb2Yoc3RydWN0IHFldGhfaGRyX2xheWVyMikpKQorCQkJZ290byB0eF9kcm9wOwogCQlyYyA9IHFldGhfZG9fc2VuZF9wYWNrZXQoY2FyZCwgcXVldWUsIG5ld19za2IsIGhkciwKIAkJCQkJIGVsZW1lbnRzKTsKLQllbHNlCisJfSBlbHNlCiAJCXJjID0gcWV0aF9kb19zZW5kX3BhY2tldF9mYXN0KGNhcmQsIHF1ZXVlLCBuZXdfc2tiLCBoZHIsCiAJCQkJCWVsZW1lbnRzLCBkYXRhX29mZnNldCwgaGRfbGVuKTsKIAlpZiAoIXJjKSB7CkBAIC03NzEsMTEgKzc3MiwxMCBAQAogCQljYXJkLT5wZXJmX3N0YXRzLmluYm91bmRfc3RhcnRfdGltZSA9IHFldGhfZ2V0X21pY3JvcygpOwogCX0KIAlpZiAocWRpb19lcnIgJiBRRElPX0VSUk9SX0FDVElWQVRFX0NIRUNLX0NPTkRJVElPTikgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAxLCAicWRpbmNoayIpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiVzIiwgQ0FSRF9CVVNfSUQoY2FyZCkpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiUwNFglMDRYIiwgZmlyc3RfZWxlbWVudCwKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMSwgInFkaW5jaGsiKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDEsICIlMDRYJTA0WCIsIGZpcnN0X2VsZW1lbnQsCiAJCQkJY291bnQpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiUwNFgiLCBxdWV1ZSk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAxLCAiJTA0WCIsIHF1ZXVlKTsKIAkJcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShjYXJkKTsKIAkJcmV0dXJuOwogCX0KQEAgLTc5OSwxMyArNzk5LDEzIEBACiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldi0+bWxfcHJpdjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJxZXRob3BlbiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJxZXRob3BlbiIpOwogCWlmIChjYXJkLT5zdGF0ZSAhPSBDQVJEX1NUQVRFX1NPRlRTRVRVUCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9PU04pICYmCiAJICAgICAoIShjYXJkLT5pbmZvLm1hY19iaXRzICYgUUVUSF9MQVlFUjJfTUFDX1JFR0lTVEVSRUQpKSkgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAibm9tYWNhZHIiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgIm5vbWFjYWRyIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCWNhcmQtPmRhdGEuc3RhdGUgPSBDSF9TVEFURV9VUDsKQEAgLTgyMiw3ICs4MjIsNyBAQAogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAicWV0aHN0b3AiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAicWV0aHN0b3AiKTsKIAluZXRpZl90eF9kaXNhYmxlKGRldik7CiAJaWYgKGNhcmQtPnN0YXRlID09IENBUkRfU1RBVEVfVVApCiAJCWNhcmQtPnN0YXRlID0gQ0FSRF9TVEFURV9TT0ZUU0VUVVA7CkBAIC04NjAsOCArODYwLDYgQEAKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoY2FyZC0+ZGV2KTsKIAkJY2FyZC0+ZGV2ID0gTlVMTDsKIAl9Ci0KLQlxZXRoX2wyX2RlbF9hbGxfbWMoY2FyZCk7CiAJcmV0dXJuOwogfQogCkBAIC05MzUsNiArOTMzLDcgQEAKIAllbnVtIHFldGhfY2FyZF9zdGF0ZXMgcmVjb3Zlcl9mbGFnOwogCiAJQlVHX09OKCFjYXJkKTsKKwltdXRleF9sb2NrKCZjYXJkLT5kaXNjaXBsaW5lX211dGV4KTsKIAltdXRleF9sb2NrKCZjYXJkLT5jb25mX211dGV4KTsKIAlRRVRIX0RCRl9URVhUKFNFVFVQLCAyLCAic2V0b25saW4iKTsKIAlRRVRIX0RCRl9IRVgoU0VUVVAsIDIsICZjYXJkLCBzaXplb2Yodm9pZCAqKSk7CkBAIC0xMDEyLDYgKzEwMTEsNyBAQAogCWtvYmplY3RfdWV2ZW50KCZnZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UpOwogb3V0OgogCW11dGV4X3VubG9jaygmY2FyZC0+Y29uZl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjYXJkLT5kaXNjaXBsaW5lX211dGV4KTsKIAlyZXR1cm4gMDsKIAogb3V0X3JlbW92ZToKQEAgLTEwMjUsNiArMTAyNSw3IEBACiAJZWxzZQogCQljYXJkLT5zdGF0ZSA9IENBUkRfU1RBVEVfRE9XTjsKIAltdXRleF91bmxvY2soJmNhcmQtPmNvbmZfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY2FyZC0+ZGlzY2lwbGluZV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMDQwLDYgKzEwNDEsNyBAQAogCWludCByYyA9IDAsIHJjMiA9IDAsIHJjMyA9IDA7CiAJZW51bSBxZXRoX2NhcmRfc3RhdGVzIHJlY292ZXJfZmxhZzsKIAorCW11dGV4X2xvY2soJmNhcmQtPmRpc2NpcGxpbmVfbXV0ZXgpOwogCW11dGV4X2xvY2soJmNhcmQtPmNvbmZfbXV0ZXgpOwogCVFFVEhfREJGX1RFWFQoU0VUVVAsIDMsICJzZXRvZmZsIik7CiAJUUVUSF9EQkZfSEVYKFNFVFVQLCAzLCAmY2FyZCwgc2l6ZW9mKHZvaWQgKikpOwpAQCAtMTA2MCw2ICsxMDYyLDcgQEAKIAkvKiBsZXQgdXNlcl9zcGFjZSBrbm93IHRoYXQgZGV2aWNlIGlzIG9mZmxpbmUgKi8KIAlrb2JqZWN0X3VldmVudCgmY2dkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CiAJbXV0ZXhfdW5sb2NrKCZjYXJkLT5jb25mX211dGV4KTsKKwltdXRleF91bmxvY2soJmNhcmQtPmRpc2NpcGxpbmVfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDc0LDExICsxMDc3LDEwIEBACiAJaW50IHJjID0gMDsKIAogCWNhcmQgPSAoc3RydWN0IHFldGhfY2FyZCAqKSBwdHI7Ci0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgInJlY292ZXIxIik7Ci0JUUVUSF9EQkZfSEVYKFRSQUNFLCAyLCAmY2FyZCwgc2l6ZW9mKHZvaWQgKikpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJyZWNvdmVyMSIpOwogCWlmICghcWV0aF9kb19ydW5fdGhyZWFkKGNhcmQsIFFFVEhfUkVDT1ZFUl9USFJFQUQpKQogCQlyZXR1cm4gMDsKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAicmVjb3ZlcjIiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAicmVjb3ZlcjIiKTsKIAlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LAogCQkiQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBiZWVuIHN0YXJ0ZWQgZm9yIHRoZSBkZXZpY2VcbiIpOwogCWNhcmQtPnVzZV9oYXJkX3N0b3AgPSAxOwpAQCAtMTE4MSwxMiArMTE4MywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjID0gMDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJvc25kY3RyZCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDUsICJvc25kY3RyZCIpOwogCiAJd2FpdF9ldmVudChjYXJkLT53YWl0X3EsCiAJCSAgIGF0b21pY19jbXB4Y2hnKCZjYXJkLT53cml0ZS5pcnFfcGVuZGluZywgMCwgMSkgPT0gMCk7CiAJcWV0aF9wcmVwYXJlX2NvbnRyb2xfZGF0YShjYXJkLCBsZW4sIGlvYik7Ci0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNiwgIm9zbm9pcnFwIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNiwgIm9zbm9pcnFwIik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNhcmQtPndyaXRlLmNjd2RldiksIGZsYWdzKTsKIAlyYyA9IGNjd19kZXZpY2Vfc3RhcnQoY2FyZC0+d3JpdGUuY2N3ZGV2LCAmY2FyZC0+d3JpdGUuY2N3LAogCQkJICAgICAgKGFkZHJfdCkgaW9iLCAwLCAwKTsKQEAgLTExOTQsNyArMTE5Niw3IEBACiAJaWYgKHJjKSB7CiAJCVFFVEhfREJGX01FU1NBR0UoMiwgInFldGhfb3NuX3NlbmRfY29udHJvbF9kYXRhOiAiCiAJCQkgICAiY2N3X2RldmljZV9zdGFydCByYyA9ICVpXG4iLCByYyk7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiIGVyciVkIiwgcmMpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiBlcnIlZCIsIHJjKTsKIAkJcWV0aF9yZWxlYXNlX2J1ZmZlcihpb2ItPmNoYW5uZWwsIGlvYik7CiAJCWF0b21pY19zZXQoJmNhcmQtPndyaXRlLmlycV9wZW5kaW5nLCAwKTsKIAkJd2FrZV91cCgmY2FyZC0+d2FpdF9xKTsKQEAgLTEyMDcsNyArMTIwOSw3IEBACiB7CiAJdTE2IHMxLCBzMjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJvc25kaXBhIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgIm9zbmRpcGEiKTsKIAogCXFldGhfcHJlcGFyZV9pcGFfY21kKGNhcmQsIGlvYiwgUUVUSF9QUk9UX09TTjIpOwogCXMxID0gKHUxNikoSVBBX1BEVV9IRUFERVJfU0laRSArIGRhdGFfbGVuKTsKQEAgLTEyMjUsMTIgKzEyMjcsMTIgQEAKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkOwogCWludCByYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJvc25zZG1jIik7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCWNhcmQgPSBkZXYtPm1sX3ByaXY7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVOT0RFVjsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAib3Nuc2RtYyIpOwogCWlmICgoY2FyZC0+c3RhdGUgIT0gQ0FSRF9TVEFURV9VUCkgJiYKIAkgICAgKGNhcmQtPnN0YXRlICE9IENBUkRfU1RBVEVfU09GVFNFVFVQKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMjQ3LDEzICsxMjQ5LDEzIEBACiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJvc25yZWciKTsKIAkqZGV2ID0gcWV0aF9sMl9uZXRkZXZfYnlfZGV2bm8ocmVhZF9kZXZfbm8pOwogCWlmICgqZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCWNhcmQgPSAoKmRldiktPm1sX3ByaXY7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVOT0RFVjsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAib3NucmVnIik7CiAJaWYgKChhc3Npc3RfY2IgPT0gTlVMTCkgfHwgKGRhdGFfY2IgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCWNhcmQtPm9zbl9pbmZvLmFzc2lzdF9jYiA9IGFzc2lzdF9jYjsKQEAgLTEyNjYsMTIgKzEyNjgsMTIgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIm9zbmRlcmVnIik7CiAJaWYgKCFkZXYpCiAJCXJldHVybjsKIAljYXJkID0gZGV2LT5tbF9wcml2OwogCWlmICghY2FyZCkKIAkJcmV0dXJuOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJvc25kZXJlZyIpOwogCWNhcmQtPm9zbl9pbmZvLmFzc2lzdF9jYiA9IE5VTEw7CiAJY2FyZC0+b3NuX2luZm8uZGF0YV9jYiA9IE5VTEw7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDMuaAppbmRleCA4NDQ3ZDIzLi5lNzA1YjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDMuaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDMuaApAQCAtNjQsNSArNjQsNiBAQAogCQkJY29uc3QgdTggKik7CiBpbnQgcWV0aF9sM19zZXRfbGFyZ2Vfc2VuZChzdHJ1Y3QgcWV0aF9jYXJkICosIGVudW0gcWV0aF9sYXJnZV9zZW5kX3R5cGVzKTsKIGludCBxZXRoX2wzX3NldF9yeF9jc3VtKHN0cnVjdCBxZXRoX2NhcmQgKiwgZW51bSBxZXRoX2NoZWNrc3VtX3R5cGVzKTsKK2ludCBxZXRoX2wzX2lzX2FkZHJfY292ZXJlZF9ieV9pcGF0byhzdHJ1Y3QgcWV0aF9jYXJkICosIHN0cnVjdCBxZXRoX2lwYWRkciAqKTsKIAogI2VuZGlmIC8qIF9fUUVUSF9MM19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IDYxYWRhZTIuLmUyMmFlMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHFldGhfbDNfaXNfYWRkcl9jb3ZlcmVkX2J5X2lwYXRvKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsCitpbnQgcWV0aF9sM19pc19hZGRyX2NvdmVyZWRfYnlfaXBhdG8oc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKIAkJCQkJCXN0cnVjdCBxZXRoX2lwYWRkciAqYWRkcikKIHsKIAlzdHJ1Y3QgcWV0aF9pcGF0b19lbnRyeSAqaXBhdG9lOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJCQkJYWRkci0+dXNlcnMgKz0gYWRkID8gMSA6IC0xOwogCQkJaWYgKGFkZCAmJiAoYWRkci0+dHlwZSA9PSBRRVRIX0lQX1RZUEVfTk9STUFMKSAmJgogCQkJICAgIHFldGhfbDNfaXNfYWRkcl9jb3ZlcmVkX2J5X2lwYXRvKGNhcmQsIGFkZHIpKSB7Ci0JCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgInRrb3ZhZGRyIik7CisJCQkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgInRrb3ZhZGRyIik7CiAJCQkJYWRkci0+c2V0X2ZsYWdzIHw9IFFFVEhfSVBBX1NFVElQX1RBS0VPVkVSX0ZMQUc7CiAJCQl9CiAJCQlsaXN0X2FkZF90YWlsKCZhZGRyLT5lbnRyeSwgY2FyZC0+aXBfdGJkX2xpc3QpOwpAQCAtMzAxLDEzICszMDEsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYyA9IDA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiZGVsaXAiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiZGVsaXAiKTsKIAogCWlmIChhZGRyLT5wcm90byA9PSBRRVRIX1BST1RfSVBWNCkKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCA0LCAmYWRkci0+dS5hNC5hZGRyLCA0KTsKKwkJUUVUSF9DQVJEX0hFWChjYXJkLCA0LCAmYWRkci0+dS5hNC5hZGRyLCA0KTsKIAllbHNlIHsKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCA0LCAmYWRkci0+dS5hNi5hZGRyLCA4KTsKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCA0LCAoKGNoYXIgKikmYWRkci0+dS5hNi5hZGRyKSArIDgsIDgpOworCQlRRVRIX0NBUkRfSEVYKGNhcmQsIDQsICZhZGRyLT51LmE2LmFkZHIsIDgpOworCQlRRVRIX0NBUkRfSEVYKGNhcmQsIDQsICgoY2hhciAqKSZhZGRyLT51LmE2LmFkZHIpICsgOCwgOCk7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pcF9sb2NrLCBmbGFncyk7CiAJcmMgPSBfX3FldGhfbDNfaW5zZXJ0X2lwX3RvZG8oY2FyZCwgYWRkciwgMCk7CkBAIC0zMjAsMTIgKzMyMCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjID0gMDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJhZGRpcCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJhZGRpcCIpOwogCWlmIChhZGRyLT5wcm90byA9PSBRRVRIX1BST1RfSVBWNCkKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCA0LCAmYWRkci0+dS5hNC5hZGRyLCA0KTsKKwkJUUVUSF9DQVJEX0hFWChjYXJkLCA0LCAmYWRkci0+dS5hNC5hZGRyLCA0KTsKIAllbHNlIHsKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCA0LCAmYWRkci0+dS5hNi5hZGRyLCA4KTsKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCA0LCAoKGNoYXIgKikmYWRkci0+dS5hNi5hZGRyKSArIDgsIDgpOworCQlRRVRIX0NBUkRfSEVYKGNhcmQsIDQsICZhZGRyLT51LmE2LmFkZHIsIDgpOworCQlRRVRIX0NBUkRfSEVYKGNhcmQsIDQsICgoY2hhciAqKSZhZGRyLT51LmE2LmFkZHIpICsgOCwgOCk7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pcF9sb2NrLCBmbGFncyk7CiAJcmMgPSBfX3FldGhfbDNfaW5zZXJ0X2lwX3RvZG8oY2FyZCwgYWRkciwgMSk7CkBAIC0zNTMsMTAgKzM1MywxMCBAQAogCXN0cnVjdCBxZXRoX2lwYWRkciAqaXB0b2RvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiZGVsbWMiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiZGVsbWMiKTsKIAlpcHRvZG8gPSBxZXRoX2wzX2dldF9hZGRyX2J1ZmZlcihRRVRIX1BST1RfSVBWNCk7CiAJaWYgKCFpcHRvZG8pIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImRtY25vbWVtIik7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJkbWNub21lbSIpOwogCQlyZXR1cm47CiAJfQogCWlwdG9kby0+dHlwZSA9IFFFVEhfSVBfVFlQRV9ERUxfQUxMX01DOwpAQCAtNDU3LDggKzQ1Nyw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAic2RpcGxpc3QiKTsKLQlRRVRIX0RCRl9IRVgoVFJBQ0UsIDIsICZjYXJkLCBzaXplb2Yodm9pZCAqKSk7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgInNkaXBsaXN0Iik7CisJUUVUSF9DQVJEX0hFWChjYXJkLCAyLCAmY2FyZCwgc2l6ZW9mKHZvaWQgKikpOwogCiAJaWYgKGNhcmQtPm9wdGlvbnMuc25pZmZlcikKIAkJcmV0dXJuOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJdGJkX2xpc3QgPSBjYXJkLT5pcF90YmRfbGlzdDsKIAljYXJkLT5pcF90YmRfbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWNhcmQtPmlwX3RiZF9saXN0KSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDAsICJzaWxub21lbSIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAwLCAic2lsbm9tZW0iKTsKIAkJY2FyZC0+aXBfdGJkX2xpc3QgPSB0YmRfbGlzdDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXBfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CkBAIC01MTcsNyArNTE3LDcgQEAKIAlzdHJ1Y3QgcWV0aF9pcGFkZHIgKmFkZHIsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJjbGVhcmlwIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImNsZWFyaXAiKTsKIAlpZiAocmVjb3ZlciAmJiBjYXJkLT5vcHRpb25zLnNuaWZmZXIpCiAJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXBfbG9jaywgZmxhZ3MpOwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJc3RydWN0IHFldGhfY21kX2J1ZmZlciAqaW9iOwogCXN0cnVjdCBxZXRoX2lwYV9jbWQgKmNtZDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJzZXRkZWxtYyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzZXRkZWxtYyIpOwogCiAJaW9iID0gcWV0aF9nZXRfaXBhY21kX2J1ZmZlcihjYXJkLCBpcGFjbWQsIGFkZHItPnByb3RvKTsKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKShpb2ItPmRhdGErSVBBX1BEVV9IRUFERVJfU0laRSk7CkBAIC02MTUsOCArNjE1LDggQEAKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAJX191OCBuZXRtYXNrWzE2XTsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJzZXRkZWxpcCIpOwotCVFFVEhfREJGX1RFWFRfKFRSQUNFLCA0LCAiZmxhZ3MlMDJYIiwgZmxhZ3MpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzZXRkZWxpcCIpOworCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAiZmxhZ3MlMDJYIiwgZmxhZ3MpOwogCiAJaW9iID0gcWV0aF9nZXRfaXBhY21kX2J1ZmZlcihjYXJkLCBpcGFjbWQsIGFkZHItPnByb3RvKTsKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKShpb2ItPmRhdGErSVBBX1BEVV9IRUFERVJfU0laRSk7CkBAIC02NDUsNyArNjQ1LDcgQEAKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAJc3RydWN0IHFldGhfY21kX2J1ZmZlciAqaW9iOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNldHJvdXRnIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInNldHJvdXRnIik7CiAJaW9iID0gcWV0aF9nZXRfaXBhY21kX2J1ZmZlcihjYXJkLCBJUEFfQ01EX1NFVFJURywgcHJvdCk7CiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikoaW9iLT5kYXRhK0lQQV9QRFVfSEVBREVSX1NJWkUpOwogCWNtZC0+ZGF0YS5zZXRydGcudHlwZSA9ICh0eXBlKTsKQEAgLTY4OSw3ICs2ODksNyBAQAogewogCWludCByYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJzZXRydGc0Iik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgInNldHJ0ZzQiKTsKIAogCXFldGhfbDNfY29ycmVjdF9yb3V0aW5nX3R5cGUoY2FyZCwgJmNhcmQtPm9wdGlvbnMucm91dGU0LnR5cGUsCiAJCQkJICBRRVRIX1BST1RfSVBWNCk7CkBAIC03MDksNyArNzA5LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInNldHJ0ZzYiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic2V0cnRnNiIpOwogI2lmZGVmIENPTkZJR19RRVRIX0lQVjYKIAogCWlmICghcWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX0lQVjYpKQpAQCAtNzUzLDcgKzc1Myw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImFkZGlwYXRvIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImFkZGlwYXRvIik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlwX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwYXRvZSwgJmNhcmQtPmlwYXRvLmVudHJpZXMsIGVudHJ5KSB7CiAJCWlmIChpcGF0b2UtPnByb3RvICE9IG5ldy0+cHJvdG8pCkBAIC03NzgsNyArNzc4LDcgQEAKIAlzdHJ1Y3QgcWV0aF9pcGF0b19lbnRyeSAqaXBhdG9lLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiZGVsaXBhdG8iKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiZGVsaXBhdG8iKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXBfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcGF0b2UsIHRtcCwgJmNhcmQtPmlwYXRvLmVudHJpZXMsIGVudHJ5KSB7CiAJCWlmIChpcGF0b2UtPnByb3RvICE9IHByb3RvKQpAQCAtODA2LDExICs4MDYsMTEgQEAKIAlpcGFkZHIgPSBxZXRoX2wzX2dldF9hZGRyX2J1ZmZlcihwcm90byk7CiAJaWYgKGlwYWRkcikgewogCQlpZiAocHJvdG8gPT0gUUVUSF9QUk9UX0lQVjQpIHsKLQkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJhZGR2aXBhNCIpOworCQkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImFkZHZpcGE0Iik7CiAJCQltZW1jcHkoJmlwYWRkci0+dS5hNC5hZGRyLCBhZGRyLCA0KTsKIAkJCWlwYWRkci0+dS5hNC5tYXNrID0gMDsKIAkJfSBlbHNlIGlmIChwcm90byA9PSBRRVRIX1BST1RfSVBWNikgewotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImFkZHZpcGE2Iik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiYWRkdmlwYTYiKTsKIAkJCW1lbWNweSgmaXBhZGRyLT51LmE2LmFkZHIsIGFkZHIsIDE2KTsKIAkJCWlwYWRkci0+dS5hNi5wZnhsZW4gPSAwOwogCQl9CkBAIC04NDEsMTEgKzg0MSwxMSBAQAogCWlwYWRkciA9IHFldGhfbDNfZ2V0X2FkZHJfYnVmZmVyKHByb3RvKTsKIAlpZiAoaXBhZGRyKSB7CiAJCWlmIChwcm90byA9PSBRRVRIX1BST1RfSVBWNCkgewotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImRlbHZpcGE0Iik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiZGVsdmlwYTQiKTsKIAkJCW1lbWNweSgmaXBhZGRyLT51LmE0LmFkZHIsIGFkZHIsIDQpOwogCQkJaXBhZGRyLT51LmE0Lm1hc2sgPSAwOwogCQl9IGVsc2UgaWYgKHByb3RvID09IFFFVEhfUFJPVF9JUFY2KSB7Ci0JCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiZGVsdmlwYTYiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJkZWx2aXBhNiIpOwogCQkJbWVtY3B5KCZpcGFkZHItPnUuYTYuYWRkciwgYWRkciwgMTYpOwogCQkJaXBhZGRyLT51LmE2LnBmeGxlbiA9IDA7CiAJCX0KQEAgLTg3MCwxMSArODcwLDExIEBACiAJaXBhZGRyID0gcWV0aF9sM19nZXRfYWRkcl9idWZmZXIocHJvdG8pOwogCWlmIChpcGFkZHIpIHsKIAkJaWYgKHByb3RvID09IFFFVEhfUFJPVF9JUFY0KSB7Ci0JCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiYWRkcnhpcDQiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJhZGRyeGlwNCIpOwogCQkJbWVtY3B5KCZpcGFkZHItPnUuYTQuYWRkciwgYWRkciwgNCk7CiAJCQlpcGFkZHItPnUuYTQubWFzayA9IDA7CiAJCX0gZWxzZSBpZiAocHJvdG8gPT0gUUVUSF9QUk9UX0lQVjYpIHsKLQkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJhZGRyeGlwNiIpOworCQkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImFkZHJ4aXA2Iik7CiAJCQltZW1jcHkoJmlwYWRkci0+dS5hNi5hZGRyLCBhZGRyLCAxNik7CiAJCQlpcGFkZHItPnUuYTYucGZ4bGVuID0gMDsKIAkJfQpAQCAtOTA1LDExICs5MDUsMTEgQEAKIAlpcGFkZHIgPSBxZXRoX2wzX2dldF9hZGRyX2J1ZmZlcihwcm90byk7CiAJaWYgKGlwYWRkcikgewogCQlpZiAocHJvdG8gPT0gUUVUSF9QUk9UX0lQVjQpIHsKLQkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJhZGRyeGlwNCIpOworCQkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImFkZHJ4aXA0Iik7CiAJCQltZW1jcHkoJmlwYWRkci0+dS5hNC5hZGRyLCBhZGRyLCA0KTsKIAkJCWlwYWRkci0+dS5hNC5tYXNrID0gMDsKIAkJfSBlbHNlIGlmIChwcm90byA9PSBRRVRIX1BST1RfSVBWNikgewotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImFkZHJ4aXA2Iik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAiYWRkcnhpcDYiKTsKIAkJCW1lbWNweSgmaXBhZGRyLT51LmE2LmFkZHIsIGFkZHIsIDE2KTsKIAkJCWlwYWRkci0+dS5hNi5wZnhsZW4gPSAwOwogCQl9CkBAIC05MjksMTUgKzkyOSwxNSBAQAogCWludCBjbnQgPSAzOwogCiAJaWYgKGFkZHItPnByb3RvID09IFFFVEhfUFJPVF9JUFY0KSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJzZXRhZGRyNCIpOwotCQlRRVRIX0RCRl9IRVgoVFJBQ0UsIDMsICZhZGRyLT51LmE0LmFkZHIsIHNpemVvZihpbnQpKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgInNldGFkZHI0Iik7CisJCVFFVEhfQ0FSRF9IRVgoY2FyZCwgMywgJmFkZHItPnUuYTQuYWRkciwgc2l6ZW9mKGludCkpOwogCX0gZWxzZSBpZiAoYWRkci0+cHJvdG8gPT0gUUVUSF9QUk9UX0lQVjYpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgInNldGFkZHI2Iik7Ci0JCVFFVEhfREJGX0hFWChUUkFDRSwgMywgJmFkZHItPnUuYTYuYWRkciwgOCk7Ci0JCVFFVEhfREJGX0hFWChUUkFDRSwgMywgKChjaGFyICopJmFkZHItPnUuYTYuYWRkcikgKyA4LCA4KTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgInNldGFkZHI2Iik7CisJCVFFVEhfQ0FSRF9IRVgoY2FyZCwgMywgJmFkZHItPnUuYTYuYWRkciwgOCk7CisJCVFFVEhfQ0FSRF9IRVgoY2FyZCwgMywgKChjaGFyICopJmFkZHItPnUuYTYuYWRkcikgKyA4LCA4KTsKIAl9IGVsc2UgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAic2V0YWRkcj8iKTsKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCAzLCBhZGRyLCBzaXplb2Yoc3RydWN0IHFldGhfaXBhZGRyKSk7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJzZXRhZGRyPyIpOworCQlRRVRIX0NBUkRfSEVYKGNhcmQsIDMsIGFkZHIsIHNpemVvZihzdHJ1Y3QgcWV0aF9pcGFkZHIpKTsKIAl9CiAJZG8gewogCQlpZiAoYWRkci0+aXNfbXVsdGljYXN0KQpAQCAtOTQ2LDEwICs5NDYsMTAgQEAKIAkJCXJjID0gcWV0aF9sM19zZW5kX3NldGRlbGlwKGNhcmQsIGFkZHIsIElQQV9DTURfU0VUSVAsCiAJCQkJCWFkZHItPnNldF9mbGFncyk7CiAJCWlmIChyYykKLQkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJmYWlsZWQiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJmYWlsZWQiKTsKIAl9IHdoaWxlICgoLS1jbnQgPiAwKSAmJiByYyk7CiAJaWYgKHJjKSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJGQUlMRUQiKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgIkZBSUxFRCIpOwogCQlxZXRoX2wzX2lwYWRkcl90b19zdHJpbmcoYWRkci0+cHJvdG8sICh1OCAqKSZhZGRyLT51LCBidWYpOwogCQlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LAogCQkJIlJlZ2lzdGVyaW5nIElQIGFkZHJlc3MgJXMgZmFpbGVkXG4iLCBidWYpOwpAQCAtOTYzLDE1ICs5NjMsMTUgQEAKIAlpbnQgcmMgPSAwOwogCiAJaWYgKGFkZHItPnByb3RvID09IFFFVEhfUFJPVF9JUFY0KSB7Ci0JCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJkZWxhZGRyNCIpOwotCQlRRVRIX0RCRl9IRVgoVFJBQ0UsIDMsICZhZGRyLT51LmE0LmFkZHIsIHNpemVvZihpbnQpKTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImRlbGFkZHI0Iik7CisJCVFFVEhfQ0FSRF9IRVgoY2FyZCwgMywgJmFkZHItPnUuYTQuYWRkciwgc2l6ZW9mKGludCkpOwogCX0gZWxzZSBpZiAoYWRkci0+cHJvdG8gPT0gUUVUSF9QUk9UX0lQVjYpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImRlbGFkZHI2Iik7Ci0JCVFFVEhfREJGX0hFWChUUkFDRSwgMywgJmFkZHItPnUuYTYuYWRkciwgOCk7Ci0JCVFFVEhfREJGX0hFWChUUkFDRSwgMywgKChjaGFyICopJmFkZHItPnUuYTYuYWRkcikgKyA4LCA4KTsKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgImRlbGFkZHI2Iik7CisJCVFFVEhfQ0FSRF9IRVgoY2FyZCwgMywgJmFkZHItPnUuYTYuYWRkciwgOCk7CisJCVFFVEhfQ0FSRF9IRVgoY2FyZCwgMywgKChjaGFyICopJmFkZHItPnUuYTYuYWRkcikgKyA4LCA4KTsKIAl9IGVsc2UgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiZGVsYWRkcj8iKTsKLQkJUUVUSF9EQkZfSEVYKFRSQUNFLCAzLCBhZGRyLCBzaXplb2Yoc3RydWN0IHFldGhfaXBhZGRyKSk7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJkZWxhZGRyPyIpOworCQlRRVRIX0NBUkRfSEVYKGNhcmQsIDMsIGFkZHIsIHNpemVvZihzdHJ1Y3QgcWV0aF9pcGFkZHIpKTsKIAl9CiAJaWYgKGFkZHItPmlzX211bHRpY2FzdCkKIAkJcmMgPSBxZXRoX2wzX3NlbmRfc2V0ZGVsbWMoY2FyZCwgYWRkciwgSVBBX0NNRF9ERUxJUE0pOwpAQCAtOTc5LDcgKzk3OSw3IEBACiAJCXJjID0gcWV0aF9sM19zZW5kX3NldGRlbGlwKGNhcmQsIGFkZHIsIElQQV9DTURfREVMSVAsCiAJCQkJCWFkZHItPmRlbF9mbGFncyk7CiAJaWYgKHJjKQotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiZmFpbGVkIik7CisJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDIsICJmYWlsZWQiKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJc3RydWN0IHFldGhfY21kX2J1ZmZlciAqaW9iOwogCXN0cnVjdCBxZXRoX2lwYV9jbWQgKmNtZDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJhZHBtb2RlIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImFkcG1vZGUiKTsKIAogCWlvYiA9IHFldGhfZ2V0X2FkYXB0ZXJfY21kKGNhcmQsIGNvbW1hbmQsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBxZXRoX2lwYWNtZF9zZXRhZHBwYXJtcykpOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiYWRwaHN0ciIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJhZHBoc3RyIik7CiAKIAlpZiAocWV0aF9hZHBfc3VwcG9ydGVkKGNhcmQsIElQQV9TRVRBRFBfU0VUX0JST0FEQ0FTVF9NT0RFKSkgewogCQlyYyA9IHFldGhfbDNfc2VuZF9zZXRhZHBfbW9kZShjYXJkLApAQCAtMTA5Myw3ICsxMDkzLDcgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiZGVmYWRwY2IiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiZGVmYWRwY2IiKTsKIAogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopIGRhdGE7CiAJaWYgKGNtZC0+aGRyLnJldHVybl9jb2RlID09IDApIHsKQEAgLTExMDYsMTMgKzExMDYsMTMgQEAKIAlpZiAoY21kLT5kYXRhLnNldGFzc3Bhcm1zLmhkci5hc3Npc3Rfbm8gPT0gSVBBX0lOQk9VTkRfQ0hFQ0tTVU0gJiYKIAkgICAgY21kLT5kYXRhLnNldGFzc3Bhcm1zLmhkci5jb21tYW5kX2NvZGUgPT0gSVBBX0NNRF9BU1NfU1RBUlQpIHsKIAkJY2FyZC0+aW5mby5jc3VtX21hc2sgPSBjbWQtPmRhdGEuc2V0YXNzcGFybXMuZGF0YS5mbGFnc18zMmJpdDsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDMsICJjc3VtOiVkIiwgY2FyZC0+aW5mby5jc3VtX21hc2spOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMywgImNzdW06JWQiLCBjYXJkLT5pbmZvLmNzdW1fbWFzayk7CiAJfQogCWlmIChjbWQtPmRhdGEuc2V0YXNzcGFybXMuaGRyLmFzc2lzdF9ubyA9PSBJUEFfT1VUQk9VTkRfQ0hFQ0tTVU0gJiYKIAkgICAgY21kLT5kYXRhLnNldGFzc3Bhcm1zLmhkci5jb21tYW5kX2NvZGUgPT0gSVBBX0NNRF9BU1NfU1RBUlQpIHsKIAkJY2FyZC0+aW5mby50eF9jc3VtX21hc2sgPQogCQkJY21kLT5kYXRhLnNldGFzc3Bhcm1zLmRhdGEuZmxhZ3NfMzJiaXQ7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAzLCAidGNzdTolZCIsIGNhcmQtPmluZm8udHhfY3N1bV9tYXNrKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDMsICJ0Y3N1OiVkIiwgY2FyZC0+aW5mby50eF9jc3VtX21hc2spOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAlzdHJ1Y3QgcWV0aF9jbWRfYnVmZmVyICppb2I7CiAJc3RydWN0IHFldGhfaXBhX2NtZCAqY21kOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImdldGFzc2NtIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImdldGFzc2NtIik7CiAJaW9iID0gcWV0aF9nZXRfaXBhY21kX2J1ZmZlcihjYXJkLCBJUEFfQ01EX1NFVEFTU1BBUk1TLCBwcm90KTsKIAogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopKGlvYi0+ZGF0YStJUEFfUERVX0hFQURFUl9TSVpFKTsKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAJaW50IHJjOwogCXN0cnVjdCBxZXRoX2lwYV9jbWQgKmNtZDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJzZW5kYXNzcCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzZW5kYXNzcCIpOwogCiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikoaW9iLT5kYXRhK0lQQV9QRFVfSEVBREVSX1NJWkUpOwogCWlmIChsZW4gPD0gc2l6ZW9mKF9fdTMyKSkKQEAgLTExNjYsNyArMTE2Niw3IEBACiAJaW50IHJjOwogCXN0cnVjdCBxZXRoX2NtZF9idWZmZXIgKmlvYjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJzaW1hc3NwNiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzaW1hc3NwNiIpOwogCWlvYiA9IHFldGhfbDNfZ2V0X3NldGFzc3Bhcm1zX2NtZChjYXJkLCBpcGFfZnVuYywgY21kX2NvZGUsCiAJCQkJICAgICAgIDAsIFFFVEhfUFJPVF9JUFY2KTsKIAlyYyA9IHFldGhfbDNfc2VuZF9zZXRhc3NwYXJtcyhjYXJkLCBpb2IsIDAsIDAsCkBAIC0xMTgyLDcgKzExODIsNyBAQAogCWludCBsZW5ndGggPSAwOwogCXN0cnVjdCBxZXRoX2NtZF9idWZmZXIgKmlvYjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJzaW1hc3NwNCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJzaW1hc3NwNCIpOwogCWlmIChkYXRhKQogCQlsZW5ndGggPSBzaXplb2YoX191MzIpOwogCWlvYiA9IHFldGhfbDNfZ2V0X3NldGFzc3Bhcm1zX2NtZChjYXJkLCBpcGFfZnVuYywgY21kX2NvZGUsCkBAIC0xMTk2LDcgKzExOTYsNyBAQAogewogCWludCByYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJpcGFhcnAiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiaXBhYXJwIik7CiAKIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9BUlBfUFJPQ0VTU0lORykpIHsKIAkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKQEAgLTEyMTgsNyArMTIxOCw3IEBACiB7CiAJaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImlwYWlwZnJnIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImlwYWlwZnJnIik7CiAKIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9JUF9GUkFHTUVOVEFUSU9OKSkgewogCQlkZXZfaW5mbygmY2FyZC0+Z2Rldi0+ZGV2LApAQCAtMTI0Myw3ICsxMjQzLDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic3RzcmNtYWMiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic3RzcmNtYWMiKTsKIAogCWlmICghcWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX1NPVVJDRV9NQUMpKSB7CiAJCWRldl9pbmZvKCZjYXJkLT5nZGV2LT5kZXYsCkBAIC0xMjY1LDcgKzEyNjUsNyBAQAogewogCWludCByYyA9IDA7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic3RydHZsYW4iKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic3RydHZsYW4iKTsKIAogCWlmICghcWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX0ZVTExfVkxBTikpIHsKIAkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKQEAgLTEyODksNyArMTI4OSw3IEBACiB7CiAJaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInN0bWNhc3QiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic3RtY2FzdCIpOwogCiAJaWYgKCFxZXRoX2lzX3N1cHBvcnRlZChjYXJkLCBJUEFfTVVMVElDQVNUSU5HKSkgewogCQlkZXZfaW5mbygmY2FyZC0+Z2Rldi0+ZGV2LApAQCAtMTM0OSw3ICsxMzQ5LDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic29mdGlwdjYiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic29mdGlwdjYiKTsKIAogCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfSVFEKQogCQlnb3RvIG91dDsKQEAgLTEzOTUsNyArMTM5NSw3IEBACiB7CiAJaW50IHJjID0gMDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJzdHJ0aXB2NiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJzdHJ0aXB2NiIpOwogCiAJaWYgKCFxZXRoX2lzX3N1cHBvcnRlZChjYXJkLCBJUEFfSVBWNikpIHsKIAkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKQEAgLTE0MTIsNyArMTQxMiw3IEBACiB7CiAJaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInN0YnJkY3N0Iik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgInN0YnJkY3N0Iik7CiAJY2FyZC0+aW5mby5icm9hZGNhc3RfY2FwYWJsZSA9IDA7CiAJaWYgKCFxZXRoX2lzX3N1cHBvcnRlZChjYXJkLCBJUEFfRklMVEVSSU5HKSkgewogCQlkZXZfaW5mbygmY2FyZC0+Z2Rldi0+ZGV2LApAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgInN0cnRjc3VtIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgInN0cnRjc3VtIik7CiAKIAlpZiAoY2FyZC0+b3B0aW9ucy5jaGVja3N1bV90eXBlID09IE5PX0NIRUNLU1VNTUlORykgewogCQlkZXZfaW5mbygmY2FyZC0+Z2Rldi0+ZGV2LApAQCAtMTU2OSw3ICsxNTY5LDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic3R0c28iKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic3R0c28iKTsKIAogCWlmICghcWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX09VVEJPVU5EX1RTTykpIHsKIAkJZGV2X2luZm8oJmNhcmQtPmdkZXYtPmRldiwKQEAgLTE1OTYsNyArMTU5Niw3IEBACiAKIHN0YXRpYyBpbnQgcWV0aF9sM19zdGFydF9pcGFzc2lzdHMoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic3RydGlwYXMiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic3RydGlwYXMiKTsKIAogCXFldGhfc2V0X2FjY2Vzc19jdHJsX29ubGluZShjYXJkKTsJLyogZ28gb24qLwogCXFldGhfbDNfc3RhcnRfaXBhX2FycF9wcm9jZXNzaW5nKGNhcmQpOwkvKiBnbyBvbiovCkBAIC0xNjE5LDcgKzE2MTksNyBAQAogCXN0cnVjdCBxZXRoX2NtZF9idWZmZXIgKmlvYjsKIAlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAicHVuaXFlaWQiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAicHVuaXFlaWQiKTsKIAogCWlmICgoY2FyZC0+aW5mby51bmlxdWVfaWQgJiBVTklRVUVfSURfTk9UX0JZX0NBUkQpID09CiAJCVVOSVFVRV9JRF9OT1RfQllfQ0FSRCkKQEAgLTE3MjMsNyArMTcyMyw3IEBACiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKilkYXRhOwogCXJjID0gY21kLT5oZHIucmV0dXJuX2NvZGU7CiAJaWYgKHJjKQotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgImR4dGVyJXgiLCByYyk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiZHh0ZXIleCIsIHJjKTsKIAlzd2l0Y2ggKGNtZC0+ZGF0YS5kaWFnYXNzLmFjdGlvbikgewogCWNhc2UgUUVUSF9ESUFHU19DTURfVFJBQ0VfUVVFUlk6CiAJCWJyZWFrOwpAQCAtMTgwMCw3ICsxODAwLDcgQEAKIAlzdHJ1Y3QgaXBfbWNfbGlzdCAqaW00OwogCWNoYXIgYnVmW01BWF9BRERSX0xFTl07CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiYWRkbWMiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiYWRkbWMiKTsKIAlmb3IgKGltNCA9IGluNF9kZXYtPm1jX2xpc3Q7IGltNDsgaW00ID0gaW00LT5uZXh0KSB7CiAJCXFldGhfbDNfZ2V0X21hY19mb3JfaXBtKGltNC0+bXVsdGlhZGRyLCBidWYsIGluNF9kZXYtPmRldik7CiAJCWlwbSA9IHFldGhfbDNfZ2V0X2FkZHJfYnVmZmVyKFFFVEhfUFJPVF9JUFY0KTsKQEAgLTE4MjAsNyArMTgyMCw3IEBACiAJc3RydWN0IHZsYW5fZ3JvdXAgKnZnOwogCWludCBpOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImFkZG1jdmwiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiYWRkbWN2bCIpOwogCWlmICghcWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX0ZVTExfVkxBTikgfHwgKGNhcmQtPnZsYW5ncnAgPT0gTlVMTCkpCiAJCXJldHVybjsKIApAQCAtMTg0NCw3ICsxODQ0LDcgQEAKIHsKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbjRfZGV2OwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImNoa21jdjQiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiY2hrbWN2NCIpOwogCWluNF9kZXYgPSBpbl9kZXZfZ2V0KGNhcmQtPmRldik7CiAJaWYgKGluNF9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTg2Miw3ICsxODYyLDcgQEAKIAlzdHJ1Y3QgaWZtY2FkZHI2ICppbTY7CiAJY2hhciBidWZbTUFYX0FERFJfTEVOXTsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJhZGRtYzYiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiYWRkbWM2Iik7CiAJZm9yIChpbTYgPSBpbjZfZGV2LT5tY19saXN0OyBpbTYgIT0gTlVMTDsgaW02ID0gaW02LT5uZXh0KSB7CiAJCW5kaXNjX21jX21hcCgmaW02LT5tY2FfYWRkciwgYnVmLCBpbjZfZGV2LT5kZXYsIDApOwogCQlpcG0gPSBxZXRoX2wzX2dldF9hZGRyX2J1ZmZlcihRRVRIX1BST1RfSVBWNik7CkBAIC0xODgzLDcgKzE4ODMsNyBAQAogCXN0cnVjdCB2bGFuX2dyb3VwICp2ZzsKIAlpbnQgaTsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJhZG1jNnZsIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImFkbWM2dmwiKTsKIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9GVUxMX1ZMQU4pIHx8IChjYXJkLT52bGFuZ3JwID09IE5VTEwpKQogCQlyZXR1cm47CiAKQEAgLTE5MDcsNyArMTkwNyw3IEBACiB7CiAJc3RydWN0IGluZXQ2X2RldiAqaW42X2RldjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJjaGttY3Y2Iik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImNoa21jdjYiKTsKIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9JUFY2KSkKIAkJcmV0dXJuIDsKIAlpbjZfZGV2ID0gaW42X2Rldl9nZXQoY2FyZC0+ZGV2KTsKQEAgLTE5MjgsNyArMTkyOCw3IEBACiAJc3RydWN0IGluX2lmYWRkciAqaWZhOwogCXN0cnVjdCBxZXRoX2lwYWRkciAqYWRkcjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJmcnZhZGRyNCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJmcnZhZGRyNCIpOwogCiAJaW5fZGV2ID0gaW5fZGV2X2dldCh2bGFuX2dyb3VwX2dldF9kZXZpY2UoY2FyZC0+dmxhbmdycCwgdmlkKSk7CiAJaWYgKCFpbl9kZXYpCkBAIC0xOTU0LDcgKzE5NTQsNyBAQAogCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYTsKIAlzdHJ1Y3QgcWV0aF9pcGFkZHIgKmFkZHI7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAiZnJ2YWRkcjYiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiZnJ2YWRkcjYiKTsKIAogCWluNl9kZXYgPSBpbjZfZGV2X2dldCh2bGFuX2dyb3VwX2dldF9kZXZpY2UoY2FyZC0+dmxhbmdycCwgdmlkKSk7CiAJaWYgKCFpbjZfZGV2KQpAQCAtMTk4OSw3ICsxOTg5LDcgQEAKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCA0LCAidmxhbnJlZyIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJ2bGFucmVnIik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnZsYW5sb2NrLCBmbGFncyk7CiAJY2FyZC0+dmxhbmdycCA9IGdycDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT52bGFubG9jaywgZmxhZ3MpOwpAQCAtMjAwNSw5ICsyMDA1LDkgQEAKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgImtpZDolZCIsIHZpZCk7CisJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJraWQ6JWQiLCB2aWQpOwogCWlmIChxZXRoX3dhaXRfZm9yX3RocmVhZHMoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpIHsKLQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImtpZFJFQyIpOworCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAia2lkUkVDIik7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnZsYW5sb2NrLCBmbGFncyk7CkBAIC0yMTYyLDcgKzIxNjIsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImluYnVua25vIik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiaW5idW5rbm8iKTsKIAkJCVFFVEhfREJGX0hFWChDVFJMLCAzLCBoZHIsIFFFVEhfREJGX0NUUkxfTEVOKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0yMjI5LDcgKzIyMjksOCBAQAogCQljYXJkID0gdmxhbl9kZXZfcmVhbF9kZXYoZGV2KS0+bWxfcHJpdjsKIAlpZiAoY2FyZCAmJiBjYXJkLT5vcHRpb25zLmxheWVyMikKIAkJY2FyZCA9IE5VTEw7Ci0JUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICIlZCIsIHJjKTsKKwlpZiAoY2FyZCkKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICIlZCIsIHJjKTsKIAlyZXR1cm4gY2FyZCA7CiB9CiAKQEAgLTIzMDcsMTAgKzIzMDgsMTAgQEAKIAl9IGVsc2UgaWYgKGNhcmQtPm9wdGlvbnMuc25pZmZlciAmJgkvKiBIaXBlclNvY2tldHMgdHJhY2UgKi8KIAkJICAgcWV0aF9hZHBfc3VwcG9ydGVkKGNhcmQsIElQQV9TRVRBRFBfU0VUX0RJQUdfQVNTSVNUKSkgewogCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAiK3Byb21pc2MiKTsKKwkJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICIrcHJvbWlzYyIpOwogCQkJcWV0aF9kaWFnc190cmFjZShjYXJkLCBRRVRIX0RJQUdTX0NNRF9UUkFDRV9FTkFCTEUpOwogCQl9IGVsc2UgewotCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgIi1wcm9taXNjIik7CisJCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiLXByb21pc2MiKTsKIAkJCXFldGhfZGlhZ3NfdHJhY2UoY2FyZCwgUUVUSF9ESUFHU19DTURfVFJBQ0VfRElTQUJMRSk7CiAJCX0KIAl9CkBAIC0yMzIwLDcgKzIzMjEsNyBAQAogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic2V0bXVsdGkiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAic2V0bXVsdGkiKTsKIAlpZiAocWV0aF90aHJlYWRzX3J1bm5pbmcoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkgJiYKIAkgICAgKGNhcmQtPnN0YXRlICE9IENBUkRfU1RBVEVfVVApKQogCQlyZXR1cm47CkBAIC0yMzY1LDcgKzIzNjYsNyBAQAogCWludCB0bXA7CiAJaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImFycHN0bm9lIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImFycHN0bm9lIik7CiAKIAkvKgogCSAqIGN1cnJlbnRseSBHdWVzdExBTiBvbmx5IHN1cHBvcnRzIHRoZSBBUlAgYXNzaXN0IGZ1bmN0aW9uCkBAIC0yNDE3LDE3ICsyNDE4LDE3IEBACiAJaW50IHVlbnRyeV9zaXplOwogCWludCBpOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgImFycHF1ZWNiIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImFycHF1ZWNiIik7CiAKIAlxaW5mbyA9IChzdHJ1Y3QgcWV0aF9hcnBfcXVlcnlfaW5mbyAqKSByZXBseS0+cGFyYW07CiAJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikgZGF0YTsKIAlpZiAoY21kLT5oZHIucmV0dXJuX2NvZGUpIHsKLQkJUUVUSF9EQkZfVEVYVF8oVFJBQ0UsIDQsICJxYWVyMSVpIiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOworCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgNCwgInFhZXIxJWkiLCBjbWQtPmhkci5yZXR1cm5fY29kZSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoY21kLT5kYXRhLnNldGFzc3Bhcm1zLmhkci5yZXR1cm5fY29kZSkgewogCQljbWQtPmhkci5yZXR1cm5fY29kZSA9IGNtZC0+ZGF0YS5zZXRhc3NwYXJtcy5oZHIucmV0dXJuX2NvZGU7Ci0JCVFFVEhfREJGX1RFWFRfKFRSQUNFLCA0LCAicWFlcjIlaSIsIGNtZC0+aGRyLnJldHVybl9jb2RlKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJxYWVyMiVpIiwgY21kLT5oZHIucmV0dXJuX2NvZGUpOwogCQlyZXR1cm4gMDsKIAl9CiAJcWRhdGEgPSAmY21kLT5kYXRhLnNldGFzc3Bhcm1zLmRhdGEucXVlcnlfYXJwOwpAQCAtMjQ0OSwxNCArMjQ1MCwxNCBAQAogCS8qIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHVzZXJzcGFjZSAqLwogCWlmICgocWluZm8tPnVkYXRhX2xlbiAtIHFpbmZvLT51ZGF0YV9vZmZzZXQpIDwKIAkJCXFkYXRhLT5ub19lbnRyaWVzICogdWVudHJ5X3NpemUpewotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgInFhZXIzJWkiLCAtRU5PTUVNKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJxYWVyMyVpIiwgLUVOT01FTSk7CiAJCWNtZC0+aGRyLnJldHVybl9jb2RlID0gLUVOT01FTTsKIAkJZ290byBvdXRfZXJyb3I7CiAJfQotCVFFVEhfREJGX1RFWFRfKFRSQUNFLCA0LCAiYW5vcmUlaSIsCisJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJhbm9yZSVpIiwKIAkJICAgICAgIGNtZC0+ZGF0YS5zZXRhc3NwYXJtcy5oZHIubnVtYmVyX29mX3JlcGxpZXMpOwotCVFFVEhfREJGX1RFWFRfKFRSQUNFLCA0LCAiYXNlcW4laSIsIGNtZC0+ZGF0YS5zZXRhc3NwYXJtcy5oZHIuc2VxX25vKTsKLQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgNCwgImFub2VuJWkiLCBxZGF0YS0+bm9fZW50cmllcyk7CisJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJhc2VxbiVpIiwgY21kLT5kYXRhLnNldGFzc3Bhcm1zLmhkci5zZXFfbm8pOworCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAiYW5vZW4laSIsIHFkYXRhLT5ub19lbnRyaWVzKTsKIAogCWlmIChxaW5mby0+bWFza19iaXRzICYgUUVUSF9RQVJQX1NUUklQX0VOVFJJRVMpIHsKIAkJLyogc3RyaXAgb2ZmICJtZWRpYSBzcGVjaWZpYyBpbmZvcm1hdGlvbiIgKi8KQEAgLTI0OTIsNyArMjQ5Myw3IEBACiAJCQl1bnNpZ25lZCBsb25nKSwKIAkJdm9pZCAqcmVwbHlfcGFyYW0pCiB7Ci0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInNlbmRhcnAiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAic2VuZGFycCIpOwogCiAJbWVtY3B5KGlvYi0+ZGF0YSwgSVBBX1BEVV9IRUFERVIsIElQQV9QRFVfSEVBREVSX1NJWkUpOwogCW1lbWNweShRRVRIX0lQQV9DTURfREVTVF9BRERSKGlvYi0+ZGF0YSksCkBAIC0yNTA4LDcgKzI1MDksNyBAQAogCWludCB0bXA7CiAJaW50IHJjOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImFycHF1ZXJ5Iik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImFycHF1ZXJ5Iik7CiAKIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsLypJUEFfUVVFUllfQVJQX0FERFJfSU5GTyovCiAJCQkgICAgICAgSVBBX0FSUF9QUk9DRVNTSU5HKSkgewpAQCAtMjU1MSw3ICsyNTUyLDcgQEAKIAlpbnQgdG1wOwogCWludCByYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJhcnBhZGVudCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJhcnBhZGVudCIpOwogCiAJLyoKIAkgKiBjdXJyZW50bHkgR3Vlc3RMQU4gb25seSBzdXBwb3J0cyB0aGUgQVJQIGFzc2lzdCBmdW5jdGlvbgpAQCAtMjU5MCw3ICsyNTkxLDcgQEAKIAlpbnQgdG1wOwogCWludCByYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJhcnBybWVudCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJhcnBybWVudCIpOwogCiAJLyoKIAkgKiBjdXJyZW50bHkgR3Vlc3RMQU4gb25seSBzdXBwb3J0cyB0aGUgQVJQIGFzc2lzdCBmdW5jdGlvbgpAQCAtMjYyNiw3ICsyNjI3LDcgQEAKIAlpbnQgcmM7CiAJaW50IHRtcDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJhcnBmbHVzaCIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJhcnBmbHVzaCIpOwogCiAJLyoKIAkgKiBjdXJyZW50bHkgR3Vlc3RMQU4gb25seSBzdXBwb3J0cyB0aGUgQVJQIGFzc2lzdCBmdW5jdGlvbgpAQCAtMjczNCw3ICsyNzM1LDcgQEAKIAkJcmMgPSAtRU9QTk9UU1VQUDsKIAl9CiAJaWYgKHJjKQotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgImlvY2UlZCIsIHJjKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICJpb2NlJWQiLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yOTAzLDE5ICsyOTA0LDExIEBACiAJdW5zaWduZWQgbG9uZyB0Y3BkID0gKHVuc2lnbmVkIGxvbmcpdGNwX2hkcihza2IpICsKIAkJdGNwX2hkcihza2IpLT5kb2ZmICogNDsKIAlpbnQgdGNwZF9sZW4gPSBza2ItPmxlbiAtICh0Y3BkIC0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKTsKLQlpbnQgZWxlbWVudHMgPSBQRk5fVVAodGNwZCArIHRjcGRfbGVuKSAtIFBGTl9ET1dOKHRjcGQpOworCWludCBlbGVtZW50cyA9IFBGTl9VUCh0Y3BkICsgdGNwZF9sZW4gLSAxKSAtIFBGTl9ET1dOKHRjcGQpOwogCWVsZW1lbnRzICs9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAJcmV0dXJuIGVsZW1lbnRzOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBxZXRoX2wzX3Rzb19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBsZW4gPSAoKHVuc2lnbmVkIGxvbmcpdGNwX2hkcihza2IpICsgdGNwX2hkcihza2IpLT5kb2ZmICogNCkgLQotCQkodW5zaWduZWQgbG9uZylza2ItPmRhdGE7Ci0JcmV0dXJuICgoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICYgUEFHRV9NQVNLKSAhPQotCQkoKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSArIGxlbikgJiBQQUdFX01BU0spKTsKLX0KLQogc3RhdGljIGludCBxZXRoX2wzX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCByYzsKQEAgLTMwMTUsOCArMzAwOCw2IEBACiAJICAgIChjYXN0X3R5cGUgPT0gUlROX1VOU1BFQykpIHsKIAkJaGRyID0gKHN0cnVjdCBxZXRoX2hkciAqKXNrYl9wdXNoKG5ld19za2IsCiAJCQkJCQlzaXplb2Yoc3RydWN0IHFldGhfaGRyX3RzbykpOwotCQlpZiAocWV0aF9sM190c29fY2hlY2sobmV3X3NrYikpCi0JCQlRRVRIX0RCRl9NRVNTQUdFKDIsICJ0c28gc2tiIG1pc2FsaWduZWRcbiIpOwogCQltZW1zZXQoaGRyLCAwLCBzaXplb2Yoc3RydWN0IHFldGhfaGRyX3RzbykpOwogCQlxZXRoX2wzX2ZpbGxfaGVhZGVyKGNhcmQsIGhkciwgbmV3X3NrYiwgaXB2LCBjYXN0X3R5cGUpOwogCQlxZXRoX3Rzb19maWxsX2hlYWRlcihjYXJkLCBoZHIsIG5ld19za2IpOwpAQCAtMzA0NywxMCArMzAzOCwyMCBAQAogCWVsZW1lbnRzX25lZWRlZCArPSBlbGVtczsKIAlucl9mcmFncyA9IHNrYl9zaGluZm8obmV3X3NrYiktPm5yX2ZyYWdzOwogCi0JaWYgKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9JUUQpCisJaWYgKGNhcmQtPmluZm8udHlwZSAhPSBRRVRIX0NBUkRfVFlQRV9JUUQpIHsKKwkJaW50IGxlbjsKKwkJaWYgKGxhcmdlX3NlbmQgPT0gUUVUSF9MQVJHRV9TRU5EX1RTTykKKwkJCWxlbiA9ICgodW5zaWduZWQgbG9uZyl0Y3BfaGRyKG5ld19za2IpICsKKwkJCQl0Y3BfaGRyKG5ld19za2IpLT5kb2ZmICogNCkgLQorCQkJCSh1bnNpZ25lZCBsb25nKW5ld19za2ItPmRhdGE7CisJCWVsc2UKKwkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgcWV0aF9oZHJfbGF5ZXIzKTsKKworCQlpZiAocWV0aF9oZHJfY2hrX2FuZF9ib3VuY2UobmV3X3NrYiwgbGVuKSkKKwkJCWdvdG8gdHhfZHJvcDsKIAkJcmMgPSBxZXRoX2RvX3NlbmRfcGFja2V0KGNhcmQsIHF1ZXVlLCBuZXdfc2tiLCBoZHIsCiAJCQkJCSBlbGVtZW50c19uZWVkZWQpOwotCWVsc2UKKwl9IGVsc2UKIAkJcmMgPSBxZXRoX2RvX3NlbmRfcGFja2V0X2Zhc3QoY2FyZCwgcXVldWUsIG5ld19za2IsIGhkciwKIAkJCQkJZWxlbWVudHNfbmVlZGVkLCBkYXRhX29mZnNldCwgMCk7CiAKQEAgLTMxMDMsNyArMzEwNCw3IEBACiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldi0+bWxfcHJpdjsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJxZXRob3BlbiIpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJxZXRob3BlbiIpOwogCWlmIChjYXJkLT5zdGF0ZSAhPSBDQVJEX1NUQVRFX1NPRlRTRVRVUCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJY2FyZC0+ZGF0YS5zdGF0ZSA9IENIX1NUQVRFX1VQOwpAQCAtMzExOSw3ICszMTIwLDcgQEAKIHsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInFldGhzdG9wIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInFldGhzdG9wIik7CiAJbmV0aWZfdHhfZGlzYWJsZShkZXYpOwogCWlmIChjYXJkLT5zdGF0ZSA9PSBDQVJEX1NUQVRFX1VQKQogCQljYXJkLT5zdGF0ZSA9IENBUkRfU1RBVEVfU09GVFNFVFVQOwpAQCAtMzMxMiwxMSArMzMxMywxMCBAQAogCQljYXJkLT5wZXJmX3N0YXRzLmluYm91bmRfc3RhcnRfdGltZSA9IHFldGhfZ2V0X21pY3JvcygpOwogCX0KIAlpZiAocWRpb19lcnIgJiBRRElPX0VSUk9SX0FDVElWQVRFX0NIRUNLX0NPTkRJVElPTikgewotCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAxLCAicWRpbmNoayIpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiVzIiwgQ0FSRF9CVVNfSUQoY2FyZCkpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiUwNFglMDRYIiwKKwkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMSwgInFkaW5jaGsiKTsKKwkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDEsICIlMDRYJTA0WCIsCiAJCQkJZmlyc3RfZWxlbWVudCwgY291bnQpOwotCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMSwgIiUwNFgiLCBxdWV1ZSk7CisJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAxLCAiJTA0WCIsIHF1ZXVlKTsKIAkJcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShjYXJkKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMzNTQsNiArMzM1NCw4IEBACiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmY2dkZXYtPmRldik7CiAKKwlxZXRoX2wzX3JlbW92ZV9kZXZpY2VfYXR0cmlidXRlcygmY2dkZXYtPmRldik7CisKIAlxZXRoX3NldF9hbGxvd2VkX3RocmVhZHMoY2FyZCwgMCwgMSk7CiAJd2FpdF9ldmVudChjYXJkLT53YWl0X3EsIHFldGhfdGhyZWFkc19ydW5uaW5nKGNhcmQsIDB4ZmZmZmZmZmYpID09IDApOwogCkBAIC0zMzY3LDcgKzMzNjksNiBAQAogCQljYXJkLT5kZXYgPSBOVUxMOwogCX0KIAotCXFldGhfbDNfcmVtb3ZlX2RldmljZV9hdHRyaWJ1dGVzKCZjZ2Rldi0+ZGV2KTsKIAlxZXRoX2wzX2NsZWFyX2lwX2xpc3QoY2FyZCwgMCwgMCk7CiAJcWV0aF9sM19jbGVhcl9pcGF0b19saXN0KGNhcmQpOwogCXJldHVybjsKQEAgLTMzODAsNiArMzM4MSw3IEBACiAJZW51bSBxZXRoX2NhcmRfc3RhdGVzIHJlY292ZXJfZmxhZzsKIAogCUJVR19PTighY2FyZCk7CisJbXV0ZXhfbG9jaygmY2FyZC0+ZGlzY2lwbGluZV9tdXRleCk7CiAJbXV0ZXhfbG9jaygmY2FyZC0+Y29uZl9tdXRleCk7CiAJUUVUSF9EQkZfVEVYVChTRVRVUCwgMiwgInNldG9ubGluIik7CiAJUUVUSF9EQkZfSEVYKFNFVFVQLCAyLCAmY2FyZCwgc2l6ZW9mKHZvaWQgKikpOwpAQCAtMzQ2MSw2ICszNDYzLDcgQEAKIAlrb2JqZWN0X3VldmVudCgmZ2Rldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIG91dDoKIAltdXRleF91bmxvY2soJmNhcmQtPmNvbmZfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY2FyZC0+ZGlzY2lwbGluZV9tdXRleCk7CiAJcmV0dXJuIDA7CiBvdXRfcmVtb3ZlOgogCWNhcmQtPnVzZV9oYXJkX3N0b3AgPSAxOwpAQCAtMzQ3Myw2ICszNDc2LDcgQEAKIAllbHNlCiAJCWNhcmQtPnN0YXRlID0gQ0FSRF9TVEFURV9ET1dOOwogCW11dGV4X3VubG9jaygmY2FyZC0+Y29uZl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjYXJkLT5kaXNjaXBsaW5lX211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTM0ODgsNiArMzQ5Miw3IEBACiAJaW50IHJjID0gMCwgcmMyID0gMCwgcmMzID0gMDsKIAllbnVtIHFldGhfY2FyZF9zdGF0ZXMgcmVjb3Zlcl9mbGFnOwogCisJbXV0ZXhfbG9jaygmY2FyZC0+ZGlzY2lwbGluZV9tdXRleCk7CiAJbXV0ZXhfbG9jaygmY2FyZC0+Y29uZl9tdXRleCk7CiAJUUVUSF9EQkZfVEVYVChTRVRVUCwgMywgInNldG9mZmwiKTsKIAlRRVRIX0RCRl9IRVgoU0VUVVAsIDMsICZjYXJkLCBzaXplb2Yodm9pZCAqKSk7CkBAIC0zNTA4LDYgKzM1MTMsNyBAQAogCS8qIGxldCB1c2VyX3NwYWNlIGtub3cgdGhhdCBkZXZpY2UgaXMgb2ZmbGluZSAqLwogCWtvYmplY3RfdWV2ZW50KCZjZ2Rldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIAltdXRleF91bmxvY2soJmNhcmQtPmNvbmZfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY2FyZC0+ZGlzY2lwbGluZV9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM1MjIsMTEgKzM1MjgsMTEgQEAKIAlpbnQgcmMgPSAwOwogCiAJY2FyZCA9IChzdHJ1Y3QgcWV0aF9jYXJkICopIHB0cjsKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAicmVjb3ZlcjEiKTsKLQlRRVRIX0RCRl9IRVgoVFJBQ0UsIDIsICZjYXJkLCBzaXplb2Yodm9pZCAqKSk7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgInJlY292ZXIxIik7CisJUUVUSF9DQVJEX0hFWChjYXJkLCAyLCAmY2FyZCwgc2l6ZW9mKHZvaWQgKikpOwogCWlmICghcWV0aF9kb19ydW5fdGhyZWFkKGNhcmQsIFFFVEhfUkVDT1ZFUl9USFJFQUQpKQogCQlyZXR1cm4gMDsKLQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAicmVjb3ZlcjIiKTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAyLCAicmVjb3ZlcjIiKTsKIAlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LAogCQkiQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBiZWVuIHN0YXJ0ZWQgZm9yIHRoZSBkZXZpY2VcbiIpOwogCWNhcmQtPnVzZV9oYXJkX3N0b3AgPSAxOwpAQCAtMzYyNCw4ICszNjMwLDggQEAKIAlpZiAoZGV2X25ldChkZXYpICE9ICZpbml0X25ldCkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JUUVUSF9EQkZfVEVYVChUUkFDRSwgMywgImlwZXZlbnQiKTsKIAljYXJkID0gcWV0aF9sM19nZXRfY2FyZF9mcm9tX2RldihkZXYpOworCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJpcGV2ZW50Iik7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKQEAgLTM2NzEsMTEgKzM2NzcsMTEgQEAKIAlzdHJ1Y3QgcWV0aF9pcGFkZHIgKmFkZHI7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZDsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDMsICJpcDZldmVudCIpOwogCiAJY2FyZCA9IHFldGhfbDNfZ2V0X2NhcmRfZnJvbV9kZXYoZGV2KTsKIAlpZiAoIWNhcmQpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKKwlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiaXA2ZXZlbnQiKTsKIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9JUFY2KSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCkBAIC0zNzE0LDcgKzM3MjAsNyBAQAogewogCWludCByYzsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJyZWdub3RpZiIpOworCVFFVEhfREJGX1RFWFQoU0VUVVAsIDUsICJyZWdub3RpZiIpOwogCXJjID0gcmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJnFldGhfbDNfaXBfbm90aWZpZXIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtMzczMyw3ICszNzM5LDcgQEAKIHN0YXRpYyB2b2lkIHFldGhfbDNfdW5yZWdpc3Rlcl9ub3RpZmllcnModm9pZCkKIHsKIAotCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDUsICJ1bnJlZ25vdCIpOworCVFFVEhfREJGX1RFWFQoU0VUVVAsIDUsICJ1bnJlZ25vdCIpOwogCUJVR19PTih1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZxZXRoX2wzX2lwX25vdGlmaWVyKSk7CiAjaWZkZWYgQ09ORklHX1FFVEhfSVBWNgogCUJVR19PTih1bnJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcigmcWV0aF9sM19pcDZfbm90aWZpZXIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19zeXMuYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19zeXMuYwppbmRleCBmYjUzMThiLi42N2NmYTY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX3N5cy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19zeXMuYwpAQCAtNDc5LDYgKzQ3OSw3IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHFldGhfaXBhZGRyICp0bXBpcGEsICp0OwogCWNoYXIgKnRtcDsKIAlpbnQgcmMgPSAwOwogCkBAIC00OTcsOCArNDk4LDIxIEBACiAJCWNhcmQtPmlwYXRvLmVuYWJsZWQgPSAoY2FyZC0+aXBhdG8uZW5hYmxlZCk/IDAgOiAxOwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0bXAsICIxIikpIHsKIAkJY2FyZC0+aXBhdG8uZW5hYmxlZCA9IDE7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBpcGEsIHQsIGNhcmQtPmlwX3RiZF9saXN0LCBlbnRyeSkgeworCQkJaWYgKCh0bXBpcGEtPnR5cGUgPT0gUUVUSF9JUF9UWVBFX05PUk1BTCkgJiYKKwkJCQlxZXRoX2wzX2lzX2FkZHJfY292ZXJlZF9ieV9pcGF0byhjYXJkLCB0bXBpcGEpKQorCQkJCXRtcGlwYS0+c2V0X2ZsYWdzIHw9CisJCQkJCVFFVEhfSVBBX1NFVElQX1RBS0VPVkVSX0ZMQUc7CisJCX0KKwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0bXAsICIwIikpIHsKIAkJY2FyZC0+aXBhdG8uZW5hYmxlZCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBpcGEsIHQsIGNhcmQtPmlwX3RiZF9saXN0LCBlbnRyeSkgeworCQkJaWYgKHRtcGlwYS0+c2V0X2ZsYWdzICYKKwkJCQlRRVRIX0lQQV9TRVRJUF9UQUtFT1ZFUl9GTEFHKQorCQkJCXRtcGlwYS0+c2V0X2ZsYWdzICY9CisJCQkJCX5RRVRIX0lQQV9TRVRJUF9UQUtFT1ZFUl9GTEFHOworCQl9CiAJfSBlbHNlCiAJCXJjID0gLUVJTlZBTDsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYwppbmRleCA3MDQ5MTI3Li42NWUxY2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3Ntc2dpdWN2LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jCkBAIC00Nyw2ICs0Nyw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc21zZ19saXN0X2xvY2spOwogc3RhdGljIExJU1RfSEVBRChzbXNnX2xpc3QpOworc3RhdGljIGludCBpdWN2X3BhdGhfY29ubmVjdGVkOwogCiBzdGF0aWMgaW50IHNtc2dfcGF0aF9wZW5kaW5nKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB2bWlkWzhdLCB1OCBpcHVzZXJbMTZdKTsKIHN0YXRpYyB2b2lkIHNtc2dfbWVzc2FnZV9wZW5kaW5nKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKQEAgLTE0Miw4ICsxNDMsMTAgQEAKICNpZmRlZiBDT05GSUdfUE1fREVCVUcKIAlwcmludGsoS0VSTl9XQVJOSU5HICJzbXNnX3BtX2ZyZWV6ZVxuIik7CiAjZW5kaWYKLQlpZiAoc21zZ19wYXRoKQorCWlmIChzbXNnX3BhdGggJiYgaXVjdl9wYXRoX2Nvbm5lY3RlZCkgewogCQlpdWN2X3BhdGhfc2V2ZXIoc21zZ19wYXRoLCBOVUxMKTsKKwkJaXVjdl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNTQsNyArMTU3LDcgQEAKICNpZmRlZiBDT05GSUdfUE1fREVCVUcKIAlwcmludGsoS0VSTl9XQVJOSU5HICJzbXNnX3BtX3Jlc3RvcmVfdGhhd1xuIik7CiAjZW5kaWYKLQlpZiAoc21zZ19wYXRoKSB7CisJaWYgKHNtc2dfcGF0aCAmJiBpdWN2X3BhdGhfY29ubmVjdGVkKSB7CiAJCW1lbXNldChzbXNnX3BhdGgsIDAsIHNpemVvZigqc21zZ19wYXRoKSk7CiAJCXNtc2dfcGF0aC0+bXNnbGltID0gMjU1OwogCQlzbXNnX3BhdGgtPmZsYWdzID0gMDsKQEAgLTE2NSw2ICsxNjgsOCBAQAogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIml1Y3ZfcGF0aF9jb25uZWN0IHJldHVybmVkIHdpdGggcmMgJWlcbiIsIHJjKTsKICNlbmRpZgorCQlpZiAoIXJjKQorCQkJaXVjdl9wYXRoX2Nvbm5lY3RlZCA9IDE7CiAJCWNwY21kKCJTRVQgU01TRyBJVUNWIiwgTlVMTCwgMCwgTlVMTCk7CiAJfQogCXJldHVybiAwOwpAQCAtMjE0LDYgKzIxOSw4IEBACiAJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9mcmVlX3BhdGg7CisJZWxzZQorCQlpdWN2X3BhdGhfY29ubmVjdGVkID0gMTsKIAlzbXNnX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNtc2dfZGV2KSB7CiAJCXJjID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCmluZGV4IGUzMzFkZjIuLjk2ZmExZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYwpAQCAtOTgsMTMgKzk4LDExIEBACiAJdTY0IHd3cG4sIGx1bjsKIAogCS8qIGR1cGxpY2F0ZSBkZXZzdHIgYW5kIGtlZXAgdGhlIG9yaWdpbmFsIGZvciBzeXNmcyBwcmVzZW50YXRpb24qLwotCXN0cl9zYXZlZCA9IGttYWxsb2Moc3RybGVuKGRldnN0cikgKyAxLCBHRlBfS0VSTkVMKTsKKwlzdHJfc2F2ZWQgPSBrc3RyZHVwKGRldnN0ciwgR0ZQX0tFUk5FTCk7CiAJc3RyID0gc3RyX3NhdmVkOwogCWlmICghc3RyKQogCQlyZXR1cm47CiAKLQlzdHJjcHkoc3RyLCBkZXZzdHIpOwotCiAJdG9rZW4gPSBzdHJzZXAoJnN0ciwgIiwiKTsKIAlpZiAoIXRva2VuIHx8IHN0cmxlbih0b2tlbikgPj0gWkZDUF9CVVNfSURfU0laRSkKIAkJZ290byBlcnJfb3V0OwpAQCAtMzE0LDcgKzMxMiw3IEBACiAJfQogCXJldHZhbCA9IC1FSU5WQUw7CiAKLQlJTklUX1dPUksoJnVuaXQtPnNjc2lfd29yaywgemZjcF9zY3NpX3NjYW4pOworCUlOSVRfV09SSygmdW5pdC0+c2NzaV93b3JrLCB6ZmNwX3Njc2lfc2Nhbl93b3JrKTsKIAogCXNwaW5fbG9ja19pbml0KCZ1bml0LT5sYXRlbmNpZXMubG9jayk7CiAJdW5pdC0+bGF0ZW5jaWVzLndyaXRlLmNoYW5uZWwubWluID0gMHhGRkZGRkZGRjsKQEAgLTUyNiw2ICs1MjQsMTAgQEAKIAlyd2xvY2tfaW5pdCgmYWRhcHRlci0+cG9ydF9saXN0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5wb3J0X2xpc3QpOwogCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmV2ZW50cy5saXN0KTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPmV2ZW50cy53b3JrLCB6ZmNwX2ZjX3Bvc3RfZXZlbnQpOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5ldmVudHMubGlzdF9sb2NrKTsKKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPmVycF9yZWFkeV93cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+ZXJwX2RvbmVfd3FoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jZmRjLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYwppbmRleCAxYTJkYjBhLi5mY2JkMmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYwpAQCAtMTg5LDE4ICsxODksMTIgQEAKIAlpZiAoIWZzZl9jZmRjKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgemZjcF9jZmRjX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwlkYXRhID0gbWVtZHVwX3VzZXIoZGF0YV91c2VyLCBzaXplb2YoKmRhdGFfdXNlcikpOworCWlmIChJU19FUlIoZGF0YSkpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihkYXRhKTsKIAkJZ290byBub19tZW1fc2Vuc2U7CiAJfQogCi0JcmV0dmFsID0gY29weV9mcm9tX3VzZXIoZGF0YSwgZGF0YV91c2VyLCBzaXplb2YoKmRhdGEpKTsKLQlpZiAocmV0dmFsKSB7Ci0JCXJldHZhbCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZnJlZV9idWZmZXI7Ci0JfQotCiAJaWYgKGRhdGEtPnNpZ25hdHVyZSAhPSAweENGRENBQ0RGKSB7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZnJlZV9idWZmZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYwppbmRleCAwNzU4NTJmLi5hODYxMTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKQEAgLTE1NSw2ICsxNTUsOCBAQAogCQlpZiAoc2NzaV9jbW5kKSB7CiAJCQlyZXNwb25zZS0+dS5mY3AuY21uZCA9ICh1bnNpZ25lZCBsb25nKXNjc2lfY21uZDsKIAkJCXJlc3BvbnNlLT51LmZjcC5zZXJpYWwgPSBzY3NpX2NtbmQtPnNlcmlhbF9udW1iZXI7CisJCQlyZXNwb25zZS0+dS5mY3AuZGF0YV9kaXIgPQorCQkJCXF0Y2ItPmJvdHRvbS5pby5kYXRhX2RpcmVjdGlvbjsKIAkJfQogCQlicmVhazsKIApAQCAtMzI2LDYgKzMyOCw3IEBACiAJY2FzZSBGU0ZfUVRDQl9GQ1BfQ01ORDoKIAkJaWYgKHItPmZzZl9yZXFfc3RhdHVzICYgWkZDUF9TVEFUVVNfRlNGUkVRX1RBU0tfTUFOQUdFTUVOVCkKIAkJCWJyZWFrOworCQl6ZmNwX2RiZl9vdXQocCwgImRhdGFfZGlyZWN0aW9uIiwgIjB4JTA0eCIsIHItPnUuZmNwLmRhdGFfZGlyKTsKIAkJemZjcF9kYmZfb3V0KHAsICJzY3NpX2NtbmQiLCAiMHglMEx4Iiwgci0+dS5mY3AuY21uZCk7CiAJCXpmY3BfZGJmX291dChwLCAic2NzaV9zZXJpYWwiLCAiMHglMDE2THgiLCByLT51LmZjcC5zZXJpYWwpOwogCQkqcCArPSBzcHJpbnRmKCpwLCAiXG4iKTsKQEAgLTEwMDUsNyArMTAwOCw3IEBACiAJY2hhciBkYmZfbmFtZVtERUJVR19NQVhfTkFNRV9MRU5dOwogCXN0cnVjdCB6ZmNwX2RiZiAqZGJmOwogCi0JZGJmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpmY3BfZGJmKSwgR0ZQX0tFUk5FTCk7CisJZGJmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpmY3BfZGJmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYmYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaAppbmRleCA0NTdlMDQ2Li4yYmNjMzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmgKQEAgLTExMSw2ICsxMTEsNyBAQAogCQlzdHJ1Y3QgewogCQkJdTY0IGNtbmQ7CiAJCQl1NjQgc2VyaWFsOworCQkJdTMyIGRhdGFfZGlyOwogCQl9IGZjcDsKIAkJc3RydWN0IHsKIAkJCXU2NCB3d3BuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKaW5kZXggOWZhMWIwNi4uZTFjNmI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9zeXNpbmZvLmg+CiAjaW5jbHVkZSAiemZjcF9mc2YuaCIKKyNpbmNsdWRlICJ6ZmNwX2ZjLmgiCiAjaW5jbHVkZSAiemZjcF9xZGlvLmgiCiAKIHN0cnVjdCB6ZmNwX3JlcWxpc3Q7CkBAIC03MiwxMCArNzMsMTIgQEAKIAogLyogYWRhcHRlciBzdGF0dXMgKi8KICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9RRElPVVAJCTB4MDAwMDAwMDIKKyNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9TSU9TTF9JU1NVRUQJMHgwMDAwMDAwNAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX1hDT05GSUdfT0sJCTB4MDAwMDAwMDgKICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9IT1NUX0NPTl9JTklUCTB4MDAwMDAwMTAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9FUlBfUEVORElORwkJMHgwMDAwMDEwMAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX0xJTktfVU5QTFVHR0VECTB4MDAwMDAyMDAKKyNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9EQVRBX0RJVl9FTkFCTEVECTB4MDAwMDA0MDAKIAogLyogcmVtb3RlIHBvcnQgc3RhdHVzICovCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX1BPUlRfUEhZU19PUEVOCQkweDAwMDAwMDAxCkBAIC0xOTAsNiArMTkzLDcgQEAKIAlzdHJ1Y3Qgc2VydmljZV9sZXZlbAlzZXJ2aWNlX2xldmVsOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp3b3JrX3F1ZXVlOwogCXN0cnVjdCBkZXZpY2VfZG1hX3BhcmFtZXRlcnMgZG1hX3Bhcm1zOworCXN0cnVjdCB6ZmNwX2ZjX2V2ZW50cyBldmVudHM7CiB9OwogCiBzdHJ1Y3QgemZjcF9wb3J0IHsKQEAgLTIxMiw2ICsyMTYsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgdGVzdF9saW5rX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0ICAgICBycG9ydF93b3JrOwogCWVudW0geyBSUE9SVF9OT05FLCBSUE9SVF9BREQsIFJQT1JUX0RFTCB9ICBycG9ydF90YXNrOworCXVuc2lnbmVkIGludAkJc3RhcmdldF9pZDsKIH07CiAKIHN0cnVjdCB6ZmNwX3VuaXQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKaW5kZXggZTNkYmVkYS4uMTYwYjQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCkBAIC0xNDEsOSArMTQxLDEzIEBACiAJCWlmICghKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX1VOQkxPQ0tFRCkpCiAJCQluZWVkID0gWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9QT1JUOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIFpGQ1BfRVJQX0FDVElPTl9SRU9QRU5fUE9SVDoKIAljYXNlIFpGQ1BfRVJQX0FDVElPTl9SRU9QRU5fUE9SVF9GT1JDRUQ6CiAJCXBfc3RhdHVzID0gYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cyk7CisJCWlmICghKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4pKQorCQkJbmVlZCA9IFpGQ1BfRVJQX0FDVElPTl9SRU9QRU5fUE9SVDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX1BPUlQ6CisJCXBfc3RhdHVzID0gYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cyk7CiAJCWlmIChwX3N0YXR1cyAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfSU5VU0UpCiAJCQlyZXR1cm4gMDsKIAkJYV9zdGF0dXMgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKTsKQEAgLTcxNCw2ICs3MTgsMTQgQEAKIAlpZiAoemZjcF9lcnBfYWRhcHRlcl9zdHJhdGVneV9vcGVuX2ZzZl94cG9ydChhY3QpID09IFpGQ1BfRVJQX0ZBSUxFRCkKIAkJcmV0dXJuIFpGQ1BfRVJQX0ZBSUxFRDsKIAorCWlmIChtZW1wb29sX3Jlc2l6ZShhY3QtPmFkYXB0ZXItPnBvb2wuc3RhdHVzX3JlYWRfZGF0YSwKKwkJCSAgIGFjdC0+YWRhcHRlci0+c3RhdF9yZWFkX2J1Zl9udW0sIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gWkZDUF9FUlBfRkFJTEVEOworCisJaWYgKG1lbXBvb2xfcmVzaXplKGFjdC0+YWRhcHRlci0+cG9vbC5zdGF0dXNfcmVhZF9yZXEsCisJCQkgICBhY3QtPmFkYXB0ZXItPnN0YXRfcmVhZF9idWZfbnVtLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIFpGQ1BfRVJQX0ZBSUxFRDsKKwogCWF0b21pY19zZXQoJmFjdC0+YWRhcHRlci0+c3RhdF9taXNzLCBhY3QtPmFkYXB0ZXItPnN0YXRfcmVhZF9idWZfbnVtKTsKIAlpZiAoemZjcF9zdGF0dXNfcmVhZF9yZWZpbGwoYWN0LT5hZGFwdGVyKSkKIAkJcmV0dXJuIFpGQ1BfRVJQX0ZBSUxFRDsKQEAgLTg4NSw4ICs4OTcsNyBAQAogCQl9CiAJCWlmIChwb3J0LT5kX2lkICYmICEocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19DT01NT05fTk9FU0MpKSB7CiAJCQlwb3J0LT5kX2lkID0gMDsKLQkJCV96ZmNwX2VycF9wb3J0X3Jlb3Blbihwb3J0LCAwLCAiZXJwc29jMSIsIE5VTEwpOwotCQkJcmV0dXJuIFpGQ1BfRVJQX0VYSVQ7CisJCQlyZXR1cm4gWkZDUF9FUlBfRkFJTEVEOwogCQl9CiAJCS8qIGZhbGwgdGhyb3VnaCBvdGhlcndpc2UgKi8KIAl9CkBAIC0xMTgwLDE5ICsxMTkxLDE0IEBACiAKIAlzd2l0Y2ggKGFjdC0+YWN0aW9uKSB7CiAJY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX1VOSVQ6Ci0JCWlmICgocmVzdWx0ID09IFpGQ1BfRVJQX1NVQ0NFRURFRCkgJiYgIXVuaXQtPmRldmljZSkgewotCQkJZ2V0X2RldmljZSgmdW5pdC0+ZGV2KTsKLQkJCWlmIChzY3NpX3F1ZXVlX3dvcmsodW5pdC0+cG9ydC0+YWRhcHRlci0+c2NzaV9ob3N0LAotCQkJCQkgICAgJnVuaXQtPnNjc2lfd29yaykgPD0gMCkKLQkJCQlwdXRfZGV2aWNlKCZ1bml0LT5kZXYpOwotCQl9CiAJCXB1dF9kZXZpY2UoJnVuaXQtPmRldik7CiAJCWJyZWFrOwogCi0JY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX1BPUlRfRk9SQ0VEOgogCWNhc2UgWkZDUF9FUlBfQUNUSU9OX1JFT1BFTl9QT1JUOgogCQlpZiAocmVzdWx0ID09IFpGQ1BfRVJQX1NVQ0NFRURFRCkKIAkJCXpmY3Bfc2NzaV9zY2hlZHVsZV9ycG9ydF9yZWdpc3Rlcihwb3J0KTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBaRkNQX0VSUF9BQ1RJT05fUkVPUEVOX1BPUlRfRk9SQ0VEOgogCQlwdXRfZGV2aWNlKCZwb3J0LT5kZXYpOwogCQlicmVhazsKIApAQCAtMTIzOSw2ICsxMjQ1LDExIEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAorCWlmIChlcnBfYWN0aW9uLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19FUlBfVElNRURPVVQpIHsKKwkJcmV0dmFsID0gWkZDUF9FUlBfRkFJTEVEOworCQlnb3RvIGNoZWNrX3RhcmdldDsKKwl9CisKIAl6ZmNwX2VycF9hY3Rpb25fdG9fcnVubmluZyhlcnBfYWN0aW9uKTsKIAogCS8qIG5vIGxvY2sgdG8gYWxsb3cgZm9yIGJsb2NraW5nIG9wZXJhdGlvbnMgKi8KQEAgLTEyNzEsNiArMTI4Miw3IEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAorY2hlY2tfdGFyZ2V0OgogCXJldHZhbCA9IHpmY3BfZXJwX3N0cmF0ZWd5X2NoZWNrX3RhcmdldChlcnBfYWN0aW9uLCByZXR2YWwpOwogCXpmY3BfZXJwX2FjdGlvbl9kZXF1ZXVlKGVycF9hY3Rpb24pOwogCXJldHZhbCA9IHpmY3BfZXJwX3N0cmF0ZWd5X3N0YXRlY2hhbmdlKGVycF9hY3Rpb24sIHJldHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaAppbmRleCA0OGE4ZjkzLi4zYjkzMjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmgKQEAgLTk2LDYgKzk2LDkgQEAKIGV4dGVybiB2b2lkIHpmY3BfZXJwX3RpbWVvdXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKIAogLyogemZjcF9mYy5jICovCitleHRlcm4gdm9pZCB6ZmNwX2ZjX2VucXVldWVfZXZlbnQoc3RydWN0IHpmY3BfYWRhcHRlciAqLAorCQkJCWVudW0gZmNfaG9zdF9ldmVudF9jb2RlIGV2ZW50X2NvZGUsIHUzMik7CitleHRlcm4gdm9pZCB6ZmNwX2ZjX3Bvc3RfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgemZjcF9mY19zY2FuX3BvcnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZmNfaW5jb21pbmdfZWxzKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2ZjX3BvcnRfZGlkX2xvb2t1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CkBAIC0xNDYsOSArMTQ5LDEwIEBACiBleHRlcm4gaW50IHpmY3BfcWRpb19zYmFsX2dldChzdHJ1Y3QgemZjcF9xZGlvICopOwogZXh0ZXJuIGludCB6ZmNwX3FkaW9fc2VuZChzdHJ1Y3QgemZjcF9xZGlvICosIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICopOwogZXh0ZXJuIGludCB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhzdHJ1Y3QgemZjcF9xZGlvICosIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICosCi0JCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCk7CisJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICopOwogZXh0ZXJuIGludCB6ZmNwX3FkaW9fb3BlbihzdHJ1Y3QgemZjcF9xZGlvICopOwogZXh0ZXJuIHZvaWQgemZjcF9xZGlvX2Nsb3NlKHN0cnVjdCB6ZmNwX3FkaW8gKik7CitleHRlcm4gdm9pZCB6ZmNwX3FkaW9fc2lvc2woc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKIAogLyogemZjcF9zY3NpLmMgKi8KIGV4dGVybiBzdHJ1Y3QgemZjcF9kYXRhIHpmY3BfZGF0YTsKQEAgLTE1OSw3ICsxNjMsMTAgQEAKIGV4dGVybiB2b2lkIHpmY3Bfc2NzaV9zY2hlZHVsZV9ycG9ydF9yZWdpc3RlcihzdHJ1Y3QgemZjcF9wb3J0ICopOwogZXh0ZXJuIHZvaWQgemZjcF9zY3NpX3NjaGVkdWxlX3Jwb3J0X2Jsb2NrKHN0cnVjdCB6ZmNwX3BvcnQgKik7CiBleHRlcm4gdm9pZCB6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRzX2Jsb2NrKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7Ci1leHRlcm4gdm9pZCB6ZmNwX3Njc2lfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCB6ZmNwX3Njc2lfc2NhbihzdHJ1Y3QgemZjcF91bml0ICopOworZXh0ZXJuIHZvaWQgemZjcF9zY3NpX3NjYW5fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCB6ZmNwX3Njc2lfc2V0X3Byb3Qoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKK2V4dGVybiB2b2lkIHpmY3Bfc2NzaV9kaWZfc2Vuc2VfZXJyb3Ioc3RydWN0IHNjc2lfY21uZCAqLCBpbnQpOwogCiAvKiB6ZmNwX3N5c2ZzLmMgKi8KIGV4dGVybiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHpmY3Bfc3lzZnNfdW5pdF9hdHRyczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuYwppbmRleCA2ZjhhYjQzLi42ZjNlZDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jCkBAIC0yMyw2ICsyMyw1OCBAQAogCVtFTFNfQUREUl9GTVRfRkFCXQkJPSAweDAwMDAwMCwKIH07CiAKKy8qKgorICogemZjcF9mY19wb3N0X2V2ZW50IC0gcG9zdCBldmVudCB0byB1c2Vyc3BhY2UgdmlhIGZjX3RyYW5zcG9ydAorICogQHdvcms6IHdvcmsgc3RydWN0IHdpdGggZW5xdWV1ZWQgZXZlbnRzCisgKi8KK3ZvaWQgemZjcF9mY19wb3N0X2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgemZjcF9mY19ldmVudCAqZXZlbnQgPSBOVUxMLCAqdG1wID0gTlVMTDsKKwlMSVNUX0hFQUQodG1wX2xoKTsKKwlzdHJ1Y3QgemZjcF9mY19ldmVudHMgKmV2ZW50cyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQlzdHJ1Y3QgemZjcF9mY19ldmVudHMsIHdvcmspOworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2YoZXZlbnRzLCBzdHJ1Y3QgemZjcF9hZGFwdGVyLAorCQkJCQkJZXZlbnRzKTsKKworCXNwaW5fbG9ja19iaCgmZXZlbnRzLT5saXN0X2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJmV2ZW50cy0+bGlzdCwgJnRtcF9saCk7CisJc3Bpbl91bmxvY2tfYmgoJmV2ZW50cy0+bGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldmVudCwgdG1wLCAmdG1wX2xoLCBsaXN0KSB7CisJCWZjX2hvc3RfcG9zdF9ldmVudChhZGFwdGVyLT5zY3NpX2hvc3QsIGZjX2dldF9ldmVudF9udW1iZXIoKSwKKwkJCQlldmVudC0+Y29kZSwgZXZlbnQtPmRhdGEpOworCQlsaXN0X2RlbCgmZXZlbnQtPmxpc3QpOworCQlrZnJlZShldmVudCk7CisJfQorCit9CisKKy8qKgorICogemZjcF9mY19lbnF1ZXVlX2V2ZW50IC0gc2FmZWx5IGVucXVldWUgRkMgSEJBIEFQSSBldmVudCBmcm9tIGlycSBjb250ZXh0CisgKiBAYWRhcHRlcjogVGhlIGFkYXB0ZXIgd2hlcmUgdG8gZW5xdWV1ZSB0aGUgZXZlbnQKKyAqIEBldmVudF9jb2RlOiBUaGUgZXZlbnQgY29kZSAoYXMgZGVmaW5lZCBpbiBmY19ob3N0X2V2ZW50X2NvZGUgaW4KKyAqCQlzY3NpX3RyYW5zcG9ydF9mYy5oKQorICogQGV2ZW50X2RhdGE6IFRoZSBldmVudCBkYXRhIChlLmcuIG5fcG9ydCBwYWdlIGluIGNhc2Ugb2YgZWxzKQorICovCit2b2lkIHpmY3BfZmNfZW5xdWV1ZV9ldmVudChzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLAorCQkJZW51bSBmY19ob3N0X2V2ZW50X2NvZGUgZXZlbnRfY29kZSwgdTMyIGV2ZW50X2RhdGEpCit7CisJc3RydWN0IHpmY3BfZmNfZXZlbnQgKmV2ZW50OworCisJZXZlbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgemZjcF9mY19ldmVudCksIEdGUF9BVE9NSUMpOworCWlmICghZXZlbnQpCisJCXJldHVybjsKKworCWV2ZW50LT5jb2RlID0gZXZlbnRfY29kZTsKKwlldmVudC0+ZGF0YSA9IGV2ZW50X2RhdGE7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPmV2ZW50cy5saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmV2ZW50LT5saXN0LCAmYWRhcHRlci0+ZXZlbnRzLmxpc3QpOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5ldmVudHMubGlzdF9sb2NrKTsKKworCXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya19xdWV1ZSwgJmFkYXB0ZXItPmV2ZW50cy53b3JrKTsKK30KKwogc3RhdGljIGludCB6ZmNwX2ZjX3drYV9wb3J0X2dldChzdHJ1Y3QgemZjcF9mY193a2FfcG9ydCAqd2thX3BvcnQpCiB7CiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmd2thX3BvcnQtPm11dGV4KSkKQEAgLTE0OCw2ICsyMDAsOCBAQAogCQlhZm10ID0gcGFnZS0+cnNjbl9wYWdlX2ZsYWdzICYgRUxTX1JTQ05fQUREUl9GTVRfTUFTSzsKIAkJX3pmY3BfZmNfaW5jb21pbmdfcnNjbihmc2ZfcmVxLCB6ZmNwX2ZjX3JzY25fcmFuZ2VfbWFza1thZm10XSwKIAkJCQkgICAgICAgcGFnZSk7CisJCXpmY3BfZmNfZW5xdWV1ZV9ldmVudChmc2ZfcmVxLT5hZGFwdGVyLCBGQ0hfRVZUX1JTQ04sCisJCQkJICAgICAgKih1MzIgKilwYWdlKTsKIAl9CiAJcXVldWVfd29yayhmc2ZfcmVxLT5hZGFwdGVyLT53b3JrX3F1ZXVlLCAmZnNmX3JlcS0+YWRhcHRlci0+c2Nhbl93b3JrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuaAppbmRleCAwNzQ3YjA4Li45MzhkNTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5oCkBAIC0zMCw2ICszMCwzMCBAQAogI2RlZmluZSBaRkNQX0ZDX0NURUxTX1RNTwkoMiAqIEZDX0RFRl9SX0FfVE9WIC8gMTAwMCkKIAogLyoqCisgKiBzdHJ1Y3QgemZjcF9mY19ldmVudCAtIEZDIEhCQUFQSSBldmVudCBmb3IgaW50ZXJuYWwgcXVldWVpbmcgZnJvbSBpcnEgY29udGV4dAorICogQGNvZGU6IEV2ZW50IGNvZGUKKyAqIEBkYXRhOiBFdmVudCBkYXRhCisgKiBAbGlzdDogbGlzdF9oZWFkIGZvciB6ZmNwX2ZjX2V2ZW50cyBsaXN0CisgKi8KK3N0cnVjdCB6ZmNwX2ZjX2V2ZW50IHsKKwllbnVtIGZjX2hvc3RfZXZlbnRfY29kZSBjb2RlOworCXUzMiBkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHpmY3BfZmNfZXZlbnRzIC0gSW5mcmFzdHJ1Y3R1cmUgZm9yIHBvc3RpbmcgRkMgZXZlbnRzIGZyb20gaXJxIGNvbnRleHQKKyAqIEBsaXN0OiBMaXN0IGZvciBxdWV1ZWluZyBvZiBldmVudHMgZnJvbSBpcnEgY29udGV4dCB0byB3b3JrcXVldWUKKyAqIEBsaXN0X2xvY2s6IExvY2sgZm9yIGV2ZW50IGxpc3QKKyAqIEB3b3JrOiB3b3JrX3N0cnVjdCBmb3IgZm9yd2FyZGluZyBldmVudHMgaW4gd29ya3F1ZXVlCisqLworc3RydWN0IHpmY3BfZmNfZXZlbnRzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3BpbmxvY2tfdCBsaXN0X2xvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Cit9OworCisvKioKICAqIHN0cnVjdCB6ZmNwX2ZjX2dpZF9wbl9yZXEgLSBjb250YWluZXIgZm9yIGN0IGhlYWRlciBwbHVzIGdpZF9wbiByZXF1ZXN0CiAgKiBAY3RfaGRyOiBGQyBHUyBjb21tb24gdHJhbnNwb3J0IGhlYWRlcgogICogQGdpZF9wbjogR0lEX1BOIHJlcXVlc3QKQEAgLTE5Niw2ICsyMjAsOSBAQAogCW1lbWNweShmY3AtPmZjX2NkYiwgc2NzaS0+Y21uZCwgc2NzaS0+Y21kX2xlbik7CiAKIAlmY3AtPmZjX2RsID0gc2NzaV9idWZmbGVuKHNjc2kpOworCisJaWYgKHNjc2lfZ2V0X3Byb3RfdHlwZShzY3NpKSA9PSBTQ1NJX1BST1RfRElGX1RZUEUxKQorCQlmY3AtPmZjX2RsICs9IGZjcC0+ZmNfZGwgLyBzY3NpLT5kZXZpY2UtPnNlY3Rvcl9zaXplICogODsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwppbmRleCA5YWM2YTZlLi45ZDFkN2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKQEAgLTIxLDYgKzIxLDcgQEAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX3JlcXVlc3RfdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKikgZGF0YTsKKwl6ZmNwX3FkaW9fc2lvc2woYWRhcHRlcik7CiAJemZjcF9lcnBfYWRhcHRlcl9yZW9wZW4oYWRhcHRlciwgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsCiAJCQkJImZzcnRoXzEiLCBOVUxMKTsKIH0KQEAgLTI3NCw2ICsyNzUsNyBAQAogCQlicmVhazsKIAljYXNlIEZTRl9TVEFUVVNfUkVBRF9MSU5LX0RPV046CiAJCXpmY3BfZnNmX3N0YXR1c19yZWFkX2xpbmtfZG93bihyZXEpOworCQl6ZmNwX2ZjX2VucXVldWVfZXZlbnQoYWRhcHRlciwgRkNIX0VWVF9MSU5LRE9XTiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1NUQVRVU19SRUFEX0xJTktfVVA6CiAJCWRldl9pbmZvKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCkBAIC0yODYsNiArMjg4LDggQEAKIAkJCQkJWkZDUF9TVEFUVVNfQURBUFRFUl9MSU5LX1VOUExVR0dFRCB8CiAJCQkJCVpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVELAogCQkJCQkiZnNzcmhfMiIsIHJlcSk7CisJCXpmY3BfZmNfZW5xdWV1ZV9ldmVudChhZGFwdGVyLCBGQ0hfRVZUX0xJTktVUCwgMCk7CisKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfU1RBVFVTX1JFQURfTk9USUZJQ0FUSU9OX0xPU1Q6CiAJCWlmIChzcl9idWYtPnN0YXR1c19zdWJ0eXBlICYgRlNGX1NUQVRVU19SRUFEX1NVQl9BQ1RfVVBEQVRFRCkKQEAgLTMyMyw2ICszMjcsNyBAQAogCQlkZXZfZXJyKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKIAkJCSJUaGUgRkNQIGFkYXB0ZXIgcmVwb3J0ZWQgYSBwcm9ibGVtICIKIAkJCSJ0aGF0IGNhbm5vdCBiZSByZWNvdmVyZWRcbiIpOworCQl6ZmNwX3FkaW9fc2lvc2wocmVxLT5hZGFwdGVyKTsKIAkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihyZXEtPmFkYXB0ZXIsIDAsICJmc2ZzcWUxIiwgcmVxKTsKIAkJYnJlYWs7CiAJfQpAQCAtNDEzLDYgKzQxOCw3IEBACiAJCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKIAkJCSIweCV4IGlzIG5vdCBhIHZhbGlkIHRyYW5zZmVyIHByb3RvY29sIHN0YXR1c1xuIiwKIAkJCXF0Y2ItPnByZWZpeC5wcm90X3N0YXR1cyk7CisJCXpmY3BfcWRpb19zaW9zbChhZGFwdGVyKTsKIAkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCAiZnNwc2VfOSIsIHJlcSk7CiAJfQogCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKQEAgLTQ5NSw4ICs1MDEsOSBAQAogCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoc2hvc3QpID0gRkNfQ09TX0NMQVNTMiB8IEZDX0NPU19DTEFTUzM7CiAKIAlhZGFwdGVyLT5oeWRyYV92ZXJzaW9uID0gYm90dG9tLT5hZGFwdGVyX3R5cGU7Ci0JYWRhcHRlci0+dGltZXJfdGlja3MgPSBib3R0b20tPnRpbWVyX2ludGVydmFsOwotCWFkYXB0ZXItPnN0YXRfcmVhZF9idWZfbnVtID0gbWF4KGJvdHRvbS0+c3RhdHVzX3JlYWRfYnVmX251bSwgKHUxNikxNik7CisJYWRhcHRlci0+dGltZXJfdGlja3MgPSBib3R0b20tPnRpbWVyX2ludGVydmFsICYgWkZDUF9GU0ZfVElNRVJfSU5UX01BU0s7CisJYWRhcHRlci0+c3RhdF9yZWFkX2J1Zl9udW0gPSBtYXgoYm90dG9tLT5zdGF0dXNfcmVhZF9idWZfbnVtLAorCQkJCQkgKHUxNilGU0ZfU1RBVFVTX1JFQURTX1JFQ09NKTsKIAogCWlmIChmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID09IC0xKQogCQlmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID0gZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpOwpAQCAtNTIyLDYgKzUyOSw4IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCXpmY3Bfc2NzaV9zZXRfcHJvdChhZGFwdGVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC03MTksMTEgKzcyOCw2IEBACiAJemZjcF9xZGlvX3JlcV9pbml0KGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLCByZXEtPnJlcV9pZCwgc2J0eXBlLAogCQkJICAgcmVxLT5xdGNiLCBzaXplb2Yoc3RydWN0IGZzZl9xdGNiKSk7CiAKLQlpZiAoIShhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQKSkgewotCQl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwotCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKLQl9Ci0KIAlyZXR1cm4gcmVxOwogfQogCkBAIC03MzYsNyArNzQwLDcgQEAKIAogCXpmY3BfcmVxbGlzdF9hZGQoYWRhcHRlci0+cmVxX2xpc3QsIHJlcSk7CiAKLQlyZXEtPnFkaW9fcmVxLnFkaW9fb3V0Yl91c2FnZSA9IGF0b21pY19yZWFkKCZxZGlvLT5yZXFfcS5jb3VudCk7CisJcmVxLT5xZGlvX3JlcS5xZGlvX291dGJfdXNhZ2UgPSBhdG9taWNfcmVhZCgmcWRpby0+cmVxX3FfZnJlZSk7CiAJcmVxLT5pc3N1ZWQgPSBnZXRfY2xvY2soKTsKIAlpZiAoemZjcF9xZGlvX3NlbmQocWRpbywgJnJlcS0+cWRpb19yZXEpKSB7CiAJCWRlbF90aW1lcigmcmVxLT50aW1lcik7CkBAIC05NjMsOCArOTY3LDcgQEAKIAogc3RhdGljIGludCB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfc2JhbHMoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxLAogCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3JlcSwKLQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19yZXNwLAotCQkJCSAgICAgICBpbnQgbWF4X3NiYWxzKQorCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3Jlc3ApCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHJlcS0+YWRhcHRlcjsKIAl1MzIgZmVhdCA9IGFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXM7CkBAIC05ODEsMjQgKzk4NCwyNSBAQAogCX0KIAogCS8qIHVzZSBzaW5nbGUsIHVuY2hhaW5lZCBTQkFMIGlmIGl0IGNhbiBob2xkIHRoZSByZXF1ZXN0ICovCi0JaWYgKHpmY3BfcWRpb19zZ19vbmVfc2JhbGUoc2dfcmVxKSB8fCB6ZmNwX3FkaW9fc2dfb25lX3NiYWxlKHNnX3Jlc3ApKSB7CisJaWYgKHpmY3BfcWRpb19zZ19vbmVfc2JhbGUoc2dfcmVxKSAmJiB6ZmNwX3FkaW9fc2dfb25lX3NiYWxlKHNnX3Jlc3ApKSB7CiAJCXpmY3BfZnNmX3NldHVwX2N0X2Vsc191bmNoYWluZWQoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEsCiAJCQkJCQlzZ19yZXEsIHNnX3Jlc3ApOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLAotCQkJCQlzZ19yZXEsIG1heF9zYmFscyk7CisJYnl0ZXMgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhhZGFwdGVyLT5xZGlvLCAmcmVxLT5xZGlvX3JlcSwgc2dfcmVxKTsKIAlpZiAoYnl0ZXMgPD0gMCkKIAkJcmV0dXJuIC1FSU87CisJemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxKTsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlcV9idWZfbGVuZ3RoID0gYnl0ZXM7CiAJemZjcF9xZGlvX3NraXBfdG9fbGFzdF9zYmFsZSgmcmVxLT5xZGlvX3JlcSk7CiAKIAlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLAotCQkJCQlzZ19yZXNwLCBtYXhfc2JhbHMpOworCQkJCQlzZ19yZXNwKTsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlc3BfYnVmX2xlbmd0aCA9IGJ5dGVzOwogCWlmIChieXRlcyA8PSAwKQogCQlyZXR1cm4gLUVJTzsKKwl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDA2LDExICsxMDEwLDExIEBACiBzdGF0aWMgaW50IHpmY3BfZnNmX3NldHVwX2N0X2VscyhzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEsCiAJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcmVxLAogCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3Jlc3AsCi0JCQkJIGludCBtYXhfc2JhbHMsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorCQkJCSB1bnNpZ25lZCBpbnQgdGltZW91dCkKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gemZjcF9mc2Zfc2V0dXBfY3RfZWxzX3NiYWxzKHJlcSwgc2dfcmVxLCBzZ19yZXNwLCBtYXhfc2JhbHMpOworCXJldCA9IHpmY3BfZnNmX3NldHVwX2N0X2Vsc19zYmFscyhyZXEsIHNnX3JlcSwgc2dfcmVzcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTA1MCw4ICsxMDU0LDcgQEAKIAl9CiAKIAlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfQ0xFQU5VUDsKLQlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHMocmVxLCBjdC0+cmVxLCBjdC0+cmVzcCwKLQkJCQkgICAgWkZDUF9GU0ZfTUFYX1NCQUxTX1BFUl9SRVEsIHRpbWVvdXQpOworCXJldCA9IHpmY3BfZnNmX3NldHVwX2N0X2VscyhyZXEsIGN0LT5yZXEsIGN0LT5yZXNwLCB0aW1lb3V0KTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZF9zZW5kOwogCkBAIC0xMTQ3LDcgKzExNTAsMTAgQEAKIAl9CiAKIAlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfQ0xFQU5VUDsKLQlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHMocmVxLCBlbHMtPnJlcSwgZWxzLT5yZXNwLCAyLCB0aW1lb3V0KTsKKworCXpmY3BfcWRpb19zYmFsX2xpbWl0KHFkaW8sICZyZXEtPnFkaW9fcmVxLCAyKTsKKworCXJldCA9IHpmY3BfZnNmX3NldHVwX2N0X2VscyhyZXEsIGVscy0+cmVxLCBlbHMtPnJlc3AsIHRpbWVvdXQpOwogCiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWRfc2VuZDsKQEAgLTIwMjksNyArMjAzNSw3IEBACiAJYmxrdHJjLm1hZ2ljID0gWkZDUF9CTEtfRFJWX0RBVEFfTUFHSUM7CiAJaWYgKHJlcS0+c3RhdHVzICYgWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SKQogCQlibGt0cmMuZmxhZ3MgfD0gWkZDUF9CTEtfUkVRX0VSUk9SOwotCWJsa3RyYy5pbmJfdXNhZ2UgPSByZXEtPnFkaW9fcmVxLnFkaW9faW5iX3VzYWdlOworCWJsa3RyYy5pbmJfdXNhZ2UgPSAwOwogCWJsa3RyYy5vdXRiX3VzYWdlID0gcmVxLT5xZGlvX3JlcS5xZGlvX291dGJfdXNhZ2U7CiAKIAlpZiAocmVxLT5hZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfTUVBU1VSRU1FTlRfREFUQSAmJgpAQCAtMjAzOSw5ICsyMDQ1LDEzIEBACiAJCWJsa3RyYy5mYWJyaWNfbGF0ID0gbGF0X2luLT5mYWJyaWNfbGF0ICogdGlja3M7CiAKIAkJc3dpdGNoIChyZXEtPnF0Y2ItPmJvdHRvbS5pby5kYXRhX2RpcmVjdGlvbikgeworCQljYXNlIEZTRl9EQVRBRElSX0RJRl9SRUFEX1NUUklQOgorCQljYXNlIEZTRl9EQVRBRElSX0RJRl9SRUFEX0NPTlZFUlQ6CiAJCWNhc2UgRlNGX0RBVEFESVJfUkVBRDoKIAkJCWxhdCA9ICZ1bml0LT5sYXRlbmNpZXMucmVhZDsKIAkJCWJyZWFrOworCQljYXNlIEZTRl9EQVRBRElSX0RJRl9XUklURV9JTlNFUlQ6CisJCWNhc2UgRlNGX0RBVEFESVJfRElGX1dSSVRFX0NPTlZFUlQ6CiAJCWNhc2UgRlNGX0RBVEFESVJfV1JJVEU6CiAJCQlsYXQgPSAmdW5pdC0+bGF0ZW5jaWVzLndyaXRlOwogCQkJYnJlYWs7CkBAIC0yMDgyLDYgKzIwOTIsMjEgQEAKIAkJZ290byBza2lwX2ZzZnN0YXR1czsKIAl9CiAKKwlzd2l0Y2ggKHJlcS0+cXRjYi0+aGVhZGVyLmZzZl9zdGF0dXMpIHsKKwljYXNlIEZTRl9JTkNPTlNJU1RFTlRfUFJPVF9EQVRBOgorCWNhc2UgRlNGX0lOVkFMSURfUFJPVF9QQVJNOgorCQlzZXRfaG9zdF9ieXRlKHNjcG50LCBESURfRVJST1IpOworCQlnb3RvIHNraXBfZnNmc3RhdHVzOworCWNhc2UgRlNGX0JMT0NLX0dVQVJEX0NIRUNLX0ZBSUxVUkU6CisJCXpmY3Bfc2NzaV9kaWZfc2Vuc2VfZXJyb3Ioc2NwbnQsIDB4MSk7CisJCWdvdG8gc2tpcF9mc2ZzdGF0dXM7CisJY2FzZSBGU0ZfQVBQX1RBR19DSEVDS19GQUlMVVJFOgorCQl6ZmNwX3Njc2lfZGlmX3NlbnNlX2Vycm9yKHNjcG50LCAweDIpOworCQlnb3RvIHNraXBfZnNmc3RhdHVzOworCWNhc2UgRlNGX1JFRl9UQUdfQ0hFQ0tfRkFJTFVSRToKKwkJemZjcF9zY3NpX2RpZl9zZW5zZV9lcnJvcihzY3BudCwgMHgzKTsKKwkJZ290byBza2lwX2ZzZnN0YXR1czsKKwl9CiAJZmNwX3JzcCA9IChzdHJ1Y3QgZmNwX3Jlc3Bfd2l0aF9leHQgKikgJnJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9yc3A7CiAJemZjcF9mY19ldmFsX2ZjcF9yc3AoZmNwX3JzcCwgc2NwbnQpOwogCkBAIC0yMTkxLDYgKzIyMTYsNDQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgemZjcF9mc2Zfc2V0X2RhdGFfZGlyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21uZCwgdTMyICpkYXRhX2RpcikKK3sKKwlzd2l0Y2ggKHNjc2lfZ2V0X3Byb3Rfb3Aoc2NzaV9jbW5kKSkgeworCWNhc2UgU0NTSV9QUk9UX05PUk1BTDoKKwkJc3dpdGNoIChzY3NpX2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7CisJCWNhc2UgRE1BX05PTkU6CisJCQkqZGF0YV9kaXIgPSBGU0ZfREFUQURJUl9DTU5EOworCQkJYnJlYWs7CisJCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQkJKmRhdGFfZGlyID0gRlNGX0RBVEFESVJfUkVBRDsKKwkJCWJyZWFrOworCQljYXNlIERNQV9UT19ERVZJQ0U6CisJCQkqZGF0YV9kaXIgPSBGU0ZfREFUQURJUl9XUklURTsKKwkJCWJyZWFrOworCQljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNDU0lfUFJPVF9SRUFEX1NUUklQOgorCQkqZGF0YV9kaXIgPSBGU0ZfREFUQURJUl9ESUZfUkVBRF9TVFJJUDsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX1BST1RfV1JJVEVfSU5TRVJUOgorCQkqZGF0YV9kaXIgPSBGU0ZfREFUQURJUl9ESUZfV1JJVEVfSU5TRVJUOworCQlicmVhazsKKwljYXNlIFNDU0lfUFJPVF9SRUFEX1BBU1M6CisJCSpkYXRhX2RpciA9IEZTRl9EQVRBRElSX0RJRl9SRUFEX0NPTlZFUlQ7CisJCWJyZWFrOworCWNhc2UgU0NTSV9QUk9UX1dSSVRFX1BBU1M6CisJCSpkYXRhX2RpciA9IEZTRl9EQVRBRElSX0RJRl9XUklURV9DT05WRVJUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiB6ZmNwX2ZzZl9zZW5kX2ZjcF9jb21tYW5kX3Rhc2sgLSBpbml0aWF0ZSBhbiBGQ1AgY29tbWFuZCAoZm9yIGEgU0NTSSBjb21tYW5kKQogICogQHVuaXQ6IHVuaXQgd2hlcmUgY29tbWFuZCBpcyBzZW50IHRvCkBAIC0yMjAyLDE2ICsyMjY1LDE3IEBACiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOwogCXN0cnVjdCBmY3BfY21uZCAqZmNwX2NtbmQ7CiAJdW5zaWduZWQgaW50IHNidHlwZSA9IFNCQUxfRkxBR1MwX1RZUEVfUkVBRDsKLQlpbnQgcmVhbF9ieXRlcywgcmV0dmFsID0gLUVJTzsKKwlpbnQgcmVhbF9ieXRlcywgcmV0dmFsID0gLUVJTywgZGl4X2J5dGVzID0gMDsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gdW5pdC0+cG9ydC0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gYWRhcHRlci0+cWRpbzsKKwlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX2lvICppbzsKIAogCWlmICh1bmxpa2VseSghKGF0b21pY19yZWFkKCZ1bml0LT5zdGF0dXMpICYKIAkJICAgICAgIFpGQ1BfU1RBVFVTX0NPTU1PTl9VTkJMT0NLRUQpKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXNwaW5fbG9jaygmcWRpby0+cmVxX3FfbG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZxZGlvLT5yZXFfcS5jb3VudCkgPD0gMCkgeworCWlmIChhdG9taWNfcmVhZCgmcWRpby0+cmVxX3FfZnJlZSkgPD0gMCkgewogCQlhdG9taWNfaW5jKCZxZGlvLT5yZXFfcV9mdWxsKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjIyNyw1NyArMjI5MSw0NiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlzY3NpX2NtbmQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSByZXEtPnJlcV9pZDsKKworCWlvID0gJnJlcS0+cXRjYi0+Ym90dG9tLmlvOwogCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9DTEVBTlVQOwogCXJlcS0+dW5pdCA9IHVuaXQ7CiAJcmVxLT5kYXRhID0gc2NzaV9jbW5kOwogCXJlcS0+aGFuZGxlciA9IHpmY3BfZnNmX3NlbmRfZmNwX2NvbW1hbmRfaGFuZGxlcjsKIAlyZXEtPnF0Y2ItPmhlYWRlci5sdW5faGFuZGxlID0gdW5pdC0+aGFuZGxlOwogCXJlcS0+cXRjYi0+aGVhZGVyLnBvcnRfaGFuZGxlID0gdW5pdC0+cG9ydC0+aGFuZGxlOwotCXJlcS0+cXRjYi0+Ym90dG9tLmlvLnNlcnZpY2VfY2xhc3MgPSBGU0ZfQ0xBU1NfMzsKLQlyZXEtPnF0Y2ItPmJvdHRvbS5pby5mY3BfY21uZF9sZW5ndGggPSBGQ1BfQ01ORF9MRU47CisJaW8tPnNlcnZpY2VfY2xhc3MgPSBGU0ZfQ0xBU1NfMzsKKwlpby0+ZmNwX2NtbmRfbGVuZ3RoID0gRkNQX0NNTkRfTEVOOwogCi0Jc2NzaV9jbW5kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgcmVxLT5yZXFfaWQ7Ci0KLQkvKgotCSAqIHNldCBkZXBlbmRpbmcgb24gZGF0YSBkaXJlY3Rpb246Ci0JICogICAgICBkYXRhIGRpcmVjdGlvbiBiaXRzIGluIFNCQUxFIChTQiBUeXBlKQotCSAqICAgICAgZGF0YSBkaXJlY3Rpb24gYml0cyBpbiBRVENCCi0JICovCi0Jc3dpdGNoIChzY3NpX2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7Ci0JY2FzZSBETUFfTk9ORToKLQkJcmVxLT5xdGNiLT5ib3R0b20uaW8uZGF0YV9kaXJlY3Rpb24gPSBGU0ZfREFUQURJUl9DTU5EOwotCQlicmVhazsKLQljYXNlIERNQV9GUk9NX0RFVklDRToKLQkJcmVxLT5xdGNiLT5ib3R0b20uaW8uZGF0YV9kaXJlY3Rpb24gPSBGU0ZfREFUQURJUl9SRUFEOwotCQlicmVhazsKLQljYXNlIERNQV9UT19ERVZJQ0U6Ci0JCXJlcS0+cXRjYi0+Ym90dG9tLmlvLmRhdGFfZGlyZWN0aW9uID0gRlNGX0RBVEFESVJfV1JJVEU7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6Ci0JCWdvdG8gZmFpbGVkX3Njc2lfY21uZDsKKwlpZiAoc2NzaV9nZXRfcHJvdF9vcChzY3NpX2NtbmQpICE9IFNDU0lfUFJPVF9OT1JNQUwpIHsKKwkJaW8tPmRhdGFfYmxvY2tfbGVuZ3RoID0gc2NzaV9jbW5kLT5kZXZpY2UtPnNlY3Rvcl9zaXplOworCQlpby0+cmVmX3RhZ192YWx1ZSA9IHNjc2lfZ2V0X2xiYShzY3NpX2NtbmQpICYgMHhGRkZGRkZGRjsKIAl9CiAKKwl6ZmNwX2ZzZl9zZXRfZGF0YV9kaXIoc2NzaV9jbW5kLCAmaW8tPmRhdGFfZGlyZWN0aW9uKTsKKwogCWdldF9kZXZpY2UoJnVuaXQtPmRldik7CiAKIAlmY3BfY21uZCA9IChzdHJ1Y3QgZmNwX2NtbmQgKikgJnJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9jbW5kOwogCXpmY3BfZmNfc2NzaV90b19mY3AoZmNwX2NtbmQsIHNjc2lfY21uZCk7CiAKLQlyZWFsX2J5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsCi0JCQkJCSAgICAgc2NzaV9zZ2xpc3Qoc2NzaV9jbW5kKSwKLQkJCQkJICAgICBaRkNQX0ZTRl9NQVhfU0JBTFNfUEVSX1JFUSk7Ci0JaWYgKHVubGlrZWx5KHJlYWxfYnl0ZXMgPCAwKSkgewotCQlpZiAocmVxLT5xZGlvX3JlcS5zYmFsX251bWJlciA+PSBaRkNQX0ZTRl9NQVhfU0JBTFNfUEVSX1JFUSkgewotCQkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJCSJPdmVyc2l6ZSBkYXRhIHBhY2thZ2UsIHVuaXQgMHglMDE2THggIgotCQkJCSJvbiBwb3J0IDB4JTAxNkx4IGNsb3NlZFxuIiwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPmZjcF9sdW4sCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5wb3J0LT53d3BuKTsKLQkJCXpmY3BfZXJwX3VuaXRfc2h1dGRvd24odW5pdCwgMCwgImZzc2ZjdDEiLCByZXEpOwotCQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJfQotCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CisJaWYgKHNjc2lfcHJvdF9zZ19jb3VudChzY3NpX2NtbmQpKSB7CisJCXpmY3BfcWRpb19zZXRfZGF0YV9kaXYocWRpbywgJnJlcS0+cWRpb19yZXEsCisJCQkJICAgICAgIHNjc2lfcHJvdF9zZ19jb3VudChzY3NpX2NtbmQpKTsKKwkJZGl4X2J5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsCisJCQkJCQlzY3NpX3Byb3Rfc2dsaXN0KHNjc2lfY21uZCkpOworCQlpby0+cHJvdF9kYXRhX2xlbmd0aCA9IGRpeF9ieXRlczsKIAl9CiAKKwlyZWFsX2J5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsCisJCQkJCSAgICAgc2NzaV9zZ2xpc3Qoc2NzaV9jbW5kKSk7CisKKwlpZiAodW5saWtlbHkocmVhbF9ieXRlcyA8IDApIHx8IHVubGlrZWx5KGRpeF9ieXRlcyA8IDApKQorCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CisKKwl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEpOworCiAJcmV0dmFsID0gemZjcF9mc2ZfcmVxX3NlbmQocmVxKTsKIAlpZiAodW5saWtlbHkocmV0dmFsKSkKIAkJZ290byBmYWlsZWRfc2NzaV9jbW5kOwpAQCAtMjM5NSwxMyArMjQ0OCwxMyBAQAogCWJvdHRvbS0+b3BlcmF0aW9uX3N1YnR5cGUgPSBGU0ZfQ0ZEQ19PUEVSQVRJT05fU1VCVFlQRTsKIAlib3R0b20tPm9wdGlvbiA9IGZzZl9jZmRjLT5vcHRpb247CiAKLQlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLAotCQkJCQlmc2ZfY2ZkYy0+c2csCi0JCQkJCVpGQ1BfRlNGX01BWF9TQkFMU19QRVJfUkVRKTsKKwlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLCBmc2ZfY2ZkYy0+c2cpOworCiAJaWYgKGJ5dGVzICE9IFpGQ1BfQ0ZEQ19NQVhfU0laRSkgewogCQl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwogCQlnb3RvIG91dDsKIAl9CisJemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxKTsKIAogCXpmY3BfZnNmX3N0YXJ0X3RpbWVyKHJlcSwgWkZDUF9GU0ZfUkVRVUVTVF9USU1FT1VUKTsKIAlyZXR2YWwgPSB6ZmNwX2ZzZl9yZXFfc2VuZChyZXEpOwpAQCAtMjQyMyw3ICsyNDc2LDcgQEAKIHZvaWQgemZjcF9mc2ZfcmVxaWRfY2hlY2soc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgaW50IHNiYWxfaWR4KQogewogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBxZGlvLT5hZGFwdGVyOwotCXN0cnVjdCBxZGlvX2J1ZmZlciAqc2JhbCA9IHFkaW8tPnJlc3BfcS5zYmFsW3NiYWxfaWR4XTsKKwlzdHJ1Y3QgcWRpb19idWZmZXIgKnNiYWwgPSBxZGlvLT5yZXNfcVtzYmFsX2lkeF07CiAJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXE7CiAJdW5zaWduZWQgbG9uZyByZXFfaWQ7CkBAIC0yNDM1LDE3ICsyNDg4LDE3IEBACiAJCXJlcV9pZCA9ICh1bnNpZ25lZCBsb25nKSBzYmFsZS0+YWRkcjsKIAkJZnNmX3JlcSA9IHpmY3BfcmVxbGlzdF9maW5kX3JtKGFkYXB0ZXItPnJlcV9saXN0LCByZXFfaWQpOwogCi0JCWlmICghZnNmX3JlcSkKKwkJaWYgKCFmc2ZfcmVxKSB7CiAJCQkvKgogCQkJICogVW5rbm93biByZXF1ZXN0IG1lYW5zIHRoYXQgd2UgaGF2ZSBwb3RlbnRpYWxseSBtZW1vcnkKIAkJCSAqIGNvcnJ1cHRpb24gYW5kIG11c3Qgc3RvcCB0aGUgbWFjaGluZSBpbW1lZGlhdGVseS4KIAkJCSAqLworCQkJemZjcF9xZGlvX3Npb3NsKGFkYXB0ZXIpOwogCQkJcGFuaWMoImVycm9yOiB1bmtub3duIHJlcV9pZCAoJWx4KSBvbiBhZGFwdGVyICVzLlxuIiwKIAkJCSAgICAgIHJlcV9pZCwgZGV2X25hbWUoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldikpOworCQl9CiAKIAkJZnNmX3JlcS0+cWRpb19yZXEuc2JhbF9yZXNwb25zZSA9IHNiYWxfaWR4OwotCQlmc2ZfcmVxLT5xZGlvX3JlcS5xZGlvX2luYl91c2FnZSA9Ci0JCQlhdG9taWNfcmVhZCgmcWRpby0+cmVzcF9xLmNvdW50KTsKIAkJemZjcF9mc2ZfcmVxX2NvbXBsZXRlKGZzZl9yZXEpOwogCiAJCWlmIChsaWtlbHkoc2JhbGUtPmZsYWdzICYgU0JBTF9GTEFHU19MQVNUX0VOVFJZKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCmluZGV4IDUxOTA4M2YuLmRiOGM4NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaApAQCAtODAsMTEgKzgwLDE1IEBACiAjZGVmaW5lIEZTRl9SRVFVRVNUX1NJWkVfVE9PX0xBUkdFCQkweDAwMDAwMDYxCiAjZGVmaW5lIEZTRl9SRVNQT05TRV9TSVpFX1RPT19MQVJHRQkJMHgwMDAwMDA2MgogI2RlZmluZSBGU0ZfU0JBTF9NSVNNQVRDSAkJCTB4MDAwMDAwNjMKKyNkZWZpbmUgRlNGX0lOQ09OU0lTVEVOVF9QUk9UX0RBVEEJCTB4MDAwMDAwNzAKKyNkZWZpbmUgRlNGX0lOVkFMSURfUFJPVF9QQVJNCQkJMHgwMDAwMDA3MQorI2RlZmluZSBGU0ZfQkxPQ0tfR1VBUkRfQ0hFQ0tfRkFJTFVSRQkJMHgwMDAwMDA4MQorI2RlZmluZSBGU0ZfQVBQX1RBR19DSEVDS19GQUlMVVJFCQkweDAwMDAwMDgyCisjZGVmaW5lIEZTRl9SRUZfVEFHX0NIRUNLX0ZBSUxVUkUJCTB4MDAwMDAwODMKICNkZWZpbmUgRlNGX0FEQVBURVJfU1RBVFVTX0FWQUlMQUJMRQkJMHgwMDAwMDBBRAogI2RlZmluZSBGU0ZfVU5LTk9XTl9DT01NQU5ECQkJMHgwMDAwMDBFMgogI2RlZmluZSBGU0ZfVU5LTk9XTl9PUF9TVUJUWVBFICAgICAgICAgICAgICAgICAgMHgwMDAwMDBFMwogI2RlZmluZSBGU0ZfSU5WQUxJRF9DT01NQU5EX09QVElPTiAgICAgICAgICAgICAgMHgwMDAwMDBFNQotLyogI2RlZmluZSBGU0ZfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYgICovCiAKICNkZWZpbmUgRlNGX1BST1RfU1RBVFVTX1FVQUxfU0laRQkJMTYKICNkZWZpbmUgRlNGX1NUQVRVU19RVUFMSUZJRVJfU0laRQkJMTYKQEAgLTE0NywxOCArMTUxLDE3IEBACiAjZGVmaW5lIEZTRl9EQVRBRElSX1dSSVRFCQkJMHgwMDAwMDAwMQogI2RlZmluZSBGU0ZfREFUQURJUl9SRUFECQkJMHgwMDAwMDAwMgogI2RlZmluZSBGU0ZfREFUQURJUl9DTU5ECQkJMHgwMDAwMDAwNAorI2RlZmluZSBGU0ZfREFUQURJUl9ESUZfV1JJVEVfSU5TRVJUCQkweDAwMDAwMDA5CisjZGVmaW5lIEZTRl9EQVRBRElSX0RJRl9SRUFEX1NUUklQCQkweDAwMDAwMDBhCisjZGVmaW5lIEZTRl9EQVRBRElSX0RJRl9XUklURV9DT05WRVJUCQkweDAwMDAwMDBiCisjZGVmaW5lIEZTRl9EQVRBRElSX0RJRl9SRUFEX0NPTlZFUlQJCTBYMDAwMDAwMGMKKworLyogZGF0YSBwcm90ZWN0aW9uIGNvbnRyb2wgZmxhZ3MgKi8KKyNkZWZpbmUgRlNGX0FQUF9UQUdfQ0hFQ0tfRU5BQkxFCQkweDEwCiAKIC8qIGZjIHNlcnZpY2UgY2xhc3MgKi8KICNkZWZpbmUgRlNGX0NMQVNTXzMJCQkJMHgwMDAwMDAwMwogCi0vKiBTQkFMIGNoYWluaW5nICovCi0jZGVmaW5lIFpGQ1BfRlNGX01BWF9TQkFMU19QRVJfUkVRCQkzNgotCi0vKiBtYXguIG51bWJlciBvZiAoZGF0YSBidWZmZXIpIFNCQUxFcyBpbiBsYXJnZXN0IFNCQUwgY2hhaW4KLSAqIHJlcXVlc3QgSUQgKyBRVENCIGluIFNCQUxFIDAgKyAxIG9mIGZpcnN0IFNCQUwgaW4gY2hhaW4gICAqLwotI2RlZmluZSBaRkNQX0ZTRl9NQVhfU0JBTEVTX1BFUl9SRVEJXAotCShaRkNQX0ZTRl9NQVhfU0JBTFNfUEVSX1JFUSAqIFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9TQkFMIC0gMikKLQogLyogbG9nZ2luZyBzcGFjZSBiZWhpbmQgUVRDQiAqLwogI2RlZmluZSBGU0ZfUVRDQl9MT0dfU0laRQkJCTEwMjQKIApAQCAtMTcwLDYgKzE3Myw4IEBACiAjZGVmaW5lIEZTRl9GRUFUVVJFX0VMU19DVF9DSEFJTkVEX1NCQUxTCTB4MDAwMDAwMjAKICNkZWZpbmUgRlNGX0ZFQVRVUkVfVVBEQVRFX0FMRVJUCQkweDAwMDAwMTAwCiAjZGVmaW5lIEZTRl9GRUFUVVJFX01FQVNVUkVNRU5UX0RBVEEJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRlNGX0ZFQVRVUkVfRElGX1BST1RfVFlQRTEJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRlNGX0ZFQVRVUkVfRElYX1BST1RfVENQSVAJCTB4MDAwMjAwMDAKIAogLyogaG9zdCBjb25uZWN0aW9uIGZlYXR1cmVzICovCiAjZGVmaW5lIEZTRl9GRUFUVVJFX05QSVZfTU9ERQkJCTB4MDAwMDAwMDEKQEAgLTMyNCw5ICszMjksMTQgQEAKIHN0cnVjdCBmc2ZfcXRjYl9ib3R0b21faW8gewogCXUzMiBkYXRhX2RpcmVjdGlvbjsKIAl1MzIgc2VydmljZV9jbGFzczsKLQl1OCAgcmVzMVs4XTsKKwl1OCAgcmVzMTsKKwl1OCAgZGF0YV9wcm90X2ZsYWdzOworCXUxNiBhcHBfdGFnX3ZhbHVlOworCXUzMiByZWZfdGFnX3ZhbHVlOwogCXUzMiBmY3BfY21uZF9sZW5ndGg7Ci0JdTggIHJlczJbMTJdOworCXUzMiBkYXRhX2Jsb2NrX2xlbmd0aDsKKwl1MzIgcHJvdF9kYXRhX2xlbmd0aDsKKwl1OCAgcmVzMls0XTsKIAl1OCAgZmNwX2NtbmRbRlNGX0ZDUF9DTU5EX1NJWkVdOwogCXU4ICBmY3BfcnNwW0ZTRl9GQ1BfUlNQX1NJWkVdOwogCXU4ICByZXMzWzY0XTsKQEAgLTM1Miw2ICszNjIsOCBAQAogCXU4ICBlbHNbMjU2XTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisjZGVmaW5lIFpGQ1BfRlNGX1RJTUVSX0lOVF9NQVNLCTB4M0ZGRgorCiBzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX2NvbmZpZyB7CiAJdTMyIGxpY192ZXJzaW9uOwogCXUzMiBmZWF0dXJlX3NlbGVjdGlvbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKaW5kZXggMjgxMTdlMS4uYjI2MzU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKQEAgLTMwLDEyICszMCwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB6ZmNwX3FkaW9faGFuZGxlcl9lcnJvcihzdHJ1Y3QgemZjcF9xZGlvICpxZGlvLCBjaGFyICppZCkKK3N0YXRpYyB2b2lkIHpmY3BfcWRpb19oYW5kbGVyX2Vycm9yKHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sIGNoYXIgKmlkLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcWRpb19lcnIpCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHFkaW8tPmFkYXB0ZXI7CiAKIAlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAiQSBRRElPIHByb2JsZW0gb2NjdXJyZWRcbiIpOwogCisJaWYgKHFkaW9fZXJyICYgUURJT19FUlJPUl9TTFNCX1NUQVRFKQorCQl6ZmNwX3FkaW9fc2lvc2woYWRhcHRlcik7CiAJemZjcF9lcnBfYWRhcHRlcl9yZW9wZW4oYWRhcHRlciwKIAkJCQlaRkNQX1NUQVRVU19BREFQVEVSX0xJTktfVU5QTFVHR0VEIHwKIAkJCQlaRkNQX1NUQVRVU19DT01NT05fRVJQX0ZBSUxFRCwgaWQsIE5VTEwpOwpAQCAtNTUsNzIgKzU4LDQ3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgemZjcF9xZGlvX2FjY291bnQoc3RydWN0IHpmY3BfcWRpbyAqcWRpbykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbm93LCBzcGFuOwotCWludCBmcmVlLCB1c2VkOworCWludCB1c2VkOwogCiAJc3Bpbl9sb2NrKCZxZGlvLT5zdGF0X2xvY2spOwogCW5vdyA9IGdldF9jbG9ja19tb25vdG9uaWMoKTsKIAlzcGFuID0gKG5vdyAtIHFkaW8tPnJlcV9xX3RpbWUpID4+IDEyOwotCWZyZWUgPSBhdG9taWNfcmVhZCgmcWRpby0+cmVxX3EuY291bnQpOwotCXVzZWQgPSBRRElPX01BWF9CVUZGRVJTX1BFUl9RIC0gZnJlZTsKKwl1c2VkID0gUURJT19NQVhfQlVGRkVSU19QRVJfUSAtIGF0b21pY19yZWFkKCZxZGlvLT5yZXFfcV9mcmVlKTsKIAlxZGlvLT5yZXFfcV91dGlsICs9IHVzZWQgKiBzcGFuOwogCXFkaW8tPnJlcV9xX3RpbWUgPSBub3c7CiAJc3Bpbl91bmxvY2soJnFkaW8tPnN0YXRfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIHpmY3BfcWRpb19pbnRfcmVxKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBpbnQgcWRpb19lcnIsCi0JCQkgICAgICBpbnQgcXVldWVfbm8sIGludCBmaXJzdCwgaW50IGNvdW50LAorCQkJICAgICAgaW50IHF1ZXVlX25vLCBpbnQgaWR4LCBpbnQgY291bnQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHBhcm0pCiB7CiAJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IChzdHJ1Y3QgemZjcF9xZGlvICopIHBhcm07Ci0Jc3RydWN0IHpmY3BfcWRpb19xdWV1ZSAqcXVldWUgPSAmcWRpby0+cmVxX3E7CiAKIAlpZiAodW5saWtlbHkocWRpb19lcnIpKSB7Ci0JCXpmY3BfZGJmX2hiYV9xZGlvKHFkaW8tPmFkYXB0ZXItPmRiZiwgcWRpb19lcnIsIGZpcnN0LAotCQkJCQljb3VudCk7Ci0JCXpmY3BfcWRpb19oYW5kbGVyX2Vycm9yKHFkaW8sICJxZGlyZXExIik7CisJCXpmY3BfZGJmX2hiYV9xZGlvKHFkaW8tPmFkYXB0ZXItPmRiZiwgcWRpb19lcnIsIGlkeCwgY291bnQpOworCQl6ZmNwX3FkaW9faGFuZGxlcl9lcnJvcihxZGlvLCAicWRpcmVxMSIsIHFkaW9fZXJyKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGNsZWFudXAgYWxsIFNCQUxzIGJlaW5nIHByb2dyYW0tb3duZWQgbm93ICovCi0JemZjcF9xZGlvX3plcm9fc2JhbHMocXVldWUtPnNiYWwsIGZpcnN0LCBjb3VudCk7CisJemZjcF9xZGlvX3plcm9fc2JhbHMocWRpby0+cmVxX3EsIGlkeCwgY291bnQpOwogCiAJemZjcF9xZGlvX2FjY291bnQocWRpbyk7Ci0JYXRvbWljX2FkZChjb3VudCwgJnF1ZXVlLT5jb3VudCk7CisJYXRvbWljX2FkZChjb3VudCwgJnFkaW8tPnJlcV9xX2ZyZWUpOwogCXdha2VfdXAoJnFkaW8tPnJlcV9xX3dxKTsKIH0KIAotc3RhdGljIHZvaWQgemZjcF9xZGlvX3Jlc3BfcHV0X2JhY2soc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgaW50IHByb2Nlc3NlZCkKLXsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpxdWV1ZSA9ICZxZGlvLT5yZXNwX3E7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXYgPSBxZGlvLT5hZGFwdGVyLT5jY3dfZGV2aWNlOwotCXU4IGNvdW50LCBzdGFydCA9IHF1ZXVlLT5maXJzdDsKLQl1bnNpZ25lZCBpbnQgcmV0dmFsOwotCi0JY291bnQgPSBhdG9taWNfcmVhZCgmcXVldWUtPmNvdW50KSArIHByb2Nlc3NlZDsKLQotCXJldHZhbCA9IGRvX1FESU8oY2RldiwgUURJT19GTEFHX1NZTkNfSU5QVVQsIDAsIHN0YXJ0LCBjb3VudCk7Ci0KLQlpZiAodW5saWtlbHkocmV0dmFsKSkgewotCQlhdG9taWNfc2V0KCZxdWV1ZS0+Y291bnQsIGNvdW50KTsKLQkJemZjcF9lcnBfYWRhcHRlcl9yZW9wZW4ocWRpby0+YWRhcHRlciwgMCwgInFkcnBiXzEiLCBOVUxMKTsKLQl9IGVsc2UgewotCQlxdWV1ZS0+Zmlyc3QgKz0gY291bnQ7Ci0JCXF1ZXVlLT5maXJzdCAlPSBRRElPX01BWF9CVUZGRVJTX1BFUl9ROwotCQlhdG9taWNfc2V0KCZxdWV1ZS0+Y291bnQsIDApOwotCX0KLX0KLQogc3RhdGljIHZvaWQgemZjcF9xZGlvX2ludF9yZXNwKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBpbnQgcWRpb19lcnIsCi0JCQkgICAgICAgaW50IHF1ZXVlX25vLCBpbnQgZmlyc3QsIGludCBjb3VudCwKKwkJCSAgICAgICBpbnQgcXVldWVfbm8sIGludCBpZHgsIGludCBjb3VudCwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBhcm0pCiB7CiAJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IChzdHJ1Y3QgemZjcF9xZGlvICopIHBhcm07CiAJaW50IHNiYWxfaWR4LCBzYmFsX25vOwogCiAJaWYgKHVubGlrZWx5KHFkaW9fZXJyKSkgewotCQl6ZmNwX2RiZl9oYmFfcWRpbyhxZGlvLT5hZGFwdGVyLT5kYmYsIHFkaW9fZXJyLCBmaXJzdCwKLQkJCQkJY291bnQpOwotCQl6ZmNwX3FkaW9faGFuZGxlcl9lcnJvcihxZGlvLCAicWRpcmVzMSIpOworCQl6ZmNwX2RiZl9oYmFfcWRpbyhxZGlvLT5hZGFwdGVyLT5kYmYsIHFkaW9fZXJyLCBpZHgsIGNvdW50KTsKKwkJemZjcF9xZGlvX2hhbmRsZXJfZXJyb3IocWRpbywgInFkaXJlczEiLCBxZGlvX2Vycik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyOSwyNSArMTA3LDE2IEBACiAJICogcmV0dXJuZWQgYnkgUURJTyBsYXllcgogCSAqLwogCWZvciAoc2JhbF9ubyA9IDA7IHNiYWxfbm8gPCBjb3VudDsgc2JhbF9ubysrKSB7Ci0JCXNiYWxfaWR4ID0gKGZpcnN0ICsgc2JhbF9ubykgJSBRRElPX01BWF9CVUZGRVJTX1BFUl9ROworCQlzYmFsX2lkeCA9IChpZHggKyBzYmFsX25vKSAlIFFESU9fTUFYX0JVRkZFUlNfUEVSX1E7CiAJCS8qIGdvIHRocm91Z2ggYWxsIFNCQUxFcyBvZiBTQkFMICovCiAJCXpmY3BfZnNmX3JlcWlkX2NoZWNrKHFkaW8sIHNiYWxfaWR4KTsKIAl9CiAKIAkvKgotCSAqIHB1dCByYW5nZSBvZiBTQkFMcyBiYWNrIHRvIHJlc3BvbnNlIHF1ZXVlCi0JICogKGluY2x1ZGluZyBTQkFMcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlIGJlZm9yZSkKKwkgKiBwdXQgU0JBTHMgYmFjayB0byByZXNwb25zZSBxdWV1ZQogCSAqLwotCXpmY3BfcWRpb19yZXNwX3B1dF9iYWNrKHFkaW8sIGNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgemZjcF9xZGlvX3NiYWxfbGltaXQoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywKLQkJCQkgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxLCBpbnQgbWF4X3NiYWxzKQotewotCWludCBjb3VudCA9IGF0b21pY19yZWFkKCZxZGlvLT5yZXFfcS5jb3VudCk7Ci0JY291bnQgPSBtaW4oY291bnQsIG1heF9zYmFscyk7Ci0JcV9yZXEtPnNiYWxfbGltaXQgPSAocV9yZXEtPnNiYWxfZmlyc3QgKyBjb3VudCAtIDEpCi0JCQkJCSUgUURJT19NQVhfQlVGRkVSU19QRVJfUTsKKwlpZiAoZG9fUURJTyhjZGV2LCBRRElPX0ZMQUdfU1lOQ19JTlBVVCwgMCwgaWR4LCBjb3VudCkpCisJCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKHFkaW8tPmFkYXB0ZXIsIDAsICJxZGlyZXMyIiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqCkBAIC0xNzMsNiArMTQyLDcgQEAKIAogCS8qIGtlZXAgdGhpcyByZXF1ZXN0cyBudW1iZXIgb2YgU0JBTHMgdXAtdG8tZGF0ZSAqLwogCXFfcmVxLT5zYmFsX251bWJlcisrOworCUJVR19PTihxX3JlcS0+c2JhbF9udW1iZXIgPiBaRkNQX1FESU9fTUFYX1NCQUxTX1BFUl9SRVEpOwogCiAJLyogc3RhcnQgYXQgZmlyc3QgU0JBTEUgb2YgbmV3IFNCQUwgKi8KIAlxX3JlcS0+c2JhbGVfY3VyciA9IDA7CkBAIC0xOTMsMTcgKzE2Myw2IEBACiAJcmV0dXJuIHpmY3BfcWRpb19zYmFsZV9jdXJyKHFkaW8sIHFfcmVxKTsKIH0KIAotc3RhdGljIHZvaWQgemZjcF9xZGlvX3VuZG9fc2JhbHMoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywKLQkJCQkgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxKQotewotCXN0cnVjdCBxZGlvX2J1ZmZlciAqKnNiYWwgPSBxZGlvLT5yZXFfcS5zYmFsOwotCWludCBmaXJzdCA9IHFfcmVxLT5zYmFsX2ZpcnN0OwotCWludCBsYXN0ID0gcV9yZXEtPnNiYWxfbGFzdDsKLQlpbnQgY291bnQgPSAobGFzdCAtIGZpcnN0ICsgUURJT19NQVhfQlVGRkVSU19QRVJfUSkgJQotCQlRRElPX01BWF9CVUZGRVJTX1BFUl9RICsgMTsKLQl6ZmNwX3FkaW9femVyb19zYmFscyhzYmFsLCBmaXJzdCwgY291bnQpOwotfQotCiAvKioKICAqIHpmY3BfcWRpb19zYmFsc19mcm9tX3NnIC0gZmlsbCBTQkFMcyBmcm9tIHNjYXR0ZXItZ2F0aGVyIGxpc3QKICAqIEBxZGlvOiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX3FkaW8KQEAgLTIxMywxNCArMTcyLDExIEBACiAgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMsIG9yIGVycm9yIChuZWdhdGl2KQogICovCiBpbnQgemZjcF9xZGlvX3NiYWxzX2Zyb21fc2coc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxLAotCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBtYXhfc2JhbHMpCisJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKIHsKIAlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJaW50IGJ5dGVzID0gMDsKIAotCS8qIGZpZ3VyZSBvdXQgbGFzdCBhbGxvd2VkIFNCQUwgKi8KLQl6ZmNwX3FkaW9fc2JhbF9saW1pdChxZGlvLCBxX3JlcSwgbWF4X3NiYWxzKTsKLQogCS8qIHNldCBzdG9yYWdlLWJsb2NrIHR5cGUgZm9yIHRoaXMgcmVxdWVzdCAqLwogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX3JlcShxZGlvLCBxX3JlcSk7CiAJc2JhbGUtPmZsYWdzIHw9IHFfcmVxLT5zYnR5cGU7CkBAIC0yMjksNyArMTg1LDggQEAKIAkJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfbmV4dChxZGlvLCBxX3JlcSk7CiAJCWlmICghc2JhbGUpIHsKIAkJCWF0b21pY19pbmMoJnFkaW8tPnJlcV9xX2Z1bGwpOwotCQkJemZjcF9xZGlvX3VuZG9fc2JhbHMocWRpbywgcV9yZXEpOworCQkJemZjcF9xZGlvX3plcm9fc2JhbHMocWRpby0+cmVxX3EsIHFfcmVxLT5zYmFsX2ZpcnN0LAorCQkJCQkgICAgIHFfcmVxLT5zYmFsX251bWJlcik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0yMzksMTkgKzE5NiwxNCBAQAogCQlieXRlcyArPSBzZy0+bGVuZ3RoOwogCX0KIAotCS8qIGFzc3VtZSB0aGF0IG5vIG90aGVyIFNCQUxFcyBhcmUgdG8gZm9sbG93IGluIHRoZSBzYW1lIFNCQUwgKi8KLQlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9jdXJyKHFkaW8sIHFfcmVxKTsKLQlzYmFsZS0+ZmxhZ3MgfD0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOwotCiAJcmV0dXJuIGJ5dGVzOwogfQogCiBzdGF0aWMgaW50IHpmY3BfcWRpb19zYmFsX2NoZWNrKHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8pCiB7Ci0Jc3RydWN0IHpmY3BfcWRpb19xdWV1ZSAqcmVxX3EgPSAmcWRpby0+cmVxX3E7Ci0KIAlzcGluX2xvY2tfYmgoJnFkaW8tPnJlcV9xX2xvY2spOwotCWlmIChhdG9taWNfcmVhZCgmcmVxX3EtPmNvdW50KSkKKwlpZiAoYXRvbWljX3JlYWQoJnFkaW8tPnJlcV9xX2ZyZWUpIHx8CisJICAgICEoYXRvbWljX3JlYWQoJnFkaW8tPmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUCkpCiAJCXJldHVybiAxOwogCXNwaW5fdW5sb2NrX2JoKCZxZGlvLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTI3NCw4ICsyMjYsMTMgQEAKIAlzcGluX3VubG9ja19iaCgmcWRpby0+cmVxX3FfbG9jayk7CiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocWRpby0+cmVxX3Ffd3EsCiAJCQkgICAgICAgemZjcF9xZGlvX3NiYWxfY2hlY2socWRpbyksIDUgKiBIWik7CisKKwlpZiAoIShhdG9taWNfcmVhZCgmcWRpby0+YWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQKSkKKwkJcmV0dXJuIC1FSU87CisKIAlpZiAocmV0ID4gMCkKIAkJcmV0dXJuIDA7CisKIAlpZiAoIXJldCkgewogCQlhdG9taWNfaW5jKCZxZGlvLT5yZXFfcV9mdWxsKTsKIAkJLyogYXNzdW1lIGhhbmdpbmcgb3V0Ym91bmQgcXVldWUsIHRyeSBxdWV1ZSByZWNvdmVyeSAqLwpAQCAtMjk0LDI1ICsyNTEsMjUgQEAKICAqLwogaW50IHpmY3BfcWRpb19zZW5kKHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICpxX3JlcSkKIHsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpyZXFfcSA9ICZxZGlvLT5yZXFfcTsKLQlpbnQgZmlyc3QgPSBxX3JlcS0+c2JhbF9maXJzdDsKLQlpbnQgY291bnQgPSBxX3JlcS0+c2JhbF9udW1iZXI7CiAJaW50IHJldHZhbDsKLQl1bnNpZ25lZCBpbnQgcWRpb19mbGFncyA9IFFESU9fRkxBR19TWU5DX09VVFBVVDsKKwl1OCBzYmFsX251bWJlciA9IHFfcmVxLT5zYmFsX251bWJlcjsKIAogCXpmY3BfcWRpb19hY2NvdW50KHFkaW8pOwogCi0JcmV0dmFsID0gZG9fUURJTyhxZGlvLT5hZGFwdGVyLT5jY3dfZGV2aWNlLCBxZGlvX2ZsYWdzLCAwLCBmaXJzdCwKLQkJCSBjb3VudCk7CisJcmV0dmFsID0gZG9fUURJTyhxZGlvLT5hZGFwdGVyLT5jY3dfZGV2aWNlLCBRRElPX0ZMQUdfU1lOQ19PVVRQVVQsIDAsCisJCQkgcV9yZXEtPnNiYWxfZmlyc3QsIHNiYWxfbnVtYmVyKTsKKwogCWlmICh1bmxpa2VseShyZXR2YWwpKSB7Ci0JCXpmY3BfcWRpb196ZXJvX3NiYWxzKHJlcV9xLT5zYmFsLCBmaXJzdCwgY291bnQpOworCQl6ZmNwX3FkaW9femVyb19zYmFscyhxZGlvLT5yZXFfcSwgcV9yZXEtPnNiYWxfZmlyc3QsCisJCQkJICAgICBzYmFsX251bWJlcik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJLyogYWNjb3VudCBmb3IgdHJhbnNmZXJyZWQgYnVmZmVycyAqLwotCWF0b21pY19zdWIoY291bnQsICZyZXFfcS0+Y291bnQpOwotCXJlcV9xLT5maXJzdCArPSBjb3VudDsKLQlyZXFfcS0+Zmlyc3QgJT0gUURJT19NQVhfQlVGRkVSU19QRVJfUTsKKwlhdG9taWNfc3ViKHNiYWxfbnVtYmVyLCAmcWRpby0+cmVxX3FfZnJlZSk7CisJcWRpby0+cmVxX3FfaWR4ICs9IHNiYWxfbnVtYmVyOworCXFkaW8tPnJlcV9xX2lkeCAlPSBRRElPX01BWF9CVUZGRVJTX1BFUl9ROworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyNSw2ICsyODIsNyBAQAogCWlkLT5xX2Zvcm1hdCA9IFFESU9fWkZDUF9RRk1UOwogCW1lbWNweShpZC0+YWRhcHRlcl9uYW1lLCBkZXZfbmFtZSgmaWQtPmNkZXYtPmRldiksIDgpOwogCUFTQ0VCQyhpZC0+YWRhcHRlcl9uYW1lLCA4KTsKKwlpZC0+cWliX3JmbGFncyA9IFFJQl9SRkxBR1NfRU5BQkxFX0RBVEFfRElWOwogCWlkLT5xaWJfcGFyYW1fZmllbGRfZm9ybWF0ID0gMDsKIAlpZC0+cWliX3BhcmFtX2ZpZWxkID0gTlVMTDsKIAlpZC0+aW5wdXRfc2xpYl9lbGVtZW50cyA9IE5VTEw7CkBAIC0zMzQsMTAgKzI5MiwxMCBAQAogCWlkLT5pbnB1dF9oYW5kbGVyID0gemZjcF9xZGlvX2ludF9yZXNwOwogCWlkLT5vdXRwdXRfaGFuZGxlciA9IHpmY3BfcWRpb19pbnRfcmVxOwogCWlkLT5pbnRfcGFybSA9ICh1bnNpZ25lZCBsb25nKSBxZGlvOwotCWlkLT5pbnB1dF9zYmFsX2FkZHJfYXJyYXkgPSAodm9pZCAqKikgKHFkaW8tPnJlc3BfcS5zYmFsKTsKLQlpZC0+b3V0cHV0X3NiYWxfYWRkcl9hcnJheSA9ICh2b2lkICoqKSAocWRpby0+cmVxX3Euc2JhbCk7Ci0KKwlpZC0+aW5wdXRfc2JhbF9hZGRyX2FycmF5ID0gKHZvaWQgKiopIChxZGlvLT5yZXNfcSk7CisJaWQtPm91dHB1dF9zYmFsX2FkZHJfYXJyYXkgPSAodm9pZCAqKikgKHFkaW8tPnJlcV9xKTsKIH0KKwogLyoqCiAgKiB6ZmNwX3FkaW9fYWxsb2NhdGUgLSBhbGxvY2F0ZSBxdWV1ZSBtZW1vcnkgYW5kIGluaXRpYWxpemUgUURJTyBkYXRhCiAgKiBAYWRhcHRlcjogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9hZGFwdGVyCkBAIC0zNDgsOCArMzA2LDggQEAKIHsKIAlzdHJ1Y3QgcWRpb19pbml0aWFsaXplIGluaXRfZGF0YTsKIAotCWlmICh6ZmNwX3FkaW9fYnVmZmVyc19lbnF1ZXVlKHFkaW8tPnJlcV9xLnNiYWwpIHx8Ci0JICAgIHpmY3BfcWRpb19idWZmZXJzX2VucXVldWUocWRpby0+cmVzcF9xLnNiYWwpKQorCWlmICh6ZmNwX3FkaW9fYnVmZmVyc19lbnF1ZXVlKHFkaW8tPnJlcV9xKSB8fAorCSAgICB6ZmNwX3FkaW9fYnVmZmVyc19lbnF1ZXVlKHFkaW8tPnJlc19xKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl6ZmNwX3FkaW9fc2V0dXBfaW5pdF9kYXRhKCZpbml0X2RhdGEsIHFkaW8pOwpAQCAtMzYzLDMyICszMjEsMzAgQEAKICAqLwogdm9pZCB6ZmNwX3FkaW9fY2xvc2Uoc3RydWN0IHpmY3BfcWRpbyAqcWRpbykKIHsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpyZXFfcTsKLQlpbnQgZmlyc3QsIGNvdW50OworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBxZGlvLT5hZGFwdGVyOworCWludCBpZHgsIGNvdW50OwogCi0JaWYgKCEoYXRvbWljX3JlYWQoJnFkaW8tPmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUCkpCisJaWYgKCEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUCkpCiAJCXJldHVybjsKIAogCS8qIGNsZWFyIFFESU9VUCBmbGFnLCB0aHVzIGRvX1FESU8gaXMgbm90IGNhbGxlZCBkdXJpbmcgcWRpb19zaHV0ZG93biAqLwotCXJlcV9xID0gJnFkaW8tPnJlcV9xOwogCXNwaW5fbG9ja19iaCgmcWRpby0+cmVxX3FfbG9jayk7Ci0JYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9RRElPVVAsICZxZGlvLT5hZGFwdGVyLT5zdGF0dXMpOworCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQLCAmYWRhcHRlci0+c3RhdHVzKTsKIAlzcGluX3VubG9ja19iaCgmcWRpby0+cmVxX3FfbG9jayk7CiAKLQlxZGlvX3NodXRkb3duKHFkaW8tPmFkYXB0ZXItPmNjd19kZXZpY2UsCi0JCSAgICAgIFFESU9fRkxBR19DTEVBTlVQX1VTSU5HX0NMRUFSKTsKKwl3YWtlX3VwKCZxZGlvLT5yZXFfcV93cSk7CisKKwlxZGlvX3NodXRkb3duKGFkYXB0ZXItPmNjd19kZXZpY2UsIFFESU9fRkxBR19DTEVBTlVQX1VTSU5HX0NMRUFSKTsKIAogCS8qIGNsZWFudXAgdXNlZCBvdXRib3VuZCBzYmFscyAqLwotCWNvdW50ID0gYXRvbWljX3JlYWQoJnJlcV9xLT5jb3VudCk7CisJY291bnQgPSBhdG9taWNfcmVhZCgmcWRpby0+cmVxX3FfZnJlZSk7CiAJaWYgKGNvdW50IDwgUURJT19NQVhfQlVGRkVSU19QRVJfUSkgewotCQlmaXJzdCA9IChyZXFfcS0+Zmlyc3QgKyBjb3VudCkgJSBRRElPX01BWF9CVUZGRVJTX1BFUl9ROworCQlpZHggPSAocWRpby0+cmVxX3FfaWR4ICsgY291bnQpICUgUURJT19NQVhfQlVGRkVSU19QRVJfUTsKIAkJY291bnQgPSBRRElPX01BWF9CVUZGRVJTX1BFUl9RIC0gY291bnQ7Ci0JCXpmY3BfcWRpb196ZXJvX3NiYWxzKHJlcV9xLT5zYmFsLCBmaXJzdCwgY291bnQpOworCQl6ZmNwX3FkaW9femVyb19zYmFscyhxZGlvLT5yZXFfcSwgaWR4LCBjb3VudCk7CiAJfQotCXJlcV9xLT5maXJzdCA9IDA7Ci0JYXRvbWljX3NldCgmcmVxX3EtPmNvdW50LCAwKTsKLQlxZGlvLT5yZXNwX3EuZmlyc3QgPSAwOwotCWF0b21pY19zZXQoJnFkaW8tPnJlc3BfcS5jb3VudCwgMCk7CisJcWRpby0+cmVxX3FfaWR4ID0gMDsKKwlhdG9taWNfc2V0KCZxZGlvLT5yZXFfcV9mcmVlLCAwKTsKIH0KIAogLyoqCkBAIC00MDAsMzQgKzM1Niw0NSBAQAogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgcWRpb19pbml0aWFsaXplIGluaXRfZGF0YTsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiA9IHFkaW8tPmFkYXB0ZXItPmNjd19kZXZpY2U7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHFkaW8tPmFkYXB0ZXI7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXYgPSBhZGFwdGVyLT5jY3dfZGV2aWNlOworCXN0cnVjdCBxZGlvX3NzcWRfZGVzYyBzc3FkOwogCWludCBjYzsKIAotCWlmIChhdG9taWNfcmVhZCgmcWRpby0+YWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQKQorCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQKQogCQlyZXR1cm4gLUVJTzsKIAorCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfU0lPU0xfSVNTVUVELAorCQkJICAmcWRpby0+YWRhcHRlci0+c3RhdHVzKTsKKwogCXpmY3BfcWRpb19zZXR1cF9pbml0X2RhdGEoJmluaXRfZGF0YSwgcWRpbyk7CiAKIAlpZiAocWRpb19lc3RhYmxpc2goJmluaXRfZGF0YSkpCiAJCWdvdG8gZmFpbGVkX2VzdGFibGlzaDsKIAorCWlmIChxZGlvX2dldF9zc3FkX2Rlc2MoaW5pdF9kYXRhLmNkZXYsICZzc3FkKSkKKwkJZ290byBmYWlsZWRfcWRpbzsKKworCWlmIChzc3FkLnFkaW9hYzIgJiBDSFNDX0FDMl9EQVRBX0RJVl9FTkFCTEVEKQorCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9EQVRBX0RJVl9FTkFCTEVELAorCQkJCSZxZGlvLT5hZGFwdGVyLT5zdGF0dXMpOworCiAJaWYgKHFkaW9fYWN0aXZhdGUoY2RldikpCiAJCWdvdG8gZmFpbGVkX3FkaW87CiAKIAlmb3IgKGNjID0gMDsgY2MgPCBRRElPX01BWF9CVUZGRVJTX1BFUl9ROyBjYysrKSB7Ci0JCXNiYWxlID0gJihxZGlvLT5yZXNwX3Euc2JhbFtjY10tPmVsZW1lbnRbMF0pOworCQlzYmFsZSA9ICYocWRpby0+cmVzX3FbY2NdLT5lbGVtZW50WzBdKTsKIAkJc2JhbGUtPmxlbmd0aCA9IDA7CiAJCXNiYWxlLT5mbGFncyA9IFNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKIAkJc2JhbGUtPmFkZHIgPSBOVUxMOwogCX0KIAotCWlmIChkb19RRElPKGNkZXYsIFFESU9fRkxBR19TWU5DX0lOUFVULCAwLCAwLAotCQkgICAgIFFESU9fTUFYX0JVRkZFUlNfUEVSX1EpKQorCWlmIChkb19RRElPKGNkZXYsIFFESU9fRkxBR19TWU5DX0lOUFVULCAwLCAwLCBRRElPX01BWF9CVUZGRVJTX1BFUl9RKSkKIAkJZ290byBmYWlsZWRfcWRpbzsKIAogCS8qIHNldCBpbmRleCBvZiBmaXJzdCBhdmFsYWJsZSBTQkFMUyAvIG51bWJlciBvZiBhdmFpbGFibGUgU0JBTFMgKi8KLQlxZGlvLT5yZXFfcS5maXJzdCA9IDA7Ci0JYXRvbWljX3NldCgmcWRpby0+cmVxX3EuY291bnQsIFFESU9fTUFYX0JVRkZFUlNfUEVSX1EpOworCXFkaW8tPnJlcV9xX2lkeCA9IDA7CisJYXRvbWljX3NldCgmcWRpby0+cmVxX3FfZnJlZSwgUURJT19NQVhfQlVGRkVSU19QRVJfUSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNDQxLDcgKzQwOCw2IEBACiAKIHZvaWQgemZjcF9xZGlvX2Rlc3Ryb3koc3RydWN0IHpmY3BfcWRpbyAqcWRpbykKIHsKLQlzdHJ1Y3QgcWRpb19idWZmZXIgKipzYmFsX3JlcSwgKipzYmFsX3Jlc3A7CiAJaW50IHA7CiAKIAlpZiAoIXFkaW8pCkBAIC00NTAsMTIgKzQxNiw5IEBACiAJaWYgKHFkaW8tPmFkYXB0ZXItPmNjd19kZXZpY2UpCiAJCXFkaW9fZnJlZShxZGlvLT5hZGFwdGVyLT5jY3dfZGV2aWNlKTsKIAotCXNiYWxfcmVxID0gcWRpby0+cmVxX3Euc2JhbDsKLQlzYmFsX3Jlc3AgPSBxZGlvLT5yZXNwX3Euc2JhbDsKLQogCWZvciAocCA9IDA7IHAgPCBRRElPX01BWF9CVUZGRVJTX1BFUl9ROyBwICs9IFFCVUZGX1BFUl9QQUdFKSB7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc2JhbF9yZXFbcF0pOwotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHNiYWxfcmVzcFtwXSk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcWRpby0+cmVxX3FbcF0pOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHFkaW8tPnJlc19xW3BdKTsKIAl9CiAKIAlrZnJlZShxZGlvKTsKQEAgLTQ4MywzICs0NDYsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiB6ZmNwX3FkaW9fc2lvc2wgLSBUcmlnZ2VyIGxvZ2dpbmcgaW4gRkNQIGNoYW5uZWwKKyAqIEBhZGFwdGVyOiBUaGUgemZjcF9hZGFwdGVyIHdoZXJlIHRvIHRyaWdnZXIgbG9nZ2luZworICoKKyAqIENhbGwgdGhlIGNpbyBzaW9zbCBmdW5jdGlvbiB0byB0cmlnZ2VyIGhhcmR3YXJlIGxvZ2dpbmcuICBUaGlzCisgKiB3cmFwcGVyIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRvIGVuc3VyZSBoYXJkd2FyZSBsb2dnaW5nIGlzIG9ubHkKKyAqIHRyaWdnZXJlZCBvbmNlIGJlZm9yZSBnb2luZyB0aHJvdWdoIHFkaW8gc2h1dGRvd24uCisgKgorICogVGhlIHRyaWdnZXJzIGFyZSBhbHdheXMgcnVuIGZyb20gcWRpbyB0YXNrbGV0IGNvbnRleHQsIHNvIG5vCisgKiBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiBpcyBuZWNlc3NhcnkuCisgKi8KK3ZvaWQgemZjcF9xZGlvX3Npb3NsKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJjOworCisJaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT5zdGF0dXMpICYgWkZDUF9TVEFUVVNfQURBUFRFUl9TSU9TTF9JU1NVRUQpCisJCXJldHVybjsKKworCXJjID0gY2N3X2RldmljZV9zaW9zbChhZGFwdGVyLT5jY3dfZGV2aWNlKTsKKwlpZiAoIXJjKQorCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9TSU9TTF9JU1NVRUQsCisJCQkJJmFkYXB0ZXItPnN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCmluZGV4IDEzOGZiYTUuLjIyOTdkOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCkBAIC0xOSwyMiArMTksMjAgQEAKIC8qIGluZGV4IG9mIGxhc3QgU0JBTEUgKHdpdGggcmVzcGVjdCB0byBETVEgYnVnIHdvcmthcm91bmQpICovCiAjZGVmaW5lIFpGQ1BfUURJT19MQVNUX1NCQUxFX1BFUl9TQkFMCShaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfU0JBTCAtIDEpCiAKLS8qKgotICogc3RydWN0IHpmY3BfcWRpb19xdWV1ZSAtIHFkaW8gcXVldWUgYnVmZmVyLCB6ZmNwIGluZGV4IGFuZCBmcmVlIGNvdW50Ci0gKiBAc2JhbDogcWRpbyBidWZmZXJzCi0gKiBAZmlyc3Q6IGluZGV4IG9mIG5leHQgZnJlZSBidWZmZXIgaW4gcXVldWUKLSAqIEBjb3VudDogbnVtYmVyIG9mIGZyZWUgYnVmZmVycyBpbiBxdWV1ZQotICovCi1zdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlIHsKLQlzdHJ1Y3QgcWRpb19idWZmZXIgKnNiYWxbUURJT19NQVhfQlVGRkVSU19QRVJfUV07Ci0JdTgJCSAgIGZpcnN0OwotCWF0b21pY190ICAgICAgICAgICBjb3VudDsKLX07CisvKiBNYXggU0JBTFMgZm9yIGNoYWluaW5nICovCisjZGVmaW5lIFpGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUQkzNgorCisvKiBtYXguIG51bWJlciBvZiAoZGF0YSBidWZmZXIpIFNCQUxFcyBpbiBsYXJnZXN0IFNCQUwgY2hhaW4KKyAqIHJlcXVlc3QgSUQgKyBRVENCIGluIFNCQUxFIDAgKyAxIG9mIGZpcnN0IFNCQUwgaW4gY2hhaW4gICAqLworI2RlZmluZSBaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfUkVRICAgICBcCisJKFpGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUSAqIFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9TQkFMIC0gMikKIAogLyoqCiAgKiBzdHJ1Y3QgemZjcF9xZGlvIC0gYmFzaWMgcWRpbyBkYXRhIHN0cnVjdHVyZQotICogQHJlc3BfcTogcmVzcG9uc2UgcXVldWUKKyAqIEByZXNfcTogcmVzcG9uc2UgcXVldWUKICAqIEByZXFfcTogcmVxdWVzdCBxdWV1ZQorICogQHJlcV9xX2lkeDogaW5kZXggb2YgbmV4dCBmcmVlIGJ1ZmZlcgorICogQHJlcV9xX2ZyZWU6IG51bWJlciBvZiBmcmVlIGJ1ZmZlcnMgaW4gcXVldWUKICAqIEBzdGF0X2xvY2s6IGxvY2sgdG8gcHJvdGVjdCByZXFfcV91dGlsIGFuZCByZXFfcV90aW1lCiAgKiBAcmVxX3FfbG9jazogbG9jayB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHJlcXVlc3QgcXVldWUKICAqIEByZXFfcV90aW1lOiB0aW1lIG9mIGxhc3QgZmlsbCBsZXZlbCBjaGFuZ2UKQEAgLTQ0LDggKzQyLDEwIEBACiAgKiBAYWRhcHRlcjogYWRhcHRlciB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhpcyBxZGlvIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgemZjcF9xZGlvIHsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlCXJlc3BfcTsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlCXJlcV9xOworCXN0cnVjdCBxZGlvX2J1ZmZlcgkqcmVzX3FbUURJT19NQVhfQlVGRkVSU19QRVJfUV07CisJc3RydWN0IHFkaW9fYnVmZmVyCSpyZXFfcVtRRElPX01BWF9CVUZGRVJTX1BFUl9RXTsKKwl1OAkJCXJlcV9xX2lkeDsKKwlhdG9taWNfdAkJcmVxX3FfZnJlZTsKIAlzcGlubG9ja190CQlzdGF0X2xvY2s7CiAJc3BpbmxvY2tfdAkJcmVxX3FfbG9jazsKIAl1bnNpZ25lZCBsb25nIGxvbmcJcmVxX3FfdGltZTsKQEAgLTY1LDcgKzY1LDYgQEAKICAqIEBzYmFsZV9jdXJyOiBjdXJyZW50IHNiYWxlIGF0IGNyZWF0aW9uIG9mIHRoaXMgcmVxdWVzdAogICogQHNiYWxfcmVzcG9uc2U6IHNiYWwgdXNlZCBpbiBpbnRlcnJ1cHQKICAqIEBxZGlvX291dGJfdXNhZ2U6IHVzYWdlIG9mIG91dGJvdW5kIHF1ZXVlCi0gKiBAcWRpb19pbmJfdXNhZ2U6IHVzYWdlIG9mIGluYm91bmQgcXVldWUKICAqLwogc3RydWN0IHpmY3BfcWRpb19yZXEgewogCXUzMglzYnR5cGU7CkBAIC03NiwyMiArNzUsOSBAQAogCXU4CXNiYWxlX2N1cnI7CiAJdTgJc2JhbF9yZXNwb25zZTsKIAl1MTYJcWRpb19vdXRiX3VzYWdlOwotCXUxNglxZGlvX2luYl91c2FnZTsKIH07CiAKIC8qKgotICogemZjcF9xZGlvX3NiYWxlIC0gcmV0dXJuIHBvaW50ZXIgdG8gc2JhbGUgaW4gcWRpbyBxdWV1ZQotICogQHE6IHF1ZXVlIHdoZXJlIHRvIGZpbmQgc2JhbAotICogQHNiYWxfaWR4OiBzYmFsIGluZGV4IGluIHF1ZXVlCi0gKiBAc2JhbGVfaWR4OiBzYmFsZSBpbmRleCBpbiBzYmFsCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgotemZjcF9xZGlvX3NiYWxlKHN0cnVjdCB6ZmNwX3FkaW9fcXVldWUgKnEsIGludCBzYmFsX2lkeCwgaW50IHNiYWxlX2lkeCkKLXsKLQlyZXR1cm4gJnEtPnNiYWxbc2JhbF9pZHhdLT5lbGVtZW50W3NiYWxlX2lkeF07Ci19Ci0KLS8qKgogICogemZjcF9xZGlvX3NiYWxlX3JlcSAtIHJldHVybiBwb2ludGVyIHRvIHNiYWxlIG9uIHJlcV9xIGZvciBhIHJlcXVlc3QKICAqIEBxZGlvOiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX3FkaW8KICAqIEBxX3JlYzogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9xZGlvX3JlcQpAQCAtMTAwLDcgKzg2LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgogemZjcF9xZGlvX3NiYWxlX3JlcShzdHJ1Y3QgemZjcF9xZGlvICpxZGlvLCBzdHJ1Y3QgemZjcF9xZGlvX3JlcSAqcV9yZXEpCiB7Ci0JcmV0dXJuIHpmY3BfcWRpb19zYmFsZSgmcWRpby0+cmVxX3EsIHFfcmVxLT5zYmFsX2xhc3QsIDApOworCXJldHVybiAmcWRpby0+cmVxX3FbcV9yZXEtPnNiYWxfbGFzdF0tPmVsZW1lbnRbMF07CiB9CiAKIC8qKgpAQCAtMTEyLDggKzk4LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgogemZjcF9xZGlvX3NiYWxlX2N1cnIoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxKQogewotCXJldHVybiB6ZmNwX3FkaW9fc2JhbGUoJnFkaW8tPnJlcV9xLCBxX3JlcS0+c2JhbF9sYXN0LAotCQkJICAgICAgIHFfcmVxLT5zYmFsZV9jdXJyKTsKKwlyZXR1cm4gJnFkaW8tPnJlcV9xW3FfcmVxLT5zYmFsX2xhc3RdLT5lbGVtZW50W3FfcmVxLT5zYmFsZV9jdXJyXTsKIH0KIAogLyoqCkBAIC0xMzQsMjEgKzExOSwyNSBAQAogCQkJdW5zaWduZWQgbG9uZyByZXFfaWQsIHUzMiBzYnR5cGUsIHZvaWQgKmRhdGEsIHUzMiBsZW4pCiB7CiAJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCWludCBjb3VudCA9IG1pbihhdG9taWNfcmVhZCgmcWRpby0+cmVxX3FfZnJlZSksCisJCQlaRkNQX1FESU9fTUFYX1NCQUxTX1BFUl9SRVEpOwogCi0JcV9yZXEtPnNiYWxfZmlyc3QgPSBxX3JlcS0+c2JhbF9sYXN0ID0gcWRpby0+cmVxX3EuZmlyc3Q7CisJcV9yZXEtPnNiYWxfZmlyc3QgPSBxX3JlcS0+c2JhbF9sYXN0ID0gcWRpby0+cmVxX3FfaWR4OwogCXFfcmVxLT5zYmFsX251bWJlciA9IDE7CiAJcV9yZXEtPnNidHlwZSA9IHNidHlwZTsKKwlxX3JlcS0+c2JhbGVfY3VyciA9IDE7CisJcV9yZXEtPnNiYWxfbGltaXQgPSAocV9yZXEtPnNiYWxfZmlyc3QgKyBjb3VudCAtIDEpCisJCQkJCSUgUURJT19NQVhfQlVGRkVSU19QRVJfUTsKIAogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX3JlcShxZGlvLCBxX3JlcSk7CiAJc2JhbGUtPmFkZHIgPSAodm9pZCAqKSByZXFfaWQ7Ci0Jc2JhbGUtPmZsYWdzIHw9IFNCQUxfRkxBR1MwX0NPTU1BTkQ7Ci0Jc2JhbGUtPmZsYWdzIHw9IHNidHlwZTsKKwlzYmFsZS0+ZmxhZ3MgPSBTQkFMX0ZMQUdTMF9DT01NQU5EIHwgc2J0eXBlOwogCi0JcV9yZXEtPnNiYWxlX2N1cnIgPSAxOworCWlmICh1bmxpa2VseSghZGF0YSkpCisJCXJldHVybjsKIAlzYmFsZSsrOwogCXNiYWxlLT5hZGRyID0gZGF0YTsKLQlpZiAobGlrZWx5KGRhdGEpKQotCQlzYmFsZS0+bGVuZ3RoID0gbGVuOworCXNiYWxlLT5sZW5ndGggPSBsZW47CiB9CiAKIC8qKgpAQCAtMjEwLDQgKzE5OSwzNiBAQAogCXFfcmVxLT5zYmFsZV9jdXJyID0gWkZDUF9RRElPX0xBU1RfU0JBTEVfUEVSX1NCQUw7CiB9CiAKKy8qKgorICogemZjcF9xZGlvX3NiYWxfbGltaXQgLSBzZXQgdGhlIHNiYWwgbGltaXQgZm9yIGEgcmVxdWVzdCBpbiBxX3JlcQorICogQHFkaW86IHBvaW50ZXIgdG8gc3RydWN0IHpmY3BfcWRpbworICogQHFfcmVxOiBUaGUgY3VycmVudCB6ZmNwX3FkaW9fcmVxCisgKiBAbWF4X3NiYWxzOiBtYXhpbXVtIG51bWJlciBvZiBTQkFMcyBhbGxvd2VkCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgemZjcF9xZGlvX3NiYWxfbGltaXQoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywKKwkJCSAgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxLCBpbnQgbWF4X3NiYWxzKQoreworCWludCBjb3VudCA9IG1pbihhdG9taWNfcmVhZCgmcWRpby0+cmVxX3FfZnJlZSksIG1heF9zYmFscyk7CisKKwlxX3JlcS0+c2JhbF9saW1pdCA9IChxX3JlcS0+c2JhbF9maXJzdCArIGNvdW50IC0gMSkgJQorCQkJCVFESU9fTUFYX0JVRkZFUlNfUEVSX1E7Cit9CisKKy8qKgorICogemZjcF9xZGlvX3NldF9kYXRhX2RpdiAtIHNldCBkYXRhIGRpdmlzaW9uIGNvdW50CisgKiBAcWRpbzogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9xZGlvCisgKiBAcV9yZXE6IFRoZSBjdXJyZW50IHpmY3BfcWRpb19yZXEKKyAqIEBjb3VudDogVGhlIGRhdGEgZGl2aXNpb24gY291bnQKKyAqLworc3RhdGljIGlubGluZQordm9pZCB6ZmNwX3FkaW9fc2V0X2RhdGFfZGl2KHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sCisJCQkgICAgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxLCB1MzIgY291bnQpCit7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCisJc2JhbGUgPSAmcWRpby0+cmVxX3FbcV9yZXEtPnNiYWxfZmlyc3RdLT5lbGVtZW50WzBdOworCXNiYWxlLT5sZW5ndGggPSBjb3VudDsKK30KKwogI2VuZGlmIC8qIFpGQ1BfUURJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCmluZGV4IGJlNWQyYzYuLmNiMDAwYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c2NzaS9mYy9mY19mY3AuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAiemZjcF9leHQuaCIKICNpbmNsdWRlICJ6ZmNwX2RiZi5oIgpAQCAtMjIsNiArMjMsMTMgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChxdWV1ZV9kZXB0aCwgZGVmYXVsdF9kZXB0aCwgdWludCwgMDYwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHF1ZXVlX2RlcHRoLCAiRGVmYXVsdCBxdWV1ZSBkZXB0aCBmb3IgbmV3IFNDU0kgZGV2aWNlcyIpOwogCitzdGF0aWMgYm9vbCBlbmFibGVfZGlmOworCisjaWZkZWYgQ09ORklHX1pGQ1BfRElGCittb2R1bGVfcGFyYW1fbmFtZWQoZGlmLCBlbmFibGVfZGlmLCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlmLCAiRW5hYmxlIERJRi9ESVggZGF0YSBpbnRlZ3JpdHkgc3VwcG9ydCIpOworI2VuZGlmCisKIHN0YXRpYyBpbnQgemZjcF9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkZXB0aCwKIAkJCQkJaW50IHJlYXNvbikKIHsKQEAgLTUwNiw4ICs1MTQsMTAgQEAKICAqIEBycG9ydDogVGhlIEZDIHJwb3J0IHdoZXJlIHRvIHRlbWluYXRlIEkvTwogICoKICAqIEFib3J0IGFsbCBwZW5kaW5nIFNDU0kgY29tbWFuZHMgZm9yIGEgcG9ydCBieSBjbG9zaW5nIHRoZQotICogcG9ydC4gVXNpbmcgYSByZW9wZW4gYXZvaWRpbmcgYSBjb25mbGljdCB3aXRoIGEgc2h1dGRvd24KLSAqIG92ZXJ3cml0aW5nIGEgcmVvcGVuLgorICogcG9ydC4gVXNpbmcgYSByZW9wZW4gYXZvaWRzIGEgY29uZmxpY3Qgd2l0aCBhIHNodXRkb3duCisgKiBvdmVyd3JpdGluZyBhIHJlb3Blbi4gVGhlICJmb3JjZWQiIGVuc3VyZXMgdGhhdCBhIGRpc2FwcGVhcmVkIHBvcnQKKyAqIGlzIG5vdCBvcGVuZWQgYWdhaW4gYXMgdmFsaWQgZHVlIHRvIHRoZSBjYWNoZWQgcGxvZ2kgZGF0YSBpbgorICogbm9uLU5QSVYgbW9kZS4KICAqLwogc3RhdGljIHZvaWQgemZjcF9zY3NpX3Rlcm1pbmF0ZV9ycG9ydF9pbyhzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0KQogewpAQCAtNTE5LDExICs1MjksMjUgQEAKIAlwb3J0ID0gemZjcF9nZXRfcG9ydF9ieV93d3BuKGFkYXB0ZXIsIHJwb3J0LT5wb3J0X25hbWUpOwogCiAJaWYgKHBvcnQpIHsKLQkJemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwgMCwgInNjdHJwaTEiLCBOVUxMKTsKKwkJemZjcF9lcnBfcG9ydF9mb3JjZWRfcmVvcGVuKHBvcnQsIDAsICJzY3RycGkxIiwgTlVMTCk7CiAJCXB1dF9kZXZpY2UoJnBvcnQtPmRldik7CiAJfQogfQogCitzdGF0aWMgdm9pZCB6ZmNwX3Njc2lfcXVldWVfdW5pdF9yZWdpc3RlcihzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CisKKwlyZWFkX2xvY2tfaXJxKCZwb3J0LT51bml0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0LCBsaXN0KSB7CisJCWdldF9kZXZpY2UoJnVuaXQtPmRldik7CisJCWlmIChzY3NpX3F1ZXVlX3dvcmsocG9ydC0+YWRhcHRlci0+c2NzaV9ob3N0LAorCQkJCSAgICAmdW5pdC0+c2NzaV93b3JrKSA8PSAwKQorCQkJcHV0X2RldmljZSgmdW5pdC0+ZGV2KTsKKwl9CisJcmVhZF91bmxvY2tfaXJxKCZwb3J0LT51bml0X2xpc3RfbG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIHpmY3Bfc2NzaV9ycG9ydF9yZWdpc3RlcihzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBmY19ycG9ydF9pZGVudGlmaWVycyBpZHM7CkBAIC01NDgsNiArNTcyLDkgQEAKIAlycG9ydC0+bWF4ZnJhbWVfc2l6ZSA9IHBvcnQtPm1heGZyYW1lX3NpemU7CiAJcnBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzID0gcG9ydC0+c3VwcG9ydGVkX2NsYXNzZXM7CiAJcG9ydC0+cnBvcnQgPSBycG9ydDsKKwlwb3J0LT5zdGFyZ2V0X2lkID0gcnBvcnQtPnNjc2lfdGFyZ2V0X2lkOworCisJemZjcF9zY3NpX3F1ZXVlX3VuaXRfcmVnaXN0ZXIocG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkIHpmY3Bfc2NzaV9ycG9ydF9ibG9jayhzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQpAQCAtNjEwLDI0ICs2MzcsNzQgQEAKIAlwdXRfZGV2aWNlKCZwb3J0LT5kZXYpOwogfQogCi0KLXZvaWQgemZjcF9zY3NpX3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorLyoqCisgKiB6ZmNwX3Njc2lfc2NhbiAtIFJlZ2lzdGVyIExVTiB3aXRoIFNDU0kgbWlkbGF5ZXIKKyAqIEB1bml0OiBUaGUgTFVOL3VuaXQgdG8gcmVnaXN0ZXIKKyAqLwordm9pZCB6ZmNwX3Njc2lfc2NhbihzdHJ1Y3QgemZjcF91bml0ICp1bml0KQogewotCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHpmY3BfdW5pdCwKLQkJCQkJICAgICAgc2NzaV93b3JrKTsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OwotCi0JZmx1c2hfd29yaygmdW5pdC0+cG9ydC0+cnBvcnRfd29yayk7Ci0JcnBvcnQgPSB1bml0LT5wb3J0LT5ycG9ydDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdW5pdC0+cG9ydC0+cnBvcnQ7CiAKIAlpZiAocnBvcnQgJiYgcnBvcnQtPnBvcnRfc3RhdGUgPT0gRkNfUE9SVFNUQVRFX09OTElORSkKIAkJc2NzaV9zY2FuX3RhcmdldCgmcnBvcnQtPmRldiwgMCwgcnBvcnQtPnNjc2lfdGFyZ2V0X2lkLAogCQkJCSBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopCiAJCQkJCQkmdW5pdC0+ZmNwX2x1biksIDApOworfQogCit2b2lkIHpmY3Bfc2NzaV9zY2FuX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHpmY3BfdW5pdCwKKwkJCQkJICAgICAgc2NzaV93b3JrKTsKKworCXpmY3Bfc2NzaV9zY2FuKHVuaXQpOwogCXB1dF9kZXZpY2UoJnVuaXQtPmRldik7CiB9CiAKKy8qKgorICogemZjcF9zY3NpX3NldF9wcm90IC0gQ29uZmlndXJlIERJRi9ESVggc3VwcG9ydCBpbiBzY3NpX2hvc3QKKyAqIEBhZGFwdGVyOiBUaGUgYWRhcHRlciB3aGVyZSB0byBjb25maWd1cmUgRElGL0RJWCBmb3IgdGhlIFNDU0kgaG9zdAorICovCit2b2lkIHpmY3Bfc2NzaV9zZXRfcHJvdChzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgZGF0YV9kaXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBhZGFwdGVyLT5zY3NpX2hvc3Q7CisKKwlkYXRhX2RpdiA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5zdGF0dXMpICYKKwkJICAgWkZDUF9TVEFUVVNfQURBUFRFUl9EQVRBX0RJVl9FTkFCTEVEOworCisJaWYgKGVuYWJsZV9kaWYgJiYKKwkgICAgYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0RJRl9QUk9UX1RZUEUxKQorCQltYXNrIHw9IFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OOworCisJaWYgKGVuYWJsZV9kaWYgJiYgZGF0YV9kaXYgJiYKKwkgICAgYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0RJWF9QUk9UX1RDUElQKSB7CisJCW1hc2sgfD0gU0hPU1RfRElYX1RZUEUxX1BST1RFQ1RJT047CisJCXNjc2lfaG9zdF9zZXRfZ3VhcmQoc2hvc3QsIFNIT1NUX0RJWF9HVUFSRF9JUCk7CisJCXNob3N0LT5zZ190YWJsZXNpemUgPSBaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfUkVRIC8gMjsKKwkJc2hvc3QtPm1heF9zZWN0b3JzID0gWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSAqIDggLyAyOworCX0KKworCXNjc2lfaG9zdF9zZXRfcHJvdChzaG9zdCwgbWFzayk7Cit9CisKKy8qKgorICogemZjcF9zY3NpX2RpZl9zZW5zZV9lcnJvciAtIFJlcG9ydCBESUYvRElYIGVycm9yIGFzIGRyaXZlciBzZW5zZSBlcnJvcgorICogQHNjbWQ6IFRoZSBTQ1NJIGNvbW1hbmQgdG8gcmVwb3J0IHRoZSBlcnJvciBmb3IKKyAqIEBhc2NxOiBUaGUgQVNDUSB0byBwdXQgaW4gdGhlIHNlbnNlIGJ1ZmZlcgorICoKKyAqIFNlZSB0aGUgZXJyb3IgaGFuZGxpbmcgaW4gc2RfZG9uZSBmb3IgdGhlIHNlbnNlIGNvZGVzIHVzZWQgaGVyZS4KKyAqIFNldCBESURfU09GVF9FUlJPUiB0byByZXRyeSB0aGUgcmVxdWVzdCwgaWYgcG9zc2libGUuCisgKi8KK3ZvaWQgemZjcF9zY3NpX2RpZl9zZW5zZV9lcnJvcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLCBpbnQgYXNjcSkKK3sKKwlzY3NpX2J1aWxkX3NlbnNlX2J1ZmZlcigxLCBzY21kLT5zZW5zZV9idWZmZXIsCisJCQkJSUxMRUdBTF9SRVFVRVNULCAweDEwLCBhc2NxKTsKKwlzZXRfZHJpdmVyX2J5dGUoc2NtZCwgRFJJVkVSX1NFTlNFKTsKKwlzY21kLT5yZXN1bHQgfD0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCXNldF9ob3N0X2J5dGUoc2NtZCwgRElEX1NPRlRfRVJST1IpOworfQorCiBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgemZjcF90cmFuc3BvcnRfZnVuY3Rpb25zID0gewogCS5zaG93X3N0YXJnZXRfcG9ydF9pZCA9IDEsCiAJLnNob3dfc3RhcmdldF9wb3J0X25hbWUgPSAxLApAQCAtNjc3LDExICs3NTQsMTEgQEAKIAkJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkgPSB6ZmNwX3Njc2lfZWhfaG9zdF9yZXNldF9oYW5kbGVyLAogCQkuY2FuX3F1ZXVlCQkgPSA0MDk2LAogCQkudGhpc19pZAkJID0gLTEsCi0JCS5zZ190YWJsZXNpemUJCSA9IFpGQ1BfRlNGX01BWF9TQkFMRVNfUEVSX1JFUSwKKwkJLnNnX3RhYmxlc2l6ZQkJID0gWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSwKIAkJLmNtZF9wZXJfbHVuCQkgPSAxLAogCQkudXNlX2NsdXN0ZXJpbmcJCSA9IDEsCiAJCS5zZGV2X2F0dHJzCQkgPSB6ZmNwX3N5c2ZzX3NkZXZfYXR0cnMsCi0JCS5tYXhfc2VjdG9ycwkJID0gKFpGQ1BfRlNGX01BWF9TQkFMRVNfUEVSX1JFUSAqIDgpLAorCQkubWF4X3NlY3RvcnMJCSA9IChaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfUkVRICogOCksCiAJCS5kbWFfYm91bmRhcnkJCSA9IFpGQ1BfUURJT19TQkFMRV9MRU4gLSAxLAogCQkuc2hvc3RfYXR0cnMJCSA9IHpmY3Bfc3lzZnNfc2hvc3RfYXR0cnMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYwppbmRleCBmNWY2MDY5Li5iNDU2MWM4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAKIAl6ZmNwX2VycF91bml0X3Jlb3Blbih1bml0LCAwLCAic3l1YXNfMSIsIE5VTEwpOwogCXpmY3BfZXJwX3dhaXQodW5pdC0+cG9ydC0+YWRhcHRlcik7Ci0JZmx1c2hfd29yaygmdW5pdC0+c2NzaV93b3JrKTsKKwl6ZmNwX3Njc2lfc2Nhbih1bml0KTsKIG91dDoKIAlwdXRfZGV2aWNlKCZwb3J0LT5kZXYpOwogCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiAoc3NpemVfdCkgY291bnQ7CkBAIC0yOTAsNiArMjkwLDcgQEAKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OwogCXU2NCBmY3BfbHVuOwogCWludCByZXR2YWwgPSAtRUlOVkFMOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAogCWlmICghKHBvcnQgJiYgZ2V0X2RldmljZSgmcG9ydC0+ZGV2KSkpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0zMDMsOCArMzA0LDEzIEBACiAJZWxzZQogCQlyZXR2YWwgPSAwOwogCi0JLyogd2FpdCBmb3IgcG9zc2libGUgdGltZW91dCBkdXJpbmcgU0NTSSBwcm9iZSAqLwotCWZsdXNoX3dvcmsoJnVuaXQtPnNjc2lfd29yayk7CisJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChwb3J0LT5hZGFwdGVyLT5zY3NpX2hvc3QsIDAsCisJCQkJICBwb3J0LT5zdGFyZ2V0X2lkLAorCQkJCSAgc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZmY3BfbHVuKSk7CisJaWYgKHNkZXYpIHsKKwkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOworCQlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJfQogCiAJd3JpdGVfbG9ja19pcnEoJnBvcnQtPnVuaXRfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmdW5pdC0+bGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmMgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmMKaW5kZXggOGJmZGQ2My4uM2U4OWMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYwpAQCAtMzE3LDcgKzMxNyw3IEBACiAKIAlicC0+d2FpdGluZyA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYnAtPndxKTsKLQlpZiAocmVxdWVzdF9pcnEob3AtPmlycXNbMF0sIGJiY19pMmNfaW50ZXJydXB0LAorCWlmIChyZXF1ZXN0X2lycShvcC0+YXJjaGRhdGEuaXJxc1swXSwgYmJjX2kyY19pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgImJiY19pMmMiLCBicCkpCiAJCWdvdG8gZmFpbDsKIApAQCAtMzczLDcgKzM3Myw3IEBACiAKIAllcnIgPSBiYmNfZW52Y3RybF9pbml0KGJwKTsKIAlpZiAoZXJyKSB7Ci0JCWZyZWVfaXJxKG9wLT5pcnFzWzBdLCBicCk7CisJCWZyZWVfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzBdLCBicCk7CiAJCWlmIChicC0+aTJjX2J1c3NlbF9yZWcpCiAJCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGJwLT5pMmNfYnVzc2VsX3JlZywgMSk7CiAJCWlmIChicC0+aTJjX2NvbnRyb2xfcmVncykKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJYmJjX2VudmN0cmxfY2xlYW51cChicCk7CiAKLQlmcmVlX2lycShvcC0+aXJxc1swXSwgYnApOworCWZyZWVfaXJxKG9wLT5hcmNoZGF0YS5pcnFzWzBdLCBicCk7CiAKIAlpZiAoYnAtPmkyY19idXNzZWxfcmVnKQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGJwLT5pMmNfYnVzc2VsX3JlZywgMSk7CkBAIC00MjUsMTIgKzQyNSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBiYmNfaTJjX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZiYmNfaTJjX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZiYmNfaTJjX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBiYmNfaTJjX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmYmJjX2kyY19kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZiYmNfaTJjX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGJiY19pMmNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYwppbmRleCA3YmFmMWI2Li40N2RiOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CQkvKiByZXF1ZXN0X3JlZ2lvbiAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC0yNiw2ICsyNiw3IEBACiAjZGVmaW5lIERSSVZFUl9OQU1FCSJkN3MiCiAjZGVmaW5lIFBGWAkJRFJJVkVSX05BTUUgIjogIgogCitzdGF0aWMgREVGSU5FX01VVEVYKGQ3c19tdXRleCk7CiBzdGF0aWMgaW50IHNvbF9jb21wYXQgPSAwOwkJLyogU29sYXJpcyBjb21wYXRpYmlsaXR5IG1vZGUJKi8KIAogLyogU29sYXJpcyBjb21wYXRpYmlsaXR5IGZsYWcgLQpAQCAtNzQsNyArNzUsNiBAQAogewogCWlmIChEN1NfTUlOT1IgIT0gaW1pbm9yKGlub2RlKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAlhdG9taWNfaW5jKCZkN3NfdXNlcnMpOwogCXJldHVybiAwOwogfQpAQCAtMTEwLDcgKzExMCw3IEBACiAJaWYgKEQ3U19NSU5PUiAhPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZkN3NfbXV0ZXgpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBEN1NJT0NXUjoKIAkJLyogYXNzaWduIGRldmljZSByZWdpc3RlciB2YWx1ZXMgd2UgbWFzay1vdXQgRDdTX0ZMSVAKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQl3cml0ZWIocmVncywgcC0+cmVncyk7CiAJCWJyZWFrOwogCX07Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmZDdzX211dGV4KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTI3NywxMiArMjc3LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGQ3c19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZDdzX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZkN3NfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGQ3c19leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmQ3c19kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZkN3NfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoZDdzX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IGM4MTY2ZWMuLjNjMjdmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIApAQCAtNjk5LDcgKzY5OCw2IEBACiBzdGF0aWMgaW50CiBlbnZjdHJsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCXJldHVybiAwOwogfQpAQCAtMTE0MiwxMiArMTE0MCwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBlbnZjdHJsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZlbnZjdHJsX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZlbnZjdHJsX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlbnZjdHJsX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZW52Y3RybF9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZlbnZjdHJsX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGVudmN0cmxfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwppbmRleCAzNjhkNjYyLi44YmIzMWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91cGEuaD4KIAorc3RhdGljIERFRklORV9NVVRFWChmbGFzaF9tdXRleCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZsYXNoX2xvY2spOwogc3RhdGljIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyByZWFkX2Jhc2U7CS8qIFBoeXNpY2FsIHJlYWQgYWRkcmVzcyAqLwpAQCAtODAsNyArODEsNyBAQAogc3RhdGljIGxvbmcgbG9uZwogZmxhc2hfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmZmxhc2hfbXV0ZXgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJCWNhc2UgMDoKIAkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OwpAQCAtOTQsMTAgKzk1LDEwIEBACiAJCQlmaWxlLT5mX3BvcyA9IGZsYXNoLnJlYWRfc2l6ZTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJbXV0ZXhfdW5sb2NrKCZmbGFzaF9tdXRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmZmxhc2hfbXV0ZXgpOwogCXJldHVybiBmaWxlLT5mX3BvczsKIH0KIApAQCAtMTI1LDEzICsxMjYsMTMgQEAKIHN0YXRpYyBpbnQKIGZsYXNoX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZmbGFzaF9tdXRleCk7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmZmxhc2guYnVzeSkgIT0gMCkgewotCQl1bmxvY2tfa2VybmVsKCk7CisJCW11dGV4X3VubG9jaygmZmxhc2hfbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmZsYXNoX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE4LDEyICsyMTksMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgZmxhc2hfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmZsYXNoX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmbGFzaF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmxhc2hfY2xlYW51cCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZmbGFzaF9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmbGFzaF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChmbGFzaF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMgYi9kcml2ZXJzL3NidXMvY2hhci9vcGVucHJvbS5jCmluZGV4IGFhY2JlMTQuLjhkNmU1MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNjEsNiArNjEsNyBAQAogfSBEQVRBOwogCiAvKiBJRCBvZiB0aGUgUFJPTSBub2RlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBFRVBST00gb3B0aW9ucy4gKi8KK3N0YXRpYyBERUZJTkVfTVVURVgob3BlbnByb21fbXV0ZXgpOwogc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb3B0aW9uc19ub2RlOwogCiAvKgpAQCAtMzE2LDcgKzMxNyw3IEBACiAJaWYgKGJ1ZnNpemUgPCAwKQogCQlyZXR1cm4gYnVmc2l6ZTsKIAotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmb3BlbnByb21fbXV0ZXgpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9QUk9NR0VUT1BUOgpAQCAtMzY3LDcgKzM2OCw3IEBACiAJfQogCiAJa2ZyZWUob3BwKTsKLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZvcGVucHJvbV9tdXRleCk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC01NTgsNyArNTU5LDcgQEAKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZvcGVucHJvbV9tdXRleCk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9QSU9DR0VUOgogCQllcnIgPSBvcGlvY2dldChhcmdwLCBkYXRhKTsKQEAgLTU4OSw3ICs1OTAsNyBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9OwotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJm9wZW5wcm9tX211dGV4KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02OTcsMTEgKzY5OCwxMSBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJm9wZW5wcm9tX211dGV4KTsKIAlkYXRhLT5jdXJyZW50X25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWRhdGEtPmxhc3Rub2RlID0gZGF0YS0+Y3VycmVudF9ub2RlOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIGRhdGE7Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmb3BlbnByb21fbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci91Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvdWN0cmwuYwppbmRleCA1ZjI1MzY2Li40MWViNjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci91Y3RybC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL3VjdHJsLmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CkBAIC03Miw2ICs3Miw3IEBACiAjZGVmaW5lIFVDVFJMX1NUQVRfUlhORV9TVEEgICAgICAgIDB4MDQgICAgLyogcmVjZWl2ZSBGSUZPIG5vdCBlbXB0eSBzdGF0dXMgKi8KICNkZWZpbmUgVUNUUkxfU1RBVF9SWE9fU1RBICAgICAgICAgMHgwOCAgICAvKiByZWNlaXZlIEZJRk8gb3ZlcmZsb3cgc3RhdHVzICovCiAKK3N0YXRpYyBERUZJTkVfTVVURVgodWN0cmxfbXV0ZXgpOwogc3RhdGljIGNvbnN0IGNoYXIgKnVjdHJsX2V4dHN0YXR1c1sxNl0gPSB7CiAgICAgICAgICJtYWluIHBvd2VyIGF2YWlsYWJsZSIsCiAgICAgICAgICJpbnRlcm5hbCBiYXR0ZXJ5IGF0dGFjaGVkIiwKQEAgLTIxMCwxMCArMjExLDEwIEBACiBzdGF0aWMgaW50CiB1Y3RybF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWxvY2tfa2VybmVsKCk7CisJbXV0ZXhfbG9jaygmdWN0cmxfbXV0ZXgpOwogCXVjdHJsX2dldF9ldmVudF9zdGF0dXMoZ2xvYmFsX2RyaXZlcik7CiAJdWN0cmxfZ2V0X2V4dGVybmFsX3N0YXR1cyhnbG9iYWxfZHJpdmVyKTsKLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZ1Y3RybF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2Nyw3ICszNjgsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCXAtPmlycSA9IG9wLT5pcnFzWzBdOworCXAtPmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCWVyciA9IHJlcXVlc3RfaXJxKHAtPmlycSwgdWN0cmxfaW50ZXJydXB0LCAwLCAidWN0cmwiLCBwKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidWN0cmw6IFVuYWJsZSB0byByZWdpc3RlciBpcnEuXG4iKTsKQEAgLTQzNywxMiArNDM4LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHVjdHJsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZ1Y3RybF9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdWN0cmxfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVjdHJsX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmdWN0cmxfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdWN0cmxfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodWN0cmxfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDc1ZjIzMzYuLjE1ODI4NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0xODQ3LDYgKzE4NDcsMTAgQEAKICAgICAgICAgICBjYWxsZWQgemZjcC4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZQogICAgICAgICAgIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4KIAorY29uZmlnIFpGQ1BfRElGCisJdHJpc3RhdGUgIlQxMCBESUYvRElYIHN1cHBvcnQgZm9yIHRoZSB6ZmNwIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFpGQ1AgJiYgRVhQRVJJTUVOVEFMCisKIGNvbmZpZyBTQ1NJX1BNQ1JBSUQKIAl0cmlzdGF0ZSAiUE1DIFNJRVJSQSBMaW51eCBNYXhSQUlEIGFkYXB0ZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKaW5kZXggMWM3YWM0OS4uMmEzZmNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtMTYzLDYgKzE2Myw3IEBACiBzY3NpX21vZC0kKENPTkZJR19TWVNDVEwpCSs9IHNjc2lfc3lzY3RsLm8KIHNjc2lfbW9kLSQoQ09ORklHX1NDU0lfUFJPQ19GUykJKz0gc2NzaV9wcm9jLm8KIHNjc2lfbW9kLXkJCQkrPSBzY3NpX3RyYWNlLm8KK3Njc2lfbW9kLSQoQ09ORklHX1BNX09QUykJKz0gc2NzaV9wbS5vCiAKIHNjc2lfdGd0LXkJCQkrPSBzY3NpX3RndF9saWIubyBzY3NpX3RndF9pZi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCmluZGV4IDMzODk4YjYxLi5jYWQ2ZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKQEAgLTEwOTEsNiArMTA5MSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaW5zZXJ0ID0gJmFhY19kZXZpY2VzOwogCWludCBlcnJvciA9IC1FTk9ERVY7CiAJaW50IHVuaXF1ZV9pZCA9IDA7CisJdTY0IGRtYW1hc2s7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFhYywgJmFhY19kZXZpY2VzLCBlbnRyeSkgewogCQlpZiAoYWFjLT5pZCA+IHVuaXF1ZV9pZCkKQEAgLTExMDQsMTcgKzExMDUsMTggQEAKIAkJZ290byBvdXQ7CiAJZXJyb3IgPSAtRU5PREVWOwogCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgfHwKLQkJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkKLQkJZ290byBvdXRfZGlzYWJsZV9wZGV2OwogCS8qCiAJICogSWYgdGhlIHF1aXJrMzEgYml0IGlzIHNldCwgdGhlIGFkYXB0ZXIgbmVlZHMgYWRhcHRlcgogCSAqIHRvIGRyaXZlciBjb21tdW5pY2F0aW9uIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgYmVsb3cgMmdpZwogCSAqLwogCWlmIChhYWNfZHJpdmVyc1tpbmRleF0ucXVpcmtzICYgQUFDX1FVSVJLXzMxQklUKQotCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzEpKSB8fAotCQkJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzEpKSkKLQkJCWdvdG8gb3V0X2Rpc2FibGVfcGRldjsKKwkJZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMSk7CisJZWxzZQorCQlkbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIGRtYW1hc2spIHx8CisJCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgZG1hbWFzaykpCisJCWdvdG8gb3V0X2Rpc2FibGVfcGRldjsKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCmluZGV4IDdmODc5NzkuLjBlYzNkYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCkBAIC05NzE3LDcgKzk3MTcsNyBAQAogCWFzY19kdmMtPmJ1Z19maXhfY250bCA9IDA7CiAJYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgPSAwOwogCWFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyA9IDA7Ci0JLyogYXNjX2R2Yy0+aW5pdF9zdGF0ZSBpbml0YWxpemVkIGluIEFzY0luaXRHZXRDb25maWcoKS4gKi8KKwkvKiBhc2NfZHZjLT5pbml0X3N0YXRlIGluaXRpYWxpemVkIGluIEFzY0luaXRHZXRDb25maWcoKS4gKi8KIAlhc2NfZHZjLT5zZHRyX2RvbmUgPSAwOwogCWFzY19kdmMtPmN1cl90b3RhbF9xbmcgPSAwOwogCWFzY19kdmMtPmlzX2luX2ludCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwLmMKaW5kZXggNmQ4NmE5Yi4uNTAwMGJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzAuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJY2FzZSAxNToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRmKCJhaWM3NzcwX2NvbmZpZzogaW52YWxpZCBpcnEgc2V0dGluZyAlZFxuIiwgaW50ZGVmKTsKKwkJcHJpbnRrKCJhaWM3NzcwX2NvbmZpZzogaW52YWxpZCBpcnEgc2V0dGluZyAlZFxuIiwgaW50ZGVmKTsKIAkJcmV0dXJuIChFTlhJTyk7CiAJfQogCkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJYnJlYWs7CiAJfQogCWlmIChoYXZlX3NlZXByb20gPT0gMCkgewotCQlmcmVlKGFoYy0+c2VlcF9jb25maWcsIE1fREVWQlVGKTsKKwkJa2ZyZWUoYWhjLT5zZWVwX2NvbmZpZyk7CiAJCWFoYy0+c2VlcF9jb25maWcgPSBOVUxMOwogCX0KIApAQCAtMjkzLDcgKzI5Myw3IEBACiAJc2MgPSBhaGMtPnNlZXBfY29uZmlnOwogCiAJaWYgKGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiBSZWFkaW5nIFNFRVBST00uLi4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcHJpbnRrKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhjX25hbWUoYWhjKSk7CiAJaGF2ZV9zZWVwcm9tID0gYWhjX3JlYWRfc2VlcHJvbSgmc2QsICh1aW50MTZfdCAqKXNjLAogCQkJCQkvKnN0YXJ0X2FkZHIqLzAsIHNpemVvZigqc2MpLzIpOwogCkBAIC0zMDEsMTYgKzMwMSwxNiBAQAogCiAJCWlmIChhaGNfdmVyaWZ5X2Nrc3VtKHNjKSA9PSAwKSB7CiAJCQlpZihib290dmVyYm9zZSkKLQkJCQlwcmludGYgKCJjaGVja3N1bSBlcnJvclxuIik7CisJCQkJcHJpbnRrICgiY2hlY2tzdW0gZXJyb3JcbiIpOwogCQkJaGF2ZV9zZWVwcm9tID0gMDsKIAkJfSBlbHNlIGlmIChib290dmVyYm9zZSkgewotCQkJcHJpbnRmKCJkb25lLlxuIik7CisJCQlwcmludGsoImRvbmUuXG4iKTsKIAkJfQogCX0KIAogCWlmICghaGF2ZV9zZWVwcm9tKSB7CiAJCWlmIChib290dmVyYm9zZSkKLQkJCXByaW50ZigiJXM6IE5vIFNFRVBST00gYXZhaWxhYmxlXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJCXByaW50aygiJXM6IE5vIFNFRVBST00gYXZhaWxhYmxlXG4iLCBhaGNfbmFtZShhaGMpKTsKIAkJYWhjLT5mbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CiAJfSBlbHNlIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzBfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwX29zbS5jCmluZGV4IGYyMjBlNWUuLjBjYjhlZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzBfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYwpAQCAtODUsNyArODUsNyBAQAogCWludAllcnJvcjsKIAogCXNwcmludGYoYnVmLCAiYWhjX2Vpc2E6JWQiLCBlaXNhQmFzZSA+PiAxMik7Ci0JbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJbmFtZSA9IGttYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBHRlBfQVRPTUlDKTsKIAlpZiAobmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gKEVOT01FTSk7CiAJc3RyY3B5KG5hbWUsIGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCmluZGV4IDc4OTcxZGIuLjMyMzNiZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCkBAIC0yODksNyArMjg5LDcgQEAKIAkgfHwgYWhkLT5kc3RfbW9kZSA9PSBBSERfTU9ERV9VTktOT1dOKQogCQlwYW5pYygiU2V0dGluZyBtb2RlIHByaW9yIHRvIHNhdmluZyBpdC5cbiIpOwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTU9ERVBUUikgIT0gMCkKLQkJcHJpbnRmKCIlczogU2V0dGluZyBtb2RlIDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksCisJCXByaW50aygiJXM6IFNldHRpbmcgbW9kZSAweCV4XG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBzcmMsIGRzdCkpOwogI2VuZGlmCiAJYWhkX291dGIoYWhkLCBNT0RFX1BUUiwgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBzcmMsIGRzdCkpOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJbW9kZV9wdHIgPSBhaGRfaW5iKGFoZCwgTU9ERV9QVFIpOwogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTU9ERVBUUikgIT0gMCkKLQkJcHJpbnRmKCJSZWFkaW5nIG1vZGUgMHgleFxuIiwgbW9kZV9wdHIpOworCQlwcmludGsoIlJlYWRpbmcgbW9kZSAweCV4XG4iLCBtb2RlX3B0cik7CiAjZW5kaWYKIAlhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKGFoZCwgbW9kZV9wdHIsICZzcmMsICZkc3QpOwogCWFoZF9rbm93bl9tb2RlcyhhaGQsIHNyYywgZHN0KTsKQEAgLTg3Nyw3ICs4NzcsNyBAQAogCQl1aW50NjRfdCBob3N0X2RhdGFwdHI7CiAKIAkJaG9zdF9kYXRhcHRyID0gYWhkX2xlNjR0b2goc2NiLT5oc2NiLT5kYXRhcHRyKTsKLQkJcHJpbnRmKCIlczogUXVldWVpbmcgU0NCICVkOjB4JXggYnVzIGFkZHIgMHgleCAtIDB4JXgleC8weCV4XG4iLAorCQlwcmludGsoIiVzOiBRdWV1ZWluZyBTQ0IgJWQ6MHgleCBidXMgYWRkciAweCV4IC0gMHgleCV4LzB4JXhcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSwgc2NiLT5oc2NiLT5zY3NpaWQsCiAJCSAgICAgICBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPmhzY2JfYnVzYWRkciksCkBAIC0xMTc0LDcgKzExNzQsNyBAQAogCiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19GSUZPUykgIT0gMCkKLQkJcHJpbnRmKCIlczogQ2xlYXJpbmcgRklGTyAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZmlmbyk7CisJCXByaW50aygiJXM6IENsZWFyaW5nIEZJRk8gJWRcbiIsIGFoZF9uYW1lKGFoZCksIGZpZm8pOwogI2VuZGlmCiAJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOwogCWFoZF9zZXRfbW9kZXMoYWhkLCBmaWZvLCBmaWZvKTsKQEAgLTEyMTUsNyArMTIxNSw3IEBACiAJCXNjYmlkID0gYWhkX2ludyhhaGQsIEdTRklGTyk7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IFdhcm5pbmcgLSBHU0ZJRk8gU0NCICVkIGludmFsaWRcbiIsCisJCQlwcmludGsoIiVzOiBXYXJuaW5nIC0gR1NGSUZPIFNDQiAlZCBpbnZhbGlkXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYmlkKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xMzM5LDcgKzEzMzksNyBAQAogCQluZXh0X3NjYmlkID0gYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVF9DT01QTEVURSk7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IFdhcm5pbmcgLSBETUEtdXAgYW5kIGNvbXBsZXRlICIKKwkJCXByaW50aygiJXM6IFdhcm5pbmcgLSBETUEtdXAgYW5kIGNvbXBsZXRlICIKIAkJCSAgICAgICAiU0NCICVkIGludmFsaWRcbiIsIGFoZF9uYW1lKGFoZCksIHNjYmlkKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogCQluZXh0X3NjYmlkID0gYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVF9DT01QTEVURSk7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IFdhcm5pbmcgLSBDb21wbGV0ZSBRZnJ6IFNDQiAlZCBpbnZhbGlkXG4iLAorCQkJcHJpbnRrKCIlczogV2FybmluZyAtIENvbXBsZXRlIFFmcnogU0NCICVkIGludmFsaWRcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAJCW5leHRfc2NiaWQgPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKIAkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CiAJCWlmIChzY2IgPT0gTlVMTCkgewotCQkJcHJpbnRmKCIlczogV2FybmluZyAtIENvbXBsZXRlIFNDQiAlZCBpbnZhbGlkXG4iLAorCQkJcHJpbnRrKCIlczogV2FybmluZyAtIENvbXBsZXRlIFNDQiAlZCBpbnZhbGlkXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYmlkKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xNjgyLDcgKzE2ODIsNyBAQAogCQlzY2JfaW5kZXggPSBhaGRfbGUxNnRvaChjb21wbGV0aW9uLT50YWcpOwogCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYl9pbmRleCk7CiAJCWlmIChzY2IgPT0gTlVMTCkgewotCQkJcHJpbnRmKCIlczogV0FSTklORyBubyBjb21tYW5kIGZvciBzY2IgJWQgIgorCQkJcHJpbnRrKCIlczogV0FSTklORyBubyBjb21tYW5kIGZvciBzY2IgJWQgIgogCQkJICAgICAgICIoY21kY21wbHQpXG5RT1VUUE9TID0gJWRcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiX2luZGV4LAogCQkJICAgICAgIGFoZC0+cW91dGZpZm9uZXh0KTsKQEAgLTE3MTQsNyArMTcxNCw3IEBACiAJZXJyb3IgPSBhaGRfaW5iKGFoZCwgRVJST1IpOwogCWZvciAoaSA9IDA7IGkgPCBudW1fZXJyb3JzOyBpKyspIHsKIAkJaWYgKChlcnJvciAmIGFoZF9oYXJkX2Vycm9yc1tpXS5lcnJubykgIT0gMCkKLQkJCXByaW50ZigiJXM6IGh3ZXJyaW50LCAlc1xuIiwKKwkJCXByaW50aygiJXM6IGh3ZXJyaW50LCAlc1xuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaGFyZF9lcnJvcnNbaV0uZXJybWVzZyk7CiAJfQogCkBAIC0xNzQ3LDcgKzE3NDcsNyBAQAogCiAJCQkJYWRkciA9IGFoZF9sZTY0dG9oKHNnX2xpc3RbaV0uYWRkcik7CiAJCQkJbGVuID0gYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5sZW4pOwotCQkJCXByaW50Zigic2dbJWRdIC0gQWRkciAweCV4JXggOiBMZW5ndGggJWQlc1xuIiwKKwkJCQlwcmludGsoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkJXNcbiIsCiAJCQkJICAgICAgIGksCiAJCQkJICAgICAgICh1aW50MzJfdCkoKGFkZHIgPj4gMzIpICYgMHhGRkZGRkZGRiksCiAJCQkJICAgICAgICh1aW50MzJfdCkoYWRkciAmIDB4RkZGRkZGRkYpLApAQCAtMTc2Myw3ICsxNzYzLDcgQEAKIAkJCQl1aW50MzJfdCBsZW47CiAKIAkJCQlsZW4gPSBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmxlbik7Ci0JCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZCVzXG4iLAorCQkJCXByaW50aygic2dbJWRdIC0gQWRkciAweCV4JXggOiBMZW5ndGggJWQlc1xuIiwKIAkJCQkgICAgICAgaSwKIAkJCQkgICAgICAgKGxlbiAmIEFIRF9TR19ISUdIX0FERFJfTUFTSykgPj4gMjQsCiAJCQkJICAgICAgIGFoZF9sZTMydG9oKHNnX2xpc3RbaV0uYWRkciksCkBAIC0xODAyLDcgKzE4MDIsNyBAQAogCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKICNpZmRlZiBBSERfREVCVUcKIAlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCi0JCXByaW50ZigiJXM6IEhhbmRsZSBTZXFpbnQgQ2FsbGVkIGZvciBjb2RlICVkXG4iLAorCQlwcmludGsoIiVzOiBIYW5kbGUgU2VxaW50IENhbGxlZCBmb3IgY29kZSAlZFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNlcWludGNvZGUpOwogI2VuZGlmCiAJc3dpdGNoIChzZXFpbnRjb2RlKSB7CkBAIC0xODM2LDE4ICsxODM2LDE4IEBACiAJCQkgKi8KICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCi0JCQkJcHJpbnRmKCIlczogQXNzdW1pbmcgTFFJUEhBU0VfTkxRIHdpdGggIgorCQkJCXByaW50aygiJXM6IEFzc3VtaW5nIExRSVBIQVNFX05MUSB3aXRoICIKIAkJCQkgICAgICAgIlAwIGFzc2VydGlvblxuIiwgYWhkX25hbWUoYWhkKSk7CiAjZW5kaWYKIAkJfQogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKQotCQkJcHJpbnRmKCIlczogRW50ZXJpbmcgTk9OUEFDS1xuIiwgYWhkX25hbWUoYWhkKSk7CisJCQlwcmludGsoIiVzOiBFbnRlcmluZyBOT05QQUNLXG4iLCBhaGRfbmFtZShhaGQpKTsKICNlbmRpZgogCQlicmVhazsKIAl9CiAJY2FzZSBJTlZBTElEX1NFUUlOVDoKLQkJcHJpbnRmKCIlczogSW52YWxpZCBTZXF1ZW5jZXIgaW50ZXJydXB0IG9jY3VycmVkLCAiCisJCXByaW50aygiJXM6IEludmFsaWQgU2VxdWVuY2VyIGludGVycnVwdCBvY2N1cnJlZCwgIgogCQkgICAgICAgInJlc2V0dGluZyBjaGFubmVsLlxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogI2lmZGVmIEFIRF9ERUJVRwpAQCAtMTg2Niw4ICsxODY2LDggQEAKIAkJaWYgKHNjYiAhPSBOVUxMKQogCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwogCQllbHNlCi0JCQlwcmludGYoIiVzOiAiLCBhaGRfbmFtZShhaGQpKTsKLQkJcHJpbnRmKCJTQ0IgJWQgUGFja2V0aXplZCBTdGF0dXMgT3ZlcnJ1biIsIHNjYmlkKTsKKwkJCXByaW50aygiJXM6ICIsIGFoZF9uYW1lKGFoZCkpOworCQlwcmludGsoIlNDQiAlZCBQYWNrZXRpemVkIFN0YXR1cyBPdmVycnVuIiwgc2NiaWQpOwogCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKIAkJYnJlYWs7CkBAIC0xODgxLDcgKzE4ODEsNyBAQAogCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKIAkJaWYgKHNjYiA9PSBOVUxMKSB7CiAJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7Ci0JCQlwcmludGYoIkNGRzRJU1RBVDogRnJlZSBTQ0IgJWQgcmVmZXJlbmNlZCIsIHNjYmlkKTsKKwkJCXByaW50aygiQ0ZHNElTVEFUOiBGcmVlIFNDQiAlZCByZWZlcmVuY2VkIiwgc2NiaWQpOwogCQkJcGFuaWMoIkZvciBzYWZldHkiKTsKIAkJfQogCQlhaGRfb3V0cShhaGQsIEhBRERSLCBzY2ItPnNlbnNlX2J1c2FkZHIpOwpAQCAtMTg5Niw3ICsxODk2LDcgQEAKIAkJdV9pbnQgYnVzX3BoYXNlOwogCiAJCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOwotCQlwcmludGYoIiVzOiBJTExFR0FMX1BIQVNFIDB4JXhcbiIsCisJCXByaW50aygiJXM6IElMTEVHQUxfUEhBU0UgMHgleFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGJ1c19waGFzZSk7CiAKIAkJc3dpdGNoIChidXNfcGhhc2UpIHsKQEAgLTE5MDgsNyArMTkwOCw3IEBACiAJCWNhc2UgUF9TVEFUVVM6CiAJCWNhc2UgUF9NRVNHSU46CiAJCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7Ci0JCQlwcmludGYoIiVzOiBJc3N1ZWQgQnVzIFJlc2V0LlxuIiwgYWhkX25hbWUoYWhkKSk7CisJCQlwcmludGsoIiVzOiBJc3N1ZWQgQnVzIFJlc2V0LlxuIiwgYWhkX25hbWUoYWhkKSk7CiAJCQlicmVhazsKIAkJY2FzZSBQX0NPTU1BTkQ6CiAJCXsKQEAgLTE5MzMsNyArMTkzMyw3IEBACiAJCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CiAJCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKIAkJCWlmIChzY2IgPT0gTlVMTCkgewotCQkJCXByaW50ZigiSW52YWxpZCBwaGFzZSB3aXRoIG5vIHZhbGlkIFNDQi4gICIKKwkJCQlwcmludGsoIkludmFsaWQgcGhhc2Ugd2l0aCBubyB2YWxpZCBTQ0IuICAiCiAJCQkJICAgICAgICJSZXNldHRpbmcgYnVzLlxuIik7CiAJCQkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsCiAJCQkJCQkgIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOwpAQCAtMTk5Nyw3ICsxOTk3LDcgQEAKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKIAkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNvbW1hbmQgcGhhc2UgZnJvbSAiCisJCQkJcHJpbnRrKCJVbmV4cGVjdGVkIGNvbW1hbmQgcGhhc2UgZnJvbSAiCiAJCQkJICAgICAgICJwYWNrZXRpemVkIHRhcmdldFxuIik7CiAJCQl9CiAjZW5kaWYKQEAgLTIwMTMsNyArMjAxMyw3IEBACiAJCQogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKSB7Ci0JCQlwcmludGYoIiVzOiBDRkc0T1ZFUlJVTiBtb2RlID0gJXhcbiIsIGFoZF9uYW1lKGFoZCksCisJCQlwcmludGsoIiVzOiBDRkc0T1ZFUlJVTiBtb2RlID0gJXhcbiIsIGFoZF9uYW1lKGFoZCksCiAJCQkgICAgICAgYWhkX2luYihhaGQsIE1PREVfUFRSKSk7CiAJCX0KICNlbmRpZgpAQCAtMjA0OSw3ICsyMDQ5LDcgQEAKIAl7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKLQkJCXByaW50ZigiJXM6IFBEQVRBX1JFSU5JVCAtIERGQ05UUkwgPSAweCV4ICIKKwkJCXByaW50aygiJXM6IFBEQVRBX1JFSU5JVCAtIERGQ05UUkwgPSAweCV4ICIKIAkJCSAgICAgICAiU0dfQ0FDSEVfU0hBRE9XID0gMHgleFxuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW5iKGFoZCwgREZDTlRSTCksCiAJCQkgICAgICAgYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykpOwpAQCAtMjA4Miw3ICsyMDgyLDcgQEAKIAkJCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOwogCQkJaWYgKGJ1c19waGFzZSAhPSBQX01FU0dJTgogCQkJICYmIGJ1c19waGFzZSAhPSBQX01FU0dPVVQpIHsKLQkJCQlwcmludGYoImFoZF9pbnRyOiBIT1NUX01TR19MT09QIGJhZCAiCisJCQkJcHJpbnRrKCJhaGRfaW50cjogSE9TVF9NU0dfTE9PUCBiYWQgIgogCQkJCSAgICAgICAicGhhc2UgMHgleFxuIiwgYnVzX3BoYXNlKTsKIAkJCQkvKgogCQkJCSAqIFByb2JhYmx5IHRyYW5zaXRpb25lZCB0byBidXMgZnJlZSBiZWZvcmUKQEAgLTIxMzEsMjkgKzIxMzEsMjkgQEAKIAkJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CiAJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIGFoZF9pbmIoYWhkLCBTQ1NJU0VRMCkgJiB+RU5TRUxPKTsKIAotCQlwcmludGYoIiVzOiVjOiVkOiBubyBhY3RpdmUgU0NCIGZvciByZWNvbm5lY3RpbmcgIgorCQlwcmludGsoIiVzOiVjOiVkOiBubyBhY3RpdmUgU0NCIGZvciByZWNvbm5lY3RpbmcgIgogCQkgICAgICAgInRhcmdldCAtIGlzc3VpbmcgQlVTIERFVklDRSBSRVNFVFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksICdBJywgYWhkX2luYihhaGQsIFNFTElEKSA+PiA0KTsKLQkJcHJpbnRmKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKKwkJcHJpbnRrKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKIAkJICAgICAgICJSRUcwID09IDB4JXggQUNDVU0gPSAweCV4XG4iLAogCQkgICAgICAgYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCksIGFoZF9pbmIoYWhkLCBTQVZFRF9MVU4pLAogCQkgICAgICAgYWhkX2ludyhhaGQsIFJFRzApLCBhaGRfaW5iKGFoZCwgQUNDVU0pKTsKLQkJcHJpbnRmKCJTRVFfRkxBR1MgPT0gMHgleCwgU0NCUFRSID09IDB4JXgsIEJUVCA9PSAweCV4LCAiCisJCXByaW50aygiU0VRX0ZMQUdTID09IDB4JXgsIFNDQlBUUiA9PSAweCV4LCBCVFQgPT0gMHgleCwgIgogCQkgICAgICAgIlNJTkRFWCA9PSAweCV4XG4iLAogCQkgICAgICAgYWhkX2luYihhaGQsIFNFUV9GTEFHUyksIGFoZF9nZXRfc2NicHRyKGFoZCksCiAJCSAgICAgICBhaGRfZmluZF9idXN5X3RjbChhaGQsCiAJCQkJCSBCVUlMRF9UQ0woYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCksCiAJCQkJCQkgICBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSkpLAogCQkgICAgICAgYWhkX2ludyhhaGQsIFNJTkRFWCkpOwotCQlwcmludGYoIlNFTElEID09IDB4JXgsIFNDQl9TQ1NJSUQgPT0gMHgleCwgU0NCX0xVTiA9PSAweCV4LCAiCisJCXByaW50aygiU0VMSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKIAkJICAgICAgICJTQ0JfQ09OVFJPTCA9PSAweCV4XG4iLAogCQkgICAgICAgYWhkX2luYihhaGQsIFNFTElEKSwgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfU0NTSUlEKSwKIAkJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0xVTiksCiAJCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKSk7Ci0JCXByaW50ZigiU0NTSUJVU1swXSA9PSAweCV4LCBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQlwcmludGsoIlNDU0lCVVNbMF0gPT0gMHgleCwgU0NTSVNJR0kgPT0gMHgleFxuIiwKIAkJICAgICAgIGFoZF9pbmIoYWhkLCBTQ1NJQlVTKSwgYWhkX2luYihhaGQsIFNDU0lTSUdJKSk7Ci0JCXByaW50ZigiU1hGUkNUTDAgPT0gMHgleFxuIiwgYWhkX2luYihhaGQsIFNYRlJDVEwwKSk7Ci0JCXByaW50ZigiU0VRQ1RMMCA9PSAweCV4XG4iLCBhaGRfaW5iKGFoZCwgU0VRQ1RMMCkpOworCQlwcmludGsoIlNYRlJDVEwwID09IDB4JXhcbiIsIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMCkpOworCQlwcmludGsoIlNFUUNUTDAgPT0gMHgleFxuIiwgYWhkX2luYihhaGQsIFNFUUNUTDApKTsKIAkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOwogCQlhaGQtPm1zZ291dF9idWZbMF0gPSBNU0dfQlVTX0RFVl9SRVNFVDsKIAkJYWhkLT5tc2dvdXRfbGVuID0gMTsKQEAgLTIxODEsNyArMjE4MSw3IEBACiAJCXVfaW50IGxhc3RwaGFzZTsKIAogCQlsYXN0cGhhc2UgPSBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKTsKLQkJcHJpbnRmKCIlczolYzolZDogdW5rbm93biBzY3NpIGJ1cyBwaGFzZSAleCwgIgorCQlwcmludGsoIiVzOiVjOiVkOiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICV4LCAiCiAJCSAgICAgICAibGFzdHBoYXNlID0gMHgleC4gIEF0dGVtcHRpbmcgdG8gY29udGludWVcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLCAnQScsCiAJCSAgICAgICBTQ1NJSURfVEFSR0VUKGFoZCwgYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCkpLApAQCAtMjE5Myw3ICsyMTkzLDcgQEAKIAkJdV9pbnQgbGFzdHBoYXNlOwogCiAJCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOwotCQlwcmludGYoIiVzOiVjOiVkOiBNaXNzZWQgYnVzZnJlZS4gIgorCQlwcmludGsoIiVzOiVjOiVkOiBNaXNzZWQgYnVzZnJlZS4gIgogCQkgICAgICAgIkxhc3RwaGFzZSA9IDB4JXgsIEN1cnBoYXNlID0gMHgleFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksICdBJywKIAkJICAgICAgIFNDU0lJRF9UQVJHRVQoYWhkLCBhaGRfaW5iKGFoZCwgU0FWRURfU0NTSUlEKSksCkBAIC0yMjIzLDExICsyMjIzLDExIEBACiAJCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKSB7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoImRhdGEgb3ZlcnJ1biBkZXRlY3RlZCAlcy4gIFRhZyA9PSAweCV4LlxuIiwKKwkJCXByaW50aygiZGF0YSBvdmVycnVuIGRldGVjdGVkICVzLiAgVGFnID09IDB4JXguXG4iLAogCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkobGFzdHBoYXNlKS0+cGhhc2Vtc2csCiAJCQkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIiVzIHNlZW4gRGF0YSBQaGFzZS4gIExlbmd0aCA9ICVsZC4gICIKKwkJCXByaW50aygiJXMgc2VlbiBEYXRhIFBoYXNlLiAgTGVuZ3RoID0gJWxkLiAgIgogCQkJICAgICAgICJOdW1TR3MgPSAlZC5cbiIsCiAJCQkgICAgICAgYWhkX2luYihhaGQsIFNFUV9GTEFHUykgJiBEUEhBU0UKIAkJCSAgICAgICA/ICJIYXZlIiA6ICJIYXZlbid0IiwKQEAgLTIyNTIsNyArMjI1Miw3IEBACiAJCXVfaW50IHNjYmlkOwogCiAJCWFoZF9mZXRjaF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQlwcmludGYoIiVzOiVjOiVkOiVkOiBBdHRlbXB0IHRvIGlzc3VlIG1lc3NhZ2UgZmFpbGVkXG4iLAorCQlwcmludGsoIiVzOiVjOiVkOiVkOiBBdHRlbXB0IHRvIGlzc3VlIG1lc3NhZ2UgZmFpbGVkXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKIAkJICAgICAgIGRldmluZm8ubHVuKTsKIAkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwpAQCAtMjI4NSw3ICsyMjg1LDcgQEAKIAkJCWNhbV9zdGF0dXMgZXJyb3I7CiAKIAkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCXByaW50ZigiVGFzayBNYW5hZ2VtZW50IEZ1bmMgMHgleCBDb21wbGV0ZVxuIiwKKwkJCXByaW50aygiVGFzayBNYW5hZ2VtZW50IEZ1bmMgMHgleCBDb21wbGV0ZVxuIiwKIAkJCSAgICAgICBzY2ItPmhzY2ItPnRhc2tfbWFuYWdlbWVudCk7CiAJCQlsdW4gPSBDQU1fTFVOX1dJTERDQVJEOwogCQkJdGFnID0gU0NCX0xJU1RfTlVMTDsKQEAgLTIzNDEsNyArMjM0MSw3IEBACiAJCQkgKiB0aGUgUUlORklGTyBpZiBpdCBpcyBzdGlsbCB0aGVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwotCQkJcHJpbnRmKCJTQ0IgY29tcGxldGVzIGJlZm9yZSBUTUZcbiIpOworCQkJcHJpbnRrKCJTQ0IgY29tcGxldGVzIGJlZm9yZSBUTUZcbiIpOwogCQkJLyoKIAkJCSAqIEhhbmRsZSBsb3NpbmcgdGhlIHJhY2UuICBXYWl0IHVudGlsIGFueQogCQkJICogY3VycmVudCBzZWxlY3Rpb24gY29tcGxldGVzLiAgV2Ugd2lsbCB0aGVuCkBAIC0yMzY2LDcgKzIzNjYsNyBAQAogCWNhc2UgVFJBQ0VQT0lOVDE6CiAJY2FzZSBUUkFDRVBPSU5UMjoKIAljYXNlIFRSQUNFUE9JTlQzOgotCQlwcmludGYoIiVzOiBUcmFjZXBvaW50ICVkXG4iLCBhaGRfbmFtZShhaGQpLAorCQlwcmludGsoIiVzOiBUcmFjZXBvaW50ICVkXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgc2VxaW50Y29kZSAtIFRSQUNFUE9JTlQwKTsKIAkJYnJlYWs7CiAJY2FzZSBOT19TRVFJTlQ6CkBAIC0yMzc1LDcgKzIzNzUsNyBAQAogCQlhaGRfaGFuZGxlX2h3ZXJyaW50KGFoZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ZigiJXM6IFVuZXhwZWN0ZWQgU0VRSU5UQ09ERSAlZFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJcHJpbnRrKCIlczogVW5leHBlY3RlZCBTRVFJTlRDT0RFICVkXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgc2VxaW50Y29kZSk7CiAJCWJyZWFrOwogCX0KQEAgLTI0NDAsNyArMjQ0MCw3IEBACiAJCXVfaW50IG5vd19sdmQ7CiAKIAkJbm93X2x2ZCA9IGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIEVOQUI0MDsKLQkJcHJpbnRmKCIlczogVHJhbnNjZWl2ZXIgU3RhdGUgSGFzIENoYW5nZWQgdG8gJXMgbW9kZVxuIiwKKwkJcHJpbnRrKCIlczogVHJhbnNjZWl2ZXIgU3RhdGUgSGFzIENoYW5nZWQgdG8gJXMgbW9kZVxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIG5vd19sdmQgPyAiTFZEIiA6ICJTRSIpOwogCQlhaGRfb3V0YihhaGQsIENMUlNJTlQwLCBDTFJJT0VSUik7CiAJCS8qCkBAIC0yNDUyLDEyICsyNDUyLDEyIEBACiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJfSBlbHNlIGlmICgoc3RhdHVzMCAmIE9WRVJSVU4pICE9IDApIHsKIAotCQlwcmludGYoIiVzOiBTQ1NJIG9mZnNldCBvdmVycnVuIGRldGVjdGVkLiAgUmVzZXR0aW5nIGJ1cy5cbiIsCisJCXByaW50aygiJXM6IFNDU0kgb2Zmc2V0IG92ZXJydW4gZGV0ZWN0ZWQuICBSZXNldHRpbmcgYnVzLlxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CiAJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVJTVEkpICE9IDApIHsKIAotCQlwcmludGYoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgQVxuIiwgYWhkX25hbWUoYWhkKSk7CisJCXByaW50aygiJXM6IFNvbWVvbmUgcmVzZXQgY2hhbm5lbCBBXG4iLCBhaGRfbmFtZShhaGQpKTsKIAkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL0ZBTFNFKTsKIAl9IGVsc2UgaWYgKChzdGF0dXMgJiBTQ1NJUEVSUikgIT0gMCkgewogCkBAIC0yNDY3LDcgKzI0NjcsNyBAQAogCQlhaGRfaGFuZGxlX3RyYW5zbWlzc2lvbl9lcnJvcihhaGQpOwogCX0gZWxzZSBpZiAobHFvc3RhdDAgIT0gMCkgewogCi0JCXByaW50ZigiJXM6IGxxb3N0YXQwID09IDB4JXghXG4iLCBhaGRfbmFtZShhaGQpLCBscW9zdGF0MCk7CisJCXByaW50aygiJXM6IGxxb3N0YXQwID09IDB4JXghXG4iLCBhaGRfbmFtZShhaGQpLCBscW9zdGF0MCk7CiAJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMCwgbHFvc3RhdDApOwogCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9DTFJMUU9fQVVUT0NMUl9CVUcpICE9IDApCiAJCQlhaGRfb3V0YihhaGQsIENMUkxRT0lOVDEsIDApOwpAQCAtMjQ5Nyw3ICsyNDk3LDcgQEAKIAkJc2NiaWQgPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCk7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IGFoZF9pbnRyIC0gcmVmZXJlbmNlZCBzY2Igbm90ICIKKwkJCXByaW50aygiJXM6IGFoZF9pbnRyIC0gcmVmZXJlbmNlZCBzY2Igbm90ICIKIAkJCSAgICAgICAidmFsaWQgZHVyaW5nIFNFTFRPIHNjYigweCV4KVxuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CiAJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CkBAIC0yNTA2LDcgKzI1MDYsNyBAQAogI2lmZGVmIEFIRF9ERUJVRwogCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19TRUxUTykgIT0gMCkgewogCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQlwcmludGYoIlNhdyBTZWxlY3Rpb24gVGltZW91dCBmb3IgU0NCIDB4JXhcbiIsCisJCQkJcHJpbnRrKCJTYXcgU2VsZWN0aW9uIFRpbWVvdXQgZm9yIFNDQiAweCV4XG4iLAogCQkJCSAgICAgICBzY2JpZCk7CiAJCQl9CiAjZW5kaWYKQEAgLTI1MzQsNyArMjUzNCw3IEBACiAJCWFoZF9pb2NlbGxfZmlyc3Rfc2VsZWN0aW9uKGFoZCk7CiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJfSBlbHNlIGlmIChzdGF0dXMzICE9IDApIHsKLQkJcHJpbnRmKCIlczogU0NTSSBDZWxsIHBhcml0eSBlcnJvciBTU1RBVDMgPT0gMHgleFxuIiwKKwkJcHJpbnRrKCIlczogU0NTSSBDZWxsIHBhcml0eSBlcnJvciBTU1RBVDMgPT0gMHgleFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIHN0YXR1czMpOwogCQlhaGRfb3V0YihhaGQsIENMUlNJTlQzLCBzdGF0dXMzKTsKIAl9IGVsc2UgaWYgKChscWlzdGF0MSAmIChMUUlQSEFTRV9MUXxMUUlQSEFTRV9OTFEpKSAhPSAwKSB7CkBAIC0yNTg3LDcgKzI1ODcsNyBAQAogCQkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwogCQkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CiAJCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCQlwcmludGYoIiVzOiBJbnZhbGlkIFNDQiAlZCBpbiBERkYlZCAiCisJCQkJcHJpbnRrKCIlczogSW52YWxpZCBTQ0IgJWQgaW4gREZGJWQgIgogCQkJCSAgICAgICAiZHVyaW5nIHVuZXhwZWN0ZWQgYnVzZnJlZVxuIiwKIAkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQsIG1vZGUpOwogCQkJCXBhY2tldGl6ZWQgPSAwOwpAQCAtMjYyMCw3ICsyNjIwLDcgQEAKIAogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCi0JCQlwcmludGYoIlNhdyBCdXNmcmVlLiAgQnVzZnJlZXRpbWUgPSAweCV4LlxuIiwKKwkJCXByaW50aygiU2F3IEJ1c2ZyZWUuICBCdXNmcmVldGltZSA9IDB4JXguXG4iLAogCQkJICAgICAgIGJ1c2ZyZWV0aW1lKTsKICNlbmRpZgogCQkvKgpAQCAtMjY2MSw3ICsyNjYxLDcgQEAKIAkJCWFoZF91bnBhdXNlKGFoZCk7CiAJCX0KIAl9IGVsc2UgewotCQlwcmludGYoIiVzOiBNaXNzaW5nIGNhc2UgaW4gYWhkX2hhbmRsZV9zY3NpaW50LiBzdGF0dXMgPSAleFxuIiwKKwkJcHJpbnRrKCIlczogTWlzc2luZyBjYXNlIGluIGFoZF9oYW5kbGVfc2NzaWludC4gc3RhdHVzID0gJXhcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzdGF0dXMpOwogCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAJCWFoZF9jbGVhcl9pbnRzdGF0KGFoZCk7CkBAIC0yNjk3LDcgKzI2OTcsNyBAQAogCQkgfHwgKGxxaXN0YXRlID09IDB4MjkpKSB7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKSB7Ci0JCQkJcHJpbnRmKCIlczogTkxRQ1JDIGZvdW5kIHZpYSBMUUlTVEFURVxuIiwKKwkJCQlwcmludGsoIiVzOiBOTFFDUkMgZm91bmQgdmlhIExRSVNUQVRFXG4iLAogCQkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKIAkJCX0KICNlbmRpZgpAQCAtMjcyOSwxOCArMjcyOSwxOCBAQAogCiAJY3VyX2NvbCA9IDA7CiAJaWYgKHNpbGVudCA9PSBGQUxTRSkgewotCQlwcmludGYoIiVzOiBUcmFuc21pc3Npb24gZXJyb3IgZGV0ZWN0ZWRcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlwcmludGsoIiVzOiBUcmFuc21pc3Npb24gZXJyb3IgZGV0ZWN0ZWRcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlhaGRfbHFpc3RhdDFfcHJpbnQobHFpc3RhdDEsICZjdXJfY29sLCA1MCk7CiAJCWFoZF9sYXN0cGhhc2VfcHJpbnQobGFzdHBoYXNlLCAmY3VyX2NvbCwgNTApOwogCQlhaGRfc2NzaXNpZ2lfcHJpbnQoY3VycGhhc2UsICZjdXJfY29sLCA1MCk7CiAJCWFoZF9wZXJyZGlhZ19wcmludChwZXJyZGlhZywgJmN1cl9jb2wsIDUwKTsKLQkJcHJpbnRmKCJcbiIpOworCQlwcmludGsoIlxuIik7CiAJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKIAl9CiAKIAlpZiAoKGxxaXN0YXQxICYgKExRSU9WRVJJX0xRfExRSU9WRVJJX05MUSkpICE9IDApIHsKIAkJaWYgKHNpbGVudCA9PSBGQUxTRSkgewotCQkJcHJpbnRmKCIlczogR3Jvc3MgcHJvdG9jb2wgZXJyb3IgZHVyaW5nIGluY29taW5nICIKKwkJCXByaW50aygiJXM6IEdyb3NzIHByb3RvY29sIGVycm9yIGR1cmluZyBpbmNvbWluZyAiCiAJCQkgICAgICAgInBhY2tldC4gIGxxaXN0YXQxID09IDB4JXguICBSZXNldHRpbmcgYnVzLlxuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBscWlzdGF0MSk7CiAJCX0KQEAgLTI3NjksNyArMjc2OSw3IEBACiAJCSAqIChTUEk0UjA5IDEwLjcuMy4zLjMpCiAJCSAqLwogCQlhaGRfb3V0YihhaGQsIExRQ1RMMiwgTFFJUkVUUlkpOwotCQlwcmludGYoIkxRSVJldHJ5IGZvciBMUUlDUkNJX0xRIHRvIHJlbGVhc2UgQUNLXG4iKTsKKwkJcHJpbnRrKCJMUUlSZXRyeSBmb3IgTFFJQ1JDSV9MUSB0byByZWxlYXNlIEFDS1xuIik7CiAJfSBlbHNlIGlmICgobHFpc3RhdDEgJiBMUUlDUkNJX05MUSkgIT0gMCkgewogCQkvKgogCQkgKiBXZSBkZXRlY3RlZCBhIENSQyBlcnJvciBpbiBhIE5PTi1MUSBwYWNrZXQuCkBAIC0yODE3LDIyICsyODE3LDIyIEBACiAJCSAqIEJ1c2ZyZWUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQuCiAJCSAqLwogCQlpZiAoc2lsZW50ID09IEZBTFNFKQotCQkJcHJpbnRmKCJMUUlDUkNfTkxRXG4iKTsKKwkJCXByaW50aygiTFFJQ1JDX05MUVxuIik7CiAJCWlmIChzY2IgPT0gTlVMTCkgewotCQkJcHJpbnRmKCIlczogTm8gU0NCIHZhbGlkIGZvciBMUUlDUkNfTkxRLiAgIgorCQkJcHJpbnRrKCIlczogTm8gU0NCIHZhbGlkIGZvciBMUUlDUkNfTkxRLiAgIgogCQkJICAgICAgICJSZXNldHRpbmcgYnVzXG4iLCBhaGRfbmFtZShhaGQpKTsKIAkJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKIAkJCXJldHVybjsKIAkJfQogCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgTFFJQkFETFFJKSAhPSAwKSB7Ci0JCXByaW50ZigiTmVlZCB0byBoYW5kbGUgQkFETFFJIVxuIik7CisJCXByaW50aygiTmVlZCB0byBoYW5kbGUgQkFETFFJIVxuIik7CiAJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoKHBlcnJkaWFnICYgKFBBUklUWUVSUnxQUkVWUEhBU0UpKSA9PSBQQVJJVFlFUlIpIHsKIAkJaWYgKChjdXJwaGFzZSAmIH5QX0RBVEFJTl9EVCkgIT0gMCkgewogCQkJLyogQWNrIHRoZSBieXRlLiAgU28gd2UgY2FuIGNvbnRpbnVlLiAqLwogCQkJaWYgKHNpbGVudCA9PSBGQUxTRSkKLQkJCQlwcmludGYoIkFja2luZyAlcyB0byBjbGVhciBwZXJyb3JcbiIsCisJCQkJcHJpbnRrKCJBY2tpbmcgJXMgdG8gY2xlYXIgcGVycm9yXG4iLAogCQkJCSAgICBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGN1cnBoYXNlKS0+cGhhc2Vtc2cpOwogCQkJYWhkX2luYihhaGQsIFNDU0lEQVQpOwogCQl9CkBAIC0yODc3LDEwICsyODc3LDEwIEBACiAJaWYgKChhaGRfaW5iKGFoZCwgU0NTSVNJR08pICYgQVROTykgIT0gMAogCSAmJiAoYWhkX2luYihhaGQsIE1ERkZTVEFUKSAmIERMWkVSTykgIT0gMCkgewogCQlpZiAoKGxxaXN0YXQxICYgTFFJUEhBU0VfTFEpICE9IDApIHsKLQkJCXByaW50ZigiTFFJUkVUUlkgZm9yIExRSVBIQVNFX0xRXG4iKTsKKwkJCXByaW50aygiTFFJUkVUUlkgZm9yIExRSVBIQVNFX0xRXG4iKTsKIAkJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CiAJCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgTFFJUEhBU0VfTkxRKSAhPSAwKSB7Ci0JCQlwcmludGYoIkxRSVJFVFJZIGZvciBMUUlQSEFTRV9OTFFcbiIpOworCQkJcHJpbnRrKCJMUUlSRVRSWSBmb3IgTFFJUEhBU0VfTkxRXG4iKTsKIAkJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CiAJCX0gZWxzZQogCQkJcGFuaWMoImFoZF9oYW5kbGVfbHFpcGhhc2VfZXJyb3I6IE5vIHBoYXNlIGVycm9yc1xuIik7CkBAIC0yODg4LDcgKzI4ODgsNyBAQAogCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRmKCJSZXNldGluZyBDaGFubmVsIGZvciBMUUkgUGhhc2UgZXJyb3JcbiIpOworCQlwcmludGsoIlJlc2V0aW5nIENoYW5uZWwgZm9yIExRSSBQaGFzZSBlcnJvclxuIik7CiAJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKIAkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOwogCX0KQEAgLTI5NzYsNyArMjk3Niw3IEBACiAJCWlmIChzY2ItPmNyY19yZXRyeV9jb3VudCA8IEFIRF9NQVhfTFFfQ1JDX0VSUk9SUykgewogCQkJaWYgKFNDQl9JU19TSUxFTlQoc2NiKSA9PSBGQUxTRSkgewogCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQlwcmludGYoIlByb2JhYmxlIG91dGdvaW5nIExRIENSQyBlcnJvci4gICIKKwkJCQlwcmludGsoIlByb2JhYmxlIG91dGdvaW5nIExRIENSQyBlcnJvci4gICIKIAkJCQkgICAgICAgIlJldHJ5aW5nIGNvbW1hbmRcbiIpOwogCQkJfQogCQkJc2NiLT5jcmNfcmV0cnlfY291bnQrKzsKQEAgLTI5OTgsNyArMjk5OCw3IEBACiAJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlNDU0lQRVJSfENMUkJVU0ZSRUUpOwogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01BU0tFRF9FUlJPUlMpICE9IDApCi0JCQlwcmludGYoIiVzOiBQYXJpdHkgb24gbGFzdCBSRVEgZGV0ZWN0ZWQgIgorCQkJcHJpbnRrKCIlczogUGFyaXR5IG9uIGxhc3QgUkVRIGRldGVjdGVkICIKIAkJCSAgICAgICAiZHVyaW5nIGJ1c2ZyZWUgcGhhc2UuXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogI2VuZGlmCkBAIC0zMDEyLDcgKzMwMTIsNyBAQAogCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCXByaW50ZigiVW5leHBlY3RlZCBQS1QgYnVzZnJlZSBjb25kaXRpb25cbiIpOworCQlwcmludGsoIlVuZXhwZWN0ZWQgUEtUIGJ1c2ZyZWUgY29uZGl0aW9uXG4iKTsKIAkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOwogCQlhaGRfYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwgJ0EnLAogCQkJICAgICAgIFNDQl9HRVRfTFVOKHNjYiksIFNDQl9HRVRfVEFHKHNjYiksCkBAIC0zMDIxLDcgKzMwMjEsNyBAQAogCQkvKiBSZXR1cm4gcmVzdGFydGluZyB0aGUgc2VxdWVuY2VyLiAqLwogCQlyZXR1cm4gKDEpOwogCX0KLQlwcmludGYoIiVzOiBVbmV4cGVjdGVkIFBLVCBidXNmcmVlIGNvbmRpdGlvblxuIiwgYWhkX25hbWUoYWhkKSk7CisJcHJpbnRrKCIlczogVW5leHBlY3RlZCBQS1QgYnVzZnJlZSBjb25kaXRpb25cbiIsIGFoZF9uYW1lKGFoZCkpOwogCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKIAkvKiBSZXN0YXJ0IHRoZSBzZXF1ZW5jZXIuICovCiAJcmV0dXJuICgxKTsKQEAgLTMwNzYsMTQgKzMwNzYsMTQgQEAKIAogCQkJaWYgKHNjYiA9PSBOVUxMKSB7CiAJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7Ci0JCQkJcHJpbnRmKCJBYm9ydCBmb3IgdW5pZGVudGlmaWVkICIKKwkJCQlwcmludGsoIkFib3J0IGZvciB1bmlkZW50aWZpZWQgIgogCQkJCSAgICAgICAiY29ubmVjdGlvbiBjb21wbGV0ZWQuXG4iKTsKIAkJCQkvKiByZXN0YXJ0IHRoZSBzZXF1ZW5jZXIuICovCiAJCQkJcmV0dXJuICgxKTsKIAkJCX0KIAkJCXNlbnRfbXNnID0gYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4IC0gMV07CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIlNDQiAlZCAtIEFib3J0JXMgQ29tcGxldGVkLlxuIiwKKwkJCXByaW50aygiU0NCICVkIC0gQWJvcnQlcyBDb21wbGV0ZWQuXG4iLAogCQkJICAgICAgIFNDQl9HRVRfVEFHKHNjYiksCiAJCQkgICAgICAgc2VudF9tc2cgPT0gTVNHX0FCT1JUX1RBRyA/ICIiIDogIiBUYWciKTsKIApAQCAtMzEwOSw3ICszMTA5LDcgQEAKIAkJCWZvdW5kID0gYWhkX2Fib3J0X3NjYnMoYWhkLCB0YXJnZXQsICdBJywgc2F2ZWRfbHVuLAogCQkJCQkgICAgICAgdGFnLCBST0xFX0lOSVRJQVRPUiwKIAkJCQkJICAgICAgIENBTV9SRVFfQUJPUlRFRCk7Ci0JCQlwcmludGYoImZvdW5kID09IDB4JXhcbiIsIGZvdW5kKTsKKwkJCXByaW50aygiZm91bmQgPT0gMHgleFxuIiwgZm91bmQpOwogCQkJcHJpbnRlcnJvciA9IDA7CiAJCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHXzFCLAogCQkJCQlNU0dfQlVTX0RFVl9SRVNFVCwgVFJVRSkpIHsKQEAgLTMxNDcsNyArMzE0Nyw3IEBACiAJCQkgKi8KICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCJQUFIgbmVnb3RpYXRpb24gcmVqZWN0ZWQgYnVzZnJlZS5cbiIpOworCQkJCXByaW50aygiUFBSIG5lZ290aWF0aW9uIHJlamVjdGVkIGJ1c2ZyZWUuXG4iKTsKICNlbmRpZgogCQkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby5jaGFubmVsLAogCQkJCQkJICAgIGRldmluZm8ub3VyX3Njc2lpZCwKQEAgLTMxOTEsNyArMzE5MSw3IEBACiAJCQkgKi8KICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCJXRFRSIG5lZ290aWF0aW9uIHJlamVjdGVkIGJ1c2ZyZWUuXG4iKTsKKwkJCQlwcmludGsoIldEVFIgbmVnb3RpYXRpb24gcmVqZWN0ZWQgYnVzZnJlZS5cbiIpOwogI2VuZGlmCiAJCQlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sCiAJCQkJICAgICAgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKQEAgLTMyMTYsNyArMzIxNiw3IEBACiAJCQkgKi8KICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCJTRFRSIG5lZ290aWF0aW9uIHJlamVjdGVkIGJ1c2ZyZWUuXG4iKTsKKwkJCQlwcmludGsoIlNEVFIgbmVnb3RpYXRpb24gcmVqZWN0ZWQgYnVzZnJlZS5cbiIpOwogI2VuZGlmCiAJCQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sCiAJCQkJCS8qcGVyaW9kKi8wLCAvKm9mZnNldCovMCwKQEAgLTMyNDAsNyArMzI0MCw3IEBACiAKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCJFeHBlY3RlZCBJREUgQnVzZnJlZVxuIik7CisJCQkJcHJpbnRrKCJFeHBlY3RlZCBJREUgQnVzZnJlZVxuIik7CiAjZW5kaWYKIAkJCXByaW50ZXJyb3IgPSAwOwogCQl9IGVsc2UgaWYgKChhaGQtPm1zZ19mbGFncyAmIE1TR19GTEFHX0VYUEVDVF9RQVNSRUpfQlVTRlJFRSkKQEAgLTMyNDksNyArMzI0OSw3IEBACiAKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCJFeHBlY3RlZCBRQVMgUmVqZWN0IEJ1c2ZyZWVcbiIpOworCQkJCXByaW50aygiRXhwZWN0ZWQgUUFTIFJlamVjdCBCdXNmcmVlXG4iKTsKICNlbmRpZgogCQkJcHJpbnRlcnJvciA9IDA7CiAJCX0KQEAgLTMyNzUsNyArMzI3NSw3IEBACiAJCX0gZWxzZSB7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQotCQkJCXByaW50ZigiUFBSIE5lZ290aWF0aW9uIEJ1c2ZyZWUuXG4iKTsKKwkJCQlwcmludGsoIlBQUiBOZWdvdGlhdGlvbiBCdXNmcmVlLlxuIik7CiAjZW5kaWYKIAkJCWFoZF9kb25lKGFoZCwgc2NiKTsKIAkJfQpAQCAtMzMwMiw5ICszMzAyLDkgQEAKIAkJCSAqIFdlIGhhZCBub3QgZnVsbHkgaWRlbnRpZmllZCB0aGlzIGNvbm5lY3Rpb24sCiAJCQkgKiBzbyB3ZSBjYW5ub3QgYWJvcnQgYW55dGhpbmcuCiAJCQkgKi8KLQkJCXByaW50ZigiJXM6ICIsIGFoZF9uYW1lKGFoZCkpOworCQkJcHJpbnRrKCIlczogIiwgYWhkX25hbWUoYWhkKSk7CiAJCX0KLQkJcHJpbnRmKCJVbmV4cGVjdGVkIGJ1c2ZyZWUgJXMsICVkIFNDQnMgYWJvcnRlZCwgIgorCQlwcmludGsoIlVuZXhwZWN0ZWQgYnVzZnJlZSAlcywgJWQgU0NCcyBhYm9ydGVkLCAiCiAJCSAgICAgICAiUFJHTUNOVCA9PSAweCV4XG4iLAogCQkgICAgICAgYWhkX2xvb2t1cF9waGFzZV9lbnRyeShsYXN0cGhhc2UpLT5waGFzZW1zZywKIAkJICAgICAgIGFib3J0ZWQsCkBAIC0zMzQyLDcgKzMzNDIsNyBAQAogCQkgKiB0byBtYXRjaC4KIAkJICovCiAJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQlwcmludGYoIlRhcmdldCBkaWQgbm90IHNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZS4gIgorCQlwcmludGsoIlRhcmdldCBkaWQgbm90IHNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZS4gIgogCQkgICAgICAgIkxBU1RQSEFTRSA9IDB4JXguXG4iLCBsYXN0cGhhc2UpOwogCQlzY2IgPSBOVUxMOwogCX0gZWxzZSBpZiAoc2NiID09IE5VTEwpIHsKQEAgLTMzNTEsMTMgKzMzNTEsMTMgQEAKIAkJICogdHJhbnNhY3Rpb24uICBQcmludCBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIGJ1cy4KIAkJICovCiAJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQlwcmludGYoIk5vIFNDQiBmb3VuZCBkdXJpbmcgcHJvdG9jb2wgdmlvbGF0aW9uXG4iKTsKKwkJcHJpbnRrKCJObyBTQ0IgZm91bmQgZHVyaW5nIHByb3RvY29sIHZpb2xhdGlvblxuIik7CiAJCWdvdG8gcHJvdG9fdmlvbGF0aW9uX3Jlc2V0OwogCX0gZWxzZSB7CiAJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1NFUVVFTkNFX0ZBSUwpOwogCQlpZiAoKHNlcV9mbGFncyAmIE5PX0NEQl9TRU5UKSAhPSAwKSB7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIk5vIG9yIGluY29tcGxldGUgQ0RCIHNlbnQgdG8gZGV2aWNlLlxuIik7CisJCQlwcmludGsoIk5vIG9yIGluY29tcGxldGUgQ0RCIHNlbnQgdG8gZGV2aWNlLlxuIik7CiAJCX0gZWxzZSBpZiAoKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpCiAJCQkgICYgU1RBVFVTX1JDVkQpID09IDApIHsKIAkJCS8qCkBAIC0zMzY4LDEwICszMzY4LDEwIEBACiAJCQkgKiBtZXNzYWdlLgogCQkJICovCiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIkNvbXBsZXRlZCBjb21tYW5kIHdpdGhvdXQgc3RhdHVzLlxuIik7CisJCQlwcmludGsoIkNvbXBsZXRlZCBjb21tYW5kIHdpdGhvdXQgc3RhdHVzLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIlVua25vd24gcHJvdG9jb2wgdmlvbGF0aW9uLlxuIik7CisJCQlwcmludGsoIlVua25vd24gcHJvdG9jb2wgdmlvbGF0aW9uLlxuIik7CiAJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAJCX0KIAl9CkBAIC0zMzg1LDcgKzMzODUsNyBAQAogCQkgKiBpdCBhd2F5IHdpdGggYSBidXMgcmVzZXQuCiAJCSAqLwogCQlmb3VuZCA9IGFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCBUUlVFKTsKLQkJcHJpbnRmKCIlczogSXNzdWVkIENoYW5uZWwgJWMgQnVzIFJlc2V0LiAiCisJCXByaW50aygiJXM6IElzc3VlZCBDaGFubmVsICVjIEJ1cyBSZXNldC4gIgogCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZFxuIiwgYWhkX25hbWUoYWhkKSwgJ0EnLCBmb3VuZCk7CiAJfSBlbHNlIHsKIAkJLyoKQEAgLTM0MDcsNyArMzQwNyw3IEBACiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CiAJCQlzY2ItPmZsYWdzIHw9IFNDQl9BQk9SVDsKIAkJfQotCQlwcmludGYoIlByb3RvY29sIHZpb2xhdGlvbiAlcy4gIEF0dGVtcHRpbmcgdG8gYWJvcnQuXG4iLAorCQlwcmludGsoIlByb3RvY29sIHZpb2xhdGlvbiAlcy4gIEF0dGVtcHRpbmcgdG8gYWJvcnQuXG4iLAogCQkgICAgICAgYWhkX2xvb2t1cF9waGFzZV9lbnRyeShjdXJwaGFzZSktPnBoYXNlbXNnKTsKIAl9CiB9CkBAIC0zNDI1LDcgKzM0MjUsNyBAQAogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKIAkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKLQkJcHJpbnRmKCJGb3JjaW5nIHJlbmVnb3RpYXRpb25cbiIpOworCQlwcmludGsoIkZvcmNpbmcgcmVuZWdvdGlhdGlvblxuIik7CiAJfQogI2VuZGlmCiAJdGFyZ19pbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsCkBAIC0zNDg2LDcgKzM0ODYsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKHN0ZXBzID4gQUhEX01BWF9TVEVQUykgewotCQkJcHJpbnRmKCIlczogSW5maW5pdGUgbG9vcCBpbiBjcml0aWNhbCBzZWN0aW9uXG4iCisJCQlwcmludGsoIiVzOiBJbmZpbml0ZSBsb29wIGluIGNyaXRpY2FsIHNlY3Rpb25cbiIKIAkJCSAgICAgICAiJXM6IEZpcnN0IEluc3RydWN0aW9uIDB4JXggbm93IDB4JXhcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX25hbWUoYWhkKSwgZmlyc3RfaW5zdHIsCiAJCQkgICAgICAgc2VxYWRkcik7CkBAIC0zNDk3LDcgKzM0OTcsNyBAQAogCQlzdGVwcysrOwogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCi0JCQlwcmludGYoIiVzOiBTaW5nbGUgc3RlcHBpbmcgYXQgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCXByaW50aygiJXM6IFNpbmdsZSBzdGVwcGluZyBhdCAweCV4XG4iLCBhaGRfbmFtZShhaGQpLAogCQkJICAgICAgIHNlcWFkZHIpOwogI2VuZGlmCiAJCWlmIChzdGVwcGluZyA9PSBGQUxTRSkgewpAQCAtMzYwMSwxNiArMzYwMSwxNiBAQAogCWludCBpOwogCiAJaHNjYiA9IHNjYi0+aHNjYjsKLQlwcmludGYoInNjYjolcCBjb250cm9sOjB4JXggc2NzaWlkOjB4JXggbHVuOiVkIGNkYl9sZW46JWRcbiIsCisJcHJpbnRrKCJzY2I6JXAgY29udHJvbDoweCV4IHNjc2lpZDoweCV4IGx1bjolZCBjZGJfbGVuOiVkXG4iLAogCSAgICAgICAodm9pZCAqKXNjYiwKIAkgICAgICAgaHNjYi0+Y29udHJvbCwKIAkgICAgICAgaHNjYi0+c2NzaWlkLAogCSAgICAgICBoc2NiLT5sdW4sCiAJICAgICAgIGhzY2ItPmNkYl9sZW4pOwotCXByaW50ZigiU2hhcmVkIERhdGE6ICIpOworCXByaW50aygiU2hhcmVkIERhdGE6ICIpOwogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiKTsgaSsrKQotCQlwcmludGYoIiUjMDJ4IiwgaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiW2ldKTsKLQlwcmludGYoIiAgICAgICAgZGF0YXB0cjolI3gleCBkYXRhY250OiUjeCBzZ3B0cjolI3ggdGFnOiUjeFxuIiwKKwkJcHJpbnRrKCIlIzAyeCIsIGhzY2ItPnNoYXJlZF9kYXRhLmlkYXRhLmNkYltpXSk7CisJcHJpbnRrKCIgICAgICAgIGRhdGFwdHI6JSN4JXggZGF0YWNudDolI3ggc2dwdHI6JSN4IHRhZzolI3hcbiIsCiAJICAgICAgICh1aW50MzJfdCkoKGFoZF9sZTY0dG9oKGhzY2ItPmRhdGFwdHIpID4+IDMyKSAmIDB4RkZGRkZGRkYpLAogCSAgICAgICAodWludDMyX3QpKGFoZF9sZTY0dG9oKGhzY2ItPmRhdGFwdHIpICYgMHhGRkZGRkZGRiksCiAJICAgICAgIGFoZF9sZTMydG9oKGhzY2ItPmRhdGFjbnQpLApAQCAtMzYzNyw3ICszNjM3LDcgQEAKIAkgJiYgYWhkLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF0gIT0gbWFzdGVyX3RzdGF0ZSkKIAkJcGFuaWMoIiVzOiBhaGRfYWxsb2NfdHN0YXRlIC0gVGFyZ2V0IGFscmVhZHkgYWxsb2NhdGVkIiwKIAkJICAgICAgYWhkX25hbWUoYWhkKSk7Ci0JdHN0YXRlID0gbWFsbG9jKHNpemVvZigqdHN0YXRlKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwl0c3RhdGUgPSBrbWFsbG9jKHNpemVvZigqdHN0YXRlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHRzdGF0ZSA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCkBAIC0zNjgyLDcgKzM2ODIsNyBAQAogCiAJdHN0YXRlID0gYWhkLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF07CiAJaWYgKHRzdGF0ZSAhPSBOVUxMKQotCQlmcmVlKHRzdGF0ZSwgTV9ERVZCVUYpOworCQlrZnJlZSh0c3RhdGUpOwogCWFoZC0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdID0gTlVMTDsKIH0KICNlbmRpZgpAQCAtMzk0MiwzNyArMzk0MiwzNyBAQAogCQkJaWYgKG9mZnNldCAhPSAwKSB7CiAJCQkJaW50IG9wdGlvbnM7CiAKLQkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgc3luY2hyb25vdXMgd2l0aCAiCisJCQkJcHJpbnRrKCIlczogdGFyZ2V0ICVkIHN5bmNocm9ub3VzIHdpdGggIgogCQkJCSAgICAgICAicGVyaW9kID0gMHgleCwgb2Zmc2V0ID0gMHgleCIsCiAJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPnRhcmdldCwKIAkJCQkgICAgICAgcGVyaW9kLCBvZmZzZXQpOwogCQkJCW9wdGlvbnMgPSAwOwogCQkJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9SRF9TVFJNKSAhPSAwKSB7Ci0JCQkJCXByaW50ZigiKFJEU1RSTSIpOworCQkJCQlwcmludGsoIihSRFNUUk0iKTsKIAkJCQkJb3B0aW9ucysrOwogCQkJCX0KIAkJCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwKSB7Ci0JCQkJCXByaW50ZigiJXMiLCBvcHRpb25zID8gInxEVCIgOiAiKERUIik7CisJCQkJCXByaW50aygiJXMiLCBvcHRpb25zID8gInxEVCIgOiAiKERUIik7CiAJCQkJCW9wdGlvbnMrKzsKIAkJCQl9CiAJCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgewotCQkJCQlwcmludGYoIiVzIiwgb3B0aW9ucyA/ICJ8SVUiIDogIihJVSIpOworCQkJCQlwcmludGsoIiVzIiwgb3B0aW9ucyA/ICJ8SVUiIDogIihJVSIpOwogCQkJCQlvcHRpb25zKys7CiAJCQkJfQogCQkJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9SVEkpICE9IDApIHsKLQkJCQkJcHJpbnRmKCIlcyIsIG9wdGlvbnMgPyAifFJUSSIgOiAiKFJUSSIpOworCQkJCQlwcmludGsoIiVzIiwgb3B0aW9ucyA/ICJ8UlRJIiA6ICIoUlRJIik7CiAJCQkJCW9wdGlvbnMrKzsKIAkJCQl9CiAJCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1FBU19SRVEpICE9IDApIHsKLQkJCQkJcHJpbnRmKCIlcyIsIG9wdGlvbnMgPyAifFFBUyIgOiAiKFFBUyIpOworCQkJCQlwcmludGsoIiVzIiwgb3B0aW9ucyA/ICJ8UUFTIiA6ICIoUUFTIik7CiAJCQkJCW9wdGlvbnMrKzsKIAkJCQl9CiAJCQkJaWYgKG9wdGlvbnMgIT0gMCkKLQkJCQkJcHJpbnRmKCIpXG4iKTsKKwkJCQkJcHJpbnRrKCIpXG4iKTsKIAkJCQllbHNlCi0JCQkJCXByaW50ZigiXG4iKTsKKwkJCQkJcHJpbnRrKCJcbiIpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgdXNpbmcgIgorCQkJCXByaW50aygiJXM6IHRhcmdldCAlZCB1c2luZyAiCiAJCQkJICAgICAgICJhc3luY2hyb25vdXMgdHJhbnNmZXJzJXNcbiIsCiAJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPnRhcmdldCwKIAkJCQkgICAgICAgKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUUFTX1JFUSkgIT0gMApAQCAtNDAwMCw3ICs0MDAwLDcgQEAKICNpZmRlZiBBSERfREVCVUcKIAkJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CiAJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7Ci0JCQkJCXByaW50ZigiRXhwZWN0aW5nIElVIENoYW5nZSBidXNmcmVlXG4iKTsKKwkJCQkJcHJpbnRrKCJFeHBlY3RpbmcgSVUgQ2hhbmdlIGJ1c2ZyZWVcbiIpOwogCQkJCX0KICNlbmRpZgogCQkJCWFoZC0+bXNnX2ZsYWdzIHw9IE1TR19GTEFHX0VYUEVDVF9QUFJfQlVTRlJFRQpAQCAtNDAwOSw3ICs0MDA5LDcgQEAKIAkJCWlmICgob2xkX3BwciAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgewogI2lmZGVmIEFIRF9ERUJVRwogCQkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJCXByaW50ZigiUFBSIHdpdGggSVVfUkVRIG91dHN0YW5kaW5nXG4iKTsKKwkJCQkJcHJpbnRrKCJQUFIgd2l0aCBJVV9SRVEgb3V0c3RhbmRpbmdcbiIpOwogI2VuZGlmCiAJCQkJYWhkLT5tc2dfZmxhZ3MgfD0gTVNHX0ZMQUdfRVhQRUNUX1BQUl9CVVNGUkVFOwogCQkJfQpAQCAtNDA2MSw3ICs0MDYxLDcgQEAKIAkJYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCiAJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfVFJBTlNGRVJfTkVHKTsKIAkJaWYgKGJvb3R2ZXJib3NlKSB7Ci0JCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgdXNpbmcgJWRiaXQgdHJhbnNmZXJzXG4iLAorCQkJcHJpbnRrKCIlczogdGFyZ2V0ICVkIHVzaW5nICVkYml0IHRyYW5zZmVyc1xuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT50YXJnZXQsCiAJCQkgICAgICAgOCAqICgweDAxIDw8IHdpZHRoKSk7CiAJCX0KQEAgLTQzMzcsNyArNDMzNyw3IEBACiB2b2lkCiBhaGRfcHJpbnRfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKIHsKLQlwcmludGYoIiVzOiVjOiVkOiVkOiAiLCBhaGRfbmFtZShhaGQpLCAnQScsCisJcHJpbnRrKCIlczolYzolZDolZDogIiwgYWhkX25hbWUoYWhkKSwgJ0EnLAogCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CiB9CiAKQEAgLTQ0MTksMTEgKzQ0MTksMTEgQEAKIAkJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX0lOSVRJQVRPUl9NU0dPVVQ7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQlwcmludGYoIlNldHRpbmcgdXAgZm9yIFBhcml0eSBFcnJvciBkZWxpdmVyeVxuIik7CisJCQlwcmludGsoIlNldHRpbmcgdXAgZm9yIFBhcml0eSBFcnJvciBkZWxpdmVyeVxuIik7CiAjZW5kaWYKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoc2NiID09IE5VTEwpIHsKLQkJcHJpbnRmKCIlczogV0FSTklORy4gTm8gcGVuZGluZyBtZXNzYWdlIGZvciAiCisJCXByaW50aygiJXM6IFdBUk5JTkcuIE5vIHBlbmRpbmcgbWVzc2FnZSBmb3IgIgogCQkgICAgICAgIklfVCBtc2dpbi4gIElzc3VpbmcgTk8tT1BcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfTk9PUDsKIAkJYWhkLT5tc2dvdXRfbGVuKys7CkBAIC00NDU0LDcgKzQ0NTQsNyBAQAogCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfQlVTX0RFVl9SRVNFVDsKIAkJYWhkLT5tc2dvdXRfbGVuKys7CiAJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJcHJpbnRmKCJCdXMgRGV2aWNlIFJlc2V0IE1lc3NhZ2UgU2VudFxuIik7CisJCXByaW50aygiQnVzIERldmljZSBSZXNldCBNZXNzYWdlIFNlbnRcbiIpOwogCQkvKgogCQkgKiBDbGVhciBvdXIgc2VsZWN0aW9uIGhhcmR3YXJlIGluIGFkdmFuY2Ugb2YKIAkJICogdGhlIGJ1c2ZyZWUuICBXZSBtYXkgaGF2ZSBhbiBlbnRyeSBpbiB0aGUgd2FpdGluZwpAQCAtNDQ3Miw3ICs0NDcyLDcgQEAKIAkJfQogCQlhaGQtPm1zZ291dF9sZW4rKzsKIAkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwotCQlwcmludGYoIkFib3J0JXMgTWVzc2FnZSBTZW50XG4iLAorCQlwcmludGsoIkFib3J0JXMgTWVzc2FnZSBTZW50XG4iLAogCQkgICAgICAgKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDAgPyAiIFRhZyIgOiAiIik7CiAJCS8qCiAJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgpAQCAtNDQ5Myw5ICs0NDkzLDkgQEAKIAkJICovCiAJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOwogCX0gZWxzZSB7Ci0JCXByaW50ZigiYWhkX2ludHI6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgIgorCQlwcmludGsoImFoZF9pbnRyOiBBV0FJVElOR19NU0cgZm9yIGFuIFNDQiB0aGF0ICIKIAkJICAgICAgICJkb2VzIG5vdCBoYXZlIGEgd2FpdGluZyBtZXNzYWdlXG4iKTsKLQkJcHJpbnRmKCJTQ1NJSUQgPSAleCwgdGFyZ2V0X21hc2sgPSAleFxuIiwgc2NiLT5oc2NiLT5zY3NpaWQsCisJCXByaW50aygiU0NTSUlEID0gJXgsIHRhcmdldF9tYXNrID0gJXhcbiIsIHNjYi0+aHNjYi0+c2NzaWlkLAogCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0X21hc2spOwogCQlwYW5pYygiU0NCID0gJWQsIFNDQiBDb250cm9sID0gJXg6JXgsIE1TR19PVVQgPSAleCAiCiAJCSAgICAgICJTQ0IgZmxhZ3MgPSAleCIsIFNDQl9HRVRfVEFHKHNjYiksIHNjYi0+aHNjYi0+Y29udHJvbCwKQEAgLTQ1NzcsNyArNDU3Nyw3IEBACiAKIAkJaWYgKGJvb3R2ZXJib3NlKSB7CiAJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOwotCQkJcHJpbnRmKCJFbnN1cmluZyBhc3luY1xuIik7CisJCQlwcmludGsoIkVuc3VyaW5nIGFzeW5jXG4iKTsKIAkJfQogCX0KIAkvKiBUYXJnZXQgaW5pdGlhdGVkIFBQUiBpcyBub3QgYWxsb3dlZCBpbiB0aGUgU0NTSSBzcGVjICovCkBAIC00NjI0LDcgKzQ2MjQsNyBAQAogCQkJYWhkLT5tc2dvdXRfYnVmICsgYWhkLT5tc2dvdXRfaW5kZXgsIHBlcmlvZCwgb2Zmc2V0KTsKIAlhaGQtPm1zZ291dF9sZW4gKz0gNTsKIAlpZiAoYm9vdHZlcmJvc2UpIHsKLQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFNEVFIgcGVyaW9kICV4LCBvZmZzZXQgJXhcbiIsCisJCXByaW50aygiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBTRFRSIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAogCQkgICAgICAgZGV2aW5mby0+bHVuLCBwZXJpb2QsIG9mZnNldCk7CiAJfQpAQCAtNDY0Miw3ICs0NjQyLDcgQEAKIAkJCWFoZC0+bXNnb3V0X2J1ZiArIGFoZC0+bXNnb3V0X2luZGV4LCBidXNfd2lkdGgpOwogCWFoZC0+bXNnb3V0X2xlbiArPSA0OwogCWlmIChib290dmVyYm9zZSkgewotCQlwcmludGYoIiglczolYzolZDolZCk6IFNlbmRpbmcgV0RUUiAleFxuIiwKKwkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFdEVFIgJXhcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCiAJCSAgICAgICBkZXZpbmZvLT5sdW4sIGJ1c193aWR0aCk7CiAJfQpAQCAtNDY3MSw3ICs0NjcxLDcgQEAKIAkJCWJ1c193aWR0aCwgcHByX29wdGlvbnMpOwogCWFoZC0+bXNnb3V0X2xlbiArPSA4OwogCWlmIChib290dmVyYm9zZSkgewotCQlwcmludGYoIiglczolYzolZDolZCk6IFNlbmRpbmcgUFBSIGJ1c193aWR0aCAleCwgcGVyaW9kICV4LCAiCisJCXByaW50aygiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBQUFIgYnVzX3dpZHRoICV4LCBwZXJpb2QgJXgsICIKIAkJICAgICAgICJvZmZzZXQgJXgsIHBwcl9vcHRpb25zICV4XG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4sCiAJCSAgICAgICBidXNfd2lkdGgsIHBlcmlvZCwgb2Zmc2V0LCBwcHJfb3B0aW9ucyk7CkBAIC00NzIxLDcgKzQ3MjEsNyBAQAogCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOwogCiAJaWYgKChhaGRfaW5iKGFoZCwgTFFJU1RBVDIpICYgTFFJUEhBU0VfT1VUUEtUKSAhPSAwKSB7Ci0JCXByaW50ZigiTFFJUkVUUlkgZm9yIExRSVBIQVNFX09VVFBLVFxuIik7CisJCXByaW50aygiTFFJUkVUUlkgZm9yIExRSVBIQVNFX09VVFBLVFxuIik7CiAJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CiAJfQogcmVzd2l0Y2g6CkBAIC00NzM4LDE0ICs0NzM4LDE0IEBACiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKIAkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX09VVCIpOworCQkJcHJpbnRrKCJJTklUSUFUT1JfTVNHX09VVCIpOwogCQl9CiAjZW5kaWYKIAkJcGhhc2VtaXMgPSBidXNfcGhhc2UgIT0gUF9NRVNHT1VUOwogCQlpZiAocGhhc2VtaXMpIHsKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKLQkJCQlwcmludGYoIiBQSEFTRU1JUyAlc1xuIiwKKwkJCQlwcmludGsoIiBQSEFTRU1JUyAlc1xuIiwKIAkJCQkgICAgICAgYWhkX2xvb2t1cF9waGFzZV9lbnRyeShidXNfcGhhc2UpCiAJCQkJCQkJICAgICAtPnBoYXNlbXNnKTsKIAkJCX0KQEAgLTQ3NzIsNyArNDc3Miw3IEBACiAJCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCIgYnl0ZSAweCV4XG4iLCBhaGQtPnNlbmRfbXNnX3BlcnJvcik7CisJCQkJcHJpbnRrKCIgYnl0ZSAweCV4XG4iLCBhaGQtPnNlbmRfbXNnX3BlcnJvcik7CiAjZW5kaWYKIAkJCS8qCiAJCQkgKiBJZiB3ZSBhcmUgbm90aWZ5aW5nIHRoZSB0YXJnZXQgb2YgYSBDUkMgZXJyb3IKQEAgLTQ4MTMsNyArNDgxMyw3IEBACiAJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOwogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQotCQkJcHJpbnRmKCIgYnl0ZSAweCV4XG4iLAorCQkJcHJpbnRrKCIgYnl0ZSAweCV4XG4iLAogCQkJICAgICAgIGFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleF0pOwogI2VuZGlmCiAJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzIsIGFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSk7CkBAIC00ODI4LDE0ICs0ODI4LDE0IEBACiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKIAkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOwotCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX0lOIik7CisJCQlwcmludGsoIklOSVRJQVRPUl9NU0dfSU4iKTsKIAkJfQogI2VuZGlmCiAJCXBoYXNlbWlzID0gYnVzX3BoYXNlICE9IFBfTUVTR0lOOwogCQlpZiAocGhhc2VtaXMpIHsKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKLQkJCQlwcmludGYoIiBQSEFTRU1JUyAlc1xuIiwKKwkJCQlwcmludGsoIiBQSEFTRU1JUyAlc1xuIiwKIAkJCQkgICAgICAgYWhkX2xvb2t1cF9waGFzZV9lbnRyeShidXNfcGhhc2UpCiAJCQkJCQkJICAgICAtPnBoYXNlbXNnKTsKIAkJCX0KQEAgLTQ4NTYsNyArNDg1Niw3IEBACiAJCWFoZC0+bXNnaW5fYnVmW2FoZC0+bXNnaW5faW5kZXhdID0gYWhkX2luYihhaGQsIFNDU0lCVVMpOwogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQotCQkJcHJpbnRmKCIgYnl0ZSAweCV4XG4iLAorCQkJcHJpbnRrKCIgYnl0ZSAweCV4XG4iLAogCQkJICAgICAgIGFoZC0+bXNnaW5fYnVmW2FoZC0+bXNnaW5faW5kZXhdKTsKICNlbmRpZgogCkBAIC00ODc4LDcgKzQ4NzgsNyBAQAogI2lmZGVmIEFIRF9ERUJVRwogCQkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKIAkJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7Ci0JCQkJCXByaW50ZigiQXNzZXJ0aW5nIEFUTiBmb3IgcmVzcG9uc2VcbiIpOworCQkJCQlwcmludGsoIkFzc2VydGluZyBBVE4gZm9yIHJlc3BvbnNlXG4iKTsKIAkJCQl9CiAjZW5kaWYKIAkJCQlhaGRfYXNzZXJ0X2F0bihhaGQpOwpAQCAtNTAyNiw3ICs1MDI2LDcgQEAKIAogCWlmIChlbmRfc2Vzc2lvbikgewogCQlpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfUEFDS0VUSVpFRCkgIT0gMCkgewotCQkJcHJpbnRmKCIlczogUmV0dXJuaW5nIHRvIElkbGUgTG9vcFxuIiwKKwkJCXByaW50aygiJXM6IFJldHVybmluZyB0byBJZGxlIExvb3BcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CiAJCQlhaGRfY2xlYXJfbXNnX3N0YXRlKGFoZCk7CiAKQEAgLTUxNzgsNyArNTE3OCw3IEBACiAJCQlhaGRfdmFsaWRhdGVfb2Zmc2V0KGFoZCwgdGluZm8sIHBlcmlvZCwgJm9mZnNldCwKIAkJCQkJICAgIHRpbmZvLT5jdXJyLndpZHRoLCBkZXZpbmZvLT5yb2xlKTsKIAkJCWlmIChib290dmVyYm9zZSkgewotCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogUmVjZWl2ZWQgIgorCQkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogUmVjZWl2ZWQgIgogCQkJCSAgICAgICAiU0RUUiBwZXJpb2QgJXgsIG9mZnNldCAleFxuXHQiCiAJCQkJICAgICAgICJGaWx0ZXJlZCB0byBwZXJpb2QgJXgsIG9mZnNldCAleFxuIiwKIAkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKQEAgLTUyMDgsNyArNTIwOCw3IEBACiAJCQkJICovCiAJCQkJaWYgKGJvb3R2ZXJib3NlCiAJCQkJICYmIGRldmluZm8tPnJvbGUgPT0gUk9MRV9JTklUSUFUT1IpIHsKLQkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQlwcmludGsoIiglczolYzolZDolZCk6IFRhcmdldCAiCiAJCQkJCSAgICAgICAiSW5pdGlhdGVkIFNEVFJcbiIsCiAJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwpAQCAtNTI1MCw3ICs1MjUwLDcgQEAKIAkJCWFoZF92YWxpZGF0ZV93aWR0aChhaGQsIHRpbmZvLCAmYnVzX3dpZHRoLAogCQkJCQkgICBkZXZpbmZvLT5yb2xlKTsKIAkJCWlmIChib290dmVyYm9zZSkgewotCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogUmVjZWl2ZWQgV0RUUiAiCisJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCBXRFRSICIKIAkJCQkgICAgICAgIiV4IGZpbHRlcmVkIHRvICV4XG4iLAogCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKQEAgLTUyNjYsNyArNTI2Niw3IEBACiAJCQkJICovCiAJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoKSB7CiAJCQkJCXJlamVjdCA9IFRSVUU7Ci0JCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVxdWVzdGVkICVkQml0ICIKKwkJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiByZXF1ZXN0ZWQgJWRCaXQgIgogCQkJCQkgICAgICAgInRyYW5zZmVycy4gIFJlamVjdGluZy4uLlxuIiwKIAkJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCiAJCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKQEAgLTUyNzksNyArNTI3OSw3IEBACiAJCQkJICovCiAJCQkJaWYgKGJvb3R2ZXJib3NlCiAJCQkJICYmIGRldmluZm8tPnJvbGUgPT0gUk9MRV9JTklUSUFUT1IpIHsKLQkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQlwcmludGsoIiglczolYzolZDolZCk6IFRhcmdldCAiCiAJCQkJCSAgICAgICAiSW5pdGlhdGVkIFdEVFJcbiIsCiAJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwpAQCAtNTM5MSwxMiArNTM5MSwxMiBAQAogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGRldmluZm8tPnJvbGUgIT0gUk9MRV9UQVJHRVQpCi0JCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgogCQkJCQkgICAgICAgIkluaXRpYXRlZCBQUFJcbiIsCiAJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwogCQkJCWVsc2UKLQkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBJbml0aWF0b3IgIgorCQkJCQlwcmludGsoIiglczolYzolZDolZCk6IEluaXRpYXRvciAiCiAJCQkJCSAgICAgICAiSW5pdGlhdGVkIFBQUlxuIiwKIAkJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCiAJCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CkBAIC01NDA4LDcgKzU0MDgsNyBAQAogCQkJCXJlc3BvbnNlID0gVFJVRTsKIAkJCX0KIAkJCWlmIChib290dmVyYm9zZSkgewotCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogUmVjZWl2ZWQgUFBSIHdpZHRoICV4LCAiCisJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCBQUFIgd2lkdGggJXgsICIKIAkJCQkgICAgICAgInBlcmlvZCAleCwgb2Zmc2V0ICV4LG9wdGlvbnMgJXhcbiIKIAkJCQkgICAgICAgIlx0RmlsdGVyZWQgdG8gd2lkdGggJXgsIHBlcmlvZCAleCwgIgogCQkJCSAgICAgICAib2Zmc2V0ICV4LCBvcHRpb25zICV4XG4iLApAQCAtNTQ4NCw3ICs1NDg0LDcgQEAKIAljYXNlIE1TR19RQVNfUkVRVUVTVDoKICNpZmRlZiBBSERfREVCVUcKIAkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKLQkJCXByaW50ZigiJXM6IFFBUyByZXF1ZXN0LiAgU0NTSVNJR0kgPT0gMHgleFxuIiwKKwkJCXByaW50aygiJXM6IFFBUyByZXF1ZXN0LiAgU0NTSVNJR0kgPT0gMHgleFxuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW5iKGFoZCwgU0NTSVNJR0kpKTsKICNlbmRpZgogCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfUUFTUkVKX0JVU0ZSRUU7CkBAIC01NTQ5LDcgKzU1NDksNyBAQAogCQkJICogb2ZmIHRoZXNlIG9wdGlvbnMuCiAJCQkgKi8KIAkJCWlmIChib290dmVyYm9zZSkgewotCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogUFBSIFJlamVjdGVkLiAiCisJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBQUFIgUmVqZWN0ZWQuICIKIAkJCQkgICAgICAgIlRyeWluZyBzaW1wbGUgVTE2MCBQUFJcbiIsCiAJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCiAJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKQEAgLTU1NjQsNyArNTU2NCw3IEBACiAJCQkgKiBBdHRlbXB0IHRvIG5lZ290aWF0ZSBTUEktMiBzdHlsZS4KIAkJCSAqLwogCQkJaWYgKGJvb3R2ZXJib3NlKSB7Ci0JCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBQUFIgUmVqZWN0ZWQuICIKKwkJCQlwcmludGsoIiglczolYzolZDolZCk6IFBQUiBSZWplY3RlZC4gIgogCQkJCSAgICAgICAiVHJ5aW5nIFdEVFIvU0RUUlxuIiwKIAkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKIAkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwpAQCAtNTU4MSw3ICs1NTgxLDcgQEAKIAl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfV0RUUiwgLypmdWxsKi9GQUxTRSkpIHsKIAogCQkvKiBub3RlIDhiaXQgeGZlcnMgKi8KLQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIFdJREUgbmVnb3RpYXRpb24uICBVc2luZyAiCisJCXByaW50aygiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBXSURFIG5lZ290aWF0aW9uLiAgVXNpbmcgIgogCQkgICAgICAgIjhiaXQgdHJhbnNmZXJzXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwogCQlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKQEAgLTU2MDksNyArNTYwOSw3IEBACiAJCQkJIC8qb2Zmc2V0Ki8wLCAvKnBwcl9vcHRpb25zKi8wLAogCQkJCSBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAogCQkJCSAvKnBhdXNlZCovVFJVRSk7Ci0JCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbi4gIgorCQlwcmludGsoIiglczolYzolZDolZCk6IHJlZnVzZXMgc3luY2hyb25vdXMgbmVnb3RpYXRpb24uICIKIAkJICAgICAgICJVc2luZyBhc3luY2hyb25vdXMgdHJhbnNmZXJzXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKIAkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKQEAgLTU2MjAsMTMgKzU2MjAsMTMgQEAKIAkJdGFnX3R5cGUgPSAoc2NiLT5oc2NiLT5jb250cm9sICYgTVNHX1NJTVBMRV9UQVNLKTsKIAogCQlpZiAodGFnX3R5cGUgPT0gTVNHX1NJTVBMRV9UQVNLKSB7Ci0JCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgdGFnZ2VkIGNvbW1hbmRzLiAgIgorCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIHRhZ2dlZCBjb21tYW5kcy4gICIKIAkJCSAgICAgICAiUGVyZm9ybWluZyBub24tdGFnZ2VkIEkvT1xuIiwgYWhkX25hbWUoYWhkKSwKIAkJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CiAJCQlhaGRfc2V0X3RhZ3MoYWhkLCBzY2ItPmlvX2N0eCwgZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOwogCQkJbWFzayA9IH4weDIzOwogCQl9IGVsc2UgewotCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzICVzIHRhZ2dlZCBjb21tYW5kcy4gICIKKwkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyAlcyB0YWdnZWQgY29tbWFuZHMuICAiCiAJCQkgICAgICAgIlBlcmZvcm1pbmcgc2ltcGxlIHF1ZXVlIHRhZ2dlZCBJL08gb25seVxuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCiAJCQkgICAgICAgZGV2aW5mby0+bHVuLCB0YWdfdHlwZSA9PSBNU0dfT1JERVJFRF9UQVNLCkBAIC01Njc3LDcgKzU2NzcsNyBAQAogCQkvKgogCQkgKiBPdGhlcndpc2UsIHdlIGlnbm9yZSBpdC4KIAkJICovCi0JCXByaW50ZigiJXM6JWM6JWQ6IE1lc3NhZ2UgcmVqZWN0IGZvciAleCAtLSBpZ25vcmVkXG4iLAorCQlwcmludGsoIiVzOiVjOiVkOiBNZXNzYWdlIHJlamVjdCBmb3IgJXggLS0gaWdub3JlZFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKIAkJICAgICAgIGxhc3RfbXNnKTsKIAl9CkBAIC01ODY0LDcgKzU4NjQsNyBAQAogCQlhaGRfZGVsYXkoMTAwKTsKIAlpZiAod2FpdCA9PSAwKSB7CiAJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJcHJpbnRmKCJhaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzOiBGb3JjaW5nIEZJRk8gZnJlZS5cbiIpOworCQlwcmludGsoImFoZF9yZWluaXRpYWxpemVfZGF0YXB0cnM6IEZvcmNpbmcgRklGTyBmcmVlLlxuIik7CiAJCWFoZF9vdXRiKGFoZCwgREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UKTsKIAl9CiAJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOwpAQCAtNTk3OCw3ICs1OTc4LDcgQEAKIAkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19TRU5UX0JEUik7CiAKIAlpZiAobWVzc2FnZSAhPSBOVUxMICYmIGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiAlcyBvbiAlYzolZC4gJWQgU0NCcyBhYm9ydGVkXG4iLCBhaGRfbmFtZShhaGQpLAorCQlwcmludGsoIiVzOiAlcyBvbiAlYzolZC4gJWQgU0NCcyBhYm9ydGVkXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgbWVzc2FnZSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBmb3VuZCk7CiB9CiAKQEAgLTYwNzQsMjMgKzYwNzQsMjIgQEAKIAlzdHJ1Y3QgIGFoZF9zb2Z0YyAqYWhkOwogCiAjaWZuZGVmCV9fRnJlZUJTRF9fCi0JYWhkID0gbWFsbG9jKHNpemVvZigqYWhkKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlhaGQgPSBrbWFsbG9jKHNpemVvZigqYWhkKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFhaGQpIHsKLQkJcHJpbnRmKCJhaWM3eHh4OiBjYW5ub3QgbWFsbG9jIHNvZnRjIVxuIik7Ci0JCWZyZWUobmFtZSwgTV9ERVZCVUYpOworCQlwcmludGsoImFpYzd4eHg6IGNhbm5vdCBtYWxsb2Mgc29mdGMhXG4iKTsKKwkJa2ZyZWUobmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KICNlbHNlCiAJYWhkID0gZGV2aWNlX2dldF9zb2Z0YygoZGV2aWNlX3QpcGxhdGZvcm1fYXJnKTsKICNlbmRpZgogCW1lbXNldChhaGQsIDAsIHNpemVvZigqYWhkKSk7Ci0JYWhkLT5zZWVwX2NvbmZpZyA9IG1hbGxvYyhzaXplb2YoKmFoZC0+c2VlcF9jb25maWcpLAotCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlhaGQtPnNlZXBfY29uZmlnID0ga21hbGxvYyhzaXplb2YoKmFoZC0+c2VlcF9jb25maWcpLCBHRlBfQVRPTUlDKTsKIAlpZiAoYWhkLT5zZWVwX2NvbmZpZyA9PSBOVUxMKSB7CiAjaWZuZGVmCV9fRnJlZUJTRF9fCi0JCWZyZWUoYWhkLCBNX0RFVkJVRik7CisJCWtmcmVlKGFoZCk7CiAjZW5kaWYKLQkJZnJlZShuYW1lLCBNX0RFVkJVRik7CisJCWtmcmVlKG5hbWUpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAlMSVNUX0lOSVQoJmFoZC0+cGVuZGluZ19zY2JzKTsKQEAgLTYxMjAsNyArNjExOSw3IEBACiAJfQogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVNT1JZKSAhPSAwKSB7Ci0JCXByaW50ZigiJXM6IHNjYiBzaXplID0gMHgleCwgaHNjYiBzaXplID0gMHgleFxuIiwKKwkJcHJpbnRrKCIlczogc2NiIHNpemUgPSAweCV4LCBoc2NiIHNpemUgPSAweCV4XG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgKHVfaW50KXNpemVvZihzdHJ1Y3Qgc2NiKSwKIAkJICAgICAgICh1X2ludClzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikpOwogCX0KQEAgLTYxNDcsNyArNjE0Niw3IEBACiBhaGRfc2V0X25hbWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpuYW1lKQogewogCWlmIChhaGQtPm5hbWUgIT0gTlVMTCkKLQkJZnJlZShhaGQtPm5hbWUsIE1fREVWQlVGKTsKKwkJa2ZyZWUoYWhkLT5uYW1lKTsKIAlhaGQtPm5hbWUgPSBuYW1lOwogfQogCkBAIC02MjAxLDI3ICs2MjAwLDI3IEBACiAJCQkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbal07CiAJCQkJaWYgKGxzdGF0ZSAhPSBOVUxMKSB7CiAJCQkJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKLQkJCQkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKwkJCQkJa2ZyZWUobHN0YXRlKTsKIAkJCQl9CiAJCQl9CiAjZW5kaWYKLQkJCWZyZWUodHN0YXRlLCBNX0RFVkJVRik7CisJCQlrZnJlZSh0c3RhdGUpOwogCQl9CiAJfQogI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQogCWlmIChhaGQtPmJsYWNrX2hvbGUgIT0gTlVMTCkgewogCQl4cHRfZnJlZV9wYXRoKGFoZC0+YmxhY2tfaG9sZS0+cGF0aCk7Ci0JCWZyZWUoYWhkLT5ibGFja19ob2xlLCBNX0RFVkJVRik7CisJCWtmcmVlKGFoZC0+YmxhY2tfaG9sZSk7CiAJfQogI2VuZGlmCiAJaWYgKGFoZC0+bmFtZSAhPSBOVUxMKQotCQlmcmVlKGFoZC0+bmFtZSwgTV9ERVZCVUYpOworCQlrZnJlZShhaGQtPm5hbWUpOwogCWlmIChhaGQtPnNlZXBfY29uZmlnICE9IE5VTEwpCi0JCWZyZWUoYWhkLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCQlrZnJlZShhaGQtPnNlZXBfY29uZmlnKTsKIAlpZiAoYWhkLT5zYXZlZF9zdGFjayAhPSBOVUxMKQotCQlmcmVlKGFoZC0+c2F2ZWRfc3RhY2ssIE1fREVWQlVGKTsKKwkJa2ZyZWUoYWhkLT5zYXZlZF9zdGFjayk7CiAjaWZuZGVmIF9fRnJlZUJTRF9fCi0JZnJlZShhaGQsIE1fREVWQlVGKTsKKwlrZnJlZShhaGQpOwogI2VuZGlmCiAJcmV0dXJuOwogfQpAQCAtNjMwMCw3ICs2Mjk5LDcgQEAKIAl9IHdoaWxlICgtLXdhaXQgJiYgIShhaGRfaW5iKGFoZCwgSENOVFJMKSAmIENISVBSU1RBQ0spKTsKIAogCWlmICh3YWl0ID09IDApIHsKLQkJcHJpbnRmKCIlczogV0FSTklORyAtIEZhaWxlZCBjaGlwIHJlc2V0ISAgIgorCQlwcmludGsoIiVzOiBXQVJOSU5HIC0gRmFpbGVkIGNoaXAgcmVzZXQhICAiCiAJCSAgICAgICAiVHJ5aW5nIHRvIGluaXRpYWxpemUgYW55d2F5LlxuIiwgYWhkX25hbWUoYWhkKSk7CiAJfQogCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBhaGQtPnBhdXNlKTsKQEAgLTY0MjIsNyArNjQyMSw3IEBACiAJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaGFyZHdhcmUgU0NCcyBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCiAJc2NiX2RhdGEtPm1heGhzY2JzID0gYWhkX3Byb2JlX3NjYnMoYWhkKTsKIAlpZiAoc2NiX2RhdGEtPm1heGhzY2JzID09IDApIHsKLQkJcHJpbnRmKCIlczogTm8gU0NCIHNwYWNlIGZvdW5kXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRrKCIlczogTm8gU0NCIHNwYWNlIGZvdW5kXG4iLCBhaGRfbmFtZShhaGQpKTsKIAkJcmV0dXJuIChFTlhJTyk7CiAJfQogCkBAIC02NDY1LDcgKzY0NjQsNyBAQAogCX0KICNpZmRlZiBBSERfREVCVUcKIAlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FTU9SWSkgIT0gMCkKLQkJcHJpbnRmKCIlczogYWhkX3NnbGlzdF9hbGxvY3NpemUgPSAweCV4XG4iLCBhaGRfbmFtZShhaGQpLAorCQlwcmludGsoIiVzOiBhaGRfc2dsaXN0X2FsbG9jc2l6ZSA9IDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksCiAJCSAgICAgICBhaGRfc2dsaXN0X2FsbG9jc2l6ZShhaGQpKTsKICNlbmRpZgogCkBAIC02NDg5LDcgKzY0ODgsNyBAQAogCWFoZF9hbGxvY19zY2JzKGFoZCk7CiAKIAlpZiAoc2NiX2RhdGEtPm51bXNjYnMgPT0gMCkgewotCQlwcmludGYoIiVzOiBhaGRfaW5pdF9zY2JkYXRhIC0gIgorCQlwcmludGsoIiVzOiBhaGRfaW5pdF9zY2JkYXRhIC0gIgogCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbml0aWFsIHNjYnNcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKIAkJZ290byBlcnJvcl9leGl0OwpAQCAtNjU2NCw3ICs2NTYzLDcgQEAKIAkJCQkJICBzbnNfbWFwLT5kbWFtYXApOwogCQkJYWhkX2RtYW1lbV9mcmVlKGFoZCwgc2NiX2RhdGEtPnNlbnNlX2RtYXQsCiAJCQkJCXNuc19tYXAtPnZhZGRyLCBzbnNfbWFwLT5kbWFtYXApOwotCQkJZnJlZShzbnNfbWFwLCBNX0RFVkJVRik7CisJCQlrZnJlZShzbnNfbWFwKTsKIAkJfQogCQlhaGRfZG1hX3RhZ19kZXN0cm95KGFoZCwgc2NiX2RhdGEtPnNlbnNlX2RtYXQpOwogCQkvKiBGQUxMVEhST1VHSCAqLwpAQCAtNjU3OSw3ICs2NTc4LDcgQEAKIAkJCQkJICBzZ19tYXAtPmRtYW1hcCk7CiAJCQlhaGRfZG1hbWVtX2ZyZWUoYWhkLCBzY2JfZGF0YS0+c2dfZG1hdCwKIAkJCQkJc2dfbWFwLT52YWRkciwgc2dfbWFwLT5kbWFtYXApOwotCQkJZnJlZShzZ19tYXAsIE1fREVWQlVGKTsKKwkJCWtmcmVlKHNnX21hcCk7CiAJCX0KIAkJYWhkX2RtYV90YWdfZGVzdHJveShhaGQsIHNjYl9kYXRhLT5zZ19kbWF0KTsKIAkJLyogRkFMTFRIUk9VR0ggKi8KQEAgLTY1OTQsNyArNjU5Myw3IEBACiAJCQkJCSAgaHNjYl9tYXAtPmRtYW1hcCk7CiAJCQlhaGRfZG1hbWVtX2ZyZWUoYWhkLCBzY2JfZGF0YS0+aHNjYl9kbWF0LAogCQkJCQloc2NiX21hcC0+dmFkZHIsIGhzY2JfbWFwLT5kbWFtYXApOwotCQkJZnJlZShoc2NiX21hcCwgTV9ERVZCVUYpOworCQkJa2ZyZWUoaHNjYl9tYXApOwogCQl9CiAJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBzY2JfZGF0YS0+aHNjYl9kbWF0KTsKIAkJLyogRkFMTFRIUk9VR0ggKi8KQEAgLTY2MjQsNyArNjYyMyw3IEBACiAJYWhkX291dGIoYWhkLCBTSU1PREUwLCBhaGRfaW5iKGFoZCwgU0lNT0RFMCkgfCAoRU5TRUxET3xFTlNFTERJKSk7CiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQotCQlwcmludGYoIiVzOiBTZXR0aW5nIHVwIGlvY2VsbCB3b3JrYXJvdW5kXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRrKCIlczogU2V0dGluZyB1cCBpb2NlbGwgd29ya2Fyb3VuZFxuIiwgYWhkX25hbWUoYWhkKSk7CiAjZW5kaWYKIAlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKIAlhaGQtPmZsYWdzICY9IH5BSERfSEFEX0ZJUlNUX1NFTDsKQEAgLTY2NDQsMTQgKzY2NDMsMTQgQEAKIAlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOwogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkKLQkJcHJpbnRmKCIlczogaW9jZWxsIGZpcnN0IHNlbGVjdGlvblxuIiwgYWhkX25hbWUoYWhkKSk7CisJCXByaW50aygiJXM6IGlvY2VsbCBmaXJzdCBzZWxlY3Rpb25cbiIsIGFoZF9uYW1lKGFoZCkpOwogI2VuZGlmCiAJaWYgKChzYmxrY3RsICYgRU5BQjQwKSAhPSAwKSB7CiAJCWFoZF9vdXRiKGFoZCwgRFNQREFUQUNUTCwKIAkJCSBhaGRfaW5iKGFoZCwgRFNQREFUQUNUTCkgJiB+QllQQVNTRU5BQik7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkKLQkJCXByaW50ZigiJXM6IEJZUEFTUyBub3cgZGlzYWJsZWRcbiIsIGFoZF9uYW1lKGFoZCkpOworCQkJcHJpbnRrKCIlczogQllQQVNTIG5vdyBkaXNhYmxlZFxuIiwgYWhkX25hbWUoYWhkKSk7CiAjZW5kaWYKIAl9CiAJYWhkX291dGIoYWhkLCBTSU1PREUwLCBhaGRfaW5iKGFoZCwgU0lNT0RFMCkgJiB+KEVOU0VMRE98RU5TRUxESSkpOwpAQCAtNjgzMyw3ICs2ODMyLDcgQEAKIAkJaHNjYiA9ICYoKHN0cnVjdCBoYXJkd2FyZV9zY2IgKiloc2NiX21hcC0+dmFkZHIpW29mZnNldF07CiAJCWhzY2JfYnVzYWRkciA9IGhzY2JfbWFwLT5waHlzYWRkciArIChvZmZzZXQgKiBzaXplb2YoKmhzY2IpKTsKIAl9IGVsc2UgewotCQloc2NiX21hcCA9IG1hbGxvYyhzaXplb2YoKmhzY2JfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJaHNjYl9tYXAgPSBrbWFsbG9jKHNpemVvZigqaHNjYl9tYXApLCBHRlBfQVRPTUlDKTsKIAogCQlpZiAoaHNjYl9tYXAgPT0gTlVMTCkKIAkJCXJldHVybjsKQEAgLTY4NDIsNyArNjg0MSw3IEBACiAJCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgc2NiX2RhdGEtPmhzY2JfZG1hdCwKIAkJCQkgICAgICh2b2lkICoqKSZoc2NiX21hcC0+dmFkZHIsCiAJCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJmhzY2JfbWFwLT5kbWFtYXApICE9IDApIHsKLQkJCWZyZWUoaHNjYl9tYXAsIE1fREVWQlVGKTsKKwkJCWtmcmVlKGhzY2JfbWFwKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC02ODY2LDcgKzY4NjUsNyBAQAogCQlzZWdzID0gc2dfbWFwLT52YWRkciArIG9mZnNldDsKIAkJc2dfYnVzYWRkciA9IHNnX21hcC0+cGh5c2FkZHIgKyBvZmZzZXQ7CiAJfSBlbHNlIHsKLQkJc2dfbWFwID0gbWFsbG9jKHNpemVvZigqc2dfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJc2dfbWFwID0ga21hbGxvYyhzaXplb2YoKnNnX21hcCksIEdGUF9BVE9NSUMpOwogCiAJCWlmIChzZ19tYXAgPT0gTlVMTCkKIAkJCXJldHVybjsKQEAgLTY4NzUsNyArNjg3NCw3IEBACiAJCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgc2NiX2RhdGEtPnNnX2RtYXQsCiAJCQkJICAgICAodm9pZCAqKikmc2dfbWFwLT52YWRkciwKIAkJCQkgICAgIEJVU19ETUFfTk9XQUlULCAmc2dfbWFwLT5kbWFtYXApICE9IDApIHsKLQkJCWZyZWUoc2dfbWFwLCBNX0RFVkJVRik7CisJCQlrZnJlZShzZ19tYXApOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTY4OTEsNyArNjg5MCw3IEBACiAJCSAgICBhaGRfc2dsaXN0X2FsbG9jc2l6ZShhaGQpIC8gYWhkX3NnbGlzdF9zaXplKGFoZCk7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpCi0JCQlwcmludGYoIk1hcHBlZCBTRyBkYXRhXG4iKTsKKwkJCXByaW50aygiTWFwcGVkIFNHIGRhdGFcbiIpOwogI2VuZGlmCiAJfQogCkBAIC02OTAzLDcgKzY5MDIsNyBAQAogCQlzZW5zZV9kYXRhID0gc2Vuc2VfbWFwLT52YWRkciArIG9mZnNldDsKIAkJc2Vuc2VfYnVzYWRkciA9IHNlbnNlX21hcC0+cGh5c2FkZHIgKyBvZmZzZXQ7CiAJfSBlbHNlIHsKLQkJc2Vuc2VfbWFwID0gbWFsbG9jKHNpemVvZigqc2Vuc2VfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJc2Vuc2VfbWFwID0ga21hbGxvYyhzaXplb2YoKnNlbnNlX21hcCksIEdGUF9BVE9NSUMpOwogCiAJCWlmIChzZW5zZV9tYXAgPT0gTlVMTCkKIAkJCXJldHVybjsKQEAgLTY5MTIsNyArNjkxMSw3IEBACiAJCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgc2NiX2RhdGEtPnNlbnNlX2RtYXQsCiAJCQkJICAgICAodm9pZCAqKikmc2Vuc2VfbWFwLT52YWRkciwKIAkJCQkgICAgIEJVU19ETUFfTk9XQUlULCAmc2Vuc2VfbWFwLT5kbWFtYXApICE9IDApIHsKLQkJCWZyZWUoc2Vuc2VfbWFwLCBNX0RFVkJVRik7CisJCQlrZnJlZShzZW5zZV9tYXApOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTY5MjcsNyArNjkyNiw3IEBACiAJCXNjYl9kYXRhLT5zZW5zZV9sZWZ0ID0gUEFHRV9TSVpFIC8gQUhEX1NFTlNFX0JVRlNJWkU7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpCi0JCQlwcmludGYoIk1hcHBlZCBzZW5zZSBkYXRhXG4iKTsKKwkJCXByaW50aygiTWFwcGVkIHNlbnNlIGRhdGFcbiIpOwogI2VuZGlmCiAJfQogCkBAIC02OTQxLDE1ICs2OTQwLDEzIEBACiAJCWludCBlcnJvcjsKICNlbmRpZgogCi0JCW5leHRfc2NiID0gKHN0cnVjdCBzY2IgKiltYWxsb2Moc2l6ZW9mKCpuZXh0X3NjYiksCi0JCQkJCQlNX0RFVkJVRiwgTV9OT1dBSVQpOworCQluZXh0X3NjYiA9IGttYWxsb2Moc2l6ZW9mKCpuZXh0X3NjYiksIEdGUF9BVE9NSUMpOwogCQlpZiAobmV4dF9zY2IgPT0gTlVMTCkKIAkJCWJyZWFrOwogCi0JCXBkYXRhID0gKHN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqKW1hbGxvYyhzaXplb2YoKnBkYXRhKSwKLQkJCQkJCQkgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQlwZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9BVE9NSUMpOwogCQlpZiAocGRhdGEgPT0gTlVMTCkgewotCQkJZnJlZShuZXh0X3NjYiwgTV9ERVZCVUYpOworCQkJa2ZyZWUobmV4dF9zY2IpOwogCQkJYnJlYWs7CiAJCX0KIAkJbmV4dF9zY2ItPnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKQEAgLTY5NzksOCArNjk3Niw4IEBACiAJCWVycm9yID0gYWhkX2RtYW1hcF9jcmVhdGUoYWhkLCBhaGQtPmJ1ZmZlcl9kbWF0LCAvKmZsYWdzKi8wLAogCQkJCQkgICZuZXh0X3NjYi0+ZG1hbWFwKTsKIAkJaWYgKGVycm9yICE9IDApIHsKLQkJCWZyZWUobmV4dF9zY2IsIE1fREVWQlVGKTsKLQkJCWZyZWUocGRhdGEsIE1fREVWQlVGKTsKKwkJCWtmcmVlKG5leHRfc2NiKTsKKwkJCWtmcmVlKHBkYXRhKTsKIAkJCWJyZWFrOwogCQl9CiAjZW5kaWYKQEAgLTcwNzcsOCArNzA3NCw3IEBACiAJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CiAKIAlhaGQtPnN0YWNrX3NpemUgPSBhaGRfcHJvYmVfc3RhY2tfc2l6ZShhaGQpOwotCWFoZC0+c2F2ZWRfc3RhY2sgPSBtYWxsb2MoYWhkLT5zdGFja19zaXplICogc2l6ZW9mKHVpbnQxNl90KSwKLQkJCQkgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJYWhkLT5zYXZlZF9zdGFjayA9IGttYWxsb2MoYWhkLT5zdGFja19zaXplICogc2l6ZW9mKHVpbnQxNl90KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGFoZC0+c2F2ZWRfc3RhY2sgPT0gTlVMTCkKIAkJcmV0dXJuIChFTk9NRU0pOwogCkBAIC03MjI0LDIwICs3MjIwLDIwIEBACiAJZXJyb3IgPSBhaGRfd3JpdGVfZmxleHBvcnQoYWhkLCBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwsCiAJCQkJICAgQ1VSU0VOU0VfRU5CKTsKIAlpZiAoZXJyb3IgIT0gMCkgewotCQlwcmludGYoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAxXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRrKCIlczogY3VycmVudCBzZW5zaW5nIHRpbWVvdXQgMVxuIiwgYWhkX25hbWUoYWhkKSk7CiAJCWdvdG8gaW5pdF9kb25lOwogCX0KIAlmb3IgKGkgPSAyMCwgZnN0YXQgPSBGTFhfRlNUQVRfQlVTWTsKIAkgICAgIChmc3RhdCAmIEZMWF9GU1RBVF9CVVNZKSAhPSAwICYmIGk7IGktLSkgewogCQllcnJvciA9IGFoZF9yZWFkX2ZsZXhwb3J0KGFoZCwgRkxYQUREUl9GTEVYU1RBVCwgJmZzdGF0KTsKIAkJaWYgKGVycm9yICE9IDApIHsKLQkJCXByaW50ZigiJXM6IGN1cnJlbnQgc2Vuc2luZyB0aW1lb3V0IDJcbiIsCisJCQlwcmludGsoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAyXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCQkJZ290byBpbml0X2RvbmU7CiAJCX0KIAl9CiAJaWYgKGkgPT0gMCkgewotCQlwcmludGYoIiVzOiBUaW1lZG91dCBkdXJpbmcgY3VycmVudC1zZW5zaW5nIHRlc3RcbiIsCisJCXByaW50aygiJXM6IFRpbWVkb3V0IGR1cmluZyBjdXJyZW50LXNlbnNpbmcgdGVzdFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCQlnb3RvIGluaXRfZG9uZTsKIAl9CkBAIC03MjQ1LDcgKzcyNDEsNyBAQAogCS8qIExhdGNoIEN1cnJlbnQgU2Vuc2luZyBzdGF0dXMuICovCiAJZXJyb3IgPSBhaGRfcmVhZF9mbGV4cG9ydChhaGQsIEZMWEFERFJfQ1VSUkVOVF9TVEFULCAmY3VycmVudF9zZW5zaW5nKTsKIAlpZiAoZXJyb3IgIT0gMCkgewotCQlwcmludGYoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAzXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRrKCIlczogY3VycmVudCBzZW5zaW5nIHRpbWVvdXQgM1xuIiwgYWhkX25hbWUoYWhkKSk7CiAJCWdvdG8gaW5pdF9kb25lOwogCX0KIApAQCAtNzI1NCw3ICs3MjUwLDcgQEAKIAogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfVEVSTUNUTCkgIT0gMCkgewotCQlwcmludGYoIiVzOiBjdXJyZW50X3NlbnNpbmcgPT0gMHgleFxuIiwKKwkJcHJpbnRrKCIlczogY3VycmVudF9zZW5zaW5nID09IDB4JXhcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjdXJyZW50X3NlbnNpbmcpOwogCX0KICNlbmRpZgpAQCAtNzI3MSwxMyArNzI2NywxMyBAQAogCQljYXNlIEZMWF9DU1RBVF9PS0FZOgogCQkJaWYgKHdhcm5fdXNlciA9PSAwICYmIGJvb3R2ZXJib3NlID09IDApCiAJCQkJYnJlYWs7Ci0JCQlwcmludGYoIiVzOiAlcyBDaGFubmVsICVzXG4iLCBhaGRfbmFtZShhaGQpLAorCQkJcHJpbnRrKCIlczogJXMgQ2hhbm5lbCAlc1xuIiwgYWhkX25hbWUoYWhkKSwKIAkJCSAgICAgICBjaGFubmVsX3N0cmluZ3NbaV0sIHRlcm1zdGF0X3N0cmluZ3NbdGVybV9zdGF0XSk7CiAJCQlicmVhazsKIAkJfQogCX0KIAlpZiAod2Fybl91c2VyKSB7Ci0JCXByaW50ZigiJXM6IFdBUk5JTkcuIFRlcm1pbmF0aW9uIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS5cbiIKKwkJcHJpbnRrKCIlczogV0FSTklORy4gVGVybWluYXRpb24gaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LlxuIgogCQkgICAgICAgIiVzOiBXQVJOSU5HLiBTQ1NJIGJ1cyBvcGVyYXRpb25zIG1heSBGQUlMLlxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9uYW1lKGFoZCkpOwogCX0KQEAgLTczOTMsNyArNzM4OSw3IEBACiAJCX0KICNpZmRlZiBBSERfREVCVUcKIAkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQotCQkJcHJpbnRmKCIlczogV1JUQklBU0NUTCBub3cgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCXByaW50aygiJXM6IFdSVEJJQVNDVEwgbm93IDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksCiAJCQkgICAgICAgV1JUQklBU0NUTF9IUF9ERUZBVUxUKTsKICNlbmRpZgogCX0KQEAgLTc2MjIsOSArNzYxOCw5IEBACiAJCWFoZF9vdXRiKGFoZCwgTkVHQ09OT1BUUywgbmVnb2RhdDMpOwogCQluZWdvZGF0MyA9IGFoZF9pbmIoYWhkLCBORUdDT05PUFRTKTsKIAkJaWYgKCEobmVnb2RhdDMgJiBFTlNMT1dDUkMpKQotCQkJcHJpbnRmKCJhaWM3OXh4OiBmYWlsZWQgdG8gc2V0IHRoZSBTTE9XQ1JDIGJpdFxuIik7CisJCQlwcmludGsoImFpYzc5eHg6IGZhaWxlZCB0byBzZXQgdGhlIFNMT1dDUkMgYml0XG4iKTsKIAkJZWxzZQotCQkJcHJpbnRmKCJhaWM3OXh4OiBTTE9XQ1JDIGJpdCBzZXRcbiIpOworCQkJcHJpbnRrKCJhaWM3OXh4OiBTTE9XQ1JDIGJpdCBzZXRcbiIpOwogCX0KIH0KIApAQCAtNzY0Niw3ICs3NjQyLDcgQEAKIAkgKiBkYXRhIGZvciBhbnkgdGFyZ2V0IG1vZGUgaW5pdGlhdG9yLgogCSAqLwogCWlmIChhaGRfYWxsb2NfdHN0YXRlKGFoZCwgYWhkLT5vdXJfaWQsICdBJykgPT0gTlVMTCkgewotCQlwcmludGYoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgYWhkX3Rtb2RlX3RzdGF0ZS4gICIKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGFoZF90bW9kZV90c3RhdGUuICAiCiAJCSAgICAgICAiRmFpbGluZyBhdHRhY2hcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlyZXR1cm4gKEVOT01FTSk7CiAJfQpAQCAtNzcyNSw3ICs3NzIxLDcgQEAKIAkgKiBkYXRhIGZvciBhbnkgdGFyZ2V0IG1vZGUgaW5pdGlhdG9yLgogCSAqLwogCWlmIChhaGRfYWxsb2NfdHN0YXRlKGFoZCwgYWhkLT5vdXJfaWQsICdBJykgPT0gTlVMTCkgewotCQlwcmludGYoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgYWhkX3Rtb2RlX3RzdGF0ZS4gICIKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGFoZF90bW9kZV90c3RhdGUuICAiCiAJCSAgICAgICAiRmFpbGluZyBhdHRhY2hcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlyZXR1cm4gKEVOT01FTSk7CiAJfQpAQCAtNzc5NSw3ICs3NzkxLDcgQEAKIAkJCXVzZXJfdGluZm8tPndpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKICNpZmRlZiBBSERfREVCVUcKIAkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQotCQkJcHJpbnRmKCIoJWQpOiAleDoleDoleDoleFxuIiwgdGFyZywgdXNlcl90aW5mby0+d2lkdGgsCisJCQlwcmludGsoIiglZCk6ICV4OiV4OiV4OiV4XG4iLCB0YXJnLCB1c2VyX3RpbmZvLT53aWR0aCwKIAkJCSAgICAgICB1c2VyX3RpbmZvLT5wZXJpb2QsIHVzZXJfdGluZm8tPm9mZnNldCwKIAkJCSAgICAgICB1c2VyX3RpbmZvLT5wcHJfb3B0aW9ucyk7CiAjZW5kaWYKQEAgLTc5NTEsNyArNzk0Nyw3IEBACiAJICAgICAgIHx8IChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIChTRUxET3xTRUxJTkdPKSkgIT0gMCkpOwogCiAJaWYgKG1heGxvb3BzID09IDApIHsKLQkJcHJpbnRmKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKKwkJcHJpbnRrKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKIAkJICAgICAgYWhkX2luYihhaGQsIElOVFNUQVQpKTsKIAl9CiAJYWhkLT5xZnJlZXplX2NudCsrOwpAQCAtODI0MSw3ICs4MjM3LDcgQEAKIAlwcmV2X3NjYiA9IE5VTEw7CiAKIAlpZiAoYWN0aW9uID09IFNFQVJDSF9QUklOVCkgewotCQlwcmludGYoInFpbnN0YXJ0ID0gJWQgcWluZmlmb25leHQgPSAlZFxuUUlORklGTzoiLAorCQlwcmludGsoInFpbnN0YXJ0ID0gJWQgcWluZmlmb25leHQgPSAlZFxuUUlORklGTzoiLAogCQkgICAgICAgcWluc3RhcnQsIGFoZC0+cWluZmlmb25leHQpOwogCX0KIApAQCAtODI1Niw3ICs4MjUyLDcgQEAKIAl3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpIHsKIAkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CiAJCWlmIChzY2IgPT0gTlVMTCkgewotCQkJcHJpbnRmKCJxaW5wb3MgPSAlZCwgU0NCIGluZGV4ID0gJWRcbiIsCisJCQlwcmludGsoInFpbnBvcyA9ICVkLCBTQ0IgaW5kZXggPSAlZFxuIiwKIAkJCQlxaW5wb3MsIGFoZC0+cWluZmlmb1txaW5wb3NdKTsKIAkJCXBhbmljKCJMb29wIDFcbiIpOwogCQl9CkBAIC04MjY5LDEzICs4MjY1LDEzIEBACiAJCQlzd2l0Y2ggKGFjdGlvbikgewogCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CiAJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKLQkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gcWluZmlmb1xuIik7CisJCQkJCXByaW50aygiSW5hY3RpdmUgU0NCIGluIHFpbmZpZm9cbiIpOwogCQkJCWFoZF9kb25lX3dpdGhfc3RhdHVzKGFoZCwgc2NiLCBzdGF0dXMpOwogCQkJCS8qIEZBTExUSFJPVUdIICovCiAJCQljYXNlIFNFQVJDSF9SRU1PVkU6CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNFQVJDSF9QUklOVDoKLQkJCQlwcmludGYoIiAweCV4IiwgYWhkLT5xaW5maWZvW3FpbnBvc10pOworCQkJCXByaW50aygiIDB4JXgiLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CiAJCQkJLyogRkFMTFRIUk9VR0ggKi8KIAkJCWNhc2UgU0VBUkNIX0NPVU5UOgogCQkJCWFoZF9xaW5maWZvX3JlcXVldWUoYWhkLCBwcmV2X3NjYiwgc2NiKTsKQEAgLTgyOTIsNyArODI4OCw3IEBACiAJYWhkX3NldF9obnNjYl9xb2ZmKGFoZCwgYWhkLT5xaW5maWZvbmV4dCk7CiAKIAlpZiAoYWN0aW9uID09IFNFQVJDSF9QUklOVCkKLQkJcHJpbnRmKCJcbldBSVRJTkdfVElEX1FVRVVFUzpcbiIpOworCQlwcmludGsoIlxuV0FJVElOR19USURfUVVFVUVTOlxuIik7CiAKIAkvKgogCSAqIFNlYXJjaCB3YWl0aW5nIGZvciBzZWxlY3Rpb24gbGlzdHMuICBXZSB0cmF2ZXJzZSB0aGUKQEAgLTgzMjAsNyArODMxNiw3IEBACiAJCQlwYW5pYygiVElEIExJU1QgTE9PUCIpOwogCiAJCWlmIChzY2JpZCA+PSBhaGQtPnNjYl9kYXRhLm51bXNjYnMpIHsKLQkJCXByaW50ZigiJXM6IFdhaXRpbmcgVElEIExpc3QgaW5jb25zaXN0ZW5jeS4gIgorCQkJcHJpbnRrKCIlczogV2FpdGluZyBUSUQgTGlzdCBpbmNvbnNpc3RlbmN5LiAiCiAJCQkgICAgICAgIlNDQiBpbmRleCA9PSAweCV4LCB5ZXQgbnVtc2NicyA9PSAweCV4LiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQsIGFoZC0+c2NiX2RhdGEubnVtc2Nicyk7CiAJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CkBAIC04MzI4LDcgKzgzMjQsNyBAQAogCQl9CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IFNDQiA9IDB4JXggTm90IEFjdGl2ZSFcbiIsCisJCQlwcmludGsoIiVzOiBTQ0IgPSAweCV4IE5vdCBBY3RpdmUhXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYmlkKTsKIAkJCXBhbmljKCJXYWl0aW5nIFRJRCBMaXN0IHRyYXZlcnNhbFxuIik7CiAJCX0KQEAgLTgzNDQsNyArODM0MCw3IEBACiAJCSAqIFdlIGZvdW5kIGEgbGlzdCBvZiBzY2JzIHRoYXQgbmVlZHMgdG8gYmUgc2VhcmNoZWQuCiAJCSAqLwogCQlpZiAoYWN0aW9uID09IFNFQVJDSF9QUklOVCkKLQkJCXByaW50ZigiICAgICAgICVkICggIiwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpKTsKKwkJCXByaW50aygiICAgICAgICVkICggIiwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpKTsKIAkJdGlkX2hlYWQgPSBzY2JpZDsKIAkJZm91bmQgKz0gYWhkX3NlYXJjaF9zY2JfbGlzdChhaGQsIHRhcmdldCwgY2hhbm5lbCwKIAkJCQkJICAgICBsdW4sIHRhZywgcm9sZSwgc3RhdHVzLApAQCAtODM2NSwxNCArODM2MSwxNCBAQAogCQkJc3dpdGNoIChhY3Rpb24pIHsKIAkJCWNhc2UgU0VBUkNIX0NPTVBMRVRFOgogCQkJCWlmICgobWtfbXNnX3NjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKQotCQkJCQlwcmludGYoIkluYWN0aXZlIFNDQiBwZW5kaW5nIE1LX01TR1xuIik7CisJCQkJCXByaW50aygiSW5hY3RpdmUgU0NCIHBlbmRpbmcgTUtfTVNHXG4iKTsKIAkJCQlhaGRfZG9uZV93aXRoX3N0YXR1cyhhaGQsIG1rX21zZ19zY2IsIHN0YXR1cyk7CiAJCQkJLyogRkFMTFRIUk9VR0ggKi8KIAkJCWNhc2UgU0VBUkNIX1JFTU9WRToKIAkJCXsKIAkJCQl1X2ludCB0YWlsX29mZnNldDsKIAotCQkJCXByaW50ZigiUmVtb3ZpbmcgTUtfTVNHIHNjYlxuIik7CisJCQkJcHJpbnRrKCJSZW1vdmluZyBNS19NU0cgc2NiXG4iKTsKIAogCQkJCS8qCiAJCQkJICogUmVzZXQgb3VyIHRhaWwgdG8gdGhlIHRhaWwgb2YgdGhlCkBAIC04MzkwLDcgKzgzODYsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBTRUFSQ0hfUFJJTlQ6Ci0JCQkJcHJpbnRmKCIgMHgleCIsIFNDQl9HRVRfVEFHKHNjYikpOworCQkJCXByaW50aygiIDB4JXgiLCBTQ0JfR0VUX1RBRyhzY2IpKTsKIAkJCQkvKiBGQUxMVEhST1VHSCAqLwogCQkJY2FzZSBTRUFSQ0hfQ09VTlQ6CiAJCQkJYnJlYWs7CkBAIC04NDA3LDcgKzg0MDMsNyBAQAogCQkJICogcXVldWUgd2l0aCBhIHBlbmRpbmcgTUtfTUVTU0FHRSBzY2IsIHdlCiAJCQkgKiBtdXN0IHF1ZXVlIHRoZSBNS19NRVNTQUdFIHNjYi4KIAkJCSAqLwotCQkJcHJpbnRmKCJRdWV1ZWluZyBta19tc2dfc2NiXG4iKTsKKwkJCXByaW50aygiUXVldWVpbmcgbWtfbXNnX3NjYlxuIik7CiAJCQl0aWRfaGVhZCA9IGFoZF9pbncoYWhkLCBNS19NRVNTQUdFX1NDQik7CiAJCQlzZXFfZmxhZ3MyICY9IH5QRU5ESU5HX01LX01FU1NBR0U7CiAJCQlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsIHNlcV9mbGFnczIpOwpAQCAtODQxOCw3ICs4NDE0LDcgQEAKIAkJaWYgKCFTQ0JJRF9JU19OVUxMKHRpZF9oZWFkKSkKIAkJCXRpZF9wcmV2ID0gdGlkX2hlYWQ7CiAJCWlmIChhY3Rpb24gPT0gU0VBUkNIX1BSSU5UKQotCQkJcHJpbnRmKCIpXG4iKTsKKwkJCXByaW50aygiKVxuIik7CiAJfQogCiAJLyogUmVzdG9yZSBzYXZlZCBzdGF0ZS4gKi8KQEAgLTg0NDYsNyArODQ0Miw3IEBACiAJKmxpc3RfdGFpbCA9IFNDQl9MSVNUX05VTEw7CiAJZm9yIChzY2JpZCA9IG5leHQ7ICFTQ0JJRF9JU19OVUxMKHNjYmlkKTsgc2NiaWQgPSBuZXh0KSB7CiAJCWlmIChzY2JpZCA+PSBhaGQtPnNjYl9kYXRhLm51bXNjYnMpIHsKLQkJCXByaW50ZigiJXM6U0NCIExpc3QgaW5jb25zaXN0ZW5jeS4gIgorCQkJcHJpbnRrKCIlczpTQ0IgTGlzdCBpbmNvbnNpc3RlbmN5LiAiCiAJCQkgICAgICAgIlNDQiA9PSAweCV4LCB5ZXQgbnVtc2NicyA9PSAweCV4LiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQsIGFoZC0+c2NiX2RhdGEubnVtc2Nicyk7CiAJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CkBAIC04NDU0LDcgKzg0NTAsNyBAQAogCQl9CiAJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IFNDQiA9ICVkIE5vdCBBY3RpdmUhXG4iLAorCQkJcHJpbnRrKCIlczogU0NCID0gJWQgTm90IEFjdGl2ZSFcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOwogCQkJcGFuaWMoIldhaXRpbmcgTGlzdCB0cmF2ZXJzYWxcbiIpOwogCQl9CkBAIC04NDcwLDcgKzg0NjYsNyBAQAogCQlzd2l0Y2ggKGFjdGlvbikgewogCQljYXNlIFNFQVJDSF9DT01QTEVURToKIAkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCi0JCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gV2FpdGluZyBMaXN0XG4iKTsKKwkJCQlwcmludGsoIkluYWN0aXZlIFNDQiBpbiBXYWl0aW5nIExpc3RcbiIpOwogCQkJYWhkX2RvbmVfd2l0aF9zdGF0dXMoYWhkLCBzY2IsIHN0YXR1cyk7CiAJCQkvKiBGQUxMVEhST1VHSCAqLwogCQljYXNlIFNFQVJDSF9SRU1PVkU6CkBAIC04NDgwLDcgKzg0NzYsNyBAQAogCQkJCSpsaXN0X2hlYWQgPSBuZXh0OwogCQkJYnJlYWs7CiAJCWNhc2UgU0VBUkNIX1BSSU5UOgotCQkJcHJpbnRmKCIweCV4ICIsIHNjYmlkKTsKKwkJCXByaW50aygiMHgleCAiLCBzY2JpZCk7CiAJCWNhc2UgU0VBUkNIX0NPVU5UOgogCQkJcHJldiA9IHNjYmlkOwogCQkJYnJlYWs7CkBAIC04NjY4LDcgKzg2NjQsNyBAQAogCQkJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYnApICE9IENBTV9SRVFfQ01QKQogCQkJCWFoZF9mcmVlemVfc2NiKHNjYnApOwogCQkJaWYgKChzY2JwLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCi0JCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0Igb24gcGVuZGluZyBsaXN0XG4iKTsKKwkJCQlwcmludGsoIkluYWN0aXZlIFNDQiBvbiBwZW5kaW5nIGxpc3RcbiIpOwogCQkJYWhkX2RvbmUoYWhkLCBzY2JwKTsKIAkJCWZvdW5kKys7CiAJCX0KQEAgLTg3MjUsNyArODcyMSw3IEBACiAJICogQ2hlY2sgaWYgdGhlIGxhc3QgYnVzIHJlc2V0IGlzIGNsZWFyZWQKIAkgKi8KIAlpZiAoYWhkLT5mbGFncyAmIEFIRF9CVVNfUkVTRVRfQUNUSVZFKSB7Ci0JCXByaW50ZigiJXM6IGJ1cyByZXNldCBzdGlsbCBhY3RpdmVcbiIsCisJCXByaW50aygiJXM6IGJ1cyByZXNldCBzdGlsbCBhY3RpdmVcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODkwMCw3ICs4ODk2LDcgQEAKIAkJYWhkX2VuYWJsZV9jb2FsZXNjaW5nKGFoZCwgZW5pbnRfY29hbCk7CiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfSU5UX0NPQUxFU0NJTkcpICE9IDApCi0JCQlwcmludGYoIiVzOiBJbnRlcnJ1cHQgY29hbGVzY2luZyAiCisJCQlwcmludGsoIiVzOiBJbnRlcnJ1cHQgY29hbGVzY2luZyAiCiAJCQkgICAgICAgIm5vdyAlc2FibGVkLiBDbWRzICVkXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCksCiAJCQkgICAgICAgKGVuaW50X2NvYWwgJiBFTklOVF9DT0FMRVNDRSkgPyAiZW4iIDogImRpcyIsCkBAIC04OTc1LDkgKzg5NzEsOSBAQAogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSAhPSAwKSB7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIlNDQiAweCV4IFJlY2VpdmVkIFBLVCBTdGF0dXMgb2YgMHgleFxuIiwKKwkJCXByaW50aygiU0NCIDB4JXggUmVjZWl2ZWQgUEtUIFN0YXR1cyBvZiAweCV4XG4iLAogCQkJICAgICAgIFNDQl9HRVRfVEFHKHNjYiksIHNpdS0+c3RhdHVzKTsKLQkJCXByaW50ZigiXHRmbGFncyA9IDB4JXgsIHNlbnNlIGxlbiA9IDB4JXgsICIKKwkJCXByaW50aygiXHRmbGFncyA9IDB4JXgsIHNlbnNlIGxlbiA9IDB4JXgsICIKIAkJCSAgICAgICAicGt0ZmFpbCA9IDB4JXhcbiIsCiAJCQkgICAgICAgc2l1LT5mbGFncywgc2NzaV80YnRvdWwoc2l1LT5zZW5zZV9sZW5ndGgpLAogCQkJICAgICAgIHNjc2lfNGJ0b3VsKHNpdS0+cGt0X2ZhaWx1cmVzX2xlbmd0aCkpOwpAQCAtODk4NiwyNyArODk4MiwyNyBAQAogCQlpZiAoKHNpdS0+ZmxhZ3MgJiBTSVVfUlNQVkFMSUQpICE9IDApIHsKIAkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKIAkJCWlmIChzY3NpXzRidG91bChzaXUtPnBrdF9mYWlsdXJlc19sZW5ndGgpIDwgNCkgewotCQkJCXByaW50ZigiVW5hYmxlIHRvIHBhcnNlIHBrdF9mYWlsdXJlc1xuIik7CisJCQkJcHJpbnRrKCJVbmFibGUgdG8gcGFyc2UgcGt0X2ZhaWx1cmVzXG4iKTsKIAkJCX0gZWxzZSB7CiAKIAkJCQlzd2l0Y2ggKFNJVV9QS1RGQUlMX0NPREUoc2l1KSkgewogCQkJCWNhc2UgU0lVX1BGQ19OT05FOgotCQkJCQlwcmludGYoIk5vIHBhY2tldCBmYWlsdXJlIGZvdW5kXG4iKTsKKwkJCQkJcHJpbnRrKCJObyBwYWNrZXQgZmFpbHVyZSBmb3VuZFxuIik7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgU0lVX1BGQ19DSVVfRklFTERTX0lOVkFMSUQ6Ci0JCQkJCXByaW50ZigiSW52YWxpZCBDb21tYW5kIElVIEZpZWxkXG4iKTsKKwkJCQkJcHJpbnRrKCJJbnZhbGlkIENvbW1hbmQgSVUgRmllbGRcbiIpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFNJVV9QRkNfVE1GX05PVF9TVVBQT1JURUQ6Ci0JCQkJCXByaW50ZigiVE1GIG5vdCBzdXBwb3J0ZFxuIik7CisJCQkJCXByaW50aygiVE1GIG5vdCBzdXBwb3J0ZFxuIik7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgU0lVX1BGQ19UTUZfRkFJTEVEOgotCQkJCQlwcmludGYoIlRNRiBmYWlsZWRcbiIpOworCQkJCQlwcmludGsoIlRNRiBmYWlsZWRcbiIpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFNJVV9QRkNfSU5WQUxJRF9UWVBFX0NPREU6Ci0JCQkJCXByaW50ZigiSW52YWxpZCBMX1EgVHlwZSBjb2RlXG4iKTsKKwkJCQkJcHJpbnRrKCJJbnZhbGlkIExfUSBUeXBlIGNvZGVcbiIpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFNJVV9QRkNfSUxMRUdBTF9SRVFVRVNUOgotCQkJCQlwcmludGYoIklsbGVnYWwgcmVxdWVzdFxuIik7CisJCQkJCXByaW50aygiSWxsZWdhbCByZXF1ZXN0XG4iKTsKIAkJCQlkZWZhdWx0OgogCQkJCQlicmVhazsKIAkJCQl9CkBAIC05MDE5LDcgKzkwMTUsNyBAQAogCQkJc2NiLT5mbGFncyB8PSBTQ0JfUEtUX1NFTlNFOwogI2lmZGVmIEFIRF9ERUJVRwogCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgIT0gMCkKLQkJCQlwcmludGYoIlNlbnNlIGRhdGEgYXZhaWxhYmxlXG4iKTsKKwkJCQlwcmludGsoIlNlbnNlIGRhdGEgYXZhaWxhYmxlXG4iKTsKICNlbmRpZgogCQl9CiAJCWFoZF9kb25lKGFoZCwgc2NiKTsKQEAgLTkwMzcsNyArOTAzMyw3IEBACiAjaWZkZWYgQUhEX0RFQlVHCiAJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgewogCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwotCQkJcHJpbnRmKCJTQ0IgJWQ6IHJlcXVlc3RzIENoZWNrIFN0YXR1c1xuIiwKKwkJCXByaW50aygiU0NCICVkOiByZXF1ZXN0cyBDaGVjayBTdGF0dXNcbiIsCiAJCQkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CiAJCX0KICNlbmRpZgpAQCAtOTA2NSw3ICs5MDYxLDcgQEAKICNpZmRlZiBBSERfREVCVUcKIAkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSB7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIlNlbmRpbmcgU2Vuc2VcbiIpOworCQkJcHJpbnRrKCJTZW5kaW5nIFNlbnNlXG4iKTsKIAkJfQogI2VuZGlmCiAJCXNjYi0+c2dfY291bnQgPSAwOwpAQCAtOTExNyw3ICs5MTEzLDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgU0NTSV9TVEFUVVNfT0s6Ci0JCXByaW50ZigiJXM6IEludGVycnVwdGVkIGZvciBzdGF1cyBvZiAwPz8/XG4iLAorCQlwcmludGsoIiVzOiBJbnRlcnJ1cHRlZCBmb3Igc3RhdXMgb2YgMD8/P1xuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCQkvKiBGQUxMVEhST1VHSCAqLwogCWRlZmF1bHQ6CkBAIC05MTkyLDcgKzkxODgsNyBAQAogCQlyZXR1cm47CiAJfSBlbHNlIGlmICgocmVzaWRfc2dwdHIgJiBTR19PVkVSUlVOX1JFU0lEKSAhPSAwKSB7CiAJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJcHJpbnRmKCJkYXRhIG92ZXJydW4gZGV0ZWN0ZWQgVGFnID09IDB4JXguXG4iLAorCQlwcmludGsoImRhdGEgb3ZlcnJ1biBkZXRlY3RlZCBUYWcgPT0gMHgleC5cbiIsCiAJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpKTsKIAkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKIAkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKQEAgLTkyMzIsNyArOTIyOCw3IEBACiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKSB7CiAJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJcHJpbnRmKCJIYW5kbGVkICVzUmVzaWR1YWwgb2YgJWQgYnl0ZXNcbiIsCisJCXByaW50aygiSGFuZGxlZCAlc1Jlc2lkdWFsIG9mICVkIGJ5dGVzXG4iLAogCQkgICAgICAgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpID8gIlNlbnNlICIgOiAiIiwgcmVzaWQpOwogCX0KICNlbmRpZgpAQCAtOTI3Miw3ICs5MjY4LDcgQEAKIAogCWlmIChwZW5kaW5nID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkgewogCQl4cHRfcHJpbnRfcGF0aChsc3RhdGUtPnBhdGgpOwotCQlwcmludGYoImltbWVkaWF0ZSBldmVudCAleDoleCBsb3N0XG4iLAorCQlwcmludGsoImltbWVkaWF0ZSBldmVudCAleDoleCBsb3N0XG4iLAogCQkgICAgICAgbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF9yX2lkeF0uZXZlbnRfdHlwZSwKIAkJICAgICAgIGxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdLmV2ZW50X2FyZyk7CiAJCWxzdGF0ZS0+ZXZlbnRfcl9pZHgrKzsKQEAgLTkzNDQsNyArOTM0MCw3IEBACiAJCXVpbnQ4X3QgaW5zX2J5dGVzWzRdOwogCiAJCWFoZF9pbnNiKGFoZCwgU0VRUkFNLCBpbnNfYnl0ZXMsIDQpOwotCQlwcmludGYoIjB4JTA4eFxuIiwgaW5zX2J5dGVzWzBdIDw8IDI0CisJCXByaW50aygiMHglMDh4XG4iLCBpbnNfYnl0ZXNbMF0gPDwgMjQKIAkJCQkgfCBpbnNfYnl0ZXNbMV0gPDwgMTYKIAkJCQkgfCBpbnNfYnl0ZXNbMl0gPDwgOAogCQkJCSB8IGluc19ieXRlc1szXSk7CkBAIC05MzcyLDcgKzkzNjgsNyBAQAogCXVpbnQ4X3QJZG93bmxvYWRfY29uc3RzW0RPV05MT0FEX0NPTlNUX0NPVU5UXTsKIAogCWlmIChib290dmVyYm9zZSkKLQkJcHJpbnRmKCIlczogRG93bmxvYWRpbmcgU2VxdWVuY2VyIFByb2dyYW0uLi4iLAorCQlwcmludGsoIiVzOiBEb3dubG9hZGluZyBTZXF1ZW5jZXIgUHJvZ3JhbS4uLiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKIAogI2lmIERPV05MT0FEX0NPTlNUX0NPVU5UICE9IDgKQEAgLTk0OTgsNyArOTQ5NCw3IEBACiAJaWYgKGNzX2NvdW50ICE9IDApIHsKIAogCQljc19jb3VudCAqPSBzaXplb2Yoc3RydWN0IGNzKTsKLQkJYWhkLT5jcml0aWNhbF9zZWN0aW9ucyA9IG1hbGxvYyhjc19jb3VudCwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJYWhkLT5jcml0aWNhbF9zZWN0aW9ucyA9IGttYWxsb2MoY3NfY291bnQsIEdGUF9BVE9NSUMpOwogCQlpZiAoYWhkLT5jcml0aWNhbF9zZWN0aW9ucyA9PSBOVUxMKQogCQkJcGFuaWMoImFoZF9sb2Fkc2VxOiBDb3VsZCBub3QgbWFsbG9jIik7CiAJCW1lbWNweShhaGQtPmNyaXRpY2FsX3NlY3Rpb25zLCBjc190YWJsZSwgY3NfY291bnQpOwpAQCAtOTUwNiw4ICs5NTAyLDggQEAKIAlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIFBFUlJPUkRJU3xGQUlMRElTfEZBU1RNT0RFKTsKIAogCWlmIChib290dmVyYm9zZSkgewotCQlwcmludGYoIiAlZCBpbnN0cnVjdGlvbnMgZG93bmxvYWRlZFxuIiwgZG93bmxvYWRlZCk7Ci0JCXByaW50ZigiJXM6IEZlYXR1cmVzIDB4JXgsIEJ1Z3MgMHgleCwgRmxhZ3MgMHgleFxuIiwKKwkJcHJpbnRrKCIgJWQgaW5zdHJ1Y3Rpb25zIGRvd25sb2FkZWRcbiIsIGRvd25sb2FkZWQpOworCQlwcmludGsoIiVzOiBGZWF0dXJlcyAweCV4LCBCdWdzIDB4JXgsIEZsYWdzIDB4JXhcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGQtPmZlYXR1cmVzLCBhaGQtPmJ1Z3MsIGFoZC0+ZmxhZ3MpOwogCX0KIH0KQEAgLTk2OTAsMTIgKzk2ODYsMTIgQEAKIAl1X2ludAlwcmludGVkX21hc2s7CiAKIAlpZiAoY3VyX2NvbHVtbiAhPSBOVUxMICYmICpjdXJfY29sdW1uID49IHdyYXBfcG9pbnQpIHsKLQkJcHJpbnRmKCJcbiIpOworCQlwcmludGsoIlxuIik7CiAJCSpjdXJfY29sdW1uID0gMDsKIAl9Ci0JcHJpbnRlZCA9IHByaW50ZigiJXNbMHgleF0iLCBuYW1lLCB2YWx1ZSk7CisJcHJpbnRlZCA9IHByaW50aygiJXNbMHgleF0iLCBuYW1lLCB2YWx1ZSk7CiAJaWYgKHRhYmxlID09IE5VTEwpIHsKLQkJcHJpbnRlZCArPSBwcmludGYoIiAiKTsKKwkJcHJpbnRlZCArPSBwcmludGsoIiAiKTsKIAkJKmN1cl9jb2x1bW4gKz0gcHJpbnRlZDsKIAkJcmV0dXJuIChwcmludGVkKTsKIAl9CkBAIC05NzEwLDcgKzk3MDYsNyBAQAogCQkJICA9PSB0YWJsZVtlbnRyeV0ubWFzaykpCiAJCQkJY29udGludWU7CiAKLQkJCXByaW50ZWQgKz0gcHJpbnRmKCIlcyVzIiwKKwkJCXByaW50ZWQgKz0gcHJpbnRrKCIlcyVzIiwKIAkJCQkJICBwcmludGVkX21hc2sgPT0gMCA/ICI6KCIgOiAifCIsCiAJCQkJCSAgdGFibGVbZW50cnldLm5hbWUpOwogCQkJcHJpbnRlZF9tYXNrIHw9IHRhYmxlW2VudHJ5XS5tYXNrOwpAQCAtOTcyMSw5ICs5NzE3LDkgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAocHJpbnRlZF9tYXNrICE9IDApCi0JCXByaW50ZWQgKz0gcHJpbnRmKCIpICIpOworCQlwcmludGVkICs9IHByaW50aygiKSAiKTsKIAllbHNlCi0JCXByaW50ZWQgKz0gcHJpbnRmKCIgIik7CisJCXByaW50ZWQgKz0gcHJpbnRrKCIgIik7CiAJaWYgKGN1cl9jb2x1bW4gIT0gTlVMTCkKIAkJKmN1cl9jb2x1bW4gKz0gcHJpbnRlZDsKIAlyZXR1cm4gKHByaW50ZWQpOwpAQCAtOTc0OSwxNyArOTc0NSwxNyBAQAogCX0KIAlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CiAJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOwotCXByaW50ZigiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+IER1bXAgQ2FyZCBTdGF0ZSBCZWdpbnMgPDw8PDw8PDw8PDw8PDw8PDxcbiIKKwlwcmludGsoIj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBEdW1wIENhcmQgU3RhdGUgQmVnaW5zIDw8PDw8PDw8PDw8PDw8PDw8XG4iCiAJICAgICAgICIlczogRHVtcGluZyBDYXJkIFN0YXRlIGF0IHByb2dyYW0gYWRkcmVzcyAweCV4IE1vZGUgMHgleFxuIiwKIAkgICAgICAgYWhkX25hbWUoYWhkKSwgCiAJICAgICAgIGFoZF9pbncoYWhkLCBDVVJBRERSKSwKIAkgICAgICAgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLAogCQkJCSAgICBhaGQtPnNhdmVkX2RzdF9tb2RlKSk7CiAJaWYgKHBhdXNlZCkKLQkJcHJpbnRmKCJDYXJkIHdhcyBwYXVzZWRcbiIpOworCQlwcmludGsoIkNhcmQgd2FzIHBhdXNlZFxuIik7CiAKIAlpZiAoYWhkX2NoZWNrX2NtZGNtcGx0cXVldWVzKGFoZCkpCi0JCXByaW50ZigiQ29tcGxldGlvbnMgYXJlIHBlbmRpbmdcbiIpOworCQlwcmludGsoIkNvbXBsZXRpb25zIGFyZSBwZW5kaW5nXG4iKTsKIAogCS8qCiAJICogTW9kZSBpbmRlcGVuZGVudCByZWdpc3RlcnMuCkBAIC05ODAxLDggKzk3OTcsOCBAQAogCWFoZF9scW9zdGF0MF9wcmludChhaGRfaW5iKGFoZCwgTFFPU1RBVDApLCAmY3VyX2NvbCwgNTApOwogCWFoZF9scW9zdGF0MV9wcmludChhaGRfaW5iKGFoZCwgTFFPU1RBVDEpLCAmY3VyX2NvbCwgNTApOwogCWFoZF9scW9zdGF0Ml9wcmludChhaGRfaW5iKGFoZCwgTFFPU1RBVDIpLCAmY3VyX2NvbCwgNTApOwotCXByaW50ZigiXG4iKTsKLQlwcmludGYoIlxuU0NCIENvdW50ID0gJWQgQ01EU19QRU5ESU5HID0gJWQgTEFTVFNDQiAweCV4ICIKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJcblNDQiBDb3VudCA9ICVkIENNRFNfUEVORElORyA9ICVkIExBU1RTQ0IgMHgleCAiCiAJICAgICAgICJDVVJSU0NCIDB4JXggTkVYVFNDQiAweCV4XG4iLAogCSAgICAgICBhaGQtPnNjYl9kYXRhLm51bXNjYnMsIGFoZF9pbncoYWhkLCBDTURTX1BFTkRJTkcpLAogCSAgICAgICBhaGRfaW53KGFoZCwgTEFTVFNDQiksIGFoZF9pbncoYWhkLCBDVVJSU0NCKSwKQEAgLTk4MTMsMTIgKzk4MDksMTIgQEAKIAkJCSAgIENBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCiAJCQkgICBST0xFX1VOS05PV04sIC8qc3RhdHVzKi8wLCBTRUFSQ0hfUFJJTlQpOwogCXNhdmVkX3NjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7Ci0JcHJpbnRmKCJQZW5kaW5nIGxpc3Q6Iik7CisJcHJpbnRrKCJQZW5kaW5nIGxpc3Q6Iik7CiAJaSA9IDA7CiAJTElTVF9GT1JFQUNIKHNjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CiAJCWlmIChpKysgPiBBSERfU0NCX01BWCkKIAkJCWJyZWFrOwotCQljdXJfY29sID0gcHJpbnRmKCJcbiUzZCBGSUZPX1VTRVsweCV4XSAiLCBTQ0JfR0VUX1RBRyhzY2IpLAorCQljdXJfY29sID0gcHJpbnRrKCJcbiUzZCBGSUZPX1VTRVsweCV4XSAiLCBTQ0JfR0VUX1RBRyhzY2IpLAogCQkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkpOwogCQlhaGRfc2V0X3NjYnB0cihhaGQsIFNDQl9HRVRfVEFHKHNjYikpOwogCQlhaGRfc2NiX2NvbnRyb2xfcHJpbnQoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCksCkBAIC05ODI2LDE2ICs5ODIyLDE2IEBACiAJCWFoZF9zY2Jfc2NzaWlkX3ByaW50KGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NDU0lJRCksCiAJCQkJICAgICAmY3VyX2NvbCwgNjApOwogCX0KLQlwcmludGYoIlxuVG90YWwgJWRcbiIsIGkpOworCXByaW50aygiXG5Ub3RhbCAlZFxuIiwgaSk7CiAKLQlwcmludGYoIktlcm5lbCBGcmVlIFNDQiBsaXN0OiAiKTsKKwlwcmludGsoIktlcm5lbCBGcmVlIFNDQiBsaXN0OiAiKTsKIAlpID0gMDsKIAlUQUlMUV9GT1JFQUNIKHNjYiwgJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzLCBsaW5rcy50cWUpIHsKIAkJc3RydWN0IHNjYiAqbGlzdF9zY2I7CiAKIAkJbGlzdF9zY2IgPSBzY2I7CiAJCWRvIHsKLQkJCXByaW50ZigiJWQgIiwgU0NCX0dFVF9UQUcobGlzdF9zY2IpKTsKKwkJCXByaW50aygiJWQgIiwgU0NCX0dFVF9UQUcobGlzdF9zY2IpKTsKIAkJCWxpc3Rfc2NiID0gTElTVF9ORVhUKGxpc3Rfc2NiLCBjb2xsaXNpb25fbGlua3MpOwogCQl9IHdoaWxlIChsaXN0X3NjYiAmJiBpKysgPCBBSERfU0NCX01BWCk7CiAJfQpAQCAtOTg0Myw0OSArOTgzOSw0OSBAQAogCUxJU1RfRk9SRUFDSChzY2IsICZhaGQtPnNjYl9kYXRhLmFueV9kZXZfZnJlZV9zY2JfbGlzdCwgbGlua3MubGUpIHsKIAkJaWYgKGkrKyA+IEFIRF9TQ0JfTUFYKQogCQkJYnJlYWs7Ci0JCXByaW50ZigiJWQgIiwgU0NCX0dFVF9UQUcoc2NiKSk7CisJCXByaW50aygiJWQgIiwgU0NCX0dFVF9UQUcoc2NiKSk7CiAJfQotCXByaW50ZigiXG4iKTsKKwlwcmludGsoIlxuIik7CiAKLQlwcmludGYoIlNlcXVlbmNlciBDb21wbGV0ZSBETUEtaW5wcm9nIGxpc3Q6ICIpOworCXByaW50aygiU2VxdWVuY2VyIENvbXBsZXRlIERNQS1pbnByb2cgbGlzdDogIik7CiAJc2NiX2luZGV4ID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRCk7CiAJaSA9IDA7CiAJd2hpbGUgKCFTQ0JJRF9JU19OVUxMKHNjYl9pbmRleCkgJiYgaSsrIDwgQUhEX1NDQl9NQVgpIHsKIAkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JfaW5kZXgpOwotCQlwcmludGYoIiVkICIsIHNjYl9pbmRleCk7CisJCXByaW50aygiJWQgIiwgc2NiX2luZGV4KTsKIAkJc2NiX2luZGV4ID0gYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVF9DT01QTEVURSk7CiAJfQotCXByaW50ZigiXG4iKTsKKwlwcmludGsoIlxuIik7CiAKLQlwcmludGYoIlNlcXVlbmNlciBDb21wbGV0ZSBsaXN0OiAiKTsKKwlwcmludGsoIlNlcXVlbmNlciBDb21wbGV0ZSBsaXN0OiAiKTsKIAlzY2JfaW5kZXggPSBhaGRfaW53KGFoZCwgQ09NUExFVEVfU0NCX0hFQUQpOwogCWkgPSAwOwogCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JfaW5kZXgpICYmIGkrKyA8IEFIRF9TQ0JfTUFYKSB7CiAJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiX2luZGV4KTsKLQkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlwcmludGsoIiVkICIsIHNjYl9pbmRleCk7CiAJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOwogCX0KLQlwcmludGYoIlxuIik7CisJcHJpbnRrKCJcbiIpOwogCiAJCi0JcHJpbnRmKCJTZXF1ZW5jZXIgRE1BLVVwIGFuZCBDb21wbGV0ZSBsaXN0OiAiKTsKKwlwcmludGsoIlNlcXVlbmNlciBETUEtVXAgYW5kIENvbXBsZXRlIGxpc3Q6ICIpOwogCXNjYl9pbmRleCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQpOwogCWkgPSAwOwogCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JfaW5kZXgpICYmIGkrKyA8IEFIRF9TQ0JfTUFYKSB7CiAJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiX2luZGV4KTsKLQkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlwcmludGsoIiVkICIsIHNjYl9pbmRleCk7CiAJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOwogCX0KLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJTZXF1ZW5jZXIgT24gUUZyZWV6ZSBhbmQgQ29tcGxldGUgbGlzdDogIik7CisJcHJpbnRrKCJcbiIpOworCXByaW50aygiU2VxdWVuY2VyIE9uIFFGcmVlemUgYW5kIENvbXBsZXRlIGxpc3Q6ICIpOwogCXNjYl9pbmRleCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQpOwogCWkgPSAwOwogCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JfaW5kZXgpICYmIGkrKyA8IEFIRF9TQ0JfTUFYKSB7CiAJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiX2luZGV4KTsKLQkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlwcmludGsoIiVkICIsIHNjYl9pbmRleCk7CiAJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOwogCX0KLQlwcmludGYoIlxuIik7CisJcHJpbnRrKCJcbiIpOwogCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NiX2luZGV4KTsKIAlkZmZzdGF0ID0gYWhkX2luYihhaGQsIERGRlNUQVQpOwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKQEAgLTk4OTYsNyArOTg5Miw3IEBACiAKIAkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0RGRjAgKyBpLCBBSERfTU9ERV9ERkYwICsgaSk7CiAJCWZpZm9fc2NicHRyID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKLQkJcHJpbnRmKCJcblxuJXM6IEZJRk8lZCAlcywgTE9OR0pNUCA9PSAweCV4LCBTQ0IgMHgleFxuIiwKKwkJcHJpbnRrKCJcblxuJXM6IEZJRk8lZCAlcywgTE9OR0pNUCA9PSAweCV4LCBTQ0IgMHgleFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGksCiAJCSAgICAgICAoZGZmc3RhdCAmIChGSUZPMEZSRUUgPDwgaSkpID8gIkZyZWUiIDogIkFjdGl2ZSIsCiAJCSAgICAgICBhaGRfaW53KGFoZCwgTE9OR0pNUF9BRERSKSwgZmlmb19zY2JwdHIpOwpAQCAtOTkxMiwyMCArOTkwOCwyMCBAQAogCQlhaGRfc29mZmNudF9wcmludChhaGRfaW5iKGFoZCwgU09GRkNOVCksICZjdXJfY29sLCA1MCk7CiAJCWFoZF9tZGZmc3RhdF9wcmludChhaGRfaW5iKGFoZCwgTURGRlNUQVQpLCAmY3VyX2NvbCwgNTApOwogCQlpZiAoY3VyX2NvbCA+IDUwKSB7Ci0JCQlwcmludGYoIlxuIik7CisJCQlwcmludGsoIlxuIik7CiAJCQljdXJfY29sID0gMDsKIAkJfQotCQljdXJfY29sICs9IHByaW50ZigiU0hBRERSID0gMHgleCV4LCBTSENOVCA9IDB4JXggIiwKKwkJY3VyX2NvbCArPSBwcmludGsoIlNIQUREUiA9IDB4JXgleCwgU0hDTlQgPSAweCV4ICIsCiAJCQkJICBhaGRfaW5sKGFoZCwgU0hBRERSKzQpLAogCQkJCSAgYWhkX2lubChhaGQsIFNIQUREUiksCiAJCQkJICAoYWhkX2luYihhaGQsIFNIQ05UKQogCQkJCXwgKGFoZF9pbmIoYWhkLCBTSENOVCArIDEpIDw8IDgpCiAJCQkJfCAoYWhkX2luYihhaGQsIFNIQ05UICsgMikgPDwgMTYpKSk7CiAJCWlmIChjdXJfY29sID4gNTApIHsKLQkJCXByaW50ZigiXG4iKTsKKwkJCXByaW50aygiXG4iKTsKIAkJCWN1cl9jb2wgPSAwOwogCQl9Ci0JCWN1cl9jb2wgKz0gcHJpbnRmKCJIQUREUiA9IDB4JXgleCwgSENOVCA9IDB4JXggIiwKKwkJY3VyX2NvbCArPSBwcmludGsoIkhBRERSID0gMHgleCV4LCBIQ05UID0gMHgleCAiLAogCQkJCSAgYWhkX2lubChhaGQsIEhBRERSKzQpLAogCQkJCSAgYWhkX2lubChhaGQsIEhBRERSKSwKIAkJCQkgIChhaGRfaW5iKGFoZCwgSENOVCkKQEAgLTk5NDAsNTIgKzk5MzYsNTIgQEAKIAkJfQogI2VuZGlmCiAJfQotCXByaW50ZigiXG5MUUlOOiAiKTsKKwlwcmludGsoIlxuTFFJTjogIik7CiAJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCi0JCXByaW50ZigiMHgleCAiLCBhaGRfaW5iKGFoZCwgTFFJTiArIGkpKTsKLQlwcmludGYoIlxuIik7CisJCXByaW50aygiMHgleCAiLCBhaGRfaW5iKGFoZCwgTFFJTiArIGkpKTsKKwlwcmludGsoIlxuIik7CiAJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKLQlwcmludGYoIiVzOiBMUUlTVEFURSA9IDB4JXgsIExRT1NUQVRFID0gMHgleCwgT1BUSU9OTU9ERSA9IDB4JXhcbiIsCisJcHJpbnRrKCIlczogTFFJU1RBVEUgPSAweCV4LCBMUU9TVEFURSA9IDB4JXgsIE9QVElPTk1PREUgPSAweCV4XG4iLAogCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW5iKGFoZCwgTFFJU1RBVEUpLCBhaGRfaW5iKGFoZCwgTFFPU1RBVEUpLAogCSAgICAgICBhaGRfaW5iKGFoZCwgT1BUSU9OTU9ERSkpOwotCXByaW50ZigiJXM6IE9TX1NQQUNFX0NOVCA9IDB4JXggTUFYQ01EQ05UID0gMHgleFxuIiwKKwlwcmludGsoIiVzOiBPU19TUEFDRV9DTlQgPSAweCV4IE1BWENNRENOVCA9IDB4JXhcbiIsCiAJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9pbmIoYWhkLCBPU19TUEFDRV9DTlQpLAogCSAgICAgICBhaGRfaW5iKGFoZCwgTUFYQ01EQ05UKSk7Ci0JcHJpbnRmKCIlczogU0FWRURfU0NTSUlEID0gMHgleCBTQVZFRF9MVU4gPSAweCV4XG4iLAorCXByaW50aygiJXM6IFNBVkVEX1NDU0lJRCA9IDB4JXggU0FWRURfTFVOID0gMHgleFxuIiwKIAkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCksCiAJICAgICAgIGFoZF9pbmIoYWhkLCBTQVZFRF9MVU4pKTsKIAlhaGRfc2ltb2RlMF9wcmludChhaGRfaW5iKGFoZCwgU0lNT0RFMCksICZjdXJfY29sLCA1MCk7Ci0JcHJpbnRmKCJcbiIpOworCXByaW50aygiXG4iKTsKIAlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0NIQU4sIEFIRF9NT0RFX0NDSEFOKTsKIAljdXJfY29sID0gMDsKIAlhaGRfY2NzY2JjdGxfcHJpbnQoYWhkX2luYihhaGQsIENDU0NCQ1RMKSwgJmN1cl9jb2wsIDUwKTsKLQlwcmludGYoIlxuIik7CisJcHJpbnRrKCJcbiIpOwogCWFoZF9zZXRfbW9kZXMoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLCBhaGQtPnNhdmVkX2RzdF9tb2RlKTsKLQlwcmludGYoIiVzOiBSRUcwID09IDB4JXgsIFNJTkRFWCA9IDB4JXgsIERJTkRFWCA9IDB4JXhcbiIsCisJcHJpbnRrKCIlczogUkVHMCA9PSAweCV4LCBTSU5ERVggPSAweCV4LCBESU5ERVggPSAweCV4XG4iLAogCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW53KGFoZCwgUkVHMCksIGFoZF9pbncoYWhkLCBTSU5ERVgpLAogCSAgICAgICBhaGRfaW53KGFoZCwgRElOREVYKSk7Ci0JcHJpbnRmKCIlczogU0NCUFRSID09IDB4JXgsIFNDQl9ORVhUID09IDB4JXgsIFNDQl9ORVhUMiA9PSAweCV4XG4iLAorCXByaW50aygiJXM6IFNDQlBUUiA9PSAweCV4LCBTQ0JfTkVYVCA9PSAweCV4LCBTQ0JfTkVYVDIgPT0gMHgleFxuIiwKIAkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX2dldF9zY2JwdHIoYWhkKSwKIAkgICAgICAgYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVCksCiAJICAgICAgIGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKSk7Ci0JcHJpbnRmKCJDREIgJXggJXggJXggJXggJXggJXhcbiIsCisJcHJpbnRrKCJDREIgJXggJXggJXggJXggJXggJXhcbiIsCiAJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NEQl9TVE9SRSksCiAJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NEQl9TVE9SRSsxKSwKIAkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKzIpLAogCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DREJfU1RPUkUrMyksCiAJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NEQl9TVE9SRSs0KSwKIAkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKzUpKTsKLQlwcmludGYoIlNUQUNLOiIpOworCXByaW50aygiU1RBQ0s6Iik7CiAJZm9yIChpID0gMDsgaSA8IGFoZC0+c3RhY2tfc2l6ZTsgaSsrKSB7CiAJCWFoZC0+c2F2ZWRfc3RhY2tbaV0gPQogCQkgICAgYWhkX2luYihhaGQsIFNUQUNLKXwoYWhkX2luYihhaGQsIFNUQUNLKSA8PCA4KTsKLQkJcHJpbnRmKCIgMHgleCIsIGFoZC0+c2F2ZWRfc3RhY2tbaV0pOworCQlwcmludGsoIiAweCV4IiwgYWhkLT5zYXZlZF9zdGFja1tpXSk7CiAJfQogCWZvciAoaSA9IGFoZC0+c3RhY2tfc2l6ZS0xOyBpID49IDA7IGktLSkgewogCQlhaGRfb3V0YihhaGQsIFNUQUNLLCBhaGQtPnNhdmVkX3N0YWNrW2ldICYgMHhGRik7CiAJCWFoZF9vdXRiKGFoZCwgU1RBQ0ssIChhaGQtPnNhdmVkX3N0YWNrW2ldID4+IDgpICYgMHhGRik7CiAJfQotCXByaW50ZigiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOworCXByaW50aygiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOwogCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOwogCWlmIChwYXVzZWQgPT0gMCkKIAkJYWhkX3VucGF1c2UoYWhkKTsKQEAgLTEwMDA0LDggKzEwMDAwLDggQEAKIAlzYXZlZF9zY2JfaW5kZXggPSBhaGRfZ2V0X3NjYnB0cihhaGQpOwogCWZvciAoaSA9IDA7IGkgPCBBSERfU0NCX01BWDsgaSsrKSB7CiAJCWFoZF9zZXRfc2NicHRyKGFoZCwgaSk7Ci0JCXByaW50ZigiJTNkIiwgaSk7Ci0JCXByaW50ZigiKENUUkwgMHgleCBJRCAweCV4IE4gMHgleCBOMiAweCV4IFNHIDB4JXgsIFJTRyAweCV4KVxuIiwKKwkJcHJpbnRrKCIlM2QiLCBpKTsKKwkJcHJpbnRrKCIoQ1RSTCAweCV4IElEIDB4JXggTiAweCV4IE4yIDB4JXggU0cgMHgleCwgUlNHIDB4JXgpXG4iLAogCQkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCksCiAJCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9TQ1NJSUQpLAogCQkgICAgICAgYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVCksCkBAIC0xMDAxMyw3ICsxMDAwOSw3IEBACiAJCSAgICAgICBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9TR1BUUiksCiAJCSAgICAgICBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUikpOwogCX0KLQlwcmludGYoIlxuIik7CisJcHJpbnRrKCJcbiIpOwogCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NiX2luZGV4KTsKIAlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKIH0KQEAgLTEwMzgzLDcgKzEwMzc5LDcgQEAKIAkgJiYgY2NiLT5jY2JfaC50YXJnZXRfaWQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgewogCQl1X2xvbmcJczsKIAotCQlwcmludGYoIkNvbmZpZ3VyaW5nIFRhcmdldCBNb2RlXG4iKTsKKwkJcHJpbnRrKCJDb25maWd1cmluZyBUYXJnZXQgTW9kZVxuIik7CiAJCWFoZF9sb2NrKGFoZCwgJnMpOwogCQlpZiAoTElTVF9GSVJTVCgmYWhkLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKIAkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX0JVU1k7CkBAIC0xMDQxMiw3ICsxMDQwOCw3IEBACiAJCS8qIEFyZSB3ZSBhbHJlYWR5IGVuYWJsZWQ/PyAqLwogCQlpZiAobHN0YXRlICE9IE5VTEwpIHsKIAkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7Ci0JCQlwcmludGYoIkx1biBhbHJlYWR5IGVuYWJsZWRcbiIpOworCQkJcHJpbnRrKCJMdW4gYWxyZWFkeSBlbmFibGVkXG4iKTsKIAkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX0xVTl9BTFJEWV9FTkE7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTEwNDI0LDcgKzEwNDIwLDcgQEAKIAkJCSAqIHNwZWNpZmljIGNvbW1hbmRzLgogCQkJICovCiAJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKLQkJCXByaW50ZigiTm9uLXplcm8gR3JvdXAgQ29kZXNcbiIpOworCQkJcHJpbnRrKCJOb24temVybyBHcm91cCBDb2Rlc1xuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtMTA0MzYsMTUgKzEwNDMyLDE1IEBACiAJCQl0c3RhdGUgPSBhaGRfYWxsb2NfdHN0YXRlKGFoZCwgdGFyZ2V0LCBjaGFubmVsKTsKIAkJCWlmICh0c3RhdGUgPT0gTlVMTCkgewogCQkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7Ci0JCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSB0c3RhdGVcbiIpOworCQkJCXByaW50aygiQ291bGRuJ3QgYWxsb2NhdGUgdHN0YXRlXG4iKTsKIAkJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVNSQ19VTkFWQUlMOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQotCQlsc3RhdGUgPSBtYWxsb2Moc2l6ZW9mKCpsc3RhdGUpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQlsc3RhdGUgPSBrbWFsbG9jKHNpemVvZigqbHN0YXRlKSwgR0ZQX0FUT01JQyk7CiAJCWlmIChsc3RhdGUgPT0gTlVMTCkgewogCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgbHN0YXRlXG4iKTsKKwkJCXByaW50aygiQ291bGRuJ3QgYWxsb2NhdGUgbHN0YXRlXG4iKTsKIAkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTEwNDU0LDkgKzEwNDUwLDkgQEAKIAkJCQkJIHhwdF9wYXRoX3RhcmdldF9pZChjY2ItPmNjYl9oLnBhdGgpLAogCQkJCQkgeHB0X3BhdGhfbHVuX2lkKGNjYi0+Y2NiX2gucGF0aCkpOwogCQlpZiAoc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7Ci0JCQlmcmVlKGxzdGF0ZSwgTV9ERVZCVUYpOworCQkJa2ZyZWUobHN0YXRlKTsKIAkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7Ci0JCQlwcmludGYoIkNvdWxkbid0IGFsbG9jYXRlIHBhdGhcbiIpOworCQkJcHJpbnRrKCJDb3VsZG4ndCBhbGxvY2F0ZSBwYXRoXG4iKTsKIAkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTEwNTI0LDcgKzEwNTIwLDcgQEAKIAkJYWhkX3VubG9jayhhaGQsICZzKTsKIAkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0NNUDsKIAkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJcHJpbnRmKCJMdW4gbm93IGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlXG4iKTsKKwkJcHJpbnRrKCJMdW4gbm93IGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlXG4iKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc2NiICpzY2I7CiAJCWludCBpLCBlbXB0eTsKQEAgLTEwNTQzLDcgKzEwNTM5LDcgQEAKIAkJCWNjYmggPSAmc2NiLT5pb19jdHgtPmNjYl9oOwogCQkJaWYgKGNjYmgtPmZ1bmNfY29kZSA9PSBYUFRfQ09OVF9UQVJHRVRfSU8KIAkJCSAmJiAheHB0X3BhdGhfY29tcChjY2JoLT5wYXRoLCBjY2ItPmNjYl9oLnBhdGgpKXsKLQkJCQlwcmludGYoIkNUSU8gcGVuZGluZ1xuIik7CisJCQkJcHJpbnRrKCJDVElPIHBlbmRpbmdcbiIpOwogCQkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOwogCQkJCWFoZF91bmxvY2soYWhkLCAmcyk7CiAJCQkJcmV0dXJuOwpAQCAtMTA1NTEsMTIgKzEwNTQ3LDEyIEBACiAJCX0KIAogCQlpZiAoU0xJU1RfRklSU1QoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MpICE9IE5VTEwpIHsKLQkJCXByaW50ZigiQVRJT3MgcGVuZGluZ1xuIik7CisJCQlwcmludGsoIkFUSU9zIHBlbmRpbmdcbiIpOwogCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CiAJCX0KIAogCQlpZiAoU0xJU1RfRklSU1QoJmxzdGF0ZS0+aW1tZWRfbm90aWZpZXMpICE9IE5VTEwpIHsKLQkJCXByaW50ZigiSU5PVHMgcGVuZGluZ1xuIik7CisJCQlwcmludGsoIklOT1RzIHBlbmRpbmdcbiIpOwogCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CiAJCX0KIApAQCAtMTA1NjYsOSArMTA1NjIsOSBAQAogCQl9CiAKIAkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJcHJpbnRmKCJUYXJnZXQgbW9kZSBkaXNhYmxlZFxuIik7CisJCXByaW50aygiVGFyZ2V0IG1vZGUgZGlzYWJsZWRcbiIpOwogCQl4cHRfZnJlZV9wYXRoKGxzdGF0ZS0+cGF0aCk7Ci0JCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCWtmcmVlKGxzdGF0ZSk7CiAKIAkJYWhkX3BhdXNlKGFoZCk7CiAJCS8qIENhbiB3ZSBjbGVhbiB1cCB0aGUgdGFyZ2V0IHRvbz8gKi8KQEAgLTEwNjE1LDcgKzEwNjExLDcgQEAKIAkJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTEsIHNjc2lzZXExKTsKIAogCQkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJUk9MRSkgPT0gMCkgewotCQkJCXByaW50ZigiQ29uZmlndXJpbmcgSW5pdGlhdG9yIE1vZGVcbiIpOworCQkJCXByaW50aygiQ29uZmlndXJpbmcgSW5pdGlhdG9yIE1vZGVcbiIpOwogCQkJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9UQVJHRVRST0xFOwogCQkJCWFoZC0+ZmxhZ3MgfD0gQUhEX0lOSVRJQVRPUlJPTEU7CiAJCQkJYWhkX3BhdXNlKGFoZCk7CkBAIC0xMDc0OSw3ICsxMDc0NSw3IEBACiAJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9UUUlORklGT19CTE9DS0VEOwogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfVFFJTikgIT0gMCkKLQkJcHJpbnRmKCJJbmNvbWluZyBjb21tYW5kIGZyb20gJWQgZm9yICVkOiVkJXNcbiIsCisJCXByaW50aygiSW5jb21pbmcgY29tbWFuZCBmcm9tICVkIGZvciAlZDolZCVzXG4iLAogCQkgICAgICAgaW5pdGlhdG9yLCB0YXJnZXQsIGx1biwKIAkJICAgICAgIGxzdGF0ZSA9PSBhaGQtPmJsYWNrX2hvbGUgPyAiKEJsYWNrIEhvbGVkKSIgOiAiIik7CiAjZW5kaWYKQEAgLTEwNzk2LDcgKzEwNzkyLDcgQEAKIAlkZWZhdWx0OgogCQkvKiBPbmx5IGNvcHkgdGhlIG9wY29kZS4gKi8KIAkJYXRpby0+Y2RiX2xlbiA9IDE7Ci0JCXByaW50ZigiUmVzZXJ2ZWQgb3IgVlUgY29tbWFuZCBjb2RlIHR5cGUgZW5jb3VudGVyZWRcbiIpOworCQlwcmludGsoIlJlc2VydmVkIG9yIFZVIGNvbW1hbmQgY29kZSB0eXBlIGVuY291bnRlcmVkXG4iKTsKIAkJYnJlYWs7CiAJfQogCQpAQCAtMTA4MTMsNyArMTA4MDksNyBAQAogCQkgKi8KICNpZmRlZiBBSERfREVCVUcKIAkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19UUUlOKSAhPSAwKQotCQkJcHJpbnRmKCJSZWNlaXZlZCBJbW1lZGlhdGUgQ29tbWFuZCAlZDolZDolZCAtICVwXG4iLAorCQkJcHJpbnRrKCJSZWNlaXZlZCBJbW1lZGlhdGUgQ29tbWFuZCAlZDolZDolZCAtICVwXG4iLAogCQkJICAgICAgIGluaXRpYXRvciwgdGFyZ2V0LCBsdW4sIGFoZC0+cGVuZGluZ19kZXZpY2UpOwogI2VuZGlmCiAJCWFoZC0+cGVuZGluZ19kZXZpY2UgPSBsc3RhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwppbmRleCA0YzQxMzMyLi44OGFkODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKQEAgLTY3NCw3ICs2NzQsNyBAQAogCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7CiAKIAlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IFNsYXZlIEFsbG9jICVkXG4iLCBhaGRfbmFtZShhaGQpLCBzZGV2LT5pZCk7CisJCXByaW50aygiJXM6IFNsYXZlIEFsbG9jICVkXG4iLCBhaGRfbmFtZShhaGQpLCBzZGV2LT5pZCk7CiAKIAlkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKIAltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwpAQCAtNzk4LDEwICs3OTgsMTAgQEAKIAlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwKIAkJICAgICJBdHRlbXB0aW5nIHRvIHF1ZXVlIGEgVEFSR0VUIFJFU0VUIG1lc3NhZ2U6Iik7CiAKLQlwcmludGYoIkNEQjoiKTsKKwlwcmludGsoIkNEQjoiKTsKIAlmb3IgKGNkYl9ieXRlID0gMDsgY2RiX2J5dGUgPCBjbWQtPmNtZF9sZW47IGNkYl9ieXRlKyspCi0JCXByaW50ZigiIDB4JXgiLCBjbWQtPmNtbmRbY2RiX2J5dGVdKTsKLQlwcmludGYoIlxuIik7CisJCXByaW50aygiIDB4JXgiLCBjbWQtPmNtbmRbY2RiX2J5dGVdKTsKKwlwcmludGsoIlxuIik7CiAKIAkvKgogCSAqIERldGVybWluZSBpZiB3ZSBjdXJyZW50bHkgb3duIHRoaXMgY29tbWFuZC4KQEAgLTg1NywxNiArODU3LDE2IEBACiAJYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9kb25lID0gJmRvbmU7CiAJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiAKLQlwcmludGYoIiVzOiBEZXZpY2UgcmVzZXQgY29kZSBzbGVlcGluZ1xuIiwgYWhkX25hbWUoYWhkKSk7CisJcHJpbnRrKCIlczogRGV2aWNlIHJlc2V0IGNvZGUgc2xlZXBpbmdcbiIsIGFoZF9uYW1lKGFoZCkpOwogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkb25lLCA1ICogSFopKSB7CiAJCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKIAkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9kb25lID0gTlVMTDsKIAkJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Ci0JCXByaW50ZigiJXM6IERldmljZSByZXNldCB0aW1lciBleHBpcmVkIChhY3RpdmUgJWQpXG4iLAorCQlwcmludGsoIiVzOiBEZXZpY2UgcmVzZXQgdGltZXIgZXhwaXJlZCAoYWN0aXZlICVkKVxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldi0+YWN0aXZlKTsKIAkJcmV0dmFsID0gRkFJTEVEOwogCX0KLQlwcmludGYoIiVzOiBEZXZpY2UgcmVzZXQgcmV0dXJuaW5nIDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksIHJldHZhbCk7CisJcHJpbnRrKCIlczogRGV2aWNlIHJlc2V0IHJldHVybmluZyAweCV4XG4iLCBhaGRfbmFtZShhaGQpLCByZXR2YWwpOwogCiAJcmV0dXJuIChyZXR2YWwpOwogfQpAQCAtODg0LDcgKzg4NCw3IEBACiAJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKICNpZmRlZiBBSERfREVCVUcKIAlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKQotCQlwcmludGYoIiVzOiBCdXMgcmVzZXQgY2FsbGVkIGZvciBjbWQgJXBcbiIsCisJCXByaW50aygiJXM6IEJ1cyByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZCk7CiAjZW5kaWYKIAlhaGRfbG9jayhhaGQsICZmbGFncyk7CkBAIC04OTQsNyArODk0LDcgQEAKIAlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKIAogCWlmIChib290dmVyYm9zZSkKLQkJcHJpbnRmKCIlczogU0NTSSBidXMgcmVzZXQgZGVsaXZlcmVkLiAiCisJCXByaW50aygiJXM6IFNDU0kgYnVzIHJlc2V0IGRlbGl2ZXJlZC4gIgogCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZC5cbiIsIGFoZF9uYW1lKGFoZCksIGZvdW5kKTsKIAogCXJldHVybiAoU1VDQ0VTUyk7CkBAIC05MzUsNyArOTM1LDcgQEAKIHsKIAlidXNfZG1hX3RhZ190IGRtYXQ7CiAKLQlkbWF0ID0gbWFsbG9jKHNpemVvZigqZG1hdCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJZG1hdCA9IGttYWxsb2Moc2l6ZW9mKCpkbWF0KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGRtYXQgPT0gTlVMTCkKIAkJcmV0dXJuIChFTk9NRU0pOwogCkBAIC05NTYsNyArOTU2LDcgQEAKIHZvaWQKIGFoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQpCiB7Ci0JZnJlZShkbWF0LCBNX0RFVkJVRik7CisJa2ZyZWUoZG1hdCk7CiB9CiAKIGludApAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAkJaW9jZWxsX2luZm8gPSAodWludDhfdCopJmFpYzc5eHhfaW9jZWxsX2luZm9baW5zdGFuY2VdOwogCQlpb2NlbGxfaW5mb1tpbmRleF0gPSB2YWx1ZSAmIDB4RkZGRjsKIAkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCJpb2NlbGxbJWQ6JWxkXSA9ICVkXG4iLCBpbnN0YW5jZSwgaW5kZXgsIHZhbHVlKTsKKwkJCXByaW50aygiaW9jZWxsWyVkOiVsZF0gPSAlZFxuIiwgaW5zdGFuY2UsIGluZGV4LCB2YWx1ZSk7CiAJfQogfQogCkBAIC0xMDI5LDcgKzEwMjksNyBAQAogCWludCB0YWdzLCBpLCBqOwogCiAJdGFncyA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKSAmIDB4ZmY7Ci0JcHJpbnRmKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7CisJcHJpbnRrKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaWM3OXh4X3RhZ19pbmZvKTsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBBSERfTlVNX1RBUkdFVFM7IGorKykgewpAQCAtMTA0Nyw3ICsxMDQ3LDcgQEAKIAkgJiYgKHRhcmcgPCBBSERfTlVNX1RBUkdFVFMpKSB7CiAJCWFpYzc5eHhfdGFnX2luZm9baW5zdGFuY2VdLnRhZ19jb21tYW5kc1t0YXJnXSA9IHZhbHVlICYgMHgxRkY7CiAJCWlmIChib290dmVyYm9zZSkKLQkJCXByaW50ZigidGFnX2luZm9bJWQ6JWRdID0gJWRcbiIsIGluc3RhbmNlLCB0YXJnLCB2YWx1ZSk7CisJCQlwcmludGsoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOwogCX0KIH0KIApAQCAtMTA4OCw3ICsxMDg4LDcgQEAKIAkJCQkJaWYgKHRhcmcgPT0gLTEpCiAJCQkJCQl0YXJnID0gMDsKIAkJCQl9IGVsc2UgewotCQkJCQlwcmludGYoIk1hbGZvcm1lZCBPcHRpb24gJXNcbiIsCisJCQkJCXByaW50aygiTWFsZm9ybWVkIE9wdGlvbiAlc1xuIiwKIAkJCQkJICAgICAgIG9wdF9uYW1lKTsKIAkJCQkJZG9uZSA9IFRSVUU7CiAJCQkJfQpAQCAtMTI0Niw3ICsxMjQ2LDcgQEAKIAlhaGRfc2V0X3VuaXQoYWhkLCBhaGRfbGludXhfdW5pdCsrKTsKIAlhaGRfdW5sb2NrKGFoZCwgJnMpOwogCXNwcmludGYoYnVmLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7Ci0JbmV3X25hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCW5ld19uYW1lID0ga21hbGxvYyhzdHJsZW4oYnVmKSArIDEsIEdGUF9BVE9NSUMpOwogCWlmIChuZXdfbmFtZSAhPSBOVUxMKSB7CiAJCXN0cmNweShuZXdfbmFtZSwgYnVmKTsKIAkJYWhkX3NldF9uYW1lKGFoZCwgbmV3X25hbWUpOwpAQCAtMTMyMiw3ICsxMzIyLDcgQEAKIGFoZF9wbGF0Zm9ybV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHZvaWQgKnBsYXRmb3JtX2FyZykKIHsKIAlhaGQtPnBsYXRmb3JtX2RhdGEgPQotCSAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaGRfcGxhdGZvcm1fZGF0YSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaGRfcGxhdGZvcm1fZGF0YSksIEdGUF9BVE9NSUMpOwogCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIChFTk9NRU0pOwogCW1lbXNldChhaGQtPnBsYXRmb3JtX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpKTsKQEAgLTEzNjQsNyArMTM2NCw3IEBACiAJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpCiAJCQlzY3NpX2hvc3RfcHV0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CiAKLQkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEsIE1fREVWQlVGKTsKKwkJa2ZyZWUoYWhkLT5wbGF0Zm9ybV9kYXRhKTsKIAl9CiB9CiAKQEAgLTE1MDIsNyArMTUwMiw3IEBACiAJCWlmIChhaGQtPnVuaXQgPj0gQVJSQVlfU0laRShhaWM3OXh4X3RhZ19pbmZvKSkgewogCiAJCQlpZiAod2FybmVkX3VzZXIgPT0gMCkgewotCQkJCXByaW50ZihLRVJOX1dBUk5JTkcKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAiYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgogImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuICBVc2luZyBkZWZhdWx0c1xuIgogImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfdGFnX2luZm8gYXJyYXkgaW5cbiIKQEAgLTE1NDQsNyArMTU0NCw3IEBACiAJCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKIAkJCSAgICAgICBkZXZpbmZvLmx1biwgQUNfVFJBTlNGRVJfTkVHKTsKIAkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7Ci0JCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKKwkJcHJpbnRrKCJUYWdnZWQgUXVldWluZyBlbmFibGVkLiAgRGVwdGggJWRcbiIsIHRhZ3MpOwogCX0gZWxzZSB7CiAJCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsIHNkZXYsICZkZXZpbmZvLCBBSERfUVVFVUVfTk9ORSk7CiAJCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKQEAgLTE3OTQsNyArMTc5NCw3IEBACiAJc3RydWN0CSAgYWhkX2xpbnV4X2RldmljZSAqZGV2OwogCiAJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgewotCQlwcmludGYoIlNDQiAlZCBkb25lJ2QgdHdpY2VcbiIsIFNDQl9HRVRfVEFHKHNjYikpOworCQlwcmludGsoIlNDQiAlZCBkb25lJ2QgdHdpY2VcbiIsIFNDQl9HRVRfVEFHKHNjYikpOwogCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAJCXBhbmljKCJTdG9wcGluZyBmb3Igc2FmZXR5Iik7CiAJfQpAQCAtMTgyNSw3ICsxODI1LDcgQEAKICNpZmRlZiBBSERfREVCVUcKIAkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkgewogCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQlwcmludGYoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKKwkJCQlwcmludGsoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKIAkJCX0KICNlbmRpZgogCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKQEAgLTE4NDMsMTIgKzE4NDMsMTIgQEAKIAkJCXVfaW50IGk7CiAKIAkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCXByaW50ZigiQ0RCOiIpOworCQkJcHJpbnRrKCJDREI6Iik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5pb19jdHgtPmNtZF9sZW47IGkrKykKLQkJCQlwcmludGYoIiAweCV4Iiwgc2NiLT5pb19jdHgtPmNtbmRbaV0pOwotCQkJcHJpbnRmKCJcbiIpOworCQkJCXByaW50aygiIDB4JXgiLCBzY2ItPmlvX2N0eC0+Y21uZFtpXSk7CisJCQlwcmludGsoIlxuIik7CiAJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7Ci0JCQlwcmludGYoIlNhdyB1bmRlcmZsb3cgKCVsZCBvZiAlbGQgYnl0ZXMpLiAiCisJCQlwcmludGsoIlNhdyB1bmRlcmZsb3cgKCVsZCBvZiAlbGQgYnl0ZXMpLiAiCiAJCQkgICAgICAgIlRyZWF0ZWQgYXMgZXJyb3JcbiIsCiAJCQkJYWhkX2dldF9yZXNpZHVhbChzY2IpLAogCQkJCWFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikpOwpAQCAtMTg4MSw3ICsxODgxLDcgQEAKIAkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwogCiAJaWYgKChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkgewotCQlwcmludGYoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOworCQlwcmludGsoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOwogCQlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fQkRSX1NFTlQKIAkJIHx8IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9BQk9SVEVEKQogCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOwpAQCAtMTk2MywxNCArMTk2MywxNCBAQAogCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSB7CiAJCQkJaW50IGk7CiAKLQkJCQlwcmludGYoIkNvcGllZCAlZCBieXRlcyBvZiBzZW5zZSBkYXRhIGF0ICVkOiIsCisJCQkJcHJpbnRrKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YSBhdCAlZDoiLAogCQkJCSAgICAgICBzZW5zZV9zaXplLCBzZW5zZV9vZmZzZXQpOwogCQkJCWZvciAoaSA9IDA7IGkgPCBzZW5zZV9zaXplOyBpKyspIHsKIAkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQotCQkJCQkJcHJpbnRmKCJcbiIpOwotCQkJCQlwcmludGYoIjB4JXggIiwgY21kLT5zZW5zZV9idWZmZXJbaV0pOworCQkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQlwcmludGsoIjB4JXggIiwgY21kLT5zZW5zZV9idWZmZXJbaV0pOwogCQkJCX0KLQkJCQlwcmludGYoIlxuIik7CisJCQkJcHJpbnRrKCJcbiIpOwogCQkJfQogI2VuZGlmCiAJCX0KQEAgLTE5OTUsNyArMTk5NSw3IEBACiAjaWZkZWYgQUhEX0RFQlVHCiAJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1FGVUxMKSAhPSAwKSB7CiAJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOwotCQkJCXByaW50ZigiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLAorCQkJCXByaW50aygiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLAogCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CiAJCQl9CiAjZW5kaWYKQEAgLTIwMTQsNyArMjAxNCw3IEBACiAJCQkJID09IEFIRF9MT0NLX1RBR1NfQ09VTlQpIHsKIAkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7CiAJCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKLQkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCisJCQkJCXByaW50aygiTG9ja2luZyBtYXggdGFnIGNvdW50IGF0ICVkXG4iLAogCQkJCQkgICAgICAgZGV2LT5hY3RpdmUpOwogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogCX0KIAogCWlmIChkb19mYWxsYmFjaykgewotCQlwcmludGYoIiVzOiBkZXZpY2Ugb3ZlcnJ1biAoc3RhdHVzICV4KSBvbiAlZDolZDolZFxuIiwKKwkJcHJpbnRrKCIlczogZGV2aWNlIG92ZXJydW4gKHN0YXR1cyAleCkgb24gJWQ6JWQ6JWRcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzdGF0dXMsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAogCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKIAl9CkBAIC0yMTg3LDEwICsyMTg3LDEwIEBACiAJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbWQsCiAJCSAgICAiQXR0ZW1wdGluZyB0byBxdWV1ZSBhbiBBQk9SVCBtZXNzYWdlOiIpOwogCi0JcHJpbnRmKCJDREI6Iik7CisJcHJpbnRrKCJDREI6Iik7CiAJZm9yIChjZGJfYnl0ZSA9IDA7IGNkYl9ieXRlIDwgY21kLT5jbWRfbGVuOyBjZGJfYnl0ZSsrKQotCQlwcmludGYoIiAweCV4IiwgY21kLT5jbW5kW2NkYl9ieXRlXSk7Ci0JcHJpbnRmKCJcbiIpOworCQlwcmludGsoIiAweCV4IiwgY21kLT5jbW5kW2NkYl9ieXRlXSk7CisJcHJpbnRrKCJcbiIpOwogCiAJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOwogCkBAIC0yMjQ5LDcgKzIyNDksNyBAQAogCQlnb3RvIG5vX2NtZDsKIAl9CiAKLQlwcmludGYoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKKwlwcmludGsoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKIAkgICAgICAgYWhkX25hbWUoYWhkKSwgd2FzX3BhdXNlZCA/ICIiIDogIm5vdCAiKTsKIAlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAKQEAgLTIyNjAsNyArMjI2MCw3IEBACiAJCQkgICAgICAgcGVuZGluZ19zY2ItPmhzY2ItPnRhZywKIAkJCSAgICAgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUV9BQk9SVEVELAogCQkJICAgICAgIFNFQVJDSF9DT01QTEVURSkgPiAwKSB7Ci0JCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKKwkJcHJpbnRrKCIlczolZDolZDolZDogQ21kIGFib3J0ZWQgZnJvbSBRSU5GSUZPXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIAogCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKIAkJcmV0dmFsID0gU1VDQ0VTUzsKQEAgLTIzNTUsNyArMjM1NSw3IEBACiAJCWFoZF9xaW5maWZvX3JlcXVldWVfdGFpbChhaGQsIHBlbmRpbmdfc2NiKTsKIAkJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JwdHIpOwogCQlhaGRfcHJpbnRfcGF0aChhaGQsIHBlbmRpbmdfc2NiKTsKLQkJcHJpbnRmKCJEZXZpY2UgaXMgZGlzY29ubmVjdGVkLCByZS1xdWV1aW5nIFNDQlxuIik7CisJCXByaW50aygiRGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgcmUtcXVldWluZyBTQ0JcbiIpOwogCQl3YWl0ID0gVFJVRTsKIAl9IGVsc2UgewogCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIlVuYWJsZSB0byBkZWxpdmVyIG1lc3NhZ2VcbiIpOwpAQCAtMjM4MCwyMSArMjM4MCwyMSBAQAogCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX2RvbmUgPSAmZG9uZTsKIAkJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiAKLQkJcHJpbnRmKCIlczogUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIiwgYWhkX25hbWUoYWhkKSk7CisJCXByaW50aygiJXM6IFJlY292ZXJ5IGNvZGUgc2xlZXBpbmdcbiIsIGFoZF9uYW1lKGFoZCkpOwogCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZG9uZSwgNSAqIEhaKSkgewogCQkJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOwogCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9kb25lID0gTlVMTDsKIAkJCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwotCQkJcHJpbnRmKCIlczogVGltZXIgRXhwaXJlZCAoYWN0aXZlICVkKVxuIiwKKwkJCXByaW50aygiJXM6IFRpbWVyIEV4cGlyZWQgKGFjdGl2ZSAlZClcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2LT5hY3RpdmUpOwogCQkJcmV0dmFsID0gRkFJTEVEOwogCQl9Ci0JCXByaW50ZigiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CisJCXByaW50aygiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CiAJfSBlbHNlCiAJCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOwogCiAJaWYgKHJldHZhbCAhPSBTVUNDRVNTKQotCQlwcmludGYoIiVzOiBDb21tYW5kIGFib3J0IHJldHVybmluZyAweCV4XG4iLAorCQlwcmludGsoIiVzOiBDb21tYW5kIGFib3J0IHJldHVybmluZyAweCV4XG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgcmV0dmFsKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC0yNDMxLDcgKzI0MzEsNyBAQAogCiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKLQkJcHJpbnRmKCIlczogc2V0IHBlcmlvZCB0byAlZFxuIiwgYWhkX25hbWUoYWhkKSwgcGVyaW9kKTsKKwkJcHJpbnRrKCIlczogc2V0IHBlcmlvZCB0byAlZFxuIiwgYWhkX25hbWUoYWhkKSwgcGVyaW9kKTsKICNlbmRpZgogCWlmIChvZmZzZXQgPT0gMCkKIAkJb2Zmc2V0ID0gTUFYX09GRlNFVDsKQEAgLTI0ODQsNyArMjQ4NCw3IEBACiAKICNpZmRlZiBBSERfREVCVUcKIAlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQotCQlwcmludGYoIiVzOiBzZXQgb2Zmc2V0IHRvICVkXG4iLCBhaGRfbmFtZShhaGQpLCBvZmZzZXQpOworCQlwcmludGsoIiVzOiBzZXQgb2Zmc2V0IHRvICVkXG4iLCBhaGRfbmFtZShhaGQpLCBvZmZzZXQpOwogI2VuZGlmCiAKIAlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCkBAIC0yNTIwLDcgKzI1MjAsNyBAQAogCiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKLQkJcHJpbnRmKCIlczogJXMgRFRcbiIsIGFoZF9uYW1lKGFoZCksIAorCQlwcmludGsoIiVzOiAlcyBEVFxuIiwgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgIGR0ID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKICNlbmRpZgogCWlmIChkdCAmJiBzcGlfbWF4X3dpZHRoKHN0YXJnZXQpKSB7CkBAIC0yNTYyLDcgKzI1NjIsNyBAQAogCiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKLQkJcHJpbnRmKCIlczogJXMgUUFTXG4iLCBhaGRfbmFtZShhaGQpLCAKKwkJcHJpbnRrKCIlczogJXMgUUFTXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgcWFzID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKICNlbmRpZgogCkBAIC0yNjAxLDcgKzI2MDEsNyBAQAogCiAjaWZkZWYgQUhEX0RFQlVHCiAJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgIT0gMCkKLQkJcHJpbnRmKCIlczogJXMgSVVcbiIsIGFoZF9uYW1lKGFoZCksCisJCXByaW50aygiJXM6ICVzIElVXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgaXUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwogI2VuZGlmCiAKQEAgLTI2NDEsNyArMjY0MSw3IEBACiAKICNpZmRlZiBBSERfREVCVUcKIAlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQotCQlwcmludGYoIiVzOiAlcyBSZWFkIFN0cmVhbWluZ1xuIiwgYWhkX25hbWUoYWhkKSwgCisJCXByaW50aygiJXM6ICVzIFJlYWQgU3RyZWFtaW5nXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgcmRzdHJtICA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CiAjZW5kaWYKIApAQCAtMjY3Nyw3ICsyNjc3LDcgQEAKIAogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCi0JCXByaW50ZigiJXM6ICVzIFdyaXRlIEZsb3cgQ29udHJvbFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJcHJpbnRrKCIlczogJXMgV3JpdGUgRmxvdyBDb250cm9sXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgd3JmbG93ID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKICNlbmRpZgogCkBAIC0yNzE0LDE0ICsyNzE0LDE0IEBACiAJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1JUSSkgPT0gMCkgewogI2lmZGVmIEFIRF9ERUJVRwogCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQotCQkJcHJpbnRmKCIlczogUlRJIG5vdCBhdmFpbGFibGVcbiIsIGFoZF9uYW1lKGFoZCkpOworCQkJcHJpbnRrKCIlczogUlRJIG5vdCBhdmFpbGFibGVcbiIsIGFoZF9uYW1lKGFoZCkpOwogI2VuZGlmCiAJCXJldHVybjsKIAl9CiAKICNpZmRlZiBBSERfREVCVUcKIAlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSAhPSAwKQotCQlwcmludGYoIiVzOiAlcyBSVElcbiIsIGFoZF9uYW1lKGFoZCksCisJCXByaW50aygiJXM6ICVzIFJUSVxuIiwgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgIHJ0aSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CiAjZW5kaWYKIApAQCAtMjc1Nyw3ICsyNzU3LDcgQEAKIAogI2lmZGVmIEFIRF9ERUJVRwogCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpICE9IDApCi0JCXByaW50ZigiJXM6ICVzIFByZWNvbXBlbnNhdGlvblxuIiwgYWhkX25hbWUoYWhkKSwgCisJCXByaW50aygiJXM6ICVzIFByZWNvbXBlbnNhdGlvblxuIiwgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgIHBjb21wID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCmluZGV4IDU1YzFmZTAuLjI4ZTQzNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaApAQCAtMzYzLDEzICszNjMsNiBAQAogCXJlc291cmNlX3NpemVfdAkJIG1lbV9idXNhZGRyOwkvKiBNZW0gQmFzZSBBZGRyICovCiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogT1MgVXRpbGl0eSBXcmFwcGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBwcmludGYgcHJpbnRrCi0jZGVmaW5lIE1fTk9XQUlUIEdGUF9BVE9NSUMKLSNkZWZpbmUgTV9XQUlUT0sgMAotI2RlZmluZSBtYWxsb2Moc2l6ZSwgdHlwZSwgZmxhZ3MpIGttYWxsb2Moc2l6ZSwgZmxhZ3MpCi0jZGVmaW5lIGZyZWUocHRyLCB0eXBlKSBrZnJlZShwdHIpCi0KIHZvaWQgYWhkX2RlbGF5KGxvbmcpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTG93IExldmVsIEkvTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYwppbmRleCA4ZjY4NjEyLi4zYzg1ODczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAJCWFoZF9nZXRfcGNpX2J1cyhwY2kpLAogCQlhaGRfZ2V0X3BjaV9zbG90KHBjaSksCiAJCWFoZF9nZXRfcGNpX2Z1bmN0aW9uKHBjaSkpOwotCW5hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCW5hbWUgPSBrbWFsbG9jKHN0cmxlbihidWYpICsgMSwgR0ZQX0FUT01JQyk7CiAJaWYgKG5hbWUgPT0gTlVMTCkKIAkJcmV0dXJuICgtRU5PTUVNKTsKIAlzdHJjcHkobmFtZSwgYnVmKTsKQEAgLTMzMyw3ICszMzMsNyBAQAogCiAJCWlmIChhaGRfcGNpX3Rlc3RfcmVnaXN0ZXJfYWNjZXNzKGFoZCkgIT0gMCkgewogCi0JCQlwcmludGYoImFpYzc5eHg6IFBDSSBEZXZpY2UgJWQ6JWQ6JWQgIgorCQkJcHJpbnRrKCJhaWM3OXh4OiBQQ0kgRGV2aWNlICVkOiVkOiVkICIKIAkJCSAgICAgICAiZmFpbGVkIG1lbW9yeSBtYXBwZWQgdGVzdC4gIFVzaW5nIFBJTy5cbiIsCiAJCQkgICAgICAgYWhkX2dldF9wY2lfYnVzKGFoZC0+ZGV2X3NvZnRjKSwKIAkJCSAgICAgICBhaGRfZ2V0X3BjaV9zbG90KGFoZC0+ZGV2X3NvZnRjKSwKQEAgLTM0Niw3ICszNDYsNyBAQAogCQl9IGVsc2UKIAkJCWNvbW1hbmQgfD0gUENJTV9DTURfTUVNRU47CiAJfSBlbHNlIGlmIChib290dmVyYm9zZSkgewotCQlwcmludGYoImFpYzc5eHg6IFBDSSVkOiVkOiVkIE1FTSByZWdpb24gMHglbGx4ICIKKwkJcHJpbnRrKCJhaWM3OXh4OiBQQ0klZDolZDolZCBNRU0gcmVnaW9uIDB4JWxseCAiCiAJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtZW1vcnkgbWFwIGRldmljZS5cbiIsCiAJCSAgICAgICBhaGRfZ2V0X3BjaV9idXMoYWhkLT5kZXZfc29mdGMpLAogCQkgICAgICAgYWhkX2dldF9wY2lfc2xvdChhaGQtPmRldl9zb2Z0YyksCkBAIC0zNjUsNyArMzY1LDcgQEAKIAkJCWFoZC0+YnNoc1sxXS5pb3BvcnQgPSAodV9sb25nKWJhc2UyOwogCQkJY29tbWFuZCB8PSBQQ0lNX0NNRF9QT1JURU47CiAJCX0gZWxzZSB7Ci0JCQlwcmludGYoImFpYzc5eHg6IFBDSSVkOiVkOiVkIElPIHJlZ2lvbnMgMHglbGx4IGFuZCAiCisJCQlwcmludGsoImFpYzc5eHg6IFBDSSVkOiVkOiVkIElPIHJlZ2lvbnMgMHglbGx4IGFuZCAiCiAJCQkgICAgICAgIjB4JWxseCB1bmF2YWlsYWJsZS4gQ2Fubm90IG1hcCBkZXZpY2UuXG4iLAogCQkJICAgICAgIGFoZF9nZXRfcGNpX2J1cyhhaGQtPmRldl9zb2Z0YyksCiAJCQkgICAgICAgYWhkX2dldF9wY2lfc2xvdChhaGQtPmRldl9zb2Z0YyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwppbmRleCA5MGEwNGEzLi4xNGI1ZjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCSAqLwogCWlmICgoYWhkLT5mbGFncyAmIChBSERfMzlCSVRfQUREUkVTU0lOR3xBSERfNjRCSVRfQUREUkVTU0lORykpICE9IDApIHsKIAkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCIlczogRW5hYmxpbmcgMzlCaXQgQWRkcmVzc2luZ1xuIiwKKwkJCXByaW50aygiJXM6IEVuYWJsaW5nIDM5Qml0IEFkZHJlc3NpbmdcbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CiAJCWRldmNvbmZpZyA9IGFoZF9wY2lfcmVhZF9jb25maWcoYWhkLT5kZXZfc29mdGMsCiAJCQkJCQlERVZDT05GSUcsIC8qYnl0ZXMqLzQpOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJCSAqIEZldGNoIFZQRCBmb3IgdGhpcyBmdW5jdGlvbiBhbmQgcGFyc2UgaXQuCiAJCSAqLwogCQlpZiAoYm9vdHZlcmJvc2UpIAotCQkJcHJpbnRmKCIlczogUmVhZGluZyBWUEQgZnJvbSBTRUVQUk9NLi4uIiwKKwkJCXByaW50aygiJXM6IFJlYWRpbmcgVlBEIGZyb20gU0VFUFJPTS4uLiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CiAKIAkJLyogQWRkcmVzcyBpcyBhbHdheXMgaW4gdW5pdHMgb2YgMTZiaXQgd29yZHMgKi8KQEAgLTU0MSwxMiArNTQxLDEyIEBACiAJCWlmIChlcnJvciA9PSAwKQogCQkJZXJyb3IgPSBhaGRfcGFyc2VfdnBkZGF0YShhaGQsICZ2cGQpOwogCQlpZiAoYm9vdHZlcmJvc2UpIAotCQkJcHJpbnRmKCIlczogVlBEIHBhcnNpbmcgJXNcbiIsCisJCQlwcmludGsoIiVzOiBWUEQgcGFyc2luZyAlc1xuIiwKIAkJCSAgICAgICBhaGRfbmFtZShhaGQpLAogCQkJICAgICAgIGVycm9yID09IDAgPyAic3VjY2Vzc2Z1bCIgOiAiZmFpbGVkIik7CiAKIAkJaWYgKGJvb3R2ZXJib3NlKSAKLQkJCXByaW50ZigiJXM6IFJlYWRpbmcgU0VFUFJPTS4uLiIsIGFoZF9uYW1lKGFoZCkpOworCQkJcHJpbnRrKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhkX25hbWUoYWhkKSk7CiAKIAkJLyogQWRkcmVzcyBpcyBhbHdheXMgaW4gdW5pdHMgb2YgMTZiaXQgd29yZHMgKi8KIAkJc3RhcnRfYWRkciA9IChzaXplb2YoKnNjKSAvIDIpICogKGFoZC0+Y2hhbm5lbCAtICdBJyk7CkBAIC01NTYsMTYgKzU1NiwxNiBAQAogCQkJCQkgLypieXRlc3RyZWFtKi9GQUxTRSk7CiAKIAkJaWYgKGVycm9yICE9IDApIHsKLQkJCXByaW50ZigiVW5hYmxlIHRvIHJlYWQgU0VFUFJPTVxuIik7CisJCQlwcmludGsoIlVuYWJsZSB0byByZWFkIFNFRVBST01cbiIpOwogCQkJaGF2ZV9zZWVwcm9tID0gMDsKIAkJfSBlbHNlIHsKIAkJCWhhdmVfc2VlcHJvbSA9IGFoZF92ZXJpZnlfY2tzdW0oc2MpOwogCiAJCQlpZiAoYm9vdHZlcmJvc2UpIHsKIAkJCQlpZiAoaGF2ZV9zZWVwcm9tID09IDApCi0JCQkJCXByaW50ZiAoImNoZWNrc3VtIGVycm9yXG4iKTsKKwkJCQkJcHJpbnRrICgiY2hlY2tzdW0gZXJyb3JcbiIpOwogCQkJCWVsc2UKLQkJCQkJcHJpbnRmICgiZG9uZS5cbiIpOworCQkJCQlwcmludGsgKCJkb25lLlxuIik7CiAJCQl9CiAJCX0KIAkJYWhkX3JlbGVhc2Vfc2VlcHJvbShhaGQpOwpAQCAtNjE1LDIxICs2MTUsMjEgQEAKIAkJdWludDE2X3QgKnNjX2RhdGE7CiAJCWludAkgIGk7CiAKLQkJcHJpbnRmKCIlczogU2VlcHJvbSBDb250ZW50czoiLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRrKCIlczogU2VlcHJvbSBDb250ZW50czoiLCBhaGRfbmFtZShhaGQpKTsKIAkJc2NfZGF0YSA9ICh1aW50MTZfdCAqKXNjOwogCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZigqc2MpKTsgaSArPSAyKQotCQkJcHJpbnRmKCJcblx0MHglLjR4Iiwgc2NfZGF0YVtpXSk7Ci0JCXByaW50ZigiXG4iKTsKKwkJCXByaW50aygiXG5cdDB4JS40eCIsIHNjX2RhdGFbaV0pOworCQlwcmludGsoIlxuIik7CiAJfQogI2VuZGlmCiAKIAlpZiAoIWhhdmVfc2VlcHJvbSkgewogCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoIiVzOiBObyBTRUVQUk9NIGF2YWlsYWJsZS5cbiIsIGFoZF9uYW1lKGFoZCkpOworCQkJcHJpbnRrKCIlczogTm8gU0VFUFJPTSBhdmFpbGFibGUuXG4iLCBhaGRfbmFtZShhaGQpKTsKIAkJYWhkLT5mbGFncyB8PSBBSERfVVNFREVGQVVMVFM7CiAJCWVycm9yID0gYWhkX2RlZmF1bHRfY29uZmlnKGFoZCk7CiAJCWFkYXB0ZXJfY29udHJvbCA9IENGQVVUT1RFUk18Q0ZTRUFVVE9URVJNOwotCQlmcmVlKGFoZC0+c2VlcF9jb25maWcsIE1fREVWQlVGKTsKKwkJa2ZyZWUoYWhkLT5zZWVwX2NvbmZpZyk7CiAJCWFoZC0+c2VlcF9jb25maWcgPSBOVUxMOwogCX0gZWxzZSB7CiAJCWVycm9yID0gYWhkX3BhcnNlX2NmZ2RhdGEoYWhkLCBzYyk7CkBAIC02NTYsNyArNjU2LDcgQEAKIAlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfU1RQV0xFVkVMX0EpICE9IDApCiAJCWRldmNvbmZpZyB8PSBTVFBXTEVWRUw7CiAJaWYgKGJvb3R2ZXJib3NlKQotCQlwcmludGYoIiVzOiBTVFBXTEVWRUwgaXMgJXNcbiIsCisJCXByaW50aygiJXM6IFNUUFdMRVZFTCBpcyAlc1xuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCksIChkZXZjb25maWcgJiBTVFBXTEVWRUwpID8gIm9uIiA6ICJvZmYiKTsKIAlhaGRfcGNpX3dyaXRlX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgREVWQ09ORklHLCBkZXZjb25maWcsIC8qYnl0ZXMqLzQpOwogIApAQCAtNjcxLDcgKzY3MSw3IEBACiAJZXJyb3IgPSBhaGRfcmVhZF9mbGV4cG9ydChhaGQsIEZMWEFERFJfVEVSTUNUTCwgJnRlcm1jdGwpOwogCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZBVVRPVEVSTSkgPT0gMCkgewogCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoIiVzOiBNYW51YWwgUHJpbWFyeSBUZXJtaW5hdGlvblxuIiwKKwkJCXByaW50aygiJXM6IE1hbnVhbCBQcmltYXJ5IFRlcm1pbmF0aW9uXG4iLAogCQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCQl0ZXJtY3RsICY9IH4oRkxYX1RFUk1DVExfRU5QUklMT1d8RkxYX1RFUk1DVExfRU5QUklISUdIKTsKIAkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKSAhPSAwKQpAQCAtNjc5LDE0ICs2NzksMTQgQEAKIAkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSkgIT0gMCkKIAkJCXRlcm1jdGwgfD0gRkxYX1RFUk1DVExfRU5QUklISUdIOwogCX0gZWxzZSBpZiAoZXJyb3IgIT0gMCkgewotCQlwcmludGYoIiVzOiBQcmltYXJ5IEF1dG8tVGVybSBTZW5zaW5nIGZhaWxlZCEgIgorCQlwcmludGsoIiVzOiBQcmltYXJ5IEF1dG8tVGVybSBTZW5zaW5nIGZhaWxlZCEgIgogCQkgICAgICAgIlVzaW5nIERlZmF1bHRzLlxuIiwgYWhkX25hbWUoYWhkKSk7CiAJCXRlcm1jdGwgPSBGTFhfVEVSTUNUTF9FTlBSSUxPV3xGTFhfVEVSTUNUTF9FTlBSSUhJR0g7CiAJfQogCiAJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRlNFQVVUT1RFUk0pID09IDApIHsKIAkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCIlczogTWFudWFsIFNlY29uZGFyeSBUZXJtaW5hdGlvblxuIiwKKwkJCXByaW50aygiJXM6IE1hbnVhbCBTZWNvbmRhcnkgVGVybWluYXRpb25cbiIsCiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CiAJCXRlcm1jdGwgJj0gfihGTFhfVEVSTUNUTF9FTlNFQ0xPV3xGTFhfVEVSTUNUTF9FTlNFQ0hJR0gpOwogCQlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGU0VMT1dURVJNKSAhPSAwKQpAQCAtNjk0LDcgKzY5NCw3IEBACiAJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTRUhJR0hURVJNKSAhPSAwKQogCQkJdGVybWN0bCB8PSBGTFhfVEVSTUNUTF9FTlNFQ0hJR0g7CiAJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7Ci0JCXByaW50ZigiJXM6IFNlY29uZGFyeSBBdXRvLVRlcm0gU2Vuc2luZyBmYWlsZWQhICIKKwkJcHJpbnRrKCIlczogU2Vjb25kYXJ5IEF1dG8tVGVybSBTZW5zaW5nIGZhaWxlZCEgIgogCQkgICAgICAgIlVzaW5nIERlZmF1bHRzLlxuIiwgYWhkX25hbWUoYWhkKSk7CiAJCXRlcm1jdGwgfD0gRkxYX1RFUk1DVExfRU5TRUNMT1d8RkxYX1RFUk1DVExfRU5TRUNISUdIOwogCX0KQEAgLTcxNCwyMiArNzE0LDIyIEBACiAKIAllcnJvciA9IGFoZF93cml0ZV9mbGV4cG9ydChhaGQsIEZMWEFERFJfVEVSTUNUTCwgdGVybWN0bCk7CiAJaWYgKGVycm9yICE9IDApIHsKLQkJcHJpbnRmKCIlczogVW5hYmxlIHRvIHNldCB0ZXJtaW5hdGlvbiBzZXR0aW5ncyFcbiIsCisJCXByaW50aygiJXM6IFVuYWJsZSB0byBzZXQgdGVybWluYXRpb24gc2V0dGluZ3MhXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CiAJfSBlbHNlIGlmIChib290dmVyYm9zZSkgewotCQlwcmludGYoIiVzOiBQcmltYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAorCQlwcmludGsoIiVzOiBQcmltYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgICh0ZXJtY3RsICYgRkxYX1RFUk1DVExfRU5QUklISUdIKSA/ICJFbiIgOiAiRGlzIik7CiAKLQkJcHJpbnRmKCIlczogUHJpbWFyeSBMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAorCQlwcmludGsoIiVzOiBQcmltYXJ5IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCiAJCSAgICAgICBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgKHRlcm1jdGwgJiBGTFhfVEVSTUNUTF9FTlBSSUxPVykgPyAiRW4iIDogIkRpcyIpOwogCi0JCXByaW50ZigiJXM6IFNlY29uZGFyeSBIaWdoIGJ5dGUgdGVybWluYXRpb24gJXNhYmxlZFxuIiwKKwkJcHJpbnRrKCIlczogU2Vjb25kYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgICh0ZXJtY3RsICYgRkxYX1RFUk1DVExfRU5TRUNISUdIKSA/ICJFbiIgOiAiRGlzIik7CiAKLQkJcHJpbnRmKCIlczogU2Vjb25kYXJ5IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCisJCXByaW50aygiJXM6IFNlY29uZGFyeSBMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwKIAkJICAgICAgICh0ZXJtY3RsICYgRkxYX1RFUk1DVExfRU5TRUNMT1cpID8gIkVuIiA6ICJEaXMiKTsKIAl9CkBAIC04MDUsNyArODA1LDcgQEAKIAlpZiAoKGludHN0YXQgJiBQQ0lJTlQpID09IDApCiAJCXJldHVybjsKIAotCXByaW50ZigiJXM6IFBDSSBlcnJvciBJbnRlcnJ1cHRcbiIsIGFoZF9uYW1lKGFoZCkpOworCXByaW50aygiJXM6IFBDSSBlcnJvciBJbnRlcnJ1cHRcbiIsIGFoZF9uYW1lKGFoZCkpOwogCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKIAlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CiAJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKQEAgLTgzMiw3ICs4MzIsNyBAQAogCQkJCXMgPSBwY2lfc3RhdHVzX3N0cmluZ3NbYml0XTsKIAkJCQlpZiAoaSA9PSA3LypUQVJHKi8gJiYgYml0ID09IDMpCiAJCQkJCXMgPSAiJXM6IFNpZ25hbGVkIFRhcmdldCBBYm9ydFxuIjsKLQkJCQlwcmludGYocywgYWhkX25hbWUoYWhkKSwgcGNpX3N0YXR1c19zb3VyY2VbaV0pOworCQkJCXByaW50ayhzLCBhaGRfbmFtZShhaGQpLCBwY2lfc3RhdHVzX3NvdXJjZVtpXSk7CiAJCQl9CiAJCX0JCiAJfQpAQCAtODYyLDcgKzg2Miw3IEBACiAJICovCiAJcGNpeF9zdGF0dXMgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lYUl9TVEFUVVMsCiAJCQkJCSAgLypieXRlcyovMik7Ci0JcHJpbnRmKCIlczogUENJIFNwbGl0IEludGVycnVwdCAtIFBDSS1YIHN0YXR1cyA9IDB4JXhcbiIsCisJcHJpbnRrKCIlczogUENJIFNwbGl0IEludGVycnVwdCAtIFBDSS1YIHN0YXR1cyA9IDB4JXhcbiIsCiAJICAgICAgIGFoZF9uYW1lKGFoZCksIHBjaXhfc3RhdHVzKTsKIAlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewpAQCAtODkxLDcgKzg5MSw3IEBACiAJCQkJc3RhdGljIGNvbnN0IGNoYXIgKnM7CiAKIAkJCQlzID0gc3BsaXRfc3RhdHVzX3N0cmluZ3NbYml0XTsKLQkJCQlwcmludGYocywgYWhkX25hbWUoYWhkKSwKKwkJCQlwcmludGsocywgYWhkX25hbWUoYWhkKSwKIAkJCQkgICAgICAgc3BsaXRfc3RhdHVzX3NvdXJjZVtpXSk7CiAJCQl9CiAKQEAgLTkwMiw3ICs5MDIsNyBAQAogCQkJCXN0YXRpYyBjb25zdCBjaGFyICpzOwogCiAJCQkJcyA9IHNwbGl0X3N0YXR1c19zdHJpbmdzW2JpdF07Ci0JCQkJcHJpbnRmKHMsIGFoZF9uYW1lKGFoZCksICJTRyIpOworCQkJCXByaW50ayhzLCBhaGRfbmFtZShhaGQpLCAiU0ciKTsKIAkJCX0KIAkJfQogCX0KQEAgLTk1MCw3ICs5NTAsNyBAQAogCXBjaSA9IGFoZC0+ZGV2X3NvZnRjOwogCXJldiA9IGFoZF9wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX1JFVklELCAvKmJ5dGVzKi8xKTsKIAlpZiAocmV2IDwgSURfQUlDNzkwMl9QQ0lfUkVWX0E0KSB7Ci0JCXByaW50ZigiJXM6IFVuYWJsZSB0byBhdHRhY2ggdG8gdW5zdXBwb3J0ZWQgY2hpcCByZXZpc2lvbiAlZFxuIiwKKwkJcHJpbnRrKCIlczogVW5hYmxlIHRvIGF0dGFjaCB0byB1bnN1cHBvcnRlZCBjaGlwIHJldmlzaW9uICVkXG4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgcmV2KTsKIAkJYWhkX3BjaV93cml0ZV9jb25maWcocGNpLCBQQ0lSX0NPTU1BTkQsIDAsIC8qYnl0ZXMqLzIpOwogCQlyZXR1cm4gKEVOWElPKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKaW5kZXggMDE0YmVkNy4uNTljODVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKQEAgLTI3MiwzMyArMjcyLDMyIEBACiAJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOwogCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKIAlpZiAobGVuZ3RoICE9IHNpemVvZihzdHJ1Y3Qgc2VlcHJvbV9jb25maWcpKSB7Ci0JCXByaW50ZigiYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbTogaW5jb3JyZWN0IGJ1ZmZlciBzaXplXG4iKTsKKwkJcHJpbnRrKCJhaGRfcHJvY193cml0ZV9zZWVwcm9tOiBpbmNvcnJlY3QgYnVmZmVyIHNpemVcbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJaGF2ZV9zZWVwcm9tID0gYWhkX3ZlcmlmeV9ja3N1bSgoc3RydWN0IHNlZXByb21fY29uZmlnKilidWZmZXIpOwogCWlmIChoYXZlX3NlZXByb20gPT0gMCkgewotCQlwcmludGYoImFoZF9wcm9jX3dyaXRlX3NlZXByb206IGNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQlwcmludGsoImFoZF9wcm9jX3dyaXRlX3NlZXByb206IGNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJaGF2ZV9zZWVwcm9tID0gYWhkX2FjcXVpcmVfc2VlcHJvbShhaGQpOwogCWlmICghaGF2ZV9zZWVwcm9tKSB7Ci0JCXByaW50ZigiYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbTogTm8gU2VyaWFsIEVFUFJPTVxuIik7CisJCXByaW50aygiYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbTogTm8gU2VyaWFsIEVFUFJPTVxuIik7CiAJCWdvdG8gZG9uZTsKIAl9IGVsc2UgewogCQl1X2ludCBzdGFydF9hZGRyOwogCiAJCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKLQkJCWFoZC0+c2VlcF9jb25maWcgPSBtYWxsb2Moc2l6ZW9mKCphaGQtPnNlZXBfY29uZmlnKSwKLQkJCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJCWFoZC0+c2VlcF9jb25maWcgPSBrbWFsbG9jKHNpemVvZigqYWhkLT5zZWVwX2NvbmZpZyksIEdGUF9BVE9NSUMpOwogCQkJaWYgKGFoZC0+c2VlcF9jb25maWcgPT0gTlVMTCkgewotCQkJCXByaW50ZigiYWljNzl4eDogVW5hYmxlIHRvIGFsbG9jYXRlIHNlcmlhbCAiCisJCQkJcHJpbnRrKCJhaWM3OXh4OiBVbmFibGUgdG8gYWxsb2NhdGUgc2VyaWFsICIKIAkJCQkgICAgICAgImVlcHJvbSBidWZmZXIuICBXcml0ZSBmYWlsaW5nXG4iKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0KLQkJcHJpbnRmKCJhaWM3OXh4OiBXcml0aW5nIFNlcmlhbCBFRVBST01cbiIpOworCQlwcmludGsoImFpYzc5eHg6IFdyaXRpbmcgU2VyaWFsIEVFUFJPTVxuIik7CiAJCXN0YXJ0X2FkZHIgPSAzMiAqIChhaGQtPmNoYW5uZWwgLSAnQScpOwogCQlhaGRfd3JpdGVfc2VlcHJvbShhaGQsICh1X2ludDE2X3QgKilidWZmZXIsIHN0YXJ0X2FkZHIsCiAJCQkJICBzaXplb2Yoc3RydWN0IHNlZXByb21fY29uZmlnKS8yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYwppbmRleCBkZDExOTk5Li45ZTg1YTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jCkBAIC0yMDcsMTQgKzIwNywxNCBAQAogCQlyZXNldF9zZWVwcm9tKHNkKTsKIAl9CiAjaWZkZWYgQUhDX0RVTVBfRUVQUk9NCi0JcHJpbnRmKCJcblNlcmlhbCBFRVBST006XG5cdCIpOworCXByaW50aygiXG5TZXJpYWwgRUVQUk9NOlxuXHQiKTsKIAlmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsgPSBrICsgMSkgewogCQlpZiAoKChrICUgOCkgPT0gMCkgJiYgKGsgIT0gMCkpIHsKLQkJCXByaW50ZiAoIlxuXHQiKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIlxuXHQiKTsKIAkJfQotCQlwcmludGYgKCIgMHgleCIsIGJ1ZltrXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIiAweCV4IiwgYnVmW2tdKTsKIAl9Ci0JcHJpbnRmICgiXG4iKTsKKwlwcmludGsoS0VSTl9DT05UICJcbiIpOwogI2VuZGlmCiAJcmV0dXJuICgxKTsKIH0KQEAgLTI0MCw3ICsyNDAsNyBAQAogCQlld2VuID0gJnNlZXByb21fbG9uZ19ld2VuOwogCQlld2RzID0gJnNlZXByb21fbG9uZ19ld2RzOwogCX0gZWxzZSB7Ci0JCXByaW50ZigiYWhjX3dyaXRlX3NlZXByb206IHVuc3VwcG9ydGVkIHNlZXByb20gdHlwZSAlZFxuIiwKKwkJcHJpbnRrKCJhaGNfd3JpdGVfc2VlcHJvbTogdW5zdXBwb3J0ZWQgc2VlcHJvbSB0eXBlICVkXG4iLAogCQkgICAgICAgc2QtPnNkX2NoaXApOwogCQlyZXR1cm4gKDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMKaW5kZXggNDVhYTcyOC4uM2Y1YTU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMKQEAgLTkxMCw3ICs5MTAsNyBAQAogCiAJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKIAkJaWYgKHNjYiA9PSBOVUxMKSB7Ci0JCQlwcmludGYoIiVzOiBXQVJOSU5HIG5vIGNvbW1hbmQgZm9yIHNjYiAlZCAiCisJCQlwcmludGsoIiVzOiBXQVJOSU5HIG5vIGNvbW1hbmQgZm9yIHNjYiAlZCAiCiAJCQkgICAgICAgIihjbWRjbXBsdClcblFPVVRQT1MgPSAlZFxuIiwKIAkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBzY2JfaW5kZXgsCiAJCQkgICAgICAgKGFoYy0+cW91dGZpZm9uZXh0IC0gMSkgJiAweEZGKTsKQEAgLTk2NCw3ICs5NjQsNyBAQAogCWVycm9yID0gYWhjX2luYihhaGMsIEVSUk9SKTsKIAlmb3IgKGkgPSAwOyBlcnJvciAhPSAxICYmIGkgPCBudW1fZXJyb3JzOyBpKyspCiAJCWVycm9yID4+PSAxOwotCXByaW50ZigiJXM6IGJya2FkcmludCwgJXMgYXQgc2VxYWRkciA9IDB4JXhcbiIsCisJcHJpbnRrKCIlczogYnJrYWRyaW50LCAlcyBhdCBzZXFhZGRyID0gMHgleFxuIiwKIAkgICAgICAgYWhjX25hbWUoYWhjKSwgYWhjX2hhcmRfZXJyb3JzW2ldLmVycm1lc2csCiAJICAgICAgIGFoY19pbmIoYWhjLCBTRVFBRERSMCkgfAogCSAgICAgICAoYWhjX2luYihhaGMsIFNFUUFERFIxKSA8PCA4KSk7CkBAIC0xMDIxLDcgKzEwMjEsNyBAQAogCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CiAJCWlmIChzY2IgPT0gTlVMTCkgewogCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7Ci0JCQlwcmludGYoImFoY19pbnRyIC0gcmVmZXJlbmNlZCBzY2IgIgorCQkJcHJpbnRrKCJhaGNfaW50ciAtIHJlZmVyZW5jZWQgc2NiICIKIAkJCSAgICAgICAibm90IHZhbGlkIGR1cmluZyBzZXFpbnQgMHgleCBzY2IoJWQpXG4iLAogCQkJICAgICAgIGludHN0YXQsIHNjYl9pbmRleCk7CiAJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CkBAIC0xMDQ5LDcgKzEwNDksNyBAQAogCQlhaGNfc2V0X3Njc2lfc3RhdHVzKHNjYiwgaHNjYi0+c2hhcmVkX2RhdGEuc3RhdHVzLnNjc2lfc3RhdHVzKTsKIAkJc3dpdGNoIChoc2NiLT5zaGFyZWRfZGF0YS5zdGF0dXMuc2NzaV9zdGF0dXMpIHsKIAkJY2FzZSBTQ1NJX1NUQVRVU19PSzoKLQkJCXByaW50ZigiJXM6IEludGVycnVwdGVkIGZvciBzdGF1cyBvZiAwPz8/XG4iLAorCQkJcHJpbnRrKCIlczogSW50ZXJydXB0ZWQgZm9yIHN0YXVzIG9mIDA/Pz9cbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CiAJCQlicmVhazsKIAkJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKQEAgLTEwNjMsNyArMTA2Myw3IEBACiAjaWZkZWYgQUhDX0RFQlVHCiAJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfU0VOU0UpIHsKIAkJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCQkJcHJpbnRmKCJTQ0IgJWQ6IHJlcXVlc3RzIENoZWNrIFN0YXR1c1xuIiwKKwkJCQlwcmludGsoIlNDQiAlZDogcmVxdWVzdHMgQ2hlY2sgU3RhdHVzXG4iLAogCQkJCSAgICAgICBzY2ItPmhzY2ItPnRhZyk7CiAJCQl9CiAjZW5kaWYKQEAgLTEwODYsNyArMTA4Niw3IEBACiAjaWZkZWYgQUhDX0RFQlVHCiAJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfU0VOU0UpIHsKIAkJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCQkJcHJpbnRmKCJTZW5kaW5nIFNlbnNlXG4iKTsKKwkJCQlwcmludGsoIlNlbmRpbmcgU2Vuc2VcbiIpOwogCQkJfQogI2VuZGlmCiAJCQlzZy0+YWRkciA9IGFoY19nZXRfc2Vuc2VfYnVmYWRkcihhaGMsIHNjYik7CkBAIC0xMTYyLDI5ICsxMTYyLDI5IEBACiAJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwKIAkJCSBhaGNfaW5iKGFoYywgU0NTSVNFUSkgJiAoRU5TRUxJfEVOUlNFTEl8RU5BVVRPQVROUCkpOwogCi0JCXByaW50ZigiJXM6JWM6JWQ6IG5vIGFjdGl2ZSBTQ0IgZm9yIHJlY29ubmVjdGluZyAiCisJCXByaW50aygiJXM6JWM6JWQ6IG5vIGFjdGl2ZSBTQ0IgZm9yIHJlY29ubmVjdGluZyAiCiAJCSAgICAgICAidGFyZ2V0IC0gaXNzdWluZyBCVVMgREVWSUNFIFJFU0VUXG4iLAogCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCk7Ci0JCXByaW50ZigiU0FWRURfU0NTSUlEID09IDB4JXgsIFNBVkVEX0xVTiA9PSAweCV4LCAiCisJCXByaW50aygiU0FWRURfU0NTSUlEID09IDB4JXgsIFNBVkVEX0xVTiA9PSAweCV4LCAiCiAJCSAgICAgICAiQVJHXzEgPT0gMHgleCBBQ0NVTSA9IDB4JXhcbiIsCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0FWRURfU0NTSUlEKSwgYWhjX2luYihhaGMsIFNBVkVEX0xVTiksCiAJCSAgICAgICBhaGNfaW5iKGFoYywgQVJHXzEpLCBhaGNfaW5iKGFoYywgQUNDVU0pKTsKLQkJcHJpbnRmKCJTRVFfRkxBR1MgPT0gMHgleCwgU0NCUFRSID09IDB4JXgsIEJUVCA9PSAweCV4LCAiCisJCXByaW50aygiU0VRX0ZMQUdTID09IDB4JXgsIFNDQlBUUiA9PSAweCV4LCBCVFQgPT0gMHgleCwgIgogCQkgICAgICAgIlNJTkRFWCA9PSAweCV4XG4iLAogCQkgICAgICAgYWhjX2luYihhaGMsIFNFUV9GTEFHUyksIGFoY19pbmIoYWhjLCBTQ0JQVFIpLAogCQkgICAgICAgYWhjX2luZGV4X2J1c3lfdGNsKGFoYywKIAkJCSAgICBCVUlMRF9UQ0woYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCksCiAJCQkJICAgICAgYWhjX2luYihhaGMsIFNBVkVEX0xVTikpKSwKIAkJICAgICAgIGFoY19pbmIoYWhjLCBTSU5ERVgpKTsKLQkJcHJpbnRmKCJTQ1NJSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKKwkJcHJpbnRrKCJTQ1NJSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKIAkJICAgICAgICJTQ0JfVEFHID09IDB4JXgsIFNDQl9DT05UUk9MID09IDB4JXhcbiIsCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0NTSUlEKSwgYWhjX2luYihhaGMsIFNDQl9TQ1NJSUQpLAogCQkgICAgICAgYWhjX2luYihhaGMsIFNDQl9MVU4pLCBhaGNfaW5iKGFoYywgU0NCX1RBRyksCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0NCX0NPTlRST0wpKTsKLQkJcHJpbnRmKCJTQ1NJQlVTTCA9PSAweCV4LCBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQlwcmludGsoIlNDU0lCVVNMID09IDB4JXgsIFNDU0lTSUdJID09IDB4JXhcbiIsCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0NTSUJVU0wpLCBhaGNfaW5iKGFoYywgU0NTSVNJR0kpKTsKLQkJcHJpbnRmKCJTWEZSQ1RMMCA9PSAweCV4XG4iLCBhaGNfaW5iKGFoYywgU1hGUkNUTDApKTsKLQkJcHJpbnRmKCJTRVFDVEwgPT0gMHgleFxuIiwgYWhjX2luYihhaGMsIFNFUUNUTCkpOworCQlwcmludGsoIlNYRlJDVEwwID09IDB4JXhcbiIsIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkpOworCQlwcmludGsoIlNFUUNUTCA9PSAweCV4XG4iLCBhaGNfaW5iKGFoYywgU0VRQ1RMKSk7CiAJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKIAkJYWhjLT5tc2dvdXRfYnVmWzBdID0gTVNHX0JVU19ERVZfUkVTRVQ7CiAJCWFoYy0+bXNnb3V0X2xlbiA9IDE7CkBAIC0xMTk3LDcgKzExOTcsNyBAQAogCWNhc2UgU0VORF9SRUpFQ1Q6IAogCXsKIAkJdV9pbnQgcmVqYnl0ZSA9IGFoY19pbmIoYWhjLCBBQ0NVTSk7Ci0JCXByaW50ZigiJXM6JWM6JWQ6IFdhcm5pbmcgLSB1bmtub3duIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSAiCisJCXByaW50aygiJXM6JWM6JWQ6IFdhcm5pbmcgLSB1bmtub3duIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSAiCiAJCSAgICAgICAidGFyZ2V0ICgweCV4KS4gIFJlamVjdGluZ1xuIiwgCiAJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LCByZWpieXRlKTsKIAkJYnJlYWs7IApAQCAtMTIxOCw3ICsxMjE4LDcgQEAKIAkJdV9pbnQgbGFzdHBoYXNlOwogCiAJCWxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOwotCQlwcmludGYoIiVzOiVjOiVkOiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICV4LCAiCisJCXByaW50aygiJXM6JWM6JWQ6IHVua25vd24gc2NzaSBidXMgcGhhc2UgJXgsICIKIAkJICAgICAgICJsYXN0cGhhc2UgPSAweCV4LiAgQXR0ZW1wdGluZyB0byBjb250aW51ZVxuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8uY2hhbm5lbCwgZGV2aW5mby50YXJnZXQsCiAJCSAgICAgICBsYXN0cGhhc2UsIGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkpOwpAQCAtMTIyOSw3ICsxMjI5LDcgQEAKIAkJdV9pbnQgbGFzdHBoYXNlOwogCiAJCWxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOwotCQlwcmludGYoIiVzOiVjOiVkOiBNaXNzZWQgYnVzZnJlZS4gIgorCQlwcmludGsoIiVzOiVjOiVkOiBNaXNzZWQgYnVzZnJlZS4gIgogCQkgICAgICAgIkxhc3RwaGFzZSA9IDB4JXgsIEN1cnBoYXNlID0gMHgleFxuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8uY2hhbm5lbCwgZGV2aW5mby50YXJnZXQsCiAJCSAgICAgICBsYXN0cGhhc2UsIGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkpOwpAQCAtMTI1Nyw3ICsxMjU3LDcgQEAKIAkJCWJ1c19waGFzZSA9IGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOwogCQkJaWYgKGJ1c19waGFzZSAhPSBQX01FU0dJTgogCQkJICYmIGJ1c19waGFzZSAhPSBQX01FU0dPVVQpIHsKLQkJCQlwcmludGYoImFoY19pbnRyOiBIT1NUX01TR19MT09QIGJhZCAiCisJCQkJcHJpbnRrKCJhaGNfaW50cjogSE9TVF9NU0dfTE9PUCBiYWQgIgogCQkJCSAgICAgICAicGhhc2UgMHgleFxuIiwKIAkJCQkgICAgICBidXNfcGhhc2UpOwogCQkJCS8qCkBAIC0xMzU5LDcgKzEzNTksNyBAQAogCQkJCQl1X2ludAlzY2JfaW5kZXg7CiAKIAkJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7Ci0JCQkJCXByaW50ZigiVW5hYmxlIHRvIGNsZWFyIHBhcml0eSBlcnJvci4gICIKKwkJCQkJcHJpbnRrKCJVbmFibGUgdG8gY2xlYXIgcGFyaXR5IGVycm9yLiAgIgogCQkJCQkgICAgICAgIlJlc2V0dGluZyBidXMuXG4iKTsKIAkJCQkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9UQUcpOwogCQkJCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CkBAIC0xMzk1LDE4ICsxMzk1LDE4IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwotCQlwcmludGYoImRhdGEgb3ZlcnJ1biBkZXRlY3RlZCAlcy4iCisJCXByaW50aygiZGF0YSBvdmVycnVuIGRldGVjdGVkICVzLiIKIAkJICAgICAgICIgIFRhZyA9PSAweCV4LlxuIiwKIAkJICAgICAgIGFoY19waGFzZV90YWJsZVtpXS5waGFzZW1zZywKICAgCQkgICAgICAgc2NiLT5oc2NiLT50YWcpOwogCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCXByaW50ZigiJXMgc2VlbiBEYXRhIFBoYXNlLiAgTGVuZ3RoID0gJWxkLiAgTnVtU0dzID0gJWQuXG4iLAorCQlwcmludGsoIiVzIHNlZW4gRGF0YSBQaGFzZS4gIExlbmd0aCA9ICVsZC4gIE51bVNHcyA9ICVkLlxuIiwKIAkJICAgICAgIGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpICYgRFBIQVNFID8gIkhhdmUiIDogIkhhdmVuJ3QiLAogCQkgICAgICAgYWhjX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSwgc2NiLT5zZ19jb3VudCk7CiAJCWlmIChzY2ItPnNnX2NvdW50ID4gMCkgewogCQkJZm9yIChpID0gMDsgaSA8IHNjYi0+c2dfY291bnQ7IGkrKykgewogCi0JCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZFxuIiwKKwkJCQlwcmludGsoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkXG4iLAogCQkJCSAgICAgICBpLAogCQkJCSAgICAgICAoYWhjX2xlMzJ0b2goc2NiLT5zZ19saXN0W2ldLmxlbikgPj4gMjQKIAkJCQkgICAgICAgICYgU0dfSElHSF9BRERSX0JJVFMpLApAQCAtMTQ1Myw3ICsxNDUzLDcgQEAKIAl7CiAJCXVfaW50IHNjYmluZGV4OwogCi0JCXByaW50ZigiJXM6JWM6JWQ6JWQ6IEF0dGVtcHQgdG8gaXNzdWUgbWVzc2FnZSBmYWlsZWRcbiIsCisJCXByaW50aygiJXM6JWM6JWQ6JWQ6IEF0dGVtcHQgdG8gaXNzdWUgbWVzc2FnZSBmYWlsZWRcbiIsCiAJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAogCQkgICAgICAgZGV2aW5mby5sdW4pOwogCQlzY2JpbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKQEAgLTE0NzMsNyArMTQ3Myw3IEBACiAJfQogCWNhc2UgTk9fRlJFRV9TQ0I6CiAJewotCQlwcmludGYoIiVzOiBObyBmcmVlIG9yIGRpc2Nvbm5lY3RlZCBTQ0JzXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcHJpbnRrKCIlczogTm8gZnJlZSBvciBkaXNjb25uZWN0ZWQgU0NCc1xuIiwgYWhjX25hbWUoYWhjKSk7CiAJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKIAkJcGFuaWMoImZvciBzYWZldHkiKTsKIAkJYnJlYWs7CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogCQl1X2ludCBzY2JwdHI7CiAKIAkJc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7Ci0JCXByaW50ZigiQm9ndXMgVEFHIGFmdGVyIERNQS4gIFNDQlBUUiAlZCwgdGFnICVkLCBvdXIgdGFnICVkXG4iLAorCQlwcmludGsoIkJvZ3VzIFRBRyBhZnRlciBETUEuICBTQ0JQVFIgJWQsIHRhZyAlZCwgb3VyIHRhZyAlZFxuIiwKIAkJICAgICAgIHNjYnB0ciwgYWhjX2luYihhaGMsIEFSR18xKSwKIAkJICAgICAgIGFoYy0+c2NiX2RhdGEtPmhzY2JzW3NjYnB0cl0udGFnKTsKIAkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOwpAQCAtMTQ5MiwxMiArMTQ5MiwxMiBAQAogCX0KIAljYXNlIE9VVF9PRl9SQU5HRToKIAl7Ci0JCXByaW50ZigiJXM6IEJUVCBjYWxjdWxhdGlvbiBvdXQgb2YgcmFuZ2VcbiIsIGFoY19uYW1lKGFoYykpOwotCQlwcmludGYoIlNBVkVEX1NDU0lJRCA9PSAweCV4LCBTQVZFRF9MVU4gPT0gMHgleCwgIgorCQlwcmludGsoIiVzOiBCVFQgY2FsY3VsYXRpb24gb3V0IG9mIHJhbmdlXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcHJpbnRrKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKIAkJICAgICAgICJBUkdfMSA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKIAkJICAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLCBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKIAkJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMSksIGFoY19pbmIoYWhjLCBBQ0NVTSkpOwotCQlwcmludGYoIlNFUV9GTEFHUyA9PSAweCV4LCBTQ0JQVFIgPT0gMHgleCwgQlRUID09IDB4JXgsICIKKwkJcHJpbnRrKCJTRVFfRkxBR1MgPT0gMHgleCwgU0NCUFRSID09IDB4JXgsIEJUVCA9PSAweCV4LCAiCiAJCSAgICAgICAiU0lOREVYID09IDB4JXhcbiwgQSA9PSAweCV4XG4iLAogCQkgICAgICAgYWhjX2luYihhaGMsIFNFUV9GTEFHUyksIGFoY19pbmIoYWhjLCBTQ0JQVFIpLAogCQkgICAgICAgYWhjX2luZGV4X2J1c3lfdGNsKGFoYywKQEAgLTE1MDUsMTkgKzE1MDUsMTkgQEAKIAkJCQkgICAgICBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSkpLAogCQkgICAgICAgYWhjX2luYihhaGMsIFNJTkRFWCksCiAJCSAgICAgICBhaGNfaW5iKGFoYywgQUNDVU0pKTsKLQkJcHJpbnRmKCJTQ1NJSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKKwkJcHJpbnRrKCJTQ1NJSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKIAkJICAgICAgICJTQ0JfVEFHID09IDB4JXgsIFNDQl9DT05UUk9MID09IDB4JXhcbiIsCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0NTSUlEKSwgYWhjX2luYihhaGMsIFNDQl9TQ1NJSUQpLAogCQkgICAgICAgYWhjX2luYihhaGMsIFNDQl9MVU4pLCBhaGNfaW5iKGFoYywgU0NCX1RBRyksCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0NCX0NPTlRST0wpKTsKLQkJcHJpbnRmKCJTQ1NJQlVTTCA9PSAweCV4LCBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQlwcmludGsoIlNDU0lCVVNMID09IDB4JXgsIFNDU0lTSUdJID09IDB4JXhcbiIsCiAJCSAgICAgICBhaGNfaW5iKGFoYywgU0NTSUJVU0wpLCBhaGNfaW5iKGFoYywgU0NTSVNJR0kpKTsKIAkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOwogCQlwYW5pYygiZm9yIHNhZmV0eSIpOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKLQkJcHJpbnRmKCJhaGNfaW50cjogc2VxaW50LCAiCisJCXByaW50aygiYWhjX2ludHI6IHNlcWludCwgIgogCQkgICAgICAgImludHN0YXQgPT0gMHgleCwgc2NzaXNpZ2kgPSAweCV4XG4iLAogCQkgICAgICAgaW50c3RhdCwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CiAJCWJyZWFrOwpAQCAtMTU2Miw3ICsxNTYyLDcgQEAKIAkJCWludHJfY2hhbm5lbCA9IChjdXJfY2hhbm5lbCA9PSAnQScpID8gJ0InIDogJ0EnOwogCQl9CiAJCWlmIChzdGF0dXMgPT0gMCkgewotCQkJcHJpbnRmKCIlczogU3B1cmlvdXMgU0NTSSBpbnRlcnJ1cHRcbiIsIGFoY19uYW1lKGFoYykpOworCQkJcHJpbnRrKCIlczogU3B1cmlvdXMgU0NTSSBpbnRlcnJ1cHRcbiIsIGFoY19uYW1lKGFoYykpOwogCQkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlNDU0lJTlQpOwogCQkJYWhjX3VucGF1c2UoYWhjKTsKIAkJCXJldHVybjsKQEAgLTE1ODMsNyArMTU4Myw3IEBACiAJCWludCBub3dfbHZkOwogCiAJCW5vd19sdmQgPSBhaGNfaW5iKGFoYywgU0JMS0NUTCkgJiBFTkFCNDA7Ci0JCXByaW50ZigiJXM6IFRyYW5zY2VpdmVyIFN0YXRlIEhhcyBDaGFuZ2VkIHRvICVzIG1vZGVcbiIsCisJCXByaW50aygiJXM6IFRyYW5zY2VpdmVyIFN0YXRlIEhhcyBDaGFuZ2VkIHRvICVzIG1vZGVcbiIsCiAJCSAgICAgICBhaGNfbmFtZShhaGMpLCBub3dfbHZkID8gIkxWRCIgOiAiU0UiKTsKIAkJYWhjX291dGIoYWhjLCBDTFJTSU5UMCwgQ0xSSU9FUlIpOwogCQkvKgpAQCAtMTU5OSw3ICsxNTk5LDcgQEAKIAkJYWhjX3Jlc2V0X2NoYW5uZWwoYWhjLCBpbnRyX2NoYW5uZWwsCiAJCQkJIC8qSW5pdGlhdGUgUmVzZXQqL25vd19sdmQgPT0gMCk7CiAJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVJTVEkpICE9IDApIHsKLQkJcHJpbnRmKCIlczogU29tZW9uZSByZXNldCBjaGFubmVsICVjXG4iLAorCQlwcmludGsoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgJWNcbiIsCiAJCQlhaGNfbmFtZShhaGMpLCBpbnRyX2NoYW5uZWwpOwogCQlpZiAoaW50cl9jaGFubmVsICE9IGN1cl9jaGFubmVsKQogCQkgCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpIF4gU0VMQlVTQik7CkBAIC0xNjU5LDI2ICsxNjU5LDI2IEBACiAJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwogCQkJc2NiLT5mbGFncyB8PSBTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SOwogCQl9IGVsc2UKLQkJCXByaW50ZigiJXM6JWM6JWQ6ICIsIGFoY19uYW1lKGFoYyksIGludHJfY2hhbm5lbCwKKwkJCXByaW50aygiJXM6JWM6JWQ6ICIsIGFoY19uYW1lKGFoYyksIGludHJfY2hhbm5lbCwKIAkJCSAgICAgICBTQ1NJSURfVEFSR0VUKGFoYywgYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCkpKTsKIAkJc2NzaXJhdGUgPSBhaGNfaW5iKGFoYywgU0NTSVJBVEUpOwogCQlpZiAoc2lsZW50ID09IEZBTFNFKSB7Ci0JCQlwcmludGYoInBhcml0eSBlcnJvciBkZXRlY3RlZCAlcy4gIgorCQkJcHJpbnRrKCJwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgJXMuICIKIAkJCSAgICAgICAiU0VRQUREUigweCV4KSBTQ1NJUkFURSgweCV4KVxuIiwKIAkJCSAgICAgICBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2Vtc2csCiAJCQkgICAgICAgYWhjX2ludyhhaGMsIFNFUUFERFIwKSwKIAkJCSAgICAgICBzY3NpcmF0ZSk7CiAJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpICE9IDApIHsKIAkJCQlpZiAoKHNzdGF0MiAmIENSQ1ZBTEVSUikgIT0gMCkKLQkJCQkJcHJpbnRmKCJcdENSQyBWYWx1ZSBNaXNtYXRjaFxuIik7CisJCQkJCXByaW50aygiXHRDUkMgVmFsdWUgTWlzbWF0Y2hcbiIpOwogCQkJCWlmICgoc3N0YXQyICYgQ1JDRU5ERVJSKSAhPSAwKQotCQkJCQlwcmludGYoIlx0Tm8gdGVybWluYWwgQ1JDIHBhY2tldCAiCisJCQkJCXByaW50aygiXHRObyB0ZXJtaW5hbCBDUkMgcGFja2V0ICIKIAkJCQkJICAgICAgICJyZWNldmllZFxuIik7CiAJCQkJaWYgKChzc3RhdDIgJiBDUkNSRVFFUlIpICE9IDApCi0JCQkJCXByaW50ZigiXHRJbGxlZ2FsIENSQyBwYWNrZXQgIgorCQkJCQlwcmludGsoIlx0SWxsZWdhbCBDUkMgcGFja2V0ICIKIAkJCQkJICAgICAgICJyZXF1ZXN0XG4iKTsKIAkJCQlpZiAoKHNzdGF0MiAmIERVQUxfRURHRV9FUlIpICE9IDApCi0JCQkJCXByaW50ZigiXHRVbmV4cGVjdGVkICVzRFQgRGF0YSBQaGFzZVxuIiwKKwkJCQkJcHJpbnRrKCJcdFVuZXhwZWN0ZWQgJXNEVCBEYXRhIFBoYXNlXG4iLAogCQkJCQkgICAgICAgKHNjc2lyYXRlICYgU0lOR0xFX0VER0UpCiAJCQkJCSAgICAgPyAiIiA6ICJub24tIik7CiAJCQl9CkBAIC0xNzQ2LDcgKzE3NDYsNyBAQAogCiAJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKIAkJaWYgKHNjYiA9PSBOVUxMKSB7Ci0JCQlwcmludGYoIiVzOiBhaGNfaW50ciAtIHJlZmVyZW5jZWQgc2NiIG5vdCAiCisJCQlwcmludGsoIiVzOiBhaGNfaW50ciAtIHJlZmVyZW5jZWQgc2NiIG5vdCAiCiAJCQkgICAgICAgInZhbGlkIGR1cmluZyBTRUxUTyBzY2IoJWQsICVkKVxuIiwKIAkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBzY2JwdHIsIHNjYl9pbmRleCk7CiAJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CkBAIC0xNzU1LDcgKzE3NTUsNyBAQAogI2lmZGVmIEFIQ19ERUJVRwogCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19TRUxUTykgIT0gMCkgewogCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKLQkJCQlwcmludGYoIlNhdyBTZWxlY3Rpb24gVGltZW91dCBmb3IgU0NCIDB4JXhcbiIsCisJCQkJcHJpbnRrKCJTYXcgU2VsZWN0aW9uIFRpbWVvdXQgZm9yIFNDQiAweCV4XG4iLAogCQkJCSAgICAgICBzY2JfaW5kZXgpOwogCQkJfQogI2VuZGlmCkBAIC0xODMxLDcgKzE4MzEsNyBAQAogCQkJCSA9PSBNU0dfQUJPUlRfVEFHKQogCQkJCQl0YWcgPSBzY2ItPmhzY2ItPnRhZzsKIAkJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCQkJcHJpbnRmKCJTQ0IgJWQgLSBBYm9ydCVzIENvbXBsZXRlZC5cbiIsCisJCQkJcHJpbnRrKCJTQ0IgJWQgLSBBYm9ydCVzIENvbXBsZXRlZC5cbiIsCiAJCQkJICAgICAgIHNjYi0+aHNjYi0+dGFnLCB0YWcgPT0gU0NCX0xJU1RfTlVMTCA/CiAJCQkJICAgICAgICIiIDogIiBUYWciKTsKIAkJCQlhaGNfYWJvcnRfc2NicyhhaGMsIHRhcmdldCwgY2hhbm5lbCwKQEAgLTE5MzQsNyArMTkzNCw3IEBACiAJCQkJICogV2UgaGFkIG5vdCBmdWxseSBpZGVudGlmaWVkIHRoaXMgY29ubmVjdGlvbiwKIAkJCQkgKiBzbyB3ZSBjYW5ub3QgYWJvcnQgYW55dGhpbmcuCiAJCQkJICovCi0JCQkJcHJpbnRmKCIlczogIiwgYWhjX25hbWUoYWhjKSk7CisJCQkJcHJpbnRrKCIlczogIiwgYWhjX25hbWUoYWhjKSk7CiAJCQl9CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoYXNlczsgaSsrKSB7CiAJCQkJaWYgKGxhc3RwaGFzZSA9PSBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2UpCkBAIC0xOTQ5LDcgKzE5NDksNyBAQAogCQkJCSAqLwogCQkJCWFoY19mb3JjZV9yZW5lZ290aWF0aW9uKGFoYywgJmRldmluZm8pOwogCQkJfQotCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGJ1c2ZyZWUgJXNcbiIKKwkJCXByaW50aygiVW5leHBlY3RlZCBidXNmcmVlICVzXG4iCiAJCQkgICAgICAgIlNFUUFERFIgPT0gMHgleFxuIiwKIAkJCSAgICAgICBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2Vtc2csCiAJCQkgICAgICAgYWhjX2luYihhaGMsIFNFUUFERFIwKQpAQCAtMTk1OCw3ICsxOTU4LDcgQEAKIAkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlNDU0lJTlQpOwogCQlhaGNfcmVzdGFydChhaGMpOwogCX0gZWxzZSB7Ci0JCXByaW50ZigiJXM6IE1pc3NpbmcgY2FzZSBpbiBhaGNfaGFuZGxlX3Njc2lpbnQuIHN0YXR1cyA9ICV4XG4iLAorCQlwcmludGsoIiVzOiBNaXNzaW5nIGNhc2UgaW4gYWhjX2hhbmRsZV9zY3NpaW50LiBzdGF0dXMgPSAleFxuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIHN0YXR1cyk7CiAJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKIAl9CkBAIC0yMDI1LDcgKzIwMjUsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKHN0ZXBzID4gQUhDX01BWF9TVEVQUykgewotCQkJcHJpbnRmKCIlczogSW5maW5pdGUgbG9vcCBpbiBjcml0aWNhbCBzZWN0aW9uXG4iLAorCQkJcHJpbnRrKCIlczogSW5maW5pdGUgbG9vcCBpbiBjcml0aWNhbCBzZWN0aW9uXG4iLAogCQkJICAgICAgIGFoY19uYW1lKGFoYykpOwogCQkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOwogCQkJcGFuaWMoImNyaXRpY2FsIHNlY3Rpb24gbG9vcCIpOwpAQCAtMjEwNCwyMyArMjEwNCwyMyBAQAogCiAJc3RydWN0IGhhcmR3YXJlX3NjYiAqaHNjYiA9IHNjYi0+aHNjYjsKIAotCXByaW50Zigic2NiOiVwIGNvbnRyb2w6MHgleCBzY3NpaWQ6MHgleCBsdW46JWQgY2RiX2xlbjolZFxuIiwKKwlwcmludGsoInNjYjolcCBjb250cm9sOjB4JXggc2NzaWlkOjB4JXggbHVuOiVkIGNkYl9sZW46JWRcbiIsCiAJICAgICAgICh2b2lkICopc2NiLAogCSAgICAgICBoc2NiLT5jb250cm9sLAogCSAgICAgICBoc2NiLT5zY3NpaWQsCiAJICAgICAgIGhzY2ItPmx1biwKIAkgICAgICAgaHNjYi0+Y2RiX2xlbik7Ci0JcHJpbnRmKCJTaGFyZWQgRGF0YTogIik7CisJcHJpbnRrKCJTaGFyZWQgRGF0YTogIik7CiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihoc2NiLT5zaGFyZWRfZGF0YS5jZGIpOyBpKyspCi0JCXByaW50ZigiJSMwMngiLCBoc2NiLT5zaGFyZWRfZGF0YS5jZGJbaV0pOwotCXByaW50ZigiICAgICAgICBkYXRhcHRyOiUjeCBkYXRhY250OiUjeCBzZ3B0cjolI3ggdGFnOiUjeFxuIiwKKwkJcHJpbnRrKCIlIzAyeCIsIGhzY2ItPnNoYXJlZF9kYXRhLmNkYltpXSk7CisJcHJpbnRrKCIgICAgICAgIGRhdGFwdHI6JSN4IGRhdGFjbnQ6JSN4IHNncHRyOiUjeCB0YWc6JSN4XG4iLAogCQlhaGNfbGUzMnRvaChoc2NiLT5kYXRhcHRyKSwKIAkJYWhjX2xlMzJ0b2goaHNjYi0+ZGF0YWNudCksCiAJCWFoY19sZTMydG9oKGhzY2ItPnNncHRyKSwKIAkJaHNjYi0+dGFnKTsKIAlpZiAoc2NiLT5zZ19jb3VudCA+IDApIHsKIAkJZm9yIChpID0gMDsgaSA8IHNjYi0+c2dfY291bnQ7IGkrKykgewotCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZFxuIiwKKwkJCXByaW50aygic2dbJWRdIC0gQWRkciAweCV4JXggOiBMZW5ndGggJWRcbiIsCiAJCQkgICAgICAgaSwKIAkJCSAgICAgICAoYWhjX2xlMzJ0b2goc2NiLT5zZ19saXN0W2ldLmxlbikgPj4gMjQKIAkJCSAgICAgICAgJiBTR19ISUdIX0FERFJfQklUUyksCkBAIC0yMTUyLDggKzIxNTIsNyBAQAogCSAmJiBhaGMtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSAhPSBtYXN0ZXJfdHN0YXRlKQogCQlwYW5pYygiJXM6IGFoY19hbGxvY190c3RhdGUgLSBUYXJnZXQgYWxyZWFkeSBhbGxvY2F0ZWQiLAogCQkgICAgICBhaGNfbmFtZShhaGMpKTsKLQl0c3RhdGUgPSAoc3RydWN0IGFoY190bW9kZV90c3RhdGUqKW1hbGxvYyhzaXplb2YoKnRzdGF0ZSksCi0JCQkJCQkgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCXRzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKCp0c3RhdGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAodHN0YXRlID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKQEAgLTIyMDIsNyArMjIwMSw3IEBACiAJCXNjc2lfaWQgKz0gODsKIAl0c3RhdGUgPSBhaGMtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXTsKIAlpZiAodHN0YXRlICE9IE5VTEwpCi0JCWZyZWUodHN0YXRlLCBNX0RFVkJVRik7CisJCWtmcmVlKHRzdGF0ZSk7CiAJYWhjLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF0gPSBOVUxMOwogfQogI2VuZGlmCkBAIC0yNTg5LDEzICsyNTg4LDEzIEBACiAJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfVFJBTlNGRVJfTkVHKTsKIAkJaWYgKGJvb3R2ZXJib3NlKSB7CiAJCQlpZiAob2Zmc2V0ICE9IDApIHsKLQkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgc3luY2hyb25vdXMgYXQgJXNNSHolcywgIgorCQkJCXByaW50aygiJXM6IHRhcmdldCAlZCBzeW5jaHJvbm91cyBhdCAlc01IeiVzLCAiCiAJCQkJICAgICAgICJvZmZzZXQgPSAweCV4XG4iLCBhaGNfbmFtZShhaGMpLAogCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIHN5bmNyYXRlLT5yYXRlLAogCQkJCSAgICAgICAocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpCiAJCQkJICAgICAgID8gIiBEVCIgOiAiIiwgb2Zmc2V0KTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHVzaW5nICIKKwkJCQlwcmludGsoIiVzOiB0YXJnZXQgJWQgdXNpbmcgIgogCQkJCSAgICAgICAiYXN5bmNocm9ub3VzIHRyYW5zZmVyc1xuIiwKIAkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0KTsKIAkJCX0KQEAgLTI2NTgsNyArMjY1Nyw3IEBACiAJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAogCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRyk7CiAJCWlmIChib290dmVyYm9zZSkgewotCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHVzaW5nICVkYml0IHRyYW5zZmVyc1xuIiwKKwkJCXByaW50aygiJXM6IHRhcmdldCAlZCB1c2luZyAlZGJpdCB0cmFuc2ZlcnNcbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0LAogCQkJICAgICAgIDggKiAoMHgwMSA8PCB3aWR0aCkpOwogCQl9CkBAIC0yODM1LDcgKzI4MzQsNyBAQAogdm9pZAogYWhjX3ByaW50X2RldmluZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCiB7Ci0JcHJpbnRmKCIlczolYzolZDolZDogIiwgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwlwcmludGsoIiVzOiVjOiVkOiVkOiAiLCBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAogCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CiB9CiAKQEAgLTI5MDcsNyArMjkwNiw3IEBACiAJCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19CVVNfREVWX1JFU0VUOwogCQlhaGMtPm1zZ291dF9sZW4rKzsKIAkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwotCQlwcmludGYoIkJ1cyBEZXZpY2UgUmVzZXQgTWVzc2FnZSBTZW50XG4iKTsKKwkJcHJpbnRrKCJCdXMgRGV2aWNlIFJlc2V0IE1lc3NhZ2UgU2VudFxuIik7CiAJCS8qCiAJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgogCQkgKiB0aGUgYnVzZnJlZS4gIFdlIG1heSBoYXZlIGFuIGVudHJ5IGluIHRoZSB3YWl0aW5nCkBAIC0yOTIzLDcgKzI5MjIsNyBAQAogCQkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUOwogCQlhaGMtPm1zZ291dF9sZW4rKzsKIAkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwotCQlwcmludGYoIkFib3J0JXMgTWVzc2FnZSBTZW50XG4iLAorCQlwcmludGsoIkFib3J0JXMgTWVzc2FnZSBTZW50XG4iLAogCQkgICAgICAgKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDAgPyAiIFRhZyIgOiAiIik7CiAJCS8qCiAJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgpAQCAtMjkzNiw5ICsyOTM1LDkgQEAKIAl9IGVsc2UgaWYgKChzY2ItPmZsYWdzICYgKFNDQl9BVVRPX05FR09USUFURXxTQ0JfTkVHT1RJQVRFKSkgIT0gMCkgewogCQlhaGNfYnVpbGRfdHJhbnNmZXJfbXNnKGFoYywgZGV2aW5mbyk7CiAJfSBlbHNlIHsKLQkJcHJpbnRmKCJhaGNfaW50cjogQVdBSVRJTkdfTVNHIGZvciBhbiBTQ0IgdGhhdCAiCisJCXByaW50aygiYWhjX2ludHI6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgIgogCQkgICAgICAgImRvZXMgbm90IGhhdmUgYSB3YWl0aW5nIG1lc3NhZ2VcbiIpOwotCQlwcmludGYoIlNDU0lJRCA9ICV4LCB0YXJnZXRfbWFzayA9ICV4XG4iLCBzY2ItPmhzY2ItPnNjc2lpZCwKKwkJcHJpbnRrKCJTQ1NJSUQgPSAleCwgdGFyZ2V0X21hc2sgPSAleFxuIiwgc2NiLT5oc2NiLT5zY3NpaWQsCiAJCSAgICAgICBkZXZpbmZvLT50YXJnZXRfbWFzayk7CiAJCXBhbmljKCJTQ0IgPSAlZCwgU0NCIENvbnRyb2wgPSAleCwgTVNHX09VVCA9ICV4ICIKIAkJICAgICAgIlNDQiBmbGFncyA9ICV4Iiwgc2NiLT5oc2NiLT50YWcsIHNjYi0+aHNjYi0+Y29udHJvbCwKQEAgLTMwMTksNyArMzAxOCw3IEBACiAKIAkJaWYgKGJvb3R2ZXJib3NlKSB7CiAJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOwotCQkJcHJpbnRmKCJFbnN1cmluZyBhc3luY1xuIik7CisJCQlwcmludGsoIkVuc3VyaW5nIGFzeW5jXG4iKTsKIAkJfQogCX0KIApAQCAtMzA2Nyw3ICszMDY2LDcgQEAKIAkJCWFoYy0+bXNnb3V0X2J1ZiArIGFoYy0+bXNnb3V0X2luZGV4LCBwZXJpb2QsIG9mZnNldCk7CiAJYWhjLT5tc2dvdXRfbGVuICs9IDU7CiAJaWYgKGJvb3R2ZXJib3NlKSB7Ci0JCXByaW50ZigiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBTRFRSIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG4iLAorCQlwcmludGsoIiglczolYzolZDolZCk6IFNlbmRpbmcgU0RUUiBwZXJpb2QgJXgsIG9mZnNldCAleFxuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKIAkJICAgICAgIGRldmluZm8tPmx1biwgcGVyaW9kLCBvZmZzZXQpOwogCX0KQEAgLTMwODUsNyArMzA4NCw3IEBACiAJCQlhaGMtPm1zZ291dF9idWYgKyBhaGMtPm1zZ291dF9pbmRleCwgYnVzX3dpZHRoKTsKIAlhaGMtPm1zZ291dF9sZW4gKz0gNDsKIAlpZiAoYm9vdHZlcmJvc2UpIHsKLQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFdEVFIgJXhcbiIsCisJCXByaW50aygiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBXRFRSICV4XG4iLAogCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAogCQkgICAgICAgZGV2aW5mby0+bHVuLCBidXNfd2lkdGgpOwogCX0KQEAgLTMxMDcsNyArMzEwNiw3IEBACiAJCQlidXNfd2lkdGgsIHBwcl9vcHRpb25zKTsKIAlhaGMtPm1zZ291dF9sZW4gKz0gODsKIAlpZiAoYm9vdHZlcmJvc2UpIHsKLQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFBQUiBidXNfd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQlwcmludGsoIiglczolYzolZDolZCk6IFNlbmRpbmcgUFBSIGJ1c193aWR0aCAleCwgcGVyaW9kICV4LCAiCiAJCSAgICAgICAib2Zmc2V0ICV4LCBwcHJfb3B0aW9ucyAleFxuIiwgYWhjX25hbWUoYWhjKSwKIAkJICAgICAgIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAogCQkgICAgICAgYnVzX3dpZHRoLCBwZXJpb2QsIG9mZnNldCwgcHByX29wdGlvbnMpOwpAQCAtMzE2MCw3ICszMTU5LDcgQEAKIAkJICogdG8gbWF0Y2guCiAJCSAqLwogCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKLQkJcHJpbnRmKCJUYXJnZXQgZGlkIG5vdCBzZW5kIGFuIElERU5USUZZIG1lc3NhZ2UuICIKKwkJcHJpbnRrKCJUYXJnZXQgZGlkIG5vdCBzZW5kIGFuIElERU5USUZZIG1lc3NhZ2UuICIKIAkJICAgICAgICJMQVNUUEhBU0UgPSAweCV4LlxuIiwgbGFzdHBoYXNlKTsKIAkJc2NiID0gTlVMTDsKIAl9IGVsc2UgaWYgKHNjYiA9PSBOVUxMKSB7CkBAIC0zMTY5LDEzICszMTY4LDEzIEBACiAJCSAqIHRyYW5zYWN0aW9uLiAgUHJpbnQgYW4gZXJyb3IgYW5kIHJlc2V0IHRoZSBidXMuCiAJCSAqLwogCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKLQkJcHJpbnRmKCJObyBTQ0IgZm91bmQgZHVyaW5nIHByb3RvY29sIHZpb2xhdGlvblxuIik7CisJCXByaW50aygiTm8gU0NCIGZvdW5kIGR1cmluZyBwcm90b2NvbCB2aW9sYXRpb25cbiIpOwogCQlnb3RvIHByb3RvX3Zpb2xhdGlvbl9yZXNldDsKIAl9IGVsc2UgewogCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9TRVFVRU5DRV9GQUlMKTsKIAkJaWYgKChzZXFfZmxhZ3MgJiBOT19DREJfU0VOVCkgIT0gMCkgewogCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwotCQkJcHJpbnRmKCJObyBvciBpbmNvbXBsZXRlIENEQiBzZW50IHRvIGRldmljZS5cbiIpOworCQkJcHJpbnRrKCJObyBvciBpbmNvbXBsZXRlIENEQiBzZW50IHRvIGRldmljZS5cbiIpOwogCQl9IGVsc2UgaWYgKChhaGNfaW5iKGFoYywgU0NCX0NPTlRST0wpICYgU1RBVFVTX1JDVkQpID09IDApIHsKIAkJCS8qCiAJCQkgKiBUaGUgdGFyZ2V0IG5ldmVyIGJvdGhlcmVkIHRvIHByb3ZpZGUgc3RhdHVzIHRvCkBAIC0zMTg1LDEwICszMTg0LDEwIEBACiAJCQkgKiBtZXNzYWdlLgogCQkJICovCiAJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCQlwcmludGYoIkNvbXBsZXRlZCBjb21tYW5kIHdpdGhvdXQgc3RhdHVzLlxuIik7CisJCQlwcmludGsoIkNvbXBsZXRlZCBjb21tYW5kIHdpdGhvdXQgc3RhdHVzLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCQlwcmludGYoIlVua25vd24gcHJvdG9jb2wgdmlvbGF0aW9uLlxuIik7CisJCQlwcmludGsoIlVua25vd24gcHJvdG9jb2wgdmlvbGF0aW9uLlxuIik7CiAJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CiAJCX0KIAl9CkBAIC0zMjAyLDcgKzMyMDEsNyBAQAogCQkgKiBpdCBhd2F5IHdpdGggYSBidXMgcmVzZXQuCiAJCSAqLwogCQlmb3VuZCA9IGFoY19yZXNldF9jaGFubmVsKGFoYywgJ0EnLCBUUlVFKTsKLQkJcHJpbnRmKCIlczogSXNzdWVkIENoYW5uZWwgJWMgQnVzIFJlc2V0LiAiCisJCXByaW50aygiJXM6IElzc3VlZCBDaGFubmVsICVjIEJ1cyBSZXNldC4gIgogCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZFxuIiwgYWhjX25hbWUoYWhjKSwgJ0EnLCBmb3VuZCk7CiAJfSBlbHNlIHsKIAkJLyoKQEAgLTMyMjQsNyArMzIyMyw3IEBACiAJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CiAJCQlzY2ItPmZsYWdzIHw9IFNDQl9BQk9SVDsKIAkJfQotCQlwcmludGYoIlByb3RvY29sIHZpb2xhdGlvbiAlcy4gIEF0dGVtcHRpbmcgdG8gYWJvcnQuXG4iLAorCQlwcmludGsoIlByb3RvY29sIHZpb2xhdGlvbiAlcy4gIEF0dGVtcHRpbmcgdG8gYWJvcnQuXG4iLAogCQkgICAgICAgYWhjX2xvb2t1cF9waGFzZV9lbnRyeShjdXJwaGFzZSktPnBoYXNlbXNnKTsKIAl9CiB9CkBAIC0zMjU3LDE0ICszMjU2LDE0IEBACiAjaWZkZWYgQUhDX0RFQlVHCiAJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKIAkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOwotCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX09VVCIpOworCQkJcHJpbnRrKCJJTklUSUFUT1JfTVNHX09VVCIpOwogCQl9CiAjZW5kaWYKIAkJcGhhc2VtaXMgPSBidXNfcGhhc2UgIT0gUF9NRVNHT1VUOwogCQlpZiAocGhhc2VtaXMpIHsKICNpZmRlZiBBSENfREVCVUcKIAkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKLQkJCQlwcmludGYoIiBQSEFTRU1JUyAlc1xuIiwKKwkJCQlwcmludGsoIiBQSEFTRU1JUyAlc1xuIiwKIAkJCQkgICAgICAgYWhjX2xvb2t1cF9waGFzZV9lbnRyeShidXNfcGhhc2UpCiAJCQkJCQkJICAgICAtPnBoYXNlbXNnKTsKIAkJCX0KQEAgLTMyOTEsNyArMzI5MCw3IEBACiAJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKICNpZmRlZiBBSENfREVCVUcKIAkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQkJcHJpbnRmKCIgYnl0ZSAweCV4XG4iLCBhaGMtPnNlbmRfbXNnX3BlcnJvcik7CisJCQkJcHJpbnRrKCIgYnl0ZSAweCV4XG4iLCBhaGMtPnNlbmRfbXNnX3BlcnJvcik7CiAjZW5kaWYKIAkJCWFoY19vdXRiKGFoYywgU0NTSURBVEwsIE1TR19QQVJJVFlfRVJST1IpOwogCQkJYnJlYWs7CkBAIC0zMzIxLDcgKzMzMjAsNyBAQAogCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKICNpZmRlZiBBSENfREVCVUcKIAkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkKLQkJCXByaW50ZigiIGJ5dGUgMHgleFxuIiwKKwkJCXByaW50aygiIGJ5dGUgMHgleFxuIiwKIAkJCSAgICAgICBhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXhdKTsKICNlbmRpZgogCQlhaGNfb3V0YihhaGMsIFNDU0lEQVRMLCBhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10pOwpAQCAtMzMzNSwxNCArMzMzNCwxNCBAQAogI2lmZGVmIEFIQ19ERUJVRwogCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKSB7CiAJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKLQkJCXByaW50ZigiSU5JVElBVE9SX01TR19JTiIpOworCQkJcHJpbnRrKCJJTklUSUFUT1JfTVNHX0lOIik7CiAJCX0KICNlbmRpZgogCQlwaGFzZW1pcyA9IGJ1c19waGFzZSAhPSBQX01FU0dJTjsKIAkJaWYgKHBoYXNlbWlzKSB7CiAjaWZkZWYgQUhDX0RFQlVHCiAJCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKSB7Ci0JCQkJcHJpbnRmKCIgUEhBU0VNSVMgJXNcbiIsCisJCQkJcHJpbnRrKCIgUEhBU0VNSVMgJXNcbiIsCiAJCQkJICAgICAgIGFoY19sb29rdXBfcGhhc2VfZW50cnkoYnVzX3BoYXNlKQogCQkJCQkJCSAgICAgLT5waGFzZW1zZyk7CiAJCQl9CkBAIC0zMzYzLDcgKzMzNjIsNyBAQAogCQlhaGMtPm1zZ2luX2J1ZlthaGMtPm1zZ2luX2luZGV4XSA9IGFoY19pbmIoYWhjLCBTQ1NJQlVTTCk7CiAjaWZkZWYgQUhDX0RFQlVHCiAJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApCi0JCQlwcmludGYoIiBieXRlIDB4JXhcbiIsCisJCQlwcmludGsoIiBieXRlIDB4JXhcbiIsCiAJCQkgICAgICAgYWhjLT5tc2dpbl9idWZbYWhjLT5tc2dpbl9pbmRleF0pOwogI2VuZGlmCiAKQEAgLTMzODUsNyArMzM4NCw3IEBACiAjaWZkZWYgQUhDX0RFQlVHCiAJCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkgewogCQkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKLQkJCQkJcHJpbnRmKCJBc3NlcnRpbmcgQVROIGZvciByZXNwb25zZVxuIik7CisJCQkJCXByaW50aygiQXNzZXJ0aW5nIEFUTiBmb3IgcmVzcG9uc2VcbiIpOwogCQkJCX0KICNlbmRpZgogCQkJCWFoY19hc3NlcnRfYXRuKGFoYyk7CkBAIC0zNjY2LDcgKzM2NjUsNyBAQAogCQkJCQkgICAgdGFyZ19zY3NpcmF0ZSAmIFdJREVYRkVSLAogCQkJCQkgICAgZGV2aW5mby0+cm9sZSk7CiAJCQlpZiAoYm9vdHZlcmJvc2UpIHsKLQkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkICIKKwkJCQlwcmludGsoIiglczolYzolZDolZCk6IFJlY2VpdmVkICIKIAkJCQkgICAgICAgIlNEVFIgcGVyaW9kICV4LCBvZmZzZXQgJXhcblx0IgogCQkJCSAgICAgICAiRmlsdGVyZWQgdG8gcGVyaW9kICV4LCBvZmZzZXQgJXhcbiIsCiAJCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsCkBAIC0zNjk3LDcgKzM2OTYsNyBAQAogCQkJCSAqLwogCQkJCWlmIChib290dmVyYm9zZQogCQkJCSAmJiBkZXZpbmZvLT5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7Ci0JCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgogCQkJCQkgICAgICAgIkluaXRpYXRlZCBTRFRSXG4iLAogCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKIAkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKQEAgLTM3MzksNyArMzczOCw3IEBACiAJCQlhaGNfdmFsaWRhdGVfd2lkdGgoYWhjLCB0aW5mbywgJmJ1c193aWR0aCwKIAkJCQkJICAgZGV2aW5mby0+cm9sZSk7CiAJCQlpZiAoYm9vdHZlcmJvc2UpIHsKLQkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkIFdEVFIgIgorCQkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogUmVjZWl2ZWQgV0RUUiAiCiAJCQkJICAgICAgICIleCBmaWx0ZXJlZCB0byAleFxuIiwKIAkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKIAkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4sCkBAIC0zNzU1LDcgKzM3NTQsNyBAQAogCQkJCSAqLwogCQkJCWlmIChzYXZlZF93aWR0aCA+IGJ1c193aWR0aCkgewogCQkJCQlyZWplY3QgPSBUUlVFOwotCQkJCQlwcmludGYoIiglczolYzolZDolZCk6IHJlcXVlc3RlZCAlZEJpdCAiCisJCQkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogcmVxdWVzdGVkICVkQml0ICIKIAkJCQkJICAgICAgICJ0cmFuc2ZlcnMuICBSZWplY3RpbmcuLi5cbiIsCiAJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4sCkBAIC0zNzY4LDcgKzM3NjcsNyBAQAogCQkJCSAqLwogCQkJCWlmIChib290dmVyYm9zZQogCQkJCSAmJiBkZXZpbmZvLT5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7Ci0JCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgogCQkJCQkgICAgICAgIkluaXRpYXRlZCBXRFRSXG4iLAogCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKIAkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKQEAgLTM4ODYsMTIgKzM4ODUsMTIgQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWlmIChkZXZpbmZvLT5yb2xlICE9IFJPTEVfVEFSR0VUKQotCQkJCQlwcmludGYoIiglczolYzolZDolZCk6IFRhcmdldCAiCisJCQkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKIAkJCQkJICAgICAgICJJbml0aWF0ZWQgUFBSXG4iLAogCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKIAkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKIAkJCQllbHNlCi0JCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogSW5pdGlhdG9yICIKKwkJCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBJbml0aWF0b3IgIgogCQkJCQkgICAgICAgIkluaXRpYXRlZCBQUFJcbiIsCiAJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwpAQCAtMzkwMyw3ICszOTAyLDcgQEAKIAkJCQlyZXNwb25zZSA9IFRSVUU7CiAJCQl9CiAJCQlpZiAoYm9vdHZlcmJvc2UpIHsKLQkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkIFBQUiB3aWR0aCAleCwgIgorCQkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogUmVjZWl2ZWQgUFBSIHdpZHRoICV4LCAiCiAJCQkJICAgICAgICJwZXJpb2QgJXgsIG9mZnNldCAleCxvcHRpb25zICV4XG4iCiAJCQkJICAgICAgICJcdEZpbHRlcmVkIHRvIHdpZHRoICV4LCBwZXJpb2QgJXgsICIKIAkJCQkgICAgICAgIm9mZnNldCAleCwgb3B0aW9ucyAleFxuIiwKQEAgLTQwMzMsNyArNDAzMiw3IEBACiAJCSAqIEF0dGVtcHQgdG8gbmVnb3RpYXRlIFNQSS0yIHN0eWxlLgogCQkgKi8KIAkJaWYgKGJvb3R2ZXJib3NlKSB7Ci0JCQlwcmludGYoIiglczolYzolZDolZCk6IFBQUiBSZWplY3RlZC4gIgorCQkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiBQUFIgUmVqZWN0ZWQuICIKIAkJCSAgICAgICAiVHJ5aW5nIFdEVFIvU0RUUlxuIiwKIAkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAogCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKQEAgLTQwNDksNyArNDA0OCw3IEBACiAJfSBlbHNlIGlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1dEVFIsIC8qZnVsbCovRkFMU0UpKSB7CiAKIAkJLyogbm90ZSA4Yml0IHhmZXJzICovCi0JCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBXSURFIG5lZ290aWF0aW9uLiAgVXNpbmcgIgorCQlwcmludGsoIiglczolYzolZDolZCk6IHJlZnVzZXMgV0lERSBuZWdvdGlhdGlvbi4gIFVzaW5nICIKIAkJICAgICAgICI4Yml0IHRyYW5zZmVyc1xuIiwgYWhjX25hbWUoYWhjKSwKIAkJICAgICAgIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKIAkJYWhjX3NldF93aWR0aChhaGMsIGRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCkBAIC00MDc3LDcgKzQwNzYsNyBAQAogCQkJCSAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKIAkJCQkgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKIAkJCQkgLypwYXVzZWQqL1RSVUUpOwotCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgc3luY2hyb25vdXMgbmVnb3RpYXRpb24uICIKKwkJcHJpbnRrKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uLiAiCiAJCSAgICAgICAiVXNpbmcgYXN5bmNocm9ub3VzIHRyYW5zZmVyc1xuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsCiAJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CkBAIC00MDg4LDEzICs0MDg3LDEzIEBACiAJCXRhZ190eXBlID0gKHNjYi0+aHNjYi0+Y29udHJvbCAmIE1TR19TSU1QTEVfVEFTSyk7CiAKIAkJaWYgKHRhZ190eXBlID09IE1TR19TSU1QTEVfVEFTSykgewotCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIHRhZ2dlZCBjb21tYW5kcy4gICIKKwkJCXByaW50aygiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyB0YWdnZWQgY29tbWFuZHMuICAiCiAJCQkgICAgICAgIlBlcmZvcm1pbmcgbm9uLXRhZ2dlZCBJL09cbiIsIGFoY19uYW1lKGFoYyksCiAJCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwogCQkJYWhjX3NldF90YWdzKGFoYywgc2NiLT5pb19jdHgsIGRldmluZm8sIEFIQ19RVUVVRV9OT05FKTsKIAkJCW1hc2sgPSB+MHgyMzsKIAkJfSBlbHNlIHsKLQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyAlcyB0YWdnZWQgY29tbWFuZHMuICAiCisJCQlwcmludGsoIiglczolYzolZDolZCk6IHJlZnVzZXMgJXMgdGFnZ2VkIGNvbW1hbmRzLiAgIgogCQkJICAgICAgICJQZXJmb3JtaW5nIHNpbXBsZSBxdWV1ZSB0YWdnZWQgSS9PIG9ubHlcbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAogCQkJICAgICAgIGRldmluZm8tPmx1biwgdGFnX3R5cGUgPT0gTVNHX09SREVSRURfVEFTSwpAQCAtNDE0NCw3ICs0MTQzLDcgQEAKIAkJLyoKIAkJICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCiAJCSAqLwotCQlwcmludGYoIiVzOiVjOiVkOiBNZXNzYWdlIHJlamVjdCBmb3IgJXggLS0gaWdub3JlZFxuIiwKKwkJcHJpbnRrKCIlczolYzolZDogTWVzc2FnZSByZWplY3QgZm9yICV4IC0tIGlnbm9yZWRcbiIsCiAJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCiAJCSAgICAgICBsYXN0X21zZyk7CiAJfQpAQCAtNDM2OSw3ICs0MzY4LDcgQEAKIAogCWlmIChtZXNzYWdlICE9IE5VTEwKIAkgJiYgKHZlcmJvc2VfbGV2ZWwgPD0gYm9vdHZlcmJvc2UpKQotCQlwcmludGYoIiVzOiAlcyBvbiAlYzolZC4gJWQgU0NCcyBhYm9ydGVkXG4iLCBhaGNfbmFtZShhaGMpLAorCQlwcmludGsoIiVzOiAlcyBvbiAlYzolZC4gJWQgU0NCcyBhYm9ydGVkXG4iLCBhaGNfbmFtZShhaGMpLAogCQkgICAgICAgbWVzc2FnZSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBmb3VuZCk7CiB9CiAKQEAgLTQ0MDgsMjMgKzQ0MDcsMjIgQEAKIAlpbnQJaTsKIAogI2lmbmRlZglfX0ZyZWVCU0RfXwotCWFoYyA9IG1hbGxvYyhzaXplb2YoKmFoYyksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJYWhjID0ga21hbGxvYyhzaXplb2YoKmFoYyksIEdGUF9BVE9NSUMpOwogCWlmICghYWhjKSB7Ci0JCXByaW50ZigiYWljN3h4eDogY2Fubm90IG1hbGxvYyBzb2Z0YyFcbiIpOwotCQlmcmVlKG5hbWUsIE1fREVWQlVGKTsKKwkJcHJpbnRrKCJhaWM3eHh4OiBjYW5ub3QgbWFsbG9jIHNvZnRjIVxuIik7CisJCWtmcmVlKG5hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAjZWxzZQogCWFoYyA9IGRldmljZV9nZXRfc29mdGMoKGRldmljZV90KXBsYXRmb3JtX2FyZyk7CiAjZW5kaWYKIAltZW1zZXQoYWhjLCAwLCBzaXplb2YoKmFoYykpOwotCWFoYy0+c2VlcF9jb25maWcgPSBtYWxsb2Moc2l6ZW9mKCphaGMtPnNlZXBfY29uZmlnKSwKLQkJCQkgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJYWhjLT5zZWVwX2NvbmZpZyA9IGttYWxsb2Moc2l6ZW9mKCphaGMtPnNlZXBfY29uZmlnKSwgR0ZQX0FUT01JQyk7CiAJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkgewogI2lmbmRlZglfX0ZyZWVCU0RfXwotCQlmcmVlKGFoYywgTV9ERVZCVUYpOworCQlrZnJlZShhaGMpOwogI2VuZGlmCi0JCWZyZWUobmFtZSwgTV9ERVZCVUYpOworCQlrZnJlZShuYW1lKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAJTElTVF9JTklUKCZhaGMtPnBlbmRpbmdfc2Nicyk7CkBAIC00NDY2LDggKzQ0NjQsNyBAQAogCWFoYy0+cGF1c2UgPSBhaGMtPnVucGF1c2UgfCBQQVVTRTsgCiAJLyogWFhYIFRoZSBzaGFyZWQgc2NiIGRhdGEgc3R1ZmYgc2hvdWxkIGJlIGRlcHJlY2F0ZWQgKi8KIAlpZiAoYWhjLT5zY2JfZGF0YSA9PSBOVUxMKSB7Ci0JCWFoYy0+c2NiX2RhdGEgPSBtYWxsb2Moc2l6ZW9mKCphaGMtPnNjYl9kYXRhKSwKLQkJCQkgICAgICAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJYWhjLT5zY2JfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCphaGMtPnNjYl9kYXRhKSwgR0ZQX0FUT01JQyk7CiAJCWlmIChhaGMtPnNjYl9kYXRhID09IE5VTEwpCiAJCQlyZXR1cm4gKEVOT01FTSk7CiAJCW1lbXNldChhaGMtPnNjYl9kYXRhLCAwLCBzaXplb2YoKmFoYy0+c2NiX2RhdGEpKTsKQEAgLTQ0ODYsNyArNDQ4Myw3IEBACiBhaGNfc2V0X25hbWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyICpuYW1lKQogewogCWlmIChhaGMtPm5hbWUgIT0gTlVMTCkKLQkJZnJlZShhaGMtPm5hbWUsIE1fREVWQlVGKTsKKwkJa2ZyZWUoYWhjLT5uYW1lKTsKIAlhaGMtPm5hbWUgPSBuYW1lOwogfQogCkBAIC00NTQwLDI1ICs0NTM3LDI1IEBACiAJCQkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbal07CiAJCQkJaWYgKGxzdGF0ZSAhPSBOVUxMKSB7CiAJCQkJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKLQkJCQkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKwkJCQkJa2ZyZWUobHN0YXRlKTsKIAkJCQl9CiAJCQl9CiAjZW5kaWYKLQkJCWZyZWUodHN0YXRlLCBNX0RFVkJVRik7CisJCQlrZnJlZSh0c3RhdGUpOwogCQl9CiAJfQogI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQogCWlmIChhaGMtPmJsYWNrX2hvbGUgIT0gTlVMTCkgewogCQl4cHRfZnJlZV9wYXRoKGFoYy0+YmxhY2tfaG9sZS0+cGF0aCk7Ci0JCWZyZWUoYWhjLT5ibGFja19ob2xlLCBNX0RFVkJVRik7CisJCWtmcmVlKGFoYy0+YmxhY2tfaG9sZSk7CiAJfQogI2VuZGlmCiAJaWYgKGFoYy0+bmFtZSAhPSBOVUxMKQotCQlmcmVlKGFoYy0+bmFtZSwgTV9ERVZCVUYpOworCQlrZnJlZShhaGMtPm5hbWUpOwogCWlmIChhaGMtPnNlZXBfY29uZmlnICE9IE5VTEwpCi0JCWZyZWUoYWhjLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCQlrZnJlZShhaGMtPnNlZXBfY29uZmlnKTsKICNpZm5kZWYgX19GcmVlQlNEX18KLQlmcmVlKGFoYywgTV9ERVZCVUYpOworCWtmcmVlKGFoYyk7CiAjZW5kaWYKIAlyZXR1cm47CiB9CkBAIC00NjMzLDcgKzQ2MzAsNyBAQAogCX0gd2hpbGUgKC0td2FpdCAmJiAhKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgQ0hJUFJTVEFDSykpOwogCiAJaWYgKHdhaXQgPT0gMCkgewotCQlwcmludGYoIiVzOiBXQVJOSU5HIC0gRmFpbGVkIGNoaXAgcmVzZXQhICAiCisJCXByaW50aygiJXM6IFdBUk5JTkcgLSBGYWlsZWQgY2hpcCByZXNldCEgICIKIAkJICAgICAgICJUcnlpbmcgdG8gaW5pdGlhbGl6ZSBhbnl3YXkuXG4iLCBhaGNfbmFtZShhaGMpKTsKIAl9CiAJYWhjX291dGIoYWhjLCBIQ05UUkwsIGFoYy0+cGF1c2UpOwpAQCAtNDY1Niw3ICs0NjUzLDcgQEAKIAkJYWhjLT5mZWF0dXJlcyB8PSBBSENfVFdJTjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRmKCIgVW5zdXBwb3J0ZWQgYWRhcHRlciB0eXBlLiAgSWdub3JpbmdcbiIpOworCQlwcmludGsoIiBVbnN1cHBvcnRlZCBhZGFwdGVyIHR5cGUuICBJZ25vcmluZ1xuIik7CiAJCXJldHVybigtMSk7CiAJfQogCkBAIC00NzgzLDkgKzQ3ODAsNyBAQAogCVNMSVNUX0lOSVQoJnNjYl9kYXRhLT5zZ19tYXBzKTsKIAogCS8qIEFsbG9jYXRlIFNDQiByZXNvdXJjZXMgKi8KLQlzY2JfZGF0YS0+c2NiYXJyYXkgPQotCSAgICAoc3RydWN0IHNjYiAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNjYikgKiBBSENfU0NCX01BWF9BTExPQywKLQkJCQkgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlzY2JfZGF0YS0+c2NiYXJyYXkgPSAoc3RydWN0IHNjYiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2IpICogQUhDX1NDQl9NQVhfQUxMT0MsIEdGUF9BVE9NSUMpOwogCWlmIChzY2JfZGF0YS0+c2NiYXJyYXkgPT0gTlVMTCkKIAkJcmV0dXJuIChFTk9NRU0pOwogCW1lbXNldChzY2JfZGF0YS0+c2NiYXJyYXksIDAsIHNpemVvZihzdHJ1Y3Qgc2NiKSAqIEFIQ19TQ0JfTUFYX0FMTE9DKTsKQEAgLTQ3OTQsNyArNDc4OSw3IEBACiAKIAlzY2JfZGF0YS0+bWF4aHNjYnMgPSBhaGNfcHJvYmVfc2NicyhhaGMpOwogCWlmIChhaGMtPnNjYl9kYXRhLT5tYXhoc2NicyA9PSAwKSB7Ci0JCXByaW50ZigiJXM6IE5vIFNDQiBzcGFjZSBmb3VuZFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCXByaW50aygiJXM6IE5vIFNDQiBzcGFjZSBmb3VuZFxuIiwgYWhjX25hbWUoYWhjKSk7CiAJCXJldHVybiAoRU5YSU8pOwogCX0KIApAQCAtNDg5Miw3ICs0ODg3LDcgQEAKIAlhaGNfYWxsb2Nfc2NicyhhaGMpOwogCiAJaWYgKHNjYl9kYXRhLT5udW1zY2JzID09IDApIHsKLQkJcHJpbnRmKCIlczogYWhjX2luaXRfc2NiZGF0YSAtICIKKwkJcHJpbnRrKCIlczogYWhjX2luaXRfc2NiZGF0YSAtICIKIAkJICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgaW5pdGlhbCBzY2JzXG4iLAogCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKQEAgLTQ5MzUsNyArNDkzMCw3IEBACiAJCQlhaGNfZG1hbWVtX2ZyZWUoYWhjLCBzY2JfZGF0YS0+c2dfZG1hdCwKIAkJCQkJc2dfbWFwLT5zZ192YWRkciwKIAkJCQkJc2dfbWFwLT5zZ19kbWFtYXApOwotCQkJZnJlZShzZ19tYXAsIE1fREVWQlVGKTsKKwkJCWtmcmVlKHNnX21hcCk7CiAJCX0KIAkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIHNjYl9kYXRhLT5zZ19kbWF0KTsKIAl9CkBAIC00OTY0LDcgKzQ5NTksNyBAQAogCQlicmVhazsKIAl9CiAJaWYgKHNjYl9kYXRhLT5zY2JhcnJheSAhPSBOVUxMKQotCQlmcmVlKHNjYl9kYXRhLT5zY2JhcnJheSwgTV9ERVZCVUYpOworCQlrZnJlZShzY2JfZGF0YS0+c2NiYXJyYXkpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDk4NSw3ICs0OTgwLDcgQEAKIAogCW5leHRfc2NiID0gJnNjYl9kYXRhLT5zY2JhcnJheVtzY2JfZGF0YS0+bnVtc2Nic107CiAKLQlzZ19tYXAgPSBtYWxsb2Moc2l6ZW9mKCpzZ19tYXApLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCXNnX21hcCA9IGttYWxsb2Moc2l6ZW9mKCpzZ19tYXApLCBHRlBfQVRPTUlDKTsKIAogCWlmIChzZ19tYXAgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNDk5NCw3ICs0OTg5LDcgQEAKIAlpZiAoYWhjX2RtYW1lbV9hbGxvYyhhaGMsIHNjYl9kYXRhLT5zZ19kbWF0LAogCQkJICAgICAodm9pZCAqKikmc2dfbWFwLT5zZ192YWRkciwKIAkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZzZ19tYXAtPnNnX2RtYW1hcCkgIT0gMCkgewotCQlmcmVlKHNnX21hcCwgTV9ERVZCVUYpOworCQlrZnJlZShzZ19tYXApOwogCQlyZXR1cm47CiAJfQogCkBAIC01MDE0LDggKzUwMDksNyBAQAogI2lmbmRlZiBfX2xpbnV4X18KIAkJaW50IGVycm9yOwogI2VuZGlmCi0JCXBkYXRhID0gKHN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqKW1hbGxvYyhzaXplb2YoKnBkYXRhKSwKLQkJCQkJCQkgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQlwZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9BVE9NSUMpOwogCQlpZiAocGRhdGEgPT0gTlVMTCkKIAkJCWJyZWFrOwogCQluZXh0X3NjYi0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOwpAQCAtNTI0NCw3ICs1MjM4LDcgQEAKIAkgKiBpbiAiZmFzdCIgbW9kZS4KIAkgKi8KIAlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IERvd25sb2FkaW5nIFNlcXVlbmNlciBQcm9ncmFtLi4uIiwKKwkJcHJpbnRrKCIlczogRG93bmxvYWRpbmcgU2VxdWVuY2VyIFByb2dyYW0uLi4iLAogCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CiAKIAllcnJvciA9IGFoY19sb2Fkc2VxKGFoYyk7CkBAIC01MjkwLDIyICs1Mjg0LDIyIEBACiAjZW5kaWYKIAogI2lmZGVmIEFIQ19QUklOVF9TUkFNCi0JcHJpbnRmKCJTY3JhdGNoIFJhbToiKTsKKwlwcmludGsoIlNjcmF0Y2ggUmFtOiIpOwogCWZvciAoaSA9IDB4MjA7IGkgPCAweDVmOyBpKyspIHsKIAkJaWYgKCgoaSAlIDgpID09IDApICYmIChpICE9IDApKSB7Ci0JCQlwcmludGYgKCJcbiAgICAgICAgICAgICAgIik7CisJCQlwcmludGsgKCJcbiAgICAgICAgICAgICAgIik7CiAJCX0KLQkJcHJpbnRmICgiIDB4JXgiLCBhaGNfaW5iKGFoYywgaSkpOworCQlwcmludGsgKCIgMHgleCIsIGFoY19pbmIoYWhjLCBpKSk7CiAJfQogCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19NT1JFX1NSQU0pICE9IDApIHsKIAkJZm9yIChpID0gMHg3MDsgaSA8IDB4N2Y7IGkrKykgewogCQkJaWYgKCgoaSAlIDgpID09IDApICYmIChpICE9IDApKSB7Ci0JCQkJcHJpbnRmICgiXG4gICAgICAgICAgICAgICIpOworCQkJCXByaW50ayAoIlxuICAgICAgICAgICAgICAiKTsKIAkJCX0KLQkJCXByaW50ZiAoIiAweCV4IiwgYWhjX2luYihhaGMsIGkpKTsKKwkJCXByaW50ayAoIiAweCV4IiwgYWhjX2luYihhaGMsIGkpKTsKIAkJfQogCX0KLQlwcmludGYgKCJcbiIpOworCXByaW50ayAoIlxuIik7CiAJLyoKIAkgKiBSZWFkaW5nIHVuaW5pdGlhbGl6ZWQgc2NyYXRjaCByYW0gbWF5CiAJICogZ2VuZXJhdGUgcGFyaXR5IGVycm9ycy4KQEAgLTU0MTksMTQgKzU0MTMsMTQgQEAKIAkgKiBkYXRhIGZvciBhbnkgdGFyZ2V0IG1vZGUgaW5pdGlhdG9yLgogCSAqLwogCWlmIChhaGNfYWxsb2NfdHN0YXRlKGFoYywgYWhjLT5vdXJfaWQsICdBJykgPT0gTlVMTCkgewotCQlwcmludGYoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgYWhjX3Rtb2RlX3RzdGF0ZS4gICIKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGFoY190bW9kZV90c3RhdGUuICAiCiAJCSAgICAgICAiRmFpbGluZyBhdHRhY2hcbiIsIGFoY19uYW1lKGFoYykpOwogCQlyZXR1cm4gKEVOT01FTSk7CiAJfQogCiAJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKIAkJaWYgKGFoY19hbGxvY190c3RhdGUoYWhjLCBhaGMtPm91cl9pZF9iLCAnQicpID09IE5VTEwpIHsKLQkJCXByaW50ZigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBhaGNfdG1vZGVfdHN0YXRlLiAgIgorCQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGFoY190bW9kZV90c3RhdGUuICAiCiAJCQkgICAgICAgIkZhaWxpbmcgYXR0YWNoXG4iLCBhaGNfbmFtZShhaGMpKTsKIAkJCXJldHVybiAoRU5PTUVNKTsKIAkJfQpAQCAtNTQ0MCw3ICs1NDM0LDcgQEAKIAogI2lmZGVmIEFIQ19ERUJVRwogCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19NSVNDKSB7Ci0JCXByaW50ZigiJXM6IGhhcmR3YXJlIHNjYiAldSBieXRlczsga2VybmVsIHNjYiAldSBieXRlczsgIgorCQlwcmludGsoIiVzOiBoYXJkd2FyZSBzY2IgJXUgYnl0ZXM7IGtlcm5lbCBzY2IgJXUgYnl0ZXM7ICIKIAkJICAgICAgICJhaGNfZG1hICV1IGJ5dGVzXG4iLAogCQkJYWhjX25hbWUoYWhjKSwKIAkJCSh1X2ludClzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYiksCkBAIC01NDcwLDcgKzU0NjQsNyBAQAogCiAJLyogR3JhYiB0aGUgZGlzY29ubmVjdGlvbiBkaXNhYmxlIHRhYmxlIGFuZCBpbnZlcnQgaXQgZm9yIG91ciBuZWVkcyAqLwogCWlmICgoYWhjLT5mbGFncyAmIEFIQ19VU0VERUZBVUxUUykgIT0gMCkgewotCQlwcmludGYoIiVzOiBIb3N0IEFkYXB0ZXIgQmlvcyBkaXNhYmxlZC4gIFVzaW5nIGRlZmF1bHQgU0NTSSAiCisJCXByaW50aygiJXM6IEhvc3QgQWRhcHRlciBCaW9zIGRpc2FibGVkLiAgVXNpbmcgZGVmYXVsdCBTQ1NJICIKIAkJCSJkZXZpY2UgcGFyYW1ldGVyc1xuIiwgYWhjX25hbWUoYWhjKSk7CiAJCWFoYy0+ZmxhZ3MgfD0gQUhDX0VYVEVOREVEX1RSQU5TX0F8QUhDX0VYVEVOREVEX1RSQU5TX0J8CiAJCQkgICAgICBBSENfVEVSTV9FTkJfQXxBSENfVEVSTV9FTkJfQjsKQEAgLTU2NTEsNyArNTY0NSw3IEBACiAJICAgICAgJiYgKChpbnRzdGF0ICYgSU5UX1BFTkQpICE9IDAKIAkgICAgICAgfHwgKGFoY19pbmIoYWhjLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSAhPSAwKSk7CiAJaWYgKG1heGxvb3BzID09IDApIHsKLQkJcHJpbnRmKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKKwkJcHJpbnRrKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKIAkJICAgICAgIGFoY19pbmIoYWhjLCBJTlRTVEFUKSk7CiAJfQogCWFoY19wbGF0Zm9ybV9mbHVzaHdvcmsoYWhjKTsKQEAgLTU5MTAsNyArNTkwNCw3IEBACiAJd2hpbGUgKHFpbnBvcyAhPSBxaW50YWlsKSB7CiAJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgYWhjLT5xaW5maWZvW3FpbnBvc10pOwogCQlpZiAoc2NiID09IE5VTEwpIHsKLQkJCXByaW50ZigicWlucG9zID0gJWQsIFNDQiBpbmRleCA9ICVkXG4iLAorCQkJcHJpbnRrKCJxaW5wb3MgPSAlZCwgU0NCIGluZGV4ID0gJWRcbiIsCiAJCQkJcWlucG9zLCBhaGMtPnFpbmZpZm9bcWlucG9zXSk7CiAJCQlwYW5pYygiTG9vcCAxXG4iKTsKIAkJfQpAQCAtNTkzMyw3ICs1OTI3LDcgQEAKIAkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCiAJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CiAJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKLQkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gcWluZmlmb1xuIik7CisJCQkJCXByaW50aygiSW5hY3RpdmUgU0NCIGluIHFpbmZpZm9cbiIpOwogCQkJCWFoY19kb25lKGFoYywgc2NiKTsKIAogCQkJCS8qIEZBTExUSFJPVUdIICovCkBAIC01OTc2LDcgKzU5NzAsNyBAQAogCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFoYy0+cWluZmlmb1txaW5zdGFydF0pOwogCiAJCWlmIChzY2IgPT0gTlVMTCkgewotCQkJcHJpbnRmKCJmb3VuZCA9ICVkLCBxaW5zdGFydCA9ICVkLCBxaW5maWZpb25leHQgPSAlZFxuIiwKKwkJCXByaW50aygiZm91bmQgPSAlZCwgcWluc3RhcnQgPSAlZCwgcWluZmlmaW9uZXh0ID0gJWRcbiIsCiAJCQkJZm91bmQsIHFpbnN0YXJ0LCBhaGMtPnFpbmZpZm9uZXh0KTsKIAkJCXBhbmljKCJGaXJzdC9TZWNvbmQgUWluZmlmbyBmaXh1cFxuIik7CiAJCX0KQEAgLTYwMTQsNyArNjAwOCw3IEBACiAJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBuZXh0KTsKIAkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9UQUcpOwogCQlpZiAoc2NiX2luZGV4ID49IGFoYy0+c2NiX2RhdGEtPm51bXNjYnMpIHsKLQkJCXByaW50ZigiV2FpdGluZyBMaXN0IGluY29uc2lzdGVuY3kuICIKKwkJCXByaW50aygiV2FpdGluZyBMaXN0IGluY29uc2lzdGVuY3kuICIKIAkJCSAgICAgICAiU0NCIGluZGV4ID09ICVkLCB5ZXQgbnVtc2NicyA9PSAlZC4iLAogCQkJICAgICAgIHNjYl9pbmRleCwgYWhjLT5zY2JfZGF0YS0+bnVtc2Nicyk7CiAJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CkBAIC02MDIyLDcgKzYwMTYsNyBAQAogCQl9CiAJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKIAkJaWYgKHNjYiA9PSBOVUxMKSB7Ci0JCQlwcmludGYoInNjYl9pbmRleCA9ICVkLCBuZXh0ID0gJWRcbiIsCisJCQlwcmludGsoInNjYl9pbmRleCA9ICVkLCBuZXh0ID0gJWRcbiIsCiAJCQkJc2NiX2luZGV4LCBuZXh0KTsKIAkJCXBhbmljKCJXYWl0aW5nIExpc3QgdHJhdmVyc2FsXG4iKTsKIAkJfQpAQCAtNjA0Niw3ICs2MDQwLDcgQEAKIAkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCiAJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CiAJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKLQkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gV2FpdGluZyBMaXN0XG4iKTsKKwkJCQkJcHJpbnRrKCJJbmFjdGl2ZSBTQ0IgaW4gV2FpdGluZyBMaXN0XG4iKTsKIAkJCQlhaGNfZG9uZShhaGMsIHNjYik7CiAJCQkJLyogRkFMTFRIUk9VR0ggKi8KIAkJCX0KQEAgLTYxNTMsNyArNjE0Nyw3IEBACiAJCQkJaWYgKGNzdGF0ICE9IENBTV9SRVFfQ01QKQogCQkJCQlhaGNfZnJlZXplX3NjYihzY2IpOwogCQkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCi0JCQkJCXByaW50ZigiSW5hY3RpdmUgU0NCIGluIHVudGFnZ2VkUVxuIik7CisJCQkJCXByaW50aygiSW5hY3RpdmUgU0NCIGluIHVudGFnZ2VkUVxuIik7CiAJCQkJYWhjX2RvbmUoYWhjLCBzY2IpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNjIwMCw3ICs2MTk0LDcgQEAKIAkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIG5leHQpOwogCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CiAJCWlmIChzY2JfaW5kZXggPj0gYWhjLT5zY2JfZGF0YS0+bnVtc2NicykgewotCQkJcHJpbnRmKCJEaXNjb25uZWN0ZWQgTGlzdCBpbmNvbnNpc3RlbmN5LiAiCisJCQlwcmludGsoIkRpc2Nvbm5lY3RlZCBMaXN0IGluY29uc2lzdGVuY3kuICIKIAkJCSAgICAgICAiU0NCIGluZGV4ID09ICVkLCB5ZXQgbnVtc2NicyA9PSAlZC4iLAogCQkJICAgICAgIHNjYl9pbmRleCwgYWhjLT5zY2JfZGF0YS0+bnVtc2Nicyk7CiAJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CkBAIC02NDU2LDcgKzY0NTAsNyBAQAogCQkJaWYgKGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYnApICE9IENBTV9SRVFfQ01QKQogCQkJCWFoY19mcmVlemVfc2NiKHNjYnApOwogCQkJaWYgKChzY2JwLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCi0JCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0Igb24gcGVuZGluZyBsaXN0XG4iKTsKKwkJCQlwcmludGsoIkluYWN0aXZlIFNDQiBvbiBwZW5kaW5nIGxpc3RcbiIpOwogCQkJYWhjX2RvbmUoYWhjLCBzY2JwKTsKIAkJCWZvdW5kKys7CiAJCX0KQEAgLTY3MzQsNyArNjcyOCw3IEBACiAjaWZkZWYgQUhDX0RFQlVHCiAJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NSVNDKSAhPSAwKSB7CiAJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKLQkJcHJpbnRmKCJIYW5kbGVkICVzUmVzaWR1YWwgb2YgJWQgYnl0ZXNcbiIsCisJCXByaW50aygiSGFuZGxlZCAlc1Jlc2lkdWFsIG9mICVkIGJ5dGVzXG4iLAogCQkgICAgICAgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpID8gIlNlbnNlICIgOiAiIiwgcmVzaWQpOwogCX0KICNlbmRpZgpAQCAtNjc3NCw3ICs2NzY4LDcgQEAKIAogCWlmIChwZW5kaW5nID09IEFIQ19UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkgewogCQl4cHRfcHJpbnRfcGF0aChsc3RhdGUtPnBhdGgpOwotCQlwcmludGYoImltbWVkaWF0ZSBldmVudCAleDoleCBsb3N0XG4iLAorCQlwcmludGsoImltbWVkaWF0ZSBldmVudCAleDoleCBsb3N0XG4iLAogCQkgICAgICAgbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF9yX2lkeF0uZXZlbnRfdHlwZSwKIAkJICAgICAgIGxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdLmV2ZW50X2FyZyk7CiAJCWxzdGF0ZS0+ZXZlbnRfcl9pZHgrKzsKQEAgLTY4NDQsNyArNjgzOCw3IEBACiAJCXVpbnQ4X3QgaW5zX2J5dGVzWzRdOwogCiAJCWFoY19pbnNiKGFoYywgU0VRUkFNLCBpbnNfYnl0ZXMsIDQpOwotCQlwcmludGYoIjB4JTA4eFxuIiwgaW5zX2J5dGVzWzBdIDw8IDI0CisJCXByaW50aygiMHglMDh4XG4iLCBpbnNfYnl0ZXNbMF0gPDwgMjQKIAkJCQkgfCBpbnNfYnl0ZXNbMV0gPDwgMTYKIAkJCQkgfCBpbnNfYnl0ZXNbMl0gPDwgOAogCQkJCSB8IGluc19ieXRlc1szXSk7CkBAIC02OTEyLDcgKzY5MDYsNyBAQAogCQkJICogc3RvcmFnZSBjYXBhY2l0eSBmb3IgdGhpcyBjaGlwLiAgRmFpbAogCQkJICogdGhlIGxvYWQuCiAJCQkgKi8KLQkJCXByaW50ZigiXG4lczogUHJvZ3JhbSB0b28gbGFyZ2UgZm9yIGluc3RydWN0aW9uIG1lbW9yeSAiCisJCQlwcmludGsoIlxuJXM6IFByb2dyYW0gdG9vIGxhcmdlIGZvciBpbnN0cnVjdGlvbiBtZW1vcnkgIgogCQkJICAgICAgICJzaXplIG9mICVkIVxuIiwgYWhjX25hbWUoYWhjKSwKIAkJCSAgICAgICBhaGMtPmluc3RydWN0aW9uX3JhbV9zaXplKTsKIAkJCXJldHVybiAoRU5PTUVNKTsKQEAgLTY5NDcsNyArNjk0MSw3IEBACiAJaWYgKGNzX2NvdW50ICE9IDApIHsKIAogCQljc19jb3VudCAqPSBzaXplb2Yoc3RydWN0IGNzKTsKLQkJYWhjLT5jcml0aWNhbF9zZWN0aW9ucyA9IG1hbGxvYyhjc19jb3VudCwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJYWhjLT5jcml0aWNhbF9zZWN0aW9ucyA9IGttYWxsb2MoY3NfY291bnQsIEdGUF9BVE9NSUMpOwogCQlpZiAoYWhjLT5jcml0aWNhbF9zZWN0aW9ucyA9PSBOVUxMKQogCQkJcGFuaWMoImFoY19sb2Fkc2VxOiBDb3VsZCBub3QgbWFsbG9jIik7CiAJCW1lbWNweShhaGMtPmNyaXRpY2FsX3NlY3Rpb25zLCBjc190YWJsZSwgY3NfY291bnQpOwpAQCAtNjk1NSw4ICs2OTQ5LDggQEAKIAlhaGNfb3V0YihhaGMsIFNFUUNUTCwgUEVSUk9SRElTfEZBSUxESVN8RkFTVE1PREUpOwogCiAJaWYgKGJvb3R2ZXJib3NlKSB7Ci0JCXByaW50ZigiICVkIGluc3RydWN0aW9ucyBkb3dubG9hZGVkXG4iLCBkb3dubG9hZGVkKTsKLQkJcHJpbnRmKCIlczogRmVhdHVyZXMgMHgleCwgQnVncyAweCV4LCBGbGFncyAweCV4XG4iLAorCQlwcmludGsoIiAlZCBpbnN0cnVjdGlvbnMgZG93bmxvYWRlZFxuIiwgZG93bmxvYWRlZCk7CisJCXByaW50aygiJXM6IEZlYXR1cmVzIDB4JXgsIEJ1Z3MgMHgleCwgRmxhZ3MgMHgleFxuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIGFoYy0+ZmVhdHVyZXMsIGFoYy0+YnVncywgYWhjLT5mbGFncyk7CiAJfQogCXJldHVybiAoMCk7CkBAIC03MTMyLDEyICs3MTI2LDEyIEBACiAJdV9pbnQJcHJpbnRlZF9tYXNrOwogCiAJaWYgKGN1cl9jb2x1bW4gIT0gTlVMTCAmJiAqY3VyX2NvbHVtbiA+PSB3cmFwX3BvaW50KSB7Ci0JCXByaW50ZigiXG4iKTsKKwkJcHJpbnRrKCJcbiIpOwogCQkqY3VyX2NvbHVtbiA9IDA7CiAJfQotCXByaW50ZWQgPSBwcmludGYoIiVzWzB4JXhdIiwgbmFtZSwgdmFsdWUpOworCXByaW50ZWQgID0gcHJpbnRrKCIlc1sweCV4XSIsIG5hbWUsIHZhbHVlKTsKIAlpZiAodGFibGUgPT0gTlVMTCkgewotCQlwcmludGVkICs9IHByaW50ZigiICIpOworCQlwcmludGVkICs9IHByaW50aygiICIpOwogCQkqY3VyX2NvbHVtbiArPSBwcmludGVkOwogCQlyZXR1cm4gKHByaW50ZWQpOwogCX0KQEAgLTcxNTIsNyArNzE0Niw3IEBACiAJCQkgID09IHRhYmxlW2VudHJ5XS5tYXNrKSkKIAkJCQljb250aW51ZTsKIAotCQkJcHJpbnRlZCArPSBwcmludGYoIiVzJXMiLAorCQkJcHJpbnRlZCArPSBwcmludGsoIiVzJXMiLAogCQkJCQkgIHByaW50ZWRfbWFzayA9PSAwID8gIjooIiA6ICJ8IiwKIAkJCQkJICB0YWJsZVtlbnRyeV0ubmFtZSk7CiAJCQlwcmludGVkX21hc2sgfD0gdGFibGVbZW50cnldLm1hc2s7CkBAIC03MTYzLDkgKzcxNTcsOSBAQAogCQkJYnJlYWs7CiAJfQogCWlmIChwcmludGVkX21hc2sgIT0gMCkKLQkJcHJpbnRlZCArPSBwcmludGYoIikgIik7CisJCXByaW50ZWQgKz0gcHJpbnRrKCIpICIpOwogCWVsc2UKLQkJcHJpbnRlZCArPSBwcmludGYoIiAiKTsKKwkJcHJpbnRlZCArPSBwcmludGsoIiAiKTsKIAlpZiAoY3VyX2NvbHVtbiAhPSBOVUxMKQogCQkqY3VyX2NvbHVtbiArPSBwcmludGVkOwogCXJldHVybiAocHJpbnRlZCk7CkBAIC03MTk3LDE2ICs3MTkxLDE2IEBACiAKIAlzYXZlZF9zY2JwdHIgPSBhaGNfaW5iKGFoYywgU0NCUFRSKTsKIAlsYXN0X3BoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7Ci0JcHJpbnRmKCI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gRHVtcCBDYXJkIFN0YXRlIEJlZ2lucyA8PDw8PDw8PDw8PDw8PDw8PFxuIgorCXByaW50aygiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+IER1bXAgQ2FyZCBTdGF0ZSBCZWdpbnMgPDw8PDw8PDw8PDw8PDw8PDxcbiIKIAkgICAgICAgIiVzOiBEdW1waW5nIENhcmQgU3RhdGUgJXMsIGF0IFNFUUFERFIgMHgleFxuIiwKIAkgICAgICAgYWhjX25hbWUoYWhjKSwgYWhjX2xvb2t1cF9waGFzZV9lbnRyeShsYXN0X3BoYXNlKS0+cGhhc2Vtc2csCiAJICAgICAgIGFoY19pbmIoYWhjLCBTRVFBRERSMCkgfCAoYWhjX2luYihhaGMsIFNFUUFERFIxKSA8PCA4KSk7CiAJaWYgKHBhdXNlZCkKLQkJcHJpbnRmKCJDYXJkIHdhcyBwYXVzZWRcbiIpOwotCXByaW50ZigiQUNDVU0gPSAweCV4LCBTSU5ERVggPSAweCV4LCBESU5ERVggPSAweCV4LCBBUkdfMiA9IDB4JXhcbiIsCisJCXByaW50aygiQ2FyZCB3YXMgcGF1c2VkXG4iKTsKKwlwcmludGsoIkFDQ1VNID0gMHgleCwgU0lOREVYID0gMHgleCwgRElOREVYID0gMHgleCwgQVJHXzIgPSAweCV4XG4iLAogCSAgICAgICBhaGNfaW5iKGFoYywgQUNDVU0pLCBhaGNfaW5iKGFoYywgU0lOREVYKSwgYWhjX2luYihhaGMsIERJTkRFWCksCiAJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMikpOwotCXByaW50ZigiSENOVCA9IDB4JXggU0NCUFRSID0gMHgleFxuIiwgYWhjX2luYihhaGMsIEhDTlQpLAorCXByaW50aygiSENOVCA9IDB4JXggU0NCUFRSID0gMHgleFxuIiwgYWhjX2luYihhaGMsIEhDTlQpLAogCSAgICAgICBhaGNfaW5iKGFoYywgU0NCUFRSKSk7CiAJY3VyX2NvbCA9IDA7CiAJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQpAQCAtNzIzMCwxNSArNzIyNCwxNSBAQAogCWFoY19kZmNudHJsX3ByaW50KGFoY19pbmIoYWhjLCBERkNOVFJMKSwgJmN1cl9jb2wsIDUwKTsKIAlhaGNfZGZzdGF0dXNfcHJpbnQoYWhjX2luYihhaGMsIERGU1RBVFVTKSwgJmN1cl9jb2wsIDUwKTsKIAlpZiAoY3VyX2NvbCAhPSAwKQotCQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJTVEFDSzoiKTsKKwkJcHJpbnRrKCJcbiIpOworCXByaW50aygiU1RBQ0s6Iik7CiAJZm9yIChpID0gMDsgaSA8IFNUQUNLX1NJWkU7IGkrKykKLQkgICAgICAgcHJpbnRmKCIgMHgleCIsIGFoY19pbmIoYWhjLCBTVEFDSyl8KGFoY19pbmIoYWhjLCBTVEFDSykgPDwgOCkpOwotCXByaW50ZigiXG5TQ0IgY291bnQgPSAlZFxuIiwgYWhjLT5zY2JfZGF0YS0+bnVtc2Nicyk7Ci0JcHJpbnRmKCJLZXJuZWwgTkVYVFFTQ0IgPSAlZFxuIiwgYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2ItPnRhZyk7Ci0JcHJpbnRmKCJDYXJkIE5FWFRRU0NCID0gJWRcbiIsIGFoY19pbmIoYWhjLCBORVhUX1FVRVVFRF9TQ0IpKTsKKwkJcHJpbnRrKCIgMHgleCIsIGFoY19pbmIoYWhjLCBTVEFDSyl8KGFoY19pbmIoYWhjLCBTVEFDSykgPDwgOCkpOworCXByaW50aygiXG5TQ0IgY291bnQgPSAlZFxuIiwgYWhjLT5zY2JfZGF0YS0+bnVtc2Nicyk7CisJcHJpbnRrKCJLZXJuZWwgTkVYVFFTQ0IgPSAlZFxuIiwgYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2ItPnRhZyk7CisJcHJpbnRrKCJDYXJkIE5FWFRRU0NCID0gJWRcbiIsIGFoY19pbmIoYWhjLCBORVhUX1FVRVVFRF9TQ0IpKTsKIAkvKiBRSU5GSUZPICovCi0JcHJpbnRmKCJRSU5GSUZPIGVudHJpZXM6ICIpOworCXByaW50aygiUUlORklGTyBlbnRyaWVzOiAiKTsKIAlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCkgewogCQlxaW5wb3MgPSBhaGNfaW5iKGFoYywgU05TQ0JfUU9GRik7CiAJCWFoY19vdXRiKGFoYywgU05TQ0JfUU9GRiwgcWlucG9zKTsKQEAgLTcyNDYsMTA5ICs3MjQwLDEwOSBAQAogCQlxaW5wb3MgPSBhaGNfaW5iKGFoYywgUUlOUE9TKTsKIAlxaW50YWlsID0gYWhjLT5xaW5maWZvbmV4dDsKIAl3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpIHsKLQkJcHJpbnRmKCIlZCAiLCBhaGMtPnFpbmZpZm9bcWlucG9zXSk7CisJCXByaW50aygiJWQgIiwgYWhjLT5xaW5maWZvW3FpbnBvc10pOwogCQlxaW5wb3MrKzsKIAl9Ci0JcHJpbnRmKCJcbiIpOworCXByaW50aygiXG4iKTsKIAotCXByaW50ZigiV2FpdGluZyBRdWV1ZSBlbnRyaWVzOiAiKTsKKwlwcmludGsoIldhaXRpbmcgUXVldWUgZW50cmllczogIik7CiAJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFdBSVRJTkdfU0NCSCk7CiAJaSA9IDA7CiAJd2hpbGUgKHNjYl9pbmRleCAhPSBTQ0JfTElTVF9OVUxMICYmIGkrKyA8IDI1NikgewogCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NiX2luZGV4KTsKLQkJcHJpbnRmKCIlZDolZCAiLCBzY2JfaW5kZXgsIGFoY19pbmIoYWhjLCBTQ0JfVEFHKSk7CisJCXByaW50aygiJWQ6JWQgIiwgc2NiX2luZGV4LCBhaGNfaW5iKGFoYywgU0NCX1RBRykpOwogCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX05FWFQpOwogCX0KLQlwcmludGYoIlxuIik7CisJcHJpbnRrKCJcbiIpOwogCi0JcHJpbnRmKCJEaXNjb25uZWN0ZWQgUXVldWUgZW50cmllczogIik7CisJcHJpbnRrKCJEaXNjb25uZWN0ZWQgUXVldWUgZW50cmllczogIik7CiAJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKIAlpID0gMDsKIAl3aGlsZSAoc2NiX2luZGV4ICE9IFNDQl9MSVNUX05VTEwgJiYgaSsrIDwgMjU2KSB7CiAJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzY2JfaW5kZXgpOwotCQlwcmludGYoIiVkOiVkICIsIHNjYl9pbmRleCwgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJcHJpbnRrKCIlZDolZCAiLCBzY2JfaW5kZXgsIGFoY19pbmIoYWhjLCBTQ0JfVEFHKSk7CiAJCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfTkVYVCk7CiAJfQotCXByaW50ZigiXG4iKTsKKwlwcmludGsoIlxuIik7CiAJCQogCWFoY19zeW5jX3FvdXRmaWZvKGFoYywgQlVTX0RNQVNZTkNfUE9TVFJFQUQpOwotCXByaW50ZigiUU9VVEZJRk8gZW50cmllczogIik7CisJcHJpbnRrKCJRT1VURklGTyBlbnRyaWVzOiAiKTsKIAlxb3V0cG9zID0gYWhjLT5xb3V0Zmlmb25leHQ7CiAJaSA9IDA7CiAJd2hpbGUgKGFoYy0+cW91dGZpZm9bcW91dHBvc10gIT0gU0NCX0xJU1RfTlVMTCAmJiBpKysgPCAyNTYpIHsKLQkJcHJpbnRmKCIlZCAiLCBhaGMtPnFvdXRmaWZvW3FvdXRwb3NdKTsKKwkJcHJpbnRrKCIlZCAiLCBhaGMtPnFvdXRmaWZvW3FvdXRwb3NdKTsKIAkJcW91dHBvcysrOwogCX0KLQlwcmludGYoIlxuIik7CisJcHJpbnRrKCJcbiIpOwogCi0JcHJpbnRmKCJTZXF1ZW5jZXIgRnJlZSBTQ0IgTGlzdDogIik7CisJcHJpbnRrKCJTZXF1ZW5jZXIgRnJlZSBTQ0IgTGlzdDogIik7CiAJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIEZSRUVfU0NCSCk7CiAJaSA9IDA7CiAJd2hpbGUgKHNjYl9pbmRleCAhPSBTQ0JfTElTVF9OVUxMICYmIGkrKyA8IDI1NikgewogCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NiX2luZGV4KTsKLQkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlwcmludGsoIiVkICIsIHNjYl9pbmRleCk7CiAJCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfTkVYVCk7CiAJfQotCXByaW50ZigiXG4iKTsKKwlwcmludGsoIlxuIik7CiAKLQlwcmludGYoIlNlcXVlbmNlciBTQ0IgSW5mbzogIik7CisJcHJpbnRrKCJTZXF1ZW5jZXIgU0NCIEluZm86ICIpOwogCWZvciAoaSA9IDA7IGkgPCBhaGMtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKSB7CiAJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBpKTsKLQkJY3VyX2NvbCA9IHByaW50ZigiXG4lM2QgIiwgaSk7CisJCWN1cl9jb2wgID0gcHJpbnRrKCJcbiUzZCAiLCBpKTsKIAogCQlhaGNfc2NiX2NvbnRyb2xfcHJpbnQoYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSwgJmN1cl9jb2wsIDYwKTsKIAkJYWhjX3NjYl9zY3NpaWRfcHJpbnQoYWhjX2luYihhaGMsIFNDQl9TQ1NJSUQpLCAmY3VyX2NvbCwgNjApOwogCQlhaGNfc2NiX2x1bl9wcmludChhaGNfaW5iKGFoYywgU0NCX0xVTiksICZjdXJfY29sLCA2MCk7CiAJCWFoY19zY2JfdGFnX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfVEFHKSwgJmN1cl9jb2wsIDYwKTsKIAl9Ci0JcHJpbnRmKCJcbiIpOworCXByaW50aygiXG4iKTsKIAotCXByaW50ZigiUGVuZGluZyBsaXN0OiAiKTsKKwlwcmludGsoIlBlbmRpbmcgbGlzdDogIik7CiAJaSA9IDA7CiAJTElTVF9GT1JFQUNIKHNjYiwgJmFoYy0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CiAJCWlmIChpKysgPiAyNTYpCiAJCQlicmVhazsKLQkJY3VyX2NvbCA9IHByaW50ZigiXG4lM2QgIiwgc2NiLT5oc2NiLT50YWcpOworCQljdXJfY29sICA9IHByaW50aygiXG4lM2QgIiwgc2NiLT5oc2NiLT50YWcpOwogCQlhaGNfc2NiX2NvbnRyb2xfcHJpbnQoc2NiLT5oc2NiLT5jb250cm9sLCAmY3VyX2NvbCwgNjApOwogCQlhaGNfc2NiX3Njc2lpZF9wcmludChzY2ItPmhzY2ItPnNjc2lpZCwgJmN1cl9jb2wsIDYwKTsKIAkJYWhjX3NjYl9sdW5fcHJpbnQoc2NiLT5oc2NiLT5sdW4sICZjdXJfY29sLCA2MCk7CiAJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgPT0gMCkgewogCQkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNjYi0+aHNjYi0+dGFnKTsKLQkJCXByaW50ZigiKCIpOworCQkJcHJpbnRrKCIoIik7CiAJCQlhaGNfc2NiX2NvbnRyb2xfcHJpbnQoYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSwKIAkJCQkJICAgICAgJmN1cl9jb2wsIDYwKTsKIAkJCWFoY19zY2JfdGFnX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfVEFHKSwgJmN1cl9jb2wsIDYwKTsKLQkJCXByaW50ZigiKSIpOworCQkJcHJpbnRrKCIpIik7CiAJCX0KIAl9Ci0JcHJpbnRmKCJcbiIpOworCXByaW50aygiXG4iKTsKIAotCXByaW50ZigiS2VybmVsIEZyZWUgU0NCIGxpc3Q6ICIpOworCXByaW50aygiS2VybmVsIEZyZWUgU0NCIGxpc3Q6ICIpOwogCWkgPSAwOwogCVNMSVNUX0ZPUkVBQ0goc2NiLCAmYWhjLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBsaW5rcy5zbGUpIHsKIAkJaWYgKGkrKyA+IDI1NikKIAkJCWJyZWFrOwotCQlwcmludGYoIiVkICIsIHNjYi0+aHNjYi0+dGFnKTsKKwkJcHJpbnRrKCIlZCAiLCBzY2ItPmhzY2ItPnRhZyk7CiAJfQotCXByaW50ZigiXG4iKTsKKwlwcmludGsoIlxuIik7CiAKIAltYXh0YXJnZXQgPSAoYWhjLT5mZWF0dXJlcyAmIChBSENfV0lERXxBSENfVFdJTikpID8gMTUgOiA3OwogCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDw9IG1heHRhcmdldDsgdGFyZ2V0KyspIHsKIAkJdW50YWdnZWRfcSA9ICZhaGMtPnVudGFnZ2VkX3F1ZXVlc1t0YXJnZXRdOwogCQlpZiAoVEFJTFFfRklSU1QodW50YWdnZWRfcSkgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwotCQlwcmludGYoIlVudGFnZ2VkIFEoJWQpOiAiLCB0YXJnZXQpOworCQlwcmludGsoIlVudGFnZ2VkIFEoJWQpOiAiLCB0YXJnZXQpOwogCQlpID0gMDsKIAkJVEFJTFFfRk9SRUFDSChzY2IsIHVudGFnZ2VkX3EsIGxpbmtzLnRxZSkgewogCQkJaWYgKGkrKyA+IDI1NikKIAkJCQlicmVhazsKLQkJCXByaW50ZigiJWQgIiwgc2NiLT5oc2NiLT50YWcpOworCQkJcHJpbnRrKCIlZCAiLCBzY2ItPmhzY2ItPnRhZyk7CiAJCX0KLQkJcHJpbnRmKCJcbiIpOworCQlwcmludGsoIlxuIik7CiAJfQogCiAJYWhjX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShhaGMpOwotCXByaW50ZigiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOworCXByaW50aygiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOwogCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOwogCWlmIChwYXVzZWQgPT0gMCkKIAkJYWhjX3VucGF1c2UoYWhjKTsKQEAgLTc0ODksNyArNzQ4Myw3IEBACiAJCXVfbG9uZwkgczsKIAkJYWhjX2ZsYWcgc2F2ZWRfZmxhZ3M7CiAKLQkJcHJpbnRmKCJDb25maWd1cmluZyBUYXJnZXQgTW9kZVxuIik7CisJCXByaW50aygiQ29uZmlndXJpbmcgVGFyZ2V0IE1vZGVcbiIpOwogCQlhaGNfbG9jayhhaGMsICZzKTsKIAkJaWYgKExJU1RfRklSU1QoJmFoYy0+cGVuZGluZ19zY2JzKSAhPSBOVUxMKSB7CiAJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9CVVNZOwpAQCAtNzUzNSw3ICs3NTI5LDcgQEAKIAkJLyogQXJlIHdlIGFscmVhZHkgZW5hYmxlZD8/ICovCiAJCWlmIChsc3RhdGUgIT0gTlVMTCkgewogCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJCXByaW50ZigiTHVuIGFscmVhZHkgZW5hYmxlZFxuIik7CisJCQlwcmludGsoIkx1biBhbHJlYWR5IGVuYWJsZWRcbiIpOwogCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0FMUkRZX0VOQTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNzU0Nyw3ICs3NTQxLDcgQEAKIAkJCSAqIHNwZWNpZmljIGNvbW1hbmRzLgogCQkJICovCiAJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKLQkJCXByaW50ZigiTm9uLXplcm8gR3JvdXAgQ29kZXNcbiIpOworCQkJcHJpbnRrKCJOb24temVybyBHcm91cCBDb2Rlc1xuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzU1OSwxNSArNzU1MywxNSBAQAogCQkJdHN0YXRlID0gYWhjX2FsbG9jX3RzdGF0ZShhaGMsIHRhcmdldCwgY2hhbm5lbCk7CiAJCQlpZiAodHN0YXRlID09IE5VTEwpIHsKIAkJCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOwotCQkJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgdHN0YXRlXG4iKTsKKwkJCQlwcmludGsoIkNvdWxkbid0IGFsbG9jYXRlIHRzdGF0ZVxuIik7CiAJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KLQkJbHN0YXRlID0gbWFsbG9jKHNpemVvZigqbHN0YXRlKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJbHN0YXRlID0ga21hbGxvYyhzaXplb2YoKmxzdGF0ZSksIEdGUF9BVE9NSUMpOwogCQlpZiAobHN0YXRlID09IE5VTEwpIHsKIAkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7Ci0JCQlwcmludGYoIkNvdWxkbid0IGFsbG9jYXRlIGxzdGF0ZVxuIik7CisJCQlwcmludGsoIkNvdWxkbid0IGFsbG9jYXRlIGxzdGF0ZVxuIik7CiAJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVNSQ19VTkFWQUlMOwogCQkJcmV0dXJuOwogCQl9CkBAIC03NTc3LDkgKzc1NzEsOSBAQAogCQkJCQkgeHB0X3BhdGhfdGFyZ2V0X2lkKGNjYi0+Y2NiX2gucGF0aCksCiAJCQkJCSB4cHRfcGF0aF9sdW5faWQoY2NiLT5jY2JfaC5wYXRoKSk7CiAJCWlmIChzdGF0dXMgIT0gQ0FNX1JFUV9DTVApIHsKLQkJCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCQlrZnJlZShsc3RhdGUpOwogCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgcGF0aFxuIik7CisJCQlwcmludGsoIkNvdWxkbid0IGFsbG9jYXRlIHBhdGhcbiIpOwogCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKIAkJCXJldHVybjsKIAkJfQpAQCAtNzY1NCw3ICs3NjQ4LDcgQEAKIAkJYWhjX3VubG9jayhhaGMsICZzKTsKIAkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0NNUDsKIAkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJcHJpbnRmKCJMdW4gbm93IGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlXG4iKTsKKwkJcHJpbnRrKCJMdW4gbm93IGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlXG4iKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc2NiICpzY2I7CiAJCWludCBpLCBlbXB0eTsKQEAgLTc2NzMsNyArNzY2Nyw3IEBACiAJCQljY2JoID0gJnNjYi0+aW9fY3R4LT5jY2JfaDsKIAkJCWlmIChjY2JoLT5mdW5jX2NvZGUgPT0gWFBUX0NPTlRfVEFSR0VUX0lPCiAJCQkgJiYgIXhwdF9wYXRoX2NvbXAoY2NiaC0+cGF0aCwgY2NiLT5jY2JfaC5wYXRoKSl7Ci0JCQkJcHJpbnRmKCJDVElPIHBlbmRpbmdcbiIpOworCQkJCXByaW50aygiQ1RJTyBwZW5kaW5nXG4iKTsKIAkJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKIAkJCQlhaGNfdW5sb2NrKGFoYywgJnMpOwogCQkJCXJldHVybjsKQEAgLTc2ODEsMTIgKzc2NzUsMTIgQEAKIAkJfQogCiAJCWlmIChTTElTVF9GSVJTVCgmbHN0YXRlLT5hY2NlcHRfdGlvcykgIT0gTlVMTCkgewotCQkJcHJpbnRmKCJBVElPcyBwZW5kaW5nXG4iKTsKKwkJCXByaW50aygiQVRJT3MgcGVuZGluZ1xuIik7CiAJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKIAkJfQogCiAJCWlmIChTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykgIT0gTlVMTCkgewotCQkJcHJpbnRmKCJJTk9UcyBwZW5kaW5nXG4iKTsKKwkJCXByaW50aygiSU5PVHMgcGVuZGluZ1xuIik7CiAJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKIAkJfQogCkBAIC03Njk2LDkgKzc2OTAsOSBAQAogCQl9CiAKIAkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKLQkJcHJpbnRmKCJUYXJnZXQgbW9kZSBkaXNhYmxlZFxuIik7CisJCXByaW50aygiVGFyZ2V0IG1vZGUgZGlzYWJsZWRcbiIpOwogCQl4cHRfZnJlZV9wYXRoKGxzdGF0ZS0+cGF0aCk7Ci0JCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCWtmcmVlKGxzdGF0ZSk7CiAKIAkJYWhjX3BhdXNlKGFoYyk7CiAJCS8qIENhbiB3ZSBjbGVhbiB1cCB0aGUgdGFyZ2V0IHRvbz8gKi8KQEAgLTc3NTAsNyArNzc0NCw3IEBACiAJCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsIHNjc2lzZXEpOwogCiAJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElST0xFKSA9PSAwKSB7Ci0JCQkJcHJpbnRmKCJDb25maWd1cmluZyBJbml0aWF0b3IgTW9kZVxuIik7CisJCQkJcHJpbnRrKCJDb25maWd1cmluZyBJbml0aWF0b3IgTW9kZVxuIik7CiAJCQkJYWhjLT5mbGFncyAmPSB+QUhDX1RBUkdFVFJPTEU7CiAJCQkJYWhjLT5mbGFncyB8PSBBSENfSU5JVElBVE9SUk9MRTsKIAkJCQkvKgpAQCAtNzg5NywxMiArNzg5MSwxMiBAQAogCQkgKiBXYWl0IGZvciBtb3JlIEFUSU9zIGZyb20gdGhlIHBlcmlwaGVyYWwgZHJpdmVyIGZvciB0aGlzIGx1bi4KIAkJICovCiAJCWlmIChib290dmVyYm9zZSkKLQkJCXByaW50ZigiJXM6IEFUSU9zIGV4aGF1c3RlZFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQlwcmludGsoIiVzOiBBVElPcyBleGhhdXN0ZWRcbiIsIGFoY19uYW1lKGFoYykpOwogCQlyZXR1cm4gKDEpOwogCX0gZWxzZQogCQlhaGMtPmZsYWdzICY9IH5BSENfVFFJTkZJRk9fQkxPQ0tFRDsKICNpZiAwCi0JcHJpbnRmKCJJbmNvbWluZyBjb21tYW5kIGZyb20gJWQgZm9yICVkOiVkJXNcbiIsCisJcHJpbnRrKCJJbmNvbWluZyBjb21tYW5kIGZyb20gJWQgZm9yICVkOiVkJXNcbiIsCiAJICAgICAgIGluaXRpYXRvciwgdGFyZ2V0LCBsdW4sCiAJICAgICAgIGxzdGF0ZSA9PSBhaGMtPmJsYWNrX2hvbGUgPyAiKEJsYWNrIEhvbGVkKSIgOiAiIik7CiAjZW5kaWYKQEAgLTc5NDksNyArNzk0Myw3IEBACiAJZGVmYXVsdDoKIAkJLyogT25seSBjb3B5IHRoZSBvcGNvZGUuICovCiAJCWF0aW8tPmNkYl9sZW4gPSAxOwotCQlwcmludGYoIlJlc2VydmVkIG9yIFZVIGNvbW1hbmQgY29kZSB0eXBlIGVuY291bnRlcmVkXG4iKTsKKwkJcHJpbnRrKCJSZXNlcnZlZCBvciBWVSBjb21tYW5kIGNvZGUgdHlwZSBlbmNvdW50ZXJlZFxuIik7CiAJCWJyZWFrOwogCX0KIAkKQEAgLTc5NjUsNyArNzk1OSw3IEBACiAJCSAqIHRvIHRoaXMgYWNjZXB0IHRpby4KIAkJICovCiAjaWYgMAotCQlwcmludGYoIlJlY2VpdmVkIEltbWVkaWF0ZSBDb21tYW5kICVkOiVkOiVkIC0gJXBcbiIsCisJCXByaW50aygiUmVjZWl2ZWQgSW1tZWRpYXRlIENvbW1hbmQgJWQ6JWQ6JWQgLSAlcFxuIiwKIAkJICAgICAgIGluaXRpYXRvciwgdGFyZ2V0LCBsdW4sIGFoYy0+cGVuZGluZ19kZXZpY2UpOwogI2VuZGlmCiAJCWFoYy0+cGVuZGluZ19kZXZpY2UgPSBsc3RhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwppbmRleCA1ZTQyZGFjLi5hZWVhN2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTY1Myw3ICs2NTMsNyBAQAogCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7CiAKIAlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IFNsYXZlIEFsbG9jICVkXG4iLCBhaGNfbmFtZShhaGMpLCBzZGV2LT5pZCk7CisJCXByaW50aygiJXM6IFNsYXZlIEFsbG9jICVkXG4iLCBhaGNfbmFtZShhaGMpLCBzZGV2LT5pZCk7CiAKIAlkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKIAltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwpAQCAtNzU1LDcgKzc1NSw3IEBACiAKIAllcnJvciA9IGFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoY21kLCBTQ0JfQUJPUlQpOwogCWlmIChlcnJvciAhPSAwKQotCQlwcmludGYoImFpYzd4eHhfYWJvcnQgcmV0dXJucyAweCV4XG4iLCBlcnJvcik7CisJCXByaW50aygiYWljN3h4eF9hYm9ydCByZXR1cm5zIDB4JXhcbiIsIGVycm9yKTsKIAlyZXR1cm4gKGVycm9yKTsKIH0KIApAQCAtNzY5LDcgKzc2OSw3IEBACiAKIAllcnJvciA9IGFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoY21kLCBTQ0JfREVWSUNFX1JFU0VUKTsKIAlpZiAoZXJyb3IgIT0gMCkKLQkJcHJpbnRmKCJhaWM3eHh4X2Rldl9yZXNldCByZXR1cm5zIDB4JXhcbiIsIGVycm9yKTsKKwkJcHJpbnRrKCJhaWM3eHh4X2Rldl9yZXNldCByZXR1cm5zIDB4JXhcbiIsIGVycm9yKTsKIAlyZXR1cm4gKGVycm9yKTsKIH0KIApAQCAtNzkxLDcgKzc5MSw3IEBACiAJYWhjX3VubG9jayhhaGMsICZmbGFncyk7CiAKIAlpZiAoYm9vdHZlcmJvc2UpCi0JCXByaW50ZigiJXM6IFNDU0kgYnVzIHJlc2V0IGRlbGl2ZXJlZC4gIgorCQlwcmludGsoIiVzOiBTQ1NJIGJ1cyByZXNldCBkZWxpdmVyZWQuICIKIAkJICAgICAgICIlZCBTQ0JzIGFib3J0ZWQuXG4iLCBhaGNfbmFtZShhaGMpLCBmb3VuZCk7CiAKIAlyZXR1cm4gU1VDQ0VTUzsKQEAgLTg0MCw3ICs4NDAsNyBAQAogewogCWJ1c19kbWFfdGFnX3QgZG1hdDsKIAotCWRtYXQgPSBtYWxsb2Moc2l6ZW9mKCpkbWF0KSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlkbWF0ID0ga21hbGxvYyhzaXplb2YoKmRtYXQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoZG1hdCA9PSBOVUxMKQogCQlyZXR1cm4gKEVOT01FTSk7CiAKQEAgLTg2MSw3ICs4NjEsNyBAQAogdm9pZAogYWhjX2RtYV90YWdfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCkKIHsKLQlmcmVlKGRtYXQsIE1fREVWQlVGKTsKKwlrZnJlZShkbWF0KTsKIH0KIAogaW50CkBAIC05MTgsNyArOTE4LDcgQEAKIAlpbnQgdGFncywgaSwgajsKIAogCXRhZ3MgPSBzaW1wbGVfc3RydG91bChwICsgMSwgTlVMTCwgMCkgJiAweGZmOwotCXByaW50ZigiU2V0dGluZyBHbG9iYWwgVGFncz0gJWRcbiIsIHRhZ3MpOworCXByaW50aygiU2V0dGluZyBHbG9iYWwgVGFncz0gJWRcbiIsIHRhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljN3h4eF90YWdfaW5mbyk7IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgQUhDX05VTV9UQVJHRVRTOyBqKyspIHsKQEAgLTkzNiw3ICs5MzYsNyBAQAogCSAmJiAodGFyZyA8IEFIQ19OVU1fVEFSR0VUUykpIHsKIAkJYWljN3h4eF90YWdfaW5mb1tpbnN0YW5jZV0udGFnX2NvbW1hbmRzW3RhcmddID0gdmFsdWUgJiAweGZmOwogCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOworCQkJcHJpbnRrKCJ0YWdfaW5mb1slZDolZF0gPSAlZFxuIiwgaW5zdGFuY2UsIHRhcmcsIHZhbHVlKTsKIAl9CiB9CiAKQEAgLTk3Nyw3ICs5NzcsNyBAQAogCQkJCQlpZiAodGFyZyA9PSAtMSkKIAkJCQkJCXRhcmcgPSAwOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ZigiTWFsZm9ybWVkIE9wdGlvbiAlc1xuIiwKKwkJCQkJcHJpbnRrKCJNYWxmb3JtZWQgT3B0aW9uICVzXG4iLAogCQkJCQkgICAgICAgb3B0X25hbWUpOwogCQkJCQlkb25lID0gVFJVRTsKIAkJCQl9CkBAIC0xMTIwLDcgKzExMjAsNyBAQAogCWFoY19zZXRfdW5pdChhaGMsIGFoY19saW51eF91bml0KyspOwogCWFoY191bmxvY2soYWhjLCAmcyk7CiAJc3ByaW50ZihidWYsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKLQluZXdfbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJbmV3X25hbWUgPSBrbWFsbG9jKHN0cmxlbihidWYpICsgMSwgR0ZQX0FUT01JQyk7CiAJaWYgKG5ld19uYW1lICE9IE5VTEwpIHsKIAkJc3RyY3B5KG5ld19uYW1lLCBidWYpOwogCQlhaGNfc2V0X25hbWUoYWhjLCBuZXdfbmFtZSk7CkBAIC0xMjIwLDcgKzEyMjAsNyBAQAogewogCiAJYWhjLT5wbGF0Zm9ybV9kYXRhID0KLQkgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhjX3BsYXRmb3JtX2RhdGEpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhjX3BsYXRmb3JtX2RhdGEpLCBHRlBfQVRPTUlDKTsKIAlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCiAJCXJldHVybiAoRU5PTUVNKTsKIAltZW1zZXQoYWhjLT5wbGF0Zm9ybV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFoY19wbGF0Zm9ybV9kYXRhKSk7CkBAIC0xMjY0LDcgKzEyNjQsNyBAQAogCQlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KQogCQkJc2NzaV9ob3N0X3B1dChhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOwogCi0JCWZyZWUoYWhjLT5wbGF0Zm9ybV9kYXRhLCBNX0RFVkJVRik7CisJCWtmcmVlKGFoYy0+cGxhdGZvcm1fZGF0YSk7CiAJfQogfQogCkBAIC0xMzc4LDcgKzEzNzgsNyBAQAogCQlpZiAoYWhjLT51bml0ID49IEFSUkFZX1NJWkUoYWljN3h4eF90YWdfaW5mbykpIHsKIAkJCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7CiAKLQkJCQlwcmludGYoS0VSTl9XQVJOSU5HCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogImFpYzd4eHg6IFdBUk5JTkc6IEluc3VmZmljaWVudCB0YWdfaW5mbyBpbnN0YW5jZXNcbiIKICJhaWM3eHh4OiBmb3IgaW5zdGFsbGVkIGNvbnRyb2xsZXJzLiBVc2luZyBkZWZhdWx0c1xuIgogImFpYzd4eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzd4eHhfdGFnX2luZm8gYXJyYXkgaW5cbiIKQEAgLTE0MjEsNyArMTQyMSw3IEBACiAJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKIAkJCSAgICAgICBkZXZpbmZvLmx1biwgQUNfVFJBTlNGRVJfTkVHKTsKIAkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7Ci0JCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKKwkJcHJpbnRrKCJUYWdnZWQgUXVldWluZyBlbmFibGVkLiAgRGVwdGggJWRcbiIsIHRhZ3MpOwogCX0gZWxzZSB7CiAJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsIHNkZXYsICZkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CiAJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKQEAgLTE3MzUsNyArMTczNSw3IEBACiAJCSAqIG5vdCBoYXZlIGJlZW4gZGlzcGF0Y2hlZCB0byB0aGUgY29udHJvbGxlciwgc28KIAkJICogb25seSBjaGVjayB0aGUgU0NCX0FDVElWRSBmbGFnIGZvciB0YWdnZWQgdHJhbnNhY3Rpb25zLgogCQkgKi8KLQkJcHJpbnRmKCJTQ0IgJWQgZG9uZSdkIHR3aWNlXG4iLCBzY2ItPmhzY2ItPnRhZyk7CisJCXByaW50aygiU0NCICVkIGRvbmUnZCB0d2ljZVxuIiwgc2NiLT5oc2NiLT50YWcpOwogCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CiAJCXBhbmljKCJTdG9wcGluZyBmb3Igc2FmZXR5Iik7CiAJfQpAQCAtMTc2NSw3ICsxNzY1LDcgQEAKICNpZmRlZiBBSENfREVCVUcKIAkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUlTQykgIT0gMCkgewogCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKLQkJCQlwcmludGYoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKKwkJCQlwcmludGsoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKIAkJCX0KICNlbmRpZgogCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKQEAgLTE3ODMsMTIgKzE3ODMsMTIgQEAKIAkJCXVfaW50IGk7CiAKIAkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKLQkJCXByaW50ZigiQ0RCOiIpOworCQkJcHJpbnRrKCJDREI6Iik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5pb19jdHgtPmNtZF9sZW47IGkrKykKLQkJCQlwcmludGYoIiAweCV4Iiwgc2NiLT5pb19jdHgtPmNtbmRbaV0pOwotCQkJcHJpbnRmKCJcbiIpOworCQkJCXByaW50aygiIDB4JXgiLCBzY2ItPmlvX2N0eC0+Y21uZFtpXSk7CisJCQlwcmludGsoIlxuIik7CiAJCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7Ci0JCQlwcmludGYoIlNhdyB1bmRlcmZsb3cgKCVsZCBvZiAlbGQgYnl0ZXMpLiAiCisJCQlwcmludGsoIlNhdyB1bmRlcmZsb3cgKCVsZCBvZiAlbGQgYnl0ZXMpLiAiCiAJCQkgICAgICAgIlRyZWF0ZWQgYXMgZXJyb3JcbiIsCiAJCQkJYWhjX2dldF9yZXNpZHVhbChzY2IpLAogCQkJCWFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikpOwpAQCAtMTgyMSw3ICsxODIxLDcgQEAKIAkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOwogCiAJaWYgKChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkgewotCQlwcmludGYoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOworCQlwcmludGsoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOwogCQlpZiAoYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fQkRSX1NFTlQKIAkJIHx8IGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9BQk9SVEVEKQogCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOwpAQCAtMTg4NiwxNCArMTg4NiwxNCBAQAogCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX1NFTlNFKSB7CiAJCQkJaW50IGk7CiAKLQkJCQlwcmludGYoIkNvcGllZCAlZCBieXRlcyBvZiBzZW5zZSBkYXRhOiIsCisJCQkJcHJpbnRrKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YToiLAogCQkJCSAgICAgICBzZW5zZV9zaXplKTsKIAkJCQlmb3IgKGkgPSAwOyBpIDwgc2Vuc2Vfc2l6ZTsgaSsrKSB7CiAJCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKLQkJCQkJCXByaW50ZigiXG4iKTsKLQkJCQkJcHJpbnRmKCIweCV4ICIsIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKKwkJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJcHJpbnRrKCIweCV4ICIsIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKIAkJCQl9Ci0JCQkJcHJpbnRmKCJcbiIpOworCQkJCXByaW50aygiXG4iKTsKIAkJCX0KICNlbmRpZgogCQl9CkBAIC0xOTE4LDcgKzE5MTgsNyBAQAogCQkJZGV2LT5vcGVuaW5ncyA9IDA7CiAvKgogCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwotCQkJcHJpbnRmKCJEcm9wcGluZyB0YWcgY291bnQgdG8gJWRcbiIsIGRldi0+YWN0aXZlKTsKKwkJCXByaW50aygiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLCBkZXYtPmFjdGl2ZSk7CiAgKi8KIAkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKIApAQCAtMTkzNSw3ICsxOTM1LDcgQEAKIAkJCQkgPT0gQUhDX0xPQ0tfVEFHU19DT1VOVCkgewogCQkJCQlkZXYtPm1heHRhZ3MgPSBkZXYtPmFjdGl2ZTsKIAkJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOwotCQkJCQlwcmludGYoIkxvY2tpbmcgbWF4IHRhZyBjb3VudCBhdCAlZFxuIiwKKwkJCQkJcHJpbnRrKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCiAJCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTIxMDAsMTAgKzIxMDAsMTAgQEAKIAlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIkF0dGVtcHRpbmcgdG8gcXVldWUgYSVzIG1lc3NhZ2VcbiIsCiAJICAgICAgIGZsYWcgPT0gU0NCX0FCT1JUID8gIm4gQUJPUlQiIDogIiBUQVJHRVQgUkVTRVQiKTsKIAotCXByaW50ZigiQ0RCOiIpOworCXByaW50aygiQ0RCOiIpOwogCWZvciAoY2RiX2J5dGUgPSAwOyBjZGJfYnl0ZSA8IGNtZC0+Y21kX2xlbjsgY2RiX2J5dGUrKykKLQkJcHJpbnRmKCIgMHgleCIsIGNtZC0+Y21uZFtjZGJfYnl0ZV0pOwotCXByaW50ZigiXG4iKTsKKwkJcHJpbnRrKCIgMHgleCIsIGNtZC0+Y21uZFtjZGJfYnl0ZV0pOworCXByaW50aygiXG4iKTsKIAogCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKIApAQCAtMjEyMSw3ICsyMTIxLDcgQEAKIAkJICogTm8gdGFyZ2V0IGRldmljZSBmb3IgdGhpcyBjb21tYW5kIGV4aXN0cywKIAkJICogc28gd2UgbXVzdCBub3Qgc3RpbGwgb3duIHRoZSBjb21tYW5kLgogCQkgKi8KLQkJcHJpbnRmKCIlczolZDolZDolZDogSXMgbm90IGFuIGFjdGl2ZSBkZXZpY2VcbiIsCisJCXByaW50aygiJXM6JWQ6JWQ6JWQ6IElzIG5vdCBhbiBhY3RpdmUgZGV2aWNlXG4iLAogCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKIAkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOwogCQlyZXR2YWwgPSBTVUNDRVNTOwpAQCAtMjEzMyw3ICsyMTMzLDcgQEAKIAkJCQkgICAgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCiAJCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4sCiAJCQkJICAgICAgIENBTV9SRVFfQUJPUlRFRCwgU0VBUkNIX0NPTVBMRVRFKSAhPSAwKSB7Ci0JCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgZm91bmQgb24gdW50YWdnZWQgcXVldWVcbiIsCisJCXByaW50aygiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgZm91bmQgb24gdW50YWdnZWQgcXVldWVcbiIsCiAJCSAgICAgICBhaGNfbmFtZShhaGMpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAogCQkgICAgICAgY21kLT5kZXZpY2UtPmx1bik7CiAJCXJldHZhbCA9IFNVQ0NFU1M7CkBAIC0yMTg3LDcgKzIxODcsNyBAQAogCQlnb3RvIG5vX2NtZDsKIAl9CiAKLQlwcmludGYoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKKwlwcmludGsoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKIAkgICAgICAgYWhjX25hbWUoYWhjKSwgd2FzX3BhdXNlZCA/ICIiIDogIm5vdCAiKTsKIAlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CiAKQEAgLTIxOTksNyArMjE5OSw3IEBACiAJCQkJICAgICAgIHBlbmRpbmdfc2NiLT5oc2NiLT50YWcsCiAJCQkJICAgICAgIFJPTEVfSU5JVElBVE9SLCBDQU1fUkVRX0FCT1JURUQsCiAJCQkJICAgICAgIFNFQVJDSF9DT01QTEVURSkgPiAwKSB7Ci0JCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDbWQgYWJvcnRlZCBmcm9tIFFJTkZJRk9cbiIsCisJCQlwcmludGsoIiVzOiVkOiVkOiVkOiBDbWQgYWJvcnRlZCBmcm9tIFFJTkZJRk9cbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCiAJCQkJCWNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CiAJCQlyZXR2YWwgPSBTVUNDRVNTOwpAQCAtMjMxMyw3ICsyMzEzLDcgQEAKIAkJYWhjX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoYywgcGVuZGluZ19zY2IpOwogCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2F2ZWRfc2NicHRyKTsKIAkJYWhjX3ByaW50X3BhdGgoYWhjLCBwZW5kaW5nX3NjYik7Ci0JCXByaW50ZigiRGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgcmUtcXVldWluZyBTQ0JcbiIpOworCQlwcmludGsoIkRldmljZSBpcyBkaXNjb25uZWN0ZWQsIHJlLXF1ZXVpbmcgU0NCXG4iKTsKIAkJd2FpdCA9IFRSVUU7CiAJfSBlbHNlIHsKIAkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbWQsICJVbmFibGUgdG8gZGVsaXZlciBtZXNzYWdlXG4iKTsKQEAgLTIzMzgsMTYgKzIzMzgsMTYgQEAKIAkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9kb25lID0gJmRvbmU7CiAJCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOwogCi0JCXByaW50ZigiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CisJCXByaW50aygiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CiAJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkb25lLCA1ICogSFopKSB7CiAJCQlhaGNfbG9jayhhaGMsICZmbGFncyk7CiAJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmVoX2RvbmUgPSBOVUxMOwogCQkJYWhjX3VubG9jayhhaGMsICZmbGFncyk7CiAKLQkJCXByaW50ZigiVGltZXIgRXhwaXJlZFxuIik7CisJCQlwcmludGsoIlRpbWVyIEV4cGlyZWRcbiIpOwogCQkJcmV0dmFsID0gRkFJTEVEOwogCQl9Ci0JCXByaW50ZigiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CisJCXByaW50aygiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CiAJfSBlbHNlCiAJCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOwogCXJldHVybiAocmV0dmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCmluZGV4IDU2ZjA3ZTUuLmJjYTBmYjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKQEAgLTM2OCwxMyArMzY4LDYgQEAKIAlyZXNvdXJjZV9zaXplX3QgCSBtZW1fYnVzYWRkcjsJLyogTWVtIEJhc2UgQWRkciAqLwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE9TIFV0aWxpdHkgV3JhcHBlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgcHJpbnRmIHByaW50awotI2RlZmluZSBNX05PV0FJVCBHRlBfQVRPTUlDCi0jZGVmaW5lIE1fV0FJVE9LIDAKLSNkZWZpbmUgbWFsbG9jKHNpemUsIHR5cGUsIGZsYWdzKSBrbWFsbG9jKHNpemUsIGZsYWdzKQotI2RlZmluZSBmcmVlKHB0ciwgdHlwZSkga2ZyZWUocHRyKQotCiB2b2lkIGFoY19kZWxheShsb25nKTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCmluZGV4IDc4ZmM3MGMuLmVlMDVlODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCkBAIC0yMjUsNyArMjI1LDcgQEAKIAkJYWhjX2dldF9wY2lfYnVzKHBjaSksCiAJCWFoY19nZXRfcGNpX3Nsb3QocGNpKSwKIAkJYWhjX2dldF9wY2lfZnVuY3Rpb24ocGNpKSk7Ci0JbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJbmFtZSA9IGttYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBHRlBfQVRPTUlDKTsKIAlpZiAobmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gKC1FTk9NRU0pOwogCXN0cmNweShuYW1lLCBidWYpOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJCSAqLwogCQlpZiAoYWhjX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhhaGMpICE9IDApIHsKIAotCQkJcHJpbnRmKCJhaWM3eHh4OiBQQ0kgRGV2aWNlICVkOiVkOiVkICIKKwkJCXByaW50aygiYWljN3h4eDogUENJIERldmljZSAlZDolZDolZCAiCiAJCQkgICAgICAgImZhaWxlZCBtZW1vcnkgbWFwcGVkIHRlc3QuICBVc2luZyBQSU8uXG4iLAogCQkJICAgICAgIGFoY19nZXRfcGNpX2J1cyhhaGMtPmRldl9zb2Z0YyksCiAJCQkgICAgICAgYWhjX2dldF9wY2lfc2xvdChhaGMtPmRldl9zb2Z0YyksCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJfSBlbHNlCiAJCQljb21tYW5kIHw9IFBDSU1fQ01EX01FTUVOOwogCX0gZWxzZSB7Ci0JCXByaW50ZigiYWljN3h4eDogUENJJWQ6JWQ6JWQgTUVNIHJlZ2lvbiAweCVsbHggIgorCQlwcmludGsoImFpYzd4eHg6IFBDSSVkOiVkOiVkIE1FTSByZWdpb24gMHglbGx4ICIKIAkJICAgICAgICJ1bmF2YWlsYWJsZS4gQ2Fubm90IG1lbW9yeSBtYXAgZGV2aWNlLlxuIiwKIAkJICAgICAgIGFoY19nZXRfcGNpX2J1cyhhaGMtPmRldl9zb2Z0YyksCiAJCSAgICAgICBhaGNfZ2V0X3BjaV9zbG90KGFoYy0+ZGV2X3NvZnRjKSwKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCQkJYWhjLT5ic2guaW9wb3J0ID0gKHVfbG9uZyliYXNlOwogCQkJY29tbWFuZCB8PSBQQ0lNX0NNRF9QT1JURU47CiAJCX0gZWxzZSB7Ci0JCQlwcmludGYoImFpYzd4eHg6IFBDSSVkOiVkOiVkIElPIHJlZ2lvbiAweCVsbHhbMC4uMjU1XSAiCisJCQlwcmludGsoImFpYzd4eHg6IFBDSSVkOiVkOiVkIElPIHJlZ2lvbiAweCVsbHhbMC4uMjU1XSAiCiAJCQkgICAgICAgInVuYXZhaWxhYmxlLiBDYW5ub3QgbWFwIGRldmljZS5cbiIsCiAJCQkgICAgICAgYWhjX2dldF9wY2lfYnVzKGFoYy0+ZGV2X3NvZnRjKSwKIAkJCSAgICAgICBhaGNfZ2V0X3BjaV9zbG90KGFoYy0+ZGV2X3NvZnRjKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jCmluZGV4IDI3MDE0YjkuLjJiMTFhNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpAQCAtNzUyLDcgKzc1Miw3IEBACiAJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKIAogCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoIiVzOiBFbmFibGluZyAzOUJpdCBBZGRyZXNzaW5nXG4iLAorCQkJcHJpbnRrKCIlczogRW5hYmxpbmcgMzlCaXQgQWRkcmVzc2luZ1xuIiwKIAkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKIAkJZGV2Y29uZmlnIHw9IERBQ0VOOwogCX0KQEAgLTg5Niw3ICs4OTYsNyBAQAogCQkvKiBTZWUgaWYgc29tZW9uZSBlbHNlIHNldCB1cyB1cCBhbHJlYWR5ICovCiAJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19OT19CSU9TX0lOSVQpID09IDAKIAkJICYmIHNjc2lzZXEgIT0gMCkgewotCQkJcHJpbnRmKCIlczogVXNpbmcgbGVmdCBvdmVyIEJJT1Mgc2V0dGluZ3NcbiIsCisJCQlwcmludGsoIiVzOiBVc2luZyBsZWZ0IG92ZXIgQklPUyBzZXR0aW5nc1xuIiwKIAkJCQlhaGNfbmFtZShhaGMpKTsKIAkJCWFoYy0+ZmxhZ3MgJj0gfkFIQ19VU0VERUZBVUxUUzsKIAkJCWFoYy0+ZmxhZ3MgfD0gQUhDX0JJT1NfRU5BQkxFRDsKQEAgLTExNTUsNyArMTE1NSw3IEBACiAJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CiAJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CiAJaWYgKGJvb3R2ZXJib3NlICYmIGVuYWJsZSkgewotCQlwcmludGYoIiVzOiBFeHRlcm5hbCBTUkFNLCAlcyBhY2Nlc3MlcywgJWRieXRlcy9TQ0JcbiIsCisJCXByaW50aygiJXM6IEV4dGVybmFsIFNSQU0sICVzIGFjY2VzcyVzLCAlZGJ5dGVzL1NDQlxuIiwKIAkJICAgICAgIGFoY19uYW1lKGFoYyksIGZhc3QgPyAiZmFzdCIgOiAic2xvdyIsIAogCQkgICAgICAgcGNoZWNrID8gIiwgcGFyaXR5IGNoZWNraW5nIGVuYWJsZWQiIDogIiIsCiAJCSAgICAgICBsYXJnZSA/IDY0IDogMzIpOwpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIAlpZiAoaGF2ZV9zZWVwcm9tKSB7CiAKIAkJaWYgKGJvb3R2ZXJib3NlKSAKLQkJCXByaW50ZigiJXM6IFJlYWRpbmcgU0VFUFJPTS4uLiIsIGFoY19uYW1lKGFoYykpOworCQkJcHJpbnRrKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhjX25hbWUoYWhjKSk7CiAKIAkJZm9yICg7OykgewogCQkJdV9pbnQgc3RhcnRfYWRkcjsKQEAgLTEzMDksOSArMTMwOSw5IEBACiAJCQlpZiAoaGF2ZV9zZWVwcm9tICE9IDAgfHwgc2Quc2RfY2hpcCA9PSBDNTZfNjYpIHsKIAkJCQlpZiAoYm9vdHZlcmJvc2UpIHsKIAkJCQkJaWYgKGhhdmVfc2VlcHJvbSA9PSAwKQotCQkJCQkJcHJpbnRmICgiY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJCQkJcHJpbnRrICgiY2hlY2tzdW0gZXJyb3JcbiIpOwogCQkJCQllbHNlCi0JCQkJCQlwcmludGYgKCJkb25lLlxuIik7CisJCQkJCQlwcmludGsgKCJkb25lLlxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTM2Miw5ICsxMzYyLDkgQEAKIAogCWlmICghaGF2ZV9zZWVwcm9tKSB7CiAJCWlmIChib290dmVyYm9zZSkKLQkJCXByaW50ZigiJXM6IE5vIFNFRVBST00gYXZhaWxhYmxlLlxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQlwcmludGsoIiVzOiBObyBTRUVQUk9NIGF2YWlsYWJsZS5cbiIsIGFoY19uYW1lKGFoYykpOwogCQlhaGMtPmZsYWdzIHw9IEFIQ19VU0VERUZBVUxUUzsKLQkJZnJlZShhaGMtPnNlZXBfY29uZmlnLCBNX0RFVkJVRik7CisJCWtmcmVlKGFoYy0+c2VlcF9jb25maWcpOwogCQlhaGMtPnNlZXBfY29uZmlnID0gTlVMTDsKIAkJc2MgPSBOVUxMOwogCX0gZWxzZSB7CkBAIC0xMzk5LDcgKzEzOTksNyBAQAogCQlpZiAoKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKSAhPSAwKQogCQkJKnN4ZnJjdGwxIHw9IFNUUFdFTjsKIAkJaWYgKGJvb3R2ZXJib3NlKQotCQkJcHJpbnRmKCIlczogTG93IGJ5dGUgdGVybWluYXRpb24gJXNhYmxlZFxuIiwKKwkJCXByaW50aygiJXM6IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKIAkJCSAgICAgICAoKnN4ZnJjdGwxICYgU1RQV0VOKSA/ICJlbiIgOiAiZGlzIik7CiAJfQpAQCAtMTU2OSw3ICsxNTY5LDcgQEAKIAkJCQkJICAgICZlZXByb21fcHJlc2VudCk7CiAJCQlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGU0VBVVRPVEVSTSkgPT0gMCkgewogCQkJCWlmIChib290dmVyYm9zZSkKLQkJCQkJcHJpbnRmKCIlczogTWFudWFsIFNFIFRlcm1pbmF0aW9uXG4iLAorCQkJCQlwcmludGsoIiVzOiBNYW51YWwgU0UgVGVybWluYXRpb25cbiIsCiAJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKIAkJCQllbmFibGVTRUNfbG93ID0gKGFkYXB0ZXJfY29udHJvbCAmIENGU0VMT1dURVJNKTsKIAkJCQllbmFibGVTRUNfaGlnaCA9CkBAIC0xNTc3LDcgKzE1NzcsNyBAQAogCQkJfQogCQkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSA9PSAwKSB7CiAJCQkJaWYgKGJvb3R2ZXJib3NlKQotCQkJCQlwcmludGYoIiVzOiBNYW51YWwgTFZEIFRlcm1pbmF0aW9uXG4iLAorCQkJCQlwcmludGsoIiVzOiBNYW51YWwgTFZEIFRlcm1pbmF0aW9uXG4iLAogCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CiAJCQkJZW5hYmxlUFJJX2xvdyA9IChhZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKTsKIAkJCQllbmFibGVQUklfaGlnaCA9IChhZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSk7CkBAIC0xNjA0LDE5ICsxNjA0LDE5IEBACiAKIAkJaWYgKGJvb3R2ZXJib3NlCiAJCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKLQkJCXByaW50ZigiJXM6IGludGVybmFsIDUwIGNhYmxlICVzIHByZXNlbnQiLAorCQkJcHJpbnRrKCIlczogaW50ZXJuYWwgNTAgY2FibGUgJXMgcHJlc2VudCIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKIAkJCSAgICAgICBpbnRlcm5hbDUwX3ByZXNlbnQgPyAiaXMiOiJub3QiKTsKIAogCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApCi0JCQkJcHJpbnRmKCIsIGludGVybmFsIDY4IGNhYmxlICVzIHByZXNlbnQiLAorCQkJCXByaW50aygiLCBpbnRlcm5hbCA2OCBjYWJsZSAlcyBwcmVzZW50IiwKIAkJCQkgICAgICAgaW50ZXJuYWw2OF9wcmVzZW50ID8gImlzIjoibm90Iik7Ci0JCQlwcmludGYoIlxuJXM6IGV4dGVybmFsIGNhYmxlICVzIHByZXNlbnRcbiIsCisJCQlwcmludGsoIlxuJXM6IGV4dGVybmFsIGNhYmxlICVzIHByZXNlbnRcbiIsCiAJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKIAkJCSAgICAgICBleHRlcm5hbGNhYmxlX3ByZXNlbnQgPyAiaXMiOiJub3QiKTsKIAkJfQogCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQlwcmludGYoIiVzOiBCSU9TIGVlcHJvbSAlcyBwcmVzZW50XG4iLAorCQkJcHJpbnRrKCIlczogQklPUyBlZXByb20gJXMgcHJlc2VudFxuIiwKIAkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBlZXByb21fcHJlc2VudCA/ICJpcyIgOiAibm90Iik7CiAKIAkJaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOVDUwX1NQRUVERkxFWCkgIT0gMCkgewpAQCAtMTY0Miw3ICsxNjQyLDcgQEAKIAkJICYmIChpbnRlcm5hbDUwX3ByZXNlbnQgIT0gMCkKIAkJICYmIChpbnRlcm5hbDY4X3ByZXNlbnQgIT0gMCkKIAkJICYmIChleHRlcm5hbGNhYmxlX3ByZXNlbnQgIT0gMCkpIHsKLQkJCXByaW50ZigiJXM6IElsbGVnYWwgY2FibGUgY29uZmlndXJhdGlvbiEhLiAiCisJCQlwcmludGsoIiVzOiBJbGxlZ2FsIGNhYmxlIGNvbmZpZ3VyYXRpb24hIS4gIgogCQkJICAgICAgICJPbmx5IHR3byBjb25uZWN0b3JzIG9uIHRoZSAiCiAJCQkgICAgICAgImFkYXB0ZXIgbWF5IGJlIHVzZWQgYXQgYSAiCiAJCQkgICAgICAgInRpbWUhXG4iLCBhaGNfbmFtZShhaGMpKTsKQEAgLTE2NjQsMTAgKzE2NjQsMTAgQEAKIAkJCWJyZGRhdCB8PSBCUkREQVQ2OwogCQkJaWYgKGJvb3R2ZXJib3NlKSB7CiAJCQkJaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOVDUwX1NQRUVERkxFWCkgIT0gMCkKLQkJCQkJcHJpbnRmKCIlczogNjggcGluIHRlcm1pbmF0aW9uICIKKwkJCQkJcHJpbnRrKCIlczogNjggcGluIHRlcm1pbmF0aW9uICIKIAkJCQkJICAgICAgICJFbmFibGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKIAkJCQllbHNlCi0JCQkJCXByaW50ZigiJXM6ICVzSGlnaCBieXRlIHRlcm1pbmF0aW9uICIKKwkJCQkJcHJpbnRrKCIlczogJXNIaWdoIGJ5dGUgdGVybWluYXRpb24gIgogCQkJCQkgICAgICAgIkVuYWJsZWRcbiIsIGFoY19uYW1lKGFoYyksCiAJCQkJCSAgICAgICBlbmFibGVTRUNfaGlnaCA/ICJTZWNvbmRhcnkgIgogCQkJCQkJCSAgICAgIDogIiIpOwpAQCAtMTY4MywxMCArMTY4MywxMCBAQAogCQkJCSpzeGZyY3RsMSB8PSBTVFBXRU47CiAJCQlpZiAoYm9vdHZlcmJvc2UpIHsKIAkJCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5UNTBfU1BFRURGTEVYKSAhPSAwKQotCQkJCQlwcmludGYoIiVzOiA1MCBwaW4gdGVybWluYXRpb24gIgorCQkJCQlwcmludGsoIiVzOiA1MCBwaW4gdGVybWluYXRpb24gIgogCQkJCQkgICAgICAgIkVuYWJsZWRcbiIsIGFoY19uYW1lKGFoYykpOwogCQkJCWVsc2UKLQkJCQkJcHJpbnRmKCIlczogJXNMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAiCisJCQkJCXByaW50aygiJXM6ICVzTG93IGJ5dGUgdGVybWluYXRpb24gIgogCQkJCQkgICAgICAgIkVuYWJsZWRcbiIsIGFoY19uYW1lKGFoYyksCiAJCQkJCSAgICAgICBlbmFibGVTRUNfbG93ID8gIlNlY29uZGFyeSAiCiAJCQkJCQkJICAgICA6ICIiKTsKQEAgLTE2OTYsNyArMTY5Niw3IEBACiAJCWlmIChlbmFibGVQUklfbG93ICE9IDApIHsKIAkJCSpzeGZyY3RsMSB8PSBTVFBXRU47CiAJCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQkJcHJpbnRmKCIlczogUHJpbWFyeSBMb3cgQnl0ZSB0ZXJtaW5hdGlvbiAiCisJCQkJcHJpbnRrKCIlczogUHJpbWFyeSBMb3cgQnl0ZSB0ZXJtaW5hdGlvbiAiCiAJCQkJICAgICAgICJFbmFibGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKIAkJfQogCkBAIC0xNzA5LDcgKzE3MDksNyBAQAogCQlpZiAoZW5hYmxlUFJJX2hpZ2ggIT0gMCkgewogCQkJYnJkZGF0IHw9IEJSRERBVDQ7CiAJCQlpZiAoYm9vdHZlcmJvc2UpCi0JCQkJcHJpbnRmKCIlczogUHJpbWFyeSBIaWdoIEJ5dGUgIgorCQkJCXByaW50aygiJXM6IFByaW1hcnkgSGlnaCBCeXRlICIKIAkJCQkgICAgICAgInRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCiAJCQkJICAgICAgIGFoY19uYW1lKGFoYykpOwogCQl9CkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogCQkJKnN4ZnJjdGwxIHw9IFNUUFdFTjsKIAogCQkJaWYgKGJvb3R2ZXJib3NlKQotCQkJCXByaW50ZigiJXM6ICVzTG93IGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKwkJCQlwcmludGsoIiVzOiAlc0xvdyBieXRlIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCiAJCQkJICAgICAgIGFoY19uYW1lKGFoYyksCiAJCQkJICAgICAgIChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPyAiUHJpbWFyeSAiCiAJCQkJCQkJCSAgICA6ICIiKTsKQEAgLTE3MzEsNyArMTczMSw3IEBACiAJCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CiAJCQlicmRkYXQgfD0gQlJEREFUNjsKIAkJCWlmIChib290dmVyYm9zZSkKLQkJCQlwcmludGYoIiVzOiAlc0hpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiBFbmFibGVkXG4iLAorCQkJCXByaW50aygiJXM6ICVzSGlnaCBieXRlIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCiAJCQkJICAgICAgIGFoY19uYW1lKGFoYyksCiAJCQkJICAgICAgIChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKIAkJCQkgICAgID8gIlNlY29uZGFyeSAiIDogIiIpOwpAQCAtMTkzNywyOSArMTkzNywyOSBAQAogCXN0YXR1czEgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLAogCQkJCSAgICAgIFBDSVJfU1RBVFVTICsgMSwgLypieXRlcyovMSk7CiAKLQlwcmludGYoIiVzOiBQQ0kgZXJyb3IgSW50ZXJydXB0IGF0IHNlcWFkZHIgPSAweCV4XG4iLAorCXByaW50aygiJXM6IFBDSSBlcnJvciBJbnRlcnJ1cHQgYXQgc2VxYWRkciA9IDB4JXhcbiIsCiAJICAgICAgYWhjX25hbWUoYWhjKSwKIAkgICAgICBhaGNfaW5iKGFoYywgU0VRQUREUjApIHwgKGFoY19pbmIoYWhjLCBTRVFBRERSMSkgPDwgOCkpOwogCiAJaWYgKHN0YXR1czEgJiBEUEUpIHsKIAkJYWhjLT5wY2lfdGFyZ2V0X3BlcnJfY291bnQrKzsKLQkJcHJpbnRmKCIlczogRGF0YSBQYXJpdHkgRXJyb3IgRGV0ZWN0ZWQgZHVyaW5nIGFkZHJlc3MgIgorCQlwcmludGsoIiVzOiBEYXRhIFBhcml0eSBFcnJvciBEZXRlY3RlZCBkdXJpbmcgYWRkcmVzcyAiCiAJCSAgICAgICAib3Igd3JpdGUgZGF0YSBwaGFzZVxuIiwgYWhjX25hbWUoYWhjKSk7CiAJfQogCWlmIChzdGF0dXMxICYgU1NFKSB7Ci0JCXByaW50ZigiJXM6IFNpZ25hbCBTeXN0ZW0gRXJyb3IgRGV0ZWN0ZWRcbiIsIGFoY19uYW1lKGFoYykpOworCQlwcmludGsoIiVzOiBTaWduYWwgU3lzdGVtIEVycm9yIERldGVjdGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKIAl9CiAJaWYgKHN0YXR1czEgJiBSTUEpIHsKLQkJcHJpbnRmKCIlczogUmVjZWl2ZWQgYSBNYXN0ZXIgQWJvcnRcbiIsIGFoY19uYW1lKGFoYykpOworCQlwcmludGsoIiVzOiBSZWNlaXZlZCBhIE1hc3RlciBBYm9ydFxuIiwgYWhjX25hbWUoYWhjKSk7CiAJfQogCWlmIChzdGF0dXMxICYgUlRBKSB7Ci0JCXByaW50ZigiJXM6IFJlY2VpdmVkIGEgVGFyZ2V0IEFib3J0XG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcHJpbnRrKCIlczogUmVjZWl2ZWQgYSBUYXJnZXQgQWJvcnRcbiIsIGFoY19uYW1lKGFoYykpOwogCX0KIAlpZiAoc3RhdHVzMSAmIFNUQSkgewotCQlwcmludGYoIiVzOiBTaWduYWxlZCBhIFRhcmdldCBBYm9ydFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCXByaW50aygiJXM6IFNpZ25hbGVkIGEgVGFyZ2V0IEFib3J0XG4iLCBhaGNfbmFtZShhaGMpKTsKIAl9CiAJaWYgKHN0YXR1czEgJiBEUFIpIHsKLQkJcHJpbnRmKCIlczogRGF0YSBQYXJpdHkgRXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdmlhIFBFUlIjXG4iLAorCQlwcmludGsoIiVzOiBEYXRhIFBhcml0eSBFcnJvciBoYXMgYmVlbiByZXBvcnRlZCB2aWEgUEVSUiNcbiIsCiAJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKIAl9CiAKQEAgLTE5NjgsMTQgKzE5NjgsMTQgQEAKIAkJCSAgICAgc3RhdHVzMSwgLypieXRlcyovMSk7CiAKIAlpZiAoKHN0YXR1czEgJiAoRFBFfFNTRXxSTUF8UlRBfFNUQXxEUFIpKSA9PSAwKSB7Ci0JCXByaW50ZigiJXM6IExhdGNoZWQgUENJRVJSIGludGVycnVwdCB3aXRoICIKKwkJcHJpbnRrKCIlczogTGF0Y2hlZCBQQ0lFUlIgaW50ZXJydXB0IHdpdGggIgogCQkgICAgICAgIm5vIHN0YXR1cyBiaXRzIHNldFxuIiwgYWhjX25hbWUoYWhjKSk7IAogCX0gZWxzZSB7CiAJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJQQVJFUlIpOwogCX0KIAogCWlmIChhaGMtPnBjaV90YXJnZXRfcGVycl9jb3VudCA+IEFIQ19QQ0lfVEFSR0VUX1BFUlJfVEhSRVNIKSB7Ci0JCXByaW50ZigKKwkJcHJpbnRrKAogIiVzOiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HXG4iCiAiJXM6IFRvbyBtYW55IFBDSSBwYXJpdHkgZXJyb3JzIG9ic2VydmVkIGFzIGEgdGFyZ2V0LlxuIgogIiVzOiBTb21lIGRldmljZSBvbiB0aGlzIGJ1cyBpcyBnZW5lcmF0aW5nIGJhZCBwYXJpdHkuXG4iCkBAIC0yMzg2LDcgKzIzODYsNyBAQAogc3RhdGljIGludAogYWhjX3JhaWRfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQogewotCXByaW50ZigiUkFJRCBmdW5jdGlvbmFsaXR5IHVuc3VwcG9ydGVkXG4iKTsKKwlwcmludGsoIlJBSUQgZnVuY3Rpb25hbGl0eSB1bnN1cHBvcnRlZFxuIik7CiAJcmV0dXJuIChFTlhJTyk7CiB9CiAKQEAgLTI0MDQsNyArMjQwNCw3IEBACiAJCWFoYy0+Y2hhbm5lbCA9ICdCJzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRmKCJhZGFwdGVyIGF0IHVuZXhwZWN0ZWQgc2xvdCAlZFxuIgorCQlwcmludGsoImFkYXB0ZXIgYXQgdW5leHBlY3RlZCBzbG90ICVkXG4iCiAJCSAgICAgICAidW5hYmxlIHRvIG1hcCB0byBhIGNoYW5uZWxcbiIsCiAJCSAgICAgICBhaGNfZ2V0X3BjaV9zbG90KHBjaSkpOwogCQlhaGMtPmNoYW5uZWwgPSAnQSc7CkBAIC0yNDI5LDcgKzI0MjksNyBAQAogCQlhaGMtPmNoYW5uZWwgPSAnQyc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ZigiYWRhcHRlciBhdCB1bmV4cGVjdGVkIHNsb3QgJWRcbiIKKwkJcHJpbnRrKCJhZGFwdGVyIGF0IHVuZXhwZWN0ZWQgc2xvdCAlZFxuIgogCQkgICAgICAgInVuYWJsZSB0byBtYXAgdG8gYSBjaGFubmVsXG4iLAogCQkgICAgICAgYWhjX2dldF9wY2lfc2xvdChwY2kpKTsKIAkJYWhjLT5jaGFubmVsID0gJ0EnOwpAQCAtMjQ1OSw3ICsyNDU5LDcgQEAKIAkJYWhjLT5jaGFubmVsID0gJ0QnOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGYoImFkYXB0ZXIgYXQgdW5leHBlY3RlZCBzbG90ICVkXG4iCisJCXByaW50aygiYWRhcHRlciBhdCB1bmV4cGVjdGVkIHNsb3QgJWRcbiIKIAkJICAgICAgICJ1bmFibGUgdG8gbWFwIHRvIGEgY2hhbm5lbFxuIiwKIAkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QocGNpKSk7CiAJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKaW5kZXggZTkyOTkxYS4uZjI1MjVmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKQEAgLTI0OCwxMyArMjQ4LDEzIEBACiAJCWFoY19wYXVzZShhaGMpOwogCiAJaWYgKGxlbmd0aCAhPSBzaXplb2Yoc3RydWN0IHNlZXByb21fY29uZmlnKSkgewotCQlwcmludGYoImFoY19wcm9jX3dyaXRlX3NlZXByb206IGluY29ycmVjdCBidWZmZXIgc2l6ZVxuIik7CisJCXByaW50aygiYWhjX3Byb2Nfd3JpdGVfc2VlcHJvbTogaW5jb3JyZWN0IGJ1ZmZlciBzaXplXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAogCWhhdmVfc2VlcHJvbSA9IGFoY192ZXJpZnlfY2tzdW0oKHN0cnVjdCBzZWVwcm9tX2NvbmZpZyopYnVmZmVyKTsKIAlpZiAoaGF2ZV9zZWVwcm9tID09IDApIHsKLQkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBja3N1bSB2ZXJpZmljYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJpbnRrKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBja3N1bSB2ZXJpZmljYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMjkwLDI2ICsyOTAsMjUgQEAKIAkJc2Quc2RfREkgPSBESV8yODQwOwogCQloYXZlX3NlZXByb20gPSBUUlVFOwogCX0gZWxzZSB7Ci0JCXByaW50ZigiYWhjX3Byb2Nfd3JpdGVfc2VlcHJvbTogdW5zdXBwb3J0ZWQgYWRhcHRlciB0eXBlXG4iKTsKKwkJcHJpbnRrKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiB1bnN1cHBvcnRlZCBhZGFwdGVyIHR5cGVcbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJaWYgKCFoYXZlX3NlZXByb20pIHsKLQkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBObyBTZXJpYWwgRUVQUk9NXG4iKTsKKwkJcHJpbnRrKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBObyBTZXJpYWwgRUVQUk9NXG4iKTsKIAkJZ290byBkb25lOwogCX0gZWxzZSB7CiAJCXVfaW50IHN0YXJ0X2FkZHI7CiAKIAkJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkgewotCQkJYWhjLT5zZWVwX2NvbmZpZyA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2VlcF9jb25maWcpLAotCQkJCQkJICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQkJYWhjLT5zZWVwX2NvbmZpZyA9IGttYWxsb2Moc2l6ZW9mKCphaGMtPnNlZXBfY29uZmlnKSwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoYWhjLT5zZWVwX2NvbmZpZyA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRmKCJhaWM3eHh4OiBVbmFibGUgdG8gYWxsb2NhdGUgc2VyaWFsICIKKwkJCQlwcmludGsoImFpYzd4eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBzZXJpYWwgIgogCQkJCSAgICAgICAiZWVwcm9tIGJ1ZmZlci4gIFdyaXRlIGZhaWxpbmdcbiIpOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAkJfQotCQlwcmludGYoImFpYzd4eHg6IFdyaXRpbmcgU2VyaWFsIEVFUFJPTVxuIik7CisJCXByaW50aygiYWljN3h4eDogV3JpdGluZyBTZXJpYWwgRUVQUk9NXG4iKTsKIAkJc3RhcnRfYWRkciA9IDMyICogKGFoYy0+Y2hhbm5lbCAtICdBJyk7CiAJCWFoY193cml0ZV9zZWVwcm9tKCZzZCwgKHVfaW50MTZfdCAqKWJ1ZmZlciwgc3RhcnRfYWRkciwKIAkJCQkgIHNpemVvZihzdHJ1Y3Qgc2VlcHJvbV9jb25maWcpLzIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxCmluZGV4IGY2ZmM0YjcuLjU5OTdlN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4LnNlcQorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eC5zZXEKQEAgLTYxNSw3ICs2MTUsNyBAQAogCQkJICogd2VudCBlbXB0eSBhbmQgdGhlIG5leHQgYml0IG9mIGRhdGEgaXMgY29waWVkIGZyb20KIAkJCSAqIHRoZSBTQ1NJIGZpZm8gaW50byB0aGUgUENJIGZpZm8uICBJdCBzaG91bGQgb25seQogCQkJICogY29tZSBvbiB3aGVuIGJvdGggRklGT3MgKG1lYW5pbmcgdGhlIGVudGlyZSBGSUZPCi0JCQkgKiBjaGFpbikgYXJlIGVtdHB5LiAgU2luY2UgaXQgY2FuIHRha2UgdXAgdG8gNCBjeWNsZXMKKwkJCSAqIGNoYWluKSBhcmUgZW1wdHkuICBTaW5jZSBpdCBjYW4gdGFrZSB1cCB0byA0IGN5Y2xlcwogCQkJICogZm9yIG5ldyBkYXRhIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBTQ1NJIGZpZm8gaW50bwogCQkJICogdGhlIFBDSSBmaWZvLCB0ZXN0aW5nIGZvciBGSUZPRU1QIHN0YXR1cyBmb3IgNAogCQkJICogZXh0cmEgdGltZXMgZ2l2ZXMgdGhlIG5lZWRlZCB0aW1lIGZvciBhbnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmMgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5jCmluZGV4IGQwMWRjYzYuLjc0Mzc0NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuYwpAQCAtNTg4LDcgKzU4OCw3IEBACiAgKiBhc2RfaW5pdF9jc2VxX3NjcmF0Y2ggLS0gc2V0dXAgYW5kIGluaXQgQ1NFUQogICogQGFzZF9oYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCiAgKgotICogU2V0dXAgYW5kIGluaXRpYWxpemUgQ2VudHJhbCBzZXF1ZW5jZXJzLiBJbml0aWFsaWF6ZSB0aGUgbW9kZQorICogU2V0dXAgYW5kIGluaXRpYWxpemUgQ2VudHJhbCBzZXF1ZW5jZXJzLiBJbml0aWFsaXplIHRoZSBtb2RlCiAgKiBpbmRlcGVuZGVudCBhbmQgZGVwZW5kZW50IHNjcmF0Y2ggcGFnZSB0byB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KICAqLwogc3RhdGljIHZvaWQgYXNkX2luaXRfY3NlcV9zY3JhdGNoKHN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEpCkBAIC03ODIsNyArNzgyLDcgQEAKIAlhc2Rfd3JpdGVfcmVnX3dvcmQoYXNkX2hhLCBMbVNFUV9PT0JfSU5UX0VOQUJMRVMobHNlcSksIDApOwogCS8qCiAJICogU2V0IHRoZSBkZXNpcmVkIGludGVydmFsIGJldHdlZW4gdHJhbnNtaXNzaW9ucyBvZiB0aGUgTk9USUZZCi0JICogKEVOQUJMRSBTUElOVVApIHByaW1pdGl2ZS4gIE11c3QgYmUgaW5pdGlsaXplZCB0byB2YWwgLSAxLgorCSAqIChFTkFCTEUgU1BJTlVQKSBwcmltaXRpdmUuICBNdXN0IGJlIGluaXRpYWxpemVkIHRvIHZhbCAtIDEuCiAJICovCiAJYXNkX3dyaXRlX3JlZ193b3JkKGFzZF9oYSwgTG1TRVFfTk9USUZZX1RJTUVSX1RJTUVPVVQobHNlcSksCiAJCQkgICBBU0RfTk9USUZZX1RJTUVPVVQgLSAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfdGFzay5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90YXNrLmMKaW5kZXggNzVkMjBmNy4uNTMyZDIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90YXNrLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90YXNrLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBUQ19OT19FUlJPUjoKIAkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKLQkJdHMtPnN0YXQgPSBTQU1fR09PRDsKKwkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwogCQlicmVhazsKIAljYXNlIFRDX1VOREVSUlVOOgogCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3IuaCBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyLmgKaW5kZXggY2U1MzcxYi4uNDc1YzMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3IuaAorKysgYi9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zci5oCkBAIC00MywyMSArNDMsMjcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlOwogLypUaGUgbGltaXQgb2Ygb3V0c3RhbmRpbmcgc2NzaSBjb21tYW5kIHRoYXQgZmlybXdhcmUgY2FuIGhhbmRsZSovCiAjZGVmaW5lIEFSQ01TUl9NQVhfT1VUU1RBTkRJTkdfQ01ECQkJCQkJMjU2CiAjZGVmaW5lIEFSQ01TUl9NQVhfRlJFRUNDQl9OVU0JCQkJCQkJMzIwCi0jZGVmaW5lIEFSQ01TUl9EUklWRVJfVkVSU0lPTgkJICAgICAiRHJpdmVyIFZlcnNpb24gMS4yMC4wMC4xNSAyMDA4LzExLzAzIgorI2RlZmluZSBBUkNNU1JfRFJJVkVSX1ZFUlNJT04JCSAgICAgIkRyaXZlciBWZXJzaW9uIDEuMjAuMDAuMTUgMjAxMC8wMi8wMiIKICNkZWZpbmUgQVJDTVNSX1NDU0lfSU5JVElBVE9SX0lECQkJCQkJMjU1CiAjZGVmaW5lIEFSQ01TUl9NQVhfWEZFUl9TRUNUT1JTCQkJCQkJCTUxMgogI2RlZmluZSBBUkNNU1JfTUFYX1hGRVJfU0VDVE9SU19CCQkJCQkJNDA5NgorI2RlZmluZSBBUkNNU1JfTUFYX1hGRVJfU0VDVE9SU19DCQkJCQkJMzA0CiAjZGVmaW5lIEFSQ01TUl9NQVhfVEFSR0VUSUQJCQkJCQkJMTcKICNkZWZpbmUgQVJDTVNSX01BWF9UQVJHRVRMVU4JCQkJCQkJOAogI2RlZmluZSBBUkNNU1JfTUFYX0NNRF9QRVJMVU4JCSAgICAgICAgICAgICAgICAgQVJDTVNSX01BWF9PVVRTVEFORElOR19DTUQKICNkZWZpbmUgQVJDTVNSX01BWF9RQlVGRkVSCQkJCQkJCTQwOTYKLSNkZWZpbmUgQVJDTVNSX01BWF9TR19FTlRSSUVTCQkJCQkJCTM4CisjZGVmaW5lIEFSQ01TUl9ERUZBVUxUX1NHX0VOVFJJRVMJCQkJCQkzOAogI2RlZmluZSBBUkNNU1JfTUFYX0hCQl9QT1NUUVVFVUUJCQkJCQkyNjQKKyNkZWZpbmUgQVJDTVNSX01BWF9YRkVSX0xFTgkJCQkJCQkweDI2MDAwIC8qIDE1MksgKi8KKyNkZWZpbmUgQVJDTVNSX0NEQl9TR19QQUdFX0xFTkdUSAkJCQkJCTI1NiAKKyNkZWZpbmUgU0NTSV9DTURfQVJFQ0FfU1BFQ0lGSUMJCQkJCQkweEUxCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQVJFQ0FfMTg4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSRUNBXzE4ODAgMHgxODgwCisgI2VuZGlmCiAvKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEzMiwzNSArMTM4LDI4IEBACiAjZGVmaW5lIEFSQ01TUl9NRVNTQUdFX0ZMVVNIX0FEQVBURVJfQ0FDSEUgXAogCUFSRUNBX1NBVEFfUkFJRCB8IEZVTkNUSU9OX0ZMVVNIX0FEQVBURVJfQ0FDSEUKIC8qIEFSRUNBIElPQ1RMIFJldHVybkNvZGUgKi8KLSNkZWZpbmUgQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9PSyAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0VSUk9SICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIEFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfM0YgICAgICAgICAgICAgIDB4MDAwMDAwM0YKKyNkZWZpbmUgQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9PSwkJMHgwMDAwMDAwMQorI2RlZmluZSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0VSUk9SCQkweDAwMDAwMDA2CisjZGVmaW5lIEFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfM0YJCTB4MDAwMDAwM0YKICNkZWZpbmUgQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9CVVNfSEFOR19PTgkweDAwMDAwMDg4CiAvKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogICBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgRE1BIGFkZHJlc3MgZGF0YQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KKyNkZWZpbmUgSVNfRE1BNjQJCQkoc2l6ZW9mKGRtYV9hZGRyX3QpID09IDgpCiAjZGVmaW5lIElTX1NHNjRfQUREUiAgICAgICAgICAgICAgICAweDAxMDAwMDAwIC8qIGJpdDI0ICovCiBzdHJ1Y3QgIFNHMzJFTlRSWQogewogCV9fbGUzMgkJCQkJbGVuZ3RoOwogCV9fbGUzMgkJCQkJYWRkcmVzczsKLX07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogc3RydWN0ICBTRzY0RU5UUlkKIHsKIAlfX2xlMzIJCQkJCWxlbmd0aDsKIAlfX2xlMzIJCQkJCWFkZHJlc3M7CiAJX19sZTMyCQkJCQlhZGRyZXNzaGlnaDsKLX07Ci1zdHJ1Y3QgU0dFTlRSWV9VTklPTgotewotCXVuaW9uCi0JewotCQlzdHJ1Y3QgU0czMkVOVFJZICAgICAgICAgICAgc2czMmVudHJ5OwotCQlzdHJ1Y3QgU0c2NEVOVFJZICAgICAgICAgICAgc2c2NGVudHJ5OwotCX11OwotfTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAvKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICAgICAgUSBCdWZmZXIgb2YgSU9QIE1lc3NhZ2UgVHJhbnNmZXIKQEAgLTE4Nyw2ICsxODYsOSBAQAogCWNoYXIgICAgICAgICAgbW9kZWxbOF07CQkJLyoxNSwgNjAtNjcqLwogCWNoYXIgICAgICAgICAgZmlybXdhcmVfdmVyWzE2XTsgICAgIAkvKjE3LCA2OC04MyovCiAJY2hhciAgICAgICAgICBkZXZpY2VfbWFwWzE2XTsJCS8qMjEsIDg0LTk5Ki8KKwl1aW50MzJfdAkJY2ZnVmVyc2lvbjsgICAgICAgICAgICAgICAJLyoyNSwxMDAtMTAzIEFkZGVkIGZvciBjaGVja2luZyBvZiBuZXcgZmlybXdhcmUgY2FwYWJpbGl0eSovCisJdWludDhfdAkJY2ZnU2VyaWFsWzE2XTsgICAgICAgICAgIAkvKjI2LDEwNC0xMTkqLworCXVpbnQzMl90CQljZmdQaWNTdGF0dXM7ICAgICAgICAgICAgCS8qMzAsMTIwLTEyMyovCQogfTsKIC8qIHNpZ25hdHVyZSBvZiBzZXQgYW5kIGdldCBmaXJtd2FyZSBjb25maWcgKi8KICNkZWZpbmUgQVJDTVNSX1NJR05BVFVSRV9HRVRfQ09ORklHCQkgICAgICAweDg3OTc0MDYwCkBAIC0yMTAsOSArMjEyLDE1IEBACiAjZGVmaW5lIEFSQ01TUl9DQ0JQT1NUX0ZMQUdfU0dMX0JTSVpFICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCiAjZGVmaW5lIEFSQ01TUl9DQ0JQT1NUX0ZMQUdfSUFNX0JJT1MgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCiAjZGVmaW5lIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0lBTV9CSU9TICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SX01PREUwICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SX01PREUxICAgICAgICAgICAgICAweDAwMDAwMDAxCiAvKiBvdXRib3VuZCBmaXJtd2FyZSBvayAqLwogI2RlZmluZSBBUkNNU1JfT1VUQk9VTkRfTUVTRzFfRklSTVdBUkVfT0sgICAgICAgICAgICAgMHg4MDAwMDAwMAorLyogQVJDLTE2ODAgQnVzIFJlc2V0Ki8KKyNkZWZpbmUgQVJDTVNSX0FSQzE2ODBfQlVTX1JFU0VUCQkJCTB4MDAwMDAwMDMKKy8qIEFSQy0xODgwIEJ1cyBSZXNldCovCisjZGVmaW5lIEFSQ01TUl9BUkMxODgwX1JFU0VUX0FEQVBURVIJCQkJMHgwMDAwMDAyNAorI2RlZmluZSBBUkNNU1JfQVJDMTg4MF9EaWFnV3JpdGVfRU5BQkxFCQkJMHgwMDAwMDA4MAogCiAvKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNjQsMTEgKzI3Miw2NiBAQAogCiAvKiBkYXRhIHR1bm5lbCBidWZmZXIgYmV0d2VlbiB1c2VyIHNwYWNlIHByb2dyYW0gYW5kIGl0cyBmaXJtd2FyZSAqLwogLyogdXNlciBzcGFjZSBkYXRhIHRvIGlvcCAxMjhieXRlcyAqLwotI2RlZmluZSBBUkNNU1JfSU9DVExfV0JVRkZFUgkJCSAgICAgIDB4MDAwMGZlMDAKKyNkZWZpbmUgQVJDTVNSX01FU1NBR0VfV0JVRkZFUgkJCSAgICAgIDB4MDAwMGZlMDAKIC8qIGlvcCBkYXRhIHRvIHVzZXIgc3BhY2UgMTI4Ynl0ZXMgKi8KLSNkZWZpbmUgQVJDTVNSX0lPQ1RMX1JCVUZGRVIJCQkgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEFSQ01TUl9NRVNTQUdFX1JCVUZGRVIJCQkgICAgICAweDAwMDBmZjAwCiAvKiBpb3AgbWVzc2FnZV9yd2J1ZmZlciBmb3IgbWVzc2FnZSBjb21tYW5kICovCi0jZGVmaW5lIEFSQ01TUl9NU0dDT0RFX1JXQlVGRkVSCQkJICAgICAgMHgwMDAwZmEwMAorI2RlZmluZSBBUkNNU1JfTUVTU0FHRV9SV0JVRkZFUgkJCSAgICAgIDB4MDAwMGZhMDAKKy8qIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgICAgICAgICAgICAgICBTUEVDLiBmb3IgQXJlY2EgSEJDIGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNkZWZpbmUgQVJDTVNSX0hCQ19JU1JfVEhST1RUTElOR19MRVZFTAkJMTIKKyNkZWZpbmUgQVJDTVNSX0hCQ19JU1JfTUFYX0RPTkVfUVVFVUUJCTIwCisvKiBIb3N0IEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9VVElMSVRZX0FfSVNSX01BU0sJCTB4MDAwMDAwMDEgLyogV2hlbiBjbGVhciwgdGhlIFV0aWxpdHlfQSBpbnRlcnJ1cHQgcm91dGVzIHRvIHRoZSBob3N0LiovCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9PVVRCT1VORF9ET09SQkVMTF9JU1JfTUFTSwkweDAwMDAwMDA0IC8qIFdoZW4gY2xlYXIsIHRoZSBHZW5lcmFsIE91dGJvdW5kIERvb3JiZWxsIGludGVycnVwdCByb3V0ZXMgdG8gdGhlIGhvc3QuKi8KKyNkZWZpbmUgQVJDTVNSX0hCQ01VX09VVEJPVU5EX1BPU1RRVUVVRV9JU1JfTUFTSwkweDAwMDAwMDA4IC8qIFdoZW4gY2xlYXIsIHRoZSBPdXRib3VuZCBQb3N0IExpc3QgRklGTyBOb3QgRW1wdHkgaW50ZXJydXB0IHJvdXRlcyB0byB0aGUgaG9zdC4qLworI2RlZmluZSBBUkNNU1JfSEJDTVVfQUxMX0lOVE1BU0tFTkFCTEUJCTB4MDAwMDAwMEQgLyogZGlzYWJsZSBhbGwgSVNSICovCisvKiBIb3N0IEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgQVJDTVNSX0hCQ01VX1VUSUxJVFlfQV9JU1IJCQkweDAwMDAwMDAxCisJLyoKKwkqKiBTZXQgd2hlbiB0aGUgVXRpbGl0eV9BIEludGVycnVwdCBiaXQgaXMgc2V0IGluIHRoZSBPdXRib3VuZCBEb29yYmVsbCBSZWdpc3Rlci4KKwkqKiBJdCBjbGVhcnMgYnkgd3JpdGluZyBhIDEgdG8gdGhlIFV0aWxpdHlfQSBiaXQgaW4gdGhlIE91dGJvdW5kIERvb3JiZWxsIENsZWFyIFJlZ2lzdGVyIG9yIHRocm91Z2ggYXV0b21hdGljIGNsZWFyaW5nIChpZiBlbmFibGVkKS4KKwkqLworI2RlZmluZSBBUkNNU1JfSEJDTVVfT1VUQk9VTkRfRE9PUkJFTExfSVNSCQkweDAwMDAwMDA0CisJLyoKKwkqKiBTZXQgaWYgT3V0Ym91bmQgRG9vcmJlbGwgcmVnaXN0ZXIgYml0cyAzMDoxIGhhdmUgYSBub24temVybworCSoqIHZhbHVlLiBUaGlzIGJpdCBjbGVhcnMgb25seSB3aGVuIE91dGJvdW5kIERvb3JiZWxsIGJpdHMKKwkqKiAzMDoxIGFyZSBBTEwgY2xlYXIuIE9ubHkgYSB3cml0ZSB0byB0aGUgT3V0Ym91bmQgRG9vcmJlbGwKKwkqKiBDbGVhciByZWdpc3RlciBjbGVhcnMgYml0cyBpbiB0aGUgT3V0Ym91bmQgRG9vcmJlbGwgcmVnaXN0ZXIuCisJKi8KKyNkZWZpbmUgQVJDTVNSX0hCQ01VX09VVEJPVU5EX1BPU1RRVUVVRV9JU1IJMHgwMDAwMDAwOAorCS8qCisJKiogU2V0IHdoZW5ldmVyIHRoZSBPdXRib3VuZCBQb3N0IExpc3QgUHJvZHVjZXIvQ29uc3VtZXIKKwkqKiBSZWdpc3RlciAoRklGTykgaXMgbm90IGVtcHR5LiBJdCBjbGVhcnMgd2hlbiB0aGUgT3V0Ym91bmQKKwkqKiBQb3N0IExpc3QgRklGTyBpcyBlbXB0eS4KKwkqLworI2RlZmluZSBBUkNNU1JfSEJDTVVfU0FTX0FMTF9JTlQJCQkweDAwMDAwMDEwCisJLyoKKwkqKiBUaGlzIGJpdCBpbmRpY2F0ZXMgYSBTQVMgaW50ZXJydXB0IGZyb20gYSBzb3VyY2UgZXh0ZXJuYWwgdG8KKwkqKiB0aGUgUENJZSBjb3JlLiBUaGlzIGJpdCBpcyBub3QgbWFza2FibGUuCisJKi8KKwkvKiBEb29yQmVsbCovCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9EUlYySU9QX0RBVEFfV1JJVEVfT0sJCQkweDAwMDAwMDAyCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9EUlYySU9QX0RBVEFfUkVBRF9PSwkJCTB4MDAwMDAwMDQKKwkvKmluYm91bmQgbWVzc2FnZSAwIHJlYWR5Ki8KKyNkZWZpbmUgQVJDTVNSX0hCQ01VX0RSVjJJT1BfTUVTU0FHRV9DTURfRE9ORQkJMHgwMDAwMDAwOAorCS8qbW9yZSB0aGFuIDEyIHJlcXVlc3QgY29tcGxldGVkIGluIGEgdGltZSovCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9EUlYySU9QX1BPU1RRVUVVRV9USFJPVFRMSU5HCQkweDAwMDAwMDEwCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9JT1AyRFJWX0RBVEFfV1JJVEVfT0sJCQkweDAwMDAwMDAyCisJLypvdXRib3VuZCBEQVRBIFdSSVRFIGlzciBkb29yIGJlbGwgY2xlYXIqLworI2RlZmluZSBBUkNNU1JfSEJDTVVfSU9QMkRSVl9EQVRBX1dSSVRFX0RPT1JCRUxMX0NMRUFSCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVJDTVNSX0hCQ01VX0lPUDJEUlZfREFUQV9SRUFEX09LCQkJMHgwMDAwMDAwNAorCS8qb3V0Ym91bmQgREFUQSBSRUFEIGlzciBkb29yIGJlbGwgY2xlYXIqLworI2RlZmluZSBBUkNNU1JfSEJDTVVfSU9QMkRSVl9EQVRBX1JFQURfRE9PUkJFTExfQ0xFQVIJMHgwMDAwMDAwNAorCS8qb3V0Ym91bmQgbWVzc2FnZSAwIHJlYWR5Ki8KKyNkZWZpbmUgQVJDTVNSX0hCQ01VX0lPUDJEUlZfTUVTU0FHRV9DTURfRE9ORQkJMHgwMDAwMDAwOAorCS8qb3V0Ym91bmQgbWVzc2FnZSBjbWQgaXNyIGRvb3IgYmVsbCBjbGVhciovCisjZGVmaW5lIEFSQ01TUl9IQkNNVV9JT1AyRFJWX01FU1NBR0VfQ01EX0RPTkVfRE9PUkJFTExfQ0xFQVIJMHgwMDAwMDAwOAorCS8qQVJDTVNSX0hCQU1VX01FU1NBR0VfRklSTVdBUkVfT0sqLworI2RlZmluZSBBUkNNU1JfSEJDTVVfTUVTU0FHRV9GSVJNV0FSRV9PSwkJCTB4ODAwMDAwMDAKIC8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgICBBUkVDQSBTQ1NJIENPTU1BTkQgREVTQ1JJUFRPUiBCTE9DSyBzaXplIDB4MUY4ICg1MDQpCkBAIC0yOTAsNyArMzUzLDcgQEAKICNkZWZpbmUgQVJDTVNSX0NEQl9GTEFHX0hFQURRICAgICAgICAgICAgICAweDA4CiAjZGVmaW5lIEFSQ01TUl9DREJfRkxBR19PUkRFUkVEUSAgICAgICAgICAgMHgxMAogCi0JdWludDhfdAkJCQkJCQlSZXNlcnZlZDE7CisJdWludDhfdAkJCQkJCQltc2dQYWdlczsKIAl1aW50MzJfdAkJCQkJCUNvbnRleHQ7CiAJdWludDMyX3QJCQkJCQlEYXRhTGVuZ3RoOwogCXVpbnQ4X3QJCQkJCQkJQ2RiWzE2XTsKQEAgLTMwMyw4ICszNjYsOCBAQAogCXVpbnQ4X3QJCQkJCQkJU2Vuc2VEYXRhWzE1XTsKIAl1bmlvbgogCXsKLQkJc3RydWN0IFNHMzJFTlRSWSAgICAgICAgICAgICAgICBzZzMyZW50cnlbQVJDTVNSX01BWF9TR19FTlRSSUVTXTsKLQkJc3RydWN0IFNHNjRFTlRSWSAgICAgICAgICAgICAgICBzZzY0ZW50cnlbQVJDTVNSX01BWF9TR19FTlRSSUVTXTsKKwkJc3RydWN0IFNHMzJFTlRSWSAgICAgICAgICAgICAgICBzZzMyZW50cnlbMV07CisJCXN0cnVjdCBTRzY0RU5UUlkgICAgICAgICAgICAgICAgc2c2NGVudHJ5WzFdOwogCX0gdTsKIH07CiAvKgpAQCAtMzQ0LDE1ICs0MDcsODkgQEAKIAl1aW50MzJfdAlkb25lX3FidWZmZXJbQVJDTVNSX01BWF9IQkJfUE9TVFFVRVVFXTsKIAl1aW50MzJfdAlwb3N0cV9pbmRleDsKIAl1aW50MzJfdAlkb25lcV9pbmRleDsKLQl1aW50MzJfdAkJX19pb21lbSAqZHJ2MmlvcF9kb29yYmVsbF9yZWc7Ci0JdWludDMyX3QJCV9faW9tZW0gKmRydjJpb3BfZG9vcmJlbGxfbWFza19yZWc7Ci0JdWludDMyX3QJCV9faW9tZW0gKmlvcDJkcnZfZG9vcmJlbGxfcmVnOwotCXVpbnQzMl90CQlfX2lvbWVtICppb3AyZHJ2X2Rvb3JiZWxsX21hc2tfcmVnOwotCXVpbnQzMl90CQlfX2lvbWVtICptc2djb2RlX3J3YnVmZmVyX3JlZzsKLQl1aW50MzJfdAkJX19pb21lbSAqaW9jdGxfd2J1ZmZlcl9yZWc7Ci0JdWludDMyX3QJCV9faW9tZW0gKmlvY3RsX3JidWZmZXJfcmVnOworCXVpbnQzMl90CQlfX2lvbWVtICpkcnYyaW9wX2Rvb3JiZWxsOworCXVpbnQzMl90CQlfX2lvbWVtICpkcnYyaW9wX2Rvb3JiZWxsX21hc2s7CisJdWludDMyX3QJCV9faW9tZW0gKmlvcDJkcnZfZG9vcmJlbGw7CisJdWludDMyX3QJCV9faW9tZW0gKmlvcDJkcnZfZG9vcmJlbGxfbWFzazsKKwl1aW50MzJfdAkJX19pb21lbSAqbWVzc2FnZV9yd2J1ZmZlcjsKKwl1aW50MzJfdAkJX19pb21lbSAqbWVzc2FnZV93YnVmZmVyOworCXVpbnQzMl90CQlfX2lvbWVtICptZXNzYWdlX3JidWZmZXI7CiB9OwotCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBMU0kKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3N0cnVjdCBNZXNzYWdlVW5pdF9DeworCXVpbnQzMl90CW1lc3NhZ2VfdW5pdF9zdGF0dXM7CQkJLyowMDAwIDAwMDMqLworCXVpbnQzMl90CXNsYXZlX2Vycm9yX2F0dHJpYnV0ZTsJCQkvKjAwMDQgMDAwNyovCisJdWludDMyX3QJc2xhdmVfZXJyb3JfYWRkcmVzczsJCQkvKjAwMDggMDAwQiovCisJdWludDMyX3QJcG9zdGVkX291dGJvdW5kX2Rvb3JiZWxsOwkJLyowMDBDIDAwMEYqLworCXVpbnQzMl90CW1hc3Rlcl9lcnJvcl9hdHRyaWJ1dGU7CQkJLyowMDEwIDAwMTMqLworCXVpbnQzMl90CW1hc3Rlcl9lcnJvcl9hZGRyZXNzX2xvdzsJCS8qMDAxNCAwMDE3Ki8KKwl1aW50MzJfdAltYXN0ZXJfZXJyb3JfYWRkcmVzc19oaWdoOwkJLyowMDE4IDAwMUIqLworCXVpbnQzMl90CWhjYl9zaXplOwkJCQkvKjAwMUMgMDAxRiovCisJdWludDMyX3QJaW5ib3VuZF9kb29yYmVsbDsJCQkvKjAwMjAgMDAyMyovCisJdWludDMyX3QJZGlhZ25vc3RpY19yd19kYXRhOwkJCS8qMDAyNCAwMDI3Ki8KKwl1aW50MzJfdAlkaWFnbm9zdGljX3J3X2FkZHJlc3NfbG93OwkJLyowMDI4IDAwMkIqLworCXVpbnQzMl90CWRpYWdub3N0aWNfcndfYWRkcmVzc19oaWdoOwkJLyowMDJDIDAwMkYqLworCXVpbnQzMl90CWhvc3RfaW50X3N0YXR1czsJCQkJLyowMDMwIDAwMzMqLworCXVpbnQzMl90CWhvc3RfaW50X21hc2s7CQkJCS8qMDAzNCAwMDM3Ki8KKwl1aW50MzJfdAlkY3JfZGF0YTsJCQkJLyowMDM4IDAwM0IqLworCXVpbnQzMl90CWRjcl9hZGRyZXNzOwkJCQkvKjAwM0MgMDAzRiovCisJdWludDMyX3QJaW5ib3VuZF9xdWV1ZXBvcnQ7CQkJLyowMDQwIDAwNDMqLworCXVpbnQzMl90CW91dGJvdW5kX3F1ZXVlcG9ydDsJCQkvKjAwNDQgMDA0NyovCisJdWludDMyX3QJaGNiX3BjaV9hZGRyZXNzX2xvdzsJCQkvKjAwNDggMDA0QiovCisJdWludDMyX3QJaGNiX3BjaV9hZGRyZXNzX2hpZ2g7CQkJLyowMDRDIDAwNEYqLworCXVpbnQzMl90CWlvcF9pbnRfc3RhdHVzOwkJCQkvKjAwNTAgMDA1MyovCisJdWludDMyX3QJaW9wX2ludF9tYXNrOwkJCQkvKjAwNTQgMDA1NyovCisJdWludDMyX3QJaW9wX2luYm91bmRfcXVldWVfcG9ydDsJCQkvKjAwNTggMDA1QiovCisJdWludDMyX3QJaW9wX291dGJvdW5kX3F1ZXVlX3BvcnQ7CQkvKjAwNUMgMDA1RiovCisJdWludDMyX3QJaW5ib3VuZF9mcmVlX2xpc3RfaW5kZXg7CQkJLyowMDYwIDAwNjMqLworCXVpbnQzMl90CWluYm91bmRfcG9zdF9saXN0X2luZGV4OwkJCS8qMDA2NCAwMDY3Ki8KKwl1aW50MzJfdAlvdXRib3VuZF9mcmVlX2xpc3RfaW5kZXg7CQkJLyowMDY4IDAwNkIqLworCXVpbnQzMl90CW91dGJvdW5kX3Bvc3RfbGlzdF9pbmRleDsJCQkvKjAwNkMgMDA2RiovCisJdWludDMyX3QJaW5ib3VuZF9kb29yYmVsbF9jbGVhcjsJCQkvKjAwNzAgMDA3MyovCisJdWludDMyX3QJaTJvX21lc3NhZ2VfdW5pdF9jb250cm9sOwkJCS8qMDA3NCAwMDc3Ki8KKwl1aW50MzJfdAlsYXN0X3VzZWRfbWVzc2FnZV9zb3VyY2VfYWRkcmVzc19sb3c7CS8qMDA3OCAwMDdCKi8KKwl1aW50MzJfdAlsYXN0X3VzZWRfbWVzc2FnZV9zb3VyY2VfYWRkcmVzc19oaWdoOwkvKjAwN0MgMDA3RiovCisJdWludDMyX3QJcHVsbF9tb2RlX2RhdGFfYnl0ZV9jb3VudFs0XTsJCS8qMDA4MCAwMDhGKi8KKwl1aW50MzJfdAltZXNzYWdlX2Rlc3RfYWRkcmVzc19pbmRleDsJCS8qMDA5MCAwMDkzKi8KKwl1aW50MzJfdAlkb25lX3F1ZXVlX25vdF9lbXB0eV9pbnRfY291bnRlcl90aW1lcjsJLyowMDk0IDAwOTcqLworCXVpbnQzMl90CXV0aWxpdHlfQV9pbnRfY291bnRlcl90aW1lcjsJCS8qMDA5OCAwMDlCKi8KKwl1aW50MzJfdAlvdXRib3VuZF9kb29yYmVsbDsJCQkvKjAwOUMgMDA5RiovCisJdWludDMyX3QJb3V0Ym91bmRfZG9vcmJlbGxfY2xlYXI7CQkJLyowMEEwIDAwQTMqLworCXVpbnQzMl90CW1lc3NhZ2Vfc291cmNlX2FkZHJlc3NfaW5kZXg7CQkvKjAwQTQgMDBBNyovCisJdWludDMyX3QJbWVzc2FnZV9kb25lX3F1ZXVlX2luZGV4OwkJLyowMEE4IDAwQUIqLworCXVpbnQzMl90CXJlc2VydmVkMDsJCQkJLyowMEFDIDAwQUYqLworCXVpbnQzMl90CWluYm91bmRfbXNnYWRkcjA7CQkJLyowMEIwIDAwQjMqLworCXVpbnQzMl90CWluYm91bmRfbXNnYWRkcjE7CQkJLyowMEI0IDAwQjcqLworCXVpbnQzMl90CW91dGJvdW5kX21zZ2FkZHIwOwkJCS8qMDBCOCAwMEJCKi8KKwl1aW50MzJfdAlvdXRib3VuZF9tc2dhZGRyMTsJCQkvKjAwQkMgMDBCRiovCisJdWludDMyX3QJaW5ib3VuZF9xdWV1ZXBvcnRfbG93OwkJCS8qMDBDMCAwMEMzKi8KKwl1aW50MzJfdAlpbmJvdW5kX3F1ZXVlcG9ydF9oaWdoOwkJCS8qMDBDNCAwMEM3Ki8KKwl1aW50MzJfdAlvdXRib3VuZF9xdWV1ZXBvcnRfbG93OwkJCS8qMDBDOCAwMENCKi8KKwl1aW50MzJfdAlvdXRib3VuZF9xdWV1ZXBvcnRfaGlnaDsJCS8qMDBDQyAwMENGKi8KKwl1aW50MzJfdAlpb3BfaW5ib3VuZF9xdWV1ZV9wb3J0X2xvdzsJCS8qMDBEMCAwMEQzKi8KKwl1aW50MzJfdAlpb3BfaW5ib3VuZF9xdWV1ZV9wb3J0X2hpZ2g7CQkvKjAwRDQgMDBENyovCisJdWludDMyX3QJaW9wX291dGJvdW5kX3F1ZXVlX3BvcnRfbG93OwkJLyowMEQ4IDAwREIqLworCXVpbnQzMl90CWlvcF9vdXRib3VuZF9xdWV1ZV9wb3J0X2hpZ2g7CQkvKjAwREMgMDBERiovCisJdWludDMyX3QJbWVzc2FnZV9kZXN0X3F1ZXVlX3BvcnRfbG93OwkJLyowMEUwIDAwRTMqLworCXVpbnQzMl90CW1lc3NhZ2VfZGVzdF9xdWV1ZV9wb3J0X2hpZ2g7CQkvKjAwRTQgMDBFNyovCisJdWludDMyX3QJbGFzdF91c2VkX21lc3NhZ2VfZGVzdF9hZGRyZXNzX2xvdzsJLyowMEU4IDAwRUIqLworCXVpbnQzMl90CWxhc3RfdXNlZF9tZXNzYWdlX2Rlc3RfYWRkcmVzc19oaWdoOwkvKjAwRUMgMDBFRiovCisJdWludDMyX3QJbWVzc2FnZV9kb25lX3F1ZXVlX2Jhc2VfYWRkcmVzc19sb3c7CS8qMDBGMCAwMEYzKi8KKwl1aW50MzJfdAltZXNzYWdlX2RvbmVfcXVldWVfYmFzZV9hZGRyZXNzX2hpZ2g7CS8qMDBGNCAwMEY3Ki8KKwl1aW50MzJfdAlob3N0X2RpYWdub3N0aWM7CQkJCS8qMDBGOCAwMEZCKi8KKwl1aW50MzJfdAl3cml0ZV9zZXF1ZW5jZTsJCQkJLyowMEZDIDAwRkYqLworCXVpbnQzMl90CXJlc2VydmVkMVszNF07CQkJCS8qMDEwMCAwMTg3Ki8KKwl1aW50MzJfdAlyZXNlcnZlZDJbMTk1MF07CQkJCS8qMDE4OCAxRkZGKi8KKwl1aW50MzJfdAltZXNzYWdlX3didWZmZXJbMzJdOwkJCS8qMjAwMCAyMDdGKi8KKwl1aW50MzJfdAlyZXNlcnZlZDNbMzJdOwkJCQkvKjIwODAgMjBGRiovCisJdWludDMyX3QJbWVzc2FnZV9yYnVmZmVyWzMyXTsJCQkvKjIxMDAgMjE3RiovCisJdWludDMyX3QJcmVzZXJ2ZWQ0WzMyXTsJCQkJLyoyMTgwIDIxRkYqLworCXVpbnQzMl90CW1zZ2NvZGVfcndidWZmZXJbMjU2XTsJCQkvKjIyMDAgMjNGRiovCit9OwogLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqICAgICAgICAgICAgICAgICBBZGFwdGVyIENvbnRyb2wgQmxvY2sKQEAgLTM3MCwxNCArNTA3LDIwIEBACiAJdW5zaWduZWQgbG9uZwkJCXZpcjJwaHlfb2Zmc2V0OwogCS8qIE9mZnNldCBpcyB1c2VkIGluIG1ha2luZyBhcmMgY2RiIHBoeXNpY2FsIHRvIHZpcnR1YWwgY2FsY3VsYXRpb25zICovCiAJdWludDMyX3QJCQlvdXRib3VuZF9pbnRfZW5hYmxlOwotCisJdWludDMyX3QJCQljZGJfcGh5YWRkcl9oaTMyOworCXVpbnQzMl90CQkJcmVnX211X2FjY19oYW5kbGUwOworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgICAgCQkJZWhfbG9jazsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIAkJCWNjYmxpc3RfbG9jazsKIAl1bmlvbiB7Ci0JCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKglwbXVBOwotCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqCQlwbXVCOworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpwbXVBOworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAJKnBtdUI7CisJCXN0cnVjdCBNZXNzYWdlVW5pdF9DIF9faW9tZW0gKnBtdUM7CiAJfTsKIAkvKiBtZXNzYWdlIHVuaXQgQVRVIGluYm91bmQgYmFzZSBhZGRyZXNzMCAqLwotCisJdm9pZCBfX2lvbWVtICptZW1fYmFzZTA7CisJdm9pZCBfX2lvbWVtICptZW1fYmFzZTE7CiAJdWludDMyX3QJCQlhY2JfZmxhZ3M7CisJdTE2CQkJZGV2X2lkOwogCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgCQlhZGFwdGVyX2luZGV4OwogCSNkZWZpbmUgQUNCX0ZfU0NTSVNUT1BBREFQVEVSICAgICAgICAgCTB4MDAwMQogCSNkZWZpbmUgQUNCX0ZfTVNHX1NUT1BfQkdSQiAgICAgCTB4MDAwMgpAQCAtMzkyLDggKzUzNSwxMSBAQAogCS8qIG1lc3NhZ2UgY2xlYXIgcnFidWZmZXIgKi8KIAkjZGVmaW5lIEFDQl9GX01FU1NBR0VfV1FCVUZGRVJfUkVBREVEICAgMHgwMDQwCiAJI2RlZmluZSBBQ0JfRl9CVVNfUkVTRVQgICAgICAgICAgICAgICAJMHgwMDgwCisJI2RlZmluZSBBQ0JfRl9CVVNfSEFOR19PTgkJMHgwODAwLyogbmVlZCBoYXJkd2FyZSByZXNldCBidXMgKi8KKwogCSNkZWZpbmUgQUNCX0ZfSU9QX0lOSVRFRCAgICAgICAgICAgICAgCTB4MDEwMAogCS8qIGlvcCBpbml0ICovCisJI2RlZmluZSBBQ0JfRl9BQk9SVAkJCQkweDAyMDAKIAkjZGVmaW5lIEFDQl9GX0ZJUk1XQVJFX1RSQVAgICAgICAgICAgIAkJMHgwNDAwCiAJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKgkJCXBjY2JfcG9vbFtBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNXTsKIAkvKiB1c2VkIGZvciBtZW1vcnkgZnJlZSAqLwpAQCAtNDA4LDcgKzU1NCw4IEBACiAJLyogZG1hX2NvaGVyZW50IHVzZWQgZm9yIG1lbW9yeSBmcmVlICovCiAJZG1hX2FkZHJfdAkJCWRtYV9jb2hlcmVudF9oYW5kbGU7CiAJLyogZG1hX2NvaGVyZW50X2hhbmRsZSB1c2VkIGZvciBtZW1vcnkgZnJlZSAqLwotCisJZG1hX2FkZHJfdAkJCQlkbWFfY29oZXJlbnRfaGFuZGxlX2hiYl9tdTsKKwl1bnNpZ25lZCBpbnQJCQkJdW5jYWNoZV9zaXplOwogCXVpbnQ4X3QJCQkJcnFidWZmZXJbQVJDTVNSX01BWF9RQlVGRkVSXTsKIAkvKiBkYXRhIGNvbGxlY3Rpb24gYnVmZmVyIGZvciByZWFkIGZyb20gODAzMzEgKi8KIAlpbnQzMl90CQkJCXJxYnVmX2ZpcnN0aW5kZXg7CkBAIC00MzIsMTQgKzU3OSwxOCBAQAogCXVpbnQzMl90CQkJZmlybV9udW1iZXJzX3F1ZXVlOwogCXVpbnQzMl90CQkJZmlybV9zZHJhbV9zaXplOwogCXVpbnQzMl90CQkJZmlybV9oZF9jaGFubmVsczsKLQljaGFyCQkJCWZpcm1fbW9kZWxbMTJdOwotCWNoYXIJCQkJZmlybV92ZXJzaW9uWzIwXTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIAlmaXJtX2NmZ192ZXJzaW9uOwkKKwljaGFyCQkJZmlybV9tb2RlbFsxMl07CisJY2hhcgkJCWZpcm1fdmVyc2lvblsyMF07CiAJY2hhcgkJCWRldmljZV9tYXBbMjBdOwkJCS8qMjEsODQtOTkqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCAJCWFyY21zcl9kb19tZXNzYWdlX2lzcl9iaDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJZXRlcm5hbF90aW1lcjsKLQl1bnNpZ25lZCBzaG9ydAkJZndfc3RhdGU7CisJdW5zaWduZWQgc2hvcnQJCWZ3X2ZsYWc7CisJCQkJI2RlZmluZQlGV19OT1JNQUwJMHgwMDAwCisJCQkJI2RlZmluZQlGV19CT0cJCTB4MDAwMQorCQkJCSNkZWZpbmUJRldfREVBRExPQ0sJMHgwMDEwCiAJYXRvbWljX3QgCQkJcnFfbWFwX3Rva2VuOwotCWludAkJCWFudGVfdG9rZW5fdmFsdWU7CisJYXRvbWljX3QJCQlhbnRlX3Rva2VuX3ZhbHVlOwogfTsvKiBIV19ERVZJQ0VfRVhURU5TSU9OICovCiAvKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDQ3LDY3ICs1OTgsMzMgQEAKICoqICAgICAgICAgICAgIHRoaXMgQ0NCIGxlbmd0aCBtdXN0IGJlIDMyIGJ5dGVzIGJvdW5kYXJ5CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwotc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sKLXsKLQlzdHJ1Y3QgQVJDTVNSX0NEQgkJYXJjbXNyX2NkYjsKLQkvKgotCSoqIDAtNTAzIChzaXplIG9mIENEQiA9IDUwNCk6Ci0JKiogYXJjbXNyIG1lc3NlbmdlciBzY3NpIGNvbW1hbmQgZGVzY3JpcHRvciBzaXplIDUwNCBieXRlcwotCSovCi0JdWludDMyX3QJCQljZGJfc2hpZnRlZF9waHlhZGRyOwotCS8qIDUwNC01MDcgKi8KLQl1aW50MzJfdAkJCXJlc2VydmVkMTsKLQkvKiA1MDgtNTExICovCi0jaWYgQklUU19QRVJfTE9ORyA9PSA2NAorc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2t7CisJLyp4MzI6c2l6ZW9mIHN0cnVjdF9DQ0I9KDMyKzYwKWJ5dGUsIHg2NDpzaXplb2Ygc3RydWN0X0NDQj0oNjQrNjApYnl0ZSovCisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsJCQkJLyp4MzI6IDhieXRlLCB4NjQ6IDE2Ynl0ZSovCisJc3RydWN0IHNjc2lfY21uZAkJKnBjbWQ7CQkJCS8qOCBieXRlcyBwb2ludGVyIG9mIGxpbnV4IHNjc2kgY29tbWFuZCAqLworCXN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrCSphY2I7CQkJCS8qeDMyOiA0Ynl0ZSwgeDY0OiA4Ynl0ZSovCisJdWludDMyX3QJCQljZGJfcGh5YWRkcl9wYXR0ZXJuOwkJLyp4MzI6IDRieXRlLCB4NjQ6IDRieXRlKi8KKwl1aW50MzJfdAkJCWFyY19jZGJfc2l6ZTsJCQkvKngzMjo0Ynl0ZSx4NjQ6NGJ5dGUqLworCXVpbnQxNl90CQkJY2NiX2ZsYWdzOwkJCS8qeDMyOiAyYnl0ZSwgeDY0OiAyYnl0ZSovCisJI2RlZmluZQkJCUNDQl9GTEFHX1JFQUQJCQkweDAwMDAKKwkjZGVmaW5lCQkJQ0NCX0ZMQUdfV1JJVEUJCTB4MDAwMQorCSNkZWZpbmUJCQlDQ0JfRkxBR19FUlJPUgkJMHgwMDAyCisJI2RlZmluZQkJCUNDQl9GTEFHX0ZMVVNIQ0FDSEUJCTB4MDAwNAorCSNkZWZpbmUJCQlDQ0JfRkxBR19NQVNURVJfQUJPUlRFRAkweDAwMDgJCisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAJc3RhcnRkb25lOwkJCS8qeDMyOjJieXRlLHgzMjoyYnl0ZSovCisJI2RlZmluZQkJCUFSQ01TUl9DQ0JfRE9ORSAgIAkgICAgICAgIAkweDAwMDAKKwkjZGVmaW5lCQkJQVJDTVNSX0NDQl9TVEFSVAkJMHg1NUFBCisJI2RlZmluZQkJCUFSQ01TUl9DQ0JfQUJPUlRFRAkJMHhBQTU1CisJI2RlZmluZQkJCUFSQ01TUl9DQ0JfSUxMRUdBTAkJMHhGRkZGCisJI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKIAkvKiAgPT09PT09PT09PT09PT09PT09PT09PTUxMis2NCBieXRlcz09PT09PT09PT09PT09PT09PT09PT09PSAgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwotCS8qIDUxMi01MjcgMTYgYnl0ZXMgbmV4dC9wcmV2IHB0cnMgZm9yIGNjYiBsaXN0cyAqLwotCXN0cnVjdCBzY3NpX2NtbmQgKgkJcGNtZDsKLQkvKiA1MjgtNTM1IDggYnl0ZXMgcG9pbnRlciBvZiBsaW51eCBzY3NpIGNvbW1hbmQgKi8KLQlzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqCWFjYjsKLQkvKiA1MzYtNTQzIDggYnl0ZXMgcG9pbnRlciBvZiBhY2IgKi8KLQotCXVpbnQxNl90CQkJY2NiX2ZsYWdzOwotCS8qIDU0NC01NDUgKi8KLQkjZGVmaW5lCQlDQ0JfRkxBR19SRUFECQkJMHgwMDAwCi0JI2RlZmluZQkJQ0NCX0ZMQUdfV1JJVEUJCQkweDAwMDEKLQkjZGVmaW5lCQlDQ0JfRkxBR19FUlJPUgkJCTB4MDAwMgotCSNkZWZpbmUJCUNDQl9GTEFHX0ZMVVNIQ0FDSEUJCTB4MDAwNAotCSNkZWZpbmUJCUNDQl9GTEFHX01BU1RFUl9BQk9SVEVECQkweDAwMDgKLQl1aW50MTZfdAkJCXN0YXJ0ZG9uZTsKLQkvKiA1NDYtNTQ3ICovCi0JI2RlZmluZQkJQVJDTVNSX0NDQl9ET05FCQkJMHgwMDAwCi0JI2RlZmluZQkJQVJDTVNSX0NDQl9TVEFSVAkJMHg1NUFBCi0JI2RlZmluZQkJQVJDTVNSX0NDQl9BQk9SVEVECQkweEFBNTUKLQkjZGVmaW5lCQlBUkNNU1JfQ0NCX0lMTEVHQUwJCTB4RkZGRgotCXVpbnQzMl90CQkJcmVzZXJ2ZWQyWzddOwotCS8qIDU0OC01NTEgNTUyLTU1NSA1NTYtNTU5IDU2MC01NjMgNTY0LTU2NyA1NjgtNTcxIDU3Mi01NzUgKi8KLSNlbHNlCisJCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgCXJlc2VydmVkWzVdOwkJLyoyNCBieXRlKi8KKwkjZWxzZQogCS8qICA9PT09PT09PT09PT09PT09PT09PT09NTEyKzMyIGJ5dGVzPT09PT09PT09PT09PT09PT09PT09PT09ICAqLwotCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Ci0JLyogNTEyLTUxOSA4IGJ5dGVzIG5leHQvcHJldiBwdHJzIGZvciBjY2IgbGlzdHMgKi8KLQlzdHJ1Y3Qgc2NzaV9jbW5kICoJCXBjbWQ7Ci0JLyogNTIwLTUyMyA0IGJ5dGVzIHBvaW50ZXIgb2YgbGludXggc2NzaSBjb21tYW5kICovCi0Jc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKglhY2I7Ci0JLyogNTI0LTUyNyA0IGJ5dGVzIHBvaW50ZXIgb2YgYWNiICovCi0KLQl1aW50MTZfdAkJCWNjYl9mbGFnczsKLQkvKiA1MjgtNTI5ICovCi0JI2RlZmluZQkJQ0NCX0ZMQUdfUkVBRAkJCTB4MDAwMAotCSNkZWZpbmUJCUNDQl9GTEFHX1dSSVRFCQkJMHgwMDAxCi0JI2RlZmluZQkJQ0NCX0ZMQUdfRVJST1IJCQkweDAwMDIKLQkjZGVmaW5lCQlDQ0JfRkxBR19GTFVTSENBQ0hFCQkweDAwMDQKLQkjZGVmaW5lCQlDQ0JfRkxBR19NQVNURVJfQUJPUlRFRAkJMHgwMDA4Ci0JdWludDE2X3QJCQlzdGFydGRvbmU7Ci0JLyogNTMwLTUzMSAqLwotCSNkZWZpbmUJCUFSQ01TUl9DQ0JfRE9ORQkJCTB4MDAwMAotCSNkZWZpbmUJCUFSQ01TUl9DQ0JfU1RBUlQJCTB4NTVBQQotCSNkZWZpbmUJCUFSQ01TUl9DQ0JfQUJPUlRFRAkJMHhBQTU1Ci0JI2RlZmluZQkJQVJDTVNSX0NDQl9JTExFR0FMCQkweEZGRkYKLQl1aW50MzJfdAkJCXJlc2VydmVkMlszXTsKLQkvKiA1MzItNTM1IDUzNi01MzkgNTQwLTU0MyAqLwotI2VuZGlmCi0JLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICovCisJCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgCXJlc2VydmVkOwkJLyo4ICBieXRlKi8KKwkjZW5kaWYKKwkvKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICovCisJc3RydWN0IEFSQ01TUl9DREIJCWFyY21zcl9jZGI7CiB9OwogLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2F0dHIuYwppbmRleCAwN2ZkZmU1Li5hNGUwNGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfYXR0ci5jCkBAIC0xOTIsNyArMTkyLDYgQEAKIAkuYXR0ciA9IHsKIAkJLm5hbWUgPSAibXVfcmVhZCIsCiAJCS5tb2RlID0gU19JUlVTUiAsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnNpemUgPSAxMDMyLAogCS5yZWFkID0gYXJjbXNyX3N5c2ZzX2lvcF9tZXNzYWdlX3JlYWQsCkBAIC0yMDIsNyArMjAxLDYgQEAKIAkuYXR0ciA9IHsKIAkJLm5hbWUgPSAibXVfd3JpdGUiLAogCQkubW9kZSA9IFNfSVdVU1IsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnNpemUgPSAxMDMyLAogCS53cml0ZSA9IGFyY21zcl9zeXNmc19pb3BfbWVzc2FnZV93cml0ZSwKQEAgLTIxMiw3ICsyMTAsNiBAQAogCS5hdHRyID0gewogCQkubmFtZSA9ICJtdV9jbGVhciIsCiAJCS5tb2RlID0gU19JV1VTUiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAkuc2l6ZSA9IDEsCiAJLndyaXRlID0gYXJjbXNyX3N5c2ZzX2lvcF9tZXNzYWdlX2NsZWFyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMgYi9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYwppbmRleCBmZmE1NDc5Li45NWE4OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYworKysgYi9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYwpAQCAtNTgsNyArNTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC03MSwyMCArNzAsMTMgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CiAjaW5jbHVkZSAiYXJjbXNyLmgiCi0KLSNpZmRlZiBDT05GSUdfU0NTSV9BUkNNU1JfUkVTRVQKLQlzdGF0aWMgaW50IHNsZWVwdGltZSA9IDIwOwotCXN0YXRpYyBpbnQgcmV0cnljb3VudCA9IDEyOwotCW1vZHVsZV9wYXJhbShzbGVlcHRpbWUsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKLQlNT0RVTEVfUEFSTV9ERVNDKHNsZWVwdGltZSwgIlRoZSB3YWl0aW5nIHBlcmlvZCBmb3IgRlcgcmVhZHkgd2hpbGUgYnVzIHJlc2V0Iik7Ci0JbW9kdWxlX3BhcmFtKHJldHJ5Y291bnQsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKLQlNT0RVTEVfUEFSTV9ERVNDKHJldHJ5Y291bnQsICJUaGUgcmV0cnkgY291bnQgZm9yIEZXIHJlYWR5IHdoaWxlIGJ1cyByZXNldCIpOwotI2VuZGlmCi1NT0RVTEVfQVVUSE9SKCJFcmljaCBDaGVuIDxzdXBwb3J0QGFyZWNhLmNvbS50dz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQVJFQ0EgKEFSQzExeHgvMTJ4eC8xM3h4LzE2eHgpIFNBVEEvU0FTIFJBSUQgSG9zdCBCdXMgQWRhcHRlciIpOworTU9EVUxFX0FVVEhPUigiTmljayBDaGVuZyA8c3VwcG9ydEBhcmVjYS5jb20udHc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFSRUNBIChBUkMxMXh4LzEyeHgvMTZ4eC8xODgwKSBTQVRBL1NBUyBSQUlEIEhvc3QgQnVzIEFkYXB0ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIE1PRFVMRV9WRVJTSU9OKEFSQ01TUl9EUklWRVJfVkVSU0lPTik7Ci0KK3N0YXRpYyBpbnQgc2xlZXB0aW1lID0gMTA7CitzdGF0aWMgaW50IHJldHJ5Y291bnQgPSAzMDsKK3dhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsKIHN0YXRpYyBpbnQgYXJjbXNyX2lvcF9tZXNzYWdlX3hmZXIoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwKIAkJCQkJc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHN0YXRpYyBpbnQgYXJjbXNyX2lvcF9jb25maXJtKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpOwpAQCAtMTA3LDEwICs5OSwxMiBAQAogc3RhdGljIHZvaWQgYXJjbXNyX3JlcXVlc3RfZGV2aWNlX21hcCh1bnNpZ25lZCBsb25nIHBhY2IpOwogc3RhdGljIHZvaWQgYXJjbXNyX3JlcXVlc3RfaGJhX2RldmljZV9tYXAoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYik7CiBzdGF0aWMgdm9pZCBhcmNtc3JfcmVxdWVzdF9oYmJfZGV2aWNlX21hcChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKTsKK3N0YXRpYyB2b2lkIGFyY21zcl9yZXF1ZXN0X2hiY19kZXZpY2VfbWFwKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpOwogc3RhdGljIHZvaWQgYXJjbXNyX21lc3NhZ2VfaXNyX2JoX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1zdGF0aWMgdm9pZCAqYXJjbXNyX2dldF9maXJtd2FyZV9zcGVjKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsIGludCBtb2RlKTsKK3N0YXRpYyBib29sIGFyY21zcl9nZXRfZmlybXdhcmVfc3BlYyhzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKTsKIHN0YXRpYyB2b2lkIGFyY21zcl9zdGFydF9hZGFwdGVyX2JncmIoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYik7Ci0KK3N0YXRpYyB2b2lkIGFyY21zcl9oYmNfbWVzc2FnZV9pc3Ioc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKnBBQ0IpOworc3RhdGljIHZvaWQgYXJjbXNyX2hhcmR3YXJlX3Jlc2V0KHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpOwogc3RhdGljIGNvbnN0IGNoYXIgKmFyY21zcl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CiBzdGF0aWMgaXJxcmV0dXJuX3QgYXJjbXNyX2ludGVycnVwdChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKTsKIHN0YXRpYyBpbnQgYXJjbXNyX2FkanVzdF9kaXNrX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKQEAgLTEyNywxOCArMTIxLDE4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFyY21zcl9zY3NpX2hvc3RfdGVtcGxhdGUgPSB7CiAJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCQk9ICJBUkNNU1IgQVJFQ0EgU0FUQS9TQVMgUkFJRCBIb3N0IEJ1cyBBZGFwdGVyIgotCQkJCQkJCUFSQ01TUl9EUklWRVJfVkVSU0lPTiwKKwkubmFtZQkJCT0gIkFSQ01TUiBBUkVDQSBTQVRBL1NBUyBSQUlEIENvbnRyb2xsZXIiCisJCQkJQVJDTVNSX0RSSVZFUl9WRVJTSU9OLAogCS5pbmZvCQkJPSBhcmNtc3JfaW5mbywKIAkucXVldWVjb21tYW5kCQk9IGFyY21zcl9xdWV1ZV9jb21tYW5kLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gYXJjbXNyX2Fib3J0LAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IGFyY21zcl9hYm9ydCwKIAkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhcmNtc3JfYnVzX3Jlc2V0LAogCS5iaW9zX3BhcmFtCQk9IGFyY21zcl9iaW9zX3BhcmFtLAogCS5jaGFuZ2VfcXVldWVfZGVwdGgJPSBhcmNtc3JfYWRqdXN0X2Rpc2tfcXVldWVfZGVwdGgsCi0JLmNhbl9xdWV1ZQkJPSBBUkNNU1JfTUFYX09VVFNUQU5ESU5HX0NNRCwKLQkudGhpc19pZAkJPSBBUkNNU1JfU0NTSV9JTklUSUFUT1JfSUQsCi0JLnNnX3RhYmxlc2l6ZQkJPSBBUkNNU1JfTUFYX1NHX0VOVFJJRVMsCi0JLm1heF9zZWN0b3JzICAgIAk9IEFSQ01TUl9NQVhfWEZFUl9TRUNUT1JTLAorCS5jYW5fcXVldWUJCT0gQVJDTVNSX01BWF9GUkVFQ0NCX05VTSwKKwkudGhpc19pZAkJCT0gQVJDTVNSX1NDU0lfSU5JVElBVE9SX0lELAorCS5zZ190YWJsZXNpemUJICAgICAgICAJPSBBUkNNU1JfREVGQVVMVF9TR19FTlRSSUVTLCAKKwkubWF4X3NlY3RvcnMgICAgCSAgICAJPSBBUkNNU1JfTUFYX1hGRVJfU0VDVE9SU19DLCAKIAkuY21kX3Blcl9sdW4JCT0gQVJDTVNSX01BWF9DTURfUEVSTFVOLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuc2hvc3RfYXR0cnMJCT0gYXJjbXNyX2hvc3RfYXR0cnMsCkBAIC0xNjIsMjYgKzE1NiwxMjUgQEAKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSRUNBLCBQQ0lfREVWSUNFX0lEX0FSRUNBXzEzODEpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSRUNBLCBQQ0lfREVWSUNFX0lEX0FSRUNBXzE2ODApfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSRUNBLCBQQ0lfREVWSUNFX0lEX0FSRUNBXzE2ODEpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSRUNBLCBQQ0lfREVWSUNFX0lEX0FSRUNBXzE4ODApfSwKIAl7MCwgMH0sIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFyY21zcl9kZXZpY2VfaWRfdGFibGUpOwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFyY21zcl9wY2lfZHJpdmVyID0gewogCS5uYW1lCQkJPSAiYXJjbXNyIiwKLQkuaWRfdGFibGUJCT0gYXJjbXNyX2RldmljZV9pZF90YWJsZSwKKwkuaWRfdGFibGUJCQk9IGFyY21zcl9kZXZpY2VfaWRfdGFibGUsCiAJLnByb2JlCQkJPSBhcmNtc3JfcHJvYmUsCiAJLnJlbW92ZQkJCT0gYXJjbXNyX3JlbW92ZSwKIAkuc2h1dGRvd24JCT0gYXJjbXNyX3NodXRkb3duLAogfTsKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworaW50IGFyY21zcl9zbGVlcF9mb3JfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwkJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBOVUxMOworCQlpbnQgaSwgaXNsZWVwOworCQlzaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCQlpc2xlZXAgPSBzbGVlcHRpbWUgLyAxMDsKKwkJaWYgKGlzbGVlcCA+IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBpc2xlZXA7IGkrKykgeworCQkJCW1zbGVlcCgxMDAwMCk7CisJCQl9CisJCX0KKworCQlpc2xlZXAgPSBzbGVlcHRpbWUgJSAxMDsKKwkJaWYgKGlzbGVlcCA+IDApIHsKKwkJCW1zbGVlcChpc2xlZXAqMTAwMCk7CisJCX0KKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ3YWtlLXVwXG4iKTsKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyY21zcl9mcmVlX2hiYl9tdShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQoreworCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQToKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzoKKwkJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6eworCQlkbWFfZnJlZV9jb2hlcmVudCgmYWNiLT5wZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IE1lc3NhZ2VVbml0X0IpLAorCQkJYWNiLT5wbXVCLCBhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGVfaGJiX211KTsKKwl9CisJfQorfQorCitzdGF0aWMgYm9vbCBhcmNtc3JfcmVtYXBfcGNpcmVnaW9uKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhY2ItPnBkZXY7CisJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSl7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6eworCQlhY2ItPnBtdUEgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsMCkpOworCQlpZiAoIWFjYi0+cG11QSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogbWVtb3J5IG1hcHBpbmcgcmVnaW9uIGZhaWwgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjp7CisJCXZvaWQgX19pb21lbSAqbWVtX2Jhc2UwLCAqbWVtX2Jhc2UxOworCQltZW1fYmFzZTAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJCWlmICghbWVtX2Jhc2UwKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBtZW1vcnkgbWFwcGluZyByZWdpb24gZmFpbCBcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJbWVtX2Jhc2UxID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCQlpZiAoIW1lbV9iYXNlMSkgeworCQkJaW91bm1hcChtZW1fYmFzZTApOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogbWVtb3J5IG1hcHBpbmcgcmVnaW9uIGZhaWwgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWFjYi0+bWVtX2Jhc2UwID0gbWVtX2Jhc2UwOworCQlhY2ItPm1lbV9iYXNlMSA9IG1lbV9iYXNlMTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9DOnsKKwkJYWNiLT5wbXVDID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CisJCWlmICghYWNiLT5wbXVDKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBtZW1vcnkgbWFwcGluZyByZWdpb24gZmFpbCBcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHJlYWRsKCZhY2ItPnBtdUMtPm91dGJvdW5kX2Rvb3JiZWxsKSAmIEFSQ01TUl9IQkNNVV9JT1AyRFJWX01FU1NBR0VfQ01EX0RPTkUpIHsKKwkJCXdyaXRlbChBUkNNU1JfSEJDTVVfSU9QMkRSVl9NRVNTQUdFX0NNRF9ET05FX0RPT1JCRUxMX0NMRUFSLCAmYWNiLT5wbXVDLT5vdXRib3VuZF9kb29yYmVsbF9jbGVhcik7LypjbGVhciBpbnRlcnJ1cHQqLworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJYnJlYWs7CisJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXJjbXNyX3VubWFwX3BjaXJlZ2lvbihzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQoreworCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTp7CisJCWlvdW5tYXAoYWNiLT5wbXVBKTsKKwl9CisJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6eworCQlpb3VubWFwKGFjYi0+bWVtX2Jhc2UwKTsKKwkJaW91bm1hcChhY2ItPm1lbV9iYXNlMSk7CisJfQorCisJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6eworCQlpb3VubWFwKGFjYi0+cG11Qyk7CisJfQorCX0KK30KIAogc3RhdGljIGlycXJldHVybl90IGFyY21zcl9kb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCWlycXJldHVybl90IGhhbmRsZV9zdGF0ZTsKIAlzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiID0gZGV2X2lkOwogCi0Jc3Bpbl9sb2NrKGFjYi0+aG9zdC0+aG9zdF9sb2NrKTsKIAloYW5kbGVfc3RhdGUgPSBhcmNtc3JfaW50ZXJydXB0KGFjYik7Ci0Jc3Bpbl91bmxvY2soYWNiLT5ob3N0LT5ob3N0X2xvY2spOwotCiAJcmV0dXJuIGhhbmRsZV9zdGF0ZTsKIH0KIApAQCAtMjE4LDE4MSArMzExLDIyOCBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWNiLT5wZGV2OwogCXUxNiBkZXZfaWQ7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0RFVklDRV9JRCwgJmRldl9pZCk7CisJYWNiLT5kZXZfaWQgPSBkZXZfaWQ7CiAJc3dpdGNoIChkZXZfaWQpIHsKLQljYXNlIDB4MTIwMSA6IHsKKwljYXNlIDB4MTg4MDogeworCQlhY2ItPmFkYXB0ZXJfdHlwZSA9IEFDQl9BREFQVEVSX1RZUEVfQzsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4MTIwMTogewogCQlhY2ItPmFkYXB0ZXJfdHlwZSA9IEFDQl9BREFQVEVSX1RZUEVfQjsKIAkJfQogCQlicmVhazsKIAotCWRlZmF1bHQgOiBhY2ItPmFkYXB0ZXJfdHlwZSA9IEFDQl9BREFQVEVSX1RZUEVfQTsKKwlkZWZhdWx0OiBhY2ItPmFkYXB0ZXJfdHlwZSA9IEFDQl9BREFQVEVSX1RZUEVfQTsKKwl9Cit9CQorCitzdGF0aWMgdWludDhfdCBhcmNtc3JfaGJhX3dhaXRfbXNnaW50X3JlYWR5KHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCit7CisJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcmVnID0gYWNiLT5wbXVBOworCXVpbnQzMl90IEluZGV4OworCXVpbnQ4X3QgUmV0cmllcyA9IDB4MDA7CisJZG8geworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCAxMDA7IEluZGV4KyspIHsKKwkJCWlmIChyZWFkbCgmcmVnLT5vdXRib3VuZF9pbnRzdGF0dXMpICYKKwkJCQkJQVJDTVNSX01VX09VVEJPVU5EX01FU1NBR0UwX0lOVCkgeworCQkJCXdyaXRlbChBUkNNU1JfTVVfT1VUQk9VTkRfTUVTU0FHRTBfSU5ULAorCQkJCQkmcmVnLT5vdXRib3VuZF9pbnRzdGF0dXMpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJbXNsZWVwKDEwKTsKKwkJfS8qbWF4IDEgc2Vjb25kcyovCisKKwl9IHdoaWxlIChSZXRyaWVzKysgPCAyMCk7LyptYXggMjAgc2VjKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB1aW50OF90IGFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKK3sKKwlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOworCXVpbnQzMl90IEluZGV4OworCXVpbnQ4X3QgUmV0cmllcyA9IDB4MDA7CisJZG8geworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCAxMDA7IEluZGV4KyspIHsKKwkJCWlmIChyZWFkbChyZWctPmlvcDJkcnZfZG9vcmJlbGwpCisJCQkJJiBBUkNNU1JfSU9QMkRSVl9NRVNTQUdFX0NNRF9ET05FKSB7CisJCQkJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX0lOVF9DTEVBUl9QQVRURVJOCisJCQkJCSwgcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsKTsKKwkJCQl3cml0ZWwoQVJDTVNSX0RSVjJJT1BfRU5EX09GX0lOVEVSUlVQVCwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCW1zbGVlcCgxMCk7CisJCX0vKm1heCAxIHNlY29uZHMqLworCisJfSB3aGlsZSAoUmV0cmllcysrIDwgMjApOy8qbWF4IDIwIHNlYyovCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdWludDhfdCBhcmNtc3JfaGJjX3dhaXRfbXNnaW50X3JlYWR5KHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICpwQUNCKQoreworCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpwaGJjbXUgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0MgKilwQUNCLT5wbXVDOworCXVuc2lnbmVkIGNoYXIgUmV0cmllcyA9IDB4MDA7CisJdWludDMyX3QgSW5kZXg7CisJZG8geworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCAxMDA7IEluZGV4KyspIHsKKwkJCWlmIChyZWFkbCgmcGhiY211LT5vdXRib3VuZF9kb29yYmVsbCkgJiBBUkNNU1JfSEJDTVVfSU9QMkRSVl9NRVNTQUdFX0NNRF9ET05FKSB7CisJCQkJd3JpdGVsKEFSQ01TUl9IQkNNVV9JT1AyRFJWX01FU1NBR0VfQ01EX0RPTkVfRE9PUkJFTExfQ0xFQVIsICZwaGJjbXUtPm91dGJvdW5kX2Rvb3JiZWxsX2NsZWFyKTsvKmNsZWFyIGludGVycnVwdCovCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQkvKiBvbmUgdXMgZGVsYXkJKi8KKwkJCW1zbGVlcCgxMCk7CisJCX0gLyptYXggMSBzZWNvbmRzKi8KKwl9IHdoaWxlIChSZXRyaWVzKysgPCAyMCk7IC8qbWF4IDIwIHNlYyovCisJcmV0dXJuIGZhbHNlOworfQorc3RhdGljIHZvaWQgYXJjbXNyX2ZsdXNoX2hiYV9jYWNoZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQoreworCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QTsKKwlpbnQgcmV0cnlfY291bnQgPSAzMDsKKwl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfRkxVU0hfQ0FDSEUsICZyZWctPmluYm91bmRfbXNnYWRkcjApOworCWRvIHsKKwkJaWYgKGFyY21zcl9oYmFfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkKKwkJCWJyZWFrOworCQllbHNlIHsKKwkJCXJldHJ5X2NvdW50LS07CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiB3YWl0ICdmbHVzaCBhZGFwdGVyIGNhY2hlJyBcCisJCQl0aW1lb3V0LCByZXRyeSBjb3VudCBkb3duID0gJWQgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8sIHJldHJ5X2NvdW50KTsKKwkJfQorCX0gd2hpbGUgKHJldHJ5X2NvdW50ICE9IDApOworfQorCitzdGF0aWMgdm9pZCBhcmNtc3JfZmx1c2hfaGJiX2NhY2hlKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCit7CisJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKKwlpbnQgcmV0cnlfY291bnQgPSAzMDsKKwl3cml0ZWwoQVJDTVNSX01FU1NBR0VfRkxVU0hfQ0FDSEUsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJZG8geworCQlpZiAoYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKQorCQkJYnJlYWs7CisJCWVsc2UgeworCQkJcmV0cnlfY291bnQtLTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHdhaXQgJ2ZsdXNoIGFkYXB0ZXIgY2FjaGUnIFwKKwkJCXRpbWVvdXQscmV0cnkgY291bnQgZG93biA9ICVkIFxuIiwgYWNiLT5ob3N0LT5ob3N0X25vLCByZXRyeV9jb3VudCk7CisJCX0KKwl9IHdoaWxlIChyZXRyeV9jb3VudCAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgYXJjbXNyX2ZsdXNoX2hiY19jYWNoZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqcEFDQikKK3sKKwlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqcmVnID0gKHN0cnVjdCBNZXNzYWdlVW5pdF9DICopcEFDQi0+cG11QzsKKwlpbnQgcmV0cnlfY291bnQgPSAzMDsvKiBlbmxhcmdlIHdhaXQgZmx1c2ggYWRhcHRlciBjYWNoZSB0aW1lOiAxMCBtaW51dGUgKi8KKwl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfRkxVU0hfQ0FDSEUsICZyZWctPmluYm91bmRfbXNnYWRkcjApOworCXdyaXRlbChBUkNNU1JfSEJDTVVfRFJWMklPUF9NRVNTQUdFX0NNRF9ET05FLCAmcmVnLT5pbmJvdW5kX2Rvb3JiZWxsKTsKKwlkbyB7CisJCWlmIChhcmNtc3JfaGJjX3dhaXRfbXNnaW50X3JlYWR5KHBBQ0IpKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXJldHJ5X2NvdW50LS07CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiB3YWl0ICdmbHVzaCBhZGFwdGVyIGNhY2hlJyBcCisJCQl0aW1lb3V0LHJldHJ5IGNvdW50IGRvd24gPSAlZCBcbiIsIHBBQ0ItPmhvc3QtPmhvc3Rfbm8sIHJldHJ5X2NvdW50KTsKKwkJfQorCX0gd2hpbGUgKHJldHJ5X2NvdW50ICE9IDApOworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIGFyY21zcl9mbHVzaF9hZGFwdGVyX2NhY2hlKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCit7CisJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgeworCisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKKwkJYXJjbXNyX2ZsdXNoX2hiYV9jYWNoZShhY2IpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKKwkJYXJjbXNyX2ZsdXNoX2hiYl9jYWNoZShhY2IpOworCQl9CisJCWJyZWFrOworCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9DOiB7CisJCWFyY21zcl9mbHVzaF9oYmNfY2FjaGUoYWNiKTsKKwkJfQogCX0KIH0KIAogc3RhdGljIGludCBhcmNtc3JfYWxsb2NfY2NiX3Bvb2woc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFjYi0+cGRldjsKKwl2b2lkICpkbWFfY29oZXJlbnQ7CisJZG1hX2FkZHJfdCBkbWFfY29oZXJlbnRfaGFuZGxlOworCXN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2JfdG1wOworCWludCBpID0gMCwgaiA9IDA7CisJZG1hX2FkZHJfdCBjZGJfcGh5YWRkcjsKKwl1bnNpZ25lZCBsb25nIHJvdW5kdXBfY2Nic2l6ZSA9IDAsIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1heF94ZmVyX2xlbjsKKwl1bnNpZ25lZCBsb25nIG1heF9zZ19lbnRyeXM7CisJdWludDMyX3QgIGZpcm1fY29uZmlnX3ZlcnNpb247CisJZm9yIChpID0gMDsgaSA8IEFSQ01TUl9NQVhfVEFSR0VUSUQ7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEFSQ01TUl9NQVhfVEFSR0VUTFVOOyBqKyspCisJCQlhY2ItPmRldnN0YXRlW2ldW2pdID0gQVJFQ0FfUkFJRF9HT05FOwogCi0Jc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewotCi0JY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhY2ItPnBkZXY7Ci0JCXZvaWQgKmRtYV9jb2hlcmVudDsKLQkJZG1hX2FkZHJfdCBkbWFfY29oZXJlbnRfaGFuZGxlLCBkbWFfYWRkcjsKLQkJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKmNjYl90bXA7Ci0JCWludCBpLCBqOwotCi0JCWFjYi0+cG11QSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQkJaWYgKCFhY2ItPnBtdUEpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IG1lbW9yeSBtYXBwaW5nIHJlZ2lvbiBmYWlsIFxuIiwKLQkJCQkJCQlhY2ItPmhvc3QtPmhvc3Rfbm8pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlkbWFfY29oZXJlbnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKLQkJCUFSQ01TUl9NQVhfRlJFRUNDQl9OVU0gKgotCQkJc2l6ZW9mIChzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaykgKyAweDIwLAotCQkJJmRtYV9jb2hlcmVudF9oYW5kbGUsIEdGUF9LRVJORUwpOwotCi0JCWlmICghZG1hX2NvaGVyZW50KSB7Ci0JCQlpb3VubWFwKGFjYi0+cG11QSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWFjYi0+ZG1hX2NvaGVyZW50ID0gZG1hX2NvaGVyZW50OwotCQlhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUgPSBkbWFfY29oZXJlbnRfaGFuZGxlOwotCi0JCWlmICgoKHVuc2lnbmVkIGxvbmcpZG1hX2NvaGVyZW50ICYgMHgxRikpIHsKLQkJCWRtYV9jb2hlcmVudCA9IGRtYV9jb2hlcmVudCArCi0JCQkJKDB4MjAgLSAoKHVuc2lnbmVkIGxvbmcpZG1hX2NvaGVyZW50ICYgMHgxRikpOwotCQkJZG1hX2NvaGVyZW50X2hhbmRsZSA9IGRtYV9jb2hlcmVudF9oYW5kbGUgKwotCQkJCSgweDIwIC0gKCh1bnNpZ25lZCBsb25nKWRtYV9jb2hlcmVudF9oYW5kbGUgJiAweDFGKSk7Ci0JCX0KLQotCQlkbWFfYWRkciA9IGRtYV9jb2hlcmVudF9oYW5kbGU7Ci0JCWNjYl90bXAgPSAoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKilkbWFfY29oZXJlbnQ7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNOyBpKyspIHsKLQkJCWNjYl90bXAtPmNkYl9zaGlmdGVkX3BoeWFkZHIgPSBkbWFfYWRkciA+PiA1OwotCQkJY2NiX3RtcC0+YWNiID0gYWNiOwotCQkJYWNiLT5wY2NiX3Bvb2xbaV0gPSBjY2JfdG1wOwotCQkJbGlzdF9hZGRfdGFpbCgmY2NiX3RtcC0+bGlzdCwgJmFjYi0+Y2NiX2ZyZWVfbGlzdCk7Ci0JCQlkbWFfYWRkciA9IGRtYV9hZGRyICsgc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKTsKLQkJCWNjYl90bXArKzsKLQkJfQotCi0JCWFjYi0+dmlyMnBoeV9vZmZzZXQgPSAodW5zaWduZWQgbG9uZyljY2JfdG1wIC0odW5zaWduZWQgbG9uZylkbWFfYWRkcjsKLQkJZm9yIChpID0gMDsgaSA8IEFSQ01TUl9NQVhfVEFSR0VUSUQ7IGkrKykKLQkJCWZvciAoaiA9IDA7IGogPCBBUkNNU1JfTUFYX1RBUkdFVExVTjsgaisrKQotCQkJCWFjYi0+ZGV2c3RhdGVbaV1bal0gPSBBUkVDQV9SQUlEX0dPTkU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjogewotCi0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWNiLT5wZGV2OwotCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnOwotCQl2b2lkIF9faW9tZW0gKm1lbV9iYXNlMCwgKm1lbV9iYXNlMTsKLQkJdm9pZCAqZG1hX2NvaGVyZW50OwotCQlkbWFfYWRkcl90IGRtYV9jb2hlcmVudF9oYW5kbGUsIGRtYV9hZGRyOwotCQlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiX3RtcDsKLQkJaW50IGksIGo7Ci0KLQkJZG1hX2NvaGVyZW50ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsCi0JCQkoKEFSQ01TUl9NQVhfRlJFRUNDQl9OVU0gKgotCQkJc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKSArIDB4MjApICsKLQkJCXNpemVvZihzdHJ1Y3QgTWVzc2FnZVVuaXRfQikpLAotCQkJJmRtYV9jb2hlcmVudF9oYW5kbGUsIEdGUF9LRVJORUwpOwotCQlpZiAoIWRtYV9jb2hlcmVudCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWFjYi0+ZG1hX2NvaGVyZW50ID0gZG1hX2NvaGVyZW50OwotCQlhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUgPSBkbWFfY29oZXJlbnRfaGFuZGxlOwotCi0JCWlmICgoKHVuc2lnbmVkIGxvbmcpZG1hX2NvaGVyZW50ICYgMHgxRikpIHsKLQkJCWRtYV9jb2hlcmVudCA9IGRtYV9jb2hlcmVudCArCi0JCQkJKDB4MjAgLSAoKHVuc2lnbmVkIGxvbmcpZG1hX2NvaGVyZW50ICYgMHgxRikpOwotCQkJZG1hX2NvaGVyZW50X2hhbmRsZSA9IGRtYV9jb2hlcmVudF9oYW5kbGUgKwotCQkJCSgweDIwIC0gKCh1bnNpZ25lZCBsb25nKWRtYV9jb2hlcmVudF9oYW5kbGUgJiAweDFGKSk7Ci0JCX0KLQotCQlkbWFfYWRkciA9IGRtYV9jb2hlcmVudF9oYW5kbGU7Ci0JCWNjYl90bXAgPSAoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKilkbWFfY29oZXJlbnQ7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNOyBpKyspIHsKLQkJCWNjYl90bXAtPmNkYl9zaGlmdGVkX3BoeWFkZHIgPSBkbWFfYWRkciA+PiA1OwotCQkJY2NiX3RtcC0+YWNiID0gYWNiOwotCQkJYWNiLT5wY2NiX3Bvb2xbaV0gPSBjY2JfdG1wOwotCQkJbGlzdF9hZGRfdGFpbCgmY2NiX3RtcC0+bGlzdCwgJmFjYi0+Y2NiX2ZyZWVfbGlzdCk7Ci0JCQlkbWFfYWRkciA9IGRtYV9hZGRyICsgc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKTsKLQkJCWNjYl90bXArKzsKLQkJfQotCi0JCXJlZyA9IChzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqKShkbWFfY29oZXJlbnQgKwotCQlBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNICogc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKSk7Ci0JCWFjYi0+cG11QiA9IHJlZzsKLQkJbWVtX2Jhc2UwID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOwotCQlpZiAoIW1lbV9iYXNlMCkKLQkJCWdvdG8gb3V0OwotCi0JCW1lbV9iYXNlMSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAotCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKLQkJaWYgKCFtZW1fYmFzZTEpIHsKLQkJCWlvdW5tYXAobWVtX2Jhc2UwKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyA9IG1lbV9iYXNlMCArIEFSQ01TUl9EUlYySU9QX0RPT1JCRUxMOwotCQlyZWctPmRydjJpb3BfZG9vcmJlbGxfbWFza19yZWcgPSBtZW1fYmFzZTAgKwotCQkJCQkJQVJDTVNSX0RSVjJJT1BfRE9PUkJFTExfTUFTSzsKLQkJcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZyA9IG1lbV9iYXNlMCArIEFSQ01TUl9JT1AyRFJWX0RPT1JCRUxMOwotCQlyZWctPmlvcDJkcnZfZG9vcmJlbGxfbWFza19yZWcgPSBtZW1fYmFzZTAgKwotCQkJCQkJQVJDTVNSX0lPUDJEUlZfRE9PUkJFTExfTUFTSzsKLQkJcmVnLT5pb2N0bF93YnVmZmVyX3JlZyA9IG1lbV9iYXNlMSArIEFSQ01TUl9JT0NUTF9XQlVGRkVSOwotCQlyZWctPmlvY3RsX3JidWZmZXJfcmVnID0gbWVtX2Jhc2UxICsgQVJDTVNSX0lPQ1RMX1JCVUZGRVI7Ci0JCXJlZy0+bXNnY29kZV9yd2J1ZmZlcl9yZWcgPSBtZW1fYmFzZTEgKyBBUkNNU1JfTVNHQ09ERV9SV0JVRkZFUjsKLQotCQlhY2ItPnZpcjJwaHlfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpY2NiX3RtcCAtKHVuc2lnbmVkIGxvbmcpZG1hX2FkZHI7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUkNNU1JfTUFYX1RBUkdFVElEOyBpKyspCi0JCQlmb3IgKGogPSAwOyBqIDwgQVJDTVNSX01BWF9UQVJHRVRMVU47IGorKykKLQkJCQlhY2ItPmRldnN0YXRlW2ldW2pdID0gQVJFQ0FfUkFJRF9HT09EOwotCQl9Ci0JCWJyZWFrOworCW1heF94ZmVyX2xlbiA9IEFSQ01TUl9NQVhfWEZFUl9MRU47CisJbWF4X3NnX2VudHJ5cyA9IEFSQ01TUl9ERUZBVUxUX1NHX0VOVFJJRVM7CisJZmlybV9jb25maWdfdmVyc2lvbiA9IGFjYi0+ZmlybV9jZmdfdmVyc2lvbjsKKwlpZigoZmlybV9jb25maWdfdmVyc2lvbiAmIDB4RkYpID49IDMpeworCQltYXhfeGZlcl9sZW4gPSAoQVJDTVNSX0NEQl9TR19QQUdFX0xFTkdUSCA8PCAoKGZpcm1fY29uZmlnX3ZlcnNpb24gPj4gOCkgJiAweEZGKSkgKiAxMDI0Oy8qIG1heCA0TSBieXRlICovCisJCW1heF9zZ19lbnRyeXMgPSAobWF4X3hmZXJfbGVuLzQwOTYpOwkKKwl9CisJYWNiLT5ob3N0LT5tYXhfc2VjdG9ycyA9IG1heF94ZmVyX2xlbi81MTI7CisJYWNiLT5ob3N0LT5zZ190YWJsZXNpemUgPSBtYXhfc2dfZW50cnlzOworCXJvdW5kdXBfY2Nic2l6ZSA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKSArIChtYXhfc2dfZW50cnlzIC0gMSkgKiBzaXplb2Yoc3RydWN0IFNHNjRFTlRSWSksIDMyKTsKKwlhY2ItPnVuY2FjaGVfc2l6ZSA9IHJvdW5kdXBfY2Nic2l6ZSAqIEFSQ01TUl9NQVhfRlJFRUNDQl9OVU0gKyAzMjsKKwlkbWFfY29oZXJlbnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgYWNiLT51bmNhY2hlX3NpemUsICZkbWFfY29oZXJlbnRfaGFuZGxlLCBHRlBfS0VSTkVMKTsKKwlpZighZG1hX2NvaGVyZW50KXsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogZG1hX2FsbG9jX2NvaGVyZW50IGdvdCBlcnJvciBcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlhY2ItPmRtYV9jb2hlcmVudCA9IGRtYV9jb2hlcmVudDsKKwlhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUgPSBkbWFfY29oZXJlbnRfaGFuZGxlOworCW1lbXNldChkbWFfY29oZXJlbnQsIDAsIGFjYi0+dW5jYWNoZV9zaXplKTsKKwlvZmZzZXQgPSByb3VuZHVwKCh1bnNpZ25lZCBsb25nKWRtYV9jb2hlcmVudCwgMzIpIC0gKHVuc2lnbmVkIGxvbmcpZG1hX2NvaGVyZW50OworCWRtYV9jb2hlcmVudF9oYW5kbGUgPSBkbWFfY29oZXJlbnRfaGFuZGxlICsgb2Zmc2V0OworCWRtYV9jb2hlcmVudCA9IChzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqKWRtYV9jb2hlcmVudCArIG9mZnNldDsKKwljY2JfdG1wID0gZG1hX2NvaGVyZW50OworCWFjYi0+dmlyMnBoeV9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylkbWFfY29oZXJlbnQgLSAodW5zaWduZWQgbG9uZylkbWFfY29oZXJlbnRfaGFuZGxlOworCWZvcihpID0gMDsgaSA8IEFSQ01TUl9NQVhfRlJFRUNDQl9OVU07IGkrKyl7CisJCWNkYl9waHlhZGRyID0gZG1hX2NvaGVyZW50X2hhbmRsZSArIG9mZnNldG9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrLCBhcmNtc3JfY2RiKTsKKwkJY2NiX3RtcC0+Y2RiX3BoeWFkZHJfcGF0dGVybiA9ICgoYWNiLT5hZGFwdGVyX3R5cGUgPT0gQUNCX0FEQVBURVJfVFlQRV9DKSA/IGNkYl9waHlhZGRyIDogKGNkYl9waHlhZGRyID4+IDUpKTsKKwkJYWNiLT5wY2NiX3Bvb2xbaV0gPSBjY2JfdG1wOworCQljY2JfdG1wLT5hY2IgPSBhY2I7CisJCUlOSVRfTElTVF9IRUFEKCZjY2JfdG1wLT5saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmY2NiX3RtcC0+bGlzdCwgJmFjYi0+Y2NiX2ZyZWVfbGlzdCk7CisJCWNjYl90bXAgPSAoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKikoKHVuc2lnbmVkIGxvbmcpY2NiX3RtcCArIHJvdW5kdXBfY2Nic2l6ZSk7CisJCWRtYV9jb2hlcmVudF9oYW5kbGUgPSBkbWFfY29oZXJlbnRfaGFuZGxlICsgcm91bmR1cF9jY2JzaXplOwogCX0KIAlyZXR1cm4gMDsKLQotb3V0OgotCWRtYV9mcmVlX2NvaGVyZW50KCZhY2ItPnBkZXYtPmRldiwKLQkJKEFSQ01TUl9NQVhfRlJFRUNDQl9OVU0gKiBzaXplb2Yoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2spICsgMHgyMCArCi0JCXNpemVvZihzdHJ1Y3QgTWVzc2FnZVVuaXRfQikpLCBhY2ItPmRtYV9jb2hlcmVudCwgYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlKTsKLQlyZXR1cm4gLUVOT01FTTsKIH0KLXN0YXRpYyB2b2lkIGFyY21zcl9tZXNzYWdlX2lzcl9iaF9mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jaywgYXJjbXNyX2RvX21lc3NhZ2VfaXNyX2JoKTsKIAorc3RhdGljIHZvaWQgYXJjbXNyX21lc3NhZ2VfaXNyX2JoX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgCit7CisJc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrLCBhcmNtc3JfZG9fbWVzc2FnZV9pc3JfYmgpOwogCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKIAkJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKIAogCQkJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcmVnICA9IGFjYi0+cG11QTsKIAkJCWNoYXIgKmFjYl9kZXZfbWFwID0gKGNoYXIgKilhY2ItPmRldmljZV9tYXA7Ci0JCQl1aW50MzJfdCBfX2lvbWVtICpzaWduYXR1cmUgPSAodWludDMyX3QgX19pb21lbSAqKSAoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclswXSk7Ci0JCQljaGFyIF9faW9tZW0gKmRldmljZW1hcCA9IChjaGFyIF9faW9tZW0gKikgKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMjFdKTsKKwkJCXVpbnQzMl90IF9faW9tZW0gKnNpZ25hdHVyZSA9ICh1aW50MzJfdCBfX2lvbWVtKikgKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMF0pOworCQkJY2hhciBfX2lvbWVtICpkZXZpY2VtYXAgPSAoY2hhciBfX2lvbWVtKikgKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMjFdKTsKIAkJCWludCB0YXJnZXQsIGx1bjsKIAkJCXN0cnVjdCBzY3NpX2RldmljZSAqcHNkZXY7CiAJCQljaGFyIGRpZmY7CiAKIAkJCWF0b21pY19pbmMoJmFjYi0+cnFfbWFwX3Rva2VuKTsKIAkJCWlmIChyZWFkbChzaWduYXR1cmUpID09IEFSQ01TUl9TSUdOQVRVUkVfR0VUX0NPTkZJRykgewotCQkJCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgQVJDTVNSX01BWF9UQVJHRVRJRCAtIDE7IHRhcmdldCsrKSB7CisJCQkJZm9yKHRhcmdldCA9IDA7IHRhcmdldCA8IEFSQ01TUl9NQVhfVEFSR0VUSUQgLTE7IHRhcmdldCsrKSB7CiAJCQkJCWRpZmYgPSAoKmFjYl9kZXZfbWFwKV5yZWFkYihkZXZpY2VtYXApOwogCQkJCQlpZiAoZGlmZiAhPSAwKSB7CiAJCQkJCQljaGFyIHRlbXA7CiAJCQkJCQkqYWNiX2Rldl9tYXAgPSByZWFkYihkZXZpY2VtYXApOwotCQkJCQkJdGVtcCA9ICphY2JfZGV2X21hcDsKLQkJCQkJCWZvciAobHVuID0gMDsgbHVuIDwgQVJDTVNSX01BWF9UQVJHRVRMVU47IGx1bisrKSB7Ci0JCQkJCQkJaWYgKCh0ZW1wICYgMHgwMSkgPT0gMSAmJiAoZGlmZiAmIDB4MDEpID09IDEpIHsKKwkJCQkJCXRlbXAgPSphY2JfZGV2X21hcDsKKwkJCQkJCWZvcihsdW4gPSAwOyBsdW4gPCBBUkNNU1JfTUFYX1RBUkdFVExVTjsgbHVuKyspIHsKKwkJCQkJCQlpZigodGVtcCAmIDB4MDEpPT0xICYmIChkaWZmICYgMHgwMSkgPT0gMSkgewkKIAkJCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGFjYi0+aG9zdCwgMCwgdGFyZ2V0LCBsdW4pOwotCQkJCQkJCX0gZWxzZSBpZiAoKHRlbXAgJiAweDAxKSA9PSAwICYmIChkaWZmICYgMHgwMSkgPT0gMSkgeworCQkJCQkJCX1lbHNlIGlmKCh0ZW1wICYgMHgwMSkgPT0gMCAmJiAoZGlmZiAmIDB4MDEpID09IDEpIHsKIAkJCQkJCQkJcHNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoYWNiLT5ob3N0LCAwLCB0YXJnZXQsIGx1bik7Ci0JCQkJCQkJCWlmIChwc2RldiAhPSBOVUxMKSB7CisJCQkJCQkJCWlmIChwc2RldiAhPSBOVUxMICkgewogCQkJCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHBzZGV2KTsKIAkJCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChwc2Rldik7CiAJCQkJCQkJCX0KQEAgLTQxMSw4ICs1NTEsNDUgQEAKIAkJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKIAkJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgID0gYWNiLT5wbXVCOwogCQkJY2hhciAqYWNiX2Rldl9tYXAgPSAoY2hhciAqKWFjYi0+ZGV2aWNlX21hcDsKLQkJCXVpbnQzMl90IF9faW9tZW0gKnNpZ25hdHVyZSA9ICh1aW50MzJfdCBfX2lvbWVtICopKCZyZWctPm1zZ2NvZGVfcndidWZmZXJfcmVnWzBdKTsKLQkJCWNoYXIgX19pb21lbSAqZGV2aWNlbWFwID0gKGNoYXIgX19pb21lbSAqKSgmcmVnLT5tc2djb2RlX3J3YnVmZmVyX3JlZ1syMV0pOworCQkJdWludDMyX3QgX19pb21lbSAqc2lnbmF0dXJlID0gKHVpbnQzMl90IF9faW9tZW0qKSgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzBdKTsKKwkJCWNoYXIgX19pb21lbSAqZGV2aWNlbWFwID0gKGNoYXIgX19pb21lbSopKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMjFdKTsKKwkJCWludCB0YXJnZXQsIGx1bjsKKwkJCXN0cnVjdCBzY3NpX2RldmljZSAqcHNkZXY7CisJCQljaGFyIGRpZmY7CisKKwkJCWF0b21pY19pbmMoJmFjYi0+cnFfbWFwX3Rva2VuKTsKKwkJCWlmIChyZWFkbChzaWduYXR1cmUpID09IEFSQ01TUl9TSUdOQVRVUkVfR0VUX0NPTkZJRykgeworCQkJCWZvcih0YXJnZXQgPSAwOyB0YXJnZXQgPCBBUkNNU1JfTUFYX1RBUkdFVElEIC0xOyB0YXJnZXQrKykgeworCQkJCQlkaWZmID0gKCphY2JfZGV2X21hcClecmVhZGIoZGV2aWNlbWFwKTsKKwkJCQkJaWYgKGRpZmYgIT0gMCkgeworCQkJCQkJY2hhciB0ZW1wOworCQkJCQkJKmFjYl9kZXZfbWFwID0gcmVhZGIoZGV2aWNlbWFwKTsKKwkJCQkJCXRlbXAgPSphY2JfZGV2X21hcDsKKwkJCQkJCWZvcihsdW4gPSAwOyBsdW4gPCBBUkNNU1JfTUFYX1RBUkdFVExVTjsgbHVuKyspIHsKKwkJCQkJCQlpZigodGVtcCAmIDB4MDEpPT0xICYmIChkaWZmICYgMHgwMSkgPT0gMSkgewkKKwkJCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGFjYi0+aG9zdCwgMCwgdGFyZ2V0LCBsdW4pOworCQkJCQkJCX1lbHNlIGlmKCh0ZW1wICYgMHgwMSkgPT0gMCAmJiAoZGlmZiAmIDB4MDEpID09IDEpIHsKKwkJCQkJCQkJcHNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoYWNiLT5ob3N0LCAwLCB0YXJnZXQsIGx1bik7CisJCQkJCQkJCWlmIChwc2RldiAhPSBOVUxMICkgeworCQkJCQkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHBzZGV2KTsKKwkJCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChwc2Rldik7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJdGVtcCA+Pj0gMTsKKwkJCQkJCQlkaWZmID4+PSAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWRldmljZW1hcCsrOworCQkJCQlhY2JfZGV2X21hcCsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwkJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6IHsKKwkJCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpyZWcgID0gYWNiLT5wbXVDOworCQkJY2hhciAqYWNiX2Rldl9tYXAgPSAoY2hhciAqKWFjYi0+ZGV2aWNlX21hcDsKKwkJCXVpbnQzMl90IF9faW9tZW0gKnNpZ25hdHVyZSA9ICh1aW50MzJfdCBfX2lvbWVtICopKCZyZWctPm1zZ2NvZGVfcndidWZmZXJbMF0pOworCQkJY2hhciBfX2lvbWVtICpkZXZpY2VtYXAgPSAoY2hhciBfX2lvbWVtICopKCZyZWctPm1zZ2NvZGVfcndidWZmZXJbMjFdKTsKIAkJCWludCB0YXJnZXQsIGx1bjsKIAkJCXN0cnVjdCBzY3NpX2RldmljZSAqcHNkZXY7CiAJCQljaGFyIGRpZmY7CkBAIC00NDcsMTg1ICs2MjQsMTUyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGFyY21zcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IGFyY21zcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYjsKLQl1aW50OF90IGJ1cywgZGV2X2Z1bjsKKwl1aW50OF90IGJ1cyxkZXZfZnVuOwogCWludCBlcnJvcjsKLQogCWVycm9yID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dDsKLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmFyY21zcl9zY3NpX2hvc3RfdGVtcGxhdGUsCi0JCQlzaXplb2Yoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2spKTsKLQlpZiAoIWhvc3QpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwlpZihlcnJvcil7CisJCXJldHVybiAtRU5PREVWOwogCX0KLQlhY2IgPSAoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKilob3N0LT5ob3N0ZGF0YTsKLQltZW1zZXQoYWNiLCAwLCBzaXplb2YgKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrKSk7Ci0KKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZhcmNtc3Jfc2NzaV9ob3N0X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2spKTsKKwlpZighaG9zdCl7CisgICAgCQlnb3RvIHBjaV9kaXNhYmxlX2RldjsKKwl9CiAJZXJyb3IgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwotCWlmIChlcnJvcikgeworCWlmKGVycm9yKXsKIAkJZXJyb3IgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCQlpZiAoZXJyb3IpIHsKKwkJaWYoZXJyb3IpewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJzY3NpJWQ6IE5vIHN1aXRhYmxlIERNQSBtYXNrIGF2YWlsYWJsZVxuIiwKIAkJCSAgICAgICBob3N0LT5ob3N0X25vKTsKLQkJCWdvdG8gb3V0X2hvc3RfcHV0OworCQkJZ290byBzY3NpX2hvc3RfcmVsZWFzZTsKIAkJfQogCX0KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3YWl0X3EpOwogCWJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwogCWRldl9mdW4gPSBwZGV2LT5kZXZmbjsKLQlhY2ItPmhvc3QgPSBob3N0OworCWFjYiA9IChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqKSBob3N0LT5ob3N0ZGF0YTsKKwltZW1zZXQoYWNiLDAsc2l6ZW9mKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrKSk7CiAJYWNiLT5wZGV2ID0gcGRldjsKLQlob3N0LT5tYXhfc2VjdG9ycyA9IEFSQ01TUl9NQVhfWEZFUl9TRUNUT1JTOworCWFjYi0+aG9zdCA9IGhvc3Q7CiAJaG9zdC0+bWF4X2x1biA9IEFSQ01TUl9NQVhfVEFSR0VUTFVOOwotCWhvc3QtPm1heF9pZCA9IEFSQ01TUl9NQVhfVEFSR0VUSUQ7LyoxNjo4Ki8KLQlob3N0LT5tYXhfY21kX2xlbiA9IDE2OyAgICAvKnRoaXMgaXMgaXNzdWUgb2YgNjRiaXQgTEJBLCBvdmVyIDJUIGJ5dGUqLwotCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IEFSQ01TUl9NQVhfU0dfRU5UUklFUzsKLQlob3N0LT5jYW5fcXVldWUgPSBBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNOyAvKiBtYXggc2ltdWx0YW5lb3VzIGNtZHMgKi8KLQlob3N0LT5jbWRfcGVyX2x1biA9IEFSQ01TUl9NQVhfQ01EX1BFUkxVTjsKKwlob3N0LT5tYXhfaWQgPSBBUkNNU1JfTUFYX1RBUkdFVElEOwkJLyoxNjo4Ki8KKwlob3N0LT5tYXhfY21kX2xlbiA9IDE2OwkgCQkJLyp0aGlzIGlzIGlzc3VlIG9mIDY0Yml0IExCQSAsb3ZlciAyVCBieXRlKi8KKwlob3N0LT5jYW5fcXVldWUgPSBBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNOwkvKiBtYXggc2ltdWx0YW5lb3VzIGNtZHMgKi8JCQorCWhvc3QtPmNtZF9wZXJfbHVuID0gQVJDTVNSX01BWF9DTURfUEVSTFVOOwkgICAgCiAJaG9zdC0+dGhpc19pZCA9IEFSQ01TUl9TQ1NJX0lOSVRJQVRPUl9JRDsKIAlob3N0LT51bmlxdWVfaWQgPSAoYnVzIDw8IDgpIHwgZGV2X2Z1bjsKLQlob3N0LT5pcnEgPSBwZGV2LT5pcnE7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCWVycm9yID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiYXJjbXNyIik7Ci0JaWYgKGVycm9yKSB7Ci0JCWdvdG8gb3V0X2hvc3RfcHV0OworCWlmKGVycm9yKXsKKwkJZ290byBzY3NpX2hvc3RfcmVsZWFzZTsKIAl9Ci0JYXJjbXNyX2RlZmluZV9hZGFwdGVyX3R5cGUoYWNiKTsKLQorCXNwaW5fbG9ja19pbml0KCZhY2ItPmVoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhY2ItPmNjYmxpc3RfbG9jayk7CiAJYWNiLT5hY2JfZmxhZ3MgfD0gKEFDQl9GX01FU1NBR0VfV1FCVUZGRVJfQ0xFQVJFRCB8Ci0JCQkgICBBQ0JfRl9NRVNTQUdFX1JRQlVGRkVSX0NMRUFSRUQgfAotCQkJICAgQUNCX0ZfTUVTU0FHRV9XUUJVRkZFUl9SRUFERUQpOworCQkJQUNCX0ZfTUVTU0FHRV9SUUJVRkZFUl9DTEVBUkVEIHwKKwkJCUFDQl9GX01FU1NBR0VfV1FCVUZGRVJfUkVBREVEKTsKIAlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfU0NTSVNUT1BBREFQVEVSOwogCUlOSVRfTElTVF9IRUFEKCZhY2ItPmNjYl9mcmVlX2xpc3QpOwotCUlOSVRfV09SSygmYWNiLT5hcmNtc3JfZG9fbWVzc2FnZV9pc3JfYmgsIGFyY21zcl9tZXNzYWdlX2lzcl9iaF9mbik7CisJYXJjbXNyX2RlZmluZV9hZGFwdGVyX3R5cGUoYWNiKTsKKwllcnJvciA9IGFyY21zcl9yZW1hcF9wY2lyZWdpb24oYWNiKTsKKwlpZighZXJyb3IpeworCQlnb3RvIHBjaV9yZWxlYXNlX3JlZ3M7CisJfQorCWVycm9yID0gYXJjbXNyX2dldF9maXJtd2FyZV9zcGVjKGFjYik7CisJaWYoIWVycm9yKXsKKwkJZ290byB1bm1hcF9wY2lfcmVnaW9uOworCX0KIAllcnJvciA9IGFyY21zcl9hbGxvY19jY2JfcG9vbChhY2IpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOwotCisJaWYoZXJyb3IpeworCQlnb3RvIGZyZWVfaGJiX211OworCX0KIAlhcmNtc3JfaW9wX2luaXQoYWNiKTsKLQllcnJvciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgYXJjbXNyX2RvX2ludGVycnVwdCwKLQkJCSAgICBJUlFGX1NIQVJFRCwgImFyY21zciIsIGFjYik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9mcmVlX2NjYl9wb29sOwotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwotCWlmIChzdHJuY21wKGFjYi0+ZmlybV92ZXJzaW9uLCAiVjEuNDIiLCA1KSA+PSAwKQotCQlob3N0LT5tYXhfc2VjdG9ycz0gQVJDTVNSX01BWF9YRkVSX1NFQ1RPUlNfQjsKLQogCWVycm9yID0gc2NzaV9hZGRfaG9zdChob3N0LCAmcGRldi0+ZGV2KTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2ZyZWVfaXJxOwotCi0JZXJyb3IgPSBhcmNtc3JfYWxsb2Nfc3lzZnNfYXR0cihhY2IpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfZnJlZV9zeXNmczsKLQotCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwotCSNpZmRlZiBDT05GSUdfU0NTSV9BUkNNU1JfQUVSCi0JcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKLQkjZW5kaWYKKwlpZihlcnJvcil7CisJCWdvdG8gUkFJRF9jb250cm9sbGVyX3N0b3A7CisJfQorCWVycm9yID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBhcmNtc3JfZG9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgImFyY21zciIsIGFjYik7CisJaWYoZXJyb3IpeworCQlnb3RvIHNjc2lfaG9zdF9yZW1vdmU7CisJfQorCWhvc3QtPmlycSA9IHBkZXYtPmlycTsKKyAgICAJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJSU5JVF9XT1JLKCZhY2ItPmFyY21zcl9kb19tZXNzYWdlX2lzcl9iaCwgYXJjbXNyX21lc3NhZ2VfaXNyX2JoX2ZuKTsKIAlhdG9taWNfc2V0KCZhY2ItPnJxX21hcF90b2tlbiwgMTYpOwotCWFjYi0+Zndfc3RhdGUgPSB0cnVlOworCWF0b21pY19zZXQoJmFjYi0+YW50ZV90b2tlbl92YWx1ZSwgMTYpOworCWFjYi0+ZndfZmxhZyA9IEZXX05PUk1BTDsKIAlpbml0X3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIpOwotCWFjYi0+ZXRlcm5hbF90aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAqSFopOworCWFjYi0+ZXRlcm5hbF90aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNiAqIEhaKTsKIAlhY2ItPmV0ZXJuYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7CiAJYWNiLT5ldGVybmFsX3RpbWVyLmZ1bmN0aW9uID0gJmFyY21zcl9yZXF1ZXN0X2RldmljZV9tYXA7CiAJYWRkX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIpOwotCisJaWYoYXJjbXNyX2FsbG9jX3N5c2ZzX2F0dHIoYWNiKSkKKwkJZ290byBvdXRfZnJlZV9zeXNmczsKIAlyZXR1cm4gMDsKLSBvdXRfZnJlZV9zeXNmczoKLSBvdXRfZnJlZV9pcnE6Ci0JZnJlZV9pcnEocGRldi0+aXJxLCBhY2IpOwotIG91dF9mcmVlX2NjYl9wb29sOgorb3V0X2ZyZWVfc3lzZnM6CitzY3NpX2hvc3RfcmVtb3ZlOgorCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CitSQUlEX2NvbnRyb2xsZXJfc3RvcDoKKwlhcmNtc3Jfc3RvcF9hZGFwdGVyX2JncmIoYWNiKTsKKwlhcmNtc3JfZmx1c2hfYWRhcHRlcl9jYWNoZShhY2IpOwogCWFyY21zcl9mcmVlX2NjYl9wb29sKGFjYik7Ci0gb3V0X3JlbGVhc2VfcmVnaW9uczoKK2ZyZWVfaGJiX211OgorCWFyY21zcl9mcmVlX2hiYl9tdShhY2IpOwordW5tYXBfcGNpX3JlZ2lvbjoKKwlhcmNtc3JfdW5tYXBfcGNpcmVnaW9uKGFjYik7CitwY2lfcmVsZWFzZV9yZWdzOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gb3V0X2hvc3RfcHV0Ogorc2NzaV9ob3N0X3JlbGVhc2U6CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKLSBvdXRfZGlzYWJsZV9kZXZpY2U6CitwY2lfZGlzYWJsZV9kZXY6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotIG91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1aW50OF90IGFyY21zcl9oYmFfd2FpdF9tc2dpbnRfcmVhZHkoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKLXsKLQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7Ci0JdWludDMyX3QgSW5kZXg7Ci0JdWludDhfdCBSZXRyaWVzID0gMHgwMDsKLQotCWRvIHsKLQkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgMTAwOyBJbmRleCsrKSB7Ci0JCQlpZiAocmVhZGwoJnJlZy0+b3V0Ym91bmRfaW50c3RhdHVzKSAmCi0JCQkJCUFSQ01TUl9NVV9PVVRCT1VORF9NRVNTQUdFMF9JTlQpIHsKLQkJCQl3cml0ZWwoQVJDTVNSX01VX09VVEJPVU5EX01FU1NBR0UwX0lOVCwKLQkJCQkJJnJlZy0+b3V0Ym91bmRfaW50c3RhdHVzKTsKLQkJCQlyZXR1cm4gMHgwMDsKLQkJCX0KLQkJCW1zbGVlcCgxMCk7Ci0JCX0vKm1heCAxIHNlY29uZHMqLwotCi0JfSB3aGlsZSAoUmV0cmllcysrIDwgMjApOy8qbWF4IDIwIHNlYyovCi0JcmV0dXJuIDB4ZmY7Ci19Ci0KLXN0YXRpYyB1aW50OF90IGFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKLXsKLQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwotCXVpbnQzMl90IEluZGV4OwotCXVpbnQ4X3QgUmV0cmllcyA9IDB4MDA7Ci0KLQlkbyB7Ci0JCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDEwMDsgSW5kZXgrKykgewotCQkJaWYgKHJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpCi0JCQkJJiBBUkNNU1JfSU9QMkRSVl9NRVNTQUdFX0NNRF9ET05FKSB7Ci0JCQkJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX0lOVF9DTEVBUl9QQVRURVJOCi0JCQkJCSwgcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZyk7Ci0JCQkJd3JpdGVsKEFSQ01TUl9EUlYySU9QX0VORF9PRl9JTlRFUlJVUFQsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9yZWcpOwotCQkJCXJldHVybiAweDAwOwotCQkJfQotCQkJbXNsZWVwKDEwKTsKLQkJfS8qbWF4IDEgc2Vjb25kcyovCi0KLQl9IHdoaWxlIChSZXRyaWVzKysgPCAyMCk7LyptYXggMjAgc2VjKi8KLQlyZXR1cm4gMHhmZjsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIHVpbnQ4X3QgYXJjbXNyX2Fib3J0X2hiYV9hbGxjbWQoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7Ci0KIAl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfQUJPUlRfQ01ELCAmcmVnLT5pbmJvdW5kX21zZ2FkZHIwKTsKLQlpZiAoYXJjbXNyX2hiYV93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CisJaWYgKCFhcmNtc3JfaGJhX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFCiAJCQkiYXJjbXNyJWQ6IHdhaXQgJ2Fib3J0IGFsbCBvdXRzdGFuZGluZyBjb21tYW5kJyB0aW1lb3V0IFxuIgogCQkJLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOwotCQlyZXR1cm4gMHhmZjsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLQlyZXR1cm4gMHgwMDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHVpbnQ4X3QgYXJjbXNyX2Fib3J0X2hiYl9hbGxjbWQoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwogCi0Jd3JpdGVsKEFSQ01TUl9NRVNTQUdFX0FCT1JUX0NNRCwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7Ci0JaWYgKGFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkgeworCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9BQk9SVF9DTUQsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJaWYgKCFhcmNtc3JfaGJiX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFCiAJCQkiYXJjbXNyJWQ6IHdhaXQgJ2Fib3J0IGFsbCBvdXRzdGFuZGluZyBjb21tYW5kJyB0aW1lb3V0IFxuIgogCQkJLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOwotCQlyZXR1cm4gMHhmZjsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLQlyZXR1cm4gMHgwMDsKKwlyZXR1cm4gdHJ1ZTsKIH0KLQorc3RhdGljIHVpbnQ4X3QgYXJjbXNyX2Fib3J0X2hiY19hbGxjbWQoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKnBBQ0IpCit7CisJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnJlZyA9IChzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqKXBBQ0ItPnBtdUM7CisJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX01FU0cwX0FCT1JUX0NNRCwgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7CisJd3JpdGVsKEFSQ01TUl9IQkNNVV9EUlYySU9QX01FU1NBR0VfQ01EX0RPTkUsICZyZWctPmluYm91bmRfZG9vcmJlbGwpOworCWlmICghYXJjbXNyX2hiY193YWl0X21zZ2ludF9yZWFkeShwQUNCKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSJhcmNtc3IlZDogd2FpdCAnYWJvcnQgYWxsIG91dHN0YW5kaW5nIGNvbW1hbmQnIHRpbWVvdXQgXG4iCisJCQksIHBBQ0ItPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQogc3RhdGljIHVpbnQ4X3QgYXJjbXNyX2Fib3J0X2FsbGNtZChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXVpbnQ4X3QgcnRudmFsID0gMDsKQEAgLTYzOCwxMCArNzgyLDI2IEBACiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKIAkJcnRudmFsID0gYXJjbXNyX2Fib3J0X2hiYl9hbGxjbWQoYWNiKTsKIAkJfQorCQlicmVhazsKKworCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9DOiB7CisJCXJ0bnZhbCA9IGFyY21zcl9hYm9ydF9oYmNfYWxsY21kKGFjYik7CisJCX0KIAl9CiAJcmV0dXJuIHJ0bnZhbDsKIH0KIAorc3RhdGljIGJvb2wgYXJjbXNyX2hiYl9lbmFibGVfZHJpdmVyX21vZGUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKnBhY2IpCit7CisJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IHBhY2ItPnBtdUI7CisJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX1NUQVJUX0RSSVZFUl9NT0RFLCByZWctPmRydjJpb3BfZG9vcmJlbGwpOworCWlmICghYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShwYWNiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFyY21zciVkOiBjYW4ndCBzZXQgZHJpdmVyIG1vZGUuIFxuIiwgcGFjYi0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisgICAgCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdm9pZCBhcmNtc3JfcGNpX3VubWFwX2RtYShzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKnBjbWQgPSBjY2ItPnBjbWQ7CkBAIC02NDksNzUgKzgwOSwyNSBAQAogCXNjc2lfZG1hX3VubWFwKHBjbWQpOwogfQogCi1zdGF0aWMgdm9pZCBhcmNtc3JfY2NiX2NvbXBsZXRlKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2IsIGludCBzdGFuZF9mbGFnKQorc3RhdGljIHZvaWQgYXJjbXNyX2NjYl9jb21wbGV0ZShzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiKQogewogCXN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IgPSBjY2ItPmFjYjsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kID0gY2NiLT5wY21kOwotCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdG9taWNfZGVjKCZhY2ItPmNjYm91dHN0YW5kaW5nY291bnQpOwogCWFyY21zcl9wY2lfdW5tYXBfZG1hKGNjYik7Ci0JaWYgKHN0YW5kX2ZsYWcgPT0gMSkKLQkJYXRvbWljX2RlYygmYWNiLT5jY2JvdXRzdGFuZGluZ2NvdW50KTsKIAljY2ItPnN0YXJ0ZG9uZSA9IEFSQ01TUl9DQ0JfRE9ORTsKLQljY2ItPmNjYl9mbGFncyA9IDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjYi0+Y2NibGlzdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmY2NiLT5saXN0LCAmYWNiLT5jY2JfZnJlZV9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2ItPmNjYmxpc3RfbG9jaywgZmxhZ3MpOwogCXBjbWQtPnNjc2lfZG9uZShwY21kKTsKIH0KIAotc3RhdGljIHZvaWQgYXJjbXNyX2ZsdXNoX2hiYV9jYWNoZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQotewotCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QTsKLQlpbnQgcmV0cnlfY291bnQgPSAzMDsKLQotCXdyaXRlbChBUkNNU1JfSU5CT1VORF9NRVNHMF9GTFVTSF9DQUNIRSwgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7Ci0JZG8gewotCQlpZiAoIWFyY21zcl9oYmFfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkKLQkJCWJyZWFrOwotCQllbHNlIHsKLQkJCXJldHJ5X2NvdW50LS07Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiB3YWl0ICdmbHVzaCBhZGFwdGVyIGNhY2hlJyBcCi0JCQl0aW1lb3V0LCByZXRyeSBjb3VudCBkb3duID0gJWQgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8sIHJldHJ5X2NvdW50KTsKLQkJfQotCX0gd2hpbGUgKHJldHJ5X2NvdW50ICE9IDApOwotfQotCi1zdGF0aWMgdm9pZCBhcmNtc3JfZmx1c2hfaGJiX2NhY2hlKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCi17Ci0Jc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKLQlpbnQgcmV0cnlfY291bnQgPSAzMDsKLQotCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9GTFVTSF9DQUNIRSwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7Ci0JZG8gewotCQlpZiAoIWFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkKLQkJCWJyZWFrOwotCQllbHNlIHsKLQkJCXJldHJ5X2NvdW50LS07Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiB3YWl0ICdmbHVzaCBhZGFwdGVyIGNhY2hlJyBcCi0JCQl0aW1lb3V0LHJldHJ5IGNvdW50IGRvd24gPSAlZCBcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubywgcmV0cnlfY291bnQpOwotCQl9Ci0JfSB3aGlsZSAocmV0cnlfY291bnQgIT0gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFyY21zcl9mbHVzaF9hZGFwdGVyX2NhY2hlKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCi17Ci0Jc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewotCi0JY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKLQkJYXJjbXNyX2ZsdXNoX2hiYV9jYWNoZShhY2IpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKLQkJYXJjbXNyX2ZsdXNoX2hiYl9jYWNoZShhY2IpOwotCQl9Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBhcmNtc3JfcmVwb3J0X3NlbnNlX2luZm8oc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKmNjYikKIHsKIAogCXN0cnVjdCBzY3NpX2NtbmQgKnBjbWQgPSBjY2ItPnBjbWQ7CiAJc3RydWN0IFNFTlNFX0RBVEEgKnNlbnNlYnVmZmVyID0gKHN0cnVjdCBTRU5TRV9EQVRBICopcGNtZC0+c2Vuc2VfYnVmZmVyOwotCiAJcGNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwogCWlmIChzZW5zZWJ1ZmZlcikgewogCQlpbnQgc2Vuc2VfZGF0YV9sZW5ndGggPQpAQCAtNzMzLDggKzg0Myw3IEBACiBzdGF0aWMgdTMyIGFyY21zcl9kaXNhYmxlX291dGJvdW5kX2ludHMoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAl1MzIgb3JpZ19tYXNrID0gMDsKLQlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7Ci0KKwlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7CQogCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9BIDogewogCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7CiAJCW9yaWdfbWFzayA9IHJlYWRsKCZyZWctPm91dGJvdW5kX2ludG1hc2spOwpAQCAtNzQyLDM1ICs4NTEsNDAgQEAKIAkJCQkJCSZyZWctPm91dGJvdW5kX2ludG1hc2spOwogCQl9CiAJCWJyZWFrOwotCiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0IgOiB7CiAJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7Ci0JCW9yaWdfbWFzayA9IHJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbF9tYXNrX3JlZyk7Ci0JCXdyaXRlbCgwLCByZWctPmlvcDJkcnZfZG9vcmJlbGxfbWFza19yZWcpOworCQlvcmlnX21hc2sgPSByZWFkbChyZWctPmlvcDJkcnZfZG9vcmJlbGxfbWFzayk7CisJCXdyaXRlbCgwLCByZWctPmlvcDJkcnZfZG9vcmJlbGxfbWFzayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6eworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqcmVnID0gKHN0cnVjdCBNZXNzYWdlVW5pdF9DICopYWNiLT5wbXVDOworCQkvKiBkaXNhYmxlIGFsbCBvdXRib3VuZCBpbnRlcnJ1cHQgKi8KKwkJb3JpZ19tYXNrID0gcmVhZGwoJnJlZy0+aG9zdF9pbnRfbWFzayk7IC8qIGRpc2FibGUgb3V0Ym91bmQgbWVzc2FnZTAgaW50ICovCisJCXdyaXRlbChvcmlnX21hc2t8QVJDTVNSX0hCQ01VX0FMTF9JTlRNQVNLRU5BQkxFLCAmcmVnLT5ob3N0X2ludF9tYXNrKTsKIAkJfQogCQlicmVhazsKIAl9CiAJcmV0dXJuIG9yaWdfbWFzazsKIH0KIAotc3RhdGljIHZvaWQgYXJjbXNyX3JlcG9ydF9jY2Jfc3RhdGUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwgXAotCQkJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKmNjYiwgdWludDMyX3QgZmxhZ19jY2IpCitzdGF0aWMgdm9pZCBhcmNtc3JfcmVwb3J0X2NjYl9zdGF0ZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLCAKKwkJCXN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2IsIGJvb2wgZXJyb3IpCiB7Ci0KIAl1aW50OF90IGlkLCBsdW47CiAJaWQgPSBjY2ItPnBjbWQtPmRldmljZS0+aWQ7CiAJbHVuID0gY2NiLT5wY21kLT5kZXZpY2UtPmx1bjsKLQlpZiAoIShmbGFnX2NjYiAmIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SKSkgeworCWlmICghZXJyb3IpIHsKIAkJaWYgKGFjYi0+ZGV2c3RhdGVbaWRdW2x1bl0gPT0gQVJFQ0FfUkFJRF9HT05FKQogCQkJYWNiLT5kZXZzdGF0ZVtpZF1bbHVuXSA9IEFSRUNBX1JBSURfR09PRDsKIAkJCWNjYi0+cGNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwotCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IsIDEpOwotCX0gZWxzZSB7CisJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKGNjYik7CisJfWVsc2V7CiAJCXN3aXRjaCAoY2NiLT5hcmNtc3JfY2RiLkRldmljZVN0YXR1cykgewogCQljYXNlIEFSQ01TUl9ERVZfU0VMRUNUX1RJTUVPVVQ6IHsKIAkJCWFjYi0+ZGV2c3RhdGVbaWRdW2x1bl0gPSBBUkVDQV9SQUlEX0dPTkU7CiAJCQljY2ItPnBjbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwotCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IsIDEpOworCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IpOwogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTc3OSw0OSArODkzLDQ5IEBACiAJCWNhc2UgQVJDTVNSX0RFVl9JTklUX0ZBSUw6IHsKIAkJCWFjYi0+ZGV2c3RhdGVbaWRdW2x1bl0gPSBBUkVDQV9SQUlEX0dPTkU7CiAJCQljY2ItPnBjbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OwotCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IsIDEpOworCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IpOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUkNNU1JfREVWX0NIRUNLX0NPTkRJVElPTjogewogCQkJYWNiLT5kZXZzdGF0ZVtpZF1bbHVuXSA9IEFSRUNBX1JBSURfR09PRDsKIAkJCWFyY21zcl9yZXBvcnRfc2Vuc2VfaW5mbyhjY2IpOwotCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IsIDEpOworCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IpOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCQkJImFyY21zciVkOiBzY3NpIGlkID0gJWQgbHVuID0gJWQiCi0JCQkJCSIgaXNyIGdldCBjb21tYW5kIGVycm9yIGRvbmUsICIKLQkJCQkJImJ1dCBnb3QgdW5rbm93biBEZXZpY2VTdGF0dXMgPSAweCV4IFxuIgotCQkJCQksIGFjYi0+aG9zdC0+aG9zdF9ubwotCQkJCQksIGlkCi0JCQkJCSwgbHVuCi0JCQkJCSwgY2NiLT5hcmNtc3JfY2RiLkRldmljZVN0YXR1cyk7Ci0JCQkJCWFjYi0+ZGV2c3RhdGVbaWRdW2x1bl0gPSBBUkVDQV9SQUlEX0dPTkU7Ci0JCQkJCWNjYi0+cGNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7Ci0JCQkJCWFyY21zcl9jY2JfY29tcGxldGUoY2NiLCAxKTsKKwkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCSJhcmNtc3IlZDogc2NzaSBpZCA9ICVkIGx1biA9ICVkIGlzciBnZXQgY29tbWFuZCBlcnJvciBkb25lLCBcCisJCQkJYnV0IGdvdCB1bmtub3duIERldmljZVN0YXR1cyA9IDB4JXggXG4iCisJCQkJLCBhY2ItPmhvc3QtPmhvc3Rfbm8KKwkJCQksIGlkCisJCQkJLCBsdW4KKwkJCQksIGNjYi0+YXJjbXNyX2NkYi5EZXZpY2VTdGF0dXMpOworCQkJCWFjYi0+ZGV2c3RhdGVbaWRdW2x1bl0gPSBBUkVDQV9SQUlEX0dPTkU7CisJCQkJY2NiLT5wY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKGNjYik7CiAJCQlicmVhazsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgYXJjbXNyX2RyYWluX2RvbmVxdWV1ZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLCB1aW50MzJfdCBmbGFnX2NjYikKK3N0YXRpYyB2b2lkIGFyY21zcl9kcmFpbl9kb25lcXVldWUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwgc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKnBDQ0IsIGJvb2wgZXJyb3IpCiAKIHsKLQlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiOwotCi0JY2NiID0gKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICopKGFjYi0+dmlyMnBoeV9vZmZzZXQgKyAoZmxhZ19jY2IgPDwgNSkpOwotCWlmICgoY2NiLT5hY2IgIT0gYWNiKSB8fCAoY2NiLT5zdGFydGRvbmUgIT0gQVJDTVNSX0NDQl9TVEFSVCkpIHsKLQkJaWYgKGNjYi0+c3RhcnRkb25lID09IEFSQ01TUl9DQ0JfQUJPUlRFRCkgewotCQkJc3RydWN0IHNjc2lfY21uZCAqYWJvcnRjbWQgPSBjY2ItPnBjbWQ7CisJaW50IGlkLCBsdW47CisJaWYgKChwQ0NCLT5hY2IgIT0gYWNiKSB8fCAocENDQi0+c3RhcnRkb25lICE9IEFSQ01TUl9DQ0JfU1RBUlQpKSB7CisJCWlmIChwQ0NCLT5zdGFydGRvbmUgPT0gQVJDTVNSX0NDQl9BQk9SVEVEKSB7CisJCQlzdHJ1Y3Qgc2NzaV9jbW5kICphYm9ydGNtZCA9IHBDQ0ItPnBjbWQ7CiAJCQlpZiAoYWJvcnRjbWQpIHsKKwkJCQlpZCA9IGFib3J0Y21kLT5kZXZpY2UtPmlkOworCQkJCWx1biA9IGFib3J0Y21kLT5kZXZpY2UtPmx1bjsJCQkJCiAJCQkJYWJvcnRjbWQtPnJlc3VsdCB8PSBESURfQUJPUlQgPDwgMTY7Ci0JCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IsIDEpOwotCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IGNjYiA9JzB4JXAnIFwKLQkJCQlpc3IgZ290IGFib3J0ZWQgY29tbWFuZCBcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubywgY2NiKTsKKwkJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKHBDQ0IpOworCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHBDQ0IgPScweCVwJyBpc3IgZ290IGFib3J0ZWQgY29tbWFuZCBcbiIsCisJCQkJYWNiLT5ob3N0LT5ob3N0X25vLCBwQ0NCKTsKIAkJCX0KKwkJCXJldHVybjsKIAkJfQogCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBpc3IgZ2V0IGFuIGlsbGVnYWwgY2NiIGNvbW1hbmQgXAogCQkJCWRvbmUgYWNiID0gJzB4JXAnIgpAQCAtODI5LDIwICs5NDMsMjIgQEAKIAkJCQkiIGNjYm91dHN0YW5kaW5nY291bnQgPSAlZCBcbiIKIAkJCQksIGFjYi0+aG9zdC0+aG9zdF9ubwogCQkJCSwgYWNiCi0JCQkJLCBjY2IKLQkJCQksIGNjYi0+YWNiCi0JCQkJLCBjY2ItPnN0YXJ0ZG9uZQorCQkJCSwgcENDQgorCQkJCSwgcENDQi0+YWNiCisJCQkJLCBwQ0NCLT5zdGFydGRvbmUKIAkJCQksIGF0b21pY19yZWFkKCZhY2ItPmNjYm91dHN0YW5kaW5nY291bnQpKTsKKwkJICByZXR1cm47CiAJCX0KLQllbHNlCi0JYXJjbXNyX3JlcG9ydF9jY2Jfc3RhdGUoYWNiLCBjY2IsIGZsYWdfY2NiKTsKKwlhcmNtc3JfcmVwb3J0X2NjYl9zdGF0ZShhY2IsIHBDQ0IsIGVycm9yKTsKIH0KIAogc3RhdGljIHZvaWQgYXJjbXNyX2RvbmU0YWJvcnRfcG9zdHF1ZXVlKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCiB7CiAJaW50IGkgPSAwOwogCXVpbnQzMl90IGZsYWdfY2NiOwotCisJc3RydWN0IEFSQ01TUl9DREIgKnBBUkNNU1JfQ0RCOworCWJvb2wgZXJyb3I7CisJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKnBDQ0I7CiAJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewogCiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKQEAgLTg1Miw5ICs5NjgsMTIgQEAKIAkJCQkJYWNiLT5vdXRib3VuZF9pbnRfZW5hYmxlOwogCQkvKmNsZWFyIGFuZCBhYm9ydCBhbGwgb3V0Ym91bmQgcG9zdGVkIFEqLwogCQl3cml0ZWwob3V0Ym91bmRfaW50c3RhdHVzLCAmcmVnLT5vdXRib3VuZF9pbnRzdGF0dXMpOy8qY2xlYXIgaW50ZXJydXB0Ki8KLQkJd2hpbGUgKCgoZmxhZ19jY2IgPSByZWFkbCgmcmVnLT5vdXRib3VuZF9xdWV1ZXBvcnQpKSAhPSAweEZGRkZGRkZGKQorCQl3aGlsZSgoKGZsYWdfY2NiID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfcXVldWVwb3J0KSkgIT0gMHhGRkZGRkZGRikKIAkJCQkmJiAoaSsrIDwgQVJDTVNSX01BWF9PVVRTVEFORElOR19DTUQpKSB7Ci0JCQlhcmNtc3JfZHJhaW5fZG9uZXF1ZXVlKGFjYiwgZmxhZ19jY2IpOworCQkJcEFSQ01TUl9DREIgPSAoc3RydWN0IEFSQ01TUl9DREIgKikoYWNiLT52aXIycGh5X29mZnNldCArIChmbGFnX2NjYiA8PCA1KSk7LypmcmFtZSBtdXN0IGJlIDMyIGJ5dGVzIGFsaWduZWQqLworCQkJcENDQiA9IGNvbnRhaW5lcl9vZihwQVJDTVNSX0NEQiwgc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2ssIGFyY21zcl9jZGIpOworCQkJZXJyb3IgPSAoZmxhZ19jY2IgJiBBUkNNU1JfQ0NCUkVQTFlfRkxBR19FUlJPUl9NT0RFMCkgPyB0cnVlIDogZmFsc2U7CisJCQlhcmNtc3JfZHJhaW5fZG9uZXF1ZXVlKGFjYiwgcENDQiwgZXJyb3IpOwogCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC04NjIsMTcgKzk4MSwzNyBAQAogCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9COiB7CiAJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7CiAJCS8qY2xlYXIgYWxsIG91dGJvdW5kIHBvc3RlZCBRKi8KKwkJd3JpdGVsKEFSQ01TUl9ET09SQkVMTF9JTlRfQ0xFQVJfUEFUVEVSTiwgJnJlZy0+aW9wMmRydl9kb29yYmVsbCk7IC8qIGNsZWFyIGRvb3JiZWxsIGludGVycnVwdCAqLwogCQlmb3IgKGkgPSAwOyBpIDwgQVJDTVNSX01BWF9IQkJfUE9TVFFVRVVFOyBpKyspIHsKIAkJCWlmICgoZmxhZ19jY2IgPSByZWFkbCgmcmVnLT5kb25lX3FidWZmZXJbaV0pKSAhPSAwKSB7CiAJCQkJd3JpdGVsKDAsICZyZWctPmRvbmVfcWJ1ZmZlcltpXSk7Ci0JCQkJYXJjbXNyX2RyYWluX2RvbmVxdWV1ZShhY2IsIGZsYWdfY2NiKTsKKwkJCQlwQVJDTVNSX0NEQiA9IChzdHJ1Y3QgQVJDTVNSX0NEQiAqKShhY2ItPnZpcjJwaHlfb2Zmc2V0KyhmbGFnX2NjYiA8PCA1KSk7LypmcmFtZSBtdXN0IGJlIDMyIGJ5dGVzIGFsaWduZWQqLworCQkJCXBDQ0IgPSBjb250YWluZXJfb2YocEFSQ01TUl9DREIsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrLCBhcmNtc3JfY2RiKTsKKwkJCQllcnJvciA9IChmbGFnX2NjYiAmIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SX01PREUwKSA/IHRydWUgOiBmYWxzZTsKKwkJCQlhcmNtc3JfZHJhaW5fZG9uZXF1ZXVlKGFjYiwgcENDQiwgZXJyb3IpOwogCQkJfQotCQkJd3JpdGVsKDAsICZyZWctPnBvc3RfcWJ1ZmZlcltpXSk7CisJCQlyZWctPnBvc3RfcWJ1ZmZlcltpXSA9IDA7CiAJCX0KIAkJcmVnLT5kb25lcV9pbmRleCA9IDA7CiAJCXJlZy0+cG9zdHFfaW5kZXggPSAwOwogCQl9CiAJCWJyZWFrOworCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9DOiB7CisJCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpyZWcgPSBhY2ItPnBtdUM7CisJCXN0cnVjdCAgQVJDTVNSX0NEQiAqcEFSQ01TUl9DREI7CisJCXVpbnQzMl90IGZsYWdfY2NiLCBjY2JfY2RiX3BoeTsKKwkJYm9vbCBlcnJvcjsKKwkJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKnBDQ0I7CisJCXdoaWxlICgocmVhZGwoJnJlZy0+aG9zdF9pbnRfc3RhdHVzKSAmIEFSQ01TUl9IQkNNVV9PVVRCT1VORF9QT1NUUVVFVUVfSVNSKSAmJiAoaSsrIDwgQVJDTVNSX01BWF9PVVRTVEFORElOR19DTUQpKSB7CisJCQkvKm5lZWQgdG8gZG8qLworCQkJZmxhZ19jY2IgPSByZWFkbCgmcmVnLT5vdXRib3VuZF9xdWV1ZXBvcnRfbG93KTsKKwkJCWNjYl9jZGJfcGh5ID0gKGZsYWdfY2NiICYgMHhGRkZGRkZGMCk7CisJCQlwQVJDTVNSX0NEQiA9IChzdHJ1Y3QgIEFSQ01TUl9DREIgKikoYWNiLT52aXIycGh5X29mZnNldCtjY2JfY2RiX3BoeSk7LypmcmFtZSBtdXN0IGJlIDMyIGJ5dGVzIGFsaWduZWQqLworCQkJcENDQiA9IGNvbnRhaW5lcl9vZihwQVJDTVNSX0NEQiwgc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2ssIGFyY21zcl9jZGIpOworCQkJZXJyb3IgPSAoZmxhZ19jY2IgJiBBUkNNU1JfQ0NCUkVQTFlfRkxBR19FUlJPUl9NT0RFMSkgPyB0cnVlIDogZmFsc2U7CisJCQlhcmNtc3JfZHJhaW5fZG9uZXF1ZXVlKGFjYiwgcENDQiwgZXJyb3IpOworCQl9CisJfQogCX0KIH0KIHN0YXRpYyB2b2lkIGFyY21zcl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC04ODcsMTEgKzEwMjYsMTEgQEAKIAlkZWxfdGltZXJfc3luYygmYWNiLT5ldGVybmFsX3RpbWVyKTsKIAlhcmNtc3JfZGlzYWJsZV9vdXRib3VuZF9pbnRzKGFjYik7CiAJYXJjbXNyX3N0b3BfYWRhcHRlcl9iZ3JiKGFjYik7Ci0JYXJjbXNyX2ZsdXNoX2FkYXB0ZXJfY2FjaGUoYWNiKTsKKwlhcmNtc3JfZmx1c2hfYWRhcHRlcl9jYWNoZShhY2IpOwkKIAlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9TQ1NJU1RPUEFEQVBURVI7CiAJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0lPUF9JTklURUQ7CiAKLQlmb3IgKHBvbGxfY291bnQgPSAwOyBwb2xsX2NvdW50IDwgQVJDTVNSX01BWF9PVVRTVEFORElOR19DTUQ7IHBvbGxfY291bnQrKykgeworCWZvciAocG9sbF9jb3VudCA9IDA7IHBvbGxfY291bnQgPCBBUkNNU1JfTUFYX09VVFNUQU5ESU5HX0NNRDsgcG9sbF9jb3VudCsrKXsKIAkJaWYgKCFhdG9taWNfcmVhZCgmYWNiLT5jY2JvdXRzdGFuZGluZ2NvdW50KSkKIAkJCWJyZWFrOwogCQlhcmNtc3JfaW50ZXJydXB0KGFjYik7LyogRklYTUU6IG5lZWQgc3BpbmxvY2sgKi8KQEAgLTkwOCwxNyArMTA0NywxNiBAQAogCQkJaWYgKGNjYi0+c3RhcnRkb25lID09IEFSQ01TUl9DQ0JfU1RBUlQpIHsKIAkJCQljY2ItPnN0YXJ0ZG9uZSA9IEFSQ01TUl9DQ0JfQUJPUlRFRDsKIAkJCQljY2ItPnBjbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKLQkJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKGNjYiwgMSk7CisJCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IpOwogCQkJfQogCQl9CiAJfQotCiAJZnJlZV9pcnEocGRldi0+aXJxLCBhY2IpOwogCWFyY21zcl9mcmVlX2NjYl9wb29sKGFjYik7CisJYXJjbXNyX2ZyZWVfaGJiX211KGFjYik7CisJYXJjbXNyX3VubWFwX3BjaXJlZ2lvbihhY2IpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0KIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwotCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KQEAgLTkzOCw3ICsxMDc2LDYgQEAKIHN0YXRpYyBpbnQgYXJjbXNyX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW50IGVycm9yID0gMDsKLQogCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXJjbXNyX3BjaV9kcml2ZXIpOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTk1NCwxMCArMTA5MSw5IEBACiAJCQkJCQl1MzIgaW50bWFza19vcmcpCiB7CiAJdTMyIG1hc2s7Ci0KIAlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7CiAKLQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQSA6IHsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewogCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7CiAJCW1hc2sgPSBpbnRtYXNrX29yZyAmIH4oQVJDTVNSX01VX09VVEJPVU5EX1BPU1RRVUVVRV9JTlRNQVNLRU5BQkxFIHwKIAkJCSAgICAgQVJDTVNSX01VX09VVEJPVU5EX0RPT1JCRUxMX0lOVE1BU0tFTkFCTEV8CkBAIC05NjcsMTUgKzExMDMsMjIgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9CIDogeworCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9COiB7CiAJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7CiAJCW1hc2sgPSBpbnRtYXNrX29yZyB8IChBUkNNU1JfSU9QMkRSVl9EQVRBX1dSSVRFX09LIHwKIAkJCUFSQ01TUl9JT1AyRFJWX0RBVEFfUkVBRF9PSyB8CiAJCQlBUkNNU1JfSU9QMkRSVl9DREJfRE9ORSB8CiAJCQlBUkNNU1JfSU9QMkRSVl9NRVNTQUdFX0NNRF9ET05FKTsKLQkJd3JpdGVsKG1hc2ssIHJlZy0+aW9wMmRydl9kb29yYmVsbF9tYXNrX3JlZyk7CisJCXdyaXRlbChtYXNrLCByZWctPmlvcDJkcnZfZG9vcmJlbGxfbWFzayk7CiAJCWFjYi0+b3V0Ym91bmRfaW50X2VuYWJsZSA9IChpbnRtYXNrX29yZyB8IG1hc2spICYgMHgwMDAwMDAwZjsKIAkJfQorCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqcmVnID0gYWNiLT5wbXVDOworCQltYXNrID0gfihBUkNNU1JfSEJDTVVfVVRJTElUWV9BX0lTUl9NQVNLIHwgQVJDTVNSX0hCQ01VX09VVEJPVU5EX0RPT1JCRUxMX0lTUl9NQVNLfEFSQ01TUl9IQkNNVV9PVVRCT1VORF9QT1NUUVVFVUVfSVNSX01BU0spOworCQl3cml0ZWwoaW50bWFza19vcmcgJiBtYXNrLCAmcmVnLT5ob3N0X2ludF9tYXNrKTsKKwkJYWNiLT5vdXRib3VuZF9pbnRfZW5hYmxlID0gfihpbnRtYXNrX29yZyAmIG1hc2spICYgMHgwMDAwMDAwZjsKKwkJfQogCX0KIH0KIApAQCAtOTg2LDgwICsxMTI5LDcwIEBACiAJaW50OF90ICpwc2dlID0gKGludDhfdCAqKSZhcmNtc3JfY2RiLT51OwogCV9fbGUzMiBhZGRyZXNzX2xvLCBhZGRyZXNzX2hpOwogCWludCBhcmNjZGJzaXplID0gMHgzMDsKKwlfX2xlMzIgbGVuZ3RoID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBuc2VnOwotCiAJY2NiLT5wY21kID0gcGNtZDsKIAltZW1zZXQoYXJjbXNyX2NkYiwgMCwgc2l6ZW9mKHN0cnVjdCBBUkNNU1JfQ0RCKSk7Ci0JYXJjbXNyX2NkYi0+QnVzID0gMDsKIAlhcmNtc3JfY2RiLT5UYXJnZXRJRCA9IHBjbWQtPmRldmljZS0+aWQ7CiAJYXJjbXNyX2NkYi0+TFVOID0gcGNtZC0+ZGV2aWNlLT5sdW47CiAJYXJjbXNyX2NkYi0+RnVuY3Rpb24gPSAxOwotCWFyY21zcl9jZGItPkNkYkxlbmd0aCA9ICh1aW50OF90KXBjbWQtPmNtZF9sZW47Ci0JYXJjbXNyX2NkYi0+Q29udGV4dCA9ICh1bnNpZ25lZCBsb25nKWFyY21zcl9jZGI7CisJYXJjbXNyX2NkYi0+Q29udGV4dCA9IDA7CiAJbWVtY3B5KGFyY21zcl9jZGItPkNkYiwgcGNtZC0+Y21uZCwgcGNtZC0+Y21kX2xlbik7CiAKIAluc2VnID0gc2NzaV9kbWFfbWFwKHBjbWQpOwotCWlmIChuc2VnID4gQVJDTVNSX01BWF9TR19FTlRSSUVTKQorCWlmICh1bmxpa2VseShuc2VnID4gYWNiLT5ob3N0LT5zZ190YWJsZXNpemUgfHwgbnNlZyA8IDApKQogCQlyZXR1cm4gRkFJTEVEOwotCUJVR19PTihuc2VnIDwgMCk7CisJc2NzaV9mb3JfZWFjaF9zZyhwY21kLCBzZywgbnNlZywgaSkgeworCQkvKiBHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyICovCisJCWxlbmd0aCA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJYWRkcmVzc19sbyA9IGNwdV90b19sZTMyKGRtYV9hZGRyX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCWFkZHJlc3NfaGkgPSBjcHVfdG9fbGUzMihkbWFfYWRkcl9oaTMyKHNnX2RtYV9hZGRyZXNzKHNnKSkpOworCQlpZiAoYWRkcmVzc19oaSA9PSAwKSB7CisJCQlzdHJ1Y3QgU0czMkVOVFJZICpwZG1hX3NnID0gKHN0cnVjdCBTRzMyRU5UUlkgKilwc2dlOwogCi0JaWYgKG5zZWcpIHsKLQkJX19sZTMyIGxlbmd0aDsKLQkJaW50IGksIGNkYl9zZ2NvdW50ID0gMDsKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJCXBkbWFfc2ctPmFkZHJlc3MgPSBhZGRyZXNzX2xvOworCQkJcGRtYV9zZy0+bGVuZ3RoID0gbGVuZ3RoOworCQkJcHNnZSArPSBzaXplb2YgKHN0cnVjdCBTRzMyRU5UUlkpOworCQkJYXJjY2Ric2l6ZSArPSBzaXplb2YgKHN0cnVjdCBTRzMyRU5UUlkpOworCQl9IGVsc2UgeworCQkJc3RydWN0IFNHNjRFTlRSWSAqcGRtYV9zZyA9IChzdHJ1Y3QgU0c2NEVOVFJZICopcHNnZTsKIAotCQkvKiBtYXAgc3RvciBwb3J0IFNHIGxpc3QgdG8gb3VyIGlvcCBTRyBMaXN0LiAqLwotCQlzY3NpX2Zvcl9lYWNoX3NnKHBjbWQsIHNnLCBuc2VnLCBpKSB7Ci0JCQkvKiBHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyICovCi0JCQlsZW5ndGggPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7Ci0JCQlhZGRyZXNzX2xvID0gY3B1X3RvX2xlMzIoZG1hX2FkZHJfbG8zMihzZ19kbWFfYWRkcmVzcyhzZykpKTsKLQkJCWFkZHJlc3NfaGkgPSBjcHVfdG9fbGUzMihkbWFfYWRkcl9oaTMyKHNnX2RtYV9hZGRyZXNzKHNnKSkpOwotCQkJaWYgKGFkZHJlc3NfaGkgPT0gMCkgewotCQkJCXN0cnVjdCBTRzMyRU5UUlkgKnBkbWFfc2cgPSAoc3RydWN0IFNHMzJFTlRSWSAqKXBzZ2U7Ci0KLQkJCQlwZG1hX3NnLT5hZGRyZXNzID0gYWRkcmVzc19sbzsKLQkJCQlwZG1hX3NnLT5sZW5ndGggPSBsZW5ndGg7Ci0JCQkJcHNnZSArPSBzaXplb2YgKHN0cnVjdCBTRzMyRU5UUlkpOwotCQkJCWFyY2NkYnNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgU0czMkVOVFJZKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IFNHNjRFTlRSWSAqcGRtYV9zZyA9IChzdHJ1Y3QgU0c2NEVOVFJZICopcHNnZTsKLQotCQkJCXBkbWFfc2ctPmFkZHJlc3NoaWdoID0gYWRkcmVzc19oaTsKLQkJCQlwZG1hX3NnLT5hZGRyZXNzID0gYWRkcmVzc19sbzsKLQkJCQlwZG1hX3NnLT5sZW5ndGggPSBsZW5ndGh8Y3B1X3RvX2xlMzIoSVNfU0c2NF9BRERSKTsKLQkJCQlwc2dlICs9IHNpemVvZiAoc3RydWN0IFNHNjRFTlRSWSk7Ci0JCQkJYXJjY2Ric2l6ZSArPSBzaXplb2YgKHN0cnVjdCBTRzY0RU5UUlkpOwotCQkJfQotCQkJY2RiX3NnY291bnQrKzsKKwkJCXBkbWFfc2ctPmFkZHJlc3NoaWdoID0gYWRkcmVzc19oaTsKKwkJCXBkbWFfc2ctPmFkZHJlc3MgPSBhZGRyZXNzX2xvOworCQkJcGRtYV9zZy0+bGVuZ3RoID0gbGVuZ3RofGNwdV90b19sZTMyKElTX1NHNjRfQUREUik7CisJCQlwc2dlICs9IHNpemVvZiAoc3RydWN0IFNHNjRFTlRSWSk7CisJCQlhcmNjZGJzaXplICs9IHNpemVvZiAoc3RydWN0IFNHNjRFTlRSWSk7CiAJCX0KLQkJYXJjbXNyX2NkYi0+c2djb3VudCA9ICh1aW50OF90KWNkYl9zZ2NvdW50OwotCQlhcmNtc3JfY2RiLT5EYXRhTGVuZ3RoID0gc2NzaV9idWZmbGVuKHBjbWQpOwotCQlpZiAoIGFyY2NkYnNpemUgPiAyNTYpCi0JCQlhcmNtc3JfY2RiLT5GbGFncyB8PSBBUkNNU1JfQ0RCX0ZMQUdfU0dMX0JTSVpFOwogCX0KLQlpZiAocGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSApIHsKKwlhcmNtc3JfY2RiLT5zZ2NvdW50ID0gKHVpbnQ4X3QpbnNlZzsKKwlhcmNtc3JfY2RiLT5EYXRhTGVuZ3RoID0gc2NzaV9idWZmbGVuKHBjbWQpOworCWFyY21zcl9jZGItPm1zZ1BhZ2VzID0gYXJjY2Ric2l6ZS8weDEwMCArIChhcmNjZGJzaXplICUgMHgxMDAgPyAxIDogMCk7CisJaWYgKCBhcmNjZGJzaXplID4gMjU2KQorCQlhcmNtc3JfY2RiLT5GbGFncyB8PSBBUkNNU1JfQ0RCX0ZMQUdfU0dMX0JTSVpFOworCWlmIChwY21kLT5jbW5kWzBdfFdSSVRFXzYgfHwgcGNtZC0+Y21uZFswXXxXUklURV8xMCB8fCBwY21kLT5jbW5kWzBdfFdSSVRFXzEyICl7CiAJCWFyY21zcl9jZGItPkZsYWdzIHw9IEFSQ01TUl9DREJfRkxBR19XUklURTsKLQkJY2NiLT5jY2JfZmxhZ3MgfD0gQ0NCX0ZMQUdfV1JJVEU7CiAJfQorCWNjYi0+YXJjX2NkYl9zaXplID0gYXJjY2Ric2l6ZTsKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIAogc3RhdGljIHZvaWQgYXJjbXNyX3Bvc3RfY2NiKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2IpCiB7Ci0JdWludDMyX3QgY2RiX3NoaWZ0ZWRfcGh5YWRkciA9IGNjYi0+Y2RiX3NoaWZ0ZWRfcGh5YWRkcjsKKwl1aW50MzJfdCBjZGJfcGh5YWRkcl9wYXR0ZXJuID0gY2NiLT5jZGJfcGh5YWRkcl9wYXR0ZXJuOwogCXN0cnVjdCBBUkNNU1JfQ0RCICphcmNtc3JfY2RiID0gKHN0cnVjdCBBUkNNU1JfQ0RCICopJmNjYi0+YXJjbXNyX2NkYjsKIAlhdG9taWNfaW5jKCZhY2ItPmNjYm91dHN0YW5kaW5nY291bnQpOwogCWNjYi0+c3RhcnRkb25lID0gQVJDTVNSX0NDQl9TVEFSVDsKLQogCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKIAljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewogCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7CiAKIAkJaWYgKGFyY21zcl9jZGItPkZsYWdzICYgQVJDTVNSX0NEQl9GTEFHX1NHTF9CU0laRSkKLQkJCXdyaXRlbChjZGJfc2hpZnRlZF9waHlhZGRyIHwgQVJDTVNSX0NDQlBPU1RfRkxBR19TR0xfQlNJWkUsCisJCQl3cml0ZWwoY2RiX3BoeWFkZHJfcGF0dGVybiB8IEFSQ01TUl9DQ0JQT1NUX0ZMQUdfU0dMX0JTSVpFLAogCQkJJnJlZy0+aW5ib3VuZF9xdWV1ZXBvcnQpOwogCQllbHNlIHsKLQkJCQl3cml0ZWwoY2RiX3NoaWZ0ZWRfcGh5YWRkciwgJnJlZy0+aW5ib3VuZF9xdWV1ZXBvcnQpOworCQkJCXdyaXRlbChjZGJfcGh5YWRkcl9wYXR0ZXJuLCAmcmVnLT5pbmJvdW5kX3F1ZXVlcG9ydCk7CiAJCX0KIAkJfQogCQlicmVhazsKQEAgLTEwNzEsMTggKzEyMDQsMzAgQEAKIAkJZW5kaW5nX2luZGV4ID0gKChpbmRleCArIDEpICUgQVJDTVNSX01BWF9IQkJfUE9TVFFVRVVFKTsKIAkJd3JpdGVsKDAsICZyZWctPnBvc3RfcWJ1ZmZlcltlbmRpbmdfaW5kZXhdKTsKIAkJaWYgKGFyY21zcl9jZGItPkZsYWdzICYgQVJDTVNSX0NEQl9GTEFHX1NHTF9CU0laRSkgewotCQkJd3JpdGVsKGNkYl9zaGlmdGVkX3BoeWFkZHIgfCBBUkNNU1JfQ0NCUE9TVF9GTEFHX1NHTF9CU0laRSxcCisJCQl3cml0ZWwoY2RiX3BoeWFkZHJfcGF0dGVybiB8IEFSQ01TUl9DQ0JQT1NUX0ZMQUdfU0dMX0JTSVpFLFwKIAkJCQkJCSAmcmVnLT5wb3N0X3FidWZmZXJbaW5kZXhdKTsKLQkJfQotCQllbHNlIHsKLQkJCXdyaXRlbChjZGJfc2hpZnRlZF9waHlhZGRyLCAmcmVnLT5wb3N0X3FidWZmZXJbaW5kZXhdKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlbChjZGJfcGh5YWRkcl9wYXR0ZXJuLCAmcmVnLT5wb3N0X3FidWZmZXJbaW5kZXhdKTsKIAkJfQogCQlpbmRleCsrOwogCQlpbmRleCAlPSBBUkNNU1JfTUFYX0hCQl9QT1NUUVVFVUU7LyppZiBsYXN0IGluZGV4IG51bWJlciBzZXQgaXQgdG8gMCAqLwogCQlyZWctPnBvc3RxX2luZGV4ID0gaW5kZXg7Ci0JCXdyaXRlbChBUkNNU1JfRFJWMklPUF9DREJfUE9TVEVELCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKKwkJd3JpdGVsKEFSQ01TUl9EUlYySU9QX0NEQl9QT1NURUQsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6IHsKKwkJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnBoYmNtdSA9IChzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqKWFjYi0+cG11QzsKKwkJdWludDMyX3QgY2NiX3Bvc3Rfc3RhbXAsIGFyY19jZGJfc2l6ZTsKKworCQlhcmNfY2RiX3NpemUgPSAoY2NiLT5hcmNfY2RiX3NpemUgPiAweDMwMCkgPyAweDMwMCA6IGNjYi0+YXJjX2NkYl9zaXplOworCQljY2JfcG9zdF9zdGFtcCA9IChjZGJfcGh5YWRkcl9wYXR0ZXJuIHwgKChhcmNfY2RiX3NpemUgLSAxKSA+PiA2KSB8IDEpOworCQlpZiAoYWNiLT5jZGJfcGh5YWRkcl9oaTMyKSB7CisJCQl3cml0ZWwoYWNiLT5jZGJfcGh5YWRkcl9oaTMyLCAmcGhiY211LT5pbmJvdW5kX3F1ZXVlcG9ydF9oaWdoKTsKKwkJCXdyaXRlbChjY2JfcG9zdF9zdGFtcCwgJnBoYmNtdS0+aW5ib3VuZF9xdWV1ZXBvcnRfbG93KTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlbChjY2JfcG9zdF9zdGFtcCwgJnBoYmNtdS0+aW5ib3VuZF9xdWV1ZXBvcnRfbG93KTsKKwkJfQorCQl9CiAJfQogfQogCkBAIC0xMDkxLDggKzEyMzYsNyBAQAogCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QTsKIAlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfTVNHX1NUQVJUX0JHUkI7CiAJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX01FU0cwX1NUT1BfQkdSQiwgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7Ci0KLQlpZiAoYXJjbXNyX2hiYV93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CisJaWYgKCFhcmNtc3JfaGJhX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFCiAJCQkiYXJjbXNyJWQ6IHdhaXQgJ3N0b3AgYWRhcHRlciBiYWNrZ3JvdW5kIHJlYnVsaWQnIHRpbWVvdXQgXG4iCiAJCQksIGFjYi0+aG9zdC0+aG9zdF9ubyk7CkBAIC0xMTAzLDE1ICsxMjQ3LDI4IEBACiB7CiAJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKIAlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfTVNHX1NUQVJUX0JHUkI7Ci0Jd3JpdGVsKEFSQ01TUl9NRVNTQUdFX1NUT1BfQkdSQiwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7CisJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX1NUT1BfQkdSQiwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsKTsKIAotCWlmIChhcmNtc3JfaGJiX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKKwlpZiAoIWFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UKIAkJCSJhcmNtc3IlZDogd2FpdCAnc3RvcCBhZGFwdGVyIGJhY2tncm91bmQgcmVidWxpZCcgdGltZW91dCBcbiIKIAkJCSwgYWNiLT5ob3N0LT5ob3N0X25vKTsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFyY21zcl9zdG9wX2hiY19iZ3JiKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICpwQUNCKQoreworCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpyZWcgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0MgKilwQUNCLT5wbXVDOworCXBBQ0ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfTVNHX1NUQVJUX0JHUkI7CisJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX01FU0cwX1NUT1BfQkdSQiwgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7CisJd3JpdGVsKEFSQ01TUl9IQkNNVV9EUlYySU9QX01FU1NBR0VfQ01EX0RPTkUsICZyZWctPmluYm91bmRfZG9vcmJlbGwpOworCWlmICghYXJjbXNyX2hiY193YWl0X21zZ2ludF9yZWFkeShwQUNCKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSJhcmNtc3IlZDogd2FpdCAnc3RvcCBhZGFwdGVyIGJhY2tncm91bmQgcmVidWxpZCcgdGltZW91dCBcbiIKKwkJCSwgcEFDQi0+aG9zdC0+aG9zdF9ubyk7CisJfQorCXJldHVybjsKK30KIHN0YXRpYyB2b2lkIGFyY21zcl9zdG9wX2FkYXB0ZXJfYmdyYihzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKQEAgLTExMjQsMzAgKzEyODEsMTUgQEAKIAkJYXJjbXNyX3N0b3BfaGJiX2JncmIoYWNiKTsKIAkJfQogCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQlhcmNtc3Jfc3RvcF9oYmNfYmdyYihhY2IpOworCQl9CiAJfQogfQogCiBzdGF0aWMgdm9pZCBhcmNtc3JfZnJlZV9jY2JfcG9vbChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewotCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKLQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewotCQlpb3VubWFwKGFjYi0+cG11QSk7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZhY2ItPnBkZXYtPmRldiwKLQkJQVJDTVNSX01BWF9GUkVFQ0NCX05VTSAqIHNpemVvZiAoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2spICsgMHgyMCwKLQkJYWNiLT5kbWFfY29oZXJlbnQsCi0JCWFjYi0+ZG1hX2NvaGVyZW50X2hhbmRsZSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjogewotCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwotCQlpb3VubWFwKCh1OCAqKXJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9yZWcgLSBBUkNNU1JfRFJWMklPUF9ET09SQkVMTCk7Ci0JCWlvdW5tYXAoKHU4ICopcmVnLT5pb2N0bF93YnVmZmVyX3JlZyAtIEFSQ01TUl9JT0NUTF9XQlVGRkVSKTsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmFjYi0+cGRldi0+ZGV2LAotCQkoQVJDTVNSX01BWF9GUkVFQ0NCX05VTSAqIHNpemVvZihzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaykgKyAweDIwICsKLQkJc2l6ZW9mKHN0cnVjdCBNZXNzYWdlVW5pdF9CKSksIGFjYi0+ZG1hX2NvaGVyZW50LCBhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUpOwotCX0KLQl9Ci0KKwlkbWFfZnJlZV9jb2hlcmVudCgmYWNiLT5wZGV2LT5kZXYsIGFjYi0+dW5jYWNoZV9zaXplLCBhY2ItPmRtYV9jb2hlcmVudCwgYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlKTsKIH0KIAogdm9pZCBhcmNtc3JfaW9wX21lc3NhZ2VfcmVhZChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQpAQCAtMTE2MSw5ICsxMzAzLDEzIEBACiAKIAljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjogewogCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwotCQl3cml0ZWwoQVJDTVNSX0RSVjJJT1BfREFUQV9SRUFEX09LLCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKKwkJd3JpdGVsKEFSQ01TUl9EUlYySU9QX0RBVEFfUkVBRF9PSywgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsKTsKIAkJfQogCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUM7CisJCXdyaXRlbChBUkNNU1JfSEJDTVVfRFJWMklPUF9EQVRBX1JFQURfT0ssICZyZWctPmluYm91bmRfZG9vcmJlbGwpOworCQl9CiAJfQogfQogCkBAIC0xMTg2LDcgKzEzMzIsMTYgQEAKIAkJKiogcHVzaCBpbmJvdW5kIGRvb3JiZWxsIHRlbGwgaW9wLCBkcml2ZXIgZGF0YSB3cml0ZSBvawogCQkqKiBhbmQgd2FpdCByZXBseSBvbiBuZXh0IGh3aW50ZXJydXB0IGZvciBuZXh0IFFidWZmZXIgcG9zdAogCQkqLwotCQl3cml0ZWwoQVJDTVNSX0RSVjJJT1BfREFUQV9XUklURV9PSywgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7CisJCXdyaXRlbChBUkNNU1JfRFJWMklPUF9EQVRBX1dSSVRFX09LLCByZWctPmRydjJpb3BfZG9vcmJlbGwpOworCQl9CisJCWJyZWFrOworCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9DOiB7CisJCXN0cnVjdCBNZXNzYWdlVW5pdF9DIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QzsKKwkJLyoKKwkJKiogcHVzaCBpbmJvdW5kIGRvb3JiZWxsIHRlbGwgaW9wLCBkcml2ZXIgZGF0YSB3cml0ZSBvaworCQkqKiBhbmQgd2FpdCByZXBseSBvbiBuZXh0IGh3aW50ZXJydXB0IGZvciBuZXh0IFFidWZmZXIgcG9zdAorCQkqLworCQl3cml0ZWwoQVJDTVNSX0hCQ01VX0RSVjJJT1BfREFUQV9XUklURV9PSywgJnJlZy0+aW5ib3VuZF9kb29yYmVsbCk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMTE5NSw3ICsxMzUwLDYgQEAKIHN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKmFyY21zcl9nZXRfaW9wX3JxYnVmZmVyKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCiB7CiAJc3RydWN0IFFCVUZGRVIgX19pb21lbSAqcWJ1ZmZlciA9IE5VTEw7Ci0KIAlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7CiAKIAljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewpAQCAtMTIwNiw5ICsxMzYwLDEzIEBACiAKIAljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjogewogCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwotCQlxYnVmZmVyID0gKHN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKilyZWctPmlvY3RsX3JidWZmZXJfcmVnOworCQlxYnVmZmVyID0gKHN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKilyZWctPm1lc3NhZ2VfcmJ1ZmZlcjsKIAkJfQogCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqcGhiY211ID0gKHN0cnVjdCBNZXNzYWdlVW5pdF9DICopYWNiLT5wbXVDOworCQlxYnVmZmVyID0gKHN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKikmcGhiY211LT5tZXNzYWdlX3JidWZmZXI7CisJCX0KIAl9CiAJcmV0dXJuIHFidWZmZXI7CiB9CkBAIC0xMjE2LDcgKzEzNzQsNiBAQAogc3RhdGljIHN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKmFyY21zcl9nZXRfaW9wX3dxYnVmZmVyKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCiB7CiAJc3RydWN0IFFCVUZGRVIgX19pb21lbSAqcHFidWZmZXIgPSBOVUxMOwotCiAJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewogCiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKQEAgLTEyMjcsOSArMTM4NCwxNCBAQAogCiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKIAkJc3RydWN0IE1lc3NhZ2VVbml0X0IgICpyZWcgPSBhY2ItPnBtdUI7Ci0JCXBxYnVmZmVyID0gKHN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKilyZWctPmlvY3RsX3didWZmZXJfcmVnOworCQlwcWJ1ZmZlciA9IChzdHJ1Y3QgUUJVRkZFUiBfX2lvbWVtICopcmVnLT5tZXNzYWdlX3didWZmZXI7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6IHsKKwkJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnJlZyA9IChzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqKWFjYi0+cG11QzsKKwkJcHFidWZmZXIgPSAoc3RydWN0IFFCVUZGRVIgX19pb21lbSAqKSZyZWctPm1lc3NhZ2Vfd2J1ZmZlcjsKKwl9CisKIAl9CiAJcmV0dXJuIHBxYnVmZmVyOwogfQpAQCAtMTI0MCwxOSArMTQwMiwxOCBAQAogCXN0cnVjdCBRQlVGRkVSICpwUWJ1ZmZlcjsKIAl1aW50OF90IF9faW9tZW0gKmlvcF9kYXRhOwogCWludDMyX3QgbXlfZW1wdHlfbGVuLCBpb3BfbGVuLCBycWJ1Zl9maXJzdGluZGV4LCBycWJ1Zl9sYXN0aW5kZXg7Ci0KIAlycWJ1Zl9sYXN0aW5kZXggPSBhY2ItPnJxYnVmX2xhc3RpbmRleDsKIAlycWJ1Zl9maXJzdGluZGV4ID0gYWNiLT5ycWJ1Zl9maXJzdGluZGV4OwogCXByYnVmZmVyID0gYXJjbXNyX2dldF9pb3BfcnFidWZmZXIoYWNiKTsKIAlpb3BfZGF0YSA9ICh1aW50OF90IF9faW9tZW0gKilwcmJ1ZmZlci0+ZGF0YTsKIAlpb3BfbGVuID0gcHJidWZmZXItPmRhdGFfbGVuOwotCW15X2VtcHR5X2xlbiA9IChycWJ1Zl9maXJzdGluZGV4IC0gcnFidWZfbGFzdGluZGV4IC0xKSYoQVJDTVNSX01BWF9RQlVGRkVSIC0xKTsKKwlteV9lbXB0eV9sZW4gPSAocnFidWZfZmlyc3RpbmRleCAtIHJxYnVmX2xhc3RpbmRleCAtIDEpICYgKEFSQ01TUl9NQVhfUUJVRkZFUiAtIDEpOwogCiAJaWYgKG15X2VtcHR5X2xlbiA+PSBpb3BfbGVuKQogCXsKIAkJd2hpbGUgKGlvcF9sZW4gPiAwKSB7CiAJCQlwUWJ1ZmZlciA9IChzdHJ1Y3QgUUJVRkZFUiAqKSZhY2ItPnJxYnVmZmVyW3JxYnVmX2xhc3RpbmRleF07Ci0JCQltZW1jcHkocFFidWZmZXIsIGlvcF9kYXRhLDEpOworCQkJbWVtY3B5KHBRYnVmZmVyLCBpb3BfZGF0YSwgMSk7CiAJCQlycWJ1Zl9sYXN0aW5kZXgrKzsKIAkJCXJxYnVmX2xhc3RpbmRleCAlPSBBUkNNU1JfTUFYX1FCVUZGRVI7CiAJCQlpb3BfZGF0YSsrOwpAQCAtMTMwMywyNSArMTQ2NCw1MiBAQAogewogCXVpbnQzMl90IG91dGJvdW5kX2Rvb3JiZWxsOwogCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QTsKLQogCW91dGJvdW5kX2Rvb3JiZWxsID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfZG9vcmJlbGwpOwogCXdyaXRlbChvdXRib3VuZF9kb29yYmVsbCwgJnJlZy0+b3V0Ym91bmRfZG9vcmJlbGwpOwogCWlmIChvdXRib3VuZF9kb29yYmVsbCAmIEFSQ01TUl9PVVRCT1VORF9JT1AzMzFfREFUQV9XUklURV9PSykgewogCQlhcmNtc3JfaW9wMmRydl9kYXRhX3dyb3RlX2hhbmRsZShhY2IpOwogCX0KIAotCWlmIChvdXRib3VuZF9kb29yYmVsbCAmIEFSQ01TUl9PVVRCT1VORF9JT1AzMzFfREFUQV9SRUFEX09LKSAJeworCWlmIChvdXRib3VuZF9kb29yYmVsbCAmIEFSQ01TUl9PVVRCT1VORF9JT1AzMzFfREFUQV9SRUFEX09LKSB7CiAJCWFyY21zcl9pb3AyZHJ2X2RhdGFfcmVhZF9oYW5kbGUoYWNiKTsKIAl9CiB9Ci0KK3N0YXRpYyB2b2lkIGFyY21zcl9oYmNfZG9vcmJlbGxfaXNyKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICpwQUNCKQoreworCXVpbnQzMl90IG91dGJvdW5kX2Rvb3JiZWxsOworCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpyZWcgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0MgKilwQUNCLT5wbXVDOworCS8qCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqICBNYXliZSBoZXJlIHdlIG5lZWQgdG8gY2hlY2sgd3JxYnVmZmVyX2xvY2sgaXMgbG9jayBvciBub3QKKwkqKiAgRE9PUkJFTEw6IGRpbiEgZG9uIQorCSoqICBjaGVjayBpZiB0aGVyZSBhcmUgYW55IG1haWwgbmVlZCB0byBwYWNrIGZyb20gZmlybXdhcmUKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKi8KKwlvdXRib3VuZF9kb29yYmVsbCA9IHJlYWRsKCZyZWctPm91dGJvdW5kX2Rvb3JiZWxsKTsKKwl3cml0ZWwob3V0Ym91bmRfZG9vcmJlbGwsICZyZWctPm91dGJvdW5kX2Rvb3JiZWxsX2NsZWFyKTsvKmNsZWFyIGludGVycnVwdCovCisJaWYgKG91dGJvdW5kX2Rvb3JiZWxsICYgQVJDTVNSX0hCQ01VX0lPUDJEUlZfREFUQV9XUklURV9PSykgeworCQlhcmNtc3JfaW9wMmRydl9kYXRhX3dyb3RlX2hhbmRsZShwQUNCKTsKKwl9CisJaWYgKG91dGJvdW5kX2Rvb3JiZWxsICYgQVJDTVNSX0hCQ01VX0lPUDJEUlZfREFUQV9SRUFEX09LKSB7CisJCWFyY21zcl9pb3AyZHJ2X2RhdGFfcmVhZF9oYW5kbGUocEFDQik7CisJfQorCWlmIChvdXRib3VuZF9kb29yYmVsbCAmIEFSQ01TUl9IQkNNVV9JT1AyRFJWX01FU1NBR0VfQ01EX0RPTkUpIHsKKwkJYXJjbXNyX2hiY19tZXNzYWdlX2lzcihwQUNCKTsgICAgLyogbWVzc2VuZ2VyIG9mICJkcml2ZXIgdG8gaW9wIGNvbW1hbmRzIiAqLworCX0KKwlyZXR1cm47Cit9CiBzdGF0aWMgdm9pZCBhcmNtc3JfaGJhX3Bvc3RxdWV1ZV9pc3Ioc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAl1aW50MzJfdCBmbGFnX2NjYjsKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7Ci0KKwlzdHJ1Y3QgQVJDTVNSX0NEQiAqcEFSQ01TUl9DREI7CisJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKnBDQ0I7CisJYm9vbCBlcnJvcjsKIAl3aGlsZSAoKGZsYWdfY2NiID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfcXVldWVwb3J0KSkgIT0gMHhGRkZGRkZGRikgewotCQlhcmNtc3JfZHJhaW5fZG9uZXF1ZXVlKGFjYiwgZmxhZ19jY2IpOworCQlwQVJDTVNSX0NEQiA9IChzdHJ1Y3QgQVJDTVNSX0NEQiAqKShhY2ItPnZpcjJwaHlfb2Zmc2V0ICsgKGZsYWdfY2NiIDw8IDUpKTsvKmZyYW1lIG11c3QgYmUgMzIgYnl0ZXMgYWxpZ25lZCovCisJCXBDQ0IgPSBjb250YWluZXJfb2YocEFSQ01TUl9DREIsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrLCBhcmNtc3JfY2RiKTsKKwkJZXJyb3IgPSAoZmxhZ19jY2IgJiBBUkNNU1JfQ0NCUkVQTFlfRkxBR19FUlJPUl9NT0RFMCkgPyB0cnVlIDogZmFsc2U7CisJCWFyY21zcl9kcmFpbl9kb25lcXVldWUoYWNiLCBwQ0NCLCBlcnJvcik7CiAJfQogfQogCkBAIC0xMzMwLDI5ICsxNTE4LDYyIEBACiAJdWludDMyX3QgaW5kZXg7CiAJdWludDMyX3QgZmxhZ19jY2I7CiAJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKLQorCXN0cnVjdCBBUkNNU1JfQ0RCICpwQVJDTVNSX0NEQjsKKwlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqcENDQjsKKwlib29sIGVycm9yOwogCWluZGV4ID0gcmVnLT5kb25lcV9pbmRleDsKLQogCXdoaWxlICgoZmxhZ19jY2IgPSByZWFkbCgmcmVnLT5kb25lX3FidWZmZXJbaW5kZXhdKSkgIT0gMCkgewogCQl3cml0ZWwoMCwgJnJlZy0+ZG9uZV9xYnVmZmVyW2luZGV4XSk7Ci0JCWFyY21zcl9kcmFpbl9kb25lcXVldWUoYWNiLCBmbGFnX2NjYik7CisJCXBBUkNNU1JfQ0RCID0gKHN0cnVjdCBBUkNNU1JfQ0RCICopKGFjYi0+dmlyMnBoeV9vZmZzZXQrKGZsYWdfY2NiIDw8IDUpKTsvKmZyYW1lIG11c3QgYmUgMzIgYnl0ZXMgYWxpZ25lZCovCisJCXBDQ0IgPSBjb250YWluZXJfb2YocEFSQ01TUl9DREIsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrLCBhcmNtc3JfY2RiKTsKKwkJZXJyb3IgPSAoZmxhZ19jY2IgJiBBUkNNU1JfQ0NCUkVQTFlfRkxBR19FUlJPUl9NT0RFMCkgPyB0cnVlIDogZmFsc2U7CisJCWFyY21zcl9kcmFpbl9kb25lcXVldWUoYWNiLCBwQ0NCLCBlcnJvcik7CiAJCWluZGV4Kys7CiAJCWluZGV4ICU9IEFSQ01TUl9NQVhfSEJCX1BPU1RRVUVVRTsKIAkJcmVnLT5kb25lcV9pbmRleCA9IGluZGV4OwogCX0KIH0KKworc3RhdGljIHZvaWQgYXJjbXNyX2hiY19wb3N0cXVldWVfaXNyKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCit7CisJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnBoYmNtdTsKKwlzdHJ1Y3QgQVJDTVNSX0NEQiAqYXJjbXNyX2NkYjsKKwlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiOworCXVpbnQzMl90IGZsYWdfY2NiLCBjY2JfY2RiX3BoeSwgdGhyb3R0bGluZyA9IDA7CisJaW50IGVycm9yOworCisJcGhiY211ID0gKHN0cnVjdCBNZXNzYWdlVW5pdF9DICopYWNiLT5wbXVDOworCS8qIGFyZWNhIGNkYiBjb21tYW5kIGRvbmUgKi8KKwkvKiBVc2UgY29ycmVjdCBvZmZzZXQgYW5kIHNpemUgZm9yIHN5bmNpbmcgKi8KKworCXdoaWxlIChyZWFkbCgmcGhiY211LT5ob3N0X2ludF9zdGF0dXMpICYKKwlBUkNNU1JfSEJDTVVfT1VUQk9VTkRfUE9TVFFVRVVFX0lTUil7CisJLyogY2hlY2sgaWYgY29tbWFuZCBkb25lIHdpdGggbm8gZXJyb3IqLworCWZsYWdfY2NiID0gcmVhZGwoJnBoYmNtdS0+b3V0Ym91bmRfcXVldWVwb3J0X2xvdyk7CisJY2NiX2NkYl9waHkgPSAoZmxhZ19jY2IgJiAweEZGRkZGRkYwKTsvKmZyYW1lIG11c3QgYmUgMzIgYnl0ZXMgYWxpZ25lZCovCisJYXJjbXNyX2NkYiA9IChzdHJ1Y3QgQVJDTVNSX0NEQiAqKShhY2ItPnZpcjJwaHlfb2Zmc2V0ICsgY2NiX2NkYl9waHkpOworCWNjYiA9IGNvbnRhaW5lcl9vZihhcmNtc3JfY2RiLCBzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaywgYXJjbXNyX2NkYik7CisJZXJyb3IgPSAoZmxhZ19jY2IgJiBBUkNNU1JfQ0NCUkVQTFlfRkxBR19FUlJPUl9NT0RFMSkgPyB0cnVlIDogZmFsc2U7CisJLyogY2hlY2sgaWYgY29tbWFuZCBkb25lIHdpdGggbm8gZXJyb3IgKi8KKwlhcmNtc3JfZHJhaW5fZG9uZXF1ZXVlKGFjYiwgY2NiLCBlcnJvcik7CisJaWYgKHRocm90dGxpbmcgPT0gQVJDTVNSX0hCQ19JU1JfVEhST1RUTElOR19MRVZFTCkgeworCQl3cml0ZWwoQVJDTVNSX0hCQ01VX0RSVjJJT1BfUE9TVFFVRVVFX1RIUk9UVExJTkcsICZwaGJjbXUtPmluYm91bmRfZG9vcmJlbGwpOworCQlicmVhazsKKwl9CisJdGhyb3R0bGluZysrOworCX0KK30KIC8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiBIYW5kbGUgYSBtZXNzYWdlIGludGVycnVwdAogKioKLSoqIFRoZSBvbmx5IG1lc3NhZ2UgaW50ZXJydXB0IHdlIGV4cGVjdCBpcyBpbiByZXNwb25zZSB0byBhIHF1ZXJ5IGZvciB0aGUgY3VycmVudCBhZGFwdGVyIGNvbmZpZy4KKyoqIFRoZSBvbmx5IG1lc3NhZ2UgaW50ZXJydXB0IHdlIGV4cGVjdCBpcyBpbiByZXNwb25zZSB0byBhIHF1ZXJ5IGZvciB0aGUgY3VycmVudCBhZGFwdGVyIGNvbmZpZy4gIAogKiogV2Ugd2FudCB0aGlzIGluIG9yZGVyIHRvIGNvbXBhcmUgdGhlIGRyaXZlbWFwIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBuZXdseS1hdHRhY2hlZCBkcml2ZXMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwogc3RhdGljIHZvaWQgYXJjbXNyX2hiYV9tZXNzYWdlX2lzcihzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXN0cnVjdCBNZXNzYWdlVW5pdF9BICpyZWcgID0gYWNiLT5wbXVBOwotCiAJLypjbGVhciBpbnRlcnJ1cHQgYW5kIG1lc3NhZ2Ugc3RhdGUqLwogCXdyaXRlbChBUkNNU1JfTVVfT1VUQk9VTkRfTUVTU0FHRTBfSU5ULCAmcmVnLT5vdXRib3VuZF9pbnRzdGF0dXMpOwogCXNjaGVkdWxlX3dvcmsoJmFjYi0+YXJjbXNyX2RvX21lc3NhZ2VfaXNyX2JoKTsKQEAgLTEzNjIsMTYgKzE1ODMsMzIgQEAKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnICA9IGFjYi0+cG11QjsKIAogCS8qY2xlYXIgaW50ZXJydXB0IGFuZCBtZXNzYWdlIHN0YXRlKi8KLQl3cml0ZWwoQVJDTVNSX01FU1NBR0VfSU5UX0NMRUFSX1BBVFRFUk4sIHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpOworCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9JTlRfQ0xFQVJfUEFUVEVSTiwgcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsKTsKIAlzY2hlZHVsZV93b3JrKCZhY2ItPmFyY21zcl9kb19tZXNzYWdlX2lzcl9iaCk7CiB9CisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogSGFuZGxlIGEgbWVzc2FnZSBpbnRlcnJ1cHQKKyoqCisqKiBUaGUgb25seSBtZXNzYWdlIGludGVycnVwdCB3ZSBleHBlY3QgaXMgaW4gcmVzcG9uc2UgdG8gYSBxdWVyeSBmb3IgdGhlCisqKiBjdXJyZW50IGFkYXB0ZXIgY29uZmlnLgorKiogV2Ugd2FudCB0aGlzIGluIG9yZGVyIHRvIGNvbXBhcmUgdGhlIGRyaXZlbWFwIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBuZXdseS1hdHRhY2hlZCBkcml2ZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworc3RhdGljIHZvaWQgYXJjbXNyX2hiY19tZXNzYWdlX2lzcihzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQoreworCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpyZWcgID0gYWNiLT5wbXVDOworCS8qY2xlYXIgaW50ZXJydXB0IGFuZCBtZXNzYWdlIHN0YXRlKi8KKwl3cml0ZWwoQVJDTVNSX0hCQ01VX0lPUDJEUlZfTUVTU0FHRV9DTURfRE9ORV9ET09SQkVMTF9DTEVBUiwgJnJlZy0+b3V0Ym91bmRfZG9vcmJlbGxfY2xlYXIpOworCXNjaGVkdWxlX3dvcmsoJmFjYi0+YXJjbXNyX2RvX21lc3NhZ2VfaXNyX2JoKTsKK30KKwogc3RhdGljIGludCBhcmNtc3JfaGFuZGxlX2hiYV9pc3Ioc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAl1aW50MzJfdCBvdXRib3VuZF9pbnRzdGF0dXM7CiAJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcmVnID0gYWNiLT5wbXVBOwotCiAJb3V0Ym91bmRfaW50c3RhdHVzID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfaW50c3RhdHVzKSAmCi0JCQkJCQkJYWNiLT5vdXRib3VuZF9pbnRfZW5hYmxlOworCQlhY2ItPm91dGJvdW5kX2ludF9lbmFibGU7CiAJaWYgKCEob3V0Ym91bmRfaW50c3RhdHVzICYgQVJDTVNSX01VX09VVEJPVU5EX0hBTkRMRV9JTlQpKQl7CiAJCXJldHVybiAxOwogCX0KQEAgLTEzODIsNyArMTYxOSw3IEBACiAJaWYgKG91dGJvdW5kX2ludHN0YXR1cyAmIEFSQ01TUl9NVV9PVVRCT1VORF9QT1NUUVVFVUVfSU5UKSB7CiAJCWFyY21zcl9oYmFfcG9zdHF1ZXVlX2lzcihhY2IpOwogCX0KLQlpZiAob3V0Ym91bmRfaW50c3RhdHVzICYgQVJDTVNSX01VX09VVEJPVU5EX01FU1NBR0UwX0lOVCkgCXsKKwlpZihvdXRib3VuZF9pbnRzdGF0dXMgJiBBUkNNU1JfTVVfT1VUQk9VTkRfTUVTU0FHRTBfSU5UKSAJewogCQkvKiBtZXNzZW5nZXIgb2YgImRyaXZlciB0byBpb3AgY29tbWFuZHMiICovCiAJCWFyY21zcl9oYmFfbWVzc2FnZV9pc3IoYWNiKTsKIAl9CkBAIC0xMzkzLDE4ICsxNjMwLDE3IEBACiB7CiAJdWludDMyX3Qgb3V0Ym91bmRfZG9vcmJlbGw7CiAJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKLQotCW91dGJvdW5kX2Rvb3JiZWxsID0gcmVhZGwocmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZykgJgotCQkJCQkJCWFjYi0+b3V0Ym91bmRfaW50X2VuYWJsZTsKKwlvdXRib3VuZF9kb29yYmVsbCA9IHJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbCkgJgorCQkJCWFjYi0+b3V0Ym91bmRfaW50X2VuYWJsZTsKIAlpZiAoIW91dGJvdW5kX2Rvb3JiZWxsKQogCQlyZXR1cm4gMTsKIAotCXdyaXRlbCh+b3V0Ym91bmRfZG9vcmJlbGwsIHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpOworCXdyaXRlbCh+b3V0Ym91bmRfZG9vcmJlbGwsIHJlZy0+aW9wMmRydl9kb29yYmVsbCk7CiAJLyppbiBjYXNlIHRoZSBsYXN0IGFjdGlvbiBvZiBkb29yYmVsbCBpbnRlcnJ1cHQgY2xlYXJhbmNlIGlzIGNhY2hlZCwKIAl0aGlzIGFjdGlvbiBjYW4gcHVzaCBIVyB0byB3cml0ZSBkb3duIHRoZSBjbGVhciBiaXQqLwotCXJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpOwotCXdyaXRlbChBUkNNU1JfRFJWMklPUF9FTkRfT0ZfSU5URVJSVVBULCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKLQlpZiAob3V0Ym91bmRfZG9vcmJlbGwgJiBBUkNNU1JfSU9QMkRSVl9EQVRBX1dSSVRFX09LKSAJeworCXJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbCk7CisJd3JpdGVsKEFSQ01TUl9EUlYySU9QX0VORF9PRl9JTlRFUlJVUFQsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJaWYgKG91dGJvdW5kX2Rvb3JiZWxsICYgQVJDTVNSX0lPUDJEUlZfREFUQV9XUklURV9PSykgewogCQlhcmNtc3JfaW9wMmRydl9kYXRhX3dyb3RlX2hhbmRsZShhY2IpOwogCX0KIAlpZiAob3V0Ym91bmRfZG9vcmJlbGwgJiBBUkNNU1JfSU9QMkRSVl9EQVRBX1JFQURfT0spIHsKQEAgLTE0MTMsMTQgKzE2NDksMzcgQEAKIAlpZiAob3V0Ym91bmRfZG9vcmJlbGwgJiBBUkNNU1JfSU9QMkRSVl9DREJfRE9ORSkgewogCQlhcmNtc3JfaGJiX3Bvc3RxdWV1ZV9pc3IoYWNiKTsKIAl9Ci0JaWYgKG91dGJvdW5kX2Rvb3JiZWxsICYgQVJDTVNSX0lPUDJEUlZfTUVTU0FHRV9DTURfRE9ORSkgeworCWlmKG91dGJvdW5kX2Rvb3JiZWxsICYgQVJDTVNSX0lPUDJEUlZfTUVTU0FHRV9DTURfRE9ORSkgewogCQkvKiBtZXNzZW5nZXIgb2YgImRyaXZlciB0byBpb3AgY29tbWFuZHMiICovCiAJCWFyY21zcl9oYmJfbWVzc2FnZV9pc3IoYWNiKTsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhcmNtc3JfaGFuZGxlX2hiY19pc3Ioc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKnBBQ0IpCit7CisJdWludDMyX3QgaG9zdF9pbnRlcnJ1cHRfc3RhdHVzOworCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpwaGJjbXUgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0MgKilwQUNCLT5wbXVDOworCS8qCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiogICBjaGVjayBvdXRib3VuZCBpbnRzdGF0dXMKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqLworCWhvc3RfaW50ZXJydXB0X3N0YXR1cyA9IHJlYWRsKCZwaGJjbXUtPmhvc3RfaW50X3N0YXR1cyk7CisJaWYgKCFob3N0X2ludGVycnVwdF9zdGF0dXMpIHsKKwkJLyppdCBtdXN0IGJlIHNoYXJlIGlycSovCisJCXJldHVybiAxOworCX0KKwkvKiBNVSBpb2N0bCB0cmFuc2ZlciBkb29yYmVsbCBpbnRlcnJ1cHRzKi8KKwlpZiAoaG9zdF9pbnRlcnJ1cHRfc3RhdHVzICYgQVJDTVNSX0hCQ01VX09VVEJPVU5EX0RPT1JCRUxMX0lTUikgeworCQlhcmNtc3JfaGJjX2Rvb3JiZWxsX2lzcihwQUNCKTsgICAvKiBtZXNzZW5nZXIgb2YgImlvY3RsIG1lc3NhZ2UgcmVhZCB3cml0ZSIgKi8KKwl9CisJLyogTVUgcG9zdCBxdWV1ZSBpbnRlcnJ1cHRzKi8KKwlpZiAoaG9zdF9pbnRlcnJ1cHRfc3RhdHVzICYgQVJDTVNSX0hCQ01VX09VVEJPVU5EX1BPU1RRVUVVRV9JU1IpIHsKKwkJYXJjbXNyX2hiY19wb3N0cXVldWVfaXNyKHBBQ0IpOyAgLyogbWVzc2VuZ2VyIG9mICJzY3NpIGNvbW1hbmRzIiAqLworCX0KKwlyZXR1cm4gMDsKK30KIHN0YXRpYyBpcnFyZXR1cm5fdCBhcmNtc3JfaW50ZXJydXB0KHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCiB7CiAJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewpAQCAtMTQzNyw2ICsxNjk2LDExIEBACiAJCX0KIAkJfQogCQlicmVhazsKKwkgY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6IHsKKwkJaWYgKGFyY21zcl9oYW5kbGVfaGJjX2lzcihhY2IpKSB7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwkJfQogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xNDYzLDcgKzE3MjcsNiBAQAogCXN0cnVjdCBRQlVGRkVSIF9faW9tZW0gKnB3YnVmZmVyOwogCXVpbnQ4X3QgX19pb21lbSAqaW9wX2RhdGE7CiAJaW50MzJfdCBhbGx4ZmVyX2xlbiA9IDA7Ci0KIAlwd2J1ZmZlciA9IGFyY21zcl9nZXRfaW9wX3dxYnVmZmVyKGFjYik7CiAJaW9wX2RhdGEgPSAodWludDhfdCBfX2lvbWVtICopcHdidWZmZXItPmRhdGE7CiAJaWYgKGFjYi0+YWNiX2ZsYWdzICYgQUNCX0ZfTUVTU0FHRV9XUUJVRkZFUl9SRUFERUQpIHsKQEAgLTE0OTYsNyArMTc1OSw2IEBACiAJCQkJCQkodWludDMyX3QgKSBjbWQtPmNtbmRbN10gPDwgOCAgfAogCQkJCQkJKHVpbnQzMl90ICkgY21kLT5jbW5kWzhdOwogCQkJCQkJLyogNCBieXRlczogQXJlY2EgaW8gY29udHJvbCBjb2RlICovCi0KIAlzZyA9IHNjc2lfc2dsaXN0KGNtZCk7CiAJYnVmZmVyID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyksIEtNX0lSUTApICsgc2ctPm9mZnNldDsKIAlpZiAoc2NzaV9zZ19jb3VudChjbWQpID4gMSkgewpAQCAtMTUyMiwxMyArMTc4NCw3IEBACiAJCQlyZXR2YWx1ZSA9IEFSQ01TUl9NRVNTQUdFX0ZBSUw7CiAJCQlnb3RvIG1lc3NhZ2Vfb3V0OwogCQl9Ci0KLQkJaWYgKCFhY2ItPmZ3X3N0YXRlKSB7Ci0JCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KLQkJCUFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfQlVTX0hBTkdfT047Ci0JCQlnb3RvIG1lc3NhZ2Vfb3V0OwotCQl9Ci0KKwkJCQkKIAkJcHRtcFFidWZmZXIgPSB2ZXJfYWRkcjsKIAkJd2hpbGUgKChhY2ItPnJxYnVmX2ZpcnN0aW5kZXggIT0gYWNiLT5ycWJ1Zl9sYXN0aW5kZXgpCiAJCQkmJiAoYWxseGZlcl9sZW4gPCAxMDMxKSkgewpAQCAtMTU2MCw3ICsxODE2LDExIEBACiAJCX0KIAkJbWVtY3B5KHBjbWRtZXNzYWdlZmxkLT5tZXNzYWdlZGF0YWJ1ZmZlciwgdmVyX2FkZHIsIGFsbHhmZXJfbGVuKTsKIAkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuTGVuZ3RoID0gYWxseGZlcl9sZW47Ci0JCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOworCQlpZihhY2ItPmZ3X2ZsYWcgPT0gRldfREVBRExPQ0spIHsKKwkJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0JVU19IQU5HX09OOworCQl9ZWxzZXsKKwkJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOworCQl9CiAJCWtmcmVlKHZlcl9hZGRyKTsKIAkJfQogCQlicmVhazsKQEAgLTE1NzUsMTIgKzE4MzUsMTMgQEAKIAkJCXJldHZhbHVlID0gQVJDTVNSX01FU1NBR0VfRkFJTDsKIAkJCWdvdG8gbWVzc2FnZV9vdXQ7CiAJCX0KLQkJaWYgKCFhY2ItPmZ3X3N0YXRlKSB7Ci0JCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KKwkJaWYoYWNiLT5md19mbGFnID09IEZXX0RFQURMT0NLKSB7CisJCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0gCiAJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0JVU19IQU5HX09OOwotCQkJZ290byBtZXNzYWdlX291dDsKKwkJfWVsc2V7CisJCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0gCisJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOwogCQl9Ci0KIAkJcHRtcHVzZXJidWZmZXIgPSB2ZXJfYWRkcjsKIAkJdXNlcl9sZW4gPSBwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5MZW5ndGg7CiAJCW1lbWNweShwdG1wdXNlcmJ1ZmZlciwgcGNtZG1lc3NhZ2VmbGQtPm1lc3NhZ2VkYXRhYnVmZmVyLCB1c2VyX2xlbik7CkBAIC0xNjMzLDEyICsxODk0LDYgQEAKIAogCWNhc2UgQVJDTVNSX01FU1NBR0VfQ0xFQVJfUlFCVUZGRVI6IHsKIAkJdWludDhfdCAqcFFidWZmZXIgPSBhY2ItPnJxYnVmZmVyOwotCQlpZiAoIWFjYi0+Zndfc3RhdGUpIHsKLQkJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPQotCQkJQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9CVVNfSEFOR19PTjsKLQkJCWdvdG8gbWVzc2FnZV9vdXQ7Ci0JCX0KLQogCQlpZiAoYWNiLT5hY2JfZmxhZ3MgJiBBQ0JfRl9JT1BEQVRBX09WRVJGTE9XKSB7CiAJCQlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfSU9QREFUQV9PVkVSRkxPVzsKIAkJCWFyY21zcl9pb3BfbWVzc2FnZV9yZWFkKGFjYik7CkBAIC0xNjQ3LDE2ICsxOTAyLDI0IEBACiAJCWFjYi0+cnFidWZfZmlyc3RpbmRleCA9IDA7CiAJCWFjYi0+cnFidWZfbGFzdGluZGV4ID0gMDsKIAkJbWVtc2V0KHBRYnVmZmVyLCAwLCBBUkNNU1JfTUFYX1FCVUZGRVIpOwotCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0gQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9PSzsKKwkJaWYoYWNiLT5md19mbGFnID09IEZXX0RFQURMT0NLKSB7CisJCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KKwkJCUFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfQlVTX0hBTkdfT047CisJCX1lbHNleworCQkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuUmV0dXJuQ29kZSA9CisJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOworCQl9CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFSQ01TUl9NRVNTQUdFX0NMRUFSX1dRQlVGRkVSOiB7CiAJCXVpbnQ4X3QgKnBRYnVmZmVyID0gYWNiLT53cWJ1ZmZlcjsKLQkJaWYgKCFhY2ItPmZ3X3N0YXRlKSB7CisJCWlmKGFjYi0+ZndfZmxhZyA9PSBGV19ERUFETE9DSykgewogCQkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuUmV0dXJuQ29kZSA9CiAJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0JVU19IQU5HX09OOwotCQkJZ290byBtZXNzYWdlX291dDsKKwkJfWVsc2V7CisJCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KKwkJCUFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfT0s7CiAJCX0KIAogCQlpZiAoYWNiLT5hY2JfZmxhZ3MgJiBBQ0JfRl9JT1BEQVRBX09WRVJGTE9XKSB7CkBAIC0xNjY5LDE4ICsxOTMyLDExIEBACiAJCWFjYi0+d3FidWZfZmlyc3RpbmRleCA9IDA7CiAJCWFjYi0+d3FidWZfbGFzdGluZGV4ID0gMDsKIAkJbWVtc2V0KHBRYnVmZmVyLCAwLCBBUkNNU1JfTUFYX1FCVUZGRVIpOwotCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KLQkJCUFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfT0s7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFSQ01TUl9NRVNTQUdFX0NMRUFSX0FMTFFCVUZGRVI6IHsKIAkJdWludDhfdCAqcFFidWZmZXI7Ci0JCWlmICghYWNiLT5md19zdGF0ZSkgewotCQkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuUmV0dXJuQ29kZSA9Ci0JCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0JVU19IQU5HX09OOwotCQkJZ290byBtZXNzYWdlX291dDsKLQkJfQogCiAJCWlmIChhY2ItPmFjYl9mbGFncyAmIEFDQl9GX0lPUERBVEFfT1ZFUkZMT1cpIHsKIAkJCWFjYi0+YWNiX2ZsYWdzICY9IH5BQ0JfRl9JT1BEQVRBX09WRVJGTE9XOwpAQCAtMTY5OCw0NyArMTk1NCw1MiBAQAogCQltZW1zZXQocFFidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgUUJVRkZFUikpOwogCQlwUWJ1ZmZlciA9IGFjYi0+d3FidWZmZXI7CiAJCW1lbXNldChwUWJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBRQlVGRkVSKSk7Ci0JCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOworCQlpZihhY2ItPmZ3X2ZsYWcgPT0gRldfREVBRExPQ0spIHsKKwkJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPQorCQkJQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9CVVNfSEFOR19PTjsKKwkJfWVsc2V7CisJCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KKwkJCUFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfT0s7CisJCX0KIAkJfQogCQlicmVhazsKIAogCWNhc2UgQVJDTVNSX01FU1NBR0VfUkVUVVJOX0NPREVfM0Y6IHsKLQkJaWYgKCFhY2ItPmZ3X3N0YXRlKSB7CisJCWlmKGFjYi0+ZndfZmxhZyA9PSBGV19ERUFETE9DSykgewogCQkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuUmV0dXJuQ29kZSA9CiAJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0JVU19IQU5HX09OOwotCQkJZ290byBtZXNzYWdlX291dDsKLQkJfQotCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0gQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV8zRjsKKwkJfWVsc2V7CisJCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0KKwkJCUFSQ01TUl9NRVNTQUdFX1JFVFVSTkNPREVfM0Y7CiAJCX0KIAkJYnJlYWs7Ci0KKwkJfQogCWNhc2UgQVJDTVNSX01FU1NBR0VfU0FZX0hFTExPOiB7CiAJCWludDhfdCAqaGVsbG9fc3RyaW5nID0gIkhlbGxvISBJIGFtIEFSQ01TUiI7Ci0JCWlmICghYWNiLT5md19zdGF0ZSkgeworCQlpZihhY2ItPmZ3X2ZsYWcgPT0gRldfREVBRExPQ0spIHsKIAkJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPQogCQkJQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9CVVNfSEFOR19PTjsKLQkJCWdvdG8gbWVzc2FnZV9vdXQ7CisJCX1lbHNleworCQkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuUmV0dXJuQ29kZSA9CisJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOwogCQl9CiAJCW1lbWNweShwY21kbWVzc2FnZWZsZC0+bWVzc2FnZWRhdGFidWZmZXIsIGhlbGxvX3N0cmluZwogCQkJLCAoaW50MTZfdClzdHJsZW4oaGVsbG9fc3RyaW5nKSk7Ci0JCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPSBBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX09LOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBUkNNU1JfTUVTU0FHRV9TQVlfR09PREJZRToKLQkJaWYgKCFhY2ItPmZ3X3N0YXRlKSB7CisJCWlmKGFjYi0+ZndfZmxhZyA9PSBGV19ERUFETE9DSykgewogCQkJcGNtZG1lc3NhZ2VmbGQtPmNtZG1lc3NhZ2UuUmV0dXJuQ29kZSA9CiAJCQlBUkNNU1JfTUVTU0FHRV9SRVRVUk5DT0RFX0JVU19IQU5HX09OOwotCQkJZ290byBtZXNzYWdlX291dDsKIAkJfQogCQlhcmNtc3JfaW9wX3BhcmtpbmcoYWNiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFSQ01TUl9NRVNTQUdFX0ZMVVNIX0FEQVBURVJfQ0FDSEU6Ci0JCWlmICghYWNiLT5md19zdGF0ZSkgeworCQlpZihhY2ItPmZ3X2ZsYWcgPT0gRldfREVBRExPQ0spIHsKIAkJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLlJldHVybkNvZGUgPQogCQkJQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9CVVNfSEFOR19PTjsKLQkJCWdvdG8gbWVzc2FnZV9vdXQ7CiAJCX0KIAkJYXJjbXNyX2ZsdXNoX2FkYXB0ZXJfY2FjaGUoYWNiKTsKIAkJYnJlYWs7CkBAIC0xNzU2LDExICsyMDE3LDE2IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZhY2ItPmNjYl9mcmVlX2xpc3Q7CiAJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKmNjYiA9IE5VTEw7Ci0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZhY2ItPmNjYmxpc3RfbG9jaywgZmxhZ3MpOwogCWlmICghbGlzdF9lbXB0eShoZWFkKSkgewogCQljY2IgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrLCBsaXN0KTsKLQkJbGlzdF9kZWwoaGVhZC0+bmV4dCk7CisJCWxpc3RfZGVsX2luaXQoJmNjYi0+bGlzdCk7CisJfWVsc2V7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjYi0+Y2NibGlzdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2ItPmNjYmxpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiBjY2I7CiB9CiAKQEAgLTE4MjYsODMgKzIwOTIsMjkgQEAKIAljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CiAJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKIAljbWQtPnJlc3VsdCA9IDA7Ci0KLQlpZiAoKHNjc2ljbWQgPT0gU1lOQ0hST05JWkVfQ0FDSEUpIHx8IChzY3NpY21kID09IFNFTkRfRElBR05PU1RJQykpIHsKLQkJaWYgKGFjYi0+ZGV2c3RhdGVbdGFyZ2V0XVtsdW5dID09IEFSRUNBX1JBSURfR09ORSkgewotCQkJY21kLT5yZXN1bHQgPSAoRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCWlmICgoc2NzaWNtZCA9PSBTWU5DSFJPTklaRV9DQUNIRSkgfHwoc2NzaWNtZCA9PSBTRU5EX0RJQUdOT1NUSUMpKXsKKwkJaWYoYWNiLT5kZXZzdGF0ZVt0YXJnZXRdW2x1bl0gPT0gQVJFQ0FfUkFJRF9HT05FKSB7CisgICAgCQkJY21kLT5yZXN1bHQgPSAoRElEX05PX0NPTk5FQ1QgPDwgMTYpOwogCQl9CiAJCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJCXJldHVybiAwOwogCX0KLQotCWlmIChhY2ItPmFjYl9mbGFncyAmIEFDQl9GX0JVU19SRVNFVCkgewotCQlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7Ci0JCQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewotCQkJCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QTsKLQkJCQl1aW50MzJfdCBpbnRtYXNrX29yZywgb3V0Ym91bmRfZG9vcmJlbGw7Ci0KLQkJCQlpZiAoKHJlYWRsKCZyZWctPm91dGJvdW5kX21zZ2FkZHIxKSAmCi0JCQkJCUFSQ01TUl9PVVRCT1VORF9NRVNHMV9GSVJNV0FSRV9PSykgPT0gMCkgewotCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBidXMgcmVzZXQgYW5kIHJldHVybiBidXN5XG4iLAotCQkJCQkJYWNiLT5ob3N0LT5ob3N0X25vKTsKLQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7Ci0JfQotCi0JCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0ZJUk1XQVJFX1RSQVA7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogaGFyZHdhcmUgYnVzIHJlc2V0IGFuZCByZXNldCBva1xuIiwKLQkJCQkJYWNiLT5ob3N0LT5ob3N0X25vKTsKLQkJCQkvKiBkaXNhYmxlIGFsbCBvdXRib3VuZCBpbnRlcnJ1cHQgKi8KLQkJCQlpbnRtYXNrX29yZyA9IGFyY21zcl9kaXNhYmxlX291dGJvdW5kX2ludHMoYWNiKTsKLQkJCQlhcmNtc3JfZ2V0X2Zpcm13YXJlX3NwZWMoYWNiLCAxKTsKLQkJCQkvKnN0YXJ0IGJhY2tncm91bmQgcmVidWlsZCovCi0JCQkJYXJjbXNyX3N0YXJ0X2FkYXB0ZXJfYmdyYihhY2IpOwotCQkJCS8qIGNsZWFyIFFidWZmZXIgaWYgZG9vciBiZWxsIHJpbmdlZCAqLwotCQkJCW91dGJvdW5kX2Rvb3JiZWxsID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfZG9vcmJlbGwpOwotCQkJCS8qY2xlYXIgaW50ZXJydXB0ICovCi0JCQkJd3JpdGVsKG91dGJvdW5kX2Rvb3JiZWxsLCAmcmVnLT5vdXRib3VuZF9kb29yYmVsbCk7Ci0JCQkJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX0RSSVZFUl9EQVRBX1JFQURfT0ssCi0JCQkJCSZyZWctPmluYm91bmRfZG9vcmJlbGwpOwotCQkJCS8qIGVuYWJsZSBvdXRib3VuZCBQb3N0IFF1ZXVlLG91dGJvdW5kIGRvb3JiZWxsIEludGVycnVwdCAqLwotCQkJCWFyY21zcl9lbmFibGVfb3V0Ym91bmRfaW50cyhhY2IsIGludG1hc2tfb3JnKTsKLQkJCQlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9JT1BfSU5JVEVEOwotCQkJCWFjYi0+YWNiX2ZsYWdzICY9IH5BQ0JfRl9CVVNfUkVTRVQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9COiB7Ci0JCQl9Ci0JCX0KLQl9Ci0KIAlpZiAodGFyZ2V0ID09IDE2KSB7CiAJCS8qIHZpcnR1YWwgZGV2aWNlIGZvciBpb3AgbWVzc2FnZSB0cmFuc2ZlciAqLwogCQlhcmNtc3JfaGFuZGxlX3ZpcnR1YWxfY29tbWFuZChhY2IsIGNtZCk7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoYWNiLT5kZXZzdGF0ZVt0YXJnZXRdW2x1bl0gPT0gQVJFQ0FfUkFJRF9HT05FKSB7Ci0JCXVpbnQ4X3QgYmxvY2tfY21kOwotCi0JCWJsb2NrX2NtZCA9IGNtZC0+Y21uZFswXSAmIDB4MGY7Ci0JCWlmIChibG9ja19jbWQgPT0gMHgwOCB8fCBibG9ja19jbWQgPT0gMHgwYSkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkJImFyY21zciVkOiBibG9jayAncmVhZC93cml0ZSciCi0JCQkJImNvbW1hbmQgd2l0aCBnb25lIHJhaWQgdm9sdW1lIgotCQkJCSIgQ21kID0gJTJ4LCBUYXJnZXRJZCA9ICVkLCBMdW4gPSAlZCBcbiIKLQkJCQksIGFjYi0+aG9zdC0+aG9zdF9ubwotCQkJCSwgY21kLT5jbW5kWzBdCi0JCQkJLCB0YXJnZXQsIGx1bik7Ci0JCQljbWQtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7Ci0JCQljbWQtPnNjc2lfZG9uZShjbWQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9CiAJaWYgKGF0b21pY19yZWFkKCZhY2ItPmNjYm91dHN0YW5kaW5nY291bnQpID49CiAJCQlBUkNNU1JfTUFYX09VVFNUQU5ESU5HX0NNRCkKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7Ci0KKwlpZiAoKHNjc2ljbWQgPT0gU0NTSV9DTURfQVJFQ0FfU1BFQ0lGSUMpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiUmVjZWl2ZWluZyBTQ1NJX0NNRF9BUkVDQV9TUEVDSUZJQyBjb21tYW5kLi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CiAJY2NiID0gYXJjbXNyX2dldF9mcmVlY2NiKGFjYik7CiAJaWYgKCFjY2IpCiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwotCWlmICggYXJjbXNyX2J1aWxkX2NjYiggYWNiLCBjY2IsIGNtZCApID09IEZBSUxFRCApIHsKKwlpZiAoYXJjbXNyX2J1aWxkX2NjYiggYWNiLCBjY2IsIGNtZCApID09IEZBSUxFRCkgewogCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpIHwgKFJFU0VSVkFUSU9OX0NPTkZMSUNUIDw8IDEpOwogCQljbWQtPnNjc2lfZG9uZShjbWQpOwogCQlyZXR1cm4gMDsKQEAgLTE5MTEsNyArMjEyMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkICphcmNtc3JfZ2V0X2hiYV9jb25maWcoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwgaW50IG1vZGUpCitzdGF0aWMgYm9vbCBhcmNtc3JfZ2V0X2hiYV9jb25maWcoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7CiAJY2hhciAqYWNiX2Zpcm1fbW9kZWwgPSBhY2ItPmZpcm1fbW9kZWw7CkBAIC0xOTE5LDE5ICsyMTMxLDE2IEBACiAJY2hhciAqYWNiX2RldmljZV9tYXAgPSBhY2ItPmRldmljZV9tYXA7CiAJY2hhciBfX2lvbWVtICppb3BfZmlybV9tb2RlbCA9IChjaGFyIF9faW9tZW0gKikoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsxNV0pOwogCWNoYXIgX19pb21lbSAqaW9wX2Zpcm1fdmVyc2lvbiA9IChjaGFyIF9faW9tZW0gKikoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsxN10pOwotCWNoYXIgX19pb21lbSAqaW9wX2RldmljZV9tYXAgPSAoY2hhciBfX2lvbWVtICopICgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzIxXSk7CisJY2hhciBfX2lvbWVtICppb3BfZGV2aWNlX21hcCA9IChjaGFyIF9faW9tZW0gKikoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsyMV0pOwogCWludCBjb3VudDsKLQogCXdyaXRlbChBUkNNU1JfSU5CT1VORF9NRVNHMF9HRVRfQ09ORklHLCAmcmVnLT5pbmJvdW5kX21zZ2FkZHIwKTsKLQlpZiAoYXJjbXNyX2hiYV93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CisJaWYgKCFhcmNtc3JfaGJhX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogd2FpdCAnZ2V0IGFkYXB0ZXIgZmlybXdhcmUgXAogCQkJbWlzY2VsbGFuZW91cyBkYXRhJyB0aW1lb3V0IFxuIiwgYWNiLT5ob3N0LT5ob3N0X25vKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBmYWxzZTsKIAl9Ci0KLQlpZiAobW9kZSA9PSAxKSB7CiAJY291bnQgPSA4OwotCXdoaWxlIChjb3VudCkgeworCXdoaWxlIChjb3VudCl7CiAJCSphY2JfZmlybV9tb2RlbCA9IHJlYWRiKGlvcF9maXJtX21vZGVsKTsKIAkJYWNiX2Zpcm1fbW9kZWwrKzsKIAkJaW9wX2Zpcm1fbW9kZWwrKzsKQEAgLTE5MzksMTM4ICsyMTQ4LDIxMyBAQAogCX0KIAogCWNvdW50ID0gMTY7Ci0Jd2hpbGUgKGNvdW50KSB7CisJd2hpbGUgKGNvdW50KXsKIAkJKmFjYl9maXJtX3ZlcnNpb24gPSByZWFkYihpb3BfZmlybV92ZXJzaW9uKTsKIAkJYWNiX2Zpcm1fdmVyc2lvbisrOwogCQlpb3BfZmlybV92ZXJzaW9uKys7CiAJCWNvdW50LS07CiAJfQogCi0JCWNvdW50ID0gMTY7Ci0JCXdoaWxlIChjb3VudCkgewotCQkJKmFjYl9kZXZpY2VfbWFwID0gcmVhZGIoaW9wX2RldmljZV9tYXApOwotCQkJYWNiX2RldmljZV9tYXArKzsKLQkJCWlvcF9kZXZpY2VfbWFwKys7Ci0JCQljb3VudC0tOwotCQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPIAkiQVJFQ0EgUkFJRCBBREFQVEVSJWQ6IEZJUk1XQVJFIFZFUlNJT04gJXMgXG4iCi0JCSwgYWNiLT5ob3N0LT5ob3N0X25vCi0JCSwgYWNiLT5maXJtX3ZlcnNpb24pOwotCQlhY2ItPnNpZ25hdHVyZSA9IHJlYWRsKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMF0pOworCWNvdW50PTE2OworCXdoaWxlKGNvdW50KXsKKwkJKmFjYl9kZXZpY2VfbWFwID0gcmVhZGIoaW9wX2RldmljZV9tYXApOworCQlhY2JfZGV2aWNlX21hcCsrOworCQlpb3BfZGV2aWNlX21hcCsrOworCQljb3VudC0tOworCX0KKwlwcmludGsoS0VSTl9OT1RJQ0UgIkFyZWNhIFJBSUQgQ29udHJvbGxlciVkOiBGL1cgJXMgJiBNb2RlbCAlc1xuIiwgCisJCWFjYi0+aG9zdC0+aG9zdF9ubywKKwkJYWNiLT5maXJtX3ZlcnNpb24sCisJCWFjYi0+ZmlybV9tb2RlbCk7CisJYWNiLT5zaWduYXR1cmUgPSByZWFkbCgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzBdKTsKIAlhY2ItPmZpcm1fcmVxdWVzdF9sZW4gPSByZWFkbCgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzFdKTsKIAlhY2ItPmZpcm1fbnVtYmVyc19xdWV1ZSA9IHJlYWRsKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMl0pOwogCWFjYi0+ZmlybV9zZHJhbV9zaXplID0gcmVhZGwoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclszXSk7CiAJYWNiLT5maXJtX2hkX2NoYW5uZWxzID0gcmVhZGwoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlcls0XSk7CisJYWNiLT5maXJtX2NmZ192ZXJzaW9uID0gcmVhZGwoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsyNV0pOyAgLypmaXJtX2NmZ192ZXJzaW9uLDI1LDEwMC0xMDMqLworCXJldHVybiB0cnVlOwogfQotCXJldHVybiByZWctPm1lc3NhZ2VfcndidWZmZXI7Ci19Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICphcmNtc3JfZ2V0X2hiYl9jb25maWcoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwgaW50IG1vZGUpCitzdGF0aWMgYm9vbCBhcmNtc3JfZ2V0X2hiYl9jb25maWcoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwotCXVpbnQzMl90IF9faW9tZW0gKmxyd2J1ZmZlciA9IHJlZy0+bXNnY29kZV9yd2J1ZmZlcl9yZWc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhY2ItPnBkZXY7CisJdm9pZCAqZG1hX2NvaGVyZW50OworCWRtYV9hZGRyX3QgZG1hX2NvaGVyZW50X2hhbmRsZTsKIAljaGFyICphY2JfZmlybV9tb2RlbCA9IGFjYi0+ZmlybV9tb2RlbDsKIAljaGFyICphY2JfZmlybV92ZXJzaW9uID0gYWNiLT5maXJtX3ZlcnNpb247CiAJY2hhciAqYWNiX2RldmljZV9tYXAgPSBhY2ItPmRldmljZV9tYXA7Ci0JY2hhciBfX2lvbWVtICppb3BfZmlybV9tb2RlbCA9IChjaGFyIF9faW9tZW0gKikoJmxyd2J1ZmZlclsxNV0pOworCWNoYXIgX19pb21lbSAqaW9wX2Zpcm1fbW9kZWw7CiAJLypmaXJtX21vZGVsLDE1LDYwLTY3Ki8KLQljaGFyIF9faW9tZW0gKmlvcF9maXJtX3ZlcnNpb24gPSAoY2hhciBfX2lvbWVtICopKCZscndidWZmZXJbMTddKTsKKwljaGFyIF9faW9tZW0gKmlvcF9maXJtX3ZlcnNpb247CiAJLypmaXJtX3ZlcnNpb24sMTcsNjgtODMqLwotCWNoYXIgX19pb21lbSAqaW9wX2RldmljZV9tYXAgPSAoY2hhciBfX2lvbWVtICopICgmbHJ3YnVmZmVyWzIxXSk7CisJY2hhciBfX2lvbWVtICppb3BfZGV2aWNlX21hcDsKIAkvKmZpcm1fdmVyc2lvbiwyMSw4NC05OSovCiAJaW50IGNvdW50OworCWRtYV9jb2hlcmVudCA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IE1lc3NhZ2VVbml0X0IpLCAmZG1hX2NvaGVyZW50X2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkbWFfY29oZXJlbnQpeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBkbWFfYWxsb2NfY29oZXJlbnQgZ290IGVycm9yIGZvciBoYmIgbXVcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlX2hiYl9tdSA9IGRtYV9jb2hlcmVudF9oYW5kbGU7CisJcmVnID0gKHN0cnVjdCBNZXNzYWdlVW5pdF9CICopZG1hX2NvaGVyZW50OworCWFjYi0+cG11QiA9IHJlZzsKKwlyZWctPmRydjJpb3BfZG9vcmJlbGw9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKWFjYi0+bWVtX2Jhc2UwICsgQVJDTVNSX0RSVjJJT1BfRE9PUkJFTEwpOworCXJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9tYXNrID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVuc2lnbmVkIGxvbmcpYWNiLT5tZW1fYmFzZTAgKyBBUkNNU1JfRFJWMklPUF9ET09SQkVMTF9NQVNLKTsKKwlyZWctPmlvcDJkcnZfZG9vcmJlbGwgPSAodWludDMyX3QgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylhY2ItPm1lbV9iYXNlMCArIEFSQ01TUl9JT1AyRFJWX0RPT1JCRUxMKTsKKwlyZWctPmlvcDJkcnZfZG9vcmJlbGxfbWFzayA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKWFjYi0+bWVtX2Jhc2UwICsgQVJDTVNSX0lPUDJEUlZfRE9PUkJFTExfTUFTSyk7CisJcmVnLT5tZXNzYWdlX3didWZmZXIgPSAodWludDMyX3QgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylhY2ItPm1lbV9iYXNlMSArIEFSQ01TUl9NRVNTQUdFX1dCVUZGRVIpOworCXJlZy0+bWVzc2FnZV9yYnVmZmVyID0gICh1aW50MzJfdCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKWFjYi0+bWVtX2Jhc2UxICsgQVJDTVNSX01FU1NBR0VfUkJVRkZFUik7CisJcmVnLT5tZXNzYWdlX3J3YnVmZmVyID0gKHVpbnQzMl90IF9faW9tZW0gKikoKHVuc2lnbmVkIGxvbmcpYWNiLT5tZW1fYmFzZTEgKyBBUkNNU1JfTUVTU0FHRV9SV0JVRkZFUik7CisJaW9wX2Zpcm1fbW9kZWwgPSAoY2hhciBfX2lvbWVtICopKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbMTVdKTsJLypmaXJtX21vZGVsLDE1LDYwLTY3Ki8KKwlpb3BfZmlybV92ZXJzaW9uID0gKGNoYXIgX19pb21lbSAqKSgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzE3XSk7CS8qZmlybV92ZXJzaW9uLDE3LDY4LTgzKi8KKwlpb3BfZGV2aWNlX21hcCA9IChjaGFyIF9faW9tZW0gKikoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsyMV0pOwkvKmZpcm1fdmVyc2lvbiwyMSw4NC05OSovCiAKLQl3cml0ZWwoQVJDTVNSX01FU1NBR0VfR0VUX0NPTkZJRywgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7Ci0JaWYgKGFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkgeworCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9HRVRfQ09ORklHLCByZWctPmRydjJpb3BfZG9vcmJlbGwpOworCWlmICghYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHdhaXQgJ2dldCBhZGFwdGVyIGZpcm13YXJlIFwKIAkJCW1pc2NlbGxhbmVvdXMgZGF0YScgdGltZW91dCBcbiIsIGFjYi0+aG9zdC0+aG9zdF9ubyk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gZmFsc2U7CiAJfQotCi0JaWYgKG1vZGUgPT0gMSkgewogCWNvdW50ID0gODsKLQl3aGlsZSAoY291bnQpCi0JeworCXdoaWxlIChjb3VudCl7CiAJCSphY2JfZmlybV9tb2RlbCA9IHJlYWRiKGlvcF9maXJtX21vZGVsKTsKIAkJYWNiX2Zpcm1fbW9kZWwrKzsKIAkJaW9wX2Zpcm1fbW9kZWwrKzsKIAkJY291bnQtLTsKIAl9Ci0KIAljb3VudCA9IDE2OwotCXdoaWxlIChjb3VudCkKLQl7CisJd2hpbGUgKGNvdW50KXsKIAkJKmFjYl9maXJtX3ZlcnNpb24gPSByZWFkYihpb3BfZmlybV92ZXJzaW9uKTsKIAkJYWNiX2Zpcm1fdmVyc2lvbisrOwogCQlpb3BfZmlybV92ZXJzaW9uKys7CiAJCWNvdW50LS07CiAJfQogCi0JCWNvdW50ID0gMTY7Ci0JCXdoaWxlIChjb3VudCkgewotCQkJKmFjYl9kZXZpY2VfbWFwID0gcmVhZGIoaW9wX2RldmljZV9tYXApOwotCQkJYWNiX2RldmljZV9tYXArKzsKLQkJCWlvcF9kZXZpY2VfbWFwKys7Ci0JCQljb3VudC0tOwotCQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJBUkVDQSBSQUlEIEFEQVBURVIlZDogRklSTVdBUkUgVkVSU0lPTiAlcyBcbiIsCi0JCQlhY2ItPmhvc3QtPmhvc3Rfbm8sCi0JCQlhY2ItPmZpcm1fdmVyc2lvbik7Ci0KLQkJYWNiLT5zaWduYXR1cmUgPSByZWFkbChscndidWZmZXIrKyk7Ci0JCS8qZmlybV9zaWduYXR1cmUsMSwwMC0wMyovCi0JYWNiLT5maXJtX3JlcXVlc3RfbGVuID0gcmVhZGwobHJ3YnVmZmVyKyspOwotCS8qZmlybV9yZXF1ZXN0X2xlbiwxLDA0LTA3Ki8KLQlhY2ItPmZpcm1fbnVtYmVyc19xdWV1ZSA9IHJlYWRsKGxyd2J1ZmZlcisrKTsKLQkvKmZpcm1fbnVtYmVyc19xdWV1ZSwyLDA4LTExKi8KLQlhY2ItPmZpcm1fc2RyYW1fc2l6ZSA9IHJlYWRsKGxyd2J1ZmZlcisrKTsKLQkvKmZpcm1fc2RyYW1fc2l6ZSwzLDEyLTE1Ki8KLQlhY2ItPmZpcm1faGRfY2hhbm5lbHMgPSByZWFkbChscndidWZmZXIpOwotCS8qZmlybV9pZGVfY2hhbm5lbHMsNCwxNi0xOSovCi19Ci0JcmV0dXJuIHJlZy0+bXNnY29kZV9yd2J1ZmZlcl9yZWc7Ci19Ci1zdGF0aWMgdm9pZCAqYXJjbXNyX2dldF9maXJtd2FyZV9zcGVjKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsIGludCBtb2RlKQotewotCXZvaWQgKnJ0bnZhbCA9IDA7Ci0Jc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewotCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9BOiB7Ci0JCXJ0bnZhbCA9IGFyY21zcl9nZXRfaGJhX2NvbmZpZyhhY2IsIG1vZGUpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKLQkJcnRudmFsID0gYXJjbXNyX2dldF9oYmJfY29uZmlnKGFjYiwgbW9kZSk7Ci0JCX0KLQkJYnJlYWs7CisJY291bnQgPSAxNjsKKwl3aGlsZShjb3VudCl7CisJCSphY2JfZGV2aWNlX21hcCA9IHJlYWRiKGlvcF9kZXZpY2VfbWFwKTsKKwkJYWNiX2RldmljZV9tYXArKzsKKwkJaW9wX2RldmljZV9tYXArKzsKKwkJY291bnQtLTsKIAl9Ci0JcmV0dXJuIHJ0bnZhbDsKKwkKKwlwcmludGsoS0VSTl9OT1RJQ0UgIkFyZWNhIFJBSUQgQ29udHJvbGxlciVkOiBGL1cgJXMgJiBNb2RlbCAlc1xuIiwKKwkJYWNiLT5ob3N0LT5ob3N0X25vLAorCQlhY2ItPmZpcm1fdmVyc2lvbiwKKwkJYWNiLT5maXJtX21vZGVsKTsKKworCWFjYi0+c2lnbmF0dXJlID0gcmVhZGwoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsxXSk7CisJLypmaXJtX3NpZ25hdHVyZSwxLDAwLTAzKi8KKwlhY2ItPmZpcm1fcmVxdWVzdF9sZW4gPSByZWFkbCgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzJdKTsKKwkvKmZpcm1fcmVxdWVzdF9sZW4sMSwwNC0wNyovCisJYWNiLT5maXJtX251bWJlcnNfcXVldWUgPSByZWFkbCgmcmVnLT5tZXNzYWdlX3J3YnVmZmVyWzNdKTsKKwkvKmZpcm1fbnVtYmVyc19xdWV1ZSwyLDA4LTExKi8KKwlhY2ItPmZpcm1fc2RyYW1fc2l6ZSA9IHJlYWRsKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbNF0pOworCS8qZmlybV9zZHJhbV9zaXplLDMsMTItMTUqLworCWFjYi0+ZmlybV9oZF9jaGFubmVscyA9IHJlYWRsKCZyZWctPm1lc3NhZ2VfcndidWZmZXJbNV0pOworCS8qZmlybV9pZGVfY2hhbm5lbHMsNCwxNi0xOSovCisJYWNiLT5maXJtX2NmZ192ZXJzaW9uID0gcmVhZGwoJnJlZy0+bWVzc2FnZV9yd2J1ZmZlclsyNV0pOyAgLypmaXJtX2NmZ192ZXJzaW9uLDI1LDEwMC0xMDMqLworCS8qZmlybV9pZGVfY2hhbm5lbHMsNCwxNi0xOSovCisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGFyY21zcl9wb2xsaW5nX2hiYV9jY2Jkb25lKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsCitzdGF0aWMgYm9vbCBhcmNtc3JfZ2V0X2hiY19jb25maWcoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKnBBQ0IpCit7CisJdWludDMyX3QgaW50bWFza19vcmcsIEluZGV4LCBmaXJtd2FyZV9zdGF0ZSA9IDA7CisJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnJlZyA9IHBBQ0ItPnBtdUM7CisJY2hhciAqYWNiX2Zpcm1fbW9kZWwgPSBwQUNCLT5maXJtX21vZGVsOworCWNoYXIgKmFjYl9maXJtX3ZlcnNpb24gPSBwQUNCLT5maXJtX3ZlcnNpb247CisJY2hhciAqaW9wX2Zpcm1fbW9kZWwgPSAoY2hhciAqKSgmcmVnLT5tc2djb2RlX3J3YnVmZmVyWzE1XSk7ICAgIC8qZmlybV9tb2RlbCwxNSw2MC02NyovCisJY2hhciAqaW9wX2Zpcm1fdmVyc2lvbiA9IChjaGFyICopKCZyZWctPm1zZ2NvZGVfcndidWZmZXJbMTddKTsgIC8qZmlybV92ZXJzaW9uLDE3LDY4LTgzKi8KKwlpbnQgY291bnQ7CisJLyogZGlzYWJsZSBhbGwgb3V0Ym91bmQgaW50ZXJydXB0ICovCisJaW50bWFza19vcmcgPSByZWFkbCgmcmVnLT5ob3N0X2ludF9tYXNrKTsgLyogZGlzYWJsZSBvdXRib3VuZCBtZXNzYWdlMCBpbnQgKi8KKwl3cml0ZWwoaW50bWFza19vcmd8QVJDTVNSX0hCQ01VX0FMTF9JTlRNQVNLRU5BQkxFLCAmcmVnLT5ob3N0X2ludF9tYXNrKTsKKwkvKiB3YWl0IGZpcm13YXJlIHJlYWR5ICovCisJZG8geworCQlmaXJtd2FyZV9zdGF0ZSA9IHJlYWRsKCZyZWctPm91dGJvdW5kX21zZ2FkZHIxKTsKKwl9IHdoaWxlICgoZmlybXdhcmVfc3RhdGUgJiBBUkNNU1JfSEJDTVVfTUVTU0FHRV9GSVJNV0FSRV9PSykgPT0gMCk7CisJLyogcG9zdCAiZ2V0IGNvbmZpZyIgaW5zdHJ1Y3Rpb24gKi8KKwl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfR0VUX0NPTkZJRywgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7CisJd3JpdGVsKEFSQ01TUl9IQkNNVV9EUlYySU9QX01FU1NBR0VfQ01EX0RPTkUsICZyZWctPmluYm91bmRfZG9vcmJlbGwpOworCS8qIHdhaXQgbWVzc2FnZSByZWFkeSAqLworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDIwMDA7IEluZGV4KyspIHsKKwkJaWYgKHJlYWRsKCZyZWctPm91dGJvdW5kX2Rvb3JiZWxsKSAmIEFSQ01TUl9IQkNNVV9JT1AyRFJWX01FU1NBR0VfQ01EX0RPTkUpIHsKKwkJCXdyaXRlbChBUkNNU1JfSEJDTVVfSU9QMkRSVl9NRVNTQUdFX0NNRF9ET05FX0RPT1JCRUxMX0NMRUFSLCAmcmVnLT5vdXRib3VuZF9kb29yYmVsbF9jbGVhcik7LypjbGVhciBpbnRlcnJ1cHQqLworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9IC8qbWF4IDEgc2Vjb25kcyovCisJaWYgKEluZGV4ID49IDIwMDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogd2FpdCAnZ2V0IGFkYXB0ZXIgZmlybXdhcmUgXAorCQkJbWlzY2VsbGFuZW91cyBkYXRhJyB0aW1lb3V0IFxuIiwgcEFDQi0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJY291bnQgPSA4OworCXdoaWxlIChjb3VudCkgeworCQkqYWNiX2Zpcm1fbW9kZWwgPSByZWFkYihpb3BfZmlybV9tb2RlbCk7CisJCWFjYl9maXJtX21vZGVsKys7CisJCWlvcF9maXJtX21vZGVsKys7CisJCWNvdW50LS07CisJfQorCWNvdW50ID0gMTY7CisJd2hpbGUgKGNvdW50KSB7CisJCSphY2JfZmlybV92ZXJzaW9uID0gcmVhZGIoaW9wX2Zpcm1fdmVyc2lvbik7CisJCWFjYl9maXJtX3ZlcnNpb24rKzsKKwkJaW9wX2Zpcm1fdmVyc2lvbisrOworCQljb3VudC0tOworCX0KKwlwcmludGsoS0VSTl9OT1RJQ0UgIkFyZWNhIFJBSUQgQ29udHJvbGxlciVkOiBGL1cgJXMgJiBNb2RlbCAlc1xuIiwKKwkJcEFDQi0+aG9zdC0+aG9zdF9ubywKKwkJcEFDQi0+ZmlybV92ZXJzaW9uLAorCQlwQUNCLT5maXJtX21vZGVsKTsKKwlwQUNCLT5maXJtX3JlcXVlc3RfbGVuID0gcmVhZGwoJnJlZy0+bXNnY29kZV9yd2J1ZmZlclsxXSk7ICAgLypmaXJtX3JlcXVlc3RfbGVuLDEsMDQtMDcqLworCXBBQ0ItPmZpcm1fbnVtYmVyc19xdWV1ZSA9IHJlYWRsKCZyZWctPm1zZ2NvZGVfcndidWZmZXJbMl0pOyAvKmZpcm1fbnVtYmVyc19xdWV1ZSwyLDA4LTExKi8KKwlwQUNCLT5maXJtX3NkcmFtX3NpemUgPSByZWFkbCgmcmVnLT5tc2djb2RlX3J3YnVmZmVyWzNdKTsgICAgLypmaXJtX3NkcmFtX3NpemUsMywxMi0xNSovCisJcEFDQi0+ZmlybV9oZF9jaGFubmVscyA9IHJlYWRsKCZyZWctPm1zZ2NvZGVfcndidWZmZXJbNF0pOyAgLypmaXJtX2lkZV9jaGFubmVscyw0LDE2LTE5Ki8KKwlwQUNCLT5maXJtX2NmZ192ZXJzaW9uID0gcmVhZGwoJnJlZy0+bXNnY29kZV9yd2J1ZmZlclsyNV0pOyAgLypmaXJtX2NmZ192ZXJzaW9uLDI1LDEwMC0xMDMqLworCS8qYWxsIGludGVycnVwdCBzZXJ2aWNlIHdpbGwgYmUgZW5hYmxlIGF0IGFyY21zcl9pb3BfaW5pdCovCisJcmV0dXJuIHRydWU7Cit9CitzdGF0aWMgYm9vbCBhcmNtc3JfZ2V0X2Zpcm13YXJlX3NwZWMoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKK3sKKwlpZiAoYWNiLT5hZGFwdGVyX3R5cGUgPT0gQUNCX0FEQVBURVJfVFlQRV9BKQorCQlyZXR1cm4gYXJjbXNyX2dldF9oYmFfY29uZmlnKGFjYik7CisJZWxzZSBpZiAoYWNiLT5hZGFwdGVyX3R5cGUgPT0gQUNCX0FEQVBURVJfVFlQRV9CKQorCQlyZXR1cm4gYXJjbXNyX2dldF9oYmJfY29uZmlnKGFjYik7CisJZWxzZQorCQlyZXR1cm4gYXJjbXNyX2dldF9oYmNfY29uZmlnKGFjYik7Cit9CisKK3N0YXRpYyBpbnQgYXJjbXNyX3BvbGxpbmdfaGJhX2NjYmRvbmUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwKIAlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqcG9sbF9jY2IpCiB7CiAJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcmVnID0gYWNiLT5wbXVBOwogCXN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2I7CisJc3RydWN0IEFSQ01TUl9DREIgKmFyY21zcl9jZGI7CiAJdWludDMyX3QgZmxhZ19jY2IsIG91dGJvdW5kX2ludHN0YXR1cywgcG9sbF9jY2JfZG9uZSA9IDAsIHBvbGxfY291bnQgPSAwOwotCisJaW50IHJ0bjsKKwlib29sIGVycm9yOwogCXBvbGxpbmdfaGJhX2NjYl9yZXRyeToKIAlwb2xsX2NvdW50Kys7CiAJb3V0Ym91bmRfaW50c3RhdHVzID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfaW50c3RhdHVzKSAmIGFjYi0+b3V0Ym91bmRfaW50X2VuYWJsZTsKIAl3cml0ZWwob3V0Ym91bmRfaW50c3RhdHVzLCAmcmVnLT5vdXRib3VuZF9pbnRzdGF0dXMpOy8qY2xlYXIgaW50ZXJydXB0Ki8KIAl3aGlsZSAoMSkgewogCQlpZiAoKGZsYWdfY2NiID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfcXVldWVwb3J0KSkgPT0gMHhGRkZGRkZGRikgewotCQkJaWYgKHBvbGxfY2NiX2RvbmUpCisJCQlpZiAocG9sbF9jY2JfZG9uZSl7CisJCQkJcnRuID0gU1VDQ0VTUzsKIAkJCQlicmVhazsKLQkJCWVsc2UgeworCQkJfWVsc2UgewogCQkJCW1zbGVlcCgyNSk7Ci0JCQkJaWYgKHBvbGxfY291bnQgPiAxMDApCisJCQkJaWYgKHBvbGxfY291bnQgPiAxMDApeworCQkJCQlydG4gPSBGQUlMRUQ7CiAJCQkJCWJyZWFrOworCQkJCX0KIAkJCQlnb3RvIHBvbGxpbmdfaGJhX2NjYl9yZXRyeTsKIAkJCX0KIAkJfQotCQljY2IgPSAoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKikoYWNiLT52aXIycGh5X29mZnNldCArIChmbGFnX2NjYiA8PCA1KSk7CisJCWFyY21zcl9jZGIgPSAoc3RydWN0IEFSQ01TUl9DREIgKikoYWNiLT52aXIycGh5X29mZnNldCArIChmbGFnX2NjYiA8PCA1KSk7CisJCWNjYiA9IGNvbnRhaW5lcl9vZihhcmNtc3JfY2RiLCBzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaywgYXJjbXNyX2NkYik7CiAJCXBvbGxfY2NiX2RvbmUgPSAoY2NiID09IHBvbGxfY2NiKSA/IDE6MDsKIAkJaWYgKChjY2ItPmFjYiAhPSBhY2IpIHx8IChjY2ItPnN0YXJ0ZG9uZSAhPSBBUkNNU1JfQ0NCX1NUQVJUKSkgewogCQkJaWYgKChjY2ItPnN0YXJ0ZG9uZSA9PSBBUkNNU1JfQ0NCX0FCT1JURUQpIHx8IChjY2IgPT0gcG9sbF9jY2IpKSB7CkBAIC0yMDgxLDggKzIzNjUsNyBAQAogCQkJCQksIGNjYi0+cGNtZC0+ZGV2aWNlLT5sdW4KIAkJCQkJLCBjY2IpOwogCQkJCWNjYi0+cGNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwotCQkJCWFyY21zcl9jY2JfY29tcGxldGUoY2NiLCAxKTsKLQkJCQlwb2xsX2NjYl9kb25lID0gMTsKKwkJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKGNjYik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBwb2xsaW5nIGdldCBhbiBpbGxlZ2FsIGNjYiIKQEAgLTIwOTMsODYgKzIzNzYsMTU2IEBACiAJCQkJLCBhdG9taWNfcmVhZCgmYWNiLT5jY2JvdXRzdGFuZGluZ2NvdW50KSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlhcmNtc3JfcmVwb3J0X2NjYl9zdGF0ZShhY2IsIGNjYiwgZmxhZ19jY2IpOworCQllcnJvciA9IChmbGFnX2NjYiAmIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SX01PREUwKSA/IHRydWUgOiBmYWxzZTsKKwkJYXJjbXNyX3JlcG9ydF9jY2Jfc3RhdGUoYWNiLCBjY2IsIGVycm9yKTsKIAl9CisJcmV0dXJuIHJ0bjsKIH0KIAotc3RhdGljIHZvaWQgYXJjbXNyX3BvbGxpbmdfaGJiX2NjYmRvbmUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwKK3N0YXRpYyBpbnQgYXJjbXNyX3BvbGxpbmdfaGJiX2NjYmRvbmUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwKIAkJCQkJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKnBvbGxfY2NiKQogewotCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwotCQlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiOwotCQl1aW50MzJfdCBmbGFnX2NjYiwgcG9sbF9jY2JfZG9uZSA9IDAsIHBvbGxfY291bnQgPSAwOwotCQlpbnQgaW5kZXg7Ci0KKwlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOworCXN0cnVjdCBBUkNNU1JfQ0RCICphcmNtc3JfY2RiOworCXN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2I7CisJdWludDMyX3QgZmxhZ19jY2IsIHBvbGxfY2NiX2RvbmUgPSAwLCBwb2xsX2NvdW50ID0gMDsKKwlpbnQgaW5kZXgsIHJ0bjsKKwlib29sIGVycm9yOwogCXBvbGxpbmdfaGJiX2NjYl9yZXRyeToKLQkJcG9sbF9jb3VudCsrOwotCQkvKiBjbGVhciBkb29yYmVsbCBpbnRlcnJ1cHQgKi8KLQkJd3JpdGVsKEFSQ01TUl9ET09SQkVMTF9JTlRfQ0xFQVJfUEFUVEVSTiwgcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZyk7Ci0JCXdoaWxlICgxKSB7Ci0JCQlpbmRleCA9IHJlZy0+ZG9uZXFfaW5kZXg7Ci0JCQlpZiAoKGZsYWdfY2NiID0gcmVhZGwoJnJlZy0+ZG9uZV9xYnVmZmVyW2luZGV4XSkpID09IDApIHsKLQkJCQlpZiAocG9sbF9jY2JfZG9uZSkKKwlwb2xsX2NvdW50Kys7CisJLyogY2xlYXIgZG9vcmJlbGwgaW50ZXJydXB0ICovCisJd3JpdGVsKEFSQ01TUl9ET09SQkVMTF9JTlRfQ0xFQVJfUEFUVEVSTiwgcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsKTsKKwl3aGlsZSgxKXsKKwkJaW5kZXggPSByZWctPmRvbmVxX2luZGV4OworCQlpZiAoKGZsYWdfY2NiID0gcmVhZGwoJnJlZy0+ZG9uZV9xYnVmZmVyW2luZGV4XSkpID09IDApIHsKKwkJCWlmIChwb2xsX2NjYl9kb25lKXsKKwkJCQlydG4gPSBTVUNDRVNTOworCQkJCWJyZWFrOworCQkJfWVsc2UgeworCQkJCW1zbGVlcCgyNSk7CisJCQkJaWYgKHBvbGxfY291bnQgPiAxMDApeworCQkJCQlydG4gPSBGQUlMRUQ7CiAJCQkJCWJyZWFrOwotCQkJCWVsc2UgewotCQkJCQltc2xlZXAoMjUpOwotCQkJCQlpZiAocG9sbF9jb3VudCA+IDEwMCkKLQkJCQkJCWJyZWFrOwotCQkJCQlnb3RvIHBvbGxpbmdfaGJiX2NjYl9yZXRyeTsKIAkJCQl9CisJCQkJZ290byBwb2xsaW5nX2hiYl9jY2JfcmV0cnk7CiAJCQl9Ci0JCQl3cml0ZWwoMCwgJnJlZy0+ZG9uZV9xYnVmZmVyW2luZGV4XSk7Ci0JCQlpbmRleCsrOwotCQkJLyppZiBsYXN0IGluZGV4IG51bWJlciBzZXQgaXQgdG8gMCAqLwotCQkJaW5kZXggJT0gQVJDTVNSX01BWF9IQkJfUE9TVFFVRVVFOwotCQkJcmVnLT5kb25lcV9pbmRleCA9IGluZGV4OwotCQkJLyogY2hlY2sgaWZjb21tYW5kIGRvbmUgd2l0aCBubyBlcnJvciovCi0JCQljY2IgPSAoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKilcCi0gICAgICAoYWNiLT52aXIycGh5X29mZnNldCArIChmbGFnX2NjYiA8PCA1KSk7LypmcmFtZSBtdXN0IGJlIDMyIGJ5dGVzIGFsaWduZWQqLwotCQkJcG9sbF9jY2JfZG9uZSA9IChjY2IgPT0gcG9sbF9jY2IpID8gMTowOwotCQkJaWYgKChjY2ItPmFjYiAhPSBhY2IpIHx8IChjY2ItPnN0YXJ0ZG9uZSAhPSBBUkNNU1JfQ0NCX1NUQVJUKSkgewotCQkJCWlmICgoY2NiLT5zdGFydGRvbmUgPT0gQVJDTVNSX0NDQl9BQk9SVEVEKSB8fCAoY2NiID09IHBvbGxfY2NiKSkgewotCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBcCi0JCXNjc2kgaWQgPSAlZCBsdW4gPSAlZCBjY2IgPSAnMHglcCcgcG9sbCBjb21tYW5kIGFib3J0IHN1Y2Nlc3NmdWxseSBcbiIKLQkJCQkJCSxhY2ItPmhvc3QtPmhvc3Rfbm8KLQkJCQkJCSxjY2ItPnBjbWQtPmRldmljZS0+aWQKLQkJCQkJCSxjY2ItPnBjbWQtPmRldmljZS0+bHVuCi0JCQkJCQksY2NiKTsKLQkJCQkJY2NiLT5wY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JCQkJCWFyY21zcl9jY2JfY29tcGxldGUoY2NiLCAxKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHBvbGxpbmcgZ2V0IGFuIGlsbGVnYWwgY2NiIgotCQkJCQkiIGNvbW1hbmQgZG9uZSBjY2IgPSAnMHglcCciCi0JCQkJCSJjY2JvdXRzdGFuZGluZ2NvdW50ID0gJWQgXG4iCi0JCQkJCSwgYWNiLT5ob3N0LT5ob3N0X25vCi0JCQkJCSwgY2NiCi0JCQkJCSwgYXRvbWljX3JlYWQoJmFjYi0+Y2Nib3V0c3RhbmRpbmdjb3VudCkpOworCQl9CisJCXdyaXRlbCgwLCAmcmVnLT5kb25lX3FidWZmZXJbaW5kZXhdKTsKKwkJaW5kZXgrKzsKKwkJLyppZiBsYXN0IGluZGV4IG51bWJlciBzZXQgaXQgdG8gMCAqLworCQlpbmRleCAlPSBBUkNNU1JfTUFYX0hCQl9QT1NUUVVFVUU7CisJCXJlZy0+ZG9uZXFfaW5kZXggPSBpbmRleDsKKwkJLyogY2hlY2sgaWYgY29tbWFuZCBkb25lIHdpdGggbm8gZXJyb3IqLworCQlhcmNtc3JfY2RiID0gKHN0cnVjdCBBUkNNU1JfQ0RCICopKGFjYi0+dmlyMnBoeV9vZmZzZXQgKyAoZmxhZ19jY2IgPDwgNSkpOworCQljY2IgPSBjb250YWluZXJfb2YoYXJjbXNyX2NkYiwgc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2ssIGFyY21zcl9jZGIpOworCQlwb2xsX2NjYl9kb25lID0gKGNjYiA9PSBwb2xsX2NjYikgPyAxOjA7CisJCWlmICgoY2NiLT5hY2IgIT0gYWNiKSB8fCAoY2NiLT5zdGFydGRvbmUgIT0gQVJDTVNSX0NDQl9TVEFSVCkpIHsKKwkJCWlmICgoY2NiLT5zdGFydGRvbmUgPT0gQVJDTVNSX0NDQl9BQk9SVEVEKSB8fCAoY2NiID09IHBvbGxfY2NiKSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHNjc2kgaWQgPSAlZCBsdW4gPSAlZCBjY2IgPSAnMHglcCciCisJCQkJCSIgcG9sbCBjb21tYW5kIGFib3J0IHN1Y2Nlc3NmdWxseSBcbiIKKwkJCQkJLGFjYi0+aG9zdC0+aG9zdF9ubworCQkJCQksY2NiLT5wY21kLT5kZXZpY2UtPmlkCisJCQkJCSxjY2ItPnBjbWQtPmRldmljZS0+bHVuCisJCQkJCSxjY2IpOworCQkJCWNjYi0+cGNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkJCWFyY21zcl9jY2JfY29tcGxldGUoY2NiKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWFyY21zcl9yZXBvcnRfY2NiX3N0YXRlKGFjYiwgY2NiLCBmbGFnX2NjYik7Ci0JCX0JLypkcmFpbiByZXBseSBGSUZPKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHBvbGxpbmcgZ2V0IGFuIGlsbGVnYWwgY2NiIgorCQkJCSIgY29tbWFuZCBkb25lIGNjYiA9ICcweCVwJyIKKwkJCQkiY2Nib3V0c3RhbmRpbmdjb3VudCA9ICVkIFxuIgorCQkJCSwgYWNiLT5ob3N0LT5ob3N0X25vCisJCQkJLCBjY2IKKwkJCQksIGF0b21pY19yZWFkKCZhY2ItPmNjYm91dHN0YW5kaW5nY291bnQpKTsKKwkJCWNvbnRpbnVlOworCQl9IAorCQllcnJvciA9IChmbGFnX2NjYiAmIEFSQ01TUl9DQ0JSRVBMWV9GTEFHX0VSUk9SX01PREUwKSA/IHRydWUgOiBmYWxzZTsKKwkJYXJjbXNyX3JlcG9ydF9jY2Jfc3RhdGUoYWNiLCBjY2IsIGVycm9yKTsKKwl9CisJcmV0dXJuIHJ0bjsKIH0KIAotc3RhdGljIHZvaWQgYXJjbXNyX3BvbGxpbmdfY2NiZG9uZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLAorc3RhdGljIGludCBhcmNtc3JfcG9sbGluZ19oYmNfY2NiZG9uZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLCBzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqcG9sbF9jY2IpCit7CisJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnJlZyA9IChzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqKWFjYi0+cG11QzsKKwl1aW50MzJfdCBmbGFnX2NjYiwgY2NiX2NkYl9waHk7CisJc3RydWN0IEFSQ01TUl9DREIgKmFyY21zcl9jZGI7CisJYm9vbCBlcnJvcjsKKwlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqcENDQjsKKwl1aW50MzJfdCBwb2xsX2NjYl9kb25lID0gMCwgcG9sbF9jb3VudCA9IDA7CisJaW50IHJ0bjsKK3BvbGxpbmdfaGJjX2NjYl9yZXRyeToKKwlwb2xsX2NvdW50Kys7CisJd2hpbGUgKDEpIHsKKwkJaWYgKChyZWFkbCgmcmVnLT5ob3N0X2ludF9zdGF0dXMpICYgQVJDTVNSX0hCQ01VX09VVEJPVU5EX1BPU1RRVUVVRV9JU1IpID09IDApIHsKKwkJCWlmIChwb2xsX2NjYl9kb25lKSB7CisJCQkJcnRuID0gU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbXNsZWVwKDI1KTsKKwkJCQlpZiAocG9sbF9jb3VudCA+IDEwMCkgeworCQkJCQlydG4gPSBGQUlMRUQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlnb3RvIHBvbGxpbmdfaGJjX2NjYl9yZXRyeTsKKwkJCX0KKwkJfQorCQlmbGFnX2NjYiA9IHJlYWRsKCZyZWctPm91dGJvdW5kX3F1ZXVlcG9ydF9sb3cpOworCQljY2JfY2RiX3BoeSA9IChmbGFnX2NjYiAmIDB4RkZGRkZGRjApOworCQlhcmNtc3JfY2RiID0gKHN0cnVjdCBBUkNNU1JfQ0RCICopKGFjYi0+dmlyMnBoeV9vZmZzZXQgKyBjY2JfY2RiX3BoeSk7LypmcmFtZSBtdXN0IGJlIDMyIGJ5dGVzIGFsaWduZWQqLworCQlwQ0NCID0gY29udGFpbmVyX29mKGFyY21zcl9jZGIsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrLCBhcmNtc3JfY2RiKTsKKwkJcG9sbF9jY2JfZG9uZSA9IChwQ0NCID09IHBvbGxfY2NiKSA/IDEgOiAwOworCQkvKiBjaGVjayBpZmNvbW1hbmQgZG9uZSB3aXRoIG5vIGVycm9yKi8KKwkJaWYgKChwQ0NCLT5hY2IgIT0gYWNiKSB8fCAocENDQi0+c3RhcnRkb25lICE9IEFSQ01TUl9DQ0JfU1RBUlQpKSB7CisJCQlpZiAocENDQi0+c3RhcnRkb25lID09IEFSQ01TUl9DQ0JfQUJPUlRFRCkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IHNjc2kgaWQgPSAlZCBsdW4gPSAlZCBjY2IgPSAnMHglcCciCisJCQkJCSIgcG9sbCBjb21tYW5kIGFib3J0IHN1Y2Nlc3NmdWxseSBcbiIKKwkJCQkJLCBhY2ItPmhvc3QtPmhvc3Rfbm8KKwkJCQkJLCBwQ0NCLT5wY21kLT5kZXZpY2UtPmlkCisJCQkJCSwgcENDQi0+cGNtZC0+ZGV2aWNlLT5sdW4KKwkJCQkJLCBwQ0NCKTsKKwkJCQkJcENDQi0+cGNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKHBDQ0IpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogcG9sbGluZyBnZXQgYW4gaWxsZWdhbCBjY2IiCisJCQkJIiBjb21tYW5kIGRvbmUgY2NiID0gJzB4JXAnIgorCQkJCSJjY2JvdXRzdGFuZGluZ2NvdW50ID0gJWQgXG4iCisJCQkJLCBhY2ItPmhvc3QtPmhvc3Rfbm8KKwkJCQksIHBDQ0IKKwkJCQksIGF0b21pY19yZWFkKCZhY2ItPmNjYm91dHN0YW5kaW5nY291bnQpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVycm9yID0gKGZsYWdfY2NiICYgQVJDTVNSX0NDQlJFUExZX0ZMQUdfRVJST1JfTU9ERTEpID8gdHJ1ZSA6IGZhbHNlOworCQlhcmNtc3JfcmVwb3J0X2NjYl9zdGF0ZShhY2IsIHBDQ0IsIGVycm9yKTsKKwl9CisJcmV0dXJuIHJ0bjsKK30KK3N0YXRpYyBpbnQgYXJjbXNyX3BvbGxpbmdfY2NiZG9uZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLAogCQkJCQlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqcG9sbF9jY2IpCiB7CisJaW50IHJ0biA9IDA7CiAJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewogCiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6IHsKLQkJYXJjbXNyX3BvbGxpbmdfaGJhX2NjYmRvbmUoYWNiLHBvbGxfY2NiKTsKKwkJcnRuID0gYXJjbXNyX3BvbGxpbmdfaGJhX2NjYmRvbmUoYWNiLCBwb2xsX2NjYik7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjogewotCQlhcmNtc3JfcG9sbGluZ19oYmJfY2NiZG9uZShhY2IscG9sbF9jY2IpOworCQlydG4gPSBhcmNtc3JfcG9sbGluZ19oYmJfY2NiZG9uZShhY2IsIHBvbGxfY2NiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQlydG4gPSBhcmNtc3JfcG9sbGluZ19oYmNfY2NiZG9uZShhY2IsIHBvbGxfY2NiKTsKIAkJfQogCX0KKwlyZXR1cm4gcnRuOwogfQogCiBzdGF0aWMgaW50IGFyY21zcl9pb3BfY29uZmlybShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewotCXVpbnQzMl90IGNkYl9waHlhZGRyLCBjY2JfcGh5YWRkcl9oaTMyOworCXVpbnQzMl90IGNkYl9waHlhZGRyLCBjZGJfcGh5YWRkcl9oaTMyOwogCWRtYV9hZGRyX3QgZG1hX2NvaGVyZW50X2hhbmRsZTsKIAkvKgogCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTgyLDcgKzI1MzUsOCBAQAogCSovCiAJZG1hX2NvaGVyZW50X2hhbmRsZSA9IGFjYi0+ZG1hX2NvaGVyZW50X2hhbmRsZTsKIAljZGJfcGh5YWRkciA9ICh1aW50MzJfdCkoZG1hX2NvaGVyZW50X2hhbmRsZSk7Ci0JY2NiX3BoeWFkZHJfaGkzMiA9ICh1aW50MzJfdCkoKGNkYl9waHlhZGRyID4+IDE2KSA+PiAxNik7CisJY2RiX3BoeWFkZHJfaGkzMiA9ICh1aW50MzJfdCkoKGNkYl9waHlhZGRyID4+IDE2KSA+PiAxNik7CisJYWNiLT5jZGJfcGh5YWRkcl9oaTMyID0gY2RiX3BoeWFkZHJfaGkzMjsKIAkvKgogCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJKiogICAgaWYgYWRhcHRlciB0eXBlIEIsIHNldCB3aW5kb3cgb2YgInBvc3QgY29tbWFuZCBRIgpAQCAtMjE5MSwxNiArMjU0NSwxNiBAQAogCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKIAogCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9BOiB7Ci0JCWlmIChjY2JfcGh5YWRkcl9oaTMyICE9IDApIHsKKwkJaWYgKGNkYl9waHlhZGRyX2hpMzIgIT0gMCkgewogCQkJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcmVnID0gYWNiLT5wbXVBOwogCQkJdWludDMyX3QgaW50bWFza19vcmc7CiAJCQlpbnRtYXNrX29yZyA9IGFyY21zcl9kaXNhYmxlX291dGJvdW5kX2ludHMoYWNiKTsKIAkJCXdyaXRlbChBUkNNU1JfU0lHTkFUVVJFX1NFVF9DT05GSUcsIFwKIAkJCQkJCSZyZWctPm1lc3NhZ2VfcndidWZmZXJbMF0pOwotCQkJd3JpdGVsKGNjYl9waHlhZGRyX2hpMzIsICZyZWctPm1lc3NhZ2VfcndidWZmZXJbMV0pOworCQkJd3JpdGVsKGNkYl9waHlhZGRyX2hpMzIsICZyZWctPm1lc3NhZ2VfcndidWZmZXJbMV0pOwogCQkJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX01FU0cwX1NFVF9DT05GSUcsIFwKIAkJCQkJCQkmcmVnLT5pbmJvdW5kX21zZ2FkZHIwKTsKLQkJCWlmIChhcmNtc3JfaGJhX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKKwkJCWlmICghYXJjbXNyX2hiYV93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CiAJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogIiJzZXQgY2NiIGhpZ2ggXAogCQkJCXBhcnQgcGh5c2ljYWwgYWRkcmVzcyB0aW1lb3V0XG4iLAogCQkJCWFjYi0+aG9zdC0+aG9zdF9ubyk7CkBAIC0yMjIwLDE5ICsyNTc0LDE4IEBACiAJCWludG1hc2tfb3JnID0gYXJjbXNyX2Rpc2FibGVfb3V0Ym91bmRfaW50cyhhY2IpOwogCQlyZWctPnBvc3RxX2luZGV4ID0gMDsKIAkJcmVnLT5kb25lcV9pbmRleCA9IDA7Ci0JCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9TRVRfUE9TVF9XSU5ET1csIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9yZWcpOwotCQlpZiAoYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CisJCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9TRVRfUE9TVF9XSU5ET1csIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJCWlmICghYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOmNhbiBub3Qgc2V0IGRpdmVyIG1vZGVcbiIsIFwKIAkJCQlhY2ItPmhvc3QtPmhvc3Rfbm8pOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJcG9zdF9xdWV1ZV9waHlhZGRyID0gY2RiX3BoeWFkZHIgKyBBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNICogXAotCQlzaXplb2Yoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2spICsgb2Zmc2V0b2Yoc3RydWN0IE1lc3NhZ2VVbml0X0IsIHBvc3RfcWJ1ZmZlcikgOwotCQlyd2J1ZmZlciA9IHJlZy0+bXNnY29kZV9yd2J1ZmZlcl9yZWc7CisJCXBvc3RfcXVldWVfcGh5YWRkciA9IGFjYi0+ZG1hX2NvaGVyZW50X2hhbmRsZV9oYmJfbXU7CisJCXJ3YnVmZmVyID0gcmVnLT5tZXNzYWdlX3J3YnVmZmVyOwogCQkvKiBkcml2ZXIgInNldCBjb25maWciIHNpZ25hdHVyZSAqLwogCQl3cml0ZWwoQVJDTVNSX1NJR05BVFVSRV9TRVRfQ09ORklHLCByd2J1ZmZlcisrKTsKIAkJLyogbm9ybWFsIHNob3VsZCBiZSB6ZXJvICovCi0JCXdyaXRlbChjY2JfcGh5YWRkcl9oaTMyLCByd2J1ZmZlcisrKTsKKwkJd3JpdGVsKGNkYl9waHlhZGRyX2hpMzIsIHJ3YnVmZmVyKyspOwogCQkvKiBwb3N0USBzaXplICgyNTYgKyA4KSo0CSAqLwogCQl3cml0ZWwocG9zdF9xdWV1ZV9waHlhZGRyLCByd2J1ZmZlcisrKTsKIAkJLyogZG9uZVEgc2l6ZSAoMjU2ICsgOCkqNAkgKi8KQEAgLTIyNDAsMjIgKzI1OTMsMzcgQEAKIAkJLyogY2NiIG1heFEgc2l6ZSBtdXN0IGJlIC0tPiBbKDI1NiArIDgpKjRdKi8KIAkJd3JpdGVsKDEwNTYsIHJ3YnVmZmVyKTsKIAotCQl3cml0ZWwoQVJDTVNSX01FU1NBR0VfU0VUX0NPTkZJRywgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7Ci0JCWlmIChhcmNtc3JfaGJiX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKKwkJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX1NFVF9DT05GSUcsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJCWlmICghYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiAnc2V0IGNvbW1hbmQgUSB3aW5kb3cnIFwKIAkJCXRpbWVvdXQgXG4iLGFjYi0+aG9zdC0+aG9zdF9ubyk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCi0JCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9TVEFSVF9EUklWRVJfTU9ERSwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyk7Ci0JCWlmIChhcmNtc3JfaGJiX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6ICdjYW4gbm90IHNldCBkaXZlciBtb2RlIFxuIlwKLQkJCSxhY2ItPmhvc3QtPmhvc3Rfbm8pOwotCQkJcmV0dXJuIDE7Ci0JCX0KKwkJYXJjbXNyX2hiYl9lbmFibGVfZHJpdmVyX21vZGUoYWNiKTsKIAkJYXJjbXNyX2VuYWJsZV9vdXRib3VuZF9pbnRzKGFjYiwgaW50bWFza19vcmcpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9DOiB7CisJCWlmIChjZGJfcGh5YWRkcl9oaTMyICE9IDApIHsKKwkJCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpyZWcgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0MgKilhY2ItPnBtdUM7CisKKwkJCWlmIChjZGJfcGh5YWRkcl9oaTMyICE9IDApIHsKKwkJCQl1bnNpZ25lZCBjaGFyIFJldHJpZXMgPSAweDAwOworCQkJCWRvIHsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogY2RiX3BoeWFkZHJfaGkzMj0weCV4IFxuIiwgYWNiLT5hZGFwdGVyX2luZGV4LCBjZGJfcGh5YWRkcl9oaTMyKTsKKwkJCQl9IHdoaWxlIChSZXRyaWVzKysgPCAxMDApOworCQkJfQorCQkJd3JpdGVsKEFSQ01TUl9TSUdOQVRVUkVfU0VUX0NPTkZJRywgJnJlZy0+bXNnY29kZV9yd2J1ZmZlclswXSk7CisJCQl3cml0ZWwoY2RiX3BoeWFkZHJfaGkzMiwgJnJlZy0+bXNnY29kZV9yd2J1ZmZlclsxXSk7CisJCQl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfU0VUX0NPTkZJRywgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7CisJCQl3cml0ZWwoQVJDTVNSX0hCQ01VX0RSVjJJT1BfTUVTU0FHRV9DTURfRE9ORSwgJnJlZy0+aW5ib3VuZF9kb29yYmVsbCk7CisJCQlpZiAoIWFyY21zcl9oYmNfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6ICdzZXQgY29tbWFuZCBRIHdpbmRvdycgXAorCQkJCXRpbWVvdXQgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjYzLDcgKzI2MzEsNiBAQAogc3RhdGljIHZvaWQgYXJjbXNyX3dhaXRfZmlybXdhcmVfcmVhZHkoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAl1aW50MzJfdCBmaXJtd2FyZV9zdGF0ZSA9IDA7Ci0KIAlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7CiAKIAljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewpAQCAtMjI3Nyw2MiArMjY0NCw4MSBAQAogCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9COiB7CiAJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7CiAJCWRvIHsKLQkJCWZpcm13YXJlX3N0YXRlID0gcmVhZGwocmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZyk7CisJCQlmaXJtd2FyZV9zdGF0ZSA9IHJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbCk7CiAJCX0gd2hpbGUgKChmaXJtd2FyZV9zdGF0ZSAmIEFSQ01TUl9NRVNTQUdFX0ZJUk1XQVJFX09LKSA9PSAwKTsKLQkJd3JpdGVsKEFSQ01TUl9EUlYySU9QX0VORF9PRl9JTlRFUlJVUFQsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9yZWcpOworCQl3cml0ZWwoQVJDTVNSX0RSVjJJT1BfRU5EX09GX0lOVEVSUlVQVCwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsKTsKIAkJfQogCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqcmVnID0gKHN0cnVjdCBNZXNzYWdlVW5pdF9DICopYWNiLT5wbXVDOworCQlkbyB7CisJCQlmaXJtd2FyZV9zdGF0ZSA9IHJlYWRsKCZyZWctPm91dGJvdW5kX21zZ2FkZHIxKTsKKwkJfSB3aGlsZSAoKGZpcm13YXJlX3N0YXRlICYgQVJDTVNSX0hCQ01VX01FU1NBR0VfRklSTVdBUkVfT0spID09IDApOworCQl9CiAJfQogfQogCiBzdGF0aWMgdm9pZCBhcmNtc3JfcmVxdWVzdF9oYmFfZGV2aWNlX21hcChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXN0cnVjdCBNZXNzYWdlVW5pdF9BIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QTsKLQotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYWNiLT5ycV9tYXBfdG9rZW4pID09IDApKSB7Ci0JCWFjYi0+Zndfc3RhdGUgPSBmYWxzZTsKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSA9PSAwKSB8fCAoKGFjYi0+YWNiX2ZsYWdzICYgQUNCX0ZfQlVTX1JFU0VUKSAhPSAwICkgfHwgKChhY2ItPmFjYl9mbGFncyAmIEFDQl9GX0FCT1JUKSAhPSAwICkpeworCQlyZXR1cm47CiAJfSBlbHNlIHsKLQkvKnRvIHByZXZlbnQgcnFfbWFwX3Rva2VuIGZyb20gY2hhbmdpbmcgYnkgb3RoZXIgaW50ZXJydXB0LCB0aGVuCi0JYXZvaWQgdGhlIGRlYWQtbG9jayovCi0JCWFjYi0+Zndfc3RhdGUgPSB0cnVlOwotCQlhdG9taWNfZGVjKCZhY2ItPnJxX21hcF90b2tlbik7Ci0JCWlmICghKGFjYi0+Zndfc3RhdGUpIHx8Ci0JCQkoYWNiLT5hbnRlX3Rva2VuX3ZhbHVlID09IGF0b21pY19yZWFkKCZhY2ItPnJxX21hcF90b2tlbikpKSB7CisJCWFjYi0+ZndfZmxhZyA9IEZXX05PUk1BTDsKKwkJaWYgKGF0b21pY19yZWFkKCZhY2ItPmFudGVfdG9rZW5fdmFsdWUpID09IGF0b21pY19yZWFkKCZhY2ItPnJxX21hcF90b2tlbikpewogCQkJYXRvbWljX3NldCgmYWNiLT5ycV9tYXBfdG9rZW4sIDE2KTsKIAkJfQotCQlhY2ItPmFudGVfdG9rZW5fdmFsdWUgPSBhdG9taWNfcmVhZCgmYWNiLT5ycV9tYXBfdG9rZW4pOworCQlhdG9taWNfc2V0KCZhY2ItPmFudGVfdG9rZW5fdmFsdWUsIGF0b21pY19yZWFkKCZhY2ItPnJxX21hcF90b2tlbikpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYWNiLT5ycV9tYXBfdG9rZW4pKQorCQkJcmV0dXJuOwogCQl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfR0VUX0NPTkZJRywgJnJlZy0+aW5ib3VuZF9tc2dhZGRyMCk7CisJCW1vZF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2ICogSFopKTsKIAl9Ci0JbW9kX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYwMDApKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIGFyY21zcl9yZXF1ZXN0X2hiYl9kZXZpY2VfbWFwKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCiB7CiAJc3RydWN0IE1lc3NhZ2VVbml0X0IgX19pb21lbSAqcmVnID0gYWNiLT5wbXVCOwotCi0JaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZhY2ItPnJxX21hcF90b2tlbikgPT0gMCkpIHsKLQkJYWNiLT5md19zdGF0ZSA9IGZhbHNlOworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYWNiLT5ycV9tYXBfdG9rZW4pID09IDApIHx8ICgoYWNiLT5hY2JfZmxhZ3MgJiBBQ0JfRl9CVVNfUkVTRVQpICE9IDAgKSB8fCAoKGFjYi0+YWNiX2ZsYWdzICYgQUNCX0ZfQUJPUlQpICE9IDAgKSl7CisJCXJldHVybjsKIAl9IGVsc2UgewotCS8qdG8gcHJldmVudCBycV9tYXBfdG9rZW4gZnJvbSBjaGFuZ2luZyBieSBvdGhlciBpbnRlcnJ1cHQsIHRoZW4KLQlhdm9pZCB0aGUgZGVhZC1sb2NrKi8KLQkJYWNiLT5md19zdGF0ZSA9IHRydWU7Ci0JCWF0b21pY19kZWMoJmFjYi0+cnFfbWFwX3Rva2VuKTsKLQkJaWYgKCEoYWNiLT5md19zdGF0ZSkgfHwKLQkJCShhY2ItPmFudGVfdG9rZW5fdmFsdWUgPT0gYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSkpIHsKKwkJYWNiLT5md19mbGFnID0gRldfTk9STUFMOworCQlpZiAoYXRvbWljX3JlYWQoJmFjYi0+YW50ZV90b2tlbl92YWx1ZSkgPT0gYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSkgeworCQkJYXRvbWljX3NldCgmYWNiLT5ycV9tYXBfdG9rZW4sMTYpOworCQl9CisJCWF0b21pY19zZXQoJmFjYi0+YW50ZV90b2tlbl92YWx1ZSwgYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSk7CisJCWlmKGF0b21pY19kZWNfYW5kX3Rlc3QoJmFjYi0+cnFfbWFwX3Rva2VuKSkKKwkJCXJldHVybjsKKwkJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX0dFVF9DT05GSUcsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJCW1vZF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2ICogSFopKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhcmNtc3JfcmVxdWVzdF9oYmNfZGV2aWNlX21hcChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQoreworCXN0cnVjdCBNZXNzYWdlVW5pdF9DIF9faW9tZW0gKnJlZyA9IGFjYi0+cG11QzsKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSA9PSAwKSB8fCAoKGFjYi0+YWNiX2ZsYWdzICYgQUNCX0ZfQlVTX1JFU0VUKSAhPSAwKSB8fCAoKGFjYi0+YWNiX2ZsYWdzICYgQUNCX0ZfQUJPUlQpICE9IDApKSB7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlhY2ItPmZ3X2ZsYWcgPSBGV19OT1JNQUw7CisJCWlmIChhdG9taWNfcmVhZCgmYWNiLT5hbnRlX3Rva2VuX3ZhbHVlKSA9PSBhdG9taWNfcmVhZCgmYWNiLT5ycV9tYXBfdG9rZW4pKSB7CiAJCQlhdG9taWNfc2V0KCZhY2ItPnJxX21hcF90b2tlbiwgMTYpOwogCQl9Ci0JCWFjYi0+YW50ZV90b2tlbl92YWx1ZSA9IGF0b21pY19yZWFkKCZhY2ItPnJxX21hcF90b2tlbik7Ci0JCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9HRVRfQ09ORklHLCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKKwkJYXRvbWljX3NldCgmYWNiLT5hbnRlX3Rva2VuX3ZhbHVlLCBhdG9taWNfcmVhZCgmYWNiLT5ycV9tYXBfdG9rZW4pKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmFjYi0+cnFfbWFwX3Rva2VuKSkKKwkJCXJldHVybjsKKwkJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX01FU0cwX0dFVF9DT05GSUcsICZyZWctPmluYm91bmRfbXNnYWRkcjApOworCQl3cml0ZWwoQVJDTVNSX0hCQ01VX0RSVjJJT1BfTUVTU0FHRV9DTURfRE9ORSwgJnJlZy0+aW5ib3VuZF9kb29yYmVsbCk7CisJCW1vZF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2ICogSFopKTsKIAl9Ci0JbW9kX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYwMDApKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIGFyY21zcl9yZXF1ZXN0X2RldmljZV9tYXAodW5zaWduZWQgbG9uZyBwYWNiKQogewogCXN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKilwYWNiOwotCiAJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewogCQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQTogewogCQkJYXJjbXNyX3JlcXVlc3RfaGJhX2RldmljZV9tYXAoYWNiKTsKQEAgLTIzNDIsNiArMjcyOCw5IEBACiAJCQlhcmNtc3JfcmVxdWVzdF9oYmJfZGV2aWNlX21hcChhY2IpOwogCQl9CiAJCWJyZWFrOworCQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzogeworCQkJYXJjbXNyX3JlcXVlc3RfaGJjX2RldmljZV9tYXAoYWNiKTsKKwkJfQogCX0KIH0KIApAQCAtMjM1MCw3ICsyNzM5LDcgQEAKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7CiAJYWNiLT5hY2JfZmxhZ3MgfD0gQUNCX0ZfTVNHX1NUQVJUX0JHUkI7CiAJd3JpdGVsKEFSQ01TUl9JTkJPVU5EX01FU0cwX1NUQVJUX0JHUkIsICZyZWctPmluYm91bmRfbXNnYWRkcjApOwotCWlmIChhcmNtc3JfaGJhX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKKwlpZiAoIWFyY21zcl9oYmFfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiB3YWl0ICdzdGFydCBhZGFwdGVyIGJhY2tncm91bmQgXAogCQkJCXJlYnVsaWQnIHRpbWVvdXQgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOwogCX0KQEAgLTIzNjAsMTMgKzI3NDksMjUgQEAKIHsKIAlzdHJ1Y3QgTWVzc2FnZVVuaXRfQiAqcmVnID0gYWNiLT5wbXVCOwogCWFjYi0+YWNiX2ZsYWdzIHw9IEFDQl9GX01TR19TVEFSVF9CR1JCOwotCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9TVEFSVF9CR1JCLCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKLQlpZiAoYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CisJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX1NUQVJUX0JHUkIsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbCk7CisJaWYgKCFhcmNtc3JfaGJiX3dhaXRfbXNnaW50X3JlYWR5KGFjYikpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogd2FpdCAnc3RhcnQgYWRhcHRlciBiYWNrZ3JvdW5kIFwKIAkJCQlyZWJ1bGlkJyB0aW1lb3V0IFxuIixhY2ItPmhvc3QtPmhvc3Rfbm8pOwogCX0KIH0KIAorc3RhdGljIHZvaWQgYXJjbXNyX3N0YXJ0X2hiY19iZ3JiKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICpwQUNCKQoreworCXN0cnVjdCBNZXNzYWdlVW5pdF9DICpwaGJjbXUgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0MgKilwQUNCLT5wbXVDOworCXBBQ0ItPmFjYl9mbGFncyB8PSBBQ0JfRl9NU0dfU1RBUlRfQkdSQjsKKwl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfTUVTRzBfU1RBUlRfQkdSQiwgJnBoYmNtdS0+aW5ib3VuZF9tc2dhZGRyMCk7CisJd3JpdGVsKEFSQ01TUl9IQkNNVV9EUlYySU9QX01FU1NBR0VfQ01EX0RPTkUsICZwaGJjbXUtPmluYm91bmRfZG9vcmJlbGwpOworCWlmICghYXJjbXNyX2hiY193YWl0X21zZ2ludF9yZWFkeShwQUNCKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiB3YWl0ICdzdGFydCBhZGFwdGVyIGJhY2tncm91bmQgXAorCQkJCXJlYnVsaWQnIHRpbWVvdXQgXG4iLCBwQUNCLT5ob3N0LT5ob3N0X25vKTsKKwl9CisJcmV0dXJuOworfQogc3RhdGljIHZvaWQgYXJjbXNyX3N0YXJ0X2FkYXB0ZXJfYmdyYihzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKQEAgLTIzNzYsNiArMjc3Nyw4IEBACiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6CiAJCWFyY21zcl9zdGFydF9oYmJfYmdyYihhY2IpOwogCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzoKKwkJYXJjbXNyX3N0YXJ0X2hiY19iZ3JiKGFjYik7CiAJfQogfQogCkBAIC0yMzk2LDExICsyNzk5LDE5IEBACiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKIAkJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKIAkJLypjbGVhciBpbnRlcnJ1cHQgYW5kIG1lc3NhZ2Ugc3RhdGUqLwotCQl3cml0ZWwoQVJDTVNSX01FU1NBR0VfSU5UX0NMRUFSX1BBVFRFUk4sIHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpOwotCQl3cml0ZWwoQVJDTVNSX0RSVjJJT1BfREFUQV9SRUFEX09LLCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKKwkJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX0lOVF9DTEVBUl9QQVRURVJOLCByZWctPmlvcDJkcnZfZG9vcmJlbGwpOworCQl3cml0ZWwoQVJDTVNSX0RSVjJJT1BfREFUQV9SRUFEX09LLCByZWctPmRydjJpb3BfZG9vcmJlbGwpOwogCQkvKiBsZXQgSU9QIGtub3cgZGF0YSBoYXMgYmVlbiByZWFkICovCiAJCX0KIAkJYnJlYWs7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0M6IHsKKwkJc3RydWN0IE1lc3NhZ2VVbml0X0MgKnJlZyA9IChzdHJ1Y3QgTWVzc2FnZVVuaXRfQyAqKWFjYi0+cG11QzsKKwkJdWludDMyX3Qgb3V0Ym91bmRfZG9vcmJlbGw7CisJCS8qIGVtcHR5IGRvb3JiZWxsIFFidWZmZXIgaWYgZG9vciBiZWxsIHJpbmdlZCAqLworCQlvdXRib3VuZF9kb29yYmVsbCA9IHJlYWRsKCZyZWctPm91dGJvdW5kX2Rvb3JiZWxsKTsKKwkJd3JpdGVsKG91dGJvdW5kX2Rvb3JiZWxsLCAmcmVnLT5vdXRib3VuZF9kb29yYmVsbF9jbGVhcik7CisJCXdyaXRlbChBUkNNU1JfSEJDTVVfRFJWMklPUF9EQVRBX1JFQURfT0ssICZyZWctPmluYm91bmRfZG9vcmJlbGwpOworCQl9CiAJfQogfQogCkBAIC0yNDEyLDEzICsyODIzLDE1IEBACiAJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6CiAJCXsKIAkJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7Ci0JCQl3cml0ZWwoQVJDTVNSX01FU1NBR0VfQUNUSVZFX0VPSV9NT0RFLCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKLQkJCWlmKGFyY21zcl9oYmJfd2FpdF9tc2dpbnRfcmVhZHkoYWNiKSkgeworCQkJd3JpdGVsKEFSQ01TUl9NRVNTQUdFX0FDVElWRV9FT0lfTU9ERSwgcmVnLT5kcnYyaW9wX2Rvb3JiZWxsKTsKKwkJCWlmICghYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CiAJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBUkNNU1IgSU9QIGVuYWJsZXMgRU9JX01PREUgVElNRU9VVCIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCQlicmVhazsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzoKKwkJcmV0dXJuOwogCX0KIAlyZXR1cm47CiB9CkBAIC0yNDI2LDE1ICsyODM5LDMzIEBACiBzdGF0aWMgdm9pZCBhcmNtc3JfaGFyZHdhcmVfcmVzZXQoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAl1aW50OF90IHZhbHVlWzY0XTsKLQlpbnQgaTsKLQorCWludCBpLCBjb3VudCA9IDA7CisJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcG11QSA9IGFjYi0+cG11QTsKKwlzdHJ1Y3QgTWVzc2FnZVVuaXRfQyBfX2lvbWVtICpwbXVDID0gYWNiLT5wbXVDOworCXUzMiB0ZW1wID0gMDsKIAkvKiBiYWNrdXAgcGNpIGNvbmZpZyBkYXRhICovCisJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogZXhlY3V0aW5nIGh3IGJ1cyByZXNldCAuLi4uLlxuIiwgYWNiLT5ob3N0LT5ob3N0X25vKTsKIAlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShhY2ItPnBkZXYsIGksICZ2YWx1ZVtpXSk7CiAJfQogCS8qIGhhcmR3YXJlIHJlc2V0IHNpZ25hbCAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShhY2ItPnBkZXYsIDB4ODQsIDB4MjApOwotCW1zbGVlcCgxMDAwKTsKKwlpZiAoKGFjYi0+ZGV2X2lkID09IDB4MTY4MCkpIHsKKwkJd3JpdGVsKEFSQ01TUl9BUkMxNjgwX0JVU19SRVNFVCwgJnBtdUEtPnJlc2VydmVkMVswXSk7CisJfSBlbHNlIGlmICgoYWNiLT5kZXZfaWQgPT0gMHgxODgwKSkgeworCQlkbyB7CisJCQljb3VudCsrOworCQkJd3JpdGVsKDB4RiwgJnBtdUMtPndyaXRlX3NlcXVlbmNlKTsKKwkJCXdyaXRlbCgweDQsICZwbXVDLT53cml0ZV9zZXF1ZW5jZSk7CisJCQl3cml0ZWwoMHhCLCAmcG11Qy0+d3JpdGVfc2VxdWVuY2UpOworCQkJd3JpdGVsKDB4MiwgJnBtdUMtPndyaXRlX3NlcXVlbmNlKTsKKwkJCXdyaXRlbCgweDcsICZwbXVDLT53cml0ZV9zZXF1ZW5jZSk7CisJCQl3cml0ZWwoMHhELCAmcG11Qy0+d3JpdGVfc2VxdWVuY2UpOworCQl9IHdoaWxlICgoKCh0ZW1wID0gcmVhZGwoJnBtdUMtPmhvc3RfZGlhZ25vc3RpYykpIHwgQVJDTVNSX0FSQzE4ODBfRGlhZ1dyaXRlX0VOQUJMRSkgPT0gMCkgJiYgKGNvdW50IDwgNSkpOworCQl3cml0ZWwoQVJDTVNSX0FSQzE4ODBfUkVTRVRfQURBUFRFUiwgJnBtdUMtPmhvc3RfZGlhZ25vc3RpYyk7CisJfSBlbHNlIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFjYi0+cGRldiwgMHg4NCwgMHgyMCk7CisJfQorCW1zbGVlcCgyMDAwKTsKIAkvKiB3cml0ZSBiYWNrIHBjaSBjb25maWcgZGF0YSAqLwogCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhY2ItPnBkZXYsIGksIHZhbHVlW2ldKTsKQEAgLTI0NDIsNTAgKzI4NzMsMTMgQEAKIAltc2xlZXAoMTAwMCk7CiAJcmV0dXJuOwogfQotLyoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZkZWYgQ09ORklHX1NDU0lfQVJDTVNSX1JFU0VUCi0JaW50IGFyY21zcl9zbGVlcF9mb3JfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLQl7Ci0JCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IE5VTEw7Ci0JCQlzcGlubG9ja190ICpob3N0X2xvY2sgPSBOVUxMOwotCQkJaW50IGksIGlzbGVlcDsKLQotCQkJc2hvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKLQkJCWhvc3RfbG9jayA9IHNob3N0LT5ob3N0X2xvY2s7Ci0KLQkJCXByaW50ayhLRVJOX05PVElDRSAiSG9zdCAlZCBidXMgcmVzZXQgb3Zlciwgc2xlZXAgJWQgc2Vjb25kcyAoYnVzeSAlZCwgY2FuIHF1ZXVlICVkKSAuLi4uLi4uLi4uLlxuIiwKLQkJCQkJc2hvc3QtPmhvc3Rfbm8sIHNsZWVwdGltZSwgc2hvc3QtPmhvc3RfYnVzeSwgc2hvc3QtPmNhbl9xdWV1ZSk7Ci0JCQlpc2xlZXAgPSBzbGVlcHRpbWUgLyAxMDsKLQkJCXNwaW5fdW5sb2NrX2lycShob3N0X2xvY2spOwotCQkJaWYgKGlzbGVlcCA+IDApIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgaXNsZWVwOyBpKyspIHsKLQkJCQkJbXNsZWVwKDEwMDAwKTsKLQkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJeJWReXG4iLCBpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlzbGVlcCA9IHNsZWVwdGltZSAlIDEwOwotCQkJaWYgKGlzbGVlcCA+IDApIHsKLQkJCQltc2xlZXAoaXNsZWVwICogMTAwMCk7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJedl5cbiIpOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycShob3N0X2xvY2spOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFICIqKioqKiB3YWtlIHVwICoqKioqXG4iKTsKLQkJCXJldHVybiAwOwotCX0KLSNlbmRpZgogc3RhdGljIHZvaWQgYXJjbXNyX2lvcF9pbml0KHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IpCiB7CiAJdWludDMyX3QgaW50bWFza19vcmc7Ci0KLSAgICAgICAvKiBkaXNhYmxlIGFsbCBvdXRib3VuZCBpbnRlcnJ1cHQgKi8KLSAgICAgICBpbnRtYXNrX29yZyA9IGFyY21zcl9kaXNhYmxlX291dGJvdW5kX2ludHMoYWNiKTsKKwkvKiBkaXNhYmxlIGFsbCBvdXRib3VuZCBpbnRlcnJ1cHQgKi8KKwlpbnRtYXNrX29yZyA9IGFyY21zcl9kaXNhYmxlX291dGJvdW5kX2ludHMoYWNiKTsKIAlhcmNtc3Jfd2FpdF9maXJtd2FyZV9yZWFkeShhY2IpOwogCWFyY21zcl9pb3BfY29uZmlybShhY2IpOwotCWFyY21zcl9nZXRfZmlybXdhcmVfc3BlYyhhY2IsIDEpOwogCS8qc3RhcnQgYmFja2dyb3VuZCByZWJ1aWxkKi8KIAlhcmNtc3Jfc3RhcnRfYWRhcHRlcl9iZ3JiKGFjYik7CiAJLyogZW1wdHkgZG9vcmJlbGwgUWJ1ZmZlciBpZiBkb29yIGJlbGwgcmluZ2VkICovCkBAIC0yNTAyLDIwICsyODk2LDE3IEBACiAJdWludDMyX3QgaW50bWFza19vcmc7CiAJdWludDhfdCBydG52YWwgPSAweDAwOwogCWludCBpID0gMDsKLQogCWlmIChhdG9taWNfcmVhZCgmYWNiLT5jY2JvdXRzdGFuZGluZ2NvdW50KSAhPSAwKSB7CiAJCS8qIGRpc2FibGUgYWxsIG91dGJvdW5kIGludGVycnVwdCAqLwogCQlpbnRtYXNrX29yZyA9IGFyY21zcl9kaXNhYmxlX291dGJvdW5kX2ludHMoYWNiKTsKIAkJLyogdGFsayB0byBpb3AgMzMxIG91dHN0YW5kaW5nIGNvbW1hbmQgYWJvcnRlZCAqLwogCQlydG52YWwgPSBhcmNtc3JfYWJvcnRfYWxsY21kKGFjYik7Ci0JCS8qIHdhaXQgZm9yIDMgc2VjIGZvciBhbGwgY29tbWFuZCBhYm9ydGVkKi8KLQkJc3NsZWVwKDMpOwogCQkvKiBjbGVhciBhbGwgb3V0Ym91bmQgcG9zdGVkIFEgKi8KIAkJYXJjbXNyX2RvbmU0YWJvcnRfcG9zdHF1ZXVlKGFjYik7CiAJCWZvciAoaSA9IDA7IGkgPCBBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNOyBpKyspIHsKIAkJCWNjYiA9IGFjYi0+cGNjYl9wb29sW2ldOwogCQkJaWYgKGNjYi0+c3RhcnRkb25lID09IEFSQ01TUl9DQ0JfU1RBUlQpIHsKLQkJCQlhcmNtc3JfY2NiX2NvbXBsZXRlKGNjYiwgMSk7CisJCQkJYXJjbXNyX2NjYl9jb21wbGV0ZShjY2IpOwogCQkJfQogCQl9CiAJCWF0b21pY19zZXQoJmFjYi0+Y2Nib3V0c3RhbmRpbmdjb3VudCwgMCk7CkBAIC0yNTMwLDk0ICsyOTIxLDE5MCBAQAogewogCXN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IgPQogCQkoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0JaW50IHJldHJ5ID0gMDsKLQotCWlmIChhY2ItPmFjYl9mbGFncyAmIEFDQl9GX0JVU19SRVNFVCkKLQkJcmV0dXJuIFNVQ0NFU1M7Ci0KLQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBidXMgcmVzZXQgLi4uLi4gXG4iLCBhY2ItPmFkYXB0ZXJfaW5kZXgpOwotCWFjYi0+YWNiX2ZsYWdzIHw9IEFDQl9GX0JVU19SRVNFVDsKKwl1aW50MzJfdCBpbnRtYXNrX29yZywgb3V0Ym91bmRfZG9vcmJlbGw7CisJaW50IHJldHJ5X2NvdW50ID0gMDsKKwlpbnQgcnRuID0gRkFJTEVEOworCWFjYiA9IChzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJcHJpbnRrKEtFUk5fRVJSICJhcmNtc3I6IGV4ZWN1dGluZyBidXMgcmVzZXQgZWguLi4uLm51bV9yZXNldHMgPSAlZCwgbnVtX2Fib3J0cyA9ICVkIFxuIiwgYWNiLT5udW1fcmVzZXRzLCBhY2ItPm51bV9hYm9ydHMpOwogCWFjYi0+bnVtX3Jlc2V0cysrOwotCXdoaWxlIChhdG9taWNfcmVhZCgmYWNiLT5jY2JvdXRzdGFuZGluZ2NvdW50KSAhPSAwICYmIHJldHJ5IDwgNCkgewotCQlhcmNtc3JfaW50ZXJydXB0KGFjYik7Ci0JCXJldHJ5Kys7Ci0JfQogCi0JaWYgKGFyY21zcl9pb3BfcmVzZXQoYWNiKSkgewotCQlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7Ci0JCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9BOiB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgImFyY21zciVkOiBkbyBoYXJkd2FyZSBidXMgcmVzZXQsIG51bV9yZXNldHMgPSAlZCBudW1fYWJvcnRzID0gJWQgXG4iLAotCQkJCWFjYi0+YWRhcHRlcl9pbmRleCwgYWNiLT5udW1fcmVzZXRzLCBhY2ItPm51bV9hYm9ydHMpOwotCQkJYXJjbXNyX2hhcmR3YXJlX3Jlc2V0KGFjYik7Ci0JCQlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9GSVJNV0FSRV9UUkFQOwotCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0lPUF9JTklURUQ7Ci0JCQkjaWZkZWYgQ09ORklHX1NDU0lfQVJDTVNSX1JFU0VUCi0JCQlzdHJ1Y3QgTWVzc2FnZVVuaXRfQSBfX2lvbWVtICpyZWcgPSBhY2ItPnBtdUE7Ci0JCQl1aW50MzJfdCBpbnRtYXNrX29yZywgb3V0Ym91bmRfZG9vcmJlbGw7Ci0JCQlpbnQgcmV0cnlfY291bnQgPSAwOworCXN3aXRjaChhY2ItPmFkYXB0ZXJfdHlwZSl7CisJCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9BOnsKKwkJCWlmIChhY2ItPmFjYl9mbGFncyAmIEFDQl9GX0JVU19SRVNFVCl7CisJCQkJbG9uZyB0aW1lb3V0OworCQkJCXByaW50ayhLRVJOX0VSUiAiYXJjbXNyOiB0aGVyZSBpcyBhbiAgYnVzIHJlc2V0IGVoIHByb2NlZWRpbmcuLi4uLi4uXG4iKTsKKwkJCQl0aW1lb3V0ID0gd2FpdF9ldmVudF90aW1lb3V0KHdhaXRfcSwgKGFjYi0+YWNiX2ZsYWdzICYgQUNCX0ZfQlVTX1JFU0VUKSA9PSAwLCAyMjAqSFopOworCQkJCWlmICh0aW1lb3V0KSB7CisJCQkJCXJldHVybiBTVUNDRVNTOworCQkJCX0KKwkJCX0KKwkJCWFjYi0+YWNiX2ZsYWdzIHw9IEFDQl9GX0JVU19SRVNFVDsKKwkJCWlmICghYXJjbXNyX2lvcF9yZXNldChhY2IpKSB7CisJCQkJc3RydWN0IE1lc3NhZ2VVbml0X0EgX19pb21lbSAqcmVnOworCQkJCXJlZyA9IGFjYi0+cG11QTsKKwkJCQlhcmNtc3JfaGFyZHdhcmVfcmVzZXQoYWNiKTsKKwkJCQlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfSU9QX0lOSVRFRDsKIHNsZWVwX2FnYWluOgotCQkJYXJjbXNyX3NsZWVwX2Zvcl9idXNfcmVzZXQoY21kKTsKLQkJCWlmICgocmVhZGwoJnJlZy0+b3V0Ym91bmRfbXNnYWRkcjEpICYKLQkJCUFSQ01TUl9PVVRCT1VORF9NRVNHMV9GSVJNV0FSRV9PSykgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogaGFyZHdhcmUgYnVzIHJlc2V0IGFuZCByZXR1cm4gYnVzeSwgcmV0cnk9JWQgXG4iLAotCQkJYWNiLT5ob3N0LT5ob3N0X25vLCByZXRyeV9jb3VudCk7Ci0JCQlpZiAocmV0cnlfY291bnQgPiByZXRyeWNvdW50KSB7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogaGFyZHdhcmUgYnVzIHJlc2V0IGFuZCByZXR1cm4gYnVzeSwgcmV0cnkgYWJvcnRlZCBcbiIsCi0JCQkJYWNiLT5ob3N0LT5ob3N0X25vKTsKLQkJCXJldHVybiBTVUNDRVNTOworCQkJCWFyY21zcl9zbGVlcF9mb3JfYnVzX3Jlc2V0KGNtZCk7CisJCQkJaWYgKChyZWFkbCgmcmVnLT5vdXRib3VuZF9tc2dhZGRyMSkgJiBBUkNNU1JfT1VUQk9VTkRfTUVTRzFfRklSTVdBUkVfT0spID09IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJhcmNtc3IlZDogd2FpdGluZyBmb3IgaHcgYnVzIHJlc2V0IHJldHVybiwgcmV0cnk9JWQgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8sIHJldHJ5X2NvdW50KTsKKwkJCQkJaWYgKHJldHJ5X2NvdW50ID4gcmV0cnljb3VudCkgeworCQkJCQkJYWNiLT5md19mbGFnID0gRldfREVBRExPQ0s7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgImFyY21zciVkOiB3YWl0aW5nIGZvciBodyBidXMgcmVzZXQgcmV0dXJuLCBSRVRSWSBURVJNSU5BVEVEISEgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOworCQkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQkJfQorCQkJCQlyZXRyeV9jb3VudCsrOworCQkJCQlnb3RvIHNsZWVwX2FnYWluOworCQkJCX0KKwkJCQlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9JT1BfSU5JVEVEOworCQkJCS8qIGRpc2FibGUgYWxsIG91dGJvdW5kIGludGVycnVwdCAqLworCQkJCWludG1hc2tfb3JnID0gYXJjbXNyX2Rpc2FibGVfb3V0Ym91bmRfaW50cyhhY2IpOworCQkJCWFyY21zcl9nZXRfZmlybXdhcmVfc3BlYyhhY2IpOworCQkJCWFyY21zcl9zdGFydF9hZGFwdGVyX2JncmIoYWNiKTsKKwkJCQkvKiBjbGVhciBRYnVmZmVyIGlmIGRvb3IgYmVsbCByaW5nZWQgKi8KKwkJCQlvdXRib3VuZF9kb29yYmVsbCA9IHJlYWRsKCZyZWctPm91dGJvdW5kX2Rvb3JiZWxsKTsKKwkJCQl3cml0ZWwob3V0Ym91bmRfZG9vcmJlbGwsICZyZWctPm91dGJvdW5kX2Rvb3JiZWxsKTsgLypjbGVhciBpbnRlcnJ1cHQgKi8KKyAgIAkJCQl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfRFJJVkVSX0RBVEFfUkVBRF9PSywgJnJlZy0+aW5ib3VuZF9kb29yYmVsbCk7CisJCQkJLyogZW5hYmxlIG91dGJvdW5kIFBvc3QgUXVldWUsb3V0Ym91bmQgZG9vcmJlbGwgSW50ZXJydXB0ICovCisJCQkJYXJjbXNyX2VuYWJsZV9vdXRib3VuZF9pbnRzKGFjYiwgaW50bWFza19vcmcpOworCQkJCWF0b21pY19zZXQoJmFjYi0+cnFfbWFwX3Rva2VuLCAxNik7CisJCQkJYXRvbWljX3NldCgmYWNiLT5hbnRlX3Rva2VuX3ZhbHVlLCAxNik7CisJCQkJYWNiLT5md19mbGFnID0gRldfTk9STUFMOworCQkJCWluaXRfdGltZXIoJmFjYi0+ZXRlcm5hbF90aW1lcik7CisJCQkJYWNiLT5ldGVybmFsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2KkhaKTsKKwkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7CisJCQkJYWNiLT5ldGVybmFsX3RpbWVyLmZ1bmN0aW9uID0gJmFyY21zcl9yZXF1ZXN0X2RldmljZV9tYXA7CisJCQkJYWRkX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIpOworCQkJCWFjYi0+YWNiX2ZsYWdzICY9IH5BQ0JfRl9CVVNfUkVTRVQ7CisJCQkJcnRuID0gU1VDQ0VTUzsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFyY21zcjogc2NzaSAgYnVzIHJlc2V0IGVoIHJldHVybnMgd2l0aCBzdWNjZXNzXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0JVU19SRVNFVDsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSA9PSAwKSB7CisJCQkJCWF0b21pY19zZXQoJmFjYi0+cnFfbWFwX3Rva2VuLCAxNik7CisJCQkJCWF0b21pY19zZXQoJmFjYi0+YW50ZV90b2tlbl92YWx1ZSwgMTYpOworCQkJCQlhY2ItPmZ3X2ZsYWcgPSBGV19OT1JNQUw7CisJCQkJCWluaXRfdGltZXIoJmFjYi0+ZXRlcm5hbF90aW1lcik7CisJCQkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYqSFopOworCQkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7CisJCQkJCWFjYi0+ZXRlcm5hbF90aW1lci5mdW5jdGlvbiA9ICZhcmNtc3JfcmVxdWVzdF9kZXZpY2VfbWFwOworCQkJCQlhZGRfdGltZXIoJmFjYi0+ZXRlcm5hbF90aW1lcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXRvbWljX3NldCgmYWNiLT5ycV9tYXBfdG9rZW4sIDE2KTsKKwkJCQkJYXRvbWljX3NldCgmYWNiLT5hbnRlX3Rva2VuX3ZhbHVlLCAxNik7CisJCQkJCWFjYi0+ZndfZmxhZyA9IEZXX05PUk1BTDsKKwkJCQkJbW9kX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYqSFopKTsKKwkJCQl9CisJCQkJcnRuID0gU1VDQ0VTUzsKIAkJCX0KLQkJCXJldHJ5X2NvdW50Kys7Ci0JCQlnb3RvIHNsZWVwX2FnYWluOwotCQkJfQotCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0ZJUk1XQVJFX1RSQVA7Ci0JCQlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9JT1BfSU5JVEVEOwotCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0JVU19SRVNFVDsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IGhhcmR3YXJlIGJ1cyByZXNldCBhbmQgcmVzZXQgb2sgXG4iLAotCQkJCWFjYi0+aG9zdC0+aG9zdF9ubyk7Ci0JCQkvKiBkaXNhYmxlIGFsbCBvdXRib3VuZCBpbnRlcnJ1cHQgKi8KLQkJCWludG1hc2tfb3JnID0gYXJjbXNyX2Rpc2FibGVfb3V0Ym91bmRfaW50cyhhY2IpOwotCQkJYXJjbXNyX2dldF9maXJtd2FyZV9zcGVjKGFjYiwgMSk7Ci0JCQkvKnN0YXJ0CWJhY2tncm91bmQgcmVidWlsZCovCi0JCQlhcmNtc3Jfc3RhcnRfYWRhcHRlcl9iZ3JiKGFjYik7Ci0JCQkvKiBjbGVhciBRYnVmZmVyIGlmIGRvb3IgYmVsbCByaW5nZWQgKi8KLQkJCW91dGJvdW5kX2Rvb3JiZWxsID0gcmVhZGwoJnJlZy0+b3V0Ym91bmRfZG9vcmJlbGwpOwotCQkJd3JpdGVsKG91dGJvdW5kX2Rvb3JiZWxsLCAmcmVnLT5vdXRib3VuZF9kb29yYmVsbCk7IC8qY2xlYXIgaW50ZXJydXB0ICovCi0JCQl3cml0ZWwoQVJDTVNSX0lOQk9VTkRfRFJJVkVSX0RBVEFfUkVBRF9PSywgJnJlZy0+aW5ib3VuZF9kb29yYmVsbCk7Ci0JCQkvKiBlbmFibGUgb3V0Ym91bmQgUG9zdCBRdWV1ZSxvdXRib3VuZCBkb29yYmVsbCBJbnRlcnJ1cHQgKi8KLQkJCWFyY21zcl9lbmFibGVfb3V0Ym91bmRfaW50cyhhY2IsIGludG1hc2tfb3JnKTsKLQkJCWF0b21pY19zZXQoJmFjYi0+cnFfbWFwX3Rva2VuLCAxNik7Ci0JCQlpbml0X3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIpOwotCQkJYWNiLT5ldGVybmFsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCpIWik7Ci0JCQlhY2ItPmV0ZXJuYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7Ci0JCQlhY2ItPmV0ZXJuYWxfdGltZXIuZnVuY3Rpb24gPSAmYXJjbXNyX3JlcXVlc3RfZGV2aWNlX21hcDsKLQkJCWFkZF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyKTsKLQkJCSNlbmRpZgotCQl9CiAJCQlicmVhazsKLQkJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0I6IHsKLQl9CiAJCX0KLQl9IGVsc2UgewotCWFjYi0+YWNiX2ZsYWdzICY9IH5BQ0JfRl9CVVNfUkVTRVQ7CisJCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9COnsKKwkJCWFjYi0+YWNiX2ZsYWdzIHw9IEFDQl9GX0JVU19SRVNFVDsKKwkJCWlmICghYXJjbXNyX2lvcF9yZXNldChhY2IpKSB7CisJCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0JVU19SRVNFVDsKKwkJCQlydG4gPSBGQUlMRUQ7CisJCQl9IGVsc2UgeworCQkJCWFjYi0+YWNiX2ZsYWdzICY9IH5BQ0JfRl9CVVNfUkVTRVQ7CisJCQkJaWYgKGF0b21pY19yZWFkKCZhY2ItPnJxX21hcF90b2tlbikgPT0gMCkgeworCQkJCQlhdG9taWNfc2V0KCZhY2ItPnJxX21hcF90b2tlbiwgMTYpOworCQkJCQlhdG9taWNfc2V0KCZhY2ItPmFudGVfdG9rZW5fdmFsdWUsIDE2KTsKKwkJCQkJYWNiLT5md19mbGFnID0gRldfTk9STUFMOworCQkJCQlpbml0X3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIpOworCQkJCQkJYWNiLT5ldGVybmFsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2KkhaKTsKKwkJCQkJYWNiLT5ldGVybmFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWNiOworCQkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZnVuY3Rpb24gPSAmYXJjbXNyX3JlcXVlc3RfZGV2aWNlX21hcDsKKwkJCQkJYWRkX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIpOworCQkJCX0gZWxzZSB7CisJCQkJCWF0b21pY19zZXQoJmFjYi0+cnFfbWFwX3Rva2VuLCAxNik7CisJCQkJCWF0b21pY19zZXQoJmFjYi0+YW50ZV90b2tlbl92YWx1ZSwgMTYpOworCQkJCQlhY2ItPmZ3X2ZsYWcgPSBGV19OT1JNQUw7CisJCQkJCW1vZF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2KkhaKSk7CisJCQkJfQorCQkJCXJ0biA9IFNVQ0NFU1M7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEFDQl9BREFQVEVSX1RZUEVfQzp7CisJCQlpZiAoYWNiLT5hY2JfZmxhZ3MgJiBBQ0JfRl9CVVNfUkVTRVQpIHsKKwkJCQlsb25nIHRpbWVvdXQ7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhcmNtc3I6IHRoZXJlIGlzIGFuIGJ1cyByZXNldCBlaCBwcm9jZWVkaW5nLi4uLi4uLlxuIik7CisJCQkJdGltZW91dCA9IHdhaXRfZXZlbnRfdGltZW91dCh3YWl0X3EsIChhY2ItPmFjYl9mbGFncyAmIEFDQl9GX0JVU19SRVNFVCkgPT0gMCwgMjIwKkhaKTsKKwkJCQlpZiAodGltZW91dCkgeworCQkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCQl9CisJCQl9CisJCQlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9CVVNfUkVTRVQ7CisJCQlpZiAoIWFyY21zcl9pb3BfcmVzZXQoYWNiKSkgeworCQkJCXN0cnVjdCBNZXNzYWdlVW5pdF9DIF9faW9tZW0gKnJlZzsKKwkJCQlyZWcgPSBhY2ItPnBtdUM7CisJCQkJYXJjbXNyX2hhcmR3YXJlX3Jlc2V0KGFjYik7CisJCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0lPUF9JTklURUQ7CitzbGVlcDoKKwkJCQlhcmNtc3Jfc2xlZXBfZm9yX2J1c19yZXNldChjbWQpOworCQkJCWlmICgocmVhZGwoJnJlZy0+aG9zdF9kaWFnbm9zdGljKSAmIDB4MDQpICE9IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJhcmNtc3IlZDogd2FpdGluZyBmb3IgaHcgYnVzIHJlc2V0IHJldHVybiwgcmV0cnk9JWQgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8sIHJldHJ5X2NvdW50KTsKKwkJCQkJaWYgKHJldHJ5X2NvdW50ID4gcmV0cnljb3VudCkgeworCQkJCQkJYWNiLT5md19mbGFnID0gRldfREVBRExPQ0s7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgImFyY21zciVkOiB3YWl0aW5nIGZvciBodyBidXMgcmVzZXQgcmV0dXJuLCBSRVRSWSBURVJNSU5BVEVEISEgXG4iLCBhY2ItPmhvc3QtPmhvc3Rfbm8pOworCQkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQkJfQorCQkJCQlyZXRyeV9jb3VudCsrOworCQkJCQlnb3RvIHNsZWVwOworCQkJCX0KKwkJCQlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9JT1BfSU5JVEVEOworCQkJCS8qIGRpc2FibGUgYWxsIG91dGJvdW5kIGludGVycnVwdCAqLworCQkJCWludG1hc2tfb3JnID0gYXJjbXNyX2Rpc2FibGVfb3V0Ym91bmRfaW50cyhhY2IpOworCQkJCWFyY21zcl9nZXRfZmlybXdhcmVfc3BlYyhhY2IpOworCQkJCWFyY21zcl9zdGFydF9hZGFwdGVyX2JncmIoYWNiKTsKKwkJCQkvKiBjbGVhciBRYnVmZmVyIGlmIGRvb3IgYmVsbCByaW5nZWQgKi8KKwkJCQlvdXRib3VuZF9kb29yYmVsbCA9IHJlYWRsKCZyZWctPm91dGJvdW5kX2Rvb3JiZWxsKTsKKwkJCQl3cml0ZWwob3V0Ym91bmRfZG9vcmJlbGwsICZyZWctPm91dGJvdW5kX2Rvb3JiZWxsX2NsZWFyKTsgLypjbGVhciBpbnRlcnJ1cHQgKi8KKwkJCQl3cml0ZWwoQVJDTVNSX0hCQ01VX0RSVjJJT1BfREFUQV9SRUFEX09LLCAmcmVnLT5pbmJvdW5kX2Rvb3JiZWxsKTsKKwkJCQkvKiBlbmFibGUgb3V0Ym91bmQgUG9zdCBRdWV1ZSxvdXRib3VuZCBkb29yYmVsbCBJbnRlcnJ1cHQgKi8KKwkJCQlhcmNtc3JfZW5hYmxlX291dGJvdW5kX2ludHMoYWNiLCBpbnRtYXNrX29yZyk7CisJCQkJYXRvbWljX3NldCgmYWNiLT5ycV9tYXBfdG9rZW4sIDE2KTsKKwkJCQlhdG9taWNfc2V0KCZhY2ItPmFudGVfdG9rZW5fdmFsdWUsIDE2KTsKKwkJCQlhY2ItPmZ3X2ZsYWcgPSBGV19OT1JNQUw7CisJCQkJaW5pdF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyKTsKKwkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYgKiBIWik7CisJCQkJYWNiLT5ldGVybmFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWNiOworCQkJCWFjYi0+ZXRlcm5hbF90aW1lci5mdW5jdGlvbiA9ICZhcmNtc3JfcmVxdWVzdF9kZXZpY2VfbWFwOworCQkJCWFkZF90aW1lcigmYWNiLT5ldGVybmFsX3RpbWVyKTsKKwkJCQlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfQlVTX1JFU0VUOworCQkJCXJ0biA9IFNVQ0NFU1M7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhcmNtc3I6IHNjc2kgYnVzIHJlc2V0IGVoIHJldHVybnMgd2l0aCBzdWNjZXNzXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJYWNiLT5hY2JfZmxhZ3MgJj0gfkFDQl9GX0JVU19SRVNFVDsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmFjYi0+cnFfbWFwX3Rva2VuKSA9PSAwKSB7CisJCQkJCWF0b21pY19zZXQoJmFjYi0+cnFfbWFwX3Rva2VuLCAxNik7CisJCQkJCWF0b21pY19zZXQoJmFjYi0+YW50ZV90b2tlbl92YWx1ZSwgMTYpOworCQkJCQlhY2ItPmZ3X2ZsYWcgPSBGV19OT1JNQUw7CisJCQkJCWluaXRfdGltZXIoJmFjYi0+ZXRlcm5hbF90aW1lcik7CisJCQkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYqSFopOworCQkJCQlhY2ItPmV0ZXJuYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY2I7CisJCQkJCWFjYi0+ZXRlcm5hbF90aW1lci5mdW5jdGlvbiA9ICZhcmNtc3JfcmVxdWVzdF9kZXZpY2VfbWFwOworCQkJCQlhZGRfdGltZXIoJmFjYi0+ZXRlcm5hbF90aW1lcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXRvbWljX3NldCgmYWNiLT5ycV9tYXBfdG9rZW4sIDE2KTsKKwkJCQkJYXRvbWljX3NldCgmYWNiLT5hbnRlX3Rva2VuX3ZhbHVlLCAxNik7CisJCQkJCWFjYi0+ZndfZmxhZyA9IEZXX05PUk1BTDsKKwkJCQkJbW9kX3RpbWVyKCZhY2ItPmV0ZXJuYWxfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYqSFopKTsKKwkJCQl9CisJCQkJcnRuID0gU1VDQ0VTUzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CiAJfQotCXJldHVybiBTVUNDRVNTOworCXJldHVybiBydG47CiB9CiAKLXN0YXRpYyB2b2lkIGFyY21zcl9hYm9ydF9vbmVfY21kKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsCitzdGF0aWMgaW50IGFyY21zcl9hYm9ydF9vbmVfY21kKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsCiAJCXN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2IpCiB7Ci0JdTMyIGludG1hc2s7Ci0KLQljY2ItPnN0YXJ0ZG9uZSA9IEFSQ01TUl9DQ0JfQUJPUlRFRDsKLQotCS8qCi0JKiogV2FpdCBmb3IgMyBzZWMgZm9yIGFsbCBjb21tYW5kIGRvbmUuCi0JKi8KLQlzc2xlZXAoMyk7Ci0KLQlpbnRtYXNrID0gYXJjbXNyX2Rpc2FibGVfb3V0Ym91bmRfaW50cyhhY2IpOwotCWFyY21zcl9wb2xsaW5nX2NjYmRvbmUoYWNiLCBjY2IpOwotCWFyY21zcl9lbmFibGVfb3V0Ym91bmRfaW50cyhhY2IsIGludG1hc2spOworCWludCBydG47CisJcnRuID0gYXJjbXNyX3BvbGxpbmdfY2NiZG9uZShhY2IsIGNjYik7CisJcmV0dXJuIHJ0bjsKIH0KIAogc3RhdGljIGludCBhcmNtc3JfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQpAQCAtMjYyNSwxMCArMzExMiwxMSBAQAogCXN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IgPQogCQkoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAJaW50IGkgPSAwOwotCisJaW50IHJ0biA9IEZBSUxFRDsKIAlwcmludGsoS0VSTl9OT1RJQ0UKIAkJImFyY21zciVkOiBhYm9ydCBkZXZpY2UgY29tbWFuZCBvZiBzY3NpIGlkID0gJWQgbHVuID0gJWQgXG4iLAogCQlhY2ItPmhvc3QtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJYWNiLT5hY2JfZmxhZ3MgfD0gQUNCX0ZfQUJPUlQ7CiAJYWNiLT5udW1fYWJvcnRzKys7CiAJLyoKIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI2MzcsMTcgKzMxMjUsMTggQEAKIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkqLwogCWlmICghYXRvbWljX3JlYWQoJmFjYi0+Y2Nib3V0c3RhbmRpbmdjb3VudCkpCi0JCXJldHVybiBTVUNDRVNTOworCQlyZXR1cm4gcnRuOwogCiAJZm9yIChpID0gMDsgaSA8IEFSQ01TUl9NQVhfRlJFRUNDQl9OVU07IGkrKykgewogCQlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiID0gYWNiLT5wY2NiX3Bvb2xbaV07CiAJCWlmIChjY2ItPnN0YXJ0ZG9uZSA9PSBBUkNNU1JfQ0NCX1NUQVJUICYmIGNjYi0+cGNtZCA9PSBjbWQpIHsKLQkJCWFyY21zcl9hYm9ydF9vbmVfY21kKGFjYiwgY2NiKTsKKwkJCWNjYi0+c3RhcnRkb25lID0gQVJDTVNSX0NDQl9BQk9SVEVEOworCQkJcnRuID0gYXJjbXNyX2Fib3J0X29uZV9jbWQoYWNiLCBjY2IpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KLQlyZXR1cm4gU1VDQ0VTUzsKKwlhY2ItPmFjYl9mbGFncyAmPSB+QUNCX0ZfQUJPUlQ7CisJcmV0dXJuIHJ0bjsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmFyY21zcl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCkBAIC0yNjU3LDcgKzMxNDYsNiBAQAogCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOwogCWNoYXIgKnR5cGU7CiAJaW50IHJhaWQ2ID0gMTsKLQogCXN3aXRjaCAoYWNiLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfQVJFQ0FfMTExMDoKIAljYXNlIFBDSV9ERVZJQ0VfSURfQVJFQ0FfMTIwMDoKQEAgLTI2ODEsNiArMzE2OSw3IEBACiAJY2FzZSBQQ0lfREVWSUNFX0lEX0FSRUNBXzEzODE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0FSRUNBXzE2ODA6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0FSRUNBXzE2ODE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0FSRUNBXzE4ODA6CiAJCXR5cGUgPSAiU0FTIjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL0tjb25maWcKaW5kZXggMjk1MmZjZC4uODRjMjc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgQkUySVNDU0kKIAl0cmlzdGF0ZSAiU2VydmVyRW5naW5lcycgMTBHYnBzIGlTQ1NJIC0gQmxhZGVFbmdpbmUgMiIKLQlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBORVQKIAlzZWxlY3QgU0NTSV9JU0NTSV9BVFRSUwogCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaAppbmRleCAxMzZiNDljLi4xY2I4YTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaApAQCAtMTI4LDggKzEyOCw4IEBACiAjZGVmaW5lIG1jY190aW1lb3V0CQkxMjAwMDAgLyogNXMgdGltZW91dCAqLwogCiAvKiBSZXR1cm5zIG51bWJlciBvZiBwYWdlcyBzcGFubmVkIGJ5IHRoZSBkYXRhIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBhZGRyICovCi0jZGVmaW5lIFBBR0VTXzRLX1NQQU5ORUQoX2FkZHJlc3MsIHNpemUpIAkJCQlcCi0JCSgodTMyKSgoKChzaXplX3QpKF9hZGRyZXNzKSAmIChQQUdFX1NJWkVfNEsgLSAxKSkgKyAJXAorI2RlZmluZSBQQUdFU180S19TUEFOTkVEKF9hZGRyZXNzLCBzaXplKQkJCQlcCisJCSgodTMyKSgoKChzaXplX3QpKF9hZGRyZXNzKSAmIChQQUdFX1NJWkVfNEsgLSAxKSkgKwlcCiAJCQkoc2l6ZSkgKyAoUEFHRV9TSVpFXzRLIC0gMSkpID4+IFBBR0VfU0hJRlRfNEspKQogCiAvKiBCeXRlIG9mZnNldCBpbnRvIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gYWRkcmVzcyAqLwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCSgoc2l6ZV90KShhZGRyKSAmIChQQUdFX1NJWkVfNEstMSkpCiAKIC8qIFJldHVybnMgYml0IG9mZnNldCB3aXRoaW4gYSBEV09SRCBvZiBhIGJpdGZpZWxkICovCi0jZGVmaW5lIEFNQVBfQklUX09GRlNFVChfc3RydWN0LCBmaWVsZCkgIAkJCQlcCisjZGVmaW5lIEFNQVBfQklUX09GRlNFVChfc3RydWN0LCBmaWVsZCkJCQkJCVwKIAkJKCgoc2l6ZV90KSYoKChfc3RydWN0ICopMCktPmZpZWxkKSklMzIpCiAKIC8qIFJldHVybnMgdGhlIGJpdCBtYXNrIG9mIHRoZSBmaWVsZCB0aGF0IGlzIE5PVCBzaGlmdGVkIGludG8gbG9jYXRpb24uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYwppbmRleCBjZGE2NjQyLi43Yzc1MzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKQEAgLTE5LDYgKzE5LDg2IEBACiAjaW5jbHVkZSAiYmVfbWdtdC5oIgogI2luY2x1ZGUgImJlX21haW4uaCIKIAoraW50IGJlaXNjc2lfcGNpX3NvZnRfcmVzZXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXUzMiBzcmVzZXQ7CisJdTggKnBjaV9yZXNldF9vZmZzZXQgPSAwOworCXU4ICpwY2lfb25saW5lMF9vZmZzZXQgPSAwOworCXU4ICpwY2lfb25saW5lMV9vZmZzZXQgPSAwOworCXUzMiBwY29ubGluZTAgPSAwOworCXUzMiBwY29ubGluZTEgPSAwOworCXUzMiBpOworCisJcGNpX3Jlc2V0X29mZnNldCA9ICh1OCAqKXBoYmEtPnBjaV92YSArIEJFMl9TT0ZUX1JFU0VUOworCXBjaV9vbmxpbmUwX29mZnNldCA9ICh1OCAqKXBoYmEtPnBjaV92YSArIEJFMl9QQ0lfT05MSU5FMDsKKwlwY2lfb25saW5lMV9vZmZzZXQgPSAodTggKilwaGJhLT5wY2lfdmEgKyBCRTJfUENJX09OTElORTE7CisJc3Jlc2V0ID0gcmVhZGwoKHZvaWQgKilwY2lfcmVzZXRfb2Zmc2V0KTsKKwlzcmVzZXQgfD0gQkUyX1NFVF9SRVNFVDsKKwl3cml0ZWwoc3Jlc2V0LCAodm9pZCAqKXBjaV9yZXNldF9vZmZzZXQpOworCisJaSA9IDA7CisJd2hpbGUgKHNyZXNldCAmIEJFMl9TRVRfUkVTRVQpIHsKKwkJaWYgKGkgPiA2NCkKKwkJCWJyZWFrOworCQltc2xlZXAoMTAwKTsKKwkJc3Jlc2V0ID0gcmVhZGwoKHZvaWQgKilwY2lfcmVzZXRfb2Zmc2V0KTsKKwkJaSsrOworCX0KKworCWlmIChzcmVzZXQgJiBCRTJfU0VUX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU29mdCBSZXNldCAgZGlkIG5vdCBkZWFzc2VydFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlwY29ubGluZTEgPSBCRTJfTVBVX0lSQU1fT05MSU5FOworCXdyaXRlbChwY29ubGluZTAsICh2b2lkICopcGNpX29ubGluZTBfb2Zmc2V0KTsKKwl3cml0ZWwocGNvbmxpbmUxLCAodm9pZCAqKXBjaV9vbmxpbmUxX29mZnNldCk7CisKKwlzcmVzZXQgPSBCRTJfU0VUX1JFU0VUOworCXdyaXRlbChzcmVzZXQsICh2b2lkICopcGNpX3Jlc2V0X29mZnNldCk7CisKKwlpID0gMDsKKwl3aGlsZSAoc3Jlc2V0ICYgQkUyX1NFVF9SRVNFVCkgeworCQlpZiAoaSA+IDY0KQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwkJc3Jlc2V0ID0gcmVhZGwoKHZvaWQgKilwY2lfcmVzZXRfb2Zmc2V0KTsKKwkJaSsrOworCX0KKwlpZiAoc3Jlc2V0ICYgQkUyX1NFVF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1QVSBPbmxpbmUgU29mdCBSZXNldCBkaWQgbm90IGRlYXNzZXJ0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitpbnQgYmVfY2hrX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwl1bnNpZ25lZCBpbnQgbnVtX2xvb3A7CisJdTggKm1wdV9zZW0gPSAwOworCXUzMiBzdGF0dXM7CisKKwludW1fbG9vcCA9IDEwMDA7CisJbXB1X3NlbSA9ICh1OCAqKXBoYmEtPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkU7CisJbXNsZWVwKDUwMDApOworCisJd2hpbGUgKG51bV9sb29wKSB7CisJCXN0YXR1cyA9IHJlYWRsKCh2b2lkICopbXB1X3NlbSk7CisKKwkJaWYgKChzdGF0dXMgJiAweDgwMDAwMDAwKSB8fCAoc3RhdHVzICYgMHgwMDAwRkZGRikgPT0gMHhDMDAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg2MCk7CisJCW51bV9sb29wLS07CisJfQorCisJaWYgKChzdGF0dXMgJiAweDgwMDAwMDAwKSB8fCAoIW51bV9sb29wKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCBpbiBiZV9jaGtfcmVzZXRfY29tcGxldGUiCisJCSJzdGF0dXMgPSAweCV4XG4iLCBzdGF0dXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBiZV9tY2Nfbm90aWZ5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKQEAgLTk4LDcgKzE3OCw3IEBACiAJCWRldl9lcnIoJmN0cmwtPnBkZXYtPmRldiwKIAkJCSJlcnJvciBpbiBjbWQgY29tcGxldGlvbjogc3RhdHVzKGNvbXBsL2V4dGQpPSVkLyVkXG4iLAogCQkJY29tcGxfc3RhdHVzLCBleHRkX3N0YXR1cyk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNTEsMjAgKzIzMSwyMCBAQAogewogCXN3aXRjaCAoZXZ0LT5wb3J0X2xpbmtfc3RhdHVzKSB7CiAJY2FzZSBBU1lOQ19FVkVOVF9MSU5LX0RPV046Ci0JCVNFX0RFQlVHKERCR19MVkxfMSwgIkxpbmsgRG93biBvbiBQaHlzaWNhbCBQb3J0ICVkIFxuIiwKLQkJCQkJCWV2dC0+cGh5c2ljYWxfcG9ydCk7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIkxpbmsgRG93biBvbiBQaHlzaWNhbCBQb3J0ICVkXG4iLAorCQkJCSAgICAgZXZ0LT5waHlzaWNhbF9wb3J0KTsKIAkJcGhiYS0+c3RhdGUgfD0gQkVfQURBUFRFUl9MSU5LX0RPV047CiAJCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihwaGJhLT5zaG9zdCwKIAkJCQkJICAgIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbik7CiAJCWJyZWFrOwogCWNhc2UgQVNZTkNfRVZFTlRfTElOS19VUDoKIAkJcGhiYS0+c3RhdGUgPSBCRV9BREFQVEVSX1VQOwotCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJMaW5rIFVQIG9uIFBoeXNpY2FsIFBvcnQgJWQgXG4iLAorCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJMaW5rIFVQIG9uIFBoeXNpY2FsIFBvcnQgJWRcbiIsCiAJCQkJCQlldnQtPnBoeXNpY2FsX3BvcnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJVbmV4cGVjdGVkIEFzeW5jIE5vdGlmaWNhdGlvbiAlZCBvbiIKLQkJCQkgICAgIlBoeXNpY2FsIFBvcnQgJWQgXG4iLAorCQkJCSAgICAiUGh5c2ljYWwgUG9ydCAlZFxuIiwKIAkJCQkgICAgIGV2dC0+cG9ydF9saW5rX3N0YXR1cywKIAkJCQkgICAgIGV2dC0+cGh5c2ljYWxfcG9ydCk7CiAJfQpAQCAtMTk5LDcgKzI3OSw3IEBACiAJCQllbHNlCiAJCQkJU0VfREVCVUcoREJHX0xWTF8xLAogCQkJCQkgIiBVbnN1cHBvcnRlZCBBc3luYyBFdmVudCwgZmxhZ3MiCi0JCQkJCSAiID0gMHglMDh4IFxuIiwgY29tcGwtPmZsYWdzKTsKKwkJCQkJICIgPSAweCUwOHhcbiIsIGNvbXBsLT5mbGFncyk7CiAKIAkJfSBlbHNlIGlmIChjb21wbC0+ZmxhZ3MgJiBDUUVfRkxBR1NfQ09NUExFVEVEX01BU0spIHsKIAkJCQlzdGF0dXMgPSBiZV9tY2NfY29tcGxfcHJvY2VzcyhjdHJsLCBjb21wbCk7CkBAIC0yMzEsNyArMzExLDcgQEAKIAl9CiAJaWYgKGkgPT0gbWNjX3RpbWVvdXQpIHsKIAkJZGV2X2VycigmcGhiYS0+cGNpZGV2LT5kZXYsICJtY2NxIHBvbGwgdGltZWQgb3V0XG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI1Nyw3ICszMzcsNyBAQAogCiAJCWlmIChjbnQgPiA2MDAwMDAwKSB7CiAJCQlkZXZfZXJyKCZjdHJsLT5wZGV2LT5kZXYsICJtYm94X2RiIHBvbGwgdGltZWQgb3V0XG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAogCQlpZiAoY250ID4gNTApIHsKQEAgLTI4Niw3ICszNjYsNyBAQAogCiAJc3RhdHVzID0gYmVfbWJveF9kYl9yZWFkeV93YWl0KGN0cmwpOwogCWlmIChzdGF0dXMgIT0gMCkgewotCQlTRV9ERUJVRyhEQkdfTFZMXzEsICIgYmVfbWJveF9kYl9yZWFkeV93YWl0IGZhaWxlZCAxXG4iKTsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiIGJlX21ib3hfZGJfcmVhZHlfd2FpdCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAl2YWwgPSAwOwpAQCAtMjk3LDE5ICszNzcsMTkgQEAKIAogCXN0YXR1cyA9IGJlX21ib3hfZGJfcmVhZHlfd2FpdChjdHJsKTsKIAlpZiAoc3RhdHVzICE9IDApIHsKLQkJU0VfREVCVUcoREJHX0xWTF8xLCAiIGJlX21ib3hfZGJfcmVhZHlfd2FpdCBmYWlsZWQgMlxuIik7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIiBiZV9tYm94X2RiX3JlYWR5X3dhaXQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAJaWYgKGJlX21jY19jb21wbF9pc19uZXcoY29tcGwpKSB7CiAJCXN0YXR1cyA9IGJlX21jY19jb21wbF9wcm9jZXNzKGN0cmwsICZtYm94LT5jb21wbCk7CiAJCWJlX21jY19jb21wbF91c2UoY29tcGwpOwogCQlpZiAoc3RhdHVzKSB7Ci0JCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJBZnRlciBiZV9tY2NfY29tcGxfcHJvY2VzcyBcbiIpOworCQkJU0VfREVCVUcoREJHX0xWTF8xLCAiQWZ0ZXIgYmVfbWNjX2NvbXBsX3Byb2Nlc3NcbiIpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCX0gZWxzZSB7CiAJCWRldl9lcnIoJmN0cmwtPnBkZXYtPmRldiwgImludmFsaWQgbWFpbGJveCBjb21wbGV0aW9uXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM1NSw3ICs0MzUsNyBAQAogCQkJcmV0dXJuIHN0YXR1czsKIAl9IGVsc2UgewogCQlkZXZfZXJyKCZwaGJhLT5wY2lkZXYtPmRldiwgImludmFsaWQgbWFpbGJveCBjb21wbGV0aW9uXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTUwMCw3ICs1ODAsNyBAQAogCiAJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CiAJaWYgKHN0YXR1cykKLQkJU0VfREVCVUcoREJHX0xWTF8xLCAiYmVfY21kX2Z3X2luaXRpYWxpemUgRmFpbGVkIFxuIik7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgImJlX2NtZF9md19pbml0aWFsaXplIEZhaWxlZFxuIik7CiAKIAlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTE3LDcgKzU5Nyw3IEBACiAJdm9pZCAqY3R4dCA9ICZyZXEtPmNvbnRleHQ7CiAJaW50IHN0YXR1czsKIAotCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfY21kX2NxX2NyZWF0ZSBcbiIpOworCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfY21kX2NxX2NyZWF0ZVxuIik7CiAJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CiAKQEAgLTU1MCw3ICs2MzAsNyBAQAogCQljcS0+aWQgPSBsZTE2X3RvX2NwdShyZXNwLT5jcV9pZCk7CiAJCWNxLT5jcmVhdGVkID0gdHJ1ZTsKIAl9IGVsc2UKLQkJU0VfREVCVUcoREJHX0xWTF8xLCAiSW4gYmVfY21kX2NxX2NyZWF0ZSwgc3RhdHVzPW94JTA4eCBcbiIsCisJCVNFX0RFQlVHKERCR19MVkxfMSwgIkluIGJlX2NtZF9jcV9jcmVhdGUsIHN0YXR1cz1veCUwOHhcbiIsCiAJCQlzdGF0dXMpOwogCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCkBAIC02MTksNyArNjk5LDcgQEAKIAl1OCBzdWJzeXMgPSAwLCBvcGNvZGUgPSAwOwogCWludCBzdGF0dXM7CiAKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2NtZF9xX2Rlc3Ryb3kgXG4iKTsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2NtZF9xX2Rlc3Ryb3lcbiIpOwogCXNwaW5fbG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOwogCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CkBAIC02NTIsNyArNzMyLDcgQEAKIAlkZWZhdWx0OgogCQlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAkJQlVHKCk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgc3Vic3lzLCBvcGNvZGUsIHNpemVvZigqcmVxKSk7CiAJaWYgKHF1ZXVlX3R5cGUgIT0gUVRZUEVfU0dMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKaW5kZXggNDlmY2M3OC4uNDA2NDFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCkBAIC00Nyw4ICs0Nyw4IEBACiAKICNkZWZpbmUgQ1FFX0ZMQUdTX1ZBTElEX01BU0sgKDEgPDwgMzEpCiAjZGVmaW5lIENRRV9GTEFHU19BU1lOQ19NQVNLICgxIDw8IDMwKQotI2RlZmluZSBDUUVfRkxBR1NfQ09NUExFVEVEX01BU0sgCSgxIDw8IDI4KQotI2RlZmluZSBDUUVfRkxBR1NfQ09OU1VNRURfTUFTSyAJKDEgPDwgMjcpCisjZGVmaW5lIENRRV9GTEFHU19DT01QTEVURURfTUFTSwkoMSA8PCAyOCkKKyNkZWZpbmUgQ1FFX0ZMQUdTX0NPTlNVTUVEX01BU0sJCSgxIDw8IDI3KQogCiAvKiBDb21wbGV0aW9uIFN0YXR1cyAqLwogI2RlZmluZSBNQ0NfU1RBVFVTX1NVQ0NFU1MgMHgwCkBAIC01Niw3ICs1Niw3IEBACiAjZGVmaW5lIENRRV9TVEFUVVNfQ09NUExfTUFTSyAweEZGRkYKICNkZWZpbmUgQ1FFX1NUQVRVU19DT01QTF9TSElGVCAwCS8qIGJpdHMgMCAtIDE1ICovCiAjZGVmaW5lIENRRV9TVEFUVVNfRVhURF9NQVNLIDB4RkZGRgotI2RlZmluZSBDUUVfU1RBVFVTX0VYVERfU0hJRlQgMAkJLyogYml0cyAwIC0gMTUgKi8KKyNkZWZpbmUgQ1FFX1NUQVRVU19FWFREX1NISUZUIDE2CQkvKiBiaXRzIDAgLSAxNSAqLwogCiBzdHJ1Y3QgYmVfbWNjX2NvbXBsIHsKIAl1MzIgc3RhdHVzOwkJLyogZHdvcmQgMCAqLwpAQCAtMTQzLDE0ICsxNDMsMTQgQEAKICAqLwogI2RlZmluZSBPUENPREVfQ09NTU9OX0NRX0NSRUFURQkJCQkxMgogI2RlZmluZSBPUENPREVfQ09NTU9OX0VRX0NSRUFURQkJCQkxMwotI2RlZmluZSBPUENPREVfQ09NTU9OX01DQ19DUkVBVEUgICAgICAgIAkJMjEKLSNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NQ0NfQ1JFQVRFCQkJMjEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTCQkzMgogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9GV19WRVJTSU9OCQkJMzUKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NT0RJRllfRVFfREVMQVkJCQk0MQogI2RlZmluZSBPUENPREVfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRwkJCTQyCi0jZGVmaW5lIE9QQ09ERV9DT01NT05fTUNDX0RFU1RST1kgICAgICAgIAkJNTMKLSNkZWZpbmUgT1BDT0RFX0NPTU1PTl9DUV9ERVNUUk9ZICAgICAgICAJCTU0Ci0jZGVmaW5lIE9QQ09ERV9DT01NT05fRVFfREVTVFJPWSAgICAgICAgCQk1NQorI2RlZmluZSBPUENPREVfQ09NTU9OX01DQ19ERVNUUk9ZCQkJNTMKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9DUV9ERVNUUk9ZCQkJNTQKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FUV9ERVNUUk9ZCQkJNTUKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9RVUVSWV9GSVJNV0FSRV9DT05GSUcJCTU4CiAjZGVmaW5lIE9QQ09ERV9DT01NT05fRlVOQ1RJT05fUkVTRVQJCQk2MQogCkBAIC0xNjQsOSArMTY0LDkgQEAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX0dFVF9OSUNfQ09ORklHCQk3CiAjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfU0VUX0ZSQUdOVU1fQklUU19GT1JfU0dMX0NSQSA2MQogI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX0RFRlFfQ1JFQVRFICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX0RFRlFfREVTVFJPWSAJCTY1CisjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfREVGUV9ERVNUUk9ZCQk2NQogI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX1dSQlFfQ1JFQVRFCQkJNjYKLSNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9XUkJRX0RFU1RST1kgCQk2NworI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX1dSQlFfREVTVFJPWQkJNjcKIAogc3RydWN0IGJlX2NtZF9yZXFfaGRyIHsKIAl1OCBvcGNvZGU7CQkvKiBkd29yZCAwICovCkBAIC00MjMsNyArNDIzLDcgQEAKIAkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSk7CiAKIGludCBiZV9wb2xsX21jYyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKTsKLXVuc2lnbmVkIGNoYXIgbWdtdF9jaGVja19zdXBwb3J0ZWRfZncoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKK2ludCBtZ210X2NoZWNrX3N1cHBvcnRlZF9mdyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCSAgICAgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CiB1bnNpZ25lZCBpbnQgYmVfY21kX2dldF9tYWNfYWRkcihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOwogdm9pZCBmcmVlX21jY190YWcoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgdW5zaWduZWQgaW50IHRhZyk7CkBAIC04NzUsNyArODc1LDcgQEAKIAkJCQkJCSAqLwogI2RlZmluZSBVTlNPTF9IRFJfTk9USUZZCQkyOAkvKiBVbnNvbGljaXRlZCBoZWFkZXIgbm90aWZ5LiovCiAjZGVmaW5lIFVOU09MX0RBVEFfTk9USUZZCQkyOQkvKiBVbnNvbGljaXRlZCBkYXRhIG5vdGlmeS4qLwotI2RlZmluZSBVTlNPTF9EQVRBX0RJR0VTVF9FUlJPUl9OT1RJRlkgCTMwCS8qIFVuc29saWNpdGVkIGRhdGEgZGlnZXN0CisjZGVmaW5lIFVOU09MX0RBVEFfRElHRVNUX0VSUk9SX05PVElGWQkzMAkvKiBVbnNvbGljaXRlZCBkYXRhIGRpZ2VzdAogCQkJCQkJICogZXJyb3Igbm90aWZ5LgogCQkJCQkJICovCiAjZGVmaW5lIERSSVZFUk1TR19OT1RJRlkJCTMxCS8qIFRDUCBhY2tub3dsZWRnZSBiYXNlZApAQCAtOTAxLDYgKzkwMSw5IEBACiAJCQkJCQkgKiB0aGUgY3huCiAJCQkJCQkgKi8KIAoraW50IGJlaXNjc2lfcGNpX3NvZnRfcmVzZXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKK2ludCBiZV9jaGtfcmVzZXRfY29tcGxldGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKKwogdm9pZCBiZV93cmJfaGRyX3ByZXBhcmUoc3RydWN0IGJlX21jY193cmIgKndyYiwgaW50IHBheWxvYWRfbGVuLAogCQkJYm9vbCBlbWJlZGRlZCwgdTggc2dlX2NudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKaW5kZXggYzM5MjhjYi4uNmQ2M2U3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX3Nlc3Npb25fY3JlYXRlXG4iKTsKIAogCWlmICghZXApIHsKLQkJU0VfREVCVUcoREJHX0xWTF8xLCAiYmVpc2NzaV9zZXNzaW9uX2NyZWF0ZTogaW52YWxpZCBlcCBcbiIpOworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJiZWlzY3NpX3Nlc3Npb25fY3JlYXRlOiBpbnZhbGlkIGVwXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWJlaXNjc2lfZXAgPSBlcC0+ZGRfZGF0YTsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQkJICJDb25uZWN0aW9uIHRhYmxlIGFscmVhZHkgb2NjdXBpZWQuIERldGVjdGVkIGNsYXNoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJU0VfREVCVUcoREJHX0xWTF84LCAicGhiYS0+Y29ubl90YWJsZVslZF09JXAoYmVpc2NzaV9jb25uKSBcbiIsCisJCVNFX0RFQlVHKERCR19MVkxfOCwgInBoYmEtPmNvbm5fdGFibGVbJWRdPSVwKGJlaXNjc2lfY29ubilcbiIsCiAJCQkgY2lkLCBiZWlzY3NpX2Nvbm4pOwogCQlwaGJhLT5jb25uX3RhYmxlW2NpZF0gPSBiZWlzY3NpX2Nvbm47CiAJfQpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIAlpZiAoYmVpc2NzaV9lcC0+cGhiYSAhPSBwaGJhKSB7CiAJCVNFX0RFQlVHKERCR19MVkxfOCwKLQkJCSAiYmVpc2NzaV9lcC0+aGJhPSVwIG5vdCBlcXVhbCB0byBwaGJhPSVwIFxuIiwKKwkJCSAiYmVpc2NzaV9lcC0+aGJhPSVwIG5vdCBlcXVhbCB0byBwaGJhPSVwXG4iLAogCQkJIGJlaXNjc2lfZXAtPnBoYmEsIHBoYmEpOwogCQlyZXR1cm4gLUVFWElTVDsKIAl9CkBAIC0yMDQsNyArMjA0LDcgQEAKIAliZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQgPSBiZWlzY3NpX2VwLT5lcF9jaWQ7CiAJYmVpc2NzaV9jb25uLT5lcCA9IGJlaXNjc2lfZXA7CiAJYmVpc2NzaV9lcC0+Y29ubiA9IGJlaXNjc2lfY29ubjsKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJiZWlzY3NpX2Nvbm49JXAgY29ubj0lcCBlcF9jaWQ9JWQgXG4iLAorCVNFX0RFQlVHKERCR19MVkxfOCwgImJlaXNjc2lfY29ubj0lcCBjb25uPSVwIGVwX2NpZD0lZFxuIiwKIAkJIGJlaXNjc2lfY29ubiwgY29ubiwgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKIAlyZXR1cm4gYmVpc2NzaV9iaW5kY29ubl9jaWQocGhiYSwgYmVpc2NzaV9jb25uLCBiZWlzY3NpX2VwLT5lcF9jaWQpOwogfQpAQCAtMjMwLDcgKzIzMCw3IEBACiAJaWYgKCFiZWlzY3NpX2VwKSB7CiAJCVNFX0RFQlVHKERCR19MVkxfMSwKIAkJCSAiSW4gYmVpc2NzaV9jb25uX2dldF9wYXJhbSAsIG5vIGJlaXNjc2lfZXBcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXN3aXRjaCAocGFyYW0pIHsKQEAgLTI3Nyw2ICsyNzcsMTAgQEAKIAkJaWYgKHNlc3Npb24tPm1heF9idXJzdCA+IDI2MjE0NCkKIAkJCXNlc3Npb24tPm1heF9idXJzdCA9IDI2MjE0NDsKIAkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQlpZiAoKGNvbm4tPm1heF94bWl0X2RsZW5ndGggPiA2NTUzNikgfHwKKwkJICAgIChjb25uLT5tYXhfeG1pdF9kbGVuZ3RoID09IDApKQorCQkJY29ubi0+bWF4X3htaXRfZGxlbmd0aCA9IDY1NTM2OwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCX0KQEAgLTMwOCw4ICszMTIsOCBAQAogCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M6CiAJCXRhZyA9IGJlX2NtZF9nZXRfbWFjX2FkZHIocGhiYSk7CiAJCWlmICghdGFnKSB7Ci0JCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJiZV9jbWRfZ2V0X21hY19hZGRyIEZhaWxlZCBcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJU0VfREVCVUcoREJHX0xWTF8xLCAiYmVfY21kX2dldF9tYWNfYWRkciBGYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0gZWxzZQogCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBoYmEtPmN0cmwubWNjX3dhaXRbdGFnXSwKIAkJCQkJCSBwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSk7CkBAIC0zMTksMTAgKzMyMywxMCBAQAogCQlzdGF0dXMgPSBwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSAmIDB4MDAwMDAwRkY7CiAJCWlmIChzdGF0dXMgfHwgZXh0ZF9zdGF0dXMpIHsKIAkJCVNFX0RFQlVHKERCR19MVkxfMSwgImJlX2NtZF9nZXRfbWFjX2FkZHIgRmFpbGVkIgotCQkJCQkgICAgIiBzdGF0dXMgPSAlZCBleHRkX3N0YXR1cyA9ICVkIFxuIiwKKwkJCQkJICAgICIgc3RhdHVzID0gJWQgZXh0ZF9zdGF0dXMgPSAlZFxuIiwKIAkJCQkJICAgIHN0YXR1cywgZXh0ZF9zdGF0dXMpOwogCQkJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0gZWxzZSB7CiAJCQl3cmIgPSBxdWV1ZV9nZXRfd3JiKG1jY3EsIHdyYl9udW0pOwogCQkJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOwpAQCAtNDQyLDc1ICs0NDYsNiBAQAogfQogCiAvKioKLSAqIGJlaXNjc2lfb3Blbl9jb25uIC0gQXNrIEZXIHRvIG9wZW4gYSBUQ1AgY29ubmVjdGlvbgotICogQGVwOgllbmRwb2ludCB0byBiZSB1c2VkCi0gKiBAc3JjX2FkZHI6IFRoZSBzb3VyY2UgSVAgYWRkcmVzcwotICogQGRzdF9hZGRyOiBUaGUgRGVzdGluYXRpb24gIElQIGFkZHJlc3MKLSAqCi0gKiBBc2tzIHRoZSBGVyB0byBvcGVuIGEgVENQIGNvbm5lY3Rpb24KLSAqLwotc3RhdGljIGludCBiZWlzY3NpX29wZW5fY29ubihzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLAotCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLAotCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLCBpbnQgbm9uX2Jsb2NraW5nKQotewotCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7Ci0Jc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gYmVpc2NzaV9lcC0+cGhiYTsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwotCXN0cnVjdCB0Y3BfY29ubmVjdF9hbmRfb2ZmbG9hZF9vdXQgKnB0Y3BjbmN0X291dDsKLQl1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIGV4dGRfc3RhdHVzOwotCXVuc2lnbmVkIGludCB0YWcsIHdyYl9udW07Ci0JaW50IHJldCA9IC0xOwotCi0JU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9vcGVuX2Nvbm5cbiIpOwotCWJlaXNjc2lfZXAtPmVwX2NpZCA9IGJlaXNjc2lfZ2V0X2NpZChwaGJhKTsKLQlpZiAoYmVpc2NzaV9lcC0+ZXBfY2lkID09IDB4RkZGRikgewotCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJObyBmcmVlIGNpZCBhdmFpbGFibGVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX29wZW5fY29ubiwgZXBfY2lkPSVkICIsCi0JCSBiZWlzY3NpX2VwLT5lcF9jaWQpOwotCXBoYmEtPmVwX2FycmF5W2JlaXNjc2lfZXAtPmVwX2NpZCAtCi0JCSAgICAgICBwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX3N0YXJ0XSA9IGVwOwotCWlmIChiZWlzY3NpX2VwLT5lcF9jaWQgPiAocGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9zdGFydCArCi0JCQkJICBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybCAqIDIpKSB7Ci0JCVNFX0RFQlVHKERCR19MVkxfMSwgIkZhaWxlZCBpbiBhbGxvY2F0ZSBpc2NzaSBjaWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWJlaXNjc2lfZXAtPmNpZF92bGQgPSAwOwotCXRhZyA9IG1nbXRfb3Blbl9jb25uZWN0aW9uKHBoYmEsIGRzdF9hZGRyLCBiZWlzY3NpX2VwKTsKLQlpZiAoIXRhZykgewotCQlTRV9ERUJVRyhEQkdfTFZMXzEsCi0JCQkgIm1nbXRfb3Blbl9jb25uZWN0aW9uIEZhaWxlZCBmb3IgY2lkPSVkIFxuIiwKLQkJCSBiZWlzY3NpX2VwLT5lcF9jaWQpOwotCX0gZWxzZSB7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwaGJhLT5jdHJsLm1jY193YWl0W3RhZ10sCi0JCQkJCSBwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSk7Ci0JfQotCXdyYl9udW0gPSAocGhiYS0+Y3RybC5tY2NfbnVtdGFnW3RhZ10gJiAweDAwRkYwMDAwKSA+PiAxNjsKLQlleHRkX3N0YXR1cyA9IChwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSAmIDB4MDAwMEZGMDApID4+IDg7Ci0Jc3RhdHVzID0gcGhiYS0+Y3RybC5tY2NfbnVtdGFnW3RhZ10gJiAweDAwMDAwMEZGOwotCWlmIChzdGF0dXMgfHwgZXh0ZF9zdGF0dXMpIHsKLQkJU0VfREVCVUcoREJHX0xWTF8xLCAibWdtdF9vcGVuX2Nvbm5lY3Rpb24gRmFpbGVkIgotCQkJCSAgICAiIHN0YXR1cyA9ICVkIGV4dGRfc3RhdHVzID0gJWQgXG4iLAotCQkJCSAgICBzdGF0dXMsIGV4dGRfc3RhdHVzKTsKLQkJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJd3JiID0gcXVldWVfZ2V0X3dyYihtY2NxLCB3cmJfbnVtKTsKLQkJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOwotCi0JCXB0Y3BjbmN0X291dCA9IAllbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0JCWJlaXNjc2lfZXAgPSBlcC0+ZGRfZGF0YTsKLQkJYmVpc2NzaV9lcC0+ZndfaGFuZGxlID0gcHRjcGNuY3Rfb3V0LT5jb25uZWN0aW9uX2hhbmRsZTsKLQkJYmVpc2NzaV9lcC0+Y2lkX3ZsZCA9IDE7Ci0JCVNFX0RFQlVHKERCR19MVkxfOCwgIm1nbXRfb3Blbl9jb25uZWN0aW9uIFN1Y2Nlc3NcbiIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiBiZWlzY3NpX3B1dF9jaWQgLSBGcmVlIHRoZSBjaWQKICAqIEBwaGJhOiBUaGUgcGhiYSBmb3Igd2hpY2ggdGhlIGNpZCBpcyBiZWluZyBmcmVlZAogICogQGNpZDogVGhlIGNpZCB0byBmcmVlCkBAIC01MzYsNiArNDcxLDEwMyBAQAogfQogCiAvKioKKyAqIGJlaXNjc2lfb3Blbl9jb25uIC0gQXNrIEZXIHRvIG9wZW4gYSBUQ1AgY29ubmVjdGlvbgorICogQGVwOgllbmRwb2ludCB0byBiZSB1c2VkCisgKiBAc3JjX2FkZHI6IFRoZSBzb3VyY2UgSVAgYWRkcmVzcworICogQGRzdF9hZGRyOiBUaGUgRGVzdGluYXRpb24gIElQIGFkZHJlc3MKKyAqCisgKiBBc2tzIHRoZSBGVyB0byBvcGVuIGEgVENQIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIGludCBiZWlzY3NpX29wZW5fY29ubihzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLAorCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLAorCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLCBpbnQgbm9uX2Jsb2NraW5nKQoreworCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gYmVpc2NzaV9lcC0+cGhiYTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCXN0cnVjdCB0Y3BfY29ubmVjdF9hbmRfb2ZmbG9hZF9vdXQgKnB0Y3BjbmN0X291dDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIGV4dGRfc3RhdHVzOworCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CisJdW5zaWduZWQgaW50IHRhZywgd3JiX251bTsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfb3Blbl9jb25uXG4iKTsKKwliZWlzY3NpX2VwLT5lcF9jaWQgPSBiZWlzY3NpX2dldF9jaWQocGhiYSk7CisJaWYgKGJlaXNjc2lfZXAtPmVwX2NpZCA9PSAweEZGRkYpIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiTm8gZnJlZSBjaWQgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9vcGVuX2Nvbm4sIGVwX2NpZD0lZFxuIiwKKwkJIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJcGhiYS0+ZXBfYXJyYXlbYmVpc2NzaV9lcC0+ZXBfY2lkIC0KKwkJICAgICAgIHBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaWRfc3RhcnRdID0gZXA7CisJaWYgKGJlaXNjc2lfZXAtPmVwX2NpZCA+IChwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX3N0YXJ0ICsKKwkJCQkgIHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsICogMikpIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiRmFpbGVkIGluIGFsbG9jYXRlIGlzY3NpIGNpZFxuIik7CisJCWJlaXNjc2lfcHV0X2NpZChwaGJhLCBiZWlzY3NpX2VwLT5lcF9jaWQpOworCQlnb3RvIGZyZWVfZXA7CisJfQorCisJYmVpc2NzaV9lcC0+Y2lkX3ZsZCA9IDA7CisJbm9uZW1iX2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwKKwkJCQlzaXplb2Yoc3RydWN0IHRjcF9jb25uZWN0X2FuZF9vZmZsb2FkX2luKSwKKwkJCQkmbm9uZW1iX2NtZC5kbWEpOworCWlmIChub25lbWJfY21kLnZhID09IE5VTEwpIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtZ210X29wZW5fY29ubmVjdGlvbiIKKwkJCSAiXG4iKTsKKwkJYmVpc2NzaV9wdXRfY2lkKHBoYmEsIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlub25lbWJfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IHRjcF9jb25uZWN0X2FuZF9vZmZsb2FkX2luKTsKKwltZW1zZXQobm9uZW1iX2NtZC52YSwgMCwgbm9uZW1iX2NtZC5zaXplKTsKKwl0YWcgPSBtZ210X29wZW5fY29ubmVjdGlvbihwaGJhLCBkc3RfYWRkciwgYmVpc2NzaV9lcCwgJm5vbmVtYl9jbWQpOworCWlmICghdGFnKSB7CisJCVNFX0RFQlVHKERCR19MVkxfMSwKKwkJCSAibWdtdF9vcGVuX2Nvbm5lY3Rpb24gRmFpbGVkIGZvciBjaWQ9JWRcbiIsCisJCQkgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKKwkJYmVpc2NzaV9wdXRfY2lkKHBoYmEsIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCisJCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBoYmEtPmN0cmwubWNjX3dhaXRbdGFnXSwKKwkJCQkJIHBoYmEtPmN0cmwubWNjX251bXRhZ1t0YWddKTsKKwl9CisJd3JiX251bSA9IChwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSAmIDB4MDBGRjAwMDApID4+IDE2OworCWV4dGRfc3RhdHVzID0gKHBoYmEtPmN0cmwubWNjX251bXRhZ1t0YWddICYgMHgwMDAwRkYwMCkgPj4gODsKKwlzdGF0dXMgPSBwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSAmIDB4MDAwMDAwRkY7CisJaWYgKHN0YXR1cyB8fCBleHRkX3N0YXR1cykgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJtZ210X29wZW5fY29ubmVjdGlvbiBGYWlsZWQiCisJCQkJICAgICIgc3RhdHVzID0gJWQgZXh0ZF9zdGF0dXMgPSAlZFxuIiwKKwkJCQkgICAgc3RhdHVzLCBleHRkX3N0YXR1cyk7CisJCWJlaXNjc2lfcHV0X2NpZChwaGJhLCBiZWlzY3NpX2VwLT5lcF9jaWQpOworCQlmcmVlX21jY190YWcoJnBoYmEtPmN0cmwsIHRhZyk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCisJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCQlnb3RvIGZyZWVfZXA7CisJfSBlbHNlIHsKKwkJd3JiID0gcXVldWVfZ2V0X3dyYihtY2NxLCB3cmJfbnVtKTsKKwkJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOworCisJCXB0Y3BjbmN0X291dCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwkJYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOworCQliZWlzY3NpX2VwLT5md19oYW5kbGUgPSBwdGNwY25jdF9vdXQtPmNvbm5lY3Rpb25faGFuZGxlOworCQliZWlzY3NpX2VwLT5jaWRfdmxkID0gMTsKKwkJU0VfREVCVUcoREJHX0xWTF84LCAibWdtdF9vcGVuX2Nvbm5lY3Rpb24gU3VjY2Vzc1xuIik7CisJfQorCWJlaXNjc2lfcHV0X2NpZChwaGJhLCBiZWlzY3NpX2VwLT5lcF9jaWQpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCisJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCXJldHVybiAwOworCitmcmVlX2VwOgorCWJlaXNjc2lfZnJlZV9lcChiZWlzY3NpX2VwKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKioKICAqIGJlaXNjc2lfZXBfY29ubmVjdCAtIEFzayBjaGlwIHRvIGNyZWF0ZSBUQ1AgQ29ubgogICogQHNjc2lfaG9zdDogUG9pbnRlciB0byBzY3NpX2hvc3Qgc3RydWN0dXJlCiAgKiBAZHN0X2FkZHI6IFRoZSBJUCBhZGRyZXNzIG9mIFRhcmdldApAQCAtNTUyLDE4ICs1ODQsMTggQEAKIAlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwOwogCWludCByZXQ7CiAKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2VwX2Nvbm5lY3QgXG4iKTsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2VwX2Nvbm5lY3RcbiIpOwogCWlmIChzaG9zdCkKIAkJcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiAJZWxzZSB7CiAJCXJldCA9IC1FTlhJTzsKLQkJU0VfREVCVUcoREJHX0xWTF8xLCAic2hvc3QgaXMgTlVMTCBcbiIpOworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJzaG9zdCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAKIAlpZiAocGhiYS0+c3RhdGUgIT0gQkVfQURBUFRFUl9VUCkgewogCQlyZXQgPSAtRUJVU1k7Ci0JCVNFX0RFQlVHKERCR19MVkxfMSwgIlRoZSBBZGFwdGVyIHN0YXRlIGlzIE5vdCBVUCBcbiIpOworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJUaGUgQWRhcHRlciBzdGF0ZSBpcyBOb3QgVVBcbiIpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIApAQCAtNTc2LDE2ICs2MDgsMTYgQEAKIAliZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CiAJYmVpc2NzaV9lcC0+cGhiYSA9IHBoYmE7CiAJYmVpc2NzaV9lcC0+b3BlbmlzY3NpX2VwID0gZXA7Ci0JaWYgKGJlaXNjc2lfb3Blbl9jb25uKGVwLCBOVUxMLCBkc3RfYWRkciwgbm9uX2Jsb2NraW5nKSkgewotCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJGYWlsZWQgaW4gYmVpc2NzaV9vcGVuX2Nvbm4gXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZXQgPSBiZWlzY3NpX29wZW5fY29ubihlcCwgTlVMTCwgZHN0X2FkZHIsIG5vbl9ibG9ja2luZyk7CisJaWYgKHJldCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJGYWlsZWQgaW4gYmVpc2NzaV9vcGVuX2Nvbm5cbiIpOwogCQlnb3RvIGZyZWVfZXA7CiAJfQogCiAJcmV0dXJuIGVwOwogCiBmcmVlX2VwOgotCWJlaXNjc2lfZnJlZV9lcChiZWlzY3NpX2VwKTsKKwlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGVwKTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCkBAIC02MjAsOSArNjUyLDkgQEAKIAogCXRhZyA9IG1nbXRfdXBsb2FkX2Nvbm5lY3Rpb24ocGhiYSwgYmVpc2NzaV9lcC0+ZXBfY2lkLCBmbGFnKTsKIAlpZiAoIXRhZykgewotCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJ1cGxvYWQgZmFpbGVkIGZvciBjaWQgMHgleCIsCisJCVNFX0RFQlVHKERCR19MVkxfOCwgInVwbG9hZCBmYWlsZWQgZm9yIGNpZCAweCV4XG4iLAogCQkJIGJlaXNjc2lfZXAtPmVwX2NpZCk7Ci0JCXJldCA9IC0xOworCQlyZXQgPSAtRUFHQUlOOwogCX0gZWxzZSB7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwaGJhLT5jdHJsLm1jY193YWl0W3RhZ10sCiAJCQkJCSBwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSk7CkBAIC02MzIsMzAgKzY2NCw2IEBACiB9CiAKIC8qKgotICogYmVpc2NzaV9lcF9kaXNjb25uZWN0IC0gVGVhcnMgZG93biB0aGUgVENQIGNvbm5lY3Rpb24KLSAqIEBlcDoJZW5kcG9pbnQgdG8gYmUgdXNlZAotICoKLSAqIFRlYXJzIGRvd24gdGhlIFRDUCBjb25uZWN0aW9uCi0gKi8KLXZvaWQgYmVpc2NzaV9lcF9kaXNjb25uZWN0KHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXApCi17Ci0Jc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uOwotCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwOwotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKLQotCWJlaXNjc2lfZXAgPSBlcC0+ZGRfZGF0YTsKLQlwaGJhID0gYmVpc2NzaV9lcC0+cGhiYTsKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2VwX2Rpc2Nvbm5lY3QgZm9yIGVwX2NpZCA9ICVkXG4iLAotCQkJICAgICBiZWlzY3NpX2VwLT5lcF9jaWQpOwotCi0JaWYgKGJlaXNjc2lfZXAtPmNvbm4pIHsKLQkJYmVpc2NzaV9jb25uID0gYmVpc2NzaV9lcC0+Y29ubjsKLQkJaXNjc2lfc3VzcGVuZF9xdWV1ZShiZWlzY3NpX2Nvbm4tPmNvbm4pOwotCX0KLQotfQotCi0vKioKICAqIGJlaXNjc2lfdW5iaW5kX2Nvbm5fdG9fY2lkIC0gVW5iaW5kIHRoZSBiZWlzY3NpX2Nvbm4gZnJvbSBwaGJhIGNvbm4gdGFibGUKICAqIEBwaGJhOiBUaGUgcGhiYSBpbnN0YW5jZQogICogQGNpZDogVGhlIGNpZCB0byBmcmVlCkBAIC02NjYsNTAgKzY3NCw1NyBAQAogCWlmIChwaGJhLT5jb25uX3RhYmxlW2NpZF0pCiAJCXBoYmEtPmNvbm5fdGFibGVbY2lkXSA9IE5VTEw7CiAJZWxzZSB7Ci0JCVNFX0RFQlVHKERCR19MVkxfOCwgIkNvbm5lY3Rpb24gdGFibGUgTm90IG9jY3VwaWVkLiBcbiIpOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJDb25uZWN0aW9uIHRhYmxlIE5vdCBvY2N1cGllZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogYmVpc2NzaV9jb25uX3N0b3AgLSBJbnZhbGlkYXRlIGFuZCBzdG9wIHRoZSBjb25uZWN0aW9uCi0gKiBAY2xzX2Nvbm46IHBvaW50ZXIgdG8gZ2V0IGlzY3NpX2Nvbm4KLSAqIEBmbGFnOiBUaGUgdHlwZSBvZiBjb25uZWN0aW9uIGNsb3N1cmUKKyAqIGJlaXNjc2lfZXBfZGlzY29ubmVjdCAtIFRlYXJzIGRvd24gdGhlIFRDUCBjb25uZWN0aW9uCisgKiBAZXA6CWVuZHBvaW50IHRvIGJlIHVzZWQKKyAqCisgKiBUZWFycyBkb3duIHRoZSBUQ1AgY29ubmVjdGlvbgogICovCi12b2lkIGJlaXNjc2lfY29ubl9zdG9wKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIGludCBmbGFnKQordm9pZCBiZWlzY3NpX2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCkKIHsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwotCXN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uOwogCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbi0+Y2xzX3Nlc3Npb24pOwotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOwogCXVuc2lnbmVkIGludCB0YWc7CiAJdW5zaWduZWQgc2hvcnQgc2F2ZWNmZ19mbGFnID0gQ01EX0lTQ1NJX1NFU1NJT05fU0FWRV9DRkdfT05fRkxBU0g7CiAKLQliZWlzY3NpX2VwID0gYmVpc2NzaV9jb25uLT5lcDsKLQlpZiAoIWJlaXNjc2lfZXApIHsKLQkJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9jb25uX3N0b3AgLCBubyBiZWlzY3NpX2VwXG4iKTsKKwliZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisJcGhiYSA9IGJlaXNjc2lfZXAtPnBoYmE7CisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9lcF9kaXNjb25uZWN0IGZvciBlcF9jaWQgPSAlZFxuIiwKKwkJCSAgICAgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKKworCWlmICghYmVpc2NzaV9lcC0+Y29ubikgeworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2VwX2Rpc2Nvbm5lY3QsIG5vICIKKwkJCSAiYmVpc2NzaV9lcFxuIik7CiAJCXJldHVybjsKIAl9Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9jb25uX3N0b3AgIGVwX2NpZCA9ICVkXG4iLAotCQkJICAgICBiZWlzY3NpX2VwLT5lcF9jaWQpOworCWJlaXNjc2lfY29ubiA9IGJlaXNjc2lfZXAtPmNvbm47CisJaXNjc2lfc3VzcGVuZF9xdWV1ZShiZWlzY3NpX2Nvbm4tPmNvbm4pOworCisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9lcF9kaXNjb25uZWN0IGVwX2NpZCA9ICVkXG4iLAorCQkgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKKwogCXRhZyA9IG1nbXRfaW52YWxpZGF0ZV9jb25uZWN0aW9uKHBoYmEsIGJlaXNjc2lfZXAsCiAJCQkJCSAgICBiZWlzY3NpX2VwLT5lcF9jaWQsIDEsCiAJCQkJCSAgICBzYXZlY2ZnX2ZsYWcpOwogCWlmICghdGFnKSB7CiAJCVNFX0RFQlVHKERCR19MVkxfMSwKLQkJCSAibWdtdF9pbnZhbGlkYXRlX2Nvbm5lY3Rpb24gRmFpbGVkIGZvciBjaWQ9JWQgXG4iLAorCQkJICJtZ210X2ludmFsaWRhdGVfY29ubmVjdGlvbiBGYWlsZWQgZm9yIGNpZD0lZFxuIiwKIAkJCSAgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKIAl9IGVsc2UgewogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGhiYS0+Y3RybC5tY2Nfd2FpdFt0YWddLAogCQkJCQkgcGhiYS0+Y3RybC5tY2NfbnVtdGFnW3RhZ10pOwogCQlmcmVlX21jY190YWcoJnBoYmEtPmN0cmwsIHRhZyk7CiAJfQorCiAJYmVpc2NzaV9jbG9zZV9jb25uKGJlaXNjc2lfZXAsIENPTk5FQ1RJT05fVVBMT0FEX0dSQUNFRlVMKTsKIAliZWlzY3NpX2ZyZWVfZXAoYmVpc2NzaV9lcCk7Ci0JaXNjc2lfZGVzdHJveV9lbmRwb2ludChiZWlzY3NpX2VwLT5vcGVuaXNjc2lfZXApOwogCWJlaXNjc2lfdW5iaW5kX2Nvbm5fdG9fY2lkKHBoYmEsIGJlaXNjc2lfZXAtPmVwX2NpZCk7Ci0JaXNjc2lfY29ubl9zdG9wKGNsc19jb25uLCBmbGFnKTsKKwlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGJlaXNjc2lfZXAtPm9wZW5pc2NzaV9lcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCmluZGV4IDFmNTEyYzIuLjg3MGNkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCkBAIC01OSw4ICs1OSw2IEBACiAKIGludCBiZWlzY3NpX2Nvbm5fc3RhcnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubik7CiAKLXZvaWQgYmVpc2NzaV9jb25uX3N0b3Aoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwgaW50IGZsYWcpOwotCiBzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXBfY29ubmVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCQkJICBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLAogCQkJCQkgIGludCBub25fYmxvY2tpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKaW5kZXggZGQ1YjEwNS4uNzQzNmM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCkBAIC00MSw2ICs0MSw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGJlX2lvcG9sbF9idWRnZXQgPSAxMDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmVfbWF4X3BoeXNfc2l6ZSA9IDY0Owogc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfbXNpeCA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGdjcmFzaG1vZGUgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBudW1faGJhID0gMDsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJlaXNjc2lfcGNpX2lkX3RhYmxlKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyAiICIgQlVJTERfU1RSKTsKQEAgLTY5LDYgKzcxLDcgQEAKIAlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb247CiAJc3RydWN0IGludmFsaWRhdGVfY29tbWFuZF90YWJsZSAqaW52X3RibDsKKwlzdHJ1Y3QgYmVfZG1hX21lbSBub25lbWJfY21kOwogCXVuc2lnbmVkIGludCBjaWQsIHRhZywgbnVtX2ludmFsaWRhdGU7CiAKIAljbHNfc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CkBAIC05OSwxOCArMTAyLDM0IEBACiAJaW52X3RibC0+Y2lkID0gY2lkOwogCWludl90YmwtPmljZCA9IGFib3J0ZWRfaW9fdGFzay0+cHNnbF9oYW5kbGUtPnNnbF9pbmRleDsKIAludW1faW52YWxpZGF0ZSA9IDE7Ci0JdGFnID0gbWdtdF9pbnZhbGlkYXRlX2ljZHMocGhiYSwgaW52X3RibCwgbnVtX2ludmFsaWRhdGUsIGNpZCk7CisJbm9uZW1iX2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwKKwkJCQlzaXplb2Yoc3RydWN0IGludmFsaWRhdGVfY29tbWFuZHNfcGFyYW1zX2luKSwKKwkJCQkmbm9uZW1iX2NtZC5kbWEpOworCWlmIChub25lbWJfY21kLnZhID09IE5VTEwpIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKKwkJCSAibWdtdF9pbnZhbGlkYXRlX2ljZHNcbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlub25lbWJfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGludmFsaWRhdGVfY29tbWFuZHNfcGFyYW1zX2luKTsKKworCXRhZyA9IG1nbXRfaW52YWxpZGF0ZV9pY2RzKHBoYmEsIGludl90YmwsIG51bV9pbnZhbGlkYXRlLAorCQkJCSAgIGNpZCwgJm5vbmVtYl9jbWQpOwogCWlmICghdGFnKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAogCQkJICAgICAibWdtdF9pbnZhbGlkYXRlX2ljZHMgY291bGQgbm90IGJlIgogCQkJICAgICAiIHN1Ym1pdHRlZFxuIik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCisJCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwogCQlyZXR1cm4gRkFJTEVEOwogCX0gZWxzZSB7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwaGJhLT5jdHJsLm1jY193YWl0W3RhZ10sCiAJCQkJCSBwaGJhLT5jdHJsLm1jY19udW10YWdbdGFnXSk7CiAJCWZyZWVfbWNjX3RhZygmcGhiYS0+Y3RybCwgdGFnKTsKIAl9Ci0KKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKIAlyZXR1cm4gaXNjc2lfZWhfYWJvcnQoc2MpOwogfQogCkBAIC0xMjQsNiArMTQzLDcgQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uOwogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgKmludl90Ymw7CisJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAl1bnNpZ25lZCBpbnQgY2lkLCB0YWcsIGksIG51bV9pbnZhbGlkYXRlOwogCWludCByYyA9IEZBSUxFRDsKIApAQCAtMTU4LDE4ICsxNzgsMzMgQEAKIAlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJaW52X3RibCA9IHBoYmEtPmludl90Ymw7CiAKLQl0YWcgPSBtZ210X2ludmFsaWRhdGVfaWNkcyhwaGJhLCBpbnZfdGJsLCBudW1faW52YWxpZGF0ZSwgY2lkKTsKKwlub25lbWJfY21kLnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4pLAorCQkJCSZub25lbWJfY21kLmRtYSk7CisJaWYgKG5vbmVtYl9jbWQudmEgPT0gTlVMTCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgorCQkJICJtZ210X2ludmFsaWRhdGVfaWNkc1xuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCW5vbmVtYl9jbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4pOworCW1lbXNldChub25lbWJfY21kLnZhLCAwLCBub25lbWJfY21kLnNpemUpOworCXRhZyA9IG1nbXRfaW52YWxpZGF0ZV9pY2RzKHBoYmEsIGludl90YmwsIG51bV9pbnZhbGlkYXRlLAorCQkJCSAgIGNpZCwgJm5vbmVtYl9jbWQpOwogCWlmICghdGFnKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAogCQkJICAgICAibWdtdF9pbnZhbGlkYXRlX2ljZHMgY291bGQgbm90IGJlIgogCQkJICAgICAiIHN1Ym1pdHRlZFxuIik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCisJCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9IGVsc2UgewogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGhiYS0+Y3RybC5tY2Nfd2FpdFt0YWddLAogCQkJCQkgcGhiYS0+Y3RybC5tY2NfbnVtdGFnW3RhZ10pOwogCQlmcmVlX21jY190YWcoJnBoYmEtPmN0cmwsIHRhZyk7CiAJfQotCisJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKKwkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CiAJcmV0dXJuIGlzY3NpX2VoX2RldmljZV9yZXNldChzYyk7CiB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwpAQCAtMjE2LDcgKzI1MSw3IEBACiAJc2hvc3QgPSBpc2NzaV9ob3N0X2FsbG9jKCZiZWlzY3NpX3NodCwgc2l6ZW9mKCpwaGJhKSwgMCk7CiAJaWYgKCFzaG9zdCkgewogCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfaGJhX2FsbG9jIC0iCi0JCQkiaXNjc2lfaG9zdF9hbGxvYyBmYWlsZWQgXG4iKTsKKwkJCSJpc2NzaV9ob3N0X2FsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzaG9zdC0+ZG1hX2JvdW5kYXJ5ID0gcGNpZGV2LT5kbWFfbWFzazsKQEAgLTM3MSw3ICs0MDYsNyBAQAogCQkJCSAgICArIEJFMl9UTUZTKSAvIDUxMikgKyAxKSAqIDUxMjsKIAlwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXMgPSAocGhiYS0+cGFyYW1zLm51bV9lcV9lbnRyaWVzIDwgMTAyNCkKIAkJCQk/IDEwMjQgOiBwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXM7Ci0JU0VfREVCVUcoREJHX0xWTF84LCAicGhiYS0+cGFyYW1zLm51bV9lcV9lbnRyaWVzPSVkIFxuIiwKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXM9JWRcbiIsCiAJCQkgICAgIHBoYmEtPnBhcmFtcy5udW1fZXFfZW50cmllcyk7CiAJcGhiYS0+cGFyYW1zLm51bV9jcV9lbnRyaWVzID0KIAkgICAgKCgoQkUyX0NNRFNfUEVSX0NYTiAqIDIgKyAgcGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9jb3VudCAqIDIKQEAgLTYxNiw3ICs2NTEsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBwaGJhLT5wY2lkZXY7CiAJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwogCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKLQlpbnQgcmV0LCBtc2l4X3ZlYywgaSA9IDA7CisJaW50IHJldCwgbXNpeF92ZWMsIGksIGo7CiAJY2hhciBkZXNjWzMyXTsKIAogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwpAQCAtNjI4LDEwICs2NjMsMjUgQEAKIAkJCW1zaXhfdmVjID0gcGhiYS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKIAkJCXJldCA9IHJlcXVlc3RfaXJxKG1zaXhfdmVjLCBiZV9pc3JfbXNpeCwgMCwgZGVzYywKIAkJCQkJICAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXSk7CisJCQlpZiAocmV0KSB7CisJCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCQkJICAgICAiYmVpc2NzaV9pbml0X2lycXMtRmFpbGVkIHRvIgorCQkJCQkgICAgICJyZWdpc3RlciBtc2l4IGZvciBpID0gJWRcbiIsIGkpOworCQkJCWlmICghaSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGZyZWVfbXNpeF9pcnFzOworCQkJfQogCQl9CiAJCW1zaXhfdmVjID0gcGhiYS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKIAkJcmV0ID0gcmVxdWVzdF9pcnEobXNpeF92ZWMsIGJlX2lzcl9tY2MsIDAsICJiZWlzY3NpX21zaXhfbWNjIiwKIAkJCQkgICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKKwkJaWYgKHJldCkgeworCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfaW5pdF9pcnFzLSIKKwkJCQkgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgYmVpc2NzaV9tc2l4X21jY1xuIik7CisJCQlpKys7CisJCQlnb3RvIGZyZWVfbXNpeF9pcnFzOworCQl9CisKIAl9IGVsc2UgewogCQlyZXQgPSByZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgYmVfaXNyLCBJUlFGX1NIQVJFRCwKIAkJCQkgICJiZWlzY3NpIiwgcGhiYSk7CkBAIC02NDIsNiArNjkyLDEwIEBACiAJCX0KIAl9CiAJcmV0dXJuIDA7CitmcmVlX21zaXhfaXJxczoKKwlmb3IgKGogPSBpIC0gMTsgaiA9PSAwOyBqKyspCisJCWZyZWVfaXJxKG1zaXhfdmVjLCAmcGh3aV9jb250ZXh0LT5iZV9lcVtqXSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgaHdpX3JpbmdfY3FfZGIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLApAQCAtNjkyLDcgKzc0Niw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAotCQkJICAgICAiVW5yZWNvZ25pemVkIG9wY29kZSAweCV4IGluIGFzeW5jIG1zZyBcbiIsCisJCQkgICAgICJVbnJlY29nbml6ZWQgb3Bjb2RlIDB4JXggaW4gYXN5bmMgbXNnXG4iLAogCQkJICAgICAocHBkdS0+CiAJCQkgICAgIGR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3BkdV9iYXNlLCBvcGNvZGUpIC8gMzJdCiAJCQkJCQkmIFBEVUJBU0VfT1BDT0RFX01BU0spKTsKQEAgLTcxMSw3ICs3NjUsNyBAQAogCiAJaWYgKHBoYmEtPmlvX3NnbF9obmRsX2F2YmwpIHsKIAkJU0VfREVCVUcoREJHX0xWTF84LAotCQkJICJJbiBhbGxvY19pb19zZ2xfaGFuZGxlLGlvX3NnbF9hbGxvY19pbmRleD0lZCBcbiIsCisJCQkgIkluIGFsbG9jX2lvX3NnbF9oYW5kbGUsaW9fc2dsX2FsbG9jX2luZGV4PSVkXG4iLAogCQkJIHBoYmEtPmlvX3NnbF9hbGxvY19pbmRleCk7CiAJCXBzZ2xfaGFuZGxlID0gcGhiYS0+aW9fc2dsX2huZGxfYmFzZVtwaGJhLT4KIAkJCQkJCWlvX3NnbF9hbGxvY19pbmRleF07CkBAIC03MzAsNyArNzg0LDcgQEAKIHN0YXRpYyB2b2lkCiBmcmVlX2lvX3NnbF9oYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3Qgc2dsX2hhbmRsZSAqcHNnbF9oYW5kbGUpCiB7Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiSW4gZnJlZV8saW9fc2dsX2ZyZWVfaW5kZXg9JWQgXG4iLAorCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGZyZWVfLGlvX3NnbF9mcmVlX2luZGV4PSVkXG4iLAogCQkgcGhiYS0+aW9fc2dsX2ZyZWVfaW5kZXgpOwogCWlmIChwaGJhLT5pb19zZ2xfaG5kbF9iYXNlW3BoYmEtPmlvX3NnbF9mcmVlX2luZGV4XSkgewogCQkvKgpAQCAtNzM5LDcgKzc5Myw3IEBACiAJCSAqLwogCQkgU0VfREVCVUcoREJHX0xWTF84LAogCQkJICJEb3VibGUgRnJlZSBpbiBJTyBTR0wgaW9fc2dsX2ZyZWVfaW5kZXg9JWQsIgotCQkJICJ2YWx1ZSB0aGVyZT0lcCBcbiIsIHBoYmEtPmlvX3NnbF9mcmVlX2luZGV4LAorCQkJICJ2YWx1ZSB0aGVyZT0lcFxuIiwgcGhiYS0+aW9fc2dsX2ZyZWVfaW5kZXgsCiAJCQkgcGhiYS0+aW9fc2dsX2huZGxfYmFzZVtwaGJhLT5pb19zZ2xfZnJlZV9pbmRleF0pOwogCQlyZXR1cm47CiAJfQpAQCAtODA0LDcgKzg1OCw3IEBACiAKIAlTRV9ERUJVRyhEQkdfTFZMXzgsCiAJCSAiRlJFRSBXUkI6IHB3cmJfaGFuZGxlPSVwIGZyZWVfaW5kZXg9MHgleCIKLQkJICJ3cmJfaGFuZGxlc19hdmFpbGFibGU9JWQgXG4iLAorCQkgIndyYl9oYW5kbGVzX2F2YWlsYWJsZT0lZFxuIiwKIAkJIHB3cmJfaGFuZGxlLCBwd3JiX2NvbnRleHQtPmZyZWVfaW5kZXgsCiAJCSBwd3JiX2NvbnRleHQtPndyYl9oYW5kbGVzX2F2YWlsYWJsZSk7CiB9CkBAIC04MTYsNyArODcwLDcgQEAKIAlpZiAocGhiYS0+ZWhfc2dsX2huZGxfYXZibCkgewogCQlwc2dsX2hhbmRsZSA9IHBoYmEtPmVoX3NnbF9obmRsX2Jhc2VbcGhiYS0+ZWhfc2dsX2FsbG9jX2luZGV4XTsKIAkJcGhiYS0+ZWhfc2dsX2huZGxfYmFzZVtwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXhdID0gTlVMTDsKLQkJU0VfREVCVUcoREJHX0xWTF84LCAibWdtdF9zZ2xfYWxsb2NfaW5kZXg9JWQ9MHgleCBcbiIsCisJCVNFX0RFQlVHKERCR19MVkxfOCwgIm1nbXRfc2dsX2FsbG9jX2luZGV4PSVkPTB4JXhcbiIsCiAJCQkgcGhiYS0+ZWhfc2dsX2FsbG9jX2luZGV4LCBwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXgpOwogCQlwaGJhLT5laF9zZ2xfaG5kbF9hdmJsLS07CiAJCWlmIChwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXggPT0KQEAgLTgzNCw3ICs4ODgsNyBAQAogZnJlZV9tZ210X3NnbF9oYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3Qgc2dsX2hhbmRsZSAqcHNnbF9oYW5kbGUpCiB7CiAKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiAgZnJlZV9tZ210X3NnbF9oYW5kbGUsZWhfc2dsX2ZyZWVfaW5kZXg9JWQgXG4iLAorCVNFX0RFQlVHKERCR19MVkxfOCwgIkluICBmcmVlX21nbXRfc2dsX2hhbmRsZSxlaF9zZ2xfZnJlZV9pbmRleD0lZFxuIiwKIAkJCSAgICAgcGhiYS0+ZWhfc2dsX2ZyZWVfaW5kZXgpOwogCWlmIChwaGJhLT5laF9zZ2xfaG5kbF9iYXNlW3BoYmEtPmVoX3NnbF9mcmVlX2luZGV4XSkgewogCQkvKgpAQCAtODQyLDcgKzg5Niw3IEBACiAJCSAqIGZhaWxlZCBpbiB4bWl0X3Rhc2sgb3IgYWxsb2NfcGR1LgogCQkgKi8KIAkJU0VfREVCVUcoREJHX0xWTF84LAotCQkJICJEb3VibGUgRnJlZSBpbiBlaCBTR0wgLGVoX3NnbF9mcmVlX2luZGV4PSVkIFxuIiwKKwkJCSAiRG91YmxlIEZyZWUgaW4gZWggU0dMICxlaF9zZ2xfZnJlZV9pbmRleD0lZFxuIiwKIAkJCSBwaGJhLT5laF9zZ2xfZnJlZV9pbmRleCk7CiAJCXJldHVybjsKIAl9CkBAIC0xMDgxLDcgKzExMzUsNyBAQAogCWNhc2UgSFdIX1RZUEVfTE9HSU46CiAJCVNFX0RFQlVHKERCR19MVkxfMSwKIAkJCSAiXHRcdCBObyBIV0hfVFlQRV9MT0dJTiBFeHBlY3RlZCBpbiBod2lfY29tcGxldGVfY21kIgotCQkJICItIFNvbGljaXRlZCBwYXRoIFxuIik7CisJCQkgIi0gU29saWNpdGVkIHBhdGhcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSFdIX1RZUEVfTk9QOgpAQCAtMTE2NCw3ICsxMjE4LDcgQEAKIAlkZWZhdWx0OgogCQlwYnVzeV9saXN0ID0gTlVMTDsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCi0JCQkiVW5leHBlY3RlZCBjb2RlPSVkIFxuIiwKKwkJCSJVbmV4cGVjdGVkIGNvZGU9JWRcbiIsCiAJCQkgcGRwZHVfY3FlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsCiAJCQkJCWNvZGUpIC8gMzJdICYgUERVQ1FFX0NPREVfTUFTSyk7CiAJCXJldHVybiBOVUxMOwpAQCAtMTU1Miw3ICsxNjA2LDcgQEAKIAkJCWVsc2UKIAkJCQlTRV9ERUJVRyhEQkdfTFZMXzEsCiAJCQkJCSIgVW5zdXBwb3J0ZWQgQXN5bmMgRXZlbnQsIGZsYWdzIgotCQkJCQkiID0gMHglMDh4IFxuIiwgbWNjX2NvbXBsLT5mbGFncyk7CisJCQkJCSIgPSAweCUwOHhcbiIsIG1jY19jb21wbC0+ZmxhZ3MpOwogCQl9IGVsc2UgaWYgKG1jY19jb21wbC0+ZmxhZ3MgJiBDUUVfRkxBR1NfQ09NUExFVEVEX01BU0spIHsKIAkJCWJlX21jY19jb21wbF9wcm9jZXNzX2lzcigmcGhiYS0+Y3RybCwgbWNjX2NvbXBsKTsKIAkJCWF0b21pY19kZWMoJnBoYmEtPmN0cmwubWNjX29iai5xLnVzZWQpOwpAQCAtMTYxMSw3ICsxNjY1LDcgQEAKIAkJCWh3aV9jb21wbGV0ZV9jbWQoYmVpc2NzaV9jb25uLCBwaGJhLCBzb2wpOwogCQkJYnJlYWs7CiAJCWNhc2UgRFJJVkVSTVNHX05PVElGWToKLQkJCVNFX0RFQlVHKERCR19MVkxfOCwgIlJlY2VpdmVkIERSSVZFUk1TR19OT1RJRlkgXG4iKTsKKwkJCVNFX0RFQlVHKERCR19MVkxfOCwgIlJlY2VpdmVkIERSSVZFUk1TR19OT1RJRllcbiIpOwogCQkJZG1zZyA9IChzdHJ1Y3QgZG1zZ19jcWUgKilzb2w7CiAJCQlod2lfY29tcGxldGVfZHJ2cl9tc2dzKGJlaXNjc2lfY29ubiwgcGhiYSwgc29sKTsKIAkJCWJyZWFrOwpAQCAtMTc4Miw5ICsxODM2LDkgQEAKIAkJCXNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOwogCQkJYWRkciA9ICh1NjQpIHNnX2RtYV9hZGRyZXNzKHNnKTsKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UwX2FkZHJfbG8sIHB3cmIsCi0JCQkJCQkJKGFkZHIgJiAweEZGRkZGRkZGKSk7CisJCQkJCQkoKHUzMikoYWRkciAmIDB4RkZGRkZGRkYpKSk7CiAJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9hZGRyX2hpLCBwd3JiLAotCQkJCQkJCShhZGRyID4+IDMyKSk7CisJCQkJCQkJKCh1MzIpKGFkZHIgPj4gMzIpKSk7CiAJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9sZW4sIHB3cmIsCiAJCQkJCQkJc2dfbGVuKTsKIAkJCXNnZV9sZW4gPSBzZ19sZW47CkBAIC0xNzk0LDkgKzE4NDgsOSBAQAogCQkJc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CiAJCQlhZGRyID0gKHU2NCkgc2dfZG1hX2FkZHJlc3Moc2cpOwogCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTFfYWRkcl9sbywgcHdyYiwKLQkJCQkJCQkoYWRkciAmIDB4RkZGRkZGRkYpKTsKKwkJCQkJCSgodTMyKShhZGRyICYgMHhGRkZGRkZGRikpKTsKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UxX2FkZHJfaGksIHB3cmIsCi0JCQkJCQkJKGFkZHIgPj4gMzIpKTsKKwkJCQkJCQkoKHUzMikoYWRkciA+PiAzMikpKTsKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UxX2xlbiwgcHdyYiwKIAkJCQkJCQlzZ19sZW4pOwogCQl9CkBAIC0xODcyLDkgKzE5MjYsOSBAQAogCQkJYWRkciA9IDA7CiAJCX0KIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTBfYWRkcl9sbywgcHdyYiwKLQkJCQkJCShhZGRyICYgMHhGRkZGRkZGRikpOworCQkJCQkJKCh1MzIpKGFkZHIgJiAweEZGRkZGRkZGKSkpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9hZGRyX2hpLCBwd3JiLAotCQkJCQkJKGFkZHIgPj4gMzIpKTsKKwkJCQkJCSgodTMyKShhZGRyID4+IDMyKSkpOwogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9sZW4sIHB3cmIsCiAJCQkJCQl0YXNrLT5kYXRhX2NvdW50KTsKIApAQCAtMTkwNCw5ICsxOTU4LDkgQEAKIAkJcHNnbCsrOwogCQlpZiAodGFzay0+ZGF0YSkgewogCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIGFkZHJfbG8sIHBzZ2wsCi0JCQkJCQkoYWRkciAmIDB4RkZGRkZGRkYpKTsKKwkJCQkJCSgodTMyKShhZGRyICYgMHhGRkZGRkZGRikpKTsKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBhZGRyX2hpLCBwc2dsLAotCQkJCQkJKGFkZHIgPj4gMzIpKTsKKwkJCQkJCSgodTMyKShhZGRyID4+IDMyKSkpOwogCQl9CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBsZW4sIHBzZ2wsIDB4MTA2KTsKIAl9CkBAIC0yMDU0LDcgKzIxMDgsOCBAQAogCQkJCQkgICAgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaiAtIDFdLnNpemUsCiAJCQkJCSAgICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0uCiAJCQkJCSAgICB2aXJ0dWFsX2FkZHJlc3MsCi0JCQkJCSAgICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0uCisJCQkJCSAgICAodW5zaWduZWQgbG9uZyltZW1fZGVzY3ItPgorCQkJCQkgICAgbWVtX2FycmF5W2ogLSAxXS4KIAkJCQkJICAgIGJ1c19hZGRyZXNzLnUuYTY0LmFkZHJlc3MpOwogCQl9CiAJCWlmIChpKSB7CkBAIC0yMjIzLDEwICsyMjc4LDEwIEBACiAJaWYgKG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcykgewogCQlTRV9ERUJVRyhEQkdfTFZMXzgsCiAJCQkgImh3aV9pbml0X2FzeW5jX3BkdV9jdHggSFdJX01FTV9BU1lOQ19IRUFERVJfQlVGIgotCQkJICJ2YT0lcCBcbiIsIG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcyk7CisJCQkgInZhPSVwXG4iLCBtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpOwogCX0gZWxzZQogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKLQkJCSAgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCQkJICAgICAiTm8gVmlydHVhbCBhZGRyZXNzXG4iKTsKIAogCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci52YV9iYXNlID0KIAkJCW1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzczsKQEAgLTIyMzksMTAgKzIyOTQsMTAgQEAKIAlpZiAobWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKSB7CiAJCVNFX0RFQlVHKERCR19MVkxfOCwKIAkJCSAiaHdpX2luaXRfYXN5bmNfcGR1X2N0eCBIV0lfTUVNX0FTWU5DX0hFQURFUl9SSU5HIgotCQkJICJ2YT0lcCBcbiIsIG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcyk7CisJCQkgInZhPSVwXG4iLCBtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpOwogCX0gZWxzZQogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKLQkJCSAgICAiTm8gVmlydHVhbCBhZGRyZXNzIFxuIik7CisJCQkgICAgIk5vIFZpcnR1YWwgYWRkcmVzc1xuIik7CiAJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLnJpbmdfYmFzZSA9CiAJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CiAKQEAgLTIyNTEsMTAgKzIzMDYsMTAgQEAKIAlpZiAobWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKSB7CiAJCVNFX0RFQlVHKERCR19MVkxfOCwKIAkJCSAiaHdpX2luaXRfYXN5bmNfcGR1X2N0eCBIV0lfTUVNX0FTWU5DX0hFQURFUl9IQU5ETEUiCi0JCQkgInZhPSVwIFxuIiwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKTsKKwkJCSAidmE9JXBcbiIsIG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcyk7CiAJfSBlbHNlCiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAotCQkJICAgICJObyBWaXJ0dWFsIGFkZHJlc3MgXG4iKTsKKwkJCSAgICAiTm8gVmlydHVhbCBhZGRyZXNzXG4iKTsKIAogCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5oYW5kbGVfYmFzZSA9CiAJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CkBAIC0yMjY2LDEwICsyMzIxLDEwIEBACiAJaWYgKG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcykgewogCQlTRV9ERUJVRyhEQkdfTFZMXzgsCiAJCQkgImh3aV9pbml0X2FzeW5jX3BkdV9jdHggSFdJX01FTV9BU1lOQ19EQVRBX0JVRiIKLQkJCSAidmE9JXAgXG4iLCBtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpOworCQkJICJ2YT0lcFxuIiwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKTsKIAl9IGVsc2UKIAkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCi0JCQkgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCQkJICAgICJObyBWaXJ0dWFsIGFkZHJlc3NcbiIpOwogCXBhc3luY19jdHgtPmFzeW5jX2RhdGEudmFfYmFzZSA9CiAJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CiAJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5wYV9iYXNlLnUuYTY0LmFkZHJlc3MgPQpAQCAtMjI4MCwxMCArMjMzNSwxMCBAQAogCWlmIChtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpIHsKIAkJU0VfREVCVUcoREJHX0xWTF84LAogCQkJICJod2lfaW5pdF9hc3luY19wZHVfY3R4IEhXSV9NRU1fQVNZTkNfREFUQV9SSU5HIgotCQkJICJ2YT0lcCBcbiIsIG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcyk7CisJCQkgInZhPSVwXG4iLCBtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpOwogCX0gZWxzZQogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKLQkJCSAgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCQkJICAgICAiTm8gVmlydHVhbCBhZGRyZXNzXG4iKTsKIAogCXBhc3luY19jdHgtPmFzeW5jX2RhdGEucmluZ19iYXNlID0KIAkJCW1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzczsKQEAgLTIyOTIsNyArMjM0Nyw3IEBACiAJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQVNZTkNfREFUQV9IQU5ETEU7CiAJaWYgKCFtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpCiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAotCQkJICAgICJObyBWaXJ0dWFsIGFkZHJlc3MgXG4iKTsKKwkJCSAgICAiTm8gVmlydHVhbCBhZGRyZXNzXG4iKTsKIAogCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuaGFuZGxlX2Jhc2UgPQogCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOwpAQCAtMjM2NCw3ICsyNDE5LDcgQEAKIAlXQVJOX09OKCFzZ2wpOwogCiAJc2dsLT52YSA9IHZpcnR1YWxfYWRkcmVzczsKLQlzZ2wtPmRtYSA9IHBoeXNpY2FsX2FkZHJlc3M7CisJc2dsLT5kbWEgPSAodW5zaWduZWQgbG9uZylwaHlzaWNhbF9hZGRyZXNzOwogCXNnbC0+c2l6ZSA9IGxlbmd0aDsKIAogCXJldHVybiAwOwpAQCAtMjQ0Nyw3ICsyNTAyLDcgQEAKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBiZV9lcV9lbnRyeSksIGVxX3ZhZGRyZXNzKTsKIAkJaWYgKHJldCkgewogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKLQkJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgRVEgXG4iKTsKKwkJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgRVFcbiIpOwogCQkJZ290byBjcmVhdGVfZXFfZXJyb3I7CiAJCX0KIApAQCAtMjQ1Nyw3ICsyNTEyLDcgQEAKIAkJaWYgKHJldCkgewogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKIAkJCQkgICAgICJiZWlzY3NpX2NtZF9lcV9jcmVhdGUiCi0JCQkJICAgICAiRmFpbGVkZm9yIEVRIFxuIik7CisJCQkJICAgICAiRmFpbGVkZm9yIEVRXG4iKTsKIAkJCWdvdG8gY3JlYXRlX2VxX2Vycm9yOwogCQl9CiAJCVNFX0RFQlVHKERCR19MVkxfOCwgImVxaWQgPSAlZFxuIiwgcGh3aV9jb250ZXh0LT5iZV9lcVtpXS5xLmlkKTsKQEAgLTI1MDUsNyArMjU2MCw3IEBACiAJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29sX2NxZSksIGNxX3ZhZGRyZXNzKTsKIAkJaWYgKHJldCkgewogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKLQkJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgSVNDU0kgQ1EgXG4iKTsKKwkJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgSVNDU0kgQ1FcbiIpOwogCQkJZ290byBjcmVhdGVfY3FfZXJyb3I7CiAJCX0KIApAQCAtMjUxNSw3ICsyNTcwLDcgQEAKIAkJaWYgKHJldCkgewogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKIAkJCQkgICAgICJiZWlzY3NpX2NtZF9lcV9jcmVhdGUiCi0JCQkJICAgICAiRmFpbGVkIGZvciBJU0NTSSBDUSBcbiIpOworCQkJCSAgICAgIkZhaWxlZCBmb3IgSVNDU0kgQ1FcbiIpOwogCQkJZ290byBjcmVhdGVfY3FfZXJyb3I7CiAJCX0KIAkJU0VfREVCVUcoREJHX0xWTF84LCAiaXNjc2kgY3FfaWQgaXMgJWQgZm9yIGVxX2lkICVkXG4iLApAQCAtMjU2NSw3ICsyNjIwLDggQEAKIAkJCSAgICAgImJlX2ZpbGxfcXVldWUgRmFpbGVkIGZvciBERUYgUERVIEhEUlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQotCW1lbS0+ZG1hID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzOworCW1lbS0+ZG1hID0gKHVuc2lnbmVkIGxvbmcpbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS4KKwkJCQkgIGJ1c19hZGRyZXNzLnUuYTY0LmFkZHJlc3M7CiAJcmV0ID0gYmVfY21kX2NyZWF0ZV9kZWZhdWx0X3BkdV9xdWV1ZSgmcGhiYS0+Y3RybCwgY3EsIGRxLAogCQkJCQkgICAgICBkZWZfcGR1X3Jpbmdfc3osCiAJCQkJCSAgICAgIHBoYmEtPnBhcmFtcy5kZWZwZHVfaGRyX3N6KTsKQEAgLTI2MDksNyArMjY2NSw4IEBACiAJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgREVGIFBEVSBEQVRBXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JbWVtLT5kbWEgPSBtZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLmJ1c19hZGRyZXNzLnUuYTY0LmFkZHJlc3M7CisJbWVtLT5kbWEgPSAodW5zaWduZWQgbG9uZyltZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLgorCQkJCSAgYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKIAlyZXQgPSBiZV9jbWRfY3JlYXRlX2RlZmF1bHRfcGR1X3F1ZXVlKCZwaGJhLT5jdHJsLCBjcSwgZGF0YXEsCiAJCQkJCSAgICAgIGRlZl9wZHVfcmluZ19zeiwKIAkJCQkJICAgICAgcGhiYS0+cGFyYW1zLmRlZnBkdV9kYXRhX3N6KTsKQEAgLTI2MjMsNyArMjY4MCw3IEBACiAJU0VfREVCVUcoREJHX0xWTF84LCAiaXNjc2kgZGVmIGRhdGEgaWQgaXMgJWRcbiIsCiAJCSBwaHdpX2NvbnRleHQtPmJlX2RlZl9kYXRhcS5pZCk7CiAJaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCAwKTsKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJERUZBVUxUIFBEVSBEQVRBIFJJTkcgQ1JFQVRFRCBcbiIpOworCVNFX0RFQlVHKERCR19MVkxfOCwgIkRFRkFVTFQgUERVIERBVEEgUklORyBDUkVBVEVEXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY1NSw3ICsyNzEyLDcgQEAKIAkJfQogCQlwbV9hcnIrKzsKIAl9Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiUE9TVEVEIFBBR0VTIFxuIik7CisJU0VfREVCVUcoREJHX0xWTF84LCAiUE9TVEVEIFBBR0VTXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY3OCw3ICsyNzM1LDcgQEAKIAltZW0tPnNpemUgPSBsZW4gKiBlbnRyeV9zaXplOwogCW1lbS0+dmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsIG1lbS0+c2l6ZSwgJm1lbS0+ZG1hKTsKIAlpZiAoIW1lbS0+dmEpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KG1lbS0+dmEsIDAsIG1lbS0+c2l6ZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzUwLDYgKzI4MDcsNyBAQAogCQlpZiAoc3RhdHVzICE9IDApIHsKIAkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkJICAgICAid3JicSBjcmVhdGUgZmFpbGVkLiIpOworCQkJa2ZyZWUocHdyYl9hcnIpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCQlwaHdpX2N0cmxyLT53cmJfY29udGV4dFtpICogMl0uY2lkID0gcGh3aV9jb250ZXh0LT5iZV93cmJxW2ldLgpAQCAtMjg3Myw3ICsyOTMxLDcgQEAKIG1jY19jcV9mcmVlOgogCWJlX3F1ZXVlX2ZyZWUocGhiYSwgY3EpOwogZXJyOgotCXJldHVybiAtMTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIGludCBmaW5kX251bV9jcHVzKHZvaWQpCkBAIC0yODg0LDcgKzI5NDIsNyBAQAogCWlmIChudW1fY3B1cyA+PSBNQVhfQ1BVUykKIAkJbnVtX2NwdXMgPSBNQVhfQ1BVUyAtIDE7CiAKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJudW1fY3B1cyA9ICVkIFxuIiwgbnVtX2NwdXMpOworCVNFX0RFQlVHKERCR19MVkxfOCwgIm51bV9jcHVzID0gJWRcbiIsIG51bV9jcHVzKTsKIAlyZXR1cm4gbnVtX2NwdXM7CiB9CiAKQEAgLTI5MDcsNyArMjk2NSw3IEBACiAKIAlzdGF0dXMgPSBiZWlzY3NpX2NyZWF0ZV9lcXMocGhiYSwgcGh3aV9jb250ZXh0KTsKIAlpZiAoc3RhdHVzICE9IDApIHsKLQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgIkVRIG5vdCBjcmVhdGVkIFxuIik7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJFUSBub3QgY3JlYXRlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yOTE4LDcgKzI5NzYsNyBAQAogCXN0YXR1cyA9IG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3KGN0cmwsIHBoYmEpOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAotCQkJICAgICAiVW5zdXBwb3J0ZWQgZncgdmVyc2lvbiBcbiIpOworCQkJICAgICAiVW5zdXBwb3J0ZWQgZncgdmVyc2lvblxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yOTc0LDcgKzMwMzIsNyBAQAogCWlmICgxID09IHBoYmEtPmluaXRfbWVtW0hXSV9NRU1fQURETl9DT05URVhUXS5udW1fZWxlbWVudHMpIHsKIAkJcGh3aV9jdHJsci0+cGh3aV9jdHh0ID0gKHN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKilwaGJhLT4KIAkJICAgIGluaXRfbWVtW0hXSV9NRU1fQURETl9DT05URVhUXS5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOwotCQlTRV9ERUJVRyhEQkdfTFZMXzgsICIgcGh3aV9jdHJsci0+cGh3aV9jdHh0PSVwIFxuIiwKKwkJU0VfREVCVUcoREJHX0xWTF84LCAiIHBod2lfY3RybHItPnBod2lfY3R4dD0lcFxuIiwKIAkJCSBwaHdpX2N0cmxyLT5waHdpX2N0eHQpOwogCX0gZWxzZSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCkBAIC0zMDA3LDggKzMwNjUsOCBAQAogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsCiAJCQkgIG1lbV9kZXNjci0+bWVtX2FycmF5W2ogLSAxXS5zaXplLAogCQkJICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0udmlydHVhbF9hZGRyZXNzLAotCQkJICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0uYnVzX2FkZHJlc3MuCi0JCQkJdS5hNjQuYWRkcmVzcyk7CisJCQkgICh1bnNpZ25lZCBsb25nKW1lbV9kZXNjci0+bWVtX2FycmF5W2ogLSAxXS4KKwkJCSAgYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzcyk7CiAJCX0KIAkJa2ZyZWUobWVtX2Rlc2NyLT5tZW1fYXJyYXkpOwogCQltZW1fZGVzY3IrKzsKQEAgLTMwMjQsNyArMzA4Miw3IEBACiAJcmV0ID0gYmVpc2NzaV9nZXRfbWVtb3J5KHBoYmEpOwogCWlmIChyZXQgPCAwKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2Rldl9wcm9iZSAtIgotCQkJICAgICAiRmFpbGVkIGluIGJlaXNjc2lfYWxsb2NfbWVtb3J5IFxuIik7CisJCQkgICAgICJGYWlsZWQgaW4gYmVpc2NzaV9hbGxvY19tZW1vcnlcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzEwMSwxMiArMzE1OSwxMiBAQAogCX0KIAlTRV9ERUJVRyhEQkdfTFZMXzgsCiAJCSAicGhiYS0+aW9fc2dsX2huZGxfYXZibD0lZCIKLQkJICJwaGJhLT5laF9zZ2xfaG5kbF9hdmJsPSVkIFxuIiwKKwkJICJwaGJhLT5laF9zZ2xfaG5kbF9hdmJsPSVkXG4iLAogCQkgcGhiYS0+aW9fc2dsX2huZGxfYXZibCwKIAkJIHBoYmEtPmVoX3NnbF9obmRsX2F2YmwpOwogCW1lbV9kZXNjcl9zZyA9IHBoYmEtPmluaXRfbWVtOwogCW1lbV9kZXNjcl9zZyArPSBIV0lfTUVNX1NHRTsKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJcbiBtZW1fZGVzY3Jfc2ctPm51bV9lbGVtZW50cz0lZCBcbiIsCisJU0VfREVCVUcoREJHX0xWTF84LCAiXG4gbWVtX2Rlc2NyX3NnLT5udW1fZWxlbWVudHM9JWRcbiIsCiAJCSBtZW1fZGVzY3Jfc2ctPm51bV9lbGVtZW50cyk7CiAJYXJyX2luZGV4ID0gMDsKIAlpZHggPSAwOwpAQCAtMzE1NSw3ICszMjEzLDcgQEAKIAlpZiAoIXBoYmEtPmVwX2FycmF5KSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluICIKLQkJCSAgICAgImhiYV9zZXR1cF9jaWRfdGJscyBcbiIpOworCQkJICAgICAiaGJhX3NldHVwX2NpZF90YmxzXG4iKTsKIAkJa2ZyZWUocGhiYS0+Y2lkX2FycmF5KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzE2OCw3ICszMjI2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgaHdpX2VuYWJsZV9pbnRyKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3N0YXRpYyB2b2lkIGh3aV9lbmFibGVfaW50cihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOwogCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKQEAgLTMxODQsMjYgKzMyNDIsMjUgQEAKIAlhZGRyID0gKHU4IF9faW9tZW0gKikgKCh1OCBfX2lvbWVtICopIGN0cmwtPnBjaWNmZyArCiAJCQlQQ0lDRkdfTUVNQkFSX0NUUkxfSU5UX0NUUkxfT0ZGU0VUKTsKIAlyZWcgPSBpb3JlYWQzMihhZGRyKTsKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJyZWcgPXglMDh4IFxuIiwgcmVnKTsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJyZWcgPXglMDh4XG4iLCByZWcpOwogCiAJZW5hYmxlZCA9IHJlZyAmIE1FTUJBUl9DVFJMX0lOVF9DVFJMX0hPU1RJTlRSX01BU0s7CiAJaWYgKCFlbmFibGVkKSB7CiAJCXJlZyB8PSBNRU1CQVJfQ1RSTF9JTlRfQ1RSTF9IT1NUSU5UUl9NQVNLOwotCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJyZWcgPXglMDh4IGFkZHI9JXAgXG4iLCByZWcsIGFkZHIpOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJyZWcgPXglMDh4IGFkZHI9JXBcbiIsIHJlZywgYWRkcik7CiAJCWlvd3JpdGUzMihyZWcsIGFkZHIpOwogCQlpZiAoIXBoYmEtPm1zaXhfZW5hYmxlZCkgewogCQkJZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVswXS5xOwotCQkJU0VfREVCVUcoREJHX0xWTF84LCAiZXEtPmlkPSVkIFxuIiwgZXEtPmlkKTsKKwkJCVNFX0RFQlVHKERCR19MVkxfOCwgImVxLT5pZD0lZFxuIiwgZXEtPmlkKTsKIAkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwgMCwgMSwgMSk7CiAJCX0gZWxzZSB7CiAJCQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKIAkJCQllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldLnE7Ci0JCQkJU0VfREVCVUcoREJHX0xWTF84LCAiZXEtPmlkPSVkIFxuIiwgZXEtPmlkKTsKKwkJCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJlcS0+aWQ9JWRcbiIsIGVxLT5pZCk7CiAJCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLCAwLCAxLCAxKTsKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgaHdpX2Rpc2FibGVfaW50cihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCkBAIC0zMjE5LDcgKzMyNzYsNyBAQAogCQlpb3dyaXRlMzIocmVnLCBhZGRyKTsKIAl9IGVsc2UKIAkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCi0JCQkgICAgICJJbiBod2lfZGlzYWJsZV9pbnRyLCBBbHJlYWR5IERpc2FibGVkIFxuIik7CisJCQkgICAgICJJbiBod2lfZGlzYWJsZV9pbnRyLCBBbHJlYWR5IERpc2FibGVkXG4iKTsKIH0KIAogc3RhdGljIGludCBiZWlzY3NpX2luaXRfcG9ydChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCkBAIC0zMjMwLDE0ICszMjg3LDE0IEBACiAJaWYgKHJldCA8IDApIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKIAkJCSAgICAgImJlaXNjc2lfZGV2X3Byb2JlIC0gRmFpbGVkIGluIgotCQkJICAgICAiYmVpc2NzaV9pbml0X2NvbnRyb2xsZXIgXG4iKTsKKwkJCSAgICAgImJlaXNjc2lfaW5pdF9jb250cm9sbGVyXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0ID0gYmVpc2NzaV9pbml0X3NnbF9oYW5kbGUocGhiYSk7CiAJaWYgKHJldCA8IDApIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKIAkJCSAgICAgImJlaXNjc2lfZGV2X3Byb2JlIC0gRmFpbGVkIGluIgotCQkJICAgICAiYmVpc2NzaV9pbml0X3NnbF9oYW5kbGUgXG4iKTsKKwkJCSAgICAgImJlaXNjc2lfaW5pdF9zZ2xfaGFuZGxlXG4iKTsKIAkJZ290byBkb19jbGVhbnVwX2N0cmxyOwogCX0KIApAQCAtMzI5MSwxMiArMzM0OCwxMiBAQAogCiBzdGF0aWMgdm9pZCBiZWlzY3NpX2NsZWFuX3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQogewotCXVuc2lnbmVkIGNoYXIgbWdtdF9zdGF0dXM7CisJaW50IG1nbXRfc3RhdHVzOwogCiAJbWdtdF9zdGF0dXMgPSBtZ210X2VwZndfY2xlYW51cChwaGJhLCBDTURfQ09OTkVDVElPTl9DSFVURV8wKTsKIAlpZiAobWdtdF9zdGF0dXMpCiAJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAotCQkJICAgICAibWdtdF9lcGZ3X2NsZWFudXAgRkFJTEVEIFxuIik7CisJCQkgICAgICJtZ210X2VwZndfY2xlYW51cCBGQUlMRURcbiIpOwogCiAJaHdpX3B1cmdlX2VxKHBoYmEpOwogCWh3aV9jbGVhbnVwKHBoYmEpOwpAQCAtMzQyOCwxNCArMzQ4NSwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlpb190YXNrLT5iaHNfcGEudS5hNjQuYWRkcmVzcyA9IHBhZGRyOwogCWlvX3Rhc2stPmxpYmlzY3NpX2l0dCA9IChpdHRfdCl0YXNrLT5pdHQ7Ci0JaW9fdGFzay0+cHdyYl9oYW5kbGUgPSBhbGxvY193cmJfaGFuZGxlKHBoYmEsCi0JCQkJCQliZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQgLQotCQkJCQkJcGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9zdGFydAotCQkJCQkJKTsKIAlpb190YXNrLT5jb25uID0gYmVpc2NzaV9jb25uOwogCiAJdGFzay0+aGRyID0gKHN0cnVjdCBpc2NzaV9oZHIgKikmaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfaGRyOwogCXRhc2stPmhkcl9tYXggPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9iaHMpOworCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0gTlVMTDsKKwlpb190YXNrLT5wc2dsX2hhbmRsZSA9IE5VTEw7CiAKIAlpZiAodGFzay0+c2MpIHsKIAkJc3Bpbl9sb2NrKCZwaGJhLT5pb19zZ2xfbG9jayk7CkBAIC0zNDQzLDYgKzM0OTgsMTEgQEAKIAkJc3Bpbl91bmxvY2soJnBoYmEtPmlvX3NnbF9sb2NrKTsKIAkJaWYgKCFpb190YXNrLT5wc2dsX2hhbmRsZSkKIAkJCWdvdG8gZnJlZV9obmRsczsKKwkJaW9fdGFzay0+cHdyYl9oYW5kbGUgPSBhbGxvY193cmJfaGFuZGxlKHBoYmEsCisJCQkJCWJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCAtCisJCQkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaWRfc3RhcnQpOworCQlpZiAoIWlvX3Rhc2stPnB3cmJfaGFuZGxlKQorCQkJZ290byBmcmVlX2lvX2huZGxzOwogCX0gZWxzZSB7CiAJCWlvX3Rhc2stPnNjc2lfY21uZCA9IE5VTEw7CiAJCWlmICgob3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0spID09IElTQ1NJX09QX0xPR0lOKSB7CkBAIC0zNDU3LDkgKzM1MTcsMjAgQEAKIAkJCQliZWlzY3NpX2Nvbm4tPmxvZ2luX2luX3Byb2dyZXNzID0gMTsKIAkJCQliZWlzY3NpX2Nvbm4tPnBsb2dpbl9zZ2xfaGFuZGxlID0KIAkJCQkJCQlpb190YXNrLT5wc2dsX2hhbmRsZTsKKwkJCQlpb190YXNrLT5wd3JiX2hhbmRsZSA9CisJCQkJCWFsbG9jX3dyYl9oYW5kbGUocGhiYSwKKwkJCQkJYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkIC0KKwkJCQkJcGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9zdGFydCk7CisJCQkJaWYgKCFpb190YXNrLT5wd3JiX2hhbmRsZSkKKwkJCQkJZ290byBmcmVlX2lvX2huZGxzOworCQkJCWJlaXNjc2lfY29ubi0+cGxvZ2luX3dyYl9oYW5kbGUgPQorCQkJCQkJCWlvX3Rhc2stPnB3cmJfaGFuZGxlOworCiAJCQl9IGVsc2UgewogCQkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0KIAkJCQkJCWJlaXNjc2lfY29ubi0+cGxvZ2luX3NnbF9oYW5kbGU7CisJCQkJaW9fdGFzay0+cHdyYl9oYW5kbGUgPQorCQkJCQkJYmVpc2NzaV9jb25uLT5wbG9naW5fd3JiX2hhbmRsZTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXNwaW5fbG9jaygmcGhiYS0+bWdtdF9zZ2xfbG9jayk7CkBAIC0zNDY3LDYgKzM1MzgsMTMgQEAKIAkJCXNwaW5fdW5sb2NrKCZwaGJhLT5tZ210X3NnbF9sb2NrKTsKIAkJCWlmICghaW9fdGFzay0+cHNnbF9oYW5kbGUpCiAJCQkJZ290byBmcmVlX2huZGxzOworCQkJaW9fdGFzay0+cHdyYl9oYW5kbGUgPQorCQkJCQlhbGxvY193cmJfaGFuZGxlKHBoYmEsCisJCQkJCWJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCAtCisJCQkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaWRfc3RhcnQpOworCQkJaWYgKCFpb190YXNrLT5wd3JiX2hhbmRsZSkKKwkJCQlnb3RvIGZyZWVfbWdtdF9obmRsczsKKwogCQl9CiAJfQogCWl0dCA9IChpdHRfdCkgY3B1X3RvX2JlMzIoKCh1bnNpZ25lZCBpbnQpaW9fdGFzay0+cHdyYl9oYW5kbGUtPgpAQCAtMzQ3NywxNiArMzU1NSwyNiBAQAogCWlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci5pdHQgPSBpdHQ7CiAJcmV0dXJuIDA7CiAKK2ZyZWVfaW9faG5kbHM6CisJc3Bpbl9sb2NrKCZwaGJhLT5pb19zZ2xfbG9jayk7CisJZnJlZV9pb19zZ2xfaGFuZGxlKHBoYmEsIGlvX3Rhc2stPnBzZ2xfaGFuZGxlKTsKKwlzcGluX3VubG9jaygmcGhiYS0+aW9fc2dsX2xvY2spOworCWdvdG8gZnJlZV9obmRsczsKK2ZyZWVfbWdtdF9obmRsczoKKwlzcGluX2xvY2soJnBoYmEtPm1nbXRfc2dsX2xvY2spOworCWZyZWVfbWdtdF9zZ2xfaGFuZGxlKHBoYmEsIGlvX3Rhc2stPnBzZ2xfaGFuZGxlKTsKKwlzcGluX3VubG9jaygmcGhiYS0+bWdtdF9zZ2xfbG9jayk7CiBmcmVlX2huZGxzOgogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwogCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFsKIAkJCWJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCAtCiAJCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX3N0YXJ0XTsKLQlmcmVlX3dyYl9oYW5kbGUocGhiYSwgcHdyYl9jb250ZXh0LCBpb190YXNrLT5wd3JiX2hhbmRsZSk7CisJaWYgKGlvX3Rhc2stPnB3cmJfaGFuZGxlKQorCQlmcmVlX3dyYl9oYW5kbGUocGhiYSwgcHdyYl9jb250ZXh0LCBpb190YXNrLT5wd3JiX2hhbmRsZSk7CiAJaW9fdGFzay0+cHdyYl9oYW5kbGUgPSBOVUxMOwogCXBjaV9wb29sX2ZyZWUoYmVpc2NzaV9zZXNzLT5iaHNfcG9vbCwgaW9fdGFzay0+Y21kX2JocywKIAkJICAgICAgaW9fdGFzay0+YmhzX3BhLnUuYTY0LmFkZHJlc3MpOwotCVNFX0RFQlVHKERCR19MVkxfMSwgIkFsbG9jIG9mIFNHTF9JQ0QgRmFpbGVkIFxuIik7CisJU0VfREVCVUcoREJHX0xWTF8xLCAiQWxsb2Mgb2YgU0dMX0lDRCBGYWlsZWRcbiIpOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC0zNjUzLDcgKzM3NDEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCVNFX0RFQlVHKERCR19MVkxfMSwgIm9wY29kZSA9JWQgTm90IHN1cHBvcnRlZCBcbiIsCisJCVNFX0RFQlVHKERCR19MVkxfMSwgIm9wY29kZSA9JWQgTm90IHN1cHBvcnRlZFxuIiwKIAkJCSB0YXNrLT5oZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzY4OSwxMyArMzc3NywxMSBAQAogCQlTRV9ERUJVRyhEQkdfTFZMXzEsICIgc2NzaV9kbWFfbWFwIEZhaWxlZFxuIikKIAkJcmV0dXJuIG51bV9zZzsKIAl9Ci0JU0VfREVCVUcoREJHX0xWTF80LCAieGZlcmxlbj0weCUwOHggc2NtZD0lcCBudW1fc2c9JWQgc2VybnVtPSVsdVxuIiwKLQkJICAoc2NzaV9idWZmbGVuKHNjKSksIHNjLCBudW1fc2csIHNjLT5zZXJpYWxfbnVtYmVyKTsKIAl4ZmVybGVuID0gc2NzaV9idWZmbGVuKHNjKTsKIAlzZyA9IHNjc2lfc2dsaXN0KHNjKTsKIAlpZiAoc2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKIAkJd3JpdGVkaXIgPSAxOwotCQlTRV9ERUJVRyhEQkdfTFZMXzQsICJ0YXNrLT5pbW1fY291bnQ9MHglMDh4IFxuIiwKKwkJU0VfREVCVUcoREJHX0xWTF80LCAidGFzay0+aW1tX2NvdW50PTB4JTA4eFxuIiwKIAkJCSB0YXNrLT5pbW1fY291bnQpOwogCX0gZWxzZQogCQl3cml0ZWRpciA9IDA7CkBAIC0zNzA5LDEwICszNzk1LDEyIEBACiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwogCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKIAl1bnNpZ25lZCBpbnQgaSwgbXNpeF92ZWM7CisJdTggKnJlYWxfb2Zmc2V0ID0gMDsKKwl1MzIgdmFsdWUgPSAwOwogCiAJcGhiYSA9IChzdHJ1Y3QgYmVpc2NzaV9oYmEgKilwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKIAlpZiAoIXBoYmEpIHsKLQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJiZWlzY3NpX3JlbW92ZSBjYWxsZWQgd2l0aCBubyBwaGJhIFxuIik7CisJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiYmVpc2NzaV9yZW1vdmUgY2FsbGVkIHdpdGggbm8gcGhiYVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM3MzcsNiArMzgyNSwxNCBAQAogCiAJYmVpc2NzaV9jbGVhbl9wb3J0KHBoYmEpOwogCWJlaXNjc2lfZnJlZV9tZW0ocGhiYSk7CisJcmVhbF9vZmZzZXQgPSAodTggKilwaGJhLT5jc3JfdmEgKyBNUFVfRVBfU0VNQVBIT1JFOworCisJdmFsdWUgPSByZWFkbCgodm9pZCAqKXJlYWxfb2Zmc2V0KTsKKworCWlmICh2YWx1ZSAmIDB4MDAwMTAwMDApIHsKKwkJdmFsdWUgJj0gMHhmZmZlZmZmZjsKKwkJd3JpdGVsKHZhbHVlLCAodm9pZCAqKXJlYWxfb2Zmc2V0KTsKKwl9CiAJYmVpc2NzaV91bm1hcF9wY2lfZnVuY3Rpb24ocGhiYSk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsCiAJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnNpemUsCkBAIC0zNzY5LDE5ICszODY1LDIxIEBACiAJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwogCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKIAlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7Ci0JaW50IHJldCwgbXNpeF92ZWMsIG51bV9jcHVzLCBpOworCWludCByZXQsIG51bV9jcHVzLCBpOworCXU4ICpyZWFsX29mZnNldCA9IDA7CisJdTMyIHZhbHVlID0gMDsKIAogCXJldCA9IGJlaXNjc2lfZW5hYmxlX3BjaShwY2lkZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2Rldl9wcm9iZS0iCi0JCQkgICAgICJGYWlsZWQgdG8gZW5hYmxlIHBjaSBkZXZpY2UgXG4iKTsKKwkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJiZWlzY3NpX2Rldl9wcm9iZS0iCisJCQkiIEZhaWxlZCB0byBlbmFibGUgcGNpIGRldmljZVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcGhiYSA9IGJlaXNjc2lfaGJhX2FsbG9jKHBjaWRldik7CiAJaWYgKCFwaGJhKSB7CiAJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiYmVpc2NzaV9kZXZfcHJvYmUtIgotCQkJIiBGYWlsZWQgaW4gYmVpc2NzaV9oYmFfYWxsb2MgXG4iKTsKKwkJCSIgRmFpbGVkIGluIGJlaXNjc2lfaGJhX2FsbG9jXG4iKTsKIAkJZ290byBkaXNhYmxlX3BjaTsKIAl9CiAKQEAgLTM4MDQsNyArMzkwMiw3IEBACiAJZWxzZQogCQludW1fY3B1cyA9IDE7CiAJcGhiYS0+bnVtX2NwdXMgPSBudW1fY3B1czsKLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJudW1fY3B1cyA9ICVkIFxuIiwgcGhiYS0+bnVtX2NwdXMpOworCVNFX0RFQlVHKERCR19MVkxfOCwgIm51bV9jcHVzID0gJWRcbiIsIHBoYmEtPm51bV9jcHVzKTsKIAogCWlmIChlbmFibGVfbXNpeCkKIAkJYmVpc2NzaV9tc2l4X2VuYWJsZShwaGJhKTsKQEAgLTM4MTUsNiArMzkxMywzMyBAQAogCQlnb3RvIGhiYV9mcmVlOwogCX0KIAorCWlmICghbnVtX2hiYSkgeworCQlyZWFsX29mZnNldCA9ICh1OCAqKXBoYmEtPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkU7CisJCXZhbHVlID0gcmVhZGwoKHZvaWQgKilyZWFsX29mZnNldCk7CisJCWlmICh2YWx1ZSAmIDB4MDAwMTAwMDApIHsKKwkJCWdjcmFzaG1vZGUrKzsKKwkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkJIkxvYWRpbmcgRHJpdmVyIGluIGNyYXNoZHVtcCBtb2RlXG4iKTsKKwkJCXJldCA9IGJlaXNjc2lfcGNpX3NvZnRfcmVzZXQocGhiYSk7CisJCQlpZiAocmV0KSB7CisJCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCQkJIlJlc2V0IEZhaWxlZC4gQWJvcnRpbmcgQ3Jhc2hkdW1wXG4iKTsKKwkJCQlnb3RvIGhiYV9mcmVlOworCQkJfQorCQkJcmV0ID0gYmVfY2hrX3Jlc2V0X2NvbXBsZXRlKHBoYmEpOworCQkJaWYgKHJldCkgeworCQkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkJCSJGYWlsZWQgdG8gZ2V0IG91dCBvZiByZXNldC4iCisJCQkJCSJBYm9ydGluZyBDcmFzaGR1bXBcbiIpOworCQkJCWdvdG8gaGJhX2ZyZWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2YWx1ZSB8PSAweDAwMDEwMDAwOworCQkJd3JpdGVsKHZhbHVlLCAodm9pZCAqKXJlYWxfb2Zmc2V0KTsKKwkJCW51bV9oYmErKzsKKwkJfQorCX0KKwogCXNwaW5fbG9ja19pbml0KCZwaGJhLT5pb19zZ2xfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnBoYmEtPm1nbXRfc2dsX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwaGJhLT5pc3JfbG9jayk7CkBAIC0zODcwLDI1ICszOTk1LDEwIEBACiAJCQkgICAgICJGYWlsZWQgdG8gYmVpc2NzaV9pbml0X2lycXNcbiIpOwogCQlnb3RvIGZyZWVfYmxrZW5ibGQ7CiAJfQotCXJldCA9IGh3aV9lbmFibGVfaW50cihwaGJhKTsKLQlpZiAocmV0IDwgMCkgewotCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiYmVpc2NzaV9kZXZfcHJvYmUtIgotCQkJICAgICAiRmFpbGVkIHRvIGh3aV9lbmFibGVfaW50clxuIik7Ci0JCWdvdG8gZnJlZV9jdHJscjsKLQl9Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiXG5cblxuIFNVQ0NFU1MgLSBEUklWRVIgTE9BREVEIFxuXG5cbiIpOworCWh3aV9lbmFibGVfaW50cihwaGJhKTsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJcblxuXG4gU1VDQ0VTUyAtIERSSVZFUiBMT0FERURcblxuXG4iKTsKIAlyZXR1cm4gMDsKIAotZnJlZV9jdHJscjoKLQlpZiAocGhiYS0+bXNpeF9lbmFibGVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykgewotCQkJbXNpeF92ZWMgPSBwaGJhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yOwotCQkJZnJlZV9pcnEobXNpeF92ZWMsICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKLQkJfQotCX0gZWxzZQotCQlpZiAocGhiYS0+cGNpZGV2LT5pcnEpCi0JCQlmcmVlX2lycShwaGJhLT5wY2lkZXYtPmlycSwgcGhiYSk7Ci0JcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOwogZnJlZV9ibGtlbmJsZDoKIAlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7CiAJaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkKQEAgLTM5MDAsMTIgKzQwMTAsMjMgQEAKIAliZWlzY3NpX2NsZWFuX3BvcnQocGhiYSk7CiAJYmVpc2NzaV9mcmVlX21lbShwaGJhKTsKIGZyZWVfcG9ydDoKKwlyZWFsX29mZnNldCA9ICh1OCAqKXBoYmEtPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkU7CisKKwl2YWx1ZSA9IHJlYWRsKCh2b2lkICopcmVhbF9vZmZzZXQpOworCisJaWYgKHZhbHVlICYgMHgwMDAxMDAwMCkgeworCQl2YWx1ZSAmPSAweGZmZmVmZmZmOworCQl3cml0ZWwodmFsdWUsICh2b2lkICopcmVhbF9vZmZzZXQpOworCX0KKwogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAogCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5zaXplLAogCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC52YSwKIAkJCSAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5kbWEpOwogCWJlaXNjc2lfdW5tYXBfcGNpX2Z1bmN0aW9uKHBoYmEpOwogaGJhX2ZyZWU6CisJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkKKwkJcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOwogCWlzY3NpX2hvc3RfcmVtb3ZlKHBoYmEtPnNob3N0KTsKIAlwY2lfZGV2X3B1dChwaGJhLT5wY2lkZXYpOwogCWlzY3NpX2hvc3RfZnJlZShwaGJhLT5zaG9zdCk7CkBAIC0zOTU1LDcgKzQwNzYsNyBAQAogCS5nZXRfc2Vzc2lvbl9wYXJhbSA9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLAogCS5nZXRfaG9zdF9wYXJhbSA9IGJlaXNjc2lfZ2V0X2hvc3RfcGFyYW0sCiAJLnN0YXJ0X2Nvbm4gPSBiZWlzY3NpX2Nvbm5fc3RhcnQsCi0JLnN0b3BfY29ubiA9IGJlaXNjc2lfY29ubl9zdG9wLAorCS5zdG9wX2Nvbm4gPSBpc2NzaV9jb25uX3N0b3AsCiAJLnNlbmRfcGR1ID0gaXNjc2lfY29ubl9zZW5kX3BkdSwKIAkueG1pdF90YXNrID0gYmVpc2NzaV90YXNrX3htaXQsCiAJLmNsZWFudXBfdGFzayA9IGJlaXNjc2lfY2xlYW51cF90YXNrLApAQCAtMzk4OCw3ICs0MTA5LDcgQEAKIAkJCSAidHJhbnNwb3J0LlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX21vZHVsZV9pbml0LCB0dD0lcCBcbiIsCisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9tb2R1bGVfaW5pdCwgdHQ9JXBcbiIsCiAJCSAmYmVpc2NzaV9pc2NzaV90cmFuc3BvcnQpOwogCiAJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYmVpc2NzaV9wY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCmluZGV4IDg3ZWMyMTIuLmM2NDNiYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0zOSw3ICs0MCw3IEBACiAJCQkJIkxpbnV4IGlTQ1NJIERyaXZlciB2ZXJzaW9uIiBCVUlMRF9TVFIKICNkZWZpbmUgRFJWX0RFU0MJCUJFX05BTUUgIiAiICJEcml2ZXIiCiAKLSNkZWZpbmUgQkVfVkVORE9SX0lEIAkJMHgxOUEyCisjZGVmaW5lIEJFX1ZFTkRPUl9JRAkJMHgxOUEyCiAvKiBERVZJQ0UgSUQncyBmb3IgQkUyICovCiAjZGVmaW5lIEJFX0RFVklDRV9JRDEJCTB4MjEyCiAjZGVmaW5lIE9DX0RFVklDRV9JRDEJCTB4NzAyCkBAIC02OCw4ICs2OSwxNSBAQAogI2RlZmluZSBCRUlTQ1NJX05VTV9NQVhfTFVOCTI1NgkvKiBzY3NpX2hvc3QtPm1heF9sdW4gKi8KICNkZWZpbmUgQkVJU0NTSV9OVU1fREVWSUNFU19TVVBQT1JURUQJMHgwMQogI2RlZmluZSBCRUlTQ1NJX01BWF9GUkFHU19JTklUCTE5MgotI2RlZmluZSBCRV9OVU1fTVNJWF9FTlRSSUVTIAkxCi0jZGVmaW5lIE1QVV9FUF9TRU1BUEhPUkUgCTB4YWMKKyNkZWZpbmUgQkVfTlVNX01TSVhfRU5UUklFUwkxCisKKyNkZWZpbmUgTVBVX0VQX0NPTlRST0wgICAgICAgICAgMAorI2RlZmluZSBNUFVfRVBfU0VNQVBIT1JFICAgICAgICAweGFjCisjZGVmaW5lIEJFMl9TT0ZUX1JFU0VUICAgICAgICAgIDB4NWMKKyNkZWZpbmUgQkUyX1BDSV9PTkxJTkUwICAgICAgICAgMHhiMAorI2RlZmluZSBCRTJfUENJX09OTElORTEgICAgICAgICAweGI0CisjZGVmaW5lIEJFMl9TRVRfUkVTRVQgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQkUyX01QVV9JUkFNX09OTElORSAgICAgMHgwMDAwMDA4MAogCiAjZGVmaW5lIEJFX1NFTlNFX0lORk9fU0laRQkJMjU4CiAjZGVmaW5lIEJFX0lTQ1NJX1BEVV9IRUFERVJfU0laRQk2NApAQCAtMTA1LDcgKzExMyw3IEBACiAjZGVmaW5lIEhXSV9HRVRfQVNZTkNfUERVX0NUWChwaHdpKQkocGh3aS0+cGh3aV9jdHh0LT5wYXN5bmNfY3R4KQogCiAvKioqKioqKioqIE1lbW9yeSBCQVIgcmVnaXN0ZXIgKioqKioqKioqKioqLwotI2RlZmluZSBQQ0lDRkdfTUVNQkFSX0NUUkxfSU5UX0NUUkxfT0ZGU0VUIAkweGZjCisjZGVmaW5lIFBDSUNGR19NRU1CQVJfQ1RSTF9JTlRfQ1RSTF9PRkZTRVQJMHhmYwogLyoqCiAgKiBIb3N0IEludGVycnVwdCBFbmFibGUsIGlmIHNldCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGFsdGhvdWdoICJQQ0kgSW50ZXJydXB0CiAgKiBEaXNhYmxlIiBtYXkgc3RpbGwgZ2xvYmFsbHkgYmxvY2sgaW50ZXJydXB0cyBpbiBhZGRpdGlvbiB0byBpbmRpdmlkdWFsCkBAIC0xMTYsNyArMTI0LDcgQEAKICNkZWZpbmUgTUVNQkFSX0NUUkxfSU5UX0NUUkxfSE9TVElOVFJfTUFTSwkoMSA8PCAyOSkJLyogYml0IDI5ICovCiAKIC8qKioqKioqKiogSVNSMCBSZWdpc3RlciBvZmZzZXQgKioqKioqKioqKi8KLSNkZWZpbmUgQ0VWX0lTUjBfT0ZGU0VUIAkJCTB4QzE4CisjZGVmaW5lIENFVl9JU1IwX09GRlNFVAkJCQkweEMxOAogI2RlZmluZSBDRVZfSVNSX1NJWkUJCQkJNAogCiAvKioKQEAgLTEzOSwxMiArMTQ3LDEyIEBACiAjZGVmaW5lIERCX0VRX1JFQVJNX1NISUZUCQkoMjkpCS8qIGJpdCAyOSAqLwogCiAvKioqKioqKioqIENvbXBsIFEgZG9vciBiZWxsICoqKioqKioqKioqKiovCi0jZGVmaW5lIERCX0NRX09GRlNFVCAJCQkweDEyMAorI2RlZmluZSBEQl9DUV9PRkZTRVQJCQkweDEyMAogI2RlZmluZSBEQl9DUV9SSU5HX0lEX01BU0sJCTB4M0ZGCS8qIGJpdHMgMCAtIDkgKi8KIC8qIE51bWJlciBvZiBldmVudCBlbnRyaWVzIHByb2Nlc3NlZCAqLwotI2RlZmluZSBEQl9DUV9OVU1fUE9QUEVEX1NISUZUCQkoMTYpIAkvKiBiaXRzIDE2IC0gMjggKi8KKyNkZWZpbmUgREJfQ1FfTlVNX1BPUFBFRF9TSElGVAkJKDE2KQkvKiBiaXRzIDE2IC0gMjggKi8KIC8qIFJlYXJtIGJpdCAqLwotI2RlZmluZSBEQl9DUV9SRUFSTV9TSElGVAkJKDI5KSAJLyogYml0IDI5ICovCisjZGVmaW5lIERCX0NRX1JFQVJNX1NISUZUCQkoMjkpCS8qIGJpdCAyOSAqLwogCiAjZGVmaW5lIEdFVF9IV0lfQ09OVFJPTExFUl9XUyhwYykJKHBjLT5waHdpX2N0cmxyKQogI2RlZmluZSBIV0lfR0VUX0RFRl9CVUZRX0lEKHBjKSAoKChzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKilcCkBAIC0xNjEsMTIgKzE2OSwxMiBAQAogCUhXSV9NRU1fV1JCSCwKIAlIV0lfTUVNX1NHTEgsCiAJSFdJX01FTV9TR0UsCi0JSFdJX01FTV9BU1lOQ19IRUFERVJfQlVGLCAJLyogNSAqLworCUhXSV9NRU1fQVNZTkNfSEVBREVSX0JVRiwJLyogNSAqLwogCUhXSV9NRU1fQVNZTkNfREFUQV9CVUYsCiAJSFdJX01FTV9BU1lOQ19IRUFERVJfUklORywKIAlIV0lfTUVNX0FTWU5DX0RBVEFfUklORywKIAlIV0lfTUVNX0FTWU5DX0hFQURFUl9IQU5ETEUsCi0JSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRSwgCS8qIDEwICovCisJSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRSwJLyogMTAgKi8KIAlIV0lfTUVNX0FTWU5DX1BEVV9DT05URVhULAogCUlTQ1NJX01FTV9HTE9CQUxfSEVBREVSLAogCVNFX01FTV9NQVgKQEAgLTM1Miw2ICszNjAsNyBAQAogCXUzMiBiZWlzY3NpX2Nvbm5fY2lkOwogCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICplcDsKIAl1bnNpZ25lZCBzaG9ydCBsb2dpbl9pbl9wcm9ncmVzczsKKwlzdHJ1Y3Qgd3JiX2hhbmRsZSAqcGxvZ2luX3dyYl9oYW5kbGU7CiAJc3RydWN0IHNnbF9oYW5kbGUgKnBsb2dpbl9zZ2xfaGFuZGxlOwogCXN0cnVjdCBiZWlzY3NpX3Nlc3Npb24gKmJlaXNjc2lfc2VzczsKIAlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCmluZGV4IDM1MGNiZWEuLjNmM2ZhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgImJlX21nbXQuaCIKICNpbmNsdWRlICJiZV9pc2NzaS5oIgogCi11bnNpZ25lZCBjaGFyIG1nbXRfZ2V0X2Z3X2NvbmZpZyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAoraW50IG1nbXRfZ2V0X2Z3X2NvbmZpZyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOwpAQCAtNTAsNyArNTAsNyBAQAogCQkJCQlwZndfY2ZnLT51bHBbMF0uc3FfY291bnQ7CiAJCWlmIChwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX2NvdW50ID4gKEJFMl9NQVhfU0VTU0lPTlMgLyAyKSkgewogCQkJU0VfREVCVUcoREJHX0xWTF84LAotCQkJCSJGVyByZXBvcnRlZCBNQVggQ1hOUyBhcyAlZCBcdCIKKwkJCQkiRlcgcmVwb3J0ZWQgTUFYIENYTlMgYXMgJWRcdCIKIAkJCQkiTWF4IFN1cHBvcnRlZCA9ICVkLlxuIiwKIAkJCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX2NvdW50LAogCQkJCUJFMl9NQVhfU0VTU0lPTlMpOwpAQCAtNTgsMTQgKzU4LDE0IEBACiAJCX0KIAl9IGVsc2UgewogCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKLQkJCSAgICAgIkZhaWxlZCBpbiBtZ210X2dldF9md19jb25maWcgXG4iKTsKKwkJCSAgICAgIkZhaWxlZCBpbiBtZ210X2dldF9md19jb25maWdcbiIpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXVuc2lnbmVkIGNoYXIgbWdtdF9jaGVja19zdXBwb3J0ZWRfZncoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKK2ludCBtZ210X2NoZWNrX3N1cHBvcnRlZF9mdyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCSAgICAgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgYmVfZG1hX21lbSBub25lbWJfY21kOwpAQCAtODEsNyArODEsNyBAQAogCQlTRV9ERUJVRyhEQkdfTFZMXzEsCiAJCQkgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3IgogCQkJICJcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAlub25lbWJfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX21nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzKTsKIAlyZXEgPSBub25lbWJfY21kLnZhOwpAQCAtMTE3LDggKzExNyw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCi11bnNpZ25lZCBjaGFyIG1nbXRfZXBmd19jbGVhbnVwKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgc2hvcnQgY2h1dGUpCitpbnQgbWdtdF9lcGZ3X2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBzaG9ydCBjaHV0ZSkKIHsKIAlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CiAJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21jY3EocGhiYSk7CkBAIC0xNDQsMTEgKzE0MywxMiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXVuc2lnbmVkIGNoYXIgbWdtdF9pbnZhbGlkYXRlX2ljZHMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAordW5zaWduZWQgaW50ICBtZ210X2ludmFsaWRhdGVfaWNkcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCQkJc3RydWN0IGludmFsaWRhdGVfY29tbWFuZF90YWJsZSAqaW52X3RibCwKLQkJCQl1bnNpZ25lZCBpbnQgbnVtX2ludmFsaWRhdGUsIHVuc2lnbmVkIGludCBjaWQpCisJCQkJdW5zaWduZWQgaW50IG51bV9pbnZhbGlkYXRlLCB1bnNpZ25lZCBpbnQgY2lkLAorCQkJCXN0cnVjdCBiZV9kbWFfbWVtICpub25lbWJfY21kKQorCiB7Ci0Jc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfc2dlICpzZ2U7CkBAIC0xNjIsMTcgKzE2Miw3IEBACiAJCXJldHVybiB0YWc7CiAJfQogCi0Jbm9uZW1iX2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGN0cmwtPnBkZXYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRzX3BhcmFtc19pbiksCi0JCQkJJm5vbmVtYl9jbWQuZG1hKTsKLQlpZiAobm9uZW1iX2NtZC52YSA9PSBOVUxMKSB7Ci0JCVNFX0RFQlVHKERCR19MVkxfMSwKLQkJCSAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWdtdF9pbnZhbGlkYXRlX2ljZHNcbiIpOwotCQlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW5vbmVtYl9jbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4pOwotCXJlcSA9IG5vbmVtYl9jbWQudmE7CisJcmVxID0gbm9uZW1iX2NtZC0+dmE7CiAJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKHBoYmEpOwogCXNnZSA9IG5vbmVtYmVkZGVkX3NnbCh3cmIpOwpAQCAtMTkwLDE5ICsxODAsMTYgQEAKIAkJcmVxLT5pY2RfY291bnQrKzsKIAkJaW52X3RibCsrOwogCX0KLQlzZ2UtPnBhX2hpID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhub25lbWJfY21kLmRtYSkpOwotCXNnZS0+cGFfbG8gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLmRtYSAmIDB4RkZGRkZGRkYpOwotCXNnZS0+bGVuID0gY3B1X3RvX2xlMzIobm9uZW1iX2NtZC5zaXplKTsKKwlzZ2UtPnBhX2hpID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhub25lbWJfY21kLT5kbWEpKTsKKwlzZ2UtPnBhX2xvID0gY3B1X3RvX2xlMzIobm9uZW1iX2NtZC0+ZG1hICYgMHhGRkZGRkZGRik7CisJc2dlLT5sZW4gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLT5zaXplKTsKIAogCWJlX21jY19ub3RpZnkocGhiYSk7CiAJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JaWYgKG5vbmVtYl9jbWQudmEpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoY3RybC0+cGRldiwgbm9uZW1iX2NtZC5zaXplLAotCQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CiAJcmV0dXJuIHRhZzsKIH0KIAotdW5zaWduZWQgY2hhciBtZ210X2ludmFsaWRhdGVfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCit1bnNpZ25lZCBpbnQgbWdtdF9pbnZhbGlkYXRlX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJCQkgc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXAsCiAJCQkJCSB1bnNpZ25lZCBzaG9ydCBjaWQsCiAJCQkJCSB1bnNpZ25lZCBzaG9ydCBpc3N1ZV9yZXNldCwKQEAgLTIzOSw3ICsyMjYsNyBAQAogCXJldHVybiB0YWc7CiB9CiAKLXVuc2lnbmVkIGNoYXIgbWdtdF91cGxvYWRfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCit1bnNpZ25lZCBpbnQgbWdtdF91cGxvYWRfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCQkJdW5zaWduZWQgc2hvcnQgY2lkLCB1bnNpZ25lZCBpbnQgdXBsb2FkX2ZsYWcpCiB7CiAJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOwpAQCAtMjY5LDcgKzI1Niw5IEBACiAKIGludCBtZ210X29wZW5fY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCQkgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKLQkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCkKKwkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCwKKwkJCSBzdHJ1Y3QgYmVfZG1hX21lbSAqbm9uZW1iX2NtZCkKKwogewogCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CkBAIC0yODUsNiArMjc0LDcgQEAKIAl1bnNpZ25lZCBpbnQgdGFnID0gMDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBzaG9ydCBjaWQgPSBiZWlzY3NpX2VwLT5lcF9jaWQ7CisJc3RydWN0IGJlX3NnZSAqc2dlOwogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CiAJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwpAQCAtMzAwLDEwICsyOTAsMTQgQEAKIAkJcmV0dXJuIHRhZzsKIAl9CiAJd3JiID0gd3JiX2Zyb21fbWNjcShwaGJhKTsKLQlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKwlzZ2UgPSBub25lbWJlZGRlZF9zZ2wod3JiKTsKKworCXJlcSA9IG5vbmVtYl9jbWQtPnZhOworCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CiAJd3JiLT50YWcwIHw9IHRhZzsKIAotCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAxKTsKIAliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJLAogCQkJICAgT1BDT0RFX0NPTU1PTl9JU0NTSV9UQ1BfQ09OTkVDVF9BTkRfT0ZGTE9BRCwKIAkJCSAgIHNpemVvZigqcmVxKSk7CkBAIC0zMzEsNiArMzI1LDcgQEAKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgInVua25vd24gYWRkciBmYW1pbHkgJWRcbiIsCiAJCQkgICAgIGRzdF9hZGRyLT5zYV9mYW1pbHkpOwogCQlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwkJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAogCX0KQEAgLTMzOSwxMyArMzM0LDE2IEBACiAJaWYgKHBoYmEtPm54dF9jcWlkID09IHBoYmEtPm51bV9jcHVzKQogCQlwaGJhLT5ueHRfY3FpZCA9IDA7CiAJcmVxLT5jcV9pZCA9IHBod2lfY29udGV4dC0+YmVfY3FbaV0uaWQ7Ci0JU0VfREVCVUcoREJHX0xWTF84LCAiaT0lZCBjcV9pZD0lZCBcbiIsIGksIHJlcS0+Y3FfaWQpOworCVNFX0RFQlVHKERCR19MVkxfOCwgImk9JWQgY3FfaWQ9JWRcbiIsIGksIHJlcS0+Y3FfaWQpOwogCXJlcS0+ZGVmcV9pZCA9IGRlZl9oZHJfaWQ7CiAJcmVxLT5oZHJfcmluZ19pZCA9IGRlZl9oZHJfaWQ7CiAJcmVxLT5kYXRhX3JpbmdfaWQgPSBkZWZfZGF0YV9pZDsKIAlyZXEtPmRvX29mZmxvYWQgPSAxOwogCXJlcS0+ZGF0YW91dF90ZW1wbGF0ZV9wYS5sbyA9IHB0ZW1wbGF0ZV9hZGRyZXNzLT5sbzsKIAlyZXEtPmRhdGFvdXRfdGVtcGxhdGVfcGEuaGkgPSBwdGVtcGxhdGVfYWRkcmVzcy0+aGk7CisJc2dlLT5wYV9oaSA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMobm9uZW1iX2NtZC0+ZG1hKSk7CisJc2dlLT5wYV9sbyA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQtPmRtYSAmIDB4RkZGRkZGRkYpOworCXNnZS0+bGVuID0gY3B1X3RvX2xlMzIobm9uZW1iX2NtZC0+c2l6ZSk7CiAJYmVfbWNjX25vdGlmeShwaGJhKTsKIAlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKIAlyZXR1cm4gdGFnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmgKaW5kZXggM2QzMTZiOC4uYjlhY2VkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5oCkBAIC04NiwxNiArODYsMTkgQEAKIAlzdHJ1Y3QgbWNjX3dyYl9wYXlsb2FkIHBheWxvYWQ7CiB9OwogCi11bnNpZ25lZCBjaGFyIG1nbXRfZXBmd19jbGVhbnVwKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgc2hvcnQgY2h1dGUpOwotaW50IG1nbXRfb3Blbl9jb25uZWN0aW9uKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKLQkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCk7CitpbnQgbWdtdF9lcGZ3X2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBzaG9ydCBjaHV0ZSk7CitpbnQgbWdtdF9vcGVuX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCisJCQkgc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXAsCisJCQkgc3RydWN0IGJlX2RtYV9tZW0gKm5vbmVtYl9jbWQpOwogCi11bnNpZ25lZCBjaGFyIG1nbXRfdXBsb2FkX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAordW5zaWduZWQgaW50IG1nbXRfdXBsb2FkX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgY2lkLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHVwbG9hZF9mbGFnKTsKLXVuc2lnbmVkIGNoYXIgbWdtdF9pbnZhbGlkYXRlX2ljZHMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAordW5zaWduZWQgaW50IG1nbXRfaW52YWxpZGF0ZV9pY2RzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKIAkJCQlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kX3RhYmxlICppbnZfdGJsLAotCQkJCXVuc2lnbmVkIGludCBudW1faW52YWxpZGF0ZSwgdW5zaWduZWQgaW50IGNpZCk7CisJCQkJdW5zaWduZWQgaW50IG51bV9pbnZhbGlkYXRlLCB1bnNpZ25lZCBpbnQgY2lkLAorCQkJCXN0cnVjdCBiZV9kbWFfbWVtICpub25lbWJfY21kKTsKIAogc3RydWN0IGlzY3NpX2ludmFsaWRhdGVfY29ubmVjdGlvbl9wYXJhbXNfaW4gewogCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CkBAIC0yMzcsMTAgKzI0MCwxMCBAQAogCXUxNiBjaWRfdmxkOwogfTsKIAotdW5zaWduZWQgY2hhciBtZ210X2dldF9md19jb25maWcoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKK2ludCBtZ210X2dldF9md19jb25maWcoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKIAkJCQkgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKIAotdW5zaWduZWQgY2hhciBtZ210X2ludmFsaWRhdGVfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCit1bnNpZ25lZCBpbnQgbWdtdF9pbnZhbGlkYXRlX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJCQkgc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXAsCiAJCQkJCSB1bnNpZ25lZCBzaG9ydCBjaWQsCiAJCQkJCSB1bnNpZ25lZCBzaG9ydCBpc3N1ZV9yZXNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYmZhL01ha2VmaWxlCmluZGV4IDE3ZTA2Y2EuLmFjM2ZkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX0JGQV9GQykgOj0gYmZhLm8KIAogYmZhLXkgOj0gYmZhZC5vIGJmYWRfaW50ci5vIGJmYWRfb3MubyBiZmFkX2ltLm8gYmZhZF9hdHRyLm8gYmZhZF9md2ltZy5vCi0KK2JmYS15ICs9IGJmYWRfZGVidWdmcy5vCiBiZmEteSArPSBiZmFfY29yZS5vIGJmYV9pb2MubyBiZmFfaW9jX2N0Lm8gYmZhX2lvY19jYi5vIGJmYV9pb2NmYy5vIGJmYV9mY3hwLm8KIGJmYS15ICs9IGJmYV9scHMubyBiZmFfaHdfY2IubyBiZmFfaHdfY3QubyBiZmFfaW50ci5vIGJmYV90aW1lci5vIGJmYV9ycG9ydC5vCiBiZmEteSArPSBiZmFfZmNwb3J0Lm8gYmZhX3BvcnQubyBiZmFfdWYubyBiZmFfc2dwZy5vIGJmYV9tb2R1bGUubyBiZmFfaW9pbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jYl9pb2ltX21hY3Jvcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY2JfaW9pbV9tYWNyb3MuaAppbmRleCA1M2E2MTZmLi4zOTA2ZWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jYl9pb2ltX21hY3Jvcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NiX2lvaW1fbWFjcm9zLmgKQEAgLTE3MSw2ICsxNzEsMTEgQEAKIAlyZXR1cm4gY21uZC0+Y21kX2xlbjsKIH0KIAotCisvKioKKyAqIEFzc2lnbiBxdWV1ZSB0byBiZSB1c2VkIGZvciB0aGUgSS9PIHJlcXVlc3QuIFRoaXMgdmFsdWUgZGVwZW5kcyBvbiB3aGV0aGVyCisgKiB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgcXVldWVzIHZpYSBhbnkgc3BlY2lmaWMgYWxnb3JpdGhtLiBDdXJyZW50bHksCisgKiB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgYmZhX2NiX2lvaW1fZ2V0X3JlcXEoX19kaW8pIEJGQV9GQUxTRQogCiAjZW5kaWYgLyogX19CRkFfSENCX0lPSU1fTUFDUk9TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jCmluZGV4IDNhN2IzZjguLjc2ZmE1YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMKQEAgLTMzMyw5ICszMzMsMTAgQEAKIAkJe0JGQV9QQ0lfVkVORE9SX0lEX0JST0NBREUsIEJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMlB9LAogCQl7QkZBX1BDSV9WRU5ET1JfSURfQlJPQ0FERSwgQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUH0sCiAJCXtCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFLCBCRkFfUENJX0RFVklDRV9JRF9DVH0sCisJCXtCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFLCBCRkFfUENJX0RFVklDRV9JRF9DVF9GQ30sCiAJfTsKIAotCSpucGNpaWRzID0gc2l6ZW9mKF9fcGNpaWRzKSAvIHNpemVvZihfX3BjaWlkc1swXSk7CisJKm5wY2lpZHMgPSBBUlJBWV9TSVpFKF9fcGNpaWRzKTsKIAkqcGNpaWRzID0gX19wY2lpZHM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCmluZGV4IDc5MGM5NDUuLjhjNzAzZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwpAQCAtODAsMTEgKzgwLDYgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJmYV9mY3BpbV9pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSkKLXsKLX0KLQotc3RhdGljIHZvaWQKIGJmYV9mY3BpbV9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpCiB7CiAJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CkBAIC0xNzIsNCArMTY3LDI4IEBACiAJcmV0dXJuIGZjcGltLT5xX2RlcHRoOwogfQogCit2b2lkCitiZmFfZmNwaW1fdXBkYXRlX2lvcmVkaXJlY3Qoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhX2Jvb2xlYW5fdCBpb3JlZGlyZWN0OwogCisJLyoKKwkgKiBJTyByZWRpcmVjdGlvbiBpcyB0dXJuZWQgb2ZmIHdoZW4gUW9TIGlzIGVuYWJsZWQgYW5kIHZpY2UgdmVyc2EKKwkgKi8KKwlpb3JlZGlyZWN0ID0gYmZhX2ZjcG9ydF9pc19xb3NfZW5hYmxlZChiZmEpID8gQkZBX0ZBTFNFIDogQkZBX1RSVUU7CisKKwkvKgorCSAqIE5vdGlmeSB0aGUgYmZhZCBtb2R1bGUgb2YgYSBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UgaW4KKwkgKiBJTyByZWRpcmVjdGlvbiBjYXBhYmlsaXR5LCBkdWUgdG8gYSBRb1Mgc3RhdGUgY2hhbmdlLiBiZmFkIHdpbGwKKwkgKiBjaGVjayBvbiB0aGUgc3VwcG9ydCBmb3IgaW8gcmVkaXJlY3Rpb24gYW5kIHVwZGF0ZSB0aGUKKwkgKiBmY3BpbSdzIGlvcmVkaXJlY3Qgc3RhdGUgYWNjb3JkaW5nbHkuCisJICovCisJYmZhX2NiX2lvcmVkaXJlY3Rfc3RhdGVfY2hhbmdlKCh2b2lkICopKGJmYS0+YmZhZCksIGlvcmVkaXJlY3QpOworfQorCit2b2lkCitiZmFfZmNwaW1fc2V0X2lvcmVkaXJlY3Qoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3Qgc3RhdGUpCit7CisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJZmNwaW0tPmlvcmVkaXJlY3QgPSBzdGF0ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltX3ByaXYuaAppbmRleCA1Y2Y0MTg0Li43NjI1MTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbV9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW1fcHJpdi5oCkBAIC00OSw3ICs0OSw4IEBACiAJaW50CQkJbnVtX3Rza2ltX3JlcXM7CiAJdTMyCQlwYXRoX3RvdjsKIAl1MTYJCXFfZGVwdGg7Ci0JdTE2CQlyc3ZkOworCXU4ICAgICAgICAgICAgICByZXFxOyAgICAgICAgICAgLyogUmVxdWVzdCBxdWV1ZSB0byBiZSB1c2VkICovCisJdTgJCXJzdmQ7CiAJc3RydWN0IGxpc3RfaGVhZCAJaXRuaW1fcTsgICAgICAgIC8qICBxdWV1ZSBvZiBhY3RpdmUgaXRuaW0gICAgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIAlpb2ltX2ZyZWVfcTsgICAgLyogIGZyZWUgSU8gcmVzb3VyY2VzICAgICAgICAqLwogCXN0cnVjdCBsaXN0X2hlYWQgCWlvaW1fcmVzZnJlZV9xOyAvKiAgSU9zIHdhaXRpbmcgZm9yIGYvdyAgICAgICovCkBAIC01OCw2ICs1OSw3IEBACiAJdTMyCWlvc19hY3RpdmU7CS8qICBjdXJyZW50IGFjdGl2ZSBJT3MJICAgICAgKi8KIAl1MzIJZGVsYXlfY29tcDsKIAlzdHJ1Y3QgYmZhX2ZjcGltX3N0YXRzX3Mgc3RhdHM7CisJYmZhX2Jvb2xlYW5fdCAgICAgICAgICAgaW9yZWRpcmVjdDsKIH07CiAKIHN0cnVjdCBiZmFfaW9pbV9zOwpAQCAtODIsNiArODQsNyBAQAogCXN0cnVjdCBiZmFfY2JfcWVfcyBoY2JfcWU7CS8qICBiZmEgY2FsbGJhY2sgcWVsZW0gICAgICAgKi8KIAliZmFfY2JfY2Jmbl90IGlvX2NiZm47CQkvKiAgSU8gY29tcGxldGlvbiBoYW5kbGVyICAgICovCiAJc3RydWN0IGJmYV9pb2ltX3NwX3MgKmlvc3A7CS8qICBzbG93LXBhdGggSU8gaGFuZGxpbmcgICAgKi8KKwl1OCByZXFxOyAgICAgICAgICAgCQkvKiBSZXF1ZXN0IHF1ZXVlIGZvciBJL08gICAgKi8KIH07CiAKIHN0cnVjdCBiZmFfaW9pbV9zcF9zIHsKQEAgLTE0MSw2ICsxNDQsNyBAQAogCXN0cnVjdCBiZmFfcmVxcV93YWl0X3MgcmVxcV93YWl0OyAvKiAgdG8gd2FpdCBmb3Igcm9vbSBpbiByZXFxICovCiAJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW07CS8qICBmY3BpbSBtb2R1bGUgICAgICAgICAgICAgICAgKi8KIAlzdHJ1Y3QgYmZhX2l0bmltX2hhbF9zdGF0c19zCXN0YXRzOworCXN0cnVjdCBiZmFfaXRuaW1fbGF0ZW5jeV9zICBpb19sYXRlbmN5OwogfTsKIAogI2RlZmluZSBiZmFfaXRuaW1faXNfb25saW5lKF9pdG5pbSkgKChfaXRuaW0pLT5pc19vbmxpbmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCmluZGV4IGM1ODk0ODguLmYwOTMzZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YmZhLmg+CiAjaW5jbHVkZSA8YmZhX3N2Yy5oPgogI2luY2x1ZGUgPGJmaS9iZmlfcHBvcnQuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX3BiYy5oPgogI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgogI2luY2x1ZGUgPGFlbi9iZmFfYWVuLmg+CiAjaW5jbHVkZSA8Y3MvYmZhX3Bsb2cuaD4KQEAgLTMxMCwxMCArMzExLDEyIEBACiAKIAkJaWYgKCFiZmFfaW9jX2dldF9mY21vZGUoJmZjcG9ydC0+YmZhLT5pb2MpKSB7CiAKLQkJCWJmYV90cmMoZmNwb3J0LT5iZmEsIHBldmVudC0+bGlua19zdGF0ZS5mY2YuZmlwZW5hYmxlZCk7Ci0JCQliZmFfdHJjKGZjcG9ydC0+YmZhLCBwZXZlbnQtPmxpbmtfc3RhdGUuZmNmLmZpcGZhaWxlZCk7CisJCQliZmFfdHJjKGZjcG9ydC0+YmZhLAorCQkJCXBldmVudC0+bGlua19zdGF0ZS52Y19mY2YuZmNmLmZpcGVuYWJsZWQpOworCQkJYmZhX3RyYyhmY3BvcnQtPmJmYSwKKwkJCQlwZXZlbnQtPmxpbmtfc3RhdGUudmNfZmNmLmZjZi5maXBmYWlsZWQpOwogCi0JCQlpZiAocGV2ZW50LT5saW5rX3N0YXRlLmZjZi5maXBmYWlsZWQpCisJCQlpZiAocGV2ZW50LT5saW5rX3N0YXRlLnZjX2ZjZi5mY2YuZmlwZmFpbGVkKQogCQkJCWJmYV9wbG9nX3N0cihmY3BvcnQtPmJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUwsCiAJCQkJCUJGQV9QTF9FSURfRklQX0ZDRl9ESVNDLCAwLAogCQkJCQkiRklQIEZDRiBEaXNjb3ZlcnkgRmFpbGVkIik7CkBAIC04ODgsNiArODkxLDcgQEAKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOwogCXN0cnVjdCBiZmFfcHBvcnRfY2ZnX3MgKnBvcnRfY2ZnID0gJmZjcG9ydC0+Y2ZnOwogCXN0cnVjdCBiZmFfZmNwb3J0X2xuX3MgKmxuID0gJmZjcG9ydC0+bG47CisJc3RydWN0IGJmYV90aW1ldmFsX3MgdHY7CiAKIAliZmFfb3NfbWVtc2V0KGZjcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfZmNwb3J0X3MpKTsKIAlmY3BvcnQtPmJmYSA9IGJmYTsKQEAgLTg5OSw2ICs5MDMsMTIgQEAKIAliZmFfc21fc2V0X3N0YXRlKGxuLCBiZmFfZmNwb3J0X2xuX3NtX2RuKTsKIAogCS8qKgorCSAqIGluaXRpYWxpemUgdGltZSBzdGFtcCBmb3Igc3RhdHMgcmVzZXQKKwkgKi8KKwliZmFfb3NfZ2V0dGltZW9mZGF5KCZ0dik7CisJZmNwb3J0LT5zdGF0c19yZXNldF90aW1lID0gdHYudHZfc2VjOworCisJLyoqCiAJICogaW5pdGlhbGl6ZSBhbmQgc2V0IGRlZmF1bHQgY29uZmlndXJhdGlvbgogCSAqLwogCXBvcnRfY2ZnLT50b3BvbG9neSA9IEJGQV9QUE9SVF9UT1BPTE9HWV9QMlA7CkBAIC05MTIsMjUgKzkyMiw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1iZmFfZmNwb3J0X2luaXRkb25lKHN0cnVjdCBiZmFfcyAqYmZhKQotewotCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHBvcnQgYXR0cmlidXRlcyBmcm9tIElPQyBoYXJkd2FyZSBkYXRhLgotCSAqLwotCWJmYV9mY3BvcnRfc2V0X3d3bnMoZmNwb3J0KTsKLQlpZiAoZmNwb3J0LT5jZmcubWF4ZnJzaXplID09IDApCi0JCWZjcG9ydC0+Y2ZnLm1heGZyc2l6ZSA9IGJmYV9pb2NfbWF4ZnJzaXplKCZiZmEtPmlvYyk7Ci0JZmNwb3J0LT5jZmcucnhfYmJjcmVkaXQgPSBiZmFfaW9jX3J4X2JiY3JlZGl0KCZiZmEtPmlvYyk7Ci0JZmNwb3J0LT5zcGVlZF9zdXAgPSBiZmFfaW9jX3NwZWVkX3N1cCgmYmZhLT5pb2MpOwotCi0JYmZhX2Fzc2VydChmY3BvcnQtPmNmZy5tYXhmcnNpemUpOwotCWJmYV9hc3NlcnQoZmNwb3J0LT5jZmcucnhfYmJjcmVkaXQpOwotCWJmYV9hc3NlcnQoZmNwb3J0LT5zcGVlZF9zdXApOwotfQotCi1zdGF0aWMgdm9pZAogYmZhX2ZjcG9ydF9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpCiB7CiB9CkBAIC05NzEsMTQgKzk2MiwxNSBAQAogCWZjcG9ydC0+dG9wb2xvZ3kgPSBwZXZlbnQtPmxpbmtfc3RhdGUudG9wb2xvZ3k7CiAKIAlpZiAoZmNwb3J0LT50b3BvbG9neSA9PSBCRkFfUFBPUlRfVE9QT0xPR1lfTE9PUCkKLQkJZmNwb3J0LT5teWFscGEgPQotCQkJcGV2ZW50LT5saW5rX3N0YXRlLnRsLmxvb3BfaW5mby5teWFscGE7CisJCWZjcG9ydC0+bXlhbHBhID0gMDsKIAogCS8qCiAJICogUW9TIERldGFpbHMKIAkgKi8KIAliZmFfb3NfYXNzaWduKGZjcG9ydC0+cW9zX2F0dHIsIHBldmVudC0+bGlua19zdGF0ZS5xb3NfYXR0cik7Ci0JYmZhX29zX2Fzc2lnbihmY3BvcnQtPnFvc192Y19hdHRyLCBwZXZlbnQtPmxpbmtfc3RhdGUucW9zX3ZjX2F0dHIpOworCWJmYV9vc19hc3NpZ24oZmNwb3J0LT5xb3NfdmNfYXR0ciwKKwkJcGV2ZW50LT5saW5rX3N0YXRlLnZjX2ZjZi5xb3NfdmNfYXR0cik7CisKIAogCWJmYV90cmMoZmNwb3J0LT5iZmEsIGZjcG9ydC0+c3BlZWQpOwogCWJmYV90cmMoZmNwb3J0LT5iZmEsIGZjcG9ydC0+dG9wb2xvZ3kpOwpAQCAtMTE0NSwxNiArMTEzNywyMiBAQAogCiAJaWYgKGNvbXBsZXRlKSB7CiAJCWlmIChmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQlzdHJ1Y3QgYmZhX3RpbWV2YWxfcyB0djsKIAogCQkJLyogU3dhcCBGQyBRb1Mgb3IgRkNvRSBzdGF0cyAqLwotCQkJaWYgKGJmYV9pb2NfZ2V0X2ZjbW9kZSgmZmNwb3J0LT5iZmEtPmlvYykpCisJCQlpZiAoYmZhX2lvY19nZXRfZmNtb2RlKCZmY3BvcnQtPmJmYS0+aW9jKSkgewogCQkJCWJmYV9mY3BvcnRfcW9zX3N0YXRzX3N3YXAoCiAJCQkJCSZmY3BvcnQtPnN0YXRzX3JldC0+ZmNxb3MsCiAJCQkJCSZmY3BvcnQtPnN0YXRzLT5mY3Fvcyk7Ci0JCQllbHNlCisJCQl9IGVsc2UgewogCQkJCWJmYV9mY3BvcnRfZmNvZV9zdGF0c19zd2FwKAogCQkJCQkmZmNwb3J0LT5zdGF0c19yZXQtPmZjb2UsCiAJCQkJCSZmY3BvcnQtPnN0YXRzLT5mY29lKTsKKworCQkJCWJmYV9vc19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCQlmY3BvcnQtPnN0YXRzX3JldC0+ZmNvZS5zZWNzX3Jlc2V0ID0KKwkJCQkJdHYudHZfc2VjIC0gZmNwb3J0LT5zdGF0c19yZXNldF90aW1lOworCQkJfQogCQl9CiAJCWZjcG9ydC0+c3RhdHNfY2JmbihmY3BvcnQtPnN0YXRzX2NiYXJnLCBmY3BvcnQtPnN0YXRzX3N0YXR1cyk7CiAJfSBlbHNlIHsKQEAgLTEyMTAsNiArMTIwOCwxNCBAQAogCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IGNiYXJnOwogCiAJaWYgKGNvbXBsZXRlKSB7CisJCXN0cnVjdCBiZmFfdGltZXZhbF9zIHR2OworCisJCS8qKgorCQkgKiByZS1pbml0aWFsaXplIHRpbWUgc3RhbXAgZm9yIHN0YXRzIHJlc2V0CisJCSAqLworCQliZmFfb3NfZ2V0dGltZW9mZGF5KCZ0dik7CisJCWZjcG9ydC0+c3RhdHNfcmVzZXRfdGltZSA9IHR2LnR2X3NlYzsKKwogCQlmY3BvcnQtPnN0YXRzX2NiZm4oZmNwb3J0LT5zdGF0c19jYmFyZywgZmNwb3J0LT5zdGF0c19zdGF0dXMpOwogCX0gZWxzZSB7CiAJCWZjcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9GQUxTRTsKQEAgLTEyNjMsNiArMTI2OSwyOSBAQAogICovCiAKIC8qKgorICogQ2FsbGVkIHRvIGluaXRpYWxpemUgcG9ydCBhdHRyaWJ1dGVzCisgKi8KK3ZvaWQKK2JmYV9mY3BvcnRfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOworCisJLyoqCisJICogSW5pdGlhbGl6ZSBwb3J0IGF0dHJpYnV0ZXMgZnJvbSBJT0MgaGFyZHdhcmUgZGF0YS4KKwkgKi8KKwliZmFfZmNwb3J0X3NldF93d25zKGZjcG9ydCk7CisJaWYgKGZjcG9ydC0+Y2ZnLm1heGZyc2l6ZSA9PSAwKQorCQlmY3BvcnQtPmNmZy5tYXhmcnNpemUgPSBiZmFfaW9jX21heGZyc2l6ZSgmYmZhLT5pb2MpOworCWZjcG9ydC0+Y2ZnLnJ4X2JiY3JlZGl0ID0gYmZhX2lvY19yeF9iYmNyZWRpdCgmYmZhLT5pb2MpOworCWZjcG9ydC0+c3BlZWRfc3VwID0gYmZhX2lvY19zcGVlZF9zdXAoJmJmYS0+aW9jKTsKKworCWJmYV9hc3NlcnQoZmNwb3J0LT5jZmcubWF4ZnJzaXplKTsKKwliZmFfYXNzZXJ0KGZjcG9ydC0+Y2ZnLnJ4X2JiY3JlZGl0KTsKKwliZmFfYXNzZXJ0KGZjcG9ydC0+c3BlZWRfc3VwKTsKK30KKworCisvKioKICAqIEZpcm13YXJlIG1lc3NhZ2UgaGFuZGxlci4KICAqLwogdm9pZApAQCAtMTM1NSw2ICsxMzg0LDE3IEBACiBiZmFfZmNwb3J0X2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOworCXN0cnVjdCBiZmFfaW9jZmNfcyAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zICpjZmdyc3AgPSBpb2NmYy0+Y2ZncnNwOworCisJLyogaWYgcG9ydCBpcyBQQkMgZGlzYWJsZWQsIHJldHVybiBlcnJvciAqLworCWlmIChjZmdyc3AtPnBiY19jZmcucG9ydF9lbmFibGVkID09IEJGSV9QQkNfUE9SVF9ESVNBQkxFRCkgeworCQliZmFfdHJjKGJmYSwgZmNwb3J0LT5wd3duKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfUEJDOworCX0KKworCWlmIChiZmFfaW9jX2lzX2Rpc2FibGVkKCZiZmEtPmlvYykpCisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19ESVNBQkxFRDsKIAogCWlmIChmY3BvcnQtPmRpYWdfYnVzeSkKIAkJcmV0dXJuIEJGQV9TVEFUVVNfRElBR19CVVNZOwpAQCAtMTM2OSw2ICsxNDA5LDE2IEBACiBiZmFfc3RhdHVzX3QKIGJmYV9mY3BvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOworCXN0cnVjdCBiZmFfaW9jZmNfcyAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zICpjZmdyc3AgPSBpb2NmYy0+Y2ZncnNwOworCisJLyogaWYgcG9ydCBpcyBQQkMgZGlzYWJsZWQsIHJldHVybiBlcnJvciAqLworCWlmIChjZmdyc3AtPnBiY19jZmcucG9ydF9lbmFibGVkID09IEJGSV9QQkNfUE9SVF9ESVNBQkxFRCkgeworCQliZmFfdHJjKGJmYSwgZmNwb3J0LT5wd3duKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfUEJDOworCX0KKwogCWJmYV9zbV9zZW5kX2V2ZW50KEJGQV9GQ1BPUlRfTU9EKGJmYSksIEJGQV9GQ1BPUlRfU01fRElTQUJMRSk7CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CkBAIC0xNTU5LDEyICsxNjA5LDE3IEBACiBiZmFfZmNwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyAqYXR0cikKIHsKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOworCXN0cnVjdCBiZmFfaW9jZmNfcyAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zICpjZmdyc3AgPSBpb2NmYy0+Y2ZncnNwOwogCiAJYmZhX29zX21lbXNldChhdHRyLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MpKTsKIAogCWF0dHItPm53d24gPSBmY3BvcnQtPm53d247CiAJYXR0ci0+cHd3biA9IGZjcG9ydC0+cHd3bjsKIAorCWF0dHItPmZhY3Rvcnlwd3duID0gIGJmYV9pb2NfZ2V0X21mZ19wd3duKCZiZmEtPmlvYyk7CisJYXR0ci0+ZmFjdG9yeW53d24gPSAgYmZhX2lvY19nZXRfbWZnX253d24oJmJmYS0+aW9jKTsKKwogCWJmYV9vc19tZW1jcHkoJmF0dHItPnBwb3J0X2NmZywgJmZjcG9ydC0+Y2ZnLAogCQkgICAgICBzaXplb2Yoc3RydWN0IGJmYV9wcG9ydF9jZmdfcykpOwogCS8qCkBAIC0xNTkwLDExICsxNjQ1LDE4IEBACiAKIAlhdHRyLT5wcG9ydF9jZmcucGF0aF90b3YgPSBiZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KGJmYSk7CiAJYXR0ci0+cHBvcnRfY2ZnLnFfZGVwdGggPSBiZmFfZmNwaW1fcWRlcHRoX2dldChiZmEpOwotCWF0dHItPnBvcnRfc3RhdGUgPSBiZmFfc21fdG9fc3RhdGUoaGFsX3Bwb3J0X3NtX3RhYmxlLCBmY3BvcnQtPnNtKTsKLQlpZiAoYmZhX2lvY19pc19kaXNhYmxlZCgmZmNwb3J0LT5iZmEtPmlvYykpCi0JCWF0dHItPnBvcnRfc3RhdGUgPSBCRkFfUFBPUlRfU1RfSU9DRElTOwotCWVsc2UgaWYgKGJmYV9pb2NfZndfbWlzbWF0Y2goJmZjcG9ydC0+YmZhLT5pb2MpKQotCQlhdHRyLT5wb3J0X3N0YXRlID0gQkZBX1BQT1JUX1NUX0ZXTUlTTUFUQ0g7CisKKwkvKiBQQkMgRGlzYWJsZWQgU3RhdGUgKi8KKwlpZiAoY2ZncnNwLT5wYmNfY2ZnLnBvcnRfZW5hYmxlZCA9PSBCRklfUEJDX1BPUlRfRElTQUJMRUQpCisJCWF0dHItPnBvcnRfc3RhdGUgPSBCRkFfUFBPUlRfU1RfUFJFQk9PVF9ESVNBQkxFRDsKKwllbHNlIHsKKwkJYXR0ci0+cG9ydF9zdGF0ZSA9IGJmYV9zbV90b19zdGF0ZSgKKwkJCQloYWxfcHBvcnRfc21fdGFibGUsIGZjcG9ydC0+c20pOworCQlpZiAoYmZhX2lvY19pc19kaXNhYmxlZCgmZmNwb3J0LT5iZmEtPmlvYykpCisJCQlhdHRyLT5wb3J0X3N0YXRlID0gQkZBX1BQT1JUX1NUX0lPQ0RJUzsKKwkJZWxzZSBpZiAoYmZhX2lvY19md19taXNtYXRjaCgmZmNwb3J0LT5iZmEtPmlvYykpCisJCQlhdHRyLT5wb3J0X3N0YXRlID0gQkZBX1BQT1JUX1NUX0ZXTUlTTUFUQ0g7CisJfQogfQogCiAjZGVmaW5lIEJGQV9GQ1BPUlRfU1RBVFNfVE9WCTEwMDAKQEAgLTE4MDEsOCArMTg2MywxMyBAQAogCiAJYmZhX3RyYyhiZmEsIGlvY190eXBlKTsKIAotCWlmIChpb2NfdHlwZSA9PSBCRkFfSU9DX1RZUEVfRkMpCisJaWYgKGlvY190eXBlID09IEJGQV9JT0NfVFlQRV9GQykgewogCQlmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZCA9IG9uX29mZjsKKwkJLyoqCisJCSAqIE5vdGlmeSBmY3BpbSBvZiB0aGUgY2hhbmdlIGluIFFvUyBzdGF0ZQorCQkgKi8KKwkJYmZhX2ZjcGltX3VwZGF0ZV9pb3JlZGlyZWN0KGJmYSk7CisJfQogfQogCiB2b2lkCkBAIC0xODg2LDQgKzE5NTMsMTAgQEAKIAlyZXR1cm4gYmZhX3NtX2NtcF9zdGF0ZShCRkFfRkNQT1JUX01PRChiZmEpLCBiZmFfZmNwb3J0X3NtX2xpbmt1cCk7CiB9CiAKK2JmYV9ib29sZWFuX3QKK2JmYV9mY3BvcnRfaXNfcW9zX2VuYWJsZWQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoYmZhKTsKIAorCXJldHVybiBmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMKaW5kZXggMzUxNjE3Mi4uZDFhOTkyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAliZmFfYXR0YWNoX2ZjcyhiZmEpOwogCWZjYnVpbGRfaW5pdCgpOwogCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihmY3NfbW9kdWxlcykgLyBzaXplb2YoZmNzX21vZHVsZXNbMF0pOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmY3NfbW9kdWxlcyk7IGkrKykgewogCQltb2QgPSAmZmNzX21vZHVsZXNbaV07CiAJCWlmIChtb2QtPmF0dGFjaCkKIAkJCW1vZC0+YXR0YWNoKGZjcyk7CkBAIC05OSwxNCArOTksMjIgQEAKIHZvaWQKIGJmYV9mY3NfaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCiB7Ci0JaW50ICAgICAgICAgICAgIGk7CisJaW50IGksIG5wYmNfdnBvcnRzOwogCXN0cnVjdCBiZmFfZmNzX21vZF9zICAqbW9kOworCXN0cnVjdCBiZmlfcGJjX3Zwb3J0X3MgcGJjX3Zwb3J0c1tCRklfUEJDX01BWF9WUE9SVFNdOwogCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihmY3NfbW9kdWxlcykgLyBzaXplb2YoZmNzX21vZHVsZXNbMF0pOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmY3NfbW9kdWxlcyk7IGkrKykgewogCQltb2QgPSAmZmNzX21vZHVsZXNbaV07CiAJCWlmIChtb2QtPm1vZGluaXQpCiAJCQltb2QtPm1vZGluaXQoZmNzKTsKIAl9CisJLyogSW5pdGlhbGl6ZSBwYmMgdnBvcnRzICovCisJaWYgKCFmY3MtPm1pbl9jZmcpIHsKKwkJbnBiY192cG9ydHMgPQorCQkJYmZhX2lvY2ZjX2dldF9wYmNfdnBvcnRzKGZjcy0+YmZhLCBwYmNfdnBvcnRzKTsKKwkJZm9yIChpID0gMDsgaSA8IG5wYmNfdnBvcnRzOyBpKyspCisJCQliZmFfZmNiX3BiY192cG9ydF9jcmVhdGUoZmNzLT5iZmEtPmJmYWQsIHBiY192cG9ydHNbaV0pOworCX0KIH0KIAogLyoqCkBAIC0xNjMsMTMgKzE3MSwxMSBAQAogYmZhX2Zjc19leGl0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKIHsKIAlzdHJ1Y3QgYmZhX2Zjc19tb2RfcyAgKm1vZDsKLQlpbnQgICAgICAgICAgICAgbm1vZHMsIGk7CisJaW50IGk7CiAKIAliZmFfd2NfaW5pdCgmZmNzLT53YywgYmZhX2Zjc19leGl0X2NvbXAsIGZjcyk7CiAKLQlubW9kcyA9IHNpemVvZihmY3NfbW9kdWxlcykgLyBzaXplb2YoZmNzX21vZHVsZXNbMF0pOwotCi0JZm9yIChpID0gMDsgaSA8IG5tb2RzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmY3NfbW9kdWxlcyk7IGkrKykgewogCiAJCW1vZCA9ICZmY3NfbW9kdWxlc1tpXTsKIAkJaWYgKG1vZC0+bW9kZXhpdCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwppbmRleCA3YzEyNTFjLi4zNWRmMjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwpAQCAtMTM1LDYgKzEzNSw5IEBACiAJCWJmYV9mY3NfcG9ydF9kZWxldGVkKHBvcnQpOwogCQlicmVhazsKIAorCWNhc2UgQkZBX0ZDU19QT1JUX1NNX09GRkxJTkU6CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYmZhX3NtX2ZhdWx0KHBvcnQtPmZjcywgZXZlbnQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHAuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHAuYwppbmRleCBjZjBhZDY3Li44MjU4Zjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3hwLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmN4cC5jCkBAIC0xNDksMTEgKzE0OSw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1iZmFfZmN4cF9pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSkKLXsKLX0KLQotc3RhdGljIHZvaWQKIGJmYV9mY3hwX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKIH0KQEAgLTIyNSw3ICsyMjAsNyBAQAogCQkgICAgICAgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsIHUzMiByc3BfbGVuLAogCQkgICAgICAgdTMyIHJlc2lkX2xlbiwgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCiB7Ci0JLyoqZGlzY2FyZGVkIGZjeHAgY29tcGxldGlvbiAqLworCS8qIGRpc2NhcmRlZCBmY3hwIGNvbXBsZXRpb24gKi8KIH0KIAogc3RhdGljIHZvaWQKQEAgLTUyNywxMSArNTIyLDggQEAKIAkJaWYgKG5yZXFfc2dsZXMgPiBCRklfU0dFX0lOTElORSkgewogCQkJbnJlcV9zZ3BnID0gQkZBX1NHUEdfTlBBR0UobnJlcV9zZ2xlcyk7CiAKLQkJCWlmIChiZmFfc2dwZ19tYWxsb2MKLQkJCSAgICAoYmZhLCAmZmN4cC0+cmVxX3NncGdfcSwgbnJlcV9zZ3BnKQorCQkJaWYgKGJmYV9zZ3BnX21hbGxvYyhiZmEsICZmY3hwLT5yZXFfc2dwZ19xLCBucmVxX3NncGcpCiAJCQkgICAgIT0gQkZBX1NUQVRVU19PSykgewotCQkJCS8qIGJmYV9zZ3BnX3dhaXQoYmZhLCAmZmN4cC0+cmVxX3NncGdfd3FlLAotCQkJCW5yZXFfc2dwZyk7ICovCiAJCQkJLyoKIAkJCQkgKiBUT0RPCiAJCQkJICovCkBAIC02ODUsNyArNjc3LDcgQEAKIAlmY3hwLT5zZW5kX2NiYXJnID0gY2Jhcmc7CiAKIAkvKioKLQkgKiBJZiBubyByb29tIGluIENQRSBxdWV1ZSwgd2FpdCBmb3IKKwkgKiBJZiBubyByb29tIGluIENQRSBxdWV1ZSwgd2FpdCBmb3Igc3BhY2UgaW4gcmVxdWVzdCBxdWV1ZQogCSAqLwogCXNlbmRfcmVxID0gYmZhX3JlcXFfbmV4dChiZmEsIEJGQV9SRVFRX0ZDWFApOwogCWlmICghc2VuZF9yZXEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Z3aW1nX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Z3aW1nX3ByaXYuaAppbmRleCAxZWMxMzU1Li5kMzNlMTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9md2ltZ19wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZndpbWdfcHJpdi5oCkBAIC0yMSwxMSArMjEsMjQgQEAKICNkZWZpbmUJQkZJX0ZMQVNIX0NIVU5LX1NaCQkyNTYJLyogIEZsYXNoIGNodW5rIHNpemUgKi8KICNkZWZpbmUJQkZJX0ZMQVNIX0NIVU5LX1NaX1dPUkRTCShCRklfRkxBU0hfQ0hVTktfU1ovc2l6ZW9mKHUzMikpCiAKLWV4dGVybiB1MzIgKmJmaV9pbWFnZV9jdF9nZXRfY2h1bmsodTMyIG9mZik7Ci1leHRlcm4gdTMyIGJmaV9pbWFnZV9jdF9zaXplOwotZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2NiX2dldF9jaHVuayh1MzIgb2ZmKTsKLWV4dGVybiB1MzIgYmZpX2ltYWdlX2NiX3NpemU7Ci1leHRlcm4gdTMyICpiZmlfaW1hZ2VfY2I7Ci1leHRlcm4gdTMyICpiZmlfaW1hZ2VfY3Q7CisvKioKKyAqIEJGSSBGVyBpbWFnZSB0eXBlCisgKi8KK2VudW0geworCUJGSV9JTUFHRV9DQl9GQywKKwlCRklfSU1BR0VfQ1RfRkMsCisJQkZJX0lNQUdFX0NUX0NOQSwKKwlCRklfSU1BR0VfTUFYLAorfTsKKworZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2dldF9jaHVuayhpbnQgdHlwZSwgdWludDMyX3Qgb2ZmKTsKK2V4dGVybiB1MzIgYmZpX2ltYWdlX2dldF9zaXplKGludCB0eXBlKTsKK2V4dGVybiB1MzIgYmZpX2ltYWdlX2N0X2ZjX3NpemU7CitleHRlcm4gdTMyIGJmaV9pbWFnZV9jdF9jbmFfc2l6ZTsKK2V4dGVybiB1MzIgYmZpX2ltYWdlX2NiX2ZjX3NpemU7CitleHRlcm4gdTMyICpiZmlfaW1hZ2VfY3RfZmM7CitleHRlcm4gdTMyICpiZmlfaW1hZ2VfY3RfY25hOworZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2NiX2ZjOworCiAKICNlbmRpZiAvKiBfX0JGQV9GV0lNR19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMKaW5kZXggODcxYTRlMi4uZWRmZDcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jCkBAIC0xNTIsNCArMTUyLDkgQEAKIAliZmEtPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjYl9yc3BxX2Fja19tc2l4OwogfQogCi0KK3ZvaWQKK2JmYV9od2NiX21zaXhfZ2V0X3JtZV9yYW5nZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICpzdGFydCwgdTMyICplbmQpCit7CisJKnN0YXJ0ID0gQkZBX01TSVhfUk1FX1EwOworCSplbmQgPSBCRkFfTVNJWF9STUVfUTc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYwppbmRleCA3NmNlYjlhLi5hMzU3ZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKQEAgLTE2OCw0ICsxNjgsOSBAQAogCWJmYV9pb2NfaXNyX21vZGVfc2V0KCZiZmEtPmlvYywgbXNpeCk7CiB9CiAKLQordm9pZAorYmZhX2h3Y3RfbXNpeF9nZXRfcm1lX3JhbmdlKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKnN0YXJ0LCB1MzIgKmVuZCkKK3sKKwkqc3RhcnQgPSBCRkFfTVNJWF9STUVfUTA7CisJKmVuZCA9IEJGQV9NU0lYX1JNRV9RMzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHIuYwppbmRleCAwZWJhM2Y5Li40OTM2Nzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pbnRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50ci5jCkBAIC0xMzQsNiArMTM0LDcgQEAKIAogCWJmYV9yZWdfd3JpdGUoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cywgaW50cl91bm1hc2spOwogCWJmYV9yZWdfd3JpdGUoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX21hc2ssIH5pbnRyX3VubWFzayk7CisJYmZhLT5pb2NmYy5pbnRyX21hc2sgPSB+aW50cl91bm1hc2s7CiAJYmZhX2lzcl9tb2RlX3NldChiZmEsIGJmYS0+bXNpeC5udmVjcyAhPSAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwppbmRleCBlMDM4YmM5Li44ZTc4ZjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwpAQCAtNTksMjIgKzU5LDE4IEBACiAJCQkoKF9faW9jKS0+aW9jX2h3aWYtPmlvY19maXJtd2FyZV9sb2NrKF9faW9jKSkKICNkZWZpbmUgYmZhX2lvY19maXJtd2FyZV91bmxvY2soX19pb2MpICAgICAgICAgICAgICAgICAgXAogCQkJKChfX2lvYyktPmlvY19od2lmLT5pb2NfZmlybXdhcmVfdW5sb2NrKF9faW9jKSkKLSNkZWZpbmUgYmZhX2lvY19md2ltZ19nZXRfY2h1bmsoX19pb2MsIF9fb2ZmKSAgICAgICAgICAgXAotCQkJKChfX2lvYyktPmlvY19od2lmLT5pb2NfZndpbWdfZ2V0X2NodW5rKF9faW9jLCBfX29mZikpCi0jZGVmaW5lIGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoX19pb2MpICAgICAgICAgICAgICAgICAgIFwKLQkJCSgoX19pb2MpLT5pb2NfaHdpZi0+aW9jX2Z3aW1nX2dldF9zaXplKF9faW9jKSkKICNkZWZpbmUgYmZhX2lvY19yZWdfaW5pdChfX2lvYykgKChfX2lvYyktPmlvY19od2lmLT5pb2NfcmVnX2luaXQoX19pb2MpKQogI2RlZmluZSBiZmFfaW9jX21hcF9wb3J0KF9faW9jKSAoKF9faW9jKS0+aW9jX2h3aWYtPmlvY19tYXBfcG9ydChfX2lvYykpCiAjZGVmaW5lIGJmYV9pb2Nfbm90aWZ5X2hiZmFpbChfX2lvYykgICAgICAgICAgICAgICAgICAgIFwKIAkJCSgoX19pb2MpLT5pb2NfaHdpZi0+aW9jX25vdGlmeV9oYmZhaWwoX19pb2MpKQorI2RlZmluZSBiZmFfaW9jX2lzX29wdHJvbShfX2lvYykgICAgICAgIFwKKwkoYmZpX2ltYWdlX2dldF9zaXplKEJGQV9JT0NfRldJTUdfVFlQRShfX2lvYykpIDwgQkZBX0lPQ19GV0lNR19NSU5TWikKIAogYmZhX2Jvb2xlYW5fdCAgIGJmYV9hdXRvX3JlY292ZXIgPSBCRkFfVFJVRTsKIAogLyoKICAqIGZvcndhcmQgZGVjbGFyYXRpb25zCiAgKi8KLXN0YXRpYyB2b2lkICAgICBiZmFfaW9jX2Flbl9wb3N0KHN0cnVjdCBiZmFfaW9jX3MgKmJmYSwKLQkJCQkgZW51bSBiZmFfaW9jX2Flbl9ldmVudCBldmVudCk7CiBzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19od19zZW1fZ2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19od19zZW1fZ2V0X2NhbmNlbChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfaHdpbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgYmZhX2Jvb2xlYW5fdCBmb3JjZSk7CkBAIC04OCw2ICs4NCw3IEBACiBzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19tYm94X3BvbGwoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyB2b2lkICAgICBiZmFfaW9jX21ib3hfaGJmYWlsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19yZWNvdmVyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitzdGF0aWMgdm9pZAliZmFfaW9jX2NoZWNrX2F0dHJfd3ducyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfZGlzYWJsZV9jb21wKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19scHVfc3RvcChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCkBAIC00MzMsNiArNDMwLDcgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBJT0NfRV9GV1JTUF9HRVRBVFRSOgogCQliZmFfaW9jX3RpbWVyX3N0b3AoaW9jKTsKKwkJYmZhX2lvY19jaGVja19hdHRyX3d3bnMoaW9jKTsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX29wKTsKIAkJYnJlYWs7CiAKQEAgLTg3OSw4ICs4NzcsOCBAQAogCXN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zICpkcnZfZndoZHI7CiAJaW50ICAgICAgICAgICAgIGk7CiAKLQlkcnZfZndoZHIgPQotCQkoc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKiliZmFfaW9jX2Z3aW1nX2dldF9jaHVuayhpb2MsIDApOworCWRydl9md2hkciA9IChzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqKQorCQkJYmZpX2ltYWdlX2dldF9jaHVuayhCRkFfSU9DX0ZXSU1HX1RZUEUoaW9jKSwgMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQkZJX0lPQ19NRDVTVU1fU1o7IGkrKykgewogCQlpZiAoZndoZHItPm1kNXN1bVtpXSAhPSBkcnZfZndoZHItPm1kNXN1bVtpXSkgewpAQCAtOTA3LDEyICs5MDUsMTMgQEAKIAkvKioKIAkgKiBJZiBiaW9zL2VmaSBib290IChmbGFzaCBiYXNlZCkgLS0gcmV0dXJuIHRydWUKIAkgKi8KLQlpZiAoYmZhX2lvY19md2ltZ19nZXRfc2l6ZShpb2MpIDwgQkZBX0lPQ19GV0lNR19NSU5TWikKKwlpZiAoYmZhX2lvY19pc19vcHRyb20oaW9jKSkKIAkJcmV0dXJuIEJGQV9UUlVFOwogCiAJYmZhX2lvY19md3Zlcl9nZXQoaW9jLCAmZndoZHIpOwotCWRydl9md2hkciA9Ci0JCShzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqKWJmYV9pb2NfZndpbWdfZ2V0X2NodW5rKGlvYywgMCk7CisJZHJ2X2Z3aGRyID0gKHN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zICopCisJCQliZmlfaW1hZ2VfZ2V0X2NodW5rKEJGQV9JT0NfRldJTUdfVFlQRShpb2MpLCAwKTsKKwogCiAJaWYgKGZ3aGRyLnNpZ25hdHVyZSAhPSBkcnZfZndoZHItPnNpZ25hdHVyZSkgewogCQliZmFfdHJjKGlvYywgZndoZHIuc2lnbmF0dXJlKTsKQEAgLTk4MCw4ICs5NzksMTMgQEAKIAkvKioKIAkgKiBJZiBJT0MgZnVuY3Rpb24gaXMgZGlzYWJsZWQgYW5kIGZpcm13YXJlIHZlcnNpb24gaXMgc2FtZSwKIAkgKiBqdXN0IHJlLWVuYWJsZSBJT0MuCisJICoKKwkgKiBJZiBvcHRpb24gcm9tLCBJT0MgbXVzdCBub3QgYmUgaW4gb3BlcmF0aW9uYWwgc3RhdGUuIFdpdGgKKwkgKiBjb252ZXJnZW5jZSwgSU9DIHdpbGwgYmUgaW4gb3BlcmF0aW9uYWwgc3RhdGUgd2hlbiAybmQgZHJpdmVyCisJICogaXMgbG9hZGVkLgogCSAqLwotCWlmIChpb2NfZndzdGF0ZSA9PSBCRklfSU9DX0RJU0FCTEVEIHx8IGlvY19md3N0YXRlID09IEJGSV9JT0NfT1ApIHsKKwlpZiAoaW9jX2Z3c3RhdGUgPT0gQkZJX0lPQ19ESVNBQkxFRCB8fAorCQkoIWJmYV9pb2NfaXNfb3B0cm9tKGlvYykgJiYgaW9jX2Z3c3RhdGUgPT0gQkZJX0lPQ19PUCkpIHsKIAkJYmZhX3RyYyhpb2MsIGlvY19md3N0YXRlKTsKIAogCQkvKioKQEAgLTExMjUsMjEgKzExMjksMjIgQEAKIAkvKioKIAkgKiBGbGFzaCBiYXNlZCBmaXJtd2FyZSBib290CiAJICovCi0JYmZhX3RyYyhpb2MsIGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKSk7Ci0JaWYgKGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKSA8IEJGQV9JT0NfRldJTUdfTUlOU1opCisJYmZhX3RyYyhpb2MsIGJmaV9pbWFnZV9nZXRfc2l6ZShCRkFfSU9DX0ZXSU1HX1RZUEUoaW9jKSkpOworCWlmIChiZmFfaW9jX2lzX29wdHJvbShpb2MpKQogCQlib290X3R5cGUgPSBCRklfQk9PVF9UWVBFX0ZMQVNIOwotCWZ3aW1nID0gYmZhX2lvY19md2ltZ19nZXRfY2h1bmsoaW9jLCBjaHVua25vKTsKKwlmd2ltZyA9IGJmaV9pbWFnZV9nZXRfY2h1bmsoQkZBX0lPQ19GV0lNR19UWVBFKGlvYyksIGNodW5rbm8pOworCiAKIAlwZ251bSA9IGJmYV9pb2Nfc21lbV9wZ251bShpb2MsIGxvZmYpOwogCXBnb2ZmID0gYmZhX2lvY19zbWVtX3Bnb2ZmKGlvYywgbG9mZik7CiAKIAliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbiwgcGdudW0pOwogCi0JZm9yIChpID0gMDsgaSA8IGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJmaV9pbWFnZV9nZXRfc2l6ZShCRkFfSU9DX0ZXSU1HX1RZUEUoaW9jKSk7IGkrKykgewogCiAJCWlmIChCRkFfSU9DX0ZMQVNIX0NIVU5LX05PKGkpICE9IGNodW5rbm8pIHsKIAkJCWNodW5rbm8gPSBCRkFfSU9DX0ZMQVNIX0NIVU5LX05PKGkpOwotCQkJZndpbWcgPSBiZmFfaW9jX2Z3aW1nX2dldF9jaHVuayhpb2MsCisJCQlmd2ltZyA9IGJmaV9pbWFnZV9nZXRfY2h1bmsoQkZBX0lPQ19GV0lNR19UWVBFKGlvYyksCiAJCQkJCUJGQV9JT0NfRkxBU0hfQ0hVTktfQUREUihjaHVua25vKSk7CiAJCX0KIApAQCAtMTE4OCw2ICsxMTkzLDcgQEAKIAlzdHJ1Y3QgYmZpX2lvY19hdHRyX3MgKmF0dHIgPSBpb2MtPmF0dHI7CiAKIAlhdHRyLT5hZGFwdGVyX3Byb3AgPSBiZmFfb3NfbnRvaGwoYXR0ci0+YWRhcHRlcl9wcm9wKTsKKwlhdHRyLT5jYXJkX3R5cGUgICAgID0gYmZhX29zX250b2hsKGF0dHItPmNhcmRfdHlwZSk7CiAJYXR0ci0+bWF4ZnJzaXplID0gYmZhX29zX250b2hzKGF0dHItPm1heGZyc2l6ZSk7CiAKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9GV1JTUF9HRVRBVFRSKTsKQEAgLTEyODIsNiArMTI4OCw3IEBACiAJCWJmYV9yZWdfd3JpdGUoKHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHKSwgQkZJX0lPQ19JTklUSU5HKTsKIAl9CiAKKwliZmFfaW9jX21zZ2ZsdXNoKGlvYyk7CiAJYmZhX2lvY19kb3dubG9hZF9mdyhpb2MsIGJvb3RfdHlwZSwgYm9vdF9wYXJhbSk7CiAKIAkvKioKQEAgLTE0MTYsNyArMTQyMyw3IEBACiB7CiAJaW9jLT5pb2NfbWMgPSBtYzsKIAlpb2MtPnBjaWRldiA9ICpwY2lkZXY7Ci0JaW9jLT5jdGRldiA9IChpb2MtPnBjaWRldi5kZXZpY2VfaWQgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QpOworCWlvYy0+Y3RkZXYgID0gYmZhX2FzaWNfaWRfY3QoaW9jLT5wY2lkZXYuZGV2aWNlX2lkKTsKIAlpb2MtPmNuYSA9IGlvYy0+Y3RkZXYgJiYgIWlvYy0+ZmNtb2RlOwogCiAJLyoqCkBAIC0xNjA3LDYgKzE2MTQsMTMgQEAKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IV0VSUk9SKTsKIH0KIAordm9pZAorYmZhX2lvY19zZXRfZmNtb2RlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlpb2MtPmZjbW9kZSAgPSBCRkFfVFJVRTsKKwlpb2MtPnBvcnRfaWQgPSBiZmFfaW9jX3BjaWZuKGlvYyk7Cit9CisKICNpZm5kZWYgQkZBX0JJT1NfQlVJTEQKIAogLyoqCkBAIC0xNjk2LDYgKzE3MTAsOSBAQAogCS8qIEZvciBub3csIG1vZGVsIGRlc2NyIHVzZXMgc2FtZSBtb2RlbCBzdHJpbmcgKi8KIAliZmFfaW9jX2dldF9hZGFwdGVyX21vZGVsKGlvYywgYWRfYXR0ci0+bW9kZWxfZGVzY3IpOwogCisJYWRfYXR0ci0+Y2FyZF90eXBlID0gaW9jX2F0dHItPmNhcmRfdHlwZTsKKwlhZF9hdHRyLT5pc19tZXp6ID0gYmZhX21mZ19pc19tZXp6KGlvY19hdHRyLT5jYXJkX3R5cGUpOworCiAJaWYgKEJGSV9BREFQVEVSX0lTX1NQRUNJQUwoaW9jX2F0dHItPmFkYXB0ZXJfcHJvcCkpCiAJCWFkX2F0dHItPnByb3RvdHlwZSA9IDE7CiAJZWxzZQpAQCAtMTc3OSwyOCArMTc5NiwxNyBAQAogYmZhX2lvY19nZXRfYWRhcHRlcl9tb2RlbChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGNoYXIgKm1vZGVsKQogewogCXN0cnVjdCBiZmlfaW9jX2F0dHJfcyAgICppb2NfYXR0cjsKLQl1OCAgICAgICAgICAgICAgbnBvcnRzOwotCXU4ICAgICAgICAgICAgICBtYXhfc3BlZWQ7CiAKIAliZmFfYXNzZXJ0KG1vZGVsKTsKIAliZmFfb3NfbWVtc2V0KCh2b2lkICopbW9kZWwsIDAsIEJGQV9BREFQVEVSX01PREVMX05BTUVfTEVOKTsKIAogCWlvY19hdHRyID0gaW9jLT5hdHRyOwogCi0JbnBvcnRzID0gYmZhX2lvY19nZXRfbnBvcnRzKGlvYyk7Ci0JbWF4X3NwZWVkID0gYmZhX2lvY19zcGVlZF9zdXAoaW9jKTsKLQogCS8qKgogCSAqIG1vZGVsIG5hbWUKIAkgKi8KLQlpZiAobWF4X3NwZWVkID09IDEwKSB7Ci0JCXN0cmNweShtb2RlbCwgIkJSLTEwPzAiKTsKLQkJbW9kZWxbNV0gPSAnMCcgKyBucG9ydHM7Ci0JfSBlbHNlIHsKLQkJc3RyY3B5KG1vZGVsLCAiQnJvY2FkZS0/PzUiKTsKLQkJbW9kZWxbOF0gPSAnMCcgKyBtYXhfc3BlZWQ7Ci0JCW1vZGVsWzldID0gJzAnICsgbnBvcnRzOwotCX0KKwlzbnByaW50Zihtb2RlbCwgQkZBX0FEQVBURVJfTU9ERUxfTkFNRV9MRU4sICIlcy0ldSIsCisJCQlCRkFfTUZHX05BTUUsIGlvY19hdHRyLT5jYXJkX3R5cGUpOwogfQogCiBlbnVtIGJmYV9pb2Nfc3RhdGUKQEAgLTE4MjcsNzggKzE4MzMsNTQgQEAKIH0KIAogLyoqCi0gKiAgaGFsX3d3bl9wdWJsaWMKKyAqICBiZmFfd3duX3B1YmxpYwogICovCiB3d25fdAogYmZhX2lvY19nZXRfcHd3bihzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7Ci0JdW5pb24gewotCQl3d25fdCAgICAgICAgICAgd3duOwotCQl1OCAgICAgICAgIGJ5dGVbc2l6ZW9mKHd3bl90KV07Ci0JfQotCXc7Ci0KLQl3Lnd3biA9IGlvYy0+YXR0ci0+bWZnX3d3bjsKLQotCWlmIChiZmFfaW9jX3BvcnRpZChpb2MpID09IDEpCi0JCXcuYnl0ZVs3XSsrOwotCi0JcmV0dXJuIHcud3duOworCXJldHVybiBpb2MtPmF0dHItPnB3d247CiB9CiAKIHd3bl90CiBiZmFfaW9jX2dldF9ud3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKIHsKLQl1bmlvbiB7Ci0JCXd3bl90ICAgICAgICAgICB3d247Ci0JCXU4ICAgICAgICAgYnl0ZVtzaXplb2Yod3duX3QpXTsKLQl9Ci0JdzsKLQotCXcud3duID0gaW9jLT5hdHRyLT5tZmdfd3duOwotCi0JaWYgKGJmYV9pb2NfcG9ydGlkKGlvYykgPT0gMSkKLQkJdy5ieXRlWzddKys7Ci0KLQl3LmJ5dGVbMF0gPSAweDIwOwotCi0JcmV0dXJuIHcud3duOwotfQotCi13d25fdAotYmZhX2lvY19nZXRfd3duX25hYTUoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MTYgaW5zdCkKLXsKLQl1bmlvbiB7Ci0JCXd3bl90ICAgICAgICAgICB3d247Ci0JCXU4ICAgICAgICAgYnl0ZVtzaXplb2Yod3duX3QpXTsKLQl9Ci0JdyAgICAgICAgICAgICAgLCB3NTsKLQotCWJmYV90cmMoaW9jLCBpbnN0KTsKLQotCXcud3duID0gaW9jLT5hdHRyLT5tZmdfd3duOwotCXc1LmJ5dGVbMF0gPSAweDUwIHwgdy5ieXRlWzJdID4+IDQ7Ci0JdzUuYnl0ZVsxXSA9IHcuYnl0ZVsyXSA8PCA0IHwgdy5ieXRlWzNdID4+IDQ7Ci0JdzUuYnl0ZVsyXSA9IHcuYnl0ZVszXSA8PCA0IHwgdy5ieXRlWzRdID4+IDQ7Ci0JdzUuYnl0ZVszXSA9IHcuYnl0ZVs0XSA8PCA0IHwgdy5ieXRlWzVdID4+IDQ7Ci0JdzUuYnl0ZVs0XSA9IHcuYnl0ZVs1XSA8PCA0IHwgdy5ieXRlWzZdID4+IDQ7Ci0JdzUuYnl0ZVs1XSA9IHcuYnl0ZVs2XSA8PCA0IHwgdy5ieXRlWzddID4+IDQ7Ci0JdzUuYnl0ZVs2XSA9IHcuYnl0ZVs3XSA8PCA0IHwgKGluc3QgJiAweDBmMDApID4+IDg7Ci0JdzUuYnl0ZVs3XSA9IChpbnN0ICYgMHhmZik7Ci0KLQlyZXR1cm4gdzUud3duOworCXJldHVybiBpb2MtPmF0dHItPm53d247CiB9CiAKIHU2NAogYmZhX2lvY19nZXRfYWRpZChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7Ci0JcmV0dXJuIGlvYy0+YXR0ci0+bWZnX3d3bjsKKwlyZXR1cm4gaW9jLT5hdHRyLT5tZmdfcHd3bjsKIH0KIAogbWFjX3QKIGJmYV9pb2NfZ2V0X21hYyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7Ci0JbWFjX3QgICAgICAgICAgIG1hYzsKKwkvKgorCSAqIEN1cnJlbnRseSBtZmcgbWFjIGlzIHVzZWQgYXMgRkNvRSBlbm9kZSBtYWMgKG5vdCBjb25maWd1cmVkIGJ5IFBCQykKKwkgKi8KKwlpZiAoYmZhX2lvY19nZXRfdHlwZShpb2MpID09IEJGQV9JT0NfVFlQRV9GQ29FKQorCQlyZXR1cm4gYmZhX2lvY19nZXRfbWZnX21hYyhpb2MpOworCWVsc2UKKwkJcmV0dXJuIGlvYy0+YXR0ci0+bWFjOworfQorCit3d25fdAorYmZhX2lvY19nZXRfbWZnX3B3d24oc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXJldHVybiBpb2MtPmF0dHItPm1mZ19wd3duOworfQorCit3d25fdAorYmZhX2lvY19nZXRfbWZnX253d24oc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXJldHVybiBpb2MtPmF0dHItPm1mZ19ud3duOworfQorCittYWNfdAorYmZhX2lvY19nZXRfbWZnX21hYyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJbWFjX3QgICBtYWM7CiAKIAltYWMgPSBpb2MtPmF0dHItPm1mZ19tYWM7CiAJbWFjLm1hY1tNQUNfQUREUkxFTiAtIDFdICs9IGJmYV9pb2NfcGNpZm4oaW9jKTsKQEAgLTE5MDYsMjMgKzE4ODgsMTYgQEAKIAlyZXR1cm4gbWFjOwogfQogCi12b2lkCi1iZmFfaW9jX3NldF9mY21vZGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQotewotCWlvYy0+ZmNtb2RlID0gQkZBX1RSVUU7Ci0JaW9jLT5wb3J0X2lkID0gYmZhX2lvY19wY2lmbihpb2MpOwotfQotCiBiZmFfYm9vbGVhbl90CiBiZmFfaW9jX2dldF9mY21vZGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCXJldHVybiBpb2MtPmZjbW9kZSB8fCAoaW9jLT5wY2lkZXYuZGV2aWNlX2lkICE9IEJGQV9QQ0lfREVWSUNFX0lEX0NUKTsKKwlyZXR1cm4gaW9jLT5mY21vZGUgfHwgIWJmYV9hc2ljX2lkX2N0KGlvYy0+cGNpZGV2LmRldmljZV9pZCk7CiB9CiAKIC8qKgogICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCiAgKi8KLXN0YXRpYyB2b2lkCit2b2lkCiBiZmFfaW9jX2Flbl9wb3N0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBiZmFfaW9jX2Flbl9ldmVudCBldmVudCkKIHsKIAl1bmlvbiBiZmFfYWVuX2RhdGFfdSBhZW5fZGF0YTsKQEAgLTIwNzAsMTkgKzIwNDUsMTYgQEAKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IQkZBSUwpOwogfQogCi0jZWxzZQotCiBzdGF0aWMgdm9pZAotYmZhX2lvY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZhX2lvY19hZW5fZXZlbnQgZXZlbnQpCitiZmFfaW9jX2NoZWNrX2F0dHJfd3ducyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7Ci19CisJaWYgKGJmYV9pb2NfZ2V0X3R5cGUoaW9jKSA9PSBCRkFfSU9DX1RZUEVfTEwpCisJCXJldHVybjsKIAotc3RhdGljIHZvaWQKLWJmYV9pb2NfcmVjb3ZlcihzdHJ1Y3QgYmZhX2lvY19zICppb2MpCi17Ci0JYmZhX2Fzc2VydCgwKTsKKwlpZiAoaW9jLT5hdHRyLT5ud3duID09IDApCisJCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9JTlZBTElEX05XV04pOworCWlmIChpb2MtPmF0dHItPnB3d24gPT0gMCkKKwkJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0lOVkFMSURfUFdXTik7CiB9CiAKICNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKaW5kZXggZDA4MDQ0MC4uY2FlMDViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKQEAgLTE4Niw5ICsxODYsNiBAQAogCWJmYV9zdGF0dXNfdCAgICAoKmlvY19wbGxfaW5pdCkgKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiAJYmZhX2Jvb2xlYW5fdCAgICgqaW9jX2Zpcm13YXJlX2xvY2spICAgIChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCXZvaWQgICAgICAgICAgICAoKmlvY19maXJtd2FyZV91bmxvY2spICAoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKLQl1MzIgKiAgIAkoKmlvY19md2ltZ19nZXRfY2h1bmspICAoc3RydWN0IGJmYV9pb2NfcyAqaW9jLAotCQkJCQkJdTMyIG9mZik7Ci0JdTMyCQkoKmlvY19md2ltZ19nZXRfc2l6ZSkgICAoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIAl2b2lkCQkoKmlvY19yZWdfaW5pdCkgKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiAJdm9pZAkJKCppb2NfbWFwX3BvcnQpIChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCXZvaWQJCSgqaW9jX2lzcl9tb2RlX3NldCkgICAgIChzdHJ1Y3QgYmZhX2lvY19zICppb2MsCkBAIC0yMTQsNiArMjExLDEwIEBACiAKICNkZWZpbmUgYmZhX2lvY19zdGF0cyhfaW9jLCBfc3RhdHMpICAgICAoKF9pb2MpLT5zdGF0cy5fc3RhdHMrKykKICNkZWZpbmUgQkZBX0lPQ19GV0lNR19NSU5TWiAgICAgKDE2ICogMTAyNCkKKyNkZWZpbmUgQkZBX0lPQ19GV0lNR19UWVBFKF9faW9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKChfX2lvYyktPmN0ZGV2KSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAoKChfX2lvYyktPmZjbW9kZSkgPyBCRklfSU1BR0VfQ1RfRkMgOiBCRklfSU1BR0VfQ1RfQ05BKSA6ICAgICBcCisJIEJGSV9JTUFHRV9DQl9GQykKIAogI2RlZmluZSBCRkFfSU9DX0ZMQVNIX0NIVU5LX05PKG9mZikgICAgICAgICAgICAgKG9mZiAvIEJGSV9GTEFTSF9DSFVOS19TWl9XT1JEUykKICNkZWZpbmUgQkZBX0lPQ19GTEFTSF9PRkZTRVRfSU5fQ0hVTksob2ZmKSAgICAgIChvZmYgJSBCRklfRkxBU0hfQ0hVTktfU1pfV09SRFMpCkBAIC0yOTYsMTQgKzI5NywxNyBAQAogCQkJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKmZ3aGRyKTsKIGJmYV9ib29sZWFuX3QgYmZhX2lvY19md3Zlcl9jbXAoc3RydWN0IGJmYV9pb2NfcyAqaW9jLAogCQkJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKmZ3aGRyKTsKK3ZvaWQgYmZhX2lvY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZhX2lvY19hZW5fZXZlbnQgZXZlbnQpOwogCiAvKgogICogYmZhIG1mZyB3d24gQVBJIGZ1bmN0aW9ucwogICovCiB3d25fdCBiZmFfaW9jX2dldF9wd3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiB3d25fdCBiZmFfaW9jX2dldF9ud3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7Ci13d25fdCBiZmFfaW9jX2dldF93d25fbmFhNShzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHUxNiBpbnN0KTsKIG1hY190IGJmYV9pb2NfZ2V0X21hYyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOword3duX3QgYmZhX2lvY19nZXRfbWZnX3B3d24oc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3d3bl90IGJmYV9pb2NfZ2V0X21mZ19ud3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CittYWNfdCBiZmFfaW9jX2dldF9tZmdfbWFjKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiB1NjQgYmZhX2lvY19nZXRfYWRpZChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCiAjZW5kaWYgLyogX19CRkFfSU9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jX2NiLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NfY2IuYwppbmRleCAzY2U4NTMxLi4zMjRiZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NfY2IuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NfY2IuYwpAQCAtMzMsMjYgKzMzLDEzIEBACiBzdGF0aWMgYmZhX3N0YXR1c190IGJmYV9pb2NfY2JfcGxsX2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9pb2NfY2JfZmlybXdhcmVfbG9jayhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jYl9maXJtd2FyZV91bmxvY2soc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKLXN0YXRpYyB1MzIgICpiZmFfaW9jX2NiX2Z3aW1nX2dldF9jaHVuayhzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHUzMiBvZmYpOwotc3RhdGljIHUzMiBiZmFfaW9jX2NiX2Z3aW1nX2dldF9zaXplKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2NiX3JlZ19pbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2NiX21hcF9wb3J0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2NiX2lzcl9tb2RlX3NldChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGJmYV9ib29sZWFuX3QgbXNpeCk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2NiX25vdGlmeV9oYmZhaWwoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfY2Jfb3duZXJzaGlwX3Jlc2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiAKLXN0cnVjdCBiZmFfaW9jX2h3aWZfcyBod2lmX2NiID0gewotCWJmYV9pb2NfY2JfcGxsX2luaXQsCi0JYmZhX2lvY19jYl9maXJtd2FyZV9sb2NrLAotCWJmYV9pb2NfY2JfZmlybXdhcmVfdW5sb2NrLAotCWJmYV9pb2NfY2JfZndpbWdfZ2V0X2NodW5rLAotCWJmYV9pb2NfY2JfZndpbWdfZ2V0X3NpemUsCi0JYmZhX2lvY19jYl9yZWdfaW5pdCwKLQliZmFfaW9jX2NiX21hcF9wb3J0LAotCWJmYV9pb2NfY2JfaXNyX21vZGVfc2V0LAotCWJmYV9pb2NfY2Jfbm90aWZ5X2hiZmFpbCwKLQliZmFfaW9jX2NiX293bmVyc2hpcF9yZXNldCwKLX07CitzdHJ1Y3QgYmZhX2lvY19od2lmX3MgaHdpZl9jYjsKIAogLyoqCiAgKiBDYWxsZWQgZnJvbSBiZmFfaW9jX2F0dGFjaCgpIHRvIG1hcCBhc2ljIHNwZWNpZmljIGNhbGxzLgpAQCAtNjAsMjEgKzQ3LDE4IEBACiB2b2lkCiBiZmFfaW9jX3NldF9jYl9od2lmKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKIHsKKwlod2lmX2NiLmlvY19wbGxfaW5pdCA9IGJmYV9pb2NfY2JfcGxsX2luaXQ7CisJaHdpZl9jYi5pb2NfZmlybXdhcmVfbG9jayA9IGJmYV9pb2NfY2JfZmlybXdhcmVfbG9jazsKKwlod2lmX2NiLmlvY19maXJtd2FyZV91bmxvY2sgPSBiZmFfaW9jX2NiX2Zpcm13YXJlX3VubG9jazsKKwlod2lmX2NiLmlvY19yZWdfaW5pdCA9IGJmYV9pb2NfY2JfcmVnX2luaXQ7CisJaHdpZl9jYi5pb2NfbWFwX3BvcnQgPSBiZmFfaW9jX2NiX21hcF9wb3J0OworCWh3aWZfY2IuaW9jX2lzcl9tb2RlX3NldCA9IGJmYV9pb2NfY2JfaXNyX21vZGVfc2V0OworCWh3aWZfY2IuaW9jX25vdGlmeV9oYmZhaWwgPSBiZmFfaW9jX2NiX25vdGlmeV9oYmZhaWw7CisJaHdpZl9jYi5pb2Nfb3duZXJzaGlwX3Jlc2V0ID0gYmZhX2lvY19jYl9vd25lcnNoaXBfcmVzZXQ7CisKIAlpb2MtPmlvY19od2lmID0gJmh3aWZfY2I7CiB9CiAKLXN0YXRpYyB1MzIgKgotYmZhX2lvY19jYl9md2ltZ19nZXRfY2h1bmsoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgb2ZmKQotewotCXJldHVybiBiZmlfaW1hZ2VfY2JfZ2V0X2NodW5rKG9mZik7Ci19Ci0KLXN0YXRpYyB1MzIKLWJmYV9pb2NfY2JfZndpbWdfZ2V0X3NpemUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQotewotCXJldHVybiBiZmlfaW1hZ2VfY2Jfc2l6ZTsKLX0KLQogLyoqCiAgKiBSZXR1cm4gdHJ1ZSBpZiBmaXJtd2FyZSBvZiBjdXJyZW50IGRyaXZlciBtYXRjaGVzIHRoZSBydW5uaW5nIGZpcm13YXJlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NfY3QuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jdC5jCmluZGV4IDIwYjU4YWQuLjY4ZjAyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jdC5jCkBAIC0zMywyNyArMzMsMTMgQEAKIHN0YXRpYyBiZmFfc3RhdHVzX3QgYmZhX2lvY19jdF9wbGxfaW5pdChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIGJmYV9ib29sZWFuX3QgYmZhX2lvY19jdF9maXJtd2FyZV9sb2NrKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2N0X2Zpcm13YXJlX3VubG9jayhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwotc3RhdGljIHUzMiogYmZhX2lvY19jdF9md2ltZ19nZXRfY2h1bmsoc3RydWN0IGJmYV9pb2NfcyAqaW9jLAotCQkJCQl1MzIgb2ZmKTsKLXN0YXRpYyB1MzIgYmZhX2lvY19jdF9md2ltZ19nZXRfc2l6ZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jdF9yZWdfaW5pdChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jdF9tYXBfcG9ydChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jdF9pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBiZmFfYm9vbGVhbl90IG1zaXgpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jdF9ub3RpZnlfaGJmYWlsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2N0X293bmVyc2hpcF9yZXNldChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCi1zdHJ1Y3QgYmZhX2lvY19od2lmX3MgaHdpZl9jdCA9IHsKLQliZmFfaW9jX2N0X3BsbF9pbml0LAotCWJmYV9pb2NfY3RfZmlybXdhcmVfbG9jaywKLQliZmFfaW9jX2N0X2Zpcm13YXJlX3VubG9jaywKLQliZmFfaW9jX2N0X2Z3aW1nX2dldF9jaHVuaywKLQliZmFfaW9jX2N0X2Z3aW1nX2dldF9zaXplLAotCWJmYV9pb2NfY3RfcmVnX2luaXQsCi0JYmZhX2lvY19jdF9tYXBfcG9ydCwKLQliZmFfaW9jX2N0X2lzcl9tb2RlX3NldCwKLQliZmFfaW9jX2N0X25vdGlmeV9oYmZhaWwsCi0JYmZhX2lvY19jdF9vd25lcnNoaXBfcmVzZXQsCi19Oworc3RydWN0IGJmYV9pb2NfaHdpZl9zIGh3aWZfY3Q7CiAKIC8qKgogICogQ2FsbGVkIGZyb20gYmZhX2lvY19hdHRhY2goKSB0byBtYXAgYXNpYyBzcGVjaWZpYyBjYWxscy4KQEAgLTYxLDIxICs0NywxOCBAQAogdm9pZAogYmZhX2lvY19zZXRfY3RfaHdpZihzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7CisJaHdpZl9jdC5pb2NfcGxsX2luaXQgPSBiZmFfaW9jX2N0X3BsbF9pbml0OworCWh3aWZfY3QuaW9jX2Zpcm13YXJlX2xvY2sgPSBiZmFfaW9jX2N0X2Zpcm13YXJlX2xvY2s7CisJaHdpZl9jdC5pb2NfZmlybXdhcmVfdW5sb2NrID0gYmZhX2lvY19jdF9maXJtd2FyZV91bmxvY2s7CisJaHdpZl9jdC5pb2NfcmVnX2luaXQgPSBiZmFfaW9jX2N0X3JlZ19pbml0OworCWh3aWZfY3QuaW9jX21hcF9wb3J0ID0gYmZhX2lvY19jdF9tYXBfcG9ydDsKKwlod2lmX2N0LmlvY19pc3JfbW9kZV9zZXQgPSBiZmFfaW9jX2N0X2lzcl9tb2RlX3NldDsKKwlod2lmX2N0LmlvY19ub3RpZnlfaGJmYWlsID0gYmZhX2lvY19jdF9ub3RpZnlfaGJmYWlsOworCWh3aWZfY3QuaW9jX293bmVyc2hpcF9yZXNldCA9IGJmYV9pb2NfY3Rfb3duZXJzaGlwX3Jlc2V0OworCiAJaW9jLT5pb2NfaHdpZiA9ICZod2lmX2N0OwogfQogCi1zdGF0aWMgdTMyKgotYmZhX2lvY19jdF9md2ltZ19nZXRfY2h1bmsoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgb2ZmKQotewotCXJldHVybiBiZmlfaW1hZ2VfY3RfZ2V0X2NodW5rKG9mZik7Ci19Ci0KLXN0YXRpYyB1MzIKLWJmYV9pb2NfY3RfZndpbWdfZ2V0X3NpemUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQotewotCXJldHVybiBiZmlfaW1hZ2VfY3Rfc2l6ZTsKLX0KLQogLyoqCiAgKiBSZXR1cm4gdHJ1ZSBpZiBmaXJtd2FyZSBvZiBjdXJyZW50IGRyaXZlciBtYXRjaGVzIHRoZSBydW5uaW5nIGZpcm13YXJlLgogICovCkBAIC05NSw3ICs3OCw3IEBACiAJLyoqCiAJICogSWYgYmlvcyBib290IChmbGFzaCBiYXNlZCkgLS0gZG8gbm90IGluY3JlbWVudCB1c2FnZSBjb3VudAogCSAqLwotCWlmIChiZmFfaW9jX2N0X2Z3aW1nX2dldF9zaXplKGlvYykgPCBCRkFfSU9DX0ZXSU1HX01JTlNaKQorCWlmIChiZmlfaW1hZ2VfZ2V0X3NpemUoQkZBX0lPQ19GV0lNR19UWVBFKGlvYykpIDwgQkZBX0lPQ19GV0lNR19NSU5TWikKIAkJcmV0dXJuIEJGQV9UUlVFOwogCiAJYmZhX2lvY19zZW1fZ2V0KGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcpOwpAQCAtMTQ2LDkgKzEyOSwxNCBAQAogCiAJLyoqCiAJICogRmlybXdhcmUgbG9jayBpcyByZWxldmFudCBvbmx5IGZvciBDTkEuCisJICovCisJaWYgKCFpb2MtPmNuYSkKKwkJcmV0dXJuOworCisJLyoqCiAJICogSWYgYmlvcyBib290IChmbGFzaCBiYXNlZCkgLS0gZG8gbm90IGRlY3JlbWVudCB1c2FnZSBjb3VudAogCSAqLwotCWlmICghaW9jLT5jbmEgfHwgYmZhX2lvY19jdF9md2ltZ19nZXRfc2l6ZShpb2MpIDwgQkZBX0lPQ19GV0lNR19NSU5TWikKKwlpZiAoYmZpX2ltYWdlX2dldF9zaXplKEJGQV9JT0NfRldJTUdfVFlQRShpb2MpKSA8IEJGQV9JT0NfRldJTUdfTUlOU1opCiAJCXJldHVybjsKIAogCS8qKgpAQCAtMzg4LDEwICszNzYsMzUgQEAKIAliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9mYXN0X2N0bF9yZWcsIHBsbF9mY2xrIHwKIAkJX19BUFBfUExMXzQyNV9FTkFCTEUpOwogCisJLyoqCisJICogUFNTIG1lbW9yeSByZXNldCBpcyBhc3NlcnRlZCBhdCBwb3dlci1vbi1yZXNldC4gTmVlZCB0byBjbGVhcgorCSAqIHRoaXMgYmVmb3JlIHJ1bm5pbmcgRURSQU0gQklTVFIKKwkgKi8KKwlpZiAoaW9jLT5jbmEpIHsKKwkJYmZhX3JlZ193cml0ZSgocmIgKyBQTU1fMVRfUkVTRVRfUkVHX1AwKSwgX19QTU1fMVRfUkVTRVRfUCk7CisJCWJmYV9yZWdfd3JpdGUoKHJiICsgUE1NXzFUX1JFU0VUX1JFR19QMSksIF9fUE1NXzFUX1JFU0VUX1ApOworCX0KKworCXIzMiA9IGJmYV9yZWdfcmVhZCgocmIgKyBQU1NfQ1RMX1JFRykpOworCXIzMiAmPSB+X19QU1NfTE1FTV9SRVNFVDsKKwliZmFfcmVnX3dyaXRlKChyYiArIFBTU19DVExfUkVHKSwgcjMyKTsKKwliZmFfb3NfdWRlbGF5KDEwMDApOworCisJaWYgKGlvYy0+Y25hKSB7CisJCWJmYV9yZWdfd3JpdGUoKHJiICsgUE1NXzFUX1JFU0VUX1JFR19QMCksIDApOworCQliZmFfcmVnX3dyaXRlKChyYiArIFBNTV8xVF9SRVNFVF9SRUdfUDEpLCAwKTsKKwl9CisKIAliZmFfcmVnX3dyaXRlKChyYiArIE1CSVNUX0NUTF9SRUcpLCBfX0VEUkFNX0JJU1RSX1NUQVJUKTsKIAliZmFfb3NfdWRlbGF5KDEwMDApOwogCXIzMiA9IGJmYV9yZWdfcmVhZCgocmIgKyBNQklTVF9TVEFUX1JFRykpOwogCWJmYV90cmMoaW9jLCByMzIpOworCisJLyoqCisJICogQ2xlYXIgQklTVFIKKwkgKi8KKwliZmFfcmVnX3dyaXRlKChyYiArIE1CSVNUX0NUTF9SRUcpLCAwKTsKKwogCS8qCiAJICogIHJlbGVhc2Ugc2VtYXBob3JlLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjLmMKaW5kZXggYTc2ZGUyNi4uOTA4MjBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5jCkBAIC0xMTMsNyArMTEzLDYgQEAKIAliZmFfYXNzZXJ0KGNmZy0+ZndjZmcubnVtX2NxcyA8PSBCRklfSU9DX01BWF9DUVMpOwogCWJmYV90cmMoYmZhLCBjZmctPmZ3Y2ZnLm51bV9jcXMpOwogCi0JaW9jZmMtPmNmZ2RvbmUgPSBCRkFfRkFMU0U7CiAJYmZhX2lvY2ZjX3Jlc2V0X3F1ZXVlcyhiZmEpOwogCiAJLyoqCkBAIC0xNDUsNiArMTQ0LDE1IEBACiAJfQogCiAJLyoqCisJICogRW5hYmxlIGludGVycnVwdCBjb2FsZXNjaW5nIGlmIGl0IGlzIGRyaXZlciBpbml0IHBhdGgKKwkgKiBhbmQgbm90IGlvYyBkaXNhYmxlL2VuYWJsZSBwYXRoLgorCSAqLworCWlmICghaW9jZmMtPmNmZ2RvbmUpCisJCWNmZ19pbmZvLT5pbnRyX2F0dHIuY29hbGVzY2UgPSBCRkFfVFJVRTsKKworCWlvY2ZjLT5jZmdkb25lID0gQkZBX0ZBTFNFOworCisJLyoqCiAJICogZG1hIG1hcCBJT0MgY29uZmlndXJhdGlvbiBpdHNlbGYKIAkgKi8KIAliZmlfaDJpX3NldChjZmdfcmVxLm1oLCBCRklfTUNfSU9DRkMsIEJGSV9JT0NGQ19IMklfQ0ZHX1JFUSwKQEAgLTE3MCw3ICsxNzgsNyBAQAogCS8qKgogCSAqIEluaXRpYWxpemUgY2hpcCBzcGVjaWZpYyBoYW5kbGVycy4KIAkgKi8KLQlpZiAoYmZhX2lvY19kZXZpZCgmYmZhLT5pb2MpID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUKSB7CisJaWYgKGJmYV9hc2ljX2lkX2N0KGJmYV9pb2NfZGV2aWQoJmJmYS0+aW9jKSkpIHsKIAkJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdCA9IGJmYV9od2N0X3JlZ2luaXQ7CiAJCWlvY2ZjLT5od2lmLmh3X3JlcXFfYWNrID0gYmZhX2h3Y3RfcmVxcV9hY2s7CiAJCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y3RfcnNwcV9hY2s7CkBAIC0xNzksNiArMTg3LDcgQEAKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF91bmluc3RhbGwgPSBiZmFfaHdjdF9tc2l4X3VuaW5zdGFsbDsKIAkJaW9jZmMtPmh3aWYuaHdfaXNyX21vZGVfc2V0ID0gYmZhX2h3Y3RfaXNyX21vZGVfc2V0OwogCQlpb2NmYy0+aHdpZi5od19tc2l4X2dldHZlY3MgPSBiZmFfaHdjdF9tc2l4X2dldHZlY3M7CisJCWlvY2ZjLT5od2lmLmh3X21zaXhfZ2V0X3JtZV9yYW5nZSA9IGJmYV9od2N0X21zaXhfZ2V0X3JtZV9yYW5nZTsKIAl9IGVsc2UgewogCQlpb2NmYy0+aHdpZi5od19yZWdpbml0ID0gYmZhX2h3Y2JfcmVnaW5pdDsKIAkJaW9jZmMtPmh3aWYuaHdfcmVxcV9hY2sgPSBiZmFfaHdjYl9yZXFxX2FjazsKQEAgLTE4OCw2ICsxOTcsNyBAQAogCQlpb2NmYy0+aHdpZi5od19tc2l4X3VuaW5zdGFsbCA9IGJmYV9od2NiX21zaXhfdW5pbnN0YWxsOwogCQlpb2NmYy0+aHdpZi5od19pc3JfbW9kZV9zZXQgPSBiZmFfaHdjYl9pc3JfbW9kZV9zZXQ7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfZ2V0dmVjcyA9IGJmYV9od2NiX21zaXhfZ2V0dmVjczsKKwkJaW9jZmMtPmh3aWYuaHdfbXNpeF9nZXRfcm1lX3JhbmdlID0gYmZhX2h3Y2JfbXNpeF9nZXRfcm1lX3JhbmdlOwogCX0KIAogCWlvY2ZjLT5od2lmLmh3X3JlZ2luaXQoYmZhKTsKQEAgLTI5MSwxOCArMzAxLDYgQEAKIH0KIAogLyoqCi0gKiBCRkEgc3VibW9kdWxlcyBpbml0aWFsaXphdGlvbiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLWJmYV9pb2NmY19pbml0ZG9uZV9zdWJtb2Qoc3RydWN0IGJmYV9zICpiZmEpCi17Ci0JaW50ICAgICAgICAgICAgIGk7Ci0KLQlmb3IgKGkgPSAwOyBoYWxfbW9kc1tpXTsgaSsrKQotCQloYWxfbW9kc1tpXS0+aW5pdGRvbmUoYmZhKTsKLX0KLQotLyoqCiAgKiBTdGFydCBCRkEgc3VibW9kdWxlcy4KICAqLwogc3RhdGljIHZvaWQKQEAgLTM3Niw3ICszNzQsNiBAQAogCXN0cnVjdCBiZmFfaW9jZmNfcwkJKmlvY2ZjCSA9ICZiZmEtPmlvY2ZjOwogCXN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MJKmNmZ3JzcCAgPSBpb2NmYy0+Y2ZncnNwOwogCXN0cnVjdCBiZmFfaW9jZmNfZndjZmdfcwkqZndjZmcgICA9ICZjZmdyc3AtPmZ3Y2ZnOwotCXN0cnVjdCBiZmlfaW9jZmNfY2ZnX3MgCQkqY2ZnaW5mbyA9IGlvY2ZjLT5jZmdpbmZvOwogCiAJZndjZmctPm51bV9jcXMgICAgICAgID0gZndjZmctPm51bV9jcXM7CiAJZndjZmctPm51bV9pb2ltX3JlcXMgID0gYmZhX29zX250b2hzKGZ3Y2ZnLT5udW1faW9pbV9yZXFzKTsKQEAgLTM4NSwxNSArMzgyLDEzIEBACiAJZndjZmctPm51bV91Zl9idWZzICAgID0gYmZhX29zX250b2hzKGZ3Y2ZnLT5udW1fdWZfYnVmcyk7CiAJZndjZmctPm51bV9ycG9ydHMgICAgID0gYmZhX29zX250b2hzKGZ3Y2ZnLT5udW1fcnBvcnRzKTsKIAotCWNmZ2luZm8tPmludHJfYXR0ci5jb2FsZXNjZSA9IGNmZ3JzcC0+aW50cl9hdHRyLmNvYWxlc2NlOwotCWNmZ2luZm8tPmludHJfYXR0ci5kZWxheSAgICA9IGJmYV9vc19udG9ocyhjZmdyc3AtPmludHJfYXR0ci5kZWxheSk7Ci0JY2ZnaW5mby0+aW50cl9hdHRyLmxhdGVuY3kgID0gYmZhX29zX250b2hzKGNmZ3JzcC0+aW50cl9hdHRyLmxhdGVuY3kpOwotCiAJaW9jZmMtPmNmZ2RvbmUgPSBCRkFfVFJVRTsKIAogCS8qKgogCSAqIENvbmZpZ3VyYXRpb24gaXMgY29tcGxldGUgLSBpbml0aWFsaXplL3N0YXJ0IHN1Ym1vZHVsZXMKIAkgKi8KKwliZmFfZmNwb3J0X2luaXQoYmZhKTsKKwogCWlmIChpb2NmYy0+YWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfSU5JVCkKIAkJYmZhX2NiX3F1ZXVlKGJmYSwgJmlvY2ZjLT5pbml0X2hjYl9xZSwgYmZhX2lvY2ZjX2luaXRfY2IsIGJmYSk7CiAJZWxzZQpAQCAtNTMxLDcgKzUyNiw2IEBACiAJCXJldHVybjsKIAl9CiAKLQliZmFfaW9jZmNfaW5pdGRvbmVfc3VibW9kKGJmYSk7CiAJYmZhX2lvY2ZjX3NlbmRfY2ZnKGJmYSk7CiB9CiAKQEAgLTYyNSw5ICs2MTksOSBAQAogCQliZmEtPnRyY21vZCwgYmZhLT5hZW4sIGJmYS0+bG9nbSk7CiAKIAkvKioKLQkgKiBDaG9vc2UgRkMgKHNzaWQ6IDB4MUMpIHYvcyBGQ29FIChzc2lkOiAweDE0KSBtb2RlLgorCSAqIFNldCBGQyBtb2RlIGZvciBCRkFfUENJX0RFVklDRV9JRF9DVF9GQy4KIAkgKi8KLQlpZiAoMCkKKwlpZiAocGNpZGV2LT5kZXZpY2VfaWQgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1RfRkMpCiAJCWJmYV9pb2Nfc2V0X2ZjbW9kZSgmYmZhLT5pb2MpOwogCiAJYmZhX2lvY19wY2lfaW5pdCgmYmZhLT5pb2MsIHBjaWRldiwgQkZJX01DX0lPQ0ZDKTsKQEAgLTc0OCwxMCArNzQyLDIwIEBACiB2b2lkCiBiZmFfaW9jZmNfZ2V0X2F0dHIoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfaW9jZmNfYXR0cl9zICphdHRyKQogewotCXN0cnVjdCBiZmFfaW9jZmNfcwkqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MgICAgICAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKIAotCWF0dHItPmludHJfYXR0ciA9IGlvY2ZjLT5jZmdpbmZvLT5pbnRyX2F0dHI7Ci0JYXR0ci0+Y29uZmlnCT0gaW9jZmMtPmNmZzsKKwlhdHRyLT5pbnRyX2F0dHIuY29hbGVzY2UgPSBpb2NmYy0+Y2ZnaW5mby0+aW50cl9hdHRyLmNvYWxlc2NlOworCisJYXR0ci0+aW50cl9hdHRyLmRlbGF5ID0gaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0ci5kZWxheSA/CisJCQliZmFfb3NfbnRvaHMoaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0ci5kZWxheSkgOgorCQkJYmZhX29zX250b2hzKGlvY2ZjLT5jZmdyc3AtPmludHJfYXR0ci5kZWxheSk7CisKKwlhdHRyLT5pbnRyX2F0dHIubGF0ZW5jeSA9IGlvY2ZjLT5jZmdpbmZvLT5pbnRyX2F0dHIubGF0ZW5jeSA/CisJCQliZmFfb3NfbnRvaHMoaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0ci5sYXRlbmN5KSA6CisJCQliZmFfb3NfbnRvaHMoaW9jZmMtPmNmZ3JzcC0+aW50cl9hdHRyLmxhdGVuY3kpOworCisJYXR0ci0+Y29uZmlnICAgID0gaW9jZmMtPmNmZzsKKwogfQogCiBiZmFfc3RhdHVzX3QKQEAgLTc2MCw3ICs3NjQsMTAgQEAKIAlzdHJ1Y3QgYmZhX2lvY2ZjX3MJCSppb2NmYyA9ICZiZmEtPmlvY2ZjOwogCXN0cnVjdCBiZmlfaW9jZmNfc2V0X2ludHJfcmVxX3MgKm07CiAKLQlpb2NmYy0+Y2ZnaW5mby0+aW50cl9hdHRyID0gKmF0dHI7CisJaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0ci5jb2FsZXNjZSA9IGF0dHItPmNvYWxlc2NlOworCWlvY2ZjLT5jZmdpbmZvLT5pbnRyX2F0dHIuZGVsYXkgPSBiZmFfb3NfaHRvbnMoYXR0ci0+ZGVsYXkpOworCWlvY2ZjLT5jZmdpbmZvLT5pbnRyX2F0dHIubGF0ZW5jeSA9IGJmYV9vc19odG9ucyhhdHRyLT5sYXRlbmN5KTsKKwogCWlmICghYmZhX2lvY2ZjX2lzX29wZXJhdGlvbmFsKGJmYSkpCiAJCXJldHVybiBCRkFfU1RBVFVTX09LOwogCkBAIC03NzAsOSArNzc3LDEwIEBACiAKIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0lPQ0ZDLCBCRklfSU9DRkNfSDJJX1NFVF9JTlRSX1JFUSwKIAkJCWJmYV9scHVpZChiZmEpKTsKLQltLT5jb2FsZXNjZSA9IGF0dHItPmNvYWxlc2NlOwotCW0tPmRlbGF5ICAgID0gYmZhX29zX2h0b25zKGF0dHItPmRlbGF5KTsKLQltLT5sYXRlbmN5ICA9IGJmYV9vc19odG9ucyhhdHRyLT5sYXRlbmN5KTsKKwltLT5jb2FsZXNjZSA9IGlvY2ZjLT5jZmdpbmZvLT5pbnRyX2F0dHIuY29hbGVzY2U7CisJbS0+ZGVsYXkgICAgPSBpb2NmYy0+Y2ZnaW5mby0+aW50cl9hdHRyLmRlbGF5OworCW0tPmxhdGVuY3kgID0gaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0ci5sYXRlbmN5OworCiAKIAliZmFfdHJjKGJmYSwgYXR0ci0+ZGVsYXkpOwogCWJmYV90cmMoYmZhLCBhdHRyLT5sYXRlbmN5KTsKQEAgLTg3MiwxNSArODgwLDQ4IEBACiAgKiBSZXR1cm4gYm9vdCB0YXJnZXQgcG9ydCB3d25zIC0tIHJlYWQgZnJvbSBib290IGluZm9ybWF0aW9uIGluIGZsYXNoLgogICovCiB2b2lkCi1iZmFfaW9jZmNfZ2V0X2Jvb3R3d25zKHN0cnVjdCBiZmFfcyAqYmZhLCB1OCAqbnd3bnMsIHd3bl90ICoqd3ducykKK2JmYV9pb2NmY19nZXRfYm9vdHd3bnMoc3RydWN0IGJmYV9zICpiZmEsIHU4ICpud3ducywgd3duX3QgKnd3bnMpCiB7Ci0Jc3RydWN0IGJmYV9pb2NmY19zCQkqaW9jZmMJID0gJmJmYS0+aW9jZmM7Ci0Jc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcwkqY2ZncnNwICA9IGlvY2ZjLT5jZmdyc3A7CisJc3RydWN0IGJmYV9pb2NmY19zICppb2NmYyA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MgKmNmZ3JzcCA9IGlvY2ZjLT5jZmdyc3A7CisJaW50IGk7CisKKwlpZiAoY2ZncnNwLT5wYmNfY2ZnLmJvb3RfZW5hYmxlZCAmJiBjZmdyc3AtPnBiY19jZmcubmJsdW5zKSB7CisJCWJmYV90cmMoYmZhLCBjZmdyc3AtPnBiY19jZmcubmJsdW5zKTsKKwkJKm53d25zID0gY2ZncnNwLT5wYmNfY2ZnLm5ibHVuczsKKwkJZm9yIChpID0gMDsgaSA8IGNmZ3JzcC0+cGJjX2NmZy5uYmx1bnM7IGkrKykKKwkJCXd3bnNbaV0gPSBjZmdyc3AtPnBiY19jZmcuYmx1bltpXS50Z3RfcHd3bjsKKworCQlyZXR1cm47CisJfQogCiAJKm53d25zID0gY2ZncnNwLT5ib290d3ducy5ud3duczsKLQkqd3ducyA9IGNmZ3JzcC0+Ym9vdHd3bnMud3duOworCW1lbWNweSh3d25zLCBjZmdyc3AtPmJvb3R3d25zLnd3biwgc2l6ZW9mKGNmZ3JzcC0+Ym9vdHd3bnMud3duKSk7CiB9CiAKK3ZvaWQKK2JmYV9pb2NmY19nZXRfcGJjX2Jvb3RfY2ZnKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2Jvb3RfcGJjX3MgKnBiY2ZnKQoreworCXN0cnVjdCBiZmFfaW9jZmNfcyAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zICpjZmdyc3AgPSBpb2NmYy0+Y2ZncnNwOworCisJcGJjZmctPmVuYWJsZSA9IGNmZ3JzcC0+cGJjX2NmZy5ib290X2VuYWJsZWQ7CisJcGJjZmctPm5ibHVucyA9IGNmZ3JzcC0+cGJjX2NmZy5uYmx1bnM7CisJcGJjZmctPnNwZWVkID0gY2ZncnNwLT5wYmNfY2ZnLnBvcnRfc3BlZWQ7CisJbWVtY3B5KHBiY2ZnLT5wYmx1biwgY2ZncnNwLT5wYmNfY2ZnLmJsdW4sIHNpemVvZihwYmNmZy0+cGJsdW4pKTsKK30KKworaW50CitiZmFfaW9jZmNfZ2V0X3BiY192cG9ydHMoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfcGJjX3Zwb3J0X3MgKnBiY192cG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MgKmlvY2ZjID0gJmJmYS0+aW9jZmM7CisJc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcyAqY2ZncnNwID0gaW9jZmMtPmNmZ3JzcDsKKworCW1lbWNweShwYmNfdnBvcnQsIGNmZ3JzcC0+cGJjX2NmZy52cG9ydCwgc2l6ZW9mKGNmZ3JzcC0+cGJjX2NmZy52cG9ydCkpOworCXJldHVybiBjZmdyc3AtPnBiY19jZmcubnZwb3J0czsKK30KKworCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuaAppbmRleCBmYmI0YmRjLi43NGE2YTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxiZmFfaW9jLmg+CiAjaW5jbHVkZSA8YmZhLmg+CiAjaW5jbHVkZSA8YmZpL2JmaV9pb2NmYy5oPgorI2luY2x1ZGUgPGJmaS9iZmlfcGJjLmg+CiAjaW5jbHVkZSA8YmZhX2NhbGxiYWNrX3ByaXYuaD4KIAogI2RlZmluZSBCRkFfUkVRUV9ORUxFTVNfTUlOCSg0KQpAQCAtNjIsNiArNjMsOCBAQAogCXZvaWQgKCpod19pc3JfbW9kZV9zZXQpKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IG1zaXgpOwogCXZvaWQgKCpod19tc2l4X2dldHZlY3MpKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKnZlY21hcCwKIAkJCXUzMiAqbnZlY3MsIHUzMiAqbWF4dmVjKTsKKwl2b2lkICgqaHdfbXNpeF9nZXRfcm1lX3JhbmdlKSAoc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqc3RhcnQsCisJCQl1MzIgKmVuZCk7CiB9OwogdHlwZWRlZiB2b2lkICgqYmZhX2NiX2lvY2ZjX3QpICh2b2lkICpjYmFyZywgZW51bSBiZmFfc3RhdHVzIHN0YXR1cyk7CiAKQEAgLTEwMyw3ICsxMDYsOCBAQAogCXN0cnVjdCBiZmFfaHdpZl9zCWh3aWY7CiAKIAliZmFfY2JfaW9jZmNfdAkJdXBkYXRlcV9jYmZuOyAvKiAgYmlvcyBjYWxsYmFjayBmdW5jdGlvbiAqLwotCXZvaWQJCQkJKnVwZGF0ZXFfY2Jhcmc7CS8qICBiaW9zIGNhbGxiYWNrIGFyZyAqLworCXZvaWQJCQkqdXBkYXRlcV9jYmFyZzsJLyogIGJpb3MgY2FsbGJhY2sgYXJnICovCisJdTMyCQkJaW50cl9tYXNrOwogfTsKIAogI2RlZmluZSBiZmFfbHB1aWQoX19iZmEpCQliZmFfaW9jX3BvcnRpZCgmKF9fYmZhKS0+aW9jKQpAQCAtMTE2LDcgKzEyMCwxMCBAQAogI2RlZmluZSBiZmFfaXNyX21vZGVfc2V0KF9fYmZhLCBfX21zaXgpCVwKIAkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19pc3JfbW9kZV9zZXQoX19iZmEsIF9fbXNpeCkpCiAjZGVmaW5lIGJmYV9tc2l4X2dldHZlY3MoX19iZmEsIF9fdmVjbWFwLCBfX252ZWNzLCBfX21heHZlYykJXAotCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9nZXR2ZWNzKF9fYmZhLCBfX3ZlY21hcCwgX19udmVjcywgX19tYXh2ZWMpCisJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9nZXR2ZWNzKF9fYmZhLCBfX3ZlY21hcCwJXAorCQkgX19udmVjcywgX19tYXh2ZWMpKQorI2RlZmluZSBiZmFfbXNpeF9nZXRfcm1lX3JhbmdlKF9fYmZhLCBfX3N0YXJ0LCBfX2VuZCkgICBcCisJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9nZXRfcm1lX3JhbmdlKF9fYmZhLCBfX3N0YXJ0LCBfX2VuZCkpCiAKIC8qCiAgKiBGQyBzcGVjaWZpYyBJT0MgZnVuY3Rpb25zLgpAQCAtMTUyLDYgKzE1OSw3IEBACiB2b2lkIGJmYV9od2NiX2lzcl9tb2RlX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBtc2l4KTsKIHZvaWQgYmZhX2h3Y2JfbXNpeF9nZXR2ZWNzKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKnZlY21hcCwKIAkJCXUzMiAqbnZlY3MsIHUzMiAqbWF4dmVjKTsKK3ZvaWQgYmZhX2h3Y2JfbXNpeF9nZXRfcm1lX3JhbmdlKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKnN0YXJ0LCB1MzIgKmVuZCk7CiB2b2lkIGJmYV9od2N0X3JlZ2luaXQoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjdF9yZXFxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwogdm9pZCBiZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwpAQCAtMTYxLDExICsxNjksMTYgQEAKIHZvaWQgYmZhX2h3Y3RfaXNyX21vZGVfc2V0KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IG1zaXgpOwogdm9pZCBiZmFfaHdjdF9tc2l4X2dldHZlY3Moc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqdmVjbWFwLAogCQkJdTMyICpudmVjcywgdTMyICptYXh2ZWMpOwordm9pZCBiZmFfaHdjdF9tc2l4X2dldF9ybWVfcmFuZ2Uoc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqc3RhcnQsIHUzMiAqZW5kKTsKIAogdm9pZCBiZmFfY29tX21lbWluZm8oYmZhX2Jvb2xlYW5fdCBtaW5jZmcsIHUzMiAqZG1fbGVuKTsKIHZvaWQgYmZhX2NvbV9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfbWVtaW5mb19zICptaSwKIAkJYmZhX2Jvb2xlYW5fdCBtaW5jZmcpOwotdm9pZCBiZmFfaW9jZmNfZ2V0X2Jvb3R3d25zKHN0cnVjdCBiZmFfcyAqYmZhLCB1OCAqbnd3bnMsIHd3bl90ICoqd3ducyk7Cit2b2lkIGJmYV9pb2NmY19nZXRfYm9vdHd3bnMoc3RydWN0IGJmYV9zICpiZmEsIHU4ICpud3ducywgd3duX3QgKnd3bnMpOwordm9pZCBiZmFfaW9jZmNfZ2V0X3BiY19ib290X2NmZyhzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJc3RydWN0IGJmYV9ib290X3BiY19zICpwYmNmZyk7CitpbnQgYmZhX2lvY2ZjX2dldF9wYmNfdnBvcnRzKHN0cnVjdCBiZmFfcyAqYmZhLAorCQlzdHJ1Y3QgYmZpX3BiY192cG9ydF9zICpwYmNfdnBvcnQpOwogCiAjZW5kaWYgLyogX19CRkFfSU9DRkNfSF9fICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvaW0uYwppbmRleCA2ODdmM2Q2Li5iZGZkYzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9pbS5jCkBAIC0xMzMsNiArMTMzLDggQEAKIAogCWNhc2UgQkZBX0lPSU1fU01fSU9UT1Y6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLAogCQkJCV9fYmZhX2NiX2lvaW1fcGF0aHRvdiwgaW9pbSk7CiAJCWJyZWFrOwpAQCAtMTgyLDYgKzE4NCw4IEBACiAJY2FzZSBCRkFfSU9JTV9TTV9BQk9SVDoKIAkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOwogCQliZmFfc2dwZ193Y2FuY2VsKGlvaW0tPmJmYSwgJmlvaW0tPmlvc3AtPnNncGdfd3FlKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAogCQkJICAgICAgaW9pbSk7CiAJCWJyZWFrOwpAQCAtMTg5LDYgKzE5Myw4IEBACiAJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKIAkJYmZhX3NncGdfd2NhbmNlbChpb2ltLT5iZmEsICZpb2ltLT5pb3NwLT5zZ3BnX3dxZSk7CisJCWxpc3RfZGVsKCZpb2ltLT5xZSk7CisJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaW9pbS0+ZmNwaW0tPmlvaW1fY29tcF9xKTsKIAkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9mYWlsZWQsCiAJCQkgICAgICBpb2ltKTsKIAkJYnJlYWs7CkBAIC0yMTAsMTggKzIxNiwyNCBAQAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEJGQV9JT0lNX1NNX0NPTVBfR09PRDoKIAkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQlsaXN0X2RlbCgmaW9pbS0+cWUpOworCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJmlvaW0tPmZjcGltLT5pb2ltX2NvbXBfcSk7CiAJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCiAJCQkgICAgICBfX2JmYV9jYl9pb2ltX2dvb2RfY29tcCwgaW9pbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfSU9JTV9TTV9DT01QOgogCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWxpc3RfZGVsKCZpb2ltLT5xZSk7CisJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaW9pbS0+ZmNwaW0tPmlvaW1fY29tcF9xKTsKIAkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9jb21wLAogCQkJICAgICAgaW9pbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfSU9JTV9TTV9ET05FOgogCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYl9mcmVlKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2NvbXAsCiAJCQkgICAgICBpb2ltKTsKIAkJYnJlYWs7CkBAIC0yMzQsOCArMjQ2LDggQEAKIAkJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fYWJvcnQpOwogCQllbHNlIHsKIAkJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fYWJvcnRfcWZ1bGwpOwotCQkJYmZhX3JlcXFfd2FpdChpb2ltLT5iZmEsIGlvaW0tPml0bmltLT5yZXFxLAotCQkJCQkgICZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQkJYmZhX3JlcXFfd2FpdChpb2ltLT5iZmEsIGlvaW0tPnJlcXEsCisJCQkJCSZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0yNDcsMTMgKzI1OSwxNSBAQAogCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9jbGVhbnVwKTsKIAkJZWxzZSB7CiAJCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2NsZWFudXBfcWZ1bGwpOwotCQkJYmZhX3JlcXFfd2FpdChpb2ltLT5iZmEsIGlvaW0tPml0bmltLT5yZXFxLAotCQkJCQkgICZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQkJYmZhX3JlcXFfd2FpdChpb2ltLT5iZmEsIGlvaW0tPnJlcXEsCisJCQkJCSZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKIAkJCSAgICAgIGlvaW0pOwogCQlicmVhazsKQEAgLTI4NywxMiArMzAxLDE2IEBACiAKIAljYXNlIEJGQV9JT0lNX1NNX0FCT1JUX0NPTVA6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAogCQkJICAgICAgaW9pbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfSU9JTV9TTV9DT01QX1VUQUc6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAogCQkJICAgICAgaW9pbSk7CiAJCWJyZWFrOwpAQCAtMzA1LDEzICszMjMsMTUgQEAKIAkJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fY2xlYW51cCk7CiAJCWVsc2UgewogCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9jbGVhbnVwX3FmdWxsKTsKLQkJCWJmYV9yZXFxX3dhaXQoaW9pbS0+YmZhLCBpb2ltLT5pdG5pbS0+cmVxcSwKKwkJCWJmYV9yZXFxX3dhaXQoaW9pbS0+YmZhLCBpb2ltLT5yZXFxLAogCQkJCQkgICZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKIAkJCSAgICAgIGlvaW0pOwogCQlicmVhazsKQEAgLTM2NSw2ICszODUsOCBAQAogCiAJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKIAkJCSAgICAgIGlvaW0pOwogCQlicmVhazsKQEAgLTM5OSw2ICs0MjEsOCBAQAogCWNhc2UgQkZBX0lPSU1fU01fQUJPUlQ6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKIAkJYmZhX3JlcXFfd2NhbmNlbCgmaW9pbS0+aW9zcC0+cmVxcV93YWl0KTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAogCQkJICAgICAgaW9pbSk7CiAJCWJyZWFrOwpAQCAtNDE0LDYgKzQzOCw4IEBACiAJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKIAkJYmZhX3JlcXFfd2NhbmNlbCgmaW9pbS0+aW9zcC0+cmVxcV93YWl0KTsKKwkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKIAkJCSAgICAgIGlvaW0pOwogCQlicmVhazsKQEAgLTQ0OCw2ICs0NzQsOCBAQAogCWNhc2UgQkZBX0lPSU1fU01fQ09NUDoKIAkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOwogCQliZmFfcmVxcV93Y2FuY2VsKCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQlsaXN0X2RlbCgmaW9pbS0+cWUpOworCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJmlvaW0tPmZjcGltLT5pb2ltX2NvbXBfcSk7CiAJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fYWJvcnQsCiAJCQkgICAgICBpb2ltKTsKIAkJYnJlYWs7CkBAIC00NTUsNiArNDgzLDggQEAKIAljYXNlIEJGQV9JT0lNX1NNX0RPTkU6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiX2ZyZWUpOwogCQliZmFfcmVxcV93Y2FuY2VsKCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQlsaXN0X2RlbCgmaW9pbS0+cWUpOworCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJmlvaW0tPmZjcGltLT5pb2ltX2NvbXBfcSk7CiAJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fYWJvcnQsCiAJCQkgICAgICBpb2ltKTsKIAkJYnJlYWs7CkBAIC00NjIsNiArNDkyLDggQEAKIAljYXNlIEJGQV9JT0lNX1NNX0hXRkFJTDoKIAkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOwogCQliZmFfcmVxcV93Y2FuY2VsKCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQlsaXN0X2RlbCgmaW9pbS0+cWUpOworCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJmlvaW0tPmZjcGltLT5pb2ltX2NvbXBfcSk7CiAJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fZmFpbGVkLAogCQkJICAgICAgaW9pbSk7CiAJCWJyZWFrOwpAQCAtNDg4LDcgKzUyMCw3IEBACiAKIAljYXNlIEJGQV9JT0lNX1NNX0FCT1JUOgogCQkvKioKLQkJICogSU8gaXMgYWxyYWVkeSBiZWluZyBjbGVhbmVkIHVwIGltcGxpY2l0bHkKKwkJICogSU8gaXMgYWxyZWFkeSBiZWluZyBjbGVhbmVkIHVwIGltcGxpY2l0bHkKIAkJICovCiAJCWlvaW0tPmlvX2NiZm4gPSBfX2JmYV9jYl9pb2ltX2Fib3J0OwogCQlicmVhazsKQEAgLTUxMSw2ICs1NDMsOCBAQAogCWNhc2UgQkZBX0lPSU1fU01fSFdGQUlMOgogCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CiAJCWJmYV9yZXFxX3djYW5jZWwoJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCWxpc3RfZGVsKCZpb2ltLT5xZSk7CisJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaW9pbS0+ZmNwaW0tPmlvaW1fY29tcF9xKTsKIAkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9mYWlsZWQsCiAJCQkgICAgICBpb2ltKTsKIAkJYnJlYWs7CkBAIC03MzgsOSArNzcyLDkgQEAKIAkvKioKIAkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CiAJICovCi0JbSA9IGJmYV9yZXFxX25leHQoaW9pbS0+YmZhLCBpdG5pbS0+cmVxcSk7CisJbSA9IGJmYV9yZXFxX25leHQoaW9pbS0+YmZhLCBpb2ltLT5yZXFxKTsKIAlpZiAoIW0pIHsKLQkJYmZhX3JlcXFfd2FpdChpb2ltLT5iZmEsIGlvaW0tPml0bmltLT5yZXFxLAorCQliZmFfcmVxcV93YWl0KGlvaW0tPmJmYSwgaW9pbS0+cmVxcSwKIAkJCQkgICZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOwogCQlyZXR1cm4gQkZBX0ZBTFNFOwogCX0KQEAgLTgzMiw3ICs4NjYsNyBAQAogCS8qKgogCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCiAJICovCi0JYmZhX3JlcXFfcHJvZHVjZShpb2ltLT5iZmEsIGl0bmltLT5yZXFxKTsKKwliZmFfcmVxcV9wcm9kdWNlKGlvaW0tPmJmYSwgaW9pbS0+cmVxcSk7CiAJcmV0dXJuIEJGQV9UUlVFOwogfQogCkBAIC05MzAsMTQgKzk2NCwxMyBAQAogc3RhdGljICAgICAgICAgIGJmYV9ib29sZWFuX3QKIGJmYV9pb2ltX3NlbmRfYWJvcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCiB7Ci0Jc3RydWN0IGJmYV9pdG5pbV9zICAgICAgICAgICppdG5pbSA9IGlvaW0tPml0bmltOwogCXN0cnVjdCBiZmlfaW9pbV9hYm9ydF9yZXFfcyAqbTsKIAllbnVtIGJmaV9pb2ltX2gyaSAgICAgICBtc2dvcDsKIAogCS8qKgogCSAqIGNoZWNrIGZvciByb29tIGluIHF1ZXVlIHRvIHNlbmQgcmVxdWVzdCBub3cKIAkgKi8KLQltID0gYmZhX3JlcXFfbmV4dChpb2ltLT5iZmEsIGl0bmltLT5yZXFxKTsKKwltID0gYmZhX3JlcXFfbmV4dChpb2ltLT5iZmEsIGlvaW0tPnJlcXEpOwogCWlmICghbSkKIAkJcmV0dXJuIEJGQV9GQUxTRTsKIApAQCAtOTU2LDcgKzk4OSw3IEBACiAJLyoqCiAJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKIAkgKi8KLQliZmFfcmVxcV9wcm9kdWNlKGlvaW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCWJmYV9yZXFxX3Byb2R1Y2UoaW9pbS0+YmZhLCBpb2ltLT5yZXFxKTsKIAlyZXR1cm4gQkZBX1RSVUU7CiB9CiAKQEAgLTEzMDYsNiArMTMzOSwxNCBAQAogYmZhX2lvaW1fc3RhcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCiB7CiAJYmZhX3RyY19mcChpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKworCS8qKgorCSAqIE9idGFpbiB0aGUgcXVldWUgb3ZlciB3aGljaCB0aGlzIHJlcXVlc3QgaGFzIHRvIGJlIGlzc3VlZAorCSAqLworCWlvaW0tPnJlcXEgPSBiZmFfZmNwaW1faW9yZWRpcmVjdF9lbmFibGVkKGlvaW0tPmJmYSkgPworCQkJYmZhX2NiX2lvaW1fZ2V0X3JlcXEoaW9pbS0+ZGlvKSA6CisJCQliZmFfaXRuaW1fZ2V0X3JlcXEoaW9pbSk7CisKIAliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9TVEFSVCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2xvZ19tb2R1bGUuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2xvZ19tb2R1bGUuYwppbmRleCA1YzE1NGQzLi5jZjU3N2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9sb2dfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbG9nX21vZHVsZS5jCkBAIC0xMTAsNiArMTEwLDI3IEBACiAgIlJ1bm5pbmcgZmlybXdhcmUgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZHJpdmVyIHZlcnNpb24uIiwKICAoMCksIDB9LAogCit7QkZBX0FFTl9JT0NfRldDRkdfRVJST1IsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0NSSVRJQ0FMLCAiQkZBX0FFTl9JT0NfRldDRkdfRVJST1IiLAorICJMaW5rIGluaXRpYWxpemF0aW9uIGZhaWxlZCBkdWUgdG8gZmlybXdhcmUgY29uZmlndXJhdGlvbiByZWFkIGVycm9yOiIKKyAiIFdXTiA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fSU9DX0lOVkFMSURfVkVORE9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19FUlJPUiwgIkJGQV9BRU5fSU9DX0lOVkFMSURfVkVORE9SIiwKKyAiVW5zdXBwb3J0ZWQgc3dpdGNoIHZlbmRvci4gTGluayBpbml0aWFsaXphdGlvbiBmYWlsZWQ6IFdXTiA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fSU9DX0lOVkFMSURfTldXTiwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfRVJST1IsICJCRkFfQUVOX0lPQ19JTlZBTElEX05XV04iLAorICJJbnZhbGlkIE5XV04uIExpbmsgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiBOV1dOID0gMDA6MDA6MDA6MDA6MDA6MDA6MDA6MDAuIiwKKyAoMCksIDB9LAorCit7QkZBX0FFTl9JT0NfSU5WQUxJRF9QV1dOLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19FUlJPUiwgIkJGQV9BRU5fSU9DX0lOVkFMSURfUFdXTiIsCisgIkludmFsaWQgUFdXTi4gTGluayBpbml0aWFsaXphdGlvbiBmYWlsZWQ6IFBXV04gPSAwMDowMDowMDowMDowMDowMDowMDowMC4iLAorICgwKSwgMH0sCisKIAogCiAKQEAgLTM0Nyw2ICszNjgsMjIgQEAKICAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzEpIHwKICAgKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzIpIHwgMCksIDN9LAogCit7QkZBX0xPR19IQUxfRFJJVkVSX0VSUk9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiSEFMX0RSSVZFUl9FUlJPUiIsCisgIiVzIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0xPR19IQUxfRFJJVkVSX0NPTkZJR19FUlJPUiwKKyBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiSEFMX0RSSVZFUl9DT05GSUdfRVJST1IiLAorICIlcyIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfSEFMX01CT1hfRVJST1IsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJIQUxfTUJPWF9FUlJPUiIsCisgIiVzIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCiAKIAogCkBAIC00MTIsNiArNDQ5LDU1IEBACiAgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1AgPDwgQkZBX0xPR19BUkcxKSB8CiAgIChCRkFfTE9HX1ggPDwgQkZBX0xPR19BUkcyKSB8IDApLCAzfSwKIAore0JGQV9MT0dfTElOVVhfRFJJVkVSX0NPTkZJR19FUlJPUiwKKyBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiTElOVVhfRFJJVkVSX0NPTkZJR19FUlJPUiIsCisgIiVzIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0xPR19MSU5VWF9CTkFfU1RBVEVfTUFDSElORSwKKyBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiTElOVVhfQk5BX1NUQVRFX01BQ0hJTkUiLAorICIlcyIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfTElOVVhfSU9DX0VSUk9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiTElOVVhfSU9DX0VSUk9SIiwKKyAiJXMiLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfTE9HX0xJTlVYX1JFU09VUkNFX0FMTE9DX0VSUk9SLAorIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJMSU5VWF9SRVNPVVJDRV9BTExPQ19FUlJPUiIsCisgIiVzIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0xPR19MSU5VWF9SSU5HX0JVRkZFUl9FUlJPUiwKKyBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiTElOVVhfUklOR19CVUZGRVJfRVJST1IiLAorICIlcyIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfTElOVVhfRFJJVkVSX0VSUk9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19FUlJPUiwgIkxJTlVYX0RSSVZFUl9FUlJPUiIsCisgIiVzIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0xPR19MSU5VWF9EUklWRVJfSU5GTywgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkxJTlVYX0RSSVZFUl9JTkZPIiwKKyAiJXMiLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfTE9HX0xJTlVYX0RSSVZFUl9ESUFHLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiTElOVVhfRFJJVkVSX0RJQUciLAorICIlcyIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfTElOVVhfRFJJVkVSX0FFTiwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkxJTlVYX0RSSVZFUl9BRU4iLAorICIlcyIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwogCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbHBzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9scHMuYwppbmRleCBhZDA2ZjYxLi5hY2FiYjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9scHMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9scHMuYwpAQCAtNDEsNyArNDEsNiBAQAogCQkJICAgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAogCQkJICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCiAJCQkgICBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpOwotc3RhdGljIHZvaWQgYmZhX2xwc19pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSk7CiBzdGF0aWMgdm9pZCBiZmFfbHBzX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiBzdGF0aWMgdm9pZCBiZmFfbHBzX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKTsKIHN0YXRpYyB2b2lkIGJmYV9scHNfc3RvcChzdHJ1Y3QgYmZhX3MgKmJmYSk7CkBAIC0zNDcsMTEgKzM0Niw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1iZmFfbHBzX2luaXRkb25lKHN0cnVjdCBiZmFfcyAqYmZhKQotewotfQotCi1zdGF0aWMgdm9pZAogYmZhX2xwc19kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpCiB7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wb3J0LmMKaW5kZXggY2FiMTkwMi4uYzdlNjlmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuYwpAQCAtMTAyLDkgKzEwMiwxNCBAQAogCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CiAKIAlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJc3RydWN0IGJmYV90aW1ldmFsX3MgdHY7CisKIAkJbWVtY3B5KHBvcnQtPnN0YXRzLCBwb3J0LT5zdGF0c19kbWEua3ZhLAogCQkgICAgICAgc2l6ZW9mKHVuaW9uIGJmYV9wcG9ydF9zdGF0c191KSk7CiAJCWJmYV9wb3J0X3N0YXRzX3N3YXAocG9ydCwgcG9ydC0+c3RhdHMpOworCisJCWJmYV9vc19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJcG9ydC0+c3RhdHMtPmZjLnNlY3NfcmVzZXQgPSB0di50dl9zZWMgLSBwb3J0LT5zdGF0c19yZXNldF90aW1lOwogCX0KIAogCWlmIChwb3J0LT5zdGF0c19jYmZuKSB7CkBAIC0xMjUsOSArMTMwLDE3IEBACiBzdGF0aWMgdm9pZAogYmZhX3BvcnRfY2xlYXJfc3RhdHNfaXNyKHN0cnVjdCBiZmFfcG9ydF9zICpwb3J0LCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQogeworCXN0cnVjdCBiZmFfdGltZXZhbF9zIHR2OworCiAJcG9ydC0+c3RhdHNfc3RhdHVzID0gc3RhdHVzOwogCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CiAKKwkvKioKKwkgKiByZS1pbml0aWFsaXplIHRpbWUgc3RhbXAgZm9yIHN0YXRzIHJlc2V0CisJICovCisJYmZhX29zX2dldHRpbWVvZmRheSgmdHYpOworCXBvcnQtPnN0YXRzX3Jlc2V0X3RpbWUgPSB0di50dl9zZWM7CisKIAlpZiAocG9ydC0+c3RhdHNfY2JmbikgewogCQlwb3J0LT5zdGF0c19jYmZuKHBvcnQtPnN0YXRzX2NiYXJnLCBzdGF0dXMpOwogCQlwb3J0LT5zdGF0c19jYmZuID0gTlVMTDsKQEAgLTM5NCw3ICs0MDcsNyBAQAogCSAqLwogCWlmIChwb3J0LT5zdGF0c19idXN5KSB7CiAJCWlmIChwb3J0LT5zdGF0c19jYmZuKQotCQkJcG9ydC0+c3RhdHNfY2Jmbihwb3J0LT5kZXYsIEJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCXBvcnQtPnN0YXRzX2NiZm4ocG9ydC0+c3RhdHNfY2JhcmcsIEJGQV9TVEFUVVNfRkFJTEVEKTsKIAkJcG9ydC0+c3RhdHNfY2JmbiA9IE5VTEw7CiAJCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CiAJfQpAQCAtNDA0LDcgKzQxNyw3IEBACiAJICovCiAJaWYgKHBvcnQtPmVuZGlzX3BlbmRpbmcpIHsKIAkJaWYgKHBvcnQtPmVuZGlzX2NiZm4pCi0JCQlwb3J0LT5lbmRpc19jYmZuKHBvcnQtPmRldiwgQkZBX1NUQVRVU19GQUlMRUQpOworCQkJcG9ydC0+ZW5kaXNfY2Jmbihwb3J0LT5lbmRpc19jYmFyZywgQkZBX1NUQVRVU19GQUlMRUQpOwogCQlwb3J0LT5lbmRpc19jYmZuID0gTlVMTDsKIAkJcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9GQUxTRTsKIAl9CkBAIC00MjgsNiArNDQxLDggQEAKIGJmYV9wb3J0X2F0dGFjaChzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwgc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpkZXYsCiAJCXN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QsIHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2QpCiB7CisJc3RydWN0IGJmYV90aW1ldmFsX3MgdHY7CisKIAliZmFfYXNzZXJ0KHBvcnQpOwogCiAJcG9ydC0+ZGV2ID0gZGV2OwpAQCAtNDM1LDEzICs0NTAsMjEgQEAKIAlwb3J0LT50cmNtb2QgPSB0cmNtb2Q7CiAJcG9ydC0+bG9nbW9kID0gbG9nbW9kOwogCi0JcG9ydC0+c3RhdHNfYnVzeSA9IHBvcnQtPmVuZGlzX3BlbmRpbmcgPSBCRkFfRkFMU0U7Ci0JcG9ydC0+c3RhdHNfY2JmbiA9IHBvcnQtPmVuZGlzX2NiZm4gPSBOVUxMOworCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9GQUxTRTsKKwlwb3J0LT5zdGF0c19jYmZuID0gTlVMTDsKKwlwb3J0LT5lbmRpc19jYmZuID0gTlVMTDsKIAogCWJmYV9pb2NfbWJveF9yZWdpc3IocG9ydC0+aW9jLCBCRklfTUNfUE9SVCwgYmZhX3BvcnRfaXNyLCBwb3J0KTsKIAliZmFfaW9jX2hiZmFpbF9pbml0KCZwb3J0LT5oYmZhaWwsIGJmYV9wb3J0X2hiZmFpbCwgcG9ydCk7CiAJYmZhX2lvY19oYmZhaWxfcmVnaXN0ZXIocG9ydC0+aW9jLCAmcG9ydC0+aGJmYWlsKTsKIAorCS8qKgorCSAqIGluaXRpYWxpemUgdGltZSBzdGFtcCBmb3Igc3RhdHMgcmVzZXQKKwkgKi8KKwliZmFfb3NfZ2V0dGltZW9mZGF5KCZ0dik7CisJcG9ydC0+c3RhdHNfcmVzZXRfdGltZSA9IHR2LnR2X3NlYzsKKwogCWJmYV90cmMocG9ydCwgMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnRfcHJpdi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydF9wcml2LmgKaW5kZXggNDBlMjU2ZS4uYzllYmUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydF9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydF9wcml2LmgKQEAgLTc1LDggKzc1LDkgQEAKIAliZmFfc3RhdHVzX3QgICAgICAgICAgICBzdGF0c19zdGF0dXM7IC8qICBzdGF0cy9zdGF0c2NsciBzdGF0dXMgKi8KIAliZmFfYm9vbGVhbl90ICAgICAgICAgICBzdGF0c19idXN5OyAvKiAgb3V0c3RhbmRpbmcgc3RhdHMvc3RhdHNjbHIgKi8KIAliZmFfYm9vbGVhbl90ICAgICAgICAgICBzdGF0c19xZnVsbDsKKwl1MzIgICAgICAgICAgICAgICAgCXN0YXRzX3Jlc2V0X3RpbWU7IC8qIHN0YXRzIHJlc2V0IHRpbWUgc3RhbXAgKi8KIAliZmFfY2JfcHBvcnRfdCAgICAgICAgICBzdGF0c19jYmZuOyAvKiAgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgKnN0YXRzX2NiYXJnOyAvKiAqITwgdXNlciBjYWxsYmFjayBhcmcgKi8KKwl2b2lkICAgICAgICAgICAgICAgICAgICAqc3RhdHNfY2Jhcmc7IC8qIHVzZXIgY2FsbGJhY2sgYXJnICovCiAJYmZhX2Jvb2xlYW5fdCAgICAgICAgICAgZGlhZ19idXN5OyAvKiAgZGlhZyBidXN5IHN0YXR1cyAqLwogCWJmYV9ib29sZWFuX3QgICAgICAgICAgIGJlYWNvbjsgLyogIHBvcnQgYmVhY29uIHN0YXR1cyAqLwogCWJmYV9ib29sZWFuX3QgICAgICAgICAgIGxpbmtfZTJlX2JlYWNvbjsgLyogIGxpbmsgYmVhY29uIHN0YXR1cyAqLwpAQCAtODcsNSArODgsNyBAQAogLyoKICAqIHB1YmxpYyBmdW5jdGlvbnMKICAqLwotdm9pZAliZmFfZmNwb3J0X2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKK3ZvaWQgYmZhX2ZjcG9ydF9pbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2ZjcG9ydF9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm1zZyk7CisKICNlbmRpZiAvKiBfX0JGQV9QT1JUX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wcml2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wcml2LmgKaW5kZXggYmU4MGZjNy4uYmY0OTM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcHJpdi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3ByaXYuaApAQCAtMzcsNyArMzcsNiBAQAogCQkJdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCAJXAogCQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCQkJXAogCQkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KTsgICAgICBcCi0Jc3RhdGljIHZvaWQgYmZhXyAjIyBfX21vZCAjIyBfaW5pdGRvbmUoc3RydWN0IGJmYV9zICpiZmEpOyAgICAgIFwKIAlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpOyAgICAgIFwKIAlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSk7ICAgICAgXAogCXN0YXRpYyB2b2lkIGJmYV8gIyMgX19tb2QgIyMgX3N0b3Aoc3RydWN0IGJmYV9zICpiZmEpOyAgICAgIFwKQEAgLTQ3LDcgKzQ2LDYgQEAKIAlzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfICMjIF9fbW9kID0gewkJCVwKIAkJYmZhXyAjIyBfX21vZCAjIyBfbWVtaW5mbywJCQkJXAogCQliZmFfICMjIF9fbW9kICMjIF9hdHRhY2gsCQkJCVwKLQkJYmZhXyAjIyBfX21vZCAjIyBfaW5pdGRvbmUsCQkJCVwKIAkJYmZhXyAjIyBfX21vZCAjIyBfZGV0YWNoLAkJCQlcCiAJCWJmYV8gIyMgX19tb2QgIyMgX3N0YXJ0LAkJCQlcCiAJCWJmYV8gIyMgX19tb2QgIyMgX3N0b3AsCQkJCQlcCkBAIC02OSw3ICs2Nyw2IEBACiAJCQlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCiAJCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywKIAkJCXN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldik7Ci0Jdm9pZCAoKmluaXRkb25lKSAoc3RydWN0IGJmYV9zICpiZmEpOwogCXZvaWQgKCpkZXRhY2gpIChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKnN0YXJ0KSAoc3RydWN0IGJmYV9zICpiZmEpOwogCXZvaWQgKCpzdG9wKSAoc3RydWN0IGJmYV9zICpiZmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Jwb3J0LmMKaW5kZXggN2M1MDlmYS4uY2NkMDY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcnBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9ycG9ydC5jCkBAIC02MzYsMTEgKzYzNiw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1iZmFfcnBvcnRfaW5pdGRvbmUoc3RydWN0IGJmYV9zICpiZmEpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCiBiZmFfcnBvcnRfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQogewogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc2dwZy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc2dwZy5jCmluZGV4IDI3OWQ4ZjkuLmFlNDUyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3NncGcuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zZ3BnLmMKQEAgLTk0LDExICs5NCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1iZmFfc2dwZ19pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSkKLXsKLX0KLQotc3RhdGljIHZvaWQKIGJmYV9zZ3BnX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV91Zi5jCmluZGV4IDRiM2MyNDEuLmI5YTlhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfdWYuYwpAQCAtMTcwLDExICsxNzAsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotYmZhX3VmX2luaXRkb25lKHN0cnVjdCBiZmFfcyAqYmZhKQotewotfQotCi1zdGF0aWMgdm9pZAogYmZhX3VmX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKIH0KQEAgLTI1Niw3ICsyNTEsMTAgQEAKIAkJCQkgICAgICAoc3RydWN0IGZjaHNfcyAqKSBidWYsIHBsZF93MCk7CiAJfQogCi0JYmZhX2NiX3F1ZXVlKGJmYSwgJnVmLT5oY2JfcWUsIF9fYmZhX2NiX3VmX3JlY3YsIHVmKTsKKwlpZiAoYmZhLT5mY3MpCisJCV9fYmZhX2NiX3VmX3JlY3YodWYsIEJGQV9UUlVFKTsKKwllbHNlCisJCWJmYV9jYl9xdWV1ZShiZmEsICZ1Zi0+aGNiX3FlLCBfX2JmYV9jYl91Zl9yZWN2LCB1Zik7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCmluZGV4IGQ0ZmM0MjguLjkxNWEyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCkBAIC01NCwzMSArNTQsNjIgQEAKIHN0YXRpYyBpbnQgICAgICBsb2dfbGV2ZWwgPSBCRkFfTE9HX1dBUk5JTkc7CiBzdGF0aWMgaW50ICAgICAgaW9jX2F1dG9fcmVjb3ZlciA9IEJGQV9UUlVFOwogc3RhdGljIGludCAgICAgIGlwZmNfZW5hYmxlID0gQkZBX0ZBTFNFOwotc3RhdGljIGludCAgICAgIGlwZmNfbXR1ID0gLTE7CiBzdGF0aWMgaW50CWZkbWlfZW5hYmxlID0gQkZBX1RSVUU7CiBpbnQgCQliZmFfbHVuX3F1ZXVlX2RlcHRoID0gQkZBRF9MVU5fUVVFVUVfREVQVEg7CiBpbnQgICAgICAJYmZhX2xpbmt1cF9kZWxheSA9IC0xOworaW50CQliZmFfZGVidWdmc19lbmFibGUgPSAxOwogCiBtb2R1bGVfcGFyYW0ob3NfbmFtZSwgY2hhcnAsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Mob3NfbmFtZSwgIk9TIG5hbWUgb2YgdGhlIGhiYSBob3N0IG1hY2hpbmUiKTsKIG1vZHVsZV9wYXJhbShvc19wYXRjaCwgY2hhcnAsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Mob3NfcGF0Y2gsICJPUyBwYXRjaCBsZXZlbCBvZiB0aGUgaGJhIGhvc3QgbWFjaGluZSIpOwogbW9kdWxlX3BhcmFtKGhvc3RfbmFtZSwgY2hhcnAsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaG9zdF9uYW1lLCAiSG9zdG5hbWUgb2YgdGhlIGhiYSBob3N0IG1hY2hpbmUiKTsKIG1vZHVsZV9wYXJhbShudW1fcnBvcnRzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3Jwb3J0cywgIk1heCBudW1iZXIgb2YgcnBvcnRzIHN1cHBvcnRlZCBwZXIgcG9ydCIKKwkJIiAocGh5c2ljYWwvbG9naWNhbCksIGRlZmF1bHQ9MTAyNCIpOwogbW9kdWxlX3BhcmFtKG51bV9pb3MsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhudW1faW9zLCAiTWF4IG51bWJlciBvZiBpb2ltIHJlcXVlc3RzLCBkZWZhdWx0PTIwMDAiKTsKIG1vZHVsZV9wYXJhbShudW1fdG1zLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3RtcywgIk1heCBudW1iZXIgb2YgdGFzayBpbSByZXF1ZXN0cywgZGVmYXVsdD0xMjgiKTsKIG1vZHVsZV9wYXJhbShudW1fZmN4cHMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhudW1fZmN4cHMsICJNYXggbnVtYmVyIG9mIGZjeHAgcmVxdWVzdHMsIGRlZmF1bHQ9NjQiKTsKIG1vZHVsZV9wYXJhbShudW1fdWZidWZzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3VmYnVmcywgIk1heCBudW1iZXIgb2YgdW5zb2xpY2l0ZWQgZnJhbWUgYnVmZmVycywiCisJCSIgZGVmYXVsdD02NCIpOwogbW9kdWxlX3BhcmFtKHJlcXFfc2l6ZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHJlcXFfc2l6ZSwgIk1heCBudW1iZXIgb2YgcmVxdWVzdCBxdWV1ZSBlbGVtZW50cywiCisJCSIgZGVmYXVsdD0yNTYiKTsKIG1vZHVsZV9wYXJhbShyc3BxX3NpemUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhyc3BxX3NpemUsICJNYXggbnVtYmVyIG9mIHJlc3BvbnNlIHF1ZXVlIGVsZW1lbnRzLCIKKwkJIiBkZWZhdWx0PTY0Iik7CiBtb2R1bGVfcGFyYW0obnVtX3NncGdzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3NncGdzLCAiTnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHBhZ2VzLCBkZWZhdWx0PTIwNDgiKTsKIG1vZHVsZV9wYXJhbShycG9ydF9kZWxfdGltZW91dCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHJwb3J0X2RlbF90aW1lb3V0LCAiUnBvcnQgZGVsZXRlIHRpbWVvdXQsIGRlZmF1bHQ9OTAgc2VjcywiCisJCSIgUmFuZ2VbPjBdIik7CiBtb2R1bGVfcGFyYW0oYmZhX2x1bl9xdWV1ZV9kZXB0aCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGJmYV9sdW5fcXVldWVfZGVwdGgsICJMdW4gcXVldWUgZGVwdGgsIGRlZmF1bHQ9MzIsIgorCQkiIFJhbmdlWz4wXSIpOwogbW9kdWxlX3BhcmFtKGJmYV9pb19tYXhfc2dlLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoYmZhX2lvX21heF9zZ2UsICJNYXggaW8gc2NhdHRlci9nYXRoZXIgZWxlbWVudHMsIGRlZmF1bHQ9MjU1Iik7CiBtb2R1bGVfcGFyYW0obG9nX2xldmVsLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobG9nX2xldmVsLCAiRHJpdmVyIGxvZyBsZXZlbCwgZGVmYXVsdD0zLCIKKwkJIiBSYW5nZVtDcml0aWNhbDoxfEVycm9yOjJ8V2FybmluZzozfEluZm86NF0iKTsKIG1vZHVsZV9wYXJhbShpb2NfYXV0b19yZWNvdmVyLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9jX2F1dG9fcmVjb3ZlciwgIklPQyBhdXRvIHJlY292ZXJ5LCBkZWZhdWx0PTEsIgorCQkiIFJhbmdlW29mZjowfG9uOjFdIik7CiBtb2R1bGVfcGFyYW0oaXBmY19lbmFibGUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtKGlwZmNfbXR1LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbShmZG1pX2VuYWJsZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGlwZmNfZW5hYmxlLCAiRW5hYmxlIElQb0ZDLCBkZWZhdWx0PTAsIFJhbmdlW29mZjowfG9uOjFdIik7CiBtb2R1bGVfcGFyYW0oYmZhX2xpbmt1cF9kZWxheSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGJmYV9saW5rdXBfZGVsYXksICJMaW5rIHVwIGRlbGF5LCBkZWZhdWx0PTMwIHNlY3MgZm9yIGJvb3QiCisJCSIgcG9ydC4gT3RoZXJ3aXNlIFJhbmdlWz4wXSIpOworbW9kdWxlX3BhcmFtKGZkbWlfZW5hYmxlLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZmRtaV9lbmFibGUsICJFbmFibGVzIGZkbWkgcmVnaXN0cmF0aW9uLCBkZWZhdWx0PTEsIgorCQkiIFJhbmdlW2ZhbHNlOjB8dHJ1ZToxXSIpOworbW9kdWxlX3BhcmFtKGJmYV9kZWJ1Z2ZzX2VuYWJsZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGJmYV9kZWJ1Z2ZzX2VuYWJsZSwgIkVuYWJsZXMgZGVidWdmcyBmZWF0dXJlLCBkZWZhdWx0PTEsIgorCQkiIFJhbmdlW2ZhbHNlOjB8dHJ1ZToxXSIpOwogCiAvKgogICogU3RvcmVzIHRoZSBtb2R1bGUgcGFybSBudW1fc2dwZ3MgdmFsdWU7CkBAIC0zMjIsNyArMzUzLDMxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIEBicmllZgorICogRkNTIFBCQyBWUE9SVCBDcmVhdGUKKyAqLwordm9pZAorYmZhX2ZjYl9wYmNfdnBvcnRfY3JlYXRlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmlfcGJjX3Zwb3J0X3MgcGJjX3Zwb3J0KQorewogCisJc3RydWN0IGJmYWRfcGNmZ19zICpwY2ZnOworCisJcGNmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZmFkX3BjZmdfcyksIEdGUF9BVE9NSUMpOworCWlmICghcGNmZykgeworCQliZmFfdHJjKGJmYWQsIDApOworCQlyZXR1cm47CisJfQorCisJcGNmZy0+cG9ydF9jZmcucm9sZXMgPSBCRkFfUE9SVF9ST0xFX0ZDUF9JTTsKKwlwY2ZnLT5wb3J0X2NmZy5wd3duID0gcGJjX3Zwb3J0LnZwX3B3d247CisJcGNmZy0+cG9ydF9jZmcubnd3biA9IHBiY192cG9ydC52cF9ud3duOworCXBjZmctPnBvcnRfY2ZnLnByZWJvb3RfdnAgID0gQkZBX1RSVUU7CisKKwlsaXN0X2FkZF90YWlsKCZwY2ZnLT5saXN0X2VudHJ5LCAmYmZhZC0+cGJjX3BjZmdfbGlzdCk7CisKKwlyZXR1cm47Cit9CiAKIHZvaWQKIGJmYWRfaGFsX21lbV9yZWxlYXNlKHN0cnVjdCBiZmFkX3MgKmJmYWQpCkBAIC00ODEsMTAgKzUzNiwxMCBAQAogICovCiBiZmFfc3RhdHVzX3QKIGJmYWRfdnBvcnRfY3JlYXRlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHUxNiB2Zl9pZCwKLQkJICBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCisJCQlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnQ7Ci0JaW50ICAgICAgICAgICAgIHJjID0gQkZBX1NUQVRVU19PSzsKKwlpbnQgcmMgPSBCRkFfU1RBVFVTX09LOwogCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKIAlzdHJ1Y3QgY29tcGxldGlvbiBmY29tcDsKIApAQCAtNDk2LDggKzU1MSwxMiBAQAogCiAJdnBvcnQtPmRydl9wb3J0LmJmYWQgPSBiZmFkOwogCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKLQlyYyA9IGJmYV9mY3NfdnBvcnRfY3JlYXRlKCZ2cG9ydC0+ZmNzX3Zwb3J0LCAmYmZhZC0+YmZhX2ZjcywgdmZfaWQsCi0JCQkJICBwb3J0X2NmZywgdnBvcnQpOworCWlmIChwb3J0X2NmZy0+cHJlYm9vdF92cCA9PSBCRkFfVFJVRSkKKwkJcmMgPSBiZmFfZmNzX3BiY192cG9ydF9jcmVhdGUoJnZwb3J0LT5mY3NfdnBvcnQsCisJCQkJJmJmYWQtPmJmYV9mY3MsIHZmX2lkLCBwb3J0X2NmZywgdnBvcnQpOworCWVsc2UKKwkJcmMgPSBiZmFfZmNzX3Zwb3J0X2NyZWF0ZSgmdnBvcnQtPmZjc192cG9ydCwKKwkJCQkmYmZhZC0+YmZhX2ZjcywgdmZfaWQsIHBvcnRfY2ZnLCB2cG9ydCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CiAKIAlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykKQEAgLTg0OCw2ICs5MDcsMTAgQEAKIAkJYmZhZC0+cHBvcnQucm9sZXMgfD0gQkZBX1BPUlRfUk9MRV9GQ1BfSU07CiAJfQogCisJLyogU2V0dXAgdGhlIGRlYnVnZnMgbm9kZSBmb3IgdGhpcyBzY3NpX2hvc3QgKi8KKwlpZiAoYmZhX2RlYnVnZnNfZW5hYmxlKQorCQliZmFkX2RlYnVnZnNfaW5pdCgmYmZhZC0+cHBvcnQpOworCiAJYmZhZC0+YmZhZF9mbGFncyB8PSBCRkFEX0NGR19QUE9SVF9ET05FOwogCiBvdXQ6CkBAIC04NTcsNiArOTIwLDEwIEBACiB2b2lkCiBiZmFkX3VuY2ZnX3Bwb3J0KHN0cnVjdCBiZmFkX3MgKmJmYWQpCiB7CisJIC8qIFJlbW92ZSB0aGUgZGVidWdmcyBub2RlIGZvciB0aGlzIHNjc2lfaG9zdCAqLworCWtmcmVlKGJmYWQtPnJlZ2RhdGEpOworCWJmYWRfZGVidWdmc19leGl0KCZiZmFkLT5wcG9ydCk7CisKIAlpZiAoKGJmYWQtPnBwb3J0LnJvbGVzICYgQkZBX1BPUlRfUk9MRV9GQ1BfSVBGQykgJiYgaXBmY19lbmFibGUpIHsKIAkJYmZhZF9pcGZjX3BvcnRfZGVsZXRlKGJmYWQsICZiZmFkLT5wcG9ydCk7CiAJCWJmYWQtPnBwb3J0LnJvbGVzICY9IH5CRkFfUE9SVF9ST0xFX0ZDUF9JUEZDOwpAQCAtODg0LDYgKzk1MSw3IEBACiBiZmFkX3N0YXJ0X29wcyhzdHJ1Y3QgYmZhZF9zICpiZmFkKQogewogCWludCByZXR2YWw7CisJc3RydWN0IGJmYWRfcGNmZ19zICpwY2ZnLCAqcGNmZ19uZXc7CiAKIAkvKiBQUE9SVCBGQ1MgY29uZmlnICovCiAJYmZhZF9mY3NfcG9ydF9jZmcoYmZhZCk7CkBAIC05MDEsNiArOTY5LDI3IEBACiAKIAliZmFkX2Rydl9zdGFydChiZmFkKTsKIAorCS8qIHBiYyB2cG9ydCBjcmVhdGlvbiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwY2ZnLCBwY2ZnX25ldywgICZiZmFkLT5wYmNfcGNmZ19saXN0LAorCQkJCQlsaXN0X2VudHJ5KSB7CisJCXN0cnVjdCBmY192cG9ydF9pZGVudGlmaWVycyB2aWQ7CisJCXN0cnVjdCBmY192cG9ydCAqZmNfdnBvcnQ7CisKKwkJbWVtc2V0KCZ2aWQsIDAsIHNpemVvZih2aWQpKTsKKwkJdmlkLnJvbGVzID0gRkNfUE9SVF9ST0xFX0ZDUF9JTklUSUFUT1I7CisJCXZpZC52cG9ydF90eXBlID0gRkNfUE9SVFRZUEVfTlBJVjsKKwkJdmlkLmRpc2FibGUgPSBmYWxzZTsKKwkJdmlkLm5vZGVfbmFtZSA9IHd3bl90b191NjQoKHU4ICopJnBjZmctPnBvcnRfY2ZnLm53d24pOworCQl2aWQucG9ydF9uYW1lID0gd3duX3RvX3U2NCgodTggKikmcGNmZy0+cG9ydF9jZmcucHd3bik7CisJCWZjX3Zwb3J0ID0gZmNfdnBvcnRfY3JlYXRlKGJmYWQtPnBwb3J0LmltX3BvcnQtPnNob3N0LCAwLCAmdmlkKTsKKwkJaWYgKCFmY192cG9ydCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJmYWQlZDogZmFpbGVkIHRvIGNyZWF0ZSBwYmMgdnBvcnQiCisJCQkJIiAlbGx4XG4iLCBiZmFkLT5pbnN0X25vLCB2aWQucG9ydF9uYW1lKTsKKwkJbGlzdF9kZWwoJnBjZmctPmxpc3RfZW50cnkpOworCQlrZnJlZShwY2ZnKTsKKworCX0KKwogCS8qCiAJICogSWYgYmZhX2xpbmt1cF9kZWxheSBpcyBzZXQgdG8gLTEgZGVmYXVsdDsgdHJ5IHRvIHJldHJpdmUgdGhlCiAJICogdmFsdWUgdXNpbmcgdGhlIGJmYWRfb3NfZ2V0X2xpbmt1cF9kZWxheSgpOyBlbHNlIHVzZSB0aGUKQEAgLTkyOCw3ICsxMDE3LDcgQEAKIH0KIAogaW50Ci1iZmFkX3dvcmtlciAodm9pZCAqcHRyKQorYmZhZF93b3JrZXIodm9pZCAqcHRyKQogewogCXN0cnVjdCBiZmFkX3MgKmJmYWQ7CiAJdW5zaWduZWQgbG9uZyAgIGZsYWdzOwpAQCAtMTAzMSw2ICsxMTIwLDcgQEAKIAogCWJmYWQtPnJlZl9jb3VudCA9IDA7CiAJYmZhZC0+cHBvcnQuYmZhZCA9IGJmYWQ7CisJSU5JVF9MSVNUX0hFQUQoJmJmYWQtPnBiY19wY2ZnX2xpc3QpOwogCiAJYmZhZC0+YmZhZF90c2sgPSBrdGhyZWFkX2NyZWF0ZShiZmFkX3dvcmtlciwgKHZvaWQgKikgYmZhZCwgIiVzIiwKIAkJCQkJImJmYWRfd29ya2VyIik7CkBAIC0xMTcyLDYgKzEyNjIsMTQgQEAKIAkgLmNsYXNzID0gKFBDSV9DTEFTU19TRVJJQUxfRklCRVIgPDwgOCksCiAJIC5jbGFzc19tYXNrID0gfjAsCiAJIH0sCisJeworCSAudmVuZG9yID0gQkZBX1BDSV9WRU5ET1JfSURfQlJPQ0FERSwKKwkgLmRldmljZSA9IEJGQV9QQ0lfREVWSUNFX0lEX0NUX0ZDLAorCSAuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJIC5jbGFzcyA9IChQQ0lfQ0xBU1NfU0VSSUFMX0ZJQkVSIDw8IDgpLAorCSAuY2xhc3NfbWFzayA9IH4wLAorCX0sCiAKIAl7MCwgMH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmMKaW5kZXggZTQ3N2JmYi4uMDgxOGViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYXR0ci5jCkBAIC0zNzMsNDcgKzM3Myw1MyBAQAogCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKIAlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKIAlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgcG9ydF9jZmc7CisJc3RydWN0IGJmYWRfcGNmZ19zICpwY2ZnOwogCWludCBzdGF0dXMgPSAwLCByYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbWVtc2V0KCZwb3J0X2NmZywgMCwgc2l6ZW9mKHBvcnRfY2ZnKSk7Ci0KLQlwb3J0X2NmZy5wd3duID0gd3duX3RvX3U2NCgodTggKikgJmZjX3Zwb3J0LT5wb3J0X25hbWUpOwotCXBvcnRfY2ZnLm53d24gPSB3d25fdG9fdTY0KCh1OCAqKSAmZmNfdnBvcnQtPm5vZGVfbmFtZSk7Ci0KKwl1NjRfdG9fd3duKGZjX3Zwb3J0LT5ub2RlX25hbWUsICh1OCAqKSZwb3J0X2NmZy5ud3duKTsKKwl1NjRfdG9fd3duKGZjX3Zwb3J0LT5wb3J0X25hbWUsICh1OCAqKSZwb3J0X2NmZy5wd3duKTsKIAlpZiAoc3RybGVuKHZuYW1lKSA+IDApCiAJCXN0cmNweSgoY2hhciAqKSZwb3J0X2NmZy5zeW1fbmFtZSwgdm5hbWUpOwotCiAJcG9ydF9jZmcucm9sZXMgPSBCRkFfUE9SVF9ST0xFX0ZDUF9JTTsKLQlyYyA9IGJmYWRfdnBvcnRfY3JlYXRlKGJmYWQsIDAsICZwb3J0X2NmZywgJmZjX3Zwb3J0LT5kZXYpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNmZywgJmJmYWQtPnBiY19wY2ZnX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKHBvcnRfY2ZnLnB3d24gPT0gcGNmZy0+cG9ydF9jZmcucHd3bikgeworCQkJcG9ydF9jZmcucHJlYm9vdF92cCA9IHBjZmctPnBvcnRfY2ZnLnByZWJvb3RfdnA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJjID0gYmZhZF92cG9ydF9jcmVhdGUoYmZhZCwgMCwgJnBvcnRfY2ZnLCAmZmNfdnBvcnQtPmRldik7CiAJaWYgKHJjID09IEJGQV9TVEFUVVNfT0spIHsKLQkJc3RydWN0IGJmYWRfdnBvcnRfcyAgICp2cG9ydDsKKwkJc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnQ7CiAJCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKmZjc192cG9ydDsKIAkJc3RydWN0IFNjc2lfSG9zdCAqdnNob3N0OwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAkJZmNzX3Zwb3J0ID0gYmZhX2Zjc192cG9ydF9sb29rdXAoJmJmYWQtPmJmYV9mY3MsIDAsCiAJCQkJCXBvcnRfY2ZnLnB3d24pOwotCQlpZiAoZmNzX3Zwb3J0ID09IE5VTEwpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGZjc192cG9ydCA9PSBOVUxMKQogCQkJcmV0dXJuIFZQQ0VSUl9CQURfV1dOOwotCQl9CiAKIAkJZmNfdnBvcnRfc2V0X3N0YXRlKGZjX3Zwb3J0LCBGQ19WUE9SVF9BQ1RJVkUpOwogCQlpZiAoZGlzYWJsZSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCQkJYmZhX2Zjc192cG9ydF9zdG9wKGZjc192cG9ydCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAkJCWZjX3Zwb3J0X3NldF9zdGF0ZShmY192cG9ydCwgRkNfVlBPUlRfRElTQUJMRUQpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCiAJCXZwb3J0ID0gZmNzX3Zwb3J0LT52cG9ydF9kcnY7CiAJCXZzaG9zdCA9IHZwb3J0LT5kcnZfcG9ydC5pbV9wb3J0LT5zaG9zdDsKLQkJZmNfaG9zdF9ub2RlX25hbWUodnNob3N0KSA9IHd3bl90b191NjQoKHU4ICopICZwb3J0X2NmZy5ud3duKTsKLQkJZmNfaG9zdF9wb3J0X25hbWUodnNob3N0KSA9IHd3bl90b191NjQoKHU4ICopICZwb3J0X2NmZy5wd3duKTsKKwkJZmNfaG9zdF9ub2RlX25hbWUodnNob3N0KSA9IHd3bl90b191NjQoKHU4ICopJnBvcnRfY2ZnLm53d24pOworCQlmY19ob3N0X3BvcnRfbmFtZSh2c2hvc3QpID0gd3duX3RvX3U2NCgodTggKikmcG9ydF9jZmcucHd3bik7CiAJCWZjX3Zwb3J0LT5kZF9kYXRhID0gdnBvcnQ7CiAJCXZwb3J0LT5kcnZfcG9ydC5pbV9wb3J0LT5mY192cG9ydCA9IGZjX3Zwb3J0OwotCiAJfSBlbHNlIGlmIChyYyA9PSBCRkFfU1RBVFVTX0lOVkFMSURfV1dOKQogCQlyZXR1cm4gVlBDRVJSX0JBRF9XV047CiAJZWxzZSBpZiAocmMgPT0gQkZBX1NUQVRVU19WUE9SVF9FWElTVFMpCkBAIC00MjIsNyArNDI4LDcgQEAKIAkJcmV0dXJuIFZQQ0VSUl9OT19GQUJSSUNfU1VQUDsKIAllbHNlIGlmIChyYyA9PSBCRkFfU1RBVFVTX1ZQT1JUX1dXTl9CUCkKIAkJcmV0dXJuIFZQQ0VSUl9CQURfV1dOOwotCSBlbHNlCisJZWxzZQogCQlyZXR1cm4gRkNfVlBPUlRfRkFJTEVEOwogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTQ0OSw3ICs0NTUsNyBAQAogCXBvcnQgPSBpbV9wb3J0LT5wb3J0OwogCiAJdnNob3N0ID0gdnBvcnQtPmRydl9wb3J0LmltX3BvcnQtPnNob3N0OwotCXB3d24gPSB3d25fdG9fdTY0KCh1OCAqKSAmZmNfaG9zdF9wb3J0X25hbWUodnNob3N0KSk7CisJdTY0X3RvX3d3bihmY19ob3N0X3BvcnRfbmFtZSh2c2hvc3QpLCAodTggKikmcHd3bik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CiAJZmNzX3Zwb3J0ID0gYmZhX2Zjc192cG9ydF9sb29rdXAoJmJmYWQtPmJmYV9mY3MsIDAsIHB3d24pOwpAQCAtNDY3LDYgKzQ3MywxMiBAQAogCXJjID0gYmZhX2Zjc192cG9ydF9kZWxldGUoJnZwb3J0LT5mY3NfdnBvcnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCisJaWYgKHJjID09IEJGQV9TVEFUVVNfUEJDKSB7CisJCXZwb3J0LT5kcnZfcG9ydC5mbGFncyAmPSB+QkZBRF9QT1JUX0RFTEVURTsKKwkJdnBvcnQtPmNvbXBfZGVsID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKwogCXdhaXRfZm9yX2NvbXBsZXRpb24odnBvcnQtPmNvbXBfZGVsKTsKIAogZnJlZV9zY3NpX2hvc3Q6CkBAIC00OTAsNyArNTAyLDcgQEAKIAl2cG9ydCA9IChzdHJ1Y3QgYmZhZF92cG9ydF9zICopZmNfdnBvcnQtPmRkX2RhdGE7CiAJYmZhZCA9IHZwb3J0LT5kcnZfcG9ydC5iZmFkOwogCXZzaG9zdCA9IHZwb3J0LT5kcnZfcG9ydC5pbV9wb3J0LT5zaG9zdDsKLQlwd3duID0gd3duX3RvX3U2NCgodTggKikgJmZjX3Zwb3J0LT5wb3J0X25hbWUpOworCXU2NF90b193d24oZmNfaG9zdF9wb3J0X25hbWUodnNob3N0KSwgKHU4ICopJnB3d24pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCWZjc192cG9ydCA9IGJmYV9mY3NfdnBvcnRfbG9va3VwKCZiZmFkLT5iZmFfZmNzLCAwLCBwd3duKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODJmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZGVidWdmcy5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlIDxiZmFkX2Rydi5oPgorI2luY2x1ZGUgPGJmYWRfaW0uaD4KKworLyoKKyAqIEJGQSBkZWJ1ZnMgaW50ZXJmYWNlCisgKgorICogVG8gYWNjZXNzIHRoZSBpbnRlcmZhY2UsIGRlYnVnZnMgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlIG1vdW50ZWQKKyAqIGlmIG5vdCBhbHJlYWR5IG1vdW50ZWQgdXNpbmc6CisgKiBtb3VudCAtdCBkZWJ1Z2ZzIG5vbmUgL3N5cy9rZXJuZWwvZGVidWcKKyAqCisgKiBCRkEgSGllcmFyY2h5OgorICogCS0gYmZhL2hvc3QjCisgKiB3aGVyZSB0aGUgaG9zdCBudW1iZXIgY29ycmVzcG9uZHMgdG8gdGhlIG9uZSB1bmRlciAvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0IworICoKKyAqIERlYnVnZ2luZyBzZXJ2aWNlIGF2YWlsYWJsZSBwZXIgaG9zdDoKKyAqIGZ3dHJjOiAgVG8gY29sbGVjdCBjdXJyZW50IGZpcm13YXJlIHRyYWNlLgorICogZHJ2dHJjOiBUbyBjb2xsZWN0IGN1cnJlbnQgZHJpdmVyIHRyYWNlCisgKiBmd3NhdmU6IFRvIGNvbGxlY3QgbGFzdCBzYXZlZCBmdyB0cmFjZSBhcyBhIHJlc3VsdCBvZiBmaXJtd2FyZSBjcmFzaC4KKyAqIHJlZ3dyOiAgVG8gd3JpdGUgb25lIHdvcmQgdG8gY2hpcCByZWdpc3RlcgorICogcmVncmQ6ICBUbyByZWFkIG9uZSBvciBtb3JlIHdvcmRzIGZyb20gY2hpcCByZWdpc3Rlci4KKyAqLworCitzdHJ1Y3QgYmZhZF9kZWJ1Z19pbmZvIHsKKwljaGFyICpkZWJ1Z19idWZmZXI7CisJdm9pZCAqaV9wcml2YXRlOworCWludCBidWZmZXJfbGVuOworfTsKKworc3RhdGljIGludAorYmZhZF9kZWJ1Z2ZzX29wZW5fZHJ2dHJjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCA9IGlub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IHBvcnQtPmJmYWQ7CisJc3RydWN0IGJmYWRfZGVidWdfaW5mbyAqZGVidWc7CisKKwlkZWJ1ZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZmFkX2RlYnVnX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlYnVnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlYnVnLT5kZWJ1Z19idWZmZXIgPSAodm9pZCAqKSBiZmFkLT50cmNtb2Q7CisJZGVidWctPmJ1ZmZlcl9sZW4gPSBzaXplb2Yoc3RydWN0IGJmYV90cmNfbW9kX3MpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGVidWc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9kZWJ1Z2ZzX29wZW5fZnd0cmMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0ID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhZF9kZWJ1Z19pbmZvICpmd19kZWJ1ZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWZ3X2RlYnVnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJmYWRfZGVidWdfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZndfZGVidWcpCisJCXJldHVybiAtRU5PTUVNOworCisJZndfZGVidWctPmJ1ZmZlcl9sZW4gPSBzaXplb2Yoc3RydWN0IGJmYV90cmNfbW9kX3MpOworCisJZndfZGVidWctPmRlYnVnX2J1ZmZlciA9IHZtYWxsb2MoZndfZGVidWctPmJ1ZmZlcl9sZW4pOworCWlmICghZndfZGVidWctPmRlYnVnX2J1ZmZlcikgeworCQlrZnJlZShmd19kZWJ1Zyk7CisJCXByaW50ayhLRVJOX0lORk8gImJmYWRbJWRdOiBGYWlsZWQgdG8gYWxsb2NhdGUgZnd0cmMgYnVmZmVyXG4iLAorCQkJCWJmYWQtPmluc3Rfbm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoZndfZGVidWctPmRlYnVnX2J1ZmZlciwgMCwgZndfZGVidWctPmJ1ZmZlcl9sZW4pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJjID0gYmZhX2RlYnVnX2Z3dHJjKCZiZmFkLT5iZmEsCisJCQlmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyLAorCQkJJmZ3X2RlYnVnLT5idWZmZXJfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykgeworCQl2ZnJlZShmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyKTsKKwkJZndfZGVidWctPmRlYnVnX2J1ZmZlciA9IE5VTEw7CisJCWtmcmVlKGZ3X2RlYnVnKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmZhZFslZF06IEZhaWxlZCB0byBjb2xsZWN0IGZ3dHJjXG4iLAorCQkJCWJmYWQtPmluc3Rfbm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmd19kZWJ1ZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2RlYnVnZnNfb3Blbl9md3NhdmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0ID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhZF9kZWJ1Z19pbmZvICpmd19kZWJ1ZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWZ3X2RlYnVnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJmYWRfZGVidWdfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZndfZGVidWcpCisJCXJldHVybiAtRU5PTUVNOworCisJZndfZGVidWctPmJ1ZmZlcl9sZW4gPSBzaXplb2Yoc3RydWN0IGJmYV90cmNfbW9kX3MpOworCisJZndfZGVidWctPmRlYnVnX2J1ZmZlciA9IHZtYWxsb2MoZndfZGVidWctPmJ1ZmZlcl9sZW4pOworCWlmICghZndfZGVidWctPmRlYnVnX2J1ZmZlcikgeworCQlrZnJlZShmd19kZWJ1Zyk7CisJCXByaW50ayhLRVJOX0lORk8gImJmYWRbJWRdOiBGYWlsZWQgdG8gYWxsb2NhdGUgZndzYXZlIGJ1ZmZlclxuIiwKKwkJCQliZmFkLT5pbnN0X25vKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIsIDAsIGZ3X2RlYnVnLT5idWZmZXJfbGVuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyYyA9IGJmYV9kZWJ1Z19md3NhdmUoJmJmYWQtPmJmYSwKKwkJCWZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIsCisJCQkmZndfZGVidWctPmJ1ZmZlcl9sZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCXZmcmVlKGZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIpOworCQlmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyID0gTlVMTDsKKwkJa2ZyZWUoZndfZGVidWcpOworCQlwcmludGsoS0VSTl9JTkZPICJiZmFkWyVkXTogRmFpbGVkIHRvIGNvbGxlY3QgZndzYXZlXG4iLAorCQkJCWJmYWQtPmluc3Rfbm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmd19kZWJ1ZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2RlYnVnZnNfb3Blbl9yZWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJmYWRfZGVidWdfaW5mbyAqcmVnX2RlYnVnOworCisJcmVnX2RlYnVnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJmYWRfZGVidWdfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcmVnX2RlYnVnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlZ19kZWJ1Zy0+aV9wcml2YXRlID0gaW5vZGUtPmlfcHJpdmF0ZTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHJlZ19kZWJ1ZzsKKworCXJldHVybiAwOworfQorCisvKiBDaGFuZ2VzIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gKi8KK3N0YXRpYyBsb2ZmX3QKK2JmYWRfZGVidWdmc19sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJc3RydWN0IGJmYWRfZGVidWdfaW5mbyAqZGVidWc7CisJbG9mZl90IHBvcyA9IGZpbGUtPmZfcG9zOworCisJZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIDA6CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlicmVhazsKKwljYXNlIDE6CisJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmaWxlLT5mX3BvcyA9IGRlYnVnLT5idWZmZXJfbGVuIC0gb2Zmc2V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmlsZS0+Zl9wb3MgPCAwIHx8IGZpbGUtPmZfcG9zID4gZGVidWctPmJ1ZmZlcl9sZW4pIHsKKwkJZmlsZS0+Zl9wb3MgPSBwb3M7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBmaWxlLT5mX3BvczsKK30KKworc3RhdGljIHNzaXplX3QKK2JmYWRfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGJmYWRfZGVidWdfaW5mbyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWRlYnVnIHx8ICFkZWJ1Zy0+ZGVidWdfYnVmZmVyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcG9zLAorCQkJCWRlYnVnLT5kZWJ1Z19idWZmZXIsIGRlYnVnLT5idWZmZXJfbGVuKTsKK30KKworI2RlZmluZSBCRkFfUkVHX0NUX0FERFJTWgkoMHg0MDAwMCkKKyNkZWZpbmUgQkZBX1JFR19DQl9BRERSU1oJKDB4MjAwMDApCisjZGVmaW5lIEJGQV9SRUdfQUREUlNaKF9fYmZhKQlcCisJKChiZmFfaW9jX2RldmlkKCYoX19iZmEpLT5pb2MpID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUKSA/CVwKKwkJQkZBX1JFR19DVF9BRERSU1ogOiBCRkFfUkVHX0NCX0FERFJTWikKKyNkZWZpbmUgQkZBX1JFR19BRERSTVNLKF9fYmZhKSAgKCh1aW50MzJfdCkoQkZBX1JFR19BRERSU1ooX19iZmEpIC0gMSkpCisKK3N0YXRpYyBiZmFfc3RhdHVzX3QKK2JmYWRfcmVnX29mZnNldF9jaGVjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIG9mZnNldCwgdTMyIGxlbikKK3sKKwl1OAlhcmVhOworCisJLyogY2hlY2sgWzE2OjE1XSAqLworCWFyZWEgPSAob2Zmc2V0ID4+IDE1KSAmIDB4NzsKKwlpZiAoYXJlYSA9PSAwKSB7CisJCS8qIFBDSWUgY29yZSByZWdpc3RlciAqLworCQlpZiAoKG9mZnNldCArIChsZW48PDIpKSA+IDB4ODAwMCkgICAgLyogOGsgZHdvcmRzIG9yIDMyS0IgKi8KKwkJCXJldHVybiBCRkFfU1RBVFVTX0VJTlZBTDsKKwl9IGVsc2UgaWYgKGFyZWEgPT0gMHgxKSB7CisJCS8qIENCIDMyIEtCIG1lbW9yeSBwYWdlICovCisJCWlmICgob2Zmc2V0ICsgKGxlbjw8MikpID4gMHgxMDAwMCkgICAgLyogOGsgZHdvcmRzIG9yIDMyS0IgKi8KKwkJCXJldHVybiBCRkFfU1RBVFVTX0VJTlZBTDsKKwl9IGVsc2UgeworCQkvKiBDQiByZWdpc3RlciBzcGFjZSA2NEtCICovCisJCWlmICgob2Zmc2V0ICsgKGxlbjw8MikpID4gQkZBX1JFR19BRERSTVNLKGJmYSkpCisJCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CisJfQorCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitzdGF0aWMgc3NpemVfdAorYmZhZF9kZWJ1Z2ZzX3JlYWRfcmVncmQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBiZmFkX2RlYnVnX2luZm8gKnJlZ3JkX2RlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCA9IChzdHJ1Y3QgYmZhZF9wb3J0X3MgKilyZWdyZF9kZWJ1Zy0+aV9wcml2YXRlOworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSBwb3J0LT5iZmFkOworCXNzaXplX3QgcmM7CisKKwlpZiAoIWJmYWQtPnJlZ2RhdGEpCisJCXJldHVybiAwOworCisJcmMgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcG9zLAorCQkJYmZhZC0+cmVnZGF0YSwgYmZhZC0+cmVnbGVuKTsKKworCWlmICgoKnBvcyArIG5ieXRlcykgPj0gYmZhZC0+cmVnbGVuKSB7CisJCWtmcmVlKGJmYWQtPnJlZ2RhdGEpOworCQliZmFkLT5yZWdkYXRhID0gTlVMTDsKKwkJYmZhZC0+cmVnbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiZmFkX2RlYnVnZnNfd3JpdGVfcmVncmQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYmZhZF9kZWJ1Z19pbmZvICpyZWdyZF9kZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYWRfcG9ydF9zICopcmVncmRfZGVidWctPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhX3MgKmJmYSA9ICZiZmFkLT5iZmE7CisJc3RydWN0IGJmYV9pb2NfcyAqaW9jID0gJmJmYS0+aW9jOworCWludCBhZGRyLCBsZW4sIHJjLCBpOworCXUzMiAqcmVnYnVmOworCXZvaWQgX19pb21lbSAqcmIsICpyZWdfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmMgPSBzc2NhbmYoYnVmLCAiJXg6JXgiLCAmYWRkciwgJmxlbik7CisJaWYgKHJjIDwgMikgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiYmZhZFslZF06ICVzIGZhaWxlZCB0byByZWFkIHVzZXIgYnVmXG4iLAorCQkJYmZhZC0+aW5zdF9ubywgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZnJlZShiZmFkLT5yZWdkYXRhKTsKKwliZmFkLT5yZWdkYXRhID0gTlVMTDsKKwliZmFkLT5yZWdsZW4gPSAwOworCisJYmZhZC0+cmVnZGF0YSA9IGt6YWxsb2MobGVuIDw8IDIsIEdGUF9LRVJORUwpOworCWlmICghYmZhZC0+cmVnZGF0YSkgeworCQlwcmludGsoS0VSTl9JTkZPICJiZmFkWyVkXTogRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ3JkIGJ1ZmZlclxuIiwKKwkJCQliZmFkLT5pbnN0X25vKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmZhZC0+cmVnbGVuID0gbGVuIDw8IDI7CisJcmIgPSBiZmFfaW9jX2JhcjAoaW9jKTsKKwlhZGRyICY9IEJGQV9SRUdfQUREUk1TSyhiZmEpOworCisJLyogb2Zmc2V0IGFuZCBsZW4gc2FuaXR5IGNoZWNrICovCisJcmMgPSBiZmFkX3JlZ19vZmZzZXRfY2hlY2soYmZhLCBhZGRyLCBsZW4pOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9JTkZPICJiZmFkWyVkXTogRmFpbGVkIHJlZyBvZmZzZXQgY2hlY2tcbiIsCisJCQkJYmZhZC0+aW5zdF9ubyk7CisJCWtmcmVlKGJmYWQtPnJlZ2RhdGEpOworCQliZmFkLT5yZWdkYXRhID0gTlVMTDsKKwkJYmZhZC0+cmVnbGVuID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnX2FkZHIgPSByYiArIGFkZHI7CisJcmVnYnVmID0gICh1MzIgKiliZmFkLT5yZWdkYXRhOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJKnJlZ2J1ZiA9IGJmYV9yZWdfcmVhZChyZWdfYWRkcik7CisJCXJlZ2J1ZisrOworCQlyZWdfYWRkciArPSBzaXplb2YodTMyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdAorYmZhZF9kZWJ1Z2ZzX3dyaXRlX3JlZ3dyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGJmYWRfZGVidWdfaW5mbyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0ID0gKHN0cnVjdCBiZmFkX3BvcnRfcyAqKWRlYnVnLT5pX3ByaXZhdGU7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IHBvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9zICpiZmEgPSAmYmZhZC0+YmZhOworCXN0cnVjdCBiZmFfaW9jX3MgKmlvYyA9ICZiZmEtPmlvYzsKKwlpbnQgYWRkciwgdmFsLCByYzsKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyYyA9IHNzY2FuZihidWYsICIleDoleCIsICZhZGRyLCAmdmFsKTsKKwlpZiAocmMgPCAyKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJiZmFkWyVkXTogJXMgZmFpbGVkIHRvIHJlYWQgdXNlciBidWZcbiIsCisJCQliZmFkLT5pbnN0X25vLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkZHIgJj0gQkZBX1JFR19BRERSTVNLKGJmYSk7IC8qIG9mZnNldCBvbmx5IDE3IGJpdCBhbmQgd29yZCBhbGlnbiAqLworCisJLyogb2Zmc2V0IGFuZCBsZW4gc2FuaXR5IGNoZWNrICovCisJcmMgPSBiZmFkX3JlZ19vZmZzZXRfY2hlY2soYmZhLCBhZGRyLCAxKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJImJmYWRbJWRdOiBGYWlsZWQgcmVnIG9mZnNldCBjaGVja1xuIiwKKwkJCWJmYWQtPmluc3Rfbm8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdfYWRkciA9ICh1aW50MzJfdCAqKSAoKHVpbnQ4X3QgKikgYmZhX2lvY19iYXIwKGlvYykgKyBhZGRyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhX3JlZ193cml0ZShyZWdfYWRkciwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQKK2JmYWRfZGVidWdmc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBiZmFkX2RlYnVnX2luZm8gKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFkZWJ1ZykKKwkJcmV0dXJuIDA7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWtmcmVlKGRlYnVnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9kZWJ1Z2ZzX3JlbGVhc2VfZnd0cmMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJmYWRfZGVidWdfaW5mbyAqZndfZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWZ3X2RlYnVnKQorCQlyZXR1cm4gMDsKKworCWlmIChmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyKQorCQl2ZnJlZShmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyKTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJa2ZyZWUoZndfZGVidWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiZmFkX2RlYnVnZnNfb3BfZHJ2dHJjID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQliZmFkX2RlYnVnZnNfb3Blbl9kcnZ0cmMsCisJLmxsc2VlawkJPQliZmFkX2RlYnVnZnNfbHNlZWssCisJLnJlYWQJCT0JYmZhZF9kZWJ1Z2ZzX3JlYWQsCisJLnJlbGVhc2UJPQliZmFkX2RlYnVnZnNfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmYWRfZGVidWdmc19vcF9md3RyYyA9IHsKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLm9wZW4JCT0JYmZhZF9kZWJ1Z2ZzX29wZW5fZnd0cmMsCisJLmxsc2VlawkJPQliZmFkX2RlYnVnZnNfbHNlZWssCisJLnJlYWQJCT0JYmZhZF9kZWJ1Z2ZzX3JlYWQsCisJLnJlbGVhc2UJPQliZmFkX2RlYnVnZnNfcmVsZWFzZV9md3RyYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmYWRfZGVidWdmc19vcF9md3NhdmUgPSB7CisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5vcGVuCQk9CWJmYWRfZGVidWdmc19vcGVuX2Z3c2F2ZSwKKwkubGxzZWVrCQk9CWJmYWRfZGVidWdmc19sc2VlaywKKwkucmVhZAkJPQliZmFkX2RlYnVnZnNfcmVhZCwKKwkucmVsZWFzZQk9CWJmYWRfZGVidWdmc19yZWxlYXNlX2Z3dHJjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmZhZF9kZWJ1Z2ZzX29wX3JlZ3JkID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQliZmFkX2RlYnVnZnNfb3Blbl9yZWcsCisJLmxsc2VlawkJPQliZmFkX2RlYnVnZnNfbHNlZWssCisJLnJlYWQJCT0JYmZhZF9kZWJ1Z2ZzX3JlYWRfcmVncmQsCisJLndyaXRlCQk9CWJmYWRfZGVidWdmc193cml0ZV9yZWdyZCwKKwkucmVsZWFzZQk9CWJmYWRfZGVidWdmc19yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmZhZF9kZWJ1Z2ZzX29wX3JlZ3dyID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQliZmFkX2RlYnVnZnNfb3Blbl9yZWcsCisJLmxsc2VlawkJPQliZmFkX2RlYnVnZnNfbHNlZWssCisJLndyaXRlCQk9CWJmYWRfZGVidWdmc193cml0ZV9yZWd3ciwKKwkucmVsZWFzZQk9CWJmYWRfZGVidWdmc19yZWxlYXNlLAorfTsKKworc3RydWN0IGJmYWRfZGVidWdmc19lbnRyeSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwltb2RlX3QJbW9kZTsKKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBiZmFkX2RlYnVnZnNfZW50cnkgYmZhZF9kZWJ1Z2ZzX2ZpbGVzW10gPSB7CisJeyAiZHJ2dHJjIiwgU19JRlJFR3xTX0lSVUdPLCAmYmZhZF9kZWJ1Z2ZzX29wX2RydnRyYywgfSwKKwl7ICJmd3RyYyIsICBTX0lGUkVHfFNfSVJVR08sICZiZmFkX2RlYnVnZnNfb3BfZnd0cmMsICB9LAorCXsgImZ3c2F2ZSIsIFNfSUZSRUd8U19JUlVHTywgJmJmYWRfZGVidWdmc19vcF9md3NhdmUsIH0sCisJeyAicmVncmQiLCAgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsICZiZmFkX2RlYnVnZnNfb3BfcmVncmQsICB9LAorCXsgInJlZ3dyIiwgIFNfSUZSRUd8U19JV1VTUiwgJmJmYWRfZGVidWdmc19vcF9yZWd3ciwgIH0sCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYmZhX2RlYnVnZnNfcm9vdDsKK3N0YXRpYyBhdG9taWNfdCBiZmFfZGVidWdmc19wb3J0X2NvdW50OworCitpbmxpbmUgdm9pZAorYmZhZF9kZWJ1Z2ZzX2luaXQoc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0KQoreworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9IHBvcnQtPmltX3BvcnQ7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpbV9wb3J0LT5zaG9zdDsKKwljb25zdCBzdHJ1Y3QgYmZhZF9kZWJ1Z2ZzX2VudHJ5ICpmaWxlOworCWNoYXIgbmFtZVsxNl07CisJaW50IGk7CisKKwlpZiAoIWJmYV9kZWJ1Z2ZzX2VuYWJsZSkKKwkJcmV0dXJuOworCisJLyogU2V0dXAgdGhlIEJGQSBkZWJ1Z2ZzIHJvb3QgZGlyZWN0b3J5Ki8KKwlpZiAoIWJmYV9kZWJ1Z2ZzX3Jvb3QpIHsKKwkJYmZhX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYmZhIiwgTlVMTCk7CisJCWF0b21pY19zZXQoJmJmYV9kZWJ1Z2ZzX3BvcnRfY291bnQsIDApOworCQlpZiAoIWJmYV9kZWJ1Z2ZzX3Jvb3QpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiQkZBIGRlYnVnZnMgcm9vdCBkaXIgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyoKKwkgKiBTZXR1cCB0aGUgaG9zdCMgZGlyZWN0b3J5IGZvciB0aGUgcG9ydCwKKwkgKiBjb3JyZXNwb25kcyB0byB0aGUgc2NzaV9ob3N0IG51bSBvZiB0aGlzIHBvcnQuCisJICovCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiaG9zdCVkIiwgc2hvc3QtPmhvc3Rfbm8pOworCWlmICghcG9ydC0+cG9ydF9kZWJ1Z2ZzX3Jvb3QpIHsKKwkJcG9ydC0+cG9ydF9kZWJ1Z2ZzX3Jvb3QgPQorCQkJZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIGJmYV9kZWJ1Z2ZzX3Jvb3QpOworCQlpZiAoIXBvcnQtPnBvcnRfZGVidWdmc19yb290KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIkJGQSBob3N0IHJvb3QgZGlyIGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWF0b21pY19pbmMoJmJmYV9kZWJ1Z2ZzX3BvcnRfY291bnQpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJmYWRfZGVidWdmc19maWxlcyk7IGkrKykgeworCQkJZmlsZSA9ICZiZmFkX2RlYnVnZnNfZmlsZXNbaV07CisJCQliZmFkLT5iZmFkX2RlbnRyeV9maWxlc1tpXSA9CisJCQkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoZmlsZS0+bmFtZSwKKwkJCQkJCQlmaWxlLT5tb2RlLAorCQkJCQkJCXBvcnQtPnBvcnRfZGVidWdmc19yb290LAorCQkJCQkJCXBvcnQsCisJCQkJCQkJZmlsZS0+Zm9wcyk7CisJCQlpZiAoIWJmYWQtPmJmYWRfZGVudHJ5X2ZpbGVzW2ldKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiQkZBIGhvc3QlZDogY3JlYXRlICVzIGVudHJ5IGZhaWxlZFxuIiwKKwkJCQkJc2hvc3QtPmhvc3Rfbm8sIGZpbGUtPm5hbWUpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJfQorCitlcnI6CisJcmV0dXJuOworfQorCitpbmxpbmUgdm9pZAorYmZhZF9kZWJ1Z2ZzX2V4aXQoc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0KQoreworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9IHBvcnQtPmltX3BvcnQ7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShiZmFkX2RlYnVnZnNfZmlsZXMpOyBpKyspIHsKKwkJaWYgKGJmYWQtPmJmYWRfZGVudHJ5X2ZpbGVzW2ldKSB7CisJCQlkZWJ1Z2ZzX3JlbW92ZShiZmFkLT5iZmFkX2RlbnRyeV9maWxlc1tpXSk7CisJCQliZmFkLT5iZmFkX2RlbnRyeV9maWxlc1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgaG9zdCMgZGlyZWN0b3J5IGZvciB0aGUgcG9ydCwKKwkgKiBjb3JyZXNwb25kcyB0byB0aGUgc2NzaV9ob3N0IG51bSBvZiB0aGlzIHBvcnQuCisJKi8KKwlpZiAocG9ydC0+cG9ydF9kZWJ1Z2ZzX3Jvb3QpIHsKKwkJZGVidWdmc19yZW1vdmUocG9ydC0+cG9ydF9kZWJ1Z2ZzX3Jvb3QpOworCQlwb3J0LT5wb3J0X2RlYnVnZnNfcm9vdCA9IE5VTEw7CisJCWF0b21pY19kZWMoJmJmYV9kZWJ1Z2ZzX3BvcnRfY291bnQpOworCX0KKworCS8qIFJlbW92ZSB0aGUgQkZBIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmJmYV9kZWJ1Z2ZzX3BvcnRfY291bnQpID09IDApIHsKKwkJZGVidWdmc19yZW1vdmUoYmZhX2RlYnVnZnNfcm9vdCk7CisJCWJmYV9kZWJ1Z2ZzX3Jvb3QgPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaAppbmRleCA2YzkyMGMxLi40NjViOGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oCkBAIC00Niw3ICs0Niw3IEBACiAjaWZkZWYgQkZBX0RSSVZFUl9WRVJTSU9OCiAjZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgQkZBX0RSSVZFUl9WRVJTSU9OCiAjZWxzZQotI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgICIyLjEuMi4xIgorI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgICIyLjIuMi4xIgogI2VuZGlmCiAKIApAQCAtMTExLDYgKzExMSw5IEBACiAJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0OwkvKiBJTSBzcGVjaWZpYyBkYXRhICovCiAJc3RydWN0IGJmYWRfdG1fcG9ydF9zICp0bV9wb3J0OwkvKiBUTSBzcGVjaWZpYyBkYXRhICovCiAJc3RydWN0IGJmYWRfaXBmY19wb3J0X3MgKmlwZmNfcG9ydDsJLyogSVBGQyBzcGVjaWZpYyBkYXRhICovCisKKwkvKiBwb3J0IGRlYnVnZnMgc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCBkZW50cnkgKnBvcnRfZGVidWdmc19yb290OwogfTsKIAogLyoKQEAgLTEyMCw2ICsxMjMsOCBAQAogCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAgZHJ2X3BvcnQ7CiAJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyBmY3NfdnBvcnQ7CiAJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBfZGVsOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnRyeTsKKwlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgcG9ydF9jZmc7CiB9OwogCiAvKgpAQCAtMTM5LDE4ICsxNDQsNiBAQAogCXUzMiAgICAgICAgYmluZGluZ19tZXRob2Q7CiB9OwogCi11bmlvbiBiZmFkX3RtcF9idWYgewotCS8qIEZyb20gc3RydWN0IGJmYV9hZGFwdGVyX2F0dHJfcyAqLwotCWNoYXIgICAgICAgICAgICBtYW51ZmFjdHVyZXJbQkZBX0FEQVBURVJfTUZHX05BTUVfTEVOXTsKLQljaGFyICAgICAgICAgICAgc2VyaWFsX251bVtCRkFfQURBUFRFUl9TRVJJQUxfTlVNX0xFTl07Ci0JY2hhciAgICAgICAgICAgIG1vZGVsW0JGQV9BREFQVEVSX01PREVMX05BTUVfTEVOXTsKLQljaGFyICAgICAgICAgICAgZndfdmVyW0JGQV9WRVJTSU9OX0xFTl07Ci0JY2hhciAgICAgICAgICAgIG9wdHJvbV92ZXJbQkZBX1ZFUlNJT05fTEVOXTsKLQotCS8qIEZyb20gc3RydWN0IGJmYV9pb2NfcGNpX2F0dHJfcyAqLwotCXU4ICAgICAgICAgY2hpcF9yZXZbQkZBX0lPQ19DSElQX1JFVl9MRU5dOyAgLyogIGNoaXAgcmV2aXNpb24gKi8KLX07Ci0KIC8qCiAgKiBCRkFEIChQQ0kgZnVuY3Rpb24pIGRhdGEgc3RydWN0dXJlCiAgKi8KQEAgLTE5Myw4ICsxODYsMTggQEAKIAlzdHJ1Y3QgYmZhX3Bsb2dfcyAgICAgIHBsb2dfYnVmOwogCWludCAgICAgICAgICAgICByZWZfY291bnQ7CiAJYmZhX2Jvb2xlYW5fdAlpcGZjX2VuYWJsZWQ7Ci0JdW5pb24gYmZhZF90bXBfYnVmIHRtcF9idWY7CiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyBsaW5rX3N0YXRzOworCXN0cnVjdCBsaXN0X2hlYWQgcGJjX3BjZmdfbGlzdDsKKwlhdG9taWNfdCB3cV9yZXFjbnQ7CisJLyogZGVidWdmcyBzcGVjaWZpYyBkYXRhICovCisJY2hhciAqcmVnZGF0YTsKKwl1MzIgcmVnbGVuOworCXN0cnVjdCBkZW50cnkgKmJmYWRfZGVudHJ5X2ZpbGVzWzVdOworfTsKKworc3RydWN0IGJmYWRfcGNmZ19zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50cnk7CisJc3RydWN0IGJmYV9wb3J0X2NmZ19zIHBvcnRfY2ZnOwogfTsKIAogLyoKQEAgLTI4MCw3ICsyODMsOSBAQAogdm9pZAkJYmZhZF9kcnZfbG9nX2xldmVsX3NldChzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKIGJmYV9zdGF0dXNfdAliZmFkX2ZjNF9tb2R1bGVfaW5pdCh2b2lkKTsKIHZvaWQJCWJmYWRfZmM0X21vZHVsZV9leGl0KHZvaWQpOwotaW50CQliZmFkX3dvcmtlciAodm9pZCAqcHRyKTsKK2ludAkJYmZhZF93b3JrZXIodm9pZCAqcHRyKTsKK3ZvaWQJCWJmYWRfZGVidWdmc19pbml0KHN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCk7Cit2b2lkCQliZmFkX2RlYnVnZnNfZXhpdChzdHJ1Y3QgYmZhZF9wb3J0X3MgKnBvcnQpOwogCiB2b2lkIGJmYWRfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBpbnQgYmZhZF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwaWQpOwpAQCAtMjkzLDYgKzI5OCw3IEBACiBleHRlcm4gaW50IGJmYV9sdW5fcXVldWVfZGVwdGg7CiBleHRlcm4gaW50IGJmYWRfc3VwcG9ydGVkX2ZjNHM7CiBleHRlcm4gaW50IGJmYV9saW5rdXBfZGVsYXk7CitleHRlcm4gaW50IGJmYV9kZWJ1Z2ZzX2VuYWJsZTsKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggYmZhZF9tdXRleDsKIAogI2VuZGlmIC8qIF9fQkZBRF9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZndpbWcuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9md2ltZy5jCmluZGV4IDJhZDY1ZjIuLjFiYWNhMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9md2ltZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9md2ltZy5jCkBAIC0zMywxNiArMzMsMjAgQEAKICNpbmNsdWRlIDxiZmFfZndpbWdfcHJpdi5oPgogI2luY2x1ZGUgPGJmYS5oPgogCi11MzIgYmZpX2ltYWdlX2N0X3NpemU7Ci11MzIgYmZpX2ltYWdlX2NiX3NpemU7Ci11MzIgKmJmaV9pbWFnZV9jdDsKLXUzMiAqYmZpX2ltYWdlX2NiOwordTMyIGJmaV9pbWFnZV9jdF9mY19zaXplOwordTMyIGJmaV9pbWFnZV9jdF9jbmFfc2l6ZTsKK3UzMiBiZmlfaW1hZ2VfY2JfZmNfc2l6ZTsKK3UzMiAqYmZpX2ltYWdlX2N0X2ZjOwordTMyICpiZmlfaW1hZ2VfY3RfY25hOwordTMyICpiZmlfaW1hZ2VfY2JfZmM7CiAKIAotI2RlZmluZQlCRkFEX0ZXX0ZJTEVfQ1QJImN0ZncuYmluIgotI2RlZmluZQlCRkFEX0ZXX0ZJTEVfQ0IJImNiZncuYmluIgotTU9EVUxFX0ZJUk1XQVJFKEJGQURfRldfRklMRV9DVCk7Ci1NT0RVTEVfRklSTVdBUkUoQkZBRF9GV19GSUxFX0NCKTsKKyNkZWZpbmUJQkZBRF9GV19GSUxFX0NUX0ZDCSJjdGZ3X2ZjLmJpbiIKKyNkZWZpbmUJQkZBRF9GV19GSUxFX0NUX0NOQQkiY3Rmd19jbmEuYmluIgorI2RlZmluZQlCRkFEX0ZXX0ZJTEVfQ0JfRkMJImNiZndfZmMuYmluIgorTU9EVUxFX0ZJUk1XQVJFKEJGQURfRldfRklMRV9DVF9GQyk7CitNT0RVTEVfRklSTVdBUkUoQkZBRF9GV19GSUxFX0NUX0NOQSk7CitNT0RVTEVfRklSTVdBUkUoQkZBRF9GV19GSUxFX0NCX0ZDKTsKIAogdTMyICoKIGJmYWRfcmVhZF9maXJtd2FyZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyICoqYmZpX2ltYWdlLApAQCAtNzQsMjQgKzc4LDU0IEBACiB1MzIgKgogYmZhZF9nZXRfZmlybXdhcmVfYnVmKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWlmIChwZGV2LT5kZXZpY2UgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QpIHsKLQkJaWYgKGJmaV9pbWFnZV9jdF9zaXplID09IDApCi0JCQliZmFkX3JlYWRfZmlybXdhcmUocGRldiwgJmJmaV9pbWFnZV9jdCwKLQkJCQkmYmZpX2ltYWdlX2N0X3NpemUsIEJGQURfRldfRklMRV9DVCk7Ci0JCXJldHVybiBiZmlfaW1hZ2VfY3Q7CisJaWYgKHBkZXYtPmRldmljZSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVF9GQykgeworCQlpZiAoYmZpX2ltYWdlX2N0X2ZjX3NpemUgPT0gMCkKKwkJCWJmYWRfcmVhZF9maXJtd2FyZShwZGV2LCAmYmZpX2ltYWdlX2N0X2ZjLAorCQkJCSZiZmlfaW1hZ2VfY3RfZmNfc2l6ZSwgQkZBRF9GV19GSUxFX0NUX0ZDKTsKKwkJcmV0dXJuIGJmaV9pbWFnZV9jdF9mYzsKKwl9IGVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVCkgeworCQlpZiAoYmZpX2ltYWdlX2N0X2NuYV9zaXplID09IDApCisJCQliZmFkX3JlYWRfZmlybXdhcmUocGRldiwgJmJmaV9pbWFnZV9jdF9jbmEsCisJCQkJJmJmaV9pbWFnZV9jdF9jbmFfc2l6ZSwgQkZBRF9GV19GSUxFX0NUX0NOQSk7CisJCXJldHVybiBiZmlfaW1hZ2VfY3RfY25hOwogCX0gZWxzZSB7Ci0JCWlmIChiZmlfaW1hZ2VfY2Jfc2l6ZSA9PSAwKQotCQkJYmZhZF9yZWFkX2Zpcm13YXJlKHBkZXYsICZiZmlfaW1hZ2VfY2IsCi0JCQkJJmJmaV9pbWFnZV9jYl9zaXplLCBCRkFEX0ZXX0ZJTEVfQ0IpOwotCQlyZXR1cm4gYmZpX2ltYWdlX2NiOworCQlpZiAoYmZpX2ltYWdlX2NiX2ZjX3NpemUgPT0gMCkKKwkJCWJmYWRfcmVhZF9maXJtd2FyZShwZGV2LCAmYmZpX2ltYWdlX2NiX2ZjLAorCQkJCSZiZmlfaW1hZ2VfY2JfZmNfc2l6ZSwgQkZBRF9GV19GSUxFX0NCX0ZDKTsKKwkJcmV0dXJuIGJmaV9pbWFnZV9jYl9mYzsKIAl9CiB9CiAKIHUzMiAqCi1iZmlfaW1hZ2VfY3RfZ2V0X2NodW5rKHUzMiBvZmYpCi17IHJldHVybiAodTMyICopKGJmaV9pbWFnZV9jdCArIG9mZik7IH0KK2JmaV9pbWFnZV9jdF9mY19nZXRfY2h1bmsodTMyIG9mZikKK3sgcmV0dXJuICh1MzIgKikoYmZpX2ltYWdlX2N0X2ZjICsgb2ZmKTsgfQogCiB1MzIgKgotYmZpX2ltYWdlX2NiX2dldF9jaHVuayh1MzIgb2ZmKQoteyByZXR1cm4gKHUzMiAqKShiZmlfaW1hZ2VfY2IgKyBvZmYpOyB9CitiZmlfaW1hZ2VfY3RfY25hX2dldF9jaHVuayh1MzIgb2ZmKQoreyByZXR1cm4gKHUzMiAqKShiZmlfaW1hZ2VfY3RfY25hICsgb2ZmKTsgfQogCit1MzIgKgorYmZpX2ltYWdlX2NiX2ZjX2dldF9jaHVuayh1MzIgb2ZmKQoreyByZXR1cm4gKHUzMiAqKShiZmlfaW1hZ2VfY2JfZmMgKyBvZmYpOyB9CisKK3VpbnQzMl90ICoKK2JmaV9pbWFnZV9nZXRfY2h1bmsoaW50IHR5cGUsIHVpbnQzMl90IG9mZikKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEJGSV9JTUFHRV9DVF9GQzogcmV0dXJuIGJmaV9pbWFnZV9jdF9mY19nZXRfY2h1bmsob2ZmKTsgYnJlYWs7CisJY2FzZSBCRklfSU1BR0VfQ1RfQ05BOiByZXR1cm4gYmZpX2ltYWdlX2N0X2NuYV9nZXRfY2h1bmsob2ZmKTsgYnJlYWs7CisJY2FzZSBCRklfSU1BR0VfQ0JfRkM6IHJldHVybiBiZmlfaW1hZ2VfY2JfZmNfZ2V0X2NodW5rKG9mZik7IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAwOyBicmVhazsKKwl9Cit9CisKK3VpbnQzMl90CitiZmlfaW1hZ2VfZ2V0X3NpemUoaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCRklfSU1BR0VfQ1RfRkM6IHJldHVybiBiZmlfaW1hZ2VfY3RfZmNfc2l6ZTsgYnJlYWs7CisJY2FzZSBCRklfSU1BR0VfQ1RfQ05BOiByZXR1cm4gYmZpX2ltYWdlX2N0X2NuYV9zaXplOyBicmVhazsKKwljYXNlIEJGSV9JTUFHRV9DQl9GQzogcmV0dXJuIGJmaV9pbWFnZV9jYl9mY19zaXplOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gMDsgYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYwppbmRleCA1YjdjZjUzLi42NzgxMjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJCWltX3BvcnQtPnNob3N0LT50cmFuc3BvcnR0ID0KIAkJCQliZmFkX2ltX3Njc2lfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlOwogCi0JZXJyb3IgPSBzY3NpX2FkZF9ob3N0KGltX3BvcnQtPnNob3N0LCBkZXYpOworCWVycm9yID0gc2NzaV9hZGRfaG9zdF93aXRoX2RtYShpbV9wb3J0LT5zaG9zdCwgZGV2LCAmYmZhZC0+cGNpZGV2LT5kZXYpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpX2FkZF9ob3N0IGZhaWx1cmUgJWRcbiIsIGVycm9yKTsKIAkJZ290byBvdXRfZmNfcmVsOwpAQCAtNTY3LDYgKzU2Nyw3IEBACiAKIG91dF9mY19yZWw6CiAJc2NzaV9ob3N0X3B1dChpbV9wb3J0LT5zaG9zdCk7CisJaW1fcG9ydC0+c2hvc3QgPSBOVUxMOwogb3V0X2ZyZWVfaWRyOgogCW11dGV4X2xvY2soJmJmYWRfbXV0ZXgpOwogCWlkcl9yZW1vdmUoJmJmYWRfaW1fcG9ydF9pbmRleCwgaW1fcG9ydC0+aWRyX2lkKTsKQEAgLTU5NywxMCArNTk4LDEyIEBACiB7CiAJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZmFkX2ltX3BvcnRfcywgcG9ydF9kZWxldGVfd29yayk7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CiAKIAlpZiAoaW1fcG9ydC0+cG9ydC0+cHZiX3R5cGUgIT0gQkZBRF9QT1JUX1BIWVNfQkFTRSkgewogCQlpbV9wb3J0LT5mbGFncyB8PSBCRkFEX1BPUlRfREVMRVRFOwogCQlmY192cG9ydF90ZXJtaW5hdGUoaW1fcG9ydC0+ZmNfdnBvcnQpOworCQlhdG9taWNfZGVjKCZiZmFkLT53cV9yZXFjbnQpOwogCX0KIAogfQpAQCAtNjMzLDggKzYzNiwxMSBAQAogewogCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9IHBvcnQtPmltX3BvcnQ7CiAKLQlxdWV1ZV93b3JrKGJmYWQtPmltLT5kcnZfd29ya3EsCisJaWYgKGltX3BvcnQtPnBvcnQtPnB2Yl90eXBlICE9IEJGQURfUE9SVF9QSFlTX0JBU0UpIHsKKwkJYXRvbWljX2luYygmYmZhZC0+d3FfcmVxY250KTsKKwkJcXVldWVfd29yayhiZmFkLT5pbS0+ZHJ2X3dvcmtxLAogCQkJCSZpbV9wb3J0LT5wb3J0X2RlbGV0ZV93b3JrKTsKKwl9CiB9CiAKIHZvaWQKQEAgLTY5NSwxMiArNzAxLDI3IEBACiBiZmFkX2ltX3Byb2JlX3VuZG8oc3RydWN0IGJmYWRfcyAqYmZhZCkKIHsKIAlpZiAoYmZhZC0+aW0pIHsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZiZmFkLT53cV9yZXFjbnQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJiZmEgJXM6IHdhaXRpbmcgd29ya3EgcHJvY2Vzc2luZywiCisJCQkJIiB3cV9yZXFjbnQ6JXhcbiIsIGJmYWQtPnBjaV9uYW1lLAorCQkJCWF0b21pY19yZWFkKCZiZmFkLT53cV9yZXFjbnQpKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKEhaKTsKKwkJfQogCQliZmFkX29zX2Rlc3Ryb3lfd29ya3EoYmZhZC0+aW0pOwogCQlrZnJlZShiZmFkLT5pbSk7CiAJCWJmYWQtPmltID0gTlVMTDsKIAl9CiB9CiAKKy8qKgorICogQ2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBJTyByZWRpcmVjdGlvbiBzdGF0ZSBjaGFuZ2UKKyAqLwordm9pZAorYmZhX2NiX2lvcmVkaXJlY3Rfc3RhdGVfY2hhbmdlKHZvaWQgKmhjYl9iZmFkLCBiZmFfYm9vbGVhbl90IGlvcmVkaXJlY3QpCit7CisJLyogRG8gbm90aGluZyAqLworfQorCiBzdHJ1Y3QgU2NzaV9Ib3N0ICoKIGJmYWRfb3Nfc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwgc3RydWN0IGJmYWRfcyAqYmZhZCkKIHsKQEAgLTEyMDQsOSArMTIyNSw5IEBACiBiZmFkX29zX2dldF9saW5rdXBfZGVsYXkoc3RydWN0IGJmYWRfcyAqYmZhZCkKIHsKIAotCXU4ICAgICAgICAgbnd3bnMgPSAwOwotCXd3bl90ICAgICAgICAgICAqd3duczsKLQlpbnQgICAgICAgICAgICAgbGRlbGF5OworCXU4ICAgICAgbnd3bnMgPSAwOworCXd3bl90CXd3bnNbQkZBX1BSRUJPT1RfQk9PVExVTl9NQVhdOworCWludCAgICAgbGRlbGF5OwogCiAJLyoKIAkgKiBRdWVyeWluZyBmb3IgdGhlIGJvb3QgdGFyZ2V0IHBvcnQgd3ducwpAQCAtMTIxNSw3ICsxMjM2LDcgQEAKIAkgKiBlbHNlID0+IGxvY2FsIGJvb3QgbWFjaGluZSBzZXQgYmZhX2xpbmt1cF9kZWxheSA9IDEwCiAJICovCiAKLQliZmFfaW9jZmNfZ2V0X2Jvb3R3d25zKCZiZmFkLT5iZmEsICZud3ducywgJnd3bnMpOworCWJmYV9pb2NmY19nZXRfYm9vdHd3bnMoJmJmYWQtPmJmYSwgJm53d25zLCB3d25zKTsKIAogCWlmIChud3ducyA+IDApIHsKIAkJLyogSWYgYm9vdCBvdmVyIFNBTjsgbGlua3VwX2RlbGF5ID0gMzBzZWMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbV9jb21wYXQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbV9jb21wYXQuaAppbmRleCBiMzZiZTE1Li4wYTEyMmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW1fY29tcGF0LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltX2NvbXBhdC5oCkBAIC0xOCw5ICsxOCw2IEBACiAjaWZuZGVmIF9fQkZBRF9JTV9DT01QQVRfSF9fCiAjZGVmaW5lIF9fQkZBRF9JTV9DT01QQVRfSF9fCiAKLWV4dGVybiB1MzIgKmJmaV9pbWFnZV9idWY7Ci1leHRlcm4gdTMyIGJmaV9pbWFnZV9zaXplOwotCiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmJmYWRfaW1faG9zdF9hdHRyc1tdOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpiZmFkX2ltX3Zwb3J0X2F0dHJzW107CiAKQEAgLTM3LDEwICszNCwxMiBAQAogc3RhdGljIGlubGluZSB2b2lkCiBiZmFkX2ZyZWVfZndpbWcodm9pZCkKIHsKLQlpZiAoYmZpX2ltYWdlX2N0X3NpemUgJiYgYmZpX2ltYWdlX2N0KQotCQl2ZnJlZShiZmlfaW1hZ2VfY3QpOwotCWlmIChiZmlfaW1hZ2VfY2Jfc2l6ZSAmJiBiZmlfaW1hZ2VfY2IpCi0JCXZmcmVlKGJmaV9pbWFnZV9jYik7CisJaWYgKGJmaV9pbWFnZV9jdF9mY19zaXplICYmIGJmaV9pbWFnZV9jdF9mYykKKwkJdmZyZWUoYmZpX2ltYWdlX2N0X2ZjKTsKKwlpZiAoYmZpX2ltYWdlX2N0X2NuYV9zaXplICYmIGJmaV9pbWFnZV9jdF9jbmEpCisJCXZmcmVlKGJmaV9pbWFnZV9jdF9jbmEpOworCWlmIChiZmlfaW1hZ2VfY2JfZmNfc2l6ZSAmJiBiZmlfaW1hZ2VfY2JfZmMpCisJCXZmcmVlKGJmaV9pbWFnZV9jYl9mYyk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ludHIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbnRyLmMKaW5kZXggMmI3ZGJlYy4uNTZhMzUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ludHIuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW50ci5jCkBAIC0yNiw3ICsyNiwxMSBAQAogc3RhdGljIGludCBtc2l4X2Rpc2FibGVfY2I7CiBzdGF0aWMgaW50IG1zaXhfZGlzYWJsZV9jdDsKIG1vZHVsZV9wYXJhbShtc2l4X2Rpc2FibGVfY2IsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtc2l4X2Rpc2FibGVfY2IsICJEaXNhYmxlIE1TSVggZm9yIEJyb2NhZGUtNDE1LzQyNS84MTUvODI1IgorCQkiIGNhcmRzLCBkZWZhdWx0PTAsIFJhbmdlW2ZhbHNlOjB8dHJ1ZToxXSIpOwogbW9kdWxlX3BhcmFtKG1zaXhfZGlzYWJsZV9jdCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1zaXhfZGlzYWJsZV9jdCwgIkRpc2FibGUgTVNJWCBmb3IgQnJvY2FkZS0xMDEwLzEwMjAvODA0IgorCQkiIGNhcmRzLCBkZWZhdWx0PTAsIFJhbmdlW2ZhbHNlOjB8dHJ1ZToxXSIpOwogLyoqCiAgKiBMaW5lIGJhc2VkIGludGVycnVwdCBoYW5kbGVyLgogICovCkBAIC0xNTEsOCArMTU1LDggQEAKIAkvKiBTZXQgdXAgdGhlIG1zaXggZW50cnkgdGFibGUgKi8KIAliZmFkX2luaXRfbXNpeF9lbnRyeShiZmFkLCBtc2l4X2VudHJpZXMsIG1hc2ssIG1heF9iaXQpOwogCi0JaWYgKChwZGV2LT5kZXZpY2UgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QgJiYgIW1zaXhfZGlzYWJsZV9jdCkgfHwKLQkgICAgKHBkZXYtPmRldmljZSAhPSBCRkFfUENJX0RFVklDRV9JRF9DVCAmJiAhbXNpeF9kaXNhYmxlX2NiKSkgeworCWlmICgoYmZhX2FzaWNfaWRfY3QocGRldi0+ZGV2aWNlKSAmJiAhbXNpeF9kaXNhYmxlX2N0KSB8fAorCQkoIWJmYV9hc2ljX2lkX2N0KHBkZXYtPmRldmljZSkgJiYgIW1zaXhfZGlzYWJsZV9jYikpIHsKIAogCQllcnJvciA9IHBjaV9lbmFibGVfbXNpeChiZmFkLT5wY2lkZXYsIG1zaXhfZW50cmllcywgYmZhZC0+bnZlYyk7CiAJCWlmIChlcnJvcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mYWJyaWMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvZmFicmljLmMKaW5kZXggODE2NmU5Ny4uZGRkNGJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9mYWJyaWMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2ZhYnJpYy5jCkBAIC03ODksNyArNzg5LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmFicmljLT52cG9ydF9xKSB7CiAJCXZwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKilxZTsKLQkJYmZhX2Zjc192cG9ydF9kZWxldGUodnBvcnQpOworCQliZmFfZmNzX3Zwb3J0X2Zjc19kZWxldGUodnBvcnQpOwogCX0KIAogCWJmYV9mY3NfcG9ydF9kZWxldGUoJmZhYnJpYy0+YnBvcnQpOwpAQCAtMTAyNyw2ICsxMDI3LDMyIEBACiAJcmV0dXJuIGZhYnJpYy0+bnVtX3Zwb3J0czsKIH0KIAorLyoKKyAqICBHZXQgT1VJIG9mIHRoZSBhdHRhY2hlZCBzd2l0Y2guCisgKgorICogIE5vdGUgOiBVc2Ugb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYXZvaWRlZCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICogICAgICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgdGhlcmUgaXMgYW55IHJlcXVpcmVtZW50CisgKiAgICAgICAgIHRvIGNoZWNrIGZvciBGT1MgdmVyc2lvbiBiZWxvdyA2LjMuCisgKiAgICAgICAgIFRvIGNoZWNrIGlmIHRoZSBhdHRhY2hlZCBmYWJyaWMgaXMgYSBicm9jYWRlIGZhYnJpYywgdXNlCisgKiAgICAgICAgIGJmYV9scHNfaXNfYnJjZF9mYWJyaWMoKSB3aGljaCB3b3JrcyBmb3IgRk9TIHZlcnNpb25zIDYuMworICogICAgICAgICBvciBhYm92ZSBvbmx5LgorICovCisKK3UxNgorYmZhX2Zjc19mYWJyaWNfZ2V0X3N3aXRjaF9vdWkoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwl3d25fdCBmYWJfbnd3bjsKKwl1OCAqdG1wOworCXUxNiBvdWk7CisKKwlmYWJfbnd3biA9IGJmYV9scHNfZ2V0X3BlZXJfbnd3bihmYWJyaWMtPmxwcyk7CisKKwl0bXAgPSAodWludDhfdCAqKSZmYWJfbnd3bjsKKwlvdWkgPSAodG1wWzNdIDw8IDgpIHwgdG1wWzRdOworCisJcmV0dXJuIG91aTsKK30KKwogLyoqCiAgKiAJCVVuc29saWNpdGVkIGZyYW1lIHJlY2VpdmUgaGFuZGxpbmcuCiAgKi8KQEAgLTEyNzEsNiArMTI5NywyMiBAQAogfQogCiAvKioKKyAqCisgKiBAcGFyYW1baW5dIGZhYnJpYyAtIGZhYnJpYworICogQHBhcmFtW2luXSBub2RlX3N5bW5hbWUgLQorICogICAgICAgICAgICAgIENhbGxlciBhbGxvY2F0ZWQgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHN5bWJvbGljIG5hbWUKKyAqCisgKiBAcmV0dXJuIC0gbm9uZQorICovCit2b2lkCitiZmFfZmNzX2dldF9zeW1fbmFtZShjb25zdCBzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIGNoYXIgKm5vZGVfc3ltbmFtZSkKK3sKKwliZmFfb3NfbWVtY3B5KG5vZGVfc3ltbmFtZSwKKwkJCWZjcy0+ZmFicmljLmJwb3J0LnBvcnRfY2ZnLnN5bV9uYW1lLnN5bW5hbWUsCisJCQlCRkFfU1lNTkFNRV9NQVhMRU4pOworfQorCisvKioKICAqIE5vdCB1c2VkIGJ5IEZDUy4KICAqLwogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3BpbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9mY3BpbS5jCmluZGV4IDhhZTRhMmNmLi42Yjg5NzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2ZjcGltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY3BpbS5jCkBAIC0xMTAsNiArMTEwLDcgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09OTElORToKIAkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9wcmxpX3NlbmQpOworCQlpdG5pbS0+cHJsaV9yZXRyaWVzID0gMDsKIAkJYmZhX2Zjc19pdG5pbV9zZW5kX3BybGkoaXRuaW0sIE5VTEwpOwogCQlicmVhazsKIApAQCAtMTc0LDggKzE3NSwxMiBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9SU1BfT0s6Ci0JCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21faGNiX29ubGluZSk7Ci0JCWJmYV9pdG5pbV9vbmxpbmUoaXRuaW0tPmJmYV9pdG5pbSwgaXRuaW0tPnNlcV9yZWMpOworCQlpZiAoaXRuaW0tPnJwb3J0LT5zY3NpX2Z1bmN0aW9uID09IEJGQV9SUE9SVF9JTklUSUFUT1IpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21faW5pdGlhdG9yKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21faGNiX29ubGluZSk7CisJCQliZmFfaXRuaW1fb25saW5lKGl0bmltLT5iZmFfaXRuaW0sIGl0bmltLT5zZXFfcmVjKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9SU1BfRVJST1I6CkBAIC0xOTMsOSArMTk4LDcgQEAKIAogCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9JTklUSUFUT1I6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21faW5pdGlhdG9yKTsKLQkJLyoKLQkJICogZG9udCBkaXNjYXJkIGZjeHAuIGFjY2VwdCB3aWxsIHJlYWNoIHNhbWUgc3RhdGUKLQkJICovCisJCWJmYV9mY3hwX2Rpc2NhcmQoaXRuaW0tPmZjeHApOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CkBAIC0yMTgsOCArMjIxLDE2IEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBCRkFfRkNTX0lUTklNX1NNX1RJTUVPVVQ6Ci0JCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fcHJsaV9zZW5kKTsKLQkJYmZhX2Zjc19pdG5pbV9zZW5kX3BybGkoaXRuaW0sIE5VTEwpOworCQlpZiAoaXRuaW0tPnBybGlfcmV0cmllcyA8IEJGQV9GQ1NfUlBPUlRfTUFYX1JFVFJJRVMpIHsKKwkJCWl0bmltLT5wcmxpX3JldHJpZXMrKzsKKwkJCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnBybGlfcmV0cmllcyk7CisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX3BybGlfc2VuZCk7CisJCQliZmFfZmNzX2l0bmltX3NlbmRfcHJsaShpdG5pbSwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQkvKiBpbnZva2UgdGFyZ2V0IG9mZmxpbmUgKi8KKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCQliZmFfZmNzX3Jwb3J0X2xvZ29faW1wKGl0bmltLT5ycG9ydCk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1NfSVROSU1fU01fT0ZGTElORToKQEAgLTQyMiw3ICs0MzMsNyBAQAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgcnBvcnQtPmJmYV9ycG9ydCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLAogCQkgICAgICBCRkFfRkFMU0UsIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCiAJCSAgICAgIGJmYV9mY3NfaXRuaW1fcHJsaV9yZXNwb25zZSwgKHZvaWQgKilpdG5pbSwgRkNfTUFYX1BEVVNaLAotCQkgICAgICBGQ19SQV9UT1YpOworCQkgICAgICBGQ19FTFNfVE9WKTsKIAogCWl0bmltLT5zdGF0cy5wcmxpX3NlbnQrKzsKIAliZmFfc21fc2VuZF9ldmVudChpdG5pbSwgQkZBX0ZDU19JVE5JTV9TTV9GUk1TRU5UKTsKQEAgLTQ2Nyw3ICs0NzgsNyBAQAogCQkJCQlCRkFfUlBPUlRfSU5JVElBVE9SOwogCQkJCWl0bmltLT5zdGF0cy5wcmxpX3JzcF9hY2MrKzsKIAkJCQliZmFfc21fc2VuZF9ldmVudChpdG5pbSwKLQkJCQkJCSAgQkZBX0ZDU19JVE5JTV9TTV9JTklUSUFUT1IpOworCQkJCQkJICBCRkFfRkNTX0lUTklNX1NNX1JTUF9PSyk7CiAJCQkJcmV0dXJuOwogCQkJfQogCkBAIC03MzgsNiArNzQ5LDcgQEAKIAlhdHRyLT5yZWNfc3VwcG9ydCA9IGl0bmltLT5yZWNfc3VwcG9ydDsKIAlhdHRyLT5jb25mX2NvbXAgPSBpdG5pbS0+Y29uZl9jb21wOwogCWF0dHItPnRhc2tfcmV0cnlfaWQgPSBpdG5pbS0+dGFza19yZXRyeV9pZDsKKwliZmFfb3NfbWVtc2V0KCZhdHRyLT5pb19sYXRlbmN5LCAwLCBzaXplb2Yoc3RydWN0IGJmYV9pdG5pbV9sYXRlbmN5X3MpKTsKIAogCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQpAQCAtNzkzLDcgKzgwNSw3IEBACiAKIAlzd2l0Y2ggKGVsc19jbWQtPmVsc19jb2RlKSB7CiAJY2FzZSBGQ19FTFNfUFJMTzoKLQkJLyogYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fUFJMTyk7ICovCisJCWJmYV9mY3NfcnBvcnRfcHJsbyhpdG5pbS0+cnBvcnQsIGZjaHMtPm94X2lkKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3NfZmFicmljLmggYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19mYWJyaWMuaAppbmRleCAyNDRjM2YwLi40MzJhYjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc19mYWJyaWMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19mYWJyaWMuaApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Zwb3J0Lmg+CiAjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KIAorI2RlZmluZSBCRkFfRkNTX0JSQ0RfU1dJVENIX09VSSAgMHgwNTFlCisKIC8qCiAqIGZjcyBmcmllbmQgZnVuY3Rpb25zOiBvbmx5IGJldHdlZW4gZmNzIG1vZHVsZXMKICAqLwpAQCAtNjAsNCArNjIsNyBAQAogCiB2b2lkIGJmYV9mY3NfZmFicmljX3NldF9mYWJyaWNfbmFtZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAogCQkJd3duX3QgZmFicmljX25hbWUpOwordTE2IGJmYV9mY3NfZmFicmljX2dldF9zd2l0Y2hfb3VpKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpOwordm9pZCBiZmFfZmNzX2dldF9zeW1fbmFtZShjb25zdCBzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIGNoYXIgKm5vZGVfc3ltbmFtZSk7CisKICNlbmRpZiAvKiBfX0ZDU19GQUJSSUNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc19ycG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfcnBvcnQuaAppbmRleCA5YzhkMWQyLi5lNjM0ZmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc19ycG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX3Jwb3J0LmgKQEAgLTI0LDYgKzI0LDggQEAKIAogI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Jwb3J0Lmg+CiAKKyNkZWZpbmUgQkZBX0ZDU19SUE9SVF9NQVhfUkVUUklFUyAgICAgICAgICAgICAgICg1KQorCiB2b2lkIGJmYV9mY3NfcnBvcnRfdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwgc3RydWN0IGZjaHNfcyAqZmNocywKIAkJCXUxNiBsZW4pOwogdm9pZCBiZmFfZmNzX3Jwb3J0X3NjbihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7CkBAIC00MSw2ICs0Myw3IEBACiB2b2lkIGJmYV9mY3NfcnBvcnRfcGxvZ2koc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIHN0cnVjdCBmY2hzX3MgKmZjaHMsCiAJCQlzdHJ1Y3QgZmNfbG9naV9zICpwbG9naSk7CiB2b2lkIGJmYV9mY3NfcnBvcnRfbG9nb19pbXAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwordm9pZCBiZmFfZmNzX3Jwb3J0X3BybG8oc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIHVpbnQxNl90IG94X2lkKTsKIHZvaWQgYmZhX2Zjc19ycG9ydF9pdG5pbV9hY2soc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwogdm9pZCBiZmFfZmNzX3Jwb3J0X2l0bnRtX2FjayhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7CiB2b2lkIGJmYV9mY3NfcnBvcnRfdGluX2FjayhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc192cG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfdnBvcnQuaAppbmRleCAxM2MzMmViLi5iYjY0N2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc192cG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX3Zwb3J0LmgKQEAgLTI2LDYgKzI2LDcgQEAKIHZvaWQgYmZhX2Zjc192cG9ydF9vbmxpbmUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwogdm9pZCBiZmFfZmNzX3Zwb3J0X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwogdm9pZCBiZmFfZmNzX3Zwb3J0X2RlbGV0ZV9jb21wKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKK3ZvaWQgYmZhX2Zjc192cG9ydF9mY3NfZGVsZXRlKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKIAogI2VuZGlmIC8qIF9fRkNTX1ZQT1JUX0hfXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2ZkbWkuYyBiL2RyaXZlcnMvc2NzaS9iZmEvZmRtaS5jCmluZGV4IDhmMTcwNzYuLjJiNTBlYWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2ZkbWkuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2ZkbWkuYwpAQCAtNTMyLDcgKzUzMiw3IEBACiAJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKIAkJICAgICAgRkNfQ0xBU1NfMywgKGxlbiArIGF0dHJfbGVuKSwgJmZjaHMsCiAJCSAgICAgIGJmYV9mY3NfcG9ydF9mZG1pX3JoYmFfcmVzcG9uc2UsICh2b2lkICopZmRtaSwKLQkJICAgICAgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCQkgICAgICBGQ19NQVhfUERVU1osIEZDX0ZDQ1RfVE9WKTsKIAogCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SSEJBX1NFTlQpOwogfQpAQCAtODIzLDcgKzgyMyw3IEBACiAJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKIAkJICAgICAgRkNfQ0xBU1NfMywgbGVuICsgYXR0cl9sZW4sICZmY2hzLAogCQkgICAgICBiZmFfZmNzX3BvcnRfZmRtaV9ycHJ0X3Jlc3BvbnNlLCAodm9pZCAqKWZkbWksCi0JCSAgICAgIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgRkNfTUFYX1BEVVNaLCBGQ19GQ0NUX1RPVik7CiAKIAliZmFfc21fc2VuZF9ldmVudChmZG1pLCBGRE1JU01fRVZFTlRfUlBSVF9TRU5UKTsKIH0KQEAgLTEwNDMsNyArMTA0Myw3IEBACiAJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKIAkJICAgICAgRkNfQ0xBU1NfMywgbGVuICsgYXR0cl9sZW4sICZmY2hzLAogCQkgICAgICBiZmFfZmNzX3BvcnRfZmRtaV9ycGFfcmVzcG9uc2UsICh2b2lkICopZmRtaSwKLQkJICAgICAgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCQkgICAgICBGQ19NQVhfUERVU1osIEZDX0ZDQ1RfVE9WKTsKIAogCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SUEFfU0VOVCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5faW9jLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5faW9jLmgKaW5kZXggNzEzNzhiNC4uNGRhZjk2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbl9pb2MuaApAQCAtMzIsNiArMzIsMTQgQEAKIAlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9JT0MsIEJGQV9JT0NfQUVOX0RJU0FCTEUpCiAjZGVmaW5lIEJGQV9BRU5fSU9DX0ZXTUlTTUFUQ0ggXAogCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0lPQywgQkZBX0lPQ19BRU5fRldNSVNNQVRDSCkKKyNkZWZpbmUgQkZBX0FFTl9JT0NfRldDRkdfRVJST1IgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0lPQywgQkZBX0lPQ19BRU5fRldDRkdfRVJST1IpCisjZGVmaW5lIEJGQV9BRU5fSU9DX0lOVkFMSURfVkVORE9SICAgICAgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0lPQywgQkZBX0lPQ19BRU5fSU5WQUxJRF9WRU5ET1IpCisjZGVmaW5lIEJGQV9BRU5fSU9DX0lOVkFMSURfTldXTiAgICAgICAgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0lPQywgQkZBX0lPQ19BRU5fSU5WQUxJRF9OV1dOKQorI2RlZmluZSBCRkFfQUVOX0lPQ19JTlZBTElEX1BXV04gICAgICAgIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9JT0MsIEJGQV9JT0NfQUVOX0lOVkFMSURfUFdXTikKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmEuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmEuaAppbmRleCAxZjU5NjZjLi5kNTJiMzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYS5oCkBAIC0xMjYsNiArMTI2LDEwIEBACiAJYmZhX2lvY19nZXRfdHlwZSgmKF9fYmZhKS0+aW9jKQogI2RlZmluZSBiZmFfZ2V0X21hYyhfX2JmYSkgIFwKIAliZmFfaW9jX2dldF9tYWMoJihfX2JmYSktPmlvYykKKyNkZWZpbmUgYmZhX2dldF9tZmdfbWFjKF9fYmZhKSAgXAorCWJmYV9pb2NfZ2V0X21mZ19tYWMoJihfX2JmYSktPmlvYykKKyNkZWZpbmUgYmZhX2dldF9md19jbG9ja19yZXMoX19iZmEpICAgIFwKKwkoKF9fYmZhKS0+aW9jZmMuY2ZncnNwLT5md2NmZy5md190aWNrX3JlcykKIAogLyoKICAqIGJmYSBBUEkgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhX2ZjcGltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhX2ZjcGltLmgKaW5kZXggMDQ3ODk3OS4uNGJjOTQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9mY3BpbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfZmNwaW0uaApAQCAtNDIsNiArNDIsMjQgQEAKIGJmYV9zdGF0dXNfdCBiZmFfZmNwaW1fZ2V0X21vZHN0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLAogCQkJc3RydWN0IGJmYV9mY3BpbV9zdGF0c19zICptb2RzdGF0cyk7CiBiZmFfc3RhdHVzX3QgYmZhX2ZjcGltX2Nscl9tb2RzdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9mY3BpbV9zZXRfaW9yZWRpcmVjdChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBzdGF0ZSk7Cit2b2lkIGJmYV9mY3BpbV91cGRhdGVfaW9yZWRpcmVjdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9jYl9pb3JlZGlyZWN0X3N0YXRlX2NoYW5nZSh2b2lkICpoY2JfYmZhZCwgYmZhX2Jvb2xlYW5fdCBpb3JlZGlyZWN0KTsKKworI2RlZmluZSBiZmFfZmNwaW1faW9yZWRpcmVjdF9lbmFibGVkKF9fYmZhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKikoQkZBX0ZDUElNX01PRChfX2JmYSkpKS0+aW9yZWRpcmVjdCkKKworI2RlZmluZSBiZmFfZmNwaW1fZ2V0X25leHRfcmVxcShfX2JmYSwgX19xaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKl9fZmNwaW0gPSBCRkFfRkNQSU1fTU9EKF9fYmZhKTsgICAgICAgICBcCisJX19mY3BpbS0+cmVxcSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfX2ZjcGltLT5yZXFxICY9IChCRklfSU9DX01BWF9DUVMgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkqKF9fcWlkKSA9IF9fZmNwaW0tPnJlcXE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIGJmYV9pb2NmY19tYXBfbXNnX3RvX3FpZChfX21zZywgX19xaWQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKihfX3FpZCkgPSAodTgpKChfX21zZykgJiAoQkZJX0lPQ19NQVhfQ1FTIC0gMSkpOworCiAKIC8qCiAgKiBiZmEgaXRuaW0gQVBJIGZ1bmN0aW9ucwpAQCAtNTYsNiArNzQsNyBAQAogCQkJc3RydWN0IGJmYV9pdG5pbV9oYWxfc3RhdHNfcyAqc3RhdHMpOwogdm9pZAkJYmZhX2l0bmltX2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOwogCisjZGVmaW5lIGJmYV9pdG5pbV9nZXRfcmVxcShfX2lvaW0pICgoKHN0cnVjdCBiZmFfaW9pbV9zICopX19pb2ltKS0+aXRuaW0tPnJlcXEpCiAKIC8qKgogICogCQlCRkEgY29tcGxldGlvbiBjYWxsYmFjayBmb3IgYmZhX2l0bmltX29ubGluZSgpLgpAQCAtMTU2LDQgKzE3NSwzIEBACiAJCQkJICBlbnVtIGJmaV90c2tpbV9zdGF0dXMgdHNrX3N0YXR1cyk7CiAKICNlbmRpZiAvKiBfX0JGQV9GQ1BJTV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfc3ZjLmgKaW5kZXggMTM0OWI5OS4uNzg0MDk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9zdmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhX3N2Yy5oCkBAIC0yMTUsNiArMjE1LDcgQEAKIAkJYmZhX2NiX3Bwb3J0X3QgY2Jmbiwgdm9pZCAqY2JhcmcpOwogYmZhX3N0YXR1c190IGJmYV9mY3BvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9jYl9wcG9ydF90IGNiZm4sCiAJCXZvaWQgKmNiYXJnKTsKK2JmYV9ib29sZWFuX3QgYmZhX2ZjcG9ydF9pc19xb3NfZW5hYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAKIC8qCiAgKiBiZmEgcnBvcnQgQVBJIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfY3RyZWcuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2N0cmVnLmgKaW5kZXggNTdhODQ5Ny4uYzBlZjVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfY3RyZWcuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9jdHJlZy5oCkBAIC00NTUsNiArNDU1LDkgQEAKICNkZWZpbmUgX19QU1NfTFBVMF9SQU1fRVJSICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBFUlJfU0VUX1JFRwkJCSAweDAwMDE4ODE4CiAjZGVmaW5lIF9fUFNTX0VSUl9TVEFUVVNfU0VUCQkgMHgwMDNmZmZmZgorI2RlZmluZSBQTU1fMVRfUkVTRVRfUkVHX1AwICAgICAgICAgICAgICAweDAwMDIzODFjCisjZGVmaW5lIF9fUE1NXzFUX1JFU0VUX1AgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUE1NXzFUX1JFU0VUX1JFR19QMSAgICAgICAgICAgICAgMHgwMDAyM2MxYwogI2RlZmluZSBIUU1fUVNFVDBfUlhRX0RSQkxfUDAgICAgICAgICAgICAweDAwMDM4MDAwCiAjZGVmaW5lIF9fUlhRMF9BRERfVkVDVE9SU19QICAgICAgICAgICAgIDB4ODAwMDAwMDAKICNkZWZpbmUgX19SWFEwX1NUT1BfUCAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2MuaAppbmRleCBhMDE1OGFhLi40NTBkZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2MuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2MuaApAQCAtNDgsOSArNDgsMTQgQEAKIH07CiAKIHN0cnVjdCBiZmlfaW9jX2F0dHJfcyB7Ci0Jd3duX3QgICAgICAgICAgIG1mZ193d247Ci0JbWFjX3QJCW1mZ19tYWM7Ci0JdTE2CXJzdmRfYTsKKwl3d25fdCAgICAgICAgICAgbWZnX3B3d247ICAgICAgIC8qIE1mZyBwb3J0IHd3biAqLworCXd3bl90ICAgICAgICAgICBtZmdfbnd3bjsgICAgICAgLyogTWZnIG5vZGUgd3duICovCisJbWFjX3QJCW1mZ19tYWM7CS8qIE1mZyBtYWMgICAgICAqLworCXUxNgkJcnN2ZF9hOworCXd3bl90ICAgICAgICAgICBwd3duOworCXd3bl90ICAgICAgICAgICBud3duOworCW1hY190ICAgICAgICAgICBtYWM7ICAgICAgICAgICAgLyogUEJDIG9yIE1mZyBtYWMgKi8KKwl1MTYgICAgICAgIAlyc3ZkX2I7CiAJY2hhciAgICAgICAgICAgIGJyY2Rfc2VyaWFsbnVtW1NUUlNaKEJGQV9NRkdfU0VSSUFMTlVNX1NJWkUpXTsKIAl1OCAgICAgICAgIHBjaWVfZ2VuOwogCXU4ICAgICAgICAgcGNpZV9sYW5lc19vcmlnOwpAQCAtNTgsMTEgKzYzLDEyIEBACiAJdTggICAgICAgICByeF9iYmNyZWRpdDsJLyogIHJlY2VpdmUgYnVmZmVyIGNyZWRpdHMgKi8KIAl1MzIgICAgICAgIGFkYXB0ZXJfcHJvcDsJLyogIGFkYXB0ZXIgcHJvcGVydGllcyAgICAgKi8KIAl1MTYgICAgICAgIG1heGZyc2l6ZTsJLyogIG1heCByZWNlaXZlIGZyYW1lIHNpemUgKi8KLQljaGFyICAgICAgICAgCWFzaWNfcmV2OwotCXU4ICAgICAgICAgcnN2ZF9iOwotCWNoYXIgICAgICAgICAgICBmd192ZXJzaW9uW0JGQV9WRVJTSU9OX0xFTl07Ci0JY2hhciAgICAgICAgICAgIG9wdHJvbV92ZXJzaW9uW0JGQV9WRVJTSU9OX0xFTl07CisJY2hhciAgICAgICBhc2ljX3JldjsKKwl1OCAgICAgICAgIHJzdmRfYzsKKwljaGFyICAgICAgIGZ3X3ZlcnNpb25bQkZBX1ZFUlNJT05fTEVOXTsKKwljaGFyICAgICAgIG9wdHJvbV92ZXJzaW9uW0JGQV9WRVJTSU9OX0xFTl07CiAJc3RydWN0IGJmYV9tZmdfdnBkX3MJdnBkOworCXUzMiAgICAgICAgY2FyZF90eXBlOwkvKiBjYXJkIHR5cGUgKi8KIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jZmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2lvY2ZjLmgKaW5kZXggYzM3NjBkZi4uY2NkZmNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2NmYy5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIF9fQkZJX0lPQ0ZDX0hfXwogCiAjaW5jbHVkZSAiYmZpLmgiCisjaW5jbHVkZSA8YmZpL2JmaV9wYmMuaD4KICNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2lvYy5oPgogI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfaW9jZmMuaD4KICNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2Jvb3QuaD4KQEAgLTc4LDYgKzc5LDcgQEAKIAlzdHJ1Y3QgYmZhX2lvY2ZjX2Z3Y2ZnX3MJZndjZmc7CiAJc3RydWN0IGJmYV9pb2NmY19pbnRyX2F0dHJfcwlpbnRyX2F0dHI7CiAJc3RydWN0IGJmaV9pb2NmY19ib290d3ducwlib290d3duczsKKwlzdHJ1Y3QgYmZpX3BiY19zICAgICAgICAgICAgICAgIHBiY19jZmc7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3BiYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfcGJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhNDE1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3BiYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGSV9QQkNfSF9fCisjZGVmaW5lIF9fQkZJX1BCQ19IX18KKworI3ByYWdtYSBwYWNrKDEpCisKKyNkZWZpbmUgQkZJX1BCQ19NQVhfQkxVTlMJOAorI2RlZmluZSBCRklfUEJDX01BWF9WUE9SVFMJMTYKKworI2RlZmluZSBCRklfUEJDX1BPUlRfRElTQUJMRUQJIDIKKy8qKgorICogUEJDIGJvb3QgbHVuIGNvbmZpZ3VyYXRpb24KKyAqLworc3RydWN0IGJmaV9wYmNfYmx1bl9zIHsKKwl3d25fdAkJdGd0X3B3d247CisJbHVuX3QJCXRndF9sdW47Cit9OworCisvKioKKyAqIFBCQyB2aXJ0dWFsIHBvcnQgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgYmZpX3BiY192cG9ydF9zIHsKKwl3d25fdAkJdnBfcHd3bjsKKwl3d25fdAkJdnBfbnd3bjsKK307CisKKy8qKgorICogQkZJIHByZS1ib290IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGJmaV9wYmNfcyB7CisJdTgJCXBvcnRfZW5hYmxlZDsKKwl1OAkJYm9vdF9lbmFibGVkOworCXU4CQluYmx1bnM7CisJdTgJCW52cG9ydHM7CisJdTgJCXBvcnRfc3BlZWQ7CisJdTgJCXJzdmRfYTsKKwl1MTYJCWhzczsKKwl3d25fdAkJcGJjX3B3d247CisJd3duX3QJCXBiY19ud3duOworCXN0cnVjdCBiZmlfcGJjX2JsdW5fcyBibHVuW0JGSV9QQkNfTUFYX0JMVU5TXTsKKwlzdHJ1Y3QgYmZpX3BiY192cG9ydF9zIHZwb3J0W0JGSV9QQkNfTUFYX1ZQT1JUU107Cit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogX19CRklfUEJDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9wb3J0L2JmYV9wb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY25hL3BvcnQvYmZhX3BvcnQuaAppbmRleCA3Y2JmMTdkLi5kN2JhYmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY25hL3BvcnQvYmZhX3BvcnQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY25hL3BvcnQvYmZhX3BvcnQuaApAQCAtMzcsNiArMzcsNyBAQAogCWJmYV9wb3J0X3N0YXRzX2NiZm5fdCBzdGF0c19jYmZuOwogCXZvaWQgICAgICAgICAgICpzdGF0c19jYmFyZzsKIAliZmFfc3RhdHVzX3QgICAgc3RhdHNfc3RhdHVzOworCXUzMiAgICAgICAgICAgICBzdGF0c19yZXNldF90aW1lOwogCXVuaW9uIGJmYV9wcG9ydF9zdGF0c191ICpzdGF0czsKIAlzdHJ1Y3QgYmZhX2RtYV9zIHN0YXRzX2RtYTsKIAliZmFfYm9vbGVhbl90ICAgZW5kaXNfcGVuZGluZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfZGVidWcuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfZGVidWcuaAppbmRleCA0NDFiZTg2Li43NWE5MTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX2RlYnVnLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9kZWJ1Zy5oCkBAIC0yOCw3ICsyOCw4IEBACiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGJmYV9zbV9mYXVsdChfX21vZCwgX19ldmVudCkJZG8gewkJCQlcCi0JYmZhX3NtX3BhbmljKChfX21vZCktPmxvZ20sIF9fTElORV9fLCBfX0ZJTEVfXywgX19ldmVudCk7ICAgICAgXAorCWJmYV90cmMoX19tb2QsICgoKHVpbnQzMl90KTB4REVBRCA8PCAxNikgfCBfX2V2ZW50KSk7CQlcCisJYmZhX3NtX3BhbmljKChfX21vZCktPmxvZ20sIF9fTElORV9fLCBfX0ZJTEVfXywgX19ldmVudCk7IAlcCiB9IHdoaWxlICgwKQogCiAjaWZuZGVmIEJGQV9QRVJGX0JVSUxECmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hZGFwdGVyLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hZGFwdGVyLmgKaW5kZXggOGMyMDhmYy4uYWVhMDM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYWRhcHRlci5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2FkYXB0ZXIuaApAQCAtMzksNyArMzksNyBAQAogc3RydWN0IGJmYV9hZGFwdGVyX2F0dHJfcyB7CiAJY2hhciAgICAgICAgICAgIG1hbnVmYWN0dXJlcltCRkFfQURBUFRFUl9NRkdfTkFNRV9MRU5dOwogCWNoYXIgICAgICAgICAgICBzZXJpYWxfbnVtW0JGQV9BREFQVEVSX1NFUklBTF9OVU1fTEVOXTsKLQl1MzIJcnN2ZDE7CisJdTMyCQljYXJkX3R5cGU7CiAJY2hhciAgICAgICAgICAgIG1vZGVsW0JGQV9BREFQVEVSX01PREVMX05BTUVfTEVOXTsKIAljaGFyICAgICAgICAgICAgbW9kZWxfZGVzY3JbQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOXTsKIAl3d25fdCAgICAgICAgICAgcHd3bjsKQEAgLTYwLDYgKzYwLDcgQEAKIAl1OCAgICAgICAgIHBjaWVfbGFuZXNfb3JpZzsKIAl1OCAgICAgICAgIHBjaWVfbGFuZXM7CiAJdTgJICAgICAgICBjbmFfY2FwYWJsZTsKKwl1OCAgICAgICAgIGlzX21leno7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2F1dGguaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2F1dGguaAppbmRleCA0NWRmMzI4Li5mNTZlZDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hdXRoLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYXV0aC5oCkBAIC0xMjUsMTAgKzEyNSwxMCBAQAogCWVudW0gYmZhX2F1dGhfc3RhdHVzIAlzdGF0dXM7CiAJZW51bSBiZmFfYXV0aF9hbGdvIAlhbGdvOwogCWVudW0gYmZhX2F1dGhfZ3JvdXAgCWRoX2dycDsKLQl1MTYJCXJqdF9jb2RlOwotCXUxNgkJcmp0X2NvZGVfZXhwOworCWVudW0gYmZhX2F1dGhfcmVqX2NvZGUgIHJqdF9jb2RlOworCWVudW0gYmZhX2F1dGhfcmVqX2NvZGVfZXhwIHJqdF9jb2RlX2V4cDsKIAl1OAkJCXNlY3JldF9zZXQ7Ci0JdTgJCQlyZXN2WzddOworCXU4CQkJcmVzdlszXTsKIH07CiAKICNlbmRpZiAvKiBfX0JGQV9ERUZTX0FVVEhfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19ib290LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19ib290LmgKaW5kZXggNmY0YWE1Mi4uMGZjYTEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYm9vdC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2Jvb3QuaApAQCAtMjQsNiArMjQsOCBAQAogCiBlbnVtIHsKIAlCRkFfQk9PVF9CT09UTFVOX01BWCA9IDQsCS8qICBtYXhpbXVtIGJvb3QgbHVuIHBlciBJT0MgKi8KKwlCRkFfUFJFQk9PVF9CT09UTFVOX01BWCA9IDgsICAgIC8qICBtYXhpbXVtIHByZWJvb3QgbHVuIHBlciBJT0MgKi8KKwogfTsKIAogI2RlZmluZSBCT09UX0NGR19SRVYxCTEKQEAgLTY3LDUgKzY5LDEzIEBACiAJc3RydWN0IGJmYV9ib290X2Jvb3RsdW5fcyBibHVuX2Rpc2NbQkZBX0JPT1RfQk9PVExVTl9NQVhdOwogfTsKIAorc3RydWN0IGJmYV9ib290X3BiY19zIHsKKwl1OCAgICAgICAgIGVuYWJsZTsgICAgICAgICAvKiBlbmFibGUvZGlzYWJsZSBTQU4gYm9vdCAqLworCXU4ICAgICAgICAgc3BlZWQ7ICAgICAgICAgIC8qIGJvb3Qgc3BlZWQgc2V0dGluZ3MgKi8KKwl1OCAgICAgICAgIHRvcG9sb2d5OyAgICAgICAvKiBib290IHRvcG9sb2d5IHNldHRpbmcgKi8KKwl1OCAgICAgICAgIHJzdmQxOworCXUzMiAgICAgICAgbmJsdW5zOyAgICAgICAgIC8qIG51bWJlciBvZiBib290IGx1bnMgKi8KKwlzdHJ1Y3QgYmZhX2Jvb3RfYm9vdGx1bl9zIHBibHVuW0JGQV9QUkVCT09UX0JPT1RMVU5fTUFYXTsKK307CiAKICNlbmRpZiAvKiBfX0JGQV9ERUZTX0JPT1RfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19kcml2ZXIuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2RyaXZlci5oCmluZGV4IDUwMzgyZGQuLjdkMDBkMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2RyaXZlci5oCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgdTE2ICAgIHRtX3RhcmdldF9yZXNldDsKICAgICB1MTYgICAgdG1fYnVzX3Jlc2V0OwogICAgIHUxNiAgICBpb2NfcmVzdGFydDsgICAgICAgIC8qICBJT0MgcmVzdGFydCBjb3VudCAqLwotICAgIHUxNiAgICBpb19wZW5kaW5nOyAgICAgICAgIC8qICBvdXRzdGFuZGluZyBpbyBjb3VudCBwZXItSU9DICovCisgICAgdTE2ICAgIHJzdmQ7CiAgICAgdTY0ICAgIGNvbnRyb2xfcmVxOwogICAgIHU2NCAgICBpbnB1dF9yZXE7CiAgICAgdTY0ICAgIG91dHB1dF9yZXE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19mY3BvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2ZjcG9ydC5oCmluZGV4IGEwN2VmNGEuLmFmODZhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2ZjcG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2ZjcG9ydC5oCkBAIC00OCw3ICs0OCw3IEBACiAJdTY0CWRpc2NfZmNmX3VuYXZhaWw7IC8qICBEaXNjb3ZlcnkgRkNGIG5vdCBhdmFpbAkgICAgICovCiAJdTY0CWxpbmtzdmNfdW5zdXBwOwkvKiAgRklQIGxpbmsgc2VydmljZSByZXEgdW5zdXBwLiAgICAqLwogCXU2NAlsaW5rc3ZjX2VycjsJLyogIEZJUCBsaW5rIHNlcnZpY2UgcmVxIGVycm9ycyAgICAgKi8KLQl1NjQJbG9nb19yZXE7CS8qICBGSVAgbG9nbwkJCSAgICAgKi8KKwl1NjQJbG9nb19yZXE7CS8qICBGSVAgbG9nb3MgcmVjZWl2ZWQJCQkgICAgICovCiAJdTY0CWNscnZsaW5rX3JlcTsJLyogIENsZWFyIHZpcnR1YWwgbGluayByZXF1ZXN0cyAgICAgKi8KIAl1NjQJb3BfdW5zdXBwOwkvKiAgRklQIG9wZXJhdGlvbiB1bnN1cHAuCSAgICAgKi8KIAl1NjQJdW50YWdnZWQ7CS8qICBGSVAgdW50YWdnZWQgZnJhbWVzCSAgICAgKi8KQEAgLTY0LDIxICs2NCwxNSBAQAogCXU2NAl0eGZfdGltZW91dDsJLyogIFR4IHRpbWVvdXRzCQkgICAgICovCiAJdTY0CXR4Zl9wYXJpdHlfZXJyb3JzOyAvKiAgVHJhbnNtaXQgcGFyaXR5IGVycgkgICAgICovCiAJdTY0CXR4Zl9maWRfcGFyaXR5X2Vycm9yczsgLyogIFRyYW5zbWl0IEZJRCBwYXJpdHkgZXJyICAqLwotCXU2NAl0eF9wYXVzZTsJLyogIFR4IHBhdXNlIGZyYW1lcwkJICAgICAqLwotCXU2NAl0eF96ZXJvX3BhdXNlOwkvKiAgVHggemVybyBwYXVzZSBmcmFtZXMJICAgICAqLwotCXU2NAl0eF9maXJzdF9wYXVzZTsJLyogIFR4IGZpcnN0IHBhdXNlIGZyYW1lcwkgICAgICovCi0JdTY0CXJ4X3BhdXNlOwkvKiAgUnggcGF1c2UgZnJhbWVzCQkgICAgICovCi0JdTY0CXJ4X3plcm9fcGF1c2U7CS8qICBSeCB6ZXJvIHBhdXNlIGZyYW1lcwkgICAgICovCi0JdTY0CXJ4X2ZpcnN0X3BhdXNlOwkvKiAgUnggZmlyc3QgcGF1c2UgZnJhbWVzCSAgICAgKi8KLQl1NjQJcnhmX3VjYXN0X29jdGV0czsgLyogIFJ4IHVuaWNhc3Qgb2N0ZXRzCSAgICAgKi8KLQl1NjQJcnhmX3VjYXN0OwkvKiAgUnggdW5pY2FzdCBmcmFtZXMJCSAgICAgKi8KLQl1NjQJcnhmX3VjYXN0X3ZsYW47CS8qICBSeCB1bmljYXN0IHZsYW4gZnJhbWVzCSAgICAgKi8KLQl1NjQJcnhmX21jYXN0X29jdGV0czsgLyogIFJ4IG11bHRpY2FzdCBvY3RldHMJICAgICAqLwotCXU2NAlyeGZfbWNhc3Q7CS8qICBSeCBtdWx0aWNhc3QgZnJhbWVzCSAgICAgKi8KLQl1NjQJcnhmX21jYXN0X3ZsYW47CS8qICBSeCBtdWx0aWNhc3QgdmxhbiBmcmFtZXMJICAgICAqLwotCXU2NAlyeGZfYmNhc3Rfb2N0ZXRzOyAvKiAgUnggYnJvYWRjYXN0IG9jdGVzdHMJICAgICAqLwotCXU2NAlyeGZfYmNhc3Q7CS8qICBSeCBicm9hZGNhc3QgZnJhbWVzCSAgICAgKi8KLQl1NjQJcnhmX2JjYXN0X3ZsYW47CS8qICBSeCBicm9hZGNhc3QgdmxhbiBmcmFtZXMJICAgICAqLworCXU2NCAgICAgcnhmX3VjYXN0X29jdGV0czsgLyogUnggRkNvRSB1bmljYXN0IG9jdGV0cyAgICAgICAgKi8KKwl1NjQgICAgIHJ4Zl91Y2FzdDsgICAgICAvKiBSeCBGQ29FIHVuaWNhc3QgZnJhbWVzICAgICAgICAgICovCisJdTY0ICAgICByeGZfdWNhc3RfdmxhbjsgLyogUnggRkNvRSB1bmljYXN0IHZsYW4gZnJhbWVzICAgICAqLworCXU2NCAgICAgcnhmX21jYXN0X29jdGV0czsgLyogUnggRkNvRSBtdWx0aWNhc3Qgb2N0ZXRzICAgICAgKi8KKwl1NjQgICAgIHJ4Zl9tY2FzdDsgICAgICAvKiBSeCBGQ29FIG11bHRpY2FzdCBmcmFtZXMgICAgICAgICovCisJdTY0ICAgICByeGZfbWNhc3RfdmxhbjsgLyogUnggRkNvRSBtdWx0aWNhc3QgdmxhbiBmcmFtZXMgICAqLworCXU2NCAgICAgcnhmX2JjYXN0X29jdGV0czsgLyogUnggRkNvRSBicm9hZGNhc3Qgb2N0ZXRzICAgICAgKi8KKwl1NjQgICAgIHJ4Zl9iY2FzdDsgICAgICAvKiBSeCBGQ29FIGJyb2FkY2FzdCBmcmFtZXMgICAgICAgICovCisJdTY0ICAgICByeGZfYmNhc3RfdmxhbjsgLyogUnggRkNvRSBicm9hZGNhc3QgdmxhbiBmcmFtZXMgICAqLwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pb2MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2lvYy5oCmluZGV4IDhkOGU2YTkuLmFkZDBhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2lvYy5oCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlzdHJ1Y3QgYmZhX2lvY19kcml2ZXJfYXR0cl9zIAlkcml2ZXJfYXR0cjsJLyogIGRyaXZlciBhdHRyICAgICovCiAJc3RydWN0IGJmYV9pb2NfcGNpX2F0dHJfcwlwY2lfYXR0cjsKIAl1OAkJCQlwb3J0X2lkOwkvKiAgcG9ydCBudW1iZXIgICAgKi8KLQl1OAkJCQlyc3ZkWzddOwkvKiE8IDY0Yml0IGFsaWduICAgICovCisJdTgJCQkJcnN2ZFs3XTsJLyogIDY0Yml0IGFsaWduICAgICovCiB9OwogCiAvKioKQEAgLTEzOCw2ICsxMzgsMTEgQEAKIAlCRkFfSU9DX0FFTl9FTkFCTEUJPSAzLAkvKiAgSU9DIGVuYWJsZWQgZXZlbnQJCSovCiAJQkZBX0lPQ19BRU5fRElTQUJMRQk9IDQsCS8qICBJT0MgZGlzYWJsZWQgZXZlbnQJCSovCiAJQkZBX0lPQ19BRU5fRldNSVNNQVRDSAk9IDUsCS8qICBJT0MgZmlybXdhcmUgbWlzbWF0Y2gJKi8KKwlCRkFfSU9DX0FFTl9GV0NGR19FUlJPUiA9IDYsICAgIC8qICBJT0MgZmlybXdhcmUgY29uZmlnIGVycm9yICAgKi8KKwlCRkFfSU9DX0FFTl9JTlZBTElEX1ZFTkRPUiA9IDcsCisJQkZBX0lPQ19BRU5fSU5WQUxJRF9OV1dOID0gOCwgICAvKiAgWmVybyBOV1dOICAgICAgICAgICAgICAgICAgICovCisJQkZBX0lPQ19BRU5fSU5WQUxJRF9QV1dOID0gOSAgICAvKiAgWmVybyBQV1dOICAgICAgICAgICAgICAgICAgICovCisKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW9jZmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2lvY2ZjLmgKaW5kZXggYzI5MGZiMS4uMzFlNzI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW9jZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pb2NmYy5oCkBAIC01MSw4ICs1MSwxMCBAQAogCXUxNiAgICAgICAgbnVtX3Rza3RtX3JlcXM7CS8qICBUTSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMqLwogCXUxNiAgICAgICAgbnVtX2ZjeHBfcmVxczsJLyogIHVuYXNzaXN0ZWQgRkMgZXhjaGFuZ2VzCSovCiAJdTE2ICAgICAgICBudW1fdWZfYnVmczsJLyogIHVuc29saWNpdGVkIHJlY3YgYnVmZmVycwkqLwotCXU4CQludW1fY3FzOwotCXU4CQlyc3ZkWzVdOworCXU4CSAgIG51bV9jcXM7CisJdTggICAgICAgICBmd190aWNrX3JlczsgICAgLyohPCBGVyBjbG9jayByZXNvbHV0aW9uIGluIG1zICovCisJdTggICAgICAgICByc3ZkWzRdOworCiB9OwogCiBzdHJ1Y3QgYmZhX2lvY2ZjX2RydmNmZ19zIHsKQEAgLTE3NiwxMCArMTc4LDEwIEBACiAgICAgdTMyICAgIG5vc19yeDsKICAgICB1MzIgICAgbGlwX3J4OwogICAgIHUzMiAgICBhcmJmMF9yeDsKKyAgICB1MzIgICAgYXJiX3J4OwogICAgIHUzMiAgICBtcmtfcng7CiAgICAgdTMyICAgIGNvbnN0X21ya19yeDsKICAgICB1MzIgICAgcHJpbV91bmtub3duOwotICAgIHUzMiAgICByc3ZkOwogfTsKIAogCkBAIC0yMDAsNiArMjAyLDggQEAKICAgICB1MzIgICAgbHJyX3R4OyAgICAgICAgICAgICAvKiAgTm8uIG9mIHRpbWVzIExSUiB0eCBzdGFydGVkICAgICAgICAgKi8KICAgICB1MzIgICAgb2xzX3R4OyAgICAgICAgICAgICAvKiAgTm8uIG9mIHRpbWVzIE9MUyB0eCBzdGFydGVkICAgICAgICAgKi8KICAgICB1MzIgICAgbm9zX3R4OyAgICAgICAgICAgICAvKiAgTm8uIG9mIHRpbWVzIE5PUyB0eCBzdGFydGVkICAgICAgICAgKi8KKyAgICB1MzIgICAgaHdzbV9scnJfcng7ICAgICAgICAvKiAgTm8uIG9mIHRpbWVzIExSUiByeC1lZCBieSBIV1NNICAgICAgKi8KKyAgICB1MzIgICAgaHdzbV9scl9yeDsgICAgICAgICAvKiBOby4gb2YgdGltZXMgTFIgcngtZWQgYnkgSFdTTSAgICAgICAgKi8KIH07CiAKIApAQCAtMjM5LDcgKzI0Myw3IEBACiAgICAgdTMyICAgIGRpc2NfZmNmX3VuYXZhaWw7ICAgLyogIERpc2NvdmVyeSBGQ0YgTm90IEF2YWlsLiAgICAgICAgICAgICovCiAgICAgdTMyICAgIGxpbmtzdmNfdW5zdXBwOyAgICAgLyogIFVuc3VwcG9ydGVkIGxpbmsgc2VydmljZSByZXEgICAgICAgICovCiAgICAgdTMyICAgIGxpbmtzdmNfZXJyOyAgICAgICAgLyogIFBhcnNlIGVycm9yIGluIGxpbmsgc2VydmljZSByZXEgICAgICovCi0gICAgdTMyICAgIGxvZ29fcmVxOyAgICAgICAgICAgLyogIE51bWJlciBvZiBGSVAgbG9nb3MgcmVjZWl2ZWQgICAgICAgICovCisgICAgdTMyICAgIGxvZ29fcmVxOyAgICAgICAgICAgLyogIEZJUCBsb2dvcyByZWNlaXZlZAkgICAgICAgICAgICAgICAqLwogICAgIHUzMiAgICBjbHJ2bGlua19yZXE7ICAgICAgIC8qICBDbGVhciB2aXJ0dWFsIGxpbmsgcmVxICAgICAgICAgICAgICAqLwogICAgIHUzMiAgICBvcF91bnN1cHA7ICAgICAgICAgIC8qICBVbnN1cHBvcnRlZCBGSVAgb3BlcmF0aW9uICAgICAgICAgICAqLwogICAgIHUzMiAgICB1bnRhZ2dlZDsgICAgICAgICAgIC8qICBVbnRhZ2dlZCBmcmFtZXMgKGlnbm9yZWQpICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaXRuaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2l0bmltLmgKaW5kZXggMmVjNzY5OS4uZDc3Nzg4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaXRuaW0uaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pdG5pbS5oCkBAIC0zNCw2ICszNCwxNSBAQAogCUJGQV9JVE5JTV9JTklUSUFUSU9SIAk9IDcsCS8qICBpbml0aWF0b3IgKi8KIH07CiAKK3N0cnVjdCBiZmFfaXRuaW1fbGF0ZW5jeV9zIHsKKwl1MzIJbWluOworCXUzMgltYXg7CisJdTMyCWNvdW50OworCXUzMgljbG9ja19yZXM7CisJdTMyCWF2ZzsKKwl1MzIJcnN2ZDsKK307CisKIHN0cnVjdCBiZmFfaXRuaW1faGFsX3N0YXRzX3MgewogCXUzMglvbmxpbmVzOwkvKiAgSVROIG5leHVzIG9ubGluZXMgKFBSTEkgZG9uZSkgKi8KIAl1MzIJb2ZmbGluZXM7CS8qICBJVE4gTmV4dXMgb2ZmbGluZXMgCSovCkBAIC05MSw2ICsxMDAsNyBAQAogCXU4CXRhc2tfcmV0cnlfaWQ7ICAvKiAgdGFzayByZXRyeSBpZGVudCBzdXBwb3J0ICAgKi8KIAl1OCByZWNfc3VwcG9ydDsgICAgLyogIFJFQyBzdXBwb3J0ZWQgICAgICAgICAgICAgICovCiAJdTggY29uZl9jb21wOyAgICAgIC8qICBjb25maXJtZWQgY29tcGxldGlvbiBzdXBwICAqLworCXN0cnVjdCBiZmFfaXRuaW1fbGF0ZW5jeV9zICBpb19sYXRlbmN5OyAvKiBJTyBsYXRlbmN5ICAqLwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19tZmcuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX21mZy5oCmluZGV4IGM1YmQ5YzMuLmQyMmZiNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX21mZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX21mZy5oCkBAIC00NSwyNiArNDUsNiBAQAogI2RlZmluZSBCRkFfTUZHX0NIS1NVTV9TSVpFCQkJMTYKIAogLyoqCi0gKiBNYW51ZmFjdHVyaW5nIGJsb2NrIGVuY3J5cHRlZCB2ZXJzaW9uCi0gKi8KLSNkZWZpbmUgQkZBX01GR19FTkNfVkVSCQkJCTIKLQotLyoqCi0gKiBNYW51ZmFjdHVyaW5nIGJsb2NrIHZlcnNpb24gMSBsZW5ndGgKLSAqLwotI2RlZmluZSBCRkFfTUZHX1ZFUjFfTEVOCQkJMTI4Ci0KLS8qKgotICogTWFudWZhY3R1cmluZyBibG9jayBoZWFkZXIgbGVuZ3RoCi0gKi8KLSNkZWZpbmUgQkZBX01GR19IRFJfTEVOCQkJCTQKLQotLyoqCi0gKiBDaGVja3N1bSBzaXplCi0gKi8KLSNkZWZpbmUgQkZBX01GR19DSEtTVU1fU0laRQkJCTE2Ci0KLS8qKgogICogTWFudWZhY3R1cmluZyBibG9jayBmb3JtYXQKICAqLwogI2RlZmluZSBCRkFfTUZHX1NFUklBTE5VTV9TSVpFCQkJMTEKQEAgLTg2LDYgKzY2LDkgQEAKIAlCRkFfTUZHX1RZUEVfRkM0UDEgICA9IDQxNSwgICAgICAvKiAgNEcgMXBvcnQgRkMgY2FyZAkJKi8KIAlCRkFfTUZHX1RZUEVfQ05BMTBQMiA9IDEwMjAsICAgICAvKiAgMTBHIDJwb3J0IENOQSBjYXJkCSovCiAJQkZBX01GR19UWVBFX0NOQTEwUDEgPSAxMDEwLCAgICAgLyogIDEwRyAxcG9ydCBDTkEgY2FyZAkqLworCUJGQV9NRkdfVFlQRV9KQVlIQVdLID0gODA0LCAgICAgIC8qICBKYXloYXdrIG1lenogY2FyZCAqLworCUJGQV9NRkdfVFlQRV9XQU5DSEVTRSA9IDEwMDcsICAgIC8qICBXYW5jaGVzZSBtZXp6IGNhcmQgKi8KKwlCRkFfTUZHX1RZUEVfSU5WQUxJRCA9IDAsICAgICAgICAvKiAgSW52YWxpZCBjYXJkIHR5cGUgKi8KIH07CiAKICNwcmFnbWEgcGFjaygxKQpAQCAtOTUsNiArNzgsMjQgQEAKICAqLwogI2RlZmluZSBiZmFfbWZnX3R5cGUycG9ydF9udW0oY2FyZF90eXBlKSAoKChjYXJkX3R5cGUpIC8gMTApICUgMTApCiAKKy8qKgorICogQ2hlY2sgaWYgTWV6eiBjYXJkCisgKi8KKyNkZWZpbmUgYmZhX21mZ19pc19tZXp6KHR5cGUpICgoIFwKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0pBWUhBV0sgfHwgXAorCSh0eXBlKSA9PSBCRkFfTUZHX1RZUEVfV0FOQ0hFU0UpKQorCisvKioKKyAqIENoZWNrIGlmIGNhcmQgdHlwZSB2YWxpZAorICovCisjZGVmaW5lIGJmYV9tZmdfaXNfY2FyZF90eXBlX3ZhbGlkKHR5cGUpICgoIFwKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0ZDOFAyIHx8IFwKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0ZDOFAxIHx8IFwKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0ZDNFAyIHx8IFwKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0ZDNFAxIHx8IFwKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0NOQTEwUDIgfHwgXAorCSh0eXBlKSA9PSBCRkFfTUZHX1RZUEVfQ05BMTBQMSB8fCBcCisJYmZhX21mZ19pc19tZXp6KHR5cGUpKSkKIAogLyoqCiAgKiBBbGwgbnVtZXJpY2FsIGZpZWxkcyBhcmUgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wY2kuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BjaS5oCmluZGV4IGM5YjgzMzIuLmVhN2Q4OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BjaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BjaS5oCkBAIC0yNiw4ICsyNiwxMyBAQAogCUJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMlAJPSAweDEzLAogCUJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMVAJPSAweDE3LAogCUJGQV9QQ0lfREVWSUNFX0lEX0NUCQk9IDB4MTQsCisJQkZBX1BDSV9ERVZJQ0VfSURfQ1RfRkMgICAgICAgICA9IDB4MjEsCiB9OwogCisjZGVmaW5lIGJmYV9hc2ljX2lkX2N0KGRldmlkKSAgICAgICAgICAgICAgICAgICBcCisJKChkZXZpZCkgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QgfHwgICAgIFwKKwkgKGRldmlkKSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVF9GQykKKwogLyoqCiAgKiBQQ0kgc3ViLXN5c3RlbSBkZXZpY2UgYW5kIHZlbmRvciBJRCBpbmZvcm1hdGlvbgogICovCkBAIC0zNSw3ICs0MCw5IEBACiAJQkZBX1BDSV9GQ09FX1NTREVWSUNFX0lECT0gMHgxNCwKIH07CiAKLSNkZWZpbmUgQkZBX1BDSV9BQ0NFU1NfUkFOR0VTIDEJLyogTWF4aW11bSBudW1iZXIgb2YgZGV2aWNlIGFkZHJlc3MgcmFuZ2VzCi0JCQkJICogbWFwcGVkIHRocm91Z2ggZGlmZmVyZW50IEJBUihzKS4gKi8KKy8qKgorICogTWF4aW11bSBudW1iZXIgb2YgZGV2aWNlIGFkZHJlc3MgcmFuZ2VzIG1hcHBlZCB0aHJvdWdoIGRpZmZlcmVudCBCQVIocykKKyAqLworI2RlZmluZSBCRkFfUENJX0FDQ0VTU19SQU5HRVMgMQogCiAjZW5kaWYgLyogX19CRkFfREVGU19QQ0lfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wb3J0LmgKaW5kZXggNTAxYmM5Ny4uZWJkZjBkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BvcnQuaApAQCAtNTAsMTIgKzUwLDEyIEBACiAgKiBGQ1MgcG9ydCBjb25maWd1cmF0aW9uLgogICovCiBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgewotICAgIHd3bl90ICAgICAgICAgICAgICAgcHd3bjsgICAgICAgLyogIHBvcnQgd3duICovCi0gICAgd3duX3QgICAgICAgICAgICAgICBud3duOyAgICAgICAvKiAgbm9kZSB3d24gKi8KLSAgICBzdHJ1Y3QgYmZhX3BvcnRfc3ltbmFtZV9zICBzeW1fbmFtZTsgICAvKiAgdm0gcG9ydCBzeW1ib2xpYyBuYW1lICovCi0gICAgZW51bSBiZmFfcG9ydF9yb2xlICAgICByb2xlczsgICAgICAvKiAgRkNTIHBvcnQgcm9sZXMgKi8KLQl1MzIJCQlyc3ZkOwotICAgIHU4ICAgICAgICAgICAgIHRhZ1sxNl07CS8qICBvcGFxdWUgdGFnIGZyb20gYXBwbGljYXRpb24gKi8KKwl3d25fdCAgICAgICAgICAgICAgIHB3d247ICAgICAgIC8qICBwb3J0IHd3biAqLworCXd3bl90ICAgICAgICAgICAgICAgbnd3bjsgICAgICAgLyogIG5vZGUgd3duICovCisJc3RydWN0IGJmYV9wb3J0X3N5bW5hbWVfcyAgc3ltX25hbWU7ICAgLyogIHZtIHBvcnQgc3ltYm9saWMgbmFtZSAqLworCWJmYV9ib29sZWFuX3QgICAgICAgcHJlYm9vdF92cDsgIC8qIHZwb3J0IGNyZWF0ZWQgZnJvbSBQQkMgKi8KKwllbnVtIGJmYV9wb3J0X3JvbGUgICAgIHJvbGVzOyAgICAgIC8qICBGQ1MgcG9ydCByb2xlcyAqLworCXU4ICAgICAgICAgICAgIHRhZ1sxNl07CS8qICBvcGFxdWUgdGFnIGZyb20gYXBwbGljYXRpb24gKi8KIH07CiAKIC8qKgpAQCAtMTU5LDcgKzE1OSw3IEBACiAJdTMyICAgICAgICBtc19wbG9naV9yc3BfZXJyOwogCXUzMiAgICAgICAgbXNfcGxvZ2lfYWNjX2VycjsKIAl1MzIgICAgICAgIG1zX3Bsb2dpX2FjY2VwdHM7Ci0JdTMyICAgICAgICBtc19yZWplY3RzOwkvKiBOUyBjb21tYW5kIHJlamVjdHMgKi8KKwl1MzIgICAgICAgIG1zX3JlamVjdHM7CS8qIE1TIGNvbW1hbmQgcmVqZWN0cyAqLwogCXUzMiAgICAgICAgbXNfcGxvZ2lfdW5rbm93bl9yc3A7CiAJdTMyICAgICAgICBtc19wbG9naV9hbGxvY193YWl0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wcG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcHBvcnQuaAppbmRleCAyNmU1Y2M3Li4yZGU2NzU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcHBvcnQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wcG9ydC5oCkBAIC0zOCw2ICszOCw3IEBACiAJQkZBX1BQT1JUX1NUX0lPQ0RPV04gCQk9IDEwLAogCUJGQV9QUE9SVF9TVF9JT0NESVMgCQk9IDExLAogCUJGQV9QUE9SVF9TVF9GV01JU01BVENICQk9IDEyLAorCUJGQV9QUE9SVF9TVF9QUkVCT09UX0RJU0FCTEVEICAgPSAxMywKIAlCRkFfUFBPUlRfU1RfTUFYX1NUQVRFLAogfTsKIApAQCAtMjAzLDYgKzIwNCw4IEBACiAJICovCiAJd3duX3QgICAgICAgICAgIG53d247CQkvKiAgbm9kZSB3d24gKi8KIAl3d25fdCAgICAgICAgICAgcHd3bjsJCS8qICBwb3J0IHd3biAqLworCXd3bl90ICAgICAgICAgICBmYWN0b3J5bnd3bjsgICAgLyogIGZhY3Rvcnkgbm9kZSB3d24gKi8KKwl3d25fdCAgICAgICAgICAgZmFjdG9yeXB3d247ICAgIC8qICBmYWN0b3J5IHBvcnQgd3duICovCiAJZW51bSBmY19jb3MgICAgIGNvc19zdXBwb3J0ZWQ7CS8qICBzdXBwb3J0ZWQgY2xhc3Mgb2Ygc2VydmljZXMgKi8KIAl1MzIgICAgICAgIHJzdmQ7CiAJc3RydWN0IGZjX3N5bW5hbWVfcyAgICBwb3J0X3N5bW5hbWU7CS8qICBwb3J0IHN5bWJvbGljIG5hbWUgKi8KQEAgLTI0Myw3ICsyNDYsNyBAQAogCXU2NCAgICBzZWNzX3Jlc2V0OyAvKiBTZWNvbmRzIHNpbmNlIHN0YXRzIGlzIHJlc2V0ICAgICAqLwogCXU2NCAgICB0eF9mcmFtZXM7ICAvKiBUeCBmcmFtZXMgICAgICAgICAgICAgICAgKi8KIAl1NjQgICAgdHhfd29yZHM7ICAgLyogVHggd29yZHMgICAgICAgICAgICAgICAgICovCi0JdTY0ICAgIHR4X2xpcDsgICAgIC8qIFRYIExJUCAgICAgICAgICAgICAgICovCisJdTY0ICAgIHR4X2xpcDsgICAgIC8qIFR4IExJUCAgICAgICAgICAgICAgICovCiAJdTY0ICAgIHR4X25vczsgICAgIC8qIFR4IE5PUyAgICAgICAgICAgICAgICovCiAJdTY0ICAgIHR4X29sczsgICAgIC8qIFR4IE9MUyAgICAgICAgICAgICAgICovCiAJdTY0ICAgIHR4X2xyOyAgICAgIC8qIFR4IExSICAgICAgICAgICAgICAgICovCkBAIC0zMDksNyArMzEyLDcgQEAKIAl1NjQgICAgcnhfemVyb19wYXVzZTsgICAgLyogUnggemVybyBwYXVzZSAgICAgICAgICAgICAgKi8KIAl1NjQgICAgdHhfcGF1c2U7ICAgICAvKiBUeCBwYXVzZSAgICAgICAgICAgICAgICovCiAJdTY0ICAgIHR4X3plcm9fcGF1c2U7ICAgIC8qIFR4IHplcm8gcGF1c2UgICAgICAgICAgICAgICovCi0JdTY0ICAgIHJ4X2Zjb2VfcGF1c2U7ICAgIC8qIFJ4IGZjb2UgcGF1c2UgICAgICAgICAgICAgICovCisJdTY0ICAgIHJ4X2Zjb2VfcGF1c2U7ICAgIC8qIFJ4IEZDb0UgcGF1c2UgICAgICAgICAgICAgICovCiAJdTY0ICAgIHJ4X2Zjb2VfemVyb19wYXVzZTsgLyogUnggRkNvRSB6ZXJvIHBhdXNlICAgICAgICovCiAJdTY0ICAgIHR4X2Zjb2VfcGF1c2U7ICAgIC8qIFR4IEZDb0UgcGF1c2UgICAgICAgICAgICAgICovCiAJdTY0ICAgIHR4X2Zjb2VfemVyb19wYXVzZTsgLyogVHggRkNvRSB6ZXJvIHBhdXNlICAgICAgICovCkBAIC0zODEsMjYgKzM4NCwxMCBAQAogCXU4ICAgICAgICAgdHJ1bmtlZDsJLyogIFRydW5rZWQgb3Igbm90ICgxIG9yIDApICovCiAJdTggICAgICAgICByZXN2ZFszXTsKIAlzdHJ1Y3QgYmZhX3Fvc19hdHRyX3MgIHFvc19hdHRyOyAgIC8qIFFvUyBBdHRyaWJ1dGVzICovCi0Jc3RydWN0IGJmYV9xb3NfdmNfYXR0cl9zIHFvc192Y19hdHRyOyAgLyogIFZDIGluZm8gZnJvbSBFTFAgKi8KIAl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQl1OCAgICAgICAgIHRtYXN0ZXI7LyogIFRydW5rIE1hc3RlciBvcgotCQkJCQkJICogICAgbm90ICgxIG9yIDApICovCi0JCQl1OCAgICAgICAgIHRsaW5rczsJLyogIFRydW5rIGxpbmtzIGJpdG1hcAotCQkJCQkJICogICAgKGxpbmt1cCkgKi8KLQkJCXU4ICAgICAgICAgcmVzdjE7CS8qICBSZXNlcnZlZCAqLwotCQl9IHRydW5rX2luZm87Ci0KLQkJc3RydWN0IHsKLQkJCXU4ICAgICAgICAgbXlhbHBhOwkgICAvKiAgYWxwYSBjbGFpbWVkICovCi0JCQl1OCAgICAgICAgIGxvZ2luX3JlcTsgLyogIExvZ2luIHJlcXVpcmVkIG9yCi0JCQkJCQkgICAgKiAgICBub3QgKDEgb3IgMCkgKi8KLQkJCXU4ICAgICAgICAgYWxwYWJtX3ZhbDsvKiAgYWxwYSBiaXRtYXAgdmFsaWQKLQkJCQkJCSAgICAqICAgIG9yIG5vdCAoMSBvciAwKSAqLwotCQkJc3RydWN0IGZjX2FscGFibV9zICAgICBhbHBhYm07CSAgIC8qICBhbHBhIGJpdG1hcCAqLwotCQl9IGxvb3BfaW5mbzsKLQl9IHRsOwotCXN0cnVjdCBiZmFfZmNwb3J0X2ZjZl9zIGZjZjsgICAgLyohPCBGQ0YgaW5mb3JtYXRpb24gKGZvciBGQ29FKSAqLworCQlzdHJ1Y3QgYmZhX3Fvc192Y19hdHRyX3MgcW9zX3ZjX2F0dHI7ICAvKiBWQyBpbmZvIGZyb20gRUxQICovCisJCXN0cnVjdCBiZmFfZmNwb3J0X2ZjZl9zIGZjZjsgICAgLyogRkNGIGluZm9ybWF0aW9uIChmb3IgRkNvRSkgKi8KKwl9IHZjX2ZjZjsKIH07CiAKICNlbmRpZiAvKiBfX0JGQV9ERUZTX1BQT1JUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfc3RhdHVzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19zdGF0dXMuaAppbmRleCBlYzc4YjRjLi42ZWI0ZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19zdGF0dXMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19zdGF0dXMuaApAQCAtODQsOCArODQsOSBAQAogCUJGQV9TVEFUVVNfQkFERlJNSERSIAk9IDQ4LAkvKiAgQmFkIGZyYW1lIGhlYWRlciAqLwogCUJGQV9TVEFUVVNfQkFERlJNU1ogCT0gNDksCS8qICBCYWQgZnJhbWUgc2l6ZSBjaGVjayBhbmQgcmVwbGFjZQogCQkJCQkgKiBTRlAvY2FibGUgKi8KLQlCRkFfU1RBVFVTX01JU1NJTkdGUk0gCT0gNTAsCS8qICBNaXNzaW5nIGZyYW1lIGNoZWNrIGFuZCByZXBsYWNlCi0JCQkJCSAqIFNGUC9jYWJsZSAqLworCUJGQV9TVEFUVVNfTUlTU0lOR0ZSTSAJPSA1MCwgICAvKiBNaXNzaW5nIGZyYW1lIGNoZWNrIGFuZCByZXBsYWNlCisJCQkJCSAqIFNGUC9jYWJsZSBvciBmb3IgTWV6eiBjYXJkIGNoZWNrIGFuZAorCQkJCQkgKiByZXBsYWNlIHBhc3MgdGhyb3VnaCBtb2R1bGUgKi8KIAlCRkFfU1RBVFVTX0xJTktUSU1FT1VUIAk9IDUxLAkvKiAgTGluayB0aW1lb3V0IGNoZWNrIGFuZCByZXBsYWNlCiAJCQkJCSAqIFNGUC9jYWJsZSAqLwogCUJGQV9TVEFUVVNfTk9fRkNQSU1fTkVYVVMgPSA1MiwJLyogIE5vIEZDUCBOZXh1cyBleGlzdHMgd2l0aCB0aGUKQEAgLTE3Myw3ICsxNzQsNyBAQAogCUJGQV9TVEFUVVNfTEVEVEVTVF9PUCA9IDEwOSwgLyogIExFRCB0ZXN0IGlzIG9wZXJhdGluZyAqLwogCUJGQV9TVEFUVVNfQ0VFX05PVF9ETiA9IDExMCwgLyogIGV0aCBwb3J0IGlzIG5vdCBhdCBkb3duIHN0YXRlLCBwbGVhc2UKIAkJCQkgICAgICAqIGJyaW5nIGRvd24gZmlyc3QgKi8KLQlCRkFfU1RBVFVTXzEwR19TUEQgPSAxMTEsIC8qICBTcGVlZCBzZXR0aW5nIG5vdCB2YWxpZCBmb3IgMTBHIEhCQSAqLworCUJGQV9TVEFUVVNfMTBHX1NQRCA9IDExMSwgLyogIFNwZWVkIHNldHRpbmcgbm90IHZhbGlkIGZvciAxMEcgQ05BICovCiAJQkZBX1NUQVRVU19JTV9JTlZfVEVBTV9OQU1FID0gMTEyLCAvKiAgSW52YWxpZCB0ZWFtIG5hbWUgKi8KIAlCRkFfU1RBVFVTX0lNX0RVUF9URUFNX05BTUUgPSAxMTMsIC8qICBHaXZlbiB0ZWFtIG5hbWUgYWxyZWFkeQogCQkJCQkgICAgKiBleGlzdHMgKi8KQEAgLTIxMywxMiArMjE0LDEzIEBACiAJCQkJCSAgICAgKiBsb2FkZWQgKi8KIAlCRkFfU1RBVFVTX0NBUkRfVFlQRV9NSVNNQVRDSCA9IDEzMSwgLyogIENhcmQgdHlwZSBtaXNtYXRjaCAqLwogCUJGQV9TVEFUVVNfQkFEX0FTSUNCTEsgPSAxMzIsIC8qICBCYWQgQVNJQyBibG9jayAqLwotCUJGQV9TVEFUVVNfTk9fRFJJVkVSID0gMTMzLCAvKiAgQnJvY2FkZSBhZGFwdGVyL2RyaXZlciBub3QgaW5zdGFsbGVkIG9yIGxvYWRlZCAqLwotCUJGQV9TVEFUVVNfSU5WQUxJRF9NQUMgPSAxMzQsIC8qICBJbnZhbGlkIG1hYyBhZGRyZXNzICovCisJQkZBX1NUQVRVU19OT19EUklWRVIgPSAxMzMsIC8qICBCcm9jYWRlIGFkYXB0ZXIvZHJpdmVyIG5vdCBpbnN0YWxsZWQKKwkJCQkgICAgICogIG9yIGxvYWRlZCAqLworCUJGQV9TVEFUVVNfSU5WQUxJRF9NQUMgPSAxMzQsIC8qICBJbnZhbGlkIE1BQyBhZGRyZXNzICovCiAJQkZBX1NUQVRVU19JTV9OT19WTEFOID0gMTM1LCAvKiAgTm8gVkxBTnMgY29uZmlndXJlZCBvbiB0aGUgYWRhcHRlciAqLwogCUJGQV9TVEFUVVNfSU1fRVRIX0xCX0ZBSUxFRCA9IDEzNiwgLyogIEV0aGVybmV0IGxvb3BiYWNrIHRlc3QgZmFpbGVkICovCi0JQkZBX1NUQVRVU19JTV9QVklEX1JFTU9WRSA9IDEzNywgLyogIENhbm5vdCByZW1vdmUgcG9ydCB2bGFuIChQVklEKSAqLwotCUJGQV9TVEFUVVNfSU1fUFZJRF9FRElUID0gMTM4LCAvKiAgQ2Fubm90IGVkaXQgcG9ydCB2bGFuIChQVklEKSAqLworCUJGQV9TVEFUVVNfSU1fUFZJRF9SRU1PVkUgPSAxMzcsIC8qIENhbm5vdCByZW1vdmUgcG9ydCBWTEFOIChQVklEKSAqLworCUJGQV9TVEFUVVNfSU1fUFZJRF9FRElUID0gMTM4LCAvKiBDYW5ub3QgZWRpdCBwb3J0IFZMQU4gKFBWSUQpICovCiAJQkZBX1NUQVRVU19DTkFfTk9fQk9PVCA9IDEzOSwgLyogIEJvb3QgdXBsb2FkIG5vdCBhbGxvd2VkIGZvciBDTkEgKi8KIAlCRkFfU1RBVFVTX0lNX1BWSURfTk9OX1pFUk8gPSAxNDAsIC8qICBQb3J0IFZMQU4gSUQgKFBWSUQpIGlzIFNldCB0bwogCQkJCQkgICAgKiBOb24tWmVybyBWYWx1ZSAqLwpAQCAtMjMyLDE0ICsyMzQsMTUgQEAKIAlCRkFfU1RBVFVTX0lOU1VGRklDSUVOVF9QRVJNUyA9IDE0NCwgLyogIFVzZXIgZG9lc24ndCBoYXZlIHN1ZmZpY2llbnQKIAkJCQkJICAgICAgKiBwZXJtaXNzaW9ucyB0byBleGVjdXRlIHRoZSBCQ1UKIAkJCQkJICAgICAgKiBhcHBsaWNhdGlvbiAqLwotCUJGQV9TVEFUVVNfSU1fSU5WX1ZMQU5fTkFNRSA9IDE0NSwgLyogIEludmFsaWQvUmVzZXJ2ZWQgVmxhbiBuYW1lCisJQkZBX1NUQVRVU19JTV9JTlZfVkxBTl9OQU1FID0gMTQ1LCAvKiBJbnZhbGlkL1Jlc2VydmVkIFZMQU4gbmFtZQogCQkJCQkgICAgKiBzdHJpbmcuIFRoZSBuYW1lIGlzIG5vdCBhbGxvd2VkCi0JCQkJCSAgICAqIGZvciB0aGUgbm9ybWFsIFZsYW5zICovCisJCQkJCSAgICAqIGZvciB0aGUgbm9ybWFsIFZMQU4gKi8KIAlCRkFfU1RBVFVTX0NNRF9OT1RTVVBQX0NOQSA9IDE0NiwgLyogIENvbW1hbmQgbm90IHN1cHBvcnRlZCBmb3IgQ05BICovCi0JQkZBX1NUQVRVU19JTV9QQVNTVEhSVV9FRElUID0gMTQ3LCAvKiAgQ2FuIG5vdCBlZGl0IHBhc3N0aHJ1IHZsYW4gaWQgKi8KLQlCRkFfU1RBVFVTX0lNX0JJTkRfRkFJTEVEID0gMTQ4LCAvKiEgPCBJTSBEcml2ZXIgYmluZCBvcGVyYXRpb24KKwlCRkFfU1RBVFVTX0lNX1BBU1NUSFJVX0VESVQgPSAxNDcsIC8qIENhbiBub3QgZWRpdCBwYXNzdGhyb3VnaCBWTEFOCisJCQkJCSAgICAqIGlkICovCisJQkZBX1NUQVRVU19JTV9CSU5EX0ZBSUxFRCA9IDE0OCwgLyogSU0gRHJpdmVyIGJpbmQgb3BlcmF0aW9uCiAJCQkJCSAgKiBmYWlsZWQgKi8KLQlCRkFfU1RBVFVTX0lNX1VOQklORF9GQUlMRUQgPSAxNDksIC8qICEgPCBJTSBEcml2ZXIgdW5iaW5kIG9wZXJhdGlvbgorCUJGQV9TVEFUVVNfSU1fVU5CSU5EX0ZBSUxFRCA9IDE0OSwgLyogSU0gRHJpdmVyIHVuYmluZCBvcGVyYXRpb24KIAkJCQkJICAgICogZmFpbGVkICovCiAJQkZBX1NUQVRVU19JTV9QT1JUX0lOX1RFQU0gPSAxNTAsIC8qICBQb3J0IGlzIGFscmVhZHkgcGFydCBvZiB0aGUKIAkJCQkJICAgKiB0ZWFtICovCkBAIC0yNDksNyArMjUyLDI0IEBACiAJQkZBX1NUQVRVU19JTV9URUFNX0NGR19OT1RfQUxMT1dFRCA9IDE1MywgLyogIEdpdmVuIHNldHRpbmdzIGFyZSBub3QKIAkJCQkJCSogYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQKIAkJCQkJCSogVGVhbWluZyBtb2RlICovCi0JQkZBX1NUQVRVU19NQVhfVkFMCQkvKiAgVW5rbm93biBlcnJvciBjb2RlICovCisJQkZBX1NUQVRVU19QQkMgPSAxNTQsIC8qIE9wZXJhdGlvbiBub3QgYWxsb3dlZCBmb3IgcHJlLWJvb3QKKwkJCSAgICAgICAqIGNvbmZpZ3VyYXRpb24gKi8KKwlCRkFfU1RBVFVTX0RFVklEX01JU1NJTkcgPSAxNTUsIC8qIEJvb3QgaW1hZ2UgaXMgbm90IGZvciB0aGUgYWRhcHRlcihzKQorCQkJCQkgKiBpbnN0YWxsZWQgKi8KKwlCRkFfU1RBVFVTX0JBRF9GV0NGRyA9IDE1NiwgLyogQmFkIGZpcm13YXJlIGNvbmZpZ3VyYXRpb24gKi8KKwlCRkFfU1RBVFVTX0NSRUFURV9GSUxFID0gMTU3LCAvKiBGYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlICovCisJQkZBX1NUQVRVU19JTlZBTElEX1ZFTkRPUiA9IDE1OCwgLyogSW52YWxpZCBzd2l0Y2ggdmVuZG9yICovCisJQkZBX1NUQVRVU19TRlBfTk9UX1JFQURZID0gMTU5LCAvKiBTRlAgaW5mbyBpcyBub3QgcmVhZHkuIFJldHJ5ICovCisJQkZBX1NUQVRVU19OT19UT1BPTE9HWV9GT1JfQ05BID0gMTYwLCAvKiBUb3BvbG9neSBjb21tYW5kIG5vdAorCQkJCQkgICAgICAgKiBhcHBsaWNhYmxlIHRvIENOQSAqLworCUJGQV9TVEFUVVNfQk9PVF9DT0RFX1VQREFURUQgPSAxNjEsIC8qIHJlYm9vdCAtLSAtciBpcyBuZWVkZWQgYWZ0ZXIKKwkJCQkJICAgICAqIGJvb3QgY29kZSB1cGRhdGVkICovCisJQkZBX1NUQVRVU19CT09UX1ZFUlNJT04gPSAxNjIsIC8qIEJvb3QgY29kZSB2ZXJzaW9uIG5vdCBjb21wYXRpYmxlIHdpdGgKKwkJCQkJKiB0aGUgZHJpdmVyIGluc3RhbGxlZCAqLworCUJGQV9TVEFUVVNfQ0FSRFRZUEVfTUlTU0lORyA9IDE2MywgLyogQm9vdCBpbWFnZSBpcyBub3QgZm9yIHRoZQorCQkJCQkgICAgKiBhZGFwdGVyKHMpIGluc3RhbGxlZCAqLworCUJGQV9TVEFUVVNfSU5WQUxJRF9DQVJEVFlQRSA9IDE2NCwgLyogSW52YWxpZCBjYXJkIHR5cGUgcHJvdmlkZWQgKi8KKwlCRkFfU1RBVFVTX01BWF9WQUwgICAgICAgICAgICAgIC8qIFVua25vd24gZXJyb3IgY29kZSAqLwogfTsKICNkZWZpbmUgYmZhX3N0YXR1c190IGVudW0gYmZhX3N0YXR1cwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNiL2JmYV9mY2JfdnBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl92cG9ydC5oCmluZGV4IGEzOWY0NzQuLmNmZDZiYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl92cG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl92cG9ydC5oCkBAIC00MCw3ICs0MCw4IEBACiAgKgogICogQHJldHVybiBOb25lCiAgKi8KLXZvaWQgICAgICAgICAgICBiZmFfZmNiX3Zwb3J0X2RlbGV0ZShzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cG9ydF9kcnYpOwordm9pZCBiZmFfZmNiX3Zwb3J0X2RlbGV0ZShzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cG9ydF9kcnYpOwordm9pZCBiZmFfZmNiX3BiY192cG9ydF9jcmVhdGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmaV9wYmNfdnBvcnRfcyk7CiAKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjcy5oCmluZGV4IGYyZmQzNWYuLjU0ZTViODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjcy5oCkBAIC02MSw4ICs2MSw4IEBACiAvKgogICogYmZhIGZjcyBBUEkgZnVuY3Rpb25zCiAgKi8KLXZvaWQgYmZhX2Zjc19hdHRhY2goc3RydWN0IGJmYV9mY3NfcyAqZmNzLCBzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYWRfcyAqYmZhZCwKLQkJCWJmYV9ib29sZWFuX3QgbWluX2NmZyk7Cit2b2lkIGJmYV9mY3NfYXR0YWNoKHN0cnVjdCBiZmFfZmNzX3MgKmZjcywgc3RydWN0IGJmYV9zICpiZmEsCisJCQlzdHJ1Y3QgYmZhZF9zICpiZmFkLCBiZmFfYm9vbGVhbl90IG1pbl9jZmcpOwogdm9pZCBiZmFfZmNzX2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKIHZvaWQgYmZhX2Zjc19kcml2ZXJfaW5mb19pbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcywKIAkJCXN0cnVjdCBiZmFfZmNzX2RyaXZlcl9pbmZvX3MgKmRyaXZlcl9pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19mY3BpbS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZjcGltLmgKaW5kZXggZTcxOWYyYy4uOWEzNWVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZjcGltLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZjcGltLmgKQEAgLTQxLDYgKzQxLDcgQEAKIAlzdHJ1Y3QgYmZhX2Zjc19zICAgICAgCSpmY3M7CQkvKiAgZmNzIGluc3RhbmNlICAgICAgICAgKi8KIAlzdHJ1Y3QgYmZhX3RpbWVyX3MgCXRpbWVyOwkJLyogIHRpbWVyIGZ1bmN0aW9ucyAgICAgICovCiAJc3RydWN0IGJmYV9pdG5pbV9zIAkqYmZhX2l0bmltOwkvKiAgQkZBIGl0bmltIHN0cnVjdCAgICAgKi8KKwl1MzIgICAgICAgICAgICAgICAgCXBybGlfcmV0cmllczsgICAvKiAgbWF4IHBybGkgcmV0cnkgYXR0ZW1wdHMgKi8KIAliZmFfYm9vbGVhbl90CSAJc2VxX3JlYzsJLyogIHNlcSByZWNvdmVyeSBzdXBwb3J0ICovCiAJYmZhX2Jvb2xlYW5fdAkgCXJlY19zdXBwb3J0OwkvKiAgUkVDIHN1cHBvcnRlZCAgICAgICAgKi8KIAliZmFfYm9vbGVhbl90CSAJY29uZl9jb21wOwkvKiAgRkNQX0NPTkYgICAgIHN1cHBvcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19ycG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX3Jwb3J0LmgKaW5kZXggNzAyYjk1Yi4uMzAyN2ZjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX3Jwb3J0LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX3Jwb3J0LmgKQEAgLTU4LDYgKzU4LDcgQEAKIAl1MTYgICAgICAgIHJlcGx5X294aWQ7CS8qICBPWF9JRCBvZiBpbmJvdW5kIHJlcXVlc3RzICovCiAJZW51bSBmY19jb3MgICAgICAgIGZjX2NvczsJLyogIEZDIGNsYXNzZXMgb2Ygc2VydmljZSBzdXBwICovCiAJYmZhX2Jvb2xlYW5fdCAgIGNpc2M7CS8qICBDSVNDIGNhcGFibGUgZGV2aWNlICovCisJYmZhX2Jvb2xlYW5fdCAgIHBybG87ICAgLyogIHByb2Nlc3NpbmcgcHJsbyBvciBMT0dPICovCiAJd3duX3QgICAgICAgICAgIHB3d247CS8qICBwb3J0IHd3biBvZiBycG9ydCAqLwogCXd3bl90ICAgICAgICAgICBud3duOwkvKiAgbm9kZSB3d24gb2YgcnBvcnQgKi8KIAlzdHJ1Y3QgYmZhX3Jwb3J0X3N5bW5hbWVfcyBwc3ltX25hbWU7IC8qICBwb3J0IHN5bWJvbGljIG5hbWUgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfdnBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc192cG9ydC5oCmluZGV4IGNkMzNmMmMuLjBhZjI2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc192cG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc192cG9ydC5oCkBAIC00OSw2ICs0OSwxMCBAQAogCQkJc3RydWN0IGJmYV9mY3NfcyAqZmNzLCB1MTYgdmZfaWQsCiAJCQlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnLAogCQkJc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnRfZHJ2KTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3BiY192cG9ydF9jcmVhdGUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQlzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHVpbnQxNl90IHZmX2lkLAorCQkJc3RydWN0IGJmYV9wb3J0X2NmZ19zICpwb3J0X2NmZywKKwkJCXN0cnVjdCBiZmFkX3Zwb3J0X3MgKnZwb3J0X2Rydik7CiBiZmFfc3RhdHVzX3QgYmZhX2Zjc192cG9ydF9kZWxldGUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwogYmZhX3N0YXR1c190IGJmYV9mY3NfdnBvcnRfc3RhcnQoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwogYmZhX3N0YXR1c190IGJmYV9mY3NfdnBvcnRfc3RvcChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvbG9nL2JmYV9sb2dfbGludXguaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19saW51eC5oCmluZGV4IGJkNDUxZGIuLjQ0YmM4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19saW51eC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19saW51eC5oCkBAIC01Myw4ICs1MywxMCBAQAogCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAxNikKICNkZWZpbmUgQkZBX0xPR19MSU5VWF9EUklWRVJfRVJST1IgXAogCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAxNykKLSNkZWZpbmUgQkZBX0xPR19MSU5VWF9EUklWRVJfRElBRyBcCisjZGVmaW5lIEJGQV9MT0dfTElOVVhfRFJJVkVSX0lORk8gXAogCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAxOCkKLSNkZWZpbmUgQkZBX0xPR19MSU5VWF9EUklWRVJfQUVOIFwKKyNkZWZpbmUgQkZBX0xPR19MSU5VWF9EUklWRVJfRElBRyBcCiAJKCgodTMyKSBCRkFfTE9HX0xJTlVYX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDE5KQorI2RlZmluZSBCRkFfTE9HX0xJTlVYX0RSSVZFUl9BRU4gXAorCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAyMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaAppbmRleCA4ZDEwMzgwLi40MzZkZDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaApAQCAtMTA4MCw2ICsxMDgwLDcgQEAKICNkZWZpbmUgRkNfUkVDX1RPVgkJKEZDX0VEX1RPViArIDEpCiAjZGVmaW5lIEZDX1JBX1RPVgkJMTAKICNkZWZpbmUgRkNfRUxTX1RPVgkJKDIgKiBGQ19SQV9UT1YpCisjZGVmaW5lIEZDX0ZDQ1RfVE9WCQkoMyAqIEZDX1JBX1RPVikKIAogLyoKICAqIHZpcnR1YWwgZmFicmljIHJlbGF0ZWQgZGVmaW5lcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9hcGkuYyBiL2RyaXZlcnMvc2NzaS9iZmEvbHBvcnRfYXBpLmMKaW5kZXggZDM5MDdkMS4uNzJiM2Y1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9hcGkuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2xwb3J0X2FwaS5jCkBAIC0xMzcsNiArMTM3LDggQEAKIC8qCiAgKiBJdGVyYXRlJ3MgdGhyb3VnaCBhbGwgdGhlIHJwb3J0J3MgaW4gdGhlIGdpdmVuIHBvcnQgdG8KICAqIGRldGVybWluZSB0aGUgbWF4aW11bSBvcGVyYXRpbmcgc3BlZWQuCisgKgorICogVG8gYmUgdXNlZCBpbiBUUkwgRnVuY3Rpb25hbGl0eSBvbmx5CiAgKi8KIGVudW0gYmZhX3Bwb3J0X3NwZWVkCiBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X21heF9zcGVlZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCkBAIC0xNDYsNyArMTQ4LDggQEAKIAlzdHJ1Y3QgYmZhX2Zjc19zICpmY3M7CiAJZW51bSBiZmFfcHBvcnRfc3BlZWQgbWF4X3NwZWVkID0gMDsKIAlzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyBwcG9ydF9hdHRyOwotCWVudW0gYmZhX3Bwb3J0X3NwZWVkIHBwb3J0X3NwZWVkOworCWVudW0gYmZhX3Bwb3J0X3NwZWVkIHBwb3J0X3NwZWVkLCBycG9ydF9zcGVlZDsKKwliZmFfYm9vbGVhbl90ICAgICB0cmxfZW5hYmxlZCA9IGJmYV9mY3BvcnRfaXNfcmF0ZWxpbShwb3J0LT5mY3MtPmJmYSk7CiAKIAlpZiAocG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKQEAgLTE2NCwxOSArMTY3LDI4IEBACiAJcWUgPSBiZmFfcV9maXJzdChxaCk7CiAKIAl3aGlsZSAocWUgIT0gcWgpIHsKLQkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOwotCQlpZiAoKGJmYV9vc19udG9oM2IocnBvcnQtPnBpZCkgPiAweEZGRjAwMCkKLQkJICAgIHx8IChiZmFfZmNzX3Jwb3J0X2dldF9zdGF0ZShycG9ydCkgPT0gQkZBX1JQT1JUX09GRkxJTkUpKSB7CisJCXJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKikgcWU7CisJCWlmICgoYmZhX29zX250b2gzYihycG9ydC0+cGlkKSA+IDB4RkZGMDAwKSB8fAorCQkJKGJmYV9mY3NfcnBvcnRfZ2V0X3N0YXRlKHJwb3J0KSA9PQorCQkJCQkJQkZBX1JQT1JUX09GRkxJTkUpKSB7CiAJCQlxZSA9IGJmYV9xX25leHQocWUpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoKHJwb3J0LT5ycGYucnBzY19zcGVlZCA9PSBCRkFfUFBPUlRfU1BFRURfOEdCUFMpCi0JCSAgICB8fCAocnBvcnQtPnJwZi5ycHNjX3NwZWVkID4gcHBvcnRfc3BlZWQpKSB7Ci0JCQltYXhfc3BlZWQgPSBycG9ydC0+cnBmLnJwc2Nfc3BlZWQ7CisJCXJwb3J0X3NwZWVkID0gcnBvcnQtPnJwZi5ycHNjX3NwZWVkOworCQlpZiAoKHRybF9lbmFibGVkKSAmJiAgKHJwb3J0X3NwZWVkID09CisJCQkJCQlCRkFfUFBPUlRfU1BFRURfVU5LTk9XTikpIHsKKwkJCS8qIFVzZSBkZWZhdWx0IHJhdGVsaW0gc3BlZWQgc2V0dGluZyAqLworCQkJcnBvcnRfc3BlZWQgPQorCQkJCWJmYV9mY3BvcnRfZ2V0X3JhdGVsaW1fc3BlZWQocG9ydC0+ZmNzLT5iZmEpOworCQl9CisKKwkJaWYgKChycG9ydF9zcGVlZCAgPT0gQkZBX1BQT1JUX1NQRUVEXzhHQlBTKSB8fAorCQkJKHJwb3J0X3NwZWVkID4gcHBvcnRfc3BlZWQpKSB7CisJCQltYXhfc3BlZWQgPSBycG9ydF9zcGVlZDsKIAkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJwb3J0LT5ycGYucnBzY19zcGVlZCA+IG1heF9zcGVlZCkgewotCQkJbWF4X3NwZWVkID0gcnBvcnQtPnJwZi5ycHNjX3NwZWVkOworCQl9IGVsc2UgaWYgKHJwb3J0X3NwZWVkID4gbWF4X3NwZWVkKSB7CisJCQltYXhfc3BlZWQgPSBycG9ydF9zcGVlZDsKIAkJfQogCiAJCXFlID0gYmZhX3FfbmV4dChxZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL21zLmMgYi9kcml2ZXJzL3Njc2kvYmZhL21zLmMKaW5kZXggNWU4YzhkZS4uMWQ1NzllZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9tcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvbXMuYwpAQCAtMTU3LDYgKzE1Nyw3IEBACiAJCSAqIFN0YXJ0IHRpbWVyIGZvciBhIGRlbGF5ZWQgcmV0cnkKIAkJICovCiAJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9wbG9naV9yZXRyeSk7CisJCW1zLT5wb3J0LT5zdGF0cy5tc19yZXRyaWVzKys7CiAJCWJmYV90aW1lcl9zdGFydChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG1zLT5wb3J0KSwgJm1zLT50aW1lciwKIAkJCQliZmFfZmNzX3BvcnRfbXNfdGltZW91dCwgbXMsCiAJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKQEAgLTI3OSw2ICsyODAsNyBAQAogCQkgKi8KIAkJaWYgKG1zLT5yZXRyeV9jbnQrKyA8IEJGQV9GQ1NfTVNfQ01EX01BWF9SRVRSSUVTKSB7CiAJCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fZ21hbF9yZXRyeSk7CisJCQltcy0+cG9ydC0+c3RhdHMubXNfcmV0cmllcysrOwogCQkJYmZhX3RpbWVyX3N0YXJ0KEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQobXMtPnBvcnQpLAogCQkJCQkmbXMtPnRpbWVyLCBiZmFfZmNzX3BvcnRfbXNfdGltZW91dCwgbXMsCiAJCQkJCUJGQV9GQ1NfUkVUUllfVElNRU9VVCk7CkBAIC0zNTksNyArMzYxLDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9tc19nbWFsX3Jlc3BvbnNlLAotCQkgICAgICAodm9pZCAqKW1zLCBGQ19NQVhfUERVU1osIEZDX1JBX1RPVik7CisJCSAgICAgICh2b2lkICopbXMsIEZDX01BWF9QRFVTWiwgRkNfRkNDVF9UT1YpOwogCiAJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfRkNYUF9TRU5UKTsKIH0KQEAgLTQ3OSw2ICs0ODEsNyBAQAogCQkgKi8KIAkJaWYgKG1zLT5yZXRyeV9jbnQrKyA8IEJGQV9GQ1NfTVNfQ01EX01BWF9SRVRSSUVTKSB7CiAJCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fZ2ZuX3JldHJ5KTsKKwkJCW1zLT5wb3J0LT5zdGF0cy5tc19yZXRyaWVzKys7CiAJCQliZmFfdGltZXJfc3RhcnQoQkZBX0ZDU19HRVRfSEFMX0ZST01fUE9SVChtcy0+cG9ydCksCiAJCQkJCSZtcy0+dGltZXIsIGJmYV9mY3NfcG9ydF9tc190aW1lb3V0LCBtcywKIAkJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKQEAgLTU1Nyw3ICs1NjAsNyBAQAogCiAJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKIAkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19wb3J0X21zX2dmbl9yZXNwb25zZSwKLQkJICAgICAgKHZvaWQgKiltcywgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCQkgICAgICAodm9pZCAqKW1zLCBGQ19NQVhfUERVU1osIEZDX0ZDQ1RfVE9WKTsKIAogCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX0ZDWFBfU0VOVCk7CiB9CkBAIC02MzcsNyArNjQwLDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9tc19wbG9naV9yZXNwb25zZSwKLQkJICAgICAgKHZvaWQgKiltcywgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCQkgICAgICAodm9pZCAqKW1zLCBGQ19NQVhfUERVU1osIEZDX0VMU19UT1YpOwogCiAJcG9ydC0+c3RhdHMubXNfcGxvZ2lfc2VudCsrOwogCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX0ZDWFBfU0VOVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL25zLmMgYi9kcml2ZXJzL3Njc2kvYmZhL25zLmMKaW5kZXggZDIwZGQ3ZS4uYWUwZWRjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9ucy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvbnMuYwpAQCAtNjY0LDcgKzY2NCw3IEBACiAKIAliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAogCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBiZmFfZmNzX3BvcnRfbnNfcGxvZ2lfcmVzcG9uc2UsCi0JCSAgICAgICh2b2lkICopbnMsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilucywgRkNfTUFYX1BEVVNaLCBGQ19FTFNfVE9WKTsKIAlwb3J0LT5zdGF0cy5uc19wbG9naV9zZW50Kys7CiAKIAliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9QTE9HSV9TRU5UKTsKQEAgLTc5MSw3ICs3OTEsNyBAQAogCiAJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKIAkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19wb3J0X25zX3JzcG5faWRfcmVzcG9uc2UsCi0JCSAgICAgICh2b2lkICopbnMsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilucywgRkNfTUFYX1BEVVNaLCBGQ19GQ0NUX1RPVik7CiAKIAlwb3J0LT5zdGF0cy5uc19yc3BuaWRfc2VudCsrOwogCkBAIC04NjUsNyArODY1LDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9uc19yZnRfaWRfcmVzcG9uc2UsCi0JCSAgICAgICh2b2lkICopbnMsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilucywgRkNfTUFYX1BEVVNaLCBGQ19GQ0NUX1RPVik7CiAKIAlwb3J0LT5zdGF0cy5uc19yZnRpZF9zZW50Kys7CiAJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUkZUSURfU0VOVCk7CkBAIC05NDMsNyArOTQzLDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9uc19yZmZfaWRfcmVzcG9uc2UsCi0JCSAgICAgICh2b2lkICopbnMsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilucywgRkNfTUFYX1BEVVNaLCBGQ19GQ0NUX1RPVik7CiAKIAlwb3J0LT5zdGF0cy5uc19yZmZpZF9zZW50Kys7CiAJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUkZGSURfU0VOVCk7CkBAIC0xMDI5LDcgKzEwMjksNyBAQAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9uc19naWRfZnRfcmVzcG9uc2UsCiAJCSAgICAgICh2b2lkICopbnMsIGJmYV9mY3hwX2dldF9tYXhyc3AocG9ydC0+ZmNzLT5iZmEpLAotCQkgICAgICBGQ19SQV9UT1YpOworCQkgICAgICBGQ19GQ0NUX1RPVik7CiAKIAlwb3J0LT5zdGF0cy5uc19naWRmdF9zZW50Kys7CiAKQEAgLTEyMjgsMTAgKzEyMjgsMTAgQEAKIAogCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OwogCXU4ICAgICAgICAgbnd3bnM7Ci0Jd3duX3QgICAgICAgICAgKnd3bnM7CisJd3duX3QgIHd3bnNbQkZBX1BSRUJPT1RfQk9PVExVTl9NQVhdOwogCWludCAgICAgICAgICAgICBpaTsKIAotCWJmYV9pb2NmY19nZXRfYm9vdHd3bnMocG9ydC0+ZmNzLT5iZmEsICZud3ducywgJnd3bnMpOworCWJmYV9pb2NmY19nZXRfYm9vdHd3bnMocG9ydC0+ZmNzLT5iZmEsICZud3ducywgd3ducyk7CiAKIAlmb3IgKGlpID0gMDsgaWkgPCBud3duczsgKytpaSkgewogCQlycG9ydCA9IGJmYV9mY3NfcnBvcnRfY3JlYXRlX2J5X3d3bihwb3J0LCB3d25zW2lpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0LmMKaW5kZXggN2IwOTZmMi4uOWI0YzJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9ycG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvcnBvcnQuYwpAQCAtMzYsOCArMzYsNiBAQAogCiBCRkFfVFJDX0ZJTEUoRkNTLCBSUE9SVCk7CiAKLSNkZWZpbmUgQkZBX0ZDU19SUE9SVF9NQVhfUkVUUklFUwkJKDUpCi0KIC8qIEluIG1pbGxpc2VjcyAqLwogc3RhdGljIHUzMiBiZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0ID0KIAkJCUJGQV9GQ1NfUlBPUlRfREVGX0RFTF9USU1FT1VUICogMTAwMDsKQEAgLTk1LDYgKzkzLDcgQEAKIAkJCXU4IHJlYXNvbl9jb2RlX2V4cGwpOwogc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfcHJvY2Vzc19hZGlzYyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKIAkJCXN0cnVjdCBmY2hzX3MgKnJ4X2ZjaHMsIHUxNiBsZW4pOworc3RhdGljIHZvaWQJYmZhX2Zjc19ycG9ydF9zZW5kX3BybG9fYWNjKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKIC8qKgogICogIGZjc19ycG9ydF9zbSBGQ1MgcnBvcnQgc3RhdGUgbWFjaGluZSBldmVudHMKICAqLwpAQCAtMTE1LDcgKzExNCw4IEBACiAJUlBTTV9FVkVOVF9IQ0JfT0ZGTElORSA9IDEzLAkvKiAgQkZBIHJwb3J0IG9mZmxpbmUgY2FsbGJhY2sgKi8KIAlSUFNNX0VWRU5UX0ZDNF9PRkZMSU5FID0gMTQsCS8qICBGQy00IG9mZmxpbmUgY29tcGxldGUgKi8KIAlSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFID0gMTUsCS8qICBScG9ydCdzIFBJRCBoYXMgY2hhbmdlZCAqLwotCVJQU01fRVZFTlRfQUREUkVTU19ESVNDID0gMTYJLyogIE5lZWQgdG8gRGlzY292ZXIgcnBvcnQncyBQSUQgKi8KKwlSUFNNX0VWRU5UX0FERFJFU1NfRElTQyA9IDE2LAkvKiAgTmVlZCB0byBEaXNjb3ZlciBycG9ydCdzIFBJRCAqLworCVJQU01fRVZFTlRfUFJMT19SQ1ZEID0gMTcsICAgICAgLyogIFBSTE8gZnJvbSByZW1vdGUgZGV2aWNlICAgICAgKi8KIH07CiAKIHN0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKQEAgLTM1Niw4ICszNTYsOCBAQAogCQkgKi8KIAogCWNhc2UgUlBTTV9FVkVOVF9USU1FT1VUOgotCQlycG9ydC0+cGxvZ2lfcmV0cmllcysrOwogCQlpZiAocnBvcnQtPnBsb2dpX3JldHJpZXMgPCBCRkFfRkNTX1JQT1JUX01BWF9SRVRSSUVTKSB7CisJCQlycG9ydC0+cGxvZ2lfcmV0cmllcysrOwogCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naV9zZW5kaW5nKTsKIAkJCWJmYV9mY3NfcnBvcnRfc2VuZF9wbG9naShycG9ydCwgTlVMTCk7CiAJCX0gZWxzZSB7CkBAIC0zNzUsNiArMzc1LDcgQEAKIAkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKIAkJYnJlYWs7CiAKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CiAJCWJyZWFrOwogCkBAIC00MzAsNiArNDMxLDEzIEBACiAKIAljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgogCQliZmFfZmNzX3Jwb3J0X3NlbmRfbG9nb19hY2MocnBvcnQpOworCQkvKgorCQkgKiAhISBmYWxsIHRocm91Z2ggISEKKwkJICovCisJY2FzZSBSUFNNX0VWRU5UX1BSTE9fUkNWRDoKKwkJaWYgKHJwb3J0LT5wcmxvID09IEJGQV9UUlVFKQorCQkJYmZhX2Zjc19ycG9ydF9zZW5kX3BybG9fYWNjKHJwb3J0KTsKKwogCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKIAkJLyoKIAkJICogISEgZmFsbCB0aHJvdWdoICEhCkBAIC01MDQsNiArNTEyLDkgQEAKIAkJYmZhX2Zjc19ycG9ydF9vbmxpbmVfYWN0aW9uKHJwb3J0KTsKIAkJYnJlYWs7CiAKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgorCQlicmVhazsKKwogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CiAJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGNiX2xvZ29yY3YpOwogCQliZmFfcnBvcnRfb2ZmbGluZShycG9ydC0+YmZhX3Jwb3J0KTsKQEAgLTU4Miw2ICs1OTMsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJY2FzZSBSUFNNX0VWRU5UX1BSTE9fUkNWRDoKIAkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3Jjdik7CiAJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOwogCQlicmVhazsKQEAgLTYyNCw2ICs2MzYsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJY2FzZSBSUFNNX0VWRU5UX1BSTE9fUkNWRDoKIAkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3Jjdik7CiAJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlKTsKIAkJYmZhX2Zjc19ycG9ydF9vZmZsaW5lX2FjdGlvbihycG9ydCk7CkBAIC02OTAsNiArNzAzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9QUkxPX1JDVkQ6CiAJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3YpOwogCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKIAkJYmZhX2Zjc19ycG9ydF9vZmZsaW5lX2FjdGlvbihycG9ydCk7CkBAIC03NDAsNiArNzU0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9QUkxPX1JDVkQ6CiAJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3YpOwogCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CiAJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOwpAQCAtODExLDYgKzgyNiw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvcmN2KTsKIAkJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CiAJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOwpAQCAtODQzLDYgKzg1OSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKIAkJYnJlYWs7CiAKQEAgLTg5NCw2ICs5MTEsNyBAQAogCWNhc2UgUlBTTV9FVkVOVF9TQ046CiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fSU1QOgogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJY2FzZSBSUFNNX0VWRU5UX1BSTE9fUkNWRDoKIAljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CiAJCS8qKgogCQkgKiBycG9ydCBpcyBhbHJlYWR5IGdvaW5nIG9mZmxpbmUuCkBAIC05NTMsNiArOTcxLDcgQEAKIAogCWNhc2UgUlBTTV9FVkVOVF9TQ046CiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCQkvKioKIAkJICogSWdub3JlLCBhbHJlYWR5IG9mZmxpbmUuCiAJCSAqLwpAQCAtOTc4LDggKzk5NywxMSBAQAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFJQU01fRVZFTlRfSENCX09GRkxJTkU6CiAJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgotCQlpZiAocnBvcnQtPnBpZCkKKwkJaWYgKHJwb3J0LT5waWQgJiYgKHJwb3J0LT5wcmxvID09IEJGQV9UUlVFKSkKKwkJCWJmYV9mY3NfcnBvcnRfc2VuZF9wcmxvX2FjYyhycG9ydCk7CisJCWlmIChycG9ydC0+cGlkICYmIChycG9ydC0+cHJsbyA9PSBCRkFfRkFMU0UpKQogCQkJYmZhX2Zjc19ycG9ydF9zZW5kX2xvZ29fYWNjKHJwb3J0KTsKKwogCQkvKgogCQkgKiBJZiB0aGUgbHBvcnQgaXMgb25saW5lIGFuZCBpZiB0aGUgcnBvcnQgaXMgbm90IGEgd2VsbCBrbm93bgogCQkgKiBhZGRyZXNzIHBvcnQsIHdlIHRyeSB0byByZS1kaXNjb3ZlciB0aGUgci1wb3J0LgpAQCAtMTAxMyw2ICsxMDM1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9QUkxPX1JDVkQ6CiAJCS8qKgogCQkgKiBJZ25vcmUgLSBhbHJlYWR5IHByb2Nlc3NpbmcgYSBMT0dPLgogCQkgKi8KQEAgLTEwNDIsNiArMTA2NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKIAkJYnJlYWs7CiAKQEAgLTEwNzUsNiArMTA5OSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3VuaW5pdCk7CiAJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlKTsKIAkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKQEAgLTExMjMsNiArMTE0OCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX0lNUDoKIAkJYnJlYWs7CiAKQEAgLTExNzQsNiArMTIwMCw3IEBACiAKIAljYXNlIFJQU01fRVZFTlRfU0NOOgogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJY2FzZSBSUFNNX0VWRU5UX1BSTE9fUkNWRDoKIAljYXNlIFJQU01fRVZFTlRfUExPR0lfU0VORDoKIAkJYnJlYWs7CiAKQEAgLTEyNTAsNiArMTI3NywxMCBAQAogCQliZmFfZmNzX3Jwb3J0X3NlbmRfbG9nb19hY2MocnBvcnQpOwogCQlicmVhazsKIAorCWNhc2UgUlBTTV9FVkVOVF9QUkxPX1JDVkQ6CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9wcmxvX2FjYyhycG9ydCk7CisJCWJyZWFrOworCiAJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX0NPTVA6CiAJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGFsX29ubGluZSk7CiAJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOwpAQCAtMTMyMiw2ICsxMzUzLDEwIEBACiAJCQkJYmZhX2Zjc19ycG9ydF9kZWxfdGltZW91dCk7CiAJCWJyZWFrOwogCisJY2FzZSBSUFNNX0VWRU5UX1BSTE9fUkNWRDoKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX3BybG9fYWNjKHJwb3J0KTsKKwkJYnJlYWs7CisKIAljYXNlIFJQU01fRVZFTlRfU0NOOgogCQkvKioKIAkJICogaWdub3JlLCB3YWl0IGZvciBOUyBxdWVyeSByZXNwb25zZQpAQCAtMTM3OCw3ICsxNDEzLDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcnBvcnRfcGxvZ2lfcmVzcG9uc2UsCi0JCSAgICAgICh2b2lkICopcnBvcnQsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilycG9ydCwgRkNfTUFYX1BEVVNaLCBGQ19FTFNfVE9WKTsKIAogCXJwb3J0LT5zdGF0cy5wbG9naXMrKzsKIAliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQ1hQX1NFTlQpOwpAQCAtMTUxOSw3ICsxNTU0LDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcnBvcnRfYWRpc2NfcmVzcG9uc2UsCi0JCSAgICAgIHJwb3J0LCBGQ19NQVhfUERVU1osIEZDX1JBX1RPVik7CisJCSAgICAgIHJwb3J0LCBGQ19NQVhfUERVU1osIEZDX0VMU19UT1YpOwogCiAJcnBvcnQtPnN0YXRzLmFkaXNjX3NlbnQrKzsKIAliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQ1hQX1NFTlQpOwpAQCAtMTU4MCw3ICsxNjE1LDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcnBvcnRfZ2lkcG5fcmVzcG9uc2UsCi0JCSAgICAgICh2b2lkICopcnBvcnQsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilycG9ydCwgRkNfTUFYX1BEVVNaLCBGQ19GQ0NUX1RPVik7CiAKIAliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQ1hQX1NFTlQpOwogfQpAQCAtMTY5Miw3ICsxNzI3LDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIE5VTEwsIHJwb3J0LCBGQ19NQVhfUERVU1osCi0JCSAgICAgIEZDX0VEX1RPVik7CisJCSAgICAgIEZDX0VMU19UT1YpOwogCiAJcnBvcnQtPnN0YXRzLmxvZ29zKys7CiAJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CkBAIC0yMTg0LDYgKzIyMTksNyBAQAogCXJwb3J0LT5yZXBseV9veGlkID0gZmNocy0+b3hfaWQ7CiAJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cmVwbHlfb3hpZCk7CiAKKwlycG9ydC0+cHJsbyA9IEJGQV9GQUxTRTsKIAlycG9ydC0+c3RhdHMubG9nb19yY3ZkKys7CiAJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfTE9HT19SQ1ZEKTsKIH0KQEAgLTI1NTMsNiArMjU4OSwzMCBAQAogCX0KIH0KIAorLyogU2VuZCBiZXN0IGNhc2UgYWNjIHRvIHBybG8gKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NlbmRfcHJsb19hY2Moc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyBmY2hzOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCWludCBsZW47CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCisJZmN4cCA9IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkKKwkJcmV0dXJuOworCisJbGVuID0gZmNfcHJsb19hY2NfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksCisJCQlycG9ydC0+cGlkLCBiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksCisJCQlycG9ydC0+cmVwbHlfb3hpZCwgMCk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIHJwb3J0LT5iZmFfcnBvcnQsIHBvcnQtPmZhYnJpYy0+dmZfaWQsCisJCQlwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywKKwkJCU5VTEwsIE5VTEwsIEZDX01BWF9QRFVTWiwgMCk7Cit9CisKIC8qCiAgKiBTZW5kIGEgTFMgcmVqZWN0CiAgKi8KQEAgLTI2MDQsMyArMjY2NCwxMyBAQAogCWlmIChycG9ydF90bW8gPiAwKQogCQliZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0ID0gcnBvcnRfdG1vICogMTAwMDsKIH0KKwordm9pZAorYmZhX2Zjc19ycG9ydF9wcmxvKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LCB1aW50MTZfdCBveF9pZCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCisJcnBvcnQtPnBybG8gPSBCRkFfVFJVRTsKKwlycG9ydC0+cmVwbHlfb3hpZCA9IG94X2lkOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX1BSTE9fUkNWRCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0X2FwaS5jIGIvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9hcGkuYwppbmRleCBhNDQxZjQxLi4xNWUwYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0X2FwaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvcnBvcnRfYXBpLmMKQEAgLTgzLDYgKzgzLDcgQEAKIHsKIAlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgcW9zX2F0dHI7CiAJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJZW51bSBiZmFfcHBvcnRfc3BlZWQgcnBvcnRfc3BlZWQgPSBycG9ydC0+cnBmLnJwc2Nfc3BlZWQ7CiAKIAliZmFfb3NfbWVtc2V0KHJwb3J0X2F0dHIsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Jwb3J0X2F0dHJfcykpOwogCkBAIC0xMDIsMTAgKzEwMywxNCBAQAogCXJwb3J0X2F0dHItPnFvc19hdHRyID0gcW9zX2F0dHI7CiAKIAlycG9ydF9hdHRyLT50cmxfZW5mb3JjZWQgPSBCRkFfRkFMU0U7CisKIAlpZiAoYmZhX2ZjcG9ydF9pc19yYXRlbGltKHBvcnQtPmZjcy0+YmZhKSkgewotCQlpZiAoKHJwb3J0LT5ycGYucnBzY19zcGVlZCA9PSBCRkFfUFBPUlRfU1BFRURfVU5LTk9XTikgfHwKLQkJCShycG9ydC0+cnBmLnJwc2Nfc3BlZWQgPAotCQkJYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9tYXhfc3BlZWQocG9ydCkpKQorCQlpZiAocnBvcnRfc3BlZWQgPT0gQkZBX1BQT1JUX1NQRUVEX1VOS05PV04pIHsKKwkJCS8qIFVzZSBkZWZhdWx0IHJhdGVsaW0gc3BlZWQgc2V0dGluZyAqLworCQkJcnBvcnRfc3BlZWQgPQorCQkJCWJmYV9mY3BvcnRfZ2V0X3JhdGVsaW1fc3BlZWQocnBvcnQtPmZjcy0+YmZhKTsKKwkJfQorCQlpZiAocnBvcnRfc3BlZWQgPCBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X21heF9zcGVlZChwb3J0KSkKIAkJCXJwb3J0X2F0dHItPnRybF9lbmZvcmNlZCA9IEJGQV9UUlVFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9mdHJzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0X2Z0cnMuYwppbmRleCBhZTdiYmE2Li5mMmE5MzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0X2Z0cnMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0X2Z0cnMuYwpAQCAtNzMsNiArNzMsNyBAQAogYmZhX2Zjc19ycGZfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsIGVudW0gcnBmX2V2ZW50IGV2ZW50KQogewogCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBmLT5ycG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljID0gJnJwb3J0LT5mY3MtPmZhYnJpYzsKIAogCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOwogCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CkBAIC04MCwxMiArODEsMTYgQEAKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09OTElORToKLQkJaWYgKCFCRkFfRkNTX1BJRF9JU19XS0EocnBvcnQtPnBpZCkpIHsKKwkJLyogU2VuZCBSUFNDMiB0byBhIEJyb2NhZGUgZmFicmljIG9ubHkuICovCisJCWlmICgoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkgJiYKKwkJCSgoYmZhX2xwc19pc19icmNkX2ZhYnJpYyhycG9ydC0+cG9ydC0+ZmFicmljLT5scHMpKSB8fAorCQkJKGJmYV9mY3NfZmFicmljX2dldF9zd2l0Y2hfb3VpKGZhYnJpYykgPT0KKwkJCQkJCUJGQV9GQ1NfQlJDRF9TV0lUQ0hfT1VJKSkpIHsKIAkJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9ycHNjX3NlbmRpbmcpOwogCQkJcnBmLT5ycHNjX3JldHJpZXMgPSAwOwogCQkJYmZhX2Zjc19ycGZfc2VuZF9ycHNjMihycGYsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX07CisJCX0KKwkJYnJlYWs7CiAKIAljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkU6CiAJCWJyZWFrOwpAQCAtMjY5LDYgKzI3NCw3IEBACiAJaWYgKF9fZmNzX21pbl9jZmcocnBvcnQtPnBvcnQtPmZjcykpCiAJCXJldHVybjsKIAorCXJwb3J0LT5ycGYucnBzY19zcGVlZCA9IDA7CiAJYmZhX3NtX3NlbmRfZXZlbnQoJnJwb3J0LT5ycGYsIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkUpOwogfQogCkBAIC0zMDcsNyArMzEzLDcgQEAKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCQkgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcnBmX3Jwc2MyX3Jlc3BvbnNlLAotCQkJICBycGYsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJCSAgcnBmLCBGQ19NQVhfUERVU1osIEZDX0VMU19UT1YpOwogCXJwb3J0LT5zdGF0cy5ycHNjX3NlbnQrKzsKIAliZmFfc21fc2VuZF9ldmVudChycGYsIFJQRlNNX0VWRU5UX0ZDWFBfU0VOVCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvc2NuLmMgYi9kcml2ZXJzL3Njc2kvYmZhL3Njbi5jCmluZGV4IDhmZTA5YmEuLjhhNjAxMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvc2NuLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9zY24uYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAKIAliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAogCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBiZmFfZmNzX3BvcnRfc2NuX3Njcl9yZXNwb25zZSwKLQkJICAgICAgKHZvaWQgKilzY24sIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKwkJICAgICAgKHZvaWQgKilzY24sIEZDX01BWF9QRFVTWiwgRkNfRUxTX1RPVik7CiAKIAliZmFfc21fc2VuZF9ldmVudChzY24sIFNDTlNNX0VWRU5UX1NDUl9TRU5UKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvdnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvdnBvcnQuYwppbmRleCAyN2NkNjE5Li5iMzc4ZWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL3Zwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS92cG9ydC5jCkBAIC0yMTgsOSArMjE4LDkgQEAKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFOgotCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2xvZ28pOworCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApOwogCQliZmFfbHBzX2Rpc2NhcmQodnBvcnQtPmxwcyk7Ci0JCWJmYV9mY3NfdnBvcnRfZG9fbG9nbyh2cG9ydCk7CisJCWJmYV9mY3NfcG9ydF9kZWxldGUoJnZwb3J0LT5scG9ydCk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkU6CkBAIC0zNTcsOCArMzU3LDkgQEAKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFOgotCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX3VuaW5pdCk7Ci0JCWJmYV9mY3NfdnBvcnRfZnJlZSh2cG9ydCk7CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fY2xlYW51cCk7CisJCWJmYV9mY3NfcG9ydF9kZWxldGUoJnZwb3J0LT5scG9ydCk7CisKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTk0LDYgKzU5NSwxNSBAQAogfQogCiAvKioKKyAqIGRlbGV0ZSBub3RpZmljYXRpb24gZnJvbSBmYWJyaWMgU00uIFRvIGJlIGludm9rZWQgZnJvbSB3aXRoaW4gRkNTLgorICovCit2b2lkCitiZmFfZmNzX3Zwb3J0X2Zjc19kZWxldGUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFKTsKK30KKworLyoqCiAgKiBEZWxldGUgY29tcGxldGlvbiBjYWxsYmFjayBmcm9tIGFzc29jaWF0ZWQgbHBvcnQKICAqLwogdm9pZApAQCAtNjQ2LDYgKzY1Niw3IEBACiAJCXJldHVybiBCRkFfU1RBVFVTX1ZQT1JUX01BWDsKIAogCXZwb3J0LT52cG9ydF9kcnYgPSB2cG9ydF9kcnY7CisJdnBvcnRfY2ZnLT5wcmVib290X3ZwID0gQkZBX0ZBTFNFOwogCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fdW5pbml0KTsKIAogCWJmYV9mY3NfbHBvcnRfYXR0YWNoKCZ2cG9ydC0+bHBvcnQsIGZjcywgdmZfaWQsIHZwb3J0KTsKQEAgLTY1Nyw2ICs2NjgsMzYgQEAKIH0KIAogLyoqCisgKiAgICAgIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGluc3RhbnRpYXRlIGEgbmV3IEZDUyBQQkMgdnBvcnQgb2JqZWN0LiBUaGlzCisgKiAgICAgIGZ1bmN0aW9uIHdpbGwgbm90IHRyaWdnZXIgYW55IEhXIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgKHdoaWNoIHdpbGwgYmUKKyAqICAgICAgZG9uZSBpbiB2cG9ydF9zdGFydCgpIGNhbGwpCisgKgorICogICAgICBwYXJhbVtpbl0gdnBvcnQgICAgICAgIC0gICAgICAgcG9pbnRlciB0byBiZmFfZmNzX3Zwb3J0X3QuIFRoaXMgc3BhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KKyAqICAgICAgcGFyYW1baW5dIGZjcyAgICAgICAgICAtICAgICAgIEZDUyBpbnN0YW5jZQorICogICAgICBwYXJhbVtpbl0gdnBvcnRfY2ZnICAgIC0gICAgICAgdnBvcnQgY29uZmlndXJhdGlvbgorICogICAgICBwYXJhbVtpbl0gdmZfaWQgICAgICAgIC0gICAgICAgVkZfSUQgaWYgdnBvcnQgaXMgY3JlYXRlZCB3aXRoaW4gYSBWRi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQ19WRl9JRF9OVUxMIHRvIHNwZWNpZnkgYmFzZSBmYWJyaWMuCisgKiAgICAgIHBhcmFtW2luXSB2cG9ydF9kcnYgICAgLSAgICAgICBPcGFxdWUgaGFuZGxlIGJhY2sgdG8gdGhlIGRyaXZlcidzIHZwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlCisgKgorICogICAgICByZXR2YWwgQkZBX1NUQVRVU19PSyAtIG9uIHN1Y2Nlc3MuCisgKiAgICAgIHJldHZhbCBCRkFfU1RBVFVTX0ZBSUxFRCAtIG9uIGZhaWx1cmUuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2Zjc19wYmNfdnBvcnRfY3JlYXRlKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LCBzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCQl1aW50MTZfdCB2Zl9pZCwgc3RydWN0IGJmYV9wb3J0X2NmZ19zICp2cG9ydF9jZmcsCisJCQlzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cG9ydF9kcnYpCit7CisJYmZhX3N0YXR1c190IHJjOworCisJcmMgPSBiZmFfZmNzX3Zwb3J0X2NyZWF0ZSh2cG9ydCwgZmNzLCB2Zl9pZCwgdnBvcnRfY2ZnLCB2cG9ydF9kcnYpOworCXZwb3J0LT5scG9ydC5wb3J0X2NmZy5wcmVib290X3ZwID0gQkZBX1RSVUU7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgogICogIAlVc2UgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSB2cG9ydC4KICAqCiAgKiAgQHBhcmFtW2luXSB2cG9ydCAtIHBvaW50ZXIgdG8gYmZhX2Zjc192cG9ydF90LgpAQCAtNjkyLDYgKzczMyw4IEBACiAgKiAgCVVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhIHZwb3J0IG9iamVjdC4gRmFicmljIG9iamVjdCBzaG91bGQKICAqIAkJYmUgc3RvcHBlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYWxsLgogICoKKyAqCURvbm90IGludm9rZSB0aGlzIGZyb20gd2l0aGluIEZDUworICoKICAqIAlwYXJhbVtpbl0gdnBvcnQgLSBwb2ludGVyIHRvIGJmYV9mY3NfdnBvcnRfdC4KICAqCiAgKiAJcmV0dXJuICAgICBOb25lCkBAIC02OTksNiArNzQyLDkgQEAKIGJmYV9zdGF0dXNfdAogYmZhX2Zjc192cG9ydF9kZWxldGUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCiB7CisJaWYgKHZwb3J0LT5scG9ydC5wb3J0X2NmZy5wcmVib290X3ZwKQorCQlyZXR1cm4gQkZBX1NUQVRVU19QQkM7CisKIAliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9ERUxFVEUpOwogCiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CkBAIC03ODksNyArODM1LDcgQEAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgQkZBX1NUQVRVU19PSzoKIAkJLyoKLQkJICogSW5pdGlhbGlhemUgdGhlIFYtUG9ydCBmaWVsZHMKKwkJICogSW5pdGlhbGl6ZSB0aGUgVi1Qb3J0IGZpZWxkcwogCQkgKi8KIAkJX192cG9ydF9mY2lkKHZwb3J0KSA9IGJmYV9scHNfZ2V0X3BpZCh2cG9ydC0+bHBzKTsKIAkJdnBvcnQtPnZwb3J0X3N0YXRzLmZkaXNjX2FjY2VwdHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpLmgKaW5kZXggNmI2MjRlNy4uMDBjMDMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpLmgKQEAgLTI5NSwxNiArMjk1LDIxIEBACiAgKiBAbWF4X2NxZXM6ICAgICAgICAgICAgICBDUSBzaXplCiAgKiBAbnVtX2NjZWxsOiAgICAgICAgICAgICBudW1iZXIgb2YgY29tbWFuZCBjZWxscyBwZXIgY29ubmVjdGlvbgogICogQG9mbGRfY29ubnNfYWN0aXZlOiAgICAgYWN0aXZlIGNvbm5lY3Rpb24gbGlzdAorICogQGVoX3dhaXQ6ICAgICAgICAgICAgICAgd2FpdCBxdWV1ZSBmb3IgdGhlIGVuZHBvaW50IHRvIHNodXRkb3duCiAgKiBAbWF4X2FjdGl2ZV9jb25uczogICAgICBtYXggb2ZmbG9hZCBjb25uZWN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UKICAqIEBjaWRfcXVlOiAgICAgICAgICAgICAgIGlzY3NpIGNpZCBxdWV1ZQogICogQGVwX3Jkd3JfbG9jazogICAgICAgICAgcmVhZCAvIHdyaXRlIGxvY2sgdG8gc3luY2hyb25pemUgdmFyaW91cyBlcCBsaXN0cwogICogQGVwX29mbGRfbGlzdDogICAgICAgICAgY29ubmVjdGlvbiBsaXN0IGZvciBwZW5kaW5nIG9mZmxvYWQgY29tcGxldGlvbgorICogQGVwX2FjdGl2ZV9saXN0OiAgICAgICAgY29ubmVjdGlvbiBsaXN0IGZvciBhY3RpdmUgb2ZmbG9hZCBlbmRwb2ludHMKICAqIEBlcF9kZXN0cm95X2xpc3Q6ICAgICAgIGNvbm5lY3Rpb24gbGlzdCBmb3IgcGVuZGluZyBvZmZsb2FkIGNvbXBsZXRpb24KICAqIEBtcF9iZF90Ymw6ICAgICAgICAgICAgIEJEIHRhYmxlIHRvIGJlIHVzZWQgd2l0aCBtaWRkbGUgcGF0aCByZXF1ZXN0cwogICogQG1wX2JkX2RtYTogICAgICAgICAgICAgRE1BIGFkZHJlc3Mgb2YgJ21wX2JkX3RibCcgbWVtb3J5IGJ1ZmZlcgogICogQGR1bW15X2J1ZmZlcjogICAgICAgICAgRHVtbXkgYnVmZmVyIHRvIGJlIHVzZWQgd2l0aCB6ZXJvIGxlbmd0aCBzY3NpY21kIHJlcXMKICAqIEBkdW1teV9idWZfZG1hOiAgICAgICAgIERNQSBhZGRyZXNzIG9mICdkdW1teV9idWZmZXInIG1lbW9yeSBidWZmZXIKICAqIEBsb2NrOiAgICAgICAgICAgICAgCSAgIGxvY2sgdG8gc3luY2hvbml6ZSBhY2Nlc3MgdG8gaGJhIHN0cnVjdHVyZQorICogQGhiYV9zaHV0ZG93bl90bW86ICAgICAgVGltZW91dCB2YWx1ZSB0byBzaHV0ZG93biBlYWNoIGNvbm5lY3Rpb24KKyAqIEBjb25uX3RlYXJkb3duX3RtbzogICAgIFRpbWVvdXQgdmFsdWUgdG8gdGVhciBkb3duIGVhY2ggY29ubmVjdGlvbgorICogQGNvbm5fY3R4X2Rlc3Ryb3lfdG1vOiAgVGltZW91dCB2YWx1ZSB0byBkZXN0cm95IGNvbnRleHQgb2YgZWFjaCBjb25uZWN0aW9uCiAgKiBAcGNpX2RpZDogICAgICAgICAgICAgICBQQ0kgZGV2aWNlIElECiAgKiBAcGNpX3ZpZDogICAgICAgICAgICAgICBQQ0kgdmVuZG9yIElECiAgKiBAcGNpX3NkaWQ6ICAgICAgICAgICAgICBQQ0kgc3Vic3lzdGVtIGRldmljZSBJRApAQCAtMzY5LDYgKzM3NCw3IEBACiAKIAlyd2xvY2tfdCBlcF9yZHdyX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBlcF9vZmxkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBlcF9hY3RpdmVfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGVwX2Rlc3Ryb3lfbGlzdDsKIAogCS8qCkBAIC0zODMsNiArMzg5LDggQEAKIAlzdHJ1Y3QgbXV0ZXggbmV0X2Rldl9sb2NrOy8qIHN5bmMgbmV0IGRldmljZSBhY2Nlc3MgKi8KIAogCWludCBoYmFfc2h1dGRvd25fdG1vOworCWludCBjb25uX3RlYXJkb3duX3RtbzsKKwlpbnQgY29ubl9jdHhfZGVzdHJveV90bW87CiAJLyoKIAkgKiBQQ0kgcmVsYXRlZCBpbmZvLgogCSAqLwpAQCAtNjMxLDYgKzYzOSw4IEBACiAJRVBfU1RBVEVfQ0xFQU5VUF9DTVBMICAgICAgICAgICA9IDB4ODAwLAogCUVQX1NUQVRFX1RDUF9GSU5fUkNWRCAgICAgICAgICAgPSAweDEwMDAsCiAJRVBfU1RBVEVfVENQX1JTVF9SQ1ZEICAgICAgICAgICA9IDB4MjAwMCwKKwlFUF9TVEFURV9MT0dPVVRfU0VOVCAgICAgICAgICAgID0gMHg0MDAwLAorCUVQX1NUQVRFX0xPR09VVF9SRVNQX1JDVkQgICAgICAgPSAweDgwMDAsCiAJRVBfU1RBVEVfUEdfT0ZMRF9GQUlMRUQgICAgICAgICA9IDB4MTAwMDAwMCwKIAlFUF9TVEFURV9VTFBfVVBEQVRFX0ZBSUxFRCAgICAgID0gMHgyMDAwMDAwLAogCUVQX1NUQVRFX0NMRUFOVVBfRkFJTEVEICAgICAgICAgPSAweDQwMDAwMDAsCkBAIC02NDUsNiArNjU1LDcgQEAKICAqIEBsaW5rOiAgICAgICAgICAgICAgIGxpc3QgaGVhZCB0byBsaW5rIGVsZW1lbnRzCiAgKiBAaGJhOiAgICAgICAgICAgICAgICBhZGFwdGVyIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBiZWxvbmdzCiAgKiBAY29ubjogICAgICAgICAgICAgICBpc2NzaSBjb25uZWN0aW9uIHRoaXMgRVAgaXMgbGlua2VkIHRvCisgKiBAY2xzX2VwOiAgICAgICAgICAgICBhc3NvY2lhdGVkIGlTQ1NJIGVuZHBvaW50IHBvaW50ZXIKICAqIEBzZXNzOiAgICAgICAgICAgICAgIGlzY3NpIHNlc3Npb24gdGhpcyBFUCBpcyBsaW5rZWQgdG8KICAqIEBjbV9zazogICAgICAgICAgICAgIGNuaWMgc29jayBzdHJ1Y3QKICAqIEBoYmFfYWdlOiAgICAgICAgICAgIGFnZSB0byBkZXRlY3QgaWYgJ2lzY3NpZCcgaXNzdWVzIGVwX2Rpc2Nvbm5lY3QoKQpAQCAtNjY0LDYgKzY3NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwogCXN0cnVjdCBibngyaV9oYmEgKmhiYTsKIAlzdHJ1Y3QgYm54MmlfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmNsc19lcDsKIAlzdHJ1Y3QgY25pY19zb2NrICpjbV9zazsKIAl1MzIgaGJhX2FnZTsKIAl1MzIgc3RhdGU7CkBAIC03NjYsNiArNzc4LDggQEAKIGV4dGVybiBpbnQgYm54MmlfbWFwX2VwX2RiZWxsX3JlZ3Moc3RydWN0IGJueDJpX2VuZHBvaW50ICplcCk7CiBleHRlcm4gdm9pZCBibngyaV9hcm1fY3FfZXZlbnRfY29hbGVzY2luZyhzdHJ1Y3QgYm54MmlfZW5kcG9pbnQgKmVwLCB1OCBhY3Rpb24pOwogCitleHRlcm4gaW50IGJueDJpX2h3X2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGJueDJpX2VuZHBvaW50ICpibngyaV9lcCk7CisKIC8qIERlYnVnIHJlbGF0ZWQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogZXh0ZXJuIHZvaWQgYm54MmlfcHJpbnRfcGVuZF9jbWRfcXVldWUoc3RydWN0IGJueDJpX2Nvbm4gKmNvbm4pOwogZXh0ZXJuIHZvaWQgYm54MmlfcHJpbnRfYWN0aXZlX2NtZF9xdWV1ZShzdHJ1Y3QgYm54MmlfY29ubiAqY29ubik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKaW5kZXggM2E2NmNhMi4uZDIzZmMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwpAQCAtNTYyLDYgKzU2Miw4IEBACiAJbG9nb3V0X3dxZS0+bnVtX2JkcyA9IDE7CiAJbG9nb3V0X3dxZS0+Y3FfaW5kZXggPSAwOyAvKiBDUSMgdXNlZCBmb3IgY29tcGxldGlvbiwgNTc3MXggb25seSAqLwogCisJYm54MmlfY29ubi0+ZXAtPnN0YXRlID0gRVBfU1RBVEVfTE9HT1VUX1NFTlQ7CisKIAlibngyaV9yaW5nX2RiZWxsX3VwZGF0ZV9zcV9wYXJhbXMoYm54MmlfY29ubiwgMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDgyLDYgKzE0ODQsOCBAQAogCXJlc3BfaGRyLT50MnJldGFpbiA9IGNwdV90b19iZTMyKGxvZ291dC0+dGltZV90b19yZXRhaW4pOwogCiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKilyZXNwX2hkciwgTlVMTCwgMCk7CisKKwlibngyaV9jb25uLT5lcC0+c3RhdGUgPSBFUF9TVEFURV9MT0dPVVRfUkVTUF9SQ1ZEOwogZG9uZToKIAlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2luaXQuYwppbmRleCBhZjZhMDBhLi5hNzk2ZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pbml0LmMKQEAgLTE3LDggKzE3LDggQEAKIHN0YXRpYyB1MzIgYWRhcHRlcl9jb3VudDsKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyaSIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIyLjEuMSIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJNYXIgMjQsIDIwMTAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi4xLjIiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuIDI4LCAyMDEwIgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CiAJCSJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgaVNDU0kgRHJpdmVyICIgRFJWX01PRFVMRV9OQU1FIFwKQEAgLTE3Niw2ICsxNzYsOSBAQAogdm9pZCBibngyaV9zdG9wKHZvaWQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgYm54MmlfaGJhICpoYmEgPSBoYW5kbGU7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOworCXN0cnVjdCBibngyaV9lbmRwb2ludCAqYm54MmlfZXA7CisJaW50IGNvbm5zX2FjdGl2ZTsKIAogCS8qIGNoZWNrIGlmIGNsZWFudXAgaGFwcGVuZWQgaW4gR09JTkdfRE9XTiBjb250ZXh0ICovCiAJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQURBUFRFUl9TVEFURV9HT0lOR19ET1dOLApAQCAtMTg3LDkgKzE5MCwzMyBAQAogCSAqICBjb250cm9sIHJldHVybnMgdG8gbmV0d29yayBkcml2ZXIuIFNvIGl0IGlzIHJlcXVpcmVkIHRvIGNsZWFudXAgYW5kCiAJICogcmVsZWFzZSBhbGwgY29ubmVjdGlvbiByZXNvdXJjZXMgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgcm91dGluZS4KIAkgKi8KLQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChoYmEtPmVoX3dhaXQsCi0JCQkJCSAoaGJhLT5vZmxkX2Nvbm5zX2FjdGl2ZSA9PSAwKSwKLQkJCQkJIGhiYS0+aGJhX3NodXRkb3duX3Rtbyk7CisJd2hpbGUgKGhiYS0+b2ZsZF9jb25uc19hY3RpdmUpIHsKKwkJY29ubnNfYWN0aXZlID0gaGJhLT5vZmxkX2Nvbm5zX2FjdGl2ZTsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaGJhLT5laF93YWl0LAorCQkJCShoYmEtPm9mbGRfY29ubnNfYWN0aXZlICE9IGNvbm5zX2FjdGl2ZSksCisJCQkJaGJhLT5oYmFfc2h1dGRvd25fdG1vKTsKKwkJaWYgKGhiYS0+b2ZsZF9jb25uc19hY3RpdmUgPT0gY29ubnNfYWN0aXZlKQorCQkJYnJlYWs7CisJfQorCWlmIChoYmEtPm9mbGRfY29ubnNfYWN0aXZlKSB7CisJCS8qIFN0YWdlIHRvIGZvcmNlIHRoZSBkaXNjb25uZWN0aW9uCisJCSAqIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGRhZW1vbiBpcyBlaXRoZXIgc2xvdyBvcgorCQkgKiBub3QgcHJlc2VudAorCQkgKi8KKwkJcHJpbnRrKEtFUk5fQUxFUlQgImJueDJpOiBXYWl0IHRpbWVvdXQsIGZvcmNlIGFsbCBlcHMgIgorCQkJInRvIGRpc2Nvbm5lY3QgKCVkKVxuIiwgaGJhLT5vZmxkX2Nvbm5zX2FjdGl2ZSk7CisJCW11dGV4X2xvY2soJmhiYS0+bmV0X2Rldl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmaGJhLT5lcF9hY3RpdmVfbGlzdCkgeworCQkJYm54MmlfZXAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGJueDJpX2VuZHBvaW50LCBsaW5rKTsKKwkJCS8qIENsZWFuIHVwIHRoZSBjaGlwIG9ubHkgKi8KKwkJCWJueDJpX2h3X2VwX2Rpc2Nvbm5lY3QoYm54MmlfZXApOworCQl9CisJCW11dGV4X3VubG9jaygmaGJhLT5uZXRfZGV2X2xvY2spOworCQlpZiAoaGJhLT5vZmxkX2Nvbm5zX2FjdGl2ZSkKKwkJCXByaW50ayhLRVJOX0VSUiAiYm54Mmk6IEVQIGRpc2Nvbm5lY3QgdGltZW91dCAoJWQpIVxuIiwKKwkJCQloYmEtPm9mbGRfY29ubnNfYWN0aXZlKTsKKwl9CisKIAkvKiBUaGlzIGZsYWcgc2hvdWxkIGJlIGNsZWFyZWQgbGFzdCBzbyB0aGF0IGVwX2Rpc2Nvbm5lY3QoKSBncmFjZWZ1bGx5CiAJICogY2xlYW5zIHVwIGNvbm5lY3Rpb24gY29udGV4dAogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwppbmRleCBmYTY4YWIzLi5hNDZjY2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwpAQCAtMzg2LDYgKzM4Niw3IEBACiAJfQogCiAJYm54MmlfZXAgPSBlcC0+ZGRfZGF0YTsKKwlibngyaV9lcC0+Y2xzX2VwID0gZXA7CiAJSU5JVF9MSVNUX0hFQUQoJmJueDJpX2VwLT5saW5rKTsKIAlibngyaV9lcC0+c3RhdGUgPSBFUF9TVEFURV9JRExFOwogCWJueDJpX2VwLT5lcF9pc2NzaV9jaWQgPSAodTE2KSAtMTsKQEAgLTY3OCw3ICs2NzksNiBAQAogCXJldHVybiBlcDsKIH0KIAotCiAvKioKICAqIGJueDJpX2ZpbmRfZXBfaW5fZGVzdHJveV9saXN0IC0gZmluZCBpc2NzaV9jaWQgaW4gZGVzdHJveSBsaXN0CiAgKiBAaGJhOiAJCXBvaW50ZXIgdG8gYWRhcHRlciBpbnN0YW5jZQpAQCAtNzA5LDYgKzcwOSwzOCBAQAogfQogCiAvKioKKyAqIGJueDJpX2VwX2FjdGl2ZV9saXN0X2FkZCAtIGFkZCBhbiBlbnRyeSB0byBlcCBhY3RpdmUgbGlzdAorICogQGhiYToJcG9pbnRlciB0byBhZGFwdGVyIGluc3RhbmNlCisgKiBAZXA6CQlwb2ludGVyIHRvIGVuZHBvaW50ICh0cmFuc3BvcnQgaW5kZW50aWZpZXIpIHN0cnVjdHVyZQorICoKKyAqIGN1cnJlbnQgYWN0aXZlIGNvbm4gcXVldWUgbWFuYWdlcgorICovCitzdGF0aWMgdm9pZCBibngyaV9lcF9hY3RpdmVfbGlzdF9hZGQoc3RydWN0IGJueDJpX2hiYSAqaGJhLAorCQkJCSAgICAgc3RydWN0IGJueDJpX2VuZHBvaW50ICplcCkKK3sKKwl3cml0ZV9sb2NrX2JoKCZoYmEtPmVwX3Jkd3JfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZXAtPmxpbmssICZoYmEtPmVwX2FjdGl2ZV9saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmhiYS0+ZXBfcmR3cl9sb2NrKTsKK30KKworCisvKioKKyAqIGJueDJpX2VwX2FjdGl2ZV9saXN0X2RlbCAtIGRlbGV0ZXMgYW4gZW50cnkgdG8gZXAgYWN0aXZlIGxpc3QKKyAqIEBoYmE6CXBvaW50ZXIgdG8gYWRhcHRlciBpbnN0YW5jZQorICogQGVwOgkJcG9pbnRlciB0byBlbmRwb2ludCAodHJhbnNwb3J0IGluZGVudGlmaWVyKSBzdHJ1Y3R1cmUKKyAqCisgKiBjdXJyZW50IGFjdGl2ZSBjb25uIHF1ZXVlIG1hbmFnZXIKKyAqLworc3RhdGljIHZvaWQgYm54MmlfZXBfYWN0aXZlX2xpc3RfZGVsKHN0cnVjdCBibngyaV9oYmEgKmhiYSwKKwkJCQkgICAgIHN0cnVjdCBibngyaV9lbmRwb2ludCAqZXApCit7CisJd3JpdGVfbG9ja19iaCgmaGJhLT5lcF9yZHdyX2xvY2spOworCWxpc3RfZGVsX2luaXQoJmVwLT5saW5rKTsKKwl3cml0ZV91bmxvY2tfYmgoJmhiYS0+ZXBfcmR3cl9sb2NrKTsKK30KKworCisvKioKICAqIGJueDJpX3NldHVwX2hvc3RfcXVldWVfc2l6ZSAtIGFzc2lnbnMgc2hvc3QtPmNhbl9xdWV1ZSBwYXJhbQogICogQGhiYToJcG9pbnRlciB0byBhZGFwdGVyIGluc3RhbmNlCiAgKiBAc2hvc3Q6CXNjc2kgaG9zdCBwb2ludGVyCkBAIC03ODQsNiArODE2LDcgQEAKIAkJZ290byBtcF9iZHRfbWVtX2VycjsKIAogCUlOSVRfTElTVF9IRUFEKCZoYmEtPmVwX29mbGRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmhiYS0+ZXBfYWN0aXZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoYmEtPmVwX2Rlc3Ryb3lfbGlzdCk7CiAJcndsb2NrX2luaXQoJmhiYS0+ZXBfcmR3cl9sb2NrKTsKIApAQCAtODIxLDEwICs4NTQsMTUgQEAKIAlzcGluX2xvY2tfaW5pdCgmaGJhLT5sb2NrKTsKIAltdXRleF9pbml0KCZoYmEtPm5ldF9kZXZfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaGJhLT5laF93YWl0KTsKLQlpZiAodGVzdF9iaXQoQk5YMklfTlgyX0RFVl81NzcxMCwgJmhiYS0+Y25pY19kZXZfdHlwZSkpCi0JCWhiYS0+aGJhX3NodXRkb3duX3RtbyA9IDI0MCAqIEhaOwotCWVsc2UJLyogNTcwNi81NzA4LzU3MDkgKi8KLQkJaGJhLT5oYmFfc2h1dGRvd25fdG1vID0gMzAgKiBIWjsKKwlpZiAodGVzdF9iaXQoQk5YMklfTlgyX0RFVl81NzcxMCwgJmhiYS0+Y25pY19kZXZfdHlwZSkpIHsKKwkJaGJhLT5oYmFfc2h1dGRvd25fdG1vID0gMjAgKiBIWjsKKwkJaGJhLT5jb25uX3RlYXJkb3duX3RtbyA9IDIwICogSFo7CisJCWhiYS0+Y29ubl9jdHhfZGVzdHJveV90bW8gPSA2ICogSFo7CisJfSBlbHNlIHsJLyogNTcwNi81NzA4LzU3MDkgKi8KKwkJaGJhLT5oYmFfc2h1dGRvd25fdG1vID0gMjAgKiBIWjsKKwkJaGJhLT5jb25uX3RlYXJkb3duX3RtbyA9IDEwICogSFo7CisJCWhiYS0+Y29ubl9jdHhfZGVzdHJveV90bW8gPSAyICogSFo7CisJfQogCiAJaWYgKGlzY3NpX2hvc3RfYWRkKHNob3N0LCAmaGJhLT5wY2lkZXYtPmRldikpCiAJCWdvdG8gZnJlZV9kdW1wX21lbTsKQEAgLTg1Nyw2ICs4OTUsNyBAQAogCiAJaXNjc2lfaG9zdF9yZW1vdmUoc2hvc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoYmEtPmVwX29mbGRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmhiYS0+ZXBfYWN0aXZlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoYmEtPmVwX2Rlc3Ryb3lfbGlzdCk7CiAJcGNpX2Rldl9wdXQoaGJhLT5wY2lkZXYpOwogCkBAIC0xNDYxLDYgKzE1MDAsMjYgQEAKIAljYXNlIElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUU6CiAJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsIGhiYS0+bmV0ZGV2LT5uYW1lKTsKIAkJYnJlYWs7CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzogeworCQlzdHJ1Y3QgbGlzdF9oZWFkICphY3RpdmVfbGlzdCA9ICZoYmEtPmVwX2FjdGl2ZV9saXN0OworCisJCXJlYWRfbG9ja19iaCgmaGJhLT5lcF9yZHdyX2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmhiYS0+ZXBfYWN0aXZlX2xpc3QpKSB7CisJCQlzdHJ1Y3QgYm54MmlfZW5kcG9pbnQgKmJueDJpX2VwOworCQkJc3RydWN0IGNuaWNfc29jayAqY3NrOworCisJCQlibngyaV9lcCA9IGxpc3RfZmlyc3RfZW50cnkoYWN0aXZlX2xpc3QsCisJCQkJCQkgICAgc3RydWN0IGJueDJpX2VuZHBvaW50LAorCQkJCQkJICAgIGxpbmspOworCQkJY3NrID0gYm54MmlfZXAtPmNtX3NrOworCQkJaWYgKHRlc3RfYml0KFNLX0ZfSVBWNiwgJmNzay0+ZmxhZ3MpKQorCQkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNlxuIiwgY3NrLT5zcmNfaXApOworCQkJZWxzZQorCQkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNFxuIiwgY3NrLT5zcmNfaXApOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZoYmEtPmVwX3Jkd3JfbG9jayk7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gaXNjc2lfaG9zdF9nZXRfcGFyYW0oc2hvc3QsIHBhcmFtLCBidWYpOwogCX0KQEAgLTE1OTksNyArMTY1OCw3IEBACiAKIAllcC0+c3RhdGUgPSBFUF9TVEFURV9DTEVBTlVQX1NUQVJUOwogCWluaXRfdGltZXIoJmVwLT5vZmxkX3RpbWVyKTsKLQllcC0+b2ZsZF90aW1lci5leHBpcmVzID0gMTAqSFogKyBqaWZmaWVzOworCWVwLT5vZmxkX3RpbWVyLmV4cGlyZXMgPSBoYmEtPmNvbm5fY3R4X2Rlc3Ryb3lfdG1vICsgamlmZmllczsKIAllcC0+b2ZsZF90aW1lci5mdW5jdGlvbiA9IGJueDJpX2VwX29mbGRfdGltZXI7CiAJZXAtPm9mbGRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBlcDsKIAlhZGRfdGltZXIoJmVwLT5vZmxkX3RpbWVyKTsKQEAgLTE2NjUsMTAgKzE3MjQsMTEgQEAKIAogCWlmICghaGJhIHx8IHRlc3RfYml0KEFEQVBURVJfU1RBVEVfR09JTkdfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSkpIHsKIAkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGNoZWNrX2J1c3k7CisJCWdvdG8gbm9oYmE7CiAJfQogCiAJY25pYyA9IGhiYS0+Y25pYzsKKwltdXRleF9sb2NrKCZoYmEtPm5ldF9kZXZfbG9jayk7CiAJZXAgPSBibngyaV9hbGxvY19lcChoYmEpOwogCWlmICghZXApIHsKIAkJcmMgPSAtRU5PTUVNOwpAQCAtMTY3Niw3ICsxNzM2LDYgQEAKIAl9CiAJYm54MmlfZXAgPSBlcC0+ZGRfZGF0YTsKIAotCW11dGV4X2xvY2soJmhiYS0+bmV0X2Rldl9sb2NrKTsKIAlpZiAoYm54MmlfYWRhcHRlcl9yZWFkeShoYmEpKSB7CiAJCXJjID0gLUVQRVJNOwogCQlnb3RvIG5ldF9pZl9kb3duOwpAQCAtMTc1NCwxNSArMTgxMywxOSBAQAogCQlnb3RvIGNvbm5fZmFpbGVkOwogCX0gZWxzZQogCQlyYyA9IGNuaWMtPmNtX2Nvbm5lY3QoYm54MmlfZXAtPmNtX3NrLCAmc2FkZHIpOwotCiAJaWYgKHJjKQogCQlnb3RvIHJlbGVhc2VfZXA7CiAKKwlibngyaV9lcF9hY3RpdmVfbGlzdF9hZGQoaGJhLCBibngyaV9lcCk7CisKIAlpZiAoYm54MmlfbWFwX2VwX2RiZWxsX3JlZ3MoYm54MmlfZXApKQotCQlnb3RvIHJlbGVhc2VfZXA7CisJCWdvdG8gZGVsX2FjdGl2ZV9lcDsKKwogCW11dGV4X3VubG9jaygmaGJhLT5uZXRfZGV2X2xvY2spOwogCXJldHVybiBlcDsKIAorZGVsX2FjdGl2ZV9lcDoKKwlibngyaV9lcF9hY3RpdmVfbGlzdF9kZWwoaGJhLCBibngyaV9lcCk7CiByZWxlYXNlX2VwOgogCWlmIChibngyaV90ZWFyX2Rvd25fY29ubihoYmEsIGJueDJpX2VwKSkgewogCQltdXRleF91bmxvY2soJmhiYS0+bmV0X2Rldl9sb2NrKTsKQEAgLTE3NzQsOCArMTgzNyw5IEBACiAJYm54MmlfZnJlZV9xcF9yZXNjKGhiYSwgYm54MmlfZXApOwogcXBfcmVzY19lcnI6CiAJYm54MmlfZnJlZV9lcChlcCk7Ci0JbXV0ZXhfdW5sb2NrKCZoYmEtPm5ldF9kZXZfbG9jayk7CiBjaGVja19idXN5OgorCW11dGV4X3VubG9jaygmaGJhLT5uZXRfZGV2X2xvY2spOworbm9oYmE6CiAJYm54MmlfdW5yZWdfZGV2X2FsbCgpOwogCXJldHVybiBFUlJfUFRSKHJjKTsKIH0KQEAgLTE4NDYsNiArMTkxMCw4IEBACiAJY2FzZSBFUF9TVEFURV9VTFBfVVBEQVRFX1NUQVJUOgogCWNhc2UgRVBfU1RBVEVfVUxQX1VQREFURV9DT01QTDoKIAljYXNlIEVQX1NUQVRFX1RDUF9GSU5fUkNWRDoKKwljYXNlIEVQX1NUQVRFX0xPR09VVF9TRU5UOgorCWNhc2UgRVBfU1RBVEVfTE9HT1VUX1JFU1BfUkNWRDoKIAljYXNlIEVQX1NUQVRFX1VMUF9VUERBVEVfRkFJTEVEOgogCQlyZXQgPSAxOwogCQlicmVhazsKQEAgLTE4NjYsOSArMTkzMiw5NiBAQAogfQogCiAKKy8qCisgKiBibngyaV9od19lcF9kaXNjb25uZWN0IC0gZXhlY3V0ZXMgVENQIGNvbm5lY3Rpb24gdGVhcmRvd24gcHJvY2VzcyBpbiB0aGUgaHcKKyAqIEBlcDoJCVRDUCBjb25uZWN0aW9uIChibngyaSBlbmRwb2ludCkgaGFuZGxlCisgKgorICogZXhlY3V0ZXMgIFRDUCBjb25uZWN0aW9uIHRlYXJkb3duIHByb2Nlc3MKKyAqLworaW50IGJueDJpX2h3X2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGJueDJpX2VuZHBvaW50ICpibngyaV9lcCkKK3sKKwlzdHJ1Y3QgYm54MmlfaGJhICpoYmEgPSBibngyaV9lcC0+aGJhOworCXN0cnVjdCBjbmljX2RldiAqY25pYzsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBjbG9zZSA9IDA7CisJaW50IGNsb3NlX3JldCA9IDA7CisKKwlpZiAoIWhiYSkKKwkJcmV0dXJuIDA7CisKKwljbmljID0gaGJhLT5jbmljOworCWlmICghY25pYykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWJueDJpX2VwX3RjcF9jb25uX2FjdGl2ZShibngyaV9lcCkpCisJCWdvdG8gZGVzdHJveV9jb25uOworCisJaWYgKGJueDJpX2VwLT5jb25uKSB7CisJCWNvbm4gPSBibngyaV9lcC0+Y29ubi0+Y2xzX2Nvbm4tPmRkX2RhdGE7CisJCXNlc3Npb24gPSBjb25uLT5zZXNzaW9uOworCX0KKworCWluaXRfdGltZXIoJmJueDJpX2VwLT5vZmxkX3RpbWVyKTsKKwlibngyaV9lcC0+b2ZsZF90aW1lci5leHBpcmVzID0gaGJhLT5jb25uX3RlYXJkb3duX3RtbyArIGppZmZpZXM7CisJYm54MmlfZXAtPm9mbGRfdGltZXIuZnVuY3Rpb24gPSBibngyaV9lcF9vZmxkX3RpbWVyOworCWJueDJpX2VwLT5vZmxkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYm54MmlfZXA7CisJYWRkX3RpbWVyKCZibngyaV9lcC0+b2ZsZF90aW1lcik7CisKKwlpZiAoIXRlc3RfYml0KEJOWDJJX0NOSUNfUkVHSVNURVJFRCwgJmhiYS0+cmVnX3dpdGhfY25pYykpCisJCWdvdG8gb3V0OworCisJaWYgKHNlc3Npb24pIHsKKwkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJaWYgKGJueDJpX2VwLT5zdGF0ZSAhPSBFUF9TVEFURV9UQ1BfRklOX1JDVkQpIHsKKwkJCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9MT0dHSU5HX09VVCkgeworCQkJCWlmIChibngyaV9lcC0+c3RhdGUgPT0gRVBfU1RBVEVfTE9HT1VUX1NFTlQpIHsKKwkJCQkJLyogTG9nb3V0IHNlbnQsIGJ1dCBubyByZXNwICovCisJCQkJCXByaW50ayhLRVJOX0FMRVJUICJibngyaSAtIFdBUk5JTkcgIgorCQkJCQkJImxvZ291dCByZXNwb25zZSB3YXMgbm90ICIKKwkJCQkJCSJyZWNlaXZlZCFcbiIpOworCQkJCX0gZWxzZSBpZiAoYm54MmlfZXAtPnN0YXRlID09CisJCQkJCSAgIEVQX1NUQVRFX0xPR09VVF9SRVNQX1JDVkQpCisJCQkJCWNsb3NlID0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQljbG9zZSA9IDE7CisKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCX0KKworCWJueDJpX2VwLT5zdGF0ZSA9IEVQX1NUQVRFX0RJU0NPTk5fU1RBUlQ7CisKKwlpZiAoY2xvc2UpCisJCWNsb3NlX3JldCA9IGNuaWMtPmNtX2Nsb3NlKGJueDJpX2VwLT5jbV9zayk7CisJZWxzZQorCQljbG9zZV9yZXQgPSBjbmljLT5jbV9hYm9ydChibngyaV9lcC0+Y21fc2spOworCisJaWYgKGNsb3NlX3JldCkKKwkJYm54MmlfZXAtPnN0YXRlID0gRVBfU1RBVEVfRElTQ09OTl9DT01QTDsKKworCS8qIHdhaXQgZm9yIG9wdGlvbi0yIGNvbm4gdGVhcmRvd24gKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYm54MmlfZXAtPm9mbGRfd2FpdCwKKwkJCQkgYm54MmlfZXAtPnN0YXRlICE9IEVQX1NUQVRFX0RJU0NPTk5fU1RBUlQpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCWRlbF90aW1lcl9zeW5jKCZibngyaV9lcC0+b2ZsZF90aW1lcik7CisKK2Rlc3Ryb3lfY29ubjoKKwlibngyaV9lcF9hY3RpdmVfbGlzdF9kZWwoaGJhLCBibngyaV9lcCk7CisJaWYgKGJueDJpX3RlYXJfZG93bl9jb25uKGhiYSwgYm54MmlfZXApKQorCQlyZXQgPSAtRUlOVkFMOworb3V0OgorCWJueDJpX2VwLT5zdGF0ZSA9IEVQX1NUQVRFX0lETEU7CisJcmV0dXJuIHJldDsKK30KKworCiAvKioKICAqIGJueDJpX2VwX2Rpc2Nvbm5lY3QgLSBleGVjdXRlcyBUQ1AgY29ubmVjdGlvbiB0ZWFyZG93biBwcm9jZXNzCi0gKiBAZXA6CQlUQ1AgY29ubmVjdGlvbiAoZW5kcG9pbnQpIGhhbmRsZQorICogQGVwOgkJVENQIGNvbm5lY3Rpb24gKGlzY3NpIGVuZHBvaW50KSBoYW5kbGUKICAqCiAgKiBleGVjdXRlcyAgVENQIGNvbm5lY3Rpb24gdGVhcmRvd24gcHJvY2VzcwogICovCkBAIC0xODc2LDkgKzIwMjksNyBAQAogewogCXN0cnVjdCBibngyaV9lbmRwb2ludCAqYm54MmlfZXA7CiAJc3RydWN0IGJueDJpX2Nvbm4gKmJueDJpX2Nvbm4gPSBOVUxMOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKLQlzdHJ1Y3QgY25pY19kZXYgKmNuaWM7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBOVUxMOwogCXN0cnVjdCBibngyaV9oYmEgKmhiYTsKIAogCWJueDJpX2VwID0gZXAtPmRkX2RhdGE7CkBAIC0xODk0LDcyICsyMDQ1LDM0IEBACiAJaWYgKGJueDJpX2VwLT5jb25uKSB7CiAJCWJueDJpX2Nvbm4gPSBibngyaV9lcC0+Y29ubjsKIAkJY29ubiA9IGJueDJpX2Nvbm4tPmNsc19jb25uLT5kZF9kYXRhOwotCQlzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKLQogCQlpc2NzaV9zdXNwZW5kX3F1ZXVlKGNvbm4pOwogCX0KLQogCWhiYSA9IGJueDJpX2VwLT5oYmE7Ci0JaWYgKGJueDJpX2VwLT5zdGF0ZSA9PSBFUF9TVEFURV9JRExFKQotCQlnb3RvIHJldHVybl9ibngyaV9lcDsKLQljbmljID0gaGJhLT5jbmljOwogCiAJbXV0ZXhfbG9jaygmaGJhLT5uZXRfZGV2X2xvY2spOwogCisJaWYgKGJueDJpX2VwLT5zdGF0ZSA9PSBFUF9TVEFURV9JRExFKQorCQlnb3RvIHJldHVybl9ibngyaV9lcDsKKwogCWlmICghdGVzdF9iaXQoQURBUFRFUl9TVEFURV9VUCwgJmhiYS0+YWRhcHRlcl9zdGF0ZSkpCiAJCWdvdG8gZnJlZV9yZXNjOworCiAJaWYgKGJueDJpX2VwLT5oYmFfYWdlICE9IGhiYS0+YWdlKQogCQlnb3RvIGZyZWVfcmVzYzsKIAotCWlmICghYm54MmlfZXBfdGNwX2Nvbm5fYWN0aXZlKGJueDJpX2VwKSkKLQkJZ290byBkZXN0b3J5X2Nvbm47Ci0KLQlibngyaV9lcC0+c3RhdGUgPSBFUF9TVEFURV9ESVNDT05OX1NUQVJUOwotCi0JaW5pdF90aW1lcigmYm54MmlfZXAtPm9mbGRfdGltZXIpOwotCWJueDJpX2VwLT5vZmxkX3RpbWVyLmV4cGlyZXMgPSAxMCpIWiArIGppZmZpZXM7Ci0JYm54MmlfZXAtPm9mbGRfdGltZXIuZnVuY3Rpb24gPSBibngyaV9lcF9vZmxkX3RpbWVyOwotCWJueDJpX2VwLT5vZmxkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYm54MmlfZXA7Ci0JYWRkX3RpbWVyKCZibngyaV9lcC0+b2ZsZF90aW1lcik7Ci0KLQlpZiAodGVzdF9iaXQoQk5YMklfQ05JQ19SRUdJU1RFUkVELCAmaGJhLT5yZWdfd2l0aF9jbmljKSkgewotCQlpbnQgY2xvc2UgPSAwOwotCi0JCWlmIChzZXNzaW9uKSB7Ci0JCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCQkJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX0xPR0dJTkdfT1VUKQotCQkJCWNsb3NlID0gMTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQkJfQotCQlpZiAoY2xvc2UpCi0JCQljbmljLT5jbV9jbG9zZShibngyaV9lcC0+Y21fc2spOwotCQllbHNlCi0JCQljbmljLT5jbV9hYm9ydChibngyaV9lcC0+Y21fc2spOwotCX0gZWxzZQotCQlnb3RvIGZyZWVfcmVzYzsKLQotCS8qIHdhaXQgZm9yIG9wdGlvbi0yIGNvbm4gdGVhcmRvd24gKi8KLQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYm54MmlfZXAtPm9mbGRfd2FpdCwKLQkJCQkgYm54MmlfZXAtPnN0YXRlICE9IEVQX1NUQVRFX0RJU0NPTk5fU1RBUlQpOwotCi0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCWRlbF90aW1lcl9zeW5jKCZibngyaV9lcC0+b2ZsZF90aW1lcik7Ci0KLWRlc3RvcnlfY29ubjoKLQlpZiAoYm54MmlfdGVhcl9kb3duX2Nvbm4oaGJhLCBibngyaV9lcCkpIHsKKwkvKiBEbyBhbGwgY2hpcCBjbGVhbnVwIGhlcmUgKi8KKwlpZiAoYm54MmlfaHdfZXBfZGlzY29ubmVjdChibngyaV9lcCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZoYmEtPm5ldF9kZXZfbG9jayk7CiAJCXJldHVybjsKIAl9CiBmcmVlX3Jlc2M6Ci0JbXV0ZXhfdW5sb2NrKCZoYmEtPm5ldF9kZXZfbG9jayk7CiAJYm54MmlfZnJlZV9xcF9yZXNjKGhiYSwgYm54MmlfZXApOwogcmV0dXJuX2JueDJpX2VwOgogCWlmIChibngyaV9jb25uKQogCQlibngyaV9jb25uLT5lcCA9IE5VTEw7CiAKIAlibngyaV9mcmVlX2VwKGVwKTsKLQorCW11dGV4X3VubG9jaygmaGJhLT5uZXRfZGV2X2xvY2spOwogCWlmICghaGJhLT5vZmxkX2Nvbm5zX2FjdGl2ZSkKIAkJYm54MmlfdW5yZWdfZGV2X2FsbCgpOwogCkBAIC0yMDM4LDcgKzIxNTEsOCBAQAogCQkJCSAgSVNDU0lfTFVfUkVTRVRfVE1PIHwgSVNDU0lfVEdUX1JFU0VUX1RNTyB8CiAJCQkJICBJU0NTSV9QSU5HX1RNTyB8IElTQ1NJX1JFQ1ZfVE1PIHwKIAkJCQkgIElTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKLQkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX05FVERFVl9OQU1FLAorCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKKwkJCQkgIElTQ1NJX0hPU1RfTkVUREVWX05BTUUsCiAJLmNyZWF0ZV9zZXNzaW9uCQk9IGJueDJpX3Nlc3Npb25fY3JlYXRlLAogCS5kZXN0cm95X3Nlc3Npb24JPSBibngyaV9zZXNzaW9uX2Rlc3Ryb3ksCiAJLmNyZWF0ZV9jb25uCQk9IGJueDJpX2Nvbm5fY3JlYXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfZGRwLmMgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwppbmRleCBiNThkOTEzLi5iZTBlMjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwpAQCAtNDk5LDYgKzQ5OSw3IEBACiAJLyogc2V0IHVwIHVscCBzdWJtb2RlIGFuZCBwYWdlIHNpemUgKi8KIAlyZXEgPSAoc3RydWN0IGNwbF9zZXRfdGNiX2ZpZWxkICopc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CiAJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCXJlcS0+d3Iud3JfbG8gPSAwOwogCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX1NFVF9UQ0JfRklFTEQsIHRpZCkpOwogCXJlcS0+cmVwbHkgPSBWX05PX1JFUExZKHJlcGx5ID8gMCA6IDEpOwogCXJlcS0+Y3B1X2lkeCA9IDA7CkBAIC01NjQsNiArNTY1LDcgQEAKIAkvKiBzZXQgdXAgdWxwIHN1Ym1vZGUgYW5kIHBhZ2Ugc2l6ZSAqLwogCXJlcSA9IChzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpyZXEpKTsKIAlyZXEtPndyLndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9GT1JXQVJEKSk7CisJcmVxLT53ci53cl9sbyA9IDA7CiAJT1BDT0RFX1RJRChyZXEpID0gaHRvbmwoTUtfT1BDT0RFX1RJRChDUExfU0VUX1RDQl9GSUVMRCwgdGlkKSk7CiAJcmVxLT5yZXBseSA9IFZfTk9fUkVQTFkocmVwbHkgPyAwIDogMSk7CiAJcmVxLT5jcHVfaWR4ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX29mZmxvYWQuYyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX29mZmxvYWQuYwppbmRleCBhMTc1YmU5Li4zZWUxM2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfb2ZmbG9hZC5jCkBAIC0yNjQsNiArMjY0LDcgQEAKIAlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX1NFVFVQOwogCXJlcSA9IChzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CiAJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCXJlcS0+d3Iud3JfbG8gPSAwOwogCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX0FDVF9PUEVOX1JFUSwgYXRpZCkpOwogCXJlcS0+bG9jYWxfcG9ydCA9IGMzY24tPnNhZGRyLnNpbl9wb3J0OwogCXJlcS0+cGVlcl9wb3J0ID0gYzNjbi0+ZGFkZHIuc2luX3BvcnQ7CkBAIC0yNzMsNiArMjc0LDcgQEAKIAkJCSAgIFZfVFhfQ0hBTk5FTChlLT5zbXRfaWR4KSk7CiAJcmVxLT5vcHQwbCA9IGh0b25sKGNhbGNfb3B0MGwoYzNjbikpOwogCXJlcS0+cGFyYW1zID0gMDsKKwlyZXEtPm9wdDIgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBmYWlsX2FjdF9vcGVuKHN0cnVjdCBzM19jb25uICpjM2NuLCBpbnQgZXJybm8pCkBAIC0zNzksNiArMzgxLDcgQEAKIAogCWMzY24tPmNwbF9hYm9ydF9yZXEgPSBOVUxMOwogCXJlcSA9IChzdHJ1Y3QgY3BsX2Fib3J0X3JlcSAqKXNrYi0+aGVhZDsKKwltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwogCiAJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9EQVRBOwogCXNldF9hcnBfZmFpbHVyZV9oYW5kbGVyKHNrYiwgYWJvcnRfYXJwX2ZhaWx1cmUpOwpAQCAtNDA2LDYgKzQwOSw3IEBACiAJYzNjbi0+Y3BsX2Fib3J0X3JwbCA9IE5VTEw7CiAKIAlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX0RBVEE7CisJbWVtc2V0KHJwbCwgMCwgc2l6ZW9mKCpycGwpKTsKIAlycGwtPndyLndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9PRkxEX0hPU1RfQUJPUlRfQ09OX1JQTCkpOwogCXJwbC0+d3Iud3JfbG8gPSBodG9ubChWX1dSX1RJRChjM2NuLT50aWQpKTsKIAlPUENPREVfVElEKHJwbCkgPSBodG9ubChNS19PUENPREVfVElEKENQTF9BQk9SVF9SUEwsIGMzY24tPnRpZCkpOwpAQCAtNDMwLDYgKzQzNCw3IEBACiAKIAlyZXEgPSAoc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CiAJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCXJlcS0+d3Iud3JfbG8gPSAwOwogCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX1JYX0RBVEFfQUNLLCBjM2NuLT50aWQpKTsKIAlyZXEtPmNyZWRpdF9kYWNrID0gaHRvbmwoZGFjayB8IFZfUlhfQ1JFRElUUyhjcmVkaXRzKSk7CiAJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9BQ0s7CkBAIC0xNTg3LDcgKzE1OTIsNyBAQAogCiAJZXJyID0gaXBfcm91dGVfb3V0cHV0X2tleShkZXYgPyBkZXZfbmV0KGRldikgOiAmaW5pdF9uZXQsICZydCwgJmZsKTsKIAlpZiAoIWVycikKLQkJcmV0dXJuICgmcnQtPnUuZHN0KS0+ZGV2OworCQlyZXR1cm4gKCZydC0+ZHN0KS0+ZGV2OwogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xNjQ5LDcgKzE2NTQsNyBAQAogCQljM2NuLT5zYWRkci5zaW5fYWRkci5zX2FkZHIgPSBydC0+cnRfc3JjOwogCiAJLyogbm93IGNvbW1pdCBkZXN0aW5hdGlvbiB0byBjb25uZWN0aW9uICovCi0JYzNjbi0+ZHN0X2NhY2hlID0gJnJ0LT51LmRzdDsKKwljM2NuLT5kc3RfY2FjaGUgPSAmcnQtPmRzdDsKIAogCS8qIHRyeSB0byBlc3RhYmxpc2ggYW4gb2ZmbG9hZGVkIGNvbm5lY3Rpb24gKi8KIAlkZXYgPSBjeGdiM19lZ3Jlc3NfZGV2KGMzY24tPmRzdF9jYWNoZS0+ZGV2LCBjM2NuLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwppbmRleCA1YjY4M2U0Li5iOWJjZmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCkBAIC03NjgsNiArNzY4LDcgQEAKIAl7IkRFTEwiLCAiTUQzMDAwaSJ9LAogCXsiREVMTCIsICJNRDMyeHgifSwKIAl7IkRFTEwiLCAiTUQzMnh4aSJ9LAorCXsiREVMTCIsICJNRDM2eHhpIn0sCiAJeyJMU0kiLCAiSU5GLTAxLTAwIn0sCiAJeyJFTkdFTklPIiwgIklORi0wMS0wMCJ9LAogCXsiU1RLIiwgIkZMRVhMSU5FIDM4MCJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdF9pMm8uYyBiL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKaW5kZXggYjBjNTc2Zi4uZmZjMWVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RwdF9pMm8uYworKysgYi9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCkBAIC0xMjkwLDcgKzEyOTAsNyBAQAogCXVsb25nIGZsYWdzID0gMDsKIAlzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEgKnAxLCAqcDI7CiAJc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhICp3YWl0X2RhdGEgPQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEpLEdGUF9LRVJORUwpOworCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEpLCBHRlBfQVRPTUlDKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCWlmICghd2FpdF9kYXRhKQpAQCAtMjY0MCw2ICsyNjQwLDEzIEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlidXNfbm8gPSBidWZbMF0+PjE2OworCQkJaWYgKGJ1c19ubyA+PSBNQVhfQ0hBTk5FTCkgewkvKiBTb21ldGhpbmcgd3Jvbmcgc2tpcCBpdCAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIiVzOiBDaGFubmVsIG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIsCisJCQkJCXBIYmEtPm5hbWUsIGJ1c19ubyk7CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCXNjc2lfaWQgPSBidWZbMV07CiAJCQlzY3NpX2x1biA9IChidWZbMl0+PjggKSYweGZmOwogCQkJcERldiA9IHBIYmEtPmNoYW5uZWxbYnVzX25vXS5kZXZpY2Vbc2NzaV9pZF07CkBAIC0yNjUxLDcgKzI2NTgsOCBAQAogCQkJCXBEZXYgPSBwRGV2LT5uZXh0X2x1bjsKIAkJCX0KIAkJCWlmKCFwRGV2ICkgeyAvLyBTb21ldGhpbmcgbmV3IGFkZCBpdAotCQkJCWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSksIEdGUF9LRVJORUwpOworCQkJCWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSksCisJCQkJCSAgICBHRlBfQVRPTUlDKTsKIAkJCQlpZihkPT1OVUxMKQogCQkJCXsKIAkJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiT3V0IG9mIG1lbW9yeSBmb3IgSTJPIGRldmljZSBkYXRhLlxuIik7CkBAIC0yNjY3LDEzICsyNjc1LDExIEBACiAJCQkJYWRwdF9pMm9fcmVwb3J0X2hiYV91bml0KHBIYmEsIGQpOwogCQkJCWFkcHRfaTJvX2luc3RhbGxfZGV2aWNlKHBIYmEsIGQpOwogCQotCQkJCWlmKGJ1c19ubyA+PSBNQVhfQ0hBTk5FTCkgewkvLyBTb21ldGhpbmcgd3Jvbmcgc2tpcCBpdAotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDaGFubmVsIG51bWJlciAlZCBvdXQgb2YgcmFuZ2UgXG4iLCBwSGJhLT5uYW1lLCBidXNfbm8pOwotCQkJCQljb250aW51ZTsKLQkJCQl9CiAJCQkJcERldiA9IHBIYmEtPmNoYW5uZWxbYnVzX25vXS5kZXZpY2Vbc2NzaV9pZF07CQogCQkJCWlmKCBwRGV2ID09IE5VTEwpewotCQkJCQlwRGV2ID0gIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSksR0ZQX0tFUk5FTCk7CisJCQkJCXBEZXYgPQorCQkJCQkgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSksCisJCQkJCQkgIEdGUF9BVE9NSUMpOwogCQkJCQlpZihwRGV2ID09IE5VTEwpIHsKIAkJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCQl9CkBAIC0yNjgyLDcgKzI2ODgsOSBAQAogCQkJCQl3aGlsZSAocERldi0+bmV4dF9sdW4pIHsKIAkJCQkJCXBEZXYgPSBwRGV2LT5uZXh0X2x1bjsKIAkJCQkJfQotCQkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRwdF9kZXZpY2UpLEdGUF9LRVJORUwpOworCQkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW4gPQorCQkJCQkgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSksCisJCQkJCQkgIEdGUF9BVE9NSUMpOwogCQkJCQlpZihwRGV2ID09IE5VTEwpIHsKIAkJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCQl9CkBAIC0zMTI3LDcgKzMxMzUsNyBAQAogCQlpZiAocEhiYS0+bGN0ID09IE5VTEwpIHsKIAkJCXBIYmEtPmxjdCA9IGRtYV9hbGxvY19jb2hlcmVudCgmcEhiYS0+cERldi0+ZGV2LAogCQkJCQlwSGJhLT5sY3Rfc2l6ZSwgJnBIYmEtPmxjdF9wYSwKLQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkJCUdGUF9BVE9NSUMpOwogCQkJaWYocEhiYS0+bGN0ID09IE5VTEwpIHsKIAkJCQlwcmludGsoS0VSTl9DUklUICIlczogTGN0IEdldCBmYWlsZWQuIE91dCBvZiBtZW1vcnkuXG4iLAogCQkJCQlwSGJhLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYwppbmRleCA0NGEwNzU5Li44NDRkNjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCkBAIC0xMTcsOSArMTE3LDE0IEBACiAKIHN0YXRpYyB2b2lkIGZjb2VfZ2V0X2xlc2Ioc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBmY19lbHNfbGVzYiAqKTsKIAotbW9kdWxlX3BhcmFtX2NhbGwoY3JlYXRlLCBmY29lX2NyZWF0ZSwgTlVMTCwgTlVMTCwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fY2FsbChjcmVhdGUsIGZjb2VfY3JlYXRlLCBOVUxMLCAodm9pZCAqKUZJUF9NT0RFX0FVVE8sIFNfSVdVU1IpOwogX19NT0RVTEVfUEFSTV9UWVBFKGNyZWF0ZSwgInN0cmluZyIpOwogTU9EVUxFX1BBUk1fREVTQyhjcmVhdGUsICIgQ3JlYXRlcyBmY29lIGluc3RhbmNlIG9uIGEgZXRoZXJuZXQgaW50ZXJmYWNlIik7Cittb2R1bGVfcGFyYW1fY2FsbChjcmVhdGVfdm4ydm4sIGZjb2VfY3JlYXRlLCBOVUxMLAorCQkgICh2b2lkICopRklQX01PREVfVk4yVk4sIFNfSVdVU1IpOworX19NT0RVTEVfUEFSTV9UWVBFKGNyZWF0ZV92bjJ2biwgInN0cmluZyIpOworTU9EVUxFX1BBUk1fREVTQyhjcmVhdGVfdm4ydm4sICIgQ3JlYXRlcyBhIFZOX25vZGUgdG8gVk5fbm9kZSBGQ29FIGluc3RhbmNlICIKKwkJICJvbiBhbiBFdGhlcm5ldCBpbnRlcmZhY2UiKTsKIG1vZHVsZV9wYXJhbV9jYWxsKGRlc3Ryb3ksIGZjb2VfZGVzdHJveSwgTlVMTCwgTlVMTCwgU19JV1VTUik7CiBfX01PRFVMRV9QQVJNX1RZUEUoZGVzdHJveSwgInN0cmluZyIpOwogTU9EVUxFX1BBUk1fREVTQyhkZXN0cm95LCAiIERlc3Ryb3lzIGZjb2UgaW5zdGFuY2Ugb24gYSBldGhlcm5ldCBpbnRlcmZhY2UiKTsKQEAgLTMxNSw3ICszMjAsMTEgQEAKIAlkZXZfdWNfYWRkKG5ldGRldiwgZmxvZ2lfbWFkZHIpOwogCWlmIChmaXAtPnNwbWEpCiAJCWRldl91Y19hZGQobmV0ZGV2LCBmaXAtPmN0bF9zcmNfYWRkcik7Ci0JZGV2X21jX2FkZChuZXRkZXYsIEZJUF9BTExfRU5PREVfTUFDUyk7CisJaWYgKGZpcC0+bW9kZSA9PSBGSVBfTU9ERV9WTjJWTikgeworCQlkZXZfbWNfYWRkKG5ldGRldiwgRklQX0FMTF9WTjJWTl9NQUNTKTsKKwkJZGV2X21jX2FkZChuZXRkZXYsIEZJUF9BTExfUDJQX01BQ1MpOworCX0gZWxzZQorCQlkZXZfbWNfYWRkKG5ldGRldiwgRklQX0FMTF9FTk9ERV9NQUNTKTsKIAogCS8qCiAJICogc2V0dXAgdGhlIHJlY2VpdmUgZnVuY3Rpb24gZnJvbSBldGhlcm5ldCBkcml2ZXIKQEAgLTMzNywxMCArMzQ2LDEyIEBACiAvKioKICAqIGZjb2VfaW50ZXJmYWNlX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgRkNvRSBpbnRlcmZhY2Ugb24gYSBuZXQgZGV2aWNlCiAgKiBAbmV0ZGV2OiBUaGUgbmV0IGRldmljZSB0byBjcmVhdGUgdGhlIEZDb0UgaW50ZXJmYWNlIG9uCisgKiBAZmlwX21vZGU6IFRoZSBtb2RlIHRvIHVzZSBmb3IgRklQCiAgKgogICogUmV0dXJuczogcG9pbnRlciB0byBhIHN0cnVjdCBmY29lX2ludGVyZmFjZSBvciBOVUxMIG9uIGVycm9yCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2VfaW50ZXJmYWNlX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIHN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZV9pbnRlcmZhY2VfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCQkgICAgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpCiB7CiAJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lOwogCWludCBlcnI7CkBAIC0zNTcsNyArMzY4LDcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgRklQLgogCSAqLwotCWZjb2VfY3Rscl9pbml0KCZmY29lLT5jdGxyKTsKKwlmY29lX2N0bHJfaW5pdCgmZmNvZS0+Y3RsciwgZmlwX21vZGUpOwogCWZjb2UtPmN0bHIuc2VuZCA9IGZjb2VfZmlwX3NlbmQ7CiAJZmNvZS0+Y3Rsci51cGRhdGVfbWFjID0gZmNvZV91cGRhdGVfc3JjX21hYzsKIAlmY29lLT5jdGxyLmdldF9zcmNfYWRkciA9IGZjb2VfZ2V0X3NyY19tYWM7CkBAIC00MDEsNyArNDEyLDExIEBACiAJZGV2X3VjX2RlbChuZXRkZXYsIGZsb2dpX21hZGRyKTsKIAlpZiAoZmlwLT5zcG1hKQogCQlkZXZfdWNfZGVsKG5ldGRldiwgZmlwLT5jdGxfc3JjX2FkZHIpOwotCWRldl9tY19kZWwobmV0ZGV2LCBGSVBfQUxMX0VOT0RFX01BQ1MpOworCWlmIChmaXAtPm1vZGUgPT0gRklQX01PREVfVk4yVk4pIHsKKwkJZGV2X21jX2RlbChuZXRkZXYsIEZJUF9BTExfVk4yVk5fTUFDUyk7CisJCWRldl9tY19kZWwobmV0ZGV2LCBGSVBfQUxMX1AyUF9NQUNTKTsKKwl9IGVsc2UKKwkJZGV2X21jX2RlbChuZXRkZXYsIEZJUF9BTExfRU5PREVfTUFDUyk7CiAKIAkvKiBUZWxsIHRoZSBMTEQgd2UgYXJlIGRvbmUgdy8gRkNvRSAqLwogCW9wcyA9IG5ldGRldi0+bmV0ZGV2X29wczsKQEAgLTU3NCw2ICs1ODksNTAgQEAKIH0KIAogLyoqCisgKiBmY29lX25ldGRldl9mZWF0dXJlc19jaGFuZ2UgLSBVcGRhdGVzIHRoZSBscG9ydCdzIG9mZmxvYWQgZmxhZ3MgYmFzZWQKKyAqIG9uIHRoZSBMTEQgbmV0ZGV2J3MgRkNvRSBmZWF0dXJlIGZsYWdzCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfbmV0ZGV2X2ZlYXR1cmVzX2NoYW5nZShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cpCisJCWxwb3J0LT5zZ19zdXBwID0gMTsKKwllbHNlCisJCWxwb3J0LT5zZ19zdXBwID0gMDsKKworCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GQ09FX0NSQykgeworCQlscG9ydC0+Y3JjX29mZmxvYWQgPSAxOworCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiU3VwcG9ydHMgRkNDUkMgb2ZmbG9hZFxuIik7CisJfSBlbHNlIHsKKwkJbHBvcnQtPmNyY19vZmZsb2FkID0gMDsKKwl9CisKKwlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfRlNPKSB7CisJCWxwb3J0LT5zZXFfb2ZmbG9hZCA9IDE7CisJCWxwb3J0LT5sc29fbWF4ID0gbmV0ZGV2LT5nc29fbWF4X3NpemU7CisJCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJTdXBwb3J0cyBMU08gZm9yIG1heCBsZW4gMHgleFxuIiwKKwkJCQlscG9ydC0+bHNvX21heCk7CisJfSBlbHNlIHsKKwkJbHBvcnQtPnNlcV9vZmZsb2FkID0gMDsKKwkJbHBvcnQtPmxzb19tYXggPSAwOworCX0KKworCWlmIChuZXRkZXYtPmZjb2VfZGRwX3hpZCkgeworCQlscG9ydC0+bHJvX2VuYWJsZWQgPSAxOworCQlscG9ydC0+bHJvX3hpZCA9IG5ldGRldi0+ZmNvZV9kZHBfeGlkOworCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiU3VwcG9ydHMgTFJPIGZvciBtYXggeGlkIDB4JXhcbiIsCisJCQkJbHBvcnQtPmxyb194aWQpOworCX0gZWxzZSB7CisJCWxwb3J0LT5scm9fZW5hYmxlZCA9IDA7CisJCWxwb3J0LT5scm9feGlkID0gMDsKKwl9CisKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Cit9CisKKy8qKgogICogZmNvZV9uZXRkZXZfY29uZmlnKCkgLSBTZXQgdXAgbmV0IGRldml2ZSBmb3IgU1cgRkNvRQogICogQGxwb3J0OiAgVGhlIGxvY2FsIHBvcnQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBkZXZpY2UKICAqIEBuZXRkZXY6IFRoZSBhc3NvY2lhdGVkIG5ldCBkZXZpY2UKQEAgLTU4OCw3ICs2NDcsNiBAQAogCXU2NCB3d25uLCB3d3BuOwogCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwotCWludCB2aWQgPSAwOwogCiAJLyogU2V0dXAgbHBvcnQgcHJpdmF0ZSBkYXRhIHRvIHBvaW50IHRvIGZjb2Ugc29mdGMgKi8KIAlwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7CkBAIC02MDksMjUgKzY2Nyw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogb2ZmbG9hZCBmZWF0dXJlcyBzdXBwb3J0ICovCi0JaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKQotCQlscG9ydC0+c2dfc3VwcCA9IDE7CisJZmNvZV9uZXRkZXZfZmVhdHVyZXNfY2hhbmdlKGxwb3J0LCBuZXRkZXYpOwogCi0JaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0ZDT0VfQ1JDKSB7Ci0JCWxwb3J0LT5jcmNfb2ZmbG9hZCA9IDE7Ci0JCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJTdXBwb3J0cyBGQ0NSQyBvZmZsb2FkXG4iKTsKLQl9Ci0JaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0ZTTykgewotCQlscG9ydC0+c2VxX29mZmxvYWQgPSAxOwotCQlscG9ydC0+bHNvX21heCA9IG5ldGRldi0+Z3NvX21heF9zaXplOwotCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiU3VwcG9ydHMgTFNPIGZvciBtYXggbGVuIDB4JXhcbiIsCi0JCQkJbHBvcnQtPmxzb19tYXgpOwotCX0KLQlpZiAobmV0ZGV2LT5mY29lX2RkcF94aWQpIHsKLQkJbHBvcnQtPmxyb19lbmFibGVkID0gMTsKLQkJbHBvcnQtPmxyb194aWQgPSBuZXRkZXYtPmZjb2VfZGRwX3hpZDsKLQkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIlN1cHBvcnRzIExSTyBmb3IgbWF4IHhpZCAweCV4XG4iLAotCQkJCWxwb3J0LT5scm9feGlkKTsKLQl9CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcG9ydC0+ZmNvZV9wZW5kaW5nX3F1ZXVlKTsKIAlwb3J0LT5mY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlID0gMDsKIAlzZXR1cF90aW1lcigmcG9ydC0+dGltZXIsIGZjb2VfcXVldWVfdGltZXIsICh1bnNpZ25lZCBsb25nKWxwb3J0KTsKQEAgLTYzNSwyMCArNjc2LDEyIEBACiAJZmNvZV9saW5rX3NwZWVkX3VwZGF0ZShscG9ydCk7CiAKIAlpZiAoIWxwb3J0LT52cG9ydCkgewotCQkvKgotCQkgKiBVc2UgTkFBIDEmMiAoRkMtRlMgUmV2LiAyLjAsIFNlYy4gMTUpIHRvIGdlbmVyYXRlIFdXTk4vV1dQTjoKLQkJICogRm9yIFdXTk4sIHdlIHVzZSBOQUEgMSB3LyBiaXQgMjctMTYgb2Ygd29yZCAwIGFzIDAuCi0JCSAqIEZvciBXV1BOLCB3ZSB1c2UgTkFBIDIgdy8gYml0IDI3LTE2IG9mIHdvcmQgMCBmcm9tIFZMQU4gSUQKLQkJICovCi0JCWlmIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCi0JCQl2aWQgPSB2bGFuX2Rldl92bGFuX2lkKG5ldGRldik7Ci0KIAkJaWYgKGZjb2VfZ2V0X3d3bihuZXRkZXYsICZ3d25uLCBORVRERVZfRkNPRV9XV05OKSkKIAkJCXd3bm4gPSBmY29lX3d3bl9mcm9tX21hYyhmY29lLT5jdGxyLmN0bF9zcmNfYWRkciwgMSwgMCk7CiAJCWZjX3NldF93d25uKGxwb3J0LCB3d25uKTsKIAkJaWYgKGZjb2VfZ2V0X3d3bihuZXRkZXYsICZ3d3BuLCBORVRERVZfRkNPRV9XV1BOKSkKIAkJCXd3cG4gPSBmY29lX3d3bl9mcm9tX21hYyhmY29lLT5jdGxyLmN0bF9zcmNfYWRkciwKLQkJCQkJCSAyLCB2aWQpOworCQkJCQkJIDIsIDApOwogCQlmY19zZXRfd3dwbihscG9ydCwgd3dwbik7CiAJfQogCkBAIC05NjcsNyArMTAwMCw3IEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLwotCXJjID0gZmNvZV9saWJmY19jb25maWcobHBvcnQsICZmY29lX2xpYmZjX2Zjbl90ZW1wbCk7CisJcmMgPSBmY29lX2xpYmZjX2NvbmZpZyhscG9ydCwgJmZjb2UtPmN0bHIsICZmY29lX2xpYmZjX2Zjbl90ZW1wbCwgMSk7CiAJaWYgKHJjKSB7CiAJCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJDb3VsZCBub3QgY29uZmlndXJlIGxpYmZjIGZvciB0aGUgIgogCQkJCSJpbnRlcmZhY2VcbiIpOwpAQCAtMTIxMCw2ICsxMjQzLDggQEAKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJc3RydWN0IGZjb2VfcGVyY3B1X3MgKmZwczsKKwlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OworCXN0cnVjdCBldGhoZHIgKmVoOwogCXVuc2lnbmVkIGludCBjcHU7CiAKIAlmY29lID0gY29udGFpbmVyX29mKHB0eXBlLCBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UsIGZjb2VfcGFja2V0X3R5cGUpOwpAQCAtMTIyNyw5ICsxMjYyLDIxIEBACiAJCQlza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLAogCQkJc2tiLT5jc3VtLCBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIjxOVUxMPiIpOwogCi0JLyogY2hlY2sgZm9yIEZDT0UgcGFja2V0IHR5cGUgKi8KLQlpZiAodW5saWtlbHkoZXRoX2hkcihza2IpLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0ZDT0UpKSkgewotCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiV3JvbmcgRkMgdHlwZSBmcmFtZSIpOworCS8qIGNoZWNrIGZvciBtYWMgYWRkcmVzc2VzICovCisJZWggPSBldGhfaGRyKHNrYik7CisJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOworCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoZWgtPmhfZGVzdCwgcG9ydC0+ZGF0YV9zcmNfYWRkcikgJiYKKwkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGVoLT5oX2Rlc3QsIGZjb2UtPmN0bHIuY3RsX3NyY19hZGRyKSAmJgorCSAgICBjb21wYXJlX2V0aGVyX2FkZHIoZWgtPmhfZGVzdCwgKHU4WzZdKUZDX0ZDT0VfRkxPR0lfTUFDKSkgeworCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAid3JvbmcgZGVzdGluYXRpb24gbWFjIGFkZHJlc3M6JXBNXG4iLAorCQkJCWVoLT5oX2Rlc3QpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoaXNfZmlwX21vZGUoJmZjb2UtPmN0bHIpICYmCisJICAgIGNvbXBhcmVfZXRoZXJfYWRkcihlaC0+aF9zb3VyY2UsIGZjb2UtPmN0bHIuZGVzdF9hZGRyKSkgeworCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAid3Jvbmcgc291cmNlIG1hYyBhZGRyZXNzOiVwTVxuIiwKKwkJCQllaC0+aF9zb3VyY2UpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTE1MTIsMTEgKzE1NTksOSBAQAogCS8qIGZpbGwgdXAgbWFjIGFuZCBmY29lIGhlYWRlcnMgKi8KIAllaCA9IGV0aF9oZHIoc2tiKTsKIAllaC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0ZDT0UpOworCW1lbWNweShlaC0+aF9kZXN0LCBmY29lLT5jdGxyLmRlc3RfYWRkciwgRVRIX0FMRU4pOwogCWlmIChmY29lLT5jdGxyLm1hcF9kZXN0KQotCQlmY19mY29lX3NldF9tYWMoZWgtPmhfZGVzdCwgZmgtPmZoX2RfaWQpOwotCWVsc2UKLQkJLyogaW5zZXJ0IEdXIGFkZHJlc3MgKi8KLQkJbWVtY3B5KGVoLT5oX2Rlc3QsIGZjb2UtPmN0bHIuZGVzdF9hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShlaC0+aF9kZXN0ICsgMywgZmgtPmZoX2RfaWQsIDMpOwogCiAJaWYgKHVubGlrZWx5KGZjb2UtPmN0bHIuZmxvZ2lfb3hpZCAhPSBGQ19YSURfVU5LTk9XTikpCiAJCW1lbWNweShlaC0+aF9zb3VyY2UsIGZjb2UtPmN0bHIuY3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CkBAIC0xODM0LDYgKzE4NzksOSBAQAogCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5kZXN0cm95X3dvcmspOwogCQlnb3RvIG91dDsKIAkJYnJlYWs7CisJY2FzZSBORVRERVZfRkVBVF9DSEFOR0U6CisJCWZjb2VfbmV0ZGV2X2ZlYXR1cmVzX2NoYW5nZShscG9ydCwgbmV0ZGV2KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIlVua25vd24gZXZlbnQgJWxkICIKIAkJCQkiZnJvbSBuZXRkZXYgbmV0bGlua1xuIiwgZXZlbnQpOwpAQCAtMTkxOCw4ICsxOTY2LDggQEAKIAlydG5sX3VubG9jaygpOwogCiAJaWYgKGZjb2UpIHsKLQkJZmNfZmFicmljX2xvZ29mZihmY29lLT5jdGxyLmxwKTsKIAkJZmNvZV9jdGxyX2xpbmtfZG93bigmZmNvZS0+Y3Rscik7CisJCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShmY29lLT5jdGxyLmxwKTsKIAl9IGVsc2UKIAkJcmMgPSAtRU5PREVWOwogCkBAIC0xOTcyLDEyICsyMDIwLDEwIEBACiAJZmNvZSA9IGZjb2VfaG9zdGxpc3RfbG9va3VwX3BvcnQobmV0ZGV2KTsKIAlydG5sX3VubG9jaygpOwogCi0JaWYgKGZjb2UpIHsKLQkJaWYgKCFmY29lX2xpbmtfb2soZmNvZS0+Y3Rsci5scCkpCi0JCQlmY29lX2N0bHJfbGlua191cCgmZmNvZS0+Y3Rscik7Ci0JCXJjID0gZmNfZmFicmljX2xvZ2luKGZjb2UtPmN0bHIubHApOwotCX0gZWxzZQorCWlmICghZmNvZSkKIAkJcmMgPSAtRU5PREVWOworCWVsc2UgaWYgKCFmY29lX2xpbmtfb2soZmNvZS0+Y3Rsci5scCkpCisJCWZjb2VfY3Rscl9saW5rX3VwKCZmY29lLT5jdGxyKTsKIAogCWRldl9wdXQobmV0ZGV2KTsKIG91dF9ub2RldjoKQEAgLTIwMzEsOCArMjA3Nyw4IEBACiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBvdXRfcHV0ZGV2OwogCX0KLQlsaXN0X2RlbCgmZmNvZS0+bGlzdCk7CiAJZmNvZV9pbnRlcmZhY2VfY2xlYW51cChmY29lKTsKKwlsaXN0X2RlbCgmZmNvZS0+bGlzdCk7CiAJLyogUlROTCBtdXRleCBpcyBkcm9wcGVkIGJ5IGZjb2VfaWZfZGVzdHJveSAqLwogCWZjb2VfaWZfZGVzdHJveShmY29lLT5jdGxyLmxwKTsKIApAQCAtMjA3MCw2ICsyMTE2LDcgQEAKICAqLwogc3RhdGljIGludCBmY29lX2NyZWF0ZShjb25zdCBjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogeworCWVudW0gZmlwX3N0YXRlIGZpcF9tb2RlID0gKGVudW0gZmlwX3N0YXRlKShsb25nKWtwLT5hcmc7CiAJaW50IHJjOwogCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZTsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwpAQCAtMjExMSw3ICsyMTU4LDcgQEAKIAkJZ290byBvdXRfcHV0ZGV2OwogCX0KIAotCWZjb2UgPSBmY29lX2ludGVyZmFjZV9jcmVhdGUobmV0ZGV2KTsKKwlmY29lID0gZmNvZV9pbnRlcmZhY2VfY3JlYXRlKG5ldGRldiwgZmlwX21vZGUpOwogCWlmICghZmNvZSkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3B1dGRldjsKQEAgLTI0NTIsNyArMjQ5OSw3IEBACiAgKiBAZnA6IHJlc3BvbnNlIGZyYW1lLCBvciBlcnJvciBlbmNvZGVkIGluIGEgcG9pbnRlciAodGltZW91dCkKICAqIEBhcmc6IHBvaW50ZXIgdGhlIHRoZSBmY29lX2N0bHIgc3RydWN0dXJlCiAgKgotICogVGhpcyBoYW5kbGVzIE1BQyBhZGRyZXNzIG1hbmFnbWVudCBmb3IgRkNvRSwgdGhlbiBwYXNzZXMgY29udHJvbCBvbiB0bworICogVGhpcyBoYW5kbGVzIE1BQyBhZGRyZXNzIG1hbmFnZW1lbnQgZm9yIEZDb0UsIHRoZW4gcGFzc2VzIGNvbnRyb2wgb24gdG8KICAqIHRoZSBsaWJmYyBGTE9HSSByZXNwb25zZSBoYW5kbGVyLgogICovCiBzdGF0aWMgdm9pZCBmY29lX2Zsb2dpX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc2VxLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLCB2b2lkICphcmcpCkBAIC0yNDg0LDcgKzI1MzEsNyBAQAogICogQGZwOiByZXNwb25zZSBmcmFtZSwgb3IgZXJyb3IgZW5jb2RlZCBpbiBhIHBvaW50ZXIgKHRpbWVvdXQpCiAgKiBAYXJnOiBwb2ludGVyIHRoZSB0aGUgZmNvZV9jdGxyIHN0cnVjdHVyZQogICoKLSAqIFRoaXMgaGFuZGxlcyBNQUMgYWRkcmVzcyBtYW5hZ21lbnQgZm9yIEZDb0UsIHRoZW4gcGFzc2VzIGNvbnRyb2wgb24gdG8KKyAqIFRoaXMgaGFuZGxlcyBNQUMgYWRkcmVzcyBtYW5hZ2VtZW50IGZvciBGQ29FLCB0aGVuIHBhc3NlcyBjb250cm9sIG9uIHRvCiAgKiB0aGUgbGliZmMgTE9HTyByZXNwb25zZSBoYW5kbGVyLgogICovCiBzdGF0aWMgdm9pZCBmY29lX2xvZ29fcmVzcChzdHJ1Y3QgZmNfc2VxICpzZXEsIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZykKQEAgLTI1MjEsNiArMjU2OCw4IEBACiAJc3dpdGNoIChvcCkgewogCWNhc2UgRUxTX0ZMT0dJOgogCWNhc2UgRUxTX0ZESVNDOgorCQlpZiAobHBvcnQtPnBvaW50X3RvX211bHRpcG9pbnQpCisJCQlicmVhazsKIAkJcmV0dXJuIGZjX2Vsc2N0X3NlbmQobHBvcnQsIGRpZCwgZnAsIG9wLCBmY29lX2Zsb2dpX3Jlc3AsCiAJCQkJICAgICBmaXAsIHRpbWVvdXQpOwogCWNhc2UgRUxTX0xPR086CkBAIC0yNjUzLDYgKzI3MDIsNyBAQAogCXUzMiBsZmMsIHZsZmMsIG1kYWM7CiAJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpkZXZzdDsKIAlzdHJ1Y3QgZmNvZV9mY19lbHNfbGVzYiAqbGVzYjsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZmNvZV9uZXRkZXYobHBvcnQpOwogCiAJbGZjID0gMDsKQEAgLTI2NjksNyArMjcxOSw3IEBACiAJbGVzYi0+bGVzYl9saW5rX2ZhaWwgPSBodG9ubChsZmMpOwogCWxlc2ItPmxlc2JfdmxpbmtfZmFpbCA9IGh0b25sKHZsZmMpOwogCWxlc2ItPmxlc2JfbWlzc19ma2EgPSBodG9ubChtZGFjKTsKLQlsZXNiLT5sZXNiX2Zjc19lcnJvciA9IGh0b25sKGRldl9nZXRfc3RhdHMobmV0ZGV2KS0+cnhfY3JjX2Vycm9ycyk7CisJbGVzYi0+bGVzYl9mY3NfZXJyb3IgPSBodG9ubChkZXZfZ2V0X3N0YXRzKG5ldGRldiwgJnRlbXApLT5yeF9jcmNfZXJyb3JzKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNvZS9saWJmY29lLmMgYi9kcml2ZXJzL3Njc2kvZmNvZS9saWJmY29lLmMKaW5kZXggNTBhYWE0Yi4uYWE1MDNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvbGliZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2xpYmZjb2UuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmlwLmg+CiAjaW5jbHVkZSA8c2NzaS9mYy9mY19lbmNhcHMuaD4KICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2Zjb2UuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjcC5oPgogCiAjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgogI2luY2x1ZGUgPHNjc2kvbGliZmNvZS5oPgpAQCAtNTQsNyArNTUsMTUgQEAKIHN0YXRpYyB2b2lkIGZjb2VfY3Rscl90aW1lcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIGZjb2VfY3Rscl9yZWN2X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfdm5fc3RhcnQoc3RydWN0IGZjb2VfY3RsciAqKTsKK3N0YXRpYyBpbnQgZmNvZV9jdGxyX3ZuX3JlY3Yoc3RydWN0IGZjb2VfY3RsciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl92bl90aW1lb3V0KHN0cnVjdCBmY29lX2N0bHIgKik7CitzdGF0aWMgaW50IGZjb2VfY3Rscl92bl9sb29rdXAoc3RydWN0IGZjb2VfY3RsciAqLCB1MzIsIHU4ICopOworCiBzdGF0aWMgdTggZmNvZV9hbGxfZmNmc1tFVEhfQUxFTl0gPSBGSVBfQUxMX0ZDRl9NQUNTOworc3RhdGljIHU4IGZjb2VfYWxsX2Vub2RlW0VUSF9BTEVOXSA9IEZJUF9BTExfRU5PREVfTUFDUzsKK3N0YXRpYyB1OCBmY29lX2FsbF92bjJ2bltFVEhfQUxFTl0gPSBGSVBfQUxMX1ZOMlZOX01BQ1M7CitzdGF0aWMgdTggZmNvZV9hbGxfcDJwW0VUSF9BTEVOXSA9IEZJUF9BTExfUDJQX01BQ1M7CiAKIHVuc2lnbmVkIGludCBsaWJmY29lX2RlYnVnX2xvZ2dpbmc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbG9nZ2luZywgbGliZmNvZV9kZWJ1Z19sb2dnaW5nLCBpbnQsIFNfSVJVR098U19JV1VTUik7CkBAIC04MCw2ICs4OSw0NSBAQAogCQkJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCVkOiBmaXA6ICIgZm10LCAJXAogCQkJCSAgICAgKGZpcCktPmxwLT5ob3N0LT5ob3N0X25vLCAjI2FyZ3MpOykKIAorc3RhdGljIGNvbnN0IGNoYXIgKmZjb2VfY3Rscl9zdGF0ZXNbXSA9IHsKKwlbRklQX1NUX0RJU0FCTEVEXSA9CSJESVNBQkxFRCIsCisJW0ZJUF9TVF9MSU5LX1dBSVRdID0JIkxJTktfV0FJVCIsCisJW0ZJUF9TVF9BVVRPXSA9CQkiQVVUTyIsCisJW0ZJUF9TVF9OT05fRklQXSA9CSJOT05fRklQIiwKKwlbRklQX1NUX0VOQUJMRURdID0JIkVOQUJMRUQiLAorCVtGSVBfU1RfVk5NUF9TVEFSVF0gPQkiVk5NUF9TVEFSVCIsCisJW0ZJUF9TVF9WTk1QX1BST0JFMV0gPQkiVk5NUF9QUk9CRTEiLAorCVtGSVBfU1RfVk5NUF9QUk9CRTJdID0JIlZOTVBfUFJPQkUyIiwKKwlbRklQX1NUX1ZOTVBfQ0xBSU1dID0JIlZOTVBfQ0xBSU0iLAorCVtGSVBfU1RfVk5NUF9VUF0gPQkiVk5NUF9VUCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZmNvZV9jdGxyX3N0YXRlKGVudW0gZmlwX3N0YXRlIHN0YXRlKQoreworCWNvbnN0IGNoYXIgKmNwID0gInVua25vd24iOworCisJaWYgKHN0YXRlIDwgQVJSQVlfU0laRShmY29lX2N0bHJfc3RhdGVzKSkKKwkJY3AgPSBmY29lX2N0bHJfc3RhdGVzW3N0YXRlXTsKKwlpZiAoIWNwKQorCQljcCA9ICJ1bmtub3duIjsKKwlyZXR1cm4gY3A7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3NldF9zdGF0ZSgpIC0gU2V0IGFuZCBkbyBkZWJ1ZyBwcmludGluZyBmb3IgdGhlIG5ldyBGSVAgc3RhdGUuCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKiBAc3RhdGU6IFRoZSBuZXcgc3RhdGUKKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3NldF9zdGF0ZShzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsIGVudW0gZmlwX3N0YXRlIHN0YXRlKQoreworCWlmIChzdGF0ZSA9PSBmaXAtPnN0YXRlKQorCQlyZXR1cm47CisJaWYgKGZpcC0+bHApCisJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJzdGF0ZSAlcyAtPiAlc1xuIiwKKwkJCWZjb2VfY3Rscl9zdGF0ZShmaXAtPnN0YXRlKSwgZmNvZV9jdGxyX3N0YXRlKHN0YXRlKSk7CisJZmlwLT5zdGF0ZSA9IHN0YXRlOworfQorCiAvKioKICAqIGZjb2VfY3Rscl9tdHVfdmFsaWQoKSAtIENoZWNrIGlmIGEgRkNGJ3MgTVRVIGlzIHZhbGlkCiAgKiBAZmNmOiBUaGUgRkNGIHRvIGNoZWNrCkBAIC0xMDUsMTUgKzE1MywyOSBAQAogfQogCiAvKioKKyAqIGZjb2VfY3Rscl9tYXBfZGVzdCgpIC0gU2V0IGZsYWcgYW5kIE9VSSBmb3IgbWFwcGluZyBkZXN0aW5hdGlvbiBhZGRyZXNzZXMKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX21hcF9kZXN0KHN0cnVjdCBmY29lX2N0bHIgKmZpcCkKK3sKKwlpZiAoZmlwLT5tb2RlID09IEZJUF9NT0RFX1ZOMlZOKQorCQlodG9uMjQoZmlwLT5kZXN0X2FkZHIsIEZJUF9WTl9GQ19NQVApOworCWVsc2UKKwkJaHRvbjI0KGZpcC0+ZGVzdF9hZGRyLCBGSVBfREVGX0ZDX01BUCk7CisJaHRvbjI0KGZpcC0+ZGVzdF9hZGRyICsgMywgMCk7CisJZmlwLT5tYXBfZGVzdCA9IDE7Cit9CisKKy8qKgogICogZmNvZV9jdGxyX2luaXQoKSAtIEluaXRpYWxpemUgdGhlIEZDb0UgQ29udHJvbGxlciBpbnN0YW5jZQogICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlciB0byBpbml0aWFsaXplCiAgKi8KLXZvaWQgZmNvZV9jdGxyX2luaXQoc3RydWN0IGZjb2VfY3RsciAqZmlwKQordm9pZCBmY29lX2N0bHJfaW5pdChzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsIGVudW0gZmlwX3N0YXRlIG1vZGUpCiB7Ci0JZmlwLT5zdGF0ZSA9IEZJUF9TVF9MSU5LX1dBSVQ7Ci0JZmlwLT5tb2RlID0gRklQX1NUX0FVVE87CisJZmNvZV9jdGxyX3NldF9zdGF0ZShmaXAsIEZJUF9TVF9MSU5LX1dBSVQpOworCWZpcC0+bW9kZSA9IG1vZGU7CiAJSU5JVF9MSVNUX0hFQUQoJmZpcC0+ZmNmcyk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmZpcC0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZmlwLT5jdGxyX211dGV4KTsKIAlmaXAtPmZsb2dpX294aWQgPSBGQ19YSURfVU5LTk9XTjsKIAlzZXR1cF90aW1lcigmZmlwLT50aW1lciwgZmNvZV9jdGxyX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKWZpcCk7CiAJSU5JVF9XT1JLKCZmaXAtPnRpbWVyX3dvcmssIGZjb2VfY3Rscl90aW1lcl93b3JrKTsKQEAgLTE1OSwxMCArMjIxLDEwIEBACiAJY2FuY2VsX3dvcmtfc3luYygmZmlwLT5yZWN2X3dvcmspOwogCXNrYl9xdWV1ZV9wdXJnZSgmZmlwLT5maXBfcmVjdl9saXN0KTsKIAotCXNwaW5fbG9ja19iaCgmZmlwLT5sb2NrKTsKLQlmaXAtPnN0YXRlID0gRklQX1NUX0RJU0FCTEVEOworCW11dGV4X2xvY2soJmZpcC0+Y3Rscl9tdXRleCk7CisJZmNvZV9jdGxyX3NldF9zdGF0ZShmaXAsIEZJUF9TVF9ESVNBQkxFRCk7CiAJZmNvZV9jdGxyX3Jlc2V0X2ZjZnMoZmlwKTsKLQlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiAJZGVsX3RpbWVyX3N5bmMoJmZpcC0+dGltZXIpOwogCWNhbmNlbF93b3JrX3N5bmMoJmZpcC0+dGltZXJfd29yayk7CiB9CkBAIC0yNTUsMTkgKzMxNywzMyBAQAogICovCiB2b2lkIGZjb2VfY3Rscl9saW5rX3VwKHN0cnVjdCBmY29lX2N0bHIgKmZpcCkKIHsKLQlzcGluX2xvY2tfYmgoJmZpcC0+bG9jayk7CisJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAlpZiAoZmlwLT5zdGF0ZSA9PSBGSVBfU1RfTk9OX0ZJUCB8fCBmaXAtPnN0YXRlID09IEZJUF9TVF9BVVRPKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOworCQltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiAJCWZjX2xpbmt1cChmaXAtPmxwKTsKIAl9IGVsc2UgaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX0xJTktfV0FJVCkgewotCQlmaXAtPnN0YXRlID0gZmlwLT5tb2RlOwotCQlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKLQkJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX0FVVE8pCisJCWZjb2VfY3Rscl9zZXRfc3RhdGUoZmlwLCBmaXAtPm1vZGUpOworCQlzd2l0Y2ggKGZpcC0+bW9kZSkgeworCQlkZWZhdWx0OgorCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgImludmFsaWQgbW9kZSAlZFxuIiwgZmlwLT5tb2RlKTsKKwkJCS8qIGZhbGwtdGhyb3VnaCAqLworCQljYXNlIEZJUF9NT0RFX0FVVE86CiAJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAiJXMiLCAic2V0dGluZyBBVVRPIG1vZGUuXG4iKTsKLQkJZmNfbGlua3VwKGZpcC0+bHApOwotCQlmY29lX2N0bHJfc29saWNpdChmaXAsIE5VTEwpOworCQkJLyogZmFsbC10aHJvdWdoICovCisJCWNhc2UgRklQX01PREVfRkFCUklDOgorCQljYXNlIEZJUF9NT0RFX05PTl9GSVA6CisJCQltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CisJCQlmY19saW5rdXAoZmlwLT5scCk7CisJCQlmY29lX2N0bHJfc29saWNpdChmaXAsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgRklQX01PREVfVk4yVk46CisJCQlmY29lX2N0bHJfdm5fc3RhcnQoZmlwKTsKKwkJCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKKwkJCWZjX2xpbmt1cChmaXAtPmxwKTsKKwkJCWJyZWFrOworCQl9CiAJfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOworCQltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKGZjb2VfY3Rscl9saW5rX3VwKTsKIApAQCAtMjgzLDcgKzM1OSw3IEBACiAJZmlwLT5wb3J0X2thX3RpbWUgPSAwOwogCWZpcC0+c29sX3RpbWUgPSAwOwogCWZpcC0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOwotCWZpcC0+bWFwX2Rlc3QgPSAwOworCWZjb2VfY3Rscl9tYXBfZGVzdChmaXApOwogfQogCiAvKioKQEAgLTMwMCwxMSArMzc2LDExIEBACiAJaW50IGxpbmtfZHJvcHBlZDsKIAogCUxJQkZDT0VfRklQX0RCRyhmaXAsICJsaW5rIGRvd24uXG4iKTsKLQlzcGluX2xvY2tfYmgoJmZpcC0+bG9jayk7CisJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAlmY29lX2N0bHJfcmVzZXQoZmlwKTsKIAlsaW5rX2Ryb3BwZWQgPSBmaXAtPnN0YXRlICE9IEZJUF9TVF9MSU5LX1dBSVQ7Ci0JZmlwLT5zdGF0ZSA9IEZJUF9TVF9MSU5LX1dBSVQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJmZpcC0+bG9jayk7CisJZmNvZV9jdGxyX3NldF9zdGF0ZShmaXAsIEZJUF9TVF9MSU5LX1dBSVQpOworCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAogCWlmIChsaW5rX2Ryb3BwZWQpCiAJCWZjX2xpbmtkb3duKGZpcC0+bHApOwpAQCAtMzQzLDcgKzQxOSw3IEBACiAKIAlmY2YgPSBmaXAtPnNlbF9mY2Y7CiAJbHAgPSBmaXAtPmxwOwotCWlmICghZmNmIHx8ICFscC0+cG9ydF9pZCkKKwlpZiAoIWZjZiB8fCAocG9ydHMgJiYgIWxwLT5wb3J0X2lkKSkKIAkJcmV0dXJuOwogCiAJbGVuID0gc2l6ZW9mKCprYWwpICsgcG9ydHMgKiBzaXplb2YoKnZuKTsKQEAgLTM4OSw2ICs0NjUsNyBAQAogICogQGZpcDogICBUaGUgRkNvRSBjb250cm9sbGVyIGZvciB0aGUgRUxTIGZyYW1lCiAgKiBAZHR5cGU6IFRoZSBGSVAgZGVzY3JpcHRvciB0eXBlIGZvciB0aGUgZnJhbWUKICAqIEBza2I6ICAgVGhlIEZDb0UgRUxTIGZyYW1lIGluY2x1ZGluZyBGQyBoZWFkZXIgYnV0IG5vIEZDb0UgaGVhZGVycworICogQGRfaWQ6ICBUaGUgZGVzdGluYXRpb24gcG9ydCBJRC4KICAqCiAgKiBSZXR1cm5zIG5vbi16ZXJvIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqCkBAIC0zOTksNTggKzQ3Niw3NSBAQAogICogRXRoZXJuZXQgaGVhZGVyLiAgVGhlIHRhaWxyb29tIGlzIGZvciB0aGUgRklQIE1BQyBkZXNjcmlwdG9yLgogICovCiBzdGF0aWMgaW50IGZjb2VfY3Rscl9lbmNhcHMoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAotCQkJICAgIHU4IGR0eXBlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJICAgIHU4IGR0eXBlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZF9pZCkKIHsKIAlzdHJ1Y3QgZmlwX2VuY2Fwc19oZWFkIHsKIAkJc3RydWN0IGV0aGhkciBldGg7CiAJCXN0cnVjdCBmaXBfaGVhZGVyIGZpcDsKIAkJc3RydWN0IGZpcF9lbmNhcHMgZW5jYXBzOwogCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKmNhcDsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmlwX21hY19kZXNjICptYWM7CiAJc3RydWN0IGZjb2VfZmNmICpmY2Y7CiAJc2l6ZV90IGRsZW47CiAJdTE2IGZpcF9mbGFnczsKKwl1OCBvcDsKIAotCWZjZiA9IGZpcC0+c2VsX2ZjZjsKLQlpZiAoIWZjZikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBzZXQgZmxhZ3MgYWNjb3JkaW5nIHRvIGJvdGggRkNGIGFuZCBscG9ydCdzIGNhcGFiaWxpdHkgb24gU1BNQSAqLwotCWZpcF9mbGFncyA9IGZjZi0+ZmxhZ3M7Ci0JZmlwX2ZsYWdzICY9IGZpcC0+c3BtYSA/IEZJUF9GTF9TUE1BIHwgRklQX0ZMX0ZQTUEgOiBGSVBfRkxfRlBNQTsKLQlpZiAoIWZpcF9mbGFncykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KKwlmaCA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopc2tiLT5kYXRhOworCW9wID0gKih1OCAqKShmaCArIDEpOwogCWRsZW4gPSBzaXplb2Yoc3RydWN0IGZpcF9lbmNhcHMpICsgc2tiLT5sZW47CS8qIGxlbiBiZWZvcmUgcHVzaCAqLwogCWNhcCA9IChzdHJ1Y3QgZmlwX2VuY2Fwc19oZWFkICopc2tiX3B1c2goc2tiLCBzaXplb2YoKmNhcCkpOwotCiAJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKLQltZW1jcHkoY2FwLT5ldGguaF9kZXN0LCBmY2YtPmZjZl9tYWMsIEVUSF9BTEVOKTsKKworCWlmIChscG9ydC0+cG9pbnRfdG9fbXVsdGlwb2ludCkgeworCQlpZiAoZmNvZV9jdGxyX3ZuX2xvb2t1cChmaXAsIGRfaWQsIGNhcC0+ZXRoLmhfZGVzdCkpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZmlwX2ZsYWdzID0gMDsKKwl9IGVsc2UgeworCQlmY2YgPSBmaXAtPnNlbF9mY2Y7CisJCWlmICghZmNmKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWZpcF9mbGFncyA9IGZjZi0+ZmxhZ3M7CisJCWZpcF9mbGFncyAmPSBmaXAtPnNwbWEgPyBGSVBfRkxfU1BNQSB8IEZJUF9GTF9GUE1BIDoKKwkJCQkJIEZJUF9GTF9GUE1BOworCQlpZiAoIWZpcF9mbGFncykKKwkJCXJldHVybiAtRU5PREVWOworCQltZW1jcHkoY2FwLT5ldGguaF9kZXN0LCBmY2YtPmZjZl9tYWMsIEVUSF9BTEVOKTsKKwl9CiAJbWVtY3B5KGNhcC0+ZXRoLmhfc291cmNlLCBmaXAtPmN0bF9zcmNfYWRkciwgRVRIX0FMRU4pOwogCWNhcC0+ZXRoLmhfcHJvdG8gPSBodG9ucyhFVEhfUF9GSVApOwogCiAJY2FwLT5maXAuZmlwX3ZlciA9IEZJUF9WRVJfRU5DQVBTKEZJUF9WRVIpOwogCWNhcC0+ZmlwLmZpcF9vcCA9IGh0b25zKEZJUF9PUF9MUyk7Ci0JY2FwLT5maXAuZmlwX3N1YmNvZGUgPSBGSVBfU0NfUkVROwotCWNhcC0+ZmlwLmZpcF9kbF9sZW4gPSBodG9ucygoZGxlbiArIHNpemVvZigqbWFjKSkgLyBGSVBfQlBXKTsKKwlpZiAob3AgPT0gRUxTX0xTX0FDQyB8fCBvcCA9PSBFTFNfTFNfUkpUKQorCQljYXAtPmZpcC5maXBfc3ViY29kZSA9IEZJUF9TQ19SRVA7CisJZWxzZQorCQljYXAtPmZpcC5maXBfc3ViY29kZSA9IEZJUF9TQ19SRVE7CiAJY2FwLT5maXAuZmlwX2ZsYWdzID0gaHRvbnMoZmlwX2ZsYWdzKTsKIAogCWNhcC0+ZW5jYXBzLmZkX2Rlc2MuZmlwX2R0eXBlID0gZHR5cGU7CiAJY2FwLT5lbmNhcHMuZmRfZGVzYy5maXBfZGxlbiA9IGRsZW4gLyBGSVBfQlBXOwogCi0JbWFjID0gKHN0cnVjdCBmaXBfbWFjX2Rlc2MgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCptYWMpKTsKLQltZW1zZXQobWFjLCAwLCBzaXplb2YoKm1hYykpOwotCW1hYy0+ZmRfZGVzYy5maXBfZHR5cGUgPSBGSVBfRFRfTUFDOwotCW1hYy0+ZmRfZGVzYy5maXBfZGxlbiA9IHNpemVvZigqbWFjKSAvIEZJUF9CUFc7Ci0JaWYgKGR0eXBlICE9IEZJUF9EVF9GTE9HSSAmJiBkdHlwZSAhPSBGSVBfRFRfRkRJU0MpIHsKLQkJbWVtY3B5KG1hYy0+ZmRfbWFjLCBmaXAtPmdldF9zcmNfYWRkcihscG9ydCksIEVUSF9BTEVOKTsKLQl9IGVsc2UgaWYgKGZpcF9mbGFncyAmIEZJUF9GTF9TUE1BKSB7Ci0JCUxJQkZDT0VfRklQX0RCRyhmaXAsICJGTE9HSS9GRElTQyBzZW50IHdpdGggU1BNQVxuIik7Ci0JCW1lbWNweShtYWMtPmZkX21hYywgZmlwLT5jdGxfc3JjX2FkZHIsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAiRkxPR0kvRkRJU0Mgc2VudCB3aXRoIEZQTUFcbiIpOwotCQkvKiBGUE1BIG9ubHkgRkxPR0kgbXVzdCBsZWF2ZSB0aGUgTUFDIGRlc2Mgc2V0IHRvIGFsbCAwcyAqLworCWlmIChvcCAhPSBFTFNfTFNfUkpUKSB7CisJCWRsZW4gKz0gc2l6ZW9mKCptYWMpOworCQltYWMgPSAoc3RydWN0IGZpcF9tYWNfZGVzYyAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKm1hYykpOworCQltZW1zZXQobWFjLCAwLCBzaXplb2YoKm1hYykpOworCQltYWMtPmZkX2Rlc2MuZmlwX2R0eXBlID0gRklQX0RUX01BQzsKKwkJbWFjLT5mZF9kZXNjLmZpcF9kbGVuID0gc2l6ZW9mKCptYWMpIC8gRklQX0JQVzsKKwkJaWYgKGR0eXBlICE9IEZJUF9EVF9GTE9HSSAmJiBkdHlwZSAhPSBGSVBfRFRfRkRJU0MpIHsKKwkJCW1lbWNweShtYWMtPmZkX21hYywgZmlwLT5nZXRfc3JjX2FkZHIobHBvcnQpLCBFVEhfQUxFTik7CisJCX0gZWxzZSBpZiAoZmlwLT5tb2RlID09IEZJUF9NT0RFX1ZOMlZOKSB7CisJCQlodG9uMjQobWFjLT5mZF9tYWMsIEZJUF9WTl9GQ19NQVApOworCQkJaHRvbjI0KG1hYy0+ZmRfbWFjICsgMywgZmlwLT5wb3J0X2lkKTsKKwkJfSBlbHNlIGlmIChmaXBfZmxhZ3MgJiBGSVBfRkxfU1BNQSkgeworCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIkZMT0dJL0ZESVNDIHNlbnQgd2l0aCBTUE1BXG4iKTsKKwkJCW1lbWNweShtYWMtPmZkX21hYywgZmlwLT5jdGxfc3JjX2FkZHIsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIHsKKwkJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJGTE9HSS9GRElTQyBzZW50IHdpdGggRlBNQVxuIik7CisJCQkvKiBGUE1BIG9ubHkgRkxPR0kuICBNdXN0IGxlYXZlIHRoZSBNQUMgZGVzYyB6ZXJvZWQuICovCisJCX0KIAl9CisJY2FwLT5maXAuZmlwX2RsX2xlbiA9IGh0b25zKGRsZW4gLyBGSVBfQlBXKTsKIAogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9GSVApOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CkBAIC00NjksMTkgKzU2MywyMiBAQAogICoKICAqIFRoZSBjYWxsZXIgbXVzdCBjaGVjayB0aGF0IHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0LgogICogVGhlIFNLQiBtdXN0IGhhdmUgZW5vdWdoIGhlYWRyb29tICgyOCBieXRlcykgYW5kIHRhaWxyb29tICg4IGJ5dGVzKS4KKyAqIFRoZSB0aGUgc2tiIG11c3QgYWxzbyBiZSBhbiBmY19mcmFtZS4KICAqLwogaW50IGZjb2VfY3Rscl9lbHNfc2VuZChzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsIHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCiAJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBmY19mcmFtZSAqZnA7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJdTE2IG9sZF94aWQ7CiAJdTggb3A7CiAJdTggbWFjW0VUSF9BTEVOXTsKIAorCWZwID0gY29udGFpbmVyX29mKHNrYiwgc3RydWN0IGZjX2ZyYW1lLCBza2IpOwogCWZoID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKilza2ItPmRhdGE7CiAJb3AgPSAqKHU4ICopKGZoICsgMSk7CiAKLQlpZiAob3AgPT0gRUxTX0ZMT0dJKSB7CisJaWYgKG9wID09IEVMU19GTE9HSSAmJiBmaXAtPm1vZGUgIT0gRklQX01PREVfVk4yVk4pIHsKIAkJb2xkX3hpZCA9IGZpcC0+ZmxvZ2lfb3hpZDsKIAkJZmlwLT5mbG9naV9veGlkID0gbnRvaHMoZmgtPmZoX294X2lkKTsKIAkJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX0FVVE8pIHsKQEAgLTQ5MCwxOCArNTg3LDE3IEBACiAJCQlmaXAtPmZsb2dpX2NvdW50Kys7CiAJCQlpZiAoZmlwLT5mbG9naV9jb3VudCA8IDMpCiAJCQkJZ290byBkcm9wOwotCQkJZmlwLT5tYXBfZGVzdCA9IDE7CisJCQlmY29lX2N0bHJfbWFwX2Rlc3QoZmlwKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmIChmaXAtPnN0YXRlID09IEZJUF9TVF9OT05fRklQKQotCQkJZmlwLT5tYXBfZGVzdCA9IDE7CisJCQlmY29lX2N0bHJfbWFwX2Rlc3QoZmlwKTsKIAl9CiAKIAlpZiAoZmlwLT5zdGF0ZSA9PSBGSVBfU1RfTk9OX0ZJUCkKIAkJcmV0dXJuIDA7Ci0JaWYgKCFmaXAtPnNlbF9mY2YpCisJaWYgKCFmaXAtPnNlbF9mY2YgJiYgZmlwLT5tb2RlICE9IEZJUF9NT0RFX1ZOMlZOKQogCQlnb3RvIGRyb3A7Ci0KIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBFTFNfRkxPR0k6CiAJCW9wID0gRklQX0RUX0ZMT0dJOwpAQCAtNTEyLDM2ICs2MDgsNDkgQEAKIAkJb3AgPSBGSVBfRFRfRkRJU0M7CiAJCWJyZWFrOwogCWNhc2UgRUxTX0xPR086Ci0JCWlmIChmaXAtPnN0YXRlICE9IEZJUF9TVF9FTkFCTEVEKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChudG9oMjQoZmgtPmZoX2RfaWQpICE9IEZDX0ZJRF9GTE9HSSkKLQkJCXJldHVybiAwOworCQlpZiAoZmlwLT5tb2RlID09IEZJUF9NT0RFX1ZOMlZOKSB7CisJCQlpZiAoZmlwLT5zdGF0ZSAhPSBGSVBfU1RfVk5NUF9VUCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChudG9oMjQoZmgtPmZoX2RfaWQpID09IEZDX0ZJRF9GTE9HSSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChmaXAtPnN0YXRlICE9IEZJUF9TVF9FTkFCTEVEKQorCQkJCXJldHVybiAwOworCQkJaWYgKG50b2gyNChmaC0+ZmhfZF9pZCkgIT0gRkNfRklEX0ZMT0dJKQorCQkJCXJldHVybiAwOworCQl9CiAJCW9wID0gRklQX0RUX0xPR087CiAJCWJyZWFrOwogCWNhc2UgRUxTX0xTX0FDQzoKLQkJaWYgKGZpcC0+ZmxvZ2lfb3hpZCA9PSBGQ19YSURfVU5LTk9XTikKLQkJCXJldHVybiAwOwotCQlpZiAoIW50b2gyNChmaC0+Zmhfc19pZCkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX0FVVE8pCi0JCQlyZXR1cm4gMDsKIAkJLyoKLQkJICogSGVyZSB3ZSBtdXN0J3ZlIGdvdHRlbiBhbiBTSUQgYnkgYWNjZXB0aW5nIGFuIEZMT0dJCisJCSAqIElmIG5vbi1GSVAsIHdlIG1heSBoYXZlIGdvdHRlbiBhbiBTSUQgYnkgYWNjZXB0aW5nIGFuIEZMT0dJCiAJCSAqIGZyb20gYSBwb2ludC10by1wb2ludCBjb25uZWN0aW9uLiAgU3dpdGNoIHRvIHVzaW5nCiAJCSAqIHRoZSBzb3VyY2UgbWFjIGJhc2VkIG9uIHRoZSBTSUQuICBUaGUgZGVzdGluYXRpb24KIAkJICogTUFDIGluIHRoaXMgY2FzZSB3b3VsZCBoYXZlIGJlZW4gc2V0IGJ5IHJlY2V2aW5nIHRoZQogCQkgKiBGTE9HSS4KIAkJICovCi0JCWZpcC0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOwotCQlmY19mY29lX3NldF9tYWMobWFjLCBmaC0+ZmhfZF9pZCk7Ci0JCWZpcC0+dXBkYXRlX21hYyhscG9ydCwgbWFjKTsKKwkJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX05PTl9GSVApIHsKKwkJCWlmIChmaXAtPmZsb2dpX294aWQgPT0gRkNfWElEX1VOS05PV04pCisJCQkJcmV0dXJuIDA7CisJCQlmaXAtPmZsb2dpX294aWQgPSBGQ19YSURfVU5LTk9XTjsKKwkJCWZjX2Zjb2Vfc2V0X21hYyhtYWMsIGZoLT5maF9kX2lkKTsKKwkJCWZpcC0+dXBkYXRlX21hYyhscG9ydCwgbWFjKTsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVMU19MU19SSlQ6CisJCW9wID0gZnJfZW5jYXBzKGZwKTsKKwkJaWYgKG9wKQorCQkJYnJlYWs7CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCWlmIChmaXAtPnN0YXRlICE9IEZJUF9TVF9FTkFCTEVEKQorCQlpZiAoZmlwLT5zdGF0ZSAhPSBGSVBfU1RfRU5BQkxFRCAmJgorCQkgICAgZmlwLT5zdGF0ZSAhPSBGSVBfU1RfVk5NUF9VUCkKIAkJCWdvdG8gZHJvcDsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChmY29lX2N0bHJfZW5jYXBzKGZpcCwgbHBvcnQsIG9wLCBza2IpKQorCUxJQkZDT0VfRklQX0RCRyhmaXAsICJlbHNfc2VuZCBvcCAldSBkX2lkICV4XG4iLAorCQkJb3AsIG50b2gyNChmaC0+ZmhfZF9pZCkpOworCWlmIChmY29lX2N0bHJfZW5jYXBzKGZpcCwgbHBvcnQsIG9wLCBza2IsIG50b2gyNChmaC0+ZmhfZF9pZCkpKQogCQlnb3RvIGRyb3A7CiAJZmlwLT5zZW5kKGZpcCwgc2tiKTsKIAlyZXR1cm4gLUVJTlBST0dSRVNTOwpAQCAtNTU3LDYwICs2NjYsNjYgQEAKICAqCiAgKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQgYW5kIHByZWVtcHRpb24gZGlzYWJsZWQuCiAgKgotICogQW4gRkNGIGlzIGNvbnNpZGVyZWQgb2xkIGlmIHdlIGhhdmUgbWlzc2VkIHRocmVlIGFkdmVydGlzZW1lbnRzLgotICogVGhhdCBpcywgdGhlcmUgaGF2ZSBiZWVuIG5vIHZhbGlkIGFkdmVydGlzZW1lbnQgZnJvbSBpdCBmb3IgdGhyZWUKLSAqIHRpbWVzIGl0cyBrZWVwLWFsaXZlIHBlcmlvZCBpbmNsdWRpbmcgZnV6ei4KKyAqIEFuIEZDRiBpcyBjb25zaWRlcmVkIG9sZCBpZiB3ZSBoYXZlIG1pc3NlZCB0d28gYWR2ZXJ0aXNlbWVudHMuCisgKiBUaGF0IGlzLCB0aGVyZSBoYXZlIGJlZW4gbm8gdmFsaWQgYWR2ZXJ0aXNlbWVudCBmcm9tIGl0IGZvciAyLjUKKyAqIHRpbWVzIGl0cyBrZWVwLWFsaXZlIHBlcmlvZC4KICAqCiAgKiBJbiBhZGRpdGlvbiwgZGV0ZXJtaW5lIHRoZSB0aW1lIHdoZW4gYW4gRkNGIHNlbGVjdGlvbiBjYW4gb2NjdXIuCiAgKgogICogQWxzbywgaW5jcmVtZW50IHRoZSBNaXNzRGlzY0FkdkNvdW50IHdoZW4gbm8gYWR2ZXJ0aXNlbWVudCBpcyByZWNlaXZlZAogICogZm9yIHRoZSBjb3JyZXNwb25kaW5nIEZDRiBmb3IgMS41ICogRktBX0FEVl9QRVJJT0QgKEZDLUJCLTUgTEVTQikuCisgKgorICogUmV0dXJucyB0aGUgdGltZSBpbiBqaWZmaWVzIGZvciB0aGUgbmV4dCBjYWxsLgogICovCi1zdGF0aWMgdm9pZCBmY29lX2N0bHJfYWdlX2ZjZnMoc3RydWN0IGZjb2VfY3RsciAqZmlwKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZmNvZV9jdGxyX2FnZV9mY2ZzKHN0cnVjdCBmY29lX2N0bHIgKmZpcCkKIHsKIAlzdHJ1Y3QgZmNvZV9mY2YgKmZjZjsKIAlzdHJ1Y3QgZmNvZV9mY2YgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0tBX1BFUklPRCk7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZTsKIAl1bnNpZ25lZCBsb25nIHNlbF90aW1lID0gMDsKLQl1bnNpZ25lZCBsb25nIG1kYV90aW1lID0gMDsKIAlzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMgKnN0YXRzOwogCisJc3RhdHMgPSBwZXJfY3B1X3B0cihmaXAtPmxwLT5kZXZfc3RhdHMsIGdldF9jcHUoKSk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNmLCBuZXh0LCAmZmlwLT5mY2ZzLCBsaXN0KSB7Ci0JCW1kYV90aW1lID0gZmNmLT5ma2FfcGVyaW9kICsgKGZjZi0+ZmthX3BlcmlvZCA+PiAxKTsKLQkJaWYgKChmaXAtPnNlbF9mY2YgPT0gZmNmKSAmJgotCQkgICAgKHRpbWVfYWZ0ZXIoamlmZmllcywgZmNmLT50aW1lICsgbWRhX3RpbWUpKSkgewotCQkJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBqaWZmaWVzICsgbWRhX3RpbWUpOwotCQkJc3RhdHMgPSBwZXJfY3B1X3B0cihmaXAtPmxwLT5kZXZfc3RhdHMsCi0JCQkJCSAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCQkJc3RhdHMtPk1pc3NEaXNjQWR2Q291bnQrKzsKLQkJCXByaW50ayhLRVJOX0lORk8gImxpYmZjb2U6IGhvc3QlZDogTWlzc2luZyBEaXNjb3ZlcnkgIgotCQkJICAgICAgICJBZHZlcnRpc2VtZW50IGZvciBmYWIgJTE2LjE2bGx4IGNvdW50ICVsbGRcbiIsCi0JCQkgICAgICAgZmlwLT5scC0+aG9zdC0+aG9zdF9ubywgZmNmLT5mYWJyaWNfbmFtZSwKLQkJCSAgICAgICBzdGF0cy0+TWlzc0Rpc2NBZHZDb3VudCk7CisJCWRlYWRsaW5lID0gZmNmLT50aW1lICsgZmNmLT5ma2FfcGVyaW9kICsgZmNmLT5ma2FfcGVyaW9kIC8gMjsKKwkJaWYgKGZpcC0+c2VsX2ZjZiA9PSBmY2YpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRlYWRsaW5lKSkgeworCQkJCXN0YXRzLT5NaXNzRGlzY0FkdkNvdW50Kys7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAibGliZmNvZTogaG9zdCVkOiAiCisJCQkJICAgICAgICJNaXNzaW5nIERpc2NvdmVyeSBBZHZlcnRpc2VtZW50ICIKKwkJCQkgICAgICAgImZvciBmYWIgJTE2LjE2bGx4IGNvdW50ICVsbGRcbiIsCisJCQkJICAgICAgIGZpcC0+bHAtPmhvc3QtPmhvc3Rfbm8sIGZjZi0+ZmFicmljX25hbWUsCisJCQkJICAgICAgIHN0YXRzLT5NaXNzRGlzY0FkdkNvdW50KTsKKwkJCX0gZWxzZSBpZiAodGltZV9hZnRlcihuZXh0X3RpbWVyLCBkZWFkbGluZSkpCisJCQkJbmV4dF90aW1lciA9IGRlYWRsaW5lOwogCQl9Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGZjZi0+dGltZSArIGZjZi0+ZmthX3BlcmlvZCAqIDMgKwotCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoRklQX0ZDRl9GVVpaICogMykpKSB7CisKKwkJZGVhZGxpbmUgKz0gZmNmLT5ma2FfcGVyaW9kOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBkZWFkbGluZSkpIHsKIAkJCWlmIChmaXAtPnNlbF9mY2YgPT0gZmNmKQogCQkJCWZpcC0+c2VsX2ZjZiA9IE5VTEw7CiAJCQlsaXN0X2RlbCgmZmNmLT5saXN0KTsKIAkJCVdBUk5fT04oIWZpcC0+ZmNmX2NvdW50KTsKIAkJCWZpcC0+ZmNmX2NvdW50LS07CiAJCQlrZnJlZShmY2YpOwotCQkJc3RhdHMgPSBwZXJfY3B1X3B0cihmaXAtPmxwLT5kZXZfc3RhdHMsCi0JCQkJCSAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCQkJc3RhdHMtPlZMaW5rRmFpbHVyZUNvdW50Kys7Ci0JCX0gZWxzZSBpZiAoZmNvZV9jdGxyX210dV92YWxpZChmY2YpICYmCi0JCQkgICAoIXNlbF90aW1lIHx8IHRpbWVfYmVmb3JlKHNlbF90aW1lLCBmY2YtPnRpbWUpKSkgewotCQkJc2VsX3RpbWUgPSBmY2YtPnRpbWU7CisJCX0gZWxzZSB7CisJCQlpZiAodGltZV9hZnRlcihuZXh0X3RpbWVyLCBkZWFkbGluZSkpCisJCQkJbmV4dF90aW1lciA9IGRlYWRsaW5lOworCQkJaWYgKGZjb2VfY3Rscl9tdHVfdmFsaWQoZmNmKSAmJgorCQkJICAgICghc2VsX3RpbWUgfHwgdGltZV9iZWZvcmUoc2VsX3RpbWUsIGZjZi0+dGltZSkpKQorCQkJCXNlbF90aW1lID0gZmNmLT50aW1lOwogCQl9CiAJfQotCWlmIChzZWxfdGltZSkgeworCXB1dF9jcHUoKTsKKwlpZiAoc2VsX3RpbWUgJiYgIWZpcC0+c2VsX2ZjZiAmJiAhZmlwLT5zZWxfdGltZSkgewogCQlzZWxfdGltZSArPSBtc2Vjc190b19qaWZmaWVzKEZDT0VfQ1RMUl9TVEFSVF9ERUxBWSk7CiAJCWZpcC0+c2VsX3RpbWUgPSBzZWxfdGltZTsKLQkJaWYgKHRpbWVfYmVmb3JlKHNlbF90aW1lLCBmaXAtPnRpbWVyLmV4cGlyZXMpKQotCQkJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBzZWxfdGltZSk7Ci0JfSBlbHNlIHsKLQkJZmlwLT5zZWxfdGltZSA9IDA7CiAJfQorCisJcmV0dXJuIG5leHRfdGltZXI7CiB9CiAKIC8qKgpAQCAtNjMzLDYgKzc0OCw3IEBACiAJdW5zaWduZWQgbG9uZyB0OwogCXNpemVfdCBybGVuOwogCXNpemVfdCBkbGVuOworCXUzMiBkZXNjX21hc2s7CiAKIAltZW1zZXQoZmNmLCAwLCBzaXplb2YoKmZjZikpOwogCWZjZi0+ZmthX3BlcmlvZCA9IG1zZWNzX3RvX2ppZmZpZXMoRkNPRV9DVExSX0RFRl9GS0EpOwpAQCAtNjQwLDYgKzc1NiwxMiBAQAogCWZpcGggPSAoc3RydWN0IGZpcF9oZWFkZXIgKilza2ItPmRhdGE7CiAJZmNmLT5mbGFncyA9IG50b2hzKGZpcGgtPmZpcF9mbGFncyk7CiAKKwkvKgorCSAqIG1hc2sgb2YgcmVxdWlyZWQgZGVzY3JpcHRvcnMuIHZhbGlkYXRpbmcgZWFjaCBvbmUgY2xlYXJzIGl0cyBiaXQuCisJICovCisJZGVzY19tYXNrID0gQklUKEZJUF9EVF9QUkkpIHwgQklUKEZJUF9EVF9NQUMpIHwgQklUKEZJUF9EVF9OQU1FKSB8CisJCQlCSVQoRklQX0RUX0ZBQikgfCBCSVQoRklQX0RUX0ZLQSk7CisKIAlybGVuID0gbnRvaHMoZmlwaC0+ZmlwX2RsX2xlbikgKiA0OwogCWlmIChybGVuICsgc2l6ZW9mKCpmaXBoKSA+IHNrYi0+bGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY0OSwxMSArNzcxLDE5IEBACiAJCWRsZW4gPSBkZXNjLT5maXBfZGxlbiAqIEZJUF9CUFc7CiAJCWlmIChkbGVuIDwgc2l6ZW9mKCpkZXNjKSB8fCBkbGVuID4gcmxlbikKIAkJCXJldHVybiAtRUlOVkFMOworCQkvKiBEcm9wIEFkdiBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIGNyaXRpY2FsIGRlc2NyaXB0b3JzICovCisJCWlmICgoZGVzYy0+ZmlwX2R0eXBlIDwgMzIpICYmCisJCSAgICAhKGRlc2NfbWFzayAmIDFVIDw8IGRlc2MtPmZpcF9kdHlwZSkpIHsKKwkJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJEdXBsaWNhdGUgQ3JpdGljYWwgIgorCQkJCQkiRGVzY3JpcHRvcnMgaW4gRklQIGFkdlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlzd2l0Y2ggKGRlc2MtPmZpcF9kdHlwZSkgewogCQljYXNlIEZJUF9EVF9QUkk6CiAJCQlpZiAoZGxlbiAhPSBzaXplb2Yoc3RydWN0IGZpcF9wcmlfZGVzYykpCiAJCQkJZ290byBsZW5fZXJyOwogCQkJZmNmLT5wcmkgPSAoKHN0cnVjdCBmaXBfcHJpX2Rlc2MgKilkZXNjKS0+ZmRfcHJpOworCQkJZGVzY19tYXNrICY9IH5CSVQoRklQX0RUX1BSSSk7CiAJCQlicmVhazsKIAkJY2FzZSBGSVBfRFRfTUFDOgogCQkJaWYgKGRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBmaXBfbWFjX2Rlc2MpKQpAQCAtNjYyLDE2ICs3OTIsMTkgQEAKIAkJCSAgICAgICAoKHN0cnVjdCBmaXBfbWFjX2Rlc2MgKilkZXNjKS0+ZmRfbWFjLAogCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihmY2YtPmZjZl9tYWMpKSB7Ci0JCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIkludmFsaWQgTUFDIGFkZHJlc3MgIgotCQkJCQkJImluIEZJUCBhZHZcbiIpOworCQkJCUxJQkZDT0VfRklQX0RCRyhmaXAsCisJCQkJCSJJbnZhbGlkIE1BQyBhZGRyICVwTSBpbiBGSVAgYWR2XG4iLAorCQkJCQlmY2YtPmZjZl9tYWMpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQorCQkJZGVzY19tYXNrICY9IH5CSVQoRklQX0RUX01BQyk7CiAJCQlicmVhazsKIAkJY2FzZSBGSVBfRFRfTkFNRToKIAkJCWlmIChkbGVuICE9IHNpemVvZihzdHJ1Y3QgZmlwX3d3bl9kZXNjKSkKIAkJCQlnb3RvIGxlbl9lcnI7CiAJCQl3d24gPSAoc3RydWN0IGZpcF93d25fZGVzYyAqKWRlc2M7CiAJCQlmY2YtPnN3aXRjaF9uYW1lID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZ3d24tPmZkX3d3bik7CisJCQlkZXNjX21hc2sgJj0gfkJJVChGSVBfRFRfTkFNRSk7CiAJCQlicmVhazsKIAkJY2FzZSBGSVBfRFRfRkFCOgogCQkJaWYgKGRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBmaXBfZmFiX2Rlc2MpKQpAQCAtNjgwLDYgKzgxMyw3IEBACiAJCQlmY2YtPmZhYnJpY19uYW1lID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZmYWItPmZkX3d3bik7CiAJCQlmY2YtPnZmaWQgPSBudG9ocyhmYWItPmZkX3ZmaWQpOwogCQkJZmNmLT5mY19tYXAgPSBudG9oMjQoZmFiLT5mZF9tYXApOworCQkJZGVzY19tYXNrICY9IH5CSVQoRklQX0RUX0ZBQik7CiAJCQlicmVhazsKIAkJY2FzZSBGSVBfRFRfRktBOgogCQkJaWYgKGRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBmaXBfZmthX2Rlc2MpKQpAQCAtNjkwLDYgKzgyNCw3IEBACiAJCQl0ID0gbnRvaGwoZmthLT5mZF9ma2FfcGVyaW9kKTsKIAkJCWlmICh0ID49IEZDT0VfQ1RMUl9NSU5fRktBKQogCQkJCWZjZi0+ZmthX3BlcmlvZCA9IG1zZWNzX3RvX2ppZmZpZXModCk7CisJCQlkZXNjX21hc2sgJj0gfkJJVChGSVBfRFRfRktBKTsKIAkJCWJyZWFrOwogCQljYXNlIEZJUF9EVF9NQVBfT1VJOgogCQljYXNlIEZJUF9EVF9GQ09FX1NJWkU6CkBAIC03MDMsMTUgKzgzOCwyMCBAQAogCQkJLyogc3RhbmRhcmQgc2F5cyBpZ25vcmUgdW5rbm93biBkZXNjcmlwdG9ycyA+PSAxMjggKi8KIAkJCWlmIChkZXNjLT5maXBfZHR5cGUgPCBGSVBfRFRfVkVORE9SX0JBU0UpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQljb250aW51ZTsKKwkJCWJyZWFrOwogCQl9CiAJCWRlc2MgPSAoc3RydWN0IGZpcF9kZXNjICopKChjaGFyICopZGVzYyArIGRsZW4pOwogCQlybGVuIC09IGRsZW47CiAJfQogCWlmICghZmNmLT5mY19tYXAgfHwgKGZjZi0+ZmNfbWFwICYgMHgxMDAwMCkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghZmNmLT5zd2l0Y2hfbmFtZSB8fCAhZmNmLT5mYWJyaWNfbmFtZSkKKwlpZiAoIWZjZi0+c3dpdGNoX25hbWUpCiAJCXJldHVybiAtRUlOVkFMOworCWlmIChkZXNjX21hc2spIHsKKwkJTElCRkNPRV9GSVBfREJHKGZpcCwgImFkdiBtaXNzaW5nIGRlc2NyaXB0b3JzIG1hc2sgJXhcbiIsCisJCQkJZGVzY19tYXNrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXJldHVybiAwOwogCiBsZW5fZXJyOgpAQCAtNzM3LDcgKzg3Nyw3IEBACiAJaWYgKGZjb2VfY3Rscl9wYXJzZV9hZHYoZmlwLCBza2IsICZuZXcpKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfYmgoJmZpcC0+bG9jayk7CisJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAlmaXJzdCA9IGxpc3RfZW1wdHkoJmZpcC0+ZmNmcyk7CiAJZm91bmQgPSBOVUxMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNmLCAmZmlwLT5mY2ZzLCBsaXN0KSB7CkBAIC03NjIsMTggKzkwMiwyMSBAQAogCQlsaXN0X2FkZCgmZmNmLT5saXN0LCAmZmlwLT5mY2ZzKTsKIAl9IGVsc2UgewogCQkvKgotCQkgKiBGbGFncyBpbiBhZHZlcnRpc2VtZW50cyBhcmUgaWdub3JlZCBvbmNlIHRoZSBGQ0YgaXMKLQkJICogc2VsZWN0ZWQuICBGbGFncyBpbiB1bnNvbGljaXRlZCBhZHZlcnRpc2VtZW50cyBhcmUKLQkJICogaWdub3JlZCBhZnRlciBhIHVzYWJsZSBzb2xpY2l0ZWQgYWR2ZXJ0aXNlbWVudAotCQkgKiBoYXMgYmVlbiByZWNlaXZlZC4KKwkJICogVXBkYXRlIHRoZSBGQ0YncyBrZWVwLWFsaXZlIGRlc2NyaXB0b3IgZmxhZ3MuCisJCSAqIE90aGVyIGZsYWcgY2hhbmdlcyBmcm9tIG5ldyBhZHZlcnRpc2VtZW50cyBhcmUKKwkJICogaWdub3JlZCBhZnRlciBhIHNvbGljaXRlZCBhZHZlcnRpc2VtZW50IGlzCisJCSAqIHJlY2VpdmVkIGFuZCB0aGUgRkNGIGlzIHNlbGVjdGFibGUgKHVzYWJsZSkuCiAJCSAqLwotCQlpZiAoZmNmID09IGZpcC0+c2VsX2ZjZikgeworCQlmY2YtPmZkX2ZsYWdzID0gbmV3LmZkX2ZsYWdzOworCQlpZiAoIWZjb2VfY3Rscl9mY2ZfdXNhYmxlKGZjZikpCisJCQlmY2YtPmZsYWdzID0gbmV3LmZsYWdzOworCisJCWlmIChmY2YgPT0gZmlwLT5zZWxfZmNmICYmICFmY2YtPmZkX2ZsYWdzKSB7CiAJCQlmaXAtPmN0bHJfa2FfdGltZSAtPSBmY2YtPmZrYV9wZXJpb2Q7CiAJCQlmaXAtPmN0bHJfa2FfdGltZSArPSBuZXcuZmthX3BlcmlvZDsKIAkJCWlmICh0aW1lX2JlZm9yZShmaXAtPmN0bHJfa2FfdGltZSwgZmlwLT50aW1lci5leHBpcmVzKSkKIAkJCQltb2RfdGltZXIoJmZpcC0+dGltZXIsIGZpcC0+Y3Rscl9rYV90aW1lKTsKLQkJfSBlbHNlIGlmICghZmNvZV9jdGxyX2ZjZl91c2FibGUoZmNmKSkKLQkJCWZjZi0+ZmxhZ3MgPSBuZXcuZmxhZ3M7CisJCX0KIAkJZmNmLT5ma2FfcGVyaW9kID0gbmV3LmZrYV9wZXJpb2Q7CiAJCW1lbWNweShmY2YtPmZjZl9tYWMsIG5ldy5mY2ZfbWFjLCBFVEhfQUxFTik7CiAJfQpAQCAtODA1LDcgKzk0OCw3IEBACiAJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmFsaWRhdGVkIEZDRiwgbm90ZSB0aGUgdGltZSBhbmQKIAkgKiBzZXQgYSB0aW1lciB0byB0cmlnZ2VyIHNlbGVjdGlvbi4KIAkgKi8KLQlpZiAobXR1X3ZhbGlkICYmICFmaXAtPnNlbF90aW1lICYmIGZjb2VfY3Rscl9mY2ZfdXNhYmxlKGZjZikpIHsKKwlpZiAobXR1X3ZhbGlkICYmICFmaXAtPnNlbF9mY2YgJiYgZmNvZV9jdGxyX2ZjZl91c2FibGUoZmNmKSkgewogCQlmaXAtPnNlbF90aW1lID0gamlmZmllcyArCiAJCQltc2Vjc190b19qaWZmaWVzKEZDT0VfQ1RMUl9TVEFSVF9ERUxBWSk7CiAJCWlmICghdGltZXJfcGVuZGluZygmZmlwLT50aW1lcikgfHwKQEAgLTgxMyw3ICs5NTYsNyBAQAogCQkJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBmaXAtPnNlbF90aW1lKTsKIAl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJmZpcC0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOwogfQogCiAvKioKQEAgLTgzNyw2ICs5ODAsOCBAQAogCXNpemVfdCBlbHNfbGVuID0gMDsKIAlzaXplX3QgcmxlbjsKIAlzaXplX3QgZGxlbjsKKwl1MzIgZGVzY19tYXNrID0gMDsKKwl1MzIgZGVzY19jbnQgPSAwOwogCiAJZmlwaCA9IChzdHJ1Y3QgZmlwX2hlYWRlciAqKXNrYi0+ZGF0YTsKIAlzdWIgPSBmaXBoLT5maXBfc3ViY29kZTsKQEAgLTg0OSwyNyArOTk0LDQyIEBACiAKIAlkZXNjID0gKHN0cnVjdCBmaXBfZGVzYyAqKShmaXBoICsgMSk7CiAJd2hpbGUgKHJsZW4gPiAwKSB7CisJCWRlc2NfY250Kys7CiAJCWRsZW4gPSBkZXNjLT5maXBfZGxlbiAqIEZJUF9CUFc7CiAJCWlmIChkbGVuIDwgc2l6ZW9mKCpkZXNjKSB8fCBkbGVuID4gcmxlbikKIAkJCWdvdG8gZHJvcDsKKwkJLyogRHJvcCBFTFMgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBjcml0aWNhbCBkZXNjcmlwdG9ycyAqLworCQlpZiAoZGVzYy0+ZmlwX2R0eXBlIDwgMzIpIHsKKwkJCWlmIChkZXNjX21hc2sgJiAxVSA8PCBkZXNjLT5maXBfZHR5cGUpIHsKKwkJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAiRHVwbGljYXRlIENyaXRpY2FsICIKKwkJCQkJCSJEZXNjcmlwdG9ycyBpbiBGSVAgRUxTXG4iKTsKKwkJCQlnb3RvIGRyb3A7CisJCQl9CisJCQlkZXNjX21hc2sgfD0gKDEgPDwgZGVzYy0+ZmlwX2R0eXBlKTsKKwkJfQogCQlzd2l0Y2ggKGRlc2MtPmZpcF9kdHlwZSkgewogCQljYXNlIEZJUF9EVF9NQUM6CisJCQlpZiAoZGVzY19jbnQgPT0gMSkgeworCQkJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJGSVAgZGVzY3JpcHRvcnMgIgorCQkJCQkJInJlY2VpdmVkIG91dCBvZiBvcmRlclxuIik7CisJCQkJZ290byBkcm9wOworCQkJfQorCiAJCQlpZiAoZGxlbiAhPSBzaXplb2Yoc3RydWN0IGZpcF9tYWNfZGVzYykpCiAJCQkJZ290byBsZW5fZXJyOwogCQkJbWVtY3B5KGdyYW50ZWRfbWFjLAogCQkJICAgICAgICgoc3RydWN0IGZpcF9tYWNfZGVzYyAqKWRlc2MpLT5mZF9tYWMsCiAJCQkgICAgICAgRVRIX0FMRU4pOwotCQkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGdyYW50ZWRfbWFjKSkgewotCQkJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJJbnZhbGlkIE1BQyBhZGRyZXNzICIKLQkJCQkJCSJpbiBGSVAgRUxTXG4iKTsKLQkJCQlnb3RvIGRyb3A7Ci0JCQl9Ci0JCQltZW1jcHkoZnJfY2IoZnApLT5ncmFudGVkX21hYywgZ3JhbnRlZF9tYWMsIEVUSF9BTEVOKTsKIAkJCWJyZWFrOwogCQljYXNlIEZJUF9EVF9GTE9HSToKIAkJY2FzZSBGSVBfRFRfRkRJU0M6CiAJCWNhc2UgRklQX0RUX0xPR086CiAJCWNhc2UgRklQX0RUX0VMUDoKKwkJCWlmIChkZXNjX2NudCAhPSAxKSB7CisJCQkJTElCRkNPRV9GSVBfREJHKGZpcCwgIkZJUCBkZXNjcmlwdG9ycyAiCisJCQkJCQkicmVjZWl2ZWQgb3V0IG9mIG9yZGVyXG4iKTsKKwkJCQlnb3RvIGRyb3A7CisJCQl9CiAJCQlpZiAoZmgpCiAJCQkJZ290byBkcm9wOwogCQkJaWYgKGRsZW4gPCBzaXplb2YoKmVscykgKyBzaXplb2YoKmZoKSArIDEpCkBAIC04ODUsNyArMTA0NSwxMiBAQAogCQkJLyogc3RhbmRhcmQgc2F5cyBpZ25vcmUgdW5rbm93biBkZXNjcmlwdG9ycyA+PSAxMjggKi8KIAkJCWlmIChkZXNjLT5maXBfZHR5cGUgPCBGSVBfRFRfVkVORE9SX0JBU0UpCiAJCQkJZ290byBkcm9wOwotCQkJY29udGludWU7CisJCQlpZiAoZGVzY19jbnQgPD0gMikgeworCQkJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJGSVAgZGVzY3JpcHRvcnMgIgorCQkJCQkJInJlY2VpdmVkIG91dCBvZiBvcmRlclxuIik7CisJCQkJZ290byBkcm9wOworCQkJfQorCQkJYnJlYWs7CiAJCX0KIAkJZGVzYyA9IChzdHJ1Y3QgZmlwX2Rlc2MgKikoKGNoYXIgKilkZXNjICsgZGxlbik7CiAJCXJsZW4gLT0gZGxlbjsKQEAgLTg5NSwxMCArMTA2MCwyNyBAQAogCQlnb3RvIGRyb3A7CiAJZWxzX29wID0gKih1OCAqKShmaCArIDEpOwogCi0JaWYgKGVsc19kdHlwZSA9PSBGSVBfRFRfRkxPR0kgJiYgc3ViID09IEZJUF9TQ19SRVAgJiYKLQkgICAgZmlwLT5mbG9naV9veGlkID09IG50b2hzKGZoLT5maF9veF9pZCkgJiYKLQkgICAgZWxzX29wID09IEVMU19MU19BQ0MgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihncmFudGVkX21hYykpCi0JCWZpcC0+ZmxvZ2lfb3hpZCA9IEZDX1hJRF9VTktOT1dOOworCWlmICgoZWxzX2R0eXBlID09IEZJUF9EVF9GTE9HSSB8fCBlbHNfZHR5cGUgPT0gRklQX0RUX0ZESVNDKSAmJgorCSAgICBzdWIgPT0gRklQX1NDX1JFUCAmJiBlbHNfb3AgPT0gRUxTX0xTX0FDQyAmJgorCSAgICBmaXAtPm1vZGUgIT0gRklQX01PREVfVk4yVk4pIHsKKwkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGdyYW50ZWRfbWFjKSkgeworCQkJTElCRkNPRV9GSVBfREJHKGZpcCwKKwkJCQkiSW52YWxpZCBNQUMgYWRkcmVzcyAlcE0gaW4gRklQIEVMU1xuIiwKKwkJCQlncmFudGVkX21hYyk7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJbWVtY3B5KGZyX2NiKGZwKS0+Z3JhbnRlZF9tYWMsIGdyYW50ZWRfbWFjLCBFVEhfQUxFTik7CisKKwkJaWYgKGZpcC0+ZmxvZ2lfb3hpZCA9PSBudG9ocyhmaC0+Zmhfb3hfaWQpKQorCQkJZmlwLT5mbG9naV9veGlkID0gRkNfWElEX1VOS05PV047CisJfQorCisJaWYgKChkZXNjX2NudCA9PSAwKSB8fCAoKGVsc19vcCAhPSBFTFNfTFNfUkpUKSAmJgorCSAgICAoISgxVSA8PCBGSVBfRFRfTUFDICYgZGVzY19tYXNrKSkpKSB7CisJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJNaXNzaW5nIGNyaXRpY2FsIGRlc2NyaXB0b3JzICIKKwkJCQkiaW4gRklQIEVMU1xuIik7CisJCWdvdG8gZHJvcDsKKwl9CiAKIAkvKgogCSAqIENvbnZlcnQgc2tiIGludG8gYW4gZmNfZnJhbWUgY29udGFpbmluZyBvbmx5IHRoZSBFTFMuCkBAIC05MTAsNiArMTA5Miw3IEBACiAJZnJfc29mKGZwKSA9IEZDX1NPRl9JMzsKIAlmcl9lb2YoZnApID0gRkNfRU9GX1Q7CiAJZnJfZGV2KGZwKSA9IGxwb3J0OworCWZyX2VuY2FwcyhmcCkgPSBlbHNfZHR5cGU7CiAKIAlzdGF0cyA9IHBlcl9jcHVfcHRyKGxwb3J0LT5kZXZfc3RhdHMsIGdldF9jcHUoKSk7CiAJc3RhdHMtPlJ4RnJhbWVzKys7CkBAIC05NDUsNyArMTEyOCw5IEBACiAJc2l6ZV90IGRsZW47CiAJc3RydWN0IGZjb2VfZmNmICpmY2YgPSBmaXAtPnNlbF9mY2Y7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGZpcC0+bHA7Ci0JdTMyCWRlc2NfbWFzazsKKwlzdHJ1Y3QgZmNfbHBvcnQgKnZuX3BvcnQgPSBOVUxMOworCXUzMiBkZXNjX21hc2s7CisJaW50IGlzX3ZuX3BvcnQgPSAwOwogCiAJTElCRkNPRV9GSVBfREJHKGZpcCwgIkNsZWFyIFZpcnR1YWwgTGluayByZWNlaXZlZFxuIik7CiAKQEAgLTk2Myw2ICsxMTQ4LDEzIEBACiAJCWRsZW4gPSBkZXNjLT5maXBfZGxlbiAqIEZJUF9CUFc7CiAJCWlmIChkbGVuID4gcmxlbikKIAkJCXJldHVybjsKKwkJLyogRHJvcCBDVkwgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBjcml0aWNhbCBkZXNjcmlwdG9ycyAqLworCQlpZiAoKGRlc2MtPmZpcF9kdHlwZSA8IDMyKSAmJgorCQkgICAgIShkZXNjX21hc2sgJiAxVSA8PCBkZXNjLT5maXBfZHR5cGUpKSB7CisJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAiRHVwbGljYXRlIENyaXRpY2FsICIKKwkJCQkJIkRlc2NyaXB0b3JzIGluIEZJUCBDVkxcbiIpOworCQkJcmV0dXJuOworCQl9CiAJCXN3aXRjaCAoZGVzYy0+ZmlwX2R0eXBlKSB7CiAJCWNhc2UgRklQX0RUX01BQzoKIAkJCW1wID0gKHN0cnVjdCBmaXBfbWFjX2Rlc2MgKilkZXNjOwpAQCAtOTg3LDggKzExNzksMjYgQEAKIAkJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIodnAtPmZkX21hYywKIAkJCQkJICAgICAgIGZpcC0+Z2V0X3NyY19hZGRyKGxwb3J0KSkgPT0gMCAmJgogCQkJICAgIGdldF91bmFsaWduZWRfYmU2NCgmdnAtPmZkX3d3cG4pID09IGxwb3J0LT53d3BuICYmCi0JCQkgICAgbnRvaDI0KHZwLT5mZF9mY19pZCkgPT0gbHBvcnQtPnBvcnRfaWQpCisJCQkgICAgbnRvaDI0KHZwLT5mZF9mY19pZCkgPT0gbHBvcnQtPnBvcnRfaWQpIHsKIAkJCQlkZXNjX21hc2sgJj0gfkJJVChGSVBfRFRfVk5fSUQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogY2hlY2sgaWYgY2xyX3ZsaW5rIGlzIGZvciBOUElWIHBvcnQgKi8KKwkJCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZuX3BvcnQsICZscG9ydC0+dnBvcnRzLCBsaXN0KSB7CisJCQkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcih2cC0+ZmRfbWFjLAorCQkJCSAgICBmaXAtPmdldF9zcmNfYWRkcih2bl9wb3J0KSkgPT0gMCAmJgorCQkJCSAgICAoZ2V0X3VuYWxpZ25lZF9iZTY0KCZ2cC0+ZmRfd3dwbikKKwkJCQkJCQk9PSB2bl9wb3J0LT53d3BuKSAmJgorCQkJCSAgICAobnRvaDI0KHZwLT5mZF9mY19pZCkgPT0KKwkJCQkJICAgIGZjX2hvc3RfcG9ydF9pZCh2bl9wb3J0LT5ob3N0KSkpIHsKKwkJCQkJZGVzY19tYXNrICY9IH5CSVQoRklQX0RUX1ZOX0lEKTsKKwkJCQkJaXNfdm5fcG9ydCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBzdGFuZGFyZCBzYXlzIGlnbm9yZSB1bmtub3duIGRlc2NyaXB0b3JzID49IDEyOCAqLwpAQCAtMTAwOSwxNCArMTIxOSwxOSBAQAogCX0gZWxzZSB7CiAJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJwZXJmb3JtaW5nIENsZWFyIFZpcnR1YWwgTGlua1xuIik7CiAKLQkJc3Bpbl9sb2NrX2JoKCZmaXAtPmxvY2spOwotCQlwZXJfY3B1X3B0cihscG9ydC0+ZGV2X3N0YXRzLAotCQkJICAgIHNtcF9wcm9jZXNzb3JfaWQoKSktPlZMaW5rRmFpbHVyZUNvdW50Kys7Ci0JCWZjb2VfY3Rscl9yZXNldChmaXApOwotCQlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKKwkJaWYgKGlzX3ZuX3BvcnQpCisJCQlmY19scG9ydF9yZXNldCh2bl9wb3J0KTsKKwkJZWxzZSB7CisJCQltdXRleF9sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOworCQkJcGVyX2NwdV9wdHIobHBvcnQtPmRldl9zdGF0cywKKwkJCQkgICAgZ2V0X2NwdSgpKS0+VkxpbmtGYWlsdXJlQ291bnQrKzsKKwkJCXB1dF9jcHUoKTsKKwkJCWZjb2VfY3Rscl9yZXNldChmaXApOworCQkJbXV0ZXhfdW5sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOwogCi0JCWZjX2xwb3J0X3Jlc2V0KGZpcC0+bHApOwotCQlmY29lX2N0bHJfc29saWNpdChmaXAsIE5VTEwpOworCQkJZmNfbHBvcnRfcmVzZXQoZmlwLT5scCk7CisJCQlmY29lX2N0bHJfc29saWNpdChmaXAsIE5VTEwpOworCQl9CiAJfQogfQogCkBAIC0xMDU0LDggKzEyNjksMTMgQEAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKmZpcGgpKQogCQlnb3RvIGRyb3A7CiAJZWggPSBldGhfaGRyKHNrYik7Ci0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihlaC0+aF9kZXN0LCBmaXAtPmN0bF9zcmNfYWRkcikgJiYKLQkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGVoLT5oX2Rlc3QsIEZJUF9BTExfRU5PREVfTUFDUykpCisJaWYgKGZpcC0+bW9kZSA9PSBGSVBfTU9ERV9WTjJWTikgeworCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGVoLT5oX2Rlc3QsIGZpcC0+Y3RsX3NyY19hZGRyKSAmJgorCQkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGVoLT5oX2Rlc3QsIGZjb2VfYWxsX3ZuMnZuKSAmJgorCQkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGVoLT5oX2Rlc3QsIGZjb2VfYWxsX3AycCkpCisJCQlnb3RvIGRyb3A7CisJfSBlbHNlIGlmIChjb21wYXJlX2V0aGVyX2FkZHIoZWgtPmhfZGVzdCwgZmlwLT5jdGxfc3JjX2FkZHIpICYmCisJCSAgIGNvbXBhcmVfZXRoZXJfYWRkcihlaC0+aF9kZXN0LCBmY29lX2FsbF9lbm9kZSkpCiAJCWdvdG8gZHJvcDsKIAlmaXBoID0gKHN0cnVjdCBmaXBfaGVhZGVyICopc2tiLT5kYXRhOwogCW9wID0gbnRvaHMoZmlwaC0+ZmlwX29wKTsKQEAgLTEwNjYsMjIgKzEyODYsMzEgQEAKIAlpZiAobnRvaHMoZmlwaC0+ZmlwX2RsX2xlbikgKiBGSVBfQlBXICsgc2l6ZW9mKCpmaXBoKSA+IHNrYi0+bGVuKQogCQlnb3RvIGRyb3A7CiAKLQlzcGluX2xvY2tfYmgoJmZpcC0+bG9jayk7CisJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAlzdGF0ZSA9IGZpcC0+c3RhdGU7CiAJaWYgKHN0YXRlID09IEZJUF9TVF9BVVRPKSB7CiAJCWZpcC0+bWFwX2Rlc3QgPSAwOwotCQlmaXAtPnN0YXRlID0gRklQX1NUX0VOQUJMRUQ7CisJCWZjb2VfY3Rscl9zZXRfc3RhdGUoZmlwLCBGSVBfU1RfRU5BQkxFRCk7CiAJCXN0YXRlID0gRklQX1NUX0VOQUJMRUQ7CiAJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJVc2luZyBGSVAgbW9kZVxuIik7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOwotCWlmIChzdGF0ZSAhPSBGSVBfU1RfRU5BQkxFRCkKKwltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CisKKwlpZiAoZmlwLT5tb2RlID09IEZJUF9NT0RFX1ZOMlZOICYmIG9wID09IEZJUF9PUF9WTjJWTikKKwkJcmV0dXJuIGZjb2VfY3Rscl92bl9yZWN2KGZpcCwgc2tiKTsKKworCWlmIChzdGF0ZSAhPSBGSVBfU1RfRU5BQkxFRCAmJiBzdGF0ZSAhPSBGSVBfU1RfVk5NUF9VUCAmJgorCSAgICBzdGF0ZSAhPSBGSVBfU1RfVk5NUF9DTEFJTSkKIAkJZ290byBkcm9wOwogCiAJaWYgKG9wID09IEZJUF9PUF9MUykgewogCQlmY29lX2N0bHJfcmVjdl9lbHMoZmlwLCBza2IpOwkvKiBjb25zdW1lcyBza2IgKi8KIAkJcmV0dXJuIDA7CiAJfQorCisJaWYgKHN0YXRlICE9IEZJUF9TVF9FTkFCTEVEKQorCQlnb3RvIGRyb3A7CisKIAlpZiAob3AgPT0gRklQX09QX0RJU0MgJiYgc3ViID09IEZJUF9TQ19BRFYpCiAJCWZjb2VfY3Rscl9yZWN2X2FkdihmaXAsIHNrYik7CiAJZWxzZSBpZiAob3AgPT0gRklQX09QX0NUUkwgJiYgc3ViID09IEZJUF9TQ19DTFJfVkxJTkspCkBAIC0xMTQwLDMwICsxMzY5LDUzIEBACiAvKioKICAqIGZjb2VfY3Rscl90aW1lb3V0KCkgLSBGSVAgdGltZW91dCBoYW5kbGVyCiAgKiBAYXJnOiBUaGUgRkNvRSBjb250cm9sbGVyIHRoYXQgdGltZWQgb3V0Ci0gKgotICogQWdlcyBGQ0ZzLiAgVHJpZ2dlcnMgRkNGIHNlbGVjdGlvbiBpZiBwb3NzaWJsZS4gIFNlbmRzIGtlZXAtYWxpdmVzLgogICovCiBzdGF0aWMgdm9pZCBmY29lX2N0bHJfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSAoc3RydWN0IGZjb2VfY3RsciAqKWFyZzsKKworCXNjaGVkdWxlX3dvcmsoJmZpcC0+dGltZXJfd29yayk7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3RpbWVyX3dvcmsoKSAtIFdvcmtlciB0aHJlYWQgZnVuY3Rpb24gZm9yIHRpbWVyIHdvcmsKKyAqIEB3b3JrOiBIYW5kbGUgdG8gYSBGQ29FIGNvbnRyb2xsZXIKKyAqCisgKiBBZ2VzIEZDRnMuICBUcmlnZ2VycyBGQ0Ygc2VsZWN0aW9uIGlmIHBvc3NpYmxlLgorICogU2VuZHMga2VlcC1hbGl2ZXMgYW5kIHJlc2V0cy4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3RpbWVyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBmY29lX2N0bHIgKmZpcDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKnZwb3J0OworCXU4ICptYWM7CisJdTggcmVzZXQgPSAwOworCXU4IHNlbmRfY3Rscl9rYSA9IDA7CisJdTggc2VuZF9wb3J0X2thID0gMDsKIAlzdHJ1Y3QgZmNvZV9mY2YgKnNlbDsKIAlzdHJ1Y3QgZmNvZV9mY2YgKmZjZjsKLQl1bnNpZ25lZCBsb25nIG5leHRfdGltZXIgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhGSVBfVk5fS0FfUEVSSU9EKTsKKwl1bnNpZ25lZCBsb25nIG5leHRfdGltZXI7CiAKLQlzcGluX2xvY2tfYmgoJmZpcC0+bG9jayk7CisJZmlwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY29lX2N0bHIsIHRpbWVyX3dvcmspOworCWlmIChmaXAtPm1vZGUgPT0gRklQX01PREVfVk4yVk4pCisJCXJldHVybiBmY29lX2N0bHJfdm5fdGltZW91dChmaXApOworCW11dGV4X2xvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiAJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX0RJU0FCTEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOworCQltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiAJCXJldHVybjsKIAl9CiAKIAlmY2YgPSBmaXAtPnNlbF9mY2Y7Ci0JZmNvZV9jdGxyX2FnZV9mY2ZzKGZpcCk7CisJbmV4dF90aW1lciA9IGZjb2VfY3Rscl9hZ2VfZmNmcyhmaXApOwogCiAJc2VsID0gZmlwLT5zZWxfZmNmOwotCWlmICghc2VsICYmIGZpcC0+c2VsX3RpbWUgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBmaXAtPnNlbF90aW1lKSkgewotCQlmY29lX2N0bHJfc2VsZWN0KGZpcCk7Ci0JCXNlbCA9IGZpcC0+c2VsX2ZjZjsKLQkJZmlwLT5zZWxfdGltZSA9IDA7CisJaWYgKCFzZWwgJiYgZmlwLT5zZWxfdGltZSkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBmaXAtPnNlbF90aW1lKSkgeworCQkJZmNvZV9jdGxyX3NlbGVjdChmaXApOworCQkJc2VsID0gZmlwLT5zZWxfZmNmOworCQkJZmlwLT5zZWxfdGltZSA9IDA7CisJCX0gZWxzZSBpZiAodGltZV9hZnRlcihuZXh0X3RpbWVyLCBmaXAtPnNlbF90aW1lKSkKKwkJCW5leHRfdGltZXIgPSBmaXAtPnNlbF90aW1lOwogCX0KIAogCWlmIChzZWwgIT0gZmNmKSB7CkBAIC0xMTczLDIzICsxNDI1LDI1IEBACiAJCQkgICAgICAgIkZpYnJlLUNoYW5uZWwgRm9yd2FyZGVyIE1BQyAlcE1cbiIsCiAJCQkgICAgICAgZmlwLT5scC0+aG9zdC0+aG9zdF9ubywgc2VsLT5mY2ZfbWFjKTsKIAkJCW1lbWNweShmaXAtPmRlc3RfYWRkciwgc2VsLT5mY2ZfbWFjLCBFVEhfQUxFTik7CisJCQlmaXAtPm1hcF9kZXN0ID0gMDsKIAkJCWZpcC0+cG9ydF9rYV90aW1lID0gamlmZmllcyArCiAJCQkJbXNlY3NfdG9famlmZmllcyhGSVBfVk5fS0FfUEVSSU9EKTsKIAkJCWZpcC0+Y3Rscl9rYV90aW1lID0gamlmZmllcyArIHNlbC0+ZmthX3BlcmlvZDsKKwkJCWlmICh0aW1lX2FmdGVyKG5leHRfdGltZXIsIGZpcC0+Y3Rscl9rYV90aW1lKSkKKwkJCQluZXh0X3RpbWVyID0gZmlwLT5jdGxyX2thX3RpbWU7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImxpYmZjb2U6IGhvc3QlZDogIgogCQkJICAgICAgICJGSVAgRmlicmUtQ2hhbm5lbCBGb3J3YXJkZXIgdGltZWQgb3V0LgkiCiAJCQkgICAgICAgIlN0YXJ0aW5nIEZDRiBkaXNjb3ZlcnkuXG4iLAogCQkJICAgICAgIGZpcC0+bHAtPmhvc3QtPmhvc3Rfbm8pOwotCQkJZmlwLT5yZXNldF9yZXEgPSAxOwotCQkJc2NoZWR1bGVfd29yaygmZmlwLT50aW1lcl93b3JrKTsKKwkJCXJlc2V0ID0gMTsKIAkJfQogCX0KIAogCWlmIChzZWwgJiYgIXNlbC0+ZmRfZmxhZ3MpIHsKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZmlwLT5jdGxyX2thX3RpbWUpKSB7CiAJCQlmaXAtPmN0bHJfa2FfdGltZSA9IGppZmZpZXMgKyBzZWwtPmZrYV9wZXJpb2Q7Ci0JCQlmaXAtPnNlbmRfY3Rscl9rYSA9IDE7CisJCQlzZW5kX2N0bHJfa2EgPSAxOwogCQl9CiAJCWlmICh0aW1lX2FmdGVyKG5leHRfdGltZXIsIGZpcC0+Y3Rscl9rYV90aW1lKSkKIAkJCW5leHRfdGltZXIgPSBmaXAtPmN0bHJfa2FfdGltZTsKQEAgLTExOTcsNTAgKzE0NTEsMjUgQEAKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZmlwLT5wb3J0X2thX3RpbWUpKSB7CiAJCQlmaXAtPnBvcnRfa2FfdGltZSA9IGppZmZpZXMgKwogCQkJCW1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0tBX1BFUklPRCk7Ci0JCQlmaXAtPnNlbmRfcG9ydF9rYSA9IDE7CisJCQlzZW5kX3BvcnRfa2EgPSAxOwogCQl9CiAJCWlmICh0aW1lX2FmdGVyKG5leHRfdGltZXIsIGZpcC0+cG9ydF9rYV90aW1lKSkKIAkJCW5leHRfdGltZXIgPSBmaXAtPnBvcnRfa2FfdGltZTsKLQkJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBuZXh0X3RpbWVyKTsKLQl9IGVsc2UgaWYgKGZpcC0+c2VsX3RpbWUpIHsKLQkJbmV4dF90aW1lciA9IGZpcC0+c2VsX3RpbWUgKwotCQkJbXNlY3NfdG9famlmZmllcyhGQ09FX0NUTFJfU1RBUlRfREVMQVkpOwotCQltb2RfdGltZXIoJmZpcC0+dGltZXIsIG5leHRfdGltZXIpOwogCX0KLQlpZiAoZmlwLT5zZW5kX2N0bHJfa2EgfHwgZmlwLT5zZW5kX3BvcnRfa2EpCi0JCXNjaGVkdWxlX3dvcmsoJmZpcC0+dGltZXJfd29yayk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmZpcC0+bG9jayk7Ci19CisJaWYgKCFsaXN0X2VtcHR5KCZmaXAtPmZjZnMpKQorCQltb2RfdGltZXIoJmZpcC0+dGltZXIsIG5leHRfdGltZXIpOworCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAotLyoqCi0gKiBmY29lX2N0bHJfdGltZXJfd29yaygpIC0gV29ya2VyIHRocmVhZCBmdW5jdGlvbiBmb3IgdGltZXIgd29yawotICogQHdvcms6IEhhbmRsZSB0byBhIEZDb0UgY29udHJvbGxlcgotICoKLSAqIFNlbmRzIGtlZXAtYWxpdmVzIGFuZCByZXNldHMgd2hpY2ggbXVzdCBub3QKLSAqIGJlIGNhbGxlZCBmcm9tIHRoZSB0aW1lciBkaXJlY3RseSwgc2luY2UgdGhleSB1c2UgYSBtdXRleC4KLSAqLwotc3RhdGljIHZvaWQgZmNvZV9jdGxyX3RpbWVyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBmY29lX2N0bHIgKmZpcDsKLQlzdHJ1Y3QgZmNfbHBvcnQgKnZwb3J0OwotCXU4ICptYWM7Ci0JaW50IHJlc2V0OwotCi0JZmlwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY29lX2N0bHIsIHRpbWVyX3dvcmspOwotCXNwaW5fbG9ja19iaCgmZmlwLT5sb2NrKTsKLQlyZXNldCA9IGZpcC0+cmVzZXRfcmVxOwotCWZpcC0+cmVzZXRfcmVxID0gMDsKLQlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKLQotCWlmIChyZXNldCkKKwlpZiAocmVzZXQpIHsKIAkJZmNfbHBvcnRfcmVzZXQoZmlwLT5scCk7Ci0KLQlpZiAoZmlwLT5zZW5kX2N0bHJfa2EpIHsKLQkJZmlwLT5zZW5kX2N0bHJfa2EgPSAwOwotCQlmY29lX2N0bHJfc2VuZF9rZWVwX2FsaXZlKGZpcCwgTlVMTCwgMCwgZmlwLT5jdGxfc3JjX2FkZHIpOworCQkvKiByZXN0YXJ0IHRoaW5ncyB3aXRoIGEgc29saWNpdGF0aW9uICovCisJCWZjb2VfY3Rscl9zb2xpY2l0KGZpcCwgTlVMTCk7CiAJfQotCWlmIChmaXAtPnNlbmRfcG9ydF9rYSkgewotCQlmaXAtPnNlbmRfcG9ydF9rYSA9IDA7CisKKwlpZiAoc2VuZF9jdGxyX2thKQorCQlmY29lX2N0bHJfc2VuZF9rZWVwX2FsaXZlKGZpcCwgTlVMTCwgMCwgZmlwLT5jdGxfc3JjX2FkZHIpOworCisJaWYgKHNlbmRfcG9ydF9rYSkgewogCQltdXRleF9sb2NrKCZmaXAtPmxwLT5scF9tdXRleCk7CiAJCW1hYyA9IGZpcC0+Z2V0X3NyY19hZGRyKGZpcC0+bHApOwogCQlmY29lX2N0bHJfc2VuZF9rZWVwX2FsaXZlKGZpcCwgZmlwLT5scCwgMSwgbWFjKTsKQEAgLTEyOTcsMTIgKzE1MjYsMTIgQEAKIAlpZiAob3AgPT0gRUxTX0xTX0FDQyAmJiBmaC0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9FTFNfUkVQICYmCiAJICAgIGZpcC0+ZmxvZ2lfb3hpZCA9PSBudG9ocyhmaC0+Zmhfb3hfaWQpKSB7CiAKLQkJc3Bpbl9sb2NrX2JoKCZmaXAtPmxvY2spOworCQltdXRleF9sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOwogCQlpZiAoZmlwLT5zdGF0ZSAhPSBGSVBfU1RfQVVUTyAmJiBmaXAtPnN0YXRlICE9IEZJUF9TVF9OT05fRklQKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmZmlwLT5sb2NrKTsKKwkJCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWZpcC0+c3RhdGUgPSBGSVBfU1RfTk9OX0ZJUDsKKwkJZmNvZV9jdGxyX3NldF9zdGF0ZShmaXAsIEZJUF9TVF9OT05fRklQKTsKIAkJTElCRkNPRV9GSVBfREJHKGZpcCwKIAkJCQkicmVjZWl2ZWQgRkxPR0kgTFNfQUNDIHVzaW5nIG5vbi1GSVAgbW9kZVxuIik7CiAKQEAgLTEzMTMsMjggKzE1NDIsMjggQEAKIAkJICogT3RoZXJ3aXNlIHdlIHVzZSB0aGUgRkNvRSBnYXRld2F5IGFkZHIKIAkJICovCiAJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHNhLCAodThbNl0pRkNfRkNPRV9GTE9HSV9NQUMpKSB7Ci0JCQlmaXAtPm1hcF9kZXN0ID0gMTsKKwkJCWZjb2VfY3Rscl9tYXBfZGVzdChmaXApOwogCQl9IGVsc2UgewogCQkJbWVtY3B5KGZpcC0+ZGVzdF9hZGRyLCBzYSwgRVRIX0FMRU4pOwogCQkJZmlwLT5tYXBfZGVzdCA9IDA7CiAJCX0KIAkJZmlwLT5mbG9naV9veGlkID0gRkNfWElEX1VOS05PV047Ci0JCXNwaW5fdW5sb2NrX2JoKCZmaXAtPmxvY2spOworCQltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7CiAJCWZjX2Zjb2Vfc2V0X21hYyhmcl9jYihmcCktPmdyYW50ZWRfbWFjLCBmaC0+ZmhfZF9pZCk7CiAJfSBlbHNlIGlmIChvcCA9PSBFTFNfRkxPR0kgJiYgZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSAmJiBzYSkgewogCQkvKgogCQkgKiBTYXZlIHNvdXJjZSBNQUMgZm9yIHBvaW50LXRvLXBvaW50IHJlc3BvbnNlcy4KIAkJICovCi0JCXNwaW5fbG9ja19iaCgmZmlwLT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAkJaWYgKGZpcC0+c3RhdGUgPT0gRklQX1NUX0FVVE8gfHwgZmlwLT5zdGF0ZSA9PSBGSVBfU1RfTk9OX0ZJUCkgewogCQkJbWVtY3B5KGZpcC0+ZGVzdF9hZGRyLCBzYSwgRVRIX0FMRU4pOwogCQkJZmlwLT5tYXBfZGVzdCA9IDA7CiAJCQlpZiAoZmlwLT5zdGF0ZSA9PSBGSVBfU1RfQVVUTykKIAkJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAicmVjZWl2ZWQgbm9uLUZJUCBGTE9HSS4gIgogCQkJCQkJIlNldHRpbmcgbm9uLUZJUCBtb2RlXG4iKTsKLQkJCWZpcC0+c3RhdGUgPSBGSVBfU1RfTk9OX0ZJUDsKKwkJCWZjb2VfY3Rscl9zZXRfc3RhdGUoZmlwLCBGSVBfU1RfTk9OX0ZJUCk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfYmgoJmZpcC0+bG9jayk7CisJCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzgyLDI2ICsxNjExLDkxNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV93d25fZnJvbV9tYWMpOwogCiAvKioKKyAqIGZjb2VfY3Rscl9ycG9ydCgpIC0gcmV0dXJuIHRoZSBmY29lX3Jwb3J0IGZvciBhIGdpdmVuIGZjX3Jwb3J0X3ByaXYKKyAqIEByZGF0YTogbGliZmMgcmVtb3RlIHBvcnQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNvZV9ycG9ydCAqZmNvZV9jdGxyX3Jwb3J0KHN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBmY29lX3Jwb3J0ICopKHJkYXRhICsgMSk7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX3NlbmQoKSAtIFNlbmQgYSBGSVAgVk4yVk4gUHJvYmUgUmVxdWVzdCBvciBSZXBseS4KKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKKyAqIEBzdWI6IHN1Yi1vcGNvZGUgZm9yIHByb2JlIHJlcXVlc3QsIHJlcGx5LCBvciBhZHZlcnRpc2VtZW50LgorICogQGRlc3Q6IFRoZSBkZXN0aW5hdGlvbiBFdGhlcm5ldCBNQUMgYWRkcmVzcworICogQG1pbl9sZW46IG1pbmltdW0gc2l6ZSBvZiB0aGUgRXRoZXJuZXQgcGF5bG9hZCB0byBiZSBzZW50CisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl92bl9zZW5kKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwKKwkJCSAgICAgIGVudW0gZmlwX3ZuMnZuX3N1YmNvZGUgc3ViLAorCQkJICAgICAgY29uc3QgdTggKmRlc3QsIHNpemVfdCBtaW5fbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGZpcF9mcmFtZSB7CisJCXN0cnVjdCBldGhoZHIgZXRoOworCQlzdHJ1Y3QgZmlwX2hlYWRlciBmaXA7CisJCXN0cnVjdCBmaXBfbWFjX2Rlc2MgbWFjOworCQlzdHJ1Y3QgZmlwX3d3bl9kZXNjIHd3bm47CisJCXN0cnVjdCBmaXBfdm5fZGVzYyB2bjsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpmcmFtZTsKKwlzdHJ1Y3QgZmlwX2ZjNF9mZWF0ICpmZjsKKwlzdHJ1Y3QgZmlwX3NpemVfZGVzYyAqc2l6ZTsKKwl1MzIgZmNwX2ZlYXQ7CisJc2l6ZV90IGxlbjsKKwlzaXplX3QgZGxlbjsKKworCWxlbiA9IHNpemVvZigqZnJhbWUpOworCWRsZW4gPSAwOworCWlmIChzdWIgPT0gRklQX1NDX1ZOX0NMQUlNX05PVElGWSB8fCBzdWIgPT0gRklQX1NDX1ZOX0NMQUlNX1JFUCkgeworCQlkbGVuID0gc2l6ZW9mKHN0cnVjdCBmaXBfZmM0X2ZlYXQpICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmlwX3NpemVfZGVzYyk7CisJCWxlbiArPSBkbGVuOworCX0KKwlkbGVuICs9IHNpemVvZihmcmFtZS0+bWFjKSArIHNpemVvZihmcmFtZS0+d3dubikgKyBzaXplb2YoZnJhbWUtPnZuKTsKKwlsZW4gPSBtYXgobGVuLCBtaW5fbGVuICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJZnJhbWUgPSAoc3RydWN0IGZpcF9mcmFtZSAqKXNrYi0+ZGF0YTsKKwltZW1zZXQoZnJhbWUsIDAsIGxlbik7CisJbWVtY3B5KGZyYW1lLT5ldGguaF9kZXN0LCBkZXN0LCBFVEhfQUxFTik7CisJbWVtY3B5KGZyYW1lLT5ldGguaF9zb3VyY2UsIGZpcC0+Y3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CisJZnJhbWUtPmV0aC5oX3Byb3RvID0gaHRvbnMoRVRIX1BfRklQKTsKKworCWZyYW1lLT5maXAuZmlwX3ZlciA9IEZJUF9WRVJfRU5DQVBTKEZJUF9WRVIpOworCWZyYW1lLT5maXAuZmlwX29wID0gaHRvbnMoRklQX09QX1ZOMlZOKTsKKwlmcmFtZS0+ZmlwLmZpcF9zdWJjb2RlID0gc3ViOworCWZyYW1lLT5maXAuZmlwX2RsX2xlbiA9IGh0b25zKGRsZW4gLyBGSVBfQlBXKTsKKworCWZyYW1lLT5tYWMuZmRfZGVzYy5maXBfZHR5cGUgPSBGSVBfRFRfTUFDOworCWZyYW1lLT5tYWMuZmRfZGVzYy5maXBfZGxlbiA9IHNpemVvZihmcmFtZS0+bWFjKSAvIEZJUF9CUFc7CisJbWVtY3B5KGZyYW1lLT5tYWMuZmRfbWFjLCBmaXAtPmN0bF9zcmNfYWRkciwgRVRIX0FMRU4pOworCisJZnJhbWUtPnd3bm4uZmRfZGVzYy5maXBfZHR5cGUgPSBGSVBfRFRfTkFNRTsKKwlmcmFtZS0+d3dubi5mZF9kZXNjLmZpcF9kbGVuID0gc2l6ZW9mKGZyYW1lLT53d25uKSAvIEZJUF9CUFc7CisJcHV0X3VuYWxpZ25lZF9iZTY0KGZpcC0+bHAtPnd3bm4sICZmcmFtZS0+d3dubi5mZF93d24pOworCisJZnJhbWUtPnZuLmZkX2Rlc2MuZmlwX2R0eXBlID0gRklQX0RUX1ZOX0lEOworCWZyYW1lLT52bi5mZF9kZXNjLmZpcF9kbGVuID0gc2l6ZW9mKGZyYW1lLT52bikgLyBGSVBfQlBXOworCWh0b24yNChmcmFtZS0+dm4uZmRfbWFjLCBGSVBfVk5fRkNfTUFQKTsKKwlodG9uMjQoZnJhbWUtPnZuLmZkX21hYyArIDMsIGZpcC0+cG9ydF9pZCk7CisJaHRvbjI0KGZyYW1lLT52bi5mZF9mY19pZCwgZmlwLT5wb3J0X2lkKTsKKwlwdXRfdW5hbGlnbmVkX2JlNjQoZmlwLT5scC0+d3dwbiwgJmZyYW1lLT52bi5mZF93d3BuKTsKKworCS8qCisJICogRm9yIGNsYWltcywgYWRkIEZDLTQgZmVhdHVyZXMuCisJICogVEJEOiBBZGQgaW50ZXJmYWNlIHRvIGdldCBmYy00IHR5cGVzIGFuZCBmZWF0dXJlcyBmcm9tIGxpYmZjLgorCSAqLworCWlmIChzdWIgPT0gRklQX1NDX1ZOX0NMQUlNX05PVElGWSB8fCBzdWIgPT0gRklQX1NDX1ZOX0NMQUlNX1JFUCkgeworCQlmZiA9IChzdHJ1Y3QgZmlwX2ZjNF9mZWF0ICopKGZyYW1lICsgMSk7CisJCWZmLT5mZF9kZXNjLmZpcF9kdHlwZSA9IEZJUF9EVF9GQzRGOworCQlmZi0+ZmRfZGVzYy5maXBfZGxlbiA9IHNpemVvZigqZmYpIC8gRklQX0JQVzsKKwkJZmYtPmZkX2Z0cyA9IGZpcC0+bHAtPmZjdHM7CisKKwkJZmNwX2ZlYXQgPSAwOworCQlpZiAoZmlwLT5scC0+c2VydmljZV9wYXJhbXMgJiBGQ1BfU1BQRl9JTklUX0ZDTikKKwkJCWZjcF9mZWF0IHw9IEZDUF9GRUFUX0lOSVQ7CisJCWlmIChmaXAtPmxwLT5zZXJ2aWNlX3BhcmFtcyAmIEZDUF9TUFBGX1RBUkdfRkNOKQorCQkJZmNwX2ZlYXQgfD0gRkNQX0ZFQVRfVEFSRzsKKwkJZmNwX2ZlYXQgPDw9IChGQ19UWVBFX0ZDUCAqIDQpICUgMzI7CisJCWZmLT5mZF9mZi5mZF9mZWF0W0ZDX1RZUEVfRkNQICogNCAvIDMyXSA9IGh0b25sKGZjcF9mZWF0KTsKKworCQlzaXplID0gKHN0cnVjdCBmaXBfc2l6ZV9kZXNjICopKGZmICsgMSk7CisJCXNpemUtPmZkX2Rlc2MuZmlwX2R0eXBlID0gRklQX0RUX0ZDT0VfU0laRTsKKwkJc2l6ZS0+ZmRfZGVzYy5maXBfZGxlbiA9IHNpemVvZigqc2l6ZSkgLyBGSVBfQlBXOworCQlzaXplLT5mZF9zaXplID0gaHRvbnMoZmNvZV9jdGxyX2Zjb2Vfc2l6ZShmaXApKTsKKwl9CisKKwlza2JfcHV0KHNrYiwgbGVuKTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRklQKTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCisJZmlwLT5zZW5kKGZpcCwgc2tiKTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fcnBvcnRfY2FsbGJhY2sgLSBFdmVudCBoYW5kbGVyIGZvciBycG9ydCBldmVudHMuCisgKiBAbHBvcnQ6IFRoZSBscG9ydCB3aGljaCBpcyByZWNlaXZpbmcgdGhlIGV2ZW50CisgKiBAcmRhdGE6IHJlbW90ZSBwb3J0IHByaXZhdGUgZGF0YQorICogQGV2ZW50OiBUaGUgZXZlbnQgdGhhdCBvY2N1cmVkCisgKgorICogTG9ja2luZyBOb3RlOiAgVGhlIHJwb3J0IGxvY2sgbXVzdCBub3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3ZuX3Jwb3J0X2NhbGxiYWNrKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSwKKwkJCQkJZW51bSBmY19ycG9ydF9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSBscG9ydC0+ZGlzYy5wcml2OworCXN0cnVjdCBmY29lX3Jwb3J0ICpmcnBvcnQgPSBmY29lX2N0bHJfcnBvcnQocmRhdGEpOworCisJTElCRkNPRV9GSVBfREJHKGZpcCwgInZuX3Jwb3J0X2NhbGxiYWNrICV4IGV2ZW50ICVkXG4iLAorCQkJcmRhdGEtPmlkcy5wb3J0X2lkLCBldmVudCk7CisKKwltdXRleF9sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQT1JUX0VWX1JFQURZOgorCQlmcnBvcnQtPmxvZ2luX2NvdW50ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSUE9SVF9FVl9MT0dPOgorCWNhc2UgUlBPUlRfRVZfRkFJTEVEOgorCWNhc2UgUlBPUlRfRVZfU1RPUDoKKwkJZnJwb3J0LT5sb2dpbl9jb3VudCsrOworCQlpZiAoZnJwb3J0LT5sb2dpbl9jb3VudCA+IEZDT0VfQ1RMUl9WTjJWTl9MT0dJTl9MSU1JVCkgeworCQkJTElCRkNPRV9GSVBfREJHKGZpcCwKKwkJCQkJInJwb3J0IEZMT0dJIGxpbWl0ZWQgcG9ydF9pZCAlNi42eFxuIiwKKwkJCQkJcmRhdGEtPmlkcy5wb3J0X2lkKTsKKwkJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYocmRhdGEpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmZpcC0+Y3Rscl9tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmNfcnBvcnRfb3BlcmF0aW9ucyBmY29lX2N0bHJfdm5fcnBvcnRfb3BzID0geworCS5ldmVudF9jYWxsYmFjayA9IGZjb2VfY3Rscl92bl9ycG9ydF9jYWxsYmFjaywKK307CisKKy8qKgorICogZmNvZV9jdGxyX2Rpc2Nfc3RvcF9sb2NrZWQoKSAtIHN0b3AgZGlzY292ZXJ5IGluIFZOMlZOIG1vZGUKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKKyAqCisgKiBDYWxsZWQgd2l0aCBjdGxyX211dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl9kaXNjX3N0b3BfbG9ja2VkKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJbXV0ZXhfbG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CisJbHBvcnQtPmRpc2MuZGlzY19jYWxsYmFjayA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfZGlzY19zdG9wKCkgLSBzdG9wIGRpc2NvdmVyeSBpbiBWTjJWTiBtb2RlCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKgorICogQ2FsbGVkIHRocm91Z2ggdGhlIGxvY2FsIHBvcnQgdGVtcGxhdGUgZm9yIGRpc2NvdmVyeS4KKyAqIENhbGxlZCB3aXRob3V0IHRoZSBjdGxyX211dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl9kaXNjX3N0b3Aoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSBscG9ydC0+ZGlzYy5wcml2OworCisJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKKwlmY29lX2N0bHJfZGlzY19zdG9wX2xvY2tlZChscG9ydCk7CisJbXV0ZXhfdW5sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOworfQorCisvKioKKyAqIGZjb2VfY3Rscl9kaXNjX3N0b3BfZmluYWwoKSAtIHN0b3AgZGlzY292ZXJ5IGZvciBzaHV0ZG93biBpbiBWTjJWTiBtb2RlCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKgorICogQ2FsbGVkIHRocm91Z2ggdGhlIGxvY2FsIHBvcnQgdGVtcGxhdGUgZm9yIGRpc2NvdmVyeS4KKyAqIENhbGxlZCB3aXRob3V0IHRoZSBjdGxyX211dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl9kaXNjX3N0b3BfZmluYWwoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlmY29lX2N0bHJfZGlzY19zdG9wKGxwb3J0KTsKKwlscG9ydC0+dHQucnBvcnRfZmx1c2hfcXVldWUoKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fcmVzdGFydCgpIC0gVk4yVk4gcHJvYmUgcmVzdGFydCB3aXRoIG5ldyBwb3J0X2lkCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKgorICogQ2FsbGVkIHdpdGggZmNvZV9jdGxyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3ZuX3Jlc3RhcnQoc3RydWN0IGZjb2VfY3RsciAqZmlwKQoreworCXVuc2lnbmVkIGxvbmcgd2FpdDsKKwl1MzIgcG9ydF9pZDsKKworCWZjb2VfY3Rscl9kaXNjX3N0b3BfbG9ja2VkKGZpcC0+bHApOworCisJLyoKKwkgKiBHZXQgcHJvcG9zZWQgcG9ydCBJRC4KKwkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0cnkgYWZ0ZXIgbGluayB1cCwgdXNlIGFueSBwcmV2aW91cyBwb3J0X2lkLgorCSAqIElmIHRoZXJlIHdhcyBub25lLCB1c2UgdGhlIGxvdyBiaXRzIG9mIHRoZSBwb3J0X25hbWUuCisJICogT24gc3Vic2VxdWVudCB0cmllcywgZ2V0IHRoZSBuZXh0IHJhbmRvbSBvbmUuCisJICogRG9uJ3QgdXNlIHJlc2VydmVkIElEcywgdXNlIGFub3RoZXIgbm9uLXplcm8gdmFsdWUsIGp1c3QgYXMgcmFuZG9tLgorCSAqLworCXBvcnRfaWQgPSBmaXAtPnBvcnRfaWQ7CisJaWYgKGZpcC0+cHJvYmVfdHJpZXMpCisJCXBvcnRfaWQgPSBwcmFuZG9tMzIoJmZpcC0+cm5kX3N0YXRlKSAmIDB4ZmZmZjsKKwllbHNlIGlmICghcG9ydF9pZCkKKwkJcG9ydF9pZCA9IGZpcC0+bHAtPnd3cG4gJiAweGZmZmY7CisJaWYgKCFwb3J0X2lkIHx8IHBvcnRfaWQgPT0gMHhmZmZmKQorCQlwb3J0X2lkID0gMTsKKwlmaXAtPnBvcnRfaWQgPSBwb3J0X2lkOworCisJaWYgKGZpcC0+cHJvYmVfdHJpZXMgPCBGSVBfVk5fUkxJTV9DT1VOVCkgeworCQlmaXAtPnByb2JlX3RyaWVzKys7CisJCXdhaXQgPSByYW5kb20zMigpICUgRklQX1ZOX1BST0JFX1dBSVQ7CisJfSBlbHNlCisJCXdhaXQgPSBGSVBfVk5fUkxJTV9JTlQ7CisJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh3YWl0KSk7CisJZmNvZV9jdGxyX3NldF9zdGF0ZShmaXAsIEZJUF9TVF9WTk1QX1NUQVJUKTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fc3RhcnQoKSAtIFN0YXJ0IGluIFZOMlZOIG1vZGUKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKKyAqCisgKiBDYWxsZWQgd2l0aCBmY29lX2N0bHIgbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfdm5fc3RhcnQoc3RydWN0IGZjb2VfY3RsciAqZmlwKQoreworCWZpcC0+cHJvYmVfdHJpZXMgPSAwOworCXByYW5kb20zMl9zZWVkKCZmaXAtPnJuZF9zdGF0ZSwgZmlwLT5scC0+d3dwbik7CisJZmNvZV9jdGxyX3ZuX3Jlc3RhcnQoZmlwKTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fcGFyc2UgLSBwYXJzZSBwcm9iZSByZXF1ZXN0IG9yIHJlc3BvbnNlCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKiBAc2tiOiBpbmNvbWluZyBwYWNrZXQKKyAqIEByZGF0YTogYnVmZmVyIGZvciByZXN1bHRpbmcgcGFyc2VkIFZOIGVudHJ5IHBsdXMgZmNvZV9ycG9ydAorICoKKyAqIFJldHVybnMgbm9uLXplcm8gZXJyb3IgbnVtYmVyIG9uIGVycm9yLgorICogRG9lcyBub3QgY29uc3VtZSB0aGUgcGFja2V0LgorICovCitzdGF0aWMgaW50IGZjb2VfY3Rscl92bl9wYXJzZShzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhKQoreworCXN0cnVjdCBmaXBfaGVhZGVyICpmaXBoOworCXN0cnVjdCBmaXBfZGVzYyAqZGVzYyA9IE5VTEw7CisJc3RydWN0IGZpcF9tYWNfZGVzYyAqbWFjZCA9IE5VTEw7CisJc3RydWN0IGZpcF93d25fZGVzYyAqd3duID0gTlVMTDsKKwlzdHJ1Y3QgZmlwX3ZuX2Rlc2MgKnZuID0gTlVMTDsKKwlzdHJ1Y3QgZmlwX3NpemVfZGVzYyAqc2l6ZSA9IE5VTEw7CisJc3RydWN0IGZjb2VfcnBvcnQgKmZycG9ydDsKKwlzaXplX3QgcmxlbjsKKwlzaXplX3QgZGxlbjsKKwl1MzIgZGVzY19tYXNrID0gMDsKKwl1MzIgZHR5cGU7CisJdTggc3ViOworCisJbWVtc2V0KHJkYXRhLCAwLCBzaXplb2YoKnJkYXRhKSArIHNpemVvZigqZnJwb3J0KSk7CisJZnJwb3J0ID0gZmNvZV9jdGxyX3Jwb3J0KHJkYXRhKTsKKworCWZpcGggPSAoc3RydWN0IGZpcF9oZWFkZXIgKilza2ItPmRhdGE7CisJZnJwb3J0LT5mbGFncyA9IG50b2hzKGZpcGgtPmZpcF9mbGFncyk7CisKKwlzdWIgPSBmaXBoLT5maXBfc3ViY29kZTsKKwlzd2l0Y2ggKHN1YikgeworCWNhc2UgRklQX1NDX1ZOX1BST0JFX1JFUToKKwljYXNlIEZJUF9TQ19WTl9QUk9CRV9SRVA6CisJY2FzZSBGSVBfU0NfVk5fQkVBQ09OOgorCQlkZXNjX21hc2sgPSBCSVQoRklQX0RUX01BQykgfCBCSVQoRklQX0RUX05BTUUpIHwKKwkJCSAgICBCSVQoRklQX0RUX1ZOX0lEKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU0NfVk5fQ0xBSU1fTk9USUZZOgorCWNhc2UgRklQX1NDX1ZOX0NMQUlNX1JFUDoKKwkJZGVzY19tYXNrID0gQklUKEZJUF9EVF9NQUMpIHwgQklUKEZJUF9EVF9OQU1FKSB8CisJCQkgICAgQklUKEZJUF9EVF9WTl9JRCkgfCBCSVQoRklQX0RUX0ZDNEYpIHwKKwkJCSAgICBCSVQoRklQX0RUX0ZDT0VfU0laRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJ2bl9wYXJzZSB1bmtub3duIHN1YmNvZGUgJXVcbiIsIHN1Yik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJsZW4gPSBudG9ocyhmaXBoLT5maXBfZGxfbGVuKSAqIDQ7CisJaWYgKHJsZW4gKyBzaXplb2YoKmZpcGgpID4gc2tiLT5sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJZGVzYyA9IChzdHJ1Y3QgZmlwX2Rlc2MgKikoZmlwaCArIDEpOworCXdoaWxlIChybGVuID4gMCkgeworCQlkbGVuID0gZGVzYy0+ZmlwX2RsZW4gKiBGSVBfQlBXOworCQlpZiAoZGxlbiA8IHNpemVvZigqZGVzYykgfHwgZGxlbiA+IHJsZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkdHlwZSA9IGRlc2MtPmZpcF9kdHlwZTsKKwkJaWYgKGR0eXBlIDwgMzIpIHsKKwkJCWlmICghKGRlc2NfbWFzayAmIEJJVChkdHlwZSkpKSB7CisJCQkJTElCRkNPRV9GSVBfREJHKGZpcCwKKwkJCQkJCSJ1bmV4cGVjdGVkIG9yIGR1cGxpY2F0ZWQgZGVzYyAiCisJCQkJCQkiZGVzYyB0eXBlICV1IGluICIKKwkJCQkJCSJGSVAgVk4yVk4gc3VidHlwZSAldVxuIiwKKwkJCQkJCWR0eXBlLCBzdWIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJZGVzY19tYXNrICY9IH5CSVQoZHR5cGUpOworCQl9CisKKwkJc3dpdGNoIChkdHlwZSkgeworCQljYXNlIEZJUF9EVF9NQUM6CisJCQlpZiAoZGxlbiAhPSBzaXplb2Yoc3RydWN0IGZpcF9tYWNfZGVzYykpCisJCQkJZ290byBsZW5fZXJyOworCQkJbWFjZCA9IChzdHJ1Y3QgZmlwX21hY19kZXNjICopZGVzYzsKKwkJCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihtYWNkLT5mZF9tYWMpKSB7CisJCQkJTElCRkNPRV9GSVBfREJHKGZpcCwKKwkJCQkJIkludmFsaWQgTUFDIGFkZHIgJXBNIGluIEZJUCBWTjJWTlxuIiwKKwkJCQkJIG1hY2QtPmZkX21hYyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQltZW1jcHkoZnJwb3J0LT5lbm9kZV9tYWMsIG1hY2QtPmZkX21hYywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgRklQX0RUX05BTUU6CisJCQlpZiAoZGxlbiAhPSBzaXplb2Yoc3RydWN0IGZpcF93d25fZGVzYykpCisJCQkJZ290byBsZW5fZXJyOworCQkJd3duID0gKHN0cnVjdCBmaXBfd3duX2Rlc2MgKilkZXNjOworCQkJcmRhdGEtPmlkcy5ub2RlX25hbWUgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJnd3bi0+ZmRfd3duKTsKKwkJCWJyZWFrOworCQljYXNlIEZJUF9EVF9WTl9JRDoKKwkJCWlmIChkbGVuICE9IHNpemVvZihzdHJ1Y3QgZmlwX3ZuX2Rlc2MpKQorCQkJCWdvdG8gbGVuX2VycjsKKwkJCXZuID0gKHN0cnVjdCBmaXBfdm5fZGVzYyAqKWRlc2M7CisJCQltZW1jcHkoZnJwb3J0LT52bl9tYWMsIHZuLT5mZF9tYWMsIEVUSF9BTEVOKTsKKwkJCXJkYXRhLT5pZHMucG9ydF9pZCA9IG50b2gyNCh2bi0+ZmRfZmNfaWQpOworCQkJcmRhdGEtPmlkcy5wb3J0X25hbWUgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJnZuLT5mZF93d3BuKTsKKwkJCWJyZWFrOworCQljYXNlIEZJUF9EVF9GQzRGOgorCQkJaWYgKGRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBmaXBfZmM0X2ZlYXQpKQorCQkJCWdvdG8gbGVuX2VycjsKKwkJCWJyZWFrOworCQljYXNlIEZJUF9EVF9GQ09FX1NJWkU6CisJCQlpZiAoZGxlbiAhPSBzaXplb2Yoc3RydWN0IGZpcF9zaXplX2Rlc2MpKQorCQkJCWdvdG8gbGVuX2VycjsKKwkJCXNpemUgPSAoc3RydWN0IGZpcF9zaXplX2Rlc2MgKilkZXNjOworCQkJZnJwb3J0LT5mY29lX2xlbiA9IG50b2hzKHNpemUtPmZkX3NpemUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLCAidW5leHBlY3RlZCBkZXNjcmlwdG9yIHR5cGUgJXggIgorCQkJCQkiaW4gRklQIHByb2JlXG4iLCBkdHlwZSk7CisJCQkvKiBzdGFuZGFyZCBzYXlzIGlnbm9yZSB1bmtub3duIGRlc2NyaXB0b3JzID49IDEyOCAqLworCQkJaWYgKGR0eXBlIDwgRklQX0RUX1ZFTkRPUl9CQVNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZGVzYyA9IChzdHJ1Y3QgZmlwX2Rlc2MgKikoKGNoYXIgKilkZXNjICsgZGxlbik7CisJCXJsZW4gLT0gZGxlbjsKKwl9CisJcmV0dXJuIDA7CisKK2xlbl9lcnI6CisJTElCRkNPRV9GSVBfREJHKGZpcCwgIkZJUCBsZW5ndGggZXJyb3IgaW4gZGVzY3JpcHRvciB0eXBlICV4IGxlbiAlenVcbiIsCisJCQlkdHlwZSwgZGxlbik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX3NlbmRfY2xhaW0oKSAtIHNlbmQgbXVsdGljYXN0IEZJUCBWTjJWTiBDbGFpbSBOb3RpZmljYXRpb24uCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKgorICogQ2FsbGVkIHdpdGggY3Rscl9tdXRleCBoZWxkLgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfdm5fc2VuZF9jbGFpbShzdHJ1Y3QgZmNvZV9jdGxyICpmaXApCit7CisJZmNvZV9jdGxyX3ZuX3NlbmQoZmlwLCBGSVBfU0NfVk5fQ0xBSU1fTk9USUZZLCBmY29lX2FsbF92bjJ2biwgMCk7CisJZmlwLT5zb2xfdGltZSA9IGppZmZpZXM7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX3Byb2JlX3JlcSgpIC0gaGFuZGxlIGluY29taW5nIFZOMlZOIHByb2JlIHJlcXVlc3QuCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKiBAcmRhdGE6IHBhcnNlZCByZW1vdGUgcG9ydCB3aXRoIGZycG9ydCBmcm9tIHRoZSBwcm9iZSByZXF1ZXN0CisgKgorICogQ2FsbGVkIHdpdGggY3Rscl9tdXRleCBoZWxkLgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfdm5fcHJvYmVfcmVxKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwKKwkJCQkgICBzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEpCit7CisJc3RydWN0IGZjb2VfcnBvcnQgKmZycG9ydCA9IGZjb2VfY3Rscl9ycG9ydChyZGF0YSk7CisKKwlpZiAocmRhdGEtPmlkcy5wb3J0X2lkICE9IGZpcC0+cG9ydF9pZCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChmaXAtPnN0YXRlKSB7CisJY2FzZSBGSVBfU1RfVk5NUF9DTEFJTToKKwljYXNlIEZJUF9TVF9WTk1QX1VQOgorCQlmY29lX2N0bHJfdm5fc2VuZChmaXAsIEZJUF9TQ19WTl9QUk9CRV9SRVAsCisJCQkJICBmcnBvcnQtPmVub2RlX21hYywgMCk7CisJCWJyZWFrOworCWNhc2UgRklQX1NUX1ZOTVBfUFJPQkUxOgorCWNhc2UgRklQX1NUX1ZOTVBfUFJPQkUyOgorCQkvKgorCQkgKiBEZWNpZGUgd2hldGhlciB0byByZXBseSB0byB0aGUgUHJvYmUuCisJCSAqIE91ciBzZWxlY3RlZCBhZGRyZXNzIGlzIG5ldmVyIGEgInJlY29yZGVkIiBvbmUsIHNvCisJCSAqIG9ubHkgcmVwbHkgaWYgb3VyIFdXUE4gaXMgZ3JlYXRlciBhbmQgdGhlCisJCSAqIFByb2JlJ3MgUkVDIGJpdCBpcyBub3Qgc2V0LgorCQkgKiBJZiB3ZSBkb24ndCByZXBseSwgd2Ugd2lsbCBjaGFuZ2Ugb3VyIGFkZHJlc3MuCisJCSAqLworCQlpZiAoZmlwLT5scC0+d3dwbiA+IHJkYXRhLT5pZHMucG9ydF9uYW1lICYmCisJCSAgICAhKGZycG9ydC0+ZmxhZ3MgJiBGSVBfRkxfUkVDX09SX1AyUCkpIHsKKwkJCWZjb2VfY3Rscl92bl9zZW5kKGZpcCwgRklQX1NDX1ZOX1BST0JFX1JFUCwKKwkJCQkJICBmcnBvcnQtPmVub2RlX21hYywgMCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEZJUF9TVF9WTk1QX1NUQVJUOgorCQlmY29lX2N0bHJfdm5fcmVzdGFydChmaXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX3Byb2JlX3JlcGx5KCkgLSBoYW5kbGUgaW5jb21pbmcgVk4yVk4gcHJvYmUgcmVwbHkuCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKiBAcmRhdGE6IHBhcnNlZCByZW1vdGUgcG9ydCB3aXRoIGZycG9ydCBmcm9tIHRoZSBwcm9iZSByZXF1ZXN0CisgKgorICogQ2FsbGVkIHdpdGggY3Rscl9tdXRleCBoZWxkLgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfdm5fcHJvYmVfcmVwbHkoc3RydWN0IGZjb2VfY3RsciAqZmlwLAorCQkJCSAgIHN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSkKK3sKKwlpZiAocmRhdGEtPmlkcy5wb3J0X2lkICE9IGZpcC0+cG9ydF9pZCkKKwkJcmV0dXJuOworCXN3aXRjaCAoZmlwLT5zdGF0ZSkgeworCWNhc2UgRklQX1NUX1ZOTVBfU1RBUlQ6CisJY2FzZSBGSVBfU1RfVk5NUF9QUk9CRTE6CisJY2FzZSBGSVBfU1RfVk5NUF9QUk9CRTI6CisJY2FzZSBGSVBfU1RfVk5NUF9DTEFJTToKKwkJZmNvZV9jdGxyX3ZuX3Jlc3RhcnQoZmlwKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU1RfVk5NUF9VUDoKKwkJZmNvZV9jdGxyX3ZuX3NlbmRfY2xhaW0oZmlwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGZjb2VfY3Rscl92bl9hZGQoKSAtIEFkZCBhIFZOMlZOIGVudHJ5IHRvIHRoZSBsaXN0LCBiYXNlZCBvbiBhIGNsYWltIHJlcGx5LgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlcgorICogQG5ldzogbmV3bHktcGFyc2VkIHJlbW90ZSBwb3J0IHdpdGggZnJwb3J0IGFzIGEgdGVtcGxhdGUgZm9yIG5ldyByZGF0YQorICoKKyAqIENhbGxlZCB3aXRoIGN0bHJfbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3ZuX2FkZChzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsIHN0cnVjdCBmY19ycG9ydF9wcml2ICpuZXcpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGZpcC0+bHA7CisJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOworCXN0cnVjdCBmY19ycG9ydF9pZGVudGlmaWVycyAqaWRzOworCXN0cnVjdCBmY29lX3Jwb3J0ICpmcnBvcnQ7CisJdTMyIHBvcnRfaWQ7CisKKwlwb3J0X2lkID0gbmV3LT5pZHMucG9ydF9pZDsKKwlpZiAocG9ydF9pZCA9PSBmaXAtPnBvcnRfaWQpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOworCXJkYXRhID0gbHBvcnQtPnR0LnJwb3J0X2NyZWF0ZShscG9ydCwgcG9ydF9pZCk7CisJaWYgKCFyZGF0YSkgeworCQltdXRleF91bmxvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJcmRhdGEtPm9wcyA9ICZmY29lX2N0bHJfdm5fcnBvcnRfb3BzOworCXJkYXRhLT5kaXNjX2lkID0gbHBvcnQtPmRpc2MuZGlzY19pZDsKKworCWlkcyA9ICZyZGF0YS0+aWRzOworCWlmICgoaWRzLT5wb3J0X25hbWUgIT0gLTEgJiYgaWRzLT5wb3J0X25hbWUgIT0gbmV3LT5pZHMucG9ydF9uYW1lKSB8fAorCSAgICAoaWRzLT5ub2RlX25hbWUgIT0gLTEgJiYgaWRzLT5ub2RlX25hbWUgIT0gbmV3LT5pZHMubm9kZV9uYW1lKSkKKwkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihyZGF0YSk7CisJaWRzLT5wb3J0X25hbWUgPSBuZXctPmlkcy5wb3J0X25hbWU7CisJaWRzLT5ub2RlX25hbWUgPSBuZXctPmlkcy5ub2RlX25hbWU7CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKworCWZycG9ydCA9IGZjb2VfY3Rscl9ycG9ydChyZGF0YSk7CisJTElCRkNPRV9GSVBfREJHKGZpcCwgInZuX2FkZCBycG9ydCAlNi42eCAlc1xuIiwKKwkJCXBvcnRfaWQsIGZycG9ydC0+ZmNvZV9sZW4gPyAib2xkIiA6ICJuZXciKTsKKwkqZnJwb3J0ID0gKmZjb2VfY3Rscl9ycG9ydChuZXcpOworCWZycG9ydC0+dGltZSA9IDA7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX2xvb2t1cCgpIC0gRmluZCBWTiByZW1vdGUgcG9ydCdzIE1BQyBhZGRyZXNzCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKiBAcG9ydF9pZDogIFRoZSBwb3J0X2lkIG9mIHRoZSByZW1vdGUgVk5fbm9kZQorICogQG1hYzogYnVmZmVyIHdoaWNoIHdpbGwgaG9sZCB0aGUgVk5fTk9ERSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcywgaWYgZm91bmQuCisgKgorICogUmV0dXJucyBub24temVybyBlcnJvciBpZiBubyByZW1vdGUgcG9ydCBmb3VuZC4KKyAqLworc3RhdGljIGludCBmY29lX2N0bHJfdm5fbG9va3VwKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgdTMyIHBvcnRfaWQsIHU4ICptYWMpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGZpcC0+bHA7CisJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOworCXN0cnVjdCBmY29lX3Jwb3J0ICpmcnBvcnQ7CisJaW50IHJldCA9IC0xOworCisJcmN1X3JlYWRfbG9jaygpOworCXJkYXRhID0gbHBvcnQtPnR0LnJwb3J0X2xvb2t1cChscG9ydCwgcG9ydF9pZCk7CisJaWYgKHJkYXRhKSB7CisJCWZycG9ydCA9IGZjb2VfY3Rscl9ycG9ydChyZGF0YSk7CisJCW1lbWNweShtYWMsIGZycG9ydC0+ZW5vZGVfbWFjLCBFVEhfQUxFTik7CisJCXJldCA9IDA7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX2NsYWltX25vdGlmeSgpIC0gaGFuZGxlIHJlY2VpdmVkIEZJUCBWTjJWTiBDbGFpbSBOb3RpZmljYXRpb24KKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKKyAqIEBuZXc6IG5ld2x5LXBhcnNlZCByZW1vdGUgcG9ydCB3aXRoIGZycG9ydCBhcyBhIHRlbXBsYXRlIGZvciBuZXcgcmRhdGEKKyAqCisgKiBDYWxsZWQgd2l0aCBjdGxyX211dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl92bl9jbGFpbV9ub3RpZnkoc3RydWN0IGZjb2VfY3RsciAqZmlwLAorCQkJCSAgICAgIHN0cnVjdCBmY19ycG9ydF9wcml2ICpuZXcpCit7CisJc3RydWN0IGZjb2VfcnBvcnQgKmZycG9ydCA9IGZjb2VfY3Rscl9ycG9ydChuZXcpOworCisJaWYgKGZycG9ydC0+ZmxhZ3MgJiBGSVBfRkxfUkVDX09SX1AyUCkgeworCQlmY29lX2N0bHJfdm5fc2VuZChmaXAsIEZJUF9TQ19WTl9QUk9CRV9SRVEsIGZjb2VfYWxsX3ZuMnZuLCAwKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKGZpcC0+c3RhdGUpIHsKKwljYXNlIEZJUF9TVF9WTk1QX1NUQVJUOgorCWNhc2UgRklQX1NUX1ZOTVBfUFJPQkUxOgorCWNhc2UgRklQX1NUX1ZOTVBfUFJPQkUyOgorCQlpZiAobmV3LT5pZHMucG9ydF9pZCA9PSBmaXAtPnBvcnRfaWQpCisJCQlmY29lX2N0bHJfdm5fcmVzdGFydChmaXApOworCQlicmVhazsKKwljYXNlIEZJUF9TVF9WTk1QX0NMQUlNOgorCWNhc2UgRklQX1NUX1ZOTVBfVVA6CisJCWlmIChuZXctPmlkcy5wb3J0X2lkID09IGZpcC0+cG9ydF9pZCkgeworCQkJaWYgKG5ldy0+aWRzLnBvcnRfbmFtZSA+IGZpcC0+bHAtPnd3cG4pIHsKKwkJCQlmY29lX2N0bHJfdm5fcmVzdGFydChmaXApOworCQkJCWJyZWFrOworCQkJfQorCQkJZmNvZV9jdGxyX3ZuX3NlbmRfY2xhaW0oZmlwKTsKKwkJCWJyZWFrOworCQl9CisJCWZjb2VfY3Rscl92bl9zZW5kKGZpcCwgRklQX1NDX1ZOX0NMQUlNX1JFUCwgZnJwb3J0LT5lbm9kZV9tYWMsCisJCQkJICBtaW4oKHUzMilmcnBvcnQtPmZjb2VfbGVuLAorCQkJCSAgICAgIGZjb2VfY3Rscl9mY29lX3NpemUoZmlwKSkpOworCQlmY29lX2N0bHJfdm5fYWRkKGZpcCwgbmV3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGZjb2VfY3Rscl92bl9jbGFpbV9yZXNwKCkgLSBoYW5kbGUgcmVjZWl2ZWQgQ2xhaW0gUmVzcG9uc2UKKyAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIgdGhhdCByZWNlaXZlZCB0aGUgZnJhbWUKKyAqIEBuZXc6IG5ld2x5LXBhcnNlZCByZW1vdGUgcG9ydCB3aXRoIGZycG9ydCBmcm9tIHRoZSBDbGFpbSBSZXNwb25zZQorICoKKyAqIENhbGxlZCB3aXRoIGN0bHJfbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3ZuX2NsYWltX3Jlc3Aoc3RydWN0IGZjb2VfY3RsciAqZmlwLAorCQkJCSAgICBzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqbmV3KQoreworCUxJQkZDT0VfRklQX0RCRyhmaXAsICJjbGFpbSByZXNwIGZyb20gZnJvbSBycG9ydCAleCAtIHN0YXRlICVzXG4iLAorCQkJbmV3LT5pZHMucG9ydF9pZCwgZmNvZV9jdGxyX3N0YXRlKGZpcC0+c3RhdGUpKTsKKwlpZiAoZmlwLT5zdGF0ZSA9PSBGSVBfU1RfVk5NUF9VUCB8fCBmaXAtPnN0YXRlID09IEZJUF9TVF9WTk1QX0NMQUlNKQorCQlmY29lX2N0bHJfdm5fYWRkKGZpcCwgbmV3KTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fYmVhY29uKCkgLSBoYW5kbGUgcmVjZWl2ZWQgYmVhY29uLgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlciB0aGF0IHJlY2VpdmVkIHRoZSBmcmFtZQorICogQG5ldzogbmV3bHktcGFyc2VkIHJlbW90ZSBwb3J0IHdpdGggZnJwb3J0IGZyb20gdGhlIEJlYWNvbgorICoKKyAqIENhbGxlZCB3aXRoIGN0bHJfbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIHZvaWQgZmNvZV9jdGxyX3ZuX2JlYWNvbihzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsCisJCQkJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKm5ldykKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZmlwLT5scDsKKwlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CisJc3RydWN0IGZjb2VfcnBvcnQgKmZycG9ydDsKKworCWZycG9ydCA9IGZjb2VfY3Rscl9ycG9ydChuZXcpOworCWlmIChmcnBvcnQtPmZsYWdzICYgRklQX0ZMX1JFQ19PUl9QMlApIHsKKwkJZmNvZV9jdGxyX3ZuX3NlbmQoZmlwLCBGSVBfU0NfVk5fUFJPQkVfUkVRLCBmY29lX2FsbF92bjJ2biwgMCk7CisJCXJldHVybjsKKwl9CisJbXV0ZXhfbG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CisJcmRhdGEgPSBscG9ydC0+dHQucnBvcnRfbG9va3VwKGxwb3J0LCBuZXctPmlkcy5wb3J0X2lkKTsKKwlpZiAocmRhdGEpCisJCWtyZWZfZ2V0KCZyZGF0YS0+a3JlZik7CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKwlpZiAocmRhdGEpIHsKKwkJaWYgKHJkYXRhLT5pZHMubm9kZV9uYW1lID09IG5ldy0+aWRzLm5vZGVfbmFtZSAmJgorCQkgICAgcmRhdGEtPmlkcy5wb3J0X25hbWUgPT0gbmV3LT5pZHMucG9ydF9uYW1lKSB7CisJCQlmcnBvcnQgPSBmY29lX2N0bHJfcnBvcnQocmRhdGEpOworCQkJaWYgKCFmcnBvcnQtPnRpbWUgJiYgZmlwLT5zdGF0ZSA9PSBGSVBfU1RfVk5NUF9VUCkKKwkJCQlscG9ydC0+dHQucnBvcnRfbG9naW4ocmRhdGEpOworCQkJZnJwb3J0LT50aW1lID0gamlmZmllczsKKwkJfQorCQlrcmVmX3B1dCgmcmRhdGEtPmtyZWYsIGxwb3J0LT50dC5ycG9ydF9kZXN0cm95KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZmlwLT5zdGF0ZSAhPSBGSVBfU1RfVk5NUF9VUCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBCZWFjb24gZnJvbSBhIG5ldyBuZWlnaGJvci4KKwkgKiBTZW5kIGEgY2xhaW0gbm90aWZ5IGlmIG9uZSBoYXNuJ3QgYmVlbiBzZW50IHJlY2VudGx5LgorCSAqIERvbid0IGFkZCB0aGUgbmVpZ2hib3IgeWV0LgorCSAqLworCUxJQkZDT0VfRklQX0RCRyhmaXAsICJiZWFjb24gZnJvbSBuZXcgcnBvcnQgJXguIHNlbmRpbmcgY2xhaW0gbm90aWZ5XG4iLAorCQkJbmV3LT5pZHMucG9ydF9pZCk7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJICAgICAgIGZpcC0+c29sX3RpbWUgKyBtc2Vjc190b19qaWZmaWVzKEZJUF9WTl9BTk5fV0FJVCkpKQorCQlmY29lX2N0bHJfdm5fc2VuZF9jbGFpbShmaXApOworfQorCisvKioKKyAqIGZjb2VfY3Rscl92bl9hZ2UoKSAtIENoZWNrIGZvciBWTl9wb3J0cyB3aXRob3V0IHJlY2VudCBiZWFjb25zCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCisgKgorICogQ2FsbGVkIHdpdGggY3Rscl9tdXRleCBoZWxkLgorICogQ2FsbGVkIG9ubHkgaW4gc3RhdGUgRklQX1NUX1ZOTVBfVVAuCisgKiBSZXR1cm5zIHRoZSBzb29uZXN0IHRpbWUgZm9yIG5leHQgYWdlLW91dCBvciBhIHRpbWUgZmFyIGluIHRoZSBmdXR1cmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZjb2VfY3Rscl92bl9hZ2Uoc3RydWN0IGZjb2VfY3RsciAqZmlwKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBmaXAtPmxwOworCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKKwlzdHJ1Y3QgZmNvZV9ycG9ydCAqZnJwb3J0OworCXVuc2lnbmVkIGxvbmcgbmV4dF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmU7CisKKwluZXh0X3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhGSVBfVk5fQkVBQ09OX0lOVCAqIDEwKTsKKwltdXRleF9sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGF0YSwgJmxwb3J0LT5kaXNjLnJwb3J0cywgcGVlcnMpIHsKKwkJZnJwb3J0ID0gZmNvZV9jdGxyX3Jwb3J0KHJkYXRhKTsKKwkJaWYgKCFmcnBvcnQtPnRpbWUpCisJCQljb250aW51ZTsKKwkJZGVhZGxpbmUgPSBmcnBvcnQtPnRpbWUgKworCQkJICAgbXNlY3NfdG9famlmZmllcyhGSVBfVk5fQkVBQ09OX0lOVCAqIDI1IC8gMTApOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBkZWFkbGluZSkpIHsKKwkJCWZycG9ydC0+dGltZSA9IDA7CisJCQlMSUJGQ09FX0ZJUF9EQkcoZmlwLAorCQkJCSJwb3J0ICUxNi4xNmxseCBmY19pZCAlNi42eCBiZWFjb24gZXhwaXJlZFxuIiwKKwkJCQlyZGF0YS0+aWRzLnBvcnRfbmFtZSwgcmRhdGEtPmlkcy5wb3J0X2lkKTsKKwkJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYocmRhdGEpOworCQl9IGVsc2UgaWYgKHRpbWVfYmVmb3JlKGRlYWRsaW5lLCBuZXh0X3RpbWUpKQorCQkJbmV4dF90aW1lID0gZGVhZGxpbmU7CisJfQorCW11dGV4X3VubG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CisJcmV0dXJuIG5leHRfdGltZTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fcmVjdigpIC0gUmVjZWl2ZSBhIEZJUCBmcmFtZQorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlciB0aGF0IHJlY2VpdmVkIHRoZSBmcmFtZQorICogQHNrYjogVGhlIHJlY2VpdmVkIEZJUCBmcmFtZQorICoKKyAqIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIGZyYW1lIGlzIGRyb3BwZWQuCisgKiBBbHdheXMgY29uc3VtZXMgdGhlIGZyYW1lLgorICovCitzdGF0aWMgaW50IGZjb2VfY3Rscl92bl9yZWN2KHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZmlwX2hlYWRlciAqZmlwaDsKKwllbnVtIGZpcF92bjJ2bl9zdWJjb2RlIHN1YjsKKwl1bmlvbiB7CisJCXN0cnVjdCBmY19ycG9ydF9wcml2IHJkYXRhOworCQlzdHJ1Y3QgZmNvZV9ycG9ydCBmcnBvcnQ7CisJfSBidWY7CisJaW50IHJjOworCisJZmlwaCA9IChzdHJ1Y3QgZmlwX2hlYWRlciAqKXNrYi0+ZGF0YTsKKwlzdWIgPSBmaXBoLT5maXBfc3ViY29kZTsKKworCXJjID0gZmNvZV9jdGxyX3ZuX3BhcnNlKGZpcCwgc2tiLCAmYnVmLnJkYXRhKTsKKwlpZiAocmMpIHsKKwkJTElCRkNPRV9GSVBfREJHKGZpcCwgInZuX3JlY3Ygdm5fcGFyc2UgZXJyb3IgJWRcbiIsIHJjKTsKKwkJZ290byBkcm9wOworCX0KKworCW11dGV4X2xvY2soJmZpcC0+Y3Rscl9tdXRleCk7CisJc3dpdGNoIChzdWIpIHsKKwljYXNlIEZJUF9TQ19WTl9QUk9CRV9SRVE6CisJCWZjb2VfY3Rscl92bl9wcm9iZV9yZXEoZmlwLCAmYnVmLnJkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU0NfVk5fUFJPQkVfUkVQOgorCQlmY29lX2N0bHJfdm5fcHJvYmVfcmVwbHkoZmlwLCAmYnVmLnJkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU0NfVk5fQ0xBSU1fTk9USUZZOgorCQlmY29lX2N0bHJfdm5fY2xhaW1fbm90aWZ5KGZpcCwgJmJ1Zi5yZGF0YSk7CisJCWJyZWFrOworCWNhc2UgRklQX1NDX1ZOX0NMQUlNX1JFUDoKKwkJZmNvZV9jdGxyX3ZuX2NsYWltX3Jlc3AoZmlwLCAmYnVmLnJkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU0NfVk5fQkVBQ09OOgorCQlmY29lX2N0bHJfdm5fYmVhY29uKGZpcCwgJmJ1Zi5yZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxJQkZDT0VfRklQX0RCRyhmaXAsICJ2bl9yZWN2IHVua25vd24gc3ViY29kZSAlZFxuIiwgc3ViKTsKKwkJcmMgPSAtMTsKKwkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGZjb2VfY3Rscl9kaXNjX3JlY3YgLSBkaXNjb3ZlcnkgcmVjZWl2ZSBoYW5kbGVyIGZvciBWTjJWTiBtb2RlLgorICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydAorICogQGZwOiBUaGUgcmVjZWl2ZWQgZnJhbWUKKyAqCisgKiBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgc2luY2Ugd2UgZG9uJ3Qgc2VlIFJTQ05zIG9yIG90aGVyCisgKiBmYWJyaWMtZ2VuZXJhdGVkIEVMU2VzLgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfZGlzY19yZWN2KHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX3NlcV9lbHNfZGF0YSByanRfZGF0YTsKKworCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5TVVA7CisJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfTk9ORTsKKwlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChmcCwgRUxTX0xTX1JKVCwgJnJqdF9kYXRhKTsKKwlmY19mcmFtZV9mcmVlKGZwKTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfZGlzY19yZWN2IC0gc3RhcnQgZGlzY292ZXJ5IGZvciBWTjJWTiBtb2RlLgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlcgorICoKKyAqIFRoaXMgc2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHJlbW90ZSBwb3J0cyBzaG91bGQgYmUgY3JlYXRlZAorICogYW5kIHN0YXJ0ZWQgZm9yIHRoZSBwZWVycyB3ZSBkaXNjb3Zlci4gIFdlIHVzZSB0aGUgZGlzY19jYWxsYmFjaworICogcG9pbnRlciBhcyB0aGF0IGZsYWcuICBQZWVycyBhbHJlYWR5IGRpc2NvdmVyZWQgYXJlIGNyZWF0ZWQgaGVyZS4KKyAqCisgKiBUaGUgbHBvcnQgbG9jayBpcyBoZWxkIGR1cmluZyB0aGlzIGNhbGwuIFRoZSBjYWxsYmFjayBtdXN0IGJlIGRvbmUKKyAqIGxhdGVyLCB3aXRob3V0IGhvbGRpbmcgZWl0aGVyIHRoZSBscG9ydCBvciBkaXNjb3ZlcnkgbG9ja3MuCisgKiBUaGUgZmNvZV9jdGxyIGxvY2sgbWF5IGFsc28gYmUgaGVsZCBkdXJpbmcgdGhpcyBjYWxsLgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfZGlzY19zdGFydCh2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBmY19scG9ydCAqLAorCQkJCQkJICBlbnVtIGZjX2Rpc2NfZXZlbnQpLAorCQkJCSBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBmY19kaXNjICpkaXNjID0gJmxwb3J0LT5kaXNjOworCXN0cnVjdCBmY29lX2N0bHIgKmZpcCA9IGRpc2MtPnByaXY7CisKKwltdXRleF9sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKKwlkaXNjLT5kaXNjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJZGlzYy0+ZGlzY19pZCA9IChkaXNjLT5kaXNjX2lkICsgMikgfCAxOworCWRpc2MtPnBlbmRpbmcgPSAxOworCXNjaGVkdWxlX3dvcmsoJmZpcC0+dGltZXJfd29yayk7CisJbXV0ZXhfdW5sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKK30KKworLyoqCisgKiBmY29lX2N0bHJfdm5fZGlzYygpIC0gcmVwb3J0IEZJUCBWTl9wb3J0IGRpc2NvdmVyeSByZXN1bHRzIGFmdGVyIGNsYWltIHN0YXRlLgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlcgorICoKKyAqIFN0YXJ0cyB0aGUgRkxPR0kgYW5kIFBMT0dJIGxvZ2luIHByb2Nlc3MgdG8gZWFjaCBkaXNjb3ZlcmVkIHJwb3J0IGZvciB3aGljaAorICogd2UndmUgcmVjZWl2ZWQgYXQgbGVhc3Qgb25lIGJlYWNvbi4KKyAqIFBlcmZvcm1zIHRoZSBkaXNjb3ZlcnkgY29tcGxldGUgY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3Rscl92bl9kaXNjKHN0cnVjdCBmY29lX2N0bHIgKmZpcCkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZmlwLT5scDsKKwlzdHJ1Y3QgZmNfZGlzYyAqZGlzYyA9ICZscG9ydC0+ZGlzYzsKKwlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CisJc3RydWN0IGZjb2VfcnBvcnQgKmZycG9ydDsKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBmY19scG9ydCAqLCBlbnVtIGZjX2Rpc2NfZXZlbnQpOworCisJbXV0ZXhfbG9jaygmZGlzYy0+ZGlzY19tdXRleCk7CisJY2FsbGJhY2sgPSBkaXNjLT5wZW5kaW5nID8gZGlzYy0+ZGlzY19jYWxsYmFjayA6IE5VTEw7CisJZGlzYy0+cGVuZGluZyA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmRhdGEsICZkaXNjLT5ycG9ydHMsIHBlZXJzKSB7CisJCWZycG9ydCA9IGZjb2VfY3Rscl9ycG9ydChyZGF0YSk7CisJCWlmIChmcnBvcnQtPnRpbWUpCisJCQlscG9ydC0+dHQucnBvcnRfbG9naW4ocmRhdGEpOworCX0KKwltdXRleF91bmxvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworCWlmIChjYWxsYmFjaykKKwkJY2FsbGJhY2sobHBvcnQsIERJU0NfRVZfU1VDQ0VTUyk7Cit9CisKKy8qKgorICogZmNvZV9jdGxyX3ZuX3RpbWVvdXQgLSB0aW1lciB3b3JrIGZ1bmN0aW9uIGZvciBWTjJWTiBtb2RlLgorICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlcgorICovCitzdGF0aWMgdm9pZCBmY29lX2N0bHJfdm5fdGltZW91dChzdHJ1Y3QgZmNvZV9jdGxyICpmaXApCit7CisJdW5zaWduZWQgbG9uZyBuZXh0X3RpbWU7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MzIgbmV3X3BvcnRfaWQgPSAwOworCisJbXV0ZXhfbG9jaygmZmlwLT5jdGxyX211dGV4KTsKKwlzd2l0Y2ggKGZpcC0+c3RhdGUpIHsKKwljYXNlIEZJUF9TVF9WTk1QX1NUQVJUOgorCQlmY29lX2N0bHJfc2V0X3N0YXRlKGZpcCwgRklQX1NUX1ZOTVBfUFJPQkUxKTsKKwkJZmNvZV9jdGxyX3ZuX3NlbmQoZmlwLCBGSVBfU0NfVk5fUFJPQkVfUkVRLCBmY29lX2FsbF92bjJ2biwgMCk7CisJCW5leHRfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEZJUF9WTl9QUk9CRV9XQUlUKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU1RfVk5NUF9QUk9CRTE6CisJCWZjb2VfY3Rscl9zZXRfc3RhdGUoZmlwLCBGSVBfU1RfVk5NUF9QUk9CRTIpOworCQlmY29lX2N0bHJfdm5fc2VuZChmaXAsIEZJUF9TQ19WTl9QUk9CRV9SRVEsIGZjb2VfYWxsX3ZuMnZuLCAwKTsKKwkJbmV4dF90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0FOTl9XQUlUKTsKKwkJYnJlYWs7CisJY2FzZSBGSVBfU1RfVk5NUF9QUk9CRTI6CisJCWZjb2VfY3Rscl9zZXRfc3RhdGUoZmlwLCBGSVBfU1RfVk5NUF9DTEFJTSk7CisJCW5ld19wb3J0X2lkID0gZmlwLT5wb3J0X2lkOworCQlodG9uMjQobWFjLCBGSVBfVk5fRkNfTUFQKTsKKwkJaHRvbjI0KG1hYyArIDMsIG5ld19wb3J0X2lkKTsKKwkJZmNvZV9jdGxyX21hcF9kZXN0KGZpcCk7CisJCWZpcC0+dXBkYXRlX21hYyhmaXAtPmxwLCBtYWMpOworCQlmY29lX2N0bHJfdm5fc2VuZF9jbGFpbShmaXApOworCQluZXh0X3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhGSVBfVk5fQU5OX1dBSVQpOworCQlicmVhazsKKwljYXNlIEZJUF9TVF9WTk1QX0NMQUlNOgorCQkvKgorCQkgKiBUaGlzIG1heSBiZSBpbnZva2VkIGVpdGhlciBieSBzdGFydGluZyBkaXNjb3Zlcnkgc28gZG9uJ3QKKwkJICogZ28gdG8gdGhlIG5leHQgc3RhdGUgdW5sZXNzIGl0J3MgYmVlbiBsb25nIGVub3VnaC4KKwkJICovCisJCW5leHRfdGltZSA9IGZpcC0+c29sX3RpbWUgKyBtc2Vjc190b19qaWZmaWVzKEZJUF9WTl9BTk5fV0FJVCk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG5leHRfdGltZSkpIHsKKwkJCWZjb2VfY3Rscl9zZXRfc3RhdGUoZmlwLCBGSVBfU1RfVk5NUF9VUCk7CisJCQlmY29lX2N0bHJfdm5fc2VuZChmaXAsIEZJUF9TQ19WTl9CRUFDT04sCisJCQkJCSAgZmNvZV9hbGxfdm4ydm4sIDApOworCQkJbmV4dF90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRklQX1ZOX0FOTl9XQUlUKTsKKwkJCWZpcC0+cG9ydF9rYV90aW1lID0gbmV4dF90aW1lOworCQl9CisJCWZjb2VfY3Rscl92bl9kaXNjKGZpcCk7CisJCWJyZWFrOworCWNhc2UgRklQX1NUX1ZOTVBfVVA6CisJCW5leHRfdGltZSA9IGZjb2VfY3Rscl92bl9hZ2UoZmlwKTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZmlwLT5wb3J0X2thX3RpbWUpKSB7CisJCQlmY29lX2N0bHJfdm5fc2VuZChmaXAsIEZJUF9TQ19WTl9CRUFDT04sCisJCQkJCSAgZmNvZV9hbGxfdm4ydm4sIDApOworCQkJZmlwLT5wb3J0X2thX3RpbWUgPSBqaWZmaWVzICsKKwkJCQkgbXNlY3NfdG9famlmZmllcyhGSVBfVk5fQkVBQ09OX0lOVCArCisJCQkJCShyYW5kb20zMigpICUgRklQX1ZOX0JFQUNPTl9GVVpaKSk7CisJCX0KKwkJaWYgKHRpbWVfYmVmb3JlKGZpcC0+cG9ydF9rYV90aW1lLCBuZXh0X3RpbWUpKQorCQkJbmV4dF90aW1lID0gZmlwLT5wb3J0X2thX3RpbWU7CisJCWJyZWFrOworCWNhc2UgRklQX1NUX0xJTktfV0FJVDoKKwkJZ290byB1bmxvY2s7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAidW5leHBlY3RlZCBzdGF0ZSAlZCIsIGZpcC0+c3RhdGUpOworCQlnb3RvIHVubG9jazsKKwl9CisJbW9kX3RpbWVyKCZmaXAtPnRpbWVyLCBuZXh0X3RpbWUpOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmZmlwLT5jdGxyX211dGV4KTsKKworCS8qIElmIHBvcnQgSUQgaXMgbmV3LCBub3RpZnkgbG9jYWwgcG9ydCBhZnRlciBkcm9wcGluZyBjdGxyX211dGV4ICovCisJaWYgKG5ld19wb3J0X2lkKQorCQlmY19scG9ydF9zZXRfbG9jYWxfaWQoZmlwLT5scCwgbmV3X3BvcnRfaWQpOworfQorCisvKioKICAqIGZjb2VfbGliZmNfY29uZmlnKCkgLSBTZXRzIHVwIGxpYmZjIHJlbGF0ZWQgcHJvcGVydGllcyBmb3IgbG9jYWwgcG9ydAogICogQGxwOiBUaGUgbG9jYWwgcG9ydCB0byBjb25maWd1cmUgbGliZmMgZm9yCisgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyIGluIHVzZSBieSB0aGUgbG9jYWwgcG9ydAogICogQHR0OiBUaGUgbGliZmMgZnVuY3Rpb24gdGVtcGxhdGUKKyAqIEBpbml0X2ZjcDogSWYgbm9uLXplcm8sIHRoZSBGQ1AgcG9ydGlvbiBvZiBsaWJmYyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQKICAqCiAgKiBSZXR1cm5zIDogMCBmb3Igc3VjY2VzcwogICovCi1pbnQgZmNvZV9saWJmY19jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKLQkJICAgICAgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlICp0dCkKK2ludCBmY29lX2xpYmZjX2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSAqdHQsIGludCBpbml0X2ZjcCkKIHsKIAkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHNldCBieSB0aGUgTExERCAqLwogCW1lbWNweSgmbHBvcnQtPnR0LCB0dCwgc2l6ZW9mKCp0dCkpOwotCWlmIChmY19mY3BfaW5pdChscG9ydCkpCisJaWYgKGluaXRfZmNwICYmIGZjX2ZjcF9pbml0KGxwb3J0KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZmNfZXhjaF9pbml0KGxwb3J0KTsKIAlmY19lbHNjdF9pbml0KGxwb3J0KTsKIAlmY19scG9ydF9pbml0KGxwb3J0KTsKKwlpZiAoZmlwLT5tb2RlID09IEZJUF9NT0RFX1ZOMlZOKQorCQlscG9ydC0+cnBvcnRfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBmY29lX3Jwb3J0KTsKIAlmY19ycG9ydF9pbml0KGxwb3J0KTsKLQlmY19kaXNjX2luaXQobHBvcnQpOwotCisJaWYgKGZpcC0+bW9kZSA9PSBGSVBfTU9ERV9WTjJWTikgeworCQlscG9ydC0+cG9pbnRfdG9fbXVsdGlwb2ludCA9IDE7CisJCWxwb3J0LT50dC5kaXNjX3JlY3ZfcmVxID0gZmNvZV9jdGxyX2Rpc2NfcmVjdjsKKwkJbHBvcnQtPnR0LmRpc2Nfc3RhcnQgPSBmY29lX2N0bHJfZGlzY19zdGFydDsKKwkJbHBvcnQtPnR0LmRpc2Nfc3RvcCA9IGZjb2VfY3Rscl9kaXNjX3N0b3A7CisJCWxwb3J0LT50dC5kaXNjX3N0b3BfZmluYWwgPSBmY29lX2N0bHJfZGlzY19zdG9wX2ZpbmFsOworCQltdXRleF9pbml0KCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmxwb3J0LT5kaXNjLnJwb3J0cyk7CisJCWxwb3J0LT5kaXNjLnByaXYgPSBmaXA7CisJfSBlbHNlIHsKKwkJZmNfZGlzY19pbml0KGxwb3J0KTsKKwl9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmY29lX2xpYmZjX2NvbmZpZyk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfbWFpbi5jIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19tYWluLmMKaW5kZXggMjY1ZTczZC4uOWViN2E5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19tYWluLmMKQEAgLTYxNyw3ICs2MTcsNiBAQAogCWZuaWMtPmN0bHIuc2VuZCA9IGZuaWNfZXRoX3NlbmQ7CiAJZm5pYy0+Y3Rsci51cGRhdGVfbWFjID0gZm5pY191cGRhdGVfbWFjOwogCWZuaWMtPmN0bHIuZ2V0X3NyY19hZGRyID0gZm5pY19nZXRfbWFjOwotCWZjb2VfY3Rscl9pbml0KCZmbmljLT5jdGxyKTsKIAlpZiAoZm5pYy0+Y29uZmlnLmZsYWdzICYgVkZDRl9GSVBfQ0FQQUJMRSkgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBmbmljLT5scG9ydC0+aG9zdCwKIAkJCSAgICAgImZpcm13YXJlIHN1cHBvcnRzIEZJUFxuIik7CkBAIC02MjUsMTAgKzYyNCwxMSBAQAogCQl2bmljX2Rldl9wYWNrZXRfZmlsdGVyKGZuaWMtPnZkZXYsIDEsIDEsIDAsIDAsIDApOwogCQl2bmljX2Rldl9hZGRfYWRkcihmbmljLT52ZGV2LCBGSVBfQUxMX0VOT0RFX01BQ1MpOwogCQl2bmljX2Rldl9hZGRfYWRkcihmbmljLT52ZGV2LCBmbmljLT5jdGxyLmN0bF9zcmNfYWRkcik7CisJCWZjb2VfY3Rscl9pbml0KCZmbmljLT5jdGxyLCBGSVBfTU9ERV9BVVRPKTsKIAl9IGVsc2UgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBmbmljLT5scG9ydC0+aG9zdCwKIAkJCSAgICAgImZpcm13YXJlIHVzZXMgbm9uLUZJUCBtb2RlXG4iKTsKLQkJZm5pYy0+Y3Rsci5tb2RlID0gRklQX1NUX05PTl9GSVA7CisJCWZjb2VfY3Rscl9pbml0KCZmbmljLT5jdGxyLCBGSVBfTU9ERV9OT05fRklQKTsKIAl9CiAJZm5pYy0+c3RhdGUgPSBGTklDX0lOX0ZDX01PREU7CiAKQEAgLTY3Myw3ICs2NzMsNiBAQAogCS8qIFN0YXJ0IGxvY2FsIHBvcnQgaW5pdGlhdGlhbGl6YXRpb24gKi8KIAogCWxwLT5saW5rX3VwID0gMDsKLQlscC0+dHQgPSBmbmljX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIAogCWxwLT5tYXhfcmV0cnlfY291bnQgPSBmbmljLT5jb25maWcuZmxvZ2lfcmV0cmllczsKIAlscC0+bWF4X3Jwb3J0X3JldHJ5X2NvdW50ID0gZm5pYy0+Y29uZmlnLnBsb2dpX3JldHJpZXM7CkBAIC02ODksMTEgKzY4OCw3IEBACiAJZmNfc2V0X3d3bm4obHAsIGZuaWMtPmNvbmZpZy5ub2RlX3d3bik7CiAJZmNfc2V0X3d3cG4obHAsIGZuaWMtPmNvbmZpZy5wb3J0X3d3bik7CiAKLQlmY19scG9ydF9pbml0KGxwKTsKLQlmY19leGNoX2luaXQobHApOwotCWZjX2Vsc2N0X2luaXQobHApOwotCWZjX3Jwb3J0X2luaXQobHApOwotCWZjX2Rpc2NfaW5pdChscCk7CisJZmNvZV9saWJmY19jb25maWcobHAsICZmbmljLT5jdGxyLCAmZm5pY190cmFuc3BvcnRfdGVtcGxhdGUsIDApOwogCiAJaWYgKCFmY19leGNoX21ncl9hbGxvYyhscCwgRkNfQ0xBU1NfMywgRkNQSU9fSE9TVF9FWENIX1JBTkdFX1NUQVJULAogCQkJICAgICAgIEZDUElPX0hPU1RfRVhDSF9SQU5HRV9FTkQsIE5VTEwpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCmluZGV4IDNjYzQ3YzYuLjE5OGNiYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCkBAIC0xMjQ2LDExICsxMjQ2LDEwIEBACiAJbHAgPSBzaG9zdF9wcml2KHNjLT5kZXZpY2UtPmhvc3QpOwogCiAJZm5pYyA9IGxwb3J0X3ByaXYobHApOwotCUZOSUNfU0NTSV9EQkcoS0VSTl9ERUJVRywKLQkJICAgICAgZm5pYy0+bHBvcnQtPmhvc3QsCi0JCSAgICAgICJBYm9ydCBDbWQgY2FsbGVkIEZDSUQgMHgleCwgTFVOIDB4JXggVEFHICVkXG4iLAotCQkgICAgICAoc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSkpLT5wb3J0X2lkLAotCQkgICAgICBzYy0+ZGV2aWNlLT5sdW4sIHNjLT5yZXF1ZXN0LT50YWcpOworCXJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CisJRk5JQ19TQ1NJX0RCRyhLRVJOX0RFQlVHLCBmbmljLT5scG9ydC0+aG9zdCwKKwkJCSJBYm9ydCBDbWQgY2FsbGVkIEZDSUQgMHgleCwgTFVOIDB4JXggVEFHICVkXG4iLAorCQkJcnBvcnQtPnBvcnRfaWQsIHNjLT5kZXZpY2UtPmx1biwgc2MtPnJlcXVlc3QtPnRhZyk7CiAKIAlpZiAobHAtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZIHx8ICEobHAtPmxpbmtfdXApKSB7CiAJCXJldCA9IEZBSUxFRDsKQEAgLTEyOTksNyArMTI5OCw2IEBACiAJICogcG9ydCBpcyB1cCwgdGhlbiBzZW5kIGFidHMgdG8gdGhlIHJlbW90ZSBwb3J0IHRvIHRlcm1pbmF0ZQogCSAqIHRoZSBJTy4gRWxzZSwganVzdCBsb2NhbGx5IHRlcm1pbmF0ZSB0aGUgSU8gaW4gdGhlIGZpcm13YXJlCiAJICovCi0JcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKIAlpZiAoZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpID09IDApCiAJCXRhc2tfcmVxID0gRkNQSU9fSVRNRl9BQlRfVEFTSzsKIAllbHNlCkBAIC0xNDE4LDcgKzE0MTYsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHNjc2lfY21uZCAqc2M7Ci0Jc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKIAlzdHJ1Y3Qgc2NzaV9sdW4gZmNfbHVuOwogCXN0cnVjdCBzY3NpX2RldmljZSAqbHVuX2RldiA9IGxyX3NjLT5kZXZpY2U7CiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sodG1fZG9uZSk7CkBAIC0xNDU4LDcgKzE0NTUsNiBAQAogCiAJCS8qIE5vdyBxdWV1ZSB0aGUgYWJvcnQgY29tbWFuZCB0byBmaXJtd2FyZSAqLwogCQlpbnRfdG9fc2NzaWx1bihzYy0+ZGV2aWNlLT5sdW4sICZmY19sdW4pOwotCQlycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2MtPmRldmljZSkpOwogCiAJCWlmIChmbmljX3F1ZXVlX2Fib3J0X2lvX3JlcShmbmljLCB0YWcsCiAJCQkJCSAgICBGQ1BJT19JVE1GX0FCVF9UQVNLX1RFUk0sCkBAIC0xNTI4LDE4ICsxNTI0LDE2IEBACiAJbHAgPSBzaG9zdF9wcml2KHNjLT5kZXZpY2UtPmhvc3QpOwogCiAJZm5pYyA9IGxwb3J0X3ByaXYobHApOwotCUZOSUNfU0NTSV9EQkcoS0VSTl9ERUJVRywKLQkJICAgICAgZm5pYy0+bHBvcnQtPmhvc3QsCi0JCSAgICAgICJEZXZpY2UgcmVzZXQgY2FsbGVkIEZDSUQgMHgleCwgTFVOIDB4JXhcbiIsCi0JCSAgICAgIChzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKSktPnBvcnRfaWQsCi0JCSAgICAgIHNjLT5kZXZpY2UtPmx1bik7CiAKKwlycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2MtPmRldmljZSkpOworCUZOSUNfU0NTSV9EQkcoS0VSTl9ERUJVRywgZm5pYy0+bHBvcnQtPmhvc3QsCisJCQkiRGV2aWNlIHJlc2V0IGNhbGxlZCBGQ0lEIDB4JXgsIExVTiAweCV4XG4iLAorCQkJcnBvcnQtPnBvcnRfaWQsIHNjLT5kZXZpY2UtPmx1bik7CiAKIAlpZiAobHAtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZIHx8ICEobHAtPmxpbmtfdXApKQogCQlnb3RvIGZuaWNfZGV2aWNlX3Jlc2V0X2VuZDsKIAogCS8qIENoZWNrIGlmIHJlbW90ZSBwb3J0IHVwICovCi0JcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKIAlpZiAoZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpKQogCQlnb3RvIGZuaWNfZGV2aWNlX3Jlc2V0X2VuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCA2NjYwZmE5Li44YThmODAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC90cmFuc3BvcnRfY2xhc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KQEAgLTE1Niw2ICsxNTcsNyBAQAogdm9pZCBzY3NpX3JlbW92ZV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWlmIChzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9DQU5DRUwpKQpAQCAtMTY1LDYgKzE2Nyw4IEBACiAJCQlyZXR1cm47CiAJCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXNjc2lfYXV0b3BtX2dldF9ob3N0KHNob3N0KTsKIAlzY3NpX2ZvcmdldF9ob3N0KHNob3N0KTsKIAltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAlzY3NpX3Byb2NfaG9zdF9ybShzaG9zdCk7CkBAIC0yMTYsMTIgKzIyMCwxNCBAQAogCQlzaG9zdC0+c2hvc3RfZ2VuZGV2LnBhcmVudCA9IGRldiA/IGRldiA6ICZwbGF0Zm9ybV9idXM7CiAJc2hvc3QtPmRtYV9kZXYgPSBkbWFfZGV2OwogCi0JZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKLQogCWVycm9yID0gZGV2aWNlX2FkZCgmc2hvc3QtPnNob3N0X2dlbmRldik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAorCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCWRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZCgmc2hvc3QtPnNob3N0X2dlbmRldik7CisKIAlzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9SVU5OSU5HKTsKIAlnZXRfZGV2aWNlKHNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50KTsKIApAQCAtMzI1LDcgKzMzMSw2IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJZ2ZwX3QgZ2ZwX21hc2sgPSBHRlBfS0VSTkVMOwotCWludCBydmFsOwogCiAJaWYgKHNodC0+dW5jaGVja2VkX2lzYV9kbWEgJiYgcHJpdnNpemUpCiAJCWdmcF9tYXNrIHw9IF9fR0ZQX0RNQTsKQEAgLTQyMCw3ICs0MjUsOCBAQAogCXNob3N0LT5laGFuZGxlciA9IGt0aHJlYWRfcnVuKHNjc2lfZXJyb3JfaGFuZGxlciwgc2hvc3QsCiAJCQkic2NzaV9laF8lZCIsIHNob3N0LT5ob3N0X25vKTsKIAlpZiAoSVNfRVJSKHNob3N0LT5laGFuZGxlcikpIHsKLQkJcnZhbCA9IFBUUl9FUlIoc2hvc3QtPmVoYW5kbGVyKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBlcnJvciBoYW5kbGVyIHRocmVhZCBmYWlsZWQgdG8gc3Bhd24sIGVycm9yID0gJWxkXG4iLAorCQkJc2hvc3QtPmhvc3Rfbm8sIFBUUl9FUlIoc2hvc3QtPmVoYW5kbGVyKSk7CiAJCWdvdG8gZmFpbF9rZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmMgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCmluZGV4IGMwMTY0MjZiLi40ZjU1NTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHBzYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKQEAgLTg2LDEwICs4NiwxNyBAQAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRSwgICAgIDB4MTAzQywgMHgzMjRhfSwKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0UsICAgICAweDEwM0MsIDB4MzI0Yn0sCiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NFLCAgICAgMHgxMDNDLCAweDMyMzN9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRSwgICAgIDB4MTAzQywgMHgzMjUwfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0UsICAgICAweDEwM0MsIDB4MzI1MX0sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NFLCAgICAgMHgxMDNDLCAweDMyNTJ9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRSwgICAgIDB4MTAzQywgMHgzMjUzfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0UsICAgICAweDEwM0MsIDB4MzI1NH0sCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0YgMHgzMzNmCiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NGLCAgICAgMHgxMDNDLCAweDMzM0Z9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0FOWV9JRCwgICAgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkJUENJX0NMQVNTX1NUT1JBR0VfUkFJRCA8PCA4LCAweGZmZmYgPDwgOCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCAgICAgUENJX0FOWV9JRCwgICAgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkJUENJX0NMQVNTX1NUT1JBR0VfUkFJRCA8PCA4LCAweGZmZmYgPDwgOCwgMH0sCiAJezAsfQogfTsKIApAQCAtMTA5LDEyICsxMTYsMTggQEAKIAl7MHgzMjRiMTAzQywgIlNtYXJ0IEFycmF5IFA3MTFtIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyMzMxMDNDLCAiU3RvcmFnZVdvcmtzIFAxMjEwbSIsICZTQTVfYWNjZXNzfSwKIAl7MHgzMzNGMTAzQywgIlN0b3JhZ2VXb3JrcyBQMTIxMG0iLCAmU0E1X2FjY2Vzc30sCisJezB4MzI1MDEwM0MsICJTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjUwMTEzQywgIlNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyNTAxMjNDLCAiU21hcnQgQXJyYXkiLCAmU0E1X2FjY2Vzc30sCisJezB4MzI1MDEzM0MsICJTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjUwMTQzQywgIlNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAogCXsweEZGRkYxMDNDLCAiVW5rbm93biBTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzfSwKIH07CiAKIHN0YXRpYyBpbnQgbnVtYmVyX29mX2NvbnRyb2xsZXJzOwogCi1zdGF0aWMgaXJxcmV0dXJuX3QgZG9faHBzYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgZG9faHBzYV9pbnRyX2ludHgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19ocHNhX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaW50IGhwc2FfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgKmFyZyk7CiBzdGF0aWMgdm9pZCBzdGFydF9pbyhzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIApAQCAtMTQ4LDYgKzE2MSw4IEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCB1bmlxdWVfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBob3N0X3Nob3dfZmlybXdhcmVfcmV2aXNpb24oc3RydWN0IGRldmljZSAqZGV2LAorCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgdm9pZCBocHNhX3VwZGF0ZV9zY3NpX2RldmljZXMoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IGhvc3Rubyk7CiBzdGF0aWMgc3NpemVfdCBob3N0X3N0b3JlX3Jlc2NhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CkBAIC0xNTgsMTMgKzE3MywyMSBAQAogLyogcGVyZm9ybWFudCBtb2RlIGhlbHBlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIGNhbGNfYnVja2V0X21hcChpbnQgKmJ1Y2tldCwgaW50IG51bV9idWNrZXRzLAogCWludCBuc2dzLCBpbnQgKmJ1Y2tldF9tYXApOwotc3RhdGljIHZvaWQgaHBzYV9wdXRfY3Rscl9pbnRvX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKK3N0YXRpYyBfX2RldmluaXQgdm9pZCBocHNhX3B1dF9jdGxyX2ludG9fcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgpOwogc3RhdGljIGlubGluZSB1MzIgbmV4dF9jb21tYW5kKHN0cnVjdCBjdGxyX2luZm8gKmgpOworc3RhdGljIGludCBfX2RldmluaXQgaHBzYV9maW5kX2NmZ19hZGRycyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwl2b2lkIF9faW9tZW0gKnZhZGRyLCB1MzIgKmNmZ19iYXNlX2FkZHIsIHU2NCAqY2ZnX2Jhc2VfYWRkcl9pbmRleCwKKwl1NjQgKmNmZ19vZmZzZXQpOworc3RhdGljIGludCBfX2RldmluaXQgaHBzYV9wY2lfZmluZF9tZW1vcnlfQkFSKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCXVuc2lnbmVkIGxvbmcgKm1lbW9yeV9iYXIpOworc3RhdGljIGludCBfX2RldmluaXQgaHBzYV9sb29rdXBfYm9hcmRfaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiAqYm9hcmRfaWQpOwogCiBzdGF0aWMgREVWSUNFX0FUVFIocmFpZF9sZXZlbCwgU19JUlVHTywgcmFpZF9sZXZlbF9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihsdW5pZCwgU19JUlVHTywgbHVuaWRfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIodW5pcXVlX2lkLCBTX0lSVUdPLCB1bmlxdWVfaWRfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIocmVzY2FuLCBTX0lXVVNSLCBOVUxMLCBob3N0X3N0b3JlX3Jlc2Nhbik7CitzdGF0aWMgREVWSUNFX0FUVFIoZmlybXdhcmVfcmV2aXNpb24sIFNfSVJVR08sCisJaG9zdF9zaG93X2Zpcm13YXJlX3JldmlzaW9uLCBOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpocHNhX3NkZXZfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmFpZF9sZXZlbCwKQEAgLTE3NSw2ICsxOTgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmhwc2Ffc2hvc3RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmVzY2FuLAorCSZkZXZfYXR0cl9maXJtd2FyZV9yZXZpc2lvbiwKIAlOVUxMLAogfTsKIApAQCAtMjYwLDYgKzI4NCwyMSBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgaG9zdF9zaG93X2Zpcm13YXJlX3JldmlzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJdW5zaWduZWQgY2hhciAqZndyZXY7CisKKwloID0gc2hvc3RfdG9faGJhKHNob3N0KTsKKwlpZiAoIWgtPmhiYV9pbnF1aXJ5X2RhdGEpCisJCXJldHVybiAwOworCWZ3cmV2ID0gJmgtPmhiYV9pbnF1aXJ5X2RhdGFbMzJdOworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJWMlYyVjJWNcbiIsCisJCWZ3cmV2WzBdLCBmd3JldlsxXSwgZndyZXZbMl0sIGZ3cmV2WzNdKTsKK30KKwogLyogRW5xdWV1aW5nIGFuZCBkZXF1ZXVpbmcgZnVuY3Rpb25zIGZvciBjbWRsaXN0cy4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRRKHN0cnVjdCBobGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCiB7CkBAIC0xNDQwLDEyICsxNDc5LDYgQEAKIAkJZ290byBiYWlsX291dDsKIAl9CiAKLQkvKiBBcyBhIHNpZGUgZWZmZWN0LCByZWNvcmQgdGhlIGZpcm13YXJlIHZlcnNpb24gbnVtYmVyCi0JICogaWYgd2UgaGFwcGVuIHRvIGJlIHRhbGtpbmcgdG8gdGhlIFJBSUQgY29udHJvbGxlci4KLQkgKi8KLQlpZiAoaXNfaGJhX2x1bmlkKHNjc2kzYWRkcikpCi0JCW1lbWNweShoLT5maXJtX3ZlciwgJmlucV9idWZmWzMyXSwgNCk7Ci0KIAl0aGlzX2RldmljZS0+ZGV2dHlwZSA9IChpbnFfYnVmZlswXSAmIDB4MWYpOwogCW1lbWNweSh0aGlzX2RldmljZS0+c2NzaTNhZGRyLCBzY3NpM2FkZHIsIDgpOwogCW1lbWNweSh0aGlzX2RldmljZS0+dmVuZG9yLCAmaW5xX2J1ZmZbOF0sCkBAIC0yODI2LDkgKzI4NTksOCBAQAogCiBzdGF0aWMgaW5saW5lIGxvbmcgaW50ZXJydXB0X25vdF9mb3JfdXMoc3RydWN0IGN0bHJfaW5mbyAqaCkKIHsKLQlyZXR1cm4gIShoLT5tc2lfdmVjdG9yIHx8IGgtPm1zaXhfdmVjdG9yKSAmJgotCQkoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwKLQkJKGgtPmludGVycnVwdHNfZW5hYmxlZCA9PSAwKSk7CisJcmV0dXJuIChoLT5hY2Nlc3MuaW50cl9wZW5kaW5nKGgpID09IDApIHx8CisJCShoLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPT0gMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJhZF90YWcoc3RydWN0IGN0bHJfaW5mbyAqaCwgdTMyIHRhZ19pbmRleCwKQEAgLTI5MDIsNyArMjkzNCw3IEBACiAJcmV0dXJuIG5leHRfY29tbWFuZChoKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGRvX2hwc2FfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9faHBzYV9pbnRyX2ludHgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBjdGxyX2luZm8gKmggPSBkZXZfaWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI5MTEsNiArMjk0MywyNiBAQAogCWlmIChpbnRlcnJ1cHRfbm90X2Zvcl91cyhoKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKGludGVycnVwdF9wZW5kaW5nKGgpKSB7CisJCXJhd190YWcgPSBnZXRfbmV4dF9jb21wbGV0aW9uKGgpOworCQl3aGlsZSAocmF3X3RhZyAhPSBGSUZPX0VNUFRZKSB7CisJCQlpZiAoaHBzYV90YWdfY29udGFpbnNfaW5kZXgocmF3X3RhZykpCisJCQkJcmF3X3RhZyA9IHByb2Nlc3NfaW5kZXhlZF9jbWQoaCwgcmF3X3RhZyk7CisJCQllbHNlCisJCQkJcmF3X3RhZyA9IHByb2Nlc3Nfbm9uaW5kZXhlZF9jbWQoaCwgcmF3X3RhZyk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX2hwc2FfaW50cl9tc2koaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBjdGxyX2luZm8gKmggPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcmF3X3RhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CiAJcmF3X3RhZyA9IGdldF9uZXh0X2NvbXBsZXRpb24oaCk7CiAJd2hpbGUgKHJhd190YWcgIT0gRklGT19FTVBUWSkgewogCQlpZiAoaHBzYV90YWdfY29udGFpbnNfaW5kZXgocmF3X3RhZykpCkBAIC0zMDUyLDE3ICszMTA0LDc1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgZG9lcyBhIGhhcmQgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgdXNpbmcgUENJIHBvd2VyIG1hbmFnZW1lbnQKLSAqIHN0YXRlcy4KLSAqLwotc3RhdGljIF9fZGV2aW5pdCBpbnQgaHBzYV9oYXJkX3Jlc2V0X2NvbnRyb2xsZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IGhwc2FfY29udHJvbGxlcl9oYXJkX3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCXZvaWQgKiBfX2lvbWVtIHZhZGRyLCBib29sIHVzZV9kb29yYmVsbCkKIHsKLQl1MTYgcG1jc3IsIHNhdmVkX2NvbmZpZ19zcGFjZVszMl07Ci0JaW50IGksIHBvczsKKwl1MTYgcG1jc3I7CisJaW50IHBvczsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ1c2luZyBQQ0kgUE0gdG8gcmVzZXQgY29udHJvbGxlclxuIik7CisJaWYgKHVzZV9kb29yYmVsbCkgeworCQkvKiBGb3IgZXZlcnl0aGluZyBhZnRlciB0aGUgUDYwMCwgdGhlIFBDSSBwb3dlciBzdGF0ZSBtZXRob2QKKwkJICogb2YgcmVzZXR0aW5nIHRoZSBjb250cm9sbGVyIGRvZXNuJ3Qgd29yaywgc28gd2UgaGF2ZSB0aGlzCisJCSAqIG90aGVyIHdheSB1c2luZyB0aGUgZG9vcmJlbGwgcmVnaXN0ZXIuCisJCSAqLworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAidXNpbmcgZG9vcmJlbGwgdG8gcmVzZXQgY29udHJvbGxlclxuIik7CisJCXdyaXRlbChET09SQkVMTF9DVExSX1JFU0VULCB2YWRkciArIFNBNV9ET09SQkVMTCk7CisJCW1zbGVlcCgxMDAwKTsKKwl9IGVsc2UgeyAvKiBUcnkgdG8gZG8gaXQgdGhlIFBDSSBwb3dlciBzdGF0ZSB3YXkgKi8KIAotCS8qIFRoaXMgaXMgdmVyeSBuZWFybHkgdGhlIHNhbWUgdGhpbmcgYXMKKwkJLyogUXVvdGluZyBmcm9tIHRoZSBPcGVuIENJU1MgU3BlY2lmaWNhdGlvbjogIlRoZSBQb3dlcgorCQkgKiBNYW5hZ2VtZW50IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyIChDU1IpIGNvbnRyb2xzIHRoZSBwb3dlcgorCQkgKiBzdGF0ZSBvZiB0aGUgZGV2aWNlLiAgVGhlIG5vcm1hbCBvcGVyYXRpbmcgc3RhdGUgaXMgRDAsCisJCSAqIENTUj0wMGguICBUaGUgc29mdHdhcmUgb2ZmIHN0YXRlIGlzIEQzLCBDU1I9MDNoLiAgVG8gcmVzZXQKKwkJICogdGhlIGNvbnRyb2xsZXIsIHBsYWNlIHRoZSBpbnRlcmZhY2UgZGV2aWNlIGluIEQzIHRoZW4gdG8gRDAsCisJCSAqIHRoaXMgY2F1c2VzIGEgc2Vjb25kYXJ5IFBDSSByZXNldCB3aGljaCB3aWxsIHJlc2V0IHRoZQorCQkgKiBjb250cm9sbGVyLiIgKi8KKworCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCQlpZiAocG9zID09IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiaHBzYV9yZXNldF9jb250cm9sbGVyOiAiCisJCQkJIlBDSSBQTSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ1c2luZyBQQ0kgUE0gdG8gcmVzZXQgY29udHJvbGxlclxuIik7CisJCS8qIGVudGVyIHRoZSBEM2hvdCBwb3dlciBtYW5hZ2VtZW50IHN0YXRlICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOworCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwkJcG1jc3IgfD0gUENJX0QzaG90OworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKKworCQltc2xlZXAoNTAwKTsKKworCQkvKiBlbnRlciB0aGUgRDAgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSAqLworCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwkJcG1jc3IgfD0gUENJX0QwOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKKworCQltc2xlZXAoNTAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZG9lcyBhIGhhcmQgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgdXNpbmcgUENJIHBvd2VyIG1hbmFnZW1lbnQKKyAqIHN0YXRlcyBvciB0aGUgdXNpbmcgdGhlIGRvb3JiZWxsIHJlZ2lzdGVyLgorICovCitzdGF0aWMgX19kZXZpbml0IGludCBocHNhX2tkdW1wX2hhcmRfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgc2F2ZWRfY29uZmlnX3NwYWNlWzMyXTsKKwl1NjQgY2ZnX29mZnNldDsKKwl1MzIgY2ZnX2Jhc2VfYWRkcjsKKwl1NjQgY2ZnX2Jhc2VfYWRkcl9pbmRleDsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgcGFkZHI7CisJdTMyIG1pc2NfZndfc3VwcG9ydCwgYWN0aXZlX3RyYW5zcG9ydDsKKwlpbnQgcmMsIGk7CisJc3RydWN0IENmZ1RhYmxlIF9faW9tZW0gKmNmZ3RhYmxlOworCWJvb2wgdXNlX2Rvb3JiZWxsOworCXUzMiBib2FyZF9pZDsKKworCS8qIEZvciBjb250cm9sbGVycyBhcyBvbGQgYXMgdGhlIFA2MDAsIHRoaXMgaXMgdmVyeSBuZWFybHkKKwkgKiB0aGUgc2FtZSB0aGluZyBhcwogCSAqCiAJICogcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CiAJICogcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDNob3QpOwpAQCAtMzA3Niw0MSArMzE4Niw1NCBAQAogCSAqIHZpb2xhdGUgdGhlIG9yZGVyaW5nIHJlcXVpcmVtZW50cyBmb3IgcmVzdG9yaW5nIHRoZQogCSAqIGNvbmZpZ3VyYXRpb24gc3BhY2UgZnJvbSB0aGUgQ0NJU1MgZG9jdW1lbnQgKHNlZSB0aGUKIAkgKiBjb21tZW50IGJlbG93KS4gIFNvIHdlIHJvbGwgb3VyIG93biAuLi4uCisJICoKKwkgKiBGb3IgY29udHJvbGxlcnMgbmV3ZXIgdGhhbiB0aGUgUDYwMCwgdGhlIHBjaSBwb3dlciBzdGF0ZQorCSAqIG1ldGhvZCBvZiByZXNldHRpbmcgZG9lc24ndCB3b3JrIHNvIHdlIGhhdmUgYW5vdGhlciB3YXkKKwkgKiB1c2luZyB0aGUgZG9vcmJlbGwgcmVnaXN0ZXIuCiAJICovCiAKKwkvKiBFeGNsdWRlIDY0MHggYm9hcmRzLiAgVGhlc2UgYXJlIHR3byBwY2kgZGV2aWNlcyBpbiBvbmUgc2xvdAorCSAqIHdoaWNoIHNoYXJlIGEgYmF0dGVyeSBiYWNrZWQgY2FjaGUgbW9kdWxlLiAgT25lIGNvbnRyb2xzIHRoZQorCSAqIGNhY2hlLCB0aGUgb3RoZXIgYWNjZXNzZXMgdGhlIGNhY2hlIHRocm91Z2ggdGhlIG9uZSB0aGF0IGNvbnRyb2xzCisJICogaXQuICBJZiB3ZSByZXNldCB0aGUgb25lIGNvbnRyb2xsaW5nIHRoZSBjYWNoZSwgdGhlIG90aGVyIHdpbGwKKwkgKiBsaWtlbHkgbm90IGJlIGhhcHB5LiAgSnVzdCBmb3JiaWQgcmVzZXR0aW5nIHRoaXMgY29uam9pbmVkIG1lc3MuCisJICogVGhlIDY0MHggaXNuJ3QgcmVhbGx5IHN1cHBvcnRlZCBieSBocHNhIGFueXdheS4KKwkgKi8KKwlocHNhX2xvb2t1cF9ib2FyZF9pZChwZGV2LCAmYm9hcmRfaWQpOworCWlmIChib2FyZF9pZCA9PSAweDQwOUMwRTExIHx8IGJvYXJkX2lkID09IDB4NDA5RDBFMTEpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMippLCAmc2F2ZWRfY29uZmlnX3NwYWNlW2ldKTsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7Ci0JaWYgKHBvcyA9PSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJocHNhX3Jlc2V0X2NvbnRyb2xsZXI6IFBDSSBQTSBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBmaW5kIHRoZSBmaXJzdCBtZW1vcnkgQkFSLCBzbyB3ZSBjYW4gZmluZCB0aGUgY2ZnIHRhYmxlICovCisJcmMgPSBocHNhX3BjaV9maW5kX21lbW9yeV9CQVIocGRldiwgJnBhZGRyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwl2YWRkciA9IHJlbWFwX3BjaV9tZW0ocGFkZHIsIDB4MjUwKTsKKwlpZiAoIXZhZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGZpbmQgY2ZndGFibGUgaW4gb3JkZXIgdG8gY2hlY2sgaWYgcmVzZXQgdmlhIGRvb3JiZWxsIGlzIHN1cHBvcnRlZCAqLworCXJjID0gaHBzYV9maW5kX2NmZ19hZGRycyhwZGV2LCB2YWRkciwgJmNmZ19iYXNlX2FkZHIsCisJCQkJCSZjZmdfYmFzZV9hZGRyX2luZGV4LCAmY2ZnX29mZnNldCk7CisJaWYgKHJjKQorCQlnb3RvIHVubWFwX3ZhZGRyOworCWNmZ3RhYmxlID0gcmVtYXBfcGNpX21lbShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwKKwkJICAgICAgIGNmZ19iYXNlX2FkZHJfaW5kZXgpICsgY2ZnX29mZnNldCwgc2l6ZW9mKCpjZmd0YWJsZSkpOworCWlmICghY2ZndGFibGUpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIHVubWFwX3ZhZGRyOwogCX0KIAotCS8qIFF1b3RpbmcgZnJvbSB0aGUgT3BlbiBDSVNTIFNwZWNpZmljYXRpb246ICJUaGUgUG93ZXIKLQkgKiBNYW5hZ2VtZW50IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyIChDU1IpIGNvbnRyb2xzIHRoZSBwb3dlcgotCSAqIHN0YXRlIG9mIHRoZSBkZXZpY2UuICBUaGUgbm9ybWFsIG9wZXJhdGluZyBzdGF0ZSBpcyBEMCwKLQkgKiBDU1I9MDBoLiAgVGhlIHNvZnR3YXJlIG9mZiBzdGF0ZSBpcyBEMywgQ1NSPTAzaC4gIFRvIHJlc2V0Ci0JICogdGhlIGNvbnRyb2xsZXIsIHBsYWNlIHRoZSBpbnRlcmZhY2UgZGV2aWNlIGluIEQzIHRoZW4gdG8KLQkgKiBEMCwgdGhpcyBjYXVzZXMgYSBzZWNvbmRhcnkgUENJIHJlc2V0IHdoaWNoIHdpbGwgcmVzZXQgdGhlCi0JICogY29udHJvbGxlci4iCi0JICovCisJLyogSWYgcmVzZXQgdmlhIGRvb3JiZWxsIHJlZ2lzdGVyIGlzIHN1cHBvcnRlZCwgdXNlIHRoYXQuICovCisJbWlzY19md19zdXBwb3J0ID0gcmVhZGwoJmNmZ3RhYmxlLT5taXNjX2Z3X3N1cHBvcnQpOworCXVzZV9kb29yYmVsbCA9IG1pc2NfZndfc3VwcG9ydCAmIE1JU0NfRldfRE9PUkJFTExfUkVTRVQ7CiAKLQkvKiBlbnRlciB0aGUgRDNob3QgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOwotCXBtY3NyICY9IH5QQ0lfUE1fQ1RSTF9TVEFURV9NQVNLOwotCXBtY3NyIHw9IFBDSV9EM2hvdDsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKLQotCW1zbGVlcCg1MDApOwotCi0JLyogZW50ZXIgdGhlIEQwIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgKi8KLQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKLQlwbWNzciB8PSBQQ0lfRDA7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QTV9DVFJMLCBwbWNzcik7Ci0KLQltc2xlZXAoNTAwKTsKKwlyYyA9IGhwc2FfY29udHJvbGxlcl9oYXJkX3Jlc2V0KHBkZXYsIHZhZGRyLCB1c2VfZG9vcmJlbGwpOworCWlmIChyYykKKwkJZ290byB1bm1hcF9jZmd0YWJsZTsKIAogCS8qIFJlc3RvcmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLiAgVGhlIE9wZW4gQ0lTUwogCSAqIFNwZWNpZmljYXRpb24gc2F5cywgIlJlc3RvcmUgdGhlIFBDSSBDb25maWd1cmF0aW9uCkBAIC0zMTI3LDcgKzMyNTAsMjkgQEAKIAl3bWIoKTsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgNCwgc2F2ZWRfY29uZmlnX3NwYWNlWzJdKTsKIAotCXJldHVybiAwOworCS8qIFNvbWUgZGV2aWNlcyAobm90YWJseSB0aGUgSFAgU21hcnQgQXJyYXkgNWkgQ29udHJvbGxlcikKKwkgICBuZWVkIGEgbGl0dGxlIHBhdXNlIGhlcmUgKi8KKwltc2xlZXAoSFBTQV9QT1NUX1JFU0VUX1BBVVNFX01TRUNTKTsKKworCS8qIENvbnRyb2xsZXIgc2hvdWxkIGJlIGluIHNpbXBsZSBtb2RlIGF0IHRoaXMgcG9pbnQuICBJZiBpdCdzIG5vdCwKKwkgKiBJdCBtZWFucyB3ZSdyZSBvbiBvbmUgb2YgdGhvc2UgY29udHJvbGxlcnMgd2hpY2ggZG9lc24ndCBzdXBwb3J0CisJICogdGhlIGRvb3JiZWxsIHJlc2V0IG1ldGhvZCBhbmQgb24gd2hpY2ggdGhlIFBDSSBwb3dlciBtYW5hZ2VtZW50IHJlc2V0CisJICogbWV0aG9kIGRvZXNuJ3Qgd29yayAoUDgwMCwgZm9yIGV4YW1wbGUuKQorCSAqIEluIHRob3NlIGNhc2VzLCBwcmV0ZW5kIHRoZSByZXNldCB3b3JrZWQgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgorCSAqLworCWFjdGl2ZV90cmFuc3BvcnQgPSByZWFkbCgmY2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSk7CisJaWYgKGFjdGl2ZV90cmFuc3BvcnQgJiBQRVJGT1JNQU5UX01PREUpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlVuYWJsZSB0byBzdWNjZXNzZnVsbHkgcmVzZXQgY29udHJvbGxlciwiCisJCQkiIHByb2NlZWRpbmcgYW55d2F5LlxuIik7CisJCXJjID0gLUVOT1RTVVBQOworCX0KKwordW5tYXBfY2ZndGFibGU6CisJaW91bm1hcChjZmd0YWJsZSk7CisKK3VubWFwX3ZhZGRyOgorCWlvdW5tYXAodmFkZHIpOworCXJldHVybiByYzsKIH0KIAogLyoKQEAgLTMxMzUsOSArMzI4MCw5IEBACiAgKiAgIHRoZSBpbyBmdW5jdGlvbnMuCiAgKiAgIFRoaXMgaXMgZm9yIGRlYnVnIG9ubHkuCiAgKi8KLSNpZmRlZiBIUFNBX0RFQlVHCiBzdGF0aWMgdm9pZCBwcmludF9jZmdfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgQ2ZnVGFibGUgKnRiKQogeworI2lmZGVmIEhQU0FfREVCVUcKIAlpbnQgaTsKIAljaGFyIHRlbXBfbmFtZVsxN107CiAKQEAgLTMxNjcsOCArMzMxMiw4IEBACiAJZGV2X2luZm8oZGV2LCAiICAgU2VydmVyIE5hbWUgPSAlc1xuIiwgdGVtcF9uYW1lKTsKIAlkZXZfaW5mbyhkZXYsICIgICBIZWFydGJlYXQgQ291bnRlciA9IDB4JXhcblxuXG4iLAogCQlyZWFkbCgmKHRiLT5IZWFydEJlYXQpKSk7Ci19CiAjZW5kaWYJCQkJLyogSFBTQV9ERUJVRyAqLworfQogCiBzdGF0aWMgaW50IGZpbmRfUENJX0JBUl9pbmRleChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgbG9uZyBwY2lfYmFyX2FkZHIpCiB7CkBAIC0zMjA5LDggKzMzNTQsNyBAQAogICogY29udHJvbGxlcnMgdGhhdCBhcmUgY2FwYWJsZS4gSWYgbm90LCB3ZSB1c2UgSU8tQVBJQyBtb2RlLgogICovCiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBocHNhX2ludGVycnVwdF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgsCi0JCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgYm9hcmRfaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaHBzYV9pbnRlcnJ1cHRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKQogewogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJaW50IGVycjsKQEAgLTMyMTksMTMgKzMzNjMsMTIgQEAKIAl9OwogCiAJLyogU29tZSBib2FyZHMgYWR2ZXJ0aXNlIE1TSSBidXQgZG9uJ3QgcmVhbGx5IHN1cHBvcnQgaXQgKi8KLQlpZiAoKGJvYXJkX2lkID09IDB4NDA3MDBFMTEpIHx8Ci0JICAgIChib2FyZF9pZCA9PSAweDQwODAwRTExKSB8fAotCSAgICAoYm9hcmRfaWQgPT0gMHg0MDgyMEUxMSkgfHwgKGJvYXJkX2lkID09IDB4NDA4MzBFMTEpKQorCWlmICgoaC0+Ym9hcmRfaWQgPT0gMHg0MDcwMEUxMSkgfHwgKGgtPmJvYXJkX2lkID09IDB4NDA4MDBFMTEpIHx8CisJICAgIChoLT5ib2FyZF9pZCA9PSAweDQwODIwRTExKSB8fCAoaC0+Ym9hcmRfaWQgPT0gMHg0MDgzMEUxMSkpCiAJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKLQlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKSB7Ci0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJNU0lYXG4iKTsKLQkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGhwc2FfbXNpeF9lbnRyaWVzLCA0KTsKKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShoLT5wZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKSB7CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJNU0lYXG4iKTsKKwkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KGgtPnBkZXYsIGhwc2FfbXNpeF9lbnRyaWVzLCA0KTsKIAkJaWYgKCFlcnIpIHsKIAkJCWgtPmludHJbMF0gPSBocHNhX21zaXhfZW50cmllc1swXS52ZWN0b3I7CiAJCQloLT5pbnRyWzFdID0gaHBzYV9tc2l4X2VudHJpZXNbMV0udmVjdG9yOwpAQCAtMzIzNSwxNDQgKzMzNzgsMTU4IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKGVyciA+IDApIHsKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJvbmx5ICVkIE1TSS1YIHZlY3RvcnMgIgorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm9ubHkgJWQgTVNJLVggdmVjdG9ycyAiCiAJCQkgICAgICAgImF2YWlsYWJsZVxuIiwgZXJyKTsKIAkJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKIAkJfSBlbHNlIHsKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJNU0ktWCBpbml0IGZhaWxlZCAlZFxuIiwKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJNU0ktWCBpbml0IGZhaWxlZCAlZFxuIiwKIAkJCSAgICAgICBlcnIpOwogCQkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCQl9CiAJfQotCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJKSkgewotCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTVNJXG4iKTsKLQkJaWYgKCFwY2lfZW5hYmxlX21zaShwZGV2KSkKKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShoLT5wZGV2LCBQQ0lfQ0FQX0lEX01TSSkpIHsKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgIk1TSVxuIik7CisJCWlmICghcGNpX2VuYWJsZV9tc2koaC0+cGRldikpCiAJCQloLT5tc2lfdmVjdG9yID0gMTsKIAkJZWxzZQotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIk1TSSBpbml0IGZhaWxlZFxuIik7CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTVNJIGluaXQgZmFpbGVkXG4iKTsKIAl9CiBkZWZhdWx0X2ludF9tb2RlOgogI2VuZGlmCQkJCS8qIENPTkZJR19QQ0lfTVNJICovCiAJLyogaWYgd2UgZ2V0IGhlcmUgd2UncmUgZ29pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IGludGVycnVwdCBtb2RlICovCi0JaC0+aW50cltQRVJGX01PREVfSU5UXSA9IHBkZXYtPmlycTsKKwloLT5pbnRyW1BFUkZfTU9ERV9JTlRdID0gaC0+cGRldi0+aXJxOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBocHNhX3BjaV9pbml0KHN0cnVjdCBjdGxyX2luZm8gKmgsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgaHBzYV9sb29rdXBfYm9hcmRfaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiAqYm9hcmRfaWQpCiB7Ci0JdXNob3J0IHN1YnN5c3RlbV92ZW5kb3JfaWQsIHN1YnN5c3RlbV9kZXZpY2VfaWQsIGNvbW1hbmQ7Ci0JdTMyIGJvYXJkX2lkLCBzY3JhdGNocGFkID0gMDsKKwlpbnQgaTsKKwl1MzIgc3Vic3lzdGVtX3ZlbmRvcl9pZCwgc3Vic3lzdGVtX2RldmljZV9pZDsKKworCXN1YnN5c3RlbV92ZW5kb3JfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCXN1YnN5c3RlbV9kZXZpY2VfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCSpib2FyZF9pZCA9ICgoc3Vic3lzdGVtX2RldmljZV9pZCA8PCAxNikgJiAweGZmZmYwMDAwKSB8CisJCSAgICBzdWJzeXN0ZW1fdmVuZG9yX2lkOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvZHVjdHMpOyBpKyspCisJCWlmICgqYm9hcmRfaWQgPT0gcHJvZHVjdHNbaV0uYm9hcmRfaWQpCisJCQlyZXR1cm4gaTsKKworCWlmICgoc3Vic3lzdGVtX3ZlbmRvcl9pZCAhPSBQQ0lfVkVORE9SX0lEX0hQICYmCisJCXN1YnN5c3RlbV92ZW5kb3JfaWQgIT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpIHx8CisJCSFocHNhX2FsbG93X2FueSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAidW5yZWNvZ25pemVkIGJvYXJkIElEOiAiCisJCQkiMHglMDh4LCBpZ25vcmluZy5cbiIsICpib2FyZF9pZCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIEFSUkFZX1NJWkUocHJvZHVjdHMpIC0gMTsgLyogZ2VuZXJpYyB1bmtub3duIHNtYXJ0IGFycmF5ICovCit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBocHNhX2JvYXJkX2Rpc2FibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBjb21tYW5kOworCisJKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJcmV0dXJuICgoY29tbWFuZCAmIFBDSV9DT01NQU5EX01FTU9SWSkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhwc2FfcGNpX2ZpbmRfbWVtb3J5X0JBUihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwl1bnNpZ25lZCBsb25nICptZW1vcnlfYmFyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKQorCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJCS8qIGFkZHJlc3NpbmcgbW9kZSBiaXRzIGFscmVhZHkgcmVtb3ZlZCAqLworCQkJKm1lbW9yeV9iYXIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtZW1vcnkgQkFSID0gJWx4XG4iLAorCQkJCSptZW1vcnlfYmFyKTsKKwkJCXJldHVybiAwOworCQl9CisJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm5vIG1lbW9yeSBCQVIgZm91bmRcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocHNhX3dhaXRfZm9yX2JvYXJkX3JlYWR5KHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaW50IGk7CisJdTMyIHNjcmF0Y2hwYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFBTQV9CT0FSRF9SRUFEWV9JVEVSQVRJT05TOyBpKyspIHsKKwkJc2NyYXRjaHBhZCA9IHJlYWRsKGgtPnZhZGRyICsgU0E1X1NDUkFUQ0hQQURfT0ZGU0VUKTsKKwkJaWYgKHNjcmF0Y2hwYWQgPT0gSFBTQV9GSVJNV0FSRV9SRUFEWSkKKwkJCXJldHVybiAwOworCQltc2xlZXAoSFBTQV9CT0FSRF9SRUFEWV9QT0xMX0lOVEVSVkFMX01TRUNTKTsKKwl9CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImJvYXJkIG5vdCByZWFkeSwgdGltZWQgb3V0LlxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhwc2FfZmluZF9jZmdfYWRkcnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJdm9pZCBfX2lvbWVtICp2YWRkciwgdTMyICpjZmdfYmFzZV9hZGRyLCB1NjQgKmNmZ19iYXNlX2FkZHJfaW5kZXgsCisJdTY0ICpjZmdfb2Zmc2V0KQoreworCSpjZmdfYmFzZV9hZGRyID0gcmVhZGwodmFkZHIgKyBTQTVfQ1RDRkdfT0ZGU0VUKTsKKwkqY2ZnX29mZnNldCA9IHJlYWRsKHZhZGRyICsgU0E1X0NUTUVNX09GRlNFVCk7CisJKmNmZ19iYXNlX2FkZHIgJj0gKHUzMikgMHgwMDAwZmZmZjsKKwkqY2ZnX2Jhc2VfYWRkcl9pbmRleCA9IGZpbmRfUENJX0JBUl9pbmRleChwZGV2LCAqY2ZnX2Jhc2VfYWRkcik7CisJaWYgKCpjZmdfYmFzZV9hZGRyX2luZGV4ID09IC0xKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjYW5ub3QgZmluZCBjZmdfYmFzZV9hZGRyX2luZGV4XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocHNhX2ZpbmRfY2ZndGFibGVzKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CiAJdTY0IGNmZ19vZmZzZXQ7CiAJdTMyIGNmZ19iYXNlX2FkZHI7CiAJdTY0IGNmZ19iYXNlX2FkZHJfaW5kZXg7CiAJdTMyIHRyYW5zX29mZnNldDsKLQlpbnQgaSwgcHJvZF9pbmRleCwgZXJyOworCWludCByYzsKIAotCXN1YnN5c3RlbV92ZW5kb3JfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOwotCXN1YnN5c3RlbV9kZXZpY2VfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOwotCWJvYXJkX2lkID0gKCgodTMyKSAoc3Vic3lzdGVtX2RldmljZV9pZCA8PCAxNikgJiAweGZmZmYwMDAwKSB8Ci0JCSAgICBzdWJzeXN0ZW1fdmVuZG9yX2lkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb2R1Y3RzKTsgaSsrKQotCQlpZiAoYm9hcmRfaWQgPT0gcHJvZHVjdHNbaV0uYm9hcmRfaWQpCi0JCQlicmVhazsKLQotCXByb2RfaW5kZXggPSBpOwotCi0JaWYgKHByb2RfaW5kZXggPT0gQVJSQVlfU0laRShwcm9kdWN0cykpIHsKLQkJcHJvZF9pbmRleC0tOwotCQlpZiAoc3Vic3lzdGVtX3ZlbmRvcl9pZCAhPSBQQ0lfVkVORE9SX0lEX0hQIHx8Ci0JCQkJIWhwc2FfYWxsb3dfYW55KSB7Ci0JCQlkZXZfd2FybigmcGRldi0+ZGV2LCAidW5yZWNvZ25pemVkIGJvYXJkIElEOiIKLQkJCQkiIDB4JTA4bHgsIGlnbm9yaW5nLlxuIiwKLQkJCQkodW5zaWduZWQgbG9uZykgYm9hcmRfaWQpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0JLyogY2hlY2sgdG8gc2VlIGlmIGNvbnRyb2xsZXIgaGFzIGJlZW4gZGlzYWJsZWQKLQkgKiBCRUZPUkUgdHJ5aW5nIHRvIGVuYWJsZSBpdAotCSAqLwotCSh2b2lkKXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7Ci0JaWYgKCEoY29tbWFuZCAmIDB4MDIpKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb250cm9sbGVyIGFwcGVhcnMgdG8gYmUgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImhwc2EiKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIElmIHRoZSBrZXJuZWwgc3VwcG9ydHMgTVNJL01TSS1YIHdlIHdpbGwgdHJ5IHRvIGVuYWJsZSB0aGF0LAotCSAqIGVsc2Ugd2UgdXNlIHRoZSBJTy1BUElDIGludGVycnVwdCBhc3NpZ25lZCB0byB1cyBieSBzeXN0ZW0gUk9NLgotCSAqLwotCWhwc2FfaW50ZXJydXB0X21vZGUoaCwgcGRldiwgYm9hcmRfaWQpOwotCi0JLyogZmluZCB0aGUgbWVtb3J5IEJBUiAqLwotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgSU9SRVNPVVJDRV9NRU0pCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gREVWSUNFX0NPVU5UX1JFU09VUkNFKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgQkFSIGZvdW5kXG4iKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwotCX0KLQotCWgtPnBhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOyAvKiBhZGRyZXNzaW5nIG1vZGUgYml0cwotCQkJCQkJICogYWxyZWFkeSByZW1vdmVkCi0JCQkJCQkgKi8KLQotCWgtPnZhZGRyID0gcmVtYXBfcGNpX21lbShoLT5wYWRkciwgMHgyNTApOwotCi0JLyogV2FpdCBmb3IgdGhlIGJvYXJkIHRvIGJlY29tZSByZWFkeS4gICovCi0JZm9yIChpID0gMDsgaSA8IEhQU0FfQk9BUkRfUkVBRFlfSVRFUkFUSU9OUzsgaSsrKSB7Ci0JCXNjcmF0Y2hwYWQgPSByZWFkbChoLT52YWRkciArIFNBNV9TQ1JBVENIUEFEX09GRlNFVCk7Ci0JCWlmIChzY3JhdGNocGFkID09IEhQU0FfRklSTVdBUkVfUkVBRFkpCi0JCQlicmVhazsKLQkJbXNsZWVwKEhQU0FfQk9BUkRfUkVBRFlfUE9MTF9JTlRFUlZBTF9NU0VDUyk7Ci0JfQotCWlmIChzY3JhdGNocGFkICE9IEhQU0FfRklSTVdBUkVfUkVBRFkpIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImJvYXJkIG5vdCByZWFkeSwgdGltZWQgb3V0LlxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dF9mcmVlX3JlczsKLQl9Ci0KLQkvKiBnZXQgdGhlIGFkZHJlc3MgaW5kZXggbnVtYmVyICovCi0JY2ZnX2Jhc2VfYWRkciA9IHJlYWRsKGgtPnZhZGRyICsgU0E1X0NUQ0ZHX09GRlNFVCk7Ci0JY2ZnX2Jhc2VfYWRkciAmPSAodTMyKSAweDAwMDBmZmZmOwotCWNmZ19iYXNlX2FkZHJfaW5kZXggPSBmaW5kX1BDSV9CQVJfaW5kZXgocGRldiwgY2ZnX2Jhc2VfYWRkcik7Ci0JaWYgKGNmZ19iYXNlX2FkZHJfaW5kZXggPT0gLTEpIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNhbm5vdCBmaW5kIGNmZ19iYXNlX2FkZHJfaW5kZXhcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7Ci0JfQotCi0JY2ZnX29mZnNldCA9IHJlYWRsKGgtPnZhZGRyICsgU0E1X0NUTUVNX09GRlNFVCk7Ci0JaC0+Y2ZndGFibGUgPSByZW1hcF9wY2lfbWVtKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LAotCQkJICAgICAgIGNmZ19iYXNlX2FkZHJfaW5kZXgpICsgY2ZnX29mZnNldCwKLQkJCQlzaXplb2YoaC0+Y2ZndGFibGUpKTsKKwlyYyA9IGhwc2FfZmluZF9jZmdfYWRkcnMoaC0+cGRldiwgaC0+dmFkZHIsICZjZmdfYmFzZV9hZGRyLAorCQkmY2ZnX2Jhc2VfYWRkcl9pbmRleCwgJmNmZ19vZmZzZXQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWgtPmNmZ3RhYmxlID0gcmVtYXBfcGNpX21lbShwY2lfcmVzb3VyY2Vfc3RhcnQoaC0+cGRldiwKKwkJICAgICAgIGNmZ19iYXNlX2FkZHJfaW5kZXgpICsgY2ZnX29mZnNldCwgc2l6ZW9mKCpoLT5jZmd0YWJsZSkpOworCWlmICghaC0+Y2ZndGFibGUpCisJCXJldHVybiAtRU5PTUVNOwogCS8qIEZpbmQgcGVyZm9ybWFudCBtb2RlIHRhYmxlLiAqLwotCXRyYW5zX29mZnNldCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zTWV0aG9kT2Zmc2V0KSk7Ci0JaC0+dHJhbnN0YWJsZSA9IHJlbWFwX3BjaV9tZW0ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsCisJdHJhbnNfb2Zmc2V0ID0gcmVhZGwoJmgtPmNmZ3RhYmxlLT5UcmFuc01ldGhvZE9mZnNldCk7CisJaC0+dHJhbnN0YWJsZSA9IHJlbWFwX3BjaV9tZW0ocGNpX3Jlc291cmNlX3N0YXJ0KGgtPnBkZXYsCiAJCQkJY2ZnX2Jhc2VfYWRkcl9pbmRleCkrY2ZnX29mZnNldCt0cmFuc19vZmZzZXQsCiAJCQkJc2l6ZW9mKCpoLT50cmFuc3RhYmxlKSk7CisJaWYgKCFoLT50cmFuc3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KIAotCWgtPmJvYXJkX2lkID0gYm9hcmRfaWQ7CitzdGF0aWMgdm9pZCBfX2RldmluaXQgaHBzYV9nZXRfbWF4X3BlcmZfbW9kZV9jbWRzKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CiAJaC0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+TWF4UGVyZm9ybWFudE1vZGVDb21tYW5kcykpOwotCWgtPm1heHNnZW50cmllcyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPk1heFNjYXR0ZXJHYXRoZXJFbGVtZW50cykpOworCWlmIChoLT5tYXhfY29tbWFuZHMgPCAxNikgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiQ29udHJvbGxlciByZXBvcnRzICIKKwkJCSJtYXggc3VwcG9ydGVkIGNvbW1hbmRzIG9mICVkLCBhbiBvYnZpb3VzIGxpZS4gIgorCQkJIlVzaW5nIDE2LiAgRW5zdXJlIHRoYXQgZmlybXdhcmUgaXMgdXAgdG8gZGF0ZS5cbiIsCisJCQloLT5tYXhfY29tbWFuZHMpOworCQloLT5tYXhfY29tbWFuZHMgPSAxNjsKKwl9Cit9CiAKKy8qIEludGVycm9nYXRlIHRoZSBoYXJkd2FyZSBmb3Igc29tZSBsaW1pdHM6CisgKiBtYXggY29tbWFuZHMsIG1heCBTRyBlbGVtZW50cyB3aXRob3V0IGNoYWluaW5nLCBhbmQgd2l0aCBjaGFpbmluZywKKyAqIFNHIGNoYWluIGJsb2NrIHNpemUsIGV0Yy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGhwc2FfZmluZF9ib2FyZF9wYXJhbXMoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlocHNhX2dldF9tYXhfcGVyZl9tb2RlX2NtZHMoaCk7CisJaC0+bnJfY21kcyA9IGgtPm1heF9jb21tYW5kcyAtIDQ7IC8qIEFsbG93IHJvb20gZm9yIHNvbWUgaW9jdGxzICovCisJaC0+bWF4c2dlbnRyaWVzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+TWF4U2NhdHRlckdhdGhlckVsZW1lbnRzKSk7CiAJLyoKIAkgKiBMaW1pdCBpbi1jb21tYW5kIHMvZyBlbGVtZW50cyB0byAzMiBzYXZlIGRtYSdhYmxlIG1lbW9yeS4KIAkgKiBIb3d2ZXZlciBzcGVjIHNheXMgaWYgMCwgdXNlIDMxCiAJICovCi0KIAloLT5tYXhfY21kX3NnX2VudHJpZXMgPSAzMTsKIAlpZiAoaC0+bWF4c2dlbnRyaWVzID4gNTEyKSB7CiAJCWgtPm1heF9jbWRfc2dfZW50cmllcyA9IDMyOwpAQCAtMzM4Miw0NSArMzUzOSw0OSBAQAogCQloLT5tYXhzZ2VudHJpZXMgPSAzMTsgLyogZGVmYXVsdCB0byB0cmFkaXRpb25hbCB2YWx1ZXMgKi8KIAkJaC0+Y2hhaW5zaXplID0gMDsKIAl9Cit9CiAKLQloLT5wcm9kdWN0X25hbWUgPSBwcm9kdWN0c1twcm9kX2luZGV4XS5wcm9kdWN0X25hbWU7Ci0JaC0+YWNjZXNzID0gKihwcm9kdWN0c1twcm9kX2luZGV4XS5hY2Nlc3MpOwotCS8qIEFsbG93IHJvb20gZm9yIHNvbWUgaW9jdGxzICovCi0JaC0+bnJfY21kcyA9IGgtPm1heF9jb21tYW5kcyAtIDQ7Ci0KK3N0YXRpYyBpbmxpbmUgYm9vbCBocHNhX0NJU1Nfc2lnbmF0dXJlX3ByZXNlbnQoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKIAlpZiAoKHJlYWRiKCZoLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzBdKSAhPSAnQycpIHx8CiAJICAgIChyZWFkYigmaC0+Y2ZndGFibGUtPlNpZ25hdHVyZVsxXSkgIT0gJ0knKSB8fAogCSAgICAocmVhZGIoJmgtPmNmZ3RhYmxlLT5TaWduYXR1cmVbMl0pICE9ICdTJykgfHwKIAkgICAgKHJlYWRiKCZoLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzNdKSAhPSAnUycpKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJub3QgYSB2YWxpZCBDSVNTIGNvbmZpZyB0YWJsZVxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm5vdCBhIHZhbGlkIENJU1MgY29uZmlnIHRhYmxlXG4iKTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogTmVlZCB0byBlbmFibGUgcHJlZmV0Y2ggaW4gdGhlIFNDU0kgY29yZSBmb3IgNjQwMCBpbiB4ODYgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocHNhX2VuYWJsZV9zY3NpX3ByZWZldGNoKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CiAjaWZkZWYgQ09ORklHX1g4NgotCXsKLQkJLyogTmVlZCB0byBlbmFibGUgcHJlZmV0Y2ggaW4gdGhlIFNDU0kgY29yZSBmb3IgNjQwMCBpbiB4ODYgKi8KLQkJdTMyIHByZWZldGNoOwotCQlwcmVmZXRjaCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlNDU0lfUHJlZmV0Y2gpKTsKLQkJcHJlZmV0Y2ggfD0gMHgxMDA7Ci0JCXdyaXRlbChwcmVmZXRjaCwgJihoLT5jZmd0YWJsZS0+U0NTSV9QcmVmZXRjaCkpOwotCX0KKwl1MzIgcHJlZmV0Y2g7CisKKwlwcmVmZXRjaCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlNDU0lfUHJlZmV0Y2gpKTsKKwlwcmVmZXRjaCB8PSAweDEwMDsKKwl3cml0ZWwocHJlZmV0Y2gsICYoaC0+Y2ZndGFibGUtPlNDU0lfUHJlZmV0Y2gpKTsKICNlbmRpZgorfQogCi0JLyogRGlzYWJsaW5nIERNQSBwcmVmZXRjaCBmb3IgdGhlIFA2MDAKLQkgKiBBbiBBU0lDIGJ1ZyBtYXkgcmVzdWx0IGluIGEgcHJlZmV0Y2ggYmV5b25kCi0JICogcGh5c2ljYWwgbWVtb3J5LgotCSAqLwotCWlmIChib2FyZF9pZCA9PSAweDMyMjUxMDNDKSB7Ci0JCXUzMiBkbWFfcHJlZmV0Y2g7Ci0JCWRtYV9wcmVmZXRjaCA9IHJlYWRsKGgtPnZhZGRyICsgSTJPX0RNQTFfQ0ZHKTsKLQkJZG1hX3ByZWZldGNoIHw9IDB4ODAwMDsKLQkJd3JpdGVsKGRtYV9wcmVmZXRjaCwgaC0+dmFkZHIgKyBJMk9fRE1BMV9DRkcpOwotCX0KKy8qIERpc2FibGUgRE1BIHByZWZldGNoIGZvciB0aGUgUDYwMC4gIE90aGVyd2lzZSBhbiBBU0lDIGJ1ZyBtYXkgcmVzdWx0CisgKiBpbiBhIHByZWZldGNoIGJleW9uZCBwaHlzaWNhbCBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocHNhX3A2MDBfZG1hX3ByZWZldGNoX3F1aXJrKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdTMyIGRtYV9wcmVmZXRjaDsKIAotCWgtPm1heF9jb21tYW5kcyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPkNtZHNPdXRNYXgpKTsKLQkvKiBVcGRhdGUgdGhlIGZpZWxkLCBhbmQgdGhlbiByaW5nIHRoZSBkb29yYmVsbCAqLwotCXdyaXRlbChDRkdUQkxfVHJhbnNfU2ltcGxlLCAmKGgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuVHJhbnNwb3J0UmVxdWVzdCkpOwotCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJaWYgKGgtPmJvYXJkX2lkICE9IDB4MzIyNTEwM0MpCisJCXJldHVybjsKKwlkbWFfcHJlZmV0Y2ggPSByZWFkbChoLT52YWRkciArIEkyT19ETUExX0NGRyk7CisJZG1hX3ByZWZldGNoIHw9IDB4ODAwMDsKKwl3cml0ZWwoZG1hX3ByZWZldGNoLCBoLT52YWRkciArIEkyT19ETUExX0NGRyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWludCBpOwogCiAJLyogdW5kZXIgY2VydGFpbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgdGhpcyBjYW4gdGFrZSBhd2hpbGUuCiAJICogKGUuZy46IGhvdCByZXBsYWNlIGEgZmFpbGVkIDE0NEdCIGRyaXZlIGluIGEgUkFJRCA1IHNldCByaWdodApAQCAtMzQzMiwyNCArMzU5Myw5NiBAQAogCQkvKiBkZWxheSBhbmQgdHJ5IGFnYWluICovCiAJCW1zbGVlcCgxMCk7CiAJfQorfQogCi0jaWZkZWYgSFBTQV9ERUJVRwotCXByaW50X2NmZ190YWJsZSgmcGRldi0+ZGV2LCBoLT5jZmd0YWJsZSk7Ci0jZW5kaWYJCQkJLyogSFBTQV9ERUJVRyAqLworc3RhdGljIGludCBfX2RldmluaXQgaHBzYV9lbnRlcl9zaW1wbGVfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCXUzMiB0cmFuc19zdXBwb3J0OwogCisJdHJhbnNfc3VwcG9ydCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydFN1cHBvcnQpKTsKKwlpZiAoISh0cmFuc19zdXBwb3J0ICYgU0lNUExFX01PREUpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaC0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+Q21kc091dE1heCkpOworCS8qIFVwZGF0ZSB0aGUgZmllbGQsIGFuZCB0aGVuIHJpbmcgdGhlIGRvb3JiZWxsICovCisJd3JpdGVsKENGR1RCTF9UcmFuc19TaW1wbGUsICYoaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5UcmFuc3BvcnRSZXF1ZXN0KSk7CisJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKKwlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKKwlwcmludF9jZmdfdGFibGUoJmgtPnBkZXYtPmRldiwgaC0+Y2ZndGFibGUpOwogCWlmICghKHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSkpICYgQ0ZHVEJMX1RyYW5zX1NpbXBsZSkpIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgYm9hcmQgaW50byBzaW1wbGUgbW9kZVxuIik7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIHNpbXBsZSBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocHNhX3BjaV9pbml0KHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaW50IHByb2RfaW5kZXgsIGVycjsKKworCXByb2RfaW5kZXggPSBocHNhX2xvb2t1cF9ib2FyZF9pZChoLT5wZGV2LCAmaC0+Ym9hcmRfaWQpOworCWlmIChwcm9kX2luZGV4IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaC0+cHJvZHVjdF9uYW1lID0gcHJvZHVjdHNbcHJvZF9pbmRleF0ucHJvZHVjdF9uYW1lOworCWgtPmFjY2VzcyA9ICoocHJvZHVjdHNbcHJvZF9pbmRleF0uYWNjZXNzKTsKKworCWlmIChocHNhX2JvYXJkX2Rpc2FibGVkKGgtPnBkZXYpKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJjb250cm9sbGVyIGFwcGVhcnMgdG8gYmUgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UoaC0+cGRldik7CisJaWYgKGVycikgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidW5hYmxlIHRvIGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGgtPnBkZXYsICJocHNhIik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsCisJCQkiY2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCWhwc2FfaW50ZXJydXB0X21vZGUoaCk7CisJZXJyID0gaHBzYV9wY2lfZmluZF9tZW1vcnlfQkFSKGgtPnBkZXYsICZoLT5wYWRkcik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCWgtPnZhZGRyID0gcmVtYXBfcGNpX21lbShoLT5wYWRkciwgMHgyNTApOworCWlmICghaC0+dmFkZHIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKwllcnIgPSBocHNhX3dhaXRfZm9yX2JvYXJkX3JlYWR5KGgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwllcnIgPSBocHNhX2ZpbmRfY2ZndGFibGVzKGgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwlocHNhX2ZpbmRfYm9hcmRfcGFyYW1zKGgpOworCisJaWYgKCFocHNhX0NJU1Nfc2lnbmF0dXJlX3ByZXNlbnQoaCkpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwogCX0KKwlocHNhX2VuYWJsZV9zY3NpX3ByZWZldGNoKGgpOworCWhwc2FfcDYwMF9kbWFfcHJlZmV0Y2hfcXVpcmsoaCk7CisJZXJyID0gaHBzYV9lbnRlcl9zaW1wbGVfbW9kZShoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfZnJlZV9yZXM6CisJaWYgKGgtPnRyYW5zdGFibGUpCisJCWlvdW5tYXAoaC0+dHJhbnN0YWJsZSk7CisJaWYgKGgtPmNmZ3RhYmxlKQorCQlpb3VubWFwKGgtPmNmZ3RhYmxlKTsKKwlpZiAoaC0+dmFkZHIpCisJCWlvdW5tYXAoaC0+dmFkZHIpOwogCS8qCiAJICogRGVsaWJlcmF0ZWx5IG9taXQgcGNpX2Rpc2FibGVfZGV2aWNlKCk6IGl0IGRvZXMgc29tZXRoaW5nIG5hc3R5IHRvCiAJICogU21hcnQgQXJyYXkgY29udHJvbGxlcnMgdGhhdCBwY2lfZW5hYmxlX2RldmljZSBkb2VzIG5vdCB1bmRvCiAJICovCi0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGgtPnBkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM0NjksMzMgKzM3MDIsNTEgQEAKIAl9CiB9CiAKK3N0YXRpYyBfX2RldmluaXQgaW50IGhwc2FfaW5pdF9yZXNldF9kZXZpY2VzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByYywgaTsKKworCWlmICghcmVzZXRfZGV2aWNlcykKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXNldCB0aGUgY29udHJvbGxlciB3aXRoIGEgUENJIHBvd2VyLWN5Y2xlIG9yIHZpYSBkb29yYmVsbCAqLworCXJjID0gaHBzYV9rZHVtcF9oYXJkX3Jlc2V0X2NvbnRyb2xsZXIocGRldik7CisKKwkvKiAtRU5PVFNVUFAgaGVyZSBtZWFucyB3ZSBjYW5ub3QgcmVzZXQgdGhlIGNvbnRyb2xsZXIKKwkgKiBidXQgaXQncyBhbHJlYWR5IChhbmQgc3RpbGwpIHVwIGFuZCBydW5uaW5nIGluCisJICogInBlcmZvcm1hbnQgbW9kZSIuICBPciwgaXQgbWlnaHQgYmUgNjQweCwgd2hpY2ggY2FuJ3QgcmVzZXQKKwkgKiBkdWUgdG8gY29uY2VybnMgYWJvdXQgc2hhcmVkIGJid2MgYmV0d2VlbiA2NDAyLzY0MDQgcGFpci4KKwkgKi8KKwlpZiAocmMgPT0gLUVOT1RTVVBQKQorCQlyZXR1cm4gMDsgLyoganVzdCB0cnkgdG8gZG8gdGhlIGtkdW1wIGFueWhvdy4gKi8KKwlpZiAocmMpCisJCXJldHVybiAtRU5PREVWOworCWlmIChocHNhX3Jlc2V0X21zaShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBOb3cgdHJ5IHRvIGdldCB0aGUgY29udHJvbGxlciB0byByZXNwb25kIHRvIGEgbm8tb3AgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSFBTQV9QT1NUX1JFU0VUX05PT1BfUkVUUklFUzsgaSsrKSB7CisJCWlmIChocHNhX25vb3AocGRldikgPT0gMCkKKwkJCWJyZWFrOworCQllbHNlCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibm8tb3AgZmFpbGVkJXNcbiIsCisJCQkJCShpIDwgMTEgPyAiOyByZS10cnlpbmciIDogIiIpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGhwc2FfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JaW50IGksIHJjOwotCWludCBkYWM7CisJaW50IGRhYywgcmM7CiAJc3RydWN0IGN0bHJfaW5mbyAqaDsKIAogCWlmIChudW1iZXJfb2ZfY29udHJvbGxlcnMgPT0gMCkKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiXG4iKTsKLQlpZiAocmVzZXRfZGV2aWNlcykgewotCQkvKiBSZXNldCB0aGUgY29udHJvbGxlciB3aXRoIGEgUENJIHBvd2VyLWN5Y2xlICovCi0JCWlmIChocHNhX2hhcmRfcmVzZXRfY29udHJvbGxlcihwZGV2KSB8fCBocHNhX3Jlc2V0X21zaShwZGV2KSkKLQkJCXJldHVybiAtRU5PREVWOwogCi0JCS8qIFNvbWUgZGV2aWNlcyAobm90YWJseSB0aGUgSFAgU21hcnQgQXJyYXkgNWkgQ29udHJvbGxlcikKLQkJICAgbmVlZCBhIGxpdHRsZSBwYXVzZSBoZXJlICovCi0JCW1zbGVlcChIUFNBX1BPU1RfUkVTRVRfUEFVU0VfTVNFQ1MpOwotCi0JCS8qIE5vdyB0cnkgdG8gZ2V0IHRoZSBjb250cm9sbGVyIHRvIHJlc3BvbmQgdG8gYSBuby1vcCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgSFBTQV9QT1NUX1JFU0VUX05PT1BfUkVUUklFUzsgaSsrKSB7Ci0JCQlpZiAoaHBzYV9ub29wKHBkZXYpID09IDApCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0JCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm5vLW9wIGZhaWxlZCVzXG4iLAotCQkJCQkJKGkgPCAxMSA/ICI7IHJlLXRyeWluZyIgOiAiIikpOwotCQl9Ci0JfQorCXJjID0gaHBzYV9pbml0X3Jlc2V0X2RldmljZXMocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAkvKiBDb21tYW5kIHN0cnVjdHVyZXMgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMzItYnl0ZSBib3VuZGFyeSBiZWNhdXNlCiAJICogdGhlIDUgbG93ZXIgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgdXNlZCBieSB0aGUgaGFyZHdhcmUuIGFuZCBieQpAQCAtMzUwNywxNyArMzc1OCwxNyBAQAogCWlmICghaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwloLT5wZGV2ID0gcGRldjsKIAloLT5idXN5X2luaXRpYWxpemluZyA9IDE7CiAJSU5JVF9ITElTVF9IRUFEKCZoLT5jbXBRKTsKIAlJTklUX0hMSVNUX0hFQUQoJmgtPnJlcVEpOwotCXJjID0gaHBzYV9wY2lfaW5pdChoLCBwZGV2KTsKKwlyYyA9IGhwc2FfcGNpX2luaXQoaCk7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gY2xlYW4xOwogCiAJc3ByaW50ZihoLT5kZXZuYW1lLCAiaHBzYSVkIiwgbnVtYmVyX29mX2NvbnRyb2xsZXJzKTsKIAloLT5jdGxyID0gbnVtYmVyX29mX2NvbnRyb2xsZXJzOwogCW51bWJlcl9vZl9jb250cm9sbGVycysrOwotCWgtPnBkZXYgPSBwZGV2OwogCiAJLyogY29uZmlndXJlIFBDSSBETUEgc3R1ZmYgKi8KIAlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CkBAIC0zNTM1LDggKzM3ODYsMTMgQEAKIAogCS8qIG1ha2Ugc3VyZSB0aGUgYm9hcmQgaW50ZXJydXB0cyBhcmUgb2ZmICovCiAJaC0+YWNjZXNzLnNldF9pbnRyX21hc2soaCwgSFBTQV9JTlRSX09GRik7Ci0JcmMgPSByZXF1ZXN0X2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBkb19ocHNhX2ludHIsCi0JCQlJUlFGX0RJU0FCTEVELCBoLT5kZXZuYW1lLCBoKTsKKworCWlmIChoLT5tc2l4X3ZlY3RvciB8fCBoLT5tc2lfdmVjdG9yKQorCQlyYyA9IHJlcXVlc3RfaXJxKGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGRvX2hwc2FfaW50cl9tc2ksCisJCQkJSVJRRl9ESVNBQkxFRCwgaC0+ZGV2bmFtZSwgaCk7CisJZWxzZQorCQlyYyA9IHJlcXVlc3RfaXJxKGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGRvX2hwc2FfaW50cl9pbnR4LAorCQkJCUlSUUZfRElTQUJMRUQsIGgtPmRldm5hbWUsIGgpOwogCWlmIChyYykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCiAJCSAgICAgICBoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBoLT5kZXZuYW1lKTsKQEAgLTM2NjMsNiArMzkxOSw4IEBACiAJaHBzYV91bnJlZ2lzdGVyX3Njc2koaCk7CS8qIHVuaG9vayBmcm9tIFNDU0kgc3Vic3lzdGVtICovCiAJaHBzYV9zaHV0ZG93bihwZGV2KTsKIAlpb3VubWFwKGgtPnZhZGRyKTsKKwlpb3VubWFwKGgtPnRyYW5zdGFibGUpOworCWlvdW5tYXAoaC0+Y2ZndGFibGUpOwogCWhwc2FfZnJlZV9zZ19jaGFpbl9ibG9ja3MoaCk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LAogCQloLT5ucl9jbWRzICogc2l6ZW9mKHN0cnVjdCBDb21tYW5kTGlzdCksCkBAIC0zNzQyLDM4ICs0MDAwLDM1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBocHNhX3B1dF9jdGxyX2ludG9fcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgpCitzdGF0aWMgX19kZXZpbml0IHZvaWQgaHBzYV9lbnRlcl9wZXJmb3JtYW50X21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCkKIHsKLQl1MzIgdHJhbnNfc3VwcG9ydDsKLQl1NjQgdHJhbnNfb2Zmc2V0OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfdmFsdWU7CisKKwkvKiBUaGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkLiAgVGhlcmUgYXJlIDggcmVnaXN0ZXJzIG9uCisJICogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2Ugd3JpdGUgdG8gdG8gdGVsbCBpdCA4IGRpZmZlcmVudAorCSAqIHNpemVzIG9mIGNvbW1hbmRzIHdoaWNoIHRoZXJlIG1heSBiZS4gIEl0J3MgYSB3YXkgb2YKKwkgKiByZWR1Y2luZyB0aGUgRE1BIGRvbmUgdG8gZmV0Y2ggZWFjaCBjb21tYW5kLiAgRW5jb2RlZCBpbnRvCisJICogZWFjaCBjb21tYW5kJ3MgdGFnIGFyZSAzIGJpdHMgd2hpY2ggY29tbXVuaWNhdGUgdG8gdGhlIGNvbnRyb2xsZXIKKwkgKiB3aGljaCBvZiB0aGUgZWlnaHQgc2l6ZXMgdGhhdCBjb21tYW5kIGZpdHMgd2l0aGluLiAgVGhlIHNpemUgb2YKKwkgKiBlYWNoIGNvbW1hbmQgZGVwZW5kcyBvbiBob3cgbWFueSBzY2F0dGVyIGdhdGhlciBlbnRyaWVzIHRoZXJlIGFyZS4KKwkgKiBFYWNoIFNHIGVudHJ5IHJlcXVpcmVzIDE2IGJ5dGVzLiAgVGhlIGVpZ2h0IHJlZ2lzdGVycyBhcmUgcHJvZ3JhbW1lZAorCSAqIHdpdGggdGhlIG51bWJlciBvZiAxNi1ieXRlIGJsb2NrcyBhIGNvbW1hbmQgb2YgdGhhdCBzaXplIHJlcXVpcmVzLgorCSAqIFRoZSBzbWFsbGVzdCBjb21tYW5kIHBvc3NpYmxlIHJlcXVpcmVzIDUgc3VjaCAxNiBieXRlIGJsb2Nrcy4KKwkgKiB0aGUgbGFyZ2VzdCBjb21tYW5kIHBvc3NpYmxlIHJlcXVpcmVzIE1BWFNHRU5UUklFUyArIDQgMTYtYnl0ZQorCSAqIGJsb2Nrcy4gIE5vdGUsIHRoaXMgb25seSBleHRlbmRzIHRvIHRoZSBTRyBlbnRyaWVzIGNvbnRhaW5lZAorCSAqIHdpdGhpbiB0aGUgY29tbWFuZCBibG9jaywgYW5kIGRvZXMgbm90IGV4dGVuZCB0byBjaGFpbmVkIGJsb2NrcworCSAqIG9mIFNHIGVsZW1lbnRzLiAgIGJmdFtdIGNvbnRhaW5zIHRoZSBlaWdodCB2YWx1ZXMgd2Ugd3JpdGUgdG8KKwkgKiB0aGUgcmVnaXN0ZXJzLiAgVGhleSBhcmUgbm90IGV2ZW5seSBkaXN0cmlidXRlZCwgYnV0IGhhdmUgbW9yZQorCSAqIHNpemVzIGZvciBzbWFsbCBjb21tYW5kcywgYW5kIGZld2VyIHNpemVzIGZvciBsYXJnZXIgY29tbWFuZHMuCisJICovCisJaW50IGJmdFs4XSA9IHs1LCA2LCA4LCAxMCwgMTIsIDIwLCAyOCwgTUFYU0dFTlRSSUVTICsgNH07CisJQlVJTERfQlVHX09OKDI4ID4gTUFYU0dFTlRSSUVTICsgNCk7CiAJLyogIDUgPSAxIHMvZyBlbnRyeSBvciA0awogCSAqICA2ID0gMiBzL2cgZW50cnkgb3IgOGsKIAkgKiAgOCA9IDQgcy9nIGVudHJ5IG9yIDE2awogCSAqIDEwID0gNiBzL2cgZW50cnkgb3IgMjRrCiAJICovCi0JaW50IGJmdFs4XSA9IHs1LCA2LCA4LCAxMCwgMTIsIDIwLCAyOCwgMzV9OyAvKiBmb3Igc2NhdHRlci9nYXRoZXJzICovCi0JaW50IGkgPSAwOwotCWludCBsID0gMDsKLQl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX3ZhbHVlOwotCi0JdHJhbnNfc3VwcG9ydCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydFN1cHBvcnQpKTsKLQlpZiAoISh0cmFuc19zdXBwb3J0ICYgUEVSRk9STUFOVF9NT0RFKSkKLQkJcmV0dXJuOwotCi0JaC0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+TWF4UGVyZm9ybWFudE1vZGVDb21tYW5kcykpOwotCWgtPm1heF9zZ19lbnRyaWVzID0gMzI7Ci0JLyogUGVyZm9ybWFudCBtb2RlIHJpbmcgYnVmZmVyIGFuZCBzdXBwb3J0aW5nIGRhdGEgc3RydWN0dXJlcyAqLwotCWgtPnJlcGx5X3Bvb2xfc2l6ZSA9IGgtPm1heF9jb21tYW5kcyAqIHNpemVvZih1NjQpOwotCWgtPnJlcGx5X3Bvb2wgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LCBoLT5yZXBseV9wb29sX3NpemUsCi0JCQkJJihoLT5yZXBseV9wb29sX2RoYW5kbGUpKTsKLQotCS8qIE5lZWQgYSBibG9jayBmZXRjaCB0YWJsZSBmb3IgcGVyZm9ybWFudCBtb2RlICovCi0JaC0+YmxvY2tGZXRjaFRhYmxlID0ga21hbGxvYygoKGgtPm1heF9zZ19lbnRyaWVzKzEpICoKLQkJCQlzaXplb2YodTMyKSksIEdGUF9LRVJORUwpOwotCi0JaWYgKChoLT5yZXBseV9wb29sID09IE5VTEwpCi0JCXx8IChoLT5ibG9ja0ZldGNoVGFibGUgPT0gTlVMTCkpCi0JCWdvdG8gY2xlYW5fdXA7CiAKIAloLT5yZXBseV9wb29sX3dyYXBhcm91bmQgPSAxOyAvKiBzcGVjOiBpbml0IHRvIDEgKi8KIApAQCAtMzc4MSw3ICs0MDM2LDYgQEAKIAltZW1zZXQoaC0+cmVwbHlfcG9vbCwgMCwgaC0+cmVwbHlfcG9vbF9zaXplKTsKIAloLT5yZXBseV9wb29sX2hlYWQgPSBoLT5yZXBseV9wb29sOwogCi0JdHJhbnNfb2Zmc2V0ID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+VHJhbnNNZXRob2RPZmZzZXQpKTsKIAliZnRbN10gPSBoLT5tYXhfc2dfZW50cmllcyArIDQ7CiAJY2FsY19idWNrZXRfbWFwKGJmdCwgQVJSQVlfU0laRShiZnQpLCAzMiwgaC0+YmxvY2tGZXRjaFRhYmxlKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQpAQCAtMzc5NywyMyArNDA1MSwzOSBAQAogCXdyaXRlbChDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCwKIAkJJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKIAl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOwotCS8qIHVuZGVyIGNlcnRhaW4gdmVyeSByYXJlIGNvbmRpdGlvbnMsIHRoaXMgY2FuIHRha2UgYXdoaWxlLgotCSAqIChlLmcuOiBob3QgcmVwbGFjZSBhIGZhaWxlZCAxNDRHQiBkcml2ZSBpbiBhIFJBSUQgNSBzZXQgcmlnaHQKLQkgKiBhcyB3ZSBlbnRlciB0aGlzIGNvZGUuKSAqLwotCWZvciAobCA9IDA7IGwgPCBNQVhfQ09ORklHX1dBSVQ7IGwrKykgewotCQlyZWdpc3Rlcl92YWx1ZSA9IHJlYWRsKGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKLQkJaWYgKCEocmVnaXN0ZXJfdmFsdWUgJiBDRkdUQkxfQ2hhbmdlUmVxKSkKLQkJCWJyZWFrOwotCQkvKiBkZWxheSBhbmQgdHJ5IGFnYWluICovCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMTApOwotCX0KKwlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKIAlyZWdpc3Rlcl92YWx1ZSA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSkpOwogCWlmICghKHJlZ2lzdGVyX3ZhbHVlICYgQ0ZHVEJMX1RyYW5zX1BlcmZvcm1hbnQpKSB7CiAJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IGJvYXJkIGludG8iCiAJCQkJCSIgcGVyZm9ybWFudCBtb2RlXG4iKTsKIAkJcmV0dXJuOwogCX0KK30KKworc3RhdGljIF9fZGV2aW5pdCB2b2lkIGhwc2FfcHV0X2N0bHJfaW50b19wZXJmb3JtYW50X21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1MzIgdHJhbnNfc3VwcG9ydDsKKworCXRyYW5zX3N1cHBvcnQgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5UcmFuc3BvcnRTdXBwb3J0KSk7CisJaWYgKCEodHJhbnNfc3VwcG9ydCAmIFBFUkZPUk1BTlRfTU9ERSkpCisJCXJldHVybjsKKworCWhwc2FfZ2V0X21heF9wZXJmX21vZGVfY21kcyhoKTsKKwloLT5tYXhfc2dfZW50cmllcyA9IDMyOworCS8qIFBlcmZvcm1hbnQgbW9kZSByaW5nIGJ1ZmZlciBhbmQgc3VwcG9ydGluZyBkYXRhIHN0cnVjdHVyZXMgKi8KKwloLT5yZXBseV9wb29sX3NpemUgPSBoLT5tYXhfY29tbWFuZHMgKiBzaXplb2YodTY0KTsKKwloLT5yZXBseV9wb29sID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaC0+cGRldiwgaC0+cmVwbHlfcG9vbF9zaXplLAorCQkJCSYoaC0+cmVwbHlfcG9vbF9kaGFuZGxlKSk7CisKKwkvKiBOZWVkIGEgYmxvY2sgZmV0Y2ggdGFibGUgZm9yIHBlcmZvcm1hbnQgbW9kZSAqLworCWgtPmJsb2NrRmV0Y2hUYWJsZSA9IGttYWxsb2MoKChoLT5tYXhfc2dfZW50cmllcysxKSAqCisJCQkJc2l6ZW9mKHUzMikpLCBHRlBfS0VSTkVMKTsKKworCWlmICgoaC0+cmVwbHlfcG9vbCA9PSBOVUxMKQorCQl8fCAoaC0+YmxvY2tGZXRjaFRhYmxlID09IE5VTEwpKQorCQlnb3RvIGNsZWFuX3VwOworCisJaHBzYV9lbnRlcl9wZXJmb3JtYW50X21vZGUoaCk7CiAKIAkvKiBDaGFuZ2UgdGhlIGFjY2VzcyBtZXRob2RzIHRvIHRoZSBwZXJmb3JtYW50IGFjY2VzcyBtZXRob2RzICovCiAJaC0+YWNjZXNzID0gU0E1X3BlcmZvcm1hbnRfYWNjZXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuaCBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKaW5kZXggMWJiNTIzMy4uYTIwM2VmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC01Myw3ICs1Myw2IEBACiAJaW50CWN0bHI7CiAJY2hhcglkZXZuYW1lWzhdOwogCWNoYXIgICAgKnByb2R1Y3RfbmFtZTsKLQljaGFyCWZpcm1fdmVyWzRdOyAvKiBGaXJtd2FyZSB2ZXJzaW9uICovCiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJdTMyCWJvYXJkX2lkOwogCXZvaWQgX19pb21lbSAqdmFkZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYV9jbWQuaCBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCmluZGV4IDc4ZGU5YjYuLmY1YzRjM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCkBAIC0xMDAsNiArMTAwLDcgQEAKIC8qIENvbmZpZ3VyYXRpb24gVGFibGUgKi8KICNkZWZpbmUgQ0ZHVEJMX0NoYW5nZVJlcSAgICAgICAgMHgwMDAwMDAwMWwKICNkZWZpbmUgQ0ZHVEJMX0FjY0NtZHMgICAgICAgICAgMHgwMDAwMDAwMWwKKyNkZWZpbmUgRE9PUkJFTExfQ1RMUl9SRVNFVAkweDAwMDAwMDA0bAogCiAjZGVmaW5lIENGR1RCTF9UcmFuc19TaW1wbGUgICAgIDB4MDAwMDAwMDJsCiAjZGVmaW5lIENGR1RCTF9UcmFuc19QZXJmb3JtYW50IDB4MDAwMDAwMDRsCkBAIC0zMzksNiArMzQwLDkgQEAKIAl1MzIJCU1heFBoeXNpY2FsRGV2aWNlczsKIAl1MzIJCU1heFBoeXNpY2FsRHJpdmVzUGVyTG9naWNhbFVuaXQ7CiAJdTMyCQlNYXhQZXJmb3JtYW50TW9kZUNvbW1hbmRzOworCXU4CQlyZXNlcnZlZFsweDc4IC0gMHg1OF07CisJdTMyCQltaXNjX2Z3X3N1cHBvcnQ7IC8qIG9mZnNldCAweDc4ICovCisjZGVmaW5lCQkJTUlTQ19GV19ET09SQkVMTF9SRVNFVCAoMHgwMikKIH07CiAKICNkZWZpbmUgTlVNX0JMT0NLRkVUQ0hfRU5UUklFUyA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHB0aW9wLmMgYi9kcml2ZXJzL3Njc2kvaHB0aW9wLmMKaW5kZXggNjQ1ZjdjZC4uMDcyOWYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwdGlvcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ocHRpb3AuYwpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIGRpc2FibGVfcGNpX2RldmljZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKIAotCWRwcmludGsoInNjc2klZDogaHB0aW9wX3Byb2JlIGZhaWxcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWRwcmludGsoInNjc2klZDogaHB0aW9wX3Byb2JlIGZhaWxcbiIsIGhvc3QgPyBob3N0LT5ob3N0X25vIDogMCk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYwppbmRleCBmZWY0OTUyLi5iZDk2Y2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCkBAIC01MDQsMTIgKzUwNCwyMyBAQAogCQlpZiAodmhvc3QtPmFjdGlvbiA9PSBJQk1WRkNfSE9TVF9BQ1RJT05fQUxMT0NfVEdUUykKIAkJCXZob3N0LT5hY3Rpb24gPSBhY3Rpb247CiAJCWJyZWFrOwotCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX0xPR086CiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fSU5JVDoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfREVMOgorCQlzd2l0Y2ggKHZob3N0LT5hY3Rpb24pIHsKKwkJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fUkVTRVQ6CisJCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1JFRU5BQkxFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2aG9zdC0+YWN0aW9uID0gYWN0aW9uOworCQkJYnJlYWs7CisJCX07CisJCWJyZWFrOworCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX0xPR086CiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fUVVFUllfVEdUUzoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfREVMX0ZBSUxFRDoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9OT05FOgorCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1JFU0VUOgorCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1JFRU5BQkxFOgogCWRlZmF1bHQ6CiAJCXZob3N0LT5hY3Rpb24gPSBhY3Rpb247CiAJCWJyZWFrOwpAQCAtNjQxLDcgKzY1Miw3IEBACiAgKiovCiBzdGF0aWMgdm9pZCBpYm12ZmNfcmVsZWFzZV9jcnFfcXVldWUoc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCkKIHsKLQlsb25nIHJjOworCWxvbmcgcmMgPSAwOwogCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2Rldih2aG9zdC0+ZGV2KTsKIAlzdHJ1Y3QgaWJtdmZjX2NycV9xdWV1ZSAqY3JxID0gJnZob3N0LT5jcnE7CiAKQEAgLTY0OSw2ICs2NjAsOCBAQAogCWZyZWVfaXJxKHZkZXYtPmlycSwgdmhvc3QpOwogCXRhc2tsZXRfa2lsbCgmdmhvc3QtPnRhc2tsZXQpOwogCWRvIHsKKwkJaWYgKHJjKQorCQkJbXNsZWVwKDEwMCk7CiAJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9DUlEsIHZkZXYtPnVuaXRfYWRkcmVzcyk7CiAJfSB3aGlsZSAocmMgPT0gSF9CVVNZIHx8IEhfSVNfTE9OR19CVVNZKHJjKSk7CiAKQEAgLTY2NywxMSArNjgwLDEzIEBACiAgKiovCiBzdGF0aWMgaW50IGlibXZmY19yZWVuYWJsZV9jcnFfcXVldWUoc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCkKIHsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYodmhvc3QtPmRldik7CiAKIAkvKiBSZS1lbmFibGUgdGhlIENSUSAqLwogCWRvIHsKKwkJaWYgKHJjKQorCQkJbXNsZWVwKDEwMCk7CiAJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfRU5BQkxFX0NSUSwgdmRldi0+dW5pdF9hZGRyZXNzKTsKIAl9IHdoaWxlIChyYyA9PSBIX0lOX1BST0dSRVNTIHx8IHJjID09IEhfQlVTWSB8fCBIX0lTX0xPTkdfQlVTWShyYykpOwogCkBAIC02OTAsMTUgKzcwNSwxOSBAQAogICoqLwogc3RhdGljIGludCBpYm12ZmNfcmVzZXRfY3JxKHN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QpCiB7Ci0JaW50IHJjOworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYodmhvc3QtPmRldik7CiAJc3RydWN0IGlibXZmY19jcnFfcXVldWUgKmNycSA9ICZ2aG9zdC0+Y3JxOwogCiAJLyogQ2xvc2UgdGhlIENSUSAqLwogCWRvIHsKKwkJaWYgKHJjKQorCQkJbXNsZWVwKDEwMCk7CiAJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9DUlEsIHZkZXYtPnVuaXRfYWRkcmVzcyk7CiAJfSB3aGlsZSAocmMgPT0gSF9CVVNZIHx8IEhfSVNfTE9OR19CVVNZKHJjKSk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJdmhvc3QtPnN0YXRlID0gSUJNVkZDX05PX0NSUTsKIAl2aG9zdC0+bG9nZ2VkX2luID0gMDsKIAlpYm12ZmNfc2V0X2hvc3RfYWN0aW9uKHZob3N0LCBJQk1WRkNfSE9TVF9BQ1RJT05fTk9ORSk7CkBAIC03MTYsNiArNzM1LDcgQEAKIAkJZGV2X3dhcm4odmhvc3QtPmRldiwgIlBhcnRuZXIgYWRhcHRlciBub3QgcmVhZHlcbiIpOwogCWVsc2UgaWYgKHJjICE9IDApCiAJCWRldl93YXJuKHZob3N0LT5kZXYsICJDb3VsZG4ndCByZWdpc3RlciBjcnEgKHJjPSVkKVxuIiwgcmMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODIxLDE3ICs4NDEsOSBAQAogICoqLwogc3RhdGljIHZvaWQgaWJtdmZjX2hhcmRfcmVzZXRfaG9zdChzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0KQogewotCWludCByYzsKLQotCXNjc2lfYmxvY2tfcmVxdWVzdHModmhvc3QtPmhvc3QpOwogCWlibXZmY19wdXJnZV9yZXF1ZXN0cyh2aG9zdCwgRElEX0VSUk9SKTsKLQlpZiAoKHJjID0gaWJtdmZjX3Jlc2V0X2NycSh2aG9zdCkpIHx8Ci0JICAgIChyYyA9IGlibXZmY19zZW5kX2NycV9pbml0KHZob3N0KSkgfHwKLQkgICAgKHJjID0gdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHRvX3Zpb19kZXYodmhvc3QtPmRldikpKSkgewotCQlkZXZfZXJyKHZob3N0LT5kZXYsICJFcnJvciBhZnRlciByZXNldCByYz0lZFxuIiwgcmMpOwotCQlpYm12ZmNfbGlua19kb3duKHZob3N0LCBJQk1WRkNfTElOS19ERUFEKTsKLQl9IGVsc2UKLQkJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0xJTktfRE9XTik7CisJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0xJTktfRE9XTik7CisJaWJtdmZjX3NldF9ob3N0X2FjdGlvbih2aG9zdCwgSUJNVkZDX0hPU1RfQUNUSU9OX1JFU0VUKTsKIH0KIAogLyoqCkBAIC0yMjk5LDYgKzIzMTEsNyBAQAogCWludCByYyA9IEZBSUxFRDsKIAogCUVOVEVSOworCWZjX2Jsb2NrX3Njc2lfZWgoY21kKTsKIAlpYm12ZmNfd2FpdF93aGlsZV9yZXNldHRpbmcodmhvc3QpOwogCWNhbmNlbF9yYyA9IGlibXZmY19jYW5jZWxfYWxsKHNkZXYsIElCTVZGQ19UTUZfQUJPUlRfVEFTS19TRVQpOwogCWFib3J0X3JjID0gaWJtdmZjX2Fib3J0X3Rhc2tfc2V0KHNkZXYpOwpAQCAtMjMyNSw2ICsyMzM4LDcgQEAKIAlpbnQgcmMgPSBGQUlMRUQ7CiAKIAlFTlRFUjsKKwlmY19ibG9ja19zY3NpX2VoKGNtZCk7CiAJaWJtdmZjX3dhaXRfd2hpbGVfcmVzZXR0aW5nKHZob3N0KTsKIAljYW5jZWxfcmMgPSBpYm12ZmNfY2FuY2VsX2FsbChzZGV2LCBJQk1WRkNfVE1GX0xVTl9SRVNFVCk7CiAJcmVzZXRfcmMgPSBpYm12ZmNfcmVzZXRfZGV2aWNlKHNkZXYsIElCTVZGQ19MVU5fUkVTRVQsICJMVU4iKTsKQEAgLTIzODksNiArMjQwMyw3IEBACiAJdW5zaWduZWQgbG9uZyBjYW5jZWxfcmMgPSAwOwogCiAJRU5URVI7CisJZmNfYmxvY2tfc2NzaV9laChjbWQpOwogCWlibXZmY193YWl0X3doaWxlX3Jlc2V0dGluZyh2aG9zdCk7CiAJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc3RhcmdldCwgJmNhbmNlbF9yYywgaWJtdmZjX2Rldl9jYW5jZWxfYWxsX3Jlc2V0KTsKIAlyZXNldF9yYyA9IGlibXZmY19yZXNldF9kZXZpY2Uoc2RldiwgSUJNVkZDX1RBUkdFVF9SRVNFVCwgInRhcmdldCIpOwpAQCAtMjQxMCw2ICsyNDI1LDcgQEAKIAlpbnQgcmM7CiAJc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCisJZmNfYmxvY2tfc2NzaV9laChjbWQpOwogCWRldl9lcnIodmhvc3QtPmRldiwgIlJlc2V0dGluZyBjb25uZWN0aW9uIGR1ZSB0byBlcnJvciByZWNvdmVyeVxuIik7CiAJcmMgPSBpYm12ZmNfaXNzdWVfZmNfaG9zdF9saXAodmhvc3QtPmhvc3QpOwogCXJldHVybiByYyA/IEZBSUxFRCA6IFNVQ0NFU1M7CkBAIC0yNjA2LDIyICsyNjIyLDEzIEBACiAJCQlkZXZfaW5mbyh2aG9zdC0+ZGV2LCAiUmUtZW5hYmxpbmcgYWRhcHRlclxuIik7CiAJCQl2aG9zdC0+Y2xpZW50X21pZ3JhdGVkID0gMTsKIAkJCWlibXZmY19wdXJnZV9yZXF1ZXN0cyh2aG9zdCwgRElEX1JFUVVFVUUpOwotCQkJaWYgKChyYyA9IGlibXZmY19yZWVuYWJsZV9jcnFfcXVldWUodmhvc3QpKSB8fAotCQkJICAgIChyYyA9IGlibXZmY19zZW5kX2NycV9pbml0KHZob3N0KSkpIHsKLQkJCQlpYm12ZmNfbGlua19kb3duKHZob3N0LCBJQk1WRkNfTElOS19ERUFEKTsKLQkJCQlkZXZfZXJyKHZob3N0LT5kZXYsICJFcnJvciBhZnRlciBlbmFibGUgKHJjPSVsZClcbiIsIHJjKTsKLQkJCX0gZWxzZQotCQkJCWlibXZmY19saW5rX2Rvd24odmhvc3QsIElCTVZGQ19MSU5LX0RPV04pOworCQkJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0xJTktfRE9XTik7CisJCQlpYm12ZmNfc2V0X2hvc3RfYWN0aW9uKHZob3N0LCBJQk1WRkNfSE9TVF9BQ1RJT05fUkVFTkFCTEUpOwogCQl9IGVsc2UgewogCQkJZGV2X2Vycih2aG9zdC0+ZGV2LCAiVmlydHVhbCBhZGFwdGVyIGZhaWxlZCAocmM9JWQpXG4iLCBjcnEtPmZvcm1hdCk7Ci0KIAkJCWlibXZmY19wdXJnZV9yZXF1ZXN0cyh2aG9zdCwgRElEX0VSUk9SKTsKLQkJCWlmICgocmMgPSBpYm12ZmNfcmVzZXRfY3JxKHZob3N0KSkgfHwKLQkJCSAgICAocmMgPSBpYm12ZmNfc2VuZF9jcnFfaW5pdCh2aG9zdCkpKSB7Ci0JCQkJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0xJTktfREVBRCk7Ci0JCQkJZGV2X2Vycih2aG9zdC0+ZGV2LCAiRXJyb3IgYWZ0ZXIgcmVzZXQgKHJjPSVsZClcbiIsIHJjKTsKLQkJCX0gZWxzZQotCQkJCWlibXZmY19saW5rX2Rvd24odmhvc3QsIElCTVZGQ19MSU5LX0RPV04pOworCQkJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0xJTktfRE9XTik7CisJCQlpYm12ZmNfc2V0X2hvc3RfYWN0aW9uKHZob3N0LCBJQk1WRkNfSE9TVF9BQ1RJT05fUkVTRVQpOwogCQl9CiAJCXJldHVybjsKIAljYXNlIElCTVZGQ19DUlFfQ01EX1JTUDoKQEAgLTQxMjMsNiArNDEzMCw4IEBACiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0RFTDoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfREVMX0ZBSUxFRDoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9RVUVSWToKKwljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9SRVNFVDoKKwljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9SRUVOQUJMRToKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9OwpAQCAtNDIyMCw2ICs0MjI5LDcgQEAKIAlzdHJ1Y3QgaWJtdmZjX3RhcmdldCAqdGd0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKKwlpbnQgcmM7CiAKIAlpYm12ZmNfbG9nX2FlKHZob3N0LCB2aG9zdC0+ZXZlbnRzX3RvX2xvZyk7CiAJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpAQCAtNDIyOSw2ICs0MjM5LDI3IEBACiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fTE9HT19XQUlUOgogCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX0lOSVRfV0FJVDoKIAkJYnJlYWs7CisJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fUkVTRVQ6CisJCXZob3N0LT5hY3Rpb24gPSBJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0RFTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJjID0gaWJtdmZjX3Jlc2V0X2NycSh2aG9zdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKHJjIHx8IChyYyA9IGlibXZmY19zZW5kX2NycV9pbml0KHZob3N0KSkgfHwKKwkJICAgIChyYyA9IHZpb19lbmFibGVfaW50ZXJydXB0cyh0b192aW9fZGV2KHZob3N0LT5kZXYpKSkpIHsKKwkJCWlibXZmY19saW5rX2Rvd24odmhvc3QsIElCTVZGQ19MSU5LX0RFQUQpOworCQkJZGV2X2Vycih2aG9zdC0+ZGV2LCAiRXJyb3IgYWZ0ZXIgcmVzZXQgKHJjPSVkKVxuIiwgcmMpOworCQl9CisJCWJyZWFrOworCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1JFRU5BQkxFOgorCQl2aG9zdC0+YWN0aW9uID0gSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9ERUw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyYyA9IGlibXZmY19yZWVuYWJsZV9jcnFfcXVldWUodmhvc3QpOworCQlzcGluX2xvY2tfaXJxc2F2ZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmIChyYyB8fCAocmMgPSBpYm12ZmNfc2VuZF9jcnFfaW5pdCh2aG9zdCkpKSB7CisJCQlpYm12ZmNfbGlua19kb3duKHZob3N0LCBJQk1WRkNfTElOS19ERUFEKTsKKwkJCWRldl9lcnIodmhvc3QtPmRldiwgIkVycm9yIGFmdGVyIGVuYWJsZSAocmM9JWQpXG4iLCByYyk7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fTE9HTzoKIAkJdmhvc3QtPmpvYl9zdGVwKHZob3N0KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmggYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmgKaW5kZXggN2U5NzQyNy4uZDdlOGRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaApAQCAtMjksOCArMjksOCBAQAogI2luY2x1ZGUgInZpb3NycC5oIgogCiAjZGVmaW5lIElCTVZGQ19OQU1FCSJpYm12ZmMiCi0jZGVmaW5lIElCTVZGQ19EUklWRVJfVkVSU0lPTgkJIjEuMC43IgotI2RlZmluZSBJQk1WRkNfRFJJVkVSX0RBVEUJCSIoT2N0b2JlciAxNiwgMjAwOSkiCisjZGVmaW5lIElCTVZGQ19EUklWRVJfVkVSU0lPTgkJIjEuMC44IgorI2RlZmluZSBJQk1WRkNfRFJJVkVSX0RBVEUJCSIoSnVuZSAxNywgMjAxMCkiCiAKICNkZWZpbmUgSUJNVkZDX0RFRkFVTFRfVElNRU9VVAk2MAogI2RlZmluZSBJQk1WRkNfQURJU0NfQ0FOQ0VMX1RJTUVPVVQJNDUKQEAgLTY0OSw2ICs2NDksOCBAQAogCiBlbnVtIGlibXZmY19ob3N0X2FjdGlvbiB7CiAJSUJNVkZDX0hPU1RfQUNUSU9OX05PTkUgPSAwLAorCUlCTVZGQ19IT1NUX0FDVElPTl9SRVNFVCwKKwlJQk1WRkNfSE9TVF9BQ1RJT05fUkVFTkFCTEUsCiAJSUJNVkZDX0hPU1RfQUNUSU9OX0xPR08sCiAJSUJNVkZDX0hPU1RfQUNUSU9OX0xPR09fV0FJVCwKIAlJQk1WRkNfSE9TVF9BQ1RJT05fSU5JVCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKaW5kZXggYWFkMzVjYy4uNjdmNzhhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vdmlvLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CkBAIC0xMDEsNyArMTAyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqaWJtdnNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlOwogCi0jZGVmaW5lIElCTVZTQ1NJX1ZFUlNJT04gIjEuNS44IgorI2RlZmluZSBJQk1WU0NTSV9WRVJTSU9OICIxLjUuOSIKIAogc3RhdGljIHN0cnVjdCBpYm12c2NzaV9vcHMgKmlibXZzY3NpX29wczsKIApAQCAtNDczLDIzICs0NzQsMjYgQEAKICAqLwogc3RhdGljIHZvaWQgcHVyZ2VfcmVxdWVzdHMoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsIGludCBlcnJvcl9jb2RlKQogewotCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICp0bXBfZXZ0LCAqcG9zOworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wX2V2dCwgcG9zLCAmaG9zdGRhdGEtPnNlbnQsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJnRtcF9ldnQtPmxpc3QpOwotCQlkZWxfdGltZXIoJnRtcF9ldnQtPnRpbWVyKTsKLQkJaWYgKHRtcF9ldnQtPmNtbmQpIHsKLQkJCXRtcF9ldnQtPmNtbmQtPnJlc3VsdCA9IChlcnJvcl9jb2RlIDw8IDE2KTsKLQkJCXVubWFwX2NtZF9kYXRhKCZ0bXBfZXZ0LT5pdS5zcnAuY21kLAotCQkJCSAgICAgICB0bXBfZXZ0LAotCQkJCSAgICAgICB0bXBfZXZ0LT5ob3N0ZGF0YS0+ZGV2KTsKLQkJCWlmICh0bXBfZXZ0LT5jbW5kX2RvbmUpCi0JCQkJdG1wX2V2dC0+Y21uZF9kb25lKHRtcF9ldnQtPmNtbmQpOwotCQl9IGVsc2UgaWYgKHRtcF9ldnQtPmRvbmUpCi0JCQl0bXBfZXZ0LT5kb25lKHRtcF9ldnQpOwotCQlmcmVlX2V2ZW50X3N0cnVjdCgmdG1wX2V2dC0+aG9zdGRhdGEtPnBvb2wsIHRtcF9ldnQpOworCXdoaWxlICghbGlzdF9lbXB0eSgmaG9zdGRhdGEtPnNlbnQpKSB7CisJCWV2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmhvc3RkYXRhLT5zZW50LCBzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCwgbGlzdCk7CisJCWxpc3RfZGVsKCZldnQtPmxpc3QpOworCQlkZWxfdGltZXIoJmV2dC0+dGltZXIpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlpZiAoZXZ0LT5jbW5kKSB7CisJCQlldnQtPmNtbmQtPnJlc3VsdCA9IChlcnJvcl9jb2RlIDw8IDE2KTsKKwkJCXVubWFwX2NtZF9kYXRhKCZldnQtPml1LnNycC5jbWQsIGV2dCwKKwkJCQkgICAgICAgZXZ0LT5ob3N0ZGF0YS0+ZGV2KTsKKwkJCWlmIChldnQtPmNtbmRfZG9uZSkKKwkJCQlldnQtPmNtbmRfZG9uZShldnQtPmNtbmQpOworCQl9IGVsc2UgaWYgKGV2dC0+ZG9uZSkKKwkJCWV2dC0+ZG9uZShldnQpOworCQlmcmVlX2V2ZW50X3N0cnVjdCgmZXZ0LT5ob3N0ZGF0YS0+cG9vbCwgZXZ0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIH0KQEAgLTUwNCwxNCArNTA4LDggQEAKIAlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgMCk7CiAKIAlwdXJnZV9yZXF1ZXN0cyhob3N0ZGF0YSwgRElEX0VSUk9SKTsKLQlpZiAoKGlibXZzY3NpX29wcy0+cmVzZXRfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhKSkgfHwKLQkgICAgKGlibXZzY3NpX29wcy0+c2VuZF9jcnEoaG9zdGRhdGEsIDB4QzAwMTAwMDAwMDAwMDAwMExMLCAwKSkgfHwKLQkgICAgKHZpb19lbmFibGVfaW50ZXJydXB0cyh0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpKSkpIHsKLQkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsIC0xKTsKLQkJZGV2X2Vycihob3N0ZGF0YS0+ZGV2LCAiZXJyb3IgYWZ0ZXIgcmVzZXRcbiIpOwotCX0KLQotCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhob3N0ZGF0YS0+aG9zdCk7CisJaG9zdGRhdGEtPnJlc2V0X2NycSA9IDE7CisJd2FrZV91cCgmaG9zdGRhdGEtPndvcmtfd2FpdF9xKTsKIH0KIAogLyoqCkBAIC01NTAsNiArNTQ4LDcgQEAKIAl1NjQgKmNycV9hc191NjQgPSAodTY0ICopICZldnRfc3RydWN0LT5jcnE7CiAJaW50IHJlcXVlc3Rfc3RhdHVzID0gMDsKIAlpbnQgcmM7CisJaW50IHNycF9yZXEgPSAwOwogCiAJLyogSWYgd2UgaGF2ZSBleGhhdXN0ZWQgb3VyIHJlcXVlc3QgbGltaXQsIGp1c3QgZmFpbCB0aGlzIHJlcXVlc3QsCiAJICogdW5sZXNzIGl0IGlzIGZvciBhIHJlc2V0IG9yIGFib3J0LgpAQCAtNTU4LDYgKzU1Nyw3IEBACiAJICogY2FuIGhhbmRsZSBtb3JlIHJlcXVlc3RzIChjYW5fcXVldWUpIHdoZW4gd2UgYWN0dWFsbHkgY2FuJ3QKIAkgKi8KIAlpZiAoZXZ0X3N0cnVjdC0+Y3JxLmZvcm1hdCA9PSBWSU9TUlBfU1JQX0ZPUk1BVCkgeworCQlzcnBfcmVxID0gMTsKIAkJcmVxdWVzdF9zdGF0dXMgPQogCQkJYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpOwogCQkvKiBJZiByZXF1ZXN0IGxpbWl0IHdhcyAtMSB3aGVuIHdlIHN0YXJ0ZWQsIGl0IGlzIG5vdyBldmVuCkBAIC02MzIsNyArNjMyLDggQEAKIAkJCWdvdG8gc2VuZF9idXN5OwogCQl9CiAJCWRldl9lcnIoaG9zdGRhdGEtPmRldiwgInNlbmQgZXJyb3IgJWRcbiIsIHJjKTsKLQkJYXRvbWljX2luYygmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpOworCQlpZiAoc3JwX3JlcSkKKwkJCWF0b21pY19pbmMoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KTsKIAkJZ290byBzZW5kX2Vycm9yOwogCX0KIApAQCAtNjQyLDcgKzY0Myw3IEBACiAJdW5tYXBfY21kX2RhdGEoJmV2dF9zdHJ1Y3QtPml1LnNycC5jbWQsIGV2dF9zdHJ1Y3QsIGhvc3RkYXRhLT5kZXYpOwogCiAJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKLQlpZiAocmVxdWVzdF9zdGF0dXMgIT0gLTEpCisJaWYgKHNycF9yZXEgJiYgcmVxdWVzdF9zdGF0dXMgIT0gLTEpCiAJCWF0b21pY19pbmMoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KTsKIAlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIApAQCAtMTQ2MiwzMCArMTQ2MywxNCBAQAogCQkJLyogV2UgbmVlZCB0byByZS1zZXR1cCB0aGUgaW50ZXJwYXJ0aXRpb24gY29ubmVjdGlvbiAqLwogCQkJZGV2X2luZm8oaG9zdGRhdGEtPmRldiwgIlJlLWVuYWJsaW5nIGFkYXB0ZXIhXG4iKTsKIAkJCWhvc3RkYXRhLT5jbGllbnRfbWlncmF0ZWQgPSAxOworCQkJaG9zdGRhdGEtPnJlZW5hYmxlX2NycSA9IDE7CiAJCQlwdXJnZV9yZXF1ZXN0cyhob3N0ZGF0YSwgRElEX1JFUVVFVUUpOwotCQkJaWYgKChpYm12c2NzaV9vcHMtPnJlZW5hYmxlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLAotCQkJCQkJCSAgICAgIGhvc3RkYXRhKSkgfHwKLQkJCSAgICAoaWJtdnNjc2lfb3BzLT5zZW5kX2NycShob3N0ZGF0YSwKLQkJCQkJCSAgICAweEMwMDEwMDAwMDAwMDAwMDBMTCwgMCkpKSB7Ci0JCQkJCWF0b21pY19zZXQoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0LAotCQkJCQkJICAgLTEpOwotCQkJCQlkZXZfZXJyKGhvc3RkYXRhLT5kZXYsICJlcnJvciBhZnRlciBlbmFibGVcbiIpOwotCQkJfQorCQkJd2FrZV91cCgmaG9zdGRhdGEtPndvcmtfd2FpdF9xKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoaG9zdGRhdGEtPmRldiwgIlZpcnR1YWwgYWRhcHRlciBmYWlsZWQgcmMgJWQhXG4iLAogCQkJCWNycS0+Zm9ybWF0KTsKLQotCQkJcHVyZ2VfcmVxdWVzdHMoaG9zdGRhdGEsIERJRF9FUlJPUik7Ci0JCQlpZiAoKGlibXZzY3NpX29wcy0+cmVzZXRfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsCi0JCQkJCQkJICAgaG9zdGRhdGEpKSB8fAotCQkJICAgIChpYm12c2NzaV9vcHMtPnNlbmRfY3JxKGhvc3RkYXRhLAotCQkJCQkJICAgIDB4QzAwMTAwMDAwMDAwMDAwMExMLCAwKSkpIHsKLQkJCQkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsCi0JCQkJCQkgICAtMSk7Ci0JCQkJCWRldl9lcnIoaG9zdGRhdGEtPmRldiwgImVycm9yIGFmdGVyIHJlc2V0XG4iKTsKLQkJCX0KKwkJCWlibXZzY3NpX3Jlc2V0X2hvc3QoaG9zdGRhdGEpOwogCQl9Ci0JCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhob3N0ZGF0YS0+aG9zdCk7CiAJCXJldHVybjsKIAljYXNlIDB4ODA6CQkvKiByZWFsIHBheWxvYWQgKi8KIAkJYnJlYWs7CkBAIC0xODUwLDYgKzE4MzUsNzUgQEAKIAlyZXR1cm4gZGVzaXJlZF9pbzsKIH0KIAorc3RhdGljIHZvaWQgaWJtdnNjc2lfZG9fd29yayhzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKK3sKKwlpbnQgcmM7CisJY2hhciAqYWN0aW9uID0gInJlc2V0IjsKKworCWlmIChob3N0ZGF0YS0+cmVzZXRfY3JxKSB7CisJCXNtcF9ybWIoKTsKKwkJaG9zdGRhdGEtPnJlc2V0X2NycSA9IDA7CisKKwkJcmMgPSBpYm12c2NzaV9vcHMtPnJlc2V0X2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSk7CisJCWlmICghcmMpCisJCQlyYyA9IGlibXZzY3NpX29wcy0+c2VuZF9jcnEoaG9zdGRhdGEsIDB4QzAwMTAwMDAwMDAwMDAwMExMLCAwKTsKKwkJaWYgKCFyYykKKwkJCXJjID0gdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldikpOworCX0gZWxzZSBpZiAoaG9zdGRhdGEtPnJlZW5hYmxlX2NycSkgeworCQlzbXBfcm1iKCk7CisJCWFjdGlvbiA9ICJlbmFibGUiOworCQlyYyA9IGlibXZzY3NpX29wcy0+cmVlbmFibGVfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhKTsKKwkJaG9zdGRhdGEtPnJlZW5hYmxlX2NycSA9IDA7CisJCWlmICghcmMpCisJCQlyYyA9IGlibXZzY3NpX29wcy0+c2VuZF9jcnEoaG9zdGRhdGEsIDB4QzAwMTAwMDAwMDAwMDAwMExMLCAwKTsKKwl9IGVsc2UKKwkJcmV0dXJuOworCisJaWYgKHJjKSB7CisJCWF0b21pY19zZXQoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0LCAtMSk7CisJCWRldl9lcnIoaG9zdGRhdGEtPmRldiwgImVycm9yIGFmdGVyICVzXG4iLCBhY3Rpb24pOworCX0KKworCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhob3N0ZGF0YS0+aG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgaWJtdnNjc2lfd29ya190b19kbyhzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKK3sKKwlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChob3N0ZGF0YS0+cmVzZXRfY3JxKSB7CisJCXNtcF9ybWIoKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChob3N0ZGF0YS0+cmVlbmFibGVfY3JxKSB7CisJCXNtcF9ybWIoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWJtdnNjc2lfd29yayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0gZGF0YTsKKwlpbnQgcmM7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShob3N0ZGF0YS0+d29ya193YWl0X3EsCisJCQkJCSAgICAgIGlibXZzY3NpX3dvcmtfdG9fZG8oaG9zdGRhdGEpKTsKKworCQlCVUdfT04ocmMpOworCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQlpYm12c2NzaV9kb193b3JrKGhvc3RkYXRhKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBDYWxsZWQgYnkgYnVzIGNvZGUgZm9yIGVhY2ggYWRhcHRlcgogICovCkBAIC0xODc1LDYgKzE5MjksNyBAQAogCWhvc3RkYXRhID0gc2hvc3RfcHJpdihob3N0KTsKIAltZW1zZXQoaG9zdGRhdGEsIDB4MDAsIHNpemVvZigqaG9zdGRhdGEpKTsKIAlJTklUX0xJU1RfSEVBRCgmaG9zdGRhdGEtPnNlbnQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhvc3RkYXRhLT53b3JrX3dhaXRfcSk7CiAJaG9zdGRhdGEtPmhvc3QgPSBob3N0OwogCWhvc3RkYXRhLT5kZXYgPSBkZXY7CiAJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsIC0xKTsKQEAgLTE4ODUsMTAgKzE5NDAsMTkgQEAKIAkJZ290byBwZXJzaXN0X2J1ZnNfZmFpbGVkOwogCX0KIAorCWhvc3RkYXRhLT53b3JrX3RocmVhZCA9IGt0aHJlYWRfcnVuKGlibXZzY3NpX3dvcmssIGhvc3RkYXRhLCAiJXNfJWQiLAorCQkJCQkgICAgImlibXZzY3NpIiwgaG9zdC0+aG9zdF9ubyk7CisKKwlpZiAoSVNfRVJSKGhvc3RkYXRhLT53b3JrX3RocmVhZCkpIHsKKwkJZGV2X2VycigmdmRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdGlhbGl6ZSBrdGhyZWFkLiByYz0lbGRcbiIsCisJCQlQVFJfRVJSKGhvc3RkYXRhLT53b3JrX3RocmVhZCkpOworCQlnb3RvIGluaXRfY3JxX2ZhaWxlZDsKKwl9CisKIAlyYyA9IGlibXZzY3NpX29wcy0+aW5pdF9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9ldmVudHMpOwogCWlmIChyYyAhPSAwICYmIHJjICE9IEhfUkVTT1VSQ0UpIHsKIAkJZGV2X2VycigmdmRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdGlhbGl6ZSBjcnEuIHJjPSVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9jcnFfZmFpbGVkOworCQlnb3RvIGtpbGxfa3RocmVhZDsKIAl9CiAJaWYgKGluaXRpYWxpemVfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIG1heF9ldmVudHMsIGhvc3RkYXRhKSAhPSAwKSB7CiAJCWRldl9lcnIoJnZkZXYtPmRldiwgImNvdWxkbid0IGluaXRpYWxpemUgZXZlbnQgcG9vbFxuIik7CkBAIC0xOTQ0LDYgKzIwMDgsOCBAQAogCXJlbGVhc2VfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIGhvc3RkYXRhKTsKICAgICAgIGluaXRfcG9vbF9mYWlsZWQ6CiAJaWJtdnNjc2lfb3BzLT5yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwgbWF4X2V2ZW50cyk7CisgICAgICBraWxsX2t0aHJlYWQ6CisgICAgICBrdGhyZWFkX3N0b3AoaG9zdGRhdGEtPndvcmtfdGhyZWFkKTsKICAgICAgIGluaXRfY3JxX2ZhaWxlZDoKIAl1bm1hcF9wZXJzaXN0X2J1ZnMoaG9zdGRhdGEpOwogICAgICAgcGVyc2lzdF9idWZzX2ZhaWxlZDoKQEAgLTE5NjAsNiArMjAyNiw3IEBACiAJaWJtdnNjc2lfb3BzLT5yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwKIAkJCQkJbWF4X2V2ZW50cyk7CiAKKwlrdGhyZWFkX3N0b3AoaG9zdGRhdGEtPndvcmtfdGhyZWFkKTsKIAlzcnBfcmVtb3ZlX2hvc3QoaG9zdGRhdGEtPmhvc3QpOwogCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdGRhdGEtPmhvc3QpOwogCXNjc2lfaG9zdF9wdXQoaG9zdGRhdGEtPmhvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmggYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaAppbmRleCA5Y2I3YzZhLi4wMjE5N2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaApAQCAtOTEsMTIgKzkxLDE2IEBACiBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhIHsKIAlhdG9taWNfdCByZXF1ZXN0X2xpbWl0OwogCWludCBjbGllbnRfbWlncmF0ZWQ7CisJaW50IHJlc2V0X2NycTsKKwlpbnQgcmVlbmFibGVfY3JxOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZXZlbnRfcG9vbCBwb29sOwogCXN0cnVjdCBjcnFfcXVldWUgcXVldWU7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHNycF90YXNrOwogCXN0cnVjdCBsaXN0X2hlYWQgc2VudDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqd29ya190aHJlYWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd29ya193YWl0X3E7CiAJc3RydWN0IG1hZF9hZGFwdGVyX2luZm9fZGF0YSBtYWRhcHRlcl9pbmZvOwogCXN0cnVjdCBjYXBhYmlsaXRpZXMgY2FwczsKIAlkbWFfYWRkcl90IGNhcHNfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzdGd0LmMKaW5kZXggZTIwNTZkNS4uMjI1NmJhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzdGd0LmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzdGd0LmMKQEAgLTk1Niw3ICs5NTYsNyBAQAogCS5pdF9uZXh1c19yZXNwb25zZSA9IGlibXZzdGd0X2l0X25leHVzX3Jlc3BvbnNlLAogfTsKIAotc3RhdGljIGludCBpYm12c3RndF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpYm12c3RndF9pbml0KHZvaWQpCiB7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKQEAgLTk4Nyw3ICs5ODcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGlibXZzdGd0X2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBpYm12c3RndF9leGl0KHZvaWQpCiB7CiAJcHJpbnRrKCJVbnJlZ2lzdGVyIElCTSB2aXJ0dWFsIFNDU0kgZHJpdmVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL3JwYV92c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL3JwYV92c2NzaS5jCmluZGV4IGE4NjRjY2MuLmY0OGFlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9ycGFfdnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvcnBhX3ZzY3NpLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC03MSwxMSArNzIsMTMgQEAKIAkJCQkgICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsCiAJCQkJICAgICAgIGludCBtYXhfcmVxdWVzdHMpCiB7Ci0JbG9uZyByYzsKKwlsb25nIHJjID0gMDsKIAlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldik7CiAJZnJlZV9pcnEodmRldi0+aXJxLCAodm9pZCAqKWhvc3RkYXRhKTsKIAl0YXNrbGV0X2tpbGwoJmhvc3RkYXRhLT5zcnBfdGFzayk7CiAJZG8geworCQlpZiAocmMpCisJCQltc2xlZXAoMTAwKTsKIAkJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9GUkVFX0NSUSwgdmRldi0+dW5pdF9hZGRyZXNzKTsKIAl9IHdoaWxlICgocmMgPT0gSF9CVVNZKSB8fCAoSF9JU19MT05HX0JVU1kocmMpKSk7CiAJZG1hX3VubWFwX3NpbmdsZShob3N0ZGF0YS0+ZGV2LApAQCAtMjAwLDExICsyMDMsMTMgQEAKIHN0YXRpYyBpbnQgcnBhdnNjc2lfcmVzZXRfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAogCQkJCSAgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKIHsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldik7CiAKIAkvKiBDbG9zZSB0aGUgQ1JRICovCiAJZG8geworCQlpZiAocmMpCisJCQltc2xlZXAoMTAwKTsKIAkJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9GUkVFX0NSUSwgdmRldi0+dW5pdF9hZGRyZXNzKTsKIAl9IHdoaWxlICgocmMgPT0gSF9CVVNZKSB8fCAoSF9JU19MT05HX0JVU1kocmMpKSk7CiAKQEAgLTI3Nyw2ICsyODIsMTIgQEAKIAkJZ290byByZWdfY3JxX2ZhaWxlZDsKIAl9CiAKKwlxdWV1ZS0+Y3VyID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOworCisJdGFza2xldF9pbml0KCZob3N0ZGF0YS0+c3JwX3Rhc2ssICh2b2lkICopcnBhdnNjc2lfdGFzaywKKwkJICAgICAodW5zaWduZWQgbG9uZylob3N0ZGF0YSk7CisKIAlpZiAocmVxdWVzdF9pcnEodmRldi0+aXJxLAogCQkJcnBhdnNjc2lfaGFuZGxlX2V2ZW50LAogCQkJMCwgImlibXZzY3NpIiwgKHZvaWQgKilob3N0ZGF0YSkgIT0gMCkgewpAQCAtMjkxLDE2ICszMDIsMTQgQEAKIAkJZ290byByZXFfaXJxX2ZhaWxlZDsKIAl9CiAKLQlxdWV1ZS0+Y3VyID0gMDsKLQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOwotCi0JdGFza2xldF9pbml0KCZob3N0ZGF0YS0+c3JwX3Rhc2ssICh2b2lkICopcnBhdnNjc2lfdGFzaywKLQkJICAgICAodW5zaWduZWQgbG9uZylob3N0ZGF0YSk7Ci0KIAlyZXR1cm4gcmV0cmM7CiAKICAgICAgIHJlcV9pcnFfZmFpbGVkOgorCXRhc2tsZXRfa2lsbCgmaG9zdGRhdGEtPnNycF90YXNrKTsKKwlyYyA9IDA7CiAJZG8geworCQlpZiAocmMpCisJCQltc2xlZXAoMTAwKTsKIAkJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9GUkVFX0NSUSwgdmRldi0+dW5pdF9hZGRyZXNzKTsKIAl9IHdoaWxlICgocmMgPT0gSF9CVVNZKSB8fCAoSF9JU19MT05HX0JVU1kocmMpKSk7CiAgICAgICByZWdfY3JxX2ZhaWxlZDoKQEAgLTMyMiwxMSArMzMxLDEzIEBACiBzdGF0aWMgaW50IHJwYXZzY3NpX3JlZW5hYmxlX2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKIAkJCQkgICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCiB7Ci0JaW50IHJjOworCWludCByYyA9IDA7CiAJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpOwogCiAJLyogUmUtZW5hYmxlIHRoZSBDUlEgKi8KIAlkbyB7CisJCWlmIChyYykKKwkJCW1zbGVlcCgxMDApOwogCQlyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0VOQUJMRV9DUlEsIHZkZXYtPnVuaXRfYWRkcmVzcyk7CiAJfSB3aGlsZSAoKHJjID09IEhfSU5fUFJPR1JFU1MpIHx8IChyYyA9PSBIX0JVU1kpIHx8IChIX0lTX0xPTkdfQlVTWShyYykpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IDgyZWE0YTguLjUyNTY4NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTE2NywyMSArMTY3LDIyIEBACiAJCQkuY2xyX3Vwcm9jX2ludGVycnVwdF9yZWczMiA9IDB4MDAwMkMsCiAJCQkuaW5pdF9mZWVkYmFja19yZWcgPSAweDAwMDVDLAogCQkJLmR1bXBfYWRkcl9yZWcgPSAweDAwMDY0LAotCQkJLmR1bXBfZGF0YV9yZWcgPSAweDAwMDY4CisJCQkuZHVtcF9kYXRhX3JlZyA9IDB4MDAwNjgsCisJCQkuZW5kaWFuX3N3YXBfcmVnID0gMHgwMDA4NAogCQl9CiAJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXByX2NoaXBfdCBpcHJfY2hpcFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9NWUxFWCwgUENJX0RFVklDRV9JRF9JQk1fR0VNU1RPTkUsIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsICZpcHJfY2hpcF9jZmdbMF0gfSwKLQl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DSVRSSU5FLCBJUFJfVVNFX0xTSSwgSVBSX1NJUzMyLCAmaXByX2NoaXBfY2ZnWzBdIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX09CU0lESUFOLCBJUFJfVVNFX0xTSSwgSVBSX1NJUzMyLCAmaXByX2NoaXBfY2ZnWzBdIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fT0JTSURJQU4sIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsICZpcHJfY2hpcF9jZmdbMF0gfSwKLQl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTl9FLCBJUFJfVVNFX01TSSwgSVBSX1NJUzMyLCAmaXByX2NoaXBfY2ZnWzBdIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fU05JUEUsIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsICZpcHJfY2hpcF9jZmdbMV0gfSwKLQl7IFBDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfU0NBTVAsIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsICZpcHJfY2hpcF9jZmdbMV0gfSwKLQl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DX0ZQR0FfRTIsIElQUl9VU0VfTVNJLCBJUFJfU0lTNjQsICZpcHJfY2hpcF9jZmdbMl0gfSwKLQl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DX0FTSUNfRTIsIElQUl9VU0VfTVNJLCBJUFJfU0lTNjQsICZpcHJfY2hpcF9jZmdbMl0gfQorCXsgUENJX1ZFTkRPUl9JRF9NWUxFWCwgUENJX0RFVklDRV9JRF9JQk1fR0VNU1RPTkUsIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsIElQUl9QQ0lfQ0ZHLCAmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ0lUUklORSwgSVBSX1VTRV9MU0ksIElQUl9TSVMzMiwgSVBSX1BDSV9DRkcsICZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfT0JTSURJQU4sIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsIElQUl9QQ0lfQ0ZHLCAmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fT0JTSURJQU4sIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsIElQUl9QQ0lfQ0ZHLCAmaXByX2NoaXBfY2ZnWzBdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fT0JTSURJQU5fRSwgSVBSX1VTRV9NU0ksIElQUl9TSVMzMiwgSVBSX1BDSV9DRkcsICZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9TTklQRSwgSVBSX1VTRV9MU0ksIElQUl9TSVMzMiwgSVBSX1BDSV9DRkcsICZpcHJfY2hpcF9jZmdbMV0gfSwKKwl7IFBDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfU0NBTVAsIElQUl9VU0VfTFNJLCBJUFJfU0lTMzIsIElQUl9QQ0lfQ0ZHLCAmaXByX2NoaXBfY2ZnWzFdIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ19GUEdBX0UyLCBJUFJfVVNFX01TSSwgSVBSX1NJUzY0LCBJUFJfTU1JTywgJmlwcl9jaGlwX2NmZ1syXSB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NfQVNJQ19FMiwgSVBSX1VTRV9NU0ksIElQUl9TSVM2NCwgSVBSX01NSU8sICZpcHJfY2hpcF9jZmdbMl0gfQogfTsKIAogc3RhdGljIGludCBpcHJfbWF4X2J1c19zcGVlZHMgW10gPSB7CkBAIC0xMTI5LDIwICsxMTMwLDIyIEBACiB9CiAKIC8qKgotICogaXByX2Zvcm1hdF9yZXNvdXJjZV9wYXRoIC0gRm9ybWF0IHRoZSByZXNvdXJjZSBwYXRoIGZvciBwcmludGluZy4KKyAqIGlwcl9mb3JtYXRfcmVzX3BhdGggLSBGb3JtYXQgdGhlIHJlc291cmNlIHBhdGggZm9yIHByaW50aW5nLgogICogQHJlc19wYXRoOglyZXNvdXJjZSBwYXRoCiAgKiBAYnVmOglidWZmZXIKICAqCiAgKiBSZXR1cm4gdmFsdWU6CiAgKiAJcG9pbnRlciB0byBidWZmZXIKICAqKi8KLXN0YXRpYyBjaGFyICppcHJfZm9ybWF0X3Jlc291cmNlX3BhdGgodTggKnJlc19wYXRoLCBjaGFyICpidWZmZXIpCitzdGF0aWMgY2hhciAqaXByX2Zvcm1hdF9yZXNfcGF0aCh1OCAqcmVzX3BhdGgsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKIHsKIAlpbnQgaTsKKwljaGFyICpwID0gYnVmZmVyOwogCi0Jc3ByaW50ZihidWZmZXIsICIlMDJYIiwgcmVzX3BhdGhbMF0pOwotCWZvciAoaT0xOyByZXNfcGF0aFtpXSAhPSAweGZmOyBpKyspCi0JCXNwcmludGYoYnVmZmVyLCAiJXMtJTAyWCIsIGJ1ZmZlciwgcmVzX3BhdGhbaV0pOworCXJlc19wYXRoWzBdID0gJ1wwJzsKKwlwICs9IHNucHJpbnRmKHAsIGJ1ZmZlciArIGxlbiAtIHAsICIlMDJYIiwgcmVzX3BhdGhbMF0pOworCWZvciAoaSA9IDE7IHJlc19wYXRoW2ldICE9IDB4ZmYgJiYgKChpICogMykgPCBsZW4pOyBpKyspCisJCXAgKz0gc25wcmludGYocCwgYnVmZmVyICsgbGVuIC0gcCwgIi0lMDJYIiwgcmVzX3BhdGhbaV0pOwogCiAJcmV0dXJuIGJ1ZmZlcjsKIH0KQEAgLTExNjUsNyArMTE2OCw3IEBACiAJaWYgKHJlcy0+aW9hX2NmZy0+c2lzNjQpIHsKIAkJcmVzLT5mbGFncyA9IGNmZ3Rldy0+dS5jZmd0ZTY0LT5mbGFnczsKIAkJcmVzLT5yZXNfZmxhZ3MgPSBjZmd0ZXctPnUuY2ZndGU2NC0+cmVzX2ZsYWdzOwotCQlyZXMtPnR5cGUgPSBjZmd0ZXctPnUuY2ZndGU2NC0+cmVzX3R5cGUgJiAweDBmOworCQlyZXMtPnR5cGUgPSBjZmd0ZXctPnUuY2ZndGU2NC0+cmVzX3R5cGU7CiAKIAkJbWVtY3B5KCZyZXMtPnN0ZF9pbnFfZGF0YSwgJmNmZ3Rldy0+dS5jZmd0ZTY0LT5zdGRfaW5xX2RhdGEsCiAJCQlzaXplb2Yoc3RydWN0IGlwcl9zdGRfaW5xX2RhdGEpKTsKQEAgLTExODcsNyArMTE5MCw4IEBACiAKIAkJaWYgKHJlcy0+c2RldiAmJiBuZXdfcGF0aCkKIAkJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgcmVzLT5zZGV2LCAiUmVzb3VyY2UgcGF0aDogJXNcbiIsCi0JCQkJICAgIGlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmcmVzLT5yZXNfcGF0aFswXSwgJmJ1ZmZlclswXSkpOworCQkJCSAgICBpcHJfZm9ybWF0X3Jlc19wYXRoKHJlcy0+cmVzX3BhdGgsIGJ1ZmZlciwKKwkJCQkJCQlzaXplb2YoYnVmZmVyKSkpOwogCX0gZWxzZSB7CiAJCXJlcy0+ZmxhZ3MgPSBjZmd0ZXctPnUuY2ZndGUtPmZsYWdzOwogCQlpZiAocmVzLT5mbGFncyAmIElQUl9JU19JT0FfUkVTT1VSQ0UpCkBAIC0xNTczLDcgKzE1NzcsOCBAQAogCQlpcHJfZXJyX3NlcGFyYXRvcjsKIAogCQlpcHJfZXJyKCJEZXZpY2UgJWQgOiAlcyIsIGkgKyAxLAotCQkJIGlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmZGV2X2VudHJ5LT5yZXNfcGF0aFswXSwgJmJ1ZmZlclswXSkpOworCQkJIGlwcl9mb3JtYXRfcmVzX3BhdGgoZGV2X2VudHJ5LT5yZXNfcGF0aCwgYnVmZmVyLAorCQkJCQkgICAgIHNpemVvZihidWZmZXIpKSk7CiAJCWlwcl9sb2dfZXh0X3ZwZCgmZGV2X2VudHJ5LT52cGQpOwogCiAJCWlwcl9lcnIoIi0tLS0tTmV3IERldmljZSBJbmZvcm1hdGlvbi0tLS0tXG4iKTsKQEAgLTE5MTksMTMgKzE5MjQsMTQgQEAKIAogCQkJaXByX2hjYW1fZXJyKGhvc3RyY2IsICIlcyAlczogUmVzb3VyY2UgUGF0aD0lc1xuIiwKIAkJCQkgICAgIHBhdGhfYWN0aXZlX2Rlc2NbaV0uZGVzYywgcGF0aF9zdGF0ZV9kZXNjW2pdLmRlc2MsCi0JCQkJICAgICBpcHJfZm9ybWF0X3Jlc291cmNlX3BhdGgoJmZhYnJpYy0+cmVzX3BhdGhbMF0sICZidWZmZXJbMF0pKTsKKwkJCQkgICAgIGlwcl9mb3JtYXRfcmVzX3BhdGgoZmFicmljLT5yZXNfcGF0aCwgYnVmZmVyLAorCQkJCQkJCSBzaXplb2YoYnVmZmVyKSkpOwogCQkJcmV0dXJuOwogCQl9CiAJfQogCiAJaXByX2VycigiUGF0aCBzdGF0ZT0lMDJYIFJlc291cmNlIFBhdGg9JXNcbiIsIHBhdGhfc3RhdGUsCi0JCWlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmZmFicmljLT5yZXNfcGF0aFswXSwgJmJ1ZmZlclswXSkpOworCQlpcHJfZm9ybWF0X3Jlc19wYXRoKGZhYnJpYy0+cmVzX3BhdGgsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC0yMDY2LDcgKzIwNzIsOCBAQAogCiAJCQlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIiVzICVzOiBSZXNvdXJjZSBQYXRoPSVzLCBMaW5rIHJhdGU9JXMsIFdXTj0lMDhYJTA4WFxuIiwKIAkJCQkgICAgIHBhdGhfc3RhdHVzX2Rlc2Nbal0uZGVzYywgcGF0aF90eXBlX2Rlc2NbaV0uZGVzYywKLQkJCQkgICAgIGlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmY2ZnLT5yZXNfcGF0aFswXSwgJmJ1ZmZlclswXSksCisJCQkJICAgICBpcHJfZm9ybWF0X3Jlc19wYXRoKGNmZy0+cmVzX3BhdGgsIGJ1ZmZlciwKKwkJCQkJCQkgc2l6ZW9mKGJ1ZmZlcikpLAogCQkJCSAgICAgbGlua19yYXRlW2NmZy0+bGlua19yYXRlICYgSVBSX1BIWV9MSU5LX1JBVEVfTUFTS10sCiAJCQkJICAgICBiZTMyX3RvX2NwdShjZmctPnd3aWRbMF0pLCBiZTMyX3RvX2NwdShjZmctPnd3aWRbMV0pKTsKIAkJCXJldHVybjsKQEAgLTIwNzQsNyArMjA4MSw3IEBACiAJfQogCWlwcl9oY2FtX2Vycihob3N0cmNiLCAiUGF0aCBlbGVtZW50PSUwMlg6IFJlc291cmNlIFBhdGg9JXMsIExpbmsgcmF0ZT0lcyAiCiAJCSAgICAgIldXTj0lMDhYJTA4WFxuIiwgY2ZnLT50eXBlX3N0YXR1cywKLQkJICAgICBpcHJfZm9ybWF0X3Jlc291cmNlX3BhdGgoJmNmZy0+cmVzX3BhdGhbMF0sICZidWZmZXJbMF0pLAorCQkgICAgIGlwcl9mb3JtYXRfcmVzX3BhdGgoY2ZnLT5yZXNfcGF0aCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSksCiAJCSAgICAgbGlua19yYXRlW2NmZy0+bGlua19yYXRlICYgSVBSX1BIWV9MSU5LX1JBVEVfTUFTS10sCiAJCSAgICAgYmUzMl90b19jcHUoY2ZnLT53d2lkWzBdKSwgYmUzMl90b19jcHUoY2ZnLT53d2lkWzFdKSk7CiB9CkBAIC0yMTM5LDcgKzIxNDYsNyBAQAogCiAJaXByX2VycigiUkFJRCAlcyBBcnJheSBDb25maWd1cmF0aW9uOiAlc1xuIiwKIAkJZXJyb3ItPnByb3RlY3Rpb25fbGV2ZWwsCi0JCWlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmZXJyb3ItPmxhc3RfcmVzX3BhdGhbMF0sICZidWZmZXJbMF0pKTsKKwkJaXByX2Zvcm1hdF9yZXNfcGF0aChlcnJvci0+bGFzdF9yZXNfcGF0aCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOwogCiAJaXByX2Vycl9zZXBhcmF0b3I7CiAKQEAgLTIxNjAsOSArMjE2NywxMSBAQAogCQlpcHJfZXJyKCJBcnJheSBNZW1iZXIgJWQ6XG4iLCBpKTsKIAkJaXByX2xvZ19leHRfdnBkKCZhcnJheV9lbnRyeS0+dnBkKTsKIAkJaXByX2VycigiQ3VycmVudCBMb2NhdGlvbjogJXMiLAotCQkJIGlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmYXJyYXlfZW50cnktPnJlc19wYXRoWzBdLCAmYnVmZmVyWzBdKSk7CisJCQkgaXByX2Zvcm1hdF9yZXNfcGF0aChhcnJheV9lbnRyeS0+cmVzX3BhdGgsIGJ1ZmZlciwKKwkJCQkJICAgICBzaXplb2YoYnVmZmVyKSkpOwogCQlpcHJfZXJyKCJFeHBlY3RlZCBMb2NhdGlvbjogJXMiLAotCQkJIGlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmYXJyYXlfZW50cnktPmV4cGVjdGVkX3Jlc19wYXRoWzBdLCAmYnVmZmVyWzBdKSk7CisJCQkgaXByX2Zvcm1hdF9yZXNfcGF0aChhcnJheV9lbnRyeS0+ZXhwZWN0ZWRfcmVzX3BhdGgsCisJCQkJCSAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOwogCiAJCWlwcl9lcnJfc2VwYXJhdG9yOwogCX0KQEAgLTM3NTMsNiArMzc2MiwzNiBAQAogCS5zdG9yZSA9IGlwcl9zdG9yZV91cGRhdGVfZncKIH07CiAKKy8qKgorICogaXByX3Nob3dfZndfdHlwZSAtIFNob3cgdGhlIGFkYXB0ZXIncyBmaXJtd2FyZSB0eXBlLgorICogQGRldjoJY2xhc3MgZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfc2hvd19md190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJaW50IGxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaW9hX2NmZy0+c2lzNjQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaXByX2lvYV9md190eXBlX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0JCSJmd190eXBlIiwKKwkJLm1vZGUgPQkJU19JUlVHTywKKwl9LAorCS5zaG93ID0gaXByX3Nob3dfZndfdHlwZQorfTsKKwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICppcHJfaW9hX2F0dHJzW10gPSB7CiAJJmlwcl9md192ZXJzaW9uX2F0dHIsCiAJJmlwcl9sb2dfbGV2ZWxfYXR0ciwKQEAgLTM3NjAsNiArMzc5OSw3IEBACiAJJmlwcl9pb2Ffc3RhdGVfYXR0ciwKIAkmaXByX2lvYV9yZXNldF9hdHRyLAogCSZpcHJfdXBkYXRlX2Z3X2F0dHIsCisJJmlwcl9pb2FfZndfdHlwZV9hdHRyLAogCU5VTEwsCiB9OwogCkBAIC00MDc5LDcgKzQxMTksOCBAQAogfTsKIAogLyoqCi0gKiBpcHJfc2hvd19yZXNvdXJjZV9wYXRoIC0gU2hvdyB0aGUgcmVzb3VyY2UgcGF0aCBmb3IgdGhpcyBkZXZpY2UuCisgKiBpcHJfc2hvd19yZXNvdXJjZV9wYXRoIC0gU2hvdyB0aGUgcmVzb3VyY2UgcGF0aCBvciB0aGUgcmVzb3VyY2UgYWRkcmVzcyBmb3IKKyAqCQkJICAgIHRoaXMgZGV2aWNlLgogICogQGRldjoJZGV2aWNlIHN0cnVjdAogICogQGJ1ZjoJYnVmZmVyCiAgKgpAQCAtNDA5Nyw5ICs0MTM4LDE0IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCXJlcyA9IChzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICopc2Rldi0+aG9zdGRhdGE7Ci0JaWYgKHJlcykKKwlpZiAocmVzICYmIGlvYV9jZmctPnNpczY0KQogCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAotCQkJICAgICAgIGlwcl9mb3JtYXRfcmVzb3VyY2VfcGF0aCgmcmVzLT5yZXNfcGF0aFswXSwgJmJ1ZmZlclswXSkpOworCQkJICAgICAgIGlwcl9mb3JtYXRfcmVzX3BhdGgocmVzLT5yZXNfcGF0aCwgYnVmZmVyLAorCQkJCQkJICAgc2l6ZW9mKGJ1ZmZlcikpKTsKKwllbHNlIGlmIChyZXMpCisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQ6JWQ6JWQ6JWRcbiIsIGlvYV9jZmctPmhvc3QtPmhvc3Rfbm8sCisJCQkgICAgICAgcmVzLT5idXMsIHJlcy0+dGFyZ2V0LCByZXMtPmx1bik7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTQxMDcsMTQgKzQxNTMsNDkgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpcHJfcmVzb3VyY2VfcGF0aF9hdHRyID0gewogCS5hdHRyID0gewogCQkubmFtZSA9IAkicmVzb3VyY2VfcGF0aCIsCi0JCS5tb2RlID0JCVNfSVJVU1IsCisJCS5tb2RlID0JCVNfSVJVR08sCiAJfSwKIAkuc2hvdyA9IGlwcl9zaG93X3Jlc291cmNlX3BhdGgKIH07CiAKKy8qKgorICogaXByX3Nob3dfcmVzb3VyY2VfdHlwZSAtIFNob3cgdGhlIHJlc291cmNlIHR5cGUgZm9yIHRoaXMgZGV2aWNlLgorICogQGRldjoJZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfc2hvd19yZXNvdXJjZV90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlzc2l6ZV90IGxlbiA9IC1FTlhJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmVzID0gKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKilzZGV2LT5ob3N0ZGF0YTsKKworCWlmIChyZXMpCisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIHJlcy0+dHlwZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGlwcl9yZXNvdXJjZV90eXBlX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0JCSJyZXNvdXJjZV90eXBlIiwKKwkJLm1vZGUgPQkJU19JUlVHTywKKwl9LAorCS5zaG93ID0gaXByX3Nob3dfcmVzb3VyY2VfdHlwZQorfTsKKwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICppcHJfZGV2X2F0dHJzW10gPSB7CiAJJmlwcl9hZGFwdGVyX2hhbmRsZV9hdHRyLAogCSZpcHJfcmVzb3VyY2VfcGF0aF9hdHRyLAorCSZpcHJfcmVzb3VyY2VfdHlwZV9hdHRyLAogCU5VTEwsCiB9OwogCkBAIC00MzM4LDggKzQ0MTksNiBAQAogCQkJCQkgICAgIElQUl9WU0VUX1JXX1RJTUVPVVQpOwogCQkJYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKHNkZXYtPnJlcXVlc3RfcXVldWUsIElQUl9WU0VUX01BWF9TRUNUT1JTKTsKIAkJfQotCQlpZiAoaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykgfHwgaXByX2lzX3Njc2lfZGlzayhyZXMpKQotCQkJc2Rldi0+YWxsb3dfcmVzdGFydCA9IDE7CiAJCWlmIChpcHJfaXNfZ2F0YShyZXMpICYmIHJlcy0+c2F0YV9wb3J0KQogCQkJYXAgPSByZXMtPnNhdGFfcG9ydC0+YXA7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKQEAgLTQzNTEsNyArNDQzMCw4IEBACiAJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwLCBzZGV2LT5ob3N0LT5jbWRfcGVyX2x1bik7CiAJCWlmIChpb2FfY2ZnLT5zaXM2NCkKIAkJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwgIlJlc291cmNlIHBhdGg6ICVzXG4iLAotCQkJICAgICAgICAgICAgaXByX2Zvcm1hdF9yZXNvdXJjZV9wYXRoKCZyZXMtPnJlc19wYXRoWzBdLCAmYnVmZmVyWzBdKSk7CisJCQkJICAgIGlwcl9mb3JtYXRfcmVzX3BhdGgocmVzLT5yZXNfcGF0aCwgYnVmZmVyLAorCQkJCQkJCXNpemVvZihidWZmZXIpKSk7CiAJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CkBAIC02NzU1LDcgKzY4MzUsOCBAQAogCQkJbGlzdF9tb3ZlX3RhaWwoJnJlcy0+cXVldWUsICZpb2FfY2ZnLT51c2VkX3Jlc19xKTsKIAkJCWlwcl9pbml0X3Jlc19lbnRyeShyZXMsICZjZmd0ZXcpOwogCQkJcmVzLT5hZGRfdG9fbWwgPSAxOwotCQl9CisJCX0gZWxzZSBpZiAocmVzLT5zZGV2ICYmIChpcHJfaXNfdnNldF9kZXZpY2UocmVzKSB8fCBpcHJfaXNfc2NzaV9kaXNrKHJlcykpKQorCQkJcmVzLT5zZGV2LT5hbGxvd19yZXN0YXJ0ID0gMTsKIAogCQlpZiAoZm91bmQpCiAJCQlpcHJfdXBkYXRlX3Jlc19lbnRyeShyZXMsICZjZmd0ZXcpOwpAQCAtNzE1NCwxMiArNzIzNSwxNSBAQAogCQlzdGFnZV90aW1lID0gaW9hX2NmZy0+dHJhbnNvcF90aW1lb3V0OwogCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9pb2FmcF9pZGVudGlmeV9ocnJxOwogCX0gZWxzZSBpZiAoc3RhZ2UgPT0gSVBSX0lQTF9JTklUX1NUQUdFX1RSQU5TT1ApIHsKLQkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfaWRlbnRpZnlfaHJycTsKLQkJbWFza3ZhbCA9IElQUl9QQ0lJX0lQTF9TVEFHRV9DSEFOR0U7Ci0JCW1hc2t2YWwgPSAobWFza3ZhbCA8PCAzMikgfCBJUFJfUENJSV9JT0FfVFJBTlNfVE9fT1BFUjsKLQkJd3JpdGVxKG1hc2t2YWwsIGlvYV9jZmctPnJlZ3Muc2V0X2ludGVycnVwdF9tYXNrX3JlZyk7Ci0JCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZyk7Ci0JCXJldHVybiBJUFJfUkNfSk9CX0NPTlRJTlVFOworCQlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnMzIpOworCQlpZiAoaW50X3JlZyAmIElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSKSB7CisJCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9pb2FmcF9pZGVudGlmeV9ocnJxOworCQkJbWFza3ZhbCA9IElQUl9QQ0lJX0lQTF9TVEFHRV9DSEFOR0U7CisJCQltYXNrdmFsID0gKG1hc2t2YWwgPDwgMzIpIHwgSVBSX1BDSUlfSU9BX1RSQU5TX1RPX09QRVI7CisJCQl3cml0ZXEobWFza3ZhbCwgaW9hX2NmZy0+cmVncy5zZXRfaW50ZXJydXB0X21hc2tfcmVnKTsKKwkJCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZyk7CisJCQlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKKwkJfQogCX0KIAogCWlwcl9jbWQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaXByX2NtZDsKQEAgLTcxOTMsNiArNzI3NywxMiBAQAogCWlwcl9pbml0X2lvYV9tZW0oaW9hX2NmZyk7CiAKIAlpb2FfY2ZnLT5hbGxvd19pbnRlcnJ1cHRzID0gMTsKKwlpZiAoaW9hX2NmZy0+c2lzNjQpIHsKKwkJLyogU2V0IHRoZSBhZGFwdGVyIHRvIHRoZSBjb3JyZWN0IGVuZGlhbiBtb2RlLiAqLworCQl3cml0ZWwoSVBSX0VORElBTl9TV0FQX0tFWSwgaW9hX2NmZy0+cmVncy5lbmRpYW5fc3dhcF9yZWcpOworCQlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5lbmRpYW5fc3dhcF9yZWcpOworCX0KKwogCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9yZWczMik7CiAKIAlpZiAoaW50X3JlZyAmIElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSKSB7CkBAIC03MzUwLDYgKzc0NDAsNyBAQAogc3RhdGljIGludCBpcHJfcmVzZXRfcmVzdG9yZV9jZmdfc3BhY2Uoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQogewogCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJdm9sYXRpbGUgdTMyIGludF9yZWc7CiAJaW50IHJjOwogCiAJRU5URVI7CkBAIC03MzY4LDYgKzc0NTksMTIgQEAKIAogCWlwcl9mYWlsX2FsbF9vcHMoaW9hX2NmZyk7CiAKKwlpZiAoaW9hX2NmZy0+c2lzNjQpIHsKKwkJLyogU2V0IHRoZSBhZGFwdGVyIHRvIHRoZSBjb3JyZWN0IGVuZGlhbiBtb2RlLiAqLworCQl3cml0ZWwoSVBSX0VORElBTl9TV0FQX0tFWSwgaW9hX2NmZy0+cmVncy5lbmRpYW5fc3dhcF9yZWcpOworCQlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5lbmRpYW5fc3dhcF9yZWcpOworCX0KKwogCWlmIChpb2FfY2ZnLT5pb2FfdW5pdF9jaGVja2VkKSB7CiAJCWlvYV9jZmctPmlvYV91bml0X2NoZWNrZWQgPSAwOwogCQlpcHJfZ2V0X3VuaXRfY2hlY2tfYnVmZmVyKGlvYV9jZmcpOwpAQCAtNzQyMywyMCArNzUyMCwyNSBAQAogc3RhdGljIGludCBpcHJfcmVzZXRfc3RhcnRfYmlzdChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCiB7CiAJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKLQlpbnQgcmM7CisJaW50IHJjID0gUENJQklPU19TVUNDRVNTRlVMOwogCiAJRU5URVI7CiAJcGNpX2Jsb2NrX3VzZXJfY2ZnX2FjY2Vzcyhpb2FfY2ZnLT5wZGV2KTsKLQlyYyA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShpb2FfY2ZnLT5wZGV2LCBQQ0lfQklTVCwgUENJX0JJU1RfU1RBUlQpOwogCi0JaWYgKHJjICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewotCQlwY2lfdW5ibG9ja191c2VyX2NmZ19hY2Nlc3MoaXByX2NtZC0+aW9hX2NmZy0+cGRldik7Ci0JCWlwcl9jbWQtPnMuaW9hc2EuaGRyLmlvYXNjID0gY3B1X3RvX2JlMzIoSVBSX0lPQVNDX1BDSV9BQ0NFU1NfRVJST1IpOwotCQlyYyA9IElQUl9SQ19KT0JfQ09OVElOVUU7Ci0JfSBlbHNlIHsKKwlpZiAoaW9hX2NmZy0+aXByX2NoaXAtPmJpc3RfbWV0aG9kID09IElQUl9NTUlPKQorCQl3cml0ZWwoSVBSX1VQUk9DSV9TSVM2NF9TVEFSVF9CSVNULAorCQkgICAgICAgaW9hX2NmZy0+cmVncy5zZXRfdXByb2NfaW50ZXJydXB0X3JlZzMyKTsKKwllbHNlCisJCXJjID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlvYV9jZmctPnBkZXYsIFBDSV9CSVNULCBQQ0lfQklTVF9TVEFSVCk7CisKKwlpZiAocmMgPT0gUENJQklPU19TVUNDRVNTRlVMKSB7CiAJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X2Jpc3RfZG9uZTsKIAkJaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKGlwcl9jbWQsIElQUl9XQUlUX0ZPUl9CSVNUX1RJTUVPVVQpOwogCQlyYyA9IElQUl9SQ19KT0JfUkVUVVJOOworCX0gZWxzZSB7CisJCXBjaV91bmJsb2NrX3VzZXJfY2ZnX2FjY2VzcyhpcHJfY21kLT5pb2FfY2ZnLT5wZGV2KTsKKwkJaXByX2NtZC0+cy5pb2FzYS5oZHIuaW9hc2MgPSBjcHVfdG9fYmUzMihJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUik7CisJCXJjID0gSVBSX1JDX0pPQl9DT05USU5VRTsKIAl9CiAKIAlMRUFWRTsKQEAgLTc1MzIsNyArNzYzNCw3IEBACiB9CiAKIC8qKgotICogaXByX3Jlc2V0X2FsZXJ0X3BhcnQyIC0gQWxlcnQgdGhlIGFkYXB0ZXIgb2YgYSBwZW5kaW5nIHJlc2V0CisgKiBpcHJfcmVzZXRfYWxlcnQgLSBBbGVydCB0aGUgYWRhcHRlciBvZiBhIHBlbmRpbmcgcmVzZXQKICAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKICAqCiAgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBhbGVydHMgdGhlIGFkYXB0ZXIgdGhhdCBpdCB3aWxsIGJlIHJlc2V0LgpAQCAtODMwMyw2ICs4NDA1LDcgQEAKIAkJdC0+aW5pdF9mZWVkYmFja19yZWcgPSBiYXNlICsgcC0+aW5pdF9mZWVkYmFja19yZWc7CiAJCXQtPmR1bXBfYWRkcl9yZWcgPSBiYXNlICsgcC0+ZHVtcF9hZGRyX3JlZzsKIAkJdC0+ZHVtcF9kYXRhX3JlZyA9IGJhc2UgKyBwLT5kdW1wX2RhdGFfcmVnOworCQl0LT5lbmRpYW5fc3dhcF9yZWcgPSBiYXNlICsgcC0+ZW5kaWFuX3N3YXBfcmVnOwogCX0KIH0KIApAQCAtODg1OCw2ICs4OTYxLDggQEAKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTl9FLAogCSAgICAgIFBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdCMywgMCwgMCwgMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX09CU0lESUFOX0UsCisJICAgICAgUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0NDLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fT0JTSURJQU5fRSwKIAkgICAgICBQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3QjcsIDAsIDAsCiAJICAgICAgSVBSX1VTRV9MT05HX1RSQU5TT1BfVElNRU9VVCB8IElQUl9VU0VfUENJX1dBUk1fUkVTRVQgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9TTklQRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuaCBiL2RyaXZlcnMvc2NzaS9pcHIuaAppbmRleCA5ZWNkMjI1Li40ZDMxNjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmgKKysrIGIvZHJpdmVycy9zY3NpL2lwci5oCkBAIC02MiwxMiArNjIsMTIgQEAKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzI3ODAJMHgwMjY0CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzAyCTB4MDI2NgogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcwMwkweDAyNzgKLSNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MkUgIDB4MDI4RAotI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTczRSAgMHgwMkQzCi0jZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzNEICAweDAyRDQKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MkUJMHgwMjhECisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzNFCTB4MDJEMworI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTczRAkweDAyRDQKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MUEJMHgwMkMwCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzFCCTB4MDJCRQotI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcxRSAgMHgwMkJGCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzFFCTB4MDJCRgogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcxRgkweDAyRDUKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MkEJMHgwMkMxCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzJCCTB4MDJDMgpAQCAtODIsNiArODIsNyBAQAogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdCNCAgICAweDAzM0IKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3QjIgICAgMHgwMzVGCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0M2ICAgIDB4MDM1NworI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdDQyAgICAweDAzNUMKIAogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdCNSAgICAweDAzM0MKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3Q0UgICAgMHgwMzVFCkBAIC0yNzIsNiArMjczLDcgQEAKIAogI2RlZmluZSBJUFJfVVBST0NJX1JFU0VUX0FMRVJUCQkJKDB4ODAwMDAwMDAgPj4gNykKICNkZWZpbmUgSVBSX1VQUk9DSV9JT19ERUJVR19BTEVSVAkJCSgweDgwMDAwMDAwID4+IDkpCisjZGVmaW5lIElQUl9VUFJPQ0lfU0lTNjRfU1RBUlRfQklTVAkJCSgweDgwMDAwMDAwID4+IDIzKQogCiAjZGVmaW5lIElQUl9MRFVNUF9NQVhfTE9OR19BQ0tfREVMQVlfSU5fVVNFQwkJMjAwMDAwCS8qIDIwMCBtcyAqLwogI2RlZmluZSBJUFJfTERVTVBfTUFYX1NIT1JUX0FDS19ERUxBWV9JTl9VU0VDCQkyMDAwMDAJLyogMjAwIG1zICovCkBAIC05OTYsNyArOTk4LDcgQEAKIAlfX2JlMTYgbGVuZ3RoOwogCXU4IGRlc2NyaXB0b3JfaWQ7CiAKLQl1OCByZXNlcnZlZDsKKwl1OCByZXNlcnZlZFsyXTsKIAl1OCBwYXRoX3N0YXRlOwogCiAJdTggcmVzZXJ2ZWQyWzJdOwpAQCAtMTA1NCw3ICsxMDU2LDcgQEAKIAlfX2JlNjQgZmRfbHVuOwogCXU4IGZkX3Jlc19wYXRoWzhdOwogCV9fYmU2NCB0aW1lX3N0YW1wOwotCXU4IHJlc2VydmVkWzJdOworCXU4IHJlc2VydmVkWzE2XTsKIAl1bmlvbiB7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlX2ZmX2Vycm9yIHR5cGVfZmZfZXJyb3I7CiAJCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzEyX2Vycm9yIHR5cGVfMTJfZXJyb3I7CkBAIC0xMjU0LDYgKzEyNTYsOSBAQAogCiAJdW5zaWduZWQgbG9uZyBkdW1wX2FkZHJfcmVnOwogCXVuc2lnbmVkIGxvbmcgZHVtcF9kYXRhX3JlZzsKKworI2RlZmluZSBJUFJfRU5ESUFOX1NXQVBfS0VZCQkweDAwMDgwODAwCisJdW5zaWduZWQgbG9uZyBlbmRpYW5fc3dhcF9yZWc7CiB9OwogCiBzdHJ1Y3QgaXByX2ludGVycnVwdHMgewpAQCAtMTI3OSw2ICsxMjg0LDggQEAKIAogCXZvaWQgX19pb21lbSAqZHVtcF9hZGRyX3JlZzsKIAl2b2lkIF9faW9tZW0gKmR1bXBfZGF0YV9yZWc7CisKKwl2b2lkIF9faW9tZW0gKmVuZGlhbl9zd2FwX3JlZzsKIH07CiAKIHN0cnVjdCBpcHJfY2hpcF9jZmdfdCB7CkBAIC0xMjk2LDYgKzEzMDMsOSBAQAogCXUxNiBzaXNfdHlwZTsKICNkZWZpbmUgSVBSX1NJUzMyCQkJMHgwMAogI2RlZmluZSBJUFJfU0lTNjQJCQkweDAxCisJdTE2IGJpc3RfbWV0aG9kOworI2RlZmluZSBJUFJfUENJX0NGRwkJCTB4MDAKKyNkZWZpbmUgSVBSX01NSU8JCQkweDAxCiAJY29uc3Qgc3RydWN0IGlwcl9jaGlwX2NmZ190ICpjZmc7CiB9OwogCkBAIC0xNjg0LDggKzE2OTQsOSBAQAogCWlmIChpcHJfaXNfZGV2aWNlKGhvc3RyY2IpKSB7CQkJCQlcCiAJCWlmICgoaG9zdHJjYiktPmlvYV9jZmctPnNpczY0KSB7CQkJXAogCQkJcHJpbnRrKEtFUk5fRVJSIElQUl9OQU1FICI6ICVzOiAiIGZtdCwgCQlcCi0JCQkJaXByX2Zvcm1hdF9yZXNvdXJjZV9wYXRoKCZob3N0cmNiLT5oY2FtLnUuZXJyb3I2NC5mZF9yZXNfcGF0aFswXSwgXAotCQkJCQkmaG9zdHJjYi0+cnBfYnVmZmVyWzBdKSwJXAorCQkJCWlwcl9mb3JtYXRfcmVzX3BhdGgoaG9zdHJjYi0+aGNhbS51LmVycm9yNjQuZmRfcmVzX3BhdGgsIFwKKwkJCQkJaG9zdHJjYi0+cnBfYnVmZmVyLAkJXAorCQkJCQlzaXplb2YoaG9zdHJjYi0+cnBfYnVmZmVyKSksCVwKIAkJCQlfX1ZBX0FSR1NfXyk7CQkJCVwKIAkJfSBlbHNlIHsJCQkJCQlcCiAJCQlpcHJfcmFfZXJyKChob3N0cmNiKS0+aW9hX2NmZywJCQlcCkBAIC0xODU0LDQgKzE4NjUsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmbmRlZiB3cml0ZXEKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXEodTY0IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworICAgICAgICB3cml0ZWwoKCh1MzIpICh2YWwgPj4gMzIpKSwgYWRkcik7CisgICAgICAgIHdyaXRlbCgoKHUzMikgKHZhbCkpLCAoYWRkciArIDQpKTsKK30KICNlbmRpZgorCisjZW5kaWYgLyogX0lQUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYwppbmRleCBjNzk4NWRhLi4zMmY2N2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19kaXNjLmMKQEAgLTYzLDI3ICs2MywyNSBAQAogdm9pZCBmY19kaXNjX3N0b3BfcnBvcnRzKHN0cnVjdCBmY19kaXNjICpkaXNjKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7Ci0Jc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhLCAqbmV4dDsKKwlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CiAKLQlscG9ydCA9IGRpc2MtPmxwb3J0OworCWxwb3J0ID0gZmNfZGlzY19scG9ydChkaXNjKTsKIAogCW11dGV4X2xvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZGF0YSwgbmV4dCwgJmRpc2MtPnJwb3J0cywgcGVlcnMpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmRhdGEsICZkaXNjLT5ycG9ydHMsIHBlZXJzKQogCQlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKHJkYXRhKTsKIAltdXRleF91bmxvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOwogfQogCiAvKioKICAqIGZjX2Rpc2NfcmVjdl9yc2NuX3JlcSgpIC0gSGFuZGxlIFJlZ2lzdGVyZWQgU3RhdGUgQ2hhbmdlIE5vdGlmaWNhdGlvbiAoUlNDTikKLSAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIG9mIHRoZSBSU0NOIGV4Y2hhbmdlCisgKiBAZGlzYzogIFRoZSBkaXNjb3Zlcnkgb2JqZWN0IHRvIHdoaWNoIHRoZSBSU0NOIGFwcGxpZXMKICAqIEBmcDoJICAgVGhlIFJTQ04gZnJhbWUKLSAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCB0aGUgcmVxdWVzdCB3aWxsIGJlIHNlbnQgb24KICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBkaXNjX211dGV4IGlzIGxvY2tlZAogICoJCSBiZWZvcmUgaXQgaXMgY2FsbGVkLgogICovCi1zdGF0aWMgdm9pZCBmY19kaXNjX3JlY3ZfcnNjbl9yZXEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCQkJICBzdHJ1Y3QgZmNfZGlzYyAqZGlzYykKK3N0YXRpYyB2b2lkIGZjX2Rpc2NfcmVjdl9yc2NuX3JlcShzdHJ1Y3QgZmNfZGlzYyAqZGlzYywgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19lbHNfcnNjbiAqcnA7CkBAIC05Niw3ICs5NCw3IEBACiAJTElTVF9IRUFEKGRpc2NfcG9ydHMpOwogCXN0cnVjdCBmY19kaXNjX3BvcnQgKmRwLCAqbmV4dDsKIAotCWxwb3J0ID0gZGlzYy0+bHBvcnQ7CisJbHBvcnQgPSBmY19kaXNjX2xwb3J0KGRpc2MpOwogCiAJRkNfRElTQ19EQkcoZGlzYywgIlJlY2VpdmVkIGFuIFJTQ04gZXZlbnRcbiIpOwogCkBAIC0xNTEsNyArMTQ5LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfQUNDLCBOVUxMKTsKKwlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChmcCwgRUxTX0xTX0FDQywgTlVMTCk7CiAKIAkvKgogCSAqIElmIG5vdCBkb2luZyBhIGNvbXBsZXRlIHJlZGlzY292ZXJ5LCBkbyBHUE5fSUQgb24KQEAgLTE3NywyNSArMTc1LDIyIEBACiAJcmV0dXJuOwogcmVqZWN0OgogCUZDX0RJU0NfREJHKGRpc2MsICJSZWNlaXZlZCBhIGJhZCBSU0NOIGZyYW1lXG4iKTsKLQlyanRfZGF0YS5mcCA9IE5VTEw7CiAJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9MT0dJQzsKIAlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9OT05FOwotCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGZwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOwogCWZjX2ZyYW1lX2ZyZWUoZnApOwogfQogCiAvKioKICAqIGZjX2Rpc2NfcmVjdl9yZXEoKSAtIEhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cwotICogQHNwOgkgICBUaGUgc2VxdWVuY2Ugb2YgdGhlIHJlcXVlc3QgZXhjaGFuZ2UKLSAqIEBmcDoJICAgVGhlIHJlcXVlc3QgZnJhbWUKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjZWl2aW5nIHRoZSByZXF1ZXN0CisgKiBAZnA6CSAgIFRoZSByZXF1ZXN0IGZyYW1lCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBFTSBhbmQgd2lsbCBsb2NrCiAgKgkJIHRoZSBkaXNjX211dGV4IGJlZm9yZSBjYWxsaW5nIHRoZSBoYW5kbGVyIGZvciB0aGUKICAqCQkgcmVxdWVzdC4KICAqLwotc3RhdGljIHZvaWQgZmNfZGlzY19yZWN2X3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKLQkJCSAgICAgc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3N0YXRpYyB2b2lkIGZjX2Rpc2NfcmVjdl9yZXEoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKIAl1OCBvcDsKIAlzdHJ1Y3QgZmNfZGlzYyAqZGlzYyA9ICZscG9ydC0+ZGlzYzsKQEAgLTIwNCw3ICsxOTksNyBAQAogCXN3aXRjaCAob3ApIHsKIAljYXNlIEVMU19SU0NOOgogCQltdXRleF9sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKLQkJZmNfZGlzY19yZWN2X3JzY25fcmVxKHNwLCBmcCwgZGlzYyk7CisJCWZjX2Rpc2NfcmVjdl9yc2NuX3JlcShkaXNjLCBmcCk7CiAJCW11dGV4X3VubG9jaygmZGlzYy0+ZGlzY19tdXRleCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yNzUsNyArMjcwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgZmNfZGlzY19kb25lKHN0cnVjdCBmY19kaXNjICpkaXNjLCBlbnVtIGZjX2Rpc2NfZXZlbnQgZXZlbnQpCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGRpc2MtPmxwb3J0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBmY19kaXNjX2xwb3J0KGRpc2MpOwogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAogCUZDX0RJU0NfREJHKGRpc2MsICJEaXNjb3ZlcnkgY29tcGxldGVcbiIpOwpAQCAtMjkyLDcgKzI4Nyw3IEBACiAJICogU2tpcCBwb3J0cyB3aGljaCB3ZXJlIG5ldmVyIGRpc2NvdmVyZWQuICBUaGVzZSBhcmUgdGhlIGROUyBwb3J0CiAJICogYW5kIHBvcnRzIHdoaWNoIHdlcmUgY3JlYXRlZCBieSBQTE9HSS4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkYXRhLCAmZGlzYy0+cnBvcnRzLCBwZWVycykgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJkYXRhLCAmZGlzYy0+cnBvcnRzLCBwZWVycykgewogCQlpZiAoIXJkYXRhLT5kaXNjX2lkKQogCQkJY29udGludWU7CiAJCWlmIChyZGF0YS0+ZGlzY19pZCA9PSBkaXNjLT5kaXNjX2lkKQpAQCAtMzEzLDcgKzMwOCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGZjX2Rpc2NfZXJyb3Ioc3RydWN0IGZjX2Rpc2MgKmRpc2MsIHN0cnVjdCBmY19mcmFtZSAqZnApCiB7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGRpc2MtPmxwb3J0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBmY19kaXNjX2xwb3J0KGRpc2MpOwogCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOwogCiAJRkNfRElTQ19EQkcoZGlzYywgIkVycm9yICVsZCwgcmV0cmllcyAlZC8lZFxuIiwKQEAgLTM1Myw3ICszNDgsNyBAQAogc3RhdGljIHZvaWQgZmNfZGlzY19ncG5fZnRfcmVxKHN0cnVjdCBmY19kaXNjICpkaXNjKQogewogCXN0cnVjdCBmY19mcmFtZSAqZnA7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGRpc2MtPmxwb3J0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBmY19kaXNjX2xwb3J0KGRpc2MpOwogCiAJV0FSTl9PTighZmNfbHBvcnRfdGVzdF9yZWFkeShscG9ydCkpOwogCkBAIC0zOTYsNyArMzkxLDcgQEAKIAlzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgaWRzOwogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAotCWxwb3J0ID0gZGlzYy0+bHBvcnQ7CisJbHBvcnQgPSBmY19kaXNjX2xwb3J0KGRpc2MpOwogCWRpc2MtPnNlcV9jb3VudCsrOwogCiAJLyoKQEAgLTczMyw3ICs3MjgsNyBAQAogCW11dGV4X2luaXQoJmRpc2MtPmRpc2NfbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZkaXNjLT5ycG9ydHMpOwogCi0JZGlzYy0+bHBvcnQgPSBscG9ydDsKKwlkaXNjLT5wcml2ID0gbHBvcnQ7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Vsc2N0LmMKaW5kZXggZTk0MTJiNy4uOWIyNTk2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Vsc2N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Vsc2N0LmMKQEAgLTY0LDcgKzY0LDcgQEAKIAl9CiAKIAlmY19maWxsX2ZjX2hkcihmcCwgcl9jdGwsIGRpZCwgbHBvcnQtPnBvcnRfaWQsIGZoX3R5cGUsCi0JCSAgICAgICBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOworCQkgICAgICAgRkNfRkNUTF9SRVEsIDApOwogCiAJcmV0dXJuIGxwb3J0LT50dC5leGNoX3NlcV9zZW5kKGxwb3J0LCBmcCwgcmVzcCwgTlVMTCwgYXJnLCB0aW1lcl9tc2VjKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCmluZGV4IDEwNGUwZmIuLmVjMmExYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYwpAQCAtMTI5LDExICsxMjksMTEgQEAKIH07CiAKIHN0YXRpYyB2b2lkIGZjX2V4Y2hfcnJxKHN0cnVjdCBmY19leGNoICopOwotc3RhdGljIHZvaWQgZmNfc2VxX2xzX2FjYyhzdHJ1Y3QgZmNfc2VxICopOwotc3RhdGljIHZvaWQgZmNfc2VxX2xzX3JqdChzdHJ1Y3QgZmNfc2VxICosIGVudW0gZmNfZWxzX3JqdF9yZWFzb24sCitzdGF0aWMgdm9pZCBmY19zZXFfbHNfYWNjKHN0cnVjdCBmY19mcmFtZSAqKTsKK3N0YXRpYyB2b2lkIGZjX3NlcV9sc19yanQoc3RydWN0IGZjX2ZyYW1lICosIGVudW0gZmNfZWxzX3JqdF9yZWFzb24sCiAJCQkgIGVudW0gZmNfZWxzX3JqdF9leHBsYW4pOwotc3RhdGljIHZvaWQgZmNfZXhjaF9lbHNfcmVjKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOwotc3RhdGljIHZvaWQgZmNfZXhjaF9lbHNfcnJxKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfZXhjaF9lbHNfcmVjKHN0cnVjdCBmY19mcmFtZSAqKTsKK3N0YXRpYyB2b2lkIGZjX2V4Y2hfZWxzX3JycShzdHJ1Y3QgZmNfZnJhbWUgKik7CiAKIC8qCiAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBub3Rlcy4KQEAgLTIxOSw4ICsyMTksNiBAQAogICovCiBzdGF0aWMgY2hhciAqZmNfZXhjaF9yY3RsX25hbWVzW10gPSBGQ19SQ1RMX05BTUVTX0lOSVQ7CiAKLSNkZWZpbmUgRkNfVEFCTEVfU0laRSh4KSAgIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCi0KIC8qKgogICogZmNfZXhjaF9uYW1lX2xvb2t1cCgpIC0gTG9va3VwIG5hbWUgYnkgb3Bjb2RlCiAgKiBAb3A6CSAgICAgICBPcGNvZGUgdG8gYmUgbG9va2VkIHVwCkBAIC0yNDksNyArMjQ3LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpmY19leGNoX3JjdGxfbmFtZSh1bnNpZ25lZCBpbnQgb3ApCiB7CiAJcmV0dXJuIGZjX2V4Y2hfbmFtZV9sb29rdXAob3AsIGZjX2V4Y2hfcmN0bF9uYW1lcywKLQkJCQkgICBGQ19UQUJMRV9TSVpFKGZjX2V4Y2hfcmN0bF9uYW1lcykpOworCQkJCSAgIEFSUkFZX1NJWkUoZmNfZXhjaF9yY3RsX25hbWVzKSk7CiB9CiAKIC8qKgpAQCAtNDY0LDYgKzQ2Miw3IEBACiAKIAlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOwogCWZjX2V4Y2hfc2V0dXBfaGRyKGVwLCBmcCwgZl9jdGwpOworCWZyX2VuY2FwcyhmcCkgPSBlcC0+ZW5jYXBzOwogCiAJLyoKIAkgKiB1cGRhdGUgc2VxdWVuY2UgY291bnQgaWYgdGhpcyBmcmFtZSBpcyBjYXJyeWluZwpAQCAtMTAwMiwyOCArMTAwMSwzMCBAQAogLyoqCiAgKiBmY19zZXFfZWxzX3JzcF9zZW5kKCkgLSBTZW5kIGFuIEVMUyByZXNwb25zZSB1c2luZyBpbmZvbWF0aW9uIGZyb20KICAqCQkJICAgdGhlIGV4aXN0aW5nIHNlcXVlbmNlL2V4Y2hhbmdlLgotICogQHNwOgkgICAgICBUaGUgc2VxdWVuY2UvZXhjaGFuZ2UgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20KKyAqIEBmcDoJICAgICAgVGhlIHJlY2VpdmVkIGZyYW1lCiAgKiBAZWxzX2NtZDogIFRoZSBFTFMgY29tbWFuZCB0byBiZSBzZW50CiAgKiBAZWxzX2RhdGE6IFRoZSBFTFMgZGF0YSB0byBiZSBzZW50CisgKgorICogVGhlIHJlY2VpdmVkIGZyYW1lIGlzIG5vdCBmcmVlZC4KICAqLwotc3RhdGljIHZvaWQgZmNfc2VxX2Vsc19yc3Bfc2VuZChzdHJ1Y3QgZmNfc2VxICpzcCwgZW51bSBmY19lbHNfY21kIGVsc19jbWQsCitzdGF0aWMgdm9pZCBmY19zZXFfZWxzX3JzcF9zZW5kKHN0cnVjdCBmY19mcmFtZSAqZnAsIGVudW0gZmNfZWxzX2NtZCBlbHNfY21kLAogCQkJCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgKmVsc19kYXRhKQogewogCXN3aXRjaCAoZWxzX2NtZCkgewogCWNhc2UgRUxTX0xTX1JKVDoKLQkJZmNfc2VxX2xzX3JqdChzcCwgZWxzX2RhdGEtPnJlYXNvbiwgZWxzX2RhdGEtPmV4cGxhbik7CisJCWZjX3NlcV9sc19yanQoZnAsIGVsc19kYXRhLT5yZWFzb24sIGVsc19kYXRhLT5leHBsYW4pOwogCQlicmVhazsKIAljYXNlIEVMU19MU19BQ0M6Ci0JCWZjX3NlcV9sc19hY2Moc3ApOworCQlmY19zZXFfbHNfYWNjKGZwKTsKIAkJYnJlYWs7CiAJY2FzZSBFTFNfUlJROgotCQlmY19leGNoX2Vsc19ycnEoc3AsIGVsc19kYXRhLT5mcCk7CisJCWZjX2V4Y2hfZWxzX3JycShmcCk7CiAJCWJyZWFrOwogCWNhc2UgRUxTX1JFQzoKLQkJZmNfZXhjaF9lbHNfcmVjKHNwLCBlbHNfZGF0YS0+ZnApOworCQlmY19leGNoX2Vsc19yZWMoZnApOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlGQ19FWENIX0RCRyhmY19zZXFfZXhjaChzcCksICJJbnZhbGlkIEVMUyBDTUQ6JXhcbiIsIGVsc19jbWQpOworCQlGQ19MUE9SVF9EQkcoZnJfZGV2KGZwKSwgIkludmFsaWQgRUxTIENNRDoleFxuIiwgZWxzX2NtZCk7CiAJfQogfQogCkBAIC0xMjMwLDExICsxMjMxLDM1IEBACiB9CiAKIC8qKgotICogZmNfZXhjaF9yZWN2X3JlcSgpIC0gSGFuZGxlciBmb3IgYW4gaW5jb21pbmcgcmVxdWVzdCB3aGVyZSBpcyBvdGhlcgotICoJCQllbmQgaXMgb3JpZ2luYXRpbmcgdGhlIHNlcXVlbmNlCisgKiBmY19zZXFfYXNzaWduKCkgLSBBc3NpZ24gZXhjaGFuZ2UgYW5kIHNlcXVlbmNlIGZvciBpbmNvbWluZyByZXF1ZXN0CisgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgcmVjZWl2ZWQgdGhlIHJlcXVlc3QKKyAqIEBmcDogICAgVGhlIHJlcXVlc3QgZnJhbWUKKyAqCisgKiBPbiBzdWNjZXNzLCB0aGUgc2VxdWVuY2UgcG9pbnRlciB3aWxsIGJlIHJldHVybmVkIGFuZCBhbHNvIGluIGZyX3NlcShAZnApLgorICovCitzdGF0aWMgc3RydWN0IGZjX3NlcSAqZmNfc2VxX2Fzc2lnbihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCBmY19leGNoX21ncl9hbmNob3IgKmVtYTsKKworCVdBUk5fT04obHBvcnQgIT0gZnJfZGV2KGZwKSk7CisJV0FSTl9PTihmcl9zZXEoZnApKTsKKwlmcl9zZXEoZnApID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW1hLCAmbHBvcnQtPmVtYV9saXN0LCBlbWFfbGlzdCkKKwkJaWYgKCghZW1hLT5tYXRjaCB8fCBlbWEtPm1hdGNoKGZwKSkgJiYKKwkJICAgIGZjX3NlcV9sb29rdXBfcmVjaXAobHBvcnQsIGVtYS0+bXAsIGZwKSAhPSBGQ19SSlRfTk9ORSkKKwkJCWJyZWFrOworCXJldHVybiBmcl9zZXEoZnApOworfQorCisvKioKKyAqIGZjX2V4Y2hfcmVjdl9yZXEoKSAtIEhhbmRsZXIgZm9yIGFuIGluY29taW5nIHJlcXVlc3QKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCByZWNlaXZlZCB0aGUgcmVxdWVzdAogICogQG1wOgkgICBUaGUgRU0gdGhhdCB0aGUgZXhjaGFuZ2UgaXMgb24KICAqIEBmcDoJICAgVGhlIHJlcXVlc3QgZnJhbWUKKyAqCisgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgb3RoZXIgZW5kIGlzIG9yaWdpbmF0aW5nIHRoZSBleGNoYW5nZQorICogYW5kIHRoZSBzZXF1ZW5jZS4KICAqLwogc3RhdGljIHZvaWQgZmNfZXhjaF9yZWN2X3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wLAogCQkJICAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQpAQCAtMTI1MiwxMyArMTI3NywyMyBAQAogCQlmY19mcmFtZV9mcmVlKGZwKTsKIAkJcmV0dXJuOwogCX0KKwlmcl9kZXYoZnApID0gbHBvcnQ7CiAKLQlmcl9zZXEoZnApID0gTlVMTDsKKwlCVUdfT04oZnJfc2VxKGZwKSk7CQkvKiBYWFggcmVtb3ZlIGxhdGVyICovCisKKwkvKgorCSAqIElmIHRoZSBSWF9JRCBpcyAweGZmZmYsIGRvbid0IGFsbG9jYXRlIGFuIGV4Y2hhbmdlLgorCSAqIFRoZSB1cHBlci1sZXZlbCBwcm90b2NvbCBtYXkgcmVxdWVzdCBvbmUgbGF0ZXIsIGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAoZmgtPmZoX3J4X2lkID09IGh0b25zKEZDX1hJRF9VTktOT1dOKSkKKwkJcmV0dXJuIGxwb3J0LT50dC5scG9ydF9yZWN2KGxwb3J0LCBmcCk7CisKIAlyZWplY3QgPSBmY19zZXFfbG9va3VwX3JlY2lwKGxwb3J0LCBtcCwgZnApOwogCWlmIChyZWplY3QgPT0gRkNfUkpUX05PTkUpIHsKIAkJc3AgPSBmcl9zZXEoZnApOwkvKiBzZXF1ZW5jZSB3aWxsIGJlIGhlbGQgKi8KIAkJZXAgPSBmY19zZXFfZXhjaChzcCk7CiAJCWZjX3NlcV9zZW5kX2FjayhzcCwgZnApOworCQllcC0+ZW5jYXBzID0gZnJfZW5jYXBzKGZwKTsKIAogCQkvKgogCQkgKiBDYWxsIHRoZSByZWNlaXZlIGZ1bmN0aW9uLgpAQCAtMTI3NCw3ICsxMzA5LDcgQEAKIAkJaWYgKGVwLT5yZXNwKQogCQkJZXAtPnJlc3Aoc3AsIGZwLCBlcC0+YXJnKTsKIAkJZWxzZQotCQkJbHBvcnQtPnR0Lmxwb3J0X3JlY3YobHBvcnQsIHNwLCBmcCk7CisJCQlscG9ydC0+dHQubHBvcnRfcmVjdihscG9ydCwgZnApOwogCQlmY19leGNoX3JlbGVhc2UoZXApOwkvKiByZWxlYXNlIGZyb20gbG9va3VwICovCiAJfSBlbHNlIHsKIAkJRkNfTFBPUlRfREJHKGxwb3J0LCAiZXhjaC9zZXEgbG9va3VwIGZhaWxlZDogcmVqZWN0ICV4XG4iLApAQCAtMTU0Miw1MyArMTU3Nyw1NSBAQAogCiAvKioKICAqIGZjX3NlcV9sc19hY2MoKSAtIEFjY2VwdCBzZXF1ZW5jZSB3aXRoIExTX0FDQwotICogQHJlcV9zcDogVGhlIHJlcXVlc3Qgc2VxdWVuY2UKKyAqIEByeF9mcDogVGhlIHJlY2VpdmVkIGZyYW1lLCBub3QgZnJlZWQgaGVyZS4KICAqCiAgKiBJZiB0aGlzIGZhaWxzIGR1ZSB0byBhbGxvY2F0aW9uIG9yIHRyYW5zbWl0IGNvbmdlc3Rpb24sIGFzc3VtZSB0aGUKICAqIG9yaWdpbmF0b3Igd2lsbCByZXBlYXQgdGhlIHNlcXVlbmNlLgogICovCi1zdGF0aWMgdm9pZCBmY19zZXFfbHNfYWNjKHN0cnVjdCBmY19zZXEgKnJlcV9zcCkKK3N0YXRpYyB2b2lkIGZjX3NlcV9sc19hY2Moc3RydWN0IGZjX2ZyYW1lICpyeF9mcCkKIHsKLQlzdHJ1Y3QgZmNfc2VxICpzcDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19lbHNfbHNfYWNjICphY2M7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKIAotCXNwID0gZmNfc2VxX3N0YXJ0X25leHQocmVxX3NwKTsKLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGZjX3NlcV9leGNoKHNwKS0+bHAsIHNpemVvZigqYWNjKSk7Ci0JaWYgKGZwKSB7Ci0JCWFjYyA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmFjYykpOwotCQltZW1zZXQoYWNjLCAwLCBzaXplb2YoKmFjYykpOwotCQlhY2MtPmxhX2NtZCA9IEVMU19MU19BQ0M7Ci0JCWZjX3NlcV9zZW5kX2xhc3Qoc3AsIGZwLCBGQ19SQ1RMX0VMU19SRVAsIEZDX1RZUEVfRUxTKTsKLQl9CisJbHBvcnQgPSBmcl9kZXYocnhfZnApOworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqYWNjKSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCWFjYyA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmFjYykpOworCW1lbXNldChhY2MsIDAsIHNpemVvZigqYWNjKSk7CisJYWNjLT5sYV9jbWQgPSBFTFNfTFNfQUNDOworCWZjX2ZpbGxfcmVwbHlfaGRyKGZwLCByeF9mcCwgRkNfUkNUTF9FTFNfUkVQLCAwKTsKKwlscG9ydC0+dHQuZnJhbWVfc2VuZChscG9ydCwgZnApOwogfQogCiAvKioKICAqIGZjX3NlcV9sc19yanQoKSAtIFJlamVjdCBhIHNlcXVlbmNlIHdpdGggRUxTIExTX1JKVAotICogQHJlcV9zcDogVGhlIHJlcXVlc3Qgc2VxdWVuY2UKKyAqIEByeF9mcDogVGhlIHJlY2VpdmVkIGZyYW1lLCBub3QgZnJlZWQgaGVyZS4KICAqIEByZWFzb246IFRoZSByZWFzb24gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIHJlamVjdGVkCi0gKiBAZXhwbGFuOiBUaGUgZXhwbGFpbmF0aW9uIGZvciB0aGUgcmVqZWN0aW9uCisgKiBAZXhwbGFuOiBUaGUgZXhwbGFuYXRpb24gZm9yIHRoZSByZWplY3Rpb24KICAqCiAgKiBJZiB0aGlzIGZhaWxzIGR1ZSB0byBhbGxvY2F0aW9uIG9yIHRyYW5zbWl0IGNvbmdlc3Rpb24sIGFzc3VtZSB0aGUKICAqIG9yaWdpbmF0b3Igd2lsbCByZXBlYXQgdGhlIHNlcXVlbmNlLgogICovCi1zdGF0aWMgdm9pZCBmY19zZXFfbHNfcmp0KHN0cnVjdCBmY19zZXEgKnJlcV9zcCwgZW51bSBmY19lbHNfcmp0X3JlYXNvbiByZWFzb24sCitzdGF0aWMgdm9pZCBmY19zZXFfbHNfcmp0KHN0cnVjdCBmY19mcmFtZSAqcnhfZnAsIGVudW0gZmNfZWxzX3JqdF9yZWFzb24gcmVhc29uLAogCQkJICBlbnVtIGZjX2Vsc19yanRfZXhwbGFuIGV4cGxhbikKIHsKLQlzdHJ1Y3QgZmNfc2VxICpzcDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19lbHNfbHNfcmp0ICpyanQ7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKIAotCXNwID0gZmNfc2VxX3N0YXJ0X25leHQocmVxX3NwKTsKLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGZjX3NlcV9leGNoKHNwKS0+bHAsIHNpemVvZigqcmp0KSk7Ci0JaWYgKGZwKSB7Ci0JCXJqdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJqdCkpOwotCQltZW1zZXQocmp0LCAwLCBzaXplb2YoKnJqdCkpOwotCQlyanQtPmVyX2NtZCA9IEVMU19MU19SSlQ7Ci0JCXJqdC0+ZXJfcmVhc29uID0gcmVhc29uOwotCQlyanQtPmVyX2V4cGxhbiA9IGV4cGxhbjsKLQkJZmNfc2VxX3NlbmRfbGFzdChzcCwgZnAsIEZDX1JDVExfRUxTX1JFUCwgRkNfVFlQRV9FTFMpOwotCX0KKwlscG9ydCA9IGZyX2RldihyeF9mcCk7CisJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgc2l6ZW9mKCpyanQpKTsKKwlpZiAoIWZwKQorCQlyZXR1cm47CisJcmp0ID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcmp0KSk7CisJbWVtc2V0KHJqdCwgMCwgc2l6ZW9mKCpyanQpKTsKKwlyanQtPmVyX2NtZCA9IEVMU19MU19SSlQ7CisJcmp0LT5lcl9yZWFzb24gPSByZWFzb247CisJcmp0LT5lcl9leHBsYW4gPSBleHBsYW47CisJZmNfZmlsbF9yZXBseV9oZHIoZnAsIHJ4X2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCWxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CiB9CiAKIC8qKgpAQCAtMTY5MSwxNyArMTcyOCwzMyBAQAogRVhQT1JUX1NZTUJPTChmY19leGNoX21ncl9yZXNldCk7CiAKIC8qKgorICogZmNfZXhjaF9sb29rdXAoKSAtIGZpbmQgYW4gZXhjaGFuZ2UKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQKKyAqIEB4aWQ6IFRoZSBleGNoYW5nZSBJRAorICoKKyAqIFJldHVybnMgZXhjaGFuZ2UgcG9pbnRlciB3aXRoIGhvbGQgZm9yIGNhbGxlciwgb3IgTlVMTCBpZiBub3QgZm91bmQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfZXhjaCAqZmNfZXhjaF9sb29rdXAoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgdTMyIHhpZCkKK3sKKwlzdHJ1Y3QgZmNfZXhjaF9tZ3JfYW5jaG9yICplbWE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVtYSwgJmxwb3J0LT5lbWFfbGlzdCwgZW1hX2xpc3QpCisJCWlmIChlbWEtPm1wLT5taW5feGlkIDw9IHhpZCAmJiB4aWQgPD0gZW1hLT5tcC0+bWF4X3hpZCkKKwkJCXJldHVybiBmY19leGNoX2ZpbmQoZW1hLT5tcCwgeGlkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCiAgKiBmY19leGNoX2Vsc19yZWMoKSAtIEhhbmRsZXIgZm9yIEVMUyBSRUMgKFJlYWQgRXhjaGFuZ2UgQ29uY2lzZSkgcmVxdWVzdHMKLSAqIEBzcDoJIFRoZSBzZXF1ZW5jZSB0aGUgUkVDIGlzIG9uCi0gKiBAcmZwOiBUaGUgUkVDIGZyYW1lCisgKiBAcmZwOiBUaGUgUkVDIGZyYW1lLCBub3QgZnJlZWQgaGVyZS4KICAqCiAgKiBOb3RlIHRoYXQgdGhlIHJlcXVlc3RpbmcgcG9ydCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIFNfSUQgaW4gdGhlIHJlcXVlc3QuCiAgKi8KLXN0YXRpYyB2b2lkIGZjX2V4Y2hfZWxzX3JlYyhzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpyZnApCitzdGF0aWMgdm9pZCBmY19leGNoX2Vsc19yZWMoc3RydWN0IGZjX2ZyYW1lICpyZnApCiB7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwogCXN0cnVjdCBmY19leGNoICplcDsKLQlzdHJ1Y3QgZmNfZXhjaF9tZ3IgKmVtOwogCXN0cnVjdCBmY19lbHNfcmVjICpycDsKIAlzdHJ1Y3QgZmNfZWxzX3JlY19hY2MgKmFjYzsKIAllbnVtIGZjX2Vsc19yanRfcmVhc29uIHJlYXNvbiA9IEVMU19SSlRfTE9HSUM7CkBAIC0xNzEwLDYgKzE3NjMsNyBAQAogCXUxNiByeGlkOwogCXUxNiBveGlkOwogCisJbHBvcnQgPSBmcl9kZXYocmZwKTsKIAlycCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KHJmcCwgc2l6ZW9mKCpycCkpOwogCWV4cGxhbiA9IEVMU19FWFBMX0lOVl9MRU47CiAJaWYgKCFycCkKQEAgLTE3MTgsMzUgKzE3NzIsMTkgQEAKIAlyeGlkID0gbnRvaHMocnAtPnJlY19yeF9pZCk7CiAJb3hpZCA9IG50b2hzKHJwLT5yZWNfb3hfaWQpOwogCi0JLyoKLQkgKiBDdXJyZW50bHkgaXQncyBoYXJkIHRvIGZpbmQgdGhlIGxvY2FsIFNfSUQgZnJvbSB0aGUgZXhjaGFuZ2UKLQkgKiBtYW5hZ2VyLiAgVGhpcyB3aWxsIGV2ZW50dWFsbHkgYmUgZml4ZWQsIGJ1dCBmb3Igbm93IGl0J3MgZWFzaWVyCi0JICogdG8gbG9va3VwIHRoZSBzdWJqZWN0IGV4Y2hhbmdlIHR3aWNlLCBvbmNlIGFzIGlmIHdlIHdlcmUKLQkgKiB0aGUgaW5pdGlhdG9yLCBhbmQgdGhlbiBhZ2FpbiBpZiB3ZSB3ZXJlbid0LgotCSAqLwotCWVtID0gZmNfc2VxX2V4Y2goc3ApLT5lbTsKLQllcCA9IGZjX2V4Y2hfZmluZChlbSwgb3hpZCk7CisJZXAgPSBmY19leGNoX2xvb2t1cChscG9ydCwKKwkJCSAgICBzaWQgPT0gZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSA/IG94aWQgOiByeGlkKTsKIAlleHBsYW4gPSBFTFNfRVhQTF9PWElEX1JYSUQ7Ci0JaWYgKGVwICYmIGVwLT5vaWQgPT0gc2lkKSB7Ci0JCWlmIChlcC0+cnhpZCAhPSBGQ19YSURfVU5LTk9XTiAmJgotCQkgICAgcnhpZCAhPSBGQ19YSURfVU5LTk9XTiAmJgotCQkgICAgZXAtPnJ4aWQgIT0gcnhpZCkKLQkJCWdvdG8gcmVsOwotCX0gZWxzZSB7Ci0JCWlmIChlcCkKLQkJCWZjX2V4Y2hfcmVsZWFzZShlcCk7Ci0JCWVwID0gTlVMTDsKLQkJaWYgKHJ4aWQgIT0gRkNfWElEX1VOS05PV04pCi0JCQllcCA9IGZjX2V4Y2hfZmluZChlbSwgcnhpZCk7Ci0JCWlmICghZXApCi0JCQlnb3RvIHJlamVjdDsKLQl9Ci0KLQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGZjX3NlcV9leGNoKHNwKS0+bHAsIHNpemVvZigqYWNjKSk7Ci0JaWYgKCFmcCkgewotCQlmY19leGNoX2RvbmUoc3ApOworCWlmICghZXApCisJCWdvdG8gcmVqZWN0OworCWlmIChlcC0+b2lkICE9IHNpZCB8fCBveGlkICE9IGVwLT5veGlkKQorCQlnb3RvIHJlbDsKKwlpZiAocnhpZCAhPSBGQ19YSURfVU5LTk9XTiAmJiByeGlkICE9IGVwLT5yeGlkKQorCQlnb3RvIHJlbDsKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2YoKmFjYykpOworCWlmICghZnApCiAJCWdvdG8gb3V0OwotCX0KKwogCWFjYyA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmFjYykpOwogCW1lbXNldChhY2MsIDAsIHNpemVvZigqYWNjKSk7CiAJYWNjLT5yZWNhX2NtZCA9IEVMU19MU19BQ0M7CkBAIC0xNzYxLDE4ICsxNzk5LDE2IEBACiAJYWNjLT5yZWNhX2Vfc3RhdCA9IGh0b25sKGVwLT5lc2Jfc3RhdCAmIChFU0JfU1RfUkVTUCB8CiAJCQkJCQkgRVNCX1NUX1NFUV9JTklUIHwKIAkJCQkJCSBFU0JfU1RfQ09NUExFVEUpKTsKLQlzcCA9IGZjX3NlcV9zdGFydF9uZXh0KHNwKTsKLQlmY19zZXFfc2VuZF9sYXN0KHNwLCBmcCwgRkNfUkNUTF9FTFNfUkVQLCBGQ19UWVBFX0VMUyk7CisJZmNfZmlsbF9yZXBseV9oZHIoZnAsIHJmcCwgRkNfUkNUTF9FTFNfUkVQLCAwKTsKKwlscG9ydC0+dHQuZnJhbWVfc2VuZChscG9ydCwgZnApOwogb3V0OgogCWZjX2V4Y2hfcmVsZWFzZShlcCk7Ci0JZmNfZnJhbWVfZnJlZShyZnApOwogCXJldHVybjsKIAogcmVsOgogCWZjX2V4Y2hfcmVsZWFzZShlcCk7CiByZWplY3Q6Ci0JZmNfc2VxX2xzX3JqdChzcCwgcmVhc29uLCBleHBsYW4pOwotCWZjX2ZyYW1lX2ZyZWUocmZwKTsKKwlmY19zZXFfbHNfcmp0KHJmcCwgcmVhc29uLCBleHBsYW4pOwogfQogCiAvKioKQEAgLTE5NDcsMjAgKzE5ODMsMjAgQEAKIAlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOwogfQogCi0KIC8qKgogICogZmNfZXhjaF9lbHNfcnJxKCkgLSBIYW5kbGVyIGZvciBFTFMgUlJRIChSZXNldCBSZWNvdmVyeSBRdWFsaWZpZXIpIHJlcXVlc3RzCi0gKiBAc3A6IFRoZSBzZXF1ZW5jZSB0aGF0IHRoZSBSUlEgaXMgb24KLSAqIEBmcDogVGhlIFJSUSBmcmFtZQorICogQGZwOiBUaGUgUlJRIGZyYW1lLCBub3QgZnJlZWQgaGVyZS4KICAqLwotc3RhdGljIHZvaWQgZmNfZXhjaF9lbHNfcnJxKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQorc3RhdGljIHZvaWQgZmNfZXhjaF9lbHNfcnJxKHN0cnVjdCBmY19mcmFtZSAqZnApCiB7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBOVUxMOwkvKiByZXF1ZXN0IG9yIHN1YmplY3QgZXhjaGFuZ2UgKi8KIAlzdHJ1Y3QgZmNfZWxzX3JycSAqcnA7CiAJdTMyIHNpZDsKIAl1MTYgeGlkOwogCWVudW0gZmNfZWxzX3JqdF9leHBsYW4gZXhwbGFuOwogCisJbHBvcnQgPSBmcl9kZXYoZnApOwogCXJwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcnApKTsKIAlleHBsYW4gPSBFTFNfRVhQTF9JTlZfTEVOOwogCWlmICghcnApCkBAIC0xOTY5LDExICsyMDA1LDEwIEBACiAJLyoKIAkgKiBsb29rdXAgc3ViamVjdCBleGNoYW5nZS4KIAkgKi8KLQllcCA9IGZjX3NlcV9leGNoKHNwKTsKIAlzaWQgPSBudG9oMjQocnAtPnJycV9zX2lkKTsJCS8qIHN1YmplY3Qgc291cmNlICovCi0JeGlkID0gZXAtPmRpZCA9PSBzaWQgPyBudG9ocyhycC0+cnJxX294X2lkKSA6IG50b2hzKHJwLT5ycnFfcnhfaWQpOwotCWVwID0gZmNfZXhjaF9maW5kKGVwLT5lbSwgeGlkKTsKLQorCXhpZCA9IGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkgPT0gc2lkID8KKwkJCW50b2hzKHJwLT5ycnFfb3hfaWQpIDogbnRvaHMocnAtPnJycV9yeF9pZCk7CisJZXAgPSBmY19leGNoX2xvb2t1cChscG9ydCwgeGlkKTsKIAlleHBsYW4gPSBFTFNfRVhQTF9PWElEX1JYSUQ7CiAJaWYgKCFlcCkKIAkJZ290byByZWplY3Q7CkBAIC0yMDA0LDE1ICsyMDM5LDE0IEBACiAJLyoKIAkgKiBTZW5kIExTX0FDQy4KIAkgKi8KLQlmY19zZXFfbHNfYWNjKHNwKTsKKwlmY19zZXFfbHNfYWNjKGZwKTsKIAlnb3RvIG91dDsKIAogdW5sb2NrX3JlamVjdDoKIAlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOwogcmVqZWN0OgotCWZjX3NlcV9sc19yanQoc3AsIEVMU19SSlRfTE9HSUMsIGV4cGxhbik7CisJZmNfc2VxX2xzX3JqdChmcCwgRUxTX1JKVF9MT0dJQywgZXhwbGFuKTsKIG91dDoKLQlmY19mcmFtZV9mcmVlKGZwKTsKIAlpZiAoZXApCiAJCWZjX2V4Y2hfcmVsZWFzZShlcCk7CS8qIGRyb3AgaG9sZCBmcm9tIGZjX2V4Y2hfZmluZCAqLwogfQpAQCAtMjI0Myw3ICsyMjc3LDcgQEAKIAkJCWZjX2V4Y2hfcmVjdl9zZXFfcmVzcChlbWEtPm1wLCBmcCk7CiAJCWVsc2UgaWYgKGZfY3RsICYgRkNfRkNfU0VRX0NUWCkKIAkJCWZjX2V4Y2hfcmVjdl9yZXNwKGVtYS0+bXAsIGZwKTsKLQkJZWxzZQorCQllbHNlCS8qIG5vIEVYX0NUWCBhbmQgbm8gU0VRX0NUWCAqLwogCQkJZmNfZXhjaF9yZWN2X3JlcShscG9ydCwgZW1hLT5tcCwgZnApOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjI4MSw2ICsyMzE1LDkgQEAKIAlpZiAoIWxwb3J0LT50dC5zZXFfZXhjaF9hYm9ydCkKIAkJbHBvcnQtPnR0LnNlcV9leGNoX2Fib3J0ID0gZmNfc2VxX2V4Y2hfYWJvcnQ7CiAKKwlpZiAoIWxwb3J0LT50dC5zZXFfYXNzaWduKQorCQlscG9ydC0+dHQuc2VxX2Fzc2lnbiA9IGZjX3NlcV9hc3NpZ247CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZmNfZXhjaF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYwppbmRleCBlYzFmNjZjLi5lYWM0ZDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCkBAIC01ODAsMTAgKzU4MCw4IEBACiAJCQkgICBmc3AsIHNlcV9ibGVuLCBscG9ydC0+bHNvX21heCwgdF9ibGVuKTsKIAl9CiAKLQlXQVJOX09OKHRfYmxlbiA8IEZDX01JTl9NQVhfUEFZTE9BRCk7CiAJaWYgKHRfYmxlbiA+IDUxMikKIAkJdF9ibGVuICY9IH4oNTEyIC0gMSk7CS8qIHJvdW5kIGRvd24gdG8gYmxvY2sgc2l6ZSAqLwotCVdBUk5fT04odF9ibGVuIDwgRkNfTUlOX01BWF9QQVlMT0FEKTsJLyogd29uJ3QgZ28gYmVsb3cgMjU2ICovCiAJc2MgPSBmc3AtPmNtZDsKIAogCXJlbWFpbmluZyA9IHNlcV9ibGVuOwpAQCAtNzQ1LDcgKzc0Myw3IEBACiAJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKIAlyX2N0bCA9IGZoLT5maF9yX2N0bDsKIAotCWlmICghKGxwb3J0LT5zdGF0ZSAmIExQT1JUX1NUX1JFQURZKSkKKwlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZKQogCQlnb3RvIG91dDsKIAlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCiAJCWdvdG8gb3V0OwpAQCAtMTExMCw3ICsxMTA4LDcgQEAKIAogCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0REX1VOU09MX0NNRCwgcnBvcnQtPnBvcnRfaWQsCiAJCSAgICAgICBycHJpdi0+bG9jYWxfcG9ydC0+cG9ydF9pZCwgRkNfVFlQRV9GQ1AsCi0JCSAgICAgICBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOworCQkgICAgICAgRkNfRkNUTF9SRVEsIDApOwogCiAJc2VxID0gbHBvcnQtPnR0LmV4Y2hfc2VxX3NlbmQobHBvcnQsIGZwLCByZXNwLCBmY19mY3BfcGt0X2Rlc3Ryb3ksCiAJCQkJICAgICAgZnNwLCAwKTsKQEAgLTEzODMsNyArMTM4MSw3IEBACiAJZnJfc2VxKGZwKSA9IGZzcC0+c2VxX3B0cjsKIAlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVRLCBycG9ydC0+cG9ydF9pZCwKIAkJICAgICAgIHJwcml2LT5sb2NhbF9wb3J0LT5wb3J0X2lkLCBGQ19UWVBFX0VMUywKLQkJICAgICAgIEZDX0ZDX0ZJUlNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CisJCSAgICAgICBGQ19GQ1RMX1JFUSwgMCk7CiAJaWYgKGxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBycG9ydC0+cG9ydF9pZCwgZnAsIEVMU19SRUMsCiAJCQkJIGZjX2ZjcF9yZWNfcmVzcCwgZnNwLAogCQkJCSBqaWZmaWVzX3RvX21zZWNzKEZDX1NDU0lfUkVDX1RPVikpKSB7CkBAIC0xNjQxLDcgKzE2MzksNyBAQAogCiAJZmNfZmlsbF9mY19oZHIoZnAsIEZDX1JDVExfRUxTNF9SRVEsIHJwb3J0LT5wb3J0X2lkLAogCQkgICAgICAgcnByaXYtPmxvY2FsX3BvcnQtPnBvcnRfaWQsIEZDX1RZUEVfRkNQLAotCQkgICAgICAgRkNfRkNfRklSU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklULCAwKTsKKwkJICAgICAgIEZDX0ZDVExfUkVRLCAwKTsKIAogCXNlcSA9IGxwb3J0LT50dC5leGNoX3NlcV9zZW5kKGxwb3J0LCBmcCwgZmNfZmNwX3Nycl9yZXNwLCBOVUxMLAogCQkJCSAgICAgIGZzcCwgamlmZmllc190b19tc2VjcyhGQ19TQ1NJX1JFQ19UT1YpKTsKQEAgLTE5NzMsNiArMTk3MSwxMSBAQAogCQlicmVhazsKIAl9CiAKKwlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZICYmIGZzcC0+c3RhdHVzX2NvZGUgIT0gRkNfQ09NUExFVEUpIHsKKwkJc2NfY21kLT5yZXN1bHQgPSAoRElEX1JFUVVFVUUgPDwgMTYpOworCQlGQ19GQ1BfREJHKGZzcCwgIlJldHVybmluZyBESURfUkVRVUVVRSB0byBzY3NpLW1sXG4iKTsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2ktPnNjc2lfcXVldWVfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZmc3AtPmxpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpLT5zY3NpX3F1ZXVlX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmMKaW5kZXggMzlmNGI2YS4uNmE0OGMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogCiAjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgorI2luY2x1ZGUgPHNjc2kvZmNfZW5jb2RlLmg+CiAKICNpbmNsdWRlICJmY19saWJmYy5oIgogCkBAIC0xMzIsMyArMTMzLDgwIEBACiAJfQogCXJldHVybiBjb3B5X2xlbjsKIH0KKworLyoqCisgKiBmY19maWxsX2hkcigpIC0gIGZpbGwgRkMgaGVhZGVyIGZpZWxkcyBiYXNlZCBvbiByZXF1ZXN0CisgKiBAZnA6IHJlcGx5IGZyYW1lIGNvbnRhaW5pbmcgaGVhZGVyIHRvIGJlIGZpbGxlZCBpbgorICogQGluX2ZwOiByZXF1ZXN0IGZyYW1lIGNvbnRhaW5pbmcgaGVhZGVyIHRvIHVzZSBpbiBmaWxsaW5nIGluIHJlcGx5CisgKiBAcl9jdGw6IFJfQ1RMIHZhbHVlIGZvciBoZWFkZXIKKyAqIEBmX2N0bDogRl9DVEwgdmFsdWUgZm9yIGhlYWRlciwgd2l0aCAwIHBhZAorICogQHNlcV9jbnQ6IHNlcXVlbmNlIGNvdW50IGZvciB0aGUgaGVhZGVyLCBpZ25vcmVkIGlmIGZyYW1lIGhhcyBhIHNlcXVlbmNlCisgKiBAcGFybV9vZmZzZXQ6IHBhcmFtZXRlciAvIG9mZnNldCB2YWx1ZQorICovCit2b2lkIGZjX2ZpbGxfaGRyKHN0cnVjdCBmY19mcmFtZSAqZnAsIGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqaW5fZnAsCisJCSBlbnVtIGZjX3JjdGwgcl9jdGwsIHUzMiBmX2N0bCwgdTE2IHNlcV9jbnQsIHUzMiBwYXJtX29mZnNldCkKK3sKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICppbl9maDsKKwlzdHJ1Y3QgZmNfc2VxICpzcDsKKwl1MzIgZmlsbDsKKworCWZoID0gX19mY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlpbl9maCA9IF9fZmNfZnJhbWVfaGVhZGVyX2dldChpbl9mcCk7CisKKwlpZiAoZl9jdGwgJiBGQ19GQ19FTkRfU0VRKSB7CisJCWZpbGwgPSAtZnJfbGVuKGZwKSAmIDM7CisJCWlmIChmaWxsKSB7CisJCQkvKiBUT0RPLCB0aGlzIG1heSBiZSBhIHByb2JsZW0gd2l0aCBmcmFnbWVudGVkIHNrYiAqLworCQkJbWVtc2V0KHNrYl9wdXQoZnBfc2tiKGZwKSwgZmlsbCksIDAsIGZpbGwpOworCQkJZl9jdGwgfD0gZmlsbDsKKwkJfQorCQlmcl9lb2YoZnApID0gRkNfRU9GX1Q7CisJfSBlbHNlIHsKKwkJV0FSTl9PTihmcl9sZW4oZnApICUgNCAhPSAwKTsJLyogbm8gcGFkIHRvIG5vbiBsYXN0IGZyYW1lICovCisJCWZyX2VvZihmcCkgPSBGQ19FT0ZfTjsKKwl9CisKKwlmaC0+Zmhfcl9jdGwgPSByX2N0bDsKKwltZW1jcHkoZmgtPmZoX2RfaWQsIGluX2ZoLT5maF9zX2lkLCBzaXplb2YoZmgtPmZoX2RfaWQpKTsKKwltZW1jcHkoZmgtPmZoX3NfaWQsIGluX2ZoLT5maF9kX2lkLCBzaXplb2YoZmgtPmZoX3NfaWQpKTsKKwlmaC0+ZmhfdHlwZSA9IGluX2ZoLT5maF90eXBlOworCWh0b24yNChmaC0+ZmhfZl9jdGwsIGZfY3RsKTsKKwlmaC0+Zmhfb3hfaWQgPSBpbl9maC0+Zmhfb3hfaWQ7CisJZmgtPmZoX3J4X2lkID0gaW5fZmgtPmZoX3J4X2lkOworCWZoLT5maF9jc19jdGwgPSAwOworCWZoLT5maF9kZl9jdGwgPSAwOworCWZoLT5maF9wYXJtX29mZnNldCA9IGh0b25sKHBhcm1fb2Zmc2V0KTsKKworCXNwID0gZnJfc2VxKGluX2ZwKTsKKwlpZiAoc3ApIHsKKwkJZnJfc2VxKGZwKSA9IHNwOworCQlmaC0+Zmhfc2VxX2lkID0gc3AtPmlkOworCQlzZXFfY250ID0gc3AtPmNudDsKKwl9IGVsc2UgeworCQlmaC0+Zmhfc2VxX2lkID0gMDsKKwl9CisJZmgtPmZoX3NlcV9jbnQgPSBudG9ocyhzZXFfY250KTsKKwlmcl9zb2YoZnApID0gc2VxX2NudCA/IEZDX1NPRl9OMyA6IEZDX1NPRl9JMzsKKwlmcl9lbmNhcHMoZnApID0gZnJfZW5jYXBzKGluX2ZwKTsKK30KK0VYUE9SVF9TWU1CT0woZmNfZmlsbF9oZHIpOworCisvKioKKyAqIGZjX2ZpbGxfcmVwbHlfaGRyKCkgLSAgZmlsbCBGQyByZXBseSBoZWFkZXIgZmllbGRzIGJhc2VkIG9uIHJlcXVlc3QKKyAqIEBmcDogcmVwbHkgZnJhbWUgY29udGFpbmluZyBoZWFkZXIgdG8gYmUgZmlsbGVkIGluCisgKiBAaW5fZnA6IHJlcXVlc3QgZnJhbWUgY29udGFpbmluZyBoZWFkZXIgdG8gdXNlIGluIGZpbGxpbmcgaW4gcmVwbHkKKyAqIEByX2N0bDogUl9DVEwgdmFsdWUgZm9yIHJlcGx5CisgKiBAcGFybV9vZmZzZXQ6IHBhcmFtZXRlciAvIG9mZnNldCB2YWx1ZQorICovCit2b2lkIGZjX2ZpbGxfcmVwbHlfaGRyKHN0cnVjdCBmY19mcmFtZSAqZnAsIGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqaW5fZnAsCisJCSAgICAgICBlbnVtIGZjX3JjdGwgcl9jdGwsIHUzMiBwYXJtX29mZnNldCkKK3sKKwlzdHJ1Y3QgZmNfc2VxICpzcDsKKworCXNwID0gZnJfc2VxKGluX2ZwKTsKKwlpZiAoc3ApCisJCWZyX3NlcShmcCkgPSBmcl9kZXYoaW5fZnApLT50dC5zZXFfc3RhcnRfbmV4dChzcCk7CisJZmNfZmlsbF9oZHIoZnAsIGluX2ZwLCByX2N0bCwgRkNfRkNUTF9SRVNQLCAwLCBwYXJtX29mZnNldCk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2ZpbGxfcmVwbHlfaGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5oIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmgKaW5kZXggZjVjMGNhNC4uMTZkMjE2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmgKQEAgLTUyLDcgKzUyLDcgQEAKICNkZWZpbmUgRkNfRElTQ19EQkcoZGlzYywgZm10LCBhcmdzLi4uKQkJCQlcCiAJRkNfQ0hFQ0tfTE9HR0lORyhGQ19ESVNDX0xPR0dJTkcsCQkJXAogCQkJIHByaW50ayhLRVJOX0lORk8gImhvc3QldTogZGlzYzogIiBmbXQsCVwKLQkJCQkoZGlzYyktPmxwb3J0LT5ob3N0LT5ob3N0X25vLAlcCisJCQkJZmNfZGlzY19scG9ydChkaXNjKS0+aG9zdC0+aG9zdF9ubywJXAogCQkJCSMjYXJncykpCiAKICNkZWZpbmUgRkNfUlBPUlRfSURfREJHKGxwb3J0LCBwb3J0X2lkLCBmbXQsIGFyZ3MuLi4pCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwppbmRleCA3OWM5ZTNjLi5kOWI2ZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwpAQCAtMzIsMTEgKzMyLDExIEBACiAgKiBpbnZhbGlkIFNJRC4gV2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IHN0YXRlcyBkb24ndCBjaGFuZ2UgdW5leHBlY3RlZGx5CiAgKiB3aGlsZSBwcm9jZXNzaW5nIGFub3RoZXIgc3RhdGUuCiAgKgotICogSEVJUkFSQ0hZCisgKiBISUVSQVJDSFkKICAqCi0gKiBUaGUgZm9sbG93aW5nIGhlaXJhcmNoeSBkZWZpbmVzIHRoZSBsb2NraW5nIHJ1bGVzLiBBIGdyZWF0ZXIgbG9jaworICogVGhlIGZvbGxvd2luZyBoaWVyYXJjaHkgZGVmaW5lcyB0aGUgbG9ja2luZyBydWxlcy4gQSBncmVhdGVyIGxvY2sKICAqIG1heSBiZSBoZWxkIGJlZm9yZSBhY3F1aXJpbmcgYSBsZXNzZXIgbG9jaywgYnV0IGEgbGVzc2VyIGxvY2sgc2hvdWxkIG5ldmVyCi0gKiBiZSBoZWxkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBhIGdyZWF0ZXIgbG9jay4gSGVyZSBpcyB0aGUgaGVpcmFyY2h5LQorICogYmUgaGVsZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgYSBncmVhdGVyIGxvY2suIEhlcmUgaXMgdGhlIGhpZXJhcmNoeS0KICAqCiAgKiBscG9ydCA+IGRpc2MsIGxwb3J0ID4gcnBvcnQsIGRpc2MgPiBycG9ydAogICoKQEAgLTM3NSw0MSArMzc1LDM2IEBACiAKIC8qKgogICogZmNfbHBvcnRfcmVjdl9ybGlyX3JlcSgpIC0gSGFuZGxlIHJlY2VpdmVkIFJlZ2lzdGVyZWQgTGluayBJbmNpZGVudCBSZXBvcnQuCi0gKiBAc3A6CSAgIFRoZSBzZXF1ZW5jZSBpbiB0aGUgUkxJUiBleGNoYW5nZQotICogQGZwOgkgICBUaGUgUkxJUiByZXF1ZXN0IGZyYW1lCiAgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCByZWNpZXZpbmcgdGhlIFJMSVIKKyAqIEBmcDoJICAgVGhlIFJMSVIgcmVxdWVzdCBmcmFtZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9ybGlyX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKLQkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQorc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9ybGlyX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCUZDX0xQT1JUX0RCRyhscG9ydCwgIlJlY2VpdmVkIFJMSVIgcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKIAkJICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOwogCi0JbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19BQ0MsIE5VTEwpOworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGZwLCBFTFNfTFNfQUNDLCBOVUxMKTsKIAlmY19mcmFtZV9mcmVlKGZwKTsKIH0KIAogLyoqCiAgKiBmY19scG9ydF9yZWN2X2VjaG9fcmVxKCkgLSBIYW5kbGUgcmVjZWl2ZWQgRUNITyByZXF1ZXN0Ci0gKiBAc3A6CSAgIFRoZSBzZXF1ZW5jZSBpbiB0aGUgRUNITyBleGNoYW5nZQotICogQGZwOgkgICBFQ0hPIHJlcXVlc3QgZnJhbWUKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjaWV2aW5nIHRoZSBFQ0hPCisgKiBAZnA6CSAgIEVDSE8gcmVxdWVzdCBmcmFtZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9lY2hvX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICppbl9mcCwKLQkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQorc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9lY2hvX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCSAgIHN0cnVjdCBmY19mcmFtZSAqaW5fZnApCiB7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKLQlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CiAJdW5zaWduZWQgaW50IGxlbjsKIAl2b2lkICpwcDsKIAl2b2lkICpkcDsKLQl1MzIgZl9jdGw7CiAKIAlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBFQ0hPIHJlcXVlc3Qgd2hpbGUgaW4gc3RhdGUgJXNcbiIsCiAJCSAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKQEAgLTQyNSwyOSArNDIwLDI0IEBACiAJCWRwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIGxlbik7CiAJCW1lbWNweShkcCwgcHAsIGxlbik7CiAJCSooKF9fYmUzMiAqKWRwKSA9IGh0b25sKEVMU19MU19BQ0MgPDwgMjQpOwotCQlzcCA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChzcCk7Ci0JCWZfY3RsID0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfTEFTVF9TRVEgfCBGQ19GQ19FTkRfU0VROwotCQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAotCQkJICAgICAgIEZDX1RZUEVfRUxTLCBmX2N0bCwgMCk7Ci0JCWxwb3J0LT50dC5zZXFfc2VuZChscG9ydCwgc3AsIGZwKTsKKwkJZmNfZmlsbF9yZXBseV9oZHIoZnAsIGluX2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCQlscG9ydC0+dHQuZnJhbWVfc2VuZChscG9ydCwgZnApOwogCX0KIAlmY19mcmFtZV9mcmVlKGluX2ZwKTsKIH0KIAogLyoqCiAgKiBmY19scG9ydF9yZWN2X3JuaWRfcmVxKCkgLSBIYW5kbGUgcmVjZWl2ZWQgUmVxdWVzdCBOb2RlIElEIGRhdGEgcmVxdWVzdAotICogQHNwOgkgICBUaGUgc2VxdWVuY2UgaW4gdGhlIFJOSUQgZXhjaGFuZ2UKLSAqIEBmcDoJICAgVGhlIFJOSUQgcmVxdWVzdCBmcmFtZQogICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCByZWNpZXZpbmcgdGhlIFJOSUQKKyAqIEBmcDoJICAgVGhlIFJOSUQgcmVxdWVzdCBmcmFtZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9ybmlkX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICppbl9mcCwKLQkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQorc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9ybmlkX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCSAgIHN0cnVjdCBmY19mcmFtZSAqaW5fZnApCiB7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKLQlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CiAJc3RydWN0IGZjX2Vsc19ybmlkICpyZXE7CiAJc3RydWN0IHsKIAkJc3RydWN0IGZjX2Vsc19ybmlkX3Jlc3Agcm5pZDsKQEAgLTQ1NywxNyArNDQ3LDE1IEBACiAJc3RydWN0IGZjX3NlcV9lbHNfZGF0YSByanRfZGF0YTsKIAl1OCBmbXQ7CiAJc2l6ZV90IGxlbjsKLQl1MzIgZl9jdGw7CiAKIAlGQ19MUE9SVF9EQkcobHBvcnQsICJSZWNlaXZlZCBSTklEIHJlcXVlc3Qgd2hpbGUgaW4gc3RhdGUgJXNcbiIsCiAJCSAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKIAogCXJlcSA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGluX2ZwLCBzaXplb2YoKnJlcSkpOwogCWlmICghcmVxKSB7Ci0JCXJqdF9kYXRhLmZwID0gTlVMTDsKIAkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9MT0dJQzsKIAkJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfTk9ORTsKLQkJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CisJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGluX2ZwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOwogCX0gZWxzZSB7CiAJCWZtdCA9IHJlcS0+cm5pZF9mbXQ7CiAJCWxlbiA9IHNpemVvZigqcnApOwpAQCAtNDkwLDEyICs0NzgsOCBAQAogCQkJCW1lbWNweSgmcnAtPmdlbiwgJmxwb3J0LT5ybmlkX2dlbiwKIAkJCQkgICAgICAgc2l6ZW9mKHJwLT5nZW4pKTsKIAkJCX0KLQkJCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KHNwKTsKLQkJCWZfY3RsID0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfTEFTVF9TRVE7Ci0JCQlmX2N0bCB8PSBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQ7Ci0JCQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAotCQkJCSAgICAgICBGQ19UWVBFX0VMUywgZl9jdGwsIDApOwotCQkJbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzcCwgZnApOworCQkJZmNfZmlsbF9yZXBseV9oZHIoZnAsIGluX2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCQkJbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKIAkJfQogCX0KIAlmY19mcmFtZV9mcmVlKGluX2ZwKTsKQEAgLTUwMywxNyArNDg3LDE1IEBACiAKIC8qKgogICogZmNfbHBvcnRfcmVjdl9sb2dvX3JlcSgpIC0gSGFuZGxlIHJlY2VpdmVkIGZhYnJpYyBMT0dPIHJlcXVlc3QKLSAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIGluIHRoZSBMT0dPIGV4Y2hhbmdlCi0gKiBAZnA6CSAgIFRoZSBMT0dPIHJlcXVlc3QgZnJhbWUKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgcmVjaWV2aW5nIHRoZSBMT0dPCisgKiBAZnA6CSAgIFRoZSBMT0dPIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9sb2dvX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKLQkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQorc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9sb2dvX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewotCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfQUNDLCBOVUxMKTsKKwlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChmcCwgRUxTX0xTX0FDQywgTlVMTCk7CiAJZmNfbHBvcnRfZW50ZXJfcmVzZXQobHBvcnQpOwogCWZjX2ZyYW1lX2ZyZWUoZnApOwogfQpAQCAtNzU1LDEwICs3MzcsMzcgQEAKIH0KIAogLyoqCisgKiBmY19scG9ydF9zZXRfcG9ydF9pZCgpIC0gc2V0IHRoZSBsb2NhbCBwb3J0IFBvcnQgSUQgZm9yIHBvaW50LXRvLW11bHRpcG9pbnQKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgd2hpY2ggd2lsbCBoYXZlIGl0cyBQb3J0IElEIHNldC4KKyAqIEBwb3J0X2lkOiBUaGUgbmV3IHBvcnQgSUQuCisgKgorICogQ2FsbGVkIGJ5IHRoZSBsb3dlci1sZXZlbCBkcml2ZXIgd2hlbiB0cmFuc3BvcnQgc2V0cyB0aGUgbG9jYWwgcG9ydF9pZC4KKyAqIFRoaXMgaXMgdXNlZCBpbiBWTl9wb3J0IHRvIFZOX3BvcnQgbW9kZSBmb3IgRkNvRSwgYW5kIGNhdXNlcyBGTE9HSSBhbmQKKyAqIGRpc2NvdmVyeSB0byBiZSBza2lwcGVkLgorICovCit2b2lkIGZjX2xwb3J0X3NldF9sb2NhbF9pZChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1MzIgcG9ydF9pZCkKK3sKKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCisJZmNfbHBvcnRfc2V0X3BvcnRfaWQobHBvcnQsIHBvcnRfaWQsIE5VTEwpOworCisJc3dpdGNoIChscG9ydC0+c3RhdGUpIHsKKwljYXNlIExQT1JUX1NUX1JFU0VUOgorCWNhc2UgTFBPUlRfU1RfRkxPR0k6CisJCWlmIChwb3J0X2lkKQorCQkJZmNfbHBvcnRfZW50ZXJfcmVhZHkobHBvcnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChmY19scG9ydF9zZXRfbG9jYWxfaWQpOworCisvKioKICAqIGZjX2xwb3J0X3JlY3ZfZmxvZ2lfcmVxKCkgLSBSZWNlaXZlIGEgRkxPR0kgcmVxdWVzdAotICogQHNwX2luOiBUaGUgc2VxdWVuY2UgdGhlIEZMT0dJIGlzIG9uCi0gKiBAcnhfZnA6IFRoZSBGTE9HSSBmcmFtZQogICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHJlY2lldmVkIHRoZSByZXF1ZXN0CisgKiBAcnhfZnA6IFRoZSBGTE9HSSBmcmFtZQogICoKICAqIEEgcmVjZWl2ZWQgRkxPR0kgcmVxdWVzdCBpbmRpY2F0ZXMgYSBwb2ludC10by1wb2ludCBjb25uZWN0aW9uLgogICogQWNjZXB0IGl0IHdpdGggdGhlIGNvbW1vbiBzZXJ2aWNlIHBhcmFtZXRlcnMgaW5kaWNhdGluZyBvdXIgTiBwb3J0LgpAQCAtNzY3LDI2ICs3NzYsMjEgQEAKICAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9mbG9naV9yZXEoc3RydWN0IGZjX3NlcSAqc3BfaW4sCi0JCQkJICAgIHN0cnVjdCBmY19mcmFtZSAqcnhfZnAsCi0JCQkJICAgIHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCitzdGF0aWMgdm9pZCBmY19scG9ydF9yZWN2X2Zsb2dpX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCSAgICBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQogewogCXN0cnVjdCBmY19mcmFtZSAqZnA7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7Ci0Jc3RydWN0IGZjX3NlcSAqc3A7Ci0Jc3RydWN0IGZjX2V4Y2ggKmVwOwogCXN0cnVjdCBmY19lbHNfZmxvZ2kgKmZscDsKIAlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpuZXdfZmxwOwogCXU2NCByZW1vdGVfd3dwbjsKIAl1MzIgcmVtb3RlX2ZpZDsKIAl1MzIgbG9jYWxfZmlkOwotCXUzMiBmX2N0bDsKIAogCUZDX0xQT1JUX0RCRyhscG9ydCwgIlJlY2VpdmVkIEZMT0dJIHJlcXVlc3Qgd2hpbGUgaW4gc3RhdGUgJXNcbiIsCiAJCSAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKIAotCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChyeF9mcCk7Ci0JcmVtb3RlX2ZpZCA9IG50b2gyNChmaC0+Zmhfc19pZCk7CisJcmVtb3RlX2ZpZCA9IGZjX2ZyYW1lX3NpZChyeF9mcCk7CiAJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQocnhfZnAsIHNpemVvZigqZmxwKSk7CiAJaWYgKCFmbHApCiAJCWdvdG8gb3V0OwpAQCAtODE3LDcgKzgyMSw2IEBACiAKIAlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2YoKmZscCkpOwogCWlmIChmcCkgewotCQlzcCA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChmcl9zZXEocnhfZnApKTsKIAkJbmV3X2ZscCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmZscCkpOwogCQlmY19scG9ydF9mbG9naV9maWxsKGxwb3J0LCBuZXdfZmxwLCBFTFNfRkxPR0kpOwogCQluZXdfZmxwLT5mbF9jbWQgPSAodTgpIEVMU19MU19BQ0M7CkBAIC04MjYsMjcgKzgyOSwyNCBAQAogCQkgKiBTZW5kIHRoZSByZXNwb25zZS4gIElmIHRoaXMgZmFpbHMsIHRoZSBvcmlnaW5hdG9yIHNob3VsZAogCQkgKiByZXBlYXQgdGhlIHNlcXVlbmNlLgogCQkgKi8KLQkJZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVE7Ci0JCWVwID0gZmNfc2VxX2V4Y2goc3ApOwotCQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCByZW1vdGVfZmlkLCBsb2NhbF9maWQsCi0JCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKLQkJbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzcCwgZnApOworCQlmY19maWxsX3JlcGx5X2hkcihmcCwgcnhfZnAsIEZDX1JDVExfRUxTX1JFUCwgMCk7CisJCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJCWh0b24yNChmaC0+Zmhfc19pZCwgbG9jYWxfZmlkKTsKKwkJaHRvbjI0KGZoLT5maF9kX2lkLCByZW1vdGVfZmlkKTsKKwkJbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKIAogCX0gZWxzZSB7CiAJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CiAJfQogCWZjX2xwb3J0X3B0cF9zZXR1cChscG9ydCwgcmVtb3RlX2ZpZCwgcmVtb3RlX3d3cG4sCiAJCQkgICBnZXRfdW5hbGlnbmVkX2JlNjQoJmZscC0+Zmxfd3dubikpOwotCiBvdXQ6Ci0Jc3AgPSBmcl9zZXEocnhfZnApOwogCWZjX2ZyYW1lX2ZyZWUocnhfZnApOwogfQogCiAvKioKICAqIGZjX2xwb3J0X3JlY3ZfcmVxKCkgLSBUaGUgZ2VuZXJpYyBscG9ydCByZXF1ZXN0IGhhbmRsZXIKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCByZWNlaXZlZCB0aGUgcmVxdWVzdAotICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhlIHJlcXVlc3QgaXMgb24KICAqIEBmcDoJICAgVGhlIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VlIGlmIHRoZSBscG9ydCBoYW5kbGVzIHRoZSByZXF1ZXN0IG9yCkBAIC04NTUsMTEgKzg1NSwxMCBAQAogICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggdGhlIGxwb3J0CiAgKgkJIGxvY2sgaGVsZCBiZWN1YXNlIGl0IHdpbGwgZ3JhYiB0aGUgbG9jay4KICAqLwotc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9yZXEoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX3NlcSAqc3AsCi0JCQkgICAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQorc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9yZXEoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKIHsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCXZvaWQgKCpyZWN2KSAoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgc3RydWN0IGZjX2xwb3J0ICopOworCXZvaWQgKCpyZWN2KShzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX2ZyYW1lICopOwogCiAJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKIApAQCAtODc4LDExICs4NzcsMTEgQEAKIAkJcmVjdiA9IGxwb3J0LT50dC5ycG9ydF9yZWN2X3JlcTsKIAkJc3dpdGNoIChmY19mcmFtZV9wYXlsb2FkX29wKGZwKSkgewogCQljYXNlIEVMU19GTE9HSToKLQkJCXJlY3YgPSBmY19scG9ydF9yZWN2X2Zsb2dpX3JlcTsKKwkJCWlmICghbHBvcnQtPnBvaW50X3RvX211bHRpcG9pbnQpCisJCQkJcmVjdiA9IGZjX2xwb3J0X3JlY3ZfZmxvZ2lfcmVxOwogCQkJYnJlYWs7CiAJCWNhc2UgRUxTX0xPR086Ci0JCQlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCQkJaWYgKG50b2gyNChmaC0+Zmhfc19pZCkgPT0gRkNfRklEX0ZMT0dJKQorCQkJaWYgKGZjX2ZyYW1lX3NpZChmcCkgPT0gRkNfRklEX0ZMT0dJKQogCQkJCXJlY3YgPSBmY19scG9ydF9yZWN2X2xvZ29fcmVxOwogCQkJYnJlYWs7CiAJCWNhc2UgRUxTX1JTQ046CkBAIC04OTksMTkgKzg5OCwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyZWN2KHNwLCBmcCwgbHBvcnQpOworCQlyZWN2KGxwb3J0LCBmcCk7CiAJfSBlbHNlIHsKIAkJRkNfTFBPUlRfREJHKGxwb3J0LCAiZHJvcHBpbmcgaW52YWxpZCBmcmFtZSAoZW9mICV4KVxuIiwKIAkJCSAgICAgZnJfZW9mKGZwKSk7CiAJCWZjX2ZyYW1lX2ZyZWUoZnApOwogCX0KIAltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Ci0KLQkvKgotCSAqICBUaGUgY29tbW9uIGV4Y2hfZG9uZSBmb3IgYWxsIHJlcXVlc3QgbWF5IG5vdCBiZSBnb29kCi0JICogIGlmIGFueSByZXF1ZXN0IHJlcXVpcmVzIGxvbmdlciBob2xkIG9uIGV4aGFuZ2UuIFhYWAotCSAqLwotCWxwb3J0LT50dC5leGNoX2RvbmUoc3ApOwogfQogCiAvKioKQEAgLTk1NCw3ICs5NDcsNyBAQAogCWxwb3J0LT50dC5leGNoX21ncl9yZXNldChscG9ydCwgMCwgMCk7CiAJZmNfaG9zdF9mYWJyaWNfbmFtZShscG9ydC0+aG9zdCkgPSAwOwogCi0JaWYgKGxwb3J0LT5wb3J0X2lkKQorCWlmIChscG9ydC0+cG9ydF9pZCAmJiAoIWxwb3J0LT5wb2ludF90b19tdWx0aXBvaW50IHx8ICFscG9ydC0+bGlua191cCkpCiAJCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCAwLCBOVUxMKTsKIH0KIApAQCAtMTAxOSwzOCArMTAxMiwyNCBAQAogCQkgICAgIFBUUl9FUlIoZnApLCBmY19scG9ydF9zdGF0ZShscG9ydCksCiAJCSAgICAgbHBvcnQtPnJldHJ5X2NvdW50KTsKIAotCWlmICghZnAgfHwgUFRSX0VSUihmcCkgPT0gLUZDX0VYX1RJTUVPVVQpIHsKLQkJLyoKLQkJICogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgb3IgdGhlIGV4Y2hhbmdlIHRpbWVkIG91dC4KLQkJICogIFJldHJ5IGFmdGVyIGRlbGF5Ci0JCSAqLwotCQlpZiAobHBvcnQtPnJldHJ5X2NvdW50IDwgbHBvcnQtPm1heF9yZXRyeV9jb3VudCkgewotCQkJbHBvcnQtPnJldHJ5X2NvdW50Kys7Ci0JCQlpZiAoIWZwKQotCQkJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyg1MDApOwotCQkJZWxzZQotCQkJCWRlbGF5ID0JbXNlY3NfdG9famlmZmllcyhscG9ydC0+ZV9kX3Rvdik7CisJaWYgKFBUUl9FUlIoZnApID09IC1GQ19FWF9DTE9TRUQpCisJCXJldHVybjsKIAotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZscG9ydC0+cmV0cnlfd29yaywgZGVsYXkpOwotCQl9IGVsc2UgewotCQkJc3dpdGNoIChscG9ydC0+c3RhdGUpIHsKLQkJCWNhc2UgTFBPUlRfU1RfRElTQUJMRUQ6Ci0JCQljYXNlIExQT1JUX1NUX1JFQURZOgotCQkJY2FzZSBMUE9SVF9TVF9SRVNFVDoKLQkJCWNhc2UgTFBPUlRfU1RfUk5OX0lEOgotCQkJY2FzZSBMUE9SVF9TVF9SU05OX05OOgotCQkJY2FzZSBMUE9SVF9TVF9SU1BOX0lEOgotCQkJY2FzZSBMUE9SVF9TVF9SRlRfSUQ6Ci0JCQljYXNlIExQT1JUX1NUX1JGRl9JRDoKLQkJCWNhc2UgTFBPUlRfU1RfU0NSOgotCQkJY2FzZSBMUE9SVF9TVF9ETlM6Ci0JCQljYXNlIExQT1JUX1NUX0ZMT0dJOgotCQkJY2FzZSBMUE9SVF9TVF9MT0dPOgotCQkJCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKwkvKgorCSAqIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIG9yIHRoZSBleGNoYW5nZSB0aW1lZCBvdXQKKwkgKiBvciB3ZSByZWNlaXZlZCBMU19SSlQuCisJICogUmV0cnkgYWZ0ZXIgZGVsYXkKKwkgKi8KKwlpZiAobHBvcnQtPnJldHJ5X2NvdW50IDwgbHBvcnQtPm1heF9yZXRyeV9jb3VudCkgeworCQlscG9ydC0+cmV0cnlfY291bnQrKzsKKwkJaWYgKCFmcCkKKwkJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyg1MDApOworCQllbHNlCisJCQlkZWxheSA9CW1zZWNzX3RvX2ppZmZpZXMobHBvcnQtPmVfZF90b3YpOworCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbHBvcnQtPnJldHJ5X3dvcmssIGRlbGF5KTsKKwl9IGVsc2UKKwkJZmNfbHBvcnRfZW50ZXJfcmVzZXQobHBvcnQpOwogfQogCiAvKioKQEAgLTE0NDAsNyArMTQxOSw2IEBACiAJCQkgdm9pZCAqbHBfYXJnKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBscF9hcmc7Ci0Jc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJc3RydWN0IGZjX2Vsc19mbG9naSAqZmxwOwogCXUzMiBkaWQ7CiAJdTE2IGNzcF9mbGFnczsKQEAgLTE0NjgsOSArMTQ0NiwxNCBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwotCWRpZCA9IG50b2gyNChmaC0+ZmhfZF9pZCk7Ci0JaWYgKGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApID09IEVMU19MU19BQ0MgJiYgZGlkICE9IDApIHsKKwlkaWQgPSBmY19mcmFtZV9kaWQoZnApOworCisJaWYgKCFkaWQpIHsKKwkJRkNfTFBPUlRfREJHKGxwb3J0LCAiQmFkIEZMT0dJIHJlc3BvbnNlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApID09IEVMU19MU19BQ0MpIHsKIAkJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CiAJCWlmIChmbHApIHsKIAkJCW1mcyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2JiX2RhdGEpICYKQEAgLTE0OTUsNyArMTQ3OCw3IEBACiAJCQkJICAgICAgICJQb3J0ICglNi42eCkgZW50ZXJlZCAiCiAJCQkJICAgICAgICJwb2ludC10by1wb2ludCBtb2RlXG4iLAogCQkJCSAgICAgICBscG9ydC0+aG9zdC0+aG9zdF9ubywgZGlkKTsKLQkJCQlmY19scG9ydF9wdHBfc2V0dXAobHBvcnQsIG50b2gyNChmaC0+Zmhfc19pZCksCisJCQkJZmNfbHBvcnRfcHRwX3NldHVwKGxwb3J0LCBmY19mcmFtZV9zaWQoZnApLAogCQkJCQkJICAgZ2V0X3VuYWxpZ25lZF9iZTY0KAogCQkJCQkJCSAgICZmbHAtPmZsX3d3cG4pLAogCQkJCQkJICAgZ2V0X3VuYWxpZ25lZF9iZTY0KApAQCAtMTUwOSw5ICsxNDkyLDggQEAKIAkJCQlmY19scG9ydF9lbnRlcl9kbnMobHBvcnQpOwogCQkJfQogCQl9Ci0JfSBlbHNlIHsKLQkJRkNfTFBPUlRfREJHKGxwb3J0LCAiQmFkIEZMT0dJIHJlc3BvbnNlXG4iKTsKLQl9CisJfSBlbHNlCisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CiAKIG91dDoKIAlmY19mcmFtZV9mcmVlKGZwKTsKQEAgLTE1MzYsNiArMTUxOCwxMiBAQAogCiAJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX0ZMT0dJKTsKIAorCWlmIChscG9ydC0+cG9pbnRfdG9fbXVsdGlwb2ludCkgeworCQlpZiAobHBvcnQtPnBvcnRfaWQpCisJCQlmY19scG9ydF9lbnRlcl9yZWFkeShscG9ydCk7CisJCXJldHVybjsKKwl9CisKIAlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2Vsc19mbG9naSkpOwogCWlmICghZnApCiAJCXJldHVybiBmY19scG9ydF9lcnJvcihscG9ydCwgZnApOwpAQCAtMTcwMSw4ICsxNjg5LDcgQEAKIAlodG9uMjQoZmgtPmZoX2RfaWQsIGRpZCk7CiAJaHRvbjI0KGZoLT5maF9zX2lkLCBscG9ydC0+cG9ydF9pZCk7CiAJZmgtPmZoX3R5cGUgPSBGQ19UWVBFX0VMUzsKLQlodG9uMjQoZmgtPmZoX2ZfY3RsLCBGQ19GQ19GSVJTVF9TRVEgfAotCSAgICAgICBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQpOworCWh0b24yNChmaC0+ZmhfZl9jdGwsIEZDX0ZDVExfUkVRKTsKIAlmaC0+ZmhfY3NfY3RsID0gMDsKIAlmaC0+ZmhfZGZfY3RsID0gMDsKIAlmaC0+ZmhfcGFybV9vZmZzZXQgPSAwOwpAQCAtMTc2MSw4ICsxNzQ4LDcgQEAKIAlodG9uMjQoZmgtPmZoX2RfaWQsIGRpZCk7CiAJaHRvbjI0KGZoLT5maF9zX2lkLCBscG9ydC0+cG9ydF9pZCk7CiAJZmgtPmZoX3R5cGUgPSBGQ19UWVBFX0NUOwotCWh0b24yNChmaC0+ZmhfZl9jdGwsIEZDX0ZDX0ZJUlNUX1NFUSB8Ci0JICAgICAgIEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCk7CisJaHRvbjI0KGZoLT5maF9mX2N0bCwgRkNfRkNUTF9SRVEpOwogCWZoLT5maF9jc19jdGwgPSAwOwogCWZoLT5maF9kZl9jdGwgPSAwOwogCWZoLT5maF9wYXJtX29mZnNldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfcnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jCmluZGV4IDM5ZTQ0MGYuLmI5ZjIyODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jCkBAIC0zNCw3ICszNCw3IEBACiAgKiBUaGUgcnBvcnQgc2hvdWxkIG5ldmVyIGhvbGQgdGhlIHJwb3J0IG11dGV4IGFuZCB0aGVuIGF0dGVtcHQgdG8gYWNxdWlyZQogICogZWl0aGVyIHRoZSBscG9ydCBvciBkaXNjIG11dGV4ZXMuIFRoZSBycG9ydCdzIG11dGV4IGlzIGNvbnNpZGVyZWQgbGVzc2VyCiAgKiB0aGFuIGJvdGggdGhlIGxwb3J0J3MgbXV0ZXggYW5kIHRoZSBkaXNjIG11dGV4LiBSZWZlciB0byBmY19scG9ydC5jIGZvcgotICogbW9yZSBjb21tZW50cyBvbiB0aGUgaGVpcmFyY2h5LgorICogbW9yZSBjb21tZW50cyBvbiB0aGUgaGllcmFyY2h5LgogICoKICAqIFRoZSBsb2NraW5nIHN0cmF0ZWd5IGlzIHNpbWlsYXIgdG8gdGhlIGxwb3J0J3Mgc3RyYXRlZ3kuIFRoZSBsb2NrIHByb3RlY3RzCiAgKiB0aGUgcnBvcnQncyBzdGF0ZXMgYW5kIGlzIGhlbGQgYW5kIHJlbGVhc2VkIGJ5IHRoZSBlbnRyeSBwb2ludHMgdG8gdGhlIHJwb3J0CkBAIC02MCw2ICs2MCw3IEBACiAKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpycG9ydF9ldmVudF9xdWV1ZTsKIAorc3RhdGljIHZvaWQgZmNfcnBvcnRfZW50ZXJfZmxvZ2koc3RydWN0IGZjX3Jwb3J0X3ByaXYgKik7CiBzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9wbG9naShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqKTsKIHN0YXRpYyB2b2lkIGZjX3Jwb3J0X2VudGVyX3BybGkoc3RydWN0IGZjX3Jwb3J0X3ByaXYgKik7CiBzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9ydHYoc3RydWN0IGZjX3Jwb3J0X3ByaXYgKik7CkBAIC02NywxNCArNjgsMTAgQEAKIHN0YXRpYyB2b2lkIGZjX3Jwb3J0X2VudGVyX2xvZ28oc3RydWN0IGZjX3Jwb3J0X3ByaXYgKik7CiBzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9hZGlzYyhzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqKTsKIAotc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEoc3RydWN0IGZjX2xwb3J0ICosCi0JCQkJICAgIHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOwotc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wcmxpX3JlcShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqLAotCQkJCSAgIHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOwotc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wcmxvX3JlcShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqLAotCQkJCSAgIHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOwotc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9sb2dvX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKiwKLQkJCQkgICBzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqKTsKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3JlY3ZfcGxvZ2lfcmVxKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X3BybGlfcmVxKHN0cnVjdCBmY19ycG9ydF9wcml2ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3JlY3ZfcHJsb19yZXEoc3RydWN0IGZjX3Jwb3J0X3ByaXYgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9sb2dvX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX2ZyYW1lICopOwogc3RhdGljIHZvaWQgZmNfcnBvcnRfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiBzdGF0aWMgdm9pZCBmY19ycG9ydF9lcnJvcihzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CiBzdGF0aWMgdm9pZCBmY19ycG9ydF9lcnJvcl9yZXRyeShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CkBAIC04MiwyNyArNzksMjkgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZjX3Jwb3J0X3N0YXRlX25hbWVzW10gPSB7CiAJW1JQT1JUX1NUX0lOSVRdID0gIkluaXQiLAorCVtSUE9SVF9TVF9GTE9HSV0gPSAiRkxPR0kiLAorCVtSUE9SVF9TVF9QTE9HSV9XQUlUXSA9ICJQTE9HSV9XQUlUIiwKIAlbUlBPUlRfU1RfUExPR0ldID0gIlBMT0dJIiwKIAlbUlBPUlRfU1RfUFJMSV0gPSAiUFJMSSIsCiAJW1JQT1JUX1NUX1JUVl0gPSAiUlRWIiwKIAlbUlBPUlRfU1RfUkVBRFldID0gIlJlYWR5IiwKLQlbUlBPUlRfU1RfTE9HT10gPSAiTE9HTyIsCiAJW1JQT1JUX1NUX0FESVNDXSA9ICJBRElTQyIsCiAJW1JQT1JUX1NUX0RFTEVURV0gPSAiRGVsZXRlIiwKLQlbUlBPUlRfU1RfUkVTVEFSVF0gPSAiUmVzdGFydCIsCiB9OwogCiAvKioKICAqIGZjX3Jwb3J0X2xvb2t1cCgpIC0gTG9va3VwIGEgcmVtb3RlIHBvcnQgYnkgcG9ydF9pZAogICogQGxwb3J0OiAgIFRoZSBsb2NhbCBwb3J0IHRvIGxvb2t1cCB0aGUgcmVtb3RlIHBvcnQgb24KICAqIEBwb3J0X2lkOiBUaGUgcmVtb3RlIHBvcnQgSUQgdG8gbG9vayB1cAorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIGVpdGhlciBkaXNjX211dGV4IG9yIHJjdV9yZWFkX2xvY2soKS4KICAqLwogc3RhdGljIHN0cnVjdCBmY19ycG9ydF9wcml2ICpmY19ycG9ydF9sb29rdXAoY29uc3Qgc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKIAkJCQkJICAgICB1MzIgcG9ydF9pZCkKIHsKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkYXRhLCAmbHBvcnQtPmRpc2MucnBvcnRzLCBwZWVycykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGF0YSwgJmxwb3J0LT5kaXNjLnJwb3J0cywgcGVlcnMpCiAJCWlmIChyZGF0YS0+aWRzLnBvcnRfaWQgPT0gcG9ydF9pZCkKIAkJCXJldHVybiByZGF0YTsKIAlyZXR1cm4gTlVMTDsKQEAgLTEyNiw3ICsxMjUsNyBAQAogCWlmIChyZGF0YSkKIAkJcmV0dXJuIHJkYXRhOwogCi0JcmRhdGEgPSBremFsbG9jKHNpemVvZigqcmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlyZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpyZGF0YSkgKyBscG9ydC0+cnBvcnRfcHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJkYXRhKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTQ3LDExICsxNDYsMjMgQEAKIAlJTklUX0RFTEFZRURfV09SSygmcmRhdGEtPnJldHJ5X3dvcmssIGZjX3Jwb3J0X3RpbWVvdXQpOwogCUlOSVRfV09SSygmcmRhdGEtPmV2ZW50X3dvcmssIGZjX3Jwb3J0X3dvcmspOwogCWlmIChwb3J0X2lkICE9IEZDX0ZJRF9ESVJfU0VSVikKLQkJbGlzdF9hZGQoJnJkYXRhLT5wZWVycywgJmxwb3J0LT5kaXNjLnJwb3J0cyk7CisJCWxpc3RfYWRkX3JjdSgmcmRhdGEtPnBlZXJzLCAmbHBvcnQtPmRpc2MucnBvcnRzKTsKIAlyZXR1cm4gcmRhdGE7CiB9CiAKIC8qKgorICogZmNfcnBvcnRfZnJlZV9yY3UoKSAtIEZyZWUgYSByZW1vdGUgcG9ydAorICogQHJjdTogVGhlIHJjdV9oZWFkIHN0cnVjdHVyZSBpbnNpZGUgdGhlIHJlbW90ZSBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKKworCXJkYXRhID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGZjX3Jwb3J0X3ByaXYsIHJjdSk7CisJa2ZyZWUocmRhdGEpOworfQorCisvKioKICAqIGZjX3Jwb3J0X2Rlc3Ryb3koKSAtIEZyZWUgYSByZW1vdGUgcG9ydCBhZnRlciBsYXN0IHJlZmVyZW5jZSBpcyByZWxlYXNlZAogICogQGtyZWY6IFRoZSByZW1vdGUgcG9ydCdzIGtyZWYKICAqLwpAQCAtMTYwLDcgKzE3MSw3IEBACiAJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOwogCiAJcmRhdGEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGZjX3Jwb3J0X3ByaXYsIGtyZWYpOwotCWtmcmVlKHJkYXRhKTsKKwljYWxsX3JjdSgmcmRhdGEtPnJjdSwgZmNfcnBvcnRfZnJlZV9yY3UpOwogfQogCiAvKioKQEAgLTE5NCw3ICsyMDUsNyBAQAogLyoqCiAgKiBmY19wbG9naV9nZXRfbWF4ZnJhbWUoKSAtIEdldCB0aGUgbWF4aW11bSBwYXlsb2FkIGZyb20gdGhlIGNvbW1vbiBzZXJ2aWNlCiAgKgkJCSAgICAgcGFyYW1ldGVycyBpbiBhIEZMT0dJIGZyYW1lCi0gKiBAZmxwOiAgICBUaGUgRkxPR0kgcGF5bG9hZAorICogQGZscDogICAgVGhlIEZMT0dJIG9yIFBMT0dJIHBheWxvYWQKICAqIEBtYXh2YWw6IFRoZSBtYXhpbXVtIGZyYW1lIHNpemUgdXBwZXIgbGltaXQ7IHRoaXMgbWF5IGJlIGxlc3MgdGhhbiB3aGF0CiAgKgkgICAgaXMgaW4gdGhlIHNlcnZpY2UgcGFyYW1ldGVycwogICovCkBAIC0yNDYsNyArMjU3LDYgQEAKIAlzdHJ1Y3QgZmNfcnBvcnRfb3BlcmF0aW9ucyAqcnBvcnRfb3BzOwogCXN0cnVjdCBmY19ycG9ydF9pZGVudGlmaWVycyBpZHM7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKLQlpbnQgcmVzdGFydCA9IDA7CiAKIAltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCWV2ZW50ID0gcmRhdGEtPmV2ZW50OwpAQCAtMjU5LDYgKzI2OSw3IEBACiAJY2FzZSBSUE9SVF9FVl9SRUFEWToKIAkJaWRzID0gcmRhdGEtPmlkczsKIAkJcmRhdGEtPmV2ZW50ID0gUlBPUlRfRVZfTk9ORTsKKwkJcmRhdGEtPm1ham9yX3JldHJpZXMgPSAwOwogCQlrcmVmX2dldCgmcmRhdGEtPmtyZWYpOwogCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CiAKQEAgLTI5OCwyNCArMzA5LDYgQEAKIAkJcG9ydF9pZCA9IHJkYXRhLT5pZHMucG9ydF9pZDsKIAkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCi0JCWlmIChwb3J0X2lkICE9IEZDX0ZJRF9ESVJfU0VSVikgewotCQkJLyoKLQkJCSAqIFdlIG11c3QgZHJvcCBycF9tdXRleCBiZWZvcmUgdGFraW5nIGRpc2NfbXV0ZXguCi0JCQkgKiBSZS1ldmFsdWF0ZSBzdGF0ZSB0byBhbGxvdyBmb3IgcmVzdGFydC4KLQkJCSAqIEEgdHJhbnNpdGlvbiB0byBSRVNUQVJUIHN0YXRlIG11c3Qgb25seSBoYXBwZW4KLQkJCSAqIHdoaWxlIGRpc2NfbXV0ZXggaXMgaGVsZCBhbmQgcmRhdGEgaXMgb24gdGhlIGxpc3QuCi0JCQkgKi8KLQkJCW11dGV4X2xvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOwotCQkJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKLQkJCWlmIChyZGF0YS0+cnBfc3RhdGUgPT0gUlBPUlRfU1RfUkVTVEFSVCkKLQkJCQlyZXN0YXJ0ID0gMTsKLQkJCWVsc2UKLQkJCQlsaXN0X2RlbCgmcmRhdGEtPnBlZXJzKTsKLQkJCXJkYXRhLT5ldmVudCA9IFJQT1JUX0VWX05PTkU7Ci0JCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7Ci0JCQltdXRleF91bmxvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOwotCQl9Ci0KIAkJaWYgKHJwb3J0X29wcyAmJiBycG9ydF9vcHMtPmV2ZW50X2NhbGxiYWNrKSB7CiAJCQlGQ19SUE9SVF9EQkcocmRhdGEsICJjYWxsYmFjayBldiAlZFxuIiwgZXZlbnQpOwogCQkJcnBvcnRfb3BzLT5ldmVudF9jYWxsYmFjayhscG9ydCwgcmRhdGEsIGV2ZW50KTsKQEAgLTMzNiwxMyArMzI5LDM3IEBACiAJCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CiAJCQlmY19yZW1vdGVfcG9ydF9kZWxldGUocnBvcnQpOwogCQl9Ci0JCWlmIChyZXN0YXJ0KSB7Ci0JCQltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwotCQkJRkNfUlBPUlRfREJHKHJkYXRhLCAid29yayByZXN0YXJ0XG4iKTsKLQkJCWZjX3Jwb3J0X2VudGVyX3Bsb2dpKHJkYXRhKTsKKworCQltdXRleF9sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKKwkJaWYgKHJkYXRhLT5ycF9zdGF0ZSA9PSBSUE9SVF9TVF9ERUxFVEUpIHsKKwkJCWlmIChwb3J0X2lkID09IEZDX0ZJRF9ESVJfU0VSVikgeworCQkJCXJkYXRhLT5ldmVudCA9IFJQT1JUX0VWX05PTkU7CisJCQkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCQkJfSBlbHNlIGlmICgocmRhdGEtPmZsYWdzICYgRkNfUlBfU1RBUlRFRCkgJiYKKwkJCQkgICByZGF0YS0+bWFqb3JfcmV0cmllcyA8CisJCQkJICAgbHBvcnQtPm1heF9ycG9ydF9yZXRyeV9jb3VudCkgeworCQkJCXJkYXRhLT5tYWpvcl9yZXRyaWVzKys7CisJCQkJcmRhdGEtPmV2ZW50ID0gUlBPUlRfRVZfTk9ORTsKKwkJCQlGQ19SUE9SVF9EQkcocmRhdGEsICJ3b3JrIHJlc3RhcnRcbiIpOworCQkJCWZjX3Jwb3J0X2VudGVyX2Zsb2dpKHJkYXRhKTsKKwkJCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisJCQl9IGVsc2UgeworCQkJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIndvcmsgZGVsZXRlXG4iKTsKKwkJCQlsaXN0X2RlbF9yY3UoJnJkYXRhLT5wZWVycyk7CisJCQkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCQkJCWtyZWZfcHV0KCZyZGF0YS0+a3JlZiwgbHBvcnQtPnR0LnJwb3J0X2Rlc3Ryb3kpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlLW9wZW4gZm9yIGV2ZW50cy4gIFJlaXNzdWUgUkVBRFkgZXZlbnQgaWYgcmVhZHkuCisJCQkgKi8KKwkJCXJkYXRhLT5ldmVudCA9IFJQT1JUX0VWX05PTkU7CisJCQlpZiAocmRhdGEtPnJwX3N0YXRlID09IFJQT1JUX1NUX1JFQURZKQorCQkJCWZjX3Jwb3J0X2VudGVyX3JlYWR5KHJkYXRhKTsKIAkJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKLQkJfSBlbHNlCi0JCQlrcmVmX3B1dCgmcmRhdGEtPmtyZWYsIGxwb3J0LT50dC5ycG9ydF9kZXN0cm95KTsKKwkJfQorCQltdXRleF91bmxvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zNjcsMjAgKzM4NCwxOCBAQAogewogCW11dGV4X2xvY2soJnJkYXRhLT5ycF9tdXRleCk7CiAKKwlyZGF0YS0+ZmxhZ3MgfD0gRkNfUlBfU1RBUlRFRDsKIAlzd2l0Y2ggKHJkYXRhLT5ycF9zdGF0ZSkgewogCWNhc2UgUlBPUlRfU1RfUkVBRFk6CiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIkFESVNDIHBvcnRcbiIpOwogCQlmY19ycG9ydF9lbnRlcl9hZGlzYyhyZGF0YSk7CiAJCWJyZWFrOwotCWNhc2UgUlBPUlRfU1RfUkVTVEFSVDoKLQkJYnJlYWs7CiAJY2FzZSBSUE9SVF9TVF9ERUxFVEU6CiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlc3RhcnQgZGVsZXRlZCBwb3J0XG4iKTsKLQkJZmNfcnBvcnRfc3RhdGVfZW50ZXIocmRhdGEsIFJQT1JUX1NUX1JFU1RBUlQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlGQ19SUE9SVF9EQkcocmRhdGEsICJMb2dpbiB0byBwb3J0XG4iKTsKLQkJZmNfcnBvcnRfZW50ZXJfcGxvZ2kocmRhdGEpOworCQlmY19ycG9ydF9lbnRlcl9mbG9naShyZGF0YSk7CiAJCWJyZWFrOwogCX0KIAltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CkBAIC00MzEsMTUgKzQ0NiwxMiBAQAogCiAJRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVtb3ZlIHBvcnRcbiIpOwogCisJcmRhdGEtPmZsYWdzICY9IH5GQ19SUF9TVEFSVEVEOwogCWlmIChyZGF0YS0+cnBfc3RhdGUgPT0gUlBPUlRfU1RfREVMRVRFKSB7CiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlBvcnQgaW4gRGVsZXRlIHN0YXRlLCBub3QgcmVtb3ZpbmdcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0KLQlpZiAocmRhdGEtPnJwX3N0YXRlID09IFJQT1JUX1NUX1JFU1RBUlQpCi0JCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlBvcnQgaW4gUmVzdGFydCBzdGF0ZSwgZGVsZXRpbmdcbiIpOwotCWVsc2UKLQkJZmNfcnBvcnRfZW50ZXJfbG9nbyhyZGF0YSk7CisJZmNfcnBvcnRfZW50ZXJfbG9nbyhyZGF0YSk7CiAKIAkvKgogCSAqIENoYW5nZSB0aGUgc3RhdGUgdG8gRGVsZXRlIHNvIHRoYXQgd2UgZGlzY2FyZApAQCAtNDg1LDYgKzQ5Nyw5IEBACiAJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAogCXN3aXRjaCAocmRhdGEtPnJwX3N0YXRlKSB7CisJY2FzZSBSUE9SVF9TVF9GTE9HSToKKwkJZmNfcnBvcnRfZW50ZXJfZmxvZ2kocmRhdGEpOworCQlicmVhazsKIAljYXNlIFJQT1JUX1NUX1BMT0dJOgogCQlmY19ycG9ydF9lbnRlcl9wbG9naShyZGF0YSk7CiAJCWJyZWFrOwpAQCAtNDk0LDE2ICs1MDksMTMgQEAKIAljYXNlIFJQT1JUX1NUX1JUVjoKIAkJZmNfcnBvcnRfZW50ZXJfcnR2KHJkYXRhKTsKIAkJYnJlYWs7Ci0JY2FzZSBSUE9SVF9TVF9MT0dPOgotCQlmY19ycG9ydF9lbnRlcl9sb2dvKHJkYXRhKTsKLQkJYnJlYWs7CiAJY2FzZSBSUE9SVF9TVF9BRElTQzoKIAkJZmNfcnBvcnRfZW50ZXJfYWRpc2MocmRhdGEpOwogCQlicmVhazsKKwljYXNlIFJQT1JUX1NUX1BMT0dJX1dBSVQ6CiAJY2FzZSBSUE9SVF9TVF9SRUFEWToKIAljYXNlIFJQT1JUX1NUX0lOSVQ6CiAJY2FzZSBSUE9SVF9TVF9ERUxFVEU6Ci0JY2FzZSBSUE9SVF9TVF9SRVNUQVJUOgogCQlicmVhazsKIAl9CiAKQEAgLTUyNSw4ICs1MzcsOSBAQAogCQkgICAgIGZjX3Jwb3J0X3N0YXRlKHJkYXRhKSwgcmRhdGEtPnJldHJpZXMpOwogCiAJc3dpdGNoIChyZGF0YS0+cnBfc3RhdGUpIHsKKwljYXNlIFJQT1JUX1NUX0ZMT0dJOgogCWNhc2UgUlBPUlRfU1RfUExPR0k6Ci0JY2FzZSBSUE9SVF9TVF9MT0dPOgorCQlyZGF0YS0+ZmxhZ3MgJj0gfkZDX1JQX1NUQVJURUQ7CiAJCWZjX3Jwb3J0X2VudGVyX2RlbGV0ZShyZGF0YSwgUlBPUlRfRVZfRkFJTEVEKTsKIAkJYnJlYWs7CiAJY2FzZSBSUE9SVF9TVF9SVFY6CkBAIC01MzYsOCArNTQ5LDggQEAKIAljYXNlIFJQT1JUX1NUX0FESVNDOgogCQlmY19ycG9ydF9lbnRlcl9sb2dvKHJkYXRhKTsKIAkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9QTE9HSV9XQUlUOgogCWNhc2UgUlBPUlRfU1RfREVMRVRFOgotCWNhc2UgUlBPUlRfU1RfUkVTVEFSVDoKIAljYXNlIFJQT1JUX1NUX1JFQURZOgogCWNhc2UgUlBPUlRfU1RfSU5JVDoKIAkJYnJlYWs7CkBAIC01NzksNyArNTkyLDI1MCBAQAogfQogCiAvKioKLSAqIGZjX3Jwb3J0X3Bsb2dpX3JlY3ZfcmVzcCgpIC0gSGFuZGxlciBmb3IgRUxTIFBMT0dJIHJlc3BvbnNlcworICogZmNfcnBvcnRfbG9naW5fY29tcGxldGUoKSAtIEhhbmRsZSBwYXJhbWV0ZXJzIGFuZCBjb21wbGV0aW9uIG9mIHAtbXAgbG9naW4uCisgKiBAcmRhdGE6ICBUaGUgcmVtb3RlIHBvcnQgd2hpY2ggd2UgbG9nZ2VkIGludG8gb3Igd2hpY2ggbG9nZ2VkIGludG8gdXMuCisgKiBAZnA6ICAgICBUaGUgRkxPR0kgb3IgUExPR0kgcmVxdWVzdCBvciByZXNwb25zZSBmcmFtZQorICoKKyAqIFJldHVybnMgbm9uLXplcm8gZXJyb3IgaWYgYSBwcm9ibGVtIGlzIGRldGVjdGVkIHdpdGggdGhlIGZyYW1lLgorICogRG9lcyBub3QgZnJlZSB0aGUgZnJhbWUuCisgKgorICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gcG9pbnQtdG8tbXVsdGlwb2ludCBtb2RlIGZvciBGSVAgY3VycmVudGx5LgorICovCitzdGF0aWMgaW50IGZjX3Jwb3J0X2xvZ2luX2NvbXBsZXRlKHN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSwKKwkJCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKKwlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpmbG9naTsKKwl1bnNpZ25lZCBpbnQgZV9kX3RvdjsKKwl1MTYgY3NwX2ZsYWdzOworCisJZmxvZ2kgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpmbG9naSkpOworCWlmICghZmxvZ2kpCisJCXJldHVybiAtRUlOVkFMOworCisJY3NwX2ZsYWdzID0gbnRvaHMoZmxvZ2ktPmZsX2NzcC5zcF9mZWF0dXJlcyk7CisKKwlpZiAoZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkgPT0gRUxTX0ZMT0dJKSB7CisJCWlmIChjc3BfZmxhZ3MgJiBGQ19TUF9GVF9GUE9SVCkgeworCQkJRkNfUlBPUlRfREJHKHJkYXRhLCAiRmFicmljIGJpdCBzZXQgaW4gRkxPR0lcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCisJCS8qCisJCSAqIEVfRF9UT1YgaXMgbm90IHZhbGlkIG9uIGFuIGluY29taW5nIEZMT0dJIHJlcXVlc3QuCisJCSAqLworCQllX2RfdG92ID0gbnRvaGwoZmxvZ2ktPmZsX2NzcC5zcF9lX2RfdG92KTsKKwkJaWYgKGNzcF9mbGFncyAmIEZDX1NQX0ZUX0VEVFIpCisJCQllX2RfdG92IC89IDEwMDAwMDA7CisJCWlmIChlX2RfdG92ID4gcmRhdGEtPmVfZF90b3YpCisJCQlyZGF0YS0+ZV9kX3RvdiA9IGVfZF90b3Y7CisJfQorCXJkYXRhLT5tYXhmcmFtZV9zaXplID0gZmNfcGxvZ2lfZ2V0X21heGZyYW1lKGZsb2dpLCBscG9ydC0+bWZzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmY19ycG9ydF9mbG9naV9yZXNwKCkgLSBIYW5kbGUgcmVzcG9uc2UgdG8gRkxPR0kgcmVxdWVzdCBmb3IgcC1tcCBtb2RlCisgKiBAc3A6CSAgICBUaGUgc2VxdWVuY2UgdGhhdCB0aGUgRkxPR0kgd2FzIG9uCisgKiBAZnA6CSAgICBUaGUgRkxPR0kgcmVzcG9uc2UgZnJhbWUKKyAqIEBycF9hcmc6IFRoZSByZW1vdGUgcG9ydCB0aGF0IHJlY2VpdmVkIHRoZSBGTE9HSSByZXNwb25zZQorICovCit2b2lkIGZjX3Jwb3J0X2Zsb2dpX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkgdm9pZCAqcnBfYXJnKQoreworCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSA9IHJwX2FyZzsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGZjX2Vsc19mbG9naSAqZmxvZ2k7CisJdW5zaWduZWQgaW50IHJfYV90b3Y7CisKKwlGQ19SUE9SVF9EQkcocmRhdGEsICJSZWNlaXZlZCBhIEZMT0dJICVzXG4iLCBmY19lbHNfcmVzcF90eXBlKGZwKSk7CisKKwlpZiAoZnAgPT0gRVJSX1BUUigtRkNfRVhfQ0xPU0VEKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKKworCWlmIChyZGF0YS0+cnBfc3RhdGUgIT0gUlBPUlRfU1RfRkxPR0kpIHsKKwkJRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVjZWl2ZWQgYSBGTE9HSSByZXNwb25zZSwgYnV0IGluIHN0YXRlICIKKwkJCSAgICAgIiVzXG4iLCBmY19ycG9ydF9zdGF0ZShyZGF0YSkpOworCQlpZiAoSVNfRVJSKGZwKSkKKwkJCWdvdG8gZXJyOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19ycG9ydF9lcnJvcihyZGF0YSwgZnApOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkgIT0gRUxTX0xTX0FDQykKKwkJZ290byBiYWQ7CisJaWYgKGZjX3Jwb3J0X2xvZ2luX2NvbXBsZXRlKHJkYXRhLCBmcCkpCisJCWdvdG8gYmFkOworCisJZmxvZ2kgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpmbG9naSkpOworCWlmICghZmxvZ2kpCisJCWdvdG8gYmFkOworCXJfYV90b3YgPSBudG9obChmbG9naS0+ZmxfY3NwLnNwX3JfYV90b3YpOworCWlmIChyX2FfdG92ID4gcmRhdGEtPnJfYV90b3YpCisJCXJkYXRhLT5yX2FfdG92ID0gcl9hX3RvdjsKKworCWlmIChyZGF0YS0+aWRzLnBvcnRfbmFtZSA8IGxwb3J0LT53d3BuKQorCQlmY19ycG9ydF9lbnRlcl9wbG9naShyZGF0YSk7CisJZWxzZQorCQlmY19ycG9ydF9zdGF0ZV9lbnRlcihyZGF0YSwgUlBPUlRfU1RfUExPR0lfV0FJVCk7CitvdXQ6CisJZmNfZnJhbWVfZnJlZShmcCk7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCWtyZWZfcHV0KCZyZGF0YS0+a3JlZiwgcmRhdGEtPmxvY2FsX3BvcnQtPnR0LnJwb3J0X2Rlc3Ryb3kpOworCXJldHVybjsKK2JhZDoKKwlGQ19SUE9SVF9EQkcocmRhdGEsICJCYWQgRkxPR0kgcmVzcG9uc2VcbiIpOworCWZjX3Jwb3J0X2Vycm9yX3JldHJ5KHJkYXRhLCBmcCk7CisJZ290byBvdXQ7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZW50ZXJfZmxvZ2koKSAtIFNlbmQgYSBGTE9HSSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgcG9ydCBmb3IgcC1tcAorICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdG8gc2VuZCBhIEZMT0dJIHRvCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2VudGVyX2Zsb2dpKHN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKworCWlmICghbHBvcnQtPnBvaW50X3RvX211bHRpcG9pbnQpCisJCXJldHVybiBmY19ycG9ydF9lbnRlcl9wbG9naShyZGF0YSk7CisKKwlGQ19SUE9SVF9EQkcocmRhdGEsICJFbnRlcmVkIEZMT0dJIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCisJCSAgICAgZmNfcnBvcnRfc3RhdGUocmRhdGEpKTsKKworCWZjX3Jwb3J0X3N0YXRlX2VudGVyKHJkYXRhLCBSUE9SVF9TVF9GTE9HSSk7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2Vsc19mbG9naSkpOworCWlmICghZnApCisJCXJldHVybiBmY19ycG9ydF9lcnJvcl9yZXRyeShyZGF0YSwgZnApOworCisJaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgcmRhdGEtPmlkcy5wb3J0X2lkLCBmcCwgRUxTX0ZMT0dJLAorCQkJCSAgZmNfcnBvcnRfZmxvZ2lfcmVzcCwgcmRhdGEsCisJCQkJICAyICogbHBvcnQtPnJfYV90b3YpKQorCQlmY19ycG9ydF9lcnJvcl9yZXRyeShyZGF0YSwgTlVMTCk7CisJZWxzZQorCQlrcmVmX2dldCgmcmRhdGEtPmtyZWYpOworfQorCisvKioKKyAqIGZjX3Jwb3J0X3JlY3ZfZmxvZ2lfcmVxKCkgLSBIYW5kbGUgRmFicmljIExvZ2luIChGTE9HSSkgcmVxdWVzdCBpbiBwLW1wIG1vZGUKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCByZWNlaXZlZCB0aGUgUExPR0kgcmVxdWVzdAorICogQHJ4X2ZwOiBUaGUgUExPR0kgcmVxdWVzdCBmcmFtZQorICovCitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X2Zsb2dpX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCSAgICBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQoreworCXN0cnVjdCBmY19kaXNjICpkaXNjOworCXN0cnVjdCBmY19lbHNfZmxvZ2kgKmZscDsKKwlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CisJc3RydWN0IGZjX2ZyYW1lICpmcCA9IHJ4X2ZwOworCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgcmp0X2RhdGE7CisJdTMyIHNpZDsKKworCXNpZCA9IGZjX2ZyYW1lX3NpZChmcCk7CisKKwlGQ19SUE9SVF9JRF9EQkcobHBvcnQsIHNpZCwgIlJlY2VpdmVkIEZMT0dJIHJlcXVlc3RcbiIpOworCisJZGlzYyA9ICZscG9ydC0+ZGlzYzsKKwltdXRleF9sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKKworCWlmICghbHBvcnQtPnBvaW50X3RvX211bHRpcG9pbnQpIHsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9VTlNVUDsKKwkJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfTk9ORTsKKwkJZ290byByZWplY3Q7CisJfQorCisJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CisJaWYgKCFmbHApIHsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9MT0dJQzsKKwkJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfSU5WX0xFTjsKKwkJZ290byByZWplY3Q7CisJfQorCisJcmRhdGEgPSBscG9ydC0+dHQucnBvcnRfbG9va3VwKGxwb3J0LCBzaWQpOworCWlmICghcmRhdGEpIHsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9GSVA7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PVF9ORUlHSEJPUjsKKwkJZ290byByZWplY3Q7CisJfQorCW11dGV4X2xvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwlGQ19SUE9SVF9EQkcocmRhdGEsICJSZWNlaXZlZCBGTE9HSSBpbiAlcyBzdGF0ZVxuIiwKKwkJICAgICBmY19ycG9ydF9zdGF0ZShyZGF0YSkpOworCisJc3dpdGNoIChyZGF0YS0+cnBfc3RhdGUpIHsKKwljYXNlIFJQT1JUX1NUX0lOSVQ6CisJY2FzZSBSUE9SVF9TVF9ERUxFVEU6CisJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9GSVA7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PVF9ORUlHSEJPUjsKKwkJZ290byByZWplY3Q7CisJY2FzZSBSUE9SVF9TVF9GTE9HSToKKwljYXNlIFJQT1JUX1NUX1BMT0dJX1dBSVQ6CisJY2FzZSBSUE9SVF9TVF9QTE9HSToKKwkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9QUkxJOgorCWNhc2UgUlBPUlRfU1RfUlRWOgorCWNhc2UgUlBPUlRfU1RfUkVBRFk6CisJY2FzZSBSUE9SVF9TVF9BRElTQzoKKwkJLyoKKwkJICogU2V0IHRoZSByZW1vdGUgcG9ydCB0byBiZSBkZWxldGVkIGFuZCB0byB0aGVuIHJlc3RhcnQuCisJCSAqIFRoaXMgcXVldWVzIHdvcmsgdG8gYmUgc3VyZSBleGNoYW5nZXMgYXJlIHJlc2V0LgorCQkgKi8KKwkJZmNfcnBvcnRfZW50ZXJfZGVsZXRlKHJkYXRhLCBSUE9SVF9FVl9MT0dPKTsKKwkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCQlyanRfZGF0YS5yZWFzb24gPSBFTFNfUkpUX0JVU1k7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PTkU7CisJCWdvdG8gcmVqZWN0OworCX0KKwlpZiAoZmNfcnBvcnRfbG9naW5fY29tcGxldGUocmRhdGEsIGZwKSkgeworCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisJCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfTE9HSUM7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PTkU7CisJCWdvdG8gcmVqZWN0OworCX0KKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqZmxwKSk7CisJaWYgKCFmcCkKKwkJZ290byBvdXQ7CisKKwlmY19mbG9naV9maWxsKGxwb3J0LCBmcCk7CisJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CisJZmxwLT5mbF9jbWQgPSBFTFNfTFNfQUNDOworCisJZmNfZmlsbF9yZXBseV9oZHIoZnAsIHJ4X2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCWxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CisKKwlpZiAocmRhdGEtPmlkcy5wb3J0X25hbWUgPCBscG9ydC0+d3dwbikKKwkJZmNfcnBvcnRfZW50ZXJfcGxvZ2kocmRhdGEpOworCWVsc2UKKwkJZmNfcnBvcnRfc3RhdGVfZW50ZXIocmRhdGEsIFJQT1JUX1NUX1BMT0dJX1dBSVQpOworb3V0OgorCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKKwltdXRleF91bmxvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworCWZjX2ZyYW1lX2ZyZWUocnhfZnApOworCXJldHVybjsKKworcmVqZWN0OgorCW11dGV4X3VubG9jaygmZGlzYy0+ZGlzY19tdXRleCk7CisJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQocnhfZnAsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CisJZmNfZnJhbWVfZnJlZShyeF9mcCk7Cit9CisKKy8qKgorICogZmNfcnBvcnRfcGxvZ2lfcmVzcCgpIC0gSGFuZGxlciBmb3IgRUxTIFBMT0dJIHJlc3BvbnNlcwogICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBQTE9HSSBpcyBvbgogICogQGZwOgkgICAgICAgVGhlIFBMT0dJIHJlc3BvbnNlIGZyYW1lCiAgKiBAcmRhdGFfYXJnOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBQTE9HSSByZXNwb25zZQpAQCAtNTk0LDcgKzg1MCw2IEBACiAJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhID0gcmRhdGFfYXJnOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKIAlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpwbHAgPSBOVUxMOwotCXVuc2lnbmVkIGludCB0b3Y7CiAJdTE2IGNzcF9zZXE7CiAJdTE2IGNzc3Bfc2VxOwogCXU4IG9wOwpAQCAtNjIyLDExICs4NzcsOCBAQAogCQlyZGF0YS0+aWRzLnBvcnRfbmFtZSA9IGdldF91bmFsaWduZWRfYmU2NCgmcGxwLT5mbF93d3BuKTsKIAkJcmRhdGEtPmlkcy5ub2RlX25hbWUgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJnBscC0+Zmxfd3dubik7CiAKLQkJdG92ID0gbnRvaGwocGxwLT5mbF9jc3Auc3BfZV9kX3Rvdik7Ci0JCWlmIChudG9ocyhwbHAtPmZsX2NzcC5zcF9mZWF0dXJlcykgJiBGQ19TUF9GVF9FRFRSKQotCQkJdG92IC89IDEwMDAwMDA7Ci0JCWlmICh0b3YgPiByZGF0YS0+ZV9kX3RvdikKLQkJCXJkYXRhLT5lX2RfdG92ID0gdG92OworCQlpZiAobHBvcnQtPnBvaW50X3RvX211bHRpcG9pbnQpCisJCQlmY19ycG9ydF9sb2dpbl9jb21wbGV0ZShyZGF0YSwgZnApOwogCQljc3Bfc2VxID0gbnRvaHMocGxwLT5mbF9jc3Auc3BfdG90X3NlcSk7CiAJCWNzc3Bfc2VxID0gbnRvaHMocGxwLT5mbF9jc3NwWzMgLSAxXS5jcF9jb25fc2VxKTsKIAkJaWYgKGNzc3Bfc2VxIDwgY3NwX3NlcSkKQEAgLTY2NCw2ICs5MTYsNyBAQAogCXJkYXRhLT5tYXhmcmFtZV9zaXplID0gRkNfTUlOX01BWF9QQVlMT0FEOwogCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX2Zsb2dpKSk7CiAJaWYgKCFmcCkgeworCQlGQ19SUE9SVF9EQkcocmRhdGEsICIlcyBmcmFtZSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKIAkJcmV0dXJuOwogCX0KQEAgLTY5OCw2ICs5NTEsNyBAQAogCXUzMiByb2xlcyA9IEZDX1JQT1JUX1JPTEVfVU5LTk9XTjsKIAl1MzIgZmNwX3Bhcm0gPSAwOwogCXU4IG9wOworCXU4IHJlc3BfY29kZSA9IDA7CiAKIAltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCkBAIC03MjIsMTEgKzk3NiwyNSBAQAogCW9wID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7CiAJaWYgKG9wID09IEVMU19MU19BQ0MpIHsKIAkJcHAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpwcCkpOwotCQlpZiAocHAgJiYgcHAtPnBybGkucHJsaV9zcHBfbGVuID49IHNpemVvZihwcC0+c3BwKSkgewotCQkJZmNwX3Bhcm0gPSBudG9obChwcC0+c3BwLnNwcF9wYXJhbXMpOwotCQkJaWYgKGZjcF9wYXJtICYgRkNQX1NQUEZfUkVUUlkpCi0JCQkJcmRhdGEtPmZsYWdzIHw9IEZDX1JQX0ZMQUdTX1JFVFJZOworCQlpZiAoIXBwKQorCQkJZ290byBvdXQ7CisKKwkJcmVzcF9jb2RlID0gKHBwLT5zcHAuc3BwX2ZsYWdzICYgRkNfU1BQX1JFU1BfTUFTSyk7CisJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlBSTEkgc3BwX2ZsYWdzID0gMHgleFxuIiwKKwkJCSAgICAgcHAtPnNwcC5zcHBfZmxhZ3MpOworCQlpZiAocmVzcF9jb2RlICE9IEZDX1NQUF9SRVNQX0FDSykgeworCQkJaWYgKHJlc3BfY29kZSA9PSBGQ19TUFBfUkVTUF9DT05GKQorCQkJCWZjX3Jwb3J0X2Vycm9yKHJkYXRhLCBmcCk7CisJCQllbHNlCisJCQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwkJCWdvdG8gb3V0OwogCQl9CisJCWlmIChwcC0+cHJsaS5wcmxpX3NwcF9sZW4gPCBzaXplb2YocHAtPnNwcCkpCisJCQlnb3RvIG91dDsKKworCQlmY3BfcGFybSA9IG50b2hsKHBwLT5zcHAuc3BwX3BhcmFtcyk7CisJCWlmIChmY3BfcGFybSAmIEZDUF9TUFBGX1JFVFJZKQorCQkJcmRhdGEtPmZsYWdzIHw9IEZDX1JQX0ZMQUdTX1JFVFJZOwogCiAJCXJkYXRhLT5zdXBwb3J0ZWRfY2xhc3NlcyA9IEZDX0NPU19DTEFTUzM7CiAJCWlmIChmY3BfcGFybSAmIEZDUF9TUFBGX0lOSVRfRkNOKQpAQCAtNzM5LDU1ICsxMDA3LDkgQEAKIAogCX0gZWxzZSB7CiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIkJhZCBFTFMgcmVzcG9uc2UgZm9yIFBSTEkgY29tbWFuZFxuIik7Ci0JCWZjX3Jwb3J0X2VudGVyX2RlbGV0ZShyZGF0YSwgUlBPUlRfRVZfRkFJTEVEKTsKLQl9Ci0KLW91dDoKLQlmY19mcmFtZV9mcmVlKGZwKTsKLWVycjoKLQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7Ci0Ja3JlZl9wdXQoJnJkYXRhLT5rcmVmLCByZGF0YS0+bG9jYWxfcG9ydC0+dHQucnBvcnRfZGVzdHJveSk7Ci19Ci0KLS8qKgotICogZmNfcnBvcnRfbG9nb19yZXNwKCkgLSBIYW5kbGVyIGZvciBsb2dvdXQgKExPR08pIHJlc3BvbnNlcwotICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBMT0dPIHdhcyBvbgotICogQGZwOgkgICAgICAgVGhlIExPR08gcmVzcG9uc2UgZnJhbWUKLSAqIEByZGF0YV9hcmc6IFRoZSByZW1vdGUgcG9ydCB0aGF0IHNlbnQgdGhlIExPR08gcmVzcG9uc2UKLSAqCi0gKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgcnBvcnQgbG9jawotICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19ycG9ydF9lcnJvcgotICogYW5kIHRoZW4gdW5sb2NrIHRoZSBycG9ydC4KLSAqLwotc3RhdGljIHZvaWQgZmNfcnBvcnRfbG9nb19yZXNwKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAotCQkJICAgICAgIHZvaWQgKnJkYXRhX2FyZykKLXsKLQlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEgPSByZGF0YV9hcmc7Ci0JdTggb3A7Ci0KLQltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwotCi0JRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVjZWl2ZWQgYSBMT0dPICVzXG4iLCBmY19lbHNfcmVzcF90eXBlKGZwKSk7Ci0KLQlpZiAocmRhdGEtPnJwX3N0YXRlICE9IFJQT1JUX1NUX0xPR08pIHsKLQkJRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVjZWl2ZWQgYSBMT0dPIHJlc3BvbnNlLCBidXQgaW4gc3RhdGUgIgotCQkJICAgICAiJXNcbiIsIGZjX3Jwb3J0X3N0YXRlKHJkYXRhKSk7Ci0JCWlmIChJU19FUlIoZnApKQotCQkJZ290byBlcnI7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChJU19FUlIoZnApKSB7CiAJCWZjX3Jwb3J0X2Vycm9yX3JldHJ5KHJkYXRhLCBmcCk7Ci0JCWdvdG8gZXJyOwogCX0KIAotCW9wID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7Ci0JaWYgKG9wICE9IEVMU19MU19BQ0MpCi0JCUZDX1JQT1JUX0RCRyhyZGF0YSwgIkJhZCBFTFMgcmVzcG9uc2Ugb3AgJXggZm9yIExPR08gY29tbWFuZFxuIiwKLQkJCSAgICAgb3ApOwotCWZjX3Jwb3J0X2VudGVyX2RlbGV0ZShyZGF0YSwgUlBPUlRfRVZfTE9HTyk7Ci0KIG91dDoKIAlmY19mcmFtZV9mcmVlKGZwKTsKIGVycjoKQEAgLTkzNyw2ICsxMTU5LDI0IEBACiB9CiAKIC8qKgorICogZmNfcnBvcnRfbG9nb19yZXNwKCkgLSBIYW5kbGVyIGZvciBsb2dvdXQgKExPR08pIHJlc3BvbnNlcworICogQHNwOgkgICAgICAgVGhlIHNlcXVlbmNlIHRoZSBMT0dPIHdhcyBvbgorICogQGZwOgkgICAgICAgVGhlIExPR08gcmVzcG9uc2UgZnJhbWUKKyAqIEBscG9ydF9hcmc6IFRoZSBsb2NhbCBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2xvZ29fcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCSAgICAgICB2b2lkICpscG9ydF9hcmcpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGxwb3J0X2FyZzsKKworCUZDX1JQT1JUX0lEX0RCRyhscG9ydCwgZmNfc2VxX2V4Y2goc3ApLT5kaWQsCisJCQkiUmVjZWl2ZWQgYSBMT0dPICVzXG4iLCBmY19lbHNfcmVzcF90eXBlKGZwKSk7CisJaWYgKElTX0VSUihmcCkpCisJCXJldHVybjsKKwlmY19mcmFtZV9mcmVlKGZwKTsKK30KKworLyoqCiAgKiBmY19ycG9ydF9lbnRlcl9sb2dvKCkgLSBTZW5kIGEgbG9nb3V0IChMT0dPKSByZXF1ZXN0CiAgKiBAcmRhdGE6IFRoZSByZW1vdGUgcG9ydCB0byBzZW5kIHRoZSBMT0dPIHJlcXVlc3QgdG8KICAqCkBAIC05NDgsMjMgKzExODgsMTQgQEAKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKIAotCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlBvcnQgZW50ZXJlZCBMT0dPIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCisJRkNfUlBPUlRfREJHKHJkYXRhLCAiUG9ydCBzZW5kaW5nIExPR08gZnJvbSAlcyBzdGF0ZVxuIiwKIAkJICAgICBmY19ycG9ydF9zdGF0ZShyZGF0YSkpOwogCi0JZmNfcnBvcnRfc3RhdGVfZW50ZXIocmRhdGEsIFJQT1JUX1NUX0xPR08pOwotCiAJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgc2l6ZW9mKHN0cnVjdCBmY19lbHNfbG9nbykpOwotCWlmICghZnApIHsKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIGZwKTsKKwlpZiAoIWZwKQogCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgcmRhdGEtPmlkcy5wb3J0X2lkLCBmcCwgRUxTX0xPR08sCi0JCQkJICBmY19ycG9ydF9sb2dvX3Jlc3AsIHJkYXRhLAotCQkJCSAgMiAqIGxwb3J0LT5yX2FfdG92KSkKLQkJZmNfcnBvcnRfZXJyb3JfcmV0cnkocmRhdGEsIE5VTEwpOwotCWVsc2UKLQkJa3JlZl9nZXQoJnJkYXRhLT5rcmVmKTsKKwkodm9pZClscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgcmRhdGEtPmlkcy5wb3J0X2lkLCBmcCwgRUxTX0xPR08sCisJCQkJICAgZmNfcnBvcnRfbG9nb19yZXNwLCBscG9ydCwgMCk7CiB9CiAKIC8qKgpAQCAtMTAxMyw3ICsxMjQ0LDcgQEAKIAkgICAgZ2V0X3VuYWxpZ25lZF9iZTY0KCZhZGlzYy0+YWRpc2Nfd3dwbikgIT0gcmRhdGEtPmlkcy5wb3J0X25hbWUgfHwKIAkgICAgZ2V0X3VuYWxpZ25lZF9iZTY0KCZhZGlzYy0+YWRpc2Nfd3dubikgIT0gcmRhdGEtPmlkcy5ub2RlX25hbWUpIHsKIAkJRkNfUlBPUlRfREJHKHJkYXRhLCAiQURJU0MgZXJyb3Igb3IgbWlzbWF0Y2hcbiIpOwotCQlmY19ycG9ydF9lbnRlcl9wbG9naShyZGF0YSk7CisJCWZjX3Jwb3J0X2VudGVyX2Zsb2dpKHJkYXRhKTsKIAl9IGVsc2UgewogCQlGQ19SUE9SVF9EQkcocmRhdGEsICJBRElTQyBPS1xuIik7CiAJCWZjX3Jwb3J0X2VudGVyX3JlYWR5KHJkYXRhKTsKQEAgLTEwNTgsMjkgKzEyODksMjUgQEAKIC8qKgogICogZmNfcnBvcnRfcmVjdl9hZGlzY19yZXEoKSAtIEhhbmRsZXIgZm9yIEFkZHJlc3MgRGlzY292ZXJ5IChBRElTQykgcmVxdWVzdHMKICAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRoYXQgc2VudCB0aGUgQURJU0MgcmVxdWVzdAotICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhlIEFESVNDIHJlcXVlc3Qgd2FzIG9uCiAgKiBAaW5fZnA6IFRoZSBBRElTQyByZXF1ZXN0IGZyYW1lCiAgKgogICogTG9ja2luZyBOb3RlOiAgQ2FsbGVkIHdpdGggdGhlIGxwb3J0IGFuZCBycG9ydCBsb2NrcyBoZWxkLgogICovCiBzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X2FkaXNjX3JlcShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEsCi0JCQkJICAgIHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmluX2ZwKQorCQkJCSAgICBzdHJ1Y3QgZmNfZnJhbWUgKmluX2ZwKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwotCXN0cnVjdCBmY19leGNoICplcCA9IGZjX3NlcV9leGNoKHNwKTsKIAlzdHJ1Y3QgZmNfZWxzX2FkaXNjICphZGlzYzsKIAlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIHJqdF9kYXRhOwotCXUzMiBmX2N0bDsKIAogCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIEFESVNDIHJlcXVlc3RcbiIpOwogCiAJYWRpc2MgPSBmY19mcmFtZV9wYXlsb2FkX2dldChpbl9mcCwgc2l6ZW9mKCphZGlzYykpOwogCWlmICghYWRpc2MpIHsKLQkJcmp0X2RhdGEuZnAgPSBOVUxMOwogCQlyanRfZGF0YS5yZWFzb24gPSBFTFNfUkpUX1BST1Q7CiAJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX0lOVl9MRU47Ci0JCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCQlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChpbl9mcCwgRUxTX0xTX1JKVCwgJnJqdF9kYXRhKTsKIAkJZ290byBkcm9wOwogCX0KIApAQCAtMTA5MCwxMSArMTMxNyw4IEBACiAJZmNfYWRpc2NfZmlsbChscG9ydCwgZnApOwogCWFkaXNjID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqYWRpc2MpKTsKIAlhZGlzYy0+YWRpc2NfY21kID0gRUxTX0xTX0FDQzsKLQlzcCA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChzcCk7Ci0JZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVDsKLQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAotCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKLQlscG9ydC0+dHQuc2VxX3NlbmQobHBvcnQsIHNwLCBmcCk7CisJZmNfZmlsbF9yZXBseV9oZHIoZnAsIGluX2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCWxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CiBkcm9wOgogCWZjX2ZyYW1lX2ZyZWUoaW5fZnApOwogfQpAQCAtMTEwMiwyNSArMTMyNiwyMiBAQAogLyoqCiAgKiBmY19ycG9ydF9yZWN2X3Jsc19yZXEoKSAtIEhhbmRsZSByZWNlaXZlZCBSZWFkIExpbmsgU3RhdHVzIHJlcXVlc3QKICAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRoYXQgc2VudCB0aGUgUkxTIHJlcXVlc3QKLSAqIEBzcDoJVGhlIHNlcXVlbmNlIHRoYXQgdGhlIFJMUyB3YXMgb24KICAqIEByeF9mcDogVGhlIFBSTEkgcmVxdWVzdCBmcmFtZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9ybHNfcmVxKHN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSwKLQkJCQkgIHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQorCQkJCSAgc3RydWN0IGZjX2ZyYW1lICpyeF9mcCkKIAogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwotCXN0cnVjdCBmY19leGNoICplcCA9IGZjX3NlcV9leGNoKHNwKTsKIAlzdHJ1Y3QgZmNfZWxzX3JscyAqcmxzOwogCXN0cnVjdCBmY19lbHNfcmxzX3Jlc3AgKnJzcDsKIAlzdHJ1Y3QgZmNfZWxzX2xlc2IgKmxlc2I7CiAJc3RydWN0IGZjX3NlcV9lbHNfZGF0YSByanRfZGF0YTsKIAlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpoc3Q7Ci0JdTMyIGZfY3RsOwogCiAJRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVjZWl2ZWQgUkxTIHJlcXVlc3Qgd2hpbGUgaW4gc3RhdGUgJXNcbiIsCiAJCSAgICAgZmNfcnBvcnRfc3RhdGUocmRhdGEpKTsKQEAgLTExNTcsMTYgKzEzNzgsMTIgQEAKIAkJbGVzYi0+bGVzYl9pbnZfY3JjID0gaHRvbmwoaHN0LT5pbnZhbGlkX2NyY19jb3VudCk7CiAJfQogCi0Jc3AgPSBscG9ydC0+dHQuc2VxX3N0YXJ0X25leHQoc3ApOwotCWZfY3RsID0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfTEFTVF9TRVEgfCBGQ19GQ19FTkRfU0VROwotCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0VMU19SRVAsIGVwLT5kaWQsIGVwLT5zaWQsCi0JCSAgICAgICBGQ19UWVBFX0VMUywgZl9jdGwsIDApOwotCWxwb3J0LT50dC5zZXFfc2VuZChscG9ydCwgc3AsIGZwKTsKKwlmY19maWxsX3JlcGx5X2hkcihmcCwgcnhfZnAsIEZDX1JDVExfRUxTX1JFUCwgMCk7CisJbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKIAlnb3RvIG91dDsKIAogb3V0X3JqdDoKLQlyanRfZGF0YS5mcCA9IE5VTEw7Ci0JbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CisJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQocnhfZnAsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CiBvdXQ6CiAJZmNfZnJhbWVfZnJlZShyeF9mcCk7CiB9CkBAIC0xMTc0LDcgKzEzOTEsNiBAQAogLyoqCiAgKiBmY19ycG9ydF9yZWN2X2Vsc19yZXEoKSAtIEhhbmRsZXIgZm9yIHZhbGlkYXRlZCBFTFMgcmVxdWVzdHMKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdGhhdCByZWNlaXZlZCB0aGUgRUxTIHJlcXVlc3QKLSAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRoYXQgdGhlIEVMUyByZXF1ZXN0IHdhcyBvbgogICogQGZwOgkgICBUaGUgRUxTIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBIYW5kbGUgaW5jb21pbmcgRUxTIHJlcXVlc3RzIHRoYXQgcmVxdWlyZSBwb3J0IGxvZ2luLgpAQCAtMTE4MiwyMSArMTM5OCwxMyBAQAogICoKICAqIExvY2tpbmcgTm90ZTogQ2FsbGVkIHdpdGggdGhlIGxwb3J0IGxvY2sgaGVsZC4KICAqLwotc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9lbHNfcmVxKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCi0JCQkJICBzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3JlY3ZfZWxzX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKLQlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIGVsc19kYXRhOwogCi0JZWxzX2RhdGEuZnAgPSBOVUxMOwotCWVsc19kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5BQjsKLQllbHNfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9QTE9HSV9SRVFEOwotCi0JZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKLQogCW11dGV4X2xvY2soJmxwb3J0LT5kaXNjLmRpc2NfbXV0ZXgpOwotCXJkYXRhID0gbHBvcnQtPnR0LnJwb3J0X2xvb2t1cChscG9ydCwgbnRvaDI0KGZoLT5maF9zX2lkKSk7CisJcmRhdGEgPSBscG9ydC0+dHQucnBvcnRfbG9va3VwKGxwb3J0LCBmY19mcmFtZV9zaWQoZnApKTsKIAlpZiAoIXJkYXRhKSB7CiAJCW11dGV4X3VubG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CiAJCWdvdG8gcmVqZWN0OwpAQCAtMTIxNywyNCArMTQyNSwyNCBAQAogCiAJc3dpdGNoIChmY19mcmFtZV9wYXlsb2FkX29wKGZwKSkgewogCWNhc2UgRUxTX1BSTEk6Ci0JCWZjX3Jwb3J0X3JlY3ZfcHJsaV9yZXEocmRhdGEsIHNwLCBmcCk7CisJCWZjX3Jwb3J0X3JlY3ZfcHJsaV9yZXEocmRhdGEsIGZwKTsKIAkJYnJlYWs7CiAJY2FzZSBFTFNfUFJMTzoKLQkJZmNfcnBvcnRfcmVjdl9wcmxvX3JlcShyZGF0YSwgc3AsIGZwKTsKKwkJZmNfcnBvcnRfcmVjdl9wcmxvX3JlcShyZGF0YSwgZnApOwogCQlicmVhazsKIAljYXNlIEVMU19BRElTQzoKLQkJZmNfcnBvcnRfcmVjdl9hZGlzY19yZXEocmRhdGEsIHNwLCBmcCk7CisJCWZjX3Jwb3J0X3JlY3ZfYWRpc2NfcmVxKHJkYXRhLCBmcCk7CiAJCWJyZWFrOwogCWNhc2UgRUxTX1JSUToKLQkJZWxzX2RhdGEuZnAgPSBmcDsKLQkJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19SUlEsICZlbHNfZGF0YSk7CisJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGZwLCBFTFNfUlJRLCBOVUxMKTsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CiAJCWJyZWFrOwogCWNhc2UgRUxTX1JFQzoKLQkJZWxzX2RhdGEuZnAgPSBmcDsKLQkJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19SRUMsICZlbHNfZGF0YSk7CisJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGZwLCBFTFNfUkVDLCBOVUxMKTsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CiAJCWJyZWFrOwogCWNhc2UgRUxTX1JMUzoKLQkJZmNfcnBvcnRfcmVjdl9ybHNfcmVxKHJkYXRhLCBzcCwgZnApOworCQlmY19ycG9ydF9yZWN2X3Jsc19yZXEocmRhdGEsIGZwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZmNfZnJhbWVfZnJlZShmcCk7CS8qIGNhbid0IGhhcHBlbiAqLwpAQCAtMTI0NSwzNSArMTQ1MywzOCBAQAogCXJldHVybjsKIAogcmVqZWN0OgotCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmZWxzX2RhdGEpOworCWVsc19kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5BQjsKKwllbHNfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9QTE9HSV9SRVFEOworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGZwLCBFTFNfTFNfUkpULCAmZWxzX2RhdGEpOwogCWZjX2ZyYW1lX2ZyZWUoZnApOwogfQogCiAvKioKICAqIGZjX3Jwb3J0X3JlY3ZfcmVxKCkgLSBIYW5kbGVyIGZvciByZXF1ZXN0cwotICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhlIHJlcXVlc3Qgd2FzIG9uCi0gKiBAZnA6CSAgIFRoZSByZXF1ZXN0IGZyYW1lCiAgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgcmVjZWl2ZWQgdGhlIHJlcXVlc3QKKyAqIEBmcDoJICAgVGhlIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IENhbGxlZCB3aXRoIHRoZSBscG9ydCBsb2NrIGhlbGQuCiAgKi8KLXZvaWQgZmNfcnBvcnRfcmVjdl9yZXEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCi0JCSAgICAgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQordm9pZCBmY19ycG9ydF9yZWN2X3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewogCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgZWxzX2RhdGE7CiAKIAkvKgotCSAqIEhhbmRsZSBQTE9HSSBhbmQgTE9HTyByZXF1ZXN0cyBzZXBhcmF0ZWx5LCBzaW5jZSB0aGV5CisJICogSGFuZGxlIEZMT0dJLCBQTE9HSSBhbmQgTE9HTyByZXF1ZXN0cyBzZXBhcmF0ZWx5LCBzaW5jZSB0aGV5CiAJICogZG9uJ3QgcmVxdWlyZSBwcmlvciBsb2dpbi4KIAkgKiBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgb3Bjb2RlcyBmaXJzdCBhbmQgcmVqZWN0IHRoZW0uCiAJICogRm9yIHNvbWUgb3BzLCBpdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gcmVqZWN0IHdpdGggIlBMT0dJIHJlcXVpcmVkIi4KIAkgKi8KIAlzd2l0Y2ggKGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApKSB7CisJY2FzZSBFTFNfRkxPR0k6CisJCWZjX3Jwb3J0X3JlY3ZfZmxvZ2lfcmVxKGxwb3J0LCBmcCk7CisJCWJyZWFrOwogCWNhc2UgRUxTX1BMT0dJOgotCQlmY19ycG9ydF9yZWN2X3Bsb2dpX3JlcShscG9ydCwgc3AsIGZwKTsKKwkJZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEobHBvcnQsIGZwKTsKIAkJYnJlYWs7CiAJY2FzZSBFTFNfTE9HTzoKLQkJZmNfcnBvcnRfcmVjdl9sb2dvX3JlcShscG9ydCwgc3AsIGZwKTsKKwkJZmNfcnBvcnRfcmVjdl9sb2dvX3JlcShscG9ydCwgZnApOwogCQlicmVhazsKIAljYXNlIEVMU19QUkxJOgogCWNhc2UgRUxTX1BSTE86CkBAIC0xMjgxLDE0ICsxNDkyLDEzIEBACiAJY2FzZSBFTFNfUlJROgogCWNhc2UgRUxTX1JFQzoKIAljYXNlIEVMU19STFM6Ci0JCWZjX3Jwb3J0X3JlY3ZfZWxzX3JlcShscG9ydCwgc3AsIGZwKTsKKwkJZmNfcnBvcnRfcmVjdl9lbHNfcmVxKGxwb3J0LCBmcCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWZjX2ZyYW1lX2ZyZWUoZnApOwotCQllbHNfZGF0YS5mcCA9IE5VTEw7CiAJCWVsc19kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5TVVA7CiAJCWVsc19kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PTkU7Ci0JCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmZWxzX2RhdGEpOworCQlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChmcCwgRUxTX0xTX1JKVCwgJmVsc19kYXRhKTsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTEyOTYsMjYgKzE1MDYsMjEgQEAKIC8qKgogICogZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEoKSAtIEhhbmRsZXIgZm9yIFBvcnQgTG9naW4gKFBMT0dJKSByZXF1ZXN0cwogICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0aGF0IHJlY2VpdmVkIHRoZSBQTE9HSSByZXF1ZXN0Ci0gKiBAc3A6CSAgIFRoZSBzZXF1ZW5jZSB0aGF0IHRoZSBQTE9HSSByZXF1ZXN0IHdhcyBvbgogICogQHJ4X2ZwOiBUaGUgUExPR0kgcmVxdWVzdCBmcmFtZQogICoKICAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiBzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X3Bsb2dpX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAotCQkJCSAgICBzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpyeF9mcCkKKwkJCQkgICAgc3RydWN0IGZjX2ZyYW1lICpyeF9mcCkKIHsKIAlzdHJ1Y3QgZmNfZGlzYyAqZGlzYzsKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CiAJc3RydWN0IGZjX2ZyYW1lICpmcCA9IHJ4X2ZwOwotCXN0cnVjdCBmY19leGNoICplcDsKLQlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpwbDsKIAlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIHJqdF9kYXRhOwotCXUzMiBzaWQsIGZfY3RsOworCXUzMiBzaWQ7CiAKLQlyanRfZGF0YS5mcCA9IE5VTEw7Ci0JZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKLQlzaWQgPSBudG9oMjQoZmgtPmZoX3NfaWQpOworCXNpZCA9IGZjX2ZyYW1lX3NpZChmcCk7CiAKIAlGQ19SUE9SVF9JRF9EQkcobHBvcnQsIHNpZCwgIlJlY2VpdmVkIFBMT0dJIHJlcXVlc3RcbiIpOwogCkBAIC0xMzU4LDYgKzE1NjMsOSBAQAogCWNhc2UgUlBPUlRfU1RfSU5JVDoKIAkJRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVjZWl2ZWQgUExPR0kgaW4gSU5JVCBzdGF0ZVxuIik7CiAJCWJyZWFrOworCWNhc2UgUlBPUlRfU1RfUExPR0lfV0FJVDoKKwkJRkNfUlBPUlRfREJHKHJkYXRhLCAiUmVjZWl2ZWQgUExPR0kgaW4gUExPR0lfV0FJVCBzdGF0ZVxuIik7CisJCWJyZWFrOwogCWNhc2UgUlBPUlRfU1RfUExPR0k6CiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIFBMT0dJIGluIFBMT0dJIHN0YXRlXG4iKTsKIAkJaWYgKHJkYXRhLT5pZHMucG9ydF9uYW1lIDwgbHBvcnQtPnd3cG4pIHsKQEAgLTEzNzUsOSArMTU4Myw4IEBACiAJCQkgICAgICItIGlnbm9yZWQgZm9yIG5vd1xuIiwgcmRhdGEtPnJwX3N0YXRlKTsKIAkJLyogWFhYIFRCRCAtIHNob3VsZCByZXNldCAqLwogCQlicmVhazsKKwljYXNlIFJQT1JUX1NUX0ZMT0dJOgogCWNhc2UgUlBPUlRfU1RfREVMRVRFOgotCWNhc2UgUlBPUlRfU1RfTE9HTzoKLQljYXNlIFJQT1JUX1NUX1JFU1RBUlQ6CiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIFBMT0dJIGluIHN0YXRlICVzIC0gc2VuZCBidXN5XG4iLAogCQkJICAgICBmY19ycG9ydF9zdGF0ZShyZGF0YSkpOwogCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CkBAIC0xMzkwLDUwICsxNTk3LDQxIEBACiAJICogR2V0IHNlc3Npb24gcGF5bG9hZCBzaXplIGZyb20gaW5jb21pbmcgUExPR0kuCiAJICovCiAJcmRhdGEtPm1heGZyYW1lX3NpemUgPSBmY19wbG9naV9nZXRfbWF4ZnJhbWUocGwsIGxwb3J0LT5tZnMpOwotCWZjX2ZyYW1lX2ZyZWUocnhfZnApOwogCiAJLyoKIAkgKiBTZW5kIExTX0FDQy4JIElmIHRoaXMgZmFpbHMsIHRoZSBvcmlnaW5hdG9yIHNob3VsZCByZXRyeS4KIAkgKi8KLQlzcCA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChzcCk7Ci0JaWYgKCFzcCkKLQkJZ290byBvdXQ7CiAJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgc2l6ZW9mKCpwbCkpOwogCWlmICghZnApCiAJCWdvdG8gb3V0OwogCiAJZmNfcGxvZ2lfZmlsbChscG9ydCwgZnAsIEVMU19MU19BQ0MpOwotCWZfY3RsID0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfTEFTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQ7Ci0JZXAgPSBmY19zZXFfZXhjaChzcCk7Ci0JZmNfZmlsbF9mY19oZHIoZnAsIEZDX1JDVExfRUxTX1JFUCwgZXAtPmRpZCwgZXAtPnNpZCwKLQkJICAgICAgIEZDX1RZUEVfRUxTLCBmX2N0bCwgMCk7Ci0JbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzcCwgZnApOworCWZjX2ZpbGxfcmVwbHlfaGRyKGZwLCByeF9mcCwgRkNfUkNUTF9FTFNfUkVQLCAwKTsKKwlscG9ydC0+dHQuZnJhbWVfc2VuZChscG9ydCwgZnApOwogCWZjX3Jwb3J0X2VudGVyX3BybGkocmRhdGEpOwogb3V0OgogCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKKwlmY19mcmFtZV9mcmVlKHJ4X2ZwKTsKIAlyZXR1cm47CiAKIHJlamVjdDoKLQlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChzcCwgRUxTX0xTX1JKVCwgJnJqdF9kYXRhKTsKKwlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChmcCwgRUxTX0xTX1JKVCwgJnJqdF9kYXRhKTsKIAlmY19mcmFtZV9mcmVlKGZwKTsKIH0KIAogLyoqCiAgKiBmY19ycG9ydF9yZWN2X3BybGlfcmVxKCkgLSBIYW5kbGVyIGZvciBwcm9jZXNzIGxvZ2luIChQUkxJKSByZXF1ZXN0cwogICogQHJkYXRhOiBUaGUgcmVtb3RlIHBvcnQgdGhhdCBzZW50IHRoZSBQUkxJIHJlcXVlc3QKLSAqIEBzcDoJICAgVGhlIHNlcXVlbmNlIHRoYXQgdGhlIFBSTEkgd2FzIG9uCiAgKiBAcnhfZnA6IFRoZSBQUkxJIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wcmxpX3JlcShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEsCi0JCQkJICAgc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqcnhfZnApCisJCQkJICAgc3RydWN0IGZjX2ZyYW1lICpyeF9mcCkKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7Ci0Jc3RydWN0IGZjX2V4Y2ggKmVwOwogCXN0cnVjdCBmY19mcmFtZSAqZnA7Ci0Jc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJc3RydWN0IHsKIAkJc3RydWN0IGZjX2Vsc19wcmxpIHBybGk7CiAJCXN0cnVjdCBmY19lbHNfc3BwIHNwcDsKQEAgLTE0NDQsMTcgKzE2NDIsMTMgQEAKIAl1bnNpZ25lZCBpbnQgcGxlbjsKIAllbnVtIGZjX2Vsc19zcHBfcmVzcCByZXNwOwogCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgcmp0X2RhdGE7Ci0JdTMyIGZfY3RsOwogCXUzMiBmY3BfcGFybTsKIAl1MzIgcm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CiAKLQlyanRfZGF0YS5mcCA9IE5VTEw7Ci0JZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KHJ4X2ZwKTsKLQogCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIFBSTEkgcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKIAkJICAgICBmY19ycG9ydF9zdGF0ZShyZGF0YSkpOwogCi0JbGVuID0gZnJfbGVuKHJ4X2ZwKSAtIHNpemVvZigqZmgpOworCWxlbiA9IGZyX2xlbihyeF9mcCkgLSBzaXplb2Yoc3RydWN0IGZjX2ZyYW1lX2hlYWRlcik7CiAJcHAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChyeF9mcCwgc2l6ZW9mKCpwcCkpOwogCWlmICghcHApCiAJCWdvdG8gcmVqZWN0X2xlbjsKQEAgLTE0NzUsOCArMTY2OSw2IEBACiAJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX0lOU1VGX1JFUzsKIAkJZ290byByZWplY3Q7CiAJfQotCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KHNwKTsKLQlXQVJOX09OKCFzcCk7CiAJcHAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKTsKIAlXQVJOX09OKCFwcCk7CiAJbWVtc2V0KHBwLCAwLCBsZW4pOwpAQCAtMTUyOSwxMiArMTcyMSw4IEBACiAJLyoKIAkgKiBTZW5kIExTX0FDQy4JIElmIHRoaXMgZmFpbHMsIHRoZSBvcmlnaW5hdG9yIHNob3VsZCByZXRyeS4KIAkgKi8KLQlmX2N0bCA9IEZDX0ZDX0VYX0NUWCB8IEZDX0ZDX0xBU1RfU0VROwotCWZfY3RsIHw9IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVDsKLQllcCA9IGZjX3NlcV9leGNoKHNwKTsKLQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAotCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKLQlscG9ydC0+dHQuc2VxX3NlbmQobHBvcnQsIHNwLCBmcCk7CisJZmNfZmlsbF9yZXBseV9oZHIoZnAsIHJ4X2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCWxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CiAKIAlzd2l0Y2ggKHJkYXRhLT5ycF9zdGF0ZSkgewogCWNhc2UgUlBPUlRfU1RfUFJMSToKQEAgLTE1NDksNyArMTczNyw3IEBACiAJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9QUk9UOwogCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX0lOVl9MRU47CiByZWplY3Q6Ci0JbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CisJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQocnhfZnAsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CiBkcm9wOgogCWZjX2ZyYW1lX2ZyZWUocnhfZnApOwogfQpAQCAtMTU1Nyw1NCArMTc0NSw5MCBAQAogLyoqCiAgKiBmY19ycG9ydF9yZWN2X3BybG9fcmVxKCkgLSBIYW5kbGVyIGZvciBwcm9jZXNzIGxvZ291dCAoUFJMTykgcmVxdWVzdHMKICAqIEByZGF0YTogVGhlIHJlbW90ZSBwb3J0IHRoYXQgc2VudCB0aGUgUFJMTyByZXF1ZXN0Ci0gKiBAc3A6CSAgIFRoZSBzZXF1ZW5jZSB0aGF0IHRoZSBQUkxPIHdhcyBvbgotICogQGZwOgkgICBUaGUgUFJMTyByZXF1ZXN0IGZyYW1lCisgKiBAcnhfZnA6IFRoZSBQUkxPIHJlcXVlc3QgZnJhbWUKICAqCiAgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZwogICogdGhpcyBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wcmxvX3JlcShzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEsCi0JCQkJICAgc3RydWN0IGZjX3NlcSAqc3AsCi0JCQkJICAgc3RydWN0IGZjX2ZyYW1lICpmcCkKKwkJCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKLQotCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGZjX2Vsc19wcmxvIHBybG87CisJCXN0cnVjdCBmY19lbHNfc3BwIHNwcDsKKwl9ICpwcDsKKwlzdHJ1Y3QgZmNfZWxzX3NwcCAqcnNwcDsJLyogcmVxdWVzdCBzZXJ2aWNlIHBhcmFtIHBhZ2UgKi8KKwlzdHJ1Y3QgZmNfZWxzX3NwcCAqc3BwOwkJLyogcmVzcG9uc2Ugc3BwICovCisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgcGxlbjsKIAlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIHJqdF9kYXRhOwogCi0JZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKLQogCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIFBSTE8gcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKIAkJICAgICBmY19ycG9ydF9zdGF0ZShyZGF0YSkpOwogCi0Jcmp0X2RhdGEuZnAgPSBOVUxMOwotCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5BQjsKLQlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9OT05FOwotCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOwotCWZjX2ZyYW1lX2ZyZWUoZnApOworCWxlbiA9IGZyX2xlbihyeF9mcCkgLSBzaXplb2Yoc3RydWN0IGZjX2ZyYW1lX2hlYWRlcik7CisJcHAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChyeF9mcCwgc2l6ZW9mKCpwcCkpOworCWlmICghcHApCisJCWdvdG8gcmVqZWN0X2xlbjsKKwlwbGVuID0gbnRvaHMocHAtPnBybG8ucHJsb19sZW4pOworCWlmIChwbGVuICE9IDIwKQorCQlnb3RvIHJlamVjdF9sZW47CisJaWYgKHBsZW4gPCBsZW4pCisJCWxlbiA9IHBsZW47CisKKwlyc3BwID0gJnBwLT5zcHA7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBsZW4pOworCWlmICghZnApIHsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9VTkFCOworCQlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9JTlNVRl9SRVM7CisJCWdvdG8gcmVqZWN0OworCX0KKworCXBwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIGxlbik7CisJV0FSTl9PTighcHApOworCW1lbXNldChwcCwgMCwgbGVuKTsKKwlwcC0+cHJsby5wcmxvX2NtZCA9IEVMU19MU19BQ0M7CisJcHAtPnBybG8ucHJsb19vYnMgPSAweDEwOworCXBwLT5wcmxvLnBybG9fbGVuID0gaHRvbnMobGVuKTsKKwlzcHAgPSAmcHAtPnNwcDsKKwlzcHAtPnNwcF90eXBlID0gcnNwcC0+c3BwX3R5cGU7CisJc3BwLT5zcHBfdHlwZV9leHQgPSByc3BwLT5zcHBfdHlwZV9leHQ7CisJc3BwLT5zcHBfZmxhZ3MgPSBGQ19TUFBfUkVTUF9BQ0s7CisKKwlmY19ycG9ydF9lbnRlcl9kZWxldGUocmRhdGEsIFJQT1JUX0VWX0xPR08pOworCisJZmNfZmlsbF9yZXBseV9oZHIoZnAsIHJ4X2ZwLCBGQ19SQ1RMX0VMU19SRVAsIDApOworCWxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CisJZ290byBkcm9wOworCityZWplY3RfbGVuOgorCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfUFJPVDsKKwlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9JTlZfTEVOOworcmVqZWN0OgorCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHJ4X2ZwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworZHJvcDoKKwlmY19mcmFtZV9mcmVlKHJ4X2ZwKTsKIH0KIAogLyoqCiAgKiBmY19ycG9ydF9yZWN2X2xvZ29fcmVxKCkgLSBIYW5kbGVyIGZvciBsb2dvdXQgKExPR08pIHJlcXVlc3RzCiAgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRoYXQgcmVjZWl2ZWQgdGhlIExPR08gcmVxdWVzdAotICogQHNwOgkgICBUaGUgc2VxdWVuY2UgdGhhdCB0aGUgTE9HTyByZXF1ZXN0IHdhcyBvbgogICogQGZwOgkgICBUaGUgTE9HTyByZXF1ZXN0IGZyYW1lCiAgKgogICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKICAqIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB2b2lkIGZjX3Jwb3J0X3JlY3ZfbG9nb19yZXEoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKLQkJCQkgICBzdHJ1Y3QgZmNfc2VxICpzcCwKLQkJCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQorc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9sb2dvX3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewotCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAl1MzIgc2lkOwogCi0JbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19BQ0MsIE5VTEwpOworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKGZwLCBFTFNfTFNfQUNDLCBOVUxMKTsKIAotCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7Ci0Jc2lkID0gbnRvaDI0KGZoLT5maF9zX2lkKTsKKwlzaWQgPSBmY19mcmFtZV9zaWQoZnApOwogCiAJbXV0ZXhfbG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CiAJcmRhdGEgPSBscG9ydC0+dHQucnBvcnRfbG9va3VwKGxwb3J0LCBzaWQpOwpAQCAtMTYxNCwxMyArMTgzOCw2IEBACiAJCQkgICAgIGZjX3Jwb3J0X3N0YXRlKHJkYXRhKSk7CiAKIAkJZmNfcnBvcnRfZW50ZXJfZGVsZXRlKHJkYXRhLCBSUE9SVF9FVl9MT0dPKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgcmVtb3RlIHBvcnQgd2FzIGNyZWF0ZWQgZHVlIHRvIGRpc2NvdmVyeSwgc2V0IHN0YXRlCi0JCSAqIHRvIGxvZyBiYWNrIGluLiAgSXQgbWF5IGhhdmUgc2VlbiBhIHN0YWxlIFJTQ04gYWJvdXQgdXMuCi0JCSAqLwotCQlpZiAocmRhdGEtPmRpc2NfaWQpCi0JCQlmY19ycG9ydF9zdGF0ZV9lbnRlcihyZGF0YSwgUlBPUlRfU1RfUkVTVEFSVCk7CiAJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAl9IGVsc2UKIAkJRkNfUlBPUlRfSURfREJHKGxwb3J0LCBzaWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCmluZGV4IDhjNDk2YjUuLjA0MjE1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCkBAIC03MSw3ICs3MSw3IEBACiAJCWNhc2UgU0FTX1NHX0VSUjoKIAkJCXJldHVybiBBQ19FUlJfSU5WQUxJRDsKIAotCQljYXNlIFNBTV9DSEVDS19DT05EOgorCQljYXNlIFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjoKIAkJY2FzZSBTQVNfT1BFTl9UTzoKIAkJY2FzZSBTQVNfT1BFTl9SRUpFQ1Q6CiAJCQlTQVNfRFBSSU5USygiJXM6IFNhdyBlcnJvciAlZC4gIFdoYXQgdG8gZG8/XG4iLApAQCAtMTA3LDcgKzEwNyw3IEBACiAJc2FzX2hhID0gZGV2LT5wb3J0LT5oYTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+c2F0YV9kZXYuYXAtPmxvY2ssIGZsYWdzKTsKLQlpZiAoc3RhdC0+c3RhdCA9PSBTQVNfUFJPVE9fUkVTUE9OU0UgfHwgc3RhdC0+c3RhdCA9PSBTQU1fR09PRCkgeworCWlmIChzdGF0LT5zdGF0ID09IFNBU19QUk9UT19SRVNQT05TRSB8fCBzdGF0LT5zdGF0ID09IFNBTV9TVEFUX0dPT0QpIHsKIAkJYXRhX3RmX2Zyb21fZmlzKHJlc3AtPmVuZGluZ19maXMsICZkZXYtPnNhdGFfZGV2LnRmKTsKIAkJcWMtPmVycl9tYXNrIHw9IGFjX2Vycl9tYXNrKGRldi0+c2F0YV9kZXYudGYuY29tbWFuZCk7CiAJCWRldi0+c2F0YV9kZXYuc3N0YXR1cyA9IHJlc3AtPnNzdGF0dXM7CkBAIC01MTEsMTIgKzUxMSwxMiBAQAogCQkJCQlnb3RvIGV4X2VycjsKIAkJCX0KIAkJfQotCQlpZiAodGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fQlVTWSB8fAotCQkJICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fVEFTS19TRVRfRlVMTCB8fAorCQlpZiAodGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fU1RBVF9CVVNZIHx8CisJCQkgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwgfHwKIAkJCSAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FTX1FVRVVFX0ZVTEwpIHsKIAkJCVNBU19EUFJJTlRLKCJ0YXNrOiBxIGJ1c3ksIHNsZWVwaW5nLi4uXG4iKTsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWik7Ci0JCX0gZWxzZSBpZiAodGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fQ0hFQ0tfQ09ORCkgeworCQl9IGVsc2UgaWYgKHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKSB7CiAJCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc2hkcjsKIAogCQkJaWYgKCFzY3NpX25vcm1hbGl6ZV9zZW5zZSh0cy0+YnVmLCB0cy0+YnVmX3ZhbGlkX3NpemUsCkBAIC01NDksNyArNTQ5LDcgQEAKIAkJCQkJICAgIHNoZHIuYXNjLCBzaGRyLmFzY3EpOwogCQkJfQogCQl9IGVsc2UgaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgIT0gU0FTX1RBU0tfQ09NUExFVEUgfHwKLQkJCSAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgIT0gU0FNX0dPT0QpIHsKKwkJCSAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgIT0gU0FNX1NUQVRfR09PRCkgewogCQkJU0FTX0RQUklOVEsoInRhc2sgZmluaXNoZWQgd2l0aCByZXNwOjB4JXgsICIKIAkJCQkgICAgInN0YXQ6MHgleFxuIiwKIAkJCQkgICAgdGFzay0+dGFza19zdGF0dXMucmVzcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCmluZGV4IGM2NWFmMDIuLjgzZGQ1MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJCQl9CiAJCX0KIAkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKLQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX0dPT0QpIHsKKwkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX1NUQVRfR09PRCkgewogCQkJcmVzID0gMDsKIAkJCWJyZWFrOwogCQl9IGlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IGE3ODkwYzYuLmYwY2ZiYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC0xMTMsMTAgKzExMywxMCBAQAogCQljYXNlIFNBU19BQk9SVEVEX1RBU0s6CiAJCQlocyA9IERJRF9BQk9SVDsKIAkJCWJyZWFrOwotCQljYXNlIFNBTV9DSEVDS19DT05EOgorCQljYXNlIFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjoKIAkJCW1lbWNweShzYy0+c2Vuc2VfYnVmZmVyLCB0cy0+YnVmLAogCQkJICAgICAgIG1pbihTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIHRzLT5idWZfdmFsaWRfc2l6ZSkpOwotCQkJc3RhdCA9IFNBTV9DSEVDS19DT05EOworCQkJc3RhdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJc3RhdCA9IHRzLT5zdGF0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfdGFzay5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfdGFzay5jCmluZGV4IDU5NDUyNGQuLmIxM2EzMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Rhc2suYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc190YXNrLmMKQEAgLTE1LDEzICsxNSwxMyBAQAogCWVsc2UgaWYgKGl1LT5kYXRhcHJlcyA9PSAxKQogCQl0c3RhdC0+c3RhdCA9IGl1LT5yZXNwX2RhdGFbM107CiAJZWxzZSBpZiAoaXUtPmRhdGFwcmVzID09IDIpIHsKLQkJdHN0YXQtPnN0YXQgPSBTQU1fQ0hFQ0tfQ09ORDsKKwkJdHN0YXQtPnN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJCXRzdGF0LT5idWZfdmFsaWRfc2l6ZSA9CiAJCQltaW5fdChpbnQsIFNBU19TVEFUVVNfQlVGX1NJWkUsCiAJCQkgICAgICBiZTMyX3RvX2NwdShpdS0+c2Vuc2VfZGF0YV9sZW4pKTsKIAkJbWVtY3B5KHRzdGF0LT5idWYsIGl1LT5zZW5zZV9kYXRhLCB0c3RhdC0+YnVmX3ZhbGlkX3NpemUpOwogCi0JCWlmIChpdS0+c3RhdHVzICE9IFNBTV9DSEVDS19DT05EKQorCQlpZiAoaXUtPnN0YXR1cyAhPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pCiAJCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgZGV2LAogCQkJCSAgICJkZXYgJWxseCBzZW50IHNlbnNlIGRhdGEsIGJ1dCAiCiAJCQkJICAgInN0YXQoJXgpIGlzIG5vdCBDSEVDSyBDT05ESVRJT05cbiIsCkBAIC0zMCw3ICszMCw3IEBACiAJfQogCWVsc2UKIAkJLyogd2hlbiBkYXRhcHJlcyBjb250YWlucyBjb3JydXB0L3Vua25vd24gdmFsdWUuLi4gKi8KLQkJdHN0YXQtPnN0YXQgPSBTQU1fQ0hFQ0tfQ09ORDsKKwkJdHN0YXQtPnN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXNfc3NwX3Rhc2tfcmVzcG9uc2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggZTM1YTRjNy4uMzQ4MmQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMjAsNyArMjAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotCiBzdHJ1Y3QgbHBmY19zbGkyX3NsaW07CiAKICNkZWZpbmUgTFBGQ19QQ0lfREVWX0xQCQkweDEKQEAgLTQ5LDcgKzQ4LDcgQEAKICNkZWZpbmUgTFBGQ19UR1RRX0lOVEVSVkFMCTQwMDAwCS8qIE1pbiBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHRndAogCQkJCQkgICBxdWV1ZSBkZXB0aCBjaGFuZ2UgaW4gbWlsbGlzZWNzICovCiAjZGVmaW5lIExQRkNfVEdUUV9SQU1QVVBfUENFTlQJNQkvKiBUYXJnZXQgcXVldWUgcmFtcHVwIGluIHBlcmNlbnRhZ2UgKi8KLSNkZWZpbmUgTFBGQ19NSU5fVEdUX1FERVBUSAkxMDAKKyNkZWZpbmUgTFBGQ19NSU5fVEdUX1FERVBUSAkxMAogI2RlZmluZSBMUEZDX01BWF9UR1RfUURFUFRICTB4RkZGRgogCiAjZGVmaW5lICBMUEZDX01BWF9CVUNLRVRfQ09VTlQgMjAJLyogTWF4aW11bSBuby4gb2YgYnVja2V0cyBmb3Igc3RhdCBkYXRhCkBAIC0zNzYsNiArMzc1LDcgQEAKICNkZWZpbmUgV09SS0VSX0ZBQlJJQ19CTE9DS19UTU8gICAgICAgIDB4NDAwCS8qIGhiYTogZmFicmljIGJsb2NrIHRpbWVvdXQgKi8KICNkZWZpbmUgV09SS0VSX1JBTVBfRE9XTl9RVUVVRSAgICAgICAgIDB4ODAwCS8qIGhiYTogRGVjcmVhc2UgUSBkZXB0aCAqLwogI2RlZmluZSBXT1JLRVJfUkFNUF9VUF9RVUVVRSAgICAgICAgICAgMHgxMDAwCS8qIGhiYTogSW5jcmVhc2UgUSBkZXB0aCAqLworI2RlZmluZSBXT1JLRVJfU0VSVklDRV9UWFEgICAgICAgICAgICAgMHgyMDAwCS8qIGhiYTogSU9DQnMgb24gdGhlIHR4cSAqLwogCiAJc3RydWN0IHRpbWVyX2xpc3QgZmNfZmRtaXRtbzsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBlbHNfdG1vZnVuYzsKQEAgLTQwMCw2ICs0MDAsNyBAQAogCXVpbnQzMl90IGNmZ19tYXhfbHVuczsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2RhX2lkOwogCXVpbnQzMl90IGNmZ19tYXhfc2NzaWNtcGxfdGltZTsKKwl1aW50MzJfdCBjZmdfdGd0X3F1ZXVlX2RlcHRoOwogCiAJdWludDMyX3QgZGV2X2xvc3NfdG1vX2NoYW5nZWQ7CiAKQEAgLTUxMCw5ICs1MTEsOSBAQAogCXZvaWQgKCpscGZjX3N0b3BfcG9ydCkKIAkJKHN0cnVjdCBscGZjX2hiYSAqKTsKIAlpbnQgKCpscGZjX2hiYV9pbml0X2xpbmspCi0JCShzdHJ1Y3QgbHBmY19oYmEgKik7CisJCShzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDMyX3QpOwogCWludCAoKmxwZmNfaGJhX2Rvd25fbGluaykKLQkJKHN0cnVjdCBscGZjX2hiYSAqKTsKKwkJKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MzJfdCk7CiAKIAkvKiBTTEk0IHNwZWNpZmljIEhCQSBkYXRhIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBscGZjX3NsaTRfaGJhIHNsaTRfaGJhOwpAQCAtNTI1LDcgKzUyNiw2IEBACiAjZGVmaW5lIExQRkNfU0xJM19OUElWX0VOQUJMRUQJCTB4MDIKICNkZWZpbmUgTFBGQ19TTEkzX1ZQT1JUX1RFQVJET1dOCTB4MDQKICNkZWZpbmUgTFBGQ19TTEkzX0NSUF9FTkFCTEVECQkweDA4Ci0jZGVmaW5lIExQRkNfU0xJM19JTkJfRU5BQkxFRAkJMHgxMAogI2RlZmluZSBMUEZDX1NMSTNfQkdfRU5BQkxFRAkJMHgyMAogI2RlZmluZSBMUEZDX1NMSTNfRFNTX0VOQUJMRUQJCTB4NDAKIAl1aW50MzJfdCBpb2NiX2NtZF9zaXplOwpAQCAtNTU3LDkgKzU1Nyw2IEBACiAKIAlNQUlMQk9YX3QgKm1ib3g7CiAJdWludDMyX3QgKm1ib3hfZXh0OwotCXVpbnQzMl90ICppbmJfaGFfY29weTsKLQl1aW50MzJfdCAqaW5iX2NvdW50ZXI7Ci0JdWludDMyX3QgaW5iX2xhc3RfY291bnRlcjsKIAl1aW50MzJfdCBoYV9jb3B5OwogCXN0cnVjdCBfUENCICpwY2I7CiAJc3RydWN0IF9JT0NCICpJT0NCczsKQEAgLTYyOCw2ICs2MjUsNyBAQAogCXVpbnQzMl90IGNmZ19ob3N0bWVtX2hncDsKIAl1aW50MzJfdCBjZmdfbG9nX3ZlcmJvc2U7CiAJdWludDMyX3QgY2ZnX2Flcl9zdXBwb3J0OworCXVpbnQzMl90IGNmZ19pb2NiX2NudDsKIAl1aW50MzJfdCBjZmdfc3VwcHJlc3NfbGlua191cDsKICNkZWZpbmUgTFBGQ19JTklUSUFMSVpFX0xJTksgICAgICAgICAgICAgIDAJLyogZG8gbm9ybWFsIGluaXRfbGluayBtYm94ICovCiAjZGVmaW5lIExQRkNfREVMQVlfSU5JVF9MSU5LICAgICAgICAgICAgICAxCS8qIGxheWVyZWQgZHJpdmVyIGhvbGQgb2ZmICovCkBAIC04MTYsNiArODE0LDkgQEAKIAogCXVpbnQ4X3QgbWVubG9fZmxhZzsJLyogbWVubG8gZ2VuZXJpYyBmbGFncyAqLwogI2RlZmluZSBIQkFfTUVOTE9fU1VQUE9SVAkweDEgLyogSEJBIHN1cHBvcnRzIG1lbmxvIGNvbW1hbmRzICovCisJdWludDMyX3QgaW9jYl9jbnQ7CisJdWludDMyX3QgaW9jYl9tYXg7CisJYXRvbWljX3Qgc2Rldl9jbnQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCBiZjMzYjMxLi4xNjI3MDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtNTA2LDEwICs1MDYsMTAgQEAKIAogCWlmICgoc3RybmNtcChidWYsICJ1cCIsIHNpemVvZigidXAiKSAtIDEpID09IDApICYmCiAJCQkocGhiYS0+bGlua19zdGF0ZSA9PSBMUEZDX0xJTktfRE9XTikpCi0JCXN0YXR1cyA9IHBoYmEtPmxwZmNfaGJhX2luaXRfbGluayhwaGJhKTsKKwkJc3RhdHVzID0gcGhiYS0+bHBmY19oYmFfaW5pdF9saW5rKHBoYmEsIE1CWF9OT1dBSVQpOwogCWVsc2UgaWYgKChzdHJuY21wKGJ1ZiwgImRvd24iLCBzaXplb2YoImRvd24iKSAtIDEpID09IDApICYmCiAJCQkocGhiYS0+bGlua19zdGF0ZSA+PSBMUEZDX0xJTktfVVApKQotCQlzdGF0dXMgPSBwaGJhLT5scGZjX2hiYV9kb3duX2xpbmsocGhiYSk7CisJCXN0YXR1cyA9IHBoYmEtPmxwZmNfaGJhX2Rvd25fbGluayhwaGJhLCBNQlhfTk9XQUlUKTsKIAogCWlmIChzdGF0dXMgPT0gMCkKIAkJcmV0dXJuIHN0cmxlbihidWYpOwpAQCAtODY0LDcgKzg2NCw2IEBACiAJCSAgdWludDMyX3QgKm1ycGksIHVpbnQzMl90ICphcnBpLAogCQkgIHVpbnQzMl90ICptdnBpLCB1aW50MzJfdCAqYXZwaSkKIHsKLQlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOwogCXN0cnVjdCBscGZjX21ieF9yZWFkX2NvbmZpZyAqcmRfY29uZmlnOwogCUxQRkNfTUJPWFFfdCAqcG1ib3hxOwogCU1BSUxCT1hfdCAqcG1iOwpAQCAtODkzLDggKzg5Miw3IEBACiAJcG1iLT5tYnhPd25lciA9IE9XTl9IT1NUOwogCXBtYm94cS0+Y29udGV4dDEgPSBOVUxMOwogCi0JaWYgKChwaGJhLT5wcG9ydC0+ZmNfZmxhZyAmIEZDX09GRkxJTkVfTU9ERSkgfHwKLQkJKCEocHNsaS0+c2xpX2ZsYWcgJiBMUEZDX1NMSV9BQ1RJVkUpKSkKKwlpZiAocGhiYS0+cHBvcnQtPmZjX2ZsYWcgJiBGQ19PRkZMSU5FX01PREUpCiAJCXJjID0gTUJYX05PVF9GSU5JU0hFRDsKIAllbHNlCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIHBtYm94cSwgcGhiYS0+ZmNfcmF0b3YgKiAyKTsKQEAgLTE5NDksNiArMTk0Nyw1OSBAQAogTFBGQ19BVFRSX1Ioc3VwcHJlc3NfbGlua191cCwgTFBGQ19JTklUSUFMSVpFX0xJTkssIExQRkNfSU5JVElBTElaRV9MSU5LLAogCQlMUEZDX0RFTEFZX0lOSVRfTElOS19JTkRFRklOSVRFTFksCiAJCSJTdXBwcmVzcyBMaW5rIFVwIGF0IGluaXRpYWxpemF0aW9uIik7CisvKgorIyBscGZjX2NudDogTnVtYmVyIG9mIElPQ0JzIGFsbG9jYXRlZCBmb3IgRUxTLCBDVCwgYW5kIEFCVFMKKyMgICAgICAgMSAtICgxMDI0KQorIyAgICAgICAyIC0gKDIwNDgpCisjICAgICAgIDMgLSAoMzA3MikKKyMgICAgICAgNCAtICg0MDk2KQorIyAgICAgICA1IC0gKDUxMjApCisqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaW9jYl9od19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHBoYmEtPmlvY2JfbWF4KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGlvY2JfaHcsIFNfSVJVR08sCisJCQkgbHBmY19pb2NiX2h3X3Nob3csIE5VTEwpOworc3RhdGljIHNzaXplX3QKK2xwZmNfdHhxX2h3X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR10udHhxX21heCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0eHFfaHcsIFNfSVJVR08sCisJCQkgbHBmY190eHFfaHdfc2hvdywgTlVMTCk7CitzdGF0aWMgc3NpemVfdAorbHBmY190eGNtcGxxX2h3X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQlwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXS50eGNtcGxxX21heCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0eGNtcGxxX2h3LCBTX0lSVUdPLAorCQkJIGxwZmNfdHhjbXBscV9od19zaG93LCBOVUxMKTsKKworaW50IGxwZmNfaW9jYl9jbnQgPSAyOworbW9kdWxlX3BhcmFtKGxwZmNfaW9jYl9jbnQsIGludCwgMSk7CitNT0RVTEVfUEFSTV9ERVNDKGxwZmNfaW9jYl9jbnQsCisJIk51bWJlciBvZiBJT0NCcyBhbGxvYyBmb3IgRUxTLCBDVCwgYW5kIEFCVFM6IDFrIHRvIDVrIElPQ0JzIik7CitscGZjX3BhcmFtX3Nob3coaW9jYl9jbnQpOworbHBmY19wYXJhbV9pbml0KGlvY2JfY250LCAyLCAxLCA1KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX2lvY2JfY250LCBTX0lSVUdPLAorCQkJIGxwZmNfaW9jYl9jbnRfc2hvdywgTlVMTCk7CiAKIC8qCiAjIGxwZmNfbm9kZXZfdG1vOiBJZiBzZXQsIGl0IHdpbGwgaG9sZCBhbGwgSS9PIGVycm9ycyBvbiBkZXZpY2VzIHRoYXQgZGlzYXBwZWFyCkBAIC0yMTU3LDYgKzIyMDgsMTMgQEAKIAkJICAiTWF4IG51bWJlciBvZiBGQ1AgY29tbWFuZHMgd2UgY2FuIHF1ZXVlIHRvIGEgc3BlY2lmaWMgTFVOIik7CiAKIC8qCisjIHRndF9xdWV1ZV9kZXB0aDogIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZworIyBjb21tYW5kcyBwZXIgdGFyZ2V0IHBvcnQuIFZhbHVlIHJhbmdlIGlzIFsxMCw2NTUzNV0uIERlZmF1bHQgdmFsdWUgaXMgNjU1MzUuCisqLworTFBGQ19WUE9SVF9BVFRSX1IodGd0X3F1ZXVlX2RlcHRoLCA2NTUzNSwgMTAsIDY1NTM1LAorCSJNYXggbnVtYmVyIG9mIEZDUCBjb21tYW5kcyB3ZSBjYW4gcXVldWUgdG8gYSBzcGVjaWZpYyB0YXJnZXQgcG9ydCIpOworCisvKgogIyBoYmFfcXVldWVfZGVwdGg6ICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKICMgY29tbWFuZHMgcGVyIGxwZmMgSEJBLiBWYWx1ZSByYW5nZSBpcyBbMzIsODE5Ml0uIElmIHRoaXMgcGFyYW1ldGVyCiAjIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXhjaGFuZ2VzIHN1cHBvcnRlZCBieSB0aGUgSEJBLApAQCAtMjcyMCw3ICsyNzc4LDYgQEAKIAkuYXR0ciA9IHsKIAkJLm5hbWUgPSAibHBmY19kcnZyX3N0YXRfZGF0YSIsCiAJCS5tb2RlID0gU19JUlVTUiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAkuc2l6ZSA9IExQRkNfTUFYX1RBUkdFVCAqIE1BWF9TVEFUX0RBVEFfU0laRV9QRVJfVEFSR0VULAogCS5yZWFkID0gc3lzZnNfZHJ2cl9zdGF0X2RhdGFfcmVhZCwKQEAgLTI4OTAsOSArMjk0Nyw2IEBACiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJaW50IHZhbCA9IDAsIHJjID0gLUVJTlZBTDsKIAotCS8qIEFFUiBub3Qgc3VwcG9ydGVkIG9uIE9DIGRldmljZXMgeWV0ICovCi0JaWYgKHBoYmEtPnBjaV9kZXZfZ3JwID09IExQRkNfUENJX0RFVl9PQykKLQkJcmV0dXJuIC1FUEVSTTsKIAlpZiAoIWlzZGlnaXQoYnVmWzBdKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlaSIsICZ2YWwpICE9IDEpCkBAIC0yOTY1LDEyICszMDE5LDYgQEAKIHN0YXRpYyBpbnQKIGxwZmNfYWVyX3N1cHBvcnRfaW5pdChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGludCB2YWwpCiB7Ci0JLyogQUVSIG5vdCBzdXBwb3J0ZWQgb24gT0MgZGV2aWNlcyB5ZXQgKi8KLQlpZiAocGhiYS0+cGNpX2Rldl9ncnAgPT0gTFBGQ19QQ0lfREVWX09DKSB7Ci0JCXBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9IDA7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCiAJaWYgKHZhbCA9PSAwIHx8IHZhbCA9PSAxKSB7CiAJCXBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9IHZhbDsKIAkJcmV0dXJuIDA7CkBAIC0zMDE1LDkgKzMwNjMsNiBAQAogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJaW50IHZhbCwgcmMgPSAtMTsKIAotCS8qIEFFUiBub3Qgc3VwcG9ydGVkIG9uIE9DIGRldmljZXMgeWV0ICovCi0JaWYgKHBoYmEtPnBjaV9kZXZfZ3JwID09IExQRkNfUENJX0RFVl9PQykKLQkJcmV0dXJuIC1FUEVSTTsKIAlpZiAoIWlzZGlnaXQoYnVmWzBdKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlaSIsICZ2YWwpICE9IDEpCkBAIC0zMDgzLDcgKzMxMjgsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChuZGxwLT5ubHBfc3RhdGUgPT0gTkxQX1NURV9VTlVTRURfTk9ERSkKIAkJCWNvbnRpbnVlOwotCQluZGxwLT5jbWRfcWRlcHRoID0gTFBGQ19NQVhfVEdUX1FERVBUSDsKKwkJbmRscC0+Y21kX3FkZXB0aCA9IHZwb3J0LT5jZmdfdGd0X3F1ZXVlX2RlcHRoOwogCX0KIAlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CiAJcmV0dXJuIDA7CkBAIC0zMjg3LDYgKzMzMzIsNyBAQAogCSZkZXZfYXR0cl9scGZjX3RlbXBfc2Vuc29yLAogCSZkZXZfYXR0cl9scGZjX2xvZ192ZXJib3NlLAogCSZkZXZfYXR0cl9scGZjX2x1bl9xdWV1ZV9kZXB0aCwKKwkmZGV2X2F0dHJfbHBmY190Z3RfcXVldWVfZGVwdGgsCiAJJmRldl9hdHRyX2xwZmNfaGJhX3F1ZXVlX2RlcHRoLAogCSZkZXZfYXR0cl9scGZjX3BlZXJfcG9ydF9sb2dpbiwKIAkmZGV2X2F0dHJfbHBmY19ub2Rldl90bW8sCkBAIC0zMzM0LDYgKzMzODAsMTAgQEAKIAkmZGV2X2F0dHJfbHBmY19hZXJfc3VwcG9ydCwKIAkmZGV2X2F0dHJfbHBmY19hZXJfc3RhdGVfY2xlYW51cCwKIAkmZGV2X2F0dHJfbHBmY19zdXBwcmVzc19saW5rX3VwLAorCSZkZXZfYXR0cl9scGZjX2lvY2JfY250LAorCSZkZXZfYXR0cl9pb2NiX2h3LAorCSZkZXZfYXR0cl90eHFfaHcsCisJJmRldl9hdHRyX3R4Y21wbHFfaHcsCiAJTlVMTCwKIH07CiAKQEAgLTMzNDQsNiArMzM5NCw3IEBACiAJJmRldl9hdHRyX2xwZmNfZHJ2cl92ZXJzaW9uLAogCSZkZXZfYXR0cl9scGZjX2xvZ192ZXJib3NlLAogCSZkZXZfYXR0cl9scGZjX2x1bl9xdWV1ZV9kZXB0aCwKKwkmZGV2X2F0dHJfbHBmY190Z3RfcXVldWVfZGVwdGgsCiAJJmRldl9hdHRyX2xwZmNfbm9kZXZfdG1vLAogCSZkZXZfYXR0cl9scGZjX2Rldmxvc3NfdG1vLAogCSZkZXZfYXR0cl9scGZjX2hiYV9xdWV1ZV9kZXB0aCwKQEAgLTQwNDIsOCArNDA5Myw3IEBACiAJcG1ib3hxLT5jb250ZXh0MSA9IE5VTEw7CiAJcG1ib3hxLT52cG9ydCA9IHZwb3J0OwogCi0JaWYgKCh2cG9ydC0+ZmNfZmxhZyAmIEZDX09GRkxJTkVfTU9ERSkgfHwKLQkJKCEocHNsaS0+c2xpX2ZsYWcgJiBMUEZDX1NMSV9BQ1RJVkUpKSkKKwlpZiAodnBvcnQtPmZjX2ZsYWcgJiBGQ19PRkZMSU5FX01PREUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBwbWJveHEsIE1CWF9QT0xMKTsKIAllbHNlCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIHBtYm94cSwgcGhiYS0+ZmNfcmF0b3YgKiAyKTsKQEAgLTQwNjcsOCArNDExNyw3IEBACiAJcG1ib3hxLT5jb250ZXh0MSA9IE5VTEw7CiAJcG1ib3hxLT52cG9ydCA9IHZwb3J0OwogCi0JaWYgKCh2cG9ydC0+ZmNfZmxhZyAmIEZDX09GRkxJTkVfTU9ERSkgfHwKLQkgICAgKCEocHNsaS0+c2xpX2ZsYWcgJiBMUEZDX1NMSV9BQ1RJVkUpKSkKKwlpZiAodnBvcnQtPmZjX2ZsYWcgJiBGQ19PRkZMSU5FX01PREUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBwbWJveHEsIE1CWF9QT0xMKTsKIAllbHNlCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIHBtYm94cSwgcGhiYS0+ZmNfcmF0b3YgKiAyKTsKQEAgLTQ1MjEsNiArNDU3MCw3IEBACiAJbHBmY19oYmFfbG9nX3ZlcmJvc2VfaW5pdChwaGJhLCBscGZjX2xvZ192ZXJib3NlKTsKIAlscGZjX2Flcl9zdXBwb3J0X2luaXQocGhiYSwgbHBmY19hZXJfc3VwcG9ydCk7CiAJbHBmY19zdXBwcmVzc19saW5rX3VwX2luaXQocGhiYSwgbHBmY19zdXBwcmVzc19saW5rX3VwKTsKKwlscGZjX2lvY2JfY250X2luaXQocGhiYSwgbHBmY19pb2NiX2NudCk7CiAJcmV0dXJuOwogfQogCkBAIC00NTMzLDYgKzQ1ODMsNyBAQAogewogCWxwZmNfbG9nX3ZlcmJvc2VfaW5pdCh2cG9ydCwgbHBmY19sb2dfdmVyYm9zZSk7CiAJbHBmY19sdW5fcXVldWVfZGVwdGhfaW5pdCh2cG9ydCwgbHBmY19sdW5fcXVldWVfZGVwdGgpOworCWxwZmNfdGd0X3F1ZXVlX2RlcHRoX2luaXQodnBvcnQsIGxwZmNfdGd0X3F1ZXVlX2RlcHRoKTsKIAlscGZjX2Rldmxvc3NfdG1vX2luaXQodnBvcnQsIGxwZmNfZGV2bG9zc190bW8pOwogCWxwZmNfbm9kZXZfdG1vX2luaXQodnBvcnQsIGxwZmNfbm9kZXZfdG1vKTsKIAlscGZjX3BlZXJfcG9ydF9sb2dpbl9pbml0KHZwb3J0LCBscGZjX3BlZXJfcG9ydF9sb2dpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYwppbmRleCBkY2YwODgyLi5kNTIxNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKQEAgLTM3Nyw2ICszNzcsMTEgQEAKIAogCWlmIChyYyA9PSBJT0NCX1NVQ0NFU1MpCiAJCXJldHVybiAwOyAvKiBkb25lIGZvciBub3cgKi8KKwllbHNlIGlmIChyYyA9PSBJT0NCX0JVU1kpCisJCXJjID0gRUFHQUlOOworCWVsc2UKKwkJcmMgPSBFSU87CisKIAogCS8qIGlvY2IgZmFpbGVkIHNvIGNsZWFudXAgKi8KIAlwY2lfdW5tYXBfc2cocGhiYS0+cGNpZGV2LCBqb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LApAQCAtNjI1LDYgKzYzMCwxMCBAQAogCWxwZmNfbmxwX3B1dChuZGxwKTsKIAlpZiAocmMgPT0gSU9DQl9TVUNDRVNTKQogCQlyZXR1cm4gMDsgLyogZG9uZSBmb3Igbm93ICovCisJZWxzZSBpZiAocmMgPT0gSU9DQl9CVVNZKQorCQlyYyA9IEVBR0FJTjsKKwllbHNlCisJCXJjID0gRUlPOwogCiAJcGNpX3VubWFwX3NnKHBoYmEtPnBjaWRldiwgam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKIAkJICAgICBqb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIERNQV9UT19ERVZJQ0UpOwpAQCAtOTUzLDEwICs5NjIsMjIgQEAKIAkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgewogCQkJZXZ0X2RhdC0+aW1tZWRfZGF0ID0gcGhiYS0+Y3R4X2lkeDsKIAkJCXBoYmEtPmN0eF9pZHggPSAocGhiYS0+Y3R4X2lkeCArIDEpICUgNjQ7CisJCQkvKiBQcm92aWRlIHdhcm5pbmcgZm9yIG92ZXItcnVuIG9mIHRoZSBjdF9jdHggYXJyYXkgKi8KKwkJCWlmIChwaGJhLT5jdF9jdHhbZXZ0X2RhdC0+aW1tZWRfZGF0XS5mbGFncyAmCisJCQkgICAgVU5TT0xfVkFMSUQpCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0VMUywKKwkJCQkJCSIyNzE3IENUIGNvbnRleHQgYXJyYXkgZW50cnkgIgorCQkJCQkJIlslZF0gb3Zlci1ydW46IG94aWQ6eCV4LCAiCisJCQkJCQkic2lkOngleFxuIiwgcGhiYS0+Y3R4X2lkeCwKKwkJCQkJCXBoYmEtPmN0X2N0eFsKKwkJCQkJCSAgICBldnRfZGF0LT5pbW1lZF9kYXRdLm94aWQsCisJCQkJCQlwaGJhLT5jdF9jdHhbCisJCQkJCQkgICAgZXZ0X2RhdC0+aW1tZWRfZGF0XS5TSUQpOwogCQkJcGhiYS0+Y3RfY3R4W2V2dF9kYXQtPmltbWVkX2RhdF0ub3hpZCA9CiAJCQkJCQlwaW9jYnEtPmlvY2IudWxwQ29udGV4dDsKIAkJCXBoYmEtPmN0X2N0eFtldnRfZGF0LT5pbW1lZF9kYXRdLlNJRCA9CiAJCQkJcGlvY2JxLT5pb2NiLnVuLnJjdmVscy5yZW1vdGVJRDsKKwkJCXBoYmEtPmN0X2N0eFtldnRfZGF0LT5pbW1lZF9kYXRdLmZsYWdzID0gVU5TT0xfVkFMSUQ7CiAJCX0gZWxzZQogCQkJZXZ0X2RhdC0+aW1tZWRfZGF0ID0gcGlvY2JxLT5pb2NiLnVscENvbnRleHQ7CiAKQEAgLTEzMTQsNiArMTMzNSwyMSBAQAogCQkJcmMgPSBJT0NCX0VSUk9SOwogCQkJZ290byBpc3N1ZV9jdF9yc3BfZXhpdDsKIAkJfQorCisJCS8qIENoZWNrIGlmIHRoZSBuZGxwIGlzIGFjdGl2ZSAqLworCQlpZiAoIW5kbHAgfHwgIU5MUF9DSEtfTk9ERV9BQ1QobmRscCkpIHsKKwkJCXJjID0gLUlPQ0JfRVJST1I7CisJCQlnb3RvIGlzc3VlX2N0X3JzcF9leGl0OworCQl9CisKKwkJLyogZ2V0IGEgcmVmZXJuZWNlIGNvdW50IHNvIHRoZSBuZGxwIGRvZXNuJ3QgZ28gYXdheSB3aGlsZQorCQkgKiB3ZSByZXNwb25kCisJCSAqLworCQlpZiAoIWxwZmNfbmxwX2dldChuZGxwKSkgeworCQkJcmMgPSAtSU9DQl9FUlJPUjsKKwkJCWdvdG8gaXNzdWVfY3RfcnNwX2V4aXQ7CisJCX0KKwogCQlpY21kLT51bi51bHBXb3JkWzNdID0gbmRscC0+bmxwX3JwaTsKIAkJLyogVGhlIGV4Y2hhbmdlIGlzIGRvbmUsIG1hcmsgdGhlIGVudHJ5IGFzIGludmFsaWQgKi8KIAkJcGhiYS0+Y3RfY3R4W3RhZ10uZmxhZ3MgJj0gflVOU09MX1ZBTElEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAppbmRleCBmYmM5YmFlLi4wM2Y0ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaApAQCAtNDEsNiArNDEsNyBAQAogdm9pZCBscGZjX3JlYWRfbG5rX3N0YXQoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIGludCBscGZjX3JlZ19ycGkoc3RydWN0IGxwZmNfaGJhICosIHVpbnQxNl90LCB1aW50MzJfdCwgdWludDhfdCAqLAogCQkgTFBGQ19NQk9YUV90ICosIHVpbnQzMl90KTsKK3ZvaWQgbHBmY19zZXRfdmFyKHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKIHZvaWQgbHBmY191bnJlZ19sb2dpbihzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDE2X3QsIHVpbnQzMl90LCBMUEZDX01CT1hRX3QgKik7CiB2b2lkIGxwZmNfdW5yZWdfZGlkKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MTZfdCwgdWludDMyX3QsIExQRkNfTUJPWFFfdCAqKTsKIHZvaWQgbHBmY19yZWdfdnBpKHN0cnVjdCBscGZjX3Zwb3J0ICosIExQRkNfTUJPWFFfdCAqKTsKQEAgLTE5MCw2ICsxOTEsNyBAQAogaXJxcmV0dXJuX3QgbHBmY19zbGk0X2ZwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKik7CiAKIHZvaWQgbHBmY19yZWFkX3JldihzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICopOwordm9pZCBscGZjX3NsaTRfc3dhcF9zdHIoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIHZvaWQgbHBmY19jb25maWdfcmluZyhzdHJ1Y3QgbHBmY19oYmEgKiwgaW50LCBMUEZDX01CT1hRX3QgKik7CiB2b2lkIGxwZmNfY29uZmlnX3BvcnQoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIHZvaWQgbHBmY19raWxsX2JvYXJkKHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKik7CkBAIC00MDIsMyArNDA0LDEyIEBACiBpbnQgbHBmY19ic2dfdGltZW91dChzdHJ1Y3QgZmNfYnNnX2pvYiAqKTsKIGludCBscGZjX2JzZ19jdF91bnNvbF9ldmVudChzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfc2xpX3JpbmcgKiwKIAkJCSAgICAgc3RydWN0IGxwZmNfaW9jYnEgKik7Cit2b2lkIF9fbHBmY19zbGlfcmluZ3R4X3B1dChzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfc2xpX3JpbmcgKiwKKwlzdHJ1Y3QgbHBmY19pb2NicSAqKTsKK3N0cnVjdCBscGZjX2lvY2JxICpscGZjX3NsaV9yaW5ndHhfZ2V0KHN0cnVjdCBscGZjX2hiYSAqLAorCXN0cnVjdCBscGZjX3NsaV9yaW5nICopOworaW50IF9fbHBmY19zbGlfaXNzdWVfaW9jYihzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDMyX3QsCisJc3RydWN0IGxwZmNfaW9jYnEgKiwgdWludDMyX3QpOwordWludDMyX3QgbHBmY19kcmFpbl90eHEoc3RydWN0IGxwZmNfaGJhICopOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGlzYy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKaW5kZXggMzYyNTdhNi4uN2NhZTY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKQEAgLTExNCw2ICsxMTQsOCBAQAogfTsKIAogLyogRGVmaW5lcyBmb3IgbmxwX2ZsYWcgKHVpbnQzMikgKi8KKyNkZWZpbmUgTkxQX0lHTlJfUkVHX0NNUEwgIDB4MDAwMDAwMDEgLyogUmN2ZCByc2NuIGJlZm9yZSB3ZSBjbXBsIHJlZyBsb2dpbiAqLworI2RlZmluZSBOTFBfUkVHX0xPR0lOX1NFTkQgMHgwMDAwMDAwMiAgIC8qIHNlbnQgcmVnbG9naW4gdG8gYWRhcHRlciAqLwogI2RlZmluZSBOTFBfUExPR0lfU05EICAgICAgMHgwMDAwMDAyMAkvKiBzZW50IFBMT0dJIHJlcXVlc3QgZm9yIHRoaXMgZW50cnkgKi8KICNkZWZpbmUgTkxQX1BSTElfU05EICAgICAgIDB4MDAwMDAwNDAJLyogc2VudCBQUkxJIHJlcXVlc3QgZm9yIHRoaXMgZW50cnkgKi8KICNkZWZpbmUgTkxQX0FESVNDX1NORCAgICAgIDB4MDAwMDAwODAJLyogc2VudCBBRElTQyByZXF1ZXN0IGZvciB0aGlzIGVudHJ5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwppbmRleCBjNGM3ZjBhLi5hZmJlZDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTc5Niw3ICs3OTYsOSBAQAogCQkgKiBkdWUgdG8gbmV3IEZDRiBkaXNjb3ZlcnkKIAkJICovCiAJCWlmICgocGhiYS0+aGJhX2ZsYWcgJiBIQkFfRklQX1NVUFBPUlQpICYmCi0JCSAgICAocGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX0RJU0NPVkVSWSkpIHsKKwkJICAgIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfRElTQ09WRVJZKSAmJgorCQkgICAgKGlyc3AtPnVscFN0YXR1cyAhPSBJT1NUQVRfTE9DQUxfUkVKRUNUKSAmJgorCQkgICAgKGlyc3AtPnVuLnVscFdvcmRbNF0gIT0gSU9FUlJfU0xJX0FCT1JURUQpKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRklQIHwgTE9HX0VMUywKIAkJCQkJIjI2MTEgRkxPR0kgZmFpbGVkIG9uIHJlZ2lzdGVyZWQgIgogCQkJCQkiRkNGIHJlY29yZCBmY2ZfaW5kZXg6JWQsIHRyeWluZyAiCkBAIC04MTEsMTggKzgxMywyMSBAQAogCQkJCSAqLwogCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsCiAJCQkJCQlMT0dfRklQIHwgTE9HX0VMUywKLQkJCQkJCSIyNzYwIEZMT0dJIGV4aGF1c3RlZCBGQ0YgIgotCQkJCQkJInJvdW5kIHJvYmluIGZhaWxvdmVyIGxpc3QsICIKLQkJCQkJCSJyZXRyeSBGTE9HSSBvbiB0aGUgY3VycmVudCAiCi0JCQkJCQkicmVnaXN0ZXJlZCBGQ0YgaW5kZXg6JWRcbiIsCisJCQkJCQkiMjc2MCBDb21wbGV0ZWQgb25lIHJvdW5kICIKKwkJCQkJCSJvZiBGTE9HSSBGQ0Ygcm91bmQgcm9iaW4gIgorCQkJCQkJImZhaWxvdmVyIGxpc3QsIHJldHJ5IEZMT0dJICIKKwkJCQkJCSJvbiBjdXJyZW50bHkgcmVnaXN0ZXJlZCAiCisJCQkJCQkiRkNGIGluZGV4OiVkXG4iLAogCQkJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4KTsKLQkJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJCQlwaGJhLT5mY2YuZmNmX2ZsYWcgJj0gfkZDRl9ESVNDT1ZFUlk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJCX0gZWxzZSB7CisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywKKwkJCQkJCUxPR19GSVAgfCBMT0dfRUxTLAorCQkJCQkJIjI3OTQgRkxPR0kgRkNGIHJvdW5kIHJvYmluICIKKwkJCQkJCSJmYWlsb3ZlciB0byBGQ0YgaW5kZXggeCV4XG4iLAorCQkJCQkJZmNmX2luZGV4KTsKIAkJCQlyYyA9IGxwZmNfc2xpNF9mY2ZfcnJfcmVhZF9mY2ZfcmVjKHBoYmEsCiAJCQkJCQkJCSAgIGZjZl9pbmRleCk7Ci0JCQkJaWYgKHJjKSB7CisJCQkJaWYgKHJjKQogCQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAogCQkJCQkJCUxPR19GSVAgfCBMT0dfRUxTLAogCQkJCQkJCSIyNzYxIEZMT0dJIHJvdW5kICIKQEAgLTgzMSwxMCArODM2LDcgQEAKIAkJCQkJCQkicmM6eCV4LCBmY2ZfaW5kZXg6IgogCQkJCQkJCSIlZFxuIiwgcmMsCiAJCQkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmNmX2luZHgpOwotCQkJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJCQkJcGhiYS0+ZmNmLmZjZl9mbGFnICY9IH5GQ0ZfRElTQ09WRVJZOwotCQkJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCQkJCX0gZWxzZQorCQkJCWVsc2UKIAkJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTg5MCw5ICs4OTIsMzkgQEAKIAkJICovCiAJCWlmIChzcC0+Y21uLmZQb3J0KQogCQkJcmMgPSBscGZjX2NtcGxfZWxzX2Zsb2dpX2ZhYnJpYyh2cG9ydCwgbmRscCwgc3AsIGlyc3ApOwotCQllbHNlCisJCWVsc2UgaWYgKCEocGhiYS0+aGJhX2ZsYWcgJiBIQkFfRkNPRV9TVVBQT1JUKSkKIAkJCXJjID0gbHBmY19jbXBsX2Vsc19mbG9naV9ucG9ydCh2cG9ydCwgbmRscCwgc3ApOwotCisJCWVsc2UgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsCisJCQkJTE9HX0ZJUCB8IExPR19FTFMsCisJCQkJIjI4MzEgRkxPR0kgcmVzcG9uc2Ugd2l0aCBjbGVhcmVkIEZhYnJpYyAiCisJCQkJImJpdCBmY2ZfaW5kZXggMHgleCAiCisJCQkJIlN3aXRjaCBOYW1lICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCQkiRmFicmljIE5hbWUgIgorCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmNmX2luZHgsCisJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLnN3aXRjaF9uYW1lWzBdLAorCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5zd2l0Y2hfbmFtZVsxXSwKKwkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuc3dpdGNoX25hbWVbMl0sCisJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLnN3aXRjaF9uYW1lWzNdLAorCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5zd2l0Y2hfbmFtZVs0XSwKKwkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuc3dpdGNoX25hbWVbNV0sCisJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLnN3aXRjaF9uYW1lWzZdLAorCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5zd2l0Y2hfbmFtZVs3XSwKKwkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmFicmljX25hbWVbMF0sCisJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZhYnJpY19uYW1lWzFdLAorCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5mYWJyaWNfbmFtZVsyXSwKKwkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmFicmljX25hbWVbM10sCisJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZhYnJpY19uYW1lWzRdLAorCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5mYWJyaWNfbmFtZVs1XSwKKwkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmFicmljX25hbWVbNl0sCisJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZhYnJpY19uYW1lWzddKTsKKwkJCWxwZmNfbmxwX3B1dChuZGxwKTsKKwkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJcGhiYS0+ZmNmLmZjZl9mbGFnICY9IH5GQ0ZfRElTQ09WRVJZOworCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWlmICghcmMpIHsKIAkJCS8qIE1hcmsgdGhlIEZDRiBkaXNjb3ZlcnkgcHJvY2VzcyBkb25lICovCiAJCQlpZiAocGhiYS0+aGJhX2ZsYWcgJiBIQkFfRklQX1NVUFBPUlQpCkBAIC0xNDcyLDggKzE1MDQsMTIgQEAKIAkJCX0KIAkJCWdvdG8gb3V0OwogCQl9Ci0JCS8qIFBMT0dJIGZhaWxlZCAqLwotCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0VMUywKKwkJLyogUExPR0kgZmFpbGVkIERvbid0IHByaW50IHRoZSB2cG9ydCB0byB2cG9ydCByanRzICovCisJCWlmIChpcnNwLT51bHBTdGF0dXMgIT0gSU9TVEFUX0xTX1JKVCB8fAorCQkJKCgoaXJzcC0+dW4udWxwV29yZFs0XSkgPj4gMTYgIT0gTFNSSlRfSU5WQUxJRF9DTUQpICYmCisJCQkoKGlyc3AtPnVuLnVscFdvcmRbNF0pID4+IDE2ICE9IExTUkpUX1VOQUJMRV9UUEMpKSB8fAorCQkJKHBoYmEpLT5wcG9ydC0+Y2ZnX2xvZ192ZXJib3NlICYgTE9HX0VMUykKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRUxTLAogCQkJCSAiMjc1MyBQTE9HSSBmYWlsdXJlIERJRDolMDZYIFN0YXR1czp4JXgveCV4XG4iLAogCQkJCSBuZGxwLT5ubHBfRElELCBpcnNwLT51bHBTdGF0dXMsCiAJCQkJIGlyc3AtPnVuLnVscFdvcmRbNF0pOwpAQCAtMjc0MCw2ICsyNzc2LDE1IEBACiAJCQkJcmV0cnkgPSAxOwogCQkJCWJyZWFrOwogCQkJfQorCQkJaWYgKHN0YXQudW4uYi5sc1JqdFJzbkNvZGVFeHAgPT0KKwkJCSAgICBMU0VYUF9DQU5UX0dJVkVfREFUQSkgeworCQkJCWlmIChjbWQgPT0gRUxTX0NNRF9QTE9HSSkgeworCQkJCQlkZWxheSA9IDEwMDA7CisJCQkJCW1heHJldHJ5ID0gNDg7CisJCQkJfQorCQkJCXJldHJ5ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWlmIChjbWQgPT0gRUxTX0NNRF9QTE9HSSkgewogCQkJCWRlbGF5ID0gMTAwMDsKIAkJCQltYXhyZXRyeSA9IGxwZmNfbWF4X2Vsc190cmllcyArIDE7CkBAIC01MTM1LDYgKzUxODAsNyBAQAogCXJldHVybjsKIH0KIAorCiAvKioKICAqIGxwZmNfZWxzX3RpbWVvdXRfaGFuZGxlciAtIFByb2Nlc3MgYW4gZWxzIHRpbWVvdXQgZXZlbnQKICAqIEB2cG9ydDogcG9pbnRlciB0byBhIHZpcnR1YWwgTl9Qb3J0IGRhdGEgc3RydWN0dXJlLgpAQCAtNTE1NSwxMyArNTIwMSwxOSBAQAogCXVpbnQzMl90IGVsc19jb21tYW5kID0gMDsKIAl1aW50MzJfdCB0aW1lb3V0OwogCXVpbnQzMl90IHJlbW90ZV9JRCA9IDB4ZmZmZmZmZmY7CisJTElTVF9IRUFEKHR4Y21wbHFfY29tcGxldGlvbnMpOworCUxJU1RfSEVBRChhYm9ydF9saXN0KTsKIAotCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCiAJdGltZW91dCA9ICh1aW50MzJfdCkocGhiYS0+ZmNfcmF0b3YgPDwgMSk7CiAKIAlwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhjbXBscSwgbGlzdCkgeworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJnByaW5nLT50eGNtcGxxLCAmdHhjbXBscV9jb21wbGV0aW9ucyk7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZ0eGNtcGxxX2NvbXBsZXRpb25zLCBsaXN0KSB7CiAJCWNtZCA9ICZwaW9jYi0+aW9jYjsKIAogCQlpZiAoKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0xJQkRGQykgIT0gMCB8fApAQCAtNTE5OCwxNCArNTI1MCwyMyBAQAogCQkJaWYgKG5kbHAgJiYgTkxQX0NIS19OT0RFX0FDVChuZGxwKSkKIAkJCQlyZW1vdGVfSUQgPSBuZGxwLT5ubHBfRElEOwogCQl9Ci0JCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRUxTLAotCQkJCSAiMDEyNyBFTFMgdGltZW91dCBEYXRhOiB4JXggeCV4IHgleCAiCi0JCQkJICJ4JXhcbiIsIGVsc19jb21tYW5kLAotCQkJCSByZW1vdGVfSUQsIGNtZC0+dWxwQ29tbWFuZCwgY21kLT51bHBJb1RhZyk7Ci0JCWxwZmNfc2xpX2lzc3VlX2Fib3J0X2lvdGFnKHBoYmEsIHByaW5nLCBwaW9jYik7CisJCWxpc3RfYWRkX3RhaWwoJnBpb2NiLT5kbGlzdCwgJmFib3J0X2xpc3QpOwogCX0KKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlsaXN0X3NwbGljZSgmdHhjbXBscV9jb21wbGV0aW9ucywgJnByaW5nLT50eGNtcGxxKTsKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJmFib3J0X2xpc3QsIGRsaXN0KSB7CisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRUxTLAorCQkJICIwMTI3IEVMUyB0aW1lb3V0IERhdGE6IHgleCB4JXggeCV4ICIKKwkJCSAieCV4XG4iLCBlbHNfY29tbWFuZCwKKwkJCSByZW1vdGVfSUQsIGNtZC0+dWxwQ29tbWFuZCwgY21kLT51bHBJb1RhZyk7CisJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQlsaXN0X2RlbF9pbml0KCZwaW9jYi0+ZGxpc3QpOworCQlscGZjX3NsaV9pc3N1ZV9hYm9ydF9pb3RhZyhwaGJhLCBwcmluZywgcGlvY2IpOworCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCX0KKwogCWlmIChwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXS50eGNtcGxxX2NudCkKIAkJbW9kX3RpbWVyKCZ2cG9ydC0+ZWxzX3Rtb2Z1bmMsIGppZmZpZXMgKyBIWiAqIHRpbWVvdXQpOwogfQpAQCAtNjkwMSw2ICs2OTYyLDcgQEAKIAl1aW50MTZfdCB4cmkgPSBiZl9nZXQobHBmY193Y3FlX3hhX3hyaSwgYXhyaSk7CiAJc3RydWN0IGxwZmNfc2dscSAqc2dscV9lbnRyeSA9IE5VTEwsICpzZ2xxX25leHQgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgaWZsYWcgPSAwOworCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJc3Bpbl9sb2NrKCZwaGJhLT5zbGk0X2hiYS5hYnRzX3NnbF9saXN0X2xvY2spOwpAQCAtNjkxMyw2ICs2OTc1LDEwIEBACiAJCQlzZ2xxX2VudHJ5LT5zdGF0ZSA9IFNHTF9GUkVFRDsKIAkJCXNwaW5fdW5sb2NrKCZwaGJhLT5zbGk0X2hiYS5hYnRzX3NnbF9saXN0X2xvY2spOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOworCisJCQkvKiBDaGVjayBpZiBUWFEgcXVldWUgbmVlZHMgdG8gYmUgc2VydmljZWQgKi8KKwkJCWlmIChwcmluZy0+dHhxX2NudCkKKwkJCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCAxZjg3YjRmLi4wNjM5Yzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMjc1LDcgKzI3NSw5IEBACiAJaWYgKCEodnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykgJiYKIAkgICAgIShuZGxwLT5ubHBfZmxhZyAmIE5MUF9ERUxBWV9UTU8pICYmCiAJICAgICEobmRscC0+bmxwX2ZsYWcgJiBOTFBfTlBSXzJCX0RJU0MpICYmCi0JICAgIChuZGxwLT5ubHBfc3RhdGUgIT0gTkxQX1NURV9VTk1BUFBFRF9OT0RFKSkKKwkgICAgKG5kbHAtPm5scF9zdGF0ZSAhPSBOTFBfU1RFX1VOTUFQUEVEX05PREUpICYmCisJICAgIChuZGxwLT5ubHBfc3RhdGUgIT0gTkxQX1NURV9SRUdfTE9HSU5fSVNTVUUpICYmCisJICAgIChuZGxwLT5ubHBfc3RhdGUgIT0gTkxQX1NURV9QUkxJX0lTU1VFKSkKIAkJbHBmY19kaXNjX3N0YXRlX21hY2hpbmUodnBvcnQsIG5kbHAsIE5VTEwsIE5MUF9FVlRfREVWSUNFX1JNKTsKIAogCWxwZmNfdW5yZWdpc3Rlcl91bnVzZWRfZmNmKHBoYmEpOwpAQCAtNTg2LDYgKzU4OCw4IEBACiAJCQkJCQkJKHN0YXR1cyAmCiAJCQkJCQkJIEhBX1JYTUFTSykpOwogCQl9CisJCWlmIChwcmluZy0+dHhxX2NudCkKKwkJCWxwZmNfZHJhaW5fdHhxKHBoYmEpOwogCQkvKgogCQkgKiBUdXJuIG9uIFJpbmcgaW50ZXJydXB0cwogCQkgKi8KQEAgLTEyOTcsNyArMTMwMSw3IEBACiAgKiB1c2VkIGZvciB0aGlzIEZDRiB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLgogICogSWYgdGhlIEZDRiByZWNvcmQgbmVlZCB0byBiZSB1c2VkIHdpdGggYSBwYXJ0aWN1bGFyIHZsYW4gaWQsIHRoZSB2bGFuIGlzCiAgKiBzZXQgaW4gdGhlIHZsYW5faWQgb24gcmV0dXJuIG9mIHRoZSBmdW5jdGlvbi4gSWYgbm90IFZMQU4gdGFnZ2luZyBuZWVkIHRvCi0gKiBiZSB1c2VkIHdpdGggdGhlIEZDRiB2bGFuX2lkIHdpbGwgYmUgc2V0IHRvIDB4RkZGRjsKKyAqIGJlIHVzZWQgd2l0aCB0aGUgRkNGIHZsYW5faWQgd2lsbCBiZSBzZXQgdG8gTFBGQ19GQ09FX05VTExfVklEOwogICoqLwogc3RhdGljIGludAogbHBmY19tYXRjaF9mY2ZfY29ubl9saXN0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKQEAgLTEzMzMsNyArMTMzNyw3IEBACiAJCWlmIChwaGJhLT52YWxpZF92bGFuKQogCQkJKnZsYW5faWQgPSBwaGJhLT52bGFuX2lkOwogCQllbHNlCi0JCQkqdmxhbl9pZCA9IDB4RkZGRjsKKwkJCSp2bGFuX2lkID0gTFBGQ19GQ09FX05VTExfVklEOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTEzNTcsNyArMTM2MSw3IEBACiAJCWlmIChmY2Zfdmxhbl9pZCkKIAkJCSp2bGFuX2lkID0gZmNmX3ZsYW5faWQ7CiAJCWVsc2UKLQkJCSp2bGFuX2lkID0gMHhGRkZGOworCQkJKnZsYW5faWQgPSBMUEZDX0ZDT0VfTlVMTF9WSUQ7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMTQ2Niw3ICsxNDcwLDcgQEAKIAkJZWxzZSBpZiAoZmNmX3ZsYW5faWQpCiAJCQkqdmxhbl9pZCA9IGZjZl92bGFuX2lkOwogCQllbHNlCi0JCQkqdmxhbl9pZCA9IDB4RkZGRjsKKwkJCSp2bGFuX2lkID0gTFBGQ19GQ09FX05VTExfVklEOwogCiAJCXJldHVybiAxOwogCX0KQEAgLTE1MTgsNiArMTUyMiw5IEBACiAJCSAqIERvIG5vdCBjb250aW51ZSBGQ0YgZGlzY292ZXJ5IGFuZCBjbGVhciBGQ0ZfRElTQ19JTlBST0dSRVNTCiAJCSAqIGZsYWcKIAkJICovCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAgfCBMT0dfRElTQ09WRVJZLAorCQkJCSIyODMzIFN0b3AgRkNGIGRpc2NvdmVyeSBwcm9jZXNzIGR1ZSB0byBsaW5rICIKKwkJCQkic3RhdGUgY2hhbmdlICh4JXgpXG4iLCBwaGJhLT5saW5rX3N0YXRlKTsKIAkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCXBoYmEtPmhiYV9mbGFnICY9IH5GQ0ZfRElTQ19JTlBST0dSRVNTOwogCQlwaGJhLT5mY2YuZmNmX2ZsYWcgJj0gfihGQ0ZfUkVESVNDX0ZPViB8IEZDRl9ESVNDT1ZFUlkpOwpAQCAtMTU2NSw3ICsxNTcyLDcgQEAKIH0KIAogLyoqCi0gKiBscGZjX21ieF9jbXBsX3JlYWRfZmNmX3JlY29yZCAtIENvbXBsZXRpb24gaGFuZGxlciBmb3IgcmVhZF9mY2YgbWJveC4KKyAqIGxwZmNfc2xpNF9mY2ZfcmVjX21ib3hfcGFyc2UgLSBQYXJzZSByZWFkX2ZjZiBtYm94IGNvbW1hbmQuCiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqIEBtYm94cTogcG9pbnRlciB0byBtYWlsYm94IG9iamVjdC4KICAqIEBuZXh0X2ZjZl9pbmRleDogcG9pbnRlciB0byBob2xkZXIgb2YgbmV4dCBmY2YgaW5kZXguCkBAIC0xNjkzLDYgKzE3MDAsMzcgQEAKIH0KIAogLyoqCisgbHBmY19zbGk0X2ZjZl9yZWNvcmRfbWF0Y2ggLSB0ZXN0aW5nIG5ldyBGQ0YgcmVjb3JkIGZvciBtYXRjaGluZyBleGlzdGluZyBGQ0YKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQGZjZl9yZWM6IHBvaW50ZXIgdG8gYW4gZXhpc3RpbmcgRkNGIHJlY29yZC4KKyAqIEBuZXdfZmNmX3JlY29yZDogcG9pbnRlciB0byBhIG5ldyBGQ0YgcmVjb3JkLgorICogQG5ld192bGFuX2lkOiB2bGFuIGlkIGZyb20gdGhlIG5ldyBGQ0YgcmVjb3JkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbWF0Y2hpbmcgdGVzdCBvZiBhIG5ldyBGQ0YgcmVjb3JkIGFnYWluc3QgYW4gZXhpc3RpbmcKKyAqIEZDRiByZWNvcmQuIElmIHRoZSBuZXdfdmxhbl9pZCBwYXNzZWQgaW4gaXMgTFBGQ19GQ09FX0lHTk9SRV9WSUQsIHZsYW4gaWQKKyAqIHdpbGwgbm90IGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRkNGIHJlY29yZCBtYXRjaGluZyBjcml0ZXJpYS4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHRoZSBmaWVsZHMgbWF0Y2hpbmcsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgYm9vbAorbHBmY19zbGk0X2ZjZl9yZWNvcmRfbWF0Y2goc3RydWN0IGxwZmNfaGJhICpwaGJhLAorCQkJICAgc3RydWN0IGxwZmNfZmNmX3JlYyAqZmNmX3JlYywKKwkJCSAgIHN0cnVjdCBmY2ZfcmVjb3JkICpuZXdfZmNmX3JlY29yZCwKKwkJCSAgIHVpbnQxNl90IG5ld192bGFuX2lkKQoreworCWlmIChuZXdfdmxhbl9pZCAhPSBMUEZDX0ZDT0VfSUdOT1JFX1ZJRCkKKwkJaWYgKCFscGZjX3ZsYW5faWRfbWF0Y2goZmNmX3JlYy0+dmxhbl9pZCwgbmV3X3ZsYW5faWQpKQorCQkJcmV0dXJuIGZhbHNlOworCWlmICghbHBmY19tYWNfYWRkcl9tYXRjaChmY2ZfcmVjLT5tYWNfYWRkciwgbmV3X2ZjZl9yZWNvcmQpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFscGZjX3N3X25hbWVfbWF0Y2goZmNmX3JlYy0+c3dpdGNoX25hbWUsIG5ld19mY2ZfcmVjb3JkKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghbHBmY19mYWJfbmFtZV9tYXRjaChmY2ZfcmVjLT5mYWJyaWNfbmFtZSwgbmV3X2ZjZl9yZWNvcmQpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgogICogbHBmY19tYnhfY21wbF9mY2Zfc2Nhbl9yZWFkX2ZjZl9yZWMgLSBmY2Ygc2NhbiByZWFkX2ZjZiBtYm94IGNtcGwgaGFuZGxlci4KICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICogQG1ib3hxOiBwb2ludGVyIHRvIG1haWxib3ggb2JqZWN0LgpAQCAtMTc1NSw3ICsxNzkzLDcgQEAKIAkgKi8KIAlpZiAoIXJjKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19GSVAsCi0JCQkJIjI3ODEgRkNGIHJlY29yZCBmY2ZfaW5kZXg6eCV4IGZhaWxlZCBGQ0YgIgorCQkJCSIyNzgxIEZDRiByZWNvcmQgKHgleCkgZmFpbGVkIEZDRiAiCiAJCQkJImNvbm5lY3Rpb24gbGlzdCBjaGVjaywgZmNmX2F2YWlsOngleCwgIgogCQkJCSJmY2ZfdmFsaWQ6eCV4XG4iLAogCQkJCWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2luZGV4LApAQCAtMTc2NCw2ICsxODAyLDMyIEBACiAJCQkJICAgICAgIG5ld19mY2ZfcmVjb3JkKSwKIAkJCQliZl9nZXQobHBmY19mY2ZfcmVjb3JkX2ZjZl92YWxpZCwKIAkJCQkgICAgICAgbmV3X2ZjZl9yZWNvcmQpKTsKKwkJaWYgKChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfSU5fVVNFKSAmJgorCQkgICAgbHBmY19zbGk0X2ZjZl9yZWNvcmRfbWF0Y2gocGhiYSwgJnBoYmEtPmZjZi5jdXJyZW50X3JlYywKKwkJICAgIG5ld19mY2ZfcmVjb3JkLCBMUEZDX0ZDT0VfSUdOT1JFX1ZJRCkpIHsKKwkJCS8qCisJCQkgKiBJbiBjYXNlIHRoZSBjdXJyZW50IGluLXVzZSBGQ0YgcmVjb3JkIGJlY29tZXMKKwkJCSAqIGludmFsaWQvdW5hdmFpbGFibGUgZHVyaW5nIEZDRiBkaXNjb3ZlcnkgdGhhdAorCQkJICogd2FzIG5vdCB0cmlnZ2VyZWQgYnkgZmFzdCBGQ0YgZmFpbG92ZXIgcHJvY2VzcywKKwkJCSAqIHRyZWF0IGl0IGFzIGZhc3QgRkNGIGZhaWxvdmVyLgorCQkJICovCisJCQlpZiAoIShwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfUkVESVNDX1BFTkQpICYmCisJCQkgICAgIShwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfUkVESVNDX0ZPVikpIHsKKwkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRklQLAorCQkJCQkJIjI4MzUgSW52YWxpZCBpbi11c2UgRkNGICIKKwkJCQkJCSJyZWNvcmQgKHgleCkgcmVwb3J0ZWQsICIKKwkJCQkJCSJlbnRlcmluZyBmYXN0IEZDRiBmYWlsb3ZlciAiCisJCQkJCQkibW9kZSBzY2FubmluZy5cbiIsCisJCQkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmNmX2luZHgpOworCQkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJCXBoYmEtPmZjZi5mY2ZfZmxhZyB8PSBGQ0ZfUkVESVNDX0ZPVjsKKwkJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3hxKTsKKwkJCQlscGZjX3NsaTRfZmNmX3NjYW5fcmVhZF9mY2ZfcmVjKHBoYmEsCisJCQkJCQlMUEZDX0ZDT0VfRkNGX0dFVF9GSVJTVCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CiAJCWdvdG8gcmVhZF9uZXh0X2ZjZjsKIAl9IGVsc2UgewogCQlmY2ZfaW5kZXggPSBiZl9nZXQobHBmY19mY2ZfcmVjb3JkX2ZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQpOwpAQCAtMTc4MCwxNCArMTg0NCw4IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJaWYgKHBoYmEtPmZjZi5mY2ZfZmxhZyAmIEZDRl9JTl9VU0UpIHsKLQkJaWYgKGxwZmNfZmFiX25hbWVfbWF0Y2gocGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZhYnJpY19uYW1lLAotCQkJCQluZXdfZmNmX3JlY29yZCkgJiYKLQkJICAgIGxwZmNfc3dfbmFtZV9tYXRjaChwaGJhLT5mY2YuY3VycmVudF9yZWMuc3dpdGNoX25hbWUsCi0JCQkJCW5ld19mY2ZfcmVjb3JkKSAmJgotCQkgICAgbHBmY19tYWNfYWRkcl9tYXRjaChwaGJhLT5mY2YuY3VycmVudF9yZWMubWFjX2FkZHIsCi0JCQkJCW5ld19mY2ZfcmVjb3JkKSAmJgotCQkgICAgbHBmY192bGFuX2lkX21hdGNoKHBoYmEtPmZjZi5jdXJyZW50X3JlYy52bGFuX2lkLAotCQkJCQl2bGFuX2lkKSkgeworCQlpZiAobHBmY19zbGk0X2ZjZl9yZWNvcmRfbWF0Y2gocGhiYSwgJnBoYmEtPmZjZi5jdXJyZW50X3JlYywKKwkJICAgIG5ld19mY2ZfcmVjb3JkLCB2bGFuX2lkKSkgewogCQkJcGhiYS0+ZmNmLmZjZl9mbGFnIHw9IEZDRl9BVkFJTEFCTEU7CiAJCQlpZiAocGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX1JFRElTQ19QRU5EKQogCQkJCS8qIFN0b3AgRkNGIHJlZGlzYyB3YWl0IHRpbWVyIGlmIHBlbmRpbmcgKi8KQEAgLTE3OTcsNiArMTg1NSwxMyBAQAogCQkJCXBoYmEtPmZjZi5mY2ZfZmxhZyAmPSB+KEZDRl9SRURJU0NfRk9WIHwKIAkJCQkJCQlGQ0ZfRElTQ09WRVJZKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAorCQkJCQkiMjgzNiBUaGUgbmV3IEZDRiByZWNvcmQgKHgleCkgIgorCQkJCQkibWF0Y2hlcyB0aGUgaW4tdXNlIEZDRiByZWNvcmQgIgorCQkJCQkiKHgleClcbiIsCisJCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCwKKwkJCQkJYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsCisJCQkJCSAgICAgICBuZXdfZmNmX3JlY29yZCkpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJLyoKQEAgLTE4MjgsNiArMTg5MywxMiBAQAogCQkgKi8KIAkJaWYgKGJvb3RfZmxhZyAmJiAhKGZjZl9yZWMtPmZsYWcgJiBCT09UX0VOQUJMRSkpIHsKIAkJCS8qIENob29zZSB0aGlzIEZDRiByZWNvcmQgKi8KKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAsCisJCQkJCSIyODM3IFVwZGF0ZSBjdXJyZW50IEZDRiByZWNvcmQgIgorCQkJCQkiKHgleCkgd2l0aCBuZXcgRkNGIHJlY29yZCAoeCV4KVxuIiwKKwkJCQkJZmNmX3JlYy0+ZmNmX2luZHgsCisJCQkJCWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2luZGV4LAorCQkJCQluZXdfZmNmX3JlY29yZCkpOwogCQkJX19scGZjX3VwZGF0ZV9mY2ZfcmVjb3JkKHBoYmEsIGZjZl9yZWMsIG5ld19mY2ZfcmVjb3JkLAogCQkJCQlhZGRyX21vZGUsIHZsYW5faWQsIEJPT1RfRU5BQkxFKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CkBAIC0xODQ4LDYgKzE5MTksMTIgQEAKIAkJICovCiAJCWlmIChuZXdfZmNmX3JlY29yZC0+ZmlwX3ByaW9yaXR5IDwgZmNmX3JlYy0+cHJpb3JpdHkpIHsKIAkJCS8qIENob29zZSB0aGUgbmV3IEZDRiByZWNvcmQgd2l0aCBsb3dlciBwcmlvcml0eSAqLworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKKwkJCQkJIjI4MzggVXBkYXRlIGN1cnJlbnQgRkNGIHJlY29yZCAiCisJCQkJCSIoeCV4KSB3aXRoIG5ldyBGQ0YgcmVjb3JkICh4JXgpXG4iLAorCQkJCQlmY2ZfcmVjLT5mY2ZfaW5keCwKKwkJCQkJYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsCisJCQkJCSAgICAgICBuZXdfZmNmX3JlY29yZCkpOwogCQkJX19scGZjX3VwZGF0ZV9mY2ZfcmVjb3JkKHBoYmEsIGZjZl9yZWMsIG5ld19mY2ZfcmVjb3JkLAogCQkJCQlhZGRyX21vZGUsIHZsYW5faWQsIDApOwogCQkJLyogUmVzZXQgcnVubmluZyByYW5kb20gRkNGIHNlbGVjdGlvbiBjb3VudCAqLwpAQCAtMTg1NywxMSArMTkzNCwxOCBAQAogCQkJcGhiYS0+ZmNmLmVsaWdpYmxlX2ZjZl9jbnQrKzsKIAkJCXNlbGVjdF9uZXdfZmNmID0gbHBmY19zbGk0X25ld19mY2ZfcmFuZG9tX3NlbGVjdChwaGJhLAogCQkJCQkJcGhiYS0+ZmNmLmVsaWdpYmxlX2ZjZl9jbnQpOwotCQkJaWYgKHNlbGVjdF9uZXdfZmNmKQorCQkJaWYgKHNlbGVjdF9uZXdfZmNmKSB7CisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKKwkJCQkJIjI4MzkgVXBkYXRlIGN1cnJlbnQgRkNGIHJlY29yZCAiCisJCQkJCSIoeCV4KSB3aXRoIG5ldyBGQ0YgcmVjb3JkICh4JXgpXG4iLAorCQkJCQlmY2ZfcmVjLT5mY2ZfaW5keCwKKwkJCQkJYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsCisJCQkJCSAgICAgICBuZXdfZmNmX3JlY29yZCkpOwogCQkJCS8qIENob29zZSB0aGUgbmV3IEZDRiBieSByYW5kb20gc2VsZWN0aW9uICovCiAJCQkJX19scGZjX3VwZGF0ZV9mY2ZfcmVjb3JkKHBoYmEsIGZjZl9yZWMsCiAJCQkJCQkJIG5ld19mY2ZfcmVjb3JkLAogCQkJCQkJCSBhZGRyX21vZGUsIHZsYW5faWQsIDApOworCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCWdvdG8gcmVhZF9uZXh0X2ZjZjsKQEAgLTE4NzEsNiArMTk1NSwxMSBAQAogCSAqIGluaXRpYWwgYmVzdC1maXQgRkNGLgogCSAqLwogCWlmIChmY2ZfcmVjKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAsCisJCQkJIjI4NDAgVXBkYXRlIGN1cnJlbnQgRkNGIHJlY29yZCAiCisJCQkJIndpdGggaW5pdGlhbCBGQ0YgcmVjb3JkICh4JXgpXG4iLAorCQkJCWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2luZGV4LAorCQkJCSAgICAgICBuZXdfZmNmX3JlY29yZCkpOwogCQlfX2xwZmNfdXBkYXRlX2ZjZl9yZWNvcmQocGhiYSwgZmNmX3JlYywgbmV3X2ZjZl9yZWNvcmQsCiAJCQkJCSBhZGRyX21vZGUsIHZsYW5faWQsIChib290X2ZsYWcgPwogCQkJCQkgQk9PVF9FTkFCTEUgOiAwKSk7CkBAIC0xOTI4LDEyICsyMDE3LDIzIEBACiAJCQlscGZjX3VucmVnaXN0ZXJfZmNmKHBoYmEpOwogCiAJCQkvKiBSZXBsYWNlIGluLXVzZSByZWNvcmQgd2l0aCB0aGUgbmV3IHJlY29yZCAqLworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKKwkJCQkJIjI4NDIgUmVwbGFjZSB0aGUgY3VycmVudCBpbi11c2UgIgorCQkJCQkiRkNGIHJlY29yZCAoeCV4KSB3aXRoIGZhaWxvdmVyIEZDRiAiCisJCQkJCSJyZWNvcmQgKHgleClcbiIsCisJCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCwKKwkJCQkJcGhiYS0+ZmNmLmZhaWxvdmVyX3JlYy5mY2ZfaW5keCk7CiAJCQltZW1jcHkoJnBoYmEtPmZjZi5jdXJyZW50X3JlYywKIAkJCSAgICAgICAmcGhiYS0+ZmNmLmZhaWxvdmVyX3JlYywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfZmNmX3JlYykpOwotCQkJLyogbWFyayB0aGUgRkNGIGZhc3QgZmFpbG92ZXIgY29tcGxldGVkICovCisJCQkvKgorCQkJICogTWFyayB0aGUgZmFzdCBGQ0YgZmFpbG92ZXIgcmVkaXNjb3ZlcnkgY29tcGxldGVkCisJCQkgKiBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByb3VuZCBvZiB0aGUgcm91bmRyb2JpbgorCQkJICogRkNGIGZhaWxvdmVyLgorCQkJICovCiAJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJCXBoYmEtPmZjZi5mY2ZfZmxhZyAmPSB+RkNGX1JFRElTQ19GT1Y7CisJCQlwaGJhLT5mY2YuZmNmX2ZsYWcgJj0KKwkJCQkJfihGQ0ZfUkVESVNDX0ZPViB8IEZDRl9SRURJU0NfUlJVKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCQkvKgogCQkJICogU2V0IHVwIHRoZSBpbml0aWFsIHJlZ2lzdGVyZWQgRkNGIGluZGV4IGZvciBGTE9HSQpAQCAtMTk1MSwxNSArMjA1MSw0MiBAQAogCQkJaWYgKChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfUkVESVNDX0VWVCkgfHwKIAkJCSAgICAocGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX1JFRElTQ19QRU5EKSkKIAkJCQlyZXR1cm47CisKKwkJCWlmIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfSU5fVVNFKSB7CisJCQkJLyoKKwkJCQkgKiBJbiBjYXNlIHRoZSBjdXJyZW50IGluLXVzZSBGQ0YgcmVjb3JkIG5vCisJCQkJICogbG9uZ2VyIGV4aXN0ZWQgZHVyaW5nIEZDRiBkaXNjb3ZlcnkgdGhhdAorCQkJCSAqIHdhcyBub3QgdHJpZ2dlcmVkIGJ5IGZhc3QgRkNGIGZhaWxvdmVyCisJCQkJICogcHJvY2VzcywgdHJlYXQgaXQgYXMgZmFzdCBGQ0YgZmFpbG92ZXIuCisJCQkJICovCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKKwkJCQkJCSIyODQxIEluLXVzZSBGQ0YgcmVjb3JkICh4JXgpICIKKwkJCQkJCSJub3QgcmVwb3J0ZWQsIGVudGVyaW5nIGZhc3QgIgorCQkJCQkJIkZDRiBmYWlsb3ZlciBtb2RlIHNjYW5uaW5nLlxuIiwKKwkJCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCk7CisJCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQkJcGhiYS0+ZmNmLmZjZl9mbGFnIHw9IEZDRl9SRURJU0NfRk9WOworCQkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQkJbHBmY19zbGk0X21ib3hfY21kX2ZyZWUocGhiYSwgbWJveHEpOworCQkJCWxwZmNfc2xpNF9mY2Zfc2Nhbl9yZWFkX2ZjZl9yZWMocGhiYSwKKwkJCQkJCUxQRkNfRkNPRV9GQ0ZfR0VUX0ZJUlNUKTsKKwkJCQlyZXR1cm47CisJCQl9CisKIAkJCS8qCiAJCQkgKiBPdGhlcndpc2UsIGluaXRpYWwgc2NhbiBvciBwb3N0IGxpbmtkb3duIHJlc2NhbiwKIAkJCSAqIHJlZ2lzdGVyIHdpdGggdGhlIGJlc3QgRkNGIHJlY29yZCBmb3VuZCBzbyBmYXIKIAkJCSAqIHRocm91Z2ggdGhlIEZDRiBzY2FubmluZyBwcm9jZXNzLgogCQkJICovCiAKLQkJCS8qIG1hcmsgdGhlIGluaXRpYWwgRkNGIGRpc2NvdmVyeSBjb21wbGV0ZWQgKi8KKwkJCS8qCisJCQkgKiBNYXJrIHRoZSBpbml0aWFsIEZDRiBkaXNjb3ZlcnkgY29tcGxldGVkIGFuZAorCQkJICogdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByb3VuZCBvZiB0aGUgcm91bmRyb2JpbgorCQkJICogRkNGIGZhaWxvdmVyLgorCQkJICovCiAJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJCXBoYmEtPmZjZi5mY2ZfZmxhZyAmPSB+RkNGX0lOSVRfRElTQzsKKwkJCXBoYmEtPmZjZi5mY2ZfZmxhZyAmPQorCQkJCQl+KEZDRl9JTklUX0RJU0MgfCBGQ0ZfUkVESVNDX1JSVSk7CiAJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCQkJLyoKIAkJCSAqIFNldCB1cCB0aGUgaW5pdGlhbCByZWdpc3RlcmVkIEZDRiBpbmRleCBmb3IgRkxPR0kKQEAgLTIwMzMsNiArMjE2MCwxMSBAQAogCQkJCSAgICAgIG5leHRfZmNmX2luZGV4KTsKIAogCS8qIFVwbG9hZCBuZXcgRkNGIHJlY29yZCB0byB0aGUgZmFpbG92ZXIgRkNGIHJlY29yZCAqLworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAsCisJCQkiMjgzNCBVcGRhdGUgdGhlIGN1cnJlbnQgRkNGIHJlY29yZCAoeCV4KSAiCisJCQkid2l0aCB0aGUgbmV4dCBGQ0YgcmVjb3JkICh4JXgpXG4iLAorCQkJcGhiYS0+ZmNmLmZhaWxvdmVyX3JlYy5mY2ZfaW5keCwKKwkJCWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2luZGV4LCBuZXdfZmNmX3JlY29yZCkpOwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCV9fbHBmY191cGRhdGVfZmNmX3JlY29yZChwaGJhLCAmcGhiYS0+ZmNmLmZhaWxvdmVyX3JlYywKIAkJCQkgbmV3X2ZjZl9yZWNvcmQsIGFkZHJfbW9kZSwgdmxhbl9pZCwKQEAgLTIwNTAsNyArMjE4Miw3IEBACiAKIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAogCQkJIjI3ODMgRkxPR0kgcm91bmQgcm9iaW4gRkNGIGZhaWxvdmVyIGZyb20gRkNGICIKLQkJCSIoaW5kZXg6eCV4KSB0byBGQ0YgKGluZGV4OngleCkuXG4iLAorCQkJIih4JXgpIHRvIEZDRiAoeCV4KS5cbiIsCiAJCQljdXJyZW50X2ZjZl9pbmRleCwKIAkJCWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2luZGV4LCBuZXdfZmNmX3JlY29yZCkpOwogCkBAIC0yMDg0LDcgKzIyMTYsNyBAQAogCQlnb3RvIG91dDsKIAogCS8qIElmIEZDRiBkaXNjb3ZlcnkgcGVyaW9kIGlzIG92ZXIsIG5vIG5lZWQgdG8gcHJvY2VlZCAqLwotCWlmIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfRElTQ09WRVJZKQorCWlmICghKHBoYmEtPmZjZi5mY2ZfZmxhZyAmIEZDRl9ESVNDT1ZFUlkpKQogCQlnb3RvIG91dDsKIAogCS8qIFBhcnNlIHRoZSBGQ0YgcmVjb3JkIGZyb20gdGhlIG5vbi1lbWJlZGRlZCBtYWlsYm94IGNvbW1hbmQgKi8KQEAgLTI3MTUsMTEgKzI4NDcsMzUgQEAKIAlzdHJ1Y3QgbHBmY192cG9ydCAgKnZwb3J0ID0gcG1iLT52cG9ydDsKIAlzdHJ1Y3QgbHBmY19kbWFidWYgKm1wID0gKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSAocG1iLT5jb250ZXh0MSk7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHAgPSAoc3RydWN0IGxwZmNfbm9kZWxpc3QgKikgcG1iLT5jb250ZXh0MjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnQpOwogCiAJcG1iLT5jb250ZXh0MSA9IE5VTEw7CiAKLQkvKiBHb29kIHN0YXR1cywgY2FsbCBzdGF0ZSBtYWNoaW5lICovCi0JbHBmY19kaXNjX3N0YXRlX21hY2hpbmUodnBvcnQsIG5kbHAsIHBtYiwgTkxQX0VWVF9DTVBMX1JFR19MT0dJTik7CisJaWYgKG5kbHAtPm5scF9mbGFnICYgTkxQX1JFR19MT0dJTl9TRU5EKQorCQluZGxwLT5ubHBfZmxhZyAmPSB+TkxQX1JFR19MT0dJTl9TRU5EOworCisJaWYgKG5kbHAtPm5scF9mbGFnICYgIE5MUF9JR05SX1JFR19DTVBMIHx8CisJCW5kbHAtPm5scF9zdGF0ZSAhPSBOTFBfU1RFX1JFR19MT0dJTl9JU1NVRSkgeworCQkvKiBXZSByY3ZkIGEgcnNjbiBhZnRlciBpc3N1aW5nIHRoaXMKKwkJICogbWJveCByZWcgbG9naW4sIHdlIG1heSBoYXZlIGN5Y2xlZAorCQkgKiBiYWNrIHRocm91Z2ggdGhlIHN0YXRlIGFuZCBiZQorCQkgKiBiYWNrIGF0IHJlZyBsb2dpbiBzdGF0ZSBzbyB0aGlzCisJCSAqIG1ib3ggbmVlZHMgdG8gYmUgaWdub3JlZCBiZWNhc2UKKwkJICogdGhlcmUgaXMgYW5vdGhlciByZWcgbG9naW4gaW4KKwkJICogcHJvY2Nlc3MuCisJCSAqLworCQlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCQluZGxwLT5ubHBfZmxhZyAmPSB+TkxQX0lHTlJfUkVHX0NNUEw7CisJCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKKwkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJCWxwZmNfc2xpNF9mcmVlX3JwaShwaGJhLAorCQkJCXBtYi0+dS5tYi51bi52YXJSZWdMb2dpbi5ycGkpOworCisJfSBlbHNlCisJCS8qIEdvb2Qgc3RhdHVzLCBjYWxsIHN0YXRlIG1hY2hpbmUgKi8KKwkJbHBmY19kaXNjX3N0YXRlX21hY2hpbmUodnBvcnQsIG5kbHAsIHBtYiwKKwkJCQlOTFBfRVZUX0NNUExfUkVHX0xPR0lOKTsKKwogCWxwZmNfbWJ1Zl9mcmVlKHBoYmEsIG1wLT52aXJ0LCBtcC0+cGh5cyk7CiAJa2ZyZWUobXApOwogCW1lbXBvb2xfZnJlZShwbWIsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwpAQCAtMzQyNyw3ICszNTgzLDcgQEAKIAlrcmVmX2luaXQoJm5kbHAtPmtyZWYpOwogCU5MUF9JTlRfTk9ERV9BQ1QobmRscCk7CiAJYXRvbWljX3NldCgmbmRscC0+Y21kX3BlbmRpbmcsIDApOwotCW5kbHAtPmNtZF9xZGVwdGggPSBMUEZDX01BWF9UR1RfUURFUFRIOworCW5kbHAtPmNtZF9xZGVwdGggPSB2cG9ydC0+Y2ZnX3RndF9xdWV1ZV9kZXB0aDsKIH0KIAogc3RydWN0IGxwZmNfbm9kZWxpc3QgKgpAQCAtMzcwMCw2ICszODU2LDcgQEAKIAkJCQltZW1wb29sX2ZyZWUobWJveCwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJCX0KIAkJbHBmY19ub19ycGkocGhiYSwgbmRscCk7CisKIAkJbmRscC0+bmxwX3JwaSA9IDA7CiAJCW5kbHAtPm5scF9mbGFnICY9IH5OTFBfUlBJX1ZBTElEOwogCQluZGxwLT5ubHBfZmxhZyAmPSB+TkxQX05QUl9BRElTQzsKQEAgLTM4NDIsNiArMzk5OSw5IEBACiAJCQkJa2ZyZWUobXApOwogCQkJfQogCQkJbGlzdF9kZWwoJm1iLT5saXN0KTsKKwkJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCQkJbHBmY19zbGk0X2ZyZWVfcnBpKHBoYmEsCisJCQkJCSBtYi0+dS5tYi51bi52YXJSZWdMb2dpbi5ycGkpOwogCQkJbWVtcG9vbF9mcmVlKG1iLCBwaGJhLT5tYm94X21lbV9wb29sKTsKIAkJCS8qIFdlIHNoYWxsIG5vdCBpbnZva2UgdGhlIGxwZmNfbmxwX3B1dCB0byBkZWNyZW1lbnQKIAkJCSAqIHRoZSBuZGxwIHJlZmVyZW5jZSBjb3VudCBhcyB3ZSBhcmUgaW4gdGhlIHByb2Nlc3MKQEAgLTM4ODMsNiArNDA0Myw3IEBACiAKIAlscGZjX2NhbmNlbF9yZXRyeV9kZWxheV90bW8odnBvcnQsIG5kbHApOwogCWlmICgobmRscC0+bmxwX2ZsYWcgJiBOTFBfREVGRVJfUk0pICYmCisJCSEobmRscC0+bmxwX2ZsYWcgJiBOTFBfUkVHX0xPR0lOX1NFTkQpICYmCiAJICAgICEobmRscC0+bmxwX2ZsYWcgJiBOTFBfUlBJX1ZBTElEKSkgewogCQkvKiBGb3IgdGhpcyBjYXNlIHdlIG5lZWQgdG8gY2xlYW51cCB0aGUgZGVmYXVsdCBycGkKIAkJICogYWxsb2NhdGVkIGJ5IHRoZSBmaXJtd2FyZS4KQEAgLTUxODAsMTMgKzUzNDEsMTYgQEAKIGxwZmNfdW5yZWdpc3Rlcl91bnVzZWRfZmNmKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAkvKgotCSAqIElmIEhCQSBpcyBub3QgcnVubmluZyBpbiBGSVAgbW9kZSBvciBpZiBIQkEgZG9lcyBub3Qgc3VwcG9ydAotCSAqIEZDb0Ugb3IgaWYgRkNGIGlzIG5vdCByZWdpc3RlcmVkLCBkbyBub3RoaW5nLgorCSAqIElmIEhCQSBpcyBub3QgcnVubmluZyBpbiBGSVAgbW9kZSwgaWYgSEJBIGRvZXMgbm90IHN1cHBvcnQKKwkgKiBGQ29FLCBpZiBGQ0YgZGlzY292ZXJ5IGlzIG9uZ29pbmcsIG9yIGlmIEZDRiBoYXMgbm90IGJlZW4KKwkgKiByZWdpc3RlcmVkLCBkbyBub3RoaW5nLgogCSAqLwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCWlmICghKHBoYmEtPmhiYV9mbGFnICYgSEJBX0ZDT0VfU1VQUE9SVCkgfHwKIAkgICAgIShwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfUkVHSVNURVJFRCkgfHwKLQkgICAgIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9GSVBfU1VQUE9SVCkpIHsKKwkgICAgIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9GSVBfU1VQUE9SVCkgfHwKKwkgICAgKHBoYmEtPmZjZi5mY2ZfZmxhZyAmIEZDRl9ESVNDT1ZFUlkpIHx8CisJICAgIChwaGJhLT5wcG9ydC0+cG9ydF9zdGF0ZSA9PSBMUEZDX0ZMT0dJKSkgewogCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCmluZGV4IGU2NTRkMDEuLmY1ZGJmMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKQEAgLTExNzAsNiArMTE3MCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHRVJTSEFSSyAgICAweDA3MDQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9UT01DQVQgICAgICAgIDB4MDcxNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBTENPTiAgICAgICAgMHhmMTgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkFMSVVTICAgICAgICAweGUxMzEKIAogI2RlZmluZSBKRURFQ19JRF9BRERSRVNTICAgICAgICAgICAgMHgwMDgwMDAxYwogI2RlZmluZSBGSVJFRkxZX0pFREVDX0lEICAgICAgICAgICAgMHgxQUNDCkBAIC0zMDE0LDE4ICszMDE1LDEwIEBACiAJdWludDMyX3QgaGJxX2dldFsxNl07CiB9OwogCi1zdHJ1Y3Qgc2xpM19pbmJfcGdwIHsKLQl1aW50MzJfdCBoYV9jb3B5OwotCXVpbnQzMl90IGNvdW50ZXI7Ci0Jc3RydWN0IGxwZmNfcGdwIHBvcnRbTUFYX1JJTkdTXTsKLQl1aW50MzJfdCBoYnFfZ2V0WzE2XTsKLX07Ci0KIHVuaW9uIHNsaV92YXIgewogCXN0cnVjdCBzbGkyX2Rlc2MJczI7CiAJc3RydWN0IHNsaTNfZGVzYwlzMzsKIAlzdHJ1Y3Qgc2xpM19wZ3AJCXMzX3BncDsKLQlzdHJ1Y3Qgc2xpM19pbmJfcGdwCXMzX2luYl9wZ3A7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0zMTMyLDYgKzMxMjUsMTQgQEAKICNkZWZpbmUgSU9FUlJfQlVGRkVSX1NIT1JUQUdFICAgICAgICAgMHgyOAogI2RlZmluZSBJT0VSUl9ERUZBVUxUICAgICAgICAgICAgICAgICAweDI5CiAjZGVmaW5lIElPRVJSX0NOVCAgICAgICAgICAgICAgICAgICAgIDB4MkEKKyNkZWZpbmUgSU9FUlJfU0xFUl9GQUlMVVJFICAgICAgICAgICAgMHg0NgorI2RlZmluZSBJT0VSUl9TTEVSX0NNRF9SQ1ZfRkFJTFVSRSAgICAweDQ3CisjZGVmaW5lIElPRVJSX1NMRVJfUkVDX1JKVF9FUlIgICAgICAgIDB4NDgKKyNkZWZpbmUgSU9FUlJfU0xFUl9SRUNfU1JSX1JFVFJZX0VSUiAgMHg0OQorI2RlZmluZSBJT0VSUl9TTEVSX1NSUl9SSlRfRVJSICAgICAgICAweDRBCisjZGVmaW5lIElPRVJSX1NMRVJfUlJRX1JKVF9FUlIgICAgICAgIDB4NEMKKyNkZWZpbmUgSU9FUlJfU0xFUl9SUlFfUkVUUllfRVJSICAgICAgMHg0RAorI2RlZmluZSBJT0VSUl9TTEVSX0FCVFNfRVJSICAgICAgICAgICAweDRFCiAKICNkZWZpbmUgSU9FUlJfRFJWUl9NQVNLICAgICAgICAgICAgICAgMHgxMDAKICNkZWZpbmUgSU9FUlJfU0xJX0RPV04gICAgICAgICAgICAgICAgMHgxMDEgIC8qIHVscFN0YXR1cyAgLSBEcml2ZXIgZGVmaW5lZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwppbmRleCBjZDk2OTdlLi4yNzg2ZWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwpAQCAtNjIxLDYgKzYyMSw3IEBACiAvKioKICAqIGxwZmNfaGJhX2luaXRfbGluayAtIEluaXRpYWxpemUgdGhlIEZDIGxpbmsKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQGZsYWc6IG1haWxib3ggY29tbWFuZCBpc3N1ZSBtb2RlIC0gZWl0aGVyIE1CWF9QT0xMIG9yIE1CWF9OT1dBSVQKICAqCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCBpc3N1ZSB0aGUgSU5JVF9MSU5LIG1haWxib3ggY29tbWFuZCBjYWxsLgogICogSXQgaXMgYXZhaWxhYmxlIHRvIG90aGVyIGRyaXZlcnMgdGhyb3VnaCB0aGUgbHBmY19oYmEgZGF0YQpAQCAtNjMyLDcgKzYzMyw3IEBACiAgKgkJQW55IG90aGVyIHZhbHVlIC0gZXJyb3IKICAqKi8KIGludAotbHBmY19oYmFfaW5pdF9saW5rKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK2xwZmNfaGJhX2luaXRfbGluayhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQzMl90IGZsYWcpCiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gcGhiYS0+cHBvcnQ7CiAJTFBGQ19NQk9YUV90ICpwbWI7CkBAIC02NTEsNyArNjUyLDcgQEAKIAkJcGhiYS0+Y2ZnX2xpbmtfc3BlZWQpOwogCXBtYi0+bWJveF9jbXBsID0gbHBmY19zbGlfZGVmX21ib3hfY21wbDsKIAlscGZjX3NldF9sb29wYmFja19mbGFnKHBoYmEpOwotCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBwbWIsIE1CWF9OT1dBSVQpOworCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBwbWIsIGZsYWcpOwogCWlmIChyYyAhPSBNQlhfU1VDQ0VTUykgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJIjA0OTggQWRhcHRlciBmYWlsZWQgdG8gaW5pdCwgbWJ4Q21kIHgleCAiCkBAIC02NjQsMTcgKzY2NSwyMSBAQAogCQl3cml0ZWwoMHhmZmZmZmZmZiwgcGhiYS0+SEFyZWdhZGRyKTsKIAkJcmVhZGwocGhiYS0+SEFyZWdhZGRyKTsgLyogZmx1c2ggKi8KIAkJcGhiYS0+bGlua19zdGF0ZSA9IExQRkNfSEJBX0VSUk9SOwotCQlpZiAocmMgIT0gTUJYX0JVU1kpCisJCWlmIChyYyAhPSBNQlhfQlVTWSB8fCBmbGFnID09IE1CWF9QT0xMKQogCQkJbWVtcG9vbF9mcmVlKHBtYiwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlwaGJhLT5jZmdfc3VwcHJlc3NfbGlua191cCA9IExQRkNfSU5JVElBTElaRV9MSU5LOworCWlmIChmbGFnID09IE1CWF9QT0xMKQorCQltZW1wb29sX2ZyZWUocG1iLCBwaGJhLT5tYm94X21lbV9wb29sKTsKIAogCXJldHVybiAwOwogfQogCiAvKioKICAqIGxwZmNfaGJhX2Rvd25fbGluayAtIHRoaXMgcm91dGluZSBkb3ducyB0aGUgRkMgbGluaworICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAZmxhZzogbWFpbGJveCBjb21tYW5kIGlzc3VlIG1vZGUgLSBlaXRoZXIgTUJYX1BPTEwgb3IgTUJYX05PV0FJVAogICoKICAqIFRoaXMgcm91dGluZSB3aWxsIGlzc3VlIHRoZSBET1dOX0xJTksgbWFpbGJveCBjb21tYW5kIGNhbGwuCiAgKiBJdCBpcyBhdmFpbGFibGUgdG8gb3RoZXIgZHJpdmVycyB0aHJvdWdoIHRoZSBscGZjX2hiYSBkYXRhCkBAIC02ODUsNyArNjkwLDcgQEAKICAqCQlBbnkgb3RoZXIgdmFsdWUgLSBlcnJvcgogICoqLwogaW50Ci1scGZjX2hiYV9kb3duX2xpbmsoc3RydWN0IGxwZmNfaGJhICpwaGJhKQorbHBmY19oYmFfZG93bl9saW5rKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDMyX3QgZmxhZykKIHsKIAlMUEZDX01CT1hRX3QgKnBtYjsKIAlpbnQgcmM7CkBAIC03MDEsNyArNzA2LDcgQEAKIAkJIjA0OTEgQWRhcHRlciBMaW5rIGlzIGRpc2FibGVkLlxuIik7CiAJbHBmY19kb3duX2xpbmsocGhiYSwgcG1iKTsKIAlwbWItPm1ib3hfY21wbCA9IGxwZmNfc2xpX2RlZl9tYm94X2NtcGw7Ci0JcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIHBtYiwgTUJYX05PV0FJVCk7CisJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIHBtYiwgZmxhZyk7CiAJaWYgKChyYyAhPSBNQlhfU1VDQ0VTUykgJiYgKHJjICE9IE1CWF9CVVNZKSkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwKIAkJS0VSTl9FUlIsIExPR19JTklULApAQCAtNzExLDYgKzcxNiw5IEBACiAJCW1lbXBvb2xfZnJlZShwbWIsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisJaWYgKGZsYWcgPT0gTUJYX1BPTEwpCisJCW1lbXBvb2xfZnJlZShwbWIsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4MTgsNiArMTgyNiwxMCBAQAogCQltID0gKHR5cGVvZihtKSl7IkxQU2UxMjAwMi1NTDEtRSIsICJQQ0llIiwKIAkJCQkiRW11bGV4U2VjdXJlIEZpYnJlIn07CiAJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9CQUxJVVM6CisJCW0gPSAodHlwZW9mKG0pKXsiTFBWZTEyMDAyIiwgIlBDSWUgU2hhcmVkIEkvTyIsCisJCQkJIkZpYnJlIENoYW5uZWwgQWRhcHRlciJ9OworCQlicmVhazsKIAlkZWZhdWx0OgogCQltID0gKHR5cGVvZihtKSl7IlVua25vd24iLCAiIiwgIiJ9OwogCQlicmVhazsKQEAgLTIyNzksMTAgKzIyOTEsMzIgQEAKIGxwZmNfYmxvY2tfbWdtdF9pbyhzdHJ1Y3QgbHBmY19oYmEgKiBwaGJhKQogewogCXVuc2lnbmVkIGxvbmcgaWZsYWc7CisJdWludDhfdCBhY3RjbWQgPSBNQlhfSEVBUlRCRUFUOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAlwaGJhLT5zbGkuc2xpX2ZsYWcgfD0gTFBGQ19CTE9DS19NR01UX0lPOworCWlmIChwaGJhLT5zbGkubWJveF9hY3RpdmUpCisJCWFjdGNtZCA9IHBoYmEtPnNsaS5tYm94X2FjdGl2ZS0+dS5tYi5tYnhDb21tYW5kOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKKwkvKiBEZXRlcm1pbmUgaG93IGxvbmcgd2UgbWlnaHQgd2FpdCBmb3IgdGhlIGFjdGl2ZSBtYWlsYm94CisJICogY29tbWFuZCB0byBiZSBncmFjZWZ1bGx5IGNvbXBsZXRlZCBieSBmaXJtd2FyZS4KKwkgKi8KKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBhY3RjbWQpICogMTAwMCkgKworCQkJamlmZmllczsKKwkvKiBXYWl0IGZvciB0aGUgb3V0c3RuYWRpbmcgbWFpbGJveCBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkgeworCQkvKiBDaGVjayBhY3RpdmUgbWFpbGJveCBjb21wbGV0ZSBzdGF0dXMgZXZlcnkgMm1zICovCisJCW1zbGVlcCgyKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkiMjgxMyBNZ210IElPIGlzIEJsb2NrZWQgJXggIgorCQkJCSItIG1ib3ggY21kICV4IHN0aWxsIGFjdGl2ZVxuIiwKKwkJCQlwaGJhLT5zbGkuc2xpX2ZsYWcsIGFjdGNtZCk7CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAogLyoqCkBAIC0zMzIzLDIyICszMzU3LDE0IEBACiAJCQkJCSJldnRfdGFnOngleCwgZmNmX2luZGV4OngleFxuIiwKIAkJCQkJYWNxZV9mY29lLT5ldmVudF90YWcsCiAJCQkJCWFjcWVfZmNvZS0+aW5kZXgpOworCQkvKiBJZiB0aGUgRkNGIGRpc2NvdmVyeSBpcyBpbiBwcm9ncmVzcywgZG8gbm90aGluZy4gKi8KIAkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JCWlmICgocGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX1NDQU5fRE9ORSkgfHwKLQkJICAgIChwaGJhLT5oYmFfZmxhZyAmIEZDRl9ESVNDX0lOUFJPR1JFU1MpKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIGN1cnJlbnQgRkNGIGlzIGluIGRpc2NvdmVyZWQgc3RhdGUgb3IKLQkJCSAqIEZDRiBkaXNjb3ZlcnkgaXMgaW4gcHJvZ3Jlc3MsIGRvIG5vdGhpbmcuCi0JCQkgKi8KKwkJaWYgKHBoYmEtPmhiYV9mbGFnICYgRkNGX0RJU0NfSU5QUk9HUkVTUykgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJCWJyZWFrOwogCQl9Ci0KKwkJLyogSWYgZmFzdCBGQ0YgZmFpbG92ZXIgcmVzY2FuIGV2ZW50IGlzIHBlbmRpbmcsIGRvIG5vdGhpbmcgKi8KIAkJaWYgKHBoYmEtPmZjZi5mY2ZfZmxhZyAmIEZDRl9SRURJU0NfRVZUKSB7Ci0JCQkvKgotCQkJICogSWYgZmFzdCBGQ0YgZmFpbG92ZXIgcmVzY2FuIGV2ZW50IGlzIHBlbmRpbmcsCi0JCQkgKiBkbyBub3RoaW5nLgotCQkJICovCiAJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMzNTksNyArMzM4NSwxMyBAQAogCQkJCQlhY3FlX2Zjb2UtPmluZGV4KTsKIAkJCXJjID0gbHBmY19zbGk0X3JlYWRfZmNmX3JlYyhwaGJhLCBhY3FlX2Zjb2UtPmluZGV4KTsKIAkJfQotCisJCS8qIElmIHRoZSBGQ0YgaGFzIGJlZW4gaW4gZGlzY292ZXJlZCBzdGF0ZSwgZG8gbm90aGluZy4gKi8KKwkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCWlmIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfU0NBTl9ET05FKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJLyogT3RoZXJ3aXNlLCBzY2FuIHRoZSBlbnRpcmUgRkNGIHRhYmxlIGFuZCByZS1kaXNjb3ZlciBTQU4gKi8KIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCB8IExPR19ESVNDT1ZFUlksCiAJCQkJIjI3NzAgU3RhcnQgRkNGIHRhYmxlIHNjYW4gZHVlIHRvIG5ldyBGQ0YgIgpAQCAtNDg4NSw2ICs0OTE3LDcgQEAKIAlwaGJhLT5mY19hbHRvdiA9IEZGX0RFRl9BTFRPVjsKIAlwaGJhLT5mY19hcmJ0b3YgPSBGRl9ERUZfQVJCVE9WOwogCisJYXRvbWljX3NldCgmcGhiYS0+c2Rldl9jbnQsIDApOwogCXZwb3J0ID0gbHBmY19jcmVhdGVfcG9ydChwaGJhLCBwaGJhLT5icmRfbm8sICZwaGJhLT5wY2lkZXYtPmRldik7CiAJaWYgKCF2cG9ydCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01NTMzLDkgKzU1NjYsMTIgQEAKIAltZW1wb29sX2ZyZWUocG1iLCBwaGJhLT5tYm94X21lbV9wb29sKTsKIAogCS8qIFJlc2V0IHRoZSBERlRfSEJBX1FfREVQVEggdG8gdGhlIG1heCB4cmkgICovCi0JaWYgKHBoYmEtPmNmZ19oYmFfcXVldWVfZGVwdGggPiAocGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfeHJpKSkKKwlpZiAocGhiYS0+Y2ZnX2hiYV9xdWV1ZV9kZXB0aCA+CisJCShwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF94cmkgLQorCQkJbHBmY19zbGk0X2dldF9lbHNfaW9jYl9jbnQocGhiYSkpKQogCQlwaGJhLT5jZmdfaGJhX3F1ZXVlX2RlcHRoID0KLQkJCQlwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF94cmk7CisJCQlwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF94cmkgLQorCQkJCWxwZmNfc2xpNF9nZXRfZWxzX2lvY2JfY250KHBoYmEpOwogCXJldHVybiByYzsKIH0KIApAQCAtNjk5MywyMiArNzAyOSwyOCBAQAogc3RhdGljIGludAogbHBmY19zbGk0X2VuYWJsZV9tc2l4KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKLQlpbnQgcmMsIGluZGV4OworCWludCB2ZWN0b3JzLCByYywgaW5kZXg7CiAKIAkvKiBTZXQgdXAgTVNJLVggbXVsdGktbWVzc2FnZSB2ZWN0b3JzICovCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGhiYS0+c2xpNF9oYmEuY2ZnX2VxbjsgaW5kZXgrKykKIAkJcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS5lbnRyeSA9IGluZGV4OwogCiAJLyogQ29uZmlndXJlIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlICovCisJdmVjdG9ycyA9IHBoYmEtPnNsaTRfaGJhLmNmZ19lcW47CitlbmFibGVfbXNpeF92ZWN0b3JzOgogCXJjID0gcGNpX2VuYWJsZV9tc2l4KHBoYmEtPnBjaWRldiwgcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzLAotCQkJICAgICBwaGJhLT5zbGk0X2hiYS5jZmdfZXFuKTsKLQlpZiAocmMpIHsKKwkJCSAgICAgdmVjdG9ycyk7CisJaWYgKHJjID4gMSkgeworCQl2ZWN0b3JzID0gcmM7CisJCWdvdG8gZW5hYmxlX21zaXhfdmVjdG9yczsKKwl9IGVsc2UgaWYgKHJjKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAogCQkJCSIwNDg0IFBDSSBlbmFibGUgTVNJLVggZmFpbGVkICglZClcbiIsIHJjKTsKIAkJZ290byBtc2lfZmFpbF9vdXQ7CiAJfQorCiAJLyogTG9nIE1TSS1YIHZlY3RvciBhc3NpZ25tZW50ICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGhiYS0+c2xpNF9oYmEuY2ZnX2VxbjsgaW5kZXgrKykKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JzOyBpbmRleCsrKQogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKIAkJCQkiMDQ4OSBNU0ktWCBlbnRyeVslZF06IHZlY3Rvcj14JXggIgogCQkJCSJtZXNzYWdlPSVkXG4iLCBpbmRleCwKQEAgLTcwMzAsNyArNzA3Miw3IEBACiAJfQogCiAJLyogVGhlIHJlc3Qgb2YgdGhlIHZlY3RvcihzKSBhcmUgYXNzb2NpYXRlZCB0byBmYXN0LXBhdGggaGFuZGxlcihzKSAqLwotCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHBoYmEtPnNsaTRfaGJhLmNmZ19lcW47IGluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JzOyBpbmRleCsrKSB7CiAJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXggLSAxXS5pZHggPSBpbmRleCAtIDE7CiAJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXggLSAxXS5waGJhID0gcGhiYTsKIAkJcmMgPSByZXF1ZXN0X2lycShwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKQEAgLTcwNDQsNiArNzA4Niw3IEBACiAJCQlnb3RvIGNmZ19mYWlsX291dDsKIAkJfQogCX0KKwlwaGJhLT5zbGk0X2hiYS5tc2l4X3ZlY19uciA9IHZlY3RvcnM7CiAKIAlyZXR1cm4gcmM7CiAKQEAgLTcwNzcsOSArNzEyMCwxMCBAQAogCS8qIEZyZWUgdXAgTVNJLVggbXVsdGktbWVzc2FnZSB2ZWN0b3JzICovCiAJZnJlZV9pcnEocGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzWzBdLnZlY3RvciwgcGhiYSk7CiAKLQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCBwaGJhLT5zbGk0X2hiYS5jZmdfZXFuOyBpbmRleCsrKQorCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHBoYmEtPnNsaTRfaGJhLm1zaXhfdmVjX25yOyBpbmRleCsrKQogCQlmcmVlX2lycShwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKIAkJCSAmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleCAtIDFdKTsKKwogCS8qIERpc2FibGUgTVNJLVggKi8KIAlwY2lfZGlzYWJsZV9tc2l4KHBoYmEtPnBjaWRldik7CiAKQEAgLTcxMjEsNiArNzE2NSw3IEBACiAJCXBjaV9kaXNhYmxlX21zaShwaGJhLT5wY2lkZXYpOwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfSU5JVCwKIAkJCQkiMDQ5MCBNU0kgcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOwogCX0KIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7IGluZGV4KyspIHsKQEAgLTcxMjgsNyArNzE3Myw3IEBACiAJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLnBoYmEgPSBwaGJhOwogCX0KIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC03ODM5LDYgKzc4ODQsOSBAQAogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkiMjcxMCBQQ0kgY2hhbm5lbCBkaXNhYmxlIHByZXBhcmluZyBmb3IgcmVzZXRcbiIpOwogCisJLyogQmxvY2sgYW55IG1hbmFnZW1lbnQgSS9PcyB0byB0aGUgZGV2aWNlICovCisJbHBmY19ibG9ja19tZ210X2lvKHBoYmEpOworCiAJLyogQmxvY2sgYWxsIFNDU0kgZGV2aWNlcycgSS9PcyBvbiB0aGUgaG9zdCAqLwogCWxwZmNfc2NzaV9kZXZfYmxvY2socGhiYSk7CiAKQEAgLTc4NDgsNiArNzg5Niw3IEBACiAJLyogRGlzYWJsZSBpbnRlcnJ1cHQgYW5kIHBjaSBkZXZpY2UgKi8KIAlscGZjX3NsaV9kaXNhYmxlX2ludHIocGhiYSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBoYmEtPnBjaWRldik7CisKIAkvKiBGbHVzaCBhbGwgZHJpdmVyJ3Mgb3V0c3RhbmRpbmcgU0NTSSBJL09zIGFzIHdlIGFyZSB0byByZXNldCAqLwogCWxwZmNfc2xpX2ZsdXNoX2ZjcF9yaW5ncyhwaGJhKTsKIH0KQEAgLTc4NjEsNyArNzkxMCw3IEBACiAgKiBwZW5kaW5nIEkvT3MuCiAgKiovCiBzdGF0aWMgdm9pZAotbHBmY19wcmVwX2Rldl9mb3JfcGVybV9mYWlsdXJlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK2xwZmNfc2xpX3ByZXBfZGV2X2Zvcl9wZXJtX2ZhaWx1cmUoc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkiMjcxMSBQQ0kgY2hhbm5lbCBwZXJtYW5lbnQgZGlzYWJsZSBmb3IgZmFpbHVyZVxuIik7CkBAIC03OTEwLDcgKzc5NTksNyBAQAogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKIAljYXNlIHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZToKIAkJLyogUGVybWFuZW50IGZhaWx1cmUsIHByZXBhcmUgZm9yIGRldmljZSBkb3duICovCi0JCWxwZmNfcHJlcF9kZXZfZm9yX3Blcm1fZmFpbHVyZShwaGJhKTsKKwkJbHBmY19zbGlfcHJlcF9kZXZfZm9yX3Blcm1fZmFpbHVyZShwaGJhKTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CiAJZGVmYXVsdDoKIAkJLyogVW5rbm93biBzdGF0ZSwgcHJlcGFyZSBhbmQgcmVxdWVzdCBzbG90IHJlc2V0ICovCkBAIC03OTc5LDcgKzgwMjgsOCBAQAogCX0gZWxzZQogCQlwaGJhLT5pbnRyX21vZGUgPSBpbnRyX21vZGU7CiAKLQkvKiBUYWtlIGRldmljZSBvZmZsaW5lOyB0aGlzIHdpbGwgcGVyZm9ybSBjbGVhbnVwICovCisJLyogVGFrZSBkZXZpY2Ugb2ZmbGluZSwgaXQgd2lsbCBwZXJmb3JtIGNsZWFudXAgKi8KKwlscGZjX29mZmxpbmVfcHJlcChwaGJhKTsKIAlscGZjX29mZmxpbmUocGhiYSk7CiAJbHBmY19zbGlfYnJkcmVzdGFydChwaGJhKTsKIApAQCAtODExMCw4ICs4MTYwLDEyIEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSBhbmQgcG9wdWxhdGUgdGhlIGlvY2IgbGlzdCBwZXIgaG9zdCAqLwotCWVycm9yID0gbHBmY19pbml0X2lvY2JfbGlzdChwaGJhLAotCQkJcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfeHJpKTsKKworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJIjI4MjEgaW5pdGlhbGl6ZSBpb2NiIGxpc3QgJWQuXG4iLAorCQkJcGhiYS0+Y2ZnX2lvY2JfY250KjEwMjQpOworCWVycm9yID0gbHBmY19pbml0X2lvY2JfbGlzdChwaGJhLCBwaGJhLT5jZmdfaW9jYl9jbnQqMTAyNCk7CisKIAlpZiAoZXJyb3IpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkiMTQxMyBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBpb2NiIGxpc3QuXG4iKTsKQEAgLTgxNjAsNiArODIxNCw4IEBACiAJCS8qIERlZmF1bHQgdG8gc2luZ2xlIEZDUCBFUSBmb3Igbm9uLU1TSS1YICovCiAJCWlmIChwaGJhLT5pbnRyX3R5cGUgIT0gTVNJWCkKIAkJCXBoYmEtPmNmZ19mY3BfZXFfY291bnQgPSAxOworCQllbHNlIGlmIChwaGJhLT5zbGk0X2hiYS5tc2l4X3ZlY19uciA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQpCisJCQlwaGJhLT5jZmdfZmNwX2VxX2NvdW50ID0gcGhiYS0+c2xpNF9oYmEubXNpeF92ZWNfbnIgLSAxOwogCQkvKiBTZXQgdXAgU0xJLTQgSEJBICovCiAJCWlmIChscGZjX3NsaTRfaGJhX3NldHVwKHBoYmEpKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULApAQCAtODMyMSw3ICs4Mzc3LDcgQEAKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKIAogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAotCQkJIjAyOTggUENJIGRldmljZSBQb3dlciBNYW5hZ2VtZW50IHN1c3BlbmQuXG4iKTsKKwkJCSIyODQzIFBDSSBkZXZpY2UgUG93ZXIgTWFuYWdlbWVudCBzdXNwZW5kLlxuIik7CiAKIAkvKiBCcmluZyBkb3duIHRoZSBkZXZpY2UgKi8KIAlscGZjX29mZmxpbmVfcHJlcChwaGJhKTsKQEAgLTg0MTIsNiArODQ2OCw4NCBAQAogfQogCiAvKioKKyAqIGxwZmNfc2xpNF9wcmVwX2Rldl9mb3JfcmVjb3ZlciAtIFByZXBhcmUgU0xJNCBkZXZpY2UgZm9yIHBjaSBzbG90IHJlY292ZXIKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gcHJlcGFyZSB0aGUgU0xJNCBkZXZpY2UgZm9yIFBDSSBzbG90IHJlY292ZXIuIEl0CisgKiBhYm9ydHMgYWxsIHRoZSBvdXRzdGFuZGluZyBTQ1NJIEkvT3MgdG8gdGhlIHBjaSBkZXZpY2UuCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19zbGk0X3ByZXBfZGV2X2Zvcl9yZWNvdmVyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOworCXN0cnVjdCBscGZjX3NsaV9yaW5nICAqcHJpbmc7CisKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJIjI4MjggUENJIGNoYW5uZWwgSS9PIGFib3J0IHByZXBhcmluZyBmb3IgcmVjb3ZlcnlcbiIpOworCS8qCisJICogVGhlcmUgbWF5IGJlIGVycm9yZWQgSS9PcyB0aHJvdWdoIEhCQSwgYWJvcnQgYWxsIEkvT3Mgb24gdHhjbXBscQorCSAqIGFuZCBsZXQgdGhlIFNDU0kgbWlkLWxheWVyIHRvIHJldHJ5IHRoZW0gdG8gcmVjb3Zlci4KKwkgKi8KKwlwcmluZyA9ICZwc2xpLT5yaW5nW3BzbGktPmZjcF9yaW5nXTsKKwlscGZjX3NsaV9hYm9ydF9pb2NiX3JpbmcocGhiYSwgcHJpbmcpOworfQorCisvKioKKyAqIGxwZmNfc2xpNF9wcmVwX2Rldl9mb3JfcmVzZXQgLSBQcmVwYXJlIFNMSTQgZGV2aWNlIGZvciBwY2kgc2xvdCByZXNldAorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBwcmVwYXJlIHRoZSBTTEk0IGRldmljZSBmb3IgUENJIHNsb3QgcmVzZXQuIEl0CisgKiBkaXNhYmxlcyB0aGUgZGV2aWNlIGludGVycnVwdCBhbmQgcGNpIGRldmljZSwgYW5kIGFib3J0cyB0aGUgaW50ZXJuYWwgRkNQCisgKiBwZW5kaW5nIEkvT3MuCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19zbGk0X3ByZXBfZGV2X2Zvcl9yZXNldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSIyODI2IFBDSSBjaGFubmVsIGRpc2FibGUgcHJlcGFyaW5nIGZvciByZXNldFxuIik7CisKKwkvKiBCbG9jayBhbnkgbWFuYWdlbWVudCBJL09zIHRvIHRoZSBkZXZpY2UgKi8KKwlscGZjX2Jsb2NrX21nbXRfaW8ocGhiYSk7CisKKwkvKiBCbG9jayBhbGwgU0NTSSBkZXZpY2VzJyBJL09zIG9uIHRoZSBob3N0ICovCisJbHBmY19zY3NpX2Rldl9ibG9jayhwaGJhKTsKKworCS8qIHN0b3AgYWxsIHRpbWVycyAqLworCWxwZmNfc3RvcF9oYmFfdGltZXJzKHBoYmEpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgYW5kIHBjaSBkZXZpY2UgKi8KKwlscGZjX3NsaTRfZGlzYWJsZV9pbnRyKHBoYmEpOworCXBjaV9kaXNhYmxlX2RldmljZShwaGJhLT5wY2lkZXYpOworCisJLyogRmx1c2ggYWxsIGRyaXZlcidzIG91dHN0YW5kaW5nIFNDU0kgSS9PcyBhcyB3ZSBhcmUgdG8gcmVzZXQgKi8KKwlscGZjX3NsaV9mbHVzaF9mY3BfcmluZ3MocGhiYSk7Cit9CisKKy8qKgorICogbHBmY19zbGk0X3ByZXBfZGV2X2Zvcl9wZXJtX2ZhaWx1cmUgLSBQcmVwYXJlIFNMSTQgZGV2IGZvciBwY2kgc2xvdCBkaXNhYmxlCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHByZXBhcmUgdGhlIFNMSTQgZGV2aWNlIGZvciBQQ0kgc2xvdCBwZXJtYW5lbnRseQorICogZGlzYWJsaW5nLiBJdCBibG9ja3MgdGhlIFNDU0kgdHJhbnNwb3J0IGxheWVyIHRyYWZmaWMgYW5kIGZsdXNoZXMgdGhlIEZDUAorICogcGVuZGluZyBJL09zLgorICoqLworc3RhdGljIHZvaWQKK2xwZmNfc2xpNF9wcmVwX2Rldl9mb3JfcGVybV9mYWlsdXJlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJIjI4MjcgUENJIGNoYW5uZWwgcGVybWFuZW50IGRpc2FibGUgZm9yIGZhaWx1cmVcbiIpOworCisJLyogQmxvY2sgYWxsIFNDU0kgZGV2aWNlcycgSS9PcyBvbiB0aGUgaG9zdCAqLworCWxwZmNfc2NzaV9kZXZfYmxvY2socGhiYSk7CisKKwkvKiBzdG9wIGFsbCB0aW1lcnMgKi8KKwlscGZjX3N0b3BfaGJhX3RpbWVycyhwaGJhKTsKKworCS8qIENsZWFuIHVwIGFsbCBkcml2ZXIncyBvdXRzdGFuZGluZyBTQ1NJIEkvT3MgKi8KKwlscGZjX3NsaV9mbHVzaF9mY3BfcmluZ3MocGhiYSk7Cit9CisKKy8qKgogICogbHBmY19pb19lcnJvcl9kZXRlY3RlZF9zNCAtIE1ldGhvZCBmb3IgaGFuZGxpbmcgUENJIEkvTyBlcnJvciB0byBTTEktNCBkZXZpY2UKICAqIEBwZGV2OiBwb2ludGVyIHRvIFBDSSBkZXZpY2UuCiAgKiBAc3RhdGU6IHRoZSBjdXJyZW50IFBDSSBjb25uZWN0aW9uIHN0YXRlLgpAQCAtODQzMCw3ICs4NTY0LDI5IEBACiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdAogbHBmY19pb19lcnJvcl9kZXRlY3RlZF9zNChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKIHsKLQlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIHBjaV9jaGFubmVsX2lvX25vcm1hbDoKKwkJLyogTm9uLWZhdGFsIGVycm9yLCBwcmVwYXJlIGZvciByZWNvdmVyeSAqLworCQlscGZjX3NsaTRfcHJlcF9kZXZfZm9yX3JlY292ZXIocGhiYSk7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9DQU5fUkVDT1ZFUjsKKwljYXNlIHBjaV9jaGFubmVsX2lvX2Zyb3plbjoKKwkJLyogRmF0YWwgZXJyb3IsIHByZXBhcmUgZm9yIHNsb3QgcmVzZXQgKi8KKwkJbHBmY19zbGk0X3ByZXBfZGV2X2Zvcl9yZXNldChwaGJhKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CisJY2FzZSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmU6CisJCS8qIFBlcm1hbmVudCBmYWlsdXJlLCBwcmVwYXJlIGZvciBkZXZpY2UgZG93biAqLworCQlscGZjX3NsaTRfcHJlcF9kZXZfZm9yX3Blcm1fZmFpbHVyZShwaGJhKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBzdGF0ZSwgcHJlcGFyZSBhbmQgcmVxdWVzdCBzbG90IHJlc2V0ICovCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJIjI4MjUgVW5rbm93biBQQ0kgZXJyb3Igc3RhdGU6IHgleFxuIiwgc3RhdGUpOworCQlscGZjX3NsaTRfcHJlcF9kZXZfZm9yX3Jlc2V0KHBoYmEpOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKKwl9CiB9CiAKIC8qKgpAQCAtODQ1NCw2ICs4NjEwLDM5IEBACiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdAogbHBmY19pb19zbG90X3Jlc2V0X3M0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCXN0cnVjdCBscGZjX3NsaSAqcHNsaSA9ICZwaGJhLT5zbGk7CisJdWludDMyX3QgaW50cl9tb2RlOworCisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJyZWNvdmVyaW5nIGZyb20gYSBzbG90IHJlc2V0LlxuIik7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlX21lbShwZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImxwZmM6IENhbm5vdCByZS1lbmFibGUgIgorCQkJIlBDSSBkZXZpY2UgYWZ0ZXIgcmVzZXQuXG4iKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisJfQorCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJaWYgKHBkZXYtPmlzX2J1c21hc3RlcikKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlwc2xpLT5zbGlfZmxhZyAmPSB+TFBGQ19TTElfQUNUSVZFOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisKKwkvKiBDb25maWd1cmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlpbnRyX21vZGUgPSBscGZjX3NsaTRfZW5hYmxlX2ludHIocGhiYSwgcGhiYS0+aW50cl9tb2RlKTsKKwlpZiAoaW50cl9tb2RlID09IExQRkNfSU5UUl9FUlJPUikgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIyODI0IENhbm5vdCByZS1lbmFibGUgaW50ZXJydXB0IGFmdGVyICIKKwkJCQkic2xvdCByZXNldC5cbiIpOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKKwl9IGVsc2UKKwkJcGhiYS0+aW50cl9tb2RlID0gaW50cl9tb2RlOworCisJLyogTG9nIHRoZSBjdXJyZW50IGFjdGl2ZSBpbnRlcnJ1cHQgbW9kZSAqLworCWxwZmNfbG9nX2ludHJfbW9kZShwaGJhLCBwaGJhLT5pbnRyX21vZGUpOworCiAJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKIH0KIApAQCAtODQ3MCw3ICs4NjU5LDI3IEBACiBzdGF0aWMgdm9pZAogbHBmY19pb19yZXN1bWVfczQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JcmV0dXJuOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJLyoKKwkgKiBJbiBjYXNlIG9mIHNsb3QgcmVzZXQsIGFzIGZ1bmN0aW9uIHJlc2V0IGlzIHBlcmZvcm1lZCB0aHJvdWdoCisJICogbWFpbGJveCBjb21tYW5kIHdoaWNoIG5lZWRzIERNQSB0byBiZSBlbmFibGVkLCB0aGlzIG9wZXJhdGlvbgorCSAqIGhhcyB0byBiZSBtb3ZlZCB0byB0aGUgaW8gcmVzdW1lIHBoYXNlLiBUYWtpbmcgZGV2aWNlIG9mZmxpbmUKKwkgKiB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBjbGVhbnVwLgorCSAqLworCWlmICghKHBoYmEtPnNsaS5zbGlfZmxhZyAmIExQRkNfU0xJX0FDVElWRSkpIHsKKwkJLyogUGVyZm9ybSBkZXZpY2UgcmVzZXQgKi8KKwkJbHBmY19vZmZsaW5lX3ByZXAocGhiYSk7CisJCWxwZmNfb2ZmbGluZShwaGJhKTsKKwkJbHBmY19zbGlfYnJkcmVzdGFydChwaGJhKTsKKwkJLyogQnJpbmcgdGhlIGRldmljZSBiYWNrIG9ubGluZSAqLworCQlscGZjX29ubGluZShwaGJhKTsKKwl9CisKKwkvKiBDbGVhbiB1cCBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgKEFFUikgaWYgbmVlZGVkICovCisJaWYgKHBoYmEtPmhiYV9mbGFnICYgSEJBX0FFUl9FTkFCTEVEKQorCQlwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyhwZGV2KTsKIH0KIAogLyoqCkBAIC04ODAyLDYgKzkwMTEsOCBAQAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAogCXtQQ0lfVkVORE9SX0lEX0VNVUxFWCwgUENJX0RFVklDRV9JRF9GQUxDT04sCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJe1BDSV9WRU5ET1JfSURfRU1VTEVYLCBQQ0lfREVWSUNFX0lEX0JBTElVUywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKIAl7IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwppbmRleCBlODRkYzMzLi45YzJjN2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwpAQCAtOTU1LDYgKzk1NSwyNiBAQAogCXJldHVybjsKIH0KIAordm9pZAorbHBmY19zbGk0X3N3YXBfc3RyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgTFBGQ19NQk9YUV90ICpwbWIpCit7CisJTUFJTEJPWF90ICptYiA9ICZwbWItPnUubWI7CisJc3RydWN0IGxwZmNfbXFlICptcWU7CisKKwlzd2l0Y2ggKG1iLT5tYnhDb21tYW5kKSB7CisJY2FzZSAgTUJYX1JFQURfUkVWOgorCQkgbXFlID0gJnBtYi0+dS5tcWU7CisJCWxwZmNfc2xpX3BjaW1lbV9iY29weShtcWUtPnVuLnJlYWRfcmV2LmZ3X25hbWUsCisJCQkJIG1xZS0+dW4ucmVhZF9yZXYuZndfbmFtZSwgMTYpOworCQlscGZjX3NsaV9wY2ltZW1fYmNvcHkobXFlLT51bi5yZWFkX3Jldi51bHBfZndfbmFtZSwKKwkJCQkgbXFlLT51bi5yZWFkX3Jldi51bHBfZndfbmFtZSwgMTYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCiAvKioKICAqIGxwZmNfYnVpbGRfaGJxX3Byb2ZpbGUyIC0gU2V0IHVwIHRoZSBIQlEgU2VsZWN0aW9uIFByb2ZpbGUgMgogICogQGhicW1iOiBwb2ludGVyIHRvIHRoZSBIQlEgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSBpbiBtYWlsYm94IGNvbW1hbmQuCkBAIC0xMTk5LDcgKzEyMTksNiBAQAogCQltYi0+dW4udmFyQ2ZnUG9ydC5jZHNzID0gMTsgLyogQ29uZmlndXJlIFNlY3VyaXR5ICovCiAJCW1iLT51bi52YXJDZmdQb3J0LmNlcmJtID0gMTsgLyogUmVxdWVzdCBIQlFzICovCiAJCW1iLT51bi52YXJDZmdQb3J0LmNjcnAgPSAxOyAvKiBDb21tYW5kIFJpbmcgUG9sbGluZyAqLwotCQltYi0+dW4udmFyQ2ZnUG9ydC5jaW5iID0gMTsgLyogSW50ZXJydXB0IE5vdGlmaWNhdGlvbiBCbG9jayAqLwogCQltYi0+dW4udmFyQ2ZnUG9ydC5tYXhfaGJxID0gbHBmY19zbGlfaGJxX2NvdW50KCk7CiAJCWlmIChwaGJhLT5tYXhfdnBpICYmIHBoYmEtPmNmZ19lbmFibGVfbnBpdiAmJgogCQkgICAgcGhiYS0+dnBkLnNsaTNGZWF0LmNtdikgewpAQCAtMjAyNiw3ICsyMDQ1LDcgQEAKIAkgICAgICAgcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4KTsKIAkvKiByZWdfZmNmIGFkZHIgbW9kZSBpcyBiaXQgd2lzZSBpbnZlcnRlZCB2YWx1ZSBvZiBmY2YgYWRkcl9tb2RlICovCiAJYmZfc2V0KGxwZmNfcmVnX2ZjZmlfbWFtLCByZWdfZmNmaSwgKH5waGJhLT5mY2YuYWRkcl9tb2RlKSAmIDB4Myk7Ci0JaWYgKHBoYmEtPmZjZi5jdXJyZW50X3JlYy52bGFuX2lkICE9IDB4RkZGRikgeworCWlmIChwaGJhLT5mY2YuY3VycmVudF9yZWMudmxhbl9pZCAhPSBMUEZDX0ZDT0VfTlVMTF9WSUQpIHsKIAkJYmZfc2V0KGxwZmNfcmVnX2ZjZmlfdnYsIHJlZ19mY2ZpLCAxKTsKIAkJYmZfc2V0KGxwZmNfcmVnX2ZjZmlfdmxhbl90YWcsIHJlZ19mY2ZpLAogCQkgICAgICAgcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLnZsYW5faWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKaW5kZXggYjkwODIwYS4uYmNjYzljNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCkBAIC0xOTAsNiArMTkwLDcgQEAKIH0KIAogCisKIC8qCiAgKiBGcmVlIHJlc291cmNlcyAvIGNsZWFuIHVwIG91dHN0YW5kaW5nIEkvT3MKICAqIGFzc29jaWF0ZWQgd2l0aCBhIExQRkNfTk9ERUxJU1QgZW50cnkuIFRoaXMKQEAgLTE5OSwxMyArMjAwLDE1IEBACiBscGZjX2Vsc19hYm9ydChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwKQogewogCUxJU1RfSEVBRChjb21wbGV0aW9ucyk7CisJTElTVF9IRUFEKHR4Y21wbHFfY29tcGxldGlvbnMpOworCUxJU1RfSEVBRChhYm9ydF9saXN0KTsKIAlzdHJ1Y3QgbHBmY19zbGkgICpwc2xpID0gJnBoYmEtPnNsaTsKIAlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcHNsaS0+cmluZ1tMUEZDX0VMU19SSU5HXTsKIAlzdHJ1Y3QgbHBmY19pb2NicSAqaW9jYiwgKm5leHRfaW9jYjsKIAogCS8qIEFib3J0IG91dHN0YW5kaW5nIEkvTyBvbiBOUG9ydCA8bmxwX0RJRD4gKi8KIAlscGZjX3ByaW50Zl92bG9nKG5kbHAtPnZwb3J0LCBLRVJOX0lORk8sIExPR19ESVNDT1ZFUlksCi0JCQkgIjAyMDUgQWJvcnQgb3V0c3RhbmRpbmcgSS9PIG9uIE5Qb3J0IHgleCAiCisJCQkgIjI4MTkgQWJvcnQgb3V0c3RhbmRpbmcgSS9PIG9uIE5Qb3J0IHgleCAiCiAJCQkgIkRhdGE6IHgleCB4JXggeCV4XG4iLAogCQkJIG5kbHAtPm5scF9ESUQsIG5kbHAtPm5scF9mbGFnLCBuZGxwLT5ubHBfc3RhdGUsCiAJCQkgbmRscC0+bmxwX3JwaSk7CkBAIC0yMjQsMTQgKzIyNywyNSBAQAogCX0KIAogCS8qIE5leHQgY2hlY2sgdGhlIHR4Y21wbHEgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9jYiwgbmV4dF9pb2NiLCAmcHJpbmctPnR4Y21wbHEsIGxpc3QpIHsKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIGlvY2IgbWF0Y2hlcyB0aGUgbnBvcnQgd2UgYXJlIGxvb2tpbmcgZm9yICovCi0JCWlmIChscGZjX2NoZWNrX3NsaV9uZGxwKHBoYmEsIHByaW5nLCBpb2NiLCBuZGxwKSkgewotCQkJbHBmY19zbGlfaXNzdWVfYWJvcnRfaW90YWcocGhiYSwgcHJpbmcsIGlvY2IpOwotCQl9Ci0JfQorCWxpc3Rfc3BsaWNlX2luaXQoJnByaW5nLT50eGNtcGxxLCAmdHhjbXBscV9jb21wbGV0aW9ucyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb2NiLCBuZXh0X2lvY2IsICZ0eGNtcGxxX2NvbXBsZXRpb25zLCBsaXN0KSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiBpb2NiIG1hdGNoZXMgdGhlIG5wb3J0IHdlIGFyZSBsb29raW5nIGZvciAqLworCQlpZiAobHBmY19jaGVja19zbGlfbmRscChwaGJhLCBwcmluZywgaW9jYiwgbmRscCkpCisJCQlsaXN0X2FkZF90YWlsKCZpb2NiLT5kbGlzdCwgJmFib3J0X2xpc3QpOworCX0KKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlsaXN0X3NwbGljZSgmdHhjbXBscV9jb21wbGV0aW9ucywgJnByaW5nLT50eGNtcGxxKTsKKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvY2IsIG5leHRfaW9jYiwgJmFib3J0X2xpc3QsIGRsaXN0KSB7CisJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJCWxpc3RfZGVsX2luaXQoJmlvY2ItPmRsaXN0KTsKKwkJCWxwZmNfc2xpX2lzc3VlX2Fib3J0X2lvdGFnKHBoYmEsIHByaW5nLCBpb2NiKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJfQorCiAJLyogQ2FuY2VsIGFsbCB0aGUgSU9DQnMgZnJvbSB0aGUgY29tcGxldGlvbnMgbGlzdCAqLwogCWxwZmNfc2xpX2NhbmNlbF9pb2NicyhwaGJhLCAmY29tcGxldGlvbnMsIElPU1RBVF9MT0NBTF9SRUpFQ1QsCiAJCQkgICAgICBJT0VSUl9TTElfQUJPUlRFRCk7CkBAIC02MjYsNyArNjQwLDggQEAKIAlpZiAoISh2cG9ydC0+ZmNfZmxhZyAmIEZDX1BUMlBUKSkgewogCQkvKiBDaGVjayBjb25maWcgcGFyYW1ldGVyIHVzZS1hZGlzYyBvciBGQ1AtMiAqLwogCQlpZiAoKHZwb3J0LT5jZmdfdXNlX2FkaXNjICYmICh2cG9ydC0+ZmNfZmxhZyAmIEZDX1JTQ05fTU9ERSkpIHx8Ci0JCSAgICBuZGxwLT5ubHBfZmNwX2luZm8gJiBOTFBfRkNQXzJfREVWSUNFKSB7CisJCSAgICAoKG5kbHAtPm5scF9mY3BfaW5mbyAmIE5MUF9GQ1BfMl9ERVZJQ0UpICYmCisJCSAgICAgKG5kbHAtPm5scF90eXBlICYgTkxQX0ZDUF9UQVJHRVQpKSkgewogCQkJc3Bpbl9sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAkJCW5kbHAtPm5scF9mbGFnIHw9IE5MUF9OUFJfQURJU0M7CiAJCQlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CkBAIC05NjIsNiArOTc3LDcgQEAKIAkJCW1ib3gtPm1ib3hfY21wbCA9IGxwZmNfbWJ4X2NtcGxfZmRtaV9yZWdfbG9naW47CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKKwkJCW5kbHAtPm5scF9mbGFnIHw9IE5MUF9SRUdfTE9HSU5fU0VORDsKIAkJCW1ib3gtPm1ib3hfY21wbCA9IGxwZmNfbWJ4X2NtcGxfcmVnX2xvZ2luOwogCQl9CiAJCW1ib3gtPmNvbnRleHQyID0gbHBmY19ubHBfZ2V0KG5kbHApOwpAQCAtOTcyLDYgKzk4OCw4IEBACiAJCQkJCSAgIE5MUF9TVEVfUkVHX0xPR0lOX0lTU1VFKTsKIAkJCXJldHVybiBuZGxwLT5ubHBfc3RhdGU7CiAJCX0KKwkJaWYgKG5kbHAtPm5scF9mbGFnICYgTkxQX1JFR19MT0dJTl9TRU5EKQorCQkJbmRscC0+bmxwX2ZsYWcgJj0gfk5MUF9SRUdfTE9HSU5fU0VORDsKIAkJLyogZGVjcmVtZW50IG5vZGUgcmVmZXJlbmNlIGNvdW50IHRvIHRoZSBmYWlsZWQgbWJveAogCQkgKiBjb21tYW5kCiAJCSAqLwpAQCAtMTQ1OCw2ICsxNDc2LDcgQEAKIAluZGxwLT5ubHBfcHJldl9zdGF0ZSA9IE5MUF9TVEVfUkVHX0xPR0lOX0lTU1VFOwogCWxwZmNfbmxwX3NldF9zdGF0ZSh2cG9ydCwgbmRscCwgTkxQX1NURV9OUFJfTk9ERSk7CiAJc3Bpbl9sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKKwluZGxwLT5ubHBfZmxhZyB8PSBOTFBfSUdOUl9SRUdfQ01QTDsKIAluZGxwLT5ubHBfZmxhZyAmPSB+KE5MUF9OT0RFVl9SRU1PVkUgfCBOTFBfTlBSXzJCX0RJU0MpOwogCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAlscGZjX2Rpc2Nfc2V0X2FkaXNjKHZwb3J0LCBuZGxwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKaW5kZXggZjRhM2IyZS4uYzgxOGE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKQEAgLTYyMyw2ICs2MjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgaWZsYWcgPSAwOwogCXN0cnVjdCBscGZjX2lvY2JxICppb2NicTsKIAlpbnQgaTsKKwlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR107CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCXNwaW5fbG9jaygmcGhiYS0+c2xpNF9oYmEuYWJ0c19zY3NpX2J1Zl9saXN0X2xvY2spOwpAQCAtNjUxLDYgKzY1Miw4IEBACiAJCXBzYiA9IGNvbnRhaW5lcl9vZihpb2NicSwgc3RydWN0IGxwZmNfc2NzaV9idWYsIGN1cl9pb2NicSk7CiAJCXBzYi0+ZXhjaF9idXN5ID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOworCQlpZiAocHJpbmctPnR4cV9jbnQpCisJCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwogCQlyZXR1cm47CiAKIAl9CkBAIC03NDcsNyArNzUwLDYgQEAKIAlpbnQgc3RhdHVzID0gMCwgaW5kZXg7CiAJaW50IGJjbnQ7CiAJaW50IG5vbl9zZXF1ZW50aWFsX3hyaSA9IDA7Ci0JaW50IHJjID0gMDsKIAlMSVNUX0hFQUQoc2JsaXN0KTsKIAogCWZvciAoYmNudCA9IDA7IGJjbnQgPCBudW1fdG9fYWxsb2M7IGJjbnQrKykgewpAQCAtNzc0LDYgKzc3Niw4IEBACiAJCS8qIEFsbG9jYXRlIGlvdGFnIGZvciBwc2ItPmN1cl9pb2NicS4gKi8KIAkJaW90YWcgPSBscGZjX3NsaV9uZXh0X2lvdGFnKHBoYmEsICZwc2ItPmN1cl9pb2NicSk7CiAJCWlmIChpb3RhZyA9PSAwKSB7CisJCQlwY2lfcG9vbF9mcmVlKHBoYmEtPmxwZmNfc2NzaV9kbWFfYnVmX3Bvb2wsCisJCQkJcHNiLT5kYXRhLCBwc2ItPmRtYV9oYW5kbGUpOwogCQkJa2ZyZWUocHNiKTsKIAkJCWJyZWFrOwogCQl9CkBAIC04NTgsNyArODYyLDYgQEAKIAkJCWlmIChzdGF0dXMpIHsKIAkJCQkvKiBQdXQgdGhpcyBiYWNrIG9uIHRoZSBhYm9ydCBzY3NpIGxpc3QgKi8KIAkJCQlwc2ItPmV4Y2hfYnVzeSA9IDE7Ci0JCQkJcmMrKzsKIAkJCX0gZWxzZSB7CiAJCQkJcHNiLT5leGNoX2J1c3kgPSAwOwogCQkJCXBzYi0+c3RhdHVzID0gSU9TVEFUX1NVQ0NFU1M7CkBAIC04NzcsNyArODgwLDYgQEAKIAkJCWlmIChzdGF0dXMpIHsKIAkJCQkvKiBQdXQgdGhpcyBiYWNrIG9uIHRoZSBhYm9ydCBzY3NpIGxpc3QgKi8KIAkJCQlwc2ItPmV4Y2hfYnVzeSA9IDE7Ci0JCQkJcmMrKzsKIAkJCX0gZWxzZSB7CiAJCQkJcHNiLT5leGNoX2J1c3kgPSAwOwogCQkJCXBzYi0+c3RhdHVzID0gSU9TVEFUX1NVQ0NFU1M7CkBAIC04ODcsNyArODg5LDcgQEAKIAkJfQogCX0KIAotCXJldHVybiBiY250ICsgbm9uX3NlcXVlbnRpYWxfeHJpIC0gcmM7CisJcmV0dXJuIGJjbnQgKyBub25fc2VxdWVudGlhbF94cmk7CiB9CiAKIC8qKgpAQCAtMTMyMyw2ICsxMzI1LDEwIEBACiAJYmZfc2V0KHBkZTVfdHlwZSwgcGRlNSwgTFBGQ19QREU1X0RFU0NSSVBUT1IpOwogCXBkZTUtPnJlZnRhZyA9IHJlZnRhZzsKIAorCS8qIEVuZGlhbiBjb252ZXJ0aW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNSAqLworCXBkZTUtPndvcmQwID0gY3B1X3RvX2xlMzIocGRlNS0+d29yZDApOworCXBkZTUtPnJlZnRhZyA9IGNwdV90b19sZTMyKHBkZTUtPnJlZnRhZyk7CisKIAkvKiBhZHZhbmNlIGJwbCBhbmQgaW5jcmVtZW50IGJkZSBjb3VudCAqLwogCW51bV9iZGUrKzsKIAlicGwrKzsKQEAgLTEzNDEsNiArMTM0NywxMSBAQAogCWJmX3NldChwZGU2X2FpLCBwZGU2LCAxKTsKIAliZl9zZXQocGRlNl9hcHB0YWd2YWwsIHBkZTYsIGFwcHRhZ3ZhbCk7CiAKKwkvKiBFbmRpYW4gY29udmVydGlvbiBpZiBuZWNlc3NhcnkgZm9yIFBERTYgKi8KKwlwZGU2LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTYtPndvcmQwKTsKKwlwZGU2LT53b3JkMSA9IGNwdV90b19sZTMyKHBkZTYtPndvcmQxKTsKKwlwZGU2LT53b3JkMiA9IGNwdV90b19sZTMyKHBkZTYtPndvcmQyKTsKKwogCS8qIGFkdmFuY2UgYnBsIGFuZCBpbmNyZW1lbnQgYmRlIGNvdW50ICovCiAJbnVtX2JkZSsrOwogCWJwbCsrOwpAQCAtMTQ0OCw2ICsxNDU5LDEwIEBACiAJCWJmX3NldChwZGU1X3R5cGUsIHBkZTUsIExQRkNfUERFNV9ERVNDUklQVE9SKTsKIAkJcGRlNS0+cmVmdGFnID0gcmVmdGFnOwogCisJCS8qIEVuZGlhbiBjb252ZXJ0aW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNSAqLworCQlwZGU1LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTUtPndvcmQwKTsKKwkJcGRlNS0+cmVmdGFnID0gY3B1X3RvX2xlMzIocGRlNS0+cmVmdGFnKTsKKwogCQkvKiBhZHZhbmNlIGJwbCBhbmQgaW5jcmVtZW50IGJkZSBjb3VudCAqLwogCQludW1fYmRlKys7CiAJCWJwbCsrOwpAQCAtMTQ2NCw2ICsxNDc5LDExIEBACiAJCWJmX3NldChwZGU2X2FpLCBwZGU2LCAxKTsKIAkJYmZfc2V0KHBkZTZfYXBwdGFndmFsLCBwZGU2LCBhcHB0YWd2YWwpOwogCisJCS8qIEVuZGlhbiBjb252ZXJ0aW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNiAqLworCQlwZGU2LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTYtPndvcmQwKTsKKwkJcGRlNi0+d29yZDEgPSBjcHVfdG9fbGUzMihwZGU2LT53b3JkMSk7CisJCXBkZTYtPndvcmQyID0gY3B1X3RvX2xlMzIocGRlNi0+d29yZDIpOworCiAJCS8qIGFkdmFuY2UgYnBsIGFuZCBpbmNyZW1lbnQgYmRlIGNvdW50ICovCiAJCW51bV9iZGUrKzsKIAkJYnBsKys7CkBAIC0xNDc1LDcgKzE0OTUsNiBAQAogCQlwcm90X2JkZS0+YWRkckxvdyA9IGxlMzJfdG9fY3B1KHB1dFBhZGRySGlnaChwcm90cGh5c2FkZHIpKTsKIAkJcHJvdGdyb3VwX2xlbiA9IHNnX2RtYV9sZW4oc2dwZSk7CiAKLQogCQkvKiBtdXN0IGJlIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIERJRiBibG9jayBsZW5ndGggKi8KIAkJQlVHX09OKHByb3Rncm91cF9sZW4gJSA4KTsKIApAQCAtMjI5MywxNSArMjMxMiwyMSBAQAogCXN0cnVjdCBscGZjX3Zwb3J0ICAgICAgKnZwb3J0ID0gcElvY2JJbi0+dnBvcnQ7CiAJc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGEgPSBscGZjX2NtZC0+cmRhdGE7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlID0gcmRhdGEtPnBub2RlOwotCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGxwZmNfY21kLT5wQ21kOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBzY3NpX2RldmljZSAqdG1wX3NkZXY7CiAJaW50IGRlcHRoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxwZmNfZmFzdF9wYXRoX2V2ZW50ICpmYXN0X3BhdGhfZXZ0OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJdWludDMyX3QgcXVldWVfZGVwdGgsIHNjc2lfaWQ7CiAKKwkvKiBTYW5pdHkgY2hlY2sgb24gcmV0dXJuIG9mIG91dHN0YW5kaW5nIGNvbW1hbmQgKi8KKwlpZiAoIShscGZjX2NtZC0+cENtZCkpCisJCXJldHVybjsKKwljbWQgPSBscGZjX2NtZC0+cENtZDsKKwlzaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCiAJbHBmY19jbWQtPnJlc3VsdCA9IHBJb2NiT3V0LT5pb2NiLnVuLnVscFdvcmRbNF07CiAJbHBmY19jbWQtPnN0YXR1cyA9IHBJb2NiT3V0LT5pb2NiLnVscFN0YXR1czsKIAkvKiBwaWNrIHVwIFNMSTQgZXhoYW5nZSBidXN5IHN0YXR1cyBmcm9tIEhCQSAqLwpAQCAtMjM2Myw3ICsyMzg4LDggQEAKIAkJY2FzZSBJT1NUQVRfTE9DQUxfUkVKRUNUOgogCQkJaWYgKGxwZmNfY21kLT5yZXN1bHQgPT0gSU9FUlJfSU5WQUxJRF9SUEkgfHwKIAkJCSAgICBscGZjX2NtZC0+cmVzdWx0ID09IElPRVJSX05PX1JFU09VUkNFUyB8fAotCQkJICAgIGxwZmNfY21kLT5yZXN1bHQgPT0gSU9FUlJfQUJPUlRfUkVRVUVTVEVEKSB7CisJCQkgICAgbHBmY19jbWQtPnJlc3VsdCA9PSBJT0VSUl9BQk9SVF9SRVFVRVNURUQgfHwKKwkJCSAgICBscGZjX2NtZC0+cmVzdWx0ID09IElPRVJSX1NMRVJfQ01EX1JDVl9GQUlMVVJFKSB7CiAJCQkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9SRVFVRVVFLCAwKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTI0MzIsMTQgKzI0NTgsMTYgQEAKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgaWYgKHBub2RlICYmIE5MUF9DSEtfTk9ERV9BQ1QocG5vZGUpKSB7Ci0JCWlmICgocG5vZGUtPmNtZF9xZGVwdGggPCBMUEZDX01BWF9UR1RfUURFUFRIKSAmJgorCQlpZiAoKHBub2RlLT5jbWRfcWRlcHRoIDwgdnBvcnQtPmNmZ190Z3RfcXVldWVfZGVwdGgpICYmCiAJCSAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgKwogCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhMUEZDX1RHVFFfSU5URVJWQUwpKSkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQkJcG5vZGUtPmNtZF9xZGVwdGggKz0gcG5vZGUtPmNtZF9xZGVwdGggKgotCQkJCUxQRkNfVEdUUV9SQU1QVVBfUENFTlQgLyAxMDA7Ci0JCQlpZiAocG5vZGUtPmNtZF9xZGVwdGggPiBMUEZDX01BWF9UR1RfUURFUFRIKQotCQkJCXBub2RlLT5jbWRfcWRlcHRoID0gTFBGQ19NQVhfVEdUX1FERVBUSDsKKwkJCWRlcHRoID0gcG5vZGUtPmNtZF9xZGVwdGggKiBMUEZDX1RHVFFfUkFNUFVQX1BDRU5UCisJCQkJLyAxMDA7CisJCQlkZXB0aCA9IGRlcHRoID8gZGVwdGggOiAxOworCQkJcG5vZGUtPmNtZF9xZGVwdGggKz0gZGVwdGg7CisJCQlpZiAocG5vZGUtPmNtZF9xZGVwdGggPiB2cG9ydC0+Y2ZnX3RndF9xdWV1ZV9kZXB0aCkKKwkJCQlwbm9kZS0+Y21kX3FkZXB0aCA9IHZwb3J0LT5jZmdfdGd0X3F1ZXVlX2RlcHRoOwogCQkJcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgPSBqaWZmaWVzOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCX0KQEAgLTI4OTQsOCArMjkyMiw3IEBACiAJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX1RSQU5TUE9SVF9ESVNSVVBURUQsIDApOwogCQlnb3RvIG91dF9mYWlsX2NvbW1hbmQ7CiAJfQotCWlmICh2cG9ydC0+Y2ZnX21heF9zY3NpY21wbF90aW1lICYmCi0JCShhdG9taWNfcmVhZCgmbmRscC0+Y21kX3BlbmRpbmcpID49IG5kbHAtPmNtZF9xZGVwdGgpKQorCWlmIChhdG9taWNfcmVhZCgmbmRscC0+Y21kX3BlbmRpbmcpID49IG5kbHAtPmNtZF9xZGVwdGgpCiAJCWdvdG8gb3V0X2hvc3RfYnVzeTsKIAogCWxwZmNfY21kID0gbHBmY19nZXRfc2NzaV9idWYocGhiYSk7CkBAIC0zMDQxLDcgKzMwNjgsOSBAQAogCWludCByZXQgPSBTVUNDRVNTOwogCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod2FpdHEpOwogCi0JZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKKwlyZXQgPSBmY19ibG9ja19zY3NpX2VoKGNtbmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJbHBmY19jbWQgPSAoc3RydWN0IGxwZmNfc2NzaV9idWYgKiljbW5kLT5ob3N0X3NjcmliYmxlOwogCUJVR19PTighbHBmY19jbWQpOwogCkBAIC0zMjI1LDcgKzMyNTQsOSBAQAogCQkJIGxwZmNfdGFza21nbXRfbmFtZSh0YXNrX21nbXRfY21kKSwKIAkJCSB0Z3RfaWQsIGx1bl9pZCwgaW9jYnFyc3AtPmlvY2IudWxwU3RhdHVzLAogCQkJIGlvY2JxcnNwLT5pb2NiLnVuLnVscFdvcmRbNF0pOwotCX0gZWxzZQorCX0gZWxzZSBpZiAoc3RhdHVzID09IElPQ0JfQlVTWSkKKwkJcmV0ID0gRkFJTEVEOworCWVsc2UKIAkJcmV0ID0gU1VDQ0VTUzsKIAogCWxwZmNfc2xpX3JlbGVhc2VfaW9jYnEocGhiYSwgaW9jYnFyc3ApOwpAQCAtMzM1Nyw3ICszMzg4LDkgQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAJcG5vZGUgPSByZGF0YS0+cG5vZGU7Ci0JZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKKwlzdGF0dXMgPSBmY19ibG9ja19zY3NpX2VoKGNtbmQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBscGZjX2Noa190Z3RfbWFwcGVkKHZwb3J0LCBjbW5kKTsKIAlpZiAoc3RhdHVzID09IEZBSUxFRCkgewpAQCAtMzQyMiw3ICszNDU1LDkgQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAJcG5vZGUgPSByZGF0YS0+cG5vZGU7Ci0JZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKKwlzdGF0dXMgPSBmY19ibG9ja19zY3NpX2VoKGNtbmQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBscGZjX2Noa190Z3RfbWFwcGVkKHZwb3J0LCBjbW5kKTsKIAlpZiAoc3RhdHVzID09IEZBSUxFRCkgewpAQCAtMzQ4OCw3ICszNTIzLDkgQEAKIAlmY19ob3N0X3Bvc3RfdmVuZG9yX2V2ZW50KHNob3N0LCBmY19nZXRfZXZlbnRfbnVtYmVyKCksCiAJCXNpemVvZihzY3NpX2V2ZW50KSwgKGNoYXIgKikmc2NzaV9ldmVudCwgTFBGQ19OTF9WRU5ET1JfSUQpOwogCi0JZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKKwlyZXQgPSBmY19ibG9ja19zY3NpX2VoKGNtbmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIFNpbmNlIHRoZSBkcml2ZXIgbWFuYWdlcyBhIHNpbmdsZSBidXMgZGV2aWNlLCByZXNldCBhbGwKQEAgLTM1NjEsMTEgKzM1OTgsMTMgQEAKIAl1aW50MzJfdCB0b3RhbCA9IDA7CiAJdWludDMyX3QgbnVtX3RvX2FsbG9jID0gMDsKIAlpbnQgbnVtX2FsbG9jYXRlZCA9IDA7CisJdWludDMyX3Qgc2Rldl9jbnQ7CiAKIAlpZiAoIXJwb3J0IHx8IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXNkZXYtPmhvc3RkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc2Rldl9jbnQgPSBhdG9taWNfaW5jX3JldHVybigmcGhiYS0+c2Rldl9jbnQpOwogCiAJLyoKIAkgKiBQb3B1bGF0ZSB0aGUgY21kc19wZXJfbHVuIGNvdW50IHNjc2lfYnVmcyBpbnRvIHRoaXMgaG9zdCdzIGdsb2JhbGx5CkBAIC0zNTc3LDYgKzM2MTYsMTAgQEAKIAl0b3RhbCA9IHBoYmEtPnRvdGFsX3Njc2lfYnVmczsKIAludW1fdG9fYWxsb2MgPSB2cG9ydC0+Y2ZnX2x1bl9xdWV1ZV9kZXB0aCArIDI7CiAKKwkvKiBJZiBhbGxvY2F0ZWQgYnVmZmVycyBhcmUgZW5vdWdoIGRvIG5vdGhpbmcgKi8KKwlpZiAoKHNkZXZfY250ICogKHZwb3J0LT5jZmdfbHVuX3F1ZXVlX2RlcHRoICsgMikpIDwgdG90YWwpCisJCXJldHVybiAwOworCiAJLyogQWxsb3cgc29tZSBleGNoYW5nZXMgdG8gYmUgYXZhaWxhYmxlIGFsd2F5cyB0byBjb21wbGV0ZSBkaXNjb3ZlcnkgKi8KIAlpZiAodG90YWwgPj0gcGhiYS0+Y2ZnX2hiYV9xdWV1ZV9kZXB0aCAtIExQRkNfRElTQ19JT0NCX0JVRkZfQ09VTlQgKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0ZDUCwKQEAgLTM2NTgsNiArMzcwMSw5IEBACiBzdGF0aWMgdm9pZAogbHBmY19zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKwlhdG9taWNfZGVjKCZwaGJhLT5zZGV2X2NudCk7CiAJc2Rldi0+aG9zdGRhdGEgPSBOVUxMOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDdhNjE0NTUuLmU3NThlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtNDU1LDYgKzQ1NSwxMSBAQAogCXN0cnVjdCBscGZjX2lvY2JxICogaW9jYnEgPSBOVUxMOwogCiAJbGlzdF9yZW1vdmVfaGVhZChscGZjX2lvY2JfbGlzdCwgaW9jYnEsIHN0cnVjdCBscGZjX2lvY2JxLCBsaXN0KTsKKworCWlmIChpb2NicSkKKwkJcGhiYS0+aW9jYl9jbnQrKzsKKwlpZiAocGhiYS0+aW9jYl9jbnQgPiBwaGJhLT5pb2NiX21heCkKKwkJcGhiYS0+aW9jYl9tYXggPSBwaGJhLT5pb2NiX2NudDsKIAlyZXR1cm4gaW9jYnE7CiB9CiAKQEAgLTU3NSw3ICs1ODAsOCBAQAogewogCXN0cnVjdCBscGZjX3NnbHEgKnNnbHE7CiAJc2l6ZV90IHN0YXJ0X2NsZWFuID0gb2Zmc2V0b2Yoc3RydWN0IGxwZmNfaW9jYnEsIGlvY2IpOwotCXVuc2lnbmVkIGxvbmcgaWZsYWc7CisJdW5zaWduZWQgbG9uZyBpZmxhZyA9IDA7CisJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddOwogCiAJaWYgKGlvY2JxLT5zbGk0X3hyaXRhZyA9PSBOT19YUkkpCiAJCXNnbHEgPSBOVUxMOwpAQCAtNTkzLDYgKzU5OSwxMCBAQAogCQl9IGVsc2UgewogCQkJc2dscS0+c3RhdGUgPSBTR0xfRlJFRUQ7CiAJCQlsaXN0X2FkZCgmc2dscS0+bGlzdCwgJnBoYmEtPnNsaTRfaGJhLmxwZmNfc2dsX2xpc3QpOworCisJCQkvKiBDaGVjayBpZiBUWFEgcXVldWUgbmVlZHMgdG8gYmUgc2VydmljZWQgKi8KKwkJCWlmIChwcmluZy0+dHhxX2NudCkKKwkJCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwogCQl9CiAJfQogCkBAIC02MDUsNiArNjE1LDcgQEAKIAlsaXN0X2FkZF90YWlsKCZpb2NicS0+bGlzdCwgJnBoYmEtPmxwZmNfaW9jYl9saXN0KTsKIH0KIAorCiAvKioKICAqIF9fbHBmY19zbGlfcmVsZWFzZV9pb2NicV9zMyAtIFJlbGVhc2UgaW9jYiB0byB0aGUgaW9jYiBwb29sCiAgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCkBAIC02NDIsNiArNjUzLDcgQEAKIF9fbHBmY19zbGlfcmVsZWFzZV9pb2NicShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX2lvY2JxICppb2NicSkKIHsKIAlwaGJhLT5fX2xwZmNfc2xpX3JlbGVhc2VfaW9jYnEocGhiYSwgaW9jYnEpOworCXBoYmEtPmlvY2JfY250LS07CiB9CiAKIC8qKgpAQCAtODcyLDcgKzg4NCwxMSBAQAogCQkJc3RydWN0IGxwZmNfaW9jYnEgKnBpb2NiKQogewogCWxpc3RfYWRkX3RhaWwoJnBpb2NiLT5saXN0LCAmcHJpbmctPnR4Y21wbHEpOworCXBpb2NiLT5pb2NiX2ZsYWcgfD0gTFBGQ19JT19PTl9ROwogCXByaW5nLT50eGNtcGxxX2NudCsrOworCWlmIChwcmluZy0+dHhjbXBscV9jbnQgPiBwcmluZy0+dHhjbXBscV9tYXgpCisJCXByaW5nLT50eGNtcGxxX21heCA9IHByaW5nLT50eGNtcGxxX2NudDsKKwogCWlmICgodW5saWtlbHkocHJpbmctPnJpbmdubyA9PSBMUEZDX0VMU19SSU5HKSkgJiYKIAkgICAocGlvY2ItPmlvY2IudWxwQ29tbWFuZCAhPSBDTURfQUJPUlRfWFJJX0NOKSAmJgogCSAgIChwaW9jYi0+aW9jYi51bHBDb21tYW5kICE9IENNRF9DTE9TRV9YUklfQ04pKSB7CkBAIC04OTcsNyArOTEzLDcgQEAKICAqIHRoZSB0eHEsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZpcnN0IGlvY2IgaW4gdGhlIGxpc3QgYWZ0ZXIKICAqIHJlbW92aW5nIHRoZSBpb2NiIGZyb20gdGhlIGxpc3QsIGVsc2UgaXQgcmV0dXJucyBOVUxMLgogICoqLwotc3RhdGljIHN0cnVjdCBscGZjX2lvY2JxICoKK3N0cnVjdCBscGZjX2lvY2JxICoKIGxwZmNfc2xpX3Jpbmd0eF9nZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcpCiB7CiAJc3RydWN0IGxwZmNfaW9jYnEgKmNtZF9pb2NiOwpAQCAtMjE1MCw3ICsyMTY2LDEwIEBACiAJaWYgKGlvdGFnICE9IDAgJiYgaW90YWcgPD0gcGhiYS0+c2xpLmxhc3RfaW90YWcpIHsKIAkJY21kX2lvY2IgPSBwaGJhLT5zbGkuaW9jYnFfbG9va3VwW2lvdGFnXTsKIAkJbGlzdF9kZWxfaW5pdCgmY21kX2lvY2ItPmxpc3QpOwotCQlwcmluZy0+dHhjbXBscV9jbnQtLTsKKwkJaWYgKGNtZF9pb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX09OX1EpIHsKKwkJCXByaW5nLT50eGNtcGxxX2NudC0tOworCQkJY21kX2lvY2ItPmlvY2JfZmxhZyAmPSB+TFBGQ19JT19PTl9ROworCQl9CiAJCXJldHVybiBjbWRfaW9jYjsKIAl9CiAKQEAgLTIxODMsNyArMjIwMiwxMCBAQAogCWlmIChpb3RhZyAhPSAwICYmIGlvdGFnIDw9IHBoYmEtPnNsaS5sYXN0X2lvdGFnKSB7CiAJCWNtZF9pb2NiID0gcGhiYS0+c2xpLmlvY2JxX2xvb2t1cFtpb3RhZ107CiAJCWxpc3RfZGVsX2luaXQoJmNtZF9pb2NiLT5saXN0KTsKLQkJcHJpbmctPnR4Y21wbHFfY250LS07CisJCWlmIChjbWRfaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19PTl9RKSB7CisJCQljbWRfaW9jYi0+aW9jYl9mbGFnICY9IH5MUEZDX0lPX09OX1E7CisJCQlwcmluZy0+dHhjbXBscV9jbnQtLTsKKwkJfQogCQlyZXR1cm4gY21kX2lvY2I7CiAJfQogCkBAIC0zNTY0LDEzICszNTg2LDE2IEBACiBscGZjX3NsaV9icmRyZXN0YXJ0X3M0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOwotCisJdWludDMyX3QgaGJhX2Flcl9lbmFibGVkOwogCiAJLyogUmVzdGFydCBIQkEgKi8KIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfU0xJLAogCQkJIjAyOTYgUmVzdGFydCBIQkEgRGF0YTogeCV4IHgleFxuIiwKIAkJCXBoYmEtPnBwb3J0LT5wb3J0X3N0YXRlLCBwc2xpLT5zbGlfZmxhZyk7CiAKKwkvKiBUYWtlIFBDSWUgZGV2aWNlIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyAoQUVSKSBzdGF0ZSAqLworCWhiYV9hZXJfZW5hYmxlZCA9IHBoYmEtPmhiYV9mbGFnICYgSEJBX0FFUl9FTkFCTEVEOworCiAJbHBmY19zbGk0X2JyZHJlc2V0KHBoYmEpOwogCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CkBAIC0zNTgyLDYgKzM2MDcsMTAgQEAKIAltZW1zZXQoJnBzbGktPmxua19zdGF0X29mZnNldHMsIDAsIHNpemVvZihwc2xpLT5sbmtfc3RhdF9vZmZzZXRzKSk7CiAJcHNsaS0+c3RhdHNfc3RhcnQgPSBnZXRfc2Vjb25kcygpOwogCisJLyogUmVzZXQgSEJBIEFFUiBpZiBpdCB3YXMgZW5hYmxlZCwgbm90ZSBoYmFfZmxhZyB3YXMgcmVzZXQgYWJvdmUgKi8KKwlpZiAoaGJhX2Flcl9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwaGJhLT5wY2lkZXYpOworCiAJbHBmY19oYmFfZG93bl9wb3N0KHBoYmEpOwogCiAJcmV0dXJuIDA7CkBAIC0zNzk0LDcgKzM4MjMsNyBAQAogCiAJCQlwaGJhLT5saW5rX3N0YXRlID0gTFBGQ19IQkFfRVJST1I7CiAJCQltZW1wb29sX2ZyZWUocG1iLCBwaGJhLT5tYm94X21lbV9wb29sKTsKLQkJCXJldHVybiBFTlhJTzsKKwkJCXJldHVybiAtRU5YSU87CiAJCX0KIAl9CiAJcGhiYS0+aGJxX2NvdW50ID0gaGJxX2NvdW50OwpAQCAtMzg4NSw3ICszOTE0LDYgQEAKIAkJcGhiYS0+c2xpM19vcHRpb25zICY9IH4oTFBGQ19TTEkzX05QSVZfRU5BQkxFRCB8CiAJCQkJCUxQRkNfU0xJM19IQlFfRU5BQkxFRCB8CiAJCQkJCUxQRkNfU0xJM19DUlBfRU5BQkxFRCB8Ci0JCQkJCUxQRkNfU0xJM19JTkJfRU5BQkxFRCB8CiAJCQkJCUxQRkNfU0xJM19CR19FTkFCTEVEKTsKIAkJaWYgKHJjICE9IE1CWF9TVUNDRVNTKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULApAQCAtMzkyNywyMCArMzk1NSw5IEBACiAJCQlwaGJhLT5zbGkzX29wdGlvbnMgfD0gTFBGQ19TTEkzX0hCUV9FTkFCTEVEOwogCQlpZiAocG1iLT51Lm1iLnVuLnZhckNmZ1BvcnQuZ2NycCkKIAkJCXBoYmEtPnNsaTNfb3B0aW9ucyB8PSBMUEZDX1NMSTNfQ1JQX0VOQUJMRUQ7Ci0JCWlmIChwbWItPnUubWIudW4udmFyQ2ZnUG9ydC5naW5iKSB7Ci0JCQlwaGJhLT5zbGkzX29wdGlvbnMgfD0gTFBGQ19TTEkzX0lOQl9FTkFCTEVEOwotCQkJcGhiYS0+aGJxX2dldCA9IHBoYmEtPm1ib3gtPnVzLnMzX2luYl9wZ3AuaGJxX2dldDsKLQkJCXBoYmEtPnBvcnRfZ3AgPSBwaGJhLT5tYm94LT51cy5zM19pbmJfcGdwLnBvcnQ7Ci0JCQlwaGJhLT5pbmJfaGFfY29weSA9ICZwaGJhLT5tYm94LT51cy5zM19pbmJfcGdwLmhhX2NvcHk7Ci0JCQlwaGJhLT5pbmJfY291bnRlciA9ICZwaGJhLT5tYm94LT51cy5zM19pbmJfcGdwLmNvdW50ZXI7Ci0JCQlwaGJhLT5pbmJfbGFzdF9jb3VudGVyID0KLQkJCQkJcGhiYS0+bWJveC0+dXMuczNfaW5iX3BncC5jb3VudGVyOwotCQl9IGVsc2UgewotCQkJcGhiYS0+aGJxX2dldCA9IHBoYmEtPm1ib3gtPnVzLnMzX3BncC5oYnFfZ2V0OwotCQkJcGhiYS0+cG9ydF9ncCA9IHBoYmEtPm1ib3gtPnVzLnMzX3BncC5wb3J0OwotCQkJcGhiYS0+aW5iX2hhX2NvcHkgPSBOVUxMOwotCQkJcGhiYS0+aW5iX2NvdW50ZXIgPSBOVUxMOwotCQl9CisKKwkJcGhiYS0+aGJxX2dldCA9IHBoYmEtPm1ib3gtPnVzLnMzX3BncC5oYnFfZ2V0OworCQlwaGJhLT5wb3J0X2dwID0gcGhiYS0+bWJveC0+dXMuczNfcGdwLnBvcnQ7CiAKIAkJaWYgKHBoYmEtPmNmZ19lbmFibGVfYmcpIHsKIAkJCWlmIChwbWItPnUubWIudW4udmFyQ2ZnUG9ydC5nYmcpCkBAIC0zOTUzLDggKzM5NzAsNiBAQAogCX0gZWxzZSB7CiAJCXBoYmEtPmhicV9nZXQgPSBOVUxMOwogCQlwaGJhLT5wb3J0X2dwID0gcGhiYS0+bWJveC0+dXMuczIucG9ydDsKLQkJcGhiYS0+aW5iX2hhX2NvcHkgPSBOVUxMOwotCQlwaGJhLT5pbmJfY291bnRlciA9IE5VTEw7CiAJCXBoYmEtPm1heF92cGkgPSAwOwogCX0KIGRvX3ByZXBfZmFpbGVkOgpAQCAtNDIxNCw3ICs0MjI5LDggQEAKIAlpZiAobXFlLT51bi5yZWFkX3Jldi5hdmFpbF92cGRfbGVuIDwgKnZwZF9zaXplKQogCQkqdnBkX3NpemUgPSBtcWUtPnVuLnJlYWRfcmV2LmF2YWlsX3ZwZF9sZW47CiAKLQlscGZjX3NsaV9wY2ltZW1fYmNvcHkoZG1hYnVmLT52aXJ0LCB2cGQsICp2cGRfc2l6ZSk7CisJbWVtY3B5KHZwZCwgZG1hYnVmLT52aXJ0LCAqdnBkX3NpemUpOworCiAJZG1hX2ZyZWVfY29oZXJlbnQoJnBoYmEtPnBjaWRldi0+ZGV2LCBkbWFfc2l6ZSwKIAkJCSAgZG1hYnVmLT52aXJ0LCBkbWFidWYtPnBoeXMpOwogCWtmcmVlKGRtYWJ1Zik7CkBAIC00NTM5LDYgKzQ1NTUsMjQgQEAKIAkvKiBTdGFydCBlcnJvciBhdHRlbnRpb24gKEVSQVRUKSBwb2xsaW5nIHRpbWVyICovCiAJbW9kX3RpbWVyKCZwaGJhLT5lcmF0dF9wb2xsLCBqaWZmaWVzICsgSFogKiBMUEZDX0VSQVRUX1BPTExfSU5URVJWQUwpOwogCisJLyogRW5hYmxlIFBDSWUgZGV2aWNlIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyAoQUVSKSBpZiBjb25maWd1cmVkICovCisJaWYgKHBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9PSAxICYmICEocGhiYS0+aGJhX2ZsYWcgJiBIQkFfQUVSX0VOQUJMRUQpKSB7CisJCXJjID0gcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwaGJhLT5wY2lkZXYpOworCQlpZiAoIXJjKSB7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKKwkJCQkJIjI4MjkgVGhpcyBkZXZpY2Ugc3VwcG9ydHMgIgorCQkJCQkiQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIChBRVIpXG4iKTsKKwkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX0FFUl9FTkFCTEVEOworCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJCQkiMjgzMCBUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0ICIKKwkJCQkJIkFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyAoQUVSKVxuIik7CisJCQlwaGJhLT5jZmdfYWVyX3N1cHBvcnQgPSAwOworCQl9CisJfQorCiAJLyoKIAkgKiBUaGUgcG9ydCBpcyByZWFkeSwgc2V0IHRoZSBob3N0J3MgbGluayBzdGF0ZSB0byBMSU5LX0RPV04KIAkgKiBpbiBwcmVwYXJhdGlvbiBmb3IgbGluayBpbnRlcnJ1cHRzLgpAQCAtNTI2NSw3ICs1Mjk5LDggQEAKIAlpZiAobWNxZV9zdGF0dXMgIT0gTUJfQ1FFX1NUQVRVU19TVUNDRVNTKSB7CiAJCWJmX3NldChscGZjX21xZV9zdGF0dXMsIG1iLCBMUEZDX01CWF9FUlJPUl9SQU5HRSB8IG1jcWVfc3RhdHVzKTsKIAkJcmMgPSBNQlhFUlJfRVJST1I7Ci0JfQorCX0gZWxzZQorCQlscGZjX3NsaTRfc3dhcF9zdHIocGhiYSwgbWJveHEpOwogCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX01CT1ggfCBMT0dfU0xJLAogCQkJIiglZCk6MDM1NiBNYWlsYm94IGNtZCB4JXggKHgleCkgU3RhdHVzIHgleCAiCkBAIC01NTkyLDcgKzU2MjcsNyBAQAogICogaW9jYiB0byB0aGUgdHhxIHdoZW4gU0xJIGxheWVyIGNhbm5vdCBzdWJtaXQgdGhlIGNvbW1hbmQgaW9jYgogICogdG8gdGhlIHJpbmcuCiAgKiovCi1zdGF0aWMgdm9pZAordm9pZAogX19scGZjX3NsaV9yaW5ndHhfcHV0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nLAogCQkgICAgc3RydWN0IGxwZmNfaW9jYnEgKnBpb2NiKQogewpAQCAtNjIwOSw3ICs2MjQ0LDYgQEAKIAkJCSBzdHJ1Y3QgbHBmY19pb2NicSAqcGlvY2IsIHVpbnQzMl90IGZsYWcpCiB7CiAJc3RydWN0IGxwZmNfc2dscSAqc2dscTsKLQl1aW50MTZfdCB4cml0YWc7CiAJdW5pb24gbHBmY193cWUgd3FlOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tyaW5nX251bWJlcl07CiAKQEAgLTYyMTgsMTAgKzYyNTIsMjYgQEAKIAkJICAgIHBpb2NiLT5pb2NiLnVscENvbW1hbmQgPT0gQ01EX0NMT1NFX1hSSV9DTikKIAkJCXNnbHEgPSBOVUxMOwogCQllbHNlIHsKKwkJCWlmIChwcmluZy0+dHhxX2NudCkgeworCQkJCWlmICghKGZsYWcgJiBTTElfSU9DQl9SRVRfSU9DQikpIHsKKwkJCQkJX19scGZjX3NsaV9yaW5ndHhfcHV0KHBoYmEsCisJCQkJCQlwcmluZywgcGlvY2IpOworCQkJCQlyZXR1cm4gSU9DQl9TVUNDRVNTOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBJT0NCX0JVU1k7CisJCQkJfQorCQkJfSBlbHNlIHsKIAkJCXNnbHEgPSBfX2xwZmNfc2xpX2dldF9zZ2xxKHBoYmEpOwotCQkJaWYgKCFzZ2xxKQotCQkJCXJldHVybiBJT0NCX0VSUk9SOwotCQkJcGlvY2ItPnNsaTRfeHJpdGFnID0gc2dscS0+c2xpNF94cml0YWc7CisJCQkJaWYgKCFzZ2xxKSB7CisJCQkJCWlmICghKGZsYWcgJiBTTElfSU9DQl9SRVRfSU9DQikpIHsKKwkJCQkJCV9fbHBmY19zbGlfcmluZ3R4X3B1dChwaGJhLAorCQkJCQkJCQlwcmluZywKKwkJCQkJCQkJcGlvY2IpOworCQkJCQkJcmV0dXJuIElPQ0JfU1VDQ0VTUzsKKwkJCQkJfSBlbHNlCisJCQkJCQlyZXR1cm4gSU9DQl9CVVNZOworCQkJCX0KKwkJCX0KIAkJfQogCX0gZWxzZSBpZiAocGlvY2ItPmlvY2JfZmxhZyAmICBMUEZDX0lPX0ZDUCkgewogCQlzZ2xxID0gTlVMTDsgLyogVGhlc2UgSU8ncyBhbHJlYWR5IGhhdmUgYW4gWFJJIGFuZApAQCAtNjIzNyw4ICs2Mjg3LDkgQEAKIAl9CiAKIAlpZiAoc2dscSkgewotCQl4cml0YWcgPSBscGZjX3NsaTRfYnBsMnNnbChwaGJhLCBwaW9jYiwgc2dscSk7Ci0JCWlmICh4cml0YWcgIT0gc2dscS0+c2xpNF94cml0YWcpCisJCXBpb2NiLT5zbGk0X3hyaXRhZyA9IHNnbHEtPnNsaTRfeHJpdGFnOworCisJCWlmIChOT19YUkkgPT0gbHBmY19zbGk0X2JwbDJzZ2wocGhiYSwgcGlvY2IsIHNnbHEpKQogCQkJcmV0dXJuIElPQ0JfRVJST1I7CiAJfQogCkBAIC02Mjc4LDcgKzYzMjksNyBAQAogICogCUlPQ0JfU1VDQ0VTUyAtIFN1Y2Nlc3MKICAqIAlJT0NCX0JVU1kgLSBCdXN5CiAgKiovCi1zdGF0aWMgaW5saW5lIGludAoraW50CiBfX2xwZmNfc2xpX2lzc3VlX2lvY2Ioc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MzJfdCByaW5nX251bWJlciwKIAkJc3RydWN0IGxwZmNfaW9jYnEgKnBpb2NiLCB1aW50MzJfdCBmbGFnKQogewpAQCAtNzA5NSwxMyArNzE0Niw2IEBACiAJCQkgKi8KIAkJCWFib3J0X2lvY2IgPSBwaGJhLT5zbGkuaW9jYnFfbG9va3VwW2Fib3J0X2NvbnRleHRdOwogCi0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19FTFMgfCBMT0dfU0xJLAotCQkJCSIwMzI3IENhbm5vdCBhYm9ydCBlbHMgaW9jYiAlcCAiCi0JCQkJIndpdGggdGFnICV4IGNvbnRleHQgJXgsIGFib3J0IHN0YXR1cyAleCwgIgotCQkJCSJhYm9ydCBjb2RlICV4XG4iLAotCQkJCWFib3J0X2lvY2IsIGFib3J0X2lvdGFnLCBhYm9ydF9jb250ZXh0LAotCQkJCWlyc3AtPnVscFN0YXR1cywgaXJzcC0+dW4udWxwV29yZFs0XSk7Ci0KIAkJLyoKIAkJICogIElmIHRoZSBpb2NiIGlzIG5vdCBmb3VuZCBpbiBGaXJtd2FyZSBxdWV1ZSB0aGUgaW9jYgogCQkgKiAgbWlnaHQgaGF2ZSBjb21wbGV0ZWQgYWxyZWFkeS4gRG8gbm90IGZyZWUgaXQgYWdhaW4uCkBAIC03MTIwLDYgKzcxNjQsMTMgQEAKIAkJCWlmIChhYm9ydF9pb2NiICYmIHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKIAkJCQlhYm9ydF9jb250ZXh0ID0gYWJvcnRfaW9jYi0+aW9jYi51bHBDb250ZXh0OwogCQl9CisKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0VMUyB8IExPR19TTEksCisJCQkJIjAzMjcgQ2Fubm90IGFib3J0IGVscyBpb2NiICVwICIKKwkJCQkid2l0aCB0YWcgJXggY29udGV4dCAleCwgYWJvcnQgc3RhdHVzICV4LCAiCisJCQkJImFib3J0IGNvZGUgJXhcbiIsCisJCQkJYWJvcnRfaW9jYiwgYWJvcnRfaW90YWcsIGFib3J0X2NvbnRleHQsCisJCQkJaXJzcC0+dWxwU3RhdHVzLCBpcnNwLT51bi51bHBXb3JkWzRdKTsKIAkJLyoKIAkJICogbWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGlvY2JxIGJlZm9yZSB0YWtpbmcgaXQKIAkJICogb2ZmIHRoZSB0eGNtcGxxIGFuZCB0cnkgdG8gY2FsbCBjb21wbGV0aW9uIHJvdXRpbmUuCkBAIC03MTM3LDcgKzcxODgsMTAgQEAKIAkJCSAqIGZvbGxvd2luZyBhYm9ydCBYUkkgZnJvbSB0aGUgSEJBLgogCQkJICovCiAJCQlsaXN0X2RlbF9pbml0KCZhYm9ydF9pb2NiLT5saXN0KTsKLQkJCXByaW5nLT50eGNtcGxxX2NudC0tOworCQkJaWYgKGFib3J0X2lvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fT05fUSkgeworCQkJCWFib3J0X2lvY2ItPmlvY2JfZmxhZyAmPSB+TFBGQ19JT19PTl9ROworCQkJCXByaW5nLT50eGNtcGxxX2NudC0tOworCQkJfQogCiAJCQkvKiBGaXJtd2FyZSBjb3VsZCBzdGlsbCBiZSBpbiBwcm9ncmVzcyBvZiBETUFpbmcKIAkJCSAqIHBheWxvYWQsIHNvIGRvbid0IGZyZWUgZGF0YSBidWZmZXIgdGlsbCBhZnRlcgpAQCAtNzI2OSw4ICs3MzIzLDkgQEAKIAlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19TTEksCiAJCQkgIjAzMzkgQWJvcnQgeHJpIHgleCwgb3JpZ2luYWwgaW90YWcgeCV4LCAiCiAJCQkgImFib3J0IGNtZCBpb3RhZyB4JXhcbiIsCisJCQkgaWFidC0+dW4uYWN4cmkuYWJvcnRJb1RhZywKIAkJCSBpYWJ0LT51bi5hY3hyaS5hYm9ydENvbnRleHRUYWcsCi0JCQkgaWFidC0+dW4uYWN4cmkuYWJvcnRJb1RhZywgYWJ0c2lvY2JwLT5pb3RhZyk7CisJCQkgYWJ0c2lvY2JwLT5pb3RhZyk7CiAJcmV0dmFsID0gX19scGZjX3NsaV9pc3N1ZV9pb2NiKHBoYmEsIHByaW5nLT5yaW5nbm8sIGFidHNpb2NicCwgMCk7CiAKIAlpZiAocmV0dmFsKQpAQCAtNzYwMCw3ICs3NjU1LDcgQEAKIAlsb25nIHRpbWVsZWZ0LCB0aW1lb3V0X3JlcSA9IDA7CiAJaW50IHJldHZhbCA9IElPQ0JfU1VDQ0VTUzsKIAl1aW50MzJfdCBjcmVnX3ZhbDsKLQorCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKIAkvKgogCSAqIElmIHRoZSBjYWxsZXIgaGFzIHByb3ZpZGVkIGEgcmVzcG9uc2UgaW9jYnEgYnVmZmVyLCB0aGVuIGNvbnRleHQyCiAJICogaXMgTlVMTCBvciBpdHMgYW4gZXJyb3IuCkBAIC03NjIyLDcgKzc2NzcsOCBAQAogCQlyZWFkbChwaGJhLT5IQ3JlZ2FkZHIpOyAvKiBmbHVzaCAqLwogCX0KIAotCXJldHZhbCA9IGxwZmNfc2xpX2lzc3VlX2lvY2IocGhiYSwgcmluZ19udW1iZXIsIHBpb2NiLCAwKTsKKwlyZXR2YWwgPSBscGZjX3NsaV9pc3N1ZV9pb2NiKHBoYmEsIHJpbmdfbnVtYmVyLCBwaW9jYiwKKwkJCQkgICAgIFNMSV9JT0NCX1JFVF9JT0NCKTsKIAlpZiAocmV0dmFsID09IElPQ0JfU1VDQ0VTUykgewogCQl0aW1lb3V0X3JlcSA9IHRpbWVvdXQgKiBIWjsKIAkJdGltZWxlZnQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZG9uZV9xLApAQCAtNzY0NCw2ICs3NzAwLDExIEBACiAJCQkJCXRpbWVvdXQsICh0aW1lbGVmdCAvIGppZmZpZXMpKTsKIAkJCXJldHZhbCA9IElPQ0JfVElNRURPVVQ7CiAJCX0KKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBJT0NCX0JVU1kpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX1NMSSwKKwkJCSIyODE4IE1heCBJT0NCcyAlZCB0eHEgY250ICVkIHR4Y21wbHEgY250ICVkXG4iLAorCQkJcGhiYS0+aW9jYl9jbnQsIHByaW5nLT50eHFfY250LCBwcmluZy0+dHhjbXBscV9jbnQpOworCQlyZXR1cm4gcmV0dmFsOwogCX0gZWxzZSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19TTEksCiAJCQkJIjAzMzIgSU9DQiB3YWl0IGlzc3VlIGZhaWxlZCwgRGF0YSB4JXhcbiIsCkBAIC03NzI0LDkgKzc3ODUsMTAgQEAKIAkJICogaWYgTFBGQ19NQlhfV0FLRSBmbGFnIGlzIHNldCB0aGUgbWFpbGJveCBpcyBjb21wbGV0ZWQKIAkJICogZWxzZSBkbyBub3QgZnJlZSB0aGUgcmVzb3VyY2VzLgogCQkgKi8KLQkJaWYgKHBtYm94cS0+bWJveF9mbGFnICYgTFBGQ19NQlhfV0FLRSkKKwkJaWYgKHBtYm94cS0+bWJveF9mbGFnICYgTFBGQ19NQlhfV0FLRSkgewogCQkJcmV0dmFsID0gTUJYX1NVQ0NFU1M7Ci0JCWVsc2UgeworCQkJbHBmY19zbGk0X3N3YXBfc3RyKHBoYmEsIHBtYm94cSk7CisJCX0gZWxzZSB7CiAJCQlyZXR2YWwgPSBNQlhfVElNRU9VVDsKIAkJCXBtYm94cS0+bWJveF9jbXBsID0gbHBmY19zbGlfZGVmX21ib3hfY21wbDsKIAkJfQpAQCAtODc4OSwxMiArODg1MSwxNyBAQAogewogCXN0cnVjdCBscGZjX2lvY2JxICppcnNwaW9jYnE7CiAJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW0xQRkNfRkNQX1JJTkddOwogCiAJLyogR2V0IGFuIGlyc3Bpb2NicSBmb3IgbGF0ZXIgRUxTIHJlc3BvbnNlIHByb2Nlc3NpbmcgdXNlICovCiAJaXJzcGlvY2JxID0gbHBmY19zbGlfZ2V0X2lvY2JxKHBoYmEpOwogCWlmICghaXJzcGlvY2JxKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKLQkJCQkiMDM4NyBGYWlsZWQgdG8gYWxsb2NhdGUgYW4gaW9jYnFcbiIpOworCQkJIjAzODcgTk8gSU9DQlEgZGF0YTogdHhxX2NudD0lZCBpb2NiX2NudD0lZCAiCisJCQkiZmNwX3R4Y21wbHFfY250PSVkLCBlbHNfdHhjbXBscV9jbnQ9JWRcbiIsCisJCQlwcmluZy0+dHhxX2NudCwgcGhiYS0+aW9jYl9jbnQsCisJCQlwaGJhLT5zbGkucmluZ1tMUEZDX0ZDUF9SSU5HXS50eGNtcGxxX2NudCwKKwkJCXBoYmEtPnNsaS5yaW5nW0xQRkNfRUxTX1JJTkddLnR4Y21wbHFfY250KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtOTA0Myw5ICs5MTEwLDEwIEBACiAJCX0KIAl9CiAJaWYgKHVubGlrZWx5KCFjcSkpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAotCQkJCSIwMzY1IFNsb3ctcGF0aCBDUSBpZGVudGlmaWVyICglZCkgZG9lcyAiCi0JCQkJIm5vdCBleGlzdFxuIiwgY3FpZCk7CisJCWlmIChwaGJhLT5zbGkuc2xpX2ZsYWcgJiBMUEZDX1NMSV9BQ1RJVkUpCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJCSIwMzY1IFNsb3ctcGF0aCBDUSBpZGVudGlmaWVyICIKKwkJCQkJIiglZCkgZG9lcyBub3QgZXhpc3RcbiIsIGNxaWQpOwogCQlyZXR1cm47CiAJfQogCkBAIC05MjA4LDYgKzkyNzYsNyBAQAogewogCXN0cnVjdCBscGZjX3djcWVfcmVsZWFzZSB3Y3FlOwogCWJvb2wgd29ya3Bvc3RlZCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgaWZsYWc7CiAKIAkvKiBDb3B5IHRoZSB3b3JrIHF1ZXVlIENRRSBhbmQgY29udmVydCBlbmRpYW4gb3JkZXIgaWYgbmVlZGVkICovCiAJbHBmY19zbGlfcGNpbWVtX2Jjb3B5KGNxZSwgJndjcWUsIHNpemVvZihzdHJ1Y3QgbHBmY19jcWUpKTsKQEAgLTkyMTYsNiArOTI4NSw5IEBACiAJc3dpdGNoIChiZl9nZXQobHBmY193Y3FlX2NfY29kZSwgJndjcWUpKSB7CiAJY2FzZSBDUUVfQ09ERV9DT01QTF9XUUU6CiAJCS8qIFByb2Nlc3MgdGhlIFdRIGNvbXBsZXRlIGV2ZW50ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CisJCXBoYmEtPmxhc3RfY29tcGxldGlvbl90aW1lID0gamlmZmllczsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQlscGZjX3NsaTRfZnBfaGFuZGxlX2ZjcF93Y3FlKHBoYmEsCiAJCQkJKHN0cnVjdCBscGZjX3djcWVfY29tcGxldGUgKikmd2NxZSk7CiAJCWJyZWFrOwpAQCAtOTI3MSw5ICs5MzQzLDEwIEBACiAKIAljcSA9IHBoYmEtPnNsaTRfaGJhLmZjcF9jcVtmY3BfY3FpZHhdOwogCWlmICh1bmxpa2VseSghY3EpKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKLQkJCQkiMDM2NyBGYXN0LXBhdGggY29tcGxldGlvbiBxdWV1ZSBkb2VzIG5vdCAiCi0JCQkJImV4aXN0XG4iKTsKKwkJaWYgKHBoYmEtPnNsaS5zbGlfZmxhZyAmIExQRkNfU0xJX0FDVElWRSkKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkJIjAzNjcgRmFzdC1wYXRoIGNvbXBsZXRpb24gcXVldWUgIgorCQkJCQkiZG9lcyBub3QgZXhpc3RcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTg5OCwxMiArMTE5NzEsMjYgQEAKICAqIGF2YWlsYWJsZSBycGlzIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci4KICAqKi8KIHZvaWQKK19fbHBmY19zbGk0X2ZyZWVfcnBpKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgaW50IHJwaSkKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHJwaSwgcGhiYS0+c2xpNF9oYmEucnBpX2JtYXNrKSkgeworCQlwaGJhLT5zbGk0X2hiYS5ycGlfY291bnQtLTsKKwkJcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5ycGlfdXNlZC0tOworCX0KK30KKworLyoqCisgKiBscGZjX3NsaTRfZnJlZV9ycGkgLSBSZWxlYXNlIGFuIHJwaSBmb3IgcmV1c2UuCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0byByZWxlYXNlIGFuIHJwaSB0byB0aGUgcG9vbCBvZgorICogYXZhaWxhYmxlIHJwaXMgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyLgorICoqLwordm9pZAogbHBmY19zbGk0X2ZyZWVfcnBpKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgaW50IHJwaSkKIHsKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQljbGVhcl9iaXQocnBpLCBwaGJhLT5zbGk0X2hiYS5ycGlfYm1hc2spOwotCXBoYmEtPnNsaTRfaGJhLnJwaV9jb3VudC0tOwotCXBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ucnBpX3VzZWQtLTsKKwlfX2xwZmNfc2xpNF9mcmVlX3JwaShwaGJhLCBycGkpOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiB9CiAKQEAgLTEyMzE4LDE4ICsxMjQwNSw0NyBAQAogewogCXVpbnQxNl90IG5leHRfZmNmX2luZGV4OwogCi0JLyogU2VhcmNoIGZyb20gdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIEZDRiBpbmRleCAqLworCS8qIFNlYXJjaCBzdGFydCBmcm9tIG5leHQgYml0IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIEZDRiBpbmRleCAqLworCW5leHRfZmNmX2luZGV4ID0gKHBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCArIDEpICUKKwkJCQkJTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVg7CiAJbmV4dF9mY2ZfaW5kZXggPSBmaW5kX25leHRfYml0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssCiAJCQkJICAgICAgIExQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYLAotCQkJCSAgICAgICBwaGJhLT5mY2YuY3VycmVudF9yZWMuZmNmX2luZHgpOworCQkJCSAgICAgICBuZXh0X2ZjZl9pbmRleCk7CisKIAkvKiBXcmFwIGFyb3VuZCBjb25kaXRpb24gb24gcGhiYS0+ZmNmLmZjZl9ycl9ibWFzayAqLwogCWlmIChuZXh0X2ZjZl9pbmRleCA+PSBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCkKIAkJbmV4dF9mY2ZfaW5kZXggPSBmaW5kX25leHRfYml0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssCiAJCQkJCSAgICAgICBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCwgMCk7Ci0JLyogUm91bmQgcm9iaW4gZmFpbG92ZXIgc3RvcCBjb25kaXRpb24gKi8KLQlpZiAobmV4dF9mY2ZfaW5kZXggPT0gcGhiYS0+ZmNmLmZjZl9ycl9pbml0X2luZHgpCi0JCXJldHVybiBMUEZDX0ZDT0VfRkNGX05FWFRfTk9ORTsKIAorCS8qIENoZWNrIHJvdW5kcm9iaW4gZmFpbG92ZXIgbGlzdCBlbXB0eSBjb25kaXRpb24gKi8KKwlpZiAobmV4dF9mY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0ZJUCwKKwkJCQkiMjg0NCBObyByb3VuZHJvYmluIGZhaWxvdmVyIEZDRiBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gTFBGQ19GQ09FX0ZDRl9ORVhUX05PTkU7CisJfQorCisJLyogQ2hlY2sgcm91bmRyb2JpbiBmYWlsb3ZlciBpbmRleCBibWFzayBzdG9wIGNvbmRpdGlvbiAqLworCWlmIChuZXh0X2ZjZl9pbmRleCA9PSBwaGJhLT5mY2YuZmNmX3JyX2luaXRfaW5keCkgeworCQlpZiAoIShwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfUkVESVNDX1JSVSkpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19GSVAsCisJCQkJCSIyODQ3IFJvdW5kIHJvYmluIGZhaWxvdmVyIEZDRiBpbmRleCAiCisJCQkJCSJzZWFyY2ggaGl0IHN0b3AgY29uZGl0aW9uOngleFxuIiwKKwkJCQkJbmV4dF9mY2ZfaW5kZXgpOworCQkJcmV0dXJuIExQRkNfRkNPRV9GQ0ZfTkVYVF9OT05FOworCQl9CisJCS8qIFRoZSByb3VuZHJvYmluIGZhaWxvdmVyIGluZGV4IGJtYXNrIHVwZGF0ZWQsIHN0YXJ0IG92ZXIgKi8KKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKKwkJCQkiMjg0OCBSb3VuZCByb2JpbiBmYWlsb3ZlciBGQ0YgaW5kZXggYm1hc2sgIgorCQkJCSJ1cGRhdGVkLCBzdGFydCBvdmVyXG4iKTsKKwkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCXBoYmEtPmZjZi5mY2ZfZmxhZyAmPSB+RkNGX1JFRElTQ19SUlU7CisJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCXJldHVybiBwaGJhLT5mY2YuZmNmX3JyX2luaXRfaW5keDsKKwl9CisKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAorCQkJIjI4NDUgR2V0IG5leHQgcm91bmQgcm9iaW4gZmFpbG92ZXIgIgorCQkJIkZDRiBpbmRleCB4JXhcbiIsIG5leHRfZmNmX2luZGV4KTsKIAlyZXR1cm4gbmV4dF9mY2ZfaW5kZXg7CiB9CiAKQEAgLTEyMzU5LDExICsxMjQ3NSwyMCBAQAogCS8qIFNldCB0aGUgZWxpZ2libGUgRkNGIHJlY29yZCBpbmRleCBibWFzayAqLwogCXNldF9iaXQoZmNmX2luZGV4LCBwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKTsKIAorCS8qIFNldCB0aGUgcm91bmRyb2JpbiBpbmRleCBibWFzayB1cGRhdGVkICovCisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJcGhiYS0+ZmNmLmZjZl9mbGFnIHw9IEZDRl9SRURJU0NfUlJVOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAorCQkJIjI3OTAgU2V0IEZDRiBpbmRleCB4JXggdG8gcm91bmQgcm9iaW4gZmFpbG92ZXIgIgorCQkJImJtYXNrXG4iLCBmY2ZfaW5kZXgpOworCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogbHBmY19zbGk0X2ZjZl9ycl9pbmRleF9zZXQgLSBDbGVhciBibWFzayBmcm9tIGVsaWdpYmxlIGZjZiByZWNvcmQgaW5kZXgKKyAqIGxwZmNfc2xpNF9mY2ZfcnJfaW5kZXhfY2xlYXIgLSBDbGVhciBibWFzayBmcm9tIGVsaWdpYmxlIGZjZiByZWNvcmQgaW5kZXgKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICoKICAqIFRoaXMgcm91dGluZSBjbGVhcnMgdGhlIEZDRiByZWNvcmQgaW5kZXggZnJvbSB0aGUgZWxpZ2libGUgYm1hc2sgZm9yCkBAIC0xMjM4NCw2ICsxMjUwOSwxMCBAQAogCX0KIAkvKiBDbGVhciB0aGUgZWxpZ2libGUgRkNGIHJlY29yZCBpbmRleCBibWFzayAqLwogCWNsZWFyX2JpdChmY2ZfaW5kZXgsIHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spOworCisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKKwkJCSIyNzkxIENsZWFyIEZDRiBpbmRleCB4JXggZnJvbSByb3VuZCByb2JpbiBmYWlsb3ZlciAiCisJCQkiYm1hc2tcbiIsIGZjZl9pbmRleCk7CiB9CiAKIC8qKgpAQCAtMTI0NDYsNyArMTI1NzUsNyBAQAogfQogCiAvKioKLSAqIGxwZmNfc2xpNF9yZWRpc2NfYWxsX2ZjZiAtIFJlcXVlc3QgdG8gcmVkaXNjb3ZlciBlbnRpcmUgRkNGIHRhYmxlIGJ5IHBvcnQuCisgKiBscGZjX3NsaTRfcmVkaXNjX2ZjZl90YWJsZSAtIFJlcXVlc3QgdG8gcmVkaXNjb3ZlciBlbnRpcmUgRkNGIHRhYmxlIGJ5IHBvcnQuCiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0byByZXF1ZXN0IGZvciByZWRpc2NvdmVyeSBvZiB0aGUgZW50aXJlIEZDRiB0YWJsZQpAQCAtMTI2NjIsNiArMTI3OTEsNyBAQAogCUxQRkNfTUJPWFFfdCAqbWIsICpuZXh0bWI7CiAJc3RydWN0IGxwZmNfZG1hYnVmICptcDsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnQpOwogCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1iLCBuZXh0bWIsICZwaGJhLT5zbGkubWJveHEsIGxpc3QpIHsKQEAgLTEyNjczLDYgKzEyODAzLDkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChtYi0+dS5tYi5tYnhDb21tYW5kID09IE1CWF9SRUdfTE9HSU42NCkgeworCQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJCQlfX2xwZmNfc2xpNF9mcmVlX3JwaShwaGJhLAorCQkJCQkJbWItPnUubWIudW4udmFyUmVnTG9naW4ucnBpKTsKIAkJCW1wID0gKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSAobWItPmNvbnRleHQxKTsKIAkJCWlmIChtcCkgewogCQkJCV9fbHBmY19tYnVmX2ZyZWUocGhiYSwgbXAtPnZpcnQsIG1wLT5waHlzKTsKQEAgLTEyNjgwLDYgKzEyODEzLDkgQEAKIAkJCX0KIAkJCW5kbHAgPSAoc3RydWN0IGxwZmNfbm9kZWxpc3QgKikgbWItPmNvbnRleHQyOwogCQkJaWYgKG5kbHApIHsKKwkJCQlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCQkJCW5kbHAtPm5scF9mbGFnICY9IH5OTFBfSUdOUl9SRUdfQ01QTDsKKwkJCQlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CiAJCQkJbHBmY19ubHBfcHV0KG5kbHApOwogCQkJCW1iLT5jb250ZXh0MiA9IE5VTEw7CiAJCQl9CkBAIC0xMjY5NSw2ICsxMjgzMSw5IEBACiAJCWlmIChtYi0+dS5tYi5tYnhDb21tYW5kID09IE1CWF9SRUdfTE9HSU42NCkgewogCQkJbmRscCA9IChzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqKSBtYi0+Y29udGV4dDI7CiAJCQlpZiAobmRscCkgeworCQkJCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CisJCQkJbmRscC0+bmxwX2ZsYWcgJj0gfk5MUF9JR05SX1JFR19DTVBMOworCQkJCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAkJCQlscGZjX25scF9wdXQobmRscCk7CiAJCQkJbWItPmNvbnRleHQyID0gTlVMTDsKIAkJCX0KQEAgLTEyNzA1LDMgKzEyODQ0LDg1IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIH0KIAorLyoqCisgKiBscGZjX2RyYWluX3R4cSAtIERyYWluIHRoZSB0eHEKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHQgdG8gc3VibWl0IElPQ0JzIG9uIHRoZSB0eHEKKyAqIHRvIHRoZSBhZGFwdGVyLiAgRm9yIFNMSTQgYWRhcHRlcnMsIHRoZSB0eHEgY29udGFpbnMKKyAqIEVMUyBJT0NCcyB0aGF0IGhhdmUgYmVlbiBkZWZlcnJlZCBiZWNhdXNlIHRoZSB0aGVyZQorICogYXJlIG5vIFNHTHMuICBUaGlzIGNvbmdlc3Rpb24gY2FuIG9jY3VyIHdpdGggbGFyZ2UKKyAqIHZwb3J0IGNvdW50cyBkdXJpbmcgbm9kZSBkaXNjb3ZlcnkuCisgKiovCisKK3VpbnQzMl90CitscGZjX2RyYWluX3R4cShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJTElTVF9IRUFEKGNvbXBsZXRpb25zKTsKKwlzdHJ1Y3QgbHBmY19zbGlfcmluZyAqcHJpbmcgPSAmcGhiYS0+c2xpLnJpbmdbTFBGQ19FTFNfUklOR107CisJc3RydWN0IGxwZmNfaW9jYnEgKnBpb2NicSA9IDA7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3MgPSAwOworCWNoYXIgKmZhaWxfbXNnID0gTlVMTDsKKwlzdHJ1Y3QgbHBmY19zZ2xxICpzZ2xxOworCXVuaW9uIGxwZmNfd3FlIHdxZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOworCWlmIChwcmluZy0+dHhxX2NudCA+IHByaW5nLT50eHFfbWF4KQorCQlwcmluZy0+dHhxX21heCA9IHByaW5nLT50eHFfY250OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKKworCXdoaWxlIChwcmluZy0+dHhxX2NudCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWdzKTsKKworCQlzZ2xxID0gX19scGZjX3NsaV9nZXRfc2dscShwaGJhKTsKKwkJaWYgKCFzZ2xxKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwaW9jYnEgPSBscGZjX3NsaV9yaW5ndHhfZ2V0KHBoYmEsIHByaW5nKTsKKwkJCWlmICghcGlvY2JxKSB7CisJCQkJLyogVGhlIHR4cV9jbnQgb3V0IG9mIHN5bmMuIFRoaXMgc2hvdWxkCisJCQkJICogbmV2ZXIgaGFwcGVuCisJCQkJICovCisJCQkJc2dscSA9IF9fbHBmY19jbGVhcl9hY3RpdmVfc2dscShwaGJhLAorCQkJCQkJIHNnbHEtPnNsaTRfeHJpdGFnKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOworCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkJIjI4MjMgdHhxIGVtcHR5IGFuZCB0eHFfY250IGlzICVkXG4gIiwKKwkJCQkJcHJpbmctPnR4cV9jbnQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogVGhlIHhyaSBhbmQgaW9jYiByZXNvdXJjZXMgc2VjdXJlZCwKKwkJICogYXR0ZW1wdCB0byBpc3N1ZSByZXF1ZXN0CisJCSAqLworCQlwaW9jYnEtPnNsaTRfeHJpdGFnID0gc2dscS0+c2xpNF94cml0YWc7CisJCWlmIChOT19YUkkgPT0gbHBmY19zbGk0X2JwbDJzZ2wocGhiYSwgcGlvY2JxLCBzZ2xxKSkKKwkJCWZhaWxfbXNnID0gInRvIGNvbnZlcnQgYnBsIHRvIHNnbCI7CisJCWVsc2UgaWYgKGxwZmNfc2xpNF9pb2NiMndxZShwaGJhLCBwaW9jYnEsICZ3cWUpKQorCQkJZmFpbF9tc2cgPSAidG8gY29udmVydCBpb2NiIHRvIHdxZSI7CisJCWVsc2UgaWYgKGxwZmNfc2xpNF93cV9wdXQocGhiYS0+c2xpNF9oYmEuZWxzX3dxLCAmd3FlKSkKKwkJCWZhaWxfbXNnID0gIiAtIFdxIGlzIGZ1bGwiOworCQllbHNlCisJCQlscGZjX3NsaV9yaW5ndHhjbXBsX3B1dChwaGJhLCBwcmluZywgcGlvY2JxKTsKKworCQlpZiAoZmFpbF9tc2cpIHsKKwkJCS8qIEZhaWxlZCBtZWFucyB3ZSBjYW4ndCBpc3N1ZSBhbmQgbmVlZCB0byBjYW5jZWwgKi8KKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkJIjI4MjIgSU9DQiBmYWlsZWQgJXMgaW90YWcgMHgleCAiCisJCQkJCSJ4cmkgMHgleFxuIiwKKwkJCQkJZmFpbF9tc2csCisJCQkJCXBpb2NicS0+aW90YWcsIHBpb2NicS0+c2xpNF94cml0YWcpOworCQkJbGlzdF9hZGRfdGFpbCgmcGlvY2JxLT5saXN0LCAmY29tcGxldGlvbnMpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7CisJfQorCisJLyogQ2FuY2VsIGFsbCB0aGUgSU9DQnMgdGhhdCBjYW5ub3QgYmUgaXNzdWVkICovCisJbHBmY19zbGlfY2FuY2VsX2lvY2JzKHBoYmEsICZjb21wbGV0aW9ucywgSU9TVEFUX0xPQ0FMX1JFSkVDVCwKKwkJCQlJT0VSUl9TTElfQUJPUlRFRCk7CisKKwlyZXR1cm4gcHJpbmctPnR4cV9jbnQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaAppbmRleCBlMzc5MjE1Li5jZDU2ZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKIAkvKiBscGZjX2lvY2JxcyBhcmUgdXNlZCBpbiBkb3VibGUgbGlua2VkIGxpc3RzICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgY2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkbGlzdDsKIAl1aW50MTZfdCBpb3RhZzsgICAgICAgICAvKiBwcmUtYXNzaWduZWQgSU8gdGFnICovCiAJdWludDE2X3Qgc2xpNF94cml0YWc7ICAgLyogcHJlLWFzc2lnbmVkIFhSSSwgKE9YSUQpIHRhZy4gKi8KIAlzdHJ1Y3QgbHBmY19jcV9ldmVudCBjcV9ldmVudDsKQEAgLTY0LDYgKzY1LDcgQEAKICNkZWZpbmUgTFBGQ19FWENIQU5HRV9CVVNZCTB4NDAgICAgLyogU0xJNCBoYmEgcmVwb3J0ZWQgWEIgaW4gcmVzcG9uc2UgKi8KICNkZWZpbmUgTFBGQ19VU0VfRkNQV1FJRFgJMHg4MCAgICAvKiBTdWJtaXQgdG8gc3BlY2lmaWVkIEZDUFdRIGluZGV4ICovCiAjZGVmaW5lIERTU19TRUNVUklUWV9PUAkJMHgxMDAJLyogc2VjdXJpdHkgSU8gKi8KKyNkZWZpbmUgTFBGQ19JT19PTl9RCQkweDIwMAkvKiBUaGUgSU8gaXMgc3RpbGwgb24gdGhlIFRYQ01QTFEgKi8KIAogI2RlZmluZSBMUEZDX0ZJUF9FTFNfSURfTUFTSwkweGMwMDAJLyogRUxTX0lEIHJhbmdlIDAtMywgbm9uLXNoaWZ0ZWQgbWFzayAqLwogI2RlZmluZSBMUEZDX0ZJUF9FTFNfSURfU0hJRlQJMTQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKaW5kZXggNThiYjRjOC4uYTNiMjRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKQEAgLTUxLDYgKzUxLDkgQEAKICNkZWZpbmUgTFBGQ19GQ09FX0ZDRl9HRVRfRklSU1QJMHhGRkZGCiAjZGVmaW5lIExQRkNfRkNPRV9GQ0ZfTkVYVF9OT05FCTB4RkZGRgogCisjZGVmaW5lIExQRkNfRkNPRV9OVUxMX1ZJRAkweEZGRgorI2RlZmluZSBMUEZDX0ZDT0VfSUdOT1JFX1ZJRAkweEZGRkYKKwogLyogRmlyc3QgMyBieXRlcyBvZiBkZWZhdWx0IEZDRiBNQUMgaXMgc3BlY2lmaWVkIGJ5IEZDX01BUCAqLwogI2RlZmluZSBMUEZDX0ZDT0VfRkNGX01BQzMJMHhGRgogI2RlZmluZSBMUEZDX0ZDT0VfRkNGX01BQzQJMHhGRgpAQCAtNTgsNyArNjEsNyBAQAogI2RlZmluZSBMUEZDX0ZDT0VfRkNGX01BUDAJMHgwRQogI2RlZmluZSBMUEZDX0ZDT0VfRkNGX01BUDEJMHhGQwogI2RlZmluZSBMUEZDX0ZDT0VfRkNGX01BUDIJMHgwMAotI2RlZmluZSBMUEZDX0ZDT0VfTUFYX1JDVl9TSVpFCTB4NUFDCisjZGVmaW5lIExQRkNfRkNPRV9NQVhfUkNWX1NJWkUJMHg4MDAKICNkZWZpbmUgTFBGQ19GQ09FX0ZLQV9BRFZfUEVSCTAKICNkZWZpbmUgTFBGQ19GQ09FX0ZJUF9QUklPUklUWQkweDgwCiAKQEAgLTE2MCw2ICsxNjMsNyBAQAogI2RlZmluZSBGQ0ZfUkVESVNDX1BFTkQJMHg4MCAvKiBGQ0YgcmVkaXNjb3ZlcnkgcGVuZGluZyAqLwogI2RlZmluZSBGQ0ZfUkVESVNDX0VWVAkweDEwMCAvKiBGQ0YgcmVkaXNjb3ZlcnkgZXZlbnQgdG8gd29ya2VyIHRocmVhZCAqLwogI2RlZmluZSBGQ0ZfUkVESVNDX0ZPVgkweDIwMCAvKiBQb3N0IEZDRiByZWRpc2NvdmVyeSBmYXN0IGZhaWxvdmVyICovCisjZGVmaW5lIEZDRl9SRURJU0NfUlJVCTB4NDAwIC8qIFJvdW5kcm9iaW4gYml0bWFwIHVwZGF0ZWQgKi8KIAl1aW50MzJfdCBhZGRyX21vZGU7CiAJdWludDE2X3QgZmNmX3JyX2luaXRfaW5keDsKIAl1aW50MzJfdCBlbGlnaWJsZV9mY2ZfY250OwpAQCAtMzgyLDYgKzM4Niw3IEBACiAJc3RydWN0IGxwZmNfcGNfc2xpNF9wYXJhbXMgcGNfc2xpNF9wYXJhbXM7CiAJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKIAl1aW50MzJfdCBjZmdfZXFuOworCXVpbnQzMl90IG1zaXhfdmVjX25yOwogCXN0cnVjdCBscGZjX2ZjcF9lcV9oZGwgKmZjcF9lcV9oZGw7IC8qIEZDUCBwZXItV1EgaGFuZGxlICovCiAJLyogUG9pbnRlcnMgdG8gdGhlIGNvbnN0cnVjdGVkIFNMSTQgcXVldWVzICovCiAJc3RydWN0IGxwZmNfcXVldWUgKipmcF9lcTsgLyogRmFzdC1wYXRoIGV2ZW50IHF1ZXVlICovCkBAIC01MjQsNiArNTI5LDcgQEAKIHN0cnVjdCBscGZjX3JwaV9oZHIgKmxwZmNfc2xpNF9jcmVhdGVfcnBpX2hkcihzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfc2xpNF9yZW1vdmVfcnBpX2hkcnMoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpNF9hbGxvY19ycGkoc3RydWN0IGxwZmNfaGJhICopOwordm9pZCBfX2xwZmNfc2xpNF9mcmVlX3JwaShzdHJ1Y3QgbHBmY19oYmEgKiwgaW50KTsKIHZvaWQgbHBmY19zbGk0X2ZyZWVfcnBpKHN0cnVjdCBscGZjX2hiYSAqLCBpbnQpOwogdm9pZCBscGZjX3NsaTRfcmVtb3ZlX3JwaXMoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3NsaTRfYXN5bmNfZXZlbnRfcHJvYyhzdHJ1Y3QgbHBmY19oYmEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCmluZGV4IDUyOTRjM2EuLmQyODgzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgcGFja2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4zLjEyIgorI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuMTUiCiAjZGVmaW5lIExQRkNfRFJJVkVSX05BTUUJCSJscGZjIgogI2RlZmluZSBMUEZDX1NQX0RSSVZFUl9IQU5ETEVSX05BTUUJImxwZmM6c3AiCiAjZGVmaW5lIExQRkNfRlBfRFJJVkVSX0hBTkRMRVJfTkFNRQkibHBmYzpmcCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYwppbmRleCBhYjkxMzU5Li4xNjU1NTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192cG9ydC5jCkBAIC03ODIsNyArNzgyLDcgQEAKIAlpbnQgaTsKIAlpZiAodnBvcnRzID09IE5VTEwpCiAJCXJldHVybjsKLQlmb3IgKGkgPSAwOyB2cG9ydHNbaV0gIT0gTlVMTCAmJiBpIDw9IHBoYmEtPm1heF92cG9ydHM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm1heF92cG9ydHMgJiYgdnBvcnRzW2ldICE9IE5VTEw7IGkrKykKIAkJc2NzaV9ob3N0X3B1dChscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnRzW2ldKSk7CiAJa2ZyZWUodnBvcnRzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oCmluZGV4IGRhZGEwYTEuLjRiMWMyZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaApAQCAtOCw3ICs4LDcgQEAKICAqICAgICAgICAgICAgICAgICAgc2NhdHRlci9nYXRoZXIgZm9ybWF0cy4KICAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSAyMSwgMjAwNgogICoKLSAqICBtcGkyLmggVmVyc2lvbjogIDAyLjAwLjE0CisgKiAgbXBpMi5oIFZlcnNpb246ICAwMi4wMC4xNQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTU3LDYgKzU3LDEwIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNU0kteCBpbmRleCBtYXNrIGFuZCBzaGlmdCBmb3IgUmVwbHkgUG9zdCBIb3N0CiAgKiAgICAgICAgICAgICAgICAgICAgICBJbmRleCByZWdpc3Rlci4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZ1bmN0aW9uIGNvZGUgZm9yIEhvc3QgQmFzZWQgRGlzY292ZXJ5IEFjdGlvbi4KKyAqICAwMi0xMC0xMCAgMDIuMDAuMTUgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBkZWZpbmUgZm9yIE1QSTJfRlVOQ1RJT05fUFdSX01HTVRfQ09OVFJPTC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRlZmluZXMgZm9yIHByb2R1Y3Qtc3BlY2lmaWMgcmFuZ2Ugb2YgbWVzc2FnZQorICogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29kZXMsIDB4RjAgdG8gMHhGRi4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTgyLDcgKzg2LDcgQEAKICNkZWZpbmUgTVBJMl9WRVJTSU9OXzAyXzAwICAgICAgICAgICAgICAgICAgKDB4MDIwMCkKIAogLyogdmVyc2lvbmluZyBmb3IgdGhpcyBNUEkgaGVhZGVyIHNldCAqLwotI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAoMHgwRSkKKyNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgKDB4MEYpCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fREVWICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVRfTUFTSyAgICAgICAoMHhGRjAwKQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVRfU0hJRlQgICAgICAoOCkKQEAgLTQ3Myw4ICs0NzcsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICBNZXNzYWdlIEZ1bmN0aW9ucwotKiAgICAgICAgICAgICAgMHg4MCAtPiAweDhGIHJlc2VydmVkIGZvciBwcml2YXRlIG1lc3NhZ2UgdXNlIHBlciBwcm9kdWN0Ci0qCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNTA2LDYgKzUwOCwxMyBAQAogI2RlZmluZSBNUEkyX0ZVTkNUSU9OX1JBSURfQUNDRUxFUkFUT1IgICAgICAgICAgICAgICgweDJDKSAvKiBSQUlEIEFjY2VsZXJhdG9yKi8KIC8qIEhvc3QgQmFzZWQgRGlzY292ZXJ5IEFjdGlvbiAqLwogI2RlZmluZSBNUEkyX0ZVTkNUSU9OX0hPU1RfQkFTRURfRElTQ09WRVJZX0FDVElPTiAgICgweDJGKQorLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sICovCisjZGVmaW5lIE1QSTJfRlVOQ1RJT05fUFdSX01HTVRfQ09OVFJPTCAgICAgICAgICAgICAgKDB4MzApCisvKiBiZWdpbm5pbmcgb2YgcHJvZHVjdC1zcGVjaWZpYyByYW5nZSAqLworI2RlZmluZSBNUEkyX0ZVTkNUSU9OX01JTl9QUk9EVUNUX1NQRUNJRklDICAgICAgICAgICgweEYwKQorLyogZW5kIG9mIHByb2R1Y3Qtc3BlY2lmaWMgcmFuZ2UgKi8KKyNkZWZpbmUgTVBJMl9GVU5DVElPTl9NQVhfUFJPRFVDVF9TUEVDSUZJQyAgICAgICAgICAoMHhGRikKKwogCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oCmluZGV4IGQ0ZTlkNmYuLmUzNzI4ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2NuZmcuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGFuZCBwYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBOb3ZlbWJlciAxMCwgMjAwNgogICoKLSAqICAgIG1waTJfY25mZy5oIFZlcnNpb246ICAwMi4wMC4xMworICogICAgbXBpMl9jbmZnLmggVmVyc2lvbjogIDAyLjAwLjE0CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTA5LDYgKzEwOSwxOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRXRoZXJuZXQgY29uZmlndXJhdGlvbiBwYWdlcy4KICAqICAxMC0yOC0wOSAgMDIuMDAuMTMgIEFkZGVkIE1QSTJfSU9VTklUUEFHRTFfRU5BQkxFX0hPU1RfQkFTRURfRElTQ09WRVJZLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU0FTIFBIWSBQYWdlIDQgc3RydWN0dXJlIGFuZCBkZWZpbmVzLgorICogIDAyLTEwLTEwICAwMi4wMC4xNCAgTW9kaWZpZWQgdGhlIGNvbW1lbnRzIGZvciB0aGUgY29uZmlndXJhdGlvbiBwYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIHRoYXQgY29udGFpbiBhbiBhcnJheSBvZiBkYXRhLiBUaGUgaG9zdAorICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHVzZSB0aGUgImNvdW50IiBmaWVsZCBpbiB0aGUgcGFnZSBkYXRhIChlLmcuIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgTnVtUGh5cyBmaWVsZCkgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdmFsaWQgZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBhcnJheS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkL21vZGlmaWVkIHNvbWUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUyBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUG93ZXJNYW5hZ2VtZW50Q2FwYWJpbGl0aWVzIHRvIElPIFVuaXQgUGFnZSA3LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUG9ydFdpZHRoTW9kR3JvdXAgZmllbGQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfU0FTX0lPX1VOSVQ1X1BIWV9QTV9TRVRUSU5HUy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzYgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzcgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzggYW5kIHJlbGF0ZWQgZGVmaW5lcy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTM3Myw4ICszODUsOSBAQAogI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjIwOF80ICAgICAgICAgICAgICAgICgweDAwODMpCiAjZGVmaW5lIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMjA4XzUgICAgICAgICAgICAgICAgKDB4MDA4NCkKICNkZWZpbmUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNiAgICAgICAgICAgICAgICAoMHgwMDg1KQotI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjIwOF83ICAgICAgICAgICAgICAgICgweDAwODYpCi0jZGVmaW5lIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMjA4XzggICAgICAgICAgICAgICAgKDB4MDA4NykKKyNkZWZpbmUgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIzMDhfMSAgICAgICAgICAgICAgICAoMHgwMDg2KQorI2RlZmluZSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjMwOF8yICAgICAgICAgICAgICAgICgweDAwODcpCisjZGVmaW5lIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMzA4XzMgICAgICAgICAgICAgICAgKDB4MDA2RSkKIAogCiAvKiBNYW51ZmFjdHVyaW5nIFBhZ2UgMCAqLwpAQCAtNTQwLDcgKzU1Myw3IEBACiAKIC8qCiAgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bwotICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBvciBOdW1QaHlzIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtUGh5cyBhdCBydW50aW1lLgogICovCiAjaWZuZGVmIE1QSTJfTUFOX1BBR0VfNV9QSFlfRU5UUklFUwogI2RlZmluZSBNUEkyX01BTl9QQUdFXzVfUEhZX0VOVFJJRVMgICAgICAgICAoMSkKQEAgLTYxOCw3ICs2MzEsNyBAQAogCiAvKgogICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KLSAqIG9uZSBhbmQgY2hlY2sgTnVtUGh5cyBhdCBydW50aW1lLgorICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bVBoeXMgYXQgcnVudGltZS4KICAqLwogI2lmbmRlZiBNUEkyX01BTlBBR0U3X0NPTk5FQ1RPUl9JTkZPX01BWAogI2RlZmluZSBNUEkyX01BTlBBR0U3X0NPTk5FQ1RPUl9JTkZPX01BWCAgKDEpCkBAIC03MzEsNyArNzQ0LDcgQEAKIAogLyoKICAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCi0gKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5QYWdlTGVuZ3RoIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgR1BJT0NvdW50IGF0IHJ1bnRpbWUuCiAgKi8KICNpZm5kZWYgTVBJMl9JT19VTklUX1BBR0VfM19HUElPX1ZBTF9NQVgKICNkZWZpbmUgTVBJMl9JT19VTklUX1BBR0VfM19HUElPX1ZBTF9NQVggICAgKDEpCkBAIC03NjAsNyArNzczLDcgQEAKIAogLyoKICAqIFVwcGVyIGxheWVyIGNvZGUgKGRyaXZlcnMsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bwotICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBvciBOdW1EbWFFbmdpbmVzIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtRG1hRW5naW5lcyBhdCBydW50aW1lLgogICovCiAjaWZuZGVmIE1QSTJfSU9VTklUUEFHRTVfRE1BRU5HSU5FX0VOVFJJRVMKICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFNV9ETUFFTkdJTkVfRU5UUklFUyAgICAgICgxKQpAQCAtODIzLDcgKzgzNiw3IEBACiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgUENJZVdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQQ0llU3BlZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NvclN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDA4ICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEMgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZW1lbnRDYXBhYmlsaXRpZXM7ICAgICAgICAgICAgLyogMHgwQyAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1RlbXBlcmF0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDEwICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgSU9DVGVtcGVyYXR1cmVVbml0czsgICAgICAgICAgICAgICAgICAgIC8qIDB4MTIgKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJT0NTcGVlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgxMyAqLwpAQCAtODMxLDcgKzg0NCw3IEBACiB9IE1QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF83LCBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF83LAogICBNcGkySU9Vbml0UGFnZTdfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0UGFnZTdfdDsKIAotI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDEpCiAKIC8qIGRlZmluZXMgZm9yIElPIFVuaXQgUGFnZSA3IFBDSWVXaWR0aCBmaWVsZCAqLwogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X1BDSUVfV0lEVEhfWDEgICAgICAgICAgICAgICgweDAxKQpAQCAtODUyLDYgKzg2NSwxNCBAQAogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X1BTVEFURV9ESVNBQkxFRCAgICAgICAgICAgICgweDAxKQogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X1BTVEFURV9FTkFCTEVEICAgICAgICAgICAgICgweDAyKQogCisvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgNyBQb3dlck1hbmFnZW1lbnRDYXBhYmlsaXRpZXMgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QTUNBUF8xMl81X1BDVF9JT0NTUEVFRCAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QTUNBUF8yNV8wX1BDVF9JT0NTUEVFRCAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QTUNBUF81MF8wX1BDVF9JT0NTUEVFRCAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QTUNBUF9QQ0lFX1dJRFRIX0NIQU5HRSAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QTUNBUF9QQ0lFX1NQRUVEX0NIQU5HRSAgICAoMHgwMDAwMDAwNCkKKworCiAvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgNyBJT0NUZW1wZXJhdHVyZVVuaXRzIGZpZWxkICovCiAjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfSU9DX1RFTVBfTk9UX1BSRVNFTlQgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfSU9DX1RFTVBfRkFIUkVOSEVJVCAgICAgICAgKDB4MDEpCkBAIC0xMTk1LDcgKzEyMTYsNyBAQAogCiAvKgogICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KLSAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggb3IgTnVtUGh5cyBhdCBydW50aW1lLgorICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bVBoeXMgYXQgcnVudGltZS4KICAqLwogI2lmbmRlZiBNUEkyX0JJT1NfUEFHRV80X1BIWV9FTlRSSUVTCiAjZGVmaW5lIE1QSTJfQklPU19QQUdFXzRfUEhZX0VOVFJJRVMgICAgICAgICgxKQpAQCAtMTI2OSw3ICsxMjkwLDcgQEAKIAogLyoKICAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCi0gKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5QYWdlTGVuZ3RoIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtUGh5c0Rpc2tzIGF0IHJ1bnRpbWUuCiAgKi8KICNpZm5kZWYgTVBJMl9SQUlEX1ZPTF9QQUdFXzBfUEhZU0RJU0tfTUFYCiAjZGVmaW5lIE1QSTJfUkFJRF9WT0xfUEFHRV8wX1BIWVNESVNLX01BWCAgICAgICAoMSkKQEAgLTE0NzEsNyArMTQ5Miw3IEBACiAKIC8qCiAgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bwotICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBvciBOdW1QaHlzRGlza1BhdGhzIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtUGh5c0Rpc2tQYXRocyBhdCBydW50aW1lLgogICovCiAjaWZuZGVmIE1QSTJfUkFJRF9QSFlTX0RJU0sxX1BBVEhfTUFYCiAjZGVmaW5lIE1QSTJfUkFJRF9QSFlTX0RJU0sxX1BBVEhfTUFYICAgKDEpCkBAIC0xNjMzLDcgKzE2NTQsNyBAQAogCiAvKgogICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KLSAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLkV4dFBhZ2VMZW5ndGggb3IgTnVtUGh5cyBhdCBydW50aW1lLgorICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bVBoeXMgYXQgcnVudGltZS4KICAqLwogI2lmbmRlZiBNUEkyX1NBU19JT1VOSVQwX1BIWV9NQVgKICNkZWZpbmUgTVBJMl9TQVNfSU9VTklUMF9QSFlfTUFYICAgICAgICAoMSkKQEAgLTE3MDQsNyArMTcyNSw3IEBACiAKIC8qCiAgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bwotICogb25lIGFuZCBjaGVjayBIZWFkZXIuRXh0UGFnZUxlbmd0aCBvciBOdW1QaHlzIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtUGh5cyBhdCBydW50aW1lLgogICovCiAjaWZuZGVmIE1QSTJfU0FTX0lPVU5JVDFfUEhZX01BWAogI2RlZmluZSBNUEkyX1NBU19JT1VOSVQxX1BIWV9NQVggICAgICAgICgxKQpAQCAtMTc5NSw3ICsxODE2LDcgQEAKIAogLyoKICAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCi0gKiBmb3VyIGFuZCBjaGVjayBIZWFkZXIuRXh0UGFnZUxlbmd0aCBvciBOdW1QaHlzIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtUGh5cyBhdCBydW50aW1lLgogICovCiAjaWZuZGVmIE1QSTJfU0FTX0lPVU5JVDRfUEhZX01BWAogI2RlZmluZSBNUEkyX1NBU19JT1VOSVQ0X1BIWV9NQVggICAgICAgICg0KQpAQCAtMTgzMyw3ICsxODU0LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgX01QSTJfU0FTX0lPX1VOSVQ1X1BIWV9QTV9TRVRUSU5HUyB7CiAgICAgVTggICAgICAgICAgQ29udHJvbEZsYWdzOyAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KLSAgICBVOCAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgIFBvcnRXaWR0aE1vZEdyb3VwOyAgICAgICAgICAvKiAweDAxICovCiAgICAgVTE2ICAgICAgICAgSW5hY3Rpdml0eVRpbWVyRXhwb25lbnQ7ICAgIC8qIDB4MDIgKi8KICAgICBVOCAgICAgICAgICBTQVRBUGFydGlhbFRpbWVvdXQ7ICAgICAgICAgLyogMHgwNCAqLwogICAgIFU4ICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA1ICovCkBAIC0xODUzLDYgKzE4NzQsOSBAQAogI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfQ09OVFJPTF9TQVRBX1NMVU1CRVJfRU5BQkxFICAgICAoMHgwMikKICNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0NPTlRST0xfU0FUQV9QQVJUSUFMX0VOQUJMRSAgICAgKDB4MDEpCiAKKy8qIGRlZmluZXMgZm9yIFBvcnRXaWR0aE1vZGVHcm91cCBmaWVsZCAqLworI2RlZmluZSBNUEkyX1NBU0lPVU5JVDVfUFdNR19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAoMHhGRikKKwogLyogZGVmaW5lcyBmb3IgSW5hY3Rpdml0eVRpbWVyRXhwb25lbnQgZmllbGQgKi8KICNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9NQVNLX1NBU19TTFVNQkVSICAgICAgICAgICAgKDB4NzAwMCkKICNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ1X0lURV9TSElGVF9TQVNfU0xVTUJFUiAgICAgICAgICAgKDEyKQpAQCAtMTg3NCw3ICsxODk4LDcgQEAKIAogLyoKICAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCi0gKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5FeHRQYWdlTGVuZ3RoIG9yIE51bVBoeXMgYXQgcnVudGltZS4KKyAqIG9uZSBhbmQgY2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGZvciBOdW1QaHlzIGF0IHJ1bnRpbWUuCiAgKi8KICNpZm5kZWYgTVBJMl9TQVNfSU9VTklUNV9QSFlfTUFYCiAjZGVmaW5lIE1QSTJfU0FTX0lPVU5JVDVfUEhZX01BWCAgICAgICAgKDEpCkBAIC0xODkyLDcgKzE5MTYsMTMyIEBACiAgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9TQVNJT1VOSVRfNSwKICAgTXBpMlNhc0lPVW5pdFBhZ2U1X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlNhc0lPVW5pdFBhZ2U1X3Q7CiAKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVRQQUdFNV9QQUdFVkVSU0lPTiAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUUEFHRTVfUEFHRVZFUlNJT04gICAgICgweDAxKQorCisKKy8qIFNBUyBJTyBVbml0IFBhZ2UgNiAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQVNfSU9fVU5JVDZfUE9SVF9XSURUSF9NT0RfR1JPVVBfU1RBVFVTIHsKKyAgICBVOCAgICAgICAgICBDdXJyZW50U3RhdHVzOyAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgIEN1cnJlbnRNb2R1bGF0aW9uOyAgICAgICAgICAvKiAweDAxICovCisgICAgVTggICAgICAgICAgQ3VycmVudFV0aWxpemF0aW9uOyAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVOCAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworICAgIFUzMiAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCit9IE1QSTJfU0FTX0lPX1VOSVQ2X1BPUlRfV0lEVEhfTU9EX0dST1VQX1NUQVRVUywKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NBU19JT19VTklUNl9QT1JUX1dJRFRIX01PRF9HUk9VUF9TVEFUVVMsCisgIE1waTJTYXNJT1VuaXQ2UG9ydFdpZHRoTW9kR3JvdXBTdGF0dXNfdCwKKyAgTVBJMl9QT0lOVEVSIHBNcGkyU2FzSU9Vbml0NlBvcnRXaWR0aE1vZEdyb3VwU3RhdHVzX3Q7CisKKy8qIGRlZmluZXMgZm9yIEN1cnJlbnRTdGF0dXMgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19VTkFWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19JTlZBTElEX0NPTkZJRyAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19PQlNFUlZBVElPTl9PTkxZICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19BQ1RJVkVfSU9VTklUICAgICAgICAgICAgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X1NUQVRVU19BQ1RJVkVfSE9TVCAgICAgICAgICAgICAgICAgICAgICAoMHgwNykKKworLyogZGVmaW5lcyBmb3IgQ3VycmVudE1vZHVsYXRpb24gZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X01PRFVMQVRJT05fMjVfUEVSQ0VOVCAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X01PRFVMQVRJT05fNTBfUEVSQ0VOVCAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X01PRFVMQVRJT05fNzVfUEVSQ0VOVCAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ2X01PRFVMQVRJT05fMTAwX1BFUkNFTlQgICAgICAgICAgICAgICAgICAoMHgwMykKKworLyoKKyAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtR3JvdXBzIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJMl9TQVNfSU9VTklUNl9HUk9VUF9NQVgKKyNkZWZpbmUgTVBJMl9TQVNfSU9VTklUNl9HUk9VUF9NQVggICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9DT05GSUdfUEFHRV9TQVNJT1VOSVRfNiB7CisgICAgTVBJMl9DT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtR3JvdXBzOyAgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMHgxMSAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAvKiAweDEyICovCisgICAgTVBJMl9TQVNfSU9fVU5JVDZfUE9SVF9XSURUSF9NT0RfR1JPVVBfU1RBVFVTCisJUG9ydFdpZHRoTW9kdWxhdGlvbkdyb3VwU3RhdHVzW01QSTJfU0FTX0lPVU5JVDZfR1JPVVBfTUFYXTsgLyogMHgxNCAqLworfSBNUEkyX0NPTkZJR19QQUdFX1NBU0lPVU5JVF82LAorICBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzYsCisgIE1waTJTYXNJT1VuaXRQYWdlNl90LCBNUEkyX1BPSU5URVIgcE1waTJTYXNJT1VuaXRQYWdlNl90OworCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUUEFHRTZfUEFHRVZFUlNJT04gICAgICgweDAwKQorCisKKy8qIFNBUyBJTyBVbml0IFBhZ2UgNyAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQVNfSU9fVU5JVDdfUE9SVF9XSURUSF9NT0RfR1JPVVBfU0VUVElOR1MgeworICAgIFU4ICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCisgICAgVTggICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVMTYgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLworICAgIFU4ICAgICAgICAgIFRocmVzaG9sZDc1UGN0OyAgICAgICAgICAgICAvKiAweDA0ICovCisgICAgVTggICAgICAgICAgVGhyZXNob2xkNTBQY3Q7ICAgICAgICAgICAgIC8qIDB4MDUgKi8KKyAgICBVOCAgICAgICAgICBUaHJlc2hvbGQyNVBjdDsgICAgICAgICAgICAgLyogMHgwNiAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAweDA3ICovCit9IE1QSTJfU0FTX0lPX1VOSVQ3X1BPUlRfV0lEVEhfTU9EX0dST1VQX1NFVFRJTkdTLAorICBNUEkyX1BPSU5URVIgUFRSX01QSTJfU0FTX0lPX1VOSVQ3X1BPUlRfV0lEVEhfTU9EX0dST1VQX1NFVFRJTkdTLAorICBNcGkyU2FzSU9Vbml0N1BvcnRXaWR0aE1vZEdyb3VwU2V0dGluZ3NfdCwKKyAgTVBJMl9QT0lOVEVSIHBNcGkyU2FzSU9Vbml0N1BvcnRXaWR0aE1vZEdyb3VwU2V0dGluZ3NfdDsKKworLyogZGVmaW5lcyBmb3IgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ3X0ZMQUdTX0VOQUJMRV9QT1JUX1dJRFRIX01PRFVMQVRJT04gICgweDAxKQorCisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bUdyb3VwcyBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSTJfU0FTX0lPVU5JVDdfR1JPVVBfTUFYCisjZGVmaW5lIE1QSTJfU0FTX0lPVU5JVDdfR1JPVVBfTUFYICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzcgeworICAgIE1QSTJfQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSICAgICAgICAgICAgSGVhZGVyOyAgICAgICAgICAgICAvKiAweDAwICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ0ludGVydmFsOyAgIC8qIDB4MDggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd0xlbmd0aDsgICAgICAgLyogMHgwOSAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAweDBBICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDB4MEMgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMHgxMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtR3JvdXBzOyAgICAgICAgICAvKiAweDE0ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDB4MTUgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgLyogMHgxNiAqLworICAgIE1QSTJfU0FTX0lPX1VOSVQ3X1BPUlRfV0lEVEhfTU9EX0dST1VQX1NFVFRJTkdTCisJUG9ydFdpZHRoTW9kdWxhdGlvbkdyb3VwU2V0dGluZ3NbTVBJMl9TQVNfSU9VTklUN19HUk9VUF9NQVhdOyAvKiAweDE4ICovCit9IE1QSTJfQ09ORklHX1BBR0VfU0FTSU9VTklUXzcsCisgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9TQVNJT1VOSVRfNywKKyAgTXBpMlNhc0lPVW5pdFBhZ2U3X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlNhc0lPVW5pdFBhZ2U3X3Q7CisKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVRQQUdFN19QQUdFVkVSU0lPTiAgICAgKDB4MDApCisKKworLyogU0FTIElPIFVuaXQgUGFnZSA4ICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX1NBU0lPVU5JVF84IHsKKyAgICBNUEkyX0NPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICBIZWFkZXI7CQkJLyogMHgwMCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsJCS8qIDB4MDggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZW1lbnRDYXBhYmlsaXRpZXM7LyogMHgwQyAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsJCS8qIDB4MTAgKi8KK30gTVBJMl9DT05GSUdfUEFHRV9TQVNJT1VOSVRfOCwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX1NBU0lPVU5JVF84LAorICBNcGkyU2FzSU9Vbml0UGFnZThfdCwgTVBJMl9QT0lOVEVSIHBNcGkyU2FzSU9Vbml0UGFnZThfdDsKKworI2RlZmluZSBNUEkyX1NBU0lPVU5JVFBBR0U4X1BBR0VWRVJTSU9OICAgICAoMHgwMCkKKworLyogZGVmaW5lcyBmb3IgUG93ZXJNYW5hZ2VtZW50Q2FwYWJpbGl0aWVzIGZpZWxkICovCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1BPUlRfV0lEVEhfTU9EICAgICAgICAgICgweDAwMDAwMTAwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FTX1NMVU1CRVJfTU9ERSAgICAgICAgKDB4MDAwMDAwODAwKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9TQVNfUEFSVElBTF9NT0RFICAgICAgICAoMHgwMDAwMDA0MDApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBVEFfU0xVTUJFUl9NT0RFICAgICAgICgweDAwMDAwMDIwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FUQV9QQVJUSUFMX01PREUgICAgICAgKDB4MDAwMDAwMTAwKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1BPUlRfV0lEVEhfTU9EICAgICAgICAoMHgwMDAwMDAwMTApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FTX1NMVU1CRVJfTU9ERSAgICAgICgweDAwMDAwMDAwOCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9TQVNfUEFSVElBTF9NT0RFICAgICAgKDB4MDAwMDAwMDA0KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1NBVEFfU0xVTUJFUl9NT0RFICAgICAoMHgwMDAwMDAwMDIpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FUQV9QQVJUSUFMX01PREUgICAgICgweDAwMDAwMDAwMSkKIAogCiAKQEAgLTIxODIsNyArMjMzMSw3IEBACiAKIC8qCiAgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bwotICogb25lIGFuZCBjaGVjayBIZWFkZXIuRXh0UGFnZUxlbmd0aCBvciBOdW1QaHlFdmVudHMgYXQgcnVudGltZS4KKyAqIG9uZSBhbmQgY2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGZvciBOdW1QaHlFdmVudHMgYXQgcnVudGltZS4KICAqLwogI2lmbmRlZiBNUEkyX1NBU1BIWTJfUEhZX0VWRU5UX01BWAogI2RlZmluZSBNUEkyX1NBU1BIWTJfUEhZX0VWRU5UX01BWCAgICAgICgxKQpAQCAtMjI3NCw3ICsyNDIzLDcgQEAKIAogLyoKICAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCi0gKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5FeHRQYWdlTGVuZ3RoIG9yIE51bVBoeUV2ZW50cyBhdCBydW50aW1lLgorICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bVBoeUV2ZW50cyBhdCBydW50aW1lLgogICovCiAjaWZuZGVmIE1QSTJfU0FTUEhZM19QSFlfRVZFTlRfTUFYCiAjZGVmaW5lIE1QSTJfU0FTUEhZM19QSFlfRVZFTlRfTUFYICAgICAgKDEpCkBAIC0yMzg1LDcgKzI1MzQsNyBAQAogCiAvKgogICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KLSAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLkV4dFBhZ2VMZW5ndGggb3IgTnVtUGh5cyBhdCBydW50aW1lLgorICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bUxvZ0VudHJpZXMgYXQgcnVudGltZS4KICAqLwogI2lmbmRlZiBNUEkyX0xPR18wX05VTV9MT0dfRU5UUklFUwogI2RlZmluZSBNUEkyX0xPR18wX05VTV9MT0dfRU5UUklFUyAgICAgICAgICAoMSkKQEAgLTI0MzUsNyArMjU4NCw3IEBACiAKIC8qCiAgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bwotICogb25lIGFuZCBjaGVjayBIZWFkZXIuRXh0UGFnZUxlbmd0aCBvciBOdW1QaHlzIGF0IHJ1bnRpbWUuCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtRWxlbWVudHMgYXQgcnVudGltZS4KICAqLwogI2lmbmRlZiBNUEkyX1JBSURDT05GSUcwX01BWF9FTEVNRU5UUwogI2RlZmluZSBNUEkyX1JBSURDT05GSUcwX01BWF9FTEVNRU5UUyAgICAgICAoMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2luaXQuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2luaXQuaAppbmRleCAyMjBiZjY1Li5jNGM5OWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9pbml0LmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW5pdC5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgU0NTSSBpbml0aWF0b3IgbW9kZSBtZXNzYWdlcyBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDIzLCAyMDA2CiAgKgotICogICAgbXBpMl9pbml0LmggVmVyc2lvbjogIDAyLjAwLjA4CisgKiAgICBtcGkyX2luaXQuaCBWZXJzaW9uOiAgMDIuMDAuMDkKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0zMSw2ICszMSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBib3RoIFNDU0kgSU8gRXJyb3IgUmVwbHkgYW5kIFNDU0kgVGFzayBNYW5hZ2VtZW50IFJlcGx5LgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUmVzcG9uc2VJbmZvIGZpZWxkIHRvIE1QSTJfU0NTSV9UQVNLX01BTkFHRV9SRVBMWS4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfU0NTSVRBU0tNR01UX1JTUF9UTV9PVkVSTEFQUEVEX1RBRyBkZWZpbmUuCisgKiAgMDItMTAtMTAgIDAyLjAwLjA5ICBSZW1vdmVkIHVudXNlZCBzdHJ1Y3R1cmUgdGhhdCBoYWQgIiNpZiAwIiBhcm91bmQgaXQuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC01NywyMCArNTgsNiBAQAogfSBNUEkyX1NDU0lfSU9fQ0RCX0VFRFAzMiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NDU0lfSU9fQ0RCX0VFRFAzMiwKICAgTXBpMlNjc2lJb0NkYkVlZHAzMl90LCBNUEkyX1BPSU5URVIgcE1waTJTY3NpSW9DZGJFZWRwMzJfdDsKIAotLyogVEJEOiBJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVlZGVkIGZvciBNUEkyL0dlbjIgKi8KLSNpZiAwCi10eXBlZGVmIHN0cnVjdAotewotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENEQlsxNl07ICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5UmVmZXJlbmNlVGFnOyAgICAgICAgLyogMHgxNCAqLwotICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlBcHBsaWNhdGlvblRhZzsgICAgICAvKiAweDE4ICovCi0gICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUFwcGxpY2F0aW9uVGFnTWFzazsgIC8qIDB4MUEgKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zlckxlbmd0aDsgICAgICAgICAgICAgLyogMHgxQyAqLwotfSBNUEkyX1NDU0lfSU8zMl9DREJfRUVEUDE2LCBNUEkyX1BPSU5URVIgUFRSX01QSTJfU0NTSV9JTzMyX0NEQl9FRURQMTYsCi0gIE1waTJTY3NpSW8zMkNkYkVlZHAxNl90LCBNUEkyX1BPSU5URVIgcE1waTJTY3NpSW8zMkNkYkVlZHAxNl90OwotI2VuZGlmCi0KIHR5cGVkZWYgdW5pb24KIHsKICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDREIzMlszMl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9pb2MuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCmluZGV4IGYxOGYxMTQuLjQ5NWJlZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgT2N0b2JlciAxMSwgMjAwNgogICoKLSAqICBtcGkyX2lvYy5oIFZlcnNpb246ICAwMi4wMC4xMworICogIG1waTJfaW9jLmggVmVyc2lvbjogIDAyLjAwLjE0CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtOTgsNiArOTgsOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgKE1QSTJfRldfSEVBREVSX1BJRF8pLgogICogICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZWQgdmFsdWVzIGZvciBTQVMgUHJvZHVjdElEIEZhbWlseQogICogICAgICAgICAgICAgICAgICAgICAgKE1QSTJfRldfSEVBREVSX1BJRF9GQU1JTFlfKS4KKyAqICAwMi0xMC0xMCAgMDIuMDAuMTQgIEFkZGVkIFNBUyBRdWllc2NlIEV2ZW50IHN0cnVjdHVyZSBhbmQgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFBvd2VyTWFuYWdlbWVudENvbnRyb2wgUmVxdWVzdCBzdHJ1Y3R1cmVzIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lcy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTQ2OSw2ICs0NzIsNyBAQAogI2RlZmluZSBNUEkyX0VWRU5UX1NBU19QSFlfQ09VTlRFUiAgICAgICAgICAgICAgICAgICgweDAwMjIpCiAjZGVmaW5lIE1QSTJfRVZFTlRfR1BJT19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgKDB4MDAyMykKICNkZWZpbmUgTVBJMl9FVkVOVF9IT1NUX0JBU0VEX0RJU0NPVkVSWV9QSFkgICAgICAgICAoMHgwMDI0KQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19RVUlFU0NFICAgICAgICAgICAgICAgICAgICAgICgweDAwMjUpCiAKIAogLyogTG9nIEVudHJ5IEFkZGVkIEV2ZW50IGRhdGEgKi8KQEAgLTg5NSw2ICs4OTksMjIgQEAKICAqICovCiAKIAorLyogU0FTIFF1aWVzY2UgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9FVkVOVF9EQVRBX1NBU19RVUlFU0NFIHsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZWFzb25Db2RlOyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworfSBNUEkyX0VWRU5UX0RBVEFfU0FTX1FVSUVTQ0UsCisgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVkVOVF9EQVRBX1NBU19RVUlFU0NFLAorICBNcGkyRXZlbnREYXRhU2FzUXVpZXNjZV90LCBNUEkyX1BPSU5URVIgcE1waTJFdmVudERhdGFTYXNRdWllc2NlX3Q7CisKKy8qIFNBUyBRdWllc2NlIEV2ZW50IGRhdGEgUmVhc29uQ29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfUVVJRVNDRV9SQ19TVEFSVEVEICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19RVUlFU0NFX1JDX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgKDB4MDIpCisKKwogLyogSG9zdCBCYXNlZCBEaXNjb3ZlcnkgUGh5IEV2ZW50IGRhdGEgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX01QSTJfRVZFTlRfSEJEX1BIWV9TQVMgewpAQCAtMTAwNiw2ICsxMDI2LDcgQEAKICNkZWZpbmUgTVBJMl9GV19ET1dOTE9BRF9JVFlQRV9DT05GSUdfMSAgICAgICAgICAgICAoMHgwNykKICNkZWZpbmUgTVBJMl9GV19ET1dOTE9BRF9JVFlQRV9DT05GSUdfMiAgICAgICAgICAgICAoMHgwOCkKICNkZWZpbmUgTVBJMl9GV19ET1dOTE9BRF9JVFlQRV9NRUdBUkFJRCAgICAgICAgICAgICAoMHgwOSkKKyNkZWZpbmUgTVBJMl9GV19ET1dOTE9BRF9JVFlQRV9DT01QTEVURSAgICAgICAgICAgICAoMHgwQSkKICNkZWZpbmUgTVBJMl9GV19ET1dOTE9BRF9JVFlQRV9DT01NT05fQk9PVF9CTE9DSyAgICAoMHgwQikKIAogLyogRldEb3dubG9hZCBUcmFuc2FjdGlvbkNvbnRleHQgRWxlbWVudCAqLwpAQCAtMTE4Myw3ICsxMjA0LDYgQEAKIAogI2RlZmluZSBNUEkyX0ZXX0hFQURFUl9QSURfUFJPRF9NQVNLICAgICAgICAgICAgICAgICAgICAoMHgwRjAwKQogI2RlZmluZSBNUEkyX0ZXX0hFQURFUl9QSURfUFJPRF9BICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwKQotI2RlZmluZSBNUEkyX0ZXX0hFQURFUl9QSURfUFJPRF9NQVNLICAgICAgICAgICAgICAgICAgICAoMHgwRjAwKQogI2RlZmluZSBNUEkyX0ZXX0hFQURFUl9QSURfUFJPRF9UQVJHRVRfSU5JVElBVE9SX1NDU0kgICAoMHgwMjAwKQogI2RlZmluZSBNUEkyX0ZXX0hFQURFUl9QSURfUFJPRF9JUl9TQ1NJICAgICAgICAgICAgICAgICAoMHgwNzAwKQogCkBAIC0xNDA3LDUgKzE0MjcsMTAwIEBACiAjZGVmaW5lIE1QSTJfSU5JVF9JTUFHRV9SRVNFVFZFQ1RPUl9PRkZTRVQgICAgICAoMHgxNCkKIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgUG93ZXJNYW5hZ2VtZW50Q29udHJvbCBtZXNzYWdlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQb3dlck1hbmFnZW1lbnRDb250cm9sIFJlcXVlc3QgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfUFdSX01HTVRfQ09OVFJPTF9SRVFVRVNUIHsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlOyAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZQX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMHgwQSAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcjE7ICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyMjsgICAgICAgICAgICAgICAgIC8qIDB4MEQgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIzOyAgICAgICAgICAgICAgICAgLyogMHgwRSAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcjQ7ICAgICAgICAgICAgICAgICAvKiAweDBGICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgICAgICAgICAgLyogMHgxNCAqLworfSBNUEkyX1BXUl9NR01UX0NPTlRST0xfUkVRVUVTVCwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1BXUl9NR01UX0NPTlRST0xfUkVRVUVTVCwKKyAgTXBpMlB3ck1nbXRDb250cm9sUmVxdWVzdF90LCBNUEkyX1BPSU5URVIgcE1waTJQd3JNZ210Q29udHJvbFJlcXVlc3RfdDsKKworLyogZGVmaW5lcyBmb3IgdGhlIEZlYXR1cmUgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX0ZFQVRVUkVfREFfUEhZX1BPV0VSX0NPTkQgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9GRUFUVVJFX1BPUlRfV0lEVEhfTU9EVUxBVElPTiAgICgweDAyKQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfRkVBVFVSRV9QQ0lFX0xJTksgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX0ZFQVRVUkVfSU9DX1NQRUVEICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9GRUFUVVJFX01JTl9QUk9EVUNUX1NQRUNJRklDICAgICgweDgwKQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfRkVBVFVSRV9NQVhfUFJPRFVDVF9TUEVDSUZJQyAgICAoMHhGRikKKworLyogcGFyYW1ldGVyIHVzYWdlIGZvciB0aGUgTVBJMl9QTV9DT05UUk9MX0ZFQVRVUkVfREFfUEhZX1BPV0VSX0NPTkQgRmVhdHVyZSAqLworLyogUGFyYW1ldGVyMSBjb250YWlucyBhIFBIWSBudW1iZXIgKi8KKy8qIFBhcmFtZXRlcjIgaW5kaWNhdGVzIHBvd2VyIGNvbmRpdGlvbiBhY3Rpb24gdXNpbmcgdGhlc2UgZGVmaW5lcyAqLworI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0yX1BBUlRJQUwgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNMl9TTFVNQkVSICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9QQVJBTTJfRVhJVF9QV1JfTUdNVCAgICAgICAgICAgICgweDAzKQorLyogUGFyYW1ldGVyMyBhbmQgUGFyYW1ldGVyNCBhcmUgcmVzZXJ2ZWQgKi8KKworLyogcGFyYW1ldGVyIHVzYWdlIGZvciB0aGUgTVBJMl9QTV9DT05UUk9MX0ZFQVRVUkVfUE9SVF9XSURUSF9NT0RVTEFUSU9OCisgKiAgRmVhdHVyZSAqLworLyogUGFyYW1ldGVyMSBjb250YWlucyBTQVMgcG9ydCB3aWR0aCBtb2R1bGF0aW9uIGdyb3VwIG51bWJlciAqLworLyogUGFyYW1ldGVyMiBpbmRpY2F0ZXMgSU9DIGFjdGlvbiB1c2luZyB0aGVzZSBkZWZpbmVzICovCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9QQVJBTTJfUkVRVUVTVF9PV05FUlNISVAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0yX0NIQU5HRV9NT0RVTEFUSU9OICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNMl9SRUxJTlFVSVNIX09XTkVSU0hJUCAgICAgKDB4MDMpCisvKiBQYXJhbWV0ZXIzIGluZGljYXRlcyBkZXNpcmVkIG1vZHVsYXRpb24gbGV2ZWwgdXNpbmcgdGhlc2UgZGVmaW5lcyAqLworI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0zXzI1X1BFUkNFTlQgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNM181MF9QRVJDRU5UICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9QQVJBTTNfNzVfUEVSQ0VOVCAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0zXzEwMF9QRVJDRU5UICAgICAgICAgICAgICAoMHgwMykKKy8qIFBhcmFtZXRlcjQgaXMgcmVzZXJ2ZWQgKi8KKworLyogcGFyYW1ldGVyIHVzYWdlIGZvciB0aGUgTVBJMl9QTV9DT05UUk9MX0ZFQVRVUkVfUENJRV9MSU5LIEZlYXR1cmUgKi8KKy8qIFBhcmFtZXRlcjEgaW5kaWNhdGVzIGRlc2lyZWQgUENJZSBsaW5rIHNwZWVkIHVzaW5nIHRoZXNlIGRlZmluZXMgKi8KKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNMV9QQ0lFXzJfNV9HQlBTICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9QQVJBTTFfUENJRV81XzBfR0JQUyAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0xX1BDSUVfOF8wX0dCUFMgICAgICAgICAgICAoMHgwMikKKy8qIFBhcmFtZXRlcjIgaW5kaWNhdGVzIGRlc2lyZWQgUENJZSBsaW5rIHdpZHRoIHVzaW5nIHRoZXNlIGRlZmluZXMgKi8KKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNMl9XSURUSF9YMSAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9QQVJBTTJfV0lEVEhfWDIgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0yX1dJRFRIX1g0ICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNMl9XSURUSF9YOCAgICAgICAgICAgICAgICAgKDB4MDgpCisvKiBQYXJhbWV0ZXIzIGFuZCBQYXJhbWV0ZXI0IGFyZSByZXNlcnZlZCAqLworCisvKiBwYXJhbWV0ZXIgdXNhZ2UgZm9yIHRoZSBNUEkyX1BNX0NPTlRST0xfRkVBVFVSRV9JT0NfU1BFRUQgRmVhdHVyZSAqLworLyogUGFyYW1ldGVyMSBpbmRpY2F0ZXMgZGVzaXJlZCBJT0MgaGFyZHdhcmUgY2xvY2sgc3BlZWQgdXNpbmcgdGhlc2UgZGVmaW5lcyAqLworI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0xX0ZVTExfSU9DX1NQRUVEICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9QTV9DT05UUk9MX1BBUkFNMV9IQUxGX0lPQ19TUEVFRCAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSTJfUE1fQ09OVFJPTF9QQVJBTTFfUVVBUlRFUl9JT0NfU1BFRUQgICAgICAgICgweDA0KQorI2RlZmluZSBNUEkyX1BNX0NPTlRST0xfUEFSQU0xX0VJR0hUSF9JT0NfU1BFRUQgICAgICAgICAoMHgwOCkKKy8qIFBhcmFtZXRlcjIsIFBhcmFtZXRlcjMsIGFuZCBQYXJhbWV0ZXI0IGFyZSByZXNlcnZlZCAqLworCisKKy8qIFBvd2VyTWFuYWdlbWVudENvbnRyb2wgUmVwbHkgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfUFdSX01HTVRfQ09OVFJPTF9SRVBMWSB7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZTsgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAweDAyICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDB4MDMgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAweDA2ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDB4MDcgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWUF9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZGX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA5ICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgICAgIC8qIDB4MEEgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAweDBFICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KK30gTVBJMl9QV1JfTUdNVF9DT05UUk9MX1JFUExZLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfUFdSX01HTVRfQ09OVFJPTF9SRVBMWSwKKyAgTXBpMlB3ck1nbXRDb250cm9sUmVwbHlfdCwgTVBJMl9QT0lOVEVSIHBNcGkyUHdyTWdtdENvbnRyb2xSZXBseV90OworCisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jCmluZGV4IDBlYzFlZDMuLjU3YmNkNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jCkBAIC05NSw2ICs5NSwxMCBAQAogTU9EVUxFX1BBUk1fREVTQyhtcHQyc2FzX2Z3ZmF1bHRfZGVidWcsICIgZW5hYmxlIGRldGVjdGlvbiBvZiBmaXJtd2FyZSBmYXVsdCAiCiAgICAgImFuZCBoYWx0IGZpcm13YXJlIC0gKGRlZmF1bHQ9MCkiKTsKIAorc3RhdGljIGludCBkaXNhYmxlX2Rpc2NvdmVyeSA9IC0xOworbW9kdWxlX3BhcmFtKGRpc2FibGVfZGlzY292ZXJ5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2Rpc2NvdmVyeSwgIiBkaXNhYmxlIGRpc2NvdmVyeSAiKTsKKwogLyoqCiAgKiBfc2NzaWhfc2V0X2Z3ZmF1bHRfZGVidWcgLSBnbG9iYWwgc2V0dGluZyBvZiBpb2MtPmZ3ZmF1bHRfZGVidWcuCiAgKgpAQCAtMTIzOCw3ICsxMjQyLDcgQEAKIAl1NjQgcGlvX2NoaXAgPSAwOwogCXU2NCBjaGlwX3BoeXMgPSAwOwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLAogCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CiAKIAlpb2MtPmJhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pOwpAQCAtMTMwNyw2ICsxMzExLDkgQEAKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiaW9wb3J0KDB4JTAxNmxseCksIHNpemUoJWQpXG4iLAogCSAgICBpb2MtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpcGlvX2NoaXAsIHBpb19zeik7CiAKKwkvKiBTYXZlIFBDSSBjb25maWd1cmF0aW9uIHN0YXRlIGZvciByZWNvdmVyeSBmcm9tIFBDSSBBRVIvRUVIIGVycm9ycyAqLworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCiAJcmV0dXJuIDA7CiAKICBvdXRfZmFpbDoKQEAgLTE4NjEsNyArMTg2OCw3IEBACiBzdGF0aWMgdm9pZAogX2Jhc2VfcmVsZWFzZV9tZW1vcnlfcG9vbHMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQogewotCWRleGl0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlc1xuIiwgaW9jLT5uYW1lLAorCWRleGl0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAlpZiAoaW9jLT5yZXF1ZXN0KSB7CkBAIC0xOTQ3LDcgKzE5NTQsNyBAQAogCXUzMiByZXRyeV9zejsKIAl1MTYgbWF4X3JlcXVlc3RfY3JlZGl0OwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCXJldHJ5X3N6ID0gMDsKQEAgLTIzNzQsNyArMjM4MSw3IEBACiAJZG8gewogCQlpbnRfc3RhdHVzID0gcmVhZGwoJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdFN0YXR1cyk7CiAJCWlmIChpbnRfc3RhdHVzICYgTVBJMl9ISVNfSU9DMlNZU19EQl9TVEFUVVMpIHsKLQkJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6ICIKKwkJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkJICAgICJzdWNjZXNzZnVsbCBjb3VudCglZCksIHRpbWVvdXQoJWQpXG4iLCBpb2MtPm5hbWUsCiAJCQkgICAgX19mdW5jX18sIGNvdW50LCB0aW1lb3V0KSk7CiAJCQlyZXR1cm4gMDsKQEAgLTI0MTUsNyArMjQyMiw3IEBACiAJZG8gewogCQlpbnRfc3RhdHVzID0gcmVhZGwoJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdFN0YXR1cyk7CiAJCWlmICghKGludF9zdGF0dXMgJiBNUEkyX0hJU19TWVMySU9DX0RCX1NUQVRVUykpIHsKLQkJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6ICIKKwkJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkJICAgICJzdWNjZXNzZnVsbCBjb3VudCglZCksIHRpbWVvdXQoJWQpXG4iLCBpb2MtPm5hbWUsCiAJCQkgICAgX19mdW5jX18sIGNvdW50LCB0aW1lb3V0KSk7CiAJCQlyZXR1cm4gMDsKQEAgLTI0NjMsNyArMjQ3MCw3IEBACiAJZG8gewogCQlkb29yYmVsbF9yZWcgPSByZWFkbCgmaW9jLT5jaGlwLT5Eb29yYmVsbCk7CiAJCWlmICghKGRvb3JiZWxsX3JlZyAmIE1QSTJfRE9PUkJFTExfVVNFRCkpIHsKLQkJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6ICIKKwkJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkJICAgICJzdWNjZXNzZnVsbCBjb3VudCglZCksIHRpbWVvdXQoJWQpXG4iLCBpb2MtPm5hbWUsCiAJCQkgICAgX19mdW5jX18sIGNvdW50LCB0aW1lb3V0KSk7CiAJCQlyZXR1cm4gMDsKQEAgLTI2MzcsOSArMjY0NCw5IEBACiAKIAlpZiAoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX0lOSVQpIHsKIAkJbWZwID0gKHUzMiAqKXJlcGx5OwotCQlwcmludGsoS0VSTl9ERUJVRyAiXHRvZmZzZXQ6ZGF0YVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIlx0b2Zmc2V0OmRhdGFcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgcmVwbHlfYnl0ZXMvNDsgaSsrKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlx0WzB4JTAyeF06JTA4eFxuIiwgaSo0LAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRbMHglMDJ4XTolMDh4XG4iLCBpKjQsCiAJCQkgICAgbGUzMl90b19jcHUobWZwW2ldKSk7CiAJfQogCXJldHVybiAwOwpAQCAtMjY3Miw3ICsyNjc5LDcgQEAKIAl2b2lkICpyZXF1ZXN0OwogCXUxNiB3YWl0X3N0YXRlX2NvdW50OwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCW11dGV4X2xvY2soJmlvYy0+YmFzZV9jbWRzLm11dGV4KTsKQEAgLTI3NzcsNyArMjc4NCw3IEBACiAJdm9pZCAqcmVxdWVzdDsKIAl1MTYgd2FpdF9zdGF0ZV9jb3VudDsKIAotCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlc1xuIiwgaW9jLT5uYW1lLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAltdXRleF9sb2NrKCZpb2MtPmJhc2VfY21kcy5tdXRleCk7CkBAIC0yODY1LDcgKzI4NzIsNyBAQAogCU1waTJQb3J0RmFjdHNSZXBseV90IG1waV9yZXBseSwgKnBmYWN0czsKIAlpbnQgbXBpX3JlcGx5X3N6LCBtcGlfcmVxdWVzdF9zeiwgcjsKIAotCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlc1xuIiwgaW9jLT5uYW1lLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAltcGlfcmVwbHlfc3ogPSBzaXplb2YoTXBpMlBvcnRGYWN0c1JlcGx5X3QpOwpAQCAtMjkwNyw3ICsyOTE0LDcgQEAKIAlNcGkySU9DRmFjdHNSZXBseV90IG1waV9yZXBseSwgKmZhY3RzOwogCWludCBtcGlfcmVwbHlfc3osIG1waV9yZXF1ZXN0X3N6LCByOwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCW1waV9yZXBseV9zeiA9IHNpemVvZihNcGkySU9DRmFjdHNSZXBseV90KTsKQEAgLTI5NzksNyArMjk4Niw3IEBACiAJc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOwogCXUxNiBpb2Nfc3RhdHVzOwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCW1lbXNldCgmbXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkySU9DSW5pdFJlcXVlc3RfdCkpOwpAQCAtMzA0MCw5ICszMDQ3LDkgQEAKIAkJaW50IGk7CiAKIAkJbWZwID0gKHUzMiAqKSZtcGlfcmVxdWVzdDsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlx0b2Zmc2V0OmRhdGFcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJcdG9mZnNldDpkYXRhXG4iKTsKIAkJZm9yIChpID0gMDsgaSA8IHNpemVvZihNcGkySU9DSW5pdFJlcXVlc3RfdCkvNDsgaSsrKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlx0WzB4JTAyeF06JTA4eFxuIiwgaSo0LAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRbMHglMDJ4XTolMDh4XG4iLCBpKjQsCiAJCQkgICAgbGUzMl90b19jcHUobWZwW2ldKSk7CiAJfQogCkBAIC0zMTIxLDcgKzMxMjgsNyBAQAogCQkJciA9IC1FVElNRTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlCi0JCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogY29tcGxldGVcbiIsCisJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBjb21wbGV0ZVxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAogCWlvY19zdGF0ZSA9IF9iYXNlX3dhaXRfb25faW9jc3RhdGUoaW9jLCBNUEkyX0lPQ19TVEFURV9PUEVSQVRJT05BTCwKQEAgLTMxODEsNyArMzE4OCw3IEBACiAJaW50IHIgPSAwOwogCWludCBpOwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCWlmIChpb2MtPmJhc2VfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CkBAIC0zMjE5LDcgKzMyMjYsNyBAQAogCQllbHNlCiAJCQlyID0gLUVUSU1FOwogCX0gZWxzZQotCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGNvbXBsZXRlXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogY29tcGxldGVcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CiAJaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAJcmV0dXJuIHI7CkBAIC0zMjgxLDcgKzMyODgsNyBAQAogCiAJX2Jhc2Vfc2F2ZV9tc2l4X3RhYmxlKGlvYyk7CiAKLQlkcnNwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgImNsZWFyIGludGVycnVwdHNcbiIsCisJZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImNsZWFyIGludGVycnVwdHNcbiIsCiAJICAgIGlvYy0+bmFtZSkpOwogCiAJY291bnQgPSAwOwpAQCAtMzI4OSw3ICszMjk2LDcgQEAKIAkJLyogV3JpdGUgbWFnaWMgc2VxdWVuY2UgdG8gV3JpdGVTZXF1ZW5jZSByZWdpc3RlcgogCQkgKiBMb29wIHVudGlsIGluIGRpYWdub3N0aWMgbW9kZQogCQkgKi8KLQkJZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJ3cml0ZSBtYWdpYyAiCisJCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJ3cml0ZSBtYWdpYyAiCiAJCSAgICAic2VxdWVuY2VcbiIsIGlvYy0+bmFtZSkpOwogCQl3cml0ZWwoTVBJMl9XUlNFUV9GTFVTSF9LRVlfVkFMVUUsICZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UpOwogCQl3cml0ZWwoTVBJMl9XUlNFUV8xU1RfS0VZX1ZBTFVFLCAmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlKTsKQEAgLTMzMDksNyArMzMxNiw3IEBACiAJCQlnb3RvIG91dDsKIAogCQlob3N0X2RpYWdub3N0aWMgPSByZWFkbCgmaW9jLT5jaGlwLT5Ib3N0RGlhZ25vc3RpYyk7Ci0JCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAid3JvdGUgbWFnaWMgIgorCQlkcnNwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAid3JvdGUgbWFnaWMgIgogCQkgICAgInNlcXVlbmNlOiBjb3VudCglZCksIGhvc3RfZGlhZ25vc3RpYygweCUwOHgpXG4iLAogCQkgICAgaW9jLT5uYW1lLCBjb3VudCwgaG9zdF9kaWFnbm9zdGljKSk7CiAKQEAgLTMzMTcsNyArMzMyNCw3IEBACiAKIAloY2Jfc2l6ZSA9IHJlYWRsKCZpb2MtPmNoaXAtPkhDQlNpemUpOwogCi0JZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJkaWFnIHJlc2V0OiBpc3N1ZWRcbiIsCisJZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImRpYWcgcmVzZXQ6IGlzc3VlZFxuIiwKIAkgICAgaW9jLT5uYW1lKSk7CiAJd3JpdGVsKGhvc3RfZGlhZ25vc3RpYyB8IE1QSTJfRElBR19SRVNFVF9BREFQVEVSLAogCSAgICAgJmlvYy0+Y2hpcC0+SG9zdERpYWdub3N0aWMpOwpAQCAtMzM0NCwyOSArMzM1MSwyOSBAQAogCiAJaWYgKGhvc3RfZGlhZ25vc3RpYyAmIE1QSTJfRElBR19IQ0JfTU9ERSkgewogCi0JCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAicmVzdGFydCB0aGUgYWRhcHRlciAiCisJCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZXN0YXJ0IHRoZSBhZGFwdGVyICIKIAkJICAgICJhc3N1bWluZyB0aGUgSENCIEFkZHJlc3MgcG9pbnRzIHRvIGdvb2QgRi9XXG4iLAogCQkgICAgaW9jLT5uYW1lKSk7CiAJCWhvc3RfZGlhZ25vc3RpYyAmPSB+TVBJMl9ESUFHX0JPT1RfREVWSUNFX1NFTEVDVF9NQVNLOwogCQlob3N0X2RpYWdub3N0aWMgfD0gTVBJMl9ESUFHX0JPT1RfREVWSUNFX1NFTEVDVF9IQ0RXOwogCQl3cml0ZWwoaG9zdF9kaWFnbm9zdGljLCAmaW9jLT5jaGlwLT5Ib3N0RGlhZ25vc3RpYyk7CiAKLQkJZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UCisJCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCiAJCSAgICAicmUtZW5hYmxlIHRoZSBIQ0RXXG4iLCBpb2MtPm5hbWUpKTsKIAkJd3JpdGVsKGhjYl9zaXplIHwgTVBJMl9IQ0JfU0laRV9IQ0JfRU5BQkxFLAogCQkgICAgJmlvYy0+Y2hpcC0+SENCU2l6ZSk7CiAJfQogCi0JZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJyZXN0YXJ0IHRoZSBhZGFwdGVyXG4iLAorCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZXN0YXJ0IHRoZSBhZGFwdGVyXG4iLAogCSAgICBpb2MtPm5hbWUpKTsKIAl3cml0ZWwoaG9zdF9kaWFnbm9zdGljICYgfk1QSTJfRElBR19IT0xEX0lPQ19SRVNFVCwKIAkgICAgJmlvYy0+Y2hpcC0+SG9zdERpYWdub3N0aWMpOwogCi0JZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJkaXNhYmxlIHdyaXRlcyB0byB0aGUgIgorCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJkaXNhYmxlIHdyaXRlcyB0byB0aGUgIgogCSAgICAiZGlhZ25vc3RpYyByZWdpc3RlclxuIiwgaW9jLT5uYW1lKSk7CiAJd3JpdGVsKE1QSTJfV1JTRVFfRkxVU0hfS0VZX1ZBTFVFLCAmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlKTsKIAotCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiV2FpdCBmb3IgRlcgdG8gZ28gdG8gdGhlICIKKwlkcnNwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiV2FpdCBmb3IgRlcgdG8gZ28gdG8gdGhlICIKIAkgICAgIlJFQURZIHN0YXRlXG4iLCBpb2MtPm5hbWUpKTsKIAlpb2Nfc3RhdGUgPSBfYmFzZV93YWl0X29uX2lvY3N0YXRlKGlvYywgTVBJMl9JT0NfU1RBVEVfUkVBRFksIDIwLAogCSAgICBzbGVlcF9mbGFnKTsKQEAgLTMzOTgsMTkgKzM0MDUsMjMgQEAKICAgICBlbnVtIHJlc2V0X3R5cGUgdHlwZSkKIHsKIAl1MzIgaW9jX3N0YXRlOworCWludCByYzsKIAotCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlc1xuIiwgaW9jLT5uYW1lLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKKwlpZiAoaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpCisJCXJldHVybiAwOworCiAJaW9jX3N0YXRlID0gbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDApOwotCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGlvY19zdGF0ZSgweCUwOHgpXG4iLAorCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaW9jX3N0YXRlKDB4JTA4eClcbiIsCiAJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIGlvY19zdGF0ZSkpOwogCiAJaWYgKChpb2Nfc3RhdGUgJiBNUEkyX0lPQ19TVEFURV9NQVNLKSA9PSBNUEkyX0lPQ19TVEFURV9SRUFEWSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaW9jX3N0YXRlICYgTVBJMl9ET09SQkVMTF9VU0VEKSB7Ci0JCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAidW5leHBlY3RlZCBkb29yYmVsbCAiCisJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJ1bmV4cGVjdGVkIGRvb3JiZWxsICIKIAkJICAgICJhY3RpdmUhXG4iLCBpb2MtPm5hbWUpKTsKIAkJZ290byBpc3N1ZV9kaWFnX3Jlc2V0OwogCX0KQEAgLTM0MjYsMTEgKzM0MzcsMTUgQEAKIAogCWlmICgoaW9jX3N0YXRlICYgTVBJMl9JT0NfU1RBVEVfTUFTSykgPT0gTVBJMl9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpCiAJCWlmICghKF9iYXNlX3NlbmRfaW9jX3Jlc2V0KGlvYywKLQkJICAgIE1QSTJfRlVOQ1RJT05fSU9DX01FU1NBR0VfVU5JVF9SRVNFVCwgMTUsIENBTl9TTEVFUCkpKQorCQkgICAgTVBJMl9GVU5DVElPTl9JT0NfTUVTU0FHRV9VTklUX1JFU0VULCAxNSwgQ0FOX1NMRUVQKSkpIHsKKwkJCWlvYy0+aW9jX3Jlc2V0X2NvdW50Kys7CiAJCQlyZXR1cm4gMDsKKwl9CiAKICBpc3N1ZV9kaWFnX3Jlc2V0OgotCXJldHVybiBfYmFzZV9kaWFnX3Jlc2V0KGlvYywgQ0FOX1NMRUVQKTsKKwlyYyA9IF9iYXNlX2RpYWdfcmVzZXQoaW9jLCBDQU5fU0xFRVApOworCWlvYy0+aW9jX3Jlc2V0X2NvdW50Kys7CisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTM0NDksNyArMzQ2NCw3IEBACiAJdTE2IHNtaWQ7CiAJc3RydWN0IF90cl9saXN0ICpkZWxheWVkX3RyLCAqZGVsYXllZF90cl9uZXh0OwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCS8qIGNsZWFuIHRoZSBkZWxheWVkIHRhcmdldCByZXNldCBsaXN0ICovCkBAIC0zNDU5LDYgKzM0NzQsMTIgQEAKIAkJa2ZyZWUoZGVsYXllZF90cik7CiAJfQogCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlbGF5ZWRfdHIsIGRlbGF5ZWRfdHJfbmV4dCwKKwkgICAgJmlvYy0+ZGVsYXllZF90cl92b2x1bWVfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGVsYXllZF90ci0+bGlzdCk7CisJCWtmcmVlKGRlbGF5ZWRfdHIpOworCX0KKwogCS8qIGluaXRpYWxpemUgdGhlIHNjc2kgbG9va3VwIGZyZWUgbGlzdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9jLT5mcmVlX2xpc3QpOwpAQCAtMzUyMCw2ICszNTQxLDEzIEBACiAJaWYgKHNsZWVwX2ZsYWcgPT0gQ0FOX1NMRUVQKQogCQlfYmFzZV9zdGF0aWNfY29uZmlnX3BhZ2VzKGlvYyk7CiAKKwlpZiAoaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSkgeworCQlpZiAoZGlhZ19idWZmZXJfZW5hYmxlICE9IDApCisJCQltcHQyc2FzX2VuYWJsZV9kaWFnX2J1ZmZlcihpb2MsIGRpYWdfYnVmZmVyX2VuYWJsZSk7CisJCWlmIChkaXNhYmxlX2Rpc2NvdmVyeSA+IDApCisJCQlyZXR1cm4gcjsKKwl9CisKIAlyID0gX2Jhc2Vfc2VuZF9wb3J0X2VuYWJsZShpb2MsIHNsZWVwX2ZsYWcpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTM1MzgsNyArMzU2Niw3IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpb2MtPnBkZXY7CiAKLQlkZXhpdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKKwlkZXhpdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCiAJX2Jhc2VfbWFza19pbnRlcnJ1cHRzKGlvYyk7CkBAIC0zNTcxLDcgKzM1OTksNyBAQAogewogCWludCByLCBpOwogCi0JZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCXIgPSBtcHQyc2FzX2Jhc2VfbWFwX3Jlc291cmNlcyhpb2MpOwpAQCAtMzYwNiw2ICszNjM0LDE3IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2MtPnJlc2V0X3dxKTsKIAorCS8qIGFsbG9jYXRlIG1lbW9yeSBwZCBoYW5kbGUgYml0bWFzayBsaXN0ICovCisJaW9jLT5wZF9oYW5kbGVzX3N6ID0gKGlvYy0+ZmFjdHMuTWF4RGV2SGFuZGxlIC8gOCk7CisJaWYgKGlvYy0+ZmFjdHMuTWF4RGV2SGFuZGxlICUgOCkKKwkJaW9jLT5wZF9oYW5kbGVzX3N6Kys7CisJaW9jLT5wZF9oYW5kbGVzID0ga3phbGxvYyhpb2MtPnBkX2hhbmRsZXNfc3osCisJICAgIEdGUF9LRVJORUwpOworCWlmICghaW9jLT5wZF9oYW5kbGVzKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3Jlc291cmNlczsKKwl9CisKIAlpb2MtPmZ3ZmF1bHRfZGVidWcgPSBtcHQyc2FzX2Z3ZmF1bHRfZGVidWc7CiAKIAkvKiBiYXNlIGludGVybmFsIGNvbW1hbmQgYml0cyAqLwpAQCAtMzYzNSwxMSArMzY3NCwyMCBAQAogCiAJLyogY3RsIG1vZHVsZSBpbnRlcm5hbCBjb21tYW5kIGJpdHMgKi8KIAlpb2MtPmN0bF9jbWRzLnJlcGx5ID0ga3phbGxvYyhpb2MtPnJlcGx5X3N6LCBHRlBfS0VSTkVMKTsKKwlpb2MtPmN0bF9jbWRzLnNlbnNlID0ga3phbGxvYyhTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIEdGUF9LRVJORUwpOwogCWlvYy0+Y3RsX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAJbXV0ZXhfaW5pdCgmaW9jLT5jdGxfY21kcy5tdXRleCk7CiAKIAlpZiAoIWlvYy0+YmFzZV9jbWRzLnJlcGx5IHx8ICFpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5IHx8CiAJICAgICFpb2MtPnNjc2loX2NtZHMucmVwbHkgfHwgIWlvYy0+dG1fY21kcy5yZXBseSB8fAorCSAgICAhaW9jLT5jb25maWdfY21kcy5yZXBseSB8fCAhaW9jLT5jdGxfY21kcy5yZXBseSB8fAorCSAgICAhaW9jLT5jdGxfY21kcy5zZW5zZSkgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisJfQorCisJaWYgKCFpb2MtPmJhc2VfY21kcy5yZXBseSB8fCAhaW9jLT50cmFuc3BvcnRfY21kcy5yZXBseSB8fAorCSAgICAhaW9jLT5zY3NpaF9jbWRzLnJlcGx5IHx8ICFpb2MtPnRtX2NtZHMucmVwbHkgfHwKIAkgICAgIWlvYy0+Y29uZmlnX2NtZHMucmVwbHkgfHwgIWlvYy0+Y3RsX2NtZHMucmVwbHkpIHsKIAkJciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwpAQCAtMzY2Nyw4ICszNzE1LDYgQEAKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKIAltcHQyc2FzX2Jhc2Vfc3RhcnRfd2F0Y2hkb2coaW9jKTsKLQlpZiAoZGlhZ19idWZmZXJfZW5hYmxlICE9IDApCi0JCW1wdDJzYXNfZW5hYmxlX2RpYWdfYnVmZmVyKGlvYywgZGlhZ19idWZmZXJfZW5hYmxlKTsKIAlyZXR1cm4gMDsKIAogIG91dF9mcmVlX3Jlc291cmNlczoKQEAgLTM2NzcsMTIgKzM3MjMsMTQgQEAKIAltcHQyc2FzX2Jhc2VfZnJlZV9yZXNvdXJjZXMoaW9jKTsKIAlfYmFzZV9yZWxlYXNlX21lbW9yeV9wb29scyhpb2MpOwogCXBjaV9zZXRfZHJ2ZGF0YShpb2MtPnBkZXYsIE5VTEwpOworCWtmcmVlKGlvYy0+cGRfaGFuZGxlcyk7CiAJa2ZyZWUoaW9jLT50bV9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPnNjc2loX2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+Y29uZmlnX2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+YmFzZV9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPmN0bF9jbWRzLnJlcGx5KTsKKwlrZnJlZShpb2MtPmN0bF9jbWRzLnNlbnNlKTsKIAlrZnJlZShpb2MtPnBmYWN0cyk7CiAJaW9jLT5jdGxfY21kcy5yZXBseSA9IE5VTEw7CiAJaW9jLT5iYXNlX2NtZHMucmVwbHkgPSBOVUxMOwpAQCAtMzcwNSwxNSArMzc1MywxNyBAQAogbXB0MnNhc19iYXNlX2RldGFjaChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCiB7CiAKLQlkZXhpdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKKwlkZXhpdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCiAJbXB0MnNhc19iYXNlX3N0b3Bfd2F0Y2hkb2coaW9jKTsKIAltcHQyc2FzX2Jhc2VfZnJlZV9yZXNvdXJjZXMoaW9jKTsKIAlfYmFzZV9yZWxlYXNlX21lbW9yeV9wb29scyhpb2MpOwogCXBjaV9zZXRfZHJ2ZGF0YShpb2MtPnBkZXYsIE5VTEwpOworCWtmcmVlKGlvYy0+cGRfaGFuZGxlcyk7CiAJa2ZyZWUoaW9jLT5wZmFjdHMpOwogCWtmcmVlKGlvYy0+Y3RsX2NtZHMucmVwbHkpOworCWtmcmVlKGlvYy0+Y3RsX2NtZHMuc2Vuc2UpOwogCWtmcmVlKGlvYy0+YmFzZV9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPnRtX2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+dHJhbnNwb3J0X2NtZHMucmVwbHkpOwpAQCAtMzczOCwxMSArMzc4OCwxMSBAQAogewogCXN3aXRjaCAocmVzZXRfcGhhc2UpIHsKIAljYXNlIE1QVDJfSU9DX1BSRV9SRVNFVDoKLQkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogIgorCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICIKIAkJICAgICJNUFQyX0lPQ19QUkVfUkVTRVRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAkJYnJlYWs7CiAJY2FzZSBNUFQyX0lPQ19BRlRFUl9SRVNFVDoKLQkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogIgorCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICIKIAkJICAgICJNUFQyX0lPQ19BRlRFUl9SRVNFVFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCQlpZiAoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CiAJCQlpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9SRVNFVDsKQEAgLTM3NjIsNyArMzgxMiw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBNUFQyX0lPQ19ET05FX1JFU0VUOgotCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkgICAgIk1QVDJfSU9DX0RPTkVfUkVTRVRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzgwNCw3ICszODU0LDcgQEAKIAkJcmV0dXJuOwogCiAJLyogd2FpdCBmb3IgcGVuZGluZyBjb21tYW5kcyB0byBjb21wbGV0ZSAqLwotCXdhaXRfZXZlbnRfdGltZW91dChpb2MtPnJlc2V0X3dxLCBpb2MtPnBlbmRpbmdfaW9fY291bnQgPT0gMCwgMyAqIEhaKTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoaW9jLT5yZXNldF93cSwgaW9jLT5wZW5kaW5nX2lvX2NvdW50ID09IDAsIDEwICogSFopOwogfQogCiAvKioKQEAgLTM4MjIsMTkgKzM4NzIsMzcgQEAKIAlpbnQgcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKKwlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKKwlpZiAoaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IHBjaSBlcnJvciByZWNvdmVyeSByZXNldFxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKG1wdDJzYXNfZndmYXVsdF9kZWJ1ZykKIAkJbXB0MnNhc19oYWx0X2Zpcm13YXJlKGlvYyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywgZmxhZ3MpOwotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX2xvY2ssIGZsYWdzKTsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGJ1c3lcbiIsCi0JCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkvKiBUT0RPIC0gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGJlIGRvaW5nIGlzIHB1bGxpbmcKKwkgKiBvdXQgYWxsIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBOT19TTEVFUDsgaXRzIG5ldmVyIHVzZWQuCisJICogVGhhdCBpcyBsZWdhY3kgY29kZSBmcm9tIG1wdCBmdXNpb24gZHJpdmVyLCBwb3J0ZWQgb3Zlci4KKwkgKiBJIHdpbGwgbGVhdmUgdGhpcyBCVUdfT04gaGVyZSBmb3Igbm93IHRpbGwgaXRzIGJlZW4gcmVzb2x2ZWQuCisJICovCisJQlVHX09OKHNsZWVwX2ZsYWcgPT0gTk9fU0xFRVApOworCisJLyogd2FpdCBmb3IgYW4gYWN0aXZlIHJlc2V0IGluIHByb2dyZXNzIHRvIGNvbXBsZXRlICovCisJaWYgKCFtdXRleF90cnlsb2NrKCZpb2MtPnJlc2V0X2luX3Byb2dyZXNzX211dGV4KSkgeworCQlkbyB7CisJCQlzc2xlZXAoMSk7CisJCX0gd2hpbGUgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgPT0gMSk7CisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZXhpdFxuIiwgaW9jLT5uYW1lLAorCQkgICAgX19mdW5jX18pKTsKKwkJcmV0dXJuIGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX3N0YXR1czsKIAl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywgZmxhZ3MpOwogCWlvYy0+c2hvc3RfcmVjb3ZlcnkgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX2xvY2ssIGZsYWdzKTsKIApAQCAtMzg0OSwxMyArMzkxNywxNyBAQAogCWlmICghcikKIAkJX2Jhc2VfcmVzZXRfaGFuZGxlcihpb2MsIE1QVDJfSU9DX0RPTkVfUkVTRVQpOwogIG91dDoKLQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAlc1xuIiwKKwlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICVzXG4iLAogCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCAoKHIgPT0gMCkgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIikpKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLCBmbGFncyk7CisJaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzID0gcjsKIAlpb2MtPnNob3N0X3JlY292ZXJ5ID0gMDsKIAljb21wbGV0ZSgmaW9jLT5zaG9zdF9yZWNvdmVyeV9kb25lKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZpb2MtPnJlc2V0X2luX3Byb2dyZXNzX211dGV4KTsKIAorCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZXhpdFxuIiwgaW9jLT5uYW1lLAorCSAgICBfX2Z1bmNfXykpOwogCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaAppbmRleCBiNGFmZTQzLi4wYjE1YThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaApAQCAtNjksMTEgKzY5LDExIEBACiAjZGVmaW5lIE1QVDJTQVNfRFJJVkVSX05BTUUJCSJtcHQyc2FzIgogI2RlZmluZSBNUFQyU0FTX0FVVEhPUgkiTFNJIENvcnBvcmF0aW9uIDxETC1NUFRGdXNpb25MaW51eEBsc2kuY29tPiIKICNkZWZpbmUgTVBUMlNBU19ERVNDUklQVElPTgkiTFNJIE1QVCBGdXNpb24gU0FTIDIuMCBEZXZpY2UgRHJpdmVyIgotI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9WRVJTSU9OCQkiMDUuMTAwLjAwLjAyIgotI2RlZmluZSBNUFQyU0FTX01BSk9SX1ZFUlNJT04JCTA1CisjZGVmaW5lIE1QVDJTQVNfRFJJVkVSX1ZFUlNJT04JCSIwNi4xMDAuMDAuMDAiCisjZGVmaW5lIE1QVDJTQVNfTUFKT1JfVkVSU0lPTgkJMDYKICNkZWZpbmUgTVBUMlNBU19NSU5PUl9WRVJTSU9OCQkxMDAKICNkZWZpbmUgTVBUMlNBU19CVUlMRF9WRVJTSU9OCQkwMAotI2RlZmluZSBNUFQyU0FTX1JFTEVBU0VfVkVSU0lPTgkJMDIKKyNkZWZpbmUgTVBUMlNBU19SRUxFQVNFX1ZFUlNJT04JCTAwCiAKIC8qCiAgKiBTZXQgTVBUMlNBU19TR19ERVBUSCB2YWx1ZSBiYXNlZCBvbiB1c2VyIGlucHV0LgpAQCAtMTI0LDcgKzEyNCw2IEBACiAgKiBsb2dnaW5nIGZvcm1hdAogICovCiAjZGVmaW5lIE1QVDJTQVNfRk1UCQkJIiVzOiAiCi0jZGVmaW5lIE1QVDJTQVNfREVCVUdfRk1UCQlLRVJOX0RFQlVHIE1QVDJTQVNfRk1UCiAjZGVmaW5lIE1QVDJTQVNfSU5GT19GTVQJCUtFUk5fSU5GTyBNUFQyU0FTX0ZNVAogI2RlZmluZSBNUFQyU0FTX05PVEVfRk1UCQlLRVJOX05PVElDRSBNUFQyU0FTX0ZNVAogI2RlZmluZSBNUFQyU0FTX1dBUk5fRk1UCQlLRVJOX1dBUk5JTkcgTVBUMlNBU19GTVQKQEAgLTI0OCw2ICsyNDcsNyBAQAogICogQG11dGV4OiBtdXRleAogICogQGRvbmU6IGNvbXBsZXRpb24KICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBwb2ludGVyCisgKiBAc2Vuc2U6IHNlbnNlIGRhdGEKICAqIEBzdGF0dXM6IE1QVDJfQ01EX1hYWCBzdGF0dXMKICAqIEBzbWlkOiBzeXN0ZW0gbWVzc2FnZSBpZAogICovCkBAIC0yNTUsNiArMjU1LDcgQEAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKIAl2b2lkIAkqcmVwbHk7CisJdm9pZAkqc2Vuc2U7CiAJdTE2CXN0YXR1czsKIAl1MTYJc21pZDsKIH07CkBAIC0yNzYsNyArMjc3LDcgQEAKICAqIEBpZDogdGFyZ2V0IGlkCiAgKiBAY2hhbm5lbDogdGFyZ2V0IGNoYW5uZWwKICAqIEBzbG90OiBudW1iZXIgbnVtYmVyCi0gKiBAaGlkZGVuX3JhaWRfY29tcG9uZW50OiBzZXQgdG8gMSB3aGVuIHRoaXMgaXMgYSByYWlkIG1lbWJlcgorICogQHBoeTogcGh5IGlkZW50aWZpZXIgcHJvdmlkZWQgaW4gc2FzIGRldmljZSBwYWdlIDAKICAqIEByZXNwb25kaW5nOiB1c2VkIGluIF9zY3NpaF9zYXNfZGV2aWNlX21hcmtfcmVzcG9uZGluZwogICovCiBzdHJ1Y3QgX3Nhc19kZXZpY2UgewpAQCAtMjk0LDcgKzI5NSw3IEBACiAJaW50CWlkOwogCWludAljaGFubmVsOwogCXUxNglzbG90OwotCXU4CWhpZGRlbl9yYWlkX2NvbXBvbmVudDsKKwl1OAlwaHk7CiAJdTgJcmVzcG9uZGluZzsKIH07CiAKQEAgLTQ3NCw4ICs0NzUsOSBAQAogICogQHNob3N0X3JlY292ZXJ5OiBob3N0IHJlc2V0IGluIHByb2dyZXNzCiAgKiBAaW9jX3Jlc2V0X2luX3Byb2dyZXNzX2xvY2s6CiAgKiBAaW9jX2xpbmtfcmVzZXRfaW5fcHJvZ3Jlc3M6IHBoeS9oYXJkIHJlc2V0IGluIHByb2dyZXNzCi0gKiBAaWdub3JlX2xvZ2luZm9zOiBpZ25vcmUgbG9naW5mb3MgZHVyaW5nIHRhc2sgbWFuYWdtZW50CisgKiBAaWdub3JlX2xvZ2luZm9zOiBpZ25vcmUgbG9naW5mb3MgZHVyaW5nIHRhc2sgbWFuYWdlbWVudAogICogQHJlbW92ZV9ob3N0OiBmbGFnIGZvciB3aGVuIGRyaXZlciB1bmxvYWRzLCB0byBhdm9pZCBzZW5kaW5nIGRldiByZXNldHMKKyAqIEBwY2lfZXJyb3JfcmVjb3Zlcnk6IGZsYWcgdG8gcHJldmVudCBpb2MgYWNjZXNzIHVudGlsIHNsb3QgcmVzZXQgY29tcGxldGVzCiAgKiBAd2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGU6CiAgKiBAbXNpeF9lbmFibGU6IGZsYWcgaW5kaWNhdGluZyBtc2l4IGlzIGVuYWJsZWQKICAqIEBtc2l4X3ZlY3Rvcl9jb3VudDogbnVtYmVyIG1zaXggdmVjdG9ycwpAQCAtNDg4LDYgKzQ5MCw4IEBACiAgKiBAY3RsX2NiX2lkeDogY2x0IGludGVybmFsIGNvbW1hbmRzCiAgKiBAYmFzZV9jYl9pZHg6IGJhc2UgaW50ZXJuYWwgY29tbWFuZHMKICAqIEBjb25maWdfY2JfaWR4OiBiYXNlIGludGVybmFsIGNvbW1hbmRzCisgKiBAdG1fdHJfY2JfaWR4IDogZGV2aWNlIHJlbW92YWwgdGFyZ2V0IHJlc2V0IGhhbmRzaGFrZQorICogQHRtX3RyX3ZvbHVtZV9jYl9pZHggOiB2b2x1bWUgcmVtb3ZhbCB0YXJnZXQgcmVzZXQKICAqIEBiYXNlX2NtZHM6CiAgKiBAdHJhbnNwb3J0X2NtZHM6CiAgKiBAc2NzaWhfY21kczoKQEAgLTUxNiw2ICs1MjAsOSBAQAogICogQHNhc19kZXZpY2VfbG9jazoKICAqIEBpb19taXNzaW5nX2RlbGF5OiB0aW1lIGZvciBJTyBjb21wbGV0ZWQgYnkgZncgd2hlbiBQRFIgZW5hYmxlZAogICogQGRldmljZV9taXNzaW5nX2RlbGF5OiB0aW1lIGZvciBkZXZpY2UgbWlzc2luZyBieSBmdyB3aGVuIFBEUiBlbmFibGVkCisgKiBAc2FzX2lkIDogdXNlZCBmb3Igc2V0dGluZyB2b2x1bWUgdGFyZ2V0IElEcworICogQHBkX2hhbmRsZXMgOiBiaXRtYXNrIGZvciBQRCBoYW5kbGVzCisgKiBAcGRfaGFuZGxlc19zeiA6IHNpemUgb2YgcGRfaGFuZGxlIGJpdG1hc2sKICAqIEBjb25maWdfcGFnZV9zejogY29uZmlnIHBhZ2Ugc2l6ZQogICogQGNvbmZpZ19wYWdlOiByZXNlcnZlIG1lbW9yeSBmb3IgY29uZmlnIHBhZ2UgcGF5bG9hZAogICogQGNvbmZpZ19wYWdlX2RtYToKQEAgLTU2OCw2ICs1NzUsOCBAQAogICogQHJlcGx5X3Bvc3RfZnJlZV9kbWE6CiAgKiBAcmVwbHlfcG9zdF9mcmVlX2RtYV9wb29sOgogICogQHJlcGx5X3Bvc3RfaG9zdF9pbmRleDogaGVhZCBpbmRleCBpbiB0aGUgcG9vbCB3aGVyZSBGVyBjb21wbGV0ZXMgSU8KKyAqIEBkZWxheWVkX3RyX2xpc3Q6IHRhcmdldCByZXNldCBsaW5rIGxpc3QKKyAqIEBkZWxheWVkX3RyX3ZvbHVtZV9saXN0OiB2b2x1bWUgdGFyZ2V0IHJlc2V0IGxpbmsgbGlzdAogICovCiBzdHJ1Y3QgTVBUMlNBU19BREFQVEVSIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC02MDAsMTcgKzYwOSwyMyBAQAogCWludAkJYWVuX2V2ZW50X3JlYWRfZmxhZzsKIAl1OAkJYnJvYWRjYXN0X2Flbl9idXN5OwogCXU4CQlzaG9zdF9yZWNvdmVyeTsKKworCXN0cnVjdCBtdXRleAlyZXNldF9pbl9wcm9ncmVzc19tdXRleDsKIAlzdHJ1Y3QgY29tcGxldGlvbglzaG9zdF9yZWNvdmVyeV9kb25lOwogCXNwaW5sb2NrX3QgCWlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrOwogCXU4CQlpb2NfbGlua19yZXNldF9pbl9wcm9ncmVzczsKKwlpbnQJCWlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXM7CisKIAl1OAkJaWdub3JlX2xvZ2luZm9zOwogCXU4CQlyZW1vdmVfaG9zdDsKKwl1OAkJcGNpX2Vycm9yX3JlY292ZXJ5OwogCXU4CQl3YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZTsKIAogCXU4CQltc2l4X2VuYWJsZTsKIAl1MTYJCW1zaXhfdmVjdG9yX2NvdW50OwogCXUzMgkJKm1zaXhfdGFibGU7CiAJdTMyCQkqbXNpeF90YWJsZV9iYWNrdXA7CisJdTMyCQlpb2NfcmVzZXRfY291bnQ7CiAKIAkvKiBpbnRlcm5hbCBjb21tYW5kcywgY2FsbGJhY2sgaW5kZXggKi8KIAl1OAkJc2NzaV9pb19jYl9pZHg7CkBAIC02MjEsNiArNjM2LDcgQEAKIAl1OAkJYmFzZV9jYl9pZHg7CiAJdTgJCWNvbmZpZ19jYl9pZHg7CiAJdTgJCXRtX3RyX2NiX2lkeDsKKwl1OAkJdG1fdHJfdm9sdW1lX2NiX2lkeDsKIAl1OAkJdG1fc2FzX2NvbnRyb2xfY2JfaWR4OwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIGJhc2VfY21kczsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCB0cmFuc3BvcnRfY21kczsKQEAgLTY2NCw2ICs2ODAsOSBAQAogCXUxNgkJZGV2aWNlX21pc3NpbmdfZGVsYXk7CiAJaW50CQlzYXNfaWQ7CiAKKwl2b2lkCQkqcGRfaGFuZGxlczsKKwl1MTYJCXBkX2hhbmRsZXNfc3o7CisKIAkvKiBjb25maWcgcGFnZSAqLwogCXUxNgkJY29uZmlnX3BhZ2Vfc3o7CiAJdm9pZCAJCSpjb25maWdfcGFnZTsKQEAgLTczNSw2ICs3NTQsNyBAQAogCXUzMgkJcmVwbHlfcG9zdF9ob3N0X2luZGV4OwogCiAJc3RydWN0IGxpc3RfaGVhZCBkZWxheWVkX3RyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkZWxheWVkX3RyX3ZvbHVtZV9saXN0OwogCiAJLyogZGlhZyBidWZmZXIgc3VwcG9ydCAqLwogCXU4CQkqZGlhZ19idWZmZXJbTVBJMl9ESUFHX0JVRl9UWVBFX0NPVU5UXTsKQEAgLTc0NSw2ICs3NjUsOCBAQAogCU1waTJNYW51ZmFjdHVyaW5nUGFnZTEwX3QgbWFudV9wZzEwOwogCXUzMgkJcHJvZHVjdF9zcGVjaWZpY1tNUEkyX0RJQUdfQlVGX1RZUEVfQ09VTlRdWzIzXTsKIAl1MzIJCWRpYWdub3N0aWNfZmxhZ3NbTVBJMl9ESUFHX0JVRl9UWVBFX0NPVU5UXTsKKwl1MzIJCXJpbmdfYnVmZmVyX29mZnNldDsKKwl1MzIJCXJpbmdfYnVmZmVyX3N6OwogfTsKIAogdHlwZWRlZiB1OCAoKk1QVF9DQUxMQkFDSykoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY29uZmlnLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2NvbmZpZy5jCmluZGV4IGM2NTQ0MjkuLjZhZmQ2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jb25maWcuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAJaWYgKCFkZXNjKQogCQlyZXR1cm47CiAKLQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAlcyglZCksIGFjdGlvbiglZCksIGZvcm0oMHglMDh4KSwgIgorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogJXMoJWQpLCBhY3Rpb24oJWQpLCBmb3JtKDB4JTA4eCksICIKIAkgICAgInNtaWQoJWQpXG4iLCBpb2MtPm5hbWUsIGNhbGxpbmdfZnVuY3Rpb25fbmFtZSwgZGVzYywKIAkgICAgbXBpX3JlcXVlc3QtPkhlYWRlci5QYWdlTnVtYmVyLCBtcGlfcmVxdWVzdC0+QWN0aW9uLAogCSAgICBsZTMyX3RvX2NwdShtcGlfcmVxdWVzdC0+UGFnZUFkZHJlc3MpLCBzbWlkKTsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAobXBpX3JlcGx5LT5JT0NTdGF0dXMgfHwgbXBpX3JlcGx5LT5JT0NMb2dJbmZvKQotCQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJICAgICJcdGlvY3N0YXR1cygweCUwNHgpLCBsb2dpbmZvKDB4JTA4eClcbiIsCiAJCSAgICBpb2MtPm5hbWUsIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKSwKIAkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS0+SU9DTG9nSW5mbykpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAJCWlmIChpb2MtPmNvbmZpZ19jbWRzLnNtaWQgPT0gc21pZCkKIAkJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBzbWlkKTsKIAkJaWYgKChpb2MtPnNob3N0X3JlY292ZXJ5KSB8fCAoaW9jLT5jb25maWdfY21kcy5zdGF0dXMgJgotCQkgICAgTVBUMl9DTURfUkVTRVQpKQorCQkgICAgTVBUMl9DTURfUkVTRVQpIHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQkJZ290byByZXRyeV9jb25maWc7CiAJCWlzc3VlX2hvc3RfcmVzZXQgPSAxOwogCQlyID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5jCmluZGV4IGQ4OGU5NzUuLmI3NzQ5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYwpAQCAtODAsNiArODAsMzIgQEAKIAlCTE9DS0lORywKIH07CiAKKy8qKgorICogX2N0bF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlIC0gc2FzIGRldmljZSBzZWFyY2gKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQGhhbmRsZTogc2FzIGRldmljZSBoYW5kbGUgKGFzc2lnbmVkIGJ5IGZpcm13YXJlKQorICogQ29udGV4dDogQ2FsbGluZyBmdW5jdGlvbiBzaG91bGQgYWNxdWlyZSBpb2MtPnNhc19kZXZpY2VfbG9jaworICoKKyAqIFRoaXMgc2VhcmNoZXMgZm9yIHNhc19kZXZpY2UgYmFzZWQgb24gc2FzX2FkZHJlc3MsIHRoZW4gcmV0dXJuIHNhc19kZXZpY2UKKyAqIG9iamVjdC4KKyAqLworc3RhdGljIHN0cnVjdCBfc2FzX2RldmljZSAqCitfY3RsX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlKQoreworCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZSwgKnI7CisKKwlyID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNhc19kZXZpY2UsICZpb2MtPnNhc19kZXZpY2VfbGlzdCwgbGlzdCkgeworCQlpZiAoc2FzX2RldmljZS0+aGFuZGxlICE9IGhhbmRsZSkKKwkJCWNvbnRpbnVlOworCQlyID0gc2FzX2RldmljZTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCXJldHVybiByOworfQorCiAjaWZkZWYgQ09ORklHX1NDU0lfTVBUMlNBU19MT0dHSU5HCiAvKioKICAqIF9jdGxfZGlzcGxheV9zb21lX2RlYnVnIC0gZGVidWcgcm91dGluZQpAQCAtMTg4LDE0ICsyMTQsMTQgQEAKIAlpZiAoIWRlc2MpCiAJCXJldHVybjsKIAotCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6ICVzLCBzbWlkKCVkKVxuIiwKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICVzLCBzbWlkKCVkKVxuIiwKIAkgICAgaW9jLT5uYW1lLCBjYWxsaW5nX2Z1bmN0aW9uX25hbWUsIGRlc2MsIHNtaWQpOwogCiAJaWYgKCFtcGlfcmVwbHkpCiAJCXJldHVybjsKIAogCWlmIChtcGlfcmVwbHktPklPQ1N0YXR1cyB8fCBtcGlfcmVwbHktPklPQ0xvZ0luZm8pCi0JCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVAorCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVAogCQkgICAgIlx0aW9jc3RhdHVzKDB4JTA0eCksIGxvZ2luZm8oMHglMDh4KVxuIiwKIAkJICAgIGlvYy0+bmFtZSwgbGUxNl90b19jcHUobXBpX3JlcGx5LT5JT0NTdGF0dXMpLAogCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LT5JT0NMb2dJbmZvKSk7CkBAIC0yMDUsOCArMjMxLDI0IEBACiAJICAgIE1QSTJfRlVOQ1RJT05fUkFJRF9TQ1NJX0lPX1BBU1NUSFJPVUdIKSB7CiAJCU1waTJTQ1NJSU9SZXBseV90ICpzY3NpX3JlcGx5ID0KIAkJICAgIChNcGkyU0NTSUlPUmVwbHlfdCAqKW1waV9yZXBseTsKKwkJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlID0gTlVMTDsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJc2FzX2RldmljZSA9IF9jdGxfc2FzX2RldmljZV9maW5kX2J5X2hhbmRsZShpb2MsCisJCSAgICBsZTE2X3RvX2NwdShzY3NpX3JlcGx5LT5EZXZIYW5kbGUpKTsKKwkJaWYgKHNhc19kZXZpY2UpIHsKKwkJCXByaW50ayhNUFQyU0FTX1dBUk5fRk1UICJcdHNhc19hZGRyZXNzKDB4JTAxNmxseCksICIKKwkJCSAgICAicGh5KCVkKVxuIiwgaW9jLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzLCBzYXNfZGV2aWNlLT5waHkpOworCQkJcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQKKwkJCSAgICAiXHRlbmNsb3N1cmVfbG9naWNhbF9pZCgweCUwMTZsbHgpLCBzbG90KCVkKVxuIiwKKwkJCSAgICBpb2MtPm5hbWUsIHNhc19kZXZpY2UtPmVuY2xvc3VyZV9sb2dpY2FsX2lkLAorCQkJICAgIHNhc19kZXZpY2UtPnNsb3QpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CiAJCWlmIChzY3NpX3JlcGx5LT5TQ1NJU3RhdGUgfHwgc2NzaV9yZXBseS0+U0NTSVN0YXR1cykKLQkJCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVAorCQkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJCSAgICAiXHRzY3NpX3N0YXRlKDB4JTAyeCksIHNjc2lfc3RhdHVzIgogCQkJICAgICIoMHglMDJ4KVxuIiwgaW9jLT5uYW1lLAogCQkJICAgIHNjc2lfcmVwbHktPlNDU0lTdGF0ZSwKQEAgLTIzMyw2ICsyNzUsOSBAQAogCXUzMiByZXBseSkKIHsKIAlNUEkyRGVmYXVsdFJlcGx5X3QgKm1waV9yZXBseTsKKwlNcGkyU0NTSUlPUmVwbHlfdCAqc2NzaWlvX3JlcGx5OworCWNvbnN0IHZvaWQgKnNlbnNlX2RhdGE7CisJdTMyIHN6OwogCiAJaWYgKGlvYy0+Y3RsX2NtZHMuc3RhdHVzID09IE1QVDJfQ01EX05PVF9VU0VEKQogCQlyZXR1cm4gMTsKQEAgLTI0Myw2ICsyODgsMjAgQEAKIAlpZiAobXBpX3JlcGx5KSB7CiAJCW1lbWNweShpb2MtPmN0bF9jbWRzLnJlcGx5LCBtcGlfcmVwbHksIG1waV9yZXBseS0+TXNnTGVuZ3RoKjQpOwogCQlpb2MtPmN0bF9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9SRVBMWV9WQUxJRDsKKwkJLyogZ2V0IHNlbnNlIGRhdGEgKi8KKwkJaWYgKG1waV9yZXBseS0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1QgfHwKKwkJICAgIG1waV9yZXBseS0+RnVuY3Rpb24gPT0KKwkJICAgIE1QSTJfRlVOQ1RJT05fUkFJRF9TQ1NJX0lPX1BBU1NUSFJPVUdIKSB7CisJCQlzY3NpaW9fcmVwbHkgPSAoTXBpMlNDU0lJT1JlcGx5X3QgKiltcGlfcmVwbHk7CisJCQlpZiAoc2NzaWlvX3JlcGx5LT5TQ1NJU3RhdGUgJgorCQkJICAgIE1QSTJfU0NTSV9TVEFURV9BVVRPU0VOU0VfVkFMSUQpIHsKKwkJCQlzeiA9IG1pbl90KHUzMiwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLAorCQkJCSAgICBsZTMyX3RvX2NwdShzY3NpaW9fcmVwbHktPlNlbnNlQ291bnQpKTsKKwkJCQlzZW5zZV9kYXRhID0gbXB0MnNhc19iYXNlX2dldF9zZW5zZV9idWZmZXIoaW9jLAorCQkJCSAgICBzbWlkKTsKKwkJCQltZW1jcHkoaW9jLT5jdGxfY21kcy5zZW5zZSwgc2Vuc2VfZGF0YSwgc3opOworCQkJfQorCQl9CiAJfQogI2lmZGVmIENPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORwogCV9jdGxfZGlzcGxheV9zb21lX2RlYnVnKGlvYywgc21pZCwgImN0bF9kb25lIiwgbXBpX3JlcGx5KTsKQEAgLTM5Miw3ICs0NTEsNyBAQAogCiAJc3dpdGNoIChyZXNldF9waGFzZSkgewogCWNhc2UgTVBUMl9JT0NfUFJFX1JFU0VUOgotCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkgICAgIk1QVDJfSU9DX1BSRV9SRVNFVFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCQlmb3IgKGkgPSAwOyBpIDwgTVBJMl9ESUFHX0JVRl9UWVBFX0NPVU5UOyBpKyspIHsKIAkJCWlmICghKGlvYy0+ZGlhZ19idWZmZXJfc3RhdHVzW2ldICYKQEAgLTQwNSw3ICs0NjQsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgTVBUMl9JT0NfQUZURVJfUkVTRVQ6Ci0JCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6ICIKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiAiCiAJCSAgICAiTVBUMl9JT0NfQUZURVJfUkVTRVRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAkJaWYgKGlvYy0+Y3RsX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfUEVORElORykgewogCQkJaW9jLT5jdGxfY21kcy5zdGF0dXMgfD0gTVBUMl9DTURfUkVTRVQ7CkBAIC00MTQsNyArNDczLDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIE1QVDJfSU9DX0RPTkVfUkVTRVQ6Ci0JCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6ICIKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiAiCiAJCSAgICAiTVBUMl9JT0NfRE9ORV9SRVNFVFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBNUEkyX0RJQUdfQlVGX1RZUEVfQ09VTlQ7IGkrKykgewpAQCAtNTMxLDcgKzU5MCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWZvdW5kKSB7Ci0JCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICIKIAkJICAgICJoYW5kbGUoMHglMDR4KSwgbHVuKCVkKSwgbm8gYWN0aXZlIG1pZCEhXG4iLCBpb2MtPm5hbWUsCiAJCSAgICBkZXNjLCBsZTE2X3RvX2NwdSh0bV9yZXF1ZXN0LT5EZXZIYW5kbGUpLCBsdW4pKTsKIAkJdG1fcmVwbHkgPSBpb2MtPmN0bF9jbWRzLnJlcGx5OwpAQCAtNTQ5LDcgKzYwOCw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCSAgICAiaGFuZGxlKDB4JTA0eCksIGx1biglZCksIHRhc2tfbWlkKCVkKVxuIiwgaW9jLT5uYW1lLAogCSAgICBkZXNjLCBsZTE2X3RvX2NwdSh0bV9yZXF1ZXN0LT5EZXZIYW5kbGUpLCBsdW4sCiAJICAgICBsZTE2X3RvX2NwdSh0bV9yZXF1ZXN0LT5UYXNrTUlEKSkpOwpAQCAtNTY3LDcgKzYyNiw3IEBACiBfY3RsX2RvX21wdF9jb21tYW5kKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKICAgICBzdHJ1Y3QgbXB0Ml9pb2N0bF9jb21tYW5kIGthcmcsIHZvaWQgX191c2VyICptZiwgZW51bSBibG9ja19zdGF0ZSBzdGF0ZSkKIHsKLQlNUEkyUmVxdWVzdEhlYWRlcl90ICptcGlfcmVxdWVzdDsKKwlNUEkyUmVxdWVzdEhlYWRlcl90ICptcGlfcmVxdWVzdCA9IE5VTEwsICpyZXF1ZXN0OwogCU1QSTJEZWZhdWx0UmVwbHlfdCAqbXBpX3JlcGx5OwogCXUzMiBpb2Nfc3RhdGU7CiAJdTE2IGlvY19zdGF0dXM7CkBAIC01NzYsNyArNjM1LDYgQEAKIAl1OCBpc3N1ZV9yZXNldDsKIAl1MzIgc3o7CiAJdm9pZCAqcHNnZTsKLQl2b2lkICpwcml2X3NlbnNlID0gTlVMTDsKIAl2b2lkICpkYXRhX291dCA9IE5VTEw7CiAJZG1hX2FkZHJfdCBkYXRhX291dF9kbWE7CiAJc2l6ZV90IGRhdGFfb3V0X3N6ID0gMDsKQEAgLTYyMSwzMSArNjc5LDUwIEBACiAJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaW9jIGlzIG9wZXJhdGlvbmFsXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CiAKLQlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkX3Njc2lpbyhpb2MsIGlvYy0+Y3RsX2NiX2lkeCwgTlVMTCk7Ci0JaWYgKCFzbWlkKSB7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwotCQlyZXQgPSAtRUFHQUlOOworCW1waV9yZXF1ZXN0ID0ga3phbGxvYyhpb2MtPnJlcXVlc3Rfc3osIEdGUF9LRVJORUwpOworCWlmICghbXBpX3JlcXVlc3QpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBvYnRhaW5pbmcgYSBtZW1vcnkgZm9yICIKKwkJICAgICJtcGlfcmVxdWVzdFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IDA7Ci0JaW9jLT5jdGxfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9QRU5ESU5HOwotCW1lbXNldChpb2MtPmN0bF9jbWRzLnJlcGx5LCAwLCBpb2MtPnJlcGx5X3N6KTsKLQltcGlfcmVxdWVzdCA9IG1wdDJzYXNfYmFzZV9nZXRfbXNnX2ZyYW1lKGlvYywgc21pZCk7Ci0JaW9jLT5jdGxfY21kcy5zbWlkID0gc21pZDsKLQlkYXRhX291dF9zeiA9IGthcmcuZGF0YV9vdXRfc2l6ZTsKLQlkYXRhX2luX3N6ID0ga2FyZy5kYXRhX2luX3NpemU7Ci0KIAkvKiBjb3B5IGluIHJlcXVlc3QgbWVzc2FnZSBmcmFtZSBmcm9tIHVzZXIgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIobXBpX3JlcXVlc3QsIG1mLCBrYXJnLmRhdGFfc2dlX29mZnNldCo0KSkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKIAkJICAgIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVGQVVMVDsKLQkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIHNtaWQpOwogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAobXBpX3JlcXVlc3QtPkZ1bmN0aW9uID09IE1QSTJfRlVOQ1RJT05fU0NTSV9UQVNLX01HTVQpIHsKKwkJc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZF9ocHIoaW9jLCBpb2MtPmN0bF9jYl9pZHgpOworCQlpZiAoIXNtaWQpIHsKKwkJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKKwkJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisKKwkJc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZF9zY3NpaW8oaW9jLCBpb2MtPmN0bF9jYl9pZHgsIE5VTEwpOworCQlpZiAoIXNtaWQpIHsKKwkJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKKwkJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJldCA9IDA7CisJaW9jLT5jdGxfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9QRU5ESU5HOworCW1lbXNldChpb2MtPmN0bF9jbWRzLnJlcGx5LCAwLCBpb2MtPnJlcGx5X3N6KTsKKwlyZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKKwltZW1jcHkocmVxdWVzdCwgbXBpX3JlcXVlc3QsIGthcmcuZGF0YV9zZ2Vfb2Zmc2V0KjQpOworCWlvYy0+Y3RsX2NtZHMuc21pZCA9IHNtaWQ7CisJZGF0YV9vdXRfc3ogPSBrYXJnLmRhdGFfb3V0X3NpemU7CisJZGF0YV9pbl9zeiA9IGthcmcuZGF0YV9pbl9zaXplOworCiAJaWYgKG1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9PSBNUEkyX0ZVTkNUSU9OX1NDU0lfSU9fUkVRVUVTVCB8fAogCSAgICBtcGlfcmVxdWVzdC0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9SQUlEX1NDU0lfSU9fUEFTU1RIUk9VR0gpIHsKIAkJaWYgKCFsZTE2X3RvX2NwdShtcGlfcmVxdWVzdC0+RnVuY3Rpb25EZXBlbmRlbnQxKSB8fApAQCAtNjkxLDcgKzc2OCw3IEBACiAJfQogCiAJLyogYWRkIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzICovCi0JcHNnZSA9ICh2b2lkICopbXBpX3JlcXVlc3QgKyAoa2FyZy5kYXRhX3NnZV9vZmZzZXQqNCk7CisJcHNnZSA9ICh2b2lkICopcmVxdWVzdCArIChrYXJnLmRhdGFfc2dlX29mZnNldCo0KTsKIAogCWlmICghZGF0YV9vdXRfc3ogJiYgIWRhdGFfaW5fc3opIHsKIAkJbXB0MnNhc19iYXNlX2J1aWxkX3plcm9fbGVuX3NnZShpb2MsIHBzZ2UpOwpAQCAtNzM5LDExICs4MTYsMTEgQEAKIAljYXNlIE1QSTJfRlVOQ1RJT05fUkFJRF9TQ1NJX0lPX1BBU1NUSFJPVUdIOgogCXsKIAkJTXBpMlNDU0lJT1JlcXVlc3RfdCAqc2NzaWlvX3JlcXVlc3QgPQotCQkgICAgKE1waTJTQ1NJSU9SZXF1ZXN0X3QgKiltcGlfcmVxdWVzdDsKKwkJICAgIChNcGkyU0NTSUlPUmVxdWVzdF90ICopcmVxdWVzdDsKKwkJc2NzaWlvX3JlcXVlc3QtPlNlbnNlQnVmZmVyTGVuZ3RoID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOwogCQlzY3NpaW9fcmVxdWVzdC0+U2Vuc2VCdWZmZXJMb3dBZGRyZXNzID0KIAkJICAgIG1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyX2RtYShpb2MsIHNtaWQpOwotCQlwcml2X3NlbnNlID0gbXB0MnNhc19iYXNlX2dldF9zZW5zZV9idWZmZXIoaW9jLCBzbWlkKTsKLQkJbWVtc2V0KHByaXZfc2Vuc2UsIDAsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisJCW1lbXNldChpb2MtPmN0bF9jbWRzLnNlbnNlLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwogCQlpZiAobXBpX3JlcXVlc3QtPkZ1bmN0aW9uID09IE1QSTJfRlVOQ1RJT05fU0NTSV9JT19SRVFVRVNUKQogCQkJbXB0MnNhc19iYXNlX3B1dF9zbWlkX3Njc2lfaW8oaW9jLCBzbWlkLAogCQkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXF1ZXN0LT5GdW5jdGlvbkRlcGVuZGVudDEpKTsKQEAgLTc1NCw5ICs4MzEsOSBAQAogCWNhc2UgTVBJMl9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVDoKIAl7CiAJCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QgKnRtX3JlcXVlc3QgPQotCQkgICAgKE1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QgKiltcGlfcmVxdWVzdDsKKwkJICAgIChNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVxdWVzdF90ICopcmVxdWVzdDsKIAotCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIlRBU0tfTUdNVDogIgorCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiVEFTS19NR01UOiAiCiAJCSAgICAiaGFuZGxlKDB4JTA0eCksIHRhc2tfdHlwZSgweCUwMngpXG4iLCBpb2MtPm5hbWUsCiAJCSAgICBsZTE2X3RvX2NwdSh0bV9yZXF1ZXN0LT5EZXZIYW5kbGUpLCB0bV9yZXF1ZXN0LT5UYXNrVHlwZSkpOwogCkBAIC04NTEsNyArOTI4LDcgQEAKIAkJTXBpMlNDU0lUYXNrTWFuYWdlbWVudFJlcGx5X3QgKnRtX3JlcGx5ID0KIAkJICAgIChNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVwbHlfdCAqKW1waV9yZXBseTsKIAotCQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIlRBU0tfTUdNVDogIgorCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiVEFTS19NR01UOiAiCiAJCSAgICAiSU9DU3RhdHVzKDB4JTA0eCksIElPQ0xvZ0luZm8oMHglMDh4KSwgIgogCQkgICAgIlRlcm1pbmF0aW9uQ291bnQoMHglMDh4KVxuIiwgaW9jLT5uYW1lLAogCQkgICAgbGUxNl90b19jcHUodG1fcmVwbHktPklPQ1N0YXR1cyksCkBAIC04ODcsNyArOTY0LDggQEAKIAkgICAgTVBJMl9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1QgfHwgbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID09CiAJICAgIE1QSTJfRlVOQ1RJT05fUkFJRF9TQ1NJX0lPX1BBU1NUSFJPVUdIKSkgewogCQlzeiA9IG1pbl90KHUzMiwga2FyZy5tYXhfc2Vuc2VfYnl0ZXMsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoa2FyZy5zZW5zZV9kYXRhX3B0ciwgcHJpdl9zZW5zZSwgc3opKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoa2FyZy5zZW5zZV9kYXRhX3B0ciwKKwkJCWlvYy0+Y3RsX2NtZHMuc2Vuc2UsIHN6KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywKIAkJCSAgICBfX0xJTkVfXywgX19mdW5jX18pOwogCQkJcmV0ID0gLUVOT0RBVEE7CkBAIC05MjYsNiArMTAwNCw3IEBACiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wZGV2LCBkYXRhX291dF9zeiwgZGF0YV9vdXQsCiAJCSAgICBkYXRhX291dF9kbWEpOwogCisJa2ZyZWUobXBpX3JlcXVlc3QpOwogCWlvYy0+Y3RsX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAJbXV0ZXhfdW5sb2NrKCZpb2MtPmN0bF9jbWRzLm11dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtOTUwLDcgKzEwMjksNyBAQAogCWlmIChfY3RsX3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCW1lbXNldCgma2FyZywgMCAsIHNpemVvZihrYXJnKSk7CkBAIC05OTgsNyArMTA3Nyw3IEBACiAJaWYgKF9jdGxfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jX251bWJlciwgJmlvYykgPT0gLTEgfHwgIWlvYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBlbnRlclxuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCiAJa2FyZy5ldmVudF9lbnRyaWVzID0gTVBUMlNBU19DVExfRVZFTlRfTE9HX1NJWkU7CkBAIC0xMDMxLDcgKzExMTAsNyBAQAogCWlmIChfY3RsX3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCWlmIChpb2MtPmV2ZW50X2xvZykKQEAgLTEwNzMsNyArMTE1Miw3IEBACiAJaWYgKF9jdGxfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jX251bWJlciwgJmlvYykgPT0gLTEgfHwgIWlvYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBlbnRlclxuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCiAJbnVtYmVyX2J5dGVzID0ga2FyZy5oZHIubWF4X2RhdGFfc2l6ZSAtCkBAIC0xMTE4LDcgKzExOTcsNyBAQAogCWlmIChfY3RsX3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCXJldHZhbCA9IG1wdDJzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCkBAIC0xMjE5LDcgKzEyOTgsNyBAQAogCWlmIChfY3RsX3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAlyYyA9IF9jdGxfYnRkaF9zZWFyY2hfc2FzX2RldmljZShpb2MsICZrYXJnKTsKQEAgLTEyODgsNyArMTM2Nyw3IEBACiAJdTE2IGlvY19zdGF0dXM7CiAJdTggaXNzdWVfcmVzZXQgPSAwOwogCi0JZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAlpZiAoaW9jLT5jdGxfY21kcy5zdGF0dXMgIT0gTVBUMl9DTURfTk9UX1VTRUQpIHsKQEAgLTEzNzYsNyArMTQ1NSw3IEBACiAJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLwogCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CiAKLQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZGlhZ19idWZmZXIoMHglcCksICIKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBkaWFnX2J1ZmZlcigweCVwKSwgIgogCSAgICAiZG1hKDB4JWxseCksIHN6KCVkKVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywgcmVxdWVzdF9kYXRhLAogCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlcXVlc3RfZGF0YV9kbWEsCiAJICAgIGxlMzJfdG9fY3B1KG1waV9yZXF1ZXN0LT5CdWZmZXJMZW5ndGgpKSk7CkBAIC0xNDE0LDEwICsxNDkzLDEwIEBACiAJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykgewogCQlpb2MtPmRpYWdfYnVmZmVyX3N0YXR1c1tidWZmZXJfdHlwZV0gfD0KIAkJCU1QVDJfRElBR19CVUZGRVJfSVNfUkVHSVNURVJFRDsKLQkJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IHN1Y2Nlc3NcbiIsCisJCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IHN1Y2Nlc3NcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogaW9jX3N0YXR1cygweCUwNHgpICIKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBpb2Nfc3RhdHVzKDB4JTA0eCkgIgogCQkgICAgImxvZ19pbmZvKDB4JTA4eClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJCSAgICBpb2Nfc3RhdHVzLCBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pKTsKIAkJcmMgPSAtRUZBVUxUOwpAQCAtMTU0MSw3ICsxNjIwLDcgQEAKIAlpZiAoX2N0bF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NfbnVtYmVyLCAmaW9jKSA9PSAtMSB8fCAhaW9jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCiAJYnVmZmVyX3R5cGUgPSBrYXJnLnVuaXF1ZV9pZCAmIDB4MDAwMDAwZmY7CkBAIC0xNjExLDcgKzE2OTAsNyBAQAogCWlmIChfY3RsX3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAlrYXJnLmFwcGxpY2F0aW9uX2ZsYWdzID0gMDsKQEAgLTE2ODksNyArMTc2OCw3IEBACiAJaW50IHJjOwogCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAKLQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlc1xuIiwgaW9jLT5uYW1lLAorCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCXJjID0gMDsKQEAgLTE2OTcsNyArMTc3Niw3IEBACiAKIAlpb2Nfc3RhdGUgPSBtcHQyc2FzX2Jhc2VfZ2V0X2lvY3N0YXRlKGlvYywgMSk7CiAJaWYgKGlvY19zdGF0ZSAhPSBNUEkyX0lPQ19TVEFURV9PUEVSQVRJT05BTCkgewotCQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogIgorCQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiAiCiAJCSAgICAic2tpcHBpbmcgZHVlIHRvIEZBVUxUIHN0YXRlXG4iLCBpb2MtPm5hbWUsCiAJCSAgICBfX2Z1bmNfXykpOwogCQlyYyA9IC1FQUdBSU47CkBAIC0xNzU5LDEwICsxODM4LDEwIEBACiAJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykgewogCQlpb2MtPmRpYWdfYnVmZmVyX3N0YXR1c1tidWZmZXJfdHlwZV0gfD0KIAkJICAgIE1QVDJfRElBR19CVUZGRVJfSVNfUkVMRUFTRUQ7Ci0JCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiBzdWNjZXNzXG4iLAorCQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBzdWNjZXNzXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGlvY19zdGF0dXMoMHglMDR4KSAiCisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaW9jX3N0YXR1cygweCUwNHgpICIKIAkJICAgICJsb2dfaW5mbygweCUwOHgpXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLAogCQkgICAgaW9jX3N0YXR1cywgbGUzMl90b19jcHUobXBpX3JlcGx5LT5JT0NMb2dJbmZvKSk7CiAJCXJjID0gLUVGQVVMVDsKQEAgLTE4MDAsNyArMTg3OSw3IEBACiAJaWYgKF9jdGxfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jX251bWJlciwgJmlvYykgPT0gLTEgfHwgIWlvYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlc1xuIiwgaW9jLT5uYW1lLAorCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAogCWJ1ZmZlcl90eXBlID0ga2FyZy51bmlxdWVfaWQgJiAweDAwMDAwMGZmOwpAQCAtMTg5Niw3ICsxOTc1LDcgQEAKIAlpZiAoX2N0bF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NfbnVtYmVyLCAmaW9jKSA9PSAtMSB8fCAhaW9jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCiAJYnVmZmVyX3R5cGUgPSBrYXJnLnVuaXF1ZV9pZCAmIDB4MDAwMDAwZmY7CkBAIC0xOTI3LDcgKzIwMDYsNyBAQAogCX0KIAogCWRpYWdfZGF0YSA9ICh2b2lkICopKHJlcXVlc3RfZGF0YSArIGthcmcuc3RhcnRpbmdfb2Zmc2V0KTsKLQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZGlhZ19idWZmZXIoJXApLCAiCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZGlhZ19idWZmZXIoJXApLCAiCiAJICAgICJvZmZzZXQoJWQpLCBzeiglZClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJICAgIGRpYWdfZGF0YSwga2FyZy5zdGFydGluZ19vZmZzZXQsIGthcmcuYnl0ZXNfdG9fcmVhZCkpOwogCkBAIC0xOTQyLDExICsyMDIxLDExIEBACiAJaWYgKChrYXJnLmZsYWdzICYgTVBUMl9GTEFHU19SRVJFR0lTVEVSKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiBSZXJlZ2lzdGVyICIKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBSZXJlZ2lzdGVyICIKIAkJImJ1ZmZlcl90eXBlKDB4JTAyeClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sIGJ1ZmZlcl90eXBlKSk7CiAJaWYgKChpb2MtPmRpYWdfYnVmZmVyX3N0YXR1c1tidWZmZXJfdHlwZV0gJgogCSAgICBNUFQyX0RJQUdfQlVGRkVSX0lTX1JFTEVBU0VEKSA9PSAwKSB7Ci0JCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICIKIAkJICAgICJidWZmZXJfdHlwZSgweCUwMngpIGlzIHN0aWxsIHJlZ2lzdGVyZWRcbiIsIGlvYy0+bmFtZSwKIAkJICAgICBfX2Z1bmNfXywgYnVmZmVyX3R5cGUpKTsKIAkJcmV0dXJuIDA7CkBAIC0yMDIwLDEwICsyMDk5LDEwIEBACiAJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykgewogCQlpb2MtPmRpYWdfYnVmZmVyX3N0YXR1c1tidWZmZXJfdHlwZV0gfD0KIAkJICAgIE1QVDJfRElBR19CVUZGRVJfSVNfUkVHSVNURVJFRDsKLQkJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IHN1Y2Nlc3NcbiIsCisJCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IHN1Y2Nlc3NcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogaW9jX3N0YXR1cygweCUwNHgpICIKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBpb2Nfc3RhdHVzKDB4JTA0eCkgIgogCQkgICAgImxvZ19pbmZvKDB4JTA4eClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJCSAgICBpb2Nfc3RhdHVzLCBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pKTsKIAkJcmMgPSAtRUZBVUxUOwpAQCAtMjA3Nyw3ICsyMTU2LDcgQEAKIAkJICAgICFpb2MpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKKwkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAogCQlpZiAoX0lPQ19TSVpFKGNtZCkgPT0gc2l6ZW9mKHN0cnVjdCBtcHQyX2lvY3RsX2NvbW1hbmQpKSB7CkBAIC0yMTQwLDcgKzIyMTksNyBAQAogCQkgICAgIWlvYykKIAkJCXJldHVybiAtRU5PREVWOwogCi0JCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCiAJCSAgICAidW5zdXBwb3J0ZWQgaW9jdGwgb3Bjb2RlKDB4JTA4eClcbiIsIGlvYy0+bmFtZSwgY21kKSk7CiAJCWJyZWFrOwogCX0KQEAgLTIxOTYsNyArMjI3NSw3IEBACiAJaWYgKF9jdGxfdmVyaWZ5X2FkYXB0ZXIoa2FyZzMyLmhkci5pb2NfbnVtYmVyLCAmaW9jKSA9PSAtMSB8fCAhaW9jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCW1lbXNldCgma2FyZywgMCwgc2l6ZW9mKHN0cnVjdCBtcHQyX2lvY3RsX2NvbW1hbmQpKTsKQEAgLTI1ODEsNiArMjY2MCwyMTggQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihmd2ZhdWx0X2RlYnVnLCBTX0lSVUdPIHwgU19JV1VTUiwKICAgICBfY3RsX2Z3ZmF1bHRfZGVidWdfc2hvdywgX2N0bF9md2ZhdWx0X2RlYnVnX3N0b3JlKTsKIAorCisvKioKKyAqIF9jdGxfaW9jX3Jlc2V0X2NvdW50X3Nob3cgLSBpb2MgcmVzZXQgY291bnQKKyAqIEBjZGV2IC0gcG9pbnRlciB0byBlbWJlZGRlZCBjbGFzcyBkZXZpY2UKKyAqIEBidWYgLSB0aGUgYnVmZmVyIHJldHVybmVkCisgKgorICogVGhpcyBpcyBmaXJtd2FyZSBxdWV1ZSBkZXB0aCBsaW1pdAorICoKKyAqIEEgc3lzZnMgJ3JlYWQtb25seScgc2hvc3QgYXR0cmlidXRlLgorICovCitzdGF0aWMgc3NpemVfdAorX2N0bF9pb2NfcmVzZXRfY291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwOGRcbiIsIGlvYy0+aW9jX3Jlc2V0X2NvdW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihpb2NfcmVzZXRfY291bnQsIFNfSVJVR08sCisgICAgX2N0bF9pb2NfcmVzZXRfY291bnRfc2hvdywgTlVMTCk7CisKK3N0cnVjdCBESUFHX0JVRkZFUl9TVEFSVCB7CisJdTMyIFNpemU7CisJdTMyIERpYWdWZXJzaW9uOworCXU4IEJ1ZmZlclR5cGU7CisJdTggUmVzZXJ2ZWRbM107CisJdTMyIFJlc2VydmVkMTsKKwl1MzIgUmVzZXJ2ZWQyOworCXUzMiBSZXNlcnZlZDM7Cit9OworLyoqCisgKiBfY3RsX2hvc3RfdHJhY2VfYnVmZmVyX3NpemVfc2hvdyAtIGhvc3QgYnVmZmVyIHNpemUgKHRyYWNlIG9ubHkpCisgKiBAY2RldiAtIHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmIC0gdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIEEgc3lzZnMgJ3JlYWQtb25seScgc2hvc3QgYXR0cmlidXRlLgorICovCitzdGF0aWMgc3NpemVfdAorX2N0bF9ob3N0X3RyYWNlX2J1ZmZlcl9zaXplX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKyAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CisJdTMyIHNpemUgPSAwOworCXN0cnVjdCBESUFHX0JVRkZFUl9TVEFSVCAqcmVxdWVzdF9kYXRhOworCisJaWYgKCFpb2MtPmRpYWdfYnVmZmVyW01QSTJfRElBR19CVUZfVFlQRV9UUkFDRV0pIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGhvc3RfdHJhY2VfYnVmZmVyIGlzIG5vdCAiCisJCSAgICAicmVnaXN0ZXJlZFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoaW9jLT5kaWFnX2J1ZmZlcl9zdGF0dXNbTVBJMl9ESUFHX0JVRl9UWVBFX1RSQUNFXSAmCisJICAgIE1QVDJfRElBR19CVUZGRVJfSVNfUkVHSVNURVJFRCkgPT0gMCkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogaG9zdF90cmFjZV9idWZmZXIgaXMgbm90ICIKKwkJICAgICJyZWdpc3RlcmVkXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVxdWVzdF9kYXRhID0gKHN0cnVjdCBESUFHX0JVRkZFUl9TVEFSVCAqKQorCSAgICBpb2MtPmRpYWdfYnVmZmVyW01QSTJfRElBR19CVUZfVFlQRV9UUkFDRV07CisJaWYgKChsZTMyX3RvX2NwdShyZXF1ZXN0X2RhdGEtPkRpYWdWZXJzaW9uKSA9PSAweDAwMDAwMDAwIHx8CisJICAgIGxlMzJfdG9fY3B1KHJlcXVlc3RfZGF0YS0+RGlhZ1ZlcnNpb24pID09IDB4MDEwMDAwMDApICYmCisJICAgIGxlMzJfdG9fY3B1KHJlcXVlc3RfZGF0YS0+UmVzZXJ2ZWQzKSA9PSAweDQ3NDI0NDRjKQorCQlzaXplID0gbGUzMl90b19jcHUocmVxdWVzdF9kYXRhLT5TaXplKTsKKworCWlvYy0+cmluZ19idWZmZXJfc3ogPSBzaXplOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzaXplKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihob3N0X3RyYWNlX2J1ZmZlcl9zaXplLCBTX0lSVUdPLAorCSBfY3RsX2hvc3RfdHJhY2VfYnVmZmVyX3NpemVfc2hvdywgTlVMTCk7CisKKy8qKgorICogX2N0bF9ob3N0X3RyYWNlX2J1ZmZlcl9zaG93IC0gZmlybXdhcmUgcmluZyBidWZmZXIgKHRyYWNlIG9ubHkpCisgKiBAY2RldiAtIHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmIC0gdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIEEgc3lzZnMgJ3JlYWQvd3JpdGUnIHNob3N0IGF0dHJpYnV0ZS4KKyAqCisgKiBZb3Ugd2lsbCBvbmx5IGJlIGFibGUgdG8gcmVhZCA0ayBieXRlcyBvZiByaW5nIGJ1ZmZlciBhdCBhIHRpbWUuCisgKiBJbiBvcmRlciB0byByZWFkIGJleW9uZCA0ayBieXRlcywgeW91IHdpbGwgaGF2ZSB0byB3cml0ZSBvdXQgdGhlCisgKiBvZmZzZXQgdG8gdGhlIHNhbWUgYXR0cmlidXRlLCBpdCB3aWxsIG1vdmUgdGhlIHBvaW50ZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitfY3RsX2hvc3RfdHJhY2VfYnVmZmVyX3Nob3coc3RydWN0IGRldmljZSAqY2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCXZvaWQgKnJlcXVlc3RfZGF0YTsKKwl1MzIgc2l6ZTsKKworCWlmICghaW9jLT5kaWFnX2J1ZmZlcltNUEkyX0RJQUdfQlVGX1RZUEVfVFJBQ0VdKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBob3N0X3RyYWNlX2J1ZmZlciBpcyBub3QgIgorCQkgICAgInJlZ2lzdGVyZWRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGlvYy0+ZGlhZ19idWZmZXJfc3RhdHVzW01QSTJfRElBR19CVUZfVFlQRV9UUkFDRV0gJgorCSAgICBNUFQyX0RJQUdfQlVGRkVSX0lTX1JFR0lTVEVSRUQpID09IDApIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGhvc3RfdHJhY2VfYnVmZmVyIGlzIG5vdCAiCisJCSAgICAicmVnaXN0ZXJlZFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpb2MtPnJpbmdfYnVmZmVyX29mZnNldCA+IGlvYy0+cmluZ19idWZmZXJfc3opCisJCXJldHVybiAwOworCisJc2l6ZSA9IGlvYy0+cmluZ19idWZmZXJfc3ogLSBpb2MtPnJpbmdfYnVmZmVyX29mZnNldDsKKwlzaXplID0gKHNpemUgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogc2l6ZTsKKwlyZXF1ZXN0X2RhdGEgPSBpb2MtPmRpYWdfYnVmZmVyWzBdICsgaW9jLT5yaW5nX2J1ZmZlcl9vZmZzZXQ7CisJbWVtY3B5KGJ1ZiwgcmVxdWVzdF9kYXRhLCBzaXplKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QKK19jdGxfaG9zdF90cmFjZV9idWZmZXJfc3RvcmUoc3RydWN0IGRldmljZSAqY2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlpbnQgdmFsID0gMDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdmFsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlvYy0+cmluZ19idWZmZXJfb2Zmc2V0ID0gdmFsOworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihob3N0X3RyYWNlX2J1ZmZlciwgU19JUlVHTyB8IFNfSVdVU1IsCisgICAgX2N0bF9ob3N0X3RyYWNlX2J1ZmZlcl9zaG93LCBfY3RsX2hvc3RfdHJhY2VfYnVmZmVyX3N0b3JlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIF9jdGxfaG9zdF90cmFjZV9idWZmZXJfZW5hYmxlX3Nob3cgLSBmaXJtd2FyZSByaW5nIGJ1ZmZlciAodHJhY2Ugb25seSkKKyAqIEBjZGV2IC0gcG9pbnRlciB0byBlbWJlZGRlZCBjbGFzcyBkZXZpY2UKKyAqIEBidWYgLSB0aGUgYnVmZmVyIHJldHVybmVkCisgKgorICogQSBzeXNmcyAncmVhZC93cml0ZScgc2hvc3QgYXR0cmlidXRlLgorICoKKyAqIFRoaXMgaXMgYSBtZWNobmlzbSB0byBwb3N0L3JlbGVhc2UgaG9zdF90cmFjZV9idWZmZXJzCisgKi8KK3N0YXRpYyBzc2l6ZV90CitfY3RsX2hvc3RfdHJhY2VfYnVmZmVyX2VuYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmNkZXYsCisgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJaWYgKCghaW9jLT5kaWFnX2J1ZmZlcltNUEkyX0RJQUdfQlVGX1RZUEVfVFJBQ0VdKSB8fAorCSAgICgoaW9jLT5kaWFnX2J1ZmZlcl9zdGF0dXNbTVBJMl9ESUFHX0JVRl9UWVBFX1RSQUNFXSAmCisJICAgIE1QVDJfRElBR19CVUZGRVJfSVNfUkVHSVNURVJFRCkgPT0gMCkpCisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm9mZlxuIik7CisJZWxzZSBpZiAoKGlvYy0+ZGlhZ19idWZmZXJfc3RhdHVzW01QSTJfRElBR19CVUZfVFlQRV9UUkFDRV0gJgorCSAgICBNUFQyX0RJQUdfQlVGRkVSX0lTX1JFTEVBU0VEKSkKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAicmVsZWFzZVxuIik7CisJZWxzZQorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJwb3N0XG4iKTsKK30KKworc3RhdGljIHNzaXplX3QKK19jdGxfaG9zdF90cmFjZV9idWZmZXJfZW5hYmxlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNkZXYsCisgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CisJY2hhciBzdHJbMTBdID0gIiI7CisJc3RydWN0IG1wdDJfZGlhZ19yZWdpc3RlciBkaWFnX3JlZ2lzdGVyOworCXU4IGlzc3VlX3Jlc2V0ID0gMDsKKworCWlmIChzc2NhbmYoYnVmLCAiJXMiLCBzdHIpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzdHJjbXAoc3RyLCAicG9zdCIpKSB7CisJCS8qIGV4aXQgb3V0IGlmIGhvc3QgYnVmZmVycyBhcmUgYWxyZWFkeSBwb3N0ZWQgKi8KKwkJaWYgKChpb2MtPmRpYWdfYnVmZmVyW01QSTJfRElBR19CVUZfVFlQRV9UUkFDRV0pICYmCisJCSAgICAoaW9jLT5kaWFnX2J1ZmZlcl9zdGF0dXNbTVBJMl9ESUFHX0JVRl9UWVBFX1RSQUNFXSAmCisJCSAgICBNUFQyX0RJQUdfQlVGRkVSX0lTX1JFR0lTVEVSRUQpICYmCisJCSAgICAoKGlvYy0+ZGlhZ19idWZmZXJfc3RhdHVzW01QSTJfRElBR19CVUZfVFlQRV9UUkFDRV0gJgorCQkgICAgTVBUMl9ESUFHX0JVRkZFUl9JU19SRUxFQVNFRCkgPT0gMCkpCisJCQlnb3RvIG91dDsKKwkJbWVtc2V0KCZkaWFnX3JlZ2lzdGVyLCAwLCBzaXplb2Yoc3RydWN0IG1wdDJfZGlhZ19yZWdpc3RlcikpOworCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9zdGluZyBob3N0IHRyYWNlIGJ1ZmZlcnNcbiIsCisJCSAgICBpb2MtPm5hbWUpOworCQlkaWFnX3JlZ2lzdGVyLmJ1ZmZlcl90eXBlID0gTVBJMl9ESUFHX0JVRl9UWVBFX1RSQUNFOworCQlkaWFnX3JlZ2lzdGVyLnJlcXVlc3RlZF9idWZmZXJfc2l6ZSA9ICgxMDI0ICogMTAyNCk7CisJCWRpYWdfcmVnaXN0ZXIudW5pcXVlX2lkID0gMHg3MDc1OTAwOworCQlpb2MtPmRpYWdfYnVmZmVyX3N0YXR1c1tNUEkyX0RJQUdfQlVGX1RZUEVfVFJBQ0VdID0gMDsKKwkJX2N0bF9kaWFnX3JlZ2lzdGVyXzIoaW9jLCAgJmRpYWdfcmVnaXN0ZXIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyZWxlYXNlIikpIHsKKwkJLyogZXhpdCBvdXQgaWYgaG9zdCBidWZmZXJzIGFyZSBhbHJlYWR5IHJlbGVhc2VkICovCisJCWlmICghaW9jLT5kaWFnX2J1ZmZlcltNUEkyX0RJQUdfQlVGX1RZUEVfVFJBQ0VdKQorCQkJZ290byBvdXQ7CisJCWlmICgoaW9jLT5kaWFnX2J1ZmZlcl9zdGF0dXNbTVBJMl9ESUFHX0JVRl9UWVBFX1RSQUNFXSAmCisJCSAgICBNUFQyX0RJQUdfQlVGRkVSX0lTX1JFR0lTVEVSRUQpID09IDApCisJCQlnb3RvIG91dDsKKwkJaWYgKChpb2MtPmRpYWdfYnVmZmVyX3N0YXR1c1tNUEkyX0RJQUdfQlVGX1RZUEVfVFJBQ0VdICYKKwkJICAgIE1QVDJfRElBR19CVUZGRVJfSVNfUkVMRUFTRUQpKQorCQkJZ290byBvdXQ7CisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZWxlYXNpbmcgaG9zdCB0cmFjZSBidWZmZXJcbiIsCisJCSAgICBpb2MtPm5hbWUpOworCQlfY3RsX3NlbmRfcmVsZWFzZShpb2MsIE1QSTJfRElBR19CVUZfVFlQRV9UUkFDRSwgJmlzc3VlX3Jlc2V0KTsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorc3RhdGljIERFVklDRV9BVFRSKGhvc3RfdHJhY2VfYnVmZmVyX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCisgICAgX2N0bF9ob3N0X3RyYWNlX2J1ZmZlcl9lbmFibGVfc2hvdywgX2N0bF9ob3N0X3RyYWNlX2J1ZmZlcl9lbmFibGVfc3RvcmUpOworCiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbXB0MnNhc19ob3N0X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3ZlcnNpb25fZncsCiAJJmRldl9hdHRyX3ZlcnNpb25fYmlvcywKQEAgLTI1OTcsNiArMjg4OCwxMCBAQAogCSZkZXZfYXR0cl9md2ZhdWx0X2RlYnVnLAogCSZkZXZfYXR0cl9md19xdWV1ZV9kZXB0aCwKIAkmZGV2X2F0dHJfaG9zdF9zYXNfYWRkcmVzcywKKwkmZGV2X2F0dHJfaW9jX3Jlc2V0X2NvdW50LAorCSZkZXZfYXR0cl9ob3N0X3RyYWNlX2J1ZmZlcl9zaXplLAorCSZkZXZfYXR0cl9ob3N0X3RyYWNlX2J1ZmZlciwKKwkmZGV2X2F0dHJfaG9zdF90cmFjZV9idWZmZXJfZW5hYmxlLAogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKaW5kZXggYzVmZjI2YS4uMTZlOTliNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYwpAQCAtNzAsNiArNzAsOCBAQAogICAgIHN0cnVjdCBfc2FzX25vZGUgKnNhc19leHBhbmRlcik7CiBzdGF0aWMgdm9pZCBfZmlybXdhcmVfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCitzdGF0aWMgdTggX3Njc2loX2NoZWNrX2Zvcl9wZW5kaW5nX3RtKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpOworCiAvKiBnbG9iYWwgcGFyYW1ldGVycyAqLwogTElTVF9IRUFEKG1wdDJzYXNfaW9jX2xpc3QpOwogCkBAIC04NCw2ICs4Niw3IEBACiBzdGF0aWMgaW50IG1wdF9pZHM7CiAKIHN0YXRpYyB1OCB0bV90cl9jYl9pZHggPSAtMSA7CitzdGF0aWMgdTggdG1fdHJfdm9sdW1lX2NiX2lkeCA9IC0xIDsKIHN0YXRpYyB1OCB0bV9zYXNfY29udHJvbF9jYl9pZHggPSAtMTsKIAogLyogY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KQEAgLTIyMyw5ICsyMjYsMTIgQEAKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAogCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNiwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfNywKKwkvKiBNdXN0YW5nIH4gMjMwOCAqLworCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIzMDhfMSwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgTVBJMl9NRkdQQUdFX1ZFTkRPUklEX0xTSSwgTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIyMDhfOCwKKwl7IE1QSTJfTUZHUEFHRV9WRU5ET1JJRF9MU0ksIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMzA4XzIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IE1QSTJfTUZHUEFHRV9WRU5ET1JJRF9MU0ksIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMzA4XzMsCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKIAl7MH0JLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CkBAIC00MzIsNyArNDM4LDcgQEAKIAkJICAgIChpb2MtPmJpb3NfcGcyLlJlcUJvb3REZXZpY2VGb3JtICYKIAkJICAgIE1QSTJfQklPU1BBR0UyX0ZPUk1fTUFTSyksCiAJCSAgICAmaW9jLT5iaW9zX3BnMi5SZXF1ZXN0ZWRCb290RGV2aWNlKSkgewotCQkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJCSAgICIlczogcmVxX2Jvb3RfZGV2aWNlKDB4JTAxNmxseClcbiIsCiAJCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhc19hZGRyZXNzKSk7CkBAIC00NDcsNyArNDUzLDcgQEAKIAkJICAgIChpb2MtPmJpb3NfcGcyLlJlcUFsdEJvb3REZXZpY2VGb3JtICYKIAkJICAgIE1QSTJfQklPU1BBR0UyX0ZPUk1fTUFTSyksCiAJCSAgICAmaW9jLT5iaW9zX3BnMi5SZXF1ZXN0ZWRBbHRCb290RGV2aWNlKSkgewotCQkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJCSAgICIlczogcmVxX2FsdF9ib290X2RldmljZSgweCUwMTZsbHgpXG4iLAogCQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcykpOwpAQCAtNDYyLDcgKzQ2OCw3IEBACiAJCSAgICAoaW9jLT5iaW9zX3BnMi5DdXJyZW50Qm9vdERldmljZUZvcm0gJgogCQkgICAgTVBJMl9CSU9TUEFHRTJfRk9STV9NQVNLKSwKIAkJICAgICZpb2MtPmJpb3NfcGcyLkN1cnJlbnRCb290RGV2aWNlKSkgewotCQkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJCSAgICIlczogY3VycmVudF9ib290X2RldmljZSgweCUwMTZsbHgpXG4iLAogCQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcykpOwpAQCAtNTYzLDcgKzU2OSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiBoYW5kbGUiCisJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaGFuZGxlIgogCSAgICAiKDB4JTA0eCksIHNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJICAgIHNhc19kZXZpY2UtPmhhbmRsZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcykpOwogCkBAIC01OTAsNyArNTk2LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXM6IGhhbmRsZSIKKwlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBoYW5kbGUiCiAJICAgICIoMHglMDR4KSwgc2FzX2FkZHIoMHglMDE2bGx4KVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywKIAkgICAgc2FzX2RldmljZS0+aGFuZGxlLCAodW5zaWduZWQgbG9uZyBsb25nKXNhc19kZXZpY2UtPnNhc19hZGRyZXNzKSk7CiAKQEAgLTY5Miw3ICs2OTgsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogaGFuZGxlIgorCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhhbmRsZSIKIAkgICAgIigweCUwNHgpLCB3d2lkKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sCiAJICAgIHJhaWRfZGV2aWNlLT5oYW5kbGUsICh1bnNpZ25lZCBsb25nIGxvbmcpcmFpZF9kZXZpY2UtPnd3aWQpKTsKIApAQCAtMTIyMyw3ICsxMjI5LDcgQEAKIAkJc2FzX2RldmljZS0+c3RhcmdldCA9IHN0YXJnZXQ7CiAJCXNhc19kZXZpY2UtPmlkID0gc3RhcmdldC0+aWQ7CiAJCXNhc19kZXZpY2UtPmNoYW5uZWwgPSBzdGFyZ2V0LT5jaGFubmVsOwotCQlpZiAoc2FzX2RldmljZS0+aGlkZGVuX3JhaWRfY29tcG9uZW50KQorCQlpZiAodGVzdF9iaXQoc2FzX2RldmljZS0+aGFuZGxlLCBpb2MtPnBkX2hhbmRsZXMpKQogCQkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmZsYWdzIHw9CiAJCQkgICAgTVBUX1RBUkdFVF9GTEFHU19SQUlEX0NPTVBPTkVOVDsKIAl9CkBAIC0xNzQ2LDkgKzE3NTIsMTAgQEAKIAkJfQogCiAJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwgIiVzOiBoYW5kbGUoMHglMDR4KSwgIgotCQkgICAgInNhc19hZGRyKDB4JTAxNmxseCksIGRldmljZV9uYW1lKDB4JTAxNmxseClcbiIsCisJCSAgICAic2FzX2FkZHIoMHglMDE2bGx4KSwgcGh5KCVkKSwgZGV2aWNlX25hbWUoMHglMDE2bGx4KVxuIiwKIAkJICAgIGRzLCBzYXNfZGV2aWNlLT5oYW5kbGUsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAorCQkgICAgc2FzX2RldmljZS0+cGh5LAogCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfZGV2aWNlLT5kZXZpY2VfbmFtZSk7CiAJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwgIiVzOiAiCiAJCSAgICAiZW5jbG9zdXJlX2xvZ2ljYWxfaWQoMHglMDE2bGx4KSwgc2xvdCglZClcbiIsIGRzLApAQCAtMTk5MCw3ICsxOTk3LDggQEAKIAkJZ290byBlcnJfb3V0OwogCX0KIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cmVtb3ZlX2hvc3QpIHsKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8CisJICAgIGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CiAJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCByZXNldCBpbiBwcm9ncmVzcyFcbiIsCiAJCSAgICBfX2Z1bmNfXywgaW9jLT5uYW1lKTsKIAkJcmMgPSBGQUlMRUQ7CkBAIC0xOTk5LDcgKzIwMDcsNyBAQAogCiAJaW9jX3N0YXRlID0gbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDApOwogCWlmIChpb2Nfc3RhdGUgJiBNUEkyX0RPT1JCRUxMX1VTRUQpIHsKLQkJZGhzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJ1bmV4cGVjdGVkIGRvb3JiZWxsICIKKwkJZGhzcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInVuZXhwZWN0ZWQgZG9vcmJlbGwgIgogCQkgICAgImFjdGl2ZSFcbiIsIGlvYy0+bmFtZSkpOwogCQltcHQyc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAogCQkgICAgRk9SQ0VfQklHX0hBTU1FUik7CkBAIC0yMTE2LDggKzIxMjQsNTkgQEAKIH0KIAogLyoqCisgKiBfc2NzaWhfdG1fZGlzcGxheV9pbmZvIC0gZGlzcGxheXMgaW5mbyBhYm91dCB0aGUgZGV2aWNlCisgKiBAaW9jOiBwZXIgYWRhcHRlciBzdHJ1Y3QKKyAqIEBzY21kOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKKyAqCisgKiBDYWxsZWQgYnkgdGFzayBtYW5hZ2VtZW50IGNhbGxiYWNrIGhhbmRsZXJzLgorICovCitzdGF0aWMgdm9pZAorX3Njc2loX3RtX2Rpc3BsYXlfaW5mbyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NtZC0+ZGV2aWNlLT5zZGV2X3RhcmdldDsKKwlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnByaXZfdGFyZ2V0ID0gc3RhcmdldC0+aG9zdGRhdGE7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwcml2X3RhcmdldCkKKwkJcmV0dXJuOworCisJc2NzaV9wcmludF9jb21tYW5kKHNjbWQpOworCWlmIChwcml2X3RhcmdldC0+ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1ZPTFVNRSkgeworCQlzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHN0YXJnZXQsICJ2b2x1bWUgaGFuZGxlKDB4JTA0eCksICIKKwkJICAgICJ2b2x1bWUgd3dpZCgweCUwMTZsbHgpXG4iLAorCQkgICAgcHJpdl90YXJnZXQtPmhhbmRsZSwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJpdl90YXJnZXQtPnNhc19hZGRyZXNzKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJc2FzX2RldmljZSA9IG1wdDJzYXNfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X3Nhc19hZGRyZXNzKGlvYywKKwkJICAgIHByaXZfdGFyZ2V0LT5zYXNfYWRkcmVzcyk7CisJCWlmIChzYXNfZGV2aWNlKSB7CisJCQlpZiAocHJpdl90YXJnZXQtPmZsYWdzICYKKwkJCSAgICBNUFRfVEFSR0VUX0ZMQUdTX1JBSURfQ09NUE9ORU5UKSB7CisJCQkJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzdGFyZ2V0LAorCQkJCSAgICAidm9sdW1lIGhhbmRsZSgweCUwNHgpLCAiCisJCQkJICAgICJ2b2x1bWUgd3dpZCgweCUwMTZsbHgpXG4iLAorCQkJCSAgICBzYXNfZGV2aWNlLT52b2x1bWVfaGFuZGxlLAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FzX2RldmljZS0+dm9sdW1lX3d3aWQpOworCQkJfQorCQkJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzdGFyZ2V0LAorCQkJICAgICJoYW5kbGUoMHglMDR4KSwgc2FzX2FkZHJlc3MoMHglMDE2bGx4KSwgcGh5KCVkKVxuIiwKKwkJCSAgICBzYXNfZGV2aWNlLT5oYW5kbGUsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcywKKwkJCSAgICBzYXNfZGV2aWNlLT5waHkpOworCQkJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzdGFyZ2V0LAorCQkJICAgICJlbmNsb3N1cmVfbG9naWNhbF9pZCgweCUwMTZsbHgpLCBzbG90KCVkKVxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FzX2RldmljZS0+ZW5jbG9zdXJlX2xvZ2ljYWxfaWQsCisJCQkgICAgc2FzX2RldmljZS0+c2xvdCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qKgogICogX3Njc2loX2Fib3J0IC0gZWggdGhyZWFkcyBtYWluIGFib3J0IHJvdXRpbmUKLSAqIEBzZGV2OiBzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEBzY21kOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKICAqCiAgKiBSZXR1cm5zIFNVQ0NFU1MgaWYgY29tbWFuZCBhYm9ydGVkIGVsc2UgRkFJTEVECiAgKi8KQEAgLTIxMzAsMTQgKzIxODksMTQgQEAKIAl1MTYgaGFuZGxlOwogCWludCByOwogCi0JcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImF0dGVtcHRpbmcgdGFzayBhYm9ydCEgc2NtZCglcClcbiIsCi0JICAgIGlvYy0+bmFtZSwgc2NtZCk7Ci0Jc2NzaV9wcmludF9jb21tYW5kKHNjbWQpOworCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2NtZC0+ZGV2aWNlLCAiYXR0ZW1wdGluZyB0YXNrIGFib3J0ISAiCisJICAgICJzY21kKCVwKVxuIiwgc2NtZCk7CisJX3Njc2loX3RtX2Rpc3BsYXlfaW5mbyhpb2MsIHNjbWQpOwogCiAJc2FzX2RldmljZV9wcml2X2RhdGEgPSBzY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCWlmICghc2FzX2RldmljZV9wcml2X2RhdGEgfHwgIXNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0KSB7Ci0JCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJkZXZpY2UgYmVlbiBkZWxldGVkISBzY21kKCVwKVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgc2NtZCk7CisJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2NtZC0+ZGV2aWNlLCAiZGV2aWNlIGJlZW4gZGVsZXRlZCEgIgorCQkgICAgInNjbWQoJXApXG4iLCBzY21kKTsKIAkJc2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCXNjbWQtPnNjc2lfZG9uZShzY21kKTsKIAkJciA9IFNVQ0NFU1M7CkBAIC0yMTY5LDE0ICsyMjI4LDE0IEBACiAJICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0ssIHNtaWQsIDMwLCBzY21kKTsKIAogIG91dDoKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAidGFzayBhYm9ydDogJXMgc2NtZCglcClcbiIsCi0JICAgIGlvYy0+bmFtZSwgKChyID09IFNVQ0NFU1MpID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpLCBzY21kKTsKKwlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNjbWQtPmRldmljZSwgInRhc2sgYWJvcnQ6ICVzIHNjbWQoJXApXG4iLAorCSAgICAoKHIgPT0gU1VDQ0VTUykgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIiksIHNjbWQpOwogCXJldHVybiByOwogfQogCiAvKioKICAqIF9zY3NpaF9kZXZfcmVzZXQgLSBlaCB0aHJlYWRzIG1haW4gZGV2aWNlIHJlc2V0IHJvdXRpbmUKLSAqIEBzZGV2OiBzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEBzY21kOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKICAqCiAgKiBSZXR1cm5zIFNVQ0NFU1MgaWYgY29tbWFuZCBhYm9ydGVkIGVsc2UgRkFJTEVECiAgKi8KQEAgLTIxOTAsMTQgKzIyNDksMTYgQEAKIAl1MTYJaGFuZGxlOwogCWludCByOwogCi0JcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImF0dGVtcHRpbmcgZGV2aWNlIHJlc2V0ISBzY21kKCVwKVxuIiwKLQkgICAgaW9jLT5uYW1lLCBzY21kKTsKLQlzY3NpX3ByaW50X2NvbW1hbmQoc2NtZCk7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NtZC0+ZGV2aWNlLT5zZGV2X3RhcmdldDsKKworCXN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc3RhcmdldCwgImF0dGVtcHRpbmcgdGFyZ2V0IHJlc2V0ISAiCisJICAgICJzY21kKCVwKVxuIiwgc2NtZCk7CisJX3Njc2loX3RtX2Rpc3BsYXlfaW5mbyhpb2MsIHNjbWQpOwogCiAJc2FzX2RldmljZV9wcml2X2RhdGEgPSBzY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCWlmICghc2FzX2RldmljZV9wcml2X2RhdGEgfHwgIXNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0KSB7Ci0JCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJkZXZpY2UgYmVlbiBkZWxldGVkISBzY21kKCVwKVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgc2NtZCk7CisJCXN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc3RhcmdldCwgInRhcmdldCBiZWVuIGRlbGV0ZWQhICIKKwkJICAgICJzY21kKCVwKVxuIiwgc2NtZCk7CiAJCXNjbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQlzY21kLT5zY3NpX2RvbmUoc2NtZCk7CiAJCXIgPSBTVUNDRVNTOwpAQCAtMjIyOCwxNCArMjI4OSwxNCBAQAogCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9MT0dJQ0FMX1VOSVRfUkVTRVQsIDAsIDMwLCBzY21kKTsKIAogIG91dDoKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiZGV2aWNlIHJlc2V0OiAlcyBzY21kKCVwKVxuIiwKLQkgICAgaW9jLT5uYW1lLCAoKHIgPT0gU1VDQ0VTUykgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIiksIHNjbWQpOworCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2NtZC0+ZGV2aWNlLCAiZGV2aWNlIHJlc2V0OiAlcyBzY21kKCVwKVxuIiwKKwkgICAgKChyID09IFNVQ0NFU1MpID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpLCBzY21kKTsKIAlyZXR1cm4gcjsKIH0KIAogLyoqCiAgKiBfc2NzaWhfdGFyZ2V0X3Jlc2V0IC0gZWggdGhyZWFkcyBtYWluIHRhcmdldCByZXNldCByb3V0aW5lCi0gKiBAc2Rldjogc2NzaSBkZXZpY2Ugc3RydWN0CisgKiBAc2NtZDogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CiAgKgogICogUmV0dXJucyBTVUNDRVNTIGlmIGNvbW1hbmQgYWJvcnRlZCBlbHNlIEZBSUxFRAogICovCkBAIC0yMjQ4LDE1ICsyMzA5LDE2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYJaGFuZGxlOwogCWludCByOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNjbWQtPmRldmljZS0+c2Rldl90YXJnZXQ7CiAKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiYXR0ZW1wdGluZyB0YXJnZXQgcmVzZXQhIHNjbWQoJXApXG4iLAotCSAgICBpb2MtPm5hbWUsIHNjbWQpOwotCXNjc2lfcHJpbnRfY29tbWFuZChzY21kKTsKKwlzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHN0YXJnZXQsICJhdHRlbXB0aW5nIHRhcmdldCByZXNldCEgIgorCSAgICAic2NtZCglcClcbiIsIHNjbWQpOworCV9zY3NpaF90bV9kaXNwbGF5X2luZm8oaW9jLCBzY21kKTsKIAogCXNhc19kZXZpY2VfcHJpdl9kYXRhID0gc2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAlpZiAoIXNhc19kZXZpY2VfcHJpdl9kYXRhIHx8ICFzYXNfZGV2aWNlX3ByaXZfZGF0YS0+c2FzX3RhcmdldCkgewotCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAidGFyZ2V0IGJlZW4gZGVsZXRlZCEgc2NtZCglcClcbiIsCi0JCSAgICBpb2MtPm5hbWUsIHNjbWQpOworCQlzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHN0YXJnZXQsICJ0YXJnZXQgYmVlbiBkZWxldGVkISAiCisJCSAgICAic2NtZCglcClcbiIsIHNjbWQpOwogCQlzY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAkJc2NtZC0+c2NzaV9kb25lKHNjbWQpOwogCQlyID0gU1VDQ0VTUzsKQEAgLTIyODcsMTQgKzIzNDksMTQgQEAKIAkgICAgMzAsIHNjbWQpOwogCiAgb3V0OgotCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJ0YXJnZXQgcmVzZXQ6ICVzIHNjbWQoJXApXG4iLAotCSAgICBpb2MtPm5hbWUsICgociA9PSBTVUNDRVNTKSA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiKSwgc2NtZCk7CisJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzdGFyZ2V0LCAidGFyZ2V0IHJlc2V0OiAlcyBzY21kKCVwKVxuIiwKKwkgICAgKChyID09IFNVQ0NFU1MpID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpLCBzY21kKTsKIAlyZXR1cm4gcjsKIH0KIAogLyoqCiAgKiBfc2NzaWhfaG9zdF9yZXNldCAtIGVoIHRocmVhZHMgbWFpbiBob3N0IHJlc2V0IHJvdXRpbmUKLSAqIEBzZGV2OiBzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEBzY21kOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKICAqCiAgKiBSZXR1cm5zIFNVQ0NFU1MgaWYgY29tbWFuZCBhYm9ydGVkIGVsc2UgRkFJTEVECiAgKi8KQEAgLTI1NzksMjAgKzI2NDEsMzEgQEAKIAlNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVxdWVzdF90ICptcGlfcmVxdWVzdDsKIAl1MTYgc21pZDsKIAlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2U7CisJc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBfdHJfbGlzdCAqZGVsYXllZF90cjsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cmVtb3ZlX2hvc3QpIHsKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8CisJICAgIGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CiAJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgcmVzZXQgaW4gIgogCQkgICAicHJvZ3Jlc3MhXG4iLCBfX2Z1bmNfXywgaW9jLT5uYW1lKSk7CiAJCXJldHVybjsKIAl9CiAKKwkvKiBpZiBQRCwgdGhlbiByZXR1cm4gKi8KKwlpZiAodGVzdF9iaXQoaGFuZGxlLCBpb2MtPnBkX2hhbmRsZXMpKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAlzYXNfZGV2aWNlID0gX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOwotCWlmIChzYXNfZGV2aWNlICYmIHNhc19kZXZpY2UtPmhpZGRlbl9yYWlkX2NvbXBvbmVudCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJaWYgKHNhc19kZXZpY2UgJiYgc2FzX2RldmljZS0+c3RhcmdldCAmJgorCSAgICAgc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGEpIHsKKwkJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKKwkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJICAgICJzZXR0aW5nIGRlbGV0ZSBmbGFnOiBoYW5kbGUoMHglMDR4KSwgIgorCQkgICAgInNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwgaGFuZGxlLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MpKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIApAQCAtMjY1NSw2ICsyNzI4LDEwMSBAQAogfQogCiAvKioKKyAqIF9zY3NpaF90bV90cl92b2x1bWVfc2VuZCAtIHNlbmQgdGFyZ2V0IHJlc2V0IHJlcXVlc3QgZm9yIHZvbHVtZXMKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQGhhbmRsZTogZGV2aWNlIGhhbmRsZQorICogQ29udGV4dDogaW50ZXJydXB0IHRpbWUuCisgKgorICogVGhpcyBpcyBkZXNpZ25lZCB0byBzZW5kIG11bGlwbGUgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgYXQgdGhlIHNhbWUKKyAqIHRpbWUgdG8gdGhlIGZpZm8uIElmIHRoZSBmaWZvIGlzIGZ1bGwsIHdlIHdpbGwgYXBwZW5kIHRoZSByZXF1ZXN0LAorICogYW5kIHByb2Nlc3MgaXQgaW4gYSBmdXR1cmUgY29tcGxldGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19zY3NpaF90bV90cl92b2x1bWVfc2VuZChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpCit7CisJTXBpMlNDU0lUYXNrTWFuYWdlbWVudFJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CisJdTE2IHNtaWQ7CisJc3RydWN0IF90cl9saXN0ICpkZWxheWVkX3RyOworCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5yZW1vdmVfaG9zdCB8fAorCSAgICBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluICIKKwkJICAgInByb2dyZXNzIVxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSkpOworCQlyZXR1cm47CisJfQorCisJc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZF9ocHIoaW9jLCBpb2MtPnRtX3RyX3ZvbHVtZV9jYl9pZHgpOworCWlmICghc21pZCkgeworCQlkZWxheWVkX3RyID0ga3phbGxvYyhzaXplb2YoKmRlbGF5ZWRfdHIpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFkZWxheWVkX3RyKQorCQkJcmV0dXJuOworCQlJTklUX0xJU1RfSEVBRCgmZGVsYXllZF90ci0+bGlzdCk7CisJCWRlbGF5ZWRfdHItPmhhbmRsZSA9IGhhbmRsZTsKKwkJbGlzdF9hZGRfdGFpbCgmZGVsYXllZF90ci0+bGlzdCwgJmlvYy0+ZGVsYXllZF90cl92b2x1bWVfbGlzdCk7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAorCQkgICAgIkRFTEFZRUQ6dHI6aGFuZGxlKDB4JTA0eCksIChvcGVuKVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgaGFuZGxlKSk7CisJCXJldHVybjsKKwl9CisKKwlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInRyX3NlbmQ6aGFuZGxlKDB4JTA0eCksICIKKwkgICAgIihvcGVuKSwgc21pZCglZCksIGNiKCVkKVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUsIHNtaWQsCisJICAgIGlvYy0+dG1fdHJfdm9sdW1lX2NiX2lkeCkpOworCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKKwltZW1zZXQobXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVxdWVzdF90KSk7CisJbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVDsKKwltcGlfcmVxdWVzdC0+RGV2SGFuZGxlID0gY3B1X3RvX2xlMTYoaGFuZGxlKTsKKwltcGlfcmVxdWVzdC0+VGFza1R5cGUgPSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9UQVJHRVRfUkVTRVQ7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2hpX3ByaW9yaXR5KGlvYywgc21pZCk7Cit9CisKKy8qKgorICogX3Njc2loX3RtX3ZvbHVtZV90cl9jb21wbGV0ZSAtIHRhcmdldCByZXNldCBjb21wbGV0aW9uCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4CisgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKKyAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQorICogQ29udGV4dDogaW50ZXJydXB0IHRpbWUuCisgKgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB1OAorX3Njc2loX3RtX3ZvbHVtZV90cl9jb21wbGV0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLAorICAgIHU4IG1zaXhfaW5kZXgsIHUzMiByZXBseSkKK3sKKwl1MTYgaGFuZGxlOworCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0X3RtOworCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXBseV90ICptcGlfcmVwbHkgPQorCSAgICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKKworCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cmVtb3ZlX2hvc3QgfHwKKwkgICAgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCByZXNldCBpbiAiCisJCSAgICJwcm9ncmVzcyFcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbXBpX3JlcXVlc3RfdG0gPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWQpOworCWhhbmRsZSA9IGxlMTZfdG9fY3B1KG1waV9yZXF1ZXN0X3RtLT5EZXZIYW5kbGUpOworCWlmIChoYW5kbGUgIT0gbGUxNl90b19jcHUobXBpX3JlcGx5LT5EZXZIYW5kbGUpKSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoInNwdXJpb3VzIGludGVycnVwdDogIgorCQkgICAgImhhbmRsZSgweCUwNHg6MHglMDR4KSwgc21pZCglZCkhISFcbiIsIGhhbmRsZSwKKwkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+RGV2SGFuZGxlKSwgc21pZCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkgICAgInRyX2NvbXBsZXRlOmhhbmRsZSgweCUwNHgpLCAob3Blbikgc21pZCglZCksIGlvY19zdGF0dXMoMHglMDR4KSwgIgorCSAgICAibG9naW5mbygweCUwOHgpLCBjb21wbGV0ZWQoJWQpXG4iLCBpb2MtPm5hbWUsCisJICAgIGhhbmRsZSwgc21pZCwgbGUxNl90b19jcHUobXBpX3JlcGx5LT5JT0NTdGF0dXMpLAorCSAgICBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pLAorCSAgICBsZTMyX3RvX2NwdShtcGlfcmVwbHktPlRlcm1pbmF0aW9uQ291bnQpKSk7CisKKwlyZXR1cm4gX3Njc2loX2NoZWNrX2Zvcl9wZW5kaW5nX3RtKGlvYywgc21pZCk7Cit9CisKKy8qKgogICogX3Njc2loX3RtX3RyX2NvbXBsZXRlIC0KICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKQEAgLTI2ODAsOSArMjg0OCw5IEBACiAJICAgIG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCU1waTJTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90ICptcGlfcmVxdWVzdDsKIAl1MTYgc21pZF9zYXNfY3RybDsKLQlzdHJ1Y3QgX3RyX2xpc3QgKmRlbGF5ZWRfdHI7CiAKLQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0KSB7CisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5yZW1vdmVfaG9zdCB8fAorCSAgICBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgewogCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluICIKIAkJICAgInByb2dyZXNzIVxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSkpOwogCQlyZXR1cm4gMTsKQEAgLTI3MjEsNiArMjg4OSwzNSBAQAogCW1waV9yZXF1ZXN0LT5EZXZIYW5kbGUgPSBtcGlfcmVxdWVzdF90bS0+RGV2SGFuZGxlOwogCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZF9zYXNfY3RybCk7CiAKKwlyZXR1cm4gX3Njc2loX2NoZWNrX2Zvcl9wZW5kaW5nX3RtKGlvYywgc21pZCk7Cit9CisKKy8qKgorICogX3Njc2loX2NoZWNrX2Zvcl9wZW5kaW5nX3RtIC0gY2hlY2sgZm9yIHBlbmRpbmcgdGFzayBtYW5hZ2VtZW50CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4CisgKgorICogVGhpcyB3aWxsIGNoZWNrIGRlbGF5ZWQgdGFyZ2V0IHJlc2V0IGxpc3QsIGFuZCBmZWVkIHRoZQorICogbmV4dCByZXFldXN0LgorICoKKyAqIFJldHVybiAxIG1lYW5pbmcgbWYgc2hvdWxkIGJlIGZyZWVkIGZyb20gX2Jhc2VfaW50ZXJydXB0CisgKiAgICAgICAgMCBtZWFucyB0aGUgbWYgaXMgZnJlZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdTgKK19zY3NpaF9jaGVja19mb3JfcGVuZGluZ190bShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKQoreworCXN0cnVjdCBfdHJfbGlzdCAqZGVsYXllZF90cjsKKworCWlmICghbGlzdF9lbXB0eSgmaW9jLT5kZWxheWVkX3RyX3ZvbHVtZV9saXN0KSkgeworCQlkZWxheWVkX3RyID0gbGlzdF9lbnRyeShpb2MtPmRlbGF5ZWRfdHJfdm9sdW1lX2xpc3QubmV4dCwKKwkJICAgIHN0cnVjdCBfdHJfbGlzdCwgbGlzdCk7CisJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBzbWlkKTsKKwkJX3Njc2loX3RtX3RyX3ZvbHVtZV9zZW5kKGlvYywgZGVsYXllZF90ci0+aGFuZGxlKTsKKwkJbGlzdF9kZWwoJmRlbGF5ZWRfdHItPmxpc3QpOworCQlrZnJlZShkZWxheWVkX3RyKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJaWYgKCFsaXN0X2VtcHR5KCZpb2MtPmRlbGF5ZWRfdHJfbGlzdCkpIHsKIAkJZGVsYXllZF90ciA9IGxpc3RfZW50cnkoaW9jLT5kZWxheWVkX3RyX2xpc3QubmV4dCwKIAkJICAgIHN0cnVjdCBfdHJfbGlzdCwgbGlzdCk7CkBAIC0yNzI4LDggKzI5MjUsOSBAQAogCQlfc2NzaWhfdG1fdHJfc2VuZChpb2MsIGRlbGF5ZWRfdHItPmhhbmRsZSk7CiAJCWxpc3RfZGVsKCZkZWxheWVkX3RyLT5saXN0KTsKIAkJa2ZyZWUoZGVsYXllZF90cik7Ci0JCXJldHVybiAwOyAvKiB0ZWxscyBiYXNlX2ludGVycnVwdCBub3QgdG8gZnJlZSBtZiAqLworCQlyZXR1cm4gMDsKIAl9CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjgwMyw3ICszMDAxLDcgQEAKIAkJICAgIE1QSTJfRVZFTlRfU0FTX1RPUE9fRVNfUkVTUE9ORElORykgewogCQkJaWYgKGxlMTZfdG9fY3B1KGxvY2FsX2V2ZW50X2RhdGEtPkV4cGFuZGVyRGV2SGFuZGxlKSA9PQogCQkJICAgIGV4cGFuZGVyX2hhbmRsZSkgewotCQkJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJCQkgICAgInNldHRpbmcgaWdub3JpbmcgZmxhZ1xuIiwgaW9jLT5uYW1lKSk7CiAJCQkJZndfZXZlbnQtPmlnbm9yZSA9IDE7CiAJCQl9CkBAIC0yODEzLDYgKzMwMTEsMTY1IEBACiB9CiAKIC8qKgorICogX3Njc2loX3NldF92b2x1bWVfZGVsZXRlX2ZsYWcgLSBzZXR0aW5nIHZvbHVtZSBkZWxldGUgZmxhZworICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCisgKgorICogVGhpcworICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitfc2NzaWhfc2V0X3ZvbHVtZV9kZWxldGVfZmxhZyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpCit7CisJc3RydWN0IF9yYWlkX2RldmljZSAqcmFpZF9kZXZpY2U7CisJc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+cmFpZF9kZXZpY2VfbG9jaywgZmxhZ3MpOworCXJhaWRfZGV2aWNlID0gX3Njc2loX3JhaWRfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywgaGFuZGxlKTsKKwlpZiAocmFpZF9kZXZpY2UgJiYgcmFpZF9kZXZpY2UtPnN0YXJnZXQgJiYKKwkgICAgcmFpZF9kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhKSB7CisJCXNhc190YXJnZXRfcHJpdl9kYXRhID0KKwkJICAgIHJhaWRfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKKwkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJICAgICJzZXR0aW5nIGRlbGV0ZSBmbGFnOiBoYW5kbGUoMHglMDR4KSwgIgorCQkgICAgInd3aWQoMHglMDE2bGx4KVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSByYWlkX2RldmljZS0+d3dpZCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnJhaWRfZGV2aWNlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBfc2NzaWhfc2V0X3ZvbHVtZV9oYW5kbGVfZm9yX3RyIC0gc2V0IGhhbmRsZSBmb3IgdGFyZ2V0IHJlc2V0IHRvIHZvbHVtZQorICogQGhhbmRsZTogaW5wdXQgaGFuZGxlCisgKiBAYTogaGFuZGxlIGZvciB2b2x1bWUgYQorICogQGI6IGhhbmRsZSBmb3Igdm9sdW1lIGIKKyAqCisgKiBJUiBmaXJtd2FyZSBvbmx5IHN1cHBvcnRzIHR3byByYWlkIHZvbHVtZXMuICBUaGUgcHVycG9zZSBvZiB0aGlzCisgKiByb3V0aW5lIGlzIHRvIHNldCB0aGUgdm9sdW1lIGhhbmRsZSBpbiBlaXRoZXIgYSBvciBiLiBXaGVuIHRoZSBnaXZlbgorICogaW5wdXQgaGFuZGxlIGlzIG5vbi16ZXJvLCBvciB3aGVuIGEgYW5kIGIgaGF2ZSBub3QgYmVlbiBzZXQgYmVmb3JlLgorICovCitzdGF0aWMgdm9pZAorX3Njc2loX3NldF92b2x1bWVfaGFuZGxlX2Zvcl90cih1MTYgaGFuZGxlLCB1MTYgKmEsIHUxNiAqYikKK3sKKwlpZiAoIWhhbmRsZSB8fCBoYW5kbGUgPT0gKmEgfHwgaGFuZGxlID09ICpiKQorCQlyZXR1cm47CisJaWYgKCEqYSkKKwkJKmEgPSBoYW5kbGU7CisJZWxzZSBpZiAoISpiKQorCQkqYiA9IGhhbmRsZTsKK30KKworLyoqCisgKiBfc2NzaWhfY2hlY2tfaXJfY29uZmlnX3VuaGlkZV9ldmVudHMgLSBjaGVjayBmb3IgVU5ISURFIGV2ZW50cworICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAZXZlbnRfZGF0YTogdGhlIGV2ZW50IGRhdGEgcGF5bG9hZAorICogQ29udGV4dDogaW50ZXJydXB0IHRpbWUuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgc2VuZCB0YXJnZXQgcmVzZXQgdG8gdm9sdW1lLCBmb2xsb3dlZCBieSB0YXJnZXQKKyAqIHJlc2V0cyB0byB0aGUgUERzLiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgUEQgaGFzIGJlZW4gcmVtb3ZlZCwgb3IKKyAqIHZvbHVtZSBoYXMgYmVlbiBkZWxldGVkIG9yIHJlbW92ZWQuIFdoZW4gdGhlIHRhcmdldCByZXNldCBpcyBzZW50CisgKiB0byB2b2x1bWUsIHRoZSBQRCB0YXJnZXQgcmVzZXRzIG5lZWQgdG8gYmUgcXVldWVkIHRvIHN0YXJ0IHVwb24KKyAqIGNvbXBsZXRpb24gb2YgdGhlIHZvbHVtZSB0YXJnZXQgcmVzZXQuCisgKgorICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitfc2NzaWhfY2hlY2tfaXJfY29uZmlnX3VuaGlkZV9ldmVudHMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorICAgIE1waTJFdmVudERhdGFJckNvbmZpZ0NoYW5nZUxpc3RfdCAqZXZlbnRfZGF0YSkKK3sKKwlNcGkyRXZlbnRJckNvbmZpZ0VsZW1lbnRfdCAqZWxlbWVudDsKKwlpbnQgaTsKKwl1MTYgaGFuZGxlLCB2b2x1bWVfaGFuZGxlLCBhLCBiOworCXN0cnVjdCBfdHJfbGlzdCAqZGVsYXllZF90cjsKKworCWEgPSAwOworCWIgPSAwOworCisJLyogVm9sdW1lIFJlc2V0cyBmb3IgRGVsZXRlZCBvciBSZW1vdmVkICovCisJZWxlbWVudCA9IChNcGkyRXZlbnRJckNvbmZpZ0VsZW1lbnRfdCAqKSZldmVudF9kYXRhLT5Db25maWdFbGVtZW50WzBdOworCWZvciAoaSA9IDA7IGkgPCBldmVudF9kYXRhLT5OdW1FbGVtZW50czsgaSsrLCBlbGVtZW50KyspIHsKKwkJaWYgKGVsZW1lbnQtPlJlYXNvbkNvZGUgPT0KKwkJICAgIE1QSTJfRVZFTlRfSVJfQ0hBTkdFX1JDX1ZPTFVNRV9ERUxFVEVEIHx8CisJCSAgICBlbGVtZW50LT5SZWFzb25Db2RlID09CisJCSAgICBNUEkyX0VWRU5UX0lSX0NIQU5HRV9SQ19SRU1PVkVEKSB7CisJCQl2b2x1bWVfaGFuZGxlID0gbGUxNl90b19jcHUoZWxlbWVudC0+Vm9sRGV2SGFuZGxlKTsKKwkJCV9zY3NpaF9zZXRfdm9sdW1lX2RlbGV0ZV9mbGFnKGlvYywgdm9sdW1lX2hhbmRsZSk7CisJCQlfc2NzaWhfc2V0X3ZvbHVtZV9oYW5kbGVfZm9yX3RyKHZvbHVtZV9oYW5kbGUsICZhLCAmYik7CisJCX0KKwl9CisKKwkvKiBWb2x1bWUgUmVzZXRzIGZvciBVTkhJREUgZXZlbnRzICovCisJZWxlbWVudCA9IChNcGkyRXZlbnRJckNvbmZpZ0VsZW1lbnRfdCAqKSZldmVudF9kYXRhLT5Db25maWdFbGVtZW50WzBdOworCWZvciAoaSA9IDA7IGkgPCBldmVudF9kYXRhLT5OdW1FbGVtZW50czsgaSsrLCBlbGVtZW50KyspIHsKKwkJaWYgKGxlMzJfdG9fY3B1KGV2ZW50X2RhdGEtPkZsYWdzKSAmCisJCSAgICBNUEkyX0VWRU5UX0lSX0NIQU5HRV9GTEFHU19GT1JFSUdOX0NPTkZJRykKKwkJCWNvbnRpbnVlOworCQlpZiAoZWxlbWVudC0+UmVhc29uQ29kZSA9PSBNUEkyX0VWRU5UX0lSX0NIQU5HRV9SQ19VTkhJREUpIHsKKwkJCXZvbHVtZV9oYW5kbGUgPSBsZTE2X3RvX2NwdShlbGVtZW50LT5Wb2xEZXZIYW5kbGUpOworCQkJX3Njc2loX3NldF92b2x1bWVfaGFuZGxlX2Zvcl90cih2b2x1bWVfaGFuZGxlLCAmYSwgJmIpOworCQl9CisJfQorCisJaWYgKGEpCisJCV9zY3NpaF90bV90cl92b2x1bWVfc2VuZChpb2MsIGEpOworCWlmIChiKQorCQlfc2NzaWhfdG1fdHJfdm9sdW1lX3NlbmQoaW9jLCBiKTsKKworCS8qIFBEIHRhcmdldCByZXNldHMgKi8KKwllbGVtZW50ID0gKE1waTJFdmVudElyQ29uZmlnRWxlbWVudF90ICopJmV2ZW50X2RhdGEtPkNvbmZpZ0VsZW1lbnRbMF07CisJZm9yIChpID0gMDsgaSA8IGV2ZW50X2RhdGEtPk51bUVsZW1lbnRzOyBpKyssIGVsZW1lbnQrKykgeworCQlpZiAoZWxlbWVudC0+UmVhc29uQ29kZSAhPSBNUEkyX0VWRU5UX0lSX0NIQU5HRV9SQ19VTkhJREUpCisJCQljb250aW51ZTsKKwkJaGFuZGxlID0gbGUxNl90b19jcHUoZWxlbWVudC0+UGh5c0Rpc2tEZXZIYW5kbGUpOworCQl2b2x1bWVfaGFuZGxlID0gbGUxNl90b19jcHUoZWxlbWVudC0+Vm9sRGV2SGFuZGxlKTsKKwkJY2xlYXJfYml0KGhhbmRsZSwgaW9jLT5wZF9oYW5kbGVzKTsKKwkJaWYgKCF2b2x1bWVfaGFuZGxlKQorCQkJX3Njc2loX3RtX3RyX3NlbmQoaW9jLCBoYW5kbGUpOworCQllbHNlIGlmICh2b2x1bWVfaGFuZGxlID09IGEgfHwgdm9sdW1lX2hhbmRsZSA9PSBiKSB7CisJCQlkZWxheWVkX3RyID0ga3phbGxvYyhzaXplb2YoKmRlbGF5ZWRfdHIpLCBHRlBfQVRPTUlDKTsKKwkJCUJVR19PTighZGVsYXllZF90cik7CisJCQlJTklUX0xJU1RfSEVBRCgmZGVsYXllZF90ci0+bGlzdCk7CisJCQlkZWxheWVkX3RyLT5oYW5kbGUgPSBoYW5kbGU7CisJCQlsaXN0X2FkZF90YWlsKCZkZWxheWVkX3RyLT5saXN0LCAmaW9jLT5kZWxheWVkX3RyX2xpc3QpOworCQkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCisJCQkgICAgIkRFTEFZRUQ6dHI6aGFuZGxlKDB4JTA0eCksIChvcGVuKVxuIiwgaW9jLT5uYW1lLAorCQkJICAgIGhhbmRsZSkpOworCQl9IGVsc2UKKwkJCV9zY3NpaF90bV90cl9zZW5kKGlvYywgaGFuZGxlKTsKKwl9Cit9CisKKworLyoqCisgKiBfc2NzaWhfY2hlY2tfdm9sdW1lX2RlbGV0ZV9ldmVudHMgLSBzZXQgZGVsZXRlIGZsYWcgZm9yIHZvbHVtZXMKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQGV2ZW50X2RhdGE6IHRoZSBldmVudCBkYXRhIHBheWxvYWQKKyAqIENvbnRleHQ6IGludGVycnVwdCB0aW1lLgorICoKKyAqIFRoaXMgd2lsbCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgY2FibGUgY29ubmVjdGVkIHRvIGVudGlyZSB2b2x1bWUgaXMKKyAqIHB1bGxlZC4gV2Ugd2lsbCB0YWtlIGNhcmUgb2Ygc2V0dGluZyB0aGUgZGVsZXRlZCBmbGFnIHNvIG5vcm1hbCBJTyB3aWxsCisgKiBub3QgYmUgc2VudC4KKyAqCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQKK19zY3NpaF9jaGVja192b2x1bWVfZGVsZXRlX2V2ZW50cyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCisgICAgTXBpMkV2ZW50RGF0YUlyVm9sdW1lX3QgKmV2ZW50X2RhdGEpCit7CisJdTMyIHN0YXRlOworCisJaWYgKGV2ZW50X2RhdGEtPlJlYXNvbkNvZGUgIT0gTVBJMl9FVkVOVF9JUl9WT0xVTUVfUkNfU1RBVEVfQ0hBTkdFRCkKKwkJcmV0dXJuOworCXN0YXRlID0gbGUzMl90b19jcHUoZXZlbnRfZGF0YS0+TmV3VmFsdWUpOworCWlmIChzdGF0ZSA9PSBNUEkyX1JBSURfVk9MX1NUQVRFX01JU1NJTkcgfHwgc3RhdGUgPT0KKwkgICAgTVBJMl9SQUlEX1ZPTF9TVEFURV9GQUlMRUQpCisJCV9zY3NpaF9zZXRfdm9sdW1lX2RlbGV0ZV9mbGFnKGlvYywKKwkJICAgIGxlMTZfdG9fY3B1KGV2ZW50X2RhdGEtPlZvbERldkhhbmRsZSkpOworfQorCisvKioKICAqIF9zY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMgLSBjb21wbGV0aW5nIG91dHN0YW5kaW5nIGNvbW1hbmRzLgogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKgpAQCAtMjgzNSw3ICszMTkyLDEwIEBACiAJCWNvdW50Kys7CiAJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBzbWlkKTsKIAkJc2NzaV9kbWFfdW5tYXAoc2NtZCk7Ci0JCXNjbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJaWYgKGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQorCQkJc2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWVsc2UKKwkJCXNjbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKIAkJc2NtZC0+c2NzaV9kb25lKHNjbWQpOwogCX0KIAlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiY29tcGxldGluZyAlZCBjbWRzXG4iLApAQCAtMjg1OCw5ICszMjE4LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHByb3Rfb3AgPSBzY3NpX2dldF9wcm90X29wKHNjbWQpOwogCXVuc2lnbmVkIGNoYXIgcHJvdF90eXBlID0gc2NzaV9nZXRfcHJvdF90eXBlKHNjbWQpOwogCi0JaWYgKHByb3RfdHlwZSA9PSBTQ1NJX1BST1RfRElGX1RZUEUwIHx8Ci0JICAgcHJvdF90eXBlID09IFNDU0lfUFJPVF9ESUZfVFlQRTIgfHwKLQkgICBwcm90X29wID09IFNDU0lfUFJPVF9OT1JNQUwpCisJaWYgKHByb3RfdHlwZSA9PSBTQ1NJX1BST1RfRElGX1RZUEUwIHx8IHByb3Rfb3AgPT0gU0NTSV9QUk9UX05PUk1BTCkKIAkJcmV0dXJuOwogCiAJaWYgKHByb3Rfb3AgPT0gIFNDU0lfUFJPVF9SRUFEX1NUUklQKQpAQCAtMjg4Miw3ICszMjQwLDEzIEBACiAJCSAgICBNUEkyX1NDU0lJT19FRURQRkxBR1NfQ0hFQ0tfR1VBUkQ7CiAJCW1waV9yZXF1ZXN0LT5DREIuRUVEUDMyLlByaW1hcnlSZWZlcmVuY2VUYWcgPQogCQkgICAgY3B1X3RvX2JlMzIoc2NzaV9nZXRfbGJhKHNjbWQpKTsKKwkJYnJlYWs7CiAKKwljYXNlIFNDU0lfUFJPVF9ESUZfVFlQRTI6CisKKwkJZWVkcF9mbGFncyB8PSBNUEkyX1NDU0lJT19FRURQRkxBR1NfSU5DX1BSSV9SRUZUQUcgfAorCQkgICAgTVBJMl9TQ1NJSU9fRUVEUEZMQUdTX0NIRUNLX1JFRlRBRyB8CisJCSAgICBNUEkyX1NDU0lJT19FRURQRkxBR1NfQ0hFQ0tfR1VBUkQ7CiAJCWJyZWFrOwogCiAJY2FzZSBTQ1NJX1BST1RfRElGX1RZUEUzOgpAQCAtMjk2OCw2ICszMzMyLDEyIEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgeworCQlzY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJc2NtZC0+c2NzaV9kb25lKHNjbWQpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0OwogCS8qIGludmFsaWQgZGV2aWNlIGhhbmRsZSAqLwogCWlmIChzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+aGFuZGxlID09IE1QVDJTQVNfSU5WQUxJRF9ERVZJQ0VfSEFORExFKSB7CkBAIC0yOTc5LDcgKzMzNDksNyBAQAogCS8qIGhvc3QgcmVjb3Zlcnkgb3IgbGluayByZXNldHMgc2VudCB2aWEgSU9DVExzICovCiAJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5pb2NfbGlua19yZXNldF9pbl9wcm9ncmVzcykKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7Ci0JLyogZGV2aWNlIGJ1c3kgd2l0aCB0YXNrIG1hbmFnbWVudCAqLworCS8qIGRldmljZSBidXN5IHdpdGggdGFzayBtYW5hZ2VtZW50ICovCiAJZWxzZSBpZiAoc2FzX2RldmljZV9wcml2X2RhdGEtPmJsb2NrIHx8IHNhc190YXJnZXRfcHJpdl9kYXRhLT50bV9idXN5KQogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCS8qIGRldmljZSBoYXMgYmVlbiBkZWxldGVkICovCkBAIC0zMDEzLDcgKzMzODMsNyBAQAogCQltcGlfY29udHJvbCB8PSBNUEkyX1NDU0lJT19DT05UUk9MX1NJTVBMRVE7CiAJLyogTWFrZSBzdXJlIERldmljZSBpcyBub3QgcmFpZCB2b2x1bWUgKi8KIAlpZiAoIV9zY3NpaF9pc19yYWlkKCZzY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2KSAmJgotCSAgICBzYXNfaXNfdGxyX2VuYWJsZWQoc2NtZC0+ZGV2aWNlKSkKKwkgICAgc2FzX2lzX3Rscl9lbmFibGVkKHNjbWQtPmRldmljZSkgJiYgc2NtZC0+Y21kX2xlbiAhPSAzMikKIAkJbXBpX2NvbnRyb2wgfD0gTVBJMl9TQ1NJSU9fQ09OVFJPTF9UTFJfT047CiAKIAlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkX3Njc2lpbyhpb2MsIGlvYy0+c2NzaV9pb19jYl9pZHgsIHNjbWQpOwpAQCAtMzAyNSw2ICszMzk1LDggQEAKIAltcGlfcmVxdWVzdCA9IG1wdDJzYXNfYmFzZV9nZXRfbXNnX2ZyYW1lKGlvYywgc21pZCk7CiAJbWVtc2V0KG1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlNDU0lJT1JlcXVlc3RfdCkpOwogCV9zY3NpaF9zZXR1cF9lZWRwKHNjbWQsIG1waV9yZXF1ZXN0KTsKKwlpZiAoc2NtZC0+Y21kX2xlbiA9PSAzMikKKwkJbXBpX2NvbnRyb2wgfD0gNCA8PCBNUEkyX1NDU0lJT19DT05UUk9MX0FERENEQkxFTl9TSElGVDsKIAltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1NDU0lfSU9fUkVRVUVTVDsKIAlpZiAoc2FzX2RldmljZV9wcml2X2RhdGEtPnNhc190YXJnZXQtPmZsYWdzICYKIAkgICAgTVBUX1RBUkdFVF9GTEFHU19SQUlEX0NPTVBPTkVOVCkKQEAgLTMxMTksNiArMzQ5MSwxMyBAQAogCWNoYXIgKmRlc2Nfc2NzaV9zdGF0dXMgPSBOVUxMOwogCWNoYXIgKmRlc2Nfc2NzaV9zdGF0ZSA9IGlvYy0+dG1wX3N0cmluZzsKIAl1MzIgbG9nX2luZm8gPSBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pOworCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzY21kLT5kZXZpY2UtPnNkZXZfdGFyZ2V0OworCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqcHJpdl90YXJnZXQgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKKworCWlmICghcHJpdl90YXJnZXQpCisJCXJldHVybjsKIAogCWlmIChsb2dfaW5mbyA9PSAweDMxMTcwMDAwKQogCQlyZXR1cm47CkBAIC0zMjM0LDEwICszNjEzLDI5IEBACiAJCXN0cmNhdChkZXNjX3Njc2lfc3RhdGUsICJhdXRvc2Vuc2UgdmFsaWQgIik7CiAKIAlzY3NpX3ByaW50X2NvbW1hbmQoc2NtZCk7Ci0JcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQgIlx0ZGV2IGhhbmRsZSgweCUwNHgpLCAiCi0JICAgICJpb2Nfc3RhdHVzKCVzKSgweCUwNHgpLCBzbWlkKCVkKVxuIiwgaW9jLT5uYW1lLAotCSAgICBsZTE2X3RvX2NwdShtcGlfcmVwbHktPkRldkhhbmRsZSksIGRlc2NfaW9jX3N0YXRlLAotCQlpb2Nfc3RhdHVzLCBzbWlkKTsKKworCWlmIChwcml2X3RhcmdldC0+ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1ZPTFVNRSkgeworCQlwcmludGsoTVBUMlNBU19XQVJOX0ZNVCAiXHR2b2x1bWUgd3dpZCgweCUwMTZsbHgpXG4iLCBpb2MtPm5hbWUsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXByaXZfdGFyZ2V0LT5zYXNfYWRkcmVzcyk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJCXNhc19kZXZpY2UgPSBtcHQyc2FzX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJCSAgICBwcml2X3RhcmdldC0+c2FzX2FkZHJlc3MpOworCQlpZiAoc2FzX2RldmljZSkgeworCQkJcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQgIlx0c2FzX2FkZHJlc3MoMHglMDE2bGx4KSwgIgorCQkJICAgICJwaHkoJWQpXG4iLCBpb2MtPm5hbWUsIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAorCQkJICAgIHNhc19kZXZpY2UtPnBoeSk7CisJCQlwcmludGsoTVBUMlNBU19XQVJOX0ZNVAorCQkJICAgICJcdGVuY2xvc3VyZV9sb2dpY2FsX2lkKDB4JTAxNmxseCksIHNsb3QoJWQpXG4iLAorCQkJICAgIGlvYy0+bmFtZSwgc2FzX2RldmljZS0+ZW5jbG9zdXJlX2xvZ2ljYWxfaWQsCisJCQkgICAgc2FzX2RldmljZS0+c2xvdCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlwcmludGsoTVBUMlNBU19XQVJOX0ZNVCAiXHRoYW5kbGUoMHglMDR4KSwgaW9jX3N0YXR1cyglcykoMHglMDR4KSwgIgorCSAgICAic21pZCglZClcbiIsIGlvYy0+bmFtZSwgbGUxNl90b19jcHUobXBpX3JlcGx5LT5EZXZIYW5kbGUpLAorCSAgICBkZXNjX2lvY19zdGF0ZSwgaW9jX3N0YXR1cywgc21pZCk7CiAJcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQgIlx0cmVxdWVzdF9sZW4oJWQpLCB1bmRlcmZsb3coJWQpLCAiCiAJICAgICJyZXNpZCglZClcbiIsIGlvYy0+bmFtZSwgc2NzaV9idWZmbGVuKHNjbWQpLCBzY21kLT51bmRlcmZsb3csCiAJICAgIHNjc2lfZ2V0X3Jlc2lkKHNjbWQpKTsKQEAgLTM3NzIsNyArNDE3MCw3IEBACiAJaWYgKCFoYW5kbGUpCiAJCXJldHVybiAtMTsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoKG1wdDJzYXNfY29uZmlnX2dldF9leHBhbmRlcl9wZzAoaW9jLCAmbXBpX3JlcGx5LCAmZXhwYW5kZXJfcGcwLApAQCAtNDE3OCw3ICs0NTc2LDcgQEAKIAkgICAgbGUxNl90b19jcHUoc2FzX2RldmljZV9wZzAuU2xvdCk7CiAJc2FzX2RldmljZS0+ZGV2aWNlX2luZm8gPSBkZXZpY2VfaW5mbzsKIAlzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcyA9IHNhc19hZGRyZXNzOwotCXNhc19kZXZpY2UtPmhpZGRlbl9yYWlkX2NvbXBvbmVudCA9IGlzX3BkOworCXNhc19kZXZpY2UtPnBoeSA9IHNhc19kZXZpY2VfcGcwLlBoeU51bTsKIAogCS8qIGdldCBlbmNsb3N1cmVfbG9naWNhbF9pZCAqLwogCWlmIChzYXNfZGV2aWNlLT5lbmNsb3N1cmVfaGFuZGxlICYmICEobXB0MnNhc19jb25maWdfZ2V0X2VuY2xvc3VyZV9wZzAoCkBAIC00MTk5LDYyICs0NTk3LDYgQEAKIH0KIAogLyoqCi0gKiBfc2NzaWhfcmVtb3ZlX3BkX2RldmljZSAtICByZW1vdmluZyBzYXMgZGV2aWNlIHBkIG9iamVjdAotICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAc2FzX2RldmljZV9kZWxldGU6IHRoZSBzYXNfZGV2aWNlIG9iamVjdAotICoKLSAqIEZvciBoaWRkZW4gcmFpZCBjb21wb25lbnRzLCB3ZSBkbyBkcml2ZXItZncgaGFuZHNoYWtlIGZyb20KLSAqIGhvdHBsdWcgd29yayB0aHJlYWRzLgotICogUmV0dXJuIG5vdGhpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1fc2NzaWhfcmVtb3ZlX3BkX2RldmljZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHN0cnVjdCBfc2FzX2RldmljZQotICAgIHNhc19kZXZpY2UpCi17Ci0JTXBpMlNhc0lvVW5pdENvbnRyb2xSZXBseV90IG1waV9yZXBseTsKLQlNcGkyU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdCBtcGlfcmVxdWVzdDsKLQl1MTYgdm9sX2hhbmRsZSwgaGFuZGxlOwotCi0JaGFuZGxlID0gc2FzX2RldmljZS5oYW5kbGU7Ci0JZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZW50ZXI6IGhhbmRsZSgweCUwNHgpLCIKLQkgICAgIiBzYXNfYWRkcigweCUwMTZsbHgpXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLCBoYW5kbGUsCi0JICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhc19kZXZpY2Uuc2FzX2FkZHJlc3MpKTsKLQotCXZvbF9oYW5kbGUgPSBzYXNfZGV2aWNlLnZvbHVtZV9oYW5kbGU7Ci0JaWYgKCF2b2xfaGFuZGxlKQotCQlyZXR1cm47Ci0JZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJpc3N1ZSB0YXJnZXQgcmVzZXQ6ICIKLQkgICAgImhhbmRsZSgweCUwNHgpXG4iLCBpb2MtPm5hbWUsIHZvbF9oYW5kbGUpKTsKLQltcHQyc2FzX3Njc2loX2lzc3VlX3RtKGlvYywgdm9sX2hhbmRsZSwgMCwgMCwgMCwKLQkgICAgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfVEFSR0VUX1JFU0VULCAwLCAzMCwgTlVMTCk7Ci0JZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJpc3N1ZSB0YXJnZXQgcmVzZXQgIgotCSAgICAiZG9uZTogaGFuZGxlKDB4JTA0eClcbiIsIGlvYy0+bmFtZSwgdm9sX2hhbmRsZSkpOwotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQotCQlyZXR1cm47Ci0KLQkvKiBTQVNfSU9fVU5JVF9DTlRSIC0gc2VuZCBSRU1PVkVfREVWSUNFICovCi0JZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzYXNfaW91bml0OiBoYW5kbGUiCi0JICAgICIoMHglMDR4KVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUpKTsKLQltZW1zZXQoJm1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlNhc0lvVW5pdENvbnRyb2xSZXF1ZXN0X3QpKTsKLQltcGlfcmVxdWVzdC5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU0FTX0lPX1VOSVRfQ09OVFJPTDsKLQltcGlfcmVxdWVzdC5PcGVyYXRpb24gPSBNUEkyX1NBU19PUF9SRU1PVkVfREVWSUNFOwotCW1waV9yZXF1ZXN0LkRldkhhbmRsZSA9IGNwdV90b19sZTE2KGhhbmRsZSk7Ci0JaWYgKChtcHQyc2FzX2Jhc2Vfc2FzX2lvdW5pdF9jb250cm9sKGlvYywgJm1waV9yZXBseSwKLQkgICAgJm1waV9yZXF1ZXN0KSkgIT0gMCkKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0KLQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNhc19pb3VuaXQ6IGlvY19zdGF0dXMiCi0JICAgICIoMHglMDR4KSwgbG9naW5mbygweCUwOHgpXG4iLCBpb2MtPm5hbWUsCi0JICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpLAotCSAgICBsZTMyX3RvX2NwdShtcGlfcmVwbHkuSU9DTG9nSW5mbykpKTsKLQotCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGV4aXQ6IGhhbmRsZSgweCUwNHgpLCIKLQkgICAgIiBzYXNfYWRkcigweCUwMTZsbHgpXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLCBoYW5kbGUsCi0JICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhc19kZXZpY2Uuc2FzX2FkZHJlc3MpKTsKLX0KLQotLyoqCiAgKiBfc2NzaWhfcmVtb3ZlX2RldmljZSAtICByZW1vdmluZyBzYXMgZGV2aWNlIG9iamVjdAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc2FzX2RldmljZV9kZWxldGU6IHRoZSBzYXNfZGV2aWNlIG9iamVjdApAQCAtNDI4NCw5ICs0NjI2LDYgQEAKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOwogCX0KIAotCWlmIChzYXNfZGV2aWNlX2JhY2t1cC5oaWRkZW5fcmFpZF9jb21wb25lbnQpCi0JCV9zY3NpaF9yZW1vdmVfcGRfZGV2aWNlKGlvYywgc2FzX2RldmljZV9iYWNrdXApOwotCiAJX3Njc2loX3VibG9ja19pb19kZXZpY2UoaW9jLCBzYXNfZGV2aWNlX2JhY2t1cC5oYW5kbGUpOwogCiAJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlX2JhY2t1cC5zYXNfYWRkcmVzcywKQEAgLTQzMzgsOSArNDY3Nyw5IEBACiAJCXN0YXR1c19zdHIgPSAidW5rbm93biBzdGF0dXMiOwogCQlicmVhazsKIAl9Ci0JcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJzYXMgdG9wb2xvZ3kgY2hhbmdlOiAoJXMpXG4iLAorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzYXMgdG9wb2xvZ3kgY2hhbmdlOiAoJXMpXG4iLAogCSAgICBpb2MtPm5hbWUsIHN0YXR1c19zdHIpOwotCXByaW50ayhLRVJOX0RFQlVHICJcdGhhbmRsZSgweCUwNHgpLCBlbmNsb3N1cmVfaGFuZGxlKDB4JTA0eCkgIgorCXByaW50ayhLRVJOX0lORk8gIlx0aGFuZGxlKDB4JTA0eCksIGVuY2xvc3VyZV9oYW5kbGUoMHglMDR4KSAiCiAJICAgICJzdGFydF9waHkoJTAyZCksIGNvdW50KCVkKVxuIiwKIAkgICAgbGUxNl90b19jcHUoZXZlbnRfZGF0YS0+RXhwYW5kZXJEZXZIYW5kbGUpLAogCSAgICBsZTE2X3RvX2NwdShldmVudF9kYXRhLT5FbmNsb3N1cmVIYW5kbGUpLApAQCAtNDM3NCw3ICs0NzEzLDcgQEAKIAkJfQogCQlsaW5rX3JhdGUgPSBldmVudF9kYXRhLT5QSFlbaV0uTGlua1JhdGUgPj4gNDsKIAkJcHJldl9saW5rX3JhdGUgPSBldmVudF9kYXRhLT5QSFlbaV0uTGlua1JhdGUgJiAweEY7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJcdHBoeSglMDJkKSwgYXR0YWNoZWRfaGFuZGxlKDB4JTA0eCk6ICVzOiIKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXHRwaHkoJTAyZCksIGF0dGFjaGVkX2hhbmRsZSgweCUwNHgpOiAlczoiCiAJCSAgICAiIGxpbmsgcmF0ZTogbmV3KDB4JTAyeCksIG9sZCgweCUwMngpXG4iLCBwaHlfbnVtYmVyLAogCQkgICAgaGFuZGxlLCBzdGF0dXNfc3RyLCBsaW5rX3JhdGUsIHByZXZfbGlua19yYXRlKTsKIApAQCAtNDQwOSw3ICs0NzQ4LDcgQEAKIAkJX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnRfZGVidWcoaW9jLCBldmVudF9kYXRhKTsKICNlbmRpZgogCi0JaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5yZW1vdmVfaG9zdCkKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQlyZXR1cm47CiAKIAlpZiAoIWlvYy0+c2FzX2hiYS5udW1fcGh5cykKQEAgLTQ0MTgsNyArNDc1Nyw3IEBACiAJCV9zY3NpaF9zYXNfaG9zdF9yZWZyZXNoKGlvYyk7CiAKIAlpZiAoZndfZXZlbnQtPmlnbm9yZSkgewotCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJpZ25vcmluZyBleHBhbmRlciAiCisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiaWdub3JpbmcgZXhwYW5kZXIgIgogCQkgICAgImV2ZW50XG4iLCBpb2MtPm5hbWUpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQ0NDQsMTEgKzQ3ODMsMTIgQEAKIAkvKiBoYW5kbGUgc2libGluZ3MgZXZlbnRzICovCiAJZm9yIChpID0gMDsgaSA8IGV2ZW50X2RhdGEtPk51bUVudHJpZXM7IGkrKykgewogCQlpZiAoZndfZXZlbnQtPmlnbm9yZSkgewotCQkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiaWdub3JpbmcgIgorCQkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJpZ25vcmluZyAiCiAJCQkgICAgImV4cGFuZGVyIGV2ZW50XG4iLCBpb2MtPm5hbWUpKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0KQorCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8CisJCSAgICBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkKIAkJCXJldHVybjsKIAkJcGh5X251bWJlciA9IGV2ZW50X2RhdGEtPlN0YXJ0UGh5TnVtICsgaTsKIAkJcmVhc29uX2NvZGUgPSBldmVudF9kYXRhLT5QSFlbaV0uUGh5U3RhdHVzICYKQEAgLTQ1NjQsMTIgKzQ5MDQsMTIgQEAKIAkJcmVhc29uX3N0ciA9ICJ1bmtub3duIHJlYXNvbiI7CiAJCWJyZWFrOwogCX0KLQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQgImRldmljZSBzdGF0dXMgY2hhbmdlOiAoJXMpXG4iCisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImRldmljZSBzdGF0dXMgY2hhbmdlOiAoJXMpXG4iCiAJICAgICJcdGhhbmRsZSgweCUwNHgpLCBzYXMgYWRkcmVzcygweCUwMTZsbHgpIiwgaW9jLT5uYW1lLAogCSAgICByZWFzb25fc3RyLCBsZTE2X3RvX2NwdShldmVudF9kYXRhLT5EZXZIYW5kbGUpLAogCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGV2ZW50X2RhdGEtPlNBU0FkZHJlc3MpKTsKIAlpZiAoZXZlbnRfZGF0YS0+UmVhc29uQ29kZSA9PSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19TTUFSVF9EQVRBKQotCQlwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiwgQVNDKDB4JXgpLCBBU0NRKDB4JXgpXG4iLCBpb2MtPm5hbWUsCisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIsIEFTQygweCV4KSwgQVNDUSgweCV4KVxuIiwgaW9jLT5uYW1lLAogCQkgICAgZXZlbnRfZGF0YS0+QVNDLCBldmVudF9kYXRhLT5BU0NRKTsKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogfQpAQCAtNDY1Myw3ICs0OTkzLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJlbmNsb3N1cmUgc3RhdHVzIGNoYW5nZTogKCVzKVxuIgorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJlbmNsb3N1cmUgc3RhdHVzIGNoYW5nZTogKCVzKVxuIgogCSAgICAiXHRoYW5kbGUoMHglMDR4KSwgZW5jbG9zdXJlIGxvZ2ljYWwgaWQoMHglMDE2bGx4KSIKIAkgICAgIiBudW1iZXIgc2xvdHMoJWQpXG4iLCBpb2MtPm5hbWUsIHJlYXNvbl9zdHIsCiAJICAgIGxlMTZfdG9fY3B1KGV2ZW50X2RhdGEtPkVuY2xvc3VyZUhhbmRsZSksCkBAIC00NzA0LDEwICs1MDQ0LDEwIEBACiAJTXBpMkV2ZW50RGF0YVNhc0Jyb2FkY2FzdFByaW1pdGl2ZV90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAjZW5kaWYKIAl1MTYgaW9jX3N0YXR1czsKLQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJicm9hZGNhc3QgcHJpbWF0aXZlOiAiCisJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJicm9hZGNhc3QgcHJpbWF0aXZlOiAiCiAJICAgICJwaHkgbnVtYmVyKCVkKSwgd2lkdGgoJWQpXG4iLCBpb2MtPm5hbWUsIGV2ZW50X2RhdGEtPlBoeU51bSwKIAkgICAgZXZlbnRfZGF0YS0+UG9ydFdpZHRoKSk7Ci0JZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKKwlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKIAl0ZXJtaW5hdGlvbl9jb3VudCA9IDA7CkBAIC00NzUxLDcgKzUwOTEsNyBAQAogCX0KIAlpb2MtPmJyb2FkY2FzdF9hZW5fYnVzeSA9IDA7CiAKLQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAogCSAgICAiJXMgLSBleGl0LCBxdWVyeV9jb3VudCA9ICVkIHRlcm1pbmF0aW9uX2NvdW50ID0gJWRcbiIsCiAJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIHF1ZXJ5X2NvdW50LCB0ZXJtaW5hdGlvbl9jb3VudCkpOwogfQpAQCAtNDc3Miw3ICs1MTEyLDcgQEAKIAogI2lmZGVmIENPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORwogCWlmIChpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfRVZFTlRfV09SS19UQVNLKSB7Ci0JCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiZGlzY292ZXJ5IGV2ZW50OiAoJXMpIiwgaW9jLT5uYW1lLAorCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiZGlzY292ZXJ5IGV2ZW50OiAoJXMpIiwgaW9jLT5uYW1lLAogCQkgICAgKGV2ZW50X2RhdGEtPlJlYXNvbkNvZGUgPT0gTVBJMl9FVkVOVF9TQVNfRElTQ19SQ19TVEFSVEVEKSA/CiAJCSAgICAic3RhcnQiIDogInN0b3AiKTsKIAlpZiAoZXZlbnRfZGF0YS0+RGlzY292ZXJ5U3RhdHVzKQpAQCAtNDg4MywxNyArNTIyMywxNSBAQAogLyoqCiAgKiBfc2NzaWhfc2FzX3ZvbHVtZV9kZWxldGUgLSBkZWxldGUgdm9sdW1lCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBlbGVtZW50OiBJUiBjb25maWcgZWxlbWVudCBkYXRhCisgKiBAaGFuZGxlOiB2b2x1bWUgZGV2aWNlIGhhbmRsZQogICogQ29udGV4dDogdXNlci4KICAqCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwogc3RhdGljIHZvaWQKLV9zY3NpaF9zYXNfdm9sdW1lX2RlbGV0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCi0gICAgTXBpMkV2ZW50SXJDb25maWdFbGVtZW50X3QgKmVsZW1lbnQpCitfc2NzaWhfc2FzX3ZvbHVtZV9kZWxldGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlKQogewogCXN0cnVjdCBfcmFpZF9kZXZpY2UgKnJhaWRfZGV2aWNlOwotCXUxNiBoYW5kbGUgPSBsZTE2X3RvX2NwdShlbGVtZW50LT5Wb2xEZXZIYW5kbGUpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKIApAQCAtNDkwNyw2ICs1MjQ1LDkgQEAKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOwogCQlzY3NpX3JlbW92ZV90YXJnZXQoJnJhaWRfZGV2aWNlLT5zdGFyZ2V0LT5kZXYpOwogCX0KKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicmVtb3ZpbmcgaGFuZGxlKDB4JTA0eCksIHd3aWQiCisJICAgICIoMHglMDE2bGx4KVxuIiwgaW9jLT5uYW1lLCAgcmFpZF9kZXZpY2UtPmhhbmRsZSwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmFpZF9kZXZpY2UtPnd3aWQpOwogCV9zY3NpaF9yYWlkX2RldmljZV9yZW1vdmUoaW9jLCByYWlkX2RldmljZSk7CiB9CiAKQEAgLTQ5MzUsNyArNTI3Niw3IEBACiAJLyogZXhwb3NpbmcgcmFpZCBjb21wb25lbnQgKi8KIAlzYXNfZGV2aWNlLT52b2x1bWVfaGFuZGxlID0gMDsKIAlzYXNfZGV2aWNlLT52b2x1bWVfd3dpZCA9IDA7Ci0Jc2FzX2RldmljZS0+aGlkZGVuX3JhaWRfY29tcG9uZW50ID0gMDsKKwljbGVhcl9iaXQoaGFuZGxlLCBpb2MtPnBkX2hhbmRsZXMpOwogCV9zY3NpaF9yZXByb2JlX3RhcmdldChzYXNfZGV2aWNlLT5zdGFyZ2V0LCAwKTsKIH0KIApAQCAtNDk2Niw3ICs1MzA3LDcgQEAKIAkgICAgJnNhc19kZXZpY2UtPnZvbHVtZV9oYW5kbGUpOwogCW1wdDJzYXNfY29uZmlnX2dldF92b2x1bWVfd3dpZChpb2MsIHNhc19kZXZpY2UtPnZvbHVtZV9oYW5kbGUsCiAJICAgICZzYXNfZGV2aWNlLT52b2x1bWVfd3dpZCk7Ci0Jc2FzX2RldmljZS0+aGlkZGVuX3JhaWRfY29tcG9uZW50ID0gMTsKKwlzZXRfYml0KGhhbmRsZSwgaW9jLT5wZF9oYW5kbGVzKTsKIAlfc2NzaWhfcmVwcm9iZV90YXJnZXQoc2FzX2RldmljZS0+c3RhcmdldCwgMSk7CiB9CiAKQEAgLTUwMTUsMTMgKzUzNTYsMTMgQEAKIAl1NjQgc2FzX2FkZHJlc3M7CiAJdTE2IHBhcmVudF9oYW5kbGU7CiAKKwlzZXRfYml0KGhhbmRsZSwgaW9jLT5wZF9oYW5kbGVzKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCXNhc19kZXZpY2UgPSBfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X2hhbmRsZShpb2MsIGhhbmRsZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQlpZiAoc2FzX2RldmljZSkgewotCQlzYXNfZGV2aWNlLT5oaWRkZW5fcmFpZF9jb21wb25lbnQgPSAxOworCWlmIChzYXNfZGV2aWNlKQogCQlyZXR1cm47Ci0JfQogCiAJaWYgKChtcHQyc2FzX2NvbmZpZ19nZXRfc2FzX2RldmljZV9wZzAoaW9jLCAmbXBpX3JlcGx5LCAmc2FzX2RldmljZV9wZzAsCiAJICAgIE1QSTJfU0FTX0RFVklDRV9QR0FEX0ZPUk1fSEFORExFLCBoYW5kbGUpKSkgewpAQCAtNTA2Niw3ICs1NDA3LDcgQEAKIAogCWVsZW1lbnQgPSAoTXBpMkV2ZW50SXJDb25maWdFbGVtZW50X3QgKikmZXZlbnRfZGF0YS0+Q29uZmlnRWxlbWVudFswXTsKIAotCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAicmFpZCBjb25maWcgY2hhbmdlOiAoJXMpLCBlbGVtZW50cyglZClcbiIsCisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInJhaWQgY29uZmlnIGNoYW5nZTogKCVzKSwgZWxlbWVudHMoJWQpXG4iLAogCSAgICBpb2MtPm5hbWUsIChsZTMyX3RvX2NwdShldmVudF9kYXRhLT5GbGFncykgJgogCSAgICBNUEkyX0VWRU5UX0lSX0NIQU5HRV9GTEFHU19GT1JFSUdOX0NPTkZJRykgPwogCSAgICAiZm9yZWlnbiIgOiAibmF0aXZlIiwgZXZlbnRfZGF0YS0+TnVtRWxlbWVudHMpOwpAQCAtNTExOSw3ICs1NDYwLDcgQEAKIAkJCWVsZW1lbnRfc3RyID0gInVua25vd24gZWxlbWVudCI7CiAJCQlicmVhazsKIAkJfQotCQlwcmludGsoS0VSTl9ERUJVRyAiXHQoJXM6JXMpLCB2b2wgaGFuZGxlKDB4JTA0eCksICIKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXHQoJXM6JXMpLCB2b2wgaGFuZGxlKDB4JTA0eCksICIKIAkJICAgICJwZCBoYW5kbGUoMHglMDR4KSwgcGQgbnVtKDB4JTAyeClcbiIsIGVsZW1lbnRfc3RyLAogCQkgICAgcmVhc29uX3N0ciwgbGUxNl90b19jcHUoZWxlbWVudC0+Vm9sRGV2SGFuZGxlKSwKIAkJICAgIGxlMTZfdG9fY3B1KGVsZW1lbnQtPlBoeXNEaXNrRGV2SGFuZGxlKSwKQEAgLTUxNjUsNyArNTUwNiw4IEBACiAJCWNhc2UgTVBJMl9FVkVOVF9JUl9DSEFOR0VfUkNfVk9MVU1FX0RFTEVURUQ6CiAJCWNhc2UgTVBJMl9FVkVOVF9JUl9DSEFOR0VfUkNfUkVNT1ZFRDoKIAkJCWlmICghZm9yZWlnbl9jb25maWcpCi0JCQkJX3Njc2loX3Nhc192b2x1bWVfZGVsZXRlKGlvYywgZWxlbWVudCk7CisJCQkJX3Njc2loX3Nhc192b2x1bWVfZGVsZXRlKGlvYywKKwkJCQkgICAgbGUxNl90b19jcHUoZWxlbWVudC0+Vm9sRGV2SGFuZGxlKSk7CiAJCQlicmVhazsKIAkJY2FzZSBNUEkyX0VWRU5UX0lSX0NIQU5HRV9SQ19QRF9DUkVBVEVEOgogCQkJX3Njc2loX3Nhc19wZF9oaWRlKGlvYywgZWxlbWVudCk7CkBAIC01MjAxLDcgKzU1NDMsNiBAQAogCXUxNiBoYW5kbGU7CiAJdTMyIHN0YXRlOwogCWludCByYzsKLQlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnNhc190YXJnZXRfcHJpdl9kYXRhOwogCU1waTJFdmVudERhdGFJclZvbHVtZV90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAKIAlpZiAoZXZlbnRfZGF0YS0+UmVhc29uQ29kZSAhPSBNUEkyX0VWRU5UX0lSX1ZPTFVNRV9SQ19TVEFURV9DSEFOR0VEKQpAQCAtNTIwOSwzMCArNTU1MCwyNCBAQAogCiAJaGFuZGxlID0gbGUxNl90b19jcHUoZXZlbnRfZGF0YS0+Vm9sRGV2SGFuZGxlKTsKIAlzdGF0ZSA9IGxlMzJfdG9fY3B1KGV2ZW50X2RhdGEtPk5ld1ZhbHVlKTsKLQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogaGFuZGxlKDB4JTA0eCksICIKKwlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBoYW5kbGUoMHglMDR4KSwgIgogCSAgICAib2xkKDB4JTA4eCksIG5ldygweCUwOHgpXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLCAgaGFuZGxlLAogCSAgICBsZTMyX3RvX2NwdShldmVudF9kYXRhLT5QcmV2aW91c1ZhbHVlKSwgc3RhdGUpKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnJhaWRfZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQlyYWlkX2RldmljZSA9IF9zY3NpaF9yYWlkX2RldmljZV9maW5kX2J5X2hhbmRsZShpb2MsIGhhbmRsZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5yYWlkX2RldmljZV9sb2NrLCBmbGFncyk7Ci0KIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBNUEkyX1JBSURfVk9MX1NUQVRFX01JU1NJTkc6CiAJY2FzZSBNUEkyX1JBSURfVk9MX1NUQVRFX0ZBSUxFRDoKLQkJaWYgKCFyYWlkX2RldmljZSkKLQkJCWJyZWFrOwotCQlpZiAocmFpZF9kZXZpY2UtPnN0YXJnZXQpIHsKLQkJCXNhc190YXJnZXRfcHJpdl9kYXRhID0gcmFpZF9kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhOwotCQkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOwotCQkJc2NzaV9yZW1vdmVfdGFyZ2V0KCZyYWlkX2RldmljZS0+c3RhcmdldC0+ZGV2KTsKLQkJfQotCQlfc2NzaWhfcmFpZF9kZXZpY2VfcmVtb3ZlKGlvYywgcmFpZF9kZXZpY2UpOworCQlfc2NzaWhfc2FzX3ZvbHVtZV9kZWxldGUoaW9jLCBoYW5kbGUpOwogCQlicmVhazsKIAogCWNhc2UgTVBJMl9SQUlEX1ZPTF9TVEFURV9PTkxJTkU6CiAJY2FzZSBNUEkyX1JBSURfVk9MX1NUQVRFX0RFR1JBREVEOgogCWNhc2UgTVBJMl9SQUlEX1ZPTF9TVEFURV9PUFRJTUFMOgorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnJhaWRfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJcmFpZF9kZXZpY2UgPSBfc2NzaWhfcmFpZF9kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnJhaWRfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwogCQlpZiAocmFpZF9kZXZpY2UpCiAJCQlicmVhazsKIApAQCAtNTI5NywyMyArNTYzMiwyNSBAQAogCWhhbmRsZSA9IGxlMTZfdG9fY3B1KGV2ZW50X2RhdGEtPlBoeXNEaXNrRGV2SGFuZGxlKTsKIAlzdGF0ZSA9IGxlMzJfdG9fY3B1KGV2ZW50X2RhdGEtPk5ld1ZhbHVlKTsKIAotCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiBoYW5kbGUoMHglMDR4KSwgIgorCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhhbmRsZSgweCUwNHgpLCAiCiAJICAgICJvbGQoMHglMDh4KSwgbmV3KDB4JTA4eClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sICBoYW5kbGUsCiAJICAgIGxlMzJfdG9fY3B1KGV2ZW50X2RhdGEtPlByZXZpb3VzVmFsdWUpLCBzdGF0ZSkpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7Ci0Jc2FzX2RldmljZSA9IF9zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywgaGFuZGxlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwotCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgTVBJMl9SQUlEX1BEX1NUQVRFX09OTElORToKIAljYXNlIE1QSTJfUkFJRF9QRF9TVEFURV9ERUdSQURFRDoKIAljYXNlIE1QSTJfUkFJRF9QRF9TVEFURV9SRUJVSUxESU5HOgogCWNhc2UgTVBJMl9SQUlEX1BEX1NUQVRFX09QVElNQUw6Ci0JCWlmIChzYXNfZGV2aWNlKSB7Ci0JCQlzYXNfZGV2aWNlLT5oaWRkZW5fcmFpZF9jb21wb25lbnQgPSAxOworCWNhc2UgTVBJMl9SQUlEX1BEX1NUQVRFX0hPVF9TUEFSRToKKworCQlzZXRfYml0KGhhbmRsZSwgaW9jLT5wZF9oYW5kbGVzKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJc2FzX2RldmljZSA9IF9zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywgaGFuZGxlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoc2FzX2RldmljZSkKIAkJCXJldHVybjsKLQkJfQogCiAJCWlmICgobXB0MnNhc19jb25maWdfZ2V0X3Nhc19kZXZpY2VfcGcwKGlvYywgJm1waV9yZXBseSwKIAkJICAgICZzYXNfZGV2aWNlX3BnMCwgTVBJMl9TQVNfREVWSUNFX1BHQURfRk9STV9IQU5ETEUsCkBAIC01MzQzLDcgKzU2ODAsNiBAQAogCWNhc2UgTVBJMl9SQUlEX1BEX1NUQVRFX09GRkxJTkU6CiAJY2FzZSBNUEkyX1JBSURfUERfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CiAJY2FzZSBNUEkyX1JBSURfUERfU1RBVEVfTk9UX0NPTVBBVElCTEU6Ci0JY2FzZSBNUEkyX1JBSURfUERfU1RBVEVfSE9UX1NQQVJFOgogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTU0NzEsNyArNTgwNyw3IEBACiAJc2FzX2FkZHJlc3MgPSBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzczsKIAogCS8qIGlmIGhpZGRlbiByYWlkIGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdG8gdm9sdW1lIGNoYXJhY3RlcmlzdGljcyAqLwotCWlmIChzYXNfZGV2aWNlLT5oaWRkZW5fcmFpZF9jb21wb25lbnQgJiYgc2FzX2RldmljZS0+dm9sdW1lX2hhbmRsZSkgeworCWlmICh0ZXN0X2JpdChoYW5kbGUsIGlvYy0+cGRfaGFuZGxlcykgJiYgc2FzX2RldmljZS0+dm9sdW1lX2hhbmRsZSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5yYWlkX2RldmljZV9sb2NrLCBmbGFncyk7CiAJCXJhaWRfZGV2aWNlID0gX3Njc2loX3JhaWRfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKAogCQkgICAgaW9jLCBzYXNfZGV2aWNlLT52b2x1bWVfaGFuZGxlKTsKQEAgLTU0ODUsNyArNTgyMSw3IEBACiAJfQogCiAJaWYgKGlvYy0+bG9nZ2luZ19sZXZlbCAmIE1QVF9ERUJVR19UQVNLX1NFVF9GVUxMKQotCQlzdGFyZ2V0X3ByaW50ayhLRVJOX0RFQlVHLCBzYXNfZGV2aWNlLT5zdGFyZ2V0LCAidGFzayBzZXQgIgorCQlzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHNhc19kZXZpY2UtPnN0YXJnZXQsICJ0YXNrIHNldCAiCiAJCSAgICAiZnVsbDogaGFuZGxlKDB4JTA0eCksIHNhc19hZGRyKDB4JTAxNmxseCksIGRlcHRoKCVkKVxuIiwKIAkJICAgIGhhbmRsZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcywgY3VycmVudF9kZXB0aCk7CiAKQEAgLTU2OTYsOSArNjAzMiwxMiBAQAogX3Njc2loX3NlYXJjaF9yZXNwb25kaW5nX3JhaWRfZGV2aWNlcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCiB7CiAJTXBpMlJhaWRWb2xQYWdlMV90IHZvbHVtZV9wZzE7CisJTXBpMlJhaWRWb2xQYWdlMF90IHZvbHVtZV9wZzA7CisJTXBpMlJhaWRQaHlzRGlza1BhZ2UwX3QgcGRfcGcwOwogCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKIAl1MTYgaW9jX3N0YXR1czsKIAl1MTYgaGFuZGxlOworCXU4IHBoeXNfZGlza19udW07CiAKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOwogCkBAIC01NzEzLDggKzYwNTIsMzIgQEAKIAkJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfQ09ORklHX0lOVkFMSURfUEFHRSkKIAkJCWJyZWFrOwogCQloYW5kbGUgPSBsZTE2X3RvX2NwdSh2b2x1bWVfcGcxLkRldkhhbmRsZSk7Ci0JCV9zY3NpaF9tYXJrX3Jlc3BvbmRpbmdfcmFpZF9kZXZpY2UoaW9jLAotCQkgICAgbGU2NF90b19jcHUodm9sdW1lX3BnMS5XV0lEKSwgaGFuZGxlKTsKKworCQlpZiAobXB0MnNhc19jb25maWdfZ2V0X3JhaWRfdm9sdW1lX3BnMChpb2MsICZtcGlfcmVwbHksCisJCSAgICAmdm9sdW1lX3BnMCwgTVBJMl9SQUlEX1ZPTFVNRV9QR0FEX0ZPUk1fSEFORExFLCBoYW5kbGUsCisJCSAgICAgc2l6ZW9mKE1waTJSYWlkVm9sUGFnZTBfdCkpKQorCQkJY29udGludWU7CisKKwkJaWYgKHZvbHVtZV9wZzAuVm9sdW1lU3RhdGUgPT0gTVBJMl9SQUlEX1ZPTF9TVEFURV9PUFRJTUFMIHx8CisJCSAgICB2b2x1bWVfcGcwLlZvbHVtZVN0YXRlID09IE1QSTJfUkFJRF9WT0xfU1RBVEVfT05MSU5FIHx8CisJCSAgICB2b2x1bWVfcGcwLlZvbHVtZVN0YXRlID09IE1QSTJfUkFJRF9WT0xfU1RBVEVfREVHUkFERUQpCisJCQlfc2NzaWhfbWFya19yZXNwb25kaW5nX3JhaWRfZGV2aWNlKGlvYywKKwkJCSAgICBsZTY0X3RvX2NwdSh2b2x1bWVfcGcxLldXSUQpLCBoYW5kbGUpOworCX0KKworCS8qIHJlZnJlc2ggdGhlIHBkX2hhbmRsZXMgKi8KKwlwaHlzX2Rpc2tfbnVtID0gMHhGRjsKKwltZW1zZXQoaW9jLT5wZF9oYW5kbGVzLCAwLCBpb2MtPnBkX2hhbmRsZXNfc3opOworCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9waHlzX2Rpc2tfcGcwKGlvYywgJm1waV9yZXBseSwKKwkgICAgJnBkX3BnMCwgTVBJMl9QSFlTRElTS19QR0FEX0ZPUk1fR0VUX05FWFRfUEhZU0RJU0tOVU0sCisJICAgIHBoeXNfZGlza19udW0pKSkgeworCQlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJgorCQkgICAgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfQ09ORklHX0lOVkFMSURfUEFHRSkKKwkJCWJyZWFrOworCQlwaHlzX2Rpc2tfbnVtID0gcGRfcGcwLlBoeXNEaXNrTnVtOworCQloYW5kbGUgPSBsZTE2X3RvX2NwdShwZF9wZzAuRGV2SGFuZGxlKTsKKwkJc2V0X2JpdChoYW5kbGUsIGlvYy0+cGRfaGFuZGxlcyk7CiAJfQogfQogCkBAIC01ODc2LDExICs2MjM5LDExIEBACiB7CiAJc3dpdGNoIChyZXNldF9waGFzZSkgewogCWNhc2UgTVBUMl9JT0NfUFJFX1JFU0VUOgotCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkgICAgIk1QVDJfSU9DX1BSRV9SRVNFVFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCQlicmVhazsKIAljYXNlIE1QVDJfSU9DX0FGVEVSX1JFU0VUOgotCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkgICAgIk1QVDJfSU9DX0FGVEVSX1JFU0VUXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CiAJCWlmIChpb2MtPnNjc2loX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfUEVORElORykgewogCQkJaW9jLT5zY3NpaF9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9SRVNFVDsKQEAgLTU4OTcsNyArNjI2MCw3IEBACiAJCV9zY3NpaF9xdWV1ZV9yZXNjYW4oaW9jKTsKIAkJYnJlYWs7CiAJY2FzZSBNUFQyX0lPQ19ET05FX1JFU0VUOgotCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzOiAiCisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgogCQkgICAgIk1QVDJfSU9DX0RPTkVfUkVTRVRcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAkJX3Njc2loX3Nhc19ob3N0X3JlZnJlc2goaW9jKTsKIAkJX3Njc2loX3ByZXBfZGV2aWNlX3NjYW4oaW9jKTsKQEAgLTU5MjUsNyArNjI4OCw4IEBACiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gZndfZXZlbnQtPmlvYzsKIAogCS8qIHRoZSBxdWV1ZSBpcyBiZWluZyBmbHVzaGVkIHNvIGlnbm9yZSB0aGlzIGV2ZW50ICovCi0JaWYgKGlvYy0+cmVtb3ZlX2hvc3QgfHwgZndfZXZlbnQtPmNhbmNlbF9wZW5kaW5nX3dvcmspIHsKKwlpZiAoaW9jLT5yZW1vdmVfaG9zdCB8fCBmd19ldmVudC0+Y2FuY2VsX3BlbmRpbmdfd29yayB8fAorCSAgICBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgewogCQlfc2NzaWhfZndfZXZlbnRfZnJlZShpb2MsIGZ3X2V2ZW50KTsKIAkJcmV0dXJuOwogCX0KQEAgLTYwMDcsNyArNjM3MSw3IEBACiAJdTE2IHN6OwogCiAJLyogZXZlbnRzIHR1cm5lZCBvZmYgZHVlIHRvIGhvc3QgcmVzZXQgb3IgZHJpdmVyIHVubG9hZGluZyAqLwotCWlmIChpb2MtPnJlbW92ZV9ob3N0KQorCWlmIChpb2MtPnJlbW92ZV9ob3N0IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQlyZXR1cm4gMTsKIAogCW1waV9yZXBseSA9IG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwpAQCAtNjAzNCwxNCArNjM5OCwyMSBAQAogCQkgICAgKE1waTJFdmVudERhdGFTYXNUb3BvbG9neUNoYW5nZUxpc3RfdCAqKQogCQkgICAgbXBpX3JlcGx5LT5FdmVudERhdGEpOwogCQlicmVhazsKLQorCWNhc2UgTVBJMl9FVkVOVF9JUl9DT05GSUdVUkFUSU9OX0NIQU5HRV9MSVNUOgorCQlfc2NzaWhfY2hlY2tfaXJfY29uZmlnX3VuaGlkZV9ldmVudHMoaW9jLAorCQkgICAgKE1waTJFdmVudERhdGFJckNvbmZpZ0NoYW5nZUxpc3RfdCAqKQorCQkgICAgbXBpX3JlcGx5LT5FdmVudERhdGEpOworCQlicmVhazsKKwljYXNlIE1QSTJfRVZFTlRfSVJfVk9MVU1FOgorCQlfc2NzaWhfY2hlY2tfdm9sdW1lX2RlbGV0ZV9ldmVudHMoaW9jLAorCQkgICAgKE1waTJFdmVudERhdGFJclZvbHVtZV90ICopCisJCSAgICBtcGlfcmVwbHktPkV2ZW50RGF0YSk7CisJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9TQVNfREVWSUNFX1NUQVRVU19DSEFOR0U6CiAJY2FzZSBNUEkyX0VWRU5UX0lSX09QRVJBVElPTl9TVEFUVVM6CiAJY2FzZSBNUEkyX0VWRU5UX1NBU19ESVNDT1ZFUlk6CiAJY2FzZSBNUEkyX0VWRU5UX1NBU19FTkNMX0RFVklDRV9TVEFUVVNfQ0hBTkdFOgotCWNhc2UgTVBJMl9FVkVOVF9JUl9WT0xVTUU6CiAJY2FzZSBNUEkyX0VWRU5UX0lSX1BIWVNJQ0FMX0RJU0s6Ci0JY2FzZSBNUEkyX0VWRU5UX0lSX0NPTkZJR1VSQVRJT05fQ0hBTkdFX0xJU1Q6CiAJY2FzZSBNUEkyX0VWRU5UX1RBU0tfU0VUX0ZVTEw6CiAJCWJyZWFrOwogCkBAIC02NTQ4LDkgKzY5MTksMTEgQEAKIAlpb2MtPnNjc2loX2NiX2lkeCA9IHNjc2loX2NiX2lkeDsKIAlpb2MtPmNvbmZpZ19jYl9pZHggPSBjb25maWdfY2JfaWR4OwogCWlvYy0+dG1fdHJfY2JfaWR4ID0gdG1fdHJfY2JfaWR4OworCWlvYy0+dG1fdHJfdm9sdW1lX2NiX2lkeCA9IHRtX3RyX3ZvbHVtZV9jYl9pZHg7CiAJaW9jLT50bV9zYXNfY29udHJvbF9jYl9pZHggPSB0bV9zYXNfY29udHJvbF9jYl9pZHg7CiAJaW9jLT5sb2dnaW5nX2xldmVsID0gbG9nZ2luZ19sZXZlbDsKIAkvKiBtaXNjIHNlbWFwaG9yZXMgYW5kIHNwaW4gbG9ja3MgKi8KKwltdXRleF9pbml0KCZpb2MtPnJlc2V0X2luX3Byb2dyZXNzX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmlvYy0+c2NzaV9sb29rdXBfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmlvYy0+c2FzX2RldmljZV9sb2NrKTsKQEAgLTY1NjUsOSArNjkzOCwxMCBAQAogCUlOSVRfTElTVF9IRUFEKCZpb2MtPnJhaWRfZGV2aWNlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpb2MtPnNhc19oYmEuc2FzX3BvcnRfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmlvYy0+ZGVsYXllZF90cl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5kZWxheWVkX3RyX3ZvbHVtZV9saXN0KTsKIAogCS8qIGluaXQgc2hvc3QgcGFyYW1ldGVycyAqLwotCXNob3N0LT5tYXhfY21kX2xlbiA9IDE2OworCXNob3N0LT5tYXhfY21kX2xlbiA9IDMyOwogCXNob3N0LT5tYXhfbHVuID0gbWF4X2x1bjsKIAlzaG9zdC0+dHJhbnNwb3J0dCA9IG1wdDJzYXNfdHJhbnNwb3J0X3RlbXBsYXRlOwogCXNob3N0LT51bmlxdWVfaWQgPSBpb2MtPmlkOwpAQCAtNjU4MCw3ICs2OTU0LDcgQEAKIAl9CiAKIAlzY3NpX2hvc3Rfc2V0X3Byb3Qoc2hvc3QsIFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OCi0JICAgIHwgU0hPU1RfRElGX1RZUEUzX1BST1RFQ1RJT04pOworCSAgICB8IFNIT1NUX0RJRl9UWVBFMl9QUk9URUNUSU9OIHwgU0hPU1RfRElGX1RZUEUzX1BST1RFQ1RJT04pOwogCXNjc2lfaG9zdF9zZXRfZ3VhcmQoc2hvc3QsIFNIT1NUX0RJWF9HVUFSRF9DUkMpOwogCiAJLyogZXZlbnQgdGhyZWFkICovCkBAIC02NzAwLDEyICs3MDc0LDE3IEBACiAJY2FzZSBwY2lfY2hhbm5lbF9pb19ub3JtYWw6CiAJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9DQU5fUkVDT1ZFUjsKIAljYXNlIHBjaV9jaGFubmVsX2lvX2Zyb3plbjoKKwkJLyogRmF0YWwgZXJyb3IsIHByZXBhcmUgZm9yIHNsb3QgcmVzZXQgKi8KKwkJaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkgPSAxOwogCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGlvYy0+c2hvc3QpOwogCQltcHQyc2FzX2Jhc2Vfc3RvcF93YXRjaGRvZyhpb2MpOwogCQltcHQyc2FzX2Jhc2VfZnJlZV9yZXNvdXJjZXMoaW9jKTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CiAJY2FzZSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmU6Ci0JCV9zY3NpaF9yZW1vdmUocGRldik7CisJCS8qIFBlcm1hbmVudCBlcnJvciwgcHJlcGFyZSBmb3IgZGV2aWNlIHJlbW92YWwgKi8KKwkJaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkgPSAxOworCQltcHQyc2FzX2Jhc2Vfc3RvcF93YXRjaGRvZyhpb2MpOworCQlfc2NzaWhfZmx1c2hfcnVubmluZ19jbWRzKGlvYyk7CiAJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOwogCX0KIAlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKQEAgLTY3MjksNyArNzEwOCw5IEBACiAJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIlBDSSBlcnJvcjogc2xvdCByZXNldCBjYWxsYmFjayEhXG4iLAogCQlpb2MtPm5hbWUpOwogCisJaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkgPSAwOwogCWlvYy0+cGRldiA9IHBkZXY7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAJcmMgPSBtcHQyc2FzX2Jhc2VfbWFwX3Jlc291cmNlcyhpb2MpOwogCWlmIChyYykKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CkBAIC02ODQ1LDcgKzcyMjYsNyBAQAogCSAvKiBxdWV1ZWNvbW1hbmQgY2FsbGJhY2sgaGFuZGVyICovCiAJc2NzaV9pb19jYl9pZHggPSBtcHQyc2FzX2Jhc2VfcmVnaXN0ZXJfY2FsbGJhY2tfaGFuZGxlcihfc2NzaWhfaW9fZG9uZSk7CiAKLQkvKiB0YXNrIG1hbmFnbWVudCBjYWxsYmFjayBoYW5kbGVyICovCisJLyogdGFzayBtYW5hZ2VtZW50IGNhbGxiYWNrIGhhbmRsZXIgKi8KIAl0bV9jYl9pZHggPSBtcHQyc2FzX2Jhc2VfcmVnaXN0ZXJfY2FsbGJhY2tfaGFuZGxlcihfc2NzaWhfdG1fZG9uZSk7CiAKIAkvKiBiYXNlIGludGVybmFsIGNvbW1hbmRzIGNhbGxiYWNrIGhhbmRsZXIgKi8KQEAgLTY4NjcsNiArNzI0OCwxMCBAQAogCiAJdG1fdHJfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCiAJICAgIF9zY3NpaF90bV90cl9jb21wbGV0ZSk7CisKKwl0bV90cl92b2x1bWVfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCisJICAgIF9zY3NpaF90bV92b2x1bWVfdHJfY29tcGxldGUpOworCiAJdG1fc2FzX2NvbnRyb2xfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCiAJICAgIF9zY3NpaF9zYXNfY29udHJvbF9jb21wbGV0ZSk7CiAKQEAgLTY5MDYsNiArNzI5MSw3IEBACiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcihjdGxfY2JfaWR4KTsKIAogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIodG1fdHJfY2JfaWR4KTsKKwltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHRtX3RyX3ZvbHVtZV9jYl9pZHgpOwogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIodG1fc2FzX2NvbnRyb2xfY2JfaWR4KTsKIAogCS8qIHJhaWQgdHJhbnNwb3J0IHN1cHBvcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCmluZGV4IDI3MjdjM2IuLmI1NWM2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJdTMyIGRldmljZV9pbmZvOwogCXUzMiBpb2Nfc3RhdHVzOwogCi0JaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpIHsKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgewogCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgcmVzZXQgaW4gcHJvZ3Jlc3MhXG4iLAogCQkgICAgX19mdW5jX18sIGlvYy0+bmFtZSk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMzAyLDcgKzMwMiw3IEBACiAJdTY0ICpzYXNfYWRkcmVzc19sZTsKIAl1MTYgd2FpdF9zdGF0ZV9jb3VudDsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KSB7CisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpIHsKIAkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluIHByb2dyZXNzIVxuIiwKIAkJICAgIF9fZnVuY19fLCBpb2MtPm5hbWUpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTM5Nyw3ICszOTcsNyBAQAogCSAgICBzaXplb2Yoc3RydWN0IHJlcF9tYW51X3JlcGx5KSwgZGF0YV9vdXRfZG1hICsKIAkgICAgc2l6ZW9mKHN0cnVjdCByZXBfbWFudV9yZXF1ZXN0KSk7CiAKLQlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJyZXBvcnRfbWFudWZhY3R1cmUgLSAiCisJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZXBvcnRfbWFudWZhY3R1cmUgLSAiCiAJICAgICJzZW5kIHRvIHNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwKIAkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcykpOwogCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CkBAIC00MTUsNyArNDE1LDcgQEAKIAkJZ290byBpc3N1ZV9ob3N0X3Jlc2V0OwogCX0KIAotCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgInJlcG9ydF9tYW51ZmFjdHVyZSAtICIKKwlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInJlcG9ydF9tYW51ZmFjdHVyZSAtICIKIAkgICAgImNvbXBsZXRlXG4iLCBpb2MtPm5hbWUpKTsKIAogCWlmIChpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1JFUExZX1ZBTElEKSB7CkBAIC00MjMsNyArNDIzLDcgQEAKIAogCQltcGlfcmVwbHkgPSBpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5OwogCi0JCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCiAJCSAgICAicmVwb3J0X21hbnVmYWN0dXJlIC0gcmVwbHkgZGF0YSB0cmFuc2ZlciBzaXplKCVkKVxuIiwKIAkJICAgIGlvYy0+bmFtZSwgbGUxNl90b19jcHUobXBpX3JlcGx5LT5SZXNwb25zZURhdGFMZW5ndGgpKSk7CiAKQEAgLTQ0OSw3ICs0NDksNyBAQAogCQkJICAgIG1hbnVmYWN0dXJlX3JlcGx5LT5jb21wb25lbnRfcmV2aXNpb25faWQ7CiAJCX0KIAl9IGVsc2UKLQkJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVAorCQlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKIAkJICAgICJyZXBvcnRfbWFudWZhY3R1cmUgLSBubyByZXBseVxuIiwgaW9jLT5uYW1lKSk7CiAKICBpc3N1ZV9ob3N0X3Jlc2V0OgpAQCAtODk0LDcgKzg5NCw3IEBACiAJc3RydWN0IF9zYXNfbm9kZSAqc2FzX25vZGU7CiAJc3RydWN0IF9zYXNfcGh5ICptcHQyc2FzX3BoeTsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CkBAIC05NDAsMjIgKzk0MCwyMzAgQEAKIAlyZXR1cm4gc2hvc3RfcHJpdihzaG9zdCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgX3Nhc19waHkgKgotX3RyYW5zcG9ydF9maW5kX2xvY2FsX3BoeShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHN0cnVjdCBzYXNfcGh5ICpwaHkpCi17Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW9jLT5zYXNfaGJhLm51bV9waHlzOyBpKyspCi0JCWlmIChpb2MtPnNhc19oYmEucGh5W2ldLnBoeSA9PSBwaHkpCi0JCQlyZXR1cm4oJmlvYy0+c2FzX2hiYS5waHlbaV0pOwotCXJldHVybiBOVUxMOworLyogcmVwb3J0IHBoeSBlcnJvciBsb2cgc3RydWN0dXJlICovCitzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXF1ZXN0eworCXU4IHNtcF9mcmFtZV90eXBlOyAvKiAweDQwICovCisJdTggZnVuY3Rpb247IC8qIDB4MTEgKi8KKwl1OCBhbGxvY2F0ZWRfcmVzcG9uc2VfbGVuZ3RoOworCXU4IHJlcXVlc3RfbGVuZ3RoOyAvKiAwMiAqLworCXU4IHJlc2VydmVkXzFbNV07CisJdTggcGh5X2lkZW50aWZpZXI7CisJdTggcmVzZXJ2ZWRfMlsyXTsKK307CisKKy8qIHJlcG9ydCBwaHkgZXJyb3IgbG9nIHJlcGx5IHN0cnVjdHVyZSAqLworc3RydWN0IHBoeV9lcnJvcl9sb2dfcmVwbHl7CisJdTggc21wX2ZyYW1lX3R5cGU7IC8qIDB4NDEgKi8KKwl1OCBmdW5jdGlvbjsgLyogMHgxMSAqLworCXU4IGZ1bmN0aW9uX3Jlc3VsdDsKKwl1OCByZXNwb25zZV9sZW5ndGg7CisJdTE2IGV4cGFuZGVyX2NoYW5nZV9jb3VudDsKKwl1OCByZXNlcnZlZF8xWzNdOworCXU4IHBoeV9pZGVudGlmaWVyOworCXU4IHJlc2VydmVkXzJbMl07CisJdTMyIGludmFsaWRfZHdvcmQ7CisJdTMyIHJ1bm5pbmdfZGlzcGFyaXR5X2Vycm9yOworCXUzMiBsb3NzX29mX2R3b3JkX3N5bmM7CisJdTMyIHBoeV9yZXNldF9wcm9ibGVtOworfTsKKworLyoqCisgKiBfdHJhbnNwb3J0X2dldF9leHBhbmRlcl9waHlfZXJyb3JfbG9nIC0gcmV0dXJuIGV4cGFuZGVyIGNvdW50ZXJzCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBwaHk6IFRoZSBzYXMgcGh5IG9iamVjdAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCisgKgorICovCitzdGF0aWMgaW50CitfdHJhbnNwb3J0X2dldF9leHBhbmRlcl9waHlfZXJyb3JfbG9nKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKKyAgICBzdHJ1Y3Qgc2FzX3BoeSAqcGh5KQoreworCU1waTJTbXBQYXNzdGhyb3VnaFJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CisJTXBpMlNtcFBhc3N0aHJvdWdoUmVwbHlfdCAqbXBpX3JlcGx5OworCXN0cnVjdCBwaHlfZXJyb3JfbG9nX3JlcXVlc3QgKnBoeV9lcnJvcl9sb2dfcmVxdWVzdDsKKwlzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXBseSAqcGh5X2Vycm9yX2xvZ19yZXBseTsKKwlpbnQgcmM7CisJdTE2IHNtaWQ7CisJdTMyIGlvY19zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OworCXZvaWQgKnBzZ2U7CisJdTMyIHNnbF9mbGFnczsKKwl1OCBpc3N1ZV9yZXNldCA9IDA7CisJdm9pZCAqZGF0YV9vdXQgPSBOVUxMOworCWRtYV9hZGRyX3QgZGF0YV9vdXRfZG1hOworCXUzMiBzejsKKwl1NjQgKnNhc19hZGRyZXNzX2xlOworCXUxNiB3YWl0X3N0YXRlX2NvdW50OworCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpIHsKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluIHByb2dyZXNzIVxuIiwKKwkJICAgIF9fZnVuY19fLCBpb2MtPm5hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwltdXRleF9sb2NrKCZpb2MtPnRyYW5zcG9ydF9jbWRzLm11dGV4KTsKKworCWlmIChpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyAhPSBNUFQyX0NNRF9OT1RfVVNFRCkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogdHJhbnNwb3J0X2NtZHMgaW4gdXNlXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKKworCXdhaXRfc3RhdGVfY291bnQgPSAwOworCWlvY19zdGF0ZSA9IG1wdDJzYXNfYmFzZV9nZXRfaW9jc3RhdGUoaW9jLCAxKTsKKwl3aGlsZSAoaW9jX3N0YXRlICE9IE1QSTJfSU9DX1NUQVRFX09QRVJBVElPTkFMKSB7CisJCWlmICh3YWl0X3N0YXRlX2NvdW50KysgPT0gMTApIHsKKwkJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQKKwkJCSAgICAiJXM6IGZhaWxlZCBkdWUgdG8gaW9jIG5vdCBvcGVyYXRpb25hbFxuIiwKKwkJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNzbGVlcCgxKTsKKwkJaW9jX3N0YXRlID0gbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDEpOworCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IHdhaXRpbmcgZm9yICIKKwkJICAgICJvcGVyYXRpb25hbCBzdGF0ZShjb3VudD0lZClcbiIsIGlvYy0+bmFtZSwKKwkJICAgIF9fZnVuY19fLCB3YWl0X3N0YXRlX2NvdW50KTsKKwl9CisJaWYgKHdhaXRfc3RhdGVfY291bnQpCisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaW9jIGlzIG9wZXJhdGlvbmFsXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisKKwlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkKGlvYywgaW9jLT50cmFuc3BvcnRfY2JfaWR4KTsKKwlpZiAoIXNtaWQpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBvYnRhaW5pbmcgYSBzbWlkXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJbXBpX3JlcXVlc3QgPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWQpOworCWlvYy0+dHJhbnNwb3J0X2NtZHMuc21pZCA9IHNtaWQ7CisKKwlzeiA9IHNpemVvZihzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXF1ZXN0KSArCisJICAgIHNpemVvZihzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXBseSk7CisJZGF0YV9vdXQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBkZXYsIHN6LCAmZGF0YV9vdXRfZG1hKTsKKwlpZiAoIWRhdGFfb3V0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgX19GSUxFX18sCisJCSAgICBfX0xJTkVfXywgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBzbWlkKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAtRUlOVkFMOworCW1lbXNldChkYXRhX291dCwgMCwgc3opOworCXBoeV9lcnJvcl9sb2dfcmVxdWVzdCA9IGRhdGFfb3V0OworCXBoeV9lcnJvcl9sb2dfcmVxdWVzdC0+c21wX2ZyYW1lX3R5cGUgPSAweDQwOworCXBoeV9lcnJvcl9sb2dfcmVxdWVzdC0+ZnVuY3Rpb24gPSAweDExOworCXBoeV9lcnJvcl9sb2dfcmVxdWVzdC0+cmVxdWVzdF9sZW5ndGggPSAyOworCXBoeV9lcnJvcl9sb2dfcmVxdWVzdC0+YWxsb2NhdGVkX3Jlc3BvbnNlX2xlbmd0aCA9IDA7CisJcGh5X2Vycm9yX2xvZ19yZXF1ZXN0LT5waHlfaWRlbnRpZmllciA9IHBoeS0+bnVtYmVyOworCisJbWVtc2V0KG1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlNtcFBhc3N0aHJvdWdoUmVxdWVzdF90KSk7CisJbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9TTVBfUEFTU1RIUk9VR0g7CisJbXBpX3JlcXVlc3QtPlBoeXNpY2FsUG9ydCA9IDB4RkY7CisJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLworCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CisJc2FzX2FkZHJlc3NfbGUgPSAodTY0ICopJm1waV9yZXF1ZXN0LT5TQVNBZGRyZXNzOworCSpzYXNfYWRkcmVzc19sZSA9IGNwdV90b19sZTY0KHBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MpOworCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXF1ZXN0KSk7CisJcHNnZSA9ICZtcGlfcmVxdWVzdC0+U0dMOworCisJLyogV1JJVEUgc2dlbCBmaXJzdCAqLworCXNnbF9mbGFncyA9IChNUEkyX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8CisJICAgIE1QSTJfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfCBNUEkyX1NHRV9GTEFHU19IT1NUX1RPX0lPQyk7CisJc2dsX2ZsYWdzID0gc2dsX2ZsYWdzIDw8IE1QSTJfU0dFX0ZMQUdTX1NISUZUOworCWlvYy0+YmFzZV9hZGRfc2dfc2luZ2xlKHBzZ2UsIHNnbF9mbGFncyB8CisJICAgIHNpemVvZihzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXF1ZXN0KSwgZGF0YV9vdXRfZG1hKTsKKworCS8qIGluY3Igc2dlbCAqLworCXBzZ2UgKz0gaW9jLT5zZ2Vfc2l6ZTsKKworCS8qIFJFQUQgc2dlbCBsYXN0ICovCisJc2dsX2ZsYWdzID0gKE1QSTJfU0dFX0ZMQUdTX1NJTVBMRV9FTEVNRU5UIHwKKwkgICAgTVBJMl9TR0VfRkxBR1NfTEFTVF9FTEVNRU5UIHwgTVBJMl9TR0VfRkxBR1NfRU5EX09GX0JVRkZFUiB8CisJICAgIE1QSTJfU0dFX0ZMQUdTX0VORF9PRl9MSVNUKTsKKwlzZ2xfZmxhZ3MgPSBzZ2xfZmxhZ3MgPDwgTVBJMl9TR0VfRkxBR1NfU0hJRlQ7CisJaW9jLT5iYXNlX2FkZF9zZ19zaW5nbGUocHNnZSwgc2dsX2ZsYWdzIHwKKwkgICAgc2l6ZW9mKHN0cnVjdCBwaHlfZXJyb3JfbG9nX3JlcGx5KSwgZGF0YV9vdXRfZG1hICsKKwkgICAgc2l6ZW9mKHN0cnVjdCBwaHlfZXJyb3JfbG9nX3JlcXVlc3QpKTsKKworCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicGh5X2Vycm9yX2xvZyAtICIKKwkgICAgInNlbmQgdG8gc2FzX2FkZHIoMHglMDE2bGx4KSwgcGh5KCVkKVxuIiwgaW9jLT5uYW1lLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MsIHBoeS0+bnVtYmVyKSk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSk7CisJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSwKKwkgICAgMTAqSFopOworCisJaWYgKCEoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9DT01QTEVURSkpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IHRpbWVvdXRcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJX2RlYnVnX2R1bXBfbWYobXBpX3JlcXVlc3QsCisJCSAgICBzaXplb2YoTXBpMlNtcFBhc3N0aHJvdWdoUmVxdWVzdF90KS80KTsKKwkJaWYgKCEoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9SRVNFVCkpCisJCQlpc3N1ZV9yZXNldCA9IDE7CisJCWdvdG8gaXNzdWVfaG9zdF9yZXNldDsKKwl9CisKKwlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBoeV9lcnJvcl9sb2cgLSAiCisJICAgICJjb21wbGV0ZVxuIiwgaW9jLT5uYW1lKSk7CisKKwlpZiAoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9SRVBMWV9WQUxJRCkgeworCisJCW1waV9yZXBseSA9IGlvYy0+dHJhbnNwb3J0X2NtZHMucmVwbHk7CisKKwkJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCisJCSAgICAicGh5X2Vycm9yX2xvZyAtIHJlcGx5IGRhdGEgdHJhbnNmZXIgc2l6ZSglZClcbiIsCisJCSAgICBpb2MtPm5hbWUsIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+UmVzcG9uc2VEYXRhTGVuZ3RoKSkpOworCisJCWlmIChsZTE2X3RvX2NwdShtcGlfcmVwbHktPlJlc3BvbnNlRGF0YUxlbmd0aCkgIT0KKwkJICAgIHNpemVvZihzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXBseSkpCisJCQlnb3RvIG91dDsKKworCQlwaHlfZXJyb3JfbG9nX3JlcGx5ID0gZGF0YV9vdXQgKworCQkgICAgc2l6ZW9mKHN0cnVjdCBwaHlfZXJyb3JfbG9nX3JlcXVlc3QpOworCisJCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAorCQkgICAgInBoeV9lcnJvcl9sb2cgLSBmdW5jdGlvbl9yZXN1bHQoJWQpXG4iLAorCQkgICAgaW9jLT5uYW1lLCBwaHlfZXJyb3JfbG9nX3JlcGx5LT5mdW5jdGlvbl9yZXN1bHQpKTsKKworCQlwaHktPmludmFsaWRfZHdvcmRfY291bnQgPQorCQkgICAgYmUzMl90b19jcHUocGh5X2Vycm9yX2xvZ19yZXBseS0+aW52YWxpZF9kd29yZCk7CisJCXBoeS0+cnVubmluZ19kaXNwYXJpdHlfZXJyb3JfY291bnQgPQorCQkgICAgYmUzMl90b19jcHUocGh5X2Vycm9yX2xvZ19yZXBseS0+cnVubmluZ19kaXNwYXJpdHlfZXJyb3IpOworCQlwaHktPmxvc3Nfb2ZfZHdvcmRfc3luY19jb3VudCA9CisJCSAgICBiZTMyX3RvX2NwdShwaHlfZXJyb3JfbG9nX3JlcGx5LT5sb3NzX29mX2R3b3JkX3N5bmMpOworCQlwaHktPnBoeV9yZXNldF9wcm9ibGVtX2NvdW50ID0KKwkJICAgIGJlMzJfdG9fY3B1KHBoeV9lcnJvcl9sb2dfcmVwbHktPnBoeV9yZXNldF9wcm9ibGVtKTsKKwkJcmMgPSAwOworCX0gZWxzZQorCQlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJICAgICJwaHlfZXJyb3JfbG9nIC0gbm8gcmVwbHlcbiIsIGlvYy0+bmFtZSkpOworCisgaXNzdWVfaG9zdF9yZXNldDoKKwlpZiAoaXNzdWVfcmVzZXQpCisJCW1wdDJzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCisJCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKKyBvdXQ6CisJaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKKwlpZiAoZGF0YV9vdXQpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wZGV2LCBzeiwgZGF0YV9vdXQsIGRhdGFfb3V0X2RtYSk7CisKKwltdXRleF91bmxvY2soJmlvYy0+dHJhbnNwb3J0X2NtZHMubXV0ZXgpOworCXJldHVybiByYzsKIH0KIAogLyoqCi0gKiBfdHJhbnNwb3J0X2dldF9saW5rZXJyb3JzIC0KKyAqIF90cmFuc3BvcnRfZ2V0X2xpbmtlcnJvcnMgLSByZXR1cm4gcGh5IGNvdW50ZXJzIGZvciBib3RoIGhiYSBhbmQgZXhwYW5kZXJzCiAgKiBAcGh5OiBUaGUgc2FzIHBoeSBvYmplY3QKICAqCi0gKiBPbmx5IHN1cHBvcnQgc2FzX2hvc3QgZGlyZWN0IGF0dGFjaGVkIHBoeXMuCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICoKICAqLwpAQCAtOTYzLDE3ICsxMTcxLDI0IEBACiBfdHJhbnNwb3J0X2dldF9saW5rZXJyb3JzKHN0cnVjdCBzYXNfcGh5ICpwaHkpCiB7CiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gcGh5X3RvX2lvYyhwaHkpOwotCXN0cnVjdCBfc2FzX3BoeSAqbXB0MnNhc19waHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlNcGkyQ29uZmlnUmVwbHlfdCBtcGlfcmVwbHk7CiAJTXBpMlNhc1BoeVBhZ2UxX3QgcGh5X3BnMTsKIAotCW1wdDJzYXNfcGh5ID0gX3RyYW5zcG9ydF9maW5kX2xvY2FsX3BoeShpb2MsIHBoeSk7Ci0KLQlpZiAoIW1wdDJzYXNfcGh5KSAvKiB0aGlzIHBoeSBub3Qgb24gc2FzX2hvc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CisJaWYgKF90cmFuc3BvcnRfc2FzX25vZGVfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJICAgIHBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MpID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKIAorCWlmIChwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzICE9IGlvYy0+c2FzX2hiYS5zYXNfYWRkcmVzcykKKwkJcmV0dXJuIF90cmFuc3BvcnRfZ2V0X2V4cGFuZGVyX3BoeV9lcnJvcl9sb2coaW9jLCBwaHkpOworCisJLyogZ2V0IGhiYSBwaHkgZXJyb3IgbG9ncyAqLwogCWlmICgobXB0MnNhc19jb25maWdfZ2V0X3BoeV9wZzEoaW9jLCAmbXBpX3JlcGx5LCAmcGh5X3BnMSwKLQkJICAgIG1wdDJzYXNfcGh5LT5waHlfaWQpKSkgeworCQkgICAgcGh5LT5udW1iZXIpKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTk4Miw4ICsxMTk3LDcgQEAKIAlpZiAobXBpX3JlcGx5LklPQ1N0YXR1cyB8fCBtcGlfcmVwbHkuSU9DTG9nSW5mbykKIAkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBoeSglZCksIGlvY19zdGF0dXMiCiAJCSAgICAiKDB4JTA0eCksIGxvZ2luZm8oMHglMDh4KVxuIiwgaW9jLT5uYW1lLAotCQkgICAgbXB0MnNhc19waHktPnBoeV9pZCwKLQkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpLAorCQkgICAgcGh5LT5udW1iZXIsIGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpLAogCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LklPQ0xvZ0luZm8pKTsKIAogCXBoeS0+aW52YWxpZF9kd29yZF9jb3VudCA9IGxlMzJfdG9fY3B1KHBoeV9wZzEuSW52YWxpZER3b3JkQ291bnQpOwpAQCAtMTAwNywxOCArMTIyMSwxOCBAQAogX3RyYW5zcG9ydF9nZXRfZW5jbG9zdXJlX2lkZW50aWZpZXIoc3RydWN0IHNhc19ycGh5ICpycGh5LCB1NjQgKmlkZW50aWZpZXIpCiB7CiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gcnBoeV90b19pb2MocnBoeSk7Ci0Jc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyOworCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwotCXNhc19leHBhbmRlciA9IG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJc2FzX2RldmljZSA9IG1wdDJzYXNfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X3Nhc19hZGRyZXNzKGlvYywKIAkgICAgcnBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoIXNhc19leHBhbmRlcikKKwlpZiAoIXNhc19kZXZpY2UpCiAJCXJldHVybiAtRU5YSU87CiAKLQkqaWRlbnRpZmllciA9IHNhc19leHBhbmRlci0+ZW5jbG9zdXJlX2xvZ2ljYWxfaWQ7CisJKmlkZW50aWZpZXIgPSBzYXNfZGV2aWNlLT5lbmNsb3N1cmVfbG9naWNhbF9pZDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA0NiwzMiArMTI2MCwyNjAgQEAKIAlyZXR1cm4gc2FzX2RldmljZS0+c2xvdDsKIH0KIAorLyogcGh5IGNvbnRyb2wgcmVxdWVzdCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBwaHlfY29udHJvbF9yZXF1ZXN0eworCXU4IHNtcF9mcmFtZV90eXBlOyAvKiAweDQwICovCisJdTggZnVuY3Rpb247IC8qIDB4OTEgKi8KKwl1OCBhbGxvY2F0ZWRfcmVzcG9uc2VfbGVuZ3RoOworCXU4IHJlcXVlc3RfbGVuZ3RoOyAvKiAweDA5ICovCisJdTE2IGV4cGFuZGVyX2NoYW5nZV9jb3VudDsKKwl1OCByZXNlcnZlZF8xWzNdOworCXU4IHBoeV9pZGVudGlmaWVyOworCXU4IHBoeV9vcGVyYXRpb247CisJdTggcmVzZXJ2ZWRfMlsxM107CisJdTY0IGF0dGFjaGVkX2RldmljZV9uYW1lOworCXU4IHByb2dyYW1tZWRfbWluX3BoeXNpY2FsX2xpbmtfcmF0ZTsKKwl1OCBwcm9ncmFtbWVkX21heF9waHlzaWNhbF9saW5rX3JhdGU7CisJdTggcmVzZXJ2ZWRfM1s2XTsKK307CisKKy8qIHBoeSBjb250cm9sIHJlcGx5IHN0cnVjdHVyZSAqLworc3RydWN0IHBoeV9jb250cm9sX3JlcGx5eworCXU4IHNtcF9mcmFtZV90eXBlOyAvKiAweDQxICovCisJdTggZnVuY3Rpb247IC8qIDB4MTEgKi8KKwl1OCBmdW5jdGlvbl9yZXN1bHQ7CisJdTggcmVzcG9uc2VfbGVuZ3RoOworfTsKKworI2RlZmluZSBTTVBfUEhZX0NPTlRST0xfTElOS19SRVNFVAkoMHgwMSkKKyNkZWZpbmUgU01QX1BIWV9DT05UUk9MX0hBUkRfUkVTRVQJKDB4MDIpCisjZGVmaW5lIFNNUF9QSFlfQ09OVFJPTF9ESVNBQkxFCQkoMHgwMykKKworLyoqCisgKiBfdHJhbnNwb3J0X2V4cGFuZGVyX3BoeV9jb250cm9sIC0gZXhwYW5kZXIgcGh5IGNvbnRyb2wKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQHBoeTogVGhlIHNhcyBwaHkgb2JqZWN0CisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK190cmFuc3BvcnRfZXhwYW5kZXJfcGh5X2NvbnRyb2woc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorICAgIHN0cnVjdCBzYXNfcGh5ICpwaHksIHU4IHBoeV9vcGVyYXRpb24pCit7CisJTXBpMlNtcFBhc3N0aHJvdWdoUmVxdWVzdF90ICptcGlfcmVxdWVzdDsKKwlNcGkyU21wUGFzc3Rocm91Z2hSZXBseV90ICptcGlfcmVwbHk7CisJc3RydWN0IHBoeV9jb250cm9sX3JlcXVlc3QgKnBoeV9jb250cm9sX3JlcXVlc3Q7CisJc3RydWN0IHBoeV9jb250cm9sX3JlcGx5ICpwaHlfY29udHJvbF9yZXBseTsKKwlpbnQgcmM7CisJdTE2IHNtaWQ7CisJdTMyIGlvY19zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OworCXZvaWQgKnBzZ2U7CisJdTMyIHNnbF9mbGFnczsKKwl1OCBpc3N1ZV9yZXNldCA9IDA7CisJdm9pZCAqZGF0YV9vdXQgPSBOVUxMOworCWRtYV9hZGRyX3QgZGF0YV9vdXRfZG1hOworCXUzMiBzejsKKwl1NjQgKnNhc19hZGRyZXNzX2xlOworCXUxNiB3YWl0X3N0YXRlX2NvdW50OworCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpIHsKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluIHByb2dyZXNzIVxuIiwKKwkJICAgIF9fZnVuY19fLCBpb2MtPm5hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwltdXRleF9sb2NrKCZpb2MtPnRyYW5zcG9ydF9jbWRzLm11dGV4KTsKKworCWlmIChpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyAhPSBNUFQyX0NNRF9OT1RfVVNFRCkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogdHJhbnNwb3J0X2NtZHMgaW4gdXNlXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKKworCXdhaXRfc3RhdGVfY291bnQgPSAwOworCWlvY19zdGF0ZSA9IG1wdDJzYXNfYmFzZV9nZXRfaW9jc3RhdGUoaW9jLCAxKTsKKwl3aGlsZSAoaW9jX3N0YXRlICE9IE1QSTJfSU9DX1NUQVRFX09QRVJBVElPTkFMKSB7CisJCWlmICh3YWl0X3N0YXRlX2NvdW50KysgPT0gMTApIHsKKwkJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQKKwkJCSAgICAiJXM6IGZhaWxlZCBkdWUgdG8gaW9jIG5vdCBvcGVyYXRpb25hbFxuIiwKKwkJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNzbGVlcCgxKTsKKwkJaW9jX3N0YXRlID0gbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDEpOworCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IHdhaXRpbmcgZm9yICIKKwkJICAgICJvcGVyYXRpb25hbCBzdGF0ZShjb3VudD0lZClcbiIsIGlvYy0+bmFtZSwKKwkJICAgIF9fZnVuY19fLCB3YWl0X3N0YXRlX2NvdW50KTsKKwl9CisJaWYgKHdhaXRfc3RhdGVfY291bnQpCisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaW9jIGlzIG9wZXJhdGlvbmFsXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisKKwlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkKGlvYywgaW9jLT50cmFuc3BvcnRfY2JfaWR4KTsKKwlpZiAoIXNtaWQpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBvYnRhaW5pbmcgYSBzbWlkXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJbXBpX3JlcXVlc3QgPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWQpOworCWlvYy0+dHJhbnNwb3J0X2NtZHMuc21pZCA9IHNtaWQ7CisKKwlzeiA9IHNpemVvZihzdHJ1Y3QgcGh5X2NvbnRyb2xfcmVxdWVzdCkgKworCSAgICBzaXplb2Yoc3RydWN0IHBoeV9jb250cm9sX3JlcGx5KTsKKwlkYXRhX291dCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGRldiwgc3osICZkYXRhX291dF9kbWEpOworCWlmICghZGF0YV9vdXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywKKwkJICAgIF9fTElORV9fLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVOT01FTTsKKwkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIHNtaWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IC1FSU5WQUw7CisJbWVtc2V0KGRhdGFfb3V0LCAwLCBzeik7CisJcGh5X2NvbnRyb2xfcmVxdWVzdCA9IGRhdGFfb3V0OworCXBoeV9jb250cm9sX3JlcXVlc3QtPnNtcF9mcmFtZV90eXBlID0gMHg0MDsKKwlwaHlfY29udHJvbF9yZXF1ZXN0LT5mdW5jdGlvbiA9IDB4OTE7CisJcGh5X2NvbnRyb2xfcmVxdWVzdC0+cmVxdWVzdF9sZW5ndGggPSA5OworCXBoeV9jb250cm9sX3JlcXVlc3QtPmFsbG9jYXRlZF9yZXNwb25zZV9sZW5ndGggPSAwOworCXBoeV9jb250cm9sX3JlcXVlc3QtPnBoeV9pZGVudGlmaWVyID0gcGh5LT5udW1iZXI7CisJcGh5X2NvbnRyb2xfcmVxdWVzdC0+cGh5X29wZXJhdGlvbiA9IHBoeV9vcGVyYXRpb247CisJcGh5X2NvbnRyb2xfcmVxdWVzdC0+cHJvZ3JhbW1lZF9taW5fcGh5c2ljYWxfbGlua19yYXRlID0KKwkgICAgcGh5LT5taW5pbXVtX2xpbmtyYXRlIDw8IDQ7CisJcGh5X2NvbnRyb2xfcmVxdWVzdC0+cHJvZ3JhbW1lZF9tYXhfcGh5c2ljYWxfbGlua19yYXRlID0KKwkgICAgcGh5LT5tYXhpbXVtX2xpbmtyYXRlIDw8IDQ7CisKKwltZW1zZXQobXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyU21wUGFzc3Rocm91Z2hSZXF1ZXN0X3QpKTsKKwltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1NNUF9QQVNTVEhST1VHSDsKKwltcGlfcmVxdWVzdC0+UGh5c2ljYWxQb3J0ID0gMHhGRjsKKwltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOyAvKiBUT0RPICovCisJbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsKKwlzYXNfYWRkcmVzc19sZSA9ICh1NjQgKikmbXBpX3JlcXVlc3QtPlNBU0FkZHJlc3M7CisJKnNhc19hZGRyZXNzX2xlID0gY3B1X3RvX2xlNjQocGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcyk7CisJbXBpX3JlcXVlc3QtPlJlcXVlc3REYXRhTGVuZ3RoID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBwaHlfZXJyb3JfbG9nX3JlcXVlc3QpKTsKKwlwc2dlID0gJm1waV9yZXF1ZXN0LT5TR0w7CisKKwkvKiBXUklURSBzZ2VsIGZpcnN0ICovCisJc2dsX2ZsYWdzID0gKE1QSTJfU0dFX0ZMQUdTX1NJTVBMRV9FTEVNRU5UIHwKKwkgICAgTVBJMl9TR0VfRkxBR1NfRU5EX09GX0JVRkZFUiB8IE1QSTJfU0dFX0ZMQUdTX0hPU1RfVE9fSU9DKTsKKwlzZ2xfZmxhZ3MgPSBzZ2xfZmxhZ3MgPDwgTVBJMl9TR0VfRkxBR1NfU0hJRlQ7CisJaW9jLT5iYXNlX2FkZF9zZ19zaW5nbGUocHNnZSwgc2dsX2ZsYWdzIHwKKwkgICAgc2l6ZW9mKHN0cnVjdCBwaHlfY29udHJvbF9yZXF1ZXN0KSwgZGF0YV9vdXRfZG1hKTsKKworCS8qIGluY3Igc2dlbCAqLworCXBzZ2UgKz0gaW9jLT5zZ2Vfc2l6ZTsKKworCS8qIFJFQUQgc2dlbCBsYXN0ICovCisJc2dsX2ZsYWdzID0gKE1QSTJfU0dFX0ZMQUdTX1NJTVBMRV9FTEVNRU5UIHwKKwkgICAgTVBJMl9TR0VfRkxBR1NfTEFTVF9FTEVNRU5UIHwgTVBJMl9TR0VfRkxBR1NfRU5EX09GX0JVRkZFUiB8CisJICAgIE1QSTJfU0dFX0ZMQUdTX0VORF9PRl9MSVNUKTsKKwlzZ2xfZmxhZ3MgPSBzZ2xfZmxhZ3MgPDwgTVBJMl9TR0VfRkxBR1NfU0hJRlQ7CisJaW9jLT5iYXNlX2FkZF9zZ19zaW5nbGUocHNnZSwgc2dsX2ZsYWdzIHwKKwkgICAgc2l6ZW9mKHN0cnVjdCBwaHlfY29udHJvbF9yZXBseSksIGRhdGFfb3V0X2RtYSArCisJICAgIHNpemVvZihzdHJ1Y3QgcGh5X2NvbnRyb2xfcmVxdWVzdCkpOworCisJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJwaHlfY29udHJvbCAtICIKKwkgICAgInNlbmQgdG8gc2FzX2FkZHIoMHglMDE2bGx4KSwgcGh5KCVkKSwgb3Bjb2RlKCVkKVxuIiwgaW9jLT5uYW1lLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MsIHBoeS0+bnVtYmVyLAorCSAgICBwaHlfb3BlcmF0aW9uKSk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSk7CisJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSwKKwkgICAgMTAqSFopOworCisJaWYgKCEoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9DT01QTEVURSkpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IHRpbWVvdXRcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJX2RlYnVnX2R1bXBfbWYobXBpX3JlcXVlc3QsCisJCSAgICBzaXplb2YoTXBpMlNtcFBhc3N0aHJvdWdoUmVxdWVzdF90KS80KTsKKwkJaWYgKCEoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9SRVNFVCkpCisJCQlpc3N1ZV9yZXNldCA9IDE7CisJCWdvdG8gaXNzdWVfaG9zdF9yZXNldDsKKwl9CisKKwlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBoeV9jb250cm9sIC0gIgorCSAgICAiY29tcGxldGVcbiIsIGlvYy0+bmFtZSkpOworCisJaWYgKGlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzICYgTVBUMl9DTURfUkVQTFlfVkFMSUQpIHsKKworCQltcGlfcmVwbHkgPSBpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5OworCisJCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAorCQkgICAgInBoeV9jb250cm9sIC0gcmVwbHkgZGF0YSB0cmFuc2ZlciBzaXplKCVkKVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgbGUxNl90b19jcHUobXBpX3JlcGx5LT5SZXNwb25zZURhdGFMZW5ndGgpKSk7CisKKwkJaWYgKGxlMTZfdG9fY3B1KG1waV9yZXBseS0+UmVzcG9uc2VEYXRhTGVuZ3RoKSAhPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBwaHlfY29udHJvbF9yZXBseSkpCisJCQlnb3RvIG91dDsKKworCQlwaHlfY29udHJvbF9yZXBseSA9IGRhdGFfb3V0ICsKKwkJICAgIHNpemVvZihzdHJ1Y3QgcGh5X2NvbnRyb2xfcmVxdWVzdCk7CisKKwkJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCisJCSAgICAicGh5X2NvbnRyb2wgLSBmdW5jdGlvbl9yZXN1bHQoJWQpXG4iLAorCQkgICAgaW9jLT5uYW1lLCBwaHlfY29udHJvbF9yZXBseS0+ZnVuY3Rpb25fcmVzdWx0KSk7CisKKwkJcmMgPSAwOworCX0gZWxzZQorCQlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJICAgICJwaHlfY29udHJvbCAtIG5vIHJlcGx5XG4iLCBpb2MtPm5hbWUpKTsKKworIGlzc3VlX2hvc3RfcmVzZXQ6CisJaWYgKGlzc3VlX3Jlc2V0KQorCQltcHQyc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAorCQkgICAgRk9SQ0VfQklHX0hBTU1FUik7Cisgb3V0OgorCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisJaWYgKGRhdGFfb3V0KQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGRldiwgc3osIGRhdGFfb3V0LCBkYXRhX291dF9kbWEpOworCisJbXV0ZXhfdW5sb2NrKCZpb2MtPnRyYW5zcG9ydF9jbWRzLm11dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKIC8qKgogICogX3RyYW5zcG9ydF9waHlfcmVzZXQgLQogICogQHBoeTogVGhlIHNhcyBwaHkgb2JqZWN0CiAgKiBAaGFyZF9yZXNldDoKICAqCi0gKiBPbmx5IHN1cHBvcnQgc2FzX2hvc3QgZGlyZWN0IGF0dGFjaGVkIHBoeXMuCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50CiBfdHJhbnNwb3J0X3BoeV9yZXNldChzdHJ1Y3Qgc2FzX3BoeSAqcGh5LCBpbnQgaGFyZF9yZXNldCkKIHsKIAlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBwaHlfdG9faW9jKHBoeSk7Ci0Jc3RydWN0IF9zYXNfcGh5ICptcHQyc2FzX3BoeTsKIAlNcGkyU2FzSW9Vbml0Q29udHJvbFJlcGx5X3QgbXBpX3JlcGx5OwogCU1waTJTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90IG1waV9yZXF1ZXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQltcHQyc2FzX3BoeSA9IF90cmFuc3BvcnRfZmluZF9sb2NhbF9waHkoaW9jLCBwaHkpOwotCi0JaWYgKCFtcHQyc2FzX3BoeSkgLyogdGhpcyBwaHkgbm90IG9uIHNhc19ob3N0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOworCWlmIChfdHJhbnNwb3J0X3Nhc19ub2RlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoaW9jLAorCSAgICBwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzKSA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CiAKKwkvKiBoYW5kbGUgZXhwYW5kZXIgcGh5cyAqLworCWlmIChwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzICE9IGlvYy0+c2FzX2hiYS5zYXNfYWRkcmVzcykKKwkJcmV0dXJuIF90cmFuc3BvcnRfZXhwYW5kZXJfcGh5X2NvbnRyb2woaW9jLCBwaHksCisJCSAgICAoaGFyZF9yZXNldCA9PSAxKSA/IFNNUF9QSFlfQ09OVFJPTF9IQVJEX1JFU0VUIDoKKwkJICAgIFNNUF9QSFlfQ09OVFJPTF9MSU5LX1JFU0VUKTsKKworCS8qIGhhbmRsZSBoYmEgcGh5cyAqLwogCW1lbXNldCgmbXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyU2FzSW9Vbml0Q29udHJvbFJlcGx5X3QpKTsKIAltcGlfcmVxdWVzdC5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU0FTX0lPX1VOSVRfQ09OVFJPTDsKIAltcGlfcmVxdWVzdC5PcGVyYXRpb24gPSBoYXJkX3Jlc2V0ID8KIAkgICAgTVBJMl9TQVNfT1BfUEhZX0hBUkRfUkVTRVQgOiBNUEkyX1NBU19PUF9QSFlfTElOS19SRVNFVDsKLQltcGlfcmVxdWVzdC5QaHlOdW0gPSBtcHQyc2FzX3BoeS0+cGh5X2lkOworCW1waV9yZXF1ZXN0LlBoeU51bSA9IHBoeS0+bnVtYmVyOwogCiAJaWYgKChtcHQyc2FzX2Jhc2Vfc2FzX2lvdW5pdF9jb250cm9sKGlvYywgJm1waV9yZXBseSwgJm1waV9yZXF1ZXN0KSkpIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKQEAgLTEwODIsOCArMTUyNCw3IEBACiAJaWYgKG1waV9yZXBseS5JT0NTdGF0dXMgfHwgbXBpX3JlcGx5LklPQ0xvZ0luZm8pCiAJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJwaHkoJWQpLCBpb2Nfc3RhdHVzIgogCQkgICAgIigweCUwNHgpLCBsb2dpbmZvKDB4JTA4eClcbiIsIGlvYy0+bmFtZSwKLQkJICAgIG1wdDJzYXNfcGh5LT5waHlfaWQsCi0JCSAgICBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSwKKwkJICAgIHBoeS0+bnVtYmVyLCBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSwKIAkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS5JT0NMb2dJbmZvKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTExMDEsMTcgKzE1NDIsMjggQEAKIF90cmFuc3BvcnRfcGh5X2VuYWJsZShzdHJ1Y3Qgc2FzX3BoeSAqcGh5LCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHBoeV90b19pb2MocGh5KTsKLQlzdHJ1Y3QgX3Nhc19waHkgKm1wdDJzYXNfcGh5OwogCU1waTJTYXNJT1VuaXRQYWdlMV90ICpzYXNfaW91bml0X3BnMSA9IE5VTEw7CiAJTXBpMkNvbmZpZ1JlcGx5X3QgbXBpX3JlcGx5OwogCXUxNiBpb2Nfc3RhdHVzOwogCXUxNiBzejsKIAlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQltcHQyc2FzX3BoeSA9IF90cmFuc3BvcnRfZmluZF9sb2NhbF9waHkoaW9jLCBwaHkpOwotCi0JaWYgKCFtcHQyc2FzX3BoeSkgLyogdGhpcyBwaHkgbm90IG9uIHNhc19ob3N0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOworCWlmIChfdHJhbnNwb3J0X3Nhc19ub2RlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoaW9jLAorCSAgICBwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzKSA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CisKKwkvKiBoYW5kbGUgZXhwYW5kZXIgcGh5cyAqLworCWlmIChwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzICE9IGlvYy0+c2FzX2hiYS5zYXNfYWRkcmVzcykKKwkJcmV0dXJuIF90cmFuc3BvcnRfZXhwYW5kZXJfcGh5X2NvbnRyb2woaW9jLCBwaHksCisJCSAgICAoZW5hYmxlID09IDEpID8gU01QX1BIWV9DT05UUk9MX0xJTktfUkVTRVQgOgorCQkgICAgU01QX1BIWV9DT05UUk9MX0RJU0FCTEUpOworCisJLyogaGFuZGxlIGhiYSBwaHlzICovCiAKIAkvKiBzYXNfaW91bml0IHBhZ2UgMSAqLwogCXN6ID0gb2Zmc2V0b2YoTXBpMlNhc0lPVW5pdFBhZ2UxX3QsIFBoeURhdGEpICsgKGlvYy0+c2FzX2hiYS5udW1fcGh5cyAqCkBAIC0xMTQwLDE0ICsxNTkyLDE4IEBACiAJfQogCiAJaWYgKGVuYWJsZSkKLQkJc2FzX2lvdW5pdF9wZzEtPlBoeURhdGFbbXB0MnNhc19waHktPnBoeV9pZF0uUGh5RmxhZ3MKKwkJc2FzX2lvdW5pdF9wZzEtPlBoeURhdGFbcGh5LT5udW1iZXJdLlBoeUZsYWdzCiAJCSAgICAmPSB+TVBJMl9TQVNJT1VOSVQxX1BIWUZMQUdTX1BIWV9ESVNBQkxFOwogCWVsc2UKLQkJc2FzX2lvdW5pdF9wZzEtPlBoeURhdGFbbXB0MnNhc19waHktPnBoeV9pZF0uUGh5RmxhZ3MKKwkJc2FzX2lvdW5pdF9wZzEtPlBoeURhdGFbcGh5LT5udW1iZXJdLlBoeUZsYWdzCiAJCSAgICB8PSBNUEkyX1NBU0lPVU5JVDFfUEhZRkxBR1NfUEhZX0RJU0FCTEU7CiAKIAltcHQyc2FzX2NvbmZpZ19zZXRfc2FzX2lvdW5pdF9wZzEoaW9jLCAmbXBpX3JlcGx5LCBzYXNfaW91bml0X3BnMSwgc3opOwogCisJLyogbGluayByZXNldCAqLworCWlmIChlbmFibGUpCisJCV90cmFuc3BvcnRfcGh5X3Jlc2V0KHBoeSwgMCk7CisKICBvdXQ6CiAJa2ZyZWUoc2FzX2lvdW5pdF9wZzEpOwogCXJldHVybiByYzsKQEAgLTExNjUsNyArMTYyMSw2IEBACiBfdHJhbnNwb3J0X3BoeV9zcGVlZChzdHJ1Y3Qgc2FzX3BoeSAqcGh5LCBzdHJ1Y3Qgc2FzX3BoeV9saW5rcmF0ZXMgKnJhdGVzKQogewogCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHBoeV90b19pb2MocGh5KTsKLQlzdHJ1Y3QgX3Nhc19waHkgKm1wdDJzYXNfcGh5OwogCU1waTJTYXNJT1VuaXRQYWdlMV90ICpzYXNfaW91bml0X3BnMSA9IE5VTEw7CiAJTXBpMlNhc1BoeVBhZ2UwX3QgcGh5X3BnMDsKIAlNcGkyQ29uZmlnUmVwbHlfdCBtcGlfcmVwbHk7CkBAIC0xMTczLDExICsxNjI4LDE1IEBACiAJdTE2IHN6OwogCWludCBpOwogCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW1wdDJzYXNfcGh5ID0gX3RyYW5zcG9ydF9maW5kX2xvY2FsX3BoeShpb2MsIHBoeSk7Ci0KLQlpZiAoIW1wdDJzYXNfcGh5KSAvKiB0aGlzIHBoeSBub3Qgb24gc2FzX2hvc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CisJaWYgKF90cmFuc3BvcnRfc2FzX25vZGVfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJICAgIHBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MpID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfbm9kZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKIAogCWlmICghcmF0ZXMtPm1pbmltdW1fbGlua3JhdGUpCiAJCXJhdGVzLT5taW5pbXVtX2xpbmtyYXRlID0gcGh5LT5taW5pbXVtX2xpbmtyYXRlOwpAQCAtMTE4OSw2ICsxNjQ4LDE2IEBACiAJZWxzZSBpZiAocmF0ZXMtPm1heGltdW1fbGlua3JhdGUgPiBwaHktPm1heGltdW1fbGlua3JhdGVfaHcpCiAJCXJhdGVzLT5tYXhpbXVtX2xpbmtyYXRlID0gcGh5LT5tYXhpbXVtX2xpbmtyYXRlX2h3OwogCisJLyogaGFuZGxlIGV4cGFuZGVyIHBoeXMgKi8KKwlpZiAocGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcyAhPSBpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3MpIHsKKwkJcGh5LT5taW5pbXVtX2xpbmtyYXRlID0gcmF0ZXMtPm1pbmltdW1fbGlua3JhdGU7CisJCXBoeS0+bWF4aW11bV9saW5rcmF0ZSA9IHJhdGVzLT5tYXhpbXVtX2xpbmtyYXRlOworCQlyZXR1cm4gX3RyYW5zcG9ydF9leHBhbmRlcl9waHlfY29udHJvbChpb2MsIHBoeSwKKwkJICAgIFNNUF9QSFlfQ09OVFJPTF9MSU5LX1JFU0VUKTsKKwl9CisKKwkvKiBoYW5kbGUgaGJhIHBoeXMgKi8KKwogCS8qIHNhc19pb3VuaXQgcGFnZSAxICovCiAJc3ogPSBvZmZzZXRvZihNcGkyU2FzSU9Vbml0UGFnZTFfdCwgUGh5RGF0YSkgKyAoaW9jLT5zYXNfaGJhLm51bV9waHlzICoKIAkgICAgc2l6ZW9mKE1waTJTYXNJT1VuaXQxUGh5RGF0YV90KSk7CkBAIC0xMjE2LDcgKzE2ODUsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBpb2MtPnNhc19oYmEubnVtX3BoeXM7IGkrKykgewotCQlpZiAobXB0MnNhc19waHktPnBoeV9pZCAhPSBpKSB7CisJCWlmIChwaHktPm51bWJlciAhPSBpKSB7CiAJCQlzYXNfaW91bml0X3BnMS0+UGh5RGF0YVtpXS5NYXhNaW5MaW5rUmF0ZSA9CiAJCQkgICAgKGlvYy0+c2FzX2hiYS5waHlbaV0ucGh5LT5taW5pbXVtX2xpbmtyYXRlICsKIAkJCSAgICAoaW9jLT5zYXNfaGJhLnBoeVtpXS5waHktPm1heGltdW1fbGlua3JhdGUgPDwgNCkpOwpAQCAtMTI0MCw3ICsxNzA5LDcgQEAKIAogCS8qIHJlYWQgcGh5IHBhZ2UgMCwgdGhlbiB1cGRhdGUgdGhlIHJhdGVzIGluIHRoZSBzYXMgdHJhbnNwb3J0IHBoeSAqLwogCWlmICghbXB0MnNhc19jb25maWdfZ2V0X3BoeV9wZzAoaW9jLCAmbXBpX3JlcGx5LCAmcGh5X3BnMCwKLQkgICAgbXB0MnNhc19waHktPnBoeV9pZCkpIHsKKwkgICAgcGh5LT5udW1iZXIpKSB7CiAJCXBoeS0+bWluaW11bV9saW5rcmF0ZSA9IF90cmFuc3BvcnRfY29udmVydF9waHlfbGlua19yYXRlKAogCQkgICAgcGh5X3BnMC5Qcm9ncmFtbWVkTGlua1JhdGUgJiBNUEkyX1NBU19QUkFURV9NSU5fUkFURV9NQVNLKTsKIAkJcGh5LT5tYXhpbXVtX2xpbmtyYXRlID0gX3RyYW5zcG9ydF9jb252ZXJ0X3BoeV9saW5rX3JhdGUoCkBAIC0xMzkyLDcgKzE4NjEsNyBAQAogCWlvYy0+YmFzZV9hZGRfc2dfc2luZ2xlKHBzZ2UsIHNnbF9mbGFncyB8IChibGtfcnFfYnl0ZXMocnNwKSArIDQpLAogCSAgICBkbWFfYWRkcl9pbik7CiAKLQlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlcyAtICIKKwlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzIC0gIgogCSAgICAic2VuZGluZyBzbXAgcmVxdWVzdFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCiAJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKQEAgLTE0MTAsMTQgKzE4NzksMTQgQEAKIAkJZ290byBpc3N1ZV9ob3N0X3Jlc2V0OwogCX0KIAotCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgIiVzIC0gIgorCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXMgLSAiCiAJICAgICJjb21wbGV0ZVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwogCiAJaWYgKGlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzICYgTVBUMl9DTURfUkVQTFlfVkFMSUQpIHsKIAogCQltcGlfcmVwbHkgPSBpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5OwogCi0JCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQKKwkJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCiAJCSAgICAiJXMgLSByZXBseSBkYXRhIHRyYW5zZmVyIHNpemUoJWQpXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywKIAkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+UmVzcG9uc2VEYXRhTGVuZ3RoKSkpOwpAQCAtMTQyOCw3ICsxODk3LDcgQEAKIAkJcnNwLT5yZXNpZF9sZW4gLT0KIAkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+UmVzcG9uc2VEYXRhTGVuZ3RoKTsKIAl9IGVsc2UgewotCQlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UCisJCWR0cmFuc3BvcnRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAogCQkgICAgIiVzIC0gbm8gcmVwbHlcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAkJcmMgPSAtRU5YSU87CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jIGIvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jCmluZGV4IGY1ZTMyMTcuLmFkZWRhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAJCX0KIAogCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgotCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fR09PRCkgeworCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fU1RBVF9HT09EKSB7CiAJCQlyZXMgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE2NDAsNyArMTY0MCw3IEBACiAJc3RydWN0IG12c190bWZfdGFzayB0bWZfdGFzazsKIAlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gdGFzay0+ZGV2OwogCXN0cnVjdCBtdnNfZGV2aWNlICptdmlfZGV2ID0gKHN0cnVjdCBtdnNfZGV2aWNlICopZGV2LT5sbGRkX2RldjsKLQlzdHJ1Y3QgbXZzX2luZm8gKm12aSA9IG12aV9kZXYtPm12aV9pbmZvOworCXN0cnVjdCBtdnNfaW5mbyAqbXZpOwogCWludCByYyA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHRhZzsKQEAgLTE2NTAsNiArMTY1MCw4IEBACiAJCXJjID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CiAJfQogCisJbXZpID0gbXZpX2Rldi0+bXZpX2luZm87CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CiAJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwpAQCAtMTc1Niw3ICsxNzU4LDcgQEAKIAlzdHJ1Y3QgbXZzX2RldmljZSAqbXZpX2RldiA9IHRhc2stPmRldi0+bGxkZF9kZXY7CiAJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHN0YXQgPSAmdGFzay0+dGFza19zdGF0dXM7CiAJc3RydWN0IGF0YV90YXNrX3Jlc3AgKnJlc3AgPSAoc3RydWN0IGF0YV90YXNrX3Jlc3AgKil0c3RhdC0+YnVmOwotCWludCBzdGF0ID0gU0FNX0dPT0Q7CisJaW50IHN0YXQgPSBTQU1fU1RBVF9HT09EOwogCiAKIAlyZXNwLT5mcmFtZV9sZW4gPSBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2Zpcyk7CkBAIC0xNzg4LDEzICsxNzkwLDEzIEBACiAKIAlNVlNfQ0hJUF9ESVNQLT5jb21tYW5kX2FjdGl2ZShtdmksIHNsb3RfaWR4KTsKIAotCXN0YXQgPSBTQU1fQ0hFQ0tfQ09ORDsKKwlzdGF0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCXN3aXRjaCAodGFzay0+dGFza19wcm90bykgewogCWNhc2UgU0FTX1BST1RPQ09MX1NTUDoKIAkJc3RhdCA9IFNBU19BQk9SVEVEX1RBU0s7CiAJCWJyZWFrOwogCWNhc2UgU0FTX1BST1RPQ09MX1NNUDoKLQkJc3RhdCA9IFNBTV9DSEVDS19DT05EOworCQlzdGF0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCQlicmVhazsKIAogCWNhc2UgU0FTX1BST1RPQ09MX1NBVEE6CkBAIC0xODc5LDcgKzE4ODEsNyBAQAogCWNhc2UgU0FTX1BST1RPQ09MX1NTUDoKIAkJLyogaHcgc2F5cyBzdGF0dXMgPT0gMCwgZGF0YXByZXMgPT0gMCAqLwogCQlpZiAocnhfZGVzYyAmIFJYUV9HT09EKSB7Ci0JCQl0c3RhdC0+c3RhdCA9IFNBTV9HT09EOworCQkJdHN0YXQtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwogCQkJdHN0YXQtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJfQogCQkvKiByZXNwb25zZSBmcmFtZSBwcmVzZW50ICovCkBAIC0xODg4LDEyICsxODkwLDEyIEBACiAJCQkJCQlzaXplb2Yoc3RydWN0IG12c19lcnJfaW5mbyk7CiAJCQlzYXNfc3NwX3Rhc2tfcmVzcG9uc2UobXZpLT5kZXYsIHRhc2ssIGl1KTsKIAkJfSBlbHNlCi0JCQl0c3RhdC0+c3RhdCA9IFNBTV9DSEVDS19DT05EOworCQkJdHN0YXQtPnN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJCWJyZWFrOwogCiAJY2FzZSBTQVNfUFJPVE9DT0xfU01QOiB7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3Jlc3AgPSAmdGFzay0+c21wX3Rhc2suc21wX3Jlc3A7Ci0JCQl0c3RhdC0+c3RhdCA9IFNBTV9HT09EOworCQkJdHN0YXQtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwogCQkJdG8gPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnX3Jlc3ApLCBLTV9JUlEwKTsKIAkJCW1lbWNweSh0byArIHNnX3Jlc3AtPm9mZnNldCwKIAkJCQlzbG90LT5yZXNwb25zZSArIHNpemVvZihzdHJ1Y3QgbXZzX2Vycl9pbmZvKSwKQEAgLTE5MTAsNyArMTkxMiw3IEBACiAJCX0KIAogCWRlZmF1bHQ6Ci0JCXRzdGF0LT5zdGF0ID0gU0FNX0NIRUNLX0NPTkQ7CisJCXRzdGF0LT5zdGF0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCQlicmVhazsKIAl9CiAJaWYgKCFzbG90LT5wb3J0LT5wb3J0X2F0dGFjaGVkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYwppbmRleCA5ZDcwYWVmLi42MWY0OWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgImFoYTE1MnguaCIKIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTEwMSw5ICsxMDAsOCBAQAogICAgIGluZm8tPnBfZGV2ID0gbGluazsKICAgICBsaW5rLT5wcml2ID0gaW5mbzsKIAotICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDB4MjA7Ci0gICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLSAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDEwOworICAgIGxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAweDIwOworICAgIGxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CkBAIC0xMzEsMTUgKzEyOSwxNiBAQAogCQkJCXVuc2lnbmVkIGludCB2Y2MsCiAJCQkJdm9pZCAqcHJpdl9kYXRhKQogeworCXBfZGV2LT5pb19saW5lcyA9IDEwOwogCS8qIEZvciBOZXcgTWVkaWEgVCZKLCBsb29rIGZvciBhIFNDU0kgd2luZG93ICovCiAJaWYgKGNmZy0+aW8ud2luWzBdLmxlbiA+PSAweDIwKQotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmZy0+aW8ud2luWzBdLmJhc2U7CiAJZWxzZSBpZiAoKGNmZy0+aW8ubndpbiA+IDEpICYmCiAJCSAoY2ZnLT5pby53aW5bMV0ubGVuID49IDB4MjApKQotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMV0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmZy0+aW8ud2luWzFdLmJhc2U7CiAJaWYgKChjZmctPmlvLm53aW4gPiAwKSAmJgotCSAgICAocF9kZXYtPmlvLkJhc2VQb3J0MSA8IDB4ZmZmZikpIHsKLQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJICAgIChwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0IDwgMHhmZmZmKSkgeworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2OCw3ICsxNjcsNyBAQAogICAgIC8qIFNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhaGExNTJ4IGRyaXZlciAqLwogICAgIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKICAgICBzLmNvbmYgICAgICAgID0gIlBDTUNJQSBzZXR1cCI7Ci0gICAgcy5pb19wb3J0ICAgICA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBzLmlvX3BvcnQgICAgID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogICAgIHMuaXJxICAgICAgICAgPSBsaW5rLT5pcnE7CiAgICAgcy5zY3NpaWQgICAgICA9IGhvc3RfaWQ7CiAgICAgcy5yZWNvbm5lY3QgICA9IHJlY29ubmVjdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCmluZGV4IDIxYjE0MTEuLjEzZGJlNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAiZmRvbWFpbi5oIgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpAQCAtODQsOSArODMsOCBAQAogCiAJaW5mby0+cF9kZXYgPSBsaW5rOwogCWxpbmstPnByaXYgPSBpbmZvOwotCWxpbmstPmlvLk51bVBvcnRzMSA9IDB4MTA7Ci0JbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDEwOworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAweDEwOworCWxpbmstPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKIAlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAJbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CkBAIC0xMTMsOCArMTExLDkgQEAKIAkJCQl1bnNpZ25lZCBpbnQgdmNjLAogCQkJCXZvaWQgKnByaXZfZGF0YSkKIHsKLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKLQlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworCXBfZGV2LT5pb19saW5lcyA9IDEwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZmctPmlvLndpblswXS5iYXNlOworCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2Rldik7CiB9CiAKIApAQCAtMTM4LDEwICsxMzcsMTAgQEAKIAkgICAgZ290byBmYWlsZWQ7CiAKICAgICAvKiBBIGJhZCBoYWNrLi4uICovCi0gICAgcmVsZWFzZV9yZWdpb24obGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5OdW1Qb3J0czEpOworICAgIHJlbGVhc2VfcmVnaW9uKGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShsaW5rLT5yZXNvdXJjZVswXSkpOwogCiAgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGZkb21haW4gZHJpdmVyICovCi0gICAgc3ByaW50ZihzdHIsICIlZCwlZCIsIGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aXJxKTsKKyAgICBzcHJpbnRmKHN0ciwgIiVkLCVkIiwgKHVuc2lnbmVkIGludCkgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LCBsaW5rLT5pcnEpOwogICAgIGZkb21haW5fc2V0dXAoc3RyKTsKIAogICAgIGhvc3QgPSBfX2Zkb21haW5fMTZ4MF9kZXRlY3QoJmZkb21haW5fZHJpdmVyX3RlbXBsYXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCmluZGV4IDBmMGUxMTIuLmRkOWI0MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTE1NTksOSArMTU1OCw4IEBACiAJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluZm89MHglcCIsIGluZm8pOwogCiAJLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCi0JbGluay0+aW8uTnVtUG9ydHMxCSA9IDB4MTA7Ci0JbGluay0+aW8uQXR0cmlidXRlczEJID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JbGluay0+aW8uSU9BZGRyTGluZXMJID0gMTA7CS8qIG5vdCB1c2VkICovCisJbGluay0+cmVzb3VyY2VbMF0tPmVuZAkgPSAweDEwOworCWxpbmstPnJlc291cmNlWzBdLT5mbGFncyA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwogCiAJLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLwogCWxpbmstPmNvbmYuQXR0cmlidXRlcwkgPSBDT05GX0VOQUJMRV9JUlE7CkBAIC0xNjQyLDI5ICsxNjQwLDI3IEBACiAJCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwogCiAJCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAwOwogCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87Ci0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQkJcF9kZXYtPmlvX2xpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisJCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9CisJCQkJcGNtY2lhX2lvX2NmZ19kYXRhX3dpZHRoKGlvLT5mbGFncyk7CisJCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKIAkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7Ci0JCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlwX2Rldi0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQkJcF9kZXYtPnJlc291cmNlWzFdLT5mbGFncyA9CisJCQkJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3M7CisJCQkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IGlvLT53aW5bMV0ubGVuOwogCQkJfQogCQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldikgIT0gMCkKIAkJCQlnb3RvIG5leHRfZW50cnk7CiAJCX0KIAogCQlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC0+bWVtLm53aW4gPiAwKSkgewotCQkJbWVtcmVxX3QJbWFwOwogCQkJY2lzdHBsX21lbV90CSptZW0gPQogCQkJCShjZmctPm1lbS5ud2luKSA/ICZjZmctPm1lbSA6ICZkZmx0LT5tZW07CiAJCQljZmdfbWVtLT5yZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTTsKQEAgLTE2NzYsOCArMTY3Miw4IEBACiAJCQljZmdfbWVtLT5yZXEuQWNjZXNzU3BlZWQgPSAwOwogCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhwX2RldiwgJmNmZ19tZW0tPnJlcSwgJnBfZGV2LT53aW4pICE9IDApCiAJCQkJZ290byBuZXh0X2VudHJ5OwotCQkJbWFwLlBhZ2UgPSAwOyBtYXAuQ2FyZE9mZnNldCA9IG1lbS0+d2luWzBdLmNhcmRfYWRkcjsKLQkJCWlmIChwY21jaWFfbWFwX21lbV9wYWdlKHBfZGV2LCBwX2Rldi0+d2luLCAmbWFwKSAhPSAwKQorCQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UocF9kZXYsIHBfZGV2LT53aW4sCisJCQkJCW1lbS0+d2luWzBdLmNhcmRfYWRkcikgIT0gMCkKIAkJCQlnb3RvIG5leHRfZW50cnk7CiAKIAkJCWNmZ19tZW0tPmRhdGEtPk1taW9BZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZShjZmdfbWVtLT5yZXEuQmFzZSwgY2ZnX21lbS0+cmVxLlNpemUpOwpAQCAtMTcyMCwxNyArMTcxNiwxOSBAQAogCQlnb3RvIGNzX2ZhaWxlZDsKIAogCWlmIChmcmVlX3BvcnRzKSB7Ci0JCWlmIChsaW5rLT5pby5CYXNlUG9ydDEpIHsKLQkJCXJlbGVhc2VfcmVnaW9uKGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uTnVtUG9ydHMxKTsKKwkJaWYgKGxpbmstPnJlc291cmNlWzBdKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQsCisJCQkJCXJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMF0pKTsKIAkJfQotCQlpZiAobGluay0+aW8uQmFzZVBvcnQyKSB7Ci0JCQlyZWxlYXNlX3JlZ2lvbihsaW5rLT5pby5CYXNlUG9ydDIsIGxpbmstPmlvLk51bVBvcnRzMik7CisJCWlmIChsaW5rLT5yZXNvdXJjZVsxXSkgeworCQkJcmVsZWFzZV9yZWdpb24obGluay0+cmVzb3VyY2VbMV0tPnN0YXJ0LAorCQkJCQlyZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzFdKSk7CiAJCX0KIAl9CiAKIAkvKiBTZXQgcG9ydCBhbmQgSVJRICovCi0JZGF0YS0+QmFzZUFkZHJlc3MgPSBsaW5rLT5pby5CYXNlUG9ydDE7Ci0JZGF0YS0+TnVtQWRkcmVzcyAgPSBsaW5rLT5pby5OdW1Qb3J0czE7CisJZGF0YS0+QmFzZUFkZHJlc3MgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CisJZGF0YS0+TnVtQWRkcmVzcyAgPSByZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzBdKTsKIAlkYXRhLT5JcnFOdW1iZXIgICA9IGxpbmstPmlycTsKIAogCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJJL09bMHgleCsweCV4XSBJUlEgJWQiLApAQCAtMTc2NSwxMyArMTc2MywxMCBAQAogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpIHsKIAkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycSk7CiAJfQotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpIHsKLQkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCi0JCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOwotCX0KLQlpZiAobGluay0+aW8uTnVtUG9ydHMyKQotCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCi0JCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworCWlmIChsaW5rLT5yZXNvdXJjZVswXSkKKwkJcHJpbnRrKCIsIGlvICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMV0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMV0pOwogCWlmIChsaW5rLT53aW4pCiAJCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgY2ZnX21lbS0+cmVxLkJhc2UsCiAJCSAgICAgICBjZmdfbWVtLT5yZXEuQmFzZStjZmdfbWVtLT5yZXEuU2l6ZS0xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwppbmRleCBmMGZjNmJhLi5lYjc3NWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICIuLi9xbG9naWNmYXM0MDguaCIKIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTE1Nyw5ICsxNTYsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlpbmZvLT5wX2RldiA9IGxpbms7CiAJbGluay0+cHJpdiA9IGluZm87Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gMTY7Ci0JbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDEwOworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAxNjsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwogCWxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOwpAQCAtMTg2LDEzICsxODQsMTQgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmNjLAogCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKIHsKLQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2ZnLT5pby53aW5bMF0ubGVuOworCXBfZGV2LT5pb19saW5lcyA9IDEwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZmctPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2ZnLT5pby53aW5bMF0ubGVuOwogCi0JaWYgKHBfZGV2LT5pby5CYXNlUG9ydDEgPT0gMCkKKwlpZiAocF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIGludCBxbG9naWNfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICogbGluaykKQEAgLTIxNiwxOCArMjE1LDE4IEBACiAKIAlpZiAoKGluZm8tPm1hbmZfaWQgPT0gTUFORklEX01BQ05JQ0EpIHx8IChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9QSU9ORUVSKSB8fCAoaW5mby0+bWFuZl9pZCA9PSAweDAwOTgpKSB7CiAJCS8qIHNldCBBVEFjbWQgKi8KLQkJb3V0YigweGI0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOwotCQlvdXRiKDB4MjQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4OSk7Ci0JCW91dGIoMHgwNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHhkKTsKKwkJb3V0YigweGI0LCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweGQpOworCQlvdXRiKDB4MjQsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCArIDB4OSk7CisJCW91dGIoMHgwNCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgMHhkKTsKIAl9CiAKIAkvKiBUaGUgS1hMLTgxMEFOIGhhcyBhIGJpZ2dlciBJTyBwb3J0IHdpbmRvdyAqLwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEgPT0gMzIpCisJaWYgKHJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMF0pID09IDMyKQogCQlob3N0ID0gcWxvZ2ljX2RldGVjdCgmcWxvZ2ljZmFzX2RyaXZlcl90ZW1wbGF0ZSwgbGluaywKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSArIDE2LCBsaW5rLT5pcnEpOworCQkJbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgMTYsIGxpbmstPmlycSk7CiAJZWxzZQogCQlob3N0ID0gcWxvZ2ljX2RldGVjdCgmcWxvZ2ljZmFzX2RyaXZlcl90ZW1wbGF0ZSwgbGluaywKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aXJxKTsKKwkJCWxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgbGluay0+aXJxKTsKIAkKIAlpZiAoIWhvc3QpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIFNDU0kgZGV2aWNlcyBmb3VuZFxuIiwgcWxvZ2ljX25hbWUpOwpAQCAtMjY5LDkgKzI2OCw5IEBACiAJaWYgKChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9NQUNOSUNBKSB8fAogCSAgICAoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfUElPTkVFUikgfHwKIAkgICAgKGluZm8tPm1hbmZfaWQgPT0gMHgwMDk4KSkgewotCQlvdXRiKDB4ODAsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7Ci0JCW91dGIoMHgyNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHg5KTsKLQkJb3V0YigweDA0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCQlvdXRiKDB4ODAsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCArIDB4ZCk7CisJCW91dGIoMHgyNCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgMHg5KTsKKwkJb3V0YigweDA0LCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweGQpOwogCX0KIAkvKiBVZ2dnZ2xsbHl5eXkhISEgKi8KIAlxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKaW5kZXggYTUxMTY0MS4uMzIxZTM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCkBAIC03MSw3ICs3MSw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTY5MSwxMyArNjkwLDE0IEBACiAJCQkJICB1bnNpZ25lZCBpbnQgdmNjLAogCQkJCSAgdm9pZCAqcHJpdl9kYXRhKQogewotCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZmctPmlvLndpblswXS5iYXNlOwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBjZmctPmlvLndpblswXS5sZW47CisJcF9kZXYtPmlvX2xpbmVzID0gMTA7CisJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmZy0+aW8ud2luWzBdLmJhc2U7CisJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBjZmctPmlvLndpblswXS5sZW47CiAKLQlpZiAocF9kZXYtPmlvLkJhc2VQb3J0MSA9PSAwKQorCWlmIChwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpOwogfQogCiBzdGF0aWMgaW50CkBAIC03MzQsOSArNzM0LDkgQEAKIAkgICAgKGluZm8tPm1hbmZfaWQgPT0gTUFORklEX1BJT05FRVIpIHx8CiAJICAgIChpbmZvLT5tYW5mX2lkID09IDB4MDA5OCkpIHsKIAkJLyogc2V0IEFUQWNtZCAqLwotCQlvdXRiKDB4YjQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7Ci0JCW91dGIoMHgyNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHg5KTsKLQkJb3V0YigweDA0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCQlvdXRiKDB4YjQsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCArIDB4ZCk7CisJCW91dGIoMHgyNCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgMHg5KTsKKwkJb3V0YigweDA0LCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweGQpOwogCX0KIAogCS8qCkBAIC03NDksNyArNzQ5LDcgQEAKIAkqCTB4MTMwLCAweDIzMCwgMHgyODAsIDB4MjkwLAogCSoJMHgzMjAsIDB4MzMwLCAweDM0MCwgMHgzNTAKIAkqLwotCXBvcnRfYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlwb3J0X2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJaXJxX2xldmVsID0gbGluay0+aXJxOwogCiAJREVCKHByaW50aygiU1lNNTNDNTAwOiBwb3J0X2Jhc2U9MHgleCwgaXJxPSVkLCBmYXN0X3Bpbz0lZFxuIiwKQEAgLTgyMiwxNSArODIyLDE1IEBACiAJaWYgKChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9NQUNOSUNBKSB8fAogCSAgICAoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfUElPTkVFUikgfHwKIAkgICAgKGluZm8tPm1hbmZfaWQgPT0gMHgwMDk4KSkgewotCQlvdXRiKDB4ODAsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7Ci0JCW91dGIoMHgyNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHg5KTsKLQkJb3V0YigweDA0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCQlvdXRiKDB4ODAsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCArIDB4ZCk7CisJCW91dGIoMHgyNCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgMHg5KTsKKwkJb3V0YigweDA0LCBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweGQpOwogCX0KIAkvKgogCSAqICBJZiB0aGluZ3MgZG9uJ3Qgd29yayBhZnRlciBhICJyZXN1bWUiLAogCSAqICB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byBzdGFydCBsb29raW5nLgogCSAqLwotCVNZTTUzQzUwMF9pbnRfaG9zdF9yZXNldChsaW5rLT5pby5CYXNlUG9ydDEpOworCVNZTTUzQzUwMF9pbnRfaG9zdF9yZXNldChsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NTksOSArODU5LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJaW5mby0+cF9kZXYgPSBsaW5rOwogCWxpbmstPnByaXYgPSBpbmZvOwotCWxpbmstPmlvLk51bVBvcnRzMSA9IDE2OwotCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JbGluay0+aW8uSU9BZGRyTGluZXMgPSAxMDsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZW5kID0gMTY7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwogCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKIAlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwppbmRleCA1ZmY4MjYxLi41OGQxMTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwpAQCAtMTA4Miw3ICsxMDgyLDcgQEAKIH0KIAogLyoqCi0gKiBwbTgwMDFfY2hpcF9pb3VubWFwIC0gd2hpY2ggbWFwZWQgd2hlbiBpbml0aWxpemVkLgorICogcG04MDAxX2NoaXBfaW91bm1hcCAtIHdoaWNoIG1hcGVkIHdoZW4gaW5pdGlhbGl6ZWQuCiAgKiBAcG04MDAxX2hhOiBvdXIgaGJhIGNhcmQgaW5mb3JtYXRpb24KICAqLwogc3RhdGljIHZvaWQgcG04MDAxX2NoaXBfaW91bm1hcChzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCkBAIC0xNDgwLDcgKzE0ODAsNyBAQAogCQkJIixwYXJhbSA9ICVkIFxuIiwgcGFyYW0pKTsKIAkJaWYgKHBhcmFtID09IDApIHsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7Ci0JCQl0cy0+c3RhdCA9IFNBTV9HT09EOworCQkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwogCQl9IGVsc2UgewogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJCXRzLT5zdGF0ID0gU0FTX1BST1RPX1JFU1BPTlNFOwpAQCAtMTkwOSw3ICsxOTA5LDcgQEAKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIklPX1NVQ0NFU1NcbiIpKTsKIAkJaWYgKHBhcmFtID09IDApIHsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7Ci0JCQl0cy0+c3RhdCA9IFNBTV9HT09EOworCQkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwogCQl9IGVsc2UgewogCQkJdTggbGVuOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKQEAgLTI0NTAsNyArMjQ1MCw3IEBACiAJY2FzZSBJT19TVUNDRVNTOgogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fU1VDQ0VTU1xuIikpOwogCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwotCQl0cy0+c3RhdCA9IFNBTV9HT09EOworCQl0cy0+c3RhdCA9IFNBTV9TVEFUX0dPT0Q7CiAJaWYgKHBtODAwMV9kZXYpCiAJCQlwbTgwMDFfZGV2LT5ydW5uaW5nX3JlcS0tOwogCQlicmVhazsKQEAgLTI0NzksMTkgKzI0NzksMTkgQEAKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCiAJCQlwbTgwMDFfcHJpbnRrKCJJT19FUlJPUl9IV19USU1FT1VUXG4iKSk7CiAJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7Ci0JCXRzLT5zdGF0ID0gU0FNX0JVU1k7CisJCXRzLT5zdGF0ID0gU0FNX1NUQVRfQlVTWTsKIAkJYnJlYWs7CiAJY2FzZSBJT19YRkVSX0VSUk9SX0JSRUFLOgogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKIAkJCXBtODAwMV9wcmludGsoIklPX1hGRVJfRVJST1JfQlJFQUtcbiIpKTsKIAkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKLQkJdHMtPnN0YXQgPSBTQU1fQlVTWTsKKwkJdHMtPnN0YXQgPSBTQU1fU1RBVF9CVVNZOwogCQlicmVhazsKIAljYXNlIElPX1hGRVJfRVJST1JfUEhZX05PVF9SRUFEWToKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCiAJCQlwbTgwMDFfcHJpbnRrKCJJT19YRkVSX0VSUk9SX1BIWV9OT1RfUkVBRFlcbiIpKTsKIAkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKLQkJdHMtPnN0YXQgPSBTQU1fQlVTWTsKKwkJdHMtPnN0YXQgPSBTQU1fU1RBVF9CVVNZOwogCQlicmVhazsKIAljYXNlIElPX09QRU5fQ05YX0VSUk9SX1BST1RPQ09MX05PVF9TVVBQT1JURUQ6CiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLApAQCAtMzI2MCw3ICszMjYwLDcgQEAKIAljYXNlIElPX1NVQ0NFU1M6CiAJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19TVUNDRVNTXG4iKSk7CiAJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7Ci0JCXRzLT5zdGF0ID0gU0FNX0dPT0Q7CisJCXRzLT5zdGF0ID0gU0FNX1NUQVRfR09PRDsKIAkJYnJlYWs7CiAJY2FzZSBJT19OT1RfVkFMSUQ6CiAJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19OT1RfVkFMSURcbiIpKTsKQEAgLTQxNTIsNyArNDE1Miw3IEBACiB9CiAKIC8qKgotICogcG04MDAxX2NoaXBfc3NwX3RtX3JlcSAtIGJ1aWx0IHRoZSB0YXNrIG1hbmFnbWVudCBjb21tYW5kLgorICogcG04MDAxX2NoaXBfc3NwX3RtX3JlcSAtIGJ1aWx0IHRoZSB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZC4KICAqIEBwbTgwMDFfaGE6IG91ciBoYmEgY2FyZCBpbmZvcm1hdGlvbi4KICAqIEBjY2I6IHRoZSBjY2IgaW5mb3JtYXRpb24uCiAgKiBAdG1mOiB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jCmluZGV4IGNkMDJjZWEuLjZhZTA1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jCkBAIC03NjMsNyArNzYzLDcgQEAKIAkJfQogCiAJCWlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCi0JCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBTV9HT09EKSB7CisJCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBTV9TVEFUX0dPT0QpIHsKIAkJCXJlcyA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CiAJCQlicmVhazsKIAkJfQpAQCAtODUzLDcgKzg1Myw3IEBACiAJCX0KIAogCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgotCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fR09PRCkgeworCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fU1RBVF9HT09EKSB7CiAJCQlyZXMgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOwogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCmluZGV4IGM0NGU0YWIuLmVjYzQ1YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwpAQCAtMTEzLDYgKzExMyw3IEBACiAJIC5nbG9iYWxfaW50cl9tYXNrID0gMHgwMDAzNCwKIAkgLmlvYV9ob3N0X2ludHIgPSAweDAwMDlDLAogCSAuaW9hX2hvc3RfaW50cl9jbHIgPSAweDAwMEEwLAorCSAuaW9hX2hvc3RfbXNpeF9pbnRyID0gMHg3RkM0MCwKIAkgLmlvYV9ob3N0X21hc2sgPSAweDdGQzI4LAogCSAuaW9hX2hvc3RfbWFza19jbHIgPSAweDdGQzI4LAogCSAuaG9zdF9pb2FfaW50ciA9IDB4MDAwMjAsCkBAIC0xNTQsOCArMTU1LDEyIEBACiAJdTggdGFyZ2V0LCBidXMsIGx1bjsKIAl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CiAJaW50IHJjID0gLUVOWElPOworCXUxNiBmd192ZXJzaW9uOworCiAJcGluc3RhbmNlID0gc2hvc3RfcHJpdihzY3NpX2Rldi0+aG9zdCk7CiAKKwlmd192ZXJzaW9uID0gYmUxNl90b19jcHUocGluc3RhbmNlLT5pbnFfZGF0YS0+ZndfdmVyc2lvbik7CisKIAkvKiBEcml2ZXIgZXhwb3NlcyBWU0VUIGFuZCBHU0NTSSByZXNvdXJjZXMgb25seTsgYWxsIG90aGVyIGRldmljZSB0eXBlcwogCSAqIGFyZSBub3QgZXhwb3NlZC4gUmVzb3VyY2UgbGlzdCBpcyBzeW5jaHJvbml6ZWQgdXNpbmcgcmVzb3VyY2UgbG9jawogCSAqIHNvIGFueSB0cmF2ZXJzYWwgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgbGlzdCBzaG91bGQgYmUgZG9uZSBpbnNpZGUKQEAgLTE2Niw3ICsxNzEsMTEgQEAKIAogCQkvKiBkbyBub3QgZXhwb3NlIFZTRVRzIHdpdGggb3JkZXItaWRzID4gTUFYX1ZTRVRfVEFSR0VUUyAqLwogCQlpZiAoUkVTX0lTX1ZTRVQodGVtcC0+Y2ZnX2VudHJ5KSkgewotCQkJdGFyZ2V0ID0gdGVtcC0+Y2ZnX2VudHJ5LnVuaXF1ZV9mbGFnczE7CisJCQlpZiAoZndfdmVyc2lvbiA8PSBQTUNSQUlEX0ZXX1ZFUlNJT05fMSkKKwkJCQl0YXJnZXQgPSB0ZW1wLT5jZmdfZW50cnkudW5pcXVlX2ZsYWdzMTsKKwkJCWVsc2UKKwkJCQl0YXJnZXQgPSB0ZW1wLT5jZmdfZW50cnkuYXJyYXlfaWQgJiAweEZGOworCiAJCQlpZiAodGFyZ2V0ID4gUE1DUkFJRF9NQVhfVlNFVF9UQVJHRVRTKQogCQkJCWNvbnRpbnVlOwogCQkJYnVzID0gUE1DUkFJRF9WU0VUX0JVU19JRDsKQEAgLTI4Myw3ICsyOTIsNyBAQAogICogQHJlYXNvbjogY2FsbGluZyBjb250ZXh0CiAgKgogICogUmV0dXJuIHZhbHVlCi0gKiAJYWN0dWFsIGRlcHRoIHNldAorICoJYWN0dWFsIGRlcHRoIHNldAogICovCiBzdGF0aWMgaW50IHBtY3JhaWRfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYsIGludCBkZXB0aCwKIAkJCQkgICAgICBpbnQgcmVhc29uKQpAQCAtMzA1LDcgKzMxNCw3IEBACiAgKiBAdGFnOiB0eXBlIG9mIHRhZ3MgdG8gdXNlCiAgKgogICogUmV0dXJuIHZhbHVlOgotICogCWFjdHVhbCBxdWV1ZSB0eXBlIHNldAorICoJYWN0dWFsIHF1ZXVlIHR5cGUgc2V0CiAgKi8KIHN0YXRpYyBpbnQgcG1jcmFpZF9jaGFuZ2VfcXVldWVfdHlwZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2LCBpbnQgdGFnKQogewpAQCAtMzU3LDYgKzM2Niw3IEBACiAJCSAqIHByb2Nlc3NlZCBieSBJT0EKIAkJICovCiAJCW1lbXNldCgmY21kLT5pb2FfY2ItPmlvYXJjYi5jZGIsIDAsIFBNQ1JBSURfTUFYX0NEQl9MRU4pOworCQlpb2FyY2ItPmhycnFfaWQgPSAwOwogCQlpb2FyY2ItPnJlcXVlc3RfZmxhZ3MwID0gMDsKIAkJaW9hcmNiLT5yZXF1ZXN0X2ZsYWdzMSA9IDA7CiAJCWlvYXJjYi0+Y21kX3RpbWVvdXQgPSAwOwpAQCAtMzY4LDEzICszNzgsMTUgQEAKIAkJaW9hcmNiLT5hZGRfY21kX3BhcmFtX29mZnNldCA9IDA7CiAJCWNtZC0+aW9hX2NiLT5pb2FzYS5pb2FzYyA9IDA7CiAJCWNtZC0+aW9hX2NiLT5pb2FzYS5yZXNpZHVhbF9kYXRhX2xlbmd0aCA9IDA7Ci0JCWNtZC0+dS50aW1lX2xlZnQgPSAwOworCQljbWQtPnRpbWVfbGVmdCA9IDA7CiAJfQogCiAJY21kLT5jbWRfZG9uZSA9IE5VTEw7CiAJY21kLT5zY3NpX2NtZCA9IE5VTEw7CiAJY21kLT5yZWxlYXNlID0gMDsKIAljbWQtPmNvbXBsZXRpb25fcmVxID0gMDsKKwljbWQtPnNlbnNlX2J1ZmZlciA9IDA7CisJY21kLT5zZW5zZV9idWZmZXJfZG1hID0gMDsKIAljbWQtPmRtYV9oYW5kbGUgPSAwOwogCWluaXRfdGltZXIoJmNtZC0+dGltZXIpOwogfQpAQCAtNDQ5LDcgKzQ2MSw5IEBACiAgKi8KIHN0YXRpYyB1MzIgcG1jcmFpZF9yZWFkX2ludGVycnVwdHMoc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSkKIHsKLQlyZXR1cm4gaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfcmVnKTsKKwlyZXR1cm4gKHBpbnN0YW5jZS0+aW50ZXJydXB0X21vZGUpID8KKwkJaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9tc2l4X2ludGVycnVwdF9yZWcpIDoKKwkJaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfcmVnKTsKIH0KIAogLyoqCkBAIC00NjksMTAgKzQ4MywxNSBAQAogCXUzMiBnbWFzayA9IGlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuZ2xvYmFsX2ludGVycnVwdF9tYXNrX3JlZyk7CiAJdTMyIG5tYXNrID0gZ21hc2sgfCBHTE9CQUxfSU5URVJSVVBUX01BU0s7CiAKLQlpb3dyaXRlMzIobm1hc2ssIHBpbnN0YW5jZS0+aW50X3JlZ3MuZ2xvYmFsX2ludGVycnVwdF9tYXNrX3JlZyk7CiAJaW93cml0ZTMyKGludHJzLCBwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9jbHJfcmVnKTsKLQlpb3dyaXRlMzIoaW50cnMsIHBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X21hc2tfcmVnKTsKLQlpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7CisJaW93cml0ZTMyKG5tYXNrLCBwaW5zdGFuY2UtPmludF9yZWdzLmdsb2JhbF9pbnRlcnJ1cHRfbWFza19yZWcpOworCWlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuZ2xvYmFsX2ludGVycnVwdF9tYXNrX3JlZyk7CisKKwlpZiAoIXBpbnN0YW5jZS0+aW50ZXJydXB0X21vZGUpIHsKKwkJaW93cml0ZTMyKGludHJzLAorCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19yZWcpOworCQlpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7CisJfQogfQogCiAvKioKQEAgLTQ5Myw4ICs1MTIsMTIgQEAKIAl1MzIgbm1hc2sgPSBnbWFzayAmICh+R0xPQkFMX0lOVEVSUlVQVF9NQVNLKTsKIAogCWlvd3JpdGUzMihubWFzaywgcGluc3RhbmNlLT5pbnRfcmVncy5nbG9iYWxfaW50ZXJydXB0X21hc2tfcmVnKTsKLQlpb3dyaXRlMzIofmludHJzLCBwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7Ci0JaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19yZWcpOworCisJaWYgKCFwaW5zdGFuY2UtPmludGVycnVwdF9tb2RlKSB7CisJCWlvd3JpdGUzMih+aW50cnMsCisJCQkgcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19yZWcpOworCQlpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7CisJfQogCiAJcG1jcmFpZF9pbmZvKCJlbmFibGVkIGludGVycnVwdHMgZ2xvYmFsIG1hc2sgPSAleCBpbnRyX21hc2sgPSAleFxuIiwKIAkJaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5nbG9iYWxfaW50ZXJydXB0X21hc2tfcmVnKSwKQEAgLTUwMiw2ICs1MjUsMzkgQEAKIH0KIAogLyoqCisgKiBwbWNyYWlkX2Nscl90cmFuc19vcCAtIGNsZWFyIHRyYW5zIHRvIG9wIGludGVycnVwdAorICoKKyAqIEBwaW5zdGFuY2U6IHBvaW50ZXIgdG8gcGVyIGFkYXB0ZXIgaW5zdGFuY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJuIFZhbHVlCisgKgkgTm9uZQorICovCitzdGF0aWMgdm9pZCBwbWNyYWlkX2Nscl90cmFuc19vcCgKKwlzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlCispCit7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCisJaWYgKCFwaW5zdGFuY2UtPmludGVycnVwdF9tb2RlKSB7CisJCWlvd3JpdGUzMihJTlRSU19UUkFOU0lUSU9OX1RPX09QRVJBVElPTkFMLAorCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19yZWcpOworCQlpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7CisJCWlvd3JpdGUzMihJTlRSU19UUkFOU0lUSU9OX1RPX09QRVJBVElPTkFMLAorCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfY2xyX3JlZyk7CisJCWlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X2Nscl9yZWcpOworCX0KKworCWlmIChwaW5zdGFuY2UtPnJlc2V0X2NtZCAhPSBOVUxMKSB7CisJCWRlbF90aW1lcigmcGluc3RhbmNlLT5yZXNldF9jbWQtPnRpbWVyKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoCisJCQlwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXBpbnN0YW5jZS0+cmVzZXRfY21kLT5jbWRfZG9uZShwaW5zdGFuY2UtPnJlc2V0X2NtZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQlwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJfQorfQorCisvKioKICAqIHBtY3JhaWRfcmVzZXRfdHlwZSAtIERldGVybWluZSB0aGUgcmVxdWlyZWQgcmVzZXQgdHlwZQogICogQHBpbnN0YW5jZTogcG9pbnRlciB0byBhZGFwdGVyIGluc3RhbmNlIHN0cnVjdHVyZQogICoKQEAgLTUzNiw3ICs1OTIsNyBAQAogICogcG1jcmFpZF9iaXN0X2RvbmUgLSBjb21wbGV0aW9uIGZ1bmN0aW9uIGZvciBQQ0kgQklTVAogICogQGNtZDogcG9pbnRlciB0byByZXNldCBjb21tYW5kCiAgKiBSZXR1cm4gVmFsdWUKLSAqIAlub25lCisgKglub25lCiAgKi8KIAogc3RhdGljIHZvaWQgcG1jcmFpZF9pb2FfcmVzZXQoc3RydWN0IHBtY3JhaWRfY21kICopOwpAQCAtNTUyLDE2ICs2MDgsMTYgQEAKIAogCS8qIElmIFBDSSBjb25maWcgc3BhY2UgY2FuJ3QgYmUgYWNjZXNzZWQgd2FpdCBmb3IgYW5vdGhlciB0d28gc2VjcyAqLwogCWlmICgocmMgIT0gUENJQklPU19TVUNDRVNTRlVMIHx8ICghKHBjaV9yZWcgJiBQQ0lfQ09NTUFORF9NRU1PUlkpKSkgJiYKLQkgICAgY21kLT51LnRpbWVfbGVmdCA+IDApIHsKKwkgICAgY21kLT50aW1lX2xlZnQgPiAwKSB7CiAJCXBtY3JhaWRfaW5mbygiQklTVCBub3QgY29tcGxldGUsIHdhaXRpbmcgYW5vdGhlciAyIHNlY3NcbiIpOwotCQljbWQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgY21kLT51LnRpbWVfbGVmdDsKLQkJY21kLT51LnRpbWVfbGVmdCA9IDA7CisJCWNtZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBjbWQtPnRpbWVfbGVmdDsKKwkJY21kLT50aW1lX2xlZnQgPSAwOwogCQljbWQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljbWQ7CiAJCWNtZC0+dGltZXIuZnVuY3Rpb24gPQogCQkJKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKXBtY3JhaWRfYmlzdF9kb25lOwogCQlhZGRfdGltZXIoJmNtZC0+dGltZXIpOwogCX0gZWxzZSB7Ci0JCWNtZC0+dS50aW1lX2xlZnQgPSAwOworCQljbWQtPnRpbWVfbGVmdCA9IDA7CiAJCXBtY3JhaWRfaW5mbygiQklTVCBpcyBjb21wbGV0ZSwgcHJvY2VlZGluZyB3aXRoIHJlc2V0XG4iKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUocGluc3RhbmNlLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCQlwbWNyYWlkX2lvYV9yZXNldChjbWQpOwpAQCAtNTg1LDEwICs2NDEsMTAgQEAKIAkJcGluc3RhbmNlLT5pbnRfcmVncy5ob3N0X2lvYV9pbnRlcnJ1cHRfcmVnKTsKIAlkb29yYmVsbHMgPSBpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmhvc3RfaW9hX2ludGVycnVwdF9yZWcpOwogCWludHJzID0gaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfcmVnKTsKLQlwbWNyYWlkX2luZm8oImRvb3JiZWxscyBhZnRlciBzdGFydCBiaXN0OiAleCBpbnRyczogJXggXG4iLAorCXBtY3JhaWRfaW5mbygiZG9vcmJlbGxzIGFmdGVyIHN0YXJ0IGJpc3Q6ICV4IGludHJzOiAleFxuIiwKIAkJICAgICAgZG9vcmJlbGxzLCBpbnRycyk7CiAKLQljbWQtPnUudGltZV9sZWZ0ID0gbXNlY3NfdG9famlmZmllcyhQTUNSQUlEX0JJU1RfVElNRU9VVCk7CisJY21kLT50aW1lX2xlZnQgPSBtc2Vjc190b19qaWZmaWVzKFBNQ1JBSURfQklTVF9USU1FT1VUKTsKIAljbWQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljbWQ7CiAJY21kLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUE1DUkFJRF9CSVNUX1RJTUVPVVQpOwogCWNtZC0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpcG1jcmFpZF9iaXN0X2RvbmU7CkBAIC02MTIsNyArNjY4LDcgQEAKIAkgKiBzb21lIG1vcmUgdGltZSB0byB3YWl0LCByZXN0YXJ0IHRoZSB0aW1lcgogCSAqLwogCWlmICgoKHN0YXR1cyAmIElOVFJTX0NSSVRJQ0FMX09QX0lOX1BST0dSRVNTKSA9PSAwKSB8fAotCSAgICBjbWQtPnUudGltZV9sZWZ0IDw9IDApIHsKKwkgICAgY21kLT50aW1lX2xlZnQgPD0gMCkgewogCQlwbWNyYWlkX2luZm8oImNyaXRpY2FsIG9wIGlzIHJlc2V0IHByb2NlZWRpbmcgd2l0aCByZXNldFxuIik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAkJcG1jcmFpZF9pb2FfcmVzZXQoY21kKTsKQEAgLTYyMCw3ICs2NzYsNyBAQAogCX0gZWxzZSB7CiAJCXBtY3JhaWRfaW5mbygiY3JpdGljYWwgb3AgaXMgbm90IHlldCByZXNldCB3YWl0aW5nIGFnYWluXG4iKTsKIAkJLyogcmVzdGFydCB0aW1lciBpZiBzb21lIG1vcmUgdGltZSBpcyBhdmFpbGFibGUgdG8gd2FpdCAqLwotCQljbWQtPnUudGltZV9sZWZ0IC09IFBNQ1JBSURfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQ7CisJCWNtZC0+dGltZV9sZWZ0IC09IFBNQ1JBSURfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQ7CiAJCWNtZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNtZDsKIAkJY21kLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBNQ1JBSURfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQ7CiAJCWNtZC0+dGltZXIuZnVuY3Rpb24gPQpAQCAtNjM4LDYgKzY5NCw3IEBACiAgKglzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byBJT0EuIFJldHVybnMgbm9uLXplcm8gaW4gY2FzZSBwY2lfY29uZmlnX3NwYWNlCiAgKglpcyBub3QgYWNjZXNzaWJsZQogICovCitzdGF0aWMgdm9pZCBwbWNyYWlkX25vdGlmeV9pb2FzdGF0ZShzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqLCB1MzIpOwogc3RhdGljIHZvaWQgcG1jcmFpZF9yZXNldF9hbGVydChzdHJ1Y3QgcG1jcmFpZF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlID0gY21kLT5kcnZfaW5zdDsKQEAgLTY1OCw3ICs3MTUsNyBAQAogCQkgKiBPUEVSQVRJT04gYml0IGlzIHJlc2V0LiBBIHRpbWVyIGlzIHN0YXJ0ZWQgdG8gd2FpdCBmb3IgdGhpcwogCQkgKiBiaXQgdG8gYmUgcmVzZXQuCiAJCSAqLwotCQljbWQtPnUudGltZV9sZWZ0ID0gUE1DUkFJRF9SRVNFVF9USU1FT1VUOworCQljbWQtPnRpbWVfbGVmdCA9IFBNQ1JBSURfUkVTRVRfVElNRU9VVDsKIAkJY21kLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY21kOwogCQljbWQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUE1DUkFJRF9DSEVDS19GT1JfUkVTRVRfVElNRU9VVDsKIAkJY21kLT50aW1lci5mdW5jdGlvbiA9CkBAIC02OTMsNyArNzUwLDggQEAKIAl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CiAKIAlkZXZfaW5mbygmcGluc3RhbmNlLT5wZGV2LT5kZXYsCi0JCSJBZGFwdGVyIGJlaW5nIHJlc2V0IGR1ZSB0byBjb21tYW5kIHRpbWVvdXQuXG4iKTsKKwkJIkFkYXB0ZXIgYmVpbmcgcmVzZXQgZHVlIHRvIGNtZChDREJbMF0gPSAleCkgdGltZW91dFxuIiwKKwkJY21kLT5pb2FfY2ItPmlvYXJjYi5jZGJbMF0pOwogCiAJLyogQ29tbWFuZCB0aW1lb3V0cyByZXN1bHQgaW4gaGFyZCByZXNldCBzZXF1ZW5jZS4gVGhlIGNvbW1hbmQgdGhhdCBnb3QKIAkgKiB0aW1lZCBvdXQgbWF5IGJlIHRoZSBvbmUgdXNlZCBhcyBwYXJ0IG9mIHJlc2V0IHNlcXVlbmNlLiBJbiB0aGlzCkBAIC03MzYsOSArNzk0LDE0IEBACiAJCSAqLwogCQlpZiAoY21kID09IHBpbnN0YW5jZS0+cmVzZXRfY21kKQogCQkJY21kLT5jbWRfZG9uZSA9IHBtY3JhaWRfaW9hX3Jlc2V0OwotCiAJfQogCisJLyogTm90aWZ5IGFwcHMgb2YgaW1wb3J0YW50IElPQSBicmluZ3VwL2JyaW5nZG93biBzZXF1ZW5jZXMgKi8KKwlpZiAocGluc3RhbmNlLT5zY24uaW9hX3N0YXRlICE9IFBNQ19ERVZJQ0VfRVZFTlRfUkVTRVRfU1RBUlQgJiYKKwkgICAgcGluc3RhbmNlLT5zY24uaW9hX3N0YXRlICE9IFBNQ19ERVZJQ0VfRVZFTlRfU0hVVERPV05fU1RBUlQpCisJCXBtY3JhaWRfbm90aWZ5X2lvYXN0YXRlKHBpbnN0YW5jZSwKKwkJCQkJUE1DX0RFVklDRV9FVkVOVF9SRVNFVF9TVEFSVCk7CisKIAlwaW5zdGFuY2UtPmlvYV9zdGF0ZSA9IElPQV9TVEFURV9JTl9SRVNFVF9BTEVSVDsKIAlzY3NpX2Jsb2NrX3JlcXVlc3RzKHBpbnN0YW5jZS0+aG9zdCk7CiAJcG1jcmFpZF9yZXNldF9hbGVydChjbWQpOwpAQCAtODY2LDcgKzkyOSw3IEBACiAJLyogQWRkIHRoaXMgY29tbWFuZCBibG9jayB0byBwZW5kaW5nIGNtZCBwb29sLiBXZSBkbyB0aGlzIHByaW9yIHRvCiAJICogd3JpdHRpbmcgSU9BUkNCIHRvIGlvYXJyaW4gYmVjYXVzZSBJT0EgbWlnaHQgY29tcGxldGUgdGhlIGNvbW1hbmQKIAkgKiBieSB0aGUgdGltZSB3ZSBhcmUgYWJvdXQgdG8gYWRkIGl0IHRvIHRoZSBsaXN0LiBSZXNwb25zZSBoYW5kbGVyCi0JICogKGlzci90YXNrbGV0KSBsb29rcyBmb3IgY21iIGJsb2NrIGluIHRoZSBwZW5kaW5nIHBlbmRpbmcgbGlzdC4KKwkgKiAoaXNyL3Rhc2tsZXQpIGxvb2tzIGZvciBjbWQgYmxvY2sgaW4gdGhlIHBlbmRpbmcgcGVuZGluZyBsaXN0LgogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5zdGFuY2UtPnBlbmRpbmdfcG9vbF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZjbWQtPmZyZWVfbGlzdCwgJnBpbnN0YW5jZS0+cGVuZGluZ19jbWRfcG9vbCk7CkBAIC05MTYsNiArOTc5LDIzIEBACiB9CiAKIC8qKgorICogcG1jcmFpZF9pb2Ffc2h1dGRvd25fZG9uZSAtIGNvbXBsZXRpb24gZnVuY3Rpb24gZm9yIElPQSBzaHV0ZG93biBjb21tYW5kCisgKiBAY21kOiBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGJsb2NrIHVzZWQgZm9yIHNlbmRpbmcgSU9BIHNodXRkb3duIGNvbW1hbmQKKyAqCisgKiBSZXR1cm4gdmFsdWUKKyAqICBOb25lCisgKi8KK3N0YXRpYyB2b2lkIHBtY3JhaWRfaW9hX3NodXRkb3duX2RvbmUoc3RydWN0IHBtY3JhaWRfY21kICpjbWQpCit7CisJc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSA9IGNtZC0+ZHJ2X2luc3Q7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUocGluc3RhbmNlLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXBtY3JhaWRfaW9hX3Jlc2V0KGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7Cit9CisKKy8qKgogICogcG1jcmFpZF9pb2Ffc2h1dGRvd24gLSBzZW5kcyBTSFVURE9XTiBjb21tYW5kIHRvIGlvYQogICoKICAqIEBjbWQ6IHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgYmxvY2sgdXNlZCBhcyBwYXJ0IG9mIHJlc2V0IHNlcXVlbmNlCkBAIC05NDMsMzAgKzEwMjMsMTEyIEBACiAJcG1jcmFpZF9pbmZvKCJmaXJpbmcgbm9ybWFsIHNodXRkb3duIGNvbW1hbmQgKCVkKSB0byBJT0FcbiIsCiAJCSAgICAgbGUzMl90b19jcHUoY21kLT5pb2FfY2ItPmlvYXJjYi5yZXNwb25zZV9oYW5kbGUpKTsKIAotCXBtY3JhaWRfc2VuZF9jbWQoY21kLCBwbWNyYWlkX2lvYV9yZXNldCwKKwlwbWNyYWlkX25vdGlmeV9pb2FzdGF0ZShjbWQtPmRydl9pbnN0LCBQTUNfREVWSUNFX0VWRU5UX1NIVVRET1dOX1NUQVJUKTsKKworCXBtY3JhaWRfc2VuZF9jbWQoY21kLCBwbWNyYWlkX2lvYV9zaHV0ZG93bl9kb25lLAogCQkJIFBNQ1JBSURfU0hVVERPV05fVElNRU9VVCwKIAkJCSBwbWNyYWlkX3RpbWVvdXRfaGFuZGxlcik7CiB9CiAKIC8qKgorICogcG1jcmFpZF9nZXRfZnd2ZXJzaW9uX2RvbmUgLSBjb21wbGV0aW9uIGZ1bmN0aW9uIGZvciBnZXRfZnd2ZXJzaW9uCisgKgorICogQGNtZDogcG9pbnRlciB0byBjb21tYW5kIGJsb2NrIHVzZWQgdG8gc2VuZCBJTlFVSVJZIGNvbW1hbmQKKyAqCisgKiBSZXR1cm4gVmFsdWUKKyAqCW5vbmUKKyAqLworc3RhdGljIHZvaWQgcG1jcmFpZF9xdWVyeWNmZyhzdHJ1Y3QgcG1jcmFpZF9jbWQgKik7CisKK3N0YXRpYyB2b2lkIHBtY3JhaWRfZ2V0X2Z3dmVyc2lvbl9kb25lKHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kKQoreworCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UgPSBjbWQtPmRydl9pbnN0OworCXUzMiBpb2FzYyA9IGxlMzJfdG9fY3B1KGNtZC0+aW9hX2NiLT5pb2FzYS5pb2FzYyk7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCisJLyogY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyeSBzaXplIGRlcGVuZHMgb24gZmlybXdhcmUgdmVyc2lvbi4gSWYgZncKKwkgKiB2ZXJzaW9uIGlzIG5vdCBrbm93biwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGludGVycHJldCBJT0EgY29uZmlnCisJICogdGFibGUKKwkgKi8KKwlpZiAoaW9hc2MpIHsKKwkJcG1jcmFpZF9lcnIoIklPQSBJbnF1aXJ5IGZhaWxlZCB3aXRoICV4XG4iLCBpb2FzYyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcGluc3RhbmNlLT5pb2Ffc3RhdGUgPSBJT0FfU1RBVEVfSU5fUkVTRVRfQUxFUlQ7CisJCXBtY3JhaWRfcmVzZXRfYWxlcnQoY21kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJfSBlbHNlICB7CisJCXBtY3JhaWRfcXVlcnljZmcoY21kKTsKKwl9Cit9CisKKy8qKgorICogcG1jcmFpZF9nZXRfZnd2ZXJzaW9uIC0gcmVhZHMgZmlybXdhcmUgdmVyc2lvbiBpbmZvcm1hdGlvbgorICoKKyAqIEBjbWQ6IHBvaW50ZXIgdG8gY29tbWFuZCBibG9jayB1c2VkIHRvIHNlbmQgSU5RVUlSWSBjb21tYW5kCisgKgorICogUmV0dXJuIFZhbHVlCisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIHBtY3JhaWRfZ2V0X2Z3dmVyc2lvbihzdHJ1Y3QgcG1jcmFpZF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcG1jcmFpZF9pb2FyY2IgKmlvYXJjYiA9ICZjbWQtPmlvYV9jYi0+aW9hcmNiOworCXN0cnVjdCBwbWNyYWlkX2lvYWRsX2Rlc2MgKmlvYWRsID0gaW9hcmNiLT5hZGRfZGF0YS51LmlvYWRsOworCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UgPSBjbWQtPmRydl9pbnN0OworCXUxNiBkYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHBtY3JhaWRfaW5xdWlyeV9kYXRhKTsKKworCXBtY3JhaWRfcmVpbml0X2NtZGJsayhjbWQpOworCWlvYXJjYi0+cmVxdWVzdF90eXBlID0gUkVRX1RZUEVfU0NTSTsKKwlpb2FyY2ItPnJlc291cmNlX2hhbmRsZSA9IGNwdV90b19sZTMyKFBNQ1JBSURfSU9BX1JFU19IQU5ETEUpOworCWlvYXJjYi0+Y2RiWzBdID0gSU5RVUlSWTsKKwlpb2FyY2ItPmNkYlsxXSA9IDE7CisJaW9hcmNiLT5jZGJbMl0gPSAweEQwOworCWlvYXJjYi0+Y2RiWzNdID0gKGRhdGFfc2l6ZSA+PiA4KSAmIDB4RkY7CisJaW9hcmNiLT5jZGJbNF0gPSBkYXRhX3NpemUgJiAweEZGOworCisJLyogU2luY2UgZW50aXJlIGlucXVpcnkgZGF0YSBpdCBjYW4gYmUgcGFydCBvZiBJT0FSQ0IgaXRzZWxmCisJICovCisJaW9hcmNiLT5pb2FkbF9idXNfYWRkciA9IGNwdV90b19sZTY0KChjbWQtPmlvYV9jYl9idXNfYWRkcikgKworCQkJCQlvZmZzZXRvZihzdHJ1Y3QgcG1jcmFpZF9pb2FyY2IsCisJCQkJCQlhZGRfZGF0YS51LmlvYWRsWzBdKSk7CisJaW9hcmNiLT5pb2FkbF9sZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2Yoc3RydWN0IHBtY3JhaWRfaW9hZGxfZGVzYykpOworCWlvYXJjYi0+aW9hcmNiX2J1c19hZGRyICY9IH4oMHgxRlVMTCk7CisKKwlpb2FyY2ItPnJlcXVlc3RfZmxhZ3MwIHw9IE5PX0xJTktfREVTQ1M7CisJaW9hcmNiLT5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IGNwdV90b19sZTMyKGRhdGFfc2l6ZSk7CisJaW9hZGwgPSAmKGlvYXJjYi0+YWRkX2RhdGEudS5pb2FkbFswXSk7CisJaW9hZGwtPmZsYWdzID0gSU9BRExfRkxBR1NfTEFTVF9ERVNDOworCWlvYWRsLT5hZGRyZXNzID0gY3B1X3RvX2xlNjQocGluc3RhbmNlLT5pbnFfZGF0YV9iYWRkcik7CisJaW9hZGwtPmRhdGFfbGVuID0gY3B1X3RvX2xlMzIoZGF0YV9zaXplKTsKKworCXBtY3JhaWRfc2VuZF9jbWQoY21kLCBwbWNyYWlkX2dldF9md3ZlcnNpb25fZG9uZSwKKwkJCSBQTUNSQUlEX0lOVEVSTkFMX1RJTUVPVVQsIHBtY3JhaWRfdGltZW91dF9oYW5kbGVyKTsKK30KKworLyoqCiAgKiBwbWNyYWlkX2lkZW50aWZ5X2hycnEgLSByZWdpc3RlcnMgaG9zdCBycnEgYnVmZmVycyB3aXRoIElPQQogICogQGNtZDogcG9pbnRlciB0byBjb21tYW5kIGJsb2NrIHRvIGJlIHVzZWQgZm9yIGlkZW50aWZ5IGhycnEKICAqCiAgKiBSZXR1cm4gVmFsdWUKLSAqCSAwIGluIGNhc2Ugb2Ygc3VjY2Vzcywgb3RoZXJ3aXNlIG5vbi16ZXJvIGZhaWx1cmUgY29kZQorICoJIG5vbmUKICAqLwotCi1zdGF0aWMgdm9pZCBwbWNyYWlkX3F1ZXJ5Y2ZnKHN0cnVjdCBwbWNyYWlkX2NtZCAqKTsKLQogc3RhdGljIHZvaWQgcG1jcmFpZF9pZGVudGlmeV9ocnJxKHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kKQogewogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UgPSBjbWQtPmRydl9pbnN0OwogCXN0cnVjdCBwbWNyYWlkX2lvYXJjYiAqaW9hcmNiID0gJmNtZC0+aW9hX2NiLT5pb2FyY2I7Ci0JaW50IGluZGV4ID0gMDsKKwlpbnQgaW5kZXggPSBjbWQtPmhycnFfaW5kZXg7CiAJX19iZTY0IGhycnFfYWRkciA9IGNwdV90b19iZTY0KHBpbnN0YW5jZS0+aHJycV9zdGFydF9idXNfYWRkcltpbmRleF0pOwogCXUzMiBocnJxX3NpemUgPSBjcHVfdG9fYmUzMihzaXplb2YodTMyKSAqIFBNQ1JBSURfTUFYX0NNRCk7CisJdm9pZCAoKmRvbmVfZnVuY3Rpb24pKHN0cnVjdCBwbWNyYWlkX2NtZCAqKTsKIAogCXBtY3JhaWRfcmVpbml0X2NtZGJsayhjbWQpOworCWNtZC0+aHJycV9pbmRleCA9IGluZGV4ICsgMTsKKworCWlmIChjbWQtPmhycnFfaW5kZXggPCBwaW5zdGFuY2UtPm51bV9ocnJxKSB7CisJCWRvbmVfZnVuY3Rpb24gPSBwbWNyYWlkX2lkZW50aWZ5X2hycnE7CisJfSBlbHNlIHsKKwkJY21kLT5ocnJxX2luZGV4ID0gMDsKKwkJZG9uZV9mdW5jdGlvbiA9IHBtY3JhaWRfZ2V0X2Z3dmVyc2lvbjsKKwl9CiAKIAkvKiBJbml0aWFsaXplIGlvYXJjYiAqLwogCWlvYXJjYi0+cmVxdWVzdF90eXBlID0gUkVRX1RZUEVfSU9BQ01EOwpAQCAtOTgwLDggKzExNDIsOCBAQAogCS8qIElPQSBleHBlY3RzIDY0LWJpdCBwY2kgYWRkcmVzcyB0byBiZSB3cml0dGVuIGluIEIuRSBmb3JtYXQKIAkgKiAoaS5lIGNkYlsyXT1NU0J5dGUuLmNkYls5XT1MU0IuCiAJICovCi0JcG1jcmFpZF9pbmZvKCJIUlJRX0lERU5USUZZIHdpdGggaHJycTppb2FyY2IgPT4gJWxseDolbGx4XG4iLAotCQkgICAgIGhycnFfYWRkciwgaW9hcmNiLT5pb2FyY2JfYnVzX2FkZHIpOworCXBtY3JhaWRfaW5mbygiSFJSUV9JREVOVElGWSB3aXRoIGhycnE6aW9hcmNiOmluZGV4ID0+ICVsbHg6JWxseDoleFxuIiwKKwkJICAgICBocnJxX2FkZHIsIGlvYXJjYi0+aW9hcmNiX2J1c19hZGRyLCBpbmRleCk7CiAKIAltZW1jcHkoJihpb2FyY2ItPmNkYlsyXSksICZocnJxX2FkZHIsIHNpemVvZihocnJxX2FkZHIpKTsKIAltZW1jcHkoJihpb2FyY2ItPmNkYlsxMF0pLCAmaHJycV9zaXplLCBzaXplb2YoaHJycV9zaXplKSk7CkBAIC05OTAsNyArMTE1Miw3IEBACiAJICogTm90ZSB0aGF0IHRoaXMgZ2V0cyBjYWxsZWQgZXZlbiBkdXJpbmcgcmVzZXQgZnJvbSBTQ1NJIG1pZC1sYXllcgogCSAqIG9yIHRhc2tsZXQKIAkgKi8KLQlwbWNyYWlkX3NlbmRfY21kKGNtZCwgcG1jcmFpZF9xdWVyeWNmZywKKwlwbWNyYWlkX3NlbmRfY21kKGNtZCwgZG9uZV9mdW5jdGlvbiwKIAkJCSBQTUNSQUlEX0lOVEVSTkFMX1RJTUVPVVQsCiAJCQkgcG1jcmFpZF90aW1lb3V0X2hhbmRsZXIpOwogfQpAQCAtMTA0Nyw3ICsxMjA5LDcgQEAKIAl9CiAKIAlpZiAodHlwZSA9PSBQTUNSQUlEX0hDQU1fQ09ERV9DT05GSUdfQ0hBTkdFKSB7Ci0JCXJjYl9zaXplID0gc2l6ZW9mKHN0cnVjdCBwbWNyYWlkX2hjYW1fY2NuKTsKKwkJcmNiX3NpemUgPSBzaXplb2Yoc3RydWN0IHBtY3JhaWRfaGNhbV9jY25fZXh0KTsKIAkJY21kX2RvbmUgPSBwbWNyYWlkX3Byb2Nlc3NfY2NuOwogCQlkbWEgPSBwaW5zdGFuY2UtPmNjbi5iYWRkciArIFBNQ1JBSURfQUVOX0hEUl9TSVpFOwogCQloY2FtID0gJnBpbnN0YW5jZS0+Y2NuOwpAQCAtMTA5NCw3ICsxMjU2LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgSG9zdCBDb250cm9sbGVkIEFzeW5jIGNvbW1hbmQgdG8gSU9BLgogICoKICAqIFJldHVybiB2YWx1ZToKLSAqIAlub25lCisgKglub25lCiAgKi8KIHN0YXRpYyB2b2lkIHBtY3JhaWRfc2VuZF9oY2FtKHN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UsIHU4IHR5cGUpCiB7CkBAIC0xMjAyLDE4ICsxMzY0LDI1IEBACiAvKioKICAqIHBtY3JhaWRfZXhwb3NlX3Jlc291cmNlIC0gY2hlY2sgaWYgdGhlIHJlc291cmNlIGNhbiBiZSBleHBvc2VkIHRvIE9TCiAgKgorICogQGZ3X3ZlcnNpb246IGZpcm13YXJlIHZlcnNpb24gY29kZQogICogQGNmZ3RlOiBwb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cnkgb2YgdGhlIHJlc291cmNlCiAgKgogICogUmV0dXJuIHZhbHVlOgotICogCXRydWUgaWYgcmVzb3VyY2UgY2FuIGJlIGFkZGVkIHRvIG1pZGxheWVyLCBmYWxzZSgwKSBvdGhlcndpc2UKKyAqCXRydWUgaWYgcmVzb3VyY2UgY2FuIGJlIGFkZGVkIHRvIG1pZGxheWVyLCBmYWxzZSgwKSBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBwbWNyYWlkX2V4cG9zZV9yZXNvdXJjZShzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnkgKmNmZ3RlKQorc3RhdGljIGludCBwbWNyYWlkX2V4cG9zZV9yZXNvdXJjZSh1MTYgZndfdmVyc2lvbiwKKwkJCQkgICBzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnkgKmNmZ3RlKQogewogCWludCByZXR2YWwgPSAwOwogCi0JaWYgKGNmZ3RlLT5yZXNvdXJjZV90eXBlID09IFJFU19UWVBFX1ZTRVQpCi0JCXJldHZhbCA9ICgoY2ZndGUtPnVuaXF1ZV9mbGFnczEgJiAweDgwKSA9PSAwKTsKLQllbHNlIGlmIChjZmd0ZS0+cmVzb3VyY2VfdHlwZSA9PSBSRVNfVFlQRV9HU0NTSSkKKwlpZiAoY2ZndGUtPnJlc291cmNlX3R5cGUgPT0gUkVTX1RZUEVfVlNFVCkgeworCQlpZiAoZndfdmVyc2lvbiA8PSBQTUNSQUlEX0ZXX1ZFUlNJT05fMSkKKwkJCXJldHZhbCA9ICgoY2ZndGUtPnVuaXF1ZV9mbGFnczEgJiAweDgwKSA9PSAwKTsKKwkJZWxzZQorCQkJcmV0dmFsID0gKChjZmd0ZS0+dW5pcXVlX2ZsYWdzMCAmIDB4ODApID09IDAgJiYKKwkJCQkgIChjZmd0ZS0+dW5pcXVlX2ZsYWdzMSAmIDB4ODApID09IDApOworCisJfSBlbHNlIGlmIChjZmd0ZS0+cmVzb3VyY2VfdHlwZSA9PSBSRVNfVFlQRV9HU0NTSSkKIAkJcmV0dmFsID0gKFJFU19CVVMoY2ZndGUtPnJlc291cmNlX2FkZHJlc3MpICE9CiAJCQkJUE1DUkFJRF9WSVJUVUFMX0VOQ0xfQlVTX0lEKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTI0Niw4ICsxNDE1LDggQEAKICAqIHBtY3JhaWRfbmV0bGlua19pbml0IC0gcmVnaXN0ZXJzIHBtY3JhaWRfZXZlbnRfZmFtaWx5CiAgKgogICogUmV0dXJuIHZhbHVlOgotICogCTAgaWYgdGhlIHBtY3JhaWRfZXZlbnRfZmFtaWx5IGlzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkCi0gKiAJd2l0aCBuZXRsaW5rIGdlbmVyaWMsIG5vbi16ZXJvIG90aGVyd2lzZQorICoJMCBpZiB0aGUgcG1jcmFpZF9ldmVudF9mYW1pbHkgaXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKKyAqCXdpdGggbmV0bGluayBnZW5lcmljLCBub24temVybyBvdGhlcndpc2UKICAqLwogc3RhdGljIGludCBwbWNyYWlkX25ldGxpbmtfaW5pdCh2b2lkKQogewpAQCAtMTI2OCw3ICsxNDM3LDcgQEAKICAqIHBtY3JhaWRfbmV0bGlua19yZWxlYXNlIC0gdW5yZWdpc3RlcnMgcG1jcmFpZF9ldmVudF9mYW1pbHkKICAqCiAgKiBSZXR1cm4gdmFsdWU6Ci0gKiAJbm9uZQorICoJbm9uZQogICovCiBzdGF0aWMgdm9pZCBwbWNyYWlkX25ldGxpbmtfcmVsZWFzZSh2b2lkKQogewpAQCAtMTI4MywzMSArMTQ1MiwzMCBAQAogICogUmV0dXJuIHZhbHVlOgogICoJMCBpZiBzdWNjZXNzLCBlcnJvciB2YWx1ZSBpbiBjYXNlIG9mIGFueSBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IHBtY3JhaWRfbm90aWZ5X2FlbihzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlLCB1OCB0eXBlKQorc3RhdGljIGludCBwbWNyYWlkX25vdGlmeV9hZW4oCisJc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSwKKwlzdHJ1Y3QgcG1jcmFpZF9hZW5fbXNnICAqYWVuX21zZywKKwl1MzIgICAgZGF0YV9zaXplCispCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgcG1jcmFpZF9hZW5fbXNnICphZW5fbXNnOwogCXZvaWQgKm1zZ19oZWFkZXI7Ci0JaW50IGRhdGFfc2l6ZSwgdG90YWxfc2l6ZTsKKwl1MzIgIHRvdGFsX3NpemUsIG5sYV9nZW5sX2hkcl90b3RhbF9zaXplOwogCWludCByZXN1bHQ7CiAKLQotCWlmICh0eXBlID09IFBNQ1JBSURfSENBTV9DT0RFX0xPR19EQVRBKSB7Ci0JCWFlbl9tc2cgPSBwaW5zdGFuY2UtPmxkbi5tc2c7Ci0JCWRhdGFfc2l6ZSA9IHBpbnN0YW5jZS0+bGRuLmhjYW0tPmRhdGFfbGVuOwotCX0gZWxzZSB7Ci0JCWFlbl9tc2cgPSBwaW5zdGFuY2UtPmNjbi5tc2c7Ci0JCWRhdGFfc2l6ZSA9IHBpbnN0YW5jZS0+Y2NuLmhjYW0tPmRhdGFfbGVuOwotCX0KLQotCWRhdGFfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHBtY3JhaWRfaGNhbV9oZHIpOwogCWFlbl9tc2ctPmhvc3RubyA9IChwaW5zdGFuY2UtPmhvc3QtPnVuaXF1ZV9pZCA8PCAxNiB8CiAJCQkgICBNSU5PUihwaW5zdGFuY2UtPmNkZXYuZGV2KSk7CiAJYWVuX21zZy0+bGVuZ3RoID0gZGF0YV9zaXplOworCiAJZGF0YV9zaXplICs9IHNpemVvZigqYWVuX21zZyk7CiAKIAl0b3RhbF9zaXplID0gbmxhX3RvdGFsX3NpemUoZGF0YV9zaXplKTsKLQlza2IgPSBnZW5sbXNnX25ldyh0b3RhbF9zaXplLCBHRlBfQVRPTUlDKTsKKwkvKiBBZGQgR0VOTF9IRFIgdG8gdG90YWxfc2l6ZSAqLworCW5sYV9nZW5sX2hkcl90b3RhbF9zaXplID0KKwkJKHRvdGFsX3NpemUgKyAoR0VOTF9IRFJMRU4gKworCQkoKHN0cnVjdCBnZW5sX2ZhbWlseSAqKSZwbWNyYWlkX2V2ZW50X2ZhbWlseSktPmhkcnNpemUpCisJCSArIE5MTVNHX0hEUkxFTik7CisJc2tiID0gZ2VubG1zZ19uZXcobmxhX2dlbmxfaGRyX3RvdGFsX3NpemUsIEdGUF9BVE9NSUMpOwogCiAKIAlpZiAoIXNrYikgewpAQCAtMTMyOSw3ICsxNDk3LDcgQEAKIAlyZXN1bHQgPSBubGFfcHV0KHNrYiwgUE1DUkFJRF9BRU5fQVRUUl9FVkVOVCwgZGF0YV9zaXplLCBhZW5fbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcG1jcmFpZF9lcnIoImZhaWxlZCB0byBjb3B5IEFFTiBhdHRyaWJ1dGUgZGF0YSBcbiIpOworCQlwbWNyYWlkX2VycigiZmFpbGVkIHRvIGNvcHkgQUVOIGF0dHJpYnV0ZSBkYXRhXG4iKTsKIAkJbmxtc2dfZnJlZShza2IpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzUwLDEzICsxNTE4LDU3IEBACiAJICogdmFsdWUuCiAJICovCiAJaWYgKHJlc3VsdCkKLQkJcG1jcmFpZF9pbmZvKCJmYWlsZWQgdG8gc2VuZCAlcyBldmVudCBtZXNzYWdlICV4IVxuIiwKLQkJCXR5cGUgPT0gUE1DUkFJRF9IQ0FNX0NPREVfTE9HX0RBVEEgPyAiTEROIiA6ICJDQ04iLAotCQkJcmVzdWx0KTsKKwkJcG1jcmFpZF9pbmZvKCJlcnJvciAoJXgpIHNlbmRpbmcgYWVuIGV2ZW50IG1lc3NhZ2VcbiIsIHJlc3VsdCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCisgKiBwbWNyYWlkX25vdGlmeV9jY24gLSBub3RpZmllcyBhYm91dCBDQ04gZXZlbnQgbXNnIHRvIHVzZXIgc3BhY2UKKyAqIEBwaW5zdGFuY2U6IHBvaW50ZXIgYWRhcHRlciBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwIGlmIHN1Y2Nlc3MsIGVycm9yIHZhbHVlIGluIGNhc2Ugb2YgYW55IGZhaWx1cmUKKyAqLworc3RhdGljIGludCBwbWNyYWlkX25vdGlmeV9jY24oc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gcG1jcmFpZF9ub3RpZnlfYWVuKHBpbnN0YW5jZSwKKwkJCQlwaW5zdGFuY2UtPmNjbi5tc2csCisJCQkJcGluc3RhbmNlLT5jY24uaGNhbS0+ZGF0YV9sZW4gKworCQkJCXNpemVvZihzdHJ1Y3QgcG1jcmFpZF9oY2FtX2hkcikpOworfQorCisvKioKKyAqIHBtY3JhaWRfbm90aWZ5X2xkbiAtIG5vdGlmaWVzIGFib3V0IENDTiBldmVudCBtc2cgdG8gdXNlciBzcGFjZQorICogQHBpbnN0YW5jZTogcG9pbnRlciBhZGFwdGVyIGluc3RhbmNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAgaWYgc3VjY2VzcywgZXJyb3IgdmFsdWUgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZQorICovCitzdGF0aWMgaW50IHBtY3JhaWRfbm90aWZ5X2xkbihzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlKQoreworCXJldHVybiBwbWNyYWlkX25vdGlmeV9hZW4ocGluc3RhbmNlLAorCQkJCXBpbnN0YW5jZS0+bGRuLm1zZywKKwkJCQlwaW5zdGFuY2UtPmxkbi5oY2FtLT5kYXRhX2xlbiArCisJCQkJc2l6ZW9mKHN0cnVjdCBwbWNyYWlkX2hjYW1faGRyKSk7Cit9CisKKy8qKgorICogcG1jcmFpZF9ub3RpZnlfaW9hc3RhdGUgLSBzZW5kcyBJT0Egc3RhdGUgZXZlbnQgbXNnIHRvIHVzZXIgc3BhY2UKKyAqIEBwaW5zdGFuY2U6IHBvaW50ZXIgYWRhcHRlciBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAqIEBldnQ6IGNvbnRyb2xsZXIgc3RhdGUgZXZlbnQgdG8gYmUgc2VudAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAgaWYgc3VjY2VzcywgZXJyb3IgdmFsdWUgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZQorICovCitzdGF0aWMgdm9pZCBwbWNyYWlkX25vdGlmeV9pb2FzdGF0ZShzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlLCB1MzIgZXZ0KQoreworCXBpbnN0YW5jZS0+c2NuLmlvYV9zdGF0ZSA9IGV2dDsKKwlwbWNyYWlkX25vdGlmeV9hZW4ocGluc3RhbmNlLAorCQkJICAmcGluc3RhbmNlLT5zY24ubXNnLAorCQkJICBzaXplb2YodTMyKSk7Cit9CisKKy8qKgogICogcG1jcmFpZF9oYW5kbGVfY29uZmlnX2NoYW5nZSAtIEhhbmRsZSBhIGNvbmZpZyBjaGFuZ2UgZnJvbSB0aGUgYWRhcHRlcgogICogQHBpbnN0YW5jZTogcG9pbnRlciB0byBwZXIgYWRhcHRlciBpbnN0YW5jZSBzdHJ1Y3R1cmUKICAqCkBAIC0xMzc1LDEwICsxNTg3LDEyIEBACiAJdW5zaWduZWQgbG9uZyBob3N0X2xvY2tfZmxhZ3M7CiAJdTMyIG5ld19lbnRyeSA9IDE7CiAJdTMyIGhpZGRlbl9lbnRyeSA9IDA7CisJdTE2IGZ3X3ZlcnNpb247CiAJaW50IHJjOwogCiAJY2NuX2hjYW0gPSAoc3RydWN0IHBtY3JhaWRfaGNhbV9jY24gKilwaW5zdGFuY2UtPmNjbi5oY2FtOwogCWNmZ19lbnRyeSA9ICZjY25faGNhbS0+Y2ZnX2VudHJ5OworCWZ3X3ZlcnNpb24gPSBiZTE2X3RvX2NwdShwaW5zdGFuY2UtPmlucV9kYXRhLT5md192ZXJzaW9uKTsKIAogCXBtY3JhaWRfaW5mbwogCQkoIkNDTigleCk6ICV4IHR5cGU6ICV4IGxvc3Q6ICV4IGZsYWdzOiAleCByZXM6ICV4OiV4OiV4OiV4XG4iLApAQCAtMTM5MSw3ICsxNjA1LDEwIEBACiAJCSBSRVNfSVNfVlNFVCgqY2ZnX2VudHJ5KSA/IFBNQ1JBSURfVlNFVF9CVVNfSUQgOgogCQkgKFJFU19JU19HU0NTSSgqY2ZnX2VudHJ5KSA/IFBNQ1JBSURfUEhZU19CVVNfSUQgOgogCQkJUkVTX0JVUyhjZmdfZW50cnktPnJlc291cmNlX2FkZHJlc3MpKSwKLQkJIFJFU19JU19WU0VUKCpjZmdfZW50cnkpID8gY2ZnX2VudHJ5LT51bmlxdWVfZmxhZ3MxIDoKKwkJIFJFU19JU19WU0VUKCpjZmdfZW50cnkpID8KKwkJCShmd192ZXJzaW9uIDw9IFBNQ1JBSURfRldfVkVSU0lPTl8xID8KKwkJCQljZmdfZW50cnktPnVuaXF1ZV9mbGFnczEgOgorCQkJCQljZmdfZW50cnktPmFycmF5X2lkICYgMHhGRikgOgogCQkJUkVTX1RBUkdFVChjZmdfZW50cnktPnJlc291cmNlX2FkZHJlc3MpLAogCQkgUkVTX0xVTihjZmdfZW50cnktPnJlc291cmNlX2FkZHJlc3MpKTsKIApAQCAtMTQxNSwxMSArMTYzMiwxNiBAQAogCSAqLwogCWlmIChwaW5zdGFuY2UtPmNjbi5oY2FtLT5ub3RpZmljYXRpb25fdHlwZSA9PQogCSAgICBOT1RJRklDQVRJT05fVFlQRV9FTlRSWV9DSEFOR0VEICYmCi0JICAgIGNmZ19lbnRyeS0+cmVzb3VyY2VfdHlwZSA9PSBSRVNfVFlQRV9WU0VUICYmCi0JICAgIGNmZ19lbnRyeS0+dW5pcXVlX2ZsYWdzMSAmIDB4ODApIHsKLQkJaGlkZGVuX2VudHJ5ID0gMTsKLQl9IGVsc2UgaWYgKCFwbWNyYWlkX2V4cG9zZV9yZXNvdXJjZShjZmdfZW50cnkpKQorCSAgICBjZmdfZW50cnktPnJlc291cmNlX3R5cGUgPT0gUkVTX1RZUEVfVlNFVCkgeworCisJCWlmIChmd192ZXJzaW9uIDw9IFBNQ1JBSURfRldfVkVSU0lPTl8xKQorCQkJaGlkZGVuX2VudHJ5ID0gKGNmZ19lbnRyeS0+dW5pcXVlX2ZsYWdzMSAmIDB4ODApICE9IDA7CisJCWVsc2UKKwkJCWhpZGRlbl9lbnRyeSA9IChjZmdfZW50cnktPnVuaXF1ZV9mbGFnczEgJiAweDgwKSAhPSAwOworCisJfSBlbHNlIGlmICghcG1jcmFpZF9leHBvc2VfcmVzb3VyY2UoZndfdmVyc2lvbiwgY2ZnX2VudHJ5KSkgewogCQlnb3RvIG91dF9ub3RpZnlfYXBwczsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGluc3RhbmNlLT5yZXNvdXJjZV9sb2NrLCBsb2NrX2ZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJnBpbnN0YW5jZS0+dXNlZF9yZXNfcSwgcXVldWUpIHsKQEAgLTE0NjYsMTMgKzE2ODgsMTUgQEAKIAkJbGlzdF9hZGRfdGFpbCgmcmVzLT5xdWV1ZSwgJnBpbnN0YW5jZS0+dXNlZF9yZXNfcSk7CiAJfQogCi0JbWVtY3B5KCZyZXMtPmNmZ19lbnRyeSwgY2ZnX2VudHJ5LAotCQlzaXplb2Yoc3RydWN0IHBtY3JhaWRfY29uZmlnX3RhYmxlX2VudHJ5KSk7CisJbWVtY3B5KCZyZXMtPmNmZ19lbnRyeSwgY2ZnX2VudHJ5LCBwaW5zdGFuY2UtPmNvbmZpZ190YWJsZV9lbnRyeV9zaXplKTsKIAogCWlmIChwaW5zdGFuY2UtPmNjbi5oY2FtLT5ub3RpZmljYXRpb25fdHlwZSA9PQogCSAgICBOT1RJRklDQVRJT05fVFlQRV9FTlRSWV9ERUxFVEVEIHx8IGhpZGRlbl9lbnRyeSkgewogCQlpZiAocmVzLT5zY3NpX2RldikgewotCQkJcmVzLT5jZmdfZW50cnkudW5pcXVlX2ZsYWdzMSAmPSAweDdGOworCQkJaWYgKGZ3X3ZlcnNpb24gPD0gUE1DUkFJRF9GV19WRVJTSU9OXzEpCisJCQkJcmVzLT5jZmdfZW50cnkudW5pcXVlX2ZsYWdzMSAmPSAweDdGOworCQkJZWxzZQorCQkJCXJlcy0+Y2ZnX2VudHJ5LmFycmF5X2lkICY9IDB4RkY7CiAJCQlyZXMtPmNoYW5nZV9kZXRlY3RlZCA9IFJFU19DSEFOR0VfREVMOwogCQkJcmVzLT5jZmdfZW50cnkucmVzb3VyY2VfaGFuZGxlID0KIAkJCQlQTUNSQUlEX0lOVkFMSURfUkVTX0hBTkRMRTsKQEAgLTE0OTEsNyArMTcxNSw3IEBACiAKIAkvKiBOb3RpZnkgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zLiovCiAJaWYgKCFwbWNyYWlkX2Rpc2FibGVfYWVuKQotCQlwbWNyYWlkX25vdGlmeV9hZW4ocGluc3RhbmNlLCBQTUNSQUlEX0hDQU1fQ09ERV9DT05GSUdfQ0hBTkdFKTsKKwkJcG1jcmFpZF9ub3RpZnlfY2NuKHBpbnN0YW5jZSk7CiAKIAljbWQgPSBwbWNyYWlkX2luaXRfaGNhbShwaW5zdGFuY2UsIFBNQ1JBSURfSENBTV9DT0RFX0NPTkZJR19DSEFOR0UpOwogCWlmIChjbWQpCkBAIC0xNTI4LDcgKzE3NTIsNyBAQAogCQlyZXR1cm47CiAKIAkvKiBsb2cgdGhlIGVycm9yIHN0cmluZyAqLwotCXBtY3JhaWRfZXJyKCJjbWQgWyVkXSBmb3IgcmVzb3VyY2UgJXggZmFpbGVkIHdpdGggJXgoJXMpXG4iLAorCXBtY3JhaWRfZXJyKCJjbWQgWyV4XSBmb3IgcmVzb3VyY2UgJXggZmFpbGVkIHdpdGggJXgoJXMpXG4iLAogCQljbWQtPmlvYV9jYi0+aW9hcmNiLmNkYlswXSwKIAkJY21kLT5pb2FfY2ItPmlvYXJjYi5yZXNvdXJjZV9oYW5kbGUsCiAJCWxlMzJfdG9fY3B1KGlvYXNjKSwgZXJyb3JfaW5mby0+ZXJyb3Jfc3RyaW5nKTsKQEAgLTE2NjMsNyArMTg4Nyw3IEBACiAJfQogCS8qIHNlbmQgbmV0bGluayBtZXNzYWdlIGZvciBIQ0FNIG5vdGlmaWNhdGlvbiBpZiBlbmFibGVkICovCiAJaWYgKCFwbWNyYWlkX2Rpc2FibGVfYWVuKQotCQlwbWNyYWlkX25vdGlmeV9hZW4ocGluc3RhbmNlLCBQTUNSQUlEX0hDQU1fQ09ERV9MT0dfREFUQSk7CisJCXBtY3JhaWRfbm90aWZ5X2xkbihwaW5zdGFuY2UpOwogCiAJY21kID0gcG1jcmFpZF9pbml0X2hjYW0ocGluc3RhbmNlLCBQTUNSQUlEX0hDQU1fQ09ERV9MT0dfREFUQSk7CiAJaWYgKGNtZCkKQEAgLTE3MDEsMTAgKzE5MjUsMTMgQEAKIAlhdG9taWNfc2V0KCZwaW5zdGFuY2UtPmxkbi5pZ25vcmUsIDEpOwogCiAJLyogSWYgYWRhcHRlciByZXNldCB3YXMgZm9yY2VkIGFzIHBhcnQgb2YgcnVudGltZSByZXNldCBzZXF1ZW5jZSwKLQkgKiBzdGFydCB0aGUgcmVzZXQgc2VxdWVuY2UuCisJICogc3RhcnQgdGhlIHJlc2V0IHNlcXVlbmNlLiBSZXNldCB3aWxsIGJlIHRyaWdnZXJlZCBldmVuIGluIGNhc2UKKwkgKiBJT0EgdW5pdF9jaGVjay4KIAkgKi8KLQlpZiAocGluc3RhbmNlLT5mb3JjZV9pb2FfcmVzZXQgJiYgIXBpbnN0YW5jZS0+aW9hX2JyaW5nZG93bikgeworCWlmICgocGluc3RhbmNlLT5mb3JjZV9pb2FfcmVzZXQgJiYgIXBpbnN0YW5jZS0+aW9hX2JyaW5nZG93bikgfHwKKwkgICAgIHBpbnN0YW5jZS0+aW9hX3VuaXRfY2hlY2spIHsKIAkJcGluc3RhbmNlLT5mb3JjZV9pb2FfcmVzZXQgPSAwOworCQlwaW5zdGFuY2UtPmlvYV91bml0X2NoZWNrID0gMDsKIAkJcGluc3RhbmNlLT5pb2Ffc3RhdGUgPSBJT0FfU1RBVEVfSU5fUkVTRVRfQUxFUlQ7CiAJCXBtY3JhaWRfcmVzZXRfYWxlcnQoY21kKTsKIAkJcmV0dXJuOwpAQCAtMTczNSwxMCArMTk2MiwxMyBAQAogCXBtY3JhaWRfZW5hYmxlX2ludGVycnVwdHMocGluc3RhbmNlLCBQTUNSQUlEX1BDSV9JTlRFUlJVUFRTKTsKIAogCWlmIChpbnRycyAmIElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwpIHsKLQkJaW93cml0ZTMyKElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwsCi0JCQlwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7Ci0JCWlvd3JpdGUzMihJTlRSU19UUkFOU0lUSU9OX1RPX09QRVJBVElPTkFMLAotCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfY2xyX3JlZyk7CisJCWlmICghcGluc3RhbmNlLT5pbnRlcnJ1cHRfbW9kZSkgeworCQkJaW93cml0ZTMyKElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwsCisJCQkJcGluc3RhbmNlLT5pbnRfcmVncy4KKwkJCQlpb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19yZWcpOworCQkJaW93cml0ZTMyKElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwsCisJCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfY2xyX3JlZyk7CisJCX0KIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIDA7CkBAIC0xNzc3LDggKzIwMDcsMTkgQEAKIAlkb29yYmVsbCA9IERPT1JCRUxMX1JVTlRJTUVfUkVTRVQgfAogCQkgICBET09SQkVMTF9FTkFCTEVfREVTVFJVQ1RJVkVfRElBR1M7CiAKKwkvKiBTaW5jZSB3ZSBkbyBSRVNFVF9BTEVSVCBhbmQgU3RhcnQgQklTVCB3ZSBoYXZlIHRvIGFnYWluIHdyaXRlCisJICogTVNJWCBEb29yYmVsbCB0byBpbmRpY2F0ZSB0aGUgaW50ZXJydXB0IG1vZGUKKwkgKi8KKwlpZiAocGluc3RhbmNlLT5pbnRlcnJ1cHRfbW9kZSkgeworCQlpb3dyaXRlMzIoRE9PUkJFTExfSU5UUl9NT0RFX01TSVgsCisJCQkgIHBpbnN0YW5jZS0+aW50X3JlZ3MuaG9zdF9pb2FfaW50ZXJydXB0X3JlZyk7CisJCWlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuaG9zdF9pb2FfaW50ZXJydXB0X3JlZyk7CisJfQorCiAJaW93cml0ZTMyKGRvb3JiZWxsLCBwaW5zdGFuY2UtPmludF9yZWdzLmhvc3RfaW9hX2ludGVycnVwdF9yZWcpOworCWlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuaG9zdF9pb2FfaW50ZXJydXB0X3JlZyksCiAJaW50X3JlZyA9IGlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X3JlZyk7CisKIAlwbWNyYWlkX2luZm8oIldhaXRpbmcgZm9yIElPQSB0byBiZWNvbWUgb3BlcmF0aW9uYWwgJXg6JXhcbiIsCiAJCSAgICAgaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5ob3N0X2lvYV9pbnRlcnJ1cHRfcmVnKSwKIAkJICAgICBpbnRfcmVnKTsKQEAgLTE4NTQsNyArMjA5NSw4IEBACiAJCX0gZWxzZSBpZiAoY21kLT5jbWRfZG9uZSA9PSBwbWNyYWlkX2ludGVybmFsX2RvbmUgfHwKIAkJCSAgIGNtZC0+Y21kX2RvbmUgPT0gcG1jcmFpZF9lcnBfZG9uZSkgewogCQkJY21kLT5jbWRfZG9uZShjbWQpOwotCQl9IGVsc2UgaWYgKGNtZC0+Y21kX2RvbmUgIT0gcG1jcmFpZF9pb2FfcmVzZXQpIHsKKwkJfSBlbHNlIGlmIChjbWQtPmNtZF9kb25lICE9IHBtY3JhaWRfaW9hX3Jlc2V0ICYmCisJCQkgICBjbWQtPmNtZF9kb25lICE9IHBtY3JhaWRfaW9hX3NodXRkb3duX2RvbmUpIHsKIAkJCXBtY3JhaWRfcmV0dXJuX2NtZChjbWQpOwogCQl9CiAKQEAgLTE5NjQsNiArMjIwNiwxMyBAQAogCQkJcGluc3RhbmNlLT5pb2FfcmVzZXRfYXR0ZW1wdHMgPSAwOwogCQkJcG1jcmFpZF9lcnIoIklPQSBkaWRuJ3QgcmVzcG9uZCBtYXJraW5nIGl0IGFzIGRlYWRcbiIpOwogCQkJcGluc3RhbmNlLT5pb2Ffc3RhdGUgPSBJT0FfU1RBVEVfREVBRDsKKworCQkJaWYgKHBpbnN0YW5jZS0+aW9hX2JyaW5nZG93bikKKwkJCQlwbWNyYWlkX25vdGlmeV9pb2FzdGF0ZShwaW5zdGFuY2UsCisJCQkJCVBNQ19ERVZJQ0VfRVZFTlRfU0hVVERPV05fRkFJTEVEKTsKKwkJCWVsc2UKKwkJCQlwbWNyYWlkX25vdGlmeV9pb2FzdGF0ZShwaW5zdGFuY2UsCisJCQkJCQlQTUNfREVWSUNFX0VWRU5UX1JFU0VUX0ZBSUxFRCk7CiAJCQlyZXNldF9jb21wbGV0ZSA9IDE7CiAJCQlicmVhazsKIAkJfQpAQCAtMTk3MSw3ICsyMjIwLDYgQEAKIAkJLyogT25jZSBlaXRoZXIgYmlzdCBvciBwY2kgcmVzZXQgaXMgZG9uZSwgcmVzdG9yZSBQQ0kgY29uZmlnCiAJCSAqIHNwYWNlLiBJZiB0aGlzIGZhaWxzLCBwcm9jZWVkIHdpdGggaGFyZCByZXNldCBhZ2FpbgogCQkgKi8KLQogCQlpZiAocGNpX3Jlc3RvcmVfc3RhdGUocGluc3RhbmNlLT5wZGV2KSkgewogCQkJcG1jcmFpZF9pbmZvKCJjb25maWctc3BhY2UgZXJyb3IgcmVzZXR0aW5nIGFnYWluXG4iKTsKIAkJCXBpbnN0YW5jZS0+aW9hX3N0YXRlID0gSU9BX1NUQVRFX0lOX1JFU0VUX0FMRVJUOwpAQCAtMjAwMiw2ICsyMjUwLDggQEAKIAkJCXBpbnN0YW5jZS0+aW9hX3NodXRkb3duX3R5cGUgPSBTSFVURE9XTl9OT05FOwogCQkJcGluc3RhbmNlLT5pb2FfYnJpbmdkb3duID0gMDsKIAkJCXBpbnN0YW5jZS0+aW9hX3N0YXRlID0gSU9BX1NUQVRFX1VOS05PV047CisJCQlwbWNyYWlkX25vdGlmeV9pb2FzdGF0ZShwaW5zdGFuY2UsCisJCQkJCVBNQ19ERVZJQ0VfRVZFTlRfU0hVVERPV05fU1VDQ0VTUyk7CiAJCQlyZXNldF9jb21wbGV0ZSA9IDE7CiAJCX0gZWxzZSB7CiAJCQkvKiBicmluZy11cCBJT0EsIHNvIHByb2NlZWQgd2l0aCBzb2Z0IHJlc2V0CkBAIC0yMDUxLDYgKzIzMDEsOCBAQAogCQkgKi8KIAkJaWYgKHBpbnN0YW5jZS0+aW9hX3NodXRkb3duX3R5cGUgPT0gU0hVVERPV05fTk9ORSAmJgogCQkgICAgcGluc3RhbmNlLT5mb3JjZV9pb2FfcmVzZXQgPT0gMCkgeworCQkJcG1jcmFpZF9ub3RpZnlfaW9hc3RhdGUocGluc3RhbmNlLAorCQkJCQkJUE1DX0RFVklDRV9FVkVOVF9SRVNFVF9TVUNDRVNTKTsKIAkJCXJlc2V0X2NvbXBsZXRlID0gMTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwaW5zdGFuY2UtPmlvYV9zaHV0ZG93bl90eXBlICE9IFNIVVRET1dOX05PTkUpCkBAIC0yMTE2LDYgKzIzNjgsOCBAQAogCQlwaW5zdGFuY2UtPmlvYV9zaHV0ZG93bl90eXBlID0gU0hVVERPV05fTk9ORTsKIAkJcGluc3RhbmNlLT5yZXNldF9jbWQgPSBjbWQ7CiAJCXBpbnN0YW5jZS0+Zm9yY2VfaW9hX3Jlc2V0ID0gMTsKKwkJcG1jcmFpZF9ub3RpZnlfaW9hc3RhdGUocGluc3RhbmNlLAorCQkJCQlQTUNfREVWSUNFX0VWRU5UX1JFU0VUX1NUQVJUKTsKIAkJcG1jcmFpZF9pb2FfcmVzZXQoY21kKTsKIAl9CiB9CkBAIC0yMTkxLDcgKzI0NDUsNyBAQAogCQl3YWl0X2V2ZW50KHBpbnN0YW5jZS0+cmVzZXRfd2FpdF9xLAogCQkJICAgIXBpbnN0YW5jZS0+aW9hX3Jlc2V0X2luX3Byb2dyZXNzKTsKIAotCQlwbWNyYWlkX2luZm8oInJlc2V0X3JlbG9hZDogcmVzZXQgaXMgY29tcGxldGUgISEgXG4iKTsKKwkJcG1jcmFpZF9pbmZvKCJyZXNldF9yZWxvYWQ6IHJlc2V0IGlzIGNvbXBsZXRlICEhXG4iKTsKIAkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHBpbnN0YW5jZS0+aG9zdCk7CiAJCWlmIChwaW5zdGFuY2UtPmlvYV9zdGF0ZSA9PSB0YXJnZXRfc3RhdGUpCiAJCQlyZXNldCA9IDA7CkBAIC0yMjI1LDYgKzI0NzksOCBAQAogICovCiBzdGF0aWMgaW50IHBtY3JhaWRfcmVzZXRfYnJpbmd1cChzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlKQogeworCXBtY3JhaWRfbm90aWZ5X2lvYXN0YXRlKHBpbnN0YW5jZSwgUE1DX0RFVklDRV9FVkVOVF9SRVNFVF9TVEFSVCk7CisKIAlyZXR1cm4gcG1jcmFpZF9yZXNldF9yZWxvYWQocGluc3RhbmNlLAogCQkJCSAgICBTSFVURE9XTl9OT05FLAogCQkJCSAgICBJT0FfU1RBVEVfT1BFUkFUSU9OQUwpOwpAQCAtMjcwNCw3ICsyOTYwLDcgQEAKIAogCXBtY3JhaWRfaW5mbygiY29tbWFuZCAoJWQpIENEQlswXSA9ICV4IGZvciAleFxuIiwKIAkJbGUzMl90b19jcHUoY2FuY2VsX2NtZC0+aW9hX2NiLT5pb2FyY2IucmVzcG9uc2VfaGFuZGxlKSA+PiAyLAotCQljbWQtPmlvYV9jYi0+aW9hcmNiLmNkYlswXSwKKwkJY2FuY2VsX2NtZC0+aW9hX2NiLT5pb2FyY2IuY2RiWzBdLAogCQlsZTMyX3RvX2NwdShjYW5jZWxfY21kLT5pb2FfY2ItPmlvYXJjYi5yZXNvdXJjZV9oYW5kbGUpKTsKIAogCXBtY3JhaWRfc2VuZF9jbWQoY2FuY2VsX2NtZCwKQEAgLTI3MjksOCArMjk4NSw4IEBACiAJdTMyIGlvYXNjOwogCiAJd2FpdF9mb3JfY29tcGxldGlvbigmY2FuY2VsX2NtZC0+d2FpdF9mb3JfY29tcGxldGlvbik7Ci0JcmVzID0gY2FuY2VsX2NtZC0+dS5yZXM7Ci0JY2FuY2VsX2NtZC0+dS5yZXMgPSBOVUxMOworCXJlcyA9IGNhbmNlbF9jbWQtPnJlczsKKwljYW5jZWxfY21kLT5yZXMgPSBOVUxMOwogCWlvYXNjID0gbGUzMl90b19jcHUoY2FuY2VsX2NtZC0+aW9hX2NiLT5pb2FzYS5pb2FzYyk7CiAKIAkvKiBJZiB0aGUgYWJvcnQgdGFzayBpcyBub3QgdGltZWQgb3V0IHdlIHdpbGwgZ2V0IGEgR29vZCBjb21wbGV0aW9uCkBAIC0yODIzLDcgKzMwNzksNyBAQAogCQkJICAgICAgIGhvc3RfbG9ja19mbGFncyk7CiAKIAlpZiAoY2FuY2VsX2NtZCkgewotCQljYW5jZWxfY21kLT51LnJlcyA9IGNtZC0+c2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CisJCWNhbmNlbF9jbWQtPnJlcyA9IGNtZC0+c2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CiAJCXJjID0gcG1jcmFpZF9hYm9ydF9jb21wbGV0ZShjYW5jZWxfY21kKTsKIAl9CiAKQEAgLTI4NDIsNyArMzA5OCw3IEBACiAgKiB0YWtlcyBjYXJlIGJ5IGxvY2tpbmcvdW5sb2NraW5nIGhvc3RfbG9jay4KICAqCiAgKiBSZXR1cm4gdmFsdWUKLSAqIAlTVUNDRVNTIG9yIEZBSUxFRAorICoJU1VDQ0VTUyBvciBGQUlMRUQKICAqLwogc3RhdGljIGludCBwbWNyYWlkX2VoX2RldmljZV9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7CkBAIC0yODc5LDcgKzMxMzUsNyBAQAogICogSW5pdGlhdGVzIGFkYXB0ZXIgcmVzZXQgdG8gYnJpbmcgaXQgdXAgdG8gb3BlcmF0aW9uYWwgc3RhdGUKICAqCiAgKiBSZXR1cm4gdmFsdWUKLSAqIAlTVUNDRVNTIG9yIEZBSUxFRAorICoJU1VDQ0VTUyBvciBGQUlMRUQKICAqLwogc3RhdGljIGludCBwbWNyYWlkX2VoX2hvc3RfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewpAQCAtMjk5MSw3ICszMjQ3LDcgQEAKICAqIHRvIGZpcm13YXJlLiBUaGlzIGJ1aWxkcyBpb2FkbCBkZXNjcmlwdG9ycyBhbmQgc2V0cyB1cCBpb2FyY2IgZmllbGRzLgogICoKICAqIFJldHVybiB2YWx1ZToKLSAqIAkwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZQorICoJMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUKICAqLwogc3RhdGljIGludCBwbWNyYWlkX2J1aWxkX2lvYWRsKAogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UsCkBAIC0zMDQ5LDcgKzMzMDUsNyBAQAogICogRnJlZSBhIERNQSdhYmxlIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIHBtY3JhaWRfYWxsb2Nfc2dsaXN0CiAgKgogICogUmV0dXJuIHZhbHVlOgotICogCW5vbmUKKyAqCW5vbmUKICAqLwogc3RhdGljIHZvaWQgcG1jcmFpZF9mcmVlX3NnbGlzdChzdHJ1Y3QgcG1jcmFpZF9zZ2xpc3QgKnNnbGlzdCkKIHsKQEAgLTMwNzAsNyArMzMyNiw3IEBACiAgKiBsaXN0LgogICoKICAqIFJldHVybiB2YWx1ZQotICogCXBvaW50ZXIgdG8gc2dsaXN0IC8gTlVMTCBvbiBmYWlsdXJlCisgKglwb2ludGVyIHRvIHNnbGlzdCAvIE5VTEwgb24gZmFpbHVyZQogICovCiBzdGF0aWMgc3RydWN0IHBtY3JhaWRfc2dsaXN0ICpwbWNyYWlkX2FsbG9jX3NnbGlzdChpbnQgYnVmbGVuKQogewpAQCAtMzIyNCwxMSArMzQ4MCwxMiBAQAogCXN0cnVjdCBwbWNyYWlkX3Jlc291cmNlX2VudHJ5ICpyZXM7CiAJc3RydWN0IHBtY3JhaWRfaW9hcmNiICppb2FyY2I7CiAJc3RydWN0IHBtY3JhaWRfY21kICpjbWQ7CisJdTMyIGZ3X3ZlcnNpb247CiAJaW50IHJjID0gMDsKIAogCXBpbnN0YW5jZSA9CiAJCShzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqKXNjc2lfY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCisJZndfdmVyc2lvbiA9IGJlMTZfdG9fY3B1KHBpbnN0YW5jZS0+aW5xX2RhdGEtPmZ3X3ZlcnNpb24pOwogCXNjc2lfY21kLT5zY3NpX2RvbmUgPSBkb25lOwogCXJlcyA9IHNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCXNjc2lfY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKQEAgLTMyNDcsNiArMzUwNCwxNSBAQAogCWlmIChwaW5zdGFuY2UtPmlvYV9yZXNldF9pbl9wcm9ncmVzcykKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CiAKKwkvKiBGaXJtd2FyZSBkb2Vzbid0IHN1cHBvcnQgU1lOQ0hST05JWkVfQ0FDSEUgY29tbWFuZCAoMHgzNSksIGNvbXBsZXRlCisJICogdGhlIGNvbW1hbmQgaGVyZSBpdHNlbGYgd2l0aCBzdWNjZXNzIHJldHVybgorCSAqLworCWlmIChzY3NpX2NtZC0+Y21uZFswXSA9PSBTWU5DSFJPTklaRV9DQUNIRSkgeworCQlwbWNyYWlkX2luZm8oIlNZTkNfQ0FDSEUoMHgzNSksIGNvbXBsZXRpbmcgaW4gZHJpdmVyIGl0c2VsZlxuIik7CisJCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBpbml0aWFsaXplIHRoZSBjb21tYW5kIGFuZCBJT0FSQ0IgdG8gYmUgc2VudCB0byBJT0EgKi8KIAljbWQgPSBwbWNyYWlkX2dldF9mcmVlX2NtZChwaW5zdGFuY2UpOwogCkBAIC0zMjYxLDYgKzM1MjcsMTMgQEAKIAlpb2FyY2ItPnJlc291cmNlX2hhbmRsZSA9IHJlcy0+Y2ZnX2VudHJ5LnJlc291cmNlX2hhbmRsZTsKIAlpb2FyY2ItPnJlcXVlc3RfdHlwZSA9IFJFUV9UWVBFX1NDU0k7CiAKKwkvKiBzZXQgaHJycSBudW1iZXIgd2hlcmUgdGhlIElPQSBzaG91bGQgcmVzcG9uZCB0by4gTm90ZSB0aGF0IGFsbCBjbWRzCisJICogZ2VuZXJhdGVkIGludGVybmFsbHkgdXNlcyBocnJxX2lkIDAsIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHRoZSBjbWQKKwkgKiBibG9jayBvZiBzY3NpX2NtZCB3aGljaCBpcyByZS11c2VkIChlLmcuIGNhbmNlbC9hYm9ydCksIHdoaWNoIHVzZXMKKwkgKiBocnJxX2lkIGFzc2lnbmVkIGhlcmUgaW4gcXVldWVjb21tYW5kCisJICovCisJaW9hcmNiLT5ocnJxX2lkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJihwaW5zdGFuY2UtPmxhc3RfbWVzc2FnZV9pZCkpICUKKwkJCSAgcGluc3RhbmNlLT5udW1faHJycTsKIAljbWQtPmNtZF9kb25lID0gcG1jcmFpZF9pb19kb25lOwogCiAJaWYgKFJFU19JU19HU0NTSShyZXMtPmNmZ19lbnRyeSkgfHwgUkVTX0lTX1ZTRVQocmVzLT5jZmdfZW50cnkpKSB7CkBAIC0zMjg3LDcgKzM1NjAsOSBAQAogCQkgICAgIFJFU19JU19WU0VUKHJlcy0+Y2ZnX2VudHJ5KSA/IFBNQ1JBSURfVlNFVF9CVVNfSUQgOgogCQkJUE1DUkFJRF9QSFlTX0JVU19JRCwKIAkJICAgICBSRVNfSVNfVlNFVChyZXMtPmNmZ19lbnRyeSkgPwotCQkJcmVzLT5jZmdfZW50cnkudW5pcXVlX2ZsYWdzMSA6CisJCQkoZndfdmVyc2lvbiA8PSBQTUNSQUlEX0ZXX1ZFUlNJT05fMSA/CisJCQkJcmVzLT5jZmdfZW50cnkudW5pcXVlX2ZsYWdzMSA6CisJCQkJCXJlcy0+Y2ZnX2VudHJ5LmFycmF5X2lkICYgMHhGRikgOgogCQkJUkVTX1RBUkdFVChyZXMtPmNmZ19lbnRyeS5yZXNvdXJjZV9hZGRyZXNzKSwKIAkJICAgICBSRVNfTFVOKHJlcy0+Y2ZnX2VudHJ5LnJlc291cmNlX2FkZHJlc3MpKTsKIApAQCAtMzMyNCw4ICszNTk5LDcgQEAKICAqLwogc3RhdGljIGludCBwbWNyYWlkX2Nocl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKIHsKLQlzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlID0KLQkJKChzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqKWZpbGVwLT5wcml2YXRlX2RhdGEpOworCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwogCiAJZmlsZXAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAJZmFzeW5jX2hlbHBlcigtMSwgZmlsZXAsIDAsICZwaW5zdGFuY2UtPmFlbl9xdWV1ZSk7CkBAIC0zMzQ0LDcgKzM2MTgsNyBAQAogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2U7CiAJaW50IHJjOwogCi0JcGluc3RhbmNlID0gKHN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICopZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlwaW5zdGFuY2UgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwogCW11dGV4X2xvY2soJnBpbnN0YW5jZS0+YWVuX3F1ZXVlX2xvY2spOwogCXJjID0gZmFzeW5jX2hlbHBlcihmZCwgZmlsZXAsIG1vZGUsICZwaW5zdGFuY2UtPmFlbl9xdWV1ZSk7CiAJbXV0ZXhfdW5sb2NrKCZwaW5zdGFuY2UtPmFlbl9xdWV1ZV9sb2NrKTsKQEAgLTM0NjUsNiArMzczOSw3IEBACiAJdW5zaWduZWQgbG9uZyByZXF1ZXN0X2J1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIHJlcXVlc3Rfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwl1MzIgaW9hc2M7CiAJaW50IHJlcXVlc3Rfc2l6ZTsKIAlpbnQgYnVmZmVyX3NpemU7CiAJdTggYWNjZXNzLCBkaXJlY3Rpb247CkBAIC0zNTY2LDYgKzM4NDEsMTQgQEAKIAkJCWJ1ZmZlci0+aW9hcmNiLmFkZF9jbWRfcGFyYW1fbGVuZ3RoKTsKIAl9CiAKKwkvKiBzZXQgaHJycSBudW1iZXIgd2hlcmUgdGhlIElPQSBzaG91bGQgcmVzcG9uZCB0by4gTm90ZSB0aGF0IGFsbCBjbWRzCisJICogZ2VuZXJhdGVkIGludGVybmFsbHkgdXNlcyBocnJxX2lkIDAsIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHRoZSBjbWQKKwkgKiBibG9jayBvZiBzY3NpX2NtZCB3aGljaCBpcyByZS11c2VkIChlLmcuIGNhbmNlbC9hYm9ydCksIHdoaWNoIHVzZXMKKwkgKiBocnJxX2lkIGFzc2lnbmVkIGhlcmUgaW4gcXVldWVjb21tYW5kCisJICovCisJaW9hcmNiLT5ocnJxX2lkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJihwaW5zdGFuY2UtPmxhc3RfbWVzc2FnZV9pZCkpICUKKwkJCSAgcGluc3RhbmNlLT5udW1faHJycTsKKwogCWlmIChyZXF1ZXN0X3NpemUpIHsKIAkJcmMgPSBwbWNyYWlkX2J1aWxkX3Bhc3N0aHJvdWdoX2lvYWRscyhjbWQsCiAJCQkJCQkgICAgICByZXF1ZXN0X3NpemUsCkBAIC0zNjA2LDYgKzM4ODksMTQgQEAKIAlfcG1jcmFpZF9maXJlX2NvbW1hbmQoY21kKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAorCS8qIE5PVEUgISBSZW1vdmUgdGhlIGJlbG93IGxpbmUgb25jZSBhYm9ydF90YXNrIGlzIGltcGxlbWVudGVkCisJICogaW4gZmlybXdhcmUuIFRoaXMgbGluZSBkaXNhYmxlcyBpb2N0bCBjb21tYW5kIHRpbWVvdXQgaGFuZGxpbmcgbG9naWMKKwkgKiBzaW1pbGFyIHRvIElPIGNvbW1hbmQgdGltZW91dCBoYW5kbGluZywgbWFraW5nIGlvY3RsIGNvbW1hbmRzIHRvIHdhaXQKKwkgKiB1bnRpbCB0aGUgY29tbWFuZCBjb21wbGV0aW9uIHJlZ2FyZGxlc3Mgb2YgdGltZW91dCB2YWx1ZSBzcGVjaWZpZWQgaW4KKwkgKiBpb2FyY2IKKwkgKi8KKwlidWZmZXItPmlvYXJjYi5jbWRfdGltZW91dCA9IDA7CisKIAkvKiBJZiBjb21tYW5kIHRpbWVvdXQgaXMgc3BlY2lmaWVkIHB1dCBjYWxsZXIgdG8gd2FpdCB0aWxsIHRoYXQgdGltZSwKIAkgKiBvdGhlcndpc2UgaXQgd291bGQgYmUgYmxvY2tpbmcgd2FpdC4gSWYgY29tbWFuZCBnZXRzIHRpbWVkIG91dCwgaXQKIAkgKiB3aWxsIGJlIGFib3J0ZWQuCkBAIC0zNjIwLDI1ICszOTExLDQ3IEBACiAJCQlsZTMyX3RvX2NwdShjbWQtPmlvYV9jYi0+aW9hcmNiLnJlc3BvbnNlX2hhbmRsZSA+PiAyKSwKIAkJCWNtZC0+aW9hX2NiLT5pb2FyY2IuY2RiWzBdKTsKIAotCQlyYyA9IC1FVElNRURPVVQ7CiAJCXNwaW5fbG9ja19pcnFzYXZlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAkJY2FuY2VsX2NtZCA9IHBtY3JhaWRfYWJvcnRfY21kKGNtZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocGluc3RhbmNlLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCiAJCWlmIChjYW5jZWxfY21kKSB7CiAJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYW5jZWxfY21kLT53YWl0X2Zvcl9jb21wbGV0aW9uKTsKKwkJCWlvYXNjID0gY2FuY2VsX2NtZC0+aW9hX2NiLT5pb2FzYS5pb2FzYzsKIAkJCXBtY3JhaWRfcmV0dXJuX2NtZChjYW5jZWxfY21kKTsKKworCQkJLyogaWYgYWJvcnQgdGFzayBjb3VsZG4ndCBmaW5kIHRoZSBjb21tYW5kIGkuZSBpdCBnb3QKKwkJCSAqIGNvbXBsZXRlZCBwcmlvciB0byBhYm9ydGluZywgcmV0dXJuIGdvb2QgY29tcGxldGlvbi4KKwkJCSAqIGlmIGNvbW1hbmQgZ290IGFib3J0ZWQgc3VjY2VzZnVsbHkgb3IgdGhlcmUgd2FzIElPQQorCQkJICogcmVzZXQgZHVlIHRvIGFib3J0IHRhc2sgaXRzZWxmIGdldHRpbmcgdGltZWRvdXQgdGhlbgorCQkJICogcmV0dXJuIC1FVElNRURPVVQKKwkJCSAqLworCQkJaWYgKGlvYXNjID09IFBNQ1JBSURfSU9BU0NfSU9BX1dBU19SRVNFVCB8fAorCQkJICAgIFBNQ1JBSURfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA9PSAweDAwKSB7CisJCQkJaWYgKGlvYXNjICE9IFBNQ1JBSURfSU9BU0NfR0NfSU9BUkNCX05PVEZPVU5EKQorCQkJCQlyYyA9IC1FVElNRURPVVQ7CisJCQkJZ290byBvdXRfaGFuZGxlX3Jlc3BvbnNlOworCQkJfQogCQl9CiAKLQkJZ290byBvdXRfZnJlZV9zZ2xpc3Q7CisJCS8qIG5vIGNvbW1hbmQgYmxvY2sgZm9yIGFib3J0IHRhc2sgb3IgYWJvcnQgdGFzayBmYWlsZWQgdG8gYWJvcnQKKwkJICogdGhlIElPQVJDQiwgdGhlbiB3YWl0IGZvciAxNTAgbW9yZSBzZWNvbmRzIGFuZCBpbml0aWF0ZSByZXNldAorCQkgKiBzZXF1ZW5jZSBhZnRlciB0aW1lb3V0CisJCSAqLworCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCSZjbWQtPndhaXRfZm9yX2NvbXBsZXRpb24sCisJCQltc2Vjc190b19qaWZmaWVzKDE1MCAqIDEwMDApKSkgeworCQkJcG1jcmFpZF9yZXNldF9icmluZ3VwKGNtZC0+ZHJ2X2luc3QpOworCQkJcmMgPSAtRVRJTUVET1VUOworCQl9CiAJfQogCitvdXRfaGFuZGxlX3Jlc3BvbnNlOgogCS8qIElmIHRoZSBjb21tYW5kIGZhaWxlZCBmb3IgYW55IHJlYXNvbiwgY29weSBlbnRpcmUgSU9BU0EgYnVmZmVyIGFuZAogCSAqIHJldHVybiBJT0NUTCBzdWNjZXNzLiBJZiBjb3B5aW5nIElPQVNBIHRvIHVzZXItYnVmZmVyIGZhaWxzLCByZXR1cm4KIAkgKiBFRkFVTFQKIAkgKi8KLQlpZiAobGUzMl90b19jcHUoY21kLT5pb2FfY2ItPmlvYXNhLmlvYXNjKSkgewotCisJaWYgKFBNQ1JBSURfSU9BU0NfU0VOU0VfS0VZKGxlMzJfdG9fY3B1KGNtZC0+aW9hX2NiLT5pb2FzYS5pb2FzYykpKSB7CiAJCXZvaWQgKmlvYXNhID0KIAkJICAgICh2b2lkICopKGFyZyArCiAJCSAgICBvZmZzZXRvZihzdHJ1Y3QgcG1jcmFpZF9wYXNzdGhyb3VnaF9pb2N0bF9idWZmZXIsIGlvYXNhKSk7CkBAIC0zNjUxLDYgKzM5NjQsNyBAQAogCQkJcmMgPSAtRUZBVUxUOwogCQl9CiAJfQorCiAJLyogSWYgdGhlIGRhdGEgdHJhbnNmZXIgd2FzIGZyb20gZGV2aWNlLCBjb3B5IHRoZSBkYXRhIG9udG8gdXNlcgogCSAqIGJ1ZmZlcnMKIAkgKi8KQEAgLTM2OTksNyArNDAxMyw3IEBACiAJaW50IHJjID0gLUVOT1NZUzsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1c2VyX2J1ZmZlciwgX0lPQ19TSVpFKGNtZCkpKSB7Ci0JCXBtY3JhaWRfZXJyKCJpb2N0bF9kcml2ZXI6IGFjY2VzcyBmYXVsdCBpbiByZXF1ZXN0IGJ1ZmZlciBcbiIpOworCQlwbWNyYWlkX2VycigiaW9jdGxfZHJpdmVyOiBhY2Nlc3MgZmF1bHQgaW4gcmVxdWVzdCBidWZmZXJcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTM3OTUsNyArNDEwOSw3IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcGluc3RhbmNlID0gKHN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICopZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlwaW5zdGFuY2UgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKCFwaW5zdGFuY2UpIHsKIAkJcG1jcmFpZF9pbmZvKCJhZGFwdGVyIGluc3RhbmNlIGlzIG5vdCBmb3VuZFxuIik7CkBAIC00MDExLDM2ICs0MzI1LDc3IEBACiAJLnByb2NfbmFtZSA9IFBNQ1JBSURfRFJJVkVSX05BTUUKIH07CiAKLS8qKgotICogcG1jcmFpZF9pc3JfY29tbW9uIC0gQ29tbW9uIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKLSAqCi0gKiBAcGluc3RhbmNlOiBwb2ludGVyIHRvIGFkYXB0ZXIgaW5zdGFuY2UKLSAqIEBpbnRyczogYWN0aXZlIGludGVycnVwdHMgKGNvbnRlbnRzIG9mIGlvYV9ob3N0X2ludGVycnVwdCByZWdpc3RlcikKLSAqIEBocnJxX2lkOiBIb3N0IFJSUSBpbmRleAorLyoKKyAqIHBtY3JhaWRfaXNyX21zaXggLSBpbXBsZW1lbnRzIE1TSS1YIGludGVycnVwdCBoYW5kbGluZyByb3V0aW5lCisgKiBAaXJxOiBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlcgorICogQGRldl9pZDogcG9pbnRlciBocnJxX3ZlY3RvcgogICoKICAqIFJldHVybiBWYWx1ZQotICoJbm9uZQorICoJIElSUV9IQU5ETEVEIGlmIGludGVycnVwdCBpcyBoYW5kbGVkIG9yIElSUV9OT05FIGlmIGlnbm9yZWQKICAqLwotc3RhdGljIHZvaWQgcG1jcmFpZF9pc3JfY29tbW9uKAotCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UsCi0JdTMyIGludHJzLAotCWludCBocnJxX2lkCi0pCi17Ci0JdTMyIGludHJzX2NsZWFyID0KLQkJKGludHJzICYgSU5UUlNfQ1JJVElDQUxfT1BfSU5fUFJPR1JFU1MpID8gaW50cnMKLQkJCQkJCQk6IElOVFJTX0hSUlFfVkFMSUQ7Ci0JaW93cml0ZTMyKGludHJzX2NsZWFyLAotCQkgIHBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X2Nscl9yZWcpOwotCWludHJzID0gaW9yZWFkMzIocGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfcmVnKTsKIAotCS8qIGhycnEgdmFsaWQgYml0IHdhcyBzZXQsIHNjaGVkdWxlIHRhc2tsZXQgdG8gaGFuZGxlIHRoZSByZXNwb25zZSAqLwotCWlmIChpbnRyc19jbGVhciA9PSBJTlRSU19IUlJRX1ZBTElEKQotCQl0YXNrbGV0X3NjaGVkdWxlKCYocGluc3RhbmNlLT5pc3JfdGFza2xldFtocnJxX2lkXSkpOworc3RhdGljIGlycXJldHVybl90IHBtY3JhaWRfaXNyX21zaXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwbWNyYWlkX2lzcl9wYXJhbSAqaHJycV92ZWN0b3I7CisJc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJdTMyIGludHJzX3ZhbDsKKwlpbnQgaHJycV9pZDsKKworCWhycnFfdmVjdG9yID0gKHN0cnVjdCBwbWNyYWlkX2lzcl9wYXJhbSAqKWRldl9pZDsKKwlocnJxX2lkID0gaHJycV92ZWN0b3ItPmhycnFfaWQ7CisJcGluc3RhbmNlID0gaHJycV92ZWN0b3ItPmRydl9pbnN0OworCisJaWYgKCFocnJxX2lkKSB7CisJCS8qIFJlYWQgdGhlIGludGVycnVwdCAqLworCQlpbnRyc192YWwgPSBwbWNyYWlkX3JlYWRfaW50ZXJydXB0cyhwaW5zdGFuY2UpOworCQlpZiAoaW50cnNfdmFsICYmCisJCQkoKGlvcmVhZDMyKHBpbnN0YW5jZS0+aW50X3JlZ3MuaG9zdF9pb2FfaW50ZXJydXB0X3JlZykKKwkJCSYgRE9PUkJFTExfSU5UUl9NU0lYX0NMUikgPT0gMCkpIHsKKwkJCS8qIEFueSBlcnJvciBpbnRlcnJ1cHRzIGluY2x1ZGluZyB1bml0X2NoZWNrLAorCQkJICogaW5pdGlhdGUgSU9BIHJlc2V0LkluIGNhc2Ugb2YgdW5pdCBjaGVjayBpbmRpY2F0ZQorCQkJICogdG8gcmVzZXRfc2VxdWVuY2UgdGhhdCBJT0EgdW5pdCBjaGVja2VkIGFuZCBwcmVwYXJlCisJCQkgKiBmb3IgYSBkdW1wIGR1cmluZyByZXNldCBzZXF1ZW5jZQorCQkJICovCisJCQlpZiAoaW50cnNfdmFsICYgUE1DUkFJRF9FUlJPUl9JTlRFUlJVUFRTKSB7CisJCQkJaWYgKGludHJzX3ZhbCAmIElOVFJTX0lPQV9VTklUX0NIRUNLKQorCQkJCQlwaW5zdGFuY2UtPmlvYV91bml0X2NoZWNrID0gMTsKKworCQkJCXBtY3JhaWRfZXJyKCJJU1I6IGVycm9yIGludGVycnVwdHM6ICV4IFwKKwkJCQkJaW5pdGlhdGluZyByZXNldFxuIiwgaW50cnNfdmFsKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywKKwkJCQkJbG9ja19mbGFncyk7CisJCQkJcG1jcmFpZF9pbml0aWF0ZV9yZXNldChwaW5zdGFuY2UpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkJCXBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLAorCQkJCQlsb2NrX2ZsYWdzKTsKKwkJCX0KKwkJCS8qIElmIGludGVycnVwdCB3YXMgYXMgcGFydCBvZiB0aGUgaW9hIGluaXRpYWxpemF0aW9uLAorCQkJICogY2xlYXIgaXQuIERlbGV0ZSB0aGUgdGltZXIgYW5kIHdha2V1cCB0aGUKKwkJCSAqIHJlc2V0IGVuZ2luZSB0byBwcm9jZWVkIHdpdGggcmVzZXQgc2VxdWVuY2UKKwkJCSAqLworCQkJaWYgKGludHJzX3ZhbCAmIElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwpCisJCQkJcG1jcmFpZF9jbHJfdHJhbnNfb3AocGluc3RhbmNlKTsKKworCQkJLyogQ2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlciBieSB3cml0aW5nCisJCQkgKiB0byBob3N0IHRvIGlvYSBkb29yYmVsbC4gT25jZSBkb25lCisJCQkgKiBGVyB3aWxsIGNsZWFyIHRoZSBpbnRlcnJ1cHQuCisJCQkgKi8KKwkJCWlvd3JpdGUzMihET09SQkVMTF9JTlRSX01TSVhfQ0xSLAorCQkJCXBpbnN0YW5jZS0+aW50X3JlZ3MuaG9zdF9pb2FfaW50ZXJydXB0X3JlZyk7CisJCQlpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmhvc3RfaW9hX2ludGVycnVwdF9yZWcpOworCisKKwkJfQorCX0KKworCXRhc2tsZXRfc2NoZWR1bGUoJihwaW5zdGFuY2UtPmlzcl90YXNrbGV0W2hycnFfaWRdKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIC8qKgotICogcG1jcmFpZF9pc3IgIC0gaW1wbGVtZW50cyBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZQorICogcG1jcmFpZF9pc3IgIC0gaW1wbGVtZW50cyBsZWdhY3kgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmUKICAqCiAgKiBAaXJxOiBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlcgogICogQGRldl9pZDogcG9pbnRlciBocnJxX3ZlY3RvcgpAQCAtNDA1Miw4ICs0NDA3LDkgQEAKIHsKIAlzdHJ1Y3QgcG1jcmFpZF9pc3JfcGFyYW0gKmhycnFfdmVjdG9yOwogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2U7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCXUzMiBpbnRyczsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJaW50IGhycnFfaWQgPSAwOwogCiAJLyogSW4gY2FzZSBvZiBsZWdhY3kgaW50ZXJydXB0IG1vZGUgd2hlcmUgaW50ZXJydXB0cyBhcmUgc2hhcmVkIGFjcm9zcwogCSAqIGlzcnMsIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IHRoZSBjdXJyZW50IGludGVycnVwdCBpcyBub3QgZnJvbSBJT0EKQEAgLTQwNjIsMjEgKzQ0MTgsMTMgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogTlVMTCBob3N0IHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KLQogCWhycnFfdmVjdG9yID0gKHN0cnVjdCBwbWNyYWlkX2lzcl9wYXJhbSAqKWRldl9pZDsKIAlwaW5zdGFuY2UgPSBocnJxX3ZlY3Rvci0+ZHJ2X2luc3Q7CiAKLQkvKiBBY3F1aXJlIHRoZSBsb2NrIChjdXJyZW50bHkgaG9zdF9sb2NrKSB3aGlsZSBwcm9jZXNzaW5nIGludGVycnVwdHMuCi0JICogVGhpcyBpbnRlcnZhbCBpcyBzbWFsbCBhcyBtb3N0IG9mIHRoZSByZXNwb25zZSBwcm9jZXNzaW5nIGlzIGRvbmUgYnkKLQkgKiB0YXNrbGV0IHdpdGhvdXQgdGhlIGxvY2suCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUocGluc3RhbmNlLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCWludHJzID0gcG1jcmFpZF9yZWFkX2ludGVycnVwdHMocGluc3RhbmNlKTsKIAotCWlmICh1bmxpa2VseSgoaW50cnMgJiBQTUNSQUlEX1BDSV9JTlRFUlJVUFRTKSA9PSAwKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlpZiAodW5saWtlbHkoKGludHJzICYgUE1DUkFJRF9QQ0lfSU5URVJSVVBUUykgPT0gMCkpCiAJCXJldHVybiBJUlFfTk9ORTsKLQl9CiAKIAkvKiBBbnkgZXJyb3IgaW50ZXJydXB0cyBpbmNsdWRpbmcgdW5pdF9jaGVjaywgaW5pdGlhdGUgSU9BIHJlc2V0LgogCSAqIEluIGNhc2Ugb2YgdW5pdCBjaGVjayBpbmRpY2F0ZSB0byByZXNldF9zZXF1ZW5jZSB0aGF0IElPQSB1bml0CkBAIC00MDkxLDEzICs0NDM5LDI4IEBACiAJCQkgIHBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X2Nscl9yZWcpOwogCQlwbWNyYWlkX2VycigiSVNSOiBlcnJvciBpbnRlcnJ1cHRzOiAleCBpbml0aWF0aW5nIHJlc2V0XG4iLAogCQkJICAgIGludHJzKTsKLQkJaW50cnMgPSBpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9yZWcpOworCQlpbnRycyA9IGlvcmVhZDMyKAorCQkJCXBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X2Nscl9yZWcpOworCQlzcGluX2xvY2tfaXJxc2F2ZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJCXBtY3JhaWRfaW5pdGlhdGVfcmVzZXQocGluc3RhbmNlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJfSBlbHNlIHsKLQkJcG1jcmFpZF9pc3JfY29tbW9uKHBpbnN0YW5jZSwgaW50cnMsIGhycnFfdmVjdG9yLT5ocnJxX2lkKTsKLQl9CisJCS8qIElmIGludGVycnVwdCB3YXMgYXMgcGFydCBvZiB0aGUgaW9hIGluaXRpYWxpemF0aW9uLAorCQkgKiBjbGVhci4gRGVsZXRlIHRoZSB0aW1lciBhbmQgd2FrZXVwIHRoZQorCQkgKiByZXNldCBlbmdpbmUgdG8gcHJvY2VlZCB3aXRoIHJlc2V0IHNlcXVlbmNlCisJCSAqLworCQlpZiAoaW50cnMgJiBJTlRSU19UUkFOU0lUSU9OX1RPX09QRVJBVElPTkFMKSB7CisJCQlwbWNyYWlkX2Nscl90cmFuc19vcChwaW5zdGFuY2UpOworCQl9IGVsc2UgeworCQkJaW93cml0ZTMyKGludHJzLAorCQkJCXBpbnN0YW5jZS0+aW50X3JlZ3MuaW9hX2hvc3RfaW50ZXJydXB0X2Nscl9yZWcpOworCQkJaW9yZWFkMzIoCisJCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfY2xyX3JlZyk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoCisJCQkJCSYocGluc3RhbmNlLT5pc3JfdGFza2xldFtocnJxX2lkXSkpOworCQl9CisJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNDEyMCw2ICs0NDgzLDcgQEAKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcgaG9zdF9sb2NrX2ZsYWdzOworCXUxNiBmd192ZXJzaW9uOwogCXU4IGJ1cywgdGFyZ2V0LCBsdW47CiAKIAlwaW5zdGFuY2UgPSBjb250YWluZXJfb2Yod29ya3AsIHN0cnVjdCBwbWNyYWlkX2luc3RhbmNlLCB3b3JrZXJfcSk7CkBAIC00MTI3LDYgKzQ0OTEsOCBAQAogCWlmICghYXRvbWljX3JlYWQoJnBpbnN0YW5jZS0+ZXhwb3NlX3Jlc291cmNlcykpCiAJCXJldHVybjsKIAorCWZ3X3ZlcnNpb24gPSBiZTE2X3RvX2NwdShwaW5zdGFuY2UtPmlucV9kYXRhLT5md192ZXJzaW9uKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5zdGFuY2UtPnJlc291cmNlX2xvY2ssIGxvY2tfZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIHRlbXAsICZwaW5zdGFuY2UtPnVzZWRfcmVzX3EsIHF1ZXVlKSB7CiAKQEAgLTQxNjYsMTIgKzQ1MzIsMTYgQEAKIAogCQlpZiAocmVzLT5jaGFuZ2VfZGV0ZWN0ZWQgPT0gUkVTX0NIQU5HRV9BREQpIHsKIAotCQkJaWYgKCFwbWNyYWlkX2V4cG9zZV9yZXNvdXJjZSgmcmVzLT5jZmdfZW50cnkpKQorCQkJaWYgKCFwbWNyYWlkX2V4cG9zZV9yZXNvdXJjZShmd192ZXJzaW9uLAorCQkJCQkJICAgICAmcmVzLT5jZmdfZW50cnkpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoUkVTX0lTX1ZTRVQocmVzLT5jZmdfZW50cnkpKSB7CiAJCQkJYnVzID0gUE1DUkFJRF9WU0VUX0JVU19JRDsKLQkJCQl0YXJnZXQgPSByZXMtPmNmZ19lbnRyeS51bmlxdWVfZmxhZ3MxOworCQkJCWlmIChmd192ZXJzaW9uIDw9IFBNQ1JBSURfRldfVkVSU0lPTl8xKQorCQkJCQl0YXJnZXQgPSByZXMtPmNmZ19lbnRyeS51bmlxdWVfZmxhZ3MxOworCQkJCWVsc2UKKwkJCQkJdGFyZ2V0ID0gcmVzLT5jZmdfZW50cnkuYXJyYXlfaWQgJiAweEZGOwogCQkJCWx1biA9IFBNQ1JBSURfVlNFVF9MVU5fSUQ7CiAJCQl9IGVsc2UgewogCQkJCWJ1cyA9IFBNQ1JBSURfUEhZU19CVVNfSUQ7CkBAIC00MjAxLDcgKzQ1NzEsNyBAQAogICogUmV0dXJuIFZhbHVlCiAgKglOb25lCiAgKi8KLXZvaWQgcG1jcmFpZF90YXNrbGV0X2Z1bmN0aW9uKHVuc2lnbmVkIGxvbmcgaW5zdGFuY2UpCitzdGF0aWMgdm9pZCBwbWNyYWlkX3Rhc2tsZXRfZnVuY3Rpb24odW5zaWduZWQgbG9uZyBpbnN0YW5jZSkKIHsKIAlzdHJ1Y3QgcG1jcmFpZF9pc3JfcGFyYW0gKmhycnFfdmVjdG9yOwogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2U7CkBAIC00MjEwLDM1ICs0NTgwLDEyIEBACiAJdW5zaWduZWQgbG9uZyBob3N0X2xvY2tfZmxhZ3M7CiAJc3BpbmxvY2tfdCAqbG9ja3A7IC8qIGhycnEgYnVmZmVyIGxvY2sgKi8KIAlpbnQgaWQ7Ci0JdTMyIGludHJzOwogCV9fbGUzMiByZXNwOwogCiAJaHJycV92ZWN0b3IgPSAoc3RydWN0IHBtY3JhaWRfaXNyX3BhcmFtICopaW5zdGFuY2U7CiAJcGluc3RhbmNlID0gaHJycV92ZWN0b3ItPmRydl9pbnN0OwogCWlkID0gaHJycV92ZWN0b3ItPmhycnFfaWQ7CiAJbG9ja3AgPSAmKHBpbnN0YW5jZS0+aHJycV9sb2NrW2lkXSk7Ci0JaW50cnMgPSBwbWNyYWlkX3JlYWRfaW50ZXJydXB0cyhwaW5zdGFuY2UpOwotCi0JLyogSWYgaW50ZXJydXB0cyB3YXMgYXMgcGFydCBvZiB0aGUgaW9hIGluaXRpYWxpemF0aW9uLCBjbGVhciBhbmQgbWFzawotCSAqIGl0LiBEZWxldGUgdGhlIHRpbWVyIGFuZCB3YWtldXAgdGhlIHJlc2V0IGVuZ2luZSB0byBwcm9jZWVkIHdpdGgKLQkgKiByZXNldCBzZXF1ZW5jZQotCSAqLwotCWlmIChpbnRycyAmIElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwpIHsKLQkJaW93cml0ZTMyKElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwsCi0JCQlwaW5zdGFuY2UtPmludF9yZWdzLmlvYV9ob3N0X2ludGVycnVwdF9tYXNrX3JlZyk7Ci0JCWlvd3JpdGUzMihJTlRSU19UUkFOU0lUSU9OX1RPX09QRVJBVElPTkFMLAotCQkJcGluc3RhbmNlLT5pbnRfcmVncy5pb2FfaG9zdF9pbnRlcnJ1cHRfY2xyX3JlZyk7Ci0KLQkJaWYgKHBpbnN0YW5jZS0+cmVzZXRfY21kICE9IE5VTEwpIHsKLQkJCWRlbF90aW1lcigmcGluc3RhbmNlLT5yZXNldF9jbWQtPnRpbWVyKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLAotCQkJCQkgIGhvc3RfbG9ja19mbGFncyk7Ci0JCQlwaW5zdGFuY2UtPnJlc2V0X2NtZC0+Y21kX2RvbmUocGluc3RhbmNlLT5yZXNldF9jbWQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywKLQkJCQkJICAgICAgIGhvc3RfbG9ja19mbGFncyk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KIAogCS8qIGxvb3AgdGhyb3VnaCBlYWNoIG9mIHRoZSBjb21tYW5kcyByZXNwb25kZWQgYnkgSU9BLiBFYWNoIEhSUlEgYnVmIGlzCiAJICogcHJvdGVjdGVkIGJ5IGl0cyBvd24gbG9jay4gVHJhdmVyc2FscyBtdXN0IGJlIGRvbmUgd2l0aGluIHRoaXMgbG9jawpAQCAtNDI1NiwyNyArNDYwMyw2IEBACiAJCWludCBjbWRfaW5kZXggPSByZXNwID4+IDI7CiAJCXN0cnVjdCBwbWNyYWlkX2NtZCAqY21kID0gTlVMTDsKIAotCQlpZiAoY21kX2luZGV4IDwgUE1DUkFJRF9NQVhfQ01EKSB7Ci0JCQljbWQgPSBwaW5zdGFuY2UtPmNtZF9saXN0W2NtZF9pbmRleF07Ci0JCX0gZWxzZSB7Ci0JCQkvKiBJbiBjYXNlIG9mIGludmFsaWQgcmVzcG9uc2UgaGFuZGxlLCBpbml0aWF0ZSBJT0EKLQkJCSAqIHJlc2V0IHNlcXVlbmNlLgotCQkJICovCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2twLCBocnJxX2xvY2tfZmxhZ3MpOwotCi0JCQlwbWNyYWlkX2VycigiSW52YWxpZCByZXNwb25zZSAlZCBpbml0aWF0aW5nIHJlc2V0XG4iLAotCQkJCSAgICBjbWRfaW5kZXgpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywKLQkJCQkJICBob3N0X2xvY2tfZmxhZ3MpOwotCQkJcG1jcmFpZF9pbml0aWF0ZV9yZXNldChwaW5zdGFuY2UpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwaW5zdGFuY2UtPmhvc3QtPmhvc3RfbG9jaywKLQkJCQkJICAgICAgIGhvc3RfbG9ja19mbGFncyk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKGxvY2twLCBocnJxX2xvY2tfZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQogCQlpZiAocGluc3RhbmNlLT5ocnJxX2N1cnJbaWRdIDwgcGluc3RhbmNlLT5ocnJxX2VuZFtpZF0pIHsKIAkJCXBpbnN0YW5jZS0+aHJycV9jdXJyW2lkXSsrOwogCQl9IGVsc2UgewpAQCAtNDI4NCw2ICs0NjEwLDE0IEBACiAJCQlwaW5zdGFuY2UtPmhvc3RfdG9nZ2xlX2JpdFtpZF0gXj0gMXU7CiAJCX0KIAorCQlpZiAoY21kX2luZGV4ID49IFBNQ1JBSURfTUFYX0NNRCkgeworCQkJLyogSW4gY2FzZSBvZiBpbnZhbGlkIHJlc3BvbnNlIGhhbmRsZSwgbG9nIG1lc3NhZ2UgKi8KKwkJCXBtY3JhaWRfZXJyKCJJbnZhbGlkIHJlc3BvbnNlIGhhbmRsZSAlZFxuIiwgY21kX2luZGV4KTsKKwkJCXJlc3AgPSBsZTMyX3RvX2NwdSgqKHBpbnN0YW5jZS0+aHJycV9jdXJyW2lkXSkpOworCQkJY29udGludWU7CisJCX0KKworCQljbWQgPSBwaW5zdGFuY2UtPmNtZF9saXN0W2NtZF9pbmRleF07CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja3AsIGhycnFfbG9ja19mbGFncyk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBpbnN0YW5jZS0+cGVuZGluZ19wb29sX2xvY2ssCkBAIC00MzI0LDcgKzQ2NTgsMTYgQEAKIHN0YXRpYwogdm9pZCBwbWNyYWlkX3VucmVnaXN0ZXJfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSkKIHsKLQlmcmVlX2lycShwaW5zdGFuY2UtPnBkZXYtPmlycSwgJihwaW5zdGFuY2UtPmhycnFfdmVjdG9yWzBdKSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGluc3RhbmNlLT5udW1faHJycTsgaSsrKQorCQlmcmVlX2lycShwaW5zdGFuY2UtPmhycnFfdmVjdG9yW2ldLnZlY3RvciwKKwkJCSAmKHBpbnN0YW5jZS0+aHJycV92ZWN0b3JbaV0pKTsKKworCWlmIChwaW5zdGFuY2UtPmludGVycnVwdF9tb2RlKSB7CisJCXBjaV9kaXNhYmxlX21zaXgocGluc3RhbmNlLT5wZGV2KTsKKwkJcGluc3RhbmNlLT5pbnRlcnJ1cHRfbW9kZSA9IDA7CisJfQogfQogCiAvKioKQEAgLTQzMzcsMTQgKzQ2ODAsNzAgQEAKIHN0YXRpYyBpbnQKIHBtY3JhaWRfcmVnaXN0ZXJfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSkKIHsKKwlpbnQgcmM7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwaW5zdGFuY2UtPnBkZXY7CiAKKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKSB7CisJCWludCBudW1faHJycSA9IFBNQ1JBSURfTlVNX01TSVhfVkVDVE9SUzsKKwkJc3RydWN0IG1zaXhfZW50cnkgZW50cmllc1tQTUNSQUlEX05VTV9NU0lYX1ZFQ1RPUlNdOworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFBNQ1JBSURfTlVNX01TSVhfVkVDVE9SUzsgaSsrKQorCQkJZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwkJcmMgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgZW50cmllcywgbnVtX2hycnEpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBwbWNyYWlkX2lzcl9sZWdhY3k7CisKKwkJLyogQ2hlY2sgaG93IG1hbnkgTVNJWCB2ZWN0b3JzIGFyZSBhbGxvY2F0ZWQgYW5kIHJlZ2lzdGVyCisJCSAqIG1zaS14IGhhbmRsZXJzIGZvciBlYWNoIG9mIHRoZW0gZ2l2aW5nIGFwcHJvcHJpYXRlIGJ1ZmZlcgorCQkgKi8KKwkJaWYgKHJjID4gMCkgeworCQkJbnVtX2hycnEgPSByYzsKKwkJCWlmIChwY2lfZW5hYmxlX21zaXgocGRldiwgZW50cmllcywgbnVtX2hycnEpKQorCQkJCWdvdG8gcG1jcmFpZF9pc3JfbGVnYWN5OworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9ocnJxOyBpKyspIHsKKwkJCXBpbnN0YW5jZS0+aHJycV92ZWN0b3JbaV0uaHJycV9pZCA9IGk7CisJCQlwaW5zdGFuY2UtPmhycnFfdmVjdG9yW2ldLmRydl9pbnN0ID0gcGluc3RhbmNlOworCQkJcGluc3RhbmNlLT5ocnJxX3ZlY3RvcltpXS52ZWN0b3IgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwkJCXJjID0gcmVxdWVzdF9pcnEocGluc3RhbmNlLT5ocnJxX3ZlY3RvcltpXS52ZWN0b3IsCisJCQkJCXBtY3JhaWRfaXNyX21zaXgsIDAsCisJCQkJCVBNQ1JBSURfRFJJVkVSX05BTUUsCisJCQkJCSYocGluc3RhbmNlLT5ocnJxX3ZlY3RvcltpXSkpOworCisJCQlpZiAocmMpIHsKKwkJCQlpbnQgajsKKwkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCQlmcmVlX2lycShlbnRyaWVzW2pdLnZlY3RvciwKKwkJCQkJCSAmKHBpbnN0YW5jZS0+aHJycV92ZWN0b3Jbal0pKTsKKwkJCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOworCQkJCWdvdG8gcG1jcmFpZF9pc3JfbGVnYWN5OworCQkJfQorCQl9CisKKwkJcGluc3RhbmNlLT5udW1faHJycSA9IG51bV9ocnJxOworCQlwaW5zdGFuY2UtPmludGVycnVwdF9tb2RlID0gMTsKKwkJaW93cml0ZTMyKERPT1JCRUxMX0lOVFJfTU9ERV9NU0lYLAorCQkJICBwaW5zdGFuY2UtPmludF9yZWdzLmhvc3RfaW9hX2ludGVycnVwdF9yZWcpOworCQlpb3JlYWQzMihwaW5zdGFuY2UtPmludF9yZWdzLmhvc3RfaW9hX2ludGVycnVwdF9yZWcpOworCQlnb3RvIHBtY3JhaWRfaXNyX291dDsKKwl9CisKK3BtY3JhaWRfaXNyX2xlZ2FjeToKKwkvKiBJZiBNU0ktWCByZWdpc3RyYXRpb24gZmFpbGVkIGZhbGxiYWNrIHRvIGxlZ2FjeSBtb2RlLCB3aGVyZQorCSAqIG9ubHkgb25lIGhycnEgZW50cnkgd2lsbCBiZSB1c2VkCisJICovCiAJcGluc3RhbmNlLT5ocnJxX3ZlY3RvclswXS5ocnJxX2lkID0gMDsKIAlwaW5zdGFuY2UtPmhycnFfdmVjdG9yWzBdLmRydl9pbnN0ID0gcGluc3RhbmNlOwotCXBpbnN0YW5jZS0+aHJycV92ZWN0b3JbMF0udmVjdG9yID0gMDsKKwlwaW5zdGFuY2UtPmhycnFfdmVjdG9yWzBdLnZlY3RvciA9IHBkZXYtPmlycTsKIAlwaW5zdGFuY2UtPm51bV9ocnJxID0gMTsKLQlyZXR1cm4gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBwbWNyYWlkX2lzciwgSVJRRl9TSEFSRUQsCi0JCQkgICBQTUNSQUlEX0RSSVZFUl9OQU1FLCAmcGluc3RhbmNlLT5ocnJxX3ZlY3RvclswXSk7CisJcmMgPSAwOworCisJcmMgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBtY3JhaWRfaXNyLCBJUlFGX1NIQVJFRCwKKwkJCSBQTUNSQUlEX0RSSVZFUl9OQU1FLCAmcGluc3RhbmNlLT5ocnJxX3ZlY3RvclswXSk7CitwbWNyYWlkX2lzcl9vdXQ6CisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTQ1MTYsMTIgKzQ5MTUsMTEgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBwbWNyYWlkX2FsbG9jYXRlX2hvc3RfcnJxcyhzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlKQogewotCWludCBpOwotCWludCBidWZfY291bnQgPSBQTUNSQUlEX01BWF9DTUQgLyBwaW5zdGFuY2UtPm51bV9ocnJxOworCWludCBpLCBidWZmZXJfc2l6ZTsKKworCWJ1ZmZlcl9zaXplID0gSFJSUV9FTlRSWV9TSVpFICogUE1DUkFJRF9NQVhfQ01EOwogCiAJZm9yIChpID0gMDsgaSA8IHBpbnN0YW5jZS0+bnVtX2hycnE7IGkrKykgewotCQlpbnQgYnVmZmVyX3NpemUgPSBIUlJRX0VOVFJZX1NJWkUgKiBidWZfY291bnQ7Ci0KIAkJcGluc3RhbmNlLT5ocnJxX3N0YXJ0W2ldID0KIAkJCXBjaV9hbGxvY19jb25zaXN0ZW50KAogCQkJCQlwaW5zdGFuY2UtPnBkZXYsCkBAIC00NTI5LDcgKzQ5MjcsOCBAQAogCQkJCQkmKHBpbnN0YW5jZS0+aHJycV9zdGFydF9idXNfYWRkcltpXSkpOwogCiAJCWlmIChwaW5zdGFuY2UtPmhycnFfc3RhcnRbaV0gPT0gMCkgewotCQkJcG1jcmFpZF9lcnIoImNvdWxkIG5vdCBhbGxvY2F0ZSBob3N0IHJycTogJWRcbiIsIGkpOworCQkJcG1jcmFpZF9lcnIoInBjaV9hbGxvYyBmYWlsZWQgZm9yIGhycnEgdmVjdG9yIDogJWRcbiIsCisJCQkJICAgIGkpOwogCQkJcG1jcmFpZF9yZWxlYXNlX2hvc3RfcnJxcyhwaW5zdGFuY2UsIGkpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTQ1MzcsNyArNDkzNiw3IEBACiAJCW1lbXNldChwaW5zdGFuY2UtPmhycnFfc3RhcnRbaV0sIDAsIGJ1ZmZlcl9zaXplKTsKIAkJcGluc3RhbmNlLT5ocnJxX2N1cnJbaV0gPSBwaW5zdGFuY2UtPmhycnFfc3RhcnRbaV07CiAJCXBpbnN0YW5jZS0+aHJycV9lbmRbaV0gPQotCQkJcGluc3RhbmNlLT5ocnJxX3N0YXJ0W2ldICsgYnVmX2NvdW50IC0gMTsKKwkJCXBpbnN0YW5jZS0+aHJycV9zdGFydFtpXSArIFBNQ1JBSURfTUFYX0NNRCAtIDE7CiAJCXBpbnN0YW5jZS0+aG9zdF90b2dnbGVfYml0W2ldID0gMTsKIAkJc3Bpbl9sb2NrX2luaXQoJnBpbnN0YW5jZS0+aHJycV9sb2NrW2ldKTsKIAl9CkBAIC00NTU3LDcgKzQ5NTYsNyBAQAogCWlmIChwaW5zdGFuY2UtPmNjbi5tc2cgIT0gTlVMTCkgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBpbnN0YW5jZS0+cGRldiwKIAkJCQkgICAgUE1DUkFJRF9BRU5fSERSX1NJWkUgKwotCQkJCSAgICBzaXplb2Yoc3RydWN0IHBtY3JhaWRfaGNhbV9jY24pLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHBtY3JhaWRfaGNhbV9jY25fZXh0KSwKIAkJCQkgICAgcGluc3RhbmNlLT5jY24ubXNnLAogCQkJCSAgICBwaW5zdGFuY2UtPmNjbi5iYWRkcik7CiAKQEAgLTQ1OTEsNyArNDk5MCw3IEBACiAJcGluc3RhbmNlLT5jY24ubXNnID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoCiAJCQkJCXBpbnN0YW5jZS0+cGRldiwKIAkJCQkJUE1DUkFJRF9BRU5fSERSX1NJWkUgKwotCQkJCQlzaXplb2Yoc3RydWN0IHBtY3JhaWRfaGNhbV9jY24pLAorCQkJCQlzaXplb2Yoc3RydWN0IHBtY3JhaWRfaGNhbV9jY25fZXh0KSwKIAkJCQkJJihwaW5zdGFuY2UtPmNjbi5iYWRkcikpOwogCiAJcGluc3RhbmNlLT5sZG4ubXNnID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoCkBAIC00NzI0LDYgKzUxMjMsMzIgQEAKIH0KIAogLyoqCisgKiBwbWNyYWlkX3JlbGVhc2VfYnVmZmVycyAtIHJlbGVhc2UgcGVyLWFkYXB0ZXIgYnVmZmVycyBhbGxvY2F0ZWQKKyAqCisgKiBAcGluc3RhbmNlOiBwb2ludGVyIHRvIGFkYXB0ZXIgc29mdCBzdGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZQorICoJbm9uZQorICovCitzdGF0aWMgdm9pZCBwbWNyYWlkX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlKQoreworCXBtY3JhaWRfcmVsZWFzZV9jb25maWdfYnVmZmVycyhwaW5zdGFuY2UpOworCXBtY3JhaWRfcmVsZWFzZV9jb250cm9sX2Jsb2NrcyhwaW5zdGFuY2UsIFBNQ1JBSURfTUFYX0NNRCk7CisJcG1jcmFpZF9yZWxlYXNlX2NtZF9ibG9ja3MocGluc3RhbmNlLCBQTUNSQUlEX01BWF9DTUQpOworCXBtY3JhaWRfcmVsZWFzZV9ob3N0X3JycXMocGluc3RhbmNlLCBwaW5zdGFuY2UtPm51bV9ocnJxKTsKKworCWlmIChwaW5zdGFuY2UtPmlucV9kYXRhICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwaW5zdGFuY2UtPnBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcG1jcmFpZF9pbnF1aXJ5X2RhdGEpLAorCQkJCSAgICBwaW5zdGFuY2UtPmlucV9kYXRhLAorCQkJCSAgICBwaW5zdGFuY2UtPmlucV9kYXRhX2JhZGRyKTsKKworCQlwaW5zdGFuY2UtPmlucV9kYXRhID0gTlVMTDsKKwkJcGluc3RhbmNlLT5pbnFfZGF0YV9iYWRkciA9IDA7CisJfQorfQorCisvKioKICAqIHBtY3JhaWRfaW5pdF9idWZmZXJzIC0gYWxsb2NhdGVzIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZXMgdmFyaW91cyBzdHJ1Y3R1cmVzCiAgKiBAcGluc3RhbmNlOiBwb2ludGVyIHRvIHBlciBhZGFwdGVyIGluc3RhbmNlIHN0cnVjdHVyZQogICoKQEAgLTQ3NTMsMjAgKzUxNzgsMzIgQEAKIAl9CiAKIAlpZiAocG1jcmFpZF9hbGxvY2F0ZV9jbWRfYmxvY2tzKHBpbnN0YW5jZSkpIHsKLQkJcG1jcmFpZF9lcnIoImNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY21kIGJsb2NrcyBcbiIpOworCQlwbWNyYWlkX2VycigiY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjbWQgYmxvY2tzXG4iKTsKIAkJcG1jcmFpZF9yZWxlYXNlX2NvbmZpZ19idWZmZXJzKHBpbnN0YW5jZSk7CiAJCXBtY3JhaWRfcmVsZWFzZV9ob3N0X3JycXMocGluc3RhbmNlLCBwaW5zdGFuY2UtPm51bV9ocnJxKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaWYgKHBtY3JhaWRfYWxsb2NhdGVfY29udHJvbF9ibG9ja3MocGluc3RhbmNlKSkgewotCQlwbWNyYWlkX2VycigiY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGNvbnRyb2wgYmxvY2tzIFxuIik7CisJCXBtY3JhaWRfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgY29udHJvbCBibG9ja3NcbiIpOwogCQlwbWNyYWlkX3JlbGVhc2VfY29uZmlnX2J1ZmZlcnMocGluc3RhbmNlKTsKIAkJcG1jcmFpZF9yZWxlYXNlX2NtZF9ibG9ja3MocGluc3RhbmNlLCBQTUNSQUlEX01BWF9DTUQpOwogCQlwbWNyYWlkX3JlbGVhc2VfaG9zdF9ycnFzKHBpbnN0YW5jZSwgcGluc3RhbmNlLT5udW1faHJycSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCS8qIGFsbG9jYXRlIERNQWFibGUgbWVtb3J5IGZvciBwYWdlIEQwIElOUVVJUlkgYnVmZmVyICovCisJcGluc3RhbmNlLT5pbnFfZGF0YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQkJCQlwaW5zdGFuY2UtPnBkZXYsCisJCQkJCXNpemVvZihzdHJ1Y3QgcG1jcmFpZF9pbnF1aXJ5X2RhdGEpLAorCQkJCQkmcGluc3RhbmNlLT5pbnFfZGF0YV9iYWRkcik7CisKKwlpZiAocGluc3RhbmNlLT5pbnFfZGF0YSA9PSBOVUxMKSB7CisJCXBtY3JhaWRfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSBETUEgbWVtb3J5IGZvciBJTlFVSVJZXG4iKTsKKwkJcG1jcmFpZF9yZWxlYXNlX2J1ZmZlcnMocGluc3RhbmNlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJLyogSW5pdGlhbGl6ZSBhbGwgdGhlIGNvbW1hbmQgYmxvY2tzIGFuZCBhZGQgdGhlbSB0byBmcmVlIHBvb2wuIE5vCiAJICogbmVlZCB0byBsb2NrIChmcmVlX3Bvb2xfbG9jaykgYXMgdGhpcyBpcyBkb25lIGluIGluaXRpYWxpemF0aW9uCiAJICogaXRzZWxmCkBAIC00Nzg1LDcgKzUyMjIsNyBAQAogICogcG1jcmFpZF9yZWluaXRfYnVmZmVycyAtIHJlc2V0cyB2YXJpb3VzIGJ1ZmZlciBwb2ludGVycwogICogQHBpbnN0YW5jZTogcG9pbnRlciB0byBhZGFwdGVyIGluc3RhbmNlCiAgKiBSZXR1cm4gdmFsdWUKLSAqIAlub25lCisgKglub25lCiAgKi8KIHN0YXRpYyB2b2lkIHBtY3JhaWRfcmVpbml0X2J1ZmZlcnMoc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKnBpbnN0YW5jZSkKIHsKQEAgLTQ4MzYsNiArNTI3Myw4IEBACiAJCQltYXBwZWRfcGNpX2FkZHIgKyBjaGlwX2NmZy0+aW9hX2hvc3RfaW50cjsKIAkJcGludF9yZWdzLT5pb2FfaG9zdF9pbnRlcnJ1cHRfY2xyX3JlZyA9CiAJCQltYXBwZWRfcGNpX2FkZHIgKyBjaGlwX2NmZy0+aW9hX2hvc3RfaW50cl9jbHI7CisJCXBpbnRfcmVncy0+aW9hX2hvc3RfbXNpeF9pbnRlcnJ1cHRfcmVnID0KKwkJCW1hcHBlZF9wY2lfYWRkciArIGNoaXBfY2ZnLT5pb2FfaG9zdF9tc2l4X2ludHI7CiAJCXBpbnRfcmVncy0+aG9zdF9pb2FfaW50ZXJydXB0X3JlZyA9CiAJCQltYXBwZWRfcGNpX2FkZHIgKyBjaGlwX2NmZy0+aG9zdF9pb2FfaW50cjsKIAkJcGludF9yZWdzLT5ob3N0X2lvYV9pbnRlcnJ1cHRfY2xyX3JlZyA9CkBAIC00ODU4LDYgKzUyOTcsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBpbnN0YW5jZS0+cmVzZXRfd2FpdF9xKTsKIAogCWF0b21pY19zZXQoJnBpbnN0YW5jZS0+b3V0c3RhbmRpbmdfY21kcywgMCk7CisJYXRvbWljX3NldCgmcGluc3RhbmNlLT5sYXN0X21lc3NhZ2VfaWQsIDApOwogCWF0b21pY19zZXQoJnBpbnN0YW5jZS0+ZXhwb3NlX3Jlc291cmNlcywgMCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmcGluc3RhbmNlLT5mcmVlX3Jlc19xKTsKQEAgLTQ4ODMsMjMgKzUzMjMsNiBAQAogfQogCiAvKioKLSAqIHBtY3JhaWRfcmVsZWFzZV9idWZmZXJzIC0gcmVsZWFzZSBwZXItYWRhcHRlciBidWZmZXJzIGFsbG9jYXRlZAotICoKLSAqIEBwaW5zdGFuY2U6IHBvaW50ZXIgdG8gYWRhcHRlciBzb2Z0IHN0YXRlCi0gKgotICogUmV0dXJuIFZhbHVlCi0gKiAJbm9uZQotICovCi1zdGF0aWMgdm9pZCBwbWNyYWlkX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlKQotewotCXBtY3JhaWRfcmVsZWFzZV9jb25maWdfYnVmZmVycyhwaW5zdGFuY2UpOwotCXBtY3JhaWRfcmVsZWFzZV9jb250cm9sX2Jsb2NrcyhwaW5zdGFuY2UsIFBNQ1JBSURfTUFYX0NNRCk7Ci0JcG1jcmFpZF9yZWxlYXNlX2NtZF9ibG9ja3MocGluc3RhbmNlLCBQTUNSQUlEX01BWF9DTUQpOwotCXBtY3JhaWRfcmVsZWFzZV9ob3N0X3JycXMocGluc3RhbmNlLCBwaW5zdGFuY2UtPm51bV9ocnJxKTsKLQotfQotCi0vKioKICAqIHBtY3JhaWRfc2h1dGRvd24gLSBzaHV0ZG93biBhZGFwdGVyIGNvbnRyb2xsZXIuCiAgKiBAcGRldjogcGNpIGRldmljZSBzdHJ1Y3QKICAqCkBAIC00OTU4LDcgKzUzODEsNyBAQAogCQlwbWNyYWlkX3JlbGVhc2VfbWlub3IobWlub3IpOwogCWVsc2UKIAkJZGV2aWNlX2NyZWF0ZShwbWNyYWlkX2NsYXNzLCBOVUxMLCBNS0RFVihwbWNyYWlkX21ham9yLCBtaW5vciksCi0JCQkgICAgICBOVUxMLCAicG1jc2FzJXUiLCBtaW5vcik7CisJCQkgICAgICBOVUxMLCAiJXMldSIsIFBNQ1JBSURfREVWRklMRSwgbWlub3IpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNTA1MCw3ICs1NDczLDYgQEAKIAlzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwaW5zdGFuY2UtPmhvc3Q7CiAJaW50IHJjOwotCWludCBocnJxczsKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKQEAgLTUwNzcsOCArNTQ5OSw4IEBACiAJCWdvdG8gZGlzYWJsZV9kZXZpY2U7CiAJfQogCisJcG1jcmFpZF9kaXNhYmxlX2ludGVycnVwdHMocGluc3RhbmNlLCB+MCk7CiAJYXRvbWljX3NldCgmcGluc3RhbmNlLT5vdXRzdGFuZGluZ19jbWRzLCAwKTsKLQlocnJxcyA9IHBpbnN0YW5jZS0+bnVtX2hycnE7CiAJcmMgPSBwbWNyYWlkX3JlZ2lzdGVyX2ludGVycnVwdF9oYW5kbGVyKHBpbnN0YW5jZSk7CiAKIAlpZiAocmMpIHsKQEAgLTUxMDAsNyArNTUyMiw3IEBACiAJICogc3RhdGUuCiAJICovCiAJaWYgKHBtY3JhaWRfcmVzZXRfYnJpbmd1cChwaW5zdGFuY2UpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkbid0IGluaXRpYWxpemUgSU9BIFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkbid0IGluaXRpYWxpemUgSU9BXG4iKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIHJlbGVhc2VfdGFza2xldHM7CiAJfQpAQCAtNTEwOCw2ICs1NTMwLDcgQEAKIAlyZXR1cm4gMDsKIAogcmVsZWFzZV90YXNrbGV0czoKKwlwbWNyYWlkX2Rpc2FibGVfaW50ZXJydXB0cyhwaW5zdGFuY2UsIH4wKTsKIAlwbWNyYWlkX2tpbGxfdGFza2xldHMocGluc3RhbmNlKTsKIAlwbWNyYWlkX3VucmVnaXN0ZXJfaW50ZXJydXB0X2hhbmRsZXIocGluc3RhbmNlKTsKIApAQCAtNTEyOSw3ICs1NTUyLDcgQEAKIAogLyoqCiAgKiBwbWNyYWlkX2NvbXBsZXRlX2lvYV9yZXNldCAtIENhbGxlZCBieSBlaXRoZXIgdGltZXIgb3IgdGFza2xldCBkdXJpbmcKLSAqIAkgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uIG9mIHRoZSBpb2EgcmVzZXQKKyAqCQkJCWNvbXBsZXRpb24gb2YgdGhlIGlvYSByZXNldAogICogQGNtZDogcG9pbnRlciB0byByZXNldCBjb21tYW5kIGJsb2NrCiAgKi8KIHN0YXRpYyB2b2lkIHBtY3JhaWRfY29tcGxldGVfaW9hX3Jlc2V0KHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kKQpAQCAtNTIwNCwxMSArNTYyNywxNCBAQAogCXN0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeSAqY2ZndGU7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCWludCBmb3VuZCwgcmMsIGk7CisJdTE2IGZ3X3ZlcnNpb247CiAJTElTVF9IRUFEKG9sZF9yZXMpOwogCiAJaWYgKHBpbnN0YW5jZS0+Y2ZnX3RhYmxlLT5mbGFncyAmIE1JQ1JPQ09ERV9VUERBVEVfUkVRVUlSRUQpCiAJCXBtY3JhaWRfZXJyKCJJT0EgcmVxdWlyZXMgbWljcm9jb2RlIGRvd25sb2FkXG4iKTsKIAorCWZ3X3ZlcnNpb24gPSBiZTE2X3RvX2NwdShwaW5zdGFuY2UtPmlucV9kYXRhLT5md192ZXJzaW9uKTsKKwogCS8qIHJlc291cmNlIGxpc3QgaXMgcHJvdGVjdGVkIGJ5IHBpbnN0YW5jZS0+cmVzb3VyY2VfbG9jay4KIAkgKiBpbml0X3Jlc190YWJsZSBjYW4gYmUgY2FsbGVkIGZyb20gcHJvYmUgKHVzZXItdGhyZWFkKSBvciBydW50aW1lCiAJICogcmVzZXQgKHRpbWVyL3Rhc2tsZXQpCkBAIC01MjE5LDkgKzU2NDUsMTQgQEAKIAkJbGlzdF9tb3ZlX3RhaWwoJnJlcy0+cXVldWUsICZvbGRfcmVzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBwaW5zdGFuY2UtPmNmZ190YWJsZS0+bnVtX2VudHJpZXM7IGkrKykgewotCQljZmd0ZSA9ICZwaW5zdGFuY2UtPmNmZ190YWJsZS0+ZW50cmllc1tpXTsKKwkJaWYgKGJlMTZfdG9fY3B1KHBpbnN0YW5jZS0+aW5xX2RhdGEtPmZ3X3ZlcnNpb24pIDw9CisJCQkJCQlQTUNSQUlEX0ZXX1ZFUlNJT05fMSkKKwkJCWNmZ3RlID0gJnBpbnN0YW5jZS0+Y2ZnX3RhYmxlLT5lbnRyaWVzW2ldOworCQllbHNlCisJCQljZmd0ZSA9IChzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnkgKikKKwkJCQkJJnBpbnN0YW5jZS0+Y2ZnX3RhYmxlLT5lbnRyaWVzX2V4dFtpXTsKIAotCQlpZiAoIXBtY3JhaWRfZXhwb3NlX3Jlc291cmNlKGNmZ3RlKSkKKwkJaWYgKCFwbWNyYWlkX2V4cG9zZV9yZXNvdXJjZShmd192ZXJzaW9uLCBjZmd0ZSkpCiAJCQljb250aW51ZTsKIAogCQlmb3VuZCA9IDA7CkBAIC01MjYzLDEwICs1Njk0LDEyIEBACiAJCSAqLwogCQlpZiAoZm91bmQpIHsKIAkJCW1lbWNweSgmcmVzLT5jZmdfZW50cnksIGNmZ3RlLAotCQkJCXNpemVvZihzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnkpKTsKKwkJCQkJcGluc3RhbmNlLT5jb25maWdfdGFibGVfZW50cnlfc2l6ZSk7CiAJCQlwbWNyYWlkX2luZm8oIk5ldyByZXMgdHlwZToleCwgdnNldDoleCwgYWRkcjoleDpcbiIsCiAJCQkJIHJlcy0+Y2ZnX2VudHJ5LnJlc291cmNlX3R5cGUsCi0JCQkJIHJlcy0+Y2ZnX2VudHJ5LnVuaXF1ZV9mbGFnczEsCisJCQkJIChmd192ZXJzaW9uIDw9IFBNQ1JBSURfRldfVkVSU0lPTl8xID8KKwkJCQkJcmVzLT5jZmdfZW50cnkudW5pcXVlX2ZsYWdzMSA6CisJCQkJCQlyZXMtPmNmZ19lbnRyeS5hcnJheV9pZCAmIDB4RkYpLAogCQkJCSBsZTMyX3RvX2NwdShyZXMtPmNmZ19lbnRyeS5yZXNvdXJjZV9hZGRyZXNzKSk7CiAJCX0KIAl9CkBAIC01MzA2LDYgKzU3MzksMTQgQEAKIAlzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlID0gY21kLT5kcnZfaW5zdDsKIAlpbnQgY2ZnX3RhYmxlX3NpemUgPSBjcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IHBtY3JhaWRfY29uZmlnX3RhYmxlKSk7CiAKKwlpZiAoYmUxNl90b19jcHUocGluc3RhbmNlLT5pbnFfZGF0YS0+ZndfdmVyc2lvbikgPD0KKwkJCQkJUE1DUkFJRF9GV19WRVJTSU9OXzEpCisJCXBpbnN0YW5jZS0+Y29uZmlnX3RhYmxlX2VudHJ5X3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeSk7CisJZWxzZQorCQlwaW5zdGFuY2UtPmNvbmZpZ190YWJsZV9lbnRyeV9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnlfZXh0KTsKKwogCWlvYXJjYi0+cmVxdWVzdF90eXBlID0gUkVRX1RZUEVfSU9BQ01EOwogCWlvYXJjYi0+cmVzb3VyY2VfaGFuZGxlID0gY3B1X3RvX2xlMzIoUE1DUkFJRF9JT0FfUkVTX0hBTkRMRSk7CiAKQEAgLTUzMzgsNyArNTc3OSw3IEBACiAKIAogLyoqCi0gKiBwbWNyYWlkX3Byb2JlIC0gUENJIHByb2JlIGVudHJ5IHBvaW50ZXIgZm9yIFBNQyBNYXhSYWlkIGNvbnRyb2xsZXIgZHJpdmVyCisgKiBwbWNyYWlkX3Byb2JlIC0gUENJIHByb2JlIGVudHJ5IHBvaW50ZXIgZm9yIFBNQyBNYXhSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCiAgKiBAcGRldjogcG9pbnRlciB0byBwY2kgZGV2aWNlIHN0cnVjdHVyZQogICogQGRldl9pZDogcG9pbnRlciB0byBkZXZpY2UgaWRzIHN0cnVjdHVyZQogICoKQEAgLTU0ODUsNyArNTkyNiw3IEBACiAJICovCiAJcG1jcmFpZF9pbmZvKCJzdGFydGluZyBJT0EgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2VcbiIpOwogCWlmIChwbWNyYWlkX3Jlc2V0X2JyaW5ndXAocGluc3RhbmNlKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0aWFsaXplIElPQSBcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0aWFsaXplIElPQVxuIik7CiAJCXJjID0gMTsKIAkJZ290byBvdXRfcmVsZWFzZV9idWZzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5oCmluZGV4IGI4YWQwN2MuLjZjZmEwMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuaApAQCAtNDAsMTAgKzQwLDEyIEBACiAgKiBEcml2ZXIgdmVyc2lvbjogdmVyc2lvbiBzdHJpbmcgaW4gbWFqb3JfdmVyc2lvbi5taW5vcl92ZXJzaW9uLnBhdGNoIGZvcm1hdAogICogRHJpdmVyIGRhdGUgICA6IGRhdGUgaW5mb3JtYXRpb24gaW4gIk1vbiBkZCB5eXl5IiBmb3JtYXQKICAqLwotI2RlZmluZSBQTUNSQUlEX0RSSVZFUl9OQU1FICAgICAgIAkiUE1DIE1heFJBSUQiCisjZGVmaW5lIFBNQ1JBSURfRFJJVkVSX05BTUUJCSJQTUMgTWF4UkFJRCIKICNkZWZpbmUgUE1DUkFJRF9ERVZGSUxFCQkJInBtY3NhcyIKLSNkZWZpbmUgUE1DUkFJRF9EUklWRVJfVkVSU0lPTiAgICAJIjEuMC4yIgotI2RlZmluZSBQTUNSQUlEX0RSSVZFUl9EQVRFICAgICAgIAlfX0RBVEVfXworI2RlZmluZSBQTUNSQUlEX0RSSVZFUl9WRVJTSU9OCQkiMi4wLjIiCisjZGVmaW5lIFBNQ1JBSURfRFJJVkVSX0RBVEUJCV9fREFURV9fCisKKyNkZWZpbmUgUE1DUkFJRF9GV19WRVJTSU9OXzEJCTB4MDAyCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGFkYXB0ZXJzIHN1cHBvcnRlZCBieSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGRyaXZlciAqLwogI2RlZmluZSBQTUNSQUlEX01BWF9BREFQVEVSUwkJMTAyNApAQCAtODUsMTcgKzg3LDE3IEBACiAjZGVmaW5lIFBNQ1JBSURfSU9BUkNCX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMzIKICNkZWZpbmUgUE1DUkFJRF9JT0FETF9BTElHTk1FTlQgICAgICAgICAgICAgICAgICAxNgogI2RlZmluZSBQTUNSQUlEX0lPQVNBX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUE1DUkFJRF9OVU1fTVNJWF9WRUNUT1JTICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBNQ1JBSURfTlVNX01TSVhfVkVDVE9SUyAgICAgICAgICAgICAgICAgMTYKIAogLyogdmFyaW91cyBvdGhlciBsaW1pdHMgKi8KLSNkZWZpbmUgUE1DUkFJRF9WRU5ET1JfSURfTEVOICAgICAgICAgICAJIDgKLSNkZWZpbmUgUE1DUkFJRF9QUk9EVUNUX0lEX0xFTiAgICAgICAgICAgIAkgMTYKLSNkZWZpbmUgUE1DUkFJRF9TRVJJQUxfTlVNX0xFTiAgICAgICAgICAJIDgKLSNkZWZpbmUgUE1DUkFJRF9MVU5fTEVOCQkJICAgICAgICAgOAotI2RlZmluZSBQTUNSQUlEX01BWF9DREJfTEVOICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFBNQ1JBSURfREVWSUNFX0lEX0xFTgkJCSA4Ci0jZGVmaW5lIFBNQ1JBSURfU0VOU0VfREFUQV9MRU4JCQkgMjU2Ci0jZGVmaW5lIFBNQ1JBSURfQUREX0NNRF9QQVJBTV9MRU4JCSA0OAorI2RlZmluZSBQTUNSQUlEX1ZFTkRPUl9JRF9MRU4JCQk4CisjZGVmaW5lIFBNQ1JBSURfUFJPRFVDVF9JRF9MRU4JCQkxNgorI2RlZmluZSBQTUNSQUlEX1NFUklBTF9OVU1fTEVOCQkJOAorI2RlZmluZSBQTUNSQUlEX0xVTl9MRU4JCQkJOAorI2RlZmluZSBQTUNSQUlEX01BWF9DREJfTEVOCQkJMTYKKyNkZWZpbmUgUE1DUkFJRF9ERVZJQ0VfSURfTEVOCQkJOAorI2RlZmluZSBQTUNSQUlEX1NFTlNFX0RBVEFfTEVOCQkJMjU2CisjZGVmaW5lIFBNQ1JBSURfQUREX0NNRF9QQVJBTV9MRU4JCTQ4CiAKICNkZWZpbmUgUE1DUkFJRF9NQVhfQlVTX1RPX1NDQU4gICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIFBNQ1JBSURfTUFYX05VTV9UQVJHRVRTX1BFUl9CVVMgICAgICAgICAgMjU2CkBAIC0xMTYsMTcgKzExOCwxMCBAQAogI2RlZmluZSBQTUNSQUlEX1ZTRVRfTUFYX1NFQ1RPUlMgICAgICAgICAgICAgICAgIDUxMgogI2RlZmluZSBQTUNSQUlEX01BWF9DTURfUEVSX0xVTiAgICAgICAgICAgICAgICAgIDI1NAogCi0vKiBOdW1iZXIgb2YgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyaWVzIChyZXNvdXJjZXMpICovCi0jZGVmaW5lIFBNQ1JBSURfTUFYX05VTV9PRl9WU0VUUyAgICAgICAgICAgICAgICAgMjQwCi0KLS8qIFRvZG8gOiBDaGVjayBtYXggbGltaXQgZm9yIFBoYXNlIDEgKi8KLSNkZWZpbmUgUE1DUkFJRF9NQVhfTlVNX09GX1BIWV9ERVZTICAgICAgICAgICAgICAyNTYKLQotLyogTUFYX05VTV9PRl9ERVZTIGluY2x1ZGVzIDEgRlAsIDEgRHVtbXkgRW5jbG9zdXJlIGRldmljZSAqLwotI2RlZmluZSBQTUNSQUlEX01BWF9OVU1fT0ZfREVWUyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoUE1DUkFJRF9NQVhfTlVNX09GX1ZTRVRTICsgUE1DUkFJRF9NQVhfTlVNX09GX1BIWV9ERVZTICsgMikKLQotI2RlZmluZSBQTUNSQUlEX01BWF9SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgIFBNQ1JBSURfTUFYX05VTV9PRl9ERVZTCisvKiBOdW1iZXIgb2YgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyaWVzIChyZXNvdXJjZXMpLCBpbmNsdWRlcyAxIEZQLAorICogMSBFbmNsb3N1cmUgZGV2aWNlCisgKi8KKyNkZWZpbmUgUE1DUkFJRF9NQVhfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAyNTYKIAogLyogQWRhcHRlciBDb21tYW5kcyB1c2VkIGJ5IGRyaXZlciAqLwogI2RlZmluZSBQTUNSQUlEX1FVRVJZX1JFU09VUkNFX1NUQVRFICAgICAgICAgICAgIDB4QzIKQEAgLTE3Nyw2ICsxNzIsNyBAQAogI2RlZmluZSBQTUNSQUlEX0lPQVNDX1NFTlNFX1NUQVRVUyhpb2FzYykgICAgICAgICgoaW9hc2MpICYgMHgwMDAwMDBmZikKIAogI2RlZmluZSBQTUNSQUlEX0lPQVNDX0dPT0RfQ09NUExFVElPTgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUE1DUkFJRF9JT0FTQ19HQ19JT0FSQ0JfTk9URk9VTkQJCTB4MDA1QTAwMDAKICNkZWZpbmUgUE1DUkFJRF9JT0FTQ19OUl9JTklUX0NNRF9SRVFVSVJFRAkJMHgwMjA0MDIwMAogI2RlZmluZSBQTUNSQUlEX0lPQVNDX05SX0lPQV9SRVNFVF9SRVFVSVJFRAkJMHgwMjA0ODAwMAogI2RlZmluZSBQTUNSQUlEX0lPQVNDX05SX1NZTkNfUkVRVUlSRUQJCQkweDAyM0YwMDAwCkBAIC0xODcsMTIgKzE4MywxMiBAQAogI2RlZmluZSBQTUNSQUlEX0lPQVNDX0hXX0lPQV9SRVNFVF9SRVFVSVJFRAkJMHgwNDQ0ODYwMAogI2RlZmluZSBQTUNSQUlEX0lPQVNDX0lSX0lOVkFMSURfUkVTT1VSQ0VfSEFORExFICAgICAgICAweDA1MjUwMDAwCiAjZGVmaW5lIFBNQ1JBSURfSU9BU0NfQUNfVEVSTUlOQVRFRF9CWV9IT1NUCQkweDBCNUEwMDAwCi0jZGVmaW5lIFBNQ1JBSURfSU9BU0NfVUFfQlVTX1dBU19SRVNFVCAgICAgICAgICAgCTB4MDYyOTAwMDAKLSNkZWZpbmUgUE1DUkFJRF9JT0FTQ19VQV9CVVNfV0FTX1JFU0VUX0JZX09USEVSICAJMHgwNjI5ODAwMAorI2RlZmluZSBQTUNSQUlEX0lPQVNDX1VBX0JVU19XQVNfUkVTRVQJCQkweDA2MjkwMDAwCisjZGVmaW5lIFBNQ1JBSURfSU9BU0NfVUFfQlVTX1dBU19SRVNFVF9CWV9PVEhFUgkJMHgwNjI5ODAwMAogCiAvKiBEcml2ZXIgZGVmaW5lZCBJT0FTQ3MgKi8KLSNkZWZpbmUgUE1DUkFJRF9JT0FTQ19JT0FfV0FTX1JFU0VUICAgICAgICAgICAgICAJMHgxMDAwMDAwMQotI2RlZmluZSBQTUNSQUlEX0lPQVNDX1BDSV9BQ0NFU1NfRVJST1IgICAgICAgICAgIAkweDEwMDAwMDAyCisjZGVmaW5lIFBNQ1JBSURfSU9BU0NfSU9BX1dBU19SRVNFVAkJCTB4MTAwMDAwMDEKKyNkZWZpbmUgUE1DUkFJRF9JT0FTQ19QQ0lfQUNDRVNTX0VSUk9SCQkJMHgxMDAwMDAwMgogCiAvKiBWYXJpb3VzIHRpbWVvdXQgdmFsdWVzIChpbiBtaWxsaXNlY29uZHMpIHVzZWQuIElmIGFueSBvZiB0aGVzZSBhcmUgY2hpcAogICogc3BlY2lmaWMsIG1vdmUgdGhlbSB0byBwbWNyYWlkX2NoaXBfZGV0YWlscyBzdHJ1Y3R1cmUuCkBAIC0zMzYsNiArMzMyLDEzIEBACiAJX191OCAgbHVuW1BNQ1JBSURfTFVOX0xFTl07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwogCisvKiBleHRlbmRlZCBjb25maWd1cmF0aW9uIHRhYmxlIHNpemVzIGFyZSBvZiA2NCBieXRlcyBpbiBzaXplICovCisjZGVmaW5lIFBNQ1JBSURfQ0ZHVEVfRVhUX1NJWkUJMzIKK3N0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeV9leHQgeworCXN0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeSBjZmd0ZTsKKwlfX3U4ICBjZmd0ZV9leHRbUE1DUkFJRF9DRkdURV9FWFRfU0laRV07Cit9OworCiAvKiByZXNvdXJjZSB0eXBlcyAoY29uZmlnX3RhYmxlX2VudHJ5LnJlc291cmNlX3R5cGUgdmFsdWVzKSAqLwogI2RlZmluZSBSRVNfVFlQRV9BRl9EQVNEICAgICAweDAwCiAjZGVmaW5lIFJFU19UWVBFX0dTQ1NJICAgICAgIDB4MDEKQEAgLTM3Niw3ICszNzksMTIgQEAKIAlfX3U4ICByZXNlcnZlZDE7CiAJX191OCAgZmxhZ3M7CiAJX191OCAgcmVzZXJ2ZWQyWzExXTsKLQlzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnkgZW50cmllc1tQTUNSQUlEX01BWF9SRVNPVVJDRVNdOworCXVuaW9uIHsKKwkJc3RydWN0IHBtY3JhaWRfY29uZmlnX3RhYmxlX2VudHJ5CisJCQkJZW50cmllc1tQTUNSQUlEX01BWF9SRVNPVVJDRVNdOworCQlzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnlfZXh0CisJCQkJZW50cmllc19leHRbUE1DUkFJRF9NQVhfUkVTT1VSQ0VTXTsKKwl9OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKIAogLyogY29uZmlnX3RhYmxlLmZsYWdzIHZhbHVlICovCkBAIC0zODUsNyArMzkzLDcgQEAKIC8qCiAgKiBIQ0FNIGZvcm1hdAogICovCi0jZGVmaW5lIFBNQ1JBSURfSE9TVFJDQl9MRE5TSVpFIAkJNDA1NgorI2RlZmluZSBQTUNSQUlEX0hPU1RSQ0JfTEROU0laRQkJCTQwNTYKIAogLyogRXJyb3IgbG9nIG5vdGlmaWNhdGlvbiBmb3JtYXQgKi8KIHN0cnVjdCBwbWNyYWlkX2hvc3RyY2JfZXJyb3IgewpAQCAtNDE2LDYgKzQyNCwxNSBAQAogc3RydWN0IHBtY3JhaWRfaGNhbV9jY24gewogCXN0cnVjdCBwbWNyYWlkX2hjYW1faGRyIGhlYWRlcjsKIAlzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnkgY2ZnX2VudHJ5OworCXN0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeSBjZmdfZW50cnlfb2xkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworI2RlZmluZSBQTUNSQUlEX0NDTl9FWFRfU0laRQkzOTQ0CitzdHJ1Y3QgcG1jcmFpZF9oY2FtX2Njbl9leHQgeworCXN0cnVjdCBwbWNyYWlkX2hjYW1faGRyIGhlYWRlcjsKKwlzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnlfZXh0IGNmZ19lbnRyeTsKKwlzdHJ1Y3QgcG1jcmFpZF9jb25maWdfdGFibGVfZW50cnlfZXh0IGNmZ19lbnRyeV9vbGQ7CisJX191OCAgIHJlc2VydmVkW1BNQ1JBSURfQ0NOX0VYVF9TSVpFXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7CiAKIHN0cnVjdCBwbWNyYWlkX2hjYW1fbGRuIHsKQEAgLTQzMSw2ICs0NDgsOCBAQAogI2RlZmluZSBOT1RJRklDQVRJT05fVFlQRV9FTlRSWV9DSEFOR0VECQkweDAKICNkZWZpbmUgTk9USUZJQ0FUSU9OX1RZUEVfRU5UUllfTkVXCQkweDEKICNkZWZpbmUgTk9USUZJQ0FUSU9OX1RZUEVfRU5UUllfREVMRVRFRAkJMHgyCisjZGVmaW5lIE5PVElGSUNBVElPTl9UWVBFX1NUQVRFX0NIQU5HRQkJMHgzCisjZGVmaW5lIE5PVElGSUNBVElPTl9UWVBFX0VOVFJZX1NUQVRFQ0hBTkdFRAkweDQKICNkZWZpbmUgTk9USUZJQ0FUSU9OX1RZUEVfRVJST1JfTE9HCQkweDEwCiAjZGVmaW5lIE5PVElGSUNBVElPTl9UWVBFX0lORk9STUFUSU9OX0xPRwkweDExCiAKQEAgLTQ2MCw2ICs0NzksNyBAQAogCXVuc2lnbmVkIGxvbmcgIG1haWxib3g7CiAJdW5zaWduZWQgbG9uZyAgZ2xvYmFsX2ludHJfbWFzazsKIAl1bnNpZ25lZCBsb25nICBpb2FfaG9zdF9pbnRyOworCXVuc2lnbmVkIGxvbmcgIGlvYV9ob3N0X21zaXhfaW50cjsKIAl1bnNpZ25lZCBsb25nICBpb2FfaG9zdF9pbnRyX2NscjsKIAl1bnNpZ25lZCBsb25nICBpb2FfaG9zdF9tYXNrOwogCXVuc2lnbmVkIGxvbmcgIGlvYV9ob3N0X21hc2tfY2xyOwpAQCAtNDgyLDYgKzUwMiw3IEBACiAjZGVmaW5lIElOVFJTX0lPQV9QUk9DRVNTT1JfRVJST1IJCVBNQ19CSVQzMigyOSkKICNkZWZpbmUgSU5UUlNfSFJSUV9WQUxJRAkJCVBNQ19CSVQzMigzMCkKICNkZWZpbmUgSU5UUlNfT1BFUkFUSU9OQUxfU1RBVFVTCQlQTUNfQklUMzIoMCkKKyNkZWZpbmUgSU5UUlNfQUxMT1dfTVNJWF9WRUNUT1IwCQlQTUNfQklUMzIoMzEpCiAKIC8qIEhvc3QgdG8gSU9BIERvb3JiZWxscyAqLwogI2RlZmluZSBET09SQkVMTF9SVU5USU1FX1JFU0VUCQkJUE1DX0JJVDMyKDEpCkBAIC00ODksMTAgKzUxMCwxMiBAQAogI2RlZmluZSBET09SQkVMTF9JT0FfREVCVUdfQUxFUlQJCVBNQ19CSVQzMig5KQogI2RlZmluZSBET09SQkVMTF9FTkFCTEVfREVTVFJVQ1RJVkVfRElBR1MJUE1DX0JJVDMyKDgpCiAjZGVmaW5lIERPT1JCRUxMX0lPQV9TVEFSVF9CSVNUCQkJUE1DX0JJVDMyKDIzKQorI2RlZmluZSBET09SQkVMTF9JTlRSX01PREVfTVNJWAkJCVBNQ19CSVQzMigyNSkKKyNkZWZpbmUgRE9PUkJFTExfSU5UUl9NU0lYX0NMUgkJCVBNQ19CSVQzMigyNikKICNkZWZpbmUgRE9PUkJFTExfUkVTRVRfSU9BCQkJUE1DX0JJVDMyKDMxKQogCiAvKiBHbG9iYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgdmFsdWUgKi8KLSNkZWZpbmUgR0xPQkFMX0lOVEVSUlVQVF9NQVNLCQkJMHg0VUxMCisjZGVmaW5lIEdMT0JBTF9JTlRFUlJVUFRfTUFTSwkJCTB4NVVMTAogCiAjZGVmaW5lIFBNQ1JBSURfRVJST1JfSU5URVJSVVBUUwkoSU5UUlNfSU9BUkNCX1RSQU5TRkVSX0ZBSUxFRCB8IFwKIAkJCQkJIElOVFJTX0lPQV9VTklUX0NIRUNLIHwgXApAQCAtNTAzLDggKzUyNiw4IEBACiAKICNkZWZpbmUgUE1DUkFJRF9QQ0lfSU5URVJSVVBUUwkJKFBNQ1JBSURfRVJST1JfSU5URVJSVVBUUyB8IFwKIAkJCQkJIElOVFJTX0hSUlFfVkFMSUQgfCBcCi0JCQkJCSBJTlRSU19DUklUSUNBTF9PUF9JTl9QUk9HUkVTUyB8XAotCQkJCQkgSU5UUlNfVFJBTlNJVElPTl9UT19PUEVSQVRJT05BTCkKKwkJCQkJIElOVFJTX1RSQU5TSVRJT05fVE9fT1BFUkFUSU9OQUwgfFwKKwkJCQkJIElOVFJTX0FMTE9XX01TSVhfVkVDVE9SMCkKIAogLyogY29udHJvbF9ibG9jaywgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb2YgdGhlIGNvbW1hbmRzIGNvbnRhaW5zIElPQVJDQiwgSU9BRExzCiAgKiBtZW1vcnkgZm9yIElPQVNBLiBBZGRpdGlvbmFsIDMgKiAxNiBieXRlcyBhcmUgYWxsb2NhdGVkIGluIG9yZGVyIHRvIHN1cHBvcnQKQEAgLTUyNiwxNyArNTQ5LDI0IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNjYXR0ZXJsaXN0WzFdOwogfTsKIAorLyogcGFnZSBEMCBpbnF1aXJ5IGRhdGEgb2YgZm9jYWwgcG9pbnQgcmVzb3VyY2UgKi8KK3N0cnVjdCBwbWNyYWlkX2lucXVpcnlfZGF0YSB7CisJX191OAlwaF9kZXZfdHlwZTsKKwlfX3U4CXBhZ2VfY29kZTsKKwlfX3U4CXJlc2VydmVkMTsKKwlfX3U4CWFkZF9wYWdlX2xlbjsKKwlfX3U4CWxlbmd0aDsKKwlfX3U4CXJlc2VydmVkMjsKKwlfX2xlMTYJZndfdmVyc2lvbjsKKwlfX3U4CXJlc2VydmVkM1sxNl07Cit9OworCiAvKiBwbWNyYWlkX2NtZCAtIExMRCByZXByZXNlbnRhdGlvbiBvZiBTQ1NJIGNvbW1hbmQgKi8KIHN0cnVjdCBwbWNyYWlkX2NtZCB7CiAKIAkvKiBQdHIgYW5kIGJ1cyBhZGRyZXNzIG9mIERNQS5hYmxlIGNvbnRyb2wgYmxvY2sgZm9yIHRoaXMgY29tbWFuZCAqLwogCXN0cnVjdCBwbWNyYWlkX2NvbnRyb2xfYmxvY2sgKmlvYV9jYjsKIAlkbWFfYWRkcl90IGlvYV9jYl9idXNfYWRkcjsKLQotCS8qIHNlbnNlIGJ1ZmZlciBmb3IgUkVRVUVTVCBTRU5TRSBjb21tYW5kIGlmIGZpcm13YXJlIGlzIG5vdCBzZW5kaW5nCi0JICogYXV0byBzZW5zZSBkYXRhCi0JICovCi0JZG1hX2FkZHJfdCBzZW5zZV9idWZmZXJfZG1hOwogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAl1OCAqc2Vuc2VfYnVmZmVyOwogCkBAIC01NTYsMTEgKzU4NiwyMiBAQAogCiAJc3RydWN0IHBtY3JhaWRfc2dsaXN0ICpzZ2xpc3Q7IC8qIHVzZWQgZm9yIHBhc3N0aHJvdWdoIElPQ1RMcyAqLwogCi0JLyogc2NyYXRjaCB1c2VkIGR1cmluZyByZXNldCBzZXF1ZW5jZSAqLworCS8qIHNjcmF0Y2ggdXNlZCAqLwogCXVuaW9uIHsKKwkJLyogZHVyaW5nIHJlc2V0IHNlcXVlbmNlICovCiAJCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCQlzdHJ1Y3QgcG1jcmFpZF9yZXNvdXJjZV9lbnRyeSAqcmVzOwotCX0gdTsKKwkJaW50IGhycnFfaW5kZXg7CisKKwkJLyogdXNlZCBkdXJpbmcgSU8gY29tbWFuZCBlcnJvciBoYW5kbGluZy4gU2Vuc2UgYnVmZmVyCisJCSAqIGZvciBSRVFVRVNUIFNFTlNFIGNvbW1hbmQgaWYgZmlybXdhcmUgaXMgbm90IHNlbmRpbmcKKwkJICogYXV0byBzZW5zZSBkYXRhCisJCSAqLworCQlzdHJ1Y3QgIHsKKwkJCXU4ICpzZW5zZV9idWZmZXI7CisJCQlkbWFfYWRkcl90IHNlbnNlX2J1ZmZlcl9kbWE7CisJCX07CisJfTsKIH07CiAKIC8qCkBAIC01NjgsNiArNjA5LDcgQEAKICAqLwogc3RydWN0IHBtY3JhaWRfaW50ZXJydXB0cyB7CiAJdm9pZCBfX2lvbWVtICppb2FfaG9zdF9pbnRlcnJ1cHRfcmVnOworCXZvaWQgX19pb21lbSAqaW9hX2hvc3RfbXNpeF9pbnRlcnJ1cHRfcmVnOwogCXZvaWQgX19pb21lbSAqaW9hX2hvc3RfaW50ZXJydXB0X2Nscl9yZWc7CiAJdm9pZCBfX2lvbWVtICppb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19yZWc7CiAJdm9pZCBfX2lvbWVtICppb2FfaG9zdF9pbnRlcnJ1cHRfbWFza19jbHJfcmVnOwpAQCAtNTc4LDExICs2MjAsMTIgQEAKIAogLyogSVNSIHBhcmFtZXRlcnMgTExEIGFsbG9jYXRlcyAob25lIGZvciBlYWNoIE1TSS1YIGlmIGVuYWJsZWQpIHZlY3RvcnMgKi8KIHN0cnVjdCBwbWNyYWlkX2lzcl9wYXJhbSB7Ci0JdTggaHJycV9pZDsJCQkvKiBocnJxIGVudHJ5IGluZGV4ICovCi0JdTE2IHZlY3RvcjsJCQkvKiBhbGxvY2F0ZWQgbXNpLXggdmVjdG9yICovCiAJc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKmRydl9pbnN0OworCXUxNiB2ZWN0b3I7CQkJLyogYWxsb2NhdGVkIG1zaS14IHZlY3RvciAqLworCXU4IGhycnFfaWQ7CQkJLyogaHJycSBlbnRyeSBpbmRleCAqLwogfTsKIAorCiAvKiBBRU4gbWVzc2FnZSBoZWFkZXIgc2VudCBhcyBwYXJ0IG9mIGV2ZW50IGRhdGEgdG8gYXBwbGljYXRpb25zICovCiBzdHJ1Y3QgcG1jcmFpZF9hZW5fbXNnIHsKIAl1MzIgaG9zdG5vOwpAQCAtNTkxLDYgKzYzNCwxOSBAQAogCXU4ICBkYXRhWzBdOwogfTsKIAorLyogQ29udHJvbGxlciBzdGF0ZSBldmVudCBtZXNzYWdlIHR5cGUgKi8KK3N0cnVjdCBwbWNyYWlkX3N0YXRlX21zZyB7CisJc3RydWN0IHBtY3JhaWRfYWVuX21zZyBtc2c7CisJdTMyIGlvYV9zdGF0ZTsKK307CisKKyNkZWZpbmUgUE1DX0RFVklDRV9FVkVOVF9SRVNFVF9TVEFSVAkJMHgxMTAwMDAwMAorI2RlZmluZSBQTUNfREVWSUNFX0VWRU5UX1JFU0VUX1NVQ0NFU1MJCTB4MTEwMDAwMDEKKyNkZWZpbmUgUE1DX0RFVklDRV9FVkVOVF9SRVNFVF9GQUlMRUQJCTB4MTEwMDAwMDIKKyNkZWZpbmUgUE1DX0RFVklDRV9FVkVOVF9TSFVURE9XTl9TVEFSVAkJMHgxMTAwMDAwMworI2RlZmluZSBQTUNfREVWSUNFX0VWRU5UX1NIVVRET1dOX1NVQ0NFU1MJMHgxMTAwMDAwNAorI2RlZmluZSBQTUNfREVWSUNFX0VWRU5UX1NIVVRET1dOX0ZBSUxFRAkweDExMDAwMDA1CisKIHN0cnVjdCBwbWNyYWlkX2hvc3RyY2IgewogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpkcnZfaW5zdDsKIAlzdHJ1Y3QgcG1jcmFpZF9hZW5fbXNnICptc2c7CkBAIC02MjgsNiArNjg0LDcgQEAKIAkvKiBIb3N0UkNCcyBuZWVkZWQgZm9yIEhDQU0gKi8KIAlzdHJ1Y3QgcG1jcmFpZF9ob3N0cmNiIGxkbjsKIAlzdHJ1Y3QgcG1jcmFpZF9ob3N0cmNiIGNjbjsKKwlzdHJ1Y3QgcG1jcmFpZF9zdGF0ZV9tc2cgc2NuOwkvKiBjb250cm9sbGVyIHN0YXRlIGNoYW5nZSBtc2cgKi8KIAogCiAJLyogQnVzIGFkZHJlc3Mgb2Ygc3RhcnQgb2YgSFJSUSAqLwpAQCAtNjQ1LDEyICs3MDIsMTUgQEAKIAkvKiBMb2NrIGZvciBIUlJRIGFjY2VzcyAqLwogCXNwaW5sb2NrX3QgaHJycV9sb2NrW1BNQ1JBSURfTlVNX01TSVhfVkVDVE9SU107CiAKKwlzdHJ1Y3QgcG1jcmFpZF9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhOworCWRtYV9hZGRyX3QgIGlucV9kYXRhX2JhZGRyOworCisJLyogc2l6ZSBvZiBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJ5LCB2YXJpZXMgYmFzZWQgb24gdGhlIGZpcm13YXJlICovCisJdTMyCWNvbmZpZ190YWJsZV9lbnRyeV9zaXplOworCiAJLyogRXhwZWN0ZWQgdG9nZ2xlIGJpdCBhdCBob3N0ICovCiAJdTggaG9zdF90b2dnbGVfYml0W1BNQ1JBSURfTlVNX01TSVhfVkVDVE9SU107CiAKLQkvKiBObyBvZiBSZXNldCBJT0EgcmV0cmllcyAuIElPQSBtYXJrZWQgZGVhZCBpZiB0aHJlc2hvbGQgZXhjZWVkcyAqLwotCXU4IGlvYV9yZXNldF9hdHRlbXB0czsKLSNkZWZpbmUgUE1DUkFJRF9SRVNFVF9BVFRFTVBUUyAzCiAKIAkvKiBXYWl0IFEgZm9yICB0aHJlYWRzIHRvIHdhaXQgZm9yIFJlc2V0IElPQSBjb21wbGV0aW9uICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfd2FpdF9xOwpAQCAtNjY0LDE0ICs3MjQsMjIgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwkvKiBtaWQgbGF5ZXIgaW50ZXJmYWNlIHN0cnVjdHVyZSBoYW5kbGUgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogUENJIGRldmljZSBzdHJ1Y3R1cmUgaGFuZGxlICovCiAKKwkvKiBObyBvZiBSZXNldCBJT0EgcmV0cmllcyAuIElPQSBtYXJrZWQgZGVhZCBpZiB0aHJlc2hvbGQgZXhjZWVkcyAqLworCXU4IGlvYV9yZXNldF9hdHRlbXB0czsKKyNkZWZpbmUgUE1DUkFJRF9SRVNFVF9BVFRFTVBUUyAzCisKIAl1OCAgY3VycmVudF9sb2dfbGV2ZWw7CS8qIGRlZmF1bHQgbGV2ZWwgZm9yIGxvZ2dpbmcgSU9BU0MgZXJyb3JzICovCiAKIAl1OCAgbnVtX2hycnE7CQkvKiBOdW1iZXIgb2YgaW50ZXJydXB0IHZlY3RvcnMgYWxsb2NhdGVkICovCisJdTggIGludGVycnVwdF9tb2RlOwkvKiBjdXJyZW50IGludGVycnVwdCBtb2RlIGxlZ2FjeSBvciBtc2l4ICovCiAJZGV2X3QgZGV2OwkJLyogTWFqb3ItTWlub3IgbnVtYmVycyBmb3IgQ2hhciBkZXZpY2UgKi8KIAogCS8qIFVzZWQgYXMgSVNSIGhhbmRsZXIgYXJndW1lbnQgKi8KIAlzdHJ1Y3QgcG1jcmFpZF9pc3JfcGFyYW0gaHJycV92ZWN0b3JbUE1DUkFJRF9OVU1fTVNJWF9WRUNUT1JTXTsKIAorCS8qIE1lc3NhZ2UgaWQgYXMgZmlsbGVkIGluIGxhc3QgZmlyZWQgSU9BUkNCLCB1c2VkIHRvIGlkZW50aWZ5IEhSUlEgKi8KKwlhdG9taWNfdCBsYXN0X21lc3NhZ2VfaWQ7CisKIAkvKiBjb25maWd1cmF0aW9uIHRhYmxlICovCiAJc3RydWN0IHBtY3JhaWRfY29uZmlnX3RhYmxlICpjZmdfdGFibGU7CiAJZG1hX2FkZHJfdCBjZmdfdGFibGVfYnVzX2FkZHI7CkBAIC02ODYsOCArNzU0LDE0IEBACiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfY21kX3Bvb2w7CiAJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX2NtZF9wb29sOwotCXNwaW5sb2NrX3QgZnJlZV9wb29sX2xvY2s7CSAJLyogZnJlZSBwb29sIGxvY2sgKi8KLQlzcGlubG9ja190IHBlbmRpbmdfcG9vbF9sb2NrOwkgCS8qIHBlbmRpbmcgcG9vbCBsb2NrICovCisJc3BpbmxvY2tfdCBmcmVlX3Bvb2xfbG9jazsJCS8qIGZyZWUgcG9vbCBsb2NrICovCisJc3BpbmxvY2tfdCBwZW5kaW5nX3Bvb2xfbG9jazsJCS8qIHBlbmRpbmcgcG9vbCBsb2NrICovCisKKwkvKiBUYXNrbGV0IHRvIGhhbmRsZSBkZWZlcnJlZCBwcm9jZXNzaW5nICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlzcl90YXNrbGV0W1BNQ1JBSURfTlVNX01TSVhfVkVDVE9SU107CisKKwkvKiBXb3JrLXF1ZXVlIChTaGFyZWQpIGZvciBkZWZlcnJlZCByZXNldCBwcm9jZXNzaW5nICovCisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtlcl9xOwogCiAJLyogTm8gb2YgSU8gY29tbWFuZHMgcGVuZGluZyB3aXRoIEZXICovCiAJYXRvbWljX3Qgb3V0c3RhbmRpbmdfY21kczsKQEAgLTY5NSwxMSArNzY5LDYgQEAKIAkvKiBzaG91bGQgYWRkL2RlbGV0ZSByZXNvdXJjZXMgdG8gbWlkLWxheWVyIG5vdyA/Ki8KIAlhdG9taWNfdCBleHBvc2VfcmVzb3VyY2VzOwogCi0JLyogVGFza2xldCB0byBoYW5kbGUgZGVmZXJyZWQgcHJvY2Vzc2luZyAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpc3JfdGFza2xldFtQTUNSQUlEX05VTV9NU0lYX1ZFQ1RPUlNdOwotCi0JLyogV29yay1xdWV1ZSAoU2hhcmVkKSBmb3IgZGVmZXJyZWQgcmVzZXQgcHJvY2Vzc2luZyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrZXJfcTsKIAogCiAJdTMyIGlvYV9zdGF0ZTo0OwkvKiBGb3IgSU9BIFJlc2V0IHNlcXVlbmNlIEZTTSAqLwpAQCAtNzI4LDcgKzc5NywxMCBAQAogLyogTExEIG1haW50YWluZWQgcmVzb3VyY2UgZW50cnkgc3RydWN0dXJlICovCiBzdHJ1Y3QgcG1jcmFpZF9yZXNvdXJjZV9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsJLyogbGluayB0byAidG8gYmUgZXhwb3NlZCIgcmVzb3VyY2VzICovCi0Jc3RydWN0IHBtY3JhaWRfY29uZmlnX3RhYmxlX2VudHJ5IGNmZ19lbnRyeTsKKwl1bmlvbiB7CisJCXN0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeSBjZmdfZW50cnk7CisJCXN0cnVjdCBwbWNyYWlkX2NvbmZpZ190YWJsZV9lbnRyeV9leHQgY2ZnX2VudHJ5X2V4dDsKKwl9OwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXY7CS8qIExpbmsgc2NzaV9kZXZpY2Ugc3RydWN0dXJlICovCiAJYXRvbWljX3QgcmVhZF9mYWlsdXJlczsJCS8qIGNvdW50IG9mIGZhaWxlZCBSRUFEIGNvbW1hbmRzICovCiAJYXRvbWljX3Qgd3JpdGVfZmFpbHVyZXM7CS8qIGNvdW50IG9mIGZhaWxlZCBXUklURSBjb21tYW5kcyAqLwpAQCAtNzcxLDczICs4NDMsNzUgQEAKICAqIHN0YXRpY2FsbHkuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcG1jcmFpZF9pb2FzY19lcnJvciBwbWNyYWlkX2lvYXNjX2Vycm9yX3RhYmxlW10gPSB7Ci0JezB4MDExODA2MDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDAxMTgwNjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIlJlY292ZXJlZCBFcnJvciwgc29mdCBtZWRpYSBlcnJvciwgc2VjdG9yIHJlYXNzaWdubWVudCBzdWdnZXN0ZWQifSwKLQl7MHgwMTVEMDAwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCi0JICJSZWNvdmVyZWQgRXJyb3IsIGZhaWx1cmUgcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQifSwKLQl7MHgwMTVEOTIwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCi0JICJSZWNvdmVyZWQgRXJyb3IsIHNvZnQgQ2FjaGUgQ2FyZCBCYXR0ZXJ5IGVycm9yIHRocmVzaG9sZCJ9LAotCXsweDAxNUQ5MjAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKLQkgIlJlY292ZXJlZCBFcnJvciwgc29mdCBDYWNoZSBDYXJkIEJhdHRlcnkgZXJyb3IgdGhyZXNob2xkIn0sCi0JezB4MDIwNDgwMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDAxNUQwMDAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKKwkgIlJlY292ZXJlZCBFcnJvciwgZmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzb2xkIGV4Y2VlZGVkIn0sCisJezB4MDE1RDkyMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAorCSAiUmVjb3ZlcmVkIEVycm9yLCBzb2Z0IENhY2hlIENhcmQgQmF0dGVyeSBlcnJvciB0aHJlc29sZCJ9LAorCXsweDAxNUQ5MjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKKwkgIlJlY292ZXJlZCBFcnJvciwgc29mdCBDYWNoZSBDYXJkIEJhdHRlcnkgZXJyb3IgdGhyZXNvbGQifSwKKwl7MHgwMjA0ODAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJOb3QgUmVhZHksIElPQSBSZXNldCBSZXF1aXJlZCJ9LAotCXsweDAyNDA4NTAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwMjQwODUwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJOb3QgUmVhZHksIElPQSBtaWNyb2NvZGUgZG93bmxvYWQgcmVxdWlyZWQifSwKLQl7MHgwMzExMEIwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDMxMTBCMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiTWVkaXVtIEVycm9yLCBkYXRhIHVucmVhZGFibGUsIHJlYXNzaWdubWVudCBzdWdnZXN0ZWQifSwKIAl7MHgwMzExMEMwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCiAJICJNZWRpdW0gRXJyb3IsIGRhdGEgdW5yZWFkYWJsZSBkbyBub3QgcmVhc3NpZ24ifSwKLQl7MHgwMzMxMDAwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDMzMTAwMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiTWVkaXVtIEVycm9yLCBtZWRpYSBjb3JydXB0ZWQifSwKLQl7MHgwNDA1MDAwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQwNTAwMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIElPQSBjYW4ndCBjb21tdW5pY2F0ZSB3aXRoIGRldmljZSJ9LAogCXsweDA0MDgwMDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKIAkgIkhhcmR3YXJlIEVycm9yLCBkZXZpY2UgYnVzIGVycm9yIn0sCi0JezB4MDQwODAwMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA0MDg4MDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKIAkgIkhhcmR3YXJlIEVycm9yLCBkZXZpY2UgYnVzIGlzIG5vdCBmdW5jdGlvbmluZyJ9LAotCXsweDA0MTE4MDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDExODAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgSU9BIHJlc2VydmVkIGFyZWEgZGF0YSBjaGVjayJ9LAotCXsweDA0MTE4MTAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDExODEwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgSU9BIHJlc2VydmVkIGFyZWEgaW52YWxpZCBkYXRhIHBhdHRlcm4ifSwKLQl7MHgwNDExODIwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQxMTgyMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIElPQSByZXNlcnZlZCBhcmVhIExSQyBlcnJvciJ9LAotCXsweDA0MzIwMDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDMyMDAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgcmVhc3NpZ25tZW50IHNwYWNlIGV4aGF1c3RlZCJ9LAotCXsweDA0MzMwMDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDMzMDAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgZGF0YSB0cmFuc2ZlciB1bmRlcmxlbmd0aCBlcnJvciJ9LAotCXsweDA0MzMwMDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDMzMDAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgZGF0YSB0cmFuc2ZlciBvdmVybGVuZ3RoIGVycm9yIn0sCiAJezB4MDQ0MTgwMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAogCSAiSGFyZHdhcmUgRXJyb3IsIFBDSSBidXMgZXJyb3IifSwKLQl7MHgwNDQ0MDAwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQ0NDAwMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIGRldmljZSBlcnJvciJ9LAotCXsweDA0NDQ4MzAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDQ0ODIwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJICJIYXJkd2FyZSBFcnJvciwgSU9BIGVycm9yIn0sCisJezB4MDQ0NDgzMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIHVuZGVmaW5lZCBkZXZpY2UgcmVzcG9uc2UifSwKLQl7MHgwNDQ0ODQwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQ0NDg0MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIElPQSBtaWNyb2NvZGUgZXJyb3IifSwKLQl7MHgwNDQ0ODYwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQ0NDg2MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIElPQSByZXNldCByZXF1aXJlZCJ9LAotCXsweDA0NDQ5MjAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDQ0OTIwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgaGFyZCBDYWNoZSBGZWFydWVlIENhcmQgQmF0dGVyeSBlcnJvciJ9LAotCXsweDA0NDRBMDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDQ0QTAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgZmFpbGVkIGRldmljZSBhbHRlcmVkIn0sCi0JezB4MDQ0NEEyMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA0NDRBMjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkhhcmR3YXJlIEVycm9yLCBkYXRhIGNoZWNrIGFmdGVyIHJlYXNzaWdubWVudCJ9LAotCXsweDA0NDRBMzAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDQ0QTMwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgTFJDIGVycm9yIGFmdGVyIHJlYXNzaWdubWVudCJ9LAotCXsweDA0NEEwMDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDRBMDAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgZGV2aWNlIGJ1cyBlcnJvciAobXNnL2NtZCBwaGFzZSkifSwKLQl7MHgwNDY3MDQwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQ2NzA0MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIG5ldyBkZXZpY2UgY2FuJ3QgYmUgdXNlZCJ9LAotCXsweDA0Njc4MDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDY3ODAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgaW52YWxpZCBtdWx0aWFkYXB0ZXIgY29uZmlndXJhdGlvbiJ9LAotCXsweDA0Njc4MTAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDY3ODEwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgaW5jb3JyZWN0IGNvbm5lY3Rpb24gYmV0d2VlbiBlbmNsb3N1cmVzIn0sCi0JezB4MDQ2NzgyMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA0Njc4MjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkhhcmR3YXJlIEVycm9yLCBjb25uZWN0aW9ucyBleGNlZWQgSU9BIGRlc2lnbiBsaW1pdHMifSwKLQl7MHgwNDY3ODMwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDQ2NzgzMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiSGFyZHdhcmUgRXJyb3IsIGluY29ycmVjdCBtdWx0aXBhdGggY29ubmVjdGlvbiJ9LAotCXsweDA0Njc5MDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNDY3OTAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJIYXJkd2FyZSBFcnJvciwgY29tbWFuZCB0byBMVU4gZmFpbGVkIn0sCiAJezB4MDY0QzgwMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiVW5pdCBBdHRlbnRpb24sIGNhY2hlIGV4aXN0cyBmb3IgbWlzc2luZy9mYWlsZWQgZGV2aWNlIn0sCkBAIC04NDUsMTUgKzkxOSwxNSBAQAogCSAiVW5pdCBBdHRlbnRpb24sIGluY29tcGF0aWJsZSBleHBvc2VkIG1vZGUgZGV2aWNlIn0sCiAJezB4MDY2NzA2MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiVW5pdCBBdHRlbnRpb24sIGF0dGFjaG1lbnQgb2YgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAotCXsweDA2Njc4MDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNjY3ODAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJVbml0IEF0dGVudGlvbiwgY2FibGVzIGV4Y2VlZCBjb25uZWN0aXZlIGRlc2lnbiBsaW1pdCJ9LAotCXsweDA2Njc4MzAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNjY3ODMwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJVbml0IEF0dGVudGlvbiwgaW5jb21wbGV0ZSBtdWx0aXBhdGggY29ubmVjdGlvbiBiZXR3ZWVuIiBcCiAJICJJT0EgYW5kIGVuY2xvc3VyZSJ9LAotCXsweDA2Njc4NDAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNjY3ODQwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJVbml0IEF0dGVudGlvbiwgaW5jb21wbGV0ZSBtdWx0aXBhdGggY29ubmVjdGlvbiBiZXR3ZWVuIiBcCiAJICJkZXZpY2UgYW5kIGVuY2xvc3VyZSJ9LAotCXsweDA2Njc4NTAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNjY3ODUwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJVbml0IEF0dGVudGlvbiwgaW5jb21wbGV0ZSBtdWx0aXBhdGggY29ubmVjdGlvbiBiZXR3ZWVuIiBcCiAJICJJT0EgYW5kIHJlbW90ZSBJT0EifSwKIAl7MHgwNjY3ODYwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCkBAIC04NjMsMTEgKzkzNywxMSBAQAogCSAiZnVuY3Rpb24ifSwKIAl7MHgwNjY5ODIwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJVbml0IEF0dGVudGlvbiwgY29ycnVwdCBhcnJheSBwYXJpdHkgZGV0ZWN0ZWQgb24gZGV2aWNlIn0sCi0JezB4MDY2QjAyMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA2NkIwMjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIlVuaXQgQXR0ZW50aW9uLCBhcnJheSBleHBvc2VkIn0sCiAJezB4MDY2QjgyMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiVW5pdCBBdHRlbnRpb24sIGV4cG9zZWQgYXJyYXkgaXMgc3RpbGwgcHJvdGVjdGVkIn0sCi0JezB4MDY2QjkyMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA2NkI5MjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIlVuaXQgQXR0ZW50aW9uLCBNdWx0aXBhdGggcmVkdW5kYW5jeSBsZXZlbCBnb3Qgd29yc2UifSwKIAl7MHgwNzI3MDAwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJEYXRhIFByb3RlY3QsIGRldmljZSBpcyByZWFkL3dyaXRlIHByb3RlY3RlZCBieSBJT0EifSwKQEAgLTg3NSwzNyArOTQ5LDM3IEBACiAJICJEYXRhIFByb3RlY3QsIElPQSBkb2Vzbid0IHN1cHBvcnQgZGV2aWNlIGF0dHJpYnV0ZSJ9LAogCXsweDA3Mjc4MTAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkRhdGEgUHJvdGVjdCwgTlZSQU0gbWlycm9yaW5nIHByb2hpYml0ZWQifSwKLQl7MHgwNzI3ODQwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDcyNzg0MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBhcnJheSBpcyBzaG9ydCAyIG9yIG1vcmUgZGV2aWNlcyJ9LAotCXsweDA3Mjc4NjAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNzI3ODYwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJEYXRhIFByb3RlY3QsIGV4cG9zZWQgYXJyYXkgaXMgc2hvcnQgYSByZXF1aXJlZCBkZXZpY2UifSwKLQl7MHgwNzI3ODcwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDcyNzg3MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBhcnJheSBtZW1iZXJzIG5vdCBhdCByZXF1aXJlZCBhZGRyZXNzZXMifSwKLQl7MHgwNzI3ODgwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDcyNzg4MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBleHBvc2VkIG1vZGUgZGV2aWNlIHJlc291cmNlIGFkZHJlc3MgY29uZmxpY3QifSwKLQl7MHgwNzI3ODkwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDcyNzg5MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBpbmNvcnJlY3QgcmVzb3VyY2UgYWRkcmVzcyBvZiBleHBvc2VkIG1vZGUgZGV2aWNlIn0sCi0JezB4MDcyNzhBMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA3Mjc4QTAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkRhdGEgUHJvdGVjdCwgQXJyYXkgaXMgbWlzc2luZyBhIGRldmljZSBhbmQgcGFyaXR5IGlzIG91dCBvZiBzeW5jIn0sCi0JezB4MDcyNzhCMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA3Mjc4QjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkRhdGEgUHJvdGVjdCwgbWF4aW11bSBudW1iZXIgb2YgYXJyYXlzIGFscmVhZHkgZXhpc3QifSwKIAl7MHgwNzI3OEMwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJEYXRhIFByb3RlY3QsIGNhbm5vdCBsb2NhdGUgY2FjaGUgZGF0YSBmb3IgZGV2aWNlIn0sCiAJezB4MDcyNzhEMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBjYWNoZSBkYXRhIGV4aXRzIGZvciBhIGNoYW5nZWQgZGV2aWNlIn0sCi0JezB4MDcyNzkxMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA3Mjc5MTAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkRhdGEgUHJvdGVjdCwgZGV0ZWN0aW9uIG9mIGEgZGV2aWNlIHJlcXVpcmluZyBmb3JtYXQifSwKLQl7MHgwNzI3OTIwMCwgSU9BU0NfTE9HX0xFVkVMX01VU1QsCisJezB4MDcyNzkyMDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBJT0EgZXhjZWVkcyBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIn0sCi0JezB4MDcyNzk2MDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA3Mjc5NjAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkRhdGEgUHJvdGVjdCwgbWlzc2luZyBhcnJheSwgdm9sdW1lIHNldCBpcyBub3QgZnVuY3Rpb25hbCJ9LAotCXsweDA3Mjc5NzAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNzI3OTcwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJEYXRhIFByb3RlY3QsIHNpbmdsZSBkZXZpY2UgZm9yIGEgdm9sdW1lIHNldCJ9LAotCXsweDA3Mjc5ODAwLCBJT0FTQ19MT0dfTEVWRUxfTVVTVCwKKwl7MHgwNzI3OTgwMCwgSU9BU0NfTE9HX0xFVkVMX0hBUkQsCiAJICJEYXRhIFByb3RlY3QsIG1pc3NpbmcgbXVsdGlwbGUgZGV2aWNlcyBmb3IgYSB2b2x1bWUgc2V0In0sCiAJezB4MDcyNzk5MDAsIElPQVNDX0xPR19MRVZFTF9IQVJELAogCSAiRGF0YSBQcm90ZWN0LCBtYXhpbXVtIG51bWJlciBvZiB2b2x1bWVudCBzZXRzIGFscmVhZHkgZXhpc3RzIn0sCi0JezB4MDcyNzlBMDAsIElPQVNDX0xPR19MRVZFTF9NVVNULAorCXsweDA3Mjc5QTAwLCBJT0FTQ19MT0dfTEVWRUxfSEFSRCwKIAkgIkRhdGEgUHJvdGVjdCwgb3RoZXIgdm9sdW1lIHNldCBwcm9ibGVtIn0sCiB9OwogCkBAIC05NTIsMjcgKzEwMjYsNiBAQAogCiAjZGVmaW5lIFBNQ1JBSURfSU9DVExfU0lHTkFUVVJFICAgICAgIlBNQ1JBSUQiCiAKLQotLyoKLSAqIHBtY3JhaWRfZXZlbnRfZGV0YWlscyAtIGRlZmluZXMgQUVOIGRldGFpbHMgdGhhdCBhcHBzIGNhbiByZXRyaWV2ZSBmcm9tIExMRAotICoKLSAqIC5yY2JfY2NuIC0gY29tcGxldGUgUkNCIG9mIENDTgotICogLnJjYl9sZG4gLSBjb21wbGV0ZSBSQ0Igb2YgQ0NOCi0gKi8KLXN0cnVjdCBwbWNyYWlkX2V2ZW50X2RldGFpbHMgewotCXN0cnVjdCBwbWNyYWlkX2hjYW1fY2NuIHJjYl9jY247Ci0Jc3RydWN0IHBtY3JhaWRfaGNhbV9sZG4gcmNiX2xkbjsKLX07Ci0KLS8qCi0gKiBwbWNyYWlkX2RyaXZlcl9pb2N0bF9idWZmZXIgLSBzdHJ1Y3R1cmUgcGFzc2VkIGFzIGFyZ3VtZW50IHRvIG1vc3Qgb2YgdGhlCi0gKiBQTUMgZHJpdmVyIGhhbmRsZWQgaW9jdGxzLgotICovCi1zdHJ1Y3QgcG1jcmFpZF9kcml2ZXJfaW9jdGxfYnVmZmVyIHsKLQlzdHJ1Y3QgcG1jcmFpZF9pb2N0bF9oZWFkZXIgaW9jdGxfaGVhZGVyOwotCXN0cnVjdCBwbWNyYWlkX2V2ZW50X2RldGFpbHMgZXZlbnRfZGV0YWlsczsKLX07Ci0KIC8qCiAgKiBwbWNyYWlkX3Bhc3N0aHJvdWdoX2lvY3RsX2J1ZmZlciAtIHN0cnVjdHVyZSBnaXZlbiBhcyBhcmd1bWVudCB0bwogICogcGFzc3Rocm91Z2gob3IgZmlybXdhcmUgaGFuZGxlZCkgSU9DVEwgY29tbWFuZHMuIE5vdGUgdGhhdCBpb2FyY2IgcmVxdWlyZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IDFlNGNhZmEuLjQyMDIzOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtMTE4Nyw2ICsxMTg3LDIxIEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90CitxbGEyeDAwX29wdHJvbV9nb2xkX2Z3X3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlpZiAoIUlTX1FMQTgxWFgoaGEpKQorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJcbiIpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJTAyZC4lMDJkICglZClcbiIsCisJICAgIGhhLT5nb2xkX2Z3X3ZlcnNpb25bMF0sIGhhLT5nb2xkX2Z3X3ZlcnNpb25bMV0sCisJICAgIGhhLT5nb2xkX2Z3X3ZlcnNpb25bMl0sIGhhLT5nb2xkX2Z3X3ZlcnNpb25bM10pOworfQorCitzdGF0aWMgc3NpemVfdAogcWxhMngwMF90b3RhbF9pc3BfYWJvcnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTEyMDgsNyArMTIyMyw3IEBACiAJaWYgKCFJU19RTEE4NFhYKGhhKSkKIAkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiXG4iKTsKIAotCWlmIChoYS0+Y3M4NHh4ICYmIGhhLT5jczg0eHgtPm9wX2Z3X3ZlcnNpb24gPT0gMCkKKwlpZiAoaGEtPmNzODR4eC0+b3BfZndfdmVyc2lvbiA9PSAwKQogCQlydmFsID0gcWxhODR4eF92ZXJpZnlfY2hpcCh2aGEsIHN0YXR1cyk7CiAKIAlpZiAoKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpICYmIChzdGF0dXNbMF0gPT0gMCkpCkBAIC0xMzM2LDYgKzEzNTEsOCBAQAogCQkgICBxbGEyeDAwX29wdHJvbV9mY29kZV92ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKG9wdHJvbV9md192ZXJzaW9uLCBTX0lSVUdPLCBxbGEyeDAwX29wdHJvbV9md192ZXJzaW9uX3Nob3csCiAJCSAgIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG9wdHJvbV9nb2xkX2Z3X3ZlcnNpb24sIFNfSVJVR08sCisgICAgcWxhMngwMF9vcHRyb21fZ29sZF9md192ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKDg0eHhfZndfdmVyc2lvbiwgU19JUlVHTywgcWxhMjR4eF84NHh4X2Z3X3ZlcnNpb25fc2hvdywKIAkJICAgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIodG90YWxfaXNwX2Fib3J0cywgU19JUlVHTywgcWxhMngwMF90b3RhbF9pc3BfYWJvcnRzX3Nob3csCkBAIC0xMzc2LDYgKzEzOTMsNyBAQAogCSZkZXZfYXR0cl92bl9wb3J0X21hY19hZGRyZXNzLAogCSZkZXZfYXR0cl9mYWJyaWNfcGFyYW0sCiAJJmRldl9hdHRyX2Z3X3N0YXRlLAorCSZkZXZfYXR0cl9vcHRyb21fZ29sZF9md192ZXJzaW9uLAogCU5VTEwsCiB9OwogCkBAIC0xNzMyLDcgKzE3NTAsNyBAQAogCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGZjX3Zwb3J0LCBGQ19WUE9SVF9MSU5LRE9XTik7CiAJfQogCi0JaWYgKElTX1FMQTI1WFgoaGEpICYmIHFsMnhlbmFibGVkaWYpIHsKKwlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBxbDJ4ZW5hYmxlZGlmKSB7CiAJCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF80KSB7CiAJCQl2aGEtPmZsYWdzLmRpZmRpeF9zdXBwb3J0ZWQgPSAxOwogCQkJREVCVUcxOChxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCkBAIC0xNzQwLDggKzE3NTgsMTAgQEAKIAkJCSAgICAiIHByb3RlY3Rpb24uXG4iKSk7CiAJCQlzY3NpX2hvc3Rfc2V0X3Byb3QodmhhLT5ob3N0LAogCQkJICAgIFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OCisJCQkgICAgfCBTSE9TVF9ESUZfVFlQRTJfUFJPVEVDVElPTgogCQkJICAgIHwgU0hPU1RfRElGX1RZUEUzX1BST1RFQ1RJT04KIAkJCSAgICB8IFNIT1NUX0RJWF9UWVBFMV9QUk9URUNUSU9OCisJCQkgICAgfCBTSE9TVF9ESVhfVFlQRTJfUFJPVEVDVElPTgogCQkJICAgIHwgU0hPU1RfRElYX1RZUEUzX1BST1RFQ1RJT04pOwogCQkJc2NzaV9ob3N0X3NldF9ndWFyZCh2aGEtPmhvc3QsIFNIT1NUX0RJWF9HVUFSRF9DUkMpOwogCQl9IGVsc2UKQEAgLTE4MDksNyArMTgyOSw2IEBACiBxbGEyNHh4X3Zwb3J0X2RlbGV0ZShzdHJ1Y3QgZmNfdnBvcnQgKmZjX3Zwb3J0KQogewogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gZmNfdnBvcnQtPmRkX2RhdGE7Ci0JZmNfcG9ydF90ICpmY3BvcnQsICp0ZmNwb3J0OwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXVpbnQxNl90IGlkID0gdmhhLT52cF9pZHg7CiAKQEAgLTE4MjMsMTEgKzE4NDIsNyBAQAogCiAJc2NzaV9yZW1vdmVfaG9zdCh2aGEtPmhvc3QpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgdGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgewotCQlsaXN0X2RlbCgmZmNwb3J0LT5saXN0KTsKLQkJa2ZyZWUoZmNwb3J0KTsKLQkJZmNwb3J0ID0gTlVMTDsKLQl9CisJcWxhMngwMF9mcmVlX2ZjcG9ydHModmhhKTsKIAogCXFsYTI0eHhfZGVhbGxvY2F0ZV92cF9pZCh2aGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKaW5kZXggYjkwNWRmZS4uOTA2NzYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtNDEsMTMgKzQxLDI4IEBACiAJaW50IGksIHJldCwgbnVtX3ZhbGlkOwogCXVpbnQ4X3QgKmJjb2RlOwogCXN0cnVjdCBxbGFfZmNwX3ByaW9fZW50cnkgKnByaV9lbnRyeTsKKwl1aW50MzJfdCAqYmNvZGVfdmFsX3B0ciwgYmNvZGVfdmFsOwogCiAJcmV0ID0gMTsKIAludW1fdmFsaWQgPSAwOwogCWJjb2RlID0gKHVpbnQ4X3QgKilwcmlfY2ZnOworCWJjb2RlX3ZhbF9wdHIgPSAodWludDMyX3QgKilwcmlfY2ZnOworCWJjb2RlX3ZhbCA9ICh1aW50MzJfdCkoKmJjb2RlX3ZhbF9wdHIpOwogCi0JaWYgKGJjb2RlWzB4MF0gIT0gJ0gnIHx8IGJjb2RlWzB4MV0gIT0gJ1EnIHx8IGJjb2RlWzB4Ml0gIT0gJ08nIHx8Ci0JCQliY29kZVsweDNdICE9ICdTJykgeworCWlmIChiY29kZV92YWwgPT0gMHhGRkZGRkZGRikgeworCQkvKiBObyBGQ1AgUHJpb3JpdHkgY29uZmlnIGRhdGEgaW4gZmxhc2ggKi8KKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICIlczogTm8gRkNQIHByaW9yaXR5IGNvbmZpZyBkYXRhLlxuIiwKKwkJICAgIF9fZnVuY19fKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChiY29kZVswXSAhPSAnSCcgfHwgYmNvZGVbMV0gIT0gJ1EnIHx8IGJjb2RlWzJdICE9ICdPJyB8fAorCQkJYmNvZGVbM10gIT0gJ1MnKSB7CisJCS8qIEludmFsaWQgRkNQIHByaW9yaXR5IGRhdGEgaGVhZGVyKi8KKwkJREVCVUcyKHByaW50ayhLRVJOX0VSUgorCQkgICAgIiVzOiBJbnZhbGlkIEZDUCBQcmlvcml0eSBkYXRhIGhlYWRlci4gYmNvZGU9MHgleFxuIiwKKwkJICAgIF9fZnVuY19fLCBiY29kZV92YWwpKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChmbGFnICE9IDEpCkBAIC02MCw4ICs3NSwxOCBAQAogCQlwcmlfZW50cnkrKzsKIAl9CiAKLQlpZiAobnVtX3ZhbGlkID09IDApCisJaWYgKG51bV92YWxpZCA9PSAwKSB7CisJCS8qIE5vIHZhbGlkIEZDUCBwcmlvcml0eSBkYXRhIGVudHJpZXMgKi8KKwkJREVCVUcyKHByaW50ayhLRVJOX0VSUgorCQkgICAgIiVzOiBObyB2YWxpZCBGQ1AgUHJpb3JpdHkgZGF0YSBlbnRyaWVzLlxuIiwKKwkJICAgIF9fZnVuY19fKSk7CiAJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJLyogRkNQIHByaW9yaXR5IGRhdGEgaXMgdmFsaWQgKi8KKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICIlczogVmFsaWQgRkNQIHByaW9yaXR5IGRhdGEuIG51bSBlbnRyaWVzID0gJWRcbiIsCisJCSAgICBfX2Z1bmNfXywgbnVtX3ZhbGlkKSk7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc4LDYgKzEwMywxMSBAQAogCiAJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CiAKKwlpZiAoIUlTX1FMQTI0WFhfVFlQRShoYSkgfHwgIUlTX1FMQTI1WFgoaGEpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdF9mY3BfcHJpb19jZmc7CisJfQorCiAJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKIAkJdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCQl0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKQEAgLTE5OSw3ICsyMjksNyBAQAogcWxhMngwMF9wcm9jZXNzX2VscyhzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYikKIHsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OwotCWZjX3BvcnRfdCAqZmNwb3J0OworCWZjX3BvcnRfdCAqZmNwb3J0ID0gTlVMTDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXNjc2lfcWxhX2hvc3RfdCAqdmhhOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGE7CkBAIC0yMTAsNiArMjQwLDI5IEBACiAJdWludDE2X3QgbmV4dGxpZCA9IDA7CiAJc3RydWN0IHNyYl9jdHggKmVsczsKIAorCWlmIChic2dfam9iLT5yZXF1ZXN0LT5tc2djb2RlID09IEZDX0JTR19SUFRfRUxTKSB7CisJCXJwb3J0ID0gYnNnX2pvYi0+cnBvcnQ7CisJCWZjcG9ydCA9ICooZmNfcG9ydF90ICoqKSBycG9ydC0+ZGRfZGF0YTsKKwkJaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKwkJdmhhID0gc2hvc3RfcHJpdihob3N0KTsKKwkJaGEgPSB2aGEtPmh3OworCQl0eXBlID0gIkZDX0JTR19SUFRfRUxTIjsKKwl9IGVsc2UgeworCQlob3N0ID0gYnNnX2pvYi0+c2hvc3Q7CisJCXZoYSA9IHNob3N0X3ByaXYoaG9zdCk7CisJCWhhID0gdmhhLT5odzsKKwkJdHlwZSA9ICJGQ19CU0dfSFNUX0VMU19OT0xPR0lOIjsKKwl9CisKKwkvKiBwYXNzIHRocm91Z2ggaXMgc3VwcG9ydGVkIG9ubHkgZm9yIElTUCA0R2Igb3IgaGlnaGVyICovCisJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKSB7CisJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAic2NzaSglbGQpOkVMUyBwYXNzdGhydSBub3Qgc3VwcG9ydGVkIGZvciBJU1AyM3h4IGJhc2VkICIKKwkJICAgICJhZGFwdGVyc1xuIiwgdmhhLT5ob3N0X25vKSk7CisJCXJ2YWwgPSAtRVBFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKIAkvKiAgTXVsdGlwbGUgU0cncyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgRUxTIHJlcXVlc3RzICovCiAJaWYgKGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQgPiAxIHx8CiAJCWJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250ID4gMSkgewpAQCAtMjI0LDEzICsyNzcsNiBAQAogCiAJLyogRUxTIHJlcXVlc3QgZm9yIHJwb3J0ICovCiAJaWYgKGJzZ19qb2ItPnJlcXVlc3QtPm1zZ2NvZGUgPT0gRkNfQlNHX1JQVF9FTFMpIHsKLQkJcnBvcnQgPSBic2dfam9iLT5ycG9ydDsKLQkJZmNwb3J0ID0gKihmY19wb3J0X3QgKiopIHJwb3J0LT5kZF9kYXRhOwotCQlob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOwotCQl2aGEgPSBzaG9zdF9wcml2KGhvc3QpOwotCQloYSA9IHZoYS0+aHc7Ci0JCXR5cGUgPSAiRkNfQlNHX1JQVF9FTFMiOwotCiAJCS8qIG1ha2Ugc3VyZSB0aGUgcnBvcnQgaXMgbG9nZ2VkIGluLAogCQkgKiBpZiBub3QgcGVyZm9ybSBmYWJyaWMgbG9naW4KIAkJICovCkBAIC0yNDIsMTEgKzI4OCw2IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAl9IGVsc2UgewotCQlob3N0ID0gYnNnX2pvYi0+c2hvc3Q7Ci0JCXZoYSA9IHNob3N0X3ByaXYoaG9zdCk7Ci0JCWhhID0gdmhhLT5odzsKLQkJdHlwZSA9ICJGQ19CU0dfSFNUX0VMU19OT0xPR0lOIjsKLQogCQkvKiBBbGxvY2F0ZSBhIGR1bW15IGZjcG9ydCBzdHJ1Y3R1cmUsIHNpbmNlIGZ1bmN0aW9ucwogCQkgKiBwcmVwYXJpbmcgdGhlIElPQ0IgYW5kIG1haWxib3ggY29tbWFuZCByZXRyaWV2ZXMgcG9ydAogCQkgKiBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIGZjcG9ydCBzdHJ1Y3R1cmUuIEZvciBIb3N0IGJhc2VkCkBAIC0zNjYsMTUgKzQwNyw2IEBACiAJY2hhciAgKnR5cGUgPSAiRkNfQlNHX0hTVF9DVCI7CiAJc3RydWN0IHNyYl9jdHggKmN0OwogCi0JLyogcGFzcyB0aHJvdWdoIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBJU1AgNEdiIG9yIGhpZ2hlciAqLwotCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgInNjc2koJWxkKTpGaXJtd2FyZSBpcyBub3QgY2FwYWJsZSB0byBzdXBwb3J0IEZDICIKLQkJICAgICJDVCBwYXNzIHRocnVcbiIsIHZoYS0+aG9zdF9ubykpOwotCQlydmFsID0gLUVQRVJNOwotCQlnb3RvIGRvbmU7Ci0JfQotCiAJcmVxX3NnX2NudCA9CiAJCWRtYV9tYXBfc2coJmhhLT5wZGV2LT5kZXYsIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAogCQkJYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgRE1BX1RPX0RFVklDRSk7CkBAIC00ODMsNiArNTE1LDk4IEBACiAJcmV0dXJuIHJ2YWw7CiB9CiAKKy8qIFNldCB0aGUgcG9ydCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUKKyAqIGludGVybmFsIGxvb3BiYWNrIG9uIElTUDgxWFgKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3FsYTgxeHhfc2V0X2ludGVybmFsX2xvb3BiYWNrKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCAqY29uZmlnLAorICAgIHVpbnQxNl90ICpuZXdfY29uZmlnKQoreworCWludCByZXQgPSAwOworCWludCBydmFsID0gMDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWlmICghSVNfUUxBODFYWChoYSkpCisJCWdvdG8gZG9uZV9zZXRfaW50ZXJuYWw7CisKKwluZXdfY29uZmlnWzBdID0gY29uZmlnWzBdIHwgKEVOQUJMRV9JTlRFUk5BTF9MT09QQkFDSyA8PCAxKTsKKwltZW1jcHkoJm5ld19jb25maWdbMV0sICZjb25maWdbMV0sIHNpemVvZih1aW50MTZfdCkgKiAzKSA7CisKKwloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDE7CisJcmV0ID0gcWxhODF4eF9zZXRfcG9ydF9jb25maWcodmhhLCBuZXdfY29uZmlnKTsKKwlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoS0VSTl9FUlIKKwkJICAgICIlcyglbHUpOiBTZXQgcG9ydCBjb25maWcgZmFpbGVkXG4iLAorCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDA7CisJCXJ2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmVfc2V0X2ludGVybmFsOworCX0KKworCS8qIFdhaXQgZm9yIERDQlggY29tcGxldGUgZXZlbnQgKi8KKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaGEtPmRjYnhfY29tcCwgKDIwICogSFopKSkgeworCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIlN0YXRlIGNoYW5nZSBub3RpZmljYWl0aW9uIG5vdCByZWNlaXZlZC5cbiIpKTsKKwl9IGVsc2UKKwkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJTdGF0ZSBjaGFuZ2UgUkVDRUlWRURcbiIpKTsKKworCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKKworZG9uZV9zZXRfaW50ZXJuYWw6CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qIFNldCB0aGUgcG9ydCBjb25maWd1cmF0aW9uIHRvIGRpc2FibGUgdGhlCisgKiBpbnRlcm5hbCBsb29wYmFjayBvbiBJU1A4MVhYCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitxbGE4MXh4X3Jlc2V0X2ludGVybmFsX2xvb3BiYWNrKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCAqY29uZmlnLAorICAgIGludCB3YWl0KQoreworCWludCByZXQgPSAwOworCWludCBydmFsID0gMDsKKwl1aW50MTZfdCBuZXdfY29uZmlnWzRdOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJaWYgKCFJU19RTEE4MVhYKGhhKSkKKwkJZ290byBkb25lX3Jlc2V0X2ludGVybmFsOworCisJbWVtc2V0KG5ld19jb25maWcsIDAgLCBzaXplb2YobmV3X2NvbmZpZykpOworCWlmICgoY29uZmlnWzBdICYgSU5URVJOQUxfTE9PUEJBQ0tfTUFTSykgPj4gMSA9PQorCQkJRU5BQkxFX0lOVEVSTkFMX0xPT1BCQUNLKSB7CisJCW5ld19jb25maWdbMF0gPSBjb25maWdbMF0gJiB+SU5URVJOQUxfTE9PUEJBQ0tfTUFTSzsKKwkJbWVtY3B5KCZuZXdfY29uZmlnWzFdLCAmY29uZmlnWzFdLCBzaXplb2YodWludDE2X3QpICogMykgOworCisJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gd2FpdDsKKwkJcmV0ID0gcWxhODF4eF9zZXRfcG9ydF9jb25maWcodmhhLCBuZXdfY29uZmlnKTsKKwkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgeworCQkJREVCVUcyKHByaW50ayhLRVJOX0VSUgorCQkJICAgICIlcyglbHUpOiBTZXQgcG9ydCBjb25maWcgZmFpbGVkXG4iLAorCQkJICAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDA7CisJCQlydmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZV9yZXNldF9pbnRlcm5hbDsKKwkJfQorCisJCS8qIFdhaXQgZm9yIERDQlggY29tcGxldGUgZXZlbnQgKi8KKwkJaWYgKHdhaXQgJiYgIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaGEtPmRjYnhfY29tcCwKKwkJCSgyMCAqIEhaKSkpIHsKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIlN0YXRlIGNoYW5nZSBub3RpZmljYWl0aW9uIG5vdCByZWNlaXZlZC5cbiIpKTsKKwkJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKKwkJCXJ2YWwgPSAtRUlOVkFMOworCQkJZ290byBkb25lX3Jlc2V0X2ludGVybmFsOworCQl9IGVsc2UKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAgIlN0YXRlIGNoYW5nZSBSRUNFSVZFRFxuIikpOworCisJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKKwl9Citkb25lX3Jlc2V0X2ludGVybmFsOgorCXJldHVybiBydmFsOworfQorCiBzdGF0aWMgaW50CiBxbGEyeDAwX3Byb2Nlc3NfbG9vcGJhY2soc3RydWN0IGZjX2JzZ19qb2IgKmJzZ19qb2IpCiB7CkBAIC00OTQsNiArNjE4LDcgQEAKIAljaGFyICp0eXBlOwogCXN0cnVjdCBtc2dfZWNob19sYiBlbHJlcTsKIAl1aW50MTZfdCByZXNwb25zZVtNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwl1aW50MTZfdCBjb25maWdbNF0sIG5ld19jb25maWdbNF07CiAJdWludDhfdCAqZndfc3RzX3B0cjsKIAl1aW50OF90ICpyZXFfZGF0YSA9IE5VTEw7CiAJZG1hX2FkZHJfdCByZXFfZGF0YV9kbWE7CkBAIC01NjgsMjkgKzY5MywxMDIgQEAKIAogCWVscmVxLm9wdGlvbnMgPSBic2dfam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKIAotCWlmIChoYS0+Y3VycmVudF90b3BvbG9neSAhPSBJU1BfQ0ZHX0YpIHsKLQkJdHlwZSA9ICJGQ19CU0dfSFNUX1ZFTkRPUl9MT09QQkFDSyI7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkic2NzaSglbGQpIGJzZyBycXN0IHR5cGU6ICVzXG4iLAotCQkJdmhhLT5ob3N0X25vLCB0eXBlKSk7Ci0KLQkJY29tbWFuZF9zZW50ID0gSU5UX0RFRl9MQl9MT09QQkFDS19DTUQ7Ci0JCXJ2YWwgPSBxbGEyeDAwX2xvb3BiYWNrX3Rlc3QodmhhLCAmZWxyZXEsIHJlc3BvbnNlKTsKLQkJaWYgKElTX1FMQTgxWFgoaGEpKSB7Ci0JCQlpZiAocmVzcG9uc2VbMF0gPT0gTUJTX0NPTU1BTkRfRVJST1IgJiYKLQkJCQlyZXNwb25zZVsxXSA9PSBNQlNfTEJfUkVTRVQpIHsKLQkJCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBBQk9SVGluZyAiCi0JCQkJIklTUFxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKLQkJCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgeworCWlmICgoaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPT0gSVNQX0NGR19GIHx8CisJICAgIChJU19RTEE4MVhYKGhhKSAmJgorCSAgICBsZTMyX3RvX2NwdSgqKHVpbnQzMl90ICopcmVxX2RhdGEpID09IEVMU19PUENPREVfQllURQorCSAgICAmJiByZXFfZGF0YV9sZW4gPT0gTUFYX0VMU19GUkFNRV9QQVlMT0FEKSkgJiYKKwkJZWxyZXEub3B0aW9ucyA9PSBFWFRFUk5BTF9MT09QQkFDSykgewogCQl0eXBlID0gIkZDX0JTR19IU1RfVkVORE9SX0VDSE9fRElBRyI7CiAJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAic2NzaSglbGQpIGJzZyBycXN0IHR5cGU6ICVzXG4iLCB2aGEtPmhvc3Rfbm8sIHR5cGUpKTsKKwkJCSJzY3NpKCVsZCkgYnNnIHJxc3QgdHlwZTogJXNcbiIsIHZoYS0+aG9zdF9ubywgdHlwZSkpOwogCQljb21tYW5kX3NlbnQgPSBJTlRfREVGX0xCX0VDSE9fQ01EOwogCQlydmFsID0gcWxhMngwMF9lY2hvX3Rlc3QodmhhLCAmZWxyZXEsIHJlc3BvbnNlKTsKKwl9IGVsc2UgeworCQlpZiAoSVNfUUxBODFYWChoYSkpIHsKKwkJCW1lbXNldChjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwkJCW1lbXNldChuZXdfY29uZmlnLCAwLCBzaXplb2YobmV3X2NvbmZpZykpOworCQkJaWYgKHFsYTgxeHhfZ2V0X3BvcnRfY29uZmlnKHZoYSwgY29uZmlnKSkgeworCQkJCURFQlVHMihwcmludGsoS0VSTl9FUlIKKwkJCQkJIiVzKCVsdSk6IEdldCBwb3J0IGNvbmZpZyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKwkJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJCQkJcnZhbCA9IC1FUEVSTTsKKwkJCQlnb3RvIGRvbmVfZnJlZV9kbWFfcmVxOworCQkJfQorCisJCQlpZiAoZWxyZXEub3B0aW9ucyAhPSBFWFRFUk5BTF9MT09QQkFDSykgeworCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJCSJJbnRlcm5hbDogY3VycmVudCBwb3J0IGNvbmZpZyA9ICV4XG4iLAorCQkJCQljb25maWdbMF0pKTsKKwkJCQlpZiAocWxhODF4eF9zZXRfaW50ZXJuYWxfbG9vcGJhY2sodmhhLCBjb25maWcsCisJCQkJCW5ld19jb25maWcpKSB7CisJCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkJCQkJMDsKKwkJCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9CisJCQkJCQkoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkJcnZhbCA9IC1FUEVSTTsKKwkJCQkJZ290byBkb25lX2ZyZWVfZG1hX3JlcTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIEZvciBleHRlcm5hbCBsb29wYmFjayB0byB3b3JrCisJCQkJICogZW5zdXJlIGludGVybmFsIGxvb3BiYWNrIGlzIGRpc2FibGVkCisJCQkJICovCisJCQkJaWYgKHFsYTgxeHhfcmVzZXRfaW50ZXJuYWxfbG9vcGJhY2sodmhhLAorCQkJCQljb25maWcsIDEpKSB7CisJCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkJCQkJMDsKKwkJCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9CisJCQkJCQkoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkJcnZhbCA9IC1FUEVSTTsKKwkJCQkJZ290byBkb25lX2ZyZWVfZG1hX3JlcTsKKwkJCQl9CisJCQl9CisKKwkJCXR5cGUgPSAiRkNfQlNHX0hTVF9WRU5ET1JfTE9PUEJBQ0siOworCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkic2NzaSglbGQpIGJzZyBycXN0IHR5cGU6ICVzXG4iLAorCQkJCXZoYS0+aG9zdF9ubywgdHlwZSkpOworCisJCQljb21tYW5kX3NlbnQgPSBJTlRfREVGX0xCX0xPT1BCQUNLX0NNRDsKKwkJCXJ2YWwgPSBxbGEyeDAwX2xvb3BiYWNrX3Rlc3QodmhhLCAmZWxyZXEsIHJlc3BvbnNlKTsKKworCQkJaWYgKG5ld19jb25maWdbMV0pIHsKKwkJCQkvKiBSZXZlcnQgYmFjayB0byBvcmlnaW5hbCBwb3J0IGNvbmZpZworCQkJCSAqIEFsc28gY2xlYXIgaW50ZXJuYWwgbG9vcGJhY2sKKwkJCQkgKi8KKwkJCQlxbGE4MXh4X3Jlc2V0X2ludGVybmFsX2xvb3BiYWNrKHZoYSwKKwkJCQkgICAgbmV3X2NvbmZpZywgMCk7CisJCQl9CisKKwkJCWlmIChyZXNwb25zZVswXSA9PSBNQlNfQ09NTUFORF9FUlJPUiAmJgorCQkJCQlyZXNwb25zZVsxXSA9PSBNQlNfTEJfUkVTRVQpIHsKKwkJCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBBQk9SVGluZyAiCisJCQkJCSJJU1BcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJCQkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOworCQkJCXFsYTJ4MDBfd2FpdF9mb3JfY2hpcF9yZXNldCh2aGEpOworCQkJCS8qIEFsc28gcmVzZXQgdGhlIE1QSSAqLworCQkJCWlmIChxbGE4MXh4X3Jlc3RhcnRfbXBpX2Zpcm13YXJlKHZoYSkgIT0KKwkJCQkgICAgUUxBX1NVQ0NFU1MpIHsKKwkJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCQkgICAgIk1QSSByZXNldCBmYWlsZWQgZm9yIGhvc3QlbGQuXG4iLAorCQkJCQkgICAgdmhhLT5ob3N0X25vKTsKKwkJCQl9CisKKwkJCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKwkJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJCQkJcnZhbCA9IC1FSU87CisJCQkJZ290byBkb25lX2ZyZWVfZG1hX3JlcTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXR5cGUgPSAiRkNfQlNHX0hTVF9WRU5ET1JfTE9PUEJBQ0siOworCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkic2NzaSglbGQpIGJzZyBycXN0IHR5cGU6ICVzXG4iLAorCQkJCXZoYS0+aG9zdF9ubywgdHlwZSkpOworCQkJY29tbWFuZF9zZW50ID0gSU5UX0RFRl9MQl9MT09QQkFDS19DTUQ7CisJCQlydmFsID0gcWxhMngwMF9sb29wYmFja190ZXN0KHZoYSwgJmVscmVxLCByZXNwb25zZSk7CisJCX0KIAl9CiAKIAlpZiAocnZhbCkgewpAQCAtMTA1Niw2ICsxMjU0LDIwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChmY3BvcnQtPmxvb3BfaWQgPT0gRkNfTk9fTE9PUF9JRCkgeworCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBJbnZhbGlkIHBvcnQgbG9vcCBpZCwgIgorCQkJImxvb3BfaWQgPSAweCV4XG4iLAorCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmY3BvcnQtPmZsYWdzICYgRkNGX0xPR0lOX05FRURFRCkgeworCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBSZW1vdGUgcG9ydCBub3QgbG9nZ2VkIGluLCAiCisJCSAgICAiZmxhZ3MgPSAweCV4XG4iLAorCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5mbGFncykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAocG9ydF9wYXJhbS0+bW9kZSkKIAkJcnZhbCA9IHFsYTJ4MDBfc2V0X2lkbWFfc3BlZWQodmhhLCBmY3BvcnQtPmxvb3BfaWQsCiAJCQlwb3J0X3BhcmFtLT5zcGVlZCwgbWIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5oCmluZGV4IDc2ZWQ5MmQuLmNjN2M1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgotICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEwIFFMb2dpYyBDb3Jwb3JhdGlvbgogICoKICAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KQEAgLTE5LDYgKzE5LDEzIEBACiAjZGVmaW5lIElOVF9ERUZfTEJfTE9PUEJBQ0tfQ01EICAgICAgICAgMAogI2RlZmluZSBJTlRfREVGX0xCX0VDSE9fQ01EICAgICAgICAgICAgIDEKIAorLyogTG9vcGJhY2sgcmVsYXRlZCBkZWZpbmF0aW9ucyAqLworI2RlZmluZSBFWFRFUk5BTF9MT09QQkFDSwkJMHhGMgorI2RlZmluZSBFTkFCTEVfSU5URVJOQUxfTE9PUEJBQ0sJMHgwMgorI2RlZmluZSBJTlRFUk5BTF9MT09QQkFDS19NQVNLCQkweDAwMEUKKyNkZWZpbmUgTUFYX0VMU19GUkFNRV9QQVlMT0FECQkyNTIKKyNkZWZpbmUgRUxTX09QQ09ERV9CWVRFCQkJMHgxMAorCiAvKiBCU0cgVmVuZG9yIHNwZWNpZmljIGRlZmluYXRpb25zICovCiAjZGVmaW5lIEE4NF9JU1NVRV9XUklURV9UWVBFX0NNRCAgICAgICAgMAogI2RlZmluZSBBODRfSVNTVUVfUkVBRF9UWVBFX0NNRCAgICAgICAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCAyYWZjOGEzLi4wOTYxNDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKLSAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAwOCBRTG9naWMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMCBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggOTE2YzgxZi4uNmNmYzI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IDgzOTYxMDkuLjNhNDMyZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgotICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEwIFFMb2dpYyBDb3Jwb3JhdGlvbgogICoKICAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KQEAgLTIwMiw2ICsyMDIsNyBAQAogICogU0NTSSBSZXF1ZXN0IEJsb2NrCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNyYiB7CisJYXRvbWljX3QgcmVmX2NvdW50OwogCXN0cnVjdCBmY19wb3J0ICpmY3BvcnQ7CiAJdWludDMyX3QgaGFuZGxlOwogCkBAIC0yNDksMTYgKzI1MCw2IEBACiAJCQl1aW50MzJfdCBsdW47CiAJCQl1aW50MzJfdCBkYXRhOwogCQl9IHRtZjsKLQkJc3RydWN0IHsKLQkJCS8qCi0JCQkgKiB2YWx1ZXMgZm9yIG1vZGlmIGZpZWxkIGJlbG93IGFyZSBhcwotCQkJICogZGVmaW5lZCBpbiBtcmtfZW50cnlfMjR4eCBzdHJ1Y3QKLQkJCSAqIGZvciB0aGUgbW9kaWZpZXIgZmllbGQgaW4gcWxhX2Z3LmguCi0JCQkgKi8KLQkJCXVpbnQ4X3QgbW9kaWY7Ci0JCQl1aW50MTZfdCBsdW47Ci0JCQl1aW50MzJfdCBkYXRhOwotCQl9IG1hcmtlcjsKIAl9IHU7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKQEAgLTI3Niw3ICsyNjcsNiBAQAogI2RlZmluZSBTUkJfQ1RfQ01ECTUKICNkZWZpbmUgU1JCX0FESVNDX0NNRAk2CiAjZGVmaW5lIFNSQl9UTV9DTUQJNwotI2RlZmluZSBTUkJfTUFSS0VSX0NNRAk4CiAKIHN0cnVjdCBzcmJfY3R4IHsKIAl1aW50MTZfdCB0eXBlOwpAQCAtNzEzLDYgKzcwMyw4IEBACiAjZGVmaW5lIE1CQ19TRU5EX1JORlRfRUxTCQkweDVlCS8qIFNlbmQgUk5GVCBFTFMgcmVxdWVzdCAqLwogI2RlZmluZSBNQkNfR0VUX0xJTktfUFJJVl9TVEFUUwkJMHg2ZAkvKiBHZXQgbGluayAmIHByaXZhdGUgZGF0YS4gKi8KICNkZWZpbmUgTUJDX1NFVF9WRU5ET1JfSUQJCTB4NzYJLyogU2V0IFZlbmRvciBJRC4gKi8KKyNkZWZpbmUgTUJDX1NFVF9QT1JUX0NPTkZJRwkJMHgxMjIJLyogU2V0IHBvcnQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNQkNfR0VUX1BPUlRfQ09ORklHCQkweDEyMwkvKiBHZXQgcG9ydCBjb25maWd1cmF0aW9uICovCiAKIC8qIEZpcm13YXJlIHJldHVybiBkYXRhIHNpemVzICovCiAjZGVmaW5lIEZDQUxfTUFQX1NJWkUJMTI4CkBAIC0xNjYwLDggKzE2NTIsMTQgQEAKIAl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CiAJdWludDhfdCBmYWJyaWNfcG9ydF9uYW1lW1dXTl9TSVpFXTsKIAl1aW50MTZfdCBmcF9zcGVlZDsKKwl1aW50OF90IGZjNF90eXBlOwogfSBzd19pbmZvX3Q7CiAKKy8qIEZDUC00IHR5cGVzICovCisjZGVmaW5lIEZDNF9UWVBFX0ZDUF9TQ1NJCTB4MDgKKyNkZWZpbmUgRkM0X1RZUEVfT1RIRVIJCTB4MAorI2RlZmluZSBGQzRfVFlQRV9VTktOT1dOCTB4ZmYKKwogLyoKICAqIEZpYnJlIGNoYW5uZWwgcG9ydCB0eXBlLgogICovCkBAIC0xNzA1LDYgKzE3MDMsNyBAQAogCXUzMiBzdXBwb3J0ZWRfY2xhc3NlczsKIAogCXVpbnQxNl90IHZwX2lkeDsKKwl1aW50OF90IGZjNF90eXBlOwogfSBmY19wb3J0X3Q7CiAKIC8qCkBAIC0xNzg3LDYgKzE3ODYsOSBAQAogI2RlZmluZQlHUFNDX1JFUV9TSVpFCSgxNiArIDgpCiAjZGVmaW5lCUdQU0NfUlNQX1NJWkUJKDE2ICsgMiArIDIpCiAKKyNkZWZpbmUgR0ZGX0lEX0NNRAkweDAxMUYKKyNkZWZpbmUgR0ZGX0lEX1JFUV9TSVpFCSgxNiArIDQpCisjZGVmaW5lIEdGRl9JRF9SU1BfU0laRSAoMTYgKyAxMjgpCiAKIC8qCiAgKiBIQkEgYXR0cmlidXRlIHR5cGVzLgpAQCAtMTk4OCw2ICsxOTkwLDExIEBACiAJCXN0cnVjdCB7CiAJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKIAkJfSBncHNjOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHJlc2VydmVkOworCQkJdWludDhfdCBwb3J0X25hbWVbM107CisJCX0gZ2ZmX2lkOwogCX0gcmVxOwogfTsKIApAQCAtMjA2MCw2ICsyMDY3LDExIEBACiAJCQl1aW50MTZfdCBzcGVlZHM7CiAJCQl1aW50MTZfdCBzcGVlZDsKIAkJfSBncHNjOworCisjZGVmaW5lIEdGRl9GQ1BfU0NTSV9PRkZTRVQJNworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBmYzRfZmVhdHVyZXNbMTI4XTsKKwkJfSBnZmZfaWQ7CiAJfSByc3A7CiB9OwogCkBAIC0yNDEwLDYgKzI0MjIsNyBAQAogCQl1aW50MzJfdAljcHVfYWZmaW5pdHlfZW5hYmxlZAk6MTsKIAkJdWludDMyX3QJZGlzYWJsZV9tc2l4X2hhbmRzaGFrZQk6MTsKIAkJdWludDMyX3QJZmNwX3ByaW9fZW5hYmxlZAk6MTsKKwkJdWludDMyX3QJZndfaHVuZwk6MTsKIAl9IGZsYWdzOwogCiAJLyogVGhpcyBzcGlubG9jayBpcyB1c2VkIHRvIHByb3RlY3QgImlvIHRyYW5zYWN0aW9ucyIsIHlvdSBtdXN0CkBAIC0yNjMwLDYgKzI2NDMsOCBAQAogCXN0cnVjdCBtdXRleCB2cG9ydF9sb2NrOyAgICAgICAgLyogVmlydHVhbCBwb3J0IHN5bmNocm9uaXphdGlvbiAqLwogCXN0cnVjdCBjb21wbGV0aW9uIG1ieF9jbWRfY29tcDsgLyogU2VyaWFsaXplIG1ieCBhY2Nlc3MgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbiBtYnhfaW50cl9jb21wOyAgLyogVXNlZCBmb3IgY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBkY2J4X2NvbXA7CS8qIEZvciBzZXQgcG9ydCBjb25maWcgbm90aWZpY2F0aW9uICovCisJaW50IG5vdGlmeV9kY2J4X2NvbXA7CiAKIAkvKiBCYXNpYyBmaXJtd2FyZSByZWxhdGVkIGluZm9ybWF0aW9uLiAqLwogCXVpbnQxNl90CWZ3X21ham9yX3ZlcnNpb247CkBAIC0yNjk5LDYgKzI3MTQsOCBAQAogCXVpbnQ4X3QgCWZjb2RlX3JldmlzaW9uWzE2XTsKIAl1aW50MzJfdAlmd19yZXZpc2lvbls0XTsKIAorCXVpbnQzMl90CWdvbGRfZndfdmVyc2lvbls0XTsKKwogCS8qIE9mZnNldHMgZm9yIGZsYXNoL252cmFtIGFjY2VzcyAoc2V0IHRvIH4wIGlmIG5vdCB1c2VkKS4gKi8KIAl1aW50MzJfdAlmbGFzaF9jb25mX29mZjsKIAl1aW50MzJfdAlmbGFzaF9kYXRhX29mZjsKQEAgLTI3ODMsNiArMjgwMCw5IEBACiAJdWludDE2X3QJZ2JsX2RzZF9hdmFpbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdibF9kc2RfbGlzdDsKICNkZWZpbmUgTlVNX0RTRF9DSEFJTiA0MDk2CisKKwl1aW50OF90IGZ3X3R5cGU7CisJX19sZTMyIGZpbGVfcHJkX29mZjsJLyogRmlsZSBmaXJtd2FyZSBwcm9kdWN0IG9mZnNldCAqLwogfTsKIAogLyoKQEAgLTI5NjEsOSArMjk4MSwxNSBAQAogCiAjZGVmaW5lCVFMQV9EU0RTX1BFUl9JT0NCCTM3CiAKKyNkZWZpbmUgQ01EX1NQKENtbmQpCQkoKENtbmQpLT5TQ3AucHRyKQorCitlbnVtIG5leHVzX3dhaXRfdHlwZSB7CisJV0FJVF9IT1NUID0gMCwKKwlXQUlUX1RBUkdFVCwKKwlXQUlUX0xVTiwKK307CisKICNpbmNsdWRlICJxbGFfZ2JsLmgiCiAjaW5jbHVkZSAicWxhX2RiZy5oIgogI2luY2x1ZGUgInFsYV9pbmxpbmUuaCIKLQotI2RlZmluZSBDTURfU1AoQ21uZCkJCSgoQ21uZCktPlNDcC5wdHIpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwppbmRleCAzYTlhNmNhLi42MjcxMzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKLSAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAwOCBRTG9naWMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMCBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCmluZGV4IDkzZjgzMzkuLjYzMWZlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKLSAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAwOCBRTG9naWMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMCBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggODIxN2MzYi4uMWExYjI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtNTksNyArNTksNiBAQAogZXh0ZXJuIGludCBxbGEyeDAwX2FzeW5jX2FkaXNjKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGZjX3BvcnRfdCAqLAogICAgIHVpbnQxNl90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX2FzeW5jX3RtX2NtZChmY19wb3J0X3QgKiwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCk7Ci1leHRlcm4gaW50IHFsYTJ4MDBfYXN5bmNfbWFya2VyKGZjX3BvcnRfdCAqLCB1aW50MTZfdCwgdWludDhfdCk7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2FzeW5jX2xvZ2luX2RvbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgZmNfcG9ydF90ICosCiAgICAgdWludDE2X3QgKik7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2FzeW5jX2xvZ291dF9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGZjX3BvcnRfdCAqLApAQCAtNjgsOCArNjcsNyBAQAogICAgIHVpbnQxNl90ICopOwogZXh0ZXJuIHZvaWQgcWxhMngwMF9hc3luY190bV9jbWRfZG9uZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBmY19wb3J0X3QgKiwKIAlzdHJ1Y3Qgc3JiX2lvY2IgKik7Ci1leHRlcm4gdm9pZCBxbGEyeDAwX2FzeW5jX21hcmtlcl9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGZjX3BvcnRfdCAqLAotCXN0cnVjdCBzcmJfaW9jYiAqKTsKK2V4dGVybiB2b2lkICpxbGEyeDAwX2FsbG9jX2lvY2JzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHNyYl90ICopOwogCiBleHRlcm4gZmNfcG9ydF90ICoKIHFsYTJ4MDBfYWxsb2NfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqLCBnZnBfdCApOwpAQCAtMTI0LDYgKzEyMiw3IEBACiBleHRlcm4gdm9pZCBxbGEyeDAwX2ZyZWVfaG9zdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfcmVsb2dpbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZG9fd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfZnJlZV9mY3BvcnRzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogCiAvKgogICogR2xvYmFsIEZ1bmN0aW9ucyBpbiBxbGFfbWlkLmMgc291cmNlIGZpbGUuCkBAIC0xNzYsMTAgKzE3NSw3IEBACiBleHRlcm4gaW50IHFsYTI0eHhfc3RhcnRfc2NzaShzcmJfdCAqc3ApOwogaW50IHFsYTJ4MDBfbWFya2VyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXFfcXVlICosIHN0cnVjdCByc3BfcXVlICosCiAJCQkJCQl1aW50MTZfdCwgdWludDE2X3QsIHVpbnQ4X3QpOwotaW50IF9fcWxhMngwMF9tYXJrZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJlcV9xdWUgKiwgc3RydWN0IHJzcF9xdWUgKiwKLQkJCQkJCXVpbnQxNl90LCB1aW50MTZfdCwgdWludDhfdCk7CiBleHRlcm4gaW50IHFsYTJ4MDBfc3RhcnRfc3Aoc3JiX3QgKik7Ci1leHRlcm4gdm9pZCBxbGEyeDAwX2N0eF9zcF9mcmVlKHNyYl90ICopOwogZXh0ZXJuIHVpbnQxNl90IHFsYTI0eHhfY2FsY19pb2Nicyh1aW50MTZfdCk7CiBleHRlcm4gdm9pZCBxbGEyNHh4X2J1aWxkX3Njc2lfaW9jYnMoc3JiX3QgKiwgc3RydWN0IGNtZF90eXBlXzcgKiwgdWludDE2X3QpOwogZXh0ZXJuIGludCBxbGEyNHh4X2RpZl9zdGFydF9zY3NpKHNyYl90ICopOwpAQCAtMjkzLDcgKzI4OSw5IEBACiBxbGEyNHh4X2Fib3J0X3RhcmdldChzdHJ1Y3QgZmNfcG9ydCAqLCB1bnNpZ25lZCBpbnQsIGludCk7CiBleHRlcm4gaW50CiBxbGEyNHh4X2x1bl9yZXNldChzdHJ1Y3QgZmNfcG9ydCAqLCB1bnNpZ25lZCBpbnQsIGludCk7Ci0KK2V4dGVybiBpbnQKK3FsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyhzY3NpX3FsYV9ob3N0X3QgKiwgdW5zaWduZWQgaW50LAorCXVuc2lnbmVkIGludCwgZW51bSBuZXh1c193YWl0X3R5cGUpOwogZXh0ZXJuIGludAogcWxhMngwMF9zeXN0ZW1fZXJyb3Ioc2NzaV9xbGFfaG9zdF90ICopOwogCkBAIC0zNTcsNiArMzU1LDExIEBACiBleHRlcm4gaW50IHFsYTJ4MDBfZ2V0X2RhdGFfcmF0ZShzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfc2V0X2ZjcF9wcmlvKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QsCiAJdWludDE2X3QgKik7CitleHRlcm4gaW50CitxbGE4MXh4X2dldF9wb3J0X2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTgxeHhfc2V0X3BvcnRfY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqKTsKIAogLyoKICAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9pc3IuYyBzb3VyY2UgZmlsZS4KQEAgLTQzOCw2ICs0NDEsNyBAQAogZXh0ZXJuIGludCBxbGEyeDAwX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF9nZmZfaWQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKIGV4dGVybiBpbnQgcWxhMngwMF9yZnRfaWQoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX3JmZl9pZChzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gaW50IHFsYTJ4MDBfcm5uX2lkKHNjc2lfcWxhX2hvc3RfdCAqKTsKQEAgLTQ4MiwxMSArNDg2LDggQEAKIAl1aW50MTZfdCwgaW50LCB1aW50OF90KTsKIGV4dGVybiBpbnQgcWxhMjV4eF9jcmVhdGVfcnNwX3F1ZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKiwgdWludDE2X3QsIHVpbnQ4X3QsCiAJdWludDE2X3QsIGludCk7Ci1leHRlcm4gaW50IHFsYTI1eHhfdXBkYXRlX3JlcV9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDhfdCwgdWludDhfdCk7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2luaXRfcmVzcG9uc2VfcV9lbnRyaWVzKHN0cnVjdCByc3BfcXVlICopOwogZXh0ZXJuIGludCBxbGEyNXh4X2RlbGV0ZV9yZXFfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXFfcXVlICopOwotZXh0ZXJuIGludCBxbGEyNXh4X2RlbGV0ZV9yc3BfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByc3BfcXVlICopOwotZXh0ZXJuIGludCBxbGEyNXh4X2NyZWF0ZV9xdWV1ZXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDhfdCk7CiBleHRlcm4gaW50IHFsYTI1eHhfZGVsZXRlX3F1ZXVlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB1aW50MTZfdCBxbGEyNHh4X3JkX3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90KTsKIGV4dGVybiB1aW50MTZfdCBxbGEyNXh4X3JkX3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90KTsKQEAgLTUwMywxNyArNTA0LDEyIEBACiBleHRlcm4gaW50IHFsYTgyeHhfcGNpX21lbV93cml0ZV8yTShzdHJ1Y3QgcWxhX2h3X2RhdGEgKiwgdTY0LCB2b2lkICosIGludCk7CiBleHRlcm4gY2hhciAqcWxhODJ4eF9wY2lfaW5mb19zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgY2hhciAqKTsKIGV4dGVybiBpbnQgcWxhODJ4eF9wY2lfcmVnaW9uX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqLCBpbnQpOwotZXh0ZXJuIGludCBxbGE4Mnh4X3BjaV9yZWdpb25fbGVuKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CiBleHRlcm4gaW50IHFsYTgyeHhfaW9zcGFjZV9jb25maWcoc3RydWN0IHFsYV9od19kYXRhICopOwogCiAvKiBJbml0aWFsaXphdGlvbiByZWxhdGVkIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgcWxhODJ4eF9yZXNldF9jaGlwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogZXh0ZXJuIHZvaWQgcWxhODJ4eF9jb25maWdfcmluZ3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7Ci1leHRlcm4gaW50IHFsYTgyeHhfbnZyYW1fY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogZXh0ZXJuIGludCBxbGE4Mnh4X3Bpbml0X2Zyb21fcm9tKHNjc2lfcWxhX2hvc3RfdCAqKTsKLWV4dGVybiBpbnQgcWxhODJ4eF9sb2FkX2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqKTsKLWV4dGVybiBpbnQgcWxhODJ4eF9yZXNldF9odyhzY3NpX3FsYV9ob3N0X3QgKik7Ci1leHRlcm4gaW50IHFsYTgyeHhfbG9hZF9yaXNjX2Jsb2Ioc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90ICopOwogZXh0ZXJuIHZvaWQgcWxhODJ4eF93YXRjaGRvZyhzY3NpX3FsYV9ob3N0X3QgKik7CiAKIC8qIEZpcm13YXJlIGFuZCBmbGFzaCByZWxhdGVkIGZ1bmN0aW9ucyAqLwpAQCAtNTY5LDcgKzU2NSw2IEBACiBleHRlcm4gaW50IHFsYTgyeHhfbWJ4X2ludHJfZGlzYWJsZShzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGE4Mnh4X3N0YXJ0X2lvY2JzKHNyYl90ICopOwogZXh0ZXJuIGludCBxbGE4Mnh4X2Zjb2VfY3R4X3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqKTsKLWV4dGVybiB2b2lkIHFsYTgyeHhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyhzY3NpX3FsYV9ob3N0X3QgKik7CiAKIC8qIEJTRyByZWxhdGVkIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBxbGEyNHh4X2JzZ19yZXF1ZXN0KHN0cnVjdCBmY19ic2dfam9iICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwppbmRleCA4NzJjNTVmLi40YzA4MzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtMTkxMywzICsxOTEzLDc1IEBACiAKIAlyZXR1cm4gKHJ2YWwpOwogfQorCisvKioKKyAqIHFsYTJ4MDBfZ2ZmX2lkKCkgLSBTTlMgR2V0IEZDLTQgRmVhdHVyZXMgKEdGRl9JRCkgcXVlcnkuCisgKgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbGlzdDogc3dpdGNoIGluZm8gZW50cmllcyB0byBwb3B1bGF0ZQorICoKKyAqLwordm9pZAorcWxhMngwMF9nZmZfaWQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHN3X2luZm9fdCAqbGlzdCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDE2X3QJaTsKKworCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50OF90IGZjcF9zY3NpX2ZlYXR1cmVzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CisJCS8qIFNldCBkZWZhdWx0IEZDNCBUeXBlIGFzIFVOS05PV04gc28gdGhlIGRlZmF1bHQgaXMgdG8KKwkJICogUHJvY2VzcyB0aGlzIHBvcnQgKi8KKwkJbGlzdFtpXS5mYzRfdHlwZSA9IEZDNF9UWVBFX1VOS05PV047CisKKwkJLyogRG8gbm90IGF0dGVtcHQgR0ZGX0lEIGlmIHdlIGFyZSBub3QgRldJXzIgY2FwYWJsZSAqLworCQlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkpCisJCQljb250aW51ZTsKKworCQkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCisJCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLT5wcmVwX21zX2lvY2IodmhhLCBHRkZfSURfUkVRX1NJWkUsCisJCSAgICBHRkZfSURfUlNQX1NJWkUpOworCisJCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCQljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgR0ZGX0lEX0NNRCwKKwkJICAgIEdGRl9JRF9SU1BfU0laRSk7CisJCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKKworCQkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkICovCisJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFswXSA9IGxpc3RbaV0uZF9pZC5iLmRvbWFpbjsKKwkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzFdID0gbGlzdFtpXS5kX2lkLmIuYXJlYTsKKwkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzJdID0gbGlzdFtpXS5kX2lkLmIuYWxfcGE7CisKKwkJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCQkgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCURFQlVHMl8zKHByaW50ayhLRVJOX0lORk8KKwkJCSAgICAic2NzaSglbGQpOiBHRkZfSUQgaXNzdWUgSU9DQiBmYWlsZWQgIgorCQkJICAgICIoJWQpLlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsCisJCQkgICAgICAgIkdQTl9JRCIpICE9IFFMQV9TVUNDRVNTKSB7CisJCQlERUJVRzJfMyhwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkKTogR0ZGX0lEIElPQ0Igc3RhdHVzIGhhZCBhICIKKwkJCSAgICAiZmFpbHVyZSBzdGF0dXMgY29kZVxuIiwgdmhhLT5ob3N0X25vKSk7CisJCX0gZWxzZSB7CisJCQlmY3Bfc2NzaV9mZWF0dXJlcyA9CisJCQkgICBjdF9yc3AtPnJzcC5nZmZfaWQuZmM0X2ZlYXR1cmVzW0dGRl9GQ1BfU0NTSV9PRkZTRVRdOworCQkJZmNwX3Njc2lfZmVhdHVyZXMgJj0gMHgwZjsKKworCQkJaWYgKGZjcF9zY3NpX2ZlYXR1cmVzKQorCQkJCWxpc3RbaV0uZmM0X3R5cGUgPSBGQzRfVFlQRV9GQ1BfU0NTSTsKKwkJCWVsc2UKKwkJCQlsaXN0W2ldLmZjNF90eXBlID0gRkM0X1RZUEVfT1RIRVI7CisJCX0KKworCQkvKiBMYXN0IGRldmljZSBleGl0LiAqLworCQlpZiAobGlzdFtpXS5kX2lkLmIucnN2ZF8xICE9IDApCisJCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCBhYjJjYzcxLi5kODYzZWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgotICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEwIFFMb2dpYyBDb3Jwb3JhdGlvbgogICoKICAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KQEAgLTYwLDEyICs2MCwxMSBAQAogCWN0eCA9IHNwLT5jdHg7CiAJaW9jYiA9IGN0eC0+dS5pb2NiX2NtZDsKIAlpb2NiLT50aW1lb3V0KHNwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCiAJaW9jYi0+ZnJlZShzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHFsYTJ4MDBfY3R4X3NwX2ZyZWUoc3JiX3QgKnNwKQogewogCXN0cnVjdCBzcmJfY3R4ICpjdHggPSBzcC0+Y3R4OwpAQCAtMTIyLDcgKzEyMSwyMyBAQAogCiAvKiBBc3luY2hyb25vdXMgTG9naW4vTG9nb3V0IFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgRUxTX1RNT18yX1JBVE9WKGhhKSAoKGhhKS0+cl9hX3RvdiAvIDEwICogMikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCXVuc2lnbmVkIGxvbmcgdG1vOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJLyogRmlybXdhcmUgc2hvdWxkIHVzZSBzd2l0Y2ggbmVnb3RpYXRlZCByX2FfdG92IGZvciB0aW1lb3V0LiAqLworCXRtbyA9IGhhLT5yX2FfdG92IC8gMTAgKiAyOworCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSkgeworCQkvKgorCQkgKiBFeGNlcHQgZm9yIGVhcmxpZXIgSVNQcyB3aGVyZSB0aGUgdGltZW91dCBpcyBzZWVkZWQgZnJvbSB0aGUKKwkJICogaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4KKwkJICovCisJCXRtbyA9IGhhLT5sb2dpbl90aW1lb3V0OworCX0KKwlyZXR1cm4gdG1vOworfQogCiBzdGF0aWMgdm9pZAogcWxhMngwMF9hc3luY19pb2NiX3RpbWVvdXQoc3JiX3QgKnNwKQpAQCAtMTMxLDEyICsxNDYsMjIgQEAKIAlzdHJ1Y3Qgc3JiX2N0eCAqY3R4ID0gc3AtPmN0eDsKIAogCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIHRpbWVvdXQuXG4iLAotCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgY3R4LT5uYW1lKSk7CisJCSJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIHRpbWVvdXQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsCisJCWN0eC0+bmFtZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQlmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOwogCiAJZmNwb3J0LT5mbGFncyAmPSB+RkNGX0FTWU5DX1NFTlQ7Ci0JaWYgKGN0eC0+dHlwZSA9PSBTUkJfTE9HSU5fQ01EKQorCWlmIChjdHgtPnR5cGUgPT0gU1JCX0xPR0lOX0NNRCkgeworCQlzdHJ1Y3Qgc3JiX2lvY2IgKmxpbyA9IGN0eC0+dS5pb2NiX2NtZDsKIAkJcWxhMngwMF9wb3N0X2FzeW5jX2xvZ291dF93b3JrKGZjcG9ydC0+dmhhLCBmY3BvcnQsIE5VTEwpOworCQkvKiBSZXRyeSBhcyBuZWVkZWQuICovCisJCWxpby0+dS5sb2dpby5kYXRhWzBdID0gTUJTX0NPTU1BTkRfRVJST1I7CisJCWxpby0+dS5sb2dpby5kYXRhWzFdID0gbGlvLT51LmxvZ2lvLmZsYWdzICYgU1JCX0xPR0lOX1JFVFJJRUQgPworCQkJUUxBX0xPR0lPX0xPR0lOX1JFVFJJRUQgOiAwOworCQlxbGEyeDAwX3Bvc3RfYXN5bmNfbG9naW5fZG9uZV93b3JrKGZjcG9ydC0+dmhhLCBmY3BvcnQsCisJCQlsaW8tPnUubG9naW8uZGF0YSk7CisJfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTU0LDcgKzE3OSw2IEBACiBxbGEyeDAwX2FzeW5jX2xvZ2luKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0LAogICAgIHVpbnQxNl90ICpkYXRhKQogewotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXNyYl90ICpzcDsKIAlzdHJ1Y3Qgc3JiX2N0eCAqY3R4OwogCXN0cnVjdCBzcmJfaW9jYiAqbGlvOwpAQCAtMTYyLDcgKzE4Niw3IEBACiAKIAlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAlzcCA9IHFsYTJ4MDBfZ2V0X2N0eF9zcCh2aGEsIGZjcG9ydCwgc2l6ZW9mKHN0cnVjdCBzcmJfY3R4KSwKLQkgICAgRUxTX1RNT18yX1JBVE9WKGhhKSArIDIpOworCSAgICBxbGEyeDAwX2dldF9hc3luY190aW1lb3V0KHZoYSkgKyAyKTsKIAlpZiAoIXNwKQogCQlnb3RvIGRvbmU7CiAKQEAgLTIwNiw3ICsyMzAsNiBAQAogaW50CiBxbGEyeDAwX2FzeW5jX2xvZ291dChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKIHsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzcmJfdCAqc3A7CiAJc3RydWN0IHNyYl9jdHggKmN0eDsKIAlzdHJ1Y3Qgc3JiX2lvY2IgKmxpbzsKQEAgLTIxNCw3ICsyMzcsNyBAQAogCiAJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJc3AgPSBxbGEyeDAwX2dldF9jdHhfc3AodmhhLCBmY3BvcnQsIHNpemVvZihzdHJ1Y3Qgc3JiX2N0eCksCi0JICAgIEVMU19UTU9fMl9SQVRPVihoYSkgKyAyKTsKKwkgICAgcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpICsgMik7CiAJaWYgKCFzcCkKIAkJZ290byBkb25lOwogCkBAIC0yNTUsNyArMjc4LDYgQEAKIHFsYTJ4MDBfYXN5bmNfYWRpc2Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgZmNfcG9ydF90ICpmY3BvcnQsCiAgICAgdWludDE2X3QgKmRhdGEpCiB7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3JiX3QgKnNwOwogCXN0cnVjdCBzcmJfY3R4ICpjdHg7CiAJc3RydWN0IHNyYl9pb2NiICpsaW87CkBAIC0yNjMsNyArMjg1LDcgQEAKIAogCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCXNwID0gcWxhMngwMF9nZXRfY3R4X3NwKHZoYSwgZmNwb3J0LCBzaXplb2Yoc3RydWN0IHNyYl9jdHgpLAotCSAgICBFTFNfVE1PXzJfUkFUT1YoaGEpICsgMik7CisJICAgIHFsYTJ4MDBfZ2V0X2FzeW5jX3RpbWVvdXQodmhhKSArIDIpOwogCWlmICghc3ApCiAJCWdvdG8gZG9uZTsKIApAQCAtMzA3LDcgKzMyOSw2IEBACiAJdWludDMyX3QgdGFnKQogewogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzcmJfdCAqc3A7CiAJc3RydWN0IHNyYl9jdHggKmN0eDsKIAlzdHJ1Y3Qgc3JiX2lvY2IgKnRjZjsKQEAgLTMxNSw3ICszMzYsNyBAQAogCiAJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJc3AgPSBxbGEyeDAwX2dldF9jdHhfc3AodmhhLCBmY3BvcnQsIHNpemVvZihzdHJ1Y3Qgc3JiX2N0eCksCi0JICAgIEVMU19UTU9fMl9SQVRPVihoYSkgKyAyKTsKKwkgICAgcWxhMngwMF9nZXRfYXN5bmNfdGltZW91dCh2aGEpICsgMik7CiAJaWYgKCFzcCkKIAkJZ290byBkb25lOwogCkBAIC0zNDYsNTggKzM2Nyw2IEBACiAJcmV0dXJuIHJ2YWw7CiB9CiAKLXN0YXRpYyB2b2lkCi1xbGEyeDAwX2FzeW5jX21hcmtlcl9jdHhfZG9uZShzcmJfdCAqc3ApCi17Ci0Jc3RydWN0IHNyYl9jdHggKmN0eCA9IHNwLT5jdHg7Ci0Jc3RydWN0IHNyYl9pb2NiICppb2NiID0gKHN0cnVjdCBzcmJfaW9jYiAqKWN0eC0+dS5pb2NiX2NtZDsKLQotCXFsYTJ4MDBfYXN5bmNfbWFya2VyX2RvbmUoc3AtPmZjcG9ydC0+dmhhLCBzcC0+ZmNwb3J0LCBpb2NiKTsKLQlpb2NiLT5mcmVlKHNwKTsKLX0KLQotaW50Ci1xbGEyeDAwX2FzeW5jX21hcmtlcihmY19wb3J0X3QgKmZjcG9ydCwgdWludDE2X3QgbHVuLCB1aW50OF90IG1vZGlmKQotewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKLQlzcmJfdCAqc3A7Ci0Jc3RydWN0IHNyYl9jdHggKmN0eDsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKm1yazsKLQlpbnQgcnZhbDsKLQotCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCXNwID0gcWxhMngwMF9nZXRfY3R4X3NwKHZoYSwgZmNwb3J0LCBzaXplb2Yoc3RydWN0IHNyYl9jdHgpLCAwKTsKLQlpZiAoIXNwKQotCQlnb3RvIGRvbmU7Ci0KLQljdHggPSBzcC0+Y3R4OwotCWN0eC0+dHlwZSA9IFNSQl9NQVJLRVJfQ01EOwotCWN0eC0+bmFtZSA9ICJtYXJrZXIiOwotCW1yayA9IGN0eC0+dS5pb2NiX2NtZDsKLQltcmstPnUubWFya2VyLmx1biA9IGx1bjsKLQltcmstPnUubWFya2VyLm1vZGlmID0gbW9kaWY7Ci0JbXJrLT50aW1lb3V0ID0gcWxhMngwMF9hc3luY19pb2NiX3RpbWVvdXQ7Ci0JbXJrLT5kb25lID0gcWxhMngwMF9hc3luY19tYXJrZXJfY3R4X2RvbmU7Ci0KLQlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCWdvdG8gZG9uZV9mcmVlX3NwOwotCi0JREVCVUcyKHByaW50ayhLRVJOX0RFQlVHCi0JICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLW1hcmtlciAtIGxvb3AtaWQ9JXggIgotCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCi0JICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCBmY3BvcnQtPmxvb3BfaWQsCi0JICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKLQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKLQotCXJldHVybiBydmFsOwotCi1kb25lX2ZyZWVfc3A6Ci0JbXJrLT5mcmVlKHNwKTsKLWRvbmU6Ci0JcmV0dXJuIHJ2YWw7Ci19Ci0KIHZvaWQKIHFsYTJ4MDBfYXN5bmNfbG9naW5fZG9uZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKICAgICB1aW50MTZfdCAqZGF0YSkKQEAgLTQxOCwxMCArMzg3LDExIEBACiAJCWlmIChkYXRhWzFdICYgUUxBX0xPR0lPX0xPR0lOX1JFVFJJRUQpCiAJCQlzZXRfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQllbHNlCi0JCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QodmhhLCBmY3BvcnQsIDEsIDApOworCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LCAxLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBNQlNfUE9SVF9JRF9VU0VEOgogCQlmY3BvcnQtPmxvb3BfaWQgPSBkYXRhWzFdOworCQlxbGEyeDAwX3Bvc3RfYXN5bmNfbG9nb3V0X3dvcmsodmhhLCBmY3BvcnQsIE5VTEwpOwogCQlxbGEyeDAwX3Bvc3RfYXN5bmNfbG9naW5fd29yayh2aGEsIGZjcG9ydCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgTUJTX0xPT1BfSURfVVNFRDoKQEAgLTQyOSw3ICszOTksNyBAQAogCQlydmFsID0gcWxhMngwMF9maW5kX25ld19sb29wX2lkKHZoYSwgZmNwb3J0KTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9BU1lOQ19TRU5UOwotCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LCAxLCAwKTsKKwkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdCh2aGEsIGZjcG9ydCwgMSwgMSk7CiAJCQlicmVhazsKIAkJfQogCQlxbGEyeDAwX3Bvc3RfYXN5bmNfbG9naW5fd29yayh2aGEsIGZjcG9ydCwgTlVMTCk7CkBAIC00NjEsNyArNDMxLDcgQEAKIAlpZiAoZGF0YVsxXSAmIFFMQV9MT0dJT19MT0dJTl9SRVRSSUVEKQogCQlzZXRfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCWVsc2UKLQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LCAxLCAwKTsKKwkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LCAxLCAxKTsKIAogCXJldHVybjsKIH0KQEAgLTQ3OCw3ICs0NDgsOCBAQAogCWx1biA9ICh1aW50MTZfdClpb2NiLT51LnRtZi5sdW47CiAKIAkvKiBJc3N1ZSBNYXJrZXIgSU9DQiAqLwotCXJ2YWwgPSBxbGEyeDAwX2FzeW5jX21hcmtlcihmY3BvcnQsIGx1biwKKwlydmFsID0gcWxhMngwMF9tYXJrZXIodmhhLCB2aGEtPmh3LT5yZXFfcV9tYXBbMF0sCisJCXZoYS0+aHctPnJzcF9xX21hcFswXSwgZmNwb3J0LT5sb29wX2lkLCBsdW4sCiAJCWZsYWdzID09IFRDRl9MVU5fUkVTRVQgPyBNS19TWU5DX0lEX0xVTiA6IE1LX1NZTkNfSUQpOwogCiAJaWYgKChydmFsICE9IFFMQV9TVUNDRVNTKSB8fCBpb2NiLT51LnRtZi5kYXRhKSB7CkBAIC00OTAsMjQgKzQ2MSw2IEBACiAJcmV0dXJuOwogfQogCi12b2lkCi1xbGEyeDAwX2FzeW5jX21hcmtlcl9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0LAotICAgIHN0cnVjdCBzcmJfaW9jYiAqaW9jYikKLXsKLQkvKgotCSAqIEN1cnJlbnRseSB3ZSBkb250IGhhdmUgYW55IHNwZWNpZmljIHBvc3QgcmVzcG9uc2UgcHJvY2Vzc2luZwotCSAqIGZvciB0aGlzIElPQ0IuIFdlJ2xsIGp1c3QgcmV0dXJuIHN1Y2Nlc3Mgb3IgZmFpbGVkCi0JICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIElPQ0IgY29tbWFuZCBzdWNjZWVkZWQgb3IgZmFpbGVkLgotCSAqLwotCWlmIChpb2NiLT51LnRtZi5kYXRhKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICIlcyglbGQpOiBNYXJrZXIgSU9DQiBmYWlsZWQgKCV4KS5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBpb2NiLT51LnRtZi5kYXRhKSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgIFFMb2dpYyBJU1AyeDAwIEhhcmR3YXJlIFN1cHBvcnQgRnVuY3Rpb25zLiAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MTMsMTEgKzU2Niw4IEBACiAJCX0KIAl9CiAKLQlpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSB8fCBJU19RTEEyNVhYKGhhKSkgewotCQlpZiAocWxhMjR4eF9yZWFkX2ZjcF9wcmlvX2NmZyh2aGEpKQotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkiVW5hYmxlIHRvIHJlYWQgRkNQIHByaW9yaXR5IGRhdGEuXG4iKTsKLQl9CisJaWYgKElTX1FMQTI0WFhfVFlQRShoYSkgfHwgSVNfUUxBMjVYWChoYSkpCisJCXFsYTI0eHhfcmVhZF9mY3BfcHJpb19jZmcodmhhKTsKIAogCXJldHVybiAocnZhbCk7CiB9CkBAIC0xNDUyLDggKzE0MDIsMTEgQEAKIAogCWlmIChJU19RTEE4MlhYKGhhKSkgewogCQlydmFsID0gaGEtPmlzcF9vcHMtPmxvYWRfcmlzYyh2aGEsICZzcmlzY19hZGRyZXNzKTsKLQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpCisJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCQlxbGEyeDAwX3N0b3BfZmlybXdhcmUodmhhKTsKIAkJCWdvdG8gZW5hYmxlXzgyeHhfbnBpdjsKKwkJfSBlbHNlCisJCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkgJiYgIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkgewpAQCAtMTk2MCw3ICsxOTEzLDggQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIE1haWxib3ggY21kIGZhaWxlZC4gVGltZW91dCBvbiBtaW5fd2FpdC4gKi8KLQkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG10aW1lKSkKKwkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG10aW1lKSB8fAorCQkJICAgIChJU19RTEE4MlhYKGhhKSAmJiBoYS0+ZmxhZ3MuZndfaHVuZykpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMjM5Niw3ICsyMzUwLDcgQEAKIAloYS0+cmV0cnlfY291bnQgPSBudi0+cmV0cnlfY291bnQ7CiAKIAkvKiBTZXQgbWluaW11bSBsb2dpbl90aW1lb3V0IHRvIDQgc2Vjb25kcy4gKi8KLQlpZiAobnYtPmxvZ2luX3RpbWVvdXQgPCBxbDJ4bG9naW50aW1lb3V0KQorCWlmIChudi0+bG9naW5fdGltZW91dCAhPSBxbDJ4bG9naW50aW1lb3V0KQogCQludi0+bG9naW5fdGltZW91dCA9IHFsMnhsb2dpbnRpbWVvdXQ7CiAJaWYgKG52LT5sb2dpbl90aW1lb3V0IDwgNCkKIAkJbnYtPmxvZ2luX3RpbWVvdXQgPSA0OwpAQCAtMjYzOSw3ICsyNTkzLDggQEAKIAkJCXNldF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZ2aGEtPmRwY19mbGFncyk7CiAJCWlmICh0ZXN0X2JpdChSU0NOX1VQREFURSwgJnNhdmVfZmxhZ3MpKSB7CiAJCQlzZXRfYml0KFJTQ05fVVBEQVRFLCAmdmhhLT5kcGNfZmxhZ3MpOwotCQkJdmhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKKwkJCWlmICghSVNfQUxPR0lPX0NBUEFCTEUoaGEpKQorCQkJCXZoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CiAJCX0KIAl9CiAKQEAgLTMxMjQsNyArMzA3OSw2IEBACiAJcmV0dXJuIChydmFsKTsKIH0KIAotCiAvKgogICogcWxhMngwMF9maW5kX2FsbF9mYWJyaWNfZGV2cwogICoKQEAgLTMxNzcsNiArMzEzMSwxMCBAQAogCQkgICAgcWxhMngwMF9nZnBuX2lkKHZoYSwgc3dsKSA9PSBRTEFfU1VDQ0VTUykgewogCQkJcWxhMngwMF9ncHNjKHZoYSwgc3dsKTsKIAkJfQorCisJCS8qIElmIG90aGVyIHF1ZXJpZXMgc3VjY2VlZGVkIHByb2JlIGZvciBGQy00IHR5cGUgKi8KKwkJaWYgKHN3bCkKKwkJCXFsYTJ4MDBfZ2ZmX2lkKHZoYSwgc3dsKTsKIAl9CiAJc3dsX2lkeCA9IDA7CiAKQEAgLTMxOTcsOCArMzE1NSw5IEBACiAJCWlmIChxbGEyeDAwX2lzX3Jlc2VydmVkX2lkKHZoYSwgbG9vcF9pZCkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAotCQkgICAgTE9PUF9UUkFOU0lUSU9OKHZoYSkpIHsKKwkJaWYgKGhhLT5jdXJyZW50X3RvcG9sb2d5ID09IElTUF9DRkdfRkwgJiYKKwkJICAgIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpIHx8CisJCSAgICAgTE9PUF9UUkFOU0lUSU9OKHZoYSkpKSB7CiAJCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3BfZG93bl90aW1lciwgMCk7CiAJCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCXNldF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZ2aGEtPmRwY19mbGFncyk7CkBAIC0zMjE3LDYgKzMxNzYsNyBAQAogCQkJCW1lbWNweShuZXdfZmNwb3J0LT5mYWJyaWNfcG9ydF9uYW1lLAogCQkJCSAgICBzd2xbc3dsX2lkeF0uZmFicmljX3BvcnRfbmFtZSwgV1dOX1NJWkUpOwogCQkJCW5ld19mY3BvcnQtPmZwX3NwZWVkID0gc3dsW3N3bF9pZHhdLmZwX3NwZWVkOworCQkJCW5ld19mY3BvcnQtPmZjNF90eXBlID0gc3dsW3N3bF9pZHhdLmZjNF90eXBlOwogCiAJCQkJaWYgKHN3bFtzd2xfaWR4XS5kX2lkLmIucnN2ZF8xICE9IDApIHsKIAkJCQkJbGFzdF9kZXYgPSAxOwpAQCAtMzI3OCw2ICszMjM4LDExIEBACiAJCWlmICgobmV3X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiAmIDB4ZjApID09IDB4ZjApCiAJCQljb250aW51ZTsKIAorCQkvKiBCeXBhc3MgcG9ydHMgd2hvc2UgRkNQLTQgdHlwZSBpcyBub3QgRkNQX1NDU0kgKi8KKwkJaWYgKG5ld19mY3BvcnQtPmZjNF90eXBlICE9IEZDNF9UWVBFX0ZDUF9TQ1NJICYmCisJCSAgICBuZXdfZmNwb3J0LT5mYzRfdHlwZSAhPSBGQzRfVFlQRV9VTktOT1dOKQorCQkJY29udGludWU7CisKIAkJLyogTG9jYXRlIG1hdGNoaW5nIGRldmljZSBpbiBkYXRhYmFzZS4gKi8KIAkJZm91bmQgPSAwOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgewpAQCAtMzg2OCw4ICszODMzLDEzIEBACiAJfQogCiAJLyogTWFrZSBzdXJlIGZvciBJU1AgODJYWCBJTyBETUEgaXMgY29tcGxldGUgKi8KLQlpZiAoSVNfUUxBODJYWChoYSkpCi0JCXFsYTgyeHhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyh2aGEpOworCWlmIChJU19RTEE4MlhYKGhhKSkgeworCQlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgMCwgMCwKKwkJCVdBSVRfSE9TVCkgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkiRG9uZSB3YWl0IGZvciBwZW5kaW5nIGNvbW1hbmRzXG4iKSk7CisJCX0KKwl9CiAKIAkvKiBSZXF1ZXVlIGFsbCBjb21tYW5kcyBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCiAJcWxhMngwMF9hYm9ydF9hbGxfY21kcyh2aGEsIERJRF9SRVNFVCA8PCAxNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKaW5kZXggODRjMmZlYS4uNDhmOTdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKaW5kZXggOGVmOTQ1My4uNTc5ZjAyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKLSAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAwOCBRTG9naWMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMCBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCkBAIC0xMSw4ICsxMSw2IEBACiAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAKLXN0YXRpYyByZXF1ZXN0X3QgKnFsYTJ4MDBfcmVxX3BrdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3QgcmVxX3F1ZSAqLAotCQkJCQkJCXN0cnVjdCByc3BfcXVlICpyc3ApOwogc3RhdGljIHZvaWQgcWxhMngwMF9pc3BfY21kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXFfcXVlICopOwogCiBzdGF0aWMgdm9pZCBxbGEyNXh4X3NldF9xdWUoc3JiX3QgKiwgc3RydWN0IHJzcF9xdWUgKiopOwpAQCAtNDYzLDcgKzQ2MSw3IEBACiAgKgogICogUmV0dXJucyBub24temVybyBpZiBhIGZhaWx1cmUgb2NjdXJyZWQsIGVsc2UgemVyby4KICAqLwotaW50CitzdGF0aWMgaW50CiBfX3FsYTJ4MDBfbWFya2VyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsCiAJCQlzdHJ1Y3QgcnNwX3F1ZSAqcnNwLCB1aW50MTZfdCBsb29wX2lkLAogCQkJdWludDE2X3QgbHVuLCB1aW50OF90IHR5cGUpCkBAIC00NzQsNyArNDcyLDcgQEAKIAlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCW1yazI0ID0gTlVMTDsKLQltcmsgPSAobXJrX2VudHJ5X3QgKilxbGEyeDAwX3JlcV9wa3QodmhhLCByZXEsIHJzcCk7CisJbXJrID0gKG1ya19lbnRyeV90ICopcWxhMngwMF9hbGxvY19pb2Nicyh2aGEsIDApOwogCWlmIChtcmsgPT0gTlVMTCkgewogCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBNYXJrZXIgSU9DQi5cbiIsCiAJCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKQEAgLTUyMSw4NCArNTE5LDYgQEAKIH0KIAogLyoqCi0gKiBxbGEyeDAwX3JlcV9wa3QoKSAtIFJldHJpZXZlIGEgcmVxdWVzdCBwYWNrZXQgZnJvbSB0aGUgcmVxdWVzdCByaW5nLgotICogQGhhOiBIQSBjb250ZXh0Ci0gKgotICogTm90ZTogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIGhhcmR3YXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgotICoKLSAqIFJldHVybnMgTlVMTCBpZiBmdW5jdGlvbiBmYWlsZWQsIGVsc2UsIGEgcG9pbnRlciB0byB0aGUgcmVxdWVzdCBwYWNrZXQuCi0gKi8KLXN0YXRpYyByZXF1ZXN0X3QgKgotcWxhMngwMF9yZXFfcGt0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsCi0JCXN0cnVjdCByc3BfcXVlICpyc3ApCi17Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IElTUF9RVUVfUkVHKGhhLCByZXEtPmlkKTsKLQlyZXF1ZXN0X3QJKnBrdCA9IE5VTEw7Ci0JdWludDE2X3QJY250OwotCXVpbnQzMl90CSpkd29yZF9wdHI7Ci0JdWludDMyX3QJdGltZXI7Ci0JdWludDE2X3QJcmVxX2NudCA9IDE7Ci0KLQkvKiBXYWl0IDEgc2Vjb25kIGZvciBzbG90LiAqLwotCWZvciAodGltZXIgPSBIWjsgdGltZXI7IHRpbWVyLS0pIHsKLQkJaWYgKChyZXFfY250ICsgMikgPj0gcmVxLT5jbnQpIHsKLQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZnJlZSByZXF1ZXN0IGVudHJpZXMuICovCi0JCQlpZiAoaGEtPm1xZW5hYmxlKQotCQkJCWNudCA9ICh1aW50MTZfdCkKLQkJCQkJUkRfUkVHX0RXT1JEKCZyZWctPmlzcDI1bXEucmVxX3Ffb3V0KTsKLQkJCWVsc2UgewotCQkJCWlmIChJU19RTEE4MlhYKGhhKSkKLQkJCQkJY250ID0gKHVpbnQxNl90KVJEX1JFR19EV09SRCgKLQkJCQkJICAgICZyZWctPmlzcDgyLnJlcV9xX291dCk7Ci0JCQkJZWxzZSBpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKLQkJCQkJY250ID0gKHVpbnQxNl90KVJEX1JFR19EV09SRCgKLQkJCQkJCSZyZWctPmlzcDI0LnJlcV9xX291dCk7Ci0JCQkJZWxzZQotCQkJCQljbnQgPSBxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKAotCQkJCQkJSVNQX1JFUV9RX09VVChoYSwgJnJlZy0+aXNwKSk7Ci0JCQl9Ci0JCQlpZiAgKHJlcS0+cmluZ19pbmRleCA8IGNudCkKLQkJCQlyZXEtPmNudCA9IGNudCAtIHJlcS0+cmluZ19pbmRleDsKLQkJCWVsc2UKLQkJCQlyZXEtPmNudCA9IHJlcS0+bGVuZ3RoIC0KLQkJCQkgICAgKHJlcS0+cmluZ19pbmRleCAtIGNudCk7Ci0JCX0KLQkJLyogSWYgcm9vbSBmb3IgcmVxdWVzdCBpbiByZXF1ZXN0IHJpbmcuICovCi0JCWlmICgocmVxX2NudCArIDIpIDwgcmVxLT5jbnQpIHsKLQkJCXJlcS0+Y250LS07Ci0JCQlwa3QgPSByZXEtPnJpbmdfcHRyOwotCi0JCQkvKiBaZXJvIG91dCBwYWNrZXQuICovCi0JCQlkd29yZF9wdHIgPSAodWludDMyX3QgKilwa3Q7Ci0JCQlmb3IgKGNudCA9IDA7IGNudCA8IFJFUVVFU1RfRU5UUllfU0laRSAvIDQ7IGNudCsrKQotCQkJCSpkd29yZF9wdHIrKyA9IDA7Ci0KLQkJCS8qIFNldCBlbnRyeSBjb3VudC4gKi8KLQkJCXBrdC0+ZW50cnlfY291bnQgPSAxOwotCi0JCQlicmVhazsKLQkJfQotCi0JCS8qIFJlbGVhc2UgcmluZyBzcGVjaWZpYyBsb2NrICovCi0JCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOwotCi0JCXVkZWxheSgyKTsgICAvKiAyIHVzICovCi0KLQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KLQkJLyogRHVyaW5nIGluaXQgd2UgaXNzdWUgbWFya2VyIGRpcmVjdGx5ICovCi0JCWlmICghdmhhLT5tYXJrZXJfbmVlZGVkICYmICF2aGEtPmZsYWdzLmluaXRfZG9uZSkKLQkJCXFsYTJ4MDBfcG9sbChyc3ApOwotCQlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7Ci0JfQotCWlmICghcGt0KSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pKTsKLQl9Ci0KLQlyZXR1cm4gKHBrdCk7Ci19Ci0KLS8qKgogICogcWxhMngwMF9pc3BfY21kKCkgLSBNb2RpZnkgdGhlIHJlcXVlc3QgcmluZyBwb2ludGVyLgogICogQGhhOiBIQSBjb250ZXh0CiAgKgpAQCAtNzkyLDYgKzcxMiwyNSBAQAogCSAqIG1hdGNoIExCQSBpbiBDREIgKyBOCiAJICovCiAJY2FzZSBTQ1NJX1BST1RfRElGX1RZUEUyOgorCQlpZiAoIXFsMnhlbmFibGVoYmFfZXJyX2NoaykKKwkJCWJyZWFrOworCisJCWlmIChzY3NpX3Byb3Rfc2dfY291bnQoY21kKSkgeworCQkJc3B0ID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2NzaV9wcm90X3NnbGlzdChjbWQpKSkgKworCQkJICAgIHNjc2lfcHJvdF9zZ2xpc3QoY21kKVswXS5vZmZzZXQ7CisJCQlwa3QtPmFwcF90YWcgPSBzd2FiMzIoc3B0LT5hcHBfdGFnKTsKKwkJCXBrdC0+YXBwX3RhZ19tYXNrWzBdID0gIDB4ZmY7CisJCQlwa3QtPmFwcF90YWdfbWFza1sxXSA9ICAweGZmOworCQl9CisKKwkJcGt0LT5yZWZfdGFnID0gY3B1X3RvX2xlMzIoKHVpbnQzMl90KQorCQkgICAgKDB4ZmZmZmZmZmYgJiBzY3NpX2dldF9sYmEoY21kKSkpOworCisJCS8qIGVuYWJsZSBBTEwgYnl0ZXMgb2YgdGhlIHJlZiB0YWcgKi8KKwkJcGt0LT5yZWZfdGFnX21hc2tbMF0gPSAweGZmOworCQlwa3QtPnJlZl90YWdfbWFza1sxXSA9IDB4ZmY7CisJCXBrdC0+cmVmX3RhZ19tYXNrWzJdID0gMHhmZjsKKwkJcGt0LT5yZWZfdGFnX21hc2tbM10gPSAweGZmOwogCQlicmVhazsKIAogCS8qIEZvciBUeXBlIDMgcHJvdGVjdGlvbjogMTYgYml0IEdVQVJEIG9ubHkgKi8KQEAgLTExMjksNyArMTA2OCw3IEBACiAJY21kX3BrdC0+ZmNwX2NtbmRfZHNlZ19hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoCiAJICAgIE1TRChjcmNfY3R4X2RtYSArIENSQ19DT05URVhUX0ZDUENNTkRfT0ZGKSk7CiAJZmNwX2NtbmQtPnRhc2tfYXR0cmlidXRlID0gMDsKLQlmY3BfY21uZC0+dGFza19tYW5hZ21lbnQgPSAwOworCWZjcF9jbW5kLT50YXNrX21hbmFnZW1lbnQgPSAwOwogCiAJY21kX3BrdC0+ZmNwX3JzcF9kc2VnX2xlbiA9IDA7IC8qIExldCByZXNwb25zZSBjb21lIGluIHN0YXR1cyBpb2NiICovCiAKQEAgLTExNDIsNyArMTA4MSw3IEBACiAJdG90YWxfYnl0ZXMgPSBkYXRhX2J5dGVzOwogCWRpZl9ieXRlcyA9IDA7CiAJYmxrX3NpemUgPSBjbWQtPmRldmljZS0+c2VjdG9yX3NpemU7Ci0JaWYgKHNjc2lfZ2V0X3Byb3RfdHlwZShjbWQpID09IFNDU0lfUFJPVF9ESUZfVFlQRTEpIHsKKwlpZiAoc2NzaV9nZXRfcHJvdF9vcChjbWQpICE9IFNDU0lfUFJPVF9OT1JNQUwpIHsKIAkJZGlmX2J5dGVzID0gKGRhdGFfYnl0ZXMgLyBibGtfc2l6ZSkgKiA4OwogCQl0b3RhbF9ieXRlcyArPSBkaWZfYnl0ZXM7CiAJfQpAQCAtMTE4MCw2ICsxMTE5LDEyIEBACiAJICAgIHZoYS0+aG9zdF9ubywgZGlmX2J5dGVzLCBkaWZfYnl0ZXMsIHRvdGFsX2J5dGVzLCB0b3RhbF9ieXRlcywKIAkgICAgY3JjX2N0eF9wa3QtPmJsa19zaXplLCBjcmNfY3R4X3BrdC0+YmxrX3NpemUpKTsKIAorCWlmICghZGF0YV9ieXRlcyB8fCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7CisJCURFQlVHMTgocHJpbnRrKEtFUk5fSU5GTyAiJXM6IFplcm8gZGF0YSBieXRlcyBvciBETUEtTk9ORSAlZFxuIiwKKwkJICAgIF9fZnVuY19fLCBkYXRhX2J5dGVzKSk7CisJCWNtZF9wa3QtPmJ5dGVfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOworCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJfQogCS8qIFdhbGtzIGRhdGEgc2VnbWVudHMgKi8KIAogCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgfD0KQEAgLTEzOTAsOSArMTMzNSwxMSBAQAogCiAjZGVmaW5lIFFEU1NfR09UX1FfU1BBQ0UJQklUXzAKIAotCS8qIE9ubHkgcHJvY2VzcyBwcm90ZWN0aW9uIGluIHRoaXMgcm91dGluZSAqLwotCWlmIChzY3NpX2dldF9wcm90X29wKGNtZCkgPT0gU0NTSV9QUk9UX05PUk1BTCkKLQkJcmV0dXJuIHFsYTI0eHhfc3RhcnRfc2NzaShzcCk7CisJLyogT25seSBwcm9jZXNzIHByb3RlY3Rpb24gb3IgPjE2IGNkYiBpbiB0aGlzIHJvdXRpbmUgKi8KKwlpZiAoc2NzaV9nZXRfcHJvdF9vcChjbWQpID09IFNDU0lfUFJPVF9OT1JNQUwpIHsKKwkJaWYgKGNtZC0+Y21kX2xlbiA8PSAxNikKKwkJCXJldHVybiBxbGEyNHh4X3N0YXJ0X3Njc2koc3ApOworCX0KIAogCS8qIFNldHVwIGRldmljZSBwb2ludGVycy4gKi8KIApAQCAtMTU1OSwxMSArMTUwNiw5IEBACiB9CiAKIC8qIEdlbmVyaWMgQ29udHJvbC1TUkIgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4gKi8KLQotc3RhdGljIHZvaWQgKgotcWxhMngwMF9hbGxvY19pb2NicyhzcmJfdCAqc3ApCit2b2lkICoKK3FsYTJ4MDBfYWxsb2NfaW9jYnMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHNyYl90ICpzcCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QJKnZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gSVNQX1FVRV9SRUcoaGEsIHJlcS0+aWQpOwpAQCAtMTU3Myw2ICsxNTE4LDEwIEBACiAKIAlwa3QgPSBOVUxMOwogCXJlcV9jbnQgPSAxOworCWhhbmRsZSA9IDA7CisKKwlpZiAoIXNwKQorCQlnb3RvIHNraXBfY21kX2FycmF5OwogCiAJLyogQ2hlY2sgZm9yIHJvb20gaW4gb3V0c3RhbmRpbmcgY29tbWFuZCBsaXN0LiAqLwogCWhhbmRsZSA9IHJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQ7CkBAIC0xNTg2LDEwICsxNTM1LDE4IEBACiAJaWYgKGluZGV4ID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKIAkJZ290byBxdWV1aW5nX2Vycm9yOwogCisJLyogUHJlcCBjb21tYW5kIGFycmF5LiAqLworCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CisJcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKKwlzcC0+aGFuZGxlID0gaGFuZGxlOworCitza2lwX2NtZF9hcnJheToKIAkvKiBDaGVjayBmb3Igcm9vbSBvbiByZXF1ZXN0IHF1ZXVlLiAqLwogCWlmIChyZXEtPmNudCA8IHJlcV9jbnQpIHsKIAkJaWYgKGhhLT5tcWVuYWJsZSkKIAkJCWNudCA9IFJEX1JFR19EV09SRCgmcmVnLT5pc3AyNW1xLnJlcV9xX291dCk7CisJCWVsc2UgaWYgKElTX1FMQTgyWFgoaGEpKQorCQkJY250ID0gUkRfUkVHX0RXT1JEKCZyZWctPmlzcDgyLnJlcV9xX291dCk7CiAJCWVsc2UgaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCQljbnQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucmVxX3Ffb3V0KTsKIAkJZWxzZQpAQCAtMTYwNiwxNSArMTU2MywxMSBAQAogCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CiAKIAkvKiBQcmVwIHBhY2tldCAqLwotCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7Ci0JcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKIAlyZXEtPmNudCAtPSByZXFfY250OwotCiAJcGt0ID0gcmVxLT5yaW5nX3B0cjsKIAltZW1zZXQocGt0LCAwLCBSRVFVRVNUX0VOVFJZX1NJWkUpOwogCXBrdC0+ZW50cnlfY291bnQgPSByZXFfY250OwogCXBrdC0+aGFuZGxlID0gaGFuZGxlOwotCXNwLT5oYW5kbGUgPSBoYW5kbGU7CiAKIHF1ZXVpbmdfZXJyb3I6CiAJcmV0dXJuIHBrdDsKQEAgLTE2ODMsNyArMTYzNiw3IEBACiAJc3RydWN0IHNyYl9pb2NiICpsaW8gPSBjdHgtPnUuaW9jYl9jbWQ7CiAJdWludDE2X3Qgb3B0czsKIAotCW1ieC0+ZW50cnlfdHlwZSA9IE1CWF9JT0NCX1RZUEU7OworCW1ieC0+ZW50cnlfdHlwZSA9IE1CWF9JT0NCX1RZUEU7CiAJU0VUX1RBUkdFVF9JRChoYSwgbWJ4LT5sb29wX2lkLCBzcC0+ZmNwb3J0LT5sb29wX2lkKTsKIAltYngtPm1iMCA9IGNwdV90b19sZTE2KE1CQ19MT0dJTl9GQUJSSUNfUE9SVCk7CiAJb3B0cyA9IGxpby0+dS5sb2dpby5mbGFncyAmIFNSQl9MT0dJTl9DT05EX1BMT0dJID8gQklUXzAgOiAwOwpAQCAtMTcxOCw3ICsxNjcxLDcgQEAKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gc3AtPmZjcG9ydC0+dmhhLT5odzsKIAotCW1ieC0+ZW50cnlfdHlwZSA9IE1CWF9JT0NCX1RZUEU7OworCW1ieC0+ZW50cnlfdHlwZSA9IE1CWF9JT0NCX1RZUEU7CiAJU0VUX1RBUkdFVF9JRChoYSwgbWJ4LT5sb29wX2lkLCBzcC0+ZmNwb3J0LT5sb29wX2lkKTsKIAltYngtPm1iMCA9IGNwdV90b19sZTE2KE1CQ19MT0dPVVRfRkFCUklDX1BPUlQpOwogCW1ieC0+bWIxID0gSEFTX0VYVEVOREVEX0lEUyhoYSkgPwpAQCAtMTc5NSwzMSArMTc0OCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyNHh4X21hcmtlcl9pb2NiKHNyYl90ICpzcCwgc3RydWN0IG1ya19lbnRyeV8yNHh4ICptcmspCi17Ci0JdWludDE2X3QgbHVuOwotCXVpbnQ4X3QgbW9kaWY7Ci0Jc3RydWN0IGZjX3BvcnQgKmZjcG9ydCA9IHNwLT5mY3BvcnQ7Ci0Jc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBmY3BvcnQtPnZoYTsKLQlzdHJ1Y3Qgc3JiX2N0eCAqY3R4ID0gc3AtPmN0eDsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKmlvY2IgPSBjdHgtPnUuaW9jYl9jbWQ7Ci0Jc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+cmVxOwotCi0JbHVuID0gaW9jYi0+dS5tYXJrZXIubHVuOwotCW1vZGlmID0gaW9jYi0+dS5tYXJrZXIubW9kaWY7Ci0JbXJrLT5lbnRyeV90eXBlID0gTUFSS0VSX1RZUEU7Ci0JbXJrLT5tb2RpZmllciA9IG1vZGlmOwotCWlmIChtb2RpZiAhPSAgTUtfU1lOQ19BTEwpIHsKLQkJbXJrLT5ucG9ydF9oYW5kbGUgPSBjcHVfdG9fbGUxNihmY3BvcnQtPmxvb3BfaWQpOwotCQltcmstPmx1blsxXSA9IExTQihsdW4pOwotCQltcmstPmx1blsyXSA9IE1TQihsdW4pOwotCQlob3N0X3RvX2ZjcF9zd2FwKG1yay0+bHVuLCBzaXplb2YobXJrLT5sdW4pKTsKLQkJbXJrLT52cF9pbmRleCA9IHZoYS0+dnBfaWR4OwotCQltcmstPmhhbmRsZSA9IE1BS0VfSEFORExFKHJlcS0+aWQsIG1yay0+aGFuZGxlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCiBxbGEyNHh4X2Vsc19pb2NiKHNyYl90ICpzcCwgc3RydWN0IGVsc19lbnRyeV8yNHh4ICplbHNfaW9jYikKIHsKIAlzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYiA9ICgoc3RydWN0IHNyYl9jdHggKilzcC0+Y3R4KS0+dS5ic2dfam9iOwpAQCAtMTg2NCw2ICsxNzkyLDgyIEBACiB9CiAKIHN0YXRpYyB2b2lkCitxbGEyeDAwX2N0X2lvY2Ioc3JiX3QgKnNwLCBtc19pb2NiX2VudHJ5X3QgKmN0X2lvY2IpCit7CisJdWludDE2X3QgICAgICAgIGF2YWlsX2RzZHM7CisJdWludDMyX3QgICAgICAgICpjdXJfZHNkOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGluZGV4OworCXVpbnQxNl90IHRvdF9kc2RzOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc3AtPmZjcG9ydC0+dmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCBmY19ic2dfam9iICpic2dfam9iID0gKChzdHJ1Y3Qgc3JiX2N0eCAqKXNwLT5jdHgpLT51LmJzZ19qb2I7CisJaW50IGxvb3BfaXRlcmFydGlvbiA9IDA7CisJaW50IGNvbnRfaW9jYl9wcnNudCA9IDA7CisJaW50IGVudHJ5X2NvdW50ID0gMTsKKworCW1lbXNldChjdF9pb2NiLCAwLCBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJY3RfaW9jYi0+ZW50cnlfdHlwZSA9IENUX0lPQ0JfVFlQRTsKKwljdF9pb2NiLT5lbnRyeV9zdGF0dXMgPSAwOworCWN0X2lvY2ItPmhhbmRsZTEgPSBzcC0+aGFuZGxlOworCVNFVF9UQVJHRVRfSUQoaGEsIGN0X2lvY2ItPmxvb3BfaWQsIHNwLT5mY3BvcnQtPmxvb3BfaWQpOworCWN0X2lvY2ItPnN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJY3RfaW9jYi0+Y29udHJvbF9mbGFncyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJY3RfaW9jYi0+dGltZW91dCA9IDA7CisJY3RfaW9jYi0+Y21kX2RzZF9jb3VudCA9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCk7CisJY3RfaW9jYi0+dG90YWxfZHNkX2NvdW50ID0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250ICsgMSk7CisJY3RfaW9jYi0+cmVxX2J5dGVjb3VudCA9CisJICAgIGNwdV90b19sZTMyKGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5wYXlsb2FkX2xlbik7CisJY3RfaW9jYi0+cnNwX2J5dGVjb3VudCA9CisJICAgIGNwdV90b19sZTMyKGJzZ19qb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW4pOworCisJY3RfaW9jYi0+ZHNlZ19yZXFfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChzZ19kbWFfYWRkcmVzcworCSAgICAoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QpKSk7CisJY3RfaW9jYi0+ZHNlZ19yZXFfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChzZ19kbWFfYWRkcmVzcworCSAgICAoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QpKSk7CisJY3RfaW9jYi0+ZHNlZ19yZXFfbGVuZ3RoID0gY3RfaW9jYi0+cmVxX2J5dGVjb3VudDsKKworCWN0X2lvY2ItPmRzZWdfcnNwX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0Qoc2dfZG1hX2FkZHJlc3MKKwkgICAgKGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCkpKTsKKwljdF9pb2NiLT5kc2VnX3JzcF9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKHNnX2RtYV9hZGRyZXNzCisJICAgIChic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QpKSk7CisJY3RfaW9jYi0+ZHNlZ19yc3BfbGVuZ3RoID0gY3RfaW9jYi0+cnNwX2J5dGVjb3VudDsKKworCWF2YWlsX2RzZHMgPSAxOworCWN1cl9kc2QgPSAodWludDMyX3QgKiljdF9pb2NiLT5kc2VnX3JzcF9hZGRyZXNzOworCWluZGV4ID0gMDsKKwl0b3RfZHNkcyA9IGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250OworCisJZm9yX2VhY2hfc2coYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LCBzZywgdG90X2RzZHMsIGluZGV4KSB7CisJCWRtYV9hZGRyX3QgICAgICAgc2xlX2RtYTsKKwkJY29udF9hNjRfZW50cnlfdCAqY29udF9wa3Q7CisKKwkJLyogQWxsb2NhdGUgYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFja2V0cz8gKi8KKwkJaWYgKGF2YWlsX2RzZHMgPT0gMCkgeworCQkJLyoKKwkJCSogRml2ZSBEU0RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENvbnQuCisJCQkqIFR5cGUgMSBJT0NCLgorCQkJICAgICAgICovCisJCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2IodmhhKTsKKwkJCWN1cl9kc2QgPSAodWludDMyX3QgKikgY29udF9wa3QtPmRzZWdfMF9hZGRyZXNzOworCQkJYXZhaWxfZHNkcyA9IDU7CisJCQljb250X2lvY2JfcHJzbnQgPSAxOworCQkJZW50cnlfY291bnQrKzsKKwkJfQorCisJCXNsZV9kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCSpjdXJfZHNkKysgICA9IGNwdV90b19sZTMyKExTRChzbGVfZG1hKSk7CisJCSpjdXJfZHNkKysgICA9IGNwdV90b19sZTMyKE1TRChzbGVfZG1hKSk7CisJCSpjdXJfZHNkKysgICA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJbG9vcF9pdGVyYXJ0aW9uKys7CisJCWF2YWlsX2RzZHMtLTsKKwl9CisJY3RfaW9jYi0+ZW50cnlfY291bnQgPSBlbnRyeV9jb3VudDsKK30KKworc3RhdGljIHZvaWQKIHFsYTI0eHhfY3RfaW9jYihzcmJfdCAqc3AsIHN0cnVjdCBjdF9lbnRyeV8yNHh4ICpjdF9pb2NiKQogewogCXVpbnQxNl90ICAgICAgICBhdmFpbF9kc2RzOwpAQCAtMTk0NSw3ICsxOTQ5LDcgQEAKIAogCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCXBrdCA9IHFsYTJ4MDBfYWxsb2NfaW9jYnMoc3ApOworCXBrdCA9IHFsYTJ4MDBfYWxsb2NfaW9jYnMoc3AtPmZjcG9ydC0+dmhhLCBzcCk7CiAJaWYgKCFwa3QpCiAJCWdvdG8gZG9uZTsKIApAQCAtMTk2Niw3ICsxOTcwLDkgQEAKIAkJcWxhMjR4eF9lbHNfaW9jYihzcCwgcGt0KTsKIAkJYnJlYWs7CiAJY2FzZSBTUkJfQ1RfQ01EOgotCQlxbGEyNHh4X2N0X2lvY2Ioc3AsIHBrdCk7CisJCUlTX0ZXSTJfQ0FQQUJMRShoYSkgPworCQlxbGEyNHh4X2N0X2lvY2Ioc3AsIHBrdCkgOgorCQlxbGEyeDAwX2N0X2lvY2Ioc3AsIHBrdCk7CiAJCWJyZWFrOwogCWNhc2UgU1JCX0FESVNDX0NNRDoKIAkJSVNfRldJMl9DQVBBQkxFKGhhKSA/CkBAIC0xOTc2LDkgKzE5ODIsNiBAQAogCWNhc2UgU1JCX1RNX0NNRDoKIAkJcWxhMjR4eF90bV9pb2NiKHNwLCBwa3QpOwogCQlicmVhazsKLQljYXNlIFNSQl9NQVJLRVJfQ01EOgotCQlxbGEyNHh4X21hcmtlcl9pb2NiKHNwLCBwa3QpOwotCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggYmUzZDhiZS4uNjk4MmJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtNTQ1LDEwICs1NDUsMTMgQEAKIAkJaWYgKElTX1FMQTIxMDAoaGEpKQogCQkJYnJlYWs7CiAKLQkJaWYgKElTX1FMQThYWFhfVFlQRShoYSkpCisJCWlmIChJU19RTEE4WFhYX1RZUEUoaGEpKSB7CiAJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IERDQlggQ29tcGxldGVkIC0tICUwNHggJTA0eCAiCiAJCQkgICAgIiUwNHhcbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOwotCQllbHNlCisJCQlpZiAoaGEtPm5vdGlmeV9kY2J4X2NvbXApCisJCQkJY29tcGxldGUoJmhhLT5kY2J4X2NvbXApOworCisJCX0gZWxzZQogCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgIgogCQkJICAgICJyZWNlaXZlZC5cbiIsIHZoYS0+aG9zdF9ubykpOwogCkBAIC05MTgsMTIgKzkyMSwxNSBAQAogCSAgICBRTEFfTE9HSU9fTE9HSU5fUkVUUklFRCA6IDA7CiAJaWYgKG1ieC0+ZW50cnlfc3RhdHVzKSB7CiAJCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBlcnJvciBlbnRyeSAtIGVudHJ5LXN0YXR1cz0leCAiCi0JCSAgICAic3RhdHVzPSV4IHN0YXRlLWZsYWc9JXggc3RhdHVzLWZsYWdzPSV4LlxuIiwKKwkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIGVudHJ5IC0gcG9ydGlkPSUwMnglMDJ4JTAyeCAiCisJCSAgICAiZW50cnktc3RhdHVzPSV4IHN0YXR1cz0leCBzdGF0ZS1mbGFnPSV4ICIKKwkJICAgICJzdGF0dXMtZmxhZ3M9JXguXG4iLAogCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBtYngtPmVudHJ5X3N0YXR1cywgbGUxNl90b19jcHUobWJ4LT5zdGF0dXMpLAotCQkgICAgbGUxNl90b19jcHUobWJ4LT5zdGF0ZV9mbGFncyksCisJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbWJ4LT5lbnRyeV9zdGF0dXMsCisJCSAgICBsZTE2X3RvX2NwdShtYngtPnN0YXR1cyksIGxlMTZfdG9fY3B1KG1ieC0+c3RhdGVfZmxhZ3MpLAogCQkgICAgbGUxNl90b19jcHUobWJ4LT5zdGF0dXNfZmxhZ3MpKSk7CisKIAkJREVCVUcyKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltYngsIHNpemVvZigqbWJ4KSkpOwogCiAJCWdvdG8gbG9naW9fZG9uZTsKQEAgLTkzNSwxNiArOTQxLDE4IEBACiAJCXN0YXR1cyA9IDA7CiAJaWYgKCFzdGF0dXMgJiYgbGUxNl90b19jcHUobWJ4LT5tYjApID09IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7CiAJCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgY29tcGxldGUgLSBtYngxPSV4LlxuIiwKKwkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGNvbXBsZXRlIC0gcG9ydGlkPSUwMnglMDJ4JTAyeCAiCisJCSAgICAibWJ4MT0leC5cbiIsCiAJCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIGxlMTZfdG9fY3B1KG1ieC0+bWIxKSkpOworCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGxlMTZfdG9fY3B1KG1ieC0+bWIxKSkpOwogCiAJCWRhdGFbMF0gPSBNQlNfQ09NTUFORF9DT01QTEVURTsKIAkJaWYgKGN0eC0+dHlwZSA9PSBTUkJfTE9HSU5fQ01EKSB7CiAJCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9UQVJHRVQ7CiAJCQlpZiAobGUxNl90b19jcHUobWJ4LT5tYjEpICYgQklUXzApCiAJCQkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfSU5JVElBVE9SOwotCQkJaWYgKGxlMTZfdG9fY3B1KG1ieC0+bWIxKSAmIEJJVF8xKQorCQkJZWxzZSBpZiAobGUxNl90b19jcHUobWJ4LT5tYjEpICYgQklUXzEpCiAJCQkJZmNwb3J0LT5mbGFncyB8PSBGQ0ZfRkNQMl9ERVZJQ0U7CiAJCX0KIAkJZ290byBsb2dpb19kb25lOwpAQCAtOTYzLDkgKzk3MSwxMCBAQAogCX0KIAogCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGZhaWxlZCAtIHN0YXR1cz0leCBtYjA9JXggbWIxPSV4IG1iMj0leCAiCi0JICAgICJtYjY9JXggbWI3PSV4LlxuIiwKLQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsIHN0YXR1cywKKwkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZmFpbGVkIC0gcG9ydGlkPSUwMnglMDJ4JTAyeCBzdGF0dXM9JXggIgorCSAgICAibWIwPSV4IG1iMT0leCBtYjI9JXggbWI2PSV4IG1iNz0leC5cbiIsCisJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBzdGF0dXMsCiAJICAgIGxlMTZfdG9fY3B1KG1ieC0+bWIwKSwgbGUxNl90b19jcHUobWJ4LT5tYjEpLAogCSAgICBsZTE2X3RvX2NwdShtYngtPm1iMiksIGxlMTZfdG9fY3B1KG1ieC0+bWI2KSwKIAkgICAgbGUxNl90b19jcHUobWJ4LT5tYjcpKSk7CkBAIC05NzUsNiArOTg0LDg2IEBACiB9CiAKIHN0YXRpYyB2b2lkCitxbGEyeDAwX2N0X2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLAorICAgIHN0c19lbnRyeV90ICpwa3QsIGludCBpb2NiX3R5cGUpCit7CisJY29uc3QgY2hhciBmdW5jW10gPSAiQ1RfSU9DQiI7CisJY29uc3QgY2hhciAqdHlwZTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzcmJfdCAqc3A7CisJc3RydWN0IHNyYl9jdHggKnNwX2JzZzsKKwlzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYjsKKwl1aW50MTZfdCBjb21wX3N0YXR1czsKKworCXNwID0gcWxhMngwMF9nZXRfc3BfZnJvbV9oYW5kbGUodmhhLCBmdW5jLCByZXEsIHBrdCk7CisJaWYgKCFzcCkKKwkJcmV0dXJuOworCisJc3BfYnNnID0gc3AtPmN0eDsKKwlic2dfam9iID0gc3BfYnNnLT51LmJzZ19qb2I7CisKKwl0eXBlID0gTlVMTDsKKwlzd2l0Y2ggKHNwX2JzZy0+dHlwZSkgeworCWNhc2UgU1JCX0NUX0NNRDoKKwkJdHlwZSA9ICJjdCBwYXNzLXRocm91Z2giOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiJXM6IFVucmVjb2duaXplZCBTUkI6ICglcCkgdHlwZT0lZC5cbiIsIGZ1bmMsIHNwLAorCQkgICAgc3BfYnNnLT50eXBlKTsKKwkJcmV0dXJuOworCX0KKworCWNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT5jb21wX3N0YXR1cyk7CisKKwkvKiByZXR1cm4gRkNfQ1RFTFNfU1RBVFVTX09LIGFuZCBsZWF2ZSB0aGUgZGVjb2Rpbmcgb2YgdGhlIEVMUy9DVAorCSAqIGZjIHBheWxvYWQgIHRvIHRoZSBjYWxsZXIKKwkgKi8KKwlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS5jdGVsc19yZXBseS5zdGF0dXMgPSBGQ19DVEVMU19TVEFUVVNfT0s7CisJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOworCisJaWYgKGNvbXBfc3RhdHVzICE9IENTX0NPTVBMRVRFKSB7CisJCWlmIChjb21wX3N0YXR1cyA9PSBDU19EQVRBX1VOREVSUlVOKSB7CisJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9CisJCQkgICAgbGUxNl90b19jcHUoKChzdHNfZW50cnlfdCAqKXBrdCktPnJzcF9pbmZvX2xlbik7CisKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgInNjc2koJWxkKTogQ1QgcGFzcy10aHJvdWdoLSVzIGVycm9yICIKKwkJCSAgICAiY29tcF9zdGF0dXMtc3RhdHVzPTB4JXggdG90YWxfYnl0ZSA9IDB4JXguXG4iLAorCQkJICAgIHZoYS0+aG9zdF9ubywgdHlwZSwgY29tcF9zdGF0dXMsCisJCQkgICAgYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbikpOworCQl9IGVsc2UgeworCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAic2NzaSglbGQpOiBDVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgIgorCQkJICAgICJjb21wX3N0YXR1cy1zdGF0dXM9MHgleC5cbiIsCisJCQkgICAgdmhhLT5ob3N0X25vLCB0eXBlLCBjb21wX3N0YXR1cykpOworCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCQl9CisJCURFQlVHMihxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopcGt0LCBzaXplb2YoKnBrdCkpKTsKKwl9IGVsc2UgeworCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gIERJRF9PSyA8PCAxNjs7CisJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwkJYnNnX2pvYi0+cmVwbHlfbGVuID0gMDsKKwl9CisKKwlkbWFfdW5tYXBfc2coJmhhLT5wZGV2LT5kZXYsIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAorCSAgICBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBETUFfVE9fREVWSUNFKTsKKworCWRtYV91bm1hcF9zZygmaGEtPnBkZXYtPmRldiwgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAorCSAgICBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgRE1BX0ZST01fREVWSUNFKTsKKworCWlmIChzcF9ic2ctPnR5cGUgPT0gU1JCX0VMU19DTURfSFNUIHx8IHNwX2JzZy0+dHlwZSA9PSBTUkJfQ1RfQ01EKQorCQlrZnJlZShzcC0+ZmNwb3J0KTsKKworCWtmcmVlKHNwLT5jdHgpOworCW1lbXBvb2xfZnJlZShzcCwgaGEtPnNyYl9tZW1wb29sKTsKKwlic2dfam9iLT5qb2JfZG9uZShic2dfam9iKTsKK30KKworc3RhdGljIHZvaWQKIHFsYTI0eHhfZWxzX2N0X2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLAogICAgIHN0cnVjdCBzdHNfZW50cnlfMjR4eCAqcGt0LCBpbnQgaW9jYl90eXBlKQogewpAQCAtMTA5Niw5ICsxMTg1LDExIEBACiAJCVFMQV9MT0dJT19MT0dJTl9SRVRSSUVEIDogMDsKIAlpZiAobG9naW8tPmVudHJ5X3N0YXR1cykgewogCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgZW50cnkgLSBlbnRyeS1zdGF0dXM9JXguXG4iLAorCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgZW50cnkgLSAiCisJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeCBlbnRyeS1zdGF0dXM9JXguXG4iLAogCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBsb2dpby0+ZW50cnlfc3RhdHVzKSk7CisJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbG9naW8tPmVudHJ5X3N0YXR1cykpOwogCQlERUJVRzIocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWxvZ2lvLCBzaXplb2YoKmxvZ2lvKSkpOwogCiAJCWdvdG8gbG9naW9fZG9uZTsKQEAgLTExMDYsOCArMTE5NywxMSBAQAogCiAJaWYgKGxlMTZfdG9fY3B1KGxvZ2lvLT5jb21wX3N0YXR1cykgPT0gQ1NfQ09NUExFVEUpIHsKIAkJREVCVUcyKHByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBjb21wbGV0ZSAtIGlvcDA9JXguXG4iLAorCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgY29tcGxldGUgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4ICIKKwkJICAgICJpb3AwPSV4LlxuIiwKIAkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsCiAJCSAgICBsZTMyX3RvX2NwdShsb2dpby0+aW9fcGFyYW1ldGVyWzBdKSkpOwogCiAJCWRhdGFbMF0gPSBNQlNfQ09NTUFORF9DT01QTEVURTsKQEAgLTExMTksOSArMTIxMyw5IEBACiAJCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9UQVJHRVQ7CiAJCQlpZiAoaW9wWzBdICYgQklUXzgpCiAJCQkJZmNwb3J0LT5mbGFncyB8PSBGQ0ZfRkNQMl9ERVZJQ0U7Ci0JCX0KLQkJaWYgKGlvcFswXSAmIEJJVF81KQorCQl9IGVsc2UgaWYgKGlvcFswXSAmIEJJVF81KQogCQkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfSU5JVElBVE9SOworCiAJCWlmIChsb2dpby0+aW9fcGFyYW1ldGVyWzddIHx8IGxvZ2lvLT5pb19wYXJhbWV0ZXJbOF0pCiAJCQlmY3BvcnQtPnN1cHBvcnRlZF9jbGFzc2VzIHw9IEZDX0NPU19DTEFTUzI7CiAJCWlmIChsb2dpby0+aW9fcGFyYW1ldGVyWzldIHx8IGxvZ2lvLT5pb19wYXJhbWV0ZXJbMTBdKQpAQCAtMTE1Miw4ICsxMjQ2LDEwIEBACiAJfQogCiAJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZmFpbGVkIC0gY29tcD0leCBpb3AwPSV4IGlvcDE9JXguXG4iLAotCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKKwkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZmFpbGVkIC0gcG9ydGlkPSUwMnglMDJ4JTAyeCBjb21wPSV4ICIKKwkgICAgImlvcDA9JXggaW9wMT0leC5cbiIsCisJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLAogCSAgICBsZTE2X3RvX2NwdShsb2dpby0+Y29tcF9zdGF0dXMpLAogCSAgICBsZTMyX3RvX2NwdShsb2dpby0+aW9fcGFyYW1ldGVyWzBdKSwKIAkgICAgbGUzMl90b19jcHUobG9naW8tPmlvX3BhcmFtZXRlclsxXSkpKTsKQEAgLTEyMjIsMzkgKzEzMTgsNiBAQAogCWlvY2ItPmRvbmUoc3ApOwogfQogCi1zdGF0aWMgdm9pZAotcWxhMjR4eF9tYXJrZXJfaW9jYl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSwKLSAgICBzdHJ1Y3QgbXJrX2VudHJ5XzI0eHggKm1yaykKLXsKLQljb25zdCBjaGFyIGZ1bmNbXSA9ICJNUkstSU9DQiI7Ci0JY29uc3QgY2hhciAqdHlwZTsKLQlmY19wb3J0X3QgKmZjcG9ydDsKLQlzcmJfdCAqc3A7Ci0Jc3RydWN0IHNyYl9pb2NiICppb2NiOwotCXN0cnVjdCBzcmJfY3R4ICpjdHg7Ci0Jc3RydWN0IHN0c19lbnRyeV8yNHh4ICpzdHMgPSAoc3RydWN0IHN0c19lbnRyeV8yNHh4ICopbXJrOwotCi0Jc3AgPSBxbGEyeDAwX2dldF9zcF9mcm9tX2hhbmRsZSh2aGEsIGZ1bmMsIHJlcSwgbXJrKTsKLQlpZiAoIXNwKQotCQlyZXR1cm47Ci0KLQljdHggPSBzcC0+Y3R4OwotCWlvY2IgPSBjdHgtPnUuaW9jYl9jbWQ7Ci0JdHlwZSA9IGN0eC0+bmFtZTsKLQlmY3BvcnQgPSBzcC0+ZmNwb3J0OwotCi0JaWYgKHN0cy0+ZW50cnlfc3RhdHVzKSB7Ci0JCWlvY2ItPnUubWFya2VyLmRhdGEgPSAxOwotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgZW50cnkgLSBlbnRyeS1zdGF0dXM9JXguXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBzdHMtPmVudHJ5X3N0YXR1cykpOwotCQlERUJVRzIocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKW1yaywgc2l6ZW9mKCpzdHMpKSk7Ci0JfQotCi0JaW9jYi0+ZG9uZShzcCk7Ci19Ci0KIC8qKgogICogcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKCkgLSBQcm9jZXNzIHJlc3BvbnNlIHF1ZXVlIGVudHJpZXMuCiAgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKQEAgLTEzMjAsNiArMTM4Myw5IEBACiAJCQlxbGEyeDAwX21ieF9pb2NiX2VudHJ5KHZoYSwgcnNwLT5yZXEsCiAJCQkgICAgKHN0cnVjdCBtYnhfZW50cnkgKilwa3QpOwogCQkJYnJlYWs7CisJCWNhc2UgQ1RfSU9DQl9UWVBFOgorCQkJcWxhMngwMF9jdF9lbnRyeSh2aGEsIHJzcC0+cmVxLCBwa3QsIENUX0lPQ0JfVFlQRSk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIFR5cGUgTm90IFN1cHBvcnRlZC4gKi8KIAkJCURFQlVHNChwcmludGsoS0VSTl9XQVJOSU5HCkBAIC0xMzM3LDggKzE0MDMsOSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXFsYTJ4MDBfaGFuZGxlX3NlbnNlKHNyYl90ICpzcCwgdWludDhfdCAqc2Vuc2VfZGF0YSwgdWludDMyX3Qgc2Vuc2VfbGVuLAotCXN0cnVjdCByc3BfcXVlICpyc3ApCisKK3FsYTJ4MDBfaGFuZGxlX3NlbnNlKHNyYl90ICpzcCwgdWludDhfdCAqc2Vuc2VfZGF0YSwgdWludDMyX3QgcGFyX3NlbnNlX2xlbiwKKyAgICB1aW50MzJfdCBzZW5zZV9sZW4sIHN0cnVjdCByc3BfcXVlICpyc3ApCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY3AgPSBzcC0+Y21kOwogCkBAIC0xMzQ3LDggKzE0MTQsOCBAQAogCiAJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID0gc2Vuc2VfbGVuOwogCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciA9IGNwLT5zZW5zZV9idWZmZXI7Ci0JaWYgKHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCA+IDMyKQotCQlzZW5zZV9sZW4gPSAzMjsKKwlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID4gcGFyX3NlbnNlX2xlbikKKwkJc2Vuc2VfbGVuID0gcGFyX3NlbnNlX2xlbjsKIAogCW1lbWNweShjcC0+c2Vuc2VfYnVmZmVyLCBzZW5zZV9kYXRhLCBzZW5zZV9sZW4pOwogCkBAIC0xNDU1LDcgKzE1MjIsOCBAQAogCXVpbnQxNl90CW94X2lkOwogCXVpbnQ4X3QJCWxzY3NpX3N0YXR1czsKIAlpbnQzMl90CQlyZXNpZDsKLQl1aW50MzJfdAlzZW5zZV9sZW4sIHJzcF9pbmZvX2xlbiwgcmVzaWRfbGVuLCBmd19yZXNpZF9sZW47CisJdWludDMyX3Qgc2Vuc2VfbGVuLCBwYXJfc2Vuc2VfbGVuLCByc3BfaW5mb19sZW4sIHJlc2lkX2xlbiwKKwkgICAgZndfcmVzaWRfbGVuOwogCXVpbnQ4X3QJCSpyc3BfaW5mbywgKnNlbnNlX2RhdGE7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdWludDMyX3QgaGFuZGxlOwpAQCAtMTUxMyw3ICsxNTgxLDggQEAKIAlmY3BvcnQgPSBzcC0+ZmNwb3J0OwogCiAJb3hfaWQgPSAwOwotCXNlbnNlX2xlbiA9IHJzcF9pbmZvX2xlbiA9IHJlc2lkX2xlbiA9IGZ3X3Jlc2lkX2xlbiA9IDA7CisJc2Vuc2VfbGVuID0gcGFyX3NlbnNlX2xlbiA9IHJzcF9pbmZvX2xlbiA9IHJlc2lkX2xlbiA9CisJICAgIGZ3X3Jlc2lkX2xlbiA9IDA7CiAJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJaWYgKHNjc2lfc3RhdHVzICYgU1NfU0VOU0VfTEVOX1ZBTElEKQogCQkJc2Vuc2VfbGVuID0gbGUzMl90b19jcHUoc3RzMjQtPnNlbnNlX2xlbik7CkBAIC0xNTI3LDYgKzE1OTYsNyBAQAogCQlzZW5zZV9kYXRhID0gc3RzMjQtPmRhdGE7CiAJCWhvc3RfdG9fZmNwX3N3YXAoc3RzMjQtPmRhdGEsIHNpemVvZihzdHMyNC0+ZGF0YSkpOwogCQlveF9pZCA9IGxlMTZfdG9fY3B1KHN0czI0LT5veF9pZCk7CisJCXBhcl9zZW5zZV9sZW4gPSBzaXplb2Yoc3RzMjQtPmRhdGEpOwogCX0gZWxzZSB7CiAJCWlmIChzY3NpX3N0YXR1cyAmIFNTX1NFTlNFX0xFTl9WQUxJRCkKIAkJCXNlbnNlX2xlbiA9IGxlMTZfdG9fY3B1KHN0cy0+cmVxX3NlbnNlX2xlbmd0aCk7CkBAIC0xNTM1LDEzICsxNjA1LDE2IEBACiAJCXJlc2lkX2xlbiA9IGxlMzJfdG9fY3B1KHN0cy0+cmVzaWR1YWxfbGVuZ3RoKTsKIAkJcnNwX2luZm8gPSBzdHMtPnJzcF9pbmZvOwogCQlzZW5zZV9kYXRhID0gc3RzLT5yZXFfc2Vuc2VfZGF0YTsKKwkJcGFyX3NlbnNlX2xlbiA9IHNpemVvZihzdHMtPnJlcV9zZW5zZV9kYXRhKTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgYW55IEZDUCB0cmFuc3BvcnQgZXJyb3JzLiAqLwogCWlmIChzY3NpX3N0YXR1cyAmIFNTX1JFU1BPTlNFX0lORk9fTEVOX1ZBTElEKSB7CiAJCS8qIFNlbnNlIGRhdGEgbGllcyBiZXlvbmQgYW55IEZDUCBSRVNQT05TRSBkYXRhLiAqLwotCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKKwkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJCXNlbnNlX2RhdGEgKz0gcnNwX2luZm9fbGVuOworCQkJcGFyX3NlbnNlX2xlbiAtPSByc3BfaW5mb19sZW47CisJCX0KIAkJaWYgKHJzcF9pbmZvX2xlbiA+IDMgJiYgcnNwX2luZm9bM10pIHsKIAkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkgICAgInNjc2koJWxkOiVkOiVkKTogRkNQIEkvTyBwcm90b2NvbCBmYWlsdXJlICIKQEAgLTE2MDEsNyArMTY3NCw4IEBACiAJCWlmICghKHNjc2lfc3RhdHVzICYgU1NfU0VOU0VfTEVOX1ZBTElEKSkKIAkJCWJyZWFrOwogCi0JCXFsYTJ4MDBfaGFuZGxlX3NlbnNlKHNwLCBzZW5zZV9kYXRhLCBzZW5zZV9sZW4sIHJzcCk7CisJCXFsYTJ4MDBfaGFuZGxlX3NlbnNlKHNwLCBzZW5zZV9kYXRhLCBwYXJfc2Vuc2VfbGVuLCBzZW5zZV9sZW4sCisJCSAgICByc3ApOwogCQlicmVhazsKIAogCWNhc2UgQ1NfREFUQV9VTkRFUlJVTjoKQEAgLTE2NjUsNyArMTczOSw4IEBACiAJCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNTX1NFTlNFX0xFTl9WQUxJRCkpCiAJCQkJYnJlYWs7CiAKLQkJCXFsYTJ4MDBfaGFuZGxlX3NlbnNlKHNwLCBzZW5zZV9kYXRhLCBzZW5zZV9sZW4sIHJzcCk7CisJCQlxbGEyeDAwX2hhbmRsZV9zZW5zZShzcCwgc2Vuc2VfZGF0YSwgcGFyX3NlbnNlX2xlbiwKKwkJCSAgICBzZW5zZV9sZW4sIHJzcCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE3MDAsNiArMTc3NSw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBDU19SRVNFVDoKKwkJY3AtPnJlc3VsdCA9IERJRF9UUkFOU1BPUlRfRElTUlVQVEVEIDw8IDE2OworCQlicmVhazsKKwogCWNhc2UgQ1NfQUJPUlRFRDoKIAkJY3AtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKIAkJYnJlYWs7CkBAIC0xOTI2LDEwICsyMDA0LDYgQEAKIAkJCXFsYTI0eHhfdG1faW9jYl9lbnRyeSh2aGEsIHJzcC0+cmVxLAogCQkJICAgIChzdHJ1Y3QgdHNrX21nbXRfZW50cnkgKilwa3QpOwogCQkJYnJlYWs7Ci0JCWNhc2UgTUFSS0VSX1RZUEU6Ci0JCQlxbGEyNHh4X21hcmtlcl9pb2NiX2VudHJ5KHZoYSwgcnNwLT5yZXEsCi0JCQkgICAgKHN0cnVjdCBtcmtfZW50cnlfMjR4eCAqKXBrdCk7Ci0JCQlicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENUX0lPQ0JfVFlQRToKIAkJCXFsYTI0eHhfZWxzX2N0X2VudHJ5KHZoYSwgcnNwLT5yZXEsIHBrdCwgQ1RfSU9DQl9UWVBFKTsKIAkJCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmdmhhLT5ody0+bWJ4X2NtZF9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKaW5kZXggZjM2NTBkMC4uNjAwOWIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtMzcsNyArMzcsNyBAQAogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CiAJdWludDhfdAkJYWJvcnRfYWN0aXZlOwogCXVpbnQ4X3QJCWlvX2xvY2tfb247Ci0JdWludDE2X3QJY29tbWFuZDsKKwl1aW50MTZfdAljb21tYW5kID0gMDsKIAl1aW50MTZfdAkqaXB0cjsKIAl1aW50MTZfdCBfX2lvbWVtICpvcHRyOwogCXVpbnQzMl90CWNudDsKQEAgLTgzLDYgKzgzLDEzIEBACiAJCXJldHVybiBRTEFfRlVOQ1RJT05fVElNRU9VVDsKIAl9CiAKKwlpZiAoSVNfUUxBODJYWChoYSkgJiYgaGEtPmZsYWdzLmZ3X2h1bmcpIHsKKwkJLyogU2V0dGluZyBMaW5rLURvd24gZXJyb3IgKi8KKwkJbWNwLT5tYlswXSA9IE1CU19MSU5LX0RPV05fRVJST1I7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQlnb3RvIHByZW1hdHVyZV9leGl0OworCX0KKwogCWhhLT5mbGFncy5tYm94X2J1c3kgPSAxOwogCS8qIFNhdmUgbWFpbGJveCBjb21tYW5kIGZvciBkZWJ1ZyAqLwogCWhhLT5tY3AgPSBtY3A7CkBAIC0xNTEsNyArMTU4LDggQEAKIAkJCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9JTkZPCiAJCQkJICAgICIlcyglbGQpOiBQZW5kaW5nIE1haWxib3ggdGltZW91dC4gIgogCQkJCSAgICAiRXhpdGluZy5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOwotCQkJCXJldHVybiBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJCQkJZ290byBwcmVtYXR1cmVfZXhpdDsKIAkJCX0KIAkJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwODIuaGludCwgSElOVF9NQlhfSU5UX1BFTkRJTkcpOwogCQl9IGVsc2UgaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCkBAIC0xNzYsNyArMTg0LDggQEAKIAkJCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9JTkZPCiAJCQkJICAgICIlcyglbGQpOiBQZW5kaW5nIE1haWxib3ggdGltZW91dC4gIgogCQkJCSAgICAiRXhpdGluZy5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOwotCQkJCXJldHVybiBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJCQkJZ290byBwcmVtYXR1cmVfZXhpdDsKIAkJCX0KIAkJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwODIuaGludCwgSElOVF9NQlhfSU5UX1BFTkRJTkcpOwogCQl9IGVsc2UgaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCkBAIC0yMTQsNiArMjIzLDE1IEBACiAJCWhhLT5mbGFncy5tYm94X2ludCA9IDA7CiAJCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCisJCWlmIChJU19RTEE4MlhYKGhhKSAmJiBoYS0+ZmxhZ3MuZndfaHVuZykgeworCQkJaGEtPmZsYWdzLm1ib3hfYnVzeSA9IDA7CisJCQkvKiBTZXR0aW5nIExpbmstRG93biBlcnJvciAqLworCQkJbWNwLT5tYlswXSA9IE1CU19MSU5LX0RPV05fRVJST1I7CisJCQloYS0+bWNwID0gTlVMTDsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQkJZ290byBwcmVtYXR1cmVfZXhpdDsKKwkJfQorCiAJCWlmIChoYS0+bWFpbGJveF9vdXRbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpCiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIApAQCAtMjc5LDM1ICsyOTcsNTEgQEAKIAkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogdGltZW91dCBzY2hlZHVsZSAiCiAJCQkiaXNwX2Fib3J0X25lZWRlZC5cbiIsIF9fZnVuY19fLAogCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJyZWQuIFNjaGVkdWxpbmcgSVNQICIKLQkJCSAgICAiYWJvcnQuIGVlaF9idXN5OiAweCV4XG4iLCBoYS0+ZmxhZ3MuZWVoX2J1c3kpOwotCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncyk7Ci0JCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CisKKwkJCWlmICghdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpICYmCisJCQkgICAgIXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJlZC4gIgorCQkJCSAgICAiU2NoZWR1bGluZyBJU1AgIiAiYWJvcnQuIGVlaF9idXN5OiAweCV4XG4iLAorCQkJCSAgICBoYS0+ZmxhZ3MuZWVoX2J1c3kpOworCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CisJCQl9CiAJCX0gZWxzZSBpZiAoIWFib3J0X2FjdGl2ZSkgewogCQkJLyogY2FsbCBhYm9ydCBkaXJlY3RseSBzaW5jZSB3ZSBhcmUgaW4gdGhlIERQQyB0aHJlYWQgKi8KIAkJCURFQlVHKHByaW50aygiJXMoJWxkKTogdGltZW91dCBjYWxsaW5nIGFib3J0X2lzcFxuIiwKIAkJCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogdGltZW91dCBjYWxsaW5nICIKIAkJCSAgICAiYWJvcnRfaXNwXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJyZWQuIElzc3VpbmcgSVNQICIKLQkJCSAgICAiYWJvcnQuXG4iKTsKIAotCQkJc2V0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7Ci0JCQljbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwotCQkJaWYgKGhhLT5pc3Bfb3BzLT5hYm9ydF9pc3AoYmFzZV92aGEpKSB7Ci0JCQkJLyogRmFpbGVkLiByZXRyeSBsYXRlci4gKi8KLQkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWlmICghdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpICYmCisJCQkgICAgIXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJlZC4gIgorCQkJCSAgICAiSXNzdWluZyBJU1AgYWJvcnQuXG4iKTsKKworCQkJCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQljbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2lzcCh2aGEpKSB7CisJCQkJCS8qIEZhaWxlZC4gcmV0cnkgbGF0ZXIuICovCisJCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwKKwkJCQkJICAgICZ2aGEtPmRwY19mbGFncyk7CisJCQkJfQorCQkJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpOworCQkJCURFQlVHKHByaW50aygiJXMoJWxkKTogZmluaXNoZWQgYWJvcnRfaXNwXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQkJREVCVUcyXzNfMTEocHJpbnRrKAorCQkJCSAgICAiJXMoJWxkKTogZmluaXNoZWQgYWJvcnRfaXNwXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJCQl9Ci0JCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwotCQkJREVCVUcocHJpbnRrKCIlcyglbGQpOiBmaW5pc2hlZCBhYm9ydF9pc3BcbiIsIF9fZnVuY19fLAotCQkJICAgIGJhc2VfdmhhLT5ob3N0X25vKSk7Ci0JCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZpbmlzaGVkIGFib3J0X2lzcFxuIiwKLQkJCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJfQogCX0KIAorcHJlbWF0dXJlX2V4aXQ6CiAJLyogQWxsb3cgbmV4dCBtYnggY21kIHRvIGNvbWUgaW4uICovCiAJY29tcGxldGUoJmhhLT5tYnhfY21kX2NvbXApOwogCkBAIC04NjYsOCArOTAwLDggQEAKIAogCWwgPSBsOwogCXZoYSA9IGZjcG9ydC0+dmhhOwotCXJlcSA9IHZoYS0+aHctPnJlcV9xX21hcFt0YWddOwotCXJzcCA9IHZoYS0+aHctPnJzcF9xX21hcFt0YWddOworCXJlcSA9IHZoYS0+aHctPnJlcV9xX21hcFswXTsKKwlyc3AgPSByZXEtPnJzcDsKIAltY3AtPm1iWzBdID0gTUJDX0FCT1JUX1RBUkdFVDsKIAltY3AtPm91dF9tYiA9IE1CWF85fE1CWF8yfE1CWF8xfE1CWF8wOwogCWlmIChIQVNfRVhURU5ERURfSURTKHZoYS0+aHcpKSB7CkBAIC05MTUsOCArOTQ5LDggQEAKIAlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBmY3BvcnQtPnZoYS0+aG9zdF9ubykpOwogCiAJdmhhID0gZmNwb3J0LT52aGE7Ci0JcmVxID0gdmhhLT5ody0+cmVxX3FfbWFwW3RhZ107Ci0JcnNwID0gdmhhLT5ody0+cnNwX3FfbWFwW3RhZ107CisJcmVxID0gdmhhLT5ody0+cmVxX3FfbWFwWzBdOworCXJzcCA9IHJlcS0+cnNwOwogCW1jcC0+bWJbMF0gPSBNQkNfTFVOX1JFU0VUOwogCW1jcC0+b3V0X21iID0gTUJYXzl8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CiAJaWYgKEhBU19FWFRFTkRFRF9JRFModmhhLT5odykpCkBAIC0zOTUwLDYgKzM5ODQsNzIgQEAKIH0KIAogaW50CitxbGE4MXh4X2dldF9wb3J0X2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgKm1iKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTworCSAgICAiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKworCWlmICghSVNfUUxBODFYWChoYSkpCisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1BPUlRfQ09ORklHOworCW1jcC0+b3V0X21iID0gTUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOworCW1jcC0+ZmxhZ3MgPSAwOworCisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAorCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJfSBlbHNlIHsKKwkJLyogQ29weSBhbGwgYml0cyB0byBwcmVzZXJ2ZSBvcmlnaW5hbCB2YWx1ZSAqLworCQltZW1jcHkobWIsICZtY3AtPm1iWzFdLCBzaXplb2YodWludDE2X3QpICogNCk7CisKKwkJREVCVUcxMShwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwl9CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAorcWxhODF4eF9zZXRfcG9ydF9jb25maWcoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90ICptYikKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50ayhLRVJOX0lORk8KKwkgICAgIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisKKwltY3AtPm1iWzBdID0gTUJDX1NFVF9QT1JUX0NPTkZJRzsKKwkvKiBDb3B5IGFsbCBiaXRzIHRvIHByZXNlcnZlIG9yaWdpbmFsIHNldHRpbmcgKi8KKwltZW1jcHkoJm1jcC0+bWJbMV0sIG1iLCBzaXplb2YodWludDE2X3QpICogNCk7CisJbWNwLT5vdXRfbWIgPSBNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAorCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJfSBlbHNlCisJCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTworCQkgICAgIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCitpbnQKIHFsYTI0eHhfc2V0X2ZjcF9wcmlvKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50MTZfdCBwcmlvcml0eSwKIAkJdWludDE2X3QgKm1iKQogewpAQCAtNDAxMSw3ICs0MTExLDcgQEAKIAkJIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltZW1zZXQobWNwLCAwLCBzaXplb2YobWJ4X2NtZF90KSk7Ci0JbWNwLT5tYlswXSA9IE1CQ19UT0dHTEVfSU5UUjsKKwltY3AtPm1iWzBdID0gTUJDX1RPR0dMRV9JTlRFUlJVUFQ7CiAJbWNwLT5tYlsxXSA9IDE7CiAKIAltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOwpAQCAtNDA0Nyw3ICs0MTQ3LDcgQEAKIAkJIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltZW1zZXQobWNwLCAwLCBzaXplb2YobWJ4X2NtZF90KSk7Ci0JbWNwLT5tYlswXSA9IE1CQ19UT0dHTEVfSU5UUjsKKwltY3AtPm1iWzBdID0gTUJDX1RPR0dMRV9JTlRFUlJVUFQ7CiAJbWNwLT5tYlsxXSA9IDA7CiAKIAltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCmluZGV4IDgyMjBlN2IuLjk4N2M1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgotICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEwIFFMb2dpYyBDb3Jwb3JhdGlvbgogICoKICAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KQEAgLTEzNiw3ICsxMzYsOCBAQAogCiAJLyogQ2hlY2sgaWYgcGh5c2ljYWwgaGEgcG9ydCBpcyBVcCAqLwogCWlmIChhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTiAgfHwKLQkJYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpIHsKKwkJYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQgfHwKKwkJIShoYS0+Y3VycmVudF90b3BvbG9neSAmIElTUF9DRkdfRikpIHsKIAkJdmhhLT52cF9lcnJfc3RhdGUgPSAgVlBfRVJSX1BPUlREV047CiAJCWZjX3Zwb3J0X3NldF9zdGF0ZSh2aGEtPmZjX3Zwb3J0LCBGQ19WUE9SVF9MSU5LRE9XTik7CiAJCWdvdG8gZW5hYmxlX2ZhaWxlZDsKQEAgLTM5OCw3ICszOTksMTAgQEAKIAlob3N0LT5jYW5fcXVldWUgPSBiYXNlX3ZoYS0+cmVxLT5sZW5ndGggKyAxMjg7CiAJaG9zdC0+dGhpc19pZCA9IDI1NTsKIAlob3N0LT5jbWRfcGVyX2x1biA9IDM7Ci0JaG9zdC0+bWF4X2NtZF9sZW4gPSBNQVhfQ01EU1o7CisJaWYgKChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSkgJiYgcWwyeGVuYWJsZWRpZikKKwkJaG9zdC0+bWF4X2NtZF9sZW4gPSAzMjsKKwllbHNlCisJCWhvc3QtPm1heF9jbWRfbGVuID0gTUFYX0NNRFNaOwogCWhvc3QtPm1heF9jaGFubmVsID0gTUFYX0JVU0VTIC0gMTsKIAlob3N0LT5tYXhfbHVuID0gTUFYX0xVTlM7CiAJaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKQEAgLTQ4MSw3ICs0ODUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludAorc3RhdGljIGludAogcWxhMjV4eF9kZWxldGVfcnNwX3F1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQogewogCWludCByZXQgPSAtMTsKQEAgLTQ5NiwyMyArNTAwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcWxhMjV4eF91cGRhdGVfcmVxX3F1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1aW50OF90IHF1ZSwgdWludDhfdCBxb3MpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbcXVlXTsKLQotCXJlcS0+b3B0aW9ucyB8PSBCSVRfMzsKLQlyZXEtPnFvcyA9IHFvczsKLQlyZXQgPSBxbGEyNXh4X2luaXRfcmVxX3F1ZSh2aGEsIHJlcSk7Ci0JaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykKLQkJREVCVUcyXzE3KHByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkvKiByZXN0b3JlIG9wdGlvbnMgYml0ICovCi0JcmVxLT5vcHRpb25zICY9IH5CSVRfMzsKLQlyZXR1cm4gcmV0OwotfQotCi0KIC8qIERlbGV0ZSBhbGwgcXVldWVzIGZvciBhIGdpdmVuIHZob3N0ICovCiBpbnQKIHFsYTI1eHhfZGVsZXRlX3F1ZXVlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQpAQCAtNzM5LDM1ICs3MjYsMyBAQAogZmFpbGVkOgogCXJldHVybiAwOwogfQotCi1pbnQKLXFsYTI1eHhfY3JlYXRlX3F1ZXVlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1aW50OF90IHFvcykKLXsKLQl1aW50MTZfdCBvcHRpb25zID0gMDsKLQl1aW50OF90IHJldCA9IDA7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3RydWN0IHJzcF9xdWUgKnJzcDsKLQotCW9wdGlvbnMgfD0gQklUXzE7Ci0JcmV0ID0gcWxhMjV4eF9jcmVhdGVfcnNwX3F1ZShoYSwgb3B0aW9ucywgdmhhLT52cF9pZHgsIDAsIC0xKTsKLQlpZiAoIXJldCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJSZXNwb25zZSBRdWUgY3JlYXRlIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJlc3BvbnNlIFF1ZTolZCBjcmVhdGVkLlxuIiwgcmV0KTsKLQlyc3AgPSBoYS0+cnNwX3FfbWFwW3JldF07Ci0KLQlvcHRpb25zID0gMDsKLQlpZiAocW9zICYgQklUXzcpCi0JCW9wdGlvbnMgfD0gQklUXzg7Ci0JcmV0ID0gcWxhMjV4eF9jcmVhdGVfcmVxX3F1ZShoYSwgb3B0aW9ucywgdmhhLT52cF9pZHgsIDAsIHJldCwKLQkJCQkJcW9zICYgfkJJVF83KTsKLQlpZiAocmV0KSB7Ci0JCXZoYS0+cmVxID0gaGEtPnJlcV9xX21hcFtyZXRdOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSZXF1ZXN0IFF1ZTolZCBjcmVhdGVkLlxuIiwgcmV0KTsKLQl9IGVsc2UKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiUmVxdWVzdCBRdWUgY3JlYXRlIGZhaWxlZFxuIik7Ci0JcnNwLT5yZXEgPSBoYS0+cmVxX3FfbWFwW3JldF07Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYwppbmRleCBmZjU2MmRlLi45MTViNzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBRTEE4MlhYX1BDSV9PQ00wXzJNICgweGMwMDAwKQogI2RlZmluZSBWQUxJRF9PQ01fQUREUihhZGRyKSAoKChhZGRyKSAmIDB4M2Y4MDApICE9IDB4M2Y4MDApCiAjZGVmaW5lIEdFVF9NRU1fT0ZGU18yTShhZGRyKSAoYWRkciAmIE1BU0soMTgpKQorI2RlZmluZSBCTE9DS19QUk9URUNUX0JJVFMgMHgwRgogCiAvKiBDUkIgd2luZG93IHJlbGF0ZWQgKi8KICNkZWZpbmUgQ1JCX0JMSyhvZmYpCSgob2ZmID4+IDIwKSAmIDB4M2YpCkBAIC03OTYsMTc5ICs3OTcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludAotcWxhODJ4eF93cm1lbShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1NjQgb2ZmLCB2b2lkICpkYXRhLCBpbnQgc2l6ZSkKLXsKLQlpbnQgaSwgaiwgcmV0ID0gMCwgbG9vcCwgc3pbMl0sIG9mZjA7Ci0JdTMyIHRlbXA7Ci0JdTY0IG9mZjgsIG1lbV9jcmIsIHRtcHcsIHdvcmRbMl0gPSB7MCwgMH07Ci0jZGVmaW5lIE1BWF9DVExfQ0hFQ0sgICAxMDAwCi0JLyoKLQkgKiBJZiBub3QgTU4sIGdvIGNoZWNrIGZvciBNUyBvciBpbnZhbGlkLgotCSAqLwotCWlmIChvZmYgPj0gUUxBODJYWF9BRERSX1FEUl9ORVQgJiYgb2ZmIDw9IFFMQTgyWFhfUDNfQUREUl9RRFJfTkVUX01BWCkgewotCQltZW1fY3JiID0gUUxBODJYWF9DUkJfUURSX05FVDsKLQl9IGVsc2UgewotCQltZW1fY3JiID0gUUxBODJYWF9DUkJfRERSX05FVDsKLQkJaWYgKHFsYTgyeHhfcGNpX21lbV9ib3VuZF9jaGVjayhoYSwgb2ZmLCBzaXplKSA9PSAwKQotCQkJcmV0dXJuIHFsYTgyeHhfcGNpX21lbV93cml0ZV9kaXJlY3QoaGEsIG9mZiwKLQkJCSAgICBkYXRhLCBzaXplKTsKLQl9Ci0KLQlvZmY4ID0gb2ZmICYgMHhmZmZmZmZmODsKLQlvZmYwID0gb2ZmICYgMHg3OwotCXN6WzBdID0gKHNpemUgPCAoOCAtIG9mZjApKSA/IHNpemUgOiAoOCAtIG9mZjApOwotCXN6WzFdID0gc2l6ZSAtIHN6WzBdOwotCWxvb3AgPSAoKG9mZjAgKyBzaXplIC0gMSkgPj4gMykgKyAxOwotCi0JaWYgKChzaXplICE9IDgpIHx8IChvZmYwICE9IDApKSAgewotCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7Ci0JCQlpZiAocWxhODJ4eF9yZG1lbShoYSwgb2ZmOCArIChpIDw8IDMpLCAmd29yZFtpXSwgOCkpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAxOgotCQl0bXB3ID0gKigodTggKilkYXRhKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl0bXB3ID0gKigodTE2ICopZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJdG1wdyA9ICooKHUzMiAqKWRhdGEpOwotCQlicmVhazsKLQljYXNlIDg6Ci0JZGVmYXVsdDoKLQkJdG1wdyA9ICooKHU2NCAqKWRhdGEpOwotCQlicmVhazsKLQl9Ci0KLQl3b3JkWzBdICY9IH4oKH4ofjBVTEwgPDwgKHN6WzBdICogOCkpKSA8PCAob2ZmMCAqIDgpKTsKLQl3b3JkWzBdIHw9IHRtcHcgPDwgKG9mZjAgKiA4KTsKLQotCWlmIChsb29wID09IDIpIHsKLQkJd29yZFsxXSAmPSB+KH4wVUxMIDw8IChzelsxXSAqIDgpKTsKLQkJd29yZFsxXSB8PSB0bXB3ID4+IChzelswXSAqIDgpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKLQkJdGVtcCA9IG9mZjggKyAoaSA8PCAzKTsKLQkJcWxhODJ4eF93cl8zMihoYSwgbWVtX2NyYitNSVVfVEVTVF9BR1RfQUREUl9MTywgdGVtcCk7Ci0JCXRlbXAgPSAwOwotCQlxbGE4Mnh4X3dyXzMyKGhhLCBtZW1fY3JiK01JVV9URVNUX0FHVF9BRERSX0hJLCB0ZW1wKTsKLQkJdGVtcCA9IHdvcmRbaV0gJiAweGZmZmZmZmZmOwotCQlxbGE4Mnh4X3dyXzMyKGhhLCBtZW1fY3JiK01JVV9URVNUX0FHVF9XUkRBVEFfTE8sIHRlbXApOwotCQl0ZW1wID0gKHdvcmRbaV0gPj4gMzIpICYgMHhmZmZmZmZmZjsKLQkJcWxhODJ4eF93cl8zMihoYSwgbWVtX2NyYitNSVVfVEVTVF9BR1RfV1JEQVRBX0hJLCB0ZW1wKTsKLQkJdGVtcCA9IE1JVV9UQV9DVExfRU5BQkxFIHwgTUlVX1RBX0NUTF9XUklURTsKLQkJcWxhODJ4eF93cl8zMihoYSwgbWVtX2NyYitNSVVfVEVTVF9BR1RfQ1RSTCwgdGVtcCk7Ci0JCXRlbXAgPSBNSVVfVEFfQ1RMX1NUQVJUIHwgTUlVX1RBX0NUTF9FTkFCTEUgfCBNSVVfVEFfQ1RMX1dSSVRFOwotCQlxbGE4Mnh4X3dyXzMyKGhhLCBtZW1fY3JiK01JVV9URVNUX0FHVF9DVFJMLCB0ZW1wKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NUTF9DSEVDSzsgaisrKSB7Ci0JCQl0ZW1wID0gcWxhODJ4eF9yZF8zMihoYSwgbWVtX2NyYiArIE1JVV9URVNUX0FHVF9DVFJMKTsKLQkJCWlmICgodGVtcCAmIE1JVV9UQV9DVExfQlVTWSkgPT0gMCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID49IE1BWF9DVExfQ0hFQ0spIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkiJXM6IEZhaWwgdG8gd3JpdGUgdGhyb3VnaCBhZ2VudFxuIiwKLQkJCQlRTEEyWFhYX0RSSVZFUl9OQU1FKTsKLQkJCXJldCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1xbGE4Mnh4X3JkbWVtKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHU2NCBvZmYsIHZvaWQgKmRhdGEsIGludCBzaXplKQotewotCWludCBpLCBqID0gMCwgaywgc3RhcnQsIGVuZCwgbG9vcCwgc3pbMl0sIG9mZjBbMl07Ci0JdTMyIHRlbXA7Ci0JdTY0IG9mZjgsIHZhbCwgbWVtX2NyYiwgd29yZFsyXSA9IHswLCAwfTsKLSNkZWZpbmUgTUFYX0NUTF9DSEVDSyAgIDEwMDAKLQotCS8qCi0JICogSWYgbm90IE1OLCBnbyBjaGVjayBmb3IgTVMgb3IgaW52YWxpZC4KLQkgKi8KLQlpZiAob2ZmID49IFFMQTgyWFhfQUREUl9RRFJfTkVUICYmIG9mZiA8PSBRTEE4MlhYX1AzX0FERFJfUURSX05FVF9NQVgpCi0JCW1lbV9jcmIgPSBRTEE4MlhYX0NSQl9RRFJfTkVUOwotCWVsc2UgewotCQltZW1fY3JiID0gUUxBODJYWF9DUkJfRERSX05FVDsKLQkJaWYgKHFsYTgyeHhfcGNpX21lbV9ib3VuZF9jaGVjayhoYSwgb2ZmLCBzaXplKSA9PSAwKQotCQkJcmV0dXJuIHFsYTgyeHhfcGNpX21lbV9yZWFkX2RpcmVjdChoYSwgb2ZmLAotCQkJCWRhdGEsIHNpemUpOwotCX0KLQotCW9mZjggPSBvZmYgJiAweGZmZmZmZmY4OwotCW9mZjBbMF0gPSBvZmYgJiAweDc7Ci0Jb2ZmMFsxXSA9IDA7Ci0Jc3pbMF0gPSAoc2l6ZSA8ICg4IC0gb2ZmMFswXSkpID8gc2l6ZSA6ICg4IC0gb2ZmMFswXSk7Ci0Jc3pbMV0gPSBzaXplIC0gc3pbMF07Ci0JbG9vcCA9ICgob2ZmMFswXSArIHNpemUgLSAxKSA+PiAzKSArIDE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7Ci0JCXRlbXAgPSBvZmY4ICsgKGkgPDwgMyk7Ci0JCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIgKyBNSVVfVEVTVF9BR1RfQUREUl9MTywgdGVtcCk7Ci0JCXRlbXAgPSAwOwotCQlxbGE4Mnh4X3dyXzMyKGhhLCBtZW1fY3JiICsgTUlVX1RFU1RfQUdUX0FERFJfSEksIHRlbXApOwotCQl0ZW1wID0gTUlVX1RBX0NUTF9FTkFCTEU7Ci0JCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIgKyBNSVVfVEVTVF9BR1RfQ1RSTCwgdGVtcCk7Ci0JCXRlbXAgPSBNSVVfVEFfQ1RMX1NUQVJUIHwgTUlVX1RBX0NUTF9FTkFCTEU7Ci0JCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIgKyBNSVVfVEVTVF9BR1RfQ1RSTCwgdGVtcCk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IE1BWF9DVExfQ0hFQ0s7IGorKykgewotCQkJdGVtcCA9IHFsYTgyeHhfcmRfMzIoaGEsIG1lbV9jcmIgKyBNSVVfVEVTVF9BR1RfQ1RSTCk7Ci0JCQlpZiAoKHRlbXAgJiBNSVVfVEFfQ1RMX0JVU1kpID09IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA+PSBNQVhfQ1RMX0NIRUNLKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIiVzOiBGYWlsIHRvIHJlYWQgdGhyb3VnaCBhZ2VudFxuIiwKLQkJCQlRTEEyWFhYX0RSSVZFUl9OQU1FKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3RhcnQgPSBvZmYwW2ldID4+IDI7Ci0JCWVuZCAgID0gKG9mZjBbaV0gKyBzeltpXSAtIDEpID4+IDI7Ci0JCWZvciAoayA9IHN0YXJ0OyBrIDw9IGVuZDsgaysrKSB7Ci0JCQl0ZW1wID0gcWxhODJ4eF9yZF8zMihoYSwKLQkJCSAgICBtZW1fY3JiICsgTUlVX1RFU1RfQUdUX1JEREFUQShrKSk7Ci0JCQl3b3JkW2ldIHw9ICgodTY0KXRlbXAgPDwgKDMyICogaykpOwotCQl9Ci0JfQotCi0JaWYgKGogPj0gTUFYX0NUTF9DSEVDSykKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHN6WzBdID09IDgpIHsKLQkJdmFsID0gd29yZFswXTsKLQl9IGVsc2UgewotCQl2YWwgPSAoKHdvcmRbMF0gPj4gKG9mZjBbMF0gKiA4KSkgJiAofih+MFVMTCA8PCAoc3pbMF0gKiA4KSkpKSB8Ci0JCQkoKHdvcmRbMV0gJiAofih+MFVMTCA8PCAoc3pbMV0gKiA4KSkpKSA8PCAoc3pbMF0gKiA4KSk7Ci0JfQotCi0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAxOgotCQkqKHU4ICAqKWRhdGEgPSB2YWw7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJKih1MTYgKilkYXRhID0gdmFsOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCSoodTMyICopZGF0YSA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQkqKHU2NCAqKWRhdGEgPSB2YWw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogI2RlZmluZSBNVFVfRlVER0VfRkFDVE9SIDEwMAogdW5zaWduZWQgbG9uZyBxbGE4Mnh4X2RlY29kZV9jcmJfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC0xMzQ2LDExICsxMTc0LDYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKG9mZiA9PSAoUUxBODJYWF9DUkJfUEVHX05FVF8xICsgMHgxOCkpIHsKLQkJCWlmICghUUxBODJYWF9JU19SRVZJU0lPTl9QM1BMVVMoaGEtPmNoaXBfcmV2aXNpb24pKQotCQkJCWJ1ZltpXS5kYXRhID0gMHgxMDIwOwotCQl9Ci0KIAkJcWxhODJ4eF93cl8zMihoYSwgb2ZmLCBidWZbaV0uZGF0YSk7CiAKIAkJLyogSVNQIHJlcXVpcmVzIG11Y2ggYmlnZ2VyIGRlbGF5IHRvIHNldHRsZSBkb3duLApAQCAtMTQwNyw3ICsxMjMwLDggQEAKIHsKIAlpbnQgIGk7CiAJbG9uZyBzaXplID0gMDsKLQlsb25nIGZsYXNoYWRkciA9IEJPT1RMRF9TVEFSVCwgbWVtYWRkciA9IEJPT1RMRF9TVEFSVDsKKwlsb25nIGZsYXNoYWRkciA9IGhhLT5mbHRfcmVnaW9uX2Jvb3Rsb2FkIDw8IDI7CisJbG9uZyBtZW1hZGRyID0gQk9PVExEX1NUQVJUOwogCXU2NCBkYXRhOwogCXUzMiBoaWdoLCBsb3c7CiAJc2l6ZSA9IChJTUFHRV9TVEFSVCAtIEJPT1RMRF9TVEFSVCkgLyA4OwpAQCAtMTQyNywxMiArMTI1MSw4IEBACiAJfQogCXVkZWxheSgxMDApOwogCXJlYWRfbG9jaygmaGEtPmh3X2xvY2spOwotCWlmIChRTEE4MlhYX0lTX1JFVklTSU9OX1AzUExVUyhoYS0+Y2hpcF9yZXZpc2lvbikpIHsKLQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfUEVHX05FVF8wICsgMHgxOCwgMHgxMDIwKTsKLQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfR0xCX1NXX1JFU0VULCAweDgwMDAxZSk7Ci0JfSBlbHNlIHsKLQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfR0xCX1NXX1JFU0VULCAweDgwMDAxZCk7Ci0JfQorCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfMCArIDB4MTgsIDB4MTAyMCk7CisJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfR0xCX1NXX1JFU0VULCAweDgwMDAxZSk7CiAJcmVhZF91bmxvY2soJmhhLT5od19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NTksMTcgKzEyNzksMTAgQEAKIAkJCSAgICBvZmYsIGRhdGEsIHNpemUpOwogCX0KIAotCWlmIChRTEE4MlhYX0lTX1JFVklTSU9OX1AzUExVUyhoYS0+Y2hpcF9yZXZpc2lvbikpIHsKLQkJb2ZmOCA9IG9mZiAmIDB4ZmZmZmZmZjA7Ci0JCW9mZjBbMF0gPSBvZmYgJiAweGY7Ci0JCXN6WzBdID0gKHNpemUgPCAoMTYgLSBvZmYwWzBdKSkgPyBzaXplIDogKDE2IC0gb2ZmMFswXSk7Ci0JCXNoaWZ0X2Ftb3VudCA9IDQ7Ci0JfSBlbHNlIHsKLQkJb2ZmOCA9IG9mZiAmIDB4ZmZmZmZmZjg7Ci0JCW9mZjBbMF0gPSBvZmYgJiAweDc7Ci0JCXN6WzBdID0gKHNpemUgPCAoOCAtIG9mZjBbMF0pKSA/IHNpemUgOiAoOCAtIG9mZjBbMF0pOwotCQlzaGlmdF9hbW91bnQgPSA0OwotCX0KKwlvZmY4ID0gb2ZmICYgMHhmZmZmZmZmMDsKKwlvZmYwWzBdID0gb2ZmICYgMHhmOworCXN6WzBdID0gKHNpemUgPCAoMTYgLSBvZmYwWzBdKSkgPyBzaXplIDogKDE2IC0gb2ZmMFswXSk7CisJc2hpZnRfYW1vdW50ID0gNDsKIAlsb29wID0gKChvZmYwWzBdICsgc2l6ZSAtIDEpID4+IHNoaWZ0X2Ftb3VudCkgKyAxOwogCW9mZjBbMV0gPSAwOwogCXN6WzFdID0gc2l6ZSAtIHN6WzBdOwpAQCAtMTU0OSw3ICsxMzYyLDcgQEAKIAkJdTY0IG9mZiwgdm9pZCAqZGF0YSwgaW50IHNpemUpCiB7CiAJaW50IGksIGosIHJldCA9IDAsIGxvb3AsIHN6WzJdLCBvZmYwOwotCWludCBzY2FsZSwgc2hpZnRfYW1vdW50LCBwM3AsIHN0YXJ0d29yZDsKKwlpbnQgc2NhbGUsIHNoaWZ0X2Ftb3VudCwgc3RhcnR3b3JkOwogCXVpbnQzMl90IHRlbXA7CiAJdWludDY0X3Qgb2ZmOCwgbWVtX2NyYiwgdG1wdywgd29yZFsyXSA9IHswLCAwfTsKIApAQCAtMTU2OSwyOCArMTM4MiwxNiBAQAogCXN6WzBdID0gKHNpemUgPCAoOCAtIG9mZjApKSA/IHNpemUgOiAoOCAtIG9mZjApOwogCXN6WzFdID0gc2l6ZSAtIHN6WzBdOwogCi0JaWYgKFFMQTgyWFhfSVNfUkVWSVNJT05fUDNQTFVTKGhhLT5jaGlwX3JldmlzaW9uKSkgewotCQlvZmY4ID0gb2ZmICYgMHhmZmZmZmZmMDsKLQkJbG9vcCA9ICgoKG9mZiAmIDB4ZikgKyBzaXplIC0gMSkgPj4gNCkgKyAxOwotCQlzaGlmdF9hbW91bnQgPSA0OwotCQlzY2FsZSA9IDI7Ci0JCXAzcCA9IDE7Ci0JCXN0YXJ0d29yZCA9IChvZmYgJiAweGYpLzg7Ci0JfSBlbHNlIHsKLQkJb2ZmOCA9IG9mZiAmIDB4ZmZmZmZmZjg7Ci0JCWxvb3AgPSAoKG9mZjAgKyBzaXplIC0gMSkgPj4gMykgKyAxOwotCQlzaGlmdF9hbW91bnQgPSAzOwotCQlzY2FsZSA9IDE7Ci0JCXAzcCA9IDA7Ci0JCXN0YXJ0d29yZCA9IDA7Ci0JfQorCW9mZjggPSBvZmYgJiAweGZmZmZmZmYwOworCWxvb3AgPSAoKChvZmYgJiAweGYpICsgc2l6ZSAtIDEpID4+IDQpICsgMTsKKwlzaGlmdF9hbW91bnQgPSA0OworCXNjYWxlID0gMjsKKwlzdGFydHdvcmQgPSAob2ZmICYgMHhmKS84OwogCi0JaWYgKHAzcCB8fCAoc2l6ZSAhPSA4KSB8fCAob2ZmMCAhPSAwKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7Ci0JCQlpZiAocWxhODJ4eF9wY2lfbWVtX3JlYWRfMk0oaGEsIG9mZjggKwotCQkJICAgIChpIDw8IHNoaWZ0X2Ftb3VudCksICZ3b3JkW2kgKiBzY2FsZV0sIDgpKQotCQkJCXJldHVybiAtMTsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKKwkJaWYgKHFsYTgyeHhfcGNpX21lbV9yZWFkXzJNKGhhLCBvZmY4ICsKKwkJICAgIChpIDw8IHNoaWZ0X2Ftb3VudCksICZ3b3JkW2kgKiBzY2FsZV0sIDgpKQorCQkJcmV0dXJuIC0xOwogCX0KIAogCXN3aXRjaCAoc2l6ZSkgewpAQCAtMTYwOSwyNiArMTQxMCwxNiBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoUUxBODJYWF9JU19SRVZJU0lPTl9QM1BMVVMoaGEtPmNoaXBfcmV2aXNpb24pKSB7Ci0JCWlmIChzelswXSA9PSA4KSB7Ci0JCQl3b3JkW3N0YXJ0d29yZF0gPSB0bXB3OwotCQl9IGVsc2UgewotCQkJd29yZFtzdGFydHdvcmRdICY9Ci0JCQkJfigofih+MFVMTCA8PCAoc3pbMF0gKiA4KSkpIDw8IChvZmYwICogOCkpOwotCQkJd29yZFtzdGFydHdvcmRdIHw9IHRtcHcgPDwgKG9mZjAgKiA4KTsKLQkJfQotCQlpZiAoc3pbMV0gIT0gMCkgewotCQkJd29yZFtzdGFydHdvcmQrMV0gJj0gfih+MFVMTCA8PCAoc3pbMV0gKiA4KSk7Ci0JCQl3b3JkW3N0YXJ0d29yZCsxXSB8PSB0bXB3ID4+IChzelswXSAqIDgpOwotCQl9CisJaWYgKHN6WzBdID09IDgpIHsKKwkJd29yZFtzdGFydHdvcmRdID0gdG1wdzsKIAl9IGVsc2UgewotCQl3b3JkW3N0YXJ0d29yZF0gJj0gfigofih+MFVMTCA8PCAoc3pbMF0gKiA4KSkpIDw8IChvZmYwICogOCkpOworCQl3b3JkW3N0YXJ0d29yZF0gJj0KKwkJCX4oKH4ofjBVTEwgPDwgKHN6WzBdICogOCkpKSA8PCAob2ZmMCAqIDgpKTsKIAkJd29yZFtzdGFydHdvcmRdIHw9IHRtcHcgPDwgKG9mZjAgKiA4KTsKLQotCQlpZiAobG9vcCA9PSAyKSB7Ci0JCQl3b3JkWzFdICY9IH4ofjBVTEwgPDwgKHN6WzFdICogOCkpOwotCQkJd29yZFsxXSB8PSB0bXB3ID4+IChzelswXSAqIDgpOwotCQl9CisJfQorCWlmIChzelsxXSAhPSAwKSB7CisJCXdvcmRbc3RhcnR3b3JkKzFdICY9IH4ofjBVTEwgPDwgKHN6WzFdICogOCkpOworCQl3b3JkW3N0YXJ0d29yZCsxXSB8PSB0bXB3ID4+IChzelswXSAqIDgpOwogCX0KIAogCS8qCkBAIC0xNjQ1LDE0ICsxNDM2LDEyIEBACiAJCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIrTUlVX1RFU1RfQUdUX1dSREFUQV9MTywgdGVtcCk7CiAJCXRlbXAgPSAod29yZFtpICogc2NhbGVdID4+IDMyKSAmIDB4ZmZmZmZmZmY7CiAJCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIrTUlVX1RFU1RfQUdUX1dSREFUQV9ISSwgdGVtcCk7Ci0JCWlmIChRTEE4MlhYX0lTX1JFVklTSU9OX1AzUExVUyhoYS0+Y2hpcF9yZXZpc2lvbikpIHsKLQkJCXRlbXAgPSB3b3JkW2kqc2NhbGUgKyAxXSAmIDB4ZmZmZmZmZmY7Ci0JCQlxbGE4Mnh4X3dyXzMyKGhhLCBtZW1fY3JiICsKLQkJCSAgICBNSVVfVEVTVF9BR1RfV1JEQVRBX1VQUEVSX0xPLCB0ZW1wKTsKLQkJCXRlbXAgPSAod29yZFtpKnNjYWxlICsgMV0gPj4gMzIpICYgMHhmZmZmZmZmZjsKLQkJCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIgKwotCQkJICAgIE1JVV9URVNUX0FHVF9XUkRBVEFfVVBQRVJfSEksIHRlbXApOwotCQl9CisJCXRlbXAgPSB3b3JkW2kqc2NhbGUgKyAxXSAmIDB4ZmZmZmZmZmY7CisJCXFsYTgyeHhfd3JfMzIoaGEsIG1lbV9jcmIgKworCQkgICAgTUlVX1RFU1RfQUdUX1dSREFUQV9VUFBFUl9MTywgdGVtcCk7CisJCXRlbXAgPSAod29yZFtpKnNjYWxlICsgMV0gPj4gMzIpICYgMHhmZmZmZmZmZjsKKwkJcWxhODJ4eF93cl8zMihoYSwgbWVtX2NyYiArCisJCSAgICBNSVVfVEVTVF9BR1RfV1JEQVRBX1VQUEVSX0hJLCB0ZW1wKTsKIAogCQl0ZW1wID0gTUlVX1RBX0NUTF9FTkFCTEUgfCBNSVVfVEFfQ1RMX1dSSVRFOwogCQlxbGE4Mnh4X3dyXzMyKGhhLCBtZW1fY3JiICsgTUlVX1RFU1RfQUdUX0NUUkwsIHRlbXApOwpAQCAtMTY3Nyw2ICsxNDY2LDk0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCBxbGE4Mnh4X3VyaV90YWJsZV9kZXNjICoKK3FsYTgyeHhfZ2V0X3RhYmxlX2Rlc2MoY29uc3QgdTggKnVuaXJvbSwgaW50IHNlY3Rpb24pCit7CisJdWludDMyX3QgaTsKKwlzdHJ1Y3QgcWxhODJ4eF91cmlfdGFibGVfZGVzYyAqZGlyZWN0b3J5ID0KKwkJKHN0cnVjdCBxbGE4Mnh4X3VyaV90YWJsZV9kZXNjICopJnVuaXJvbVswXTsKKwlfX2xlMzIgb2Zmc2V0OworCV9fbGUzMiB0YWJfdHlwZTsKKwlfX2xlMzIgZW50cmllcyA9IGNwdV90b19sZTMyKGRpcmVjdG9yeS0+bnVtX2VudHJpZXMpOworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlvZmZzZXQgPSBjcHVfdG9fbGUzMihkaXJlY3RvcnktPmZpbmRleCkgKworCQkgICAgKGkgKiBjcHVfdG9fbGUzMihkaXJlY3RvcnktPmVudHJ5X3NpemUpKTsKKwkJdGFiX3R5cGUgPSBjcHVfdG9fbGUzMigqKCh1MzIgKikmdW5pcm9tW29mZnNldF0gKyA4KSk7CisKKwkJaWYgKHRhYl90eXBlID09IHNlY3Rpb24pCisJCQlyZXR1cm4gKHN0cnVjdCBxbGE4Mnh4X3VyaV90YWJsZV9kZXNjICopJnVuaXJvbVtvZmZzZXRdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHFsYTgyeHhfdXJpX2RhdGFfZGVzYyAqCitxbGE4Mnh4X2dldF9kYXRhX2Rlc2Moc3RydWN0IHFsYV9od19kYXRhICpoYSwKKwl1MzIgc2VjdGlvbiwgdTMyIGlkeF9vZmZzZXQpCit7CisJY29uc3QgdTggKnVuaXJvbSA9IGhhLT5oYWJsb2ItPmZ3LT5kYXRhOworCWludCBpZHggPSBjcHVfdG9fbGUzMigqKChpbnQgKikmdW5pcm9tW2hhLT5maWxlX3ByZF9vZmZdICsgaWR4X29mZnNldCkpOworCXN0cnVjdCBxbGE4Mnh4X3VyaV90YWJsZV9kZXNjICp0YWJfZGVzYyA9IE5VTEw7CisJX19sZTMyIG9mZnNldDsKKworCXRhYl9kZXNjID0gcWxhODJ4eF9nZXRfdGFibGVfZGVzYyh1bmlyb20sIHNlY3Rpb24pOworCWlmICghdGFiX2Rlc2MpCisJCXJldHVybiBOVUxMOworCisJb2Zmc2V0ID0gY3B1X3RvX2xlMzIodGFiX2Rlc2MtPmZpbmRleCkgKworCSAgICAoY3B1X3RvX2xlMzIodGFiX2Rlc2MtPmVudHJ5X3NpemUpICogaWR4KTsKKworCXJldHVybiAoc3RydWN0IHFsYTgyeHhfdXJpX2RhdGFfZGVzYyAqKSZ1bmlyb21bb2Zmc2V0XTsKK30KKworc3RhdGljIHU4ICoKK3FsYTgyeHhfZ2V0X2Jvb3RsZF9vZmZzZXQoc3RydWN0IHFsYV9od19kYXRhICpoYSkKK3sKKwl1MzIgb2Zmc2V0ID0gQk9PVExEX1NUQVJUOworCXN0cnVjdCBxbGE4Mnh4X3VyaV9kYXRhX2Rlc2MgKnVyaV9kZXNjID0gTlVMTDsKKworCWlmIChoYS0+ZndfdHlwZSA9PSBRTEE4MlhYX1VOSUZJRURfUk9NSU1BR0UpIHsKKwkJdXJpX2Rlc2MgPSBxbGE4Mnh4X2dldF9kYXRhX2Rlc2MoaGEsCisJCSAgICBRTEE4MlhYX1VSSV9ESVJfU0VDVF9CT09UTEQsIFFMQTgyWFhfVVJJX0JPT1RMRF9JRFhfT0ZGKTsKKwkJaWYgKHVyaV9kZXNjKQorCQkJb2Zmc2V0ID0gY3B1X3RvX2xlMzIodXJpX2Rlc2MtPmZpbmRleCk7CisJfQorCisJcmV0dXJuICh1OCAqKSZoYS0+aGFibG9iLT5mdy0+ZGF0YVtvZmZzZXRdOworfQorCitzdGF0aWMgX19sZTMyCitxbGE4Mnh4X2dldF9md19zaXplKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCit7CisJc3RydWN0IHFsYTgyeHhfdXJpX2RhdGFfZGVzYyAqdXJpX2Rlc2MgPSBOVUxMOworCisJaWYgKGhhLT5md190eXBlID09IFFMQTgyWFhfVU5JRklFRF9ST01JTUFHRSkgeworCQl1cmlfZGVzYyA9ICBxbGE4Mnh4X2dldF9kYXRhX2Rlc2MoaGEsIFFMQTgyWFhfVVJJX0RJUl9TRUNUX0ZXLAorCQkgICAgUUxBODJYWF9VUklfRklSTVdBUkVfSURYX09GRik7CisJCWlmICh1cmlfZGVzYykKKwkJCXJldHVybiBjcHVfdG9fbGUzMih1cmlfZGVzYy0+c2l6ZSk7CisJfQorCisJcmV0dXJuIGNwdV90b19sZTMyKCoodTMyICopJmhhLT5oYWJsb2ItPmZ3LT5kYXRhW0ZXX1NJWkVfT0ZGU0VUXSk7Cit9CisKK3N0YXRpYyB1OCAqCitxbGE4Mnh4X2dldF9md19vZmZzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCit7CisJdTMyIG9mZnNldCA9IElNQUdFX1NUQVJUOworCXN0cnVjdCBxbGE4Mnh4X3VyaV9kYXRhX2Rlc2MgKnVyaV9kZXNjID0gTlVMTDsKKworCWlmIChoYS0+ZndfdHlwZSA9PSBRTEE4MlhYX1VOSUZJRURfUk9NSU1BR0UpIHsKKwkJdXJpX2Rlc2MgPSBxbGE4Mnh4X2dldF9kYXRhX2Rlc2MoaGEsIFFMQTgyWFhfVVJJX0RJUl9TRUNUX0ZXLAorCQkJUUxBODJYWF9VUklfRklSTVdBUkVfSURYX09GRik7CisJCWlmICh1cmlfZGVzYykKKwkJCW9mZnNldCA9IGNwdV90b19sZTMyKHVyaV9kZXNjLT5maW5kZXgpOworCX0KKworCXJldHVybiAodTggKikmaGEtPmhhYmxvYi0+ZnctPmRhdGFbb2Zmc2V0XTsKK30KKwogLyogUENJIHJlbGF0ZWQgZnVuY3Rpb25zICovCiBjaGFyICoKIHFsYTgyeHhfcGNpX2luZm9fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGNoYXIgKnN0cikKQEAgLTE3MTQsMjIgKzE1OTEsNiBAQAogCXJldHVybiB2YWw7CiB9CiAKLWludCBxbGE4Mnh4X3BjaV9yZWdpb25fbGVuKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVnaW9uKQotewotCXVuc2lnbmVkIGxvbmcgdmFsID0gMDsKLQl1MzIgY29udHJvbDsKLQlzd2l0Y2ggKHJlZ2lvbikgewotCWNhc2UgMDoKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFFMQTgyWFhfUENJX1JFR19NU0lYX1RCTCwgJmNvbnRyb2wpOwotCQl2YWwgPSBjb250cm9sOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXZhbCA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgLQotCQkgICAgcWxhODJ4eF9wY2lfcmVnaW9uX29mZnNldChwZGV2LCAxKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWw7Ci19CiAKIGludAogcWxhODJ4eF9pb3NwYWNlX2NvbmZpZyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQpAQCAtMTg1MSwxMiArMTcxMiw2IEBACiAJaWNiLT5yZXNwb25zZV9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QocnNwLT5kbWEpKTsKIAlpY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChyc3AtPmRtYSkpOwogCi0JaWNiLT52ZXJzaW9uID0gMTsKLQlpY2ItPmZyYW1lX3BheWxvYWRfc2l6ZSA9IDIxMTI7Ci0JaWNiLT5leGVjdXRpb25fdGhyb3R0bGUgPSA4OwotCWljYi0+ZXhjaGFuZ2VfY291bnQgPSAxMjg7Ci0JaWNiLT5sb2dpbl9yZXRyeV9jb3VudCA9IDg7Ci0KIAlXUlRfUkVHX0RXT1JEKCh1bnNpZ25lZCBsb25nICBfX2lvbWVtICopJnJlZy0+cmVxX3Ffb3V0WzBdLCAwKTsKIAlXUlRfUkVHX0RXT1JEKCh1bnNpZ25lZCBsb25nICBfX2lvbWVtICopJnJlZy0+cnNwX3FfaW5bMF0sIDApOwogCVdSVF9SRUdfRFdPUkQoKHVuc2lnbmVkIGxvbmcgIF9faW9tZW0gKikmcmVnLT5yc3BfcV9vdXRbMF0sIDApOwpAQCAtMTg3OCwxOSArMTczMywxOSBAQAogCiAJc2l6ZSA9IChJTUFHRV9TVEFSVCAtIEJPT1RMRF9TVEFSVCkgLyA4OwogCi0JcHRyNjQgPSAodTY0ICopJmhhLT5oYWJsb2ItPmZ3LT5kYXRhW0JPT1RMRF9TVEFSVF07CisJcHRyNjQgPSAodTY0ICopcWxhODJ4eF9nZXRfYm9vdGxkX29mZnNldChoYSk7CiAJZmxhc2hhZGRyID0gQk9PVExEX1NUQVJUOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQlkYXRhID0gY3B1X3RvX2xlNjQocHRyNjRbaV0pOwotCQlxbGE4Mnh4X3BjaV9tZW1fd3JpdGVfMk0oaGEsIGZsYXNoYWRkciwgJmRhdGEsIDgpOworCQlpZiAocWxhODJ4eF9wY2lfbWVtX3dyaXRlXzJNKGhhLCBmbGFzaGFkZHIsICZkYXRhLCA4KSkKKwkJCXJldHVybiAtRUlPOwogCQlmbGFzaGFkZHIgKz0gODsKIAl9CiAKLQlzaXplID0gKih1MzIgKikmaGEtPmhhYmxvYi0+ZnctPmRhdGFbRldfU0laRV9PRkZTRVRdOwotCXNpemUgPSAoX19mb3JjZSB1MzIpY3B1X3RvX2xlMzIoc2l6ZSkgLyA4OwotCXB0cjY0ID0gKHU2NCAqKSZoYS0+aGFibG9iLT5mdy0+ZGF0YVtJTUFHRV9TVEFSVF07CiAJZmxhc2hhZGRyID0gRkxBU0hfQUREUl9TVEFSVDsKKwlzaXplID0gKF9fZm9yY2UgdTMyKXFsYTgyeHhfZ2V0X2Z3X3NpemUoaGEpIC8gODsKKwlwdHI2NCA9ICh1NjQgKilxbGE4Mnh4X2dldF9md19vZmZzKGhhKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKIAkJZGF0YSA9IGNwdV90b19sZTY0KHB0cjY0W2ldKTsKQEAgLTE4OTksMTkgKzE3NTQsODUgQEAKIAkJCXJldHVybiAtRUlPOwogCQlmbGFzaGFkZHIgKz0gODsKIAl9CisJdWRlbGF5KDEwMCk7CiAKIAkvKiBXcml0ZSBhIG1hZ2ljIHZhbHVlIHRvIENBTVJBTSByZWdpc3RlcgogCSAqIGF0IGEgc3BlY2lmaWVkIG9mZnNldCB0byBpbmRpY2F0ZQogCSAqIHRoYXQgYWxsIGRhdGEgaXMgd3JpdHRlbiBhbmQKIAkgKiByZWFkeSBmb3IgZmlybXdhcmUgdG8gaW5pdGlhbGl6ZS4KIAkgKi8KLQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NBTV9SQU0oMHgxZmMpLCAweDEyMzQ1Njc4KTsKKwlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NBTV9SQU0oMHgxZmMpLCBRTEE4MlhYX0JESU5GT19NQUdJQyk7CiAKLQlpZiAoUUxBODJYWF9JU19SRVZJU0lPTl9QM1BMVVMoaGEtPmNoaXBfcmV2aXNpb24pKSB7Ci0JCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfMCArIDB4MTgsIDB4MTAyMCk7Ci0JCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX0dMQl9TV19SRVNFVCwgMHg4MDAwMWUpOwotCX0gZWxzZQotCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9HTEJfU1dfUkVTRVQsIDB4ODAwMDFkKTsKKwlyZWFkX2xvY2soJmhhLT5od19sb2NrKTsKKwlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9QRUdfTkVUXzAgKyAweDE4LCAweDEwMjApOworCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX0dMQl9TV19SRVNFVCwgMHg4MDAwMWUpOworCXJlYWRfdW5sb2NrKCZoYS0+aHdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTgyeHhfc2V0X3Byb2R1Y3Rfb2Zmc2V0KHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCit7CisJc3RydWN0IHFsYTgyeHhfdXJpX3RhYmxlX2Rlc2MgKnB0YWJfZGVzYyA9IE5VTEw7CisJY29uc3QgdWludDhfdCAqdW5pcm9tID0gaGEtPmhhYmxvYi0+ZnctPmRhdGE7CisJdWludDMyX3QgaTsKKwlfX2xlMzIgZW50cmllczsKKwlfX2xlMzIgZmxhZ3MsIGZpbGVfY2hpcHJldiwgb2Zmc2V0OworCXVpbnQ4X3QgY2hpcHJldiA9IGhhLT5jaGlwX3JldmlzaW9uOworCS8qIEhhcmRjb2RpbmcgbW5fcHJlc2VudCBmbGFnIGZvciBQM1AgKi8KKwlpbnQgbW5fcHJlc2VudCA9IDA7CisJdWludDMyX3QgZmxhZ2JpdDsKKworCXB0YWJfZGVzYyA9IHFsYTgyeHhfZ2V0X3RhYmxlX2Rlc2ModW5pcm9tLAorCQkgUUxBODJYWF9VUklfRElSX1NFQ1RfUFJPRFVDVF9UQkwpOworICAgICAgIGlmICghcHRhYl9kZXNjKQorCQlyZXR1cm4gLTE7CisKKwllbnRyaWVzID0gY3B1X3RvX2xlMzIocHRhYl9kZXNjLT5udW1fZW50cmllcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCW9mZnNldCA9IGNwdV90b19sZTMyKHB0YWJfZGVzYy0+ZmluZGV4KSArCisJCQkoaSAqIGNwdV90b19sZTMyKHB0YWJfZGVzYy0+ZW50cnlfc2l6ZSkpOworCQlmbGFncyA9IGNwdV90b19sZTMyKCooKGludCAqKSZ1bmlyb21bb2Zmc2V0XSArCisJCQlRTEE4MlhYX1VSSV9GTEFHU19PRkYpKTsKKwkJZmlsZV9jaGlwcmV2ID0gY3B1X3RvX2xlMzIoKigoaW50ICopJnVuaXJvbVtvZmZzZXRdICsKKwkJCVFMQTgyWFhfVVJJX0NISVBfUkVWX09GRikpOworCisJCWZsYWdiaXQgPSBtbl9wcmVzZW50ID8gMSA6IDI7CisKKwkJaWYgKChjaGlwcmV2ID09IGZpbGVfY2hpcHJldikgJiYgKCgxVUxMIDw8IGZsYWdiaXQpICYgZmxhZ3MpKSB7CisJCQloYS0+ZmlsZV9wcmRfb2ZmID0gb2Zmc2V0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQKK3FsYTgyeHhfdmFsaWRhdGVfZmlybXdhcmVfYmxvYihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDhfdCBmd190eXBlKQoreworCV9fbGUzMiB2YWw7CisJdWludDMyX3QgbWluX3NpemU7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IGhhLT5oYWJsb2ItPmZ3OworCisJaGEtPmZ3X3R5cGUgPSBmd190eXBlOworCisJaWYgKGZ3X3R5cGUgPT0gUUxBODJYWF9VTklGSUVEX1JPTUlNQUdFKSB7CisJCWlmIChxbGE4Mnh4X3NldF9wcm9kdWN0X29mZnNldChoYSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltaW5fc2l6ZSA9IFFMQTgyWFhfVVJJX0ZXX01JTl9TSVpFOworCX0gZWxzZSB7CisJCXZhbCA9IGNwdV90b19sZTMyKCoodTMyICopJmZ3LT5kYXRhW1FMQTgyWFhfRldfTUFHSUNfT0ZGU0VUXSk7CisJCWlmICgoX19mb3JjZSB1MzIpdmFsICE9IFFMQTgyWFhfQkRJTkZPX01BR0lDKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWluX3NpemUgPSBRTEE4MlhYX0ZXX01JTl9TSVpFOworCX0KKworCWlmIChmdy0+c2l6ZSA8IG1pbl9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA5Nyw4ICsyMDE4LDYgQEAKIAogCQlpZiAoUkRfUkVHX0RXT1JEKCZyZWctPmhvc3RfaW50KSkgewogCQkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT5ob3N0X3N0YXR1cyk7Ci0JCQlpZiAoKHN0YXQgJiBIU1JYX1JJU0NfSU5UKSA9PSAwKQotCQkJCWJyZWFrOwogCiAJCQlzd2l0Y2ggKHN0YXQgJiAweGZmKSB7CiAJCQljYXNlIDB4MToKQEAgLTIxNzMsOCArMjA5Miw2IEBACiAJZG8gewogCQlpZiAoUkRfUkVHX0RXT1JEKCZyZWctPmhvc3RfaW50KSkgewogCQkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT5ob3N0X3N0YXR1cyk7Ci0JCQlpZiAoKHN0YXQgJiBIU1JYX1JJU0NfSU5UKSA9PSAwKQotCQkJCWJyZWFrOwogCiAJCQlzd2l0Y2ggKHN0YXQgJiAweGZmKSB7CiAJCQljYXNlIDB4MToKQEAgLTI0MjQsMTIgKzIzNDEsNiBAQAogCXN0cnVjdCBmd19ibG9iICpibG9iOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JLyogUHV0IGJvdGggdGhlIFBFRyBDTUQgYW5kIFJDViBQRUcgdG8gZGVmYXVsdCBzdGF0ZQotCSAqIG9mIDAgYmVmb3JlIHJlc2V0dGluZyB0aGUgaGFyZHdhcmUKLQkgKi8KLQlxbGE4Mnh4X3dyXzMyKGhhLCBDUkJfQ01EUEVHX1NUQVRFLCAwKTsKLQlxbGE4Mnh4X3dyXzMyKGhhLCBDUkJfUkNWUEVHX1NUQVRFLCAwKTsKLQogCWlmIChxbGE4Mnh4X3Bpbml0X2Zyb21fcm9tKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCiAJCQkiJXM6IEVycm9yIGR1cmluZyBDUkIgSW5pdGlhbGl6YXRpb25cbiIsIF9fZnVuY19fKTsKQEAgLTI0NzAsNiArMjM4MSwxOCBAQAogCQlnb3RvIGZ3X2xvYWRfZmFpbGVkOwogCX0KIAorCS8qIFZhbGlkYXRpbmcgZmlybXdhcmUgYmxvYiAqLworCWlmIChxbGE4Mnh4X3ZhbGlkYXRlX2Zpcm13YXJlX2Jsb2IodmhhLAorCQlRTEE4MlhYX0ZMQVNIX1JPTUlNQUdFKSkgeworCQkvKiBGYWxsYmFjayB0byBVUkkgZm9ybWF0ICovCisJCWlmIChxbGE4Mnh4X3ZhbGlkYXRlX2Zpcm13YXJlX2Jsb2IodmhhLAorCQkJUUxBODJYWF9VTklGSUVEX1JPTUlNQUdFKSkgeworCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJIk5vIHZhbGlkIGZpcm13YXJlIGltYWdlIGZvdW5kISEhIik7CisJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKwogCWlmIChxbGE4Mnh4X2Z3X2xvYWRfZnJvbV9ibG9iKGhhKSA9PSBRTEFfU1VDQ0VTUykgewogCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKIAkJCSIlczogRmlybXdhcmUgbG9hZGVkIHN1Y2Nlc3NmdWxseSAiCkBAIC0yNDk4LDYgKzI0MjEsMTIgQEAKIAkvKiBzY3J1YiBkbWEgbWFzayBleHBhbnNpb24gcmVnaXN0ZXIgKi8KIAlxbGE4Mnh4X3dyXzMyKGhhLCBDUkJfRE1BX1NISUZULCAweDU1NTU1NTU1KTsKIAorCS8qIFB1dCBib3RoIHRoZSBQRUcgQ01EIGFuZCBSQ1YgUEVHIHRvIGRlZmF1bHQgc3RhdGUKKwkgKiBvZiAwIGJlZm9yZSByZXNldHRpbmcgdGhlIGhhcmR3YXJlCisJICovCisJcWxhODJ4eF93cl8zMihoYSwgQ1JCX0NNRFBFR19TVEFURSwgMCk7CisJcWxhODJ4eF93cl8zMihoYSwgQ1JCX1JDVlBFR19TVEFURSwgMCk7CisKIAkvKiBPdmVyd3JpdGUgc3RhbGUgaW5pdGlhbGl6YXRpb24gcmVnaXN0ZXIgdmFsdWVzICovCiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9QRUdfSEFMVF9TVEFUVVMxLCAwKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzIsIDApOwpAQCAtMjk3NywxMCArMjkwNiwxMCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRvbmVfdW5wcm90ZWN0OwogCi0JdmFsICY9IH4oMHg3IDw8IDIpOworCXZhbCAmPSB+KEJMT0NLX1BST1RFQ1RfQklUUyA8PCAyKTsKIAlyZXQgPSBxbGE4Mnh4X3dyaXRlX3N0YXR1c19yZWcoaGEsIHZhbCk7CiAJaWYgKHJldCA8IDApIHsKLQkJdmFsIHw9ICgweDcgPDwgMik7CisJCXZhbCB8PSAoQkxPQ0tfUFJPVEVDVF9CSVRTIDw8IDIpOwogCQlxbGE4Mnh4X3dyaXRlX3N0YXR1c19yZWcoaGEsIHZhbCk7CiAJfQogCkBAIC0zMDA4LDcgKzI5MzcsNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRvbmVfcHJvdGVjdDsKIAotCXZhbCB8PSAoMHg3IDw8IDIpOworCXZhbCB8PSAoQkxPQ0tfUFJPVEVDVF9CSVRTIDw8IDIpOwogCS8qIExPQ0sgYWxsIHNlY3RvcnMgKi8KIAlyZXQgPSBxbGE4Mnh4X3dyaXRlX3N0YXR1c19yZWcoaGEsIHZhbCk7CiAJaWYgKHJldCA8IDApCkBAIC0zMjAxLDExICszMTMwLDE2IEBACiAJZGJ2YWwgPSAweDA0IHwgKGhhLT5wb3J0bnVtIDw8IDUpOwogCiAJZGJ2YWwgPSBkYnZhbCB8IChyZXEtPmlkIDw8IDgpIHwgKHJlcS0+cmluZ19pbmRleCA8PCAxNik7Ci0JV1JUX1JFR19EV09SRCgodW5zaWduZWQgbG9uZyBfX2lvbWVtICopaGEtPm54ZGJfd3JfcHRyLCBkYnZhbCk7Ci0Jd21iKCk7Ci0Jd2hpbGUgKFJEX1JFR19EV09SRChoYS0+bnhkYl9yZF9wdHIpICE9IGRidmFsKSB7Ci0JCVdSVF9SRUdfRFdPUkQoKHVuc2lnbmVkIGxvbmcgIF9faW9tZW0gKiloYS0+bnhkYl93cl9wdHIsIGRidmFsKTsKKwlpZiAocWwyeGRid3IpCisJCXFsYTgyeHhfd3JfMzIoaGEsIGhhLT5ueGRiX3dyX3B0ciwgZGJ2YWwpOworCWVsc2UgeworCQlXUlRfUkVHX0RXT1JEKCh1bnNpZ25lZCBsb25nIF9faW9tZW0gKiloYS0+bnhkYl93cl9wdHIsIGRidmFsKTsKIAkJd21iKCk7CisJCXdoaWxlIChSRF9SRUdfRFdPUkQoaGEtPm54ZGJfcmRfcHRyKSAhPSBkYnZhbCkgeworCQkJV1JUX1JFR19EV09SRCgodW5zaWduZWQgbG9uZyAgX19pb21lbSAqKWhhLT5ueGRiX3dyX3B0ciwKKwkJCQlkYnZhbCk7CisJCQl3bWIoKTsKKwkJfQogCX0KIH0KIApAQCAtMzI3OSw2ICszMjEzLDEwIEBACiAJLyogRGlzYWJsZSB0aGUgYm9hcmQgKi8KIAlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJEaXNhYmxpbmcgdGhlIGJvYXJkXG4iKTsKIAorCXFsYTgyeHhfaWRjX2xvY2soaGEpOworCXFsYTgyeHhfY2xlYXJfZHJ2X2FjdGl2ZShoYSk7CisJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKKwogCS8qIFNldCBERVZfRkFJTEVEIGZsYWcgdG8gZGlzYWJsZSB0aW1lciAqLwogCXZoYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfREVWX0ZBSUxFRDsKIAlxbGEyeDAwX2Fib3J0X2FsbF9jbWRzKHZoYSwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOwpAQCAtMzM2OSw2ICszMzA3LDE0IEBACiAJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJfQogCQkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOworCQkJaWYgKGhhLT5mbGFncy5tYm94X2J1c3kpIHsKKwkJCQloYS0+ZmxhZ3MuZndfaHVuZyA9IDE7CisJCQkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMTsKKwkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJICAgICJEdWUgdG8gZncgaHVuZywgZG9pbmcgcHJlbWF0dXJlICIKKwkJCQkgICAgImNvbXBsZXRpb24gb2YgbWJ4IGNvbW1hbmRcbiIpKTsKKwkJCQljb21wbGV0ZSgmaGEtPm1ieF9pbnRyX2NvbXApOworCQkJfQogCQl9CiAJfQogCXZoYS0+ZndfaGVhcnRiZWF0X2NvdW50ZXIgPSBmd19oZWFydGJlYXRfY291bnRlcjsKQEAgLTM0NzIsNiArMzQxOCwxNCBAQAogCQkJCSIlcygpOiBBZGFwdGVyIHJlc2V0IG5lZWRlZCFcbiIsIF9fZnVuY19fKTsKIAkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKKwkJCWlmIChoYS0+ZmxhZ3MubWJveF9idXN5KSB7CisJCQkJaGEtPmZsYWdzLmZ3X2h1bmcgPSAxOworCQkJCWhhLT5mbGFncy5tYm94X2ludCA9IDE7CisJCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCSAgICAiTmVlZCByZXNldCwgZG9pbmcgcHJlbWF0dXJlICIKKwkJCQkgICAgImNvbXBsZXRpb24gb2YgbWJ4IGNvbW1hbmRcbiIpKTsKKwkJCQljb21wbGV0ZSgmaGEtPm1ieF9pbnRyX2NvbXApOworCQkJfQogCQl9IGVsc2UgewogCQkJcWxhODJ4eF9jaGVja19md19hbGl2ZSh2aGEpOwogCQl9CkBAIC0zNTI3LDggKzM0ODEsMTAgQEAKIAlxbGE4Mnh4X2NsZWFyX3JzdF9yZWFkeShoYSk7CiAJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKIAotCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQorCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCWhhLT5mbGFncy5md19odW5nID0gMDsKIAkJcWxhODJ4eF9yZXN0YXJ0X2lzcCh2aGEpOworCX0KIAogCWlmIChydmFsKSB7CiAJCXZoYS0+ZmxhZ3Mub25saW5lID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmgKaW5kZXggZjhmOTlhNS4uMTU1NTljYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgotICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDEwIFFMb2dpYyBDb3Jwb3JhdGlvbgogICoKICAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KQEAgLTUzOCwxMSArNTM4LDEwIEBACiAvKiBEcml2ZXIgQ29leGlzdGVuY2UgRGVmaW5lcyAqLwogI2RlZmluZSBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFCSAgICAgKFFMQTgyWFhfQ0FNX1JBTSgweDEzOCkpCiAjZGVmaW5lIFFMQTgyWFhfQ1JCX0RFVl9TVEFURQkgICAgIChRTEE4MlhYX0NBTV9SQU0oMHgxNDApKQotI2RlZmluZSBRTEE4MlhYX0NSQl9ERVZfUEFSVF9JTkZPICAgIChRTEE4MlhYX0NBTV9SQU0oMHgxNGMpKQotI2RlZmluZSBRTEE4MlhYX0NSQl9EUlZfSURDX1ZFUlNJT04gIChRTEE4MlhYX0NBTV9SQU0oMHgxNzQpKQogI2RlZmluZSBRTEE4MlhYX0NSQl9EUlZfU1RBVEUJICAgICAoUUxBODJYWF9DQU1fUkFNKDB4MTQ0KSkKICNkZWZpbmUgUUxBODJYWF9DUkJfRFJWX1NDUkFUQ0ggICAgICAoUUxBODJYWF9DQU1fUkFNKDB4MTQ4KSkKICNkZWZpbmUgUUxBODJYWF9DUkJfREVWX1BBUlRfSU5GTyAgICAoUUxBODJYWF9DQU1fUkFNKDB4MTRjKSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfRFJWX0lEQ19WRVJTSU9OICAoUUxBODJYWF9DQU1fUkFNKDB4MTc0KSkKIAogLyogRXZlcnkgZHJpdmVyIHNob3VsZCB1c2UgdGhlc2UgRGV2aWNlIFN0YXRlICovCiAjZGVmaW5lIFFMQTgyWFhfREVWX0NPTEQJCTEKQEAgLTc3NCwxNSArNzczLDQ5IEBACiAJCS5wY2lfaW50X3JlZwk9CUlTUl9NU0lfSU5UX1RSSUdHRVIoNykgfSwJXAogfQogCisjZGVmaW5lIEJSRENGR19TVEFSVAkJMHg0MDAwCiAjZGVmaW5lCUJPT1RMRF9TVEFSVAkJMHgxMDAwMAogI2RlZmluZQlJTUFHRV9TVEFSVAkJMHgxMDAwMDAKICNkZWZpbmUgRkxBU0hfQUREUl9TVEFSVAkweDQzMDAwCiAKIC8qIE1hZ2ljIG51bWJlciB0byBsZXQgdXNlciBrbm93IGZsYXNoIGlzIHByb2dyYW1tZWQgKi8KICNkZWZpbmUgUUxBODJYWF9CRElORk9fTUFHSUMJMHgxMjM0NTY3OAorI2RlZmluZSBRTEE4MlhYX0ZXX01BR0lDX09GRlNFVAkoQlJEQ0ZHX1NUQVJUICsgMHgxMjgpCiAjZGVmaW5lIEZXX1NJWkVfT0ZGU0VUCQkoMHgzZTg0MGMpCisjZGVmaW5lIFFMQTgyWFhfRldfTUlOX1NJWkUJMHgzZmZmZmYKIAotI2RlZmluZSBRTEE4MlhYX0lTX1JFVklTSU9OX1AzUExVUyhfcmV2XykJKChfcmV2XykgPj0gMHg1MCkKKy8qIFVOSUZJRUQgUk9NSU1BR0UgU1RBUlQgKi8KKyNkZWZpbmUgUUxBODJYWF9VUklfRldfTUlOX1NJWkUJCQkweGM4MDAwCisjZGVmaW5lIFFMQTgyWFhfVVJJX0RJUl9TRUNUX1BST0RVQ1RfVEJMCTB4MAorI2RlZmluZSBRTEE4MlhYX1VSSV9ESVJfU0VDVF9CT09UTEQJCTB4NgorI2RlZmluZSBRTEE4MlhYX1VSSV9ESVJfU0VDVF9GVwkJCTB4NworCisvKiBPZmZzZXRzICovCisjZGVmaW5lIFFMQTgyWFhfVVJJX0NISVBfUkVWX09GRgkxMAorI2RlZmluZSBRTEE4MlhYX1VSSV9GTEFHU19PRkYJCTExCisjZGVmaW5lIFFMQTgyWFhfVVJJX0JJT1NfVkVSU0lPTl9PRkYJMTIKKyNkZWZpbmUgUUxBODJYWF9VUklfQk9PVExEX0lEWF9PRkYJMjcKKyNkZWZpbmUgUUxBODJYWF9VUklfRklSTVdBUkVfSURYX09GRgkyOQorCitzdHJ1Y3QgcWxhODJ4eF91cmlfdGFibGVfZGVzY3sKKwl1aW50MzJfdAlmaW5kZXg7CisJdWludDMyX3QJbnVtX2VudHJpZXM7CisJdWludDMyX3QJZW50cnlfc2l6ZTsKKwl1aW50MzJfdAlyZXNlcnZlZFs1XTsKK307CisKK3N0cnVjdCBxbGE4Mnh4X3VyaV9kYXRhX2Rlc2N7CisJdWludDMyX3QJZmluZGV4OworCXVpbnQzMl90CXNpemU7CisJdWludDMyX3QJcmVzZXJ2ZWRbNV07Cit9OworCisvKiBVTklGSUVEIFJPTUlNQUdFIEVORCAqLworCisjZGVmaW5lIFFMQTgyWFhfVU5JRklFRF9ST01JTUFHRQkzCisjZGVmaW5lIFFMQTgyWFhfRkxBU0hfUk9NSU1BR0UJCTQKKyNkZWZpbmUgUUxBODJYWF9VTktOT1dOX1JPTUlNQUdFCTB4ZmYKKwogI2RlZmluZSBNSVVfVEVTVF9BR1RfV1JEQVRBX1VQUEVSX0xPCQkoMHgwYjApCiAjZGVmaW5lCU1JVV9URVNUX0FHVF9XUkRBVEFfVVBQRVJfSEkJCSgweDBiNCkKIApAQCAtODMyLDcgKzg2NSw3IEBACiAJc3RydWN0IHNjc2lfbHVuIGx1bjsKIAl1aW50OF90IGNybjsKIAl1aW50OF90IHRhc2tfYXR0cmlidXRlOwotCXVpbnQ4X3QgdGFza19tYW5hZ21lbnQ7CisJdWludDhfdCB0YXNrX21hbmFnZW1lbnQ7CiAJdWludDhfdCBhZGRpdGlvbmFsX2NkYl9sZW47CiAJdWludDhfdCBjZGJbMjYwXTsgLyogMjU2IGZvciBDREIgbGVuIGFuZCA0IGZvciBGQ1BfREwgKi8KIH07CkBAIC04NTMsNyArODg2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRzZF9saXN0OwogfTsKIAotI2RlZmluZSBNQkNfVE9HR0xFX0lOVFIJCQkweDEwCisjZGVmaW5lIE1CQ19UT0dHTEVfSU5URVJSVVBUCTB4MTAKIAogLyogRmxhc2ggIG9mZnNldCAqLwogI2RlZmluZSBGTFRfUkVHX0JPT1RMT0FEXzgyWFgJMHg3MgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCBiZTFhOGZjLi5mZjIxNzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCSJFbmFibGVzIGZpcm13YXJlIEVUUyBidXJzdC4iCiAJCSJEZWZhdWx0IGlzIDAgLSBza2lwIEVUUyBlbmFibGVtZW50LiIpOwogCi1pbnQgcWwyeGRid3I7CitpbnQgcWwyeGRid3IgPSAxOwogbW9kdWxlX3BhcmFtKHFsMnhkYndyLCBpbnQsIFNfSVJVR098U19JUlVTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhkYndyLAogCSJPcHRpb24gdG8gc3BlY2lmeSBzY2hlbWUgZm9yIHJlcXVlc3QgcXVldWUgcG9zdGluZ1xuIgpAQCAtNTE3LDYgKzUxNyw3IEBACiAJaWYgKCFzcCkKIAkJcmV0dXJuIHNwOwogCisJYXRvbWljX3NldCgmc3AtPnJlZl9jb3VudCwgMSk7CiAJc3AtPmZjcG9ydCA9IGZjcG9ydDsKIAlzcC0+Y21kID0gY21kOwogCXNwLT5mbGFncyA9IDA7CkBAIC03MDAsNyArNzAxLDcgQEAKICAqICAgIFN1Y2Nlc3MgKEFkYXB0ZXIgaXMgb25saW5lL25vIGZsYXNoIG9wcykgOiAwCiAgKiAgICBGYWlsZWQgIChBZGFwdGVyIGlzIG9mZmxpbmUvZGlzYWJsZWQvZmxhc2ggb3BzIGluIHByb2dyZXNzKSA6IDEKICAqLwotaW50CitzdGF0aWMgaW50CiBxbGEyeDAwX3dhaXRfZm9yX3Jlc2V0X3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAkJcmV0dXJuX3N0YXR1czsKQEAgLTc5Nyw2ICs3OTgsMTIgQEAKIAlyZXR1cm4gKHJldHVybl9zdGF0dXMpOwogfQogCitzdGF0aWMgdm9pZAorc3BfZ2V0KHN0cnVjdCBzcmIgKnNwKQoreworCWF0b21pY19pbmMoJnNwLT5yZWZfY291bnQpOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogcWxhMnh4eF9laF9hYm9ydAogKgpAQCAtODI1LDYgKzgzMiw3IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+cmVxOwogCXNyYl90ICpzcHQ7CisJaW50IGdvdF9yZWYgPSAwOwogCiAJZmNfYmxvY2tfc2NzaV9laChjbWQpOwogCkBAIC04NTYsNiArODY0LDEwIEBACiAJCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGFib3J0aW5nIHNwICVwIGZyb20gUklTQy4iCiAJCSIgcGlkPSVsZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHNwLCBzZXJpYWwpKTsKIAorCQkvKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNwIGFuZCBkcm9wIHRoZSBsb2NrLiovCisJCXNwX2dldChzcCk7CisJCWdvdF9yZWYrKzsKKwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCQlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2NvbW1hbmQoc3ApKSB7CiAJCQlERUJVRzIocHJpbnRrKCIlcyglbGQpOiBhYm9ydF9jb21tYW5kICIKQEAgLTg4MSw2ICs4OTMsOSBAQAogCQl9CiAJfQogCisJaWYgKGdvdF9yZWYpCisJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKKwogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkgICAgInNjc2koJWxkOiVkOiVkKTogQWJvcnQgY29tbWFuZCBpc3N1ZWQgLS0gJWQgJWx4ICV4LlxuIiwKIAkgICAgdmhhLT5ob3N0X25vLCBpZCwgbHVuLCB3YWl0LCBzZXJpYWwsIHJldCk7CkBAIC04ODgsMjQgKzkwMywxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWVudW0gbmV4dXNfd2FpdF90eXBlIHsKLQlXQUlUX0hPU1QgPSAwLAotCVdBSVRfVEFSR0VULAotCVdBSVRfTFVOLAotfTsKLQotc3RhdGljIGludAoraW50CiBxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVuc2lnbmVkIGludCB0LAotCXVuc2lnbmVkIGludCBsLCBzcmJfdCAqc3AsIGVudW0gbmV4dXNfd2FpdF90eXBlIHR5cGUpCisJdW5zaWduZWQgaW50IGwsIGVudW0gbmV4dXNfd2FpdF90eXBlIHR5cGUpCiB7CiAJaW50IGNudCwgbWF0Y2gsIHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXE7CisJc3JiX3QgKnNwOwogCiAJc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0JaWYgKCFzcCkKLQkJcmV0dXJuIHN0YXR1czsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXJlcSA9IHZoYS0+cmVxOwpAQCAtOTQzLDI0ICs5NTEsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgcWxhODJ4eF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQotewotCWludCBjbnQ7Ci0Jc3JiX3QgKnNwOwotCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKLQotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywKLQkJIldhaXRpbmcgZm9yIHBlbmRpbmcgY29tbWFuZHNcbiIpKTsKLQlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKLQkJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XTsKLQkJaWYgKHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyh2aGEsIDAsIDAsCi0JCQlzcCwgV0FJVF9IT1NUKSA9PSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCB2aGEtPmh3LAotCQkJCSJEb25lIHdhaXQgZm9yIHBlbmRpbmcgY29tbWFuZHNcbiIpKTsKLQkJfQotCX0KLX0KLQogc3RhdGljIGNoYXIgKnJlc2V0X2Vycm9yc1tdID0gewogCSJIQkEgbm90IG9ubGluZSIsCiAJIkhCQSBub3QgcmVhZHkiLApAQCAtOTk2LDcgKzk4Niw3IEBACiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOwogCWVyciA9IDM7CiAJaWYgKHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyh2aGEsIGNtZC0+ZGV2aWNlLT5pZCwKLQkgICAgY21kLT5kZXZpY2UtPmx1biwgKHNyYl90ICopIENNRF9TUChjbWQpLCB0eXBlKSAhPSBRTEFfU1VDQ0VTUykKKwkgICAgY21kLT5kZXZpY2UtPmx1biwgdHlwZSkgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOwogCiAJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICJzY3NpKCVsZDolZDolZCk6ICVzIFJFU0VUIFNVQ0NFRURFRC5cbiIsCkBAIC0xMDA0LDcgKzk5NCw3IEBACiAKIAlyZXR1cm4gU1VDQ0VTUzsKIAotIGVoX3Jlc2V0X2ZhaWxlZDoKK2VoX3Jlc2V0X2ZhaWxlZDoKIAlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgInNjc2koJWxkOiVkOiVkKTogJXMgUkVTRVQgRkFJTEVEOiAlcy5cbiIKIAkgICAgLCB2aGEtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgbmFtZSwKIAkgICAgcmVzZXRfZXJyb3JzW2Vycl0pOwpAQCAtMTA1NCw3ICsxMDQ0LDYgQEAKIAlpbnQgcmV0ID0gRkFJTEVEOwogCXVuc2lnbmVkIGludCBpZCwgbHVuOwogCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwotCXNyYl90ICpzcCA9IChzcmJfdCAqKSBDTURfU1AoY21kKTsKIAogCWZjX2Jsb2NrX3Njc2lfZWgoY21kKTsKIApAQCAtMTA4MSw3ICsxMDcwLDcgQEAKIAkJZ290byBlaF9idXNfcmVzZXRfZG9uZTsKIAogCS8qIEZsdXNoIG91dHN0YW5kaW5nIGNvbW1hbmRzLiAqLwotCWlmIChxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHModmhhLCAwLCAwLCBzcCwgV0FJVF9IT1NUKSAhPQorCWlmIChxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHModmhhLCAwLCAwLCBXQUlUX0hPU1QpICE9CiAJICAgIFFMQV9TVUNDRVNTKQogCQlyZXQgPSBGQUlMRUQ7CiAKQEAgLTExMTYsNyArMTEwNSw2IEBACiAJaW50IHJldCA9IEZBSUxFRDsKIAl1bnNpZ25lZCBpbnQgaWQsIGx1bjsKIAl1bnNpZ25lZCBsb25nIHNlcmlhbDsKLQlzcmJfdCAqc3AgPSAoc3JiX3QgKikgQ01EX1NQKGNtZCk7CiAJc2NzaV9xbGFfaG9zdF90ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlmY19ibG9ja19zY3NpX2VoKGNtZCk7CkBAIC0xMTcxLDcgKzExNTksNyBAQAogCX0KIAogCS8qIFdhaXRpbmcgZm9yIGNvbW1hbmQgdG8gYmUgcmV0dXJuZWQgdG8gT1MuKi8KLQlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgMCwgMCwgc3AsIFdBSVRfSE9TVCkgPT0KKwlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgMCwgMCwgV0FJVF9IT1NUKSA9PQogCQlRTEFfU1VDQ0VTUykKIAkJcmV0ID0gU1VDQ0VTUzsKIApAQCAtMTY2Miw3ICsxNjUwLDcgQEAKIAkucmVhZF9vcHRyb20JCT0gcWxhMjV4eF9yZWFkX29wdHJvbV9kYXRhLAogCS53cml0ZV9vcHRyb20JCT0gcWxhMjR4eF93cml0ZV9vcHRyb21fZGF0YSwKIAkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGEyNHh4X2dldF9mbGFzaF92ZXJzaW9uLAotCS5zdGFydF9zY3NpCQk9IHFsYTI0eHhfc3RhcnRfc2NzaSwKKwkuc3RhcnRfc2NzaQkJPSBxbGEyNHh4X2RpZl9zdGFydF9zY3NpLAogCS5hYm9ydF9pc3AJCT0gcWxhMngwMF9hYm9ydF9pc3AsCiB9OwogCkBAIC0yMTEzLDYgKzIxMDEsNyBAQAogCWluaXRfY29tcGxldGlvbigmaGEtPm1ieF9jbWRfY29tcCk7CiAJY29tcGxldGUoJmhhLT5tYnhfY21kX2NvbXApOwogCWluaXRfY29tcGxldGlvbigmaGEtPm1ieF9pbnRyX2NvbXApOworCWluaXRfY29tcGxldGlvbigmaGEtPmRjYnhfY29tcCk7CiAKIAlzZXRfYml0KDAsICh1bnNpZ25lZCBsb25nICopIGhhLT52cF9pZHhfbWFwKTsKIApAQCAtMjE1OCw3ICsyMTQ3LDEwIEBACiAJaG9zdC0+dGhpc19pZCA9IDI1NTsKIAlob3N0LT5jbWRfcGVyX2x1biA9IDM7CiAJaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKLQlob3N0LT5tYXhfY21kX2xlbiA9IE1BWF9DTURTWjsKKwlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBxbDJ4ZW5hYmxlZGlmKQorCQlob3N0LT5tYXhfY21kX2xlbiA9IDMyOworCWVsc2UKKwkJaG9zdC0+bWF4X2NtZF9sZW4gPSBNQVhfQ01EU1o7CiAJaG9zdC0+bWF4X2NoYW5uZWwgPSBNQVhfQlVTRVMgLSAxOwogCWhvc3QtPm1heF9sdW4gPSBNQVhfTFVOUzsKIAlob3N0LT50cmFuc3BvcnR0ID0gcWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGU7CkBAIC0yMjU4LDcgKzIyNTAsNyBAQAogCURFQlVHMihwcmludGsoIkRFQlVHOiBkZXRlY3QgaGJhICVsZCBhdCBhZGRyZXNzID0gJXBcbiIsCiAJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBoYSkpOwogCi0JaWYgKElTX1FMQTI1WFgoaGEpICYmIHFsMnhlbmFibGVkaWYpIHsKKwlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBxbDJ4ZW5hYmxlZGlmKSB7CiAJCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF80KSB7CiAJCQliYXNlX3ZoYS0+ZmxhZ3MuZGlmZGl4X3N1cHBvcnRlZCA9IDE7CiAJCQlERUJVRzE4KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKQEAgLTIyNjYsOCArMjI1OCwxMCBAQAogCQkJICAgICIgcHJvdGVjdGlvbi5cbiIpKTsKIAkJCXNjc2lfaG9zdF9zZXRfcHJvdChob3N0LAogCQkJICAgIFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OCisJCQkgICAgfCBTSE9TVF9ESUZfVFlQRTJfUFJPVEVDVElPTgogCQkJICAgIHwgU0hPU1RfRElGX1RZUEUzX1BST1RFQ1RJT04KIAkJCSAgICB8IFNIT1NUX0RJWF9UWVBFMV9QUk9URUNUSU9OCisJCQkgICAgfCBTSE9TVF9ESVhfVFlQRTJfUFJPVEVDVElPTgogCQkJICAgIHwgU0hPU1RfRElYX1RZUEUzX1BST1RFQ1RJT04pOwogCQkJc2NzaV9ob3N0X3NldF9ndWFyZChob3N0LCBTSE9TVF9ESVhfR1VBUkRfQ1JDKTsKIAkJfSBlbHNlCkBAIC0yNDAyLDYgKzIzOTYsMTAgQEAKIAlzY3NpX2hvc3RfcHV0KGJhc2VfdmhhLT5ob3N0KTsKIAogCWlmIChJU19RTEE4MlhYKGhhKSkgeworCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKKwkJcWxhODJ4eF9jbGVhcl9kcnZfYWN0aXZlKGhhKTsKKwkJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKKwogCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgX19pb21lbSAqKWhhLT5ueF9wY2liYXNlKTsKIAkJaWYgKCFxbDJ4ZGJ3cikKIAkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCBfX2lvbWVtICopaGEtPm54ZGJfd3JfcHRyKTsKQEAgLTI0NjcsMTEgKzI0NjUsMjQgQEAKIAogCXFsYTJ4MDBfZnJlZV9pcnFzKHZoYSk7CiAKKwlxbGEyeDAwX2ZyZWVfZmNwb3J0cyh2aGEpOworCiAJcWxhMngwMF9tZW1fZnJlZShoYSk7CiAKIAlxbGEyeDAwX2ZyZWVfcXVldWVzKGhhKTsKIH0KIAordm9pZCBxbGEyeDAwX2ZyZWVfZmNwb3J0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCWZjX3BvcnRfdCAqZmNwb3J0LCAqdGZjcG9ydDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmY3BvcnQsIHRmY3BvcnQsICZ2aGEtPnZwX2ZjcG9ydHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmZjcG9ydC0+bGlzdCk7CisJCWtmcmVlKGZjcG9ydCk7CisJCWZjcG9ydCA9IE5VTEw7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIHZvaWQKIHFsYTJ4MDBfc2NoZWR1bGVfcnBvcnRfZGVsKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0LAogICAgIGludCBkZWZlcikKQEAgLTM0NjMsOCArMzQ3NCw4IEBACiAJQ01EX1NQKGNtZCkgPSBOVUxMOwogfQogCi12b2lkCi1xbGEyeDAwX3NwX2NvbXBsKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHNyYl90ICpzcCkKK3N0YXRpYyB2b2lkCitxbGEyeDAwX3NwX2ZpbmFsX2NvbXBsKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHNyYl90ICpzcCkKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcC0+Y21kOwogCkBAIC0zNDg1LDYgKzM0OTYsMjAgQEAKIAljbWQtPnNjc2lfZG9uZShjbWQpOwogfQogCit2b2lkCitxbGEyeDAwX3NwX2NvbXBsKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHNyYl90ICpzcCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJnNwLT5yZWZfY291bnQpID09IDApIHsKKwkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJTUCByZWZlcmVuY2UtY291bnQgdG8gWkVSTyAtLSBzcD0lcFxuIiwgc3ApKTsKKwkJREVCVUcyKEJVRygpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnNwLT5yZWZfY291bnQpKQorCQlyZXR1cm47CisJcWxhMngwMF9zcF9maW5hbF9jb21wbChoYSwgc3ApOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBxbGEyeDAwX3RpbWVyCiAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc2V0dGluZ3MuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zZXR0aW5ncy5oCmluZGV4IDI4MDFjMjYuLmYwYjJiOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zZXR0aW5ncy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zZXR0aW5ncy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIKLSAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAwOCBRTG9naWMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAxMCBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKaW5kZXggZGU5MjUwNC4uNzZkZTk1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwpAQCAtNjY0LDYgKzY2NCwxMSBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwogCisJZGVmID0gMDsKKwlpZiAoSVNfUUxBMjVYWChoYSkpCisJCWRlZiA9IDE7CisJZWxzZSBpZiAoSVNfUUxBODFYWChoYSkpCisJCWRlZiA9IDI7CiAJaGEtPmZsdF9yZWdpb25fZmx0ID0gZmx0X2FkZHI7CiAJd3B0ciA9ICh1aW50MTZfdCAqKXJlcS0+cmluZzsKIAlmbHQgPSAoc3RydWN0IHFsYV9mbHRfaGVhZGVyICopcmVxLT5yaW5nOwpAQCAtNjkxLDYgKzY5NiwxMCBAQAogCQlnb3RvIG5vX2ZsYXNoX2RhdGE7CiAJfQogCisJLyogQXNzaWduIEZDUCBwcmlvIHJlZ2lvbiBzaW5jZSBvbGRlciBGTFQncyBtYXkgbm90IGhhdmUgaXQgKi8KKwloYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyA9IGhhLT5mbGFncy5wb3J0MCA/CisJICAgIGZjcF9wcmlvX2NmZzBbZGVmXSA6IGZjcF9wcmlvX2NmZzFbZGVmXTsKKwogCWxvYyA9IGxvY2F0aW9uc1sxXTsKIAljbnQgPSBsZTE2X3RvX2NwdShmbHQtPmxlbmd0aCkgLyBzaXplb2Yoc3RydWN0IHFsYV9mbHRfcmVnaW9uKTsKIAlmb3IgKCA7IGNudDsgY250LS0sIHJlZ2lvbisrKSB7CkBAIC03NzMsMTMgKzc4Miw2IEBACiBub19mbGFzaF9kYXRhOgogCS8qIFVzZSBoYXJkY29kZWQgZGVmYXVsdHMuICovCiAJbG9jID0gbG9jYXRpb25zWzBdOwotCWRlZiA9IDA7Ci0JaWYgKElTX1FMQTI0WFhfVFlQRShoYSkpCi0JCWRlZiA9IDA7Ci0JZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpCi0JCWRlZiA9IDE7Ci0JZWxzZSBpZiAoSVNfUUxBODFYWChoYSkpCi0JCWRlZiA9IDI7CiAJaGEtPmZsdF9yZWdpb25fZncgPSBkZWZfZndbZGVmXTsKIAloYS0+Zmx0X3JlZ2lvbl9ib290ID0gZGVmX2Jvb3RbZGVmXTsKIAloYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gPSBkZWZfdnBkX252cmFtW2RlZl07CkBAIC03OTAsMTQgKzc5MiwxMyBAQAogCWhhLT5mbHRfcmVnaW9uX2ZkdCA9IGRlZl9mZHRbZGVmXTsKIAloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSBoYS0+ZmxhZ3MucG9ydDAgPwogCSAgICBkZWZfbnBpdl9jb25mMFtkZWZdIDogZGVmX25waXZfY29uZjFbZGVmXTsKLQloYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyA9IGhhLT5mbGFncy5wb3J0MCA/Ci0JICAgIGZjcF9wcmlvX2NmZzBbZGVmXSA6IGZjcF9wcmlvX2NmZzFbZGVmXTsKIGRvbmU6CiAJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGTFRbJXNdOiBib290PTB4JXggZnc9MHgleCAiCiAJICAgICJ2cGRfbnZyYW09MHgleCB2cGQ9MHgleCBudnJhbT0weCV4IGZkdD0weCV4IGZsdD0weCV4ICIKLQkgICAgIm5waXY9MHgleC5cbiIsIGxvYywgaGEtPmZsdF9yZWdpb25fYm9vdCwgaGEtPmZsdF9yZWdpb25fZncsCi0JICAgIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSwgaGEtPmZsdF9yZWdpb25fdnBkLCBoYS0+Zmx0X3JlZ2lvbl9udnJhbSwKLQkgICAgaGEtPmZsdF9yZWdpb25fZmR0LCBoYS0+Zmx0X3JlZ2lvbl9mbHQsIGhhLT5mbHRfcmVnaW9uX25waXZfY29uZikpOworCSAgICAibnBpdj0weCV4LiBmY3BfcHJpb19jZmc9MHgleFxuIiwgbG9jLCBoYS0+Zmx0X3JlZ2lvbl9ib290LAorCSAgICBoYS0+Zmx0X3JlZ2lvbl9mdywgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtLCBoYS0+Zmx0X3JlZ2lvbl92cGQsCisJICAgIGhhLT5mbHRfcmVnaW9uX252cmFtLCBoYS0+Zmx0X3JlZ2lvbl9mZHQsIGhhLT5mbHRfcmVnaW9uX2ZsdCwKKwkgICAgaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mLCBoYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbykpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjc1OCw2ICsyNzU5LDI4IEBACiAJCWhhLT5md19yZXZpc2lvblszXSA9IGRjb2RlWzNdOwogCX0KIAorCS8qIENoZWNrIGZvciBnb2xkZW4gZmlybXdhcmUgYW5kIGdldCB2ZXJzaW9uIGlmIGF2YWlsYWJsZSAqLworCWlmICghSVNfUUxBODFYWChoYSkpIHsKKwkJLyogR29sZGVuIGZpcm13YXJlIGlzIG5vdCBwcmVzZW50IGluIG5vbiA4MVhYIGFkYXB0ZXJzICovCisJCXJldHVybiByZXQ7CisJfQorCisJbWVtc2V0KGhhLT5nb2xkX2Z3X3ZlcnNpb24sIDAsIHNpemVvZihoYS0+Z29sZF9md192ZXJzaW9uKSk7CisJZGNvZGUgPSBtYnVmOworCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsICh1aW50OF90ICopZGNvZGUsCisJICAgIGhhLT5mbHRfcmVnaW9uX2dvbGRfZncgPDwgMiwgMzIpOworCisJaWYgKGRjb2RlWzRdID09IDB4RkZGRkZGRkYgJiYgZGNvZGVbNV0gPT0gMHhGRkZGRkZGRiAmJgorCSAgICBkY29kZVs2XSA9PSAweEZGRkZGRkZGICYmIGRjb2RlWzddID09IDB4RkZGRkZGRkYpIHsKKwkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICIlcyglbGQpOiBVbnJlY29nbml6ZWQgZ29sZGVuIGZ3IGF0IDB4JXguXG4iLAorCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgaGEtPmZsdF9yZWdpb25fZ29sZF9mdyAqIDQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSA0OyBpIDwgODsgaSsrKQorCQloYS0+Z29sZF9md192ZXJzaW9uW2ktNF0gPSBiZTMyX3RvX2NwdShkY29kZVtpXSk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCAxMDkwNjhkLi5lNzVjY2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTEsMTUgKzEsMTUgQEAKIC8qCiAgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDMuMDItazIiCisjZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAzLjAzLWswIgogCiAjZGVmaW5lIFFMQV9EUklWRVJfTUFKT1JfVkVSCTgKICNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMwotI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkyCi0jZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMgorI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkzCisjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcKaW5kZXggNjljYmZmMy4uMmMzM2NlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9LY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogY29uZmlnIFNDU0lfUUxBX0lTQ1NJCi0JdHJpc3RhdGUgIlFMb2dpYyBJU1A0WFhYIGhvc3QgYWRhcHRlciBmYW1pbHkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIE5FVAorCXRyaXN0YXRlICJRTG9naWMgSVNQNFhYWCBhbmQgSVNQODJYWCBob3N0IGFkYXB0ZXIgZmFtaWx5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQogCXNlbGVjdCBTQ1NJX0lTQ1NJX0FUVFJTCiAJLS0taGVscC0tLQotCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgNDB4eCAoSVNQNFhYWCkgaVNDU0kgaG9zdAotCWFkYXB0ZXIgZmFtaWx5LgorCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgNDB4eCAoSVNQNFhYWCkgYW5kIDgwMjIgKElTUDgyWFgpCisJaVNDU0kgaG9zdCBhZGFwdGVyIGZhbWlseS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvTWFrZWZpbGUKaW5kZXggODZlYTM3Yi4uMDMzOWZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBxbGE0eHh4LXkgOj0gcWw0X29zLm8gcWw0X2luaXQubyBxbDRfbWJ4Lm8gcWw0X2lvY2IubyBxbDRfaXNyLm8gXAotCQlxbDRfbnZyYW0ubyBxbDRfZGJnLm8KKwkJcWw0X254Lm8gcWw0X252cmFtLm8gcWw0X2RiZy5vCiAKIG9iai0kKENPTkZJR19TQ1NJX1FMQV9JU0NTSSkgKz0gcWxhNHh4eC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaAppbmRleCA0Mjg4MDI2Li5hNzlkYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KIAorI2luY2x1ZGUgInFsNF9kYmcuaCIKKyNpbmNsdWRlICJxbDRfbnguaCIKIAogI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDEwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDQwMTAJMHg0MDEwCkBAIC00Niw2ICs0OCwxMCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDMyCTB4NDAzMgogI2VuZGlmCiAKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDIyCTB4ODAyMgorI2VuZGlmCisKICNkZWZpbmUgUUxBX1NVQ0NFU1MJCQkwCiAjZGVmaW5lIFFMQV9FUlJPUgkJCTEKIApAQCAtODUsMTUgKzkxLDIyIEBACiAjZGVmaW5lIEJJVF8zMAkweDQwMDAwMDAwCiAjZGVmaW5lIEJJVF8zMQkweDgwMDAwMDAwCiAKKy8qKgorICogTWFjcm9zIHRvIGhlbHAgY29kZSwgbWFpbnRhaW4sIGV0Yy4KKyAqKi8KKyNkZWZpbmUgcWw0X3ByaW50ayhsZXZlbCwgaGEsIGZvcm1hdCwgYXJnLi4uKSBcCisJZGV2X3ByaW50ayhsZXZlbCAsICYoKGhhKS0+cGRldi0+ZGV2KSAsIGZvcm1hdCAsICMjIGFyZykKKworCiAvKgogICogSG9zdCBhZGFwdGVyIGRlZmF1bHQgZGVmaW5pdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgTUFYX0hCQVMJCTE2CiAjZGVmaW5lIE1BWF9CVVNFUwkJMQotI2RlZmluZSBNQVhfVEFSR0VUUwkJKE1BWF9QUlNUX0RFVl9EQl9FTlRSSUVTICsgIE1BWF9ERVZfREJfRU5UUklFUykKKyNkZWZpbmUgTUFYX1RBUkdFVFMJCU1BWF9ERVZfREJfRU5UUklFUwogI2RlZmluZSBNQVhfTFVOUwkJMHhmZmZmCiAjZGVmaW5lIE1BWF9BRU5fRU5UUklFUwkJMjU2IC8qIHNob3VsZCBiZSA+IEVYVF9ERUZfTUFYX0FFTl9RVUVVRSAqLwotI2RlZmluZSBNQVhfRERCX0VOVFJJRVMJCShNQVhfUFJTVF9ERVZfREJfRU5UUklFUyArIE1BWF9ERVZfREJfRU5UUklFUykKKyNkZWZpbmUgTUFYX0REQl9FTlRSSUVTCQlNQVhfREVWX0RCX0VOVFJJRVMKICNkZWZpbmUgTUFYX1BEVV9FTlRSSUVTCQkzMgogI2RlZmluZSBJTlZBTElEX0VOVFJZCQkweEZGRkYKICNkZWZpbmUgTUFYX0NNRFNfVE9fUklTQwkxMDI0CkBAIC0xMTgsNyArMTMxLDcgQEAKICNkZWZpbmUgRFJJVkVSX05BTUUJCQkicWxhNHh4eCIKIAogI2RlZmluZSBNQVhfTElOS0VEX0NNRFNfUEVSX0xVTgkJMwotI2RlZmluZSBNQVhfUkVRU19TRVJWSUNFRF9QRVJfSU5UUgkxNgorI2RlZmluZSBNQVhfUkVRU19TRVJWSUNFRF9QRVJfSU5UUgkxCiAKICNkZWZpbmUgSVNDU0lfSVBBRERSX1NJWkUJCTQJLyogSVAgYWRkcmVzcyBzaXplICovCiAjZGVmaW5lIElTQ1NJX0FMSUFTX1NJWkUJCTMyCS8qIElTQ1NJIEFsaWFzIG5hbWUgc2l6ZSAqLwpAQCAtMTM0LDcgKzE0Nyw3IEBACiAjZGVmaW5lIFNPRlRfUkVTRVRfVE9WCQkJMzAKICNkZWZpbmUgUkVTRVRfSU5UUl9UT1YJCQkzCiAjZGVmaW5lIFNFTUFQSE9SRV9UT1YJCQkxMAotI2RlZmluZSBBREFQVEVSX0lOSVRfVE9WCQkxMjAKKyNkZWZpbmUgQURBUFRFUl9JTklUX1RPVgkJMzAKICNkZWZpbmUgQURBUFRFUl9SRVNFVF9UT1YJCTE4MAogI2RlZmluZSBFWFRFTkRfQ01EX1RPVgkJCTYwCiAjZGVmaW5lIFdBSVRfQ01EX1RPVgkJCTMwCkBAIC0xODQsOCArMTk3LDYgQEAKIAl1aW50MTZfdCBpb2NiX3RvdjsKIAl1aW50MTZfdCBpb2NiX2NudDsJLyogTnVtYmVyIG9mIHVzZWQgaW9jYnMgKi8KIAl1aW50MTZfdCBjY19zdGF0OwotCXVfbG9uZyByX3N0YXJ0OwkJLyogVGltZSB3ZSByZWNpZXZlIGEgY21kIGZyb20gT1MgKi8KLQl1X2xvbmcgdV9zdGFydDsJCS8qIFRpbWUgd2hlbiB3ZSBoYW5kZWQgdGhlIGNtZCB0byBGL1cgKi8KIAogCS8qIFVzZWQgZm9yIGV4dGVuZGVkIHNlbnNlIC8gc3RhdHVzIGNvbnRpbnVhdGlvbiAqLwogCXVpbnQ4X3QgKnJlcV9zZW5zZV9wdHI7CkBAIC0yMjEsNyArMjMyLDYgQEAKIAl1bnNpZ25lZCBsb25nIGRldl9zY2FuX3dhaXRfdG9fc3RhcnRfcmVsb2dpbjsKIAl1bnNpZ25lZCBsb25nIGRldl9zY2FuX3dhaXRfdG9fY29tcGxldGVfcmVsb2dpbjsKIAotCXVpbnQxNl90IG9zX3RhcmdldF9pZDsJLyogVGFyZ2V0IElEICovCiAJdWludDE2X3QgZndfZGRiX2luZGV4OwkvKiBEREIgZmlybXdhcmUgaW5kZXggKi8KIAl1aW50MTZfdCBvcHRpb25zOwogCXVpbnQzMl90IGZ3X2RkYl9kZXZpY2Vfc3RhdGU7IC8qIEYvVyBEZXZpY2UgU3RhdGUgIC0tIHNlZSBxbDRfZncuaCAqLwpAQCAtMjg1LDYgKzI5NSw2NyBAQAogI2luY2x1ZGUgInFsNF9mdy5oIgogI2luY2x1ZGUgInFsNF9udnJhbS5oIgogCitzdHJ1Y3QgcWw4Mnh4X2h3X2RhdGEgeworCS8qIE9mZnNldHMgZm9yIGZsYXNoL252cmFtIGFjY2VzcyAoc2V0IHRvIH4wIGlmIG5vdCB1c2VkKS4gKi8KKwl1aW50MzJfdCBmbGFzaF9jb25mX29mZjsKKwl1aW50MzJfdCBmbGFzaF9kYXRhX29mZjsKKworCXVpbnQzMl90IGZkdF93cnRfZGlzYWJsZTsKKwl1aW50MzJfdCBmZHRfZXJhc2VfY21kOworCXVpbnQzMl90IGZkdF9ibG9ja19zaXplOworCXVpbnQzMl90IGZkdF91bnByb3RlY3Rfc2VjX2NtZDsKKwl1aW50MzJfdCBmZHRfcHJvdGVjdF9zZWNfY21kOworCisJdWludDMyX3QgZmx0X3JlZ2lvbl9mbHQ7CisJdWludDMyX3QgZmx0X3JlZ2lvbl9mZHQ7CisJdWludDMyX3QgZmx0X3JlZ2lvbl9ib290OworCXVpbnQzMl90IGZsdF9yZWdpb25fYm9vdGxvYWQ7CisJdWludDMyX3QgZmx0X3JlZ2lvbl9mdzsKKwl1aW50MzJfdCByZXNlcnZlZDsKK307CisKK3N0cnVjdCBxbGE0Xzh4eHhfbGVnYWN5X2ludHJfc2V0IHsKKwl1aW50MzJfdCBpbnRfdmVjX2JpdDsKKwl1aW50MzJfdCB0Z3Rfc3RhdHVzX3JlZzsKKwl1aW50MzJfdCB0Z3RfbWFza19yZWc7CisJdWludDMyX3QgcGNpX2ludF9yZWc7Cit9OworCisvKiBNU0ktWCBTdXBwb3J0ICovCisKKyNkZWZpbmUgUUxBX01TSVhfREVGQVVMVAkweDAwCisjZGVmaW5lIFFMQV9NU0lYX1JTUF9RCQkweDAxCisKKyNkZWZpbmUgUUxBX01TSVhfRU5UUklFUwkyCisjZGVmaW5lIFFMQV9NSURYX0RFRkFVTFQJMAorI2RlZmluZSBRTEFfTUlEWF9SU1BfUQkJMQorCitzdHJ1Y3QgcWw0X21zaXhfZW50cnkgeworCWludCBoYXZlX2lycTsKKwl1aW50MTZfdCBtc2l4X3ZlY3RvcjsKKwl1aW50MTZfdCBtc2l4X2VudHJ5OworfTsKKworLyoKKyAqIElTUCBPcGVyYXRpb25zCisgKi8KK3N0cnVjdCBpc3Bfb3BlcmF0aW9ucyB7CisJaW50ICgqaW9zcGFjZV9jb25maWcpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworCXZvaWQgKCpwY2lfY29uZmlnKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CisJdm9pZCAoKmRpc2FibGVfaW50cnMpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKwl2b2lkICgqZW5hYmxlX2ludHJzKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CisJaW50ICgqc3RhcnRfZmlybXdhcmUpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKwlpcnFyZXR1cm5fdCAoKmludHJfaGFuZGxlcikgKGludCAsIHZvaWQgKik7CisJdm9pZCAoKmludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCk7CisJaW50ICgqcmVzZXRfY2hpcCkgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworCWludCAoKnJlc2V0X2Zpcm13YXJlKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CisJdm9pZCAoKnF1ZXVlX2lvY2IpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKwl2b2lkICgqY29tcGxldGVfaW9jYikgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworCXVpbnQxNl90ICgqcmRfc2hkd19yZXFfcV9vdXQpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKwl1aW50MTZfdCAoKnJkX3NoZHdfcnNwX3FfaW4pIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKKwlpbnQgKCpnZXRfc3lzX2luZm8pIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK307CisKIC8qCiAgKiBMaW51eCBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlCiAgKi8KQEAgLTI5NiwyOCArMzY3LDM5IEBACiAjZGVmaW5lIEFGX0lOSVRfRE9ORQkJCTEgLyogMHgwMDAwMDAwMiAqLwogI2RlZmluZSBBRl9NQk9YX0NPTU1BTkQJCQkyIC8qIDB4MDAwMDAwMDQgKi8KICNkZWZpbmUgQUZfTUJPWF9DT01NQU5EX0RPTkUJCTMgLyogMHgwMDAwMDAwOCAqLworI2RlZmluZSBBRl9EUENfU0NIRURVTEVECQk1IC8qIDB4MDAwMDAwMjAgKi8KICNkZWZpbmUgQUZfSU5URVJSVVBUU19PTgkJNiAvKiAweDAwMDAwMDQwICovCiAjZGVmaW5lIEFGX0dFVF9DUkFTSF9SRUNPUkQJCTcgLyogMHgwMDAwMDA4MCAqLwogI2RlZmluZSBBRl9MSU5LX1VQCQkJOCAvKiAweDAwMDAwMTAwICovCiAjZGVmaW5lIEFGX0lSUV9BVFRBQ0hFRAkJCTEwIC8qIDB4MDAwMDA0MDAgKi8KICNkZWZpbmUgQUZfRElTQUJMRV9BQ0JfQ09NUExFVEUJCTExIC8qIDB4MDAwMDA4MDAgKi8KKyNkZWZpbmUgQUZfSEJBX0dPSU5HX0FXQVkJCTEyIC8qIDB4MDAwMDEwMDAgKi8KKyNkZWZpbmUgQUZfSU5UeF9FTkFCTEVECQkJMTUgLyogMHgwMDAwODAwMCAqLworI2RlZmluZSBBRl9NU0lfRU5BQkxFRAkJCTE2IC8qIDB4MDAwMTAwMDAgKi8KKyNkZWZpbmUgQUZfTVNJWF9FTkFCTEVECQkJMTcgLyogMHgwMDAyMDAwMCAqLworI2RlZmluZSBBRl9NQk9YX0NPTU1BTkRfTk9QT0xMCQkxOCAvKiAweDAwMDQwMDAwICovCisKIAogCXVuc2lnbmVkIGxvbmcgZHBjX2ZsYWdzOwogCiAjZGVmaW5lIERQQ19SRVNFVF9IQQkJCTEgLyogMHgwMDAwMDAwMiAqLwogI2RlZmluZSBEUENfUkVUUllfUkVTRVRfSEEJCTIgLyogMHgwMDAwMDAwNCAqLwogI2RlZmluZSBEUENfUkVMT0dJTl9ERVZJQ0UJCTMgLyogMHgwMDAwMDAwOCAqLwotI2RlZmluZSBEUENfUkVTRVRfSEFfREVTVFJPWV9EREJfTElTVAk0IC8qIDB4MDAwMDAwMTAgKi8KKyNkZWZpbmUgRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQJCTQgLyogMHgwMDAwMDAxMCAqLwogI2RlZmluZSBEUENfUkVTRVRfSEFfSU5UUgkJNSAvKiAweDAwMDAwMDIwICovCiAjZGVmaW5lIERQQ19JU05TX1JFU1RBUlQJCTcgLyogMHgwMDAwMDA4MCAqLwogI2RlZmluZSBEUENfQUVOCQkJCTkgLyogMHgwMDAwMDIwMCAqLwogI2RlZmluZSBEUENfR0VUX0RIQ1BfSVBfQUREUgkJMTUgLyogMHgwMDAwODAwMCAqLwogI2RlZmluZSBEUENfTElOS19DSEFOR0VECQkxOCAvKiAweDAwMDQwMDAwICovCisjZGVmaW5lIERQQ19SRVNFVF9BQ1RJVkUJCTIwIC8qIDB4MDAwNDAwMDAgKi8KKyNkZWZpbmUgRFBDX0hBX1VOUkVDT1ZFUkFCTEUJCTIxIC8qIDB4MDAwODAwMDAgSVNQLTgyeHggb25seSovCisjZGVmaW5lIERQQ19IQV9ORUVEX1FVSUVTQ0VOVAkJMjIgLyogMHgwMDEwMDAwMCBJU1AtODJ4eCBvbmx5Ki8KKwogCiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsgLyogcG9pbnRlciB0byBob3N0IGRhdGEgKi8KIAl1aW50MzJfdCB0b3RfZGRiczsKIAotCXVpbnQxNl90CWlvY2JfY250OworCXVpbnQxNl90IGlvY2JfY250OwogCiAJLyogU1JCIGNhY2hlLiAqLwogI2RlZmluZSBTUkJfTUlOX1JFUQkxMjgKQEAgLTMzMiwxNCArNDE0LDEzIEBACiAjZGVmaW5lIE1JTl9JT0JBU0VfTEVOCQkweDEwMAogCiAJdWludDE2X3QgcmVxX3FfY291bnQ7Ci0JdWludDhfdCByc3ZkMVsyXTsKIAogCXVuc2lnbmVkIGxvbmcgaG9zdF9ubzsKIAogCS8qIE5WUkFNIHJlZ2lzdGVycyAqLwogCXN0cnVjdCBlZXByb21fZGF0YSAqbnZyYW07CiAJc3BpbmxvY2tfdCBoYXJkd2FyZV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKLQl1aW50MzJfdCAgIGVlcHJvbV9jbWRfZGF0YTsKKwl1aW50MzJfdCBlZXByb21fY21kX2RhdGE7CiAKIAkvKiBDb3VudGVycyBmb3IgZ2VuZXJhbCBzdGF0aXN0aWNzICovCiAJdWludDY0X3QgaXNyX2NvdW50OwpAQCAtMzc1LDcgKzQ1Niw2IEBACiAJdWludDhfdCBhbGlhc1szMl07CiAJdWludDhfdCBuYW1lX3N0cmluZ1syNTZdOwogCXVpbnQ4X3QgaGVhcnRiZWF0X2ludGVydmFsOwotCXVpbnQ4X3QgcnN2ZDsKIAogCS8qIC0tLSBGcm9tIEZsYXNoU3lzSW5mbyAtLS0gKi8KIAl1aW50OF90IG15X21hY1tNQUNfQUREUl9MRU5dOwpAQCAtNDY5LDYgKzU0OSw0MCBAQAogCXN0cnVjdCBpbjZfYWRkciBpcHY2X2FkZHIwOwogCXN0cnVjdCBpbjZfYWRkciBpcHY2X2FkZHIxOwogCXN0cnVjdCBpbjZfYWRkciBpcHY2X2RlZmF1bHRfcm91dGVyX2FkZHI7CisKKwkvKiBxbGE4Mnh4IHNwZWNpZmljIGZpZWxkcyAqLworCXN0cnVjdCBkZXZpY2VfcmVnXzgyeHggIF9faW9tZW0gKnFsYTRfOHh4eF9yZWc7IC8qIEJhc2UgSS9PIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIG54X3BjaWJhc2U7CS8qIEJhc2UgSS9PIGFkZHJlc3MgKi8KKwl1aW50OF90ICpueF9kYl9yZF9wdHI7CQkvKiBEb29yYmVsbCByZWFkIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIG54X2RiX3dyX3B0cjsJLyogRG9vciBiZWxsIHdyaXRlIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGZpcnN0X3BhZ2VfZ3JvdXBfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlX2dyb3VwX2VuZDsKKworCXVpbnQzMl90IGNyYl93aW47CisJdWludDMyX3QgY3Vycl93aW5kb3c7CisJdWludDMyX3QgZGRyX21uX3dpbmRvdzsKKwl1bnNpZ25lZCBsb25nIG1uX3dpbl9jcmI7CisJdW5zaWduZWQgbG9uZyBtc193aW5fY3JiOworCWludCBxZHJfc25fd2luZG93OworCXJ3bG9ja190IGh3X2xvY2s7CisJdWludDE2X3QgZnVuY19udW07CisJaW50IGxpbmtfd2lkdGg7CisKKwlzdHJ1Y3QgcWxhNF84eHh4X2xlZ2FjeV9pbnRyX3NldCBueF9sZWdhY3lfaW50cjsKKwl1MzIgbnhfY3JiX21hc2s7CisKKwl1aW50OF90IHJldmlzaW9uX2lkOworCXVpbnQzMl90IGZ3X2hlYXJ0YmVhdF9jb3VudGVyOworCisJc3RydWN0IGlzcF9vcGVyYXRpb25zICppc3Bfb3BzOworCXN0cnVjdCBxbDgyeHhfaHdfZGF0YSBodzsKKworCXN0cnVjdCBxbDRfbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbUUxBX01TSVhfRU5UUklFU107CisKKwl1aW50MzJfdCBueF9kZXZfaW5pdF90aW1lb3V0OworCXVpbnQzMl90IG54X3Jlc2V0X3RpbWVvdXQ7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBtYnhfaW50cl9jb21wOwogfTsKIAogc3RhdGljIGlubGluZSBpbnQgaXNfaXB2NF9lbmFibGVkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKQEAgLTQ5Niw2ICs2MTAsMTEgQEAKIAlyZXR1cm4gaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDMyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19xbGE4MDIyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlyZXR1cm4gaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDIyOworfQorCiBzdGF0aWMgaW5saW5lIGludCBhZGFwdGVyX3VwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlyZXR1cm4gKHRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykgIT0gMCkgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKaW5kZXggODU1MjI2ZS4uYzk0YzlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKQEAgLTExLDcgKzExLDcgQEAKIAogI2RlZmluZSBNQVhfUFJTVF9ERVZfREJfRU5UUklFUwkJNjQKICNkZWZpbmUgTUlOX0RJU0NfREVWX0RCX0VOVFJZCQlNQVhfUFJTVF9ERVZfREJfRU5UUklFUwotI2RlZmluZSBNQVhfREVWX0RCX0VOVFJJRVMgNTEyCisjZGVmaW5lIE1BWF9ERVZfREJfRU5UUklFUwkJNTEyCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzcsNiArMzcsMzMgQEAKIAlfX2xlMzIgcnNydmQxWzMxXTsJLyogMHg4NC0weEZGICovCiB9OwogCisvKgorICogSVNQIDgyeHggSS9PIFJlZ2lzdGVyIFNldCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCisgKi8KK3N0cnVjdCBkZXZpY2VfcmVnXzgyeHggeworCV9fbGUzMiByZXFfcV9vdXQ7CS8qIDB4MDAwMCAoUik6IFJlcXVlc3QgUXVldWUgb3V0LVBvaW50ZXIuICovCisJX19sZTMyIHJlc2VydmUxWzYzXTsJLyogUmVxdWVzdCBRdWV1ZSBvdXQtUG9pbnRlci4gKDY0ICogNCkgKi8KKwlfX2xlMzIgcnNwX3FfaW47CS8qIDB4MDEwMCAoUi9XKTogUmVzcG9uc2UgUXVldWUgSW4tUG9pbnRlci4gKi8KKwlfX2xlMzIgcmVzZXJ2ZTJbNjNdOwkvKiBSZXNwb25zZSBRdWV1ZSBJbi1Qb2ludGVyLiAqLworCV9fbGUzMiByc3BfcV9vdXQ7CS8qIDB4MDIwMCAoUi9XKTogUmVzcG9uc2UgUXVldWUgT3V0LVBvaW50ZXIuICovCisJX19sZTMyIHJlc2VydmUzWzYzXTsJLyogUmVzcG9uc2UgUXVldWUgT3V0LVBvaW50ZXIuICovCisKKwlfX2xlMzIgbWFpbGJveF9pbls4XTsJLyogMHgwMzAwIChSL1cpOiBNYWlsIGJveCBJbiByZWdpc3RlcnMgKi8KKwlfX2xlMzIgcmVzZXJ2ZTRbMjRdOworCV9fbGUzMiBoaW50OwkJLyogMHgwMzgwIChSL1cpOiBIb3N0IGludGVycnVwdCByZWdpc3RlciAqLworI2RlZmluZSBISU5UX01CWF9JTlRfUEVORElORwlCSVRfMAorCV9fbGUzMiByZXNlcnZlNVszMV07CisJX19sZTMyIG1haWxib3hfb3V0WzhdOwkvKiAweDA0MDAgKFIpOiBNYWlsIGJveCBPdXQgcmVnaXN0ZXJzICovCisJX19sZTMyIHJlc2VydmU2WzU2XTsKKworCV9fbGUzMiBob3N0X3N0YXR1czsJLyogT2Zmc2V0IDB4NTAwIChSKTogaG9zdCBzdGF0dXMgKi8KKyNkZWZpbmUgSFNSWF9SSVNDX01CX0lOVAlCSVRfMCAgLyogUklTQyB0byBIb3N0IE1haWxib3ggaW50ZXJydXB0ICovCisjZGVmaW5lIEhTUlhfUklTQ19JT0NCX0lOVAlCSVRfMSAgLyogUklTQyB0byBIb3N0IElPQ0IgaW50ZXJydXB0ICovCisKKwlfX2xlMzIgaG9zdF9pbnQ7CS8qIE9mZnNldCAweDA1MDQgKFIvVyk6IEludGVycnVwdCBzdGF0dXMuICovCisjZGVmaW5lIElTUlhfODJYWF9SSVNDX0lOVAlCSVRfMCAvKiBSSVNDIGludGVycnVwdC4gKi8KK307CisKIC8qICByZW1vdGUgcmVnaXN0ZXIgc2V0IChhY2Nlc3MgdmlhIFBDSSBtZW1vcnkgcmVhZC93cml0ZSkgKi8KIHN0cnVjdCBpc3BfcmVnIHsKICNkZWZpbmUgTUJPWF9SRUdfQ09VTlQgOApAQCAtMjA2LDYgKzIzMyw3OSBAQAogCXVpbnQzMl90IEFzdWludDMyX3Q7CiB9OwogCisvKiA4MlhYIFN1cHBvcnQgIHN0YXJ0ICovCisvKiA4Mnh4IERlZmF1bHQgRkxUIEFkZHJlc3NlcyAqLworI2RlZmluZSBGQV9GTEFTSF9MQVlPVVRfQUREUl84MgkJMHhGQzQwMAorI2RlZmluZSBGQV9GTEFTSF9ERVNDUl9BRERSXzgyCQkweEZDMDAwCisjZGVmaW5lIEZBX0JPT1RfTE9BRF9BRERSXzgyCQkweDA0MDAwCisjZGVmaW5lIEZBX0JPT1RfQ09ERV9BRERSXzgyCQkweDIwMDAwCisjZGVmaW5lIEZBX1JJU0NfQ09ERV9BRERSXzgyCQkweDQwMDAwCisjZGVmaW5lIEZBX0dPTERfUklTQ19DT0RFX0FERFJfODIJMHg4MDAwMAorCisvKiBGbGFzaCBEZXNjcmlwdGlvbiBUYWJsZSAqLworc3RydWN0IHFsYV9mZHRfbGF5b3V0IHsKKwl1aW50OF90IHNpZ1s0XTsKKwl1aW50MTZfdCB2ZXJzaW9uOworCXVpbnQxNl90IGxlbjsKKwl1aW50MTZfdCBjaGVja3N1bTsKKwl1aW50OF90IHVudXNlZDFbMl07CisJdWludDhfdCBtb2RlbFsxNl07CisJdWludDE2X3QgbWFuX2lkOworCXVpbnQxNl90IGlkOworCXVpbnQ4X3QgZmxhZ3M7CisJdWludDhfdCBlcmFzZV9jbWQ7CisJdWludDhfdCBhbHRfZXJhc2VfY21kOworCXVpbnQ4X3Qgd3J0X2VuYWJsZV9jbWQ7CisJdWludDhfdCB3cnRfZW5hYmxlX2JpdHM7CisJdWludDhfdCB3cnRfc3RzX3JlZ19jbWQ7CisJdWludDhfdCB1bnByb3RlY3Rfc2VjX2NtZDsKKwl1aW50OF90IHJlYWRfbWFuX2lkX2NtZDsKKwl1aW50MzJfdCBibG9ja19zaXplOworCXVpbnQzMl90IGFsdF9ibG9ja19zaXplOworCXVpbnQzMl90IGZsYXNoX3NpemU7CisJdWludDMyX3Qgd3J0X2VuYWJsZV9kYXRhOworCXVpbnQ4X3QgcmVhZF9pZF9hZGRyX2xlbjsKKwl1aW50OF90IHdydF9kaXNhYmxlX2JpdHM7CisJdWludDhfdCByZWFkX2Rldl9pZF9sZW47CisJdWludDhfdCBjaGlwX2VyYXNlX2NtZDsKKwl1aW50MTZfdCByZWFkX3RpbWVvdXQ7CisJdWludDhfdCBwcm90ZWN0X3NlY19jbWQ7CisJdWludDhfdCB1bnVzZWQyWzY1XTsKK307CisKKy8qIEZsYXNoIExheW91dCBUYWJsZSAqLworCitzdHJ1Y3QgcWxhX2ZsdF9sb2NhdGlvbiB7CisJdWludDhfdCBzaWdbNF07CisJdWludDE2X3Qgc3RhcnRfbG87CisJdWludDE2X3Qgc3RhcnRfaGk7CisJdWludDhfdCB2ZXJzaW9uOworCXVpbnQ4X3QgdW51c2VkWzVdOworCXVpbnQxNl90IGNoZWNrc3VtOworfTsKKworc3RydWN0IHFsYV9mbHRfaGVhZGVyIHsKKwl1aW50MTZfdCB2ZXJzaW9uOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MTZfdCBjaGVja3N1bTsKKwl1aW50MTZfdCB1bnVzZWQ7Cit9OworCisvKiA4Mnh4IEZMVCBSZWdpb25zICovCisjZGVmaW5lIEZMVF9SRUdfRkRUCQkweDFhCisjZGVmaW5lIEZMVF9SRUdfRkxUCQkweDFjCisjZGVmaW5lIEZMVF9SRUdfQk9PVExPQURfODIJMHg3MgorI2RlZmluZSBGTFRfUkVHX0ZXXzgyCQkweDc0CisjZGVmaW5lIEZMVF9SRUdfR09MRF9GV184MgkweDc1CisjZGVmaW5lIEZMVF9SRUdfQk9PVF9DT0RFXzgyCTB4NzgKKworc3RydWN0IHFsYV9mbHRfcmVnaW9uIHsKKwl1aW50MzJfdCBjb2RlOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3Qgc3RhcnQ7CisJdWludDMyX3QgZW5kOworfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKgkJTWFpbGJveCBDb21tYW5kcyBTdHJ1Y3R1cmVzIGFuZCBEZWZpbml0aW9ucwpAQCAtMjE1LDYgKzMxNSwxMCBAQAogLyogIE1haWxib3ggY29tbWFuZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBNQk9YX0NNRF9BQk9VVF9GVwkJCTB4MDAwOQogI2RlZmluZSBNQk9YX0NNRF9QSU5HCQkJCTB4MDAwQgorI2RlZmluZSBNQk9YX0NNRF9FTkFCTEVfSU5UUlMJCQkweDAwMTAKKyNkZWZpbmUgSU5UUl9ESVNBQkxFCQkJCTAKKyNkZWZpbmUgSU5UUl9FTkFCTEUJCQkJMQorI2RlZmluZSBNQk9YX0NNRF9TVE9QX0ZXCQkJMHgwMDE0CiAjZGVmaW5lIE1CT1hfQ01EX0FCT1JUX1RBU0sJCQkweDAwMTUKICNkZWZpbmUgTUJPWF9DTURfTFVOX1JFU0VUCQkJMHgwMDE2CiAjZGVmaW5lIE1CT1hfQ01EX1RBUkdFVF9XQVJNX1JFU0VUCQkweDAwMTcKQEAgLTI0Myw2ICszNDcsNyBAQAogI2RlZmluZSBEREJfRFNfTE9HSU5fSU5fUFJPQ0VTUwkJCTB4MDcKICNkZWZpbmUgTUJPWF9DTURfR0VUX0ZXX1NUQVRFCQkJMHgwMDY5CiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9JTklUX0ZXX0NUUkxfQkxPQ0tfREVGQVVMVFMgMHgwMDZBCisjZGVmaW5lIE1CT1hfQ01EX0dFVF9TWVNfSU5GTwkJCTB4MDA3OAogI2RlZmluZSBNQk9YX0NNRF9SRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFMJMHgwMDg3CiAjZGVmaW5lIE1CT1hfQ01EX1NFVF9BQ0IJCQkweDAwODgKICNkZWZpbmUgTUJPWF9DTURfR0VUX0FDQgkJCTB4MDA4OQpAQCAtMzE4LDYgKzQyMywxNSBAQAogI2RlZmluZSBNQk9YX0FTVFNfSVBTRUNfU1lTVEVNX0ZBVEFMX0VSUk9SCTB4ODAyMgogI2RlZmluZSBNQk9YX0FTVFNfU1VCTkVUX1NUQVRFX0NIQU5HRQkJMHg4MDI3CiAKKy8qIEFDQiBTdGF0ZSBEZWZpbmVzICovCisjZGVmaW5lIEFDQl9TVEFURV9VTkNPTkZJR1VSRUQJMHgwMAorI2RlZmluZSBBQ0JfU1RBVEVfSU5WQUxJRAkweDAxCisjZGVmaW5lIEFDQl9TVEFURV9BQ1FVSVJJTkcJMHgwMgorI2RlZmluZSBBQ0JfU1RBVEVfVEVOVEFUSVZFCTB4MDMKKyNkZWZpbmUgQUNCX1NUQVRFX0RFUFJJQ0FURUQJMHgwNAorI2RlZmluZSBBQ0JfU1RBVEVfVkFMSUQJCTB4MDUKKyNkZWZpbmUgQUNCX1NUQVRFX0RJU0FCTElORwkweDA2CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBIb3N0IEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBCbG9jayAoZnJvbSBob3N0KSAqLwpAQCAtNTU4LDYgKzY3MiwyMCBAQAogCXVpbnQzMl90IHJlc2VydmVkMVszOV07IC8qIDE3MC0xZmYgKi8KIH07CS8qIDIwMCAqLwogCitzdHJ1Y3QgbWJ4X3N5c19pbmZvIHsKKwl1aW50OF90IGJvYXJkX2lkX3N0clsxNl07CS8qIEtlZXAgYm9hcmQgSUQgc3RyaW5nIGZpcnN0ICovCisJCQkJCS8qIGluIHRoaXMgc3RydWN0dXJlIGZvciBHVUkuICovCisJdWludDE2X3QgYm9hcmRfaWQ7CS8qIGJvYXJkIElEIGNvZGUgKi8KKwl1aW50MTZfdCBwaHlzX3BvcnRfY250OwkvKiBudW1iZXIgb2YgcGh5c2ljYWwgbmV0d29yayBwb3J0cyAqLworCXVpbnQxNl90IHBvcnRfbnVtOwkvKiBuZXR3b3JrIHBvcnQgZm9yIHRoaXMgUENJIGZ1bmN0aW9uICovCisJCQkJLyogKHBvcnQgMCBpcyBmaXJzdCBwb3J0KSAqLworCXVpbnQ4X3QgbWFjX2FkZHJbNl07CS8qIE1BQyBhZGRyZXNzIGZvciB0aGlzIFBDSSBmdW5jdGlvbiAqLworCXVpbnQzMl90IGlzY3NpX3BjaV9mdW5jX2NudDsJLyogbnVtYmVyIG9mIGlTQ1NJIFBDSSBmdW5jdGlvbnMgKi8KKwl1aW50MzJfdCBwY2lfZnVuYzsJCS8qIHRoaXMgUENJIGZ1bmN0aW9uICovCisJdW5zaWduZWQgY2hhciBzZXJpYWxfbnVtYmVyWzE2XTsJLyogc2VyaWFsIG51bWJlciBzdHJpbmcgKi8KKwl1aW50OF90IHJlc2VydmVkWzE2XTsKK307CisKIHN0cnVjdCBjcmFzaF9yZWNvcmQgewogCXVpbnQxNl90IGZ3X21ham9yX3ZlcnNpb247CS8qIDAwIC0gMDEgKi8KIAl1aW50MTZfdCBmd19taW5vcl92ZXJzaW9uOwkvKiAwMiAtIDAzICovCkBAIC04MTQsNCArOTQyLDEzIEBACiAJdWludDhfdCByZXM0WzE2XTsJLyogMzAtM0YgKi8KIH07CiAKKy8qCisgKiBJU1AgcXVldWUgLSByZXNwb25zZSBxdWV1ZSBlbnRyeSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgcmVzcG9uc2UgeworCXVpbnQ4X3QgZGF0YVs2MF07CisJdWludDMyX3Qgc2lnbmF0dXJlOworI2RlZmluZSBSRVNQT05TRV9QUk9DRVNTRUQJMHhERUFEREVBRAkvKiBTaWduYXR1cmUgKi8KK307CisKICNlbmRpZiAvKiAgX1FMQTRYX0ZXX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCmluZGV4IGM0NjM2ZjYuLmM5Y2Q1ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaApAQCAtMTAsMzEgKzEwLDMyIEBACiAKIHN0cnVjdCBpc2NzaV9jbHNfY29ubjsKIAotdm9pZCBxbGE0eHh4X2h3X3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNHh4eF9od19yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaW50IHFsNHh4eF9sb2NrX2RydnJfd2FpdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYSk7CiBpbnQgcWxhNHh4eF9zZW5kX3RndHMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBjaGFyICppcCwgdWludDE2X3QgcG9ydCk7Ci1pbnQgcWxhNHh4eF9zZW5kX2NvbW1hbmRfdG9faXNwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IHNyYiAqIHNyYik7Ci1pbnQgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwKK2ludCBxbGE0eHh4X3NlbmRfY29tbWFuZF90b19pc3Aoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICpzcmIpOworaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCSAgICAgICB1aW50OF90IHJlbmV3X2RkYl9saXN0KTsKIGludCBxbGE0eHh4X3NvZnRfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIGlycXJldHVybl90IHFsYTR4eHhfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKLXZvaWQgcWxhNHh4eF9mcmVlX2RkYl9saXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEpOwotdm9pZCBxbGE0eHh4X3Byb2Nlc3NfYWVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHVpbnQ4X3QgcHJvY2Vzc19hZW4pOwordm9pZCBxbGE0eHh4X2ZyZWVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3ZvaWQgcWxhNHh4eF9mcmVlX2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7Cit2b2lkIHFsYTR4eHhfcHJvY2Vzc19hZW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50OF90IHByb2Nlc3NfYWVuKTsKIAotaW50IHFsYTR4eHhfZ2V0X2RoY3BfaXBfYWRkcmVzcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhKTsKLWludCBxbGE0eHh4X3JlbG9naW5fZGV2aWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsCi0JCQkgICBzdHJ1Y3QgZGRiX2VudHJ5ICogZGRiX2VudHJ5KTsKK2ludCBxbGE0eHh4X2dldF9kaGNwX2lwX2FkZHJlc3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK2ludCBxbGE0eHh4X3JlbG9naW5fZGV2aWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCSAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7CiBpbnQgcWxhNHh4eF9hYm9ydF90YXNrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IHNyYiAqc3JiKTsKLWludCBxbGE0eHh4X3Jlc2V0X2x1bihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzdHJ1Y3QgZGRiX2VudHJ5ICogZGRiX2VudHJ5LAoraW50IHFsYTR4eHhfcmVzZXRfbHVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LAogCQkgICAgICBpbnQgbHVuKTsKLWludCBxbGE0eHh4X3Jlc2V0X3RhcmdldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLAotCQkJIHN0cnVjdCBkZGJfZW50cnkgKiBkZGJfZW50cnkpOwotaW50IHFsYTR4eHhfZ2V0X2ZsYXNoKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCitpbnQgcWxhNHh4eF9yZXNldF90YXJnZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7CitpbnQgcWxhNHh4eF9nZXRfZmxhc2goc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IGRtYV9hZGRyLAogCQkgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbik7Ci1pbnQgcWxhNHh4eF9nZXRfZmlybXdhcmVfc3RhdHVzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEpOwotaW50IHFsYTR4eHhfZ2V0X2Zpcm13YXJlX3N0YXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEpOwotaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9md19jYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhKTsKK2ludCBxbGE0eHh4X2dldF9maXJtd2FyZV9zdGF0dXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK2ludCBxbGE0eHh4X2dldF9maXJtd2FyZV9zdGF0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9md19jYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogCiAvKiBGSVhNRTogR29vZG5lc3MhICB0aGlzIHJlYWxseSB3YW50cyBhIHNtYWxsIHN0cnVjdCB0byBob2xkIHRoZQogICogcGFyYW1ldGVycy4gT24geDg2IHRoZSBhcmdzIHdpbGwgZ2V0IHBhc3NlZCBvbiB0aGUgc3RhY2shICovCkBAIC01NCwyMCArNTUsMjAgQEAKIAogdm9pZCBxbGE0eHh4X21hcmtfZGV2aWNlX21pc3Npbmcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAogCQkJCSBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpOwotdTE2IHJkX252cmFtX3dvcmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgaW50IG9mZnNldCk7Ci12b2lkIHFsYTR4eHhfZ2V0X2NyYXNoX3JlY29yZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhKTsKK3UxNiByZF9udnJhbV93b3JkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IG9mZnNldCk7Cit2b2lkIHFsYTR4eHhfZ2V0X2NyYXNoX3JlY29yZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogc3RydWN0IGRkYl9lbnRyeSAqcWxhNHh4eF9hbGxvY19zZXNzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiBpbnQgcWxhNHh4eF9hZGRfc2VzcyhzdHJ1Y3QgZGRiX2VudHJ5ICopOwogdm9pZCBxbGE0eHh4X2Rlc3Ryb3lfc2VzcyhzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpOwotaW50IHFsYTR4eHhfaXNfbnZyYW1fY29uZmlndXJhdGlvbl92YWxpZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhKTsKK2ludCBxbGE0eHh4X2lzX252cmFtX2NvbmZpZ3VyYXRpb25fdmFsaWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIGludCBxbGE0eHh4X2dldF9md192ZXJzaW9uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEpOwotdm9pZCBxbGE0eHh4X2ludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwKK3ZvaWQgcWxhNHh4eF9pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCQkgICAgICAgdWludDMyX3QgaW50cl9zdGF0dXMpOwotaW50IHFsYTR4eHhfaW5pdF9yaW5ncyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhKTsKLXN0cnVjdCBzcmIgKiBxbGE0eHh4X2RlbF9mcm9tX2FjdGl2ZV9hcnJheShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkJCXVpbnQzMl90IGluZGV4KTsKK2ludCBxbGE0eHh4X2luaXRfcmluZ3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIHZvaWQgcWxhNHh4eF9zcmJfY29tcGwoc3RydWN0IGtyZWYgKnJlZik7Ci1pbnQgcWxhNHh4eF9yZWluaXRpYWxpemVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSk7CitzdHJ1Y3Qgc3JiICpxbGE0eHh4X2RlbF9mcm9tX2FjdGl2ZV9hcnJheShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCXVpbnQzMl90IGluZGV4KTsKK2ludCBxbGE0eHh4X3JlaW5pdGlhbGl6ZV9kZGJfbGlzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaW50IHFsYTR4eHhfcHJvY2Vzc19kZGJfY2hhbmdlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGZ3X2RkYl9pbmRleCwKIAkJdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGNvbm5fZXJyb3IpOwogdm9pZCBxbGE0eHh4X2R1bXBfYnVmZmVyKHZvaWQgKmIsIHVpbnQzMl90IHNpemUpOwpAQCAtNzUsOCArNzYsNjUgQEAKIAlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksIGludCBsdW4sIHVpbnQxNl90IG1ya3JfbW9kKTsKIGludCBxbGE0X2lzX3JlbG9naW5fYWxsb3dlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGNvbm5fZXJyKTsKIAoraW50IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCBpbkNvdW50LAorCQl1aW50OF90IG91dENvdW50LCB1aW50MzJfdCAqbWJ4X2NtZCwgdWludDMyX3QgKm1ieF9zdHMpOworCit2b2lkIHFsYTR4eHhfcXVldWVfaW9jYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwordm9pZCBxbGE0eHh4X2NvbXBsZXRlX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK2ludCBxbGE0eHh4X2dldF9zeXNfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTR4eHhfaW9zcGFjZV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3ZvaWQgcWxhNHh4eF9wY2lfY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNHh4eF9zdGFydF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaXJxcmV0dXJuX3QgcWxhNHh4eF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3VpbnQxNl90IHFsYTR4eHhfcmRfc2hkd19yZXFfcV9vdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3VpbnQxNl90IHFsYTR4eHhfcmRfc2hkd19yc3BfcV9pbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTR4eHhfcmVxdWVzdF9pcnFzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTR4eHhfZnJlZV9pcnFzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTR4eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwordm9pZCBxbGE0eHh4X3dha2VfZHBjKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTR4eHhfZ2V0X2Nvbm5fZXZlbnRfbG9nKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CisKK3ZvaWQgcWxhNF84eHh4X3BjaV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitpbnQgcWxhNF84eHh4X2lvc3BhY2VfY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNF84eHh4X2xvYWRfcmlzYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2lycXJldHVybl90IHFsYTRfOHh4eF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3ZvaWQgcWxhNF84eHh4X3F1ZXVlX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3ZvaWQgcWxhNF84eHh4X2NvbXBsZXRlX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKKworaW50IHFsYTRfOHh4eF9jcmJfd2luX2xvY2soc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7Cit2b2lkIHFsYTRfOHh4eF9jcmJfd2luX3VubG9jayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2ludCBxbGE0Xzh4eHhfcGNpX2dldF9jcmJfYWRkcl8yTShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1bG9uZyAqKTsKK3ZvaWQgcWxhNF84eHh4X3dyXzMyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVsb25nLCB1MzIpOworaW50IHFsYTRfOHh4eF9yZF8zMihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1bG9uZyk7CitpbnQgcWxhNF84eHh4X3BjaV9tZW1fcmVhZF8yTShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1NjQsIHZvaWQgKiwgaW50KTsKK2ludCBxbGE0Xzh4eHhfcGNpX21lbV93cml0ZV8yTShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHU2NCwgdm9pZCAqLCBpbnQpOworaW50IHFsYTRfOHh4eF9pc3BfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3ZvaWQgcWxhNF84eHh4X2ludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQl1aW50MzJfdCBpbnRyX3N0YXR1cyk7Cit1aW50MTZfdCBxbGE0Xzh4eHhfcmRfc2hkd19yZXFfcV9vdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3VpbnQxNl90IHFsYTRfOHh4eF9yZF9zaGR3X3JzcF9xX2luKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNF84eHh4X2dldF9zeXNfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwordm9pZCBxbGE0Xzh4eHhfd2F0Y2hkb2coc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK2ludCBxbGE0Xzh4eHhfc3RvcF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTRfOHh4eF9nZXRfZmxhc2hfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwordm9pZCBxbGE0Xzh4eHhfZW5hYmxlX2ludHJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTRfOHh4eF9kaXNhYmxlX2ludHJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNF84eHh4X2VuYWJsZV9tc2l4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTRfOHh4eF9kaXNhYmxlX21zaXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK2lycXJldHVybl90IHFsYTRfOHh4eF9tc2lfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworaXJxcmV0dXJuX3QgcWxhNF84eHh4X2RlZmF1bHRfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CitpcnFyZXR1cm5fdCBxbGE0Xzh4eHhfbXNpeF9yc3BfcShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwordm9pZCBxbGE0eHh4X21hcmtfYWxsX2RldmljZXNfbWlzc2luZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwordm9pZCBxbGE0eHh4X2RlYWRfYWRhcHRlcl9jbGVhbnVwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNF84eHh4X2lkY19sb2NrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTRfOHh4eF9pZGNfdW5sb2NrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNF84eHh4X2RldmljZV9zdGF0ZV9oYW5kbGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit2b2lkIHFsYTRfOHh4eF9uZWVkX3FzbnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwordm9pZCBxbGE0Xzh4eHhfY2xlYXJfZHJ2X2FjdGl2ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworCiBleHRlcm4gaW50IHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nOwogZXh0ZXJuIGludCBxbDR4ZGlzY292ZXJ5d2FpdDsKIGV4dGVybiBpbnQgcWw0eGRvbnRyZXNldGhiYTsKLWV4dGVybiBpbnQgcWw0X21vZF91bmxvYWQ7CitleHRlcm4gaW50IHFsNHhlbmFibGVtc2l4OworCiAjZW5kaWYgLyogX1FMQTR4X0dCTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYwppbmRleCA1NTEwZGY4Li4zMDA3MzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKQEAgLTExLDggKzExLDggQEAKICNpbmNsdWRlICJxbDRfZGJnLmgiCiAjaW5jbHVkZSAicWw0X2lubGluZS5oIgogCi1zdGF0aWMgc3RydWN0IGRkYl9lbnRyeSAqIHFsYTR4eHhfYWxsb2NfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQkJICAgIHVpbnQzMl90IGZ3X2RkYl9pbmRleCk7CitzdGF0aWMgc3RydWN0IGRkYl9lbnRyeSAqcWxhNHh4eF9hbGxvY19kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCQkgICB1aW50MzJfdCBmd19kZGJfaW5kZXgpOwogCiBzdGF0aWMgdm9pZCBxbDR4eHhfc2V0X21hY19udW1iZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewpAQCAtNTEsOCArNTEsOCBAQAogICogVGhpcyByb3V0aW5lIGRlYWxsb2NhdGVzIGFuZCB1bmxpbmtzIHRoZSBzcGVjaWZpZWQgZGRiX2VudHJ5IGZyb20gdGhlCiAgKiBhZGFwdGVyJ3MKICAqKi8KLXN0YXRpYyB2b2lkIHFsYTR4eHhfZnJlZV9kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpCit2b2lkIHFsYTR4eHhfZnJlZV9kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSkKIHsKIAkvKiBSZW1vdmUgZGV2aWNlIGVudHJ5IGZyb20gbGlzdCAqLwogCWxpc3RfZGVsX2luaXQoJmRkYl9lbnRyeS0+bGlzdCk7CkBAIC04Niw2ICs4NiwyNSBAQAogfQogCiAvKioKKyAqIHFsYTR4eHhfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMoKSAtIEluaXRpYWxpemVzIHJlc3BvbnNlIHF1ZXVlIGVudHJpZXMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBCZWdpbm5pbmcgb2YgcmVxdWVzdCByaW5nIGhhcyBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrIGFscmVhZHkgYnVpbHQKKyAqIGJ5IG52cmFtIGNvbmZpZyByb3V0aW5lLgorICoqLworc3RhdGljIHZvaWQgcWxhNHh4eF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDE2X3QgY250OworCXN0cnVjdCByZXNwb25zZSAqcGt0OworCisJcGt0ID0gKHN0cnVjdCByZXNwb25zZSAqKWhhLT5yZXNwb25zZV9wdHI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBSRVNQT05TRV9RVUVVRV9ERVBUSDsgY250KyspIHsKKwkJcGt0LT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CisJCXBrdCsrOworCX0KK30KKworLyoqCiAgKiBxbGE0eHh4X2luaXRfcmluZ3MgLSBpbml0aWFsaXplIGh3IHF1ZXVlcwogICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKgpAQCAtMTA5LDE5ICsxMjgsMzEgQEAKIAloYS0+cmVzcG9uc2Vfb3V0ID0gMDsKIAloYS0+cmVzcG9uc2VfcHRyID0gJmhhLT5yZXNwb25zZV9yaW5nW2hhLT5yZXNwb25zZV9vdXRdOwogCi0JLyoKLQkgKiBJbml0aWFsaXplIERNQSBTaGFkb3cgcmVnaXN0ZXJzLiAgVGhlIGZpcm13YXJlIGlzIHJlYWxseSBzdXBwb3NlZCB0bwotCSAqIHRha2UgY2FyZSBvZiB0aGlzLCBidXQgb24gc29tZSB1bmlwcm9jZXNzb3Igc3lzdGVtcywgdGhlIHNoYWRvdwotCSAqIHJlZ2lzdGVycyBhcmVuJ3QgY2xlYXJlZC0tIGNhdXNpbmcgdGhlIGludGVycnVwdF9oYW5kbGVyIHRvIHRoaW5rCi0JICogdGhlcmUgYXJlIHJlc3BvbnNlcyB0byBiZSBwcm9jZXNzZWQgd2hlbiB0aGVyZSBhcmVuJ3QuCi0JICovCi0JaGEtPnNoYWRvd19yZWdzLT5yZXFfcV9vdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOwotCWhhLT5zaGFkb3dfcmVncy0+cnNwX3FfaW4gPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOwotCXdtYigpOworCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQl3cml0ZWwoMCwKKwkJICAgICh1bnNpZ25lZCBsb25nICBfX2lvbWVtICopJmhhLT5xbGE0Xzh4eHhfcmVnLT5yZXFfcV9vdXQpOworCQl3cml0ZWwoMCwKKwkJICAgICh1bnNpZ25lZCBsb25nICBfX2lvbWVtICopJmhhLT5xbGE0Xzh4eHhfcmVnLT5yc3BfcV9pbik7CisJCXdyaXRlbCgwLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgIF9faW9tZW0gKikmaGEtPnFsYTRfOHh4eF9yZWctPnJzcF9xX291dCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBETUEgU2hhZG93IHJlZ2lzdGVycy4gIFRoZSBmaXJtd2FyZSBpcyByZWFsbHkKKwkJICogc3VwcG9zZWQgdG8gdGFrZSBjYXJlIG9mIHRoaXMsIGJ1dCBvbiBzb21lIHVuaXByb2Nlc3NvcgorCQkgKiBzeXN0ZW1zLCB0aGUgc2hhZG93IHJlZ2lzdGVycyBhcmVuJ3QgY2xlYXJlZC0tIGNhdXNpbmcKKwkJICogdGhlIGludGVycnVwdF9oYW5kbGVyIHRvIHRoaW5rIHRoZXJlIGFyZSByZXNwb25zZXMgdG8gYmUKKwkJICogcHJvY2Vzc2VkIHdoZW4gdGhlcmUgYXJlbid0LgorCQkgKi8KKwkJaGEtPnNoYWRvd19yZWdzLT5yZXFfcV9vdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOworCQloYS0+c2hhZG93X3JlZ3MtPnJzcF9xX2luID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKKwkJd21iKCk7CiAKLQl3cml0ZWwoMCwgJmhhLT5yZWctPnJlcV9xX2luKTsKLQl3cml0ZWwoMCwgJmhhLT5yZWctPnJzcF9xX291dCk7Ci0JcmVhZGwoJmhhLT5yZWctPnJzcF9xX291dCk7CisJCXdyaXRlbCgwLCAmaGEtPnJlZy0+cmVxX3FfaW4pOworCQl3cml0ZWwoMCwgJmhhLT5yZWctPnJzcF9xX291dCk7CisJCXJlYWRsKCZoYS0+cmVnLT5yc3BfcV9vdXQpOworCX0KKworCXFsYTR4eHhfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMoaGEpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtMTI5LDExICsxNjAsMTEgQEAKIH0KIAogLyoqCi0gKiBxbGE0eHh4X3ZhbGlkYXRlX21hY19hZGRyZXNzIC0gdmFsaWRhdGUgYWRhcHRlciBNQUMgYWRkcmVzcyhlcykKKyAqIHFsYTR4eHhfZ2V0X3N5c19pbmZvIC0gdmFsaWRhdGUgYWRhcHRlciBNQUMgYWRkcmVzcyhlcykKICAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICoKICAqKi8KLXN0YXRpYyBpbnQgcWxhNHh4eF92YWxpZGF0ZV9tYWNfYWRkcmVzcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCitpbnQgcWxhNHh4eF9nZXRfc3lzX2luZm8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCXN0cnVjdCBmbGFzaF9zeXNfaW5mbyAqc3lzX2luZm87CiAJZG1hX2FkZHJfdCBzeXNfaW5mb19kbWE7CkBAIC0xNDUsNyArMTc2LDcgQEAKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyLlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCi0JCWdvdG8gZXhpdF92YWxpZGF0ZV9tYWNfbm9fZnJlZTsKKwkJZ290byBleGl0X2dldF9zeXNfaW5mb19ub19mcmVlOwogCX0KIAltZW1zZXQoc3lzX2luZm8sIDAsIHNpemVvZigqc3lzX2luZm8pKTsKIApAQCAtMTU1LDcgKzE4Niw3IEBACiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBnZXRfZmxhc2ggRkxBU0hfT0ZGU0VUX1NZU19JTkZPICIKIAkJCSAgICAgICJmYWlsZWRcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCi0JCWdvdG8gZXhpdF92YWxpZGF0ZV9tYWM7CisJCWdvdG8gZXhpdF9nZXRfc3lzX2luZm87CiAJfQogCiAJLyogU2F2ZSBNLkEuQy4gYWRkcmVzcyAmIHNlcmlhbF9udW1iZXIgKi8KQEAgLTE2OCwxMSArMTk5LDExIEBACiAKIAlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAotIGV4aXRfdmFsaWRhdGVfbWFjOgorZXhpdF9nZXRfc3lzX2luZm86CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqc3lzX2luZm8pLCBzeXNfaW5mbywKIAkJCSAgc3lzX2luZm9fZG1hKTsKIAotIGV4aXRfdmFsaWRhdGVfbWFjX25vX2ZyZWU6CitleGl0X2dldF9zeXNfaW5mb19ub19mcmVlOgogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4Myw3ICsyMTQsNyBAQAogICoqLwogc3RhdGljIGludCBxbGE0eHh4X2luaXRfbG9jYWxfZGF0YShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JLyogSW5pdGlsaXplIGFlbiBxdWV1ZSAqLworCS8qIEluaXRpYWxpemUgYWVuIHF1ZXVlICovCiAJaGEtPmFlbl9xX2NvdW50ID0gTUFYX0FFTl9FTlRSSUVTOwogCiAJcmV0dXJuIHFsYTR4eHhfZ2V0X2Zpcm13YXJlX3N0YXR1cyhoYSk7CkBAIC0yNjYsNyArMjk3LDcgQEAKIAl1aW50MzJfdCB0aW1lb3V0X2NvdW50OwogCWludCByZWFkeSA9IDA7CiAKLQlERUJVRzIoZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJXYWl0aW5nIGZvciBGaXJtd2FyZSBSZWFkeS4uXG4iKSk7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIldhaXRpbmcgZm9yIEZpcm13YXJlIFJlYWR5Li5cbiIpKTsKIAlmb3IgKHRpbWVvdXRfY291bnQgPSBBREFQVEVSX0lOSVRfVE9WOyB0aW1lb3V0X2NvdW50ID4gMDsKIAkgICAgIHRpbWVvdXRfY291bnQtLSkgewogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KERQQ19HRVRfREhDUF9JUF9BRERSLCAmaGEtPmRwY19mbGFncykpCkBAIC0zMzksMjkgKzM3MCwyOSBAQAogCiAJCQlpZiAoIXFsYTR4eHhfd2FpdF9mb3JfaXBfY29uZmlnKGhhKSB8fAogCQkJCQkJCXRpbWVvdXRfY291bnQgPT0gMSkgewotCQkJCURFQlVHMihkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKLQkJCQkJCSJGaXJtd2FyZSBSZWFkeS4uXG4iKSk7CisJCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICAgIkZpcm13YXJlIFJlYWR5Li5cbiIpKTsKIAkJCQkvKiBUaGUgZmlybXdhcmUgaXMgcmVhZHkgdG8gcHJvY2VzcyBTQ1NJCiAJCQkJICAgY29tbWFuZHMuICovCi0JCQkJREVCVUcyKGRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LAorCQkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkJCSJzY3NpJWxkOiAlczogTUVESUEgVFlQRSIKIAkJCQkJIiAtICVzXG4iLCBoYS0+aG9zdF9ubywKIAkJCQkJX19mdW5jX18sIChoYS0+YWRkbF9md19zdGF0ZSAmCiAJCQkJCUZXX0FERFNUQVRFX09QVElDQUxfTUVESUEpCiAJCQkJCSE9IDAgPyAiT1BUSUNBTCIgOiAiQ09QUEVSIikpOwotCQkJCURFQlVHMihkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKKwkJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJCQkic2NzaSVsZDogJXM6IERIQ1B2NCBTVEFURSIKIAkJCQkJIiBFbmFibGVkICVzXG4iLCBoYS0+aG9zdF9ubywKIAkJCQkJIF9fZnVuY19fLCAoaGEtPmFkZGxfZndfc3RhdGUgJgogCQkJCQkgRldfQUREU1RBVEVfREhDUHY0X0VOQUJMRUQpICE9IDAgPwogCQkJCQkiWUVTIiA6ICJOTyIpKTsKLQkJCQlERUJVRzIoZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsCisJCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJCQkJInNjc2klbGQ6ICVzOiBMSU5LICVzXG4iLAogCQkJCQloYS0+aG9zdF9ubywgX19mdW5jX18sCiAJCQkJCShoYS0+YWRkbF9md19zdGF0ZSAmCiAJCQkJCSBGV19BRERTVEFURV9MSU5LX1VQKSAhPSAwID8KIAkJCQkJIlVQIiA6ICJET1dOIikpOwotCQkJCURFQlVHMihkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKKwkJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJCQkic2NzaSVsZDogJXM6IGlTTlMgU2VydmljZSAiCiAJCQkJCSJTdGFydGVkICVzXG4iLAogCQkJCQloYS0+aG9zdF9ubywgX19mdW5jX18sCkBAIC0zOTksNiArNDMwLDcgQEAKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IEZXIGluaXRpYWxpemVkLCBidXQgIgogCQkJICAgICAgImF1dG8tZGlzY292ZXJ5IHN0aWxsIGluIHByb2Nlc3NcbiIsCiAJCQkgICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCXJlYWR5ID0gMTsKIAl9CiAKIAlyZXR1cm4gcmVhZHk7CkBAIC00MTMsNyArNDQ1LDcgQEAKIHsKIAlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwogCi0JZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJJbml0aWFsaXppbmcgZmlybXdhcmUuLlxuIik7CisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSW5pdGlhbGl6aW5nIGZpcm13YXJlLi5cbiIpOwogCWlmIChxbGE0eHh4X2luaXRpYWxpemVfZndfY2IoaGEpID09IFFMQV9FUlJPUikgewogCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogRmFpbGVkIHRvIGluaXRpYWxpemUgZmlybXdhcmUgIgogCQkJICAgICAgImNvbnRyb2wgYmxvY2tcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwpAQCAtNDQzLDE3ICs0NzUsMTcgQEAKIAlpZiAoZndfZGRiX2VudHJ5ID09IE5VTEwpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyLlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBleGl0X2dldF9kZGJfZW50cnlfbm9fZnJlZTsKIAl9CiAKIAlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgZndfZGRiX2VudHJ5LAogCQkJCSAgICBmd19kZGJfZW50cnlfZG1hLCBOVUxMLCBOVUxMLAogCQkJCSAgICAmZGV2aWNlX3N0YXRlLCBOVUxMLCBOVUxMLCBOVUxMKSA9PQotCSAgICBRTEFfRVJST1IpIHsKKwkJCQkgICAgUUxBX0VSUk9SKSB7CiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBmYWlsZWQgZ2V0X2RkYl9lbnRyeSBmb3IgIgogCQkJICAgICAgImZ3X2RkYl9pbmRleCAlZFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAogCQkJICAgICAgZndfZGRiX2luZGV4KSk7Ci0JCXJldHVybiBOVUxMOworCQlnb3RvIGV4aXRfZ2V0X2RkYl9lbnRyeTsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBEREIgaWYgbm90IGFscmVhZHkgYWxsb2NhdGVkLiAqLwpAQCAtNDcxLDYgKzUwMyw3IEBACiAJCX0KIAl9CiAKKwkvKiBpZiBub3QgZm91bmQgYWxsb2NhdGUgbmV3IGRkYiAqLwogCWlmICghZm91bmQpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGRkYlslZF0gbm90IGZvdW5kIC0gYWxsb2NhdGluZyAiCiAJCQkgICAgICAibmV3IGRkYlxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLApAQCAtNDc5LDEwICs1MTIsMTEgQEAKIAkJZGRiX2VudHJ5ID0gcWxhNHh4eF9hbGxvY19kZGIoaGEsIGZ3X2RkYl9pbmRleCk7CiAJfQogCi0JLyogaWYgbm90IGZvdW5kIGFsbG9jYXRlIG5ldyBkZGIgKi8KK2V4aXRfZ2V0X2RkYl9lbnRyeToKIAlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLCBmd19kZGJfZW50cnksCiAJCQkgIGZ3X2RkYl9lbnRyeV9kbWEpOwogCitleGl0X2dldF9kZGJfZW50cnlfbm9fZnJlZToKIAlyZXR1cm4gZGRiX2VudHJ5OwogfQogCkBAIC01MTAsNyArNTQ0LDggQEAKIAlpZiAoZGRiX2VudHJ5ID09IE5VTEwpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGRkYl9lbnRyeSBpcyBOVUxMXG4iLCBoYS0+aG9zdF9ubywKIAkJCSAgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXhpdF91cGRhdGVfZGRiOworCisJCWdvdG8gZXhpdF91cGRhdGVfZGRiX25vX2ZyZWU7CiAJfQogCiAJLyogTWFrZSBzdXJlIHRoZSBkbWEgYnVmZmVyIGlzIHZhbGlkICovCkBAIC01MjEsNyArNTU2LDcgQEAKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyLlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCi0JCWdvdG8gZXhpdF91cGRhdGVfZGRiOworCQlnb3RvIGV4aXRfdXBkYXRlX2RkYl9ub19mcmVlOwogCX0KIAogCWlmIChxbGE0eHh4X2dldF9md2RkYl9lbnRyeShoYSwgZndfZGRiX2luZGV4LCBmd19kZGJfZW50cnksCkBAIC01MjksNyArNTY0LDcgQEAKIAkJCQkgICAgJmRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSwgJmNvbm5fZXJyLAogCQkJCSAgICAmZGRiX2VudHJ5LT50Y3Bfc291cmNlX3BvcnRfbnVtLAogCQkJCSAgICAmZGRiX2VudHJ5LT5jb25uZWN0aW9uX2lkKSA9PQotCSAgICBRTEFfRVJST1IpIHsKKwkJCQkgICAgUUxBX0VSUk9SKSB7CiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBmYWlsZWQgZ2V0X2RkYl9lbnRyeSBmb3IgIgogCQkJICAgICAgImZ3X2RkYl9pbmRleCAlZFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAogCQkJICAgICAgZndfZGRiX2luZGV4KSk7CkBAIC01NTksNiArNTk0LDkgQEAKIAltZW1jcHkoJmRkYl9lbnRyeS0+aXNjc2lfbmFtZVswXSwgJmZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZVswXSwKIAkgICAgICAgbWluKHNpemVvZihkZGJfZW50cnktPmlzY3NpX25hbWUpLAogCQkgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSkpOworCW1lbWNweSgmZGRiX2VudHJ5LT5pc2NzaV9hbGlhc1swXSwgJmZ3X2RkYl9lbnRyeS0+aXNjc2lfYWxpYXNbMF0sCisJICAgICAgIG1pbihzaXplb2YoZGRiX2VudHJ5LT5pc2NzaV9hbGlhcyksCisJCSAgIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX2FsaWFzKSkpOwogCW1lbWNweSgmZGRiX2VudHJ5LT5pcF9hZGRyWzBdLCAmZndfZGRiX2VudHJ5LT5pcF9hZGRyWzBdLAogCSAgICAgICBtaW4oc2l6ZW9mKGRkYl9lbnRyeS0+aXBfYWRkciksIHNpemVvZihmd19kZGJfZW50cnktPmlwX2FkZHIpKSk7CiAKQEAgLTU4MCwyMSArNjE4LDE5IEBACiAJCQltaW4oc2l6ZW9mKGRkYl9lbnRyeS0+bGlua19sb2NhbF9pcHY2X2FkZHIpLAogCQkJc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+bGlua19sb2NhbF9pcHY2X2FkZHIpKSk7CiAKLQkJREVCVUcyKGRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LCAiJXM6IEREQlslZF0gb3NJZHggPSAlZCAiCi0JCQkJCSJTdGF0ZSAlMDR4IENvbm5FcnIgJTA4eCBJUCAlcEk2ICIKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBEREJbJWRdIFN0YXRlICUwNHgiCisJCQkJCSIgQ29ubkVyciAlMDh4IElQICVwSTYgIgogCQkJCQkiOiUwNGQgXCIlc1wiXG4iLAogCQkJCQlfX2Z1bmNfXywgZndfZGRiX2luZGV4LAotCQkJCQlkZGJfZW50cnktPm9zX3RhcmdldF9pZCwKIAkJCQkJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLAogCQkJCQljb25uX2VyciwgZndfZGRiX2VudHJ5LT5pcF9hZGRyLAogCQkJCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPnBvcnQpLAogCQkJCQlmd19kZGJfZW50cnktPmlzY3NpX25hbWUpKTsKIAl9IGVsc2UKLQkJREVCVUcyKGRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LCAiJXM6IEREQlslZF0gb3NJZHggPSAlZCAiCi0JCQkJCSJTdGF0ZSAlMDR4IENvbm5FcnIgJTA4eCBJUCAlcEk0ICIKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBEREJbJWRdIFN0YXRlICUwNHgiCisJCQkJCSIgQ29ubkVyciAlMDh4IElQICVwSTQgIgogCQkJCQkiOiUwNGQgXCIlc1wiXG4iLAogCQkJCQlfX2Z1bmNfXywgZndfZGRiX2luZGV4LAotCQkJCQlkZGJfZW50cnktPm9zX3RhcmdldF9pZCwKIAkJCQkJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLAogCQkJCQljb25uX2VyciwgZndfZGRiX2VudHJ5LT5pcF9hZGRyLAogCQkJCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPnBvcnQpLApAQCAtNjA0LDYgKzY0MCw3IEBACiAJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCiAJCQkJICBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEpOwogCitleGl0X3VwZGF0ZV9kZGJfbm9fZnJlZToKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC02NjAsMTggKzY5NywxOCBAQAogCWVycl9jb2RlID0gKChjb25uX2VyciAmIDB4MDBmZjAwMDApID4+IDE2KTsKIAlsb2dpbl9yc3Bfc3RzX2NsYXNzID0gKChjb25uX2VyciAmIDB4MDAwMGZmMDApID4+IDgpOwogCWlmIChlcnJfY29kZSA9PSAweDFjIHx8IGVycl9jb2RlID09IDB4MDYpIHsKLQkJREVCVUcyKGRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LAotCQkJCSI6IGNvbm5fZXJyPTB4JTA4eCwgc2VuZCB0YXJnZXQgY29tcGxldGVkIgotCQkJCSIgb3IgYWNjZXNzIGRlbmllZCBmYWlsdXJlXG4iLCBjb25uX2VycikpOworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIjogY29ubl9lcnI9MHglMDh4LCBzZW5kIHRhcmdldCBjb21wbGV0ZWQiCisJCSAgICAiIG9yIGFjY2VzcyBkZW5pZWQgZmFpbHVyZVxuIiwgY29ubl9lcnIpKTsKIAkJcmVsb2dpbiA9IDA7CiAJfQogCWlmICgoZXJyX2NvZGUgPT0gMHgwOCkgJiYgKGxvZ2luX3JzcF9zdHNfY2xhc3MgPT0gMHgwMikpIHsKIAkJLyogTG9naW4gUmVzcG9uc2UgUERVIHJldHVybmVkIGFuIGVycm9yLgogCQkgICBMb2dpbiBSZXNwb25zZSBTdGF0dXMgaW4gRXJyb3IgQ29kZSBEZXRhaWwKIAkJICAgaW5kaWNhdGVzIGxvZ2luIHNob3VsZCBub3QgYmUgcmV0cmllZC4qLwotCQlERUJVRzIoZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsCi0JCQkJIjogY29ubl9lcnI9MHglMDh4LCBkbyBub3QgcmV0cnkgcmVsb2dpblxuIiwKLQkJCQljb25uX2VycikpOworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIjogY29ubl9lcnI9MHglMDh4LCBkbyBub3QgcmV0cnkgcmVsb2dpblxuIiwKKwkJICAgIGNvbm5fZXJyKSk7CiAJCXJlbG9naW4gPSAwOwogCX0KIApAQCAtNjg4LDcgKzcyNSw3IEBACiAgKiovCiBzdGF0aWMgaW50IHFsYTR4eHhfYnVpbGRfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwogCXVpbnQzMl90IGZ3X2RkYl9pbmRleCA9IDA7CiAJdWludDMyX3QgbmV4dF9md19kZGJfaW5kZXggPSAwOwogCXVpbnQzMl90IGRkYl9zdGF0ZTsKQEAgLTcwMiwxMiArNzM5LDEzIEBACiAJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCiAJCQkmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGZ3X2RkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCURFQlVHMihkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIiVzOiBETUEgYWxsb2MgZmFpbGVkXG4iLAorCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IERNQSBhbGxvYyBmYWlsZWRcbiIsCiAJCQkJX19mdW5jX18pKTsKLQkJcmV0dXJuIFFMQV9FUlJPUjsKKworCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Rfbm9fZnJlZTsKIAl9CiAKLQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIkluaXRpYWxpemluZyBEREJzIC4uLlxuIik7CisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSW5pdGlhbGl6aW5nIEREQnMgLi4uXG4iKTsKIAlmb3IgKGZ3X2RkYl9pbmRleCA9IDA7IGZ3X2RkYl9pbmRleCA8IE1BWF9EREJfRU5UUklFUzsKIAkgICAgIGZ3X2RkYl9pbmRleCA9IG5leHRfZndfZGRiX2luZGV4KSB7CiAJCS8qIEZpcnN0LCBsZXQncyBzZWUgaWYgYSBkZXZpY2UgZXhpc3RzIGhlcmUgKi8KQEAgLTcxOSw3ICs3NTcsNyBAQAogCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGdldF9kZGJfZW50cnksICIKIAkJCQkgICAgICAiZndfZGRiX2luZGV4ICVkIGZhaWxlZCIsIGhhLT5ob3N0X25vLAogCQkJCSAgICAgIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpKTsKLQkJCXJldHVybiBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Q7CiAJCX0KIAogCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogR2V0dGluZyBEREJbJWRdIGRkYnN0YXRlPTB4JXgsICIKQEAgLTc0OSw3ICs3ODcsNyBAQAogCQkJCQkJImdldF9kZGJfZW50cnkgJWQgZmFpbGVkXG4iLAogCQkJCQkJaGEtPmhvc3Rfbm8sCiAJCQkJCQlfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCQkJCXJldHVybiBRTEFfRVJST1I7CisJCQkJCWdvdG8gZXhpdF9idWlsZF9kZGJfbGlzdDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTc2OSw3ICs4MDcsNyBAQAogCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgogCQkJCSAgICAgICJmb3IgZGV2aWNlIGF0IGZ3X2RkYl9pbmRleCAlZFxuIiwKIAkJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCQkJcmV0dXJuIFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9idWlsZF9kZGJfbGlzdDsKIAkJfQogCQkvKiBGaWxsIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCiAJCWlmIChxbGE0eHh4X3VwZGF0ZV9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeSwgZndfZGRiX2luZGV4KSA9PQpAQCAtNzc3LDExICs4MTUsMTAgQEAKIAkJCWhhLT5md19kZGJfaW5kZXhfbWFwW2Z3X2RkYl9pbmRleF0gPQogCQkJCShzdHJ1Y3QgZGRiX2VudHJ5ICopSU5WQUxJRF9FTlRSWTsKIAotCiAJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogdXBkYXRlX2RkYl9lbnRyeSBmYWlsZWQgIgogCQkJCSAgICAgICJmb3IgZndfZGRiX2luZGV4ICVkLlxuIiwKIAkJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCQkJcmV0dXJuIFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9idWlsZF9kZGJfbGlzdDsKIAkJfQogCiBuZXh0X29uZToKQEAgLTc5MSw4ICs4MjgsMTQgQEAKIAkJCWJyZWFrOwogCX0KIAotCWRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LCAiRERCIGxpc3QgZG9uZS4uXG4iKTsKKwlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJEREIgbGlzdCBkb25lLi5cbiIpOwogCitleGl0X2J1aWxkX2RkYl9saXN0OgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksIGZ3X2RkYl9lbnRyeSwKKwkJZndfZGRiX2VudHJ5X2RtYSk7CisKK2V4aXRfYnVpbGRfZGRiX2xpc3Rfbm9fZnJlZToKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC05NTEsNiArOTk0LDkgQEAKIAogCXFsYTR4eHhfZmx1c2hfQUVOUyhoYSk7CiAKKwkvKiBXYWl0IGZvciBhbiBBRU4gKi8KKwlxbGE0eHh4X2RldmljZXNfcmVhZHkoaGEpOworCiAJLyoKIAkgKiBGaXJzdCBwZXJmb3JtIGRldmljZSBkaXNjb3ZlcnkgZm9yIGFjdGl2ZQogCSAqIGZ3IGRkYiBpbmRleGVzIGFuZCBidWlsZApAQCAtOTU5LDkgKzEwMDUsNiBAQAogCWlmICgoc3RhdHVzID0gcWxhNHh4eF9idWlsZF9kZGJfbGlzdChoYSkpID09IFFMQV9FUlJPUikKIAkJcmV0dXJuIHN0YXR1czsKIAotCS8qIFdhaXQgZm9yIGFuIEFFTiAqLwotCXFsYTR4eHhfZGV2aWNlc19yZWFkeShoYSk7Ci0KIAkvKgogCSAqIFRhcmdldHMgY2FuIGNvbWUgb25saW5lIGFmdGVyIHRoZSBpbml0YWwgZGlzY292ZXJ5LCBzbyBwcm9jZXNzaW5nCiAJICogdGhlIGFlbnMgaGVyZSB3aWxsIGNhdGNoIHRoZW0uCkBAIC05NzMsNyArMTAxNiw3IEBACiB9CiAKIC8qKgotICogcWxhNHh4eF91cGRhdGVfZGRiX2xpc3QgLSB1cGRhdGUgdGhlIGRyaXZlciBkZGIgbGlzdAorICogcWxhNHh4eF9yZWluaXRpYWxpemVfZGRiX2xpc3QgLSB1cGRhdGUgdGhlIGRyaXZlciBkZGIgbGlzdAogICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKgogICogVGhpcyByb3V0aW5lIG9idGFpbnMgZGV2aWNlIGluZm9ybWF0aW9uIGZyb20gdGhlIEYvVyBkYXRhYmFzZSBhZnRlcgpAQCAtOTkzLDYgKzEwMzYsNyBAQAogCQkJREVCVUcyKHByaW50ayAoInNjc2klbGQ6ICVzOiBkZGIgaW5kZXggWyVkXSBtYXJrZWQgIgogCQkJCSAgICAgICAiT05MSU5FXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCiAJCQkJICAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CisJCQlpc2NzaV91bmJsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKIAkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgPT0gRERCX1NUQVRFX09OTElORSkKIAkJCXFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhoYSwgZGRiX2VudHJ5KTsKIAl9CkBAIC0xMDE2LDcgKzEwNjAsNyBAQAogCQkJICAgICh1aW50MTZfdClSRUxPR0lOX1RPVik7CiAJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZWxvZ2luX3RpbWVyLCByZWxvZ2luX3RpbWVyKTsKIAotCURFQlVHMihwcmludGsoInNjc2klbGQ6IFJlbG9naW4gaW5kZXggWyVkXS4gVE9WPSVkXG4iLCBoYS0+aG9zdF9ubywKKwlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBSZWxvZ2luIGRkYiBbJWRdLiBUT1Y9JWRcbiIsIGhhLT5ob3N0X25vLAogCQkgICAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwgcmVsb2dpbl90aW1lcikpOwogCiAJcWxhNHh4eF9zZXRfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwgMCk7CkBAIC0xMDM5LDE3ICsxMDgzLDE3IEBACiAJfQogCiAJLyogR2V0IEVFUFJvbSBQYXJhbWV0ZXJzIGZyb20gTlZSQU0gYW5kIHZhbGlkYXRlICovCi0JZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJDb25maWd1cmluZyBOVlJBTSAuLi5cbiIpOworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyaW5nIE5WUkFNIC4uLlxuIik7CiAJaWYgKHFsYTR4eHhfaXNfbnZyYW1fY29uZmlndXJhdGlvbl92YWxpZChoYSkgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCWV4dEh3Q29uZmlnLkFzdWludDMyX3QgPQogCQkJcmRfbnZyYW1fd29yZChoYSwgZWVwcm9tX2V4dF9od19jb25mX29mZnNldChoYSkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCWRldl93YXJuKCZoYS0+cGRldi0+ZGV2LAotCQkJICAgInNjc2klbGQ6ICVzOiBFRVByb20gY2hlY2tzdW0gaW52YWxpZC4gICIKLQkJCSAgICJQbGVhc2UgdXBkYXRlIHlvdXIgRUVQUk9NXG4iLCBoYS0+aG9zdF9ubywKLQkJCSAgIF9fZnVuY19fKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgInNjc2klbGQ6ICVzOiBFRVByb20gY2hlY2tzdW0gaW52YWxpZC4gICIKKwkJICAgICJQbGVhc2UgdXBkYXRlIHlvdXIgRUVQUk9NXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIF9fZnVuY19fKTsKIAogCQkvKiBBdHRlbXB0IHRvIHNldCBkZWZhdWx0cyAqLwogCQlpZiAoaXNfcWxhNDAxMChoYSkpCkBAIC0xMDczLDEyICsxMTE3LDIxIEBACiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogfQogCi1zdGF0aWMgdm9pZCBxbGE0eDAwX3BjaV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorLyoqCisgKiBxbGE0Xzh4eHhfcGNpX2NvbmZpZygpIC0gU2V0dXAgSVNQODJ4eCBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqLwordm9pZCBxbGE0Xzh4eHhfcGNpX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcGNpX3NldF9tYXN0ZXIoaGEtPnBkZXYpOworfQorCit2b2lkIHFsYTR4eHhfcGNpX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJdWludDE2X3QgdzsKIAlpbnQgc3RhdHVzOwogCi0JZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJDb25maWd1cmluZyBQQ0kgc3BhY2UuLi5cbiIpOworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyaW5nIFBDSSBzcGFjZS4uLlxuIik7CiAKIAlwY2lfc2V0X21hc3RlcihoYS0+cGRldik7CiAJc3RhdHVzID0gcGNpX3NldF9td2koaGEtPnBkZXYpOwpAQCAtMTEwMCw3ICsxMTUzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQzMl90IG1ib3hfc3RhdHVzOwogCi0JZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJTdGFydGluZyBmaXJtd2FyZSAuLi5cbiIpOworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlN0YXJ0aW5nIGZpcm13YXJlIC4uLlxuIik7CiAKIAkvKgogCSAqIFN0YXJ0IGZpcm13YXJlIGZyb20gZmxhc2ggUk9NCkBAIC0xMjA0LDcgKzEyNTcsNyBAQAogICogVGhpcyByb3V0aW5lIHBlcmZvcm1zIHRoZSBuZWNlc3Nhcnkgc3RlcHMgdG8gc3RhcnQgdGhlIGZpcm13YXJlIGZvcgogICogdGhlIFFMQTQwMTAgYWRhcHRlci4KICAqKi8KLXN0YXRpYyBpbnQgcWxhNHh4eF9zdGFydF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCitpbnQgcWxhNHh4eF9zdGFydF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJdWludDMyX3QgbWJveF9zdGF0dXM7CkBAIC0xMjgzLDcgKzEzMzYsOCBAQAogCWlmIChzb2Z0X3Jlc2V0KSB7CiAJCURFQlVHKHByaW50aygic2NzaSVsZDogJXM6IElzc3VlIFNvZnQgUmVzZXRcbiIsIGhhLT5ob3N0X25vLAogCQkJICAgICBfX2Z1bmNfXykpOwotCQlzdGF0dXMgPSBxbGE0eHh4X3NvZnRfcmVzZXQoaGEpOworCQlzdGF0dXMgPSBxbGE0eHh4X3NvZnRfcmVzZXQoaGEpOwkvKiBOT1RFOiBhY3F1aXJlcyBkcnZyCisJCQkJCQkJICogbG9jayBhZ2FpbiwgYnV0IG9rICovCiAJCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSB7CiAJCQlERUJVRyhwcmludGsoInNjc2klZDogJXM6IFNvZnQgUmVzZXQgZmFpbGVkIVxuIiwKIAkJCQkgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwpAQCAtMTMwNCw3ICsxMzU4LDYgQEAKIAogCXFsNHh4eF91bmxvY2tfZHJ2cihoYSk7CiAJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUykgewotCQlxbGE0eHh4X2dldF9md192ZXJzaW9uKGhhKTsKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBRl9HRVRfQ1JBU0hfUkVDT1JELCAmaGEtPmZsYWdzKSkKIAkJCXFsYTR4eHhfZ2V0X2NyYXNoX3JlY29yZChoYSk7CiAJfSBlbHNlIHsKQEAgLTEzMzEsMTggKzEzODQsMjEgQEAKIAlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwogCWludDhfdCBpcF9hZGRyZXNzW0lQX0FERFJfTEVOXSA9IHswfSA7CiAKLQljbGVhcl9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKIAloYS0+ZWVwcm9tX2NtZF9kYXRhID0gMDsKIAotCXFsYTR4MDBfcGNpX2NvbmZpZyhoYSk7CisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQ29uZmlndXJpbmcgUENJIHNwYWNlLi4uXG4iKTsKKwloYS0+aXNwX29wcy0+cGNpX2NvbmZpZyhoYSk7CiAKLQlxbGE0eHh4X2Rpc2FibGVfaW50cnMoaGEpOworCWhhLT5pc3Bfb3BzLT5kaXNhYmxlX2ludHJzKGhhKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIEhvc3QgYWRhcHRlciByZXF1ZXN0L3Jlc3BvbnNlIHF1ZXVlcyBhbmQgZmlybXdhcmUgKi8KLQlpZiAocWxhNHh4eF9zdGFydF9maXJtd2FyZShoYSkgPT0gUUxBX0VSUk9SKQorCWlmIChoYS0+aXNwX29wcy0+c3RhcnRfZmlybXdhcmUoaGEpID09IFFMQV9FUlJPUikKIAkJZ290byBleGl0X2luaXRfaGJhOwogCi0JaWYgKHFsYTR4eHhfdmFsaWRhdGVfbWFjX2FkZHJlc3MoaGEpID09IFFMQV9FUlJPUikKKwlpZiAocWxhNHh4eF9nZXRfZndfdmVyc2lvbihoYSkgPT0gUUxBX0VSUk9SKQorCQlnb3RvIGV4aXRfaW5pdF9oYmE7CisKKwlpZiAoaGEtPmlzcF9vcHMtPmdldF9zeXNfaW5mbyhoYSkgPT0gUUxBX0VSUk9SKQogCQlnb3RvIGV4aXRfaW5pdF9oYmE7CiAKIAlpZiAocWxhNHh4eF9pbml0X2xvY2FsX2RhdGEoaGEpID09IFFMQV9FUlJPUikKQEAgLTEzOTUsNiArMTQ1MSw4IEBACiBleGl0X2luaXRfb25saW5lOgogCXNldF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKIGV4aXRfaW5pdF9oYmE6CisJREVCVUcyKHByaW50aygic2NzaSVsZDogaW5pdGlhbGl6ZSBhZGFwdGVyOiAlc1xuIiwgaGEtPmhvc3Rfbm8sCisJICAgIHN0YXR1cyA9PSBRTEFfRVJST1IgPyAiRkFJTEVEIiA6ICJTVUNDRURFRCIpKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNDg3LDcgKzE1NDUsMTAgQEAKIAkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLCBzdGF0ZSwgZndfZGRiX2luZGV4KSk7CiAJaWYgKG9sZF9md19kZGJfZGV2aWNlX3N0YXRlID09IHN0YXRlICYmCiAJICAgIHN0YXRlID09IEREQl9EU19TRVNTSU9OX0FDVElWRSkgewotCQkvKiBEbyBub3RoaW5nLCBzdGF0ZSBub3QgY2hhbmdlZC4gKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKSB7CisJCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfT05MSU5FKTsKKwkJCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOworCQl9CiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAl9CiAKQEAgLTE1MTEsNyArMTU3Miw3IEBACiAJfSBlbHNlIHsKIAkJLyogRGV2aWNlIHdlbnQgYXdheSwgbWFyayBkZXZpY2UgbWlzc2luZyAqLwogCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9PTkxJTkUpIHsKLQkJCURFQlVHMihkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIiVzIG1hcmsgbWlzc2luZyAiCisJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXMgbWFyayBtaXNzaW5nICIKIAkJCQkJImRkYl9lbnRyeSAweCVwIHNlc3MgMHglcCBjb25uIDB4JXBcbiIsCiAJCQkJCV9fZnVuY19fLCBkZGJfZW50cnksCiAJCQkJCWRkYl9lbnRyeS0+c2VzcywgZGRiX2VudHJ5LT5jb25uKSk7CkBAIC0xNTQzLDkgKzE2MDQsMjAgQEAKIAkJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl90aW1lciwgMCk7CiAJCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIsCiAJCQkJICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpOworCQkJREVCVUcocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiWyVkXSAiCisJCQkgICAgImluaXRpYXRlIHJlbG9naW4gYWZ0ZXIgJWQgc2Vjb25kc1xuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCisJCQkgICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpKTsKKwkJfSBlbHNlIHsKKwkJCURFQlVHKHByaW50aygic2NzaSVsZDogJXM6IGRkYlslZF0gIgorCQkJICAgICJyZWxvZ2luIG5vdCBpbml0aWF0ZWQsIHN0YXRlID0gJWQsICIKKwkJCSAgICAiZGRiX2VudHJ5LT5mbGFncyA9IDB4JWx4XG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwKKwkJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUsCisJCQkgICAgZGRiX2VudHJ5LT5mbGFncykpOwogCQl9CiAJfQotCiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5saW5lLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5saW5lLmgKaW5kZXggNjM3NWViMC4uOTQ3MWFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lubGluZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbmxpbmUuaApAQCAtMjksNyArMjksNyBAQAogCQlkZGJfZW50cnkgPSBoYS0+ZndfZGRiX2luZGV4X21hcFtmd19kZGJfaW5kZXhdOwogCX0KIAotCURFQlVHMyhwcmludGsoInNjc2klZDogJXM6IGluZGV4IFslZF0sIGRkYl9lbnRyeSA9ICVwXG4iLAorCURFQlVHMyhwcmludGsoInNjc2klZDogJXM6IGRkYiBbJWRdLCBkZGJfZW50cnkgPSAlcFxuIiwKIAkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmd19kZGJfaW5kZXgsIGRkYl9lbnRyeSkpOwogCiAJcmV0dXJuIGRkYl9lbnRyeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW9jYi5jCmluZGV4IGU2NmYzZjIuLmY4OTk3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lvY2IuYwpAQCAtMTA4LDggKzEwOCw3IEBACiAJd21iKCk7CiAKIAkvKiBUZWxsIElTUCBpdCdzIGdvdCBhIG5ldyBJL08gcmVxdWVzdCAqLwotCXdyaXRlbChoYS0+cmVxdWVzdF9pbiwgJmhhLT5yZWctPnJlcV9xX2luKTsKLQlyZWFkbCgmaGEtPnJlZy0+cmVxX3FfaW4pOworCWhhLT5pc3Bfb3BzLT5xdWV1ZV9pb2NiKGhhKTsKIAogZXhpdF9zZW5kX21hcmtlcjoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMTk0LDYgKzE5Myw3MiBAQAogfQogCiAvKioKKyAqIHFsYTRfOHh4eF9xdWV1ZV9pb2NiIC0gVGVsbCBJU1AgaXQncyBnb3QgbmV3IHJlcXVlc3QocykKKyAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgSVNQIHRoYXQgb25lIG9yIG1vcmUgbmV3IHJlcXVlc3QKKyAqIHF1ZXVlIGVudHJpZXMgaGF2ZSBiZWVuIHBsYWNlZCBvbiB0aGUgcmVxdWVzdCBxdWV1ZS4KKyAqKi8KK3ZvaWQgcWxhNF84eHh4X3F1ZXVlX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IGRidmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIHd0aW1lOworCisJZGJ2YWwgPSAweDE0IHwgKGhhLT5mdW5jX251bSA8PCA1KTsKKwlkYnZhbCA9IGRidmFsIHwgKDAgPDwgOCkgfCAoaGEtPnJlcXVlc3RfaW4gPDwgMTYpOworCXdyaXRlbChkYnZhbCwgKHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKWhhLT5ueF9kYl93cl9wdHIpOworCXdtYigpOworCisJd3RpbWUgPSBqaWZmaWVzICsgKDIgKiBIWik7CisJd2hpbGUgKHJlYWRsKCh2b2lkIF9faW9tZW0gKiloYS0+bnhfZGJfcmRfcHRyKSAhPSBkYnZhbCAmJgorCSAgICAhdGltZV9hZnRlcl9lcShqaWZmaWVzLCB3dGltZSkpIHsKKwkJd3JpdGVsKGRidmFsLCAodW5zaWduZWQgbG9uZyBfX2lvbWVtICopaGEtPm54X2RiX3dyX3B0cik7CisJCXdtYigpOworCX0KK30KKworLyoqCisgKiBxbGE0Xzh4eHhfY29tcGxldGVfaW9jYiAtIFRlbGwgSVNQIHdlJ3JlIGRvbmUgd2l0aCByZXNwb25zZShzKQorICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSBJU1AgdGhhdCBvbmUgb3IgbW9yZSByZXNwb25zZS9jb21wbGV0aW9uCisgKiBxdWV1ZSBlbnRyaWVzIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGRyaXZlci4KKyAqIFRoaXMgYWxzbyBjbGVhcnMgdGhlIGludGVycnVwdC4KKyAqKi8KK3ZvaWQgcWxhNF84eHh4X2NvbXBsZXRlX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXdyaXRlbChoYS0+cmVzcG9uc2Vfb3V0LCAmaGEtPnFsYTRfOHh4eF9yZWctPnJzcF9xX291dCk7CisJcmVhZGwoJmhhLT5xbGE0Xzh4eHhfcmVnLT5yc3BfcV9vdXQpOworfQorCisvKioKKyAqIHFsYTR4eHhfcXVldWVfaW9jYiAtIFRlbGwgSVNQIGl0J3MgZ290IG5ldyByZXF1ZXN0KHMpCisgKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbm90aWZpZXMgdGhlIElTUCB0aGF0IG9uZSBvciBtb3JlIG5ldyByZXF1ZXN0CisgKiBxdWV1ZSBlbnRyaWVzIGhhdmUgYmVlbiBwbGFjZWQgb24gdGhlIHJlcXVlc3QgcXVldWUuCisgKiovCit2b2lkIHFsYTR4eHhfcXVldWVfaW9jYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJd3JpdGVsKGhhLT5yZXF1ZXN0X2luLCAmaGEtPnJlZy0+cmVxX3FfaW4pOworCXJlYWRsKCZoYS0+cmVnLT5yZXFfcV9pbik7Cit9CisKKy8qKgorICogcWxhNHh4eF9jb21wbGV0ZV9pb2NiIC0gVGVsbCBJU1Agd2UncmUgZG9uZSB3aXRoIHJlc3BvbnNlKHMpCisgKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbm90aWZpZXMgdGhlIElTUCB0aGF0IG9uZSBvciBtb3JlIHJlc3BvbnNlL2NvbXBsZXRpb24KKyAqIHF1ZXVlIGVudHJpZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSB0aGUgZHJpdmVyLgorICogVGhpcyBhbHNvIGNsZWFycyB0aGUgaW50ZXJydXB0LgorICoqLwordm9pZCBxbGE0eHh4X2NvbXBsZXRlX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXdyaXRlbChoYS0+cmVzcG9uc2Vfb3V0LCAmaGEtPnJlZy0+cnNwX3Ffb3V0KTsKKwlyZWFkbCgmaGEtPnJlZy0+cnNwX3Ffb3V0KTsKK30KKworLyoqCiAgKiBxbGE0eHh4X3NlbmRfY29tbWFuZF90b19pc3AgLSBpc3N1ZXMgY29tbWFuZCB0byBIQkEKICAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICogQHNyYjogcG9pbnRlciB0byBTQ1NJIFJlcXVlc3QgQmxvY2sgdG8gYmUgc2VudCB0byBJU1AKQEAgLTMxMCw5ICszNzUsNyBAQAogCXNyYi0+aW9jYl9jbnQgPSByZXFfY250OwogCWhhLT5yZXFfcV9jb3VudCAtPSByZXFfY250OwogCi0JLyogRGVidWcgcHJpbnQgc3RhdGVtZW50cyAqLwotCXdyaXRlbChoYS0+cmVxdWVzdF9pbiwgJmhhLT5yZWctPnJlcV9xX2luKTsKLQlyZWFkbCgmaGEtPnJlZy0+cmVxX3FfaW4pOworCWhhLT5pc3Bfb3BzLT5xdWV1ZV9pb2NiKGhhKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIFFMQV9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCmluZGV4IDU5NmMzMDMuLmFhNjU2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKQEAgLTExOCwxMyArMTE4LDEyIEBACiAKIAlzcmIgPSBxbGE0eHh4X2RlbF9mcm9tX2FjdGl2ZV9hcnJheShoYSwgbGUzMl90b19jcHUoc3RzX2VudHJ5LT5oYW5kbGUpKTsKIAlpZiAoIXNyYikgewotCQkvKiBGSVhNRWRnOiBEb24ndCB3ZSBuZWVkIHRvIHJlc2V0IElTUCBpbiB0aGlzIGNhc2U/Pz8gKi8KIAkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klbGQ6ICVzOiBTdGF0dXMgRW50cnkgaW52YWxpZCAiCiAJCQkgICAgICAiaGFuZGxlIDB4JXgsIHNwPSVwLiBUaGlzIGNtZCBtYXkgaGF2ZSBhbHJlYWR5ICIKIAkJCSAgICAgICJiZWVuIGNvbXBsZXRlZC5cbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKIAkJCSAgICAgIGxlMzJfdG9fY3B1KHN0c19lbnRyeS0+aGFuZGxlKSwgc3JiKSk7Ci0JCWRldl93YXJuKCZoYS0+cGRldi0+ZGV2LCAiJXMgaW52YWxpZCBzdGF0dXMgZW50cnk6IgotCQkJIiBoYW5kbGU9MHglMHhcbiIsIF9fZnVuY19fLCBzdHNfZW50cnktPmhhbmRsZSk7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzIGludmFsaWQgc3RhdHVzIGVudHJ5OiIKKwkJICAgICIgaGFuZGxlPTB4JTB4XG4iLCBfX2Z1bmNfXywgc3RzX2VudHJ5LT5oYW5kbGUpOwogCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtMTM1LDggKzEzNCw4IEBACiAJCQkgICAgICAiT1MgcGt0LT5oYW5kbGU9JWQgc3JiPSVwIHNyYi0+c3RhdGU6JWRcbiIsCiAJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIHN0c19lbnRyeS0+aGFuZGxlLAogCQkJICAgICAgc3JiLCBzcmItPnN0YXRlKSk7Ci0JCWRldl93YXJuKCZoYS0+cGRldi0+ZGV2LCAiQ29tbWFuZCBpcyBOVUxMOiIKLQkJCSIgYWxyZWFkeSByZXR1cm5lZCB0byBPUyAoc3JiPSVwKVxuIiwgc3JiKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiQ29tbWFuZCBpcyBOVUxMOiIKKwkJICAgICIgYWxyZWFkeSByZXR1cm5lZCB0byBPUyAoc3JiPSVwKVxuIiwgc3JiKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjkzLDYgKzI5MiwxMCBAQAogCiAJY2FzZSBTQ1NfREVWSUNFX0xPR0dFRF9PVVQ6CiAJY2FzZSBTQ1NfREVWSUNFX1VOQVZBSUxBQkxFOgorCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAic2NzaSVsZDolZDolZDolZDogU0NTX0RFVklDRSAiCisJCSAgICAic3RhdGU6IDB4JXhcbiIsIGhhLT5ob3N0X25vLAorCQkgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgIGNtZC0+ZGV2aWNlLT5sdW4sIHN0c19lbnRyeS0+Y29tcGxldGlvblN0YXR1cykpOwogCQkvKgogCQkgKiBNYXJrIGRldmljZSBtaXNzaW5nIHNvIHRoYXQgd2Ugd29uJ3QgY29udGludWUgdG8KIAkJICogc2VuZCBJL08gdG8gdGhpcyBkZXZpY2UuICBXZSBzaG91bGQgZ2V0IGEgZGRiCkBAIC0zMzksMTYgKzM0MiwxNCBAQAogICogVGhpcyByb3V0aW5lIHByb2Nlc3MgcmVzcG9uc2UgcXVldWUgY29tcGxldGlvbnMgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAgKiBIYXJkd2FyZV9sb2NrIGxvY2tlZCB1cG9uIGVudHJ5CiAgKiovCi1zdGF0aWMgdm9pZCBxbGE0eHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSkKK3ZvaWQgcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAl1aW50MzJfdCBjb3VudCA9IDA7CiAJc3RydWN0IHNyYiAqc3JiID0gTlVMTDsKIAlzdHJ1Y3Qgc3RhdHVzX2VudHJ5ICpzdHNfZW50cnk7CiAKIAkvKiBQcm9jZXNzIGFsbCByZXNwb25zZXMgZnJvbSByZXNwb25zZSBxdWV1ZSAqLwotCXdoaWxlICgoaGEtPnJlc3BvbnNlX2luID0KLQkJKHVpbnQxNl90KWxlMzJfdG9fY3B1KGhhLT5zaGFkb3dfcmVncy0+cnNwX3FfaW4pKSAhPQotCSAgICAgICBoYS0+cmVzcG9uc2Vfb3V0KSB7CisJd2hpbGUgKChoYS0+cmVzcG9uc2VfcHRyLT5zaWduYXR1cmUgIT0gUkVTUE9OU0VfUFJPQ0VTU0VEKSkgewogCQlzdHNfZW50cnkgPSAoc3RydWN0IHN0YXR1c19lbnRyeSAqKSBoYS0+cmVzcG9uc2VfcHRyOwogCQljb3VudCsrOwogCkBAIC00MTMsMTQgKzQxNCwxNCBAQAogCQkJCSAgICAgIHN0c19lbnRyeS0+aGRyLmVudHJ5VHlwZSkpOwogCQkJZ290byBleGl0X3BycV9lcnJvcjsKIAkJfQorCQkoKHN0cnVjdCByZXNwb25zZSAqKXN0c19lbnRyeSktPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKKwkJd21iKCk7CiAJfQogCiAJLyoKLQkgKiBEb25lIHdpdGggcmVzcG9uc2VzLCB1cGRhdGUgdGhlIElTUCBGb3IgUUxBNDAxMCwgdGhpcyBhbHNvIGNsZWFycwotCSAqIHRoZSBpbnRlcnJ1cHQuCisJICogVGVsbCBJU1Agd2UncmUgZG9uZSB3aXRoIHJlc3BvbnNlKHMpLiBUaGlzIGFsc28gY2xlYXJzIHRoZSBpbnRlcnJ1cHQuCiAJICovCi0Jd3JpdGVsKGhhLT5yZXNwb25zZV9vdXQsICZoYS0+cmVnLT5yc3BfcV9vdXQpOwotCXJlYWRsKCZoYS0+cmVnLT5yc3BfcV9vdXQpOworCWhhLT5pc3Bfb3BzLT5jb21wbGV0ZV9pb2NiKGhhKTsKIAogCXJldHVybjsKIApAQCAtNDMwLDkgKzQzMSw3IEBACiAJCSAgICAgIHN0c19lbnRyeS0+Y29tcGxldGlvblN0YXR1cykpOwogCiBleGl0X3BycV9lcnJvcjoKLQl3cml0ZWwoaGEtPnJlc3BvbnNlX291dCwgJmhhLT5yZWctPnJzcF9xX291dCk7Ci0JcmVhZGwoJmhhLT5yZWctPnJzcF9xX291dCk7Ci0KKwloYS0+aXNwX29wcy0+Y29tcGxldGVfaW9jYihoYSk7CiAJc2V0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKIH0KIApAQCAtNDQ4LDcgKzQ0Nyw3IEBACiAJCQkJICAgICAgIHVpbnQzMl90IG1ib3hfc3RhdHVzKQogewogCWludCBpOwotCXVpbnQzMl90IG1ib3hfc3RhdDIsIG1ib3hfc3RhdDM7CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9BRU5fUkVHX0NPVU5UXTsKIAogCWlmICgobWJveF9zdGF0dXMgPT0gTUJPWF9TVFNfQlVTWSkgfHwKIAkgICAgKG1ib3hfc3RhdHVzID09IE1CT1hfU1RTX0lOVEVSTUVESUFURV9DT01QTEVUSU9OKSB8fApAQCAtNDYwLDI3ICs0NTksMzcgQEAKIAkJCSAqIENvcHkgYWxsIG1haWxib3ggcmVnaXN0ZXJzIHRvIGEgdGVtcG9yYXJ5CiAJCQkgKiBsb2NhdGlvbiBhbmQgc2V0IG1haWxib3ggY29tbWFuZCBkb25lIGZsYWcKIAkJCSAqLwotCQkJZm9yIChpID0gMTsgaSA8IGhhLT5tYm94X3N0YXR1c19jb3VudDsgaSsrKQotCQkJCWhhLT5tYm94X3N0YXR1c1tpXSA9Ci0JCQkJCXJlYWRsKCZoYS0+cmVnLT5tYWlsYm94W2ldKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBoYS0+bWJveF9zdGF0dXNfY291bnQ7IGkrKykKKwkJCQloYS0+bWJveF9zdGF0dXNbaV0gPSBpc19xbGE4MDIyKGhhKQorCQkJCSAgICA/IHJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+bWFpbGJveF9vdXRbaV0pCisJCQkJICAgIDogcmVhZGwoJmhhLT5yZWctPm1haWxib3hbaV0pOwogCiAJCQlzZXRfYml0KEFGX01CT1hfQ09NTUFORF9ET05FLCAmaGEtPmZsYWdzKTsKKworCQkJaWYgKHRlc3RfYml0KEFGX01CT1hfQ09NTUFORF9OT1BPTEwsICZoYS0+ZmxhZ3MpKQorCQkJCWNvbXBsZXRlKCZoYS0+bWJ4X2ludHJfY29tcCk7CiAJCX0KIAl9IGVsc2UgaWYgKG1ib3hfc3RhdHVzID4+IDEyID09IE1CT1hfQVNZTkNfRVZFTlRfU1RBVFVTKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQk9YX0FFTl9SRUdfQ09VTlQ7IGkrKykKKwkJCW1ib3hfc3RzW2ldID0gaXNfcWxhODAyMihoYSkKKwkJCSAgICA/IHJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+bWFpbGJveF9vdXRbaV0pCisJCQkgICAgOiByZWFkbCgmaGEtPnJlZy0+bWFpbGJveFtpXSk7CisKIAkJLyogSW1tZWRpYXRlbHkgcHJvY2VzcyB0aGUgQUVOcyB0aGF0IGRvbid0IHJlcXVpcmUgbXVjaCB3b3JrLgogCQkgKiBPbmx5IHF1ZXVlIHRoZSBkYXRhYmFzZV9jaGFuZ2VkIEFFTnMgKi8KIAkJaWYgKGhhLT5hZW5fbG9nLmNvdW50IDwgTUFYX0FFTl9FTlRSSUVTKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgTUJPWF9BRU5fUkVHX0NPVU5UOyBpKyspCiAJCQkJaGEtPmFlbl9sb2cuZW50cnlbaGEtPmFlbl9sb2cuY291bnRdLm1ib3hfc3RzW2ldID0KLQkJCQkJcmVhZGwoJmhhLT5yZWctPm1haWxib3hbaV0pOworCQkJCSAgICBtYm94X3N0c1tpXTsKIAkJCWhhLT5hZW5fbG9nLmNvdW50Kys7CiAJCX0KIAkJc3dpdGNoIChtYm94X3N0YXR1cykgewogCQljYXNlIE1CT1hfQVNUU19TWVNURU1fRVJST1I6CiAJCQkvKiBMb2cgTWFpbGJveCByZWdpc3RlcnMgKi8KKwkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBTeXN0ZW0gRXJyXG4iLCBfX2Z1bmNfXyk7CiAJCQlpZiAocWw0eGRvbnRyZXNldGhiYSkgewotCQkJCURFQlVHMihwcmludGsoIiVzOkRvbnQgUmVzZXQgSEJBXG4iLAotCQkJCQkgICAgICBfX2Z1bmNfXykpOworCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOkRvbid0IFJlc2V0IEhCQVxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CiAJCQl9IGVsc2UgewogCQkJCXNldF9iaXQoQUZfR0VUX0NSQVNIX1JFQ09SRCwgJmhhLT5mbGFncyk7CiAJCQkJc2V0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTUwMiwxOCArNTExLDE1IEBACiAJCQlpZiAodGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSkKIAkJCQlzZXRfYml0KERQQ19MSU5LX0NIQU5HRUQsICZoYS0+ZHBjX2ZsYWdzKTsKIAotCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8gInNjc2klbGQ6IEFFTiAlMDR4IEFkYXB0ZXIiCi0JCQkJCSIgTElOSyBVUFxuIiwgaGEtPmhvc3Rfbm8sCi0JCQkJCW1ib3hfc3RhdHVzKSk7CisJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogTElOSyBVUFxuIiwgX19mdW5jX18pOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNQk9YX0FTVFNfTElOS19ET1dOOgogCQkJY2xlYXJfYml0KEFGX0xJTktfVVAsICZoYS0+ZmxhZ3MpOwotCQkJc2V0X2JpdChEUENfTElOS19DSEFOR0VELCAmaGEtPmRwY19mbGFncyk7CisJCQlpZiAodGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSkKKwkJCQlzZXRfYml0KERQQ19MSU5LX0NIQU5HRUQsICZoYS0+ZHBjX2ZsYWdzKTsKIAotCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8gInNjc2klbGQ6IEFFTiAlMDR4IEFkYXB0ZXIiCi0JCQkJCSIgTElOSyBET1dOXG4iLCBoYS0+aG9zdF9ubywKLQkJCQkJbWJveF9zdGF0dXMpKTsKKwkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBMSU5LIERPV05cbiIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUJPWF9BU1RTX0hFQVJUQkVBVDoKQEAgLTUzOSwxMiArNTQ1LDE3IEBACiAJCQlicmVhazsKIAogCQljYXNlIE1CT1hfQVNUU19JUF9BRERSX1NUQVRFX0NIQU5HRUQ6Ci0JCQltYm94X3N0YXQyID0gcmVhZGwoJmhhLT5yZWctPm1haWxib3hbMl0pOwotCQkJbWJveF9zdGF0MyA9IHJlYWRsKCZoYS0+cmVnLT5tYWlsYm94WzNdKTsKKwkJCXByaW50aygic2NzaSVsZDogQUVOICUwNHgsIG1ib3hfc3RzWzJdPSUwNHgsICIKKwkJCSAgICAibWJveF9zdHNbM109JTA0eFxuIiwgaGEtPmhvc3Rfbm8sIG1ib3hfc3RzWzBdLAorCQkJICAgIG1ib3hfc3RzWzJdLCBtYm94X3N0c1szXSk7CiAKLQkJCWlmICgobWJveF9zdGF0MyA9PSA1KSAmJiAobWJveF9zdGF0MiA9PSAzKSkKKwkJCS8qIG1ib3hfc3RzWzJdID0gT2xkIEFDQiBzdGF0ZQorCQkJICogbWJveF9zdHNbM10gPSBuZXcgQUNCIHN0YXRlICovCisJCQlpZiAoKG1ib3hfc3RzWzNdID09IEFDQl9TVEFURV9WQUxJRCkgJiYKKwkJCSAgICAobWJveF9zdHNbMl0gPT0gQUNCX1NUQVRFX1RFTlRBVElWRSkpCiAJCQkJc2V0X2JpdChEUENfR0VUX0RIQ1BfSVBfQUREUiwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJZWxzZSBpZiAoKG1ib3hfc3RhdDMgPT0gMikgJiYgKG1ib3hfc3RhdDIgPT0gNSkpCisJCQllbHNlIGlmICgobWJveF9zdHNbM10gPT0gQUNCX1NUQVRFX0FDUVVJUklORykgJiYKKwkJCSAgICAobWJveF9zdHNbMl0gPT0gQUNCX1NUQVRFX1ZBTElEKSkKIAkJCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOwogCQkJYnJlYWs7CiAKQEAgLTU1Myw5ICs1NjQsOCBAQAogCQkJLyogTm8gYWN0aW9uICovCiAJCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAic2NzaSVsZDogQUVOICUwNHgsICIKIAkJCQkgICAgICAibWJveF9zdHNbMV09JTA0eCwgbWJveF9zdHNbMl09JTA0eFxuIiwKLQkJCQkgICAgICBoYS0+aG9zdF9ubywgbWJveF9zdGF0dXMsCi0JCQkJICAgICAgcmVhZGwoJmhhLT5yZWctPm1haWxib3hbMV0pLAotCQkJCSAgICAgIHJlYWRsKCZoYS0+cmVnLT5tYWlsYm94WzJdKSkpOworCQkJCSAgICAgIGhhLT5ob3N0X25vLCBtYm94X3N0c1swXSwKKwkJCQkgICAgICBtYm94X3N0c1sxXSwgbWJveF9zdHNbMl0pKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUJPWF9BU1RTX1NFTEZfVEVTVF9GQUlMRUQ6CkBAIC01NjMsMTAgKzU3Myw4IEBACiAJCQkvKiBObyBhY3Rpb24gKi8KIAkJCURFQlVHMihwcmludGsoInNjc2klbGQ6IEFFTiAlMDR4LCBtYm94X3N0c1sxXT0lMDR4LCAiCiAJCQkJICAgICAgIm1ib3hfc3RzWzJdPSUwNHgsIG1ib3hfc3RzWzNdPSUwNHhcbiIsCi0JCQkJICAgICAgaGEtPmhvc3Rfbm8sIG1ib3hfc3RhdHVzLAotCQkJCSAgICAgIHJlYWRsKCZoYS0+cmVnLT5tYWlsYm94WzFdKSwKLQkJCQkgICAgICByZWFkbCgmaGEtPnJlZy0+bWFpbGJveFsyXSksCi0JCQkJICAgICAgcmVhZGwoJmhhLT5yZWctPm1haWxib3hbM10pKSk7CisJCQkJICAgICAgaGEtPmhvc3Rfbm8sIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSwKKwkJCQkgICAgICBtYm94X3N0c1syXSwgbWJveF9zdHNbM10pKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUJPWF9BU1RTX0RBVEFCQVNFX0NIQU5HRUQ6CkBAIC01NzcsMjEgKzU4NSwxNyBAQAogCQkJCS8qIGRlY3JlbWVudCBhdmFpbGFibGUgY291bnRlciAqLwogCQkJCWhhLT5hZW5fcV9jb3VudC0tOwogCi0JCQkJZm9yIChpID0gMTsgaSA8IE1CT1hfQUVOX1JFR19DT1VOVDsgaSsrKQorCQkJCWZvciAoaSA9IDA7IGkgPCBNQk9YX0FFTl9SRUdfQ09VTlQ7IGkrKykKIAkJCQkJaGEtPmFlbl9xW2hhLT5hZW5faW5dLm1ib3hfc3RzW2ldID0KLQkJCQkJCXJlYWRsKCZoYS0+cmVnLT5tYWlsYm94W2ldKTsKLQotCQkJCWhhLT5hZW5fcVtoYS0+YWVuX2luXS5tYm94X3N0c1swXSA9IG1ib3hfc3RhdHVzOworCQkJCQkgICAgbWJveF9zdHNbaV07CiAKIAkJCQkvKiBwcmludCBkZWJ1ZyBtZXNzYWdlICovCiAJCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogQUVOWyVkXSAlMDR4IHF1ZXVlZCIKLQkJCQkJICAgICAgIiBtYjE6MHgleCBtYjI6MHgleCBtYjM6MHgleCBtYjQ6MHgleFxuIiwKLQkJCQkJICAgICAgaGEtPmhvc3Rfbm8sIGhhLT5hZW5faW4sCi0JCQkJCSAgICAgIG1ib3hfc3RhdHVzLAotCQkJCQkgICAgICBoYS0+YWVuX3FbaGEtPmFlbl9pbl0ubWJveF9zdHNbMV0sCi0JCQkJCSAgICAgIGhhLT5hZW5fcVtoYS0+YWVuX2luXS5tYm94X3N0c1syXSwKLQkJCQkJICAgICAgaGEtPmFlbl9xW2hhLT5hZW5faW5dLm1ib3hfc3RzWzNdLAotCQkJCQkgICAgICBoYS0+YWVuX3FbaGEtPmFlbl9pbl0uICBtYm94X3N0c1s0XSkpOworCQkJCSAgICAiIG1iMToweCV4IG1iMjoweCV4IG1iMzoweCV4IG1iNDoweCV4XG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgaGEtPmFlbl9pbiwgbWJveF9zdHNbMF0sCisJCQkJICAgIG1ib3hfc3RzWzFdLCBtYm94X3N0c1syXSwgIG1ib3hfc3RzWzNdLAorCQkJCSAgICBtYm94X3N0c1s0XSkpOworCiAJCQkJLyogYWR2YW5jZSBwb2ludGVyICovCiAJCQkJaGEtPmFlbl9pbisrOwogCQkJCWlmIChoYS0+YWVuX2luID09IE1BWF9BRU5fRU5UUklFUykKQEAgLTYwMywxOCArNjA3LDE2IEBACiAJCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGFlbiAlMDR4LCBxdWV1ZSAiCiAJCQkJCSAgICAgICJvdmVyZmxvd2VkISAgQUVOIExPU1QhIVxuIiwKIAkJCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJCQkgICAgICBtYm94X3N0YXR1cykpOworCQkJCQkgICAgICBtYm94X3N0c1swXSkpOwogCiAJCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogRFVNUCBBRU4gUVVFVUVcbiIsCiAJCQkJCSAgICAgIGhhLT5ob3N0X25vKSk7CiAKIAkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FFTl9FTlRSSUVTOyBpKyspIHsKIAkJCQkJREVCVUcyKHByaW50aygiQUVOWyVkXSAlMDR4ICUwNHggJTA0eCAiCi0JCQkJCQkgICAgICAiJTA0eFxuIiwgaSwKLQkJCQkJCSAgICAgIGhhLT5hZW5fcVtpXS5tYm94X3N0c1swXSwKLQkJCQkJCSAgICAgIGhhLT5hZW5fcVtpXS5tYm94X3N0c1sxXSwKLQkJCQkJCSAgICAgIGhhLT5hZW5fcVtpXS5tYm94X3N0c1syXSwKLQkJCQkJCSAgICAgIGhhLT5hZW5fcVtpXS5tYm94X3N0c1szXSkpOworCQkJCQkJICAgICAgIiUwNHhcbiIsIGksIG1ib3hfc3RzWzBdLAorCQkJCQkJICAgICAgbWJveF9zdHNbMV0sIG1ib3hfc3RzWzJdLAorCQkJCQkJICAgICAgbWJveF9zdHNbM10pKTsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKQEAgLTYyMiw3ICs2MjQsNyBAQAogCQlkZWZhdWx0OgogCQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkgICAgICAic2NzaSVsZDogQUVOICUwNHggVU5LTk9XTlxuIiwKLQkJCQkgICAgICBoYS0+aG9zdF9ubywgbWJveF9zdGF0dXMpKTsKKwkJCQkgICAgICBoYS0+aG9zdF9ubywgbWJveF9zdHNbMF0pKTsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKQEAgLTYzNCw2ICs2MzYsMzAgQEAKIH0KIAogLyoqCisgKiBxbGE0Xzh4eHhfaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSAtIGlzcgorICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICogaGFyZHdhcmVfbG9jayBsb2NrZWQgdXBvbiBlbnRyeS4gcnVucyBpbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqKi8KK3ZvaWQgcWxhNF84eHh4X2ludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorICAgIHVpbnQzMl90IGludHJfc3RhdHVzKQoreworCS8qIFByb2Nlc3MgcmVzcG9uc2UgcXVldWUgaW50ZXJydXB0LiAqLworCWlmIChpbnRyX3N0YXR1cyAmIEhTUlhfUklTQ19JT0NCX0lOVCkKKwkJcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKworCS8qIFByb2Nlc3MgbWFpbGJveC9hc3luY2ggZXZlbnQgaW50ZXJydXB0LiovCisJaWYgKGludHJfc3RhdHVzICYgSFNSWF9SSVNDX01CX0lOVCkKKwkJcWxhNHh4eF9pc3JfZGVjb2RlX21haWxib3goaGEsCisJCSAgICByZWFkbCgmaGEtPnFsYTRfOHh4eF9yZWctPm1haWxib3hfb3V0WzBdKSk7CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJd3JpdGVsKDAsICZoYS0+cWxhNF84eHh4X3JlZy0+aG9zdF9pbnQpOworCXJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+aG9zdF9pbnQpOworfQorCisvKioKICAqIHFsYTR4eHhfaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSAtIGlzcgogICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKgpAQCAtNjYwLDYgKzY4NiwyOCBAQAogfQogCiAvKioKKyAqIHFsYTRfOHh4eF9zcHVyaW91c19pbnRlcnJ1cHQgLSBwcm9jZXNzZXMgc3B1cmlvdXMgaW50ZXJydXB0CisgKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEByZXFzX2NvdW50OiAuCisgKgorICoqLworc3RhdGljIHZvaWQgcWxhNF84eHh4X3NwdXJpb3VzX2ludGVycnVwdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisgICAgdWludDhfdCByZXFzX2NvdW50KQoreworCWlmIChyZXFzX2NvdW50KQorCQlyZXR1cm47CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiU3B1cmlvdXMgSW50ZXJydXB0XG4iKSk7CisJaWYgKGlzX3FsYTgwMjIoaGEpKSB7CisJCXdyaXRlbCgwLCAmaGEtPnFsYTRfOHh4eF9yZWctPmhvc3RfaW50KTsKKwkJaWYgKHRlc3RfYml0KEFGX0lOVHhfRU5BQkxFRCwgJmhhLT5mbGFncykpCisJCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIGhhLT5ueF9sZWdhY3lfaW50ci50Z3RfbWFza19yZWcsCisJCQkgICAgMHhmYmZmKTsKKwl9CisJaGEtPnNwdXJpb3VzX2ludF9jb3VudCsrOworfQorCisvKioKICAqIHFsYTR4eHhfaW50cl9oYW5kbGVyIC0gaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuCiAgKiBAaXJxOiBVbnVzZWQKICAqIEBkZXZfaWQ6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQpAQCAtNjg5LDE1ICs3MzcsMTQgQEAKIAkJLyoKIAkJICogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzCiAJCSAqLwotCQlpZiAobGUzMl90b19jcHUoaGEtPnNoYWRvd19yZWdzLT5yc3BfcV9pbikgIT0KKwkJaWYgKGhhLT5pc3Bfb3BzLT5yZF9zaGR3X3JzcF9xX2luKGhhKSAhPQogCQkgICAgaGEtPnJlc3BvbnNlX291dCkKIAkJCWludHJfc3RhdHVzID0gQ1NSX1NDU0lfQ09NUExFVElPTl9JTlRSOwogCQllbHNlCiAJCQlpbnRyX3N0YXR1cyA9IHJlYWRsKCZoYS0+cmVnLT5jdHJsX3N0YXR1cyk7CiAKIAkJaWYgKChpbnRyX3N0YXR1cyAmCi0JCSAgICAgKENTUl9TQ1NJX1JFU0VUX0lOVFJ8Q1NSX0ZBVEFMX0VSUk9SfElOVFJfUEVORElORykpID09Ci0JCSAgICAwKSB7CisJCSAgICAoQ1NSX1NDU0lfUkVTRVRfSU5UUnxDU1JfRkFUQUxfRVJST1J8SU5UUl9QRU5ESU5HKSkgPT0gMCkgewogCQkJaWYgKHJlcXNfY291bnQgPT0gMCkKIAkJCQloYS0+c3B1cmlvdXNfaW50X2NvdW50Kys7CiAJCQlicmVhazsKQEAgLTczOSwxNyArNzg2LDE1IEBACiAJCQkgICAgICAgJmhhLT5yZWctPmN0cmxfc3RhdHVzKTsKIAkJCXJlYWRsKCZoYS0+cmVnLT5jdHJsX3N0YXR1cyk7CiAKLQkJCWlmICghcWw0X21vZF91bmxvYWQpCisJCQlpZiAoIXRlc3RfYml0KEFGX0hCQV9HT0lOR19BV0FZLCAmaGEtPmZsYWdzKSkKIAkJCQlzZXRfYml0KERQQ19SRVNFVF9IQV9JTlRSLCAmaGEtPmRwY19mbGFncyk7CiAKIAkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGludHJfc3RhdHVzICYgSU5UUl9QRU5ESU5HKSB7Ci0JCQlxbGE0eHh4X2ludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoaGEsIGludHJfc3RhdHVzKTsKKwkJCWhhLT5pc3Bfb3BzLT5pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lKGhhLCBpbnRyX3N0YXR1cyk7CiAJCQloYS0+dG90YWxfaW9fY291bnQrKzsKIAkJCWlmICgrK3JlcXNfY291bnQgPT0gTUFYX1JFUVNfU0VSVklDRURfUEVSX0lOVFIpCiAJCQkJYnJlYWs7Ci0KLQkJCWludHJfc3RhdHVzID0gMDsKIAkJfQogCX0KIApAQCAtNzU5LDYgKzgwNCwxNDUgQEAKIH0KIAogLyoqCisgKiBxbGE0Xzh4eHhfaW50cl9oYW5kbGVyIC0gaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuCisgKiBAaXJxOiBVbnVzZWQKKyAqIEBkZXZfaWQ6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorICoqLworaXJxcmV0dXJuX3QgcWxhNF84eHh4X2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGV2X2lkOworCXVpbnQzMl90IGludHJfc3RhdHVzOworCXVpbnQzMl90IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1aW50OF90IHJlcXNfY291bnQgPSAwOworCisJaGEtPmlzcl9jb3VudCsrOworCXN0YXR1cyA9IHFsYTRfOHh4eF9yZF8zMihoYSwgSVNSX0lOVF9WRUNUT1IpOworCWlmICghKHN0YXR1cyAmIGhhLT5ueF9sZWdhY3lfaW50ci5pbnRfdmVjX2JpdCkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXN0YXR1cyA9IHFsYTRfOHh4eF9yZF8zMihoYSwgSVNSX0lOVF9TVEFURV9SRUcpOworCWlmICghSVNSX0lTX0xFR0FDWV9JTlRSX1RSSUdHRVJFRChzdGF0dXMpKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiJXMgbGVnYWN5IEludCBub3QgdHJpZ2dlcmVkXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLworCXFsYTRfOHh4eF93cl8zMihoYSwgaGEtPm54X2xlZ2FjeV9pbnRyLnRndF9zdGF0dXNfcmVnLCAweGZmZmZmZmZmKTsKKworCS8qIHJlYWQgdHdpY2UgdG8gZW5zdXJlIHdyaXRlIGlzIGZsdXNoZWQgKi8KKwlxbGE0Xzh4eHhfcmRfMzIoaGEsIElTUl9JTlRfVkVDVE9SKTsKKwlxbGE0Xzh4eHhfcmRfMzIoaGEsIElTUl9JTlRfVkVDVE9SKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXdoaWxlICgxKSB7CisJCWlmICghKHJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+aG9zdF9pbnQpICYKKwkJICAgIElTUlhfODJYWF9SSVNDX0lOVCkpIHsKKwkJCXFsYTRfOHh4eF9zcHVyaW91c19pbnRlcnJ1cHQoaGEsIHJlcXNfY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJaW50cl9zdGF0dXMgPSAgcmVhZGwoJmhhLT5xbGE0Xzh4eHhfcmVnLT5ob3N0X3N0YXR1cyk7CisJCWlmICgoaW50cl9zdGF0dXMgJgorCQkgICAgKEhTUlhfUklTQ19NQl9JTlQgfCBIU1JYX1JJU0NfSU9DQl9JTlQpKSA9PSAwKSAgeworCQkJcWxhNF84eHh4X3NwdXJpb3VzX2ludGVycnVwdChoYSwgcmVxc19jb3VudCk7CisJCQlicmVhazsKKwkJfQorCisJCWhhLT5pc3Bfb3BzLT5pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lKGhhLCBpbnRyX3N0YXR1cyk7CisKKwkJLyogRW5hYmxlIEludGVycnVwdCAqLworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIGhhLT5ueF9sZWdhY3lfaW50ci50Z3RfbWFza19yZWcsIDB4ZmJmZik7CisKKwkJaWYgKCsrcmVxc19jb3VudCA9PSBNQVhfUkVRU19TRVJWSUNFRF9QRVJfSU5UUikKKwkJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpcnFyZXR1cm5fdAorcWxhNF84eHh4X21zaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSBkZXZfaWQ7CisJaWYgKCFoYSkgeworCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInFsYTR4eHg6IE1TSVg6IEludGVycnVwdCB3aXRoIE5VTEwgaG9zdCBwdHJcbiIpKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWhhLT5pc3JfY291bnQrKzsKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJcWxhNF84eHh4X3dyXzMyKGhhLCBoYS0+bnhfbGVnYWN5X2ludHIudGd0X3N0YXR1c19yZWcsIDB4ZmZmZmZmZmYpOworCisJLyogcmVhZCB0d2ljZSB0byBlbnN1cmUgd3JpdGUgaXMgZmx1c2hlZCAqLworCXFsYTRfOHh4eF9yZF8zMihoYSwgSVNSX0lOVF9WRUNUT1IpOworCXFsYTRfOHh4eF9yZF8zMihoYSwgSVNSX0lOVF9WRUNUT1IpOworCisJcmV0dXJuIHFsYTRfOHh4eF9kZWZhdWx0X2ludHJfaGFuZGxlcihpcnEsIGRldl9pZCk7Cit9CisKKy8qKgorICogcWxhNF84eHh4X2RlZmF1bHRfaW50cl9oYW5kbGVyIC0gaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuCisgKiBAaXJxOiBVbnVzZWQKKyAqIEBkZXZfaWQ6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaW50ZXJydXB0IGhhbmRsZXIgaXMgY2FsbGVkIGRpcmVjdGx5IGZvciBNU0ktWCwgYW5kCisgKiBjYWxsZWQgaW5kaXJlY3RseSBmb3IgTVNJLgorICoqLworaXJxcmV0dXJuX3QKK3FsYTRfOHh4eF9kZWZhdWx0X2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1aW50MzJfdCBpbnRyX3N0YXR1czsKKwl1aW50OF90IHJlcXNfY291bnQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCEocmVhZGwoJmhhLT5xbGE0Xzh4eHhfcmVnLT5ob3N0X2ludCkgJgorCQkgICAgSVNSWF84MlhYX1JJU0NfSU5UKSkgeworCQkJcWxhNF84eHh4X3NwdXJpb3VzX2ludGVycnVwdChoYSwgcmVxc19jb3VudCk7CisJCQlicmVhazsKKwkJfQorCisJCWludHJfc3RhdHVzID0gIHJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+aG9zdF9zdGF0dXMpOworCQlpZiAoKGludHJfc3RhdHVzICYKKwkJICAgIChIU1JYX1JJU0NfTUJfSU5UIHwgSFNSWF9SSVNDX0lPQ0JfSU5UKSkgPT0gMCkgeworCQkJcWxhNF84eHh4X3NwdXJpb3VzX2ludGVycnVwdChoYSwgcmVxc19jb3VudCk7CisJCQlicmVhazsKKwkJfQorCisJCWhhLT5pc3Bfb3BzLT5pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lKGhhLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKCsrcmVxc19jb3VudCA9PSBNQVhfUkVRU19TRVJWSUNFRF9QRVJfSU5UUikKKwkJCWJyZWFrOworCX0KKworCWhhLT5pc3JfY291bnQrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaXJxcmV0dXJuX3QKK3FsYTRfOHh4eF9tc2l4X3JzcF9xKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXFsYTR4eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CisJd3JpdGVsKDAsICZoYS0+cWxhNF84eHh4X3JlZy0+aG9zdF9pbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwloYS0+aXNyX2NvdW50Kys7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKICAqIHFsYTR4eHhfcHJvY2Vzc19hZW4gLSBwcm9jZXNzZXMgQUVOcyBnZW5lcmF0ZWQgYnkgZmlybXdhcmUKICAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICogQHByb2Nlc3NfYWVuOiB0eXBlIG9mIEFFTnMgdG8gcHJvY2VzcwpAQCAtODI1LDcgKzEwMDksNyBAQAogCQkJCQkoKGRkYl9lbnRyeS0+ZGVmYXVsdF90aW1lMndhaXQgKwogCQkJCQkgIDQpICogSFopOwogCi0JCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogZGRiIGluZGV4IFslZF0gaW5pdGF0ZSIKKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBkZGIgWyVkXSBpbml0YXRlIgogCQkJCQkgICAgICAiIFJFTE9HSU4gYWZ0ZXIgJWQgc2Vjb25kc1xuIiwKIAkJCQkJICAgICAgaGEtPmhvc3Rfbm8sCiAJCQkJCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LApAQCAtODQ3LDMgKzEwMzEsODEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogfQogCitpbnQgcWxhNHh4eF9yZXF1ZXN0X2lycXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCByZXQ7CisKKwlpZiAoIWlzX3FsYTgwMjIoaGEpKQorCQlnb3RvIHRyeV9pbnR4OworCisJaWYgKHFsNHhlbmFibGVtc2l4ID09IDIpCisJCWdvdG8gdHJ5X21zaTsKKworCWlmIChxbDR4ZW5hYmxlbXNpeCA9PSAwIHx8IHFsNHhlbmFibGVtc2l4ICE9IDEpCisJCWdvdG8gdHJ5X2ludHg7CisKKwkvKiBUcnlpbmcgTVNJLVggKi8KKwlyZXQgPSBxbGE0Xzh4eHhfZW5hYmxlX21zaXgoaGEpOworCWlmICghcmV0KSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiTVNJLVg6IEVuYWJsZWQgKDB4JVgpLlxuIiwgaGEtPnJldmlzaW9uX2lkKSk7CisJCWdvdG8gaXJxX2F0dGFjaGVkOworCX0KKworCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkgICAgIk1TSS1YOiBGYWxsaW5nIGJhY2stdG8gTVNJIG1vZGUgLS0gJWQuXG4iLCByZXQpOworCit0cnlfbXNpOgorCS8qIFRyeWluZyBNU0kgKi8KKwlyZXQgPSBwY2lfZW5hYmxlX21zaShoYS0+cGRldik7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaGEtPnBkZXYtPmlycSwgcWxhNF84eHh4X21zaV9oYW5kbGVyLAorCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgRFJJVkVSX05BTUUsIGhhKTsKKwkJaWYgKCFyZXQpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJNU0k6IEVuYWJsZWQuXG4iKSk7CisJCQlzZXRfYml0KEFGX01TSV9FTkFCTEVELCAmaGEtPmZsYWdzKTsKKwkJCWdvdG8gaXJxX2F0dGFjaGVkOworCQl9IGVsc2UgeworCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNU0k6IEZhaWxlZCB0byByZXNlcnZlIGludGVycnVwdCAlZCAiCisJCQkgICAgImFscmVhZHkgaW4gdXNlLlxuIiwgaGEtPnBkZXYtPmlycSk7CisJCQlwY2lfZGlzYWJsZV9tc2koaGEtPnBkZXYpOworCQl9CisJfQorCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkgICAgIk1TSTogRmFsbGluZyBiYWNrLXRvIElOVHggbW9kZSAtLSAlZC5cbiIsIHJldCk7CisKK3RyeV9pbnR4OgorCS8qIFRyeWluZyBJTlR4ICovCisJcmV0ID0gcmVxdWVzdF9pcnEoaGEtPnBkZXYtPmlycSwgaGEtPmlzcF9vcHMtPmludHJfaGFuZGxlciwKKwkgICAgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgRFJJVkVSX05BTUUsIGhhKTsKKwlpZiAoIXJldCkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSU5UeDogRW5hYmxlZC5cbiIpKTsKKwkJc2V0X2JpdChBRl9JTlR4X0VOQUJMRUQsICZoYS0+ZmxhZ3MpOworCQlnb3RvIGlycV9hdHRhY2hlZDsKKworCX0gZWxzZSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJJTlR4OiBGYWlsZWQgdG8gcmVzZXJ2ZSBpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiIKKwkJICAgICIgdXNlLlxuIiwgaGEtPnBkZXYtPmlycSk7CisJCXJldHVybiByZXQ7CisJfQorCitpcnFfYXR0YWNoZWQ6CisJc2V0X2JpdChBRl9JUlFfQVRUQUNIRUQsICZoYS0+ZmxhZ3MpOworCWhhLT5ob3N0LT5pcnEgPSBoYS0+cGRldi0+aXJxOworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBpcnEgJWQgYXR0YWNoZWRcbiIsCisJICAgIF9fZnVuY19fLCBoYS0+cGRldi0+aXJxKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHFsYTR4eHhfZnJlZV9pcnFzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpZiAodGVzdF9iaXQoQUZfTVNJWF9FTkFCTEVELCAmaGEtPmZsYWdzKSkKKwkJcWxhNF84eHh4X2Rpc2FibGVfbXNpeChoYSk7CisJZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFGX01TSV9FTkFCTEVELCAmaGEtPmZsYWdzKSkgeworCQlmcmVlX2lycShoYS0+cGRldi0+aXJxLCBoYSk7CisJCXBjaV9kaXNhYmxlX21zaShoYS0+cGRldik7CisJfSBlbHNlIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQUZfSU5UeF9FTkFCTEVELCAmaGEtPmZsYWdzKSkKKwkJZnJlZV9pcnEoaGEtPnBkZXYtPmlycSwgaGEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCmluZGV4IDc1NDk2ZmIuLjk0MGVlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKQEAgLTE5LDEzICsxOSwxMyBAQAogICogQG1ieF9jbWQ6IGRhdGEgcG9pbnRlciBmb3IgbWFpbGJveCBpbiByZWdpc3RlcnMuCiAgKiBAbWJ4X3N0czogZGF0YSBwb2ludGVyIGZvciBtYWlsYm94IG91dCByZWdpc3RlcnMuCiAgKgotICogVGhpcyByb3V0aW5lIHNzc3VlIG1haWxib3ggY29tbWFuZHMgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uLgorICogVGhpcyByb3V0aW5lIGlzc3N1ZSBtYWlsYm94IGNvbW1hbmRzIGFuZCB3YWl0cyBmb3IgY29tcGxldGlvbi4KICAqIElmIG91dENvdW50IGlzIDAsIHRoaXMgcm91dGluZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IFdJVEhPVVQgd2FpdGluZwogICogZm9yIHRoZSBtYWlsYm94IGNvbW1hbmQgdG8gY29tcGxldGUuCiAgKiovCi1zdGF0aWMgaW50IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCBpbkNvdW50LAotCQkJCSAgIHVpbnQ4X3Qgb3V0Q291bnQsIHVpbnQzMl90ICptYnhfY21kLAotCQkJCSAgIHVpbnQzMl90ICptYnhfc3RzKQoraW50IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCBpbkNvdW50LAorCQkJICAgIHVpbnQ4X3Qgb3V0Q291bnQsIHVpbnQzMl90ICptYnhfY21kLAorCQkJICAgIHVpbnQzMl90ICptYnhfc3RzKQogewogCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CiAJdWludDhfdCBpOwpAQCAtNTksMzIgKzU5LDY2IEBACiAJfQogCiAJLyogVG8gcHJldmVudCBvdmVyd3JpdGluZyBtYWlsYm94IHJlZ2lzdGVycyBmb3IgYSBjb21tYW5kIHRoYXQgaGFzCi0JICogbm90IHlldCBiZWVuIHNlcnZpY2VkLCBjaGVjayB0byBzZWUgaWYgYSBwcmV2aW91c2x5IGlzc3VlZAotCSAqIG1haWxib3ggY29tbWFuZCBpcyBpbnRlcnJ1cHRpbmcuCisJICogbm90IHlldCBiZWVuIHNlcnZpY2VkLCBjaGVjayB0byBzZWUgaWYgYW4gYWN0aXZlIGNvbW1hbmQKKwkgKiAoQUVOLCBJT0NCLCBldGMuKSBpcyBpbnRlcnJ1cHRpbmcsIHRoZW4gc2VydmljZSBpdC4KIAkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCWludHJfc3RhdHVzID0gcmVhZGwoJmhhLT5yZWctPmN0cmxfc3RhdHVzKTsKLQlpZiAoaW50cl9zdGF0dXMgJiBDU1JfU0NTSV9QUk9DRVNTT1JfSU5UUikgewotCQkvKiBTZXJ2aWNlIGV4aXN0aW5nIGludGVycnVwdCAqLwotCQlxbGE0eHh4X2ludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoaGEsIGludHJfc3RhdHVzKTsKLQkJY2xlYXJfYml0KEFGX01CT1hfQ09NTUFORF9ET05FLCAmaGEtPmZsYWdzKTsKKworCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQlpbnRyX3N0YXR1cyA9IHJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+aG9zdF9pbnQpOworCQlpZiAoaW50cl9zdGF0dXMgJiBJU1JYXzgyWFhfUklTQ19JTlQpIHsKKwkJCS8qIFNlcnZpY2UgZXhpc3RpbmcgaW50ZXJydXB0ICovCisJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogIgorCQkJICAgICJzZXJ2aWNpbmcgZXhpc3RpbmcgaW50ZXJydXB0XG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOworCQkJaW50cl9zdGF0dXMgPSByZWFkbCgmaGEtPnFsYTRfOHh4eF9yZWctPmhvc3Rfc3RhdHVzKTsKKwkJCWhhLT5pc3Bfb3BzLT5pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lKGhhLCBpbnRyX3N0YXR1cyk7CisJCQljbGVhcl9iaXQoQUZfTUJPWF9DT01NQU5EX0RPTkUsICZoYS0+ZmxhZ3MpOworCQkJaWYgKHRlc3RfYml0KEFGX0lOVEVSUlVQVFNfT04sICZoYS0+ZmxhZ3MpICYmCisJCQkgICAgdGVzdF9iaXQoQUZfSU5UeF9FTkFCTEVELCAmaGEtPmZsYWdzKSkKKwkJCQlxbGE0Xzh4eHhfd3JfMzIoaGEsCisJCQkJICAgIGhhLT5ueF9sZWdhY3lfaW50ci50Z3RfbWFza19yZWcsCisJCQkJICAgIDB4ZmJmZik7CisJCX0KKwl9IGVsc2UgeworCQlpbnRyX3N0YXR1cyA9IHJlYWRsKCZoYS0+cmVnLT5jdHJsX3N0YXR1cyk7CisJCWlmIChpbnRyX3N0YXR1cyAmIENTUl9TQ1NJX1BST0NFU1NPUl9JTlRSKSB7CisJCQkvKiBTZXJ2aWNlIGV4aXN0aW5nIGludGVycnVwdCAqLworCQkJaGEtPmlzcF9vcHMtPmludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoaGEsIGludHJfc3RhdHVzKTsKKwkJCWNsZWFyX2JpdChBRl9NQk9YX0NPTU1BTkRfRE9ORSwgJmhhLT5mbGFncyk7CisJCX0KIAl9CiAKLQkvKiBTZW5kIHRoZSBtYWlsYm94IGNvbW1hbmQgdG8gdGhlIGZpcm13YXJlICovCiAJaGEtPm1ib3hfc3RhdHVzX2NvdW50ID0gb3V0Q291bnQ7CiAJZm9yIChpID0gMDsgaSA8IG91dENvdW50OyBpKyspCiAJCWhhLT5tYm94X3N0YXR1c1tpXSA9IDA7CiAKLQkvKiBMb2FkIGFsbCBtYWlsYm94IHJlZ2lzdGVycywgZXhjZXB0IG1haWxib3ggMC4gKi8KLQlmb3IgKGkgPSAxOyBpIDwgaW5Db3VudDsgaSsrKQotCQl3cml0ZWwobWJ4X2NtZFtpXSwgJmhhLT5yZWctPm1haWxib3hbaV0pOworCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQkvKiBMb2FkIGFsbCBtYWlsYm94IHJlZ2lzdGVycywgZXhjZXB0IG1haWxib3ggMC4gKi8KKwkJREVCVUc1KAorCQkgICAgcHJpbnRrKCJzY3NpJWxkOiAlczogQ21kICIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgaW5Db3VudDsgaSsrKQorCQkJcHJpbnRrKCJtYiVkPSUwNHggIiwgaSwgbWJ4X2NtZFtpXSk7CisJCSAgICBwcmludGsoIlxuIikpOwogCi0JLyogV2FrZXVwIGZpcm13YXJlICAqLwotCXdyaXRlbChtYnhfY21kWzBdLCAmaGEtPnJlZy0+bWFpbGJveFswXSk7Ci0JcmVhZGwoJmhhLT5yZWctPm1haWxib3hbMF0pOwotCXdyaXRlbChzZXRfcm1hc2soQ1NSX0lOVFJfUklTQyksICZoYS0+cmVnLT5jdHJsX3N0YXR1cyk7Ci0JcmVhZGwoJmhhLT5yZWctPmN0cmxfc3RhdHVzKTsKKwkJZm9yIChpID0gMTsgaSA8IGluQ291bnQ7IGkrKykKKwkJCXdyaXRlbChtYnhfY21kW2ldLCAmaGEtPnFsYTRfOHh4eF9yZWctPm1haWxib3hfaW5baV0pOworCQl3cml0ZWwobWJ4X2NtZFswXSwgJmhhLT5xbGE0Xzh4eHhfcmVnLT5tYWlsYm94X2luWzBdKTsKKwkJcmVhZGwoJmhhLT5xbGE0Xzh4eHhfcmVnLT5tYWlsYm94X2luWzBdKTsKKwkJd3JpdGVsKEhJTlRfTUJYX0lOVF9QRU5ESU5HLCAmaGEtPnFsYTRfOHh4eF9yZWctPmhpbnQpOworCX0gZWxzZSB7CisJCS8qIExvYWQgYWxsIG1haWxib3ggcmVnaXN0ZXJzLCBleGNlcHQgbWFpbGJveCAwLiAqLworCQlmb3IgKGkgPSAxOyBpIDwgaW5Db3VudDsgaSsrKQorCQkJd3JpdGVsKG1ieF9jbWRbaV0sICZoYS0+cmVnLT5tYWlsYm94W2ldKTsKKworCQkvKiBXYWtldXAgZmlybXdhcmUgICovCisJCXdyaXRlbChtYnhfY21kWzBdLCAmaGEtPnJlZy0+bWFpbGJveFswXSk7CisJCXJlYWRsKCZoYS0+cmVnLT5tYWlsYm94WzBdKTsKKwkJd3JpdGVsKHNldF9ybWFzayhDU1JfSU5UUl9SSVNDKSwgJmhhLT5yZWctPmN0cmxfc3RhdHVzKTsKKwkJcmVhZGwoJmhhLT5yZWctPmN0cmxfc3RhdHVzKTsKKwl9CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLwpAQCAtOTgsMjYgKzEzMiw2NiBAQAogCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAkJZ290byBtYm94X2V4aXQ7CiAJfQotCS8qIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KLQl3YWl0X2NvdW50ID0gamlmZmllcyArIE1CT1hfVE9WICogSFo7Ci0Jd2hpbGUgKHRlc3RfYml0KEFGX01CT1hfQ09NTUFORF9ET05FLCAmaGEtPmZsYWdzKSA9PSAwKSB7Ci0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHdhaXRfY291bnQpKQotCQkJYnJlYWs7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JCWludHJfc3RhdHVzID0gcmVhZGwoJmhhLT5yZWctPmN0cmxfc3RhdHVzKTsKLQkJaWYgKGludHJfc3RhdHVzICYgSU5UUl9QRU5ESU5HKSB7CisJLyoKKwkgKiBXYWl0IGZvciBjb21wbGV0aW9uOiBQb2xsIG9yIGNvbXBsZXRpb24gcXVldWUKKwkgKi8KKwlpZiAodGVzdF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKSAmJgorCSAgICB0ZXN0X2JpdChBRl9JTlRFUlJVUFRTX09OLCAmaGEtPmZsYWdzKSAmJgorCSAgICB0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2JpdChBRl9IQkFfR09JTkdfQVdBWSwgJmhhLT5mbGFncykpIHsKKwkJLyogRG8gbm90IHBvbGwgZm9yIGNvbXBsZXRpb24uIFVzZSBjb21wbGV0aW9uIHF1ZXVlICovCisJCXNldF9iaXQoQUZfTUJPWF9DT01NQU5EX05PUE9MTCwgJmhhLT5mbGFncyk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaGEtPm1ieF9pbnRyX2NvbXAsIE1CT1hfVE9WICogSFopOworCQljbGVhcl9iaXQoQUZfTUJPWF9DT01NQU5EX05PUE9MTCwgJmhhLT5mbGFncyk7CisJfSBlbHNlIHsKKwkJLyogUG9sbCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCQl3YWl0X2NvdW50ID0gamlmZmllcyArIE1CT1hfVE9WICogSFo7CisJCXdoaWxlICh0ZXN0X2JpdChBRl9NQk9YX0NPTU1BTkRfRE9ORSwgJmhhLT5mbGFncykgPT0gMCkgeworCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgd2FpdF9jb3VudCkpCisJCQkJYnJlYWs7CiAJCQkvKgogCQkJICogU2VydmljZSB0aGUgaW50ZXJydXB0LgogCQkJICogVGhlIElTUiB3aWxsIHNhdmUgdGhlIG1haWxib3ggc3RhdHVzIHJlZ2lzdGVycwogCQkJICogdG8gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBsb2NhdGlvbiBpbiB0aGUgYWRhcHRlcgogCQkJICogc3RydWN0dXJlLgogCQkJICovCi0JCQloYS0+bWJveF9zdGF0dXNfY291bnQgPSBvdXRDb3VudDsKLQkJCXFsYTR4eHhfaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZShoYSwgaW50cl9zdGF0dXMpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQkJCWludHJfc3RhdHVzID0KKwkJCQkgICAgcmVhZGwoJmhhLT5xbGE0Xzh4eHhfcmVnLT5ob3N0X2ludCk7CisJCQkJaWYgKGludHJfc3RhdHVzICYgSVNSWF84MlhYX1JJU0NfSU5UKSB7CisJCQkJCWhhLT5tYm94X3N0YXR1c19jb3VudCA9IG91dENvdW50OworCQkJCQlpbnRyX3N0YXR1cyA9CisJCQkJCSByZWFkbCgmaGEtPnFsYTRfOHh4eF9yZWctPmhvc3Rfc3RhdHVzKTsKKwkJCQkJaGEtPmlzcF9vcHMtPmludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoCisJCQkJCSAgICBoYSwgaW50cl9zdGF0dXMpOworCQkJCQlpZiAodGVzdF9iaXQoQUZfSU5URVJSVVBUU19PTiwKKwkJCQkJICAgICZoYS0+ZmxhZ3MpICYmCisJCQkJCSAgICB0ZXN0X2JpdChBRl9JTlR4X0VOQUJMRUQsCisJCQkJCSAgICAmaGEtPmZsYWdzKSkKKwkJCQkJCXFsYTRfOHh4eF93cl8zMihoYSwKKwkJCQkJCWhhLT5ueF9sZWdhY3lfaW50ci50Z3RfbWFza19yZWcsCisJCQkJCQkweGZiZmYpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50cl9zdGF0dXMgPSByZWFkbCgmaGEtPnJlZy0+Y3RybF9zdGF0dXMpOworCQkJCWlmIChpbnRyX3N0YXR1cyAmIElOVFJfUEVORElORykgeworCQkJCQkvKgorCQkJCQkgKiBTZXJ2aWNlIHRoZSBpbnRlcnJ1cHQuCisJCQkJCSAqIFRoZSBJU1Igd2lsbCBzYXZlIHRoZSBtYWlsYm94IHN0YXR1cworCQkJCQkgKiByZWdpc3RlcnMgdG8gYSB0ZW1wb3Jhcnkgc3RvcmFnZQorCQkJCQkgKiBsb2NhdGlvbiBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuCisJCQkJCSAqLworCQkJCQloYS0+bWJveF9zdGF0dXNfY291bnQgPSBvdXRDb3VudDsKKwkJCQkJaGEtPmlzcF9vcHMtPmludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoCisJCQkJCSAgICBoYSwgaW50cl9zdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCQltc2xlZXAoMTApOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JCW1zbGVlcCgxMCk7CiAJfQogCiAJLyogQ2hlY2sgZm9yIG1haWxib3ggdGltZW91dC4gKi8KQEAgLTE3Miw3ICsyNDYsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXVpbnQ4X3QKK3N0YXRpYyB1aW50OF90CiBxbGE0eHh4X3NldF9pZmNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKm1ib3hfY21kLAogCQkgdWludDMyX3QgKm1ib3hfc3RzLCBkbWFfYWRkcl90IGluaXRfZndfY2JfZG1hKQogewpAQCAtMTk2LDcgKzI3MCw3IEBACiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogfQogCi11aW50OF90CitzdGF0aWMgdWludDhfdAogcWxhNHh4eF9nZXRfaWZjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICptYm94X2NtZCwKIAkJIHVpbnQzMl90ICptYm94X3N0cywgZG1hX2FkZHJfdCBpbml0X2Z3X2NiX2RtYSkKIHsKQEAgLTIxOCw3ICsyOTIsNyBAQAogCXJldHVybiBRTEFfU1VDQ0VTUzsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHFsYTR4eHhfdXBkYXRlX2xvY2FsX2lwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCSBzdHJ1Y3QgYWRkcl9jdHJsX2JsayAgKmluaXRfZndfY2IpCiB7CkBAIC0yNTYsNyArMzMwLDcgQEAKIAl9CiB9CiAKLXVpbnQ4X3QKK3N0YXRpYyB1aW50OF90CiBxbGE0eHh4X3VwZGF0ZV9sb2NhbF9pZmNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCSAgdWludDMyX3QgKm1ib3hfY21kLAogCQkJICB1aW50MzJfdCAqbWJveF9zdHMsCkBAIC0zMTcsNyArMzkxLDcgQEAKIAlpZiAoaW5pdF9md19jYiA9PSBOVUxMKSB7CiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBVbmFibGUgdG8gYWxsb2MgaW5pdF9jYlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gMTA7CisJCWdvdG8gZXhpdF9pbml0X2Z3X2NiX25vX2ZyZWU7CiAJfQogCW1lbXNldChpbml0X2Z3X2NiLCAwLCBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspKTsKIApAQCAtMzczLDcgKzQ0Nyw3IEBACiBleGl0X2luaXRfZndfY2I6CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2JsayksCiAJCQkJaW5pdF9md19jYiwgaW5pdF9md19jYl9kbWEpOwotCitleGl0X2luaXRfZndfY2Jfbm9fZnJlZToKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zOTQsNyArNDY4LDcgQEAKIAlpZiAoaW5pdF9md19jYiA9PSBOVUxMKSB7CiAJCXByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvYyBpbml0X2NiXG4iLCBoYS0+aG9zdF9ubywKIAkJICAgICAgIF9fZnVuY19fKTsKLQkJcmV0dXJuIDEwOworCQlyZXR1cm4gUUxBX0VSUk9SOwogCX0KIAogCS8qIEdldCBJbml0aWFsaXplIEZpcm13YXJlIENvbnRyb2wgQmxvY2suICovCkBAIC00NDUsNyArNTE5LDcgQEAKIAlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlcyBmaXJtd2FyZV9zdGF0ZT0weCV4XG4iLAogCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5maXJtd2FyZV9zdGF0ZSk7KQogCi0JCXJldHVybiBRTEFfU1VDQ0VTUzsKKwlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKIC8qKgpAQCAtNDcwLDYgKzU0NCwxMCBAQAogCQkJICAgICAgbWJveF9zdHNbMF0pKTsKIAkJcmV0dXJuIFFMQV9FUlJPUjsKIAl9CisKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlbGQgZmlybWFyZSBJT0NCcyBhdmFpbGFibGUgKCVkKS5cbiIsCisJICAgIGhhLT5ob3N0X25vLCBtYm94X2NtZFsyXSk7CisKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKQEAgLTUwMCw3ICs1NzgsNyBAQAogCiAJLyogTWFrZSBzdXJlIHRoZSBkZXZpY2UgaW5kZXggaXMgdmFsaWQgKi8KIAlpZiAoZndfZGRiX2luZGV4ID49IE1BWF9EREJfRU5UUklFUykgewotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogaW5kZXggWyVkXSBvdXQgb2YgcmFuZ2UuXG4iLAorCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiIFslZF0gb3V0IG9mIHJhbmdlLlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7CiAJCWdvdG8gZXhpdF9nZXRfZndkZGI7CiAJfQpAQCAtNTIxLDcgKzU5OSw3IEBACiAJCWdvdG8gZXhpdF9nZXRfZndkZGI7CiAJfQogCWlmIChmd19kZGJfaW5kZXggIT0gbWJveF9zdHNbMV0pIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGluZGV4IG1pc21hdGNoIFslZF0gIT0gWyVkXS5cbiIsCisJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBkZGIgbWlzbWF0Y2ggWyVkXSAhPSBbJWRdLlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4LAogCQkJICAgICAgbWJveF9zdHNbMV0pKTsKIAkJZ290byBleGl0X2dldF9md2RkYjsKQEAgLTUyOSw3ICs2MDcsNyBAQAogCWlmIChmd19kZGJfZW50cnkpIHsKIAkJb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+b3B0aW9ucyk7CiAJCWlmIChvcHRpb25zICYgRERCX09QVF9JUFY2X0RFVklDRSkgewotCQkJZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICIlczogRERCWyVkXSBNQjAgJTA0eCBUb3QgJWQgIgorCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IEREQlslZF0gTUIwICUwNHggVG90ICVkICIKIAkJCQkiTmV4dCAlZCBTdGF0ZSAlMDR4IENvbm5FcnIgJTA4eCAlcEk2ICIKIAkJCQkiOiUwNGQgXCIlc1wiXG4iLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4LAogCQkJCW1ib3hfc3RzWzBdLCBtYm94X3N0c1syXSwgbWJveF9zdHNbM10sCkBAIC01MzgsNyArNjE2LDcgQEAKIAkJCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPnBvcnQpLAogCQkJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZSk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIiVzOiBEREJbJWRdIE1CMCAlMDR4IFRvdCAlZCAiCisJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogRERCWyVkXSBNQjAgJTA0eCBUb3QgJWQgIgogCQkJCSJOZXh0ICVkIFN0YXRlICUwNHggQ29ubkVyciAlMDh4ICVwSTQgIgogCQkJCSI6JTA0ZCBcIiVzXCJcbiIsIF9fZnVuY19fLCBmd19kZGJfaW5kZXgsCiAJCQkJbWJveF9zdHNbMF0sIG1ib3hfc3RzWzJdLCBtYm94X3N0c1szXSwKQEAgLTU5MCw2ICs2NjgsNyBAQAogewogCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKIAl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJaW50IHN0YXR1czsKIAogCS8qIERvIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uLiBUaGUgZmlybXdhcmUgd2lsbCBzZW5kIHVzIGFuCiAJICogQVNUU19EQVRBQkFTRV9DSEFOR0VEICgweDgwMTQpIHRvIG5vdGlmeSB1cyBvZiB0aGUgbG9naW4gc3RhdHVzLgpAQCAtNjAzLDcgKzY4MiwxMiBAQAogCW1ib3hfY21kWzNdID0gTVNEVyhmd19kZGJfZW50cnlfZG1hKTsKIAltYm94X2NtZFs0XSA9IHNpemVvZihzdHJ1Y3QgZGV2X2RiX2VudHJ5KTsKIAotCXJldHVybiBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDEsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDUsICZtYm94X2NtZFswXSwKKwkgICAgJm1ib3hfc3RzWzBdKTsKKwlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogc3RhdHVzPSVkIG1ieDA9MHgleCBtYng0PTB4JXhcbiIsCisJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgc3RhdHVzLCBtYm94X3N0c1swXSwgbWJveF9zdHNbNF0pOykKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgpAQCAtODE3LDggKzkwMSw4IEBACiAvKioKICAqIHFsYTR4eHhfcmVzZXRfbHVuIC0gaXNzdWVzIExVTiBSZXNldAogICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCi0gKiBAZGJfZW50cnk6IFBvaW50ZXIgdG8gZGV2aWNlIGRhdGFiYXNlIGVudHJ5Ci0gKiBAdW5fZW50cnk6IFBvaW50ZXIgdG8gbHVuIGVudHJ5IHN0cnVjdHVyZQorICogQGRkYl9lbnRyeTogUG9pbnRlciB0byBkZXZpY2UgZGF0YWJhc2UgZW50cnkKKyAqIEBsdW46IGx1biBudW1iZXIKICAqCiAgKiBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYSBMVU4gUkVTRVQgb24gdGhlIHNwZWNpZmllZCB0YXJnZXQvbHVuLgogICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBkZGJfZW50cnkgYW5kIGx1bl9lbnRyeSBwb2ludGVycwpAQCAtODMyLDcgKzkxNiw3IEBACiAJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOwogCiAJREVCVUcyKHByaW50aygic2NzaSVsZDolZDolZDogbHVuIHJlc2V0IGlzc3VlZFxuIiwgaGEtPmhvc3Rfbm8sCi0JCSAgICAgIGRkYl9lbnRyeS0+b3NfdGFyZ2V0X2lkLCBsdW4pKTsKKwkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIGx1bikpOwogCiAJLyoKIAkgKiBTZW5kIGx1biByZXNldCBjb21tYW5kIHRvIElTUCwgc28gdGhhdCB0aGUgSVNQIHdpbGwgcmV0dXJuIGFsbApAQCAtODcyLDcgKzk1Niw3IEBACiAJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOwogCiAJREVCVUcyKHByaW50aygic2NzaSVsZDolZDogdGFyZ2V0IHJlc2V0IGlzc3VlZFxuIiwgaGEtPmhvc3Rfbm8sCi0JCSAgICAgIGRkYl9lbnRyeS0+b3NfdGFyZ2V0X2lkKSk7CisJCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CiAKIAkvKgogCSAqIFNlbmQgdGFyZ2V0IHJlc2V0IGNvbW1hbmQgdG8gSVNQLCBzbyB0aGF0IHRoZSBJU1Agd2lsbCByZXR1cm4gYWxsCkBAIC0xMDE5LDE2ICsxMTAzLDE2IEBACiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlci5cbiIsCiAJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKIAkJcmV0X3ZhbCA9IFFMQV9FUlJPUjsKLQkJZ290byBxbGE0eHh4X3NlbmRfdGd0c19leGl0OworCQlnb3RvIGV4aXRfc2VuZF90Z3RzX25vX2ZyZWU7CiAJfQogCiAJcmV0X3ZhbCA9IHFsYTR4eHhfZ2V0X2RlZmF1bHRfZGRiKGhhLCBmd19kZGJfZW50cnlfZG1hKTsKIAlpZiAocmV0X3ZhbCAhPSBRTEFfU1VDQ0VTUykKLQkJZ290byBxbGE0eHh4X3NlbmRfdGd0c19leGl0OworCQlnb3RvIGV4aXRfc2VuZF90Z3RzOwogCiAJcmV0X3ZhbCA9IHFsYTR4eHhfcmVxX2RkYl9lbnRyeShoYSwgJmRkYl9pbmRleCk7CiAJaWYgKHJldF92YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCWdvdG8gcWxhNHh4eF9zZW5kX3RndHNfZXhpdDsKKwkJZ290byBleGl0X3NlbmRfdGd0czsKIAogCW1lbXNldChmd19kZGJfZW50cnktPmlzY3NpX2FsaWFzLCAwLAogCSAgICAgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9hbGlhcykpOwpAQCAtMTA1MCw5ICsxMTM0LDEwIEBACiAKIAlyZXRfdmFsID0gcWxhNHh4eF9zZXRfZGRiX2VudHJ5KGhhLCBkZGJfaW5kZXgsIGZ3X2RkYl9lbnRyeV9kbWEpOwogCi1xbGE0eHh4X3NlbmRfdGd0c19leGl0OgorZXhpdF9zZW5kX3RndHM6CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKIAkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKK2V4aXRfc2VuZF90Z3RzX25vX2ZyZWU6CiAJcmV0dXJuIHJldF92YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9udnJhbS5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMKaW5kZXggN2ZlMDQ4Mi4uZjBkMGZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogLyogSGFyZHdhcmVfbG9jayBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyAqLwogdTE2IHJkX252cmFtX3dvcmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgaW50IG9mZnNldCkKIHsKLQl1MTYgdmFsOworCXUxNiB2YWwgPSAwOwogCiAJLyogTk9URTogTlZSQU0gdXNlcyBoYWxmLXdvcmQgYWRkcmVzc2VzICovCiAJZWVwcm9tX3JlYWR3b3JkKG9mZnNldCwgJnZhbCwgaGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uaAppbmRleCBiNDdiNGZjLi43YThmYzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uaApAQCAtOCw5ICs4LDkgQEAKICNpZm5kZWYgX1FMNFhOVlJNX0hfCiAjZGVmaW5lIF9RTDRYTlZSTV9IXwogCi0vKgorLyoqCiAgKiBBTTI5TFYgRmxhc2ggZGVmaW5pdGlvbnMKLSAqLworICoqLwogI2RlZmluZSBGTTkzQzU2QV9TSVpFXzgJIDB4MTAwCiAjZGVmaW5lIEZNOTNDNTZBX1NJWkVfMTYgMHg4MAogI2RlZmluZSBGTTkzQzY2QV9TSVpFXzgJIDB4MjAwCkBAIC0xOSw3ICsxOSw3IEBACiAKICNkZWZpbmUJIEZNOTNDNTZBX1NUQVJUCSAgICAgIDB4MQogCi0vLyBDb21tYW5kcworLyogQ29tbWFuZHMgKi8KICNkZWZpbmUJIEZNOTNDNTZBX1JFQUQJICAgICAgMHgyCiAjZGVmaW5lCSBGTTkzQzU2QV9XRU4JICAgICAgMHgwCiAjZGVmaW5lCSBGTTkzQzU2QV9XUklURQkgICAgICAweDEKQEAgLTYyLDkgKzYyLDkgQEAKICNkZWZpbmUJIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UJICAgIDB4MQogI2RlZmluZQkgQVVCVVJOX0VFUFJPTV9DTEtfRkFMTAkgICAgMHgwCiAKLS8qICovCisvKiovCiAvKiBFRVBST00gZm9ybWF0ICovCi0vKiAqLworLyoqLwogc3RydWN0IGJpb3NfcGFyYW1zIHsKIAl1aW50MTZfdCBTcGluVXBEZWxheToxOwogCXVpbnQxNl90IEJJT1NEaXNhYmxlOjE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTE5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwpAQCAtMCwwICsxLDIzMjEgQEAKKy8qCisgKiBRTG9naWMgaVNDU0kgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA5IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInFsNF9kZWYuaCIKKyNpbmNsdWRlICJxbDRfZ2xibC5oIgorCisjZGVmaW5lIE1BU0sobikJCURNQV9CSVRfTUFTSyhuKQorI2RlZmluZSBNTl9XSU4oYWRkcikJKCgoYWRkciAmIDB4MWZjMDAwMCkgPj4gMSkgfCAoKGFkZHIgPj4gMjUpICYgMHgzZmYpKQorI2RlZmluZSBPQ01fV0lOKGFkZHIpCSgoKGFkZHIgJiAweDFmZjAwMDApID4+IDEpIHwgKChhZGRyID4+IDI1KSAmIDB4M2ZmKSkKKyNkZWZpbmUgTVNfV0lOKGFkZHIpCShhZGRyICYgMHgwZmZjMDAwMCkKKyNkZWZpbmUgUUxBODJYWF9QQ0lfTU5fMk0JKDApCisjZGVmaW5lIFFMQTgyWFhfUENJX01TXzJNCSgweDgwMDAwKQorI2RlZmluZSBRTEE4MlhYX1BDSV9PQ00wXzJNCSgweGMwMDAwKQorI2RlZmluZSBWQUxJRF9PQ01fQUREUihhZGRyKQkoKChhZGRyKSAmIDB4M2Y4MDApICE9IDB4M2Y4MDApCisjZGVmaW5lIEdFVF9NRU1fT0ZGU18yTShhZGRyKQkoYWRkciAmIE1BU0soMTgpKQorCisvKiBDUkIgd2luZG93IHJlbGF0ZWQgKi8KKyNkZWZpbmUgQ1JCX0JMSyhvZmYpCSgob2ZmID4+IDIwKSAmIDB4M2YpCisjZGVmaW5lIENSQl9TVUJCTEsob2ZmKQkoKG9mZiA+PiAxNikgJiAweGYpCisjZGVmaW5lIENSQl9XSU5ET1dfMk0JKDB4MTMwMDYwKQorI2RlZmluZSBDUkJfSEkob2ZmKQkoKHFsYTRfOHh4eF9jcmJfaHViX2FndFtDUkJfQkxLKG9mZildIDw8IDIwKSB8IFwKKwkJCSgob2ZmKSAmIDB4ZjAwMDApKQorI2RlZmluZSBRTEE4MlhYX1BDSV9DQU1RTV8yTV9FTkQJKDB4MDQ4MDA4MDBVTCkKKyNkZWZpbmUgUUxBODJYWF9QQ0lfQ0FNUU1fMk1fQkFTRQkoMHgwMDBmZjgwMFVMKQorI2RlZmluZSBDUkJfSU5ESVJFQ1RfMk0JCQkoMHgxZTAwMDBVTCkKKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKgorcWxhNF84eHh4X3BjaV9iYXNlX29mZnNldGZzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoKG9mZiA8IGhhLT5maXJzdF9wYWdlX2dyb3VwX2VuZCkgJiYKKwkgICAgKG9mZiA+PSBoYS0+Zmlyc3RfcGFnZV9ncm91cF9zdGFydCkpCisJCXJldHVybiAodm9pZCBfX2lvbWVtICopKGhhLT5ueF9wY2liYXNlICsgb2ZmKTsKKworCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIE1BWF9DUkJfWEZPUk0gNjAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNyYl9hZGRyX3hmb3JtW01BWF9DUkJfWEZPUk1dOworc3RhdGljIGludCBxbGE0Xzh4eHhfY3JiX3RhYmxlX2luaXRpYWxpemVkOworCisjZGVmaW5lIHFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0obmFtZSkgXAorCShjcmJfYWRkcl94Zm9ybVtRTEE4MlhYX0hXX1BYX01BUF9DUkJfIyNuYW1lXSA9IFwKKwkgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfIyNuYW1lIDw8IDIwKQorc3RhdGljIHZvaWQKK3FsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm1fc2V0dXAodm9pZCkKK3sKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFhETUEpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oVElNUik7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShTUkUpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oU1FOMyk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShTUU4yKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFNRTjEpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oU1FOMCk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShTUVMzKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFNRUzIpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oU1FTMSk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShTUVMwKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg3KTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg2KTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg1KTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg0KTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVgzKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVgyKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVgxKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVgwKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFJPTVVTQik7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShTTik7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShRTU4pOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oUU1TKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFBHTkkpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oUEdORCk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShQR04zKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFBHTjIpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oUEdOMSk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShQR04wKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFBHU0kpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oUEdTRCk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShQR1MzKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFBHUzIpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oUEdTMSk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShQR1MwKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFBTKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKFBIKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKE5JVSk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShJMlEpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oRUcpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oTU4pOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oTVMpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oQ0FTMik7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShDQVMxKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKENBUzApOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oQ0FNKTsKKwlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtKEMyQzEpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oQzJDMCk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShTTUIpOworCXFsYTRfOHh4eF9jcmJfYWRkcl90cmFuc2Zvcm0oT0NNMCk7CisJcWxhNF84eHh4X2NyYl9hZGRyX3RyYW5zZm9ybShJMkMwKTsKKworCXFsYTRfOHh4eF9jcmJfdGFibGVfaW5pdGlhbGl6ZWQgPSAxOworfQorCitzdGF0aWMgc3RydWN0IGNyYl8xMjhNXzJNX2Jsb2NrX21hcCBjcmJfMTI4TV8yTV9tYXBbNjRdID0geworCXt7ezAsIDAsICAgICAgICAgMCwgICAgICAgICAwfSB9IH0sCQkvKiAwOiBQQ0kgKi8KKwl7e3sxLCAweDAxMDAwMDAsIDB4MDEwMjAwMCwgMHgxMjAwMDB9LAkvKiAxOiBQQ0lFICovCisJCXsxLCAweDAxMTAwMDAsIDB4MDEyMDAwMCwgMHgxMzAwMDB9LAorCQl7MSwgMHgwMTIwMDAwLCAweDAxMjIwMDAsIDB4MTI0MDAwfSwKKwkJezEsIDB4MDEzMDAwMCwgMHgwMTMyMDAwLCAweDEyNjAwMH0sCisJCXsxLCAweDAxNDAwMDAsIDB4MDE0MjAwMCwgMHgxMjgwMDB9LAorCQl7MSwgMHgwMTUwMDAwLCAweDAxNTIwMDAsIDB4MTJhMDAwfSwKKwkJezEsIDB4MDE2MDAwMCwgMHgwMTcwMDAwLCAweDExMDAwMH0sCisJCXsxLCAweDAxNzAwMDAsIDB4MDE3MjAwMCwgMHgxMmUwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MSwgMHgwMWUwMDAwLCAweDAxZTA4MDAsIDB4MTIyMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0gfSB9LAorCXt7ezEsIDB4MDIwMDAwMCwgMHgwMjEwMDAwLCAweDE4MDAwMH0gfSB9LC8qIDI6IE1OICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJICAgIC8qIDM6ICovCisJe3t7MSwgMHgwNDAwMDAwLCAweDA0MDEwMDAsIDB4MTY5MDAwfSB9IH0sLyogNDogUDJOUjEgKi8KKwl7e3sxLCAweDA1MDAwMDAsIDB4MDUxMDAwMCwgMHgxNDAwMDB9IH0gfSwvKiA1OiBTUkUgICAqLworCXt7ezEsIDB4MDYwMDAwMCwgMHgwNjEwMDAwLCAweDFjMDAwMH0gfSB9LC8qIDY6IE5JVSAgICovCisJe3t7MSwgMHgwNzAwMDAwLCAweDA3MDQwMDAsIDB4MWI4MDAwfSB9IH0sLyogNzogUU0gICAgKi8KKwl7e3sxLCAweDA4MDAwMDAsIDB4MDgwMjAwMCwgMHgxNzAwMDB9LCAgLyogODogU1FNMCAgKi8KKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MSwgMHgwOGYwMDAwLCAweDA4ZjIwMDAsIDB4MTcyMDAwfSB9IH0sCisJe3t7MSwgMHgwOTAwMDAwLCAweDA5MDIwMDAsIDB4MTc0MDAwfSwJLyogOTogU1FNMSovCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezEsIDB4MDlmMDAwMCwgMHgwOWYyMDAwLCAweDE3NjAwMH0gfSB9LAorCXt7ezAsIDB4MGEwMDAwMCwgMHgwYTAyMDAwLCAweDE3ODAwMH0sCS8qIDEwOiBTUU0yKi8KKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MSwgMHgwYWYwMDAwLCAweDBhZjIwMDAsIDB4MTdhMDAwfSB9IH0sCisJe3t7MCwgMHgwYjAwMDAwLCAweDBiMDIwMDAsIDB4MTdjMDAwfSwJLyogMTE6IFNRTTMqLworCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXsxLCAweDBiZjAwMDAsIDB4MGJmMjAwMCwgMHgxN2UwMDB9IH0gfSwKKwl7e3sxLCAweDBjMDAwMDAsIDB4MGMwNDAwMCwgMHgxZDQwMDB9IH0gfSwvKiAxMjogSTJRICovCisJe3t7MSwgMHgwZDAwMDAwLCAweDBkMDQwMDAsIDB4MWE0MDAwfSB9IH0sLyogMTM6IFRNUiAqLworCXt7ezEsIDB4MGUwMDAwMCwgMHgwZTA0MDAwLCAweDFhMDAwMH0gfSB9LC8qIDE0OiBST01VU0IgKi8KKwl7e3sxLCAweDBmMDAwMDAsIDB4MGYwMTAwMCwgMHgxNjQwMDB9IH0gfSwvKiAxNTogUEVHNCAqLworCXt7ezAsIDB4MTAwMDAwMCwgMHgxMDA0MDAwLCAweDFhODAwMH0gfSB9LC8qIDE2OiBYRE1BICovCisJe3t7MSwgMHgxMTAwMDAwLCAweDExMDEwMDAsIDB4MTYwMDAwfSB9IH0sLyogMTc6IFBFRzAgKi8KKwl7e3sxLCAweDEyMDAwMDAsIDB4MTIwMTAwMCwgMHgxNjEwMDB9IH0gfSwvKiAxODogUEVHMSAqLworCXt7ezEsIDB4MTMwMDAwMCwgMHgxMzAxMDAwLCAweDE2MjAwMH0gfSB9LC8qIDE5OiBQRUcyICovCisJe3t7MSwgMHgxNDAwMDAwLCAweDE0MDEwMDAsIDB4MTYzMDAwfSB9IH0sLyogMjA6IFBFRzMgKi8KKwl7e3sxLCAweDE1MDAwMDAsIDB4MTUwMTAwMCwgMHgxNjUwMDB9IH0gfSwvKiAyMTogUDJORCAqLworCXt7ezEsIDB4MTYwMDAwMCwgMHgxNjAxMDAwLCAweDE2NjAwMH0gfSB9LC8qIDIyOiBQMk5JICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJLyogMjM6ICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJLyogMjQ6ICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJLyogMjU6ICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJLyogMjY6ICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJLyogMjc6ICovCisJe3t7MCwgMCwgICAgICAgICAwLCAgICAgICAgIDB9IH0gfSwJLyogMjg6ICovCisJe3t7MSwgMHgxZDAwMDAwLCAweDFkMTAwMDAsIDB4MTkwMDAwfSB9IH0sLyogMjk6IE1TICovCisJe3t7MSwgMHgxZTAwMDAwLCAweDFlMDEwMDAsIDB4MTZhMDAwfSB9IH0sLyogMzA6IFAyTlIyICovCisJe3t7MSwgMHgxZjAwMDAwLCAweDFmMTAwMDAsIDB4MTUwMDAwfSB9IH0sLyogMzE6IEVQRyAqLworCXt7ezB9IH0gfSwJCQkJLyogMzI6IFBDSSAqLworCXt7ezEsIDB4MjEwMDAwMCwgMHgyMTAyMDAwLCAweDEyMDAwMH0sCS8qIDMzOiBQQ0lFICovCisJCXsxLCAweDIxMTAwMDAsIDB4MjEyMDAwMCwgMHgxMzAwMDB9LAorCQl7MSwgMHgyMTIwMDAwLCAweDIxMjIwMDAsIDB4MTI0MDAwfSwKKwkJezEsIDB4MjEzMDAwMCwgMHgyMTMyMDAwLCAweDEyNjAwMH0sCisJCXsxLCAweDIxNDAwMDAsIDB4MjE0MjAwMCwgMHgxMjgwMDB9LAorCQl7MSwgMHgyMTUwMDAwLCAweDIxNTIwMDAsIDB4MTJhMDAwfSwKKwkJezEsIDB4MjE2MDAwMCwgMHgyMTcwMDAwLCAweDExMDAwMH0sCisJCXsxLCAweDIxNzAwMDAsIDB4MjE3MjAwMCwgMHgxMmUwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0sCisJCXswLCAweDAwMDAwMDAsIDB4MDAwMDAwMCwgMHgwMDAwMDB9LAorCQl7MCwgMHgwMDAwMDAwLCAweDAwMDAwMDAsIDB4MDAwMDAwfSwKKwkJezAsIDB4MDAwMDAwMCwgMHgwMDAwMDAwLCAweDAwMDAwMH0gfSB9LAorCXt7ezEsIDB4MjIwMDAwMCwgMHgyMjA0MDAwLCAweDFiMDAwMH0gfSB9LC8qIDM0OiBDQU0gKi8KKwl7e3swfSB9IH0sCQkJCS8qIDM1OiAqLworCXt7ezB9IH0gfSwJCQkJLyogMzY6ICovCisJe3t7MH0gfSB9LAkJCQkvKiAzNzogKi8KKwl7e3swfSB9IH0sCQkJCS8qIDM4OiAqLworCXt7ezB9IH0gfSwJCQkJLyogMzk6ICovCisJe3t7MSwgMHgyODAwMDAwLCAweDI4MDQwMDAsIDB4MWE0MDAwfSB9IH0sLyogNDA6IFRNUiAqLworCXt7ezEsIDB4MjkwMDAwMCwgMHgyOTAxMDAwLCAweDE2YjAwMH0gfSB9LC8qIDQxOiBQMk5SMyAqLworCXt7ezEsIDB4MmEwMDAwMCwgMHgyYTAwNDAwLCAweDFhYzQwMH0gfSB9LC8qIDQyOiBSUE1YMSAqLworCXt7ezEsIDB4MmIwMDAwMCwgMHgyYjAwNDAwLCAweDFhYzgwMH0gfSB9LC8qIDQzOiBSUE1YMiAqLworCXt7ezEsIDB4MmMwMDAwMCwgMHgyYzAwNDAwLCAweDFhY2MwMH0gfSB9LC8qIDQ0OiBSUE1YMyAqLworCXt7ezEsIDB4MmQwMDAwMCwgMHgyZDAwNDAwLCAweDFhZDAwMH0gfSB9LC8qIDQ1OiBSUE1YNCAqLworCXt7ezEsIDB4MmUwMDAwMCwgMHgyZTAwNDAwLCAweDFhZDQwMH0gfSB9LC8qIDQ2OiBSUE1YNSAqLworCXt7ezEsIDB4MmYwMDAwMCwgMHgyZjAwNDAwLCAweDFhZDgwMH0gfSB9LC8qIDQ3OiBSUE1YNiAqLworCXt7ezEsIDB4MzAwMDAwMCwgMHgzMDAwNDAwLCAweDFhZGMwMH0gfSB9LC8qIDQ4OiBSUE1YNyAqLworCXt7ezAsIDB4MzEwMDAwMCwgMHgzMTA0MDAwLCAweDFhODAwMH0gfSB9LC8qIDQ5OiBYRE1BICovCisJe3t7MSwgMHgzMjAwMDAwLCAweDMyMDQwMDAsIDB4MWQ0MDAwfSB9IH0sLyogNTA6IEkyUSAqLworCXt7ezEsIDB4MzMwMDAwMCwgMHgzMzA0MDAwLCAweDFhMDAwMH0gfSB9LC8qIDUxOiBST01VU0IgKi8KKwl7e3swfSB9IH0sCQkJCS8qIDUyOiAqLworCXt7ezEsIDB4MzUwMDAwMCwgMHgzNTAwNDAwLCAweDFhYzAwMH0gfSB9LC8qIDUzOiBSUE1YMCAqLworCXt7ezEsIDB4MzYwMDAwMCwgMHgzNjAwNDAwLCAweDFhZTAwMH0gfSB9LC8qIDU0OiBSUE1YOCAqLworCXt7ezEsIDB4MzcwMDAwMCwgMHgzNzAwNDAwLCAweDFhZTQwMH0gfSB9LC8qIDU1OiBSUE1YOSAqLworCXt7ezEsIDB4MzgwMDAwMCwgMHgzODA0MDAwLCAweDFkMDAwMH0gfSB9LC8qIDU2OiBPQ00wICovCisJe3t7MSwgMHgzOTAwMDAwLCAweDM5MDQwMDAsIDB4MWI0MDAwfSB9IH0sLyogNTc6IENSWVBUTyAqLworCXt7ezEsIDB4M2EwMDAwMCwgMHgzYTA0MDAwLCAweDFkODAwMH0gfSB9LC8qIDU4OiBTTUIgKi8KKwl7e3swfSB9IH0sCQkJCS8qIDU5OiBJMkMwICovCisJe3t7MH0gfSB9LAkJCQkvKiA2MDogSTJDMSAqLworCXt7ezEsIDB4M2QwMDAwMCwgMHgzZDA0MDAwLCAweDFkYzAwMH0gfSB9LC8qIDYxOiBMUEMgKi8KKwl7e3sxLCAweDNlMDAwMDAsIDB4M2UwMTAwMCwgMHgxNjcwMDB9IH0gfSwvKiA2MjogUDJOQyAqLworCXt7ezEsIDB4M2YwMDAwMCwgMHgzZjAxMDAwLCAweDE2ODAwMH0gfSB9CS8qIDYzOiBQMk5SMCAqLworfTsKKworLyoKKyAqIHRvcCAxMiBiaXRzIG9mIGNyYiBpbnRlcm5hbCBhZGRyZXNzIChodWIsIGFnZW50KQorICovCitzdGF0aWMgdW5zaWduZWQgcWxhNF84eHh4X2NyYl9odWJfYWd0WzY0XSA9IHsKKwkwLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BTLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX01OLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX01TLAorCTAsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU1JFLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX05JVSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9RTU4sCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU1FOMCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9TUU4xLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1NRTjIsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU1FOMywKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9JMlEsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfVElNUiwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9ST01VU0IsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdONCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9YRE1BLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHTjAsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdOMSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR04yLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHTjMsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdORCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR05JLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHUzAsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdTMSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1MyLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHUzMsCisJMCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1NJLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1NOLAorCTAsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfRUcsCisJMCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QUywKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9DQU0sCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1RJTVIsCisJMCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMiwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMywKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNiwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNywKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9YRE1BLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX0kyUSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9ST01VU0IsCisJMCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YOCwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YOSwKKwlRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9PQ00wLAorCTAsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU01CLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX0kyQzAsCisJUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfSTJDMSwKKwkwLAorCVFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHTkMsCisJMCwKK307CisKKy8qIERldmljZSBzdGF0ZXMgKi8KK3N0YXRpYyBjaGFyICpxZGV2X3N0YXRlW10gPSB7CisJIlVua25vd24iLAorCSJDb2xkIiwKKwkiSW5pdGlhbGl6aW5nIiwKKwkiUmVhZHkiLAorCSJOZWVkIFJlc2V0IiwKKwkiTmVlZCBRdWllc2NlbnQiLAorCSJGYWlsZWQiLAorCSJRdWllc2NlbnQiLAorfTsKKworLyoKKyAqIEluOiAnb2ZmJyBpcyBvZmZzZXQgZnJvbSBDUkIgc3BhY2UgaW4gMTI4TSBwY2kgbWFwCisgKiBPdXQ6ICdvZmYnIGlzIDJNIHBjaSBtYXAgYWRkcgorICogc2lkZSBlZmZlY3Q6IGxvY2sgY3JiIHdpbmRvdworICovCitzdGF0aWMgdm9pZAorcWxhNF84eHh4X3BjaV9zZXRfY3Jid2luZG93XzJNKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWxvbmcgKm9mZikKK3sKKwl1MzIgd2luX3JlYWQ7CisKKwloYS0+Y3JiX3dpbiA9IENSQl9ISSgqb2ZmKTsKKwl3cml0ZWwoaGEtPmNyYl93aW4sCisJCSh2b2lkIF9faW9tZW0gKikoQ1JCX1dJTkRPV18yTSArIGhhLT5ueF9wY2liYXNlKSk7CisKKwkvKiBSZWFkIGJhY2sgdmFsdWUgdG8gbWFrZSBzdXJlIHdyaXRlIGhhcyBnb25lIHRocm91Z2ggYmVmb3JlIHRyeWluZworCSogdG8gdXNlIGl0LiAqLworCXdpbl9yZWFkID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKShDUkJfV0lORE9XXzJNICsgaGEtPm54X3BjaWJhc2UpKTsKKwlpZiAod2luX3JlYWQgIT0gaGEtPmNyYl93aW4pIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICIlczogV3JpdHRlbiBjcmJ3aW4gKDB4JXgpICE9IFJlYWQgY3Jid2luICgweCV4KSwiCisJCSAgICAiIG9mZj0weCVseFxuIiwgX19mdW5jX18sIGhhLT5jcmJfd2luLCB3aW5fcmVhZCwgKm9mZikpOworCX0KKwkqb2ZmID0gKCpvZmYgJiBNQVNLKDE2KSkgKyBDUkJfSU5ESVJFQ1RfMk0gKyBoYS0+bnhfcGNpYmFzZTsKK30KKwordm9pZAorcWxhNF84eHh4X3dyXzMyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWxvbmcgb2ZmLCB1MzIgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgcnY7CisKKwlydiA9IHFsYTRfOHh4eF9wY2lfZ2V0X2NyYl9hZGRyXzJNKGhhLCAmb2ZmKTsKKworCUJVR19PTihydiA9PSAtMSk7CisKKwlpZiAocnYgPT0gMSkgeworCQl3cml0ZV9sb2NrX2lycXNhdmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJCXFsYTRfOHh4eF9jcmJfd2luX2xvY2soaGEpOworCQlxbGE0Xzh4eHhfcGNpX3NldF9jcmJ3aW5kb3dfMk0oaGEsICZvZmYpOworCX0KKworCXdyaXRlbChkYXRhLCAodm9pZCBfX2lvbWVtICopb2ZmKTsKKworCWlmIChydiA9PSAxKSB7CisJCXFsYTRfOHh4eF9jcmJfd2luX3VubG9jayhoYSk7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOworCX0KK30KKworaW50CitxbGE0Xzh4eHhfcmRfMzIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1bG9uZyBvZmYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHJ2OworCXUzMiBkYXRhOworCisJcnYgPSBxbGE0Xzh4eHhfcGNpX2dldF9jcmJfYWRkcl8yTShoYSwgJm9mZik7CisKKwlCVUdfT04ocnYgPT0gLTEpOworCisJaWYgKHJ2ID09IDEpIHsKKwkJd3JpdGVfbG9ja19pcnFzYXZlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOworCQlxbGE0Xzh4eHhfY3JiX3dpbl9sb2NrKGhhKTsKKwkJcWxhNF84eHh4X3BjaV9zZXRfY3Jid2luZG93XzJNKGhhLCAmb2ZmKTsKKwl9CisJZGF0YSA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilvZmYpOworCisJaWYgKHJ2ID09IDEpIHsKKwkJcWxhNF84eHh4X2NyYl93aW5fdW5sb2NrKGhhKTsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBkYXRhOworfQorCisjZGVmaW5lIENSQl9XSU5fTE9DS19USU1FT1VUIDEwMDAwMDAwMAorCitpbnQgcWxhNF84eHh4X2NyYl93aW5fbG9jayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IGk7CisJaW50IGRvbmUgPSAwLCB0aW1lb3V0ID0gMDsKKworCXdoaWxlICghZG9uZSkgeworCQkvKiBhY3F1aXJlIHNlbWFwaG9yZTMgZnJvbSBQQ0kgSFcgYmxvY2sgKi8KKwkJZG9uZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9QQ0lFX1JFRyhQQ0lFX1NFTTdfTE9DSykpOworCQlpZiAoZG9uZSA9PSAxKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ID49IENSQl9XSU5fTE9DS19USU1FT1VUKQorCQkJcmV0dXJuIC0xOworCisJCXRpbWVvdXQrKzsKKworCQkvKiBZaWVsZCBDUFUgKi8KKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCQkJY3B1X3JlbGF4KCk7ICAgIC8qVGhpcyBhIG5vcCBpbnN0ciBvbiBpMzg2Ki8KKwkJfQorCX0KKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1dJTl9MT0NLX0lELCBoYS0+ZnVuY19udW0pOworCXJldHVybiAwOworfQorCit2b2lkIHFsYTRfOHh4eF9jcmJfd2luX3VubG9jayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX1BDSUVfUkVHKFBDSUVfU0VNN19VTkxPQ0spKTsKK30KKworI2RlZmluZSBJRENfTE9DS19USU1FT1VUIDEwMDAwMDAwMAorCisvKioKKyAqIHFsYTRfOHh4eF9pZGNfbG9jayAtIGh3X2xvY2sKKyAqIEBoYTogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIEdlbmVyYWwgcHVycG9zZSBsb2NrIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvCisgKiBDUkJfREVWX1NUQVRFLCBDUkJfREVWX1JFRl9DT1VOVCwgZXRjLgorICoqLworaW50IHFsYTRfOHh4eF9pZGNfbG9jayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IGk7CisJaW50IGRvbmUgPSAwLCB0aW1lb3V0ID0gMDsKKworCXdoaWxlICghZG9uZSkgeworCQkvKiBhY3F1aXJlIHNlbWFwaG9yZTUgZnJvbSBQQ0kgSFcgYmxvY2sgKi8KKwkJZG9uZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9QQ0lFX1JFRyhQQ0lFX1NFTTVfTE9DSykpOworCQlpZiAoZG9uZSA9PSAxKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ID49IElEQ19MT0NLX1RJTUVPVVQpCisJCQlyZXR1cm4gLTE7CisKKwkJdGltZW91dCsrOworCisJCS8qIFlpZWxkIENQVSAqLworCQlpZiAoIWluX2ludGVycnVwdCgpKQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJCQljcHVfcmVsYXgoKTsgICAgLypUaGlzIGEgbm9wIGluc3RyIG9uIGkzODYqLworCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIHFsYTRfOHh4eF9pZGNfdW5sb2NrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfUENJRV9SRUcoUENJRV9TRU01X1VOTE9DSykpOworfQorCitpbnQKK3FsYTRfOHh4eF9wY2lfZ2V0X2NyYl9hZGRyXzJNKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWxvbmcgKm9mZikKK3sKKwlzdHJ1Y3QgY3JiXzEyOE1fMk1fc3ViX2Jsb2NrX21hcCAqbTsKKworCWlmICgqb2ZmID49IFFMQTgyWFhfQ1JCX01BWCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCpvZmYgPj0gUUxBODJYWF9QQ0lfQ0FNUU0gJiYgKCpvZmYgPCBRTEE4MlhYX1BDSV9DQU1RTV8yTV9FTkQpKSB7CisJCSpvZmYgPSAoKm9mZiAtIFFMQTgyWFhfUENJX0NBTVFNKSArCisJCSAgICBRTEE4MlhYX1BDSV9DQU1RTV8yTV9CQVNFICsgaGEtPm54X3BjaWJhc2U7CisJCXJldHVybiAwOworCX0KKworCWlmICgqb2ZmIDwgUUxBODJYWF9QQ0lfQ1JCU1BBQ0UpCisJCXJldHVybiAtMTsKKworCSpvZmYgLT0gUUxBODJYWF9QQ0lfQ1JCU1BBQ0U7CisJLyoKKwkgKiBUcnkgZGlyZWN0IG1hcAorCSAqLworCisJbSA9ICZjcmJfMTI4TV8yTV9tYXBbQ1JCX0JMSygqb2ZmKV0uc3ViX2Jsb2NrW0NSQl9TVUJCTEsoKm9mZildOworCisJaWYgKG0tPnZhbGlkICYmIChtLT5zdGFydF8xMjhNIDw9ICpvZmYpICYmIChtLT5lbmRfMTI4TSA+ICpvZmYpKSB7CisJCSpvZmYgPSAqb2ZmICsgbS0+c3RhcnRfMk0gLSBtLT5zdGFydF8xMjhNICsgaGEtPm54X3BjaWJhc2U7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTm90IGluIGRpcmVjdCBtYXAsIHVzZSBjcmIgd2luZG93CisJICovCisJcmV0dXJuIDE7Cit9CisKKy8qICBQQ0kgV2luZG93aW5nIGZvciBERFIgcmVnaW9ucy4gICovCisjZGVmaW5lIFFMQTgyWFhfQUREUl9JTl9SQU5HRShhZGRyLCBsb3csIGhpZ2gpICAgICAgICAgICAgXAorCSgoKGFkZHIpIDw9IChoaWdoKSkgJiYgKChhZGRyKSA+PSAobG93KSkpCisKKy8qCisqIGNoZWNrIG1lbW9yeSBhY2Nlc3MgYm91bmRhcnkuCisqIHVzZWQgYnkgdGVzdCBhZ2VudC4gc3VwcG9ydCBkZHIgYWNjZXNzIG9ubHkgZm9yIG5vdworKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitxbGE0Xzh4eHhfcGNpX21lbV9ib3VuZF9jaGVjayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLCBpbnQgc2l6ZSkKK3sKKwlpZiAoIVFMQTgyWFhfQUREUl9JTl9SQU5HRShhZGRyLCBRTEE4MlhYX0FERFJfRERSX05FVCwKKwkgICAgUUxBODJYWF9BRERSX0REUl9ORVRfTUFYKSB8fAorCSAgICAhUUxBODJYWF9BRERSX0lOX1JBTkdFKGFkZHIgKyBzaXplIC0gMSwKKwkgICAgUUxBODJYWF9BRERSX0REUl9ORVQsIFFMQTgyWFhfQUREUl9ERFJfTkVUX01BWCkgfHwKKwkgICAgKChzaXplICE9IDEpICYmIChzaXplICE9IDIpICYmIChzaXplICE9IDQpICYmIChzaXplICE9IDgpKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcWxhNF84eHh4X3BjaV9zZXRfd2luZG93X3dhcm5pbmdfY291bnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitxbGE0Xzh4eHhfcGNpX3NldF93aW5kb3coc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1bnNpZ25lZCBsb25nIGxvbmcgYWRkcikKK3sKKwlpbnQgd2luZG93OworCXUzMiB3aW5fcmVhZDsKKworCWlmIChRTEE4MlhYX0FERFJfSU5fUkFOR0UoYWRkciwgUUxBODJYWF9BRERSX0REUl9ORVQsCisJICAgIFFMQTgyWFhfQUREUl9ERFJfTkVUX01BWCkpIHsKKwkJLyogRERSIG5ldHdvcmsgc2lkZSAqLworCQl3aW5kb3cgPSBNTl9XSU4oYWRkcik7CisJCWhhLT5kZHJfbW5fd2luZG93ID0gd2luZG93OworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIGhhLT5tbl93aW5fY3JiIHwKKwkJICAgIFFMQTgyWFhfUENJX0NSQlNQQUNFLCB3aW5kb3cpOworCQl3aW5fcmVhZCA9IHFsYTRfOHh4eF9yZF8zMihoYSwgaGEtPm1uX3dpbl9jcmIgfAorCQkgICAgUUxBODJYWF9QQ0lfQ1JCU1BBQ0UpOworCQlpZiAoKHdpbl9yZWFkIDw8IDE3KSAhPSB3aW5kb3cpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSIlczogV3JpdHRlbiBNTndpbiAoMHgleCkgIT0gUmVhZCBNTndpbiAoMHgleClcbiIsCisJCQlfX2Z1bmNfXywgd2luZG93LCB3aW5fcmVhZCk7CisJCX0KKwkJYWRkciA9IEdFVF9NRU1fT0ZGU18yTShhZGRyKSArIFFMQTgyWFhfUENJX0REUl9ORVQ7CisJfSBlbHNlIGlmIChRTEE4MlhYX0FERFJfSU5fUkFOR0UoYWRkciwgUUxBODJYWF9BRERSX09DTTAsCisJCQkJUUxBODJYWF9BRERSX09DTTBfTUFYKSkgeworCQl1bnNpZ25lZCBpbnQgdGVtcDE7CisJCS8qIGlmIGJpdHMgMTk6MTgmMTc6MTEgYXJlIG9uICovCisJCWlmICgoYWRkciAmIDB4MDBmZjgwMCkgPT0gMHhmZjgwMCkgeworCQkJcHJpbnRrKCIlczogUU0gYWNjZXNzIG5vdCBoYW5kbGVkLlxuIiwgX19mdW5jX18pOworCQkJYWRkciA9IC0xVUw7CisJCX0KKworCQl3aW5kb3cgPSBPQ01fV0lOKGFkZHIpOworCQloYS0+ZGRyX21uX3dpbmRvdyA9IHdpbmRvdzsKKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBoYS0+bW5fd2luX2NyYiB8CisJCSAgICBRTEE4MlhYX1BDSV9DUkJTUEFDRSwgd2luZG93KTsKKwkJd2luX3JlYWQgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIGhhLT5tbl93aW5fY3JiIHwKKwkJICAgIFFMQTgyWFhfUENJX0NSQlNQQUNFKTsKKwkJdGVtcDEgPSAoKHdpbmRvdyAmIDB4MUZGKSA8PCA3KSB8CisJCSAgICAoKHdpbmRvdyAmIDB4MEZGRkUwMDAwKSA+PiAxNyk7CisJCWlmICh3aW5fcmVhZCAhPSB0ZW1wMSkgeworCQkJcHJpbnRrKCIlczogV3JpdHRlbiBPQ013aW4gKDB4JXgpICE9IFJlYWQiCisJCQkgICAgIiBPQ013aW4gKDB4JXgpXG4iLCBfX2Z1bmNfXywgdGVtcDEsIHdpbl9yZWFkKTsKKwkJfQorCQlhZGRyID0gR0VUX01FTV9PRkZTXzJNKGFkZHIpICsgUUxBODJYWF9QQ0lfT0NNMF8yTTsKKworCX0gZWxzZSBpZiAoUUxBODJYWF9BRERSX0lOX1JBTkdFKGFkZHIsIFFMQTgyWFhfQUREUl9RRFJfTkVULAorCQkJCVFMQTgyWFhfUDNfQUREUl9RRFJfTkVUX01BWCkpIHsKKwkJLyogUURSIG5ldHdvcmsgc2lkZSAqLworCQl3aW5kb3cgPSBNU19XSU4oYWRkcik7CisJCWhhLT5xZHJfc25fd2luZG93ID0gd2luZG93OworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIGhhLT5tc193aW5fY3JiIHwKKwkJICAgIFFMQTgyWFhfUENJX0NSQlNQQUNFLCB3aW5kb3cpOworCQl3aW5fcmVhZCA9IHFsYTRfOHh4eF9yZF8zMihoYSwKKwkJICAgICBoYS0+bXNfd2luX2NyYiB8IFFMQTgyWFhfUENJX0NSQlNQQUNFKTsKKwkJaWYgKHdpbl9yZWFkICE9IHdpbmRvdykgeworCQkJcHJpbnRrKCIlczogV3JpdHRlbiBNU3dpbiAoMHgleCkgIT0gUmVhZCAiCisJCQkgICAgIk1Td2luICgweCV4KVxuIiwgX19mdW5jX18sIHdpbmRvdywgd2luX3JlYWQpOworCQl9CisJCWFkZHIgPSBHRVRfTUVNX09GRlNfMk0oYWRkcikgKyBRTEE4MlhYX1BDSV9RRFJfTkVUOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICogcGVnIGdkYiBmcmVxdWVudGx5IGFjY2Vzc2VzIG1lbW9yeSB0aGF0IGRvZXNuJ3QgZXhpc3QsCisJCSAqIHRoaXMgbGltaXRzIHRoZSBjaGl0IGNoYXQgc28gZGVidWdnaW5nIGlzbid0IHNsb3dlZCBkb3duLgorCQkgKi8KKwkJaWYgKChxbGE0Xzh4eHhfcGNpX3NldF93aW5kb3dfd2FybmluZ19jb3VudCsrIDwgOCkgfHwKKwkJICAgIChxbGE0Xzh4eHhfcGNpX3NldF93aW5kb3dfd2FybmluZ19jb3VudCU2NCA9PSAwKSkgeworCQkJcHJpbnRrKCIlczogV2FybmluZzolcyBVbmtub3duIGFkZHJlc3MgcmFuZ2UhXG4iLAorCQkJICAgIF9fZnVuY19fLCBEUklWRVJfTkFNRSk7CisJCX0KKwkJYWRkciA9IC0xVUw7CisJfQorCXJldHVybiBhZGRyOworfQorCisvKiBjaGVjayBpZiBhZGRyZXNzIGlzIGluIHRoZSBzYW1lIHdpbmRvd3MgYXMgdGhlIHByZXZpb3VzIGFjY2VzcyAqLworc3RhdGljIGludCBxbGE0Xzh4eHhfcGNpX2lzX3NhbWVfd2luZG93KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJdW5zaWduZWQgbG9uZyBsb25nIGFkZHIpCit7CisJaW50IHdpbmRvdzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcWRyX21heDsKKworCXFkcl9tYXggPSBRTEE4MlhYX1AzX0FERFJfUURSX05FVF9NQVg7CisKKwlpZiAoUUxBODJYWF9BRERSX0lOX1JBTkdFKGFkZHIsIFFMQTgyWFhfQUREUl9ERFJfTkVULAorCSAgICBRTEE4MlhYX0FERFJfRERSX05FVF9NQVgpKSB7CisJCS8qIEREUiBuZXR3b3JrIHNpZGUgKi8KKwkJQlVHKCk7CS8qIE1OIGFjY2VzcyBjYW4gbm90IGNvbWUgaGVyZSAqLworCX0gZWxzZSBpZiAoUUxBODJYWF9BRERSX0lOX1JBTkdFKGFkZHIsIFFMQTgyWFhfQUREUl9PQ00wLAorCSAgICAgUUxBODJYWF9BRERSX09DTTBfTUFYKSkgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKFFMQTgyWFhfQUREUl9JTl9SQU5HRShhZGRyLCBRTEE4MlhYX0FERFJfT0NNMSwKKwkgICAgIFFMQTgyWFhfQUREUl9PQ00xX01BWCkpIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChRTEE4MlhYX0FERFJfSU5fUkFOR0UoYWRkciwgUUxBODJYWF9BRERSX1FEUl9ORVQsCisJICAgIHFkcl9tYXgpKSB7CisJCS8qIFFEUiBuZXR3b3JrIHNpZGUgKi8KKwkJd2luZG93ID0gKChhZGRyIC0gUUxBODJYWF9BRERSX1FEUl9ORVQpID4+IDIyKSAmIDB4M2Y7CisJCWlmIChoYS0+cWRyX3NuX3dpbmRvdyA9PSB3aW5kb3cpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbGE0Xzh4eHhfcGNpX21lbV9yZWFkX2RpcmVjdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCXU2NCBvZmYsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICphZGRyOworCWludCByZXQgPSAwOworCXU2NCBzdGFydDsKKwl2b2lkIF9faW9tZW0gKm1lbV9wdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWVtX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtZW1fcGFnZTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdW5rbm93biBhZGRyZXNzIG9yIHN0cmFkZGxlIGh3IHdpbmRvd3MsCisJICogZG8gbm90IGFjY2Vzcy4KKwkgKi8KKwlzdGFydCA9IHFsYTRfOHh4eF9wY2lfc2V0X3dpbmRvdyhoYSwgb2ZmKTsKKwlpZiAoKHN0YXJ0ID09IC0xVUwpIHx8CisJICAgIChxbGE0Xzh4eHhfcGNpX2lzX3NhbWVfd2luZG93KGhhLCBvZmYgKyBzaXplIC0gMSkgPT0gMCkpIHsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiIlcyBvdXQgb2YgYm91bmQgcGNpIG1lbW9yeSBhY2Nlc3MuICIKKwkJCQkib2Zmc2V0IGlzIDB4JWxseFxuIiwgRFJJVkVSX05BTUUsIG9mZik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyID0gcWxhNF84eHh4X3BjaV9iYXNlX29mZnNldGZzZXQoaGEsIHN0YXJ0KTsKKwlpZiAoIWFkZHIpIHsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJCW1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAwKTsKKwkJbWVtX3BhZ2UgPSBzdGFydCAmIFBBR0VfTUFTSzsKKwkJLyogTWFwIHR3byBwYWdlcyB3aGVuZXZlciB1c2VyIHRyaWVzIHRvIGFjY2VzcyBhZGRyZXNzZXMgaW4gdHdvCisJCSAgIGNvbnNlY3V0aXZlIHBhZ2VzLgorCQkgKi8KKwkJaWYgKG1lbV9wYWdlICE9ICgoc3RhcnQgKyBzaXplIC0gMSkgJiBQQUdFX01BU0spKQorCQkJbWVtX3B0ciA9IGlvcmVtYXAobWVtX2Jhc2UgKyBtZW1fcGFnZSwgUEFHRV9TSVpFICogMik7CisJCWVsc2UKKwkJCW1lbV9wdHIgPSBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSk7CisKKwkJaWYgKG1lbV9wdHIgPT0gTlVMTCkgeworCQkJKih1OCAqKWRhdGEgPSAwOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFkZHIgPSBtZW1fcHRyOworCQlhZGRyICs9IHN0YXJ0ICYgKFBBR0VfU0laRSAtIDEpOworCQl3cml0ZV9sb2NrX2lycXNhdmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJfQorCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQkqKHU4ICAqKWRhdGEgPSByZWFkYihhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqKHUxNiAqKWRhdGEgPSByZWFkdyhhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkqKHUzMiAqKWRhdGEgPSByZWFkbChhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQkqKHU2NCAqKWRhdGEgPSByZWFkcShhZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKKworCWlmIChtZW1fcHRyKQorCQlpb3VubWFwKG1lbV9wdHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTRfOHh4eF9wY2lfbWVtX3dyaXRlX2RpcmVjdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHU2NCBvZmYsCisJCXZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICphZGRyOworCWludCByZXQgPSAwOworCXU2NCBzdGFydDsKKwl2b2lkIF9faW9tZW0gKm1lbV9wdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWVtX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtZW1fcGFnZTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdW5rbm93biBhZGRyZXNzIG9yIHN0cmFkZGxlIGh3IHdpbmRvd3MsCisJICogZG8gbm90IGFjY2Vzcy4KKwkgKi8KKwlzdGFydCA9IHFsYTRfOHh4eF9wY2lfc2V0X3dpbmRvdyhoYSwgb2ZmKTsKKwlpZiAoKHN0YXJ0ID09IC0xVUwpIHx8CisJICAgIChxbGE0Xzh4eHhfcGNpX2lzX3NhbWVfd2luZG93KGhhLCBvZmYgKyBzaXplIC0gMSkgPT0gMCkpIHsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiIlcyBvdXQgb2YgYm91bmQgcGNpIG1lbW9yeSBhY2Nlc3MuICIKKwkJCQkib2Zmc2V0IGlzIDB4JWxseFxuIiwgRFJJVkVSX05BTUUsIG9mZik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyID0gcWxhNF84eHh4X3BjaV9iYXNlX29mZnNldGZzZXQoaGEsIHN0YXJ0KTsKKwlpZiAoIWFkZHIpIHsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJCW1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAwKTsKKwkJbWVtX3BhZ2UgPSBzdGFydCAmIFBBR0VfTUFTSzsKKwkJLyogTWFwIHR3byBwYWdlcyB3aGVuZXZlciB1c2VyIHRyaWVzIHRvIGFjY2VzcyBhZGRyZXNzZXMgaW4gdHdvCisJCSAgIGNvbnNlY3V0aXZlIHBhZ2VzLgorCQkgKi8KKwkJaWYgKG1lbV9wYWdlICE9ICgoc3RhcnQgKyBzaXplIC0gMSkgJiBQQUdFX01BU0spKQorCQkJbWVtX3B0ciA9IGlvcmVtYXAobWVtX2Jhc2UgKyBtZW1fcGFnZSwgUEFHRV9TSVpFKjIpOworCQllbHNlCisJCQltZW1fcHRyID0gaW9yZW1hcChtZW1fYmFzZSArIG1lbV9wYWdlLCBQQUdFX1NJWkUpOworCQlpZiAobWVtX3B0ciA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCWFkZHIgPSBtZW1fcHRyOworCQlhZGRyICs9IHN0YXJ0ICYgKFBBR0VfU0laRSAtIDEpOworCQl3cml0ZV9sb2NrX2lycXNhdmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJfQorCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQl3cml0ZWIoKih1OCAqKWRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXdyaXRldygqKHUxNiAqKWRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXdyaXRlbCgqKHUzMiAqKWRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDg6CisJCXdyaXRlcSgqKHU2NCAqKWRhdGEsIGFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOworCWlmIChtZW1fcHRyKQorCQlpb3VubWFwKG1lbV9wdHIpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgTVRVX0ZVREdFX0ZBQ1RPUiAxMDAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3FsYTRfOHh4eF9kZWNvZGVfY3JiX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBvZmZzZXQsIHBjaV9iYXNlOworCisJaWYgKCFxbGE0Xzh4eHhfY3JiX3RhYmxlX2luaXRpYWxpemVkKQorCQlxbGE0Xzh4eHhfY3JiX2FkZHJfdHJhbnNmb3JtX3NldHVwKCk7CisKKwlwY2lfYmFzZSA9IEFERFJfRVJST1I7CisJYmFzZV9hZGRyID0gYWRkciAmIDB4ZmZmMDAwMDA7CisJb2Zmc2V0ID0gYWRkciAmIDB4MDAwZmZmZmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NSQl9YRk9STTsgaSsrKSB7CisJCWlmIChjcmJfYWRkcl94Zm9ybVtpXSA9PSBiYXNlX2FkZHIpIHsKKwkJCXBjaV9iYXNlID0gaSA8PCAyMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwY2lfYmFzZSA9PSBBRERSX0VSUk9SKQorCQlyZXR1cm4gcGNpX2Jhc2U7CisJZWxzZQorCQlyZXR1cm4gcGNpX2Jhc2UgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBsb25nIHJvbV9tYXhfdGltZW91dCA9IDEwMDsKK3N0YXRpYyBsb25nIHFsYTRfOHh4eF9yb21fbG9ja190aW1lb3V0ID0gMTAwOworCitzdGF0aWMgaW50CitxbGE0Xzh4eHhfcm9tX2xvY2soc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCBpOworCWludCBkb25lID0gMCwgdGltZW91dCA9IDA7CisKKwl3aGlsZSAoIWRvbmUpIHsKKwkJLyogYWNxdWlyZSBzZW1hcGhvcmUyIGZyb20gUENJIEhXIGJsb2NrICovCisKKwkJZG9uZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9QQ0lFX1JFRyhQQ0lFX1NFTTJfTE9DSykpOworCQlpZiAoZG9uZSA9PSAxKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ID49IHFsYTRfOHh4eF9yb21fbG9ja190aW1lb3V0KQorCQkJcmV0dXJuIC0xOworCisJCXRpbWVvdXQrKzsKKworCQkvKiBZaWVsZCBDUFUgKi8KKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCQkJY3B1X3JlbGF4KCk7ICAgIC8qVGhpcyBhIG5vcCBpbnN0ciBvbiBpMzg2Ki8KKwkJfQorCX0KKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NX0xPQ0tfSUQsIFJPTV9MT0NLX0RSSVZFUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitxbGE0Xzh4eHhfcm9tX3VubG9jayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX1BDSUVfUkVHKFBDSUVfU0VNMl9VTkxPQ0spKTsKK30KKworc3RhdGljIGludAorcWxhNF84eHh4X3dhaXRfcm9tX2RvbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWxvbmcgdGltZW91dCA9IDA7CisJbG9uZyBkb25lID0gMCA7CisKKwl3aGlsZSAoZG9uZSA9PSAwKSB7CisJCWRvbmUgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX0dMQl9TVEFUVVMpOworCQlkb25lICY9IDI7CisJCXRpbWVvdXQrKzsKKwkJaWYgKHRpbWVvdXQgPj0gcm9tX21heF90aW1lb3V0KSB7CisJCQlwcmludGsoIiVzOiBUaW1lb3V0IHJlYWNoZWQgIHdhaXRpbmcgZm9yIHJvbSBkb25lIiwKKwkJCQkJRFJJVkVSX05BTUUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxbGE0Xzh4eHhfZG9fcm9tX2Zhc3RfcmVhZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBhZGRyLCBpbnQgKnZhbHApCit7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fQUREUkVTUywgYWRkcik7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fRFVNTVlfQllURV9DTlQsIDApOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMyk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCAweGIpOworCWlmIChxbGE0Xzh4eHhfd2FpdF9yb21fZG9uZShoYSkpIHsKKwkJcHJpbnRrKCIlczogRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmVcbiIsIERSSVZFUl9OQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiByZXNldCBhYnl0ZV9jbnQgYW5kIGR1bW15X2J5dGVfY250ICovCisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fRFVNTVlfQllURV9DTlQsIDApOworCXVkZWxheSgxMCk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAwKTsKKworCSp2YWxwID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fUkRBVEEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxbGE0Xzh4eHhfcm9tX2Zhc3RfcmVhZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBhZGRyLCBpbnQgKnZhbHApCit7CisJaW50IHJldCwgbG9vcHMgPSAwOworCisJd2hpbGUgKChxbGE0Xzh4eHhfcm9tX2xvY2soaGEpICE9IDApICYmIChsb29wcyA8IDUwMDAwKSkgeworCQl1ZGVsYXkoMTAwKTsKKwkJbG9vcHMrKzsKKwl9CisJaWYgKGxvb3BzID49IDUwMDAwKSB7CisJCXByaW50aygiJXM6IHFsYTRfOHh4eF9yb21fbG9jayBmYWlsZWRcbiIsIERSSVZFUl9OQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXQgPSBxbGE0Xzh4eHhfZG9fcm9tX2Zhc3RfcmVhZChoYSwgYWRkciwgdmFscCk7CisJcWxhNF84eHh4X3JvbV91bmxvY2soaGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogVGhpcyByb3V0aW5lIGRvZXMgQ1JCIGluaXRpYWxpemUgc2VxdWVuY2UKKyAqIHRvIHB1dCB0aGUgSVNQIGludG8gb3BlcmF0aW9uYWwgc3RhdGUKKyAqKi8KK3N0YXRpYyBpbnQKK3FsYTRfOHh4eF9waW5pdF9mcm9tX3JvbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCB2ZXJib3NlKQoreworCWludCBhZGRyLCB2YWw7CisJaW50IGkgOworCXN0cnVjdCBjcmJfYWRkcl9wYWlyICpidWY7CisJdW5zaWduZWQgbG9uZyBvZmY7CisJdW5zaWduZWQgb2Zmc2V0LCBuOworCisJc3RydWN0IGNyYl9hZGRyX3BhaXIgeworCQlsb25nIGFkZHI7CisJCWxvbmcgZGF0YTsKKwl9OworCisJLyogSGFsdCBhbGwgdGhlIGluZGl2aXVhbCBQRUdzIGFuZCBvdGhlciBibG9ja3Mgb2YgdGhlIElTUCAqLworCXFsYTRfOHh4eF9yb21fbG9jayhoYSk7CisJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKQorCQkvKiBkb24ndCByZXNldCBDQU0gYmxvY2sgb24gcmVzZXQgKi8KKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9HTEJfU1dfUkVTRVQsIDB4ZmVmZmZmZmYpOworCWVsc2UKKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9HTEJfU1dfUkVTRVQsIDB4ZmZmZmZmZmYpOworCisJcWxhNF84eHh4X3JvbV91bmxvY2soaGEpOworCisJLyogUmVhZCB0aGUgc2lnbmF0dXJlIHZhbHVlIGZyb20gdGhlIGZsYXNoLgorCSAqIE9mZnNldCAwOiBDb250YWluIHNpZ25hdHVyZSAoMHhjYWZlY2FmZSkKKwkgKiBPZmZzZXQgNDogT2Zmc2V0IGFuZCBudW1iZXIgb2YgYWRkci92YWx1ZSBwYWlycworCSAqIHRoYXQgcHJlc2VudCBpbiBDUkIgaW5pdGlhbGl6ZSBzZXF1ZW5jZQorCSAqLworCWlmIChxbGE0Xzh4eHhfcm9tX2Zhc3RfcmVhZChoYSwgMCwgJm4pICE9IDAgfHwgbiAhPSAweGNhZmVjYWZlVUwgfHwKKwkgICAgcWxhNF84eHh4X3JvbV9mYXN0X3JlYWQoaGEsIDQsICZuKSAhPSAwKSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSJbRVJST1JdIFJlYWRpbmcgY3JiX2luaXQgYXJlYTogbjogJTA4eFxuIiwgbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBPZmZzZXQgaW4gZmxhc2ggPSBsb3dlciAxNiBiaXRzCisJICogTnVtYmVyIG9mIGVudGVyaWVzID0gdXBwZXIgMTYgYml0cworCSAqLworCW9mZnNldCA9IG4gJiAweGZmZmZVOworCW4gPSAobiA+PiAxNikgJiAweGZmZmZVOworCisJLyogbnVtYmVyIG9mIGFkZHIvdmFsdWUgcGFpciBzaG91bGQgbm90IGV4Y2VlZCAxMDI0IGVudGVyaWVzICovCisJaWYgKG4gID49IDEwMjQpIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIiVzOiAlczpuPTB4JXggW0VSUk9SXSBDYXJkIGZsYXNoIG5vdCBpbml0aWFsaXplZC5cbiIsCisJCSAgICBEUklWRVJfTkFNRSwgX19mdW5jX18sIG4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkiJXM6ICVkIENSQiBpbml0IHZhbHVlcyBmb3VuZCBpbiBST00uXG4iLCBEUklWRVJfTkFNRSwgbik7CisKKwlidWYgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGNyYl9hZGRyX3BhaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIiVzOiBbRVJST1JdIFVuYWJsZSB0byBtYWxsb2MgbWVtb3J5LlxuIiwgRFJJVkVSX05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAocWxhNF84eHh4X3JvbV9mYXN0X3JlYWQoaGEsIDgqaSArIDQqb2Zmc2V0LCAmdmFsKSAhPSAwIHx8CisJCSAgICBxbGE0Xzh4eHhfcm9tX2Zhc3RfcmVhZChoYSwgOCppICsgNCpvZmZzZXQgKyA0LCAmYWRkcikgIT0KKwkJICAgIDApIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlidWZbaV0uYWRkciA9IGFkZHI7CisJCWJ1ZltpXS5kYXRhID0gdmFsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJLyogVHJhbnNsYXRlIGludGVybmFsIENSQiBpbml0aWFsaXphdGlvbgorCQkgKiBhZGRyZXNzIHRvIFBDSSBidXMgYWRkcmVzcworCQkgKi8KKwkJb2ZmID0gcWxhNF84eHh4X2RlY29kZV9jcmJfYWRkcigodW5zaWduZWQgbG9uZylidWZbaV0uYWRkcikgKworCQkgICAgUUxBODJYWF9QQ0lfQ1JCU1BBQ0U7CisJCS8qIE5vdCBhbGwgQ1JCICBhZGRyL3ZhbHVlIHBhaXIgdG8gYmUgd3JpdHRlbiwKKwkJICogc29tZSBvZiB0aGVtIGFyZSBza2lwcGVkCisJCSAqLworCisJCS8qIHNraXAgaWYgTFMgYml0IGlzIHNldCovCisJCWlmIChvZmYgJiAweDEpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIlNraXAgQ1JCIGluaXQgcmVwbGF5IGZvciBvZmZzZXQgPSAweCVseFxuIiwgb2ZmKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHNraXBwaW5nIGNvbGQgcmVib290IE1BR0lDICovCisJCWlmIChvZmYgPT0gUUxBODJYWF9DQU1fUkFNKDB4MWZjKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGRvIG5vdCByZXNldCBQQ0kgKi8KKwkJaWYgKG9mZiA9PSAoUk9NVVNCX0dMQiArIDB4YmMpKQorCQkJY29udGludWU7CisKKwkJLyogc2tpcCBjb3JlIGNsb2NrLCBzbyB0aGF0IGZpcm13YXJlIGNhbiBpbmNyZWFzZSB0aGUgY2xvY2sgKi8KKwkJaWYgKG9mZiA9PSAoUk9NVVNCX0dMQiArIDB4YzgpKQorCQkJY29udGludWU7CisKKwkJLyogc2tpcCB0aGUgZnVuY3Rpb24gZW5hYmxlIHJlZ2lzdGVyICovCisJCWlmIChvZmYgPT0gUUxBODJYWF9QQ0lFX1JFRyhQQ0lFX1NFVFVQX0ZVTkNUSU9OKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChvZmYgPT0gUUxBODJYWF9QQ0lFX1JFRyhQQ0lFX1NFVFVQX0ZVTkNUSU9OMikpCisJCQljb250aW51ZTsKKworCQlpZiAoKG9mZiAmIDB4MGZmMDAwMDApID09IFFMQTgyWFhfQ1JCX1NNQikKKwkJCWNvbnRpbnVlOworCisJCWlmICgob2ZmICYgMHgwZmYwMDAwMCkgPT0gUUxBODJYWF9DUkJfRERSX05FVCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChvZmYgPT0gQUREUl9FUlJPUikgeworCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICIlczogW0VSUk9SXSBVbmtub3duIGFkZHI6IDB4JTA4bHhcbiIsCisJCQkgICAgRFJJVkVSX05BTUUsIGJ1ZltpXS5hZGRyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBvZmYsIGJ1ZltpXS5kYXRhKTsKKworCQkvKiBJU1AgcmVxdWlyZXMgbXVjaCBiaWdnZXIgZGVsYXkgdG8gc2V0dGxlIGRvd24sCisJCSAqIGVsc2UgY3JiX3dpbmRvdyByZXR1cm5zIDB4ZmZmZmZmZmYKKwkJICovCisJCWlmIChvZmYgPT0gUUxBODJYWF9ST01VU0JfR0xCX1NXX1JFU0VUKQorCQkJbXNsZWVwKDEwMDApOworCisJCS8qIElTUCByZXF1aXJlcyBtaWxsaXNlYyBkZWxheSBiZXR3ZWVuCisJCSAqIHN1Y2Nlc3NpdmUgQ1JCIHJlZ2lzdGVyIHVwZGF0aW9uCisJCSAqLworCQltc2xlZXAoMSk7CisJfQorCisJa2ZyZWUoYnVmKTsKKworCS8qIFJlc2V0dGluZyB0aGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfRCsweGVjLCAweDFlKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfRCsweDRjLCA4KTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfSSsweDRjLCA4KTsKKworCS8qIENsZWFyIGFsbCBwcm90b2NvbCBwcm9jZXNzaW5nIGVuZ2luZXMgKi8KKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfMCsweDgsIDApOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfUEVHX05FVF8wKzB4YywgMCk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9QRUdfTkVUXzErMHg4LCAwKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfMSsweGMsIDApOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfUEVHX05FVF8yKzB4OCwgMCk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9QRUdfTkVUXzIrMHhjLCAwKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfMysweDgsIDApOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfUEVHX05FVF8zKzB4YywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbGE0Xzh4eHhfY2hlY2tfZm9yX2JhZF9zcGQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXUzMiB2YWwgPSAwOworCXZhbCA9IHFsYTRfOHh4eF9yZF8zMihoYSwgQk9PVF9MT0FERVJfRElNTV9TVEFUVVMpIDsKKwl2YWwgJj0gUUxBODJYWF9CT09UX0xPQURFUl9NTl9JU1NVRTsKKwlpZiAodmFsICYgUUxBODJYWF9QRUdfVFVORV9NTl9TUERfWkVST0VEKSB7CisJCXByaW50aygiTWVtb3J5IERJTU0gU1BEIG5vdCBwcm9ncmFtbWVkLiAgQXNzdW1lZCB2YWxpZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHZhbCkgeworCQlwcmludGsoIk1lbW9yeSBESU1NIHR5cGUgaW5jb3JyZWN0LiAgSW5mbzolMDhYLlxuIiwgdmFsKTsKKwkJcmV0dXJuIDI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxbGE0Xzh4eHhfbG9hZF9mcm9tX2ZsYXNoKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgaW1hZ2Vfc3RhcnQpCit7CisJaW50ICBpOworCWxvbmcgc2l6ZSA9IDA7CisJbG9uZyBmbGFzaGFkZHIsIG1lbWFkZHI7CisJdTY0IGRhdGE7CisJdTMyIGhpZ2gsIGxvdzsKKworCWZsYXNoYWRkciA9IG1lbWFkZHIgPSBoYS0+aHcuZmx0X3JlZ2lvbl9ib290bG9hZDsKKwlzaXplID0gKGltYWdlX3N0YXJ0IC0gZmxhc2hhZGRyKS84OworCisJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGJvb3RsZHI9MHglbHgsIGZ3X2ltYWdlPTB4JXhcbiIsCisJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZmxhc2hhZGRyLCBpbWFnZV9zdGFydCkpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoKHFsYTRfOHh4eF9yb21fZmFzdF9yZWFkKGhhLCBmbGFzaGFkZHIsIChpbnQgKikmbG93KSkgfHwKKwkJICAgIChxbGE0Xzh4eHhfcm9tX2Zhc3RfcmVhZChoYSwgZmxhc2hhZGRyICsgNCwKKwkJICAgIChpbnQgKikmaGlnaCkpKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGF0YSA9ICgodTY0KWhpZ2ggPDwgMzIpIHwgbG93IDsKKwkJcWxhNF84eHh4X3BjaV9tZW1fd3JpdGVfMk0oaGEsIG1lbWFkZHIsICZkYXRhLCA4KTsKKwkJZmxhc2hhZGRyICs9IDg7CisJCW1lbWFkZHIgICArPSA4OworCisJCWlmIChpJTB4MTAwMCA9PSAwKQorCQkJbXNsZWVwKDEpOworCisJfQorCisJdWRlbGF5KDEwMCk7CisKKwlyZWFkX2xvY2soJmhhLT5od19sb2NrKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX1BFR19ORVRfMCArIDB4MTgsIDB4MTAyMCk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9HTEJfU1dfUkVTRVQsIDB4ODAwMDFlKTsKKwlyZWFkX3VubG9jaygmaGEtPmh3X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWxhNF84eHh4X2xvYWRfZncoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBpbWFnZV9zdGFydCkKK3sKKwl1MzIgcnN0OworCisJcWxhNF84eHh4X3dyXzMyKGhhLCBDUkJfQ01EUEVHX1NUQVRFLCAwKTsKKwlpZiAocWxhNF84eHh4X3Bpbml0X2Zyb21fcm9tKGhhLCAwKSAhPSBRTEFfU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgZHVyaW5nIENSQiBJbml0aWFsaXphdGlvblxuIiwKKwkJICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIFFMQV9FUlJPUjsKKwl9CisKKwl1ZGVsYXkoNTAwKTsKKworCS8qIGF0IHRoaXMgcG9pbnQsIFFNIGlzIGluIHJlc2V0LiBUaGlzIGNvdWxkIGJlIGEgcHJvYmxlbSBpZiB0aGVyZSBhcmUKKwkgKiBpbmNvbWluZyBkKiB0cmFuc2l0aW9uIHF1ZXVlIG1lc3NhZ2VzLiBRTS9QQ0lFIGNvdWxkIHdlZGdlLgorCSAqIFRvIGdldCBhcm91bmQgdGhpcywgUU0gaXMgYnJvdWdodCBvdXQgb2YgcmVzZXQuCisJICovCisKKwlyc3QgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX0dMQl9TV19SRVNFVCk7CisJLyogdW5yZXNldCBxbSAqLworCXJzdCAmPSB+KDEgPDwgMjgpOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfR0xCX1NXX1JFU0VULCByc3QpOworCisJaWYgKHFsYTRfOHh4eF9sb2FkX2Zyb21fZmxhc2goaGEsIGltYWdlX3N0YXJ0KSkgeworCQlwcmludGsoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9hZCBmdyBmcm9tIGZsYXNoIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gUUxBX0VSUk9SOworCX0KKworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworaW50CitxbGE0Xzh4eHhfcGNpX21lbV9yZWFkXzJNKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJdTY0IG9mZiwgdm9pZCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGksIGogPSAwLCBrLCBzdGFydCwgZW5kLCBsb29wLCBzelsyXSwgb2ZmMFsyXTsKKwlpbnQgc2hpZnRfYW1vdW50OworCXVpbnQzMl90IHRlbXA7CisJdWludDY0X3Qgb2ZmOCwgdmFsLCBtZW1fY3JiLCB3b3JkWzJdID0gezAsIDB9OworCisJLyoKKwkgKiBJZiBub3QgTU4sIGdvIGNoZWNrIGZvciBNUyBvciBpbnZhbGlkLgorCSAqLworCisJaWYgKG9mZiA+PSBRTEE4MlhYX0FERFJfUURSX05FVCAmJiBvZmYgPD0gUUxBODJYWF9QM19BRERSX1FEUl9ORVRfTUFYKQorCQltZW1fY3JiID0gUUxBODJYWF9DUkJfUURSX05FVDsKKwllbHNlIHsKKwkJbWVtX2NyYiA9IFFMQTgyWFhfQ1JCX0REUl9ORVQ7CisJCWlmIChxbGE0Xzh4eHhfcGNpX21lbV9ib3VuZF9jaGVjayhoYSwgb2ZmLCBzaXplKSA9PSAwKQorCQkJcmV0dXJuIHFsYTRfOHh4eF9wY2lfbWVtX3JlYWRfZGlyZWN0KGhhLAorCQkJCQlvZmYsIGRhdGEsIHNpemUpOworCX0KKworCisJb2ZmOCA9IG9mZiAmIDB4ZmZmZmZmZjA7CisJb2ZmMFswXSA9IG9mZiAmIDB4ZjsKKwlzelswXSA9IChzaXplIDwgKDE2IC0gb2ZmMFswXSkpID8gc2l6ZSA6ICgxNiAtIG9mZjBbMF0pOworCXNoaWZ0X2Ftb3VudCA9IDQ7CisKKwlsb29wID0gKChvZmYwWzBdICsgc2l6ZSAtIDEpID4+IHNoaWZ0X2Ftb3VudCkgKyAxOworCW9mZjBbMV0gPSAwOworCXN6WzFdID0gc2l6ZSAtIHN6WzBdOworCisJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgeworCQl0ZW1wID0gb2ZmOCArIChpIDw8IHNoaWZ0X2Ftb3VudCk7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgbWVtX2NyYiArIE1JVV9URVNUX0FHVF9BRERSX0xPLCB0ZW1wKTsKKwkJdGVtcCA9IDA7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgbWVtX2NyYiArIE1JVV9URVNUX0FHVF9BRERSX0hJLCB0ZW1wKTsKKwkJdGVtcCA9IE1JVV9UQV9DVExfRU5BQkxFOworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIG1lbV9jcmIgKyBNSVVfVEVTVF9BR1RfQ1RSTCwgdGVtcCk7CisJCXRlbXAgPSBNSVVfVEFfQ1RMX1NUQVJUIHwgTUlVX1RBX0NUTF9FTkFCTEU7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgbWVtX2NyYiArIE1JVV9URVNUX0FHVF9DVFJMLCB0ZW1wKTsKKworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NUTF9DSEVDSzsgaisrKSB7CisJCQl0ZW1wID0gcWxhNF84eHh4X3JkXzMyKGhhLCBtZW1fY3JiICsgTUlVX1RFU1RfQUdUX0NUUkwpOworCQkJaWYgKCh0ZW1wICYgTUlVX1RBX0NUTF9CVVNZKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGogPj0gTUFYX0NUTF9DSEVDSykgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkgICAgImZhaWxlZCB0byByZWFkIHRocm91Z2ggYWdlbnRcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlzdGFydCA9IG9mZjBbaV0gPj4gMjsKKwkJZW5kICAgPSAob2ZmMFtpXSArIHN6W2ldIC0gMSkgPj4gMjsKKwkJZm9yIChrID0gc3RhcnQ7IGsgPD0gZW5kOyBrKyspIHsKKwkJCXRlbXAgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsCisJCQkJbWVtX2NyYiArIE1JVV9URVNUX0FHVF9SRERBVEEoaykpOworCQkJd29yZFtpXSB8PSAoKHVpbnQ2NF90KXRlbXAgPDwgKDMyICogKGsgJiAxKSkpOworCQl9CisJfQorCisJaWYgKGogPj0gTUFYX0NUTF9DSEVDSykKKwkJcmV0dXJuIC0xOworCisJaWYgKChvZmYwWzBdICYgNykgPT0gMCkgeworCQl2YWwgPSB3b3JkWzBdOworCX0gZWxzZSB7CisJCXZhbCA9ICgod29yZFswXSA+PiAob2ZmMFswXSAqIDgpKSAmICh+KH4wVUxMIDw8IChzelswXSAqIDgpKSkpIHwKKwkJKCh3b3JkWzFdICYgKH4ofjBVTEwgPDwgKHN6WzFdICogOCkpKSkgPDwgKHN6WzBdICogOCkpOworCX0KKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJKih1aW50OF90ICAqKWRhdGEgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKih1aW50MTZfdCAqKWRhdGEgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKih1aW50MzJfdCAqKWRhdGEgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgODoKKwkJKih1aW50NjRfdCAqKWRhdGEgPSB2YWw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitxbGE0Xzh4eHhfcGNpX21lbV93cml0ZV8yTShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCXU2NCBvZmYsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCWludCBpLCBqLCByZXQgPSAwLCBsb29wLCBzelsyXSwgb2ZmMDsKKwlpbnQgc2NhbGUsIHNoaWZ0X2Ftb3VudCwgc3RhcnR3b3JkOworCXVpbnQzMl90IHRlbXA7CisJdWludDY0X3Qgb2ZmOCwgbWVtX2NyYiwgdG1wdywgd29yZFsyXSA9IHswLCAwfTsKKworCS8qCisJICogSWYgbm90IE1OLCBnbyBjaGVjayBmb3IgTVMgb3IgaW52YWxpZC4KKwkgKi8KKwlpZiAob2ZmID49IFFMQTgyWFhfQUREUl9RRFJfTkVUICYmIG9mZiA8PSBRTEE4MlhYX1AzX0FERFJfUURSX05FVF9NQVgpCisJCW1lbV9jcmIgPSBRTEE4MlhYX0NSQl9RRFJfTkVUOworCWVsc2UgeworCQltZW1fY3JiID0gUUxBODJYWF9DUkJfRERSX05FVDsKKwkJaWYgKHFsYTRfOHh4eF9wY2lfbWVtX2JvdW5kX2NoZWNrKGhhLCBvZmYsIHNpemUpID09IDApCisJCQlyZXR1cm4gcWxhNF84eHh4X3BjaV9tZW1fd3JpdGVfZGlyZWN0KGhhLAorCQkJCQlvZmYsIGRhdGEsIHNpemUpOworCX0KKworCW9mZjAgPSBvZmYgJiAweDc7CisJc3pbMF0gPSAoc2l6ZSA8ICg4IC0gb2ZmMCkpID8gc2l6ZSA6ICg4IC0gb2ZmMCk7CisJc3pbMV0gPSBzaXplIC0gc3pbMF07CisKKwlvZmY4ID0gb2ZmICYgMHhmZmZmZmZmMDsKKwlsb29wID0gKCgob2ZmICYgMHhmKSArIHNpemUgLSAxKSA+PiA0KSArIDE7CisJc2hpZnRfYW1vdW50ID0gNDsKKwlzY2FsZSA9IDI7CisJc3RhcnR3b3JkID0gKG9mZiAmIDB4ZikvODsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKKwkJaWYgKHFsYTRfOHh4eF9wY2lfbWVtX3JlYWRfMk0oaGEsIG9mZjggKworCQkgICAgKGkgPDwgc2hpZnRfYW1vdW50KSwgJndvcmRbaSAqIHNjYWxlXSwgOCkpCisJCQlyZXR1cm4gLTE7CisJfQorCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQl0bXB3ID0gKigodWludDhfdCAqKWRhdGEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcHcgPSAqKCh1aW50MTZfdCAqKWRhdGEpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRtcHcgPSAqKCh1aW50MzJfdCAqKWRhdGEpOworCQlicmVhazsKKwljYXNlIDg6CisJZGVmYXVsdDoKKwkJdG1wdyA9ICooKHVpbnQ2NF90ICopZGF0YSk7CisJCWJyZWFrOworCX0KKworCWlmIChzelswXSA9PSA4KQorCQl3b3JkW3N0YXJ0d29yZF0gPSB0bXB3OworCWVsc2UgeworCQl3b3JkW3N0YXJ0d29yZF0gJj0KKwkJICAgIH4oKH4ofjBVTEwgPDwgKHN6WzBdICogOCkpKSA8PCAob2ZmMCAqIDgpKTsKKwkJd29yZFtzdGFydHdvcmRdIHw9IHRtcHcgPDwgKG9mZjAgKiA4KTsKKwl9CisKKwlpZiAoc3pbMV0gIT0gMCkgeworCQl3b3JkW3N0YXJ0d29yZCsxXSAmPSB+KH4wVUxMIDw8IChzelsxXSAqIDgpKTsKKwkJd29yZFtzdGFydHdvcmQrMV0gfD0gdG1wdyA+PiAoc3pbMF0gKiA4KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CisJCXRlbXAgPSBvZmY4ICsgKGkgPDwgc2hpZnRfYW1vdW50KTsKKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBtZW1fY3JiK01JVV9URVNUX0FHVF9BRERSX0xPLCB0ZW1wKTsKKwkJdGVtcCA9IDA7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgbWVtX2NyYitNSVVfVEVTVF9BR1RfQUREUl9ISSwgdGVtcCk7CisJCXRlbXAgPSB3b3JkW2kgKiBzY2FsZV0gJiAweGZmZmZmZmZmOworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIG1lbV9jcmIrTUlVX1RFU1RfQUdUX1dSREFUQV9MTywgdGVtcCk7CisJCXRlbXAgPSAod29yZFtpICogc2NhbGVdID4+IDMyKSAmIDB4ZmZmZmZmZmY7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgbWVtX2NyYitNSVVfVEVTVF9BR1RfV1JEQVRBX0hJLCB0ZW1wKTsKKwkJdGVtcCA9IHdvcmRbaSpzY2FsZSArIDFdICYgMHhmZmZmZmZmZjsKKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBtZW1fY3JiICsgTUlVX1RFU1RfQUdUX1dSREFUQV9VUFBFUl9MTywKKwkJICAgIHRlbXApOworCQl0ZW1wID0gKHdvcmRbaSpzY2FsZSArIDFdID4+IDMyKSAmIDB4ZmZmZmZmZmY7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgbWVtX2NyYiArIE1JVV9URVNUX0FHVF9XUkRBVEFfVVBQRVJfSEksCisJCSAgICB0ZW1wKTsKKworCQl0ZW1wID0gTUlVX1RBX0NUTF9FTkFCTEUgfCBNSVVfVEFfQ1RMX1dSSVRFOworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIG1lbV9jcmIrTUlVX1RFU1RfQUdUX0NUUkwsIHRlbXApOworCQl0ZW1wID0gTUlVX1RBX0NUTF9TVEFSVCB8IE1JVV9UQV9DVExfRU5BQkxFIHwgTUlVX1RBX0NUTF9XUklURTsKKwkJcWxhNF84eHh4X3dyXzMyKGhhLCBtZW1fY3JiK01JVV9URVNUX0FHVF9DVFJMLCB0ZW1wKTsKKworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NUTF9DSEVDSzsgaisrKSB7CisJCQl0ZW1wID0gcWxhNF84eHh4X3JkXzMyKGhhLCBtZW1fY3JiICsgTUlVX1RFU1RfQUdUX0NUUkwpOworCQkJaWYgKCh0ZW1wICYgTUlVX1RBX0NUTF9CVVNZKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGogPj0gTUFYX0NUTF9DSEVDSykgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkgICAgImZhaWxlZCB0byB3cml0ZSB0aHJvdWdoIGFnZW50XG4iKTsKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFsYTRfOHh4eF9jbWRwZWdfcmVhZHkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgcGVndHVuZV92YWwpCit7CisJdTMyIHZhbCA9IDA7CisJaW50IHJldHJpZXMgPSA2MDsKKworCWlmICghcGVndHVuZV92YWwpIHsKKwkJZG8geworCQkJdmFsID0gcWxhNF84eHh4X3JkXzMyKGhhLCBDUkJfQ01EUEVHX1NUQVRFKTsKKwkJCWlmICgodmFsID09IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSkgfHwKKwkJCSAgICAodmFsID09IFBIQU5fSU5JVElBTElaRV9BQ0spKQorCQkJCXJldHVybiAwOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCg1MDApOworCisJCX0gd2hpbGUgKC0tcmV0cmllcyk7CisKKwkJcWxhNF84eHh4X2NoZWNrX2Zvcl9iYWRfc3BkKGhhKTsKKworCQlpZiAoIXJldHJpZXMpIHsKKwkJCXBlZ3R1bmVfdmFsID0gcWxhNF84eHh4X3JkXzMyKGhhLAorCQkJCVFMQTgyWFhfUk9NVVNCX0dMQl9QRUdUVU5FX0RPTkUpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGluaXQgZmFpbGVkLCAiCisJCQkJInBlZ3R1bmVfdmFsID0gJXhcbiIsIF9fZnVuY19fLCBwZWd0dW5lX3ZhbCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWxhNF84eHh4X3JjdnBlZ19yZWFkeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3Qgc3RhdGUgPSAwOworCWludCBsb29wcyA9IDA7CisKKwkvKiBXaW5kb3cgMSBjYWxsICovCisJcmVhZF9sb2NrKCZoYS0+aHdfbG9jayk7CisJc3RhdGUgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIENSQl9SQ1ZQRUdfU1RBVEUpOworCXJlYWRfdW5sb2NrKCZoYS0+aHdfbG9jayk7CisKKwl3aGlsZSAoKHN0YXRlICE9IFBIQU5fUEVHX1JDVl9JTklUSUFMSVpFRCkgJiYgKGxvb3BzIDwgMzAwMDApKSB7CisJCXVkZWxheSgxMDApOworCQkvKiBXaW5kb3cgMSBjYWxsICovCisJCXJlYWRfbG9jaygmaGEtPmh3X2xvY2spOworCQlzdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgQ1JCX1JDVlBFR19TVEFURSk7CisJCXJlYWRfdW5sb2NrKCZoYS0+aHdfbG9jayk7CisKKwkJbG9vcHMrKzsKKwl9CisKKwlpZiAobG9vcHMgPj0gMzAwMDApIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJSZWNlaXZlIFBlZyBpbml0aWFsaXphdGlvbiBub3QgY29tcGxldGU6IDB4JXguXG4iLCBzdGF0ZSkpOworCQlyZXR1cm4gUUxBX0VSUk9SOworCX0KKworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGE0Xzh4eHhfc2V0X2Rydl9hY3RpdmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IGRydl9hY3RpdmU7CisKKwlkcnZfYWN0aXZlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFKTsKKwlkcnZfYWN0aXZlIHw9ICgxIDw8IChoYS0+ZnVuY19udW0gKiA0KSk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFLCBkcnZfYWN0aXZlKTsKK30KKwordm9pZAorcWxhNF84eHh4X2NsZWFyX2Rydl9hY3RpdmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IGRydl9hY3RpdmU7CisKKwlkcnZfYWN0aXZlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFKTsKKwlkcnZfYWN0aXZlICY9IH4oMSA8PCAoaGEtPmZ1bmNfbnVtICogNCkpOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfRFJWX0FDVElWRSwgZHJ2X2FjdGl2ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitxbGE0Xzh4eHhfbmVlZF9yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3QgZHJ2X3N0YXRlOworCWludCBydmFsOworCisJZHJ2X3N0YXRlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUpOworCXJ2YWwgPSBkcnZfc3RhdGUgJiAoMSA8PCAoaGEtPmZ1bmNfbnVtICogNCkpOworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTRfOHh4eF9zZXRfcnN0X3JlYWR5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MzJfdCBkcnZfc3RhdGU7CisKKwlkcnZfc3RhdGUgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSk7CisJZHJ2X3N0YXRlIHw9ICgxIDw8IChoYS0+ZnVuY19udW0gKiA0KSk7CisJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUsIGRydl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhNF84eHh4X2NsZWFyX3JzdF9yZWFkeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3QgZHJ2X3N0YXRlOworCisJZHJ2X3N0YXRlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUpOworCWRydl9zdGF0ZSAmPSB+KDEgPDwgKGhhLT5mdW5jX251bSAqIDQpKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSwgZHJ2X3N0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGE0Xzh4eHhfc2V0X3FzbnRfcmVhZHkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IHFzbnRfc3RhdGU7CisKKwlxc250X3N0YXRlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUpOworCXFzbnRfc3RhdGUgfD0gKDIgPDwgKGhhLT5mdW5jX251bSAqIDQpKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSwgcXNudF9zdGF0ZSk7Cit9CisKKworc3RhdGljIGludAorcWxhNF84eHh4X3N0YXJ0X2Zpcm13YXJlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgaW1hZ2Vfc3RhcnQpCit7CisJaW50IHBjaWVfY2FwOworCXVpbnQxNl90IGxuazsKKworCS8qIHNjcnViIGRtYSBtYXNrIGV4cGFuc2lvbiByZWdpc3RlciAqLworCXFsYTRfOHh4eF93cl8zMihoYSwgQ1JCX0RNQV9TSElGVCwgMHg1NTU1NTU1NSk7CisKKwkvKiBPdmVyd3JpdGUgc3RhbGUgaW5pdGlhbGl6YXRpb24gcmVnaXN0ZXIgdmFsdWVzICovCisJcWxhNF84eHh4X3dyXzMyKGhhLCBDUkJfQ01EUEVHX1NUQVRFLCAwKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIENSQl9SQ1ZQRUdfU1RBVEUsIDApOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9QRUdfSEFMVF9TVEFUVVMxLCAwKTsKKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfUEVHX0hBTFRfU1RBVFVTMiwgMCk7CisKKwlpZiAocWxhNF84eHh4X2xvYWRfZncoaGEsIGltYWdlX3N0YXJ0KSAhPSBRTEFfU1VDQ0VTUykgeworCQlwcmludGsoIiVzOiBFcnJvciB0cnlpbmcgdG8gc3RhcnQgZnchXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBRTEFfRVJST1I7CisJfQorCisJLyogSGFuZHNoYWtlIHdpdGggdGhlIGNhcmQgYmVmb3JlIHdlIHJlZ2lzdGVyIHRoZSBkZXZpY2VzLiAqLworCWlmIChxbGE0Xzh4eHhfY21kcGVnX3JlYWR5KGhhLCAwKSAhPSBRTEFfU1VDQ0VTUykgeworCQlwcmludGsoIiVzOiBFcnJvciBkdXJpbmcgY2FyZCBoYW5kc2hha2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBRTEFfRVJST1I7CisJfQorCisJLyogTmVnb3RpYXRlZCBMaW5rIHdpZHRoICovCisJcGNpZV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGhhLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaGEtPnBkZXYsIHBjaWVfY2FwICsgUENJX0VYUF9MTktTVEEsICZsbmspOworCWhhLT5saW5rX3dpZHRoID0gKGxuayA+PiA0KSAmIDB4M2Y7CisKKwkvKiBTeW5jaHJvbml6ZSB3aXRoIFJlY2VpdmUgcGVnICovCisJcmV0dXJuIHFsYTRfOHh4eF9yY3ZwZWdfcmVhZHkoaGEpOworfQorCitzdGF0aWMgaW50CitxbGE0Xzh4eHhfdHJ5X3N0YXJ0X2Z3KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpbnQgcnZhbCA9IFFMQV9FUlJPUjsKKworCS8qCisJICogRlcgTG9hZCBwcmlvcml0eToKKwkgKiAxKSBPcGVyYXRpb25hbCBmaXJtd2FyZSByZXNpZGluZyBpbiBmbGFzaC4KKwkgKiAyKSBGYWlsCisJICovCisKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJICAgICJGVzogUmV0cmlldmluZyBmbGFzaCBvZmZzZXRzIGZyb20gRkxUL0ZEVCAuLi5cbiIpOworCXJ2YWwgPSBxbGE0Xzh4eHhfZ2V0X2ZsYXNoX2luZm8oaGEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gcnZhbDsKKworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgIkZXOiBBdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBmbGFzaC4uLlxuIik7CisJcnZhbCA9IHFsYTRfOHh4eF9zdGFydF9maXJtd2FyZShoYSwgaGEtPmh3LmZsdF9yZWdpb25fZncpOworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gcnZhbDsKKworCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiRlc6IExvYWQgZmlybXdhcmUgZnJvbSBmbGFzaCBGQUlMRUQuLi5cbiIpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKgorICogcWxhNF84eHh4X2RldmljZV9ib290c3RyYXAgLSBJbml0aWFsaXplIGRldmljZSwgc2V0IERFVl9SRUFEWSwgc3RhcnQgZncKKyAqIEBoYTogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIE5vdGU6IElEQyBsb2NrIG11c3QgYmUgaGVsZCB1cG9uIGVudHJ5CisgKiovCitzdGF0aWMgaW50CitxbGE0Xzh4eHhfZGV2aWNlX2Jvb3RzdHJhcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IHJ2YWwsIGksIHRpbWVvdXQ7CisJdWludDMyX3Qgb2xkX2NvdW50LCBjb3VudDsKKworCWlmIChxbGE0Xzh4eHhfbmVlZF9yZXNldChoYSkpCisJCWdvdG8gZGV2X2luaXRpYWxpemU7CisKKwlvbGRfY291bnQgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfUEVHX0FMSVZFX0NPVU5URVIpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJdGltZW91dCA9IG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMCk7CisJCWlmICh0aW1lb3V0KSB7CisJCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKKwkJCSAgIFFMQTgyWFhfREVWX0ZBSUxFRCk7CisJCQlyZXR1cm4gUUxBX0VSUk9SOworCQl9CisKKwkJY291bnQgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfUEVHX0FMSVZFX0NPVU5URVIpOworCQlpZiAoY291bnQgIT0gb2xkX2NvdW50KQorCQkJZ290byBkZXZfcmVhZHk7CisJfQorCitkZXZfaW5pdGlhbGl6ZToKKwkvKiBzZXQgdG8gREVWX0lOSVRJQUxJWklORyAqLworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBJTklUSUFMSVpJTkdcbiIpOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9JTklUSUFMSVpJTkcpOworCisJLyogRHJpdmVyIHRoYXQgc2V0cyBkZXZpY2Ugc3RhdGUgdG8gaW5pdGlhbGl6YXRpbmcgc2V0cyBJREMgdmVyc2lvbiAqLworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfRFJWX0lEQ19WRVJTSU9OLCBRTEE4MlhYX0lEQ19WRVJTSU9OKTsKKworCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKKwlydmFsID0gcWxhNF84eHh4X3RyeV9zdGFydF9mdyhoYSk7CisJcWxhNF84eHh4X2lkY19sb2NrKGhhKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBGQUlMRURcbiIpOworCQlxbGE0Xzh4eHhfY2xlYXJfZHJ2X2FjdGl2ZShoYSk7CisJCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9GQUlMRUQpOworCQlyZXR1cm4gcnZhbDsKKwl9CisKK2Rldl9yZWFkeToKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogUkVBRFlcbiIpOworCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9SRUFEWSk7CisKKwlyZXR1cm4gUUxBX1NVQ0NFU1M7Cit9CisKKy8qKgorICogcWxhNF84eHh4X25lZWRfcmVzZXRfaGFuZGxlciAtIENvZGUgdG8gc3RhcnQgcmVzZXQgc2VxdWVuY2UKKyAqIEBoYTogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIE5vdGU6IElEQyBsb2NrIG11c3QgYmUgaGVsZCB1cG9uIGVudHJ5CisgKiovCitzdGF0aWMgdm9pZAorcWxhNF84eHh4X25lZWRfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3QgZGV2X3N0YXRlLCBkcnZfc3RhdGUsIGRydl9hY3RpdmU7CisJdW5zaWduZWQgbG9uZyByZXNldF90aW1lb3V0OworCisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkiUGVyZm9ybWluZyBJU1AgZXJyb3IgcmVjb3ZlcnlcbiIpOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSB7CisJCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKKwkJaGEtPmlzcF9vcHMtPmRpc2FibGVfaW50cnMoaGEpOworCQlxbGE0Xzh4eHhfaWRjX2xvY2soaGEpOworCX0KKworCXFsYTRfOHh4eF9zZXRfcnN0X3JlYWR5KGhhKTsKKworCS8qIHdhaXQgZm9yIDEwIHNlY29uZHMgZm9yIHJlc2V0IGFjayBmcm9tIGFsbCBmdW5jdGlvbnMgKi8KKwlyZXNldF90aW1lb3V0ID0gamlmZmllcyArIChoYS0+bnhfcmVzZXRfdGltZW91dCAqIEhaKTsKKworCWRydl9zdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKKwlkcnZfYWN0aXZlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFKTsKKworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJIiVzKCVsZCk6IGRydl9zdGF0ZSA9IDB4JXgsIGRydl9hY3RpdmUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIGRydl9zdGF0ZSwgZHJ2X2FjdGl2ZSk7CisKKwl3aGlsZSAoZHJ2X3N0YXRlICE9IGRydl9hY3RpdmUpIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVzZXRfdGltZW91dCkpIHsKKwkJCXByaW50aygiJXM6IFJFU0VUIFRJTUVPVVQhXG4iLCBEUklWRVJfTkFNRSk7CisJCQlicmVhazsKKwkJfQorCisJCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKKwkJbXNsZWVwKDEwMDApOworCQlxbGE0Xzh4eHhfaWRjX2xvY2soaGEpOworCisJCWRydl9zdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKKwkJZHJ2X2FjdGl2ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX0FDVElWRSk7CisJfQorCisJZGV2X3N0YXRlID0gcWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIjM6RGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlc1xuIiwgZGV2X3N0YXRlLAorCQlkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKKworCS8qIEZvcmNlIHRvIERFVl9DT0xEIHVubGVzcyBzb21lb25lIGVsc2UgaXMgc3RhcnRpbmcgYSByZXNldCAqLworCWlmIChkZXZfc3RhdGUgIT0gUUxBODJYWF9ERVZfSU5JVElBTElaSU5HKSB7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBDT0xEL1JFLUlOSVRcbiIpOworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwgUUxBODJYWF9ERVZfQ09MRCk7CisJfQorfQorCisvKioKKyAqIHFsYTRfOHh4eF9uZWVkX3FzbnRfaGFuZGxlciAtIENvZGUgdG8gc3RhcnQgcXNudAorICogQGhhOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0dXJlCisgKiovCit2b2lkCitxbGE0Xzh4eHhfbmVlZF9xc250X2hhbmRsZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXFsYTRfOHh4eF9pZGNfbG9jayhoYSk7CisJcWxhNF84eHh4X3NldF9xc250X3JlYWR5KGhhKTsKKwlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7Cit9CisKKy8qKgorICogcWxhNF84eHh4X2RldmljZV9zdGF0ZV9oYW5kbGVyIC0gQWRhcHRlciBzdGF0ZSBtYWNoaW5lCisgKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKiBOb3RlOiBJREMgbG9jayBtdXN0IGJlIFVOTE9DS0VEIHVwb24gZW50cnkKKyAqKi8KK2ludCBxbGE0Xzh4eHhfZGV2aWNlX3N0YXRlX2hhbmRsZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IGRldl9zdGF0ZTsKKwlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgZGV2X2luaXRfdGltZW91dDsKKworCWlmICghdGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSkKKwkJcWxhNF84eHh4X3NldF9kcnZfYWN0aXZlKGhhKTsKKworCWRldl9zdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIxOkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXNcbiIsIGRldl9zdGF0ZSwKKwkJZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CisKKwkvKiB3YWl0IGZvciAzMCBzZWNvbmRzIGZvciBkZXZpY2UgdG8gZ28gcmVhZHkgKi8KKwlkZXZfaW5pdF90aW1lb3V0ID0gamlmZmllcyArIChoYS0+bnhfZGV2X2luaXRfdGltZW91dCAqIEhaKTsKKworCXdoaWxlICgxKSB7CisJCXFsYTRfOHh4eF9pZGNfbG9jayhoYSk7CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZGV2X2luaXRfdGltZW91dCkpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkRldmljZSBpbml0IGZhaWxlZCFcbiIpOworCQkJcWxhNF84eHh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCisJCQkJUUxBODJYWF9ERVZfRkFJTEVEKTsKKwkJfQorCisJCWRldl9zdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKKwkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIjI6RGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlc1xuIiwgZGV2X3N0YXRlLAorCQkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CisKKwkJLyogTk9URTogTWFrZSBzdXJlIGlkYyB1bmxvY2tlZCB1cG9uIGV4aXQgb2Ygc3dpdGNoIHN0YXRlbWVudCAqLworCQlzd2l0Y2ggKGRldl9zdGF0ZSkgeworCQljYXNlIFFMQTgyWFhfREVWX1JFQURZOgorCQkJcWxhNF84eHh4X2lkY191bmxvY2soaGEpOworCQkJZ290byBleGl0OworCQljYXNlIFFMQTgyWFhfREVWX0NPTEQ6CisJCQlydmFsID0gcWxhNF84eHh4X2RldmljZV9ib290c3RyYXAoaGEpOworCQkJcWxhNF84eHh4X2lkY191bmxvY2soaGEpOworCQkJZ290byBleGl0OworCQljYXNlIFFMQTgyWFhfREVWX0lOSVRJQUxJWklORzoKKwkJCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKKwkJCW1zbGVlcCgxMDAwKTsKKwkJCWJyZWFrOworCQljYXNlIFFMQTgyWFhfREVWX05FRURfUkVTRVQ6CisJCQlpZiAoIXFsNHhkb250cmVzZXRoYmEpIHsKKwkJCQlxbGE0Xzh4eHhfbmVlZF9yZXNldF9oYW5kbGVyKGhhKTsKKwkJCQkvKiBVcGRhdGUgdGltZW91dCB2YWx1ZSBhZnRlciBuZWVkCisJCQkJICogcmVzZXQgaGFuZGxlciAqLworCQkJCWRldl9pbml0X3RpbWVvdXQgPSBqaWZmaWVzICsKKwkJCQkJKGhhLT5ueF9kZXZfaW5pdF90aW1lb3V0ICogSFopOworCQkJfQorCQkJcWxhNF84eHh4X2lkY191bmxvY2soaGEpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9ERVZfTkVFRF9RVUlFU0NFTlQ6CisJCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CisJCQkvKiBpZGMgbG9ja2VkL3VubG9ja2VkIGluIGhhbmRsZXIgKi8KKwkJCXFsYTRfOHh4eF9uZWVkX3FzbnRfaGFuZGxlcihoYSk7CisJCQlxbGE0Xzh4eHhfaWRjX2xvY2soaGEpOworCQkJLyogZmFsbCB0aHJ1IG5lZWRzIGlkY19sb2NrZWQgKi8KKwkJY2FzZSBRTEE4MlhYX0RFVl9RVUlFU0NFTlQ6CisJCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CisJCQltc2xlZXAoMTAwMCk7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX0RFVl9GQUlMRUQ6CisJCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CisJCQlxbGE0eHh4X2RlYWRfYWRhcHRlcl9jbGVhbnVwKGhhKTsKKwkJCXJ2YWwgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXQ7CisJCWRlZmF1bHQ6CisJCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CisJCQlxbGE0eHh4X2RlYWRfYWRhcHRlcl9jbGVhbnVwKGhhKTsKKwkJCXJ2YWwgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CitleGl0OgorCXJldHVybiBydmFsOworfQorCitpbnQgcWxhNF84eHh4X2xvYWRfcmlzYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IHJldHZhbDsKKwlyZXR2YWwgPSBxbGE0Xzh4eHhfZGV2aWNlX3N0YXRlX2hhbmRsZXIoaGEpOworCisJaWYgKHJldHZhbCA9PSBRTEFfU1VDQ0VTUyAmJgorCSAgICAhdGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSkgeworCQlyZXR2YWwgPSBxbGE0eHh4X3JlcXVlc3RfaXJxcyhoYSk7CisJCWlmIChyZXR2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiRmFpbGVkIHRvIHJlc2VydmUgaW50ZXJydXB0ICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJCSAgICBoYS0+cGRldi0+aXJxKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKTsKKwkJCWhhLT5ob3N0LT5pcnEgPSBoYS0+cGRldi0+aXJxOworCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGlycSAlZCBhdHRhY2hlZFxuIiwKKwkJCSAgICBfX2Z1bmNfXywgaGEtPnBkZXYtPmlycSk7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRmxhc2ggTWFuaXB1bGF0aW9uIFJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9QVFJPTV9CVVJTVF9TSVpFICAgICAgIDB4MTAwMAorI2RlZmluZSBPUFRST01fQlVSU1RfRFdPUkRTICAgICAoT1BUUk9NX0JVUlNUX1NJWkUgLyA0KQorCisjZGVmaW5lIEZBUlhfREFUQV9GTEFHCUJJVF8zMQorI2RlZmluZSBGQVJYX0FDQ0VTU19GTEFTSF9DT05GCTB4N0ZGRDAwMDAKKyNkZWZpbmUgRkFSWF9BQ0NFU1NfRkxBU0hfREFUQQkweDdGRjAwMDAwCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2ZsYXNoX2NvbmZfYWRkcihzdHJ1Y3QgcWw4Mnh4X2h3X2RhdGEgKmh3LCB1aW50MzJfdCBmYWRkcikKK3sKKwlyZXR1cm4gaHctPmZsYXNoX2NvbmZfb2ZmIHwgZmFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2ZsYXNoX2RhdGFfYWRkcihzdHJ1Y3QgcWw4Mnh4X2h3X2RhdGEgKmh3LCB1aW50MzJfdCBmYWRkcikKK3sKKwlyZXR1cm4gaHctPmZsYXNoX2RhdGFfb2ZmIHwgZmFkZHI7Cit9CisKK3N0YXRpYyB1aW50MzJfdCAqCitxbGE0Xzh4eHhfcmVhZF9mbGFzaF9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKmR3cHRyLAorICAgIHVpbnQzMl90IGZhZGRyLCB1aW50MzJfdCBsZW5ndGgpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCB2YWw7CisJaW50IGxvb3BzID0gMDsKKwl3aGlsZSAoKHFsYTRfOHh4eF9yb21fbG9jayhoYSkgIT0gMCkgJiYgKGxvb3BzIDwgNTAwMDApKSB7CisJCXVkZWxheSgxMDApOworCQljb25kX3Jlc2NoZWQoKTsKKwkJbG9vcHMrKzsKKwl9CisJaWYgKGxvb3BzID49IDUwMDAwKSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlJPTSBsb2NrIGZhaWxlZFxuIik7CisJCXJldHVybiBkd3B0cjsKKwl9CisKKwkvKiBEd29yZCByZWFkcyB0byBmbGFzaC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoLzQ7IGkrKywgZmFkZHIgKz0gNCkgeworCQlpZiAocWxhNF84eHh4X2RvX3JvbV9mYXN0X3JlYWQoaGEsIGZhZGRyLCAmdmFsKSkgeworCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJEbyBST00gZmFzdCByZWFkIGZhaWxlZFxuIik7CisJCQlnb3RvIGRvbmVfcmVhZDsKKwkJfQorCQlkd3B0cltpXSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIodmFsKTsKKwl9CisKK2RvbmVfcmVhZDoKKwlxbGE0Xzh4eHhfcm9tX3VubG9jayhoYSk7CisJcmV0dXJuIGR3cHRyOworfQorCisvKioKKyAqIEFkZHJlc3MgYW5kIGxlbmd0aCBhcmUgYnl0ZSBhZGRyZXNzCisgKiovCitzdGF0aWMgdWludDhfdCAqCitxbGE0Xzh4eHhfcmVhZF9vcHRyb21fZGF0YShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQ4X3QgKmJ1ZiwKKwkJdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsZW5ndGgpCit7CisJcWxhNF84eHh4X3JlYWRfZmxhc2hfZGF0YShoYSwgKHVpbnQzMl90ICopYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludAorcWxhNF84eHh4X2ZpbmRfZmx0X3N0YXJ0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKnN0YXJ0KQoreworCWNvbnN0IGNoYXIgKmxvYywgKmxvY2F0aW9uc1tdID0geyAiREVGIiwgIlBDSSIgfTsKKworCS8qCisJICogRkxULWxvY2F0aW9uIHN0cnVjdHVyZSByZXNpZGVzIGFmdGVyIHRoZSBsYXN0IFBDSSByZWdpb24uCisJICovCisKKwkvKiBCZWdpbiB3aXRoIHNhbmUgZGVmYXVsdHMuICovCisJbG9jID0gbG9jYXRpb25zWzBdOworCSpzdGFydCA9IEZBX0ZMQVNIX0xBWU9VVF9BRERSXzgyOworCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkZMVExbJXNdID0gMHgleC5cbiIsIGxvYywgKnN0YXJ0KSk7CisJcmV0dXJuIFFMQV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZAorcWxhNF84eHh4X2dldF9mbHRfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGZsdF9hZGRyKQoreworCWNvbnN0IGNoYXIgKmxvYywgKmxvY2F0aW9uc1tdID0geyAiREVGIiwgIkZMVCIgfTsKKwl1aW50MTZfdCAqd3B0cjsKKwl1aW50MTZfdCBjbnQsIGNoa3N1bTsKKwl1aW50MzJfdCBzdGFydDsKKwlzdHJ1Y3QgcWxhX2ZsdF9oZWFkZXIgKmZsdDsKKwlzdHJ1Y3QgcWxhX2ZsdF9yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgcWw4Mnh4X2h3X2RhdGEgKmh3ID0gJmhhLT5odzsKKworCWh3LT5mbHRfcmVnaW9uX2ZsdCA9IGZsdF9hZGRyOworCXdwdHIgPSAodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nOworCWZsdCA9IChzdHJ1Y3QgcWxhX2ZsdF9oZWFkZXIgKiloYS0+cmVxdWVzdF9yaW5nOworCXJlZ2lvbiA9IChzdHJ1Y3QgcWxhX2ZsdF9yZWdpb24gKikmZmx0WzFdOworCXFsYTRfOHh4eF9yZWFkX29wdHJvbV9kYXRhKGhhLCAodWludDhfdCAqKWhhLT5yZXF1ZXN0X3JpbmcsCisJCQlmbHRfYWRkciA8PCAyLCBPUFRST01fQlVSU1RfU0laRSk7CisJaWYgKCp3cHRyID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhmZmZmKSkKKwkJZ290byBub19mbGFzaF9kYXRhOworCWlmIChmbHQtPnZlcnNpb24gIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKSkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5zdXBwb3J0ZWQgRkxUIGRldGVjdGVkOiAiCisJCQkidmVyc2lvbj0weCV4IGxlbmd0aD0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAorCQkJbGUxNl90b19jcHUoZmx0LT52ZXJzaW9uKSwgbGUxNl90b19jcHUoZmx0LT5sZW5ndGgpLAorCQkJbGUxNl90b19jcHUoZmx0LT5jaGVja3N1bSkpKTsKKwkJZ290byBub19mbGFzaF9kYXRhOworCX0KKworCWNudCA9IChzaXplb2Yoc3RydWN0IHFsYV9mbHRfaGVhZGVyKSArIGxlMTZfdG9fY3B1KGZsdC0+bGVuZ3RoKSkgPj4gMTsKKwlmb3IgKGNoa3N1bSA9IDA7IGNudDsgY250LS0pCisJCWNoa3N1bSArPSBsZTE2X3RvX2NwdSgqd3B0cisrKTsKKwlpZiAoY2hrc3VtKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJJbmNvbnNpc3RlbnQgRkxUIGRldGVjdGVkOiAiCisJCQkidmVyc2lvbj0weCV4IGxlbmd0aD0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAorCQkJbGUxNl90b19jcHUoZmx0LT52ZXJzaW9uKSwgbGUxNl90b19jcHUoZmx0LT5sZW5ndGgpLAorCQkJY2hrc3VtKSk7CisJCWdvdG8gbm9fZmxhc2hfZGF0YTsKKwl9CisKKwlsb2MgPSBsb2NhdGlvbnNbMV07CisJY250ID0gbGUxNl90b19jcHUoZmx0LT5sZW5ndGgpIC8gc2l6ZW9mKHN0cnVjdCBxbGFfZmx0X3JlZ2lvbik7CisJZm9yICggOyBjbnQ7IGNudC0tLCByZWdpb24rKykgeworCQkvKiBTdG9yZSBhZGRyZXNzZXMgYXMgRFdPUkQgb2Zmc2V0cy4gKi8KKwkJc3RhcnQgPSBsZTMyX3RvX2NwdShyZWdpb24tPnN0YXJ0KSA+PiAyOworCisJCURFQlVHMyhxbDRfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiRkxUWyUwMnhdOiBzdGFydD0weCV4ICIKKwkJICAgICJlbmQ9MHgleCBzaXplPTB4JXguXG4iLCBsZTMyX3RvX2NwdShyZWdpb24tPmNvZGUpLCBzdGFydCwKKwkJICAgIGxlMzJfdG9fY3B1KHJlZ2lvbi0+ZW5kKSA+PiAyLCBsZTMyX3RvX2NwdShyZWdpb24tPnNpemUpKSk7CisKKwkJc3dpdGNoIChsZTMyX3RvX2NwdShyZWdpb24tPmNvZGUpICYgMHhmZikgeworCQljYXNlIEZMVF9SRUdfRkRUOgorCQkJaHctPmZsdF9yZWdpb25fZmR0ID0gc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX0JPT1RfQ09ERV84MjoKKwkJCWh3LT5mbHRfcmVnaW9uX2Jvb3QgPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfRldfODI6CisJCQlody0+Zmx0X3JlZ2lvbl9mdyA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19CT09UTE9BRF84MjoKKwkJCWh3LT5mbHRfcmVnaW9uX2Jvb3Rsb2FkID0gc3RhcnQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlnb3RvIGRvbmU7CisKK25vX2ZsYXNoX2RhdGE6CisJLyogVXNlIGhhcmRjb2RlZCBkZWZhdWx0cy4gKi8KKwlsb2MgPSBsb2NhdGlvbnNbMF07CisKKwlody0+Zmx0X3JlZ2lvbl9mZHQgICAgICA9IEZBX0ZMQVNIX0RFU0NSX0FERFJfODI7CisJaHctPmZsdF9yZWdpb25fYm9vdCAgICAgPSBGQV9CT09UX0NPREVfQUREUl84MjsKKwlody0+Zmx0X3JlZ2lvbl9ib290bG9hZCA9IEZBX0JPT1RfTE9BRF9BRERSXzgyOworCWh3LT5mbHRfcmVnaW9uX2Z3ICAgICAgID0gRkFfUklTQ19DT0RFX0FERFJfODI7Citkb25lOgorCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJGTFRbJXNdOiBmbHQ9MHgleCBmZHQ9MHgleCAiCisJICAgICJib290PTB4JXggYm9vdGxvYWQ9MHgleCBmdz0weCV4XG4iLCBsb2MsIGh3LT5mbHRfcmVnaW9uX2ZsdCwKKwkgICAgaHctPmZsdF9yZWdpb25fZmR0LAlody0+Zmx0X3JlZ2lvbl9ib290LCBody0+Zmx0X3JlZ2lvbl9ib290bG9hZCwKKwkgICAgaHctPmZsdF9yZWdpb25fZncpKTsKK30KKworc3RhdGljIHZvaWQKK3FsYTRfOHh4eF9nZXRfZmR0X2luZm8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworI2RlZmluZSBGTEFTSF9CTEtfU0laRV80SyAgICAgICAweDEwMDAKKyNkZWZpbmUgRkxBU0hfQkxLX1NJWkVfMzJLICAgICAgMHg4MDAwCisjZGVmaW5lIEZMQVNIX0JMS19TSVpFXzY0SyAgICAgIDB4MTAwMDAKKwljb25zdCBjaGFyICpsb2MsICpsb2NhdGlvbnNbXSA9IHsgIk1JRCIsICJGRFQiIH07CisJdWludDE2X3QgY250LCBjaGtzdW07CisJdWludDE2X3QgKndwdHI7CisJc3RydWN0IHFsYV9mZHRfbGF5b3V0ICpmZHQ7CisJdWludDE2X3QgbWlkLCBmaWQ7CisJc3RydWN0IHFsODJ4eF9od19kYXRhICpodyA9ICZoYS0+aHc7CisKKwlody0+Zmxhc2hfY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9DT05GOworCWh3LT5mbGFzaF9kYXRhX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0RBVEE7CisKKwl3cHRyID0gKHVpbnQxNl90ICopaGEtPnJlcXVlc3RfcmluZzsKKwlmZHQgPSAoc3RydWN0IHFsYV9mZHRfbGF5b3V0ICopaGEtPnJlcXVlc3RfcmluZzsKKwlxbGE0Xzh4eHhfcmVhZF9vcHRyb21fZGF0YShoYSwgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nLAorCSAgICBody0+Zmx0X3JlZ2lvbl9mZHQgPDwgMiwgT1BUUk9NX0JVUlNUX1NJWkUpOworCisJaWYgKCp3cHRyID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhmZmZmKSkKKwkJZ290byBub19mbGFzaF9kYXRhOworCisJaWYgKGZkdC0+c2lnWzBdICE9ICdRJyB8fCBmZHQtPnNpZ1sxXSAhPSAnTCcgfHwgZmR0LT5zaWdbMl0gIT0gJ0knIHx8CisJICAgIGZkdC0+c2lnWzNdICE9ICdEJykKKwkJZ290byBub19mbGFzaF9kYXRhOworCisJZm9yIChjbnQgPSAwLCBjaGtzdW0gPSAwOyBjbnQgPCBzaXplb2Yoc3RydWN0IHFsYV9mZHRfbGF5b3V0KSA+PiAxOworCSAgICBjbnQrKykKKwkJY2hrc3VtICs9IGxlMTZfdG9fY3B1KCp3cHRyKyspOworCisJaWYgKGNoa3N1bSkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSW5jb25zaXN0ZW50IEZEVCBkZXRlY3RlZDogIgorCQkgICAgImNoZWNrc3VtPTB4JXggaWQ9JWMgdmVyc2lvbj0weCV4LlxuIiwgY2hrc3VtLCBmZHQtPnNpZ1swXSwKKwkJICAgIGxlMTZfdG9fY3B1KGZkdC0+dmVyc2lvbikpKTsKKwkJZ290byBub19mbGFzaF9kYXRhOworCX0KKworCWxvYyA9IGxvY2F0aW9uc1sxXTsKKwltaWQgPSBsZTE2X3RvX2NwdShmZHQtPm1hbl9pZCk7CisJZmlkID0gbGUxNl90b19jcHUoZmR0LT5pZCk7CisJaHctPmZkdF93cnRfZGlzYWJsZSA9IGZkdC0+d3J0X2Rpc2FibGVfYml0czsKKwlody0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihodywgMHgwMzAwIHwgZmR0LT5lcmFzZV9jbWQpOworCWh3LT5mZHRfYmxvY2tfc2l6ZSA9IGxlMzJfdG9fY3B1KGZkdC0+YmxvY2tfc2l6ZSk7CisKKwlpZiAoZmR0LT51bnByb3RlY3Rfc2VjX2NtZCkgeworCQlody0+ZmR0X3VucHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl9hZGRyKGh3LCAweDAzMDAgfAorCQkgICAgZmR0LT51bnByb3RlY3Rfc2VjX2NtZCk7CisJCWh3LT5mZHRfcHJvdGVjdF9zZWNfY21kID0gZmR0LT5wcm90ZWN0X3NlY19jbWQgPworCQkgICAgZmxhc2hfY29uZl9hZGRyKGh3LCAweDAzMDAgfCBmZHQtPnByb3RlY3Rfc2VjX2NtZCkgOgorCQkgICAgZmxhc2hfY29uZl9hZGRyKGh3LCAweDAzMzYpOworCX0KKwlnb3RvIGRvbmU7CisKK25vX2ZsYXNoX2RhdGE6CisJbG9jID0gbG9jYXRpb25zWzBdOworCWh3LT5mZHRfYmxvY2tfc2l6ZSA9IEZMQVNIX0JMS19TSVpFXzY0SzsKK2RvbmU6CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkZEVFslc106ICgweCV4LzB4JXgpIGVyYXNlPTB4JXggIgorCQkicHJvPSV4IHVwcm89JXggd3J0ZD0weCV4IGJsaz0weCV4LlxuIiwgbG9jLCBtaWQsIGZpZCwKKwkJaHctPmZkdF9lcmFzZV9jbWQsIGh3LT5mZHRfcHJvdGVjdF9zZWNfY21kLAorCQlody0+ZmR0X3VucHJvdGVjdF9zZWNfY21kLCBody0+ZmR0X3dydF9kaXNhYmxlLAorCQlody0+ZmR0X2Jsb2NrX3NpemUpKTsKK30KKworc3RhdGljIHZvaWQKK3FsYTRfOHh4eF9nZXRfaWRjX3BhcmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKyNkZWZpbmUgUUxBODJYWF9JRENfUEFSQU1fQUREUiAgICAgIDB4MDAzZTg4NWMKKwl1aW50MzJfdCAqd3B0cjsKKworCWlmICghaXNfcWxhODAyMihoYSkpCisJCXJldHVybjsKKwl3cHRyID0gKHVpbnQzMl90ICopaGEtPnJlcXVlc3RfcmluZzsKKwlxbGE0Xzh4eHhfcmVhZF9vcHRyb21fZGF0YShoYSwgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nLAorCQkJUUxBODJYWF9JRENfUEFSQU1fQUREUiAsIDgpOworCisJaWYgKCp3cHRyID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikpIHsKKwkJaGEtPm54X2Rldl9pbml0X3RpbWVvdXQgPSBST01fREVWX0lOSVRfVElNRU9VVDsKKwkJaGEtPm54X3Jlc2V0X3RpbWVvdXQgPSBST01fRFJWX1JFU0VUX0FDS19USU1FT1VUOworCX0gZWxzZSB7CisJCWhhLT5ueF9kZXZfaW5pdF90aW1lb3V0ID0gbGUzMl90b19jcHUoKndwdHIrKyk7CisJCWhhLT5ueF9yZXNldF90aW1lb3V0ID0gbGUzMl90b19jcHUoKndwdHIpOworCX0KKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fREVCVUcsIGhhLAorCQkiaGEtPm54X2Rldl9pbml0X3RpbWVvdXQgPSAlZFxuIiwgaGEtPm54X2Rldl9pbml0X3RpbWVvdXQpKTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0RFQlVHLCBoYSwKKwkJImhhLT5ueF9yZXNldF90aW1lb3V0ID0gJWRcbiIsIGhhLT5ueF9yZXNldF90aW1lb3V0KSk7CisJcmV0dXJuOworfQorCitpbnQKK3FsYTRfOHh4eF9nZXRfZmxhc2hfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IHJldDsKKwl1aW50MzJfdCBmbHRfYWRkcjsKKworCXJldCA9IHFsYTRfOHh4eF9maW5kX2ZsdF9zdGFydChoYSwgJmZsdF9hZGRyKTsKKwlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gcmV0OworCisJcWxhNF84eHh4X2dldF9mbHRfaW5mbyhoYSwgZmx0X2FkZHIpOworCXFsYTRfOHh4eF9nZXRfZmR0X2luZm8oaGEpOworCXFsYTRfOHh4eF9nZXRfaWRjX3BhcmFtKGhhKTsKKworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworLyoqCisgKiBxbGE0Xzh4eHhfc3RvcF9maXJtd2FyZSAtIHN0b3BzIGZpcm13YXJlIG9uIHNwZWNpZmllZCBhZGFwdGVyIGluc3RhbmNlCisgKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKiBSZW1hcmtzOgorICogRm9yIGlTQ1NJLCB0aHJvd3MgYXdheSBhbGwgSS9PIGFuZCBBRU5zIGludG8gYml0IGJ1Y2tldCwgc28gdGhleSB3aWxsCisgKiBub3QgYmUgYXZhaWxhYmxlIGFmdGVyIHN1Y2Nlc3NmdWwgcmV0dXJuLiAgRHJpdmVyIG11c3QgY2xlYW51cCBwb3RlbnRpYWwKKyAqIG91dHN0YW5kaW5nIEkvTydzIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jaW9uLgorICoqLworaW50CitxbGE0Xzh4eHhfc3RvcF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX1NUT1BfRlc7CisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIE1CT1hfUkVHX0NPVU5ULCAxLAorCSAgICAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSk7CisKKwlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogc3RhdHVzID0gJWRcbiIsIGhhLT5ob3N0X25vLAorCSAgICBfX2Z1bmNfXywgc3RhdHVzKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBxbGE0Xzh4eHhfaXNwX3Jlc2V0IC0gUmVzZXRzIElTUCBhbmQgYWJvcnRzIGFsbCBvdXRzdGFuZGluZyBjb21tYW5kcy4KKyAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgorICoqLworaW50CitxbGE0Xzh4eHhfaXNwX3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpbnQgcnZhbDsKKwl1aW50MzJfdCBkZXZfc3RhdGU7CisKKwlxbGE0Xzh4eHhfaWRjX2xvY2soaGEpOworCWRldl9zdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKKworCWlmIChkZXZfc3RhdGUgPT0gUUxBODJYWF9ERVZfUkVBRFkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IE5FRUQgUkVTRVRcbiIpOworCQlxbGE0Xzh4eHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKKwkJICAgIFFMQTgyWFhfREVWX05FRURfUkVTRVQpOworCX0gZWxzZQorCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogREVWSUNFIElOSVRJQUxJWklOR1xuIik7CisKKwlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CisKKwlydmFsID0gcWxhNF84eHh4X2RldmljZV9zdGF0ZV9oYW5kbGVyKGhhKTsKKworCXFsYTRfOHh4eF9pZGNfbG9jayhoYSk7CisJcWxhNF84eHh4X2NsZWFyX3JzdF9yZWFkeShoYSk7CisJcWxhNF84eHh4X2lkY191bmxvY2soaGEpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKgorICogcWxhNF84eHh4X2dldF9zeXNfaW5mbyAtIGdldCBhZGFwdGVyIE1BQyBhZGRyZXNzKGVzKSBhbmQgc2VyaWFsIG51bWJlcgorICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKgorICoqLworaW50IHFsYTRfOHh4eF9nZXRfc3lzX2luZm8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJc3RydWN0IG1ieF9zeXNfaW5mbyAqc3lzX2luZm87CisJZG1hX2FkZHJfdCBzeXNfaW5mb19kbWE7CisJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKKworCXN5c19pbmZvID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKnN5c19pbmZvKSwKKwkJCQkgICAgICAmc3lzX2luZm9fZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3lzX2luZm8gPT0gTlVMTCkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXIuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWVtc2V0KHN5c19pbmZvLCAwLCBzaXplb2YoKnN5c19pbmZvKSk7CisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0dFVF9TWVNfSU5GTzsKKwltYm94X2NtZFsxXSA9IExTRFcoc3lzX2luZm9fZG1hKTsKKwltYm94X2NtZFsyXSA9IE1TRFcoc3lzX2luZm9fZG1hKTsKKwltYm94X2NtZFs0XSA9IHNpemVvZigqc3lzX2luZm8pOworCisJaWYgKHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCBNQk9YX1JFR19DT1VOVCwgNiwgJm1ib3hfY21kWzBdLAorCSAgICAmbWJveF9zdHNbMF0pICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBHRVRfU1lTX0lORk8gZmFpbGVkXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCWdvdG8gZXhpdF92YWxpZGF0ZV9tYWM4MjsKKwl9CisKKwlpZiAobWJveF9zdHNbNF0gPCBzaXplb2YoKnN5c19pbmZvKSkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogR0VUX1NZU19JTkZPIGRhdGEgcmVjZWl2ZSIKKwkJICAgICIgZXJyb3IgKCV4KVxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBtYm94X3N0c1s0XSkpOworCQlnb3RvIGV4aXRfdmFsaWRhdGVfbWFjODI7CisKKwl9CisKKwkvKiBTYXZlIE0uQS5DLiBhZGRyZXNzICYgc2VyaWFsX251bWJlciAqLworCW1lbWNweShoYS0+bXlfbWFjLCAmc3lzX2luZm8tPm1hY19hZGRyWzBdLAorCSAgICBtaW4oc2l6ZW9mKGhhLT5teV9tYWMpLCBzaXplb2Yoc3lzX2luZm8tPm1hY19hZGRyKSkpOworCW1lbWNweShoYS0+c2VyaWFsX251bWJlciwgJnN5c19pbmZvLT5zZXJpYWxfbnVtYmVyLAorCSAgICBtaW4oc2l6ZW9mKGhhLT5zZXJpYWxfbnVtYmVyKSwgc2l6ZW9mKHN5c19pbmZvLT5zZXJpYWxfbnVtYmVyKSkpOworCisJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6ICIKKwkgICAgIm1hYyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiCisJICAgICJzZXJpYWwgJXNcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkgICAgaGEtPm15X21hY1swXSwgaGEtPm15X21hY1sxXSwgaGEtPm15X21hY1syXSwKKwkgICAgaGEtPm15X21hY1szXSwgaGEtPm15X21hY1s0XSwgaGEtPm15X21hY1s1XSwKKwkgICAgaGEtPnNlcmlhbF9udW1iZXIpKTsKKworCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCitleGl0X3ZhbGlkYXRlX21hYzgyOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKnN5c19pbmZvKSwgc3lzX2luZm8sCisJCQkgIHN5c19pbmZvX2RtYSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogSW50ZXJydXB0IGhhbmRsaW5nIGhlbHBlcnMuICovCisKK3N0YXRpYyBpbnQKK3FsYTRfOHh4eF9tYnhfaW50cl9lbmFibGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXNcbiIsIF9fZnVuY19fKSk7CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0VOQUJMRV9JTlRSUzsKKwltYm94X2NtZFsxXSA9IElOVFJfRU5BQkxFOworCWlmIChxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDEsICZtYm94X2NtZFswXSwKKwkJJm1ib3hfc3RzWzBdKSAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIiVzOiBNQk9YX0NNRF9FTkFCTEVfSU5UUlMgZmFpbGVkICgweCUwNHgpXG4iLAorCQkgICAgX19mdW5jX18sIG1ib3hfc3RzWzBdKSk7CisJCXJldHVybiBRTEFfRVJST1I7CisJfQorCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorcWxhNF84eHh4X21ieF9pbnRyX2Rpc2FibGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXNcbiIsIF9fZnVuY19fKSk7CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0VOQUJMRV9JTlRSUzsKKwltYm94X2NtZFsxXSA9IElOVFJfRElTQUJMRTsKKwlpZiAocWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIE1CT1hfUkVHX0NPVU5ULCAxLCAmbWJveF9jbWRbMF0sCisJICAgICZtYm94X3N0c1swXSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSIlczogTUJPWF9DTURfRU5BQkxFX0lOVFJTIGZhaWxlZCAoMHglMDR4KVxuIiwKKwkJCV9fZnVuY19fLCBtYm94X3N0c1swXSkpOworCQlyZXR1cm4gUUxBX0VSUk9SOworCX0KKworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKwordm9pZAorcWxhNF84eHh4X2VuYWJsZV9pbnRycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcWxhNF84eHh4X21ieF9pbnRyX2VuYWJsZShoYSk7CisKKwlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJLyogQklUIDEwIC0gcmVzZXQgKi8KKwlxbGE0Xzh4eHhfd3JfMzIoaGEsIGhhLT5ueF9sZWdhY3lfaW50ci50Z3RfbWFza19yZWcsIDB4ZmJmZik7CisJc3Bpbl91bmxvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJc2V0X2JpdChBRl9JTlRFUlJVUFRTX09OLCAmaGEtPmZsYWdzKTsKK30KKwordm9pZAorcWxhNF84eHh4X2Rpc2FibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWlmICh0ZXN0X2JpdChBRl9JTlRFUlJVUFRTX09OLCAmaGEtPmZsYWdzKSkKKwkJcWxhNF84eHh4X21ieF9pbnRyX2Rpc2FibGUoaGEpOworCisJc3Bpbl9sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCS8qIEJJVCAxMCAtIHNldCAqLworCXFsYTRfOHh4eF93cl8zMihoYSwgaGEtPm54X2xlZ2FjeV9pbnRyLnRndF9tYXNrX3JlZywgMHgwNDAwKTsKKwlzcGluX3VubG9ja19pcnEoJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwljbGVhcl9iaXQoQUZfSU5URVJSVVBUU19PTiwgJmhhLT5mbGFncyk7Cit9CisKK3N0cnVjdCBxbDRfaW5pdF9tc2l4X2VudHJ5IHsKKwl1aW50MTZfdCBlbnRyeTsKKwl1aW50MTZfdCBpbmRleDsKKwljb25zdCBjaGFyICpuYW1lOworCWlycV9oYW5kbGVyX3QgaGFuZGxlcjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWw0X2luaXRfbXNpeF9lbnRyeSBxbGE0Xzh4eHhfbXNpeF9lbnRyaWVzW1FMQV9NU0lYX0VOVFJJRVNdID0geworCXsgUUxBX01TSVhfREVGQVVMVCwgUUxBX01JRFhfREVGQVVMVCwKKwkgICAgInFsYTR4eHggKGRlZmF1bHQpIiwKKwkgICAgKGlycV9oYW5kbGVyX3QpcWxhNF84eHh4X2RlZmF1bHRfaW50cl9oYW5kbGVyIH0sCisJeyBRTEFfTVNJWF9SU1BfUSwgUUxBX01JRFhfUlNQX1EsCisJICAgICJxbGE0eHh4IChyc3BfcSkiLCAoaXJxX2hhbmRsZXJfdClxbGE0Xzh4eHhfbXNpeF9yc3BfcSB9LAorfTsKKwordm9pZAorcWxhNF84eHh4X2Rpc2FibGVfbXNpeChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IGk7CisJc3RydWN0IHFsNF9tc2l4X2VudHJ5ICpxZW50cnk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUxBX01TSVhfRU5UUklFUzsgaSsrKSB7CisJCXFlbnRyeSA9ICZoYS0+bXNpeF9lbnRyaWVzW3FsYTRfOHh4eF9tc2l4X2VudHJpZXNbaV0uaW5kZXhdOworCQlpZiAocWVudHJ5LT5oYXZlX2lycSkgeworCQkJZnJlZV9pcnEocWVudHJ5LT5tc2l4X3ZlY3RvciwgaGEpOworCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgcWxhNF84eHh4X21zaXhfZW50cmllc1tpXS5uYW1lKSk7CisJCX0KKwl9CisJcGNpX2Rpc2FibGVfbXNpeChoYS0+cGRldik7CisJY2xlYXJfYml0KEFGX01TSVhfRU5BQkxFRCwgJmhhLT5mbGFncyk7Cit9CisKK2ludAorcWxhNF84eHh4X2VuYWJsZV9tc2l4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbUUxBX01TSVhfRU5UUklFU107CisJc3RydWN0IHFsNF9tc2l4X2VudHJ5ICpxZW50cnk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUxBX01TSVhfRU5UUklFUzsgaSsrKQorCQllbnRyaWVzW2ldLmVudHJ5ID0gcWxhNF84eHh4X21zaXhfZW50cmllc1tpXS5lbnRyeTsKKworCXJldCA9IHBjaV9lbmFibGVfbXNpeChoYS0+cGRldiwgZW50cmllcywgQVJSQVlfU0laRShlbnRyaWVzKSk7CisJaWYgKHJldCkgeworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiTVNJLVg6IEZhaWxlZCB0byBlbmFibGUgc3VwcG9ydCAtLSAlZC8lZFxuIiwKKwkJICAgIFFMQV9NU0lYX0VOVFJJRVMsIHJldCk7CisJCWdvdG8gbXNpeF9vdXQ7CisJfQorCXNldF9iaXQoQUZfTVNJWF9FTkFCTEVELCAmaGEtPmZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBRTEFfTVNJWF9FTlRSSUVTOyBpKyspIHsKKwkJcWVudHJ5ID0gJmhhLT5tc2l4X2VudHJpZXNbcWxhNF84eHh4X21zaXhfZW50cmllc1tpXS5pbmRleF07CisJCXFlbnRyeS0+bXNpeF92ZWN0b3IgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwkJcWVudHJ5LT5tc2l4X2VudHJ5ID0gZW50cmllc1tpXS5lbnRyeTsKKwkJcWVudHJ5LT5oYXZlX2lycSA9IDA7CisJCXJldCA9IHJlcXVlc3RfaXJxKHFlbnRyeS0+bXNpeF92ZWN0b3IsCisJCSAgICBxbGE0Xzh4eHhfbXNpeF9lbnRyaWVzW2ldLmhhbmRsZXIsIDAsCisJCSAgICBxbGE0Xzh4eHhfbXNpeF9lbnRyaWVzW2ldLm5hbWUsIGhhKTsKKwkJaWYgKHJldCkgeworCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNU0ktWDogVW5hYmxlIHRvIHJlZ2lzdGVyIGhhbmRsZXIgLS0gJXgvJWQuXG4iLAorCQkJICAgIHFsYTRfOHh4eF9tc2l4X2VudHJpZXNbaV0uaW5kZXgsIHJldCk7CisJCQlxbGE0Xzh4eHhfZGlzYWJsZV9tc2l4KGhhKTsKKwkJCWdvdG8gbXNpeF9vdXQ7CisJCX0KKwkJcWVudHJ5LT5oYXZlX2lycSA9IDE7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogJXNcbiIsCisJCQlfX2Z1bmNfXywgcWxhNF84eHh4X21zaXhfZW50cmllc1tpXS5uYW1lKSk7CisJfQorbXNpeF9vdXQ6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxYWQzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5oCkBAIC0wLDAgKzEsNzc5IEBACisvKgorICogUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19RTEFfTlhfSAorI2RlZmluZSBfX1FMQV9OWF9ICisKKy8qCisgKiBGb2xsb3dpbmcgYXJlIHRoZSBzdGF0ZXMgb2YgdGhlIFBoYW50b20uIFBoYW50b20gd2lsbCBzZXQgdGhlbSBhbmQKKyAqIEhvc3Qgd2lsbCByZWFkIHRvIGNoZWNrIGlmIHRoZSBmaWVsZHMgYXJlIGNvcnJlY3QuCisqLworI2RlZmluZSBQSEFOX0lOSVRJQUxJWkVfRkFJTEVECQkweGZmZmYKKyNkZWZpbmUgUEhBTl9JTklUSUFMSVpFX0NPTVBMRVRFCTB4ZmYwMQorCisvKiBIb3N0IHdyaXRlcyB0aGUgZm9sbG93aW5nIHRvIG5vdGlmeSB0aGF0IGl0IGhhcyBkb25lIHRoZSBpbml0LWhhbmRzaGFrZSAqLworI2RlZmluZSBQSEFOX0lOSVRJQUxJWkVfQUNLCQkweGYwMGYKKyNkZWZpbmUgUEhBTl9QRUdfUkNWX0lOSVRJQUxJWkVECTB4ZmYwMQorCisvKkNSQl9SRUxBVEVEKi8KKyNkZWZpbmUgUUxBODJYWF9DUkJfQkFTRQlRTEE4MlhYX0NBTV9SQU0oMHgyMDApCisjZGVmaW5lIFFMQTgyWFhfUkVHKFgpCQkoUUxBODJYWF9DUkJfQkFTRSsoWCkpCisKKyNkZWZpbmUgQ1JCX0NNRFBFR19TVEFURQkJUUxBODJYWF9SRUcoMHg1MCkKKyNkZWZpbmUgQ1JCX1JDVlBFR19TVEFURQkJUUxBODJYWF9SRUcoMHgxM2MpCisjZGVmaW5lIEJPT1RfTE9BREVSX0RJTU1fU1RBVFVTCQlRTEE4MlhYX1JFRygweDU0KQorI2RlZmluZSBDUkJfRE1BX1NISUZUCQkJUUxBODJYWF9SRUcoMHhjYykKKworI2RlZmluZSBRTEE4MlhYX0hXX0gwX0NIX0hVQl9BRFIJMHgwNQorI2RlZmluZSBRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIJMHgwRQorI2RlZmluZSBRTEE4MlhYX0hXX0gyX0NIX0hVQl9BRFIJMHgwMworI2RlZmluZSBRTEE4MlhYX0hXX0gzX0NIX0hVQl9BRFIJMHgwMQorI2RlZmluZSBRTEE4MlhYX0hXX0g0X0NIX0hVQl9BRFIJMHgwNgorI2RlZmluZSBRTEE4MlhYX0hXX0g1X0NIX0hVQl9BRFIJMHgwNworI2RlZmluZSBRTEE4MlhYX0hXX0g2X0NIX0hVQl9BRFIJMHgwOAorCisvKiAgSHViIDAgKi8KKyNkZWZpbmUgUUxBODJYWF9IV19NTl9DUkJfQUdUX0FEUgkweDE1CisjZGVmaW5lIFFMQTgyWFhfSFdfTVNfQ1JCX0FHVF9BRFIJMHgyNQorCisvKiAgSHViIDEgKi8KKyNkZWZpbmUgUUxBODJYWF9IV19QU19DUkJfQUdUX0FEUgkweDczCisjZGVmaW5lIFFMQTgyWFhfSFdfUU1TX0NSQl9BR1RfQURSCTB4MDAKKyNkZWZpbmUgUUxBODJYWF9IV19SUE1YM19DUkJfQUdUX0FEUgkweDBiCisjZGVmaW5lIFFMQTgyWFhfSFdfU1FHUzBfQ1JCX0FHVF9BRFIJMHgwMQorI2RlZmluZSBRTEE4MlhYX0hXX1NRR1MxX0NSQl9BR1RfQURSCTB4MDIKKyNkZWZpbmUgUUxBODJYWF9IV19TUUdTMl9DUkJfQUdUX0FEUgkweDAzCisjZGVmaW5lIFFMQTgyWFhfSFdfU1FHUzNfQ1JCX0FHVF9BRFIJMHgwNAorI2RlZmluZSBRTEE4MlhYX0hXX0MyQzBfQ1JCX0FHVF9BRFIJMHg1OAorI2RlZmluZSBRTEE4MlhYX0hXX0MyQzFfQ1JCX0FHVF9BRFIJMHg1OQorI2RlZmluZSBRTEE4MlhYX0hXX0MyQzJfQ1JCX0FHVF9BRFIJMHg1YQorI2RlZmluZSBRTEE4MlhYX0hXX1JQTVgyX0NSQl9BR1RfQURSCTB4MGEKKyNkZWZpbmUgUUxBODJYWF9IV19SUE1YNF9DUkJfQUdUX0FEUgkweDBjCisjZGVmaW5lIFFMQTgyWFhfSFdfUlBNWDdfQ1JCX0FHVF9BRFIJMHgwZgorI2RlZmluZSBRTEE4MlhYX0hXX1JQTVg5X0NSQl9BR1RfQURSCTB4MTIKKyNkZWZpbmUgUUxBODJYWF9IV19TTUJfQ1JCX0FHVF9BRFIJMHgxOAorCisvKiAgSHViIDIgKi8KKyNkZWZpbmUgUUxBODJYWF9IV19OSVVfQ1JCX0FHVF9BRFIJMHgzMQorI2RlZmluZSBRTEE4MlhYX0hXX0kyQzBfQ1JCX0FHVF9BRFIJMHgxOQorI2RlZmluZSBRTEE4MlhYX0hXX0kyQzFfQ1JCX0FHVF9BRFIJMHgyOQorCisjZGVmaW5lIFFMQTgyWFhfSFdfU05fQ1JCX0FHVF9BRFIJMHgxMAorI2RlZmluZSBRTEE4MlhYX0hXX0kyUV9DUkJfQUdUX0FEUgkweDIwCisjZGVmaW5lIFFMQTgyWFhfSFdfTFBDX0NSQl9BR1RfQURSCTB4MjIKKyNkZWZpbmUgUUxBODJYWF9IV19ST01VU0JfQ1JCX0FHVF9BRFIgICAweDIxCisjZGVmaW5lIFFMQTgyWFhfSFdfUU1fQ1JCX0FHVF9BRFIJMHg2NgorI2RlZmluZSBRTEE4MlhYX0hXX1NRRzBfQ1JCX0FHVF9BRFIJMHg2MAorI2RlZmluZSBRTEE4MlhYX0hXX1NRRzFfQ1JCX0FHVF9BRFIJMHg2MQorI2RlZmluZSBRTEE4MlhYX0hXX1NRRzJfQ1JCX0FHVF9BRFIJMHg2MgorI2RlZmluZSBRTEE4MlhYX0hXX1NRRzNfQ1JCX0FHVF9BRFIJMHg2MworI2RlZmluZSBRTEE4MlhYX0hXX1JQTVgxX0NSQl9BR1RfQURSICAgIDB4MDkKKyNkZWZpbmUgUUxBODJYWF9IV19SUE1YNV9DUkJfQUdUX0FEUiAgICAweDBkCisjZGVmaW5lIFFMQTgyWFhfSFdfUlBNWDZfQ1JCX0FHVF9BRFIgICAgMHgwZQorI2RlZmluZSBRTEE4MlhYX0hXX1JQTVg4X0NSQl9BR1RfQURSICAgIDB4MTEKKworLyogIEh1YiAzICovCisjZGVmaW5lIFFMQTgyWFhfSFdfUEhfQ1JCX0FHVF9BRFIJMHgxQQorI2RlZmluZSBRTEE4MlhYX0hXX1NSRV9DUkJfQUdUX0FEUgkweDUwCisjZGVmaW5lIFFMQTgyWFhfSFdfRUdfQ1JCX0FHVF9BRFIJMHg1MQorI2RlZmluZSBRTEE4MlhYX0hXX1JQTVgwX0NSQl9BR1RfQURSCTB4MDgKKworLyogIEh1YiA0ICovCisjZGVmaW5lIFFMQTgyWFhfSFdfUEVHTjBfQ1JCX0FHVF9BRFIJMHg0MAorI2RlZmluZSBRTEE4MlhYX0hXX1BFR04xX0NSQl9BR1RfQURSCTB4NDEKKyNkZWZpbmUgUUxBODJYWF9IV19QRUdOMl9DUkJfQUdUX0FEUgkweDQyCisjZGVmaW5lIFFMQTgyWFhfSFdfUEVHTjNfQ1JCX0FHVF9BRFIJMHg0MworI2RlZmluZSBRTEE4MlhYX0hXX1BFR05JX0NSQl9BR1RfQURSCTB4NDQKKyNkZWZpbmUgUUxBODJYWF9IV19QRUdORF9DUkJfQUdUX0FEUgkweDQ1CisjZGVmaW5lIFFMQTgyWFhfSFdfUEVHTkNfQ1JCX0FHVF9BRFIJMHg0NgorI2RlZmluZSBRTEE4MlhYX0hXX1BFR1IwX0NSQl9BR1RfQURSCTB4NDcKKyNkZWZpbmUgUUxBODJYWF9IV19QRUdSMV9DUkJfQUdUX0FEUgkweDQ4CisjZGVmaW5lIFFMQTgyWFhfSFdfUEVHUjJfQ1JCX0FHVF9BRFIJMHg0OQorI2RlZmluZSBRTEE4MlhYX0hXX1BFR1IzX0NSQl9BR1RfQURSCTB4NGEKKyNkZWZpbmUgUUxBODJYWF9IV19QRUdONF9DUkJfQUdUX0FEUgkweDRiCisKKy8qICBIdWIgNSAqLworI2RlZmluZSBRTEE4MlhYX0hXX1BFR1MwX0NSQl9BR1RfQURSCTB4NDAKKyNkZWZpbmUgUUxBODJYWF9IV19QRUdTMV9DUkJfQUdUX0FEUgkweDQxCisjZGVmaW5lIFFMQTgyWFhfSFdfUEVHUzJfQ1JCX0FHVF9BRFIJMHg0MgorI2RlZmluZSBRTEE4MlhYX0hXX1BFR1MzX0NSQl9BR1RfQURSCTB4NDMKKworI2RlZmluZSBRTEE4MlhYX0hXX1BFR1NJX0NSQl9BR1RfQURSCTB4NDQKKyNkZWZpbmUgUUxBODJYWF9IV19QRUdTRF9DUkJfQUdUX0FEUgkweDQ1CisjZGVmaW5lIFFMQTgyWFhfSFdfUEVHU0NfQ1JCX0FHVF9BRFIJMHg0NgorCisvKiAgSHViIDYgKi8KKyNkZWZpbmUgUUxBODJYWF9IV19DQVMwX0NSQl9BR1RfQURSCTB4NDYKKyNkZWZpbmUgUUxBODJYWF9IV19DQVMxX0NSQl9BR1RfQURSCTB4NDcKKyNkZWZpbmUgUUxBODJYWF9IV19DQVMyX0NSQl9BR1RfQURSCTB4NDgKKyNkZWZpbmUgUUxBODJYWF9IV19DQVMzX0NSQl9BR1RfQURSCTB4NDkKKyNkZWZpbmUgUUxBODJYWF9IV19OQ01fQ1JCX0FHVF9BRFIJMHgxNgorI2RlZmluZSBRTEE4MlhYX0hXX1RNUl9DUkJfQUdUX0FEUgkweDE3CisjZGVmaW5lIFFMQTgyWFhfSFdfWERNQV9DUkJfQUdUX0FEUgkweDA1CisjZGVmaW5lIFFMQTgyWFhfSFdfT0NNMF9DUkJfQUdUX0FEUgkweDA2CisjZGVmaW5lIFFMQTgyWFhfSFdfT0NNMV9DUkJfQUdUX0FEUgkweDA3CisKKy8qICBUaGlzIGZpZWxkIGRlZmluZXMgUENJL1ggYWRyIFsyNToyMF0gb2YgYWdlbnRzIG9uIHRoZSBDUkIgKi8KKy8qICAqLworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEgJMAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUFMJMQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfTU4JMgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfTVMJMworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1JFCTUKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX05JVQk2CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9RTU4JNworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FOMAk4CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9TUU4xCTkKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NRTjIJMTAKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NRTjMJMTEKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1FNUwkxMgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FTMAkxMworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FTMQkxNAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FTMgkxNQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FTMwkxNgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdOMAkxNworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdOMQkxOAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdOMgkxOQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdOMwkyMAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdONAlRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FTMgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdORAkyMQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdOSQkyMgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTMAkyMworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTMQkyNAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTMgkyNQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTMwkyNgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTRAkyNworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTSQkyOAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfU04JMjkKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX0VHCTMxCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QSDIJMzIKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BTMgkzMworI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfQ0FNCTM0CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DQVMwCTM1CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DQVMxCTM2CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DQVMyCTM3CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DMkMwCTM4CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DMkMxCTM5CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9USU1SCTQwCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YMQk0MgorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUlBNWDIJNDMKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1JQTVgzCTQ0CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YNAk0NQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUlBNWDUJNDYKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1JQTVg2CTQ3CisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YNwk0OAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfWERNQQk0OQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfSTJRCTUwCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9ST01VU0IgICAgNTEKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX0NBUzMJNTIKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1JQTVgwCTUzCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YOAk1NAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfUlBNWDkJNTUKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX09DTTAJNTYKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX09DTTEJNTcKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NNQgk1OAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfSTJDMAk1OQorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfSTJDMQk2MAorI2RlZmluZSBRTEE4MlhYX0hXX1BYX01BUF9DUkJfTFBDCTYxCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR05DCTYyCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR1IwCTYzCisjZGVmaW5lIFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR1IxCTQKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHUjIJMzAKKyNkZWZpbmUgUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHUjMJNDEKKworLyogIFRoaXMgZmllbGQgZGVmaW5lcyBDUkIgYWRyIFszMToyMF0gb2YgdGhlIGFnZW50cyAqLworLyogICovCisKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfTU4JKChRTEE4MlhYX0hXX0gwX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCVFMQTgyWFhfSFdfTU5fQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BICSgoUUxBODJYWF9IV19IMF9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQlRTEE4MlhYX0hXX1BIX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9NUwkoKFFMQTgyWFhfSFdfSDBfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJUUxBODJYWF9IV19NU19DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUFMJKChRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCVFMQTgyWFhfSFdfUFNfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1NTCSgoUUxBODJYWF9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQlRTEE4MlhYX0hXX1NTX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMyAgICAoKFFMQTgyWFhfSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUlBNWDNfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1FNUwkgICAgKChRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1FNU19DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU1FTMCAgICAgKChRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1NRR1MwX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9TUVMxICAgICAoKFFMQTgyWFhfSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfU1FHUzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1NRUzIgICAgICgoUUxBODJYWF9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19TUUdTMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU1FTMyAgICAgKChRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1NRR1MzX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9DMkMwICAgICAoKFFMQTgyWFhfSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfQzJDMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfQzJDMSAgICAgKChRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX0MyQzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVgyICAgICgoUUxBODJYWF9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19SUE1YMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDQgICAgKChRTEE4MlhYX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1JQTVg0X0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNyAgICAoKFFMQTgyWFhfSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUlBNWDdfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVg5ICAgICgoUUxBODJYWF9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19SUE1YOV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU01CCSAgICAoKFFMQTgyWFhfSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfU01CX0NSQl9BR1RfQURSKQorCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX05JVSAgICAgICgoUUxBODJYWF9IV19IMl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19OSVVfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX0kyQzAgICAgICgoUUxBODJYWF9IV19IMl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19JMkMwX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9JMkMxICAgICAoKFFMQTgyWFhfSFdfSDJfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfSTJDMV9DUkJfQUdUX0FEUikKKworI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9TUkUgICAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfU1JFX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9FRyAgICAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfRUdfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVgwICAgICgoUUxBODJYWF9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19SUE1YMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUU1OICAgICAgKChRTEE4MlhYX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1FNX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9TUU4wICAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfU1FHMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfU1FOMSAgICAgKChRTEE4MlhYX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1NRRzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1NRTjIgICAgICgoUUxBODJYWF9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19TUUcyX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9TUU4zICAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfU1FHM19DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDEgICAgKChRTEE4MlhYX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1JQTVgxX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNSAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUlBNWDVfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVg2ICAgICgoUUxBODJYWF9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19SUE1YNl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUlBNWDggICAgKChRTEE4MlhYX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1JQTVg4X0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9DQVMwICAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfQ0FTMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfQ0FTMSAgICAgKChRTEE4MlhYX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX0NBUzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX0NBUzIgICAgICgoUUxBODJYWF9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19DQVMyX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9DQVMzICAgICAoKFFMQTgyWFhfSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfQ0FTM19DUkJfQUdUX0FEUikKKworI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR05JICAgICAoKFFMQTgyWFhfSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHTklfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHTkQgICAgICgoUUxBODJYWF9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19QRUdORF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdOMCAgICAgKChRTEE4MlhYX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR04wX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR04xICAgICAoKFFMQTgyWFhfSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHTjFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHTjIgICAgICgoUUxBODJYWF9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19QRUdOMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdOMyAgICAgKChRTEE4MlhYX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR04zX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR040ICAgICAoKFFMQTgyWFhfSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHTjRfQ1JCX0FHVF9BRFIpCisKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdOQyAgICAgKChRTEE4MlhYX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR05DX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1IwICAgICAoKFFMQTgyWFhfSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHUjBfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHUjEgICAgICgoUUxBODJYWF9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19QRUdSMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdSMiAgICAgKChRTEE4MlhYX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR1IyX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1IzICAgICAoKFFMQTgyWFhfSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHUjNfQ1JCX0FHVF9BRFIpCisKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdTSSAgICAgKChRTEE4MlhYX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR1NJX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1NEICAgICAoKFFMQTgyWFhfSFdfSDVfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHU0RfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHUzAgICAgICgoUUxBODJYWF9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19QRUdTMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdTMSAgICAgKChRTEE4MlhYX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR1MxX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1MyICAgICAoKFFMQTgyWFhfSFdfSDVfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfUEVHUzJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1BHUzMgICAgICgoUUxBODJYWF9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19QRUdTM19DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfUEdTQyAgICAgKChRTEE4MlhYX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX1BFR1NDX0NSQl9BR1RfQURSKQorCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX0NBTSAgICAgICgoUUxBODJYWF9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19OQ01fQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1RJTVIgICAgICgoUUxBODJYWF9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19UTVJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1hETUEgICAgICgoUUxBODJYWF9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19YRE1BX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9TTiAgICAgICAoKFFMQTgyWFhfSFdfSDZfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfU05fQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX0kyUSAgICAgICgoUUxBODJYWF9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19JMlFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX1JPTVVTQiAgICgoUUxBODJYWF9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19ST01VU0JfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIFFMQTgyWFhfSFdfQ1JCX0hVQl9BR1RfQURSX09DTTAgICAgICgoUUxBODJYWF9IV19INl9DSF9IVUJfQURSIDw8IDcpIHwgXAorCQkJCQkgICAgUUxBODJYWF9IV19PQ00wX0NSQl9BR1RfQURSKQorI2RlZmluZSBRTEE4MlhYX0hXX0NSQl9IVUJfQUdUX0FEUl9PQ00xICAgICAoKFFMQTgyWFhfSFdfSDZfQ0hfSFVCX0FEUiA8PCA3KSB8IFwKKwkJCQkJICAgIFFMQTgyWFhfSFdfT0NNMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgUUxBODJYWF9IV19DUkJfSFVCX0FHVF9BRFJfTFBDICAgICAgKChRTEE4MlhYX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBcCisJCQkJCSAgICBRTEE4MlhYX0hXX0xQQ19DUkJfQUdUX0FEUikKKworI2RlZmluZSBST01VU0JfR0xCCShRTEE4MlhYX0NSQl9ST01VU0IgKyAweDAwMDAwKQorI2RlZmluZSBRTEE4MlhYX1JPTVVTQl9HTEJfUEVHVFVORV9ET05FCQkoUk9NVVNCX0dMQiArIDB4MDA1YykKKyNkZWZpbmUgUUxBODJYWF9ST01VU0JfR0xCX1NUQVRVUwkJKFJPTVVTQl9HTEIgKyAweDAwMDQpCisjZGVmaW5lIFFMQTgyWFhfUk9NVVNCX0dMQl9TV19SRVNFVAkJKFJPTVVTQl9HTEIgKyAweDAwMDgpCisjZGVmaW5lIFFMQTgyWFhfUk9NVVNCX1JPTV9BRERSRVNTCQkoUk9NVVNCX1JPTSArIDB4MDAwOCkKKyNkZWZpbmUgUUxBODJYWF9ST01VU0JfUk9NX1dEQVRBCQkoUk9NVVNCX1JPTSArIDB4MDAwYykKKyNkZWZpbmUgUUxBODJYWF9ST01VU0JfUk9NX0FCWVRFX0NOVAkJKFJPTVVTQl9ST00gKyAweDAwMTApCisjZGVmaW5lIFFMQTgyWFhfUk9NVVNCX1JPTV9EVU1NWV9CWVRFX0NOVAkoUk9NVVNCX1JPTSArIDB4MDAxNCkKKyNkZWZpbmUgUUxBODJYWF9ST01VU0JfUk9NX1JEQVRBCQkoUk9NVVNCX1JPTSArIDB4MDAxOCkKKworI2RlZmluZSBST01VU0JfUk9NCShRTEE4MlhYX0NSQl9ST01VU0IgKyAweDEwMDAwKQorI2RlZmluZSBRTEE4MlhYX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFCShST01VU0JfUk9NICsgMHgwMDA0KQorI2RlZmluZSBRTEE4MlhYX1JPTVVTQl9HTEJfQ0FTX1JTVAkoUk9NVVNCX0dMQiArIDB4MDAzOCkKKworLyogTG9jayBJRHMgZm9yIFJPTSBsb2NrICovCisjZGVmaW5lIFJPTV9MT0NLX0RSSVZFUgkJMHgwZDQxNzM0MAorCisjZGVmaW5lIFFMQTgyWFhfUENJX0NSQl9XSU5ET1dTSVpFCTB4MDAxMDAwMDAgICAgLyogYWxsIGFyZSAxTUIgd2luZG93cyAqLworI2RlZmluZSBRTEE4MlhYX1BDSV9DUkJfV0lORE9XKEEpCShRTEE4MlhYX1BDSV9DUkJTUEFDRSArIFwKKwkJCQkJKEEpKlFMQTgyWFhfUENJX0NSQl9XSU5ET1dTSVpFKQorCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0MyQ18wIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DMkMwKQorI2RlZmluZSBRTEE4MlhYX0NSQl9DMkNfMSBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfQzJDMSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfQzJDXzIgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX0MyQzIpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0NBTQlcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfQ0FNKQorI2RlZmluZSBRTEE4MlhYX0NSQl9DQVNQRVIgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX0NBUykKKyNkZWZpbmUgUUxBODJYWF9DUkJfQ0FTUEVSXzAgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX0NBUzApCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0NBU1BFUl8xIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9DQVMxKQorI2RlZmluZSBRTEE4MlhYX0NSQl9DQVNQRVJfMiBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfQ0FTMikKKyNkZWZpbmUgUUxBODJYWF9DUkJfRERSX01EIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9NUykKKyNkZWZpbmUgUUxBODJYWF9DUkJfRERSX05FVCBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfTU4pCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0VQRyBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfRUcpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0kyUSBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfSTJRKQorI2RlZmluZSBRTEE4MlhYX0NSQl9OSVUJXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX05JVSkKKy8qIEhBQ0sgdXBvbiBIQUNLIHVwb24gSEFDSyAoZm9yIFBDSUUgYnVpbGRzKSAqLworI2RlZmluZSBRTEE4MlhYX0NSQl9QQ0lYX0hPU1QgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BIKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QQ0lYX0hPU1QyIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QSDIpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BDSVhfTUQgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BTKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QQ0lFCVFMQTgyWFhfQ1JCX1BDSVhfTUQKKy8qIHdpbmRvdyAxIHBjaWUgc2xvdCAqLworI2RlZmluZSBRTEE4MlhYX0NSQl9QQ0lFMiBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfUFMyKQorCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BFR19NRF8wIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR1MwKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QRUdfTURfMSBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTMSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUEVHX01EXzIgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHUzIpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BFR19NRF8zIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR1MzKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QRUdfTURfMyBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdTMykKKyNkZWZpbmUgUUxBODJYWF9DUkJfUEVHX01EX0QgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHU0QpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BFR19NRF9JIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR1NJKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QRUdfTkVUXzAgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHTjApCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BFR19ORVRfMSBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdOMSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUEVHX05FVF8yIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR04yKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QRUdfTkVUXzMgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHTjMpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BFR19ORVRfNCBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfUEdONCkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUEVHX05FVF9EIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9QR05EKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QRUdfTkVUX0kgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1BHTkkpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1BRTV9NRCBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfUU1TKQorI2RlZmluZSBRTEE4MlhYX0NSQl9QUU1fTkVUIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9RTU4pCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1FEUl9NRCBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1MpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1FEUl9ORVQgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NOKQorI2RlZmluZSBRTEE4MlhYX0NSQl9ST01VU0IgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1JPTVVTQikKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF8wIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YMCkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF8xIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YMSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF8yIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YMikKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF8zIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YMykKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF80IFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YNCkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF81IFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YNSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF82IFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YNikKKyNkZWZpbmUgUUxBODJYWF9DUkJfUlBNWF83IFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9SUE1YNykKKyNkZWZpbmUgUUxBODJYWF9DUkJfU1FNX01EXzAgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NRUzApCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1NRTV9NRF8xIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9TUVMxKQorI2RlZmluZSBRTEE4MlhYX0NSQl9TUU1fTURfMiBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FTMikKKyNkZWZpbmUgUUxBODJYWF9DUkJfU1FNX01EXzMgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NRUzMpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1NRTV9ORVRfMCBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FOMCkKKyNkZWZpbmUgUUxBODJYWF9DUkJfU1FNX05FVF8xIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9TUU4xKQorI2RlZmluZSBRTEE4MlhYX0NSQl9TUU1fTkVUXzIgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NRTjIpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1NRTV9ORVRfMyBcCisJUUxBODJYWF9QQ0lfQ1JCX1dJTkRPVyhRTEE4MlhYX0hXX1BYX01BUF9DUkJfU1FOMykKKyNkZWZpbmUgUUxBODJYWF9DUkJfU1JFIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9TUkUpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1RJTUVSIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9USU1SKQorI2RlZmluZSBRTEE4MlhYX0NSQl9YRE1BIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9YRE1BKQorI2RlZmluZSBRTEE4MlhYX0NSQl9JMkMwIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9JMkMwKQorI2RlZmluZSBRTEE4MlhYX0NSQl9JMkMxIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9JMkMxKQorI2RlZmluZSBRTEE4MlhYX0NSQl9PQ00wIFwKKwlRTEE4MlhYX1BDSV9DUkJfV0lORE9XKFFMQTgyWFhfSFdfUFhfTUFQX0NSQl9PQ00wKQorI2RlZmluZSBRTEE4MlhYX0NSQl9TTUIgXAorCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coUUxBODJYWF9IV19QWF9NQVBfQ1JCX1NNQikKKworI2RlZmluZSBRTEE4MlhYX0NSQl9NQVgJCVFMQTgyWFhfUENJX0NSQl9XSU5ET1coNjQpCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09IEJBU0UgQUREUkVTU0VTIE9OLUNISVAgPT09PT09PT09PT09PT09PT09PT09PQorICogQmFzZSBhZGRyZXNzZXMgb2YgbWFqb3IgY29tcG9uZW50cyBvbi1jaGlwLgorICogPT09PT09PT09PT09PT09PT09PT09PSBCQVNFIEFERFJFU1NFUyBPTi1DSElQID09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2RlZmluZSBRTEE4MlhYX0FERFJfRERSX05FVAkJKDB4MDAwMDAwMDAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgUUxBODJYWF9BRERSX0REUl9ORVRfTUFYCSgweDAwMDAwMDAwMGZmZmZmZmZVTEwpCisKKy8qIEltYnVzIGFkZHJlc3MgYml0IHVzZWQgdG8gaW5kaWNhdGUgYSBob3N0IGFkZHJlc3MuIFRoaXMgYml0IGlzCisgKiBlbGltaW5hdGVkIGJ5IHRoZSBwY2llIGJhciBhbmQgYmFyIHNlbGVjdCBiZWZvcmUgcHJlc2VudGF0aW9uCisgKiBvdmVyIHBjaWUuICovCisvKiBob3N0IG1lbW9yeSB2aWEgSU1CVVMgKi8KKyNkZWZpbmUgUUxBODJYWF9QMl9BRERSX1BDSUUJKDB4MDAwMDAwMDgwMDAwMDAwMFVMTCkKKyNkZWZpbmUgUUxBODJYWF9QM19BRERSX1BDSUUJKDB4MDAwMDAwODAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgUUxBODJYWF9BRERSX1BDSUVfTUFYCSgweDAwMDAwMDBGRkZGRkZGRkZVTEwpCisjZGVmaW5lIFFMQTgyWFhfQUREUl9PQ00wCSgweDAwMDAwMDAyMDAwMDAwMDBVTEwpCisjZGVmaW5lIFFMQTgyWFhfQUREUl9PQ00wX01BWAkoMHgwMDAwMDAwMjAwMGZmZmZmVUxMKQorI2RlZmluZSBRTEE4MlhYX0FERFJfT0NNMQkoMHgwMDAwMDAwMjAwNDAwMDAwVUxMKQorI2RlZmluZSBRTEE4MlhYX0FERFJfT0NNMV9NQVgJKDB4MDAwMDAwMDIwMDRmZmZmZlVMTCkKKyNkZWZpbmUgUUxBODJYWF9BRERSX1FEUl9ORVQJKDB4MDAwMDAwMDMwMDAwMDAwMFVMTCkKKworI2RlZmluZSBRTEE4MlhYX1AyX0FERFJfUURSX05FVF9NQVgJKDB4MDAwMDAwMDMwMDFmZmZmZlVMTCkKKyNkZWZpbmUgUUxBODJYWF9QM19BRERSX1FEUl9ORVRfTUFYCSgweDAwMDAwMDAzMDNmZmZmZmZVTEwpCisKKyNkZWZpbmUgUUxBODJYWF9QQ0lfQ1JCU1BBQ0UJCSh1bnNpZ25lZCBsb25nKTB4MDYwMDAwMDAKKyNkZWZpbmUgUUxBODJYWF9QQ0lfRElSRUNUX0NSQgkJKHVuc2lnbmVkIGxvbmcpMHgwNDQwMDAwMAorI2RlZmluZSBRTEE4MlhYX1BDSV9DQU1RTQkJKHVuc2lnbmVkIGxvbmcpMHgwNDgwMDAwMAorI2RlZmluZSBRTEE4MlhYX1BDSV9DQU1RTV9NQVgJCSh1bnNpZ25lZCBsb25nKTB4MDRmZmZmZmYKKyNkZWZpbmUgUUxBODJYWF9QQ0lfRERSX05FVAkJKHVuc2lnbmVkIGxvbmcpMHgwMDAwMDAwMAorI2RlZmluZSBRTEE4MlhYX1BDSV9RRFJfTkVUCQkodW5zaWduZWQgbG9uZykweDA0MDAwMDAwCisjZGVmaW5lIFFMQTgyWFhfUENJX1FEUl9ORVRfTUFYCQkodW5zaWduZWQgbG9uZykweDA0M2ZmZmZmCisKKy8qCisgKiAgIFJlZ2lzdGVyIG9mZnNldHMgZm9yIE1OCisgKi8KKyNkZWZpbmUgTUlVX0NPTlRST0wJCQkoMHgwMDApCisjZGVmaW5lIE1JVV9UQUcJCQkJKDB4MDA0KQorI2RlZmluZSBNSVVfVEVTVF9BR1RfQ1RSTAkJKDB4MDkwKQorI2RlZmluZSBNSVVfVEVTVF9BR1RfQUREUl9MTwkJKDB4MDk0KQorI2RlZmluZSBNSVVfVEVTVF9BR1RfQUREUl9ISQkJKDB4MDk4KQorI2RlZmluZSBNSVVfVEVTVF9BR1RfV1JEQVRBX0xPCQkoMHgwYTApCisjZGVmaW5lIE1JVV9URVNUX0FHVF9XUkRBVEFfSEkJCSgweDBhNCkKKyNkZWZpbmUgTUlVX1RFU1RfQUdUX1dSREFUQShpKQkJKDB4MGEwKyg0KihpKSkpCisjZGVmaW5lIE1JVV9URVNUX0FHVF9SRERBVEFfTE8JCSgweDBhOCkKKyNkZWZpbmUgTUlVX1RFU1RfQUdUX1JEREFUQV9ISQkJKDB4MGFjKQorI2RlZmluZSBNSVVfVEVTVF9BR1RfUkREQVRBKGkpCQkoMHgwYTgrKDQqKGkpKSkKKyNkZWZpbmUgTUlVX1RFU1RfQUdUX0FERFJfTUFTSwkJMHhmZmZmZmZmOAorI2RlZmluZSBNSVVfVEVTVF9BR1RfVVBQRVJfQUREUihvZmYpCSgwKQorCisvKiBNSVVfVEVTVF9BR1RfQ1RSTCBmbGFncy4gd29yayBmb3IgU0lVIGFzIHdlbGwgKi8KKyNkZWZpbmUgTUlVX1RBX0NUTF9TVEFSVAkxCisjZGVmaW5lIE1JVV9UQV9DVExfRU5BQkxFCTIKKyNkZWZpbmUgTUlVX1RBX0NUTF9XUklURQk0CisjZGVmaW5lIE1JVV9UQV9DVExfQlVTWQkJOAorCisvKkNBTSBSQU0gKi8KKyMgZGVmaW5lIFFMQTgyWFhfQ0FNX1JBTV9CQVNFCShRTEE4MlhYX0NSQl9DQU0gKyAweDAyMDAwKQorIyBkZWZpbmUgUUxBODJYWF9DQU1fUkFNKHJlZykJKFFMQTgyWFhfQ0FNX1JBTV9CQVNFICsgKHJlZykpCisKKyNkZWZpbmUgUUxBODJYWF9QRUdfVFVORV9NTl9TUERfWkVST0VECTB4ODAwMDAwMDAKKyNkZWZpbmUgUUxBODJYWF9CT09UX0xPQURFUl9NTl9JU1NVRQkweGZmMDBmZmZmCisjZGVmaW5lIFFMQTgyWFhfUE9SVF9NT0RFX0FERFIJCShRTEE4MlhYX0NBTV9SQU0oMHgyNCkpCisjZGVmaW5lIFFMQTgyWFhfUEVHX0hBTFRfU1RBVFVTMQkoUUxBODJYWF9DQU1fUkFNKDB4YTgpKQorI2RlZmluZSBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzIJKFFMQTgyWFhfQ0FNX1JBTSgweGFjKSkKKyNkZWZpbmUgUUxBODJYWF9QRUdfQUxJVkVfQ09VTlRFUgkoUUxBODJYWF9DQU1fUkFNKDB4YjApKQorCisjZGVmaW5lIEhBTFRfU1RBVFVTX1VOUkVDT1ZFUkFCTEUJMHg4MDAwMDAwMAorI2RlZmluZSBIQUxUX1NUQVRVU19SRUNPVkVSQUJMRQkJMHg0MDAwMDAwMAorCisKKyNkZWZpbmUgUUxBODJYWF9ST01fTE9DS19JRAkJKFFMQTgyWFhfQ0FNX1JBTSgweDEwMCkpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX1dJTl9MT0NLX0lECQkoUUxBODJYWF9DQU1fUkFNKDB4MTI0KSkKKyNkZWZpbmUgUUxBODJYWF9GV19WRVJTSU9OX01BSk9SCShRTEE4MlhYX0NBTV9SQU0oMHgxNTApKQorI2RlZmluZSBRTEE4MlhYX0ZXX1ZFUlNJT05fTUlOT1IJKFFMQTgyWFhfQ0FNX1JBTSgweDE1NCkpCisjZGVmaW5lIFFMQTgyWFhfRldfVkVSU0lPTl9TVUIJCShRTEE4MlhYX0NBTV9SQU0oMHgxNTgpKQorI2RlZmluZSBRTEE4MlhYX1BDSUVfUkVHKHJlZykJCShRTEE4MlhYX0NSQl9QQ0lFICsgKHJlZykpCisKKy8qIERyaXZlciBDb2V4aXN0ZW5jZSBEZWZpbmVzICovCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0RSVl9BQ1RJVkUJCShRTEE4MlhYX0NBTV9SQU0oMHgxMzgpKQorI2RlZmluZSBRTEE4MlhYX0NSQl9ERVZfU1RBVEUJCShRTEE4MlhYX0NBTV9SQU0oMHgxNDApKQorI2RlZmluZSBRTEE4MlhYX0NSQl9ERVZfUEFSVF9JTkZPCShRTEE4MlhYX0NBTV9SQU0oMHgxNGMpKQorI2RlZmluZSBRTEE4MlhYX0NSQl9EUlZfSURDX1ZFUlNJT04JKFFMQTgyWFhfQ0FNX1JBTSgweDE3NCkpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0RSVl9TVEFURQkJKFFMQTgyWFhfQ0FNX1JBTSgweDE0NCkpCisjZGVmaW5lIFFMQTgyWFhfQ1JCX0RSVl9TQ1JBVENICQkoUUxBODJYWF9DQU1fUkFNKDB4MTQ4KSkKKyNkZWZpbmUgUUxBODJYWF9DUkJfREVWX1BBUlRfSU5GTwkoUUxBODJYWF9DQU1fUkFNKDB4MTRjKSkKKworLyogRXZlcnkgZHJpdmVyIHNob3VsZCB1c2UgdGhlc2UgRGV2aWNlIFN0YXRlICovCisjZGVmaW5lIFFMQTgyWFhfREVWX0NPTEQJCTEKKyNkZWZpbmUgUUxBODJYWF9ERVZfSU5JVElBTElaSU5HCTIKKyNkZWZpbmUgUUxBODJYWF9ERVZfUkVBRFkJCTMKKyNkZWZpbmUgUUxBODJYWF9ERVZfTkVFRF9SRVNFVAkJNAorI2RlZmluZSBRTEE4MlhYX0RFVl9ORUVEX1FVSUVTQ0VOVAk1CisjZGVmaW5lIFFMQTgyWFhfREVWX0ZBSUxFRAkJNgorI2RlZmluZSBRTEE4MlhYX0RFVl9RVUlFU0NFTlQJCTcKKyNkZWZpbmUgTUFYX1NUQVRFUwkJCTggLyogSW5jcmVtZW50IGlmIG5ldyBzdGF0ZSBhZGRlZCAqLworCisjZGVmaW5lIFFMQTgyWFhfSURDX1ZFUlNJT04JCTB4MQorI2RlZmluZSBST01fREVWX0lOSVRfVElNRU9VVAkJMzAKKyNkZWZpbmUgUk9NX0RSVl9SRVNFVF9BQ0tfVElNRU9VVAkxMAorCisjZGVmaW5lIFBDSUVfU0VUVVBfRlVOQ1RJT04JCSgweDEyMDQwKQorI2RlZmluZSBQQ0lFX1NFVFVQX0ZVTkNUSU9OMgkJKDB4MTIwNDgpCisKKyNkZWZpbmUgUUxBODJYWF9QQ0lYX1BTX1JFRyhyZWcpCShRTEE4MlhYX0NSQl9QQ0lYX01EICsgKHJlZykpCisjZGVmaW5lIFFMQTgyWFhfUENJWF9QUzJfUkVHKHJlZykJKFFMQTgyWFhfQ1JCX1BDSUUyICsgKHJlZykpCisKKyNkZWZpbmUgUENJRV9TRU0yX0xPQ0sJCSgweDFjMDEwKSAgLyogRmxhc2ggbG9jayAgICovCisjZGVmaW5lIFBDSUVfU0VNMl9VTkxPQ0sJKDB4MWMwMTQpICAvKiBGbGFzaCB1bmxvY2sgKi8KKyNkZWZpbmUgUENJRV9TRU01X0xPQ0sJCSgweDFjMDI4KSAgLyogQ29leGlzdGVuY2UgbG9jayAgICovCisjZGVmaW5lIFBDSUVfU0VNNV9VTkxPQ0sJKDB4MWMwMmMpICAvKiBDb2V4aXN0ZW5jZSB1bmxvY2sgKi8KKyNkZWZpbmUgUENJRV9TRU03X0xPQ0sJCSgweDFjMDM4KSAgLyogY3JiIHdpbiBsb2NrICovCisjZGVmaW5lIFBDSUVfU0VNN19VTkxPQ0sJKDB4MWMwM2MpICAvKiBjcmJ3aW4gdW5sb2NrKi8KKworLyoKKyAqIFRoZSBQQ0kgVmVuZG9ySUQgYW5kIERldmljZUlEIGZvciBvdXIgYm9hcmQuCisgKi8KKyNkZWZpbmUgUUxBODJYWF9NU0lYX1RCTF9TUEFDRQkJODE5MgorI2RlZmluZSBRTEE4MlhYX1BDSV9SRUdfTVNJWF9UQkwJMHg0NAorI2RlZmluZSBRTEE4MlhYX1BDSV9NU0lYX0NPTlRST0wJMHg0MAorCitzdHJ1Y3QgY3JiXzEyOE1fMk1fc3ViX2Jsb2NrX21hcCB7CisJdW5zaWduZWQgdmFsaWQ7CisJdW5zaWduZWQgc3RhcnRfMTI4TTsKKwl1bnNpZ25lZCBlbmRfMTI4TTsKKwl1bnNpZ25lZCBzdGFydF8yTTsKK307CisKK3N0cnVjdCBjcmJfMTI4TV8yTV9ibG9ja19tYXAgeworCXN0cnVjdCBjcmJfMTI4TV8yTV9zdWJfYmxvY2tfbWFwIHN1Yl9ibG9ja1sxNl07Cit9OworCitzdHJ1Y3QgY3JiX2FkZHJfcGFpciB7CisJbG9uZyBhZGRyOworCWxvbmcgZGF0YTsKK307CisKKyNkZWZpbmUgQUREUl9FUlJPUgkoKHVuc2lnbmVkIGxvbmcpIDB4ZmZmZmZmZmYpCisjZGVmaW5lIE1BWF9DVExfQ0hFQ0sJMTAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJUENJIHJlbGF0ZWQgZGVmaW5lcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEludGVycnVwdCByZWxhdGVkIGRlZmluZXMuCisgKi8KKyNkZWZpbmUgUENJWF9UQVJHRVRfU1RBVFVTCSgweDEwMTE4KQorI2RlZmluZSBQQ0lYX1RBUkdFVF9TVEFUVVNfRjEJKDB4MTAxNjApCisjZGVmaW5lIFBDSVhfVEFSR0VUX1NUQVRVU19GMgkoMHgxMDE2NCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfU1RBVFVTX0YzCSgweDEwMTY4KQorI2RlZmluZSBQQ0lYX1RBUkdFVF9TVEFUVVNfRjQJKDB4MTAzNjApCisjZGVmaW5lIFBDSVhfVEFSR0VUX1NUQVRVU19GNQkoMHgxMDM2NCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfU1RBVFVTX0Y2CSgweDEwMzY4KQorI2RlZmluZSBQQ0lYX1RBUkdFVF9TVEFUVVNfRjcJKDB4MTAzNmMpCisKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTSwkoMHgxMDEyOCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GMQkoMHgxMDE3MCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GMgkoMHgxMDE3NCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GMwkoMHgxMDE3OCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GNAkoMHgxMDM3MCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GNQkoMHgxMDM3NCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GNgkoMHgxMDM3OCkKKyNkZWZpbmUgUENJWF9UQVJHRVRfTUFTS19GNwkoMHgxMDM3YykKKworLyoKKyAqIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0cworICovCisjZGVmaW5lIFBDSVhfTVNJX0YwCQkoMHgxMzAwMCkKKyNkZWZpbmUgUENJWF9NU0lfRjEJCSgweDEzMDA0KQorI2RlZmluZSBQQ0lYX01TSV9GMgkJKDB4MTMwMDgpCisjZGVmaW5lIFBDSVhfTVNJX0YzCQkoMHgxMzAwYykKKyNkZWZpbmUgUENJWF9NU0lfRjQJCSgweDEzMDEwKQorI2RlZmluZSBQQ0lYX01TSV9GNQkJKDB4MTMwMTQpCisjZGVmaW5lIFBDSVhfTVNJX0Y2CQkoMHgxMzAxOCkKKyNkZWZpbmUgUENJWF9NU0lfRjcJCSgweDEzMDFjKQorI2RlZmluZSBQQ0lYX01TSV9GKEZVTkMpCSgweDEzMDAwICsgKChGVU5DKSAqIDQpKQorCisvKgorICoKKyAqLworI2RlZmluZSBQQ0lYX0lOVF9WRUNUT1IJCSgweDEwMTAwKQorI2RlZmluZSBQQ0lYX0lOVF9NQVNLCQkoMHgxMDEwNCkKKworLyoKKyAqIEludGVycnVwdCBzdGF0ZSBtYWNoaW5lIGFuZCBvdGhlciBiaXRzLgorICovCisjZGVmaW5lIFBDSUVfTUlTQ0NGR19SQwkJKDB4MTIwNmMpCisKKworI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9TVEFUVVMgXAorCShRTEE4MlhYX1BDSVhfUFNfUkVHKFBDSVhfVEFSR0VUX1NUQVRVUykpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX1NUQVRVU19GMSBcCisJKFFMQTgyWFhfUENJWF9QU19SRUcoUENJWF9UQVJHRVRfU1RBVFVTX0YxKSkKKyNkZWZpbmUgSVNSX0lOVF9UQVJHRVRfU1RBVFVTX0YyIFwKKwkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9TVEFUVVNfRjIpKQorI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9TVEFUVVNfRjMgXAorCShRTEE4MlhYX1BDSVhfUFNfUkVHKFBDSVhfVEFSR0VUX1NUQVRVU19GMykpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX1NUQVRVU19GNCBcCisJKFFMQTgyWFhfUENJWF9QU19SRUcoUENJWF9UQVJHRVRfU1RBVFVTX0Y0KSkKKyNkZWZpbmUgSVNSX0lOVF9UQVJHRVRfU1RBVFVTX0Y1IFwKKwkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9TVEFUVVNfRjUpKQorI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9TVEFUVVNfRjYgXAorCShRTEE4MlhYX1BDSVhfUFNfUkVHKFBDSVhfVEFSR0VUX1NUQVRVU19GNikpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX1NUQVRVU19GNyBcCisJKFFMQTgyWFhfUENJWF9QU19SRUcoUENJWF9UQVJHRVRfU1RBVFVTX0Y3KSkKKworI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9NQVNLIFwKKwkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9NQVNLKSkKKyNkZWZpbmUgSVNSX0lOVF9UQVJHRVRfTUFTS19GMSBcCisJKFFMQTgyWFhfUENJWF9QU19SRUcoUENJWF9UQVJHRVRfTUFTS19GMSkpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX01BU0tfRjIgXAorCShRTEE4MlhYX1BDSVhfUFNfUkVHKFBDSVhfVEFSR0VUX01BU0tfRjIpKQorI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9NQVNLX0YzIFwKKwkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9NQVNLX0YzKSkKKyNkZWZpbmUgSVNSX0lOVF9UQVJHRVRfTUFTS19GNCBcCisJKFFMQTgyWFhfUENJWF9QU19SRUcoUENJWF9UQVJHRVRfTUFTS19GNCkpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX01BU0tfRjUgXAorCShRTEE4MlhYX1BDSVhfUFNfUkVHKFBDSVhfVEFSR0VUX01BU0tfRjUpKQorI2RlZmluZSBJU1JfSU5UX1RBUkdFVF9NQVNLX0Y2IFwKKwkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9NQVNLX0Y2KSkKKyNkZWZpbmUgSVNSX0lOVF9UQVJHRVRfTUFTS19GNyBcCisJKFFMQTgyWFhfUENJWF9QU19SRUcoUENJWF9UQVJHRVRfTUFTS19GNykpCisKKyNkZWZpbmUgSVNSX0lOVF9WRUNUT1IJCQkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX0lOVF9WRUNUT1IpKQorI2RlZmluZSBJU1JfSU5UX01BU0sJCQkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX0lOVF9NQVNLKSkKKyNkZWZpbmUgSVNSX0lOVF9TVEFURV9SRUcJCShRTEE4MlhYX1BDSVhfUFNfUkVHKFBDSUVfTUlTQ0NGR19SQykpCisKKyNkZWZpbmUJSVNSX01TSV9JTlRfVFJJR0dFUihGVU5DKQkoUUxBODJYWF9QQ0lYX1BTX1JFRyhQQ0lYX01TSV9GKEZVTkMpKSkKKworCisjZGVmaW5lCUlTUl9JU19MRUdBQ1lfSU5UUl9JRExFKFZBTCkJCSgoKFZBTCkgJiAweDMwMCkgPT0gMCkKKyNkZWZpbmUJSVNSX0lTX0xFR0FDWV9JTlRSX1RSSUdHRVJFRChWQUwpCSgoKFZBTCkgJiAweDMwMCkgPT0gMHgyMDApCisKKy8qCisgKiBQQ0kgSW50ZXJydXB0IFZlY3RvciBWYWx1ZXMuCisgKi8KKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GMAkweDAwODAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GMQkweDAxMDAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GMgkweDAyMDAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GMwkweDA0MDAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GNAkweDA4MDAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GNQkweDEwMDAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GNgkweDIwMDAKKyNkZWZpbmUJUENJWF9JTlRfVkVDVE9SX0JJVF9GNwkweDQwMDAKKworLyogc3RydWN0IHFsYTRfOHh4eF9sZWdhY3lfaW50cl9zZXQgZGVmaW5lZCBpbiBxbDRfZGVmLmggKi8KKworI2RlZmluZSBRTEE4MlhYX0xFR0FDWV9JTlRSX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5pbnRfdmVjX2JpdCAgICA9CVBDSVhfSU5UX1ZFQ1RPUl9CSVRfRjAsICAgICAgICAgXAorCQkudGd0X3N0YXR1c19yZWcgPQlJU1JfSU5UX1RBUkdFVF9TVEFUVVMsICAgICAgICAgIFwKKwkJLnRndF9tYXNrX3JlZyAgID0JSVNSX0lOVF9UQVJHRVRfTUFTSywgICAgICAgICAgICBcCisJCS5wY2lfaW50X3JlZyAgICA9CUlTUl9NU0lfSU5UX1RSSUdHRVIoMCkgfSwgICAgICAgXAorCQkJCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLmludF92ZWNfYml0ICAgID0JUENJWF9JTlRfVkVDVE9SX0JJVF9GMSwgICAgICAgICBcCisJCS50Z3Rfc3RhdHVzX3JlZyA9CUlTUl9JTlRfVEFSR0VUX1NUQVRVU19GMSwgICAgICAgXAorCQkudGd0X21hc2tfcmVnICAgPQlJU1JfSU5UX1RBUkdFVF9NQVNLX0YxLCAgICAgICAgIFwKKwkJLnBjaV9pbnRfcmVnICAgID0JSVNSX01TSV9JTlRfVFJJR0dFUigxKSB9LCAgICAgICBcCisJCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQkuaW50X3ZlY19iaXQgICAgPQlQQ0lYX0lOVF9WRUNUT1JfQklUX0YyLCAgICAgICAgIFwKKwkJLnRndF9zdGF0dXNfcmVnID0JSVNSX0lOVF9UQVJHRVRfU1RBVFVTX0YyLCAgICAgICBcCisJCS50Z3RfbWFza19yZWcgICA9CUlTUl9JTlRfVEFSR0VUX01BU0tfRjIsICAgICAgICAgXAorCQkucGNpX2ludF9yZWcgICAgPQlJU1JfTVNJX0lOVF9UUklHR0VSKDIpIH0sICAgICAgIFwKKwkJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5pbnRfdmVjX2JpdCAgICA9CVBDSVhfSU5UX1ZFQ1RPUl9CSVRfRjMsICAgICAgICAgXAorCQkudGd0X3N0YXR1c19yZWcgPQlJU1JfSU5UX1RBUkdFVF9TVEFUVVNfRjMsICAgICAgIFwKKwkJLnRndF9tYXNrX3JlZyAgID0JSVNSX0lOVF9UQVJHRVRfTUFTS19GMywgICAgICAgICBcCisJCS5wY2lfaW50X3JlZyAgICA9CUlTUl9NU0lfSU5UX1RSSUdHRVIoMykgfSwgICAgICAgXAorCQkJCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLmludF92ZWNfYml0ICAgID0JUENJWF9JTlRfVkVDVE9SX0JJVF9GNCwgICAgICAgICBcCisJCS50Z3Rfc3RhdHVzX3JlZyA9CUlTUl9JTlRfVEFSR0VUX1NUQVRVU19GNCwgICAgICAgXAorCQkudGd0X21hc2tfcmVnICAgPQlJU1JfSU5UX1RBUkdFVF9NQVNLX0Y0LCAgICAgICAgIFwKKwkJLnBjaV9pbnRfcmVnICAgID0JSVNSX01TSV9JTlRfVFJJR0dFUig0KSB9LCAgICAgICBcCisJCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQkuaW50X3ZlY19iaXQgICAgPQlQQ0lYX0lOVF9WRUNUT1JfQklUX0Y1LCAgICAgICAgIFwKKwkJLnRndF9zdGF0dXNfcmVnID0JSVNSX0lOVF9UQVJHRVRfU1RBVFVTX0Y1LCAgICAgICBcCisJCS50Z3RfbWFza19yZWcgICA9CUlTUl9JTlRfVEFSR0VUX01BU0tfRjUsICAgICAgICAgXAorCQkucGNpX2ludF9yZWcgICAgPQlJU1JfTVNJX0lOVF9UUklHR0VSKDUpIH0sICAgICAgIFwKKwkJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5pbnRfdmVjX2JpdCAgICA9CVBDSVhfSU5UX1ZFQ1RPUl9CSVRfRjYsICAgICAgICAgXAorCQkudGd0X3N0YXR1c19yZWcgPQlJU1JfSU5UX1RBUkdFVF9TVEFUVVNfRjYsICAgICAgIFwKKwkJLnRndF9tYXNrX3JlZyAgID0JSVNSX0lOVF9UQVJHRVRfTUFTS19GNiwgICAgICAgICBcCisJCS5wY2lfaW50X3JlZyAgICA9CUlTUl9NU0lfSU5UX1RSSUdHRVIoNikgfSwgICAgICAgXAorCQkJCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLmludF92ZWNfYml0ICAgID0JUENJWF9JTlRfVkVDVE9SX0JJVF9GNywgICAgICAgICBcCisJCS50Z3Rfc3RhdHVzX3JlZyA9CUlTUl9JTlRfVEFSR0VUX1NUQVRVU19GNywgICAgICAgXAorCQkudGd0X21hc2tfcmVnICAgPQlJU1JfSU5UX1RBUkdFVF9NQVNLX0Y3LCAgICAgICAgIFwKKwkJLnBjaV9pbnRfcmVnICAgID0JSVNSX01TSV9JTlRfVFJJR0dFUig3KSB9LCAgICAgICBcCit9CisKKy8qIE1hZ2ljIG51bWJlciB0byBsZXQgdXNlciBrbm93IGZsYXNoIGlzIHByb2dyYW1tZWQgKi8KKyNkZWZpbmUJUUxBODJYWF9CRElORk9fTUFHSUMJMHgxMjM0NTY3OAorI2RlZmluZSBGV19TSVpFX09GRlNFVAkJKDB4M2U4NDBjKQorCisvKiBRTEE4MlhYIGFkZGl0aW9ucyAqLworI2RlZmluZSBNSVVfVEVTVF9BR1RfV1JEQVRBX1VQUEVSX0xPCSgweDBiMCkKKyNkZWZpbmUJTUlVX1RFU1RfQUdUX1dSREFUQV9VUFBFUl9ISQkoMHgwYjQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwppbmRleCAzOGIxZDM4Li41NTI5YjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwpAQCAtMzAsMjIgKzMwLDI5IEBACiAgKiBNb2R1bGUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGFuZCB2YXJpYWJsZXMKICAqLwogaW50IHFsNHhkaXNjb3Zlcnl3YWl0ID0gNjA7Ci1tb2R1bGVfcGFyYW0ocWw0eGRpc2NvdmVyeXdhaXQsIGludCwgU19JUlVHTyB8IFNfSVJVU1IpOworbW9kdWxlX3BhcmFtKHFsNHhkaXNjb3Zlcnl3YWl0LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWw0eGRpc2NvdmVyeXdhaXQsICJEaXNjb3Zlcnkgd2FpdCB0aW1lIik7CisKIGludCBxbDR4ZG9udHJlc2V0aGJhID0gMDsKLW1vZHVsZV9wYXJhbShxbDR4ZG9udHJlc2V0aGJhLCBpbnQsIFNfSVJVR08gfCBTX0lSVVNSKTsKK21vZHVsZV9wYXJhbShxbDR4ZG9udHJlc2V0aGJhLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWw0eGRvbnRyZXNldGhiYSwKLQkJICJEb250IHJlc2V0IHRoZSBIQkEgd2hlbiB0aGUgZHJpdmVyIGdldHMgMHg4MDAyIEFFTiAiCi0JCSAiIGRlZmF1bHQgaXQgd2lsbCByZXNldCBoYmEgOjAiCi0JCSAiIHNldCB0byAxIHRvIGF2b2lkIHJlc2V0dGluZyBIQkEiKTsKKwkJIkRvbid0IHJlc2V0IHRoZSBIQkEgZm9yIGRyaXZlciByZWNvdmVyeSBcbiIKKwkJIiAwIC0gSXQgd2lsbCByZXNldCBIQkEgKERlZmF1bHQpXG4iCisJCSIgMSAtIEl0IHdpbGwgTk9UIHJlc2V0IEhCQSIpOwogCiBpbnQgcWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAwOyAvKiAwID0gb2ZmLCAxID0gbG9nIGVycm9ycyAqLwotbW9kdWxlX3BhcmFtKHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLCBpbnQsIFNfSVJVR08gfCBTX0lSVVNSKTsKK21vZHVsZV9wYXJhbShxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLAogCQkgIk9wdGlvbiB0byBlbmFibGUgZXh0ZW5kZWQgZXJyb3IgbG9nZ2luZywgIgogCQkgIkRlZmF1bHQgaXMgMCAtIG5vIGxvZ2dpbmcsIDEgLSBkZWJ1ZyBsb2dnaW5nIik7CiAKLWludCBxbDRfbW9kX3VubG9hZCA9IDA7CitpbnQgcWw0eGVuYWJsZW1zaXggPSAxOworbW9kdWxlX3BhcmFtKHFsNHhlbmFibGVtc2l4LCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsNHhlbmFibGVtc2l4LAorCQkiU2V0IHRvIGVuYWJsZSBNU0kgb3IgTVNJLVggaW50ZXJydXB0IG1lY2hhbmlzbS5cbiIKKwkJIiAwID0gZW5hYmxlIElOVHggaW50ZXJydXB0IG1lY2hhbmlzbS5cbiIKKwkJIiAxID0gZW5hYmxlIE1TSS1YIGludGVycnVwdCBtZWNoYW5pc20gKERlZmF1bHQpLlxuIgorCQkiIDIgPSBlbmFibGUgTVNJIGludGVycnVwdCBtZWNoYW5pc20uIik7CiAKICNkZWZpbmUgUUw0X0RFRl9RREVQVEggMzIKIApAQCAtODMsNiArOTAsOSBAQAogc3RhdGljIHZvaWQgcWxhNHh4eF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CiBzdGF0aWMgdm9pZCBxbGE0eHh4X3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwogCitzdGF0aWMgc3RydWN0IHFsYTRfOHh4eF9sZWdhY3lfaW50cl9zZXQgbGVnYWN5X2ludHJbXSA9CisgICAgUUxBODJYWF9MRUdBQ1lfSU5UUl9DT05GSUc7CisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHFsYTR4eHhfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSBEUklWRVJfTkFNRSwKQEAgLTExNiw3ICsxMjYsOCBAQAogCS5jYXBzCQkJPSBDQVBfRldfREIgfCBDQVBfU0VORFRBUkdFVFNfT0ZGTE9BRCB8CiAJCQkJICBDQVBfREFUQV9QQVRIX09GRkxPQUQsCiAJLnBhcmFtX21hc2sJCT0gSVNDU0lfQ09OTl9QT1JUIHwgSVNDU0lfQ09OTl9BRERSRVNTIHwKLQkJCQkgIElTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCwKKwkJCQkgIElTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCB8CisJCQkJICBJU0NTSV9UQVJHRVRfQUxJQVMsCiAJLmhvc3RfcGFyYW1fbWFzawk9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwKIAkJCQkgIElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKIAkJCQkgIElTQ1NJX0hPU1RfSU5JVElBVE9SX05BTUUsCkBAIC0xNTIsMTUgKzE2MywxMiBAQAogCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX09OTElORSkgewogCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfREVBRCk7CiAKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGluZGV4IFslZF0gcG9ydCBkb3duIHJldHJ5IGNvdW50ICIKKwkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGRkYiBbJWRdIHBvcnQgZG93biByZXRyeSBjb3VudCAiCiAJCQkgICAgICAib2YgKCVkKSBzZWNzIGV4aGF1c3RlZCwgbWFya2luZyBkZXZpY2UgREVBRC5cbiIsCiAJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAogCQkJICAgICAgaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCkpOwogCi0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBzY2hlZHVsaW5nIGRwYyByb3V0aW5lIC0gZHBjICIKLQkJCSAgICAgICJmbGFncyA9IDB4JWx4XG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBoYS0+ZHBjX2ZsYWdzKSk7Ci0JCXF1ZXVlX3dvcmsoaGEtPmRwY190aHJlYWQsICZoYS0+ZHBjX3dvcmspOworCQlxbGE0eHh4X3dha2VfZHBjKGhhKTsKIAl9CiB9CiAKQEAgLTIwMyw2ICsyMTEsMTAgQEAKIAljYXNlIElTQ1NJX1BBUkFNX1RQR1Q6CiAJCWxlbiA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGRkYl9lbnRyeS0+dHBndCk7CiAJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX0FMSUFTOgorCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlc1xuIiwKKwkJICAgIGRkYl9lbnRyeS0+aXNjc2lfYWxpYXMpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CkBAIC0zNjIsMTkgKzM3NCwzNyBAQAogICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKiBAZGRiX2VudHJ5OiBQb2ludGVyIHRvIGRldmljZSBkYXRhYmFzZSBlbnRyeQogICoKLSAqIFRoaXMgcm91dGluZSBtYXJrcyBhIGRldmljZSBtaXNzaW5nIGFuZCByZXNldHMgdGhlIHJlbG9naW4gcmV0cnkgY291bnQuCisgKiBUaGlzIHJvdXRpbmUgbWFya3MgYSBkZXZpY2UgbWlzc2luZyBhbmQgY2xvc2UgY29ubmVjdGlvbi4KICAqKi8KIHZvaWQgcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCQkgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQogewotCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9NSVNTSU5HKTsKLQlERUJVRzMocHJpbnRrKCJzY3NpJWQ6JWQ6JWQ6IGluZGV4IFslZF0gbWFya2VkIE1JU1NJTkdcbiIsCi0JCSAgICAgIGhhLT5ob3N0X25vLCBkZGJfZW50cnktPmJ1cywgZGRiX2VudHJ5LT50YXJnZXQsCi0JCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CisJaWYgKChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX0RFQUQpKSB7CisJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9NSVNTSU5HKTsKKwkJREVCVUcyKHByaW50aygic2NzaSVsZDogZGRiIFslZF0gbWFya2VkIE1JU1NJTkdcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKKwl9IGVsc2UKKwkJREVCVUcyKHByaW50aygic2NzaSVsZDogZGRiIFslZF0gREVBRFxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpCisKIAlpc2NzaV9ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CiAJaXNjc2lfY29ubl9lcnJvcl9ldmVudChkZGJfZW50cnktPmNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CiB9CiAKKy8qKgorICogcWxhNHh4eF9tYXJrX2FsbF9kZXZpY2VzX21pc3NpbmcgLSBtYXJrIGFsbCBkZXZpY2VzIGFzIG1pc3NpbmcuCisgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbWFya3MgYSBkZXZpY2UgbWlzc2luZyBhbmQgcmVzZXRzIHRoZSByZWxvZ2luIHJldHJ5IGNvdW50LgorICoqLwordm9pZCBxbGE0eHh4X21hcmtfYWxsX2RldmljZXNfbWlzc2luZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCAqZGRidGVtcDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGRiX2VudHJ5LCBkZGJ0ZW1wLCAmaGEtPmRkYl9saXN0LCBsaXN0KSB7CisJCXFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhoYSwgZGRiX2VudHJ5KTsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc3JiKiBxbGE0eHh4X2dldF9uZXdfc3JiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCQkgICAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LAogCQkJCSAgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCkBAIC00NjMsNyArNDkzLDEzIEBACiAJCXJldHVybiBTQ1NJX01MUVVFVUVfVEFSR0VUX0JVU1k7CiAJfQogCi0JaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQV9JTlRSLCAmaGEtPmRwY19mbGFncykpCisJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQV9JTlRSLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KERQQ19IQV9VTlJFQ09WRVJBQkxFLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoRFBDX0hBX05FRURfUVVJRVNDRU5ULCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgIXRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKSkKIAkJZ290byBxY19ob3N0X2J1c3k7CiAKIAlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CkBAIC01MjQsNyArNTYwLDE1IEBACiAJaGEtPnNyYl9tZW1wb29sID0gTlVMTDsKIAogCS8qIHJlbGVhc2UgaW8gc3BhY2UgcmVnaXN0ZXJzICAqLwotCWlmIChoYS0+cmVnKQorCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQlpZiAoaGEtPm54X3BjaWJhc2UpCisJCQlpb3VubWFwKAorCQkJICAgIChzdHJ1Y3QgZGV2aWNlX3JlZ184Mnh4IF9faW9tZW0gKiloYS0+bnhfcGNpYmFzZSk7CisKKwkJaWYgKGhhLT5ueF9kYl93cl9wdHIpCisJCQlpb3VubWFwKAorCQkJICAgIChzdHJ1Y3QgZGV2aWNlX3JlZ184Mnh4IF9faW9tZW0gKiloYS0+bnhfZGJfd3JfcHRyKTsKKwl9IGVsc2UgaWYgKGhhLT5yZWcpCiAJCWlvdW5tYXAoaGEtPnJlZyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhoYS0+cGRldik7CiB9CkBAIC01NDksOCArNTkzLDggQEAKIAloYS0+cXVldWVzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBoYS0+cXVldWVzX2xlbiwKIAkJCQkJJmhhLT5xdWV1ZXNfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoaGEtPnF1ZXVlcyA9PSBOVUxMKSB7Ci0JCWRldl93YXJuKCZoYS0+cGRldi0+ZGV2LAotCQkJIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHF1ZXVlcy5cbiIpOworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gcXVldWVzLlxuIik7CiAKIAkJZ290byBtZW1fYWxsb2NfZXJyb3JfZXhpdDsKIAl9CkBAIC01ODYsOCArNjMwLDggQEAKIAloYS0+c3JiX21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShTUkJfTUlOX1JFUSwgbWVtcG9vbF9hbGxvY19zbGFiLAogCQkJCQkgbWVtcG9vbF9mcmVlX3NsYWIsIHNyYl9jYWNoZXApOwogCWlmIChoYS0+c3JiX21lbXBvb2wgPT0gTlVMTCkgewotCQlkZXZfd2FybigmaGEtPnBkZXYtPmRldiwKLQkJCSJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBTUkIgUG9vbC5cbiIpOworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gU1JCIFBvb2wuXG4iKTsKIAogCQlnb3RvIG1lbV9hbGxvY19lcnJvcl9leGl0OwogCX0KQEAgLTYwMCw2ICs2NDQsNzQgQEAKIH0KIAogLyoqCisgKiBxbGE0Xzh4eHhfY2hlY2tfZndfYWxpdmUgIC0gQ2hlY2sgZmlybXdhcmUgaGVhbHRoCisgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKiBDb250ZXh0OiBJbnRlcnJ1cHQKKyAqKi8KK3N0YXRpYyB2b2lkIHFsYTRfOHh4eF9jaGVja19md19hbGl2ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3QgZndfaGVhcnRiZWF0X2NvdW50ZXIsIGhhbHRfc3RhdHVzOworCisJZndfaGVhcnRiZWF0X2NvdW50ZXIgPSBxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfUEVHX0FMSVZFX0NPVU5URVIpOworCisJaWYgKGhhLT5md19oZWFydGJlYXRfY291bnRlciA9PSBmd19oZWFydGJlYXRfY291bnRlcikgeworCQloYS0+c2Vjb25kc19zaW5jZV9sYXN0X2hlYXJ0YmVhdCsrOworCQkvKiBGVyBub3QgYWxpdmUgYWZ0ZXIgMiBzZWNvbmRzICovCisJCWlmIChoYS0+c2Vjb25kc19zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9PSAyKSB7CisJCQloYS0+c2Vjb25kc19zaW5jZV9sYXN0X2hlYXJ0YmVhdCA9IDA7CisJCQloYWx0X3N0YXR1cyA9IHFsYTRfOHh4eF9yZF8zMihoYSwKKwkJCSAgICBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzEpOworCQkJLyogU2luY2Ugd2UgY2Fubm90IGNoYW5nZSBkZXZfc3RhdGUgaW4gaW50ZXJydXB0CisJCQkgKiBjb250ZXh0LCBzZXQgYXBwcm9wcmlhdGUgRFBDIGZsYWcgdGhlbiB3YWtldXAKKwkJCSAqIERQQyAqLworCQkJaWYgKGhhbHRfc3RhdHVzICYgSEFMVF9TVEFUVVNfVU5SRUNPVkVSQUJMRSkKKwkJCQlzZXRfYml0KERQQ19IQV9VTlJFQ09WRVJBQkxFLCAmaGEtPmRwY19mbGFncyk7CisJCQllbHNlIHsKKwkJCQlwcmludGsoInNjc2klbGQ6ICVzOiBkZXRlY3QgYWJvcnQgbmVlZGVkIVxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKKwkJCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJfQorCQkJcWxhNHh4eF93YWtlX2RwYyhoYSk7CisJCX0KKwl9CisJaGEtPmZ3X2hlYXJ0YmVhdF9jb3VudGVyID0gZndfaGVhcnRiZWF0X2NvdW50ZXI7Cit9CisKKy8qKgorICogcWxhNF84eHh4X3dhdGNoZG9nIC0gUG9sbCBkZXYgc3RhdGUKKyAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgorICoKKyAqIENvbnRleHQ6IEludGVycnVwdAorICoqLwordm9pZCBxbGE0Xzh4eHhfd2F0Y2hkb2coc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IGRldl9zdGF0ZTsKKworCWRldl9zdGF0ZSA9IHFsYTRfOHh4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKKworCS8qIGRvbid0IHBvbGwgaWYgcmVzZXQgaXMgZ29pbmcgb24gKi8KKwlpZiAoIXRlc3RfYml0KERQQ19SRVNFVF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX05FRURfUkVTRVQgJiYKKwkJICAgICF0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJcHJpbnRrKCJzY3NpJWxkOiAlczogSFcgU3RhdGU6IE5FRUQgUkVTRVQhXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJcWxhNHh4eF93YWtlX2RwYyhoYSk7CisJCX0gZWxzZSBpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX05FRURfUVVJRVNDRU5UICYmCisJCSAgICAhdGVzdF9iaXQoRFBDX0hBX05FRURfUVVJRVNDRU5ULCAmaGEtPmRwY19mbGFncykpIHsKKwkJCXByaW50aygic2NzaSVsZDogJXM6IEhXIFN0YXRlOiBORUVEIFFVSUVTIVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQkJc2V0X2JpdChEUENfSEFfTkVFRF9RVUlFU0NFTlQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXFsYTR4eHhfd2FrZV9kcGMoaGEpOworCQl9IGVsc2UgIHsKKwkJCS8qIENoZWNrIGZpcm13YXJlIGhlYWx0aCAqLworCQkJcWxhNF84eHh4X2NoZWNrX2Z3X2FsaXZlKGhhKTsKKwkJfQorCX0KK30KKworLyoqCiAgKiBxbGE0eHh4X3RpbWVyIC0gY2hlY2tzIGV2ZXJ5IHNlY29uZCBmb3Igd29yayB0byBkby4KICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICoqLwpAQCAtNjA4LDYgKzcyMCwxNiBAQAogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgKmR0ZW1wOwogCWludCBzdGFydF9kcGMgPSAwOwogCisJaWYgKHRlc3RfYml0KEFGX0hCQV9HT0lOR19BV0FZLCAmaGEtPmZsYWdzKSkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXMgZXhpdGVkLiBIQkEgR09JTkcgQVdBWVxuIiwKKwkJICAgIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfcWxhODAyMihoYSkpIHsKKwkJcWxhNF84eHh4X3dhdGNoZG9nKGhhKTsKKwl9CisKIAkvKiBTZWFyY2ggZm9yIHJlbG9naW4ncyB0byB0aW1lLW91dCBhbmQgcG9ydCBkb3duIHJldHJ5LiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZGJfZW50cnksIGR0ZW1wLCAmaGEtPmRkYl9saXN0LCBsaXN0KSB7CiAJCS8qIENvdW50IGRvd24gdGltZSBiZXR3ZWVuIHNlbmRpbmcgcmVsb2dpbnMgKi8KQEAgLTYyNCw3ICs3NDYsNyBAQAogCQkJCQlzZXRfYml0KERQQ19SRUxPR0lOX0RFVklDRSwKIAkJCQkJCSZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQkJc2V0X2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncyk7Ci0JCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBpbmRleCBbJWRdIgorCQkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiIFslZF0iCiAJCQkJCQkgICAgICAiIGxvZ2luIGRldmljZVxuIiwKIAkJCQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKIAkJCQkJCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CkBAIC02NDcsNyArNzY5LDcgQEAKIAkJCSAgICBEREJfRFNfU0VTU0lPTl9GQUlMRUQpIHsKIAkJCQkvKiBSZXNldCByZXRyeSByZWxvZ2luIHRpbWVyICovCiAJCQkJYXRvbWljX2luYygmZGRiX2VudHJ5LT5yZWxvZ2luX3JldHJ5X2NvdW50KTsKLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBpbmRleFslZF0gcmVsb2dpbiIKKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBkZGIgWyVkXSByZWxvZ2luIgogCQkJCQkgICAgICAiIHRpbWVkIG91dC1yZXRyeWluZyIKIAkJCQkJICAgICAgIiByZWxvZ2luICglZClcbiIsCiAJCQkJCSAgICAgIGhhLT5ob3N0X25vLApAQCAtNjU2LDcgKzc3OCw3IEBACiAJCQkJCQkJICByZWxvZ2luX3JldHJ5X2NvdW50KSkKIAkJCQkJKTsKIAkJCQlzdGFydF9kcGMrKzsKLQkJCQlERUJVRyhwcmludGsoInNjc2klbGQ6JWQ6JWQ6IGluZGV4IFslZF0gIgorCQkJCURFQlVHKHByaW50aygic2NzaSVsZDolZDolZDogZGRiIFslZF0gIgogCQkJCQkgICAgICJpbml0YXRlIHJlbG9naW4gYWZ0ZXIiCiAJCQkJCSAgICAgIiAlZCBzZWNvbmRzXG4iLAogCQkJCQkgICAgIGhhLT5ob3N0X25vLCBkZGJfZW50cnktPmJ1cywKQEAgLTY3MSwzMSArNzkzLDM1IEBACiAJCX0KIAl9CiAKLQkvKiBDaGVjayBmb3IgaGVhcnRiZWF0IGludGVydmFsLiAqLwotCWlmIChoYS0+ZmlybXdhcmVfb3B0aW9ucyAmIEZXT1BUX0hFQVJUQkVBVF9FTkFCTEUgJiYKLQkgICAgaGEtPmhlYXJ0YmVhdF9pbnRlcnZhbCAhPSAwKSB7Ci0JCWhhLT5zZWNvbmRzX3NpbmNlX2xhc3RfaGVhcnRiZWF0Kys7Ci0JCWlmIChoYS0+c2Vjb25kc19zaW5jZV9sYXN0X2hlYXJ0YmVhdCA+Ci0JCSAgICBoYS0+aGVhcnRiZWF0X2ludGVydmFsICsgMikKLQkJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJaWYgKCFpc19xbGE4MDIyKGhhKSkgeworCQkvKiBDaGVjayBmb3IgaGVhcnRiZWF0IGludGVydmFsLiAqLworCQlpZiAoaGEtPmZpcm13YXJlX29wdGlvbnMgJiBGV09QVF9IRUFSVEJFQVRfRU5BQkxFICYmCisJCSAgICBoYS0+aGVhcnRiZWF0X2ludGVydmFsICE9IDApIHsKKwkJCWhhLT5zZWNvbmRzX3NpbmNlX2xhc3RfaGVhcnRiZWF0Kys7CisJCQlpZiAoaGEtPnNlY29uZHNfc2luY2VfbGFzdF9oZWFydGJlYXQgPgorCQkJICAgIGhhLT5oZWFydGJlYXRfaW50ZXJ2YWwgKyAyKQorCQkJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJCX0KIAl9CiAKLQogCS8qIFdha2V1cCB0aGUgZHBjIHJvdXRpbmUgZm9yIHRoaXMgYWRhcHRlciwgaWYgbmVlZGVkLiAqLwogCWlmICgoc3RhcnRfZHBjIHx8CiAJICAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICAgdGVzdF9iaXQoRFBDX1JFVFJZX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgIHRlc3RfYml0KERQQ19SRUxPR0lOX0RFVklDRSwgJmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfREVTVFJPWV9EREJfTElTVCwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfRldfQ09OVEVYVCwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfSU5UUiwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgICB0ZXN0X2JpdChEUENfR0VUX0RIQ1BfSVBfQUREUiwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgICB0ZXN0X2JpdChEUENfTElOS19DSEFOR0VELCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgIHRlc3RfYml0KERQQ19IQV9VTlJFQ09WRVJBQkxFLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgIHRlc3RfYml0KERQQ19IQV9ORUVEX1FVSUVTQ0VOVCwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgICB0ZXN0X2JpdChEUENfQUVOLCAmaGEtPmRwY19mbGFncykpICYmCisJICAgICAhdGVzdF9iaXQoQUZfRFBDX1NDSEVEVUxFRCwgJmhhLT5mbGFncykgJiYKIAkgICAgIGhhLT5kcGNfdGhyZWFkKSB7CiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBzY2hlZHVsaW5nIGRwYyByb3V0aW5lIgogCQkJICAgICAgIiAtIGRwYyBmbGFncyA9IDB4JWx4XG4iLAogCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBoYS0+ZHBjX2ZsYWdzKSk7Ci0JCXF1ZXVlX3dvcmsoaGEtPmRwY190aHJlYWQsICZoYS0+ZHBjX3dvcmspOworCQlxbGE0eHh4X3dha2VfZHBjKGhhKTsKIAl9CiAKIAkvKiBSZXNjaGVkdWxlIHRpbWVyIHRocmVhZCB0byBjYWxsIHVzIGJhY2sgaW4gb25lIHNlY29uZCAqLwpAQCAtNzE0LDE2ICs4NDAsMTUgQEAKIHN0YXRpYyBpbnQgcWxhNHh4eF9jbWRfd2FpdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJdWludDMyX3QgaW5kZXggPSAwOwotCWludCBzdGF0ID0gUUxBX1NVQ0NFU1M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7Ci0JaW50IHdhaXRfY250ID0gV0FJVF9DTURfVE9WOwkvKgotCQkJCQkgKiBJbml0aWFsaXplZCBmb3IgMzAgc2Vjb25kcyBhcyB3ZQotCQkJCQkgKiBleHBlY3QgYWxsIGNvbW1hbmRzIHRvIHJldHVuZWQKLQkJCQkJICogQVNBUC4KLQkJCQkJICovCiAKLQl3aGlsZSAod2FpdF9jbnQpIHsKKwl1bnNpZ25lZCBsb25nIHd0aW1lID0gamlmZmllcyArIChXQUlUX0NNRF9UT1YgKiBIWik7CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiV2FpdCB1cCB0byAlZCBzZWNvbmRzIGZvciBjbWRzIHRvICIKKwkgICAgImNvbXBsZXRlXG4iLCBXQUlUX0NNRF9UT1YpKTsKKworCXdoaWxlICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCB3dGltZSkpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCS8qIEZpbmQgYSBjb21tYW5kIHRoYXQgaGFzbid0IGNvbXBsZXRlZC4gKi8KIAkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaGEtPmhvc3QtPmNhbl9xdWV1ZTsgaW5kZXgrKykgewpAQCAtNzM0LDMxICs4NTksMjYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCQkvKiBJZiBObyBDb21tYW5kcyBhcmUgcGVuZGluZywgd2FpdCBpcyBjb21wbGV0ZSAqLwotCQlpZiAoaW5kZXggPT0gaGEtPmhvc3QtPmNhbl9xdWV1ZSkgewotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKGluZGV4ID09IGhhLT5ob3N0LT5jYW5fcXVldWUpCisJCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAKLQkJLyogSWYgd2UgdGltZWQgb3V0IG9uIHdhaXRpbmcgZm9yIGNvbW1hbmRzIHRvIGNvbWUgYmFjawotCQkgKiByZXR1cm4gRVJST1IuCi0JCSAqLwotCQl3YWl0X2NudC0tOwotCQlpZiAod2FpdF9jbnQgPT0gMCkKLQkJCXN0YXQgPSBRTEFfRVJST1I7Ci0JCWVsc2UgewotCQkJbXNsZWVwKDEwMDApOwotCQl9Ci0JfQkJCS8qIEVuZCBvZiBXaGlsZSAod2FpdF9jbnQpICovCi0KLQlyZXR1cm4gc3RhdDsKKwkJbXNsZWVwKDEwMDApOworCX0KKwkvKiBJZiB3ZSB0aW1lZCBvdXQgb24gd2FpdGluZyBmb3IgY29tbWFuZHMgdG8gY29tZSBiYWNrCisJICogcmV0dXJuIEVSUk9SLiAqLworCXJldHVybiBRTEFfRVJST1I7CiB9CiAKLXZvaWQgcWxhNHh4eF9od19yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCitpbnQgcWxhNHh4eF9od19yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJdWludDMyX3QgY3RybF9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKIAlERUJVRzIocHJpbnRrKEtFUk5fRVJSICJzY3NpJWxkOiAlc1xuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CiAKKwlpZiAocWw0eHh4X2xvY2tfZHJ2cl93YWl0KGhhKSAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIFFMQV9FUlJPUjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJLyoKQEAgLTc3NCw2ICs4OTQsNyBAQAogCXJlYWRsKCZoYS0+cmVnLT5jdHJsX3N0YXR1cyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXJldHVybiBRTEFfU1VDQ0VTUzsKIH0KIAogLyoqCkBAIC04NzIsMTUgKzk5MywxNiBAQAogfQogCiAvKioKLSAqIHFsYTR4eHhfZmx1c2hfYWN0aXZlX3NyYnMgLSByZXR1cm5zIGFsbCBvdXRzdGFuZGluZyBpL28gcmVxdWVzdHMgdG8gTy5TLgorICogcWxhNHh4eF9hYm9ydF9hY3RpdmVfY21kcyAtIHJldHVybnMgYWxsIG91dHN0YW5kaW5nIGkvbyByZXF1ZXN0cyB0byBPLlMuCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEByZXM6IHJldHVybmVkIHNjc2kgc3RhdHVzCiAgKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBqdXN0IHByaW9yIHRvIGEgSEFSRCBSRVNFVCB0byByZXR1cm4gYWxsCiAgKiBvdXRzdGFuZGluZyBjb21tYW5kcyBiYWNrIHRvIHRoZSBPcGVyYXRpbmcgU3lzdGVtLgogICogQ2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGxvY2tzIGFyZSByZWxlYXNlZAogICogYmVmb3JlIHRoaXMgY2FsbGluZyByb3V0aW5lOiBIYXJkd2FyZSBsb2NrLCBhbmQgaW9fcmVxdWVzdF9sb2NrLgogICoqLwotc3RhdGljIHZvaWQgcWxhNHh4eF9mbHVzaF9hY3RpdmVfc3JicyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCitzdGF0aWMgdm9pZCBxbGE0eHh4X2Fib3J0X2FjdGl2ZV9jbWRzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IHJlcykKIHsKIAlzdHJ1Y3Qgc3JiICpzcmI7CiAJaW50IGk7CkBAIC04OTAsNzQgKzEwMTIsMTE2IEBACiAJZm9yIChpID0gMDsgaSA8IGhhLT5ob3N0LT5jYW5fcXVldWU7IGkrKykgewogCQlzcmIgPSBxbGE0eHh4X2RlbF9mcm9tX2FjdGl2ZV9hcnJheShoYSwgaSk7CiAJCWlmIChzcmIgIT0gTlVMTCkgewotCQkJc3JiLT5jbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCXNyYi0+Y21kLT5yZXN1bHQgPSByZXM7CiAJCQlrcmVmX3B1dCgmc3JiLT5zcmJfcmVmLCBxbGE0eHh4X3NyYl9jb21wbCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIH0KIAordm9pZCBxbGE0eHh4X2RlYWRfYWRhcHRlcl9jbGVhbnVwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwljbGVhcl9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKKworCS8qIERpc2FibGUgdGhlIGJvYXJkICovCisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiRGlzYWJsaW5nIHRoZSBib2FyZFxuIik7CisJc2V0X2JpdChBRl9IQkFfR09JTkdfQVdBWSwgJmhhLT5mbGFncyk7CisKKwlxbGE0eHh4X2Fib3J0X2FjdGl2ZV9jbWRzKGhhLCBESURfTk9fQ09OTkVDVCA8PCAxNik7CisJcWxhNHh4eF9tYXJrX2FsbF9kZXZpY2VzX21pc3NpbmcoaGEpOworCWNsZWFyX2JpdChBRl9JTklUX0RPTkUsICZoYS0+ZmxhZ3MpOworfQorCiAvKioKICAqIHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyIC0gcmVjb3ZlcnMgYWRhcHRlciBhZnRlciBhIGZhdGFsIGVycm9yCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqIEByZW5ld19kZGJfbGlzdDogSW5kaWNhdGVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgYWRhcHRlcidzIGRkYiBsaXN0Ci0gKgotICogcmVuZXdfZGRiX2xpc3QgdmFsdWUgY2FuIGJlIDA9cHJlc2VydmUgZGRiIGxpc3QsIDE9ZGVzdHJveSBhbmQgcmVidWlsZAotICogZGRiIGxpc3QuCiAgKiovCi1zdGF0aWMgaW50IHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQl1aW50OF90IHJlbmV3X2RkYl9saXN0KQorc3RhdGljIGludCBxbGE0eHh4X3JlY292ZXJfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JaW50IHN0YXR1czsKKwlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOworCXVpbnQ4X3QgcmVzZXRfY2hpcCA9IDA7CiAKIAkvKiBTdGFsbCBpbmNvbWluZyBJL08gdW50aWwgd2UgYXJlIGRvbmUgKi8KKwlzY3NpX2Jsb2NrX3JlcXVlc3RzKGhhLT5ob3N0KTsKIAljbGVhcl9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKIAotCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzIGNhbGxpbmcgcWxhNHh4eF9jbWRfd2FpdFxuIiwgaGEtPmhvc3Rfbm8sCi0JCSAgICAgIF9fZnVuY19fKSk7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBhZGFwdGVyIE9GRkxJTkVcbiIsIF9fZnVuY19fKSk7CiAKLQkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyBjb21tYW5kcyB0byBjb21wbGV0ZS4KLQkgKiBTdGFsbHMgdGhlIGRyaXZlciBmb3IgbWF4IDMwIHNlY3MKLQkgKi8KLQlzdGF0dXMgPSBxbGE0eHh4X2NtZF93YWl0KGhhKTsKKwlzZXRfYml0KERQQ19SRVNFVF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKIAotCXFsYTR4eHhfZGlzYWJsZV9pbnRycyhoYSk7CisJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKQorCQlyZXNldF9jaGlwID0gMTsKIAotCS8qIEZsdXNoIGFueSBwZW5kaW5nIGRkYiBjaGFuZ2VkIEFFTnMgKi8KLQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKLQotCXFsYTR4eHhfZmx1c2hfYWN0aXZlX3NyYnMoaGEpOwotCi0JLyogUmVzZXQgdGhlIGZpcm13YXJlLglJZiBzdWNjZXNzZnVsLCBmdW5jdGlvbgotCSAqIHJldHVybnMgd2l0aCBJU1AgaW50ZXJydXB0cyBlbmFibGVkLgotCSAqLwotCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzIC0gUGVyZm9ybWluZyBzb2Z0IHJlc2V0Li5cbiIsCi0JCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCWlmIChxbDR4eHhfbG9ja19kcnZyX3dhaXQoaGEpID09IFFMQV9TVUNDRVNTKQotCQlzdGF0dXMgPSBxbGE0eHh4X3NvZnRfcmVzZXQoaGEpOwotCWVsc2UKLQkJc3RhdHVzID0gUUxBX0VSUk9SOwotCi0JLyogRmx1c2ggYW55IHBlbmRpbmcgZGRiIGNoYW5nZWQgQUVOcyAqLwotCXFsYTR4eHhfcHJvY2Vzc19hZW4oaGEsIEZMVVNIX0REQl9DSEFOR0VEX0FFTlMpOwotCi0JLyogUmUtaW5pdGlhbGl6ZSBmaXJtd2FyZS4gSWYgc3VjY2Vzc2Z1bCwgZnVuY3Rpb24gcmV0dXJucwotCSAqIHdpdGggSVNQIGludGVycnVwdHMgZW5hYmxlZCAqLwotCWlmIChzdGF0dXMgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXMgLSBJbml0aWFsaXppbmcgYWRhcHRlci4uXG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7Ci0KLQkJLyogSWYgc3VjY2Vzc2Z1bCwgQUZfT05MSU5FIGZsYWcgc2V0IGluCi0JCSAqIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyICovCi0JCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCByZW5ld19kZGJfbGlzdCk7CisJLyogRm9yIHRoZSBEUENfUkVTRVRfSEFfSU5UUiBjYXNlIChJU1AtNHh4eCBzcGVjaWZpYykKKwkgKiBkbyBub3QgcmVzZXQgYWRhcHRlciwganVtcCB0byBpbml0aWFsaXplX2FkYXB0ZXIgKi8KKwlpZiAodGVzdF9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJZ290byByZWNvdmVyX2hhX2luaXRfYWRhcHRlcjsKIAl9CiAKLQkvKiBGYWlsZWQgYWRhcHRlciBpbml0aWFsaXphdGlvbj8KLQkgKiBSZXRyeSByZXNldF9oYSBvbmx5IGlmIGludm9rZWQgdmlhIERQQyAoRFBDX1JFU0VUX0hBKSAqLwotCWlmICgodGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSA9PSAwKSAmJgotCSAgICAodGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykpKSB7CisJLyogRm9yIHRoZSBJU1AtODJ4eCBhZGFwdGVyLCBpc3N1ZSBhIHN0b3BfZmlybXdhcmUgaWYgaW52b2tlZAorCSAqIGZyb20gZWhfaG9zdF9yZXNldCBvciBpb2N0bCBtb2R1bGUgKi8KKwlpZiAoaXNfcWxhODAyMihoYSkgJiYgIXJlc2V0X2NoaXAgJiYKKwkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAic2NzaSVsZDogJXMgLSBQZXJmb3JtaW5nIHN0b3BfZmlybXdhcmUuLi5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKKwkJc3RhdHVzID0gaGEtPmlzcF9vcHMtPnJlc2V0X2Zpcm13YXJlKGhhKTsKKwkJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUykgeworCQkJcWxhNHh4eF9jbWRfd2FpdChoYSk7CisJCQloYS0+aXNwX29wcy0+ZGlzYWJsZV9pbnRycyhoYSk7CisJCQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKKwkJCXFsYTR4eHhfYWJvcnRfYWN0aXZlX2NtZHMoaGEsIERJRF9SRVNFVCA8PCAxNik7CisJCX0gZWxzZSB7CisJCQkvKiBJZiB0aGUgc3RvcF9maXJtd2FyZSBmYWlscyB0aGVuCisJCQkgKiByZXNldCB0aGUgZW50aXJlIGNoaXAgKi8KKwkJCXJlc2V0X2NoaXAgPSAxOworCQkJY2xlYXJfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULCAmaGEtPmRwY19mbGFncyk7CisJCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOworCQl9CisJfQorCisJLyogSXNzdWUgZnVsbCBjaGlwIHJlc2V0IGlmIHJlY292ZXJpbmcgZnJvbSBhIGNhdGFzdHJvcGhpYyBlcnJvciwKKwkgKiBvciBpZiBzdG9wX2Zpcm13YXJlIGZhaWxzIGZvciBJU1AtODJ4eC4KKwkgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGNhc2UgZm9yIElTUC00eHh4ICovCisJaWYgKCFpc19xbGE4MDIyKGhhKSB8fCByZXNldF9jaGlwKSB7CisJCXFsYTR4eHhfY21kX3dhaXQoaGEpOworCQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKKwkJcWxhNHh4eF9hYm9ydF9hY3RpdmVfY21kcyhoYSwgRElEX1JFU0VUIDw8IDE2KTsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJzY3NpJWxkOiAlcyAtIFBlcmZvcm1pbmcgY2hpcCByZXNldC4uXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCXN0YXR1cyA9IGhhLT5pc3Bfb3BzLT5yZXNldF9jaGlwKGhhKTsKKwl9CisKKwkvKiBGbHVzaCBhbnkgcGVuZGluZyBkZGIgY2hhbmdlZCBBRU5zICovCisJcWxhNHh4eF9wcm9jZXNzX2FlbihoYSwgRkxVU0hfRERCX0NIQU5HRURfQUVOUyk7CisKK3JlY292ZXJfaGFfaW5pdF9hZGFwdGVyOgorCS8qIFVwb24gc3VjY2Vzc2Z1bCBmaXJtd2FyZS9jaGlwIHJlc2V0LCByZS1pbml0aWFsaXplIHRoZSBhZGFwdGVyICovCisJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUykgeworCQkvKiBGb3IgSVNQLTR4eHgsIGZvcmNlIGZ1bmN0aW9uIDEgdG8gYWx3YXlzIGluaXRpYWxpemUKKwkJICogYmVmb3JlIGZ1bmN0aW9uIDMgdG8gcHJldmVudCBib3RoIGZ1bmNpb25zIGZyb20KKwkJICogc3RlcHBpbmcgb24gdG9wIG9mIHRoZSBvdGhlciAqLworCQlpZiAoIWlzX3FsYTgwMjIoaGEpICYmIChoYS0+bWFjX2luZGV4ID09IDMpKQorCQkJc3NsZWVwKDYpOworCisJCS8qIE5PVEU6IEFGX09OTElORSBmbGFnIHNldCB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZgorCQkgKiAgICAgICBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlciAqLworCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgUFJFU0VSVkVfRERCX0xJU1QpOworCX0KKworCS8qIFJldHJ5IGZhaWxlZCBhZGFwdGVyIGluaXRpYWxpemF0aW9uLCBpZiBuZWNlc3NhcnkKKwkgKiBEbyBub3QgcmV0cnkgaW5pdGlhbGl6ZV9hZGFwdGVyIGZvciBSRVNFVF9IQV9JTlRSIChJU1AtNHh4eCBzcGVjaWZpYykKKwkgKiBjYXNlIHRvIHByZXZlbnQgcGluZy1wb25nIHJlc2V0cyBiZXR3ZWVuIGZ1bmN0aW9ucyAqLworCWlmICghdGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKSkgewogCQkvKiBBZGFwdGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCwgc2VlIGlmIHdlIGNhbiByZXRyeQotCQkgKiByZXNldHRpbmcgdGhlIGhhICovCisJCSAqIHJlc2V0dGluZyB0aGUgaGEuCisJCSAqIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlIERQQyBmb3IgdG9vIGxvbmcKKwkJICogd2l0aCBtdWx0aXBsZSByZXNldHMgaW4gdGhlIHNhbWUgdGhyZWFkLAorCQkgKiB1dGlsaXplIERQQyB0byByZXRyeSAqLwogCQlpZiAoIXRlc3RfYml0KERQQ19SRVRSWV9SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKSB7CiAJCQloYS0+cmV0cnlfcmVzZXRfaGFfY250ID0gTUFYX1JFU0VUX0hBX1JFVFJJRVM7CiAJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiByZWNvdmVyIGFkYXB0ZXIgLSByZXRyeWluZyAiCkBAIC05ODIsMjkgKzExNDYsNDMgQEAKIAkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiByZWNvdmVyIGFkYXB0ZXIgIgogCQkJCQkgICAgICAiZmFpbGVkIC0gYm9hcmQgZGlzYWJsZWRcbiIsCiAJCQkJCSAgICAgIGhhLT5ob3N0X25vKSk7Ci0JCQkJcWxhNHh4eF9mbHVzaF9hY3RpdmVfc3JicyhoYSk7CisJCQkJcWxhNHh4eF9kZWFkX2FkYXB0ZXJfY2xlYW51cChoYSk7CiAJCQkJY2xlYXJfYml0KERQQ19SRVRSWV9SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOwogCQkJCWNsZWFyX2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBX0RFU1RST1lfRERCX0xJU1QsCisJCQkJY2xlYXJfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULAogCQkJCQkgICZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQlzdGF0dXMgPSBRTEFfRVJST1I7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7Ci0JCWNsZWFyX2JpdChEUENfUkVTRVRfSEFfREVTVFJPWV9EREJfTElTVCwgJmhhLT5kcGNfZmxhZ3MpOworCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKTsKIAkJY2xlYXJfYml0KERQQ19SRVRSWV9SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOwogCX0KIAogCWhhLT5hZGFwdGVyX2Vycm9yX2NvdW50Kys7CiAKLQlpZiAoc3RhdHVzID09IFFMQV9TVUNDRVNTKQotCQlxbGE0eHh4X2VuYWJsZV9pbnRycyhoYSk7CisJaWYgKHRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykpCisJCWhhLT5pc3Bfb3BzLT5lbmFibGVfaW50cnMoaGEpOwogCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogcmVjb3ZlciBhZGFwdGVyIC4uIERPTkVcbiIsIGhhLT5ob3N0X25vKSk7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGhhLT5ob3N0KTsKKworCWNsZWFyX2JpdChEUENfUkVTRVRfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJREVCVUcyKHByaW50aygic2NzaSVsZDogcmVjb3ZlciBhZGFwdGVyOiAlc1xuIiwgaGEtPmhvc3Rfbm8sCisJICAgIHN0YXR1cyA9PSBRTEFfRVJST1IgPyAiRkFJTEVEIiA6ICJTVUNDRURFRCIpKTsKKwogCXJldHVybiBzdGF0dXM7CiB9CiAKK3ZvaWQgcWxhNHh4eF93YWtlX2RwYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaWYgKGhhLT5kcGNfdGhyZWFkICYmCisJICAgICF0ZXN0X2JpdChBRl9EUENfU0NIRURVTEVELCAmaGEtPmZsYWdzKSkgeworCQlzZXRfYml0KEFGX0RQQ19TQ0hFRFVMRUQsICZoYS0+ZmxhZ3MpOworCQlxdWV1ZV93b3JrKGhhLT5kcGNfdGhyZWFkLCAmaGEtPmRwY193b3JrKTsKKwl9Cit9CisKIC8qKgogICogcWxhNHh4eF9kb19kcGMgLSBkcGMgcm91dGluZQogICogQGRhdGE6IGluIG91ciBjYXNlIHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUKQEAgLTEwMjQsMjEgKzEyMDIsNDcgQEAKIAlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwogCiAJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IERQQyBoYW5kbGVyIHdha2luZyB1cC4iCi0JCSJmbGFncyA9IDB4JTA4bHgsIGRwY19mbGFncyA9IDB4JTA4bHggY3RybF9zdGF0ID0gMHglMDh4XG4iLAotCQloYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5mbGFncywgaGEtPmRwY19mbGFncywKLQkJcmVhZHcoJmhhLT5yZWctPmN0cmxfc3RhdHVzKSkpOworCSAgICAiZmxhZ3MgPSAweCUwOGx4LCBkcGNfZmxhZ3MgPSAweCUwOGx4XG4iLAorCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5mbGFncywgaGEtPmRwY19mbGFncykpCiAKIAkvKiBJbml0aWFsaXphdGlvbiBub3QgeWV0IGZpbmlzaGVkLiBEb24ndCBkbyBhbnl0aGluZyB5ZXQuICovCiAJaWYgKCF0ZXN0X2JpdChBRl9JTklUX0RPTkUsICZoYS0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlcl91cChoYSkgfHwKLQkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKKwkvKiBIQkEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcGVybWFuZW50bHkgZGlzYWJsZWQuCisJICogRG9uJ3QgcHJvY2VzcyBhbnl0aGluZyAqLworCWlmICh0ZXN0X2JpdChBRl9IQkFfR09JTkdfQVdBWSwgJmhhLT5mbGFncykpCisJCXJldHVybjsKKworCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQlpZiAodGVzdF9iaXQoRFBDX0hBX1VOUkVDT1ZFUkFCTEUsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJcWxhNF84eHh4X2lkY19sb2NrKGhhKTsKKwkJCXFsYTRfOHh4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLAorCQkJICAgIFFMQTgyWFhfREVWX0ZBSUxFRCk7CisJCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CisJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogRkFJTEVEXG4iKTsKKwkJCXFsYTRfOHh4eF9kZXZpY2Vfc3RhdGVfaGFuZGxlcihoYSk7CisJCX0KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEUENfSEFfTkVFRF9RVUlFU0NFTlQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJcWxhNF84eHh4X25lZWRfcXNudF9oYW5kbGVyKGhhKTsKKwkJfQorCX0KKworCWlmICghdGVzdF9iaXQoRFBDX1JFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpICYmCisJICAgICh0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfSU5UUiwgJmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQV9ERVNUUk9ZX0REQl9MSVNULCAmaGEtPmRwY19mbGFncykpIHsKLQkJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQV9ERVNUUk9ZX0REQl9MSVNULCAmaGEtPmRwY19mbGFncykgfHwKLQkJCXRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKQotCQkJcWxhNHh4eF9yZWNvdmVyX2FkYXB0ZXIoaGEsIFBSRVNFUlZFX0REQl9MSVNUKTsKKwkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKSkpIHsKKwkJaWYgKHFsNHhkb250cmVzZXRoYmEpIHsKKwkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBEb24ndCBSZXNldCBIQkFcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWNsZWFyX2JpdChEUENfUkVTRVRfSEFfRldfQ09OVEVYVCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJZ290byBkcGNfcG9zdF9yZXNldF9oYTsKKwkJfQorCQlpZiAodGVzdF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCQkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykpCisJCQlxbGE0eHh4X3JlY292ZXJfYWRhcHRlcihoYSk7CiAKIAkJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQV9JTlRSLCAmaGEtPmRwY19mbGFncykpIHsKIAkJCXVpbnQ4X3Qgd2FpdF90aW1lID0gUkVTRVRfSU5UUl9UT1Y7CkBAIC0xMDUzLDE4ICsxMjU3LDE4IEBACiAJCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFNSfEZTUiAiCiAJCQkJCSAgICAgICJiaXQgbm90IGNsZWFyZWQtLSByZXNldHRpbmdcbiIsCiAJCQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCQkJcWxhNHh4eF9mbHVzaF9hY3RpdmVfc3JicyhoYSk7CisJCQlxbGE0eHh4X2Fib3J0X2FjdGl2ZV9jbWRzKGhhLCBESURfUkVTRVQgPDwgMTYpOwogCQkJaWYgKHFsNHh4eF9sb2NrX2RydnJfd2FpdChoYSkgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJCQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKLQkJCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwKLQkJCQkJCVBSRVNFUlZFX0REQl9MSVNUKTsKKwkJCQlzdGF0dXMgPSBxbGE0eHh4X3JlY292ZXJfYWRhcHRlcihoYSk7CiAJCQl9CiAJCQljbGVhcl9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKTsKIAkJCWlmIChzdGF0dXMgPT0gUUxBX1NVQ0NFU1MpCi0JCQkJcWxhNHh4eF9lbmFibGVfaW50cnMoaGEpOworCQkJCWhhLT5pc3Bfb3BzLT5lbmFibGVfaW50cnMoaGEpOwogCQl9CiAJfQogCitkcGNfcG9zdF9yZXNldF9oYToKIAkvKiAtLS0tIHByb2Nlc3MgQUVOPyAtLS0gKi8KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KERQQ19BRU4sICZoYS0+ZHBjX2ZsYWdzKSkKIAkJcWxhNHh4eF9wcm9jZXNzX2FlbihoYSwgUFJPQ0VTU19BTExfQUVOUyk7CkBAIC0xMTAyLDEzICsxMzA2LDExIEBACiAJCQkJCSAgICBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpIHsKIAkJCQkJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsCiAJCQkJCQkJICAgRERCX1NUQVRFX09OTElORSk7Ci0JCQkJCQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKKwkJCQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJCQkJCSAgICAic2NzaSVsZDogJXM6IGRkYlslZF0iCi0JCQkJCQkgICAgIiBvc1slZF0gbWFya2VkIgotCQkJCQkJICAgICIgT05MSU5FXG4iLAorCQkJCQkJICAgICIgbWFya2VkIE9OTElORVxuIiwKIAkJCQkJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sCi0JCQkJCQkgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCi0JCQkJCQkgICAgZGRiX2VudHJ5LT5vc190YXJnZXRfaWQpOworCQkJCQkJICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKIAogCQkJCQkJaXNjc2lfdW5ibG9ja19zZXNzaW9uKAogCQkJCQkJICAgIGRkYl9lbnRyeS0+c2Vzcyk7CkBAIC0xMTQ0LDYgKzEzNDYsNyBAQAogCQkJfQogCQl9CiAJfQorCWNsZWFyX2JpdChBRl9EUENfU0NIRURVTEVELCAmaGEtPmZsYWdzKTsKIH0KIAogLyoqCkBAIC0xMTU1LDMwICsxMzU4LDk5IEBACiAKIAlpZiAodGVzdF9iaXQoQUZfSU5URVJSVVBUU19PTiwgJmhhLT5mbGFncykpIHsKIAkJLyogVHVybi1vZmYgaW50ZXJydXB0cyBvbiB0aGUgY2FyZC4gKi8KLQkJcWxhNHh4eF9kaXNhYmxlX2ludHJzKGhhKTsKKwkJaGEtPmlzcF9vcHMtPmRpc2FibGVfaW50cnMoaGEpOwogCX0KIAotCS8qIEtpbGwgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCAqLwotCWlmIChoYS0+ZHBjX3RocmVhZCkKLQkJZGVzdHJveV93b3JrcXVldWUoaGEtPmRwY190aHJlYWQpOwotCi0JLyogSXNzdWUgU29mdCBSZXNldCB0byBwdXQgZmlybXdhcmUgaW4gdW5rbm93biBzdGF0ZSAqLwotCWlmIChxbDR4eHhfbG9ja19kcnZyX3dhaXQoaGEpID09IFFMQV9TVUNDRVNTKQotCQlxbGE0eHh4X2h3X3Jlc2V0KGhhKTsKLQogCS8qIFJlbW92ZSB0aW1lciB0aHJlYWQsIGlmIHByZXNlbnQgKi8KIAlpZiAoaGEtPnRpbWVyX2FjdGl2ZSkKIAkJcWxhNHh4eF9zdG9wX3RpbWVyKGhhKTsKIAorCS8qIEtpbGwgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCAqLworCWlmIChoYS0+ZHBjX3RocmVhZCkKKwkJZGVzdHJveV93b3JrcXVldWUoaGEtPmRwY190aHJlYWQpOworCisJLyogUHV0IGZpcm13YXJlIGluIGtub3duIHN0YXRlICovCisJaGEtPmlzcF9vcHMtPnJlc2V0X2Zpcm13YXJlKGhhKTsKKworCWlmIChpc19xbGE4MDIyKGhhKSkgeworCQlxbGE0Xzh4eHhfaWRjX2xvY2soaGEpOworCQlxbGE0Xzh4eHhfY2xlYXJfZHJ2X2FjdGl2ZShoYSk7CisJCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKKwl9CisKIAkvKiBEZXRhY2ggaW50ZXJydXB0cyAqLwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKSkKLQkJZnJlZV9pcnEoaGEtPnBkZXYtPmlycSwgaGEpOworCQlxbGE0eHh4X2ZyZWVfaXJxcyhoYSk7CiAKIAkvKiBmcmVlIGV4dHJhIG1lbW9yeSAqLwogCXFsYTR4eHhfbWVtX2ZyZWUoaGEpOworfQogCi0JcGNpX2Rpc2FibGVfZGV2aWNlKGhhLT5wZGV2KTsKK2ludCBxbGE0Xzh4eHhfaW9zcGFjZV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCBzdGF0dXMgPSAwOworCXVpbnQ4X3QgcmV2aXNpb25faWQ7CisJdW5zaWduZWQgbG9uZyBtZW1fYmFzZSwgbWVtX2xlbiwgZGJfYmFzZSwgZGJfbGVuOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaGEtPnBkZXY7CiAKKwlzdGF0dXMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICJzY3NpKCVsZCkgRmFpbGVkIHRvIHJlc2VydmUgUElPIHJlZ2lvbnMgKCVzKSAiCisJCSAgICAic3RhdHVzPSVkXG4iLCBoYS0+aG9zdF9ubywgcGNpX25hbWUocGRldiksIHN0YXR1cyk7CisJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uX2lkKTsKKwlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJldmlzaW9uLWlkPSVkXG4iLAorCSAgICBfX2Z1bmNfXywgcmV2aXNpb25faWQpKTsKKwloYS0+cmV2aXNpb25faWQgPSByZXZpc2lvbl9pZDsKKworCS8qIHJlbWFwIHBoeXMgYWRkcmVzcyAqLworCW1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOyAvKiAwIGlzIGZvciBCQVIgMCAqLworCW1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICIlczogaW9yZW1hcCBmcm9tICVseCBhIHNpemUgb2YgJWx4XG4iLAorCSAgICBfX2Z1bmNfXywgbWVtX2Jhc2UsIG1lbV9sZW4pKTsKKworCS8qIG1hcHBpbmcgb2YgcGNpYmFzZSBwb2ludGVyICovCisJaGEtPm54X3BjaWJhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKG1lbV9iYXNlLCBtZW1fbGVuKTsKKwlpZiAoIWhhLT5ueF9wY2liYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgImNhbm5vdCByZW1hcCBNTUlPICglcyksIGFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaGEtPnBkZXYpOworCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKKwl9CisKKwkvKiBNYXBwaW5nIG9mIElPIGJhc2UgcG9pbnRlciwgZG9vciBiZWxsIHJlYWQgYW5kIHdyaXRlIHBvaW50ZXIgKi8KKworCS8qIG1hcHBpbmcgb2YgSU8gYmFzZSBwb2ludGVyICovCisJaGEtPnFsYTRfOHh4eF9yZWcgPQorCSAgICAoc3RydWN0IGRldmljZV9yZWdfODJ4eCAgX19pb21lbSAqKSgodWludDhfdCAqKWhhLT5ueF9wY2liYXNlICsKKwkgICAgMHhiYzAwMCArIChoYS0+cGRldi0+ZGV2Zm4gPDwgMTEpKTsKKworCWRiX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCk7ICAvKiBkb29yYmVsbCBpcyBvbiBiYXIgNCAqLworCWRiX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNCk7CisKKwkvKiBtYXBwaW5nIG9mIGRvb3JiZWxsIHdyaXRlIHBvaW50ZXIgKi8KKwloYS0+bnhfZGJfd3JfcHRyID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChkYl9iYXNlICsKKwkgICAgKGhhLT5wZGV2LT5kZXZmbiA8PCAxMiksIDQpOworCWlmICghaGEtPm54X2RiX3dyX3B0cikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICJjYW5ub3QgcmVtYXAgTU1JTyBkb29yYmVsbC13cml0ZSAoJXMpLCBhYm9ydGluZ1xuIiwKKwkJICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CisJfQorCS8qIG1hcHBpbmcgb2YgZG9vcmJlbGwgcmVhZCBwb2ludGVyICovCisJaGEtPm54X2RiX3JkX3B0ciA9ICh1aW50OF90ICopIGhhLT5ueF9wY2liYXNlICsgKDUxMiAqIDEwMjQpICsKKwkgICAgKGhhLT5wZGV2LT5kZXZmbiAqIDgpOworCWlmICghaGEtPm54X2RiX3JkX3B0cikKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAiY2Fubm90IHJlbWFwIE1NSU8gZG9vcmJlbGwtcmVhZCAoJXMpLCBhYm9ydGluZ1xuIiwKKwkJICAgIHBjaV9uYW1lKHBkZXYpKTsKKwlyZXR1cm4gMDsKKworaW9zcGFjZV9lcnJvcl9leGl0OgorCXJldHVybiAtRU5PTUVNOwogfQogCiAvKioqCkBAIC0xMTg4LDcgKzE0NjAsNyBAQAogICogVGhpcyByb3V0aW5lcyBtYXBzIEhCQSdzIHJlZ2lzdGVycyBmcm9tIHRoZSBwY2kgYWRkcmVzcyBzcGFjZQogICogaW50byB0aGUga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBmb3IgbWVtb3J5IG1hcHBlZCBpL28uCiAgKiovCi1zdGF0aWMgaW50IHFsYTR4eHhfaW9zcGFjZV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoraW50IHFsYTR4eHhfaW9zcGFjZV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCXVuc2lnbmVkIGxvbmcgcGlvLCBwaW9fbGVuLCBwaW9fZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBtbWlvLCBtbWlvX2xlbiwgbW1pb19mbGFnczsKQEAgLTExOTgsMTIgKzE0NzAsMTIgQEAKIAlwaW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoaGEtPnBkZXYsIDApOwogCWlmIChwaW9fZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCWlmIChwaW9fbGVuIDwgTUlOX0lPQkFTRV9MRU4pIHsKLQkJCWRldl93YXJuKCZoYS0+cGRldi0+ZGV2LAorCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJCSJJbnZhbGlkIFBDSSBJL08gcmVnaW9uIHNpemVcbiIpOwogCQkJcGlvID0gMDsKIAkJfQogCX0gZWxzZSB7Ci0JCWRldl93YXJuKCZoYS0+cGRldi0+ZGV2LCAicmVnaW9uICMwIG5vdCBhIFBJTyByZXNvdXJjZVxuIik7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInJlZ2lvbiAjMCBub3QgYSBQSU8gcmVzb3VyY2VcbiIpOwogCQlwaW8gPSAwOwogCX0KIApAQCAtMTIxMywyMCArMTQ4NSwyMSBAQAogCW1taW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoaGEtPnBkZXYsIDEpOwogCiAJaWYgKCEobW1pb19mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlkZXZfZXJyKCZoYS0+cGRldi0+ZGV2LAotCQkJInJlZ2lvbiAjMCBub3QgYW4gTU1JTyByZXNvdXJjZSwgYWJvcnRpbmdcbiIpOworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJICAgICJyZWdpb24gIzAgbm90IGFuIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iKTsKIAogCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKIAl9CisKIAlpZiAobW1pb19sZW4gPCBNSU5fSU9CQVNFX0xFTikgewotCQlkZXZfZXJyKCZoYS0+cGRldi0+ZGV2LAotCQkJIkludmFsaWQgUENJIG1lbSByZWdpb24gc2l6ZSwgYWJvcnRpbmdcbiIpOworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJICAgICJJbnZhbGlkIFBDSSBtZW0gcmVnaW9uIHNpemUsIGFib3J0aW5nXG4iKTsKIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCiAJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMoaGEtPnBkZXYsIERSSVZFUl9OQU1FKSkgewotCQlkZXZfd2FybigmaGEtPnBkZXYtPmRldiwKLQkJCSJGYWlsZWQgdG8gcmVzZXJ2ZSBQSU8vTU1JTyByZWdpb25zXG4iKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZhaWxlZCB0byByZXNlcnZlIFBJTy9NTUlPIHJlZ2lvbnNcbiIpOwogCiAJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCX0KQEAgLTEyMzUsOCArMTUwOCw4IEBACiAJaGEtPnBpb19sZW5ndGggPSBwaW9fbGVuOwogCWhhLT5yZWcgPSBpb3JlbWFwKG1taW8sIE1JTl9JT0JBU0VfTEVOKTsKIAlpZiAoIWhhLT5yZWcpIHsKLQkJZGV2X2VycigmaGEtPnBkZXYtPmRldiwKLQkJCSJjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIpOworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJICAgICJjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIpOwogCiAJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCX0KQEAgLTEyNDcsNiArMTUyMCw2MCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCitzdGF0aWMgc3RydWN0IGlzcF9vcGVyYXRpb25zIHFsYTR4eHhfaXNwX29wcyA9IHsKKwkuaW9zcGFjZV9jb25maWcgICAgICAgICA9IHFsYTR4eHhfaW9zcGFjZV9jb25maWcsCisJLnBjaV9jb25maWcgICAgICAgICAgICAgPSBxbGE0eHh4X3BjaV9jb25maWcsCisJLmRpc2FibGVfaW50cnMgICAgICAgICAgPSBxbGE0eHh4X2Rpc2FibGVfaW50cnMsCisJLmVuYWJsZV9pbnRycyAgICAgICAgICAgPSBxbGE0eHh4X2VuYWJsZV9pbnRycywKKwkuc3RhcnRfZmlybXdhcmUgICAgICAgICA9IHFsYTR4eHhfc3RhcnRfZmlybXdhcmUsCisJLmludHJfaGFuZGxlciAgICAgICAgICAgPSBxbGE0eHh4X2ludHJfaGFuZGxlciwKKwkuaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSA9IHFsYTR4eHhfaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSwKKwkucmVzZXRfY2hpcCAgICAgICAgICAgICA9IHFsYTR4eHhfc29mdF9yZXNldCwKKwkucmVzZXRfZmlybXdhcmUgICAgICAgICA9IHFsYTR4eHhfaHdfcmVzZXQsCisJLnF1ZXVlX2lvY2IgICAgICAgICAgICAgPSBxbGE0eHh4X3F1ZXVlX2lvY2IsCisJLmNvbXBsZXRlX2lvY2IgICAgICAgICAgPSBxbGE0eHh4X2NvbXBsZXRlX2lvY2IsCisJLnJkX3NoZHdfcmVxX3Ffb3V0ICAgICAgPSBxbGE0eHh4X3JkX3NoZHdfcmVxX3Ffb3V0LAorCS5yZF9zaGR3X3JzcF9xX2luICAgICAgID0gcWxhNHh4eF9yZF9zaGR3X3JzcF9xX2luLAorCS5nZXRfc3lzX2luZm8gICAgICAgICAgID0gcWxhNHh4eF9nZXRfc3lzX2luZm8sCit9OworCitzdGF0aWMgc3RydWN0IGlzcF9vcGVyYXRpb25zIHFsYTRfOHh4eF9pc3Bfb3BzID0geworCS5pb3NwYWNlX2NvbmZpZyAgICAgICAgID0gcWxhNF84eHh4X2lvc3BhY2VfY29uZmlnLAorCS5wY2lfY29uZmlnICAgICAgICAgICAgID0gcWxhNF84eHh4X3BjaV9jb25maWcsCisJLmRpc2FibGVfaW50cnMgICAgICAgICAgPSBxbGE0Xzh4eHhfZGlzYWJsZV9pbnRycywKKwkuZW5hYmxlX2ludHJzICAgICAgICAgICA9IHFsYTRfOHh4eF9lbmFibGVfaW50cnMsCisJLnN0YXJ0X2Zpcm13YXJlICAgICAgICAgPSBxbGE0Xzh4eHhfbG9hZF9yaXNjLAorCS5pbnRyX2hhbmRsZXIgICAgICAgICAgID0gcWxhNF84eHh4X2ludHJfaGFuZGxlciwKKwkuaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSA9IHFsYTRfOHh4eF9pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lLAorCS5yZXNldF9jaGlwICAgICAgICAgICAgID0gcWxhNF84eHh4X2lzcF9yZXNldCwKKwkucmVzZXRfZmlybXdhcmUgICAgICAgICA9IHFsYTRfOHh4eF9zdG9wX2Zpcm13YXJlLAorCS5xdWV1ZV9pb2NiICAgICAgICAgICAgID0gcWxhNF84eHh4X3F1ZXVlX2lvY2IsCisJLmNvbXBsZXRlX2lvY2IgICAgICAgICAgPSBxbGE0Xzh4eHhfY29tcGxldGVfaW9jYiwKKwkucmRfc2hkd19yZXFfcV9vdXQgICAgICA9IHFsYTRfOHh4eF9yZF9zaGR3X3JlcV9xX291dCwKKwkucmRfc2hkd19yc3BfcV9pbiAgICAgICA9IHFsYTRfOHh4eF9yZF9zaGR3X3JzcF9xX2luLAorCS5nZXRfc3lzX2luZm8gICAgICAgICAgID0gcWxhNF84eHh4X2dldF9zeXNfaW5mbywKK307CisKK3VpbnQxNl90IHFsYTR4eHhfcmRfc2hkd19yZXFfcV9vdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXJldHVybiAodWludDE2X3QpbGUzMl90b19jcHUoaGEtPnNoYWRvd19yZWdzLT5yZXFfcV9vdXQpOworfQorCit1aW50MTZfdCBxbGE0Xzh4eHhfcmRfc2hkd19yZXFfcV9vdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXJldHVybiAodWludDE2X3QpbGUzMl90b19jcHUocmVhZGwoJmhhLT5xbGE0Xzh4eHhfcmVnLT5yZXFfcV9vdXQpKTsKK30KKwordWludDE2X3QgcWxhNHh4eF9yZF9zaGR3X3JzcF9xX2luKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlyZXR1cm4gKHVpbnQxNl90KWxlMzJfdG9fY3B1KGhhLT5zaGFkb3dfcmVncy0+cnNwX3FfaW4pOworfQorCit1aW50MTZfdCBxbGE0Xzh4eHhfcmRfc2hkd19yc3BfcV9pbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcmV0dXJuICh1aW50MTZfdClsZTMyX3RvX2NwdShyZWFkbCgmaGEtPnFsYTRfOHh4eF9yZWctPnJzcF9xX2luKSk7Cit9CisKIC8qKgogICogcWxhNHh4eF9wcm9iZV9hZGFwdGVyIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvYmUgSEJBCiAgKiBAcGRldjogcG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQpAQCAtMTI2NCw2ICsxNTkxLDcgQEAKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CiAJdWludDhfdCBpbml0X3JldHJ5X2NvdW50ID0gMDsKIAljaGFyIGJ1ZlszNF07CisJc3RydWN0IHFsYTRfOHh4eF9sZWdhY3lfaW50cl9zZXQgKm54X2xlZ2FjeV9pbnRyOwogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQogCQlyZXR1cm4gLTE7CkBAIC0xMjg0LDEyICsxNjEyLDMwIEBACiAJaGEtPmhvc3QgPSBob3N0OwogCWhhLT5ob3N0X25vID0gaG9zdC0+aG9zdF9ubzsKIAotCS8qIENvbmZpZ3VyZSBQQ0kgSS9PIHNwYWNlLiAqLwotCXJldCA9IHFsYTR4eHhfaW9zcGFjZV9jb25maWcoaGEpOwotCWlmIChyZXQpCi0JCWdvdG8gcHJvYmVfZmFpbGVkOworCS8qIFNldHVwIFJ1bnRpbWUgY29uZmlndXJhYmxlIG9wdGlvbnMgKi8KKwlpZiAoaXNfcWxhODAyMihoYSkpIHsKKwkJaGEtPmlzcF9vcHMgPSAmcWxhNF84eHh4X2lzcF9vcHM7CisJCXJ3bG9ja19pbml0KCZoYS0+aHdfbG9jayk7CisJCWhhLT5xZHJfc25fd2luZG93ID0gLTE7CisJCWhhLT5kZHJfbW5fd2luZG93ID0gLTE7CisJCWhhLT5jdXJyX3dpbmRvdyA9IDI1NTsKKwkJaGEtPmZ1bmNfbnVtID0gUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKwkJbnhfbGVnYWN5X2ludHIgPSAmbGVnYWN5X2ludHJbaGEtPmZ1bmNfbnVtXTsKKwkJaGEtPm54X2xlZ2FjeV9pbnRyLmludF92ZWNfYml0ID0gbnhfbGVnYWN5X2ludHItPmludF92ZWNfYml0OworCQloYS0+bnhfbGVnYWN5X2ludHIudGd0X3N0YXR1c19yZWcgPQorCQkJbnhfbGVnYWN5X2ludHItPnRndF9zdGF0dXNfcmVnOworCQloYS0+bnhfbGVnYWN5X2ludHIudGd0X21hc2tfcmVnID0gbnhfbGVnYWN5X2ludHItPnRndF9tYXNrX3JlZzsKKwkJaGEtPm54X2xlZ2FjeV9pbnRyLnBjaV9pbnRfcmVnID0gbnhfbGVnYWN5X2ludHItPnBjaV9pbnRfcmVnOworCX0gZWxzZSB7CisJCWhhLT5pc3Bfb3BzID0gJnFsYTR4eHhfaXNwX29wczsKKwl9CiAKLQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIkZvdW5kIGFuIElTUCUwNHgsIGlycSAlZCwgaW9iYXNlIDB4JXBcbiIsCisJLyogQ29uZmlndXJlIFBDSSBJL08gc3BhY2UuICovCisJcmV0ID0gaGEtPmlzcF9vcHMtPmlvc3BhY2VfY29uZmlnKGhhKTsKKwlpZiAocmV0KQorCQlnb3RvIHByb2JlX2ZhaWxlZF9pb2NvbmZpZzsKKworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkZvdW5kIGFuIElTUCUwNHgsIGlycSAlZCwgaW9iYXNlIDB4JXBcbiIsCiAJCSAgIHBkZXYtPmRldmljZSwgcGRldi0+aXJxLCBoYS0+cmVnKTsKIAogCXFsYTR4eHhfY29uZmlnX2RtYV9hZGRyZXNzaW5nKGhhKTsKQEAgLTEyOTksMzIgKzE2NDUsNDEgQEAKIAlJTklUX0xJU1RfSEVBRCgmaGEtPmZyZWVfc3JiX3EpOwogCiAJbXV0ZXhfaW5pdCgmaGEtPm1ib3hfc2VtKTsKKwlpbml0X2NvbXBsZXRpb24oJmhhLT5tYnhfaW50cl9jb21wKTsKIAogCXNwaW5fbG9ja19pbml0KCZoYS0+aGFyZHdhcmVfbG9jayk7CiAKIAkvKiBBbGxvY2F0ZSBkbWEgYnVmZmVycyAqLwogCWlmIChxbGE0eHh4X21lbV9hbGxvYyhoYSkpIHsKLQkJZGV2X3dhcm4oJmhhLT5wZGV2LT5kZXYsCi0JCQkgICAiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyXG4iKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlclxuIik7CiAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCisJaWYgKGlzX3FsYTgwMjIoaGEpKQorCQkodm9pZCkgcWxhNF84eHh4X2dldF9mbGFzaF9pbmZvKGhhKTsKKwogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgSG9zdCBhZGFwdGVyIHJlcXVlc3QvcmVzcG9uc2UgcXVldWVzIGFuZAogCSAqIGZpcm13YXJlCiAJICogTk9URTogaW50ZXJydXB0cyBlbmFibGVkIHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uCiAJICovCiAJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFQlVJTERfRERCX0xJU1QpOwotCXdoaWxlIChzdGF0dXMgPT0gUUxBX0VSUk9SICYmIGluaXRfcmV0cnlfY291bnQrKyA8IE1BWF9JTklUX1JFVFJJRVMpIHsKKwl3aGlsZSAoKCF0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSAmJgorCSAgICBpbml0X3JldHJ5X2NvdW50KysgPCBNQVhfSU5JVF9SRVRSSUVTKSB7CiAJCURFQlVHMihwcmludGsoInNjc2k6ICVzOiByZXRyeWluZyBhZGFwdGVyIGluaXRpYWxpemF0aW9uICIKIAkJCSAgICAgICIoJWQpXG4iLCBfX2Z1bmNfXywgaW5pdF9yZXRyeV9jb3VudCkpOwotCQlxbGE0eHh4X3NvZnRfcmVzZXQoaGEpOworCisJCWlmIChoYS0+aXNwX29wcy0+cmVzZXRfY2hpcChoYSkgPT0gUUxBX0VSUk9SKQorCQkJY29udGludWU7CisKIAkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFQlVJTERfRERCX0xJU1QpOwogCX0KLQlpZiAoc3RhdHVzID09IFFMQV9FUlJPUikgewotCQlkZXZfd2FybigmaGEtPnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXJcbiIpOworCisJaWYgKCF0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXJcbiIpOwogCiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gcHJvYmVfZmFpbGVkOwpAQCAtMTM0MCw4ICsxNjk1LDkgQEAKIAogICAgICAgICByZXQgPSBzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAoaG9zdCwgTUFYX1NSQlMpOwogICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgZGV2X3dhcm4oJmhhLT5wZGV2LT5kZXYsICJzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIHByb2JlX2ZhaWxlZDsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgInNjc2lfaW5pdF9zaGFyZWRfdGFnX21hcCBmYWlsZWRcbiIpOworCQlnb3RvIHByb2JlX2ZhaWxlZDsKICAgICAgICAgfQogCiAJLyogU3RhcnR1cCB0aGUga2VybmVsIHRocmVhZCBmb3IgdGhpcyBob3N0IGFkYXB0ZXIuICovCkBAIC0xMzUwLDI0ICsxNzA2LDI3IEBACiAJc3ByaW50ZihidWYsICJxbGE0eHh4XyVsdV9kcGMiLCBoYS0+aG9zdF9ubyk7CiAJaGEtPmRwY190aHJlYWQgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShidWYpOwogCWlmICghaGEtPmRwY190aHJlYWQpIHsKLQkJZGV2X3dhcm4oJmhhLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gc3RhcnQgRFBDIHRocmVhZCFcbiIpOworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gc3RhcnQgRFBDIHRocmVhZCFcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIHByb2JlX2ZhaWxlZDsKIAl9CiAJSU5JVF9XT1JLKCZoYS0+ZHBjX3dvcmssIHFsYTR4eHhfZG9fZHBjKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcWxhNHh4eF9pbnRyX2hhbmRsZXIsCi0JCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwgInFsYTR4eHgiLCBoYSk7Ci0JaWYgKHJldCkgewotCQlkZXZfd2FybigmaGEtPnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXNlcnZlIGludGVycnVwdCAlZCIKLQkJCSIgYWxyZWFkeSBpbiB1c2UuXG4iLCBwZGV2LT5pcnEpOwotCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwkvKiBGb3IgSVNQLTgyWFgsIHJlcXVlc3RfaXJxcyBpcyBjYWxsZWQgaW4gcWxhNF84eHh4X2xvYWRfcmlzYworCSAqICh3aGljaCBpcyBjYWxsZWQgaW5kaXJlY3RseSBieSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlciksCisJICogc28gdGhhdCBpcnFzIHdpbGwgYmUgcmVnaXN0ZXJlZCBhZnRlciBjcmJpbml0IGJ1dCBiZWZvcmUKKwkgKiBtYnhfaW50cl9lbmFibGUuCisJICovCisJaWYgKCFpc19xbGE4MDIyKGhhKSkgeworCQlyZXQgPSBxbGE0eHh4X3JlcXVlc3RfaXJxcyhoYSk7CisJCWlmIChyZXQpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhaWxlZCB0byByZXNlcnZlICIKKwkJCSAgICAiaW50ZXJydXB0ICVkIGFscmVhZHkgaW4gdXNlLlxuIiwgcGRldi0+aXJxKTsKKwkJCWdvdG8gcHJvYmVfZmFpbGVkOworCQl9CiAJfQotCXNldF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKTsKLQlob3N0LT5pcnEgPSBwZGV2LT5pcnE7Ci0JREVCVUcocHJpbnRrKCJzY3NpJWQ6IGlycSAlZCBhdHRhY2hlZFxuIiwgaGEtPmhvc3Rfbm8sIGhhLT5wZGV2LT5pcnEpKTsKIAotCXFsYTR4eHhfZW5hYmxlX2ludHJzKGhhKTsKKwloYS0+aXNwX29wcy0+ZW5hYmxlX2ludHJzKGhhKTsKIAogCS8qIFN0YXJ0IHRpbWVyIHRocmVhZC4gKi8KIAlxbGE0eHh4X3N0YXJ0X3RpbWVyKGhhLCBxbGE0eHh4X3RpbWVyLCAxKTsKQEAgLTEzOTEsNiArMTc1MCw4IEBACiAKIHByb2JlX2ZhaWxlZDoKIAlxbGE0eHh4X2ZyZWVfYWRhcHRlcihoYSk7CisKK3Byb2JlX2ZhaWxlZF9pb2NvbmZpZzoKIAlzY3NpX2hvc3RfcHV0KGhhLT5ob3N0KTsKIAogcHJvYmVfZGlzYWJsZV9kZXZpY2U6CkBAIC0xNDA5LDEwICsxNzcwLDcgQEAKIAogCWhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JcWxhNHh4eF9kaXNhYmxlX2ludHJzKGhhKTsKLQotCXdoaWxlICh0ZXN0X2JpdChEUENfUkVTRVRfSEFfSU5UUiwgJmhhLT5kcGNfZmxhZ3MpKQotCQlzc2xlZXAoMSk7CisJc2V0X2JpdChBRl9IQkFfR09JTkdfQVdBWSwgJmhhLT5mbGFncyk7CiAKIAkvKiByZW1vdmUgZGV2cyBmcm9tIGlzY3NpX3Nlc3Npb25zIHRvIHNjc2lfZGV2aWNlcyAqLwogCXFsYTR4eHhfZnJlZV9kZGJfbGlzdChoYSk7CkBAIC0xNDIzLDYgKzE3ODEsNyBAQAogCiAJc2NzaV9ob3N0X3B1dChoYS0+aG9zdCk7CiAKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQogCkBAIC0xNDc5LDcgKzE4MzgsOCBAQAogICoKICAqIFRoaXMgcm91dGluZSByZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBzcmIgYXQgdGhlIHNwZWNpZmllZCBpbmRleAogICoqLwotc3RydWN0IHNyYiAqIHFsYTR4eHhfZGVsX2Zyb21fYWN0aXZlX2FycmF5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgaW5kZXgpCitzdHJ1Y3Qgc3JiICpxbGE0eHh4X2RlbF9mcm9tX2FjdGl2ZV9hcnJheShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisgICAgdWludDMyX3QgaW5kZXgpCiB7CiAJc3RydWN0IHNyYiAqc3JiID0gTlVMTDsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBOVUxMOwpAQCAtMTYwNSw3ICsxOTY1LDcgQEAKIAlpbnQgcmV0ID0gU1VDQ0VTUzsKIAlpbnQgd2FpdCA9IDA7CiAKLQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJICAgICJzY3NpJWxkOiVkOiVkOiBBYm9ydCBjb21tYW5kIGlzc3VlZCBjbWQ9JXAsIHBpZD0lbGRcbiIsCiAJICAgIGhhLT5ob3N0X25vLCBpZCwgbHVuLCBjbWQsIHNlcmlhbCk7CiAKQEAgLTE2MzcsNyArMTk5Nyw3IEBACiAJCX0KIAl9CiAKLQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJICAgICJzY3NpJWxkOiVkOiVkOiBBYm9ydCBjb21tYW5kIC0gJXNcbiIsCiAJICAgIGhhLT5ob3N0X25vLCBpZCwgbHVuLCAocmV0ID09IFNVQ0NFU1MpID8gInN1Y2NlZGVkIiA6ICJmYWlsZWQiKTsKIApAQCAtMTY2MCw3ICsyMDIwLDEyIEBACiAJaWYgKCFkZGJfZW50cnkpCiAJCXJldHVybiByZXQ7CiAKLQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwKKwlyZXQgPSBpc2NzaV9ibG9ja19zY3NpX2VoKGNtZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBGQUlMRUQ7CisKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICJzY3NpJWxkOiVkOiVkOiVkOiBERVZJQ0UgUkVTRVQgSVNTVUVELlxuIiwgaGEtPmhvc3Rfbm8sCiAJCSAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOwogCkBAIC0xNjczLDEzICsyMDM4LDEzIEBACiAJLyogRklYTUU6IHdhaXQgZm9yIGhiYSB0byBnbyBvbmxpbmUgKi8KIAlzdGF0ID0gcWxhNHh4eF9yZXNldF9sdW4oaGEsIGRkYl9lbnRyeSwgY21kLT5kZXZpY2UtPmx1bik7CiAJaWYgKHN0YXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsICJERVZJQ0UgUkVTRVQgRkFJTEVELiAlZFxuIiwgc3RhdCk7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkRFVklDRSBSRVNFVCBGQUlMRUQuICVkXG4iLCBzdGF0KTsKIAkJZ290byBlaF9kZXZfcmVzZXRfZG9uZTsKIAl9CiAKIAlpZiAocWxhNHh4eF9laF93YWl0X2Zvcl9jb21tYW5kcyhoYSwgc2NzaV90YXJnZXQoY21kLT5kZXZpY2UpLAogCQkJCQkgY21kLT5kZXZpY2UpKSB7Ci0JCWRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LAorCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkgICAiREVWSUNFIFJFU0VUIEZBSUxFRCAtIHdhaXRpbmcgZm9yICIKIAkJCSAgICJjb21tYW5kcy5cbiIpOwogCQlnb3RvIGVoX2Rldl9yZXNldF9kb25lOwpAQCAtMTY5MCw3ICsyMDU1LDcgQEAKIAkJTU1fTFVOX1JFU0VUKSAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBlaF9kZXZfcmVzZXRfZG9uZTsKIAotCWRldl9pbmZvKCZoYS0+cGRldi0+ZGV2LAorCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJICAgInNjc2koJWxkOiVkOiVkOiVkKTogREVWSUNFIFJFU0VUIFNVQ0NFRURFRC5cbiIsCiAJCSAgIGhhLT5ob3N0X25vLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAogCQkgICBjbWQtPmRldmljZS0+bHVuKTsKQEAgLTE3MTIsMTEgKzIwNzcsMTUgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChjbWQtPmRldmljZS0+aG9zdCk7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOwotCWludCBzdGF0OworCWludCBzdGF0LCByZXQ7CiAKIAlpZiAoIWRkYl9lbnRyeSkKIAkJcmV0dXJuIEZBSUxFRDsKIAorCXJldCA9IGlzY3NpX2Jsb2NrX3Njc2lfZWgoY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzY3NpX3RhcmdldChjbWQtPmRldmljZSksCiAJCSAgICAgICAiV0FSTSBUQVJHRVQgUkVTRVQgSVNTVUVELlxuIik7CiAKQEAgLTE3NjksNyArMjEzOCwxMyBAQAogCiAJaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCi0JZGV2X2luZm8oJmhhLT5wZGV2LT5kZXYsCisJaWYgKHFsNHhkb250cmVzZXRoYmEpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IERvbid0IFJlc2V0IEhCQVxuIiwKKwkJICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICJzY3NpKCVsZDolZDolZDolZCk6IEhPU1QgUkVTRVQgSVNTVUVELlxuIiwgaGEtPmhvc3Rfbm8sCiAJCSAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOwogCkBAIC0xNzgxLDIwICsyMTU2LDIyIEBACiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JLyogbWFrZSBzdXJlIHRoZSBkcGMgdGhyZWFkIGlzIHN0b3BwZWQgd2hpbGUgd2UgcmVzZXQgdGhlIGhiYSAqLwotCWNsZWFyX2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpOwotCWZsdXNoX3dvcmtxdWV1ZShoYS0+ZHBjX3RocmVhZCk7CisJaWYgKCF0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlpZiAoaXNfcWxhODAyMihoYSkpCisJCQlzZXRfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULCAmaGEtPmRwY19mbGFncyk7CisJCWVsc2UKKwkJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJfQogCi0JaWYgKHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKGhhLCBQUkVTRVJWRV9EREJfTElTVCkgPT0gUUxBX1NVQ0NFU1MpCisJaWYgKHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKGhhKSA9PSBRTEFfU1VDQ0VTUykKIAkJcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CiAKLQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIkhPU1QgUkVTRVQgJXMuXG4iLAorCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhPU1QgUkVTRVQgJXMuXG4iLAogCQkgICByZXR1cm5fc3RhdHVzID09IEZBSUxFRCA/ICJGQUlMRUQiIDogIlNVQ0NFREVEIik7CiAKIAlyZXR1cm4gcmV0dXJuX3N0YXR1czsKIH0KIAotCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcWxhNHh4eF9wY2lfdGJsW10gPSB7CiAJewogCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUUxPR0lDLApAQCAtMTgxNCw2ICsyMTkxLDEyIEBACiAJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKIAl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gUENJX1ZFTkRPUl9JRF9RTE9HSUMsCisJCS5kZXZpY2UgICAgICAgICA9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMjIsCisJCS5zdWJ2ZW5kb3IgICAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgICA9IFBDSV9BTllfSUQsCisJfSwKIAl7MCwgMH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTR4eHhfcGNpX3RibCk7CkBAIC0xODY5LDcgKzIyNTIsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcWxhNHh4eF9tb2R1bGVfZXhpdCh2b2lkKQogewotCXFsNF9tb2RfdW5sb2FkID0gMTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnFsYTR4eHhfcGNpX2RyaXZlcik7CiAJaXNjc2lfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJnFsYTR4eHhfaXNjc2lfdHJhbnNwb3J0KTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc3JiX2NhY2hlcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaAppbmRleCAyOGE2YzQ5Li5jOTA1ZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKQEAgLTUsNCArNSw0IEBACiAgKiBTZWUgTElDRU5TRS5xbGE0eHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCiAKLSNkZWZpbmUgUUxBNFhYWF9EUklWRVJfVkVSU0lPTgkiNS4wMi4wMC1rMSIKKyNkZWZpbmUgUUxBNFhYWF9EUklWRVJfVkVSU0lPTgkiNS4wMi4wMC1rMiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwppbmRleCBjYTVjMTVjLi41M2Q3ZWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCkBAIC03MjksNyArNzI5LDcgQEAKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHFwdGktPm9wOwogCi0JcXB0aS0+cWhvc3QtPmlycSA9IHFwdGktPmlycSA9IG9wLT5pcnFzWzBdOworCXFwdGktPnFob3N0LT5pcnEgPSBxcHRpLT5pcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAogCS8qIFdlIHVzZWQgdG8gdHJ5IHZhcmlvdXMgb3Zlcmx5LWNsZXZlciB0aGluZ3MgdG8KIAkgKiByZWR1Y2UgdGhlIGludGVycnVwdCBwcm9jZXNzaW5nIG92ZXJoZWFkIG9uCkBAIC0xMzAyLDcgKzEzMDIsNyBAQAogCS8qIFNvbWV0aW1lcyBBbnRhcmVzIGNhcmRzIGNvbWUgdXAgbm90IGNvbXBsZXRlbHkKIAkgKiBzZXR1cCwgYW5kIHdlIGdldCBhIHJlcG9ydCBvZiBhIHplcm8gSVJRLgogCSAqLwotCWlmIChvcC0+aXJxc1swXSA9PSAwKQorCWlmIChvcC0+YXJjaGRhdGEuaXJxc1swXSA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKHN0cnVjdCBxbG9naWNwdGkpKTsKQEAgLTE0NjcsMTIgKzE0NjcsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgcXB0aV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmcXB0aV9zYnVzX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZxcHRpX3NidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHFwdGlfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZxcHRpX3NidXNfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcXB0aV9zYnVzX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9ERVNDUklQVElPTigiUWxvZ2ljSVNQIFNCVVMgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwppbmRleCAxMzYzMjliLi5iMDJiZGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKQEAgLTE5OTEsNyArMTk5MSw4IEBACiAJCWJsb2NrID0gbGJhICsgYWxpZ25tZW50OwogCQlyZW0gPSBkb19kaXYoYmxvY2ssIGdyYW51bGFyaXR5KTsKIAotCQlzZXRfYml0KGJsb2NrLCBtYXBfc3RvcmVwKTsKKwkJaWYgKGJsb2NrIDwgbWFwX3NpemUpCisJCQlzZXRfYml0KGJsb2NrLCBtYXBfc3RvcmVwKTsKIAogCQlsYmEgKz0gZ3JhbnVsYXJpdHkgLSByZW07CiAJfQpAQCAtMjAxMSw3ICsyMDEyLDggQEAKIAkJYmxvY2sgPSBsYmEgKyBhbGlnbm1lbnQ7CiAJCXJlbSA9IGRvX2RpdihibG9jaywgZ3JhbnVsYXJpdHkpOwogCi0JCWlmIChyZW0gPT0gMCAmJiBsYmEgKyBncmFudWxhcml0eSA8PSBlbmQpCisJCWlmIChyZW0gPT0gMCAmJiBsYmEgKyBncmFudWxhcml0eSA8PSBlbmQgJiYKKwkJICAgIGJsb2NrIDwgbWFwX3NpemUpCiAJCQljbGVhcl9iaXQoYmxvY2ssIG1hcF9zdG9yZXApOwogCiAJCWxiYSArPSBncmFudWxhcml0eSAtIHJlbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IGE1ZDYzMGYuLjJiZjk4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMzA3LDYgKzMwNywxOSBAQAogCQkgICAgKHNzaGRyLmFzYyA9PSAweDA0KSAmJiAoc3NoZHIuYXNjcSA9PSAweDAyKSkKIAkJCXJldHVybiBGQUlMRUQ7CiAKKwkJaWYgKHNzaGRyLmFzYyA9PSAweDNmICYmIHNzaGRyLmFzY3EgPT0gMHgwZSkKKwkJCXNjbWRfcHJpbnRrKEtFUk5fV0FSTklORywgc2NtZCwKKwkJCQkgICAgIldhcm5pbmchIFJlY2VpdmVkIGFuIGluZGljYXRpb24gdGhhdCB0aGUgIgorCQkJCSAgICAiTFVOIGFzc2lnbm1lbnRzIG9uIHRoaXMgdGFyZ2V0IGhhdmUgIgorCQkJCSAgICAiY2hhbmdlZC4gVGhlIExpbnV4IFNDU0kgbGF5ZXIgZG9lcyBub3QgIgorCQkJCSAgICAiYXV0b21hdGljYWxseSByZW1hcCBMVU4gYXNzaWdubWVudHMuXG4iKTsKKwkJZWxzZSBpZiAoc3NoZHIuYXNjID09IDB4M2YpCisJCQlzY21kX3ByaW50ayhLRVJOX1dBUk5JTkcsIHNjbWQsCisJCQkJICAgICJXYXJuaW5nISBSZWNlaXZlZCBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlICIKKwkJCQkgICAgIm9wZXJhdGluZyBwYXJhbWV0ZXJzIG9uIHRoaXMgdGFyZ2V0IGhhdmUgIgorCQkJCSAgICAiY2hhbmdlZC4gVGhlIExpbnV4IFNDU0kgbGF5ZXIgZG9lcyBub3QgIgorCQkJCSAgICAiYXV0b21hdGljYWxseSBhZGp1c3QgdGhlc2UgcGFyYW1ldGVycy5cbiIpOworCiAJCWlmIChibGtfYmFycmllcl9ycShzY21kLT5yZXF1ZXN0KSkKIAkJCS8qCiAJCQkgKiBiYXJyaWVyIHJlcXVlc3RzIHNob3VsZCBhbHdheXMgcmV0cnkgb24gVUEKQEAgLTE3NjIsNiArMTc3NSwxNCBAQAogCQkgKiB3aGF0IHdlIG5lZWQgdG8gZG8gdG8gZ2V0IGl0IHVwIGFuZCBvbmxpbmUgYWdhaW4gKGlmIHdlIGNhbikuCiAJCSAqIElmIHdlIGZhaWwsIHdlIGVuZCB1cCB0YWtpbmcgdGhlIHRoaW5nIG9mZmxpbmUuCiAJCSAqLworCQlpZiAoc2NzaV9hdXRvcG1fZ2V0X2hvc3Qoc2hvc3QpICE9IDApIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsCisJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBoYW5kbGVyIHNjc2lfZWhfJWQgIgorCQkJCQkJInVuYWJsZSB0byBhdXRvcmVzdW1lXG4iLAorCQkJCQkJc2hvc3QtPmhvc3Rfbm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJaWYgKHNob3N0LT50cmFuc3BvcnR0LT5laF9zdHJhdGVneV9oYW5kbGVyKQogCQkJc2hvc3QtPnRyYW5zcG9ydHQtPmVoX3N0cmF0ZWd5X2hhbmRsZXIoc2hvc3QpOwogCQllbHNlCkBAIC0xNzc1LDYgKzE3OTYsNyBAQAogCQkgKiB3aGljaCBhcmUgc3RpbGwgb25saW5lLgogCQkgKi8KIAkJc2NzaV9yZXN0YXJ0X29wZXJhdGlvbnMoc2hvc3QpOworCQlzY3NpX2F1dG9wbV9wdXRfaG9zdChzaG9zdCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQogCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKQEAgLTE4NzIsMTIgKzE4OTQsMTYgQEAKIGludAogc2NzaV9yZXNldF9wcm92aWRlcihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGZsYWcpCiB7Ci0Jc3RydWN0IHNjc2lfY21uZCAqc2NtZCA9IHNjc2lfZ2V0X2NvbW1hbmQoZGV2LCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2LT5ob3N0OwogCXN0cnVjdCByZXF1ZXN0IHJlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBydG47CiAKKwlpZiAoc2NzaV9hdXRvcG1fZ2V0X2hvc3Qoc2hvc3QpIDwgMCkKKwkJcmV0dXJuIEZBSUxFRDsKKworCXNjbWQgPSBzY3NpX2dldF9jb21tYW5kKGRldiwgR0ZQX0tFUk5FTCk7CiAJYmxrX3JxX2luaXQoTlVMTCwgJnJlcSk7CiAJc2NtZC0+cmVxdWVzdCA9ICZyZXE7CiAKQEAgLTE5MzQsNiArMTk2MCw3IEBACiAJc2NzaV9ydW5faG9zdF9xdWV1ZXMoc2hvc3QpOwogCiAJc2NzaV9uZXh0X2NvbW1hbmQoc2NtZCk7CisJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOwogCXJldHVybiBydG47CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfcmVzZXRfcHJvdmlkZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcG0uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwZTkxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3BtLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKglzY3NpX3BtLmMJQ29weXJpZ2h0IChDKSAyMDEwIEFsYW4gU3Rlcm4KKyAqCisgKglTQ1NJIGR5bmFtaWMgUG93ZXIgTWFuYWdlbWVudAorICoJCUluaXRpYWwgdmVyc2lvbjogQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisKK3N0YXRpYyBpbnQgc2NzaV9kZXZfdHlwZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCWludCBlcnI7CisKKwllcnIgPSBzY3NpX2RldmljZV9xdWllc2NlKHRvX3Njc2lfZGV2aWNlKGRldikpOworCWlmIChlcnIgPT0gMCkgeworCQlkcnYgPSBkZXYtPmRyaXZlcjsKKwkJaWYgKGRydiAmJiBkcnYtPnN1c3BlbmQpCisJCQllcnIgPSBkcnYtPnN1c3BlbmQoZGV2LCBtc2cpOworCX0KKwlkZXZfZGJnKGRldiwgInNjc2kgc3VzcGVuZDogJWRcbiIsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzY3NpX2Rldl90eXBlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKKwlpbnQgZXJyID0gMDsKKworCWRydiA9IGRldi0+ZHJpdmVyOworCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWUpCisJCWVyciA9IGRydi0+cmVzdW1lKGRldik7CisJc2NzaV9kZXZpY2VfcmVzdW1lKHRvX3Njc2lfZGV2aWNlKGRldikpOworCWRldl9kYmcoZGV2LCAic2NzaSByZXN1bWU6ICVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKworc3RhdGljIGludCBzY3NpX2J1c19zdXNwZW5kX2NvbW1vbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoc2NzaV9pc19zZGV2X2RldmljZShkZXYpKQorCQllcnIgPSBzY3NpX2Rldl90eXBlX3N1c3BlbmQoZGV2LCBtc2cpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9idXNfcmVzdW1lX2NvbW1vbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoc2NzaV9pc19zZGV2X2RldmljZShkZXYpKQorCQllcnIgPSBzY3NpX2Rldl90eXBlX3Jlc3VtZShkZXYpOworCisJaWYgKGVyciA9PSAwKSB7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCQlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwkJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzY3NpX2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc2NzaV9idXNfc3VzcGVuZF9jb21tb24oZGV2LCBQTVNHX1NVU1BFTkQpOworfQorCitzdGF0aWMgaW50IHNjc2lfYnVzX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHNjc2lfYnVzX3N1c3BlbmRfY29tbW9uKGRldiwgUE1TR19GUkVFWkUpOworfQorCitzdGF0aWMgaW50IHNjc2lfYnVzX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc2NzaV9idXNfc3VzcGVuZF9jb21tb24oZGV2LCBQTVNHX0hJQkVSTkFURSk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19QTV9TTEVFUCAqLworCisjZGVmaW5lIHNjc2lfYnVzX3Jlc3VtZV9jb21tb24JCU5VTEwKKyNkZWZpbmUgc2NzaV9idXNfc3VzcGVuZAkJTlVMTAorI2RlZmluZSBzY3NpX2J1c19mcmVlemUJCQlOVUxMCisjZGVmaW5lIHNjc2lfYnVzX3Bvd2Vyb2ZmCQlOVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisKK3N0YXRpYyBpbnQgc2NzaV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnIgPSAwOworCisJZGV2X2RiZyhkZXYsICJzY3NpX3J1bnRpbWVfc3VzcGVuZFxuIik7CisJaWYgKHNjc2lfaXNfc2Rldl9kZXZpY2UoZGV2KSkgeworCQllcnIgPSBzY3NpX2Rldl90eXBlX3N1c3BlbmQoZGV2LCBQTVNHX0FVVE9fU1VTUEVORCk7CisJCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJCXBtX3NjaGVkdWxlX3N1c3BlbmQoZGV2LCBqaWZmaWVzX3RvX21zZWNzKAorCQkJCXJvdW5kX2ppZmZpZXNfdXBfcmVsYXRpdmUoSFovMTApKSk7CisJfQorCisJLyogSW5zZXJ0IGhvb2tzIGhlcmUgZm9yIHRhcmdldHMsIGhvc3RzLCBhbmQgdHJhbnNwb3J0IGNsYXNzZXMgKi8KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IDA7CisKKwlkZXZfZGJnKGRldiwgInNjc2lfcnVudGltZV9yZXN1bWVcbiIpOworCWlmIChzY3NpX2lzX3NkZXZfZGV2aWNlKGRldikpCisJCWVyciA9IHNjc2lfZGV2X3R5cGVfcmVzdW1lKGRldik7CisKKwkvKiBJbnNlcnQgaG9va3MgaGVyZSBmb3IgdGFyZ2V0cywgaG9zdHMsIGFuZCB0cmFuc3BvcnQgY2xhc3NlcyAqLworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzY3NpX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKworCWRldl9kYmcoZGV2LCAic2NzaV9ydW50aW1lX2lkbGVcbiIpOworCisJLyogSW5zZXJ0IGhvb2tzIGhlcmUgZm9yIHRhcmdldHMsIGhvc3RzLCBhbmQgdHJhbnNwb3J0IGNsYXNzZXMgKi8KKworCWlmIChzY3NpX2lzX3NkZXZfZGV2aWNlKGRldikpCisJCWVyciA9IHBtX3NjaGVkdWxlX3N1c3BlbmQoZGV2LCAxMDApOworCWVsc2UKKwkJZXJyID0gcG1fcnVudGltZV9zdXNwZW5kKGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50IHNjc2lfYXV0b3BtX2dldF9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWludAllcnI7CisKKwllcnIgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZzZGV2LT5zZGV2X2dlbmRldik7CisJaWYgKGVyciA8IDApCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwllbHNlIGlmIChlcnIgPiAwKQorCQllcnIgPSAwOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2F1dG9wbV9nZXRfZGV2aWNlKTsKKwordm9pZCBzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlwbV9ydW50aW1lX3B1dF9zeW5jKCZzZGV2LT5zZGV2X2dlbmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKTsKKwordm9pZCBzY3NpX2F1dG9wbV9nZXRfdGFyZ2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZzdGFyZ2V0LT5kZXYpOworfQorCit2b2lkIHNjc2lfYXV0b3BtX3B1dF90YXJnZXQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnN0YXJnZXQtPmRldik7Cit9CisKK2ludCBzY3NpX2F1dG9wbV9nZXRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpbnQJZXJyOworCisJZXJyID0gcG1fcnVudGltZV9nZXRfc3luYygmc2hvc3QtPnNob3N0X2dlbmRldik7CisJaWYgKGVyciA8IDApCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCWVsc2UgaWYgKGVyciA+IDApCisJCWVyciA9IDA7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBzY3NpX2F1dG9wbV9wdXRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlwbV9ydW50aW1lX3B1dF9zeW5jKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKK30KKworI2Vsc2UKKworI2RlZmluZSBzY3NpX3J1bnRpbWVfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHNjc2lfcnVudGltZV9yZXN1bWUJTlVMTAorI2RlZmluZSBzY3NpX3J1bnRpbWVfaWRsZQlOVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLworCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzY3NpX2J1c19wbV9vcHMgPSB7CisJLnN1c3BlbmQgPQkJc2NzaV9idXNfc3VzcGVuZCwKKwkucmVzdW1lID0JCXNjc2lfYnVzX3Jlc3VtZV9jb21tb24sCisJLmZyZWV6ZSA9CQlzY3NpX2J1c19mcmVlemUsCisJLnRoYXcgPQkJCXNjc2lfYnVzX3Jlc3VtZV9jb21tb24sCisJLnBvd2Vyb2ZmID0JCXNjc2lfYnVzX3Bvd2Vyb2ZmLAorCS5yZXN0b3JlID0JCXNjc2lfYnVzX3Jlc3VtZV9jb21tb24sCisJLnJ1bnRpbWVfc3VzcGVuZCA9CXNjc2lfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9CXNjc2lfcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfaWRsZSA9CQlzY3NpX3J1bnRpbWVfaWRsZSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmggYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKaW5kZXggMWZiZjdjNy4uYjQwNTZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaApAQCAtNyw2ICs3LDcgQEAKIHN0cnVjdCByZXF1ZXN0Owogc3RydWN0IHNjc2lfY21uZDsKIHN0cnVjdCBzY3NpX2RldmljZTsKK3N0cnVjdCBzY3NpX3RhcmdldDsKIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGU7CiBzdHJ1Y3QgU2NzaV9Ib3N0Owogc3RydWN0IHNjc2lfbmxfaGRyOwpAQCAtMTQ0LDYgKzE0NSwyMiBAQAogc3RhdGljIGlubGluZSB2b2lkIHNjc2lfbmV0bGlua19leGl0KHZvaWQpIHt9CiAjZW5kaWYKIAorLyogc2NzaV9wbS5jICovCisjaWZkZWYgQ09ORklHX1BNX09QUworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNjc2lfYnVzX3BtX29wczsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitleHRlcm4gdm9pZCBzY3NpX2F1dG9wbV9nZXRfdGFyZ2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqKTsKK2V4dGVybiB2b2lkIHNjc2lfYXV0b3BtX3B1dF90YXJnZXQoc3RydWN0IHNjc2lfdGFyZ2V0ICopOworZXh0ZXJuIGludCBzY3NpX2F1dG9wbV9nZXRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworZXh0ZXJuIHZvaWQgc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9hdXRvcG1fZ2V0X3RhcmdldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9hdXRvcG1fcHV0X3RhcmdldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnQpIHt9CitzdGF0aWMgaW5saW5lIGludCBzY3NpX2F1dG9wbV9nZXRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpoKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqaCkge30KKyNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLworCiAvKiAKICAqIGludGVybmFsIHNjc2kgdGltZW91dCBmdW5jdGlvbnM6IGZvciB1c2UgYnkgbWlkLWxheWVyIGFuZCB0cmFuc3BvcnQKICAqIGNsYXNzZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggMWMwMjdhOS4uM2QwYTFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMTUxMywxNCArMTUxMywxOCBAQAogCXN0YXJnZXQgPSBzY3NpX2FsbG9jX3RhcmdldChwYXJlbnQsIGNoYW5uZWwsIGlkKTsKIAlpZiAoIXN0YXJnZXQpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXNjc2lfYXV0b3BtX2dldF90YXJnZXQoc3RhcmdldCk7CiAKIAltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJaWYgKCFzaG9zdC0+YXN5bmNfc2NhbikKIAkJc2NzaV9jb21wbGV0ZV9hc3luY19zY2FucygpOwogCi0JaWYgKHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKQorCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSAmJiBzY3NpX2F1dG9wbV9nZXRfaG9zdChzaG9zdCkgPT0gMCkgewogCQlzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKHN0YXJnZXQsIGx1biwgTlVMTCwgJnNkZXYsIDEsIGhvc3RkYXRhKTsKKwkJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOworCX0KIAltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKKwlzY3NpX2F1dG9wbV9wdXRfdGFyZ2V0KHN0YXJnZXQpOwogCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7CiAJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKIApAQCAtMTU3NCw2ICsxNTc4LDcgQEAKIAlzdGFyZ2V0ID0gc2NzaV9hbGxvY190YXJnZXQocGFyZW50LCBjaGFubmVsLCBpZCk7CiAJaWYgKCFzdGFyZ2V0KQogCQlyZXR1cm47CisJc2NzaV9hdXRvcG1fZ2V0X3RhcmdldChzdGFyZ2V0KTsKIAogCWlmIChsdW4gIT0gU0NBTl9XSUxEX0NBUkQpIHsKIAkJLyoKQEAgLTE1OTksNiArMTYwNCw3IEBACiAJfQogCiAgb3V0X3JlYXA6CisJc2NzaV9hdXRvcG1fcHV0X3RhcmdldChzdGFyZ2V0KTsKIAkvKiBub3cgZGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgaGFzIGFueSBjaGlsZHJlbiBhdCBhbGwKIAkgKiBhbmQgaWYgbm90LCBudWtlIGl0ICovCiAJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKQEAgLTE2MzMsOCArMTYzOSwxMCBAQAogCWlmICghc2hvc3QtPmFzeW5jX3NjYW4pCiAJCXNjc2lfY29tcGxldGVfYXN5bmNfc2NhbnMoKTsKIAotCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSkKKwlpZiAoc2NzaV9ob3N0X3NjYW5fYWxsb3dlZChzaG9zdCkgJiYgc2NzaV9hdXRvcG1fZ2V0X2hvc3Qoc2hvc3QpID09IDApIHsKIAkJX19zY3NpX3NjYW5fdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKKwkJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOworCX0KIAltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9zY2FuX3RhcmdldCk7CkBAIC0xNjg2LDcgKzE2OTQsNyBAQAogCWlmICghc2hvc3QtPmFzeW5jX3NjYW4pCiAJCXNjc2lfY29tcGxldGVfYXN5bmNfc2NhbnMoKTsKIAotCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSkgeworCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSAmJiBzY3NpX2F1dG9wbV9nZXRfaG9zdChzaG9zdCkgPT0gMCkgewogCQlpZiAoY2hhbm5lbCA9PSBTQ0FOX1dJTERfQ0FSRCkKIAkJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gc2hvc3QtPm1heF9jaGFubmVsOwogCQkJICAgICBjaGFubmVsKyspCkBAIC0xNjk0LDYgKzE3MDIsNyBAQAogCQkJCQkJICByZXNjYW4pOwogCQllbHNlCiAJCQlzY3NpX3NjYW5fY2hhbm5lbChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKKwkJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOwogCX0KIAltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIApAQCAtMTgzMSw4ICsxODQwLDExIEBACiBzdGF0aWMgaW50IGRvX3NjYW5fYXN5bmModm9pZCAqX2RhdGEpCiB7CiAJc3RydWN0IGFzeW5jX3NjYW5fZGF0YSAqZGF0YSA9IF9kYXRhOwotCWRvX3Njc2lfc2Nhbl9ob3N0KGRhdGEtPnNob3N0KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRhdGEtPnNob3N0OworCisJZG9fc2NzaV9zY2FuX2hvc3Qoc2hvc3QpOwogCXNjc2lfZmluaXNoX2FzeW5jX3NjYW4oZGF0YSk7CisJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOwogCXJldHVybiAwOwogfQogCkBAIC0xODQ3LDE2ICsxODU5LDIwIEBACiAKIAlpZiAoc3RybmNtcChzY3NpX3NjYW5fdHlwZSwgIm5vbmUiLCA0KSA9PSAwKQogCQlyZXR1cm47CisJaWYgKHNjc2lfYXV0b3BtX2dldF9ob3N0KHNob3N0KSA8IDApCisJCXJldHVybjsKIAogCWRhdGEgPSBzY3NpX3ByZXBfYXN5bmNfc2NhbihzaG9zdCk7CiAJaWYgKCFkYXRhKSB7CiAJCWRvX3Njc2lfc2Nhbl9ob3N0KHNob3N0KTsKKwkJc2NzaV9hdXRvcG1fcHV0X2hvc3Qoc2hvc3QpOwogCQlyZXR1cm47CiAJfQogCiAJcCA9IGt0aHJlYWRfcnVuKGRvX3NjYW5fYXN5bmMsIGRhdGEsICJzY3NpX3NjYW5fJWQiLCBzaG9zdC0+aG9zdF9ubyk7CiAJaWYgKElTX0VSUihwKSkKIAkJZG9fc2Nhbl9hc3luYyhkYXRhKTsKKwkvKiBzY3NpX2F1dG9wbV9wdXRfaG9zdChzaG9zdCkgaXMgY2FsbGVkIGluIGRvX3NjYW5fYXN5bmMoKSAqLwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3NjYW5faG9zdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGMyM2FiOTcuLmMzZjY3MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CkBAIC0zNzYsNTcgKzM3NywxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNjc2lfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZGV2LT50eXBlICE9ICZzY3NpX2Rldl90eXBlKQotCQlyZXR1cm4gMDsKLQotCWRydiA9IGRldi0+ZHJpdmVyOwotCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwotCi0JZXJyID0gc2NzaV9kZXZpY2VfcXVpZXNjZShzZGV2KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKGRydiAmJiBkcnYtPnN1c3BlbmQpIHsKLQkJZXJyID0gZHJ2LT5zdXNwZW5kKGRldiwgc3RhdGUpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzY3NpX2J1c19yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkZXYtPnR5cGUgIT0gJnNjc2lfZGV2X3R5cGUpCi0JCXJldHVybiAwOwotCi0JZHJ2ID0gZGV2LT5kcml2ZXI7Ci0Jc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7Ci0KLQlpZiAoZHJ2ICYmIGRydi0+cmVzdW1lKQotCQllcnIgPSBkcnYtPnJlc3VtZShkZXYpOwotCi0Jc2NzaV9kZXZpY2VfcmVzdW1lKHNkZXYpOwotCi0JcmV0dXJuIGVycjsKLX0KLQogc3RydWN0IGJ1c190eXBlIHNjc2lfYnVzX3R5cGUgPSB7CiAgICAgICAgIC5uYW1lCQk9ICJzY3NpIiwKICAgICAgICAgLm1hdGNoCQk9IHNjc2lfYnVzX21hdGNoLAogCS51ZXZlbnQJCT0gc2NzaV9idXNfdWV2ZW50LAotCS5zdXNwZW5kCT0gc2NzaV9idXNfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNjc2lfYnVzX3Jlc3VtZSwKKyNpZmRlZiBDT05GSUdfUE1fT1BTCisJLnBtCQk9ICZzY3NpX2J1c19wbV9vcHMsCisjZW5kaWYKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2J1c190eXBlKTsKIApAQCAtODQ4LDggKzgwNSw2IEBACiAJaWYgKHN0YXJnZXQtPnN0YXRlICE9IFNUQVJHRVRfQ1JFQVRFRCkKIAkJcmV0dXJuIDA7CiAKLQlkZXZpY2VfZW5hYmxlX2FzeW5jX3N1c3BlbmQoJnN0YXJnZXQtPmRldik7Ci0KIAllcnJvciA9IGRldmljZV9hZGQoJnN0YXJnZXQtPmRldik7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJnN0YXJnZXQtPmRldiwgInRhcmdldCBkZXZpY2VfYWRkIGZhaWxlZCwgZXJyb3IgJWRcbiIsIGVycm9yKTsKQEAgLTg1OCw2ICs4MTMsMTAgQEAKIAl0cmFuc3BvcnRfYWRkX2RldmljZSgmc3RhcmdldC0+ZGV2KTsKIAlzdGFyZ2V0LT5zdGF0ZSA9IFNUQVJHRVRfUlVOTklORzsKIAorCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmc3RhcmdldC0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmc3RhcmdldC0+ZGV2KTsKKwlkZXZpY2VfZW5hYmxlX2FzeW5jX3N1c3BlbmQoJnN0YXJnZXQtPmRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODg3LDcgKzg0NiwyMCBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAl0cmFuc3BvcnRfY29uZmlndXJlX2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwogCWRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZCgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXNjc2lfYXV0b3BtX2dldF90YXJnZXQoc3RhcmdldCk7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJcG1fcnVudGltZV9mb3JiaWQoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXNjc2lfYXV0b3BtX3B1dF90YXJnZXQoc3RhcmdldCk7CisKKwkvKiBUaGUgZm9sbG93aW5nIGNhbGwgd2lsbCBrZWVwIHNkZXYgYWN0aXZlIGluZGVmaW5pdGVseSwgdW50aWwKKwkgKiBpdHMgZHJpdmVyIGRvZXMgYSBjb3JyZXNwb25kaW5nIHNjc2lfYXV0b3BtX3BtX2RldmljZSgpLiAgT25seQorCSAqIGRyaXZlcnMgc3VwcG9ydGluZyBhdXRvc3VzcGVuZCB3aWxsIGRvIHRoaXMuCisJICovCisJc2NzaV9hdXRvcG1fZ2V0X2RldmljZShzZGV2KTsKKwogCWVycm9yID0gZGV2aWNlX2FkZCgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoS0VSTl9JTkZPICJlcnJvciAxXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKaW5kZXggMDY4MTM3OC4uZWRiNmIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKQEAgLTk2NSw3ICs5NjUsNyBAQAogCiAvKgogICogTm90ZTogaW4gdGhlIHRhcmdldCBzaG93IGZ1bmN0aW9uIHdlIHJlY29nbml6ZSB3aGVuIHRoZSByZW1vdGUKLSAqICBwb3J0IGlzIGluIHRoZSBoZWlyYXJjaHkgYW5kIGRvIG5vdCBhbGxvdyB0aGUgZHJpdmVyIHRvIGdldAorICogIHBvcnQgaXMgaW4gdGhlIGhpZXJhcmNoeSBhbmQgZG8gbm90IGFsbG93IHRoZSBkcml2ZXIgdG8gZ2V0CiAgKiAgaW52b2x2ZWQgaW4gc3lzZnMgZnVuY3Rpb25zLiBUaGUgZHJpdmVyIG9ubHkgZ2V0cyBpbnZvbHZlZCBpZgogICogIGl0J3MgdGhlICJvbGQiIHN0eWxlIHRoYXQgZG9lc24ndCB1c2UgcnBvcnRzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCmluZGV4IDFlNmQ0NzkuLmU4NDAyNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCkBAIC0zMCw4ICszMCw5IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KICNpbmNsdWRlIDxzY3NpL2lzY3NpX2lmLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KIAotI2RlZmluZSBJU0NTSV9TRVNTSU9OX0FUVFJTIDIyCisjZGVmaW5lIElTQ1NJX1NFU1NJT05fQVRUUlMgMjMKICNkZWZpbmUgSVNDU0lfQ09OTl9BVFRSUyAxMwogI2RlZmluZSBJU0NTSV9IT1NUX0FUVFJTIDQKIApAQCAtNTM0LDYgKzUzNSwzNyBAQAogCWF0b21pY19kZWMoJmlob3N0LT5ucl9zY2Fucyk7CiB9CiAKKy8qKgorICogaXNjc2lfYmxvY2tfc2NzaV9laCAtIGJsb2NrIHNjc2kgZWggdW50aWwgc2Vzc2lvbiBzdGF0ZSBoYXMgdHJhbnNpc3Rpb25lZAorICogY21kOiBzY3NpIGNtZCBwYXNzZWQgdG8gc2NzaSBlaCBoYW5kbGVyCisgKgorICogSWYgdGhlIHNlc3Npb24gaXMgZG93biB0aGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgdGhlIHJlY292ZXJ5CisgKiB0aW1lciB0byBmaXJlIG9yIGZvciB0aGUgc2Vzc2lvbiB0byBiZSBsb2dnZWQgYmFjayBpbi4gSWYgdGhlCisgKiByZWNvdmVyeSB0aW1lciBmaXJlcyB0aGVuIEZBU1RfSU9fRkFJTCBpcyByZXR1cm5lZC4gVGhlIGNhbGxlcgorICogc2hvdWxkIHBhc3MgdGhpcyBlcnJvciB2YWx1ZSB0byB0aGUgc2NzaSBlaC4KKyAqLworaW50IGlzY3NpX2Jsb2NrX3Njc2lfZWgoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9CisJCQlzdGFyZ2V0X3RvX3Nlc3Npb24oc2NzaV90YXJnZXQoY21kLT5kZXZpY2UpKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU0VTU0lPTl9MT0dHRURfSU4pIHsKKwkJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NFU1NJT05fRlJFRSkgeworCQkJcmV0ID0gRkFTVF9JT19GQUlMOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTAwMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfYmxvY2tfc2NzaV9laCk7CisKIHN0YXRpYyB2b2lkIHNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9CkBAIC0xNzYzLDcgKzE3OTUsOCBAQAogaXNjc2lfc2Vzc2lvbl9hdHRyKGx1X3Jlc2V0X3RtbywgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1PLCAwKTsKIGlzY3NpX3Nlc3Npb25fYXR0cih0Z3RfcmVzZXRfdG1vLCBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1PLCAwKTsKIGlzY3NpX3Nlc3Npb25fYXR0cihpZmFjZW5hbWUsIElTQ1NJX1BBUkFNX0lGQUNFX05BTUUsIDApOwotaXNjc2lfc2Vzc2lvbl9hdHRyKGluaXRpYXRvcm5hbWUsIElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FLCAwKQoraXNjc2lfc2Vzc2lvbl9hdHRyKGluaXRpYXRvcm5hbWUsIElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FLCAwKTsKK2lzY3NpX3Nlc3Npb25fYXR0cih0YXJnZXRhbGlhcywgSVNDU0lfUEFSQU1fVEFSR0VUX0FMSUFTLCAwKTsKIAogc3RhdGljIHNzaXplX3QKIHNob3dfcHJpdl9zZXNzaW9uX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0xNzgyLDE0ICsxODE1LDQyIEBACiB7CQkJCQkJCQkJXAogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9IAkJCQlcCiAJCQlpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYtPnBhcmVudCk7CQlcCisJaWYgKHNlc3Npb24tPmZpZWxkID09IC0xKQkJCQkJXAorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmZcbiIpOwkJCQlcCiAJcmV0dXJuIHNwcmludGYoYnVmLCBmb3JtYXQiXG4iLCBzZXNzaW9uLT5maWVsZCk7CQlcCiB9CiAKLSNkZWZpbmUgaXNjc2lfcHJpdl9zZXNzaW9uX2F0dHIoZmllbGQsIGZvcm1hdCkJCQkJXAorI2RlZmluZSBpc2NzaV9wcml2X3Nlc3Npb25fYXR0cl9zdG9yZShmaWVsZCkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3N0b3JlX3ByaXZfc2Vzc2lvbl8jI2ZpZWxkKHN0cnVjdCBkZXZpY2UgKmRldiwJCQkJXAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKK3sJCQkJCQkJCQlcCisJaW50IHZhbDsJCQkJCQkJXAorCWNoYXIgKmNwOwkJCQkJCQlcCisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uID0JCQkJXAorCQlpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYtPnBhcmVudCk7CQkJXAorCWlmICgoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU0VTU0lPTl9GUkVFKSB8fAkJCVwKKwkgICAgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NFU1NJT05fRkFJTEVEKSkJCQlcCisJCXJldHVybiAtRUJVU1k7CQkJCQkJXAorCWlmIChzdHJuY21wKGJ1ZiwgIm9mZiIsIDMpID09IDApCQkJCVwKKwkJc2Vzc2lvbi0+ZmllbGQgPSAtMTsJCQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmY3AsIDApOwkJCVwKKwkJaWYgKCpjcCAhPSAnXDAnICYmICpjcCAhPSAnXG4nKQkJCQlcCisJCQlyZXR1cm4gLUVJTlZBTDsJCQkJCVwKKwkJc2Vzc2lvbi0+ZmllbGQgPSB2YWw7CQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIGlzY3NpX3ByaXZfc2Vzc2lvbl9yd19hdHRyKGZpZWxkLCBmb3JtYXQpCQkJXAogCWlzY3NpX3ByaXZfc2Vzc2lvbl9hdHRyX3Nob3coZmllbGQsIGZvcm1hdCkJCQlcCi1zdGF0aWMgSVNDU0lfQ0xBU1NfQVRUUihwcml2X3Nlc3MsIGZpZWxkLCBTX0lSVUdPLCBzaG93X3ByaXZfc2Vzc2lvbl8jI2ZpZWxkLCBcCi0JCQlOVUxMKQotaXNjc2lfcHJpdl9zZXNzaW9uX2F0dHIocmVjb3ZlcnlfdG1vLCAiJWQiKTsKKwlpc2NzaV9wcml2X3Nlc3Npb25fYXR0cl9zdG9yZShmaWVsZCkJCQkJXAorc3RhdGljIElTQ1NJX0NMQVNTX0FUVFIocHJpdl9zZXNzLCBmaWVsZCwgU19JUlVHTyB8IFNfSVdVR08sCQlcCisJCQlzaG93X3ByaXZfc2Vzc2lvbl8jI2ZpZWxkLAkJCVwKKwkJCXN0b3JlX3ByaXZfc2Vzc2lvbl8jI2ZpZWxkKQoraXNjc2lfcHJpdl9zZXNzaW9uX3J3X2F0dHIocmVjb3ZlcnlfdG1vLCAiJWQiKTsKIAogLyoKICAqIGlTQ1NJIGhvc3QgYXR0cnMKQEAgLTE4MjAsNiArMTg4MSwxMSBAQAogCWNvdW50Kys7CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgU0VUVVBfUFJJVl9TRVNTSU9OX1JXX0FUVFIoZmllbGQpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcHJpdi0+c2Vzc2lvbl9hdHRyc1tjb3VudF0gPSAmZGV2X2F0dHJfcHJpdl9zZXNzXyMjZmllbGQ7CVwKKwljb3VudCsrOwkJCQkJCQlcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIFNFVFVQX1NFU1NJT05fUkRfQVRUUihmaWVsZCwgcGFyYW1fZmxhZykJCQlcCiBkbyB7CQkJCQkJCQkJXApAQCAtMjAwNiw3ICsyMDcyLDggQEAKIAlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodGd0X3Jlc2V0X3RtbyxJU0NTSV9UR1RfUkVTRVRfVE1PKTsKIAlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoaWZhY2VuYW1lLCBJU0NTSV9JRkFDRV9OQU1FKTsKIAlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoaW5pdGlhdG9ybmFtZSwgSVNDU0lfSU5JVElBVE9SX05BTUUpOwotCVNFVFVQX1BSSVZfU0VTU0lPTl9SRF9BVFRSKHJlY292ZXJ5X3Rtbyk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHRhcmdldGFsaWFzLCBJU0NTSV9UQVJHRVRfQUxJQVMpOworCVNFVFVQX1BSSVZfU0VTU0lPTl9SV19BVFRSKHJlY292ZXJ5X3Rtbyk7CiAJU0VUVVBfUFJJVl9TRVNTSU9OX1JEX0FUVFIoc3RhdGUpOwogCiAJQlVHX09OKGNvdW50ID4gSVNDU0lfU0VTU0lPTl9BVFRSUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDg4MDJlNDguLmNjOGExZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC03NTksNiArNzU5LDEwIEBACiAKIAlzZGV2ID0gc2RrcC0+ZGV2aWNlOwogCisJcmV0dmFsID0gc2NzaV9hdXRvcG1fZ2V0X2RldmljZShzZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yX2F1dG9wbTsKKwogCS8qCiAJICogSWYgdGhlIGRldmljZSBpcyBpbiBlcnJvciByZWNvdmVyeSwgd2FpdCB1bnRpbCBpdCBpcyBkb25lLgogCSAqIElmIHRoZSBkZXZpY2UgaXMgb2ZmbGluZSwgdGhlbiBkaXNhbGxvdyBhbnkgYWNjZXNzIHRvIGl0LgpAQCAtODAzLDYgKzgwNyw4IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX291dDoKKwlzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKHNkZXYpOworZXJyb3JfYXV0b3BtOgogCXNjc2lfZGlza19wdXQoc2RrcCk7CiAJcmV0dXJuIHJldHZhbDsJCiB9CkBAIC04MzQsNiArODQwLDggQEAKIAkgKiBYWFggYW5kIHdoYXQgaWYgdGhlcmUgYXJlIHBhY2tldHMgaW4gZmxpZ2h0IGFuZCB0aGlzIGNsb3NlKCkKIAkgKiBYWFggaXMgZm9sbG93ZWQgYnkgYSAicm1tb2Qgc2RfbW9kIj8KIAkgKi8KKworCXNjc2lfYXV0b3BtX3B1dF9kZXZpY2Uoc2Rldik7CiAJc2NzaV9kaXNrX3B1dChzZGtwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIyMzIsNyArMjI0MCw2IEBACiAJaWYgKHNkcC0+cmVtb3ZhYmxlKQogCQlnZC0+ZmxhZ3MgfD0gR0VOSERfRkxfUkVNT1ZBQkxFOwogCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgc2RrcCk7CiAJYWRkX2Rpc2soZ2QpOwogCXNkX2RpZl9jb25maWdfaG9zdChzZGtwKTsKIApAQCAtMjI0MCw2ICsyMjQ3LDcgQEAKIAogCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkF0dGFjaGVkIFNDU0kgJXNkaXNrXG4iLAogCQkgIHNkcC0+cmVtb3ZhYmxlID8gInJlbW92YWJsZSAiIDogIiIpOworCXNjc2lfYXV0b3BtX3B1dF9kZXZpY2Uoc2RwKTsKIAlwdXRfZGV2aWNlKCZzZGtwLT5kZXYpOwogfQogCkBAIC0yMzE3LDE0ICsyMzI1LDE1IEBACiAJfQogCiAJZGV2aWNlX2luaXRpYWxpemUoJnNka3AtPmRldik7Ci0Jc2RrcC0+ZGV2LnBhcmVudCA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCXNka3AtPmRldi5wYXJlbnQgPSBkZXY7CiAJc2RrcC0+ZGV2LmNsYXNzID0gJnNkX2Rpc2tfY2xhc3M7Ci0JZGV2X3NldF9uYW1lKCZzZGtwLT5kZXYsIGRldl9uYW1lKCZzZHAtPnNkZXZfZ2VuZGV2KSk7CisJZGV2X3NldF9uYW1lKCZzZGtwLT5kZXYsIGRldl9uYW1lKGRldikpOwogCiAJaWYgKGRldmljZV9hZGQoJnNka3AtPmRldikpCiAJCWdvdG8gb3V0X2ZyZWVfaW5kZXg7CiAKLQlnZXRfZGV2aWNlKCZzZHAtPnNkZXZfZ2VuZGV2KTsKKwlnZXRfZGV2aWNlKGRldik7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgc2RrcCk7CiAKIAlnZXRfZGV2aWNlKCZzZGtwLT5kZXYpOwkvKiBwcmV2ZW50IHJlbGVhc2UgYmVmb3JlIGFzeW5jX3NjaGVkdWxlICovCiAJYXN5bmNfc2NoZWR1bGUoc2RfcHJvYmVfYXN5bmMsIHNka3ApOwpAQCAtMjM1OCw4ICsyMzY3LDEwIEBACiB7CiAJc3RydWN0IHNjc2lfZGlzayAqc2RrcDsKIAotCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAlzZGtwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc2NzaV9hdXRvcG1fZ2V0X2RldmljZShzZGtwLT5kZXZpY2UpOworCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCWJsa19xdWV1ZV9wcmVwX3JxKHNka3AtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSwgc2NzaV9wcmVwX2ZuKTsKIAlkZXZpY2VfZGVsKCZzZGtwLT5kZXYpOwogCWRlbF9nZW5kaXNrKHNka3AtPmRpc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCBlZjc1MmIyLi4yOTY4YzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtMjQ1LDYgKzI0NSwxMCBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gc2dfcHV0OwogCisJcmV0dmFsID0gc2NzaV9hdXRvcG1fZ2V0X2RldmljZShzZHAtPmRldmljZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBzZHBfcHV0OworCiAJaWYgKCEoKGZsYWdzICYgT19OT05CTE9DSykgfHwKIAkgICAgICBzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RwLT5kZXZpY2UpKSkgewogCQlyZXR2YWwgPSAtRU5YSU87CkBAIC0zMDIsOCArMzA2LDExIEBACiAJfQogCXJldHZhbCA9IDA7CiBlcnJvcl9vdXQ6Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsKSB7CisJCXNjc2lfYXV0b3BtX3B1dF9kZXZpY2Uoc2RwLT5kZXZpY2UpOworc2RwX3B1dDoKIAkJc2NzaV9kZXZpY2VfcHV0KHNkcC0+ZGV2aWNlKTsKKwl9CiBzZ19wdXQ6CiAJaWYgKHNkcCkKIAkJc2dfcHV0X2RldihzZHApOwpAQCAtMzI3LDYgKzMzNCw3IEBACiAJc2RwLT5leGNsdWRlID0gMDsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNkcC0+b19leGNsX3dhaXQpOwogCisJc2NzaV9hdXRvcG1fcHV0X2RldmljZShzZHAtPmRldmljZSk7CiAJa3JlZl9wdXQoJnNmcC0+Zl9yZWYsIHNnX3JlbW92ZV9zZnApOwogCXJldHVybiAwOwogfQpAQCAtNzI5LDYgKzczNyw4IEBACiAJCXJldHVybiBrOwkvKiBwcm9iYWJseSBvdXQgb2Ygc3BhY2UgLS0+IEVOT01FTSAqLwogCX0KIAlpZiAoc2RwLT5kZXRhY2hlZCkgeworCQlpZiAoc3JwLT5iaW8pCisJCQlibGtfZW5kX3JlcXVlc3RfYWxsKHNycC0+cnEsIC1FSU8pOwogCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuX2VzcC5jIGIvZHJpdmVycy9zY3NpL3N1bl9lc3AuYwppbmRleCAzODZkZDlkLi44OWJhNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3VuX2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW5fZXNwLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlc3AtPmhvc3Q7CiAJc3RydWN0IG9mX2RldmljZSAqb3AgPSBlc3AtPmRldjsKIAotCWhvc3QtPmlycSA9IG9wLT5pcnFzWzBdOworCWhvc3QtPmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCXJldHVybiByZXF1ZXN0X2lycShob3N0LT5pcnEsIHNjc2lfZXNwX2ludHIsIElSUUZfU0hBUkVELCAiRVNQIiwgZXNwKTsKIH0KIApAQCAtNjQ0LDEyICs2NDQsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3VuZXNwX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZlc3Bfc2J1c19kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZXNwX3NidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHN1bmVzcF9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmVzcF9zYnVzX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmVzcF9zYnVzX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU3VuIEVTUCBTQ1NJIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKaW5kZXggMjQ2NjFjZC4uNzY4NjEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCkBAIC0yNjQ5LDcgKzI2NDksNyBAQAogCQkJCXN1cC0+dGZjciA9IFNNQ19FQjsKIAogCQkJCS8qIFNldCB0aGlzIHRvIDEgZm9yIG5vdywgc28gd2UgZ2V0IHNpbmdsZQotCQkJCSAqIGNoYXJhY3RlciBpbnRlcnJ1cHRzLiAgVXNpbmcgaWRsZSBjaGFyYXRlcgorCQkJCSAqIGNoYXJhY3RlciBpbnRlcnJ1cHRzLiAgVXNpbmcgaWRsZSBjaGFyYWN0ZXIKIAkJCQkgKiB0aW1lIHJlcXVpcmVzIHNvbWUgYWRkaXRpb25hbCB0dW5pbmcuCiAJCQkJICovCiAJCQkJc3VwLT5tcmJsciA9IDE7CkBAIC0yNzI4LDcgKzI3MjgsNyBAQAogCQkJCXVwLT50ZmNyID0gU01DX0VCOwogCiAJCQkJLyogU2V0IHRoaXMgdG8gMSBmb3Igbm93LCBzbyB3ZSBnZXQgc2luZ2xlCi0JCQkJICogY2hhcmFjdGVyIGludGVycnVwdHMuICBVc2luZyBpZGxlIGNoYXJhdGVyCisJCQkJICogY2hhcmFjdGVyIGludGVycnVwdHMuICBVc2luZyBpZGxlIGNoYXJhY3RlcgogCQkJCSAqIHRpbWUgcmVxdWlyZXMgc29tZSBhZGRpdGlvbmFsIHR1bmluZy4KIAkJCQkgKi8KIAkJCQl1cC0+bXJibHIgPSAxOwpAQCAtMjg4Niw3ICsyODg2LDcgQEAKIAkJc3VwLT50ZmNyID0gU01DX0VCOwogCiAJCS8qIFNldCB0aGlzIHRvIDEgZm9yIG5vdywgc28gd2UgZ2V0IHNpbmdsZQotCQkgKiBjaGFyYWN0ZXIgaW50ZXJydXB0cy4gIFVzaW5nIGlkbGUgY2hhcmF0ZXIKKwkJICogY2hhcmFjdGVyIGludGVycnVwdHMuICBVc2luZyBpZGxlIGNoYXJhY3RlcgogCQkgKiB0aW1lIHJlcXVpcmVzIHNvbWUgYWRkaXRpb25hbCB0dW5pbmcuCiAJCSAqLwogCQlzdXAtPm1yYmxyID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCA4OTFlMWRkLi4wOWVmNTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAl9LAogfTsKIAotI2lmIGRlZmluZWQgKENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDApCisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19BTENIRU1ZKQogCiAvKiBBdTF4MDAgVUFSVCBoYXJkd2FyZSBoYXMgYSB3ZWlyZCByZWdpc3RlciBsYXlvdXQgKi8KIHN0YXRpYyBjb25zdCB1OCBhdV9pb19pbl9tYXBbXSA9IHsKQEAgLTQyMiw3ICs0MjIsNiBAQAogCXJldHVybiByZWFkbChwLT5tZW1iYXNlICsgb2Zmc2V0KTsKIH0KIAotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXVfc2VyaWFsX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQpCiB7CiAJb2Zmc2V0ID0gbWFwXzgyNTBfaW5fcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7CkBAIC00MzQsNyArNDMzLDYgQEAKIAlvZmZzZXQgPSBtYXBfODI1MF9vdXRfcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7CiAJX19yYXdfd3JpdGVsKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50IHRzaV9zZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCkKIHsKQEAgLTUwMywxMiArNTAxLDExIEBACiAJCXAtPnNlcmlhbF9vdXQgPSBtZW0zMl9zZXJpYWxfb3V0OwogCQlicmVhazsKIAotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDAKIAljYXNlIFVQSU9fQVU6CiAJCXAtPnNlcmlhbF9pbiA9IGF1X3NlcmlhbF9pbjsKIAkJcC0+c2VyaWFsX291dCA9IGF1X3NlcmlhbF9vdXQ7CiAJCWJyZWFrOwotI2VuZGlmCisKIAljYXNlIFVQSU9fVFNJOgogCQlwLT5zZXJpYWxfaW4gPSB0c2lfc2VyaWFsX2luOwogCQlwLT5zZXJpYWxfb3V0ID0gdHNpX3NlcmlhbF9vdXQ7CkBAIC01MzUsOSArNTMyLDcgQEAKIAlzd2l0Y2ggKHAtPmlvdHlwZSkgewogCWNhc2UgVVBJT19NRU06CiAJY2FzZSBVUElPX01FTTMyOgotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDAKIAljYXNlIFVQSU9fQVU6Ci0jZW5kaWYKIAljYXNlIFVQSU9fRFdBUEI6CiAJCXAtPnNlcmlhbF9vdXQocCwgb2Zmc2V0LCB2YWx1ZSk7CiAJCXAtPnNlcmlhbF9pbihwLCBVQVJUX0xDUik7CS8qIHNhZmUsIG5vIHNpZGUtZWZmZWN0cyAqLwpAQCAtNTczLDcgKzU2OCw3IEBACiAJc2VyaWFsX291dHAodXAsIFVBUlRfRExNLCB2YWx1ZSA+PiA4ICYgMHhmZik7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDApCisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19BTENIRU1ZKQogLyogQXUxeDAwIGhhdmVuJ3QgZ290IGEgc3RhbmRhcmQgZGl2aXNvciBsYXRjaCAqLwogc3RhdGljIGludCBzZXJpYWxfZGxfcmVhZChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogewpAQCAtMjU5NiwxMSArMjU5MSw5IEBACiAJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkKIAkJYXV0b2NvbmZpZyh1cCwgcHJvYmVmbGFncyk7CiAKLSNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQVUxWDAwCiAJLyogaWYgYWNjZXNzIG1ldGhvZCBpcyBBVSwgaXQgaXMgYSAxNjU1MCB3aXRoIGEgcXVpcmsgKi8KIAlpZiAodXAtPnBvcnQudHlwZSA9PSBQT1JUXzE2NTUwQSAmJiB1cC0+cG9ydC5pb3R5cGUgPT0gVVBJT19BVSkKIAkJdXAtPmJ1Z3MgfD0gVUFSVF9CVUdfTk9NU1I7Ci0jZW5kaWYKIAogCWlmICh1cC0+cG9ydC50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBmbGFncyAmIFVBUlRfQ09ORklHX0lSUSkKIAkJYXV0b2NvbmZpZ19pcnEodXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggOGIyMzE2NS4uZTQzN2NlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC0yNTgsMTQgKzI1OCw2IEBACiAJICBzeXN0ZW0sIHNheSBZIHRvIHRoaXMgb3B0aW9uLiAgVGhlIGRyaXZlciBjYW4gaGFuZGxlIDEsIDIsIG9yIDMgcG9ydAogCSAgY2FyZHMuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgU0VSSUFMXzgyNTBfQVUxWDAwCi0JYm9vbCAiQXUxeDAwIHNlcmlhbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAhPSBuICYmIFNPQ19BVTFYMDAKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBBdTF4MDAgU09DIGJhc2VkIGJvYXJkIGFuZCB3YW50IHRvIHVzZSB0aGUgc2VyaWFsIHBvcnQsCi0JICBzYXkgWSB0byB0aGlzIG9wdGlvbi4gVGhlIGRyaXZlciBjYW4gaGFuZGxlIHVwIHRvIDQgc2VyaWFsIHBvcnRzLAotCSAgZGVwZW5kaW5nIG9uIHRoZSBTT0MuIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBTRVJJQUxfODI1MF9STTlLCiAJYm9vbCAiU3VwcG9ydCBmb3IgTUlQUyBSTTl4eHggaW50ZWdyYXRlZCBzZXJpYWwgcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgU0VSSUFMX1JNOTAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCmluZGV4IGIwOWE2MzguLjUwNDQxZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKQEAgLTc4Miw3ICs3ODIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwMTBfaWRzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBwbDAxMF9pZHNbXSA9IHsKIAl7CiAJCS5pZAk9IDB4MDAwNDEwMTAsCiAJCS5tYXNrCT0gMHgwMDBmZmZmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCBlYjRjYjQ4Li42Y2E3YTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC02OSw5ICs2OSwxMiBAQAogc3RydWN0IHVhcnRfYW1iYV9wb3J0IHsKIAlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CiAJc3RydWN0IGNsawkJKmNsazsKLQl1bnNpZ25lZCBpbnQJCWltOwkvKiBpbnRlcnJ1cHQgbWFzayAqLworCXVuc2lnbmVkIGludAkJaW07CQkvKiBpbnRlcnJ1cHQgbWFzayAqLwogCXVuc2lnbmVkIGludAkJb2xkX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQJCWlmbHM7CS8qIHZlbmRvci1zcGVjaWZpYyAqLworCXVuc2lnbmVkIGludAkJaWZsczsJCS8qIHZlbmRvci1zcGVjaWZpYyAqLworCXVuc2lnbmVkIGludAkJbGNyaF90eDsJLyogdmVuZG9yLXNwZWNpZmljICovCisJdW5zaWduZWQgaW50CQlsY3JoX3J4OwkvKiB2ZW5kb3Itc3BlY2lmaWMgKi8KKwlib29sCQkJb3ZlcnNhbXBsaW5nOyAgIC8qIHZlbmRvci1zcGVjaWZpYyAqLwogCWJvb2wJCQlhdXRvcnRzOwogfTsKIApAQCAtNzksMTYgKzgyLDI1IEBACiBzdHJ1Y3QgdmVuZG9yX2RhdGEgewogCXVuc2lnbmVkIGludAkJaWZsczsKIAl1bnNpZ25lZCBpbnQJCWZpZm9zaXplOworCXVuc2lnbmVkIGludAkJbGNyaF90eDsKKwl1bnNpZ25lZCBpbnQJCWxjcmhfcng7CisJYm9vbAkJCW92ZXJzYW1wbGluZzsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2FybSA9IHsKIAkuaWZscwkJCT0gVUFSVDAxMV9JRkxTX1JYNF84fFVBUlQwMTFfSUZMU19UWDRfOCwKIAkuZmlmb3NpemUJCT0gMTYsCisJLmxjcmhfdHgJCT0gVUFSVDAxMV9MQ1JILAorCS5sY3JoX3J4CQk9IFVBUlQwMTFfTENSSCwKKwkub3ZlcnNhbXBsaW5nCQk9IGZhbHNlLAogfTsKIAogc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3Jfc3QgPSB7CiAJLmlmbHMJCQk9IFVBUlQwMTFfSUZMU19SWF9IQUxGfFVBUlQwMTFfSUZMU19UWF9IQUxGLAogCS5maWZvc2l6ZQkJPSA2NCwKKwkubGNyaF90eAkJPSBTVF9VQVJUMDExX0xDUkhfVFgsCisJLmxjcmhfcngJCT0gU1RfVUFSVDAxMV9MQ1JIX1JYLAorCS5vdmVyc2FtcGxpbmcJCT0gdHJ1ZSwKIH07CiAKIHN0YXRpYyB2b2lkIHBsMDExX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTMyNywxMiArMzM5LDEyIEBACiAJdW5zaWduZWQgaW50IGxjcl9oOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JbGNyX2ggPSByZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfTENSSCk7CisJbGNyX2ggPSByZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIHVhcC0+bGNyaF90eCk7CiAJaWYgKGJyZWFrX3N0YXRlID09IC0xKQogCQlsY3JfaCB8PSBVQVJUMDF4X0xDUkhfQlJLOwogCWVsc2UKIAkJbGNyX2ggJj0gflVBUlQwMXhfTENSSF9CUks7Ci0Jd3JpdGV3KGxjcl9oLCB1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfTENSSCk7CisJd3JpdGV3KGxjcl9oLCB1YXAtPnBvcnQubWVtYmFzZSArIHVhcC0+bGNyaF90eCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMzkzLDcgKzQwNSwxNyBAQAogCXdyaXRldyhjciwgdWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0NSKTsKIAl3cml0ZXcoMCwgdWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0ZCUkQpOwogCXdyaXRldygxLCB1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfSUJSRCk7Ci0Jd3JpdGV3KDAsIHVhcC0+cG9ydC5tZW1iYXNlICsgVUFSVDAxMV9MQ1JIKTsKKwl3cml0ZXcoMCwgdWFwLT5wb3J0Lm1lbWJhc2UgKyB1YXAtPmxjcmhfcngpOworCWlmICh1YXAtPmxjcmhfdHggIT0gdWFwLT5sY3JoX3J4KSB7CisJCWludCBpOworCQkvKgorCQkgKiBXYWl0IDEwIFBDTEtzIGJlZm9yZSB3cml0aW5nIExDUkhfVFggcmVnaXN0ZXIsCisJCSAqIHRvIGdldCB0aGlzIGRlbGF5IHdyaXRlIHJlYWQgb25seSByZWdpc3RlciAxMCB0aW1lcworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisJCQl3cml0ZXcoMHhmZiwgdWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX01JUyk7CisJCXdyaXRldygwLCB1YXAtPnBvcnQubWVtYmFzZSArIHVhcC0+bGNyaF90eCk7CisJfQogCXdyaXRldygwLCB1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMXhfRFIpOwogCXdoaWxlIChyZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMXhfRlIpICYgVUFSVDAxeF9GUl9CVVNZKQogCQliYXJyaWVyKCk7CkBAIC00MjIsMTAgKzQ0NCwxOSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyB2b2lkIHBsMDExX3NodXRkb3duX2NoYW5uZWwoc3RydWN0IHVhcnRfYW1iYV9wb3J0ICp1YXAsCisJCQkJCXVuc2lnbmVkIGludCBsY3JoKQoreworICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgICAgIHZhbCA9IHJlYWR3KHVhcC0+cG9ydC5tZW1iYXNlICsgbGNyaCk7CisgICAgICB2YWwgJj0gfihVQVJUMDF4X0xDUkhfQlJLIHwgVUFSVDAxeF9MQ1JIX0ZFTik7CisgICAgICB3cml0ZXcodmFsLCB1YXAtPnBvcnQubWVtYmFzZSArIGxjcmgpOworfQorCiBzdGF0aWMgdm9pZCBwbDAxMV9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqdWFwID0gKHN0cnVjdCB1YXJ0X2FtYmFfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CiAKIAkvKgogCSAqIGRpc2FibGUgYWxsIGludGVycnVwdHMKQEAgLTQ1MCw5ICs0ODEsOSBAQAogCS8qCiAJICogZGlzYWJsZSBicmVhayBjb25kaXRpb24gYW5kIGZpZm9zCiAJICovCi0JdmFsID0gcmVhZHcodWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0xDUkgpOwotCXZhbCAmPSB+KFVBUlQwMXhfTENSSF9CUksgfCBVQVJUMDF4X0xDUkhfRkVOKTsKLQl3cml0ZXcodmFsLCB1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfTENSSCk7CisJcGwwMTFfc2h1dGRvd25fY2hhbm5lbCh1YXAsIHVhcC0+bGNyaF9yeCk7CisJaWYgKHVhcC0+bGNyaF9yeCAhPSB1YXAtPmxjcmhfdHgpCisJCXBsMDExX3NodXRkb3duX2NoYW5uZWwodWFwLCB1YXAtPmxjcmhfdHgpOwogCiAJLyoKIAkgKiBTaHV0IGRvd24gdGhlIGNsb2NrIHByb2R1Y2VyCkBAIC00NzIsOCArNTAzLDEzIEBACiAJLyoKIAkgKiBBc2sgdGhlIGNvcmUgdG8gY2FsY3VsYXRlIHRoZSBkaXZpc29yIGZvciB1cy4KIAkgKi8KLQliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgcG9ydC0+dWFydGNsay8xNik7Ci0JcXVvdCA9IHBvcnQtPnVhcnRjbGsgKiA0IC8gYmF1ZDsKKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwKKwkJCQkgIHBvcnQtPnVhcnRjbGsvKHVhcC0+b3ZlcnNhbXBsaW5nID8gOCA6IDE2KSk7CisKKwlpZiAoYmF1ZCA+IHBvcnQtPnVhcnRjbGsvMTYpCisJCXF1b3QgPSBESVZfUk9VTkRfQ0xPU0VTVChwb3J0LT51YXJ0Y2xrICogOCwgYmF1ZCk7CisJZWxzZQorCQlxdW90ID0gRElWX1JPVU5EX0NMT1NFU1QocG9ydC0+dWFydGNsayAqIDQsIGJhdWQpOwogCiAJc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKIAljYXNlIENTNToKQEAgLTU1Miw2ICs1ODgsMTMgQEAKIAkJdWFwLT5hdXRvcnRzID0gZmFsc2U7CiAJfQogCisJaWYgKHVhcC0+b3ZlcnNhbXBsaW5nKSB7CisJCWlmIChiYXVkID4gcG9ydC0+dWFydGNsay8xNikKKwkJCW9sZF9jciB8PSBTVF9VQVJUMDExX0NSX09WU0ZBQ1Q7CisJCWVsc2UKKwkJCW9sZF9jciAmPSB+U1RfVUFSVDAxMV9DUl9PVlNGQUNUOworCX0KKwogCS8qIFNldCBiYXVkIHJhdGUgKi8KIAl3cml0ZXcocXVvdCAmIDB4M2YsIHBvcnQtPm1lbWJhc2UgKyBVQVJUMDExX0ZCUkQpOwogCXdyaXRldyhxdW90ID4+IDYsIHBvcnQtPm1lbWJhc2UgKyBVQVJUMDExX0lCUkQpOwpAQCAtNTYxLDcgKzYwNCwxNyBAQAogCSAqIE5PVEU6IE1VU1QgQkUgV1JJVFRFTiBBRlRFUiBVQVJUTENSX00gJiBVQVJUTENSX0wKIAkgKiAtLS0tLS0tLS0tXi0tLS0tLS0tLS1eLS0tLS0tLS0tLV4tLS0tLS0tLS0tXi0tLS0tCiAJICovCi0Jd3JpdGV3KGxjcl9oLCBwb3J0LT5tZW1iYXNlICsgVUFSVDAxMV9MQ1JIKTsKKwl3cml0ZXcobGNyX2gsIHBvcnQtPm1lbWJhc2UgKyB1YXAtPmxjcmhfcngpOworCWlmICh1YXAtPmxjcmhfcnggIT0gdWFwLT5sY3JoX3R4KSB7CisJCWludCBpOworCQkvKgorCQkgKiBXYWl0IDEwIFBDTEtzIGJlZm9yZSB3cml0aW5nIExDUkhfVFggcmVnaXN0ZXIsCisJCSAqIHRvIGdldCB0aGlzIGRlbGF5IHdyaXRlIHJlYWQgb25seSByZWdpc3RlciAxMCB0aW1lcworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisJCQl3cml0ZXcoMHhmZiwgdWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX01JUyk7CisJCXdyaXRldyhsY3JfaCwgcG9ydC0+bWVtYmFzZSArIHVhcC0+bGNyaF90eCk7CisJfQogCXdyaXRldyhvbGRfY3IsIHBvcnQtPm1lbWJhc2UgKyBVQVJUMDExX0NSKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTY4OCw3ICs3NDEsNyBAQAogCWlmIChyZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfQ1IpICYgVUFSVDAxeF9DUl9VQVJURU4pIHsKIAkJdW5zaWduZWQgaW50IGxjcl9oLCBpYnJkLCBmYnJkOwogCi0JCWxjcl9oID0gcmVhZHcodWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0xDUkgpOworCQlsY3JfaCA9IHJlYWR3KHVhcC0+cG9ydC5tZW1iYXNlICsgdWFwLT5sY3JoX3R4KTsKIAogCQkqcGFyaXR5ID0gJ24nOwogCQlpZiAobGNyX2ggJiBVQVJUMDF4X0xDUkhfUEVOKSB7CkBAIC03MDcsNiArNzYwLDEyIEBACiAJCWZicmQgPSByZWFkdyh1YXAtPnBvcnQubWVtYmFzZSArIFVBUlQwMTFfRkJSRCk7CiAKIAkJKmJhdWQgPSB1YXAtPnBvcnQudWFydGNsayAqIDQgLyAoNjQgKiBpYnJkICsgZmJyZCk7CisKKwkJaWYgKHVhcC0+b3ZlcnNhbXBsaW5nKSB7CisJCQlpZiAocmVhZHcodWFwLT5wb3J0Lm1lbWJhc2UgKyBVQVJUMDExX0NSKQorCQkJCSAgJiBTVF9VQVJUMDExX0NSX09WU0ZBQ1QpCisJCQkJKmJhdWQgKj0gMjsKKwkJfQogCX0KIH0KIApAQCAtODAwLDYgKzg1OSw5IEBACiAJfQogCiAJdWFwLT5pZmxzID0gdmVuZG9yLT5pZmxzOworCXVhcC0+bGNyaF9yeCA9IHZlbmRvci0+bGNyaF9yeDsKKwl1YXAtPmxjcmhfdHggPSB2ZW5kb3ItPmxjcmhfdHg7CisJdWFwLT5vdmVyc2FtcGxpbmcgPSB2ZW5kb3ItPm92ZXJzYW1wbGluZzsKIAl1YXAtPnBvcnQuZGV2ID0gJmRldi0+ZGV2OwogCXVhcC0+cG9ydC5tYXBiYXNlID0gZGV2LT5yZXMuc3RhcnQ7CiAJdWFwLT5wb3J0Lm1lbWJhc2UgPSBiYXNlOwpAQCAtODY4LDcgKzkzMCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBhbWJhX2lkIHBsMDExX2lkc1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwMTFfaWRzW10gPSB7CiAJewogCQkuaWQJPSAweDAwMDQxMDExLAogCQkubWFzawk9IDB4MDAwZmZmZmYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKaW5kZXggY2Q2Y2Y1Ny4uNjAxNjE3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwpAQCAtODUyLDcgKzg1Miw3IEBACiAJICovCiAJY3BtX3NldF9zbWNfZmNyKHVwKTsKIAotCS8qIFVzaW5nIGlkbGUgY2hhcmF0ZXIgdGltZSByZXF1aXJlcyBzb21lIGFkZGl0aW9uYWwgdHVuaW5nLiAgKi8KKwkvKiBVc2luZyBpZGxlIGNoYXJhY3RlciB0aW1lIHJlcXVpcmVzIHNvbWUgYWRkaXRpb25hbCB0dW5pbmcuICAqLwogCW91dF9iZTE2KCZ1cC0+c21jX21yYmxyLCBwaW5mby0+cnhfZmlmb3NpemUpOwogCW91dF9iZTE2KCZ1cC0+c21jX21heGlkbCwgcGluZm8tPnJ4X2ZpZm9zaXplKTsKIAlvdXRfYmUxNigmdXAtPnNtY19icmtsZW4sIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwva2dkYm9jLmMgYi9kcml2ZXJzL3NlcmlhbC9rZ2Rib2MuYwppbmRleCBhOWE5NGFlLi4zOWY5YTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9rZ2Rib2MuYworKysgYi9kcml2ZXJzL3NlcmlhbC9rZ2Rib2MuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAKICNkZWZpbmUgTUFYX0NPTkZJR19MRU4JCTQwCiAKQEAgLTMxLDYgKzMyLDcgQEAKIAkubWF4bGVuCQkJPSBNQVhfQ09ORklHX0xFTiwKIH07CiAKK3N0YXRpYyBpbnQga2dkYm9jX3VzZV9rbXM7ICAvKiAxIGlmIHdlIHVzZSBrZXJuZWwgbW9kZSBzd2l0Y2hpbmcgKi8KIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlcgkqa2dkYl90dHlfZHJpdmVyOwogc3RhdGljIGludAkJCWtnZGJfdHR5X2xpbmU7CiAKQEAgLTEwNCw2ICsxMDYsMTIgQEAKIAlrZ2Rib2NfaW9fb3BzLmlzX2NvbnNvbGUgPSAwOwogCWtnZGJfdHR5X2RyaXZlciA9IE5VTEw7CiAKKwlrZ2Rib2NfdXNlX2ttcyA9IDA7CisJaWYgKHN0cm5jbXAoY3B0ciwgImttcywiLCA0KSA9PSAwKSB7CisJCWNwdHIgKz0gNDsKKwkJa2dkYm9jX3VzZV9rbXMgPSAxOworCX0KKwogCWlmIChrZ2Rib2NfcmVnaXN0ZXJfa2JkKCZjcHRyKSkKIAkJZ290byBkb19yZWdpc3RlcjsKIApAQCAtMjAxLDggKzIwOSwxNCBAQAogCXJldHVybiBjb25maWd1cmVfa2dkYm9jKCk7CiB9CiAKK3N0YXRpYyBpbnQgZGJnX3Jlc3RvcmVfZ3JhcGhpY3M7CisKIHN0YXRpYyB2b2lkIGtnZGJvY19wcmVfZXhwX2hhbmRsZXIodm9pZCkKIHsKKwlpZiAoIWRiZ19yZXN0b3JlX2dyYXBoaWNzICYmIGtnZGJvY191c2Vfa21zKSB7CisJCWRiZ19yZXN0b3JlX2dyYXBoaWNzID0gMTsKKwkJY29uX2RlYnVnX2VudGVyKHZjX2NvbnNbZmdfY29uc29sZV0uZCk7CisJfQogCS8qIEluY3JlbWVudCB0aGUgbW9kdWxlIGNvdW50IHdoZW4gdGhlIGRlYnVnZ2VyIGlzIGFjdGl2ZSAqLwogCWlmICgha2dkYl9jb25uZWN0ZWQpCiAJCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKQEAgLTIxMyw2ICsyMjcsMTAgQEAKIAkvKiBkZWNyZW1lbnQgdGhlIG1vZHVsZSBjb3VudCB3aGVuIHRoZSBkZWJ1Z2dlciBkZXRhY2hlcyAqLwogCWlmICgha2dkYl9jb25uZWN0ZWQpCiAJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCWlmIChrZ2Rib2NfdXNlX2ttcyAmJiBkYmdfcmVzdG9yZV9ncmFwaGljcykgeworCQlkYmdfcmVzdG9yZV9ncmFwaGljcyA9IDA7CisJCWNvbl9kZWJ1Z19sZWF2ZSgpOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBrZ2RiX2lvIGtnZGJvY19pb19vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYyBiL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jCmluZGV4IDg0YTM1ZjYuLjFhODhiMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jCkBAIC0xMTMsNyArMTEzLDkgQEAKIAl1bnNpZ25lZCBjaGFyCSgqcmVhZF9jaGFyKShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKIAl2b2lkCQkoKmN3X2Rpc2FibGVfaW50cykoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CiAJdm9pZAkJKCpjd19yZXN0b3JlX2ludHMpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwotCXVuc2lnbmVkIGxvbmcJKCpnZXR1YXJ0Y2xrKSh2b2lkICpwKTsKKwl1bnNpZ25lZCBpbnQJKCpzZXRfYmF1ZHJhdGUpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJCXN0cnVjdCBrdGVybWlvcyAqbmV3LAorCQkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCk7CiAJaW50CQkoKmNsb2NrKShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZW5hYmxlKTsKIAlpbnQJCSgqZmlmb2NfaW5pdCkodm9pZCk7CiAJdm9pZAkJKCpmaWZvY191bmluaXQpKHZvaWQpOwpAQCAtMTIxLDYgKzEyMywxNiBAQAogCWlycXJldHVybl90CSgqaGFuZGxlX2lycSkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CiB9OwogCisvKiBzZXR0aW5nIHRoZSBwcmVzY2FsZXIgYW5kIGRpdmlzb3IgcmVnIGlzIGNvbW1vbiBmb3IgYWxsIGNoaXBzICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXBjNTJ4eF9zZXRfZGl2aXNvcihzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjLAorCQkJCSAgICAgICB1MTYgcHJlc2NhbGVyLCB1bnNpZ25lZCBpbnQgZGl2aXNvcikKK3sKKwkvKiBzZWxlY3QgcHJlc2NhbGVyICovCisJb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfY2xvY2tfc2VsZWN0LCBwcmVzY2FsZXIpOworCW91dF84KCZwc2MtPmN0dXIsIGRpdmlzb3IgPj4gOCk7CisJb3V0XzgoJnBzYy0+Y3RsciwgZGl2aXNvciAmIDB4ZmYpOworfQorCiAjaWZkZWYgQ09ORklHX1BQQ19NUEM1Mnh4CiAjZGVmaW5lIEZJRk9fNTJ4eChwb3J0KSAoKHN0cnVjdCBtcGM1Mnh4X3BzY19maWZvIF9faW9tZW0gKikoUFNDKHBvcnQpKzEpKQogc3RhdGljIHZvaWQgbXBjNTJ4eF9wc2NfZmlmb19pbml0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xMjgsOSArMTQwLDYgQEAKIAlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gUFNDKHBvcnQpOwogCXN0cnVjdCBtcGM1Mnh4X3BzY19maWZvIF9faW9tZW0gKmZpZm8gPSBGSUZPXzUyeHgocG9ydCk7CiAKLQkvKiAvMzIgcHJlc2NhbGVyICovCi0Jb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfY2xvY2tfc2VsZWN0LCAweGRkMDApOwotCiAJb3V0XzgoJmZpZm8tPnJmY250bCwgMHgwMCk7CiAJb3V0X2JlMTYoJmZpZm8tPnJmYWxhcm0sIDB4MWZmKTsKIAlvdXRfOCgmZmlmby0+dGZjbnRsLCAweDA3KTsKQEAgLTIxOSwxNSArMjI4LDQ3IEBACiAJb3V0X2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaW1yLCBwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKIH0KIAotLyogU2VhcmNoIGZvciBidXMtZnJlcXVlbmN5IHByb3BlcnR5IGluIHRoaXMgbm9kZSBvciBhIHBhcmVudCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXBjNTJ4eF9nZXR1YXJ0Y2xrKHZvaWQgKnApCitzdGF0aWMgdW5zaWduZWQgaW50IG1wYzUyMDBfcHNjX3NldF9iYXVkcmF0ZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyAqbmV3LAorCQkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewotCS8qCi0JICogNTIwMCBVQVJUcyBoYXZlIGEgLyAzMiBwcmVzY2FsZXIKLQkgKiBidXQgdGhlIGdlbmVyaWMgc2VyaWFsIGNvZGUgYXNzdW1lcyAxNgotCSAqIHNvIHJldHVybiBpcGIgZnJlcSAvIDIKLQkgKi8KLQlyZXR1cm4gbXBjNXh4eF9nZXRfYnVzX2ZyZXF1ZW5jeShwKSAvIDI7CisJdW5zaWduZWQgaW50IGJhdWQ7CisJdW5zaWduZWQgaW50IGRpdmlzb3I7CisKKwkvKiBUaGUgNTIwMCBoYXMgYSBmaXhlZCAvMzIgcHJlc2NhbGVyLCB1YXJ0Y2xrIGNvbnRhaW5zIHRoZSBpcGIgZnJlcSAqLworCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgbmV3LCBvbGQsCisJCQkJICBwb3J0LT51YXJ0Y2xrIC8gKDMyICogMHhmZmZmKSArIDEsCisJCQkJICBwb3J0LT51YXJ0Y2xrIC8gMzIpOworCWRpdmlzb3IgPSAocG9ydC0+dWFydGNsayArIDE2ICogYmF1ZCkgLyAoMzIgKiBiYXVkKTsKKworCS8qIGVuYWJsZSB0aGUgLzMyIHByZXNjYWxlciBhbmQgc2V0IHRoZSBkaXZpc29yICovCisJbXBjNTJ4eF9zZXRfZGl2aXNvcihQU0MocG9ydCksIDB4ZGQwMCwgZGl2aXNvcik7CisJcmV0dXJuIGJhdWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXBjNTIwMGJfcHNjX3NldF9iYXVkcmF0ZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJCQkgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm5ldywKKwkJCQkJICAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCit7CisJdW5zaWduZWQgaW50IGJhdWQ7CisJdW5zaWduZWQgaW50IGRpdmlzb3I7CisJdTE2IHByZXNjYWxlcjsKKworCS8qIFRoZSA1MjAwQiBoYXMgYSBzZWxlY3RhYmxlIC80IG9yIC8zMiBwcmVzY2FsZXIsIHVhcnRjbGsgY29udGFpbnMgdGhlCisJICogaXBiIGZyZXEgKi8KKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIG5ldywgb2xkLAorCQkJCSAgcG9ydC0+dWFydGNsayAvICgzMiAqIDB4ZmZmZikgKyAxLAorCQkJCSAgcG9ydC0+dWFydGNsayAvIDQpOworCWRpdmlzb3IgPSAocG9ydC0+dWFydGNsayArIDIgKiBiYXVkKSAvICg0ICogYmF1ZCk7CisKKwkvKiBzZWxlY3QgdGhlIHByb3BlciBwcmVzY2FsZXIgYW5kIHNldCB0aGUgZGl2aXNvciAqLworCWlmIChkaXZpc29yID4gMHhmZmZmKSB7CisJCWRpdmlzb3IgPSAoZGl2aXNvciArIDQpIC8gODsKKwkJcHJlc2NhbGVyID0gMHhkZDAwOyAvKiAvMzIgKi8KKwl9IGVsc2UKKwkJcHJlc2NhbGVyID0gMHhmZjAwOyAvKiAvNCAqLworCW1wYzUyeHhfc2V0X2Rpdmlzb3IoUFNDKHBvcnQpLCBwcmVzY2FsZXIsIGRpdmlzb3IpOworCXJldHVybiBiYXVkOwogfQogCiBzdGF0aWMgdm9pZCBtcGM1Mnh4X3BzY19nZXRfaXJxKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCkBAIC0yNTgsNyArMjk5LDI4IEBACiAJLnJlYWRfY2hhciA9IG1wYzUyeHhfcHNjX3JlYWRfY2hhciwKIAkuY3dfZGlzYWJsZV9pbnRzID0gbXBjNTJ4eF9wc2NfY3dfZGlzYWJsZV9pbnRzLAogCS5jd19yZXN0b3JlX2ludHMgPSBtcGM1Mnh4X3BzY19jd19yZXN0b3JlX2ludHMsCi0JLmdldHVhcnRjbGsgPSBtcGM1Mnh4X2dldHVhcnRjbGssCisJLnNldF9iYXVkcmF0ZSA9IG1wYzUyMDBfcHNjX3NldF9iYXVkcmF0ZSwKKwkuZ2V0X2lycSA9IG1wYzUyeHhfcHNjX2dldF9pcnEsCisJLmhhbmRsZV9pcnEgPSBtcGM1Mnh4X3BzY19oYW5kbGVfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBwc2Nfb3BzIG1wYzUyMDBiX3BzY19vcHMgPSB7CisJLmZpZm9faW5pdCA9IG1wYzUyeHhfcHNjX2ZpZm9faW5pdCwKKwkucmF3X3J4X3JkeSA9IG1wYzUyeHhfcHNjX3Jhd19yeF9yZHksCisJLnJhd190eF9yZHkgPSBtcGM1Mnh4X3BzY19yYXdfdHhfcmR5LAorCS5yeF9yZHkgPSBtcGM1Mnh4X3BzY19yeF9yZHksCisJLnR4X3JkeSA9IG1wYzUyeHhfcHNjX3R4X3JkeSwKKwkudHhfZW1wdHkgPSBtcGM1Mnh4X3BzY190eF9lbXB0eSwKKwkuc3RvcF9yeCA9IG1wYzUyeHhfcHNjX3N0b3BfcngsCisJLnN0YXJ0X3R4ID0gbXBjNTJ4eF9wc2Nfc3RhcnRfdHgsCisJLnN0b3BfdHggPSBtcGM1Mnh4X3BzY19zdG9wX3R4LAorCS5yeF9jbHJfaXJxID0gbXBjNTJ4eF9wc2NfcnhfY2xyX2lycSwKKwkudHhfY2xyX2lycSA9IG1wYzUyeHhfcHNjX3R4X2Nscl9pcnEsCisJLndyaXRlX2NoYXIgPSBtcGM1Mnh4X3BzY193cml0ZV9jaGFyLAorCS5yZWFkX2NoYXIgPSBtcGM1Mnh4X3BzY19yZWFkX2NoYXIsCisJLmN3X2Rpc2FibGVfaW50cyA9IG1wYzUyeHhfcHNjX2N3X2Rpc2FibGVfaW50cywKKwkuY3dfcmVzdG9yZV9pbnRzID0gbXBjNTJ4eF9wc2NfY3dfcmVzdG9yZV9pbnRzLAorCS5zZXRfYmF1ZHJhdGUgPSBtcGM1MjAwYl9wc2Nfc2V0X2JhdWRyYXRlLAogCS5nZXRfaXJxID0gbXBjNTJ4eF9wc2NfZ2V0X2lycSwKIAkuaGFuZGxlX2lycSA9IG1wYzUyeHhfcHNjX2hhbmRsZV9pcnEsCiB9OwpAQCAtMzkyLDkgKzQ1NCwzNSBAQAogCW91dF9iZTMyKCZGSUZPXzUxMngocG9ydCktPnJ4aW1yLCBwb3J0LT5yZWFkX3N0YXR1c19tYXNrICYgMHg3Zik7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1wYzUxMnhfZ2V0dWFydGNsayh2b2lkICpwKQorc3RhdGljIHVuc2lnbmVkIGludCBtcGM1MTJ4X3BzY19zZXRfYmF1ZHJhdGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCQkJICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm5ldywKKwkJCQkJICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKLQlyZXR1cm4gbXBjNXh4eF9nZXRfYnVzX2ZyZXF1ZW5jeShwKTsKKwl1bnNpZ25lZCBpbnQgYmF1ZDsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjsKKworCS8qCisJICogVGhlICJNUEM1MTIxZSBNaWNyb2NvbnRyb2xsZXIgUmVmZXJlbmNlIE1hbnVhbCwgUmV2LiAzIiBzYXlzIG9uCisJICogcGcuIDMwLTEwIHRoYXQgdGhlIGNoaXAgc3VwcG9ydHMgYSAvMzIgYW5kIGEgLzEwIHByZXNjYWxlci4KKwkgKiBGdXJ0aGVybW9yZSwgaXQgc3RhdGVzIHRoYXQgIkFmdGVyIHJlc2V0LCB0aGUgcHJlc2NhbGVyIGJ5IDEwCisJICogZm9yIHRoZSBVQVJUIG1vZGUgaXMgc2VsZWN0ZWQiLCBidXQgdGhlIHJlc2V0IHJlZ2lzdGVyIHZhbHVlIGlzCisJICogMHgwMDAwIHdoaWNoIG1lYW5zIGEgLzMyIHByZXNjYWxlci4gVGhpcyBpcyB3cm9uZy4KKwkgKgorCSAqIEluIHJlYWxpdHkgdXNpbmcgLzMyIHByZXNjYWxlciBkb2Vzbid0IHdvcmssIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQhCisJICogVXNlIC8xNiBvciAvMTAgcHJlc2NhbGVyLCBzZWUgIk1QQzUxMjFlIEhhcmR3YXJlIERlc2lnbiBHdWlkZSIsCisJICogQ2hhcHRlciA0LjEgUFNDIGluIFVBUlQgTW9kZS4KKwkgKiBDYWxjdWxhdGUgd2l0aCBhIC8xNiBwcmVzY2FsZXIgaGVyZS4KKwkgKi8KKworCS8qIHVhcnRjbGsgY29udGFpbnMgdGhlIGlwcyBmcmVxICovCisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCBuZXcsIG9sZCwKKwkJCQkgIHBvcnQtPnVhcnRjbGsgLyAoMTYgKiAweGZmZmYpICsgMSwKKwkJCQkgIHBvcnQtPnVhcnRjbGsgLyAxNik7CisJZGl2aXNvciA9IChwb3J0LT51YXJ0Y2xrICsgOCAqIGJhdWQpIC8gKDE2ICogYmF1ZCk7CisKKwkvKiBlbmFibGUgdGhlIC8xNiBwcmVzY2FsZXIgYW5kIHNldCB0aGUgZGl2aXNvciAqLworCW1wYzUyeHhfc2V0X2Rpdmlzb3IoUFNDKHBvcnQpLCAweGRkMDAsIGRpdmlzb3IpOworCXJldHVybiBiYXVkOwogfQogCiAvKiBJbml0IFBTQyBGSUZPIENvbnRyb2xsZXIgKi8KQEAgLTQ5OCw3ICs1ODYsNyBAQAogCS5yZWFkX2NoYXIgPSBtcGM1MTJ4X3BzY19yZWFkX2NoYXIsCiAJLmN3X2Rpc2FibGVfaW50cyA9IG1wYzUxMnhfcHNjX2N3X2Rpc2FibGVfaW50cywKIAkuY3dfcmVzdG9yZV9pbnRzID0gbXBjNTEyeF9wc2NfY3dfcmVzdG9yZV9pbnRzLAotCS5nZXR1YXJ0Y2xrID0gbXBjNTEyeF9nZXR1YXJ0Y2xrLAorCS5zZXRfYmF1ZHJhdGUgPSBtcGM1MTJ4X3BzY19zZXRfYmF1ZHJhdGUsCiAJLmNsb2NrID0gbXBjNTEyeF9wc2NfY2xvY2ssCiAJLmZpZm9jX2luaXQgPSBtcGM1MTJ4X3BzY19maWZvY19pbml0LAogCS5maWZvY191bmluaXQgPSBtcGM1MTJ4X3BzY19maWZvY191bmluaXQsCkBAIC02NjYsOCArNzU0LDggQEAKIAlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gUFNDKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBtcjEsIG1yMjsKLQl1bnNpZ25lZCBzaG9ydCBjdHI7Ci0JdW5zaWduZWQgaW50IGosIGJhdWQsIHF1b3Q7CisJdW5zaWduZWQgaW50IGo7CisJdW5zaWduZWQgaW50IGJhdWQ7CiAKIAkvKiBQcmVwYXJlIHdoYXQgd2UncmUgZ29ubmEgd3JpdGUgKi8KIAltcjEgPSAwOwpAQCAtNzA0LDE2ICs3OTIsOSBAQAogCQltcjIgfD0gTVBDNTJ4eF9QU0NfTU9ERV9UWENUUzsKIAl9CiAKLQliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIG5ldywgb2xkLCAwLCBwb3J0LT51YXJ0Y2xrLzE2KTsKLQlxdW90ID0gdWFydF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKLQljdHIgPSBxdW90ICYgMHhmZmZmOwotCiAJLyogR2V0IHRoZSBsb2NrICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAotCS8qIFVwZGF0ZSB0aGUgcGVyLXBvcnQgdGltZW91dCAqLwotCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgbmV3LT5jX2NmbGFnLCBiYXVkKTsKLQogCS8qIERvIG91ciBiZXN0IHRvIGZsdXNoIFRYICYgUlgsIHNvIHdlIGRvbid0IGxvc2UgYW55dGhpbmcgKi8KIAkvKiBCdXQgd2UgZG9uJ3Qgd2FpdCBpbmRlZmluaXRlbHkgISAqLwogCWogPSA1MDAwMDAwOwkvKiBNYXhpbXVtIHdhaXQgKi8KQEAgLTczNyw4ICs4MTgsMTAgQEAKIAlvdXRfOCgmcHNjLT5jb21tYW5kLCBNUEM1Mnh4X1BTQ19TRUxfTU9ERV9SRUdfMSk7CiAJb3V0XzgoJnBzYy0+bW9kZSwgbXIxKTsKIAlvdXRfOCgmcHNjLT5tb2RlLCBtcjIpOwotCW91dF84KCZwc2MtPmN0dXIsIGN0ciA+PiA4KTsKLQlvdXRfOCgmcHNjLT5jdGxyLCBjdHIgJiAweGZmKTsKKwliYXVkID0gcHNjX29wcy0+c2V0X2JhdWRyYXRlKHBvcnQsIG5ldywgb2xkKTsKKworCS8qIFVwZGF0ZSB0aGUgcGVyLXBvcnQgdGltZW91dCAqLworCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgbmV3LT5jX2NmbGFnLCBiYXVkKTsKIAogCWlmIChVQVJUX0VOQUJMRV9NUyhwb3J0LCBuZXctPmNfY2ZsYWcpKQogCQltcGM1Mnh4X3VhcnRfZW5hYmxlX21zKHBvcnQpOwpAQCAtMTExOCw3ICsxMjAxLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl1YXJ0Y2xrID0gcHNjX29wcy0+Z2V0dWFydGNsayhucCk7CisJdWFydGNsayA9IG1wYzV4eHhfZ2V0X2J1c19mcmVxdWVuY3kobnApOwogCWlmICh1YXJ0Y2xrID09IDApIHsKIAkJcHJfZGVidWcoIkNvdWxkIG5vdCBmaW5kIHVhcnQgY2xvY2sgZnJlcXVlbmN5IVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTIwMSw2ICsxMjg0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNTJ4eF91YXJ0X29mX21hdGNoW10gPSB7CiAjaWZkZWYgQ09ORklHX1BQQ19NUEM1Mnh4CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCAuZGF0YSA9ICZtcGM1MjAwYl9wc2Nfb3BzLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcHNjLXVhcnQiLCAuZGF0YSA9ICZtcGM1Mnh4X3BzY19vcHMsIH0sCiAJLyogYmluZGluZyB1c2VkIGJ5IG9sZCBsaXRlNTIwMCBkZXZpY2UgdHJlZXM6ICovCiAJeyAuY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBzYy11YXJ0IiwgLmRhdGEgPSAmbXBjNTJ4eF9wc2Nfb3BzLCB9LApAQCAtMTIzMyw3ICsxMzE3LDEwIEBACiAJcHJfZGVidWcoIkZvdW5kICVzIGFzc2lnbmVkIHRvIHR0eVBTQyV4XG4iLAogCQkgbXBjNTJ4eF91YXJ0X25vZGVzW2lkeF0tPmZ1bGxfbmFtZSwgaWR4KTsKIAotCXVhcnRjbGsgPSBwc2Nfb3BzLT5nZXR1YXJ0Y2xrKG9wLT5kZXYub2Zfbm9kZSk7CisJLyogc2V0IHRoZSB1YXJ0IGNsb2NrIHRvIHRoZSBpbnB1dCBjbG9jayBvZiB0aGUgcHNjLCB0aGUgZGlmZmVyZW50CisJICogcHJlc2NhbGVycyBhcmUgdGFrZW4gaW50byBhY2NvdW50IGluIHRoZSBzZXRfYmF1ZHJhdGUoKSBtZXRob2RzCisJICogb2YgdGhlIHJlc3BlY3RpdmUgY2hpcCAqLworCXVhcnRjbGsgPSBtcGM1eHh4X2dldF9idXNfZnJlcXVlbmN5KG9wLT5kZXYub2Zfbm9kZSk7CiAJaWYgKHVhcnRjbGsgPT0gMCkgewogCQlkZXZfZGJnKCZvcC0+ZGV2LCAiQ291bGQgbm90IGZpbmQgdWFydCBjbG9jayBmcmVxdWVuY3khXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9ud3BzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL253cHNlcmlhbC5jCmluZGV4IDNjMDJmYTkuLmU2NWIwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL253cHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL253cHNlcmlhbC5jCkBAIC04MSw3ICs4MSw3IEBACiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVwLT5wb3J0LCBzLCBjb3VudCwgbndwc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7CiAKLQkvKiB3YWl0IGZvciB0cmFuc21pdHRlciB0byBiZWNvbWUgZW10cHkgKi8KKwkvKiB3YWl0IGZvciB0cmFuc21pdHRlciB0byBiZWNvbWUgZW1wdHkgKi8KIAl3aGlsZSAoKGRjcl9yZWFkKHVwLT5kY3JfaG9zdCwgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEhSRSkgPT0gMCkKIAkJY3B1X3JlbGF4KCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKaW5kZXggYWIxN2MwOC4uMTQxYzY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTExNSwxNiArMTE0LDE0IEBACiAKIHN0YXRpYyBpbnQgcXVpcmtfcG9zdF9pYm0oc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7Ci0JY29uZl9yZWdfdCByZWcgPSB7IDAsIENTX1JFQUQsIDB4ODAwLCAwIH07CisJdTggdmFsOwogCWludCByZXQ7CiAKLQlyZXQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluaywgJnJlZyk7CisJcmV0ID0gcGNtY2lhX3JlYWRfY29uZmlnX2J5dGUobGluaywgMHg4MDAsICZ2YWwpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCi0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5WYWx1ZSA9IHJlZy5WYWx1ZSB8IDE7Ci0JcmV0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmssICZyZWcpOworCXJldCA9IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShsaW5rLCAweDgwMCwgdmFsIHwgMSk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7CiAJcmV0dXJuIDA7CkBAIC0zMzgsOCArMzM1LDggQEAKIAlpbmZvLT5wX2RldiA9IGxpbms7CiAJbGluay0+cHJpdiA9IGluZm87CiAKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCWxpbmstPmlvLk51bVBvcnRzMSA9IDg7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSA4OwogCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKIAlpZiAoZG9fc291bmQpIHsKIAkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CkBAIC00MjcsMTIgKzQyNCwxMyBAQAogCQlwX2Rldi0+Y29uZi5WcHAgPQogCQkJY2YtPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CiAKKwlwX2Rldi0+aW9fbGluZXMgPSAoKCp0cnkgJiAweDEpID09IDApID8KKwkJCTE2IDogY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisKIAlpZiAoKGNmLT5pby5ud2luID4gMCkgJiYgKGNmLT5pby53aW5bMF0ubGVuID09IHNpemVfdGFibGVbKCp0cnkgPj4gMSldKQogCSAgICAmJiAoY2YtPmlvLndpblswXS5iYXNlICE9IDApKSB7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9ICgoKnRyeSAmIDB4MSkgPT0gMCkgPwotCQkJMTYgOiBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpKQogCQkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRUlOVkFMOwpAQCAtNDQ5LDkgKzQ0Nyw5IEBACiAKIAlpZiAoKGNmLT5pby5ud2luID4gMCkgJiYgKChjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSykgPD0gMykpIHsKIAkJZm9yIChqID0gMDsgaiA8IDU7IGorKykgewotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGJhc2Vbal07Ci0JCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBiYXNlW2pdID8gMTYgOiAzOwotCQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gYmFzZVtqXTsKKwkJCXBfZGV2LT5pb19saW5lcyA9IGJhc2Vbal0gPyAxNiA6IDM7CisJCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQ2NiwxMyArNDY0LDEzIEBACiAJLyogSWYgdGhlIGNhcmQgaXMgYWxyZWFkeSBjb25maWd1cmVkLCBsb29rIHVwIHRoZSBwb3J0IGFuZCBpcnEgKi8KIAlpZiAobGluay0+ZnVuY3Rpb25fY29uZmlnKSB7CiAJCXVuc2lnbmVkIGludCBwb3J0ID0gMDsKLQkJaWYgKChsaW5rLT5pby5CYXNlUG9ydDIgIT0gMCkgJiYKLQkJICAgIChsaW5rLT5pby5OdW1Qb3J0czIgPT0gOCkpIHsKLQkJCXBvcnQgPSBsaW5rLT5pby5CYXNlUG9ydDI7CisJCWlmICgobGluay0+cmVzb3VyY2VbMV0tPmVuZCAhPSAwKSAmJgorCQkJKHJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMV0pID09IDgpKSB7CisJCQlwb3J0ID0gbGluay0+cmVzb3VyY2VbMV0tPmVuZDsKIAkJCWluZm8tPnNsYXZlID0gMTsKIAkJfSBlbHNlIGlmICgoaW5mby0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgotCQkJICAgKGxpbmstPmlvLk51bVBvcnRzMSA9PSAweDQwKSkgewotCQkJcG9ydCA9IGxpbmstPmlvLkJhc2VQb3J0MSArIDB4Mjg7CisJCQkocmVzb3VyY2Vfc2l6ZShsaW5rLT5yZXNvdXJjZVswXSkgPT0gMHg0MCkpIHsKKwkJCXBvcnQgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQgKyAweDI4OwogCQkJaW5mby0+c2xhdmUgPSAxOwogCQl9CiAJCWlmIChpbmZvLT5zbGF2ZSkgewpAQCAtNTEwLDcgKzUwOCw3IEBACiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwogCWlmIChpICE9IDApCiAJCXJldHVybiAtMTsKLQlyZXR1cm4gc2V0dXBfc2VyaWFsKGxpbmssIGluZm8sIGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aXJxKTsKKwlyZXR1cm4gc2V0dXBfc2VyaWFsKGxpbmssIGluZm8sIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgbGluay0+aXJxKTsKIH0KIAogc3RhdGljIGludCBtdWx0aV9jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LApAQCAtNTI0LDEwICs1MjIsMTAgQEAKIAkvKiBUaGUgcXVhZCBwb3J0IGNhcmRzIGhhdmUgYmFkIENJUydzLCBzbyBqdXN0IGxvb2sgZm9yIGEKIAkgICB3aW5kb3cgbGFyZ2VyIHRoYW4gOCBwb3J0cyBhbmQgYXNzdW1lIGl0IHdpbGwgYmUgcmlnaHQgKi8KIAlpZiAoKGNmLT5pby5ud2luID09IDEpICYmIChjZi0+aW8ud2luWzBdLmxlbiA+IDgpKSB7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkgewotCQkJKmJhc2UyID0gcF9kZXYtPmlvLkJhc2VQb3J0MSArIDg7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCXBfZGV2LT5pb19saW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkgeworCQkJKmJhc2UyID0gcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCArIDg7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTU0MywxMSArNTQxLDExIEBACiAJaW50ICpiYXNlMiA9IHByaXZfZGF0YTsKIAogCWlmIChjZi0+aW8ubndpbiA9PSAyKSB7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzFdLmJhc2U7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkgewotCQkJKmJhc2UyID0gcF9kZXYtPmlvLkJhc2VQb3J0MjsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGNmLT5pby53aW5bMV0uYmFzZTsKKwkJcF9kZXYtPmlvX2xpbmVzID0gY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpKSB7CisJCQkqYmFzZTIgPSBwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0OwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC01NjAsMTAgKzU1OCwxMCBAQAogCWludCBpLCBiYXNlMiA9IDA7CiAKIAkvKiBGaXJzdCwgbG9vayBmb3IgYSBnZW5lcmljIGZ1bGwtc2l6ZWQgd2luZG93ICovCi0JbGluay0+aW8uTnVtUG9ydHMxID0gaW5mby0+bXVsdGkgKiA4OworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSBpbmZvLT5tdWx0aSAqIDg7CiAJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBtdWx0aV9jb25maWdfY2hlY2ssICZiYXNlMikpIHsKIAkJLyogSWYgdGhhdCBkaWRuJ3Qgd29yaywgbG9vayBmb3IgdHdvIHdpbmRvd3MgKi8KLQkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gODsKKwkJbGluay0+cmVzb3VyY2VbMF0tPmVuZCA9IGxpbmstPnJlc291cmNlWzFdLT5lbmQgPSA4OwogCQlpbmZvLT5tdWx0aSA9IDI7CiAJCWlmIChwY21jaWFfbG9vcF9jb25maWcobGluaywgbXVsdGlfY29uZmlnX2NoZWNrX25vdHBpY2t5LAogCQkJCSAgICAgICAmYmFzZTIpKSB7CkBAIC01OTksOSArNTk3LDkgQEAKIAkJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPT0gMykgewogCQkJZXJyID0gc2V0dXBfc2VyaWFsKGxpbmssIGluZm8sIGJhc2UyLAogCQkJCQlsaW5rLT5pcnEpOwotCQkJYmFzZTIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJCQliYXNlMiA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDs7CiAJCX0gZWxzZSB7Ci0JCQllcnIgPSBzZXR1cF9zZXJpYWwobGluaywgaW5mbywgbGluay0+aW8uQmFzZVBvcnQxLAorCQkJZXJyID0gc2V0dXBfc2VyaWFsKGxpbmssIGluZm8sIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwKIAkJCQkJbGluay0+aXJxKTsKIAkJfQogCQlpbmZvLT5jOTUwY3RybCA9IGJhc2UyOwpAQCAtNjE2LDcgKzYxNCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXNldHVwX3NlcmlhbChsaW5rLCBpbmZvLCBsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlycSk7CisJc2V0dXBfc2VyaWFsKGxpbmssIGluZm8sIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgbGluay0+aXJxKTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bXVsdGkgLSAxOyBpKyspCiAJCXNldHVwX3NlcmlhbChsaW5rLCBpbmZvLCBiYXNlMiArICg4ICogaSksCiAJCQkJbGluay0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYyBiL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYwppbmRleCA5Nzk0ZTBjLi43ZTVlNWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCkBAIC00NzAsNyArNDcwLDcgQEAKIAl9CiAKIAlpZiAocG9ydC0+c2NfcG9ydC5zdGF0ZSkgewotCQkvKiBUaGUgc2VyaWFsX2NvcmUgc3R1ZmZzIGFyZSBpbml0aWxpemVkLCB1c2UgdGhlbSAqLworCQkvKiBUaGUgc2VyaWFsX2NvcmUgc3R1ZmZzIGFyZSBpbml0aWFsaXplZCwgdXNlIHRoZW0gKi8KIAkJdHR5ID0gcG9ydC0+c2NfcG9ydC5zdGF0ZS0+cG9ydC50dHk7CiAJfQogCWVsc2UgewpAQCAtNTUxLDExICs1NTEsMTEgQEAKIAlCVUdfT04oIXBvcnQtPnNjX2lzX2FzeW5jaCk7CiAKIAlpZiAocG9ydC0+c2NfcG9ydC5zdGF0ZSkgewotCQkvKiBXZSdyZSBpbml0aWxpemVkLCB1c2luZyBzZXJpYWwgY29yZSBpbmZyYXN0cnVjdHVyZSAqLworCQkvKiBXZSdyZSBpbml0aWFsaXplZCwgdXNpbmcgc2VyaWFsIGNvcmUgaW5mcmFzdHJ1Y3R1cmUgKi8KIAkJeG1pdCA9ICZwb3J0LT5zY19wb3J0LnN0YXRlLT54bWl0OwogCX0gZWxzZSB7CiAJCS8qIFByb2JhYmx5IHNuX3NhbF9zd2l0Y2hfdG9fYXN5bmNoIGhhcyBiZWVuIHJ1biBidXQgc2VyaWFsIGNvcmUgaXNuJ3QKLQkJICogaW5pdGlsaXplZCB5ZXQuICBKdXN0IHJldHVybi4gIFdyaXRlcyBhcmUgZ29pbmcgdGhyb3VnaAorCQkgKiBpbml0aWFsaXplZCB5ZXQuICBKdXN0IHJldHVybi4gIFdyaXRlcyBhcmUgZ29pbmcgdGhyb3VnaAogCQkgKiBzbl9zYWxfY29uc29sZV93cml0ZSAoZHVlIHRvIHJlZ2lzdGVyX2NvbnNvbGUpIGF0IHRoaXMgdGltZS4KIAkJICovCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCmluZGV4IDg5MGY5MTcuLmE3NzllMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3VuaHYuYwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJdW5zaWduZWQgbG9uZyBtaW5vcjsKIAlpbnQgZXJyOwogCi0JaWYgKG9wLT5pcnFzWzBdID09IDB4ZmZmZmZmZmYpCisJaWYgKG9wLT5hcmNoZGF0YS5pcnFzWzBdID09IDB4ZmZmZmZmZmYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1YXJ0X3BvcnQpLCBHRlBfS0VSTkVMKTsKQEAgLTU1Nyw3ICs1NTcsNyBAQAogCiAJcG9ydC0+bWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKikgX19wYShwb3J0KTsKIAotCXBvcnQtPmlycSA9IG9wLT5pcnFzWzBdOworCXBvcnQtPmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCiAJcG9ydC0+ZGV2ID0gJm9wLT5kZXY7CiAKQEAgLTY0NCwxMiArNjQ0LDEyIEBACiAJaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmaHZfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmh2X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzdW5odl9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmh2X2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmh2X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHN1bmh2X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwppbmRleCA1ZTgxYmM2Li45ODQ1ZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwpAQCAtOTY5LDcgKzk2OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXVwLT5yZWdzID0gKHVuaW9uIHNhYjgyNTMyX2FzeW5jX3JlZ3MgX19pb21lbSAqKSB1cC0+cG9ydC5tZW1iYXNlOwogCi0JdXAtPnBvcnQuaXJxID0gb3AtPmlycXNbMF07CisJdXAtPnBvcnQuaXJxID0gb3AtPmFyY2hkYXRhLmlycXNbMF07CiAKIAl1cC0+cG9ydC5maWZvc2l6ZSA9IFNBQjgyNTMyX1hNSVRfRklGT19TSVpFOwogCXVwLT5wb3J0LmlvdHlwZSA9IFVQSU9fTUVNOwpAQCAtMTEzMCwxMiArMTEzMCwxMiBAQAogCQl9CiAJfQogCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmc2FiX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZzYWJfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHN1bnNhYl9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhYl9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZzYWJfZHJpdmVyKTsKIAlpZiAoc3Vuc2FiX3JlZy5ucikgewogCQlzdW5zZXJpYWxfdW5yZWdpc3Rlcl9taW5vcnMoJnN1bnNhYl9yZWcsIHN1bnNhYl9yZWcubnIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCmluZGV4IGZmYmY0NTUuLjNjZGY3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwpAQCAtMTQ0Myw3ICsxNDQzLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JdXAtPnBvcnQuaXJxID0gb3AtPmlycXNbMF07CisJdXAtPnBvcnQuaXJxID0gb3AtPmFyY2hkYXRhLmlycXNbMF07CiAKIAl1cC0+cG9ydC5kZXYgPSAmb3AtPmRldjsKIApAQCAtMTU4Niw3ICsxNTg2LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JZXJyID0gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZzdV9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJZXJyID0gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZzdV9kcml2ZXIpOwogCWlmIChlcnIgJiYgbnVtX3VhcnQpCiAJCXN1bnNlcmlhbF91bnJlZ2lzdGVyX21pbm9ycygmc3Vuc3VfcmVnLCBudW1fdWFydCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCmluZGV4IGY5YTI0ZjQuLmQxZTZiY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtMTQyNiw3ICsxNDI2LDcgQEAKIAlycCA9IHN1bnppbG9nX2NoaXBfcmVnc1tpbnN0XTsKIAogCWlmICh6aWxvZ19pcnEgPT0gLTEpCi0JCXppbG9nX2lycSA9IG9wLT5pcnFzWzBdOworCQl6aWxvZ19pcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAogCXVwID0gJnN1bnppbG9nX3BvcnRfdGFibGVbaW5zdCAqIDJdOwogCkBAIC0xNDM0LDcgKzE0MzQsNyBAQAogCXVwWzBdLnBvcnQubWFwYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydCArIDB4MDA7CiAJdXBbMF0ucG9ydC5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSAmcnAtPmNoYW5uZWxBOwogCXVwWzBdLnBvcnQuaW90eXBlID0gVVBJT19NRU07Ci0JdXBbMF0ucG9ydC5pcnEgPSBvcC0+aXJxc1swXTsKKwl1cFswXS5wb3J0LmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCXVwWzBdLnBvcnQudWFydGNsayA9IFpTX0NMT0NLOwogCXVwWzBdLnBvcnQuZmlmb3NpemUgPSAxOwogCXVwWzBdLnBvcnQub3BzID0gJnN1bnppbG9nX3BvcHM7CkBAIC0xNDUxLDcgKzE0NTEsNyBAQAogCXVwWzFdLnBvcnQubWFwYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydCArIDB4MDQ7CiAJdXBbMV0ucG9ydC5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSAmcnAtPmNoYW5uZWxCOwogCXVwWzFdLnBvcnQuaW90eXBlID0gVVBJT19NRU07Ci0JdXBbMV0ucG9ydC5pcnEgPSBvcC0+aXJxc1swXTsKKwl1cFsxXS5wb3J0LmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCXVwWzFdLnBvcnQudWFydGNsayA9IFpTX0NMT0NLOwogCXVwWzFdLnBvcnQuZmlmb3NpemUgPSAxOwogCXVwWzFdLnBvcnQub3BzID0gJnN1bnppbG9nX3BvcHM7CkBAIC0xNDkyLDEyICsxNDkyLDEyIEBACiAJCSAgICAgICAiaXMgYSAlc1xuIiwKIAkJICAgICAgIGRldl9uYW1lKCZvcC0+ZGV2KSwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHVwWzBdLnBvcnQubWFwYmFzZSwKLQkJICAgICAgIG9wLT5pcnFzWzBdLCBzdW56aWxvZ190eXBlKCZ1cFswXS5wb3J0KSk7CisJCSAgICAgICBvcC0+YXJjaGRhdGEuaXJxc1swXSwgc3Vuemlsb2dfdHlwZSgmdXBbMF0ucG9ydCkpOwogCQlwcmludGsoS0VSTl9JTkZPICIlczogTW91c2UgYXQgTU1JTyAweCVsbHggKGlycSA9ICVkKSAiCiAJCSAgICAgICAiaXMgYSAlc1xuIiwKIAkJICAgICAgIGRldl9uYW1lKCZvcC0+ZGV2KSwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHVwWzFdLnBvcnQubWFwYmFzZSwKLQkJICAgICAgIG9wLT5pcnFzWzBdLCBzdW56aWxvZ190eXBlKCZ1cFsxXS5wb3J0KSk7CisJCSAgICAgICBvcC0+YXJjaGRhdGEuaXJxc1swXSwgc3Vuemlsb2dfdHlwZSgmdXBbMV0ucG9ydCkpOwogCQlrYm1faW5zdCsrOwogCX0KIApAQCAtMTU3Niw3ICsxNTc2LDcgQEAKIAkJCWdvdG8gb3V0X2ZyZWVfdGFibGVzOwogCX0KIAotCWVyciA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmenNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCWVyciA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmenNfZHJpdmVyKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF91bnJlZ2lzdGVyX3VhcnQ7CiAKQEAgLTE2MDQsNyArMTYwNCw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X3VucmVnaXN0ZXJfZHJpdmVyOgotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZ6c19kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ6c19kcml2ZXIpOwogCiBvdXRfdW5yZWdpc3Rlcl91YXJ0OgogCWlmIChudW1fc3Vuemlsb2cpIHsKQEAgLTE2MTksNyArMTYxOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzdW56aWxvZ19leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnpzX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnpzX2RyaXZlcik7CiAKIAlpZiAoemlsb2dfaXJxICE9IC0xKSB7CiAJCXN0cnVjdCB1YXJ0X3N1bnppbG9nX3BvcnQgKnVwID0gc3Vuemlsb2dfaXJxX2NoYWluOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYyBiL2RyaXZlcnMvc2VyaWFsL3VhcnRsaXRlLmMKaW5kZXggOGFjY2NkNS4uY2FmMDg1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYworKysgYi9kcml2ZXJzL3NlcmlhbC91YXJ0bGl0ZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfT0YpICYmIChkZWZpbmVkKENPTkZJR19QUEMzMikgfHwgZGVmaW5lZChDT05GSUdfTUlDUk9CTEFaRSkpCiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvbXBjNTEyeF9wc2Nfc3BpLmMgYi9kcml2ZXJzL3NwaS9tcGM1MTJ4X3BzY19zcGkuYwppbmRleCAyNTM0YjFlLi4xMGJhYWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9tcGM1MTJ4X3BzY19zcGkuYworKysgYi9kcml2ZXJzL3NwaS9tcGM1MTJ4X3BzY19zcGkuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KQEAgLTQ0MCw2ICs0NDEsNyBAQAogCW1hc3Rlci0+c2V0dXAgPSBtcGM1MTJ4X3BzY19zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2ZlciA9IG1wYzUxMnhfcHNjX3NwaV90cmFuc2ZlcjsKIAltYXN0ZXItPmNsZWFudXAgPSBtcGM1MTJ4X3BzY19zcGlfY2xlYW51cDsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwogCiAJdGVtcHAgPSBpb3JlbWFwKHJlZ2FkZHIsIHNpemUpOwogCWlmICghdGVtcHApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKaW5kZXggNzEwNGNiNy4uNjZkMTcwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKQEAgLTE2LDggKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0zOTgsNiArMzk4LDcgQEAKIAltYXN0ZXItPnNldHVwID0gbXBjNTJ4eF9wc2Nfc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXIgPSBtcGM1Mnh4X3BzY19zcGlfdHJhbnNmZXI7CiAJbWFzdGVyLT5jbGVhbnVwID0gbXBjNTJ4eF9wc2Nfc3BpX2NsZWFudXA7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKIAogCW1wcy0+cHNjID0gaW9yZW1hcChyZWdhZGRyLCBzaXplKTsKIAlpZiAoIW1wcy0+cHNjKSB7CkBAIC00NzAsNyArNDcxLDYgQEAKIAljb25zdCB1MzIgKnJlZ2FkZHJfcDsKIAl1NjQgcmVnYWRkcjY0LCBzaXplNjQ7CiAJczE2IGlkID0gLTE7Ci0JaW50IHJjOwogCiAJcmVnYWRkcl9wID0gb2ZfZ2V0X2FkZHJlc3Mob3AtPmRldi5vZl9ub2RlLCAwLCAmc2l6ZTY0LCBOVUxMKTsKIAlpZiAoIXJlZ2FkZHJfcCkgewpAQCAtNDkxLDEzICs0OTEsOCBAQAogCQlpZCA9ICpwc2NfbnVtcCArIDE7CiAJfQogCi0JcmMgPSBtcGM1Mnh4X3BzY19zcGlfZG9fcHJvYmUoJm9wLT5kZXYsICh1MzIpcmVnYWRkcjY0LCAodTMyKXNpemU2NCwKKwlyZXR1cm4gbXBjNTJ4eF9wc2Nfc3BpX2RvX3Byb2JlKCZvcC0+ZGV2LCAodTMyKXJlZ2FkZHI2NCwgKHUzMilzaXplNjQsCiAJCQkJaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKSwgaWQpOwotCWlmIChyYyA9PSAwKQotCQlvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpLAotCQkJCQlvcC0+ZGV2Lm9mX25vZGUpOwotCi0JcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IF9fZXhpdCBtcGM1Mnh4X3BzY19zcGlfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9zcGkuYyBiL2RyaXZlcnMvc3BpL21wYzUyeHhfc3BpLmMKaW5kZXggYjFhNzZiZi4uNTYxMzZmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9tcGM1Mnh4X3NwaS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDM5LDYgKzQzOCw3IEBACiAJbWFzdGVyLT5zZXR1cCA9IG1wYzUyeHhfc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXIgPSBtcGM1Mnh4X3NwaV90cmFuc2ZlcjsKIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfTFNCX0ZJUlNUOworCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBvcC0+ZGV2Lm9mX25vZGU7CiAKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIG1hc3Rlcik7CiAKQEAgLTUxMiw3ICs1MTIsNiBAQAogCWlmIChyYykKIAkJZ290byBlcnJfcmVnaXN0ZXI7CiAKLQlvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhtYXN0ZXIsIG9wLT5kZXYub2Zfbm9kZSk7CiAJZGV2X2luZm8oJm1zLT5tYXN0ZXItPmRldiwgInJlZ2lzdGVyZWQgTVBDNTIwMCBTUEkgYnVzXG4iKTsKIAogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggYjNhMWY5Mi4uMWJiMWI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3NwaS5oPgogCiAKIC8qIFNQSSBidXN0eXBlIGFuZCBzcGlfbWFzdGVyIGNsYXNzIGFyZSByZWdpc3RlcmVkIGFmdGVyIGJvYXJkIGluaXQgY29kZQpAQCAtNTQwLDYgKzU0MSw5IEBACiAJLyogcG9wdWxhdGUgY2hpbGRyZW4gZnJvbSBhbnkgc3BpIGRldmljZSB0YWJsZXMgKi8KIAlzY2FuX2JvYXJkaW5mbyhtYXN0ZXIpOwogCXN0YXR1cyA9IDA7CisKKwkvKiBSZWdpc3RlciBkZXZpY2VzIGZyb20gdGhlIGRldmljZSB0cmVlICovCisJb2ZfcmVnaXN0ZXJfc3BpX2RldmljZXMobWFzdGVyKTsKIGRvbmU6CiAJcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4eHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfbXBjOHh4eC5jCmluZGV4IDk3YWIwYTguLmFhZDlhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4eHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX21wYzh4eHguYwpAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgpAQCAtMTAwOSw2ICsxMDA4LDcgQEAKIAltYXN0ZXItPnNldHVwID0gbXBjOHh4eF9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2ZlciA9IG1wYzh4eHhfc3BpX3RyYW5zZmVyOwogCW1hc3Rlci0+Y2xlYW51cCA9IG1wYzh4eHhfc3BpX2NsZWFudXA7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKIAogCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCW1wYzh4eHhfc3BpLT5kZXYgPSBkZXY7CkBAIC0xMjk5LDggKzEyOTksNiBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhtYXN0ZXIsIG5wKTsKLQogCXJldHVybiAwOwogCiBlcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfcHBjNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfcHBjNHh4LmMKaW5kZXggZDUzNDY2YS4uMGY1ZmE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3BwYzR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9wcGM0eHguYwpAQCAtNDA3LDYgKzQwNyw3IEBACiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZiAqaHcpOwogCWlmIChtYXN0ZXIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG5wOwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CkBAIC01NDUsNyArNTQ2LDYgQEAKIAl9CiAKIAlkZXZfaW5mbyhkZXYsICJkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOwotCW9mX3JlZ2lzdGVyX3NwaV9kZXZpY2VzKG1hc3RlciwgbnApOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwppbmRleCAxYjQ3MzYzLi44MGYyZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaS5jCkBAIC0zOTAsNiArMzkwLDkgQEAKIAogCW1hc3Rlci0+YnVzX251bSA9IGJ1c19udW07CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBkYXRhLT5udW1fY2hpcHNlbGVjdDsKKyNpZmRlZiBDT05GSUdfT0YKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOworI2VuZGlmCiAKIAl4c3BpLT5tZW0gPSAqbWVtOwogCXhzcGktPmlycSA9IGlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3hpbGlueF9zcGlfb2YuYyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGlfb2YuYwppbmRleCA0NjU0ODA1Li5mNTNkM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpX29mLmMKKysrIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaV9vZi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KQEAgLTgwLDkgKzgxLDYgQEAKIAogCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgbWFzdGVyKTsKIAotCS8qIEFkZCBhbnkgc3Vibm9kZXMgb24gdGhlIFNQSSBidXMgKi8KLQlvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhtYXN0ZXIsIG9mZGV2LT5kZXYub2Zfbm9kZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uLmMKaW5kZXggNTlhZTc2Yi4uN2MwMzFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbi5jCkBAIC0yMDksNiArMjA5LDI0IEBACiAJfQogfQogCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BtdUZhc3RQd3J1cERlbGF5ICovCitzdGF0aWMgdTE2IHBtdV9mYXN0X3Bvd2VydXBfZGVsYXkoc3RydWN0IHNzYl9jaGlwY29tbW9uICpjYykKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gY2MtPmRldi0+YnVzOworCisJc3dpdGNoIChidXMtPmNoaXBfaWQpIHsKKwljYXNlIDB4NDMxMjoKKwljYXNlIDB4NDMyMjoKKwljYXNlIDB4NDMyODoKKwkJcmV0dXJuIDcwMDA7CisJY2FzZSAweDQzMjU6CisJCS8qIFRPRE86ICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIDE1MDAwOworCX0KK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9DbGtjdGxGYXN0UHdydXBEZWxheSAqLwogc3RhdGljIHZvaWQgY2FsY19mYXN0X3Bvd2VydXBfZGVsYXkoc3RydWN0IHNzYl9jaGlwY29tbW9uICpjYykKIHsKIAlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gY2MtPmRldi0+YnVzOwpAQCAtMjE4LDYgKzIzNiwxMiBAQAogCiAJaWYgKGJ1cy0+YnVzdHlwZSAhPSBTU0JfQlVTVFlQRV9QQ0kpCiAJCXJldHVybjsKKworCWlmIChjYy0+Y2FwYWJpbGl0aWVzICYgU1NCX0NISVBDT19DQVBfUE1VKSB7CisJCWNjLT5mYXN0X3B3cnVwX2RlbGF5ID0gcG11X2Zhc3RfcG93ZXJ1cF9kZWxheShjYyk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoIShjYy0+Y2FwYWJpbGl0aWVzICYgU1NCX0NISVBDT19DQVBfUENUTCkpCiAJCXJldHVybjsKIApAQCAtMjM1LDYgKzI1OSw3IEBACiAJCXJldHVybjsgLyogV2UgZG9uJ3QgaGF2ZSBhIENoaXBDb21tb24gKi8KIAlpZiAoY2MtPmRldi0+aWQucmV2aXNpb24gPj0gMTEpCiAJCWNjLT5zdGF0dXMgPSBjaGlwY29fcmVhZDMyKGNjLCBTU0JfQ0hJUENPX0NISVBTVEFUKTsKKwlzc2JfZHByaW50ayhLRVJOX0lORk8gUEZYICJjaGlwY29tbW9uIHN0YXR1cyBpcyAweCV4XG4iLCBjYy0+c3RhdHVzKTsKIAlzc2JfcG11X2luaXQoY2MpOwogCWNoaXBjb19wb3dlcmNvbnRyb2xfaW5pdChjYyk7CiAJc3NiX2NoaXBjb19zZXRfY2xvY2ttb2RlKGNjLCBTU0JfQ0xLTU9ERV9GQVNUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uX3BtdS5jIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKaW5kZXggM2Q1NTEyNC4uNTczMmJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKQEAgLTUwMiw5ICs1MDIsOSBAQAogCQljaGlwY29fd3JpdGUzMihjYywgU1NCX0NISVBDT19QTVVfTUFYUkVTX01TSywgbWF4X21zayk7CiB9CiAKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvU1NCL1BtdUluaXQgKi8KIHZvaWQgc3NiX3BtdV9pbml0KHN0cnVjdCBzc2JfY2hpcGNvbW1vbiAqY2MpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGNjLT5kZXYtPmJ1czsKIAl1MzIgcG11Y2FwOwogCiAJaWYgKCEoY2MtPmNhcGFiaWxpdGllcyAmIFNTQl9DSElQQ09fQ0FQX1BNVSkpCkBAIC01MTYsMTUgKzUxNiwxMiBAQAogCXNzYl9kcHJpbnRrKEtFUk5fREVCVUcgUEZYICJGb3VuZCByZXYgJXUgUE1VIChjYXBhYmlsaXRpZXMgMHglMDhYKVxuIiwKIAkJICAgIGNjLT5wbXUucmV2LCBwbXVjYXApOwogCi0JaWYgKGNjLT5wbXUucmV2ID49IDEpIHsKLQkJaWYgKChidXMtPmNoaXBfaWQgPT0gMHg0MzI1KSAmJiAoYnVzLT5jaGlwX3JldiA8IDIpKSB7Ci0JCQljaGlwY29fbWFzazMyKGNjLCBTU0JfQ0hJUENPX1BNVV9DVEwsCi0JCQkJICAgICAgflNTQl9DSElQQ09fUE1VX0NUTF9OT0lMUE9OVyk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlwY29fc2V0MzIoY2MsIFNTQl9DSElQQ09fUE1VX0NUTCwKLQkJCQkgICAgIFNTQl9DSElQQ09fUE1VX0NUTF9OT0lMUE9OVyk7Ci0JCX0KLQl9CisJaWYgKGNjLT5wbXUucmV2ID09IDEpCisJCWNoaXBjb19tYXNrMzIoY2MsIFNTQl9DSElQQ09fUE1VX0NUTCwKKwkJCSAgICAgIH5TU0JfQ0hJUENPX1BNVV9DVExfTk9JTFBPTlcpOworCWVsc2UKKwkJY2hpcGNvX3NldDMyKGNjLCBTU0JfQ0hJUENPX1BNVV9DVEwsCisJCQkgICAgIFNTQl9DSElQQ09fUE1VX0NUTF9OT0lMUE9OVyk7CiAJc3NiX3BtdV9wbGxfaW5pdChjYyk7CiAJc3NiX3BtdV9yZXNvdXJjZXNfaW5pdChjYyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9tYWluLmMgYi9kcml2ZXJzL3NzYi9tYWluLmMKaW5kZXggNTEyNzVhYS4uNzg5MmFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvbWFpbi5jCisrKyBiL2RyaXZlcnMvc3NiL21haW4uYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CkBAIC00ODYsNiArNDg1LDcgQEAKICNpZmRlZiBDT05GSUdfU1NCX1BDSUhPU1QKIAkJCXNkZXYtPmlycSA9IGJ1cy0+aG9zdF9wY2ktPmlycTsKIAkJCWRldi0+cGFyZW50ID0gJmJ1cy0+aG9zdF9wY2ktPmRldjsKKwkJCXNkZXYtPmRtYV9kZXYgPSBkZXYtPnBhcmVudDsKICNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgU1NCX0JVU1RZUEVfUENNQ0lBOgpAQCAtNTAxLDYgKzUwMSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBTU0JfQlVTVFlQRV9TU0I6CiAJCQlkZXYtPmRtYV9tYXNrID0gJmRldi0+Y29oZXJlbnRfZG1hX21hc2s7CisJCQlzZGV2LT5kbWFfZGV2ID0gZGV2OwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTIyNiw4MCArMTIyNyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNzYl9kbWFfdHJhbnNsYXRpb24pOwogCi1pbnQgc3NiX2RtYV9zZXRfbWFzayhzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2LCB1NjQgbWFzaykKLXsKLSNpZmRlZiBDT05GSUdfU1NCX1BDSUhPU1QKLQlpbnQgZXJyOwotI2VuZGlmCi0KLQlzd2l0Y2ggKGRldi0+YnVzLT5idXN0eXBlKSB7Ci0JY2FzZSBTU0JfQlVTVFlQRV9QQ0k6Ci0jaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCi0JCWVyciA9IHBjaV9zZXRfZG1hX21hc2soZGV2LT5idXMtPmhvc3RfcGNpLCBtYXNrKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhkZXYtPmJ1cy0+aG9zdF9wY2ksIG1hc2spOwotCQlyZXR1cm4gZXJyOwotI2VuZGlmCi0JY2FzZSBTU0JfQlVTVFlQRV9TU0I6Ci0JCXJldHVybiBkbWFfc2V0X21hc2soZGV2LT5kZXYsIG1hc2spOwotCWRlZmF1bHQ6Ci0JCV9fc3NiX2RtYV9ub3RfaW1wbGVtZW50ZWQoZGV2KTsKLQl9Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci1FWFBPUlRfU1lNQk9MKHNzYl9kbWFfc2V0X21hc2spOwotCi12b2lkICogc3NiX2RtYV9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGdmcF9mbGFncykKLXsKLQlzd2l0Y2ggKGRldi0+YnVzLT5idXN0eXBlKSB7Ci0JY2FzZSBTU0JfQlVTVFlQRV9QQ0k6Ci0jaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCi0JCWlmIChnZnBfZmxhZ3MgJiBHRlBfRE1BKSB7Ci0JCQkvKiBXb3JrYXJvdW5kOiBUaGUgUENJIEFQSSBkb2VzIG5vdCBzdXBwb3J0IHBhc3NpbmcKLQkJCSAqIGEgR0ZQIGZsYWcuICovCi0JCQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPmJ1cy0+aG9zdF9wY2ktPmRldiwKLQkJCQkJCSAgc2l6ZSwgZG1hX2hhbmRsZSwgZ2ZwX2ZsYWdzKTsKLQkJfQotCQlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5idXMtPmhvc3RfcGNpLCBzaXplLCBkbWFfaGFuZGxlKTsKLSNlbmRpZgotCWNhc2UgU1NCX0JVU1RZUEVfU1NCOgotCQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRldi0+ZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBnZnBfZmxhZ3MpOwotCWRlZmF1bHQ6Ci0JCV9fc3NiX2RtYV9ub3RfaW1wbGVtZW50ZWQoZGV2KTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKHNzYl9kbWFfYWxsb2NfY29uc2lzdGVudCk7Ci0KLXZvaWQgc3NiX2RtYV9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IHNzYl9kZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkgICAgIGdmcF90IGdmcF9mbGFncykKLXsKLQlzd2l0Y2ggKGRldi0+YnVzLT5idXN0eXBlKSB7Ci0JY2FzZSBTU0JfQlVTVFlQRV9QQ0k6Ci0jaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCi0JCWlmIChnZnBfZmxhZ3MgJiBHRlBfRE1BKSB7Ci0JCQkvKiBXb3JrYXJvdW5kOiBUaGUgUENJIEFQSSBkb2VzIG5vdCBzdXBwb3J0IHBhc3NpbmcKLQkJCSAqIGEgR0ZQIGZsYWcuICovCi0JCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5idXMtPmhvc3RfcGNpLT5kZXYsCi0JCQkJCSAgc2l6ZSwgdmFkZHIsIGRtYV9oYW5kbGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5idXMtPmhvc3RfcGNpLCBzaXplLAotCQkJCSAgICB2YWRkciwgZG1hX2hhbmRsZSk7Ci0JCXJldHVybjsKLSNlbmRpZgotCWNhc2UgU1NCX0JVU1RZUEVfU1NCOgotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYtPmRldiwgc2l6ZSwgdmFkZHIsIGRtYV9oYW5kbGUpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJX19zc2JfZG1hX25vdF9pbXBsZW1lbnRlZChkZXYpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woc3NiX2RtYV9mcmVlX2NvbnNpc3RlbnQpOwotCiBpbnQgc3NiX2J1c19tYXlfcG93ZXJkb3duKHN0cnVjdCBzc2JfYnVzICpidXMpCiB7CiAJc3RydWN0IHNzYl9jaGlwY29tbW9uICpjYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3BjaS5jIGIvZHJpdmVycy9zc2IvcGNpLmMKaW5kZXggNmRjZGE4Ni4uNmU4OGQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvcGNpLmMKKysrIGIvZHJpdmVycy9zc2IvcGNpLmMKQEAgLTYyNiwxMSArNjI2LDIyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAoYnVzLT5jaGlwY28uZGV2KSB7CS8qIGNhbiBiZSB1bmF2YWlsaWJsZSEgKi8KLQkJYnVzLT5zcHJvbV9vZmZzZXQgPSAoYnVzLT5jaGlwY28uZGV2LT5pZC5yZXZpc2lvbiA8IDMxKSA/Ci0JCQlTU0JfU1BST01fQkFTRTEgOiBTU0JfU1BST01fQkFTRTMxOworCQkvKgorCQkgKiBnZXQgU1BST00gb2Zmc2V0OiBTU0JfU1BST01fQkFTRTEgZXhjZXB0IGZvcgorCQkgKiBjaGlwY29tbW9uIHJldiA+PSAzMSBvciBjaGlwIElEIGlzIDB4NDMxMiBhbmQKKwkJICogY2hpcGNvbW1vbiBzdGF0dXMgJiAzID09IDIKKwkJICovCisJCWlmIChidXMtPmNoaXBjby5kZXYtPmlkLnJldmlzaW9uID49IDMxKQorCQkJYnVzLT5zcHJvbV9vZmZzZXQgPSBTU0JfU1BST01fQkFTRTMxOworCQllbHNlIGlmIChidXMtPmNoaXBfaWQgPT0gMHg0MzEyICYmCisJCQkgKGJ1cy0+Y2hpcGNvLnN0YXR1cyAmIDB4MDMpID09IDIpCisJCQlidXMtPnNwcm9tX29mZnNldCA9IFNTQl9TUFJPTV9CQVNFMzE7CisJCWVsc2UKKwkJCWJ1cy0+c3Byb21fb2Zmc2V0ID0gU1NCX1NQUk9NX0JBU0UxOwogCX0gZWxzZSB7CiAJCWJ1cy0+c3Byb21fb2Zmc2V0ID0gU1NCX1NQUk9NX0JBU0UxOwogCX0KKwlzc2JfZHByaW50ayhLRVJOX0lORk8gUEZYICJTUFJPTSBvZmZzZXQgaXMgMHgleFxuIiwgYnVzLT5zcHJvbV9vZmZzZXQpOwogCiAJYnVmID0ga2NhbGxvYyhTU0JfU1BST01TSVpFX1dPUkRTX1IxMjMsIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3BjbWNpYS5jIGIvZHJpdmVycy9zc2IvcGNtY2lhLmMKaW5kZXggZTcyZjQwNC4uNTI2NjgyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvcGNtY2lhLmMKKysrIGIvZHJpdmVycy9zc2IvcGNtY2lhLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KQEAgLTcyLDE0ICs3MSw5IEBACiAvKiBXcml0ZSB0byBhIFBDTUNJQSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLwogc3RhdGljIGludCBzc2JfcGNtY2lhX2NmZ193cml0ZShzdHJ1Y3Qgc3NiX2J1cyAqYnVzLCB1OCBvZmZzZXQsIHU4IHZhbHVlKQogewotCWNvbmZfcmVnX3QgcmVnOwogCWludCByZXM7CiAKLQltZW1zZXQoJnJlZywgMCwgc2l6ZW9mKHJlZykpOwotCXJlZy5PZmZzZXQgPSBvZmZzZXQ7Ci0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5WYWx1ZSA9IHZhbHVlOwotCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihidXMtPmhvc3RfcGNtY2lhLCAmcmVnKTsKKwlyZXMgPSBwY21jaWFfd3JpdGVfY29uZmlnX2J5dGUoYnVzLT5ob3N0X3BjbWNpYSwgb2Zmc2V0LCB2YWx1ZSk7CiAJaWYgKHVubGlrZWx5KHJlcyAhPSAwKSkKIAkJcmV0dXJuIC1FQlVTWTsKIApAQCAtODksMTYgKzgzLDExIEBACiAvKiBSZWFkIGZyb20gYSBQQ01DSUEgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KIHN0YXRpYyBpbnQgc3NiX3BjbWNpYV9jZmdfcmVhZChzdHJ1Y3Qgc3NiX2J1cyAqYnVzLCB1OCBvZmZzZXQsIHU4ICp2YWx1ZSkKIHsKLQljb25mX3JlZ190IHJlZzsKIAlpbnQgcmVzOwogCi0JbWVtc2V0KCZyZWcsIDAsIHNpemVvZihyZWcpKTsKLQlyZWcuT2Zmc2V0ID0gb2Zmc2V0OwotCXJlZy5BY3Rpb24gPSBDU19SRUFEOwotCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihidXMtPmhvc3RfcGNtY2lhLCAmcmVnKTsKKwlyZXMgPSBwY21jaWFfcmVhZF9jb25maWdfYnl0ZShidXMtPmhvc3RfcGNtY2lhLCBvZmZzZXQsIHZhbHVlKTsKIAlpZiAodW5saWtlbHkocmVzICE9IDApKQogCQlyZXR1cm4gLUVCVVNZOwotCSp2YWx1ZSA9IHJlZy5WYWx1ZTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2Ivc2Nhbi5jIGIvZHJpdmVycy9zc2Ivc2Nhbi5jCmluZGV4IDBkNmMwMjguLjk3MzhjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL3NjYW4uYworKysgYi9kcml2ZXJzL3NzYi9zY2FuLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA5ODRhNzU0Li40YTdhN2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtOTcsNiArOTcsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9LY29uZmlnIgpAQCAtMTA5LDE1ICsxMTEsMTMgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdm1lL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3Jhcl9yZWdpc3Rlci9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZW1yYXIvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2VwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL0tjb25maWciCiAKQEAgLTEyOSw4ICsxMjksNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kdDMxNTUvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9LY29uZmlnIgpAQCAtMTQ3LDUgKzE0NSwxNSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tc20vS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbGlyYy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3F1aWNrc3RhcnQvS2NvbmZpZyIKKwogZW5kaWYgIyAhU1RBR0lOR19FWENMVURFX0JVSUxECiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCA5ZmEyNTEzLi5jYTVjMDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwNykJKz0gZ283MDA3Lwogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjU4MjEpCSs9IGN4MjU4MjEvCiBvYmotJChDT05GSUdfVklERU9fVE02MDAwKQkrPSB0bTYwMDAvCitvYmotJChDT05GSUdfTElSQ19TVEFHSU5HKQkrPSBsaXJjLwogb2JqLSQoQ09ORklHX1VTQl9JUF9DT01NT04pCSs9IHVzYmlwLwogb2JqLSQoQ09ORklHX1czNVVORCkJCSs9IHdpbmJvbmQvCiBvYmotJChDT05GSUdfUFJJU00yX1VTQikJKz0gd2xhbi1uZy8KQEAgLTIyLDYgKzIzLDcgQEAKIG9iai0kKENPTkZJR19SVEw4MTkyU1UpCQkrPSBydGw4MTkyc3UvCiBvYmotJChDT05GSUdfUlRMODE5MlUpCQkrPSBydGw4MTkydS8KIG9iai0kKENPTkZJR19SVEw4MTkyRSkJCSs9IHJ0bDgxOTJlLworb2JqLSQoQ09ORklHX1NQRUNUUkEpCQkrPSBzcGVjdHJhLwogb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IGZyb250aWVyLwogb2JqLSQoQ09ORklHX0RSRUFNKQkJKz0gZHJlYW0vCiBvYmotJChDT05GSUdfUE9ITUVMRlMpCQkrPSBwb2htZWxmcy8KQEAgLTM1LDE3ICszNywxNSBAQAogb2JqLSQoQ09ORklHX0ZCX1VETCkJCSs9IHVkbGZiLwogb2JqLSQoQ09ORklHX0hZUEVSVikJCSs9IGh2Lwogb2JqLSQoQ09ORklHX1ZNRV9CVVMpCQkrPSB2bWUvCi1vYmotJChDT05GSUdfUkFSX1JFR0lTVEVSKQkrPSByYXJfcmVnaXN0ZXIvCiBvYmotJChDT05GSUdfTVJTVF9SQVJfSEFORExFUikJKz0gbWVtcmFyLwogb2JqLSQoQ09ORklHX0RYX1NFUCkJCSs9IHNlcC8KIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCi1vYmotJChDT05GSUdfUkFNWlNXQVApCQkrPSByYW16c3dhcC8KK29iai0kKENPTkZJR19aUkFNKQkJKz0genJhbS8KIG9iai0kKENPTkZJR19XTEFHUzQ5X0gyKQkrPSB3bGFnczQ5X2gyLwogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDI1KQkrPSB3bGFnczQ5X2gyNS8KIG9iai0kKENPTkZJR19CQVRNQU5fQURWKQkrPSBiYXRtYW4tYWR2Lwogb2JqLSQoQ09ORklHX1NBTVNVTkdfTEFQVE9QKQkrPSBzYW1zdW5nLWxhcHRvcC8KIG9iai0kKENPTkZJR19GQl9TTTdYWCkJCSs9IHNtN3h4Lwotb2JqLSQoQ09ORklHX0RUMzE1NSkJCSs9IGR0MzE1NS8KIG9iai0kKENPTkZJR19WSURFT19EVDMxNTUpCSs9IGR0MzE1NXY0bC8KIG9iai0kKENPTkZJR19DUllTVEFMSEQpCQkrPSBjcnlzdGFsaGQvCiBvYmotJChDT05GSUdfQ1hUMUUxKQkJKz0gY3h0MWUxLwpAQCAtNTQsMyArNTQsNyBAQAogb2JqLSQoQ09ORklHX0ZCX1hHSSkJCSs9IHhnaWZiLwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX01SU1RPVUNIKQkrPSBtcnN0LXRvdWNoc2NyZWVuLwogb2JqLSQoQ09ORklHX01TTV9TVEFHSU5HKQkrPSBtc20vCitvYmotJChDT05GSUdfRUFTWUNBUCkJCSs9IGVhc3ljYXAvCitvYmotJChDT05GSUdfU09MTzZYMTApCQkrPSBzb2xvNngxMC8KK29iai0kKENPTkZJR19USURTUEJSSURHRSkJKz0gdGlkc3BicmlkZ2UvCitvYmotJChDT05GSUdfQUNQSV9RVUlDS1NUQVJUKQkrPSBxdWlja3N0YXJ0LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmMKaW5kZXggNTVkNjZlMi4uYzNlNmE0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5jCkBAIC0zMDMsNyArMzAzLDcgQEAKIAlpZiAoc3RhdHVzICE9IDApCiAJCWdvdG8gZXJyOwogCWlmICh2YWx1ZSAhPSAweDA4MDApIHsKLQkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU2NhbGUgZmFjdG9yIGlzIG5vbmUgZGVmYXVsdCIKKwkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU2NhbGUgZmFjdG9yIGlzIG5vbmUgZGVmYXVsdCAiCiAJCQkJInZhbHVlICglLjR4KVxuIiwgdmFsdWUpOwogCX0KIApAQCAtMzM4LDcgKzMzOCw3IEBACiAJCQlzdGF0dXMgPSAtRU5PREVWOwogCQkJZ290byBlcnI7CiAJCX0gZWxzZSBpZiAodmFsdWUgJiAweDMpCXsKLQkJCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgIlNlbnNvciB2b2x0YWdlIgorCQkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU2Vuc29yIHZvbHRhZ2UgIgogCQkJCQkJIm91dCBvZiByYW5nZS5cbiIpOwogCQkJc3RhdHVzID0gLUVOT0RFVjsKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvQ0hBTkdFTE9HIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvQ0hBTkdFTE9HCmluZGV4IGM4ZjlkOWUuLjg2NDUwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0NIQU5HRUxPRworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9DSEFOR0VMT0cKQEAgLTEsMyArMSwxNSBAQAorYmF0bWFuLWFkdiAyMDEwLjAuMDoKKworKiBzdXBwb3J0IGxhdGVzdCBrZXJuZWxzICgyLjYuMjEgLSAyLjYuMzUpCisqIGZ1cnRoZXIgY29kZSByZWZhY3RvcmluZyBhbmQgY2xlYW5pbmcgZm9yIGNvZGluZyBzdHlsZQorKiBtb3ZlIGZyb20gcHJvY2ZzIGJhc2VkIGNvbmZpZ3VyYXRpb24gdG8gc3lzZnMKKyogcmVvcmdhbml6ZWQgc2VxdWVuY2UgbnVtYmVyIGhhbmRsaW5nCisqIGxpbWl0IHF1ZXVlIGxlbmd0aHMgZm9yIGJhdG1hbiBhbmQgYnJvYWRjYXN0IHBhY2tldHMKKyogbWFueSBidWdzIChlbmRsZXNzIGxvb3AgYW5kIHJvZ3VlIHBhY2tldHMgb24gc2h1dGRvd24sIHdyb25nIHRjcGR1bXAgb3V0cHV0LAorICBtaXNzaW5nIGZyZWVzIGluIGVycm9yIHNpdHVhdGlvbnMsIHNsZWVwcyBpbiBhdG9taWMgY29udGV4dHMpIHNxdWFzaGVkCisKKyAtLSBGcmksIDE4IEp1biAyMDEwIDIxOjM0OjI2ICswMjAwCisKIGJhdG1hbi1hZHYgMC4yLjE6CiAKICogc3VwcG9ydCBsYXRlc3Qga2VybmVscyAoMi42LjIwIC0gMi42LjMzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcKaW5kZXggMWU3ZTBhOC4uODU1M2YzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCkBAIC00LDcgKzQsNyBAQAogCiBjb25maWcgQkFUTUFOX0FEVgogCXRyaXN0YXRlICJCLkEuVC5NLkEuTi4gQWR2YW5jZWQgTWVzaGluZyBQcm90b2NvbCIKLQlkZXBlbmRzIG9uIFBST0NfRlMgJiYgTkVUCisJZGVwZW5kcyBvbiBORVQKICAgICAgICAgZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCmluZGV4IGYyNTA2OGMuLmU5ODE3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCkBAIC0xOCw1ICsxOCw1IEBACiAjIDAyMTEwLTEzMDEsIFVTQQogIwogCi1vYmotbSArPSBiYXRtYW4tYWR2Lm8KLWJhdG1hbi1hZHYtb2JqcyA6PSBtYWluLm8gc2VuZC5vIHJvdXRpbmcubyBzb2Z0LWludGVyZmFjZS5vIGRldmljZS5vIHRyYW5zbGF0aW9uLXRhYmxlLm8gYml0YXJyYXkubyBoYXNoLm8gcmluZ19idWZmZXIubyB2aXMubyBoYXJkLWludGVyZmFjZS5vIGFnZ3JlZ2F0aW9uLm8gb3JpZ2luYXRvci5vIGJhdF9zeXNmcy5vCitvYmotJChDT05GSUdfQkFUTUFOX0FEVikgKz0gYmF0bWFuLWFkdi5vCitiYXRtYW4tYWR2LW9ianMgOj0gbWFpbi5vIGJhdF9kZWJ1Z2ZzLm8gYmF0X3N5c2ZzLm8gc2VuZC5vIHJvdXRpbmcubyBzb2Z0LWludGVyZmFjZS5vIGljbXBfc29ja2V0Lm8gdHJhbnNsYXRpb24tdGFibGUubyBiaXRhcnJheS5vIGhhc2gubyByaW5nX2J1ZmZlci5vIHZpcy5vIGhhcmQtaW50ZXJmYWNlLm8gYWdncmVnYXRpb24ubyBvcmlnaW5hdG9yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1JFQURNRQppbmRleCAxNDI0NGEyLi43MTkyYjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FCkBAIC0xLDQgKzEsNCBAQAotW3N0YXRlOiAwMy0wNS0yMDEwXQorW3N0YXRlOiAxMi0wNi0yMDEwXQogCiBCQVRNQU4tQURWCiAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETwppbmRleCA1MThkYjdmLi45YzVhZWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KQEAgLTEsNiArMSw5IEBACi1SZXF1ZXN0IGEgcmV2aWV3LgotUHJvY2VzcyB0aGUgY29tbWVudHMgZnJvbSB0aGUgcmV2aWV3LgotTW92ZSBpbnRvIG1haW5saW5lIHByb3Blci4KKyAqIFVzZSBod2VpZ2h0KiBmb3IgaGFtbWluZyB3ZWlnaHQgY2FsY3VsYXRpb24KKyAqIFNhdmUvY2FjaGUgcGFja2V0cyBkaXJla3RseSBhcyBza2IgaW5zdGVhZCBvZiB1c2luZyBhIG5vcm1hbCBtZW1vcnkgcmVnaW9uCisgICBhbmQgY29weWluZyBpdCBpbiBhIHNrYiB1c2luZyBzZW5kX3Jhd19wYWNrZXQgYW5kIHNpbWlsYXIgZnVuY3Rpb25zCisgKiBSZXF1ZXN0IGEgbmV3IHJldmlldworICogUHJvY2VzcyB0aGUgY29tbWVudHMgZnJvbSB0aGUgcmV2aWV3CisgKiBNb3ZlIGludG8gbWFpbmxpbmUgcHJvcGVyCiAKIFBsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIHRvOgogCU1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYwppbmRleCBjZThiOGE2Li45ODYyZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmMKQEAgLTEwNiwxMSArMTA2LDE0IEBACiB7CiAJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogRklYTUU6IGVhY2ggYmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOwogCiAJLyogb3duIHBhY2tldCBzaG91bGQgYWx3YXlzIGJlIHNjaGVkdWxlZCAqLwogCWlmICghb3duX3BhY2tldCkgewogCQlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJhdG1hbl9xdWV1ZV9sZWZ0KSkgewotCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAiYmF0bWFuIHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKKwkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkJImJhdG1hbiBwYWNrZXQgcXVldWUgZnVsbFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0yNTIsOSArMjU1LDkgQEAKIAl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsIHBhY2tldF9sZW4sCiAJCQkJIGJhdG1hbl9wYWNrZXQtPm51bV9obmEpKSB7CiAKLQkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMTZiaXQgc2Vxbm8sIGFuZCB0aGUKKwkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMzJiaXQgc2Vxbm8sIGFuZCB0aGUKIAkJICAgb3JpZ19pbnRlcnZhbC4gKi8KLQkJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBudG9ocyhiYXRtYW5fcGFja2V0LT5zZXFubyk7CisJCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gbnRvaGwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOwogCiAJCWhuYV9idWZmID0gcGFja2V0X2J1ZmYgKyBidWZmX3BvcyArIEJBVF9QQUNLRVRfTEVOOwogCQlyZWNlaXZlX2JhdF9wYWNrZXQoZXRoaGRyLCBiYXRtYW5fcGFja2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmgKaW5kZXggODQ0MDFjYS4uNzFhOTFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCkBAIC0xOSw2ICsxOSw5IEBACiAgKgogICovCiAKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX0FHR1JFR0FUSU9OX0hfCisjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9BR0dSRUdBVElPTl9IXworCiAjaW5jbHVkZSAibWFpbi5oIgogCiAvKiBpcyB0aGVyZSBhbm90aGVyIGFnZ3JlZ2F0ZWQgcGFja2V0IGhlcmU/ICovCkBAIC0zNiwzICszOSw1IEBACiAJCQkgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpOwogdm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAogCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0FHR1JFR0FUSU9OX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdkYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCisjaW5jbHVkZSAiYmF0X2RlYnVnZnMuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInZpcy5oIgorI2luY2x1ZGUgImljbXBfc29ja2V0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpiYXRfZGVidWdmczsKKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCisjZGVmaW5lIExPR19CVUZGX01BU0sgKGxvZ19idWZmX2xlbi0xKQorI2RlZmluZSBMT0dfQlVGRihpZHgpIChkZWJ1Z19sb2ctPmxvZ19idWZmWyhpZHgpICYgTE9HX0JVRkZfTUFTS10pCisKK3N0YXRpYyBpbnQgbG9nX2J1ZmZfbGVuID0gTE9HX0JVRl9MRU47CisKK3N0YXRpYyB2b2lkIGVtaXRfbG9nX2NoYXIoc3RydWN0IGRlYnVnX2xvZyAqZGVidWdfbG9nLCBjaGFyIGMpCit7CisJTE9HX0JVRkYoZGVidWdfbG9nLT5sb2dfZW5kKSA9IGM7CisJZGVidWdfbG9nLT5sb2dfZW5kKys7CisKKwlpZiAoZGVidWdfbG9nLT5sb2dfZW5kIC0gZGVidWdfbG9nLT5sb2dfc3RhcnQgPiBsb2dfYnVmZl9sZW4pCisJCWRlYnVnX2xvZy0+bG9nX3N0YXJ0ID0gZGVidWdfbG9nLT5sb2dfZW5kIC0gbG9nX2J1ZmZfbGVuOworfQorCitzdGF0aWMgaW50IGZkZWJ1Z19sb2coc3RydWN0IGRlYnVnX2xvZyAqZGVidWdfbG9nLCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgcHJpbnRlZF9sZW47CisJdmFfbGlzdCBhcmdzOworCXN0YXRpYyBjaGFyIGRlYnVnX2xvZ19idWZbMjU2XTsKKwljaGFyICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRlYnVnX2xvZykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGVkX2xlbiA9IHZzY25wcmludGYoZGVidWdfbG9nX2J1Ziwgc2l6ZW9mKGRlYnVnX2xvZ19idWYpLAorCQkJCSBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWZvciAocCA9IGRlYnVnX2xvZ19idWY7ICpwICE9IDA7IHArKykKKwkJZW1pdF9sb2dfY2hhcihkZWJ1Z19sb2csICpwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOworCisJd2FrZV91cCgmZGVidWdfbG9nLT5xdWV1ZV93YWl0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGVidWdfbG9nKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIHRtcF9sb2dfYnVmWzI1Nl07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzY25wcmludGYodG1wX2xvZ19idWYsIHNpemVvZih0bXBfbG9nX2J1ZiksIGZtdCwgYXJncyk7CisJZmRlYnVnX2xvZyhiYXRfcHJpdi0+ZGVidWdfbG9nLCAiWyUxMHVdICVzIiwKKwkJICAgKGppZmZpZXMgLyBIWiksIHRtcF9sb2dfYnVmKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCWluY19tb2R1bGVfY291bnQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkZWNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2cgPSBiYXRfcHJpdi0+ZGVidWdfbG9nOworCWludCBlcnJvciwgaSA9IDA7CisJY2hhciBjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJgorCSAgICAhKGRlYnVnX2xvZy0+bG9nX2VuZCAtIGRlYnVnX2xvZy0+bG9nX3N0YXJ0KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKCFidWYpIHx8IChjb3VudCA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGVidWdfbG9nLT5xdWV1ZV93YWl0LAorCQkJCShkZWJ1Z19sb2ctPmxvZ19zdGFydCAtIGRlYnVnX2xvZy0+bG9nX2VuZCkpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoKCFlcnJvcikgJiYgKGkgPCBjb3VudCkgJiYKKwkgICAgICAgKGRlYnVnX2xvZy0+bG9nX3N0YXJ0ICE9IGRlYnVnX2xvZy0+bG9nX2VuZCkpIHsKKwkJYyA9IExPR19CVUZGKGRlYnVnX2xvZy0+bG9nX3N0YXJ0KTsKKworCQlkZWJ1Z19sb2ctPmxvZ19zdGFydCsrOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOworCisJCWVycm9yID0gX19wdXRfdXNlcihjLCBidWYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKKworCQlidWYrKzsKKwkJaSsrOworCisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWVycm9yKQorCQlyZXR1cm4gaTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBsb2dfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZyA9IGJhdF9wcml2LT5kZWJ1Z19sb2c7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRlYnVnX2xvZy0+cXVldWVfd2FpdCwgd2FpdCk7CisKKwlpZiAoZGVidWdfbG9nLT5sb2dfZW5kIC0gZGVidWdfbG9nLT5sb2dfc3RhcnQpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxvZ19mb3BzID0geworCS5vcGVuICAgICAgICAgICA9IGxvZ19vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IGxvZ19yZWxlYXNlLAorCS5yZWFkICAgICAgICAgICA9IGxvZ19yZWFkLAorCS5wb2xsICAgICAgICAgICA9IGxvZ19wb2xsLAorfTsKKworc3RhdGljIGludCBkZWJ1Z19sb2dfc2V0dXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkOworCisJaWYgKCFiYXRfcHJpdi0+ZGVidWdfZGlyKQorCQlnb3RvIGVycjsKKworCWJhdF9wcml2LT5kZWJ1Z19sb2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGVidWdfbG9nKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFiYXRfcHJpdi0+ZGVidWdfbG9nKQorCQlnb3RvIGVycjsKKworCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+ZGVidWdfbG9nLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiYXRfcHJpdi0+ZGVidWdfbG9nLT5xdWV1ZV93YWl0KTsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJsb2ciLCBTX0lGUkVHIHwgU19JUlVTUiwKKwkJCQliYXRfcHJpdi0+ZGVidWdfZGlyLCBiYXRfcHJpdiwgJmxvZ19mb3BzKTsKKwlpZiAoZCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19sb2dfY2xlYW51cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQoreworCWtmcmVlKGJhdF9wcml2LT5kZWJ1Z19sb2cpOworCWJhdF9wcml2LT5kZWJ1Z19sb2cgPSBOVUxMOworfQorI2Vsc2UgLyogQ09ORklHX0JBVE1BTl9BRFZfREVCVUcgKi8KK3N0YXRpYyBpbnQgZGVidWdfbG9nX3NldHVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCit7CisJYmF0X3ByaXYtPmRlYnVnX2xvZyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2xvZ19jbGVhbnVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCit7CisJcmV0dXJuOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgb3JpZ2luYXRvcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG9yaWdfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOworfQorCitzdGF0aWMgaW50IHRyYW5zdGFibGVfZ2xvYmFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBobmFfZ2xvYmFsX3NlcV9wcmludF90ZXh0LCBuZXRfZGV2KTsKK30KKworc3RhdGljIGludCB0cmFuc3RhYmxlX2xvY2FsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBobmFfbG9jYWxfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOworfQorCitzdGF0aWMgaW50IHZpc19kYXRhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2aXNfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOworfQorCitzdHJ1Y3QgYmF0X2RlYnVnaW5mbyB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wczsKK307CisKKyNkZWZpbmUgQkFUX0RFQlVHSU5GTyhfbmFtZSwgX21vZGUsIF9vcGVuKQlcCitzdHJ1Y3QgYmF0X2RlYnVnaW5mbyBiYXRfZGVidWdpbmZvXyMjX25hbWUgPSB7CVwKKwkuYXR0ciA9IHsgLm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCVwKKwkJICAubW9kZSA9IF9tb2RlLCB9LAkJXAorCS5mb3BzID0geyAub3duZXIgPSBUSElTX01PRFVMRSwJCVwKKwkJICAub3BlbiA9IF9vcGVuLAkJXAorCQkgIC5yZWFkCT0gc2VxX3JlYWQsCQlcCisJCSAgLmxsc2VlayA9IHNlcV9sc2VlaywJCVwKKwkJICAucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAlcCisJCX0JCQkJXAorfTsKKworc3RhdGljIEJBVF9ERUJVR0lORk8ob3JpZ2luYXRvcnMsIFNfSVJVR08sIG9yaWdpbmF0b3JzX29wZW4pOworc3RhdGljIEJBVF9ERUJVR0lORk8odHJhbnN0YWJsZV9nbG9iYWwsIFNfSVJVR08sIHRyYW5zdGFibGVfZ2xvYmFsX29wZW4pOworc3RhdGljIEJBVF9ERUJVR0lORk8odHJhbnN0YWJsZV9sb2NhbCwgU19JUlVHTywgdHJhbnN0YWJsZV9sb2NhbF9vcGVuKTsKK3N0YXRpYyBCQVRfREVCVUdJTkZPKHZpc19kYXRhLCBTX0lSVUdPLCB2aXNfZGF0YV9vcGVuKTsKKworc3RhdGljIHN0cnVjdCBiYXRfZGVidWdpbmZvICptZXNoX2RlYnVnaW5mb3NbXSA9IHsKKwkmYmF0X2RlYnVnaW5mb19vcmlnaW5hdG9ycywKKwkmYmF0X2RlYnVnaW5mb190cmFuc3RhYmxlX2dsb2JhbCwKKwkmYmF0X2RlYnVnaW5mb190cmFuc3RhYmxlX2xvY2FsLAorCSZiYXRfZGVidWdpbmZvX3Zpc19kYXRhLAorCU5VTEwsCit9OworCit2b2lkIGRlYnVnZnNfaW5pdCh2b2lkKQoreworCWJhdF9kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKERFQlVHRlNfQkFUX1NVQkRJUiwgTlVMTCk7CisJaWYgKGJhdF9kZWJ1Z2ZzID09IEVSUl9QVFIoLUVOT0RFVikpCisJCWJhdF9kZWJ1Z2ZzID0gTlVMTDsKK30KKwordm9pZCBkZWJ1Z2ZzX2Rlc3Ryb3kodm9pZCkKK3sKKwlpZiAoYmF0X2RlYnVnZnMpIHsKKwkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGJhdF9kZWJ1Z2ZzKTsKKwkJYmF0X2RlYnVnZnMgPSBOVUxMOworCX0KK30KKworaW50IGRlYnVnZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBiYXRfZGVidWdpbmZvICoqYmF0X2RlYnVnOworCXN0cnVjdCBkZW50cnkgKmZpbGU7CisKKwlpZiAoIWJhdF9kZWJ1Z2ZzKQorCQlnb3RvIG91dDsKKworCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGV2LT5uYW1lLCBiYXRfZGVidWdmcyk7CisJaWYgKCFiYXRfcHJpdi0+ZGVidWdfZGlyKQorCQlnb3RvIG91dDsKKworCWJhdF9zb2NrZXRfc2V0dXAoYmF0X3ByaXYpOworCWRlYnVnX2xvZ19zZXR1cChiYXRfcHJpdik7CisKKwlmb3IgKGJhdF9kZWJ1ZyA9IG1lc2hfZGVidWdpbmZvczsgKmJhdF9kZWJ1ZzsgKytiYXRfZGVidWcpIHsKKwkJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoKCgqYmF0X2RlYnVnKS0+YXR0cikubmFtZSwKKwkJCQkJICBTX0lGUkVHIHwgKCgqYmF0X2RlYnVnKS0+YXR0cikubW9kZSwKKwkJCQkJICBiYXRfcHJpdi0+ZGVidWdfZGlyLAorCQkJCQkgIGRldiwgJigqYmF0X2RlYnVnKS0+Zm9wcyk7CisJCWlmICghZmlsZSkgeworCQkJYmF0X2VycihkZXYsICJDYW4ndCBhZGQgZGVidWdmcyBmaWxlOiAlcy8lc1xuIiwKKwkJCQlkZXYtPm5hbWUsICgoKmJhdF9kZWJ1ZyktPmF0dHIpLm5hbWUpOworCQkJZ290byByZW1fYXR0cjsKKwkJfQorCX0KKworCXJldHVybiAwOworcmVtX2F0dHI6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGJhdF9wcml2LT5kZWJ1Z19kaXIpOworCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBOVUxMOworb3V0OgorI2lmZGVmIENPTkZJR19ERUJVR19GUworCXJldHVybiAtRU5PTUVNOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KK30KKwordm9pZCBkZWJ1Z2ZzX2RlbF9tZXNoaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRlYnVnX2xvZ19jbGVhbnVwKGJhdF9wcml2KTsKKworCWlmIChiYXRfZGVidWdmcykgeworCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYmF0X3ByaXYtPmRlYnVnX2Rpcik7CisJCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZGY1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworCisjaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfCisjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfCisKKyNkZWZpbmUgREVCVUdGU19CQVRfU1VCRElSICJiYXRtYW5fYWR2IgorCit2b2lkIGRlYnVnZnNfaW5pdCh2b2lkKTsKK3ZvaWQgZGVidWdmc19kZXN0cm95KHZvaWQpOworaW50IGRlYnVnZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZGVidWdmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0RFQlVHRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKaW5kZXggMjEyYmMyMS4uYjRhOGQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKQEAgLTI4LDIyICsyOCw2IEBACiAKICNkZWZpbmUgdG9fZGV2KG9iaikgICAgIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCiAKLXN0cnVjdCBiYXRfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLX07Ci0KLXN0cnVjdCBoYXJkaWZfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLX07Ci0KICNkZWZpbmUgQkFUX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQlcCiBzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSBiYXRfYXR0cl8jI19uYW1lID0gewlcCiAJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCVwKQEAgLTUyLDM0ICszNiwxOCBAQAogCS5zdG9yZSAgPSBfc3RvcmUsCQkJXAogfTsKIAotI2RlZmluZSBCQVRfQklOX0FUVFIoX25hbWUsIF9tb2RlLCBfcmVhZCwgX3dyaXRlKQlcCi1zdHJ1Y3QgYmluX2F0dHJpYnV0ZSBiYXRfYXR0cl8jI19uYW1lID0gewkJXAotCS5hdHRyID0geyAubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJCVwKLQkJICAubW9kZSA9IF9tb2RlLCB9LAkJCVwKLQkucmVhZCA9IF9yZWFkLAkJCQkJXAotCS53cml0ZSA9IF93cml0ZSwJCQkJXAotfTsKLQotI2RlZmluZSBIQVJESUZfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCVwKLXN0cnVjdCBoYXJkaWZfYXR0cmlidXRlIGhhcmRpZl9hdHRyXyMjX25hbWUgPSB7CQlcCi0JLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCQlcCi0JCSAubW9kZSA9IF9tb2RlIH0sCQkJXAotCS5zaG93ICAgPSBfc2hvdywJCQkJXAotCS5zdG9yZSAgPSBfc3RvcmUsCQkJCVwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfYWdncl9vZ20oc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCitzdGF0aWMgc3NpemVfdCBzaG93X2FnZ3Jfb2dtcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgY2hhciAqYnVmZikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKIAlpbnQgYWdncl9zdGF0dXMgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgInN0YXR1czogJXNcbmNvbW1hbmRzOiBlbmFibGUsIGRpc2FibGUsIDAsIDFcbiIsCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAogCQkgICAgICAgYWdncl9zdGF0dXMgPT0gMCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9hZ2dyX29nbShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2FnZ3Jfb2dtcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgIGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKQEAgLTk5LDIzICs2Nyw3MyBAQAogCQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCiAJCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwogCi0JCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6SW52YWxpZCBwYXJhbWV0ZXIgZm9yICdhZ2dyZWdhdGUgT0dNJyBzZXR0aW5nIG9uIG1lc2ggJXMgcmVjZWl2ZWQ6ICVzXG4iLAotCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgYnVmZik7CisJCWJhdF9pbmZvKG5ldF9kZXYsCisJCQkgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnYWdncmVnYXRlIE9HTScgc2V0dGluZyIKKwkJCSAicmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkgPT0gYWdncl90bXApCiAJCXJldHVybiBjb3VudDsKIAotCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6Q2hhbmdpbmcgYWdncmVnYXRpb24gZnJvbTogJXMgdG86ICVzIG9uIG1lc2g6ICVzXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpID09IDEgPwotCSAgICAgICAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCBhZ2dyX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKLQkgICAgICAgbmV0X2Rldi0+bmFtZSk7CisJYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIGFnZ3JlZ2F0aW9uIGZyb206ICVzIHRvOiAlc1xuIiwKKwkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkgPT0gMSA/CisJCSAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCBhZ2dyX3RtcCA9PSAxID8gImVuYWJsZWQiIDoKKwkJICJkaXNhYmxlZCIpOwogCiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQsICh1bnNpZ25lZClhZ2dyX3RtcCk7CiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMgc3NpemVfdCBzaG93X2JvbmQoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZmYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7CisJaW50IGJvbmRfc3RhdHVzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ib25kaW5nX2VuYWJsZWQpOworCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAorCQkgICAgICAgYm9uZF9zdGF0dXMgPT0gMCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9ib25kKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCWludCBib25kaW5nX2VuYWJsZWRfdG1wID0gLTE7CisKKwlpZiAoKChjb3VudCA9PSAyKSAmJiAoYnVmZlswXSA9PSAnMScpKSB8fAorCSAgICAoc3RybmNtcChidWZmLCAiZW5hYmxlIiwgNikgPT0gMCkpCisJCWJvbmRpbmdfZW5hYmxlZF90bXAgPSAxOworCisJaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzAnKSkgfHwKKwkgICAgKHN0cm5jbXAoYnVmZiwgImRpc2FibGUiLCA3KSA9PSAwKSkKKwkJYm9uZGluZ19lbmFibGVkX3RtcCA9IDA7CisKKwlpZiAoYm9uZGluZ19lbmFibGVkX3RtcCA8IDApIHsKKwkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQorCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKKworCQliYXRfZXJyKG5ldF9kZXYsCisJCQkiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdib25kaW5nJyBzZXR0aW5nIHJlY2VpdmVkOiAiCisJCQkiJXNcbiIsIGJ1ZmYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ib25kaW5nX2VuYWJsZWQpID09IGJvbmRpbmdfZW5hYmxlZF90bXApCisJCXJldHVybiBjb3VudDsKKworCWJhdF9pbmZvKG5ldF9kZXYsICJDaGFuZ2luZyBib25kaW5nIGZyb206ICVzIHRvOiAlc1xuIiwKKwkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkKSA9PSAxID8KKwkJICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCSBib25kaW5nX2VuYWJsZWRfdG1wID09IDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCWF0b21pY19zZXQoJmJhdF9wcml2LT5ib25kaW5nX2VuYWJsZWQsICh1bnNpZ25lZClib25kaW5nX2VuYWJsZWRfdG1wKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfdmlzX21vZGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgIGNoYXIgKmJ1ZmYpCiB7CkBAIC0xMjMsMTAgKzE0MSw5IEBACiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7CiAJaW50IHZpc19tb2RlID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmLCAic3RhdHVzOiAlc1xuY29tbWFuZHM6IGNsaWVudCwgc2VydmVyLCAlZCwgJWRcbiIsCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAogCQkgICAgICAgdmlzX21vZGUgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSA/Ci0JCQkJCQkJImNsaWVudCIgOiAic2VydmVyIiwKLQkJICAgICAgIFZJU19UWVBFX1NFUlZFUl9TWU5DLCBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKTsKKwkJCQkJCQkiY2xpZW50IiA6ICJzZXJ2ZXIiKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfdmlzX21vZGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCkBAIC0xNDEsNyArMTU4LDggQEAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJnZhbCk7CiAKIAlpZiAoKChjb3VudCA9PSAyKSAmJiAoIXJldCkgJiYgKHZhbCA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImNsaWVudCIsIDYpID09IDApKQorCSAgICAoc3RybmNtcChidWZmLCAiY2xpZW50IiwgNikgPT0gMCkgfHwKKwkgICAgKHN0cm5jbXAoYnVmZiwgIm9mZiIsIDMpID09IDApKQogCQl2aXNfbW9kZV90bXAgPSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFOwogCiAJaWYgKCgoY291bnQgPT0gMikgJiYgKCFyZXQpICYmICh2YWwgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMpKSB8fApAQCAtMTUyLDE4ICsxNzAsMTkgQEAKIAkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQogCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKIAotCQlwcmludGsoS0VSTl9JTkZPICJiYXRtYW4tYWR2OkludmFsaWQgcGFyYW1ldGVyIGZvciAndmlzIG1vZGUnIHNldHRpbmcgb24gbWVzaCAlcyByZWNlaXZlZDogJXNcbiIsCi0JCSAgICAgICBuZXRfZGV2LT5uYW1lLCBidWZmKTsKKwkJYmF0X2luZm8obmV0X2RldiwKKwkJCSAiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICd2aXMgbW9kZScgc2V0dGluZyByZWNlaXZlZDogIgorCQkJICIlc1xuIiwgYnVmZik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKSA9PSB2aXNfbW9kZV90bXApCiAJCXJldHVybiBjb3VudDsKIAotCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6Q2hhbmdpbmcgdmlzIG1vZGUgZnJvbTogJXMgdG86ICVzIG9uIG1lc2g6ICVzXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKSA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFID8KLQkgICAgICAgImNsaWVudCIgOiAic2VydmVyIiwgdmlzX21vZGVfdG1wID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUgPwotCSAgICAgICAiY2xpZW50IiA6ICJzZXJ2ZXIiLCBuZXRfZGV2LT5uYW1lKTsKKwliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgdmlzIG1vZGUgZnJvbTogJXMgdG86ICVzXG4iLAorCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSkgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSA/CisJCSAiY2xpZW50IiA6ICJzZXJ2ZXIiLCB2aXNfbW9kZV90bXAgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSA/CisJCSAiY2xpZW50IiA6ICJzZXJ2ZXIiKTsKIAogCWF0b21pY19zZXQoJmJhdF9wcml2LT52aXNfbW9kZSwgKHVuc2lnbmVkKXZpc19tb2RlX3RtcCk7CiAJcmV0dXJuIGNvdW50OwpAQCAtMTc1LDcgKzE5NCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7CiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmLCAic3RhdHVzOiAlaVxuIiwKKwlyZXR1cm4gc3ByaW50ZihidWZmLCAiJWlcbiIsCiAJCSAgICAgICBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwpKTsKIH0KIApAQCAtMTkwLDkxICsyMDksODcgQEAKIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZmYsIDEwLCAmb3JpZ19pbnRlcnZhbF90bXApOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYmF0bWFuLWFkdjpJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ29yaWdfaW50ZXJ2YWwnIHNldHRpbmcgb24gbWVzaCAlcyByZWNlaXZlZDogJXNcbiIsCi0JCSAgICAgICBuZXRfZGV2LT5uYW1lLCBidWZmKTsKKwkJYmF0X2luZm8obmV0X2RldiwgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnb3JpZ19pbnRlcnZhbCcgIgorCQkJICJzZXR0aW5nIHJlY2VpdmVkOiAlc1xuIiwgYnVmZik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChvcmlnX2ludGVydmFsX3RtcCA8PSBKSVRURVIgKiAyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6TmV3IG9yaWdpbmF0b3IgaW50ZXJ2YWwgdG9vIHNtYWxsOiAlbGkgKG1pbjogJWkpXG4iLAotCQkgICAgICAgb3JpZ19pbnRlcnZhbF90bXAsIEpJVFRFUiAqIDIpOworCWlmIChvcmlnX2ludGVydmFsX3RtcCA8IEpJVFRFUiAqIDIpIHsKKwkJYmF0X2luZm8obmV0X2RldiwgIk5ldyBvcmlnaW5hdG9yIGludGVydmFsIHRvbyBzbWFsbDogJWxpICIKKwkJCSAiKG1pbjogJWkpXG4iLCBvcmlnX2ludGVydmFsX3RtcCwgSklUVEVSICogMik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwpID09IG9yaWdfaW50ZXJ2YWxfdG1wKQogCQlyZXR1cm4gY291bnQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJiYXRtYW4tYWR2OkNoYW5naW5nIG9yaWdpbmF0b3IgaW50ZXJ2YWwgZnJvbTogJWkgdG86ICVsaSBvbiBtZXNoOiAlc1xuIiwKLQkgICAgICAgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSwKLQkgICAgICAgb3JpZ19pbnRlcnZhbF90bXAsIG5ldF9kZXYtPm5hbWUpOworCWJhdF9pbmZvKG5ldF9kZXYsICJDaGFuZ2luZyBvcmlnaW5hdG9yIGludGVydmFsIGZyb206ICVpIHRvOiAlbGlcbiIsCisJCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwpLAorCQkgb3JpZ19pbnRlcnZhbF90bXApOwogCiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwsIG9yaWdfaW50ZXJ2YWxfdG1wKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBCQVRfQVRUUihhZ2dyZWdhdGVfb2dtLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19hZ2dyX29nbSwgc3RvcmVfYWdncl9vZ20pOworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCitzdGF0aWMgc3NpemVfdCBzaG93X2xvZ19sZXZlbChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmZikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKKwlpbnQgbG9nX2xldmVsID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpOworCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVkXG4iLCBsb2dfbGV2ZWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9sb2dfbGV2ZWwoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXVuc2lnbmVkIGxvbmcgbG9nX2xldmVsX3RtcDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmZiwgMTAsICZsb2dfbGV2ZWxfdG1wKTsKKwlpZiAocmV0KSB7CisJCWJhdF9pbmZvKG5ldF9kZXYsICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ2xvZ19sZXZlbCcgIgorCQkJICJzZXR0aW5nIHJlY2VpdmVkOiAlc1xuIiwgYnVmZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsb2dfbGV2ZWxfdG1wID4gMykgeworCQliYXRfaW5mbyhuZXRfZGV2LCAiTmV3IGxvZyBsZXZlbCB0b28gYmlnOiAlbGkgIgorCQkJICIobWF4OiAlaSlcbiIsIGxvZ19sZXZlbF90bXAsIDMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpID09IGxvZ19sZXZlbF90bXApCisJCXJldHVybiBjb3VudDsKKworCWF0b21pY19zZXQoJmJhdF9wcml2LT5sb2dfbGV2ZWwsICh1bnNpZ25lZClsb2dfbGV2ZWxfdG1wKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworc3RhdGljIEJBVF9BVFRSKGFnZ3JlZ2F0ZWRfb2dtcywgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfYWdncl9vZ21zLCBzdG9yZV9hZ2dyX29nbXMpOworc3RhdGljIEJBVF9BVFRSKGJvbmRpbmcsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2JvbmQsIHN0b3JlX2JvbmQpOwogc3RhdGljIEJBVF9BVFRSKHZpc19tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192aXNfbW9kZSwgc3RvcmVfdmlzX21vZGUpOwogc3RhdGljIEJBVF9BVFRSKG9yaWdfaW50ZXJ2YWwsIFNfSVJVR08gfCBTX0lXVVNSLAogCQlzaG93X29yaWdfaW50ZXJ2YWwsIHN0b3JlX29yaWdfaW50ZXJ2YWwpOworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCitzdGF0aWMgQkFUX0FUVFIobG9nX2xldmVsLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19sb2dfbGV2ZWwsIHN0b3JlX2xvZ19sZXZlbCk7CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBiYXRfYXR0cmlidXRlICptZXNoX2F0dHJzW10gPSB7Ci0JJmJhdF9hdHRyX2FnZ3JlZ2F0ZV9vZ20sCisJJmJhdF9hdHRyX2FnZ3JlZ2F0ZWRfb2dtcywKKwkmYmF0X2F0dHJfYm9uZGluZywKIAkmYmF0X2F0dHJfdmlzX21vZGUsCiAJJmJhdF9hdHRyX29yaWdfaW50ZXJ2YWwsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHRyYW5zdGFibGVfbG9jYWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JCQkJICBjaGFyICpidWZmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0KLQlyZXR1cm4gaG5hX2xvY2FsX2ZpbGxfYnVmZmVyX3RleHQobmV0X2RldiwgYnVmZiwgY291bnQsIG9mZik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRyYW5zdGFibGVfZ2xvYmFsX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCQkJCSAgY2hhciAqYnVmZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCi0JcmV0dXJuIGhuYV9nbG9iYWxfZmlsbF9idWZmZXJfdGV4dChuZXRfZGV2LCBidWZmLCBjb3VudCwgb2ZmKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgb3JpZ2luYXRvcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JCQkJICBjaGFyICpidWZmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0KLQlyZXR1cm4gb3JpZ19maWxsX2J1ZmZlcl90ZXh0KG5ldF9kZXYsIGJ1ZmYsIGNvdW50LCBvZmYpOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aXNfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQkgIGNoYXIgKmJ1ZmYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQotCXJldHVybiB2aXNfZmlsbF9idWZmZXJfdGV4dChuZXRfZGV2LCBidWZmLCBjb3VudCwgb2ZmKTsKLX0KLQotc3RhdGljIEJBVF9CSU5fQVRUUih0cmFuc3RhYmxlX2xvY2FsLCBTX0lSVUdPLCB0cmFuc3RhYmxlX2xvY2FsX3JlYWQsIE5VTEwpOwotc3RhdGljIEJBVF9CSU5fQVRUUih0cmFuc3RhYmxlX2dsb2JhbCwgU19JUlVHTywgdHJhbnN0YWJsZV9nbG9iYWxfcmVhZCwgTlVMTCk7Ci1zdGF0aWMgQkFUX0JJTl9BVFRSKG9yaWdpbmF0b3JzLCBTX0lSVUdPLCBvcmlnaW5hdG9yc19yZWFkLCBOVUxMKTsKLXN0YXRpYyBCQVRfQklOX0FUVFIodmlzX2RhdGEsIFNfSVJVR08sIHZpc19kYXRhX3JlYWQsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKm1lc2hfYmluX2F0dHJzW10gPSB7Ci0JJmJhdF9hdHRyX3RyYW5zdGFibGVfbG9jYWwsCi0JJmJhdF9hdHRyX3RyYW5zdGFibGVfZ2xvYmFsLAotCSZiYXRfYXR0cl9vcmlnaW5hdG9ycywKLQkmYmF0X2F0dHJfdmlzX2RhdGEsCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKKwkmYmF0X2F0dHJfbG9nX2xldmVsLAorI2VuZGlmCiAJTlVMTCwKIH07CiAKQEAgLTI4MywyMiArMjk4LDI0IEBACiAJc3RydWN0IGtvYmplY3QgKmJhdGlmX2tvYmplY3QgPSAmZGV2LT5kZXYua29iajsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqKmJhdF9hdHRyOwotCXN0cnVjdCBiaW5fYXR0cmlidXRlICoqYmluX2F0dHI7CiAJaW50IGVycjsKIAogCS8qIEZJWE1FOiBzaG91bGQgYmUgZG9uZSBpbiB0aGUgZ2VuZXJhbCBtZXNoIHNldHVwCiAJCSAgcm91dGluZSBhcyBzb29uIGFzIHdlIGhhdmUgaXQgKi8KIAlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCwgMSk7CisJYXRvbWljX3NldCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCwgMCk7CiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPnZpc19tb2RlLCBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKTsKIAlhdG9taWNfc2V0KCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCwgMTAwMCk7CisJYXRvbWljX3NldCgmYmF0X3ByaXYtPmxvZ19sZXZlbCwgMCk7CisKIAliYXRfcHJpdi0+cHJpbWFyeV9pZiA9IE5VTEw7CiAJYmF0X3ByaXYtPm51bV9pZmFjZXMgPSAwOwogCiAJYmF0X3ByaXYtPm1lc2hfb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZChTWVNGU19JRl9NRVNIX1NVQkRJUiwKIAkJCQkJCSAgICBiYXRpZl9rb2JqZWN0KTsKIAlpZiAoIWJhdF9wcml2LT5tZXNoX29iaikgewotCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6Q2FuJ3QgYWRkIHN5c2ZzIGRpcmVjdG9yeTogJXMvJXNcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIFNZU0ZTX0lGX01FU0hfU1VCRElSKTsKKwkJYmF0X2VycihkZXYsICJDYW4ndCBhZGQgc3lzZnMgZGlyZWN0b3J5OiAlcy8lc1xuIiwgZGV2LT5uYW1lLAorCQkJU1lTRlNfSUZfTUVTSF9TVUJESVIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTMwNiwyOCArMzIzLDE1IEBACiAJCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKGJhdF9wcml2LT5tZXNoX29iaiwKIAkJCQkJJigoKmJhdF9hdHRyKS0+YXR0cikpOwogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6Q2FuJ3QgYWRkIHN5c2ZzIGZpbGU6ICVzLyVzLyVzXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgU1lTRlNfSUZfTUVTSF9TVUJESVIsCi0JCQkgICAgICAgKCgqYmF0X2F0dHIpLT5hdHRyKS5uYW1lKTsKKwkJCWJhdF9lcnIoZGV2LCAiQ2FuJ3QgYWRkIHN5c2ZzIGZpbGU6ICVzLyVzLyVzXG4iLAorCQkJCWRldi0+bmFtZSwgU1lTRlNfSUZfTUVTSF9TVUJESVIsCisJCQkJKCgqYmF0X2F0dHIpLT5hdHRyKS5uYW1lKTsKIAkJCWdvdG8gcmVtX2F0dHI7CiAJCX0KIAl9CiAKLQlmb3IgKGJpbl9hdHRyID0gbWVzaF9iaW5fYXR0cnM7ICpiaW5fYXR0cjsgKytiaW5fYXR0cikgewotCQllcnIgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAoKmJpbl9hdHRyKSk7Ci0JCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjpDYW4ndCBhZGQgc3lzZnMgZmlsZTogJXMvJXMvJXNcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBTWVNGU19JRl9NRVNIX1NVQkRJUiwKLQkJCSAgICAgICAoKCpiaW5fYXR0ciktPmF0dHIpLm5hbWUpOwotCQkJZ290byByZW1fYmluX2F0dHI7Ci0JCX0KLQl9Ci0KIAlyZXR1cm4gMDsKIAotcmVtX2Jpbl9hdHRyOgotCWZvciAoYmluX2F0dHIgPSBtZXNoX2Jpbl9hdHRyczsgKmJpbl9hdHRyOyArK2Jpbl9hdHRyKQotCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAoKmJpbl9hdHRyKSk7CiByZW1fYXR0cjoKIAlmb3IgKGJhdF9hdHRyID0gbWVzaF9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQogCQlzeXNmc19yZW1vdmVfZmlsZShiYXRfcHJpdi0+bWVzaF9vYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKQEAgLTM0MiwxMCArMzQ2LDYgQEAKIHsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqKmJhdF9hdHRyOwotCXN0cnVjdCBiaW5fYXR0cmlidXRlICoqYmluX2F0dHI7Ci0KLQlmb3IgKGJpbl9hdHRyID0gbWVzaF9iaW5fYXR0cnM7ICpiaW5fYXR0cjsgKytiaW5fYXR0cikKLQkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKGJhdF9wcml2LT5tZXNoX29iaiwgKCpiaW5fYXR0cikpOwogCiAJZm9yIChiYXRfYXR0ciA9IG1lc2hfYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKIAkJc3lzZnNfcmVtb3ZlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7CkBAIC0zNjQsNyArMzY0LDcgQEAKIAlpZiAoIWJhdG1hbl9pZikKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmLCAic3RhdHVzOiAlc1xuY29tbWFuZHM6IG5vbmUsIGJhdDBcbiIsCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAogCQkgICAgICAgYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gSUZfTk9UX0lOX1VTRSA/CiAJCQkJCQkJIm5vbmUiIDogImJhdDAiKTsKIH0KQEAgLTM5MCw4ICszOTAsOCBAQAogCQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCiAJCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwogCi0JCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjpJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ21lc2hfaWZhY2UnIHNldHRpbmcgcmVjZWl2ZWQ6ICVzXG4iLAotCQkgICAgICAgYnVmZik7CisJCXByX2VycigiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdtZXNoX2lmYWNlJyBzZXR0aW5nIHJlY2VpdmVkOiAiCisJCSAgICAgICAiJXNcbiIsIGJ1ZmYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQzMywzNyArNDMzLDM3IEBACiAJfQogfQogCi1zdGF0aWMgSEFSRElGX0FUVFIobWVzaF9pZmFjZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgIHNob3dfbWVzaF9pZmFjZSwgc3RvcmVfbWVzaF9pZmFjZSk7Ci1zdGF0aWMgSEFSRElGX0FUVFIoaWZhY2Vfc3RhdHVzLCBTX0lSVUdPLCBzaG93X2lmYWNlX3N0YXR1cywgTlVMTCk7CitzdGF0aWMgQkFUX0FUVFIobWVzaF9pZmFjZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfbWVzaF9pZmFjZSwgc3RvcmVfbWVzaF9pZmFjZSk7CitzdGF0aWMgQkFUX0FUVFIoaWZhY2Vfc3RhdHVzLCBTX0lSVUdPLCBzaG93X2lmYWNlX3N0YXR1cywgTlVMTCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaGFyZGlmX2F0dHJpYnV0ZSAqYmF0bWFuX2F0dHJzW10gPSB7Ci0JJmhhcmRpZl9hdHRyX21lc2hfaWZhY2UsCi0JJmhhcmRpZl9hdHRyX2lmYWNlX3N0YXR1cywKK3N0YXRpYyBzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqYmF0bWFuX2F0dHJzW10gPSB7CisJJmJhdF9hdHRyX21lc2hfaWZhY2UsCisJJmJhdF9hdHRyX2lmYWNlX3N0YXR1cywKIAlOVUxMLAogfTsKIAogaW50IHN5c2ZzX2FkZF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBrb2JqZWN0ICpoYXJkaWZfa29iamVjdCA9ICZkZXYtPmRldi5rb2JqOwotCXN0cnVjdCBoYXJkaWZfYXR0cmlidXRlICoqaGFyZGlmX2F0dHI7CisJc3RydWN0IGJhdF9hdHRyaWJ1dGUgKipiYXRfYXR0cjsKIAlpbnQgZXJyOwogCiAJKmhhcmRpZl9vYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKFNZU0ZTX0lGX0JBVF9TVUJESVIsCiAJCQkJCQkgICAgaGFyZGlmX2tvYmplY3QpOwogCiAJaWYgKCEqaGFyZGlmX29iaikgewotCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6Q2FuJ3QgYWRkIHN5c2ZzIGRpcmVjdG9yeTogJXMvJXNcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIFNZU0ZTX0lGX0JBVF9TVUJESVIpOworCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBkaXJlY3Rvcnk6ICVzLyVzXG4iLCBkZXYtPm5hbWUsCisJCQlTWVNGU19JRl9CQVRfU1VCRElSKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JZm9yIChoYXJkaWZfYXR0ciA9IGJhdG1hbl9hdHRyczsgKmhhcmRpZl9hdHRyOyArK2hhcmRpZl9hdHRyKSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCpoYXJkaWZfb2JqLCAmKCgqaGFyZGlmX2F0dHIpLT5hdHRyKSk7CisJZm9yIChiYXRfYXR0ciA9IGJhdG1hbl9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKSB7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCpoYXJkaWZfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjpDYW4ndCBhZGQgc3lzZnMgZmlsZTogJXMvJXMvJXNcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBTWVNGU19JRl9CQVRfU1VCRElSLAotCQkJICAgICAgICgoKmhhcmRpZl9hdHRyKS0+YXR0cikubmFtZSk7CisJCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBmaWxlOiAlcy8lcy8lc1xuIiwKKwkJCQlkZXYtPm5hbWUsIFNZU0ZTX0lGX0JBVF9TVUJESVIsCisJCQkJKCgqYmF0X2F0dHIpLT5hdHRyKS5uYW1lKTsKIAkJCWdvdG8gcmVtX2F0dHI7CiAJCX0KIAl9CkBAIC00NzEsOCArNDcxLDggQEAKIAlyZXR1cm4gMDsKIAogcmVtX2F0dHI6Ci0JZm9yIChoYXJkaWZfYXR0ciA9IGJhdG1hbl9hdHRyczsgKmhhcmRpZl9hdHRyOyArK2hhcmRpZl9hdHRyKQotCQlzeXNmc19yZW1vdmVfZmlsZSgqaGFyZGlmX29iaiwgJigoKmhhcmRpZl9hdHRyKS0+YXR0cikpOworCWZvciAoYmF0X2F0dHIgPSBiYXRtYW5fYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoKmhhcmRpZl9vYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKIG91dDoKIAlyZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKaW5kZXggZTE4OTM0MS4uN2YxODZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKQEAgLTIwLDEwICsyMCwyMyBAQAogICovCiAKIAorI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU1lTRlNfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfCisKICNkZWZpbmUgU1lTRlNfSUZfTUVTSF9TVUJESVIgIm1lc2giCiAjZGVmaW5lIFNZU0ZTX0lGX0JBVF9TVUJESVIgImJhdG1hbl9hZHYiCiAKK3N0cnVjdCBiYXRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK307CisKIGludCBzeXNmc19hZGRfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBzeXNmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IHN5c2ZzX2FkZF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYwppbmRleCAyZmVmNmUzLi5kZDQxOTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMKQEAgLTI0LDEwICsyNCwxMCBAQAogCiAvKiByZXR1cm5zIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBnaXZlbiBzZXFfYml0cyBpbmRpY2F0ZXMgdHJ1ZQogICogYW5kIGN1cnJfc2Vxbm8gaXMgd2l0aGluIHJhbmdlIG9mIGxhc3Rfc2Vxbm8gKi8KLXVpbnQ4X3QgZ2V0X2JpdF9zdGF0dXMoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgdWludDE2X3QgbGFzdF9zZXFubywKLQkJICAgICAgIHVpbnQxNl90IGN1cnJfc2Vxbm8pCit1aW50OF90IGdldF9iaXRfc3RhdHVzKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIHVpbnQzMl90IGxhc3Rfc2Vxbm8sCisJCSAgICAgICB1aW50MzJfdCBjdXJyX3NlcW5vKQogewotCWludDE2X3QgZGlmZiwgd29yZF9vZmZzZXQsIHdvcmRfbnVtOworCWludDMyX3QgZGlmZiwgd29yZF9vZmZzZXQsIHdvcmRfbnVtOwogCiAJZGlmZiA9IGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vOwogCWlmIChkaWZmIDwgMCB8fCBkaWZmID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKSB7CkBAIC02Myw3ICs2Myw3IEBACiB9CiAKIC8qIHNoaWZ0IHRoZSBwYWNrZXQgYXJyYXkgYnkgbiBwbGFjZXMuICovCi12b2lkIGJpdF9zaGlmdChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCitzdGF0aWMgdm9pZCBiaXRfc2hpZnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKQogewogCWludDMyX3Qgd29yZF9vZmZzZXQsIHdvcmRfbnVtOwogCWludDMyX3QgaTsKQEAgLTEyNSw5ICsxMjUsMTIgQEAKICAqICAxIGlmIHRoZSB3aW5kb3cgd2FzIG1vdmVkIChlaXRoZXIgbmV3IG9yIHZlcnkgb2xkKQogICogIDAgaWYgdGhlIHdpbmRvdyB3YXMgbm90IG1vdmVkL3NoaWZ0ZWQuCiAgKi8KLWNoYXIgYml0X2dldF9wYWNrZXQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MTZfdCBzZXFfbnVtX2RpZmYsCitjaGFyIGJpdF9nZXRfcGFja2V0KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDMyX3Qgc2VxX251bV9kaWZmLAogCQkgICAgaW50OF90IHNldF9tYXJrKQogeworCS8qIEZJWE1FOiBlYWNoIG9yaWdfbm9kZS0+YmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOworCiAJLyogc2VxdWVuY2UgbnVtYmVyIGlzIHNsaWdodGx5IG9sZGVyLiBXZSBhbHJlYWR5IGdvdCBhIHNlcXVlbmNlIG51bWJlcgogCSAqIGhpZ2hlciB0aGFuIHRoaXMgb25lLCBzbyB3ZSBqdXN0IG1hcmsgaXQuICovCiAKQEAgLTE1Miw3ICsxNTUsNyBAQAogCiAJaWYgKChzZXFfbnVtX2RpZmYgPj0gVFFfTE9DQUxfV0lORE9XX1NJWkUpCiAJCXx8IChzZXFfbnVtX2RpZmYgPCBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLAorCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkJIldlIG1pc3NlZCBhIGxvdCBvZiBwYWNrZXRzICglaSkgIVxuIiwKIAkJCXNlcV9udW1fZGlmZiAtIDEpOwogCQliaXRfcmVzZXRfd2luZG93KHNlcV9iaXRzKTsKQEAgLTE2OSw3ICsxNzIsNyBAQAogCWlmICgoc2VxX251bV9kaWZmIDw9IC1UUV9MT0NBTF9XSU5ET1dfU0laRSkKIAkJfHwgKHNlcV9udW1fZGlmZiA+PSBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKIAotCQliYXRfZGJnKERCR19CQVRNQU4sCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkiT3RoZXIgaG9zdCBwcm9iYWJseSByZXN0YXJ0ZWQhXG4iKTsKIAogCQliaXRfcmVzZXRfd2luZG93KHNlcV9iaXRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5oCmluZGV4IDc2YWQyNGMuLjAxODk3ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaApAQCAtMTksNiArMTksOCBAQAogICoKICAqLwogCisjaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9CSVRBUlJBWV9IXworI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8KIAogLyogeW91IHNob3VsZCBjaG9vc2Ugc29tZXRoaW5nIGJpZywgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FzdGUgY3B1ICovCiAjZGVmaW5lIFRZUEVfT0ZfV09SRCB1bnNpZ25lZCBsb25nCkBAIC0yNiwyMCArMjgsMTkgQEAKIAogLyogcmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgZ2l2ZW4gc2VxX2JpdHMgaW5kaWNhdGVzIHRydWUKICAqIGFuZCBjdXJyX3NlcW5vIGlzIHdpdGhpbiByYW5nZSBvZiBsYXN0X3NlcW5vICovCi11aW50OF90IGdldF9iaXRfc3RhdHVzKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIHVpbnQxNl90IGxhc3Rfc2Vxbm8sCi0JCQkJCSAgIHVpbnQxNl90IGN1cnJfc2Vxbm8pOwordWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MzJfdCBsYXN0X3NlcW5vLAorCQkJCQkgICB1aW50MzJfdCBjdXJyX3NlcW5vKTsKIAogLyogdHVybiBjb3JyZXNwb25kaW5nIGJpdCBvbiwgc28gd2UgY2FuIHJlbWVtYmVyIHRoYXQgd2UgZ290IHRoZSBwYWNrZXQgKi8KIHZvaWQgYml0X21hcmsoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKTsKIAotLyogc2hpZnQgdGhlIHBhY2tldCBhcnJheSBieSBuIHBsYWNlcy4gKi8KLXZvaWQgYml0X3NoaWZ0KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDMyX3Qgbik7Ci0KIAogLyogcmVjZWl2ZSBhbmQgcHJvY2VzcyBvbmUgcGFja2V0LCByZXR1cm5zIDEgaWYgcmVjZWl2ZWQgc2VxX251bSBpcyBjb25zaWRlcmVkCiAgKiBuZXcsIDAgaWYgb2xkICAqLwotY2hhciBiaXRfZ2V0X3BhY2tldChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQxNl90IHNlcV9udW1fZGlmZiwKK2NoYXIgYml0X2dldF9wYWNrZXQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBzZXFfbnVtX2RpZmYsCiAJCQkJCWludDhfdCBzZXRfbWFyayk7CiAKIC8qIGNvdW50IHRoZSBoYW1taW5nIHdlaWdodCwgaG93IG1hbnkgZ29vZCBwYWNrZXRzIGRpZCB3ZSByZWNlaXZlPyAqLwogaW50ICBiaXRfcGFja2V0X2NvdW50KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMpOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0JJVEFSUkFZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjIwNGI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqYmF0bWFuX2NsYXNzOwotCi1zdGF0aWMgaW50IE1ham9yOwkvKiBNYWpvciBudW1iZXIgYXNzaWduZWQgdG8gb3VyIGRldmljZSBkcml2ZXIgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wcyA9IHsKLQkub3BlbiA9IGJhdF9kZXZpY2Vfb3BlbiwKLQkucmVsZWFzZSA9IGJhdF9kZXZpY2VfcmVsZWFzZSwKLQkucmVhZCA9IGJhdF9kZXZpY2VfcmVhZCwKLQkud3JpdGUgPSBiYXRfZGV2aWNlX3dyaXRlLAotCS5wb2xsID0gYmF0X2RldmljZV9wb2xsLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50X2hhc2hbMjU2XTsKLQotdm9pZCBiYXRfZGV2aWNlX2luaXQodm9pZCkKLXsKLQltZW1zZXQoZGV2aWNlX2NsaWVudF9oYXNoLCAwLCBzaXplb2YoZGV2aWNlX2NsaWVudF9oYXNoKSk7Ci19Ci0KLWludCBiYXRfZGV2aWNlX3NldHVwKHZvaWQpCi17Ci0JaW50IHRtcF9tYWpvcjsKLQotCWlmIChNYWpvcikKLQkJcmV0dXJuIDE7Ci0KLQkvKiByZWdpc3RlciBvdXIgZGV2aWNlIC0ga2VybmVsIGFzc2lnbnMgYSBmcmVlIG1ham9yIG51bWJlciAqLwotCXRtcF9tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBEUklWRVJfREVWSUNFLCAmZm9wcyk7Ci0JaWYgKHRtcF9tYWpvciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiIKLQkJICAgICAgICJSZWdpc3RlcmluZyB0aGUgY2hhcmFjdGVyIGRldmljZSBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCSAgdG1wX21ham9yKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYmF0bWFuX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYmF0bWFuLWFkdiIpOwotCi0JaWYgKElTX0VSUihiYXRtYW5fY2xhc3MpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjoiCi0JCSAgICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIGNsYXNzICdiYXRtYW4tYWR2J1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWRldmljZV9jcmVhdGUoYmF0bWFuX2NsYXNzLCBOVUxMLCBNS0RFVih0bXBfbWFqb3IsIDApLCBOVUxMLAotCQkgICAgICAiYmF0bWFuLWFkdiIpOwotCi0JTWFqb3IgPSB0bXBfbWFqb3I7Ci0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgYmF0X2RldmljZV9kZXN0cm95KHZvaWQpCi17Ci0JaWYgKCFNYWpvcikKLQkJcmV0dXJuOwotCi0JZGV2aWNlX2Rlc3Ryb3koYmF0bWFuX2NsYXNzLCBNS0RFVihNYWpvciwgMCkpOwotCWNsYXNzX2Rlc3Ryb3koYmF0bWFuX2NsYXNzKTsKLQotCS8qIFVucmVnaXN0ZXIgdGhlIGRldmljZSAqLwotCXVucmVnaXN0ZXJfY2hyZGV2KE1ham9yLCBEUklWRVJfREVWSUNFKTsKLQotCU1ham9yID0gMDsKLX0KLQotaW50IGJhdF9kZXZpY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudDsKLQotCWRldmljZV9jbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2aWNlX2NsaWVudCksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkZXZpY2VfY2xpZW50KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZV9jbGllbnRfaGFzaCk7IGkrKykgewotCQlpZiAoIWRldmljZV9jbGllbnRfaGFzaFtpXSkgewotCQkJZGV2aWNlX2NsaWVudF9oYXNoW2ldID0gZGV2aWNlX2NsaWVudDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGkgPT0gQVJSQVlfU0laRShkZXZpY2VfY2xpZW50X2hhc2gpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjoiCi0JCSAgICAgICAiRXJyb3IgLSBjYW4ndCBhZGQgYW5vdGhlciBwYWNrZXQgY2xpZW50OiAiCi0JCSAgICAgICAibWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyByZWFjaGVkXG4iKTsKLQkJa2ZyZWUoZGV2aWNlX2NsaWVudCk7Ci0JCXJldHVybiAtRVhGVUxMOwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZkZXZpY2VfY2xpZW50LT5xdWV1ZV9saXN0KTsKLQlkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4gPSAwOwotCWRldmljZV9jbGllbnQtPmluZGV4ID0gaTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2aWNlX2NsaWVudC0+bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlX2NsaWVudC0+cXVldWVfd2FpdCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZpY2VfY2xpZW50OwotCi0JaW5jX21vZHVsZV9jb3VudCgpOwotCXJldHVybiAwOwotfQotCi1pbnQgYmF0X2RldmljZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KLQkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZXZpY2VfcGFja2V0ICpkZXZpY2VfcGFja2V0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfcG9zLCAqbGlzdF9wb3NfdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JLyogZm9yIGFsbCBwYWNrZXRzIGluIHRoZSBxdWV1ZSAuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QpIHsKLQkJZGV2aWNlX3BhY2tldCA9IGxpc3RfZW50cnkobGlzdF9wb3MsCi0JCQkJCSAgIHN0cnVjdCBkZXZpY2VfcGFja2V0LCBsaXN0KTsKLQotCQlsaXN0X2RlbChsaXN0X3Bvcyk7Ci0JCWtmcmVlKGRldmljZV9wYWNrZXQpOwotCX0KLQotCWRldmljZV9jbGllbnRfaGFzaFtkZXZpY2VfY2xpZW50LT5pbmRleF0gPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCWtmcmVlKGRldmljZV9jbGllbnQpOwotCWRlY19tb2R1bGVfY291bnQoKTsKLQotCXJldHVybiAwOwotfQotCi1zc2l6ZV90IGJhdF9kZXZpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KLQkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZXZpY2VfcGFja2V0ICpkZXZpY2VfcGFja2V0OwotCWludCBlcnJvcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgKGRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA9PSAwKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlpZiAoKCFidWYpIHx8IChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldmljZV9jbGllbnQtPnF1ZXVlX3dhaXQsCi0JCQkJCSBkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4pOwotCi0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JZGV2aWNlX3BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX3BhY2tldCwgbGlzdCk7Ci0JbGlzdF9kZWwoJmRldmljZV9wYWNrZXQtPmxpc3QpOwotCWRldmljZV9jbGllbnQtPnF1ZXVlX2xlbi0tOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JZXJyb3IgPSBfX2NvcHlfdG9fdXNlcihidWYsICZkZXZpY2VfcGFja2V0LT5pY21wX3BhY2tldCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSk7Ci0KLQlrZnJlZShkZXZpY2VfcGFja2V0KTsKLQotCWlmIChlcnJvcikKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCk7Ci19Ci0KLXNzaXplX3QgYmF0X2RldmljZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCi0JCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmYpCi17Ci0Jc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQgPQotCQkoc3RydWN0IGRldmljZV9jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGljbXBfcGFja2V0IGljbXBfcGFja2V0OwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgImJhdG1hbi1hZHY6IgotCQkJIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogIgotCQkJImludmFsaWQgcGFja2V0IHNpemVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZiwgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChfX2NvcHlfZnJvbV91c2VyKCZpY21wX3BhY2tldCwgYnVmZiwgc2l6ZW9mKGljbXBfcGFja2V0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGljbXBfcGFja2V0LnBhY2tldF90eXBlICE9IEJBVF9JQ01QKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgImJhdG1hbi1hZHY6IgotCQkJIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogIgotCQkJImdvdCBib2d1cyBwYWNrZXQgdHlwZSAoZXhwZWN0ZWQ6IEJBVF9JQ01QKVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChpY21wX3BhY2tldC5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAiYmF0bWFuLWFkdjoiCi0JCQkiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiAiCi0JCQkiZ290IGJvZ3VzIG1lc3NhZ2UgdHlwZSAoZXhwZWN0ZWQ6IEVDSE9fUkVRVUVTVClcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY21wX3BhY2tldC51aWQgPSBkZXZpY2VfY2xpZW50LT5pbmRleDsKLQotCWlmIChpY21wX3BhY2tldC52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7Ci0JCWljbXBfcGFja2V0Lm1zZ190eXBlID0gUEFSQU1FVEVSX1BST0JMRU07Ci0JCWljbXBfcGFja2V0LnR0bCA9IENPTVBBVF9WRVJTSU9OOwotCQliYXRfZGV2aWNlX2FkZF9wYWNrZXQoZGV2aWNlX2NsaWVudCwgJmljbXBfcGFja2V0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9BQ1RJVkUpCi0JCWdvdG8gZHN0X3VucmVhY2g7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC5kc3QpKTsKLQotCWlmICghb3JpZ19ub2RlKQotCQlnb3RvIHVubG9jazsKLQotCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCi0JCWdvdG8gdW5sb2NrOwotCi0JYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nOwotCW1lbWNweShkc3RhZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCWlmICghYmF0bWFuX2lmKQotCQlnb3RvIGRzdF91bnJlYWNoOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJZ290byBkc3RfdW5yZWFjaDsKLQotCW1lbWNweShpY21wX3BhY2tldC5vcmlnLAotCSAgICAgICBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLAotCSAgICAgICBFVEhfQUxFTik7Ci0KLQlzZW5kX3Jhd19wYWNrZXQoKHVuc2lnbmVkIGNoYXIgKikmaWNtcF9wYWNrZXQsCi0JCQlzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSwKLQkJCWJhdG1hbl9pZiwgZHN0YWRkcik7Ci0KLQlnb3RvIG91dDsKLQotdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci1kc3RfdW5yZWFjaDoKLQlpY21wX3BhY2tldC5tc2dfdHlwZSA9IERFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFOwotCWJhdF9kZXZpY2VfYWRkX3BhY2tldChkZXZpY2VfY2xpZW50LCAmaWNtcF9wYWNrZXQpOwotb3V0OgotCXJldHVybiBsZW47Ci19Ci0KLXVuc2lnbmVkIGludCBiYXRfZGV2aWNlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0Jc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQgPQotCQkoc3RydWN0IGRldmljZV9jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJmRldmljZV9jbGllbnQtPnF1ZXVlX3dhaXQsIHdhaXQpOwotCi0JaWYgKGRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA+IDApCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYmF0X2RldmljZV9hZGRfcGFja2V0KHN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50LAotCQkJICAgc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX3BhY2tldCAqZGV2aWNlX3BhY2tldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZGV2aWNlX3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWRldmljZV9wYWNrZXQpCi0JCXJldHVybjsKLQotCUlOSVRfTElTVF9IRUFEKCZkZXZpY2VfcGFja2V0LT5saXN0KTsKLQltZW1jcHkoJmRldmljZV9wYWNrZXQtPmljbXBfcGFja2V0LCBpY21wX3BhY2tldCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRoZSBkZXZpY2VfY2xpZW50IGNvdWxkIGhhdmUgYmVlbgotCSAqIGRlbGV0ZWQgKi8KLQlpZiAoIWRldmljZV9jbGllbnRfaGFzaFtpY21wX3BhY2tldC0+dWlkXSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0JCWtmcmVlKGRldmljZV9wYWNrZXQpOwotCQlyZXR1cm47Ci0JfQotCi0JbGlzdF9hZGRfdGFpbCgmZGV2aWNlX3BhY2tldC0+bGlzdCwgJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QpOwotCWRldmljZV9jbGllbnQtPnF1ZXVlX2xlbisrOwotCi0JaWYgKGRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA+IDEwMCkgewotCQlkZXZpY2VfcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCwKLQkJCQkJCSBzdHJ1Y3QgZGV2aWNlX3BhY2tldCwgbGlzdCk7Ci0KLQkJbGlzdF9kZWwoJmRldmljZV9wYWNrZXQtPmxpc3QpOwotCQlrZnJlZShkZXZpY2VfcGFja2V0KTsKLQkJZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuLS07Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cCgmZGV2aWNlX2NsaWVudC0+cXVldWVfd2FpdCk7Ci19Ci0KLXZvaWQgYmF0X2RldmljZV9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0KQotewotCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpoYXNoID0gZGV2aWNlX2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdOwotCi0JaWYgKGhhc2gpCi0JCWJhdF9kZXZpY2VfYWRkX3BhY2tldChoYXNoLCBpY21wX3BhY2tldCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE0YjM3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi12b2lkIGJhdF9kZXZpY2VfaW5pdCh2b2lkKTsKLWludCBiYXRfZGV2aWNlX3NldHVwKHZvaWQpOwotdm9pZCBiYXRfZGV2aWNlX2Rlc3Ryb3kodm9pZCk7Ci1pbnQgYmF0X2RldmljZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLWludCBiYXRfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3NpemVfdCBiYXRfZGV2aWNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCWxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGJhdF9kZXZpY2Vfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAotCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2ZmKTsKLXVuc2lnbmVkIGludCBiYXRfZGV2aWNlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwotdm9pZCBiYXRfZGV2aWNlX2FkZF9wYWNrZXQoc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQsCi0JCQkgICBzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0KTsKLXZvaWQgYmF0X2RldmljZV9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCmluZGV4IDdhNTgyZTguLjkyYzIxNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgImhhc2guaCIKIAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KIAogI2RlZmluZSBNSU4oeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKIApAQCAtNzEsNyArNzIsNyBAQAogI2VuZGlmCiAKIAkvKiBEZXZpY2UgaXMgYmVpbmcgYnJpZGdlZCAqLwotCS8qIGlmIChuZXRfZGV2LT5icl9wb3J0ICE9IE5VTEwpCisJLyogaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpCiAJCXJldHVybiAwOyAqLwogCiAJcmV0dXJuIDE7CkBAIC0xMDgsNyArMTA5LDcgQEAKIAlzZXRfbWFpbl9pZl9hZGRyKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpOwogCiAJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKLQliYXRtYW5fcGFja2V0LT5mbGFncyA9IDA7CisJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSBQUklNQVJJRVNfRklSU1RfSE9QOwogCWJhdG1hbl9wYWNrZXQtPnR0bCA9IFRUTDsKIAogCS8qKioKQEAgLTE0OSwxMiArMTUwLDEwIEBACiAJCWlmICghY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIGFkZHIpKQogCQkJY29udGludWU7CiAKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmF0bWFuLWFkdjoiCi0JCSAgICAiVGhlIG5ld2x5IGFkZGVkIG1hYyBhZGRyZXNzICglcE0pIGFscmVhZHkgZXhpc3RzIG9uOiAlc1xuIiwKLQkJICAgIGFkZHIsIGJhdG1hbl9pZi0+ZGV2KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmF0bWFuLWFkdjoiCi0JCSAgICAiSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8ga2VlcCBtYWMgYWRkcmVzc2VzIHVuaXF1ZSIKLQkJICAgICJ0byBhdm9pZCBwcm9ibGVtcyFcbiIpOworCQlwcl93YXJuaW5nKCJUaGUgbmV3bHkgYWRkZWQgbWFjIGFkZHJlc3MgKCVwTSkgYWxyZWFkeSBleGlzdHMgIgorCQkJICAgIm9uOiAlc1xuIiwgYWRkciwgYmF0bWFuX2lmLT5kZXYpOworCQlwcl93YXJuaW5nKCJJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBrZWVwIG1hYyBhZGRyZXNzZXMgIgorCQkJICAgInVuaXF1ZSB0byBhdm9pZCBwcm9ibGVtcyFcbiIpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTE4OCw3ICsxODcsOCBAQAogCQlzb2Z0X2RldmljZS0+bXR1ID0gbWluX210dTsKIH0KIAotc3RhdGljIHZvaWQgaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorc3RhdGljIHZvaWQgaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQkgICAgICBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAogCQkJCSAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKIHsKIAlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfSU5BQ1RJVkUpCkBAIC0yMDYsOCArMjA2LDcgQEAKIAlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQogCQlzZXRfcHJpbWFyeV9pZihiYXRfcHJpdiwgYmF0bWFuX2lmKTsKIAotCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6SW50ZXJmYWNlIGFjdGl2YXRlZDogJXNcbiIsCi0JICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKwliYXRfaW5mbyhuZXRfZGV2LCAiSW50ZXJmYWNlIGFjdGl2YXRlZDogJXNcbiIsIGJhdG1hbl9pZi0+ZGV2KTsKIAogCWlmIChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSA9PSBNT0RVTEVfSU5BQ1RJVkUpCiAJCWFjdGl2YXRlX21vZHVsZSgpOwpAQCAtMjE2LDcgKzIxNSw4IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBoYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQorc3RhdGljIHZvaWQgaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCiB7CiAJaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpICYmCiAJICAgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX1RPX0JFX0FDVElWQVRFRCkpCkBAIC0yMjYsOCArMjI2LDcgQEAKIAogCWJhdG1hbl9pZi0+aWZfc3RhdHVzID0gSUZfSU5BQ1RJVkU7CiAKLQlwcmludGsoS0VSTl9JTkZPICJiYXRtYW4tYWR2OkludGVyZmFjZSBkZWFjdGl2YXRlZDogJXNcbiIsCi0JICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKwliYXRfaW5mbyhuZXRfZGV2LCAiSW50ZXJmYWNlIGRlYWN0aXZhdGVkOiAlc1xuIiwgYmF0bWFuX2lmLT5kZXYpOwogCiAJdXBkYXRlX21pbl9tdHUoKTsKIH0KQEAgLTI0NSw5ICsyNDQsOCBAQAogCWJhdG1hbl9pZi0+cGFja2V0X2J1ZmYgPSBrbWFsbG9jKGJhdG1hbl9pZi0+cGFja2V0X2xlbiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoIWJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiIKLQkJICAgICAgICJDYW4ndCBhZGQgaW50ZXJmYWNlIHBhY2tldCAoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLAotCQkgICAgICAgYmF0bWFuX2lmLT5kZXYpOworCQliYXRfZXJyKHNvZnRfZGV2aWNlLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSBwYWNrZXQgKCVzKTogIgorCQkJIm91dCBvZiBtZW1vcnlcbiIsIGJhdG1hbl9pZi0+ZGV2KTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0yNjUsMTUgKzI2MywxNCBAQAogCW9yaWdfaGFzaF9hZGRfaWYoYmF0bWFuX2lmLCBiYXRfcHJpdi0+bnVtX2lmYWNlcyk7CiAKIAlhdG9taWNfc2V0KCZiYXRtYW5faWYtPnNlcW5vLCAxKTsKLQlwcmludGsoS0VSTl9JTkZPICJiYXRtYW4tYWR2OkFkZGluZyBpbnRlcmZhY2U6ICVzXG4iLCBiYXRtYW5faWYtPmRldik7CisJYmF0X2luZm8oc29mdF9kZXZpY2UsICJBZGRpbmcgaW50ZXJmYWNlOiAlc1xuIiwgYmF0bWFuX2lmLT5kZXYpOwogCiAJaWYgKGhhcmRpZl9pc19pZmFjZV91cChiYXRtYW5faWYpKQotCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKGJhdF9wcml2LCBiYXRtYW5faWYpOworCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKHNvZnRfZGV2aWNlLCBiYXRfcHJpdiwgYmF0bWFuX2lmKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiYmF0bWFuLWFkdjoiCi0JCSAgICAgICAiTm90IHVzaW5nIGludGVyZmFjZSAlcyAiCi0JCSAgICAgICAiKHJldHJ5aW5nIGxhdGVyKTogaW50ZXJmYWNlIG5vdCBhY3RpdmVcbiIsCi0JCSAgICAgICBiYXRtYW5faWYtPmRldik7CisJCWJhdF9lcnIoc29mdF9kZXZpY2UsICJOb3QgdXNpbmcgaW50ZXJmYWNlICVzICIKKwkJCSIocmV0cnlpbmcgbGF0ZXIpOiBpbnRlcmZhY2Ugbm90IGFjdGl2ZVxuIiwKKwkJCWJhdG1hbl9pZi0+ZGV2KTsKIAogCS8qIGJlZ2luIHNjaGVkdWxpbmcgb3JpZ2luYXRvciBtZXNzYWdlcyBvbiB0aGF0IGludGVyZmFjZSAqLwogCXNjaGVkdWxlX293bl9wYWNrZXQoYmF0bWFuX2lmKTsKQEAgLTI5MSwxMiArMjg4LDEyIEBACiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAogCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9BQ1RJVkUpCi0JCWhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOworCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2Uoc29mdF9kZXZpY2UsIGJhdG1hbl9pZik7CiAKIAlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfSU5BQ1RJVkUpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6UmVtb3ZpbmcgaW50ZXJmYWNlOiAlc1xuIiwgYmF0bWFuX2lmLT5kZXYpOworCWJhdF9pbmZvKHNvZnRfZGV2aWNlLCAiUmVtb3ZpbmcgaW50ZXJmYWNlOiAlc1xuIiwgYmF0bWFuX2lmLT5kZXYpOwogCWJhdF9wcml2LT5udW1faWZhY2VzLS07CiAJb3JpZ19oYXNoX2RlbF9pZihiYXRtYW5faWYsIGJhdF9wcml2LT5udW1faWZhY2VzKTsKIApAQCAtMzIzLDggKzMyMCw3IEBACiAKIAliYXRtYW5faWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmF0bWFuX2lmKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFiYXRtYW5faWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiIKLQkJICAgICAgICJDYW4ndCBhZGQgaW50ZXJmYWNlICglcyk6IG91dCBvZiBtZW1vcnlcbiIsCisJCXByX2VycigiQ2FuJ3QgYWRkIGludGVyZmFjZSAoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLAogCQkgICAgICAgbmV0X2Rldi0+bmFtZSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQwNywxMSArNDAzLDExIEBACiAJY2FzZSBORVRERVZfUkVHSVNURVI6CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX1VQOgotCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKGJhdF9wcml2LCBiYXRtYW5faWYpOworCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKHNvZnRfZGV2aWNlLCBiYXRfcHJpdiwgYmF0bWFuX2lmKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKIAljYXNlIE5FVERFVl9ET1dOOgotCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKwkJaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHNvZnRfZGV2aWNlLCBiYXRtYW5faWYpOwogCQlicmVhazsKIAljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgogCQloYXJkaWZfcmVtb3ZlX2ludGVyZmFjZShiYXRtYW5faWYpOwpAQCAtNDMyLDE0ICs0MjgsMjIgQEAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKK3N0YXRpYyBpbnQgYmF0bWFuX3NrYl9yZWN2X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKIC8qIHJlY2VpdmUgYSBwYWNrZXQgd2l0aCB0aGUgYmF0bWFuIGV0aGVydHlwZSBjb21pbmcgb24gYSBoYXJkCiAgKiBpbnRlcmZhY2UgKi8KIGludCBiYXRtYW5fc2tiX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCiB7CisJLyogRklYTUU6IGVhY2ggb3JpZ19ub2RlLT5iYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CiAJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CiAJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKIAlpbnQgcmV0OwogCiAJc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7CkBAIC00NTEsNiArNDU1LDEzIEBACiAJaWYgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9BQ1RJVkUpCiAJCWdvdG8gZXJyX2ZyZWU7CiAKKwkvKiBpZiBuZXRmaWx0ZXIvZWJ0YWJsZXMgd2FudHMgdG8gYmxvY2sgaW5jb21pbmcgYmF0bWFuCisJICogcGFja2V0cyB0aGVuIGdpdmUgdGhlbSBhIGNoYW5jZSB0byBkbyBzbyBoZXJlICovCisJcmV0ID0gTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0xPQ0FMX0lOLCBza2IsIGRldiwgTlVMTCwKKwkJICAgICAgYmF0bWFuX3NrYl9yZWN2X2ZpbmlzaCk7CisJaWYgKHJldCAhPSAxKQorCQlnb3RvIGVycl9vdXQ7CisKIAkvKiBwYWNrZXQgc2hvdWxkIGhvbGQgYXQgbGVhc3QgdHlwZSBhbmQgdmVyc2lvbiAqLwogCWlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpIDwgMikpCiAJCWdvdG8gZXJyX2ZyZWU7CkBAIC00NjgsNyArNDc5LDcgQEAKIAlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQogCQlnb3RvIGVycl9mcmVlOwogCi0Jc3RhdHMgPSAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKilkZXZfZ2V0X3N0YXRzKHNrYi0+ZGV2KTsKKwlzdGF0cyA9IChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKWRldl9nZXRfc3RhdHMoc2tiLT5kZXYsICZ0ZW1wKTsKIAlpZiAoc3RhdHMpIHsKIAkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKIAkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtNDc3LDcgKzQ4OCw3IEBACiAJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKXNrYi0+ZGF0YTsKIAogCWlmIChiYXRtYW5fcGFja2V0LT52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJCSJEcm9wIHBhY2tldDogaW5jb21wYXRpYmxlIGJhdG1hbiB2ZXJzaW9uICglaSlcbiIsCiAJCQliYXRtYW5fcGFja2V0LT52ZXJzaW9uKTsKIAkJZ290byBlcnJfZnJlZTsKQEAgLTQ5OSw3ICs1MTAsNyBAQAogCiAJCS8qIHVuaWNhc3QgcGFja2V0ICovCiAJY2FzZSBCQVRfVU5JQ0FTVDoKLQkJcmV0ID0gcmVjdl91bmljYXN0X3BhY2tldChza2IpOworCQlyZXQgPSByZWN2X3VuaWNhc3RfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKIAkJYnJlYWs7CiAKIAkJLyogYnJvYWRjYXN0IHBhY2tldCAqLwpAQCAtNTMwLDcgKzU0MSw2IEBACiAJcmV0dXJuIE5FVF9SWF9EUk9QOwogfQogCi0KIHN0cnVjdCBub3RpZmllcl9ibG9jayBoYXJkX2lmX25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gaGFyZF9pZl9ldmVudCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaAppbmRleCAxZTVmYzNlLi5kNTY0MGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKQEAgLTE5LDYgKzE5LDkgQEAKICAqCiAgKi8KIAorI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfSEFSRF9JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0hBUkRfSU5URVJGQUNFX0hfCisKICNkZWZpbmUgSUZfTk9UX0lOX1VTRSAwCiAjZGVmaW5lIElGX1RPX0JFX1JFTU9WRUQgMQogI2RlZmluZSBJRl9JTkFDVElWRSAyCkBAIC0zOCwzICs0MSw1IEBACiAJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KTsKIGludCBoYXJkaWZfbWluX210dSh2b2lkKTsKIHZvaWQgdXBkYXRlX21pbl9tdHUodm9pZCk7CisKKyNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSEFSRF9JTlRFUkZBQ0VfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guYwppbmRleCBkNGE0YWRjLi4xMjg2ZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiaGFzaC5oIgogCiAvKiBjbGVhcnMgdGhlIGhhc2ggKi8KLXZvaWQgaGFzaF9pbml0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKK3N0YXRpYyB2b2lkIGhhc2hfaW5pdChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaAppbmRleCBlYTZkMjFlLi5jNDgzZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oCkBAIC0xOSw4ICsxOSw5IEBACiAgKgogICovCiAKLSNpZm5kZWYgX0JBVE1BTl9IQVNIX0gKLSNkZWZpbmUgX0JBVE1BTl9IQVNIX0gKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX0hBU0hfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0hBU0hfSF8KKwogI2RlZmluZSBIQVNISVQobmFtZSkgc3RydWN0IGhhc2hfaXRfdCBuYW1lID0geyBcCiAJCS5pbmRleCA9IC0xLCAuYnVja2V0ID0gTlVMTCwgXAogCQkucHJldl9idWNrZXQgPSBOVUxMLCBcCkBAIC01Niw5ICs1Nyw2IEBACiAJCQkJICAgICAqIGFyZ3VtZW50IGFuZCB0aGUgc2l6ZSB0aGUgc2Vjb25kICovCiB9OwogCi0vKiBjbGVhcnMgdGhlIGhhc2ggKi8KLXZvaWQgaGFzaF9pbml0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7Ci0KIC8qIGFsbG9jYXRlcyBhbmQgY2xlYXJzIHRoZSBoYXNoICovCiBzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfbmV3KGludCBzaXplLCBoYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmUsCiAJCQkgICAgIGhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2UpOwpAQCAtOTksNiArOTcsNCBAQAogc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKIAkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyX2luKTsKIAotLyogcHJpbnQgdGhlIGhhc2ggdGFibGUgZm9yIGRlYnVnZ2luZyAqLwotdm9pZCBoYXNoX2RlYnVnKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSEFTSF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzZDMyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiaWNtcF9zb2NrZXQuaCIKKyNpbmNsdWRlICJzZW5kLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKworCitzdGF0aWMgc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnRfaGFzaFsyNTZdOworCitzdGF0aWMgdm9pZCBiYXRfc29ja2V0X2FkZF9wYWNrZXQoc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQsCisJCQkJICBzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0LAorCQkJCSAgc2l6ZV90IGljbXBfbGVuKTsKKwordm9pZCBiYXRfc29ja2V0X2luaXQodm9pZCkKK3sKKwltZW1zZXQoc29ja2V0X2NsaWVudF9oYXNoLCAwLCBzaXplb2Yoc29ja2V0X2NsaWVudF9oYXNoKSk7Cit9CisKK3N0YXRpYyBpbnQgYmF0X3NvY2tldF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50OworCisJc29ja2V0X2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXRfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNvY2tldF9jbGllbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ja2V0X2NsaWVudF9oYXNoKTsgaSsrKSB7CisJCWlmICghc29ja2V0X2NsaWVudF9oYXNoW2ldKSB7CisJCQlzb2NrZXRfY2xpZW50X2hhc2hbaV0gPSBzb2NrZXRfY2xpZW50OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHNvY2tldF9jbGllbnRfaGFzaCkpIHsKKwkJcHJfZXJyKCJFcnJvciAtIGNhbid0IGFkZCBhbm90aGVyIHBhY2tldCBjbGllbnQ6ICIKKwkJICAgICAgICJtYXhpbXVtIG51bWJlciBvZiBjbGllbnRzIHJlYWNoZWRcbiIpOworCQlrZnJlZShzb2NrZXRfY2xpZW50KTsKKwkJcmV0dXJuIC1FWEZVTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QpOworCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA9IDA7CisJc29ja2V0X2NsaWVudC0+aW5kZXggPSBpOworCXNwaW5fbG9ja19pbml0KCZzb2NrZXRfY2xpZW50LT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb2NrZXRfY2xpZW50LT5xdWV1ZV93YWl0KTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHNvY2tldF9jbGllbnQ7CisKKwlpbmNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmF0X3NvY2tldF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzb2NrZXRfcGFja2V0ICpzb2NrZXRfcGFja2V0OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfcG9zLCAqbGlzdF9wb3NfdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOworCisJLyogZm9yIGFsbCBwYWNrZXRzIGluIHRoZSBxdWV1ZSAuLi4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QpIHsKKwkJc29ja2V0X3BhY2tldCA9IGxpc3RfZW50cnkobGlzdF9wb3MsCisJCQkJCSAgIHN0cnVjdCBzb2NrZXRfcGFja2V0LCBsaXN0KTsKKworCQlsaXN0X2RlbChsaXN0X3Bvcyk7CisJCWtmcmVlKHNvY2tldF9wYWNrZXQpOworCX0KKworCXNvY2tldF9jbGllbnRfaGFzaFtzb2NrZXRfY2xpZW50LT5pbmRleF0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKKworCWtmcmVlKHNvY2tldF9jbGllbnQpOworCWRlY19tb2R1bGVfY291bnQoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBiYXRfc29ja2V0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNvY2tldF9wYWNrZXQgKnNvY2tldF9wYWNrZXQ7CisJc2l6ZV90IHBhY2tldF9sZW47CisJaW50IGVycm9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiAoc29ja2V0X2NsaWVudC0+cXVldWVfbGVuID09IDApKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmICgoIWJ1ZikgfHwgKGNvdW50IDwgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc29ja2V0X2NsaWVudC0+cXVldWVfd2FpdCwKKwkJCQkJIHNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbik7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7CisKKwlzb2NrZXRfcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmc29ja2V0X2NsaWVudC0+cXVldWVfbGlzdCwKKwkJCQkJIHN0cnVjdCBzb2NrZXRfcGFja2V0LCBsaXN0KTsKKwlsaXN0X2RlbCgmc29ja2V0X3BhY2tldC0+bGlzdCk7CisJc29ja2V0X2NsaWVudC0+cXVldWVfbGVuLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7CisKKwllcnJvciA9IF9fY29weV90b191c2VyKGJ1ZiwgJnNvY2tldF9wYWNrZXQtPmljbXBfcGFja2V0LAorCQkJICAgICAgIHNvY2tldF9wYWNrZXQtPmljbXBfbGVuKTsKKworCXBhY2tldF9sZW4gPSBzb2NrZXRfcGFja2V0LT5pY21wX2xlbjsKKwlrZnJlZShzb2NrZXRfcGFja2V0KTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcGFja2V0X2xlbjsKK30KKworc3RhdGljIHNzaXplX3QgYmF0X3NvY2tldF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpvZmYpCit7CisJLyogRklYTUU6IGVhY2ggb3JpZ19ub2RlLT5iYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CisJc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGljbXBfcGFja2V0X3JyIGljbXBfcGFja2V0OworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJc2l6ZV90IHBhY2tldF9sZW4gPSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KTsKKwl1aW50OF90IGRzdGFkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpIHsKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJCSJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6ICIKKwkJCSJpbnZhbGlkIHBhY2tldCBzaXplXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkKKwkJcGFja2V0X2xlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmYsIHBhY2tldF9sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZpY21wX3BhY2tldCwgYnVmZiwgcGFja2V0X2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGljbXBfcGFja2V0LnBhY2tldF90eXBlICE9IEJBVF9JQ01QKSB7CisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiAiCisJCQkiZ290IGJvZ3VzIHBhY2tldCB0eXBlIChleHBlY3RlZDogQkFUX0lDTVApXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGljbXBfcGFja2V0Lm1zZ190eXBlICE9IEVDSE9fUkVRVUVTVCkgeworCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAorCQkJIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogIgorCQkJImdvdCBib2d1cyBtZXNzYWdlIHR5cGUgKGV4cGVjdGVkOiBFQ0hPX1JFUVVFU1QpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWNtcF9wYWNrZXQudWlkID0gc29ja2V0X2NsaWVudC0+aW5kZXg7CisKKwlpZiAoaWNtcF9wYWNrZXQudmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgeworCQlpY21wX3BhY2tldC5tc2dfdHlwZSA9IFBBUkFNRVRFUl9QUk9CTEVNOworCQlpY21wX3BhY2tldC50dGwgPSBDT01QQVRfVkVSU0lPTjsKKwkJYmF0X3NvY2tldF9hZGRfcGFja2V0KHNvY2tldF9jbGllbnQsICZpY21wX3BhY2tldCwgcGFja2V0X2xlbik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSAhPSBNT0RVTEVfQUNUSVZFKQorCQlnb3RvIGRzdF91bnJlYWNoOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CisJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgaWNtcF9wYWNrZXQuZHN0KSk7CisKKwlpZiAoIW9yaWdfbm9kZSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQorCQlnb3RvIHVubG9jazsKKworCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKKwltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWJhdG1hbl9pZikKKwkJZ290byBkc3RfdW5yZWFjaDsKKworCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCisJCWdvdG8gZHN0X3VucmVhY2g7CisKKwltZW1jcHkoaWNtcF9wYWNrZXQub3JpZywgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJaWYgKHBhY2tldF9sZW4gPT0gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldF9ycikpCisJCW1lbWNweShpY21wX3BhY2tldC5yciwgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJc2VuZF9yYXdfcGFja2V0KCh1bnNpZ25lZCBjaGFyICopJmljbXBfcGFja2V0LAorCQkJcGFja2V0X2xlbiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKKworCWdvdG8gb3V0OworCit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKK2RzdF91bnJlYWNoOgorCWljbXBfcGFja2V0Lm1zZ190eXBlID0gREVTVElOQVRJT05fVU5SRUFDSEFCTEU7CisJYmF0X3NvY2tldF9hZGRfcGFja2V0KHNvY2tldF9jbGllbnQsICZpY21wX3BhY2tldCwgcGFja2V0X2xlbik7CitvdXQ6CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiYXRfc29ja2V0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnNvY2tldF9jbGllbnQtPnF1ZXVlX3dhaXQsIHdhaXQpOworCisJaWYgKHNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA+IDApCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBiYXRfc29ja2V0X29wZW4sCisJLnJlbGVhc2UgPSBiYXRfc29ja2V0X3JlbGVhc2UsCisJLnJlYWQgPSBiYXRfc29ja2V0X3JlYWQsCisJLndyaXRlID0gYmF0X3NvY2tldF93cml0ZSwKKwkucG9sbCA9IGJhdF9zb2NrZXRfcG9sbCwKK307CisKK2ludCBiYXRfc29ja2V0X3NldHVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IGRlbnRyeSAqZDsKKworCWlmICghYmF0X3ByaXYtPmRlYnVnX2RpcikKKwkJZ290byBlcnI7CisKKwlkID0gZGVidWdmc19jcmVhdGVfZmlsZShJQ01QX1NPQ0tFVCwgU19JRlJFRyB8IFNfSVdVU1IgfCBTX0lSVVNSLAorCQkJCWJhdF9wcml2LT5kZWJ1Z19kaXIsIE5VTEwsICZmb3BzKTsKKwlpZiAoZCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBiYXRfc29ja2V0X2FkZF9wYWNrZXQoc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQsCisJCQkJICBzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0LAorCQkJCSAgc2l6ZV90IGljbXBfbGVuKQoreworCXN0cnVjdCBzb2NrZXRfcGFja2V0ICpzb2NrZXRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzb2NrZXRfcGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2tldF9wYWNrZXQpLCBHRlBfQVRPTUlDKTsKKworCWlmICghc29ja2V0X3BhY2tldCkKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJnNvY2tldF9wYWNrZXQtPmxpc3QpOworCW1lbWNweSgmc29ja2V0X3BhY2tldC0+aWNtcF9wYWNrZXQsIGljbXBfcGFja2V0LCBpY21wX2xlbik7CisJc29ja2V0X3BhY2tldC0+aWNtcF9sZW4gPSBpY21wX2xlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7CisKKwkvKiB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jayB0aGUgc29ja2V0X2NsaWVudCBjb3VsZCBoYXZlIGJlZW4KKwkgKiBkZWxldGVkICovCisJaWYgKCFzb2NrZXRfY2xpZW50X2hhc2hbaWNtcF9wYWNrZXQtPnVpZF0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOworCQlrZnJlZShzb2NrZXRfcGFja2V0KTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfYWRkX3RhaWwoJnNvY2tldF9wYWNrZXQtPmxpc3QsICZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0KTsKKwlzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4rKzsKKworCWlmIChzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4gPiAxMDApIHsKKwkJc29ja2V0X3BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QsCisJCQkJCQkgc3RydWN0IHNvY2tldF9wYWNrZXQsIGxpc3QpOworCisJCWxpc3RfZGVsKCZzb2NrZXRfcGFja2V0LT5saXN0KTsKKwkJa2ZyZWUoc29ja2V0X3BhY2tldCk7CisJCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbi0tOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKKworCXdha2VfdXAoJnNvY2tldF9jbGllbnQtPnF1ZXVlX3dhaXQpOworfQorCit2b2lkIGJhdF9zb2NrZXRfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKKwkJCSAgICAgICBzaXplX3QgaWNtcF9sZW4pCit7CisJc3RydWN0IHNvY2tldF9jbGllbnQgKmhhc2ggPSBzb2NrZXRfY2xpZW50X2hhc2hbaWNtcF9wYWNrZXQtPnVpZF07CisKKwlpZiAoaGFzaCkKKwkJYmF0X3NvY2tldF9hZGRfcGFja2V0KGhhc2gsIGljbXBfcGFja2V0LCBpY21wX2xlbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjliMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0lDTVBfU09DS0VUX0hfCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjZGVmaW5lIElDTVBfU09DS0VUICJzb2NrZXQiCisKK3ZvaWQgYmF0X3NvY2tldF9pbml0KHZvaWQpOworaW50IGJhdF9zb2NrZXRfc2V0dXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Cit2b2lkIGJhdF9zb2NrZXRfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKKwkJCSAgICAgICBzaXplX3QgaWNtcF9sZW4pOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0lDTVBfU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMKaW5kZXggNzRjNzBkNS4uMjY4NjAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYwpAQCAtMjEsMTEgKzIxLDEyIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSAiYmF0X3N5c2ZzLmgiCisjaW5jbHVkZSAiYmF0X2RlYnVnZnMuaCIKICNpbmNsdWRlICJyb3V0aW5nLmgiCiAjaW5jbHVkZSAic2VuZC5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImljbXBfc29ja2V0LmgiCiAjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgInR5cGVzLmgiCkBAIC00MSw3ICs0Miw2IEBACiBERUZJTkVfU1BJTkxPQ0soZm9yd19iYXRfbGlzdF9sb2NrKTsKIERFRklORV9TUElOTE9DSyhmb3J3X2JjYXN0X2xpc3RfbG9jayk7CiAKLWF0b21pY190IHZpc19pbnRlcnZhbDsKIGF0b21pY190IGJjYXN0X3F1ZXVlX2xlZnQ7CiBhdG9taWNfdCBiYXRtYW5fcXVldWVfbGVmdDsKIApAQCAtNDksNyArNDksNyBAQAogCiBzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9kZXZpY2U7CiAKLXVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0QWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwordW5zaWduZWQgY2hhciBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogYXRvbWljX3QgbW9kdWxlX3N0YXRlOwogCiBzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGJhdG1hbl9hZHZfcGFja2V0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKQEAgLTU5LDE4ICs1OSw3IEBACiAKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiYXRfZXZlbnRfd29ya3F1ZXVlOwogCi0jaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLWludCBkZWJ1ZzsKLQotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotCi1pbnQgYmF0X2RlYnVnX3R5cGUoaW50IHR5cGUpCi17Ci0JcmV0dXJuIGRlYnVnICYgdHlwZTsKLX0KLSNlbmRpZgotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGJhdG1hbl9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIApAQCAtODAsOCArNjksNiBAQAogCiAJYXRvbWljX3NldCgmbW9kdWxlX3N0YXRlLCBNT0RVTEVfSU5BQ1RJVkUpOwogCi0JYXRvbWljX3NldCgmdmlzX2ludGVydmFsLCAxMDAwKTsvKiBUT0RPOiByYWlzZSB0aGlzIGxhdGVyLCB0aGlzIGlzIG9ubHkKLQkJCQkJICogZm9yIGRlYnVnZ2luZyBub3cuICovCiAJYXRvbWljX3NldCgmYmNhc3RfcXVldWVfbGVmdCwgQkNBU1RfUVVFVUVfTEVOKTsKIAlhdG9taWNfc2V0KCZiYXRtYW5fcXVldWVfbGVmdCwgQkFUTUFOX1FVRVVFX0xFTik7CiAKQEAgLTkyLDIzICs3OSwyMiBAQAogCWlmICghYmF0X2V2ZW50X3dvcmtxdWV1ZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQliYXRfZGV2aWNlX2luaXQoKTsKKwliYXRfc29ja2V0X2luaXQoKTsKKwlkZWJ1Z2ZzX2luaXQoKTsKIAogCS8qIGluaXRpYWxpemUgbGF5ZXIgMiBpbnRlcmZhY2UgKi8KIAlzb2Z0X2RldmljZSA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGJhdF9wcml2KSAsICJiYXQlZCIsCiAJCQkJICAgaW50ZXJmYWNlX3NldHVwKTsKIAogCWlmICghc29mdF9kZXZpY2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiIKLQkJICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgdGhlIGJhdG1hbiBpbnRlcmZhY2VcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgYmF0bWFuIGludGVyZmFjZVxuIik7CiAJCWdvdG8gZW5kOwogCX0KIAogCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihzb2Z0X2RldmljZSk7CiAKIAlpZiAocmV0dmFsIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IgotCQkgICAgICAgIlVuYWJsZSB0byByZWdpc3RlciB0aGUgYmF0bWFuIGludGVyZmFjZTogJWlcbiIsIHJldHZhbCk7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBiYXRtYW4gaW50ZXJmYWNlOiAlaVxuIiwgcmV0dmFsKTsKIAkJZ290byBmcmVlX3NvZnRfZGV2aWNlOwogCX0KIApAQCAtMTE3LDE1ICsxMDMsMjIgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byB1bnJlZ19zb2Z0X2RldmljZTsKIAorCXJldHZhbCA9IGRlYnVnZnNfYWRkX21lc2hpZihzb2Z0X2RldmljZSk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byB1bnJlZ19zeXNmczsKKwogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGFyZF9pZl9ub3RpZmllcik7CiAJZGV2X2FkZF9wYWNrKCZiYXRtYW5fYWR2X3BhY2tldF90eXBlKTsKIAotCXByaW50ayhLRVJOX0lORk8gImJhdG1hbi1hZHY6IgotCSAgICAgICAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkICVzJXMgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAlaSkgbG9hZGVkXG4iLAotCSAgICAgICBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsIENPTVBBVF9WRVJTSU9OKTsKKwlwcl9pbmZvKCJCLkEuVC5NLkEuTi4gYWR2YW5jZWQgJXMlcyAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uICVpKSAiCisJCSJsb2FkZWRcbiIsIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKKwkJQ09NUEFUX1ZFUlNJT04pOwogCiAJcmV0dXJuIDA7CiAKK3VucmVnX3N5c2ZzOgorCXN5c2ZzX2RlbF9tZXNoaWYoc29mdF9kZXZpY2UpOwogdW5yZWdfc29mdF9kZXZpY2U6CiAJdW5yZWdpc3Rlcl9uZXRkZXYoc29mdF9kZXZpY2UpOwogCXNvZnRfZGV2aWNlID0gTlVMTDsKQEAgLTEzOCwxNCArMTMxLDE2IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBiYXRtYW5fZXhpdCh2b2lkKQogewogCWRlYWN0aXZhdGVfbW9kdWxlKCk7CiAKKwlkZWJ1Z2ZzX2Rlc3Ryb3koKTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGFyZF9pZl9ub3RpZmllcik7CiAJaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKCk7CiAKIAlpZiAoc29mdF9kZXZpY2UpIHsKKwkJZGVidWdmc19kZWxfbWVzaGlmKHNvZnRfZGV2aWNlKTsKIAkJc3lzZnNfZGVsX21lc2hpZihzb2Z0X2RldmljZSk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KHNvZnRfZGV2aWNlKTsKIAkJc29mdF9kZXZpY2UgPSBOVUxMOwpAQCAtMTU3LDcgKzE1Miw3IEBACiAJYmF0X2V2ZW50X3dvcmtxdWV1ZSA9IE5VTEw7CiB9CiAKLS8qIGFjdGl2YXRlcyB0aGUgbW9kdWxlLCBjcmVhdGVzIGJhdCBkZXZpY2UsIHN0YXJ0cyB0aW1lciAuLi4gKi8KKy8qIGFjdGl2YXRlcyB0aGUgbW9kdWxlLCBzdGFydHMgdGltZXIgLi4uICovCiB2b2lkIGFjdGl2YXRlX21vZHVsZSh2b2lkKQogewogCWlmIChvcmlnaW5hdG9yX2luaXQoKSA8IDEpCkBAIC0xNzEsOSArMTY2LDYgQEAKIAogCWhuYV9sb2NhbF9hZGQoc29mdF9kZXZpY2UtPmRldl9hZGRyKTsKIAotCWlmIChiYXRfZGV2aWNlX3NldHVwKCkgPCAxKQotCQlnb3RvIGVuZDsKLQogCWlmICh2aXNfaW5pdCgpIDwgMSkKIAkJZ290byBlcnI7CiAKQEAgLTE4Miw4ICsxNzQsNyBAQAogCWdvdG8gZW5kOwogCiBlcnI6Ci0JcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiIKLQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1lc2ggaW5mb3JtYXRpb24gc3RydWN0dXJlczogIgorCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWVzaCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzOiAiCiAJICAgICAgICJvdXQgb2YgbWVtID9cbiIpOwogCWRlYWN0aXZhdGVfbW9kdWxlKCk7CiBlbmQ6CkBAIC0yMDgsNyArMTk5LDYgQEAKIAlobmFfZ2xvYmFsX2ZyZWUoKTsKIAogCXN5bmNocm9uaXplX25ldCgpOwotCWJhdF9kZXZpY2VfZGVzdHJveSgpOwogCiAJc3luY2hyb25pemVfcmN1KCk7CiAJYXRvbWljX3NldCgmbW9kdWxlX3N0YXRlLCBNT0RVTEVfSU5BQ1RJVkUpOwpAQCAtMjI2LDggKzIxNiw3IEBACiAKIGludCBhZGRyX3RvX3N0cmluZyhjaGFyICpidWZmLCB1aW50OF90ICphZGRyKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZmYsIE1BQ19GTVQsCi0JCSAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwlyZXR1cm4gc3ByaW50ZihidWZmLCAiJXBNIiwgYWRkcik7CiB9CiAKIC8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBvcmlnaW5hdG9yICovCkBAIC0yODQsNiArMjczLDkgQEAKIAlyZXR1cm4gKmFkZHIgJiAweDAxOwogfQogCittb2R1bGVfaW5pdChiYXRtYW5faW5pdCk7Cittb2R1bGVfZXhpdChiYXRtYW5fZXhpdCk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uaAppbmRleCA1ZjgzNDNkLi44NTEzMjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oCkBAIC0xOSw2ICsxOSw5IEBACiAgKgogICovCiAKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX01BSU5fSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX01BSU5fSF8KKwogLyogS2VybmVsIFByb2dyYW1taW5nICovCiAjZGVmaW5lIExJTlVYCiAKQEAgLTI3LDcgKzMwLDcgQEAKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkIgogI2RlZmluZSBEUklWRVJfREVWSUNFICJiYXRtYW4tYWR2IgogCi0jZGVmaW5lIFNPVVJDRV9WRVJTSU9OICIwLjIuMi1iZXRhIgorI2RlZmluZSBTT1VSQ0VfVkVSU0lPTiAibWFpbnQiCiAKIAogLyogQi5BLlQuTS5BLk4uIHBhcmFtZXRlcnMgKi8KQEAgLTM2LDEwICszOSwxMCBAQAogI2RlZmluZSBKSVRURVIgMjAKICNkZWZpbmUgVFRMIDUwCQkJICAvKiBUaW1lIFRvIExpdmUgb2YgYnJvYWRjYXN0IG1lc3NhZ2VzICovCiAKLSNkZWZpbmUgUFVSR0VfVElNRU9VVCAyMDAwMDAJICAvKiBwdXJnZSBvcmlnaW5hdG9ycyBhZnRlciB0aW1lIGluIG1zIGlmIG5vCisjZGVmaW5lIFBVUkdFX1RJTUVPVVQgMjAwCS8qIHB1cmdlIG9yaWdpbmF0b3JzIGFmdGVyIHRpbWUgaW4gc2Vjb25kcyBpZiBubwogCQkJCSAgICogdmFsaWQgcGFja2V0IGNvbWVzIGluIC0+IFRPRE86IGNoZWNrCiAJCQkJICAgKiBpbmZsdWVuY2Ugb24gVFFfTE9DQUxfV0lORE9XX1NJWkUgKi8KLSNkZWZpbmUgTE9DQUxfSE5BX1RJTUVPVVQgMzYwMDAwMAorI2RlZmluZSBMT0NBTF9ITkFfVElNRU9VVCAzNjAwIC8qIGluIHNlY29uZHMgKi8KIAogI2RlZmluZSBUUV9MT0NBTF9XSU5ET1dfU0laRSA2NAkgIC8qIHNsaWRpbmcgcGFja2V0IHJhbmdlIG9mIHJlY2VpdmVkIG9yaWdpbmF0b3IKIAkJCQkgICAqIG1lc3NhZ2VzIGluIHNxdWVuY2UgbnVtYmVycyAoc2hvdWxkIGJlIGEKQEAgLTU3LDQ0ICs2MCw0MiBAQAogI2RlZmluZSBMT0dfQlVGX0xFTiA4MTkyCSAgLyogaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBFVEhfU1RSX0xFTiAyMAogCisjZGVmaW5lIFZJU19JTlRFUlZBTCA1MDAwCS8qIDUgc2Vjb25kcyAqLworCisvKiBob3cgbXVjaCB3b3JzZSBzZWNvbmRhcnkgaW50ZXJmYWNlcyBtYXkgYmUgdG8KKyAqIHRvIGJlIGNvbnNpZGVyZWQgYXMgYm9uZGluZyBjYW5kaWRhdGVzICovCisKKyNkZWZpbmUgQk9ORElOR19UUV9USFJFU0hPTEQJNTAKKwogI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fQllURVMgNTEyIC8qIHNob3VsZCBub3QgYmUgYmlnZ2VyIHRoYW4gNTEyIGJ5dGVzIG9yCiAJCQkJICAgKiBjaGFuZ2UgdGhlIHNpemUgb2YKIAkJCQkgICAqIGZvcndfcGFja2V0LT5kaXJlY3RfbGlua19mbGFncyAqLwogI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fTVMgMTAwCiAKICNkZWZpbmUgUkVTRVRfUFJPVEVDVElPTl9NUyAzMDAwMAotI2RlZmluZSBFWFBFQ1RFRF9TRVFOT19SQU5HRQk0MDk2CisjZGVmaW5lIEVYUEVDVEVEX1NFUU5PX1JBTkdFCTY1NTM2CiAvKiBkb24ndCByZXNldCBhZ2FpbiB3aXRoaW4gMzAgc2Vjb25kcyAqLwogCiAjZGVmaW5lIE1PRFVMRV9JTkFDVElWRSAwCiAjZGVmaW5lIE1PRFVMRV9BQ1RJVkUgMQogI2RlZmluZSBNT0RVTEVfREVBQ1RJVkFUSU5HIDIKIAotI2RlZmluZSBCQ0FTVF9RVUVVRV9MRU4gMjU2CisjZGVmaW5lIEJDQVNUX1FVRVVFX0xFTgkJMjU2CiAjZGVmaW5lIEJBVE1BTl9RVUVVRV9MRU4JMjU2CiAKIC8qCiAgKiBEZWJ1ZyBNZXNzYWdlcwogICovCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10IC8qIEFwcGVuZCAnYmF0bWFuLWFkdjogJyBiZWZvcmUKKwkJCQkJICAgICAqIGtlcm5lbCBtZXNzYWdlcyAqLwogCiAjZGVmaW5lIERCR19CQVRNQU4gMQkvKiBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0aW5nIC8gZmxvb2RpbmcgLwogCQkJICogYnJvYWRjYXN0aW5nIC8gZXRjICovCiAjZGVmaW5lIERCR19ST1VURVMgMgkvKiByb3V0ZSBvciBobmEgYWRkZWQgLyBjaGFuZ2VkIC8gZGVsZXRlZCAqLworI2RlZmluZSBEQkdfQUxMIDMKIAotI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCi1leHRlcm4gaW50IGRlYnVnOworI2RlZmluZSBMT0dfQlVGX0xFTiA4MTkyICAgICAgICAgIC8qIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIgKi8KIAotZXh0ZXJuIGludCBiYXRfZGVidWdfdHlwZShpbnQgdHlwZSk7Ci0jZGVmaW5lIGJhdF9kYmcodHlwZSwgZm10LCBhcmcuLi4pIGRvIHsJCQkJCVwKLQkJaWYgKGJhdF9kZWJ1Z190eXBlKHR5cGUpKQkJCQlcCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiYmF0bWFuLWFkdjoiIGZtdCwgIyMgYXJnKTsJXAotCX0JCQkJCQkJCVwKLQl3aGlsZSAoMCkKLSNlbHNlIC8qICFDT05GSUdfQkFUTUFOX0FEVl9ERUJVRyAqLwotI2RlZmluZSBiYXRfZGJnKHR5cGUsIGZtdCwgYXJnLi4uKSBkbyB7CQlcCi0JfQkJCQkJXAotCXdoaWxlICgwKQotI2VuZGlmCiAKIC8qCiAgKiAgVmlzCkBAIC0xMTcsNiArMTE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4JCS8qIHN0cnVjdCBzb2NrICovCiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSAidHlwZXMuaCIKIAogI2lmbmRlZiBSRVZJU0lPTl9WRVJTSU9OCkBAIC0xMzQsMTQgKzEzNiwxMyBAQAogZXh0ZXJuIHNwaW5sb2NrX3QgZm9yd19iYXRfbGlzdF9sb2NrOwogZXh0ZXJuIHNwaW5sb2NrX3QgZm9yd19iY2FzdF9saXN0X2xvY2s7CiAKLWV4dGVybiBhdG9taWNfdCB2aXNfaW50ZXJ2YWw7CiBleHRlcm4gYXRvbWljX3QgYmNhc3RfcXVldWVfbGVmdDsKIGV4dGVybiBhdG9taWNfdCBiYXRtYW5fcXVldWVfbGVmdDsKIGV4dGVybiBpbnQxNl90IG51bV9obmE7CiAKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9kZXZpY2U7CiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGJyb2FkY2FzdEFkZHJbXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGJyb2FkY2FzdF9hZGRyW107CiBleHRlcm4gYXRvbWljX3QgbW9kdWxlX3N0YXRlOwogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiYXRfZXZlbnRfd29ya3F1ZXVlOwogCkBAIC0xNTUsMyArMTU2LDQ0IEBACiBpbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpOwogaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpOwogaW50IGlzX21jYXN0KHVpbnQ4X3QgKmFkZHIpOworCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKK2V4dGVybiBpbnQgZGVidWdfbG9nKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNoYXIgKmZtdCwgLi4uKTsKKworI2RlZmluZSBiYXRfZGJnKHR5cGUsIGJhdF9wcml2LCBmbXQsIGFyZy4uLikJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmxvZ19sZXZlbCkgJiB0eXBlKQlcCisJCQlkZWJ1Z19sb2coYmF0X3ByaXYsIGZtdCwgIyMgYXJnKTsJXAorCX0JCQkJCQkJXAorCXdoaWxlICgwKQorI2Vsc2UgLyogIUNPTkZJR19CQVRNQU5fQURWX0RFQlVHICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmF0X2RiZyhjaGFyIHR5cGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkgICBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJICAgY2hhciAqZm10IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCAuLi4pCit7Cit9CisjZW5kaWYKKworI2RlZmluZSBiYXRfd2FybmluZyhuZXRfZGV2LCBmbXQsIGFyZy4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJc3RydWN0IG5ldF9kZXZpY2UgKl9uZXRkZXYgPSAobmV0X2Rldik7ICAgICAgICAgICAgICAgICBcCisJCXN0cnVjdCBiYXRfcHJpdiAqX2JhdHByaXYgPSBuZXRkZXZfcHJpdihfbmV0ZGV2KTsgICAgICAgXAorCQliYXRfZGJnKERCR19BTEwsIF9iYXRwcml2LCBmbXQsICMjIGFyZyk7CQlcCisJCXByX3dhcm5pbmcoIiVzOiAiIGZtdCwgX25ldGRldi0+bmFtZSwgIyMgYXJnKTsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBiYXRfaW5mbyhuZXRfZGV2LCBmbXQsIGFyZy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXN0cnVjdCBuZXRfZGV2aWNlICpfbmV0ZGV2ID0gKG5ldF9kZXYpOyAgICAgICAgICAgICAgICAgXAorCQlzdHJ1Y3QgYmF0X3ByaXYgKl9iYXRwcml2ID0gbmV0ZGV2X3ByaXYoX25ldGRldik7ICAgICAgIFwKKwkJYmF0X2RiZyhEQkdfQUxMLCBfYmF0cHJpdiwgZm10LCAjIyBhcmcpOwkJXAorCQlwcl9pbmZvKCIlczogIiBmbXQsIF9uZXRkZXYtPm5hbWUsICMjIGFyZyk7CQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgYmF0X2VycihuZXRfZGV2LCBmbXQsIGFyZy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXN0cnVjdCBuZXRfZGV2aWNlICpfbmV0ZGV2ID0gKG5ldF9kZXYpOyAgICAgICAgICAgICAgICAgXAorCQlzdHJ1Y3QgYmF0X3ByaXYgKl9iYXRwcml2ID0gbmV0ZGV2X3ByaXYoX25ldGRldik7ICAgICAgIFwKKwkJYmF0X2RiZyhEQkdfQUxMLCBfYmF0cHJpdiwgZm10LCAjIyBhcmcpOwkJXAorCQlwcl9lcnIoIiVzOiAiIGZtdCwgX25ldGRldi0+bmFtZSwgIyMgYXJnKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX01BSU5fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYwppbmRleCA1NjhhZWY4Li4yOGJiNjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCkBAIC01NiwyOCArNTYsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBvcmlnaW5hdG9yX2ZyZWUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFvcmlnX2hhc2gpCi0JCXJldHVybjsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHVyZ2Vfb3JpZ193cSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQloYXNoX2RlbGV0ZShvcmlnX2hhc2gsIGZyZWVfb3JpZ19ub2RlKTsKLQlvcmlnX2hhc2ggPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0cnVjdCBuZWlnaF9ub2RlICoKIGNyZWF0ZV9uZWlnaGJvcihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKIAkJdWludDhfdCAqbmVpZ2gsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQogeworCS8qIEZJWE1FOiBlYWNoIG9yaWdfbm9kZS0+YmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOwogCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOwogCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCAiQ3JlYXRpbmcgbmV3IGxhc3QtaG9wIG5laWdoYm9yIG9mIG9yaWdpbmF0b3JcbiIpOworCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCSJDcmVhdGluZyBuZXcgbGFzdC1ob3AgbmVpZ2hib3Igb2Ygb3JpZ2luYXRvclxuIik7CiAKIAluZWlnaF9ub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5laWdoX25vZGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW5laWdoX25vZGUpCkBAIC05Myw3ICs4MSw3IEBACiAJcmV0dXJuIG5laWdoX25vZGU7CiB9CiAKLXZvaWQgZnJlZV9vcmlnX25vZGUodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7CiAJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CkBAIC0xMTQsNiArMTAyLDIxIEBACiAJa2ZyZWUob3JpZ19ub2RlKTsKIH0KIAordm9pZCBvcmlnaW5hdG9yX2ZyZWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFvcmlnX2hhc2gpCisJCXJldHVybjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHVyZ2Vfb3JpZ193cSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKKwloYXNoX2RlbGV0ZShvcmlnX2hhc2gsIGZyZWVfb3JpZ19ub2RlKTsKKwlvcmlnX2hhc2ggPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Cit9CisKIC8qIHRoaXMgZnVuY3Rpb24gZmluZHMgb3IgY3JlYXRlcyBhbiBvcmlnaW5hdG9yIGVudHJ5IGZvciB0aGUgZ2l2ZW4KICAqIGFkZHJlc3MgaWYgaXQgZG9lcyBub3QgZXhpdHMgKi8KIHN0cnVjdCBvcmlnX25vZGUgKmdldF9vcmlnX25vZGUodWludDhfdCAqYWRkcikKQEAgLTEyOSw3ICsxMzIsOCBAQAogCWlmIChvcmlnX25vZGUgIT0gTlVMTCkKIAkJcmV0dXJuIG9yaWdfbm9kZTsKIAotCWJhdF9kYmcoREJHX0JBVE1BTiwgIkNyZWF0aW5nIG5ldyBvcmlnaW5hdG9yOiAlcE1cbiIsIGFkZHIpOworCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCSJDcmVhdGluZyBuZXcgb3JpZ2luYXRvcjogJXBNXG4iLCBhZGRyKTsKIAogCW9yaWdfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvcmlnX25vZGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW9yaWdfbm9kZSkKQEAgLTE2Myw4ICsxNjcsOCBAQAogCQlzd2FwaGFzaCA9IGhhc2hfcmVzaXplKG9yaWdfaGFzaCwgb3JpZ19oYXNoLT5zaXplICogMik7CiAKIAkJaWYgKHN3YXBoYXNoID09IE5VTEwpCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiYmF0bWFuLWFkdjpDb3VsZG4ndCByZXNpemUgb3JpZyBoYXNoIHRhYmxlXG4iKTsKKwkJCWJhdF9lcnIoc29mdF9kZXZpY2UsCisJCQkJIkNvdWxkbid0IHJlc2l6ZSBvcmlnIGhhc2ggdGFibGVcbiIpOwogCQllbHNlCiAJCQlvcmlnX2hhc2ggPSBzd2FwaGFzaDsKIAl9CkBAIC0xODIsNiArMTg2LDggQEAKIHN0YXRpYyBib29sIHB1cmdlX29yaWdfbmVpZ2hib3JzKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKIAkJCQkgc3RydWN0IG5laWdoX25vZGUgKipiZXN0X25laWdoX25vZGUpCiB7CisJLyogRklYTUU6IGVhY2ggb3JpZ19ub2RlLT5iYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7CiAJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CiAJYm9vbCBuZWlnaF9wdXJnZWQgPSBmYWxzZTsKQEAgLTE5MywyMCArMTk5LDE5IEBACiAJCW5laWdoX25vZGUgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLCBzdHJ1Y3QgbmVpZ2hfbm9kZSwgbGlzdCk7CiAKIAkJaWYgKCh0aW1lX2FmdGVyKGppZmZpZXMsCi0JCQkgICAgICAgKG5laWdoX25vZGUtPmxhc3RfdmFsaWQgKwotCQkJCSgoUFVSR0VfVElNRU9VVCAqIEhaKSAvIDEwMDApKSkpIHx8CisJCQluZWlnaF9ub2RlLT5sYXN0X3ZhbGlkICsgUFVSR0VfVElNRU9VVCAqIEhaKSkgfHwKIAkJICAgIChuZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzID09CiAJCQkJCQlJRl9UT19CRV9SRU1PVkVEKSkgewogCiAJCQlpZiAobmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyA9PQogCQkJCQkJCUlGX1RPX0JFX1JFTU9WRUQpCi0JCQkJYmF0X2RiZyhEQkdfQkFUTUFOLAorCQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkJCSJuZWlnaGJvciBwdXJnZTogb3JpZ2luYXRvciAlcE0sICIKIAkJCQkJIm5laWdoYm9yOiAlcE0sIGlmYWNlOiAlc1xuIiwKIAkJCQkJb3JpZ19ub2RlLT5vcmlnLCBuZWlnaF9ub2RlLT5hZGRyLAogCQkJCQluZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+ZGV2KTsKIAkJCWVsc2UKLQkJCQliYXRfZGJnKERCR19CQVRNQU4sCisJCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJCQkJIm5laWdoYm9yIHRpbWVvdXQ6IG9yaWdpbmF0b3IgJXBNLCAiCiAJCQkJCSJuZWlnaGJvcjogJXBNLCBsYXN0X3ZhbGlkOiAlbHVcbiIsCiAJCQkJCW9yaWdfbm9kZS0+b3JpZywgbmVpZ2hfbm9kZS0+YWRkciwKQEAgLTIyNiwyMSArMjMxLDI2IEBACiAKIHN0YXRpYyBib29sIHB1cmdlX29yaWdfbm9kZShzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpCiB7CisJLyogRklYTUU6IGVhY2ggYmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOwogCXN0cnVjdCBuZWlnaF9ub2RlICpiZXN0X25laWdoX25vZGU7CiAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLAotCQkgICAgICAgKG9yaWdfbm9kZS0+bGFzdF92YWxpZCArCi0JCQkoKDIgKiBQVVJHRV9USU1FT1VUICogSFopIC8gMTAwMCkpKSkgeworCQlvcmlnX25vZGUtPmxhc3RfdmFsaWQgKyAyICogUFVSR0VfVElNRU9VVCAqIEhaKSkgewogCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJCSJPcmlnaW5hdG9yIHRpbWVvdXQ6IG9yaWdpbmF0b3IgJXBNLCBsYXN0X3ZhbGlkICVsdVxuIiwKIAkJCW9yaWdfbm9kZS0+b3JpZywgKG9yaWdfbm9kZS0+bGFzdF92YWxpZCAvIEhaKSk7CiAJCXJldHVybiB0cnVlOwogCX0gZWxzZSB7Ci0JCWlmIChwdXJnZV9vcmlnX25laWdoYm9ycyhvcmlnX25vZGUsICZiZXN0X25laWdoX25vZGUpKQorCQlpZiAocHVyZ2Vfb3JpZ19uZWlnaGJvcnMob3JpZ19ub2RlLCAmYmVzdF9uZWlnaF9ub2RlKSkgewogCQkJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIGJlc3RfbmVpZ2hfbm9kZSwKIAkJCQkgICAgICBvcmlnX25vZGUtPmhuYV9idWZmLAogCQkJCSAgICAgIG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKTsKKwkJCS8qIHVwZGF0ZSBib25kaW5nIGNhbmRpZGF0ZXMsIHdlIGNvdWxkIGhhdmUgbG9zdAorCQkJICogc29tZSBjYW5kaWRhdGVzLiAqLworCQkJdXBkYXRlX2JvbmRpbmdfY2FuZGlkYXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlKTsKKwkJfQogCX0KIAogCXJldHVybiBmYWxzZTsKQEAgLTI3MSw0OSArMjgxLDQxIEBACiAJCXN0YXJ0X3B1cmdlX3RpbWVyKCk7CiB9CiAKLXNzaXplX3Qgb3JpZ19maWxsX2J1ZmZlcl90ZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBjaGFyICpidWZmLAotCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2ZmKQoraW50IG9yaWdfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlIQVNISVQoaGFzaGl0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOwotCXNpemVfdCBoZHJfbGVuLCB0bXBfbGVuOwotCWludCBiYXRtYW5fY291bnQgPSAwLCBieXRlc193cml0dGVuID0gMDsKKwlpbnQgYmF0bWFuX2NvdW50ID0gMDsKKwlpbnQgbGFzdF9zZWVuX3NlY3M7CisJaW50IGxhc3Rfc2Vlbl9tc2VjczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dLCByb3V0ZXJfc3RyW0VUSF9TVFJfTEVOXTsKIAotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpIHsKLQkJaWYgKG9mZiA9PSAwKQotCQkJcmV0dXJuIHNwcmludGYoYnVmZiwKLQkJCQkgICAgICJCQVRNQU4gbWVzaCAlcyBkaXNhYmxlZCAtICIKKwlpZiAoKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikgfHwKKwkgICAgKGJhdF9wcml2LT5wcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKSkgeworCQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQorCQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiQkFUTUFOIG1lc2ggJXMgZGlzYWJsZWQgLSAiCiAJCQkJICAgICAicGxlYXNlIHNwZWNpZnkgaW50ZXJmYWNlcyB0byBlbmFibGUgaXRcbiIsCiAJCQkJICAgICBuZXRfZGV2LT5uYW1lKTsKIAotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiQkFUTUFOIG1lc2ggJXMgIgorCQkJCSAgImRpc2FibGVkIC0gcHJpbWFyeSBpbnRlcmZhY2Ugbm90IGFjdGl2ZVxuIiwKKwkJCQkgIG5ldF9kZXYtPm5hbWUpOwogCX0KIAotCWlmIChiYXRfcHJpdi0+cHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSAmJiBvZmYgPT0gMCkKLQkJcmV0dXJuIHNwcmludGYoYnVmZiwKLQkJCSAgICAgICAiQkFUTUFOIG1lc2ggJXMgIgotCQkJICAgICAgICJkaXNhYmxlZCAtIHByaW1hcnkgaW50ZXJmYWNlIG5vdCBhY3RpdmVcbiIsCi0JCQkgICAgICAgbmV0X2Rldi0+bmFtZSk7Ci0JZWxzZSBpZiAoYmF0X3ByaXYtPnByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCXJldHVybiAwOwotCiAJcmN1X3JlYWRfbG9jaygpOwotCWhkcl9sZW4gPSBzcHJpbnRmKGJ1ZmYsCi0JCSAgICIgICUtMTRzICglcy8laSkgJTE3cyBbJTEwc106ICUyMHMgIgotCQkgICAiLi4uIFtCLkEuVC5NLkEuTi4gYWR2ICVzJXMsIE1haW5JRi9NQUM6ICVzLyVzICglcyldXG4iLAotCQkgICAiT3JpZ2luYXRvciIsICIjIiwgVFFfTUFYX1ZBTFVFLCAiTmV4dGhvcCIsICJvdXRnb2luZ0lGIiwKLQkJICAgIlBvdGVudGlhbCBuZXh0aG9wcyIsIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKKwlzZXFfcHJpbnRmKHNlcSwgIltCLkEuVC5NLkEuTi4gYWR2ICVzJXMsIE1haW5JRi9NQUM6ICVzLyVzICglcyldXG4iLAorCQkgICBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsCiAJCSAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5kZXYsIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5hZGRyX3N0ciwKIAkJICAgbmV0X2Rldi0+bmFtZSk7CisJc2VxX3ByaW50ZihzZXEsICIgICUtMTVzICVzICglcy8laSkgJTE3cyBbJTEwc106ICUyMHMgLi4uXG4iLAorCQkgICAiT3JpZ2luYXRvciIsICJsYXN0LXNlZW4iLCAiIyIsIFRRX01BWF9WQUxVRSwgIk5leHRob3AiLAorCQkgICAib3V0Z29pbmdJRiIsICJQb3RlbnRpYWwgbmV4dGhvcHMiKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChvZmYgPCBoZHJfbGVuKQotCQlieXRlc193cml0dGVuID0gaGRyX2xlbjsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZvcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwogCiAJd2hpbGUgKGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsICZoYXNoaXQpKSB7CkBAIC0zMjYsNDQgKzMyOCwzNCBAQAogCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA9PSAwKQogCQkJY29udGludWU7CiAKLQkJLyogZXN0aW1hdGVkIGxpbmUgbGVuZ3RoICovCi0JCWlmIChjb3VudCA8IGJ5dGVzX3dyaXR0ZW4gKyAyMDApCi0JCQlicmVhazsKLQogCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgb3JpZ19ub2RlLT5vcmlnKTsKIAkJYWRkcl90b19zdHJpbmcocm91dGVyX3N0ciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCQlsYXN0X3NlZW5fc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtCisJCQkJCQlvcmlnX25vZGUtPmxhc3RfdmFsaWQpIC8gMTAwMDsKKwkJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0KKwkJCQkJCW9yaWdfbm9kZS0+bGFzdF92YWxpZCkgJSAxMDAwOwogCi0JCXRtcF9sZW4gPSBzcHJpbnRmKGJ1ZmYgKyBieXRlc193cml0dGVuLAotCQkJCSAgIiUtMTdzICAoJTNpKSAlMTdzIFslMTBzXToiLAotCQkJCSAgIG9yaWdfc3RyLCBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnLAotCQkJCSAgIHJvdXRlcl9zdHIsCi0JCQkJICAgb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nLT5kZXYpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTdzICU0aS4lMDNpcyAgICglM2kpICUxN3MgWyUxMHNdOiIsCisJCQkgICBvcmlnX3N0ciwgbGFzdF9zZWVuX3NlY3MsIGxhc3Rfc2Vlbl9tc2VjcywKKwkJCSAgIG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcsIHJvdXRlcl9zdHIsCisJCQkgICBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPmRldik7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CiAJCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgbmVpZ2hfbm9kZS0+YWRkcik7Ci0JCQl0bXBfbGVuICs9IHNwcmludGYoYnVmZiArIGJ5dGVzX3dyaXR0ZW4gKyB0bXBfbGVuLAotCQkJCQkgICAiICUxN3MgKCUzaSkiLCBvcmlnX3N0ciwKKwkJCXNlcV9wcmludGYoc2VxLCAiICUxN3MgKCUzaSkiLCBvcmlnX3N0ciwKIAkJCQkJICAgbmVpZ2hfbm9kZS0+dHFfYXZnKTsKIAkJfQogCi0JCXRtcF9sZW4gKz0gc3ByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiArIHRtcF9sZW4sICJcbiIpOwotCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKIAkJYmF0bWFuX2NvdW50Kys7Ci0JCWhkcl9sZW4gKz0gdG1wX2xlbjsKLQotCQlpZiAob2ZmID49IGhkcl9sZW4pCi0JCQljb250aW51ZTsKLQotCQlieXRlc193cml0dGVuICs9IHRtcF9sZW47CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKIAotCWlmICgoYmF0bWFuX2NvdW50ID09IDApICYmIChvZmYgPT0gMCkpCi0JCWJ5dGVzX3dyaXR0ZW4gKz0gc3ByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiwKLQkJCQkJIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi5cbiIpOworCWlmICgoYmF0bWFuX2NvdW50ID09IDApKQorCQlzZXFfcHJpbnRmKHNlcSwgIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi5cbiIpOwogCi0JcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgb3JpZ19ub2RlX2FkZF9pZihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIGludCBtYXhfaWZfbnVtKQpAQCAtMzczLDggKzM2NSw3IEBACiAJZGF0YV9wdHIgPSBrbWFsbG9jKG1heF9pZl9udW0gKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUywKIAkJCSAgIEdGUF9BVE9NSUMpOwogCWlmICghZGF0YV9wdHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYmF0bWFuLWFkdjpDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7CisJCXByX2VycigiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0zODUsOCArMzc2LDcgQEAKIAogCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWRhdGFfcHRyKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImJhdG1hbi1hZHY6Q2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOworCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNDM1LDggKzQyNSw3IEBACiAJY2h1bmtfc2l6ZSA9IHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTOwogCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogY2h1bmtfc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFkYXRhX3B0cikgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJiYXRtYW4tYWR2OkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcHJfZXJyKCJDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTQ1Nyw4ICs0NDYsNyBAQAogCiAJZGF0YV9wdHIgPSBrbWFsbG9jKG1heF9pZl9udW0gKiBzaXplb2YodWludDhfdCksIEdGUF9BVE9NSUMpOwogCWlmICghZGF0YV9wdHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYmF0bWFuLWFkdjpDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7CisJCXByX2VycigiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKaW5kZXggYWZiYzdjMC4uZTg4NDExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaApAQCAtMTksMTYgKzE5LDE4IEBACiAgKgogICovCiAKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX09SSUdJTkFUT1JfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX09SSUdJTkFUT1JfSF8KKwogaW50IG9yaWdpbmF0b3JfaW5pdCh2b2lkKTsKLXZvaWQgZnJlZV9vcmlnX25vZGUodm9pZCAqZGF0YSk7CiB2b2lkIG9yaWdpbmF0b3JfZnJlZSh2b2lkKTsKIHZvaWQgcHVyZ2Vfb3JpZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19maW5kKGNoYXIgKm1hYyk7CiBzdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHVpbnQ4X3QgKmFkZHIpOwogc3RydWN0IG5laWdoX25vZGUgKgogY3JlYXRlX25laWdoYm9yKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAogCQl1aW50OF90ICpuZWlnaCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotc3NpemVfdCBvcmlnX2ZpbGxfYnVmZmVyX3RleHQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGNoYXIgKmJ1ZmYsCi0JCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBvZmYpOworaW50IG9yaWdfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiBpbnQgb3JpZ19oYXNoX2FkZF9pZihzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIGludCBtYXhfaWZfbnVtKTsKIGludCBvcmlnX2hhc2hfZGVsX2lmKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgaW50IG1heF9pZl9udW0pOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX09SSUdJTkFUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKaW5kZXggMTUyZjU3Yi4uYWJiNWU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKQEAgLTE5LDYgKzE5LDkgQEAKICAqCiAgKi8KIAorI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfUEFDS0VUX0hfCisjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9QQUNLRVRfSF8KKwogI2RlZmluZSBFVEhfUF9CQVRNQU4gIDB4NDMwNQkvKiB1bm9mZmljaWFsL25vdCByZWdpc3RlcmVkIEV0aGVydHlwZSAqLwogCiAjZGVmaW5lIEJBVF9QQUNLRVQgICAgMHgwMQpAQCAtMjgsOSArMzEsMTAgQEAKICNkZWZpbmUgQkFUX1ZJUyAgICAgICAweDA1CiAKIC8qIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBiYXRjdGwgd2hpY2ggbmVlZHMgdGhlc2UgZGVmaW5lcyAqLwotI2RlZmluZSBDT01QQVRfVkVSU0lPTiA4CisjZGVmaW5lIENPTVBBVF9WRVJTSU9OIDExCiAjZGVmaW5lIERJUkVDVExJTksgMHg0MAogI2RlZmluZSBWSVNfU0VSVkVSIDB4MjAKKyNkZWZpbmUgUFJJTUFSSUVTX0ZJUlNUX0hPUCAweDEwCiAKIC8qIElDTVAgbWVzc2FnZSB0eXBlcyAqLwogI2RlZmluZSBFQ0hPX1JFUExZIDAKQEAgLTQ4LDcgKzUyLDcgQEAKIAl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KIAl1aW50OF90ICBmbGFnczsgICAgLyogMHg0MDogRElSRUNUTElOSyBmbGFnLCAweDIwIFZJU19TRVJWRVIgZmxhZy4uLiAqLwogCXVpbnQ4X3QgIHRxOwotCXVpbnQxNl90IHNlcW5vOworCXVpbnQzMl90IHNlcW5vOwogCXVpbnQ4X3QgIG9yaWdbNl07CiAJdWludDhfdCAgcHJldl9zZW5kZXJbNl07CiAJdWludDhfdCAgdHRsOwpAQCAtNjgsNiArNzIsMjMgQEAKIAl1aW50OF90ICB1aWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCisjZGVmaW5lIEJBVF9SUl9MRU4gMTYKKworLyogaWNtcF9wYWNrZXRfcnIgbXVzdCBzdGFydCB3aXRoIGFsbCBmaWVsZHMgZnJvbSBpbWNwX3BhY2tldAorICAgYXMgdGhpcyBpcyBhc3N1bWVkIGJ5IGNvZGUgdGhhdCBoYW5kbGVzIElDTVAgcGFja2V0cyAqLworc3RydWN0IGljbXBfcGFja2V0X3JyIHsKKwl1aW50OF90ICBwYWNrZXRfdHlwZTsKKwl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KKwl1aW50OF90ICBtc2dfdHlwZTsgLyogc2VlIElDTVAgbWVzc2FnZSB0eXBlcyBhYm92ZSAqLworCXVpbnQ4X3QgIHR0bDsKKwl1aW50OF90ICBkc3RbNl07CisJdWludDhfdCAgb3JpZ1s2XTsKKwl1aW50MTZfdCBzZXFubzsKKwl1aW50OF90ICB1aWQ7CisJdWludDhfdCAgcnJfY3VyOworCXVpbnQ4X3QgIHJyW0JBVF9SUl9MRU5dW0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKIHN0cnVjdCB1bmljYXN0X3BhY2tldCB7CiAJdWludDhfdCAgcGFja2V0X3R5cGU7CiAJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCkBAIC03OSwxOCArMTAwLDIxIEBACiAJdWludDhfdCAgcGFja2V0X3R5cGU7CiAJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCiAJdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50MTZfdCBzZXFubzsKKwl1aW50OF90ICB0dGw7CisJdWludDMyX3Qgc2Vxbm87CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgdmlzX3BhY2tldCB7CiAJdWludDhfdCAgcGFja2V0X3R5cGU7CiAJdWludDhfdCAgdmVyc2lvbjsgICAgICAgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCiAJdWludDhfdCAgdmlzX3R5cGU7CSAvKiB3aGljaCB0eXBlIG9mIHZpcy1wYXJ0aWNpcGFudCBzZW50IHRoaXM/ICovCi0JdWludDhfdCAgc2Vxbm87CQkgLyogc2VxdWVuY2UgbnVtYmVyICovCiAJdWludDhfdCAgZW50cmllczsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGJlaGluZCB0aGlzIHN0cnVjdCAqLworCXVpbnQzMl90IHNlcW5vOwkJIC8qIHNlcXVlbmNlIG51bWJlciAqLwogCXVpbnQ4X3QgIHR0bDsJCSAvKiBUVEwgKi8KIAl1aW50OF90ICB2aXNfb3JpZ1s2XTsJIC8qIG9yaWdpbmF0b3IgdGhhdCBpbmZvcm1zIGFib3V0IGl0cwogCQkJCSAgKiBuZWlnaGJvcnMgKi8KIAl1aW50OF90ICB0YXJnZXRfb3JpZ1s2XTsgLyogd2hvIHNob3VsZCByZWNlaXZlIHRoaXMgcGFja2V0ICovCiAJdWludDhfdCAgc2VuZGVyX29yaWdbNl07IC8qIHdobyBzZW50IG9yIHJlYnJvYWRjYXN0ZWQgdGhpcyBwYWNrZXQgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfUEFDS0VUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuaAppbmRleCBiOGM5NDU2Li42YjBjYjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmgKQEAgLTE5LDUgKzE5LDEwIEBACiAgKgogICovCiAKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfCisjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9SSU5HX0JVRkZFUl9IXworCiB2b2lkIHJpbmdfYnVmZmVyX3NldCh1aW50OF90IGxxX3JlY3ZbXSwgdWludDhfdCAqbHFfaW5kZXgsIHVpbnQ4X3QgdmFsdWUpOwogdWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMKaW5kZXggMDY2ZGM4Yi4uMDY2Y2M5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAiaWNtcF9zb2NrZXQuaCIKICNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJ0eXBlcy5oIgpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgInZpcy5oIgogI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCiAKLURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHRocmVhZF93YWl0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0aHJlYWRfd2FpdCk7CiAKIHZvaWQgc2xpZGVfb3duX2JjYXN0X3dpbmRvdyhzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCiB7CkBAIC03NywyNCArNzcsMjcgQEAKIAkJCSBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwKIAkJCSB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbikKIHsKKwkvKiBGSVhNRTogZWFjaCBvcmlnX25vZGUtPmJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKKwogCS8qIHJvdXRlIGRlbGV0ZWQgKi8KIAlpZiAoKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpICYmIChuZWlnaF9ub2RlID09IE5VTEwpKSB7CiAKLQkJYmF0X2RiZyhEQkdfUk9VVEVTLCAiRGVsZXRpbmcgcm91dGUgdG93YXJkczogJXBNXG4iLAorCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LCAiRGVsZXRpbmcgcm91dGUgdG93YXJkczogJXBNXG4iLAogCQkJb3JpZ19ub2RlLT5vcmlnKTsKIAkJaG5hX2dsb2JhbF9kZWxfb3JpZyhvcmlnX25vZGUsICJvcmlnaW5hdG9yIHRpbWVkIG91dCIpOwogCiAJCS8qIHJvdXRlIGFkZGVkICovCiAJfSBlbHNlIGlmICgob3JpZ19ub2RlLT5yb3V0ZXIgPT0gTlVMTCkgJiYgKG5laWdoX25vZGUgIT0gTlVMTCkpIHsKIAotCQliYXRfZGJnKERCR19ST1VURVMsCisJCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCiAJCQkiQWRkaW5nIHJvdXRlIHRvd2FyZHM6ICVwTSAodmlhICVwTSlcbiIsCiAJCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIpOwogCQlobmFfZ2xvYmFsX2FkZF9vcmlnKG9yaWdfbm9kZSwgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7CiAKIAkJLyogcm91dGUgY2hhbmdlZCAqLwogCX0gZWxzZSB7Ci0JCWJhdF9kYmcoREJHX1JPVVRFUywKKwkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKIAkJCSJDaGFuZ2luZyByb3V0ZSB0b3dhcmRzOiAlcE0gIgogCQkJIihub3cgdmlhICVwTSAtIHdhcyB2aWEgJXBNKVxuIiwKIAkJCW9yaWdfbm9kZS0+b3JpZywgbmVpZ2hfbm9kZS0+YWRkciwKQEAgLTEyMCwxMSArMTIzLDEzIEBACiAJCXVwZGF0ZV9ITkEob3JpZ19ub2RlLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKTsKIH0KIAotc3RhdGljIGludCBpc0JpZGlyZWN0aW9uYWxOZWlnaChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCitzdGF0aWMgaW50IGlzX2JpZGlyZWN0aW9uYWxfbmVpZ2goc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKIAkJCQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKIAkJCQlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKIHsKKwkvKiBGSVhNRTogZWFjaCBvcmlnX25vZGUtPmJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZSA9IE5VTEw7CiAJdW5zaWduZWQgY2hhciB0b3RhbF9jb3VudDsKIApAQCAtMjExLDcgKzIxNiw3IEBACiAJCQkgICAgICBvcmlnX25laWdoX25vZGUtPnRxX2FzeW1fcGVuYWx0eSkgLwogCQkJICAgICAoVFFfTUFYX1ZBTFVFICogVFFfTUFYX1ZBTFVFKSk7CiAKLQliYXRfZGJnKERCR19CQVRNQU4sCisJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJImJpZGlyZWN0aW9uYWw6ICIKIAkJIm9yaWcgPSAlLTE1cE0gbmVpZ2ggPSAlLTE1cE0gPT4gb3duX2JjYXN0ID0gJTJpLCAiCiAJCSJyZWFsIHJlY3YgPSAlMmksIGxvY2FsIHRxOiAlM2ksIGFzeW1fcGVuYWx0eTogJTNpLCAiCkBAIC0yMzQsMTAgKzIzOSwxMiBAQAogCQkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4sCiAJCQljaGFyIGlzX2R1cGxpY2F0ZSkKIHsKKwkvKiBGSVhNRTogZ2V0IGJhdF9wcml2ICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZSA9IE5VTEw7CiAJaW50IHRtcF9obmFfYnVmZl9sZW47CiAKLQliYXRfZGJnKERCR19CQVRNQU4sICJ1cGRhdGVfb3JpZ2luYXRvcigpOiAiCisJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgInVwZGF0ZV9vcmlnaW5hdG9yKCk6ICIKIAkJIlNlYXJjaGluZyBhbmQgdXBkYXRpbmcgb3JpZ2luYXRvciBlbnRyeSBvZiByZWNlaXZlZCBwYWNrZXRcbiIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgewpAQCAtMjY5LDcgKzI3Niw3IEBACiAJCWlmICghbmVpZ2hfbm9kZSkKIAkJCXJldHVybjsKIAl9IGVsc2UKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLAorCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkJIlVwZGF0aW5nIGV4aXN0aW5nIGxhc3QtaG9wIG5laWdoYm9yIG9mIG9yaWdpbmF0b3JcbiIpOwogCiAJb3JpZ19ub2RlLT5mbGFncyA9IGJhdG1hbl9wYWNrZXQtPmZsYWdzOwpAQCAtMzE4LDE2ICszMjUsMTkgQEAKICAqICAwIGlmIHRoZSBwYWNrZXQgaXMgdG8gYmUgYWNjZXB0ZWQKICAqICAxIGlmIHRoZSBwYWNrZXQgaXMgdG8gYmUgaWdub3JlZC4KICAqLwotc3RhdGljIGludCB3aW5kb3dfcHJvdGVjdGVkKGludDE2X3Qgc2VxX251bV9kaWZmLAorc3RhdGljIGludCB3aW5kb3dfcHJvdGVjdGVkKGludDMyX3Qgc2VxX251bV9kaWZmLAogCQkJCXVuc2lnbmVkIGxvbmcgKmxhc3RfcmVzZXQpCiB7CisJLyogRklYTUU6IGVhY2ggb3JpZ19ub2RlLT5iYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CisKIAlpZiAoKHNlcV9udW1fZGlmZiA8PSAtVFFfTE9DQUxfV0lORE9XX1NJWkUpCiAJCXx8IChzZXFfbnVtX2RpZmYgPj0gRVhQRUNURURfU0VRTk9fUkFOR0UpKSB7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsICpsYXN0X3Jlc2V0ICsKIAkJCW1zZWNzX3RvX2ppZmZpZXMoUkVTRVRfUFJPVEVDVElPTl9NUykpKSB7CiAKIAkJCSpsYXN0X3Jlc2V0ID0gamlmZmllczsKLQkJCWJhdF9kYmcoREJHX0JBVE1BTiwKKwkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkJIm9sZCBwYWNrZXQgcmVjZWl2ZWQsIHN0YXJ0IHByb3RlY3Rpb25cbiIpOwogCiAJCQlyZXR1cm4gMDsKQEAgLTM0OSwxMCArMzU5LDEyIEBACiAJCQkgICAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCiAJCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCiB7CisJLyogRklYTUU6IGVhY2ggb3JpZ19ub2RlLT5iYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXN0cnVjdCBuZWlnaF9ub2RlICp0bXBfbmVpZ2hfbm9kZTsKIAljaGFyIGlzX2R1cGxpY2F0ZSA9IDA7Ci0JaW50MTZfdCBzZXFfZGlmZjsKKwlpbnQzMl90IHNlcV9kaWZmOwogCWludCBuZWVkX3VwZGF0ZSA9IDA7CiAJaW50IHNldF9tYXJrOwogCkBAIC0zODcsNyArMzk5LDggQEAKIAl9CiAKIAlpZiAobmVlZF91cGRhdGUpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAidXBkYXRpbmcgbGFzdF9zZXFubzogb2xkICVkLCBuZXcgJWRcbiIsCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkidXBkYXRpbmcgbGFzdF9zZXFubzogb2xkICVkLCBuZXcgJWRcbiIsCiAJCQlvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubywgYmF0bWFuX3BhY2tldC0+c2Vxbm8pOwogCQlvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubyA9IGJhdG1hbl9wYWNrZXQtPnNlcW5vOwogCX0KQEAgLTM5NSwxOCArNDA4LDEyNyBAQAogCXJldHVybiBpc19kdXBsaWNhdGU7CiB9CiAKKy8qIGNvcHkgcHJpbWFyeSBhZGRyZXNzIGZvciBib25kaW5nICovCitzdGF0aWMgdm9pZCBtYXJrX2JvbmRpbmdfYWRkcmVzcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKKwkJCQkgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQpCisKK3sKKwlpZiAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBQUklNQVJJRVNfRklSU1RfSE9QKQorCQltZW1jcHkob3JpZ19uZWlnaF9ub2RlLT5wcmltYXJ5X2FkZHIsCisJCSAgICAgICBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKKworCXJldHVybjsKK30KKworLyogbWFyayBwb3NzaWJsZSBib25kLmNhbmRpZGF0ZXMgaW4gdGhlIG5laWdoYm9yIGxpc3QgKi8KK3ZvaWQgdXBkYXRlX2JvbmRpbmdfY2FuZGlkYXRlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSkKK3sKKwlpbnQgY2FuZGlkYXRlczsKKwlpbnQgaW50ZXJmZXJlbmNlX2NhbmRpZGF0ZTsKKwlpbnQgYmVzdF90cTsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqdG1wX25laWdoX25vZGUsICp0bXBfbmVpZ2hfbm9kZTI7CisJc3RydWN0IG5laWdoX25vZGUgKmZpcnN0X2NhbmRpZGF0ZSwgKmxhc3RfY2FuZGlkYXRlOworCisJLyogdXBkYXRlIHRoZSBjYW5kaWRhdGVzIGZvciB0aGlzIG9yaWdpbmF0b3IgKi8KKwlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKSB7CisJCW9yaWdfbm9kZS0+Ym9uZC5jYW5kaWRhdGVzID0gMDsKKwkJcmV0dXJuOworCX0KKworCWJlc3RfdHEgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOworCisJLyogdXBkYXRlIGJvbmQuY2FuZGlkYXRlcyAqLworCisJY2FuZGlkYXRlcyA9IDA7CisKKwkvKiBtYXJrIG90aGVyIG5vZGVzIHdoaWNoIGFsc28gcmVjZWl2ZWQgIlBSSU1BUklFUyBGSVJTVCBIT1AiIHBhY2tldHMKKwkgKiBhcyAiYm9uZGluZyBwYXJ0bmVyIiAqLworCisJLyogZmlyc3QsIHplcm8gdGhlIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCXRtcF9uZWlnaF9ub2RlLT5uZXh0X2JvbmRfY2FuZGlkYXRlID0gTlVMTDsKKwl9CisKKwlmaXJzdF9jYW5kaWRhdGUgPSBOVUxMOworCWxhc3RfY2FuZGlkYXRlID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisKKwkJLyogb25seSBjb25zaWRlciBpZiBpdCBoYXMgdGhlIHNhbWUgcHJpbWFyeSBhZGRyZXNzIC4uLiAgKi8KKwkJaWYgKG1lbWNtcChvcmlnX25vZGUtPm9yaWcsCisJCQkJdG1wX25laWdoX25vZGUtPm9yaWdfbm9kZS0+cHJpbWFyeV9hZGRyLAorCQkJCUVUSF9BTEVOKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJLyogLi4uIGFuZCBpcyBnb29kIGVub3VnaCB0byBiZSBjb25zaWRlcmVkICovCisJCWlmICh0bXBfbmVpZ2hfbm9kZS0+dHFfYXZnIDwgYmVzdF90cSAtIEJPTkRJTkdfVFFfVEhSRVNIT0xEKQorCQkJY29udGludWU7CisKKwkJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbm90aGVyIGNhbmRpZGF0ZSB3aXRoIHRoZSBzYW1lCisJCSAqIG1hYyBhZGRyZXNzIG9yIGludGVyZmFjZS4gSWYgd2UgZG8sIHdlIHdvbid0CisJCSAqIHNlbGVjdCB0aGlzIGNhbmRpZGF0ZSBiZWNhdXNlIG9mIHBvc3NpYmxlIGludGVyZmVyZW5jZS4gKi8KKworCQlpbnRlcmZlcmVuY2VfY2FuZGlkYXRlID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZTIsCisJCQkJJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCQlpZiAodG1wX25laWdoX25vZGUyID09IHRtcF9uZWlnaF9ub2RlKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiB3ZSBvbmx5IGNhcmUgaWYgdGhlIG90aGVyIGNhbmRpZGF0ZSBpcyBldmVuCisJCQkgKiBjb25zaWRlcmVkIGFzIGNhbmRpZGF0ZS4gKi8KKwkJCWlmICh0bXBfbmVpZ2hfbm9kZTItPm5leHRfYm9uZF9jYW5kaWRhdGUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCisJCQlpZiAoKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PQorCQkJCXRtcF9uZWlnaF9ub2RlMi0+aWZfaW5jb21pbmcpCisJCQkJfHwgKG1lbWNtcCh0bXBfbmVpZ2hfbm9kZS0+YWRkciwKKwkJCQl0bXBfbmVpZ2hfbm9kZTItPmFkZHIsIEVUSF9BTEVOKSA9PSAwKSkgeworCisJCQkJaW50ZXJmZXJlbmNlX2NhbmRpZGF0ZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogZG9uJ3QgY2FyZSBmdXJ0aGVyIGlmIGl0IGlzIGFuIGludGVyZmVyZW5jZSBjYW5kaWRhdGUgKi8KKwkJaWYgKGludGVyZmVyZW5jZV9jYW5kaWRhdGUpCisJCQljb250aW51ZTsKKworCQlpZiAoZmlyc3RfY2FuZGlkYXRlID09IE5VTEwpIHsKKwkJCWZpcnN0X2NhbmRpZGF0ZSA9IHRtcF9uZWlnaF9ub2RlOworCQkJdG1wX25laWdoX25vZGUtPm5leHRfYm9uZF9jYW5kaWRhdGUgPSBmaXJzdF9jYW5kaWRhdGU7CisJCX0gZWxzZQorCQkJdG1wX25laWdoX25vZGUtPm5leHRfYm9uZF9jYW5kaWRhdGUgPSBsYXN0X2NhbmRpZGF0ZTsKKworCQlsYXN0X2NhbmRpZGF0ZSA9IHRtcF9uZWlnaF9ub2RlOworCisJCWNhbmRpZGF0ZXMrKzsKKwl9CisKKwlpZiAoY2FuZGlkYXRlcyA+IDApIHsKKwkJZmlyc3RfY2FuZGlkYXRlLT5uZXh0X2JvbmRfY2FuZGlkYXRlID0gbGFzdF9jYW5kaWRhdGU7CisJCW9yaWdfbm9kZS0+Ym9uZC5zZWxlY3RlZCA9IGZpcnN0X2NhbmRpZGF0ZTsKKwl9CisKKwlvcmlnX25vZGUtPmJvbmQuY2FuZGlkYXRlcyA9IGNhbmRpZGF0ZXM7Cit9CisKIHZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwKIAkJCQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKIAkJCQl1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbiwKIAkJCQlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKIHsKKwkvKiBGSVhNRTogZWFjaCBvcmlnX25vZGUtPmJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLCAqb3JpZ19ub2RlOwogCWNoYXIgaGFzX2RpcmVjdGxpbmtfZmxhZzsKIAljaGFyIGlzX215X2FkZHIgPSAwLCBpc19teV9vcmlnID0gMCwgaXNfbXlfb2xkb3JpZyA9IDA7CiAJY2hhciBpc19icm9hZGNhc3QgPSAwLCBpc19iaWRpcmVjdGlvbmFsLCBpc19zaW5nbGVfaG9wX25laWdoOwogCWNoYXIgaXNfZHVwbGljYXRlOwotCXVuc2lnbmVkIHNob3J0IGlmX2luY29taW5nX3NlcW5vOworCXVpbnQzMl90IGlmX2luY29taW5nX3NlcW5vOwogCiAJLyogU2lsZW50bHkgZHJvcCB3aGVuIHRoZSBiYXRtYW4gcGFja2V0IGlzIGFjdHVhbGx5IG5vdCBhCiAJICogY29ycmVjdCBwYWNrZXQuCkBAIC00MzEsNyArNTUzLDggQEAKIAlpc19zaW5nbGVfaG9wX25laWdoID0gKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLAogCQkJCQkgICAgYmF0bWFuX3BhY2tldC0+b3JpZykgPyAxIDogMCk7CiAKLQliYXRfZGJnKERCR19CQVRNQU4sICJSZWNlaXZlZCBCQVRNQU4gcGFja2V0IHZpYSBOQjogJXBNLCBJRjogJXMgWyVzXSAiCisJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJIlJlY2VpdmVkIEJBVE1BTiBwYWNrZXQgdmlhIE5COiAlcE0sIElGOiAlcyBbJXNdICIKIAkJIihmcm9tIE9HOiAlcE0sIHZpYSBwcmV2IE9HOiAlcE0sIHNlcW5vICVkLCB0cSAlZCwgIgogCQkiVFRMICVkLCBWICVkLCBJREYgJWQpXG4iLAogCQlldGhoZHItPmhfc291cmNlLCBpZl9pbmNvbWluZy0+ZGV2LCBpZl9pbmNvbWluZy0+YWRkcl9zdHIsCkBAIC00NTUsMTkgKzU3OCwxOSBAQAogCQkJCSBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKIAkJCWlzX215X29sZG9yaWcgPSAxOwogCi0JCWlmIChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwgYnJvYWRjYXN0QWRkcikpCisJCWlmIChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwgYnJvYWRjYXN0X2FkZHIpKQogCQkJaXNfYnJvYWRjYXN0ID0gMTsKIAl9CiAKIAlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewotCQliYXRfZGJnKERCR19CQVRNQU4sCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkiRHJvcCBwYWNrZXQ6IGluY29tcGF0aWJsZSBiYXRtYW4gdmVyc2lvbiAoJWkpXG4iLAogCQkJYmF0bWFuX3BhY2tldC0+dmVyc2lvbik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoaXNfbXlfYWRkcikgewotCQliYXRfZGJnKERCR19CQVRNQU4sCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkiRHJvcCBwYWNrZXQ6IHJlY2VpdmVkIG15IG93biBicm9hZGNhc3QgKHNlbmRlcjogJXBNIgogCQkJIilcbiIsCiAJCQlldGhoZHItPmhfc291cmNlKTsKQEAgLTQ3NSw3ICs1OTgsNyBAQAogCX0KIAogCWlmIChpc19icm9hZGNhc3QpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6ICIKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgIkRyb3AgcGFja2V0OiAiCiAJCSJpZ25vcmluZyBhbGwgcGFja2V0cyB3aXRoIGJyb2FkY2FzdCBzb3VyY2UgYWRkciAoc2VuZGVyOiAlcE0iCiAJCSIpXG4iLCBldGhoZHItPmhfc291cmNlKTsKIAkJcmV0dXJuOwpAQCAtNTA1LDEzICs2MjgsMTMgQEAKIAkJCQliaXRfcGFja2V0X2NvdW50KHdvcmQpOwogCQl9CiAKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6ICIKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgIkRyb3AgcGFja2V0OiAiCiAJCQkib3JpZ2luYXRvciBwYWNrZXQgZnJvbSBteXNlbGYgKHZpYSBuZWlnaGJvcilcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGlzX215X29sZG9yaWcpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLAorCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkJIkRyb3AgcGFja2V0OiBpZ25vcmluZyBhbGwgcmVicm9hZGNhc3QgZWNob3MgKHNlbmRlcjogIgogCQkJIiVwTSlcbiIsIGV0aGhkci0+aF9zb3VyY2UpOwogCQlyZXR1cm47CkBAIC01MjQsMTQgKzY0NywxNCBAQAogCWlzX2R1cGxpY2F0ZSA9IGNvdW50X3JlYWxfcGFja2V0cyhldGhoZHIsIGJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nKTsKIAogCWlmIChpc19kdXBsaWNhdGUgPT0gLTEpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLAorCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkJIkRyb3AgcGFja2V0OiBwYWNrZXQgd2l0aGluIHNlcW5vIHByb3RlY3Rpb24gdGltZSAiCiAJCQkiKHNlbmRlcjogJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoYmF0bWFuX3BhY2tldC0+dHEgPT0gMCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkiRHJvcCBwYWNrZXQ6IG9yaWdpbmF0b3IgcGFja2V0IHdpdGggdHEgZXF1YWwgMFxuIik7CiAJCXJldHVybjsKIAl9CkBAIC01NDQsNyArNjY3LDcgQEAKIAkgICAgIShjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+b3JpZywgYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIpKSAmJgogCSAgICAoY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLAogCQkJICBvcmlnX25vZGUtPnJvdXRlci0+b3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpKSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBwYWNrZXRzIHRoYXQgIgogCQkJIm1heSBtYWtlIG1lIGxvb3AgKHNlbmRlcjogJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7CiAJCXJldHVybjsKQEAgLTU2MSwxMSArNjg0LDEyIEBACiAJICogZG9uJ3Qgcm91dGUgdG93YXJkcyBpdCAqLwogCWlmICghaXNfc2luZ2xlX2hvcF9uZWlnaCAmJgogCSAgICAob3JpZ19uZWlnaF9ub2RlLT5yb3V0ZXIgPT0gTlVMTCkpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IE9HTSB2aWEgdW5rbm93biBuZWlnaGJvciFcbiIpOworCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAorCQkJIkRyb3AgcGFja2V0OiBPR00gdmlhIHVua25vd24gbmVpZ2hib3IhXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWlzX2JpZGlyZWN0aW9uYWwgPSBpc0JpZGlyZWN0aW9uYWxOZWlnaChvcmlnX25vZGUsIG9yaWdfbmVpZ2hfbm9kZSwKKwlpc19iaWRpcmVjdGlvbmFsID0gaXNfYmlkaXJlY3Rpb25hbF9uZWlnaChvcmlnX25vZGUsIG9yaWdfbmVpZ2hfbm9kZSwKIAkJCQkJCWJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nKTsKIAogCS8qIHVwZGF0ZSByYW5raW5nIGlmIGl0IGlzIG5vdCBhIGR1cGxpY2F0ZSBvciBoYXMgdGhlIHNhbWUKQEAgLTU3Nyw2ICs3MDEsMTAgQEAKIAkJdXBkYXRlX29yaWcob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsCiAJCQkgICAgaWZfaW5jb21pbmcsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4sIGlzX2R1cGxpY2F0ZSk7CiAKKwltYXJrX2JvbmRpbmdfYWRkcmVzcyhiYXRfcHJpdiwgb3JpZ19ub2RlLAorCQkJICAgICBvcmlnX25laWdoX25vZGUsIGJhdG1hbl9wYWNrZXQpOworCXVwZGF0ZV9ib25kaW5nX2NhbmRpZGF0ZXMoYmF0X3ByaXYsIG9yaWdfbm9kZSk7CisKIAkvKiBpcyBzaW5nbGUgaG9wIChkaXJlY3QpIG5laWdoYm9yICovCiAJaWYgKGlzX3NpbmdsZV9ob3BfbmVpZ2gpIHsKIApAQCAtNTg0LDI0ICs3MTIsMjUgQEAKIAkJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsCiAJCQkJCTEsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOwogCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgIkZvcndhcmRpbmcgcGFja2V0OiAiCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJGb3J3YXJkaW5nIHBhY2tldDogIgogCQkJInJlYnJvYWRjYXN0IG5laWdoYm9yIHBhY2tldCB3aXRoIGRpcmVjdCBsaW5rIGZsYWdcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJLyogbXVsdGlob3Agb3JpZ2luYXRvciAqLwogCWlmICghaXNfYmlkaXJlY3Rpb25hbCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkiRHJvcCBwYWNrZXQ6IG5vdCByZWNlaXZlZCB2aWEgYmlkaXJlY3Rpb25hbCBsaW5rXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChpc19kdXBsaWNhdGUpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGR1cGxpY2F0ZSBwYWNrZXQgcmVjZWl2ZWRcbiIpOworCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAorCQkJIkRyb3AgcGFja2V0OiBkdXBsaWNhdGUgcGFja2V0IHJlY2VpdmVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWJhdF9kYmcoREJHX0JBVE1BTiwKKwliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkiRm9yd2FyZGluZyBwYWNrZXQ6IHJlYnJvYWRjYXN0IG9yaWdpbmF0b3IgcGFja2V0XG4iKTsKIAlzY2hlZHVsZV9mb3J3YXJkX3BhY2tldChvcmlnX25vZGUsIGV0aGhkciwgYmF0bWFuX3BhY2tldCwKIAkJCQkwLCBobmFfYnVmZl9sZW4sIGlmX2luY29taW5nKTsKQEAgLTY1MiwxMCArNzgxLDEwIEBACiAJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfbXlfaWNtcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgcmVjdl9teV9pY21wX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgaWNtcF9sZW4pCiB7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQ7CisJc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldDsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYl9vbGQ7CiAJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwpAQCAtNjYzLDEyICs3OTIsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07CiAKLQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXQgKilza2ItPmRhdGE7CisJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwogCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIAogCS8qIGFkZCBkYXRhIHRvIGRldmljZSBxdWV1ZSAqLwogCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKSB7Ci0JCWJhdF9kZXZpY2VfcmVjZWl2ZV9wYWNrZXQoaWNtcF9wYWNrZXQpOworCQliYXRfc29ja2V0X3JlY2VpdmVfcGFja2V0KGljbXBfcGFja2V0LCBpY21wX2xlbik7CiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAl9CiAKQEAgLTY5MCwxMyArODE5LDEyIEBACiAKIAkJLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KIAkJc2tiX29sZCA9IE5VTEw7Ci0JCWlmICghc2tiX2Nsb25lX3dyaXRhYmxlKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpKSB7CisJCWlmICghc2tiX2Nsb25lX3dyaXRhYmxlKHNrYiwgaWNtcF9sZW4pKSB7CiAJCQlza2Jfb2xkID0gc2tiOwogCQkJc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghc2tiKQogCQkJCXJldHVybiBORVRfUlhfRFJPUDsKLQotCQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0ICopc2tiLT5kYXRhOworCQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwogCQkJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwogCQkJa2ZyZWVfc2tiKHNrYl9vbGQpOwogCQl9CkBAIC03MTUsNyArODQzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJlY3ZfaWNtcF90dGxfZXhjZWVkZWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgcmVjdl9pY21wX3R0bF9leGNlZWRlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgaWNtcF9sZW4pCiB7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQ7CkBAIC03MzEsMTAgKzg1OSw5IEBACiAKIAkvKiBzZW5kIFRUTCBleGNlZWRlZCBpZiBwYWNrZXQgaXMgYW4gZWNobyByZXF1ZXN0ICh0cmFjZXJvdXRlKSAqLwogCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJhdG1hbi1hZHY6IgotCQkgICAgICAgIldhcm5pbmcgLSBjYW4ndCBmb3J3YXJkIGljbXAgcGFja2V0IGZyb20gJXBNIHRvICVwTTogIgotCQkgICAgICAgInR0bCBleGNlZWRlZFxuIiwKLQkJICAgICAgIGljbXBfcGFja2V0LT5vcmlnLCBpY21wX3BhY2tldC0+ZHN0KTsKKwkJcHJfd2FybmluZygiV2FybmluZyAtIGNhbid0IGZvcndhcmQgaWNtcCBwYWNrZXQgZnJvbSAlcE0gdG8gIgorCQkJICAgIiVwTTogdHRsIGV4Y2VlZGVkXG4iLCBpY21wX3BhY2tldC0+b3JpZywKKwkJCSAgIGljbXBfcGFja2V0LT5kc3QpOwogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAJfQogCkBAIC03NTQsNyArODgxLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKIAogCQkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBza2IsIGlmIG5lZWRlZCwgdG8gbW9kaWZ5IGl0LiAqLwotCQlpZiAoIXNrYl9jbG9uZV93cml0YWJsZShza2IsIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkgeworCQlpZiAoIXNrYl9jbG9uZV93cml0YWJsZShza2IsIGljbXBfbGVuKSkgewogCQkJc2tiX29sZCA9IHNrYjsKIAkJCXNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIXNrYikKQEAgLTc4MSw3ICs5MDgsNyBAQAogCiBpbnQgcmVjdl9pY21wX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQ7CisJc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldDsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXN0cnVjdCBza19idWZmICpza2Jfb2xkOwpAQCAtNzkxLDYgKzkxOCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKIAorCS8qKgorCSAqIHdlIHRydW5jYXRlIGFsbCBpbmNvbWluZyBpY21wIHBhY2tldHMgaWYgdGhleSBkb24ndCBtYXRjaCBvdXIgc2l6ZQorCSAqLworCWlmIChza2JfaGVhZGxlbihza2IpID49IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpKQorCQloZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpOworCiAJLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCiAJaWYgKHNrYl9oZWFkbGVuKHNrYikgPCBoZHJfc2l6ZSkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwpAQCAtODA5LDE1ICs5NDIsMjMgQEAKIAlpZiAoIWlzX215X21hYyhldGhoZHItPmhfZGVzdCkpCiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAotCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldCAqKXNrYi0+ZGF0YTsKKwlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7CisKKwkvKiBhZGQgcmVjb3JkIHJvdXRlIGluZm9ybWF0aW9uIGlmIG5vdCBmdWxsICovCisJaWYgKChoZHJfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkgJiYKKwkgICAgKGljbXBfcGFja2V0LT5ycl9jdXIgPCBCQVRfUlJfTEVOKSkgeworCQltZW1jcHkoJihpY21wX3BhY2tldC0+cnJbaWNtcF9wYWNrZXQtPnJyX2N1cl0pLAorCQkJZXRoaGRyLT5oX2Rlc3QsIEVUSF9BTEVOKTsKKwkJaWNtcF9wYWNrZXQtPnJyX2N1cisrOworCX0KIAogCS8qIHBhY2tldCBmb3IgbWUgKi8KIAlpZiAoaXNfbXlfbWFjKGljbXBfcGFja2V0LT5kc3QpKQotCQlyZXR1cm4gcmVjdl9teV9pY21wX3BhY2tldChza2IpOworCQlyZXR1cm4gcmVjdl9teV9pY21wX3BhY2tldChza2IsIGhkcl9zaXplKTsKIAogCS8qIFRUTCBleGNlZWRlZCAqLwogCWlmIChpY21wX3BhY2tldC0+dHRsIDwgMikKLQkJcmV0dXJuIHJlY3ZfaWNtcF90dGxfZXhjZWVkZWQoc2tiKTsKKwkJcmV0dXJuIHJlY3ZfaWNtcF90dGxfZXhjZWVkZWQoc2tiLCBoZHJfc2l6ZSk7CiAKIAlyZXQgPSBORVRfUlhfRFJPUDsKIApAQCAtODM2LDEyICs5NzcsMTIgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKIAogCQkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBza2IsIGlmIG5lZWRlZCwgdG8gbW9kaWZ5IGl0LiAqLwotCQlpZiAoIXNrYl9jbG9uZV93cml0YWJsZShza2IsIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkgeworCQlpZiAoIXNrYl9jbG9uZV93cml0YWJsZShza2IsIGhkcl9zaXplKSkgewogCQkJc2tiX29sZCA9IHNrYjsKIAkJCXNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIXNrYikKIAkJCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JCQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXQgKilza2ItPmRhdGE7CisJCQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7CiAJCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiAJCQlrZnJlZV9za2Ioc2tiX29sZCk7CiAJCX0KQEAgLTg1OSwxNiArMTAwMCwxMDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcmVjdl91bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorLyogZmluZCBhIHN1aXRhYmxlIHJvdXRlciBmb3IgdGhpcyBvcmlnaW5hdG9yLCBhbmQgdXNlCisgKiBib25kaW5nIGlmIHBvc3NpYmxlLiAqLworc3RydWN0IG5laWdoX25vZGUgKmZpbmRfcm91dGVyKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKK3sKKwkvKiBGSVhNRTogZWFjaCBvcmlnX25vZGUtPmJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpwcmltYXJ5X29yaWdfbm9kZTsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpyb3V0ZXJfb3JpZzsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyLCAqZmlyc3RfY2FuZGlkYXRlLCAqYmVzdF9yb3V0ZXI7CisJc3RhdGljIHVpbnQ4X3QgemVyb19tYWNbRVRIX0FMRU5dID0gezAsIDAsIDAsIDAsIDAsIDB9OworCWludCBib25kaW5nX2VuYWJsZWQ7CisKKwlpZiAoIW9yaWdfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHdpdGhvdXQgYm9uZGluZywgdGhlIGZpcnN0IG5vZGUgc2hvdWxkCisJICogYWx3YXlzIGNob29zZSB0aGUgZGVmYXVsdCByb3V0ZXIuICovCisKKwlib25kaW5nX2VuYWJsZWQgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCk7CisJaWYgKCFib25kaW5nX2VuYWJsZWQgJiYgKHJlY3ZfaWYgPT0gTlVMTCkpCisJCQlyZXR1cm4gb3JpZ19ub2RlLT5yb3V0ZXI7CisKKwlyb3V0ZXJfb3JpZyA9IG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGU7CisKKwkvKiBpZiB3ZSBoYXZlIHNvbWV0aGluZyBpbiB0aGUgcHJpbWFyeV9hZGRyLCB3ZSBjYW4gc2VhcmNoCisJICogZm9yIGEgcG90ZW50aWFsIGJvbmRpbmcgY2FuZGlkYXRlLiAqLworCWlmIChtZW1jbXAocm91dGVyX29yaWctPnByaW1hcnlfYWRkciwgemVyb19tYWMsIEVUSF9BTEVOKSA9PSAwKQorCQlyZXR1cm4gb3JpZ19ub2RlLT5yb3V0ZXI7CisKKwkvKiBmaW5kIHRoZSBvcmlnX25vZGUgd2hpY2ggaGFzIHRoZSBwcmltYXJ5IGludGVyZmFjZS4gbWlnaHQKKwkgKiBldmVuIGJlIHRoZSBzYW1lIGFzIG91ciByb3V0ZXJfb3JpZyBpbiBtYW55IGNhc2VzICovCisKKwlpZiAobWVtY21wKHJvdXRlcl9vcmlnLT5wcmltYXJ5X2FkZHIsCisJCQkJcm91dGVyX29yaWctPm9yaWcsIEVUSF9BTEVOKSA9PSAwKSB7CisJCXByaW1hcnlfb3JpZ19ub2RlID0gcm91dGVyX29yaWc7CisJfSBlbHNlIHsKKwkJcHJpbWFyeV9vcmlnX25vZGUgPSBoYXNoX2ZpbmQob3JpZ19oYXNoLAorCQkJCQkJcm91dGVyX29yaWctPnByaW1hcnlfYWRkcik7CisJCWlmICghcHJpbWFyeV9vcmlnX25vZGUpCisJCQlyZXR1cm4gb3JpZ19ub2RlLT5yb3V0ZXI7CisJfQorCisJLyogd2l0aCBsZXNzIHRoYW4gMiBjYW5kaWRhdGVzLCB3ZSBjYW4ndCBkbyBhbnkKKwkgKiBib25kaW5nIGFuZCBwcmVmZXIgdGhlIG9yaWdpbmFsIHJvdXRlci4gKi8KKworCWlmIChwcmltYXJ5X29yaWdfbm9kZS0+Ym9uZC5jYW5kaWRhdGVzIDwgMikKKwkJcmV0dXJuIG9yaWdfbm9kZS0+cm91dGVyOworCisKKwkvKiBhbGwgbm9kZXMgYmV0d2VlbiBzaG91bGQgY2hvb3NlIGEgY2FuZGlkYXRlIHdoaWNoCisJICogaXMgaXMgbm90IG9uIHRoZSBpbnRlcmZhY2Ugd2hlcmUgdGhlIHBhY2tldCBjYW1lCisJICogaW4uICovCisJZmlyc3RfY2FuZGlkYXRlID0gcHJpbWFyeV9vcmlnX25vZGUtPmJvbmQuc2VsZWN0ZWQ7CisJcm91dGVyID0gZmlyc3RfY2FuZGlkYXRlOworCisJaWYgKGJvbmRpbmdfZW5hYmxlZCkgeworCQkvKiBpbiB0aGUgYm9uZGluZyBjYXNlLCBzZW5kIHRoZSBwYWNrZXRzIGluIGEgcm91bmQKKwkJICogcm9iaW4gZmFzaGlvbiBvdmVyIHRoZSByZW1haW5pbmcgaW50ZXJmYWNlcy4gKi8KKwkJZG8geworCQkJLyogcmVjdl9pZiA9PSBOVUxMIG9uIHRoZSBmaXJzdCBub2RlLiAqLworCQkJaWYgKHJvdXRlci0+aWZfaW5jb21pbmcgIT0gcmVjdl9pZikKKwkJCQlicmVhazsKKworCQkJcm91dGVyID0gcm91dGVyLT5uZXh0X2JvbmRfY2FuZGlkYXRlOworCQl9IHdoaWxlIChyb3V0ZXIgIT0gZmlyc3RfY2FuZGlkYXRlKTsKKworCQlwcmltYXJ5X29yaWdfbm9kZS0+Ym9uZC5zZWxlY3RlZCA9IHJvdXRlci0+bmV4dF9ib25kX2NhbmRpZGF0ZTsKKworCX0gZWxzZSB7CisJCS8qIGlmIGJvbmRpbmcgaXMgZGlzYWJsZWQsIHVzZSB0aGUgYmVzdCBvZiB0aGUKKwkJICogcmVtYWluaW5nIGNhbmRpZGF0ZXMgd2hpY2ggYXJlIG5vdCB1c2luZworCQkgKiB0aGlzIGludGVyZmFjZS4gKi8KKwkJYmVzdF9yb3V0ZXIgPSBmaXJzdF9jYW5kaWRhdGU7CisKKwkJZG8geworCQkJLyogcmVjdl9pZiA9PSBOVUxMIG9uIHRoZSBmaXJzdCBub2RlLiAqLworCQkJaWYgKChyb3V0ZXItPmlmX2luY29taW5nICE9IHJlY3ZfaWYpICYmCisJCQkJKHJvdXRlci0+dHFfYXZnID4gYmVzdF9yb3V0ZXItPnRxX2F2ZykpCisJCQkJCWJlc3Rfcm91dGVyID0gcm91dGVyOworCisJCQlyb3V0ZXIgPSByb3V0ZXItPm5leHRfYm9uZF9jYW5kaWRhdGU7CisJCX0gd2hpbGUgKHJvdXRlciAhPSBmaXJzdF9jYW5kaWRhdGUpOworCisJCXJvdXRlciA9IGJlc3Rfcm91dGVyOworCX0KKworCXJldHVybiByb3V0ZXI7Cit9CisKK2ludCByZWN2X3VuaWNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpCiB7CiAJc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IG5laWdoX25vZGUgKnJvdXRlcjsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CiAJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwogCXN0cnVjdCBza19idWZmICpza2Jfb2xkOwogCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07CiAJaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCk7Ci0JaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCkBAIC04OTksNDkgKzExMzMsNTAgQEAKIAogCS8qIFRUTCBleGNlZWRlZCAqLwogCWlmICh1bmljYXN0X3BhY2tldC0+dHRsIDwgMikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJiYXRtYW4tYWR2Oldhcm5pbmcgLSAiCi0JCSAgICAgICAiY2FuJ3QgZm9yd2FyZCB1bmljYXN0IHBhY2tldCBmcm9tICVwTSB0byAlcE06ICIKLQkJICAgICAgICJ0dGwgZXhjZWVkZWRcbiIsCi0JCSAgICAgICBldGhoZHItPmhfc291cmNlLCB1bmljYXN0X3BhY2tldC0+ZGVzdCk7CisJCXByX3dhcm5pbmcoIldhcm5pbmcgLSBjYW4ndCBmb3J3YXJkIHVuaWNhc3QgcGFja2V0IGZyb20gJXBNIHRvICIKKwkJCSAgICIlcE06IHR0bCBleGNlZWRlZFxuIiwgZXRoaGRyLT5oX3NvdXJjZSwKKwkJCSAgIHVuaWNhc3RfcGFja2V0LT5kZXN0KTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KIAotCXJldCA9IE5FVF9SWF9EUk9QOwogCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CiAJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCiAJCSAgICAgaGFzaF9maW5kKG9yaWdfaGFzaCwgdW5pY2FzdF9wYWNrZXQtPmRlc3QpKTsKIAotCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmCi0JICAgIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgeworCXJvdXRlciA9IGZpbmRfcm91dGVyKG9yaWdfbm9kZSwgcmVjdl9pZik7CiAKLQkJLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkJICogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwotCQliYXRtYW5faWYgPSBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmc7Ci0JCW1lbWNweShkc3RhZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgRVRIX0FMRU4pOworCWlmICghcm91dGVyKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBORVRfUlhfRFJPUDsKKwl9CiAKLQkJLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQkJaWYgKCFza2JfY2xvbmVfd3JpdGFibGUoc2tiLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSkpIHsKLQkJCXNrYl9vbGQgPSBza2I7Ci0JCQlza2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwotCQkJaWYgKCFza2IpCi0JCQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCQkJdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCQkJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCQkJa2ZyZWVfc2tiKHNrYl9vbGQpOwotCQl9Ci0JCS8qIGRlY3JlbWVudCB0dGwgKi8KLQkJdW5pY2FzdF9wYWNrZXQtPnR0bC0tOworCS8qIGRvbid0IGxvY2sgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0cyAuLi4gd2UgdGhlcmVmb3JlCisJICogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwogCi0JCS8qIHJvdXRlIGl0ICovCi0JCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0JCXJldCA9IE5FVF9SWF9TVUNDRVNTOworCWJhdG1hbl9pZiA9IHJvdXRlci0+aWZfaW5jb21pbmc7CisJbWVtY3B5KGRzdGFkZHIsIHJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwogCi0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKIAotCXJldHVybiByZXQ7CisJLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KKwlpZiAoIXNrYl9jbG9uZV93cml0YWJsZShza2IsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpKSkgeworCQlza2Jfb2xkID0gc2tiOworCQlza2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBORVRfUlhfRFJPUDsKKwkJdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopIHNrYi0+ZGF0YTsKKwkJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOworCQlrZnJlZV9za2Ioc2tiX29sZCk7CisJfQorCisJLyogZGVjcmVtZW50IHR0bCAqLworCXVuaWNhc3RfcGFja2V0LT50dGwtLTsKKworCS8qIHJvdXRlIGl0ICovCisJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKKworCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKIH0KIAogaW50IHJlY3ZfYmNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IpCkBAIC05NTAsNyArMTE4NSw3IEBACiAJc3RydWN0IGJjYXN0X3BhY2tldCAqYmNhc3RfcGFja2V0OwogCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKIAlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCk7Ci0JaW50MTZfdCBzZXFfZGlmZjsKKwlpbnQzMl90IHNlcV9kaWZmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KQEAgLTk3Nyw2ICsxMjEyLDkgQEAKIAlpZiAoaXNfbXlfbWFjKGJjYXN0X3BhY2tldC0+b3JpZykpCiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAorCWlmIChiY2FzdF9wYWNrZXQtPnR0bCA8IDIpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZvcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwogCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQogCQkgICAgIGhhc2hfZmluZChvcmlnX2hhc2gsIGJjYXN0X3BhY2tldC0+b3JpZykpOwpAQCAtOTg5LDEyICsxMjI3LDEyIEBACiAJLyogY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IGlzIGEgZHVwbGljYXRlICovCiAJaWYgKGdldF9iaXRfc3RhdHVzKG9yaWdfbm9kZS0+YmNhc3RfYml0cywKIAkJCSAgIG9yaWdfbm9kZS0+bGFzdF9iY2FzdF9zZXFubywKLQkJCSAgIG50b2hzKGJjYXN0X3BhY2tldC0+c2Vxbm8pKSkgeworCQkJICAgbnRvaGwoYmNhc3RfcGFja2V0LT5zZXFubykpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAl9CiAKLQlzZXFfZGlmZiA9IG50b2hzKGJjYXN0X3BhY2tldC0+c2Vxbm8pIC0gb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vOworCXNlcV9kaWZmID0gbnRvaGwoYmNhc3RfcGFja2V0LT5zZXFubykgLSBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm87CiAKIAkvKiBjaGVjayB3aGV0aGVyIHRoZSBwYWNrZXQgaXMgb2xkIGFuZCB0aGUgaG9zdCBqdXN0IHJlc3RhcnRlZC4gKi8KIAlpZiAod2luZG93X3Byb3RlY3RlZChzZXFfZGlmZiwgJm9yaWdfbm9kZS0+YmNhc3Rfc2Vxbm9fcmVzZXQpKSB7CkBAIC0xMDA1LDcgKzEyNDMsNyBAQAogCS8qIG1hcmsgYnJvYWRjYXN0IGluIGZsb29kIGhpc3RvcnksIHVwZGF0ZSB3aW5kb3cgcG9zaXRpb24KIAkgKiBpZiByZXF1aXJlZC4gKi8KIAlpZiAoYml0X2dldF9wYWNrZXQob3JpZ19ub2RlLT5iY2FzdF9iaXRzLCBzZXFfZGlmZiwgMSkpCi0JCW9yaWdfbm9kZS0+bGFzdF9iY2FzdF9zZXFubyA9IG50b2hzKGJjYXN0X3BhY2tldC0+c2Vxbm8pOworCQlvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8gPSBudG9obChiY2FzdF9wYWNrZXQtPnNlcW5vKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7CiAJLyogcmVicm9hZGNhc3QgcGFja2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmgKaW5kZXggODI4OGRlYy4uM2VhYzY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaApAQCAtMTksOSArMTksMTAgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInR5cGVzLmgiCisjaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9ST1VUSU5HX0hfCisjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9ST1VUSU5HX0hfCiAKLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCB0aHJlYWRfd2FpdDsKKyNpbmNsdWRlICJ0eXBlcy5oIgogCiB2b2lkIHNsaWRlX293bl9iY2FzdF93aW5kb3coc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKIHZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwKQEAgLTMyLDggKzMzLDE0IEBACiAJCQkJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUsCiAJCQkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pOwogaW50IHJlY3ZfaWNtcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgcmVjdl91bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCByZWN2X3VuaWNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwogaW50IHJlY3ZfYmNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHJlY3ZfdmlzX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCByZWN2X2JhdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpOworc3RydWN0IG5laWdoX25vZGUgKmZpbmRfcm91dGVyKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Cit2b2lkIHVwZGF0ZV9ib25kaW5nX2NhbmRpZGF0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1JPVVRJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYwppbmRleCBhYzY5ZWQ4Li4wNTVlZGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jCkBAIC0yOSw2ICsyOSwxMCBAQAogI2luY2x1ZGUgInZpcy5oIgogI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisKK3N0YXRpYyB2b2lkIHNlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIC8qIGFwcGx5IGhvcCBwZW5hbHR5IGZvciBhIG5vcm1hbCBsaW5rICovCiBzdGF0aWMgdWludDhfdCBob3BfcGVuYWx0eShjb25zdCB1aW50OF90IHRxKQogewpAQCAtMzgsMTUgKzQyLDE1IEBACiAvKiB3aGVuIGRvIHdlIHNjaGVkdWxlIG91ciBvd24gcGFja2V0IHRvIGJlIHNlbnQgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIG93bl9zZW5kX3RpbWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKLQlyZXR1cm4gamlmZmllcyArCi0JCSgoKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCkgLSBKSVRURVIgKwotCQkgICAocmFuZG9tMzIoKSAlIDIqSklUVEVSKSkgKiBIWikgLyAxMDAwKTsKKwlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoCisJCSAgIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCkgLQorCQkgICBKSVRURVIgKyAocmFuZG9tMzIoKSAlIDIqSklUVEVSKSk7CiB9CiAKIC8qIHdoZW4gZG8gd2Ugc2NoZWR1bGUgYSBmb3J3YXJkZWQgcGFja2V0IHRvIGJlIHNlbnQgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZvcndhcmRfc2VuZF90aW1lKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7Ci0JcmV0dXJuIGppZmZpZXMgKyAoKChyYW5kb20zMigpICUgKEpJVFRFUi8yKSkgKiBIWikgLyAxMDAwKTsKKwlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmFuZG9tMzIoKSAlIChKSVRURVIvMikpOwogfQogCiAvKiBzZW5kIG91dCBhbiBhbHJlYWR5IHByZXBhcmVkIHBhY2tldCB0byB0aGUgZ2l2ZW4gYWRkcmVzcyB2aWEgdGhlCkBAIC02NCwxMCArNjgsOCBAQAogCQlnb3RvIHNlbmRfc2tiX2VycjsKIAogCWlmICghKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJiYXRtYW4tYWR2OkludGVyZmFjZSAlcyAiCi0JCSAgICAgICAiaXMgbm90IHVwIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgdmlhIHRoYXQgaW50ZXJmYWNlIVxuIiwKLQkJICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKwkJcHJfd2FybmluZygiSW50ZXJmYWNlICVzIGlzIG5vdCB1cCAtIGNhbid0IHNlbmQgcGFja2V0IHZpYSAiCisJCQkgICAidGhhdCBpbnRlcmZhY2UhXG4iLCBiYXRtYW5faWYtPmRldik7CiAJCWdvdG8gc2VuZF9za2JfZXJyOwogCX0KIApAQCAtOTAsOSArOTIsMTIgQEAKIAogCS8qIGRldl9xdWV1ZV94bWl0KCkgcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3VsdCBvbiBlcnJvci4JIEhvd2V2ZXIgb24KIAkgKiBjb25nZXN0aW9uIGFuZCB0cmFmZmljIHNoYXBpbmcsIGl0IGRyb3BzIGFuZCByZXR1cm5zIE5FVF9YTUlUX0RST1AKLQkgKiAod2hpY2ggaXMgPiAwKS4gVGhpcyB3aWxsIG5vdCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLiAqLworCSAqICh3aGljaCBpcyA+IDApLiBUaGlzIHdpbGwgbm90IGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisJICogQWxzbywgaWYgbmV0ZmlsdGVyL2VidGFibGVzIHdhbnRzIHRvIGJsb2NrIG91dGdvaW5nIGJhdG1hbgorCSAqIHBhY2tldHMgdGhlbiBnaXZpbmcgdGhlbSBhIGNoYW5jZSB0byBkbyBzbyBoZXJlICovCiAKLQlyZXR1cm4gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwlyZXR1cm4gTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKKwkJICAgICAgIGRldl9xdWV1ZV94bWl0KTsKIHNlbmRfc2tiX2VycjoKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gTkVUX1hNSVRfRFJPUDsKQEAgLTExOSw2ICsxMjQsOCBAQAogc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRfdG9faWYoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCwKIAkJCSAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKIHsKKwkvKiBGSVhNRTogZWFjaCBiYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CiAJY2hhciAqZndkX3N0cjsKIAl1aW50OF90IHBhY2tldF9udW07CiAJaW50MTZfdCBidWZmX3BvczsKQEAgLTE0OCwxMSArMTU1LDExIEBACiAJCWZ3ZF9zdHIgPSAocGFja2V0X251bSA+IDAgPyAiRm9yd2FyZGluZyIgOiAoZm9yd19wYWNrZXQtPm93biA/CiAJCQkJCQkJICAgICJTZW5kaW5nIG93biIgOgogCQkJCQkJCSAgICAiRm9yd2FyZGluZyIpKTsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLAorCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkJIiVzICVzcGFja2V0IChvcmlnaW5hdG9yICVwTSwgc2Vxbm8gJWQsIFRRICVkLCBUVEwgJWQsIgogCQkJIiBJREYgJXMpIG9uIGludGVyZmFjZSAlcyBbJXNdXG4iLAogCQkJZndkX3N0ciwgKHBhY2tldF9udW0gPiAwID8gImFnZ3JlZ2F0ZWQgIiA6ICIiKSwKLQkJCWJhdG1hbl9wYWNrZXQtPm9yaWcsIG50b2hzKGJhdG1hbl9wYWNrZXQtPnNlcW5vKSwKKwkJCWJhdG1hbl9wYWNrZXQtPm9yaWcsIG50b2hsKGJhdG1hbl9wYWNrZXQtPnNlcW5vKSwKIAkJCWJhdG1hbl9wYWNrZXQtPnRxLCBiYXRtYW5fcGFja2V0LT50dGwsCiAJCQkoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8KIAkJCSAib24iIDogIm9mZiIpLApAQCAtMTY3LDIwICsxNzQsMjIgQEAKIAogCXNlbmRfcmF3X3BhY2tldChmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYsCiAJCQlmb3J3X3BhY2tldC0+cGFja2V0X2xlbiwKLQkJCWJhdG1hbl9pZiwgYnJvYWRjYXN0QWRkcik7CisJCQliYXRtYW5faWYsIGJyb2FkY2FzdF9hZGRyKTsKIH0KIAogLyogc2VuZCBhIGJhdG1hbiBwYWNrZXQgKi8KIHN0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCiB7CisJLyogRklYTUU6IGVhY2ggYmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOwogCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKIAlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9CiAJCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpOwogCXVuc2lnbmVkIGNoYXIgZGlyZWN0bGluayA9IChiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPyAxIDogMCk7CiAKIAlpZiAoIWZvcndfcGFja2V0LT5pZl9pbmNvbWluZykgewotCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IEVycm9yIC0gY2FuJ3QgZm9yd2FyZCBwYWNrZXQ6ICIKLQkJICAgICAgICJpbmNvbWluZyBpZmFjZSBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJcHJfZXJyKCJFcnJvciAtIGNhbid0IGZvcndhcmQgcGFja2V0OiBpbmNvbWluZyBpZmFjZSBub3QgIgorCQkgICAgICAgInNwZWNpZmllZFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE5MywxOCArMjAyLDE4IEBACiAJICAgIChmb3J3X3BhY2tldC0+b3duICYmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSA+IDApKSkgewogCiAJCS8qIEZJWE1FOiB3aGF0IGFib3V0IGFnZ3JlZ2F0ZWQgcGFja2V0cyA/ICovCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJCSIlcyBwYWNrZXQgKG9yaWdpbmF0b3IgJXBNLCBzZXFubyAlZCwgVFRMICVkKSAiCiAJCQkib24gaW50ZXJmYWNlICVzIFslc11cbiIsCiAJCQkoZm9yd19wYWNrZXQtPm93biA/ICJTZW5kaW5nIG93biIgOiAiRm9yd2FyZGluZyIpLAotCQkJYmF0bWFuX3BhY2tldC0+b3JpZywgbnRvaHMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAorCQkJYmF0bWFuX3BhY2tldC0+b3JpZywgbnRvaGwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAogCQkJYmF0bWFuX3BhY2tldC0+dHRsLCBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmRldiwKIAkJCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+YWRkcl9zdHIpOwogCiAJCXNlbmRfcmF3X3BhY2tldChmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYsCiAJCQkJZm9yd19wYWNrZXQtPnBhY2tldF9sZW4sCiAJCQkJZm9yd19wYWNrZXQtPmlmX2luY29taW5nLAotCQkJCWJyb2FkY2FzdEFkZHIpOworCQkJCWJyb2FkY2FzdF9hZGRyKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjc2LDE0ICsyODUsMTQgQEAKIAliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopYmF0bWFuX2lmLT5wYWNrZXRfYnVmZjsKIAogCS8qIGNoYW5nZSBzZXF1ZW5jZSBudW1iZXIgdG8gbmV0d29yayBvcmRlciAqLwotCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gaHRvbnMoKHVpbnQxNl90KWF0b21pY19yZWFkKCZiYXRtYW5faWYtPnNlcW5vKSk7CisJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPQorCQlodG9ubCgodWludDMyX3QpYXRvbWljX3JlYWQoJmJhdG1hbl9pZi0+c2Vxbm8pKTsKIAogCWlmICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DKQotCQliYXRtYW5fcGFja2V0LT5mbGFncyA9IFZJU19TRVJWRVI7CisJCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IFZJU19TRVJWRVI7CiAJZWxzZQogCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+VklTX1NFUlZFUjsKIAotCS8qIGNvdWxkIGJlIHJlYWQgYnkgcmVjZWl2ZV9iYXRfcGFja2V0KCkgKi8KIAlhdG9taWNfaW5jKCZiYXRtYW5faWYtPnNlcW5vKTsKIAogCXNsaWRlX293bl9iY2FzdF93aW5kb3coYmF0bWFuX2lmKTsKQEAgLTMwNiw3ICszMTUsNyBAQAogCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lOwogCiAJaWYgKGJhdG1hbl9wYWNrZXQtPnR0bCA8PSAxKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgInR0bCBleGNlZWRlZFxuIik7CisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJ0dGwgZXhjZWVkZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMzUsMTMgKzM0NCwxNiBAQAogCS8qIGFwcGx5IGhvcCBwZW5hbHR5ICovCiAJYmF0bWFuX3BhY2tldC0+dHEgPSBob3BfcGVuYWx0eShiYXRtYW5fcGFja2V0LT50cSk7CiAKLQliYXRfZGJnKERCR19CQVRNQU4sICJGb3J3YXJkaW5nIHBhY2tldDogdHFfb3JpZzogJWksIHRxX2F2ZzogJWksICIKKwliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAorCQkiRm9yd2FyZGluZyBwYWNrZXQ6IHRxX29yaWc6ICVpLCB0cV9hdmc6ICVpLCAiCiAJCSJ0cV9mb3J3OiAlaSwgdHRsX29yaWc6ICVpLCB0dGxfZm9ydzogJWlcbiIsCiAJCWluX3RxLCB0cV9hdmcsIGJhdG1hbl9wYWNrZXQtPnRxLCBpbl90dGwgLSAxLAogCQliYXRtYW5fcGFja2V0LT50dGwpOwogCi0JYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBodG9ucyhiYXRtYW5fcGFja2V0LT5zZXFubyk7CisJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBodG9ubChiYXRtYW5fcGFja2V0LT5zZXFubyk7CiAKKwkvKiBzd2l0Y2ggb2YgcHJpbWFyaWVzIGZpcnN0IGhvcCBmbGFnIHdoZW4gZm9yd2FyZGluZyAqLworCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5QUklNQVJJRVNfRklSU1RfSE9QOwogCWlmIChkaXJlY3RsaW5rKQogCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBESVJFQ1RMSU5LOwogCWVsc2UKQEAgLTM5Miw5ICs0MDQsMTIgQEAKIGludCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OworCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKKwkvKiBGSVhNRTogZWFjaCBiYXRtYW5faWYgd2lsbCBiZSBhdHRhY2hlZCB0byBhIHNvZnRpZiAqLworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2RldmljZSk7CiAKIAlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJjYXN0X3F1ZXVlX2xlZnQpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgImJjYXN0IHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgImJjYXN0IHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00MDcsNiArNDIyLDEwIEBACiAJaWYgKCFza2IpCiAJCWdvdG8gcGFja2V0X2ZyZWU7CiAKKwkvKiBhcyB3ZSBoYXZlIGEgY29weSBub3csIGl0IGlzIHNhZmUgdG8gZGVjcmVhc2UgdGhlIFRUTCAqLworCWJjYXN0X3BhY2tldCA9IChzdHJ1Y3QgYmNhc3RfcGFja2V0ICopc2tiLT5kYXRhOworCWJjYXN0X3BhY2tldC0+dHRsLS07CisKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJZm9yd19wYWNrZXQtPnNrYiA9IHNrYjsKQEAgLTQyNiw3ICs0NDUsNyBAQAogCXJldHVybiBORVRERVZfVFhfQlVTWTsKIH0KIAotdm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9CkBAIC00NTAsNyArNDY5LDcgQEAKIAkJc2tiMSA9IHNrYl9jb3B5KGZvcndfcGFja2V0LT5za2IsIEdGUF9BVE9NSUMpOwogCQlpZiAoc2tiMSkKIAkJCXNlbmRfc2tiX3BhY2tldChza2IxLAotCQkJCWJhdG1hbl9pZiwgYnJvYWRjYXN0QWRkcik7CisJCQkJYmF0bWFuX2lmLCBicm9hZGNhc3RfYWRkcik7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC01MDIsMTUgKzUyMSwxOSBAQAogCiB2b2lkIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQogeworCS8qIEZJWE1FOiBlYWNoIGJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OwogCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZSwgKnNhZmVfdG1wX25vZGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChiYXRtYW5faWYpCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgInB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKTogJXNcbiIsCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpOiAlc1xuIiwKIAkJCWJhdG1hbl9pZi0+ZGV2KTsKIAllbHNlCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgInB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKVxuIik7CisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpXG4iKTsKIAogCS8qIGZyZWUgYmNhc3QgbGlzdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZmb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oCmluZGV4IGZlYWEyZmMuLmI2NGM2MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmgKQEAgLTE5LDkgKzE5LDExIEBACiAgKgogICovCiAKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1NFTkRfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NFTkRfSF8KKwogI2luY2x1ZGUgInR5cGVzLmgiCiAKLXZvaWQgc2VuZF9vd25fcGFja2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGludCBzZW5kX3NrYl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsCiAJCQkJdWludDhfdCAqZHN0X2FkZHIpOwpAQCAtMzQsNiArMzYsNyBAQAogCQkJICAgICB1aW50OF90IGRpcmVjdGxpbmssIGludCBobmFfYnVmZl9sZW4sCiAJCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX291dGdvaW5nKTsKIGludCAgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1NFTkRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCmluZGV4IDUxYzQwYjcuLjJlYTk3ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAicm91dGluZy5oIgogI2luY2x1ZGUgInNlbmQuaCIKICNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogI2luY2x1ZGUgInR5cGVzLmgiCkBAIC0zMCwxMyArMzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAotc3RhdGljIHVpbnQxNl90IGJjYXN0X3NlcW5vID0gMTsgLyogZ2l2ZSBvd24gYmNhc3QgbWVzc2FnZXMgc2VxIG51bWJlcnMgdG8gYXZvaWQKK3N0YXRpYyB1aW50MzJfdCBiY2FzdF9zZXFubyA9IDE7IC8qIGdpdmUgb3duIGJjYXN0IG1lc3NhZ2VzIHNlcSBudW1iZXJzIHRvIGF2b2lkCiAJCQkJICAqIGJyb2FkY2FzdCBzdG9ybXMgKi8KIHN0YXRpYyBpbnQzMl90IHNrYl9wYWNrZXRzOwogc3RhdGljIGludDMyX3Qgc2tiX2JhZF9wYWNrZXRzOwogCi11bnNpZ25lZCBjaGFyIG1haW5JZkFkZHJbRVRIX0FMRU5dOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFpbklmQWRkcl9kZWZhdWx0W0VUSF9BTEVOXTsKK3Vuc2lnbmVkIGNoYXIgbWFpbl9pZl9hZGRyW0VUSF9BTEVOXTsKIHN0YXRpYyBpbnQgYmF0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCk7CiBzdGF0aWMgdm9pZCBiYXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKTsKQEAgLTU4LDEyICs1OCw3IEBACiAKIHZvaWQgc2V0X21haW5faWZfYWRkcih1aW50OF90ICphZGRyKQogewotCW1lbWNweShtYWluSWZBZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci19Ci0KLWludCBtYWluX2lmX3dhc191cCh2b2lkKQotewotCXJldHVybiAobWVtY21wKG1haW5JZkFkZHIsIG1haW5JZkFkZHJfZGVmYXVsdCwgRVRIX0FMRU4pICE9IDAgPyAxIDogMCk7CisJbWVtY3B5KG1haW5faWZfYWRkciwgYWRkciwgRVRIX0FMRU4pOwogfQogCiBpbnQgbXlfc2tiX3B1c2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKQEAgLTgzLDY5ICs3OCwyNSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiYXRfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPSBpbnRlcmZhY2Vfb3BlbiwKLQkubmRvX3N0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZSwKLQkubmRvX2dldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0cywKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHIsCi0JLm5kb19jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHUsCi0JLm5kb19zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4LAotCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyCi19OwotI2VuZGlmCi0KLXZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQljaGFyIGRldl9hZGRyW0VUSF9BTEVOXTsKLQotCWV0aGVyX3NldHVwKGRldik7Ci0KLSNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCi0JZGV2LT5uZXRkZXZfb3BzID0gJmJhdF9uZXRkZXZfb3BzOwotI2Vsc2UKLQlkZXYtPm9wZW4gPSBpbnRlcmZhY2Vfb3BlbjsKLQlkZXYtPnN0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZTsKLQlkZXYtPmdldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0czsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHI7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHU7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpbnRlcmZhY2VfdHg7Ci0jZW5kaWYKLQlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKLQotCWRldi0+bXR1ID0gaGFyZGlmX21pbl9tdHUoKTsKLQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEJBVF9IRUFERVJfTEVOOyAvKiByZXNlcnZlIG1vcmUgc3BhY2UgaW4gdGhlCi0JCQkJCQkqIHNrYnVmZiBmb3Igb3VyIGhlYWRlciAqLwotCi0JLyogZ2VuZXJhdGUgcmFuZG9tIGFkZHJlc3MgKi8KLQlyYW5kb21fZXRoZXJfYWRkcihkZXZfYWRkcik7Ci0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGRldl9hZGRyLCBFVEhfQUxFTik7Ci0KLQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmYmF0X2V0aHRvb2xfb3BzKTsKLQotCW1lbXNldChwcml2LCAwLCBzaXplb2Yoc3RydWN0IGJhdF9wcml2KSk7Ci19Ci0KLWludCBpbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBpbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBpbnRlcmZhY2VfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBpbnRlcmZhY2VfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmludGVyZmFjZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppbnRlcmZhY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYmF0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXJldHVybiAmcHJpdi0+c3RhdHM7CiB9CiAKLWludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCitzdGF0aWMgaW50IGludGVyZmFjZV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwogCkBAIC0xNjMsNyArMTE0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQorc3RhdGljIGludCBpbnRlcmZhY2VfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKIAkvKiBjaGVjayByYW5nZXMgKi8KIAlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiBoYXJkaWZfbWluX210dSgpKSkKQEAgLTE3OSw2ICsxMzAsNyBAQAogCXN0cnVjdCB1bmljYXN0X3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7CiAJc3RydWN0IGJjYXN0X3BhY2tldCAqYmNhc3RfcGFja2V0OwogCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOwogCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwpAQCAtMjA1LDE2ICsxNTcsMTcgQEAKIAogCQliY2FzdF9wYWNrZXQgPSAoc3RydWN0IGJjYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKIAkJYmNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisJCWJjYXN0X3BhY2tldC0+dHRsID0gVFRMOwogCiAJCS8qIGJhdG1hbiBwYWNrZXQgdHlwZTogYnJvYWRjYXN0ICovCiAJCWJjYXN0X3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfQkNBU1Q7CiAKIAkJLyogaHcgYWRkcmVzcyBvZiBmaXJzdCBpbnRlcmZhY2UgaXMgdGhlIG9yaWcgbWFjIGJlY2F1c2Ugb25seQogCQkgKiB0aGlzIG1hYyBpcyBrbm93biB0aHJvdWdob3V0IHRoZSBtZXNoICovCi0JCW1lbWNweShiY2FzdF9wYWNrZXQtPm9yaWcsIG1haW5JZkFkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJjYXN0X3BhY2tldC0+b3JpZywgbWFpbl9pZl9hZGRyLCBFVEhfQUxFTik7CiAKIAkJLyogc2V0IGJyb2FkY2FzdCBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJYmNhc3RfcGFja2V0LT5zZXFubyA9IGh0b25zKGJjYXN0X3NlcW5vKTsKKwkJYmNhc3RfcGFja2V0LT5zZXFubyA9IGh0b25sKGJjYXN0X3NlcW5vKTsKIAogCQkvKiBicm9hZGNhc3QgcGFja2V0LiBvbiBzdWNjZXNzLCBpbmNyZWFzZSBzZXFuby4gKi8KIAkJaWYgKGFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChza2IpID09IE5FVERFVl9UWF9PSykKQEAgLTIzNSwzOCArMTg4LDM2IEBACiAJCWlmICghb3JpZ19ub2RlKQogCQkJb3JpZ19ub2RlID0gdHJhbnN0YWJsZV9zZWFyY2goZXRoaGRyLT5oX2Rlc3QpOwogCi0JCWlmICgob3JpZ19ub2RlKSAmJgotCQkgICAgKG9yaWdfbm9kZS0+cm91dGVyKSkgewotCQkJc3RydWN0IG5laWdoX25vZGUgKnJvdXRlciA9IG9yaWdfbm9kZS0+cm91dGVyOworCQlyb3V0ZXIgPSBmaW5kX3JvdXRlcihvcmlnX25vZGUsIE5VTEwpOwogCi0JCQlpZiAobXlfc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSkgPCAwKQotCQkJCWdvdG8gdW5sb2NrOwotCi0JCQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkJCXVuaWNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047Ci0JCQkvKiBiYXRtYW4gcGFja2V0IHR5cGU6IHVuaWNhc3QgKi8KLQkJCXVuaWNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9VTklDQVNUOwotCQkJLyogc2V0IHVuaWNhc3QgdHRsICovCi0JCQl1bmljYXN0X3BhY2tldC0+dHRsID0gVFRMOwotCQkJLyogY29weSB0aGUgZGVzdGluYXRpb24gZm9yIGZhc3RlciByb3V0aW5nICovCi0JCQltZW1jcHkodW5pY2FzdF9wYWNrZXQtPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCi0JCQkvKiBuZXRfZGV2IHdvbid0IGJlIGF2YWlsYWJsZSB3aGVuIG5vdCBhY3RpdmUgKi8KLQkJCWlmIChyb3V0ZXItPmlmX2luY29taW5nLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQkJCWdvdG8gdW5sb2NrOwotCi0JCQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkJICogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwotCi0JCQliYXRtYW5faWYgPSByb3V0ZXItPmlmX2luY29taW5nOwotCQkJbWVtY3B5KGRzdGFkZHIsIHJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCQkJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQkJfSBlbHNlIHsKKwkJaWYgKCFyb3V0ZXIpCiAJCQlnb3RvIHVubG9jazsKLQkJfQorCisJCS8qIGRvbid0IGxvY2sgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0cyAuLi4gd2UgdGhlcmVmb3JlCisJCSAqIGNvcHkgdGhlIHJlcXVpcmVkIGRhdGEgYmVmb3JlIHNlbmRpbmcgKi8KKworCQliYXRtYW5faWYgPSByb3V0ZXItPmlmX2luY29taW5nOworCQltZW1jcHkoZHN0YWRkciwgcm91dGVyLT5hZGRyLCBFVEhfQUxFTik7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQorCQkJZ290byBkcm9wcGVkOworCisJCWlmIChteV9za2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpKSA8IDApCisJCQlnb3RvIGRyb3BwZWQ7CisKKwkJdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOworCisJCXVuaWNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisJCS8qIGJhdG1hbiBwYWNrZXQgdHlwZTogdW5pY2FzdCAqLworCQl1bmljYXN0X3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfVU5JQ0FTVDsKKwkJLyogc2V0IHVuaWNhc3QgdHRsICovCisJCXVuaWNhc3RfcGFja2V0LT50dGwgPSBUVEw7CisJCS8qIGNvcHkgdGhlIGRlc3RpbmF0aW9uIGZvciBmYXN0ZXIgcm91dGluZyAqLworCQltZW1jcHkodW5pY2FzdF9wYWNrZXQtPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCisJCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7CiAJfQogCiAJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwpAQCAtMzE1LDYgKzI2Niw1MCBAQAogCW5ldGlmX3J4KHNrYik7CiB9CiAKKyNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJhdF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9IGludGVyZmFjZV9vcGVuLAorCS5uZG9fc3RvcCA9IGludGVyZmFjZV9yZWxlYXNlLAorCS5uZG9fZ2V0X3N0YXRzID0gaW50ZXJmYWNlX3N0YXRzLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gaW50ZXJmYWNlX3NldF9tYWNfYWRkciwKKwkubmRvX2NoYW5nZV9tdHUgPSBpbnRlcmZhY2VfY2hhbmdlX210dSwKKwkubmRvX3N0YXJ0X3htaXQgPSBpbnRlcmZhY2VfdHgsCisJLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2FkZHIKK307CisjZW5kaWYKKwordm9pZCBpbnRlcmZhY2Vfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNoYXIgZGV2X2FkZHJbRVRIX0FMRU5dOworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKKwlkZXYtPm5ldGRldl9vcHMgPSAmYmF0X25ldGRldl9vcHM7CisjZWxzZQorCWRldi0+b3BlbiA9IGludGVyZmFjZV9vcGVuOworCWRldi0+c3RvcCA9IGludGVyZmFjZV9yZWxlYXNlOworCWRldi0+Z2V0X3N0YXRzID0gaW50ZXJmYWNlX3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gaW50ZXJmYWNlX3NldF9tYWNfYWRkcjsKKwlkZXYtPmNoYW5nZV9tdHUgPSBpbnRlcmZhY2VfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGludGVyZmFjZV90eDsKKyNlbmRpZgorCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCisJZGV2LT5tdHUgPSBoYXJkaWZfbWluX210dSgpOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQkFUX0hFQURFUl9MRU47IC8qIHJlc2VydmUgbW9yZSBzcGFjZSBpbiB0aGUKKwkJCQkJCSogc2tidWZmIGZvciBvdXIgaGVhZGVyICovCisKKwkvKiBnZW5lcmF0ZSByYW5kb20gYWRkcmVzcyAqLworCXJhbmRvbV9ldGhlcl9hZGRyKGRldl9hZGRyKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCVNFVF9FVEhUT09MX09QUyhkZXYsICZiYXRfZXRodG9vbF9vcHMpOworCisJbWVtc2V0KHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpKTsKK30KKwogLyogZXRodG9vbCAqLwogc3RhdGljIGludCBiYXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKaW5kZXggZTdmNTlhZi4uNjM2NDg1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oCkBAIC0xOSwxNiArMTksMTUgQEAKICAqCiAgKi8KIAorI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU09GVF9JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NPRlRfSU5URVJGQUNFX0hfCisKIHZvaWQgc2V0X21haW5faWZfYWRkcih1aW50OF90ICphZGRyKTsKLWludCBtYWluX2lmX3dhc191cCh2b2lkKTsKIHZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGludGVyZmFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGludGVyZmFjZV9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmludGVyZmFjZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOwotaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKIGludCBpbnRlcmZhY2VfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIGludGVyZmFjZV9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpOwogaW50IG15X3NrYl9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pOwogCi1leHRlcm4gdW5zaWduZWQgY2hhciBtYWluSWZBZGRyW107CitleHRlcm4gdW5zaWduZWQgY2hhciBtYWluX2lmX2FkZHJbXTsKKworI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9TT0ZUX0lOVEVSRkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LWJhdG1hbi1hZHYgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtYmF0bWFuLWFkdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGRkNzYyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtYmF0bWFuLWFkdgpAQCAtMCwwICsxLDE0IEBACisKK1doYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88aWZhY2U+L2JhdG1hbi1hZHYvbWVzaF9pZmFjZQorRGF0ZTogICAgICAgICAgIE1heSAyMDEwCitDb250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KK0Rlc2NyaXB0aW9uOgorICAgICAgICAgICAgICAgIFRoZSAvc3lzL2NsYXNzL25ldC88aWZhY2U+L2JhdG1hbi1hZHYvbWVzaF9pZmFjZSBmaWxlCisgICAgICAgICAgICAgICAgZGlzcGxheXMgdGhlIGJhdG1hbiBtZXNoIGludGVyZmFjZSB0aGlzIDxpZmFjZT4KKyAgICAgICAgICAgICAgICBjdXJyZW50bHkgaXMgYXNzb2NpYXRlZCB3aXRoLgorCitXaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9iYXRtYW4tYWR2L2lmYWNlX3N0YXR1cworRGF0ZTogICAgICAgICAgIE1heSAyMDEwCitDb250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KK0Rlc2NyaXB0aW9uOgorICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIDxpZmFjZT4gYXMgaXQgaXMgc2VlbiBieSBiYXRtYW4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtbWVzaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3N5c2ZzLWNsYXNzLW5ldC1tZXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTE5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtbWVzaApAQCAtMCwwICsxLDMzIEBACisKK1doYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC9hZ2dyZWdhdGVkX29nbXMKK0RhdGU6ICAgICAgICAgICBNYXkgMjAxMAorQ29udGFjdDogICAgICAgIE1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+CitEZXNjcmlwdGlvbjoKKyAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYmF0bWFuIHByb3RvY29sIG1lc3NhZ2VzIG9mIHRoZQorICAgICAgICAgICAgICAgIG1lc2ggPG1lc2hfaWZhY2U+IHNoYWxsIGJlIGFnZ3JlZ2F0ZWQgb3Igbm90LgorCitXaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvYm9uZGluZworRGF0ZTogICAgICAgICAgIEp1bmUgMjAxMAorQ29udGFjdDogICAgICAgIFNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgorRGVzY3JpcHRpb246CisgICAgICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdHJhZmZpYyBnb2luZyB0aHJvdWdoIHRoZQorICAgICAgICAgICAgICAgIG1lc2ggd2lsbCBiZSBzZW50IHVzaW5nIG11bHRpcGxlIGludGVyZmFjZXMgYXQgdGhlCisgICAgICAgICAgICAgICAgc2FtZSB0aW1lIChpZiBhdmFpbGFibGUpLgorCitXaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvb3JpZ19pbnRlcnZhbAorRGF0ZTogICAgICAgICAgIE1heSAyMDEwCitDb250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KK0Rlc2NyaXB0aW9uOgorICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBpbiB3aGljaCBiYXRtYW4KKyAgICAgICAgICAgICAgICBzZW5kcyBpdHMgcHJvdG9jb2wgbWVzc2FnZXMuCisKK1doYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC92aXNfbW9kZQorRGF0ZTogICAgICAgICAgIE1heSAyMDEwCitDb250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KK0Rlc2NyaXB0aW9uOgorICAgICAgICAgICAgICAgIEVhY2ggYmF0bWFuIG5vZGUgb25seSBtYWludGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaXRzCisgICAgICAgICAgICAgICAgb3duIGxvY2FsIG5laWdoYm9yaG9vZCwgdGhlcmVmb3JlIGdlbmVyYXRpbmcgZ3JhcGhzCisgICAgICAgICAgICAgICAgc2hvd2luZyB0aGUgdG9wb2xvZ3kgb2YgdGhlIGVudGlyZSBtZXNoIGlzIG5vdCBlYXNpbHkKKyAgICAgICAgICAgICAgICBmZWFzaWJsZSB3aXRob3V0IGhhdmluZyBhIGNlbnRyYWwgaW5zdGFuY2UgdG8gY29sbGVjdAorICAgICAgICAgICAgICAgIHRoZSBsb2NhbCB0b3BvbG9naWVzIGZyb20gYWxsIG5vZGVzLiBUaGlzIGZpbGUgYWxsb3dzCisgICAgICAgICAgICAgICAgdG8gYWN0aXZhdGUgdGhlIGNvbGxlY3RpbmcgKHNlcnZlcikgbW9kZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCmluZGV4IGUwMWZmMjEuLmIyMzMzNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYwpAQCAtMzIsNyArMzIsMTAgQEAKIERFRklORV9TUElOTE9DSyhobmFfbG9jYWxfaGFzaF9sb2NrKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG5hX2dsb2JhbF9oYXNoX2xvY2spOwogCitzdGF0aWMgdm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhobmFfbG9jYWxfcHVyZ2Vfd3EsIGhuYV9sb2NhbF9wdXJnZSk7CitzdGF0aWMgdm9pZCBfaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeSwKKwkJCQkgY2hhciAqbWVzc2FnZSk7CiAKIHN0YXRpYyB2b2lkIGhuYV9sb2NhbF9zdGFydF90aW1lcih2b2lkKQogewpAQCAtNTcsNiArNjAsOCBAQAogCiB2b2lkIGhuYV9sb2NhbF9hZGQodWludDhfdCAqYWRkcikKIHsKKwkvKiBGSVhNRTogZWFjaCBvcmlnX25vZGUtPmJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CiAJc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKQEAgLTc3LDE1ICs4MiwxNSBAQAogCSAgIE1BQy1mbG9vZGluZy4gKi8KIAlpZiAoKG51bV9obmEgKyAxID4gKEVUSF9EQVRBX0xFTiAtIEJBVF9QQUNLRVRfTEVOKSAvIEVUSF9BTEVOKSB8fAogCSAgICAobnVtX2huYSArIDEgPiAyNTUpKSB7Ci0JCWJhdF9kYmcoREJHX1JPVVRFUywKKwkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKIAkJCSJDYW4ndCBhZGQgbmV3IGxvY2FsIGhuYSBlbnRyeSAoJXBNKTogIgogCQkJIm51bWJlciBvZiBsb2NhbCBobmEgZW50cmllcyBleGNlZWRzIHBhY2tldCBzaXplXG4iLAogCQkJYWRkcik7CiAJCXJldHVybjsKIAl9CiAKLQliYXRfZGJnKERCR19ST1VURVMsICJDcmVhdGluZyBuZXcgbG9jYWwgaG5hIGVudHJ5OiAlcE1cbiIsCi0JCWFkZHIpOworCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCisJCSJDcmVhdGluZyBuZXcgbG9jYWwgaG5hIGVudHJ5OiAlcE1cbiIsIGFkZHIpOwogCiAJaG5hX2xvY2FsX2VudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmICghaG5hX2xvY2FsX2VudHJ5KQpAQCAtMTExLDggKzExNiw3IEBACiAJCQkJICAgICAgIGhuYV9sb2NhbF9oYXNoLT5zaXplICogMik7CiAKIAkJaWYgKHN3YXBoYXNoID09IE5VTEwpCi0JCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IgotCQkJICAgICAgICJDb3VsZG4ndCByZXNpemUgbG9jYWwgaG5hIGhhc2ggdGFibGVcbiIpOworCQkJcHJfZXJyKCJDb3VsZG4ndCByZXNpemUgbG9jYWwgaG5hIGhhc2ggdGFibGVcbiIpOwogCQllbHNlCiAJCQlobmFfbG9jYWxfaGFzaCA9IHN3YXBoYXNoOwogCX0KQEAgLTE2MCw1OSArMTY0LDU0IEBACiAJcmV0dXJuIGk7CiB9CiAKLWludCBobmFfbG9jYWxfZmlsbF9idWZmZXJfdGV4dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgY2hhciAqYnVmZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBvZmYpCitpbnQgaG5hX2xvY2FsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKIAlIQVNISVQoaGFzaGl0KTsKLQlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJSEFTSElUKGhhc2hpdF9jb3VudCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaXplX3QgaGRyX2xlbjsKKwlzaXplX3QgYnVmX3NpemUsIHBvczsKKwljaGFyICpidWZmOwogCiAJaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikgewotCQlpZiAob2ZmID09IDApCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmLAotCQkJCSAgICAgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgotCQkJCSAgICAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAotCQkJCSAgICAgbmV0X2Rldi0+bmFtZSk7Ci0KLQkJcmV0dXJuIDA7CisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgorCQkJICAgICAgICJwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdFxuIiwKKwkJCSAgICAgICBuZXRfZGV2LT5uYW1lKTsKIAl9CiAKLQloZHJfbGVuID0gc3ByaW50ZihidWZmLAotCQkJICAiTG9jYWxseSByZXRyaWV2ZWQgYWRkcmVzc2VzIChmcm9tICVzKSAiCi0JCQkgICJhbm5vdW5jZWQgdmlhIEhOQTpcbiIsCi0JCQkgIG5ldF9kZXYtPm5hbWUpOwotCi0JaWYgKG9mZiA8IGhkcl9sZW4pCi0JCWJ5dGVzX3dyaXR0ZW4gPSBoZHJfbGVuOworCXNlcV9wcmludGYoc2VxLCAiTG9jYWxseSByZXRyaWV2ZWQgYWRkcmVzc2VzIChmcm9tICVzKSAiCisJCSAgICJhbm5vdW5jZWQgdmlhIEhOQTpcbiIsCisJCSAgIG5ldF9kZXYtPm5hbWUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKIAorCWJ1Zl9zaXplID0gMTsKKwkvKiBFc3RpbWF0ZSBsZW5ndGggZm9yOiAiICogeHg6eHg6eHg6eHg6eHg6eHhcbiIgKi8KKwl3aGlsZSAoaGFzaF9pdGVyYXRlKGhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0X2NvdW50KSkKKwkJYnVmX3NpemUgKz0gMjE7CisKKwlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWZmKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJ1ZmZbMF0gPSAnXDAnOworCXBvcyA9IDA7CisKIAl3aGlsZSAoaGFzaF9pdGVyYXRlKGhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0KSkgewotCQloZHJfbGVuICs9IDIxOwotCi0JCWlmIChjb3VudCA8IGJ5dGVzX3dyaXR0ZW4gKyAyMikKLQkJCWJyZWFrOwotCi0JCWlmIChvZmYgPj0gaGRyX2xlbikKLQkJCWNvbnRpbnVlOwotCiAJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7CiAKLQkJYnl0ZXNfd3JpdHRlbiArPSBzbnByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiwgMjIsCi0JCQkJCSAgIiAqICIgTUFDX0ZNVCAiXG4iLAotCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkclswXSwKLQkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbMV0sCi0JCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzJdLAotCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkclszXSwKLQkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbNF0sCi0JCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzVdKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDIyLCAiICogJXBNXG4iLAorCQkJCWhuYV9sb2NhbF9lbnRyeS0+YWRkcik7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiBieXRlc193cml0dGVuOworCisJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOworCWtmcmVlKGJ1ZmYpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfaG5hX2xvY2FsX2RlbCh2b2lkICpkYXRhKQpAQCAtMjI1LDcgKzIyNCw5IEBACiBzdGF0aWMgdm9pZCBobmFfbG9jYWxfZGVsKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeSwKIAkJCSAgY2hhciAqbWVzc2FnZSkKIHsKLQliYXRfZGJnKERCR19ST1VURVMsICJEZWxldGluZyBsb2NhbCBobmEgZW50cnkgKCVwTSk6ICVzXG4iLAorCS8qIEZJWE1FOiBlYWNoIG9yaWdfbm9kZS0+YmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOworCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsICJEZWxldGluZyBsb2NhbCBobmEgZW50cnkgKCVwTSk6ICVzXG4iLAogCQlobmFfbG9jYWxfZW50cnktPmFkZHIsIG1lc3NhZ2UpOwogCiAJaGFzaF9yZW1vdmUoaG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeS0+YWRkcik7CkBAIC0yNDcsNyArMjQ4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgaG5hX2xvY2FsX3B1cmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGhuYV9sb2NhbF9wdXJnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwogCUhBU0hJVChoYXNoaXQpOwpAQCAtMjU5LDggKzI2MCw3IEBACiAJd2hpbGUgKGhhc2hfaXRlcmF0ZShobmFfbG9jYWxfaGFzaCwgJmhhc2hpdCkpIHsKIAkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKIAotCQl0aW1lb3V0ID0gaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gKwotCQkJKChMT0NBTF9ITkFfVElNRU9VVCAvIDEwMDApICogSFopOworCQl0aW1lb3V0ID0gaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gKyBMT0NBTF9ITkFfVElNRU9VVCAqIEhaOwogCQlpZiAoKCFobmFfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlKSAmJgogCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKIAkJCWhuYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5LCAiYWRkcmVzcyB0aW1lZCBvdXQiKTsKQEAgLTI5Niw2ICsyOTYsOCBAQAogdm9pZCBobmFfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKIAkJCSB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbikKIHsKKwkvKiBGSVhNRTogZWFjaCBvcmlnX25vZGUtPmJhdG1hbl9pZiB3aWxsIGJlIGF0dGFjaGVkIHRvIGEgc29mdGlmICovCisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfZGV2aWNlKTsKIAlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKIAlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKQEAgLTMyMiw3ICszMjQsNyBAQAogCiAJCQltZW1jcHkoaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwgaG5hX3B0ciwgRVRIX0FMRU4pOwogCi0JCQliYXRfZGJnKERCR19ST1VURVMsCisJCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAogCQkJCSJDcmVhdGluZyBuZXcgZ2xvYmFsIGhuYSBlbnRyeTogIgogCQkJCSIlcE0gKHZpYSAlcE0pXG4iLAogCQkJCWhuYV9nbG9iYWxfZW50cnktPmFkZHIsIG9yaWdfbm9kZS0+b3JpZyk7CkBAIC0zNjksOCArMzcxLDcgQEAKIAkJCQkgICAgICAgaG5hX2dsb2JhbF9oYXNoLT5zaXplICogMik7CiAKIAkJaWYgKHN3YXBoYXNoID09IE5VTEwpCi0JCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IgotCQkJICAgICAgICJDb3VsZG4ndCByZXNpemUgZ2xvYmFsIGhuYSBoYXNoIHRhYmxlXG4iKTsKKwkJCXByX2VycigiQ291bGRuJ3QgcmVzaXplIGdsb2JhbCBobmEgaGFzaCB0YWJsZVxuIik7CiAJCWVsc2UKIAkJCWhuYV9nbG9iYWxfaGFzaCA9IHN3YXBoYXNoOwogCX0KQEAgLTM3OCw3MSArMzc5LDYzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKIH0KIAotaW50IGhuYV9nbG9iYWxfZmlsbF9idWZmZXJfdGV4dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgY2hhciAqYnVmZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCBvZmYpCitpbnQgaG5hX2dsb2JhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKIAlIQVNISVQoaGFzaGl0KTsKLQlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJSEFTSElUKGhhc2hpdF9jb3VudCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaXplX3QgaGRyX2xlbjsKKwlzaXplX3QgYnVmX3NpemUsIHBvczsKKwljaGFyICpidWZmOwogCiAJaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikgewotCQlpZiAob2ZmID09IDApCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmLAotCQkJCSAgICAgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgotCQkJCSAgICAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAotCQkJCSAgICAgbmV0X2Rldi0+bmFtZSk7Ci0KLQkJcmV0dXJuIDA7CisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgorCQkJCSAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAorCQkJCSAgbmV0X2Rldi0+bmFtZSk7CiAJfQogCi0JaGRyX2xlbiA9IHNwcmludGYoYnVmZiwKLQkJCSAgIkdsb2JhbGx5IGFubm91bmNlZCBITkFzIHJlY2VpdmVkIHZpYSB0aGUgbWVzaCAlcyAiCi0JCQkgICIodHJhbnNsYXRpb24gdGFibGUpOlxuIiwKLQkJCSAgbmV0X2Rldi0+bmFtZSk7Ci0KLQlpZiAob2ZmIDwgaGRyX2xlbikKLQkJYnl0ZXNfd3JpdHRlbiA9IGhkcl9sZW47CisJc2VxX3ByaW50ZihzZXEsICJHbG9iYWxseSBhbm5vdW5jZWQgSE5BcyByZWNlaXZlZCB2aWEgdGhlIG1lc2ggJXNcbiIsCisJCSAgIG5ldF9kZXYtPm5hbWUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CiAKKwlidWZfc2l6ZSA9IDE7CisJLyogRXN0aW1hdGUgbGVuZ3RoIGZvcjogIiAqIHh4Onh4Onh4Onh4Onh4Onh4IHZpYSB4eDp4eDp4eDp4eDp4eDp4eFxuIiovCisJd2hpbGUgKGhhc2hfaXRlcmF0ZShobmFfZ2xvYmFsX2hhc2gsICZoYXNoaXRfY291bnQpKQorCQlidWZfc2l6ZSArPSA0MzsKKworCWJ1ZmYgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1ZmYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJ1ZmZbMF0gPSAnXDAnOworCXBvcyA9IDA7CisKIAl3aGlsZSAoaGFzaF9pdGVyYXRlKGhuYV9nbG9iYWxfaGFzaCwgJmhhc2hpdCkpIHsKLQkJaGRyX2xlbiArPSA0MzsKLQotCQlpZiAoY291bnQgPCBieXRlc193cml0dGVuICsgNDQpCi0JCQlicmVhazsKLQotCQlpZiAob2ZmID49IGhkcl9sZW4pCi0JCQljb250aW51ZTsKLQogCQlobmFfZ2xvYmFsX2VudHJ5ID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKIAotCQlieXRlc193cml0dGVuICs9IHNucHJpbnRmKGJ1ZmYgKyBieXRlc193cml0dGVuLCA0NCwKLQkJCQkJICAiICogIiBNQUNfRk1UICIgdmlhICIgTUFDX0ZNVCAiXG4iLAotCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbMF0sCi0JCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkclsxXSwKLQkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzJdLAotCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbM10sCi0JCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcls0XSwKLQkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzVdLAotCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1swXSwKLQkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbMV0sCi0JCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzJdLAotCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1szXSwKLQkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbNF0sCi0JCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzVdKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDQ0LAorCQkJCSIgKiAlcE0gdmlhICVwTVxuIiwgaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwKKwkJCQlobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmZik7CisJa2ZyZWUoYnVmZik7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX2huYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnksCi0JCQkgIGNoYXIgKm1lc3NhZ2UpCitzdGF0aWMgdm9pZCBfaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeSwKKwkJCQkgY2hhciAqbWVzc2FnZSkKIHsKLQliYXRfZGJnKERCR19ST1VURVMsICJEZWxldGluZyBnbG9iYWwgaG5hIGVudHJ5ICVwTSAodmlhICVwTSk6ICVzXG4iLAorCS8qIEZJWE1FOiBlYWNoIG9yaWdfbm9kZS0+YmF0bWFuX2lmIHdpbGwgYmUgYXR0YWNoZWQgdG8gYSBzb2Z0aWYgKi8KKwlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9kZXZpY2UpOworCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCisJCSJEZWxldGluZyBnbG9iYWwgaG5hIGVudHJ5ICVwTSAodmlhICVwTSk6ICVzXG4iLAogCQlobmFfZ2xvYmFsX2VudHJ5LT5hZGRyLCBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcsCiAJCW1lc3NhZ2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaAppbmRleCA4ZjQxMmZjLi5mYTkzZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKQEAgLTE5LDIzICsxOSwyMSBAQAogICoKICAqLwogCisjaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9UUkFOU0xBVElPTl9UQUJMRV9IXworI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfVFJBTlNMQVRJT05fVEFCTEVfSF8KKwogI2luY2x1ZGUgInR5cGVzLmgiCiAKIGludCBobmFfbG9jYWxfaW5pdCh2b2lkKTsKIHZvaWQgaG5hX2xvY2FsX2FkZCh1aW50OF90ICphZGRyKTsKIHZvaWQgaG5hX2xvY2FsX3JlbW92ZSh1aW50OF90ICphZGRyLCBjaGFyICptZXNzYWdlKTsKIGludCBobmFfbG9jYWxfZmlsbF9idWZmZXIodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKTsKLWludCBobmFfbG9jYWxfZmlsbF9idWZmZXJfdGV4dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgY2hhciAqYnVmZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBvZmYpOwotdm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2ludCBobmFfbG9jYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiB2b2lkIGhuYV9sb2NhbF9mcmVlKHZvaWQpOwogaW50IGhuYV9nbG9iYWxfaW5pdCh2b2lkKTsKIHZvaWQgaG5hX2dsb2JhbF9hZGRfb3JpZyhzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLAogCQkJIGludCBobmFfYnVmZl9sZW4pOwotaW50IGhuYV9nbG9iYWxfZmlsbF9idWZmZXJfdGV4dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgY2hhciAqYnVmZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCBvZmYpOwotdm9pZCBfaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeSwKLQkJCSAgY2hhciAqb3JpZ19zdHIpOworaW50IGhuYV9nbG9iYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiB2b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKTsKIHZvaWQgaG5hX2dsb2JhbF9mcmVlKHZvaWQpOwogc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2godWludDhfdCAqYWRkcik7CkBAIC00MywzICs0MSw1IEBACiBleHRlcm4gc3BpbmxvY2tfdCBobmFfbG9jYWxfaGFzaF9sb2NrOwogZXh0ZXJuIHN0cnVjdCBoYXNodGFibGVfdCAqaG5hX2xvY2FsX2hhc2g7CiBleHRlcm4gYXRvbWljX3QgaG5hX2xvY2FsX2NoYW5nZWQ7CisKKyNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVFJBTlNMQVRJT05fVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCmluZGV4IDg2MDA3YzcuLjIxZDA3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHlwZXMuaApAQCAtMjEsMTAgKzIxLDggQEAKIAogCiAKLQotCi0jaWZuZGVmIFRZUEVTX0gKLSNkZWZpbmUgVFlQRVNfSAorI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfVFlQRVNfSF8KKyNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1RZUEVTX0hfCiAKICNpbmNsdWRlICJwYWNrZXQuaCIKICNpbmNsdWRlICJiaXRhcnJheS5oIgpAQCAtNTIsNiArNTAsNyBAQAogCiAvKioKICAgKglvcmlnX25vZGUgLSBzdHJ1Y3R1cmUgZm9yIG9yaWdfbGlzdCBtYWludGFpbmluZyBub2RlcyBvZiBtZXNoCisgICoJQHByaW1hcnlfYWRkcjogaG9zdHMgcHJpbWFyeSBpbnRlcmZhY2UgYWRkcmVzcwogICAqCUBsYXN0X3ZhbGlkOiB3aGVuIGxhc3QgcGFja2V0IGZyb20gdGhpcyBub2RlIHdhcyByZWNlaXZlZAogICAqCUBiY2FzdF9zZXFub19yZXNldDogdGltZSB3aGVuIHRoZSBicm9hZGNhc3Qgc2Vxbm8gd2luZG93IHdhcyByZXNldAogICAqCUBiYXRtYW5fc2Vxbm9fcmVzZXQ6IHRpbWUgd2hlbiB0aGUgYmF0bWFuIHNlcW5vIHdpbmRvdyB3YXMgcmVzZXQKQEAgLTU5LDkgKzU4LDEzIEBACiAgICoJQGxhc3RfcmVhbF9zZXFubzogbGFzdCBhbmQgYmVzdCBrbm93biBzcXVlbmNlIG51bWJlcgogICAqCUBsYXN0X3R0bDogdHRsIG9mIGxhc3QgcmVjZWl2ZWQgcGFja2V0CiAgICoJQGxhc3RfYmNhc3Rfc2Vxbm86IGxhc3QgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCBieSB0aGlzIGhvc3QKKyAgKgorICAqCUBjYW5kaWRhdGVzOiBob3cgbWFueSBjYW5kaWRhdGVzIGFyZSBhdmFpbGFibGUKKyAgKglAc2VsZWN0ZWQ6IG5leHQgYm9uZGluZyBjYW5kaWRhdGUKICAqLwogc3RydWN0IG9yaWdfbm9kZSB7CiAJdWludDhfdCBvcmlnW0VUSF9BTEVOXTsKKwl1aW50OF90IHByaW1hcnlfYWRkcltFVEhfQUxFTl07CiAJc3RydWN0IG5laWdoX25vZGUgKnJvdXRlcjsKIAlUWVBFX09GX1dPUkQgKmJjYXN0X293bjsKIAl1aW50OF90ICpiY2FzdF9vd25fc3VtOwpAQCAtNzIsMTIgKzc1LDE2IEBACiAJdW5zaWduZWQgbG9uZyBiYXRtYW5fc2Vxbm9fcmVzZXQ7CiAJdWludDhfdCAgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7Ci0JaW50MTZfdCAgaG5hX2J1ZmZfbGVuOwotCXVpbnQxNl90IGxhc3RfcmVhbF9zZXFubzsKKwlpbnQxNl90IGhuYV9idWZmX2xlbjsKKwl1aW50MzJfdCBsYXN0X3JlYWxfc2Vxbm87CiAJdWludDhfdCBsYXN0X3R0bDsKIAlUWVBFX09GX1dPUkQgYmNhc3RfYml0c1tOVU1fV09SRFNdOwotCXVpbnQxNl90IGxhc3RfYmNhc3Rfc2Vxbm87CisJdWludDMyX3QgbGFzdF9iY2FzdF9zZXFubzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5laWdoX2xpc3Q7CisJc3RydWN0IHsKKwkJdWludDhfdCBjYW5kaWRhdGVzOworCQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqc2VsZWN0ZWQ7CisJfSBib25kOwogfTsKIAogLyoqCkBAIC05Miw2ICs5OSw3IEBACiAJdWludDhfdCB0cV9pbmRleDsKIAl1aW50OF90IHRxX2F2ZzsKIAl1aW50OF90IGxhc3RfdHRsOworCXN0cnVjdCBuZWlnaF9ub2RlICpuZXh0X2JvbmRfY2FuZGlkYXRlOwogCXVuc2lnbmVkIGxvbmcgbGFzdF92YWxpZDsKIAlUWVBFX09GX1dPUkQgcmVhbF9iaXRzW05VTV9XT1JEU107CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwpAQCAtMTAxLDE0ICsxMDksMTggQEAKIHN0cnVjdCBiYXRfcHJpdiB7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJYXRvbWljX3QgYWdncmVnYXRpb25fZW5hYmxlZDsKKwlhdG9taWNfdCBib25kaW5nX2VuYWJsZWQ7CiAJYXRvbWljX3QgdmlzX21vZGU7CiAJYXRvbWljX3Qgb3JpZ19pbnRlcnZhbDsKKwlhdG9taWNfdCBsb2dfbGV2ZWw7CiAJY2hhciBudW1faWZhY2VzOworCXN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZzsKIAlzdHJ1Y3QgYmF0bWFuX2lmICpwcmltYXJ5X2lmOwogCXN0cnVjdCBrb2JqZWN0ICptZXNoX29iajsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7CiB9OwogCi1zdHJ1Y3QgZGV2aWNlX2NsaWVudCB7CitzdHJ1Y3Qgc29ja2V0X2NsaWVudCB7CiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZV9saXN0OwogCXVuc2lnbmVkIGludCBxdWV1ZV9sZW47CiAJdW5zaWduZWQgY2hhciBpbmRleDsKQEAgLTExNiw5ICsxMjgsMTAgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZV93YWl0OwogfTsKIAotc3RydWN0IGRldmljZV9wYWNrZXQgeworc3RydWN0IHNvY2tldF9wYWNrZXQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgaWNtcF9wYWNrZXQgaWNtcF9wYWNrZXQ7CisJc2l6ZV90IGljbXBfbGVuOworCXN0cnVjdCBpY21wX3BhY2tldF9yciBpY21wX3BhY2tldDsKIH07CiAKIHN0cnVjdCBobmFfbG9jYWxfZW50cnkgewpAQCAtMTU5LDQgKzE3MiwxMiBAQAogCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CiB9OwogCi0jZW5kaWYKK3N0cnVjdCBkZWJ1Z19sb2cgeworCWNoYXIgbG9nX2J1ZmZbTE9HX0JVRl9MRU5dOworCXVuc2lnbmVkIGxvbmcgbG9nX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgbG9nX2VuZDsKKwlzcGlubG9ja190IGxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWVfd2FpdDsKK307CisKKyNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmMKaW5kZXggMWQzZDk1NC4uNGI2YTUwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jCkBAIC00Myw4ICs0Myw4IEBACiAJCQlfZHVtbXkgPiBzbWFsbGVzdF9zaWduZWRfaW50KF9kdW1teSk7IH0pCiAjZGVmaW5lIHNlcV9hZnRlcih4LCB5KSBzZXFfYmVmb3JlKHksIHgpCiAKLXN0cnVjdCBoYXNodGFibGVfdCAqdmlzX2hhc2g7Ci1ERUZJTkVfU1BJTkxPQ0sodmlzX2hhc2hfbG9jayk7CitzdGF0aWMgc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmlzX2hhc2hfbG9jayk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlY3ZfbGlzdF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKm15X3Zpc19pbmZvOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc2VuZF9saXN0OwkvKiBhbHdheXMgbG9ja2VkIHdpdGggdmlzX2hhc2hfbG9jayAqLwpAQCAtMTE1LDcgKzExNSw3IEBACiAJfQogCiAJLyogaXRzIGEgbmV3IGFkZHJlc3MsIGFkZCBpdCB0byB0aGUgbGlzdCAqLwotCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm47CiAJbWVtY3B5KGVudHJ5LT5hZGRyLCBpbnRlcmZhY2UsIEVUSF9BTEVOKTsKQEAgLTE0MiwxMiArMTQyLDI5IEBACiAJcmV0dXJuIGxlbjsKIH0KIAorc3RhdGljIHNpemVfdCB2aXNfZGF0YV9jb3VudF9wcmltX3NlYyhzdHJ1Y3QgaGxpc3RfaGVhZCAqaWZfbGlzdCkKK3sKKwlzdHJ1Y3QgaWZfbGlzdF9lbnRyeSAqZW50cnk7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlzaXplX3QgY291bnQgPSAwOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoZW50cnktPnByaW1hcnkpCisJCQljb3VudCArPSA5OworCQllbHNlCisJCQljb3VudCArPSAyMzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIC8qIHJlYWQgYW4gZW50cnkgICovCiBzdGF0aWMgc3NpemVfdCB2aXNfZGF0YV9yZWFkX2VudHJ5KGNoYXIgKmJ1ZmYsIHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnksCiAJCQkJICAgdWludDhfdCAqc3JjLCBib29sIHByaW1hcnkpCiB7Ci0JY2hhciB0b1s0MF07CisJY2hhciB0b1sxOF07CiAKKwkvKiBtYXhpbWFsIGxlbmd0aDogbWF4KDQrMTcrMiwgMysxNysxKzMrMikgPT0gMjYgKi8KIAlhZGRyX3RvX3N0cmluZyh0bywgZW50cnktPmRlc3QpOwogCWlmIChwcmltYXJ5ICYmIGVudHJ5LT5xdWFsaXR5ID09IDApCiAJCXJldHVybiBzcHJpbnRmKGJ1ZmYsICJITkEgJXMsICIsIHRvKTsKQEAgLTE1NywzOCArMTc0LDc0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXNzaXplX3QgdmlzX2ZpbGxfYnVmZmVyX3RleHQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGNoYXIgKmJ1ZmYsCi0JCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBvZmYpCitpbnQgdmlzX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJSEFTSElUKGhhc2hpdCk7CisJSEFTSElUKGhhc2hpdF9jb3VudCk7CiAJc3RydWN0IHZpc19pbmZvICppbmZvOwogCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cmllczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJSExJU1RfSEVBRCh2aXNfaWZfbGlzdCk7CiAJc3RydWN0IGlmX2xpc3RfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3MsICpuOwotCXNpemVfdCBoZHJfbGVuLCB0bXBfbGVuOwotCWludCBpLCBieXRlc193cml0dGVuID0gMDsKKwlpbnQgaTsKIAljaGFyIHRtcF9hZGRyX3N0cltFVEhfU1RSX0xFTl07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdmlzX3NlcnZlciA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOworCXNpemVfdCBidWZmX3BvcywgYnVmX3NpemU7CisJY2hhciAqYnVmZjsKIAogCWlmICgoIWJhdF9wcml2LT5wcmltYXJ5X2lmKSB8fAogCSAgICAodmlzX3NlcnZlciA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKSkKIAkJcmV0dXJuIDA7CiAKLQloZHJfbGVuID0gMDsKLQorCWJ1Zl9zaXplID0gMTsKKwkvKiBFc3RpbWF0ZSBsZW5ndGggKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdmlzX2hhc2hfbG9jaywgZmxhZ3MpOworCXdoaWxlIChoYXNoX2l0ZXJhdGUodmlzX2hhc2gsICZoYXNoaXRfY291bnQpKSB7CisJCWluZm8gPSBoYXNoaXRfY291bnQuYnVja2V0LT5kYXRhOworCQllbnRyaWVzID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQorCQkJKChjaGFyICopaW5mbyArIHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cGFja2V0LmVudHJpZXM7IGkrKykgeworCQkJaWYgKGVudHJpZXNbaV0ucXVhbGl0eSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJdmlzX2RhdGFfaW5zZXJ0X2ludGVyZmFjZShlbnRyaWVzW2ldLnNyYywgJnZpc19pZl9saXN0LAorCQkJCWNvbXBhcmVfb3JpZyhlbnRyaWVzW2ldLnNyYywKKwkJCQkJCWluZm8tPnBhY2tldC52aXNfb3JpZykpOworCQl9CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgJnZpc19pZl9saXN0LCBsaXN0KSB7CisJCQlidWZfc2l6ZSArPSAxOCArIDI2ICogaW5mby0+cGFja2V0LmVudHJpZXM7CisKKwkJCS8qIGFkZCBwcmltYXJ5L3NlY29uZGFyeSByZWNvcmRzICovCisJCQlpZiAoY29tcGFyZV9vcmlnKGVudHJ5LT5hZGRyLCBpbmZvLT5wYWNrZXQudmlzX29yaWcpKQorCQkJCWJ1Zl9zaXplICs9CisJCQkJCXZpc19kYXRhX2NvdW50X3ByaW1fc2VjKCZ2aXNfaWZfbGlzdCk7CisKKwkJCWJ1Zl9zaXplICs9IDE7CisJCX0KKworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBwb3MsIG4sICZ2aXNfaWZfbGlzdCwgbGlzdCkgeworCQkJaGxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCQlrZnJlZShlbnRyeSk7CisJCX0KKwl9CisKKwlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWZmKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJ1ZmZbMF0gPSAnXDAnOworCWJ1ZmZfcG9zID0gMDsKKwogCXdoaWxlIChoYXNoX2l0ZXJhdGUodmlzX2hhc2gsICZoYXNoaXQpKSB7CiAJCWluZm8gPSBoYXNoaXQuYnVja2V0LT5kYXRhOwogCQllbnRyaWVzID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQogCQkJKChjaGFyICopaW5mbyArIHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pKTsKIAotCQkvKiBlc3RpbWF0ZWQgbGluZSBsZW5ndGggKi8KLQkJaWYgKGNvdW50IDwgYnl0ZXNfd3JpdHRlbiArIDIwMCkKLQkJCWJyZWFrOwotCiAJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWNrZXQuZW50cmllczsgaSsrKSB7CiAJCQlpZiAoZW50cmllc1tpXS5xdWFsaXR5ID09IDApCiAJCQkJY29udGludWU7CkBAIC0xOTksMzAgKzI1MiwyMiBAQAogCiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsICZ2aXNfaWZfbGlzdCwgbGlzdCkgewogCQkJYWRkcl90b19zdHJpbmcodG1wX2FkZHJfc3RyLCBlbnRyeS0+YWRkcik7Ci0JCQl0bXBfbGVuID0gc3ByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiwKLQkJCQkJICAiJXMsIiwgdG1wX2FkZHJfc3RyKTsKKwkJCWJ1ZmZfcG9zICs9IHNwcmludGYoYnVmZiArIGJ1ZmZfcG9zLCAiJXMsIiwKKwkJCQkJICAgIHRtcF9hZGRyX3N0cik7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWNrZXQuZW50cmllczsgaSsrKQotCQkJCXRtcF9sZW4gKz0gdmlzX2RhdGFfcmVhZF9lbnRyeSgKLQkJCQkJCWJ1ZmYgKyBieXRlc193cml0dGVuICsgdG1wX2xlbiwKLQkJCQkJCSZlbnRyaWVzW2ldLCBlbnRyeS0+YWRkciwKLQkJCQkJCWVudHJ5LT5wcmltYXJ5KTsKKwkJCQlidWZmX3BvcyArPSB2aXNfZGF0YV9yZWFkX2VudHJ5KGJ1ZmYgKyBidWZmX3BvcywKKwkJCQkJCQkJJmVudHJpZXNbaV0sCisJCQkJCQkJCWVudHJ5LT5hZGRyLAorCQkJCQkJCQllbnRyeS0+cHJpbWFyeSk7CiAKIAkJCS8qIGFkZCBwcmltYXJ5L3NlY29uZGFyeSByZWNvcmRzICovCiAJCQlpZiAoY29tcGFyZV9vcmlnKGVudHJ5LT5hZGRyLCBpbmZvLT5wYWNrZXQudmlzX29yaWcpKQotCQkJCXRtcF9sZW4gKz0gdmlzX2RhdGFfcmVhZF9wcmltX3NlYygKLQkJCQkJCWJ1ZmYgKyBieXRlc193cml0dGVuICsgdG1wX2xlbiwKLQkJCQkJCSZ2aXNfaWZfbGlzdCk7CisJCQkJYnVmZl9wb3MgKz0KKwkJCQkJdmlzX2RhdGFfcmVhZF9wcmltX3NlYyhidWZmICsgYnVmZl9wb3MsCisJCQkJCQkJICAgICAgICZ2aXNfaWZfbGlzdCk7CiAKLQkJCXRtcF9sZW4gKz0gc3ByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiArIHRtcF9sZW4sCi0JCQkJCSAgIlxuIik7Ci0KLQkJCWhkcl9sZW4gKz0gdG1wX2xlbjsKLQotCQkJaWYgKG9mZiA+PSBoZHJfbGVuKQotCQkJCWNvbnRpbnVlOwotCi0JCQlieXRlc193cml0dGVuICs9IHRtcF9sZW47CisJCQlidWZmX3BvcyArPSBzcHJpbnRmKGJ1ZmYgKyBidWZmX3BvcywgIlxuIik7CiAJCX0KIAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBwb3MsIG4sICZ2aXNfaWZfbGlzdCwgbGlzdCkgewpAQCAtMjMwLDkgKzI3NSwxMyBAQAogCQkJa2ZyZWUoZW50cnkpOwogCQl9CiAJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlzX2hhc2hfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOworCWtmcmVlKGJ1ZmYpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIGFkZCB0aGUgaW5mbyBwYWNrZXQgdG8gdGhlIHNlbmQgbGlzdCwgaWYgaXQgd2FzIG5vdApAQCAtMzA4LDcgKzM1Nyw4IEBACiAJb2xkX2luZm8gPSBoYXNoX2ZpbmQodmlzX2hhc2gsICZzZWFyY2hfZWxlbSk7CiAKIAlpZiAob2xkX2luZm8gIT0gTlVMTCkgewotCQlpZiAoIXNlcV9hZnRlcih2aXNfcGFja2V0LT5zZXFubywgb2xkX2luZm8tPnBhY2tldC5zZXFubykpIHsKKwkJaWYgKCFzZXFfYWZ0ZXIobnRvaGwodmlzX3BhY2tldC0+c2Vxbm8pLAorCQkJCW50b2hsKG9sZF9pbmZvLT5wYWNrZXQuc2Vxbm8pKSkgewogCQkJaWYgKG9sZF9pbmZvLT5wYWNrZXQuc2Vxbm8gPT0gdmlzX3BhY2tldC0+c2Vxbm8pIHsKIAkJCQlyZWN2X2xpc3RfYWRkKCZvbGRfaW5mby0+cmVjdl9saXN0LAogCQkJCQkgICAgICB2aXNfcGFja2V0LT5zZW5kZXJfb3JpZyk7CkBAIC0zNDAsNyArMzkwLDcgQEAKIAogCS8qIE1ha2UgaXQgYSBicm9hZGNhc3QgcGFja2V0LCBpZiByZXF1aXJlZCAqLwogCWlmIChtYWtlX2Jyb2FkY2FzdCkKLQkJbWVtY3B5KGluZm8tPnBhY2tldC50YXJnZXRfb3JpZywgYnJvYWRjYXN0QWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RfYWRkciwgRVRIX0FMRU4pOwogCiAJLyogcmVwYWlyIGlmIGVudHJpZXMgaXMgbG9uZ2VyIHRoYW4gcGFja2V0LiAqLwogCWlmIChpbmZvLT5wYWNrZXQuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpID4gdmlzX2luZm9fbGVuKQpAQCAtNDc0LDkgKzUyNCw5IEBACiAJaW5mby0+cGFja2V0LnZpc190eXBlID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmb3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGluZm8tPnBhY2tldC50YXJnZXRfb3JpZywgYnJvYWRjYXN0X2FkZHIsIEVUSF9BTEVOKTsKIAlpbmZvLT5wYWNrZXQudHRsID0gVFRMOwotCWluZm8tPnBhY2tldC5zZXFubysrOworCWluZm8tPnBhY2tldC5zZXFubyA9IGh0b25sKG50b2hsKGluZm8tPnBhY2tldC5zZXFubykgKyAxKTsKIAlpbmZvLT5wYWNrZXQuZW50cmllcyA9IDA7CiAKIAlpZiAoaW5mby0+cGFja2V0LnZpc190eXBlID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUpIHsKQEAgLTU0Nyw3ICs1OTcsNyBAQAogCQlpZiAoaW5mbyA9PSBteV92aXNfaW5mbykJLyogbmV2ZXIgcHVyZ2Ugb3duIGRhdGEuICovCiAJCQljb250aW51ZTsKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCSAgICAgICBpbmZvLT5maXJzdF9zZWVuICsgKFZJU19USU1FT1VUKkhaKS8xMDAwKSkgeworCQkJICAgICAgIGluZm8tPmZpcnN0X3NlZW4gKyBWSVNfVElNRU9VVCAqIEhaKSkgewogCQkJaGFzaF9yZW1vdmVfYnVja2V0KHZpc19oYXNoLCAmaGFzaGl0KTsKIAkJCXNlbmRfbGlzdF9kZWwoaW5mbyk7CiAJCQlrcmVmX3B1dCgmaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7CkBAIC01OTEsNyArNjQxLDcgQEAKIAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIGJyb2FkY2FzdEFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RfYWRkciwgRVRIX0FMRU4pOwogfQogCiBzdGF0aWMgdm9pZCB1bmljYXN0X3Zpc19wYWNrZXQoc3RydWN0IHZpc19pbmZvICppbmZvLCBpbnQgcGFja2V0X2xlbmd0aCkKQEAgLTYyOCwxMSArNjc4LDExIEBACiAJaW50IHBhY2tldF9sZW5ndGg7CiAKIAlpZiAoaW5mby0+cGFja2V0LnR0bCA8IDIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmF0bWFuLWFkdjogRXJyb3IgLSBjYW4ndCBzZW5kIHZpcyBwYWNrZXQ6IHR0bCBleGNlZWRlZFxuIik7CisJCXByX3dhcm5pbmcoIkVycm9yIC0gY2FuJ3Qgc2VuZCB2aXMgcGFja2V0OiB0dGwgZXhjZWVkZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JbWVtY3B5KGluZm8tPnBhY2tldC5zZW5kZXJfb3JpZywgbWFpbklmQWRkciwgRVRIX0FMRU4pOworCW1lbWNweShpbmZvLT5wYWNrZXQuc2VuZGVyX29yaWcsIG1haW5faWZfYWRkciwgRVRIX0FMRU4pOwogCWluZm8tPnBhY2tldC50dGwtLTsKIAogCXBhY2tldF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsKQEAgLTY5MCwxOCArNzQwLDE4IEBACiAKIAl2aXNfaGFzaCA9IGhhc2hfbmV3KDI1NiwgdmlzX2luZm9fY21wLCB2aXNfaW5mb19jaG9vc2UpOwogCWlmICghdmlzX2hhc2gpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OkNhbid0IGluaXRpYWxpemUgdmlzX2hhc2hcbiIpOworCQlwcl9lcnIoIkNhbid0IGluaXRpYWxpemUgdmlzX2hhc2hcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlteV92aXNfaW5mbyA9IGttYWxsb2MoMTAwMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFteV92aXNfaW5mbykgewotCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6Q2FuJ3QgaW5pdGlhbGl6ZSB2aXMgcGFja2V0XG4iKTsKKwkJcHJfZXJyKCJDYW4ndCBpbml0aWFsaXplIHZpcyBwYWNrZXRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAkvKiBwcmVmaWxsIHRoZSB2aXMgaW5mbyAqLwotCW15X3Zpc19pbmZvLT5maXJzdF9zZWVuID0gamlmZmllcyAtIGF0b21pY19yZWFkKCZ2aXNfaW50ZXJ2YWwpOworCW15X3Zpc19pbmZvLT5maXJzdF9zZWVuID0gamlmZmllcyAtIG1zZWNzX3RvX2ppZmZpZXMoVklTX0lOVEVSVkFMKTsKIAlJTklUX0xJU1RfSEVBRCgmbXlfdmlzX2luZm8tPnJlY3ZfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJm15X3Zpc19pbmZvLT5zZW5kX2xpc3QpOwogCWtyZWZfaW5pdCgmbXlfdmlzX2luZm8tPnJlZmNvdW50KTsKQEAgLTcxMywxMiArNzYzLDExIEBACiAKIAlJTklUX0xJU1RfSEVBRCgmc2VuZF9saXN0KTsKIAotCW1lbWNweShteV92aXNfaW5mby0+cGFja2V0LnZpc19vcmlnLCBtYWluSWZBZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG15X3Zpc19pbmZvLT5wYWNrZXQuc2VuZGVyX29yaWcsIG1haW5JZkFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobXlfdmlzX2luZm8tPnBhY2tldC52aXNfb3JpZywgbWFpbl9pZl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KG15X3Zpc19pbmZvLT5wYWNrZXQuc2VuZGVyX29yaWcsIG1haW5faWZfYWRkciwgRVRIX0FMRU4pOwogCiAJaWYgKGhhc2hfYWRkKHZpc19oYXNoLCBteV92aXNfaW5mbykgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImJhdG1hbi1hZHY6Q2FuJ3QgYWRkIG93biB2aXMgcGFja2V0IGludG8gaGFzaFxuIik7CisJCXByX2VycigiQ2FuJ3QgYWRkIG93biB2aXMgcGFja2V0IGludG8gaGFzaFxuIik7CiAJCS8qIG5vdCBpbiBoYXNoLCBuZWVkIHRvIHJlbW92ZSBpdCBtYW51YWxseS4gKi8KIAkJa3JlZl9wdXQoJm15X3Zpc19pbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKIAkJZ290byBlcnI7CkBAIC03NjQsNSArODEzLDUgQEAKIHN0YXRpYyB2b2lkIHN0YXJ0X3Zpc190aW1lcih2b2lkKQogewogCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmdmlzX3RpbWVyX3dxLAotCQkJICAgKGF0b21pY19yZWFkKCZ2aXNfaW50ZXJ2YWwpICogSFopIC8gMTAwMCk7CisJCQkgICAoVklTX0lOVEVSVkFMICogSFopIC8gMTAwMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oCmluZGV4IDljMWZkNzcuLmJiMTNiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oCkBAIC0xOSw3ICsxOSwxMCBAQAogICoKICAqLwogCi0jZGVmaW5lIFZJU19USU1FT1VUCQkyMDAwMDAKKyNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1ZJU19IXworI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfVklTX0hfCisKKyNkZWZpbmUgVklTX1RJTUVPVVQJCTIwMAkvKiB0aW1lb3V0IG9mIHZpcyBwYWNrZXRzIGluIHNlY29uZHMgKi8KIAogc3RydWN0IHZpc19pbmZvIHsKIAl1bnNpZ25lZCBsb25nICAgICAgIGZpcnN0X3NlZW47CkBAIC00NCwxMSArNDcsNyBAQAogCXVpbnQ4X3QgbWFjW0VUSF9BTEVOXTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgaGFzaHRhYmxlX3QgKnZpc19oYXNoOwotZXh0ZXJuIHNwaW5sb2NrX3QgdmlzX2hhc2hfbG9jazsKLQotc3NpemVfdCB2aXNfZmlsbF9idWZmZXJfdGV4dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgY2hhciAqYnVmZiwKLQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90IG9mZik7CitpbnQgdmlzX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwogdm9pZCByZWNlaXZlX3NlcnZlcl9zeW5jX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAogCQkJCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAogCQkJCWludCB2aXNfaW5mb19sZW4pOwpAQCAtNTcsMyArNTYsNSBAQAogCQkJCSAgaW50IHZpc19pbmZvX2xlbik7CiBpbnQgdmlzX2luaXQodm9pZCk7CiB2b2lkIHZpc19xdWl0KHZvaWQpOworCisjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1ZJU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9UT0RPCmluZGV4IDE1YzkzNDguLmIxMGY3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8KQEAgLTIsNyArMiw2IEBACiAJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCiAJLSBMaW5kZW50CiAJLSByZW1vdmUgYWxsIHdyYXBwZXJzCi0JLSByZW1vdmUgdHlwZWRlZnMKIAktIGF1ZGl0IHVzZXJzcGFjZSBpbnRlcmZhY2UKIAktIHJlc2VydmUgbWFqb3IgbnVtYmVyCiAJLSBjbGVhbnVwIHRoZSBpbmRpdmlkdWFsIGNvbWVkaSBkcml2ZXJzIGFzIHdlbGwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwppbmRleCBhZWIyYzAwLi4xNDA5MTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCkBAIC0xODQ1LDggKzE4NDUsMTUgQEAKIAkJfQogCX0KIAotCWlmIChkZXYtPmF0dGFjaGVkICYmIGRldi0+dXNlX2NvdW50ID09IDAgJiYgZGV2LT5vcGVuKQotCQlkZXYtPm9wZW4oZGV2KTsKKwlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPnVzZV9jb3VudCA9PSAwICYmIGRldi0+b3BlbikgeworCQlpbnQgcmMgPSBkZXYtPm9wZW4oZGV2KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KIAogCWRldi0+dXNlX2NvdW50Kys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCmluZGV4IDRlYjJiNzcuLjY4YWE5MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtNTMsNjIgKzUzLDYgQEAKIAlDT01FRElfTUlOT1JWRVJTSU9OLCBDT01FRElfTUlDUk9WRVJTSU9OKQogI2RlZmluZSBDT01FRElfUkVMRUFTRSBWRVJTSU9OCiAKLSNkZWZpbmUgQ09NRURJX0lOSVRDTEVBTlVQX05PTU9EVUxFKHgpCQkJCQlcCi0Jc3RhdGljIGludCBfX2luaXQgeCAjIyBfaW5pdF9tb2R1bGUodm9pZCkJCQlcCi0JCXtyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmKHgpKTsgfQkJCVwKLQlzdGF0aWMgdm9pZCBfX2V4aXQgeCAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkJCQlcCi0JCXtjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJih4KSk7IH0JCQlcCi0JbW9kdWxlX2luaXQoeCAjIyBfaW5pdF9tb2R1bGUpOwkJCQkJXAotCW1vZHVsZV9leGl0KHggIyMgX2NsZWFudXBfbW9kdWxlKTsKLQotI2RlZmluZSBDT01FRElfTU9EVUxFX01BQ1JPUwkJCQkJCVwKLQlNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CQlcCi0JTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOwkJCVwKLQlNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgQ09NRURJX0lOSVRDTEVBTlVQKHgpCQkJCQkJXAotCUNPTUVESV9NT0RVTEVfTUFDUk9TCQlcCi0JQ09NRURJX0lOSVRDTEVBTlVQX05PTU9EVUxFKHgpCi0KLSNkZWZpbmUgQ09NRURJX1BDSV9JTklUQ0xFQU5VUF9OT01PRFVMRShjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpIFwKLQlzdGF0aWMgaW50IF9fZGV2aW5pdCBjb21lZGlfZHJpdmVyICMjIF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgXAotCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KSBcCi0JeyBcCi0JCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZSk7IFwKLQl9IFwKLQlzdGF0aWMgdm9pZCBfX2RldmV4aXQgY29tZWRpX2RyaXZlciAjIyBfcGNpX3JlbW92ZShcCi0JCXN0cnVjdCBwY2lfZGV2ICpkZXYpIFwKLQl7IFwKLQkJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7IFwKLQl9IFwKLQlzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlciA9IFwKLQl7IFwKLQkJLmlkX3RhYmxlID0gcGNpX2lkX3RhYmxlLCBcCi0JCS5wcm9iZSA9ICZjb21lZGlfZHJpdmVyICMjIF9wY2lfcHJvYmUsIFwKLQkJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZjb21lZGlfZHJpdmVyICMjIF9wY2lfcmVtb3ZlKSBcCi0JfTsgXAotCXN0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9kcml2ZXIgIyMgX2luaXRfbW9kdWxlKHZvaWQpIFwKLQl7IFwKLQkJaW50IHJldHZhbDsgXAotCQlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZjb21lZGlfZHJpdmVyKTsgXAotCQlpZiAocmV0dmFsIDwgMCkgXAotCQkJcmV0dXJuIHJldHZhbDsgXAotCQkJY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlci5uYW1lID0gXAotCQkJCShjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAotCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlcik7IFwKLQl9IFwKLQlzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkgXAotCXsgXAotCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIpOyBcCi0JCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmY29tZWRpX2RyaXZlcik7IFwKLQl9IFwKLQltb2R1bGVfaW5pdChjb21lZGlfZHJpdmVyICMjIF9pbml0X21vZHVsZSk7IFwKLQltb2R1bGVfZXhpdChjb21lZGlfZHJpdmVyICMjIF9jbGVhbnVwX21vZHVsZSk7Ci0KLSNkZWZpbmUgQ09NRURJX1BDSV9JTklUQ0xFQU5VUChjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpIFwKLQlDT01FRElfTU9EVUxFX01BQ1JPUyBcCi0JQ09NRURJX1BDSV9JTklUQ0xFQU5VUF9OT01PRFVMRShjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpCi0KICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BRExJTksJCTB4MTQ0YQogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lDUAkJMHgxMDRjCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09OVEVDCQkweDEyMjEKQEAgLTI4NSw3ICsyMjksNyBAQAogCiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmFzeW5jX3F1ZXVlOwogCi0Jdm9pZCAoKm9wZW4pIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKKwlpbnQgKCpvcGVuKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiAJdm9pZCAoKmNsb3NlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYwppbmRleCBmZTYzODMwLi45NTA0OWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKQEAgLTExNyw3ICsxMTcsMTggQEAKIAkuZGV0YWNoID0gZGV2XzgyNTVfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl84MjU1KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl84MjU1X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl84MjU1KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl84MjU1X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfODI1NSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl84MjU1X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl84MjU1X2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIHZvaWQgZG9fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKIApAQCAtNDU3LDMgKzQ2OCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FjbDcyMjViLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYwppbmRleCBlMjBjMzU0Li45ZGVmMjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYwpAQCAtNDksNyArNDksMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBib2FyZHR5cGUpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9hY2w3MjI1Yik7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYWNsNzIyNWJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2FjbDcyMjViKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hY2w3MjI1Yl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2FjbDcyMjViKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2FjbDcyMjViX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9hY2w3MjI1Yl9jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyBpbnQgYWNsNzIyNWJfZG9faW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLApAQCAtMTUwLDMgKzE2MSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2FtY2NfczU5MzMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9hbWNjX3M1OTMzLmgKaW5kZXggYzMyODRlYi4uOGVkMTliYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2FtY2NfczU5MzMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfYW1jY19zNTkzMy5oCkBAIC0yNDcsMTYgKzI0NywxNCBAQAogLyogYnVpbGQgbGlzdCBvZiBhbWNjIGNhcmRzIGluIHRoaXMgc3lzdGVtICovCiB2b2lkIHZfcGNpX2NhcmRfbGlzdF9pbml0KHVuc2lnbmVkIHNob3J0IHBjaV92ZW5kb3IsIGNoYXIgZGlzcGxheSkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwogCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICphbWNjLCAqbGFzdDsKIAlpbnQgaTsKIAlpbnQgaV9Db3VudCA9IDA7CiAJYW1jY19kZXZpY2VzID0gTlVMTDsKIAlsYXN0ID0gTlVMTDsKIAotCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lkZXYgIT0gTlVMTDsKLQkgICAgIHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQlmb3IgKGlfQ291bnQgPSAwOyBpX0NvdW50IDwgMjsgaV9Db3VudCsrKSB7CiAJCQlwY2lfdmVuZG9yID0gaV9BRERJREFUQURldmljZUlEW2lfQ291bnRdOwogCQkJaWYgKHBjaWRldi0+dmVuZG9yID09IHBjaV92ZW5kb3IpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYwppbmRleCBiMThlODFkLi41ZWQ0Yjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5jCkBAIC0yNTQxLDcgKzI1NDEsNDMgQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhZGRpX2JvYXJkKSwKIH07CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2FkZGksIGFkZGlfYXBjaV90YmwpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2FkZGlfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfYWRkaS5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfYWRkaV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfYWRkaV9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGFkZGlfYXBjaV90YmwsCisJLnByb2JlID0gJmRyaXZlcl9hZGRpX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9hZGRpX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYWRkaV9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYWRkaSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfYWRkaV9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9hZGRpLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYWRkaV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hZGRpX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYWRkaV9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9hZGRpKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2FkZGlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FkZGlfY2xlYW51cF9tb2R1bGUpOwogCiAvKgogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfZWVwcm9tLmMKaW5kZXggYmVhMzI5Zi4uZTAyMTNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9lZXByb20uYwpAQCAtMTAxLDEwICsxMDEsMTAgQEAKIH07CiAKIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IHN0cl9BbmFsb2dPdXRwdXRIZWFkZXIgewogCXVuc2lnbmVkIHNob3J0IHdfTmNoYW5uZWw7CiAJdW5zaWduZWQgY2hhciBiX1Jlc29sdXRpb247Ci19IHN0cl9BbmFsb2dPdXRwdXRIZWFkZXI7Cit9OwogCiBzdHJ1Y3Qgc3RyX0FuYWxvZ0lucHV0SGVhZGVyIHsKIAl1bnNpZ25lZCBzaG9ydCB3X05jaGFubmVsOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIGludCBpX0VlcHJvbVJlYWRBbmxvZ091dHB1dEhlYWRlcih1bnNpZ25lZCBzaG9ydCB3X1BDSUJvYXJkRWVwcm9tQWRkcmVzcywKIAljaGFyICpwY19QQ0lDaGlwSW5mb3JtYXRpb24sIHVuc2lnbmVkIHNob3J0IHdfQWRkcmVzcywKLQlzdHJfQW5hbG9nT3V0cHV0SGVhZGVyICpzX0hlYWRlcik7CisJc3RydWN0IHN0cl9BbmFsb2dPdXRwdXRIZWFkZXIgKnNfSGVhZGVyKTsKIAogaW50IGlfRWVwcm9tUmVhZEFubG9nSW5wdXRIZWFkZXIodW5zaWduZWQgc2hvcnQgd19QQ0lCb2FyZEVlcHJvbUFkZHJlc3MsCiAJY2hhciAqcGNfUENJQ2hpcEluZm9ybWF0aW9uLCB1bnNpZ25lZCBzaG9ydCB3X0FkZHJlc3MsCkBAIC02MzUsNyArNjM1LDcgQEAKIAogfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHVuc2lnbmVkIGludCBkd19BZGRyZXNzIDogUENJIGVlcHJvbSBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICB8CiAKLXwJCSAgICAgIHVuc2lnbmVkIHNob3J0ICAgIHdfb2Zmc2V0IDogT2Zmc2V0IG9mIHRoZSBhZHJlc3MgdG8gcmVhZCAgICAgICAgICAgICB8Cit8CQkgICAgICB1bnNpZ25lZCBzaG9ydCAgICB3X29mZnNldCA6IE9mZnNldCBvZiB0aGUgYWRkcmVzcyB0byByZWFkICAgICAgICAgICAgIHwKIAogfAkJICAgICAgdW5zaWduZWQgc2hvcnQgKiAgIHB3X1ZhbHVlIDogUENJIGVlcHJvbSAxNiBiaXQgcmVhZCB2YWx1ZS4gICAgICAgICAgICB8CiAKQEAgLTgxMSw3ICs4MTEsNyBAQAogCXN0cnVjdCBzdHJfRGlnaXRhbElucHV0SGVhZGVyIHNfRGlnaXRhbElucHV0SGVhZGVyOwogCXN0cnVjdCBzdHJfRGlnaXRhbE91dHB1dEhlYWRlciBzX0RpZ2l0YWxPdXRwdXRIZWFkZXI7CiAJLyogc3RydWN0IHN0cl9UaW1lck1haW5IZWFkZXIgICAgIHNfVGltZXJNYWluSGVhZGVyLHNfV2F0Y2hkb2dNYWluSGVhZGVyOyAqLwotCXN0cl9BbmFsb2dPdXRwdXRIZWFkZXIgc19BbmFsb2dPdXRwdXRIZWFkZXI7CisJc3RydWN0IHN0cl9BbmFsb2dPdXRwdXRIZWFkZXIgc19BbmFsb2dPdXRwdXRIZWFkZXI7CiAJc3RydWN0IHN0cl9BbmFsb2dJbnB1dEhlYWRlciBzX0FuYWxvZ0lucHV0SGVhZGVyOwogCiAJLyogUmVhZCBzaXplICovCkBAIC0xMDgxLDcgKzEwODEsNyBAQAogCiBpbnQgaV9FZXByb21SZWFkQW5sb2dPdXRwdXRIZWFkZXIodW5zaWduZWQgc2hvcnQgd19QQ0lCb2FyZEVlcHJvbUFkZHJlc3MsCiAJY2hhciAqcGNfUENJQ2hpcEluZm9ybWF0aW9uLCB1bnNpZ25lZCBzaG9ydCB3X0FkZHJlc3MsCi0Jc3RyX0FuYWxvZ091dHB1dEhlYWRlciAqc19IZWFkZXIpCisJc3RydWN0IHN0cl9BbmFsb2dPdXRwdXRIZWFkZXIgKnNfSGVhZGVyKQogewogCXVuc2lnbmVkIHNob3J0IHdfVGVtcDsKIAkvKiAgTm8gb2YgY2hhbm5lbHMgZm9yIDFzdCBoYXJkIGNvbXBvbmVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCmluZGV4IGY5M2RkZDQuLjg1MWY3MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKQEAgLTEwOTAsMTMgKzEwOTAsMTMgQEAKICAqIGFuZCBwdXQgaW50byBpbnRvIGFuIGFycmF5IGFycmF5IHVzZWQgbWF5IGJlIGZvciBkaWZmZXJuZXQgcGFnZXMKICAqLwogCi0JCS8qICBETUEgU3RhcnQgQWRyZXNzIExvdyAqLworCQkvKiAgRE1BIFN0YXJ0IEFkZHJlc3MgTG93ICovCiAJCW91dHcoQVBDSTMxMjBfQUREX09OX01XQVJfTE9XLCBkZXZwcml2LT5pX0lvYmFzZUFkZG9uICsgMCk7CiAJCW91dHcoKGRldnByaXYtPnVsX0RtYUJ1ZmZlckh3WzBdICYgMHhGRkZGKSwKIAkJCWRldnByaXYtPmlfSW9iYXNlQWRkb24gKyAyKTsKIAogCQkvKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLyogRE1BIFN0YXJ0IEFkcmVzcyBIaWdoICovCisJCS8qIERNQSBTdGFydCBBZGRyZXNzIEhpZ2ggKi8KIAkJLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCW91dHcoQVBDSTMxMjBfQUREX09OX01XQVJfSElHSCwgZGV2cHJpdi0+aV9Jb2Jhc2VBZGRvbiArIDApOwogCQlvdXR3KChkZXZwcml2LT51bF9EbWFCdWZmZXJId1swXSAvIDY1NTM2KSwKQEAgLTE3MzMsMTEgKzE3MzMsMTEgQEAKIAkJdmFyID0gZGV2cHJpdi0+dWxfRG1hQnVmZmVySHdbbmV4dF9kbWFfYnVmXTsKIAkJaGlnaF93b3JkID0gdmFyIC8gNjU1MzY7CiAKLQkJLyogRE1BIFN0YXJ0IEFkcmVzcyBMb3cgKi8KKwkJLyogRE1BIFN0YXJ0IEFkZHJlc3MgTG93ICovCiAJCW91dHcoQVBDSTMxMjBfQUREX09OX01XQVJfTE9XLCBkZXZwcml2LT5pX0lvYmFzZUFkZG9uICsgMCk7CiAJCW91dHcobG93X3dvcmQsIGRldnByaXYtPmlfSW9iYXNlQWRkb24gKyAyKTsKIAotCQkvKiBETUEgU3RhcnQgQWRyZXNzIEhpZ2ggKi8KKwkJLyogRE1BIFN0YXJ0IEFkZHJlc3MgSGlnaCAqLwogCQlvdXR3KEFQQ0kzMTIwX0FERF9PTl9NV0FSX0hJR0gsIGRldnByaXYtPmlfSW9iYXNlQWRkb24gKyAwKTsKIAkJb3V0dyhoaWdoX3dvcmQsIGRldnByaXYtPmlfSW9iYXNlQWRkb24gKyAyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMDM1LmMKaW5kZXggNmRmY2JlOC4uNGMwMGRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzAzNS5jCkBAIC01LDMgKzUsNyBAQAogI2RlZmluZSBBRERJREFUQV9EUklWRVJfTkFNRQkiYWRkaV9hcGNpXzAzNSIKIAogI2luY2x1ZGUgImFkZGktZGF0YS9hZGRpX2NvbW1vbi5jIgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzEwMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jCmluZGV4IDQ3MjJlYzguLjc4MzFjZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jCkBAIC0zLDMgKzMsNyBAQAogI2RlZmluZSBBRERJREFUQV9EUklWRVJfTkFNRQkiYWRkaV9hcGNpXzEwMzIiCiAKICNpbmNsdWRlICJhZGRpLWRhdGEvYWRkaV9jb21tb24uYyIKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYwppbmRleCBkYjNkYWZkLi5iZmQ4NGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYwpAQCAtMywzICszLDcgQEAKICNkZWZpbmUgQURESURBVEFfRFJJVkVSX05BTUUJImFkZGlfYXBjaV8xNTAwIgogCiAjaW5jbHVkZSAiYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMiCisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTE2LmMKaW5kZXggZjU5MWJhZi4uYTEyZTJmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTE2LmMKQEAgLTMsMyArMyw3IEBACiAjZGVmaW5lIEFERElEQVRBX0RSSVZFUl9OQU1FCSJhZGRpX2FwY2lfMTUxNiIKIAogI2luY2x1ZGUgImFkZGktZGF0YS9hZGRpX2NvbW1vbi5jIgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCmluZGV4IDZmNWM5MjMuLjFiOWQ1OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCkBAIC0zLDMgKzMsNyBAQAogI2RlZmluZSBBRERJREFUQV9EUklWRVJfTkFNRQkiYWRkaV9hcGNpXzE1NjQiCiAKICNpbmNsdWRlICJhZGRpLWRhdGEvYWRkaV9jb21tb24uYyIKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNnh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE2eHguYwppbmRleCAxZDkyNmFkLi5kNTQyMThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE2eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE2eHguYwpAQCAtMywzICszLDcgQEAKICNkZWZpbmUgQURESURBVEFfRFJJVkVSX05BTUUJImFkZGlfYXBjaV8xNnh4IgogCiAjaW5jbHVkZSAiYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMiCisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMDE2LmMKaW5kZXggNzI2NmU0MS4uZmE1MGM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMDE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMDE2LmMKQEAgLTMsMyArMyw3IEBACiAjZGVmaW5lIEFERElEQVRBX0RSSVZFUl9OQU1FCSJhZGRpX2FwY2lfMjAxNiIKIAogI2luY2x1ZGUgImFkZGktZGF0YS9hZGRpX2NvbW1vbi5jIgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzIwMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jCmluZGV4IGY2N2RhOTQuLjA3M2E4YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jCkBAIC0zLDMgKzMsNyBAQAogI2RlZmluZSBBRERJREFUQV9EUklWRVJfTkFNRQkiYWRkaV9hcGNpXzIwMzIiCiAKICNpbmNsdWRlICJhZGRpLWRhdGEvYWRkaV9jb21tb24uYyIKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzIyMDAuYwppbmRleCBiYzdmN2Q2Li5hZGZiYjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzIyMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzIyMDAuYwpAQCAtMywzICszLDcgQEAKICNkZWZpbmUgQURESURBVEFfRFJJVkVSX05BTUUJImFkZGlfYXBjaV8yMjAwIgogCiAjaW5jbHVkZSAiYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMiCisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzAwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMDAxLmMKaW5kZXggZDg2YzQyMC4uMDBhYzc2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMDAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMDAxLmMKQEAgLTMsMyArMyw3IEBACiAjZGVmaW5lIEFERElEQVRBX0RSSVZFUl9OQU1FCSJhZGRpX2FwY2lfMzAwMSIKIAogI2luY2x1ZGUgImFkZGktZGF0YS9hZGRpX2NvbW1vbi5jIgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzEyMC5jCmluZGV4IDBiMjJjZjEuLmMzNTUxNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzEyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzEyMC5jCkBAIC0zLDMgKzMsNyBAQAogI2RlZmluZSBBRERJREFUQV9EUklWRVJfTkFNRQkiYWRkaV9hcGNpXzMxMjAiCiAKICNpbmNsdWRlICJhZGRpLWRhdGEvYWRkaV9jb21tb24uYyIKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwppbmRleCBkOGEwMWIxLi5kZDJjMWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwpAQCAtMywzICszLDcgQEAKICNkZWZpbmUgQURESURBVEFfRFJJVkVSX05BTUUJImFkZGlfYXBjaV8zNTAxIgogCiAjaW5jbHVkZSAiYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMiCisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfM3h4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKaW5kZXggOTQyYmM5ZS4uMDMxNjFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKQEAgLTMsMyArMyw3IEBACiAjZGVmaW5lIEFERElEQVRBX0RSSVZFUl9OQU1FCSJhZGRpX2FwY2lfM3h4eCIKIAogI2luY2x1ZGUgImFkZGktZGF0YS9hZGRpX2NvbW1vbi5jIgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCmluZGV4IDcxMmI5ZTAuLjA3M2QwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCkBAIC0xMTksNyArMTE5LDQzIEBACiAJLmRldGFjaCA9IHBjaTYyMDhfZGV0YWNoLAogfTsKIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfcGNpNjIwOCwgcGNpNjIwOF9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX3BjaTYyMDhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfcGNpNjIwOC5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfcGNpNjIwOF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfcGNpNjIwOF9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IHBjaTYyMDhfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfcGNpNjIwOF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfcGNpNjIwOF9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3BjaTYyMDhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjaTYyMDgpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX3BjaTYyMDhfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfcGNpNjIwOC5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX3BjaTYyMDhfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfcGNpNjIwOF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX3BjaTYyMDhfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcGNpNjIwOCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wY2k2MjA4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY2k2MjA4X2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBwY2k2MjA4X2ZpbmRfZGV2aWNlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBidXMsIGludCBzbG90KTsKIHN0YXRpYyBpbnQKQEAgLTMxNSwxMiArMzUxLDEwIEBACiAKIHN0YXRpYyBpbnQgcGNpNjIwOF9maW5kX2RldmljZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgYnVzLCBpbnQgc2xvdCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CiAJaW50IGk7CiAKLQlmb3IgKHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKLQkgICAgIHBjaV9kZXYgIT0gTlVMTDsKLQkgICAgIHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgeworCWZvcl9lYWNoX3BjaV9kZXYocGNpX2RldikgewogCQlpZiAocGNpX2Rldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQURMSU5LKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2k2MjA4X2JvYXJkcyk7IGkrKykgewogCQkJCWlmIChwY2k2MjA4X2JvYXJkc1tpXS5kZXZfaWQgPT0KQEAgLTQwOCwzICs0NDIsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3MjMwLmMKaW5kZXggMjRhODJlYi4uNzJhNzI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3MjMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3MjMwLmMKQEAgLTkwLDcgKzkwLDcgQEAKIHN0YXRpYyBpbnQgYWRsX3BjaTcyMzBfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IE5VTEw7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGJ1cywgc2xvdDsKIApAQCAtMTA2LDEwICsxMDYsNyBAQAogCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgMikgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JCXBjaWRldiAhPSBOVUxMOwotCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7Ci0KKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BRExJTksgJiYKIAkJCXBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUENJNzIzMCkgewogCQkJaWYgKGJ1cyB8fCBzbG90KSB7CkBAIC0yMDMsNCArMjAwLDQ2IEBACiAJcmV0dXJuIDI7CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2FkbF9wY2k3MjMwLCBhZGxfcGNpNzIzMF9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2FkbF9wY2k3MjMwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZAorCQkJCQkJICAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2FkbF9wY2k3MjMwLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9hZGxfcGNpNzIzMF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfYWRsX3BjaTcyMzBfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBhZGxfcGNpNzIzMF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9hZGxfcGNpNzIzMF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfYWRsX3BjaTcyMzBfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hZGxfcGNpNzIzMF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYWRsX3BjaTcyMzApOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2FkbF9wY2k3MjMwX3BjaV9kcml2ZXIubmFtZSA9CisJICAgIChjaGFyICopZHJpdmVyX2FkbF9wY2k3MjMwLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYWRsX3BjaTcyMzBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYWRsX3BjaTcyMzBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hZGxfcGNpNzIzMF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9hZGxfcGNpNzIzMCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9hZGxfcGNpNzIzMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYWRsX3BjaTcyMzBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTcyOTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jCmluZGV4IDg2MDI4NjUuLmYyOGZlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jCkBAIC03Nyw3ICs3Nyw3IEBACiBzdGF0aWMgaW50IGFkbF9wY2k3Mjk2X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IE5VTEw7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGJ1cywgc2xvdDsKIAlpbnQgcmV0OwpAQCAtOTQsMTAgKzk0LDcgQEAKIAlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpZGV2ICE9IE5VTEw7Ci0JICAgICBwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7Ci0KKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BRExJTksgJiYKIAkJICAgIHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUENJNzI5NikgewogCQkJaWYgKGJ1cyB8fCBzbG90KSB7CkBAIC0xNzcsNCArMTc0LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2FkbF9wY2k3Mjk2LCBhZGxfcGNpNzI5Nl9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2FkbF9wY2k3Mjk2X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZAorCQkJCQkJICAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2FkbF9wY2k3Mjk2LmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9hZGxfcGNpNzI5Nl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfYWRsX3BjaTcyOTZfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBhZGxfcGNpNzI5Nl9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9hZGxfcGNpNzI5Nl9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfYWRsX3BjaTcyOTZfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hZGxfcGNpNzI5Nl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYWRsX3BjaTcyOTYpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2FkbF9wY2k3Mjk2X3BjaV9kcml2ZXIubmFtZSA9CisJICAgIChjaGFyICopZHJpdmVyX2FkbF9wY2k3Mjk2LmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYWRsX3BjaTcyOTZfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYWRsX3BjaTcyOTZfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hZGxfcGNpNzI5Nl9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9hZGxfcGNpNzI5Nik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9hZGxfcGNpNzI5Nl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYWRsX3BjaTcyOTZfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTc0MzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jCmluZGV4IGI1YTk0OTkuLjI2MmRhN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jCkBAIC04Niw3ICs4Niw3IEBACiBzdGF0aWMgaW50IGFkbF9wY2k3NDMyX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IE5VTEw7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGJ1cywgc2xvdDsKIApAQCAtMTAyLDEwICsxMDIsNyBAQAogCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgMikgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lkZXYgIT0gTlVMTDsKLQkgICAgIHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKLQorCWZvcl9lYWNoX3BjaV9kZXYocGNpZGV2KSB7CiAJCWlmIChwY2lkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FETElOSyAmJgogCQkgICAgcGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9QQ0k3NDMyKSB7CiAJCQlpZiAoYnVzIHx8IHNsb3QpIHsKQEAgLTIxMCw0ICsyMDcsNDYgQEAKIAlyZXR1cm4gMjsKIH0KIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfYWRsX3BjaTc0MzIsIGFkbF9wY2k3NDMyX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfYWRsX3BjaTc0MzJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkCisJCQkJCQkgICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfYWRsX3BjaTc0MzIuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2FkbF9wY2k3NDMyX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9hZGxfcGNpNzQzMl9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGFkbF9wY2k3NDMyX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2FkbF9wY2k3NDMyX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9hZGxfcGNpNzQzMl9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2FkbF9wY2k3NDMyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9hZGxfcGNpNzQzMik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfYWRsX3BjaTc0MzJfcGNpX2RyaXZlci5uYW1lID0KKwkgICAgKGNoYXIgKilkcml2ZXJfYWRsX3BjaTc0MzIuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hZGxfcGNpNzQzMl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hZGxfcGNpNzQzMl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2FkbF9wY2k3NDMyX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2FkbF9wY2k3NDMyKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2FkbF9wY2k3NDMyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9hZGxfcGNpNzQzMl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKaW5kZXggZGEyNTZhMS4uNzY3YTU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogc3RhdGljIGludCBhZGxfcGNpODE2NF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBidXMsIHNsb3Q7CiAKQEAgLTE0MiwxMCArMTQyLDcgQEAKIAlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpZGV2ICE9IE5VTEw7Ci0JICAgICBwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7Ci0KKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BRExJTksgJiYKIAkJICAgIHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUENJODE2NCkgewogCQkJaWYgKGJ1cyB8fCBzbG90KSB7CkBAIC0zODksNCArMzg2LDQ2IEBACiAJcmV0dXJuIDI7CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2FkbF9wY2k4MTY0LCBhZGxfcGNpODE2NF9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2FkbF9wY2k4MTY0X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZAorCQkJCQkJICAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2FkbF9wY2k4MTY0LmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9hZGxfcGNpODE2NF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfYWRsX3BjaTgxNjRfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBhZGxfcGNpODE2NF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9hZGxfcGNpODE2NF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfYWRsX3BjaTgxNjRfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hZGxfcGNpODE2NF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYWRsX3BjaTgxNjQpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2FkbF9wY2k4MTY0X3BjaV9kcml2ZXIubmFtZSA9CisJICAgIChjaGFyICopZHJpdmVyX2FkbF9wY2k4MTY0LmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYWRsX3BjaTgxNjRfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYWRsX3BjaTgxNjRfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hZGxfcGNpODE2NF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9hZGxfcGNpODE2NCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9hZGxfcGNpODE2NF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYWRsX3BjaTgxNjRfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCmluZGV4IDM5ZDExMmIuLmIyYTAyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCkBAIC0zOCw4ICszOCw4IEBACiAgIC0gZG9faW5zbiByZWFkL3dyaXRlCiAgIC0gYWlfZG9fY21kIG1vZGUgd2l0aCB0aGUgZm9sbG93aW5nIHNvdXJjZXM6CiAKLSAgICAtIHN0YXJ0X3NyYyAJCVRSSUdfTk9XCi0gICAgLSBzY2FuX2JlZ2luX3NyYyAJCVRSSUdfRk9MTE9XCVRSSUdfVElNRVIJVFJJR19FWFQKKyAgICAtIHN0YXJ0X3NyYwkJCVRSSUdfTk9XCisgICAgLSBzY2FuX2JlZ2luX3NyYwkJVFJJR19GT0xMT1cJVFJJR19USU1FUglUUklHX0VYVAogICAgIC0gY29udmVydF9zcmMJCQkJVFJJR19USU1FUglUUklHX0VYVAogICAgIC0gc2Nhbl9lbmRfc3JjCQlUUklHX0NPVU5UCiAgICAgLSBzdG9wX3NyYwkJCVRSSUdfQ09VTlQJVFJJR19OT05FCkBAIC02OCw4ICs2OCw5IEBACiBUT0RPOgogCiAgIC0gUmVhbGx5IHRlc3QgaW1wbGVtZW50ZWQgZnVuY3Rpb25hbGl0eS4KLSAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIFBDSS05MTExREcgd2l0aCBhIHByb2JlIHJvdXRpbmUgdG8gaWRlbnRpZnkgdGhlIGNhcmQgdHlwZQotICAgIChwZXJoYXBzIHdpdGggdGhlIGhlbHAgb2YgdGhlIGNoYW5uZWwgbnVtYmVyIHJlYWRiYWNrIG9mIHRoZSBBL0QgRGF0YSByZWdpc3RlcikuCisgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSBQQ0ktOTExMURHIHdpdGggYSBwcm9iZSByb3V0aW5lIHRvIGlkZW50aWZ5IHRoZSBjYXJkCisgICAgdHlwZSAocGVyaGFwcyB3aXRoIHRoZSBoZWxwIG9mIHRoZSBjaGFubmVsIG51bWJlciByZWFkYmFjayBvZiB0aGUgQS9EIERhdGEKKyAgICByZWdpc3RlcikuCiAgIC0gQWRkIGV4dGVybmFsIG11bHRpcGxleGVyIHN1cHBvcnQuCiAKICovCkBAIC04MywxMiArODQsMTIgQEAKICNpbmNsdWRlICJjb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAKLSNkZWZpbmUgUENJOTExMV9EUklWRVJfTkFNRSAJImFkbF9wY2k5MTExIgotI2RlZmluZSBQQ0k5MTExX0hSX0RFVklDRV9JRCAJMHg5MTExCisjZGVmaW5lIFBDSTkxMTFfRFJJVkVSX05BTUUJImFkbF9wY2k5MTExIgorI2RlZmluZSBQQ0k5MTExX0hSX0RFVklDRV9JRAkweDkxMTEKIAogLyogIFRPRE86IEFkZCBvdGhlciBwY2k5MTExIGJvYXJkIGlkICovCiAKLSNkZWZpbmUgUENJOTExMV9JT19SQU5HRSAJMHgwMTAwCisjZGVmaW5lIFBDSTkxMTFfSU9fUkFOR0UJMHgwMTAwCiAKICNkZWZpbmUgUENJOTExMV9GSUZPX0hBTEZfU0laRQk1MTIKIApAQCAtMTM0LDI3ICsxMzUsMjkgQEAKIAogLyogSU8gYWRkcmVzcyBtYXAgKi8KIAotI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0FEX0ZJRk9fVkFMVUUgCQkJMHgwMAkvKiAgQUQgRGF0YSBzdG9yZWQgaW4gRklGTyAqLwotI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0RBX09VVFBVVCAJCQkweDAwCi0jZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfRElHSVRBTF9JTyAJCQkweDAyCi0jZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfRVhURU5ERURfSU9fUE9SVFMgCQkweDA0Ci0jZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfQURfQ0hBTk5FTF9DT05UUk9MIAkJMHgwNgkvKiAgQ2hhbm5lbCBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9BRF9DSEFOTkVMX1JFQURCQUNLIAkJMHgwNgotI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0lOUFVUX1NJR05BTF9SQU5HRSAJCTB4MDgKLSNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9SQU5HRV9TVEFUVVNfUkVBREJBQ0sgCQkweDA4Ci0jZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfVFJJR0dFUl9NT0RFX0NPTlRST0wgCQkweDBBCi0jZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfQURfTU9ERV9JTlRFUlJVUFRfUkVBREJBQ0sgCTB4MEEKLSNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9TT0ZUV0FSRV9UUklHR0VSIAkJMHgwRQotI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0lOVEVSUlVQVF9DT05UUk9MIAkJMHgwQworI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0FEX0ZJRk9fVkFMVUUJCQkweDAwIC8qIEFEIERhdGEgc3RvcmVkCisJCQkJCQkJCWluIEZJRk8gKi8KKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9EQV9PVVRQVVQJCQkweDAwCisjZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfRElHSVRBTF9JTwkJCTB4MDIKKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9FWFRFTkRFRF9JT19QT1JUUwkJMHgwNAorI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0FEX0NIQU5ORUxfQ09OVFJPTAkJMHgwNiAvKiBDaGFubmVsCisJCQkJCQkJCXNlbGVjdGlvbiAqLworI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0FEX0NIQU5ORUxfUkVBREJBQ0sJCTB4MDYKKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9JTlBVVF9TSUdOQUxfUkFOR0UJCTB4MDgKKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9SQU5HRV9TVEFUVVNfUkVBREJBQ0sJCTB4MDgKKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9UUklHR0VSX01PREVfQ09OVFJPTAkJMHgwQQorI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0FEX01PREVfSU5URVJSVVBUX1JFQURCQUNLCTB4MEEKKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl9TT0ZUV0FSRV9UUklHR0VSCQkweDBFCisjZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfSU5URVJSVVBUX0NPTlRST0wJCTB4MEMKICNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl84MjU0X0NPVU5URVJfMAkJCTB4NDAKICNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl84MjU0X0NPVU5URVJfMQkJCTB4NDIKLSNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl84MjU0X0NPVU5URVJfMiAJCTBYNDQKKyNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl84MjU0X0NPVU5URVJfMgkJCTBYNDQKICNkZWZpbmUgUENJOTExMV9SRUdJU1RFUl84MjU0X0NPTlRST0wJCQkweDQ2Ci0jZGVmaW5lIFBDSTkxMTFfUkVHSVNURVJfSU5URVJSVVBUX0NMRUFSIAkJMHg0OAorI2RlZmluZSBQQ0k5MTExX1JFR0lTVEVSX0lOVEVSUlVQVF9DTEVBUgkJMHg0OAogCi0jZGVmaW5lIFBDSTkxMTFfVFJJR0dFUl9NQVNLIAkJCQkweDBGCi0jZGVmaW5lIFBDSTkxMTFfUFRSR19PRkYgCQkJCSgwIDw8IDMpCi0jZGVmaW5lIFBDSTkxMTFfUFRSR19PTiAJCQkJKDEgPDwgMykKKyNkZWZpbmUgUENJOTExMV9UUklHR0VSX01BU0sJCQkJMHgwRgorI2RlZmluZSBQQ0k5MTExX1BUUkdfT0ZGCQkJCSgwIDw8IDMpCisjZGVmaW5lIFBDSTkxMTFfUFRSR19PTgkJCQkJKDEgPDwgMykKICNkZWZpbmUgUENJOTExMV9FSVRTX0VYVEVSTkFMCQkJCSgxIDw8IDIpCiAjZGVmaW5lIFBDSTkxMTFfRUlUU19JTlRFUk5BTAkJCQkoMCA8PCAyKQogI2RlZmluZSBQQ0k5MTExX1RQU1RfU09GVFdBUkVfVFJJR0dFUgkJCSgwIDw8IDEpCkBAIC0xNjQsOSArMTY3LDkgQEAKIAogI2RlZmluZSBQQ0k5MTExX0lTQzBfU0VUX0lSUV9PTl9FTkRJTkdfT0ZfQURfQ09OVkVSU0lPTiAoMCA8PCAwKQogI2RlZmluZSBQQ0k5MTExX0lTQzBfU0VUX0lSUV9PTl9GSUZPX0hBTEZfRlVMTAkJKDEgPDwgMCkKLSNkZWZpbmUgUENJOTExMV9JU0MxX1NFVF9JUlFfT05fVElNRVJfVElDSyAgCQkoMCA8PCAxKQotI2RlZmluZSBQQ0k5MTExX0lTQzFfU0VUX0lSUV9PTl9FWFRfVFJHIAkJKDEgPDwgMSkKLSNkZWZpbmUgUENJOTExMV9GRkVOX1NFVF9GSUZPX0VOQUJMRSAJCQkoMCA8PCAyKQorI2RlZmluZSBQQ0k5MTExX0lTQzFfU0VUX0lSUV9PTl9USU1FUl9USUNLCQkoMCA8PCAxKQorI2RlZmluZSBQQ0k5MTExX0lTQzFfU0VUX0lSUV9PTl9FWFRfVFJHCQkJKDEgPDwgMSkKKyNkZWZpbmUgUENJOTExMV9GRkVOX1NFVF9GSUZPX0VOQUJMRQkJCSgwIDw8IDIpCiAjZGVmaW5lIFBDSTkxMTFfRkZFTl9TRVRfRklGT19ESVNBQkxFCQkJKDEgPDwgMikKIAogI2RlZmluZSBQQ0k5MTExX0NIQU5ORUxfTUFTSwkJCQkweDBGCkBAIC0xNzcsNyArMTgwLDcgQEAKICNkZWZpbmUgUENJOTExMV9GSUZPX0ZVTExfTUFTSwkJCQkweDQwCiAjZGVmaW5lIFBDSTkxMTFfQURfQlVTWV9NQVNLCQkJCTB4ODAKIAotI2RlZmluZSBQQ0k5MTExX0lPX0JBU0UgZGV2LT5pb2Jhc2UKKyNkZWZpbmUgUENJOTExMV9JT19CQVNFIChkZXYtPmlvYmFzZSkKIAogLyoKICAqIERlZmluZSBpbmxpbmVkIGZ1bmN0aW9uCkBAIC0xODksOCArMTkyLDkgQEAKICNkZWZpbmUgcGNpOTExMV90cmlnZ2VyX2FuZF9hdXRvc2Nhbl9zZXQoZmxhZ3MpIFwKICAgb3V0YihmbGFncywgUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfVFJJR0dFUl9NT0RFX0NPTlRST0wpCiAKLSNkZWZpbmUgcGNpOTExMV9pbnRlcnJ1cHRfYW5kX2ZpZm9fZ2V0KCkgXAotICAoKGluYihQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9BRF9NT0RFX0lOVEVSUlVQVF9SRUFEQkFDSykgPj4gNCkgJjB4MDMpCisjZGVmaW5lIHBjaTkxMTFfaW50ZXJydXB0X2FuZF9maWZvX2dldCgpCQkJCSAgIFwKKyAgKChpbmIoUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfQURfTU9ERV9JTlRFUlJVUFRfUkVBREJBQ0spID4+IDQpIFwKKyAgICYweDAzKQogCiAjZGVmaW5lIHBjaTkxMTFfaW50ZXJydXB0X2FuZF9maWZvX3NldChmbGFncykgXAogICBvdXRiKGZsYWdzLCBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCkKQEAgLTIwMSw0NSArMjA1LDU2IEBACiAjZGVmaW5lIHBjaTkxMTFfc29mdHdhcmVfdHJpZ2dlcigpIFwKICAgb3V0YigwLCBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9TT0ZUV0FSRV9UUklHR0VSKQogCi0jZGVmaW5lIHBjaTkxMTFfZmlmb19yZXNldCgpIFwKLSAgb3V0YihQQ0k5MTExX0ZGRU5fU0VUX0ZJRk9fRU5BQkxFLCBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCk7IFwKLSAgb3V0YihQQ0k5MTExX0ZGRU5fU0VUX0ZJRk9fRElTQUJMRSwgUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfSU5URVJSVVBUX0NPTlRST0wpOyBcCi0gIG91dGIoUENJOTExMV9GRkVOX1NFVF9GSUZPX0VOQUJMRSwgUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfSU5URVJSVVBUX0NPTlRST0wpCisjZGVmaW5lIHBjaTkxMTFfZmlmb19yZXNldCgpIGRvIHsJCQkJCVwKKyAgb3V0YihQQ0k5MTExX0ZGRU5fU0VUX0ZJRk9fRU5BQkxFLAkJCQkJXAorICAgICAgIFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX0lOVEVSUlVQVF9DT05UUk9MKTsJCVwKKyAgb3V0YihQQ0k5MTExX0ZGRU5fU0VUX0ZJRk9fRElTQUJMRSwJCQkJCVwKKyAgICAgICBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCk7CQlcCisgIG91dGIoUENJOTExMV9GRkVOX1NFVF9GSUZPX0VOQUJMRSwJCQkJCVwKKyAgICAgICBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCk7CQlcCisgIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgcGNpOTExMV9pc19maWZvX2Z1bGwoKSBcCiAgICgoaW5iKFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX1JBTkdFX1NUQVRVU19SRUFEQkFDSykmIFwKLSAgICBQQ0k5MTExX0ZJRk9fRlVMTF9NQVNLKT09MCkKKyAgICBQQ0k5MTExX0ZJRk9fRlVMTF9NQVNLKSA9PSAwKQogCiAjZGVmaW5lIHBjaTkxMTFfaXNfZmlmb19oYWxmX2Z1bGwoKSBcCiAgICgoaW5iKFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX1JBTkdFX1NUQVRVU19SRUFEQkFDSykmIFwKLSAgICBQQ0k5MTExX0ZJRk9fSEFMRl9GVUxMX01BU0spPT0wKQorICAgIFBDSTkxMTFfRklGT19IQUxGX0ZVTExfTUFTSykgPT0gMCkKIAogI2RlZmluZSBwY2k5MTExX2lzX2ZpZm9fZW1wdHkoKSBcCiAgICgoaW5iKFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX1JBTkdFX1NUQVRVU19SRUFEQkFDSykmIFwKLSAgICBQQ0k5MTExX0ZJRk9fRU1QVFlfTUFTSyk9PTApCisgICAgUENJOTExMV9GSUZPX0VNUFRZX01BU0spID09IDApCiAKLSNkZWZpbmUgcGNpOTExMV9haV9jaGFubmVsX3NldChjaGFubmVsKSBcCi0gIG91dGIoKGNoYW5uZWwpJlBDSTkxMTFfQ0hBTk5FTF9NQVNLLCBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9BRF9DSEFOTkVMX0NPTlRST0wpCisjZGVmaW5lIHBjaTkxMTFfYWlfY2hhbm5lbF9zZXQoY2hhbm5lbCkJCQkJCVwKKyAgb3V0YigoY2hhbm5lbCkmUENJOTExMV9DSEFOTkVMX01BU0ssCQkJCQlcCisgICAgICAgUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfQURfQ0hBTk5FTF9DT05UUk9MKQogCi0jZGVmaW5lIHBjaTkxMTFfYWlfY2hhbm5lbF9nZXQoKSBcCi0gIGluYihQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9BRF9DSEFOTkVMX1JFQURCQUNLKSZQQ0k5MTExX0NIQU5ORUxfTUFTSworI2RlZmluZSBwY2k5MTExX2FpX2NoYW5uZWxfZ2V0KCkJCQkJCVwKKyAgKGluYihQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9BRF9DSEFOTkVMX1JFQURCQUNLKQkJXAorICAgJlBDSTkxMTFfQ0hBTk5FTF9NQVNLKQogCi0jZGVmaW5lIHBjaTkxMTFfYWlfcmFuZ2Vfc2V0KHJhbmdlKSBcCi0gIG91dGIoKHJhbmdlKSZQQ0k5MTExX1JBTkdFX01BU0ssIFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX0lOUFVUX1NJR05BTF9SQU5HRSkKKyNkZWZpbmUgcGNpOTExMV9haV9yYW5nZV9zZXQocmFuZ2UpCQkJCQlcCisgIG91dGIoKHJhbmdlKSZQQ0k5MTExX1JBTkdFX01BU0ssCQkJCQlcCisgICAgICAgUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfSU5QVVRfU0lHTkFMX1JBTkdFKQogCi0jZGVmaW5lIHBjaTkxMTFfYWlfcmFuZ2VfZ2V0KCkgXAotICBpbmIoUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfUkFOR0VfU1RBVFVTX1JFQURCQUNLKSZQQ0k5MTExX1JBTkdFX01BU0sKKyNkZWZpbmUgcGNpOTExMV9haV9yYW5nZV9nZXQoKQkJCQkJCVwKKyAgKGluYihQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9SQU5HRV9TVEFUVVNfUkVBREJBQ0spCQlcCisgICAmUENJOTExMV9SQU5HRV9NQVNLKQogCi0jZGVmaW5lIHBjaTkxMTFfYWlfZ2V0X2RhdGEoKSBcCi0gICgoaW53KFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX0FEX0ZJRk9fVkFMVUUpPj40KSZQQ0k5MTExX0FJX1JFU09MVVRJT05fTUFTSykgXAotICBeIFBDSTkxMTFfQUlfUkVTT0xVVElPTl8yX0NNUF9CSVQKKyNkZWZpbmUgcGNpOTExMV9haV9nZXRfZGF0YSgpCQkJCQkJXAorICAoKChpbncoUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfQURfRklGT19WQUxVRSk+PjQpCQlcCisgICAgJlBDSTkxMTFfQUlfUkVTT0xVVElPTl9NQVNLKQkJCQkJXAorICAgXiBQQ0k5MTExX0FJX1JFU09MVVRJT05fMl9DTVBfQklUKQogCi0jZGVmaW5lIHBjaTkxMTFfaHJfYWlfZ2V0X2RhdGEoKSBcCi0gIChpbncoUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfQURfRklGT19WQUxVRSkgJiBQQ0k5MTExX0hSX0FJX1JFU09MVVRJT05fTUFTSykgXAotICBeIFBDSTkxMTFfSFJfQUlfUkVTT0xVVElPTl8yX0NNUF9CSVQKKyNkZWZpbmUgcGNpOTExMV9ocl9haV9nZXRfZGF0YSgpCQkJCQlcCisgICgoaW53KFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX0FEX0ZJRk9fVkFMVUUpCQkJXAorICAgICYgUENJOTExMV9IUl9BSV9SRVNPTFVUSU9OX01BU0spCQkJCQlcCisgICBeIFBDSTkxMTFfSFJfQUlfUkVTT0xVVElPTl8yX0NNUF9CSVQpCiAKLSNkZWZpbmUgcGNpOTExMV9hb19zZXRfZGF0YShkYXRhKSBcCi0gIG91dHcoZGF0YSZQQ0k5MTExX0FPX1JFU09MVVRJT05fTUFTSywgUENJOTExMV9JT19CQVNFK1BDSTkxMTFfUkVHSVNURVJfREFfT1VUUFVUKQorI2RlZmluZSBwY2k5MTExX2FvX3NldF9kYXRhKGRhdGEpCQkJCQlcCisgIG91dHcoZGF0YSZQQ0k5MTExX0FPX1JFU09MVVRJT05fTUFTSywJCQkJCVwKKyAgICAgICBQQ0k5MTExX0lPX0JBU0UrUENJOTExMV9SRUdJU1RFUl9EQV9PVVRQVVQpCiAKICNkZWZpbmUgcGNpOTExMV9kaV9nZXRfYml0cygpIFwKICAgaW53KFBDSTkxMTFfSU9fQkFTRStQQ0k5MTExX1JFR0lTVEVSX0RJR0lUQUxfSU8pCkBAIC0yODQsMTIgKzI5OSwxMSBAQAogfTsKIAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHBjaTkxMTFfcGNpX3RhYmxlKSA9IHsKLQl7Ci0JUENJX1ZFTkRPUl9JRF9BRExJTkssIFBDSTkxMTFfSFJfREVWSUNFX0lELCBQQ0lfQU5ZX0lELAotCQkgICAgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0JICAgIC8qIHsgUENJX1ZFTkRPUl9JRF9BRExJTkssIFBDSTkxMTFfSEdfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sICovCi0JewotCTB9CisJeyBQQ0lfVkVORE9SX0lEX0FETElOSywgUENJOTExMV9IUl9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICAwLCAwLCAwIH0sCisJLyogeyBQQ0lfVkVORE9SX0lEX0FETElOSywgUENJOTExMV9IR19ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICogICAwLCAwLCAwIH0sICovCisJeyAwIH0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2k5MTExX3BjaV90YWJsZSk7CkBAIC0zMzcsNyArMzUxLDQzIEBACiAJLmRldGFjaCA9IHBjaTkxMTFfZGV0YWNoLAogfTsKIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChwY2k5MTExX2RyaXZlciwgcGNpOTExMV9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgcGNpOTExMV9kcml2ZXJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBwY2k5MTExX2RyaXZlci5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwY2k5MTExX2RyaXZlcl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwY2k5MTExX2RyaXZlcl9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IHBjaTkxMTFfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZwY2k5MTExX2RyaXZlcl9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZwY2k5MTExX2RyaXZlcl9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNpOTExMV9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmcGNpOTExMV9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcGNpOTExMV9kcml2ZXJfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilwY2k5MTExX2RyaXZlci5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpOTExMV9kcml2ZXJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2k5MTExX2RyaXZlcl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpOTExMV9kcml2ZXJfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZwY2k5MTExX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBjaTkxMTFfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBjaTkxMTFfZHJpdmVyX2NsZWFudXBfbW9kdWxlKTsKIAogLyogIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIApAQCAtMzQ1LDcgKzM5NSw4IEBACiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CiAJdW5zaWduZWQgbG9uZyBpb19yYW5nZTsJLyogIFBDSTY1MDMgaW8gcmFuZ2UgKi8KIAotCXVuc2lnbmVkIGxvbmcgbGNyX2lvX2Jhc2U7CS8qICBMb2NhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgbGNyX2lvX2Jhc2U7IC8qIExvY2FsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZQorCQkJCSAgICAqIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBsb25nIGxjcl9pb19yYW5nZTsKIAogCWludCBzdG9wX2NvdW50ZXI7CkBAIC0zNTgsNyArNDA5LDggQEAKIAogCWludCBhb19yZWFkYmFjazsJLyogIExhc3Qgd3JpdHRlbiBhbmFsb2cgb3V0cHV0IGRhdGEgKi8KIAotCXVuc2lnbmVkIGludCB0aW1lcl9kaXZpc29yXzE7CS8qICBEaXZpc29yIHZhbHVlcyBmb3IgdGhlIDgyNTQgdGltZXIgcGFjZXIgKi8KKwl1bnNpZ25lZCBpbnQgdGltZXJfZGl2aXNvcl8xOyAvKiBEaXZpc29yIHZhbHVlcyBmb3IgdGhlIDgyNTQgdGltZXIKKwkJCQkgICAgICAgKiBwYWNlciAqLwogCXVuc2lnbmVkIGludCB0aW1lcl9kaXZpc29yXzI7CiAKIAlpbnQgaXNfdmFsaWQ7CQkvKiAgSXMgZGV2aWNlIHZhbGlkICovCkBAIC0zNjYsNyArNDE4LDcgQEAKIAlzaG9ydCBhaV9ib3VuY2VfYnVmZmVyWzIgKiBQQ0k5MTExX0ZJRk9fSEFMRl9TSVpFXTsKIH07CiAKLSNkZWZpbmUgZGV2X3ByaXZhdGUgCSgoc3RydWN0IHBjaTkxMTFfcHJpdmF0ZV9kYXRhICopZGV2LT5wcml2YXRlKQorI2RlZmluZSBkZXZfcHJpdmF0ZQkoKHN0cnVjdCBwY2k5MTExX3ByaXZhdGVfZGF0YSAqKWRldi0+cHJpdmF0ZSkKIAogLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogIFBMWDkwNTAgU0VDVElPTiAqLwpAQCAtNTQ4LDEwICs2MDAsMTIgQEAKIAogLyogIFRlc3QgYW5hbG9nIGlucHV0IGNvbW1hbmQgKi8KIAotI2RlZmluZSBwY2k5MTExX2NoZWNrX3RyaWdnZXJfc3JjKHNyYywgZmxhZ3MpIFwKLSAgdG1wID0gc3JjOyBcCi0gIHNyYyAmPSBmbGFnczsgXAotICBpZiAoIXNyYyB8fCB0bXAgIT0gc3JjKSBlcnJvcisrCisjZGVmaW5lIHBjaTkxMTFfY2hlY2tfdHJpZ2dlcl9zcmMoc3JjLCBmbGFncykJZG8gewkJCVwKKwkJdG1wID0gc3JjOwkJCQkJCVwKKwkJc3JjICY9IGZsYWdzOwkJCQkJCVwKKwkJaWYgKCFzcmMgfHwgdG1wICE9IHNyYykJCQkJCVwKKwkJCWVycm9yKys7CQkJCQlcCisJfSB3aGlsZSAoZmFsc2UpOwogCiBzdGF0aWMgaW50CiBwY2k5MTExX2FpX2RvX2NtZF90ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC01NzUsNyArNjI5LDggQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAxOwogCi0JLyogIHN0ZXAgMiA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCS8qICBzdGVwIDIgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5CisJICogIGNvbXBhdGlibGUgKi8KIAogCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykKIAkJZXJyb3IrKzsKQEAgLTYzNyw3ICs2OTIsOCBAQAogCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gYm9hcmQtPmFpX2FjcXVpc2l0aW9uX3BlcmlvZF9taW5fbnM7CiAJCWVycm9yKys7CiAJfQotCWlmICgoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgJiYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gMCkpIHsKKwlpZiAoKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpCisJICAgICYmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApKSB7CiAJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOwogCQllcnJvcisrOwogCX0KQEAgLTEyMTYsNyArMTI3Miw3IEBACiB7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZTsKIAl1bnNpZ25lZCBsb25nIGlvX2Jhc2UsIGlvX3JhbmdlLCBsY3JfaW9fYmFzZSwgbGNyX2lvX3JhbmdlOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlID0gTlVMTDsKIAlpbnQgZXJyb3IsIGk7CiAJY29uc3Qgc3RydWN0IHBjaTkxMTFfYm9hcmQgKmJvYXJkOwogCkBAIC0xMjI2LDE3ICsxMjgyLDE3IEBACiAKIAlwcmludGsoImNvbWVkaSVkOiAiIFBDSTkxMTFfRFJJVkVSX05BTUUgIiBkcml2ZXJcbiIsIGRldi0+bWlub3IpOwogCi0JZm9yIChwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lfZGV2aWNlICE9IE5VTEw7Ci0JICAgICBwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldmljZSkpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KHBjaV9kZXZpY2UpIHsKIAkJaWYgKHBjaV9kZXZpY2UtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FETElOSykgewogCQkJZm9yIChpID0gMDsgaSA8IHBjaTkxMTFfYm9hcmRfbmJyOyBpKyspIHsKIAkJCQlpZiAocGNpOTExMV9ib2FyZHNbaV0uZGV2aWNlX2lkID09CiAJCQkJICAgIHBjaV9kZXZpY2UtPmRldmljZSkgewotCQkJCQkvKiAgd2FzIGEgcGFydGljdWxhciBidXMvc2xvdCByZXF1ZXN0ZWQ/ICovCisJCQkJCS8qIHdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QKKwkJCQkJICogcmVxdWVzdGVkPyAqLwogCQkJCQlpZiAoKGl0LT5vcHRpb25zWzBdICE9IDApCiAJCQkJCSAgICB8fCAoaXQtPm9wdGlvbnNbMV0gIT0gMCkpIHsKLQkJCQkJCS8qICBhcmUgd2Ugb24gdGhlIHdyb25nIGJ1cy9zbG90PyAqLworCQkJCQkJLyogYXJlIHdlIG9uIHRoZSB3cm9uZworCQkJCQkJICogYnVzL3Nsb3Q/ICovCiAJCQkJCQlpZiAocGNpX2RldmljZS0+YnVzLT5udW1iZXIgIT0KIAkJCQkJCSAgICBpdC0+b3B0aW9uc1swXQogCQkJCQkJICAgIHx8CkBAIC0xMjcyLDcgKzEzMjgsOCBAQAogCiAJLyogIFRPRE86IFdhcm4gYWJvdXQgbm9uLXRlc3RlZCBib2FyZHMuICovCiAKLQkvKiAgUmVhZCBsb2NhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjMV0uICovCisJLyogIFJlYWQgbG9jYWwgY29uZmlndXJhdGlvbiByZWdpc3RlciBiYXNlIGFkZHJlc3MKKwkgKiAgW1BDSV9CQVNFX0FERFJFU1MgIzFdLiAqLwogCiAJbGNyX2lvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldmljZSwgMSk7CiAJbGNyX2lvX3JhbmdlID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2aWNlLCAxKTsKQEAgLTEzOTksMyArMTQ1Niw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwppbmRleCBjY2VmNTQ5Li5iMGUzOWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwpAQCAtMjg5LDcgKzI4OSw0MyBAQAogCS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGJvYXJkdHlwZSksCiB9OwogCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2k5MTE4LCBwY2k5MTE4X3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfcGNpOTExOF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9wY2k5MTE4LmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9wY2k5MTE4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9wY2k5MTE4X3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGNpOTExOF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9wY2k5MTE4X3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9wY2k5MTE4X3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNpOTExOF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNpOTExOCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfcGNpOTExOF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9wY2k5MTE4LmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpOTExOF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2k5MTE4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpOTExOF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2k5MTE4KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjaTkxMThfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjaTkxMThfY2xlYW51cF9tb2R1bGUpOwogCiBzdHJ1Y3QgcGNpOTExOF9wcml2YXRlIHsKIAl1bnNpZ25lZCBsb25nIGlvYmFzZV9hOwkvKiBiYXNlK3NpemUgZm9yIEFNQ0MgY2hpcCAqLwpAQCAtMjQzMiwzICsyNDY4LDcgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYwppbmRleCBmM2JhNjQ1Li40YjQ3MDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRxMTJiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jCkBAIC00MDIsNCArNDAyLDE5IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfYWRxMTJiKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hZHExMmJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2FkcTEyYik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYWRxMTJiX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYWRxMTJiKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2FkcTEyYl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYWRxMTJiX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwppbmRleCA2N2M0ZjExLi5iZGQ2OTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwpAQCAtMTksNyArMTksNyBAQAogLyoKIERyaXZlcjogYWR2X3BjaTE3MTAKIERlc2NyaXB0aW9uOiBBZHZhbnRlY2ggUENJLTE3MTAsIFBDSS0xNzEwSEcsIFBDSS0xNzExLCBQQ0ktMTcxMywKLSAgICAgICAgICAgICBBZHZhbnRlY2ggUENJLTE3MjAsIFBDSS0xNzMxCisJICAgICBBZHZhbnRlY2ggUENJLTE3MjAsIFBDSS0xNzMxCiBBdXRob3I6IE1pY2hhbCBEb2JlcyA8ZG9iZXNAdGVzbmV0LmN6PgogRGV2aWNlczogW0FkdmFudGVjaF0gUENJLTE3MTAgKGFkdl9wY2kxNzEwKSwgUENJLTE3MTBIRyAocGNpMTcxMGhnKSwKICAgUENJLTE3MTEgKGFkdl9wY2kxNzEwKSwgUENJLTE3MTMsIFBDSS0xNzIwLApAQCAtMzcsOCArMzcsOCBAQAogQ29uZmlndXJhdGlvbiBvcHRpb25zOgogICBbMF0gLSBQQ0kgYnVzIG9mIGRldmljZSAob3B0aW9uYWwpCiAgIFsxXSAtIFBDSSBzbG90IG9mIGRldmljZSAob3B0aW9uYWwpCi0gICAgICAgICAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IGF2YWlsYWJsZSBQQ0kKLSAgICAgICAgICBkZXZpY2Ugd2lsbCBiZSB1c2VkLgorCUlmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhdmFpbGFibGUgUENJCisJZGV2aWNlIHdpbGwgYmUgdXNlZC4KICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTUwLDcgKzUwLDkgQEAKICNpbmNsdWRlICI4MjUzLmgiCiAjaW5jbHVkZSAiYW1jY19zNTkzMy5oIgogCi0jZGVmaW5lIFBDSTE3MXhfUEFSQU5PSURDSEVDSwkvKiBpZiBkZWZpbmVkLCB0aGVuIGlzIHVzZWQgY29kZSB3aGljaCBjb250cm9sIGNvcnJlY3QgY2hhbm5lbCBudW1iZXIgb24gZXZlcnkgMTIgYml0IHNhbXBsZSAqLworI2RlZmluZSBQQ0kxNzF4X1BBUkFOT0lEQ0hFQ0sJLyogaWYgZGVmaW5lZCwgdGhlbiBpcyB1c2VkIGNvZGUgd2hpY2ggY29udHJvbAorCQkJCSAqIGNvcnJlY3QgY2hhbm5lbCBudW1iZXIgb24gZXZlcnkgMTIgYml0CisJCQkJICogc2FtcGxlICovCiAKICN1bmRlZiBQQ0kxNzFYX0VYVERFQlVHCiAKQEAgLTcwLDggKzcyLDggQEAKICNkZWZpbmUgVFlQRV9QQ0kxNzEzCTIKICNkZWZpbmUgVFlQRV9QQ0kxNzIwCTMKIAotI2RlZmluZSBJT1JBTkdFXzE3MXggCTMyCi0jZGVmaW5lIElPUkFOR0VfMTcyMCAJMTYKKyNkZWZpbmUgSU9SQU5HRV8xNzF4CTMyCisjZGVmaW5lIElPUkFOR0VfMTcyMAkxNgogCiAjZGVmaW5lIFBDSTE3MXhfQURfREFUQQkgMAkvKiBSOiAgIEEvRCBkYXRhICovCiAjZGVmaW5lIFBDSTE3MXhfU09GVFRSRwkgMAkvKiBXOiAgIHNvZnQgdHJpZ2dlciBmb3IgQS9EICovCkBAIC05MSwxMyArOTMsMTUgQEAKICNkZWZpbmUgUENJMTcxeF9DTlQyCTI4CS8qIFIvVzogODI1NCBjb3VudGVyIDIgKi8KICNkZWZpbmUgUENJMTcxeF9DTlRDVFJMCTMwCS8qIFc6ICAgODI1NCBjb3VudGVyIGNvbnRyb2wgKi8KIAotLyogdXBwZXIgYml0cyBmcm9tIHN0YXR1cyByZWdpc3RlciAoUENJMTcxeF9TVEFUVVMpIChsb3dlciBpcyBzYW1lIHdvdGggY29udHJvbCByZWcpICovCisvKiB1cHBlciBiaXRzIGZyb20gc3RhdHVzIHJlZ2lzdGVyIChQQ0kxNzF4X1NUQVRVUykgKGxvd2VyIGlzIHNhbWUgd2l0aCBjb250cm9sCisgKiByZWcpICovCiAjZGVmaW5lCVN0YXR1c19GRQkweDAxMDAJLyogMT1GSUZPIGlzIGVtcHR5ICovCiAjZGVmaW5lIFN0YXR1c19GSAkweDAyMDAJLyogMT1GSUZPIGlzIGhhbGYgZnVsbCAqLwogI2RlZmluZSBTdGF0dXNfRkYJMHgwNDAwCS8qIDE9RklGTyBpcyBmdWxsLCBmYXRhbCBlcnJvciAqLwogI2RlZmluZSBTdGF0dXNfSVJRCTB4MDgwMAkvKiAxPUlSUSBvY2N1cmVkICovCiAvKiBiaXRzIGZyb20gY29udHJvbCByZWdpc3RlciAoUENJMTcxeF9DT05UUk9MKSAqLwotI2RlZmluZSBDb250cm9sX0NOVDAJMHgwMDQwCS8qIDE9Q05UMCBoYXZlIGV4dGVybmFsIHNvdXJjZSwgMD1oYXZlIGludGVybmFsIDEwMGtIeiBzb3VyY2UgKi8KKyNkZWZpbmUgQ29udHJvbF9DTlQwCTB4MDA0MAkvKiAxPUNOVDAgaGF2ZSBleHRlcm5hbCBzb3VyY2UsCisJCQkJICogMD1oYXZlIGludGVybmFsIDEwMGtIeiBzb3VyY2UgKi8KICNkZWZpbmUgQ29udHJvbF9PTkVGSAkweDAwMjAJLyogMT1JUlEgb24gRklGTyBpcyBoYWxmIGZ1bGwsIDA9ZXZlcnkgc2FtcGxlICovCiAjZGVmaW5lIENvbnRyb2xfSVJRRU4JMHgwMDEwCS8qIDE9ZW5hYmxlIElSUSAqLwogI2RlZmluZSBDb250cm9sX0dBVEUJMHgwMDA4CS8qIDE9ZW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgR0FURSAoODI1ND8pICovCkBAIC0xMTIsNyArMTE2LDggQEAKICNkZWZpbmUgQ291bnRlcl9SVzAgICAgIDB4MDAxMAkvKiBSVzAvUlcxIHNlbGVjdCByZWFkL3dyaXRlIG1vZGUgKi8KICNkZWZpbmUgQ291bnRlcl9SVzEgICAgIDB4MDAyMAogI2RlZmluZSBDb3VudGVyX1NDMCAgICAgMHgwMDQwCS8qIFNlbGVjdCBDb3VudGVyLiBPbmx5IDAwIG9yIDExIG1heSAqLwotI2RlZmluZSBDb3VudGVyX1NDMSAgICAgMHgwMDgwCS8qIGJlIHVzZWQsIDAwIGZvciBDTlQwLCAxMSBmb3IgcmVhZC1iYWNrIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ291bnRlcl9TQzEgICAgIDB4MDA4MAkvKiBiZSB1c2VkLCAwMCBmb3IgQ05UMCwKKwkJCQkgKiAxMSBmb3IgcmVhZC1iYWNrIGNvbW1hbmQgKi8KIAogI2RlZmluZSBQQ0kxNzIwX0RBMAkgMAkvKiBXOiAgIEQvQSByZWdpc3RlciAwICovCiAjZGVmaW5lIFBDSTE3MjBfREExCSAyCS8qIFc6ICAgRC9BIHJlZ2lzdGVyIDEgKi8KQEAgLTEzOCw4ICsxNDMsOCBAQAogCQkJCQkJCSAgfQogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgcmFuZ2VfY29kZXNfcGNpMTcxMF8zW10gPQotICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMyB9Oworc3RhdGljIGNvbnN0IGNoYXIgcmFuZ2VfY29kZXNfcGNpMTcxMF8zW10gPSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsCisJCQkJCSAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX3BjaTE3MTBoZyA9IHsgMTIsIHsKIAkJCQkJCQkgICBCSVBfUkFOR0UoNSksCkBAIC0xNTcsMTAgKzE2Miw5IEBACiAJCQkJCQkJICAgfQogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgcmFuZ2VfY29kZXNfcGNpMTcxMGhnW10gPQotICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgxMCwgMHgxMSwgMHgxMiwKLQkweDEzCi19Oworc3RhdGljIGNvbnN0IGNoYXIgcmFuZ2VfY29kZXNfcGNpMTcxMGhnW10gPSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsCisJCQkJCSAgICAgIDB4MDUsIDB4MDYsIDB4MDcsIDB4MTAsIDB4MTEsCisJCQkJCSAgICAgIDB4MTIsIDB4MTMgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX3BjaTE3eDEgPSB7IDUsIHsKIAkJCQkJCQlCSVBfUkFOR0UoMTApLApAQCAtMzAxLDcgKzMwNSw4IEBACiAJdW5zaWduZWQgaW50IGFpX3RpbWVyMTsJLyogIHRpbWVycyAqLwogCXVuc2lnbmVkIGludCBhaV90aW1lcjI7CiAJc2hvcnQgYW9fZGF0YVs0XTsJLyogIGRhdGEgb3V0cHV0IGJ1ZmZlciAqLwotCXVuc2lnbmVkIGludCBjbnQwX3dyaXRlX3dhaXQ7CS8qICBhZnRlciBhIHdyaXRlLCB3YWl0IGZvciB1cGRhdGUgb2YgdGhlIGludGVybmFsIHN0YXRlICovCisJdW5zaWduZWQgaW50IGNudDBfd3JpdGVfd2FpdDsJLyogYWZ0ZXIgYSB3cml0ZSwgd2FpdCBmb3IgdXBkYXRlIG9mIHRoZQorCQkJCQkgKiBpbnRlcm5hbCBzdGF0ZSAqLwogfTsKIAogI2RlZmluZSBkZXZwcml2ICgoc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqKWRldi0+cHJpdmF0ZSkKQEAgLTMyNCw3ICszMjksOSBAQAogc3RhdGljIGludCBwY2kxNzF4X2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXV4b25lY2hhbltdID0geyAweDAwMDAsIDB4MDEwMSwgMHgwMjAyLCAweDAzMDMsIDB4MDQwNCwgMHgwNTA1LCAweDA2MDYsIDB4MDcwNywJLyogIHVzZWQgZm9yIGdhaW4gbGlzdCBwcm9ncmFtbWluZyAqLworLyogIHVzZWQgZm9yIGdhaW4gbGlzdCBwcm9ncmFtbWluZyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtdXhvbmVjaGFuW10gPSB7CisJMHgwMDAwLCAweDAxMDEsIDB4MDIwMiwgMHgwMzAzLCAweDA0MDQsIDB4MDUwNSwgMHgwNjA2LCAweDA3MDcsCiAJMHgwODA4LCAweDA5MDksIDB4MGEwYSwgMHgwYjBiLCAweDBjMGMsIDB4MGQwZCwgMHgwZTBlLCAweDBmMGYsCiAJMHgxMDEwLCAweDExMTEsIDB4MTIxMiwgMHgxMzEzLCAweDE0MTQsIDB4MTUxNSwgMHgxNjE2LCAweDE3MTcsCiAJMHgxODE4LCAweDE5MTksIDB4MWExYSwgMHgxYjFiLCAweDFjMWMsIDB4MWQxZCwgMHgxZTFlLCAweDFmMWYKQEAgLTc3NCw3ICs3ODEsOCBAQAogCX0KIAogCWlmICghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpCi0JCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewkvKiBhbGwgZGF0YSBzYW1wbGVkICovCisJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgeyAvKiBhbGwgZGF0YQorCQkJCQkJCQkgICAgc2FtcGxlZCAqLwogCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwpAQCAtMTU1OSw3ICsxNTY3LDggQEAKIAkJcy0+bWF4ZGF0YSA9IDE7CiAJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fZG9jaGFuOwogCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pb19iaXRzID0gKDEgPDwgdGhpc19ib2FyZC0+bl9kb2NoYW4pIC0gMTsJLyogYWxsIGJpdHMgb3V0cHV0ICovCisJCS8qIGFsbCBiaXRzIG91dHB1dCAqLworCQlzLT5pb19iaXRzID0gKDEgPDwgdGhpc19ib2FyZC0+bl9kb2NoYW4pIC0gMTsKIAkJcy0+c3RhdGUgPSAwOwogCQlzLT5pbnNuX2JpdHMgPSBwY2kxNzF4X2luc25fYml0c19kbzsKIAkJc3ViZGV2Kys7CkBAIC0xNjA5LDcgKzE2MTgsNDcgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2kxNzEwLCBwY2kxNzEwX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfcGNpMTcxMF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9wY2kxNzEwLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9wY2kxNzEwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9wY2kxNzEwX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGNpMTcxMF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9wY2kxNzEwX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9wY2kxNzEwX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNpMTcxMF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNpMTcxMCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfcGNpMTcxMF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9wY2kxNzEwLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpMTcxMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2kxNzEwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpMTcxMF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2kxNzEwKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjaTE3MTBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjaTE3MTBfY2xlYW51cF9tb2R1bGUpOwogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYwppbmRleCA5ZmU4ZmNjLi5iMTMzYmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYwpAQCAtNDk2LDQgKzQ5Niw0NCBAQAogICogQSBjb252ZW5pZW50IG1hY3JvIHRoYXQgZGVmaW5lcyBpbml0X21vZHVsZSgpIGFuZCBjbGVhbnVwX21vZHVsZSgpLAogICogYXMgbmVjZXNzYXJ5LgogICovCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2kxNzIzLCBwY2kxNzIzX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfcGNpMTcyM19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9wY2kxNzIzLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9wY2kxNzIzX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9wY2kxNzIzX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGNpMTcyM19wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9wY2kxNzIzX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9wY2kxNzIzX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNpMTcyM19pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNpMTcyMyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfcGNpMTcyM19wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9wY2kxNzIzLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpMTcyM19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2kxNzIzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpMTcyM19wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2kxNzIzKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjaTE3MjNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjaTE3MjNfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaV9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCmluZGV4IGU0MjRhMGMuLmQwMThiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCkBAIC04LDggKzgsOCBAQAogLyoKIERyaXZlcjogYWR2X3BjaV9kaW8KIERlc2NyaXB0aW9uOiBBZHZhbnRlY2ggUENJLTE3MzAsIFBDSS0xNzMzLCBQQ0ktMTczNCwgUENJLTE3MzVVLAotICAgICAgICAgICAgIFBDSS0xNzM2VVAsIFBDSS0xNzUwLCBQQ0ktMTc1MSwgUENJLTE3NTIsIFBDSS0xNzUzL0UsCi0gICAgICAgICAgICAgUENJLTE3NTQsIFBDSS0xNzU2LCBQQ0ktMTc2MgorCVBDSS0xNzM2VVAsIFBDSS0xNzUwLCBQQ0ktMTc1MSwgUENJLTE3NTIsIFBDSS0xNzUzL0UsCisJUENJLTE3NTQsIFBDSS0xNzU2LCBQQ0ktMTc2MgogQXV0aG9yOiBNaWNoYWwgRG9iZXMgPGRvYmVzQHRlc25ldC5jej4KIERldmljZXM6IFtBZHZhbnRlY2hdIFBDSS0xNzMwIChhZHZfcGNpX2RpbyksIFBDSS0xNzMzLAogICBQQ0ktMTczNCwgUENJLTE3MzVVLCBQQ0ktMTczNlVQLCBQQ0ktMTc1MCwKQEAgLTI0LDggKzI0LDggQEAKIENvbmZpZ3VyYXRpb24gb3B0aW9uczoKICAgWzBdIC0gUENJIGJ1cyBvZiBkZXZpY2UgKG9wdGlvbmFsKQogICBbMV0gLSBQQ0kgc2xvdCBvZiBkZXZpY2UgKG9wdGlvbmFsKQotICAgICAgICAgIElmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhdmFpbGFibGUgUENJCi0gICAgICAgICAgZGV2aWNlIHdpbGwgYmUgdXNlZC4KKwlJZiBidXMvc2xvdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXZhaWxhYmxlIFBDSQorCWRldmljZSB3aWxsIGJlIHVzZWQuCiAKICovCiAKQEAgLTY3LDkgKzY3LDEyIEBACiAKICNkZWZpbmUgTUFYX0RJX1NVQkRFVlMJMgkvKiBtYXggbnVtYmVyIG9mIERJIHN1YmRldmljZXMgcGVyIGNhcmQgKi8KICNkZWZpbmUgTUFYX0RPX1NVQkRFVlMJMgkvKiBtYXggbnVtYmVyIG9mIERPIHN1YmRldmljZXMgcGVyIGNhcmQgKi8KLSNkZWZpbmUgTUFYX0RJT19TVUJERVZHCTIJLyogbWF4IG51bWJlciBvZiBESU8gc3ViZGV2aWNlcyBncm91cCBwZXIgY2FyZCAqLwotI2RlZmluZSBNQVhfODI1NF9TVUJERVZTICAgMQkvKiBtYXggbnVtYmVyIG9mIDgyNTQgY291bnRlciBzdWJkZXZzIHBlciBjYXJkICovCi0JCQkJLyogKGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgODI1NCBwZXIgc3ViZGV2aWNlKSAqLworI2RlZmluZSBNQVhfRElPX1NVQkRFVkcJMgkvKiBtYXggbnVtYmVyIG9mIERJTyBzdWJkZXZpY2VzIGdyb3VwIHBlcgorCQkJCSAqIGNhcmQgKi8KKyNkZWZpbmUgTUFYXzgyNTRfU1VCREVWUyAgIDEJLyogbWF4IG51bWJlciBvZiA4MjU0IGNvdW50ZXIgc3ViZGV2cyBwZXIKKwkJCQkgKiBjYXJkICovCisJCQkJLyogKGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgODI1NCBwZXIKKwkJCQkgKiBzdWJkZXZpY2UpICovCiAKICNkZWZpbmUgU0laRV84MjU0CSAgIDQJLyogODI1NCBJTyBzcGFjZSBsZW5ndGggKi8KICNkZWZpbmUgU0laRV84MjU1CSAgIDQJLyogODI1NSBJTyBzcGFjZSBsZW5ndGggKi8KQEAgLTg0LDcgKzg3LDggQEAKICNkZWZpbmUgUENJMTczMF9ETwkgICAyCS8qIFc6ICAgRGlnaXRhbCBvdXRwdXQgMC0xNSAqLwogI2RlZmluZSBQQ0kxNzMzX0lESQkgICAwCS8qIFI6ICAgSXNvbGF0ZWQgZGlnaXRhbCBpbnB1dCAgMC0zMSAqLwogI2RlZmluZQlQQ0kxNzMwXzNfSU5UX0VOCTB4MDgJLyogUi9XOiBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0jZGVmaW5lCVBDSTE3MzBfM19JTlRfUkYJMHgwYwkvKiBSL1c6IHNldCBmYWxsaW5nL3JhaXNpbmcgZWRnZSBmb3IgaW50ZXJydXB0cyAqLworI2RlZmluZQlQQ0kxNzMwXzNfSU5UX1JGCTB4MGMJLyogUi9XOiBzZXQgZmFsbGluZy9yYWlzaW5nIGVkZ2UgZm9yCisJCQkJCSAqIGludGVycnVwdHMgKi8KICNkZWZpbmUJUENJMTczMF8zX0lOVF9DTFIJMHgxMAkvKiBSL1c6IGNsZWFyIGludGVycnVwdHMgKi8KICNkZWZpbmUgUENJMTczNF9JRE8JICAgMAkvKiBXOiAgIElzb2xhdGVkIGRpZ2l0YWwgb3V0cHV0IDAtMzEgKi8KICNkZWZpbmUgUENJMTczeF9CT0FSRElECSAgIDQJLyogUjogICBCb2FyZCBJL0Qgc3dpdGNoIGZvciAxNzMwLzMvNCAqLwpAQCAtOTksNyArMTAzLDggQEAKICNkZWZpbmUgUENJMTczNl9JREkgICAgICAgIDAJLyogUjogICBJc29sYXRlZCBkaWdpdGFsIGlucHV0ICAwLTE1ICovCiAjZGVmaW5lIFBDSTE3MzZfSURPICAgICAgICAwCS8qIFc6ICAgSXNvbGF0ZWQgZGlnaXRhbCBvdXRwdXQgMC0xNSAqLwogI2RlZmluZSBQQ0kxNzM2XzNfSU5UX0VOICAgICAgICAweDA4CS8qIFIvVzogZW5hYmxlL2Rpc2FibGUgaW50ZXJydXB0cyAqLwotI2RlZmluZSBQQ0kxNzM2XzNfSU5UX1JGICAgICAgICAweDBjCS8qIFIvVzogc2V0IGZhbGxpbmcvcmFpc2luZyBlZGdlIGZvciBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFBDSTE3MzZfM19JTlRfUkYgICAgICAgIDB4MGMJLyogUi9XOiBzZXQgZmFsbGluZy9yYWlzaW5nIGVkZ2UgZm9yCisJCQkJCSAqIGludGVycnVwdHMgKi8KICNkZWZpbmUgUENJMTczNl8zX0lOVF9DTFIgICAgICAgMHgxMAkvKiBSL1c6IGNsZWFyIGludGVycnVwdHMgKi8KICNkZWZpbmUgUENJMTczNl9CT0FSRElEICAgIDQJLyogUjogICBCb2FyZCBJL0Qgc3dpdGNoIGZvciAxNzM2VVAgKi8KICNkZWZpbmUgUENJMTczNl9NQUlOUkVHICAgIDAJLyogTm9ybWFsIHJlZ2lzdGVyICgyKSBkb2Vzbid0IHdvcmsgKi8KQEAgLTE2MSwzNyArMTY2LDY2IEBACiAjZGVmaW5lIElOVENTUjMJCTB4M2IKIAogLyogIFBDSS0xNzYwIG1haWxib3ggY29tbWFuZHMgKi8KLSNkZWZpbmUgQ01EX0NsZWFySU1CMgkJMHgwMAkvKiBDbGVhciBJTUIyIHN0YXR1cyBhbmQgcmV0dXJuIGFjdGF1bCBESSBzdGF0dXMgaW4gSU1CMyAqLworI2RlZmluZSBDTURfQ2xlYXJJTUIyCQkweDAwCS8qIENsZWFyIElNQjIgc3RhdHVzIGFuZCByZXR1cm4gYWN0dWFsCisJCQkJCSAqIERJIHN0YXR1cyBpbiBJTUIzICovCiAjZGVmaW5lIENNRF9TZXRSZWxheXNPdXRwdXQJMHgwMQkvKiBTZXQgcmVsYXkgb3V0cHV0IGZyb20gT01CMCAqLwogI2RlZmluZSBDTURfR2V0UmVsYXlzU3RhdHVzCTB4MDIJLyogR2V0IHJlbGF5IHN0YXR1cyB0byBJTUIwICovCi0jZGVmaW5lIENNRF9SZWFkQ3VycmVudFN0YXR1cwkweDA3CS8qIFJlYWQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSByZWdpc3RlciBpbiBPTUIwLCByZXN1bHQgaW4gSU1CMCAqLwotI2RlZmluZSBDTURfUmVhZEZpcm13YXJlVmVyc2lvbgkweDBlCS8qIFJlYWQgdGhlIGZpcm13YXJlIHZlci4sIHJlc3VsdCBpbiBJTUIxLklNQjAgKi8KLSNkZWZpbmUgQ01EX1JlYWRIYXJkd2FyZVZlcnNpb24JMHgwZgkvKiBSZWFkIHRoZSBoYXJkd2FyZSB2ZXIuLCByZXN1bHQgaW4gSU1CMS5JTUIwICovCi0jZGVmaW5lIENNRF9FbmFibGVJRElGaWx0ZXJzCTB4MjAJLyogRW5hYmxlIElESSBmaWx0ZXJzIGJhc2VkIG9uIGJpdHMgaW4gT01CMCAqLwotI2RlZmluZSBDTURfRW5hYmxlSURJUGF0dGVybk1hdGNoIDB4MjEJLyogRW5hYmxlIElESSBwYXR0ZXJuIG1hdGNoIGJhc2VkIG9uIGJpdHMgaW4gT01CMCAqLwotI2RlZmluZSBDTURfU2V0SURJUGF0dGVybk1hdGNoCTB4MjIJLyogRW5hYmxlIElESSBwYXR0ZXJuIG1hdGNoIGJhc2VkIG9uIGJpdHMgaW4gT01CMCAqLwotI2RlZmluZSBDTURfRW5hYmxlSURJQ291bnRlcnMJMHgyOAkvKiBFbmFibGUgSURJIGNvdW50ZXJzIGJhc2VkIG9uIGJpdHMgaW4gT01CMCAqLwotI2RlZmluZSBDTURfUmVzZXRJRElDb3VudGVycwkweDI5CS8qIFJlc2V0IElESSBjb3VudGVycyBiYXNlZCBvbiBiaXRzIGluIE9NQjAgdG8gaXRzIHJlc2V0IHZhbHVlcyAqLwotI2RlZmluZSBDTURfT3ZlcmZsb3dJRElDb3VudGVycwkweDJhCS8qIEVuYWJsZSBJREkgY291bnRlcnMgb3ZlcmZsb3cgaW50ZXJydXB0cyAgYmFzZWQgb24gYml0cyBpbiBPTUIwICovCi0jZGVmaW5lIENNRF9NYXRjaEludElESUNvdW50ZXJzCTB4MmIJLyogRW5hYmxlIElESSBjb3VudGVycyBtYXRjaCB2YWx1ZSBpbnRlcnJ1cHRzICBiYXNlZCBvbiBiaXRzIGluIE9NQjAgKi8KLSNkZWZpbmUgQ01EX0VkZ2VJRElDb3VudGVycwkweDJjCS8qIFNldCBJREkgdXAgY291bnRlcnMgY291bnQgZWRnZSAoYml0PTAgLSByaXNpbmcsID0xIC0gZmFsbGluZykgKi8KLSNkZWZpbmUgQ01EX0dldElESUNudEN1clZhbHVlCTB4MmYJLyogUmVhZCBJREl7T01CMH0gdXAgY291bnRlciBjdXJyZW50IHZhbHVlICovCi0jZGVmaW5lIENNRF9TZXRJREkwQ250UmVzZXRWYWx1ZSAweDQwCS8qIFNldCBJREkwIENvdW50ZXIgUmVzZXQgVmFsdWUgMjU2Kk9NQjErT01CMCAqLwotI2RlZmluZSBDTURfU2V0SURJMUNudFJlc2V0VmFsdWUgMHg0MQkvKiBTZXQgSURJMSBDb3VudGVyIFJlc2V0IFZhbHVlIDI1NipPTUIxK09NQjAgKi8KLSNkZWZpbmUgQ01EX1NldElESTJDbnRSZXNldFZhbHVlIDB4NDIJLyogU2V0IElESTIgQ291bnRlciBSZXNldCBWYWx1ZSAyNTYqT01CMStPTUIwICovCi0jZGVmaW5lIENNRF9TZXRJREkzQ250UmVzZXRWYWx1ZSAweDQzCS8qIFNldCBJREkzIENvdW50ZXIgUmVzZXQgVmFsdWUgMjU2Kk9NQjErT01CMCAqLwotI2RlZmluZSBDTURfU2V0SURJNENudFJlc2V0VmFsdWUgMHg0NAkvKiBTZXQgSURJNCBDb3VudGVyIFJlc2V0IFZhbHVlIDI1NipPTUIxK09NQjAgKi8KLSNkZWZpbmUgQ01EX1NldElESTVDbnRSZXNldFZhbHVlIDB4NDUJLyogU2V0IElESTUgQ291bnRlciBSZXNldCBWYWx1ZSAyNTYqT01CMStPTUIwICovCi0jZGVmaW5lIENNRF9TZXRJREk2Q250UmVzZXRWYWx1ZSAweDQ2CS8qIFNldCBJREk2IENvdW50ZXIgUmVzZXQgVmFsdWUgMjU2Kk9NQjErT01CMCAqLwotI2RlZmluZSBDTURfU2V0SURJN0NudFJlc2V0VmFsdWUgMHg0NwkvKiBTZXQgSURJNyBDb3VudGVyIFJlc2V0IFZhbHVlIDI1NipPTUIxK09NQjAgKi8KLSNkZWZpbmUgQ01EX1NldElESTBDbnRNYXRjaFZhbHVlIDB4NDgJLyogU2V0IElESTAgQ291bnRlciBNYXRjaCBWYWx1ZSAyNTYqT01CMStPTUIwICovCi0jZGVmaW5lIENNRF9TZXRJREkxQ250TWF0Y2hWYWx1ZSAweDQ5CS8qIFNldCBJREkxIENvdW50ZXIgTWF0Y2ggVmFsdWUgMjU2Kk9NQjErT01CMCAqLwotI2RlZmluZSBDTURfU2V0SURJMkNudE1hdGNoVmFsdWUgMHg0YQkvKiBTZXQgSURJMiBDb3VudGVyIE1hdGNoIFZhbHVlIDI1NipPTUIxK09NQjAgKi8KLSNkZWZpbmUgQ01EX1NldElESTNDbnRNYXRjaFZhbHVlIDB4NGIJLyogU2V0IElESTMgQ291bnRlciBNYXRjaCBWYWx1ZSAyNTYqT01CMStPTUIwICovCi0jZGVmaW5lIENNRF9TZXRJREk0Q250TWF0Y2hWYWx1ZSAweDRjCS8qIFNldCBJREk0IENvdW50ZXIgTWF0Y2ggVmFsdWUgMjU2Kk9NQjErT01CMCAqLwotI2RlZmluZSBDTURfU2V0SURJNUNudE1hdGNoVmFsdWUgMHg0ZAkvKiBTZXQgSURJNSBDb3VudGVyIE1hdGNoIFZhbHVlIDI1NipPTUIxK09NQjAgKi8KLSNkZWZpbmUgQ01EX1NldElESTZDbnRNYXRjaFZhbHVlIDB4NGUJLyogU2V0IElESTYgQ291bnRlciBNYXRjaCBWYWx1ZSAyNTYqT01CMStPTUIwICovCi0jZGVmaW5lIENNRF9TZXRJREk3Q250TWF0Y2hWYWx1ZSAweDRmCS8qIFNldCBJREk3IENvdW50ZXIgTWF0Y2ggVmFsdWUgMjU2Kk9NQjErT01CMCAqLworI2RlZmluZSBDTURfUmVhZEN1cnJlbnRTdGF0dXMJMHgwNwkvKiBSZWFkIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUKKwkJCQkJICogcmVnaXN0ZXIgaW4gT01CMCwgcmVzdWx0IGluIElNQjAgKi8KKyNkZWZpbmUgQ01EX1JlYWRGaXJtd2FyZVZlcnNpb24JMHgwZQkvKiBSZWFkIHRoZSBmaXJtd2FyZSB2ZXIuLCByZXN1bHQgaW4KKwkJCQkJICogSU1CMS5JTUIwICovCisjZGVmaW5lIENNRF9SZWFkSGFyZHdhcmVWZXJzaW9uCTB4MGYJLyogUmVhZCB0aGUgaGFyZHdhcmUgdmVyLiwgcmVzdWx0IGluCisJCQkJCSAqIElNQjEuSU1CMCAqLworI2RlZmluZSBDTURfRW5hYmxlSURJRmlsdGVycwkweDIwCS8qIEVuYWJsZSBJREkgZmlsdGVycyBiYXNlZCBvbiBiaXRzIGluCisJCQkJCSAqIE9NQjAgKi8KKyNkZWZpbmUgQ01EX0VuYWJsZUlESVBhdHRlcm5NYXRjaCAweDIxCS8qIEVuYWJsZSBJREkgcGF0dGVybiBtYXRjaCBiYXNlZCBvbgorCQkJCQkgKiBiaXRzIGluIE9NQjAgKi8KKyNkZWZpbmUgQ01EX1NldElESVBhdHRlcm5NYXRjaAkweDIyCS8qIEVuYWJsZSBJREkgcGF0dGVybiBtYXRjaCBiYXNlZCBvbgorCQkJCQkgKiBiaXRzIGluIE9NQjAgKi8KKyNkZWZpbmUgQ01EX0VuYWJsZUlESUNvdW50ZXJzCTB4MjgJLyogRW5hYmxlIElESSBjb3VudGVycyBiYXNlZCBvbiBiaXRzIGluCisJCQkJCSAqIE9NQjAgKi8KKyNkZWZpbmUgQ01EX1Jlc2V0SURJQ291bnRlcnMJMHgyOQkvKiBSZXNldCBJREkgY291bnRlcnMgYmFzZWQgb24gYml0cyBpbgorCQkJCQkgKiBPTUIwIHRvIGl0cyByZXNldCB2YWx1ZXMgKi8KKyNkZWZpbmUgQ01EX092ZXJmbG93SURJQ291bnRlcnMJMHgyYQkvKiBFbmFibGUgSURJIGNvdW50ZXJzIG92ZXJmbG93CisJCQkJCSAqIGludGVycnVwdHMgIGJhc2VkIG9uIGJpdHMgaW4gT01CMCAqLworI2RlZmluZSBDTURfTWF0Y2hJbnRJRElDb3VudGVycwkweDJiCS8qIEVuYWJsZSBJREkgY291bnRlcnMgbWF0Y2ggdmFsdWUKKwkJCQkJICogaW50ZXJydXB0cyAgYmFzZWQgb24gYml0cyBpbiBPTUIwICovCisjZGVmaW5lIENNRF9FZGdlSURJQ291bnRlcnMJMHgyYwkvKiBTZXQgSURJIHVwIGNvdW50ZXJzIGNvdW50IGVkZ2UgKGJpdD0wCisJCQkJCSAqIC0gcmlzaW5nLCA9MSAtIGZhbGxpbmcpICovCisjZGVmaW5lIENNRF9HZXRJRElDbnRDdXJWYWx1ZQkweDJmCS8qIFJlYWQgSURJe09NQjB9IHVwIGNvdW50ZXIgY3VycmVudAorCQkJCQkgKiB2YWx1ZSAqLworI2RlZmluZSBDTURfU2V0SURJMENudFJlc2V0VmFsdWUgMHg0MAkvKiBTZXQgSURJMCBDb3VudGVyIFJlc2V0IFZhbHVlCisJCQkJCSAqIDI1NipPTUIxK09NQjAgKi8KKyNkZWZpbmUgQ01EX1NldElESTFDbnRSZXNldFZhbHVlIDB4NDEJLyogU2V0IElESTEgQ291bnRlciBSZXNldCBWYWx1ZQorCQkJCQkgKiAyNTYqT01CMStPTUIwICovCisjZGVmaW5lIENNRF9TZXRJREkyQ250UmVzZXRWYWx1ZSAweDQyCS8qIFNldCBJREkyIENvdW50ZXIgUmVzZXQgVmFsdWUKKwkJCQkJICogMjU2Kk9NQjErT01CMCAqLworI2RlZmluZSBDTURfU2V0SURJM0NudFJlc2V0VmFsdWUgMHg0MwkvKiBTZXQgSURJMyBDb3VudGVyIFJlc2V0IFZhbHVlCisJCQkJCSAqIDI1NipPTUIxK09NQjAgKi8KKyNkZWZpbmUgQ01EX1NldElESTRDbnRSZXNldFZhbHVlIDB4NDQJLyogU2V0IElESTQgQ291bnRlciBSZXNldCBWYWx1ZQorCQkJCQkgKiAyNTYqT01CMStPTUIwICovCisjZGVmaW5lIENNRF9TZXRJREk1Q250UmVzZXRWYWx1ZSAweDQ1CS8qIFNldCBJREk1IENvdW50ZXIgUmVzZXQgVmFsdWUKKwkJCQkJICogMjU2Kk9NQjErT01CMCAqLworI2RlZmluZSBDTURfU2V0SURJNkNudFJlc2V0VmFsdWUgMHg0NgkvKiBTZXQgSURJNiBDb3VudGVyIFJlc2V0IFZhbHVlCisJCQkJCSAqIDI1NipPTUIxK09NQjAgKi8KKyNkZWZpbmUgQ01EX1NldElESTdDbnRSZXNldFZhbHVlIDB4NDcJLyogU2V0IElESTcgQ291bnRlciBSZXNldCBWYWx1ZQorCQkJCQkgKiAyNTYqT01CMStPTUIwICovCisjZGVmaW5lIENNRF9TZXRJREkwQ250TWF0Y2hWYWx1ZSAweDQ4CS8qIFNldCBJREkwIENvdW50ZXIgTWF0Y2ggVmFsdWUKKwkJCQkJICogMjU2Kk9NQjErT01CMCAqLworI2RlZmluZSBDTURfU2V0SURJMUNudE1hdGNoVmFsdWUgMHg0OQkvKiBTZXQgSURJMSBDb3VudGVyIE1hdGNoIFZhbHVlCisJCQkJCSAqIDI1NipPTUIxK09NQjAgKi8KKyNkZWZpbmUgQ01EX1NldElESTJDbnRNYXRjaFZhbHVlIDB4NGEJLyogU2V0IElESTIgQ291bnRlciBNYXRjaCBWYWx1ZQorCQkJCQkgKiAyNTYqT01CMStPTUIwICovCisjZGVmaW5lIENNRF9TZXRJREkzQ250TWF0Y2hWYWx1ZSAweDRiCS8qIFNldCBJREkzIENvdW50ZXIgTWF0Y2ggVmFsdWUKKwkJCQkJICogMjU2Kk9NQjErT01CMCAqLworI2RlZmluZSBDTURfU2V0SURJNENudE1hdGNoVmFsdWUgMHg0YwkvKiBTZXQgSURJNCBDb3VudGVyIE1hdGNoIFZhbHVlCisJCQkJCSAqIDI1NipPTUIxK09NQjAgKi8KKyNkZWZpbmUgQ01EX1NldElESTVDbnRNYXRjaFZhbHVlIDB4NGQJLyogU2V0IElESTUgQ291bnRlciBNYXRjaCBWYWx1ZQorCQkJCQkgKiAyNTYqT01CMStPTUIwICovCisjZGVmaW5lIENNRF9TZXRJREk2Q250TWF0Y2hWYWx1ZSAweDRlCS8qIFNldCBJREk2IENvdW50ZXIgTWF0Y2ggVmFsdWUKKwkJCQkJICogMjU2Kk9NQjErT01CMCAqLworI2RlZmluZSBDTURfU2V0SURJN0NudE1hdGNoVmFsdWUgMHg0ZgkvKiBTZXQgSURJNyBDb3VudGVyIE1hdGNoIFZhbHVlCisJCQkJCSAqIDI1NipPTUIxK09NQjAgKi8KIAogI2RlZmluZSBPTUJDTURfUkVUUlkJMHgwMwkvKiAzIHRpbWVzIHRyeSByZXF1ZXN0IGJlZm9yZSBlcnJvciAqLwogCkBAIC0yNDQsMTE1ICsyNzgsMTE1IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGRpb19ib2FyZHR5cGUgYm9hcmR0eXBlc1tdID0gewogCXsicGNpMTczMCIsIFBDSV9WRU5ET1JfSURfQURWQU5URUNILCAweDE3MzAsIFBDSURJT19NQUlOUkVHLAogCSBUWVBFX1BDSTE3MzAsCi0JIHt7MTYsIFBDSTE3MzBfREksIDIsIDB9LCB7MTYsIFBDSTE3MzBfSURJLCAyLCAwfX0sCi0JIHt7MTYsIFBDSTE3MzBfRE8sIDIsIDB9LCB7MTYsIFBDSTE3MzBfSURPLCAyLCAwfX0sCi0JIHt7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCisJIHsgezE2LCBQQ0kxNzMwX0RJLCAyLCAwfSwgezE2LCBQQ0kxNzMwX0lESSwgMiwgMH0gfSwKKwkgeyB7MTYsIFBDSTE3MzBfRE8sIDIsIDB9LCB7MTYsIFBDSTE3MzBfSURPLCAyLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHs0LCBQQ0kxNzN4X0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT184Yn0sCiAJeyJwY2kxNzMzIiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTczMywgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTczMywKLQkge3swLCAwLCAwLCAwfSwgezMyLCBQQ0kxNzMzX0lESSwgNCwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSwgezMyLCBQQ0kxNzMzX0lESSwgNCwgMH0gfSwKKwkgeyB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHs0LCBQQ0kxNzN4X0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT184Yn0sCiAJeyJwY2kxNzM0IiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTczNCwgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTczNCwKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezMyLCBQQ0kxNzM0X0lETywgNCwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MzIsIFBDSTE3MzRfSURPLCA0LCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHs0LCBQQ0kxNzN4X0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT184Yn0sCiAJeyJwY2kxNzM1IiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTczNSwgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTczNSwKLQkge3szMiwgUENJMTczNV9ESSwgNCwgMH0sIHswLCAwLCAwLCAwfX0sCi0JIHt7MzIsIFBDSTE3MzVfRE8sIDQsIDB9LCB7MCwgMCwgMCwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHszMiwgUENJMTczNV9ESSwgNCwgMH0sIHswLCAwLCAwLCAwfSB9LAorCSB7IHszMiwgUENJMTczNV9ETywgNCwgMH0sIHswLCAwLCAwLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHsgNCwgUENJMTczNV9CT0FSRElELCAxLCBTREZfSU5URVJOQUx9LAotCSB7ezMsIFBDSTE3MzVfQzgyNTQsIDEsIDB9fSwKKwkgeyB7MywgUENJMTczNV9DODI1NCwgMSwgMH0gfSwKIAkgSU9fOGJ9LAogCXsicGNpMTczNiIsIFBDSV9WRU5ET1JfSURfQURWQU5URUNILCAweDE3MzYsIFBDSTE3MzZfTUFJTlJFRywKIAkgVFlQRV9QQ0kxNzM2LAotCSB7ezAsIDAsIDAsIDB9LCB7MTYsIFBDSTE3MzZfSURJLCAyLCAwfX0sCi0JIHt7MCwgMCwgMCwgMH0sIHsxNiwgUENJMTczNl9JRE8sIDIsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKKwkgeyB7MCwgMCwgMCwgMH0sIHsxNiwgUENJMTczNl9JREksIDIsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MTYsIFBDSTE3MzZfSURPLCAyLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHs0LCBQQ0kxNzM2X0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT184Yn0sCiAJeyJwY2kxNzUwIiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTc1MCwgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTc1MCwKLQkge3swLCAwLCAwLCAwfSwgezE2LCBQQ0kxNzUwX0lESSwgMiwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MTYsIFBDSTE3NTBfSURPLCAyLCAwfX0sCi0JIHt7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9LCB7MTYsIFBDSTE3NTBfSURJLCAyLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezE2LCBQQ0kxNzUwX0lETywgMiwgMH0gfSwKKwkgeyB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSB9LAogCSB7MCwgMCwgMCwgMH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT184Yn0sCiAJeyJwY2kxNzUxIiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTc1MSwgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTc1MSwKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKLQkge3s0OCwgUENJMTc1MV9ESU8sIDIsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfSwKKwkgeyB7NDgsIFBDSTE3NTFfRElPLCAyLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHswLCAwLCAwLCAwfSwKLQkge3swLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9IH0sCiAJIElPXzhifSwKIAl7InBjaTE3NTIiLCBQQ0lfVkVORE9SX0lEX0FEVkFOVEVDSCwgMHgxNzUyLCBQQ0lESU9fTUFJTlJFRywKIAkgVFlQRV9QQ0kxNzUyLAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAotCSB7ezMyLCBQQ0kxNzUyX0lETywgMiwgMH0sIHszMiwgUENJMTc1Ml9JRE8yLCAyLCAwfX0sCi0JIHt7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfSwKKwkgeyB7MzIsIFBDSTE3NTJfSURPLCAyLCAwfSwgezMyLCBQQ0kxNzUyX0lETzIsIDIsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfSwKIAkgezQsIFBDSTE3NXhfQk9BUkRJRCwgMSwgU0RGX0lOVEVSTkFMfSwKLQkge3swLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9IH0sCiAJIElPXzE2Yn0sCiAJeyJwY2kxNzUzIiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTc1MywgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTc1MywKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKLQkge3s5NiwgUENJMTc1M19ESU8sIDQsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfSwKKwkgeyB7OTYsIFBDSTE3NTNfRElPLCA0LCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHswLCAwLCAwLCAwfSwKLQkge3swLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9IH0sCiAJIElPXzhifSwKIAl7InBjaTE3NTNlIiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTc1MywgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTc1M0UsCi0JIHt7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCi0JIHt7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCi0JIHt7OTYsIFBDSTE3NTNfRElPLCA0LCAwfSwgezk2LCBQQ0kxNzUzRV9ESU8sIDQsIDB9fSwKKwkgeyB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCisJIHsgezk2LCBQQ0kxNzUzX0RJTywgNCwgMH0sIHs5NiwgUENJMTc1M0VfRElPLCA0LCAwfSB9LAogCSB7MCwgMCwgMCwgMH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT184Yn0sCiAJeyJwY2kxNzU0IiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTc1NCwgUENJRElPX01BSU5SRUcsCiAJIFRZUEVfUENJMTc1NCwKLQkge3szMiwgUENJMTc1NF9JREksIDIsIDB9LCB7MzIsIFBDSTE3NTRfSURJMiwgMiwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHszMiwgUENJMTc1NF9JREksIDIsIDB9LCB7MzIsIFBDSTE3NTRfSURJMiwgMiwgMH0gfSwKKwkgeyB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHs0LCBQQ0kxNzV4X0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT18xNmJ9LAogCXsicGNpMTc1NiIsIFBDSV9WRU5ET1JfSURfQURWQU5URUNILCAweDE3NTYsIFBDSURJT19NQUlOUkVHLAogCSBUWVBFX1BDSTE3NTYsCi0JIHt7MCwgMCwgMCwgMH0sIHszMiwgUENJMTc1Nl9JREksIDIsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezMyLCBQQ0kxNzU2X0lETywgMiwgMH19LAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSwgezMyLCBQQ0kxNzU2X0lESSwgMiwgMH0gfSwKKwkgeyB7MCwgMCwgMCwgMH0sIHszMiwgUENJMTc1Nl9JRE8sIDIsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfSwKIAkgezQsIFBDSTE3NXhfQk9BUkRJRCwgMSwgU0RGX0lOVEVSTkFMfSwKLQkge3swLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9IH0sCiAJIElPXzE2Yn0sCiAJeyJwY2kxNzYwIiwgUENJX1ZFTkRPUl9JRF9BRFZBTlRFQ0gsIDB4MTc2MCwgMCwKIAkgVFlQRV9QQ0kxNzYwLAotCSB7ezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAkvKiAgVGhpcyBjYXJkIGhhdmUgb3duIHNldHVwIHdvcmsgKi8KLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9fSwKKwkgeyB7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfSB9LCAvKiBUaGlzIGNhcmQgaGF2ZSBvd24gc2V0dXAgd29yayAqLworCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCisJIHsgezAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH0gfSwKIAkgezAsIDAsIDAsIDB9LAotCSB7ezAsIDAsIDAsIDB9fSwKKwkgeyB7MCwgMCwgMCwgMH0gfSwKIAkgSU9fOGJ9LAogCXsicGNpMTc2MiIsIFBDSV9WRU5ET1JfSURfQURWQU5URUNILCAweDE3NjIsIFBDSURJT19NQUlOUkVHLAogCSBUWVBFX1BDSTE3NjIsCi0JIHt7MCwgMCwgMCwgMH0sIHsxNiwgUENJMTc2Ml9JREksIDEsIDB9fSwKLQkge3swLCAwLCAwLCAwfSwgezE2LCBQQ0kxNzYyX1JPLCAxLCAwfX0sCi0JIHt7MCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCisJIHsgezAsIDAsIDAsIDB9LCB7MTYsIFBDSTE3NjJfSURJLCAxLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezE2LCBQQ0kxNzYyX1JPLCAxLCAwfSB9LAorCSB7IHswLCAwLCAwLCAwfSwgezAsIDAsIDAsIDB9IH0sCiAJIHs0LCBQQ0kxNzYyX0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTH0sCi0JIHt7MCwgMCwgMCwgMH19LAorCSB7IHswLCAwLCAwLCAwfSB9LAogCSBJT18xNmJ9CiB9OwogCkBAIC0zNzIsMTMgKzQwNiwxNiBAQAogCWNoYXIgdmFsaWQ7CQkvKiAgY2FyZCBpcyB1c2FibGUgKi8KIAljaGFyIEdsb2JhbElycUVuYWJsZWQ7CS8qICAxPSBhbnkgSVJRIHNvdXJjZSBpcyBlbmFibGVkICovCiAJLyogIFBDSS0xNzYwIHNwZWNpZmljIGRhdGEgKi8KLQl1bnNpZ25lZCBjaGFyIElESUNudEVuYWJsZTsJLyogIGNvdW50ZXIncyBjb3VudGluZyBlbmFibGUgc3RhdHVzICovCi0JdW5zaWduZWQgY2hhciBJRElDbnRPdmVyRW5hYmxlOwkvKiAgY291bnRlcidzIG92ZXJmbG93IGludGVycnVwdHMgZW5hYmxlIHN0YXR1cyAqLwotCXVuc2lnbmVkIGNoYXIgSURJQ250TWF0Y2hFbmFibGU7CS8qICBjb3VudGVyJ3MgbWF0Y2ggaW50ZXJydXB0cyBlbmFibGUgc3RhdHVzICovCi0JdW5zaWduZWQgY2hhciBJRElDbnRFZGdlOwkvKiAgY291bnRlcidzIGNvdW50IGVkZ2UgdmFsdWUgKGJpdD0wIC0gcmlzaW5nLCA9MSAtIGZhbGxpbmcpICovCisJdW5zaWduZWQgY2hhciBJRElDbnRFbmFibGU7CS8qIGNvdW50ZXIncyBjb3VudGluZyBlbmFibGUgc3RhdHVzICovCisJdW5zaWduZWQgY2hhciBJRElDbnRPdmVyRW5hYmxlOwkvKiBjb3VudGVyJ3Mgb3ZlcmZsb3cgaW50ZXJydXB0cyBlbmFibGUKKwkJCQkJICogc3RhdHVzICovCisJdW5zaWduZWQgY2hhciBJRElDbnRNYXRjaEVuYWJsZTsJLyogY291bnRlcidzIG1hdGNoIGludGVycnVwdHMKKwkJCQkJCSAqIGVuYWJsZSBzdGF0dXMgKi8KKwl1bnNpZ25lZCBjaGFyIElESUNudEVkZ2U7CS8qIGNvdW50ZXIncyBjb3VudCBlZGdlIHZhbHVlCisJCQkJCSAqIChiaXQ9MCAtIHJpc2luZywgPTEgLSBmYWxsaW5nKSAqLwogCXVuc2lnbmVkIHNob3J0IENudFJlc1ZhbHVlWzhdOwkvKiAgY291bnRlcnMnIHJlc2V0IHZhbHVlICovCi0JdW5zaWduZWQgc2hvcnQgQ250TWF0Y2hWYWx1ZVs4XTsJLyogIGNvdW50ZXJzJyBtYXRjaCBpbnRlcnJ1cHQgdmFsdWUgKi8KLQl1bnNpZ25lZCBjaGFyIElESUZpbHRlcnNFbjsJLyogIElESSdzIGRpZ2l0YWwgZmlsdGVycyBlbmFibGUgc3RhdHVzICovCisJdW5zaWduZWQgc2hvcnQgQ250TWF0Y2hWYWx1ZVs4XTsgLyogIGNvdW50ZXJzJyBtYXRjaCBpbnRlcnJ1cHQgdmFsdWUgKi8KKwl1bnNpZ25lZCBjaGFyIElESUZpbHRlcnNFbjsgLyogIElESSdzIGRpZ2l0YWwgZmlsdGVycyBlbmFibGUgc3RhdHVzICovCiAJdW5zaWduZWQgY2hhciBJRElQYXRNYXRjaEVuOwkvKiAgSURJJ3MgcGF0dGVybiBtYXRjaCBlbmFibGUgc3RhdHVzICovCiAJdW5zaWduZWQgY2hhciBJRElQYXRNYXRjaFZhbHVlOwkvKiAgSURJJ3MgcGF0dGVybiBtYXRjaCB2YWx1ZSAqLwogCXVuc2lnbmVkIHNob3J0IElESUZpbHRyTG93WzhdOwkvKiAgSURJJ3MgZmlsdGVyIHZhbHVlIGxvdyBzaWduYWwgKi8KQEAgLTY5MSw3ICs3MjgsOCBAQAogCX07CiAJdW5zaWduZWQgY2hhciBpbWJbNF07CiAKLQlpZiAoZGV2cHJpdi0+Q250UmVzVmFsdWVbY2hhbl0gIT0gKGRhdGFbMF0gJiAweGZmZmYpKSB7CS8qICBTZXQgcmVzZXQgdmFsdWUgaWYgZGlmZmVyZW50ICovCisJLyogU2V0IHJlc2V0IHZhbHVlIGlmIGRpZmZlcmVudCAqLworCWlmIChkZXZwcml2LT5DbnRSZXNWYWx1ZVtjaGFuXSAhPSAoZGF0YVswXSAmIDB4ZmZmZikpIHsKIAkJcmV0ID0gcGNpMTc2MF9tYnhyZXF1ZXN0KGRldiwgb21iLCBpbWIpOwogCQlpZiAoIXJldCkKIAkJCXJldHVybiByZXQ7CkBAIC03MDQsNyArNzQyLDggQEAKIAlpZiAoIXJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghKGJpdG1hc2sgJiBkZXZwcml2LT5JRElDbnRFbmFibGUpKSB7CS8qICBzdGFydCBjb3VudGVyIGlmIGl0IGRvbid0IHJ1biAqLworCS8qICBzdGFydCBjb3VudGVyIGlmIGl0IGRvbid0IHJ1biAqLworCWlmICghKGJpdG1hc2sgJiBkZXZwcml2LT5JRElDbnRFbmFibGUpKSB7CiAJCW9tYlswXSA9IGJpdG1hc2s7CiAJCW9tYlsyXSA9IENNRF9FbmFibGVJRElDb3VudGVyczsKIAkJcmV0ID0gcGNpMTc2MF9tYnhyZXF1ZXN0KGRldiwgb21iLCBpbWIpOwpAQCAtNzQwLDEyICs3NzksMTQgQEAKIAlkZXZwcml2LT5JRElDbnRFbmFibGUgPSAwOwogCiAJb21iWzBdID0gMHgwMDsKLQlvbWJbMl0gPSBDTURfT3ZlcmZsb3dJRElDb3VudGVyczsJLyogIGRpc2FibGUgY291bnRlcnMgb3ZlcmZsb3cgaW50ZXJydXB0cyAqLworCW9tYlsyXSA9IENNRF9PdmVyZmxvd0lESUNvdW50ZXJzOyAvKiBkaXNhYmxlIGNvdW50ZXJzIG92ZXJmbG93CisJCQkJCSAgICogaW50ZXJydXB0cyAqLwogCXBjaTE3NjBfbWJ4cmVxdWVzdChkZXYsIG9tYiwgaW1iKTsKIAlkZXZwcml2LT5JRElDbnRPdmVyRW5hYmxlID0gMDsKIAogCW9tYlswXSA9IDB4MDA7Ci0Jb21iWzJdID0gQ01EX01hdGNoSW50SURJQ291bnRlcnM7CS8qICBkaXNhYmxlIGNvdW50ZXJzIG1hdGNoIHZhbHVlIGludGVycnVwdHMgKi8KKwlvbWJbMl0gPSBDTURfTWF0Y2hJbnRJRElDb3VudGVyczsgLyogZGlzYWJsZSBjb3VudGVycyBtYXRjaCB2YWx1ZQorCQkJCQkgICAqIGludGVycnVwdHMgKi8KIAlwY2kxNzYwX21ieHJlcXVlc3QoZGV2LCBvbWIsIGltYik7CiAJZGV2cHJpdi0+SURJQ250TWF0Y2hFbmFibGUgPSAwOwogCkBAIC03NjYsNyArODA3LDggQEAKIAl9CiAKIAlvbWJbMF0gPSAweGZmOwotCW9tYlsyXSA9IENNRF9SZXNldElESUNvdW50ZXJzOwkvKiAgcmVzZXQgSURJIHVwIGNvdW50ZXJzIHRvIHJlc2V0IHZhbHVlcyAqLworCW9tYlsyXSA9IENNRF9SZXNldElESUNvdW50ZXJzOyAvKiByZXNldCBJREkgdXAgY291bnRlcnMgdG8gcmVzZXQKKwkJCQkJKiB2YWx1ZXMgKi8KIAlwY2kxNzYwX21ieHJlcXVlc3QoZGV2LCBvbWIsIGltYik7CiAKIAlvbWJbMF0gPSAweDAwOwpAQCAtODA3LDkgKzg0OSwxMiBAQAogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTczMF9JRE8gKyAxKTsKIAkJLyogTk8gYnJlYWsgdGhlcmUhICovCiAJY2FzZSBUWVBFX1BDSTE3MzM6Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzMwXzNfSU5UX0VOKTsJLyogIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCQlvdXRiKDB4MGYsIGRldi0+aW9iYXNlICsgUENJMTczMF8zX0lOVF9DTFIpOwkvKiAgY2xlYXIgaW50ZXJydXB0cyAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTczMF8zX0lOVF9SRik7CS8qICBzZXQgcmlzaW5nIGVkZ2UgdHJpZ2dlciAqLworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MzBfM19JTlRfRU4pOworCQkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJCW91dGIoMHgwZiwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzMwXzNfSU5UX0NMUik7CisJCS8qIHNldCByaXNpbmcgZWRnZSB0cmlnZ2VyICovCisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzMwXzNfSU5UX1JGKTsKIAkJYnJlYWs7CiAJY2FzZSBUWVBFX1BDSTE3MzQ6CiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzM0X0lETyk7CS8qICBjbGVhciBvdXRwdXRzICovCkBAIC04MzAsNDMgKzg3NSw1MyBAQAogCWNhc2UgVFlQRV9QQ0kxNzM2OgogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTczNl9JRE8pOwogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTczNl9JRE8gKyAxKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MzZfM19JTlRfRU4pOwkvKiAgZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JCW91dGIoMHgwZiwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzM2XzNfSU5UX0NMUik7CS8qICBjbGVhciBpbnRlcnJ1cHRzICovCi0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzM2XzNfSU5UX1JGKTsJLyogIHNldCByaXNpbmcgZWRnZSB0cmlnZ2VyICovCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTczNl8zX0lOVF9FTik7CisJCS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwkJb3V0YigweDBmLCBkZXYtPmlvYmFzZSArIFBDSTE3MzZfM19JTlRfQ0xSKTsKKwkJLyogc2V0IHJpc2luZyBlZGdlIHRyaWdnZXIgKi8KKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MzZfM19JTlRfUkYpOwogCQlicmVhazsKIAogCWNhc2UgVFlQRV9QQ0kxNzUwOgogCWNhc2UgVFlQRV9QQ0kxNzUxOgotCQlvdXRiKDB4ODgsIGRldi0+aW9iYXNlICsgUENJMTc1MF9JQ1IpOwkvKiAgZGlzYWJsZSAmIGNsZWFyIGludGVycnVwdHMgKi8KKwkJLyogZGlzYWJsZSAmIGNsZWFyIGludGVycnVwdHMgKi8KKwkJb3V0YigweDg4LCBkZXYtPmlvYmFzZSArIFBDSTE3NTBfSUNSKTsKIAkJYnJlYWs7CiAJY2FzZSBUWVBFX1BDSTE3NTI6Ci0JCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzUyXzZfQ0ZDKTsJLyogIGRpc2FibGUgY2hhbm5lbCBmcmVlemUgZnVuY3Rpb24gKi8KKwkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFBDSTE3NTJfNl9DRkMpOyAvKiBkaXNhYmxlIGNoYW5uZWwgZnJlZXplCisJCQkJCQkgICAgICAgKiBmdW5jdGlvbiAqLwogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJMTc1Ml9JRE8pOwkvKiAgY2xlYXIgb3V0cHV0cyAqLwogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJMTc1Ml9JRE8gKyAyKTsKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFBDSTE3NTJfSURPMik7CiAJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzUyX0lETzIgKyAyKTsKIAkJYnJlYWs7CiAJY2FzZSBUWVBFX1BDSTE3NTNFOgotCQlvdXRiKDB4ODgsIGRldi0+aW9iYXNlICsgUENJMTc1M0VfSUNSMCk7CS8qICBkaXNhYmxlICYgY2xlYXIgaW50ZXJydXB0cyAqLworCQlvdXRiKDB4ODgsIGRldi0+aW9iYXNlICsgUENJMTc1M0VfSUNSMCk7IC8qIGRpc2FibGUgJiBjbGVhcgorCQkJCQkJCSAgKiBpbnRlcnJ1cHRzICovCiAJCW91dGIoMHg4MCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzUzRV9JQ1IxKTsKIAkJb3V0YigweDgwLCBkZXYtPmlvYmFzZSArIFBDSTE3NTNFX0lDUjIpOwogCQlvdXRiKDB4ODAsIGRldi0+aW9iYXNlICsgUENJMTc1M0VfSUNSMyk7CiAJCS8qIE5PIGJyZWFrIHRoZXJlISAqLwogCWNhc2UgVFlQRV9QQ0kxNzUzOgotCQlvdXRiKDB4ODgsIGRldi0+aW9iYXNlICsgUENJMTc1M19JQ1IwKTsJLyogIGRpc2FibGUgJiBjbGVhciBpbnRlcnJ1cHRzICovCisJCW91dGIoMHg4OCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzUzX0lDUjApOyAvKiBkaXNhYmxlICYgY2xlYXIKKwkJCQkJCQkgKiBpbnRlcnJ1cHRzICovCiAJCW91dGIoMHg4MCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzUzX0lDUjEpOwogCQlvdXRiKDB4ODAsIGRldi0+aW9iYXNlICsgUENJMTc1M19JQ1IyKTsKIAkJb3V0YigweDgwLCBkZXYtPmlvYmFzZSArIFBDSTE3NTNfSUNSMyk7CiAJCWJyZWFrOwogCWNhc2UgVFlQRV9QQ0kxNzU0OgotCQlvdXR3KDB4MDgsIGRldi0+aW9iYXNlICsgUENJMTc1NF82X0lDUjApOwkvKiAgZGlzYWJsZSBhbmQgY2xlYXIgaW50ZXJydXB0cyAqLworCQlvdXR3KDB4MDgsIGRldi0+aW9iYXNlICsgUENJMTc1NF82X0lDUjApOyAvKiBkaXNhYmxlIGFuZCBjbGVhcgorCQkJCQkJCSAgICogaW50ZXJydXB0cyAqLwogCQlvdXR3KDB4MDgsIGRldi0+aW9iYXNlICsgUENJMTc1NF82X0lDUjEpOwogCQlvdXR3KDB4MDgsIGRldi0+aW9iYXNlICsgUENJMTc1NF9JQ1IyKTsKIAkJb3V0dygweDA4LCBkZXYtPmlvYmFzZSArIFBDSTE3NTRfSUNSMyk7CiAJCWJyZWFrOwogCWNhc2UgVFlQRV9QQ0kxNzU2OgotCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJMTc1Ml82X0NGQyk7CS8qICBkaXNhYmxlIGNoYW5uZWwgZnJlZXplIGZ1bmN0aW9uICovCi0JCW91dHcoMHgwOCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzU0XzZfSUNSMCk7CS8qICBkaXNhYmxlIGFuZCBjbGVhciBpbnRlcnJ1cHRzICovCisJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzUyXzZfQ0ZDKTsgLyogZGlzYWJsZSBjaGFubmVsIGZyZWV6ZQorCQkJCQkJICAgICAgICogZnVuY3Rpb24gKi8KKwkJb3V0dygweDA4LCBkZXYtPmlvYmFzZSArIFBDSTE3NTRfNl9JQ1IwKTsgLyogZGlzYWJsZSBhbmQgY2xlYXIKKwkJCQkJCQkgICAqIGludGVycnVwdHMgKi8KIAkJb3V0dygweDA4LCBkZXYtPmlvYmFzZSArIFBDSTE3NTRfNl9JQ1IxKTsKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFBDSTE3NTZfSURPKTsJLyogIGNsZWFyIG91dHB1dHMgKi8KIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFBDSTE3NTZfSURPICsgMik7CkBAIC04NzUsNyArOTMwLDggQEAKIAkJcGNpMTc2MF9yZXNldChkZXYpOwogCQlicmVhazsKIAljYXNlIFRZUEVfUENJMTc2MjoKLQkJb3V0dygweDAxMDEsIGRldi0+aW9iYXNlICsgUENJMTc2Ml9JQ1IpOwkvKiAgZGlzYWJsZSAmIGNsZWFyIGludGVycnVwdHMgKi8KKwkJb3V0dygweDAxMDEsIGRldi0+aW9iYXNlICsgUENJMTc2Ml9JQ1IpOyAvKiBkaXNhYmxlICYgY2xlYXIKKwkJCQkJCQkgICogaW50ZXJydXB0cyAqLwogCQlicmVhazsKIAl9CiAKQEAgLTk5Niw3ICsxMDUyLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KIHN0YXRpYyBpbnQgcGNpX2Rpb19hZGRfODI1NChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICogcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICBjb25zdCBzdHJ1Y3QgZGlvc3ViZF9kYXRhICpkLCBpbnQgc3ViZGV2KQogewogCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwpAQCAtMTAyMyw3ICsxMDc5LDcgQEAKIAogCWZvciAocHIgPSBwY2lfcHJpdiwgcHJldiA9IE5VTEw7IHByICE9IE5VTEw7IHByZXYgPSBwciwgcHIgPSBwci0+bmV4dCkgewogCQlpZiAocHItPnBjaWRldiA9PSBwY2lkZXYpCi0JCQlyZXR1cm4gMDsJLyogIHRoaXMgY2FyZCBpcyB1c2VkLCBsb29rIGZvciBhbm90aGVyICovCisJCQlyZXR1cm4gMDsgLyogdGhpcyBjYXJkIGlzIHVzZWQsIGxvb2sgZm9yIGFub3RoZXIgKi8KIAogCX0KIApAQCAtMTA0OCw3ICsxMTA0LDcgQEAKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlpbnQgcmV0LCBzdWJkZXYsIG5fc3ViZGV2aWNlcywgaSwgajsKIAl1bnNpZ25lZCBsb25nIGlvYmFzZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwogCiAJcHJpbnRrKCJjb21lZGklZDogYWR2X3BjaV9kaW86ICIsIGRldi0+bWlub3IpOwogCkBAIC0xMDU4LDkgKzExMTQsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpZGV2ICE9IE5VTEw7Ci0JICAgICBwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJZm9yX2VhY2hfcGNpX2RldihwY2lkZXYpIHsKIAkJLyogIGxvb3AgdGhyb3VnaCBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KIAkJZm9yIChpID0gMDsgaSA8IG5fYm9hcmR0eXBlczsgKytpKSB7CiAJCQlpZiAoYm9hcmR0eXBlc1tpXS52ZW5kb3JfaWQgIT0gcGNpZGV2LT52ZW5kb3IpCkBAIC0xMjE1LDE1ICsxMjY5LDEyIEBACiAJCQl9CiAJCX0KIAotCQlpZiAodGhpc19ib2FyZC0+Ym9hcmRpZC5jaGFucykgeworCQlpZiAodGhpc19ib2FyZC0+Ym9hcmRpZC5jaGFucykKIAkJCXN1YmRldisrOwotCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IE1BWF84MjU0X1NVQkRFVlM7IGkrKykgewotCQkJaWYgKHRoaXNfYm9hcmQtPnM4MjU0W2ldLmNoYW5zKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfODI1NF9TVUJERVZTOyBpKyspCisJCQlpZiAodGhpc19ib2FyZC0+czgyNTRbaV0uY2hhbnMpCiAJCQkJc3ViZGV2Kys7Ci0JCQl9Ci0JCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgewogCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGk7CkBAIC0xMjUzLDcgKzEzMDQsNDcgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2lfZGlvLCBwY2lfZGlvX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfcGNpX2Rpb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9wY2lfZGlvLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9wY2lfZGlvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9wY2lfZGlvX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGNpX2Rpb19wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9wY2lfZGlvX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9wY2lfZGlvX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNpX2Rpb19pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNpX2Rpbyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfcGNpX2Rpb19wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9wY2lfZGlvLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpX2Rpb19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2lfZGlvX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpX2Rpb19wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2lfZGlvKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjaV9kaW9faW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjaV9kaW9fY2xlYW51cF9tb2R1bGUpOwogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fpb19haW8xMl84LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYwppbmRleCA3YTFjNjM2Li4xNzI4Y2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYwpAQCAtMjI3LDQgKzIyNywxOSBAQAogCS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFpbzEyXzhfYm9hcmR0eXBlKSwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfYWlvX2FpbzEyXzgpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2Fpb19haW8xMl84X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9haW9fYWlvMTJfOCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYWlvX2FpbzEyXzhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9haW9fYWlvMTJfOCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9haW9fYWlvMTJfOF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYWlvX2FpbzEyXzhfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCmluZGV4IDRiYWVmOWYuLjQ4NzU5OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCkBAIC0xODQsNCArMTg0LDE5IEBACiAJcmV0dXJuIDI7CiB9CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfYWlvX2lpcm9fMTYpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2Fpb19paXJvXzE2X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9haW9faWlyb18xNik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYWlvX2lpcm9fMTZfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9haW9faWlyb18xNik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9haW9faWlyb18xNl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYWlvX2lpcm9fMTZfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW05NTEzLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW05NTEzLmgKaW5kZXggNzMzNjdkNi4uMGJiODM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtOTUxMy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbTk1MTMuaApAQCAtNDcsMzIgKzQ3LDMyIEBACiAjaWZkZWYgQW05NTEzXzhCSVRCVVMKIAogI2RlZmluZSBBbTk1MTNfd3JpdGVfcmVnaXN0ZXIocmVnLCB2YWwpCQkJCVwKLQlkb3sJCQkJCQkJXAorCWRvIHsJCQkJCQkJXAogCQlBbTk1MTNfb3V0cHV0X2NvbnRyb2wocmVnKTsJCQlcCiAJCUFtOTUxM19vdXRwdXRfZGF0YSh2YWw+PjgpOwkJCVwKIAkJQW05NTEzX291dHB1dF9kYXRhKHZhbCYweGZmKTsJCQlcCi0JfXdoaWxlICgwKQorCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgQW05NTEzX3JlYWRfcmVnaXN0ZXIocmVnLCB2YWwpCQkJCVwKLQlkb3sJCQkJCQkJXAorCWRvIHsJCQkJCQkJXAogCQlBbTk1MTNfb3V0cHV0X2NvbnRyb2wocmVnKTsJCQlcCi0JCXZhbD1BbTk1MTNfaW5wdXRfZGF0YSgpPDw4OwkJCVwKLQkJdmFsfD1BbTk1MTNfaW5wdXRfZGF0YSgpOwkJCVwKLQl9d2hpbGUgKDApCisJCXZhbCA9IEFtOTUxM19pbnB1dF9kYXRhKCk8PDg7CQkJXAorCQl2YWwgfD0gQW05NTEzX2lucHV0X2RhdGEoKTsJCQlcCisJfSB3aGlsZSAoMCkKIAogI2Vsc2UgLyogQW05NTEzXzE2QklUQlVTICovCiAKICNkZWZpbmUgQW05NTEzX3dyaXRlX3JlZ2lzdGVyKHJlZywgdmFsKQkJCQlcCi0JZG97CQkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKIAkJQW05NTEzX291dHB1dF9jb250cm9sKHJlZyk7CQkJXAogCQlBbTk1MTNfb3V0cHV0X2RhdGEodmFsKTsJCQlcCi0JfXdoaWxlICgwKQorCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgQW05NTEzX3JlYWRfcmVnaXN0ZXIocmVnLCB2YWwpCQkJCVwKLQlkb3sJCQkJCQkJXAorCWRvIHsJCQkJCQkJXAogCQlBbTk1MTNfb3V0cHV0X2NvbnRyb2wocmVnKTsJCQlcCi0JCXZhbD1BbTk1MTNfaW5wdXRfZGF0YSgpOwkJCVwKLQl9d2hpbGUgKDApCisJCXZhbCA9IEFtOTUxM19pbnB1dF9kYXRhKCk7CQkJXAorCX0gd2hpbGUgKDApCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwLmMKaW5kZXggYmYyNzYxNy4uOTNiYmU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDAuYwpAQCAtNDk0LDkgKzQ5NCw1OCBAQAogfTsKIAogI2lmZGVmIENPTkZJR19DT01FRElfUENJCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9hbXBsY19kaW8yMDAsIGRpbzIwMF9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2FtcGxjX2RpbzIwMF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkCisJCQkJCQkgICAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2FtcGxjX2RpbzIwMC5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfYW1wbGNfZGlvMjAwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9hbXBsY19kaW8yMDBfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBkaW8yMDBfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfYW1wbGNfZGlvMjAwX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9hbXBsY19kaW8yMDBfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hbXBsY19kaW8yMDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2FtcGxjX2RpbzIwMCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfYW1wbGNfZGlvMjAwX3BjaV9kcml2ZXIubmFtZSA9CisJICAgIChjaGFyICopZHJpdmVyX2FtcGxjX2RpbzIwMC5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2FtcGxjX2RpbzIwMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hbXBsY19kaW8yMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hbXBsY19kaW8yMDBfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfZGlvMjAwKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2FtcGxjX2RpbzIwMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYW1wbGNfZGlvMjAwX2NsZWFudXBfbW9kdWxlKTsKICNlbHNlCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2FtcGxjX2RpbzIwMCk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYW1wbGNfZGlvMjAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9hbXBsY19kaW8yMDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2FtcGxjX2RpbzIwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2FtcGxjX2RpbzIwMCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9hbXBsY19kaW8yMDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FtcGxjX2RpbzIwMF9jbGVhbnVwX21vZHVsZSk7CiAjZW5kaWYKIAogLyoKQEAgLTE1MDEsMyArMTU1MCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzYuYwppbmRleCBhMzA3ZDY4Li40ODI0NmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzYuYwpAQCAtMTgyLDkgKzE4Miw1OCBAQAogfTsKIAogI2lmZGVmIENPTkZJR19DT01FRElfUENJCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9hbXBsY19wYzIzNiwgcGMyMzZfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9hbXBsY19wYzIzNl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQKKwkJCQkJCSAgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9hbXBsY19wYzIzNi5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfYW1wbGNfcGMyMzZfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX2FtcGxjX3BjMjM2X3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGMyMzZfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfYW1wbGNfcGMyMzZfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX2FtcGxjX3BjMjM2X3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYW1wbGNfcGMyMzZfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2FtcGxjX3BjMjM2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9hbXBsY19wYzIzNl9wY2lfZHJpdmVyLm5hbWUgPQorCSAgICAoY2hhciAqKWRyaXZlcl9hbXBsY19wYzIzNi5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2FtcGxjX3BjMjM2X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2FtcGxjX3BjMjM2X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYW1wbGNfcGMyMzZfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGMyMzYpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfYW1wbGNfcGMyMzZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FtcGxjX3BjMjM2X2NsZWFudXBfbW9kdWxlKTsKICNlbHNlCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2FtcGxjX3BjMjM2KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hbXBsY19wYzIzNl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGMyMzYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2FtcGxjX3BjMjM2X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGMyMzYpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfYW1wbGNfcGMyMzZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FtcGxjX3BjMjM2X2NsZWFudXBfbW9kdWxlKTsKICNlbmRpZgogCiBzdGF0aWMgaW50IHBjMjM2X3JlcXVlc3RfcmVnaW9uKHVuc2lnbmVkIG1pbm9yLCB1bnNpZ25lZCBsb25nIGZyb20sCkBAIC02NjQsMyArNzEzLDcgQEAKIAl9CiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMKaW5kZXggMTU4MDhlOS4uOGEzMzg4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMKQEAgLTQzMiw3ICs0MzIsNjAgQEAKICAqIGFzIG5lY2Vzc2FyeS4KICAqLwogI2lmZGVmIENPTkZJR19DT01FRElfUENJCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9hbXBsY19wYzI2MywgcGMyNjNfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9hbXBsY19wYzI2M19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQKKwkJCQkJCSAgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9hbXBsY19wYzI2My5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfYW1wbGNfcGMyNjNfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX2FtcGxjX3BjMjYzX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGMyNjNfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfYW1wbGNfcGMyNjNfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX2FtcGxjX3BjMjYzX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYW1wbGNfcGMyNjNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2FtcGxjX3BjMjYzKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9hbXBsY19wYzI2M19wY2lfZHJpdmVyLm5hbWUgPQorCSAgICAoY2hhciAqKWRyaXZlcl9hbXBsY19wYzI2My5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2FtcGxjX3BjMjYzX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2FtcGxjX3BjMjYzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYW1wbGNfcGMyNjNfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGMyNjMpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfYW1wbGNfcGMyNjNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FtcGxjX3BjMjYzX2NsZWFudXBfbW9kdWxlKTsKICNlbHNlCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2FtcGxjX3BjMjYzKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hbXBsY19wYzI2M19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGMyNjMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2FtcGxjX3BjMjYzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGMyNjMpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfYW1wbGNfcGMyNjNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FtcGxjX3BjMjYzX2NsZWFudXBfbW9kdWxlKTsKICNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMKaW5kZXggYzQ4NmE4Ny4uMWI1YmExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYwpAQCAtNDQzLDcgKzQ0Myw0NSBAQAogCS5udW1fbmFtZXMgPSBBUlJBWV9TSVpFKHBjaTIyNF9ib2FyZHMpLAogfTsKIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfYW1wbGNfcGNpMjI0LCBwY2kyMjRfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9hbXBsY19wY2kyMjRfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZAorCQkJCQkJICAgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9hbXBsY19wY2kyMjQuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2FtcGxjX3BjaTIyNF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfYW1wbGNfcGNpMjI0X3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGNpMjI0X3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2FtcGxjX3BjaTIyNF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfYW1wbGNfcGNpMjI0X3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYW1wbGNfcGNpMjI0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9hbXBsY19wY2kyMjQpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2FtcGxjX3BjaTIyNF9wY2lfZHJpdmVyLm5hbWUgPQorCSAgICAoY2hhciAqKWRyaXZlcl9hbXBsY19wY2kyMjQuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hbXBsY19wY2kyMjRfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYW1wbGNfcGNpMjI0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfYW1wbGNfcGNpMjI0X3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2FtcGxjX3BjaTIyNCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9hbXBsY19wY2kyMjRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2FtcGxjX3BjaTIyNF9jbGVhbnVwX21vZHVsZSk7CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aGUgJ2luc25fd3JpdGUnIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYSBzaW5nbGUgd3JpdGUuCkBAIC0xNTU3LDMgKzE1OTUsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYwppbmRleCA3ZmZmZDk2Li41ZDA2NDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCkBAIC02MTcsNyArNjE3LDQ1IEBACiAJLm51bV9uYW1lcyA9IEFSUkFZX1NJWkUocGNpMjMwX2JvYXJkcyksCiB9OwogCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9hbXBsY19wY2kyMzAsIHBjaTIzMF9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2FtcGxjX3BjaTIzMF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkCisJCQkJCQkgICAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2FtcGxjX3BjaTIzMC5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfYW1wbGNfcGNpMjMwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9hbXBsY19wY2kyMzBfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBwY2kyMzBfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfYW1wbGNfcGNpMjMwX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9hbXBsY19wY2kyMzBfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9hbXBsY19wY2kyMzBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2FtcGxjX3BjaTIzMCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfYW1wbGNfcGNpMjMwX3BjaV9kcml2ZXIubmFtZSA9CisJICAgIChjaGFyICopZHJpdmVyX2FtcGxjX3BjaTIzMC5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2FtcGxjX3BjaTIzMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hbXBsY19wY2kyMzBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9hbXBsY19wY2kyMzBfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfYW1wbGNfcGNpMjMwKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2FtcGxjX3BjaTIzMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYW1wbGNfcGNpMjMwX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBwY2kyMzBfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC03MjYsNyArNzY0LDcgQEAKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAl1bnNpZ25lZCBsb25nIGlvYmFzZTEsIGlvYmFzZTI7CiAJLyogUENJMjMwJ3MgSS9PIHNwYWNlcyAxIGFuZCAyIHJlc3BlY3RpdmVseS4gKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CiAJaW50IGkgPSAwLCBpcnFfaGRsLCByYzsKIAogCXByaW50aygiY29tZWRpJWQ6IGFtcGxjX3BjaTIzMDogYXR0YWNoICVzICVkLCVkXG4iLCBkZXYtPm1pbm9yLApAQCAtNzQyLDkgKzc4MCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmRldnByaXYtPmFpX3N0b3Bfc3BpbmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXZwcml2LT5hb19zdG9wX3NwaW5sb2NrKTsKIAkvKiBGaW5kIGNhcmQgKi8KLQlmb3IgKHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKLQkgICAgIHBjaV9kZXYgIT0gTlVMTDsKLQkgICAgIHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgeworCWZvcl9lYWNoX3BjaV9kZXYocGNpX2RldikgewogCQlpZiAoaXQtPm9wdGlvbnNbMF0gfHwgaXQtPm9wdGlvbnNbMV0pIHsKIAkJCS8qIE1hdGNoIGFnYWluc3QgYnVzL3Nsb3Qgb3B0aW9ucy4gKi8KIAkJCWlmIChpdC0+b3B0aW9uc1swXSAhPSBwY2lfZGV2LT5idXMtPm51bWJlciB8fApAQCAtMzAxNCwzICszMDUwLDcgQEAKIAlwY2kyMzBfYWlfc3RvcChkZXYsIHMpOwogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYzZ4ZGlnaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCmluZGV4IGZiMGQ1ZmEuLmUwYWM4MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCkBAIC01MTcsNCArNTE3LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfYzZ4ZGlnaW8pOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2M2eGRpZ2lvX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9jNnhkaWdpbyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYzZ4ZGlnaW9fY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9jNnhkaWdpbyk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9jNnhkaWdpb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYzZ4ZGlnaW9fY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IGNmZWIxMWYuLmY4ZWRlMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTE3MSw3ICsxNzAsNyBAQAogCWlmICghbGluaykKIAkJcmV0dXJuIC1FSU87CiAKLQlkZXYtPmlvYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlkZXYtPmlvYmFzZSA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDs7CiAJcHJpbnRrKCJJL08gYmFzZT0weCUwNGx4ICIsIGRldi0+aW9iYXNlKTsKIAogCXByaW50aygiZmluZ2VycHJpbnQ6XG4iKTsKQEAgLTY2MiwxNCArNjYxLDYgQEAKICAgIGxlc3Mgb24gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KICovCiAKLS8qCi0gICBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCi0gICBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgotICAgZGF0YWJhc2UuCi0qLwotCi1zdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJjYl9kYXMxNl9jcyI7Ci0KIHN0cnVjdCBsb2NhbF9pbmZvX3QgewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rOwogCWludCBzdG9wOwpAQCAtNzE5LDggKzcxMCw3IEBACiAJKChzdHJ1Y3QgbG9jYWxfaW5mb190ICopbGluay0+cHJpdiktPnN0b3AgPSAxOwogCWRhczE2Y3NfcGNtY2lhX3JlbGVhc2UobGluayk7CiAJLyogVGhpcyBwb2ludHMgdG8gdGhlIHBhcmVudCBzdHJ1Y3QgbG9jYWxfaW5mb190IHN0cnVjdCAqLwotCWlmIChsaW5rLT5wcml2KQotCQlrZnJlZShsaW5rLT5wcml2KTsKKwlrZnJlZShsaW5rLT5wcml2KTsKIH0JCQkJLyogZGFzMTZjc19wY21jaWFfZGV0YWNoICovCiAKIApAQCAtNzM3LDI0ICs3MjcsMjIgQEAKIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKIAogCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+aW9fbGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9CisJCQlwY21jaWFfaW9fY2ZnX2RhdGFfd2lkdGgoaW8tPmZsYWdzKTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKIAkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOwotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZmxhZ3MgPSBwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gaW8tPndpblsxXS5sZW47CiAJCX0KIAkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwkJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTc4OCwxMiArNzc2LDEwIEBACiAJZGV2X2luZm8oJmxpbmstPmRldiwgImluZGV4IDB4JTAyeCIsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOwogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJCXByaW50aygiLCBpcnEgJXUiLCBsaW5rLT5pcnEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxICsgbGluay0+aW8uTnVtUG9ydHMxIC0gMSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMikKLQkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyICsgbGluay0+aW8uTnVtUG9ydHMyIC0gMSk7CisJaWYgKGxpbmstPnJlc291cmNlWzBdKQorCQlwcmludGsoIiwgaW8gJXBSIiwgbGluay0+cmVzb3VyY2VbMF0pOworCWlmIChsaW5rLT5yZXNvdXJjZVsxXSkKKwkJcHJpbnRrKCIsIGlvICVwUiIsIGxpbmstPnJlc291cmNlWzFdKTsKIAlwcmludGsoIlxuIik7CiAKIAlyZXR1cm47CkBAIC04NDcsNyArODMzLDcgQEAKIAkuaWRfdGFibGUgPSBkYXMxNmNzX2lkX3RhYmxlLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kcnYgPSB7Ci0JCS5uYW1lID0gZGV2X2luZm8sCisJCS5uYW1lID0gImNiX2RhczE2X2NzIiwKIAkJfSwKIH07CiAKQEAgLTg4MSw1ICs4NjcsMTYgQEAKIH0KIAogI2Vsc2UKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfZGFzMTZjcyk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfZGFzMTZjc19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZGFzMTZjcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfZGFzMTZjc19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2RhczE2Y3MpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZGFzMTZjc19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfZGFzMTZjc19jbGVhbnVwX21vZHVsZSk7CiAjZW5kaWYgLyogQ09ORklHX1BDTUNJQSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jCmluZGV4IDQzNDU5MWQuLjY1MzBiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMKQEAgLTUzMyw3ICs1MzMsNyBAQAogCQkJICAgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwogCWludCBpbmRleDsKIAlpbnQgaTsKIApAQCAtNTUwLDkgKzU1MCw3IEBACiAgKi8KIAlwcmludGsoIlxuIik7CiAKLQlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpZGV2ICE9IE5VTEw7Ci0JICAgICBwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJZm9yX2VhY2hfcGNpX2RldihwY2lkZXYpIHsKIAkJLyogIGlzIGl0IG5vdCBhIGNvbXB1dGVyIGJvYXJkcyBjYXJkPyAqLwogCQlpZiAocGNpZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9DQikKIAkJCWNvbnRpbnVlOwpAQCAtMTg3MSw0ICsxODY5LDQ0IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2NiX3BjaWRhcywgY2JfcGNpZGFzX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfY2JfcGNpZGFzX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9jYl9wY2lkYXMuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2NiX3BjaWRhc19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfY2JfcGNpZGFzX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gY2JfcGNpZGFzX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2NiX3BjaWRhc19wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfY2JfcGNpZGFzX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfY2JfcGNpZGFzX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9jYl9wY2lkYXMpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2NiX3BjaWRhc19wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9jYl9wY2lkYXMuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9jYl9wY2lkYXNfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfY2JfcGNpZGFzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfY2JfcGNpZGFzX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2NiX3BjaWRhcyk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9jYl9wY2lkYXNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2NiX3BjaWRhc19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKaW5kZXggNzlhYTI4Ni4uNTNlNzAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKQEAgLTEyMzcsNyArMTIzNyw0MyBAQAogc3RhdGljIHZvaWQgbG9hZF9hb19kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCWNvbnN0IHN0cnVjdCBjb21lZGlfY21kICpjbWQpOwogCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9jYl9wY2lkYXMsIHBjaWRhczY0X3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfY2JfcGNpZGFzX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9jYl9wY2lkYXMuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2NiX3BjaWRhc19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfY2JfcGNpZGFzX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gcGNpZGFzNjRfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfY2JfcGNpZGFzX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9jYl9wY2lkYXNfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9jYl9wY2lkYXNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2NiX3BjaWRhcyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfY2JfcGNpZGFzX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopZHJpdmVyX2NiX3BjaWRhcy5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2NiX3BjaWRhc19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9jYl9wY2lkYXNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9jYl9wY2lkYXNfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfY2JfcGNpZGFzKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2NiX3BjaWRhc19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfY2JfcGNpZGFzX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBhaV9yYW5nZV9iaXRzXzZ4eHgoY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHJhbmdlX2luZGV4KQpAQCAtMTcxOCw3ICsxNzU0LDcgQEAKICAqLwogc3RhdGljIGludCBhdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IE5VTEw7CiAJaW50IGluZGV4OwogCXVpbnQzMl90IGxvY2FsX3JhbmdlLCBsb2NhbF9kZWNvZGU7CiAJaW50IHJldHZhbDsKQEAgLTE3MzUsOSArMTc3MSw3IEBACiAgKiBQcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IGRldmljZSBpbiB0aGUgc2VyaWVzIGl0IGlzLgogICovCiAKLQlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpZGV2ICE9IE5VTEw7Ci0JICAgICBwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJZm9yX2VhY2hfcGNpX2RldihwY2lkZXYpIHsKIAkJLyogIGlzIGl0IG5vdCBhIGNvbXB1dGVyIGJvYXJkcyBjYXJkPyAqLwogCQlpZiAocGNpZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9DT01QVVRFUkJPQVJEUykKIAkJCWNvbnRpbnVlOwpAQCAtNDMwMywzICs0MzM3LDcgQEAKIAl9CiAJaTJjX3N0b3AoZGV2KTsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCmluZGV4IGMzNzRiZWUuLjJkMzUxNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCQkJICAgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwogCWludCBpbmRleDsKIAogCXByaW50aygiY29tZWRpJWQ6IGNiX3BjaWRkYTogIiwgZGV2LT5taW5vcik7CkBAIC0yOTYsOSArMjk2LDcgQEAKICAqLwogCXByaW50aygiXG4iKTsKIAotCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lkZXYgIT0gTlVMTDsKLQkgICAgIHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DQikgewogCQkJaWYgKGl0LT5vcHRpb25zWzBdIHx8IGl0LT5vcHRpb25zWzFdKSB7CiAJCQkJaWYgKHBjaWRldi0+YnVzLT5udW1iZXIgIT0gaXQtPm9wdGlvbnNbMF0gfHwKQEAgLTg1Niw0ICs4NTQsNDQgQEAKICAqIEEgY29udmVuaWVudCBtYWNybyB0aGF0IGRlZmluZXMgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUoKSwKICAqIGFzIG5lY2Vzc2FyeS4KICAqLwotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfY2JfcGNpZGRhLCBjYl9wY2lkZGFfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9jYl9wY2lkZGFfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2NiX3BjaWRkYS5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfY2JfcGNpZGRhX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9jYl9wY2lkZGFfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBjYl9wY2lkZGFfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfY2JfcGNpZGRhX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9jYl9wY2lkZGFfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9jYl9wY2lkZGFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2NiX3BjaWRkYSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfY2JfcGNpZGRhX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopZHJpdmVyX2NiX3BjaWRkYS5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2NiX3BjaWRkYV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9jYl9wY2lkZGFfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9jYl9wY2lkZGFfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfY2JfcGNpZGRhKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2NiX3BjaWRkYV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfY2JfcGNpZGRhX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jCmluZGV4IDM4Y2NkMTAuLmMxNjkzYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGlvLmMKQEAgLTIwMiw5ICsyMDIsNyBAQAogICogUHJvYmUgdGhlIGRldmljZSB0byBkZXRlcm1pbmUgd2hhdCBkZXZpY2UgaW4gdGhlIHNlcmllcyBpdCBpcy4KICAqLwogCi0JZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKLQkgICAgIHBjaWRldiAhPSBOVUxMOwotCSAgICAgcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgeworCWZvcl9lYWNoX3BjaV9kZXYocGNpZGV2KSB7CiAJCS8qICBpcyBpdCBub3QgYSBjb21wdXRlciBib2FyZHMgY2FyZD8gKi8KIAkJaWYgKHBjaWRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQ0IpCiAJCQljb250aW51ZTsKQEAgLTMwMCw0ICsyOTgsNDQgQEAKICAqIEEgY29udmVuaWVudCBtYWNybyB0aGF0IGRlZmluZXMgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUoKSwKICAqIGFzIG5lY2Vzc2FyeS4KICAqLwotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfY2JfcGNpZGlvLCBwY2lkaW9fcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9jYl9wY2lkaW9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2NiX3BjaWRpby5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfY2JfcGNpZGlvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9jYl9wY2lkaW9fcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBwY2lkaW9fcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfY2JfcGNpZGlvX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9jYl9wY2lkaW9fcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9jYl9wY2lkaW9faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2NiX3BjaWRpbyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfY2JfcGNpZGlvX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopZHJpdmVyX2NiX3BjaWRpby5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2NiX3BjaWRpb19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9jYl9wY2lkaW9fY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9jYl9wY2lkaW9fcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfY2JfcGNpZGlvKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2NiX3BjaWRpb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfY2JfcGNpZGlvX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMKaW5kZXggNDlkY2NiYi4uY2VkMzQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IE5VTEw7CiAJaW50IGluZGV4OwogCS8qIGludCBpOyAqLwogCkBAIC0yMjcsOSArMjI3LDcgQEAKICAqLwogCXByaW50aygiXG4iKTsKIAotCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lkZXYgIT0gTlVMTDsKLQkgICAgIHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQkvKiAgaXMgaXQgbm90IGEgY29tcHV0ZXIgYm9hcmRzIGNhcmQ/ICovCiAJCWlmIChwY2lkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0NPTVBVVEVSQk9BUkRTKQogCQkJY29udGludWU7CkBAIC00OTEsNCArNDg5LDQ2IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2NiX3BjaW1kYXMsIGNiX3BjaW1kYXNfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9jYl9wY2ltZGFzX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkCisJCQkJCQkgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9jYl9wY2ltZGFzLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9jYl9wY2ltZGFzX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9jYl9wY2ltZGFzX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gY2JfcGNpbWRhc19wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9jYl9wY2ltZGFzX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9jYl9wY2ltZGFzX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfY2JfcGNpbWRhc19pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfY2JfcGNpbWRhcyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfY2JfcGNpbWRhc19wY2lfZHJpdmVyLm5hbWUgPQorCSAgICAoY2hhciAqKWRyaXZlcl9jYl9wY2ltZGFzLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfY2JfcGNpbWRhc19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9jYl9wY2ltZGFzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfY2JfcGNpbWRhc19wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9jYl9wY2ltZGFzKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2NiX3BjaW1kYXNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2NiX3BjaW1kYXNfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYwppbmRleCBmNDA0ZWM3Ny4uOGM5ODFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jCkBAIC0xOTUsNyArMTk1LDQ1IEBACiAJCSAgICJzZXJpZXMuICBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBQQ0lNLUREQTA2LTE2ICh3aGljaCAiCiAJCSAgICJhbHNvIGhhcHBlbnMgdG8gYmUgdGhlIG9ubHkgYm9hcmQgaW4gdGhpcyBzZXJpZXMuIDopICkgIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1DT01FRElfUENJX0lOSVRDTEVBTlVQX05PTU9EVUxFKGNiX3BjaW1kZGFfZHJpdmVyLCBwY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgY2JfcGNpbWRkYV9kcml2ZXJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQKKwkJCQkJCSAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgY2JfcGNpbWRkYV9kcml2ZXIuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY2JfcGNpbWRkYV9kcml2ZXJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY2JfcGNpbWRkYV9kcml2ZXJfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBwY2lfdGFibGUsCisJLnByb2JlID0gJmNiX3BjaW1kZGFfZHJpdmVyX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmNiX3BjaW1kZGFfZHJpdmVyX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjYl9wY2ltZGRhX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZjYl9wY2ltZGRhX2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwljYl9wY2ltZGRhX2RyaXZlcl9wY2lfZHJpdmVyLm5hbWUgPQorCSAgICAoY2hhciAqKWNiX3BjaW1kZGFfZHJpdmVyLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjYl9wY2ltZGRhX2RyaXZlcl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNiX3BjaW1kZGFfZHJpdmVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjYl9wY2ltZGRhX2RyaXZlcl9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmNiX3BjaW1kZGFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2JfcGNpbWRkYV9kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY2JfcGNpbWRkYV9kcml2ZXJfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaW50IGFvX3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpOwpAQCAtNDI2LDEzICs0NjQsMTEgQEAKICAqLwogc3RhdGljIGludCBwcm9iZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gTlVMTDsKIAlpbnQgaW5kZXg7CiAJdW5zaWduZWQgbG9uZyByZWdpc3RlcnM7CiAKLQlmb3IgKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpZGV2ICE9IE5VTEw7Ci0JICAgICBwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJZm9yX2VhY2hfcGNpX2RldihwY2lkZXYpIHsKIAkJLyogIGlzIGl0IG5vdCBhIGNvbXB1dGVyIGJvYXJkcyBjYXJkPyAqLwogCQlpZiAocGNpZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9DT01QVVRFUkJPQVJEUykKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwppbmRleCA3MDE2MjIyLi5jZmNiZDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwpAQCAtNTAsNDMgKzUwLDYgQEAKICAgd2l0aGluIGVhY2ggbWlub3Igd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgaW4gdGhlIG9yZGVyIGdpdmVuIGhlcmUuCiAqLwogCi0vKgotICogVGhlIHByZXZpb3VzIGJsb2NrIGNvbW1lbnQgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlCi0gKiBkb2N1bWVudGF0aW9uIGluIENvbWVkaSBhbmQgQ29tZWRpbGliLiAgVGhlIGZpZWxkczoKLSAqCi0gKiBEcml2ZXI6IHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIKLSAqIERlc2NyaXB0aW9uOiBhIHNob3J0IHBocmFzZSBkZXNjcmliaW5nIHRoZSBkcml2ZXIuICBEb24ndCBsaXN0IGJvYXJkcy4KLSAqIERldmljZXM6IGEgZnVsbCBsaXN0IG9mIHRoZSBib2FyZHMgdGhhdCBhdHRlbXB0IHRvIGJlIHN1cHBvcnRlZCBieQotICogICB0aGUgZHJpdmVyLiAgRm9ybWF0IGlzICIobWFudWZhY3R1cmVyKSBib2FyZCBuYW1lIFtjb21lZGkgbmFtZV0iLAotICogICB3aGVyZSBjb21lZGlfbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBib2FyZC4KLSAqICAgU2VlIHRoZSBjb21tZW50IG5lYXIgYm9hcmRfbmFtZTogaW4gdGhlIHN0cnVjdCBjb21lZGlfZHJpdmVyIHN0cnVjdHVyZQotICogICBiZWxvdy4gIElmIChtYW51ZmFjdHVyZXIpIG9yIFtjb21lZGkgbmFtZV0gaXMgbWlzc2luZywgdGhlIHByZXZpb3VzCi0gKiAgIHZhbHVlIGlzIHVzZWQuCi0gKiBBdXRob3I6IHlvdQotICogVXBkYXRlZDogZGF0ZSB3aGVuIHRoZSBfZG9jdW1lbnRhdGlvbl8gd2FzIGxhc3QgdXBkYXRlZC4gIFVzZSAnZGF0ZSAtUicKLSAqICAgdG8gZ2V0IGEgdmFsdWUgZm9yIHRoaXMuCi0gKiBTdGF0dXM6IGEgb25lLXdvcmQgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXR1cy4gIFZhbGlkIHZhbHVlcyBhcmU6Ci0gKiAgIHdvcmtzIC0gZHJpdmVyIHdvcmtzIGNvcnJlY3RseSBvbiBtb3N0IGJvYXJkcyBzdXBwb3J0ZWQsIGFuZAotICogICAgIHBhc3NlcyBjb21lZGlfdGVzdC4KLSAqICAgdW5rbm93biAtIHVua25vd24uICBVc3VhbGx5IHB1dCB0aGVyZSBieSBkcy4KLSAqICAgZXhwZXJpbWVudGFsIC0gbWF5IG5vdCB3b3JrIGluIGFueSBwYXJ0aWN1bGFyIHJlbGVhc2UuICBBdXRob3IKLSAqICAgICBwcm9iYWJseSB3YW50cyBhc3Npc3RhbmNlIHRlc3RpbmcgaXQuCi0gKiAgIGJpdHJvdHRlbiAtIGRyaXZlciBoYXMgbm90IGJlZW4gdXBkYXRlIGluIGEgbG9uZyB0aW1lLCBwcm9iYWJseQotICogICAgIGRvZXNuJ3Qgd29yaywgYW5kIHByb2JhYmx5IGlzIG1pc3Npbmcgc3VwcG9ydCBmb3Igc2lnbmlmaWNhbnQKLSAqICAgICBDb21lZGkgaW50ZXJmYWNlIGZlYXR1cmVzLgotICogICB1bnRlc3RlZCAtIGF1dGhvciBwcm9iYWJseSB3cm90ZSBpdCAiYmxpbmQiLCBhbmQgaXMgYmVsaWV2ZWQgdG8KLSAqICAgICB3b3JrLCBidXQgbm8gY29uZmlybWF0aW9uLgotICoKLSAqIFRoZXNlIGhlYWRlcnMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSwgYW5kIGFueSBjb21tZW50cwotICogeW91IHdpc2ggdG8gc2F5IGFib3V0IHRoZSBkcml2ZXIuICBUaGUgY29tbWVudCBhcmVhIGlzIHRoZSBwbGFjZQotICogdG8gcHV0IGFueSBrbm93biBidWdzLCBsaW1pdGF0aW9ucywgdW5zdXBwb3J0ZWQgZmVhdHVyZXMsIHN1cHBvcnRlZAotICogY29tbWFuZCB0cmlnZ2Vycywgd2hldGhlciBvciBub3QgY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBvbiBwYXJ0aWN1bGFyCi0gKiBzdWJkZXZpY2VzLCBldGMuCi0gKgotICogU29tZXdoZXJlIGluIHRoZSBjb21tZW50IHNob3VsZCBiZSBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmF0aW9uCi0gKiBvcHRpb25zIHRoYXQgYXJlIHVzZWQgd2l0aCBjb21lZGlfY29uZmlnLgotICovCi0KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCmluZGV4IGZjZDc3MjEuLjIxZDgzNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCkBAIC0xMDEsNyArMTAxLDE4IEBACiAJLmRldGFjaCA9IHBhcnBvcnRfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wYXJwb3J0KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9wYXJwb3J0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9wYXJwb3J0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wYXJwb3J0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcGFycG9ydCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wYXJwb3J0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wYXJwb3J0X2NsZWFudXBfbW9kdWxlKTsKIAogc3RydWN0IHBhcnBvcnRfcHJpdmF0ZSB7CiAJdW5zaWduZWQgaW50IGFfZGF0YTsKQEAgLTM5NiwzICs0MDcsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKaW5kZXggZWY4M2ExYS4uYjIyMGIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKQEAgLTEwNyw3ICsxMDcsMTggQEAKIAkubnVtX25hbWVzID0gQVJSQVlfU0laRSh3YXZlZm9ybV9ib2FyZHMpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl93YXZlZm9ybSk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfd2F2ZWZvcm1faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3dhdmVmb3JtKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl93YXZlZm9ybV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3dhdmVmb3JtKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3dhdmVmb3JtX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl93YXZlZm9ybV9jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLApAQCAtNTQ5LDMgKzU2MCw3IEBACiAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwppbmRleCA5NTExODE0Li44NzFmMTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIHN0YXRpYyBpbnQgY29udGVjX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAogCXByaW50aygiY29tZWRpJWQ6IGNvbnRlYzogIiwgZGV2LT5taW5vcik7CkBAIC0xMTYsMTAgKzExNiw3IEBACiAJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCAyKSA8IDApCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKLQkgICAgIHBjaWRldiAhPSBOVUxMOwotCSAgICAgcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgewotCisJZm9yX2VhY2hfcGNpX2RldihwY2lkZXYpIHsKIAkJaWYgKHBjaWRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09OVEVDICYmCiAJCSAgICBwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BJTzE2MTZMKSB7CiAJCQlpZiAoaXQtPm9wdGlvbnNbMF0gfHwgaXQtPm9wdGlvbnNbMV0pIHsKQEAgLTIzMiw0ICsyMjksNDQgQEAKIAlyZXR1cm4gMjsKIH0KIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfY29udGVjLCBjb250ZWNfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9jb250ZWNfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9jb250ZWMuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2NvbnRlY19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfY29udGVjX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gY29udGVjX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2NvbnRlY19wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfY29udGVjX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfY29udGVjX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9jb250ZWMpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2NvbnRlY19wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9jb250ZWMuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9jb250ZWNfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfY29udGVjX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfY29udGVjX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2NvbnRlYyk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9jb250ZWNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2NvbnRlY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYwppbmRleCAwNzhlYzI3Li42YWY2YzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCkBAIC04ODcsNCArODg3LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2RhcWJvYXJkMjAwMCwgZGFxYm9hcmQyMDAwX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfZGFxYm9hcmQyMDAwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQKKwkJCQkJCSAgICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfZGFxYm9hcmQyMDAwLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9kYXFib2FyZDIwMDBfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX2RhcWJvYXJkMjAwMF9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGRhcWJvYXJkMjAwMF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9kYXFib2FyZDIwMDBfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX2RhcWJvYXJkMjAwMF9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2RhcWJvYXJkMjAwMF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZGFxYm9hcmQyMDAwKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9kYXFib2FyZDIwMDBfcGNpX2RyaXZlci5uYW1lID0KKwkgICAgKGNoYXIgKilkcml2ZXJfZGFxYm9hcmQyMDAwLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfZGFxYm9hcmQyMDAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2RhcWJvYXJkMjAwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2RhcWJvYXJkMjAwMF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kYXFib2FyZDIwMDApOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZGFxYm9hcmQyMDAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kYXFib2FyZDIwMDBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jCmluZGV4IDljYjE0NGYuLjMxNDFkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jCkBAIC0yOSwxMSArMjksMTEgQEAKICAqIERlc2NyaXB0aW9uOiBEQVMtMDggY29tcGF0aWJsZSBib2FyZHMKICAqIEF1dGhvcjogV2FycmVuIEphc3BlciwgZHMsIEZyYW5rIEhlc3MKICAqIERldmljZXM6IFtLZWl0aGxleSBNZXRyYWJ5dGVdIERBUzA4IChpc2EtZGFzMDgpLAotICogW0NvbXB1dGVyQm9hcmRzXSBEQVMwOCAoaXNhLWRhczA4KSwgREFTMDgtUEdNIChkYXMwOC1wZ20pLAotICogREFTMDgtUEdIIChkYXMwOC1wZ2gpLCBEQVMwOC1QR0wgKGRhczA4LXBnbCksIERBUzA4LUFPSCAoZGFzMDgtYW9oKSwKLSAqIERBUzA4LUFPTCAoZGFzMDgtYW9sKSwgREFTMDgtQU9NIChkYXMwOC1hb20pLCBEQVMwOC9KUi1BTyAoZGFzMDgvanItYW8pLAotICogREFTMDgvSlItMTYtQU8gKGRhczA4anItMTYtYW8pLCBQQ0ktREFTMDggKGRhczA4KSwKLSAqIFBDMTA0LURBUzA4IChwYzEwNC1kYXMwOCksIERBUzA4L0pSLzE2IChkYXMwOGpyLzE2KQorICogICBbQ29tcHV0ZXJCb2FyZHNdIERBUzA4IChpc2EtZGFzMDgpLCBEQVMwOC1QR00gKGRhczA4LXBnbSksCisgKiAgIERBUzA4LVBHSCAoZGFzMDgtcGdoKSwgREFTMDgtUEdMIChkYXMwOC1wZ2wpLCBEQVMwOC1BT0ggKGRhczA4LWFvaCksCisgKiAgIERBUzA4LUFPTCAoZGFzMDgtYW9sKSwgREFTMDgtQU9NIChkYXMwOC1hb20pLCBEQVMwOC9KUi1BTyAoZGFzMDgvanItYW8pLAorICogICBEQVMwOC9KUi0xNi1BTyAoZGFzMDhqci0xNi1hbyksIFBDSS1EQVMwOCAoZGFzMDgpLAorICogICBQQzEwNC1EQVMwOCAocGMxMDQtZGFzMDgpLCBEQVMwOC9KUi8xNiAoZGFzMDhqci8xNikKICAqIFN0YXR1czogd29ya3MKICAqCiAgKiBUaGlzIGlzIGEgcmV3cml0ZSBvZiB0aGUgZGFzMDggYW5kIGRhczA4anIgZHJpdmVycy4KQEAgLTk4MCw3ICs5ODAsNyBAQAogCXVuc2lnbmVkIGxvbmcgaW9iYXNlOwogI2lmZGVmIENPTkZJR19DT01FRElfUENJCiAJdW5zaWduZWQgbG9uZyBwY2lfaW9iYXNlID0gMDsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CiAjZW5kaWYKIAogCXJldCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGRhczA4X3ByaXZhdGVfc3RydWN0KSk7CkBAIC05OTcsOSArOTk3LDcgQEAKIAkJfQogCQlwcmludGsoIlxuIik7CiAJCS8qICBmaW5kIGNhcmQgKi8KLQkJZm9yIChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JCSAgICAgcGRldiAhPSBOVUxMOwotCQkgICAgIHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkgeworCQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKIAkJCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DT01QVVRFUkJPQVJEUwogCQkJICAgICYmIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BDSURBUzA4KSB7CiAJCQkJaWYgKGl0LT5vcHRpb25zWzBdIHx8IGl0LT5vcHRpb25zWzFdKSB7CkBAIC0xMDgyLDExICsxMDgwLDYyIEBACiBFWFBPUlRfU1lNQk9MX0dQTChkYXMwOF9jb21tb25fZGV0YWNoKTsKIAogI2lmZGVmIENPTkZJR19DT01FRElfUENJCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9kYXMwOCwgZGFzMDhfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9kYXMwOF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfZGFzMDguZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2RhczA4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9kYXMwOF9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGRhczA4X3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2RhczA4X3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9kYXMwOF9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2RhczA4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9kYXMwOCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfZGFzMDhfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfZGFzMDguZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9kYXMwOF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kYXMwOF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2RhczA4X3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2RhczA4KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2RhczA4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kYXMwOF9jbGVhbnVwX21vZHVsZSk7CiAjZWxzZQotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kYXMwOCk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfZGFzMDhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2RhczA4KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kYXMwOF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2RhczA4KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2RhczA4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kYXMwOF9jbGVhbnVwX21vZHVsZSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19DT01FRElfUENNQ0lBCiBFWFBPUlRfU1lNQk9MX0dQTChkYXMwOF9jc19ib2FyZHMpOwogI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMKaW5kZXggODc2MWE2ZC4uYzZhYTUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlICJkYXMwOC5oIgogCiAvKiBwY21jaWEgaW5jbHVkZXMgKi8KLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CkBAIC04OSw3ICs4OCw3IEBACiAJCQlwcmludGsoIiBubyBwY21jaWEgY2FyZHMgZm91bmRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KLQkJaW9iYXNlID0gbGluay0+aW8uQmFzZVBvcnQxOworCQlpb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCIgYnVnISBib2FyZCBkb2VzIG5vdCBoYXZlIFBDTUNJQSBidXN0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzIsMTQgKzEzMSw2IEBACiAgICBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCiAqLwogCi0vKgotICAgVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcwotICAgZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KLSAgIGRhdGFiYXNlLgotKi8KLQotc3RhdGljIGNvbnN0IGRldl9pbmZvX3QgZGV2X2luZm8gPSAicGNtLWRhczA4IjsKLQogc3RydWN0IGxvY2FsX2luZm9fdCB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbms7CiAJaW50IHN0b3A7CkBAIC0yMDYsOCArMTk3LDcgQEAKIAlkYXMwOF9wY21jaWFfcmVsZWFzZShsaW5rKTsKIAogCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBwYXJlbnQgc3RydWN0IGxvY2FsX2luZm9fdCBzdHJ1Y3QgKi8KLQlpZiAobGluay0+cHJpdikKLQkJa2ZyZWUobGluay0+cHJpdik7CisJa2ZyZWUobGluay0+cHJpdik7CiAKIH0JCQkJLyogZGFzMDhfcGNtY2lhX2RldGFjaCAqLwogCkBAIC0yMjUsMjQgKzIxNSwyMyBAQAogCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwogCiAJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAwOwogCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgewogCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOwotCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCXBfZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0KKwkJCXBjbWNpYV9pb19jZmdfZGF0YV93aWR0aChpby0+ZmxhZ3MpOwogCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOwogCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5mbGFncyA9IHBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3M7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSBpby0+d2luWzFdLmxlbjsKIAkJfQogCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworCQlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI4NCwxMiArMjczLDEwIEBACiAJZGV2X2luZm8oJmxpbmstPmRldiwgImluZGV4IDB4JTAyeCIsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOwogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJCXByaW50aygiLCBpcnEgJXUiLCBsaW5rLT5pcnEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxICsgbGluay0+aW8uTnVtUG9ydHMxIC0gMSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMikKLQkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyICsgbGluay0+aW8uTnVtUG9ydHMyIC0gMSk7CisJaWYgKGxpbmstPnJlc291cmNlWzBdKQorCQlwcmludGsoIiwgaW8gJXBSIiwgbGluay0+cmVzb3VyY2VbMF0pOworCWlmIChsaW5rLT5yZXNvdXJjZVsxXSkKKwkJcHJpbnRrKCIgJiAlcFIiLCBsaW5rLT5yZXNvdXJjZVsxXSk7CiAJcHJpbnRrKCJcbiIpOwogCiAJcmV0dXJuOwpAQCAtMzYzLDcgKzM1MCw3IEBACiAJLmlkX3RhYmxlID0gZGFzMDhfY3NfaWRfdGFibGUsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRydiA9IHsKLQkJLm5hbWUgPSBkZXZfaW5mbywKKwkJLm5hbWUgPSAicGNtLWRhczA4IiwKIAkJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKaW5kZXggY2NlZTRmMS4uMGFmMWI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKQEAgLTE3MTcsNyArMTcxNywxOCBAQAogCXJldHVybiAwOwogfQogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2RhczE2KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9kYXMxNl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZGFzMTYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2RhczE2X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfZGFzMTYpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZGFzMTZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2RhczE2X2NsZWFudXBfbW9kdWxlKTsKIAogLyogdXRpbGl0eSBmdW5jdGlvbiB0aGF0IHN1Z2dlc3RzIGEgZG1hIHRyYW5zZmVyIHNpemUgaW4gYnl0ZXMgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGFzMTZfc3VnZ2VzdF90cmFuc2Zlcl9zaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xNzc2LDMgKzE3ODcsNyBAQAogCiAJfQogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYwppbmRleCBjNDAzZDg4Li5hNWNlM2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMKQEAgLTE5OCw3ICsxOTgsMTggQEAKICNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBkYXMxNm0xX3ByaXZhdGVfc3RydWN0ICopKGRldi0+cHJpdmF0ZSkpCiAjZGVmaW5lIHRoaXNib2FyZCAoKGNvbnN0IHN0cnVjdCBkYXMxNm0xX2JvYXJkICopKGRldi0+Ym9hcmRfcHRyKSkKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kYXMxNm0xKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9kYXMxNm0xX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9kYXMxNm0xKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kYXMxNm0xX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfZGFzMTZtMSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9kYXMxNm0xX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kYXMxNm0xX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGlubGluZSBzaG9ydCBtdW5nZV9zYW1wbGUoc2hvcnQgZGF0YSkKIHsKQEAgLTc3NywzICs3ODgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jCmluZGV4IGRlNWU4MmYuLjZlYTkzZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE4MDAuYwpAQCAtNTMxLDcgKzUzMSwxOCBAQAogICogQSBjb252ZW5pZW50IG1hY3JvIHRoYXQgZGVmaW5lcyBpbml0X21vZHVsZSgpIGFuZCBjbGVhbnVwX21vZHVsZSgpLAogICogYXMgbmVjZXNzYXJ5LgogICovCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2RhczE4MDApOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2RhczE4MDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2RhczE4MDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2RhczE4MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kYXMxODAwKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2RhczE4MDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2RhczE4MDBfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaW50IGRhczE4MDBfaW5pdF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGRtYTAsCiAJCQkgICAgdW5zaWduZWQgaW50IGRtYTEpCkBAIC0xODAwLDMgKzE4MTEsNyBAQAogCiAJcmV0dXJuIHNpemU7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCmluZGV4IGE0MDRhMTguLjYzMjhmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYwpAQCAtMTA5LDcgKzEwOSwxOCBAQAogCS5kZXRhY2ggPSBkYXM2NDAyX2RldGFjaCwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfZGFzNjQwMik7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfZGFzNjQwMl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZGFzNjQwMik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfZGFzNjQwMl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2RhczY0MDIpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZGFzNjQwMl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfZGFzNjQwMl9jbGVhbnVwX21vZHVsZSk7CiAKIHN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgewogCWludCBhaV9ieXRlc190b19yZWFkOwpAQCAtMzYwLDMgKzM3MSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jCmluZGV4IGFhZGM0OTcuLmFlY2FlZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMKQEAgLTM0Nyw3ICszNDcsMTggQEAKICAqIEEgY29udmVuaWVudCBtYWNybyB0aGF0IGRlZmluZXMgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUoKSwKICAqIGFzIG5lY2Vzc2FyeS4KICAqLwotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kYXM4MDApOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2RhczgwMF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZGFzODAwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kYXM4MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kYXM4MDApOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZGFzODAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kYXM4MDBfY2xlYW51cF9tb2R1bGUpOwogCiAvKiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgZGFzODAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQpAQCAtOTA1LDMgKzkxNiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKaW5kZXggZDVjYmQ1MS4uNjkzNzI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCkBAIC0zNyw0MyArMzcsNiBAQAogICBjb21lZGlfY29uZmlnIC9kZXYvY29tZWRpMCBkbW0zMmF0IGJhc2VhZGRyLGlycQogKi8KIAotLyoKLSAqIFRoZSBwcmV2aW91cyBibG9jayBjb21tZW50IGlzIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZQotICogZG9jdW1lbnRhdGlvbiBpbiBDb21lZGkgYW5kIENvbWVkaWxpYi4gIFRoZSBmaWVsZHM6Ci0gKgotICogRHJpdmVyOiB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyCi0gKiBEZXNjcmlwdGlvbjogYSBzaG9ydCBwaHJhc2UgZGVzY3JpYmluZyB0aGUgZHJpdmVyLiAgRG9uJ3QgbGlzdCBib2FyZHMuCi0gKiBEZXZpY2VzOiBhIGZ1bGwgbGlzdCBvZiB0aGUgYm9hcmRzIHRoYXQgYXR0ZW1wdCB0byBiZSBzdXBwb3J0ZWQgYnkKLSAqICAgdGhlIGRyaXZlci4gIEZvcm1hdCBpcyAiKG1hbnVmYWN0dXJlcikgYm9hcmQgbmFtZSBbY29tZWRpIG5hbWVdIiwKLSAqICAgd2hlcmUgY29tZWRpX25hbWUgaXMgdGhlIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYm9hcmQuCi0gKiAgIFNlZSB0aGUgY29tbWVudCBuZWFyIGJvYXJkX25hbWU6IGluIHRoZSBzdHJ1Y3QgY29tZWRpX2RyaXZlciBzdHJ1Y3R1cmUKLSAqICAgYmVsb3cuICBJZiAobWFudWZhY3R1cmVyKSBvciBbY29tZWRpIG5hbWVdIGlzIG1pc3NpbmcsIHRoZSBwcmV2aW91cwotICogICB2YWx1ZSBpcyB1c2VkLgotICogQXV0aG9yOiB5b3UKLSAqIFVwZGF0ZWQ6IGRhdGUgd2hlbiB0aGUgX2RvY3VtZW50YXRpb25fIHdhcyBsYXN0IHVwZGF0ZWQuICBVc2UgJ2RhdGUgLVInCi0gKiAgIHRvIGdldCBhIHZhbHVlIGZvciB0aGlzLgotICogU3RhdHVzOiBhIG9uZS13b3JkIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGF0dXMuICBWYWxpZCB2YWx1ZXMgYXJlOgotICogICB3b3JrcyAtIGRyaXZlciB3b3JrcyBjb3JyZWN0bHkgb24gbW9zdCBib2FyZHMgc3VwcG9ydGVkLCBhbmQKLSAqICAgICBwYXNzZXMgY29tZWRpX3Rlc3QuCi0gKiAgIHVua25vd24gLSB1bmtub3duLiAgVXN1YWxseSBwdXQgdGhlcmUgYnkgZHMuCi0gKiAgIGV4cGVyaW1lbnRhbCAtIG1heSBub3Qgd29yayBpbiBhbnkgcGFydGljdWxhciByZWxlYXNlLiAgQXV0aG9yCi0gKiAgICAgcHJvYmFibHkgd2FudHMgYXNzaXN0YW5jZSB0ZXN0aW5nIGl0LgotICogICBiaXRyb3R0ZW4gLSBkcml2ZXIgaGFzIG5vdCBiZWVuIHVwZGF0ZSBpbiBhIGxvbmcgdGltZSwgcHJvYmFibHkKLSAqICAgICBkb2Vzbid0IHdvcmssIGFuZCBwcm9iYWJseSBpcyBtaXNzaW5nIHN1cHBvcnQgZm9yIHNpZ25pZmljYW50Ci0gKiAgICAgQ29tZWRpIGludGVyZmFjZSBmZWF0dXJlcy4KLSAqICAgdW50ZXN0ZWQgLSBhdXRob3IgcHJvYmFibHkgd3JvdGUgaXQgImJsaW5kIiwgYW5kIGlzIGJlbGlldmVkIHRvCi0gKiAgICAgd29yaywgYnV0IG5vIGNvbmZpcm1hdGlvbi4KLSAqCi0gKiBUaGVzZSBoZWFkZXJzIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUsIGFuZCBhbnkgY29tbWVudHMKLSAqIHlvdSB3aXNoIHRvIHNheSBhYm91dCB0aGUgZHJpdmVyLiAgVGhlIGNvbW1lbnQgYXJlYSBpcyB0aGUgcGxhY2UKLSAqIHRvIHB1dCBhbnkga25vd24gYnVncywgbGltaXRhdGlvbnMsIHVuc3VwcG9ydGVkIGZlYXR1cmVzLCBzdXBwb3J0ZWQKLSAqIGNvbW1hbmQgdHJpZ2dlcnMsIHdoZXRoZXIgb3Igbm90IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQgb24gcGFydGljdWxhcgotICogc3ViZGV2aWNlcywgZXRjLgotICoKLSAqIFNvbWV3aGVyZSBpbiB0aGUgY29tbWVudCBzaG91bGQgYmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJhdGlvbgotICogb3B0aW9ucyB0aGF0IGFyZSB1c2VkIHdpdGggY29tZWRpX2NvbmZpZy4KLSAqLwotCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC0zMzYsMTIgKzI5OSwxNCBAQAogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwogCWlycSA9IGl0LT5vcHRpb25zWzFdOwogCi0JcHJpbnRrKCJjb21lZGklZDogZG1tMzJhdDogYXR0YWNoaW5nXG4iLCBkZXYtPm1pbm9yKTsKLQlwcmludGsoImRtbTMyYXQ6IHByb2JpbmcgYXQgYWRkcmVzcyAweCUwNGx4LCBpcnEgJXVcbiIsIGlvYmFzZSwgaXJxKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogZG1tMzJhdDogYXR0YWNoaW5nXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiZG1tMzJhdDogcHJvYmluZyBhdCBhZGRyZXNzIDB4JTA0bHgsIGlycSAldVxuIiwKKwkgICAgICAgaW9iYXNlLCBpcnEpOwogCiAJLyogcmVnaXN0ZXIgYWRkcmVzcyBzcGFjZSAqLwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBETU0zMkFUX01FTVNJWkUsIHRoaXNib2FyZC0+bmFtZSkpIHsKLQkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IGRtbTMyYXQ6IEkvTyBwb3J0IGNvbmZsaWN0XG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlkZXYtPmlvYmFzZSA9IGlvYmFzZTsKQEAgLTM3OSwxNCArMzQ0LDE1IEBACiAJaW50c3RhdCA9IGRtbV9pbmIoZGV2LCBETU0zMkFUX0lOVENMT0NLKTsKIAlhaXJiYWNrID0gZG1tX2luYihkZXYsIERNTTMyQVRfQUlSQkFDSyk7CiAKLQlwcmludGsoImRtbTMyYXQ6IGxvPTB4JTAyeCBoaT0weCUwMnggZmlmb3N0YXQ9MHglMDJ4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJkbW0zMmF0OiBsbz0weCUwMnggaGk9MHglMDJ4IGZpZm9zdGF0PTB4JTAyeFxuIiwKIAkgICAgICAgYWlsbywgYWloaSwgZmlmb3N0YXQpOwotCXByaW50aygiZG1tMzJhdDogYWlzdGF0PTB4JTAyeCBpbnRzdGF0PTB4JTAyeCBhaXJiYWNrPTB4JTAyeFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiZG1tMzJhdDogYWlzdGF0PTB4JTAyeCBpbnRzdGF0PTB4JTAyeCBhaXJiYWNrPTB4JTAyeFxuIiwKIAkgICAgICAgYWlzdGF0LCBpbnRzdGF0LCBhaXJiYWNrKTsKIAogCWlmICgoYWlsbyAhPSAweDAwKSB8fCAoYWloaSAhPSAweDFmKSB8fCAoZmlmb3N0YXQgIT0gMHg4MCkgfHwKIAkgICAgKGFpc3RhdCAhPSAweDYwIHx8IChpbnRzdGF0ICE9IDB4MDApIHx8IGFpcmJhY2sgIT0gMHgwYykpIHsKLQkJcHJpbnRrKCJkbW1hdDMyOiBib2FyZCBkZXRlY3Rpb24gZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbW1hdDMyOiBib2FyZCBkZXRlY3Rpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zOTQsNyArMzYwLDcgQEAKIAlpZiAoaXJxKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZG1tMzJhdF9pc3IsIDAsIHRoaXNib2FyZC0+bmFtZSwgZGV2KTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50aygiaXJxIGNvbmZsaWN0XG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiZG1tMzJhdDogaXJxIGNvbmZsaWN0XG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJZGV2LT5pcnEgPSBpcnE7CkBAIC00NzgsNyArNDQ0LDcgQEAKIAl9CiAKIAkvKiBzdWNjZXNzICovCi0JcHJpbnRrKCJjb21lZGklZDogZG1tMzJhdDogYXR0YWNoZWRcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBkbW0zMmF0OiBhdHRhY2hlZFxuIiwgZGV2LT5taW5vcik7CiAKIAlyZXR1cm4gMTsKIApAQCAtNDk0LDcgKzQ2MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZG1tMzJhdF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBkbW0zMmF0OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBkbW0zMmF0OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJaWYgKGRldi0+aW9iYXNlKQpAQCAtNTQyLDcgKzUwOCw3IEBACiAJCQlicmVhazsKIAl9CiAJaWYgKGkgPT0gNDAwMDApIHsKLQkJcHJpbnRrKCJ0aW1lb3V0XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZG1tMzJhdDogdGltZW91dFxuIik7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIApAQCAtNTU3LDcgKzUyMyw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGkgPT0gNDAwMDApIHsKLQkJCXByaW50aygidGltZW91dFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJkbW0zMmF0OiB0aW1lb3V0XG4iKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAKQEAgLTYyNyw3ICs1OTMsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkKKwkgKiBjb21wYXRpYmxlICovCiAKIAkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCkBAIC04MDAsNyArNzY3LDggQEAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQogCQlkZXZwcml2LT5haV9zY2Fuc19sZWZ0ID0gY21kLT5zdG9wX2FyZzsKIAllbHNlIHsJCQkvKiBUUklHX05PTkUgKi8KLQkJZGV2cHJpdi0+YWlfc2NhbnNfbGVmdCA9IDB4ZmZmZmZmZmY7CS8qIGluZGljYXRlcyBUUklHX05PTkUgdG8gaXNyICovCisJCWRldnByaXYtPmFpX3NjYW5zX2xlZnQgPSAweGZmZmZmZmZmOyAvKiBpbmRpY2F0ZXMgVFJJR19OT05FIHRvCisJCQkJCQkgICAgICAqIGlzciAqLwogCX0KIAogCS8qIHdhaXQgZm9yIGNpcmN1aXQgdG8gc2V0dGxlICovCkBAIC04MTAsNyArNzc4LDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAoaSA9PSA0MDAwMCkgewotCQlwcmludGsoInRpbWVvdXRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkbW0zMmF0OiB0aW1lb3V0XG4iKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCkBAIC04MjMsMTMgKzc5MSwxMyBAQAogCQlkbW1fb3V0YihkZXYsIERNTTMyQVRfQ09OViwgMHhmZik7CiAJfQogCi0vKiAJcHJpbnRrKCJkbW1hdDMyIGluIGNvbW1hbmRcbiIpOyAqLworLyoJcHJpbnRrKCJkbW1hdDMyIGluIGNvbW1hbmRcbiIpOyAqLwogCi0vKiAJZm9yKGk9MDtpPGNtZC0+Y2hhbmxpc3RfbGVuO2krKykgKi8KLS8qIAkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsaSoxMDApOyAqLworLyoJZm9yKGk9MDtpPGNtZC0+Y2hhbmxpc3RfbGVuO2krKykgKi8KKy8qCQljb21lZGlfYnVmX3B1dChzLT5hc3luYyxpKjEwMCk7ICovCiAKLS8qIAlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7ICovCi0vKiAJY29tZWRpX2V2ZW50KGRldiwgcyk7ICovCisvKglzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7ICovCisvKgljb21lZGlfZXZlbnQoZGV2LCBzKTsgKi8KIAogCXJldHVybiAwOwogCkBAIC05MzcsNyArOTA1LDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoaSA9PSA0MDAwMCkgewotCQkJcHJpbnRrKCJ0aW1lb3V0XG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImRtbTMyYXQ6IHRpbWVvdXRcbiIpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJLyogZHVtbXkgcmVhZCB0byB1cGRhdGUgdHJpZ2dlciB0aGUgb3V0cHV0ICovCkBAIC0xMDk1LDQgKzEwNjMsMTkgQEAKICAqIEEgY29udmVuaWVudCBtYWNybyB0aGF0IGRlZmluZXMgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUoKSwKICAqIGFzIG5lY2Vzc2FyeS4KICAqLwotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kbW0zMmF0KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9kbW0zMmF0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9kbW0zMmF0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kbW0zMmF0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfZG1tMzJhdCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9kbW0zMmF0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kbW0zMmF0X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgwMS5jCmluZGV4IDgzZmI2ZTUuLjVjY2UxYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODAxLmMKQEAgLTk4LDcgKzk4LDE4IEBACiAJLmRldGFjaCA9IGR0MjgwMV9kZXRhY2gsCiB9OwogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2R0MjgwMSk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfZHQyODAxX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9kdDI4MDEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2R0MjgwMV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2R0MjgwMSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9kdDI4MDFfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2R0MjgwMV9jbGVhbnVwX21vZHVsZSk7CiAKICNpZiAwCiAvKiBpZ25vcmUgJ2RlZmluZWQgYnV0IG5vdCB1c2VkJyB3YXJuaW5nICovCkBAIC03MjAsMyArNzMxLDcgQEAKIAogCXJldHVybiAxOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKaW5kZXggZWE5YmZiNy4uYTE2NjRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYwpAQCAtMjM5LDcgKzIzOSwxOCBAQAogCS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGR0MjgxMV9ib2FyZCksCiB9OwogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2R0MjgxMSk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfZHQyODExX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9kdDI4MTEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX2R0MjgxMV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2R0MjgxMSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9kdDI4MTFfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2R0MjgxMV9jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyBpbnQgZHQyODExX2FpX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKTsKQEAgLTYyNSwzICs2MzYsNyBAQAogCiAJcmV0dXJuIDI7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwppbmRleCAxNmZkZTA2Li4xYzYyNDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCkBAIC03MCw3ICs3MCwxOCBAQAogCS5kZXRhY2ggPSBkdDI4MTRfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kdDI4MTQpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2R0MjgxNF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZHQyODE0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kdDI4MTRfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kdDI4MTQpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZHQyODE0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kdDI4MTRfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZHQyODE0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpOwogCkBAIC0zODcsMyArMzk4LDcgQEAKIAljb21lZGlfZXZlbnQoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYwppbmRleCBkMWE0Zjc4Li40MTU1ZGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jCkBAIC04Miw3ICs4MiwxOCBAQAogCS5kZXRhY2ggPSBkdDI4MTVfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kdDI4MTUpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2R0MjgxNV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZHQyODE1KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kdDI4MTVfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kdDI4MTUpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZHQyODE1X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kdDI4MTVfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgdm9pZCBkdDI4MTVfZnJlZV9yZXNvdXJjZXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiAKQEAgLTI1NSwzICsyNjYsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTcuYwppbmRleCA1NGUwZGVhLi42NTFmZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNy5jCkBAIC01Nyw3ICs1NywxOCBAQAogCS5kZXRhY2ggPSBkdDI4MTdfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kdDI4MTcpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2R0MjgxN19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZHQyODE3KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kdDI4MTdfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kdDI4MTcpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZHQyODE3X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kdDI4MTdfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaW50IGR0MjgxN19kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLApAQCAtMTgwLDMgKzE5MSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCmluZGV4IGZkODcyOGMuLjhjZWE5ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKQEAgLTQyMyw3ICs0MjMsMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBkdDI4MnhfYm9hcmQpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9kdDI4MngpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2R0MjgyeF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfZHQyODJ4KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9kdDI4MnhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9kdDI4MngpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfZHQyODJ4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9kdDI4MnhfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgdm9pZCBmcmVlX3Jlc291cmNlcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgcHJlcF9haV9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IGNoYW4sIGludCBzaXplKTsKQEAgLTE1MDIsMyArMTUxMyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jCmluZGV4IGNhNjg3ODkuLjY1NmU3YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDMwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMKQEAgLTI4Nyw3ICsyODcsNDMgQEAKIAkuZGV0YWNoID0gZHQzMDAwX2RldGFjaCwKIH07CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX2R0MzAwMCwgZHQza19wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2R0MzAwMF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX2R0MzAwMC5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfZHQzMDAwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9kdDMwMDBfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBkdDNrX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2R0MzAwMF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfZHQzMDAwX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfZHQzMDAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9kdDMwMDApOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2R0MzAwMF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9kdDMwMDAuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9kdDMwMDBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfZHQzMDAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfZHQzMDAwX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2R0MzAwMCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9kdDMwMDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX2R0MzAwMF9jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyB2b2lkIGR0M2tfYWlfZW1wdHlfZmlmbyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKQEAgLTk5MSwzICsxMDI3LDcgQEAKIAkqYm9hcmQgPSAtMTsKIAlyZXR1cm4gZnJvbTsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jCmluZGV4IDk2Y2FhZTMuLmQwMWQyZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKQEAgLTg5MCw4ICs4OTAsMTAgQEAKICAqIENvbWVkaSBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCBkdDk4MTJfY29tZWRpX29wZW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZHQ5ODEyX2NvbWVkaV9vcGVuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisKIAlkb3duKCZkZXZwcml2LT5zbG90LT5tdXRleCk7CiAJaWYgKGRldnByaXYtPnNsb3QtPnVzYikgewogCQkvKiBXZSBoYXZlIGFuIGF0dGFjaGVkIGRldmljZSwgZmlsbCBpbiBjdXJyZW50IHJhbmdlIGluZm8gKi8KQEAgLTkzNCw4ICs5MzYsMTAgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQl9CisJCXJlc3VsdCA9IDA7CiAJfQogCXVwKCZkZXZwcml2LT5zbG90LT5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBkdDk4MTJfZGlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9mbDUxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMKaW5kZXggYTEwYTJiMC4uN2Y0OWFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMKQEAgLTUyLDcgKzUyLDE4IEBACiAJLmRldGFjaCA9IGZsNTEyX2RldGFjaCwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfZmw1MTIpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2ZsNTEyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9mbDUxMik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfZmw1MTJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9mbDUxMik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9mbDUxMl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfZmw1MTJfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaW50IGZsNTEyX2FpX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtMjA1LDMgKzIxNiw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGZsNTEyOiBkdW1teSBpIGRldGFjaFxuIiwgZGV2LT5taW5vcik7CiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKaW5kZXggNTFmMTJiZi4uMTY2MWI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKQEAgLTMxMSwxNyArMzExLDI1IEBACiAJdm9pZCAqcGx4OTA4MF9pb2Jhc2U7CiAJdm9pZCAqaHBkaV9pb2Jhc2U7CiAJdWludDMyX3QgKmRpb19idWZmZXJbTlVNX0RNQV9CVUZGRVJTXTsJLyogIGRtYSBidWZmZXJzICovCi0JZG1hX2FkZHJfdCBkaW9fYnVmZmVyX3BoeXNfYWRkcltOVU1fRE1BX0JVRkZFUlNdOwkvKiAgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIGRtYSBidWZmZXJzICovCi0Jc3RydWN0IHBseF9kbWFfZGVzYyAqZG1hX2Rlc2M7CS8qICBhcnJheSBvZiBkbWEgZGVzY3JpcHRvcnMgcmVhZCBieSBwbHg5MDgwLCBhbGxvY2F0ZWQgdG8gZ2V0IHByb3BlciBhbGlnbm1lbnQgKi8KLQlkbWFfYWRkcl90IGRtYV9kZXNjX3BoeXNfYWRkcjsJLyogIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZG1hIGRlc2NyaXB0b3IgYXJyYXkgKi8KKwkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgZG1hIGJ1ZmZlcnMgKi8KKwlkbWFfYWRkcl90IGRpb19idWZmZXJfcGh5c19hZGRyW05VTV9ETUFfQlVGRkVSU107CisJLyogYXJyYXkgb2YgZG1hIGRlc2NyaXB0b3JzIHJlYWQgYnkgcGx4OTA4MCwgYWxsb2NhdGVkIHRvIGdldCBwcm9wZXIKKwkgKiBhbGlnbm1lbnQgKi8KKwlzdHJ1Y3QgcGx4X2RtYV9kZXNjICpkbWFfZGVzYzsKKwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRtYSBkZXNjcmlwdG9yIGFycmF5ICovCisJZG1hX2FkZHJfdCBkbWFfZGVzY19waHlzX2FkZHI7CiAJdW5zaWduZWQgaW50IG51bV9kbWFfZGVzY3JpcHRvcnM7Ci0JdWludDMyX3QgKmRlc2NfZGlvX2J1ZmZlcltOVU1fRE1BX0RFU0NSSVBUT1JTXTsJLyogIHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVycyBpbmRleGVkIGJ5IGRlc2NyaXB0b3IgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZG1hX2Rlc2NfaW5kZXg7CS8qICBpbmRleCBvZiB0aGUgZG1hIGRlc2NyaXB0b3IgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCAqLworCS8qIHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVycyBpbmRleGVkIGJ5IGRlc2NyaXB0b3IgKi8KKwl1aW50MzJfdCAqZGVzY19kaW9fYnVmZmVyW05VTV9ETUFfREVTQ1JJUFRPUlNdOworCS8qIGluZGV4IG9mIHRoZSBkbWEgZGVzY3JpcHRvciB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB1c2VkICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGRtYV9kZXNjX2luZGV4OwogCXVuc2lnbmVkIGludCB0eF9maWZvX3NpemU7CiAJdW5zaWduZWQgaW50IHJ4X2ZpZm9fc2l6ZTsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGRpb19jb3VudDsKLQl2b2xhdGlsZSB1aW50MzJfdCBiaXRzWzI0XTsJLyogIHNvZnR3YXJlIGNvcGllcyBvZiB2YWx1ZXMgd3JpdHRlbiB0byBocGRpIHJlZ2lzdGVycyAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBibG9ja19zaXplOwkvKiAgbnVtYmVyIG9mIGJ5dGVzIGF0IHdoaWNoIHRvIGdlbmVyYXRlIENPTUVESV9DQl9CTE9DSyBldmVudHMgKi8KKwkvKiBzb2Z0d2FyZSBjb3BpZXMgb2YgdmFsdWVzIHdyaXR0ZW4gdG8gaHBkaSByZWdpc3RlcnMgKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBiaXRzWzI0XTsKKwkvKiBudW1iZXIgb2YgYnl0ZXMgYXQgd2hpY2ggdG8gZ2VuZXJhdGUgQ09NRURJX0NCX0JMT0NLIGV2ZW50cyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBibG9ja19zaXplOwogCXVuc2lnbmVkIGRpb19jb25maWdfb3V0cHV0OjE7CiB9OwogCkBAIC0zMzcsNyArMzQ1LDQzIEBACiAJLmRldGFjaCA9IGhwZGlfZGV0YWNoLAogfTsKIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfaHBkaSwgaHBkaV9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2hwZGlfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfaHBkaS5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfaHBkaV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfaHBkaV9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGhwZGlfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfaHBkaV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfaHBkaV9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2hwZGlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2hwZGkpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2hwZGlfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfaHBkaS5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2hwZGlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfaHBkaV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2hwZGlfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfaHBkaSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9ocGRpX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9ocGRpX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBkaW9fY29uZmlnX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC01NzAsNyArNjE0LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwY2lkZXYgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhwZGlfYm9hcmRzKSAmJiBkZXYtPmJvYXJkX3B0ciA9PSBOVUxMOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShocGRpX2JvYXJkcykgJiYKKwkJICAgIGRldi0+Ym9hcmRfcHRyID09IE5VTEw7IGkrKykgewogCQlkbyB7CiAJCQlwY2lkZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX1BMWCwKIAkJCQkJCWhwZGlfYm9hcmRzW2ldLmRldmljZV9pZCwKQEAgLTYxOCw3ICs2NjMsNyBAQAogCS8qICByZW1hcCwgd29uJ3Qgd29yayB3aXRoIDIuMCBrZXJuZWxzIGJ1dCB3aG8gY2FyZXMgKi8KIAlwcml2KGRldiktPnBseDkwODBfaW9iYXNlID0gaW9yZW1hcChwcml2KGRldiktPnBseDkwODBfcGh5c19pb2Jhc2UsCiAJCQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwKLQkJCQkJCQkgICAgIFBMWDkwODBfQkFERFJJTkRFWCkpOworCQkJCQkgICAgUExYOTA4MF9CQUREUklOREVYKSk7CiAJcHJpdihkZXYpLT5ocGRpX2lvYmFzZSA9CiAJICAgIGlvcmVtYXAocHJpdihkZXYpLT5ocGRpX3BoeXNfaW9iYXNlLAogCQkgICAgcGNpX3Jlc291cmNlX2xlbihwY2lkZXYsIEhQRElfQkFERFJJTkRFWCkpOwpAQCAtNzY5LDcgKzgxNCw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKLQkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseQorCSAqIGNvbXBhdGlibGUgKi8KIAogCS8qICB1bmlxdWVuZXNzIGNoZWNrICovCiAJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKQEAgLTEwNjYsMyArMTExMiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCmluZGV4IGZhMGU0ODEuLjgwOWQxN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKQEAgLTE4NSw3ICsxODUsMTggQEAKIG9mZnNldCA6IHNpemVvZihzdHJ1Y3QgYm9hcmR0eXBlKSwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfaWNwX211bHRpKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9pY3BfbXVsdGlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2ljcF9tdWx0aSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfaWNwX211bHRpX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfaWNwX211bHRpKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2ljcF9tdWx0aV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfaWNwX211bHRpX2NsZWFudXBfbW9kdWxlKTsKIAogc3RydWN0IGljcF9tdWx0aV9wcml2YXRlIHsKIAlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqY2FyZDsJLyogIHBvaW50ZXIgdG8gY2FyZCAqLwpAQCAtMTEyNSwzICsxMTM2LDcgQEAKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmgKaW5kZXggMmJiOTZiMS4uNjhhY2VmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaApAQCAtNjIsMTYgKzYyLDE0IEBACiAvKiBidWlsZCBsaXN0IG9mIElub3ZhIGNhcmRzIGluIHRoaXMgc3lzdGVtICovCiBzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2luaXQodW5zaWduZWQgc2hvcnQgcGNpX3ZlbmRvciwgY2hhciBkaXNwbGF5KQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IE5VTEw7CiAJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLCAqbGFzdDsKIAlpbnQgaTsKIAogCWlub3ZhX2RldmljZXMgPSBOVUxMOwogCWxhc3QgPSBOVUxMOwogCi0JZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKLQkgICAgIHBjaWRldiAhPSBOVUxMOwotCSAgICAgcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgeworCWZvcl9lYWNoX3BjaV9kZXYocGNpZGV2KSB7CiAJCWlmIChwY2lkZXYtPnZlbmRvciA9PSBwY2lfdmVuZG9yKSB7CiAJCQlpbm92YSA9IGt6YWxsb2Moc2l6ZW9mKCppbm92YSksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFpbm92YSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKaW5kZXggZTI2YzFiOC4uMzlhNmE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCkBAIC02NDAsNCArNjQwLDE5IEBACiB9CiAjZW5kaWYKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2kyMHh4eCk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNpMjB4eHhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjaTIweHh4KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2kyMHh4eF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3BjaTIweHh4KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjaTIweHh4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY2kyMHh4eF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IGQzMzBiMTguLjhiMzgzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlICJjb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAianIzX3BjaS5oIgogCkBAIC0xMjMsMTIgKzEyNCw5IEBACiB9OwogCiAvKiBIb3RwbHVnIGZpcm13YXJlIGxvYWRpbmcgc3R1ZmYgKi8KLQotdHlwZWRlZiBpbnQgY29tZWRpX2Zpcm13YXJlX2NhbGxiYWNrKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBjb25zdCB1OCAqIGRhdGEsIHNpemVfdCBzaXplKTsKLQogc3RhdGljIGludCBjb21lZGlfbG9hZF9maXJtd2FyZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBjaGFyICpuYW1lLAotCQkJCWNvbWVkaV9maXJtd2FyZV9jYWxsYmFjayBjYikKKwkJCQlpbnQgKCpjYikoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3QgdTggKmRhdGEsIHNpemVfdCBzaXplKSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwpAQCAtMzczLDcgKzM3MSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQganIzX3BjaV9vcGVuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGpyM19wY2lfb3BlbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWludCBpOwogCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMzg4LDYgKzM4Niw3IEBACiAJCQkgICAgICAgcC0+Y2hhbm5lbF9ubyk7CiAJCX0KIAl9CisJcmV0dXJuIDA7CiB9CiAKIGludCByZWFkX2lkbV93b3JkKGNvbnN0IHU4ICogZGF0YSwgc2l6ZV90IHNpemUsIGludCAqcG9zLCB1bnNpZ25lZCBpbnQgKnZhbCkKQEAgLTM5OSwxNCArMzk4LDE0IEBACiAJCX0KIAkJLyogIENvbGxlY3QgdmFsdWUgKi8KIAkJKnZhbCA9IDA7Ci0JCWZvciAoOyAqcG9zIDwgc2l6ZSAmJiBpc3hkaWdpdChkYXRhWypwb3NdKTsgKCpwb3MpKyspIHsKLQkJCWNoYXIgY2ggPSB0b2xvd2VyKGRhdGFbKnBvc10pOwotCQkJcmVzdWx0ID0gMTsKLQkJCWlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB7Ci0JCQkJKnZhbCA9ICgqdmFsIDw8IDQpICsgKGNoIC0gJzAnKTsKLQkJCX0gZWxzZSBpZiAoJ2EnIDw9IGNoICYmIGNoIDw9ICdmJykgewotCQkJCSp2YWwgPSAoKnZhbCA8PCA0KSArIChjaCAtICdhJyArIDEwKTsKLQkJCX0KKwkJZm9yICg7ICpwb3MgPCBzaXplOyAoKnBvcykrKykgeworCQkJaW50IHZhbHVlOworCQkJdmFsdWUgPSBoZXhfdG9fYmluKGRhdGFbKnBvc10pOworCQkJaWYgKHZhbHVlID49IDApIHsKKwkJCQlyZXN1bHQgPSAxOworCQkJCSp2YWwgPSAoKnZhbCA8PCA0KSArIHZhbHVlOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTk4Niw0ICs5ODUsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfanIzX3BjaSwganIzX3BjaV9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX2pyM19wY2lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfanIzX3BjaS5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfanIzX3BjaV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfanIzX3BjaV9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGpyM19wY2lfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfanIzX3BjaV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfanIzX3BjaV9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2pyM19wY2lfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2pyM19wY2kpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX2pyM19wY2lfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfanIzX3BjaS5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2pyM19wY2lfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfanIzX3BjaV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2pyM19wY2lfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfanIzX3BjaSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9qcjNfcGNpX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9qcjNfcGNpX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKaW5kZXggNzNiMDQ0NS4uMjg2MDkzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCkBAIC05Niw3ICs5Niw0MyBAQAogCS5kZXRhY2ggPSBjbnRfZGV0YWNoLAogfTsKIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChjbnRfZHJpdmVyLCBjbnRfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNudF9kcml2ZXJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGNudF9kcml2ZXIuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY250X2RyaXZlcl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjbnRfZHJpdmVyX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gY250X3BjaV90YWJsZSwKKwkucHJvYmUgPSAmY250X2RyaXZlcl9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZjbnRfZHJpdmVyX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjbnRfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmNudF9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJY250X2RyaXZlcl9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWNudF9kcml2ZXIuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNudF9kcml2ZXJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbnRfZHJpdmVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjbnRfZHJpdmVyX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmY250X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNudF9kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY250X2RyaXZlcl9jbGVhbnVwX21vZHVsZSk7CiAKIC8qLS0gY291bnRlciB3cml0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTUyLDcgKzE4OCw3IEBACiBzdGF0aWMgaW50IGNudF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2U7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UgPSBOVUxMOwogCXN0cnVjdCBjbnRfYm9hcmRfc3RydWN0ICpib2FyZDsKIAl1bnNpZ25lZCBsb25nIGlvX2Jhc2U7CiAJaW50IGVycm9yLCBpOwpAQCAtMTYzLDkgKzE5OSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAogCS8qIFByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIGluIHRoZSBzZXJpZXMgaXQgaXMuICovCi0JZm9yIChwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lfZGV2aWNlICE9IE5VTEw7Ci0JICAgICBwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldmljZSkpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KHBjaV9kZXZpY2UpIHsKIAkJaWYgKHBjaV9kZXZpY2UtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0tPTFRFUikgewogCQkJZm9yIChpID0gMDsgaSA8IGNudF9ib2FyZF9uYnI7IGkrKykgewogCQkJCWlmIChjbnRfYm9hcmRzW2ldLmRldmljZV9pZCA9PQpAQCAtMjU5LDMgKzI5Myw3IEBACiAJICAgICAgIGRldi0+bWlub3IpOwogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKaW5kZXggOGI5ZmEwZi4uMTQ3MTM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwpAQCAtOTEsMjIgKzkxLDIyIEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWU0MDAwX3BjaV90YWJsZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWU0MDAwX2JvYXJkIG1lNDAwMF9ib2FyZHNbXSA9IHsKLQl7Ik1FLTQ2NTAiLCAweDQ2NTAsIHswLCAwfSwgezE2LCAwLCAwLCAwfSwgezR9LCB7MH19LAorCXsiTUUtNDY1MCIsIDB4NDY1MCwgezAsIDB9LCB7MTYsIDAsIDAsIDB9LCB7NH0sIHswfSB9LAogCi0JeyJNRS00NjYwIiwgMHg0NjYwLCB7MCwgMH0sIHszMiwgMCwgMTYsIDB9LCB7NH0sIHszfX0sCi0JeyJNRS00NjYwaSIsIDB4NDY2MSwgezAsIDB9LCB7MzIsIDAsIDE2LCAwfSwgezR9LCB7M319LAotCXsiTUUtNDY2MHMiLCAweDQ2NjIsIHswLCAwfSwgezMyLCA4LCAxNiwgMH0sIHs0fSwgezN9fSwKLQl7Ik1FLTQ2NjBpcyIsIDB4NDY2MywgezAsIDB9LCB7MzIsIDgsIDE2LCAwfSwgezR9LCB7M319LAorCXsiTUUtNDY2MCIsIDB4NDY2MCwgezAsIDB9LCB7MzIsIDAsIDE2LCAwfSwgezR9LCB7M30gfSwKKwl7Ik1FLTQ2NjBpIiwgMHg0NjYxLCB7MCwgMH0sIHszMiwgMCwgMTYsIDB9LCB7NH0sIHszfSB9LAorCXsiTUUtNDY2MHMiLCAweDQ2NjIsIHswLCAwfSwgezMyLCA4LCAxNiwgMH0sIHs0fSwgezN9IH0sCisJeyJNRS00NjYwaXMiLCAweDQ2NjMsIHswLCAwfSwgezMyLCA4LCAxNiwgMH0sIHs0fSwgezN9IH0sCiAKLQl7Ik1FLTQ2NzAiLCAweDQ2NzAsIHs0LCAwfSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKLQl7Ik1FLTQ2NzBpIiwgMHg0NjcxLCB7NCwgMH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCi0JeyJNRS00NjcwcyIsIDB4NDY3MiwgezQsIDB9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAotCXsiTUUtNDY3MGlzIiwgMHg0NjczLCB7NCwgMH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjcwIiwgMHg0NjcwLCB7NCwgMH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfSB9LAorCXsiTUUtNDY3MGkiLCAweDQ2NzEsIHs0LCAwfSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9IH0sCisJeyJNRS00NjcwcyIsIDB4NDY3MiwgezQsIDB9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M30gfSwKKwl7Ik1FLTQ2NzBpcyIsIDB4NDY3MywgezQsIDB9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M30gfSwKIAotCXsiTUUtNDY4MCIsIDB4NDY4MCwgezQsIDR9LCB7MzIsIDAsIDE2LCAxfSwgezR9LCB7M319LAotCXsiTUUtNDY4MGkiLCAweDQ2ODEsIHs0LCA0fSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKLQl7Ik1FLTQ2ODBzIiwgMHg0NjgyLCB7NCwgNH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCi0JeyJNRS00NjgwaXMiLCAweDQ2ODMsIHs0LCA0fSwgezMyLCA4LCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2ODAiLCAweDQ2ODAsIHs0LCA0fSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9IH0sCisJeyJNRS00NjgwaSIsIDB4NDY4MSwgezQsIDR9LCB7MzIsIDAsIDE2LCAxfSwgezR9LCB7M30gfSwKKwl7Ik1FLTQ2ODBzIiwgMHg0NjgyLCB7NCwgNH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfSB9LAorCXsiTUUtNDY4MGlzIiwgMHg0NjgzLCB7NCwgNH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfSB9LAogCiAJezB9LAogfTsKQEAgLTEyMCwxMCArMTIwLDEwIEBACiAJCQkgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KTsKIHN0YXRpYyBpbnQgbWU0MDAwX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBkcml2ZXJfbWU0MDAwID0gewotZHJpdmVyX25hbWU6Im1lNDAwMCIsCi1tb2R1bGU6VEhJU19NT0RVTEUsCi1hdHRhY2g6bWU0MDAwX2F0dGFjaCwKLWRldGFjaDptZTQwMDBfZGV0YWNoLAorZHJpdmVyX25hbWU6ICJtZTQwMDAiLAorbW9kdWxlIDogVEhJU19NT0RVTEUsCithdHRhY2ggOiBtZTQwMDBfYXR0YWNoLAorZGV0YWNoIDogbWU0MDAwX2RldGFjaCwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMiw4ICszMDIsOCBAQAogCQkJaWYgKHJlcXVlc3RfaXJxKGluZm8tPmlycSwgbWU0MDAwX2FpX2lzciwKIAkJCQkJSVJRRl9TSEFSRUQsICJNRS00MDAwIiwgZGV2KSkgewogCQkJCXByaW50awotCQkJCSAgICAoImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hdHRhY2goKTogVW5hYmxlIHRvIGFsbG9jYXRlIGlycVxuIiwKLQkJCQkgICAgIGRldi0+bWlub3IpOworCQkJCSAgICAoImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hdHRhY2goKTogIgorCQkJCSAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBpcnFcbiIsIGRldi0+bWlub3IpOwogCQkJfSBlbHNlIHsKIAkJCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKIAkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOwpAQCAtMzEzLDggKzMxMyw4IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hdHRhY2goKTogTm8gaW50ZXJydXB0IGF2YWlsYWJsZVxuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2F0dGFjaCgpOiAiCisJCQkgICAgICAgIk5vIGludGVycnVwdCBhdmFpbGFibGVcbiIsIGRldi0+bWlub3IpOwogCQl9CiAJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKQEAgLTM4OSw3ICszODksNyBAQAogCiBzdGF0aWMgaW50IG1lNDAwMF9wcm9iZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UgPSBOVUxMOwogCWludCByZXN1bHQsIGk7CiAJc3RydWN0IG1lNDAwMF9ib2FyZCAqYm9hcmQ7CiAKQEAgLTQwMiwxNyArNDAyLDIxIEBACiAJLyoKIAkgKiBQcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IGRldmljZSBpbiB0aGUgc2VyaWVzIGl0IGlzLgogCSAqLwotCWZvciAocGNpX2RldmljZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpX2RldmljZSAhPSBOVUxMOwotCSAgICAgcGNpX2RldmljZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXZpY2UpKSB7CisJZm9yX2VhY2hfcGNpX2RldihwY2lfZGV2aWNlKSB7CiAJCWlmIChwY2lfZGV2aWNlLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9NRUlMSEFVUykgewogCQkJZm9yIChpID0gMDsgaSA8IE1FNDAwMF9CT0FSRF9WRVJTSU9OUzsgaSsrKSB7CiAJCQkJaWYgKG1lNDAwMF9ib2FyZHNbaV0uZGV2aWNlX2lkID09CiAJCQkJICAgIHBjaV9kZXZpY2UtPmRldmljZSkgewotCQkJCQkvKiBXYXMgYSBwYXJ0aWN1bGFyIGJ1cy9zbG90IHJlcXVlc3RlZD8gKi8KKwkJCQkJLyoKKwkJCQkJICogV2FzIGEgcGFydGljdWxhcgorCQkJCQkgKiBidXMvc2xvdCByZXF1ZXN0ZWQ/CisJCQkJCSAqLwogCQkJCQlpZiAoKGl0LT5vcHRpb25zWzBdICE9IDApCiAJCQkJCSAgICB8fCAoaXQtPm9wdGlvbnNbMV0gIT0gMCkpIHsKLQkJCQkJCS8qIEFyZSB3ZSBvbiB0aGUgd3JvbmcgYnVzL3Nsb3Q/ICovCisJCQkJCQkvKgorCQkJCQkJICogQXJlIHdlIG9uIHRoZSB3cm9uZworCQkJCQkJICogYnVzL3Nsb3Q/CisJCQkJCQkgKi8KIAkJCQkJCWlmIChwY2lfZGV2aWNlLT5idXMtPm51bWJlciAhPQogCQkJCQkJICAgIGl0LT5vcHRpb25zWzBdCiAJCQkJCQkgICAgfHwKQEAgLTQzMywxNCArNDM3LDE2IEBACiAJfQogCiAJcHJpbnRrKEtFUk5fRVJSCi0JICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogTm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6ICIKKwkgICAgICAgIk5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKIAkgICAgICAgZGV2LT5taW5vciwgaXQtPm9wdGlvbnNbMF0sIGl0LT5vcHRpb25zWzFdKTsKIAlyZXR1cm4gLUVOT0RFVjsKIAogZm91bmQ6CiAKIAlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogRm91bmQgJXMgYXQgUENJIGJ1cyAlZCwgc2xvdCAlZFxuIiwKKwkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiAiCisJICAgICAgICJGb3VuZCAlcyBhdCBQQ0kgYnVzICVkLCBzbG90ICVkXG4iLAogCSAgICAgICBkZXYtPm1pbm9yLCBtZTQwMDBfYm9hcmRzW2ldLm5hbWUsIHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyLAogCSAgICAgICBQQ0lfU0xPVChwY2lfZGV2aWNlLT5kZXZmbikpOwogCkBAIC00NTEsOCArNDU3LDggQEAKIAlyZXN1bHQgPSBjb21lZGlfcGNpX2VuYWJsZShwY2lfZGV2aWNlLCBkZXYtPmJvYXJkX25hbWUpOwogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCBJL08gcmVnaW9uc1xuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgZW5hYmxlIFBDSSAiCisJCSAgICAgICAiZGV2aWNlIGFuZCByZXF1ZXN0IEkvTyByZWdpb25zXG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQ2MCwxNiArNDY2LDE2IEBACiAJcmVzdWx0ID0gZ2V0X3JlZ2lzdGVycyhkZXYsIHBjaV9kZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBnZXQgcmVnaXN0ZXJzXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6ICIKKwkJICAgICAgICJDYW5ub3QgZ2V0IHJlZ2lzdGVyc1xuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCS8qIEluaXRpYWxpemUgYm9hcmQgaW5mbyAqLwogCXJlc3VsdCA9IGluaXRfYm9hcmRfaW5mbyhkZXYsIHBjaV9kZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGJhb3JkIGluZm9cbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogIgorCQkgICAgICAgIkNhbm5vdCBpbml0IGJhb3JkIGluZm9cbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNDc3LDggKzQ4Myw4IEBACiAJcmVzdWx0ID0gaW5pdF9hb19jb250ZXh0KGRldik7CiAJaWYgKHJlc3VsdCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgYW8gY29udGV4dFxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiAiCisJCSAgICAgICAiQ2Fubm90IGluaXQgYW8gY29udGV4dFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC00ODYsOCArNDkyLDggQEAKIAlyZXN1bHQgPSBpbml0X2FpX2NvbnRleHQoZGV2KTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBhaSBjb250ZXh0XG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6ICIKKwkJICAgICAgICJDYW5ub3QgaW5pdCBhaSBjb250ZXh0XG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQ5NSw4ICs1MDEsOCBAQAogCXJlc3VsdCA9IGluaXRfZGlvX2NvbnRleHQoZGV2KTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBkaW8gY29udGV4dFxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiAiCisJCSAgICAgICAiQ2Fubm90IGluaXQgZGlvIGNvbnRleHRcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNTA0LDggKzUxMCw4IEBACiAJcmVzdWx0ID0gaW5pdF9jbnRfY29udGV4dChkZXYpOwogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGNudCBjb250ZXh0XG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6ICIKKwkJICAgICAgICJDYW5ub3QgaW5pdCBjbnQgY29udGV4dFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC01MTMsOCArNTE5LDggQEAKIAlyZXN1bHQgPSB4aWxpbnhfZG93bmxvYWQoZGV2KTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW4ndCBkb3dubG9hZCBmaXJtd2FyZVxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiAiCisJCSAgICAgICAiQ2FuJ3QgZG93bmxvYWQgZmlybXdhcmVcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNTM1LDI0ICs1NDEsMjQgQEAKIAogCUNBTExfUERFQlVHKCJJbiBnZXRfcmVnaXN0ZXJzKClcbiIpOwogCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGx4IHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbHggcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCWluZm8tPnBseF9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgMSk7CiAJaWYgKGluZm8tPnBseF9yZWdiYXNlID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDEgaXMgbm90IGF2YWlsYWJsZVxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogIgorCQkgICAgICAgIlBDSSBiYXNlIGFkZHJlc3MgMSBpcyBub3QgYXZhaWxhYmxlXG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWluZm8tPnBseF9yZWdiYXNlX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZfcCwgMSk7CiAKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZTQwMDAgcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lNDAwMCByZWdiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCAyKTsKIAlpZiAoaW5mby0+bWU0MDAwX3JlZ2Jhc2UgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgMiBpcyBub3QgYXZhaWxhYmxlXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiAiCisJCSAgICAgICAiUENJIGJhc2UgYWRkcmVzcyAyIGlzIG5vdCBhdmFpbGFibGVcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaW5mby0+bWU0MDAwX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAyKTsKQEAgLTU2MiwxOSArNTY4LDE5IEBACiAJaW5mby0+dGltZXJfcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2X3AsIDMpOwogCWlmIChpbmZvLT50aW1lcl9yZWdiYXNlID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDMgaXMgbm90IGF2YWlsYWJsZVxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogIgorCQkgICAgICAgIlBDSSBiYXNlIGFkZHJlc3MgMyBpcyBub3QgYXZhaWxhYmxlXG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWluZm8tPnRpbWVyX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAzKTsKIAotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb2dyYW0gcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb2dyYW0gcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCWluZm8tPnByb2dyYW1fcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2X3AsIDUpOwogCWlmIChpbmZvLT5wcm9ncmFtX3JlZ2Jhc2UgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgNSBpcyBub3QgYXZhaWxhYmxlXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiAiCisJCSAgICAgICAiUENJIGJhc2UgYWRkcmVzcyA1IGlzIG5vdCBhdmFpbGFibGVcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaW5mby0+cHJvZ3JhbV9yZWdiYXNlX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZfcCwgNSk7CkBAIC04MDAsOCArODA2LDggQEAKIAl1ZGVsYXkoMjApOwogCWlmICghKGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpICYgMHgyMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IENhbid0IGluaXQgWGlsaW54XG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6ICIKKwkJICAgICAgICJDYW4ndCBpbml0IFhpbGlueFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtODEwLDggKzgxNiw4IEBACiAJdmFsdWUgJj0gfjB4MTAwOwogCW91dGwodmFsdWUsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CiAJaWYgKEZJUk1XQVJFX05PVF9BVkFJTEFCTEUpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwKLQkJCSAgICAgInhpbGlueCBmaXJtd2FyZSB1bmF2YWlsYWJsZSBkdWUgdG8gbGljZW5zaW5nLCBhYm9ydGluZyIpOworCQljb21lZGlfZXJyb3IoZGV2LCAieGlsaW54IGZpcm13YXJlIHVuYXZhaWxhYmxlICIKKwkJCSAgICAgImR1ZSB0byBsaWNlbnNpbmcsIGFib3J0aW5nIik7CiAJCXJldHVybiAtRUlPOwogCX0gZWxzZSB7CiAJCS8qIERvd25sb2FkIFhpbGlueCBmaXJtd2FyZSAqLwpAQCAtODI2LDcgKzgzMiw4IEBACiAJCQkvKiBDaGVjayBpZiBCVVNZIGZsYWcgaXMgbG93ICovCiAJCQlpZiAoaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUikgJiAweDIwKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogWGlsaW54IGlzIHN0aWxsIGJ1c3kgKGlkeCA9ICVkKVxuIiwKKwkJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiAiCisJCQkJICAgICAgICJYaWxpbnggaXMgc3RpbGwgYnVzeSAoaWR4ID0gJWQpXG4iLAogCQkJCSAgICAgICBkZXYtPm1pbm9yLCBpZHgpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQpAQCAtODM3LDExICs4NDQsMTEgQEAKIAlpZiAoaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUikgJiAweDQpIHsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogRE9ORSBmbGFnIGlzIG5vdCBzZXRcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogIgorCQkgICAgICAgIkRPTkUgZmxhZyBpcyBub3Qgc2V0XG4iLCBkZXYtPm1pbm9yKTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERvd25sb2FkIG5vdCBzdWNjZXNzZnVsXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6ICIKKwkJICAgICAgICJEb3dubG9hZCBub3Qgc3VjY2Vzc2Z1bFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtOTAyLDcgKzkwOSwxMCBAQAogCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRSwKIAkJICAgIGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9SRUcpOwogCi0JLyogU2V0IGRpZ2l0YWwgSS9PIGRpcmVjdGlvbiBmb3IgcG9ydCAwIHRvIG91dHB1dCBvbiBpc29sYXRlZCB2ZXJzaW9ucyAqLworCS8qCisJICogU2V0IGRpZ2l0YWwgSS9PIGRpcmVjdGlvbiBmb3IgcG9ydCAwCisJICogdG8gb3V0cHV0IG9uIGlzb2xhdGVkIHZlcnNpb25zCisJICovCiAJaWYgKCEobWU0MDAwX2lubChkZXYsIGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19ESVJfUkVHKSAmIDB4MSkpIHsKIAkJbWU0MDAwX291dGwoZGV2LCAweDEsCiAJCQkgICAgaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0NUUkxfUkVHKTsKQEAgLTk1MCw4ICs5NjAsOCBAQAogCQlyZXR1cm4gMDsKIAl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6ICIKKwkJICAgICAgICJJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwgZGV2LT5taW5vciwgaW5zbi0+bik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTcwLDggKzk4MCw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogSW52YWxpZCByYW5nZSBzcGVjaWZpZWRcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6ICIKKwkJICAgICAgICJJbnZhbGlkIHJhbmdlIHNwZWNpZmllZFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTgwLDggKzk5MCw4IEBACiAJY2FzZSBBUkVGX0NPTU1PTjoKIAkJaWYgKGNoYW4gPj0gdGhpc2JvYXJkLT5haS5jb3VudCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogQW5hbG9nIGlucHV0IGlzIG5vdCBhdmFpbGFibGVcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogIgorCQkJICAgICAgICJBbmFsb2cgaW5wdXQgaXMgbm90IGF2YWlsYWJsZVxuIiwgZGV2LT5taW5vcik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfCBjaGFuOwpAQCAtOTkwLDIzICsxMDAwLDI0IEBACiAJY2FzZSBBUkVGX0RJRkY6CiAJCWlmIChyYW5nID09IDAgfHwgcmFuZyA9PSAxKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBSYW5nZSBtdXN0IGJlIGJpcG9sYXIgd2hlbiBhcmVmID0gZGlmZlxuIiwKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiAiCisJCQkgICAgICAgIlJhbmdlIG11c3QgYmUgYmlwb2xhciB3aGVuIGFyZWYgPSBkaWZmXG4iLAogCQkJICAgICAgIGRldi0+bWlub3IpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlpZiAoY2hhbiA+PSB0aGlzYm9hcmQtPmFpLmRpZmZfY291bnQpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEFuYWxvZyBpbnB1dCBpcyBub3QgYXZhaWxhYmxlXG4iLAotCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6ICIKKwkJCSAgICAgICAiQW5hbG9nIGlucHV0IGlzIG5vdCBhdmFpbGFibGVcbiIsIGRldi0+bWlub3IpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMIHwgY2hhbjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBJbnZhbGlkIGFyZWYgc3BlY2lmaWVkXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiAiCisJCSAgICAgICAiSW52YWxpZCBhcmVmIHNwZWNpZmllZFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTA0NSw4ICsxMDU2LDggQEAKIAkgICAgKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LnN0YXR1c19yZWcpICYKIAkgICAgIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogVmFsdWUgbm90IGF2YWlsYWJsZSBhZnRlciB3YWl0XG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiAiCisJCSAgICAgICAiVmFsdWUgbm90IGF2YWlsYWJsZSBhZnRlciB3YWl0XG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xMDg2LDI0ICsxMDk3LDI0IEBACiAJLyogQ2hlY2sgd2hldGhlciBhIGNoYW5uZWwgbGlzdCBpcyBhdmFpbGFibGUgKi8KIAlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE5vIGNoYW5uZWwgbGlzdCBhdmFpbGFibGVcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiAiCisJCSAgICAgICAiTm8gY2hhbm5lbCBsaXN0IGF2YWlsYWJsZVxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIENoZWNrIHRoZSBjaGFubmVsIGxpc3Qgc2l6ZSAqLwogCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IE1FNDAwMF9BSV9DSEFOTkVMX0xJU1RfQ09VTlQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQ2hhbm5lbCBsaXN0IGlzIHRvIGxhcmdlXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogIgorCQkgICAgICAgIkNoYW5uZWwgbGlzdCBpcyB0byBsYXJnZVxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIENoZWNrIHRoZSBwb2ludGVyICovCiAJaWYgKCFjbWQtPmNoYW5saXN0KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE5VTEwgcG9pbnRlciB0byBjaGFubmVsIGxpc3RcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiAiCisJCSAgICAgICAiTlVMTCBwb2ludGVyIHRvIGNoYW5uZWwgbGlzdFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMTExMiw3ICsxMTIzLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgewogCQlpZiAoQ1JfQVJFRihjbWQtPmNoYW5saXN0W2ldKSAhPSBhcmVmKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogTW9kZSBpcyBub3QgZXF1YWwgZm9yIGFsbCBlbnRyaWVzXG4iLAorCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiAiCisJCQkgICAgICAgIk1vZGUgaXMgbm90IGVxdWFsIGZvciBhbGwgZW50cmllc1xuIiwKIAkJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xMTI0LDggKzExMzYsOCBAQAogCQkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgPj0KIAkJCSAgICB0aGlzYm9hcmQtPmFpLmRpZmZfY291bnQpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IENoYW5uZWwgbnVtYmVyIHRvIGhpZ2hcbiIsCi0JCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKToiCisJCQkJICAgICAgICIgQ2hhbm5lbCBudW1iZXIgdG8gaGlnaFxuIiwgZGV2LT5taW5vcik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KQEAgLTExMzMsOCArMTE0NSw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CiAJCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSA+PSB0aGlzYm9hcmQtPmFpLmNvdW50KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBDaGFubmVsIG51bWJlciB0byBoaWdoXG4iLAotCQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6ICIKKwkJCQkgICAgICAgIkNoYW5uZWwgbnVtYmVyIHRvIGhpZ2hcbiIsIGRldi0+bWlub3IpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC0xMTQ2LDcgKzExNTgsOSBAQAogCQkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pICE9IDEgJiYKIAkJCSAgICBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKSAhPSAyKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBCaXBvbGFyIGlzIG5vdCBzZWxlY3RlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZVxuIiwKKwkJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6ICIKKwkJCQkgICAgICAgIkJpcG9sYXIgaXMgbm90IHNlbGVjdGVkIGluICIKKwkJCQkgICAgICAgImRpZmZlcmVudGlhbCBtb2RlXG4iLAogCQkJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTEzMzAsMjEgKzEzNDQsMTkgQEAKIAogCQllbnRyeSA9IGNoYW47CiAKLQkJaWYgKHJhbmcgPT0gMCkgeworCQlpZiAocmFuZyA9PSAwKQogCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OwotCQl9IGVsc2UgaWYgKHJhbmcgPT0gMSkgeworCQllbHNlIGlmIChyYW5nID09IDEpCiAJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKLQkJfSBlbHNlIGlmIChyYW5nID09IDIpIHsKKwkJZWxzZSBpZiAocmFuZyA9PSAyKQogCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzU7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTA7Ci0JCX0KIAotCQlpZiAoYXJlZiA9PSBTREZfRElGRikgeworCQlpZiAoYXJlZiA9PSBTREZfRElGRikKIAkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEOwotCQl9CiAKIAkJbWU0MDAwX291dGwoZGV2LCBlbnRyeSwgaW5mby0+YWlfY29udGV4dC5jaGFubmVsX2xpc3RfcmVnKTsKIAl9CkBAIC0xNDU0LDggKzE0NjYsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBzb3VyY2VcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkgICAgICAgIkludmFsaWQgc3RhcnQgc291cmNlXG4iLCBkZXYtPm1pbm9yKTsKIAkJY21kLT5zdGFydF9zcmMgPSBUUklHX05PVzsKIAkJZXJyKys7CiAJfQpAQCAtMTQ3MCw4ICsxNDgyLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBiZWdpbiBzb3VyY2VcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkgICAgICAgIkludmFsaWQgc2NhbiBiZWdpbiBzb3VyY2VcbiIsIGRldi0+bWlub3IpOwogCQljbWQtPnNjYW5fYmVnaW5fc3JjID0gVFJJR19GT0xMT1c7CiAJCWVycisrOwogCX0KQEAgLTE0ODUsOCArMTQ5Nyw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgc291cmNlXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJICAgICAgICJJbnZhbGlkIGNvbnZlcnQgc291cmNlXG4iLCBkZXYtPm1pbm9yKTsKIAkJY21kLT5jb252ZXJ0X3NyYyA9IFRSSUdfVElNRVI7CiAJCWVycisrOwogCX0KQEAgLTE1MDAsOCArMTUxMiw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIHNvdXJjZVxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCSAgICAgICAiSW52YWxpZCBzY2FuIGVuZCBzb3VyY2VcbiIsIGRldi0+bWlub3IpOwogCQljbWQtPnNjYW5fZW5kX3NyYyA9IFRSSUdfTk9ORTsKIAkJZXJyKys7CiAJfQpAQCAtMTUxNSw4ICsxNTI3LDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RvcCBzb3VyY2VcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkgICAgICAgIkludmFsaWQgc3RvcCBzb3VyY2VcbiIsIGRldi0+bWlub3IpOwogCQljbWQtPnN0b3Bfc3JjID0gVFJJR19OT05FOwogCQllcnIrKzsKIAl9CkBAIC0xNTQ2LDggKzE1NTgsOCBAQAogCQkgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgdHJpZ2dlciBjb21iaW5hdGlvblxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCSAgICAgICAiSW52YWxpZCBzdGFydCB0cmlnZ2VyIGNvbWJpbmF0aW9uXG4iLCBkZXYtPm1pbm9yKTsKIAkJY21kLT5zdGFydF9zcmMgPSBUUklHX05PVzsKIAkJY21kLT5zY2FuX2JlZ2luX3NyYyA9IFRSSUdfRk9MTE9XOwogCQljbWQtPmNvbnZlcnRfc3JjID0gVFJJR19USU1FUjsKQEAgLTE1NjMsOCArMTU3NSw4IEBACiAJCSAgIGNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfQ09VTlQpIHsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdG9wIHRyaWdnZXIgY29tYmluYXRpb25cbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkgICAgICAgIkludmFsaWQgc3RvcCB0cmlnZ2VyIGNvbWJpbmF0aW9uXG4iLCBkZXYtPm1pbm9yKTsKIAkJY21kLT5zdG9wX3NyYyA9IFRSSUdfTk9ORTsKIAkJY21kLT5zY2FuX2VuZF9zcmMgPSBUUklHX05PTkU7CiAJCWVycisrOwpAQCAtMTU3NywyOSArMTU4OSwyOSBAQAogCSAqLwogCWlmIChjbWQtPmNoYW5saXN0X2xlbiA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IE5vIGNoYW5uZWwgbGlzdFxuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCSAgICAgICAiTm8gY2hhbm5lbCBsaXN0XG4iLCBkZXYtPm1pbm9yKTsKIAkJY21kLT5jaGFubGlzdF9sZW4gPSAxOwogCQllcnIrKzsKIAl9CiAJaWYgKGluaXRfdGlja3MgPCA2NikgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogU3RhcnQgYXJnIHRvIGxvd1xuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCSAgICAgICAiU3RhcnQgYXJnIHRvIGxvd1xuIiwgZGV2LT5taW5vcik7CiAJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsKIAkJZXJyKys7CiAJfQogCWlmIChzY2FuX3RpY2tzICYmIHNjYW5fdGlja3MgPCA2NykgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogU2NhbiBiZWdpbiBhcmcgdG8gbG93XG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJICAgICAgICJTY2FuIGJlZ2luIGFyZyB0byBsb3dcbiIsIGRldi0+bWlub3IpOwogCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMjAzMTsKIAkJZXJyKys7CiAJfQogCWlmIChjaGFuX3RpY2tzIDwgNjYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IENvbnZlcnQgYXJnIHRvIGxvd1xuIiwKLQkJICAgICAgIGRldi0+bWlub3IpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCSAgICAgICAiQ29udmVydCBhcmcgdG8gbG93XG4iLCBkZXYtPm1pbm9yKTsKIAkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CiAJCWVycisrOwogCX0KQEAgLTE2MTcsMjMgKzE2MjksMjUgQEAKIAkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCiAJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJCSAgICAgICAiSW52YWxpZCBzdGFydCBhcmdcbiIsIGRldi0+bWlub3IpOwogCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvKiAgNjYgdGlja3MgYXQgbGVhc3QgKi8KIAkJCWVycisrOwogCQl9CiAJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAotCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkJICAgICAgICJJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLCBkZXYtPm1pbm9yKTsKIAkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvKiAgNjYgdGlja3MgYXQgbGVhc3QgKi8KIAkJCWVycisrOwogCQl9CiAJCWlmIChzY2FuX3RpY2tzIDw9IGNtZC0+Y2hhbmxpc3RfbGVuICogY2hhbl90aWNrcykgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKLQkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMjAwMCAqIGNtZC0+Y2hhbmxpc3RfbGVuICsgMzE7CS8qICBBdCBsZWFzdCBvbmUgdGljayBtb3JlICovCisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCQkgICAgICAgIkludmFsaWQgc2NhbiBlbmQgYXJnXG4iLCBkZXYtPm1pbm9yKTsKKworCQkJLyogIEF0IGxlYXN0IG9uZSB0aWNrIG1vcmUgKi8KKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMjAwMCAqIGNtZC0+Y2hhbmxpc3RfbGVuICsgMzE7CiAJCQllcnIrKzsKIAkJfQogCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKQEAgLTE2NDMsMTUgKzE2NTcsMTUgQEAKIAkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCiAJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJCSAgICAgICAiSW52YWxpZCBzdGFydCBhcmdcbiIsIGRldi0+bWlub3IpOwogCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvKiAgNjYgdGlja3MgYXQgbGVhc3QgKi8KIAkJCWVycisrOwogCQl9CiAJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAotCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkJICAgICAgICJJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLCBkZXYtPm1pbm9yKTsKIAkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvKiAgNjYgdGlja3MgYXQgbGVhc3QgKi8KIAkJCWVycisrOwogCQl9CkBAIC0xNjYyLDIzICsxNjc2LDI1IEBACiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCQkgICAgICAgIkludmFsaWQgc3RhcnQgYXJnXG4iLCBkZXYtPm1pbm9yKTsKIAkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLyogIDY2IHRpY2tzIGF0IGxlYXN0ICovCiAJCQllcnIrKzsKIAkJfQogCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJCSAgICAgICAiSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwgZGV2LT5taW5vcik7CiAJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLyogIDY2IHRpY2tzIGF0IGxlYXN0ICovCiAJCQllcnIrKzsKIAkJfQogCQlpZiAoc2Nhbl90aWNrcyA8PSBjbWQtPmNoYW5saXN0X2xlbiAqIGNoYW5fdGlja3MpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzY2FuIGVuZCBhcmdcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7Ci0JCQljbWQtPnNjYW5fZW5kX2FyZyA9IDIwMDAgKiBjbWQtPmNoYW5saXN0X2xlbiArIDMxOwkvKiAgQXQgbGVhc3Qgb25lIHRpY2sgbW9yZSAqLworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkJICAgICAgICJJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwgZGV2LT5taW5vcik7CisKKwkJCS8qICBBdCBsZWFzdCBvbmUgdGljayBtb3JlICovCisJCQljbWQtPnNjYW5fZW5kX2FyZyA9IDIwMDAgKiBjbWQtPmNoYW5saXN0X2xlbiArIDMxOwogCQkJZXJyKys7CiAJCX0KIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCkBAIC0xNjg4LDE1ICsxNzA0LDE1IEBACiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCQkgICAgICAgIkludmFsaWQgc3RhcnQgYXJnXG4iLCBkZXYtPm1pbm9yKTsKIAkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLyogIDY2IHRpY2tzIGF0IGxlYXN0ICovCiAJCQllcnIrKzsKIAkJfQogCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJCSAgICAgICAiSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwgZGV2LT5taW5vcik7CiAJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLyogIDY2IHRpY2tzIGF0IGxlYXN0ICovCiAJCQllcnIrKzsKIAkJfQpAQCAtMTcwNywxNSArMTcyMywxNSBAQAogCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KIAkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAotCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkJICAgICAgICJJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwgZGV2LT5taW5vcik7CiAJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8qICA2NiB0aWNrcyBhdCBsZWFzdCAqLwogCQkJZXJyKys7CiAJCX0KIAkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCQkgICAgICAgIkludmFsaWQgY29udmVydCBhcmdcbiIsIGRldi0+bWlub3IpOwogCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8qICA2NiB0aWNrcyBhdCBsZWFzdCAqLwogCQkJZXJyKys7CiAJCX0KQEAgLTE3MjYsOCArMTc0Miw4IEBACiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiAiCisJCQkgICAgICAgIkludmFsaWQgc3RhcnQgYXJnXG4iLCBkZXYtPm1pbm9yKTsKIAkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLyogIDY2IHRpY2tzIGF0IGxlYXN0ICovCiAJCQllcnIrKzsKIAkJfQpAQCAtMTczNSw4ICsxNzUxLDggQEAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCWlmIChjbWQtPnN0b3BfYXJnID09IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdG9wIGFyZ1xuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6ICIKKwkJCSAgICAgICAiSW52YWxpZCBzdG9wIGFyZ1xuIiwgZGV2LT5taW5vcik7CiAJCQljbWQtPnN0b3BfYXJnID0gMTsKIAkJCWVycisrOwogCQl9CkBAIC0xNzQ0LDggKzE3NjAsOCBAQAogCWlmIChjbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCWlmIChjbWQtPnNjYW5fZW5kX2FyZyA9PSAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc2NhbiBlbmQgYXJnXG4iLAotCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogIgorCQkJICAgICAgICJJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwgZGV2LT5taW5vcik7CiAJCQljbWQtPnNjYW5fZW5kX2FyZyA9IDE7CiAJCQllcnIrKzsKIAkJfQpAQCAtMTc4Niw4ICsxODAyLDggQEAKIAkvKiBDaGVjayBpZiBpcnEgbnVtYmVyIGlzIHJpZ2h0ICovCiAJaWYgKGlycSAhPSBhaV9jb250ZXh0LT5pcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWRcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yLCBpcnEpOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogIgorCQkgICAgICAgIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZFxuIiwgZGV2LT5taW5vciwgaXJxKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtMTgwNiw3ICsxODIyLDEwIEBACiAJCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IEZpZm8gZnVsbFxuIik7CiAJCQljID0gTUU0MDAwX0FJX0ZJRk9fQ09VTlQ7CiAKLQkJCS8qIEZJRk8gb3ZlcmZsb3csIHNvIHN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQkJLyoKKwkJCSAqIEZJRk8gb3ZlcmZsb3csIHNvIHN0b3AgY29udmVyc2lvbgorCQkJICogYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMKKwkJCSAqLwogCQkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKIAkJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfAogCQkJCSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKQEAgLTE4MTUsOCArMTgzNCw4IEBACiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7CiAKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEZJRk8gb3ZlcmZsb3dcbiIsCi0JCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogIgorCQkJICAgICAgICJGSUZPIG92ZXJmbG93XG4iLCBkZXYtPm1pbm9yKTsKIAkJfSBlbHNlIGlmICgodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkKIAkJCSAgICYmICEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkKIAkJCSAgICYmICh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgewpAQCAtMTgyNywxMSArMTg0NiwxNCBAQAogCQkJYyA9IE1FNDAwMF9BSV9GSUZPX0NPVU5UIC8gMjsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IENhbid0IGRldGVybWluZSBzdGF0ZSBvZiBmaWZvXG4iLAotCQkJICAgICAgIGRldi0+bWlub3IpOworCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6ICIKKwkJCSAgICAgICAiQ2FuJ3QgZGV0ZXJtaW5lIHN0YXRlIG9mIGZpZm9cbiIsIGRldi0+bWlub3IpOwogCQkJYyA9IDA7CiAKLQkJCS8qIFVuZGVmaW5lZCBzdGF0ZSwgc28gc3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCQkvKgorCQkJICogVW5kZWZpbmVkIHN0YXRlLCBzbyBzdG9wIGNvbnZlcnNpb24KKwkJCSAqIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisJCQkgKi8KIAkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CiAJCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKIAkJCQkgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUSk7CkBAIC0xODQwLDggKzE4NjIsOCBAQAogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwogCiAJCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBVbmRlZmluZWQgRklGTyBzdGF0ZVxuIiwKLQkJCSAgICAgICBkZXYtPm1pbm9yKTsKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiAiCisJCQkgICAgICAgIlVuZGVmaW5lZCBGSUZPIHN0YXRlXG4iLCBkZXYtPm1pbm9yKTsKIAkJfQogCiAJCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogVHJ5IHRvIHJlYWQgJWQgdmFsdWVzXG4iLCBjKTsKQEAgLTE4NTIsNyArMTg3NCwxMCBAQAogCQkJbHZhbCBePSAweDgwMDA7CiAKIAkJCWlmICghY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGx2YWwpKSB7Ci0JCQkJLyogQnVmZmVyIG92ZXJmbG93LCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJCQkvKgorCQkJCSAqIEJ1ZmZlciBvdmVyZmxvdywgc28gc3RvcCBjb252ZXJzaW9uCisJCQkJICogYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMKKwkJCQkgKi8KIAkJCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOwogCQkJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfAogCQkJCQkgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUSk7CkBAIC0xODYxLDggKzE4ODYsOCBAQAogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEJ1ZmZlciBvdmVyZmxvd1xuIiwKLQkJCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6ICIKKwkJCQkgICAgICAgIkJ1ZmZlciBvdmVyZmxvd1xuIiwgZGV2LT5taW5vcik7CiAKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE4ODMsNyArMTkwOCwxMCBAQAogCiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VPQTsKIAotCQkvKiBBY3F1aXNpdGlvbiBpcyBjb21wbGV0ZSwgc28gc3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCS8qCisJCSAqIEFjcXVpc2l0aW9uIGlzIGNvbXBsZXRlLCBzbyBzdG9wCisJCSAqIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMKKwkJICovCiAJCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CiAJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CiAJCXRtcCAmPSB+KE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKQEAgLTE4OTcsOCArMTkyNSw4IEBACiAKIAkJCWlmICghY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGx2YWwpKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6IEJ1ZmZlciBvdmVyZmxvd1xuIiwKLQkJCQkgICAgICAgZGV2LT5taW5vcik7CisJCQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaXNyKCk6ICIKKwkJCQkgICAgICAgIkJ1ZmZlciBvdmVyZmxvd1xuIiwgZGV2LT5taW5vcik7CiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xOTQxLDI5ICsxOTY5LDI5IEBACiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiAiCisJCSAgICAgICAiSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsIGRldi0+bWlub3IsIGluc24tPm4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY2hhbiA+PSB0aGlzYm9hcmQtPmFvLmNvdW50KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwKLQkJICAgICAgIGRldi0+bWlub3IsIGluc24tPm4pOworCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6ICIKKwkJICAgICAgICJJbnZhbGlkIGNoYW5uZWwgJWRcbiIsIGRldi0+bWlub3IsIGluc24tPm4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAocmFuZyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9hb19pbnNuX3dyaXRlKCk6IEludmFsaWQgcmFuZ2UgJWRcbiIsCi0JCSAgICAgICBkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiAiCisJCSAgICAgICAiSW52YWxpZCByYW5nZSAlZFxuIiwgZGV2LT5taW5vciwgaW5zbi0+bik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChhcmVmICE9IEFSRUZfR1JPVU5EICYmIGFyZWYgIT0gQVJFRl9DT01NT04pIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBhcmVmICVkXG4iLAotCQkgICAgICAgZGV2LT5taW5vciwgaW5zbi0+bik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogIgorCQkgICAgICAgIkludmFsaWQgYXJlZiAlZFxuIiwgZGV2LT5taW5vciwgaW5zbi0+bik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTk5NCw4ICsyMDIyLDggQEAKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgewogCQlwcmludGsKLQkJICAgICgiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aFxuIiwKLQkJICAgICBkZXYtPm1pbm9yKTsKKwkJICAgICgiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fcmVhZCgpOiAiCisJCSAgICAgIkludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoXG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMDIxLDggKzIwNDksOCBAQAogCiAJaWYgKGluc24tPm4gIT0gMikgewogCQlwcmludGsKLQkJICAgICgiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2Rpb19pbnNuX2JpdHMoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGhcbiIsCi0JCSAgICAgZGV2LT5taW5vcik7CisJCSAgICAoImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9kaW9faW5zbl9iaXRzKCk6ICIKKwkJICAgICAiSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGhcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIwOTUsOCArMjEyMyw5IEBACiAJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzA7CiAJCX0gZWxzZSBpZiAoY2hhbiA8IDE2KSB7CiAJCQkvKgotCQkJICogQ2hlY2ggZm9yIG9wdG9pc29sYXRlZCBNRS00MDAwIHZlcnNpb24uIElmIG9uZSB0aGUgZmlyc3QKLQkJCSAqIHBvcnQgaXMgYSBmaXhlZCBvdXRwdXQgcG9ydCBhbmQgdGhlIHNlY29uZCBpcyBhIGZpeGVkIGlucHV0IHBvcnQuCisJCQkgKiBDaGVjaCBmb3Igb3B0b2lzb2xhdGVkIE1FLTQwMDAgdmVyc2lvbi4KKwkJCSAqIElmIG9uZSB0aGUgZmlyc3QgcG9ydCBpcyBhIGZpeGVkIG91dHB1dAorCQkJICogcG9ydCBhbmQgdGhlIHNlY29uZCBpcyBhIGZpeGVkIGlucHV0IHBvcnQuCiAJCQkgKi8KIAkJCWlmICghbWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcpKQogCQkJCXJldHVybiAtRU5PREVWOwpAQCAtMjEyMSw4ICsyMTUwLDkgQEAKIAl9IGVsc2UgewogCQlpZiAoY2hhbiA8IDgpIHsKIAkJCS8qCi0JCQkgKiBDaGVjaCBmb3Igb3B0b2lzb2xhdGVkIE1FLTQwMDAgdmVyc2lvbi4gSWYgb25lIHRoZSBmaXJzdAotCQkJICogcG9ydCBpcyBhIGZpeGVkIG91dHB1dCBwb3J0IGFuZCB0aGUgc2Vjb25kIGlzIGEgZml4ZWQgaW5wdXQgcG9ydC4KKwkJCSAqIENoZWNoIGZvciBvcHRvaXNvbGF0ZWQgTUUtNDAwMCB2ZXJzaW9uLgorCQkJICogSWYgb25lIHRoZSBmaXJzdCBwb3J0IGlzIGEgZml4ZWQgb3V0cHV0CisJCQkgKiBwb3J0IGFuZCB0aGUgc2Vjb25kIGlzIGEgZml4ZWQgaW5wdXQgcG9ydC4KIAkJCSAqLwogCQkJaWYgKCFtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQuZGlyX3JlZykpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yMjU3LDcgKzIyODcsOCBAQAogCWNhc2UgR1BDVF9SRVNFVDoKIAkJaWYgKGluc24tPm4gIT0gMSkgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGglZFxuIiwKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiAiCisJCQkgICAgICAgIkludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoJWRcbiIsCiAJCQkgICAgICAgZGV2LT5taW5vciwgaW5zbi0+bik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjI2OSw3ICsyMzAwLDggQEAKIAljYXNlIEdQQ1RfU0VUX09QRVJBVElPTjoKIAkJaWYgKGluc24tPm4gIT0gMikgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGglZFxuIiwKKwkJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiAiCisJCQkgICAgICAgIkludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoJWRcbiIsCiAJCQkgICAgICAgZGV2LT5taW5vciwgaW5zbi0+bik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjI4MCw4ICsyMzEyLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiBJbnZhbGlkIGluc3RydWN0aW9uXG4iLAotCQkgICAgICAgZGV2LT5taW5vcik7CisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpOiAiCisJCSAgICAgICAiSW52YWxpZCBpbnN0cnVjdGlvblxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjMwMiw3ICsyMzM0LDggQEAKIAogCWlmIChpbnNuLT5uID4gMSkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fcmVhZCgpOiAiCisJCSAgICAgICAiSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCiAJCSAgICAgICBkZXYtPm1pbm9yLCBpbnNuLT5uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjMyOCw3ICsyMzYxLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3JlYWQoKTogSW52YWxpZCBjaGFubmVsICVkXG4iLAorCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9yZWFkKCk6ICIKKwkJICAgICAgICJJbnZhbGlkIGNoYW5uZWwgJWRcbiIsCiAJCSAgICAgICBkZXYtPm1pbm9yLCBpbnNuLT5jaGFuc3BlYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIzNDksNyArMjM4Myw4IEBACiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3dyaXRlKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoICVkXG4iLAorCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl93cml0ZSgpOiAiCisJCSAgICAgICAiSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCiAJCSAgICAgICBkZXYtPm1pbm9yLCBpbnNuLT5uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjM3NSw3ICsyNDEwLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3dyaXRlKCk6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwKKwkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fd3JpdGUoKTogIgorCQkgICAgICAgIkludmFsaWQgY2hhbm5lbCAlZFxuIiwKIAkJICAgICAgIGRldi0+bWlub3IsIGluc24tPmNoYW5zcGVjKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjM4Myw0ICsyNDE5LDQ0IEBACiAJcmV0dXJuIDE7CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX21lNDAwMCwgbWU0MDAwX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfbWU0MDAwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfbWU0MDAwLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9tZTQwMDBfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX21lNDAwMF9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IG1lNDAwMF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9tZTQwMDBfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX21lNDAwMF9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX21lNDAwMF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfbWU0MDAwKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9tZTQwMDBfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfbWU0MDAwLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfbWU0MDAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX21lNDAwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX21lNDAwMF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9tZTQwMDApOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfbWU0MDAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9tZTQwMDBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKaW5kZXggYzg0ODRhZS4uY2RhNGIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpAQCAtMjU3LDcgKzI1Nyw0MyBAQAogCS5kZXRhY2ggPSBtZV9kZXRhY2gsCiB9OwogCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKG1lX2RyaXZlciwgbWVfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1lX2RyaXZlcl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBtZV9kcml2ZXIuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbWVfZHJpdmVyX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG1lX2RyaXZlcl9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IG1lX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmbWVfZHJpdmVyX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJm1lX2RyaXZlcl9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgbWVfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJm1lX2RyaXZlcik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwltZV9kcml2ZXJfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKiltZV9kcml2ZXIuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1lX2RyaXZlcl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lX2RyaXZlcl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWVfZHJpdmVyX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmbWVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWVfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG1lX2RyaXZlcl9jbGVhbnVwX21vZHVsZSk7CiAKIC8qIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBtZV9wcml2YXRlX2RhdGEgewpAQCAtNjQ0LDcgKzY4MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbWVfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSA9IE5VTEw7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZTsKIAlzdHJ1Y3QgbWVfYm9hcmQgKmJvYXJkOwogCXJlc291cmNlX3NpemVfdCBwbHhfcmVnYmFzZV90bXA7CkBAIC02NjEsOSArNjk3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBQcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IGRldmljZSBpbiB0aGUgc2VyaWVzIGl0IGlzLiAqLwotCWZvciAocGNpX2RldmljZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpOwotCSAgICAgcGNpX2RldmljZSAhPSBOVUxMOwotCSAgICAgcGNpX2RldmljZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXZpY2UpKSB7CisJZm9yX2VhY2hfcGNpX2RldihwY2lfZGV2aWNlKSB7CiAJCWlmIChwY2lfZGV2aWNlLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9NRUlMSEFVUykgewogCQkJZm9yIChpID0gMDsgaSA8IG1lX2JvYXJkX25icjsgaSsrKSB7CiAJCQkJaWYgKG1lX2JvYXJkc1tpXS5kZXZpY2VfaWQgPT0KQEAgLTg1NywzICs4OTEsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKaW5kZXggOTlkOTk4NS4uY2QyNWIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCkBAIC03MCwxMiArNzAsMTAgQEAKIAogdm9pZCBtaXRlX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwogCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZTsKIAotCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7Ci0JICAgICBwY2lkZXYgIT0gTlVMTDsKLQkgICAgIHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaWRldikpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KHBjaWRldikgewogCQlpZiAocGNpZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OSSkgewogCQkJdW5zaWduZWQgaTsKIApAQCAtODI5LDMgKzgyNyw3IEBACiAJbWl0ZV9jbGVhbnVwKCk7CiB9CiAjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jCmluZGV4IDk4NzRhYzMuLmE4OWVlYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMKQEAgLTQwNiw0ICs0MDYsMTkgQEAKIAlyZXR1cm4gbjsKIH0KIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9tcGM2MjQpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX21wYzYyNF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfbXBjNjI0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9tcGM2MjRfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9tcGM2MjQpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfbXBjNjI0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9tcGM2MjRfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjODI2MGNwbS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzgyNjBjcG0uYwppbmRleCA0NDBhMTQ0Li41ZjY4MTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjODI2MGNwbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM4MjYwY3BtLmMKQEAgLTU2LDcgKzU2LDE4IEBACiAJLmRldGFjaCA9IG1wYzgyNjBjcG1fZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9tcGM4MjYwY3BtKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9tcGM4MjYwY3BtX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9tcGM4MjYwY3BtKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9tcGM4MjYwY3BtX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfbXBjODI2MGNwbSk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9tcGM4MjYwY3BtX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9tcGM4MjYwY3BtX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBtcGM4MjYwY3BtX2Rpb19jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYwppbmRleCA2YjIyZjBmLi5kYWNlOTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKQEAgLTkzLDcgKzkzLDE4IEBACiAJLmRldGFjaCA9IG11bHRpcTNfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9tdWx0aXEzKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9tdWx0aXEzX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9tdWx0aXEzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9tdWx0aXEzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfbXVsdGlxMyk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9tdWx0aXEzX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9tdWx0aXEzX2NsZWFudXBfbW9kdWxlKTsKIAogc3RydWN0IG11bHRpcTNfcHJpdmF0ZSB7CiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzJdOwpAQCAtMzM4LDMgKzM0OSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMKaW5kZXggMWZjNzZjYy4uMTRlNzE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jCkBAIC00OTAsNCArNDkwLDQwIEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX25pNjUyNywgbmk2NTI3X3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfbmk2NTI3X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfbmk2NTI3LmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9uaTY1MjdfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX25pNjUyN19wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IG5pNjUyN19wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9uaTY1MjdfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX25pNjUyN19wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX25pNjUyN19pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfbmk2NTI3KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9uaTY1MjdfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfbmk2NTI3LmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfbmk2NTI3X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX25pNjUyN19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX25pNjUyN19wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9uaTY1MjcpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfbmk2NTI3X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9uaTY1MjdfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1eHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NXh4LmMKaW5kZXggZDc5M2Y1YS4uOGI4ZTJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjV4eC5jCkBAIC04MzQsNCArODM0LDQwIEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX25pXzY1eHgsIG5pXzY1eHhfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9uaV82NXh4X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX25pXzY1eHguZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX25pXzY1eHhfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX25pXzY1eHhfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBuaV82NXh4X3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX25pXzY1eHhfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX25pXzY1eHhfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9uaV82NXh4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9uaV82NXh4KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9uaV82NXh4X3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopZHJpdmVyX25pXzY1eHguZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9uaV82NXh4X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX25pXzY1eHhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9uaV82NXh4X3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX25pXzY1eHgpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfbmlfNjV4eF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfbmlfNjV4eF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYwppbmRleCA2YTZmYWU1Li42NjEyYjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMKQEAgLTM4Miw3ICszODIsNyBAQAogCUdsb2JhbF9JbnRfRW5hYmxlX0JpdCA9IDB4ODAwMDAwMDAKIH07CiAKLS8qIE9mZnNldCBvZiB0aGUgR1BDVCBjaGlwcyBmcm9tIHRoZSBiYXNlLWFkcmVzcyBvZiB0aGUgY2FyZCAqLworLyogT2Zmc2V0IG9mIHRoZSBHUENUIGNoaXBzIGZyb20gdGhlIGJhc2UtYWRkcmVzcyBvZiB0aGUgY2FyZCAqLwogLyogRmlyc3QgY2hpcCBpcyBhdCBiYXNlLWFkZHJlc3MgKyAweDAwLCBldGMuICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgR1BDVF9PRkZTRVRbMl0gPSB7IDB4MCwgMHg4MDAgfTsKIApAQCAtNDcxLDcgKzQ3MSw0MyBAQAogCS5kZXRhY2ggPSBuaV82NjB4X2RldGFjaCwKIH07CiAKLUNPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX25pXzY2MHgsIG5pXzY2MHhfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9uaV82NjB4X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgZHJpdmVyX25pXzY2MHguZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX25pXzY2MHhfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyX25pXzY2MHhfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBuaV82NjB4X3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX25pXzY2MHhfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmZHJpdmVyX25pXzY2MHhfcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9uaV82NjB4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9uaV82NjB4KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRyaXZlcl9uaV82NjB4X3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopZHJpdmVyX25pXzY2MHguZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9uaV82NjB4X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX25pXzY2MHhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9uaV82NjB4X3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX25pXzY2MHgpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfbmlfNjYweF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfbmlfNjYweF9jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyBpbnQgbmlfNjYweF9maW5kX2RldmljZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgYnVzLCBpbnQgc2xvdCk7CiBzdGF0aWMgaW50IG5pXzY2MHhfc2V0X3BmaV9yb3V0aW5nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYwppbmRleCA0NGFlODM2Li5lOWYwMzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKQEAgLTEyMCw3ICsxMjAsNDMgQEAKIAkuZGV0YWNoID0gbmlfNjcweF9kZXRhY2gsCiB9OwogCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9uaV82NzB4LCBuaV82NzB4X3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfbmlfNjcweF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9uaV82NzB4LmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9uaV82NzB4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9uaV82NzB4X3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gbmlfNjcweF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9uaV82NzB4X3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9uaV82NzB4X3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfbmlfNjcweF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfbmlfNjcweCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfbmlfNjcweF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9uaV82NzB4LmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfbmlfNjcweF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9uaV82NzB4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfbmlfNjcweF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9uaV82NzB4KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX25pXzY3MHhfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX25pXzY3MHhfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfMF8yMG1BID0geyAxLCB7UkFOR0VfbUEoMCwgMjApfSB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYTIxNTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCmluZGV4IDliZmYzNGMuLmU0NmQ2MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCkBAIC0xOTcsNyArMTk3LDE4IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfYTIxNTApOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2EyMTUwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9hMjE1MCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYTIxNTBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9hMjE1MCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9hMjE1MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYTIxNTBfY2xlYW51cF9tb2R1bGUpOwogCiAjaWZkZWYgQTIxNTBfREVCVUcKIApAQCAtOTEwLDMgKzkyMSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYwppbmRleCBjZTYwMjI0Li4xMzhkY2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYwpAQCAtMTk0LDcgKzE5NCwxOCBAQAogCS5udW1fbmFtZXMgPSBBUlJBWV9TSVpFKGF0YW9fYm9hcmRzKSwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfYXRhbyk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYXRhb19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfYXRhbyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfYXRhb19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2F0YW8pOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfYXRhb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfYXRhb19jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyB2b2lkIGF0YW9fcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiAKQEAgLTQ1OSwzICs0NzAsNyBAQAogCiAJcmV0dXJuIGluc24tPm47CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKaW5kZXggMDAzZDAwYi4uMzMzMGIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKQEAgLTM0OSw3ICszNDksMTggQEAKIAkuZGV0YWNoID0gbmlfYXRtaW9fZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9hdG1pbyk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYXRtaW9faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2F0bWlvKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hdG1pb19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2F0bWlvKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2F0bWlvX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9hdG1pb19jbGVhbnVwX21vZHVsZSk7CiAKICNpbmNsdWRlICJuaV9taW9fY29tbW9uLmMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKaW5kZXggY2Y0ZjI0MS4uMjg1YjkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKQEAgLTE1MSw3ICsxNTEsMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhdG1pbzE2X2JvYXJkX3QpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9hdG1pbzE2ZCk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfYXRtaW8xNmRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2F0bWlvMTZkKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9hdG1pbzE2ZF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2F0bWlvMTZkKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2F0bWlvMTZkX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9hdG1pbzE2ZF9jbGVhbnVwX21vZHVsZSk7CiAKIC8qIHJhbmdlIHN0cnVjdHMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9hdG1pbzE2ZF9haV8xMF9iaXBvbGFyID0geyA0LCB7CkBAIC04ODcsMyArODk4LDcgQEAKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYwppbmRleCA2ZWM3N2JmLi5jYzE1NjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfNzAwLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTM3Nyw3ICszNzYsNyBAQAogCQlsaW5rID0gcGNtY2lhX2N1cl9kZXY7CS8qIFhYWCBoYWNrICovCiAJCWlmICghbGluaykKIAkJCXJldHVybiAtRUlPOwotCQlpb2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJCWlvYmFzZSA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKICNpZmRlZiBpbmNvbXBsZXRlCiAJCWlycSA9IGxpbmstPmlycTsKICNlbmRpZgpAQCAtNDU5LDE0ICs0NTgsNiBAQAogICAgbGVzcyBvbiBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgogKi8KIAotLyoKLSAgIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKLSAgIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCi0gICBkYXRhYmFzZS4KLSovCi0KLXN0YXRpYyBjb25zdCBkZXZfaW5mb190IGRldl9pbmZvID0gIm5pX2RhcV83MDAiOwotCiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluazsKIAlpbnQgc3RvcDsKQEAgLTUzNyw4ICs1MjgsNyBAQAogCWRpbzcwMF9yZWxlYXNlKGxpbmspOwogCiAJLyogVGhpcyBwb2ludHMgdG8gdGhlIHBhcmVudCBzdHJ1Y3QgbG9jYWxfaW5mb190IHN0cnVjdCAqLwotCWlmIChsaW5rLT5wcml2KQotCQlrZnJlZShsaW5rLT5wcml2KTsKKwlrZnJlZShsaW5rLT5wcml2KTsKIAogfQkJCQkvKiBkaW83MDBfY3NfZGV0YWNoICovCiAKQEAgLTU1Niw5ICs1NDYsNiBAQAogCQkJCXVuc2lnbmVkIGludCB2Y2MsCiAJCQkJdm9pZCAqcHJpdl9kYXRhKQogewotCXdpbl9yZXFfdCAqcmVxID0gcHJpdl9kYXRhOwotCW1lbXJlcV90IG1hcDsKLQogCWlmIChjZmctPmluZGV4ID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC01NzIsNDQgKzU1OSwyNSBAQAogCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwogCiAJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSAwOwogCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgewogCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOwotCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCXBfZGV2LT5pb19saW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzICY9IH5JT19EQVRBX1BBVEhfV0lEVEg7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0KKwkJCXBjbWNpYV9pb19jZmdfZGF0YV93aWR0aChpby0+ZmxhZ3MpOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOwogCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7Ci0JCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5mbGFncyA9IHBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3M7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPnN0YXJ0ID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5lbmQgPSBpby0+d2luWzFdLmxlbjsKIAkJfQogCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pICE9IDApCisJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldikgIT0gMCkKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0LT5tZW0ubndpbiA+IDApKSB7Ci0JCWNpc3RwbF9tZW1fdCAqbWVtID0KLQkJCShjZmctPm1lbS5ud2luKSA/ICZjZmctPm1lbSA6ICZkZmx0LT5tZW07Ci0JCXJlcS0+QXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2IHwgV0lOX01FTU9SWV9UWVBFX0NNOwotCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0VOQUJMRTsKLQkJcmVxLT5CYXNlID0gbWVtLT53aW5bMF0uaG9zdF9hZGRyOwotCQlyZXEtPlNpemUgPSBtZW0tPndpblswXS5sZW47Ci0JCWlmIChyZXEtPlNpemUgPCAweDEwMDApCi0JCQlyZXEtPlNpemUgPSAweDEwMDA7Ci0JCXJlcS0+QWNjZXNzU3BlZWQgPSAwOwotCQlpZiAocGNtY2lhX3JlcXVlc3Rfd2luZG93KHBfZGV2LCByZXEsICZwX2Rldi0+d2luKSkKLQkJCXJldHVybiAtRU5PREVWOwotCQltYXAuUGFnZSA9IDA7Ci0JCW1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOwotCQlpZiAocGNtY2lhX21hcF9tZW1fcGFnZShwX2RldiwgcF9kZXYtPndpbiwgJm1hcCkpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLwogCXJldHVybiAwOwogfQpAQCAtNjIzLDcgKzU5MSw3IEBACiAKIAlkZXZfZGJnKCZsaW5rLT5kZXYsICJkaW83MDBfY29uZmlnXG4iKTsKIAotCXJldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBkaW83MDBfcGNtY2lhX2NvbmZpZ19sb29wLCAmcmVxKTsKKwlyZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgZGlvNzAwX3BjbWNpYV9jb25maWdfbG9vcCwgTlVMTCk7CiAJaWYgKHJldCkgewogCQlkZXZfd2FybigmbGluay0+ZGV2LCAibm8gY29uZmlndXJhdGlvbiBmb3VuZFxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjQ1LDE1ICs2MTMsMTAgQEAKIAlkZXZfaW5mbygmbGluay0+ZGV2LCAiaW5kZXggMHglMDJ4IiwgbGluay0+Y29uZi5Db25maWdJbmRleCk7CiAJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKIAkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKLQkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCi0JCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEgKyBsaW5rLT5pby5OdW1Qb3J0czEgLSAxKTsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMyKQotCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCi0JCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIgKyBsaW5rLT5pby5OdW1Qb3J0czIgLSAxKTsKLQlpZiAobGluay0+d2luKQotCQlwcmludGsoIiwgbWVtIDB4JTA2bHgtMHglMDZseCIsIHJlcS5CYXNlLAotCQkgICAgICAgcmVxLkJhc2UgKyByZXEuU2l6ZSAtIDEpOworCWlmIChsaW5rLT5yZXNvdXJjZVswXSkKKwkJcHJpbnRrKCIsIGlvICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMV0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMV0pOwogCXByaW50aygiXG4iKTsKIAogCXJldHVybjsKQEAgLTcyMyw3ICs2ODYsNyBAQAogCS5pZF90YWJsZSA9IGRpbzcwMF9jc19pZHMsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRydiA9IHsKLQkJLm5hbWUgPSBkZXZfaW5mbywKKwkJLm5hbWUgPSAibmlfZGFxXzcwMCIsCiAJCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKaW5kZXggZTQ4NjViMS4uNzczYWUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwpAQCAtNDgsNyArNDgsNiBAQAogCiAjaW5jbHVkZSAiODI1NS5oIgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTEyOSw3ICsxMjgsNyBAQAogCQlsaW5rID0gcGNtY2lhX2N1cl9kZXY7CS8qIFhYWCBoYWNrICovCiAJCWlmICghbGluaykKIAkJCXJldHVybiAtRUlPOwotCQlpb2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJCWlvYmFzZSA9IGxpbmstPnJlc291cmNlWzBdLT5zdGFydDsKICNpZmRlZiBpbmNvbXBsZXRlCiAJCWlycSA9IGxpbmstPmlycTsKICNlbmRpZgpAQCAtMjExLDE0ICsyMTAsNiBAQAogICAgbGVzcyBvbiBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgogKi8KIAotLyoKLSAgIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKLSAgIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCi0gICBkYXRhYmFzZS4KLSovCi0KLXN0YXRpYyBjb25zdCBkZXZfaW5mb190IGRldl9pbmZvID0gIm5pX2RhcV9kaW8yNCI7Ci0KIHN0cnVjdCBsb2NhbF9pbmZvX3QgewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rOwogCWludCBzdG9wOwpAQCAtMjg5LDggKzI4MCw3IEBACiAJZGlvMjRfcmVsZWFzZShsaW5rKTsKIAogCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBwYXJlbnQgbG9jYWxfaW5mb190IHN0cnVjdCAqLwotCWlmIChsaW5rLT5wcml2KQotCQlrZnJlZShsaW5rLT5wcml2KTsKKwlrZnJlZShsaW5rLT5wcml2KTsKIAogfQkJCQkvKiBkaW8yNF9jc19kZXRhY2ggKi8KIApAQCAtMzA4LDkgKzI5OCw2IEBACiAJCQkJdW5zaWduZWQgaW50IHZjYywKIAkJCQl2b2lkICpwcml2X2RhdGEpCiB7Ci0Jd2luX3JlcV90ICpyZXEgPSBwcml2X2RhdGE7Ci0JbWVtcmVxX3QgbWFwOwotCiAJaWYgKGNmZy0+aW5kZXggPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTMyNCw0NCArMzExLDI1IEBACiAJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CiAKIAkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IDA7CiAJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CiAJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87Ci0JCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJcF9kZXYtPmlvX2xpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgJj0gfklPX0RBVEFfUEFUSF9XSURUSDsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PQorCQkJcGNtY2lhX2lvX2NmZ19kYXRhX3dpZHRoKGlvLT5mbGFncyk7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gaW8tPndpblswXS5sZW47CiAJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMiA9IHBfZGV2LT5pby5BdHRyaWJ1dGVzMTsKLQkJCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQlwX2Rldi0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmZsYWdzID0gcF9kZXYtPnJlc291cmNlWzBdLT5mbGFnczsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+c3RhcnQgPSBpby0+d2luWzFdLmJhc2U7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IGlvLT53aW5bMV0ubGVuOwogCQl9CiAJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSAhPSAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKChjZmctPm1lbS5ud2luID4gMCkgfHwgKGRmbHQtPm1lbS5ud2luID4gMCkpIHsKLQkJY2lzdHBsX21lbV90ICptZW0gPQotCQkJKGNmZy0+bWVtLm53aW4pID8gJmNmZy0+bWVtIDogJmRmbHQtPm1lbTsKLQkJcmVxLT5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTYgfCBXSU5fTUVNT1JZX1RZUEVfQ007Ci0JCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fRU5BQkxFOwotCQlyZXEtPkJhc2UgPSBtZW0tPndpblswXS5ob3N0X2FkZHI7Ci0JCXJlcS0+U2l6ZSA9IG1lbS0+d2luWzBdLmxlbjsKLQkJaWYgKHJlcS0+U2l6ZSA8IDB4MTAwMCkKLQkJCXJlcS0+U2l6ZSA9IDB4MTAwMDsKLQkJcmVxLT5BY2Nlc3NTcGVlZCA9IDA7Ci0JCWlmIChwY21jaWFfcmVxdWVzdF93aW5kb3cocF9kZXYsIHJlcSwgJnBfZGV2LT53aW4pKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCW1hcC5QYWdlID0gMDsKLQkJbWFwLkNhcmRPZmZzZXQgPSBtZW0tPndpblswXS5jYXJkX2FkZHI7Ci0JCWlmIChwY21jaWFfbWFwX21lbV9wYWdlKHBfZGV2LCBwX2Rldi0+d2luLCAmbWFwKSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KIAkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCiAJcmV0dXJuIDA7CiB9CkBAIC0zNjksMTMgKzMzNywxMiBAQAogc3RhdGljIHZvaWQgZGlvMjRfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogCWludCByZXQ7Ci0Jd2luX3JlcV90IHJlcTsKIAogCXByaW50ayhLRVJOX0lORk8gIm5pX2RhcV9kaW8yNDogSE9MQSBTT1kgWU8hIC0gY29uZmlnXG4iKTsKIAogCWRldl9kYmcoJmxpbmstPmRldiwgImRpbzI0X2NvbmZpZ1xuIik7CiAKLQlyZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgZGlvMjRfcGNtY2lhX2NvbmZpZ19sb29wLCAmcmVxKTsKKwlyZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgZGlvMjRfcGNtY2lhX2NvbmZpZ19sb29wLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCWRldl93YXJuKCZsaW5rLT5kZXYsICJubyBjb25maWd1cmF0aW9uIGZvdW5kXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC0zOTcsMTUgKzM2NCwxMCBAQAogCWRldl9pbmZvKCZsaW5rLT5kZXYsICJpbmRleCAweCUwMngiLCBsaW5rLT5jb25mLkNvbmZpZ0luZGV4KTsKIAlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQogCQlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxKTsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMxKQotCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKLQkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MSArIGxpbmstPmlvLk51bVBvcnRzMSAtIDEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCi0JCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKLQkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MiArIGxpbmstPmlvLk51bVBvcnRzMiAtIDEpOwotCWlmIChsaW5rLT53aW4pCi0JCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgcmVxLkJhc2UsCi0JCSAgICAgICByZXEuQmFzZSArIHJlcS5TaXplIC0gMSk7CisJaWYgKGxpbmstPnJlc291cmNlWzBdKQorCQlwcmludGsoIiAmICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMV0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMV0pOwogCXByaW50aygiXG4iKTsKIAogCXJldHVybjsKQEAgLTQ3NCw3ICs0MzYsNyBAQAogCS5pZF90YWJsZSA9IGRpbzI0X2NzX2lkcywKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZHJ2ID0gewotCQkubmFtZSA9IGRldl9pbmZvLAorCQkubmFtZSA9ICJuaV9kYXFfZGlvMjQiLAogCQl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYwppbmRleCA2N2M4YTUzLi4zYWNmN2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYwpAQCAtNTI2LDcgKzUyNiw4IEBACiAJdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3MsIGlzcl9mbGFnczsKIAlzaG9ydCBsc2IsIG1zYjsKIAotCXByaW50aygiY29tZWRpJWQ6IG5pX2xhYnBjOiAlcywgaW8gMHglbHgiLCBkZXYtPm1pbm9yLCB0aGlzYm9hcmQtPm5hbWUsCisJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogbmlfbGFicGM6ICVzLCBpbyAweCVseCIsIGRldi0+bWlub3IsCisJCQkJCQkJCXRoaXNib2FyZC0+bmFtZSwKIAkgICAgICAgaW9iYXNlKTsKIAlpZiAoaXJxKQogCQlwcmludGsoIiwgaXJxICV1IiwgaXJxKTsKQEAgLTU0Myw3ICs1NDQsNyBAQAogCQkvKiBjaGVjayBpZiBpbyBhZGRyZXNzZXMgYXJlIGF2YWlsYWJsZSAqLwogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgTEFCUENfU0laRSwKIAkJCQkgICAgZHJpdmVyX2xhYnBjLmRyaXZlcl9uYW1lKSkgewotCQkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQpAQCAtNTc1LDcgKzU3Niw3IEBACiAJCQlpc3JfZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsIGxhYnBjX2ludGVycnVwdCwgaXNyX2ZsYWdzLAogCQkJCWRyaXZlcl9sYWJwYy5kcml2ZXJfbmFtZSwgZGV2KSkgewotCQkJcHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBpcnEpOworCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBpcnEpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC01ODMsMTggKzU4NCwxOCBAQAogCiAJLyogZ3JhYiBkbWEgY2hhbm5lbCAqLwogCWlmIChkbWFfY2hhbiA+IDMpIHsKLQkJcHJpbnRrKCIgaW52YWxpZCBkbWEgY2hhbm5lbCAldVxuIiwgZG1hX2NoYW4pOworCQlwcmludGsoS0VSTl9FUlIgIiBpbnZhbGlkIGRtYSBjaGFubmVsICV1XG4iLCBkbWFfY2hhbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSBpZiAoZG1hX2NoYW4pIHsKIAkJLyogYWxsb2NhdGUgZG1hIGJ1ZmZlciAqLwogCQlkZXZwcml2LT5kbWFfYnVmZmVyID0KIAkJICAgIGttYWxsb2MoZG1hX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJCWlmIChkZXZwcml2LT5kbWFfYnVmZmVyID09IE5VTEwpIHsKLQkJCXByaW50aygiIGZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiIGZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWlmIChyZXF1ZXN0X2RtYShkbWFfY2hhbiwgZHJpdmVyX2xhYnBjLmRyaXZlcl9uYW1lKSkgewotCQkJcHJpbnRrKCIgZmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBjaGFubmVsICV1XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICIgZmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBjaGFubmVsICV1XG4iLAogCQkJICAgICAgIGRtYV9jaGFuKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC02OTAsNyArNjkxLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IEVFUFJPTV9TSVpFOyBpKyspCiAJCQlkZXZwcml2LT5lZXByb21fZGF0YVtpXSA9IGxhYnBjX2VlcHJvbV9yZWFkKGRldiwgaSk7CiAjaWZkZWYgTEFCUENfREVCVUcKLQkJcHJpbnRrKCIgZWVwcm9tOiIpOworCQlwcmludGsoS0VSTl9FUlIgIiBlZXByb206Iik7CiAJCWZvciAoaSA9IDA7IGkgPCBFRVBST01fU0laRTsgaSsrKQogCQkJcHJpbnRrKCIgJWk6MHgleCAiLCBpLCBkZXZwcml2LT5lZXByb21fZGF0YVtpXSk7CiAJCXByaW50aygiXG4iKTsKQEAgLTczMiw3ICs3MzMsOCBAQAogCQlpb2Jhc2UgPSAodW5zaWduZWQgbG9uZylkZXZwcml2LT5taXRlLT5kYXFfaW9fYWRkcjsKIAkJaXJxID0gbWl0ZV9pcnEoZGV2cHJpdi0+bWl0ZSk7CiAjZWxzZQotCQlwcmludGsoIiB0aGlzIGRyaXZlciBoYXMgbm90IGJlZW4gYnVpbHQgd2l0aCBQQ0kgc3VwcG9ydC5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiB0aGlzIGRyaXZlciBoYXMgbm90IGJlZW4gYnVpbHQgd2l0aCBQQ0kgIgorCQkJCQkJCQkic3VwcG9ydC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogCQlicmVhazsKQEAgLTc0Miw3ICs3NDQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJidWchIGNvdWxkbid0IGRldGVybWluZSBib2FyZCB0eXBlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJidWchIGNvdWxkbid0IGRldGVybWluZSBib2FyZCB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KQEAgLTc3Niw3ICs3NzgsNyBAQAogCQkJfQogCQl9CiAJfQotCXByaW50aygibm8gZGV2aWNlIGZvdW5kXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIm5vIGRldmljZSBmb3VuZFxuIik7CiAJbWl0ZV9saXN0X2RldmljZXMoKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTc4NCw3ICs3ODYsNyBAQAogCiBpbnQgbGFicGNfY29tbW9uX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IG5pX2xhYnBjOiBkZXRhY2hcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IG5pX2xhYnBjOiBkZXRhY2hcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldi0+c3ViZGV2aWNlcykKIAkJc3ViZGV2XzgyNTVfY2xlYW51cChkZXYsIGRldi0+c3ViZGV2aWNlcyArIDIpOwpAQCAtODQ2LDcgKzg0OCw3IEBACiAJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFswXSkgPiBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbMV0pKQogCQlyZXR1cm4gTU9ERV9NVUxUX0NIQU5fRE9XTjsKIAotCXByaW50aygibmlfbGFicGM6IGJ1ZyEgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIm5pX2xhYnBjOiBidWchIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlblxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkwMiw3ICs5MDQsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIm5pX2xhYnBjOiBidWchIGluIGNoYW5saXN0IGNoZWNrXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAibmlfbGFicGM6IGJ1ZyEgaW4gY2hhbmxpc3QgY2hlY2tcbiIpOwogCQkJcmV0dXJuIDE7CiAJCQlicmVhazsKIAkJfQpAQCAtMTA5Niw3ICsxMDk4LDEwIEBACiAJCQllcnIrKzsKIAkJfQogCQlicmVhazsKLQkJLyogIFRSSUdfRVhUIGRvZXNuJ3QgY2FyZSBzaW5jZSBpdCBkb2Vzbid0IHRyaWdnZXIgb2ZmIGEgbnVtYmVyZWQgY2hhbm5lbCAqLworCQkvKgorCQkgKiBUUklHX0VYVCBkb2Vzbid0IGNhcmUgc2luY2UgaXQgZG9lc24ndAorCQkgKiB0cmlnZ2VyIG9mZiBhIG51bWJlcmVkIGNoYW5uZWwKKwkJICovCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMTE1NCwyNSArMTE1OSwzNSBAQAogCiAJLyogIHNldHVwIGhhcmR3YXJlIGNvbnZlcnNpb24gY291bnRlciAqLwogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfRVhUKSB7Ci0JCS8qICBsb2FkIGNvdW50ZXIgYTEgd2l0aCBjb3VudCBvZiAzIChwYysgbWFudWFsIHNheXMgdGhpcyBpcyBtaW5pbXVtIGFsbG93ZWQpIHVzaW5nIG1vZGUgMCAqLworCQkvKgorCQkgKiBsb2FkIGNvdW50ZXIgYTEgd2l0aCBjb3VudCBvZiAzCisJCSAqIChwYysgbWFudWFsIHNheXMgdGhpcyBpcyBtaW5pbXVtIGFsbG93ZWQpIHVzaW5nIG1vZGUgMAorCQkgKi8KIAkJcmV0ID0gbGFicGNfY291bnRlcl9sb2FkKGRldiwgZGV2LT5pb2Jhc2UgKyBDT1VOVEVSX0FfQkFTRV9SRUcsCiAJCQkJCSAxLCAzLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWNvbWVkaV9lcnJvcihkZXYsICJlcnJvciBsb2FkaW5nIGNvdW50ZXIgYTEiKTsKIAkJCXJldHVybiAtMTsKIAkJfQotCX0gZWxzZQkJCS8qICBvdGhlcndpc2UsIGp1c3QgcHV0IGExIGluIG1vZGUgMCB3aXRoIG5vIGNvdW50IHRvIHNldCBpdHMgb3V0cHV0IGxvdyAqLworCX0gZWxzZQkJCS8qCisJCQkJICogb3RoZXJ3aXNlLCBqdXN0IHB1dCBhMSBpbiBtb2RlIDAKKwkJCQkgKiB3aXRoIG5vIGNvdW50IHRvIHNldCBpdHMgb3V0cHV0IGxvdworCQkJCSAqLwogCQlkZXZwcml2LT53cml0ZV9ieXRlKElOSVRfQTFfQklUUywKIAkJCQkgICAgZGV2LT5pb2Jhc2UgKyBDT1VOVEVSX0FfQ09OVFJPTF9SRUcpOwogCiAJLyogIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2Qgd2Ugd2lsbCB1c2UgdG8gdHJhbnNmZXIgZGF0YSAqLwogCWlmIChkZXZwcml2LT5kbWFfY2hhbiAmJgkvKiAgbmVlZCBhIGRtYSBjaGFubmVsIGFsbG9jYXRlZCAqLwotCSAgICAvKiAgZG1hIHVuc2FmZSBhdCBSVCBwcmlvcml0eSwgYW5kIHRvbyBtdWNoIHNldHVwIHRpbWUgZm9yIFRSSUdfV0FLRV9FT1MgZm9yICovCisJCS8qCisJCSAqIGRtYSB1bnNhZmUgYXQgUlQgcHJpb3JpdHksCisJCSAqIGFuZCB0b28gbXVjaCBzZXR1cCB0aW1lIGZvciBUUklHX1dBS0VfRU9TIGZvcgorCQkgKi8KIAkgICAgKGNtZC0+ZmxhZ3MgJiAoVFJJR19XQUtFX0VPUyB8IFRSSUdfUlQpKSA9PSAwICYmCiAJICAgIC8qICBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgaXNhIGJvYXJkcyAqLwogCSAgICB0aGlzYm9hcmQtPmJ1c3R5cGUgPT0gaXNhX2J1c3R5cGUpIHsKIAkJeGZlciA9IGlzYV9kbWFfdHJhbnNmZXI7Ci0JfSBlbHNlIGlmICh0aGlzYm9hcmQtPnJlZ2lzdGVyX2xheW91dCA9PSBsYWJwY18xMjAwX2xheW91dCAmJgkvKiAgcGMtcGx1cyBoYXMgbm8gZmlmby1oYWxmIGZ1bGwgaW50ZXJydXB0ICovCisJCS8qIHBjLXBsdXMgaGFzIG5vIGZpZm8taGFsZiBmdWxsIGludGVycnVwdCAqLworCX0gZWxzZSBpZiAodGhpc2JvYXJkLT5yZWdpc3Rlcl9sYXlvdXQgPT0gbGFicGNfMTIwMF9sYXlvdXQgJiYKIAkJICAgLyogIHdha2UtZW5kLW9mLXNjYW4gc2hvdWxkIGludGVycnVwdCBvbiBmaWZvIG5vdCBlbXB0eSAqLwogCQkgICAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpID09IDAgJiYKIAkJICAgLyogIG1ha2Ugc3VyZSB3ZSBhcmUgdGFraW5nIG1vcmUgdGhhbiBqdXN0IGEgZmV3IHBvaW50cyAqLwpAQCAtMTYxOSw3ICsxNjM0LDEwIEBACiAJCWRldnByaXYtPmNvbW1hbmQ0X2JpdHMgfD0gQURDX0RJRkZfQklUOwogCWRldnByaXYtPndyaXRlX2J5dGUoZGV2cHJpdi0+Y29tbWFuZDRfYml0cywgZGV2LT5pb2Jhc2UgKyBDT01NQU5ENF9SRUcpOwogCi0JLyogaW5pdGlhbGl6ZSBwYWNlciBjb3VudGVyIG91dHB1dCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBjYXVzZSBhbnkgcHJvYmxlbXMgKi8KKwkvKgorCSAqIGluaXRpYWxpemUgcGFjZXIgY291bnRlciBvdXRwdXQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QKKwkgKiBjYXVzZSBhbnkgcHJvYmxlbXMKKwkgKi8KIAlkZXZwcml2LT53cml0ZV9ieXRlKElOSVRfQTBfQklUUywgZGV2LT5pb2Jhc2UgKyBDT1VOVEVSX0FfQ09OVFJPTF9SRUcpOwogCiAJbGFicGNfY2xlYXJfYWRjX2ZpZm8oZGV2KTsKQEAgLTE4NDQsNyArMTg2MiwxMCBAQAogCQl1bnNpZ25lZCBpbnQgc2Nhbl9wZXJpb2Q7CiAKIAkJc2Nhbl9wZXJpb2QgPSBsYWJwY19haV9zY2FuX3BlcmlvZChjbWQpOwotCQkvKiBjYWxjdWxhdGUgY2FzY2FkZWQgY291bnRlciB2YWx1ZXMgdGhhdCBnaXZlIGRlc2lyZWQgc2NhbiB0aW1pbmcgKi8KKwkJLyoKKwkJICogY2FsY3VsYXRlIGNhc2NhZGVkIGNvdW50ZXIgdmFsdWVzCisJCSAqIHRoYXQgZ2l2ZSBkZXNpcmVkIHNjYW4gdGltaW5nCisJCSAqLwogCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyXzJkaXYoTEFCUENfVElNRVJfQkFTRSwKIAkJCQkJICAgICAgICYoZGV2cHJpdi0+ZGl2aXNvcl9iMSksCiAJCQkJCSAgICAgICAmKGRldnByaXYtPmRpdmlzb3JfYjApLApAQCAtMTg1NSw3ICsxODc2LDEwIEBACiAJCXVuc2lnbmVkIGludCBjb252ZXJ0X3BlcmlvZDsKIAogCQljb252ZXJ0X3BlcmlvZCA9IGxhYnBjX2FpX2NvbnZlcnRfcGVyaW9kKGNtZCk7Ci0JCS8qIGNhbGN1bGF0ZSBjYXNjYWRlZCBjb3VudGVyIHZhbHVlcyB0aGF0IGdpdmUgZGVzaXJlZCBjb252ZXJzaW9uIHRpbWluZyAqLworCQkvKgorCQkgKiBjYWxjdWxhdGUgY2FzY2FkZWQgY291bnRlciB2YWx1ZXMKKwkJICogdGhhdCBnaXZlIGRlc2lyZWQgY29udmVyc2lvbiB0aW1pbmcKKwkJICovCiAJCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXJfMmRpdihMQUJQQ19USU1FUl9CQVNFLAogCQkJCQkgICAgICAgJihkZXZwcml2LT5kaXZpc29yX2EwKSwKIAkJCQkJICAgICAgICYoZGV2cHJpdi0+ZGl2aXNvcl9iMCksCkBAIC0yMDc2LDkgKzIxMDAsNTYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01FRElfUENJCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9sYWJwYywgbGFicGNfcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9sYWJwY19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfbGFicGMuZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX2xhYnBjX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9sYWJwY19wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGxhYnBjX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX2xhYnBjX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9sYWJwY19wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2xhYnBjX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9sYWJwYyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfbGFicGNfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfbGFicGMuZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9sYWJwY19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9sYWJwY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX2xhYnBjX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2xhYnBjKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2xhYnBjX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9sYWJwY19jbGVhbnVwX21vZHVsZSk7CiAjZWxzZQotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9sYWJwYyk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfbGFicGNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2xhYnBjKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9sYWJwY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2xhYnBjKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2xhYnBjX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9sYWJwY19jbGVhbnVwX21vZHVsZSk7CiAjZW5kaWYKIAogRVhQT1JUX1NZTUJPTF9HUEwobGFicGNfY29tbW9uX2F0dGFjaCk7CkBAIC0yMDg2LDMgKzIxNTcsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmFuZ2VfbGFicGNfMTIwMF9haSk7CiBFWFBPUlRfU1lNQk9MX0dQTChsYWJwY18xMjAwX2FpX2dhaW5fYml0cyk7CiBFWFBPUlRfU1lNQk9MX0dQTChsYWJwY18xMjAwX2lzX3VuaXBvbGFyKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwppbmRleCAxNjMyNDVlLi42OGM0ZWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwpAQCAtNzEsNyArNzEsNiBAQAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIm5pX2xhYnBjLmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtMTQzLDcgKzE0Miw3IEBACiAJCWxpbmsgPSBwY21jaWFfY3VyX2RldjsJLyogWFhYIGhhY2sgKi8KIAkJaWYgKCFsaW5rKQogCQkJcmV0dXJuIC1FSU87Ci0JCWlvYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwkJaW9iYXNlID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCQlpcnEgPSBsaW5rLT5pcnE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xODksMTQgKzE4OCw2IEBACiAgICBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCiAqLwogCi0vKgotICAgVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcwotICAgZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KLSAgIGRhdGFiYXNlLgotKi8KLQotc3RhdGljIGNvbnN0IGRldl9pbmZvX3QgZGV2X2luZm8gPSAiZGFxY2FyZC0xMjAwIjsKLQogc3RydWN0IGxvY2FsX2luZm9fdCB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbms7CiAJaW50IHN0b3A7CkBAIC0yODYsOSArMjc3LDYgQEAKIAkJCQl1bnNpZ25lZCBpbnQgdmNjLAogCQkJCXZvaWQgKnByaXZfZGF0YSkKIHsKLQl3aW5fcmVxX3QgKnJlcSA9IHByaXZfZGF0YTsKLQltZW1yZXFfdCBtYXA7Ci0KIAlpZiAoY2ZnLT5pbmRleCA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMzAyLDQ0ICsyOTAsMjUgQEAKIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUSB8IENPTkZfRU5BQkxFX1BVTFNFX0lSUTsKIAogCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+aW9fbGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9CisJCQlwY21jaWFfaW9fY2ZnX2RhdGFfd2lkdGgoaW8tPmZsYWdzKTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKIAkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOwotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZmxhZ3MgPSBwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gaW8tPndpblsxXS5sZW47CiAJCX0KIAkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSAhPSAwKQorCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpICE9IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC0+bWVtLm53aW4gPiAwKSkgewotCQljaXN0cGxfbWVtX3QgKm1lbSA9Ci0JCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC0+bWVtOwotCQlyZXEtPkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNiB8IFdJTl9NRU1PUllfVFlQRV9DTTsKLQkJcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9FTkFCTEU7Ci0JCXJlcS0+QmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKLQkJcmVxLT5TaXplID0gbWVtLT53aW5bMF0ubGVuOwotCQlpZiAocmVxLT5TaXplIDwgMHgxMDAwKQotCQkJcmVxLT5TaXplID0gMHgxMDAwOwotCQlyZXEtPkFjY2Vzc1NwZWVkID0gMDsKLQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhwX2RldiwgcmVxLCAmcF9kZXYtPndpbikpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJbWFwLlBhZ2UgPSAwOwotCQltYXAuQ2FyZE9mZnNldCA9IG1lbS0+d2luWzBdLmNhcmRfYWRkcjsKLQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UocF9kZXYsIHBfZGV2LT53aW4sICZtYXApKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTM0OCwxMSArMzE3LDEwIEBACiBzdGF0aWMgdm9pZCBsYWJwY19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAJaW50IHJldDsKLQl3aW5fcmVxX3QgcmVxOwogCiAJZGV2X2RiZygmbGluay0+ZGV2LCAibGFicGNfY29uZmlnXG4iKTsKIAotCXJldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBsYWJwY19wY21jaWFfY29uZmlnX2xvb3AsICZyZXEpOworCXJldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBsYWJwY19wY21jaWFfY29uZmlnX2xvb3AsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJZGV2X3dhcm4oJmxpbmstPmRldiwgIm5vIGNvbmZpZ3VyYXRpb24gZm91bmRcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTM3NCwxNSArMzQyLDEwIEBACiAJZGV2X2luZm8oJmxpbmstPmRldiwgImluZGV4IDB4JTAyeCIsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOwogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxICsgbGluay0+aW8uTnVtUG9ydHMxIC0gMSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMikKLQkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyICsgbGluay0+aW8uTnVtUG9ydHMyIC0gMSk7Ci0JaWYgKGxpbmstPndpbikKLQkJcHJpbnRrKCIsIG1lbSAweCUwNmx4LTB4JTA2bHgiLCByZXEuQmFzZSwKLQkJICAgICAgIHJlcS5CYXNlICsgcmVxLlNpemUgLSAxKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMF0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMF0pOworCWlmIChsaW5rLT5yZXNvdXJjZVsxXSkKKwkJcHJpbnRrKCIgJiAlcFIiLCBsaW5rLT5yZXNvdXJjZVsxXSk7CiAJcHJpbnRrKCJcbiIpOwogCiAJcmV0dXJuOwpAQCAtNDQ5LDcgKzQxMiw3IEBACiAJLmlkX3RhYmxlID0gbGFicGNfY3NfaWRzLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kcnYgPSB7Ci0JCS5uYW1lID0gZGV2X2luZm8sCisJCS5uYW1lID0gImRhcWNhcmQtMTIwMCIsCiAJCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKaW5kZXggM2E0NmYwYy4uMWYyNDI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwpAQCAtNDgsNyArNDgsNiBAQAogI2luY2x1ZGUgIm5pX3N0Yy5oIgogI2luY2x1ZGUgIjgyNTUuaCIKIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KQEAgLTI2MSwxMiArMjYwLDExIEBACiBzdGF0aWMgdm9pZCBjc19kZXRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqY3VyX2RldiA9IE5VTEw7Ci1zdGF0aWMgY29uc3QgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJuaV9taW9fY3MiOwogCiBzdGF0aWMgaW50IGNzX2F0dGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQlsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAxNjsKIAlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CiAJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CiAKQEAgLTMxMSwxMyArMzA5LDEyIEBACiB7CiAJaW50IGJhc2UsIHJldDsKIAotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBjZmctPmlvLndpblswXS5sZW47Ci0JcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCXBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gY2ZnLT5pby53aW5bMF0ubGVuOworCXBfZGV2LT5pb19saW5lcyA9IGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKIAogCWZvciAoYmFzZSA9IDB4MDAwOyBiYXNlIDwgMHg0MDA7IGJhc2UgKz0gMHgyMCkgewotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gYmFzZTsKLQkJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gYmFzZTsKKwkJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYpOwogCQlpZiAoIXJldCkKIAkJCXJldHVybiAwOwogCX0KQEAgLTM1Niw3ICszNTMsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWRldi0+ZHJpdmVyID0gJmRyaXZlcl9uaV9taW9fY3M7Ci0JZGV2LT5pb2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJZGV2LT5pb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlpcnEgPSBsaW5rLT5pcnE7CiAKQEAgLTQ1MCw3ICs0NDcsNyBAQAogCS5pZF90YWJsZSA9IG5pX21pb19jc19pZHMsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRydiA9IHsKLQkJLm5hbWUgPSBkZXZfaW5mbywKKwkJLm5hbWUgPSAibmlfbWlvX2NzIiwKIAkJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwppbmRleCBiMTI2NjM4Li44NGExNWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCkBAIC0xMzE3LDQgKzEzMTcsNDAgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUChkcml2ZXJfcGNpZGlvLCBuaV9wY2lkaW9fcGNpX3RhYmxlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9wY2lkaW9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9wY2lkaW8uZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX3BjaWRpb19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfcGNpZGlvX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gbmlfcGNpZGlvX3BjaV90YWJsZSwKKwkucHJvYmUgPSAmZHJpdmVyX3BjaWRpb19wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfcGNpZGlvX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNpZGlvX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9wY2lkaW8pOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX3BjaWRpb19wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9wY2lkaW8uZHJpdmVyX25hbWU7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9wY2lkaW9fcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfcGNpZGlvX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfcGNpZGlvX3BjaV9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3BjaWRpbyk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wY2lkaW9faW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjaWRpb19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKaW5kZXggNTc3ZmRhOC4uMjNhMzgxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwpAQCAtMTIzOSw3ICsxMjM5LDQzIEBACiAJLmRldGFjaCA9IHBjaW1pb19kZXRhY2gsCiB9OwogCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2ltaW8sIG5pX3BjaV90YWJsZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9wY2ltaW9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9wY2ltaW8uZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHJpdmVyX3BjaW1pb19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfcGNpbWlvX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gbmlfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfcGNpbWlvX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9wY2ltaW9fcGNpX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9wY2ltaW9faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjaW1pbyk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfcGNpbWlvX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopZHJpdmVyX3BjaW1pby5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX3BjaW1pb19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2ltaW9fY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcl9wY2ltaW9fcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcGNpbWlvKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjaW1pb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfcGNpbWlvX2NsZWFudXBfbW9kdWxlKTsKIAogc3RydWN0IG5pX3ByaXZhdGUgewogTklfUFJJVkFURV9DT01NT059OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpby5jCmluZGV4IDEzZTViMjYuLmE5YmI2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvLmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCQkJCQkJCQkJbmlfZ3BjdF9yZWdpc3RlcgogCQkJCQkJCQkJcmVnKSwKIAkJCQkJCXVuc2lnbmVkICgqcmVhZF9yZWdpc3RlcikKLQkJCQkJCShzdHJ1Y3QgbmlfZ3BjdCAqIGNvdW50ZXIsCisJCQkJCQkoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsCiAJCQkJCQkgZW51bSBuaV9ncGN0X3JlZ2lzdGVyIHJlZyksCiAJCQkJCQllbnVtIG5pX2dwY3RfdmFyaWFudCB2YXJpYW50LAogCQkJCQkJdW5zaWduZWQgbnVtX2NvdW50ZXJzKQpAQCAtMzMyLDYgKzMzMiw3IEBACiAJY291bnRlcl9kZXYtPm51bV9jb3VudGVycyA9IG51bV9jb3VudGVyczsKIAlyZXR1cm4gY291bnRlcl9kZXY7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuaV9ncGN0X2RldmljZV9jb25zdHJ1Y3QpOwogCiB2b2lkIG5pX2dwY3RfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IG5pX2dwY3RfZGV2aWNlICpjb3VudGVyX2RldikKIHsKQEAgLTM0MCw2ICszNDEsNyBAQAogCWtmcmVlKGNvdW50ZXJfZGV2LT5jb3VudGVycyk7CiAJa2ZyZWUoY291bnRlcl9kZXYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfZ3BjdF9kZXZpY2VfZGVzdHJveSk7CiAKIHN0YXRpYyBpbnQgbmlfdGlvX3NlY29uZF9nYXRlX3JlZ2lzdGVyc19wcmVzZW50KGNvbnN0IHN0cnVjdCBuaV9ncGN0X2RldmljZQogCQkJCQkJKmNvdW50ZXJfZGV2KQpAQCAtNDE4LDYgKzQyMCw3IEBACiAJCQlOSVRJT19HaV9JbnRlcnJ1cHRfRW5hYmxlX1JlZyhjb3VudGVyLT5jb3VudGVyX2luZGV4KSwKIAkJCX4wLCAweDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2luaXRfY291bnRlcik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmlfdGlvX2NvdW50ZXJfc3RhdHVzKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyKQogewpAQCAtNDQ2LDkgKzQ0OSw3IEBACiAJaWYgKG5pX3Rpb19jb3VudGluZ19tb2RlX3JlZ2lzdGVyc19wcmVzZW50KGNvdW50ZXJfZGV2KSA9PSAwKQogCQlyZXR1cm47CiAKLQlzd2l0Y2ggKG5pX3Rpb19nZXRfc29mdF9jb3B5KGNvdW50ZXIsCi0JCQkJICAgICBjb3VudGluZ19tb2RlX3JlZykgJiBHaV9Db3VudGluZ19Nb2RlX01hc2spCi0JeworCXN3aXRjaCAobmlfdGlvX2dldF9zb2Z0X2NvcHkoY291bnRlciwgY291bnRpbmdfbW9kZV9yZWcpICYgR2lfQ291bnRpbmdfTW9kZV9NYXNrKSB7CiAJY2FzZSBHaV9Db3VudGluZ19Nb2RlX1F1YWRyYXR1cmVYMV9CaXRzOgogCWNhc2UgR2lfQ291bnRpbmdfTW9kZV9RdWFkcmF0dXJlWDJfQml0czoKIAljYXNlIEdpX0NvdW50aW5nX01vZGVfUXVhZHJhdHVyZVg0X0JpdHM6CkBAIC01MTMsOSArNTE0LDggQEAKIAkJY291bnRpbmdfbW9kZV9iaXRzIHw9CiAJCSAgICAoKG1vZGUgPj4gTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCkgPDwKIAkJICAgICBHaV9JbmRleF9QaGFzZV9CaXRzaGlmdCkgJiBHaV9JbmRleF9QaGFzZV9NYXNrOwotCQlpZiAobW9kZSAmIE5JX0dQQ1RfSU5ERVhfRU5BQkxFX0JJVCkgeworCQlpZiAobW9kZSAmIE5JX0dQQ1RfSU5ERVhfRU5BQkxFX0JJVCkKIAkJCWNvdW50aW5nX21vZGVfYml0cyB8PSBHaV9JbmRleF9Nb2RlX0JpdDsKLQkJfQogCQluaV90aW9fc2V0X2JpdHMoY291bnRlciwKIAkJCQlOSVRJT19HaV9Db3VudGluZ19Nb2RlX1JlZyhjb3VudGVyLT4KIAkJCQkJCQkgICBjb3VudGVyX2luZGV4KSwKQEAgLTUyOSwxMiArNTI5LDEwIEBACiAJCQkobW9kZSA+PiBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCkgPDwKIAkJCUdpX1VwX0Rvd25fU2hpZnQpOwogCi0JaWYgKG1vZGUgJiBOSV9HUENUX09SX0dBVEVfQklUKSB7CisJaWYgKG1vZGUgJiBOSV9HUENUX09SX0dBVEVfQklUKQogCQlpbnB1dF9zZWxlY3RfYml0cyB8PSBHaV9Pcl9HYXRlX0JpdDsKLQl9Ci0JaWYgKG1vZGUgJiBOSV9HUENUX0lOVkVSVF9PVVRQVVRfQklUKSB7CisJaWYgKG1vZGUgJiBOSV9HUENUX0lOVkVSVF9PVVRQVVRfQklUKQogCQlpbnB1dF9zZWxlY3RfYml0cyB8PSBHaV9PdXRwdXRfUG9sYXJpdHlfQml0OwotCX0KIAluaV90aW9fc2V0X2JpdHMoY291bnRlciwKIAkJCU5JVElPX0dpX0lucHV0X1NlbGVjdF9SZWcoY291bnRlci0+Y291bnRlcl9pbmRleCksCiAJCQlHaV9HYXRlX1NlbGVjdF9Mb2FkX1NvdXJjZV9CaXQgfCBHaV9Pcl9HYXRlX0JpdCB8CkBAIC02MDAsNiArNTk4LDcgQEAKIAkJCQkgIDAsIDAsIGNvbW1hbmRfdHJhbnNpZW50X2JpdHMpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2FybSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBuaV82NjB4X3NvdXJjZV9zZWxlY3RfYml0cyh1bnNpZ25lZCBpbnQgY2xvY2tfc291cmNlKQogewpAQCAtNzA2LDcgKzcwNSw3IEBACiAJCX0KIAkJaWYgKGkgPD0gbmlfbV9zZXJpZXNfbWF4X3BmaV9jaGFubmVsKQogCQkJYnJlYWs7Ci0JCXByaW50aygiaW52YWxpZCBjbG9jayBzb3VyY2UgMHglbHhcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjbG9jayBzb3VyY2UgMHglbHhcbiIsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZyljbG9ja19zb3VyY2UpOwogCQlCVUcoKTsKIAkJbmlfbV9zZXJpZXNfY2xvY2sgPSAwOwpAQCAtMTAyNiwxNCArMTAyNSwxMiBAQAogCWNvbnN0IHVuc2lnbmVkIG1vZGVfbWFzayA9IEdpX0dhdGVfUG9sYXJpdHlfQml0IHwgR2lfR2F0aW5nX01vZGVfTWFzazsKIAl1bnNpZ25lZCBtb2RlX3ZhbHVlcyA9IDA7CiAKLQlpZiAoZ2F0ZV9zb3VyY2UgJiBDUl9JTlZFUlQpIHsKKwlpZiAoZ2F0ZV9zb3VyY2UgJiBDUl9JTlZFUlQpCiAJCW1vZGVfdmFsdWVzIHw9IEdpX0dhdGVfUG9sYXJpdHlfQml0OwotCX0KLQlpZiAoZ2F0ZV9zb3VyY2UgJiBDUl9FREdFKSB7CisJaWYgKGdhdGVfc291cmNlICYgQ1JfRURHRSkKIAkJbW9kZV92YWx1ZXMgfD0gR2lfUmlzaW5nX0VkZ2VfR2F0aW5nX0JpdHM7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCW1vZGVfdmFsdWVzIHw9IEdpX0xldmVsX0dhdGluZ19CaXRzOwotCX0KIAluaV90aW9fc2V0X2JpdHMoY291bnRlciwgTklUSU9fR2lfTW9kZV9SZWcoY291bnRlci0+Y291bnRlcl9pbmRleCksCiAJCQltb2RlX21hc2ssIG1vZGVfdmFsdWVzKTsKIH0KQEAgLTEyOTAsNiArMTI4Nyw3IEBACiAJfQogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX3NldF9nYXRlX3NyYyk7CiAKIHN0YXRpYyBpbnQgbmlfdGlvX3NldF9vdGhlcl9zcmMoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHVuc2lnbmVkIGluZGV4LAogCQkJCXVuc2lnbmVkIGludCBzb3VyY2UpCkBAIC0xNTMxLDEyICsxNTI5LDEwIEBACiAJCQlCVUcoKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChtb2RlX2JpdHMgJiBHaV9HYXRlX1BvbGFyaXR5X0JpdCkgeworCQlpZiAobW9kZV9iaXRzICYgR2lfR2F0ZV9Qb2xhcml0eV9CaXQpCiAJCQkqZ2F0ZV9zb3VyY2UgfD0gQ1JfSU5WRVJUOwotCQl9Ci0JCWlmICgobW9kZV9iaXRzICYgR2lfR2F0aW5nX01vZGVfTWFzaykgIT0gR2lfTGV2ZWxfR2F0aW5nX0JpdHMpIHsKKwkJaWYgKChtb2RlX2JpdHMgJiBHaV9HYXRpbmdfTW9kZV9NYXNrKSAhPSBHaV9MZXZlbF9HYXRpbmdfQml0cykKIAkJCSpnYXRlX3NvdXJjZSB8PSBDUl9FREdFOwotCQl9CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJaWYgKChtb2RlX2JpdHMgJiBHaV9HYXRpbmdfTW9kZV9NYXNrKSA9PSBHaV9HYXRpbmdfRGlzYWJsZWRfQml0cwpAQCAtMTU3Miw5ICsxNTY4LDggQEAKIAkJCSpnYXRlX3NvdXJjZSB8PSBDUl9JTlZFUlQ7CiAJCX0KIAkJLyogc2Vjb25kIGdhdGUgY2FuJ3QgaGF2ZSBlZGdlL2xldmVsIG1vZGUgc2V0IGluZGVwZW5kZW50bHkgKi8KLQkJaWYgKChtb2RlX2JpdHMgJiBHaV9HYXRpbmdfTW9kZV9NYXNrKSAhPSBHaV9MZXZlbF9HYXRpbmdfQml0cykgeworCQlpZiAoKG1vZGVfYml0cyAmIEdpX0dhdGluZ19Nb2RlX01hc2spICE9IEdpX0xldmVsX0dhdGluZ19CaXRzKQogCQkJKmdhdGVfc291cmNlIHw9IENSX0VER0U7Ci0JCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjI3LDYgKzE2MjIsNyBAQAogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19pbnNuX2NvbmZpZyk7CiAKIGludCBuaV90aW9fcmluc24oc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTE2ODEsNiArMTY3Nyw3IEBACiAJfTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19yaW5zbik7CiAKIHN0YXRpYyB1bnNpZ25lZCBuaV90aW9fbmV4dF9sb2FkX3JlZ2lzdGVyKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyKQogewpAQCAtMTY4OCwxMSArMTY4NSwxMCBAQAogCQkJCQkgICAgTklUSU9fR3h4X1N0YXR1c19SZWcoY291bnRlci0+CiAJCQkJCQkJCSBjb3VudGVyX2luZGV4KSk7CiAKLQlpZiAoYml0cyAmIEdpX05leHRfTG9hZF9Tb3VyY2VfQml0KGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpKSB7CisJaWYgKGJpdHMgJiBHaV9OZXh0X0xvYWRfU291cmNlX0JpdChjb3VudGVyLT5jb3VudGVyX2luZGV4KSkKIAkJcmV0dXJuIE5JVElPX0dpX0xvYWRCX1JlZyhjb3VudGVyLT5jb3VudGVyX2luZGV4KTsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmV0dXJuIE5JVElPX0dpX0xvYWRBX1JlZyhjb3VudGVyLT5jb3VudGVyX2luZGV4KTsKLQl9CiB9CiAKIGludCBuaV90aW9fd2luc24oc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTE3MzUsMTIgKzE3MzEsNCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX3JpbnNuKTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb193aW5zbik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9faW5zbl9jb25maWcpOwotRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2luaXRfY291bnRlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fYXJtKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19zZXRfZ2F0ZV9zcmMpOwotRVhQT1JUX1NZTUJPTF9HUEwobmlfZ3BjdF9kZXZpY2VfY29uc3RydWN0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX2dwY3RfZGV2aWNlX2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCmluZGV4IGE0OTlmNzAuLmI0NDM4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKQEAgLTE3MSw3ICsxNzEsMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBwY2w3MTFfYm9hcmQpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2w3MTEpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3BjbDcxMV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNsNzExKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2w3MTFfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2w3MTEpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfcGNsNzExX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY2w3MTFfY2xlYW51cF9tb2R1bGUpOwogCiBzdHJ1Y3QgcGNsNzExX3ByaXZhdGUgewogCkBAIC0yNzAsNyArMjgxLDcgQEAKIAkJCQlnb3RvIG9rOwogCQkJdWRlbGF5KDEpOwogCQl9Ci0JCXByaW50aygiY29tZWRpJWQ6IHBjbDcxMTogQS9EIHRpbWVvdXRcbiIsIGRldi0+bWlub3IpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBwY2w3MTE6IEEvRCB0aW1lb3V0XG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FVElNRTsKIAogb2s6CkBAIC01MDUsNyArNTE2LDcgQEAKIC8qICBGcmVlIGFueSByZXNvdXJjZXMgdGhhdCB3ZSBoYXZlIGNsYWltZWQgICovCiBzdGF0aWMgaW50IHBjbDcxMV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBwY2w3MTE6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjbDcxMTogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CkBAIC01MjcsNyArNTM4LDcgQEAKIAkvKiBjbGFpbSBvdXIgSS9PIHNwYWNlICovCiAKIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKLQlwcmludGsoImNvbWVkaSVkOiBwY2w3MTE6IDB4JTA0bHggIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNsNzExOiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIFBDTDcxMV9TSVpFLCAicGNsNzExIikpIHsKIAkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtNTQyLDE1ICs1NTMsMTUgQEAKIAkvKiBncmFiIG91ciBJUlEgKi8KIAlpcnEgPSBpdC0+b3B0aW9uc1sxXTsKIAlpZiAoaXJxID4gdGhpc19ib2FyZC0+bWF4aXJxKSB7Ci0JCXByaW50aygiaXJxIG91dCBvZiByYW5nZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaXJxIG91dCBvZiByYW5nZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoaXJxKSB7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsIHBjbDcxMV9pbnRlcnJ1cHQsIDAsICJwY2w3MTEiLCBkZXYpKSB7Ci0JCQlwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJXVcbiIsIGlycSk7CisJCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJXVcbiIsIGlycSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIHsKLQkJCXByaW50aygiKCBpcnEgPSAldSApXG4iLCBpcnEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiKCBpcnEgPSAldSApXG4iLCBpcnEpOwogCQl9CiAJfQogCWRldi0+aXJxID0gaXJxOwpAQCAtNjI0LDcgKzYzNSwxMSBAQAogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfREExX0xPKTsKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMNzExX0RBMV9ISSk7CiAKLQlwcmludGsoIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI0LmMKaW5kZXggMGYxMDNjMy4uMzk2YTA1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjQuYwpAQCAtOTMsNyArOTMsMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBwY2w3MjRfYm9hcmQpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2w3MjQpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3BjbDcyNF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNsNzI0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2w3MjRfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2w3MjQpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfcGNsNzI0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY2w3MjRfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaW50IHN1YmRldl84MjU1X2NiKGludCBkaXIsIGludCBwb3J0LCBpbnQgZGF0YSwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0yMjEsMyArMjMyLDcgQEAKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI1LmMKaW5kZXggNjAyNjFmNC4uMjRiMjIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjUuYwpAQCAtMzAsNyArMzAsMTggQEAKIAkuZGV0YWNoID0gcGNsNzI1X2RldGFjaCwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfcGNsNzI1KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9wY2w3MjVfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjbDcyNSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfcGNsNzI1X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcGNsNzI1KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjbDcyNV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfcGNsNzI1X2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBwY2w3MjVfZG9faW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC0xMTAsMyArMTIxLDcgQEAKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMKaW5kZXggNmExYTk3OS4uODk3Y2Q4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYwpAQCAtMTYyLDcgKzE2MiwxOCBAQAogCS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHBjbDcyNl9ib2FyZCksCiB9OwogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX3BjbDcyNik7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNsNzI2X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9wY2w3MjYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX3BjbDcyNl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3BjbDcyNik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wY2w3MjZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjbDcyNl9jbGVhbnVwX21vZHVsZSk7CiAKIHN0cnVjdCBwY2w3MjZfcHJpdmF0ZSB7CiAKQEAgLTM4MSwzICszOTIsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MzAuYwppbmRleCBlNWU3YmVkLi5jOTY4MmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDczMC5jCkBAIC01NSw3ICs1NSwxOCBAQAogCS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHBjbDczMF9ib2FyZCksCiB9OwogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX3BjbDczMCk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNsNzMwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9wY2w3MzApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX3BjbDczMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3BjbDczMCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wY2w3MzBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjbDczMF9jbGVhbnVwX21vZHVsZSk7CiAKIHN0YXRpYyBpbnQgcGNsNzMwX2RvX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMTY2LDMgKzE3Nyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCmluZGV4IDFkZGMxOWMuLmM2ZGNlNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKQEAgLTE1LDk3ICsxNSw5OCBAQAogICogIGNhcmQ6ICAgQS04MjNQR0gsIEEtODIzUEdMLCBBLTgyNlBHCiAgKiBkcml2ZXI6ICBhODIzcGdoLCAgYTgyM3BnbCwgIGE4MjZwZwogICovCisKIC8qCi1Ecml2ZXI6IHBjbDgxMgotRGVzY3JpcHRpb246IEFkdmFudGVjaCBQQ0wtODEyL1BHLCBQQ0wtODEzL0IsCi0gICAgICAgICAgICAgQURMaW5rIEFDTC04MTEyREcvSEcvUEcsIEFDTC04MTEzLCBBQ0wtODIxNiwKLSAgICAgICAgICAgICBJQ1AgREFTIEEtODIxUEdIL1BHTC9QR0wtTkRBLCBBLTgyMlBHSC9QR0wsIEEtODIzUEdIL1BHTCwgQS04MjZQRywKLSAgICAgICAgICAgICBJQ1AgREFTIElTTy04MTMKLUF1dGhvcjogTWljaGFsIERvYmVzIDxkb2Jlc0B0ZXNuZXQuY3o+Ci1EZXZpY2VzOiBbQWR2YW50ZWNoXSBQQ0wtODEyIChwY2w4MTIpLCBQQ0wtODEyUEcgKHBjbDgxMnBnKSwKLSAgUENMLTgxMyAocGNsODEzKSwgUENMLTgxM0IgKHBjbDgxM2IpLCBbQURMaW5rXSBBQ0wtODExMkRHIChhY2w4MTEyZGcpLAotICBBQ0wtODExMkhHIChhY2w4MTEyaGcpLCBBQ0wtODExMyAoYWNsLTgxMTMpLCBBQ0wtODIxNiAoYWNsODIxNiksCi0gIFtJQ1BdIElTTy04MTMgKGlzbzgxMyksIEEtODIxUEdIIChhODIxcGdoKSwgQS04MjFQR0wgKGE4MjFwZ2wpLAotICBBLTgyMVBHTC1OREEgKGE4MjFwY2xuZGEpLCBBLTgyMlBHSCAoYTgyMnBnaCksIEEtODIyUEdMIChhODIycGdsKSwKLSAgQS04MjNQR0ggKGE4MjNwZ2gpLCBBLTgyM1BHTCAoYTgyM3BnbCksIEEtODI2UEcgKGE4MjZwZykKLVVwZGF0ZWQ6IE1vbiwgMDYgQXVnIDIwMDcgMTI6MDM6MTUgKzAxMDAKLVN0YXR1czogd29ya3MgKEkgaG9wZS4gTXkgYm9hcmQgZmlyZSB1cCB1bmRlciBteSBoYW5kcwotICAgICAgICAgICAgICAgYW5kIEkgY2Fubid0IHRlc3QgYWxsIGZlYXR1cmVzLikKLQotVGhpcyBkcml2ZXIgc3VwcG9ydHMgaW5zbiBhbmQgY21kIGludGVyZmFjZXMuIFNvbWUgYm9hcmRzIHN1cHBvcnQgb25seSBpbnNuCi1iZWNvdXNlIHRoZWlyIGhhcmR3YXJlIGRvbid0IGFsbG93IG1vcmUgKFBDTC04MTMvQiwgQUNMLTgxMTMsIElTTy04MTMpLgotRGF0YSB0cmFuc2ZlciBvdmVyIERNQSBpcyBzdXBwb3J0ZWQgb25seSB3aGVuIHlvdSBtZWFzdXJlIG9ubHkgb25lCi1jaGFubmVsLCB0aGlzIGlzIHRvbyBoYXJkd2FyZSBsaW1pdGF0aW9uIG9mIHRoZXNlIGJvYXJkcy4KLQotT3B0aW9ucyBmb3IgUENMLTgxMjoKLSAgWzBdIC0gSU8gQmFzZQotICBbMV0gLSBJUlEgICgwPWRpc2FibGUsIDIsIDMsIDQsIDUsIDYsIDc7IDEwLCAxMSwgMTIsIDE0LCAxNSkKLSAgWzJdIC0gRE1BICAoMD1kaXNhYmxlLCAxLCAzKQotICBbM10gLSAwPXRyaWdnZXIgc291cmNlIGlzIGludGVybmFsIDgyNTMgd2l0aCAyTUh6IGNsb2NrCi0gICAgICAgIDE9dHJpZ2dlciBzb3VyY2UgaXMgZXh0ZXJuYWwKLSAgWzRdIC0gMD1BL0QgaW5wdXQgcmFuZ2UgaXMgKy8tMTBWCi0gICAgICAgIDE9QS9EIGlucHV0IHJhbmdlIGlzICsvLTVWCi0gICAgICAgIDI9QS9EIGlucHV0IHJhbmdlIGlzICsvLTIuNVYKLSAgICAgICAgMz1BL0QgaW5wdXQgcmFuZ2UgaXMgKy8tMS4yNVYKLSAgICAgICAgND1BL0QgaW5wdXQgcmFuZ2UgaXMgKy8tMC42MjVWCi0gICAgICAgIDU9QS9EIGlucHV0IHJhbmdlIGlzICsvLTAuMzEyNVYKLSAgWzVdIC0gMD1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKLSAgICAgICAgMT1EL0Egb3V0cHV0cyAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0gICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQotCi1PcHRpb25zIGZvciBQQ0wtODEyUEcsIEFDTC04MTEyUEc6Ci0gIFswXSAtIElPIEJhc2UKLSAgWzFdIC0gSVJRICAoMD1kaXNhYmxlLCAyLCAzLCA0LCA1LCA2LCA3OyAxMCwgMTEsIDEyLCAxNCwgMTUpCi0gIFsyXSAtIERNQSAgKDA9ZGlzYWJsZSwgMSwgMykKLSAgWzNdIC0gMD10cmlnZ2VyIHNvdXJjZSBpcyBpbnRlcm5hbCA4MjUzIHdpdGggMk1IeiBjbG9jawotICAgICAgICAxPXRyaWdnZXIgc291cmNlIGlzIGV4dGVybmFsCi0gIFs0XSAtIDA9QS9EIGhhdmUgbWF4ICsvLTVWIGlucHV0Ci0gICAgICAgIDE9QS9EIGhhdmUgbWF4ICsvLTEwViBpbnB1dAotICBbNV0gLSAwPUQvQSBvdXRwdXRzIDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQotICAgICAgICAxPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLSAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCi0KLU9wdGlvbnMgZm9yIEFDTC04MTEyREcvSEcsIEEtODIyUEdML1BHSCwgQS04MjNQR0wvUEdILCBBQ0wtODIxNiwgQS04MjZQRzoKLSAgWzBdIC0gSU8gQmFzZQotICBbMV0gLSBJUlEgICgwPWRpc2FibGUsIDIsIDMsIDQsIDUsIDYsIDc7IDEwLCAxMSwgMTIsIDE0LCAxNSkKLSAgWzJdIC0gRE1BICAoMD1kaXNhYmxlLCAxLCAzKQotICBbM10gLSAwPXRyaWdnZXIgc291cmNlIGlzIGludGVybmFsIDgyNTMgd2l0aCAyTUh6IGNsb2NrCi0gICAgICAgIDE9dHJpZ2dlciBzb3VyY2UgaXMgZXh0ZXJuYWwKLSAgWzRdIC0gMD1BL0QgY2hhbm5lbHMgYXJlIFMuRS4KLSAgICAgICAgMT1BL0QgY2hhbm5lbHMgYXJlIERJRkYKLSAgWzVdIC0gMD1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKLSAgICAgICAgMT1EL0Egb3V0cHV0cyAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0gICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQotCi1PcHRpb25zIGZvciBBLTgyMVBHTC9QR0g6Ci0gIFswXSAtIElPIEJhc2UKLSAgWzFdIC0gSVJRICAoMD1kaXNhYmxlLCAyLCAzLCA0LCA1LCA2LCA3KQotICBbMl0gLSAwPUEvRCBjaGFubmVscyBhcmUgUy5FLgotICAgICAgICAxPUEvRCBjaGFubmVscyBhcmUgRElGRgotICBbM10gLSAwPUQvQSBvdXRwdXQgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCi0gICAgICAgIDE9RC9BIG91dHB1dCAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0KLU9wdGlvbnMgZm9yIEEtODIxUEdMLU5EQToKLSAgWzBdIC0gSU8gQmFzZQotICBbMV0gLSBJUlEgICgwPWRpc2FibGUsIDIsIDMsIDQsIDUsIDYsIDcpCi0gIFsyXSAtIDA9QS9EIGNoYW5uZWxzIGFyZSBTLkUuCi0gICAgICAgIDE9QS9EIGNoYW5uZWxzIGFyZSBESUZGCi0KLU9wdGlvbnMgZm9yIFBDTC04MTM6Ci0gIFswXSAtIElPIEJhc2UKLQotT3B0aW9ucyBmb3IgUENMLTgxM0I6Ci0gIFswXSAtIElPIEJhc2UKLSAgWzFdIC0gMD0gYmlwb2xhciBpbnB1dHMKLSAgICAgICAgMT0gdW5pcG9sYXIgaW5wdXRzCi0KLU9wdGlvbnMgZm9yIEFDTC04MTEzLCBJU08tODEzOgotICBbMF0gLSBJTyBCYXNlCi0gIFsxXSAtIDA9IDEwViBiaXBvbGFyIGlucHV0cwotICAgICAgICAxPSAxMFYgdW5pcG9sYXIgaW5wdXRzCi0gICAgICAgIDI9IDIwViBiaXBvbGFyIGlucHV0cwotICAgICAgICAzPSAyMFYgdW5pcG9sYXIgaW5wdXRzCi0qLworICogRHJpdmVyOiBwY2w4MTIKKyAqIERlc2NyaXB0aW9uOiBBZHZhbnRlY2ggUENMLTgxMi9QRywgUENMLTgxMy9CLAorICoJICAgICBBRExpbmsgQUNMLTgxMTJERy9IRy9QRywgQUNMLTgxMTMsIEFDTC04MjE2LAorICoJICAgICBJQ1AgREFTIEEtODIxUEdIL1BHTC9QR0wtTkRBLCBBLTgyMlBHSC9QR0wsIEEtODIzUEdIL1BHTCwgQS04MjZQRywKKyAqCSAgICAgSUNQIERBUyBJU08tODEzCisgKiBBdXRob3I6IE1pY2hhbCBEb2JlcyA8ZG9iZXNAdGVzbmV0LmN6PgorICogRGV2aWNlczogW0FkdmFudGVjaF0gUENMLTgxMiAocGNsODEyKSwgUENMLTgxMlBHIChwY2w4MTJwZyksCisgKglQQ0wtODEzIChwY2w4MTMpLCBQQ0wtODEzQiAocGNsODEzYiksIFtBRExpbmtdIEFDTC04MTEyREcgKGFjbDgxMTJkZyksCisgKglBQ0wtODExMkhHIChhY2w4MTEyaGcpLCBBQ0wtODExMyAoYWNsLTgxMTMpLCBBQ0wtODIxNiAoYWNsODIxNiksCisgKglbSUNQXSBJU08tODEzIChpc284MTMpLCBBLTgyMVBHSCAoYTgyMXBnaCksIEEtODIxUEdMIChhODIxcGdsKSwKKyAqCUEtODIxUEdMLU5EQSAoYTgyMXBjbG5kYSksIEEtODIyUEdIIChhODIycGdoKSwgQS04MjJQR0wgKGE4MjJwZ2wpLAorICoJQS04MjNQR0ggKGE4MjNwZ2gpLCBBLTgyM1BHTCAoYTgyM3BnbCksIEEtODI2UEcgKGE4MjZwZykKKyAqIFVwZGF0ZWQ6IE1vbiwgMDYgQXVnIDIwMDcgMTI6MDM6MTUgKzAxMDAKKyAqIFN0YXR1czogd29ya3MgKEkgaG9wZS4gTXkgYm9hcmQgZmlyZSB1cCB1bmRlciBteSBoYW5kcworICoJICAgICAgIGFuZCBJIGNhbm4ndCB0ZXN0IGFsbCBmZWF0dXJlcy4pCisgKgorICogVGhpcyBkcml2ZXIgc3VwcG9ydHMgaW5zbiBhbmQgY21kIGludGVyZmFjZXMuIFNvbWUgYm9hcmRzIHN1cHBvcnQgb25seSBpbnNuCisgKiBiZWNvdXNlIHRoZWlyIGhhcmR3YXJlIGRvbid0IGFsbG93IG1vcmUgKFBDTC04MTMvQiwgQUNMLTgxMTMsIElTTy04MTMpLgorICogRGF0YSB0cmFuc2ZlciBvdmVyIERNQSBpcyBzdXBwb3J0ZWQgb25seSB3aGVuIHlvdSBtZWFzdXJlIG9ubHkgb25lCisgKiBjaGFubmVsLCB0aGlzIGlzIHRvbyBoYXJkd2FyZSBsaW1pdGF0aW9uIG9mIHRoZXNlIGJvYXJkcy4KKyAqCisgKiBPcHRpb25zIGZvciBQQ0wtODEyOgorICogICBbMF0gLSBJTyBCYXNlCisgKiAgIFsxXSAtIElSUSAgKDA9ZGlzYWJsZSwgMiwgMywgNCwgNSwgNiwgNzsgMTAsIDExLCAxMiwgMTQsIDE1KQorICogICBbMl0gLSBETUEgICgwPWRpc2FibGUsIDEsIDMpCisgKiAgIFszXSAtIDA9dHJpZ2dlciBzb3VyY2UgaXMgaW50ZXJuYWwgODI1MyB3aXRoIDJNSHogY2xvY2sKKyAqICAgICAgICAgMT10cmlnZ2VyIHNvdXJjZSBpcyBleHRlcm5hbAorICogICBbNF0gLSAwPUEvRCBpbnB1dCByYW5nZSBpcyArLy0xMFYKKyAqCSAgIDE9QS9EIGlucHV0IHJhbmdlIGlzICsvLTVWCisgKgkgICAyPUEvRCBpbnB1dCByYW5nZSBpcyArLy0yLjVWCisgKgkgICAzPUEvRCBpbnB1dCByYW5nZSBpcyArLy0xLjI1VgorICoJICAgND1BL0QgaW5wdXQgcmFuZ2UgaXMgKy8tMC42MjVWCisgKgkgICA1PUEvRCBpbnB1dCByYW5nZSBpcyArLy0wLjMxMjVWCisgKiAgIFs1XSAtIDA9RC9BIG91dHB1dHMgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCisgKgkgICAxPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKKyAqCSAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorICoKKyAqIE9wdGlvbnMgZm9yIFBDTC04MTJQRywgQUNMLTgxMTJQRzoKKyAqICAgWzBdIC0gSU8gQmFzZQorICogICBbMV0gLSBJUlEgICgwPWRpc2FibGUsIDIsIDMsIDQsIDUsIDYsIDc7IDEwLCAxMSwgMTIsIDE0LCAxNSkKKyAqICAgWzJdIC0gRE1BICAoMD1kaXNhYmxlLCAxLCAzKQorICogICBbM10gLSAwPXRyaWdnZXIgc291cmNlIGlzIGludGVybmFsIDgyNTMgd2l0aCAyTUh6IGNsb2NrCisgKgkgICAxPXRyaWdnZXIgc291cmNlIGlzIGV4dGVybmFsCisgKiAgIFs0XSAtIDA9QS9EIGhhdmUgbWF4ICsvLTVWIGlucHV0CisgKgkgICAxPUEvRCBoYXZlIG1heCArLy0xMFYgaW5wdXQKKyAqICAgWzVdIC0gMD1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKKyAqCSAgIDE9RC9BIG91dHB1dHMgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQorICoJICAgMj1EL0Egb3V0cHV0cyB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCisgKgorICogT3B0aW9ucyBmb3IgQUNMLTgxMTJERy9IRywgQS04MjJQR0wvUEdILCBBLTgyM1BHTC9QR0gsIEFDTC04MjE2LCBBLTgyNlBHOgorICogICBbMF0gLSBJTyBCYXNlCisgKiAgIFsxXSAtIElSUSAgKDA9ZGlzYWJsZSwgMiwgMywgNCwgNSwgNiwgNzsgMTAsIDExLCAxMiwgMTQsIDE1KQorICogICBbMl0gLSBETUEgICgwPWRpc2FibGUsIDEsIDMpCisgKiAgIFszXSAtIDA9dHJpZ2dlciBzb3VyY2UgaXMgaW50ZXJuYWwgODI1MyB3aXRoIDJNSHogY2xvY2sKKyAqCSAgIDE9dHJpZ2dlciBzb3VyY2UgaXMgZXh0ZXJuYWwKKyAqICAgWzRdIC0gMD1BL0QgY2hhbm5lbHMgYXJlIFMuRS4KKyAqCSAgIDE9QS9EIGNoYW5uZWxzIGFyZSBESUZGCisgKiAgIFs1XSAtIDA9RC9BIG91dHB1dHMgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCisgKgkgICAxPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKKyAqCSAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorICoKKyAqIE9wdGlvbnMgZm9yIEEtODIxUEdML1BHSDoKKyAqICAgWzBdIC0gSU8gQmFzZQorICogICBbMV0gLSBJUlEgICgwPWRpc2FibGUsIDIsIDMsIDQsIDUsIDYsIDcpCisgKiAgIFsyXSAtIDA9QS9EIGNoYW5uZWxzIGFyZSBTLkUuCisgKgkgICAxPUEvRCBjaGFubmVscyBhcmUgRElGRgorICogICBbM10gLSAwPUQvQSBvdXRwdXQgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCisgKgkgICAxPUQvQSBvdXRwdXQgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQorICoKKyAqIE9wdGlvbnMgZm9yIEEtODIxUEdMLU5EQToKKyAqICAgWzBdIC0gSU8gQmFzZQorICogICBbMV0gLSBJUlEgICgwPWRpc2FibGUsIDIsIDMsIDQsIDUsIDYsIDcpCisgKiAgIFsyXSAtIDA9QS9EIGNoYW5uZWxzIGFyZSBTLkUuCisgKgkgICAxPUEvRCBjaGFubmVscyBhcmUgRElGRgorICoKKyAqIE9wdGlvbnMgZm9yIFBDTC04MTM6CisgKiAgIFswXSAtIElPIEJhc2UKKyAqCisgKiBPcHRpb25zIGZvciBQQ0wtODEzQjoKKyAqICAgWzBdIC0gSU8gQmFzZQorICogICBbMV0gLSAwPSBiaXBvbGFyIGlucHV0cworICoJICAgMT0gdW5pcG9sYXIgaW5wdXRzCisgKgorICogT3B0aW9ucyBmb3IgQUNMLTgxMTMsIElTTy04MTM6CisgKiAgIFswXSAtIElPIEJhc2UKKyAqICAgWzFdIC0gMD0gMTBWIGJpcG9sYXIgaW5wdXRzCisgKgkgICAxPSAxMFYgdW5pcG9sYXIgaW5wdXRzCisgKgkgICAyPSAyMFYgYmlwb2xhciBpbnB1dHMKKyAqCSAgIDM9IDIwViB1bmlwb2xhciBpbnB1dHMKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CkBAIC0xMTcsNDkgKzExOCw1MCBAQAogCiAjaW5jbHVkZSAiODI1My5oIgogCi0jdW5kZWYgUENMODEyX0VYVERFQlVHCQkvKiBpZiB0aGlzIGlzIGRlZmluZWQgdGhlbiBhIGxvdCBvZiBtZXNzYWdlcyBpcyBwcmludGVkICovCisvKiBpZiB0aGlzIGlzIGRlZmluZWQgdGhlbiBhIGxvdCBvZiBtZXNzYWdlcyBpcyBwcmludGVkICovCisjdW5kZWYgUENMODEyX0VYVERFQlVHCiAKIC8qIGhhcmR3YXJlIHR5cGVzIG9mIHRoZSBjYXJkcyAqLwotI2RlZmluZSBib2FyZFBDTDgxMlBHIAkJIDAJLyogYW5kIEFDTC04MTEyUEcgKi8KLSNkZWZpbmUgYm9hcmRQQ0w4MTNCIAkJIDEKLSNkZWZpbmUgYm9hcmRQQ0w4MTIJCSAyCi0jZGVmaW5lIGJvYXJkUENMODEzIAkJIDMKLSNkZWZpbmUgYm9hcmRJU084MTMgCQkgNQotI2RlZmluZSBib2FyZEFDTDgxMTMgCQkgNgotI2RlZmluZSBib2FyZEFDTDgxMTIgCQkgNwkvKiBBQ0wtODExMkRHL0hHLCBBLTgyMlBHTC9QR0gsIEEtODIzUEdML1BHSCAqLwotI2RlZmluZSBib2FyZEFDTDgyMTYJCSA4CS8qIGFuZCBJQ1AgREFTIEEtODI2UEcgKi8KLSNkZWZpbmUgYm9hcmRBODIxCQkgOQkvKiBQR0gsIFBHTCwgUEdML05EQSB2ZXJzaW9ucyAqLworI2RlZmluZSBib2FyZFBDTDgxMlBHCSAgICAgIDAJLyogYW5kIEFDTC04MTEyUEcgKi8KKyNkZWZpbmUgYm9hcmRQQ0w4MTNCCSAgICAgIDEKKyNkZWZpbmUgYm9hcmRQQ0w4MTIJICAgICAgMgorI2RlZmluZSBib2FyZFBDTDgxMwkgICAgICAzCisjZGVmaW5lIGJvYXJkSVNPODEzCSAgICAgIDUKKyNkZWZpbmUgYm9hcmRBQ0w4MTEzCSAgICAgIDYKKyNkZWZpbmUgYm9hcmRBQ0w4MTEyCSAgICAgIDcgLyogQUNMLTgxMTJERy9IRywgQS04MjJQR0wvUEdILCBBLTgyM1BHTC9QR0ggKi8KKyNkZWZpbmUgYm9hcmRBQ0w4MjE2CSAgICAgIDgJLyogYW5kIElDUCBEQVMgQS04MjZQRyAqLworI2RlZmluZSBib2FyZEE4MjEJICAgICAgOQkvKiBQR0gsIFBHTCwgUEdML05EQSB2ZXJzaW9ucyAqLwogCi0jZGVmaW5lIFBDTHgxeF9JT1JBTkdFIAkJMTYKKyNkZWZpbmUgUENMeDF4X0lPUkFOR0UJICAgICAxNgogCi0jZGVmaW5lIFBDTDgxMl9DVFIwCQkgMAotI2RlZmluZSBQQ0w4MTJfQ1RSMQkJIDEKLSNkZWZpbmUgUENMODEyX0NUUjIJCSAyCi0jZGVmaW5lIFBDTDgxMl9DVFJDVEwJCSAzCi0jZGVmaW5lIFBDTDgxMl9BRF9MTwkJIDQKLSNkZWZpbmUgUENMODEyX0RBMV9MTwkJIDQKLSNkZWZpbmUgUENMODEyX0FEX0hJCQkgNQotI2RlZmluZSBQQ0w4MTJfREExX0hJCQkgNQotI2RlZmluZSBQQ0w4MTJfREEyX0xPCQkgNgotI2RlZmluZSBQQ0w4MTJfRElfTE8JCSA2Ci0jZGVmaW5lIFBDTDgxMl9EQTJfSEkJCSA3Ci0jZGVmaW5lIFBDTDgxMl9ESV9ISQkJIDcKLSNkZWZpbmUgUENMODEyX0NMUklOVAkJIDgKLSNkZWZpbmUgUENMODEyX0dBSU4JCSA5Ci0jZGVmaW5lIFBDTDgxMl9NVVgJCTEwCi0jZGVmaW5lIFBDTDgxMl9NT0RFCQkxMQotI2RlZmluZSBQQ0w4MTJfQ05URU5BQkxFIAkxMAotI2RlZmluZSBQQ0w4MTJfU09GVFRSSUcgCTEyCi0jZGVmaW5lIFBDTDgxMl9ET19MTwkJMTMKLSNkZWZpbmUgUENMODEyX0RPX0hJIAkJMTQKKyNkZWZpbmUgUENMODEyX0NUUjAJICAgICAgMAorI2RlZmluZSBQQ0w4MTJfQ1RSMQkgICAgICAxCisjZGVmaW5lIFBDTDgxMl9DVFIyCSAgICAgIDIKKyNkZWZpbmUgUENMODEyX0NUUkNUTAkgICAgICAzCisjZGVmaW5lIFBDTDgxMl9BRF9MTwkgICAgICA0CisjZGVmaW5lIFBDTDgxMl9EQTFfTE8JICAgICAgNAorI2RlZmluZSBQQ0w4MTJfQURfSEkJICAgICAgNQorI2RlZmluZSBQQ0w4MTJfREExX0hJCSAgICAgIDUKKyNkZWZpbmUgUENMODEyX0RBMl9MTwkgICAgICA2CisjZGVmaW5lIFBDTDgxMl9ESV9MTwkgICAgICA2CisjZGVmaW5lIFBDTDgxMl9EQTJfSEkJICAgICAgNworI2RlZmluZSBQQ0w4MTJfRElfSEkJICAgICAgNworI2RlZmluZSBQQ0w4MTJfQ0xSSU5UCSAgICAgIDgKKyNkZWZpbmUgUENMODEyX0dBSU4JICAgICAgOQorI2RlZmluZSBQQ0w4MTJfTVVYCSAgICAgMTAKKyNkZWZpbmUgUENMODEyX01PREUJICAgICAxMQorI2RlZmluZSBQQ0w4MTJfQ05URU5BQkxFICAgICAxMAorI2RlZmluZSBQQ0w4MTJfU09GVFRSSUcJICAgICAxMgorI2RlZmluZSBQQ0w4MTJfRE9fTE8JICAgICAxMworI2RlZmluZSBQQ0w4MTJfRE9fSEkJICAgICAxNAogCi0jZGVmaW5lIFBDTDgxMl9EUkRZIAkJMHgxMAkvKiA9MCBkYXRhIHJlYWR5ICovCisjZGVmaW5lIFBDTDgxMl9EUkRZCSAgIDB4MTAJLyogPTAgZGF0YSByZWFkeSAqLwogCi0jZGVmaW5lIEFDTDgyMTZfU1RBVFVTIAkJIDgJLyogNS4gYml0IHNpZ25hbGl6ZSBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEFDTDgyMTZfU1RBVFVTCSAgICAgIDgJLyogNS4gYml0IHNpZ25hbGl6ZSBkYXRhIHJlYWR5ICovCiAKLSNkZWZpbmUgQUNMODIxNl9EUkRZIAkJMHgyMAkvKiA9MCBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEFDTDgyMTZfRFJEWQkgICAweDIwCS8qID0wIGRhdGEgcmVhZHkgKi8KIAotI2RlZmluZSBNQVhfQ0hBTkxJU1RfTEVOCTI1NgkvKiBsZW5ndGggb2Ygc2NhbiBsaXN0ICovCisjZGVmaW5lIE1BWF9DSEFOTElTVF9MRU4gICAgMjU2CS8qIGxlbmd0aCBvZiBzY2FuIGxpc3QgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX3BjbDgxMnBnX2FpID0geyA1LCB7CiAJCQkJCQkJICAgIEJJUF9SQU5HRSg1KSwKQEAgLTQwNyw3ICs0MDksMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBwY2w4MTJfYm9hcmQpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2w4MTIpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3BjbDgxMl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNsODEyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2w4MTJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2w4MTIpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfcGNsODEyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY2w4MTJfY2xlYW51cF9tb2R1bGUpOwogCiBzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgewogCkBAIC00NjYsMTAgKzQ3OSwxMyBAQAogCWludCBuOwogCWludCB0aW1lb3V0LCBoaTsKIAotCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7CS8qIHNlbGVjdCBzb2Z0d2FyZSB0cmlnZ2VyICovCi0Jc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGluc24tPmNoYW5zcGVjLCAxKTsJLyogIHNlbGVjdCBjaGFubmVsIGFuZCByZW5nZSAqLworCS8qIHNlbGVjdCBzb2Z0d2FyZSB0cmlnZ2VyICovCisJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAxLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKKwkvKiAgc2VsZWN0IGNoYW5uZWwgYW5kIHJlbmdlICovCisJc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGluc24tPmNoYW5zcGVjLCAxKTsKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJRyk7CS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KKwkJLyogc3RhcnQgY29udmVyc2lvbiAqLworCQlvdXRiKDI1NSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfU09GVFRSSUcpOwogCQl1ZGVsYXkoNSk7CiAJCXRpbWVvdXQgPSA1MDsJLyogd2FpdCBtYXggNTB1cywgaXQgbXVzdCBmaW5pc2ggdW5kZXIgMzN1cyAqLwogCQl3aGlsZSAodGltZW91dC0tKSB7CkBAIC01MDEsMTAgKzUxNywxMyBAQAogCWludCBuOwogCWludCB0aW1lb3V0OwogCi0Jb3V0YigxLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsJLyogc2VsZWN0IHNvZnR3YXJlIHRyaWdnZXIgKi8KLQlzZXR1cF9yYW5nZV9jaGFubmVsKGRldiwgcywgaW5zbi0+Y2hhbnNwZWMsIDEpOwkvKiAgc2VsZWN0IGNoYW5uZWwgYW5kIHJlbmdlICovCisJLyogc2VsZWN0IHNvZnR3YXJlIHRyaWdnZXIgKi8KKwlvdXRiKDEsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOworCS8qICBzZWxlY3QgY2hhbm5lbCBhbmQgcmVuZ2UgKi8KKwlzZXR1cF9yYW5nZV9jaGFubmVsKGRldiwgcywgaW5zbi0+Y2hhbnNwZWMsIDEpOwogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJb3V0YigyNTUsIGRldi0+aW9iYXNlICsgUENMODEyX1NPRlRUUklHKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLworCQkvKiBzdGFydCBjb252ZXJzaW9uICovCisJCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJRyk7CiAJCXVkZWxheSg1KTsKIAkJdGltZW91dCA9IDUwOwkvKiB3YWl0IG1heCA1MHVzLCBpdCBtdXN0IGZpbmlzaCB1bmRlciAzM3VzICovCiAJCXdoaWxlICh0aW1lb3V0LS0pIHsKQEAgLTU1OCw5ICs1NzcsOCBAQAogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKIAkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOwotCX0KIAogCXJldHVybiBpOwogfQpAQCAtNjA4LDE0ICs2MjYsMTUgQEAKICovCiBzdGF0aWMgdm9pZCBwY2w4MTJfY21kdGVzdF9vdXQoaW50IGUsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0JcHJpbnRrKCJwY2w4MTIgZT0lZCBzdGFydHNyYz0leCBzY2Fuc3JjPSV4IGNvbnZzcmM9JXhcbiIsIGUsCisJcHJpbnRrKEtFUk5fSU5GTyAicGNsODEyIGU9JWQgc3RhcnRzcmM9JXggc2NhbnNyYz0leCBjb252c3JjPSV4XG4iLCBlLAogCSAgICAgICBjbWQtPnN0YXJ0X3NyYywgY21kLT5zY2FuX2JlZ2luX3NyYywgY21kLT5jb252ZXJ0X3NyYyk7Ci0JcHJpbnRrKCJwY2w4MTIgZT0lZCBzdGFydGFyZz0lZCBzY2FuYXJnPSVkIGNvbnZhcmc9JWRcbiIsIGUsCisJcHJpbnRrKEtFUk5fSU5GTyAicGNsODEyIGU9JWQgc3RhcnRhcmc9JWQgc2NhbmFyZz0lZCBjb252YXJnPSVkXG4iLCBlLAogCSAgICAgICBjbWQtPnN0YXJ0X2FyZywgY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5jb252ZXJ0X2FyZyk7Ci0JcHJpbnRrKCJwY2w4MTIgZT0lZCBzdG9wc3JjPSV4IHNjYW5lbmQ9JXhcbiIsIGUsIGNtZC0+c3RvcF9zcmMsCi0JICAgICAgIGNtZC0+c2Nhbl9lbmRfc3JjKTsKLQlwcmludGsoInBjbDgxMiBlPSVkIHN0b3Bhcmc9JWQgc2NhbmVuZGFyZz0lZCBjaGFubGlzdGxlbj0lZFxuIiwgZSwKLQkgICAgICAgY21kLT5zdG9wX2FyZywgY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwlwcmludGsoS0VSTl9JTkZPICJwY2w4MTIgZT0lZCBzdG9wc3JjPSV4IHNjYW5lbmQ9JXhcbiIsIGUsCisJICAgICAgIGNtZC0+c3RvcF9zcmMsIGNtZC0+c2Nhbl9lbmRfc3JjKTsKKwlwcmludGsoS0VSTl9JTkZPICJwY2w4MTIgZT0lZCBzdG9wYXJnPSVkIHNjYW5lbmRhcmc9JWQgIgorCSAgICAgICAiY2hhbmxpc3RsZW49JWRcbiIsIGUsIGNtZC0+c3RvcF9hcmcsIGNtZC0+c2Nhbl9lbmRfYXJnLAorCSAgICAgICBjbWQtPmNoYW5saXN0X2xlbik7CiB9CiAjZW5kaWYKIApAQCAtNjQ1LDExICs2NjQsMTEgQEAKIAkJZXJyKys7CiAKIAl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOwotCWlmIChkZXZwcml2LT51c2VfZXh0X3RyZykgeworCWlmIChkZXZwcml2LT51c2VfZXh0X3RyZykKIAkJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX0VYVDsKLQl9IGVsc2UgeworCWVsc2UKIAkJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSOwotCX0KKwogCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKIAkJZXJyKys7CiAKQEAgLTY3Myw3ICs2OTIsMTAgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUKKwkgKiB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKi8KIAogCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykgewogCQljbWQtPnN0YXJ0X3NyYyA9IFRSSUdfTk9XOwpAQCAtODA3LDcgKzgyOSw3IEBACiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogQkdOOiBwY2w4MTJfYWlfY21kKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwY2w4MTIgRURCRzogQkdOOiBwY2w4MTJfYWlfY21kKC4uLilcbiIpOwogI2VuZGlmCiAKIAlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cpCkBAIC04NDIsMTMgKzg2NCwxNSBAQAogCWRldnByaXYtPmFpX25fY2hhbiA9IGNtZC0+Y2hhbmxpc3RfbGVuOwogCW1lbWNweShkZXZwcml2LT5haV9jaGFubGlzdCwgY21kLT5jaGFubGlzdCwKIAkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBjbWQtPnNjYW5fZW5kX2FyZyk7Ci0Jc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGRldnByaXYtPmFpX2NoYW5saXN0WzBdLCAxKTsJLyogIHNlbGVjdCBmaXJzdCBjaGFubmVsIGFuZCByYW5nZSAqLworCS8qICBzZWxlY3QgZmlyc3QgY2hhbm5lbCBhbmQgcmFuZ2UgKi8KKwlzZXR1cF9yYW5nZV9jaGFubmVsKGRldiwgcywgZGV2cHJpdi0+YWlfY2hhbmxpc3RbMF0sIDEpOwogCiAJaWYgKGRldnByaXYtPmRtYSkgewkvKiAgY2hlY2sgaWYgd2UgY2FuIHVzZSBETUEgdHJhbnNmZXIgKi8KIAkJZGV2cHJpdi0+YWlfZG1hID0gMTsKIAkJZm9yIChpID0gMTsgaSA8IGRldnByaXYtPmFpX25fY2hhbjsgaSsrKQogCQkJaWYgKGRldnByaXYtPmFpX2NoYW5saXN0WzBdICE9IGRldnByaXYtPmFpX2NoYW5saXN0W2ldKSB7Ci0JCQkJZGV2cHJpdi0+YWlfZG1hID0gMDsJLyogIHdlIGNhbm4ndCB1c2UgRE1BIDotKCAqLworCQkJCS8qICB3ZSBjYW5uJ3QgdXNlIERNQSA6LSggKi8KKwkJCQlkZXZwcml2LT5haV9kbWEgPSAwOwogCQkJCWJyZWFrOwogCQkJfQogCX0gZWxzZQpAQCAtODY5LDE0ICs4OTMsMTggQEAKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IDA7CiAJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKIAotCWlmICgoZGV2cHJpdi0+YWlfZmxhZ3MgJiBUUklHX1dBS0VfRU9TKSkgewkvKiAgZG9uJ3Qgd2Ugd2FudCB3YWtlIHVwIGV2ZXJ5IHNjYW4/ICovCisJLyogIGRvbid0IHdlIHdhbnQgd2FrZSB1cCBldmVyeSBzY2FuPyAqLworCWlmICgoZGV2cHJpdi0+YWlfZmxhZ3MgJiBUUklHX1dBS0VfRU9TKSkgewogCQlkZXZwcml2LT5haV9lb3MgPSAxOworCisJCS8qICBETUEgaXMgdXNlbGVzcyBmb3IgdGhpcyBzaXR1YXRpb24gKi8KIAkJaWYgKGRldnByaXYtPmFpX25fY2hhbiA9PSAxKQotCQkJZGV2cHJpdi0+YWlfZG1hID0gMDsJLyogIERNQSBpcyB1c2VsZXNzIGZvciB0aGlzIHNpdHVhdGlvbiAqLworCQkJZGV2cHJpdi0+YWlfZG1hID0gMDsKIAl9CiAKIAlpZiAoZGV2cHJpdi0+YWlfZG1hKSB7Ci0JCWlmIChkZXZwcml2LT5haV9lb3MpIHsJLyogIHdlIHVzZSBFT1MsIHNvIGFkYXB0IERNQSBidWZmZXIgdG8gb25lIHNjYW4gKi8KKwkJLyogIHdlIHVzZSBFT1MsIHNvIGFkYXB0IERNQSBidWZmZXIgdG8gb25lIHNjYW4gKi8KKwkJaWYgKGRldnByaXYtPmFpX2VvcykgewogCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPQogCQkJICAgIGRldnByaXYtPmFpX25fY2hhbiAqIHNpemVvZihzaG9ydCk7CiAJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9CkBAIC04OTQsOSArOTIyLDE3IEBACiAJCQlpZiAoZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKIAkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAxOwogCQkJfSBlbHNlIHsKLQkJCQlieXRlcyA9IGRldnByaXYtPmFpX25fY2hhbiAqIGRldnByaXYtPmFpX3NjYW5zICogc2l6ZW9mKHNob3J0KTsJLyogIGhvdyBtYW55IHNhbXBsZXMgd2UgbXVzdCB0cmFuc2Zlcj8gKi8KLQkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSBieXRlcyAvIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdOwkvKiAgaG93IG1hbnkgRE1BIHBhZ2VzIHdlIG11c3QgZmlsbCAqLwotCQkJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9IGJ5dGVzICUgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF07CS8qIG9uIGxhc3QgZG1hIHRyYW5zZmVyIG11c3QgYmUgbW92ZWQgKi8KKwkJCQkvKiAgaG93IG1hbnkgc2FtcGxlcyB3ZSBtdXN0IHRyYW5zZmVyPyAqLworCQkJCWJ5dGVzID0gZGV2cHJpdi0+YWlfbl9jaGFuICoKKwkJCQkJZGV2cHJpdi0+YWlfc2NhbnMgKiBzaXplb2Yoc2hvcnQpOworCisJCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KKwkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPQorCQkJCQlieXRlcyAvIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdOworCisJCQkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLworCQkJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9CisJCQkJCWJ5dGVzICUgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF07CiAJCQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9PSAwKQogCQkJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9CiAJCQkJCSAgICBkZXZwcml2LT5sYXN0X2RtYV9ydW47CkBAIC05MzQsMTQgKzk3MCwxMyBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoZGV2cHJpdi0+YWlfZG1hKSB7Ci0JCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7CS8qICBsZXQncyBnbyEgKi8KLQl9IGVsc2UgewotCQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDYsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwkvKiAgbGV0J3MgZ28hICovCi0JfQorCWlmIChkZXZwcml2LT5haV9kbWEpCQkJCQkvKiAgbGV0J3MgZ28hICovCisJCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7CisJZWxzZQkJCQkJCQkvKiAgbGV0J3MgZ28hICovCisJCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgNiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7CiAKICNpZmRlZiBQQ0w4MTJfRVhUREVCVUcKLQlwcmludGsoInBjbDgxMiBFREJHOiBFTkQ6IHBjbDgxMl9haV9jbWQoLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInBjbDgxMiBFREJHOiBFTkQ6IHBjbDgxMl9haV9jbWQoLi4uKVxuIik7CiAjZW5kaWYKIAogCXJldHVybiAwOwpAQCAtOTgzLDcgKzEwMTgsOCBAQAogCiAJaWYgKGVycikgewogCQlwcmludGsKLQkJICAgICgiY29tZWRpJWQ6IHBjbDgxMjogKCVzIGF0IDB4JWx4KSBBL0QgY21kIElSUSB3aXRob3V0IERSRFkhXG4iLAorCQkgICAgKCJjb21lZGklZDogcGNsODEyOiAoJXMgYXQgMHglbHgpICIKKwkJICAgICAiQS9EIGNtZCBJUlEgd2l0aG91dCBEUkRZIVxuIiwKIAkJICAgICBkZXYtPm1pbm9yLCBkZXYtPmJvYXJkX25hbWUsIGRldi0+aW9iYXNlKTsKIAkJcGNsODEyX2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CkBAIC0xMDA5LDcgKzEwNDUsOCBAQAogCWlmIChuZXh0X2NoYW4gPT0gMCkgewkvKiBvbmUgc2NhbiBkb25lICovCiAJCWRldnByaXYtPmFpX2FjdF9zY2FuKys7CiAJCWlmICghKGRldnByaXYtPmFpX25ldmVyZW5kaW5nKSkKLQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewkvKiBhbGwgZGF0YSBzYW1wbGVkICovCisJCQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7CiAJCQkJcGNsODEyX2FpX2NhbmNlbChkZXYsIHMpOwogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJCX0KQEAgLTEwMzAsMTQgKzEwNjcsMTYgQEAKIAogCXMtPmFzeW5jLT5ldmVudHMgPSAwOwogCWZvciAoaSA9IGxlbjsgaTsgaS0tKSB7Ci0JCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsJLyogIGdldCBvbmUgc2FtcGxlICovCisJCQkJCQkJLyogIGdldCBvbmUgc2FtcGxlICovCisJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsKIAogCQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKIAkJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBkZXZwcml2LT5haV9uX2NoYW4pIHsKIAkJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CiAJCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwogCQkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQkJCQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKIAkJCQkJcGNsODEyX2FpX2NhbmNlbChkZXYsIHMpOwogCQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCQkJCWJyZWFrOwpAQCAtMTA2MCw3ICsxMDk5LDcgQEAKIAlzaG9ydCAqcHRyOwogCiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogQkdOOiBpbnRlcnJ1cHRfcGNsODEyX2FpX2RtYSguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicGNsODEyIEVEQkc6IEJHTjogaW50ZXJydXB0X3BjbDgxMl9haV9kbWEoLi4uKVxuIik7CiAjZW5kaWYKIAlwdHIgPSAoc2hvcnQgKilkZXZwcml2LT5kbWFidWZbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXTsKIAlsZW4gPSAoZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSA+PiAxKSAtCkBAIC0xMDk1LDcgKzExMzQsNyBAQAogCXRyYW5zZmVyX2Zyb21fZG1hX2J1ZihkZXYsIHMsIHB0ciwgYnVmcHRyLCBsZW4pOwogCiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogRU5EOiBpbnRlcnJ1cHRfcGNsODEyX2FpX2RtYSguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicGNsODEyIEVEQkc6IEVORDogaW50ZXJydXB0X3BjbDgxMl9haV9kbWEoLi4uKVxuIik7CiAjZW5kaWYKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xMTExLDExICsxMTUwLDEwIEBACiAJCWNvbWVkaV9lcnJvcihkZXYsICJzcHVyaW91cyBpbnRlcnJ1cHQiKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KLQlpZiAoZGV2cHJpdi0+YWlfZG1hKSB7CisJaWYgKGRldnByaXYtPmFpX2RtYSkKIAkJcmV0dXJuIGludGVycnVwdF9wY2w4MTJfYWlfZG1hKGlycSwgZCk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXJldHVybiBpbnRlcnJ1cHRfcGNsODEyX2FpX2ludChpcnEsIGQpOwotCX07CiB9CiAKIC8qCkBAIC0xMTMyLDcgKzExNzAsOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQl0b3AxID0gZ2V0X2RtYV9yZXNpZHVlKGRldnByaXYtPmFpX2RtYSk7CS8qICB3aGVyZSBpcyBub3cgRE1BICovCisJCS8qICB3aGVyZSBpcyBub3cgRE1BICovCisJCXRvcDEgPSBnZXRfZG1hX3Jlc2lkdWUoZGV2cHJpdi0+YWlfZG1hKTsKIAkJdG9wMiA9IGdldF9kbWFfcmVzaWR1ZShkZXZwcml2LT5haV9kbWEpOwogCQlpZiAodG9wMSA9PSB0b3AyKQogCQkJYnJlYWs7CkBAIC0xMTQyLDggKzExODEsOCBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KLQotCXRvcDEgPSBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSAtIHRvcDE7CS8qICB3aGVyZSBpcyBub3cgRE1BIGluIGJ1ZmZlciAqLworCS8qICB3aGVyZSBpcyBub3cgRE1BIGluIGJ1ZmZlciAqLworCXRvcDEgPSBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSAtIHRvcDE7CiAJdG9wMSA+Pj0gMTsJCS8qICBzYW1wbGUgcG9zaXRpb24gKi8KIAl0b3AyID0gdG9wMSAtIGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWlmICh0b3AyIDwgMSkgewkJLyogIG5vIG5ldyBzYW1wbGVzICovCkBAIC0xMTcxLDcgKzEyMTAsOSBAQAogCQkJCXVuc2lnbmVkIGludCByYW5nZWNoYW4sIGNoYXIgd2FpdCkKIHsKIAl1bnNpZ25lZCBjaGFyIGNoYW5fcmVnID0gQ1JfQ0hBTihyYW5nZWNoYW4pOwkvKiAgbm9ybWFsIGJvYXJkICovCi0JdW5zaWduZWQgY2hhciBnYWluX3JlZyA9IENSX1JBTkdFKHJhbmdlY2hhbikgKyBkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uOwkvKiAgZ2FpbiBpbmRleCAqLworCQkJCQkJCS8qICBnYWluIGluZGV4ICovCisJdW5zaWduZWQgY2hhciBnYWluX3JlZyA9IENSX1JBTkdFKHJhbmdlY2hhbikgKworCQkJCSBkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uOwogCiAJaWYgKChjaGFuX3JlZyA9PSBkZXZwcml2LT5vbGRfY2hhbl9yZWcpCiAJICAgICYmIChnYWluX3JlZyA9PSBkZXZwcml2LT5vbGRfZ2Fpbl9yZWcpKQpAQCAtMTE4NCwyMCArMTIyNSwyNSBAQAogCQlpZiAoZGV2cHJpdi0+dXNlX2RpZmYpIHsKIAkJCWNoYW5fcmVnID0gY2hhbl9yZWcgfCAweDMwOwkvKiAgRElGRiBpbnB1dHMgKi8KIAkJfSBlbHNlIHsKLQkJCWlmIChjaGFuX3JlZyAmIDB4ODApIHsKLQkJCQljaGFuX3JlZyA9IGNoYW5fcmVnIHwgMHgyMDsJLyogIFNFIGlucHV0cyA4LTE1ICovCi0JCQl9IGVsc2UgewotCQkJCWNoYW5fcmVnID0gY2hhbl9yZWcgfCAweDEwOwkvKiAgU0UgaW5wdXRzIDAtNyAqLwotCQkJfQorCQkJaWYgKGNoYW5fcmVnICYgMHg4MCkKKwkJCQkJCQkvKiAgU0UgaW5wdXRzIDgtMTUgKi8KKwkJCQljaGFuX3JlZyA9IGNoYW5fcmVnIHwgMHgyMDsKKwkJCWVsc2UKKwkJCQkJCQkvKiAgU0UgaW5wdXRzIDAtNyAqLworCQkJCWNoYW5fcmVnID0gY2hhbl9yZWcgfCAweDEwOwogCQl9CiAJfQogCiAJb3V0YihjaGFuX3JlZywgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTVVYKTsJLyogc2VsZWN0IGNoYW5uZWwgKi8KIAlvdXRiKGdhaW5fcmVnLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9HQUlOKTsJLyogc2VsZWN0IGdhaW4gKi8KIAotCWlmICh3YWl0KSB7Ci0JCXVkZWxheShkZXZwcml2LT5tYXhfODEyX2FpX21vZGUwX3Jhbmdld2FpdCk7CS8qICBYWFggdGhpcyBkZXBlbmRzIG9uIHNlbGVjdGVkIHJhbmdlIGFuZCBjYW4gYmUgdmVyeSBsb25nIGZvciBzb21lIGhpZ2ggZ2FpbiByYW5nZXMhICovCi0JfQorCisJaWYgKHdhaXQpCisJCS8qCisJCSAqIFhYWCB0aGlzIGRlcGVuZHMgb24gc2VsZWN0ZWQgcmFuZ2UgYW5kIGNhbiBiZSB2ZXJ5IGxvbmcgZm9yCisJCSAqIHNvbWUgaGlnaCBnYWluIHJhbmdlcyEKKwkJICovCisJCXVkZWxheShkZXZwcml2LT5tYXhfODEyX2FpX21vZGUwX3Jhbmdld2FpdCk7CiB9CiAKIC8qCkBAIC0xMjA3LDggKzEyNTMsOCBAQAogCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpCiB7CiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogQkdOOiBzdGFydF9wYWNlciglZCwldSwldSlcbiIsIG1vZGUsIGRpdmlzb3IxLAotCSAgICAgICBkaXZpc29yMik7CisJcHJpbnRrKEtFUk5fREVCVUcgInBjbDgxMiBFREJHOiBCR046IHN0YXJ0X3BhY2VyKCVkLCV1LCV1KVxuIiwgbW9kZSwKKwkgICAgICAgZGl2aXNvcjEsIGRpdmlzb3IyKTsKICNlbmRpZgogCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSQ1RMKTsKIAlvdXRiKDB4NzQsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkNUTCk7CkBAIC0xMjIxLDcgKzEyNjcsNyBAQAogCQlvdXRiKChkaXZpc29yMSA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUjEpOwogCX0KICNpZmRlZiBQQ0w4MTJfRVhUREVCVUcKLQlwcmludGsoInBjbDgxMiBFREJHOiBFTkQ6IHN0YXJ0X3BhY2VyKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwY2w4MTIgRURCRzogRU5EOiBzdGFydF9wYWNlciguLi4pXG4iKTsKICNlbmRpZgogfQogCkBAIC0xMjUyLDE2ICsxMjk4LDE3IEBACiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogQkdOOiBwY2w4MTJfYWlfY2FuY2VsKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwY2w4MTIgRURCRzogQkdOOiBwY2w4MTJfYWlfY2FuY2VsKC4uLilcbiIpOwogI2VuZGlmCiAJaWYgKGRldnByaXYtPmFpX2RtYSkKIAkJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0Jb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsJLyogU3RvcCBBL0QgKi8KKwkJCQkJCQkvKiBTdG9wIEEvRCAqLworCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7CiAJc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7CS8qICBzdG9wIDgyNTQgKi8KIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogRU5EOiBwY2w4MTJfYWlfY2FuY2VsKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwY2w4MTIgRURCRzogRU5EOiBwY2w4MTJfYWlfY2FuY2VsKC4uLilcbiIpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjcyLDcgKzEzMTksNyBAQAogc3RhdGljIHZvaWQgcGNsODEyX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAjaWZkZWYgUENMODEyX0VYVERFQlVHCi0JcHJpbnRrKCJwY2w4MTIgRURCRzogQkdOOiBwY2w4MTJfcmVzZXQoLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInBjbDgxMiBFREJHOiBCR046IHBjbDgxMl9yZXNldCguLi4pXG4iKTsKICNlbmRpZgogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTVVYKTsKIAlvdXRiKDAgKyBkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9HQUlOKTsKQEAgLTEzMDQsNyArMTM1MSw3IEBACiAJfQogCXVkZWxheSg1KTsKICNpZmRlZiBQQ0w4MTJfRVhUREVCVUcKLQlwcmludGsoInBjbDgxMiBFREJHOiBFTkQ6IHBjbDgxMl9yZXNldCguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicGNsODEyIEVEQkc6IEVORDogcGNsODEyX3Jlc2V0KC4uLilcbiIpOwogI2VuZGlmCiB9CiAKQEAgLTEzMjIsOCArMTM2OSw4IEBACiAJaW50IG5fc3ViZGV2aWNlczsKIAogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwotCXByaW50aygiY29tZWRpJWQ6IHBjbDgxMjogIGJvYXJkPSVzLCBpb3BvcnQ9MHglMDNseCIsIGRldi0+bWlub3IsCi0JICAgICAgIHRoaXNfYm9hcmQtPm5hbWUsIGlvYmFzZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjbDgxMjogIGJvYXJkPSVzLCBpb3BvcnQ9MHglMDNseCIsCisJICAgICAgIGRldi0+bWlub3IsIHRoaXNfYm9hcmQtPm5hbWUsIGlvYmFzZSk7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgdGhpc19ib2FyZC0+aW9fcmFuZ2UsICJwY2w4MTIiKSkgewogCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKQEAgLTEzNDUsMTggKzEzOTIsMTggQEAKIAkJaWYgKGlycSkgewkvKiB3ZSB3YW50IHRvIHVzZSBJUlEgKi8KIAkJCWlmICgoKDEgPDwgaXJxKSAmIHRoaXNfYm9hcmQtPklSUWJpdHMpID09IDApIHsKIAkJCQlwcmludGsKLQkJCQkgICAgKCIsIElSUSAldSBpcyBvdXQgb2YgYWxsb3dlZCByYW5nZSwgRElTQUJMSU5HIElUIiwKLQkJCQkgICAgIGlycSk7CisJCQkJICAgICgiLCBJUlEgJXUgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsICIKKwkJCQkgICAgICJESVNBQkxJTkcgSVQiLCBpcnEpOwogCQkJCWlycSA9IDA7CS8qIEJhZCBJUlEgKi8KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHJlcXVlc3RfaXJxCiAJCQkJICAgIChpcnEsIGludGVycnVwdF9wY2w4MTIsIDAsICJwY2w4MTIiLCBkZXYpKSB7CiAJCQkJCXByaW50awotCQkJCQkgICAgKCIsIHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIERJU0FCTElORyBJVCIsCi0JCQkJCSAgICAgaXJxKTsKKwkJCQkJICAgICgiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCAiCisJCQkJCSAgICAgIkRJU0FCTElORyBJVCIsIGlycSk7CiAJCQkJCWlycSA9IDA7CS8qIENhbid0IHVzZSBJUlEgKi8KIAkJCQl9IGVsc2UgewotCQkJCQlwcmludGsoIiwgaXJxPSV1IiwgaXJxKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiLCBpcnE9JXUiLCBpcnEpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTM3NiwxNiArMTQyMywyMCBAQAogCQl9CiAJCXJldCA9IHJlcXVlc3RfZG1hKGRtYSwgInBjbDgxMiIpOwogCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoIiwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQSAldSwgRkFJTCFcbiIsIGRtYSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQSAldSwgRkFJTCFcbiIsCisJCQkgICAgICAgZG1hKTsKIAkJCXJldHVybiAtRUJVU1k7CS8qIERNQSBpc24ndCBmcmVlICovCiAJCX0KIAkJZGV2cHJpdi0+ZG1hID0gZG1hOwotCQlwcmludGsoIiwgZG1hPSV1IiwgZG1hKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLCBkbWE9JXUiLCBkbWEpOwogCQlwYWdlcyA9IDE7CS8qIHdlIHdhbnQgOEtCICovCiAJCWRldnByaXYtPmRtYWJ1ZlswXSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlcyk7CiAJCWlmICghZGV2cHJpdi0+ZG1hYnVmWzBdKSB7CiAJCQlwcmludGsoIiwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKLQkJCS8qIG1heWJlIGV4cGVyaW1lbnQgd2l0aCB0cnlfdG9fZnJlZV9wYWdlcygpIHdpbGwgaGVscCAuLi4uICovCisJCQkvKgorCQkJICogbWF5YmUgZXhwZXJpbWVudCB3aXRoIHRyeV90b19mcmVlX3BhZ2VzKCkKKwkJCSAqIHdpbGwgaGVscCAuLi4uCisJCQkgKi8KIAkJCWZyZWVfcmVzb3VyY2VzKGRldik7CiAJCQlyZXR1cm4gLUVCVVNZOwkvKiBubyBidWZmZXIgOi0oICovCiAJCX0KQEAgLTEzOTQsNyArMTQ0NSw3IEBACiAJCWRldnByaXYtPmh3ZG1hc2l6ZVswXSA9IFBBR0VfU0laRSAqICgxIDw8IHBhZ2VzKTsKIAkJZGV2cHJpdi0+ZG1hYnVmWzFdID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VzKTsKIAkJaWYgKCFkZXZwcml2LT5kbWFidWZbMV0pIHsKLQkJCXByaW50aygiLCB1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciwgRkFJTCFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIsIHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyLCBGQUlMIVxuIik7CiAJCQlmcmVlX3Jlc291cmNlcyhkZXYpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQpAQCAtMTQ1NywxMSArMTUwOCwxMSBAQAogCQlzLT5tYXhkYXRhID0gdGhpc19ib2FyZC0+YWlfbWF4ZGF0YTsKIAkJcy0+bGVuX2NoYW5saXN0ID0gTUFYX0NIQU5MSVNUX0xFTjsKIAkJcy0+cmFuZ2VfdGFibGUgPSB0aGlzX2JvYXJkLT5yYW5nZWxpc3RfYWk7Ci0JCWlmICh0aGlzX2JvYXJkLT5ib2FyZF90eXBlID09IGJvYXJkQUNMODIxNikgeworCQlpZiAodGhpc19ib2FyZC0+Ym9hcmRfdHlwZSA9PSBib2FyZEFDTDgyMTYpCiAJCQlzLT5pbnNuX3JlYWQgPSBhY2w4MjE2X2FpX2luc25fcmVhZDsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcy0+aW5zbl9yZWFkID0gcGNsODEyX2FpX2luc25fcmVhZDsKLQkJfQorCiAJCWRldnByaXYtPnVzZV9NUEMgPSB0aGlzX2JvYXJkLT5oYXZlTVBDNTA4OwogCQlzLT5jYW5jZWwgPSBwY2w4MTJfYWlfY2FuY2VsOwogCQlpZiAoZGV2LT5pcnEpIHsKQEAgLTE1MDAsOCArMTU1MSw4IEBACiAJCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOwogCQkJCWJyZWFrOwogCQkJCXByaW50awotCQkJCSAgICAoIiwgaW5jb3JyZWN0IHJhbmdlIG51bWJlciAlZCwgY2hhbmdpbmcgdG8gMCAoKy8tMTBWKSIsCi0JCQkJICAgICBpdC0+b3B0aW9uc1s0XSk7CisJCQkJICAgICgiLCBpbmNvcnJlY3QgcmFuZ2UgbnVtYmVyICVkLCBjaGFuZ2luZyAiCisJCQkJICAgICAidG8gMCAoKy8tMTBWKSIsIGl0LT5vcHRpb25zWzRdKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTUzMCw4ICsxNTgxLDggQEAKIAkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV9haTsKIAkJCQlicmVhazsKIAkJCQlwcmludGsKLQkJCQkgICAgKCIsIGluY29ycmVjdCByYW5nZSBudW1iZXIgJWQsIGNoYW5naW5nIHRvIDAgIiwKLQkJCQkgICAgIGl0LT5vcHRpb25zWzFdKTsKKwkJCQkgICAgKCIsIGluY29ycmVjdCByYW5nZSBudW1iZXIgJWQsICIKKwkJCQkgICAgICJjaGFuZ2luZyB0byAwICIsIGl0LT5vcHRpb25zWzFdKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTU1NSw4ICsxNjA2LDggQEAKIAkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfYWk7CiAJCQkJYnJlYWs7CiAJCQkJcHJpbnRrCi0JCQkJICAgICgiLCBpbmNvcnJlY3QgcmFuZ2UgbnVtYmVyICVkLCBjaGFuZ2luZyB0byAwICIsCi0JCQkJICAgICBpdC0+b3B0aW9uc1sxXSk7CisJCQkJICAgICgiLCBpbmNvcnJlY3QgcmFuZ2UgbnVtYmVyICVkLCAiCisJCQkJICAgICAiY2hhbmdpbmcgdG8gMCAiLCBpdC0+b3B0aW9uc1sxXSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE2MjcsNyArMTY3OCw4IEBACiAJY2FzZSBib2FyZEFDTDgxMTI6CiAJCWRldnByaXYtPm1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0ID0gMTsKIAkJaWYgKGl0LT5vcHRpb25zWzNdID4gMCkKLQkJCWRldnByaXYtPnVzZV9leHRfdHJnID0gMTsJLyogIHdlIHVzZSBleHRlcm5hbCB0cmlnZ2VyICovCisJCQkJCQkvKiAgd2UgdXNlIGV4dGVybmFsIHRyaWdnZXIgKi8KKwkJCWRldnByaXYtPnVzZV9leHRfdHJnID0gMTsKIAljYXNlIGJvYXJkQTgyMToKIAkJZGV2cHJpdi0+bWF4XzgxMl9haV9tb2RlMF9yYW5nZXdhaXQgPSAxOwogCQlkZXZwcml2LT5tb2RlX3JlZ19pbnQgPSAoaXJxIDw8IDQpICYgMHhmMDsKQEAgLTE2MzYsMTEgKzE2ODgsMTIgQEAKIAljYXNlIGJvYXJkUENMODEzOgogCWNhc2UgYm9hcmRJU084MTM6CiAJY2FzZSBib2FyZEFDTDgxMTM6Ci0JCWRldnByaXYtPm1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0ID0gNTsJLyogbWF5YmUgdGhlcmUgbXVzdCBieSBncmVhdGVzdCB0aW1lb3V0ICovCisJCS8qIG1heWJlIHRoZXJlIG11c3QgYnkgZ3JlYXRlc3QgdGltZW91dCAqLworCQlkZXZwcml2LT5tYXhfODEyX2FpX21vZGUwX3Jhbmdld2FpdCA9IDU7CiAJCWJyZWFrOwogCX0KIAotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCWRldnByaXYtPnZhbGlkID0gMTsKIAogCXBjbDgxMl9yZXNldChkZXYpOwpAQCAtMTY1NSw4ICsxNzA4LDEyIEBACiB7CiAKICNpZmRlZiBQQ0w4MTJfRVhUREVCVUcKLQlwcmludGsoImNvbWVkaSVkOiBwY2w4MTI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaSVkOiBwY2w4MTI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAjZW5kaWYKIAlmcmVlX3Jlc291cmNlcyhkZXYpOwogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKaW5kZXggNzFjMmEzYS4uM2QwZjAxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwpAQCAtMiw3ICsyLDcgQEAKICAgIGNvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCiAKICAgIEF1dGhvcjogIEp1YW4gR3JpZ2VyYSA8anVhbkBncmlnZXJhLmNvbS5hcj4KLSAgICAgICAgICAgIGJhc2VkIG9uIHBjbDgxOCBieSBNaWNoYWwgRG9iZXMgPGRvYmVzQHRlc25ldC5jej4gYW5kIGJpdHMgb2YgcGNsODEyCisJICAgIGJhc2VkIG9uIHBjbDgxOCBieSBNaWNoYWwgRG9iZXMgPGRvYmVzQHRlc25ldC5jej4gYW5kIGJpdHMgb2YgcGNsODEyCiAKICAgIGhhcmR3YXJlIGRyaXZlciBmb3IgQWR2YW50ZWNoIGNhcmRzOgogICAgIGNhcmQ6ICAgUENMLTgxNiwgUENMODE0QgpAQCAtMjgsNyArMjgsNyBAQAogICBbMV0gLSBJUlEJKDA9ZGlzYWJsZSwgMiwgMywgNCwgNSwgNiwgNykKICAgWzJdIC0gRE1BCSgwPWRpc2FibGUsIDEsIDMpCiAgIFszXSAtIDAsIDEwPTEwTUh6IGNsb2NrIGZvciA4MjU0Ci0gICAgICAgICAgICAxPSAxTUh6IGNsb2NrIGZvciA4MjU0CisJICAgIDE9IDFNSHogY2xvY2sgZm9yIDgyNTQKIAogKi8KIApAQCAtODUsNyArODUsNyBAQAogI2RlZmluZSBJTlRfVFlQRV9BSTNfRE1BX1JUQyAxMAogCiAvKiBSVEMgc3R1ZmYuLi4gKi8KLSNkZWZpbmUgUlRDX0lSUSAJOAorI2RlZmluZSBSVENfSVJRCQk4CiAjZGVmaW5lIFJUQ19JT19FWFRFTlQJMHgxMAogI2VuZGlmCiAKQEAgLTE2OCw3ICsxNjgsMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBwY2w4MTZfYm9hcmQpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY2w4MTYpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3BjbDgxNl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcGNsODE2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY2w4MTZfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY2w4MTYpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfcGNsODE2X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY2w4MTZfY2xlYW51cF9tb2R1bGUpOwogCiBzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgewogCkBAIC0yNTMsNyArMjY0LDggQEAKIAogCS8qICBTZXQgdGhlIGlucHV0IGNoYW5uZWwgKi8KIAlvdXRiKENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpICYgMHhmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCW91dGIoQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9SQU5HRSk7CS8qIHNlbGVjdCBnYWluICovCisJLyogc2VsZWN0IGdhaW4gKi8KKwlvdXRiKENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOwogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCkBAIC0yNjgsOCArMjgwLDggQEAKIAkJCQkgICAgKChpbmIoZGV2LT5pb2Jhc2UgKwogCQkJCQkgIFBDTDgxNl9BRF9ISSkgPDwgOCkgfAogCQkJCSAgICAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9MTykpKTsKLQotCQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLworCQkJCS8qIGNsZWFyIElOVCAoY29udmVyc2lvbiBlbmQpIGZsYWcgKi8KKwkJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQl1ZGVsYXkoMSk7CkBAIC0yNzgsNyArMjkwLDggQEAKIAkJaWYgKCF0aW1lb3V0KSB7CiAJCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dFxuIik7CiAJCQlkYXRhWzBdID0gMDsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLworCQkJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLworCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIApAQCAtMzMyLDcgKzM0NSw4IEBACiAJfQogCiAJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7CS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKIAkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KIAkJCXBjbDgxNl9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKQEAgLTM2OSw3ICszODMsOCBAQAogCQl9CiAKIAkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewkvKiAgYWxsIGRhdGEgc2FtcGxlZCAqLworCQkJCQkJLyogIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewogCQkJCXBjbDgxNl9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CkBAIC0zOTEsNyArNDA2LDggQEAKIAlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwogCXRoaXNfZG1hX2J1ZiA9IGRldnByaXYtPm5leHRfZG1hX2J1ZjsKIAotCWlmICgoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID4gLTEpIHx8IGRldnByaXYtPmFpX25ldmVyZW5kaW5nKSB7CS8qICBzd2l0Y2ggZG1hIGJ1ZnMgKi8KKwkvKiAgc3dpdGNoIGRtYSBidWZzICovCisJaWYgKChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPiAtMSkgfHwgZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKIAogCQlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOwogCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKQEAgLTQ2NywxNCArNDgzLDE0IEBACiAqLwogc3RhdGljIHZvaWQgcGNsODE2X2NtZHRlc3Rfb3V0KGludCBlLCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCXByaW50aygicGNsODE2IGU9JWQgc3RhcnRzcmM9JXggc2NhbnNyYz0leCBjb252c3JjPSV4XG4iLCBlLAorCXByaW50ayhLRVJOX0lORk8gInBjbDgxNiBlPSVkIHN0YXJ0c3JjPSV4IHNjYW5zcmM9JXggY29udnNyYz0leFxuIiwgZSwKIAkgICAgICAgY21kLT5zdGFydF9zcmMsIGNtZC0+c2Nhbl9iZWdpbl9zcmMsIGNtZC0+Y29udmVydF9zcmMpOwotCXByaW50aygicGNsODE2IGU9JWQgc3RhcnRhcmc9JWQgc2NhbmFyZz0lZCBjb252YXJnPSVkXG4iLCBlLAorCXByaW50ayhLRVJOX0lORk8gInBjbDgxNiBlPSVkIHN0YXJ0YXJnPSVkIHNjYW5hcmc9JWQgY29udmFyZz0lZFxuIiwgZSwKIAkgICAgICAgY21kLT5zdGFydF9hcmcsIGNtZC0+c2Nhbl9iZWdpbl9hcmcsIGNtZC0+Y29udmVydF9hcmcpOwotCXByaW50aygicGNsODE2IGU9JWQgc3RvcHNyYz0leCBzY2FuZW5kPSV4XG4iLCBlLCBjbWQtPnN0b3Bfc3JjLAotCSAgICAgICBjbWQtPnNjYW5fZW5kX3NyYyk7Ci0JcHJpbnRrKCJwY2w4MTYgZT0lZCBzdG9wYXJnPSVkIHNjYW5lbmRhcmc9JWQgY2hhbmxpc3RsZW49JWRcbiIsIGUsCi0JICAgICAgIGNtZC0+c3RvcF9hcmcsIGNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJcHJpbnRrKEtFUk5fSU5GTyAicGNsODE2IGU9JWQgc3RvcHNyYz0leCBzY2FuZW5kPSV4XG4iLCBlLAorCSAgICAgICBjbWQtPnN0b3Bfc3JjLCBjbWQtPnNjYW5fZW5kX3NyYyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicGNsODE2IGU9JWQgc3RvcGFyZz0lZCBzY2FuZW5kYXJnPSVkIGNoYW5saXN0bGVuPSVkXG4iLAorCSAgICAgICBlLCBjbWQtPnN0b3BfYXJnLCBjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwogfQogCiAvKgpAQCAtNDg2LDggKzUwMiw5IEBACiAJaW50IGVyciA9IDA7CiAJaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKLQlERUJVRyhwcmludGsoInBjbDgxNiBwY2w4MTJfYWlfY21kdGVzdFxuIik7IHBjbDgxNl9jbWR0ZXN0X291dCgtMSwgY21kKTsKLQkgICAgKTsKKwlERUJVRyhwcmludGsoS0VSTl9JTkZPICJwY2w4MTYgcGNsODEyX2FpX2NtZHRlc3RcbiIpOworCSAgICAgIHBjbDgxNl9jbWR0ZXN0X291dCgtMSwgY21kKTsKKwkgICAgICk7CiAKIAkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCXRtcCA9IGNtZC0+c3RhcnRfc3JjOwpAQCAtNTE1LDExICs1MzIsMTQgQEAKIAlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCiAJCWVycisrOwogCi0JaWYgKGVycikgeworCWlmIChlcnIpCiAJCXJldHVybiAxOwotCX0KIAotCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcworCSAqIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKi8KIAogCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykgewogCQljbWQtPnN0YXJ0X3NyYyA9IFRSSUdfTk9XOwpAQCAtNTQ0LDkgKzU2NCw5IEBACiAJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCkKIAkJZXJyKys7CiAKLQlpZiAoZXJyKSB7CisJaWYgKGVycikKIAkJcmV0dXJuIDI7Ci0JfQorCiAKIAkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCiAJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKQEAgLTU4Niw5ICs2MDYsOSBAQAogCQl9CiAJfQogCi0JaWYgKGVycikgeworCWlmIChlcnIpCiAJCXJldHVybiAzOwotCX0KKwogCiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKQEAgLTYwMyw5ICs2MjMsOSBAQAogCQkJZXJyKys7CiAJfQogCi0JaWYgKGVycikgeworCWlmIChlcnIpCiAJCXJldHVybiA0OwotCX0KKwogCiAJLyogc3RlcCA1OiBjb21wbGFpbiBhYm91dCBzcGVjaWFsIGNoYW5saXN0IGNvbnNpZGVyYXRpb25zICovCiAKQEAgLTY0Myw3ICs2NjMsOSBAQAogCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKHRoaXNfYm9hcmQtPmk4MjU0X29zY19iYXNlLCAmZGl2aXNvcjEsCiAJCQkJCSAgJmRpdmlzb3IyLCAmY21kLT5jb252ZXJ0X2FyZywKIAkJCQkJICBjbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKLQkJaWYgKGRpdmlzb3IxID09IDEpIHsJLyogIFBDTDgxNiBjcmFzaCBpZiBhbnkgZGl2aXNvciBpcyBzZXQgdG8gMSAqLworCisJCS8qICBQQ0w4MTYgY3Jhc2ggaWYgYW55IGRpdmlzb3IgaXMgc2V0IHRvIDEgKi8KKwkJaWYgKGRpdmlzb3IxID09IDEpIHsKIAkJCWRpdmlzb3IxID0gMjsKIAkJCWRpdmlzb3IyIC89IDI7CiAJCX0KQEAgLTY3Niw4ICs2OTgsMTAgQEAKIAkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAxOwogCX0KIAotCWlmICgoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpKSB7CS8qICBkb24ndCB3ZSB3YW50IHdha2UgdXAgZXZlcnkgc2Nhbj8gKi8KLQkJcHJpbnRrKCJwbDgxNjogWW91IHdhbmt0IFdBS0VfRU9TIGJ1dCBJIGRvbnQgd2FudCBoYW5kbGUgaXQiKTsKKwkvKiAgZG9uJ3Qgd2Ugd2FudCB3YWtlIHVwIGV2ZXJ5IHNjYW4/ICovCisJaWYgKChjbWQtPmZsYWdzICYgVFJJR19XQUtFX0VPUykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInBsODE2OiBZb3Ugd2Fua3QgV0FLRV9FT1MgYnV0IEkgZG9udCB3YW50IGhhbmRsZSBpdCIpOwogCQkvKiAgICAgICAgICAgICAgIGRldnByaXYtPmFpX2Vvcz0xOyAqLwogCQkvKiBpZiAoZGV2cHJpdi0+YWlfbl9jaGFuPT0xKSAqLwogCQkvKiAgICAgICBkZXZwcml2LT5kbWE9MDsgLy8gRE1BIGlzIHVzZWxlc3MgZm9yIHRoaXMgc2l0dWF0aW9uICovCkBAIC02ODYsOSArNzEwLDE3IEBACiAJaWYgKGRldnByaXYtPmRtYSkgewogCQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKIAkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykgewotCQkJYnl0ZXMgPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqIHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKHNob3J0KTsJLyogIGhvdyBtYW55ICovCi0JCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSBieXRlcyAvIGRldnByaXYtPmh3ZG1hc2l6ZVswXTsJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KLQkJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9IGJ5dGVzICUgZGV2cHJpdi0+aHdkbWFzaXplWzBdOwkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCisJCQkvKiAgaG93IG1hbnkgKi8KKwkJCWJ5dGVzID0gcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgorCQkJcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgorCQkJc2l6ZW9mKHNob3J0KTsKKworCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KKwkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IGJ5dGVzIC8KKwkJCWRldnByaXYtPmh3ZG1hc2l6ZVswXTsKKworCQkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLworCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0gYnl0ZXMgJSBkZXZwcml2LT5od2RtYXNpemVbMF07CiAJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKIAkJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPj0gMCkKIAkJCQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKQEAgLTcxMSwxNCArNzQzLDIyIEBACiAJc3dpdGNoIChjbWQtPmNvbnZlcnRfc3JjKSB7CiAJY2FzZSBUUklHX1RJTUVSOgogCQlkZXZwcml2LT5pbnQ4MTZfbW9kZSA9IElOVF9UWVBFX0FJMV9ETUE7Ci0JCW91dGIoMHgzMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CS8qICBQYWNlcitJUlErRE1BICovCi0JCW91dGIoZG1haXJxLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVMpOwkvKiAgd3JpdGUgaXJxIGFuZCBETUEgdG8gY2FyZCAqLworCisJCS8qICBQYWNlcitJUlErRE1BICovCisJCW91dGIoMHgzMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CisKKwkJLyogIHdyaXRlIGlycSBhbmQgRE1BIHRvIGNhcmQgKi8KKwkJb3V0YihkbWFpcnEsIGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVUyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJZGV2cHJpdi0+aW50ODE2X21vZGUgPSBJTlRfVFlQRV9BSTNfRE1BOwotCQlvdXRiKDB4MzQsIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwkvKiAgRXh0IHRyaWcrSVJRK0RNQSAqLwotCQlvdXRiKGRtYWlycSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTKTsJLyogIHdyaXRlIGlycSB0byBjYXJkICovCisKKwkJLyogIEV4dCB0cmlnK0lSUStETUEgKi8KKwkJb3V0YigweDM0LCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsKKworCQkvKiAgd3JpdGUgaXJxIHRvIGNhcmQgKi8KKwkJb3V0YihkbWFpcnEsIGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVUyk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzQ3LDcgKzc4Nyw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCXRvcDEgPSBkZXZwcml2LT5od2RtYXNpemVbMF0gLSB0b3AxOwkvKiAgd2hlcmUgaXMgbm93IERNQSBpbiBidWZmZXIgKi8KKwkvKiAgd2hlcmUgaXMgbm93IERNQSBpbiBidWZmZXIgKi8KKwl0b3AxID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdIC0gdG9wMTsKIAl0b3AxID4+PSAxOwkJLyogIHNhbXBsZSBwb3NpdGlvbiAqLwogCXRvcDIgPSB0b3AxIC0gZGV2cHJpdi0+YWlfcG9sbF9wdHI7CiAJaWYgKHRvcDIgPCAxKSB7CQkvKiAgbm8gbmV3IHNhbXBsZXMgKi8KQEAgLTc4NywxNiArODI4LDIzIEBACiAJCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwogCQljYXNlIElOVF9UWVBFX0FJMV9JTlQ6CiAJCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJCW91dGIoaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpICYgMHg3MywgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CS8qIFN0b3AgQS9EICovCisJCQlvdXRiKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKSAmIDB4NzMsCisJCQkgICAgIGRldi0+aW9iYXNlICsgUENMODE2X0NPTlRST0wpOwkvKiBTdG9wIEEvRCAqLwogCQkJdWRlbGF5KDEpOwogCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KLQkJCW91dGIoMHhiMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsJLyogU3RvcCBwYWNlciAqLworCisJCQkvKiBTdG9wIHBhY2VyICovCisJCQlvdXRiKDB4YjAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7CiAJCQlvdXRiKDB4NzAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7CiAJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsKIAkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9MTyk7CiAJCQlpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQURfSEkpOwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KKworCQkJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KKwkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsKKworCQkJLyogU3RvcCBBL0QgKi8KKwkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CiAJCQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7CiAJCQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSBkZXZwcml2LT5pbnQ4MTZfbW9kZTsKIAkJCWRldnByaXYtPmludDgxNl9tb2RlID0gMDsKQEAgLTg2Niw4ICs5MTQsMTEgQEAKIAlvdXRiKDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjApOwogCW91dGIoMHgwMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSMCk7CiAJdWRlbGF5KDEpOwotCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsJLyogIHNldCBjb3VudGVyIDIgYXMgbW9kZSAzICovCi0Jb3V0YigweDc0LCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwkvKiAgc2V0IGNvdW50ZXIgMSBhcyBtb2RlIDMgKi8KKworCS8qICBzZXQgY291bnRlciAyIGFzIG1vZGUgMyAqLworCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKKwkvKiAgc2V0IGNvdW50ZXIgMSBhcyBtb2RlIDMgKi8KKwlvdXRiKDB4NzQsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7CiAJdWRlbGF5KDEpOwogCiAJaWYgKG1vZGUgPT0gMSkgewpAQCAtOTAzLDQxICs5NTQsNTEgQEAKIAl9CiAKIAlpZiAoY2hhbmxlbiA+IDEpIHsKLQkJY2hhbnNlZ21lbnRbMF0gPSBjaGFubGlzdFswXTsJLyogIGZpcnN0IGNoYW5uZWwgaXMgZXZlcnl0aW1lIG9rICovCisJCS8qICBmaXJzdCBjaGFubmVsIGlzIGV2ZXJ5dGltZSBvayAqLworCQljaGFuc2VnbWVudFswXSA9IGNoYW5saXN0WzBdOwogCQlmb3IgKGkgPSAxLCBzZWdsZW4gPSAxOyBpIDwgY2hhbmxlbjsgaSsrLCBzZWdsZW4rKykgewogCQkJLyogIGJ1aWxkIHBhcnQgb2YgY2hhbmxpc3QgKi8KLQkJCURFQlVHKHByaW50aygiJWQuICVkICVkXG4iLCBpLCBDUl9DSEFOKGNoYW5saXN0W2ldKSwKKwkJCURFQlVHKHByaW50ayhLRVJOX0lORk8gIiVkLiAlZCAlZFxuIiwgaSwKKwkJCQkgICAgIENSX0NIQU4oY2hhbmxpc3RbaV0pLAogCQkJCSAgICAgQ1JfUkFOR0UoY2hhbmxpc3RbaV0pKTspCisKKwkJCS8qICB3ZSBkZXRlY3QgbG9vcCwgdGhpcyBtdXN0IGJ5IGZpbmlzaCAqLwogCQkJICAgIGlmIChjaGFubGlzdFswXSA9PSBjaGFubGlzdFtpXSkKLQkJCQlicmVhazsJLyogIHdlIGRldGVjdCBsb29wLCB0aGlzIG11c3QgYnkgZmluaXNoICovCisJCQkJYnJlYWs7CiAJCQlub3dtdXN0YmVjaGFuID0KIAkJCSAgICAoQ1JfQ0hBTihjaGFuc2VnbWVudFtpIC0gMV0pICsgMSkgJSBjaGFubGVuOwogCQkJaWYgKG5vd211c3RiZWNoYW4gIT0gQ1JfQ0hBTihjaGFubGlzdFtpXSkpIHsKIAkJCQkvKiAgY2hhbm5lbCBsaXN0IGlzbid0IGNvbnRpbm91cyA6LSggKi8KLQkJCQlwcmludGsKLQkJCQkgICAgKCJjb21lZGklZDogcGNsODE2OiBjaGFubmVsIGxpc3QgbXVzdCBiZSBjb250aW5vdXMhIGNoYW5saXN0WyVpXT0lZCBidXQgbXVzdCBiZSAlZCBvciAlZCFcbiIsCi0JCQkJICAgICBkZXYtPm1pbm9yLCBpLCBDUl9DSEFOKGNoYW5saXN0W2ldKSwKLQkJCQkgICAgIG5vd211c3RiZWNoYW4sIENSX0NIQU4oY2hhbmxpc3RbMF0pKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJjb21lZGklZDogcGNsODE2OiBjaGFubmVsIGxpc3QgbXVzdCAiCisJCQkJICAgICAgICJiZSBjb250aW5vdXMhIGNoYW5saXN0WyVpXT0lZCBidXQgIgorCQkJCSAgICAgICAibXVzdCBiZSAlZCBvciAlZCFcbiIsIGRldi0+bWlub3IsCisJCQkJICAgICAgIGksIENSX0NIQU4oY2hhbmxpc3RbaV0pLCBub3dtdXN0YmVjaGFuLAorCQkJCSAgICAgICBDUl9DSEFOKGNoYW5saXN0WzBdKSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQljaGFuc2VnbWVudFtpXSA9IGNoYW5saXN0W2ldOwkvKiAgd2VsbCwgdGhpcyBpcyBuZXh0IGNvcnJlY3QgY2hhbm5lbCBpbiBsaXN0ICovCisJCQkvKiAgd2VsbCwgdGhpcyBpcyBuZXh0IGNvcnJlY3QgY2hhbm5lbCBpbiBsaXN0ICovCisJCQljaGFuc2VnbWVudFtpXSA9IGNoYW5saXN0W2ldOwogCQl9CiAKLQkJZm9yIChpID0gMCwgc2VncG9zID0gMDsgaSA8IGNoYW5sZW47IGkrKykgewkvKiAgY2hlY2sgd2hvbGUgY2hhbmxpc3QgKi8KKwkJLyogIGNoZWNrIHdob2xlIGNoYW5saXN0ICovCisJCWZvciAoaSA9IDAsIHNlZ3BvcyA9IDA7IGkgPCBjaGFubGVuOyBpKyspIHsKIAkJCURFQlVHKHByaW50aygiJWQgJWQ9JWQgJWRcbiIsCiAJCQkJICAgICBDUl9DSEFOKGNoYW5zZWdtZW50W2kgJSBzZWdsZW5dKSwKIAkJCQkgICAgIENSX1JBTkdFKGNoYW5zZWdtZW50W2kgJSBzZWdsZW5dKSwKIAkJCQkgICAgIENSX0NIQU4oY2hhbmxpc3RbaV0pLAogCQkJCSAgICAgQ1JfUkFOR0UoY2hhbmxpc3RbaV0pKTspCiAJCQkgICAgaWYgKGNoYW5saXN0W2ldICE9IGNoYW5zZWdtZW50W2kgJSBzZWdsZW5dKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgICgiY29tZWRpJWQ6IHBjbDgxNjogYmFkIGNoYW5uZWwgb3IgcmFuZ2UgbnVtYmVyISBjaGFubGlzdFslaV09JWQsJWQsJWQgYW5kIG5vdCAlZCwlZCwlZCFcbiIsCi0JCQkJICAgICBkZXYtPm1pbm9yLCBpLCBDUl9DSEFOKGNoYW5zZWdtZW50W2ldKSwKLQkJCQkgICAgIENSX1JBTkdFKGNoYW5zZWdtZW50W2ldKSwKLQkJCQkgICAgIENSX0FSRUYoY2hhbnNlZ21lbnRbaV0pLAotCQkJCSAgICAgQ1JfQ0hBTihjaGFubGlzdFtpICUgc2VnbGVuXSksCi0JCQkJICAgICBDUl9SQU5HRShjaGFubGlzdFtpICUgc2VnbGVuXSksCi0JCQkJICAgICBDUl9BUkVGKGNoYW5zZWdtZW50W2kgJSBzZWdsZW5dKSk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiY29tZWRpJWQ6IHBjbDgxNjogYmFkIGNoYW5uZWwgb3IgcmFuZ2UiCisJCQkJICAgICAgICIgbnVtYmVyISBjaGFubGlzdFslaV09JWQsJWQsJWQgYW5kIG5vdCIKKwkJCQkgICAgICAgIiAlZCwlZCwlZCFcbiIsIGRldi0+bWlub3IsIGksCisJCQkJICAgICAgIENSX0NIQU4oY2hhbnNlZ21lbnRbaV0pLAorCQkJCSAgICAgICBDUl9SQU5HRShjaGFuc2VnbWVudFtpXSksCisJCQkJICAgICAgIENSX0FSRUYoY2hhbnNlZ21lbnRbaV0pLAorCQkJCSAgICAgICBDUl9DSEFOKGNoYW5saXN0W2kgJSBzZWdsZW5dKSwKKwkJCQkgICAgICAgQ1JfUkFOR0UoY2hhbmxpc3RbaSAlIHNlZ2xlbl0pLAorCQkJCSAgICAgICBDUl9BUkVGKGNoYW5zZWdtZW50W2kgJSBzZWdsZW5dKSk7CiAJCQkJcmV0dXJuIDA7CS8qICBjaGFuL2dhaW4gbGlzdCBpcyBzdHJhbmdlICovCiAJCQl9CiAJCX0KQEAgLTk2NSwxMiArMTAyNiwxNSBAQAogCWZvciAoaSA9IDA7IGkgPCBzZWdsZW47IGkrKykgewkvKiAgc3RvcmUgcmFuZ2UgbGlzdCB0byBjYXJkICovCiAJCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdFtpXSA9IENSX0NIQU4oY2hhbmxpc3RbaV0pOwogCQlvdXRiKENSX0NIQU4oY2hhbmxpc3RbMF0pICYgMHhmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCQlvdXRiKENSX1JBTkdFKGNoYW5saXN0WzBdKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOwkvKiBzZWxlY3QgZ2FpbiAqLworCQkvKiBzZWxlY3QgZ2FpbiAqLworCQlvdXRiKENSX1JBTkdFKGNoYW5saXN0WzBdKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOwogCX0KIAogCXVkZWxheSgxKTsKLQotCW91dGIoZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0WzBdIHwgKGRldnByaXYtPmFpX2FjdF9jaGFubGlzdFtzZWdsZW4gLSAxXSA8PCA0KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYKTsJLyogc2VsZWN0IGNoYW5uZWwgaW50ZXJ2YWwgdG8gc2NhbiAqLworCS8qIHNlbGVjdCBjaGFubmVsIGludGVydmFsIHRvIHNjYW4gKi8KKwlvdXRiKGRldnByaXYtPmFpX2FjdF9jaGFubGlzdFswXSB8CisJICAgICAoZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0W3NlZ2xlbiAtIDFdIDw8IDQpLAorCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKIH0KIAogI2lmZGVmIHVudXNlZApAQCAtOTk4LDExICsxMDYyLDExIEBACiAJc2F2ZV9mbGFncyhmbGFncyk7CiAJY2xpKCk7CiAJdmFsID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKLQlpZiAoYml0KSB7CisJaWYgKGJpdCkKIAkJdmFsIHw9IFJUQ19QSUU7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXZhbCAmPSB+UlRDX1BJRTsKLQl9CisKIAlDTU9TX1dSSVRFKHZhbCwgUlRDX0NPTlRST0wpOwogCUNNT1NfUkVBRChSVENfSU5UUl9GTEFHUyk7CiAJcmVzdG9yZV9mbGFncyhmbGFncyk7CkBAIC0xMDcyLDcgKzExMzYsNyBAQAogCWRldi0+aW9iYXNlID0gaW9iYXNlOwogCiAJaWYgKHBjbDgxNl9jaGVjayhpb2Jhc2UpKSB7Ci0JCXByaW50aygiLCBJIGNhbm4ndCBkZXRlY3QgYm9hcmQuIEZBSUwhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIsIEkgY2Fubid0IGRldGVjdCBib2FyZC4gRkFJTCFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTEwOTAsMzAgKzExNTQsMjkgQEAKIAkJaWYgKGlycSkgewkvKiB3ZSB3YW50IHRvIHVzZSBJUlEgKi8KIAkJCWlmICgoKDEgPDwgaXJxKSAmIHRoaXNfYm9hcmQtPklSUWJpdHMpID09IDApIHsKIAkJCQlwcmludGsKLQkJCQkgICAgKCIsIElSUSAldSBpcyBvdXQgb2YgYWxsb3dlZCByYW5nZSwgRElTQUJMSU5HIElUIiwKLQkJCQkgICAgIGlycSk7CisJCQkJICAgICgiLCBJUlEgJXUgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsICIKKwkJCQkgICAgICJESVNBQkxJTkcgSVQiLCBpcnEpOwogCQkJCWlycSA9IDA7CS8qIEJhZCBJUlEgKi8KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHJlcXVlc3RfaXJxCiAJCQkJICAgIChpcnEsIGludGVycnVwdF9wY2w4MTYsIDAsICJwY2w4MTYiLCBkZXYpKSB7CiAJCQkJCXByaW50awotCQkJCQkgICAgKCIsIHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIERJU0FCTElORyBJVCIsCi0JCQkJCSAgICAgaXJxKTsKKwkJCQkJICAgICgiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCAiCisJCQkJCSAgICAgIkRJU0FCTElORyBJVCIsIGlycSk7CiAJCQkJCWlycSA9IDA7CS8qIENhbid0IHVzZSBJUlEgKi8KIAkJCQl9IGVsc2UgewotCQkJCQlwcmludGsoIiwgaXJxPSV1IiwgaXJxKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiLCBpcnE9JXUiLCBpcnEpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KIAogCWRldi0+aXJxID0gaXJxOwotCWlmIChpcnEpIHsKKwlpZiAoaXJxKQkvKiAxPXdlIGhhdmUgYWxsb2NhdGVkIGlycSAqLwogCQlkZXZwcml2LT5pcnFfZnJlZSA9IDE7Ci0JfSAvKiAxPXdlIGhhdmUgYWxsb2NhdGVkIGlycSAqLwotCWVsc2UgeworCWVsc2UKIAkJZGV2cHJpdi0+aXJxX2ZyZWUgPSAwOwotCX0KKwogCWRldnByaXYtPmlycV9ibG9ja2VkID0gMDsJLyogbnVtYmVyIG9mIHN1YmRldmljZSB3aGljaCB1c2UgSVJRICovCiAJZGV2cHJpdi0+aW50ODE2X21vZGUgPSAwOwkvKiBtb2RlIG9mIGlycSAqLwogCkBAIC0xMTcwLDE4ICsxMjMzLDIyIEBACiAJCX0KIAkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCAicGNsODE2Iik7CiAJCWlmIChyZXQpIHsKLQkJCXByaW50aygiLCB1bmFibGUgdG8gYWxsb2NhdGUgRE1BICV1LCBGQUlMIVxuIiwgZG1hKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIsIHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgJXUsIEZBSUwhXG4iLCBkbWEpOwogCQkJcmV0dXJuIC1FQlVTWTsJLyogRE1BIGlzbid0IGZyZWUgKi8KIAkJfQogCiAJCWRldnByaXYtPmRtYSA9IGRtYTsKLQkJcHJpbnRrKCIsIGRtYT0ldSIsIGRtYSk7CisJCXByaW50ayhLRVJOX0lORk8gIiwgZG1hPSV1IiwgZG1hKTsKIAkJcGFnZXMgPSAyOwkvKiB3ZSBuZWVkIDE2S0IgKi8KIAkJZGV2cHJpdi0+ZG1hYnVmWzBdID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VzKTsKIAogCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlswXSkgewogCQkJcHJpbnRrKCIsIHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyLCBGQUlMIVxuIik7Ci0JCQkvKiBtYXliZSBleHBlcmltZW50IHdpdGggdHJ5X3RvX2ZyZWVfcGFnZXMoKSB3aWxsIGhlbHAgLi4uLiAqLworCQkJLyoKKwkJCSAqIG1heWJlIGV4cGVyaW1lbnQgd2l0aCB0cnlfdG9fZnJlZV9wYWdlcygpCisJCQkgKiB3aWxsIGhlbHAgLi4uLgorCQkJICovCiAJCQlyZXR1cm4gLUVCVVNZOwkvKiBubyBidWZmZXIgOi0oICovCiAJCX0KIAkJZGV2cHJpdi0+ZG1hcGFnZXNbMF0gPSBwYWdlczsKQEAgLTExOTIsOCArMTI1OSw5IEBACiAJCWlmIChkZXZwcml2LT5kbWFfcnRjID09IDApIHsJLyogIHdlIG11c3QgZG8gZHVibGUgYnVmZiA6LSggKi8KIAkJCWRldnByaXYtPmRtYWJ1ZlsxXSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlcyk7CiAJCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlsxXSkgewotCQkJCXByaW50awotCQkJCSAgICAoIiwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsICIKKwkJCQkgICAgICAgIkZBSUwhXG4iKTsKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfQogCQkJZGV2cHJpdi0+ZG1hcGFnZXNbMV0gPSBwYWdlczsKQEAgLTEyNzcsNyArMTM0NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcGNsODE2X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCURFQlVHKHByaW50aygiY29tZWRpJWQ6IHBjbDgxNjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTspCisJREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjbDgxNjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTspCiAJICAgIGZyZWVfcmVzb3VyY2VzKGRldik7CiAjaWZkZWYgdW51c2VkCiAJaWYgKGRldnByaXYtPmRtYV9ydGMpCkBAIC0xMjg1LDMgKzEzNTMsNyBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYwppbmRleCA5ZDZhYTM5Li5kMmJkNmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCkBAIC0zMTMsNyArMzEzLDE4IEBACiAJLm9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcGNsODE4X2JvYXJkKSwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfcGNsODE4KTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9wY2w4MThfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjbDgxOCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfcGNsODE4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcGNsODE4KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjbDgxOF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfcGNsODE4X2NsZWFudXBfbW9kdWxlKTsKIAogc3RydWN0IHBjbDgxOF9wcml2YXRlIHsKIApAQCAtMjAzNiwzICsyMDQ3LDcgQEAKIAlmcmVlX3Jlc291cmNlcyhkZXYpOwogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbTM3MjQuYwppbmRleCBlZDYxMDMwLi43ZmIzYzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY20zNzI0LmMKQEAgLTk3LDcgKzk3LDE4IEBACiAJLm9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcGNtMzcyNF9ib2FyZCksCiB9OwogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX3BjbTM3MjQpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3BjbTM3MjRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjbTM3MjQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX3BjbTM3MjRfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9wY20zNzI0KTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjbTM3MjRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BjbTM3MjRfY2xlYW51cF9tb2R1bGUpOwogCiAvKiAoc2V0cSBjLWJhc2ljLW9mZnNldCA4KSAqLwogCkBAIC0xODQsNyArMTk1LDcgQEAKIAlzdHJ1Y3QgcHJpdl9wY20zNzI0ICpwcml2OwogCiAJZ2F0ZWNmZyA9IDA7Ci0JcHJpdiA9IChzdHJ1Y3QgcHJpdl9wY20zNzI0ICopKGRldi0+cHJpdmF0ZSk7CisJcHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCW1hc2sgPSAxIDw8IENSX0NIQU4oY2hhbnNwZWMpOwogCWlmIChzID09IGRldi0+c3ViZGV2aWNlcykJLyogIHN1YmRldiAwICovCkBAIC0zMDcsMyArMzE4LDcgQEAKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzczMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbTM3MzAuYwppbmRleCAyMmI3YWFlLi5iYWRhNmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzczMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY20zNzMwLmMKQEAgLTM4LDcgKzM4LDE4IEBACiAJLmRldGFjaCA9IHBjbTM3MzBfZGV0YWNoLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY20zNzMwKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9wY20zNzMwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9wY20zNzMwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY20zNzMwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcGNtMzczMCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wY20zNzMwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY20zNzMwX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBwY20zNzMwX2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLApAQCAtMTU0LDMgKzE2NSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbV9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21fY29tbW9uLmMKaW5kZXggNTJjMmE2NjkuLjQ3NGFmN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21fY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbV9jb21tb24uYwpAQCAtMTA5LDMgKzEwOSw3IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNvbWVkaV9wY21fY21kdGVzdCk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21hZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWFkLmMKaW5kZXggZmFiODA5Mi4uMjNiM2Q3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWFkLmMKQEAgLTg5LDcgKzg5LDE4IEBACiAJLm9mZnNldCA9IHNpemVvZihwY21hZF9ib2FyZHNbMF0pLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9wY21hZCk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcGNtYWRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3BjbWFkKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9wY21hZF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3BjbWFkKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3BjbWFkX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9wY21hZF9jbGVhbnVwX21vZHVsZSk7CiAKICNkZWZpbmUgVElNRU9VVAkxMDAKIApAQCAtMTc2LDMgKzE4Nyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWRhMTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21kYTEyLmMKaW5kZXggNzEzM2ViMC4uMGU5ZmZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbWRhMTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtZGExMi5jCkBAIC0xNTcsNyArMTU3LDggQEAKIAl1bnNpZ25lZCBsb25nIGlvYmFzZTsKIAogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwotCXByaW50aygiY29tZWRpJWQ6ICVzOiBpbzogJWx4ICVzICIsIGRldi0+bWlub3IsIGRyaXZlci5kcml2ZXJfbmFtZSwKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICJjb21lZGklZDogJXM6IGlvOiAlbHggJXMgIiwgZGV2LT5taW5vciwgZHJpdmVyLmRyaXZlcl9uYW1lLAogCSAgICAgICBpb2Jhc2UsIGl0LT5vcHRpb25zWzFdID8gInNpbXVsdGFuZW91cyB4ZmVyIG1vZGUgZW5hYmxlZCIgOiAiIik7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgSU9TSVpFLCBkcml2ZXIuZHJpdmVyX25hbWUpKSB7CkBAIC0xNzcsNyArMTc4LDcgQEAKICAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KICAqLwogCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBwY21kYTEyX3ByaXZhdGUpKSA8IDApIHsKLQkJcHJpbnRrKCJjYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE5MSw3ICsxOTIsNyBAQAogCSAqIDk2LWNoYW5uZWwgdmVyc2lvbiBvZiB0aGUgYm9hcmQuCiAJICovCiAJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCAxKSA8IDApIHsKLQkJcHJpbnRrKCJjYW5ub3QgYWxsb2NhdGUgc3ViZGV2aWNlIGRhdGEgc3RydWN0dXJlc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHN1YmRldmljZSBkYXRhIHN0cnVjdHVyZXNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTIwNyw3ICsyMDgsNyBAQAogCiAJemVyb19jaGFucyhkZXYpOwkvKiBjbGVhciBvdXQgYWxsIHRoZSByZWdpc3RlcnMsIGJhc2ljYWxseSAqLwogCi0JcHJpbnRrKCJhdHRhY2hlZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXR0YWNoZWRcbiIpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0yMjIsNyArMjIzLDggQEAKICAqLwogc3RhdGljIGludCBwY21kYTEyX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6ICVzOiByZW1vdmVcbiIsIGRldi0+bWlub3IsIGRyaXZlci5kcml2ZXJfbmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiY29tZWRpJWQ6ICVzOiByZW1vdmVcbiIsIGRldi0+bWlub3IsIGRyaXZlci5kcml2ZXJfbmFtZSk7CiAJaWYgKGRldi0+aW9iYXNlKQogCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgSU9TSVpFKTsKIAlyZXR1cm4gMDsKQEAgLTMwMyw0ICszMDUsMTkgQEAKICAqIEEgY29udmVuaWVudCBtYWNybyB0aGF0IGRlZmluZXMgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUoKSwKICAqIGFzIG5lY2Vzc2FyeS4KICAqLwotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcik7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwppbmRleCAwMjVhNTJlLi41YzgzMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCkBAIC0xNDUsMTAgKzE0NSw2IEBACiAjZGVmaW5lIFBBR0VfRU5BQiAyCiAjZGVmaW5lIFBBR0VfSU5UX0lEIDMKIAotdHlwZWRlZiBpbnQgKCpjb21lZGlfaW5zbl9mbl90KSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwKLQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQogc3RhdGljIGludCBhaV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAogCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKIHN0YXRpYyBpbnQgYW9fcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKQEAgLTE3MSw3ICsxNjcsMTggQEAKIAljb25zdCBpbnQgbl9haV9jaGFuczsKIAljb25zdCBpbnQgbl9hb19jaGFuczsKIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdGFibGUsICphb19yYW5nZV90YWJsZTsKLQljb21lZGlfaW5zbl9mbl90IGFpX3JpbnNuLCBhb19yaW5zbiwgYW9fd2luc247CisJaW50ICgqYWlfcmluc24pIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBpbnQgKmRhdGEpOworCWludCAoKmFvX3JpbnNuKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgaW50ICpkYXRhKTsKKwlpbnQgKCphb193aW5zbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGludCAqZGF0YSk7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VzX2FpID0gewpAQCAtMTMzMyw0ICsxMzQwLDE5IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXIpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtdWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtdWlvLmMKaW5kZXggNWFmNGM4NC4uN2E5Mjg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbXVpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY211aW8uYwpAQCAtMTAxOCw0ICsxMDE4LDE5IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXIpOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcG9jLmMKaW5kZXggMWViYzM1Ni4uODMxYTU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wb2MuYwpAQCAtMjQ4LDQgKzI0OCwxOSBAQAogCXJldHVybiAyOwogfQogCi1DT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX3BvYyk7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfcG9jX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9wb2MpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJpdmVyX3BvY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3BvYyk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9wb2NfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3BvY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYwppbmRleCBhOTFkYjZjLi5iZjQ4OWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCkBAIC0xNCw3ICsxNCw3IEBACiAKICAgICBEb2N1bWVudGF0aW9uIGZvciB0aGUgREFRUCBQQ01DSUEgY2FyZHMgY2FuIGJlIGZvdW5kIG9uIFF1YXRlY2gncyBzaXRlOgogCi0gICAgICAgICAgICAgICAgZnRwOi8vZnRwLnF1YXRlY2guY29tL01hbnVhbHMvZGFxcC0yMDgucGRmCisJCWZ0cDovL2Z0cC5xdWF0ZWNoLmNvbS9NYW51YWxzL2RhcXAtMjA4LnBkZgogCiAgICAgVGhpcyBtYW51YWwgaXMgZm9yIGJvdGggdGhlIERBUVAtMjA4IGFuZCB0aGUgREFRUC0zMDguCiAKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC0xOTUsNyArMTk0LDcgQEAKIAogc3RhdGljIHZvaWQgZGFxcF9kdW1wKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJEQVFQOiBzdGF0dXMgJTAyeDsgYXV4IHN0YXR1cyAlMDJ4XG4iLAorCXByaW50ayhLRVJOX0lORk8gIkRBUVA6IHN0YXR1cyAlMDJ4OyBhdXggc3RhdHVzICUwMnhcbiIsCiAJICAgICAgIGluYihkZXYtPmlvYmFzZSArIERBUVBfU1RBVFVTKSwgaW5iKGRldi0+aW9iYXNlICsgREFRUF9BVVgpKTsKIH0KIApAQCAtMjA3LDkgKzIwNiw5IEBACiAJcHJpbnRrKHN0cik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKGkgJSAxNiA9PSAwKSB7Ci0JCQlwcmludGsoIlxuMHglMDh4OiIsICh1bnNpZ25lZCBpbnQpY3B0cik7Ci0JCX0KKwkJaWYgKGkgJSAxNiA9PSAwKQorCQkJcHJpbnRrKCJcbiVwOiIsIGNwdHIpOworCiAJCXByaW50aygiICUwMngiLCAqKGNwdHIrKykpOwogCX0KIAlwcmludGsoIlxuIik7CkBAIC0yMjMsOSArMjIyLDkgQEAKIHsKIAlzdHJ1Y3QgbG9jYWxfaW5mb190ICpsb2NhbCA9IChzdHJ1Y3QgbG9jYWxfaW5mb190ICopcy0+cHJpdmF0ZTsKIAotCWlmIChsb2NhbC0+c3RvcCkgeworCWlmIChsb2NhbC0+c3RvcCkKIAkJcmV0dXJuIC1FSU87Ci0JfQorCiAKIAlvdXRiKERBUVBfQ09NTUFORF9TVE9QLCBkZXYtPmlvYmFzZSArIERBUVBfQ09NTUFORCk7CiAKQEAgLTM1NSw5ICszNTQsOSBAQAogCWludCB2OwogCWludCBjb3VudGVyID0gMTAwMDA7CiAKLQlpZiAobG9jYWwtPnN0b3ApIHsKKwlpZiAobG9jYWwtPnN0b3ApCiAJCXJldHVybiAtRUlPOwotCX0KKwogCiAJLyogU3RvcCBhbnkgcnVubmluZyBjb252ZXJzaW9uICovCiAJZGFxcF9haV9jYW5jZWwoZGV2LCBzKTsKQEAgLTM3Miw5ICszNzEsOSBAQAogCXYgPSBEQVFQX1NDQU5MSVNUX0NIQU5ORUwoQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpCiAJICAgIHwgREFRUF9TQ0FOTElTVF9HQUlOKENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSk7CiAKLQlpZiAoQ1JfQVJFRihpbnNuLT5jaGFuc3BlYykgPT0gQVJFRl9ESUZGKSB7CisJaWYgKENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpID09IEFSRUZfRElGRikKIAkJdiB8PSBEQVFQX1NDQU5MSVNUX0RJRkZFUkVOVElBTDsKLQl9CisKIAogCXYgfD0gREFRUF9TQ0FOTElTVF9TVEFSVDsKIApAQCAtNDg4LDcgKzQ4NywxMCBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcworCSAqIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKi8KIAogCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKQEAgLTU4OCw5ICs1OTAsOSBAQAogCWludCBpOwogCWludCB2OwogCi0JaWYgKGxvY2FsLT5zdG9wKSB7CisJaWYgKGxvY2FsLT5zdG9wKQogCQlyZXR1cm4gLUVJTzsKLQl9CisKIAogCS8qIFN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLwogCWRhcXBfYWlfY2FuY2VsKGRldiwgcyk7CkBAIC02NDAsMTMgKzY0MiwxMSBAQAogCQl2ID0gREFRUF9TQ0FOTElTVF9DSEFOTkVMKENSX0NIQU4oY2hhbnNwZWMpKQogCQkgICAgfCBEQVFQX1NDQU5MSVNUX0dBSU4oQ1JfUkFOR0UoY2hhbnNwZWMpKTsKIAotCQlpZiAoQ1JfQVJFRihjaGFuc3BlYykgPT0gQVJFRl9ESUZGKSB7CisJCWlmIChDUl9BUkVGKGNoYW5zcGVjKSA9PSBBUkVGX0RJRkYpCiAJCQl2IHw9IERBUVBfU0NBTkxJU1RfRElGRkVSRU5USUFMOwotCQl9CiAKLQkJaWYgKGkgPT0gMCB8fCBzY2FubGlzdF9zdGFydF9vbl9ldmVyeV9lbnRyeSkgeworCQlpZiAoaSA9PSAwIHx8IHNjYW5saXN0X3N0YXJ0X29uX2V2ZXJ5X2VudHJ5KQogCQkJdiB8PSBEQVFQX1NDQU5MSVNUX1NUQVJUOwotCQl9CiAKIAkJb3V0Yih2ICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBEQVFQX1NDQU5MSVNUKTsKIAkJb3V0Yih2ID4+IDgsIGRldi0+aW9iYXNlICsgREFRUF9TQ0FOTElTVCk7CkBAIC03NjAsNyArNzYwLDggQEAKIAl3aGlsZSAoLS1jb3VudGVyCiAJICAgICAgICYmIChpbmIoZGV2LT5pb2Jhc2UgKyBEQVFQX1NUQVRVUykgJiBEQVFQX1NUQVRVU19FVkVOVFMpKSA7CiAJaWYgKCFjb3VudGVyKSB7Ci0JCXByaW50aygiZGFxcDogY291bGRuJ3QgY2xlYXIgaW50ZXJydXB0cyBpbiBzdGF0dXMgcmVnaXN0ZXJcbiIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkYXFwOiBjb3VsZG4ndCBjbGVhciBpbnRlcnJ1cHRzIGluIHN0YXR1cyByZWdpc3RlclxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTc4NSw5ICs3ODYsOCBAQAogCWludCBkOwogCXVuc2lnbmVkIGludCBjaGFuOwogCi0JaWYgKGxvY2FsLT5zdG9wKSB7CisJaWYgKGxvY2FsLT5zdG9wKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJZCA9IGRhdGFbMF07CkBAIC04MTEsOSArODExLDggQEAKIHsKIAlzdHJ1Y3QgbG9jYWxfaW5mb190ICpsb2NhbCA9IChzdHJ1Y3QgbG9jYWxfaW5mb190ICopcy0+cHJpdmF0ZTsKIAotCWlmIChsb2NhbC0+c3RvcCkgeworCWlmIChsb2NhbC0+c3RvcCkKIAkJcmV0dXJuIC1FSU87Ci0JfQogCiAJZGF0YVswXSA9IGluYihkZXYtPmlvYmFzZSArIERBUVBfRElHSVRBTF9JTyk7CiAKQEAgLTgyOCw5ICs4MjcsOCBAQAogewogCXN0cnVjdCBsb2NhbF9pbmZvX3QgKmxvY2FsID0gKHN0cnVjdCBsb2NhbF9pbmZvX3QgKilzLT5wcml2YXRlOwogCi0JaWYgKGxvY2FsLT5zdG9wKSB7CisJaWYgKGxvY2FsLT5zdG9wKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAlvdXR3KGRhdGFbMF0gJiAweGYsIGRldi0+aW9iYXNlICsgREFRUF9ESUdJVEFMX0lPKTsKIApAQCAtODcyLDEzICs4NzAsMTMgQEAKIAkJfQogCX0KIAotCWRldi0+aW9iYXNlID0gbG9jYWwtPmxpbmstPmlvLkJhc2VQb3J0MTsKKwlkZXYtPmlvYmFzZSA9IGxvY2FsLT5saW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlwcmludGsoImNvbWVkaSVkOiBhdHRhY2hpbmcgZGFxcCVkIChpbyAweCUwNGx4KVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogYXR0YWNoaW5nIGRhcXAlZCAoaW8gMHglMDRseClcbiIsCiAJICAgICAgIGRldi0+bWlub3IsIGl0LT5vcHRpb25zWzBdLCBkZXYtPmlvYmFzZSk7CiAKIAlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKQEAgLTkzMSw3ICs5MjksNyBAQAogCiBzdGF0aWMgaW50IGRhcXBfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogZGV0YWNoaW5nIGRhcXBcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBkZXRhY2hpbmcgZGFxcFxuIiwgZGV2LT5taW5vcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk5NiwxNCArOTk0LDYgQEAKIHN0YXRpYyBpbnQgZGFxcF9jc19hdHRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBkYXFwX2NzX2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqKTsKIAotLyoKLSAgIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKLSAgIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCi0gICBkYXRhYmFzZS4KLSovCi0KLXN0YXRpYyBjb25zdCBkZXZfaW5mb190IGRldl9pbmZvID0gInF1YXRlY2hfZGFxcF9jcyI7Ci0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICAgZGFxcF9jc19hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZwpAQCAtMTA3Niw4ICsxMDY2LDcgQEAKIAogCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBhbmQgZnJlZSBpdCAqLwogCWRldl90YWJsZVtkZXYtPnRhYmxlX2luZGV4XSA9IE5VTEw7Ci0JaWYgKGRldikKLQkJa2ZyZWUoZGV2KTsKKwlrZnJlZShkZXYpOwogCiB9CQkJCS8qIGRhcXBfY3NfZGV0YWNoICovCiAKQEAgLTExMDMsMjYgKzEwOTIsMjQgQEAKIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKIAogCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+aW9fbGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyAmPSB+SU9fREFUQV9QQVRIX1dJRFRIOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9CisJCQlwY21jaWFfaW9fY2ZnX2RhdGFfd2lkdGgoaW8tPmZsYWdzKTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5zdGFydCA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPnJlc291cmNlWzBdLT5lbmQgPSBpby0+d2luWzBdLmxlbjsKIAkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOwotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZmxhZ3MgPSBwX2Rldi0+cmVzb3VyY2VbMF0tPmZsYWdzOworCQkJcF9kZXYtPnJlc291cmNlWzFdLT5zdGFydCA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gaW8tPndpblsxXS5sZW47CiAJCX0KIAl9CiAKIAkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgZGFxcF9jc19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCkBAIC0xMTU0LDEyICsxMTQxLDEwIEBACiAJZGV2X2luZm8oJmxpbmstPmRldiwgImluZGV4IDB4JTAyeCIsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgpOwogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJCXByaW50aygiLCBpcnEgJXUiLCBsaW5rLT5pcnEpOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxICsgbGluay0+aW8uTnVtUG9ydHMxIC0gMSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMikKLQkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAotCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyICsgbGluay0+aW8uTnVtUG9ydHMyIC0gMSk7CisJaWYgKGxpbmstPnJlc291cmNlWzBdKQorCQlwcmludGsoIiAmICVwUiIsIGxpbmstPnJlc291cmNlWzBdKTsKKwlpZiAobGluay0+cmVzb3VyY2VbMV0pCisJCXByaW50aygiICYgJXBSIiwgbGluay0+cmVzb3VyY2VbMV0pOwogCXByaW50aygiXG4iKTsKIAogCXJldHVybjsKQEAgLTEyMjgsNyArMTIxMyw3IEBACiAJLmlkX3RhYmxlID0gZGFxcF9jc19pZF90YWJsZSwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZHJ2ID0gewotCQkubmFtZSA9IGRldl9pbmZvLAorCQkubmFtZSA9ICJxdWF0ZWNoX2RhcXBfY3MiLAogCQl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCmluZGV4IDg2MjY2NTguLjAzNjdkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKQEAgLTIzNTYsNCArMjM1Niw0NCBAQAogICogQSBjb252ZW5pZW50IG1hY3JvIHRoYXQgZGVmaW5lcyBpbml0X21vZHVsZSgpIGFuZCBjbGVhbnVwX21vZHVsZSgpLAogICogYXMgbmVjZXNzYXJ5LgogICovCi1DT01FRElfUENJX0lOSVRDTEVBTlVQKHJ0ZDUyMERyaXZlciwgcnRkNTIwX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGQ1MjBEcml2ZXJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgcnRkNTIwRHJpdmVyLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0ZDUyMERyaXZlcl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydGQ1MjBEcml2ZXJfcGNpX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBydGQ1MjBfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZydGQ1MjBEcml2ZXJfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmcnRkNTIwRHJpdmVyX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydGQ1MjBEcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmcnRkNTIwRHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJ0ZDUyMERyaXZlcl9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKXJ0ZDUyMERyaXZlci5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnRkNTIwRHJpdmVyX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRkNTIwRHJpdmVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydGQ1MjBEcml2ZXJfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZydGQ1MjBEcml2ZXIpOworfQorCittb2R1bGVfaW5pdChydGQ1MjBEcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocnRkNTIwRHJpdmVyX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMC5jCmluZGV4IDAyOGVkNmYuLjcyMDQyYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAwLmMKQEAgLTE1OCw3ICsxNTgsMTggQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBydGk4MDBfYm9hcmQpLAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9ydGk4MDApOworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3J0aTgwMF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfcnRpODAwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9ydGk4MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9ydGk4MDApOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfcnRpODAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9ydGk4MDBfY2xlYW51cF9tb2R1bGUpOwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcnRpODAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpOwogCkBAIC00NzUsMyArNDg2LDcgQEAKIAogCXJldHVybiAwOwogfQorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAyLmMKaW5kZXggMjE1N2VkYy4uZjU5Y2IxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDIuYwpAQCAtNTcsNyArNTcsMTggQEAKIAkuZGV0YWNoID0gcnRpODAyX2RldGFjaCwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfcnRpODAyKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9ydGk4MDJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3J0aTgwMik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfcnRpODAyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfcnRpODAyKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3J0aTgwMl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfcnRpODAyX2NsZWFudXBfbW9kdWxlKTsKIAogc3RydWN0IHJ0aTgwMl9wcml2YXRlIHsKIAllbnVtIHsKQEAgLTE1MCwzICsxNjEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCmluZGV4IDA3YzIxZTYuLjM2MDdhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwpAQCAtMTAwMiw0ICsxMDAyLDE5IEBACiAgKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCiAgKiBhcyBuZWNlc3NhcnkuCiAgKi8KLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfczUyNik7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfczUyNl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfczUyNik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfczUyNl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3M1MjYpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfczUyNl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfczUyNl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCmluZGV4IGEzY2M5MzMuLmQ1YmEzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwpAQCAtNjAsMTAgKzYwLDEwIEBACiAgICBpbnNuLmluc249SU5TTl9DT05GSUc7ICAgLy9jb25maWd1cmF0aW9uIGluc3RydWN0aW9uCiAgICBpbnNuLm49MTsgICAgICAgICAgICAgICAgLy9udW1iZXIgb2Ygb3BlcmF0aW9uIChtdXN0IGJlIDEpCiAgICBpbnNuLmRhdGE9JmluaXRpYWx2YWx1ZTsgLy9pbml0aWFsIHZhbHVlIGxvYWRlZCBpbnRvIGVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1cmluZyBjb25maWd1cmF0aW9uCisJCQkJLy9kdXJpbmcgY29uZmlndXJhdGlvbgogICAgaW5zbi5zdWJkZXY9NTsgICAgICAgICAgIC8vZW5jb2RlciBzdWJkZXZpY2UKICAgIGluc24uY2hhbnNwZWM9Q1JfUEFDSyhlbmNvZGVyX2NoYW5uZWwsMCxBUkVGX09USEVSKTsgLy9lbmNvZGVyX2NoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90byBjb25maWd1cmUKKwkJCQkJCQkvL3RvIGNvbmZpZ3VyZQogCiAgICBjb21lZGlfZG9faW5zbihjZiwmaW5zbik7IC8vZXhlY3V0aW5nIGNvbmZpZ3VyYXRpb24KICovCkBAIC0yMjQsNyArMjI0LDQzIEBACiAjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3QgczYyNl9wcml2YXRlICopZGV2LT5wcml2YXRlKQogI2RlZmluZSBkaW9wcml2ICgoc3RydWN0IGRpb19wcml2YXRlICopcy0+cHJpdmF0ZSkKIAotQ09NRURJX1BDSV9JTklUQ0xFQU5VUF9OT01PRFVMRShkcml2ZXJfczYyNiwgczYyNl9wY2lfdGFibGUpOworc3RhdGljIGludCBfX2RldmluaXQgZHJpdmVyX3M2MjZfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBkcml2ZXJfczYyNi5kcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkcml2ZXJfczYyNl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXJfczYyNl9wY2lfZHJpdmVyID0geworCS5pZF90YWJsZSA9IHM2MjZfcGNpX3RhYmxlLAorCS5wcm9iZSA9ICZkcml2ZXJfczYyNl9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZkcml2ZXJfczYyNl9wY2lfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJpdmVyX3M2MjZfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX3M2MjYpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHJpdmVyX3M2MjZfcGNpX2RyaXZlci5uYW1lID0gKGNoYXIgKilkcml2ZXJfczYyNi5kcml2ZXJfbmFtZTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX3M2MjZfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfczYyNl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyX3M2MjZfcGNpX2RyaXZlcik7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfczYyNik7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9zNjI2X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9zNjI2X2NsZWFudXBfbW9kdWxlKTsKIAogLyogaW9jdGwgcm91dGluZXMgKi8KIHN0YXRpYyBpbnQgczYyNl9haV9pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjYzLDcgKzI5OSw3IEBACiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpOwogc3RhdGljIGludCBzNjI2X25zX3RvX3RpbWVyKGludCAqbmFub3NlYywgaW50IHJvdW5kX21vZGUpOwotc3RhdGljIGludCBzNjI2X2FpX2xvYWRfcG9sbGxpc3QodWludDhfdCAqIHBwbCwgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7CitzdGF0aWMgaW50IHM2MjZfYWlfbG9hZF9wb2xsbGlzdCh1aW50OF90ICpwcGwsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpOwogc3RhdGljIGludCBzNjI2X2FpX2ludHRyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBpbnQgdHJpZ251bSk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgczYyNl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkKTsKQEAgLTI5NCwxNiArMzMwLDE2IEBACiAvKiAgQ09VTlRFUiBPQkpFQ1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdHJ1Y3QgZW5jX3ByaXZhdGUgewogCS8qICBQb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBkaWZmZXIgZm9yIEEgYW5kIEIgY291bnRlcnM6ICovCi0JdWludDE2X3QoKkdldEVuYWJsZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIFJldHVybiBjbG9jayBlbmFibGUuICovCi0JdWludDE2X3QoKkdldEludFNyYykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIFJldHVybiBpbnRlcnJ1cHQgc291cmNlLiAqLwotCXVpbnQxNl90KCpHZXRMb2FkVHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIFJldHVybiBwcmVsb2FkIHRyaWdnZXIgc291cmNlLiAqLwotCXVpbnQxNl90KCpHZXRNb2RlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqKTsJLyogUmV0dXJuIHN0YW5kYXJkaXplZCBvcGVyYXRpbmcgbW9kZS4gKi8KLQl2b2lkICgqUHVsc2VJbmRleCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIEdlbmVyYXRlIHNvZnQgaW5kZXggc3Ryb2JlLiAqLwotCXZvaWQgKCpTZXRFbmFibGUpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlICosIHVpbnQxNl90IGVuYWIpOwkvKiBQcm9ncmFtIGNsb2NrIGVuYWJsZS4gKi8KLQl2b2lkICgqU2V0SW50U3JjKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqLCB1aW50MTZfdCBJbnRTb3VyY2UpOwkvKiBQcm9ncmFtIGludGVycnVwdCBzb3VyY2UuICovCi0Jdm9pZCAoKlNldExvYWRUcmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqLCB1aW50MTZfdCBUcmlnKTsJLyogUHJvZ3JhbSBwcmVsb2FkIHRyaWdnZXIgc291cmNlLiAqLwotCXZvaWQgKCpTZXRNb2RlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqLCB1aW50MTZfdCBTZXR1cCwgdWludDE2X3QgRGlzYWJsZUludFNyYyk7CS8qIFByb2dyYW0gc3RhbmRhcmRpemVkIG9wZXJhdGluZyBtb2RlLiAqLwotCXZvaWQgKCpSZXNldENhcEZsYWdzKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqKTsJLyogUmVzZXQgZXZlbnQgY2FwdHVyZSBmbGFncy4gKi8KKwl1aW50MTZfdCgqR2V0RW5hYmxlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGVuY19wcml2YXRlICopOwkvKiBSZXR1cm4gY2xvY2sgZW5hYmxlLiAqLworCXVpbnQxNl90KCpHZXRJbnRTcmMpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIFJldHVybiBpbnRlcnJ1cHQgc291cmNlLiAqLworCXVpbnQxNl90KCpHZXRMb2FkVHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqKTsJLyogUmV0dXJuIHByZWxvYWQgdHJpZ2dlciBzb3VyY2UuICovCisJdWludDE2X3QoKkdldE1vZGUpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIFJldHVybiBzdGFuZGFyZGl6ZWQgb3BlcmF0aW5nIG1vZGUuICovCisJdm9pZCAoKlB1bHNlSW5kZXgpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIEdlbmVyYXRlIHNvZnQgaW5kZXggc3Ryb2JlLiAqLworCXZvaWQgKCpTZXRFbmFibGUpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKiwgdWludDE2X3QgZW5hYik7CS8qIFByb2dyYW0gY2xvY2sgZW5hYmxlLiAqLworCXZvaWQgKCpTZXRJbnRTcmMpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKiwgdWludDE2X3QgSW50U291cmNlKTsJLyogUHJvZ3JhbSBpbnRlcnJ1cHQgc291cmNlLiAqLworCXZvaWQgKCpTZXRMb2FkVHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZSAqLCB1aW50MTZfdCBUcmlnKTsJLyogUHJvZ3JhbSBwcmVsb2FkIHRyaWdnZXIgc291cmNlLiAqLworCXZvaWQgKCpTZXRNb2RlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGVuY19wcml2YXRlICosIHVpbnQxNl90IFNldHVwLCB1aW50MTZfdCBEaXNhYmxlSW50U3JjKTsJLyogUHJvZ3JhbSBzdGFuZGFyZGl6ZWQgb3BlcmF0aW5nIG1vZGUuICovCisJdm9pZCAoKlJlc2V0Q2FwRmxhZ3MpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKik7CS8qIFJlc2V0IGV2ZW50IGNhcHR1cmUgZmxhZ3MuICovCiAKIAl1aW50MTZfdCBNeUNSQTsJCS8qICAgIEFkZHJlc3Mgb2YgQ1JBIHJlZ2lzdGVyLiAqLwogCXVpbnQxNl90IE15Q1JCOwkJLyogICAgQWRkcmVzcyBvZiBDUkIgcmVnaXN0ZXIuICovCkBAIC01NDMsMTMgKzU3OSwxMyBAQAogCWRldnByaXYtPnBkZXYgPSBwZGV2OwogCiAJaWYgKHBkZXYgPT0gTlVMTCkgewotCQlwcmludGsoInM2MjZfYXR0YWNoOiBCb2FyZCBub3QgcHJlc2VudCEhIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiczYyNl9hdHRhY2g6IEJvYXJkIG5vdCBwcmVzZW50ISEhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmVzdWx0ID0gY29tZWRpX3BjaV9lbmFibGUocGRldiwgInM2MjYiKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoInM2MjZfYXR0YWNoOiBjb21lZGlfcGNpX2VuYWJsZSBmYWlsc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiczYyNl9hdHRhY2g6IGNvbWVkaV9wY2lfZW5hYmxlIGZhaWxzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWRldnByaXYtPmdvdF9yZWdpb25zID0gMTsKQEAgLTU1OCw3ICs1OTQsNyBAQAogCiAJZGV2cHJpdi0+YmFzZV9hZGRyID0gaW9yZW1hcChyZXNvdXJjZVN0YXJ0LCBTSVpFT0ZfQUREUkVTU19TUEFDRSk7CiAJaWYgKGRldnByaXYtPmJhc2VfYWRkciA9PSBOVUxMKSB7Ci0JCXByaW50aygiczYyNl9hdHRhY2g6IElPUkVNQVAgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzNjI2X2F0dGFjaDogSU9SRU1BUCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTU3OSw3ICs2MTUsNyBAQAogCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGRldiwgRE1BQlVGX1NJWkUsICZhcHBkbWEpOwogCiAJCWlmIChkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UgPT0gTlVMTCkgewotCQkJcHJpbnRrKCJzNjI2X2F0dGFjaDogRE1BIE1lbW9yeSBtYXBwaW5nIGVycm9yXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiczYyNl9hdHRhY2g6IERNQSBNZW1vcnkgbWFwcGluZyBlcnJvclxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC01OTYsNyArNjMyLDcgQEAKIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGRldnByaXYtPnBkZXYsIERNQUJVRl9TSVpFLCAmYXBwZG1hKTsKIAogCQlpZiAoZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlID09IE5VTEwpIHsKLQkJCXByaW50aygiczYyNl9hdHRhY2g6IERNQSBNZW1vcnkgbWFwcGluZyBlcnJvclxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgInM2MjZfYXR0YWNoOiBETUEgTWVtb3J5IG1hcHBpbmcgZXJyb3JcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtNjIyLDE4ICs2NTgsMTggQEAKIAogCS8qIHNldCB1cCBpbnRlcnJ1cHQgaGFuZGxlciAqLwogCWlmIChkZXYtPmlycSA9PSAwKSB7Ci0JCXByaW50aygiIHVua25vd24gaXJxIChiYWQpXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIgdW5rbm93biBpcnEgKGJhZClcbiIpOwogCX0gZWxzZSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzNjI2X2lycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCQkgICJzNjI2IiwgZGV2KTsKIAogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKCIgaXJxIG5vdCBhdmFpbGFibGVcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIgaXJxIG5vdCBhdmFpbGFibGVcbiIpOwogCQkJZGV2LT5pcnEgPSAwOwogCQl9CiAJfQogCi0JREVCVUcoInM2MjZfYXR0YWNoOiAtLSBpdCBvcHRzICAlZCwlZCAtLSBcbiIsCisJREVCVUcoInM2MjZfYXR0YWNoOiAtLSBpdCBvcHRzICAlZCwlZCAtLVxuIiwKIAkgICAgICBpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOwogCiAJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CkBAIC03NzksNyArODE1LDggQEAKIAkJLyogIFdyaXRlIEkyQyBjb250cm9sOiBhYm9ydCBhbnkgSTJDIGFjdGl2aXR5LiAqLwogCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9VUExEX0lJQyk7CiAJCS8qICBJbnZva2UgY29tbWFuZCAgdXBsb2FkICovCi0JCXdoaWxlICgoUlI3MTQ2KFBfTUMyKSAmIE1DMl9VUExEX0lJQykgPT0gMCkgOworCQl3aGlsZSAoKFJSNzE0NihQX01DMikgJiBNQzJfVVBMRF9JSUMpID09IDApCisJCQk7CiAJCS8qICBhbmQgd2FpdCBmb3IgdXBsb2FkIHRvIGNvbXBsZXRlLiAqLwogCiAJCS8qIFBlciBTQUE3MTQ2IGRhdGEgc2hlZXQsIHdyaXRlIHRvIFNUQVRVUyByZWcgdHdpY2UgdG8KQEAgLTc4OCw3ICs4MjUsOCBAQAogCQkJV1I3MTQ2KFBfSTJDU1RBVCwgSTJDX0NMS1NFTCk7CiAJCQkvKiAgV3JpdGUgSTJDIGNvbnRyb2w6IHJlc2V0ICBlcnJvciBmbGFncy4gKi8KIAkJCU1DX0VOQUJMRShQX01DMiwgTUMyX1VQTERfSUlDKTsJLyogIEludm9rZSBjb21tYW5kIHVwbG9hZCAqLwotCQkJd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9JSUMpKSA7CisJCQl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0lJQykpCisJCQkJOwogCQkJLyogYW5kIHdhaXQgZm9yIHVwbG9hZCB0byBjb21wbGV0ZS4gKi8KIAkJfQogCkBAIC04MjgsMTQgKzg2NiwxNCBAQAogCQkgKiBub3Qgc3RhcnQgdXAgaW4gYSBkZWZpbmVkIHN0YXRlIGFmdGVyIGEgUENJIHJlc2V0LgogCQkgKi8KIAotLyogICAgIFBvbGxMaXN0ID0gRU9QTDsJCQkvLyBDcmVhdGUgYSBzaW1wbGUgcG9sbGluZyAqLwotLyogCQkJCQkvLyBsaXN0IGZvciBhbmFsb2cgaW5wdXQgKi8KLS8qIAkJCQkJLy8gY2hhbm5lbCAwLiAqLworLyogICAgIFBvbGxMaXN0ID0gRU9QTDsJCS8vIENyZWF0ZSBhIHNpbXBsZSBwb2xsaW5nICovCisvKgkJCQkvLyBsaXN0IGZvciBhbmFsb2cgaW5wdXQgKi8KKy8qCQkJCS8vIGNoYW5uZWwgMC4gKi8KIC8qICAgICBSZXNldEFEQyggZGV2LCAmUG9sbExpc3QgKTsgKi8KIAogLyogICAgIHM2MjZfYWlfcmluc24oZGV2LGRldi0+c3ViZGV2aWNlcyxOVUxMLGRhdGEpOyAvLyggJkFkY0RhdGEgKTsgLy8gKi8KLS8qIAkJCQkJCSAgLy9HZXQgaW5pdGlhbCBBREMgKi8KLS8qIAkJCQkJCSAgLy92YWx1ZS4gKi8KKy8qCQkJCQkJCS8vR2V0IGluaXRpYWwgQURDICovCisvKgkJCQkJCQkvL3ZhbHVlLiAqLwogCiAvKiAgICAgU3RhcnRWYWwgPSBkYXRhWzBdOyAqLwogCkBAIC04NDgsMTAgKzg4NiwxMCBAQAogCiAvKiAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IDUwMDsgaW5kZXgrKyApICovCiAvKiAgICAgICB7ICovCi0vKiAJczYyNl9haV9yaW5zbihkZXYsZGV2LT5zdWJkZXZpY2VzLE5VTEwsZGF0YSk7ICovCi0vKiAJQWRjRGF0YSA9IGRhdGFbMF07CS8vUmVhZEFEQyggICZBZGNEYXRhICk7ICovCi0vKiAJaWYgKCBBZGNEYXRhICE9IFN0YXJ0VmFsICkgKi8KLS8qIAkgIGJyZWFrOyAqLworLyoJczYyNl9haV9yaW5zbihkZXYsZGV2LT5zdWJkZXZpY2VzLE5VTEwsZGF0YSk7ICovCisvKglBZGNEYXRhID0gZGF0YVswXTsJLy9SZWFkQURDKCAgJkFkY0RhdGEgKTsgKi8KKy8qCWlmICggQWRjRGF0YSAhPSBTdGFydFZhbCApICovCisvKgkJYnJlYWs7ICovCiAvKiAgICAgICB9ICovCiAKIAkJLyogIGVuZCBpbml0QURDICovCkBAIC0xNTEzLDcgKzE1NTEsNyBAQAogCQkJYnJlYWs7CS8qICBFeGl0IHBvbGwgbGlzdCBwcm9jZXNzaW5nIGxvb3AuICovCiAJCX0KIAl9Ci0JREVCVUcoIlJlc2V0QURDOiBBREMgaXRlbXMgJWQgXG4iLCBkZXZwcml2LT5BZGNJdGVtcyk7CisJREVCVUcoIlJlc2V0QURDOiBBREMgaXRlbXMgJWRcbiIsIGRldnByaXYtPkFkY0l0ZW1zKTsKIAogCS8qIFZFUlNJT04gMi4wMSBDSEFOR0U6IERFTEFZIENIQU5HRUQgRlJPTSAyNTBOUyB0byAyVVMuICBBbGxvdyB0aGUKIAkgKiBBREMgdG8gc3RhYmlsaXplIGZvciAyIG1pY3Jvc2Vjb25kcyBiZWZvcmUgc3RhcnRpbmcgdGhlIGZpbmFsCkBAIC0xNTc0LDcgKzE2MTIsNyBAQAogLyogICByZWdpc3RlciB1aW50OF90CWk7ICovCiAvKiAgIHJlZ2lzdGVyIGludDMyX3QJKnJlYWRhZGRyOyAqLwogCi0vKiAgIERFQlVHKCJhczYyNl9haV9yaW5zbjogYWlfcmluc24gZW50ZXIgXG4iKTsgICovCisvKiAgIERFQlVHKCJhczYyNl9haV9yaW5zbjogYWlfcmluc24gZW50ZXJcbiIpOyAgKi8KIAogLyogICBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuICovCiAvKiAgIE1DX0VOQUJMRSggUF9NQzIsIE1DMl9BRENfUlBTICk7ICovCkBAIC0xNTkxLDExICsxNjI5LDExIEBACiAvKiAgQ29udmVydCBBREMgZGF0YSB0byAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgYW5kIGNvcHkgdG8gYXBwbGljYXRpb24gYnVmZmVyLiAqLwogLyogICBmb3IgKCBpID0gMDsgaSA8IGRldnByaXYtPkFkY0l0ZW1zOyBpKysgKSB7ICovCiAvKiAgICAgKmRhdGEgPSBzNjI2X2FpX3JlZ190b191aW50KCAqcmVhZGFkZHIrKyApOyAqLwotLyogICAgIERFQlVHKCJzNjI2X2FpX3JpbnNuOiBkYXRhICVkIFxuIiwqZGF0YSk7ICovCisvKiAgICAgREVCVUcoInM2MjZfYWlfcmluc246IGRhdGEgJWRcbiIsKmRhdGEpOyAqLwogLyogICAgIGRhdGErKzsgKi8KIC8qICAgfSAqLwogCi0vKiAgIERFQlVHKCJzNjI2X2FpX3JpbnNuOiBhaV9yaW5zbiBlc2NhcGUgXG4iKTsgKi8KKy8qICAgREVCVUcoInM2MjZfYWlfcmluc246IGFpX3JpbnNuIGVzY2FwZVxuIik7ICovCiAvKiAgIHJldHVybiBpOyAqLwogLyogfSAqLwogCkBAIC0xNjUxLDcgKzE2ODksOCBAQAogCQkvKiAgc2hpZnQgaW50byBGQiBCVUZGRVIgMSByZWdpc3Rlci4gKi8KIAogCQkvKiAgV2FpdCBmb3IgQURDIGRvbmUuICovCi0JCXdoaWxlICghKFJSNzE0NihQX1BTUikgJiBQU1JfR1BJTzIpKSA7CisJCXdoaWxlICghKFJSNzE0NihQX1BTUikgJiBQU1JfR1BJTzIpKQorCQkJOwogCiAJCS8qICBGZXRjaCBBREMgZGF0YS4gKi8KIAkJaWYgKG4gIT0gMCkKQEAgLTE2ODMsNyArMTcyMiw4IEBACiAJLyogIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGFycml2ZSBpbiBGQiBCVUZGRVIgMSByZWdpc3Rlci4gKi8KIAogCS8qICBXYWl0IGZvciBBREMgZG9uZS4gKi8KLQl3aGlsZSAoIShSUjcxNDYoUF9QU1IpICYgUFNSX0dQSU8yKSkgOworCXdoaWxlICghKFJSNzE0NihQX1BTUikgJiBQU1JfR1BJTzIpKQorCQk7CiAKIAkvKiAgRmV0Y2ggQURDIGRhdGEgZnJvbSBhdWRpbyBpbnRlcmZhY2UncyBpbnB1dCBzaGlmdCByZWdpc3Rlci4gKi8KIApAQCAtMTY5Niw3ICsxNzM2LDcgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGludCBzNjI2X2FpX2xvYWRfcG9sbGxpc3QodWludDhfdCAqIHBwbCwgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgczYyNl9haV9sb2FkX3BvbGxsaXN0KHVpbnQ4X3QgKnBwbCwgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAogCWludCBuOwpAQCAtMTc0Myw3ICsxNzgzLDcgQEAKIAlERUJVRygiczYyNl9haV9jbWQ6IGVudGVyaW5nIGNvbW1hbmQgZnVuY3Rpb25cbiIpOwogCiAJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKSB7Ci0JCXByaW50aygiczYyNl9haV9jbWQ6IEFub3RoZXIgYWlfY21kIGlzIHJ1bm5pbmcgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiczYyNl9haV9jbWQ6IEFub3RoZXIgYWlfY21kIGlzIHJ1bm5pbmcgJWRcbiIsCiAJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yMTQ3LDcgKzIxODcsNyBAQAogCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkRPdXQsIDApOwkvKiAgUHJvZ3JhbSBhbGwgb3V0cHV0cyAqLwogCQkvKiAgdG8gaW5hY3RpdmUgc3RhdGUuICovCiAJfQotCURFQlVHKCJzNjI2X2Rpb19pbml0OiBESU8gaW5pdGlhbGl6ZWQgXG4iKTsKKwlERUJVRygiczYyNl9kaW9faW5pdDogRElPIGluaXRpYWxpemVkXG4iKTsKIH0KIAogLyogRElPIGRldmljZXMgYXJlIHNsaWdodGx5IHNwZWNpYWwuICBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0bwpAQCAtMjM0Niw3ICsyMzg2LDcgQEAKIAlpbnQgbjsKIAlzdHJ1Y3QgZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CiAKLQlERUJVRygiczYyNl9lbmNfaW5zbl9yZWFkOiBlbmNvZGVyIHJlYWQgY2hhbm5lbCAlZCBcbiIsCisJREVCVUcoInM2MjZfZW5jX2luc25fcmVhZDogZW5jb2RlciByZWFkIGNoYW5uZWwgJWRcbiIsCiAJICAgICAgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpOwogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKQEAgLTIzNjQsNyArMjQwNCw3IEBACiAKIAlzdHJ1Y3QgZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CiAKLQlERUJVRygiczYyNl9lbmNfaW5zbl93cml0ZTogZW5jb2RlciB3cml0ZSBjaGFubmVsICVkIFxuIiwKKwlERUJVRygiczYyNl9lbmNfaW5zbl93cml0ZTogZW5jb2RlciB3cml0ZSBjaGFubmVsICVkXG4iLAogCSAgICAgIENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpKTsKIAogCS8qICBTZXQgdGhlIHByZWxvYWQgcmVnaXN0ZXIgKi8KQEAgLTI0MjUsOCArMjQ2NSw3IEBACiBzdGF0aWMgdWludDhfdCB0cmltY2hhbltdID0geyAxMCwgOSwgOCwgMywgMiwgNywgNiwgMSwgMCwgNSwgNCB9OwogCiAvKiAgVHJpbURhYyBMb2dpY2FsQ2hhbi10by1FZXByb21BZHJzIG1hcHBpbmcgdGFibGUuICovCi1zdGF0aWMgdWludDhfdCB0cmltYWRyc1tdID0KLSAgICB7IDB4NDAsIDB4NDEsIDB4NDIsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMgfTsKK3N0YXRpYyB1aW50OF90IHRyaW1hZHJzW10gPSB7IDB4NDAsIDB4NDEsIDB4NDIsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMgfTsKIAogc3RhdGljIHZvaWQgTG9hZFRyaW1EQUNzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CkBAIC0yNTI0LDEwICsyNTYzLDEyIEBACiAJLyogIHVwbG9hZCBjb25maXJtYXRpb24uICovCiAKIAlNQ19FTkFCTEUoUF9NQzIsIE1DMl9VUExEX0lJQyk7Ci0Jd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9JSUMpKSA7CisJd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9JSUMpKQorCQk7CiAKIAkvKiAgV2FpdCB1bnRpbCBJMkMgYnVzIHRyYW5zZmVyIGlzIGZpbmlzaGVkIG9yIGFuIGVycm9yIG9jY3Vycy4gKi8KLQl3aGlsZSAoKFJSNzE0NihQX0kyQ0NUUkwpICYgKEkyQ19CVVNZIHwgSTJDX0VSUikpID09IEkyQ19CVVNZKSA7CisJd2hpbGUgKChSUjcxNDYoUF9JMkNDVFJMKSAmIChJMkNfQlVTWSB8IEkyQ19FUlIpKSA9PSBJMkNfQlVTWSkKKwkJOwogCiAJLyogIFJldHVybiBub24temVybyBpZiBJMkMgZXJyb3Igb2NjdXJlZC4gKi8KIAlyZXR1cm4gUlI3MTQ2KFBfSTJDQ1RSTCkgJiBJMkNfRVJSOwpAQCAtMjY0MSw3ICsyNjgyLDggQEAKIAkgKiBEb25lIGJ5IHBvbGxpbmcgdGhlIERNQUMgZW5hYmxlIGZsYWc7IHRoaXMgZmxhZyBpcyBhdXRvbWF0aWNhbGx5CiAJICogY2xlYXJlZCB3aGVuIHRoZSB0cmFuc2ZlciBoYXMgZmluaXNoZWQuCiAJICovCi0Jd2hpbGUgKChSUjcxNDYoUF9NQzEpICYgTUMxX0EyT1VUKSAhPSAwKSA7CisJd2hpbGUgKChSUjcxNDYoUF9NQzEpICYgTUMxX0EyT1VUKSAhPSAwKQorCQk7CiAKIAkvKiBTVEFSVCBUSEUgT1VUUFVUIFNUUkVBTSBUTyBUSEUgVEFSR0VUIERBQyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yNjU4LDcgKzI3MDAsOCBAQAogCSAqIGZpbmlzaGVkIHRyYW5zZmVycmluZyB0aGUgREFDJ3MgZGF0YSBEV09SRCBmcm9tIHRoZSBvdXRwdXQgRklGTwogCSAqIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHJlZ2lzdGVyLgogCSAqLwotCXdoaWxlICgoUlI3MTQ2KFBfU1NSKSAmIFNTUl9BRjJfT1VUKSA9PSAwKSA7CisJd2hpbGUgKChSUjcxNDYoUF9TU1IpICYgU1NSX0FGMl9PVVQpID09IDApCisJCTsKIAogCS8qIFNldCB1cCB0byB0cmFwIGV4ZWN1dGlvbiBhdCBzbG90IDAgd2hlbiB0aGUgVFNMIHNlcXVlbmNlciBjeWNsZXMKIAkgKiBiYWNrIHRvIHNsb3QgMCBhZnRlciBleGVjdXRpbmcgdGhlIEVPUyBpbiBzbG90IDUuICBBbHNvLApAQCAtMjY5NCw3ICsyNzM3LDggQEAKIAkJICogZnJvbSAweEZGIHRvIDB4MDAsIHdoaWNoIHNsb3QgMCBjYXVzZXMgdG8gaGFwcGVuIGJ5IHNoaWZ0aW5nCiAJCSAqIG91dC9pbiBvbiBTRDIgdGhlIDB4MDAgdGhhdCBpcyBhbHdheXMgcmVmZXJlbmNlZCBieSBzbG90IDUuCiAJCSAqLwotCQl3aGlsZSAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgIT0gMCkgOworCQl3aGlsZSAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgIT0gMCkKKwkJCTsKIAl9CiAJLyogRWl0aGVyICgxKSB3ZSB3ZXJlIHRvbyBsYXRlIHNldHRpbmcgdGhlIHNsb3QgMCB0cmFwOyB0aGUgVFNMCiAJICogc2VxdWVuY2VyIHJlc3RhcnRlZCBzbG90IDAgYmVmb3JlIHdlIGNvdWxkIHNldCB0aGUgRU9TIHRyYXAgZmxhZywKQEAgLTI3MTAsNyArMjc1NCw4IEBACiAJICogdGhlIG5leHQgREFDIHdyaXRlLiAgVGhpcyBpcyBkZXRlY3RlZCB3aGVuIEZCX0JVRkZFUjIgTVNCIGNoYW5nZXMKIAkgKiBmcm9tIDB4MDAgdG8gMHhGRi4KIAkgKi8KLQl3aGlsZSAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgPT0gMCkgOworCXdoaWxlICgoUlI3MTQ2KFBfRkJfQlVGRkVSMikgJiAweEZGMDAwMDAwKSA9PSAwKQorCQk7CiB9CiAKIHN0YXRpYyB2b2lkIFdyaXRlTUlTQzIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDE2X3QgTmV3SW1hZ2UpCkBAIC0yNzQ5LDEwICsyNzk0LDEyIEBACiAKIAkvKiAgV2FpdCBmb3IgY29tcGxldGlvbiBvZiB1cGxvYWQgZnJvbSBzaGFkb3cgUkFNIHRvIERFQkkgY29udHJvbCAqLwogCS8qICByZWdpc3Rlci4gKi8KLQl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0RFQkkpKSA7CisJd2hpbGUgKCFNQ19URVNUKFBfTUMyLCBNQzJfVVBMRF9ERUJJKSkKKwkJOwogCiAJLyogIFdhaXQgdW50aWwgREVCSSB0cmFuc2ZlciBpcyBkb25lLiAqLwotCXdoaWxlIChSUjcxNDYoUF9QU1IpICYgUFNSX0RFQklfUykgOworCXdoaWxlIChSUjcxNDYoUF9QU1IpICYgUFNSX0RFQklfUykKKwkJOwogfQogCiAvKiAgV3JpdGUgYSB2YWx1ZSB0byBhIGdhdGUgYXJyYXkgcmVnaXN0ZXIuICovCkBAIC0zMDk5LDE4ICszMTQ2LDE4IEBACiBzdGF0aWMgdm9pZCBTZXRMYXRjaFNvdXJjZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGUgKmssCiAJCQkgICB1aW50MTZfdCB2YWx1ZSkKIHsKLQlERUJVRygiU2V0TGF0Y2hTb3VyY2U6IFNldExhdGNoU291cmNlIGVudGVyIDM1NTAgXG4iKTsKKwlERUJVRygiU2V0TGF0Y2hTb3VyY2U6IFNldExhdGNoU291cmNlIGVudGVyIDM1NTBcbiIpOwogCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCiAJCSAgICAodWludDE2X3QpICh+KENSQk1TS19JTlRDVFJMIHwgQ1JCTVNLX0xBVENIU1JDKSksCiAJCSAgICAodWludDE2X3QpICh2YWx1ZSA8PCBDUkJCSVRfTEFUQ0hTUkMpKTsKIAotCURFQlVHKCJTZXRMYXRjaFNvdXJjZTogU2V0TGF0Y2hTb3VyY2UgZXhpdCBcbiIpOworCURFQlVHKCJTZXRMYXRjaFNvdXJjZTogU2V0TGF0Y2hTb3VyY2UgZXhpdFxuIik7CiB9CiAKIC8qCiAgKiBzdGF0aWMgdWludDE2X3QgR2V0TGF0Y2hTb3VyY2Uoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGVuY19wcml2YXRlICprICkKICAqIHsKLSAqIAlyZXR1cm4gKCBERUJJcmVhZCggZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0xBVENIU1JDICkgJiAzOworICoJcmV0dXJuICggREVCSXJlYWQoIGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9MQVRDSFNSQyApICYgMzsKICAqIH0KICAqLwogCkBAIC0zMzE3LDYgKzMzNjQsNiBAQAogCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CiAJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfQUxXQVlTKTsKIAl9Ci0JREVCVUcoIkNvdW50ZXJzSW5pdDogY291bnRlcnMgaW5pdGlhbGl6ZWQgXG4iKTsKKwlERUJVRygiQ291bnRlcnNJbml0OiBjb3VudGVycyBpbml0aWFsaXplZFxuIik7CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCmluZGV4IGQwMjc0MmEuLjJkMWFmZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaApAQCAtNzIwLDE1ICs3MjAsNiBAQAogI2RlZmluZSBTVERNU0tfQ0xLTVVMVAkJKCh1aW50MTZfdCkoMyA8PCBTVERCSVRfQ0xLTVVMVCkpCiAjZGVmaW5lIFNURE1TS19DTEtFTkFCCQkoKHVpbnQxNl90KSgxIDw8IFNUREJJVF9DTEtFTkFCKSkKIAotLyogdHlwZWRlZiBzdHJ1Y3QgaW5kZXhDb3VudGVyICovCi0vKiB7ICovCi0vKiAgIHVuc2lnbmVkIGludCBhbzsgKi8KLS8qICAgdW5zaWduZWQgaW50IGFpOyAqLwotLyogICB1bnNpZ25lZCBpbnQgZGlnb3V0OyAqLwotLyogICB1bnNpZ25lZCBpbnQgZGlnaW47ICovCi0vKiAgIHVuc2lnbmVkIGludCBlbmM7ICovCi0vKiB9Q2FsbENvdW50ZXI7ICovCi0KIHN0cnVjdCBidWZmZXJETUEgewogCWRtYV9hZGRyX3QgUGh5c2ljYWxCYXNlOwogCXZvaWQgKkxvZ2ljYWxCYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKaW5kZXggMDc5MjYxNy4uYzliZTllMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCkBAIC0zOTMsMTUgKzM5MywxNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2VyaWFsXzIwMDJfb3BlbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzZXJpYWxfMjAwMl9vcGVuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CisJaW50IHJlc3VsdDsKIAljaGFyIHBvcnRbMjBdOwogCiAJc3ByaW50Zihwb3J0LCAiL2Rldi90dHlTJWQiLCBkZXZwcml2LT5wb3J0KTsKIAlkZXZwcml2LT50dHkgPSBmaWxwX29wZW4ocG9ydCwgT19SRFdSLCAwKTsKIAlpZiAoSVNfRVJSKGRldnByaXYtPnR0eSkpIHsKLQkJcHJpbnRrKCJzZXJpYWxfMjAwMjogZmlsZSBvcGVuIGVycm9yID0gJWxkXG4iLAotCQkgICAgICAgUFRSX0VSUihkZXZwcml2LT50dHkpKTsKKwkJcmVzdWx0ID0gKGludClQVFJfRVJSKGRldnByaXYtPnR0eSk7CisJCXByaW50aygic2VyaWFsXzIwMDI6IGZpbGUgb3BlbiBlcnJvciA9ICVkXG4iLCByZXN1bHQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBjb25maWdfdCB7CiAKQEAgLTQxMSwyOSArNDEyLDI1IEBACiAJCQlpbnQgbWF4OwogCQl9OwogCi0JCXN0cnVjdCBjb25maWdfdCBkaWdfaW5fY29uZmlnWzMyXTsKLQkJc3RydWN0IGNvbmZpZ190IGRpZ19vdXRfY29uZmlnWzMyXTsKLQkJc3RydWN0IGNvbmZpZ190IGNoYW5faW5fY29uZmlnWzMyXTsKLQkJc3RydWN0IGNvbmZpZ190IGNoYW5fb3V0X2NvbmZpZ1szMl07CisJCXN0cnVjdCBjb25maWdfdCAqZGlnX2luX2NvbmZpZzsKKwkJc3RydWN0IGNvbmZpZ190ICpkaWdfb3V0X2NvbmZpZzsKKwkJc3RydWN0IGNvbmZpZ190ICpjaGFuX2luX2NvbmZpZzsKKwkJc3RydWN0IGNvbmZpZ190ICpjaGFuX291dF9jb25maWc7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlkaWdfaW5fY29uZmlnW2ldLmtpbmQgPSAwOwotCQkJZGlnX2luX2NvbmZpZ1tpXS5iaXRzID0gMDsKLQkJCWRpZ19pbl9jb25maWdbaV0ubWluID0gMDsKLQkJCWRpZ19pbl9jb25maWdbaV0ubWF4ID0gMDsKLQkJCWRpZ19vdXRfY29uZmlnW2ldLmtpbmQgPSAwOwotCQkJZGlnX291dF9jb25maWdbaV0uYml0cyA9IDA7Ci0JCQlkaWdfb3V0X2NvbmZpZ1tpXS5taW4gPSAwOwotCQkJZGlnX291dF9jb25maWdbaV0ubWF4ID0gMDsKLQkJCWNoYW5faW5fY29uZmlnW2ldLmtpbmQgPSAwOwotCQkJY2hhbl9pbl9jb25maWdbaV0uYml0cyA9IDA7Ci0JCQljaGFuX2luX2NvbmZpZ1tpXS5taW4gPSAwOwotCQkJY2hhbl9pbl9jb25maWdbaV0ubWF4ID0gMDsKLQkJCWNoYW5fb3V0X2NvbmZpZ1tpXS5raW5kID0gMDsKLQkJCWNoYW5fb3V0X2NvbmZpZ1tpXS5iaXRzID0gMDsKLQkJCWNoYW5fb3V0X2NvbmZpZ1tpXS5taW4gPSAwOwotCQkJY2hhbl9vdXRfY29uZmlnW2ldLm1heCA9IDA7CisJCXJlc3VsdCA9IDA7CisJCWRpZ19pbl9jb25maWcgPSBrY2FsbG9jKDMyLCBzaXplb2Yoc3RydWN0IGNvbmZpZ190KSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJZGlnX291dF9jb25maWcgPSBrY2FsbG9jKDMyLCBzaXplb2Yoc3RydWN0IGNvbmZpZ190KSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJY2hhbl9pbl9jb25maWcgPSBrY2FsbG9jKDMyLCBzaXplb2Yoc3RydWN0IGNvbmZpZ190KSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJY2hhbl9vdXRfY29uZmlnID0ga2NhbGxvYygzMiwgc2l6ZW9mKHN0cnVjdCBjb25maWdfdCksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghZGlnX2luX2NvbmZpZyB8fCAhZGlnX291dF9jb25maWcKKwkJICAgIHx8ICFjaGFuX2luX2NvbmZpZyB8fCAhY2hhbl9vdXRfY29uZmlnKSB7CisJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfYWxsb2NfY29uZmlnczsKIAkJfQogCiAJCXR0eV9zZXRzcGVlZChkZXZwcml2LT50dHksIGRldnByaXYtPnNwZWVkKTsKQEAgLTQ0Nyw3ICs0NDQsNyBAQAogCQkJCWJyZWFrOwogCQkJfSBlbHNlIHsKIAkJCQlpbnQgY29tbWFuZCwgY2hhbm5lbCwga2luZDsKLQkJCQlzdHJ1Y3QgY29uZmlnX3QgKmN1cl9jb25maWcgPSAwOworCQkJCXN0cnVjdCBjb25maWdfdCAqY3VyX2NvbmZpZyA9IE5VTEw7CiAKIAkJCQljaGFubmVsID0gZGF0YS52YWx1ZSAmIDB4MWY7CiAJCQkJa2luZCA9IChkYXRhLnZhbHVlID4+IDUpICYgMHg3OwpAQCAtNTc0LDggKzU3MSw4IEBACiAJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CiAJCQkvKiAgRmlsbCBpbiBzdWJkZXYgZGF0YSAqLwogCQkJc3RydWN0IGNvbmZpZ190ICpjOwotCQkJdW5zaWduZWQgY2hhciAqbWFwcGluZyA9IDA7Ci0JCQlzdHJ1Y3Qgc2VyaWFsMjAwMl9yYW5nZV90YWJsZV90ICpyYW5nZSA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICptYXBwaW5nID0gTlVMTDsKKwkJCXN0cnVjdCBzZXJpYWwyMDAyX3JhbmdlX3RhYmxlX3QgKnJhbmdlID0gTlVMTDsKIAkJCWludCBraW5kID0gMDsKIAogCQkJc3dpdGNoIChpKSB7CkBAIC02MTMsNyArNjEwLDcgQEAKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OnsKLQkJCQkJYyA9IDA7CisJCQkJCWMgPSBOVUxMOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KQEAgLTYzMiwyMiArNjI5LDIzIEBACiAJCQkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CiAJCQkJcy0+bl9jaGFuID0gY2hhbjsKIAkJCQlzLT5tYXhkYXRhID0gMDsKLQkJCQlpZiAocy0+bWF4ZGF0YV9saXN0KSB7Ci0JCQkJCWtmcmVlKHMtPm1heGRhdGFfbGlzdCk7Ci0JCQkJfQorCQkJCWtmcmVlKHMtPm1heGRhdGFfbGlzdCk7CiAJCQkJcy0+bWF4ZGF0YV9saXN0ID0gbWF4ZGF0YV9saXN0ID0KIAkJCQkgICAga21hbGxvYyhzaXplb2YodW5zaWduZWQgaW50KSAqIHMtPm5fY2hhbiwKIAkJCQkJICAgIEdGUF9LRVJORUwpOwotCQkJCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7Ci0JCQkJCWtmcmVlKHMtPnJhbmdlX3RhYmxlX2xpc3QpOwotCQkJCX0KKwkJCQlpZiAoIXMtPm1heGRhdGFfbGlzdCkKKwkJCQkJYnJlYWs7CS8qIGVycm9yIGhhbmRsZWQgYmVsb3cgKi8KKwkJCQlrZnJlZShzLT5yYW5nZV90YWJsZV9saXN0KTsKKwkJCQlzLT5yYW5nZV90YWJsZSA9IE5VTEw7CisJCQkJcy0+cmFuZ2VfdGFibGVfbGlzdCA9IE5VTEw7CiAJCQkJaWYgKHJhbmdlKSB7Ci0JCQkJCXMtPnJhbmdlX3RhYmxlID0gMDsKIAkJCQkJcy0+cmFuZ2VfdGFibGVfbGlzdCA9IHJhbmdlX3RhYmxlX2xpc3QgPQogCQkJCQkgICAga21hbGxvYyhzaXplb2YKIAkJCQkJCSAgICAoc3RydWN0CiAJCQkJCQkgICAgIHNlcmlhbDIwMDJfcmFuZ2VfdGFibGVfdCkgKgogCQkJCQkJICAgIHMtPm5fY2hhbiwgR0ZQX0tFUk5FTCk7CisJCQkJCWlmICghcy0+cmFuZ2VfdGFibGVfbGlzdCkKKwkJCQkJCWJyZWFrOwkvKiBlcnIgaGFuZGxlZCBiZWxvdyAqLwogCQkJCX0KIAkJCQlmb3IgKGNoYW4gPSAwLCBqID0gMDsgaiA8IDMyOyBqKyspIHsKIAkJCQkJaWYgKGNbal0ua2luZCA9PSBraW5kKSB7CkBAIC02NzMsNyArNjcxLDM1IEBACiAJCQkJfQogCQkJfQogCQl9CisJCWlmIChpIDw9IDQpIHsKKwkJCS8qIEZhaWxlZCB0byBhbGxvY2F0ZSBtYXhkYXRhX2xpc3Qgb3IgcmFuZ2VfdGFibGVfbGlzdAorCQkJICogZm9yIGEgc3ViZGV2aWNlIHRoYXQgbmVlZGVkIGl0LiAgKi8KKwkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykgeworCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCisJCQkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CisJCQkJa2ZyZWUocy0+bWF4ZGF0YV9saXN0KTsKKwkJCQlzLT5tYXhkYXRhX2xpc3QgPSBOVUxMOworCQkJCWtmcmVlKHMtPnJhbmdlX3RhYmxlX2xpc3QpOworCQkJCXMtPnJhbmdlX3RhYmxlX2xpc3QgPSBOVUxMOworCQkJfQorCQl9CisKK2Vycl9hbGxvY19jb25maWdzOgorCQlrZnJlZShkaWdfaW5fY29uZmlnKTsKKwkJa2ZyZWUoZGlnX291dF9jb25maWcpOworCQlrZnJlZShjaGFuX2luX2NvbmZpZyk7CisJCWtmcmVlKGNoYW5fb3V0X2NvbmZpZyk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKGRldnByaXYtPnR0eSkgeworCQkJCWZpbHBfY2xvc2UoZGV2cHJpdi0+dHR5LCAwKTsKKwkJCQlkZXZwcml2LT50dHkgPSBOVUxMOworCQkJfQorCQl9CiAJfQorCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIHNlcmlhbF8yMDAyX2Nsb3NlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCkBAIC04NzksNyArOTA1LDcgQEAKIAlpbnQgaTsKIAogCXByaW50aygiY29tZWRpJWQ6IHNlcmlhbDIwMDI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CiAJCWlmIChzLT5tYXhkYXRhX2xpc3QpIHsKIAkJCWtmcmVlKHMtPm1heGRhdGFfbGlzdCk7CkBAIC04OTEsNCArOTE3LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfc2VyaWFsMjAwMik7CitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfc2VyaWFsMjAwMl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfc2VyaWFsMjAwMik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfc2VyaWFsMjAwMl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3NlcmlhbDIwMDIpOworfQorCittb2R1bGVfaW5pdChkcml2ZXJfc2VyaWFsMjAwMl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfc2VyaWFsMjAwMl9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCmluZGV4IDQ5MDc1M2IuLjBiOWVjYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYwpAQCAtMzksMjggKzM5LDI4IEBACiAgKiBUaGUgcHJldmlvdXMgYmxvY2sgY29tbWVudCBpcyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUKICAqIGRvY3VtZW50YXRpb24gaW4gQ29tZWRpIGFuZCBDb21lZGlsaWIuICBUaGUgZmllbGRzOgogICoKLSAqIERyaXZlcjogdGhlIG5hbWUgb2YgdGhlIGRyaXZlcgotICogRGVzY3JpcHRpb246IGEgc2hvcnQgcGhyYXNlIGRlc2NyaWJpbmcgdGhlIGRyaXZlci4gIERvbid0IGxpc3QgYm9hcmRzLgotICogRGV2aWNlczogYSBmdWxsIGxpc3Qgb2YgdGhlIGJvYXJkcyB0aGF0IGF0dGVtcHQgdG8gYmUgc3VwcG9ydGVkIGJ5Ci0gKiAgIHRoZSBkcml2ZXIuICBGb3JtYXQgaXMgIihtYW51ZmFjdHVyZXIpIGJvYXJkIG5hbWUgW2NvbWVkaSBuYW1lXSIsCi0gKiAgIHdoZXJlIGNvbWVkaV9uYW1lIGlzIHRoZSBuYW1lIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGJvYXJkLgotICogICBTZWUgdGhlIGNvbW1lbnQgbmVhciBib2FyZF9uYW1lOiBpbiB0aGUgc3RydWN0IGNvbWVkaV9kcml2ZXIgc3RydWN0dXJlCi0gKiAgIGJlbG93LiAgSWYgKG1hbnVmYWN0dXJlcikgb3IgW2NvbWVkaSBuYW1lXSBpcyBtaXNzaW5nLCB0aGUgcHJldmlvdXMKLSAqICAgdmFsdWUgaXMgdXNlZC4KLSAqIEF1dGhvcjogeW91Ci0gKiBVcGRhdGVkOiBkYXRlIHdoZW4gdGhlIF9kb2N1bWVudGF0aW9uXyB3YXMgbGFzdCB1cGRhdGVkLiAgVXNlICdkYXRlIC1SJwotICogICB0byBnZXQgYSB2YWx1ZSBmb3IgdGhpcy4KLSAqIFN0YXR1czogYSBvbmUtd29yZCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhdHVzLiAgVmFsaWQgdmFsdWVzIGFyZToKLSAqICAgd29ya3MgLSBkcml2ZXIgd29ya3MgY29ycmVjdGx5IG9uIG1vc3QgYm9hcmRzIHN1cHBvcnRlZCwgYW5kCi0gKiAgICAgcGFzc2VzIGNvbWVkaV90ZXN0LgotICogICB1bmtub3duIC0gdW5rbm93bi4gIFVzdWFsbHkgcHV0IHRoZXJlIGJ5IGRzLgotICogICBleHBlcmltZW50YWwgLSBtYXkgbm90IHdvcmsgaW4gYW55IHBhcnRpY3VsYXIgcmVsZWFzZS4gIEF1dGhvcgotICogICAgIHByb2JhYmx5IHdhbnRzIGFzc2lzdGFuY2UgdGVzdGluZyBpdC4KLSAqICAgYml0cm90dGVuIC0gZHJpdmVyIGhhcyBub3QgYmVlbiB1cGRhdGUgaW4gYSBsb25nIHRpbWUsIHByb2JhYmx5Ci0gKiAgICAgZG9lc24ndCB3b3JrLCBhbmQgcHJvYmFibHkgaXMgbWlzc2luZyBzdXBwb3J0IGZvciBzaWduaWZpY2FudAotICogICAgIENvbWVkaSBpbnRlcmZhY2UgZmVhdHVyZXMuCi0gKiAgIHVudGVzdGVkIC0gYXV0aG9yIHByb2JhYmx5IHdyb3RlIGl0ICJibGluZCIsIGFuZCBpcyBiZWxpZXZlZCB0bwotICogICAgIHdvcmssIGJ1dCBubyBjb25maXJtYXRpb24uCisgKiAgRHJpdmVyOiB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyCisgKiAgRGVzY3JpcHRpb246IGEgc2hvcnQgcGhyYXNlIGRlc2NyaWJpbmcgdGhlIGRyaXZlci4gIERvbid0IGxpc3QgYm9hcmRzLgorICogIERldmljZXM6IGEgZnVsbCBsaXN0IG9mIHRoZSBib2FyZHMgdGhhdCBhdHRlbXB0IHRvIGJlIHN1cHBvcnRlZCBieQorICogICAgdGhlIGRyaXZlci4gIEZvcm1hdCBpcyAiKG1hbnVmYWN0dXJlcikgYm9hcmQgbmFtZSBbY29tZWRpIG5hbWVdIiwKKyAqICAgIHdoZXJlIGNvbWVkaV9uYW1lIGlzIHRoZSBuYW1lIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGJvYXJkLgorICogICAgU2VlIHRoZSBjb21tZW50IG5lYXIgYm9hcmRfbmFtZTogaW4gdGhlIHN0cnVjdCBjb21lZGlfZHJpdmVyIHN0cnVjdHVyZQorICogICAgYmVsb3cuICBJZiAobWFudWZhY3R1cmVyKSBvciBbY29tZWRpIG5hbWVdIGlzIG1pc3NpbmcsIHRoZSBwcmV2aW91cworICogICAgdmFsdWUgaXMgdXNlZC4KKyAqICBBdXRob3I6IHlvdQorICogIFVwZGF0ZWQ6IGRhdGUgd2hlbiB0aGUgX2RvY3VtZW50YXRpb25fIHdhcyBsYXN0IHVwZGF0ZWQuICBVc2UgJ2RhdGUgLVInCisgKiAgICB0byBnZXQgYSB2YWx1ZSBmb3IgdGhpcy4KKyAqICBTdGF0dXM6IGEgb25lLXdvcmQgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXR1cy4gIFZhbGlkIHZhbHVlcyBhcmU6CisgKiAgICB3b3JrcyAtIGRyaXZlciB3b3JrcyBjb3JyZWN0bHkgb24gbW9zdCBib2FyZHMgc3VwcG9ydGVkLCBhbmQKKyAqICAgICAgcGFzc2VzIGNvbWVkaV90ZXN0LgorICogICAgdW5rbm93biAtIHVua25vd24uICBVc3VhbGx5IHB1dCB0aGVyZSBieSBkcy4KKyAqICAgIGV4cGVyaW1lbnRhbCAtIG1heSBub3Qgd29yayBpbiBhbnkgcGFydGljdWxhciByZWxlYXNlLiAgQXV0aG9yCisgKiAgICAgIHByb2JhYmx5IHdhbnRzIGFzc2lzdGFuY2UgdGVzdGluZyBpdC4KKyAqICAgIGJpdHJvdHRlbiAtIGRyaXZlciBoYXMgbm90IGJlZW4gdXBkYXRlIGluIGEgbG9uZyB0aW1lLCBwcm9iYWJseQorICogICAgICBkb2Vzbid0IHdvcmssIGFuZCBwcm9iYWJseSBpcyBtaXNzaW5nIHN1cHBvcnQgZm9yIHNpZ25pZmljYW50CisgKiAgICAgIENvbWVkaSBpbnRlcmZhY2UgZmVhdHVyZXMuCisgKiAgICB1bnRlc3RlZCAtIGF1dGhvciBwcm9iYWJseSB3cm90ZSBpdCAiYmxpbmQiLCBhbmQgaXMgYmVsaWV2ZWQgdG8KKyAqICAgICAgd29yaywgYnV0IG5vIGNvbmZpcm1hdGlvbi4KICAqCiAgKiBUaGVzZSBoZWFkZXJzIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUsIGFuZCBhbnkgY29tbWVudHMKICAqIHlvdSB3aXNoIHRvIHNheSBhYm91dCB0aGUgZHJpdmVyLiAgVGhlIGNvbW1lbnQgYXJlYSBpcyB0aGUgcGxhY2UKQEAgLTYyMCwxMiArNjIwLDU5IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qCi0gKiBBIGNvbnZlbmllbnQgbWFjcm8gdGhhdCBkZWZpbmVzIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCksCi0gKiBhcyBuZWNlc3NhcnkuCi0gKi8KLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfc2tlbCk7Ci0vKiBJZiB5b3UgYXJlIHdyaXRpbmcgYSBQQ0kgZHJpdmVyIHlvdSBzaG91bGQgdXNlIENPTUVESV9QQ0lfSU5JVENMRUFOVVAKLSAqIGluc3RlYWQuCi0gKi8KLS8qIENPTUVESV9QQ0lfSU5JVENMRUFOVVAoZHJpdmVyX3NrZWwsIHNrZWxfcGNpX3RhYmxlKSAqLworI2lmZGVmIENPTkZJR19DT01FRElfUENJCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcml2ZXJfc2tlbF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGRyaXZlcl9za2VsLmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRyaXZlcl9za2VsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlcl9za2VsX3BjaV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gc2tlbF9wY2lfdGFibGUsCisJLnByb2JlID0gJmRyaXZlcl9za2VsX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoJmRyaXZlcl9za2VsX3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkcml2ZXJfc2tlbF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfc2tlbCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkcml2ZXJfc2tlbF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9za2VsLmRyaXZlcl9uYW1lOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfc2tlbF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9za2VsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXJfc2tlbF9wY2lfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9za2VsKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX3NrZWxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHJpdmVyX3NrZWxfY2xlYW51cF9tb2R1bGUpOworI2Vsc2UKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9za2VsX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9za2VsKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRyaXZlcl9za2VsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfc2tlbCk7Cit9CisKK21vZHVsZV9pbml0KGRyaXZlcl9za2VsX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGRyaXZlcl9za2VsX2NsZWFudXBfbW9kdWxlKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYwppbmRleCAxOGIwYTgzLi41MjZkZTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMKQEAgLTEwMiw3ICsxMDIsMTggQEAKIAkubnVtX25hbWVzID0gQVJSQVlfU0laRShkbnBfYm9hcmRzKSwKIH07CiAKLUNPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfZG5wKTsKK3N0YXRpYyBpbnQgX19pbml0IGRyaXZlcl9kbnBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gY29tZWRpX2RyaXZlcl9yZWdpc3RlcigmZHJpdmVyX2RucCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkcml2ZXJfZG5wX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfZG5wKTsKK30KKworbW9kdWxlX2luaXQoZHJpdmVyX2RucF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkcml2ZXJfZG5wX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCBkbnBfZGlvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKQEAgLTMxNCwzICszMjUsNyBAQAogCXJldHVybiAxOwogCiB9CisKK01PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91bmlveHg1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdW5pb3h4NS5jCmluZGV4IDE2ZDRjOWYuLjU5ODg4NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91bmlveHg1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VuaW94eDUuYwpAQCAtMTE0LDcgKzExNCwxOCBAQAogCS5kZXRhY2ggPSB1bmlveHg1X2RldGFjaAogfTsKIAotQ09NRURJX0lOSVRDTEVBTlVQKHVuaW94eDVfZHJpdmVyKTsKK3N0YXRpYyBpbnQgX19pbml0IHVuaW94eDVfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJnVuaW94eDVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVuaW94eDVfZHJpdmVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZ1bmlveHg1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVuaW94eDVfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHVuaW94eDVfZHJpdmVyX2NsZWFudXBfbW9kdWxlKTsKIAogc3RhdGljIGludCB1bmlveHg1X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCkBAIC0zMDIsNyArMzEzLDggQEAKIAkJX191bmlveHg1X2FuYWxvZ19jb25maWcodXNwLCBpICogMik7CiAJCW91dGIoaSArIDEsIHN1YmRldl9pb2Jhc2UgKyA1KTsJLyogc2VuZHMgY2hhbm5lbCBudW1iZXIgdG8gY2FyZCAqLwogCQlvdXRiKCdIJywgc3ViZGV2X2lvYmFzZSArIDYpOwkvKiByZXF1ZXN0cyBFRVBST00gd29ybGQgKi8KLQkJd2hpbGUgKCEoaW5iKHN1YmRldl9pb2Jhc2UgKyAwKSAmIFR4QkUpKSA7CS8qIHdhaXRzIHdoaWxlIHdyaXR0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLworCQl3aGlsZSAoIShpbmIoc3ViZGV2X2lvYmFzZSArIDApICYgVHhCRSkpCisJCQk7CS8qIHdhaXRzIHdoaWxlIHdyaXR0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLwogCQlvdXRiKDAsIHN1YmRldl9pb2Jhc2UgKyA2KTsKIAogCQkvKiB3YWl0cyB3aGlsZSByZWFkaW5nIG9mIHR3byBieXRlcyB3aWxsIGJlIGFsbG93ZWQgKi8KQEAgLTQzNyw3ICs0NDksOCBAQAogCiAJLyogc2VuZGluZyBmb3IgYnl0ZXMgdG8gbW9kdWxlKG9uZSBieXRlIHBlciBjeWNsZSBpdGVyYXRpb24pICovCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQl3aGlsZSAoISgoaW5iKHVzcC0+dXNwX2lvYmFzZSArIDApKSAmIFR4QkUpKSA7CS8qIHdhaXRzIHdoaWxlIHdyaXR0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLworCQl3aGlsZSAoISgoaW5iKHVzcC0+dXNwX2lvYmFzZSArIDApKSAmIFR4QkUpKQorCQkJOwkvKiB3YWl0cyB3aGlsZSB3cml0dGluZyB3aWxsIGJlIGFsbG93ZWQgKi8KIAkJb3V0Yih1c3AtPnVzcF9leHRyYV9kYXRhW21vZHVsZV1baV0sIHVzcC0+dXNwX2lvYmFzZSArIDYpOwogCX0KIApAQCAtNDY3LDcgKzQ4MCw4IEBACiAJY29udHJvbCA9IGluYih1c3AtPnVzcF9pb2Jhc2UpOwkvKiBnZXQgY29udHJvbCByZWdpc3RlciBieXRlICovCiAKIAkvKiB3YWl0cyB3aGlsZSByZWFkaW5nIGZvdXIgYnl0ZXMgd2lsbCBiZSBhbGxvd2VkICovCi0Jd2hpbGUgKCEoKGNvbnRyb2wgPSBpbmIodXNwLT51c3BfaW9iYXNlICsgMCkpICYgUng0Q0EpKSA7CisJd2hpbGUgKCEoKGNvbnRyb2wgPSBpbmIodXNwLT51c3BfaW9iYXNlICsgMCkpICYgUng0Q0EpKQorCQk7CiAKIAkvKiBpZiBmb3VyIGJ5dGVzIHJlYWRkaW5nIGVycm9yIG9jY3VycyAtIHJldHVybiAwKGZhbHNlKSAqLwogCWlmICgoY29udHJvbCAmIFJ4NENBX0VSUl9NQVNLKSkgewpAQCAtNTI2LDMgKzU0MCw3IEBACiAKIAlyZXR1cm4gKGNoYW5fbnVtID4+IDMpICsgMTsKIH0KKworTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCmluZGV4IDI3YjRjYjIuLjRiMzIwYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogI2RlZmluZSBWRU5ET1JfRElSX0lOICAweEMwCiAjZGVmaW5lIFZFTkRPUl9ESVJfT1VUIDB4NDAKIAotLyogaW50ZXJuYWwgYWRyZXNzZXMgb2YgdGhlIDgwNTEgcHJvY2Vzc29yICovCisvKiBpbnRlcm5hbCBhZGRyZXNzZXMgb2YgdGhlIDgwNTEgcHJvY2Vzc29yICovCiAjZGVmaW5lIFVTQkRVWFNVQl9DUFVDUyAweEU2MDAKIAogLyoKQEAgLTIwODUsNyArMjA4NSw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBpbml0YWxpc2UgdGhlIGJ1ZmZlciAqLworCS8qIGluaXRpYWxpc2UgdGhlIGJ1ZmZlciAqLwogCWZvciAoaSA9IDA7IGkgPCB0aGlzX3VzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZjsgaSsrKQogCQkoKGNoYXIgKikodGhpc191c2JkdXhzdWItPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKSlbaV0gPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwppbmRleCAyOWMzYzAxLi4wYTE2NGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKQEAgLTY3LDcgKzY3LDcgQEAKICNkZWZpbmUgVkVORE9SX0RJUl9PVVQJCTB4NDAKIAogLyoKLSAqIGludGVybmFsIGFkcmVzc2VzIG9mIHRoZSA4MDUxIHByb2Nlc3NvcgorICogaW50ZXJuYWwgYWRkcmVzc2VzIG9mIHRoZSA4MDUxIHByb2Nlc3NvcgogICovCiAjZGVmaW5lIFVTQkRVWEZBU1RTVUJfQ1BVQ1MJMHhFNjAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwppbmRleCA4NjNhYWU0Li4wMjUyYjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCkBAIC05Myw3ICs5Myw3IEBACiAJcyA9IGRldi0+c3ViZGV2aWNlcyArIGluc24tPnN1YmRldjsKIAogCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgewotCQlwcmludGsoIiVkIG5vdCB1c2VhYmxlIHN1YmRldmljZVxuIiwgaW5zbi0+c3ViZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlZCBub3QgdXNlYWJsZSBzdWJkZXZpY2VcbiIsIGluc24tPnN1YmRldik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMTAyLDcgKzEwMiw3IEBACiAKIAlyZXQgPSBjb21lZGlfY2hlY2tfY2hhbmxpc3QocywgMSwgJmluc24tPmNoYW5zcGVjKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImJhZCBjaGFuc3BlY1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiYmFkIGNoYW5zcGVjXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jCmluZGV4IGE0ZWM4OTEuLmZiYjgwZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jCkBAIC0xNSwxMSArMTUsMTIgQEAKICAgYWxvbmcgd2l0aCB0aGlzIGRyaXZlci4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJjcnlzdGFsaGRfbG54LmgiCiAKK3N0YXRpYyBERUZJTkVfTVVURVgoY2hkX2RlY19tdXRleCk7CiBzdGF0aWMgc3RydWN0IGNsYXNzICpjcnlzdGFsaGRfY2xhc3M7CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5c3RhbGhkX2FkcCAqZ19hZHBfaW5mbzsKQEAgLTE1MiwxMCArMTUzLDggQEAKIAlpZiAocmMpIHsKIAkJQkNNTE9HX0VSUigiZmFpbGVkIHRvIHB1bGwgYWRkX2NkYXRhIHN6OiV4IHVhX29mZjoleFxuIiwKIAkJCSAgIGlvLT5hZGRfY2RhdGFfc3osICh1bnNpZ25lZCBpbnQpdWFfb2ZmKTsKLQkJaWYgKGlvLT5hZGRfY2RhdGEpIHsKLQkJCWtmcmVlKGlvLT5hZGRfY2RhdGEpOwotCQkJaW8tPmFkZF9jZGF0YSA9IE5VTEw7Ci0JCX0KKwkJa2ZyZWUoaW8tPmFkZF9jZGF0YSk7CisJCWlvLT5hZGRfY2RhdGEgPSBOVUxMOwogCQlyZXR1cm4gLUVOT0RBVEE7CiAJfQogCkBAIC0yNzMsMjIgKzI3MiwyMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl1YyA9IChzdHJ1Y3QgY3J5c3RhbGhkX3VzZXIgKilmZC0+cHJpdmF0ZV9kYXRhOworCXVjID0gZmQtPnByaXZhdGVfZGF0YTsKIAlpZiAoIXVjKSB7CiAJCUJDTUxPR19FUlIoIkZhaWxlZCB0byBnZXQgdWNcbiIpOwogCQlyZXR1cm4gLUVOT0RBVEE7CiAJfQogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZjaGRfZGVjX211dGV4KTsKIAljcHJvYyA9IGNyeXN0YWxoZF9nZXRfY21kX3Byb2MoJmFkcC0+Y21kcywgY21kLCB1Yyk7CiAJaWYgKCFjcHJvYykgewogCQlCQ01MT0dfRVJSKCJVbmhhbmRsZWQgY29tbWFuZDogJWRcbiIsIGNtZCk7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaGRfZGVjX211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0ID0gY2hkX2RlY19hcGlfY21kKGFkcCwgdWEsIHVjLT51aWQsIGNtZCwgY3Byb2MpOwotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJmNoZF9kZWNfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMzNCw3ICszMzMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl1YyA9IChzdHJ1Y3QgY3J5c3RhbGhkX3VzZXIgKilmZC0+cHJpdmF0ZV9kYXRhOworCXVjID0gZmQtPnByaXZhdGVfZGF0YTsKIAlpZiAoIXVjKSB7CiAJCUJDTUxPR19FUlIoIkZhaWxlZCB0byBnZXQgdWNcbiIpOwogCQlyZXR1cm4gLUVOT0RBVEE7CkBAIC00MzUsOCArNDM0LDcgQEAKIAkvKiBDbGVhciBpb2RhdGEgcG9vbC4uICovCiAJZG8gewogCQl0ZW1wID0gY2hkX2RlY19hbGxvY19pb2RhdGEoYWRwLCAwKTsKLQkJaWYgKHRlbXApCi0JCQlrZnJlZSh0ZW1wKTsKKwkJa2ZyZWUodGVtcCk7CiAJfSB3aGlsZSAodGVtcCk7CiAKIAljcnlzdGFsaGRfZGVsZXRlX2VsZW1fcG9vbChhZHApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9NYWtlZmlsZQppbmRleCAxMGY4N2YwLi5kMGViMTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9NYWtlZmlsZQpAQCAtMSw5ICsxLDggQEAKLWN4MjU4MjEtb2Jqcwk6PSBjeDI1ODIxLWNvcmUubyBjeDI1ODIxLWNhcmRzLm8gY3gyNTgyMS1pMmMubyBjeDI1ODIxLWdwaW8ubyAJCQkJXAotCQkJCWN4MjU4MjEtbWVkdXNhLXZpZGVvLm8gY3gyNTgyMS12aWRlby5vIGN4MjU4MjEtdmlkZW8wLm8gY3gyNTgyMS12aWRlbzEubyAgICBcCi0JCQkJY3gyNTgyMS12aWRlbzIubyBjeDI1ODIxLXZpZGVvMy5vIGN4MjU4MjEtdmlkZW80Lm8gY3gyNTgyMS12aWRlbzUubyAgICAgICAgIFwKLQkJCQljeDI1ODIxLXZpZGVvNi5vIGN4MjU4MjEtdmlkZW83Lm8gY3gyNTgyMS12aWR1cHM5Lm8gY3gyNTgyMS12aWR1cHMxMC5vICAgICAgXAotCQkJCWN4MjU4MjEtYXVkdXBzMTEubyBjeDI1ODIxLXZpZGVvLXVwc3RyZWFtLm8gY3gyNTgyMS12aWRlby11cHN0cmVhbS1jaDIubyAJXAotCQkJCWN4MjU4MjEtYXVkaW8tdXBzdHJlYW0ubyBjeDI1ODIxLXZpZGVvaW9jdGwubworY3gyNTgyMS1vYmpzICAgOj0gY3gyNTgyMS1jb3JlLm8gY3gyNTgyMS1jYXJkcy5vIGN4MjU4MjEtaTJjLm8gXAorCQkgICAgICAgY3gyNTgyMS1ncGlvLm8gY3gyNTgyMS1tZWR1c2EtdmlkZW8ubyBcCisJCSAgICAgICBjeDI1ODIxLXZpZGVvLm8gY3gyNTgyMS12aWRlby11cHN0cmVhbS5vIFwKKwkJICAgICAgIGN4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLm8gXAorCQkgICAgICAgY3gyNTgyMS1hdWRpby11cHN0cmVhbS5vCiAKIG9iai0kKENPTkZJR19WSURFT19DWDI1ODIxKSArPSBjeDI1ODIxLm8KIG9iai0kKENPTkZJR19WSURFT19DWDI1ODIxX0FMU0EpICs9IGN4MjU4MjEtYWxzYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IDE3OTg5NzUuLmJiZTM2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCkBAIC01NSw2ICs1NSwxMiBAQAogc3RhdGljIHN0cnVjdCBzbmRfY2FyZCAqc25kX2N4MjU4MjFfY2FyZHNbU05EUlZfQ0FSRFNdOwogc3RhdGljIGludCBkZXZubzsKIAorc3RydWN0IGN4MjU4MjFfYXVkaW9fYnVmZmVyIHsKKwl1bnNpZ25lZCBpbnQgYnBsOworCXN0cnVjdCBidGN4X3Jpc2NtZW0gcmlzYzsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmIGRtYTsKK307CisKIHN0cnVjdCBjeDI1ODIxX2F1ZGlvX2RldiB7CiAJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7CiAJc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgcTsKQEAgLTc3LDcgKzgzLDcgQEAKIAogCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYV9yaXNjOwogCi0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7CisJc3RydWN0IGN4MjU4MjFfYXVkaW9fYnVmZmVyICpidWY7CiAKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIH07CkBAIC0xMzYsNyArMTQyLDcgQEAKIAogc3RhdGljIGludCBfY3gyNTgyMV9zdGFydF9hdWRpb19kbWEoc3RydWN0IGN4MjU4MjFfYXVkaW9fZGV2ICpjaGlwKQogewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0gY2hpcC0+YnVmOworCXN0cnVjdCBjeDI1ODIxX2F1ZGlvX2J1ZmZlciAqYnVmID0gY2hpcC0+YnVmOwogCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gY2hpcC0+ZGV2OwogCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmF1ZGlvX2NoID0KIAkgICAgJmN4MjU4MjFfc3JhbV9jaGFubmVsc1tBVURJT19TUkFNX0NIQU5ORUxdOwpAQCAtMzMxLDcgKzMzNyw3IEBACiAJQlVHX09OKCFjaGlwLT5kbWFfc2l6ZSk7CiAKIAlkcHJpbnRrKDIsICJGcmVlaW5nIGJ1ZmZlclxuIik7Ci0JdmlkZW9idWZfc2dfZG1hX3VubWFwKCZjaGlwLT5wY2ktPmRldiwgY2hpcC0+ZG1hX3Jpc2MpOworCXZpZGVvYnVmX2RtYV91bm1hcCgmY2hpcC0+cGNpLT5kZXYsIGNoaXAtPmRtYV9yaXNjKTsKIAl2aWRlb2J1Zl9kbWFfZnJlZShjaGlwLT5kbWFfcmlzYyk7CiAJYnRjeF9yaXNjbWVtX2ZyZWUoY2hpcC0+cGNpLCAmY2hpcC0+YnVmLT5yaXNjKTsKIAlrZnJlZShjaGlwLT5idWYpOwpAQCAtNDMyLDcgKzQzOCw3IEBACiAJc3RydWN0IGN4MjU4MjFfYXVkaW9fZGV2ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYTsKIAotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOworCXN0cnVjdCBjeDI1ODIxX2F1ZGlvX2J1ZmZlciAqYnVmOwogCWludCByZXQ7CiAKIAlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgewpAQCAtNDQ3LDM2ICs0NTMsMzEgQEAKIAlCVUdfT04oIWNoaXAtPmRtYV9zaXplKTsKIAlCVUdfT04oY2hpcC0+bnVtX3BlcmlvZHMgJiAoY2hpcC0+bnVtX3BlcmlvZHMgLSAxKSk7CiAKLQlidWYgPSB2aWRlb2J1Zl9zZ19hbGxvYyhzaXplb2YoKmJ1ZikpOworCWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKCpidWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKGNoaXAtPnBlcmlvZF9zaXplID4gQVVESU9fTElORV9TSVpFKQogCQljaGlwLT5wZXJpb2Rfc2l6ZSA9IEFVRElPX0xJTkVfU0laRTsKIAotCWJ1Zi0+dmIubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQlidWYtPnZiLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCWJ1Zi0+dmIud2lkdGggPSBjaGlwLT5wZXJpb2Rfc2l6ZTsKIAlidWYtPmJwbCA9IGNoaXAtPnBlcmlvZF9zaXplOwotCWJ1Zi0+dmIuaGVpZ2h0ID0gY2hpcC0+bnVtX3BlcmlvZHM7Ci0JYnVmLT52Yi5zaXplID0gY2hpcC0+ZG1hX3NpemU7CiAKLQlkbWEgPSB2aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOworCWRtYSA9ICZidWYtPmRtYTsKIAl2aWRlb2J1Zl9kbWFfaW5pdChkbWEpOwotCiAJcmV0ID0gdmlkZW9idWZfZG1hX2luaXRfa2VybmVsKGRtYSwgUENJX0RNQV9GUk9NREVWSUNFLAotCQkJCSAgICAgICAoUEFHRV9BTElHTihidWYtPnZiLnNpemUpID4+CisJCQkJICAgICAgIChQQUdFX0FMSUdOKGNoaXAtPmRtYV9zaXplKSA+PgogCQkJCQlQQUdFX1NISUZUKSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQlyZXQgPSB2aWRlb2J1Zl9zZ19kbWFfbWFwKCZjaGlwLT5wY2ktPmRldiwgZG1hKTsKKwlyZXQgPSB2aWRlb2J1Zl9kbWFfbWFwKCZjaGlwLT5wY2ktPmRldiwgZG1hKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAogCXJldCA9CiAJICAgIGN4MjU4MjFfcmlzY19kYXRhYnVmZmVyX2F1ZGlvKGNoaXAtPnBjaSwgJmJ1Zi0+cmlzYywgZG1hLT5zZ2xpc3QsCi0JCQkJCSAgYnVmLT52Yi53aWR0aCwgYnVmLT52Yi5oZWlnaHQsIDEpOworCQkJCQkgIGNoaXAtPnBlcmlvZF9zaXplLCBjaGlwLT5udW1fcGVyaW9kcywKKwkJCQkJICAxKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9JTkZPCiAJCQkiREVCVUc6IEVSUk9SIGFmdGVyIGN4MjU4MjFfcmlzY19kYXRhYnVmZmVyX2F1ZGlvKClcbiIpOwpAQCAtNDg4LDEyICs0ODksMTAgQEAKIAlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CiAJYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCiAKLQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7Ci0KIAljaGlwLT5idWYgPSBidWY7CiAJY2hpcC0+ZG1hX3Jpc2MgPSBkbWE7CiAKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gY2hpcC0+ZG1hX3Jpc2MtPnZtYWxsb2M7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IGNoaXAtPmRtYV9yaXNjLT52YWRkcjsKIAlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA9IGNoaXAtPmRtYV9zaXplOwogCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIgPSAwOwogCkBAIC02OTksNyArNjk4LDcgQEAKIAogCS8qIENhcmQgImNyZWF0aW9uIiAqLwogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9jeDI1ODIxX2Rldl9mcmVlOwotCWNoaXAgPSAoc3RydWN0IGN4MjU4MjFfYXVkaW9fZGV2ICopIGNhcmQtPnByaXZhdGVfZGF0YTsKKwljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CiAKIAljaGlwLT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLXVwc3RyZWFtLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLXVwc3RyZWFtLmMKaW5kZXggZWIzOWQxMy4uY2RmZjQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYwpAQCAtMTA2LDcgKzEwNiw3IEBACiB7CiAJdW5zaWduZWQgaW50IGxpbmU7CiAJc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9Ci0JICAgICZkZXYtPnNyYW1fY2hhbm5lbHNbZGV2LT5fYXVkaW9fdXBzdHJlYW1fY2hhbm5lbF9zZWxlY3RdOworCSAgIGRldi0+Y2hhbm5lbHNbZGV2LT5fYXVkaW9fdXBzdHJlYW1fY2hhbm5lbF9zZWxlY3RdLnNyYW1fY2hhbm5lbHM7CiAJaW50IG9mZnNldCA9IDA7CiAKIAkvKiBzY2FuIGxpbmVzICovCkBAIC0yMTcsNyArMjE3LDcgQEAKIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KQogewogCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPQotCSAgICAmZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9CXTsKKwkgICBkZXYtPmNoYW5uZWxzW0FVRElPX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9CXS5zcmFtX2NoYW5uZWxzOwogCXUzMiB0bXAgPSAwOwogCiAJaWYgKCFkZXYtPl9hdWRpb19pc19ydW5uaW5nKSB7CkBAIC0yODcsMTQgKzI4NywxNCBAQAogCQlyZXR1cm4gUFRSX0VSUihteWZpbGUpOwogCX0gZWxzZSB7CiAJCWlmICghKG15ZmlsZS0+Zl9vcCkpIHsKLQkJCXByaW50aygiJXM6IEZpbGUgaGFzIG5vIGZpbGUgb3BlcmF0aW9ucyByZWdpc3RlcmVkIVxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZpbGUgaGFzIG5vIGZpbGUgb3BlcmF0aW9ucyByZWdpc3RlcmVkIVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXyk7CiAJCQlmaWxwX2Nsb3NlKG15ZmlsZSwgTlVMTCk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCiAJCWlmICghbXlmaWxlLT5mX29wLT5yZWFkKSB7Ci0JCQlwcmludGsoIiVzOiBGaWxlIGhhcyBubyBSRUFEIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZCFcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGaWxlIGhhcyBubyBSRUFEIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZCFcbiIsCiAJCQkgICAgICAgX19mdW5jX18pOwogCQkJZmlscF9jbG9zZShteWZpbGUsIE5VTEwpOwogCQkJcmV0dXJuIC1FSU87CkBAIC0zNTMsOCArMzUzLDkgQEAKIAl9CiAKIAljeDI1ODIxX2dldF9hdWRpb19kYXRhKGRldiwKLQkJCSAgICAgICAmZGV2LT5zcmFtX2NoYW5uZWxzW2Rldi0+Ci0JCQkJCQkgICBfYXVkaW9fdXBzdHJlYW1fY2hhbm5lbF9zZWxlY3RdKTsKKwkJCSAgICAgIGRldi0+Y2hhbm5lbHNbZGV2LT4KKwkJCQkgICAgICAgX2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWxfc2VsZWN0XS4KKwkJCQkgICAgICAgc3JhbV9jaGFubmVscyk7CiB9CiAKIGludCBjeDI1ODIxX29wZW5maWxlX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LApAQCAtMzc4LDE0ICszNzksMTQgQEAKIAkJcmV0dXJuIFBUUl9FUlIobXlmaWxlKTsKIAl9IGVsc2UgewogCQlpZiAoIShteWZpbGUtPmZfb3ApKSB7Ci0JCQlwcmludGsoIiVzOiBGaWxlIGhhcyBubyBmaWxlIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZCFcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGaWxlIGhhcyBubyBmaWxlIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZCFcbiIsCiAJCQkgICAgICAgX19mdW5jX18pOwogCQkJZmlscF9jbG9zZShteWZpbGUsIE5VTEwpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAogCQlpZiAoIW15ZmlsZS0+Zl9vcC0+cmVhZCkgewotCQkJcHJpbnRrKCIlczogRmlsZSBoYXMgbm8gUkVBRCBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmlsZSBoYXMgbm8gUkVBRCBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhXG4iLAogCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCWZpbHBfY2xvc2UobXlmaWxlLCBOVUxMKTsKIAkJCXJldHVybiAtRUlPOwpAQCAtNTA1LDcgKzUwNiw3IEBACiB7CiAJaW50IGkgPSAwOwogCXUzMiBpbnRfbXNrX3RtcDsKLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gJmRldi0+c3JhbV9jaGFubmVsc1tjaGFuX251bV07CisgICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9IGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnNyYW1fY2hhbm5lbHM7CiAJZG1hX2FkZHJfdCByaXNjX3BoeXNfanVtcF9hZGRyOwogCV9fbGUzMiAqcnA7CiAKQEAgLTU2OSwxNSArNTcwLDE1IEBACiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAl9IGVsc2UgewogCQlpZiAoc3RhdHVzICYgRkxEX0FVRF9TUkNfT0YpCi0JCQlwcmludGsoIiVzOiBBdWRpbyBSZWNlaXZlZCBPdmVyZmxvdyBFcnJvciBJbnRlcnJ1cHQhXG4iLAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1ZGlvIFJlY2VpdmVkIE92ZXJmbG93IEVycm9yIEludGVycnVwdCFcbiIsCiAJCQkgICAgICAgX19mdW5jX18pOwogCiAJCWlmIChzdGF0dXMgJiBGTERfQVVEX1NSQ19TWU5DKQotCQkJcHJpbnRrKCIlczogQXVkaW8gUmVjZWl2ZWQgU3luYyBFcnJvciBJbnRlcnJ1cHQhXG4iLAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1ZGlvIFJlY2VpdmVkIFN5bmMgRXJyb3IgSW50ZXJydXB0IVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXyk7CiAKIAkJaWYgKHN0YXR1cyAmIEZMRF9BVURfU1JDX09QQ19FUlIpCi0JCQlwcmludGsoIiVzOiBBdWRpbyBSZWNlaXZlZCBPcENvZGUgRXJyb3IgSW50ZXJydXB0IVxuIiwKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBdWRpbyBSZWNlaXZlZCBPcENvZGUgRXJyb3IgSW50ZXJydXB0IVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXyk7CiAKIAkJLyogUmVhZCBhbmQgd3JpdGUgYmFjayB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB0byBjbGVhcgpAQCAtNTg2LDcgKzU4Nyw3IEBACiAJfQogCiAJaWYgKGRldi0+X2F1ZGlvZmlsZV9zdGF0dXMgPT0gRU5EX09GX0ZJTEUpIHsKLQkJcHJpbnRrKCJjeDI1ODIxOiBFT0YgQ2hhbm5lbCBBdWRpbyBGcmFtZWNvdW50ID0gJWRcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImN4MjU4MjE6IEVPRiBDaGFubmVsIEF1ZGlvIEZyYW1lY291bnQgPSAlZFxuIiwKIAkJICAgICAgIGRldi0+X2F1ZGlvZnJhbWVfY291bnQpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNjA3LDcgKzYwOCw4IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiAtMTsKIAotCXNyYW1fY2ggPSAmZGV2LT5zcmFtX2NoYW5uZWxzW2Rldi0+X2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWxfc2VsZWN0XTsKKyAgICAgICBzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tkZXYtPl9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdF0uCisJCQkJICAgICAgIHNyYW1fY2hhbm5lbHM7CiAKIAltc2tfc3RhdCA9IGN4X3JlYWQoc3JhbV9jaC0+aW50X21zdGF0KTsKIAlhdWRpb19zdGF0dXMgPSBjeF9yZWFkKHNyYW1fY2gtPmludF9zdGF0KTsKQEAgLTY0NCw4ICs2NDYsOCBAQAogCiAJCS8qIDEwIG1pbGxpc2Vjb25kIHRpbWVvdXQgKi8KIAkJaWYgKGNvdW50KysgPiAxMDAwKSB7Ci0JCQlwcmludGsKLQkJCSAgICAoImN4MjU4MjEgRVJST1I6ICVzKCkgZmlmbyBpcyBOT1QgdHVybmVkIG9uLiBUaW1lb3V0IVxuIiwKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJjeDI1ODIxIEVSUk9SOiAlcygpIGZpZm8gaXMgTk9UIHR1cm5lZCBvbi4gVGltZW91dCFcbiIsCiAJCQkgICAgIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNzI2LDEyICs3MjgsMTIgQEAKIAlpbnQgc3RyX2xlbmd0aCA9IDA7CiAKIAlpZiAoZGV2LT5fYXVkaW9faXNfcnVubmluZykgewotCQlwcmludGsoIkF1ZGlvIENoYW5uZWwgaXMgc3RpbGwgcnVubmluZyBzbyByZXR1cm4hXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXVkaW8gQ2hhbm5lbCBpcyBzdGlsbCBydW5uaW5nIHNvIHJldHVybiFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlkZXYtPl9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdCA9IGNoYW5uZWxfc2VsZWN0OwotCXNyYW1fY2ggPSAmZGV2LT5zcmFtX2NoYW5uZWxzW2NoYW5uZWxfc2VsZWN0XTsKKyAgICAgICBzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tjaGFubmVsX3NlbGVjdF0uc3JhbV9jaGFubmVsczsKIAogCS8qIFdvcmsgcXVldWUgKi8KIAlJTklUX1dPUksoJmRldi0+X2F1ZGlvX3dvcmtfZW50cnksIGN4MjU4MjFfYXVkaW91cHNfaGFuZGxlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmggYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmgKaW5kZXggNTAzZjQyZi4uNDM0YjJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8uaApAQCAtMjcsMjQgKzI3LDI1IEBACiAjZGVmaW5lIExJTkVTX1BFUl9CVUZGRVIgICAgICAgICAgICAxNQogI2RlZmluZSBBVURJT19MSU5FX1NJWkUgICAgICAgICAgICAgMTI4CiAKLS8vTnVtYmVyIG9mIGJ1ZmZlciBwcm9ncmFtcyB0byB1c2UgYXQgb25jZS4KKy8qIE51bWJlciBvZiBidWZmZXIgcHJvZ3JhbXMgdG8gdXNlIGF0IG9uY2UuICovCiAjZGVmaW5lIE5VTUJFUl9PRl9QUk9HUkFNUyAgOAogCi0vL01heCBzaXplIG9mIHRoZSBSSVNDIHByb2dyYW0gZm9yIGEgYnVmZmVyLiAtIHdvcnN0IGNhc2UgaXMgMiB3cml0ZXMgcGVyIGxpbmUKLS8vIFNwYWNlIGlzIGFsc28gYWRkZWQgZm9yIHRoZSA0IG5vLW9wIGluc3RydWN0aW9ucyBhZGRlZCBvbiB0aGUgZW5kLgotCisvKgorICBNYXggc2l6ZSBvZiB0aGUgUklTQyBwcm9ncmFtIGZvciBhIGJ1ZmZlci4gLSB3b3JzdCBjYXNlIGlzIDIgd3JpdGVzIHBlciBsaW5lCisgIFNwYWNlIGlzIGFsc28gYWRkZWQgZm9yIHRoZSA0IG5vLW9wIGluc3RydWN0aW9ucyBhZGRlZCBvbiB0aGUgZW5kLgorKi8KICNpZm5kZWYgVVNFX1JJU0NfTk9PUAogI2RlZmluZSBNQVhfQlVGRkVSX1BST0dSQU1fU0laRSAgICAgXAogICAgICgyKkxJTkVTX1BFUl9CVUZGRVIqUklTQ19XUklURV9JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUqNCkKICNlbmRpZgogCi0vLyBNQUUgMTIgSnVseSAyMDA1IFRyeSB0byB1c2UgTk9PUCBSSVNDIGluc3RydWN0aW9uIGluc3RlYWQKKy8qIE1BRSAxMiBKdWx5IDIwMDUgVHJ5IHRvIHVzZSBOT09QIFJJU0MgaW5zdHJ1Y3Rpb24gaW5zdGVhZCAqLwogI2lmZGVmIFVTRV9SSVNDX05PT1AKICNkZWZpbmUgTUFYX0JVRkZFUl9QUk9HUkFNX1NJWkUgICAgIFwKICAgICAoMipMSU5FU19QRVJfQlVGRkVSKlJJU0NfV1JJVEVfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfTk9PUF9JTlNUUlVDVElPTl9TSVpFKjQpCiAjZW5kaWYKIAotLy9TaXplcyBvZiB2YXJpb3VzIGluc3RydWN0aW9ucyBpbiBieXRlcy4gIFVzZWQgd2hlbiBhZGRpbmcgaW5zdHJ1Y3Rpb25zLgorLyogU2l6ZXMgb2YgdmFyaW91cyBpbnN0cnVjdGlvbnMgaW4gYnl0ZXMuICBVc2VkIHdoZW4gYWRkaW5nIGluc3RydWN0aW9ucy4gKi8KICNkZWZpbmUgUklTQ19XUklURV9JTlNUUlVDVElPTl9TSVpFIDEyCiAjZGVmaW5lIFJJU0NfSlVNUF9JTlNUUlVDVElPTl9TSVpFICAxMgogI2RlZmluZSBSSVNDX1NLSVBfSU5TVFJVQ1RJT05fU0laRSAgNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWR1cHMxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWR1cHMxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDllYWQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkdXBzMTEuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgotICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KLSAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKLQotc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KLQkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKnByZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT52aWRxW1NSQU1fQ0gxMV07Ci0KLQkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCi0JYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7Ci0JYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKLQlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7CS8qIGJpdHMgNjMtMzIgKi8KLQotCWRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwgYnVmLAotCQkJYnVmLT52Yi5pKTsKLQotCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsCi0JCQkJCSZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDExXSk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMiwKLQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZSwgYnVmIGNudCA9ICVkLCBxLT5jb3VudCA9ICVkXG4iLAotCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQsIHEtPmNvdW50KTsKLQl9IGVsc2UgewotCQlwcmV2ID0KLQkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQlpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAotCQkgICAgJiYgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0Ci0JCSAgICAmJiBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKLQotCQkJLyogNjQgYml0IGJpdHMgNjMtMzIgKi8KLQkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7Ci0JCQlkcHJpbnRrKDIsCi0JCQkJIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIGFjdGl2ZSwgYnVmLT5jb3VudD0lZFxuIiwKLQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCi0JCQkJYnVmLT52Yi5pKTsKLQkJfQotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWRwcmludGsoMiwgImFjdGl2ZSBxdWV1ZSBlbXB0eSFcbiIpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0gewotCS5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKLQkuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAotCS5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCi0JLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoOwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCi0JcHJpbnRrKCJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAotCQl2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwotCi0JLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KLQlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGZoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ID0gZGV2OwotCWZoLT50eXBlID0gdHlwZTsKLQlmaC0+d2lkdGggPSA3MjA7Ci0KLQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspCi0JCWZoLT5oZWlnaHQgPSA1NzY7Ci0JZWxzZQotCQlmaC0+aGVpZ2h0ID0gNDgwOwotCi0JZGV2LT5jaGFubmVsX29wZW5lZCA9IDEwOwotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9ZVVlWKTsKLQotCXY0bDJfcHJpb19vcGVuKCZkZXYtPnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCi0JCQkgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYnVmZmVyKSwgZmgpOwotCi0JZHByaW50aygxLCAicG9zdCB2aWRlb2J1Zl9xdWV1ZV9pbml0KClcbiIpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgtPmRldiwgUkVTT1VSQ0VfVklERU8xMSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMTEpKSB7Ci0JCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCi0JCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCi0JCQkJIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIuc3RyZWFtKTsKLQl9IGVsc2UgewotCQkvKiByZWFkKCkgY2FwdHVyZSAqLwotCQlidWYgPSAoc3RydWN0IGN4MjU4MjFfYnVmZmVyICopZmgtPnZpZHEucmVhZF9idWY7Ci0JCWlmIChOVUxMID09IGJ1ZikKLQkJCXJldHVybiBQT0xMRVJSOwotCX0KLQotCXBvbGxfd2FpdChmaWxlLCAmYnVmLT52Yi5kb25lLCB3YWl0KTsKLQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRVJST1IpCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCS8vc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8KLQkvL2N4X3dyaXRlKGNoYW5uZWwxMS0+ZG1hX2N0bCwgMCk7Ci0KLQkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMTEpKSB7Ci0JCXZpZGVvYnVmX3F1ZXVlX2NhbmNlbCgmZmgtPnZpZHEpOwotCQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZJREVPMTEpOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlrZnJlZShmaCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzExKSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzExKTsKLQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCByZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JZmgtPndpZHRoID0gZi0+Zm10LnBpeC53aWR0aDsKLQlmaC0+aGVpZ2h0ID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JZmgtPnZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCWRwcmludGsoMiwgIiVzKCkgd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAotCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIHZpZGVvLCBzX2ZtdCwgZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtMTEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlpbnQgY29tbWFuZCA9IDA7Ci0Jc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKLQotCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKLQotCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKLQkJcHJpbnRrCi0JCSAgICAoImN4MjU4MjEgaW4gJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmcuXG4iLAotCQkgICAgIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOwotCi0JaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfQVVESU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX0FVRElPKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0JZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotCWRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7Ci0JZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCWRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7Ci0JZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgotCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0JcmV0dXJuIHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWNoYXIgbmFtZVszMiArIDJdOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7Ci0JaW50IGVycjsKLQotCWlmIChmaCkgewotCQlkZXYgPSBmaC0+ZGV2OwotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLy8gZXhwb3J0ZWQgc3R1ZmYKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdmlkZW9fZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IHZpZGVvX29wZW4sCi0JLnJlbGVhc2UgPSB2aWRlb19yZWxlYXNlLAotCS5yZWFkID0gdmlkZW9fcmVhZCwKLQkucG9sbCA9IHZpZGVvX3BvbGwsCi0JLm1tYXAgPSBjeDI1ODIxX3ZpZGVvX21tYXAsCi0JLmlvY3RsID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gY3gyNTgyMV92aWRpb2NfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmID0gY3gyNTgyMV92aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmID0gY3gyNTgyMV92aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX3Nfc3RkID0gY3gyNTgyMV92aWRpb2Nfc19zdGQsCi0JLnZpZGlvY19xdWVyeXN0ZCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkLAotI2VuZGlmCi0JLnZpZGlvY19jcm9wY2FwID0gY3gyNTgyMV92aWRpb2NfY3JvcGNhcCwKLQkudmlkaW9jX3NfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX3NfY3JvcCwKLQkudmlkaW9jX2dfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX2dfY3JvcCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0LAotCS52aWRpb2NfZ19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ID0gY3gyNTgyMV92aWRpb2Nfc19pbnB1dCwKLQkudmlkaW9jX2dfY3RybCA9IGN4MjU4MjFfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCA9IHZpZGlvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19zdHJlYW1vbiA9IHZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZiA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19sb2dfc3RhdHVzID0gdmlkaW9jX2xvZ19zdGF0dXMsCi0JLnZpZGlvY19nX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5LAotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCS52aWRpb2NnbWJ1ZiA9IGN4MjU4MjFfdmlkaW9jZ21idWYsCi0jZW5kaWYKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUxMSA9IHsKLQkubmFtZSA9ICJjeDI1ODIxLWF1ZGlvdXBzdHJlYW0iLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwppbmRleCBkOTBhYmIzLi5jNDg3YzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwpAQCAtNzgxLDE0ICs3ODEsMTQgQEAKIAogCS8qIERpc2FibGUgVmlkZW8gQS9CIGFjdGl2aXR5ICovCiAJZm9yIChpID0gMDsgaSA8IFZJRF9DSEFOTkVMX05VTTsgaSsrKSB7Ci0JCWN4X3dyaXRlKGRldi0+c3JhbV9jaGFubmVsc1tpXS5kbWFfY3RsLCAwKTsKLQkJY3hfd3JpdGUoZGV2LT5zcmFtX2NoYW5uZWxzW2ldLmludF9tc2ssIDApOworCSAgICAgICBjeF93cml0ZShkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMtPmRtYV9jdGwsIDApOworCSAgICAgICBjeF93cml0ZShkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMtPmludF9tc2ssIDApOwogCX0KIAogCWZvciAoaSA9IFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSTsgaSA8PSBWSURfVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0o7CiAJICAgICBpKyspIHsKLQkJY3hfd3JpdGUoZGV2LT5zcmFtX2NoYW5uZWxzW2ldLmRtYV9jdGwsIDApOwotCQljeF93cml0ZShkZXYtPnNyYW1fY2hhbm5lbHNbaV0uaW50X21zaywgMCk7CisJICAgICAgIGN4X3dyaXRlKGRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscy0+ZG1hX2N0bCwgMCk7CisJICAgICAgIGN4X3dyaXRlKGRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscy0+aW50X21zaywgMCk7CiAJfQogCiAJLyogRGlzYWJsZSBBdWRpbyBhY3Rpdml0eSAqLwpAQCAtODA1LDEyICs4MDUsMTAgQEAKIHZvaWQgY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbm5lbF9zZWxlY3QsCiAJCQkgICAgICB1MzIgZm9ybWF0KQogewotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoOwotCiAJaWYgKGNoYW5uZWxfc2VsZWN0IDw9IDcgJiYgY2hhbm5lbF9zZWxlY3QgPj0gMCkgewotCQljaCA9ICZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbY2hhbm5lbF9zZWxlY3RdOwotCQljeF93cml0ZShjaC0+cGl4X2ZybXQsIGZvcm1hdCk7Ci0JCWRldi0+cGl4ZWxfZm9ybWF0c1tjaGFubmVsX3NlbGVjdF0gPSBmb3JtYXQ7CisJICAgICAgIGN4X3dyaXRlKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9zZWxlY3RdLgorCQkJICAgICAgIHNyYW1fY2hhbm5lbHMtPnBpeF9mcm10LCBmb3JtYXQpOworCSAgICAgICBkZXYtPmNoYW5uZWxzW2NoYW5uZWxfc2VsZWN0XS5waXhlbF9mb3JtYXRzID0gZm9ybWF0OwogCX0KIH0KIApAQCAtODMxLDcgKzgyOSw3IEBACiAJY3hfd3JpdGUoUENJX0lOVF9TVEFULCAweGZmZmZmZmZmKTsKIAogCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykKLQkJY3hfd3JpdGUoZGV2LT5zcmFtX2NoYW5uZWxzW2ldLmludF9zdGF0LCAweGZmZmZmZmZmKTsKKwkgICAgICAgY3hfd3JpdGUoZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5pbnRfc3RhdCwgMHhmZmZmZmZmZik7CiAKIAljeF93cml0ZShBVURfQV9JTlRfU1RBVCwgMHhmZmZmZmZmZik7CiAJY3hfd3JpdGUoQVVEX0JfSU5UX1NUQVQsIDB4ZmZmZmZmZmYpOwpAQCAtODQ1LDIxICs4NDMsMjIgQEAKIAltZGVsYXkoMTAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQljeDI1ODIxX3NldF92aXBfbW9kZShkZXYsICZkZXYtPnNyYW1fY2hhbm5lbHNbaV0pOwotCQljeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cChkZXYsICZkZXYtPnNyYW1fY2hhbm5lbHNbaV0sIDE0NDAsCi0JCQkJCSAgIDApOwotCQlkZXYtPnBpeGVsX2Zvcm1hdHNbaV0gPSBQSVhFTF9GUk1UXzQyMjsKLQkJZGV2LT51c2VfY2lmX3Jlc29sdXRpb25baV0gPSBGQUxTRTsKKwkgICAgICAgY3gyNTgyMV9zZXRfdmlwX21vZGUoZGV2LCBkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMpOworCSAgICAgICBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cChkZXYsIGRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscywKKwkJCQkJICAgICAgIDE0NDAsIDApOworCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnBpeGVsX2Zvcm1hdHMgPSBQSVhFTF9GUk1UXzQyMjsKKwkgICAgICAgZGV2LT5jaGFubmVsc1tpXS51c2VfY2lmX3Jlc29sdXRpb24gPSBGQUxTRTsKIAl9CiAKIAkvKiBQcm9iYWJseSBvbmx5IGFmZmVjdCBEb3duc3RyZWFtICovCiAJZm9yIChpID0gVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9JOyBpIDw9IFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSjsKIAkgICAgIGkrKykgewotCQljeDI1ODIxX3NldF92aXBfbW9kZShkZXYsICZkZXYtPnNyYW1fY2hhbm5lbHNbaV0pOworCSAgICAgICBjeDI1ODIxX3NldF92aXBfbW9kZShkZXYsIGRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscyk7CiAJfQogCi0JY3gyNTgyMV9zcmFtX2NoYW5uZWxfc2V0dXBfYXVkaW8oZGV2LCAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwOF0sCi0JCQkJCSAxMjgsIDApOworICAgICAgIGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwX2F1ZGlvKGRldiwKKwkJCSAgICAgICBkZXYtPmNoYW5uZWxzW1NSQU1fQ0gwOF0uc3JhbV9jaGFubmVscywKKwkJCSAgICAgICAxMjgsIDApOwogCiAJY3gyNTgyMV9ncGlvX2luaXQoZGV2KTsKIH0KQEAgLTkwMiwyMSArOTAxLDYgQEAKIHsKIAlpbnQgaW9fc2l6ZSA9IDAsIGk7CiAKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb190ZW1wbGF0ZVtdID0gewotCQkmY3gyNTgyMV92aWRlb190ZW1wbGF0ZTAsCi0JCSZjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlMSwKLQkJJmN4MjU4MjFfdmlkZW9fdGVtcGxhdGUyLAotCQkmY3gyNTgyMV92aWRlb190ZW1wbGF0ZTMsCi0JCSZjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlNCwKLQkJJmN4MjU4MjFfdmlkZW9fdGVtcGxhdGU1LAotCQkmY3gyNTgyMV92aWRlb190ZW1wbGF0ZTYsCi0JCSZjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlNywKLQkJJmN4MjU4MjFfdmlkZW9fdGVtcGxhdGU5LAotCQkmY3gyNTgyMV92aWRlb190ZW1wbGF0ZTEwLAotCQkmY3gyNTgyMV92aWRlb190ZW1wbGF0ZTExLAotCQkmY3gyNTgyMV92aWRlb2lvY3RsX3RlbXBsYXRlLAotCX07Ci0KIAlwcmludGsoS0VSTl9JTkZPICJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICJjeDI1ODIxIHNldCB1cFxuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CkBAIC05NDcsNyArOTMxLDggQEAKIAogCS8qIEFwcGx5IGEgc2Vuc2libGUgY2xvY2sgZnJlcXVlbmN5IGZvciB0aGUgUENJZSBicmlkZ2UgKi8KIAlkZXYtPmNsa19mcmVxID0gMjgwMDAwMDA7Ci0JZGV2LT5zcmFtX2NoYW5uZWxzID0gY3gyNTgyMV9zcmFtX2NoYW5uZWxzOworICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVklEX0NIQU5ORUxfTlVNOyBpKyspCisJICAgICAgIGRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscyA9ICZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbaV07CiAKIAlpZiAoZGV2LT5uciA+IDEpCiAJCUNYMjU4MjFfSU5GTygiZGV2LT5uciA+IDEhIik7CkBAIC05NzAsNyArOTU1LDYgQEAKIAlkZXYtPmkyY19idXNbMF0ucmVnX3dkYXRhID0gSTJDMV9XREFUQTsKIAlkZXYtPmkyY19idXNbMF0uaTJjX3BlcmlvZCA9ICgweDA3IDw8IDI0KTsJLyogMS45NU1IeiAqLwogCi0KIAlpZiAoY3gyNTgyMV9nZXRfcmVzb3VyY2VzKGRldikgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXMgTm8gbW9yZSBQQ0llIHJlc291cmNlcyBmb3IgIgogCQkgICAgICAgInN1YnN5c3RlbTogJTA0eDolMDR4XG4iLApAQCAtMTAxOCwzNyArMTAwMiwyNCBAQAogCQkgICAgIGRldi0+aTJjX2J1c1swXS5pMmNfcmMpOwogCiAJY3gyNTgyMV9jYXJkX3NldHVwKGRldik7Ci0JbWVkdXNhX3ZpZGVvX2luaXQoZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQlpZiAoY3gyNTgyMV92aWRlb19yZWdpc3RlcihkZXYsIGksIHZpZGVvX3RlbXBsYXRlW2ldKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlcygpIEZhaWxlZCB0byByZWdpc3RlciBhbmFsb2cgdmlkZW8gYWRhcHRlcnMgb24gVklEIGNoYW5uZWwgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGkpOwotCQl9Ci0JfQorICAgICAgIGlmIChtZWR1c2FfdmlkZW9faW5pdChkZXYpIDwgMCkKKwkgICAgICAgQ1gyNTgyMV9FUlIoIiVzKCkgRmFpbGVkIHRvIGluaXRpYWxpemUgbWVkdXNhIVxuIgorCSAgICAgICAsIF9fZnVuY19fKTsKIAotCWZvciAoaSA9IFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSTsKLQkgICAgIGkgPD0gQVVESU9fVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0I7IGkrKykgewotCQkvKiBTaW5jZSB3ZSBkb24ndCBoYXZlIHRlbXBsYXRlOCBmb3IgQXVkaW8gRG93bnN0cmVhbSAqLwotCQlpZiAoY3gyNTgyMV92aWRlb19yZWdpc3RlcihkZXYsIGksIHZpZGVvX3RlbXBsYXRlW2kgLSAxXSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXMoKSBGYWlsZWQgdG8gcmVnaXN0ZXIgYW5hbG9nIHZpZGVvIGFkYXB0ZXJzIGZvciBVcHN0cmVhbSBjaGFubmVsICVkLlxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgaSk7Ci0JCX0KLQl9CisgICAgICAgY3gyNTgyMV92aWRlb19yZWdpc3RlcihkZXYpOwogCiAJLyogcmVnaXN0ZXIgSU9DVEwgZGV2aWNlICovCiAJZGV2LT5pb2N0bF9kZXYgPQotCSAgICBjeDI1ODIxX3ZkZXZfaW5pdChkZXYsIGRldi0+cGNpLCB2aWRlb190ZW1wbGF0ZVtWSURFT19JT0NUTF9DSF0sCisJICAgY3gyNTgyMV92ZGV2X2luaXQoZGV2LCBkZXYtPnBjaSwgJmN4MjU4MjFfdmlkZW9pb2N0bF90ZW1wbGF0ZSwKIAkJCSAgICAgICJ2aWRlbyIpOwogCiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZQogCSAgICAoZGV2LT5pb2N0bF9kZXYsIFZGTF9UWVBFX0dSQUJCRVIsIFZJREVPX0lPQ1RMX0NIKSA8IDApIHsKIAkJY3gyNTgyMV92aWRlb2lvY3RsX3VucmVnaXN0ZXIoZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXMoKSBGYWlsZWQgdG8gcmVnaXN0ZXIgdmlkZW8gYWRhcHRlciBmb3IgSU9DVEwgc28gcmVsZWFzaW5nLlxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJICAgIiVzKCkgRmFpbGVkIHRvIHJlZ2lzdGVyIHZpZGVvIGFkYXB0ZXIgZm9yIElPQ1RMLCBzbyBcCisJCSAgIHVucmVnaXN0ZXJpbmcgdmlkZW9pb2N0bCBkZXZpY2UuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJY3gyNTgyMV9kZXZfY2hlY2tyZXZpc2lvbihkZXYpOwpAQCAtMTM0OSw3ICsxMzIwLDcgQEAKIAogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CiAJdmlkZW9idWZfd2FpdG9uKCZidWYtPnZiLCAwLCAwKTsKLQl2aWRlb2J1Zl9kbWFfdW5tYXAocSwgZG1hKTsKKwl2aWRlb2J1Zl9kbWFfdW5tYXAocS0+ZGV2LCBkbWEpOwogCXZpZGVvYnVmX2RtYV9mcmVlKGRtYSk7CiAJYnRjeF9yaXNjbWVtX2ZyZWUodG9fcGNpX2RldihxLT5kZXYpLCAmYnVmLT5yaXNjKTsKIAlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKQEAgLTEzNzEsNyArMTM0Miw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgVklEX0NIQU5ORUxfTlVNOyBpKyspIHsKIAkJaWYgKHBjaV9zdGF0dXMgJiBtYXNrW2ldKSB7Ci0JCQl2aWRfc3RhdHVzID0gY3hfcmVhZChkZXYtPnNyYW1fY2hhbm5lbHNbaV0uaW50X3N0YXQpOworCQkgICAgICAgdmlkX3N0YXR1cyA9IGN4X3JlYWQoZGV2LT5jaGFubmVsc1tpXS4KKwkJCSAgICAgICBzcmFtX2NoYW5uZWxzLT5pbnRfc3RhdCk7CiAKIAkJCWlmICh2aWRfc3RhdHVzKQogCQkJCWhhbmRsZWQgKz0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWkyYy5jCmluZGV4IDA4ZjQ1YjUuLmU0MzU3MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtaTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1pMmMuYwpAQCAtMjgyLDYgKzI4Miw5IEBACiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gY3gyNTgyMV9pMmNfYWxnb190ZW1wbGF0ZSA9IHsKIAkubWFzdGVyX3hmZXIgPSBpMmNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eSA9IGN4MjU4MjFfZnVuY3Rpb25hbGl0eSwKKyNpZmRlZiBORUVEX0FMR09fQ09OVFJPTAorICAgICAgIC5hbGdvX2NvbnRyb2wgPSBkdW1teV9hbGdvX2NvbnRyb2wsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgY3gyNTgyMV9pMmNfYWRhcF90ZW1wbGF0ZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaAppbmRleCBiMGQyMTZiLi42MGQxOTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS1kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtZGVmaW5lcy5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaWZuZGVmIF9NRURVU0FfREVGX0hfCiAjZGVmaW5lIF9NRURVU0FfREVGX0hfCiAKLS8vIFZpZGVvIGRlb2NkZXIgdGhhdCB3ZSBzdXBwb3J0ZWQKKy8qIFZpZGVvIGRlb2NkZXIgdGhhdCB3ZSBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgVkRFQ19BCQkwCiAjZGVmaW5lIFZERUNfQgkJMQogI2RlZmluZSBWREVDX0MJCTIKQEAgLTMzLDE5ICszMywxMCBAQAogI2RlZmluZSBWREVDX0cJCTYKICNkZWZpbmUgVkRFQ19ICQk3CiAKLS8vI2RlZmluZSBBVVRPX1NXSVRDSF9CSVRbXSAgPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKLQotLy8gVGhlIGZvbGxvd2luZyBiaXQgcG9zaXRpb24gZW5hYmxlcyBhdXRvbWF0aWMgc291cmNlIHN3aXRjaGluZyBmb3IgZGVjb2RlciBBLUguCi0vLyBEaXNwbGF5IGluZGV4IHBlciBjYW1lcmEuCi0vLyNkZWZpbmUgVkRFQ19JTkRFWFtdID0gezAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDd9OwotCi0vLyBTZWxlY3QgaW5wdXQgYml0IHRvIHZpZGVvIGRlY29kZXIgQS1ILgotLy8jZGVmaW5lIENIX1NSQ19TRUxfQklUW10gPSB7MjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxfTsKLQotLy8gZW5kIG9mIGRpc3BsYXkgc2VxdWVuY2UKKy8qIGVuZCBvZiBkaXNwbGF5IHNlcXVlbmNlICovCiAjZGVmaW5lIEVORF9PRl9TRVEJCQkJCTB4RjsKIAotLy8gcmVnaXN0cnkgc3RyaW5nIHNpemUKKy8qIHJlZ2lzdHJ5IHN0cmluZyBzaXplICovCiAjZGVmaW5lIE1BWF9SRUdJU1RSWV9TWgkJCQkJNDA7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS1yZWcuaAppbmRleCAxMmM5MGY4Li5mN2YzM2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS1yZWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS1yZWcuaApAQCAtMjMsMTEgKzIzLDExIEBACiAjaWZuZGVmIF9fTUVEVVNBX1JFR0lTVEVSU19fCiAjZGVmaW5lIF9fTUVEVVNBX1JFR0lTVEVSU19fCiAKLS8vIFNlcmlhbCBTbGF2ZSBSZWdpc3RlcnMKKy8qIFNlcmlhbCBTbGF2ZSBSZWdpc3RlcnMgKi8KICNkZWZpbmUJSE9TVF9SRUdJU1RFUjEJCQkJMHgwMDAwCiAjZGVmaW5lCUhPU1RfUkVHSVNURVIyCQkJCTB4MDAwMQogCi0vLyBDaGlwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzCisvKiBDaGlwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCiAjZGVmaW5lCUNISVBfQ1RSTAkJCQkJMHgwMTAwCiAjZGVmaW5lCUFGRV9BQl9DVFJMCQkJCQkweDAxMDQKICNkZWZpbmUJQUZFX0NEX0NUUkwJCQkJCTB4MDEwOApAQCAtOTIsNyArOTIsNyBAQAogI2RlZmluZQlBQklTVF9DTEFNUF9FCQkJCTB4MDFGNAogI2RlZmluZQlBQklTVF9DTEFNUF9GCQkJCTB4MDFGOAogCi0vLyAgICAgICAgICAgICAgRGlnaXRhbCBWaWRlbyBFbmNvZGVyIEEgUmVnaXN0ZXJzCisvKiAgICAgICAgICAgICAgRGlnaXRhbCBWaWRlbyBFbmNvZGVyIEEgUmVnaXN0ZXJzICovCiAjZGVmaW5lCURFTkNfQV9SRUdfMQkJCQkJMHgwMjAwCiAjZGVmaW5lCURFTkNfQV9SRUdfMgkJCQkJMHgwMjA0CiAjZGVmaW5lCURFTkNfQV9SRUdfMwkJCQkJMHgwMjA4CkBAIC0xMDIsNyArMTAyLDcgQEAKICNkZWZpbmUJREVOQ19BX1JFR183CQkJCQkweDAyMTgKICNkZWZpbmUJREVOQ19BX1JFR184CQkJCQkweDAyMUMKIAotLy8gICAgICBEaWdpdGFsIFZpZGVvIEVuY29kZXIgQiBSZWdpc3RlcnMKKy8qICAgICAgRGlnaXRhbCBWaWRlbyBFbmNvZGVyIEIgUmVnaXN0ZXJzICovCiAjZGVmaW5lCURFTkNfQl9SRUdfMQkJCQkJMHgwMzAwCiAjZGVmaW5lCURFTkNfQl9SRUdfMgkJCQkJMHgwMzA0CiAjZGVmaW5lCURFTkNfQl9SRUdfMwkJCQkJMHgwMzA4CkBAIC0xMTIsNyArMTEyLDcgQEAKICNkZWZpbmUJREVOQ19CX1JFR183CQkJCQkweDAzMTgKICNkZWZpbmUJREVOQ19CX1JFR184CQkJCQkweDAzMUMKIAotLy8gICAgICAgICAgICAgIFZpZGVvIERlY29kZXIgQSBSZWdpc3RlcnMKKy8qICAgICAgICAgICAgICBWaWRlbyBEZWNvZGVyIEEgUmVnaXN0ZXJzICovCiAjZGVmaW5lCU1PREVfQ1RSTAkJCQkJCTB4MTAwMAogI2RlZmluZQlPVVRfQ1RSTDEJCQkJCQkweDEwMDQKICNkZWZpbmUJT1VUX0NUUkxfTlMJCQkJCQkweDEwMDgKQEAgLTE1Myw3ICsxNTMsNyBAQAogI2RlZmluZQlWRVJTSU9OCQkJCQkJCTB4MTFGOAogI2RlZmluZQlTT0ZUX1JTVF9DVFJMCQkJCQkweDExRkMKIAotLy8gICAgICBWaWRlbyBEZWNvZGVyIEIgUmVnaXN0ZXJzCisvKiAgICAgIFZpZGVvIERlY29kZXIgQiBSZWdpc3RlcnMgKi8KICNkZWZpbmUJVkRFQ19CX01PREVfQ1RSTAkJCQkweDEyMDAKICNkZWZpbmUJVkRFQ19CX09VVF9DVFJMMQkJCQkweDEyMDQKICNkZWZpbmUJVkRFQ19CX09VVF9DVFJMX05TCQkJCTB4MTIwOApAQCAtMTk0LDcgKzE5NCw3IEBACiAjZGVmaW5lCVZERUNfQl9WRVJTSU9OCQkJCQkweDEzRjgKICNkZWZpbmUJVkRFQ19CX1NPRlRfUlNUX0NUUkwJCQkweDEzRkMKIAotLy8gVmlkZW8gRGVjb2RlciBDIFJlZ2lzdGVycworLyogVmlkZW8gRGVjb2RlciBDIFJlZ2lzdGVycyAqLwogI2RlZmluZQlWREVDX0NfTU9ERV9DVFJMCQkJCTB4MTQwMAogI2RlZmluZQlWREVDX0NfT1VUX0NUUkwxCQkJCTB4MTQwNAogI2RlZmluZQlWREVDX0NfT1VUX0NUUkxfTlMJCQkJMHgxNDA4CkBAIC0yMzUsNyArMjM1LDcgQEAKICNkZWZpbmUJVkRFQ19DX1ZFUlNJT04JCQkJCTB4MTVGOAogI2RlZmluZQlWREVDX0NfU09GVF9SU1RfQ1RSTAkJCTB4MTVGQwogCi0vLyBWaWRlbyBEZWNvZGVyIEQgUmVnaXN0ZXJzCisvKiBWaWRlbyBEZWNvZGVyIEQgUmVnaXN0ZXJzICovCiAjZGVmaW5lIFZERUNfRF9NT0RFX0NUUkwJCQkJMHgxNjAwCiAjZGVmaW5lIFZERUNfRF9PVVRfQ1RSTDEJCQkJMHgxNjA0CiAjZGVmaW5lIFZERUNfRF9PVVRfQ1RSTF9OUwkJCQkweDE2MDgKQEAgLTI3Niw3ICsyNzYsNyBAQAogI2RlZmluZSBWREVDX0RfVkVSU0lPTgkJCQkJMHgxN0Y4CiAjZGVmaW5lIFZERUNfRF9TT0ZUX1JTVF9DVFJMCQkJMHgxN0ZDCiAKLS8vIFZpZGVvIERlY29kZXIgRSBSZWdpc3RlcnMKKy8qIFZpZGVvIERlY29kZXIgRSBSZWdpc3RlcnMgKi8KICNkZWZpbmUJVkRFQ19FX01PREVfQ1RSTAkJCQkweDE4MDAKICNkZWZpbmUJVkRFQ19FX09VVF9DVFJMMQkJCQkweDE4MDQKICNkZWZpbmUJVkRFQ19FX09VVF9DVFJMX05TCQkJCTB4MTgwOApAQCAtMzE3LDcgKzMxNyw3IEBACiAjZGVmaW5lCVZERUNfRV9WRVJTSU9OCQkJCQkweDE5RjgKICNkZWZpbmUJVkRFQ19FX1NPRlRfUlNUX0NUUkwJCQkweDE5RkMKIAotLy8gVmlkZW8gRGVjb2RlciBGIFJlZ2lzdGVycworLyogVmlkZW8gRGVjb2RlciBGIFJlZ2lzdGVycyAqLwogI2RlZmluZQlWREVDX0ZfTU9ERV9DVFJMCQkJCTB4MUEwMAogI2RlZmluZQlWREVDX0ZfT1VUX0NUUkwxCQkJCTB4MUEwNAogI2RlZmluZQlWREVDX0ZfT1VUX0NUUkxfTlMJCQkJMHgxQTA4CkBAIC0zNTgsNyArMzU4LDcgQEAKICNkZWZpbmUJVkRFQ19GX1ZFUlNJT04JCQkJCTB4MUJGOAogI2RlZmluZQlWREVDX0ZfU09GVF9SU1RfQ1RSTAkJCTB4MUJGQwogCi0vLyBWaWRlbyBEZWNvZGVyIEcgUmVnaXN0ZXJzCisvKiBWaWRlbyBEZWNvZGVyIEcgUmVnaXN0ZXJzICovCiAjZGVmaW5lCVZERUNfR19NT0RFX0NUUkwJCQkJMHgxQzAwCiAjZGVmaW5lCVZERUNfR19PVVRfQ1RSTDEJCQkJMHgxQzA0CiAjZGVmaW5lCVZERUNfR19PVVRfQ1RSTF9OUwkJCQkweDFDMDgKQEAgLTM5OSw3ICszOTksNyBAQAogI2RlZmluZQlWREVDX0dfVkVSU0lPTgkJCQkJMHgxREY4CiAjZGVmaW5lCVZERUNfR19TT0ZUX1JTVF9DVFJMCQkJMHgxREZDCiAKLS8vICAgICAgICAgICAgICBWaWRlbyBEZWNvZGVyIEggUmVnaXN0ZXJzCisvKiAgICAgICAgICAgICAgVmlkZW8gRGVjb2RlciBIIFJlZ2lzdGVycyAgKi8KICNkZWZpbmUJVkRFQ19IX01PREVfQ1RSTAkJCQkweDFFMDAKICNkZWZpbmUJVkRFQ19IX09VVF9DVFJMMQkJCQkweDFFMDQKICNkZWZpbmUJVkRFQ19IX09VVF9DVFJMX05TCQkJCTB4MUUwOApAQCAtNDQwLDE0ICs0NDAsMTQgQEAKICNkZWZpbmUJVkRFQ19IX1ZFUlNJT04JCQkJCTB4MUZGOAogI2RlZmluZQlWREVDX0hfU09GVF9SU1RfQ1RSTAkJCTB4MUZGQwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBMVU1BX0NUUkwgcmVnaXN0ZXIgZmllbGRzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMVU1BX0NUUkwgcmVnaXN0ZXIgZmllbGRzICovCiAjZGVmaW5lIFZERUNfQV9CUklURV9DVFJMCQkJCTB4MTAxNAogI2RlZmluZSBWREVDX0FfQ05UUlNUX0NUUkwgICAgICAgCQkweDEwMTUKICNkZWZpbmUgVkRFQ19BX1BFQUtfU0VMICAgICAgICAgIAkJMHgxMDE2CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENIUk9NQV9DVFJMIHJlZ2lzdGVyIGZpZWxkcworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ0hST01BX0NUUkwgcmVnaXN0ZXIgZmllbGRzICovCiAjZGVmaW5lIFZERUNfQV9VU0FUX0NUUkwgICAgICAgICAJCTB4MTAxOAogI2RlZmluZSBWREVDX0FfVlNBVF9DVFJMICAgICAgICAgCQkweDEwMTkKICNkZWZpbmUgVkRFQ19BX0hVRV9DVFJMICAgICAgICAgIAkJMHgxMDFBCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS12aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uYwppbmRleCAzNDYxNmRjLi5lZjlmMmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS12aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmMKQEAgLTc3OCw5ICs3NzgsOSBAQAogCiBpbnQgbWVkdXNhX3ZpZGVvX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpCiB7Ci0JdTMyIHZhbHVlLCB0bXAgPSAwOwotCWludCByZXRfdmFsOwotCWludCBpOworICAgICAgIHUzMiB2YWx1ZSA9IDAsIHRtcCA9IDA7CisgICAgICAgaW50IHJldF92YWwgPSAwOworICAgICAgIGludCBpID0gMDsKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKQEAgLTc5MCw2ICs3OTAsNyBAQAogCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLCBNT05fQV9DVFJMLCAmdG1wKTsKIAl2YWx1ZSAmPSAweEZGRkZGMEZGOwogCXJldF92YWwgPSBjeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLCBNT05fQV9DVFJMLCB2YWx1ZSk7CisKIAlpZiAocmV0X3ZhbCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTc5Nyw2ICs3OTgsNyBAQAogCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLCBNT05fQV9DVFJMLCAmdG1wKTsKIAl2YWx1ZSAmPSAweEZGRkZGRkRGOwogCXJldF92YWwgPSBjeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLCBNT05fQV9DVFJMLCB2YWx1ZSk7CisKIAlpZiAocmV0X3ZhbCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTgxMiw2ICs4MTQsNyBAQAogCXZhbHVlICY9IDB4RkY3MEZGNzA7CiAJdmFsdWUgfD0gMHgwMDA5MDAwODsJLyogc2V0IGVuX2FjdGl2ZSAqLwogCXJldF92YWwgPSBjeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLCBERU5DX0FCX0NUUkwsIHZhbHVlKTsKKwogCWlmIChyZXRfdmFsIDwgMCkKIAkJZ290byBlcnJvcjsKIApAQCAtODI2LDggKzgyOSwxMCBAQAogCS8qIHNlbGVjdCBBRkUgY2xvY2sgdG8gb3V0cHV0IG1vZGUgKi8KIAl2YWx1ZSA9IGN4MjU4MjFfaTJjX3JlYWQoJmRldi0+aTJjX2J1c1swXSwgQUZFX0FCX0RJQUdfQ1RSTCwgJnRtcCk7CiAJdmFsdWUgJj0gMHg4M0ZGRkZGRjsKLQlyZXRfdmFsID0gY3gyNTgyMV9pMmNfd3JpdGUoJmRldi0+aTJjX2J1c1swXSwgQUZFX0FCX0RJQUdfQ1RSTCwKLQkJCQkgICAgdmFsdWUgfCAweDEwMDAwMDAwKTsKKyAgICAgICByZXRfdmFsID0KKwkgICBjeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLCBBRkVfQUJfRElBR19DVFJMLAorCQkJICAgICB2YWx1ZSB8IDB4MTAwMDAwMDApOworCiAJaWYgKHJldF92YWwgPCAwKQogCQlnb3RvIGVycm9yOwogCkBAIC04NDksMTIgKzg1NCwxNSBAQAogCiAJdmFsdWUgfD0gNzsKIAlyZXRfdmFsID0gY3gyNTgyMV9pMmNfd3JpdGUoJmRldi0+aTJjX2J1c1swXSwgUElOX09FX0NUUkwsIHZhbHVlKTsKKwogCWlmIChyZXRfdmFsIDwgMCkKIAkJZ290byBlcnJvcjsKIAorCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCiAJcmV0X3ZhbCA9IG1lZHVzYV9zZXRfdmlkZW9zdGFuZGFyZChkZXYpOworCiAJcmV0dXJuIHJldF92YWw7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmgKaW5kZXggMmZhYjRiMi4uNjE3NWUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS12aWRlby5oCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlICJjeDI1ODIxLW1lZHVzYS1kZWZpbmVzLmgiCiAKLS8vIENvbG9yIGNvbnRyb2wgY29uc3RhbnRzCisvKiBDb2xvciBjb250cm9sIGNvbnN0YW50cyAqLwogI2RlZmluZSBWSURFT19QUk9DQU1QX01JTiAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBWSURFT19QUk9DQU1QX01BWCAgICAgICAgICAgICAgICAgMTAwMDAKICNkZWZpbmUgVU5TSUdORURfQllURV9NSU4gICAgICAgICAgICAgICAgIDAKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgU0lHTkVEX0JZVEVfTUlOICAgICAgICAgICAgICAgICAgIC0xMjgKICNkZWZpbmUgU0lHTkVEX0JZVEVfTUFYICAgICAgICAgICAgICAgICAgIDEyNwogCi0vLyBEZWZhdWx0IHZpZGVvIGNvbG9yIHNldHRpbmdzCisvKiBEZWZhdWx0IHZpZGVvIGNvbG9yIHNldHRpbmdzICovCiAjZGVmaW5lIFNIQVJQTkVTU19ERUZBVUxUICAgICAgICAgICAgICAgICA1MAogI2RlZmluZSBTQVRVUkFUSU9OX0RFRkFVTFQgICAgICAgICAgICAgIDUwMDAKICNkZWZpbmUgQlJJR0hUTkVTU19ERUZBVUxUICAgICAgICAgICAgICA2MjAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1yZWcuaAppbmRleCA3MjQxZTdlLi5jZmUwZjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXJlZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtcmVnLmgKQEAgLTQ4LDI0ICs0OCwyNCBAQAogI2RlZmluZSBSSVNDX1NZTkNfRVZFTl9WQkkJIDB4MDAwMDAyMDcKICNkZWZpbmUgUklTQ19OT09QCQkJIDB4RjAwMDAwMDAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVNCIFNSQU0KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFRYX1NSQU0gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAJLy8gVHJhbnNtaXQgU1JBTQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEFTQiBTUkFNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lICBUWF9TUkFNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwCS8qIFRyYW5zbWl0IFNSQU0gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgUlhfUkFNICAgICAgICAgICAgICAgICAgICAweDAxMDAwMAkvLyBSZWNlaXZlIFNSQU0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgIFJYX1JBTSAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAJLyogUmVjZWl2ZSBTUkFNICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEFwcGxpY2F0aW9uIExheWVyIChBTCkKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERFVl9DTlRSTDIgICAgICAgICAgICAgICAgMHgwNDAwMDAJLy8gRGV2aWNlIGNvbnRyb2wKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBBcHBsaWNhdGlvbiBMYXllciAoQUwpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lICBERVZfQ05UUkwyICAgICAgICAgICAgICAgIDB4MDQwMDAwCS8qIERldmljZSBjb250cm9sICovCiAjZGVmaW5lICBGTERfUlVOX1JJU0MgICAgICAgICAgICAgIDB4MDAwMDAwMjAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgUENJX0lOVF9NU0sgICAgICAgICAgICAgICAweDA0MDAxMAkvLyBQQ0kgaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIFBDSV9JTlRfU1RBVCAgICAgICAgICAgICAgMHgwNDAwMTQJLy8gUENJIGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIFBDSV9JTlRfTVNUQVQgICAgICAgICAgICAgMHgwNDAwMTgJLy8gUENJIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgUENJX0lOVF9NU0sgICAgICAgICAgICAgICAweDA0MDAxMAkvKiBQQ0kgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIFBDSV9JTlRfU1RBVCAgICAgICAgICAgICAgMHgwNDAwMTQJLyogUENJIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9JTlRfTVNUQVQgICAgICAgICAgICAgMHgwNDAwMTgJLyogUENJIGludGVycnVwdCBtYXNrZWQgc3RhdHVzICovCiAjZGVmaW5lICBGTERfSEFNTUVSSEVBRF9JTlQgICAgICAgICgxIDw8IDI3KQogI2RlZmluZSAgRkxEX1VBUlRfSU5UICAgICAgICAgICAgICAoMSA8PCAyNikKICNkZWZpbmUgIEZMRF9JUlFOX0lOVCAgICAgICAgICAgICAgKDEgPDwgMjUpCkBAIC05Myw2NSArOTMsNjUgQEAKICNkZWZpbmUgIEZMRF9WSURfQl9JTlQgICAgICAgICAgICAgKDEgPDwgMSkKICNkZWZpbmUgIEZMRF9WSURfQV9JTlQgICAgICAgICAgICAgKDEgPDwgMCkKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0FfSU5UX01TSyAgICAgICAgICAgICAweDA0MDAyMAkvLyBWaWRlbyBBIGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBWSURfQV9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMDI0CS8vIFZpZGVvIEEgaW50ZXJydXB0IHN0YXR1cwotI2RlZmluZSAgVklEX0FfSU5UX01TVEFUICAgICAgICAgICAweDA0MDAyOAkvLyBWaWRlbyBBIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBWSURfQV9JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMDJDCS8vIFZpZGVvIEEgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfQV9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMDIwCS8qIFZpZGVvIEEgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIFZJRF9BX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwMjQJLyogVmlkZW8gQSBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBWSURfQV9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMDI4CS8qIFZpZGVvIEEgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9BX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwMkMJLyogVmlkZW8gQSBpbnRlcnJ1cHQgc2V0IHN0YXR1cyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfQl9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMDMwCS8vIFZpZGVvIEIgaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIFZJRF9CX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwMzQJLy8gVmlkZW8gQiBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBWSURfQl9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMDM4CS8vIFZpZGVvIEIgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMKLSNkZWZpbmUgIFZJRF9CX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwM0MJLy8gVmlkZW8gQiBpbnRlcnJ1cHQgc2V0IHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9CX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwMzAJLyogVmlkZW8gQiBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgVklEX0JfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDAzNAkvKiBWaWRlbyBCIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9CX0lOVF9NU1RBVCAgICAgICAgICAgMHgwNDAwMzgJLyogVmlkZW8gQiBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cyAqLworI2RlZmluZSAgVklEX0JfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDAzQwkvKiBWaWRlbyBCIGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZJRF9DX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwNDAJLy8gVmlkZW8gQyBpbnRlcnJ1cHQgbWFzawotI2RlZmluZSAgVklEX0NfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDA0NAkvLyBWaWRlbyBDIGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIFZJRF9DX0lOVF9NU1RBVCAgICAgICAgICAgMHgwNDAwNDgJLy8gVmlkZW8gQyBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgVklEX0NfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDA0QwkvLyBWaWRlbyBDIGludGVycnVwdCBzZXQgc3RhdHVzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVklEX0NfSU5UX01TSyAgICAgICAgICAgICAweDA0MDA0MAkvKiBWaWRlbyBDIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICBWSURfQ19JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMDQ0CS8qIFZpZGVvIEMgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgVklEX0NfSU5UX01TVEFUICAgICAgICAgICAweDA0MDA0OAkvKiBWaWRlbyBDIGludGVycnVwdCBtYXNrZWQgc3RhdHVzICovCisjZGVmaW5lICBWSURfQ19JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMDRDCS8qIFZpZGVvIEMgaW50ZXJydXB0IHNldCBzdGF0dXMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0RfSU5UX01TSyAgICAgICAgICAgICAweDA0MDA1MAkvLyBWaWRlbyBEIGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBWSURfRF9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMDU0CS8vIFZpZGVvIEQgaW50ZXJydXB0IHN0YXR1cwotI2RlZmluZSAgVklEX0RfSU5UX01TVEFUICAgICAgICAgICAweDA0MDA1OAkvLyBWaWRlbyBEIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBWSURfRF9JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMDVDCS8vIFZpZGVvIEQgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfRF9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMDUwCS8qIFZpZGVvIEQgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIFZJRF9EX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwNTQJLyogVmlkZW8gRCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBWSURfRF9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMDU4CS8qIFZpZGVvIEQgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9EX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwNUMJLyogVmlkZW8gRCBpbnRlcnJ1cHQgc2V0IHN0YXR1cyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfRV9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMDYwCS8vIFZpZGVvIEUgaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIFZJRF9FX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwNjQJLy8gVmlkZW8gRSBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBWSURfRV9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMDY4CS8vIFZpZGVvIEUgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMKLSNkZWZpbmUgIFZJRF9FX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwNkMJLy8gVmlkZW8gRSBpbnRlcnJ1cHQgc2V0IHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9FX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwNjAJLyogVmlkZW8gRSBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgVklEX0VfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDA2NAkvKiBWaWRlbyBFIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9FX0lOVF9NU1RBVCAgICAgICAgICAgMHgwNDAwNjgJLyogVmlkZW8gRSBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cyAqLworI2RlZmluZSAgVklEX0VfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDA2QwkvKiBWaWRlbyBFIGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZJRF9GX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwNzAJLy8gVmlkZW8gRiBpbnRlcnJ1cHQgbWFzawotI2RlZmluZSAgVklEX0ZfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDA3NAkvLyBWaWRlbyBGIGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIFZJRF9GX0lOVF9NU1RBVCAgICAgICAgICAgMHgwNDAwNzgJLy8gVmlkZW8gRiBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgVklEX0ZfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDA3QwkvLyBWaWRlbyBGIGludGVycnVwdCBzZXQgc3RhdHVzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVklEX0ZfSU5UX01TSyAgICAgICAgICAgICAweDA0MDA3MAkvKiBWaWRlbyBGIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICBWSURfRl9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMDc0CS8qIFZpZGVvIEYgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgVklEX0ZfSU5UX01TVEFUICAgICAgICAgICAweDA0MDA3OAkvKiBWaWRlbyBGIGludGVycnVwdCBtYXNrZWQgc3RhdHVzICovCisjZGVmaW5lICBWSURfRl9JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMDdDCS8qIFZpZGVvIEYgaW50ZXJydXB0IHNldCBzdGF0dXMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0dfSU5UX01TSyAgICAgICAgICAgICAweDA0MDA4MAkvLyBWaWRlbyBHIGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBWSURfR19JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMDg0CS8vIFZpZGVvIEcgaW50ZXJydXB0IHN0YXR1cwotI2RlZmluZSAgVklEX0dfSU5UX01TVEFUICAgICAgICAgICAweDA0MDA4OAkvLyBWaWRlbyBHIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBWSURfR19JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMDhDCS8vIFZpZGVvIEcgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfR19JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMDgwCS8qIFZpZGVvIEcgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIFZJRF9HX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwODQJLyogVmlkZW8gRyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBWSURfR19JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMDg4CS8qIFZpZGVvIEcgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9HX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwOEMJLyogVmlkZW8gRyBpbnRlcnJ1cHQgc2V0IHN0YXR1cyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfSF9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMDkwCS8vIFZpZGVvIEggaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIFZJRF9IX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwOTQJLy8gVmlkZW8gSCBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBWSURfSF9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMDk4CS8vIFZpZGVvIEggaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMKLSNkZWZpbmUgIFZJRF9IX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwOUMJLy8gVmlkZW8gSCBpbnRlcnJ1cHQgc2V0IHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9IX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwOTAJLyogVmlkZW8gSCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgVklEX0hfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDA5NAkvKiBWaWRlbyBIIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9IX0lOVF9NU1RBVCAgICAgICAgICAgMHgwNDAwOTgJLyogVmlkZW8gSCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cyAqLworI2RlZmluZSAgVklEX0hfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDA5QwkvKiBWaWRlbyBIIGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZJRF9JX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwQTAJLy8gVmlkZW8gSSBpbnRlcnJ1cHQgbWFzawotI2RlZmluZSAgVklEX0lfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDBBNAkvLyBWaWRlbyBJIGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIFZJRF9JX0lOVF9NU1RBVCAgICAgICAgICAgMHgwNDAwQTgJLy8gVmlkZW8gSSBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgVklEX0lfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDBBQwkvLyBWaWRlbyBJIGludGVycnVwdCBzZXQgc3RhdHVzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVklEX0lfSU5UX01TSyAgICAgICAgICAgICAweDA0MDBBMAkvKiBWaWRlbyBJIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICBWSURfSV9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMEE0CS8qIFZpZGVvIEkgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgVklEX0lfSU5UX01TVEFUICAgICAgICAgICAweDA0MDBBOAkvKiBWaWRlbyBJIGludGVycnVwdCBtYXNrZWQgc3RhdHVzICovCisjZGVmaW5lICBWSURfSV9JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMEFDCS8qIFZpZGVvIEkgaW50ZXJydXB0IHNldCBzdGF0dXMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0pfSU5UX01TSyAgICAgICAgICAgICAweDA0MDBCMAkvLyBWaWRlbyBKIGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBWSURfSl9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMEI0CS8vIFZpZGVvIEogaW50ZXJydXB0IHN0YXR1cwotI2RlZmluZSAgVklEX0pfSU5UX01TVEFUICAgICAgICAgICAweDA0MDBCOAkvLyBWaWRlbyBKIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBWSURfSl9JTlRfU1NUQVQgICAgICAgICAgIDB4MDQwMEJDCS8vIFZpZGVvIEogaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfSl9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMEIwCS8qIFZpZGVvIEogaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIFZJRF9KX0lOVF9TVEFUICAgICAgICAgICAgMHgwNDAwQjQJLyogVmlkZW8gSiBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBWSURfSl9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMEI4CS8qIFZpZGVvIEogaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIFZJRF9KX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwQkMJLyogVmlkZW8gSiBpbnRlcnJ1cHQgc2V0IHN0YXR1cyAqLwogCiAjZGVmaW5lICBGTERfVklEX1NSQ19PUENfRVJSICAgICAgIDB4MDAwMjAwMDAKICNkZWZpbmUgIEZMRF9WSURfRFNUX09QQ19FUlIgICAgICAgMHgwMDAxMDAwMApAQCAtMTY2LDM1ICsxNjYsMzUgQEAKICNkZWZpbmUgIEZMRF9WSURfU1JDX0VSUk9SUwkJRkxEX1ZJRF9TUkNfT1BDX0VSUiB8IEZMRF9WSURfU1JDX1NZTkMgfCBGTERfVklEX1NSQ19VRgogI2RlZmluZSAgRkxEX1ZJRF9EU1RfRVJST1JTCQlGTERfVklEX0RTVF9PUENfRVJSIHwgRkxEX1ZJRF9EU1RfU1lOQyB8IEZMRF9WSURfRFNUX09GCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEFVRF9BX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwQzAJLy8gQXVkaW8gSW50IGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBBVURfQV9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMEM0CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBBVURfQV9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMEM4CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgQVVEX0FfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDBDQwkvLyBBdWRpbyBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfQV9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMEMwCS8qIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgQVVEX0FfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDBDNAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgQVVEX0FfSU5UX01TVEFUICAgICAgICAgICAweDA0MDBDOAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEFVRF9BX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwQ0MJLyogQXVkaW8gSW50IGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEFVRF9CX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwRDAJLy8gQXVkaW8gSW50IGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBBVURfQl9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMEQ0CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBBVURfQl9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMEQ4CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgQVVEX0JfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDBEQwkvLyBBdWRpbyBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfQl9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMEQwCS8qIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgQVVEX0JfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDBENAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgQVVEX0JfSU5UX01TVEFUICAgICAgICAgICAweDA0MDBEOAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEFVRF9CX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwREMJLyogQXVkaW8gSW50IGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEFVRF9DX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwRTAJLy8gQXVkaW8gSW50IGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBBVURfQ19JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMEU0CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBBVURfQ19JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMEU4CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgQVVEX0NfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDBFQwkvLyBBdWRpbyBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfQ19JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMEUwCS8qIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgQVVEX0NfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDBFNAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgQVVEX0NfSU5UX01TVEFUICAgICAgICAgICAweDA0MDBFOAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEFVRF9DX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwRUMJLyogQXVkaW8gSW50IGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEFVRF9EX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAwRjAJLy8gQXVkaW8gSW50IGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBBVURfRF9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMEY0CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBBVURfRF9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMEY4CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgQVVEX0RfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDBGQwkvLyBBdWRpbyBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfRF9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMEYwCS8qIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgQVVEX0RfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDBGNAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgQVVEX0RfSU5UX01TVEFUICAgICAgICAgICAweDA0MDBGOAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEFVRF9EX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAwRkMJLyogQXVkaW8gSW50IGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEFVRF9FX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAxMDAJLy8gQXVkaW8gSW50IGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBBVURfRV9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMTA0CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgc3RhdHVzCi0jZGVmaW5lICBBVURfRV9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMTA4CS8vIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cwotI2RlZmluZSAgQVVEX0VfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDEwQwkvLyBBdWRpbyBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfRV9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMTAwCS8qIEF1ZGlvIEludCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgQVVEX0VfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDEwNAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgQVVEX0VfSU5UX01TVEFUICAgICAgICAgICAweDA0MDEwOAkvKiBBdWRpbyBJbnQgaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEFVRF9FX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAxMEMJLyogQXVkaW8gSW50IGludGVycnVwdCBzZXQgc3RhdHVzICovCiAKICNkZWZpbmUgIEZMRF9BVURfU1JDX09QQ19FUlIgICAgICAgMHgwMDAyMDAwMAogI2RlZmluZSAgRkxEX0FVRF9EU1RfT1BDX0VSUiAgICAgICAweDAwMDEwMDAwCkBAIC0yMDcsMTcgKzIwNywxNyBAQAogI2RlZmluZSAgRkxEX0FVRF9TUkNfUklTQ0kxICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lICBGTERfQVVEX0RTVF9SSVNDSTEgICAgICAgIDB4MDAwMDAwMDEKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgTUJJRl9BX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAxMTAJLy8gTUJJRiBJbnQgaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIE1CSUZfQV9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMTE0CS8vIE1CSUYgSW50IGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIE1CSUZfQV9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMTE4CS8vIE1CSUYgSW50IGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBNQklGX0FfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDExQwkvLyBNQklGIEludCBpbnRlcnJ1cHQgc2V0IHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIE1CSUZfQV9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMTEwCS8qIE1CSUYgSW50IGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICBNQklGX0FfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDExNAkvKiBNQklGIEludCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBNQklGX0FfSU5UX01TVEFUICAgICAgICAgICAweDA0MDExOAkvKiBNQklGIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cyAqLworI2RlZmluZSAgTUJJRl9BX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAxMUMJLyogTUJJRiBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgTUJJRl9CX0lOVF9NU0sgICAgICAgICAgICAgMHgwNDAxMjAJLy8gTUJJRiBJbnQgaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIE1CSUZfQl9JTlRfU1RBVCAgICAgICAgICAgIDB4MDQwMTI0CS8vIE1CSUYgSW50IGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIE1CSUZfQl9JTlRfTVNUQVQgICAgICAgICAgIDB4MDQwMTI4CS8vIE1CSUYgSW50IGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBNQklGX0JfSU5UX1NTVEFUICAgICAgICAgICAweDA0MDEyQwkvLyBNQklGIEludCBpbnRlcnJ1cHQgc2V0IHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIE1CSUZfQl9JTlRfTVNLICAgICAgICAgICAgIDB4MDQwMTIwCS8qIE1CSUYgSW50IGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICBNQklGX0JfSU5UX1NUQVQgICAgICAgICAgICAweDA0MDEyNAkvKiBNQklGIEludCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBNQklGX0JfSU5UX01TVEFUICAgICAgICAgICAweDA0MDEyOAkvKiBNQklGIEludCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cyAqLworI2RlZmluZSAgTUJJRl9CX0lOVF9TU1RBVCAgICAgICAgICAgMHgwNDAxMkMJLyogTUJJRiBJbnQgaW50ZXJydXB0IHNldCBzdGF0dXMgKi8KIAogI2RlZmluZSAgRkxEX01CSUZfRFNUX09QQ19FUlIgICAgICAgMHgwMDAxMDAwMAogI2RlZmluZSAgRkxEX01CSUZfRFNUX1NZTkMgICAgICAgICAgMHgwMDAwMTAwMApAQCAtMjI1LDM1ICsyMjUsMzUgQEAKICNkZWZpbmUgIEZMRF9NQklGX0RTVF9SSVNDSTIgICAgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgIEZMRF9NQklGX0RTVF9SSVNDSTEgICAgICAgIDB4MDAwMDAwMDEKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQVVEX0VYVF9JTlRfTVNLICAgICAgICAgICAweDA0MDA2MAkvLyBBdWRpbyBFeHQgaW50ZXJydXB0IG1hc2sKLSNkZWZpbmUgIEFVRF9FWFRfSU5UX1NUQVQgICAgICAgICAgMHgwNDAwNjQJLy8gQXVkaW8gRXh0IGludGVycnVwdCBzdGF0dXMKLSNkZWZpbmUgIEFVRF9FWFRfSU5UX01TVEFUICAgICAgICAgMHgwNDAwNjgJLy8gQXVkaW8gRXh0IGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBBVURfRVhUX0lOVF9TU1RBVCAgICAgICAgIDB4MDQwMDZDCS8vIEF1ZGlvIEV4dCBpbnRlcnJ1cHQgc2V0IHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEFVRF9FWFRfSU5UX01TSyAgICAgICAgICAgMHgwNDAwNjAJLyogQXVkaW8gRXh0IGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICBBVURfRVhUX0lOVF9TVEFUICAgICAgICAgIDB4MDQwMDY0CS8qIEF1ZGlvIEV4dCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBBVURfRVhUX0lOVF9NU1RBVCAgICAgICAgIDB4MDQwMDY4CS8qIEF1ZGlvIEV4dCBpbnRlcnJ1cHQgbWFza2VkIHN0YXR1cyAqLworI2RlZmluZSAgQVVEX0VYVF9JTlRfU1NUQVQgICAgICAgICAweDA0MDA2QwkvKiBBdWRpbyBFeHQgaW50ZXJydXB0IHNldCBzdGF0dXMgKi8KICNkZWZpbmUgIEZMRF9BVURfRVhUX09QQ19FUlIgICAgICAgMHgwMDAxMDAwMAogI2RlZmluZSAgRkxEX0FVRF9FWFRfU1lOQyAgICAgICAgICAweDAwMDAxMDAwCiAjZGVmaW5lICBGTERfQVVEX0VYVF9PRiAgICAgICAgICAgIDB4MDAwMDAxMDAKICNkZWZpbmUgIEZMRF9BVURfRVhUX1JJU0NJMiAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSAgRkxEX0FVRF9FWFRfUklTQ0kxICAgICAgICAweDAwMDAwMDAxCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEdQSU9fTE8gICAgICAgICAgICAgICAgICAgMHgxMTAwMTAJLy8gTG93ZXIgIG9mIEdQSU8gcGlucyBbMzE6MF0KLSNkZWZpbmUgIEdQSU9fSEkgICAgICAgICAgICAgICAgICAgMHgxMTAwMTQJLy8gVXBwZXIgV09SRCAgb2YgR1BJTyBwaW5zIFs0NzozMV0KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBHUElPX0xPICAgICAgICAgICAgICAgICAgIDB4MTEwMDEwCS8qIExvd2VyICBvZiBHUElPIHBpbnMgWzMxOjBdICovCisjZGVmaW5lICBHUElPX0hJICAgICAgICAgICAgICAgICAgIDB4MTEwMDE0CS8qIFVwcGVyIFdPUkQgIG9mIEdQSU8gcGlucyBbNDc6MzFdICovCiAKLSNkZWZpbmUgIEdQSU9fTE9fT0UgICAgICAgICAgICAgICAgMHgxMTAwMTgJLy8gTG93ZXIgIG9mIEdQSU8gb3V0cHV0IGVuYWJsZSBbMzE6MF0KLSNkZWZpbmUgIEdQSU9fSElfT0UgICAgICAgICAgICAgICAgMHgxMTAwMUMJLy8gVXBwZXIgd29yZCAgb2YgR1BJTyBvdXRwdXQgZW5hYmxlIFs0NzozMl0KKyNkZWZpbmUgIEdQSU9fTE9fT0UgICAgICAgICAgICAgICAgMHgxMTAwMTgJLyogTG93ZXIgIG9mIEdQSU8gb3V0cHV0IGVuYWJsZSBbMzE6MF0gKi8KKyNkZWZpbmUgIEdQSU9fSElfT0UgICAgICAgICAgICAgICAgMHgxMTAwMUMJLyogVXBwZXIgd29yZCAgb2YgR1BJTyBvdXRwdXQgZW5hYmxlIFs0NzozMl0gKi8KIAotI2RlZmluZSAgR1BJT19MT19JTlRfTVNLICAgICAgICAgICAweDExMDAzQwkvLyBHUElPIGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBHUElPX0xPX0lOVF9TVEFUICAgICAgICAgIDB4MTEwMDQ0CS8vIEdQSU8gaW50ZXJydXB0IHN0YXR1cwotI2RlZmluZSAgR1BJT19MT19JTlRfTVNUQVQgICAgICAgICAweDExMDA0QwkvLyBHUElPIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBHUElPX0xPX0lTTV9TTlMgICAgICAgICAgIDB4MTEwMDU0CS8vIEdQSU8gaW50ZXJydXB0IHNlbnNpdGl2aXR5Ci0jZGVmaW5lICBHUElPX0xPX0lTTV9QT0wgICAgICAgICAgIDB4MTEwMDVDCS8vIEdQSU8gaW50ZXJydXB0IHBvbGFyaXR5CisjZGVmaW5lICBHUElPX0xPX0lOVF9NU0sgICAgICAgICAgIDB4MTEwMDNDCS8qIEdQSU8gaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIEdQSU9fTE9fSU5UX1NUQVQgICAgICAgICAgMHgxMTAwNDQJLyogR1BJTyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBHUElPX0xPX0lOVF9NU1RBVCAgICAgICAgIDB4MTEwMDRDCS8qIEdQSU8gaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEdQSU9fTE9fSVNNX1NOUyAgICAgICAgICAgMHgxMTAwNTQJLyogR1BJTyBpbnRlcnJ1cHQgc2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgIEdQSU9fTE9fSVNNX1BPTCAgICAgICAgICAgMHgxMTAwNUMJLyogR1BJTyBpbnRlcnJ1cHQgcG9sYXJpdHkgKi8KIAotI2RlZmluZSAgR1BJT19ISV9JTlRfTVNLICAgICAgICAgICAweDExMDA0MAkvLyBHUElPIGludGVycnVwdCBtYXNrCi0jZGVmaW5lICBHUElPX0hJX0lOVF9TVEFUICAgICAgICAgIDB4MTEwMDQ4CS8vIEdQSU8gaW50ZXJydXB0IHN0YXR1cwotI2RlZmluZSAgR1BJT19ISV9JTlRfTVNUQVQgICAgICAgICAweDExMDA1MAkvLyBHUElPIGludGVycnVwdCBtYXNrZWQgc3RhdHVzCi0jZGVmaW5lICBHUElPX0hJX0lTTV9TTlMgICAgICAgICAgIDB4MTEwMDU4CS8vIEdQSU8gaW50ZXJydXB0IHNlbnNpdGl2aXR5Ci0jZGVmaW5lICBHUElPX0hJX0lTTV9QT0wgICAgICAgICAgIDB4MTEwMDYwCS8vIEdQSU8gaW50ZXJydXB0IHBvbGFyaXR5CisjZGVmaW5lICBHUElPX0hJX0lOVF9NU0sgICAgICAgICAgIDB4MTEwMDQwCS8qIEdQSU8gaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgIEdQSU9fSElfSU5UX1NUQVQgICAgICAgICAgMHgxMTAwNDgJLyogR1BJTyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICBHUElPX0hJX0lOVF9NU1RBVCAgICAgICAgIDB4MTEwMDUwCS8qIEdQSU8gaW50ZXJydXB0IG1hc2tlZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEdQSU9fSElfSVNNX1NOUyAgICAgICAgICAgMHgxMTAwNTgJLyogR1BJTyBpbnRlcnJ1cHQgc2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgIEdQSU9fSElfSVNNX1BPTCAgICAgICAgICAgMHgxMTAwNjAJLyogR1BJTyBpbnRlcnJ1cHQgcG9sYXJpdHkgKi8KIAogI2RlZmluZSAgRkxEX0dQSU80M19JTlQgICAgICAgICAgICAoMSA8PCAxMSkKICNkZWZpbmUgIEZMRF9HUElPNDJfSU5UICAgICAgICAgICAgKDEgPDwgMTApCkBAIC0yNzEsMjM2ICsyNzEsMjM2IEBACiAjZGVmaW5lICBGTERfR1BJTzFfSU5UICAgICAgICAgICAgICgxIDw8IDEpCiAjZGVmaW5lICBGTERfR1BJTzBfSU5UICAgICAgICAgICAgICgxIDw8IDApCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFRDX1JFUSAgICAgICAgICAgICAgICAgICAgMHgwNDAwOTAJLy8gUmlkZXIgUENJIEV4cHJlc3MgdHJhRkZpYyBjbGFzcyByZXF1ZXN0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVENfUkVRICAgICAgICAgICAgICAgICAgICAweDA0MDA5MAkvKiBSaWRlciBQQ0kgRXhwcmVzcyB0cmFGRmljIGNsYXNzIHJlcXVlc3QgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVENfUkVRX1NFVCAgICAgICAgICAgICAgICAweDA0MDA5NAkvLyBSaWRlciBQQ0kgRXhwcmVzcyB0cmFGRmljIGNsYXNzIHJlcXVlc3Qgc2V0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVENfUkVRX1NFVCAgICAgICAgICAgICAgICAweDA0MDA5NAkvKiBSaWRlciBQQ0kgRXhwcmVzcyB0cmFGRmljIGNsYXNzIHJlcXVlc3Qgc2V0ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFJpZGVyCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogUmlkZXIgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLS8vIFBDSSBDb21wYXRpYmxlIEhlYWRlcgotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogUENJIENvbXBhdGlibGUgSGVhZGVyICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzAgICAgICAgICAgICAgICAgICAweDA1MDAwMAogI2RlZmluZSAgUkRSX1ZFTkRPUl9ERVZJQ0VfSURfQ0ZHICAweDA1MDAwMAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzEgICAgICAgICAgICAgICAgICAweDA1MDAwNAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzIgICAgICAgICAgICAgICAgICAweDA1MDAwOAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzMgICAgICAgICAgICAgICAgICAweDA1MDAwQwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzQgICAgICAgICAgICAgICAgICAweDA1MDAxMAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzUgICAgICAgICAgICAgICAgICAweDA1MDAxNAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzYgICAgICAgICAgICAgICAgICAweDA1MDAxOAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzcgICAgICAgICAgICAgICAgICAweDA1MDAxQwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzggICAgICAgICAgICAgICAgICAweDA1MDAyMAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGRzkgICAgICAgICAgICAgICAgICAweDA1MDAyNAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGR0EgICAgICAgICAgICAgICAgICAweDA1MDAyOAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGR0IgICAgICAgICAgICAgICAgICAweDA1MDAyQwogI2RlZmluZSAgUkRSX1NVU1NZU1RFTV9JRF9DRkcgICAgICAweDA1MDAyQwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGR0MgICAgICAgICAgICAgICAgICAweDA1MDAzMAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGR0QgICAgICAgICAgICAgICAgICAweDA1MDAzNAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGR0UgICAgICAgICAgICAgICAgICAweDA1MDAzOAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0NGR0YgICAgICAgICAgICAgICAgICAweDA1MDAzQwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBQQ0ktRXhwcmVzcyBDYXBhYmlsaXRpZXMKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBQQ0ktRXhwcmVzcyBDYXBhYmlsaXRpZXMgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUEVDQVAgICAgICAgICAgICAgICAgIDB4MDUwMDQwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUEVERVZDQVAgICAgICAgICAgICAgIDB4MDUwMDQ0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUEVERVZTQyAgICAgICAgICAgICAgIDB4MDUwMDQ4CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUEVMSU5LQ0FQICAgICAgICAgICAgIDB4MDUwMDRDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUEVMSU5LU0MgICAgICAgICAgICAgIDB4MDUwMDUwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUE1JQ0FQICAgICAgICAgICAgICAgIDB4MDUwMDgwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUE1DU1IgICAgICAgICAgICAgICAgIDB4MDUwMDg0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfVlBEQ0FQICAgICAgICAgICAgICAgIDB4MDUwMDkwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfVlBEREFUQSAgICAgICAgICAgICAgIDB4MDUwMDk0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfTVNJQ0FQICAgICAgICAgICAgICAgIDB4MDUwMEEwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfTVNJQVJMICAgICAgICAgICAgICAgIDB4MDUwMEE0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfTVNJQVJVICAgICAgICAgICAgICAgIDB4MDUwMEE4CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfTVNJREFUQSAgICAgICAgICAgICAgIDB4MDUwMEFDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFBDSSBFeHByZXNzIEV4dGVuZGVkIENhcGFiaWxpdGllcwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFBDSSBFeHByZXNzIEV4dGVuZGVkIENhcGFiaWxpdGllcyAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJYQ0FQICAgICAgICAgICAgICAgMHgwNTAxMDAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJVRVNUQSAgICAgICAgICAgICAgMHgwNTAxMDQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJVRU1TSyAgICAgICAgICAgICAgMHgwNTAxMDgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJVRVNFViAgICAgICAgICAgICAgMHgwNTAxMEMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJDRVNUQSAgICAgICAgICAgICAgMHgwNTAxMTAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJDRU1TSyAgICAgICAgICAgICAgMHgwNTAxMTQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJDQyAgICAgICAgICAgICAgICAgMHgwNTAxMTgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJITDAgICAgICAgICAgICAgICAgMHgwNTAxMUMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJITDEgICAgICAgICAgICAgICAgMHgwNTAxMjAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJITDIgICAgICAgICAgICAgICAgMHgwNTAxMjQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9BRVJITDMgICAgICAgICAgICAgICAgMHgwNTAxMjgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1hDQVAgICAgICAgICAgICAgICAgMHgwNTAyMDAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0NBUDEgICAgICAgICAgICAgICAgMHgwNTAyMDQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0NBUDIgICAgICAgICAgICAgICAgMHgwNTAyMDgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1NDICAgICAgICAgICAgICAgICAgMHgwNTAyMEMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IwX0NBUCAgICAgICAgICAgICAgMHgwNTAyMTAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IwX0NUUkwgICAgICAgICAgICAgMHgwNTAyMTQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IwX1NUQVQgICAgICAgICAgICAgMHgwNTAyMTgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IxX0NBUCAgICAgICAgICAgICAgMHgwNTAyMUMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IxX0NUUkwgICAgICAgICAgICAgMHgwNTAyMjAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IxX1NUQVQgICAgICAgICAgICAgMHgwNTAyMjQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IyX0NBUCAgICAgICAgICAgICAgMHgwNTAyMjgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IyX0NUUkwgICAgICAgICAgICAgMHgwNTAyMkMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IyX1NUQVQgICAgICAgICAgICAgMHgwNTAyMzAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IzX0NBUCAgICAgICAgICAgICAgMHgwNTAyMzQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IzX0NUUkwgICAgICAgICAgICAgMHgwNTAyMzgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ1IzX1NUQVQgICAgICAgICAgICAgMHgwNTAyM0MKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjAgICAgICAgICAgICAgICAgMHgwNTAyNDAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjEgICAgICAgICAgICAgICAgMHgwNTAyNDQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjIgICAgICAgICAgICAgICAgMHgwNTAyNDgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjMgICAgICAgICAgICAgICAgMHgwNTAyNEMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjQgICAgICAgICAgICAgICAgMHgwNTAyNTAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjUgICAgICAgICAgICAgICAgMHgwNTAyNTQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjYgICAgICAgICAgICAgICAgMHgwNTAyNTgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9WQ0FSQjcgICAgICAgICAgICAgICAgMHgwNTAyNUMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9SRFJTVEFUMCAgICAgICAgICAgICAgMHgwNTAzMDAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9SRFJTVEFUMSAgICAgICAgICAgICAgMHgwNTAzMDQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9SRFJDVEwwICAgICAgICAgICAgICAgMHgwNTAzMDgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9SRFJDVEwxICAgICAgICAgICAgICAgMHgwNTAzMEMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHJhbnNhY3Rpb24gTGF5ZXIgUmVnaXN0ZXJzCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogVHJhbnNhY3Rpb24gTGF5ZXIgUmVnaXN0ZXJzICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX1RMU1RBVDAgICAgICAgICAgICAgICAweDA1MDMxMAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX1RMU1RBVDEgICAgICAgICAgICAgICAweDA1MDMxNAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX1RMQ1RMMCAgICAgICAgICAgICAgICAweDA1MDMxOAogI2RlZmluZSAgRkxEX0NGR19VUl9DUExfTU9ERSAgICAgICAweDAwMDAwMDQwCiAjZGVmaW5lICBGTERfQ0ZHX0NPUlJfRVJSX1FVSVRFICAgIDB4MDAwMDAwMjAKQEAgLTUxMCw1NjkgKzUxMCw1NjkgQEAKICNkZWZpbmUgIEZMRF9DRkdfUkVMQVhfT1JERVJfTVNLICAgMHgwMDAwMDAwMgogI2RlZmluZSAgRkxEX0NGR19UQUdfT1JERVJfRU4gICAgICAweDAwMDAwMDAxCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfVExDVEwxICAgICAgICAgICAgICAgIDB4MDUwMzFDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUkVRUkNBTCAgICAgICAgICAgICAgIDB4MDUwMzIwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUkVRUkNBVSAgICAgICAgICAgICAgIDB4MDUwMzI0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUkVRRVBBICAgICAgICAgICAgICAgIDB4MDUwMzI4CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUkVRQ1RSTCAgICAgICAgICAgICAgIDB4MDUwMzJDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUkVRU1RBVCAgICAgICAgICAgICAgIDB4MDUwMzMwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfVExfVEVTVCAgICAgICAgICAgICAgIDB4MDUwMzM0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfVkNSMDFfQ1RMICAgICAgICAgICAgIDB4MDUwMzQ4CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfVkNSMjNfQ1RMICAgICAgICAgICAgIDB4MDUwMzRDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUlhfVkNSMF9GQyAgICAgICAgICAgIDB4MDUwMzUwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUlhfVkNSMV9GQyAgICAgICAgICAgIDB4MDUwMzU0CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUlhfVkNSMl9GQyAgICAgICAgICAgIDB4MDUwMzU4CiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAjZGVmaW5lICBSRFJfUlhfVkNSM19GQyAgICAgICAgICAgIDB4MDUwMzVDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIERhdGEgTGluayBMYXllciBSZWdpc3RlcnMKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBEYXRhIExpbmsgTGF5ZXIgUmVnaXN0ZXJzICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0RMTFNUQVQgICAgICAgICAgICAgICAweDA1MDM2MAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0RMTENUUkwgICAgICAgICAgICAgICAweDA1MDM2NAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX1JFUExBWVRPICAgICAgICAgICAgICAweDA1MDM2OAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUkRSX0FDS0xBVFRPICAgICAgICAgICAgICAweDA1MDM2QwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBNQUMgTGF5ZXIgUmVnaXN0ZXJzCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogTUFDIExheWVyIFJlZ2lzdGVycyAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9NQUNTVEFUMCAgICAgICAgICAgICAgMHgwNTAzODAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9NQUNTVEFUMSAgICAgICAgICAgICAgMHgwNTAzODQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9NQUNDVFJMMCAgICAgICAgICAgICAgMHgwNTAzODgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9NQUNDVFJMMSAgICAgICAgICAgICAgMHgwNTAzOEMKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9NQUNDVFJMMiAgICAgICAgICAgICAgMHgwNTAzOTAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9NQUNfTEJfREFUQSAgICAgICAgICAgMHgwNTAzOTQKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KICNkZWZpbmUgIFJEUl9MMFNfRVhJVF9MQVQgICAgICAgICAgMHgwNTAzOTgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gRE1BQwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMV9QVFIxICAgICAgICAgICAgICAgICAweDEwMDAwMAkvLyBETUEgQ3VycmVudCBQdHIgOiBDaCMxCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRE1BQyAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTFfUFRSMSAgICAgICAgICAgICAgICAgMHgxMDAwMDAJLyogRE1BIEN1cnJlbnQgUHRyIDogQ2gjMSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyX1BUUjEgICAgICAgICAgICAgICAgIDB4MTAwMDA0CS8vIERNQSBDdXJyZW50IFB0ciA6IENoIzIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyX1BUUjEgICAgICAgICAgICAgICAgIDB4MTAwMDA0CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BM19QVFIxICAgICAgICAgICAgICAgICAweDEwMDAwOAkvLyBETUEgQ3VycmVudCBQdHIgOiBDaCMzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BM19QVFIxICAgICAgICAgICAgICAgICAweDEwMDAwOAkvKiBETUEgQ3VycmVudCBQdHIgOiBDaCMzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTRfUFRSMSAgICAgICAgICAgICAgICAgMHgxMDAwMEMJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjNAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTRfUFRSMSAgICAgICAgICAgICAgICAgMHgxMDAwMEMJLyogRE1BIEN1cnJlbnQgUHRyIDogQ2gjNCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE1X1BUUjEgICAgICAgICAgICAgICAgIDB4MTAwMDEwCS8vIERNQSBDdXJyZW50IFB0ciA6IENoIzUKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE1X1BUUjEgICAgICAgICAgICAgICAgIDB4MTAwMDEwCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzUgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BNl9QVFIxICAgICAgICAgICAgICAgICAweDEwMDAxNAkvLyBETUEgQ3VycmVudCBQdHIgOiBDaCM2CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BNl9QVFIxICAgICAgICAgICAgICAgICAweDEwMDAxNAkvKiBETUEgQ3VycmVudCBQdHIgOiBDaCM2ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTdfUFRSMSAgICAgICAgICAgICAgICAgMHgxMDAwMTgJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjNworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTdfUFRSMSAgICAgICAgICAgICAgICAgMHgxMDAwMTgJLyogRE1BIEN1cnJlbnQgUHRyIDogQ2gjNyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE4X1BUUjEgICAgICAgICAgICAgICAgIDB4MTAwMDFDCS8vIERNQSBDdXJyZW50IFB0ciA6IENoIzgKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE4X1BUUjEgICAgICAgICAgICAgICAgIDB4MTAwMDFDCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzggKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BOV9QVFIxICAgICAgICAgICAgICAgICAweDEwMDAyMAkvLyBETUEgQ3VycmVudCBQdHIgOiBDaCM5CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BOV9QVFIxICAgICAgICAgICAgICAgICAweDEwMDAyMAkvKiBETUEgQ3VycmVudCBQdHIgOiBDaCM5ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTEwX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwMjQJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExMF9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDI0CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzEwICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTExX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwMjgJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTEKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExMV9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDI4CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzExICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTEyX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwMkMJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExMl9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDJDCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzEyICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTEzX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwMzAJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExM19QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDMwCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzEzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE0X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwMzQJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExNF9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDM0CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzE0ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE1X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwMzgJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTUKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExNV9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDM4CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzE1ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE2X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwM0MJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTYKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExNl9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDNDCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzE2ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE3X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNDAJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTcKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExN19QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDQwCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzE3ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE4X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNDQJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTgKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExOF9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDQ0CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzE4ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE5X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNDgJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMTkKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExOV9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDQ4CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzE5ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIwX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNEMJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyMF9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDRDCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzIwICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIxX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNTAJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjEKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyMV9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDUwCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzIxICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIyX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNTQJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyMl9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDU0CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzIyICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIzX1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNTgJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyM19QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDU4CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzIzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTI0X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNUMJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyNF9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDVDCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzI0ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTI1X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNjAJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjUKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyNV9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDYwCS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzI1ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTI2X1BUUjEgICAgICAgICAgICAgICAgMHgxMDAwNjQJLy8gRE1BIEN1cnJlbnQgUHRyIDogQ2gjMjYKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyNl9QVFIxICAgICAgICAgICAgICAgIDB4MTAwMDY0CS8qIERNQSBDdXJyZW50IFB0ciA6IENoIzI2ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTFfUFRSMiAgICAgICAgICAgICAgICAgMHgxMDAwODAJLy8gRE1BIFRhYiBQdHIgOiBDaCMxCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMV9QVFIyICAgICAgICAgICAgICAgICAweDEwMDA4MAkvKiBETUEgVGFiIFB0ciA6IENoIzEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMl9QVFIyICAgICAgICAgICAgICAgICAweDEwMDA4NAkvLyBETUEgVGFiIFB0ciA6IENoIzIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyX1BUUjIgICAgICAgICAgICAgICAgIDB4MTAwMDg0CS8qIERNQSBUYWIgUHRyIDogQ2gjMiAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEzX1BUUjIgICAgICAgICAgICAgICAgIDB4MTAwMDg4CS8vIERNQSBUYWIgUHRyIDogQ2gjMworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTNfUFRSMiAgICAgICAgICAgICAgICAgMHgxMDAwODgJLyogRE1BIFRhYiBQdHIgOiBDaCMzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTRfUFRSMiAgICAgICAgICAgICAgICAgMHgxMDAwOEMJLy8gRE1BIFRhYiBQdHIgOiBDaCM0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BNF9QVFIyICAgICAgICAgICAgICAgICAweDEwMDA4QwkvKiBETUEgVGFiIFB0ciA6IENoIzQgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BNV9QVFIyICAgICAgICAgICAgICAgICAweDEwMDA5MAkvLyBETUEgVGFiIFB0ciA6IENoIzUKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE1X1BUUjIgICAgICAgICAgICAgICAgIDB4MTAwMDkwCS8qIERNQSBUYWIgUHRyIDogQ2gjNSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE2X1BUUjIgICAgICAgICAgICAgICAgIDB4MTAwMDk0CS8vIERNQSBUYWIgUHRyIDogQ2gjNgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTZfUFRSMiAgICAgICAgICAgICAgICAgMHgxMDAwOTQJLyogRE1BIFRhYiBQdHIgOiBDaCM2ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTdfUFRSMiAgICAgICAgICAgICAgICAgMHgxMDAwOTgJLy8gRE1BIFRhYiBQdHIgOiBDaCM3CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BN19QVFIyICAgICAgICAgICAgICAgICAweDEwMDA5OAkvKiBETUEgVGFiIFB0ciA6IENoIzcgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BOF9QVFIyICAgICAgICAgICAgICAgICAweDEwMDA5QwkvLyBETUEgVGFiIFB0ciA6IENoIzgKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE4X1BUUjIgICAgICAgICAgICAgICAgIDB4MTAwMDlDCS8qIERNQSBUYWIgUHRyIDogQ2gjOCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE5X1BUUjIgICAgICAgICAgICAgICAgIDB4MTAwMEEwCS8vIERNQSBUYWIgUHRyIDogQ2gjOQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTlfUFRSMiAgICAgICAgICAgICAgICAgMHgxMDAwQTAJLyogRE1BIFRhYiBQdHIgOiBDaCM5ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTEwX1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQTQJLy8gRE1BIFRhYiBQdHIgOiBDaCMxMAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTEwX1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQTQJLyogRE1BIFRhYiBQdHIgOiBDaCMxMCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUExMV9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEE4CS8vIERNQSBUYWIgUHRyIDogQ2gjMTEKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExMV9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEE4CS8qIERNQSBUYWIgUHRyIDogQ2gjMTEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTJfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBBQwkvLyBETUEgVGFiIFB0ciA6IENoIzEyCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMTJfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBBQwkvKiBETUEgVGFiIFB0ciA6IENoIzEyICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTEzX1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQjAJLy8gRE1BIFRhYiBQdHIgOiBDaCMxMworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTEzX1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQjAJLyogRE1BIFRhYiBQdHIgOiBDaCMxMyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUExNF9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEI0CS8vIERNQSBUYWIgUHRyIDogQ2gjMTQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExNF9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEI0CS8qIERNQSBUYWIgUHRyIDogQ2gjMTQgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTVfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBCOAkvLyBETUEgVGFiIFB0ciA6IENoIzE1CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMTVfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBCOAkvKiBETUEgVGFiIFB0ciA6IENoIzE1ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE2X1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQkMJLy8gRE1BIFRhYiBQdHIgOiBDaCMxNgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE2X1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQkMJLyogRE1BIFRhYiBQdHIgOiBDaCMxNiAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUExN19QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEMwCS8vIERNQSBUYWIgUHRyIDogQ2gjMTcKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExN19QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEMwCS8qIERNQSBUYWIgUHRyIDogQ2gjMTcgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMThfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBDNAkvLyBETUEgVGFiIFB0ciA6IENoIzE4CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMThfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBDNAkvKiBETUEgVGFiIFB0ciA6IENoIzE4ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE5X1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQzgJLy8gRE1BIFRhYiBQdHIgOiBDaCMxOQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE5X1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwQzgJLyogRE1BIFRhYiBQdHIgOiBDaCMxOSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyMF9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMENDCS8vIERNQSBUYWIgUHRyIDogQ2gjMjAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyMF9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMENDCS8qIERNQSBUYWIgUHRyIDogQ2gjMjAgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjFfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBEMAkvLyBETUEgVGFiIFB0ciA6IENoIzIxCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMjFfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBEMAkvKiBETUEgVGFiIFB0ciA6IENoIzIxICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIyX1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwRDQJLy8gRE1BIFRhYiBQdHIgOiBDaCMyMgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIyX1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwRDQJLyogRE1BIFRhYiBQdHIgOiBDaCMyMiAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyM19QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEQ4CS8vIERNQSBUYWIgUHRyIDogQ2gjMjMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyM19QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEQ4CS8qIERNQSBUYWIgUHRyIDogQ2gjMjMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjRfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBEQwkvLyBETUEgVGFiIFB0ciA6IENoIzI0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMjRfUFRSMiAgICAgICAgICAgICAgICAweDEwMDBEQwkvKiBETUEgVGFiIFB0ciA6IENoIzI0ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTI1X1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwRTAJLy8gRE1BIFRhYiBQdHIgOiBDaCMyNQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTI1X1BUUjIgICAgICAgICAgICAgICAgMHgxMDAwRTAJLyogRE1BIFRhYiBQdHIgOiBDaCMyNSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyNl9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEU0CS8vIERNQSBUYWIgUHRyIDogQ2gjMjYKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyNl9QVFIyICAgICAgICAgICAgICAgIDB4MTAwMEU0CS8qIERNQSBUYWIgUHRyIDogQ2gjMjYgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMV9DTlQxICAgICAgICAgICAgICAgICAweDEwMDEwMAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMV9DTlQxICAgICAgICAgICAgICAgICAweDEwMDEwMAkvKiBETUEgQnVGRmVyIFNpemUgOiBDaCMxICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTJfQ05UMSAgICAgICAgICAgICAgICAgMHgxMDAxMDQJLy8gRE1BIEJ1RkZlciBTaXplIDogQ2gjMgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTJfQ05UMSAgICAgICAgICAgICAgICAgMHgxMDAxMDQJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMiAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEzX0NOVDEgICAgICAgICAgICAgICAgIDB4MTAwMTA4CS8vIERNQSBCdUZGZXIgU2l6ZSA6IENoIzMKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEzX0NOVDEgICAgICAgICAgICAgICAgIDB4MTAwMTA4CS8qIERNQSBCdUZGZXIgU2l6ZSA6IENoIzMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BNF9DTlQxICAgICAgICAgICAgICAgICAweDEwMDEwQwkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCM0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BNF9DTlQxICAgICAgICAgICAgICAgICAweDEwMDEwQwkvKiBETUEgQnVGRmVyIFNpemUgOiBDaCM0ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTVfQ05UMSAgICAgICAgICAgICAgICAgMHgxMDAxMTAJLy8gRE1BIEJ1RkZlciBTaXplIDogQ2gjNQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTVfQ05UMSAgICAgICAgICAgICAgICAgMHgxMDAxMTAJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjNSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE2X0NOVDEgICAgICAgICAgICAgICAgIDB4MTAwMTE0CS8vIERNQSBCdUZGZXIgU2l6ZSA6IENoIzYKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE2X0NOVDEgICAgICAgICAgICAgICAgIDB4MTAwMTE0CS8qIERNQSBCdUZGZXIgU2l6ZSA6IENoIzYgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BN19DTlQxICAgICAgICAgICAgICAgICAweDEwMDExOAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCM3CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BN19DTlQxICAgICAgICAgICAgICAgICAweDEwMDExOAkvKiBETUEgQnVGRmVyIFNpemUgOiBDaCM3ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQThfQ05UMSAgICAgICAgICAgICAgICAgMHgxMDAxMUMJLy8gRE1BIEJ1RkZlciBTaXplIDogQ2gjOAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQThfQ05UMSAgICAgICAgICAgICAgICAgMHgxMDAxMUMJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjOCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE5X0NOVDEgICAgICAgICAgICAgICAgIDB4MTAwMTIwCS8vIERNQSBCdUZGZXIgU2l6ZSA6IENoIzkKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE5X0NOVDEgICAgICAgICAgICAgICAgIDB4MTAwMTIwCS8qIERNQSBCdUZGZXIgU2l6ZSA6IENoIzkgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTBfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEyNAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxMAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTEwX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxMjQJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTAgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTFfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEyOAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxMQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTExX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxMjgJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTJfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEyQwkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxMgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTEyX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxMkMJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTNfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEzMAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxMworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTEzX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxMzAJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTRfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEzNAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxNAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE0X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxMzQJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTQgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTVfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEzOAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxNQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE1X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxMzgJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTUgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTZfQ05UMSAgICAgICAgICAgICAgICAweDEwMDEzQwkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxNgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE2X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxM0MJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTYgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTdfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE0MAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxNworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE3X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNDAJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTcgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMThfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE0NAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxOAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE4X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNDQJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTggKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTlfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE0OAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMxOQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE5X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNDgJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMTkgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjBfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE0QwkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyMAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIwX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNEMJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjAgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjFfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE1MAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyMQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIxX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNTAJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjJfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE1NAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyMgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIyX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNTQJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjNfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE1OAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyMworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIzX0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNTgJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjRfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE1QwkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyNAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTI0X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNUMJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjQgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjVfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE2MAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyNQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTI1X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNjAJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjUgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjZfQ05UMSAgICAgICAgICAgICAgICAweDEwMDE2NAkvLyBETUEgQnVGRmVyIFNpemUgOiBDaCMyNgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTI2X0NOVDEgICAgICAgICAgICAgICAgMHgxMDAxNjQJLyogRE1BIEJ1RkZlciBTaXplIDogQ2gjMjYgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMV9DTlQyICAgICAgICAgICAgICAgICAweDEwMDE4MAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzEKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExX0NOVDIgICAgICAgICAgICAgICAgIDB4MTAwMTgwCS8qIERNQSBUYWJsZSBTaXplIDogQ2gjMSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyX0NOVDIgICAgICAgICAgICAgICAgIDB4MTAwMTg0CS8vIERNQSBUYWJsZSBTaXplIDogQ2gjMgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTJfQ05UMiAgICAgICAgICAgICAgICAgMHgxMDAxODQJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMyICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTNfQ05UMiAgICAgICAgICAgICAgICAgMHgxMDAxODgJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BM19DTlQyICAgICAgICAgICAgICAgICAweDEwMDE4OAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzMgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BNF9DTlQyICAgICAgICAgICAgICAgICAweDEwMDE4QwkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE0X0NOVDIgICAgICAgICAgICAgICAgIDB4MTAwMThDCS8qIERNQSBUYWJsZSBTaXplIDogQ2gjNCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE1X0NOVDIgICAgICAgICAgICAgICAgIDB4MTAwMTkwCS8vIERNQSBUYWJsZSBTaXplIDogQ2gjNQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTVfQ05UMiAgICAgICAgICAgICAgICAgMHgxMDAxOTAJLyogRE1BIFRhYmxlIFNpemUgOiBDaCM1ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTZfQ05UMiAgICAgICAgICAgICAgICAgMHgxMDAxOTQJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCM2CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BNl9DTlQyICAgICAgICAgICAgICAgICAweDEwMDE5NAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzYgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BN19DTlQyICAgICAgICAgICAgICAgICAweDEwMDE5OAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzcKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUE3X0NOVDIgICAgICAgICAgICAgICAgIDB4MTAwMTk4CS8qIERNQSBUYWJsZSBTaXplIDogQ2gjNyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUE4X0NOVDIgICAgICAgICAgICAgICAgIDB4MTAwMTlDCS8vIERNQSBUYWJsZSBTaXplIDogQ2gjOAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQThfQ05UMiAgICAgICAgICAgICAgICAgMHgxMDAxOUMJLyogRE1BIFRhYmxlIFNpemUgOiBDaCM4ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTlfQ05UMiAgICAgICAgICAgICAgICAgMHgxMDAxQTAJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCM5CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BOV9DTlQyICAgICAgICAgICAgICAgICAweDEwMDFBMAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzkgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTBfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFBNAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzEwCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMTBfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFBNAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzEwICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTExX0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQTgJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMxMQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTExX0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQTgJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMxMSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUExMl9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUFDCS8vIERNQSBUYWJsZSBTaXplIDogQ2gjMTIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExMl9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUFDCS8qIERNQSBUYWJsZSBTaXplIDogQ2gjMTIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTNfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFCMAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzEzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMTNfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFCMAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzEzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE0X0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQjQJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMxNAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE0X0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQjQJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMxNCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUExNV9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUI4CS8vIERNQSBUYWJsZSBTaXplIDogQ2gjMTUKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExNV9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUI4CS8qIERNQSBUYWJsZSBTaXplIDogQ2gjMTUgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTZfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFCQwkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzE2CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMTZfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFCQwkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzE2ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTE3X0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQzAJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMxNworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTE3X0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQzAJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMxNyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUExOF9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUM0CS8vIERNQSBUYWJsZSBTaXplIDogQ2gjMTgKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUExOF9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUM0CS8qIERNQSBUYWJsZSBTaXplIDogQ2gjMTggKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMTlfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFDOAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzE5CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMTlfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFDOAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzE5ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIwX0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQ0MJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMyMAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIwX0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxQ0MJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMyMCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyMV9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUQwCS8vIERNQSBUYWJsZSBTaXplIDogQ2gjMjEKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyMV9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMUQwCS8qIERNQSBUYWJsZSBTaXplIDogQ2gjMjEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjJfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFENAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzIyCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMjJfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFENAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzIyICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTIzX0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxRDgJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMyMworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTIzX0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxRDgJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMyMyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBETUEyNF9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMURDCS8vIERNQSBUYWJsZSBTaXplIDogQ2gjMjQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBETUEyNF9DTlQyICAgICAgICAgICAgICAgIDB4MTAwMURDCS8qIERNQSBUYWJsZSBTaXplIDogQ2gjMjQgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRE1BMjVfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFFMAkvLyBETUEgVGFibGUgU2l6ZSA6IENoIzI1CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgRE1BMjVfQ05UMiAgICAgICAgICAgICAgICAweDEwMDFFMAkvKiBETUEgVGFibGUgU2l6ZSA6IENoIzI1ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIERNQTI2X0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxRTQJLy8gRE1BIFRhYmxlIFNpemUgOiBDaCMyNgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIERNQTI2X0NOVDIgICAgICAgICAgICAgICAgMHgxMDAxRTQJLyogRE1BIFRhYmxlIFNpemUgOiBDaCMyNiAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gLy8gSVRHCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBUTV9DTlRfTERXICAgICAgICAgICAgICAgIDB4MTEwMDAwCS8vIFRpbWVyIDogQ291bnRlciBsb3cKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgLyogSVRHICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVE1fQ05UX0xEVyAgICAgICAgICAgICAgICAweDExMDAwMAkvKiBUaW1lciA6IENvdW50ZXIgbG93ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFRNX0NOVF9VVyAgICAgICAgICAgICAgICAgMHgxMTAwMDQJLy8gVGltZXIgOiBDb3VudGVyIGhpZ2ggd29yZAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFRNX0NOVF9VVyAgICAgICAgICAgICAgICAgMHgxMTAwMDQJLyogVGltZXIgOiBDb3VudGVyIGhpZ2ggd29yZCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBUTV9MTVRfTERXICAgICAgICAgICAgICAgIDB4MTEwMDA4CS8vIFRpbWVyIDogTGltaXQgbG93CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVE1fTE1UX0xEVyAgICAgICAgICAgICAgICAweDExMDAwOAkvKiBUaW1lciA6IExpbWl0IGxvdyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBUTV9MTVRfVVcgICAgICAgICAgICAgICAgIDB4MTEwMDBDCS8vIFRpbWVyIDogTGltaXQgaGlnaCB3b3JkCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVE1fTE1UX1VXICAgICAgICAgICAgICAgICAweDExMDAwQwkvKiBUaW1lciA6IExpbWl0IGhpZ2ggd29yZCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBHUDBfSU8gICAgICAgICAgICAgICAgICAgIDB4MTEwMDEwCS8vIEdQSU8gb3V0cHV0IGVuYWJsZXMgZGF0YSBJL08KLSNkZWZpbmUgIEZMRF9HUF9PRSAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAkvLyBHUElPOiBHUF9PRSBvdXRwdXQgZW5hYmxlCi0jZGVmaW5lICBGTERfR1BfSU4gICAgICAgICAgICAgICAgIDB4MDAwMEZGMDAJLy8gR1BJTzogR1BfSU4gc3RhdHVzCi0jZGVmaW5lICBGTERfR1BfT1VUICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYJLy8gR1BJTzogR1BfT1VUIGNvbnRyb2wKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBHUDBfSU8gICAgICAgICAgICAgICAgICAgIDB4MTEwMDEwCS8qIEdQSU8gb3V0cHV0IGVuYWJsZXMgZGF0YSBJL08gKi8KKyNkZWZpbmUgIEZMRF9HUF9PRSAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAkvKiBHUElPOiBHUF9PRSBvdXRwdXQgZW5hYmxlICovCisjZGVmaW5lICBGTERfR1BfSU4gICAgICAgICAgICAgICAgIDB4MDAwMEZGMDAJLyogR1BJTzogR1BfSU4gc3RhdHVzICovCisjZGVmaW5lICBGTERfR1BfT1VUICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYJLyogR1BJTzogR1BfT1VUIGNvbnRyb2wgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgR1BJT19JU00gICAgICAgICAgICAgICAgICAweDExMDAxNAkvLyBHUElPIGludGVycnVwdCBzZW5zaXRpdml0eSBtb2RlCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgR1BJT19JU00gICAgICAgICAgICAgICAgICAweDExMDAxNAkvKiBHUElPIGludGVycnVwdCBzZW5zaXRpdml0eSBtb2RlICovCiAjZGVmaW5lICBGTERfR1BfSVNNX1NOUyAgICAgICAgICAgIDB4MDAwMDAwNzAKICNkZWZpbmUgIEZMRF9HUF9JU01fUE9MICAgICAgICAgICAgMHgwMDAwMDAwNwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBTT0ZUX1JFU0VUICAgICAgICAgICAgICAgIDB4MTEwMDFDCS8vIE91dHB1dCBzeXN0ZW0gcmVzZXQgcmVnCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgU09GVF9SRVNFVCAgICAgICAgICAgICAgICAweDExMDAxQwkvKiBPdXRwdXQgc3lzdGVtIHJlc2V0IHJlZyAqLwogI2RlZmluZSAgRkxEX1BFQ09TX1NPRlRfUkVTRVQgICAgICAweDAwMDAwMDAxCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIE1DNDE2X1JXRCAgICAgICAgICAgICAgICAgMHgxMTAwMjAJLy8gTUM0MTYgR1BJT1sxODozXSBwaW4KLSNkZWZpbmUgIE1DNDE2X09FTiAgICAgICAgICAgICAgICAgMHgxMTAwMjQJLy8gT3V0cHV0IGVuYWJsZSBvZiBHUElPWzE4OjNdCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgTUM0MTZfUldEICAgICAgICAgICAgICAgICAweDExMDAyMAkvKiBNQzQxNiBHUElPWzE4OjNdIHBpbiAqLworI2RlZmluZSAgTUM0MTZfT0VOICAgICAgICAgICAgICAgICAweDExMDAyNAkvKiBPdXRwdXQgZW5hYmxlIG9mIEdQSU9bMTg6M10gKi8KICNkZWZpbmUgIE1DNDE2X0NUTCAgICAgICAgICAgICAgICAgMHgxMTAwMjgKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQUxUX1BJTl9PVVRfU0VMICAgICAgICAgICAweDExMDAyQwkvLyBBbHRlcm5hdGUgR1BJTyBvdXRwdXQgc2VsZWN0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgQUxUX1BJTl9PVVRfU0VMICAgICAgICAgICAweDExMDAyQwkvKiBBbHRlcm5hdGUgR1BJTyBvdXRwdXQgc2VsZWN0ICovCiAKICNkZWZpbmUgIEZMRF9BTFRfR1BJT19PVVRfU0VMICAgICAgMHhGMDAwMDAwMAotLy8gMCAgICAgICAgICBEaXNhYmxlZCA8LS0gZGVmYXVsdAotLy8gMSAgICAgICAgICBHUElPWzBdCi0vLyAyICAgICAgICAgIEdQSU9bMTBdCi0vLyAzICAgICAgICAgIFZJUF82NTZfREFUQV9WQUwKLS8vIDQgICAgICAgICAgVklQXzY1Nl9EQVRBWzBdCi0vLyA1ICAgICAgICAgIFZJUF82NTZfQ0xLCi0vLyA2ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMV0KLS8vIDcgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFswXQotLy8gOCAgICAgICAgICBBVFRfSUYKKy8qIDAgICAgICAgICAgRGlzYWJsZWQgPC0tIGRlZmF1bHQgKi8KKy8qIDEgICAgICAgICAgR1BJT1swXSAqLworLyogMiAgICAgICAgICBHUElPWzEwXSAqLworLyogMyAgICAgICAgICBWSVBfNjU2X0RBVEFfVkFMICovCisvKiA0ICAgICAgICAgIFZJUF82NTZfREFUQVswXSAqLworLyogNSAgICAgICAgICBWSVBfNjU2X0NMSyAqLworLyogNiAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzFdICovCisvKiA3ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMF0gKi8KKy8qIDggICAgICAgICAgQVRUX0lGICovCiAKICNkZWZpbmUgIEZMRF9BVVhfUExMX0NMS19BTFRfU0VMICAgMHgwRjAwMDAwMAotLy8gMCAgICAgICAgICBBVVhfUExMX0NMSzwtLSBkZWZhdWx0Ci0vLyAxICAgICAgICAgIEdQSU9bMl0KLS8vIDIgICAgICAgICAgR1BJT1sxMF0KLS8vIDMgICAgICAgICAgVklQXzY1Nl9EQVRBX1ZBTAotLy8gNCAgICAgICAgICBWSVBfNjU2X0RBVEFbMF0KLS8vIDUgICAgICAgICAgVklQXzY1Nl9DTEsKLS8vIDYgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFsxXQotLy8gNyAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzBdCisvKiAwICAgICAgICAgIEFVWF9QTExfQ0xLPC0tIGRlZmF1bHQgKi8KKy8qIDEgICAgICAgICAgR1BJT1syXSAqLworLyogMiAgICAgICAgICBHUElPWzEwXSAqLworLyogMyAgICAgICAgICBWSVBfNjU2X0RBVEFfVkFMICovCisvKiA0ICAgICAgICAgIFZJUF82NTZfREFUQVswXSAqLworLyogNSAgICAgICAgICBWSVBfNjU2X0NMSyAqLworLyogNiAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzFdICovCisvKiA3ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMF0gKi8KIAogI2RlZmluZSAgRkxEX0lSX1RYX0FMVF9TRUwgICAgICAgICAweDAwRjAwMDAwCi0vLyAwICAgICAgICAgIElSX1RYIDwtLSBkZWZhdWx0Ci0vLyAxICAgICAgICAgIEdQSU9bMV0KLS8vIDIgICAgICAgICAgR1BJT1sxMF0KLS8vIDMgICAgICAgICAgVklQXzY1Nl9EQVRBX1ZBTAotLy8gNCAgICAgICAgICBWSVBfNjU2X0RBVEFbMF0KLS8vIDUgICAgICAgICAgVklQXzY1Nl9DTEsKLS8vIDYgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFsxXQotLy8gNyAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzBdCisvKiAwICAgICAgICAgIElSX1RYIDwtLSBkZWZhdWx0ICovCisvKiAxICAgICAgICAgIEdQSU9bMV0gKi8KKy8qIDIgICAgICAgICAgR1BJT1sxMF0gKi8KKy8qIDMgICAgICAgICAgVklQXzY1Nl9EQVRBX1ZBTCAqLworLyogNCAgICAgICAgICBWSVBfNjU2X0RBVEFbMF0gKi8KKy8qIDUgICAgICAgICAgVklQXzY1Nl9DTEsgKi8KKy8qIDYgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFsxXSAqLworLyogNyAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzBdICovCiAKICNkZWZpbmUgIEZMRF9JUl9SWF9BTFRfU0VMICAgICAgICAgMHgwMDBGMDAwMAotLy8gMCAgICAgICAgICBJUl9SWCA8LS0gZGVmYXVsdAotLy8gMSAgICAgICAgICBHUElPWzBdCi0vLyAyICAgICAgICAgIEdQSU9bMTBdCi0vLyAzICAgICAgICAgIFZJUF82NTZfREFUQV9WQUwKLS8vIDQgICAgICAgICAgVklQXzY1Nl9EQVRBWzBdCi0vLyA1ICAgICAgICAgIFZJUF82NTZfQ0xLCi0vLyA2ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMV0KLS8vIDcgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFswXQorLyogMCAgICAgICAgICBJUl9SWCA8LS0gZGVmYXVsdCAqLworLyogMSAgICAgICAgICBHUElPWzBdICovCisvKiAyICAgICAgICAgIEdQSU9bMTBdICovCisvKiAzICAgICAgICAgIFZJUF82NTZfREFUQV9WQUwgKi8KKy8qIDQgICAgICAgICAgVklQXzY1Nl9EQVRBWzBdICovCisvKiA1ICAgICAgICAgIFZJUF82NTZfQ0xLICovCisvKiA2ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMV0gKi8KKy8qIDcgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFswXSAqLwogCiAjZGVmaW5lICBGTERfR1BJTzEwX0FMVF9TRUwgICAgICAgIDB4MDAwMEYwMDAKLS8vIDAgICAgICAgICAgR1BJT1sxMF0gPC0tIGRlZmF1bHQKLS8vIDEgICAgICAgICAgR1BJT1swXQotLy8gMiAgICAgICAgICBHUElPWzEwXQotLy8gMyAgICAgICAgICBWSVBfNjU2X0RBVEFfVkFMCi0vLyA0ICAgICAgICAgIFZJUF82NTZfREFUQVswXQotLy8gNSAgICAgICAgICBWSVBfNjU2X0NMSwotLy8gNiAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzFdCi0vLyA3ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMF0KKy8qIDAgICAgICAgICAgR1BJT1sxMF0gPC0tIGRlZmF1bHQgKi8KKy8qIDEgICAgICAgICAgR1BJT1swXSAqLworLyogMiAgICAgICAgICBHUElPWzEwXSAqLworLyogMyAgICAgICAgICBWSVBfNjU2X0RBVEFfVkFMICovCisvKiA0ICAgICAgICAgIFZJUF82NTZfREFUQVswXSAqLworLyogNSAgICAgICAgICBWSVBfNjU2X0NMSyAqLworLyogNiAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzFdICovCisvKiA3ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMF0gKi8KIAogI2RlZmluZSAgRkxEX0dQSU8yX0FMVF9TRUwgICAgICAgICAweDAwMDAwRjAwCi0vLyAwICAgICAgICAgIEdQSU9bMl0gPC0tIGRlZmF1bHQKLS8vIDEgICAgICAgICAgR1BJT1sxXQotLy8gMiAgICAgICAgICBHUElPWzEwXQotLy8gMyAgICAgICAgICBWSVBfNjU2X0RBVEFfVkFMCi0vLyA0ICAgICAgICAgIFZJUF82NTZfREFUQVswXQotLy8gNSAgICAgICAgICBWSVBfNjU2X0NMSwotLy8gNiAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzFdCi0vLyA3ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMF0KKy8qIDAgICAgICAgICAgR1BJT1syXSA8LS0gZGVmYXVsdCAqLworLyogMSAgICAgICAgICBHUElPWzFdICovCisvKiAyICAgICAgICAgIEdQSU9bMTBdICovCisvKiAzICAgICAgICAgIFZJUF82NTZfREFUQV9WQUwgKi8KKy8qIDQgICAgICAgICAgVklQXzY1Nl9EQVRBWzBdICovCisvKiA1ICAgICAgICAgIFZJUF82NTZfQ0xLICovCisvKiA2ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMV0gKi8KKy8qIDcgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFswXSAqLwogCiAjZGVmaW5lICBGTERfR1BJTzFfQUxUX1NFTCAgICAgICAgIDB4MDAwMDAwRjAKLS8vIDAgICAgICAgICAgR1BJT1sxXSA8LS0gZGVmYXVsdAotLy8gMSAgICAgICAgICBHUElPWzBdCi0vLyAyICAgICAgICAgIEdQSU9bMTBdCi0vLyAzICAgICAgICAgIFZJUF82NTZfREFUQV9WQUwKLS8vIDQgICAgICAgICAgVklQXzY1Nl9EQVRBWzBdCi0vLyA1ICAgICAgICAgIFZJUF82NTZfQ0xLCi0vLyA2ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMV0KLS8vIDcgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFswXQorLyogMCAgICAgICAgICBHUElPWzFdIDwtLSBkZWZhdWx0ICovCisvKiAxICAgICAgICAgIEdQSU9bMF0gKi8KKy8qIDIgICAgICAgICAgR1BJT1sxMF0gKi8KKy8qIDMgICAgICAgICAgVklQXzY1Nl9EQVRBX1ZBTCAqLworLyogNCAgICAgICAgICBWSVBfNjU2X0RBVEFbMF0gKi8KKy8qIDUgICAgICAgICAgVklQXzY1Nl9DTEsgKi8KKy8qIDYgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFsxXSAqLworLyogNyAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzBdICovCiAKICNkZWZpbmUgIEZMRF9HUElPMF9BTFRfU0VMICAgICAgICAgMHgwMDAwMDAwRgotLy8gMCAgICAgICAgICBHUElPWzBdIDwtLSBkZWZhdWx0Ci0vLyAxICAgICAgICAgIEdQSU9bMV0KLS8vIDIgICAgICAgICAgR1BJT1sxMF0KLS8vIDMgICAgICAgICAgVklQXzY1Nl9EQVRBX1ZBTAotLy8gNCAgICAgICAgICBWSVBfNjU2X0RBVEFbMF0KLS8vIDUgICAgICAgICAgVklQXzY1Nl9DTEsKLS8vIDYgICAgICAgICAgVklQXzY1Nl9EQVRBX0VYVFsxXQotLy8gNyAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzBdCisvKiAwICAgICAgICAgIEdQSU9bMF0gPC0tIGRlZmF1bHQgKi8KKy8qIDEgICAgICAgICAgR1BJT1sxXSAqLworLyogMiAgICAgICAgICBHUElPWzEwXSAqLworLyogMyAgICAgICAgICBWSVBfNjU2X0RBVEFfVkFMICovCisvKiA0ICAgICAgICAgIFZJUF82NTZfREFUQVswXSAqLworLyogNSAgICAgICAgICBWSVBfNjU2X0NMSyAqLworLyogNiAgICAgICAgICBWSVBfNjU2X0RBVEFfRVhUWzFdICovCisvKiA3ICAgICAgICAgIFZJUF82NTZfREFUQV9FWFRbMF0gKi8KIAotI2RlZmluZSAgQUxUX1BJTl9JTl9TRUwgICAgICAgICAgICAweDExMDAzMAkvLyBBbHRlcm5hdGUgR1BJTyBpbnB1dCBzZWxlY3QKKyNkZWZpbmUgIEFMVF9QSU5fSU5fU0VMICAgICAgICAgICAgMHgxMTAwMzAJLyogQWx0ZXJuYXRlIEdQSU8gaW5wdXQgc2VsZWN0ICovCiAKICNkZWZpbmUgIEZMRF9HUElPMTBfQUxUX0lOX1NFTCAgICAgMHgwMDAwRjAwMAotLy8gMCAgICAgICAgICBHUElPWzEwXSA8LS0gZGVmYXVsdAotLy8gMSAgICAgICAgICBJUl9SWAotLy8gMiAgICAgICAgICBJUl9UWAotLy8gMyAgICAgICAgICBBVVhfUExMX0NMSwotLy8gNCAgICAgICAgICBJRl9BVFRfU0VMCi0vLyA1ICAgICAgICAgIEdQSU9bMF0KLS8vIDYgICAgICAgICAgR1BJT1sxXQotLy8gNyAgICAgICAgICBHUElPWzJdCisvKiAwICAgICAgICAgIEdQSU9bMTBdIDwtLSBkZWZhdWx0ICovCisvKiAxICAgICAgICAgIElSX1JYICovCisvKiAyICAgICAgICAgIElSX1RYICovCisvKiAzICAgICAgICAgIEFVWF9QTExfQ0xLICovCisvKiA0ICAgICAgICAgIElGX0FUVF9TRUwgKi8KKy8qIDUgICAgICAgICAgR1BJT1swXSAqLworLyogNiAgICAgICAgICBHUElPWzFdICovCisvKiA3ICAgICAgICAgIEdQSU9bMl0gKi8KIAogI2RlZmluZSAgRkxEX0dQSU8yX0FMVF9JTl9TRUwgICAgICAweDAwMDAwRjAwCi0vLyAwICAgICAgICAgIEdQSU9bMl0gPC0tIGRlZmF1bHQKLS8vIDEgICAgICAgICAgSVJfUlgKLS8vIDIgICAgICAgICAgSVJfVFgKLS8vIDMgICAgICAgICAgQVVYX1BMTF9DTEsKLS8vIDQgICAgICAgICAgSUZfQVRUX1NFTAorLyogMCAgICAgICAgICBHUElPWzJdIDwtLSBkZWZhdWx0ICovCisvKiAxICAgICAgICAgIElSX1JYICovCisvKiAyICAgICAgICAgIElSX1RYICovCisvKiAzICAgICAgICAgIEFVWF9QTExfQ0xLICovCisvKiA0ICAgICAgICAgIElGX0FUVF9TRUwgKi8KIAogI2RlZmluZSAgRkxEX0dQSU8xX0FMVF9JTl9TRUwgICAgICAweDAwMDAwMEYwCi0vLyAwICAgICAgICAgIEdQSU9bMV0gPC0tIGRlZmF1bHQKLS8vIDEgICAgICAgICAgSVJfUlgKLS8vIDIgICAgICAgICAgSVJfVFgKLS8vIDMgICAgICAgICAgQVVYX1BMTF9DTEsKLS8vIDQgICAgICAgICAgSUZfQVRUX1NFTAorLyogMCAgICAgICAgICBHUElPWzFdIDwtLSBkZWZhdWx0ICovCisvKiAxICAgICAgICAgIElSX1JYICovCisvKiAyICAgICAgICAgIElSX1RYICovCisvKiAzICAgICAgICAgIEFVWF9QTExfQ0xLICovCisvKiA0ICAgICAgICAgIElGX0FUVF9TRUwgKi8KIAogI2RlZmluZSAgRkxEX0dQSU8wX0FMVF9JTl9TRUwgICAgICAweDAwMDAwMDBGCi0vLyAwICAgICAgICAgIEdQSU9bMF0gPC0tIGRlZmF1bHQKLS8vIDEgICAgICAgICAgSVJfUlgKLS8vIDIgICAgICAgICAgSVJfVFgKLS8vIDMgICAgICAgICAgQVVYX1BMTF9DTEsKLS8vIDQgICAgICAgICAgSUZfQVRUX1NFTAorLyogMCAgICAgICAgICBHUElPWzBdIDwtLSBkZWZhdWx0ICovCisvKiAxICAgICAgICAgIElSX1JYICovCisvKiAyICAgICAgICAgIElSX1RYICovCisvKiAzICAgICAgICAgIEFVWF9QTExfQ0xLICovCisvKiA0ICAgICAgICAgIElGX0FUVF9TRUwgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVEVTVF9CVVNfQ1RMMSAgICAgICAgICAgICAweDExMDA0MAkvLyBUZXN0IGJ1cyBjb250cm9sIHJlZ2lzdGVyICMxCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVEVTVF9CVVNfQ1RMMSAgICAgICAgICAgICAweDExMDA0MAkvKiBUZXN0IGJ1cyBjb250cm9sIHJlZ2lzdGVyICMxICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFRFU1RfQlVTX0NUTDIgICAgICAgICAgICAgMHgxMTAwNDQJLy8gVGVzdCBidXMgY29udHJvbCByZWdpc3RlciAjMgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFRFU1RfQlVTX0NUTDIgICAgICAgICAgICAgMHgxMTAwNDQJLyogVGVzdCBidXMgY29udHJvbCByZWdpc3RlciAjMiAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBDTEtfREVMQVkgICAgICAgICAgICAgICAgIDB4MTEwMDQ4CS8vIENsb2NrIGRlbGF5Ci0jZGVmaW5lICBGTERfTU9FX0NMS19ESVMgICAgICAgICAgIDB4ODAwMDAwMDAJLy8gRGlzYWJsZSBNb0UgY2xvY2sKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBDTEtfREVMQVkgICAgICAgICAgICAgICAgIDB4MTEwMDQ4CS8qIENsb2NrIGRlbGF5ICovCisjZGVmaW5lICBGTERfTU9FX0NMS19ESVMgICAgICAgICAgIDB4ODAwMDAwMDAJLyogRGlzYWJsZSBNb0UgY2xvY2sgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgUEFEX0NUUkwgICAgICAgICAgICAgICAgICAweDExMDA2OAkvLyBQYWQgZHJpdmUgc3RyZW5ndGggY29udHJvbAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFBBRF9DVFJMICAgICAgICAgICAgICAgICAgMHgxMTAwNjgJLyogUGFkIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgTUJJU1RfQ1RSTCAgICAgICAgICAgICAgICAweDExMDA1MAkvLyBTUkFNIG1lbW9yeSBidWlsdC1pbiBzZWxmIHRlc3QgY29udHJvbAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIE1CSVNUX0NUUkwgICAgICAgICAgICAgICAgMHgxMTAwNTAJLyogU1JBTSBtZW1vcnkgYnVpbHQtaW4gc2VsZiB0ZXN0IGNvbnRyb2wgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgTUJJU1RfU1RBVCAgICAgICAgICAgICAgICAweDExMDA1NAkvLyBTUkFNIG1lbW9yeSBidWlsdC1pbiBzZWxmIHRlc3Qgc3RhdHVzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgTUJJU1RfU1RBVCAgICAgICAgICAgICAgICAweDExMDA1NAkvKiBTUkFNIG1lbW9yeSBidWlsdC1pbiBzZWxmIHRlc3Qgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFBMTCByZWdpc3RlcnMKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBQTEwgcmVnaXN0ZXJzICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogI2RlZmluZSAgUExMX0FfSU5UX0ZSQUMgICAgICAgICAgICAweDExMDA4OAogI2RlZmluZSAgUExMX0FfUE9TVF9TVEFUX0JJU1QgICAgICAweDExMDA4QwogI2RlZmluZSAgUExMX0JfSU5UX0ZSQUMgICAgICAgICAgICAweDExMDA5MApAQCAtMTA5MCwyNjAgKzEwOTAsMjYwIEBACiAjZGVmaW5lICBWSURfQ0hfTU9ERV9TRUwgICAgICAgICAgIDB4MTEwMDc4CiAjZGVmaW5lICBWSURfQ0hfQ0xLX1NFTCAgICAgICAgICAgIDB4MTEwMDdDCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZCSV9BX0RNQSAgICAgICAgICAgICAgICAgMHgxMzAwMDgJLy8gVkJJIEEgRE1BIGRhdGEgcG9ydAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZCSV9BX0RNQSAgICAgICAgICAgICAgICAgMHgxMzAwMDgJLyogVkJJIEEgRE1BIGRhdGEgcG9ydCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfQV9WSVBfQ1RMICAgICAgICAgICAgIDB4MTMwMDgwCS8vIFZpZGVvIEEgVklQIGZvcm1hdCBjb250cm9sCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVklEX0FfVklQX0NUTCAgICAgICAgICAgICAweDEzMDA4MAkvKiBWaWRlbyBBIFZJUCBmb3JtYXQgY29udHJvbCAqLwogI2RlZmluZSAgRkxEX1ZJUF9NT0RFICAgICAgICAgICAgICAweDAwMDAwMDAxCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZJRF9BX1BJWEVMX0ZSTVQgICAgICAgICAgMHgxMzAwODQJLy8gVmlkZW8gQSBwaXhlbCBmb3JtYXQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfQV9QSVhFTF9GUk1UICAgICAgICAgIDB4MTMwMDg0CS8qIFZpZGVvIEEgcGl4ZWwgZm9ybWF0ICovCiAjZGVmaW5lICBGTERfVklEX0FfR0FNTUFfRElTICAgICAgIDB4MDAwMDAwMDgKICNkZWZpbmUgIEZMRF9WSURfQV9GT1JNQVQgICAgICAgICAgMHgwMDAwMDAwNwogI2RlZmluZSAgRkxEX1ZJRF9BX0dBTU1BX0ZBQ1RPUiAgICAweDAwMDAwMDEwCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZJRF9BX1ZCSV9DVEwgICAgICAgICAgICAgMHgxMzAwODgJLy8gVmlkZW8gQSBWQkkgbWlzY2VsbGFuZW91cyBjb250cm9sCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVklEX0FfVkJJX0NUTCAgICAgICAgICAgICAweDEzMDA4OAkvKiBWaWRlbyBBIFZCSSBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgKi8KICNkZWZpbmUgIEZMRF9WSURfQV9WSVBfRVhUICAgICAgICAgMHgwMDAwMDAwMwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfQl9ETUEgICAgICAgICAgICAgICAgIDB4MTMwMTAwCS8vIFZpZGVvIEIgRE1BIGRhdGEgcG9ydAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9CX0RNQSAgICAgICAgICAgICAgICAgMHgxMzAxMDAJLyogVmlkZW8gQiBETUEgZGF0YSBwb3J0ICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFZCSV9CX0RNQSAgICAgICAgICAgICAgICAgMHgxMzAxMDgJLy8gVkJJIEIgRE1BIGRhdGEgcG9ydAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZCSV9CX0RNQSAgICAgICAgICAgICAgICAgMHgxMzAxMDgJLyogVkJJIEIgRE1BIGRhdGEgcG9ydCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfQl9TUkNfU0VMICAgICAgICAgICAgIDB4MTMwMTQ0CS8vIFZpZGVvIEIgc291cmNlIHNlbGVjdAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9CX1NSQ19TRUwgICAgICAgICAgICAgMHgxMzAxNDQJLyogVmlkZW8gQiBzb3VyY2Ugc2VsZWN0ICovCiAjZGVmaW5lICBGTERfVklEX0JfU1JDX1NFTCAgICAgICAgIDB4MDAwMDAwMDAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0JfTE5HVEggICAgICAgICAgICAgICAweDEzMDE1MAkvLyBWaWRlbyBCIGxpbmUgbGVuZ3RoCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgVklEX0JfTE5HVEggICAgICAgICAgICAgICAweDEzMDE1MAkvKiBWaWRlbyBCIGxpbmUgbGVuZ3RoICovCiAjZGVmaW5lICBGTERfVklEX0JfTE5fTE5HVEggICAgICAgIDB4MDAwMDBGRkYKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0JfVklQX0NUTCAgICAgICAgICAgICAweDEzMDE4MAkvLyBWaWRlbyBCIFZJUCBmb3JtYXQgY29udHJvbAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9CX1ZJUF9DVEwgICAgICAgICAgICAgMHgxMzAxODAJLyogVmlkZW8gQiBWSVAgZm9ybWF0IGNvbnRyb2wgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0JfUElYRUxfRlJNVCAgICAgICAgICAweDEzMDE4NAkvLyBWaWRlbyBCIHBpeGVsIGZvcm1hdAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFZJRF9CX1BJWEVMX0ZSTVQgICAgICAgICAgMHgxMzAxODQJLyogVmlkZW8gQiBwaXhlbCBmb3JtYXQgKi8KICNkZWZpbmUgIEZMRF9WSURfQl9HQU1NQV9ESVMgICAgICAgMHgwMDAwMDAwOAogI2RlZmluZSAgRkxEX1ZJRF9CX0ZPUk1BVCAgICAgICAgICAweDAwMDAwMDA3CiAjZGVmaW5lICBGTERfVklEX0JfR0FNTUFfRkFDVE9SICAgIDB4MDAwMDAwMTAKIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVklEX0NfRE1BICAgICAgICAgICAgICAgICAweDEzMDIwMAkvLyBWaWRlbyBDIERNQSBkYXRhIHBvcnQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfQ19ETUEgICAgICAgICAgICAgICAgIDB4MTMwMjAwCS8qIFZpZGVvIEMgRE1BIGRhdGEgcG9ydCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBWSURfQ19MTkdUSCAgICAgICAgICAgICAgIDB4MTMwMjUwCS8vIFZpZGVvIEMgbGluZSBsZW5ndGgKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBWSURfQ19MTkdUSCAgICAgICAgICAgICAgIDB4MTMwMjUwCS8qIFZpZGVvIEMgbGluZSBsZW5ndGggKi8KICNkZWZpbmUgIEZMRF9WSURfQ19MTl9MTkdUSCAgICAgICAgMHgwMDAwMEZGRgogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBWaWRlbyBEZXN0aW5hdGlvbiBDaGFubmVscwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFZpZGVvIERlc3RpbmF0aW9uIENoYW5uZWxzICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0jZGVmaW5lICBWSURfRFNUX0FfR1BDTlQgICAgICAgICAgIDB4MTMwMDIwCS8vIFZpZGVvIEEgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKLSNkZWZpbmUgIFZJRF9EU1RfQl9HUENOVCAgICAgICAgICAgMHgxMzAxMjAJLy8gVmlkZW8gQiBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgotI2RlZmluZSAgVklEX0RTVF9DX0dQQ05UICAgICAgICAgICAweDEzMDIyMAkvLyBWaWRlbyBDIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyCi0jZGVmaW5lICBWSURfRFNUX0RfR1BDTlQgICAgICAgICAgIDB4MTMwMzIwCS8vIFZpZGVvIEQgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKLSNkZWZpbmUgIFZJRF9EU1RfRV9HUENOVCAgICAgICAgICAgMHgxMzA0MjAJLy8gVmlkZW8gRSBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgotI2RlZmluZSAgVklEX0RTVF9GX0dQQ05UICAgICAgICAgICAweDEzMDUyMAkvLyBWaWRlbyBGIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyCi0jZGVmaW5lICBWSURfRFNUX0dfR1BDTlQgICAgICAgICAgIDB4MTMwNjIwCS8vIFZpZGVvIEcgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKLSNkZWZpbmUgIFZJRF9EU1RfSF9HUENOVCAgICAgICAgICAgMHgxMzA3MjAJLy8gVmlkZW8gSCBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSAgVklEX0RTVF9BX0dQQ05UICAgICAgICAgICAweDEzMDAyMAkvKiBWaWRlbyBBIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyICovCisjZGVmaW5lICBWSURfRFNUX0JfR1BDTlQgICAgICAgICAgIDB4MTMwMTIwCS8qIFZpZGVvIEIgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KKyNkZWZpbmUgIFZJRF9EU1RfQ19HUENOVCAgICAgICAgICAgMHgxMzAyMjAJLyogVmlkZW8gQyBnZW5lcmFsIHB1cnBvc2UgY291bnRlciAqLworI2RlZmluZSAgVklEX0RTVF9EX0dQQ05UICAgICAgICAgICAweDEzMDMyMAkvKiBWaWRlbyBEIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyICovCisjZGVmaW5lICBWSURfRFNUX0VfR1BDTlQgICAgICAgICAgIDB4MTMwNDIwCS8qIFZpZGVvIEUgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KKyNkZWZpbmUgIFZJRF9EU1RfRl9HUENOVCAgICAgICAgICAgMHgxMzA1MjAJLyogVmlkZW8gRiBnZW5lcmFsIHB1cnBvc2UgY291bnRlciAqLworI2RlZmluZSAgVklEX0RTVF9HX0dQQ05UICAgICAgICAgICAweDEzMDYyMAkvKiBWaWRlbyBHIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyICovCisjZGVmaW5lICBWSURfRFNUX0hfR1BDTlQgICAgICAgICAgIDB4MTMwNzIwCS8qIFZpZGVvIEggZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotI2RlZmluZSAgVklEX0RTVF9BX0dQQ05UX0NUTCAgICAgICAweDEzMDAzMAkvLyBWaWRlbyBBIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0JfR1BDTlRfQ1RMICAgICAgIDB4MTMwMTMwCS8vIFZpZGVvIEIgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfQ19HUENOVF9DVEwgICAgICAgMHgxMzAyMzAJLy8gVmlkZW8gQyBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9EX0dQQ05UX0NUTCAgICAgICAweDEzMDMzMAkvLyBWaWRlbyBEIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0VfR1BDTlRfQ1RMICAgICAgIDB4MTMwNDMwCS8vIFZpZGVvIEUgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfRl9HUENOVF9DVEwgICAgICAgMHgxMzA1MzAJLy8gVmlkZW8gRiBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9HX0dQQ05UX0NUTCAgICAgICAweDEzMDYzMAkvLyBWaWRlbyBHIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0hfR1BDTlRfQ1RMICAgICAgIDB4MTMwNzMwCS8vIFZpZGVvIEggZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKKyNkZWZpbmUgIFZJRF9EU1RfQV9HUENOVF9DVEwgICAgICAgMHgxMzAwMzAJLyogVmlkZW8gQSBnZW5lcmFsIHB1cnBvc2UgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9CX0dQQ05UX0NUTCAgICAgICAweDEzMDEzMAkvKiBWaWRlbyBCIGdlbmVyYWwgcHVycG9zZSBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0NfR1BDTlRfQ1RMICAgICAgIDB4MTMwMjMwCS8qIFZpZGVvIEMgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfRF9HUENOVF9DVEwgICAgICAgMHgxMzAzMzAJLyogVmlkZW8gRCBnZW5lcmFsIHB1cnBvc2UgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9FX0dQQ05UX0NUTCAgICAgICAweDEzMDQzMAkvKiBWaWRlbyBFIGdlbmVyYWwgcHVycG9zZSBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0ZfR1BDTlRfQ1RMICAgICAgIDB4MTMwNTMwCS8qIFZpZGVvIEYgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfR19HUENOVF9DVEwgICAgICAgMHgxMzA2MzAJLyogVmlkZW8gRyBnZW5lcmFsIHB1cnBvc2UgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9IX0dQQ05UX0NUTCAgICAgICAweDEzMDczMAkvKiBWaWRlbyBIIGdlbmVyYWwgcHVycG9zZSBjb250cm9sICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLSNkZWZpbmUgIFZJRF9EU1RfQV9ETUFfQ1RMICAgICAgICAgMHgxMzAwNDAJLy8gVmlkZW8gQSBETUEgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9CX0RNQV9DVEwgICAgICAgICAweDEzMDE0MAkvLyBWaWRlbyBCIERNQSBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0NfRE1BX0NUTCAgICAgICAgIDB4MTMwMjQwCS8vIFZpZGVvIEMgRE1BIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfRF9ETUFfQ1RMICAgICAgICAgMHgxMzAzNDAJLy8gVmlkZW8gRCBETUEgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9FX0RNQV9DVEwgICAgICAgICAweDEzMDQ0MAkvLyBWaWRlbyBFIERNQSBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0ZfRE1BX0NUTCAgICAgICAgIDB4MTMwNTQwCS8vIFZpZGVvIEYgRE1BIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfR19ETUFfQ1RMICAgICAgICAgMHgxMzA2NDAJLy8gVmlkZW8gRyBETUEgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9IX0RNQV9DVEwgICAgICAgICAweDEzMDc0MAkvLyBWaWRlbyBIIERNQSBjb250cm9sCisjZGVmaW5lICBWSURfRFNUX0FfRE1BX0NUTCAgICAgICAgIDB4MTMwMDQwCS8qIFZpZGVvIEEgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfQl9ETUFfQ1RMICAgICAgICAgMHgxMzAxNDAJLyogVmlkZW8gQiBETUEgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9DX0RNQV9DVEwgICAgICAgICAweDEzMDI0MAkvKiBWaWRlbyBDIERNQSBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0RfRE1BX0NUTCAgICAgICAgIDB4MTMwMzQwCS8qIFZpZGVvIEQgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfRV9ETUFfQ1RMICAgICAgICAgMHgxMzA0NDAJLyogVmlkZW8gRSBETUEgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9GX0RNQV9DVEwgICAgICAgICAweDEzMDU0MAkvKiBWaWRlbyBGIERNQSBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0dfRE1BX0NUTCAgICAgICAgIDB4MTMwNjQwCS8qIFZpZGVvIEcgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfSF9ETUFfQ1RMICAgICAgICAgMHgxMzA3NDAJLyogVmlkZW8gSCBETUEgY29udHJvbCAqLwogCiAjZGVmaW5lICBGTERfVklEX1JJU0NfRU4gICAgICAgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgIEZMRF9WSURfRklGT19FTiAgICAgICAgICAgMHgwMDAwMDAwMQogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0jZGVmaW5lICBWSURfRFNUX0FfVklQX0NUTCAgICAgICAgIDB4MTMwMDgwCS8vIFZpZGVvIEEgVklQIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfQl9WSVBfQ1RMICAgICAgICAgMHgxMzAxODAJLy8gVmlkZW8gQiBWSVAgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9DX1ZJUF9DVEwgICAgICAgICAweDEzMDI4MAkvLyBWaWRlbyBDIFZJUCBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0RfVklQX0NUTCAgICAgICAgIDB4MTMwMzgwCS8vIFZpZGVvIEQgVklQIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfRV9WSVBfQ1RMICAgICAgICAgMHgxMzA0ODAJLy8gVmlkZW8gRSBWSVAgY29udHJvbAotI2RlZmluZSAgVklEX0RTVF9GX1ZJUF9DVEwgICAgICAgICAweDEzMDU4MAkvLyBWaWRlbyBGIFZJUCBjb250cm9sCi0jZGVmaW5lICBWSURfRFNUX0dfVklQX0NUTCAgICAgICAgIDB4MTMwNjgwCS8vIFZpZGVvIEcgVklQIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9EU1RfSF9WSVBfQ1RMICAgICAgICAgMHgxMzA3ODAJLy8gVmlkZW8gSCBWSVAgY29udHJvbAorI2RlZmluZSAgVklEX0RTVF9BX1ZJUF9DVEwgICAgICAgICAweDEzMDA4MAkvKiBWaWRlbyBBIFZJUCBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0JfVklQX0NUTCAgICAgICAgIDB4MTMwMTgwCS8qIFZpZGVvIEIgVklQIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfQ19WSVBfQ1RMICAgICAgICAgMHgxMzAyODAJLyogVmlkZW8gQyBWSVAgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9EX1ZJUF9DVEwgICAgICAgICAweDEzMDM4MAkvKiBWaWRlbyBEIFZJUCBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0VfVklQX0NUTCAgICAgICAgIDB4MTMwNDgwCS8qIFZpZGVvIEUgVklQIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9EU1RfRl9WSVBfQ1RMICAgICAgICAgMHgxMzA1ODAJLyogVmlkZW8gRiBWSVAgY29udHJvbCAqLworI2RlZmluZSAgVklEX0RTVF9HX1ZJUF9DVEwgICAgICAgICAweDEzMDY4MAkvKiBWaWRlbyBHIFZJUCBjb250cm9sICovCisjZGVmaW5lICBWSURfRFNUX0hfVklQX0NUTCAgICAgICAgIDB4MTMwNzgwCS8qIFZpZGVvIEggVklQIGNvbnRyb2wgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotI2RlZmluZSAgVklEX0RTVF9BX1BJWF9GUk1UICAgICAgICAweDEzMDA4NAkvLyBWaWRlbyBBIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9CX1BJWF9GUk1UICAgICAgICAweDEzMDE4NAkvLyBWaWRlbyBCIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9DX1BJWF9GUk1UICAgICAgICAweDEzMDI4NAkvLyBWaWRlbyBDIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9EX1BJWF9GUk1UICAgICAgICAweDEzMDM4NAkvLyBWaWRlbyBEIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9FX1BJWF9GUk1UICAgICAgICAweDEzMDQ4NAkvLyBWaWRlbyBFIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9GX1BJWF9GUk1UICAgICAgICAweDEzMDU4NAkvLyBWaWRlbyBGIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9HX1BJWF9GUk1UICAgICAgICAweDEzMDY4NAkvLyBWaWRlbyBHIFBpeGVsIGZvcm1hdAotI2RlZmluZSAgVklEX0RTVF9IX1BJWF9GUk1UICAgICAgICAweDEzMDc4NAkvLyBWaWRlbyBIIFBpeGVsIGZvcm1hdAorI2RlZmluZSAgVklEX0RTVF9BX1BJWF9GUk1UICAgICAgICAweDEzMDA4NAkvKiBWaWRlbyBBIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9CX1BJWF9GUk1UICAgICAgICAweDEzMDE4NAkvKiBWaWRlbyBCIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9DX1BJWF9GUk1UICAgICAgICAweDEzMDI4NAkvKiBWaWRlbyBDIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9EX1BJWF9GUk1UICAgICAgICAweDEzMDM4NAkvKiBWaWRlbyBEIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9FX1BJWF9GUk1UICAgICAgICAweDEzMDQ4NAkvKiBWaWRlbyBFIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9GX1BJWF9GUk1UICAgICAgICAweDEzMDU4NAkvKiBWaWRlbyBGIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9HX1BJWF9GUk1UICAgICAgICAweDEzMDY4NAkvKiBWaWRlbyBHIFBpeGVsIGZvcm1hdCAqLworI2RlZmluZSAgVklEX0RTVF9IX1BJWF9GUk1UICAgICAgICAweDEzMDc4NAkvKiBWaWRlbyBIIFBpeGVsIGZvcm1hdCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBWaWRlbyBTb3VyY2UgQ2hhbm5lbHMKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBWaWRlbyBTb3VyY2UgQ2hhbm5lbHMgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLSNkZWZpbmUgIFZJRF9TUkNfQV9HUENOVF9DVEwgICAgICAgMHgxMzA4MDQJLy8gVmlkZW8gQSBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19CX0dQQ05UX0NUTCAgICAgICAweDEzMDkwNAkvLyBWaWRlbyBCIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0NfR1BDTlRfQ1RMICAgICAgIDB4MTMwQTA0CS8vIFZpZGVvIEMgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9TUkNfRF9HUENOVF9DVEwgICAgICAgMHgxMzBCMDQJLy8gVmlkZW8gRCBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19FX0dQQ05UX0NUTCAgICAgICAweDEzMEMwNAkvLyBWaWRlbyBFIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0ZfR1BDTlRfQ1RMICAgICAgIDB4MTMwRDA0CS8vIFZpZGVvIEYgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9TUkNfSV9HUENOVF9DVEwgICAgICAgMHgxMzBFMDQJLy8gVmlkZW8gSSBnZW5lcmFsIHB1cnBvc2UgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19KX0dQQ05UX0NUTCAgICAgICAweDEzMEYwNAkvLyBWaWRlbyBKIGdlbmVyYWwgcHVycG9zZSBjb250cm9sCisjZGVmaW5lICBWSURfU1JDX0FfR1BDTlRfQ1RMICAgICAgIDB4MTMwODA0CS8qIFZpZGVvIEEgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfQl9HUENOVF9DVEwgICAgICAgMHgxMzA5MDQJLyogVmlkZW8gQiBnZW5lcmFsIHB1cnBvc2UgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19DX0dQQ05UX0NUTCAgICAgICAweDEzMEEwNAkvKiBWaWRlbyBDIGdlbmVyYWwgcHVycG9zZSBjb250cm9sICovCisjZGVmaW5lICBWSURfU1JDX0RfR1BDTlRfQ1RMICAgICAgIDB4MTMwQjA0CS8qIFZpZGVvIEQgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRV9HUENOVF9DVEwgICAgICAgMHgxMzBDMDQJLyogVmlkZW8gRSBnZW5lcmFsIHB1cnBvc2UgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19GX0dQQ05UX0NUTCAgICAgICAweDEzMEQwNAkvKiBWaWRlbyBGIGdlbmVyYWwgcHVycG9zZSBjb250cm9sICovCisjZGVmaW5lICBWSURfU1JDX0lfR1BDTlRfQ1RMICAgICAgIDB4MTMwRTA0CS8qIFZpZGVvIEkgZ2VuZXJhbCBwdXJwb3NlIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfSl9HUENOVF9DVEwgICAgICAgMHgxMzBGMDQJLyogVmlkZW8gSiBnZW5lcmFsIHB1cnBvc2UgY29udHJvbCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0jZGVmaW5lICBWSURfU1JDX0FfR1BDTlQgICAgICAgICAgIDB4MTMwODA4CS8vIFZpZGVvIEEgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKLSNkZWZpbmUgIFZJRF9TUkNfQl9HUENOVCAgICAgICAgICAgMHgxMzA5MDgJLy8gVmlkZW8gQiBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgotI2RlZmluZSAgVklEX1NSQ19DX0dQQ05UICAgICAgICAgICAweDEzMEEwOAkvLyBWaWRlbyBDIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyCi0jZGVmaW5lICBWSURfU1JDX0RfR1BDTlQgICAgICAgICAgIDB4MTMwQjA4CS8vIFZpZGVvIEQgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKLSNkZWZpbmUgIFZJRF9TUkNfRV9HUENOVCAgICAgICAgICAgMHgxMzBDMDgJLy8gVmlkZW8gRSBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgotI2RlZmluZSAgVklEX1NSQ19GX0dQQ05UICAgICAgICAgICAweDEzMEQwOAkvLyBWaWRlbyBGIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyCi0jZGVmaW5lICBWSURfU1JDX0lfR1BDTlQgICAgICAgICAgIDB4MTMwRTA4CS8vIFZpZGVvIEkgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIKLSNkZWZpbmUgIFZJRF9TUkNfSl9HUENOVCAgICAgICAgICAgMHgxMzBGMDgJLy8gVmlkZW8gSiBnZW5lcmFsIHB1cnBvc2UgY291bnRlcgorI2RlZmluZSAgVklEX1NSQ19BX0dQQ05UICAgICAgICAgICAweDEzMDgwOAkvKiBWaWRlbyBBIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyICovCisjZGVmaW5lICBWSURfU1JDX0JfR1BDTlQgICAgICAgICAgIDB4MTMwOTA4CS8qIFZpZGVvIEIgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfQ19HUENOVCAgICAgICAgICAgMHgxMzBBMDgJLyogVmlkZW8gQyBnZW5lcmFsIHB1cnBvc2UgY291bnRlciAqLworI2RlZmluZSAgVklEX1NSQ19EX0dQQ05UICAgICAgICAgICAweDEzMEIwOAkvKiBWaWRlbyBEIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyICovCisjZGVmaW5lICBWSURfU1JDX0VfR1BDTlQgICAgICAgICAgIDB4MTMwQzA4CS8qIFZpZGVvIEUgZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRl9HUENOVCAgICAgICAgICAgMHgxMzBEMDgJLyogVmlkZW8gRiBnZW5lcmFsIHB1cnBvc2UgY291bnRlciAqLworI2RlZmluZSAgVklEX1NSQ19JX0dQQ05UICAgICAgICAgICAweDEzMEUwOAkvKiBWaWRlbyBJIGdlbmVyYWwgcHVycG9zZSBjb3VudGVyICovCisjZGVmaW5lICBWSURfU1JDX0pfR1BDTlQgICAgICAgICAgIDB4MTMwRjA4CS8qIFZpZGVvIEogZ2VuZXJhbCBwdXJwb3NlIGNvdW50ZXIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotI2RlZmluZSAgVklEX1NSQ19BX0RNQV9DVEwgICAgICAgICAweDEzMDgwQwkvLyBWaWRlbyBBIERNQSBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0JfRE1BX0NUTCAgICAgICAgIDB4MTMwOTBDCS8vIFZpZGVvIEIgRE1BIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9TUkNfQ19ETUFfQ1RMICAgICAgICAgMHgxMzBBMEMJLy8gVmlkZW8gQyBETUEgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19EX0RNQV9DVEwgICAgICAgICAweDEzMEIwQwkvLyBWaWRlbyBEIERNQSBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0VfRE1BX0NUTCAgICAgICAgIDB4MTMwQzBDCS8vIFZpZGVvIEUgRE1BIGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9TUkNfRl9ETUFfQ1RMICAgICAgICAgMHgxMzBEMEMJLy8gVmlkZW8gRiBETUEgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19JX0RNQV9DVEwgICAgICAgICAweDEzMEUwQwkvLyBWaWRlbyBJIERNQSBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0pfRE1BX0NUTCAgICAgICAgIDB4MTMwRjBDCS8vIFZpZGVvIEogRE1BIGNvbnRyb2wKKyNkZWZpbmUgIFZJRF9TUkNfQV9ETUFfQ1RMICAgICAgICAgMHgxMzA4MEMJLyogVmlkZW8gQSBETUEgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19CX0RNQV9DVEwgICAgICAgICAweDEzMDkwQwkvKiBWaWRlbyBCIERNQSBjb250cm9sICovCisjZGVmaW5lICBWSURfU1JDX0NfRE1BX0NUTCAgICAgICAgIDB4MTMwQTBDCS8qIFZpZGVvIEMgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRF9ETUFfQ1RMICAgICAgICAgMHgxMzBCMEMJLyogVmlkZW8gRCBETUEgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19FX0RNQV9DVEwgICAgICAgICAweDEzMEMwQwkvKiBWaWRlbyBFIERNQSBjb250cm9sICovCisjZGVmaW5lICBWSURfU1JDX0ZfRE1BX0NUTCAgICAgICAgIDB4MTMwRDBDCS8qIFZpZGVvIEYgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfSV9ETUFfQ1RMICAgICAgICAgMHgxMzBFMEMJLyogVmlkZW8gSSBETUEgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19KX0RNQV9DVEwgICAgICAgICAweDEzMEYwQwkvKiBWaWRlbyBKIERNQSBjb250cm9sICovCiAKICNkZWZpbmUgIEZMRF9BUEJfUklTQ19FTiAgICAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSAgRkxEX0FQQl9GSUZPX0VOICAgICAgICAgICAweDAwMDAwMDAxCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLSNkZWZpbmUgIFZJRF9TUkNfQV9GTVRfQ1RMICAgICAgICAgMHgxMzA4MTAJLy8gVmlkZW8gQSBmb3JtYXQgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19CX0ZNVF9DVEwgICAgICAgICAweDEzMDkxMAkvLyBWaWRlbyBCIGZvcm1hdCBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0NfRk1UX0NUTCAgICAgICAgIDB4MTMwQTEwCS8vIFZpZGVvIEMgZm9ybWF0IGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9TUkNfRF9GTVRfQ1RMICAgICAgICAgMHgxMzBCMTAJLy8gVmlkZW8gRCBmb3JtYXQgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19FX0ZNVF9DVEwgICAgICAgICAweDEzMEMxMAkvLyBWaWRlbyBFIGZvcm1hdCBjb250cm9sCi0jZGVmaW5lICBWSURfU1JDX0ZfRk1UX0NUTCAgICAgICAgIDB4MTMwRDEwCS8vIFZpZGVvIEYgZm9ybWF0IGNvbnRyb2wKLSNkZWZpbmUgIFZJRF9TUkNfSV9GTVRfQ1RMICAgICAgICAgMHgxMzBFMTAJLy8gVmlkZW8gSSBmb3JtYXQgY29udHJvbAotI2RlZmluZSAgVklEX1NSQ19KX0ZNVF9DVEwgICAgICAgICAweDEzMEYxMAkvLyBWaWRlbyBKIGZvcm1hdCBjb250cm9sCisjZGVmaW5lICBWSURfU1JDX0FfRk1UX0NUTCAgICAgICAgIDB4MTMwODEwCS8qIFZpZGVvIEEgZm9ybWF0IGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfQl9GTVRfQ1RMICAgICAgICAgMHgxMzA5MTAJLyogVmlkZW8gQiBmb3JtYXQgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19DX0ZNVF9DVEwgICAgICAgICAweDEzMEExMAkvKiBWaWRlbyBDIGZvcm1hdCBjb250cm9sICovCisjZGVmaW5lICBWSURfU1JDX0RfRk1UX0NUTCAgICAgICAgIDB4MTMwQjEwCS8qIFZpZGVvIEQgZm9ybWF0IGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRV9GTVRfQ1RMICAgICAgICAgMHgxMzBDMTAJLyogVmlkZW8gRSBmb3JtYXQgY29udHJvbCAqLworI2RlZmluZSAgVklEX1NSQ19GX0ZNVF9DVEwgICAgICAgICAweDEzMEQxMAkvKiBWaWRlbyBGIGZvcm1hdCBjb250cm9sICovCisjZGVmaW5lICBWSURfU1JDX0lfRk1UX0NUTCAgICAgICAgIDB4MTMwRTEwCS8qIFZpZGVvIEkgZm9ybWF0IGNvbnRyb2wgKi8KKyNkZWZpbmUgIFZJRF9TUkNfSl9GTVRfQ1RMICAgICAgICAgMHgxMzBGMTAJLyogVmlkZW8gSiBmb3JtYXQgY29udHJvbCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0jZGVmaW5lICBWSURfU1JDX0FfQUNUSVZFX0NUTDEgICAgIDB4MTMwODE0CS8vIFZpZGVvIEEgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0JfQUNUSVZFX0NUTDEgICAgIDB4MTMwOTE0CS8vIFZpZGVvIEIgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0NfQUNUSVZFX0NUTDEgICAgIDB4MTMwQTE0CS8vIFZpZGVvIEMgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0RfQUNUSVZFX0NUTDEgICAgIDB4MTMwQjE0CS8vIFZpZGVvIEQgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0VfQUNUSVZFX0NUTDEgICAgIDB4MTMwQzE0CS8vIFZpZGVvIEUgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0ZfQUNUSVZFX0NUTDEgICAgIDB4MTMwRDE0CS8vIFZpZGVvIEYgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0lfQUNUSVZFX0NUTDEgICAgIDB4MTMwRTE0CS8vIFZpZGVvIEkgYWN0aXZlIGNvbnRyb2wgICAgICAxCi0jZGVmaW5lICBWSURfU1JDX0pfQUNUSVZFX0NUTDEgICAgIDB4MTMwRjE0CS8vIFZpZGVvIEogYWN0aXZlIGNvbnRyb2wgICAgICAxCisjZGVmaW5lICBWSURfU1JDX0FfQUNUSVZFX0NUTDEgICAgIDB4MTMwODE0CS8qIFZpZGVvIEEgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0JfQUNUSVZFX0NUTDEgICAgIDB4MTMwOTE0CS8qIFZpZGVvIEIgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0NfQUNUSVZFX0NUTDEgICAgIDB4MTMwQTE0CS8qIFZpZGVvIEMgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0RfQUNUSVZFX0NUTDEgICAgIDB4MTMwQjE0CS8qIFZpZGVvIEQgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0VfQUNUSVZFX0NUTDEgICAgIDB4MTMwQzE0CS8qIFZpZGVvIEUgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0ZfQUNUSVZFX0NUTDEgICAgIDB4MTMwRDE0CS8qIFZpZGVvIEYgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0lfQUNUSVZFX0NUTDEgICAgIDB4MTMwRTE0CS8qIFZpZGVvIEkgYWN0aXZlIGNvbnRyb2wgICAgICAxICovCisjZGVmaW5lICBWSURfU1JDX0pfQUNUSVZFX0NUTDEgICAgIDB4MTMwRjE0CS8qIFZpZGVvIEogYWN0aXZlIGNvbnRyb2wgICAgICAxICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLSNkZWZpbmUgIFZJRF9TUkNfQV9BQ1RJVkVfQ1RMMiAgICAgMHgxMzA4MTgJLy8gVmlkZW8gQSBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfQl9BQ1RJVkVfQ1RMMiAgICAgMHgxMzA5MTgJLy8gVmlkZW8gQiBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfQ19BQ1RJVkVfQ1RMMiAgICAgMHgxMzBBMTgJLy8gVmlkZW8gQyBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfRF9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBCMTgJLy8gVmlkZW8gRCBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfRV9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBDMTgJLy8gVmlkZW8gRSBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfRl9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBEMTgJLy8gVmlkZW8gRiBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfSV9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBFMTgJLy8gVmlkZW8gSSBhY3RpdmUgY29udHJvbCAgICAgIDIKLSNkZWZpbmUgIFZJRF9TUkNfSl9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBGMTgJLy8gVmlkZW8gSiBhY3RpdmUgY29udHJvbCAgICAgIDIKKyNkZWZpbmUgIFZJRF9TUkNfQV9BQ1RJVkVfQ1RMMiAgICAgMHgxMzA4MTgJLyogVmlkZW8gQSBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfQl9BQ1RJVkVfQ1RMMiAgICAgMHgxMzA5MTgJLyogVmlkZW8gQiBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfQ19BQ1RJVkVfQ1RMMiAgICAgMHgxMzBBMTgJLyogVmlkZW8gQyBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRF9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBCMTgJLyogVmlkZW8gRCBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRV9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBDMTgJLyogVmlkZW8gRSBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRl9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBEMTgJLyogVmlkZW8gRiBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfSV9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBFMTgJLyogVmlkZW8gSSBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KKyNkZWZpbmUgIFZJRF9TUkNfSl9BQ1RJVkVfQ1RMMiAgICAgMHgxMzBGMTgJLyogVmlkZW8gSiBhY3RpdmUgY29udHJvbCAgICAgIDIgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotI2RlZmluZSAgVklEX1NSQ19BX0NEVF9TWiAgICAgICAgICAweDEzMDgxQwkvLyBWaWRlbyBBIENEVCBzaXplCi0jZGVmaW5lICBWSURfU1JDX0JfQ0RUX1NaICAgICAgICAgIDB4MTMwOTFDCS8vIFZpZGVvIEIgQ0RUIHNpemUKLSNkZWZpbmUgIFZJRF9TUkNfQ19DRFRfU1ogICAgICAgICAgMHgxMzBBMUMJLy8gVmlkZW8gQyBDRFQgc2l6ZQotI2RlZmluZSAgVklEX1NSQ19EX0NEVF9TWiAgICAgICAgICAweDEzMEIxQwkvLyBWaWRlbyBEIENEVCBzaXplCi0jZGVmaW5lICBWSURfU1JDX0VfQ0RUX1NaICAgICAgICAgIDB4MTMwQzFDCS8vIFZpZGVvIEUgQ0RUIHNpemUKLSNkZWZpbmUgIFZJRF9TUkNfRl9DRFRfU1ogICAgICAgICAgMHgxMzBEMUMJLy8gVmlkZW8gRiBDRFQgc2l6ZQotI2RlZmluZSAgVklEX1NSQ19JX0NEVF9TWiAgICAgICAgICAweDEzMEUxQwkvLyBWaWRlbyBJIENEVCBzaXplCi0jZGVmaW5lICBWSURfU1JDX0pfQ0RUX1NaICAgICAgICAgIDB4MTMwRjFDCS8vIFZpZGVvIEogQ0RUIHNpemUKKyNkZWZpbmUgIFZJRF9TUkNfQV9DRFRfU1ogICAgICAgICAgMHgxMzA4MUMJLyogVmlkZW8gQSBDRFQgc2l6ZSAqLworI2RlZmluZSAgVklEX1NSQ19CX0NEVF9TWiAgICAgICAgICAweDEzMDkxQwkvKiBWaWRlbyBCIENEVCBzaXplICovCisjZGVmaW5lICBWSURfU1JDX0NfQ0RUX1NaICAgICAgICAgIDB4MTMwQTFDCS8qIFZpZGVvIEMgQ0RUIHNpemUgKi8KKyNkZWZpbmUgIFZJRF9TUkNfRF9DRFRfU1ogICAgICAgICAgMHgxMzBCMUMJLyogVmlkZW8gRCBDRFQgc2l6ZSAqLworI2RlZmluZSAgVklEX1NSQ19FX0NEVF9TWiAgICAgICAgICAweDEzMEMxQwkvKiBWaWRlbyBFIENEVCBzaXplICovCisjZGVmaW5lICBWSURfU1JDX0ZfQ0RUX1NaICAgICAgICAgIDB4MTMwRDFDCS8qIFZpZGVvIEYgQ0RUIHNpemUgKi8KKyNkZWZpbmUgIFZJRF9TUkNfSV9DRFRfU1ogICAgICAgICAgMHgxMzBFMUMJLyogVmlkZW8gSSBDRFQgc2l6ZSAqLworI2RlZmluZSAgVklEX1NSQ19KX0NEVF9TWiAgICAgICAgICAweDEzMEYxQwkvKiBWaWRlbyBKIENEVCBzaXplICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEF1ZGlvIEkvRgotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQVVEX0RTVF9BX0RNQSAgICAgICAgICAgICAweDE0MDAwMAkvLyBBdWRpbyBJbnQgQSBETUEgZGF0YSBwb3J0Ci0jZGVmaW5lICBBVURfU1JDX0FfRE1BICAgICAgICAgICAgIDB4MTQwMDA4CS8vIEF1ZGlvIEludCBBIERNQSBkYXRhIHBvcnQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBBdWRpbyBJL0YgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfRFNUX0FfRE1BICAgICAgICAgICAgIDB4MTQwMDAwCS8qIEF1ZGlvIEludCBBIERNQSBkYXRhIHBvcnQgKi8KKyNkZWZpbmUgIEFVRF9TUkNfQV9ETUEgICAgICAgICAgICAgMHgxNDAwMDgJLyogQXVkaW8gSW50IEEgRE1BIGRhdGEgcG9ydCAqLwogCi0jZGVmaW5lICBBVURfQV9HUENOVCAgICAgICAgICAgICAgIDB4MTQwMDEwCS8vIEF1ZGlvIEludCBBIGdwIGNvdW50ZXIKKyNkZWZpbmUgIEFVRF9BX0dQQ05UICAgICAgICAgICAgICAgMHgxNDAwMTAJLyogQXVkaW8gSW50IEEgZ3AgY291bnRlciAqLwogI2RlZmluZSAgRkxEX0FVRF9BX0dQX0NOVCAgICAgICAgICAweDAwMDBGRkZGCiAKLSNkZWZpbmUgIEFVRF9BX0dQQ05UX0NUTCAgICAgICAgICAgMHgxNDAwMTQJLy8gQXVkaW8gSW50IEEgZ3AgY29udHJvbAorI2RlZmluZSAgQVVEX0FfR1BDTlRfQ1RMICAgICAgICAgICAweDE0MDAxNAkvKiBBdWRpbyBJbnQgQSBncCBjb250cm9sICovCiAKLSNkZWZpbmUgIEFVRF9BX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAwMTgJLy8gQXVkaW8gSW50IEEgbGluZSBsZW5ndGgKKyNkZWZpbmUgIEFVRF9BX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAwMTgJLyogQXVkaW8gSW50IEEgbGluZSBsZW5ndGggKi8KIAotI2RlZmluZSAgQVVEX0FfQ0ZHICAgICAgICAgICAgICAgICAweDE0MDAxQwkvLyBBdWRpbyBJbnQgQSBjb25maWd1cmF0aW9uCisjZGVmaW5lICBBVURfQV9DRkcgICAgICAgICAgICAgICAgIDB4MTQwMDFDCS8qIEF1ZGlvIEludCBBIGNvbmZpZ3VyYXRpb24gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQVVEX0RTVF9CX0RNQSAgICAgICAgICAgICAweDE0MDEwMAkvLyBBdWRpbyBJbnQgQiBETUEgZGF0YSBwb3J0Ci0jZGVmaW5lICBBVURfU1JDX0JfRE1BICAgICAgICAgICAgIDB4MTQwMTA4CS8vIEF1ZGlvIEludCBCIERNQSBkYXRhIHBvcnQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfRFNUX0JfRE1BICAgICAgICAgICAgIDB4MTQwMTAwCS8qIEF1ZGlvIEludCBCIERNQSBkYXRhIHBvcnQgKi8KKyNkZWZpbmUgIEFVRF9TUkNfQl9ETUEgICAgICAgICAgICAgMHgxNDAxMDgJLyogQXVkaW8gSW50IEIgRE1BIGRhdGEgcG9ydCAqLwogCi0jZGVmaW5lICBBVURfQl9HUENOVCAgICAgICAgICAgICAgIDB4MTQwMTEwCS8vIEF1ZGlvIEludCBCIGdwIGNvdW50ZXIKKyNkZWZpbmUgIEFVRF9CX0dQQ05UICAgICAgICAgICAgICAgMHgxNDAxMTAJLyogQXVkaW8gSW50IEIgZ3AgY291bnRlciAqLwogI2RlZmluZSAgRkxEX0FVRF9CX0dQX0NOVCAgICAgICAgICAweDAwMDBGRkZGCiAKLSNkZWZpbmUgIEFVRF9CX0dQQ05UX0NUTCAgICAgICAgICAgMHgxNDAxMTQJLy8gQXVkaW8gSW50IEIgZ3AgY29udHJvbAorI2RlZmluZSAgQVVEX0JfR1BDTlRfQ1RMICAgICAgICAgICAweDE0MDExNAkvKiBBdWRpbyBJbnQgQiBncCBjb250cm9sICovCiAKLSNkZWZpbmUgIEFVRF9CX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAxMTgJLy8gQXVkaW8gSW50IEIgbGluZSBsZW5ndGgKKyNkZWZpbmUgIEFVRF9CX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAxMTgJLyogQXVkaW8gSW50IEIgbGluZSBsZW5ndGggKi8KIAotI2RlZmluZSAgQVVEX0JfQ0ZHICAgICAgICAgICAgICAgICAweDE0MDExQwkvLyBBdWRpbyBJbnQgQiBjb25maWd1cmF0aW9uCisjZGVmaW5lICBBVURfQl9DRkcgICAgICAgICAgICAgICAgIDB4MTQwMTFDCS8qIEF1ZGlvIEludCBCIGNvbmZpZ3VyYXRpb24gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQVVEX0RTVF9DX0RNQSAgICAgICAgICAgICAweDE0MDIwMAkvLyBBdWRpbyBJbnQgQyBETUEgZGF0YSBwb3J0Ci0jZGVmaW5lICBBVURfU1JDX0NfRE1BICAgICAgICAgICAgIDB4MTQwMjA4CS8vIEF1ZGlvIEludCBDIERNQSBkYXRhIHBvcnQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfRFNUX0NfRE1BICAgICAgICAgICAgIDB4MTQwMjAwCS8qIEF1ZGlvIEludCBDIERNQSBkYXRhIHBvcnQgKi8KKyNkZWZpbmUgIEFVRF9TUkNfQ19ETUEgICAgICAgICAgICAgMHgxNDAyMDgJLyogQXVkaW8gSW50IEMgRE1BIGRhdGEgcG9ydCAqLwogCi0jZGVmaW5lICBBVURfQ19HUENOVCAgICAgICAgICAgICAgIDB4MTQwMjEwCS8vIEF1ZGlvIEludCBDIGdwIGNvdW50ZXIKKyNkZWZpbmUgIEFVRF9DX0dQQ05UICAgICAgICAgICAgICAgMHgxNDAyMTAJLyogQXVkaW8gSW50IEMgZ3AgY291bnRlciAqLwogI2RlZmluZSAgRkxEX0FVRF9DX0dQX0NOVCAgICAgICAgICAweDAwMDBGRkZGCiAKLSNkZWZpbmUgIEFVRF9DX0dQQ05UX0NUTCAgICAgICAgICAgMHgxNDAyMTQJLy8gQXVkaW8gSW50IEMgZ3AgY29udHJvbAorI2RlZmluZSAgQVVEX0NfR1BDTlRfQ1RMICAgICAgICAgICAweDE0MDIxNAkvKiBBdWRpbyBJbnQgQyBncCBjb250cm9sICovCiAKLSNkZWZpbmUgIEFVRF9DX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAyMTgJLy8gQXVkaW8gSW50IEMgbGluZSBsZW5ndGgKKyNkZWZpbmUgIEFVRF9DX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAyMTgJLyogQXVkaW8gSW50IEMgbGluZSBsZW5ndGggKi8KIAotI2RlZmluZSAgQVVEX0NfQ0ZHICAgICAgICAgICAgICAgICAweDE0MDIxQwkvLyBBdWRpbyBJbnQgQyBjb25maWd1cmF0aW9uCisjZGVmaW5lICBBVURfQ19DRkcgICAgICAgICAgICAgICAgIDB4MTQwMjFDCS8qIEF1ZGlvIEludCBDIGNvbmZpZ3VyYXRpb24gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQVVEX0RTVF9EX0RNQSAgICAgICAgICAgICAweDE0MDMwMAkvLyBBdWRpbyBJbnQgRCBETUEgZGF0YSBwb3J0Ci0jZGVmaW5lICBBVURfU1JDX0RfRE1BICAgICAgICAgICAgIDB4MTQwMzA4CS8vIEF1ZGlvIEludCBEIERNQSBkYXRhIHBvcnQKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBBVURfRFNUX0RfRE1BICAgICAgICAgICAgIDB4MTQwMzAwCS8qIEF1ZGlvIEludCBEIERNQSBkYXRhIHBvcnQgKi8KKyNkZWZpbmUgIEFVRF9TUkNfRF9ETUEgICAgICAgICAgICAgMHgxNDAzMDgJLyogQXVkaW8gSW50IEQgRE1BIGRhdGEgcG9ydCAqLwogCi0jZGVmaW5lICBBVURfRF9HUENOVCAgICAgICAgICAgICAgIDB4MTQwMzEwCS8vIEF1ZGlvIEludCBEIGdwIGNvdW50ZXIKKyNkZWZpbmUgIEFVRF9EX0dQQ05UICAgICAgICAgICAgICAgMHgxNDAzMTAJLyogQXVkaW8gSW50IEQgZ3AgY291bnRlciAqLwogI2RlZmluZSAgRkxEX0FVRF9EX0dQX0NOVCAgICAgICAgICAweDAwMDBGRkZGCiAKLSNkZWZpbmUgIEFVRF9EX0dQQ05UX0NUTCAgICAgICAgICAgMHgxNDAzMTQJLy8gQXVkaW8gSW50IEQgZ3AgY29udHJvbAorI2RlZmluZSAgQVVEX0RfR1BDTlRfQ1RMICAgICAgICAgICAweDE0MDMxNAkvKiBBdWRpbyBJbnQgRCBncCBjb250cm9sICovCiAKLSNkZWZpbmUgIEFVRF9EX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAzMTgJLy8gQXVkaW8gSW50IEQgbGluZSBsZW5ndGgKKyNkZWZpbmUgIEFVRF9EX0xOR1RIICAgICAgICAgICAgICAgMHgxNDAzMTgJLyogQXVkaW8gSW50IEQgbGluZSBsZW5ndGggKi8KIAotI2RlZmluZSAgQVVEX0RfQ0ZHICAgICAgICAgICAgICAgICAweDE0MDMxQwkvLyBBdWRpbyBJbnQgRCBjb25maWd1cmF0aW9uCisjZGVmaW5lICBBVURfRF9DRkcgICAgICAgICAgICAgICAgIDB4MTQwMzFDCS8qIEF1ZGlvIEludCBEIGNvbmZpZ3VyYXRpb24gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgQVVEX1NSQ19FX0RNQSAgICAgICAgICAgICAweDE0MDQwMAkvLyBBdWRpbyBJbnQgRSBETUEgZGF0YSBwb3J0CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgQVVEX1NSQ19FX0RNQSAgICAgICAgICAgICAweDE0MDQwMAkvKiBBdWRpbyBJbnQgRSBETUEgZGF0YSBwb3J0ICovCiAKLSNkZWZpbmUgIEFVRF9FX0dQQ05UICAgICAgICAgICAgICAgMHgxNDA0MTAJLy8gQXVkaW8gSW50IEUgZ3AgY291bnRlcgorI2RlZmluZSAgQVVEX0VfR1BDTlQgICAgICAgICAgICAgICAweDE0MDQxMAkvKiBBdWRpbyBJbnQgRSBncCBjb3VudGVyICovCiAjZGVmaW5lICBGTERfQVVEX0VfR1BfQ05UICAgICAgICAgIDB4MDAwMEZGRkYKIAotI2RlZmluZSAgQVVEX0VfR1BDTlRfQ1RMICAgICAgICAgICAweDE0MDQxNAkvLyBBdWRpbyBJbnQgRSBncCBjb250cm9sCisjZGVmaW5lICBBVURfRV9HUENOVF9DVEwgICAgICAgICAgIDB4MTQwNDE0CS8qIEF1ZGlvIEludCBFIGdwIGNvbnRyb2wgKi8KIAotI2RlZmluZSAgQVVEX0VfQ0ZHICAgICAgICAgICAgICAgICAweDE0MDQxQwkvLyBBdWRpbyBJbnQgRSBjb25maWd1cmF0aW9uCisjZGVmaW5lICBBVURfRV9DRkcgICAgICAgICAgICAgICAgIDB4MTQwNDFDCS8qIEF1ZGlvIEludCBFIGNvbmZpZ3VyYXRpb24gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogI2RlZmluZSAgRkxEX0FVRF9EU1RfTE5fTE5HVEggICAgICAweDAwMDAwRkZGCiAKQEAgLTEzNjEsOCArMTM2MSw4IEBACiAKICNkZWZpbmUgIEZMRF9BVURfU1JDX0VOQUJMRSAgICAgICAgMHgwMDAxMDAwMAogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBBVURfSU5UX0RNQV9DVEwgICAgICAgICAgIDB4MTQwNTAwCS8vIEF1ZGlvIEludCBETUEgY29udHJvbAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEFVRF9JTlRfRE1BX0NUTCAgICAgICAgICAgMHgxNDA1MDAJLyogQXVkaW8gSW50IERNQSBjb250cm9sICovCiAKICNkZWZpbmUgIEZMRF9BVURfU1JDX0VfUklTQ19FTiAgICAgMHgwMDAwODAwMAogI2RlZmluZSAgRkxEX0FVRF9TUkNfQ19SSVNDX0VOICAgICAweDAwMDA0MDAwCkBAIC0xMzg0LDE1ICsxMzg0LDE1IEBACiAjZGVmaW5lICBGTERfQVVEX0RTVF9CX0ZJRk9fRU4gICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgIEZMRF9BVURfRFNUX0FfRklGT19FTiAgICAgMHgwMDAwMDAwMQogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLwotLy8gICAgICAgICAgICAgICAgICAgTW9iaWx5Z2VuIEludGVyZmFjZSBSZWdpc3RlcnMKLS8vCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBNb2JpbHlnZW4gSW50ZXJmYWNlIEEKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIE1CX0lGX0FfRE1BICAgICAgICAgICAgICAgMHgxNTAwMDAJLy8gTUJJRiBBIERNQSBkYXRhIHBvcnQKLSNkZWZpbmUgIE1CX0lGX0FfR1BDTiAgICAgICAgICAgICAgMHgxNTAwMDgJLy8gTUJJRiBBIEdQIGNvdW50ZXIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgKi8KKy8qIE1vYmlseWdlbiBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisvKiAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBNb2JpbHlnZW4gSW50ZXJmYWNlIEEgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBNQl9JRl9BX0RNQSAgICAgICAgICAgICAgIDB4MTUwMDAwCS8qIE1CSUYgQSBETUEgZGF0YSBwb3J0ICovCisjZGVmaW5lICBNQl9JRl9BX0dQQ04gICAgICAgICAgICAgIDB4MTUwMDA4CS8qIE1CSUYgQSBHUCBjb3VudGVyICovCiAjZGVmaW5lICBNQl9JRl9BX0dQQ05fQ1RSTCAgICAgICAgIDB4MTUwMDBDCiAjZGVmaW5lICBNQl9JRl9BX0RNQV9DVFJMICAgICAgICAgIDB4MTUwMDEwCiAjZGVmaW5lICBNQl9JRl9BX0xFTkdUSCAgICAgICAgICAgIDB4MTUwMDE0CkBAIC0xNDE1LDExICsxNDE1LDExIEBACiAjZGVmaW5lICBNQl9JRl9BX0RBVEFfU1RSVUNUX0QgICAgIDB4MTUwMDU4CiAjZGVmaW5lICBNQl9JRl9BX0RBVEFfU1RSVUNUX0UgICAgIDB4MTUwMDVDCiAjZGVmaW5lICBNQl9JRl9BX0RBVEFfU1RSVUNUX0YgICAgIDB4MTUwMDYwCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBNb2JpbHlnZW4gSW50ZXJmYWNlIEIKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIE1CX0lGX0JfRE1BICAgICAgICAgICAgICAgMHgxNjAwMDAJLy8gTUJJRiBBIERNQSBkYXRhIHBvcnQKLSNkZWZpbmUgIE1CX0lGX0JfR1BDTiAgICAgICAgICAgICAgMHgxNjAwMDgJLy8gTUJJRiBBIEdQIGNvdW50ZXIKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBNb2JpbHlnZW4gSW50ZXJmYWNlIEIgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBNQl9JRl9CX0RNQSAgICAgICAgICAgICAgIDB4MTYwMDAwCS8qIE1CSUYgQSBETUEgZGF0YSBwb3J0ICovCisjZGVmaW5lICBNQl9JRl9CX0dQQ04gICAgICAgICAgICAgIDB4MTYwMDA4CS8qIE1CSUYgQSBHUCBjb3VudGVyICovCiAjZGVmaW5lICBNQl9JRl9CX0dQQ05fQ1RSTCAgICAgICAgIDB4MTYwMDBDCiAjZGVmaW5lICBNQl9JRl9CX0RNQV9DVFJMICAgICAgICAgIDB4MTYwMDEwCiAjZGVmaW5lICBNQl9JRl9CX0xFTkdUSCAgICAgICAgICAgIDB4MTYwMDE0CkBAIC0xNDQzLDE0ICsxNDQzLDE0IEBACiAjZGVmaW5lICBNQl9JRl9CX0RBVEFfU1RSVUNUX0UgICAgIDB4MTYwMDVDCiAjZGVmaW5lICBNQl9JRl9CX0RBVEFfU1RSVUNUX0YgICAgIDB4MTYwMDYwCiAKLS8vIE1CX0RNQV9DVFJMCisvKiBNQl9ETUFfQ1RSTCAqLwogI2RlZmluZSAgRkxEX01CX0lGX1JJU0NfRU4gICAgICAgICAweDAwMDAwMDEwCiAjZGVmaW5lICBGTERfTUJfSUZfRklGT19FTiAgICAgICAgIDB4MDAwMDAwMDEKIAotLy8gTUJfTEVOR1RICisvKiBNQl9MRU5HVEggKi8KICNkZWZpbmUgIEZMRF9NQl9JRl9MTl9MTkdUSCAgICAgICAgMHgwMDAwMEZGRgogCi0vLyBNQl9IQ01EIHJlZ2lzdGVyCisvKiBNQl9IQ01EIHJlZ2lzdGVyICovCiAjZGVmaW5lICBGTERfTUJfSENNRF9IX0dPICAgICAgICAgIDB4ODAwMDAwMDAKICNkZWZpbmUgIEZMRF9NQl9IQ01EX0hfQlVTWSAgICAgICAgMHg0MDAwMDAwMAogI2RlZmluZSAgRkxEX01CX0hDTURfSF9ETUFfSE9MRCAgICAweDEwMDAwMDAwCkBAIC0xNDYxLDExOCArMTQ2MSwxMTggQEAKICNkZWZpbmUgIEZMRF9NQl9IQ01EX0hfQUREUiAgICAgICAgMHgwMEZGMDAwMAogI2RlZmluZSAgRkxEX01CX0hDTURfSF9EQVRBICAgICAgICAweDAwMDBGRkZGCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEkyQyAjMQotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgSTJDMV9BRERSICAgICAgICAgICAgICAgICAweDE4MDAwMAkvLyBJMkMgIzEgYWRkcmVzcwotI2RlZmluZSAgRkxEX0kyQ19EQUREUiAgICAgICAgICAgICAweGZlMDAwMDAwCS8vIFJXIFszMToyNV0gSTJDIERldmljZSBBZGRyZXNzCi0JCQkJCQkgLy8gUk8gWzI0XSByZXNlcnZlZAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgRkxEX0kyQ19TQUREUiAgICAgICAgICAgICAweDAwRkZGRkZGCS8vIFJXIFsyMzowXSAgSTJDIFN1Yi1hZGRyZXNzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogSTJDICMxICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDMV9BRERSICAgICAgICAgICAgICAgICAweDE4MDAwMAkvKiBJMkMgIzEgYWRkcmVzcyAqLworI2RlZmluZSAgRkxEX0kyQ19EQUREUiAgICAgICAgICAgICAweGZlMDAwMDAwCS8qIFJXIFszMToyNV0gSTJDIERldmljZSBBZGRyZXNzICovCisJCQkJCQkgLyogUk8gWzI0XSByZXNlcnZlZCAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEZMRF9JMkNfU0FERFIgICAgICAgICAgICAgMHgwMEZGRkZGRgkvKiBSVyBbMjM6MF0gIEkyQyBTdWItYWRkcmVzcyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMxX1dEQVRBICAgICAgICAgICAgICAgIDB4MTgwMDA0CS8vIEkyQyAjMSB3cml0ZSBkYXRhCi0jZGVmaW5lICBGTERfSTJDX1dEQVRBICAgICAgICAgICAgIDB4RkZGRkZGRkYJLy8gUlcgWzMxOjBdCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDMV9XREFUQSAgICAgICAgICAgICAgICAweDE4MDAwNAkvKiBJMkMgIzEgd3JpdGUgZGF0YSAqLworI2RlZmluZSAgRkxEX0kyQ19XREFUQSAgICAgICAgICAgICAweEZGRkZGRkZGCS8qIFJXIFszMTowXSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMxX0NUUkwgICAgICAgICAgICAgICAgIDB4MTgwMDA4CS8vIEkyQyAjMSBjb250cm9sCi0jZGVmaW5lICBGTERfSTJDX1BFUklPRCAgICAgICAgICAgIDB4RkYwMDAwMDAJLy8gUlcgWzMxOjI0XQotI2RlZmluZSAgRkxEX0kyQ19TQ0xfSU4gICAgICAgICAgICAweDAwMjAwMDAwCS8vIFJXIFsyMV0KLSNkZWZpbmUgIEZMRF9JMkNfU0RBX0lOICAgICAgICAgICAgMHgwMDEwMDAwMAkvLyBSVyBbMjBdCi0JCQkJCQkgLy8gUk8gWzE5OjE4XSByZXNlcnZlZAotI2RlZmluZSAgRkxEX0kyQ19TQ0xfT1VUICAgICAgICAgICAweDAwMDIwMDAwCS8vIFJXIFsxN10KLSNkZWZpbmUgIEZMRF9JMkNfU0RBX09VVCAgICAgICAgICAgMHgwMDAxMDAwMAkvLyBSVyBbMTZdCi0JCQkJCQkgLy8gUk8gWzE1XSByZXNlcnZlZAotI2RlZmluZSAgRkxEX0kyQ19EQVRBX0xFTiAgICAgICAgICAweDAwMDA3MDAwCS8vIFJXIFsxNDoxMl0KLSNkZWZpbmUgIEZMRF9JMkNfU0FERFJfSU5DICAgICAgICAgMHgwMDAwMDgwMAkvLyBSVyBbMTFdCi0JCQkJCQkgLy8gUk8gWzEwOjldIHJlc2VydmVkCi0jZGVmaW5lICBGTERfSTJDX1NBRERSX0xFTiAgICAgICAgIDB4MDAwMDAzMDAJLy8gUlcgWzk6OF0KLQkJCQkJCSAvLyBSTyBbNzo2XSByZXNlcnZlZAotI2RlZmluZSAgRkxEX0kyQ19TT0ZUICAgICAgICAgICAgICAweDAwMDAwMDIwCS8vIFJXIFs1XQotI2RlZmluZSAgRkxEX0kyQ19OT1NUT1AgICAgICAgICAgICAweDAwMDAwMDEwCS8vIFJXIFs0XQotI2RlZmluZSAgRkxEX0kyQ19FWFRFTkQgICAgICAgICAgICAweDAwMDAwMDA4CS8vIFJXIFszXQotI2RlZmluZSAgRkxEX0kyQ19TWU5DICAgICAgICAgICAgICAweDAwMDAwMDA0CS8vIFJXIFsyXQotI2RlZmluZSAgRkxEX0kyQ19SRUFEX1NBICAgICAgICAgICAweDAwMDAwMDAyCS8vIFJXIFsxXQotI2RlZmluZSAgRkxEX0kyQ19SRUFEX1dSTiAgICAgICAgICAweDAwMDAwMDAxCS8vIFJXIFswXQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEkyQzFfQ1RSTCAgICAgICAgICAgICAgICAgMHgxODAwMDgJLyogSTJDICMxIGNvbnRyb2wgKi8KKyNkZWZpbmUgIEZMRF9JMkNfUEVSSU9EICAgICAgICAgICAgMHhGRjAwMDAwMAkvKiBSVyBbMzE6MjRdICovCisjZGVmaW5lICBGTERfSTJDX1NDTF9JTiAgICAgICAgICAgIDB4MDAyMDAwMDAJLyogUlcgWzIxXSAqLworI2RlZmluZSAgRkxEX0kyQ19TREFfSU4gICAgICAgICAgICAweDAwMTAwMDAwCS8qIFJXIFsyMF0gKi8KKwkJCQkJCSAvKiBSTyBbMTk6MThdIHJlc2VydmVkICovCisjZGVmaW5lICBGTERfSTJDX1NDTF9PVVQgICAgICAgICAgIDB4MDAwMjAwMDAJLyogUlcgWzE3XSAqLworI2RlZmluZSAgRkxEX0kyQ19TREFfT1VUICAgICAgICAgICAweDAwMDEwMDAwCS8qIFJXIFsxNl0gKi8KKwkJCQkJCSAvKiBSTyBbMTVdIHJlc2VydmVkICovCisjZGVmaW5lICBGTERfSTJDX0RBVEFfTEVOICAgICAgICAgIDB4MDAwMDcwMDAJLyogUlcgWzE0OjEyXSAqLworI2RlZmluZSAgRkxEX0kyQ19TQUREUl9JTkMgICAgICAgICAweDAwMDAwODAwCS8qIFJXIFsxMV0gKi8KKwkJCQkJCSAvKiBSTyBbMTA6OV0gcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgIEZMRF9JMkNfU0FERFJfTEVOICAgICAgICAgMHgwMDAwMDMwMAkvKiBSVyBbOTo4XSAqLworCQkJCQkJIC8qIFJPIFs3OjZdIHJlc2VydmVkICovCisjZGVmaW5lICBGTERfSTJDX1NPRlQgICAgICAgICAgICAgIDB4MDAwMDAwMjAJLyogUlcgWzVdICovCisjZGVmaW5lICBGTERfSTJDX05PU1RPUCAgICAgICAgICAgIDB4MDAwMDAwMTAJLyogUlcgWzRdICovCisjZGVmaW5lICBGTERfSTJDX0VYVEVORCAgICAgICAgICAgIDB4MDAwMDAwMDgJLyogUlcgWzNdICovCisjZGVmaW5lICBGTERfSTJDX1NZTkMgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogUlcgWzJdICovCisjZGVmaW5lICBGTERfSTJDX1JFQURfU0EgICAgICAgICAgIDB4MDAwMDAwMDIJLyogUlcgWzFdICovCisjZGVmaW5lICBGTERfSTJDX1JFQURfV1JOICAgICAgICAgIDB4MDAwMDAwMDEJLyogUlcgWzBdICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEkyQzFfUkRBVEEgICAgICAgICAgICAgICAgMHgxODAwMEMJLy8gSTJDICMxIHJlYWQgZGF0YQotI2RlZmluZSAgRkxEX0kyQ19SREFUQSAgICAgICAgICAgICAweEZGRkZGRkZGCS8vIFJPIFszMTowXQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEkyQzFfUkRBVEEgICAgICAgICAgICAgICAgMHgxODAwMEMJLyogSTJDICMxIHJlYWQgZGF0YSAqLworI2RlZmluZSAgRkxEX0kyQ19SREFUQSAgICAgICAgICAgICAweEZGRkZGRkZGCS8qIFJPIFszMTowXSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMxX1NUQVQgICAgICAgICAgICAgICAgIDB4MTgwMDEwCS8vIEkyQyAjMSBzdGF0dXMKLSNkZWZpbmUgIEZMRF9JMkNfWEZFUl9JTl9QUk9HICAgICAgMHgwMDAwMDAwMgkvLyBSTyBbMV0KLSNkZWZpbmUgIEZMRF9JMkNfUkFDSyAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvLyBSTyBbMF0KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBJMkMxX1NUQVQgICAgICAgICAgICAgICAgIDB4MTgwMDEwCS8qIEkyQyAjMSBzdGF0dXMgKi8KKyNkZWZpbmUgIEZMRF9JMkNfWEZFUl9JTl9QUk9HICAgICAgMHgwMDAwMDAwMgkvKiBSTyBbMV0gKi8KKyNkZWZpbmUgIEZMRF9JMkNfUkFDSyAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBSTyBbMF0gKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gSTJDICMyCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMyX0FERFIgICAgICAgICAgICAgICAgIDB4MTkwMDAwCS8vIEkyQyAjMiBhZGRyZXNzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogSTJDICMyICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDMl9BRERSICAgICAgICAgICAgICAgICAweDE5MDAwMAkvKiBJMkMgIzIgYWRkcmVzcyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMyX1dEQVRBICAgICAgICAgICAgICAgIDB4MTkwMDA0CS8vIEkyQyAjMiB3cml0ZSBkYXRhCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDMl9XREFUQSAgICAgICAgICAgICAgICAweDE5MDAwNAkvKiBJMkMgIzIgd3JpdGUgZGF0YSAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMyX0NUUkwgICAgICAgICAgICAgICAgIDB4MTkwMDA4CS8vIEkyQyAjMiBjb250cm9sCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDMl9DVFJMICAgICAgICAgICAgICAgICAweDE5MDAwOAkvKiBJMkMgIzIgY29udHJvbCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBJMkMyX1JEQVRBICAgICAgICAgICAgICAgIDB4MTkwMDBDCS8vIEkyQyAjMiByZWFkIGRhdGEKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBJMkMyX1JEQVRBICAgICAgICAgICAgICAgIDB4MTkwMDBDCS8qIEkyQyAjMiByZWFkIGRhdGEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgSTJDMl9TVEFUICAgICAgICAgICAgICAgICAweDE5MDAxMAkvLyBJMkMgIzIgc3RhdHVzCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDMl9TVEFUICAgICAgICAgICAgICAgICAweDE5MDAxMAkvKiBJMkMgIzIgc3RhdHVzICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEkyQyAjMwotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgSTJDM19BRERSICAgICAgICAgICAgICAgICAweDFBMDAwMAkvLyBJMkMgIzMgYWRkcmVzcworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEkyQyAjMyAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEkyQzNfQUREUiAgICAgICAgICAgICAgICAgMHgxQTAwMDAJLyogSTJDICMzIGFkZHJlc3MgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgSTJDM19XREFUQSAgICAgICAgICAgICAgICAweDFBMDAwNAkvLyBJMkMgIzMgd3JpdGUgZGF0YQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEkyQzNfV0RBVEEgICAgICAgICAgICAgICAgMHgxQTAwMDQJLyogSTJDICMzIHdyaXRlIGRhdGEgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgSTJDM19DVFJMICAgICAgICAgICAgICAgICAweDFBMDAwOAkvLyBJMkMgIzMgY29udHJvbAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEkyQzNfQ1RSTCAgICAgICAgICAgICAgICAgMHgxQTAwMDgJLyogSTJDICMzIGNvbnRyb2wgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgSTJDM19SREFUQSAgICAgICAgICAgICAgICAweDFBMDAwQwkvLyBJMkMgIzMgcmVhZCBkYXRhCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSAgSTJDM19SREFUQSAgICAgICAgICAgICAgICAweDFBMDAwQwkvKiBJMkMgIzMgcmVhZCBkYXRhICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIEkyQzNfU1RBVCAgICAgICAgICAgICAgICAgMHgxQTAwMTAJLy8gSTJDICMzIHN0YXR1cworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIEkyQzNfU1RBVCAgICAgICAgICAgICAgICAgMHgxQTAwMTAJLyogSTJDICMzIHN0YXR1cyAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBVQVJUCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBVQVJUX0NUTCAgICAgICAgICAgICAgICAgIDB4MUIwMDAwCS8vIFVBUlQgQ29udHJvbCBSZWdpc3RlcgotI2RlZmluZSAgRkxEX0xPT1BfQkFDS19FTiAgICAgICAgICAoMSA8PCA3KQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1JYX1RSR19TWiAgICAgICAgICAgICAoMyA8PCAyKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1JYX0VOICAgICAgICAgICAgICAgICAoMSA8PCAxKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1RYX0VOICAgICAgICAgICAgICAgICAoMSA8PCAwKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFVBUlQgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBVQVJUX0NUTCAgICAgICAgICAgICAgICAgIDB4MUIwMDAwCS8qIFVBUlQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgRkxEX0xPT1BfQkFDS19FTiAgICAgICAgICAoMSA8PCA3KQkvKiBSVyBmaWVsZCAtIGRlZmF1bHQgMCAqLworI2RlZmluZSAgRkxEX1JYX1RSR19TWiAgICAgICAgICAgICAoMyA8PCAyKQkvKiBSVyBmaWVsZCAtIGRlZmF1bHQgMCAqLworI2RlZmluZSAgRkxEX1JYX0VOICAgICAgICAgICAgICAgICAoMSA8PCAxKQkvKiBSVyBmaWVsZCAtIGRlZmF1bHQgMCAqLworI2RlZmluZSAgRkxEX1RYX0VOICAgICAgICAgICAgICAgICAoMSA8PCAwKQkvKiBSVyBmaWVsZCAtIGRlZmF1bHQgMCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBVQVJUX0JSRCAgICAgICAgICAgICAgICAgIDB4MUIwMDA0CS8vIFVBUlQgQmF1ZCBSYXRlIERpdmlzb3IKLSNkZWZpbmUgIEZMRF9CUkQgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMHgxOTcKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBVQVJUX0JSRCAgICAgICAgICAgICAgICAgIDB4MUIwMDA0CS8qIFVBUlQgQmF1ZCBSYXRlIERpdmlzb3IgKi8KKyNkZWZpbmUgIEZMRF9CUkQgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgkvKiBSVyBmaWVsZCAtIGRlZmF1bHQgMHgxOTcgKi8KIAotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSAgVUFSVF9EQlVGICAgICAgICAgICAgICAgICAweDFCMDAwOAkvLyBVQVJUIFR4L1J4IERhdGEgQnVGRmVyCi0jZGVmaW5lICBGTERfREIgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYJLy8gUlcgZmllbGQgLSBkZWZhdWx0IDAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBVQVJUX0RCVUYgICAgICAgICAgICAgICAgIDB4MUIwMDA4CS8qIFVBUlQgVHgvUnggRGF0YSBCdUZGZXIgKi8KKyNkZWZpbmUgIEZMRF9EQiAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgkvKiBSVyBmaWVsZCAtIGRlZmF1bHQgMCAqLwogCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lICBVQVJUX0lTUiAgICAgICAgICAgICAgICAgIDB4MUIwMDBDCS8vIFVBUlQgSW50ZXJydXB0IFN0YXR1cwotI2RlZmluZSAgRkxEX1JYRF9USU1FT1VUX0VOICAgICAgICAoMSA8PCA3KQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX0ZSTV9FUlJfRU4gICAgICAgICAgICAoMSA8PCA2KQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1JYRF9SRFlfRU4gICAgICAgICAgICAoMSA8PCA1KQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1RYRF9FTVBUWV9FTiAgICAgICAgICAoMSA8PCA0KQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1JYRF9PVkVSRkxPVyAgICAgICAgICAoMSA8PCAzKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX0ZSTV9FUlIgICAgICAgICAgICAgICAoMSA8PCAyKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1JYRF9SRFkgICAgICAgICAgICAgICAoMSA8PCAxKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAotI2RlZmluZSAgRkxEX1RYRF9FTVBUWSAgICAgICAgICAgICAoMSA8PCAwKQkvLyBSVyBmaWVsZCAtIGRlZmF1bHQgMAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgIFVBUlRfSVNSICAgICAgICAgICAgICAgICAgMHgxQjAwMEMJLyogVUFSVCBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lICBGTERfUlhEX1RJTUVPVVRfRU4gICAgICAgICgxIDw8IDcpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfRlJNX0VSUl9FTiAgICAgICAgICAgICgxIDw8IDYpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfUlhEX1JEWV9FTiAgICAgICAgICAgICgxIDw8IDUpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfVFhEX0VNUFRZX0VOICAgICAgICAgICgxIDw8IDQpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfUlhEX09WRVJGTE9XICAgICAgICAgICgxIDw8IDMpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfRlJNX0VSUiAgICAgICAgICAgICAgICgxIDw8IDIpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfUlhEX1JEWSAgICAgICAgICAgICAgICgxIDw8IDEpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfVFhEX0VNUFRZICAgICAgICAgICAgICgxIDw8IDApCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgIFVBUlRfQ05UICAgICAgICAgICAgICAgICAgMHgxQjAwMTAJLy8gVUFSVCBUeC9SeCBGSUZPIEJ5dGUgQ291bnQKLSNkZWZpbmUgIEZMRF9UWERfQ05UICAgICAgICAgICAgICAgKDB4MUYgPDwgOCkJLy8gUlcgZmllbGQgLSBkZWZhdWx0IDAKLSNkZWZpbmUgIEZMRF9SWERfQ05UICAgICAgICAgICAgICAgKDB4MUYgPDwgMCkJLy8gUlcgZmllbGQgLSBkZWZhdWx0IDAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lICBVQVJUX0NOVCAgICAgICAgICAgICAgICAgIDB4MUIwMDEwCS8qIFVBUlQgVHgvUnggRklGTyBCeXRlIENvdW50ICovCisjZGVmaW5lICBGTERfVFhEX0NOVCAgICAgICAgICAgICAgICgweDFGIDw8IDgpCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCisjZGVmaW5lICBGTERfUlhEX0NOVCAgICAgICAgICAgICAgICgweDFGIDw8IDApCS8qIFJXIGZpZWxkIC0gZGVmYXVsdCAwICovCiAKLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIE1vdGlvbiBEZXRlY3Rpb24KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBNb3Rpb24gRGV0ZWN0aW9uICovCiAjZGVmaW5lICBNRF9DSDBfR1JJRF9CTE9DS19ZQ05UICAgIDB4MTcwMDE0CiAjZGVmaW5lICBNRF9DSDFfR1JJRF9CTE9DS19ZQ05UICAgIDB4MTcwMDk0CiAjZGVmaW5lICBNRF9DSDJfR1JJRF9CTE9DS19ZQ05UICAgIDB4MTcwMTE0CkBAIC0xNTg5LDQgKzE1ODksNCBAQAogI2RlZmluZSBQSVhFTF9FTkdJTkVfVklQMSAwCiAjZGVmaW5lIFBJWEVMX0VOR0lORV9WSVAyIDEKIAotI2VuZGlmIC8vQXRoZW5hX1JFR0lTVEVSUworI2VuZGlmIC8qIEF0aGVuYV9SRUdJU1RFUlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1zcmFtLmgKaW5kZXggYmQ2NzdlZS4uNWYwNWQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1zcmFtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1zcmFtLmgKQEAgLTIzLDM0ICsyMywzNCBAQAogI2lmbmRlZiBfX0FUSEVOQV9TUkFNX0hfXwogI2RlZmluZSBfX0FUSEVOQV9TUkFNX0hfXwogCi0vLyNkZWZpbmUgUlhfU1JBTV9TVEFSVF9TSVpFICAgICAgICA9IDA7ICAvLyAgU3RhcnQgb2YgcmVzZXJ2ZWQgU1JBTQotI2RlZmluZSBWSURfQ01EU19TSVpFICAgICAgICAgICAgIDgwCS8vICBWaWRlbyBDTURTIHNpemUgaW4gYnl0ZXMKLSNkZWZpbmUgQVVESU9fQ01EU19TSVpFICAgICAgICAgICA4MAkvLyAgQVVESU8gQ01EUyBzaXplIGluIGJ5dGVzCi0jZGVmaW5lIE1CSUZfQ01EU19TSVpFICAgICAgICAgICAgODAJLy8gIE1CSUYgIENNRFMgc2l6ZSBpbiBieXRlcworLyogI2RlZmluZSBSWF9TUkFNX1NUQVJUX1NJWkUgICAgICAgID0gMDsgIC8vICBTdGFydCBvZiByZXNlcnZlZCBTUkFNICovCisjZGVmaW5lIFZJRF9DTURTX1NJWkUgICAgICAgICAgICAgODAJLyogVmlkZW8gQ01EUyBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIEFVRElPX0NNRFNfU0laRSAgICAgICAgICAgODAJLyogQVVESU8gQ01EUyBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIE1CSUZfQ01EU19TSVpFICAgICAgICAgICAgODAJLyogTUJJRiAgQ01EUyBzaXplIGluIGJ5dGVzICovCiAKLS8vI2RlZmluZSBSWF9TUkFNX1BPT0xfU1RBUlRfU0laRSAgID0gMDsgIC8vICBTdGFydCBvZiB1c2VhYmxlIFJYIFNSQU0gZm9yIGJ1ZmZlcnMKLSNkZWZpbmUgVklEX0lRX1NJWkUgICAgICAgICAgICAgICA2NAkvLyAgVklEIGluc3RydWN0aW9uIHF1ZXVlIHNpemUgaW4gYnl0ZXMKKy8qICNkZWZpbmUgUlhfU1JBTV9QT09MX1NUQVJUX1NJWkUgICA9IDA7ICAvLyAgU3RhcnQgb2YgdXNlYWJsZSBSWCBTUkFNIGZvciBidWZmZXJzICovCisjZGVmaW5lIFZJRF9JUV9TSVpFICAgICAgICAgICAgICAgNjQJLyogVklEIGluc3RydWN0aW9uIHF1ZXVlIHNpemUgaW4gYnl0ZXMgKi8KICNkZWZpbmUgTUJJRl9JUV9TSVpFICAgICAgICAgICAgICA2NAotI2RlZmluZSBBVURJT19JUV9TSVpFICAgICAgICAgICAgIDY0CS8vICBBVUQgaW5zdHJ1Y3Rpb24gcXVldWUgc2l6ZSBpbiBieXRlcworI2RlZmluZSBBVURJT19JUV9TSVpFICAgICAgICAgICAgIDY0CS8qIEFVRCBpbnN0cnVjdGlvbiBxdWV1ZSBzaXplIGluIGJ5dGVzICovCiAKLSNkZWZpbmUgVklEX0NEVF9TSVpFICAgICAgICAgICAgICA2NAkvLyAgVklEIGNsdXN0ZXIgZGVzY3JpcHRvciB0YWJsZSBzaXplIGluIGJ5dGVzCi0jZGVmaW5lIE1CSUZfQ0RUX1NJWkUgICAgICAgICAgICAgNjQJLy8gIE1CSUYvSEJJIGNsdXN0ZXIgZGVzY3JpcHRvciB0YWJsZSBzaXplIGluIGJ5dGVzCi0jZGVmaW5lIEFVRElPX0NEVF9TSVpFICAgICAgICAgICAgNDgJLy8gIEFVRCBjbHVzdGVyIGRlc2NyaXB0b3IgdGFibGUgc2l6ZSBpbiBieXRlcworI2RlZmluZSBWSURfQ0RUX1NJWkUgICAgICAgICAgICAgIDY0CS8qIFZJRCBjbHVzdGVyIGRlc2NyaXB0b3IgdGFibGUgc2l6ZSBpbiBieXRlcyAqLworI2RlZmluZSBNQklGX0NEVF9TSVpFICAgICAgICAgICAgIDY0CS8qIE1CSUYvSEJJIGNsdXN0ZXIgZGVzY3JpcHRvciB0YWJsZSBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIEFVRElPX0NEVF9TSVpFICAgICAgICAgICAgNDgJLyogQVVEIGNsdXN0ZXIgZGVzY3JpcHRvciB0YWJsZSBzaXplIGluIGJ5dGVzICovCiAKLS8vI2RlZmluZSBSWF9TUkFNX1BPT0xfRlJFRV9TSVpFICAgID0gMTY7IC8vICBTdGFydCBvZiBhdmFpbGFibGUgUlggU1JBTQotLy8jZGVmaW5lIFJYX1NSQU1fRU5EX1NJWkUgICAgICAgICAgPSAwOyAgLy8gIEVuZCBvZiBSWCBTUkFNCisvKiAjZGVmaW5lIFJYX1NSQU1fUE9PTF9GUkVFX1NJWkUgICAgPSAxNjsgLy8gIFN0YXJ0IG9mIGF2YWlsYWJsZSBSWCBTUkFNICovCisvKiAjZGVmaW5lIFJYX1NSQU1fRU5EX1NJWkUgICAgICAgICAgPSAwOyAgLy8gIEVuZCBvZiBSWCBTUkFNICovCiAKLS8vI2RlZmluZSBUWF9TUkFNX1BPT0xfU1RBUlRfU0laRSAgID0gMDsgIC8vICBTdGFydCBvZiB0cmFuc21pdCBwb29sIFNSQU0KLS8vI2RlZmluZSBNU0lfREFUQV9TSVpFICAgICAgICAgICAgID0gNjQ7IC8vICBSZXNlcnZlZCAoTVNJIERhdGEsIFJJU0Mgd29ya2luZyBzdG9yYQorLyogI2RlZmluZSBUWF9TUkFNX1BPT0xfU1RBUlRfU0laRSAgID0gMDsgIC8vICBTdGFydCBvZiB0cmFuc21pdCBwb29sIFNSQU0gKi8KKy8qICNkZWZpbmUgTVNJX0RBVEFfU0laRSAgICAgICAgICAgICA9IDY0OyAvLyAgUmVzZXJ2ZWQgKE1TSSBEYXRhLCBSSVNDIHdvcmtpbmcgc3RvcmEgKi8KIAotI2RlZmluZSBWSURfQ0xVU1RFUl9TSVpFICAgICAgICAgIDE0NDAJLy8gIFZJRCBjbHVzdGVyIGRhdGEgbGluZQotI2RlZmluZSBBVURJT19DTFVTVEVSX1NJWkUgICAgICAgIDEyOAkvLyAgQVVESU8gY2x1c3RlciBkYXRhIGxpbmUKLSNkZWZpbmUgTUJJRl9DTFVTVEVSX1NJWkUgICAgICAgICAxNDQwCS8vICBNQklGL0hCSSBjbHVzdGVyIGRhdGEgbGluZQorI2RlZmluZSBWSURfQ0xVU1RFUl9TSVpFICAgICAgICAgIDE0NDAJLyogVklEIGNsdXN0ZXIgZGF0YSBsaW5lICovCisjZGVmaW5lIEFVRElPX0NMVVNURVJfU0laRSAgICAgICAgMTI4CS8qIEFVRElPIGNsdXN0ZXIgZGF0YSBsaW5lICovCisjZGVmaW5lIE1CSUZfQ0xVU1RFUl9TSVpFICAgICAgICAgMTQ0MAkvKiBNQklGL0hCSSBjbHVzdGVyIGRhdGEgbGluZSAqLwogCi0vLyNkZWZpbmUgVFhfU1JBTV9QT09MX0ZSRUVfU0laRSAgICA9IDcwNDsgICAgLy8gIFN0YXJ0IG9mIGF2YWlsYWJsZSBUWCBTUkFNCi0vLyNkZWZpbmUgVFhfU1JBTV9FTkRfU0laRSAgICAgICAgICA9IDA7ICAgICAgLy8gIEVuZCBvZiBUWCBTUkFNCisvKiAjZGVmaW5lIFRYX1NSQU1fUE9PTF9GUkVFX1NJWkUgICAgPSA3MDQ7ICAgIC8vICBTdGFydCBvZiBhdmFpbGFibGUgVFggU1JBTSAqLworLyogI2RlZmluZSBUWF9TUkFNX0VORF9TSVpFICAgICAgICAgID0gMDsgICAgICAvLyAgRW5kIG9mIFRYIFNSQU0gKi8KIAotLy8gUmVjZWl2ZSBTUkFNCisvKiBSZWNlaXZlIFNSQU0gKi8KICNkZWZpbmUgUlhfU1JBTV9TVEFSVCAgICAgICAgICAgICAweDEwMDAwCiAjZGVmaW5lIFZJRF9BX0RPV05fQ01EUyAgICAgICAgICAgMHgxMDAwMAogI2RlZmluZSBWSURfQl9ET1dOX0NNRFMgICAgICAgICAgIDB4MTAwNTAKQEAgLTc4LDkgKzc4LDkgQEAKICNkZWZpbmUgQVVEX0VfVVBfQ01EUyAgICAgICAgICAgICAweDEwNzMwCiAjZGVmaW5lIE1CSUZfQV9ET1dOX0NNRFMgICAgICAgICAgMHgxMDc4MAogI2RlZmluZSBNQklGX0JfRE9XTl9DTURTICAgICAgICAgIDB4MTA3RDAKLSNkZWZpbmUgRE1BX1NDUkFUQ0hfUEFEICAgICAgICAgICAweDEwODIwCS8vIFNjcmF0Y2ggcGFkIGFyZWEgZnJvbSAweDEwODIwIHRvIDB4MTBCNDAKKyNkZWZpbmUgRE1BX1NDUkFUQ0hfUEFEICAgICAgICAgICAweDEwODIwCS8qIFNjcmF0Y2ggcGFkIGFyZWEgZnJvbSAweDEwODIwIHRvIDB4MTBCNDAgKi8KIAotLy8jZGVmaW5lIFJYX1NSQU1fUE9PTF9TVEFSVCAgICAgICAgPSAweDEwNUIwOworLyogI2RlZmluZSBSWF9TUkFNX1BPT0xfU1RBUlQgICAgICAgID0gMHgxMDVCMDsgKi8KIAogI2RlZmluZSBWSURfQV9JUSAgICAgICAgICAgICAgICAgIDB4MTEwMDAKICNkZWZpbmUgVklEX0JfSVEgICAgICAgICAgICAgICAgICAweDExMDQwCkBAIC0xMTgsNyArMTE4LDcgQEAKICNkZWZpbmUgTUJJRl9BX0NEVCAgICAgICAgICAgICAgICAweDEwQzAwCiAjZGVmaW5lIE1CSUZfQl9DRFQgICAgICAgICAgICAgICAgMHgxMENDMAogCi0vLyBDbHVzdGVyIEJ1ZmZlciBmb3IgUlgKKy8qIENsdXN0ZXIgQnVmZmVyIGZvciBSWCAqLwogI2RlZmluZSBWSURfQV9VUF9DTFVTVEVSXzEgICAgICAgIDB4MTE0MDAKICNkZWZpbmUgVklEX0FfVVBfQ0xVU1RFUl8yICAgICAgICAweDExOUEwCiAjZGVmaW5lIFZJRF9BX1VQX0NMVVNURVJfMyAgICAgICAgMHgxMUY0MApAQCAtMTc4LDkgKzE3OCw5IEBACiAjZGVmaW5lIFJYX1NSQU1fUE9PTF9GUkVFICAgICAgICAgMHgxQ0UwMAogI2RlZmluZSBSWF9TUkFNX0VORCAgICAgICAgICAgICAgIDB4MUQwMDAKIAotLy8gRnJlZSBSZWNlaXZlIFNSQU0gICAgMTQ0IEJ5dGVzCisvKiBGcmVlIFJlY2VpdmUgU1JBTSAgICAxNDQgQnl0ZXMgKi8KIAotLy8gVHJhbnNtaXQgU1JBTQorLyogVHJhbnNtaXQgU1JBTSAqLwogI2RlZmluZSBUWF9TUkFNX1BPT0xfU1RBUlQgICAgICAgIDB4MDAwMDAKIAogI2RlZmluZSBWSURfQV9ET1dOX0NMVVNURVJfMSAgICAgIDB4MDAwNDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jCmluZGV4IDM0M2RmNjYuLmQxMmRiYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS1jaDIuYwpAQCAtODQsNyArODQsNyBAQAogewogCXVuc2lnbmVkIGludCBsaW5lLCBpOwogCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPQotCSAgICAmZGV2LT5zcmFtX2NoYW5uZWxzW2Rldi0+X2NoYW5uZWwyX3Vwc3RyZWFtX3NlbGVjdF07CisJICAgZGV2LT5jaGFubmVsc1tkZXYtPl9jaGFubmVsMl91cHN0cmVhbV9zZWxlY3RdLnNyYW1fY2hhbm5lbHM7CiAJaW50IGRpc3RfYmV0d25fc3RhcnRzID0gYnBsICogMjsKIAogCS8qIHN5bmMgaW5zdHJ1Y3Rpb24gKi8KQEAgLTExMCw4ICsxMTAsMTEgQEAKIAkJCW9mZnNldCArPSBkaXN0X2JldHduX3N0YXJ0czsKIAkJfQogCi0JCS8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBGSUZPIGFmdGVyIHRoZSBmaXJzdCA0IGxpbmVzCi0JCS8vIEZvciB0aGUgdXBzdHJlYW0gdmlkZW8gY2hhbm5lbCwgdGhlIHJpc2MgZW5naW5lIHdpbGwgZW5hYmxlIHRoZSBGSUZPLgorCSAgICAgICAvKgorCQkgY2hlY2sgaWYgd2UgbmVlZCB0byBlbmFibGUgdGhlIEZJRk8gYWZ0ZXIgdGhlIGZpcnN0IDQgbGluZXMKKwkJICBGb3IgdGhlIHVwc3RyZWFtIHZpZGVvIGNoYW5uZWwsIHRoZSByaXNjIGVuZ2luZSB3aWxsIGVuYWJsZQorCQkgIHRoZSBGSUZPLgorCSAgICAgICAqLwogCQlpZiAoZmlmb19lbmFibGUgJiYgbGluZSA9PSAzKSB7CiAJCQkqKHJwKyspID0gUklTQ19XUklURUNSOwogCQkJKihycCsrKSA9IHNyYW1fY2gtPmRtYV9jdGw7CkBAIC0xMzAsNyArMTMzLDcgQEAKIHsKIAlfX2xlMzIgKnJwOwogCWludCBmaWZvX2VuYWJsZSA9IDA7Ci0JaW50IHNpbmdsZWZpZWxkX2xpbmVzID0gbGluZXMgPj4gMTsJLy9nZXQgbGluZSBjb3VudCBmb3Igc2luZ2xlIGZpZWxkCisgICAgICAgaW50IHNpbmdsZWZpZWxkX2xpbmVzID0gbGluZXMgPj4gMTsgLypnZXQgbGluZSBjb3VudCBmb3Igc2luZ2xlIGZpZWxkICovCiAJaW50IG9kZF9udW1fbGluZXMgPSBzaW5nbGVmaWVsZF9saW5lczsKIAlpbnQgZnJhbWUgPSAwOwogCWludCBmcmFtZV9zaXplID0gMDsKQEAgLTE3NCw3ICsxNzcsNyBAQAogCiAJCWZpZm9fZW5hYmxlID0gRklGT19ESVNBQkxFOwogCi0JCS8vRXZlbiBmaWVsZAorCSAgICAgICAvKiBFdmVuIGZpZWxkICovCiAJCXJwID0gY3gyNTgyMV9yaXNjX2ZpZWxkX3Vwc3RyZWFtX2NoMihkZXYsIHJwLAogCQkJCQkJICAgICBkZXYtPgogCQkJCQkJICAgICBfZGF0YV9idWZfcGh5c19hZGRyX2NoMiArCkBAIC0xOTIsNyArMTk1LDEwIEBACiAJCQlyaXNjX3BoeXNfanVtcF9hZGRyID0gZGV2LT5fZG1hX3BoeXNfc3RhcnRfYWRkcl9jaDI7CiAJCX0KIAotCQkvLyBMb29wIHRvIDJuZEZyYW1lUklTQyBvciB0byBTdGFydCBvZiBSaXNjIHByb2dyYW0gJiBnZW5lcmF0ZSBJUlEKKwkgICAgICAgLyoKKwkJICBMb29wIHRvIDJuZEZyYW1lUklTQyBvciB0byBTdGFydCBvZgorCQkgIFJpc2MgcHJvZ3JhbSAmIGdlbmVyYXRlIElSUQorCSAgICAgICAqLwogCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgcmlzY19mbGFnKTsKIAkJKihycCsrKSA9IGNwdV90b19sZTMyKHJpc2NfcGh5c19qdW1wX2FkZHIpOwogCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoMCk7CkBAIC0yMDQsNyArMjEwLDcgQEAKIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldikKIHsKIAlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0KLQkgICAgJmRldi0+c3JhbV9jaGFubmVsc1tWSURfVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0pdOworCSAgIGRldi0+Y2hhbm5lbHNbVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9KXS5zcmFtX2NoYW5uZWxzOwogCXUzMiB0bXAgPSAwOwogCiAJaWYgKCFkZXYtPl9pc19ydW5uaW5nX2NoMikgewpAQCAtMjEyLDE1ICsyMTgsMTUgQEAKIAkJICAgICgiY3gyNTgyMTogTm8gdmlkZW8gZmlsZSBpcyBjdXJyZW50bHkgcnVubmluZyBzbyByZXR1cm4hXG4iKTsKIAkJcmV0dXJuOwogCX0KLQkvL0Rpc2FibGUgUklTQyBpbnRlcnJ1cHRzCisgICAgICAgLyogRGlzYWJsZSBSSVNDIGludGVycnVwdHMgKi8KIAl0bXAgPSBjeF9yZWFkKHNyYW1fY2gtPmludF9tc2spOwogCWN4X3dyaXRlKHNyYW1fY2gtPmludF9tc2ssIHRtcCAmIH5faW50cl9tc2spOwogCi0JLy9UdXJuIE9GRiByaXNjIGFuZCBmaWZvCisgICAgICAgLyogVHVybiBPRkYgcmlzYyBhbmQgZmlmbyAqLwogCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7CiAJY3hfd3JpdGUoc3JhbV9jaC0+ZG1hX2N0bCwgdG1wICYgfihGTERfVklEX0ZJRk9fRU4gfCBGTERfVklEX1JJU0NfRU4pKTsKIAotCS8vQ2xlYXIgZGF0YSBidWZmZXIgbWVtb3J5CisgICAgICAgLyogQ2xlYXIgZGF0YSBidWZmZXIgbWVtb3J5ICovCiAJaWYgKGRldi0+X2RhdGFfYnVmX3ZpcnRfYWRkcl9jaDIpCiAJCW1lbXNldChkZXYtPl9kYXRhX2J1Zl92aXJ0X2FkZHJfY2gyLCAwLAogCQkgICAgICAgZGV2LT5fZGF0YV9idWZfc2l6ZV9jaDIpOwpAQCAtMzcxLDggKzM3Nyw4IEBACiAJfQogCiAJY3gyNTgyMV9nZXRfZnJhbWVfY2gyKGRldiwKLQkJCSAgICAgICZkZXYtPnNyYW1fY2hhbm5lbHNbZGV2LT4KLQkJCQkJCSAgX2NoYW5uZWwyX3Vwc3RyZWFtX3NlbGVjdF0pOworCQkJICAgICBkZXYtPmNoYW5uZWxzW2Rldi0+CisJCQkgICAgICAgX2NoYW5uZWwyX3Vwc3RyZWFtX3NlbGVjdF0uc3JhbV9jaGFubmVscyk7CiB9CiAKIGludCBjeDI1ODIxX29wZW5maWxlX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCkKQEAgLTQ4OCw3ICs0OTQsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvL0luaWl0aXplIGF0IHRoaXMgYWRkcmVzcyB1bnRpbCBuIGJ5dGVzIHRvIDAKKyAgICAgICAvKiBJbmlpdGl6ZSBhdCB0aGlzIGFkZHJlc3MgdW50aWwgbiBieXRlcyB0byAwICovCiAJbWVtc2V0KGRldi0+X2RtYV92aXJ0X2FkZHJfY2gyLCAwLCBkZXYtPl9yaXNjX3NpemVfY2gyKTsKIAogCWlmIChkZXYtPl9kYXRhX2J1Zl92aXJ0X2FkZHJfY2gyICE9IE5VTEwpIHsKQEAgLTQ5Niw3ICs1MDIsNyBAQAogCQkJCSAgICBkZXYtPl9kYXRhX2J1Zl92aXJ0X2FkZHJfY2gyLAogCQkJCSAgICBkZXYtPl9kYXRhX2J1Zl9waHlzX2FkZHJfY2gyKTsKIAl9Ci0JLy9Gb3IgVmlkZW8gRGF0YSBidWZmZXIgYWxsb2NhdGlvbgorICAgICAgIC8qIEZvciBWaWRlbyBEYXRhIGJ1ZmZlciBhbGxvY2F0aW9uICovCiAJZGV2LT5fZGF0YV9idWZfdmlydF9hZGRyX2NoMiA9CiAJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGNpLCBkZXYtPnVwc3RyZWFtX2RhdGFidWZfc2l6ZV9jaDIsCiAJCQkJICZkYXRhX2RtYV9hZGRyKTsKQEAgLTUwOSwxNCArNTE1LDE0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8vSW5pdGlhbGl6ZSBhdCB0aGlzIGFkZHJlc3MgdW50aWwgbiBieXRlcyB0byAwCisgICAgICAgLyogSW5pdGlhbGl6ZSBhdCB0aGlzIGFkZHJlc3MgdW50aWwgbiBieXRlcyB0byAwICovCiAJbWVtc2V0KGRldi0+X2RhdGFfYnVmX3ZpcnRfYWRkcl9jaDIsIDAsIGRldi0+X2RhdGFfYnVmX3NpemVfY2gyKTsKIAogCXJldCA9IGN4MjU4MjFfb3BlbmZpbGVfY2gyKGRldiwgc3JhbV9jaCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvL0NyZWF0aW5nIFJJU0MgcHJvZ3JhbXMKKyAgICAgICAvKiBDcmVhdGluZyBSSVNDIHByb2dyYW1zICovCiAJcmV0ID0KIAkgICAgY3gyNTgyMV9yaXNjX2J1ZmZlcl91cHN0cmVhbV9jaDIoZGV2LCBkZXYtPnBjaSwgMCwgYnBsLAogCQkJCQkgICAgIGRldi0+X2xpbmVzX2NvdW50X2NoMik7CkBAIC01MzYsNyArNTQyLDcgQEAKIAkJCQkgICB1MzIgc3RhdHVzKQogewogCXUzMiBpbnRfbXNrX3RtcDsKLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gJmRldi0+c3JhbV9jaGFubmVsc1tjaGFuX251bV07CisgICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9IGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnNyYW1fY2hhbm5lbHM7CiAJaW50IHNpbmdsZWZpZWxkX2xpbmVzID0gTlRTQ19GSUVMRF9IRUlHSFQ7CiAJaW50IGxpbmVfc2l6ZV9pbl9ieXRlcyA9IFk0MjJfTElORV9TWjsKIAlpbnQgb2RkX3Jpc2NfcHJvZ19zaXplID0gMDsKQEAgLTU0NCwxMCArNTUwLDEzIEBACiAJX19sZTMyICpycDsKIAogCWlmIChzdGF0dXMgJiBGTERfVklEX1NSQ19SSVNDMSkgewotCQkvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIG9uZSBwcm9ncmFtIHBlciBjYWxsCisJICAgICAgIC8qIFdlIHNob3VsZCBvbmx5IHByb2Nlc3Mgb25lIHByb2dyYW0gcGVyIGNhbGwgKi8KIAkJdTMyIHByb2dfY250ID0gY3hfcmVhZChjaGFubmVsLT5ncGNudCk7CiAKLQkJLy9TaW5jZSB3ZSd2ZSBpZGVudGlmaWVkIG91ciBJUlEsIGNsZWFyIG91ciBiaXRzIGZyb20gdGhlIGludGVycnVwdCBtYXNrIGFuZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycworCSAgICAgICAvKgorCQkgIFNpbmNlIHdlJ3ZlIGlkZW50aWZpZWQgb3VyIElSUSwgY2xlYXIgb3VyIGJpdHMgZnJvbSB0aGUKKwkJICBpbnRlcnJ1cHQgbWFzayBhbmQgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMKKwkgICAgICAgKi8KIAkJaW50X21za190bXAgPSBjeF9yZWFkKGNoYW5uZWwtPmludF9tc2spOwogCQljeF93cml0ZShjaGFubmVsLT5pbnRfbXNrLCBpbnRfbXNrX3RtcCAmIH5faW50cl9tc2spOwogCQljeF93cml0ZShjaGFubmVsLT5pbnRfc3RhdCwgX2ludHJfbXNrKTsKQEAgLTU4OCw3ICs1OTcsNyBAQAogCQkJCQkJCQkgICAgRklGT19ESVNBQkxFLAogCQkJCQkJCQkgICAgT0REX0ZJRUxEKTsKIAotCQkJCS8vIEp1bXAgdG8gRXZlbiBSaXNjIHByb2dyYW0gb2YgMXN0IEZyYW1lCisJCQkgICAgICAgLyogSnVtcCB0byBFdmVuIFJpc2MgcHJvZ3JhbSBvZiAxc3QgRnJhbWUgKi8KIAkJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QKTsKIAkJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIocmlzY19waHlzX2p1bXBfYWRkcik7CiAJCQkJKihycCsrKSA9IGNwdV90b19sZTMyKDApOwpAQCAtNjAzLDcgKzYxMiw3IEBACiAJCSAgICAgICBkZXYtPl9mcmFtZV9jb3VudF9jaDIpOwogCQlyZXR1cm4gLTE7CiAJfQotCS8vRWxTRSwgc2V0IHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciwgcmUtZW5hYmxlIGlycS4KKyAgICAgICAvKiBFbFNFLCBzZXQgdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyLCByZS1lbmFibGUgaXJxLiAqLwogCWludF9tc2tfdG1wID0gY3hfcmVhZChjaGFubmVsLT5pbnRfbXNrKTsKIAljeF93cml0ZShjaGFubmVsLT5pbnRfbXNrLCBpbnRfbXNrX3RtcCB8PSBfaW50cl9tc2spOwogCkBAIC02MjMsMTIgKzYzMiwxMiBAQAogCiAJY2hhbm5lbF9udW0gPSBWSURfVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0o7CiAKLQlzcmFtX2NoID0gJmRldi0+c3JhbV9jaGFubmVsc1tjaGFubmVsX251bV07CisgICAgICAgc3JhbV9jaCA9IGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9udW1dLnNyYW1fY2hhbm5lbHM7CiAKIAltc2tfc3RhdCA9IGN4X3JlYWQoc3JhbV9jaC0+aW50X21zdGF0KTsKIAl2aWRfc3RhdHVzID0gY3hfcmVhZChzcmFtX2NoLT5pbnRfc3RhdCk7CiAKLQkvLyBPbmx5IGRlYWwgd2l0aCBvdXIgaW50ZXJydXB0CisgICAgICAgLyogT25seSBkZWFsIHdpdGggb3VyIGludGVycnVwdCAqLwogCWlmICh2aWRfc3RhdHVzKSB7CiAJCWhhbmRsZWQgPQogCQkgICAgY3gyNTgyMV92aWRlb191cHN0cmVhbV9pcnFfY2gyKGRldiwgY2hhbm5lbF9udW0sCkBAIC02NTgsNyArNjY3LDEwIEBACiAJdmFsdWUgfD0gZGV2LT5faXNOVFNDX2NoMiA/IDAgOiAweDEwOwogCWN4X3dyaXRlKGNoLT52aWRfZm10X2N0bCwgdmFsdWUpOwogCi0JLy8gc2V0IG51bWJlciBvZiBhY3RpdmUgcGl4ZWxzIGluIGVhY2ggbGluZS4gRGVmYXVsdCBpcyA3MjAgcGl4ZWxzIGluIGJvdGggTlRTQyBhbmQgUEFMIGZvcm1hdAorICAgICAgIC8qCisJICBzZXQgbnVtYmVyIG9mIGFjdGl2ZSBwaXhlbHMgaW4gZWFjaCBsaW5lLiBEZWZhdWx0IGlzIDcyMAorCSAgcGl4ZWxzIGluIGJvdGggTlRTQyBhbmQgUEFMIGZvcm1hdAorICAgICAgICovCiAJY3hfd3JpdGUoY2gtPnZpZF9hY3RpdmVfY3RsMSwgd2lkdGgpOwogCiAJbnVtX2xpbmVzID0gKGhlaWdodCAvIDIpICYgMHgzRkY7CkBAIC02NzAsNyArNjgyLDcgQEAKIAogCXZhbHVlID0gKG51bV9saW5lcyA8PCAxNikgfCBvZGRfbnVtX2xpbmVzOwogCi0JLy8gc2V0IG51bWJlciBvZiBhY3RpdmUgbGluZXMgaW4gZmllbGQgMCAodG9wKSBhbmQgZmllbGQgMSAoYm90dG9tKQorICAgICAgIC8qIHNldCBudW1iZXIgb2YgYWN0aXZlIGxpbmVzIGluIGZpZWxkIDAgKHRvcCkgYW5kIGZpZWxkIDEgKGJvdHRvbSkgKi8KIAljeF93cml0ZShjaC0+dmlkX2FjdGl2ZV9jdGwyLCB2YWx1ZSk7CiAKIAljeF93cml0ZShjaC0+dmlkX2NkdF9zaXplLCBWSURfQ0RUX1NJWkUgPj4gMyk7CkBAIC02ODIsMjEgKzY5NCwyNyBAQAogCXUzMiB0bXAgPSAwOwogCWludCBlcnIgPSAwOwogCi0JLy8gNjU2L1ZJUCBTUkMgVXBzdHJlYW0gQ2hhbm5lbCBJICYgSiBhbmQgNyAtIEhvc3QgQnVzIEludGVyZmFjZSBmb3IgY2hhbm5lbCBBLUMKKyAgICAgICAvKgorCSAgNjU2L1ZJUCBTUkMgVXBzdHJlYW0gQ2hhbm5lbCBJICYgSiBhbmQgNyAtIEhvc3QgQnVzIEludGVyZmFjZQorCSAgZm9yIGNoYW5uZWwgQS1DCisgICAgICAgKi8KIAl0bXAgPSBjeF9yZWFkKFZJRF9DSF9NT0RFX1NFTCk7CiAJY3hfd3JpdGUoVklEX0NIX01PREVfU0VMLCB0bXAgfCAweDFCMDAwMUZGKTsKIAotCS8vIFNldCB0aGUgcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyBvZiB0aGUgUklTQyBwcm9ncmFtIGluIHRoZSBpbml0aWFsIHByb2dyYW0gY291bnRlcihJUEMpIG1lbWJlciBvZiB0aGUgY21kcy4KKyAgICAgICAvKgorCSAgU2V0IHRoZSBwaHlzaWNhbCBzdGFydCBhZGRyZXNzIG9mIHRoZSBSSVNDIHByb2dyYW0gaW4gdGhlIGluaXRpYWwKKwkgIHByb2dyYW0gY291bnRlcihJUEMpIG1lbWJlciBvZiB0aGUgY21kcy4KKyAgICAgICAqLwogCWN4X3dyaXRlKHNyYW1fY2gtPmNtZHNfc3RhcnQgKyAwLCBkZXYtPl9kbWFfcGh5c19hZGRyX2NoMik7Ci0JY3hfd3JpdGUoc3JhbV9jaC0+Y21kc19zdGFydCArIDQsIDApOwkvKiBSaXNjIElQQyBIaWdoIDY0IGJpdHMgNjMtMzIgKi8KKyAgICAgICBjeF93cml0ZShzcmFtX2NoLT5jbWRzX3N0YXJ0ICsgNCwgMCk7IC8qIFJpc2MgSVBDIEhpZ2ggNjQgYml0cyA2My0zMiAqLwogCiAJLyogcmVzZXQgY291bnRlciAqLwogCWN4X3dyaXRlKHNyYW1fY2gtPmdwY250X2N0bCwgMyk7CiAKLQkvLyBDbGVhciBvdXIgYml0cyBmcm9tIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLgorICAgICAgIC8qIENsZWFyIG91ciBiaXRzIGZyb20gdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuICovCiAJY3hfd3JpdGUoc3JhbV9jaC0+aW50X3N0YXQsIF9pbnRyX21zayk7CiAKLQkvL1NldCB0aGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIsIGVuYWJsZSBpcnEuCisgICAgICAgLyogU2V0IHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciwgZW5hYmxlIGlycS4gKi8KIAljeF9zZXQoUENJX0lOVF9NU0ssIGN4X3JlYWQoUENJX0lOVF9NU0spIHwgKDEgPDwgc3JhbV9jaC0+aXJxX2JpdCkpOwogCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+aW50X21zayk7CiAJY3hfd3JpdGUoc3JhbV9jaC0+aW50X21zaywgdG1wIHw9IF9pbnRyX21zayk7CkBAIC03MDksNyArNzI3LDcgQEAKIAkJICAgICAgIGRldi0+cGNpLT5pcnEpOwogCQlnb3RvIGZhaWxfaXJxOwogCX0KLQkvLyBTdGFydCB0aGUgRE1BICBlbmdpbmUKKyAgICAgICAvKiBTdGFydCB0aGUgRE1BICBlbmdpbmUgKi8KIAl0bXAgPSBjeF9yZWFkKHNyYW1fY2gtPmRtYV9jdGwpOwogCWN4X3NldChzcmFtX2NoLT5kbWFfY3RsLCB0bXAgfCBGTERfVklEX1JJU0NfRU4pOwogCkBAIC03NDAsNyArNzU4LDcgQEAKIAl9CiAKIAlkZXYtPl9jaGFubmVsMl91cHN0cmVhbV9zZWxlY3QgPSBjaGFubmVsX3NlbGVjdDsKLQlzcmFtX2NoID0gJmRldi0+c3JhbV9jaGFubmVsc1tjaGFubmVsX3NlbGVjdF07CisgICAgICAgc3JhbV9jaCA9IGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9zZWxlY3RdLnNyYW1fY2hhbm5lbHM7CiAKIAlJTklUX1dPUksoJmRldi0+X2lycV93b3JrX2VudHJ5X2NoMiwgY3gyNTgyMV92aWR1cHNfaGFuZGxlcl9jaDIpOwogCWRldi0+X2lycV9xdWV1ZXNfY2gyID0KQEAgLTc1MSw3ICs3NjksMTAgQEAKIAkJICAgICgiY3gyNTgyMTogY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoKSBmb3IgVmlkZW8gRkFJTEVEIVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQkvLyA2NTYvVklQIFNSQyBVcHN0cmVhbSBDaGFubmVsIEkgJiBKIGFuZCA3IC0gSG9zdCBCdXMgSW50ZXJmYWNlIGZvciBjaGFubmVsIEEtQworICAgICAgIC8qCisJICA2NTYvVklQIFNSQyBVcHN0cmVhbSBDaGFubmVsIEkgJiBKIGFuZCA3IC0KKwkgIEhvc3QgQnVzIEludGVyZmFjZSBmb3IgY2hhbm5lbCBBLUMKKyAgICAgICAqLwogCXRtcCA9IGN4X3JlYWQoVklEX0NIX01PREVfU0VMKTsKIAljeF93cml0ZShWSURfQ0hfTU9ERV9TRUwsIHRtcCB8IDB4MUIwMDAxRkYpOwogCkBAIC03ODcsNyArODA4LDcgQEAKIAkJICAgICAgIHN0cl9sZW5ndGggKyAxKTsKIAl9CiAKLQkvL0RlZmF1bHQgaWYgZmlsZW5hbWUgaXMgZW1wdHkgc3RyaW5nCisgICAgICAgLyogRGVmYXVsdCBpZiBmaWxlbmFtZSBpcyBlbXB0eSBzdHJpbmcgKi8KIAlpZiAoc3RyY21wKGRldi0+aW5wdXRfZmlsZW5hbWVfY2gyLCAiIikgPT0gMCkgewogCQlpZiAoZGV2LT5faXNOVFNDX2NoMikgewogCQkJZGV2LT5fZmlsZW5hbWVfY2gyID0KQEAgLTgxMiw3ICs4MzMsNyBAQAogCWRldi0+dXBzdHJlYW1fcmlzY2J1Zl9zaXplX2NoMiA9IHJpc2NfYnVmZmVyX3NpemUgKiAyOwogCWRldi0+dXBzdHJlYW1fZGF0YWJ1Zl9zaXplX2NoMiA9IGRhdGFfZnJhbWVfc2l6ZSAqIDI7CiAKLQkvL0FsbG9jYXRpbmcgYnVmZmVycyBhbmQgcHJlcGFyZSBSSVNDIHByb2dyYW0KKyAgICAgICAvKiBBbGxvY2F0aW5nIGJ1ZmZlcnMgYW5kIHByZXBhcmUgUklTQyBwcm9ncmFtICovCiAJcmV0dmFsID0KIAkgICAgY3gyNTgyMV91cHN0cmVhbV9idWZmZXJfcHJlcGFyZV9jaDIoZGV2LCBzcmFtX2NoLAogCQkJCQkJZGV2LT5fbGluZV9zaXplX2NoMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS1jaDIuaAppbmRleCA3M2ZlZWExLi42MjM0MDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmgKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgUkVTRVRfU1RBVFVTICAgICAgICAgIC0xCiAjZGVmaW5lIE5VTV9OT19PUFMgICAgICAgICAgICA1CiAKLS8vIFBBTCBhbmQgTlRTQyBsaW5lIHNpemVzIGFuZCBudW1iZXIgb2YgbGluZXMuCisvKiBQQUwgYW5kIE5UU0MgbGluZSBzaXplcyBhbmQgbnVtYmVyIG9mIGxpbmVzLiAqLwogI2RlZmluZSBXSURUSF9EMSAgICAgICAgICAgICAgNzIwCiAjZGVmaW5lIE5UU0NfTElORVNfUEVSX0ZSQU1FICA0ODAKICNkZWZpbmUgUEFMX0xJTkVTX1BFUl9GUkFNRSAgIDU3NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5jCmluZGV4IDdhM2RhZDkuLjc1NmE4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogewogCXVuc2lnbmVkIGludCBsaW5lLCBpOwogCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPQotCSAgICAmZGV2LT5zcmFtX2NoYW5uZWxzW2Rldi0+X2NoYW5uZWxfdXBzdHJlYW1fc2VsZWN0XTsKKwkgICBkZXYtPmNoYW5uZWxzW2Rldi0+X2NoYW5uZWxfdXBzdHJlYW1fc2VsZWN0XS5zcmFtX2NoYW5uZWxzOwogCWludCBkaXN0X2JldHduX3N0YXJ0cyA9IGJwbCAqIDI7CiAKIAkvKiBzeW5jIGluc3RydWN0aW9uICovCkBAIC0yNTMsNyArMjUzLDcgQEAKIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldikKIHsKIAlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0KLQkgICAgJmRldi0+c3JhbV9jaGFubmVsc1tWSURfVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0ldOworCSAgIGRldi0+Y2hhbm5lbHNbVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9JXS5zcmFtX2NoYW5uZWxzOwogCXUzMiB0bXAgPSAwOwogCiAJaWYgKCFkZXYtPl9pc19ydW5uaW5nKSB7CkBAIC0zNDYsMjAgKzM0NiwyMyBAQAogCiAJaWYgKElTX0VSUihteWZpbGUpKSB7CiAJCWNvbnN0IGludCBvcGVuX2Vycm5vID0gLVBUUl9FUlIobXlmaWxlKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpOiBFUlJPUiBvcGVuaW5nIGZpbGUoJXMpIHdpdGggZXJybm8gPSAlZCFcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZGV2LT5fZmlsZW5hbWUsIG9wZW5fZXJybm8pOworCSAgICAgICBwcmludGsoS0VSTl9FUlIKKwkJICAgIiVzKCk6IEVSUk9SIG9wZW5pbmcgZmlsZSglcykgd2l0aCBlcnJubyA9ICVkIVxuIiwKKwkJICAgX19mdW5jX18sIGRldi0+X2ZpbGVuYW1lLCBvcGVuX2Vycm5vKTsKIAkJcmV0dXJuIFBUUl9FUlIobXlmaWxlKTsKIAl9IGVsc2UgewogCQlpZiAoIShteWZpbGUtPmZfb3ApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGaWxlIGhhcyBubyBmaWxlIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZCEiLAotCQkJICAgICAgIF9fZnVuY19fKTsKKwkJICAgICAgIHByaW50ayhLRVJOX0VSUgorCQkJICAgIiVzOiBGaWxlIGhhcyBubyBmaWxlIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZCEiLAorCQkJICAgX19mdW5jX18pOwogCQkJZmlscF9jbG9zZShteWZpbGUsIE5VTEwpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAogCQlpZiAoIW15ZmlsZS0+Zl9vcC0+cmVhZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmlsZSBoYXMgbm8gUkVBRCBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCSAgICAgICBwcmludGsoS0VSTl9FUlIKKwkJCSAgICIlczogRmlsZSBoYXMgbm8gUkVBRCBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhIiwKKwkJCSAgIF9fZnVuY19fKTsKIAkJCWZpbHBfY2xvc2UobXlmaWxlLCBOVUxMKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0zODYsNyArMzg5LDggQEAKIAogCQkJaWYgKHZmc19yZWFkX3JldHZhbCA8IGxpbmVfc2l6ZSkgewogCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgIkRvbmU6IGV4aXQgJXMoKSBzaW5jZSBubyBtb3JlIGJ5dGVzIHRvIHJlYWQgZnJvbSBWaWRlbyBmaWxlLlxuIiwKKwkJCQkgICAgICAiRG9uZTogZXhpdCAlcygpIHNpbmNlIG5vIG1vcmUgYnl0ZXMgdG8gXAorCQkJCSAgICAgIHJlYWQgZnJvbSBWaWRlbyBmaWxlLlxuIiwKIAkJCQkgICAgICAgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNDExLDEzICs0MTUsMTUgQEAKIAkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjeDI1ODIxX2RldiwgX2lycV93b3JrX2VudHJ5KTsKIAogCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVJST1IgJXMoKTogc2luY2UgY29udGFpbmVyX29mKHdvcmtfc3RydWN0KSBGQUlMRUQhXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCSAgICAgICBwcmludGsoS0VSTl9FUlIKKwkJICAgIkVSUk9SICVzKCk6IHNpbmNlIGNvbnRhaW5lcl9vZih3b3JrX3N0cnVjdCkgRkFJTEVEIVxuIiwKKwkJICAgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJY3gyNTgyMV9nZXRfZnJhbWUoZGV2LAotCQkJICAmZGV2LT5zcmFtX2NoYW5uZWxzW2Rldi0+X2NoYW5uZWxfdXBzdHJlYW1fc2VsZWN0XSk7CisJCQkgZGV2LT5jaGFubmVsc1tkZXYtPl9jaGFubmVsX3Vwc3RyZWFtX3NlbGVjdF0uCisJCQkJCSAgICAgICBzcmFtX2NoYW5uZWxzKTsKIH0KIAogaW50IGN4MjU4MjFfb3BlbmZpbGUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2gpCkBAIC00MzcsMjAgKzQ0MywyMiBAQAogCiAJaWYgKElTX0VSUihteWZpbGUpKSB7CiAJCWNvbnN0IGludCBvcGVuX2Vycm5vID0gLVBUUl9FUlIobXlmaWxlKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpOiBFUlJPUiBvcGVuaW5nIGZpbGUoJXMpIHdpdGggZXJybm8gPSAlZCFcbiIsCisJICAgICAgIHByaW50ayhLRVJOX0VSUiAgIiVzKCk6IEVSUk9SIG9wZW5pbmcgZmlsZSglcykgd2l0aCBlcnJubyA9ICVkIVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBkZXYtPl9maWxlbmFtZSwgb3Blbl9lcnJubyk7CiAJCXJldHVybiBQVFJfRVJSKG15ZmlsZSk7CiAJfSBlbHNlIHsKIAkJaWYgKCEobXlmaWxlLT5mX29wKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmlsZSBoYXMgbm8gZmlsZSBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCSAgICAgICBwcmludGsoS0VSTl9FUlIKKwkJCSAgICIlczogRmlsZSBoYXMgbm8gZmlsZSBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhIiwKKwkJCSAgIF9fZnVuY19fKTsKIAkJCWZpbHBfY2xvc2UobXlmaWxlLCBOVUxMKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKIAkJaWYgKCFteWZpbGUtPmZfb3AtPnJlYWQpIHsKLQkJCXByaW50awotCQkJICAgIChLRVJOX0VSUiAiJXM6IEZpbGUgaGFzIG5vIFJFQUQgb3BlcmF0aW9ucyByZWdpc3RlcmVkISAgUmV0dXJuaW5nLiIsCisJCSAgICAgICBwcmludGsoS0VSTl9FUlIKKwkJCSAgICIlczogRmlsZSBoYXMgbm8gUkVBRCBvcGVyYXRpb25zIHJlZ2lzdGVyZWQhICBcCisJCQkgICBSZXR1cm5pbmcuIiwKIAkJCSAgICAgX19mdW5jX18pOwogCQkJZmlscF9jbG9zZShteWZpbGUsIE5VTEwpOwogCQkJcmV0dXJuIC1FSU87CkBAIC00ODAsNyArNDg4LDggQEAKIAogCQkJCWlmICh2ZnNfcmVhZF9yZXR2YWwgPCBsaW5lX3NpemUpIHsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCQkgICAgICAgIkRvbmU6IGV4aXQgJXMoKSBzaW5jZSBubyBtb3JlIGJ5dGVzIHRvIHJlYWQgZnJvbSBWaWRlbyBmaWxlLlxuIiwKKwkJCQkJICAgICJEb25lOiBleGl0ICVzKCkgc2luY2Ugbm8gbW9yZSBcCisJCQkJCSAgICBieXRlcyB0byByZWFkIGZyb20gVmlkZW8gZmlsZS5cbiIsCiAJCQkJCSAgICAgICBfX2Z1bmNfXyk7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTUyNiw3ICs1MzUsOCBAQAogCiAJaWYgKCFkZXYtPl9kbWFfdmlydF9hZGRyKSB7CiAJCXByaW50awotCQkgICAgKEtFUk5fRVJSICJjeDI1ODIxOiBGQUlMRUQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSaXNjIGJ1ZmZlciEgUmV0dXJuaW5nLlxuIik7CisJCSAgIChLRVJOX0VSUiAiY3gyNTgyMTogRkFJTEVEIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUmlzYyBcCisJCSAgIGJ1ZmZlciEgUmV0dXJuaW5nLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNTQ3LDcgKzU1Nyw4IEBACiAKIAlpZiAoIWRldi0+X2RhdGFfYnVmX3ZpcnRfYWRkcikgewogCQlwcmludGsKLQkJICAgIChLRVJOX0VSUiAiY3gyNTgyMTogRkFJTEVEIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YSBidWZmZXIhIFJldHVybmluZy5cbiIpOworCQkgICAoS0VSTl9FUlIgImN4MjU4MjE6IEZBSUxFRCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgXAorCQkgICBidWZmZXIhIFJldHVybmluZy5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU3OCw3ICs1ODksNyBAQAogCQkJICAgICAgIHUzMiBzdGF0dXMpCiB7CiAJdTMyIGludF9tc2tfdG1wOwotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwgPSAmZGV2LT5zcmFtX2NoYW5uZWxzW2NoYW5fbnVtXTsKKyAgICAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gZGV2LT5jaGFubmVsc1tjaGFuX251bV0uc3JhbV9jaGFubmVsczsKIAlpbnQgc2luZ2xlZmllbGRfbGluZXMgPSBOVFNDX0ZJRUxEX0hFSUdIVDsKIAlpbnQgbGluZV9zaXplX2luX2J5dGVzID0gWTQyMl9MSU5FX1NaOwogCWludCBvZGRfcmlzY19wcm9nX3NpemUgPSAwOwpAQCAtNjQyLDE2ICs2NTMsMTYgQEAKIAl9IGVsc2UgewogCQlpZiAoc3RhdHVzICYgRkxEX1ZJRF9TUkNfVUYpCiAJCQlwcmludGsKLQkJCSAgICAoS0VSTl9FUlIgIiVzOiBWaWRlbyBSZWNlaXZlZCBVbmRlcmZsb3cgRXJyb3IgSW50ZXJydXB0IVxuIiwKLQkJCSAgICAgX19mdW5jX18pOworCQkJICAgKEtFUk5fRVJSICIlczogVmlkZW8gUmVjZWl2ZWQgVW5kZXJmbG93IEVycm9yIFwKKwkJCSAgIEludGVycnVwdCFcbiIsIF9fZnVuY19fKTsKIAogCQlpZiAoc3RhdHVzICYgRkxEX1ZJRF9TUkNfU1lOQykKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFZpZGVvIFJlY2VpdmVkIFN5bmMgRXJyb3IgSW50ZXJydXB0IVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCSAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBWaWRlbyBSZWNlaXZlZCBTeW5jIEVycm9yIFwKKwkJICAgICAgIEludGVycnVwdCFcbiIsIF9fZnVuY19fKTsKIAogCQlpZiAoc3RhdHVzICYgRkxEX1ZJRF9TUkNfT1BDX0VSUikKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFZpZGVvIFJlY2VpdmVkIE9wQ29kZSBFcnJvciBJbnRlcnJ1cHQhXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKKwkJICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IFZpZGVvIFJlY2VpdmVkIE9wQ29kZSBFcnJvciBcCisJCSAgICAgICBJbnRlcnJ1cHQhXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGRldi0+X2ZpbGVfc3RhdHVzID09IEVORF9PRl9GSUxFKSB7CkBAIC02NzksNyArNjkwLDcgQEAKIAogCWNoYW5uZWxfbnVtID0gVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9JOwogCi0Jc3JhbV9jaCA9ICZkZXYtPnNyYW1fY2hhbm5lbHNbY2hhbm5lbF9udW1dOworICAgICAgIHNyYW1fY2ggPSBkZXYtPmNoYW5uZWxzW2NoYW5uZWxfbnVtXS5zcmFtX2NoYW5uZWxzOwogCiAJbXNrX3N0YXQgPSBjeF9yZWFkKHNyYW1fY2gtPmludF9tc3RhdCk7CiAJdmlkX3N0YXR1cyA9IGN4X3JlYWQoc3JhbV9jaC0+aW50X3N0YXQpOwpAQCAtODAwLDE0ICs4MTEsMTUgQEAKIAl9CiAKIAlkZXYtPl9jaGFubmVsX3Vwc3RyZWFtX3NlbGVjdCA9IGNoYW5uZWxfc2VsZWN0OwotCXNyYW1fY2ggPSAmZGV2LT5zcmFtX2NoYW5uZWxzW2NoYW5uZWxfc2VsZWN0XTsKKyAgICAgICBzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tjaGFubmVsX3NlbGVjdF0uc3JhbV9jaGFubmVsczsKIAogCUlOSVRfV09SSygmZGV2LT5faXJxX3dvcmtfZW50cnksIGN4MjU4MjFfdmlkdXBzX2hhbmRsZXIpOwogCWRldi0+X2lycV9xdWV1ZXMgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiY3gyNTgyMV93b3JrcXVldWUiKTsKIAogCWlmICghZGV2LT5faXJxX3F1ZXVlcykgewogCQlwcmludGsKLQkJICAgIChLRVJOX0VSUiAiY3gyNTgyMTogY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoKSBmb3IgVmlkZW8gRkFJTEVEIVxuIik7CisJCSAgIChLRVJOX0VSUiAiY3gyNTgyMTogY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoKSBmb3IgXAorCQkgICBWaWRlbyBGQUlMRUQhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCS8qIDY1Ni9WSVAgU1JDIFVwc3RyZWFtIENoYW5uZWwgSSAmIEogYW5kIDcgLSBIb3N0IEJ1cyBJbnRlcmZhY2UgZm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmggYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmgKaW5kZXggY2M5ZjkzOC4uMTBkZWU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaApAQCAtMzgsNyArMzgsNyBAQAogI2RlZmluZSBSRVNFVF9TVEFUVVMgICAgICAgICAgLTEKICNkZWZpbmUgTlVNX05PX09QUyAgICAgICAgICAgIDUKIAotLy8gUEFMIGFuZCBOVFNDIGxpbmUgc2l6ZXMgYW5kIG51bWJlciBvZiBsaW5lcy4KKy8qIFBBTCBhbmQgTlRTQyBsaW5lIHNpemVzIGFuZCBudW1iZXIgb2YgbGluZXMuICovCiAjZGVmaW5lIFdJRFRIX0QxICAgICAgICAgICAgICA3MjAKICNkZWZpbmUgTlRTQ19MSU5FU19QRVJfRlJBTUUgIDQ4MAogI2RlZmluZSBQQUxfTElORVNfUEVSX0ZSQU1FICAgNTc2CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMKaW5kZXggNzkxMjEyYy4uMWQ1ZTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uYwpAQCAtNCw2ICs0LDkgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDkgQ29uZXhhbnQgU3lzdGVtcyBJbmMuCiAgKiAgQXV0aG9ycyAgPHNodS5saW5AY29uZXhhbnQuY29tPiwgPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPgogICogIEJhc2VkIG9uIFN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4gY3gyMzg4NSBkcml2ZXIKKyAqICBQYXJ0cyBhZGFwdGVkL3Rha2VuIGZyb20gRWR1YXJkbyBNb3Njb3NvIFJ1YmlubworICogIENvcHlyaWdodCAoQykgMjAwOSBFZHVhcmRvIE1vc2Nvc28gUnViaW5vIDxtb3Njb3NvQFRvcG9Mb2dpY2EuY29tPgorICoKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjQsNyArMjcsNyBAQAogI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIGN4MjU4MjEgYmFzZWQgVFYgY2FyZHMiKTsKLU1PRFVMRV9BVVRIT1IoIlN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkhpZXAgSHV5bmggPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX25yW10gPSB7WzAgLi4uIChDWDI1ODIxX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CkBAIC00OCw3ICs1MSwxMCBAQAogbW9kdWxlX3BhcmFtKHZpZF9saW1pdCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModmlkX2xpbWl0LCAiY2FwdHVyZSBtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzIik7CiAKLXN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSk7CitzdGF0aWMgdm9pZCBjeDI1ODIxX2luaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdmlkZW9fZm9wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzOwogCiAjZGVmaW5lIEZPUk1BVF9GTEFHU19QQUNLRUQgICAgICAgMHgwMQogCkBAIC0yMTEsNyArMjE3LDcgQEAKIH0KICovCiAKLS8vIHJlc291cmNlIG1hbmFnZW1lbnQKKy8qIHJlc291cmNlIG1hbmFnZW1lbnQgKi8KIGludCBjeDI1ODIxX3Jlc19nZXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKIHsKIAlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CkBAIC0yMjEsMTQgKzIyNywxNCBAQAogCiAJLyogaXMgaXQgZnJlZT8gKi8KIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCWlmIChkZXYtPnJlc291cmNlcyAmIGJpdCkgeworICAgICAgIGlmIChkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgJiBiaXQpIHsKIAkJLyogbm8sIHNvbWVvbmUgZWxzZSB1c2VzIGl0ICovCiAJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLwogCWZoLT5yZXNvdXJjZXMgfD0gYml0OwotCWRldi0+cmVzb3VyY2VzIHw9IGJpdDsKKyAgICAgICBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgfD0gYml0OwogCWRwcmludGsoMSwgInJlczogZ2V0ICVkXG4iLCBiaXQpOwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAlyZXR1cm4gMTsKQEAgLTIzOSw5ICsyNDUsOSBAQAogCXJldHVybiBmaC0+cmVzb3VyY2VzICYgYml0OwogfQogCi1pbnQgY3gyNTgyMV9yZXNfbG9ja2VkKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgYml0KQoraW50IGN4MjU4MjFfcmVzX2xvY2tlZChzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCiB7Ci0JcmV0dXJuIGRldi0+cmVzb3VyY2VzICYgYml0OworICAgICAgIHJldHVybiBmaC0+ZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICYgYml0OwogfQogCiB2b2lkIGN4MjU4MjFfcmVzX2ZyZWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdHMpCkBAIC0yNTEsNyArMjU3LDcgQEAKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJZmgtPnJlc291cmNlcyAmPSB+Yml0czsKLQlkZXYtPnJlc291cmNlcyAmPSB+Yml0czsKKyAgICAgICBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgJj0gfmJpdHM7CiAJZHByaW50aygxLCAicmVzOiBwdXQgJWRcbiIsIGJpdHMpOwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIH0KQEAgLTM1OCwxMSArMzY0LDExIEBACiAJc3RydWN0IGN4MjU4MjFfZGF0YSAqdGltZW91dF9kYXRhID0gKHN0cnVjdCBjeDI1ODIxX2RhdGEgKilkYXRhOwogCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gdGltZW91dF9kYXRhLT5kZXY7CiAJc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9IHRpbWVvdXRfZGF0YS0+Y2hhbm5lbDsKLQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPnZpZHFbY2hhbm5lbC0+aV07CisgICAgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxOwogCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvL2N4MjU4MjFfc3JhbV9jaGFubmVsX2R1bXAoZGV2LCBjaGFubmVsKTsKKyAgICAgICAvKiBjeDI1ODIxX3NyYW1fY2hhbm5lbF9kdW1wKGRldiwgY2hhbm5lbCk7ICovCiAJY3hfY2xlYXIoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwpAQCAtMzg0LDcgKzM5MCw3IEBACiAJdTMyIGNvdW50ID0gMDsKIAlpbnQgaGFuZGxlZCA9IDA7CiAJdTMyIG1hc2s7Ci0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9ICZkZXYtPnNyYW1fY2hhbm5lbHNbY2hhbl9udW1dOworICAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwgPSBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5zcmFtX2NoYW5uZWxzOwogCiAJbWFzayA9IGN4X3JlYWQoY2hhbm5lbC0+aW50X21zayk7CiAJaWYgKDAgPT0gKHN0YXR1cyAmIG1hc2spKQpAQCAtNDA0LDcgKzQxMCw4IEBACiAJaWYgKHN0YXR1cyAmIEZMRF9WSURfRFNUX1JJU0MxKSB7CiAJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CiAJCWNvdW50ID0gY3hfcmVhZChjaGFubmVsLT5ncGNudCk7Ci0JCWN4MjU4MjFfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+dmlkcVtjaGFubmVsLT5pXSwgY291bnQpOworCSAgICAgICBjeDI1ODIxX3ZpZGVvX3dha2V1cChkZXYsCisJCSAgICAgICAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxLCBjb3VudCk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAkJaGFuZGxlZCsrOwogCX0KQEAgLTQxMyw4ICs0MjAsOSBAQAogCWlmIChzdGF0dXMgJiAweDEwKSB7CiAJCWRwcmludGsoMiwgInN0b3BwZXIgdmlkZW9cbiIpOwogCQlzcGluX2xvY2soJmRldi0+c2xvY2spOwotCQljeDI1ODIxX3Jlc3RhcnRfdmlkZW9fcXVldWUoZGV2LCAmZGV2LT52aWRxW2NoYW5uZWwtPmldLAotCQkJCQkgICAgY2hhbm5lbCk7CisJICAgICAgIGN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShkZXYsCisJCQkgICAgICAgJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcSwKKwkJCQkgICAgICAgY2hhbm5lbCk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAkJaGFuZGxlZCsrOwogCX0KQEAgLTQzNyw3MiArNDQ1LDk1IEBACiB7CiAJY3hfY2xlYXIoUENJX0lOVF9NU0ssIDEpOwogCi0JaWYgKGRldi0+dmlkZW9fZGV2W2NoYW5fbnVtXSkgewotCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnZpZGVvX2RldltjaGFuX251bV0pKQotCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52aWRlb19kZXZbY2hhbl9udW1dKTsKKyAgICAgICBpZiAoZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KSB7CisJICAgICAgIGlmICh2aWRlb19pc19yZWdpc3RlcmVkKGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldikpCisJCSAgICAgICB2aWRlb191bnJlZ2lzdGVyX2RldmljZSgKKwkJCSAgICAgICBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpOwogCQllbHNlCi0JCQl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPnZpZGVvX2RldltjaGFuX251bV0pOworCQkgICAgICAgdmlkZW9fZGV2aWNlX3JlbGVhc2UoCisJCQkgICAgICAgZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KTsKIAotCQlkZXYtPnZpZGVvX2RldltjaGFuX251bV0gPSBOVUxMOworCSAgICAgICBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYgPSBOVUxMOwogCi0JCWJ0Y3hfcmlzY21lbV9mcmVlKGRldi0+cGNpLCAmZGV2LT52aWRxW2NoYW5fbnVtXS5zdG9wcGVyKTsKKwkgICAgICAgYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksCisJCSAgICAgICAmZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkcS5zdG9wcGVyKTsKIAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZXZpY2UgJWQgcmVsZWFzZWQhXG4iLCBjaGFuX251bSk7CiAJfQogCiB9CiAKLWludCBjeDI1ODIxX3ZpZGVvX3JlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0sCi0JCQkgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb190ZW1wbGF0ZSkKK2ludCBjeDI1ODIxX3ZpZGVvX3JlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KQogewogCWludCBlcnI7CisgICAgICAgaW50IGk7CisKKyAgICAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fZGV2aWNlID0geworCSAgICAgICAubmFtZSA9ICJjeDI1ODIxLXZpZGVvIiwKKwkgICAgICAgLmZvcHMgPSAmdmlkZW9fZm9wcywKKwkgICAgICAgLm1pbm9yID0gLTEsCisJICAgICAgIC5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAorCSAgICAgICAudHZub3JtcyA9IENYMjU4MjFfTk9STVMsCisJICAgICAgIC5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCisgICAgICAgfTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPnNsb2NrKTsKIAotCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiQ2hhbm5lbCAlZFxuIiwgY2hhbl9udW0pOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVklEX0NIQU5ORUxfTlVNIC0gMTsgKytpKSB7CisJICAgICAgIGN4MjU4MjFfaW5pdF9jb250cm9scyhkZXYsIGkpOwogCi0jaWZkZWYgVFVORVJfRkxBRwotCWRldi0+dHZub3JtID0gdmlkZW9fdGVtcGxhdGUtPmN1cnJlbnRfbm9ybTsKLSNlbmRpZgorCSAgICAgICBjeDI1ODIxX3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwKKwkJCSAgICAgICAmZGV2LT5jaGFubmVsc1tpXS52aWRxLnN0b3BwZXIsCisJCQkgICAgICAgZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5kbWFfY3RsLAorCQkJICAgICAgIDB4MTEsIDApOwogCi0JLyogaW5pdCB2aWRlbyBkbWEgcXVldWVzICovCi0JZGV2LT50aW1lb3V0X2RhdGFbY2hhbl9udW1dLmRldiA9IGRldjsKLQlkZXYtPnRpbWVvdXRfZGF0YVtjaGFuX251bV0uY2hhbm5lbCA9ICZkZXYtPnNyYW1fY2hhbm5lbHNbY2hhbl9udW1dOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZpZHFbY2hhbl9udW1dLmFjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+dmlkcVtjaGFuX251bV0ucXVldWVkKTsKLQlkZXYtPnZpZHFbY2hhbl9udW1dLnRpbWVvdXQuZnVuY3Rpb24gPSBjeDI1ODIxX3ZpZF90aW1lb3V0OwotCWRldi0+dmlkcVtjaGFuX251bV0udGltZW91dC5kYXRhID0KLQkgICAgKHVuc2lnbmVkIGxvbmcpJmRldi0+dGltZW91dF9kYXRhW2NoYW5fbnVtXTsKLQlpbml0X3RpbWVyKCZkZXYtPnZpZHFbY2hhbl9udW1dLnRpbWVvdXQpOwotCWN4MjU4MjFfcmlzY19zdG9wcGVyKGRldi0+cGNpLCAmZGV2LT52aWRxW2NoYW5fbnVtXS5zdG9wcGVyLAotCQkJICAgICBkZXYtPnNyYW1fY2hhbm5lbHNbY2hhbl9udW1dLmRtYV9jdGwsIDB4MTEsIDApOworCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMgPSAmY3gyNTgyMV9zcmFtX2NoYW5uZWxzW2ldOworCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IE5VTEw7CisJICAgICAgIGRldi0+Y2hhbm5lbHNbaV0ucmVzb3VyY2VzID0gMDsKIAotCS8qIHJlZ2lzdGVyIHY0bCBkZXZpY2VzICovCi0JZGV2LT52aWRlb19kZXZbY2hhbl9udW1dID0KLQkgICAgY3gyNTgyMV92ZGV2X2luaXQoZGV2LCBkZXYtPnBjaSwgdmlkZW9fdGVtcGxhdGUsICJ2aWRlbyIpOwotCWVyciA9Ci0JICAgIHZpZGVvX3JlZ2lzdGVyX2RldmljZShkZXYtPnZpZGVvX2RldltjaGFuX251bV0sIFZGTF9UWVBFX0dSQUJCRVIsCi0JCQkJICB2aWRlb19ucltkZXYtPm5yXSk7CisJICAgICAgIGN4X3dyaXRlKGRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscy0+aW50X3N0YXQsCisJCQkgICAgICAgMHhmZmZmZmZmZik7CiAKLQlpZiAoZXJyIDwgMCkgewotCQlnb3RvIGZhaWxfdW5yZWc7CisJICAgICAgIElOSVRfTElTVF9IRUFEKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEuYWN0aXZlKTsKKwkgICAgICAgSU5JVF9MSVNUX0hFQUQoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5xdWV1ZWQpOworCisJICAgICAgIGRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhLmRldiA9IGRldjsKKwkgICAgICAgZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGEuY2hhbm5lbCA9CisJCQkJICAgICAgICZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbaV07CisJICAgICAgIGRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmZ1bmN0aW9uID0KKwkJCQkgICAgICAgY3gyNTgyMV92aWRfdGltZW91dDsKKwkgICAgICAgZGV2LT5jaGFubmVsc1tpXS52aWRxLnRpbWVvdXQuZGF0YSA9CisJCSAgICAgICAodW5zaWduZWQgbG9uZykmZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGE7CisJICAgICAgIGluaXRfdGltZXIoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0KTsKKworCSAgICAgICAvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLworCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IGN4MjU4MjFfdmRldl9pbml0KGRldiwKKwkJICAgICAgIGRldi0+cGNpLCAmY3gyNTgyMV92aWRlb19kZXZpY2UsICJ2aWRlbyIpOworCisJICAgICAgIGVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiwKKwkJCSAgICAgICBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucltkZXYtPm5yXSk7CisKKwkgICAgICAgaWYgKGVyciA8IDApCisJCSAgICAgICBnb3RvIGZhaWxfdW5yZWc7CisKIAl9Ci0JLy9zZXQgUENJIGludGVycnVwdAorCisgICAgLyogc2V0IFBDSSBpbnRlcnJ1cHQgKi8KIAljeF9zZXQoUENJX0lOVF9NU0ssIDB4ZmYpOwogCiAJLyogaW5pdGlhbCBkZXZpY2UgY29uZmlndXJhdGlvbiAqLwogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAjaWZkZWYgVFVORVJfRkxBRworICAgICAgIGRldi0+dHZub3JtID0gY3gyNTgyMV92aWRlb19kZXZpY2UuY3VycmVudF9ub3JtOwogCWN4MjU4MjFfc2V0X3R2bm9ybShkZXYsIGRldi0+dHZub3JtKTsKICNlbmRpZgogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAotCWluaXRfY29udHJvbHMoZGV2LCBjaGFuX251bSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAotICAgICAgZmFpbF91bnJlZzoKLQljeDI1ODIxX3ZpZGVvX3VucmVnaXN0ZXIoZGV2LCBjaGFuX251bSk7CitmYWlsX3VucmVnOgorICAgICAgIGN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihkZXYsIGkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTUzMyw3ICs1NjQsNyBAQAogCXUzMiBsaW5lMF9vZmZzZXQsIGxpbmUxX29mZnNldDsKIAlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOwogCWludCBicGxfbG9jYWwgPSBMSU5FX1NJWkVfRDE7Ci0JaW50IGNoYW5uZWxfb3BlbmVkID0gMDsKKyAgICAgICBpbnQgY2hhbm5lbF9vcGVuZWQgPSBmaC0+Y2hhbm5lbF9pZDsKIAogCUJVR19PTihOVUxMID09IGZoLT5mbXQpOwogCWlmIChmaC0+d2lkdGggPCA0OCB8fCBmaC0+d2lkdGggPiA3MjAgfHwKQEAgLTU3MiwyNiArNjAzLDI5IEBACiAJCWNoYW5uZWxfb3BlbmVkID0gKGNoYW5uZWxfb3BlbmVkIDwgMAogCQkJCSAgfHwgY2hhbm5lbF9vcGVuZWQgPiA3KSA/IDcgOiBjaGFubmVsX29wZW5lZDsKIAotCQlpZiAoZGV2LT5waXhlbF9mb3JtYXRzW2NoYW5uZWxfb3BlbmVkXSA9PSBQSVhFTF9GUk1UXzQxMSkKKwkgICAgICAgaWYgKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdCisJCSAgICAgICAucGl4ZWxfZm9ybWF0cyA9PSBQSVhFTF9GUk1UXzQxMSkKIAkJCWJ1Zi0+YnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCAqIGJ1Zi0+dmIud2lkdGgpID4+IDM7CiAJCWVsc2UKIAkJCWJ1Zi0+YnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCA+PiAzKSAqIChidWYtPnZiLndpZHRoKTsKIAotCQlpZiAoZGV2LT5waXhlbF9mb3JtYXRzW2NoYW5uZWxfb3BlbmVkXSA9PSBQSVhFTF9GUk1UXzQxMSkgeworCSAgICAgICBpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KKwkJICAgICAgIC5waXhlbF9mb3JtYXRzID09IFBJWEVMX0ZSTVRfNDExKSB7CiAJCQlicGxfbG9jYWwgPSBidWYtPmJwbDsKIAkJfSBlbHNlIHsKLQkJCWJwbF9sb2NhbCA9IGJ1Zi0+YnBsOwkvL0RlZmF1bHQKKwkJICAgICAgIGJwbF9sb2NhbCA9IGJ1Zi0+YnBsOyAgIC8qIERlZmF1bHQgKi8KIAogCQkJaWYgKGNoYW5uZWxfb3BlbmVkID49IDAgJiYgY2hhbm5lbF9vcGVuZWQgPD0gNykgewotCQkJCWlmIChkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltjaGFubmVsX29wZW5lZF0pIHsKKwkJCSAgICAgICBpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KKwkJCQkJICAgICAgIC51c2VfY2lmX3Jlc29sdXRpb24pIHsKIAkJCQkJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHCiAJCQkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKIAkJCQkJCWJwbF9sb2NhbCA9IDM1MiA8PCAxOwogCQkJCQllbHNlCiAJCQkJCQlicGxfbG9jYWwgPQotCQkJCQkJICAgIGRldi0+Ci0JCQkJCQkgICAgY2lmX3dpZHRoW2NoYW5uZWxfb3BlbmVkXSA8PAotCQkJCQkJICAgIDE7CisJCQkJCQkgZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0uCisJCQkJCQkgY2lmX3dpZHRoIDw8CisJCQkJCQkgMTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTY4NSw2ICs3MTksMzgzIEBACiAJcmV0dXJuIHZpZGVvYnVmX21tYXBfbWFwcGVyKGdldF9xdWV1ZShmaCksIHZtYSk7CiB9CiAKKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworICAgICAgIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KKwkgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOworICAgICAgIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxOworCisgICAgICAgLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLworICAgICAgIGJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOworICAgICAgIGJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7CisgICAgICAgYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOyAgICAgIC8qIGJpdHMgNjMtMzIgKi8KKworICAgICAgIGRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7CisKKyAgICAgICBpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKKwkgICAgICAgbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7CisJICAgICAgIGJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CisJICAgICAgIGRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwgYnVmLAorCQkgICAgICAgYnVmLT52Yi5pKTsKKworICAgICAgIH0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCSAgICAgICBsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKKwkgICAgICAgY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsCisJCQkJICAgICAgIGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLgorCQkJCSAgICAgICBzcmFtX2NoYW5uZWxzKTsKKwkgICAgICAgYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwkgICAgICAgYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CisJICAgICAgIG1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIEJVRkZFUl9USU1FT1VUKTsKKwkgICAgICAgZHByaW50aygyLAorCQkgICAgICAgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgYWN0aXZlLCBidWYgY250ID0gJWQsIFwKKwkJICAgICAgIHEtPmNvdW50ID0gJWRcbiIsCisJCSAgICAgICBidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCwgcS0+Y291bnQpOworICAgICAgIH0gZWxzZSB7CisJICAgICAgIHByZXYgPQorCQkgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKKwkgICAgICAgaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKKwkJICAgJiYgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0CisJCSAgICYmIHByZXYtPmZtdCA9PSBidWYtPmZtdCkgeworCQkgICAgICAgbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CisJCSAgICAgICBidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkgICAgICAgYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CisJCSAgICAgICBwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOworCisJCSAgICAgICAvKiA2NCBiaXQgYml0cyA2My0zMiAqLworCQkgICAgICAgcHJldi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsKKwkJICAgICAgIGRwcmludGsoMiwKKwkJCSAgICAgICAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlLCBcCisJCQkgICAgICAgYnVmLT5jb3VudD0lZFxuIiwKKwkJCSAgICAgICBidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7CisKKwkgICAgICAgfSBlbHNlIHsKKwkJICAgICAgIGxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOworCQkgICAgICAgYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKKwkJICAgICAgIGRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCisJCQkgICAgICAgYnVmLT52Yi5pKTsKKwkgICAgICAgfQorICAgICAgIH0KKworICAgICAgIGlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKQorCSAgICAgICBkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0geworICAgICAgIC5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKKyAgICAgICAuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAorICAgICAgIC5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCisgICAgICAgLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmgsICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKKyAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworICAgICAgIGludCBtaW5vciA9IHZpZGVvX2RldmRhdGEoZmlsZSktPm1pbm9yOworICAgICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgICAgIHUzMiBwaXhfZm9ybWF0OworICAgICAgIGludCBjaF9pZCA9IDA7CisgICAgICAgaW50IGk7CisKKyAgICAgICBkcHJpbnRrKDEsICJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLAorCQkgICAgICAgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKKwkJICAgICAgIHY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CisKKyAgICAgICAvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLworICAgICAgIGZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgaWYgKE5VTEwgPT0gZmgpCisJICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgbG9ja19rZXJuZWwoKTsKKworICAgICAgIGxpc3RfZm9yX2VhY2gobGlzdCwgJmN4MjU4MjFfZGV2bGlzdCkKKyAgICAgICB7CisJICAgICAgIGggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDI1ODIxX2RldiwgZGV2bGlzdCk7CisKKwkgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9WSURfQ0hBTk5FTF9OVU07IGkrKykgeworCQkgICAgICAgaWYgKGgtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiAmJgorCQkJICAgaC0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJICAgICAgIGRldiA9IGg7CisJCQkgICAgICAgY2hfaWQgPSBpOworCQkJICAgICAgIHR5cGUgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkgICAgICAgfQorCSAgICAgICB9CisgICAgICAgfQorCisgICAgICAgaWYgKE5VTEwgPT0gZGV2KSB7CisJICAgICAgIHVubG9ja19rZXJuZWwoKTsKKwkgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgfQorCisgICAgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisgICAgICAgZmgtPmRldiA9IGRldjsKKyAgICAgICBmaC0+dHlwZSA9IHR5cGU7CisgICAgICAgZmgtPndpZHRoID0gNzIwOworICAgIGZoLT5jaGFubmVsX2lkID0gY2hfaWQ7CisKKyAgICAgICBpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspCisJICAgICAgIGZoLT5oZWlnaHQgPSA1NzY7CisgICAgICAgZWxzZQorCSAgICAgICBmaC0+aGVpZ2h0ID0gNDgwOworCisgICAgICAgZGV2LT5jaGFubmVsX29wZW5lZCA9IGZoLT5jaGFubmVsX2lkOworICAgICAgIHBpeF9mb3JtYXQgPQorCSAgIChkZXYtPmNoYW5uZWxzW2NoX2lkXS5waXhlbF9mb3JtYXRzID09CisJICAgIFBJWEVMX0ZSTVRfNDExKSA/IFY0TDJfUElYX0ZNVF9ZNDFQIDogVjRMMl9QSVhfRk1UX1lVWVY7CisgICAgICAgZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7CisKKyAgICAgICB2NGwyX3ByaW9fb3BlbigmZGV2LT5jaGFubmVsc1tjaF9pZF0ucHJpbywgJmZoLT5wcmlvKTsKKworICAgICAgIHZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmY3gyNTgyMV92aWRlb19xb3BzLAorCQkJICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAorCQkJICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKKworICAgICAgIGRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKKyAgICAgICB1bmxvY2tfa2VybmVsKCk7CisKKyAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQoreworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworICAgICAgIHN3aXRjaCAoZmgtPnR5cGUpIHsKKyAgICAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkgICAgICAgaWYgKGN4MjU4MjFfcmVzX2xvY2tlZChmaCwgUkVTT1VSQ0VfVklERU8wKSkKKwkJICAgICAgIHJldHVybiAtRUJVU1k7CisKKwkgICAgICAgcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsCisJCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworICAgICAgIGRlZmF1bHQ6CisJICAgICAgIEJVRygpOworCSAgICAgICByZXR1cm4gMDsKKyAgICAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7CisKKyAgICAgICBpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKKwkgICAgICAgLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KKwkgICAgICAgaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCisJCSAgICAgICByZXR1cm4gUE9MTEVSUjsKKwkgICAgICAgYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKKwkJCQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnN0cmVhbSk7CisgICAgICAgfSBlbHNlIHsKKwkgICAgICAgLyogcmVhZCgpIGNhcHR1cmUgKi8KKwkgICAgICAgYnVmID0gKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqKWZoLT52aWRxLnJlYWRfYnVmOworCSAgICAgICBpZiAoTlVMTCA9PSBidWYpCisJCSAgICAgICByZXR1cm4gUE9MTEVSUjsKKyAgICAgICB9CisKKyAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7CisgICAgICAgaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fCBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKSB7CisJICAgICAgIGlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUpIHsKKwkJICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKworCQkgICAgICAgaWYgKGRldiAmJiBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXQorCQkJCQkgICAgICAgLnVzZV9jaWZfcmVzb2x1dGlvbikgeworCQkJICAgICAgIHU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7CisJCQkgICAgICAgbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKKwkJCQkgICAgICAoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAoZmgtPndpZHRoICogMiksCisJCQkJICAgICAgKGZoLT53aWR0aCAqIDIpKTsKKwkJCSAgICAgICAqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpID0gY2FtX2lkOworCQkgICAgICAgfQorCSAgICAgICB9CisKKwkgICAgICAgcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisgICAgICAgfQorCisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCisgICAgICAgLyogc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8gKi8KKyAgICAgICBjeF93cml0ZShjaGFubmVsMC0+ZG1hX2N0bCwgMCk7IC8qIEZJRk8gYW5kIFJJU0MgZGlzYWJsZSAqLworCisgICAgICAgLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCisgICAgICAgaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7CisJICAgICAgIHZpZGVvYnVmX3F1ZXVlX2NhbmNlbCgmZmgtPnZpZHEpOworCSAgICAgICBjeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZJREVPMCk7CisgICAgICAgfQorCisgICAgICAgaWYgKGZoLT52aWRxLnJlYWRfYnVmKSB7CisJICAgICAgIGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UoJmZoLT52aWRxLCBmaC0+dmlkcS5yZWFkX2J1Zik7CisJICAgICAgIGtmcmVlKGZoLT52aWRxLnJlYWRfYnVmKTsKKyAgICAgICB9CisKKyAgICAgICB2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKKworICAgICAgIHY0bDJfcHJpb19jbG9zZSgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywgZmgtPnByaW8pOworICAgICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisgICAgICAga2ZyZWUoZmgpOworCisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKworICAgICAgIGlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQorCSAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgIGlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkKKwkgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICBpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLAorCQkgICAgICAgY3gyNTgyMV9nZXRfcmVzb3VyY2UoZmgsIFJFU09VUkNFX1ZJREVPMCkpKSkKKwkgICAgICAgcmV0dXJuIC1FQlVTWTsKKworICAgICAgIHJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbihnZXRfcXVldWUoZmgpKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKyAgICAgICBpbnQgZXJyLCByZXM7CisKKyAgICAgICBpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCSAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICBpZiAoaSAhPSBmaC0+dHlwZSkKKwkgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICByZXMgPSBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8wKTsKKyAgICAgICBlcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7CisgICAgICAgaWYgKGVyciA8IDApCisJICAgICAgIHJldHVybiBlcnI7CisgICAgICAgY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCByZXMpOworICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CisgICAgICAgaW50IGVycjsKKyAgICAgICBpbnQgcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOworCisgICAgICAgaWYgKGZoKSB7CisJICAgICAgIGVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KKwkJCQkJICAgICAgIC5wcmlvLCBmaC0+cHJpbyk7CisJICAgICAgIGlmICgwICE9IGVycikKKwkJICAgICAgIHJldHVybiBlcnI7CisgICAgICAgfQorCisgICAgICAgZHByaW50aygyLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgICAgIGVyciA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBwcml2LCBmKTsKKworICAgICAgIGlmICgwICE9IGVycikKKwkgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgIGZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworICAgICAgIGZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKworICAgICAgIC8qIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkICovCisgICAgICAgaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKQorCSAgICAgICBmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOworCisgICAgICAgaWYgKGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KGYtPmZtdC5waXguaGVpZ2h0LCBkZXYtPnR2bm9ybSkpCisJICAgICAgIGZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKKworICAgICAgIGlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZNDFQKQorCSAgICAgICBwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MTE7CisgICAgICAgZWxzZSBpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikKKwkgICAgICAgcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOworICAgICAgIGVsc2UKKwkgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICBjeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBTUkFNX0NIMDAsIHBpeF9mb3JtYXQpOworCisgICAgICAgLyogY2hlY2sgaWYgY2lmIHJlc29sdXRpb24gKi8KKyAgICAgICBpZiAoZmgtPndpZHRoID09IDMyMCB8fCBmaC0+d2lkdGggPT0gMzUyKQorCSAgICAgICBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS51c2VfY2lmX3Jlc29sdXRpb24gPSAxOworICAgICAgIGVsc2UKKwkgICAgICAgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udXNlX2NpZl9yZXNvbHV0aW9uID0gMDsKKworICAgICAgIGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmNpZl93aWR0aCA9IGZoLT53aWR0aDsKKyAgICAgICBtZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwMCk7CisKKyAgICAgICBkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKKwkgICAgICAgZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOworICAgICAgIGN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOworCisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisgICAgICAgaW50IHJldF92YWwgPSAwOworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKworICAgICAgIHJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKyAgICBwLT5zZXF1ZW5jZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnZpZHEuY291bnQ7CisKKyAgICAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisgICAgICAgY2hhciBuYW1lWzMyICsgMl07CisKKyAgICAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KKwkJCQkJCSAgICAgICAuc3JhbV9jaGFubmVsczsKKyAgICAgICB1MzIgdG1wID0gMDsKKworICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLzIiLCBkZXYtPm5hbWUpOworICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PSAgU1RBUlQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09XG4iLAorCSAgICAgIGRldi0+bmFtZSk7CisgICAgICAgY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOworICAgICAgIHRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7CisgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiVmlkZW8gaW5wdXQgMCBpcyAlc1xuIiwKKwkgICAgICAodG1wICYgMHgxMSkgPyAic3RyZWFtaW5nIiA6ICJzdG9wcGVkIik7CisgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09PSAgRU5EIExPRyBTVEFUVVMgID09PT09PT09PT09PT1cbiIsCisJICAgICAgZGV2LT5uYW1lKTsKKyAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQoreworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKyAgICAgICBpbnQgZXJyOworCisgICAgICAgaWYgKGZoKSB7CisJICAgICAgIGVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KKwkJCQkJICAgICAgIC5wcmlvLCBmaC0+cHJpbyk7CisJICAgICAgIGlmICgwICE9IGVycikKKwkJICAgICAgIHJldHVybiBlcnI7CisgICAgICAgfQorCisgICAgICAgcmV0dXJuIGN4MjU4MjFfc2V0X2NvbnRyb2woZGV2LCBjdGwsIGZoLT5jaGFubmVsX2lkKTsKK30KKwogLyogVklERU8gSU9DVExTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBpbnQgY3gyNTgyMV92aWRpb2NfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewpAQCAtODIyLDggKzEyMzMsOSBAQAogaW50IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsIGVudW0gdjRsMl9wcmlvcml0eSAqcCkKIHsKIAlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilmKS0+ZGV2OworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGY7CiAKLQkqcCA9IHY0bDJfcHJpb19tYXgoJmRldi0+cHJpbyk7CisgICAgICAgKnAgPSB2NGwyX3ByaW9fbWF4KCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvKTsKIAogCXJldHVybiAwOwogfQpAQCAtODMzLDcgKzEyNDUsOCBAQAogCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGY7CiAJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZiktPmRldjsKIAotCXJldHVybiB2NGwyX3ByaW9fY2hhbmdlKCZkZXYtPnByaW8sICZmaC0+cHJpbywgcHJpbyk7CisgICAgICAgcmV0dXJuIHY0bDJfcHJpb19jaGFuZ2UoJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCisJCQkJICAgICAgIC5wcmlvLCAmZmgtPnByaW8sIHByaW8pOwogfQogCiAjaWZkZWYgVFVORVJfRkxBRwpAQCAtODQ2LDcgKzEyNTksOCBAQAogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOworCSAgICAgICBlcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCisJCQkJCSAgICAgICAucHJpbywgZmgtPnByaW8pOwogCQlpZiAoMCAhPSBlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KQEAgLTkxNiw3ICsxMzMwLDggQEAKIAlkcHJpbnRrKDEsICIlcyglZClcbiIsIF9fZnVuY19fLCBpKTsKIAogCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOworCSAgICAgICBlcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCisJCQkJCSAgICAgICAucHJpbywgZmgtPnByaW8pOwogCQlpZiAoMCAhPSBlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KQEAgLTk2Nyw5ICsxMzgyLDE0IEBACiAJaW50IGVycjsKIAogCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOworCSAgICAgICBkZXYgPSBmaC0+ZGV2OworCSAgICAgICBlcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCisJCQkJCSAgICAgICAucHJpbywgZmgtPnByaW8pOwogCQlpZiAoMCAhPSBlcnIpCiAJCQlyZXR1cm4gZXJyOworICAgICAgIH0gZWxzZSB7CisJICAgICAgIHByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBmaCBwb2ludGVyIVxuIik7CisJICAgICAgIHJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiBjeDI1ODIxX3NldF9mcmVxKGRldiwgZik7CkBAIC0xMDMxLDcgKzE0NTEsOCBAQAogCWludCBlcnI7CiAKIAlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKKwkgICAgICAgZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXQorCQkJCQkgICAgICAgLnByaW8sIGZoLT5wcmlvKTsKIAkJaWYgKDAgIT0gZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xMDQ2LDcgKzE0NjcsNyBAQAogfQogCiAjZW5kaWYKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdGwgPSB7CiAJLm5hbWUgPSAiNDIiLAogCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELApAQCAtMTEyOSw2ICsxNTUwLDcgQEAKIGludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKIHsKIAlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CiAKIAljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7CiAKQEAgLTExMzgsMTYgKzE1NjAsMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc3dpdGNoIChjdGwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQljdGwtPnZhbHVlID0gZGV2LT5jdGxfYnJpZ2h0OworCSAgICAgICBjdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2JyaWdodDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCWN0bC0+dmFsdWUgPSBkZXYtPmN0bF9odWU7CisJICAgICAgIGN0bC0+dmFsdWUgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jdGxfaHVlOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQljdGwtPnZhbHVlID0gZGV2LT5jdGxfY29udHJhc3Q7CisJICAgICAgIGN0bC0+dmFsdWUgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jdGxfY29udHJhc3Q7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJY3RsLT52YWx1ZSA9IGRldi0+Y3RsX3NhdHVyYXRpb247CisJICAgICAgIGN0bC0+dmFsdWUgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jdGxfc2F0dXJhdGlvbjsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtMTE4MSwxOSArMTYwMywxOSBAQAogCiAJc3dpdGNoIChjdGwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQlkZXYtPmN0bF9icmlnaHQgPSBjdGwtPnZhbHVlOworCSAgICAgICBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfYnJpZ2h0ID0gY3RsLT52YWx1ZTsKIAkJbWVkdXNhX3NldF9icmlnaHRuZXNzKGRldiwgY3RsLT52YWx1ZSwgY2hhbl9udW0pOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hVRToKLQkJZGV2LT5jdGxfaHVlID0gY3RsLT52YWx1ZTsKKwkgICAgICAgZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX2h1ZSA9IGN0bC0+dmFsdWU7CiAJCW1lZHVzYV9zZXRfaHVlKGRldiwgY3RsLT52YWx1ZSwgY2hhbl9udW0pOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQlkZXYtPmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7CisJICAgICAgIGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7CiAJCW1lZHVzYV9zZXRfY29udHJhc3QoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJZGV2LT5jdGxfc2F0dXJhdGlvbiA9IGN0bC0+dmFsdWU7CisJICAgICAgIGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9zYXR1cmF0aW9uID0gY3RsLT52YWx1ZTsKIAkJbWVkdXNhX3NldF9zYXR1cmF0aW9uKGRldiwgY3RsLT52YWx1ZSwgY2hhbl9udW0pOwogCQlicmVhazsKIAl9CkBAIC0xMjAzLDcgKzE2MjUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSkKK3N0YXRpYyB2b2lkIGN4MjU4MjFfaW5pdF9jb250cm9scyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNoYW5fbnVtKQogewogCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKIAlpbnQgaTsKQEAgLTEyMzksMjMgKzE2NjEsMjQgQEAKIAlpbnQgZXJyOwogCiAJaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7CisJICAgICAgIGVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uCisJCQkJCSAgICAgICBwcmlvLCBmaC0+cHJpbyk7CiAJCWlmICgwICE9IGVycikKIAkJCXJldHVybiBlcnI7CiAJfQotCS8vIGN4MjU4MjFfdmlkaW9jX3NfY3JvcCBub3Qgc3VwcG9ydGVkCisgICAgICAgLyogY3gyNTgyMV92aWRpb2Nfc19jcm9wIG5vdCBzdXBwb3J0ZWQgKi8KIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogaW50IGN4MjU4MjFfdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKIHsKLQkvLyBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Agbm90IHN1cHBvcnRlZAorICAgICAgIC8qIGN4MjU4MjFfdmlkaW9jX2dfY3JvcCBub3Qgc3VwcG9ydGVkICovCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIGludCBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKiBub3JtKQogewotCS8vIG1lZHVzYSBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHN0YW5kYXJkIHNlbnNpbmcgb2YgY3VycmVudCBpbnB1dAorICAgICAgIC8qIG1lZHVzYSBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHN0YW5kYXJkIHNlbnNpbmcgb2YgY3VycmVudCBpbnB1dCAqLwogCSpub3JtID0gQ1gyNTgyMV9OT1JNUzsKIAogCXJldHVybiAwOwpAQCAtMTI5NywzICsxNzIwLDMyNSBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKyAgICAgICBpbnQgY29tbWFuZCA9IDA7CisgICAgICAgc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKworICAgICAgIGRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworICAgICAgIGlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkgICAgICAgcHJpbnRrCisJCSAgICgiY3gyNTgyMSBpbiAlcygpOiBVcHN0cmVhbSBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZy5cbiIsCisJCSAgICBfX2Z1bmNfXyk7CisJICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworICAgICAgIGlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX1ZJREVPICYmCisJICAgICAgIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9WSURFTykKKwkgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICBkZXYtPmlucHV0X2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworICAgICAgIGRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKyAgICAgICBkZXYtPnZpZF9zdGRuYW1lID0gZGF0YV9mcm9tX3VzZXItPnZpZF9zdGRuYW1lOworICAgICAgIGRldi0+cGl4ZWxfZm9ybWF0ID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKKyAgICAgICBkZXYtPmNoYW5uZWxfc2VsZWN0ID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OworICAgICAgIGRldi0+Y29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCisgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgY2FzZSBVUFNUUkVBTV9TVEFSVF9WSURFTzoKKwkgICAgICAgY3gyNTgyMV9zdGFydF91cHN0cmVhbV92aWRlb19jaDEoZGV2LCBkYXRhX2Zyb21fdXNlcik7CisJICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBVUFNUUkVBTV9TVE9QX1ZJREVPOgorCSAgICAgICBjeDI1ODIxX3N0b3BfdXBzdHJlYW1fdmlkZW9fY2gxKGRldik7CisJICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2aWRlb19pb2N0bF91cHN0cmVhbTEwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKyAgICAgICBpbnQgY29tbWFuZCA9IDA7CisgICAgICAgc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKworICAgICAgIGRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworICAgICAgIGlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkgICAgICAgcHJpbnRrCisJCSAgICgiY3gyNTgyMSBpbiAlcygpOiBVcHN0cmVhbSBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZy5cbiIsCisJCSAgICBfX2Z1bmNfXyk7CisJICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworICAgICAgIGlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX1ZJREVPICYmCisJICAgICAgIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9WSURFTykKKwkgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICBkZXYtPmlucHV0X2ZpbGVuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKyAgICAgICBkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisgICAgICAgZGV2LT52aWRfc3RkbmFtZV9jaDIgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7CisgICAgICAgZGV2LT5waXhlbF9mb3JtYXRfY2gyID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKKyAgICAgICBkZXYtPmNoYW5uZWxfc2VsZWN0X2NoMiA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKKyAgICAgICBkZXYtPmNvbW1hbmRfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKyAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICBjYXNlIFVQU1RSRUFNX1NUQVJUX1ZJREVPOgorCSAgICAgICBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYsIGRhdGFfZnJvbV91c2VyKTsKKwkgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIFVQU1RSRUFNX1NUT1BfVklERU86CisJICAgICAgIGN4MjU4MjFfc3RvcF91cHN0cmVhbV92aWRlb19jaDIoZGV2KTsKKwkgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtMTEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworICAgICAgIGludCBjb21tYW5kID0gMDsKKyAgICAgICBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKmRhdGFfZnJvbV91c2VyOworCisgICAgICAgZGF0YV9mcm9tX3VzZXIgPSAoc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICopYXJnOworCisgICAgICAgaWYgKCFkYXRhX2Zyb21fdXNlcikgeworCSAgICAgICBwcmludGsKKwkJICAgKCJjeDI1ODIxIGluICVzKCk6IFVwc3RyZWFtIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nLlxuIiwKKwkJICAgIF9fZnVuY19fKTsKKwkgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCisgICAgICAgaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfQVVESU8gJiYKKwkgICAgICAgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX0FVRElPKQorCSAgICAgICByZXR1cm4gMDsKKworICAgICAgIGRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisgICAgICAgZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworICAgICAgIGRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7CisgICAgICAgZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworICAgICAgIGRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7CisgICAgICAgZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKyAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICBjYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgorCSAgICAgICBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCSAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKKwkgICAgICAgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7CisJICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2aWRlb19pb2N0bF9zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworICAgICAgIHN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKyAgICAgICBpbnQgY29tbWFuZDsKKyAgICAgICBpbnQgd2lkdGggPSA3MjA7CisgICAgICAgaW50IHNlbGVjdGVkX2NoYW5uZWwgPSAwLCBwaXhfZm9ybWF0ID0gMCwgaSA9IDA7CisgICAgICAgaW50IGNpZl9lbmFibGUgPSAwLCBjaWZfd2lkdGggPSAwOworICAgICAgIHUzMiB2YWx1ZSA9IDA7CisKKyAgICAgICBkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworICAgICAgIGlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkgICAgICAgcHJpbnRrKAorCSAgICAgICAiY3gyNTgyMSBpbiAlcygpOiBVc2VyIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nLlxuIiwKKwkgICAgICAgX19mdW5jX18pOworCSAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBjb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKyAgICAgICBpZiAoY29tbWFuZCAhPSBTRVRfVklERU9fU1REICYmIGNvbW1hbmQgIT0gU0VUX1BJWEVMX0ZPUk1BVAorCSAgICYmIGNvbW1hbmQgIT0gRU5BQkxFX0NJRl9SRVNPTFVUSU9OICYmIGNvbW1hbmQgIT0gUkVHX1JFQUQKKwkgICAmJiBjb21tYW5kICE9IFJFR19XUklURSAmJiBjb21tYW5kICE9IE1FRFVTQV9SRUFECisJICAgJiYgY29tbWFuZCAhPSBNRURVU0FfV1JJVEUpIHsKKwkgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgY2FzZSBTRVRfVklERU9fU1REOgorCSAgICAgICBkZXYtPnR2bm9ybSA9CisJCSAgICFzdHJjbXAoZGF0YV9mcm9tX3VzZXItPnZpZF9zdGRuYW1lLAorCQkJICAgIlBBTCIpID8gVjRMMl9TVERfUEFMX0JHIDogVjRMMl9TVERfTlRTQ19NOworCSAgICAgICBtZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKKwkgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIFNFVF9QSVhFTF9GT1JNQVQ6CisJICAgICAgIHNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJICAgICAgIHBpeF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCisJICAgICAgIGlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7CisJCSAgICAgICBzZWxlY3RlZF9jaGFubmVsIC09IDQ7CisJCSAgICAgICBzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7CisJICAgICAgIH0KKworCSAgICAgICBpZiAoc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKQorCQkgICAgICAgY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgc2VsZWN0ZWRfY2hhbm5lbCwKKwkJCQkJCXBpeF9mb3JtYXQpOworCisJICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBFTkFCTEVfQ0lGX1JFU09MVVRJT046CisJICAgICAgIHNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJICAgICAgIGNpZl9lbmFibGUgPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3Jlc29sdXRpb25fZW5hYmxlOworCSAgICAgICBjaWZfd2lkdGggPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3dpZHRoOworCisJICAgICAgIGlmIChjaWZfZW5hYmxlKSB7CisJCSAgICAgICBpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKKwkJCSAgIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQorCQkJICAgICAgIHdpZHRoID0gMzUyOworCQkgICAgICAgZWxzZQorCQkJICAgICAgIHdpZHRoID0gKGNpZl93aWR0aCA9PSAzMjAKKwkJCQkJfHwgY2lmX3dpZHRoID09IDM1MikgPyBjaWZfd2lkdGggOiAzMjA7CisJICAgICAgIH0KKworCSAgICAgICBpZiAoIShzZWxlY3RlZF9jaGFubmVsIDw9IDcgJiYgc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKSkgeworCQkgICAgICAgc2VsZWN0ZWRfY2hhbm5lbCAtPSA0OworCQkgICAgICAgc2VsZWN0ZWRfY2hhbm5lbCA9IHNlbGVjdGVkX2NoYW5uZWwgJSA4OworCSAgICAgICB9CisKKwkgICAgICAgaWYgKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApIHsKKwkJICAgICAgIGRldi0+Y2hhbm5lbHNbc2VsZWN0ZWRfY2hhbm5lbF0uCisJCQkgICAgICAgdXNlX2NpZl9yZXNvbHV0aW9uID0gY2lmX2VuYWJsZTsKKwkJICAgICAgIGRldi0+Y2hhbm5lbHNbc2VsZWN0ZWRfY2hhbm5lbF0uY2lmX3dpZHRoID0gd2lkdGg7CisJICAgICAgIH0gZWxzZSB7CisJCSAgICAgICBmb3IgKGkgPSAwOyBpIDwgVklEX0NIQU5ORUxfTlVNOyBpKyspIHsKKwkJCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnVzZV9jaWZfcmVzb2x1dGlvbiA9CisJCQkJICAgICAgIGNpZl9lbmFibGU7CisJCQkgICAgICAgZGV2LT5jaGFubmVsc1tpXS5jaWZfd2lkdGggPSB3aWR0aDsKKwkJICAgICAgIH0KKwkgICAgICAgfQorCisJICAgICAgIG1lZHVzYV9zZXRfcmVzb2x1dGlvbihkZXYsIHdpZHRoLCBzZWxlY3RlZF9jaGFubmVsKTsKKwkgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBSRUdfUkVBRDoKKwkgICAgICAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhID0gY3hfcmVhZChkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MpOworCSAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFJFR19XUklURToKKwkgICAgICAgY3hfd3JpdGUoZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLCBkYXRhX2Zyb21fdXNlci0+cmVnX2RhdGEpOworCSAgICAgICBicmVhazsKKyAgICAgICBjYXNlIE1FRFVTQV9SRUFEOgorCSAgICAgICB2YWx1ZSA9CisJCSAgIGN4MjU4MjFfaTJjX3JlYWQoJmRldi0+aTJjX2J1c1swXSwKKwkJCQkgICAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCSAgICAmZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKKwkgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBNRURVU0FfV1JJVEU6CisJICAgICAgIGN4MjU4MjFfaTJjX3dyaXRlKCZkZXYtPmkyY19idXNbMF0sCisJCQkJICh1MTYpIGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcywKKwkJCQkgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKKwkgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGN4MjU4MjFfdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgaW50ICByZXQgPSAwOworCisgICAgICAgc3RydWN0IGN4MjU4MjFfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKyAgICAgICAvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aGUgdmlkZW8gdXBzdHJlYW0gKi8KKyAgICAgICBpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDA5KSB7CisJICAgICAgIHJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShmaWxlLCBjbWQsIGFyZyk7CisJICAgICAgIHJldHVybiByZXQ7CisgICAgICAgfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTApIHsKKwkgICAgICAgcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMChmaWxlLCBjbWQsIGFyZyk7CisJICAgICAgIHJldHVybiByZXQ7CisgICAgICAgfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTEpIHsKKwkgICAgICAgcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMShmaWxlLCBjbWQsIGFyZyk7CisJICAgICAgIHJldCA9IHZpZGVvX2lvY3RsX3NldChmaWxlLCBjbWQsIGFyZyk7CisJICAgICAgIHJldHVybiByZXQ7CisgICAgICAgfQorCisgICAgcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7Cit9CisKKy8qIGV4cG9ydGVkIHN0dWZmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7CisgICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgICAgLm9wZW4gPSB2aWRlb19vcGVuLAorICAgICAgIC5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKKyAgICAgICAucmVhZCA9IHZpZGVvX3JlYWQsCisgICAgICAgLnBvbGwgPSB2aWRlb19wb2xsLAorICAgICAgIC5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAorICAgICAgIC5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKKyAgICAgICAudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCisgICAgICAgLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKKyAgICAgICAudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAorICAgICAgIC52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorICAgICAgIC52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAorICAgICAgIC52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCisgICAgICAgLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAorICAgICAgIC52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCisgICAgICAgLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKKyNpZmRlZiBUVU5FUl9GTEFHCisgICAgICAgLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAorICAgICAgIC52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKKyNlbmRpZgorICAgICAgIC52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCisgICAgICAgLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCisgICAgICAgLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCisgICAgICAgLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKKyAgICAgICAudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAorICAgICAgIC52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCisgICAgICAgLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCisgICAgICAgLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAorICAgICAgIC52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAorICAgICAgIC52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCisgICAgICAgLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorICAgICAgIC52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAorICAgICAgIC52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCisgICAgICAgLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKKyNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKKyAgICAgICAudmlkaW9jZ21idWYgPSBjeDI1ODIxX3ZpZGlvY2dtYnVmLAorI2VuZGlmCisjaWZkZWYgVFVORVJfRkxBRworICAgICAgIC52aWRpb2NfZ190dW5lciA9IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIsCisgICAgICAgLnZpZGlvY19zX3R1bmVyID0gY3gyNTgyMV92aWRpb2Nfc190dW5lciwKKyAgICAgICAudmlkaW9jX2dfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2NfZ19mcmVxdWVuY3ksCisgICAgICAgLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworICAgICAgIC52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCisgICAgICAgLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvaW9jdGxfdGVtcGxhdGUgPSB7CisJICAgICAgIC5uYW1lID0gImN4MjU4MjEtdmlkZW9pb2N0bCIsCisJICAgICAgIC5mb3BzID0gJnZpZGVvX2ZvcHMsCisJICAgICAgIC5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAorCSAgICAgICAudHZub3JtcyA9IENYMjU4MjFfTk9STVMsCisJICAgICAgIC5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oCmluZGV4IDBiZGRjMDIuLmNjNjAzNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmgKQEAgLTU0LDcgKzU0LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiJXMvMDogIiBmbXQsIGRldi0+bmFtZSwgIyMgYXJnKTtcCiAgICAgfSB3aGlsZSAoMCkKIAotLy9Gb3IgSU9DVEwgdG8gaWRlbnRpZnkgcnVubmluZyB1cHN0cmVhbQorLyogRm9yIElPQ1RMIHRvIGlkZW50aWZ5IHJ1bm5pbmcgdXBzdHJlYW0gKi8KICNkZWZpbmUgVVBTVFJFQU1fU1RBUlRfVklERU8gICAgICAgIDcwMAogI2RlZmluZSBVUFNUUkVBTV9TVE9QX1ZJREVPICAgICAgICAgNzAxCiAjZGVmaW5lIFVQU1RSRUFNX1NUQVJUX0FVRElPICAgICAgICA3MDIKQEAgLTgwLDE5ICs4MCw4IEBACiBleHRlcm4gc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbDk7CiBleHRlcm4gc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbDEwOwogZXh0ZXJuIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwxMTsKLWV4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUwOwotZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb190ZW1wbGF0ZTE7Ci1leHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlMjsKLWV4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUzOwotZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb190ZW1wbGF0ZTQ7Ci1leHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlNTsKLWV4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGU2OwotZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb190ZW1wbGF0ZTc7Ci1leHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlOTsKLWV4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUxMDsKLWV4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUxMTsKIGV4dGVybiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9pb2N0bF90ZW1wbGF0ZTsKLS8vZXh0ZXJuIGNvbnN0IHUzMiAqY3RybF9jbGFzc2VzW107CisvKiBleHRlcm4gY29uc3QgdTMyICpjdHJsX2NsYXNzZXNbXTsgKi8KIAogZXh0ZXJuIHVuc2lnbmVkIGludCB2aWRfbGltaXQ7CiAKQEAgLTExMyw3ICsxMDIsNyBAQAogZXh0ZXJuIGludCBjeDI1ODIxX3Jlc19nZXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwKIAkJICAgdW5zaWduZWQgaW50IGJpdCk7CiBleHRlcm4gaW50IGN4MjU4MjFfcmVzX2NoZWNrKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCk7Ci1leHRlcm4gaW50IGN4MjU4MjFfcmVzX2xvY2tlZChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGJpdCk7CitleHRlcm4gaW50IGN4MjU4MjFfcmVzX2xvY2tlZChzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpOwogZXh0ZXJuIHZvaWQgY3gyNTgyMV9yZXNfZnJlZShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZmggKmZoLAogCQkgICAgIHVuc2lnbmVkIGludCBiaXRzKTsKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRlb19tdXgoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBpbnB1dCk7CkBAIC0xMjYsOCArMTE1LDcgQEAKIAkJCSAgICAgdW5zaWduZWQgaW50IGhlaWdodCwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKTsKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRlb19pcnEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSwgdTMyIHN0YXR1cyk7CiBleHRlcm4gdm9pZCBjeDI1ODIxX3ZpZGVvX3VucmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSk7Ci1leHRlcm4gaW50IGN4MjU4MjFfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSwKLQkJCQkgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX3RlbXBsYXRlKTsKK2V4dGVybiBpbnQgY3gyNTgyMV92aWRlb19yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CiBleHRlcm4gaW50IGN4MjU4MjFfZ2V0X2Zvcm1hdF9zaXplKHZvaWQpOwogCiBleHRlcm4gaW50IGN4MjU4MjFfYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpjb3VudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8wLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmUyY2MxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjeDI1ODIxLXZpZGVvLmgiCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpwcmV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcVtTUkFNX0NIMDBdOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMF0pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBTUkFNX0NIMDA7Ci0JcGl4X2Zvcm1hdCA9Ci0JICAgIChkZXYtPnBpeGVsX2Zvcm1hdHNbZGV2LT5jaGFubmVsX29wZW5lZF0gPT0KLQkgICAgIFBJWEVMX0ZSTVRfNDExKSA/IFY0TDJfUElYX0ZNVF9ZNDFQIDogVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7Ci0KLQl2NGwyX3ByaW9fb3BlbigmZGV2LT5wcmlvLCAmZmgtPnByaW8pOwotCi0JdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCi0JCQkgICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAotCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKLQotCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlpZiAoY3gyNTgyMV9yZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPMCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDAwXSkgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAotCQkJCSAgICAgICAoZmgtPndpZHRoICogMikpOwotCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JY3hfd3JpdGUoY2hhbm5lbDAtPmRtYV9jdGwsIDApOwkvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KLQotCS8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8wKSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzApOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8wKSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzApOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MjI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkcHJpbnRrKDIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JZXJyID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIHByaXYsIGYpOwotCi0JaWYgKDAgIT0gZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JZmgtPnZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCi0JLy8gY2hlY2sgaWYgd2lkdGggYW5kIGhlaWdodCBpcyB2YWxpZCBiYXNlZCBvbiBzZXQgc3RhbmRhcmQKLQlpZiAoY3gyNTgyMV9pc192YWxpZF93aWR0aChmLT5mbXQucGl4LndpZHRoLCBkZXYtPnR2bm9ybSkpIHsKLQkJZmgtPndpZHRoID0gZi0+Zm10LnBpeC53aWR0aDsKLQl9Ci0KLQlpZiAoY3gyNTgyMV9pc192YWxpZF9oZWlnaHQoZi0+Zm10LnBpeC5oZWlnaHQsIGRldi0+dHZub3JtKSkgewotCQlmaC0+aGVpZ2h0ID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JfQotCi0JaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1k0MVApCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQxMTsKLQllbHNlIGlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVlWKQotCQlwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MjI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWN4MjU4MjFfc2V0X3BpeGVsX2Zvcm1hdChkZXYsIFNSQU1fQ0gwMCwgcGl4X2Zvcm1hdCk7Ci0KLQkvLyBjaGVjayBpZiBjaWYgcmVzb2x1dGlvbgotCWlmIChmaC0+d2lkdGggPT0gMzIwIHx8IGZoLT53aWR0aCA9PSAzNTIpIHsKLQkJZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDAwXSA9IDE7Ci0JfSBlbHNlIHsKLQkJZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDAwXSA9IDA7Ci0JfQotCWRldi0+Y2lmX3dpZHRoW1NSQU1fQ0gwMF0gPSBmaC0+d2lkdGg7Ci0JbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgZmgtPndpZHRoLCBTUkFNX0NIMDApOwotCi0JZHByaW50aygyLCAiJXMoKSB3aWR0aD0lZCBoZWlnaHQ9JWQgZmllbGQ9JWRcbiIsIF9fZnVuY19fLCBmaC0+d2lkdGgsCi0JCWZoLT5oZWlnaHQsIGZoLT52aWRxLmZpZWxkKTsKLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgdmlkZW8sIHNfZm10LCBmKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCWludCByZXRfdmFsID0gMDsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0KLQlyZXRfdmFsID0gdmlkZW9idWZfZHFidWYoZ2V0X3F1ZXVlKGZoKSwgcCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JcC0+c2VxdWVuY2UgPSBkZXYtPnZpZHFbU1JBTV9DSDAwXS5jb3VudDsKLQotCXJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19sb2dfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JY2hhciBuYW1lWzMyICsgMl07Ci0KLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0gJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDBdOwotCXUzMiB0bXAgPSAwOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVmlkZW8gaW5wdXQgMCBpcyAlc1xuIiwKLQkgICAgICAgKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIGN4MjU4MjFfc2V0X2NvbnRyb2woZGV2LCBjdGwsIFNSQU1fQ0gwMCk7Ci19Ci0KLS8vIGV4cG9ydGVkIHN0dWZmCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gY3gyNTgyMV92aWRpb2NfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmID0gY3gyNTgyMV92aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmID0gY3gyNTgyMV92aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX3Nfc3RkID0gY3gyNTgyMV92aWRpb2Nfc19zdGQsCi0JLnZpZGlvY19xdWVyeXN0ZCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkLAotI2VuZGlmCi0JLnZpZGlvY19jcm9wY2FwID0gY3gyNTgyMV92aWRpb2NfY3JvcGNhcCwKLQkudmlkaW9jX3NfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX3NfY3JvcCwKLQkudmlkaW9jX2dfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX2dfY3JvcCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0LAotCS52aWRpb2NfZ19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ID0gY3gyNTgyMV92aWRpb2Nfc19pbnB1dCwKLQkudmlkaW9jX2dfY3RybCA9IGN4MjU4MjFfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCA9IHZpZGlvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19zdHJlYW1vbiA9IHZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZiA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19sb2dfc3RhdHVzID0gdmlkaW9jX2xvZ19zdGF0dXMsCi0JLnZpZGlvY19nX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5LAotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCS52aWRpb2NnbWJ1ZiA9IGN4MjU4MjFfdmlkaW9jZ21idWYsCi0jZW5kaWYKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUwID0gewotCS5uYW1lID0gImN4MjU4MjEtdmlkZW8iLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYmFlNjI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8xLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjeDI1ODIxLXZpZGVvLmgiCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpwcmV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcVtTUkFNX0NIMDFdOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMV0pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBTUkFNX0NIMDE7Ci0JcGl4X2Zvcm1hdCA9Ci0JICAgIChkZXYtPnBpeGVsX2Zvcm1hdHNbZGV2LT5jaGFubmVsX29wZW5lZF0gPT0KLQkgICAgIFBJWEVMX0ZSTVRfNDExKSA/IFY0TDJfUElYX0ZNVF9ZNDFQIDogVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7Ci0KLQl2NGwyX3ByaW9fb3BlbigmZGV2LT5wcmlvLCAmZmgtPnByaW8pOwotCi0JdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCi0JCQkgICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAotCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKLQotCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlpZiAoY3gyNTgyMV9yZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPMSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMSkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDAxXSkgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAotCQkJCSAgICAgICAoZmgtPndpZHRoICogMikpOwotCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JY3hfd3JpdGUoY2hhbm5lbDEtPmRtYV9jdGwsIDApOwkvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KLQotCS8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8xKSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzEpOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8xKSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzEpOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gMDsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvLyBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZAotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkgewotCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCX0KLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKLQl9Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDAxLCBwaXhfZm9ybWF0KTsKLQotCS8vIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDFdID0gMTsKLQl9IGVsc2UgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDFdID0gMDsKLQl9Ci0JZGV2LT5jaWZfd2lkdGhbU1JBTV9DSDAxXSA9IGZoLT53aWR0aDsKLQltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwMSk7Ci0KLQlkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKLQkJZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQotCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlwLT5zZXF1ZW5jZSA9IGRldi0+dmlkcVtTUkFNX0NIMDFdLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQljaGFyIG5hbWVbMzIgKyAyXTsKLQotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPSAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMV07Ci0JdTMyIHRtcCA9IDA7Ci0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy8yIiwgZGV2LT5uYW1lKTsKLQlwcmludGsoS0VSTl9JTkZPICIlcy8yOiA9PT09PT09PT09PT0gIFNUQVJUIExPRyBTVEFUVVMgID09PT09PT09PT09PVxuIiwKLQkgICAgICAgZGV2LT5uYW1lKTsKLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgbG9nX3N0YXR1cyk7Ci0JdG1wID0gY3hfcmVhZChzcmFtX2NoLT5kbWFfY3RsKTsKLQlwcmludGsoS0VSTl9JTkZPICJWaWRlbyBpbnB1dCAxIGlzICVzXG4iLAotCSAgICAgICAodG1wICYgMHgxMSkgPyAic3RyZWFtaW5nIiA6ICJzdG9wcGVkIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09PSAgRU5EIExPRyBTVEFUVVMgID09PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gY3gyNTgyMV9zZXRfY29udHJvbChkZXYsIGN0bCwgU1JBTV9DSDAxKTsKLX0KLQotLy9leHBvcnRlZCBzdHVmZgotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gdmlkZW9fb3BlbiwKLQkucmVsZWFzZSA9IHZpZGVvX3JlbGVhc2UsCi0JLnJlYWQgPSB2aWRlb19yZWFkLAotCS5wb2xsID0gdmlkZW9fcG9sbCwKLQkubW1hcCA9IGN4MjU4MjFfdmlkZW9fbW1hcCwKLQkuaW9jdGwgPSB2aWRlb19pb2N0bDIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkudmlkaW9jZ21idWYgPSBjeDI1ODIxX3ZpZGlvY2dtYnVmLAotI2VuZGlmCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2NfZ190dW5lciA9IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIsCi0JLnZpZGlvY19zX3R1bmVyID0gY3gyNTgyMV92aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2NfZ19mcmVxdWVuY3ksCi0JLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCi0JLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKLSNlbmRpZgotfTsKLQotc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlMSA9IHsKLQkubmFtZSA9ICJjeDI1ODIxLXZpZGVvIiwKLQkuZm9wcyA9ICZ2aWRlb19mb3BzLAotCS5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAotCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKLQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8yLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBjZGI4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjeDI1ODIxLXZpZGVvLmgiCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpwcmV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcVtTUkFNX0NIMDJdOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMl0pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBTUkFNX0NIMDI7Ci0JcGl4X2Zvcm1hdCA9Ci0JICAgIChkZXYtPnBpeGVsX2Zvcm1hdHNbZGV2LT5jaGFubmVsX29wZW5lZF0gPT0KLQkgICAgIFBJWEVMX0ZSTVRfNDExKSA/IFY0TDJfUElYX0ZNVF9ZNDFQIDogVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7Ci0KLQl2NGwyX3ByaW9fb3BlbigmZGV2LT5wcmlvLCAmZmgtPnByaW8pOwotCi0JdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCi0JCQkgICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAotCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKLQotCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlpZiAoY3gyNTgyMV9yZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPMikpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMikpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDAyXSkgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAotCQkJCSAgICAgICAoZmgtPndpZHRoICogMikpOwotCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JY3hfd3JpdGUoY2hhbm5lbDItPmRtYV9jdGwsIDApOwkvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KLQotCS8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8yKSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzIpOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8yKSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzIpOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gMDsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvLyBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZAotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkgewotCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCX0KLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKLQl9Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDAyLCBwaXhfZm9ybWF0KTsKLQotCS8vIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDJdID0gMTsKLQl9IGVsc2UgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDJdID0gMDsKLQl9Ci0JZGV2LT5jaWZfd2lkdGhbU1JBTV9DSDAyXSA9IGZoLT53aWR0aDsKLQltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwMik7Ci0KLQlkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKLQkJZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQotCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlwLT5zZXF1ZW5jZSA9IGRldi0+dmlkcVtTUkFNX0NIMDJdLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQljaGFyIG5hbWVbMzIgKyAyXTsKLQotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPSAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMl07Ci0JdTMyIHRtcCA9IDA7Ci0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy8yIiwgZGV2LT5uYW1lKTsKLQlwcmludGsoS0VSTl9JTkZPICIlcy8yOiA9PT09PT09PT09PT0gIFNUQVJUIExPRyBTVEFUVVMgID09PT09PT09PT09PVxuIiwKLQkgICAgICAgZGV2LT5uYW1lKTsKLQotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBsb2dfc3RhdHVzKTsKLQotCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVmlkZW8gaW5wdXQgMiBpcyAlc1xuIiwKLQkgICAgICAgKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIGN4MjU4MjFfc2V0X2NvbnRyb2woZGV2LCBjdGwsIFNSQU1fQ0gwMik7Ci19Ci0KLS8vIGV4cG9ydGVkIHN0dWZmCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gY3gyNTgyMV92aWRpb2NfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmID0gY3gyNTgyMV92aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmID0gY3gyNTgyMV92aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX3Nfc3RkID0gY3gyNTgyMV92aWRpb2Nfc19zdGQsCi0JLnZpZGlvY19xdWVyeXN0ZCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkLAotI2VuZGlmCi0JLnZpZGlvY19jcm9wY2FwID0gY3gyNTgyMV92aWRpb2NfY3JvcGNhcCwKLQkudmlkaW9jX3NfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX3NfY3JvcCwKLQkudmlkaW9jX2dfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX2dfY3JvcCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0LAotCS52aWRpb2NfZ19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ID0gY3gyNTgyMV92aWRpb2Nfc19pbnB1dCwKLQkudmlkaW9jX2dfY3RybCA9IGN4MjU4MjFfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCA9IHZpZGlvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19zdHJlYW1vbiA9IHZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZiA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19sb2dfc3RhdHVzID0gdmlkaW9jX2xvZ19zdGF0dXMsCi0JLnZpZGlvY19nX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5LAotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCS52aWRpb2NnbWJ1ZiA9IGN4MjU4MjFfdmlkaW9jZ21idWYsCi0jZW5kaWYKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUyID0gewotCS5uYW1lID0gImN4MjU4MjEtdmlkZW8iLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjE2ZWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzMuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgotICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KLSAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKLQotc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KLQkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKnByZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT52aWRxW1NSQU1fQ0gwM107Ci0KLQkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCi0JYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7Ci0JYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKLQlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7CS8qIGJpdHMgNjMtMzIgKi8KLQotCWRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwgYnVmLAotCQkJYnVmLT52Yi5pKTsKLQotCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsCi0JCQkJCSZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDAzXSk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMiwKLQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZSwgYnVmIGNudCA9ICVkLCBxLT5jb3VudCA9ICVkXG4iLAotCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQsIHEtPmNvdW50KTsKLQl9IGVsc2UgewotCQlwcmV2ID0KLQkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQlpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAotCQkgICAgJiYgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0Ci0JCSAgICAmJiBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKLQotCQkJLyogNjQgYml0IGJpdHMgNjMtMzIgKi8KLQkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7Ci0JCQlkcHJpbnRrKDIsCi0JCQkJIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIGFjdGl2ZSwgYnVmLT5jb3VudD0lZFxuIiwKLQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCi0JCQkJYnVmLT52Yi5pKTsKLQkJfQotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWRwcmludGsoMiwgImFjdGl2ZSBxdWV1ZSBlbXB0eSFcbiIpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0gewotCS5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKLQkuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAotCS5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCi0JLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoOwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCXUzMiBwaXhfZm9ybWF0OwotCi0JcHJpbnRrKCJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAotCQl2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwotCi0JLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KLQlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGZoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ID0gZGV2OwotCWZoLT50eXBlID0gdHlwZTsKLQlmaC0+d2lkdGggPSA3MjA7Ci0KLQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspCi0JCWZoLT5oZWlnaHQgPSA1NzY7Ci0JZWxzZQotCQlmaC0+aGVpZ2h0ID0gNDgwOwotCi0JZGV2LT5jaGFubmVsX29wZW5lZCA9IFNSQU1fQ0gwMzsKLQlwaXhfZm9ybWF0ID0KLQkgICAgKGRldi0+cGl4ZWxfZm9ybWF0c1tkZXYtPmNoYW5uZWxfb3BlbmVkXSA9PQotCSAgICAgUElYRUxfRlJNVF80MTEpID8gVjRMMl9QSVhfRk1UX1k0MVAgOiBWNEwyX1BJWF9GTVRfWVVZVjsKLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhwaXhfZm9ybWF0KTsKLQotCXY0bDJfcHJpb19vcGVuKCZkZXYtPnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCi0JCQkgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYnVmZmVyKSwgZmgpOwotCi0JZHByaW50aygxLCAicG9zdCB2aWRlb2J1Zl9xdWV1ZV9pbml0KClcbiIpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgtPmRldiwgUkVTT1VSQ0VfVklERU8zKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsCi0JCQkJCSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKLQotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8zKSkgewotCQkvKiBzdHJlYW1pbmcgY2FwdHVyZSAqLwotCQlpZiAobGlzdF9lbXB0eSgmZmgtPnZpZHEuc3RyZWFtKSkKLQkJCXJldHVybiBQT0xMRVJSOwotCQlidWYgPSBsaXN0X2VudHJ5KGZoLT52aWRxLnN0cmVhbS5uZXh0LAotCQkJCSBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnN0cmVhbSk7Ci0JfSBlbHNlIHsKLQkJLyogcmVhZCgpIGNhcHR1cmUgKi8KLQkJYnVmID0gKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqKWZoLT52aWRxLnJlYWRfYnVmOwotCQlpZiAoTlVMTCA9PSBidWYpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQl9Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7Ci0JaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fCBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKSB7Ci0JCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUpIHsKLQkJCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCQkJaWYgKGRldiAmJiBkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDNdKSB7Ci0JCQkJdTggY2FtX2lkID0gKigoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAzKTsKLQkJCQltZW1jcHkoKGNoYXIgKilidWYtPnZiLmJhZGRyLAotCQkJCSAgICAgICAoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAoZmgtPndpZHRoICogMiksCi0JCQkJICAgICAgIChmaC0+d2lkdGggKiAyKSk7Ci0JCQkJKigoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAzKSA9IGNhbV9pZDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCS8vc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8KLQljeF93cml0ZShjaGFubmVsMy0+ZG1hX2N0bCwgMCk7CS8qIEZJRk8gYW5kIFJJU0MgZGlzYWJsZSAqLwotCi0JLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzMpKSB7Ci0JCXZpZGVvYnVmX3F1ZXVlX2NhbmNlbCgmZmgtPnZpZHEpOwotCQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZJREVPMyk7Ci0JfQotCi0JaWYgKGZoLT52aWRxLnJlYWRfYnVmKSB7Ci0JCWN4MjU4MjFfYnVmZmVyX3JlbGVhc2UoJmZoLT52aWRxLCBmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JCWtmcmVlKGZoLT52aWRxLnJlYWRfYnVmKTsKLQl9Ci0KLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKLQotCXY0bDJfcHJpb19jbG9zZSgmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlrZnJlZShmaCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzMpKSkpIHsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oZ2V0X3F1ZXVlKGZoKSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGVyciwgcmVzOwotCi0JaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGkgIT0gZmgtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gY3gyNTgyMV9nZXRfcmVzb3VyY2UoZmgsIFJFU09VUkNFX1ZJREVPMyk7Ci0JZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKGdldF9xdWV1ZShmaCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgcmVzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0JaW50IHBpeF9mb3JtYXQgPSAwOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JZHByaW50aygyLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCWVyciA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBwcml2LCBmKTsKLQotCWlmICgwICE9IGVycikKLQkJcmV0dXJuIGVycjsKLQotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKLQotCS8vIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkCi0JaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT53aWR0aCA9IGYtPmZtdC5waXgud2lkdGg7Ci0JfQotCi0JaWYgKGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KGYtPmZtdC5waXguaGVpZ2h0LCBkZXYtPnR2bm9ybSkpIHsKLQkJZmgtPmhlaWdodCA9IGYtPmZtdC5waXguaGVpZ2h0OwotCX0KLQotCWlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZNDFQKQotCQlwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MTE7Ci0JZWxzZSBpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBTUkFNX0NIMDMsIHBpeF9mb3JtYXQpOwotCi0JLy8gY2hlY2sgaWYgY2lmIHJlc29sdXRpb24KLQlpZiAoZmgtPndpZHRoID09IDMyMCB8fCBmaC0+d2lkdGggPT0gMzUyKSB7Ci0JCWRldi0+dXNlX2NpZl9yZXNvbHV0aW9uW1NSQU1fQ0gwM10gPSAxOwotCX0gZWxzZSB7Ci0JCWRldi0+dXNlX2NpZl9yZXNvbHV0aW9uW1NSQU1fQ0gwM10gPSAwOwotCX0KLQlkZXYtPmNpZl93aWR0aFtTUkFNX0NIMDNdID0gZmgtPndpZHRoOwotCW1lZHVzYV9zZXRfcmVzb2x1dGlvbihkZXYsIGZoLT53aWR0aCwgU1JBTV9DSDAzKTsKLQotCWRwcmludGsoMiwgIiVzKCkgd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAotCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIHZpZGVvLCBzX2ZtdCwgZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlpbnQgcmV0X3ZhbCA9IDA7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JcmV0X3ZhbCA9IHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQotCXAtPnNlcXVlbmNlID0gZGV2LT52aWRxW1NSQU1fQ0gwM10uY291bnQ7Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWNoYXIgbmFtZVszMiArIDJdOwotCi0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9ICZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDAzXTsKLQl1MzIgdG1wID0gMDsKLQotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLzIiLCBkZXYtPm5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PSAgU1RBUlQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBsb2dfc3RhdHVzKTsKLQotCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVmlkZW8gaW5wdXQgMyBpcyAlc1xuIiwKLQkgICAgICAgKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIGN4MjU4MjFfc2V0X2NvbnRyb2woZGV2LCBjdGwsIFNSQU1fQ0gwMyk7Ci19Ci0KLS8vIGV4cG9ydGVkIHN0dWZmCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gY3gyNTgyMV92aWRpb2NfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmID0gY3gyNTgyMV92aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmID0gY3gyNTgyMV92aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX3Nfc3RkID0gY3gyNTgyMV92aWRpb2Nfc19zdGQsCi0JLnZpZGlvY19xdWVyeXN0ZCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkLAotI2VuZGlmCi0JLnZpZGlvY19jcm9wY2FwID0gY3gyNTgyMV92aWRpb2NfY3JvcGNhcCwKLQkudmlkaW9jX3NfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX3NfY3JvcCwKLQkudmlkaW9jX2dfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX2dfY3JvcCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0LAotCS52aWRpb2NfZ19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ID0gY3gyNTgyMV92aWRpb2Nfc19pbnB1dCwKLQkudmlkaW9jX2dfY3RybCA9IGN4MjU4MjFfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCA9IHZpZGlvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19zdHJlYW1vbiA9IHZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZiA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19sb2dfc3RhdHVzID0gdmlkaW9jX2xvZ19zdGF0dXMsCi0JLnZpZGlvY19nX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5LAotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCS52aWRpb2NnbWJ1ZiA9IGN4MjU4MjFfdmlkaW9jZ21idWYsCi0jZW5kaWYKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGUzID0gewotCS5uYW1lID0gImN4MjU4MjEtdmlkZW8iLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW80LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjA4YzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzQuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgotICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KLSAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKLQotc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KLQkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKnByZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT52aWRxW1NSQU1fQ0gwNF07Ci0KLQkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCi0JYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7Ci0JYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKLQlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7CS8qIGJpdHMgNjMtMzIgKi8KLQotCWRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwgYnVmLAotCQkJYnVmLT52Yi5pKTsKLQotCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsCi0JCQkJCSZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDA0XSk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMiwKLQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZSwgYnVmIGNudCA9ICVkLCBxLT5jb3VudCA9ICVkXG4iLAotCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQsIHEtPmNvdW50KTsKLQl9IGVsc2UgewotCQlwcmV2ID0KLQkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQlpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAotCQkgICAgJiYgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0Ci0JCSAgICAmJiBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKLQotCQkJLyogNjQgYml0IGJpdHMgNjMtMzIgKi8KLQkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7Ci0JCQlkcHJpbnRrKDIsCi0JCQkJIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIGFjdGl2ZSwgYnVmLT5jb3VudD0lZFxuIiwKLQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCi0JCQkJYnVmLT52Yi5pKTsKLQkJfQotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWRwcmludGsoMiwgImFjdGl2ZSBxdWV1ZSBlbXB0eSFcbiIpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0gewotCS5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKLQkuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAotCS5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCi0JLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoOwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCXUzMiBwaXhfZm9ybWF0OwotCi0JcHJpbnRrKCJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAotCQl2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwotCi0JLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KLQlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGZoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ID0gZGV2OwotCWZoLT50eXBlID0gdHlwZTsKLQlmaC0+d2lkdGggPSA3MjA7Ci0KLQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspCi0JCWZoLT5oZWlnaHQgPSA1NzY7Ci0JZWxzZQotCQlmaC0+aGVpZ2h0ID0gNDgwOwotCi0JZGV2LT5jaGFubmVsX29wZW5lZCA9IFNSQU1fQ0gwNDsKLQlwaXhfZm9ybWF0ID0KLQkgICAgKGRldi0+cGl4ZWxfZm9ybWF0c1tkZXYtPmNoYW5uZWxfb3BlbmVkXSA9PQotCSAgICAgUElYRUxfRlJNVF80MTEpID8gVjRMMl9QSVhfRk1UX1k0MVAgOiBWNEwyX1BJWF9GTVRfWVVZVjsKLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhwaXhfZm9ybWF0KTsKLQotCXY0bDJfcHJpb19vcGVuKCZkZXYtPnByaW8sICZmaC0+cHJpbyk7Ci0JdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCi0JCQkgICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAotCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKLQotCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlpZiAoY3gyNTgyMV9yZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPNCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPNCkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDA0XSkgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAotCQkJCSAgICAgICAoZmgtPndpZHRoICogMikpOwotCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JY3hfd3JpdGUoY2hhbm5lbDQtPmRtYV9jdGwsIDApOwkvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KLQotCS8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU80KSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzQpOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU80KSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzQpOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gMDsKLQotCS8vIGNoZWNrIHByaW9yaXR5Ci0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvLyBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZAotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkgewotCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCX0KLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKLQl9Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDA0LCBwaXhfZm9ybWF0KTsKLQotCS8vIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDRdID0gMTsKLQl9IGVsc2UgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDRdID0gMDsKLQl9Ci0JZGV2LT5jaWZfd2lkdGhbU1JBTV9DSDA0XSA9IGZoLT53aWR0aDsKLQltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwNCk7Ci0KLQlkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKLQkJZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQotCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlwLT5zZXF1ZW5jZSA9IGRldi0+dmlkcVtTUkFNX0NIMDRdLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQljaGFyIG5hbWVbMzIgKyAyXTsKLQotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPSAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwNF07Ci0JdTMyIHRtcCA9IDA7Ci0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy8yIiwgZGV2LT5uYW1lKTsKLQlwcmludGsoS0VSTl9JTkZPICIlcy8yOiA9PT09PT09PT09PT0gIFNUQVJUIExPRyBTVEFUVVMgID09PT09PT09PT09PVxuIiwKLQkgICAgICAgZGV2LT5uYW1lKTsKLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgbG9nX3N0YXR1cyk7Ci0KLQl0bXAgPSBjeF9yZWFkKHNyYW1fY2gtPmRtYV9jdGwpOwotCXByaW50ayhLRVJOX0lORk8gIlZpZGVvIGlucHV0IDQgaXMgJXNcbiIsCi0JICAgICAgICh0bXAgJiAweDExKSA/ICJzdHJlYW1pbmciIDogInN0b3BwZWQiKTsKLQlwcmludGsoS0VSTl9JTkZPICIlcy8yOiA9PT09PT09PT09PT09ICBFTkQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09PVxuIiwKLQkgICAgICAgZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiBjeDI1ODIxX3NldF9jb250cm9sKGRldiwgY3RsLCBTUkFNX0NIMDQpOwotfQotCi0vLyBleHBvcnRlZCBzdHVmZgotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gdmlkZW9fb3BlbiwKLQkucmVsZWFzZSA9IHZpZGVvX3JlbGVhc2UsCi0JLnJlYWQgPSB2aWRlb19yZWFkLAotCS5wb2xsID0gdmlkZW9fcG9sbCwKLQkubW1hcCA9IGN4MjU4MjFfdmlkZW9fbW1hcCwKLQkuaW9jdGwgPSB2aWRlb19pb2N0bDIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkudmlkaW9jZ21idWYgPSBjeDI1ODIxX3ZpZGlvY2dtYnVmLAotI2VuZGlmCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2NfZ190dW5lciA9IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIsCi0JLnZpZGlvY19zX3R1bmVyID0gY3gyNTgyMV92aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2NfZ19mcmVxdWVuY3ksCi0JLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCi0JLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKLSNlbmRpZgotfTsKLQotc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlNCA9IHsKLQkubmFtZSA9ICJjeDI1ODIxLXZpZGVvIiwKLQkuZm9wcyA9ICZ2aWRlb19mb3BzLAotCS5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAotCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKLQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW81LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM3MDMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW81LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjeDI1ODIxLXZpZGVvLmgiCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpwcmV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcVtTUkFNX0NIMDVdOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwNV0pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBTUkFNX0NIMDU7Ci0JcGl4X2Zvcm1hdCA9Ci0JICAgIChkZXYtPnBpeGVsX2Zvcm1hdHNbZGV2LT5jaGFubmVsX29wZW5lZF0gPT0KLQkgICAgIFBJWEVMX0ZSTVRfNDExKSA/IFY0TDJfUElYX0ZNVF9ZNDFQIDogVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7Ci0KLQl2NGwyX3ByaW9fb3BlbigmZGV2LT5wcmlvLCAmZmgtPnByaW8pOwotCi0JdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCi0JCQkgICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAotCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKLQotCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlpZiAoY3gyNTgyMV9yZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPNSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPNSkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDA1XSkgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAotCQkJCSAgICAgICAoZmgtPndpZHRoICogMikpOwotCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JY3hfd3JpdGUoY2hhbm5lbDUtPmRtYV9jdGwsIDApOwkvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KLQotCS8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU81KSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzUpOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU81KSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzUpOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gMDsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvLyBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZAotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkgewotCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCX0KLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKLQl9Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDA1LCBwaXhfZm9ybWF0KTsKLQotCS8vIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDVdID0gMTsKLQl9IGVsc2UgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDVdID0gMDsKLQl9Ci0JZGV2LT5jaWZfd2lkdGhbU1JBTV9DSDA1XSA9IGZoLT53aWR0aDsKLQltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwNSk7Ci0KLQlkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKLQkJZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQotCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlwLT5zZXF1ZW5jZSA9IGRldi0+dmlkcVtTUkFNX0NIMDVdLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci1zdGF0aWMgaW50IHZpZGlvY19sb2dfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JY2hhciBuYW1lWzMyICsgMl07Ci0KLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0gJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDVdOwotCXUzMiB0bXAgPSAwOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCi0JdG1wID0gY3hfcmVhZChzcmFtX2NoLT5kbWFfY3RsKTsKLQlwcmludGsoS0VSTl9JTkZPICJWaWRlbyBpbnB1dCA1IGlzICVzXG4iLAotCSAgICAgICAodG1wICYgMHgxMSkgPyAic3RyZWFtaW5nIiA6ICJzdG9wcGVkIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09PSAgRU5EIExPRyBTVEFUVVMgID09PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gY3gyNTgyMV9zZXRfY29udHJvbChkZXYsIGN0bCwgU1JBTV9DSDA1KTsKLX0KLQotLy8gZXhwb3J0ZWQgc3R1ZmYKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdmlkZW9fZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IHZpZGVvX29wZW4sCi0JLnJlbGVhc2UgPSB2aWRlb19yZWxlYXNlLAotCS5yZWFkID0gdmlkZW9fcmVhZCwKLQkucG9sbCA9IHZpZGVvX3BvbGwsCi0JLm1tYXAgPSBjeDI1ODIxX3ZpZGVvX21tYXAsCi0JLmlvY3RsID0gdmlkZW9faW9jdGwyLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHMgPSB7Ci0JLnZpZGlvY19xdWVyeWNhcCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5Y2FwLAotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZ19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3NfZm10X3ZpZF9jYXAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3JlcWJ1ZnMgPSBjeDI1ODIxX3ZpZGlvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWJ1ZiwKLQkudmlkaW9jX3FidWYgPSBjeDI1ODIxX3ZpZGlvY19xYnVmLAotCS52aWRpb2NfZHFidWYgPSB2aWRpb2NfZHFidWYsCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2Nfc19zdGQgPSBjeDI1ODIxX3ZpZGlvY19zX3N0ZCwKLQkudmlkaW9jX3F1ZXJ5c3RkID0gY3gyNTgyMV92aWRpb2NfcXVlcnlzdGQsCi0jZW5kaWYKLQkudmlkaW9jX2Nyb3BjYXAgPSBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwLAotCS52aWRpb2Nfc19jcm9wID0gY3gyNTgyMV92aWRpb2Nfc19jcm9wLAotCS52aWRpb2NfZ19jcm9wID0gY3gyNTgyMV92aWRpb2NfZ19jcm9wLAotCS52aWRpb2NfZW51bV9pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19nX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZ19pbnB1dCwKLQkudmlkaW9jX3NfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19zX2lucHV0LAotCS52aWRpb2NfZ19jdHJsID0gY3gyNTgyMV92aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsID0gdmlkaW9jX3NfY3RybCwKLQkudmlkaW9jX3F1ZXJ5Y3RybCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX3N0cmVhbW9uID0gdmlkaW9jX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmID0gdmlkaW9jX3N0cmVhbW9mZiwKLQkudmlkaW9jX2xvZ19zdGF0dXMgPSB2aWRpb2NfbG9nX3N0YXR1cywKLQkudmlkaW9jX2dfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19nX3ByaW9yaXR5LAotCS52aWRpb2Nfc19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX3NfcHJpb3JpdHksCi0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JLnZpZGlvY2dtYnVmID0gY3gyNTgyMV92aWRpb2NnbWJ1ZiwKLSNlbmRpZgotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX2dfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyLAotCS52aWRpb2Nfc190dW5lciA9IGN4MjU4MjFfdmlkaW9jX3NfdHVuZXIsCi0JLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX2dfZnJlcXVlbmN5LAotCS52aWRpb2Nfc19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19zX2ZyZXF1ZW5jeSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQkudmlkaW9jX2dfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19nX3JlZ2lzdGVyLAotCS52aWRpb2Nfc19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX3NfcmVnaXN0ZXIsCi0jZW5kaWYKLX07Ci0KLXN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb190ZW1wbGF0ZTUgPSB7Ci0JLm5hbWUgPSAiY3gyNTgyMS12aWRlbyIsCi0JLmZvcHMgPSAmdmlkZW9fZm9wcywKLQkuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKLQkudHZub3JtcyA9IENYMjU4MjFfTk9STVMsCi0JLmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0NfTSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvNi5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiMmViOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvNi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiAgRHJpdmVyIGZvciB0aGUgQ29uZXhhbnQgQ1gyNTgyMSBQQ0llIGJyaWRnZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDkgQ29uZXhhbnQgU3lzdGVtcyBJbmMuCi0gKiAgQXV0aG9ycyAgPHNodS5saW5AY29uZXhhbnQuY29tPiwgPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPgotICogIEJhc2VkIG9uIFN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4gY3gyMzg4NSBkcml2ZXIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKgotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY3gyNTgyMS12aWRlby5oIgotCi1zdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCi17Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYgPQotCSAgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPnZpZHFbU1JBTV9DSDA2XTsKLQotCS8qIGFkZCBqdW1wIHRvIHN0b3BwZXIgKi8KLQlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DKTsKLQlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIocS0+c3RvcHBlci5kbWEpOwotCWJ1Zi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsJLyogYml0cyA2My0zMiAqLwotCi0JZHByaW50aygyLCAiam1wIHRvIHN0b3BwZXIgKDB4JXgpXG4iLCBidWYtPnJpc2Muam1wWzFdKTsKLQotCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWVkKSkgewotCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gcXVldWVkXG4iLCBidWYsCi0JCQlidWYtPnZiLmkpOwotCi0JfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwKLQkJCQkJJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDZdKTsKLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIEJVRkZFUl9USU1FT1VUKTsKLQkJZHByaW50aygyLAotCQkJIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgYWN0aXZlLCBidWYgY250ID0gJWQsIHEtPmNvdW50ID0gJWRcbiIsCi0JCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCwgcS0+Y291bnQpOwotCX0gZWxzZSB7Ci0JCXByZXYgPQotCQkgICAgbGlzdF9lbnRyeShxLT5hY3RpdmUucHJldiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0JCWlmIChwcmV2LT52Yi53aWR0aCA9PSBidWYtPnZiLndpZHRoCi0JCSAgICAmJiBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQKLQkJICAgICYmIHByZXYtPmZtdCA9PSBidWYtPmZtdCkgewotCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwotCi0JCQkvKiA2NCBiaXQgYml0cyA2My0zMiAqLwotCQkJcHJldi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsKLQkJCWRwcmludGsoMiwKLQkJCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlLCBidWYtPmNvdW50PSVkXG4iLAotCQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50KTsKLQotCQl9IGVsc2UgewotCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7Ci0JCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCQlidWYtPnZiLmkpOwotCQl9Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJZHByaW50aygyLCAiYWN0aXZlIHF1ZXVlIGVtcHR5IVxuIik7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyBjeDI1ODIxX3ZpZGVvX3FvcHMgPSB7Ci0JLmJ1Zl9zZXR1cCA9IGN4MjU4MjFfYnVmZmVyX3NldHVwLAotCS5idWZfcHJlcGFyZSA9IGN4MjU4MjFfYnVmZmVyX3ByZXBhcmUsCi0JLmJ1Zl9xdWV1ZSA9IGJ1ZmZlcl9xdWV1ZSwKLQkuYnVmX3JlbGVhc2UgPSBjeDI1ODIxX2J1ZmZlcl9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCB2aWRlb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmg7Ci0JZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JdTMyIHBpeF9mb3JtYXQ7Ci0KLQlwcmludGsoIm9wZW4gZGV2PSVzIHR5cGU9JXNcbiIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldiksCi0JCXY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7Ci0KLQkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwotCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbG9ja19rZXJuZWwoKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwotCWZoLT5kZXYgPSBkZXY7Ci0JZmgtPnR5cGUgPSB0eXBlOwotCWZoLT53aWR0aCA9IDcyMDsKLQotCWlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9CRyB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKLQkJZmgtPmhlaWdodCA9IDU3NjsKLQllbHNlCi0JCWZoLT5oZWlnaHQgPSA0ODA7Ci0KLQlkZXYtPmNoYW5uZWxfb3BlbmVkID0gU1JBTV9DSDA2OwotCXBpeF9mb3JtYXQgPQotCSAgICAoZGV2LT5waXhlbF9mb3JtYXRzW2Rldi0+Y2hhbm5lbF9vcGVuZWRdID09Ci0JICAgICBQSVhFTF9GUk1UXzQxMSkgPyBWNEwyX1BJWF9GTVRfWTQxUCA6IFY0TDJfUElYX0ZNVF9ZVVlWOwotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKHBpeF9mb3JtYXQpOwotCi0JdjRsMl9wcmlvX29wZW4oJmRldi0+cHJpbywgJmZoLT5wcmlvKTsKLQotCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmY3gyNTgyMV92aWRlb19xb3BzLAotCQkJICAgICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKLQkJCSAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkgICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3gyNTgyMV9idWZmZXIpLCBmaCk7Ci0KLQlkcHJpbnRrKDEsICJwb3N0IHZpZGVvYnVmX3F1ZXVlX2luaXQoKVxuIik7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogZGF0YSwgc2l6ZV90IGNvdW50LAotCQkJICBsb2ZmX3QgKiBwcG9zKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXN3aXRjaCAoZmgtPnR5cGUpIHsKLQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJaWYgKGN4MjU4MjFfcmVzX2xvY2tlZChmaC0+ZGV2LCBSRVNPVVJDRV9WSURFTzYpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQotCQlyZXR1cm4gdmlkZW9idWZfcmVhZF9vbmUoJmZoLT52aWRxLCBkYXRhLCBjb3VudCwgcHBvcywKLQkJCQkJIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwotCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzYpKSB7Ci0JCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCi0JCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCi0JCQkJIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIuc3RyZWFtKTsKLQl9IGVsc2UgewotCQkvKiByZWFkKCkgY2FwdHVyZSAqLwotCQlidWYgPSAoc3RydWN0IGN4MjU4MjFfYnVmZmVyICopZmgtPnZpZHEucmVhZF9idWY7Ci0JCWlmIChOVUxMID09IGJ1ZikKLQkJCXJldHVybiBQT0xMRVJSOwotCX0KLQotCXBvbGxfd2FpdChmaWxlLCAmYnVmLT52Yi5kb25lLCB3YWl0KTsKLQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRVJST1IpIHsKLQkJaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSkgewotCQkJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JCQlpZiAoZGV2ICYmIGRldi0+dXNlX2NpZl9yZXNvbHV0aW9uW1NSQU1fQ0gwNl0pIHsKLQkJCQl1OCBjYW1faWQgPSAqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpOwotCQkJCW1lbWNweSgoY2hhciAqKWJ1Zi0+dmIuYmFkZHIsCi0JCQkJICAgICAgIChjaGFyICopYnVmLT52Yi5iYWRkciArIChmaC0+d2lkdGggKiAyKSwKLQkJCQkgICAgICAgKGZoLT53aWR0aCAqIDIpKTsKLQkJCQkqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpID0gY2FtX2lkOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JLy9zdG9wIHRoZSByaXNjIGVuZ2luZSBhbmQgZmlmbwotCWN4X3dyaXRlKGNoYW5uZWw2LT5kbWFfY3RsLCAwKTsJLyogRklGTyBhbmQgUklTQyBkaXNhYmxlICovCi0KLQkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPNikpIHsKLQkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZmaC0+dmlkcSk7Ci0JCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgUkVTT1VSQ0VfVklERU82KTsKLQl9Ci0JaWYgKGZoLT52aWRxLnJlYWRfYnVmKSB7Ci0JCWN4MjU4MjFfYnVmZmVyX3JlbGVhc2UoJmZoLT52aWRxLCBmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JCWtmcmVlKGZoLT52aWRxLnJlYWRfYnVmKTsKLQl9Ci0KLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKLQotCXY0bDJfcHJpb19jbG9zZSgmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlrZnJlZShmaCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzYpKSkpIHsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oZ2V0X3F1ZXVlKGZoKSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGVyciwgcmVzOwotCi0JaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGkgIT0gZmgtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gY3gyNTgyMV9nZXRfcmVzb3VyY2UoZmgsIFJFU09VUkNFX1ZJREVPNik7Ci0JZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKGdldF9xdWV1ZShmaCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgcmVzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0JaW50IHBpeF9mb3JtYXQgPSAwOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JZHByaW50aygyLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCWVyciA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBwcml2LCBmKTsKLQotCWlmICgwICE9IGVycikKLQkJcmV0dXJuIGVycjsKLQotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKLQotCS8vIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkCi0JaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT53aWR0aCA9IGYtPmZtdC5waXgud2lkdGg7Ci0JfQotCi0JaWYgKGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KGYtPmZtdC5waXguaGVpZ2h0LCBkZXYtPnR2bm9ybSkpIHsKLQkJZmgtPmhlaWdodCA9IGYtPmZtdC5waXguaGVpZ2h0OwotCX0KLQotCWlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZNDFQKQotCQlwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MTE7Ci0JZWxzZSBpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBTUkFNX0NIMDYsIHBpeF9mb3JtYXQpOwotCi0JLy8gY2hlY2sgaWYgY2lmIHJlc29sdXRpb24KLQlpZiAoZmgtPndpZHRoID09IDMyMCB8fCBmaC0+d2lkdGggPT0gMzUyKSB7Ci0JCWRldi0+dXNlX2NpZl9yZXNvbHV0aW9uW1NSQU1fQ0gwNl0gPSAxOwotCX0gZWxzZSB7Ci0JCWRldi0+dXNlX2NpZl9yZXNvbHV0aW9uW1NSQU1fQ0gwNl0gPSAwOwotCX0KLQlkZXYtPmNpZl93aWR0aFtTUkFNX0NIMDZdID0gZmgtPndpZHRoOwotCW1lZHVzYV9zZXRfcmVzb2x1dGlvbihkZXYsIGZoLT53aWR0aCwgU1JBTV9DSDA2KTsKLQotCWRwcmludGsoMiwgIiVzKCkgd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAotCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIHZpZGVvLCBzX2ZtdCwgZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlpbnQgcmV0X3ZhbCA9IDA7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JcmV0X3ZhbCA9IHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQotCXAtPnNlcXVlbmNlID0gZGV2LT52aWRxW1NSQU1fQ0gwNl0uY291bnQ7Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWNoYXIgbmFtZVszMiArIDJdOwotCi0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9ICZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDA2XTsKLQl1MzIgdG1wID0gMDsKLQotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLzIiLCBkZXYtPm5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PSAgU1RBUlQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBsb2dfc3RhdHVzKTsKLQotCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVmlkZW8gaW5wdXQgNiBpcyAlc1xuIiwKLQkgICAgICAgKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIGN4MjU4MjFfc2V0X2NvbnRyb2woZGV2LCBjdGwsIFNSQU1fQ0gwNik7Ci19Ci0KLS8vIGV4cG9ydGVkIHN0dWZmCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gY3gyNTgyMV92aWRpb2NfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmID0gY3gyNTgyMV92aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmID0gY3gyNTgyMV92aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX3Nfc3RkID0gY3gyNTgyMV92aWRpb2Nfc19zdGQsCi0JLnZpZGlvY19xdWVyeXN0ZCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkLAotI2VuZGlmCi0JLnZpZGlvY19jcm9wY2FwID0gY3gyNTgyMV92aWRpb2NfY3JvcGNhcCwKLQkudmlkaW9jX3NfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX3NfY3JvcCwKLQkudmlkaW9jX2dfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX2dfY3JvcCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0LAotCS52aWRpb2NfZ19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ID0gY3gyNTgyMV92aWRpb2Nfc19pbnB1dCwKLQkudmlkaW9jX2dfY3RybCA9IGN4MjU4MjFfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCA9IHZpZGlvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19zdHJlYW1vbiA9IHZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZiA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19sb2dfc3RhdHVzID0gdmlkaW9jX2xvZ19zdGF0dXMsCi0JLnZpZGlvY19nX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5LAotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCS52aWRpb2NnbWJ1ZiA9IGN4MjU4MjFfdmlkaW9jZ21idWYsCi0jZW5kaWYKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9fdGVtcGxhdGU2ID0gewotCS5uYW1lID0gImN4MjU4MjEtdmlkZW8iLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW83LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNGE3NjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlbzcuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgotICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KLSAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKLQotc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KLQkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKnByZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT52aWRxW1NSQU1fQ0gwN107Ci0KLQkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCi0JYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7Ci0JYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKLQlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7CS8qIGJpdHMgNjMtMzIgKi8KLQotCWRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwN10pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBTUkFNX0NIMDc7Ci0JcGl4X2Zvcm1hdCA9Ci0JICAgIChkZXYtPnBpeGVsX2Zvcm1hdHNbZGV2LT5jaGFubmVsX29wZW5lZF0gPT0KLQkgICAgIFBJWEVMX0ZSTVRfNDExKSA/IFY0TDJfUElYX0ZNVF9ZNDFQIDogVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7Ci0KLQl2NGwyX3ByaW9fb3BlbigmZGV2LT5wcmlvLCAmZmgtPnByaW8pOwotCi0JdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCi0JCQkgICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAotCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoKTsKLQotCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlpZiAoY3gyNTgyMV9yZXNfbG9ja2VkKGZoLT5kZXYsIFJFU09VUkNFX1ZJREVPNykpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPNykpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT51c2VfY2lmX3Jlc29sdXRpb25bU1JBTV9DSDA3XSkgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAotCQkJCSAgICAgICAoZmgtPndpZHRoICogMikpOwotCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JY3hfd3JpdGUoY2hhbm5lbDctPmRtYV9jdGwsIDApOwkvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KLQotCS8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU83KSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzcpOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU83KSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzcpOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gMDsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvLyBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZAotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkgewotCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCX0KLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKSB7Ci0JCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKLQl9Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDA3LCBwaXhfZm9ybWF0KTsKLQotCS8vIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDddID0gMTsKLQl9IGVsc2UgewotCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltTUkFNX0NIMDddID0gMDsKLQl9Ci0JZGV2LT5jaWZfd2lkdGhbU1JBTV9DSDA3XSA9IGZoLT53aWR0aDsKLQltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwNyk7Ci0KLQlkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKLQkJZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQotCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlwLT5zZXF1ZW5jZSA9IGRldi0+dmlkcVtTUkFNX0NIMDddLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci1zdGF0aWMgaW50IHZpZGlvY19sb2dfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JY2hhciBuYW1lWzMyICsgMl07Ci0KLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0gJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDddOwotCXUzMiB0bXAgPSAwOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCi0JdG1wID0gY3hfcmVhZChzcmFtX2NoLT5kbWFfY3RsKTsKLQlwcmludGsoS0VSTl9JTkZPICJWaWRlbyBpbnB1dCA3IGlzICVzXG4iLAotCSAgICAgICAodG1wICYgMHgxMSkgPyAic3RyZWFtaW5nIiA6ICJzdG9wcGVkIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09PSAgRU5EIExPRyBTVEFUVVMgID09PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gY3gyNTgyMV9zZXRfY29udHJvbChkZXYsIGN0bCwgU1JBTV9DSDA3KTsKLX0KLQotLy8gZXhwb3J0ZWQgc3R1ZmYKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdmlkZW9fZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IHZpZGVvX29wZW4sCi0JLnJlbGVhc2UgPSB2aWRlb19yZWxlYXNlLAotCS5yZWFkID0gdmlkZW9fcmVhZCwKLQkucG9sbCA9IHZpZGVvX3BvbGwsCi0JLm1tYXAgPSBjeDI1ODIxX3ZpZGVvX21tYXAsCi0JLmlvY3RsID0gdmlkZW9faW9jdGwyLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHMgPSB7Ci0JLnZpZGlvY19xdWVyeWNhcCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5Y2FwLAotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZ19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3NfZm10X3ZpZF9jYXAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3JlcWJ1ZnMgPSBjeDI1ODIxX3ZpZGlvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWJ1ZiwKLQkudmlkaW9jX3FidWYgPSBjeDI1ODIxX3ZpZGlvY19xYnVmLAotCS52aWRpb2NfZHFidWYgPSB2aWRpb2NfZHFidWYsCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2Nfc19zdGQgPSBjeDI1ODIxX3ZpZGlvY19zX3N0ZCwKLQkudmlkaW9jX3F1ZXJ5c3RkID0gY3gyNTgyMV92aWRpb2NfcXVlcnlzdGQsCi0jZW5kaWYKLQkudmlkaW9jX2Nyb3BjYXAgPSBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwLAotCS52aWRpb2Nfc19jcm9wID0gY3gyNTgyMV92aWRpb2Nfc19jcm9wLAotCS52aWRpb2NfZ19jcm9wID0gY3gyNTgyMV92aWRpb2NfZ19jcm9wLAotCS52aWRpb2NfZW51bV9pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19nX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZ19pbnB1dCwKLQkudmlkaW9jX3NfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19zX2lucHV0LAotCS52aWRpb2NfZ19jdHJsID0gY3gyNTgyMV92aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsID0gdmlkaW9jX3NfY3RybCwKLQkudmlkaW9jX3F1ZXJ5Y3RybCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX3N0cmVhbW9uID0gdmlkaW9jX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmID0gdmlkaW9jX3N0cmVhbW9mZiwKLQkudmlkaW9jX2xvZ19zdGF0dXMgPSB2aWRpb2NfbG9nX3N0YXR1cywKLQkudmlkaW9jX2dfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19nX3ByaW9yaXR5LAotCS52aWRpb2Nfc19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX3NfcHJpb3JpdHksCi0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JLnZpZGlvY2dtYnVmID0gY3gyNTgyMV92aWRpb2NnbWJ1ZiwKLSNlbmRpZgotI2lmZGVmIFRVTkVSX0ZMQUcKLQkudmlkaW9jX2dfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyLAotCS52aWRpb2Nfc190dW5lciA9IGN4MjU4MjFfdmlkaW9jX3NfdHVuZXIsCi0JLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX2dfZnJlcXVlbmN5LAotCS52aWRpb2Nfc19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19zX2ZyZXF1ZW5jeSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQkudmlkaW9jX2dfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19nX3JlZ2lzdGVyLAotCS52aWRpb2Nfc19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX3NfcmVnaXN0ZXIsCi0jZW5kaWYKLX07Ci0KLXN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb190ZW1wbGF0ZTcgPSB7Ci0JLm5hbWUgPSAiY3gyNTgyMS12aWRlbyIsCi0JLmZvcHMgPSAmdmlkZW9fZm9wcywKLQkuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKLQkudHZub3JtcyA9IENYMjU4MjFfTk9STVMsCi0JLmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0NfTSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW9pb2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTY4MDdkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW9pb2N0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qCi0gKiAgRHJpdmVyIGZvciB0aGUgQ29uZXhhbnQgQ1gyNTgyMSBQQ0llIGJyaWRnZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDkgQ29uZXhhbnQgU3lzdGVtcyBJbmMuCi0gKiAgQXV0aG9ycyAgPHNodS5saW5AY29uZXhhbnQuY29tPiwgPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPgotICogIEJhc2VkIG9uIFN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4gY3gyMzg4NSBkcml2ZXIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKgotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY3gyNTgyMS12aWRlby5oIgotCi1zdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCi17Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYgPQotCSAgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPnZpZHFbVklERU9fSU9DVExfQ0hdOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1ZJREVPX0lPQ1RMX0NIXSk7Ci0JCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMiwKLQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZSwgYnVmIGNudCA9ICVkLCBxLT5jb3VudCA9ICVkXG4iLAotCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQsIHEtPmNvdW50KTsKLQl9IGVsc2UgewotCQlwcmV2ID0KLQkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQlpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAotCQkgICAgJiYgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0Ci0JCSAgICAmJiBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKLQotCQkJLyogNjQgYml0IGJpdHMgNjMtMzIgKi8KLQkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7Ci0JCQlkcHJpbnRrKDIsCi0JCQkJIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIGFjdGl2ZSwgYnVmLT5jb3VudD0lZFxuIiwKLQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCi0JCQkJYnVmLT52Yi5pKTsKLQkJfQotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWRwcmludGsoMiwgImFjdGl2ZSBxdWV1ZSBlbXB0eSFcbiIpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0gewotCS5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKLQkuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAotCS5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCi0JLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoOwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCXUzMiBwaXhfZm9ybWF0OwotCi0JcHJpbnRrKCJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAotCQl2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwotCi0JLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KLQlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGZoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ID0gZGV2OwotCWZoLT50eXBlID0gdHlwZTsKLQlmaC0+d2lkdGggPSA3MjA7Ci0KLQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspCi0JCWZoLT5oZWlnaHQgPSA1NzY7Ci0JZWxzZQotCQlmaC0+aGVpZ2h0ID0gNDgwOwotCi0JZGV2LT5jaGFubmVsX29wZW5lZCA9IFZJREVPX0lPQ1RMX0NIOwotCXBpeF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhwaXhfZm9ybWF0KTsKLQotCXY0bDJfcHJpb19vcGVuKCZkZXYtPnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCi0JCQkgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYnVmZmVyKSwgZmgpOwotCi0JZHByaW50aygxLCAicG9zdCB2aWRlb2J1Zl9xdWV1ZV9pbml0KClcbiIpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgtPmRldiwgUkVTT1VSQ0VfVklERU9fSU9DVEwpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQotCQlyZXR1cm4gdmlkZW9idWZfcmVhZF9vbmUoJmZoLT52aWRxLCBkYXRhLCBjb3VudCwgcHBvcywKLQkJCQkJIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwotCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFT19JT0NUTCkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKLQkJCQkgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikKLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPX0lPQ1RMKSkgewotCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkJY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFT19JT0NUTCk7Ci0JfQotCi0JaWYgKGZoLT52aWRxLnJlYWRfYnVmKSB7Ci0JCWN4MjU4MjFfYnVmZmVyX3JlbGVhc2UoJmZoLT52aWRxLCBmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JCWtmcmVlKGZoLT52aWRxLnJlYWRfYnVmKTsKLQl9Ci0KLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKLQotCXY0bDJfcHJpb19jbG9zZSgmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCWtmcmVlKGZoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAodW5saWtlbHkoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoaSAhPSBmaC0+dHlwZSkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFjeDI1ODIxX3Jlc19nZXQoZGV2LCBmaCwgY3gyNTgyMV9nZXRfcmVzb3VyY2UoZmgsIFJFU09VUkNFX1ZJREVPX0lPQ1RMKSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFT19JT0NUTCk7Ci0JZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKGdldF9xdWV1ZShmaCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgcmVzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkcHJpbnRrKDIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JZXJyID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIHByaXYsIGYpOwotCi0JaWYgKDAgIT0gZXJyKQotCQlyZXR1cm4gZXJyOwotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWZoLT53aWR0aCA9IGYtPmZtdC5waXgud2lkdGg7Ci0JZmgtPmhlaWdodCA9IGYtPmZtdC5waXguaGVpZ2h0OwotCWZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKLQlkcHJpbnRrKDIsICIlcygpIHdpZHRoPSVkIGhlaWdodD0lZCBmaWVsZD0lZFxuIiwgX19mdW5jX18sIGZoLT53aWR0aCwKLQkJZmgtPmhlaWdodCwgZmgtPnZpZHEuZmllbGQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19mbXQsIGYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0JcmV0dXJuIHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLX0KLQotc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfc2V0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGRvd25zdHJlYW1fdXNlcl9zdHJ1Y3QgKmRhdGFfZnJvbV91c2VyOwotCWludCBjb21tYW5kOwotCWludCB3aWR0aCA9IDcyMDsKLQlpbnQgc2VsZWN0ZWRfY2hhbm5lbCA9IDAsIHBpeF9mb3JtYXQgPSAwLCBpID0gMDsKLQlpbnQgY2lmX2VuYWJsZSA9IDAsIGNpZl93aWR0aCA9IDA7Ci0JdTMyIHZhbHVlID0gMDsKLQotCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICopYXJnOwotCi0JaWYgKCFkYXRhX2Zyb21fdXNlcikgewotCQlwcmludGsoImN4MjU4MjEgaW4gJXMoKTogVXNlciBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZy5cbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCWlmIChjb21tYW5kICE9IFNFVF9WSURFT19TVEQgJiYgY29tbWFuZCAhPSBTRVRfUElYRUxfRk9STUFUCi0JICAgICYmIGNvbW1hbmQgIT0gRU5BQkxFX0NJRl9SRVNPTFVUSU9OICYmIGNvbW1hbmQgIT0gUkVHX1JFQUQKLQkgICAgJiYgY29tbWFuZCAhPSBSRUdfV1JJVEUgJiYgY29tbWFuZCAhPSBNRURVU0FfUkVBRAotCSAgICAmJiBjb21tYW5kICE9IE1FRFVTQV9XUklURSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFNFVF9WSURFT19TVEQ6Ci0JCWRldi0+dHZub3JtID0KLQkJICAgICFzdHJjbXAoZGF0YV9mcm9tX3VzZXItPnZpZF9zdGRuYW1lLAotCQkJICAgICJQQUwiKSA/IFY0TDJfU1REX1BBTF9CRyA6IFY0TDJfU1REX05UU0NfTTsKLQkJbWVkdXNhX3NldF92aWRlb3N0YW5kYXJkKGRldik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRVRfUElYRUxfRk9STUFUOgotCQlzZWxlY3RlZF9jaGFubmVsID0gZGF0YV9mcm9tX3VzZXItPmRlY29kZXJfc2VsZWN0OwotCQlwaXhfZm9ybWF0ID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKLQotCQlpZiAoIShzZWxlY3RlZF9jaGFubmVsIDw9IDcgJiYgc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKSkgewotCQkJc2VsZWN0ZWRfY2hhbm5lbCAtPSA0OwotCQkJc2VsZWN0ZWRfY2hhbm5lbCA9IHNlbGVjdGVkX2NoYW5uZWwgJSA4OwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkKLQkJCWN4MjU4MjFfc2V0X3BpeGVsX2Zvcm1hdChkZXYsIHNlbGVjdGVkX2NoYW5uZWwsCi0JCQkJCQkgcGl4X2Zvcm1hdCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEVOQUJMRV9DSUZfUkVTT0xVVElPTjoKLQkJc2VsZWN0ZWRfY2hhbm5lbCA9IGRhdGFfZnJvbV91c2VyLT5kZWNvZGVyX3NlbGVjdDsKLQkJY2lmX2VuYWJsZSA9IGRhdGFfZnJvbV91c2VyLT5jaWZfcmVzb2x1dGlvbl9lbmFibGU7Ci0JCWNpZl93aWR0aCA9IGRhdGFfZnJvbV91c2VyLT5jaWZfd2lkdGg7Ci0KLQkJaWYgKGNpZl9lbmFibGUpIHsKLQkJCWlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9CRwotCQkJICAgIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQkJCXdpZHRoID0gMzUyOwotCQkJZWxzZQotCQkJCXdpZHRoID0gKGNpZl93aWR0aCA9PSAzMjAKLQkJCQkJIHx8IGNpZl93aWR0aCA9PSAzNTIpID8gY2lmX3dpZHRoIDogMzIwOwotCQl9Ci0KLQkJaWYgKCEoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkpIHsKLQkJCXNlbGVjdGVkX2NoYW5uZWwgLT0gNDsKLQkJCXNlbGVjdGVkX2NoYW5uZWwgPSBzZWxlY3RlZF9jaGFubmVsICUgODsKLQkJfQotCi0JCWlmIChzZWxlY3RlZF9jaGFubmVsIDw9IDcgJiYgc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKSB7Ci0JCQlkZXYtPnVzZV9jaWZfcmVzb2x1dGlvbltzZWxlY3RlZF9jaGFubmVsXSA9IGNpZl9lbmFibGU7Ci0JCQlkZXYtPmNpZl93aWR0aFtzZWxlY3RlZF9jaGFubmVsXSA9IHdpZHRoOwotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IFZJRF9DSEFOTkVMX05VTTsgaSsrKSB7Ci0JCQkJZGV2LT51c2VfY2lmX3Jlc29sdXRpb25baV0gPSBjaWZfZW5hYmxlOwotCQkJCWRldi0+Y2lmX3dpZHRoW2ldID0gd2lkdGg7Ci0JCQl9Ci0JCX0KLQotCQltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCB3aWR0aCwgc2VsZWN0ZWRfY2hhbm5lbCk7Ci0JCWJyZWFrOwotCWNhc2UgUkVHX1JFQUQ6Ci0JCWRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSA9IGN4X3JlYWQoZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRUdfV1JJVEU6Ci0JCWN4X3dyaXRlKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcywgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKLQkJYnJlYWs7Ci0JY2FzZSBNRURVU0FfUkVBRDoKLQkJdmFsdWUgPQotCQkgICAgY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCSAgICAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAotCQkJCSAgICAgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgTUVEVVNBX1dSSVRFOgotCQljeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCSAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAotCQkJCSAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQljaGFyIG5hbWVbMzIgKyAyXTsKLQotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLzIiLCBkZXYtPm5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PSAgU1RBUlQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBsb2dfc3RhdHVzKTsKLQlwcmludGsoS0VSTl9JTkZPICIlcy8yOiA9PT09PT09PT09PT09ICBFTkQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09PVxuIiwKLQkgICAgICAgZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vLyBleHBvcnRlZCBzdHVmZgotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gdmlkZW9fb3BlbiwKLQkucmVsZWFzZSA9IHZpZGVvX3JlbGVhc2UsCi0JLnJlYWQgPSB2aWRlb19yZWFkLAotCS5wb2xsID0gdmlkZW9fcG9sbCwKLQkubW1hcCA9IGN4MjU4MjFfdmlkZW9fbW1hcCwKLQkuaW9jdGwgPSB2aWRlb19pb2N0bF9zZXQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkudmlkaW9jZ21idWYgPSBjeDI1ODIxX3ZpZGlvY2dtYnVmLAotI2VuZGlmCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2NfZ190dW5lciA9IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIsCi0JLnZpZGlvY19zX3R1bmVyID0gY3gyNTgyMV92aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2NfZ19mcmVxdWVuY3ksCi0JLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCi0JLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKLSNlbmRpZgotfTsKLQotc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvaW9jdGxfdGVtcGxhdGUgPSB7Ci0JLm5hbWUgPSAiY3gyNTgyMS12aWRlb2lvY3RsIiwKLQkuZm9wcyA9ICZ2aWRlb19mb3BzLAotCS5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAotCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKLQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkdXBzMTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkdXBzMTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0NmExNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZHVwczEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjeDI1ODIxLXZpZGVvLmgiCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpwcmV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcVtTUkFNX0NIMTBdOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gxMF0pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSA5OwotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9ZVVlWKTsKLQotCXY0bDJfcHJpb19vcGVuKCZkZXYtPnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCi0JCQkgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYnVmZmVyKSwgZmgpOwotCi0JZHByaW50aygxLCAicG9zdCB2aWRlb2J1Zl9xdWV1ZV9pbml0KClcbiIpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgtPmRldiwgUkVTT1VSQ0VfVklERU8xMCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQkgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMTApKSB7Ci0JCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCi0JCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCi0JCQkJIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIuc3RyZWFtKTsKLQl9IGVsc2UgewotCQkvKiByZWFkKCkgY2FwdHVyZSAqLwotCQlidWYgPSAoc3RydWN0IGN4MjU4MjFfYnVmZmVyICopZmgtPnZpZHEucmVhZF9idWY7Ci0JCWlmIChOVUxMID09IGJ1ZikKLQkJCXJldHVybiBQT0xMRVJSOwotCX0KLQotCXBvbGxfd2FpdChmaWxlLCAmYnVmLT52Yi5kb25lLCB3YWl0KTsKLQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRVJST1IpCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCS8vc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8KLQkvL2N4X3dyaXRlKGNoYW5uZWwxMC0+ZG1hX2N0bCwgMCk7Ci0KLQkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMTApKSB7Ci0JCXZpZGVvYnVmX3F1ZXVlX2NhbmNlbCgmZmgtPnZpZHEpOwotCQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZJREVPMTApOwotCX0KLQotCWlmIChmaC0+dmlkcS5yZWFkX2J1ZikgewotCQljeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKCZmaC0+dmlkcSwgZmgtPnZpZHEucmVhZF9idWYpOwotCQlrZnJlZShmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JfQotCi0JdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmlkcSk7Ci0KLQl2NGwyX3ByaW9fY2xvc2UoJmRldi0+cHJpbywgZmgtPnByaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlrZnJlZShmaCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzEwKSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzEwKTsKLQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCByZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyB2aWRlb19pb2N0bF91cHN0cmVhbTEwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGNvbW1hbmQgPSAwOwotCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7Ci0KLQlpZiAoIWRhdGFfZnJvbV91c2VyKSB7Ci0JCXByaW50awotCQkgICAgKCJjeDI1ODIxIGluICVzKCk6IFVwc3RyZWFtIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nLlxuIiwKLQkJICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCWlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX1ZJREVPICYmIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9WSURFTykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkZXYtPmlucHV0X2ZpbGVuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLQlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0JZGV2LT52aWRfc3RkbmFtZV9jaDIgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7Ci0JZGV2LT5waXhlbF9mb3JtYXRfY2gyID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKLQlkZXYtPmNoYW5uZWxfc2VsZWN0X2NoMiA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKLQlkZXYtPmNvbW1hbmRfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFVQU1RSRUFNX1NUQVJUX1ZJREVPOgotCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYsIGRhdGFfZnJvbV91c2VyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFVQU1RSRUFNX1NUT1BfVklERU86Ci0JCWN4MjU4MjFfc3RvcF91cHN0cmVhbV92aWRlb19jaDIoZGV2KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JZHByaW50aygyLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCWVyciA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBwcml2LCBmKTsKLQotCWlmICgwICE9IGVycikKLQkJcmV0dXJuIGVycjsKLQlmaC0+Zm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwotCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0JZHByaW50aygyLCAiJXMoKSB3aWR0aD0lZCBoZWlnaHQ9JWQgZmllbGQ9JWRcbiIsIF9fZnVuY19fLCBmaC0+d2lkdGgsCi0JCWZoLT5oZWlnaHQsIGZoLT52aWRxLmZpZWxkKTsKLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgdmlkZW8sIHNfZm10LCBmKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQljaGFyIG5hbWVbMzIgKyAyXTsKLQotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLzIiLCBkZXYtPm5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PSAgU1RBUlQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBsb2dfc3RhdHVzKTsKLQlwcmludGsoS0VSTl9JTkZPICIlcy8yOiA9PT09PT09PT09PT09ICBFTkQgTE9HIFNUQVRVUyAgPT09PT09PT09PT09PVxuIiwKLQkgICAgICAgZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vL2V4cG9ydGVkIHN0dWZmCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtMTAsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkudmlkaW9jZ21idWYgPSBjeDI1ODIxX3ZpZGlvY2dtYnVmLAotI2VuZGlmCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2NfZ190dW5lciA9IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIsCi0JLnZpZGlvY19zX3R1bmVyID0gY3gyNTgyMV92aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2NfZ19mcmVxdWVuY3ksCi0JLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCi0JLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKLSNlbmRpZgotfTsKLQotc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlMTAgPSB7Ci0JLm5hbWUgPSAiY3gyNTgyMS11cHN0cmVhbTEwIiwKLQkuZm9wcyA9ICZ2aWRlb19mb3BzLAotCS5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAotCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKLQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkdXBzOS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWR1cHM5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmUwZjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWR1cHM5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjeDI1ODIxLXZpZGVvLmgiCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpwcmV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+dmlkcVtTUkFNX0NIMDldOwotCi0JLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0JYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCWJ1Zi0+dmIuaSk7Ci0KLQl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAotCQkJCQkmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwOV0pOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQlkcHJpbnRrKDIsCi0JCQkiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0JfSBlbHNlIHsKLQkJcHJldiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKLQkJICAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAotCQkgICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLAotCQkJCSJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCi0JCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQotCXByaW50aygib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKLQotCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsb2NrX2tlcm5lbCgpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7Ci0JZmgtPmRldiA9IGRldjsKLQlmaC0+dHlwZSA9IHR5cGU7Ci0JZmgtPndpZHRoID0gNzIwOwotCi0JaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQotCQlmaC0+aGVpZ2h0ID0gNTc2OwotCWVsc2UKLQkJZmgtPmhlaWdodCA9IDQ4MDsKLQotCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSA4OwotCWZoLT5mbXQgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9ZVVlWKTsKLQotCXY0bDJfcHJpb19vcGVuKCZkZXYtPnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCi0JCQkgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYnVmZmVyKSwgZmgpOwotCi0JZHByaW50aygxLCAicG9zdCB2aWRlb2J1Zl9xdWV1ZV9pbml0KClcbiIpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgtPmRldiwgUkVTT1VSQ0VfVklERU85KSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsCi0JCQkJCSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKLQotCWlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU85KSkgewotCQkvKiBzdHJlYW1pbmcgY2FwdHVyZSAqLwotCQlpZiAobGlzdF9lbXB0eSgmZmgtPnZpZHEuc3RyZWFtKSkKLQkJCXJldHVybiBQT0xMRVJSOwotCQlidWYgPSBsaXN0X2VudHJ5KGZoLT52aWRxLnN0cmVhbS5uZXh0LAotCQkJCSBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnN0cmVhbSk7Ci0JfSBlbHNlIHsKLQkJLyogcmVhZCgpIGNhcHR1cmUgKi8KLQkJYnVmID0gKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqKWZoLT52aWRxLnJlYWRfYnVmOwotCQlpZiAoTlVMTCA9PSBidWYpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQl9Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7Ci0JaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fCBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkvL3N0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvCi0JLy9jeF93cml0ZShjaGFubmVsOS0+ZG1hX2N0bCwgMCk7Ci0KLQkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KLQlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPOSkpIHsKLQkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZmaC0+dmlkcSk7Ci0JCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgUkVTT1VSQ0VfVklERU85KTsKLQl9Ci0KLQlpZiAoZmgtPnZpZHEucmVhZF9idWYpIHsKLQkJY3gyNTgyMV9idWZmZXJfcmVsZWFzZSgmZmgtPnZpZHEsIGZoLT52aWRxLnJlYWRfYnVmKTsKLQkJa2ZyZWUoZmgtPnZpZHEucmVhZF9idWYpOwotCX0KLQotCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOwotCi0JdjRsMl9wcmlvX2Nsb3NlKCZkZXYtPnByaW8sIGZoLT5wcmlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU85KSkpKSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCWludCBlcnIsIHJlczsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzkpOwotCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGNvbW1hbmQgPSAwOwotCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7Ci0KLQlpZiAoIWRhdGFfZnJvbV91c2VyKSB7Ci0JCXByaW50awotCQkgICAgKCJjeDI1ODIxIGluICVzKCk6IFVwc3RyZWFtIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nLlxuIiwKLQkJICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCWlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX1ZJREVPICYmIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9WSURFTykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkZXYtPmlucHV0X2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotCWRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLQlkZXYtPnZpZF9zdGRuYW1lID0gZGF0YV9mcm9tX3VzZXItPnZpZF9zdGRuYW1lOwotCWRldi0+cGl4ZWxfZm9ybWF0ID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKLQlkZXYtPmNoYW5uZWxfc2VsZWN0ID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OwotCWRldi0+Y29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOwotCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBVUFNUUkVBTV9TVEFSVF9WSURFTzoKLQkJY3gyNTgyMV9zdGFydF91cHN0cmVhbV92aWRlb19jaDEoZGV2LCBkYXRhX2Zyb21fdXNlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBVUFNUUkVBTV9TVE9QX1ZJREVPOgotCQljeDI1ODIxX3N0b3BfdXBzdHJlYW1fdmlkZW9fY2gxKGRldik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7Ci0KLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7Ci0JZmgtPmZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JZmgtPndpZHRoID0gZi0+Zm10LnBpeC53aWR0aDsKLQlmaC0+aGVpZ2h0ID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JZmgtPnZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCWRwcmludGsoMiwgIiVzKCkgd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAotCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIHZpZGVvLCBzX2ZtdCwgZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlyZXR1cm4gdmlkZW9idWZfZHFidWYoZ2V0X3F1ZXVlKGZoKSwgcCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQotc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWNoYXIgbmFtZVszMiArIDJdOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JICAgICAgIGRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXByaW50ayhLRVJOX0lORk8gIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCSAgICAgICBkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlpbnQgZXJyOwotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vLyBleHBvcnRlZCBzdHVmZgotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gdmlkZW9fb3BlbiwKLQkucmVsZWFzZSA9IHZpZGVvX3JlbGVhc2UsCi0JLnJlYWQgPSB2aWRlb19yZWFkLAotCS5wb2xsID0gdmlkZW9fcG9sbCwKLQkubW1hcCA9IGN4MjU4MjFfdmlkZW9fbW1hcCwKLQkuaW9jdGwgPSB2aWRlb19pb2N0bF91cHN0cmVhbTksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQkudmlkaW9jZ21idWYgPSBjeDI1ODIxX3ZpZGlvY2dtYnVmLAotI2VuZGlmCi0jaWZkZWYgVFVORVJfRkxBRwotCS52aWRpb2NfZ190dW5lciA9IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIsCi0JLnZpZGlvY19zX3R1bmVyID0gY3gyNTgyMV92aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2NfZ19mcmVxdWVuY3ksCi0JLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCi0JLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKLSNlbmRpZgotfTsKLQotc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX3RlbXBsYXRlOSA9IHsKLQkubmFtZSA9ICJjeDI1ODIxLXVwc3RyZWFtOSIsCi0JLmZvcHMgPSAmdmlkZW9fZm9wcywKLQkuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKLQkudHZub3JtcyA9IENYMjU4MjFfTk9STVMsCi0JLmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0NfTSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLmggYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLmgKaW5kZXggY2YyMjg2ZC4uMWI2MjhmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEuaApAQCAtNjEsNyArNjEsNyBAQAogI2RlZmluZSBGQUxTRSAgIDAKICNkZWZpbmUgTElORV9TSVpFX0QxICAgIDE0NDAKIAotLy8gTnVtYmVyIG9mIGRlY29kZXJzIGFuZCBlbmNvZGVycworLyogTnVtYmVyIG9mIGRlY29kZXJzIGFuZCBlbmNvZGVycyAqLwogI2RlZmluZSBNQVhfREVDT0RFUlMgICAgICAgICAgICA4CiAjZGVmaW5lIE1BWF9FTkNPREVSUyAgICAgICAgICAgIDIKICNkZWZpbmUgUVVBRF9ERUNPREVSUyAgICAgICAgICAgNApAQCAtMTM5LDYgKzEzOSw3IEBACiAJLyogdmlkZW8gY2FwdHVyZSAqLwogCXN0cnVjdCBjeDI1ODIxX2ZtdCAqZm10OwogCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBjaGFubmVsX2lkOwogCiAJLyogdmJpIGNhcHR1cmUgKi8KIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgdmlkcTsKQEAgLTIzNiwxMyArMjM3LDM0IEBACiAJc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbDsKIH07CiAKK3N0cnVjdCBjeDI1ODIxX2NoYW5uZWwgeworICAgICAgIHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgcHJpbzsKKworICAgICAgIGludCBjdGxfYnJpZ2h0OworICAgICAgIGludCBjdGxfY29udHJhc3Q7CisgICAgICAgaW50IGN0bF9odWU7CisgICAgICAgaW50IGN0bF9zYXR1cmF0aW9uOworCisgICAgICAgc3RydWN0IGN4MjU4MjFfZGF0YSB0aW1lb3V0X2RhdGE7CisKKyAgICAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXY7CisgICAgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgdmlkcTsKKworICAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2hhbm5lbHM7CisKKyAgICAgICBzdHJ1Y3QgbXV0ZXggbG9jazsKKyAgICAgICBpbnQgcmVzb3VyY2VzOworCisgICAgICAgaW50IHBpeGVsX2Zvcm1hdHM7CisgICAgICAgaW50IHVzZV9jaWZfcmVzb2x1dGlvbjsKKyAgICAgICBpbnQgY2lmX3dpZHRoOworfTsKKwogc3RydWN0IGN4MjU4MjFfZGV2IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRldmxpc3Q7CiAJYXRvbWljX3QgcmVmY291bnQ7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCi0Jc3RydWN0IHY0bDJfcHJpb19zdGF0ZSBwcmlvOwotCiAJLyogcGNpIHN0dWZmICovCiAJc3RydWN0IHBjaV9kZXYgKnBjaTsKIAl1bnNpZ25lZCBjaGFyIHBjaV9yZXYsIHBjaV9sYXQ7CkBAIC0yNjEsMTMgKzI4MywxMiBAQAogCWludCBucjsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAorICAgIHN0cnVjdCBjeDI1ODIxX2NoYW5uZWwgY2hhbm5lbHNbTUFYX1ZJRF9DSEFOTkVMX05VTV07CisKIAkvKiBib2FyZCBkZXRhaWxzICovCiAJdW5zaWduZWQgaW50IGJvYXJkOwogCWNoYXIgbmFtZVszMl07CiAKLQkvKiBzcmFtIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoYW5uZWxzOwotCiAJLyogQW5hbG9nIHZpZGVvICovCiAJdTMyIHJlc291cmNlczsKIAl1bnNpZ25lZCBpbnQgaW5wdXQ7CkBAIC0yODIsMTMgKzMwMyw2IEBACiAJdW5zaWduZWQgY2hhciB2aWRlY19hZGRyOwogCXVuc2lnbmVkIHNob3J0IF9tYXhfbnVtX2RlY29kZXJzOwogCi0JaW50IGN0bF9icmlnaHQ7Ci0JaW50IGN0bF9jb250cmFzdDsKLQlpbnQgY3RsX2h1ZTsKLQlpbnQgY3RsX3NhdHVyYXRpb247Ci0KLQlzdHJ1Y3QgY3gyNTgyMV9kYXRhIHRpbWVvdXRfZGF0YVtNQVhfVklEX0NIQU5ORUxfTlVNXTsKLQogCS8qIEFuYWxvZyBBdWRpbyBVcHN0cmVhbSAqLwogCWludCBfYXVkaW9faXNfcnVubmluZzsKIAlpbnQgX2F1ZGlvcGl4ZWxfZm9ybWF0OwpAQCAtMjk3LDcgKzMxMSw3IEBACiAJaW50IF9hdWRpb19saW5lc19jb3VudDsKIAlpbnQgX2F1ZGlvZnJhbWVfY291bnQ7CiAJaW50IF9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdDsKLQlpbnQgX2xhc3RfaW5kZXhfaXJxOwkvL1RoZSBsYXN0IGludGVycnVwdCBpbmRleCBwcm9jZXNzZWQuCisgICAgICAgaW50IF9sYXN0X2luZGV4X2lycTsgICAgLyogVGhlIGxhc3QgaW50ZXJydXB0IGluZGV4IHByb2Nlc3NlZC4gKi8KIAogCV9fbGUzMiAqX3Jpc2NfYXVkaW9fam1wX2FkZHI7CiAJX19sZTMyICpfcmlzY192aXJ0X3N0YXJ0X2FkZHI7CkBAIC0zMTMsMTIgKzMyNywxMCBAQAogCiAJLyogVjRsICovCiAJdTMyIGZyZXE7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2W01BWF9WSURfQ0hBTk5FTF9OVU1dOwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZiaV9kZXY7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqcmFkaW9fZGV2OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmlvY3RsX2RldjsKIAotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlIHZpZHFbTUFYX1ZJRF9DSEFOTkVMX05VTV07CiAJc3BpbmxvY2tfdCBzbG9jazsKIAogCS8qIFZpZGVvIFVwc3RyZWFtICovCkBAIC00MDEsOSArNDEzLDYgQEAKIAlpbnQgcGl4ZWxfZm9ybWF0OwogCWludCBjaGFubmVsX3NlbGVjdDsKIAlpbnQgY29tbWFuZDsKLQlpbnQgcGl4ZWxfZm9ybWF0c1tWSURfQ0hBTk5FTF9OVU1dOwotCWludCB1c2VfY2lmX3Jlc29sdXRpb25bVklEX0NIQU5ORUxfTlVNXTsKLQlpbnQgY2lmX3dpZHRoW1ZJRF9DSEFOTkVMX05VTV07CiAJaW50IGNoYW5uZWxfb3BlbmVkOwogfTsKIApAQCAtNDgyLDcgKzQ5MSw3IEBACiAJdTMyIGZsZF9hdWRfZmlmb19lbjsKIAl1MzIgZmxkX2F1ZF9yaXNjX2VuOwogCi0JLy9Gb3IgVXBzdHJlYW0gVmlkZW8KKyAgICAgICAvKiBGb3IgVXBzdHJlYW0gVmlkZW8gKi8KIAl1MzIgdmlkX2ZtdF9jdGw7CiAJdTMyIHZpZF9hY3RpdmVfY3RsMTsKIAl1MzIgdmlkX2FjdGl2ZV9jdGwyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMKaW5kZXggODZiNDk4MC4uMjNlYTEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCkBAIC0xMjIsMTkgKzEyMiw3IEBACiAgICAgICAgICAgICBwcl93YXJuaW5nKCIlczogZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIF9fZnVuY19fLCBkcnZyX3N0YXRlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICAvKiBJbml0aWFsaXplIHRoZSB0cSBlbnRyeSBvbmx5IHRoZSBmaXJzdCB0aW1lICovCi0gICAgaWYgKHdkLT5pbml0X3RxKQotICAgIHsKLSAgICAgICAgd2QtPmluaXRfdHEgPSAwOwotICAgICAgICB3ZC0+dHEucm91dGluZSA9IHdkLT5mdW5jOwotICAgICAgICB3ZC0+dHEuc3luYyA9IDA7Ci0gICAgICAgIHdkLT50cS5kYXRhID0gd2QtPnNvZnRjOwotICAgIH0KLSAgICBzY2hlZHVsZV90YXNrICgmd2QtPnRxKTsKLSNlbHNlCiAgICAgc2NoZWR1bGVfd29yayAoJndkLT53b3JrKTsKLSNlbmRpZgogICAgIG1vZF90aW1lciAoJndkLT5oLCBqaWZmaWVzICsgd2QtPnRpY2tzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2h3cHJvYmUuYwppbmRleCA0Yzg2MTAyLi44OTIwMGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2h3cHJvYmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2h3cHJvYmUuYwpAQCAtMzA1LDE1ICszMDUsOSBAQAogICAgIGVycm9yX2ZsYWcgPSAwOwogICAgIHByZXBfaGR3X2luZm8gKCk7CiAgICAgLyoqKiBzY2FuIFBDSSBidXMgZm9yIGFsbCBwb3NzaWJsZSBib2FyZHMgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCiAgICAgd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfQ09ORVhBTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfQ044NDc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGV2KSkpCi0jZWxzZQotICAgIHdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZSAoUENJX1ZFTkRPUl9JRF9DT05FWEFOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfQ044NDc0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKQotI2VuZGlmCiAgICAgewogICAgICAgICBpZiAoYzRfaGR3X2luaXQgKHBkZXYsIGZvdW5kKSkKICAgICAgICAgICAgIGZvdW5kKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKaW5kZXggMTM0ZTc1Ni4uZWIwZjRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYwpAQCAtMTQyLDEwICsxNDIsNiBAQAogfQogCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNkZWZpbmUgREVWX1RPX1BSSVYoZGV2KSAoICogKHN0cnVjdCBjNF9wcml2ICoqKSAoKGhkbGNfZGV2aWNlKikoZGV2KSsxKSkKLSNlbHNlCi0KIGNoYXIgICAgICAgKgogZ2V0X2hkbGNfbmFtZSAoaGRsY19kZXZpY2UgKiBoZGxjKQogewpAQCAtMTU0LDcgKzE1MCw2IEBACiAKICAgICByZXR1cm4gZGV2LT5uYW1lOwogfQotI2VuZGlmCiAKIAogc3RhdGljICAgICAgc3RhdHVzX3QKQEAgLTE2Nyw3ICsxNjIsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0MSkKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogLyoqKgpAQCAtMjU5LDcgKzI1Myw2IEBACiAgICAgICAgIHBpLT53cV9wb3J0ID0gMDsKICAgICB9CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjkxLDQ4ICsyODQsNiBAQAogfQogCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpZiAhZGVmaW5lZChHRU5FUklDX0hETENfVkVSU0lPTikgfHwgKEdFTkVSSUNfSERMQ19WRVJTSU9OIDwgNCkKLQotLyoqIExpbnV4IDIuNC4xOC0xOSAqKi8KLVNUQVRJQyBpbnQKLWNoYW5fb3BlbiAoaGRsY19kZXZpY2UgKiBoZGxjKQotewotICAgIHN0YXR1c190ICAgIHJldDsKLQotICAgIGlmICgocmV0ID0gYzRfY2hhbl91cCAoREVWX1RPX1BSSVYgKGhkbGMpLT5jaSwgREVWX1RPX1BSSVYgKGhkbGMpLT5jaGFubnVtKSkpCi0gICAgICAgIHJldHVybiAtcmV0OwotICAgIE1PRF9JTkNfVVNFX0NPVU5UOwotICAgIG5ldGlmX3N0YXJ0X3F1ZXVlIChoZGxjX3RvX2RldiAoaGRsYykpOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgPSBzdWNjZXNzICovCi19Ci0KLSNlbHNlCi0KLS8qKiBMaW51eCAyLjQuMjAgYW5kIGhpZ2hlciAqKi8KLVNUQVRJQyBpbnQKLWNoYW5fb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZGV2KQotewotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOwotICAgIHN0YXR1c190ICAgIHJldDsKLQotICAgIGhkbGMtPnByb3RvID0gSUZfUFJPVE9fSERMQzsKLSAgICBpZiAoKHJldCA9IGhkbGNfb3BlbiAoaGRsYykpKQotICAgIHsKLSAgICAgICAgcHJfaW5mbygiaGRsY19vcGVuIGZhaWx1cmUsIGVyciAlZC5cbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmICgocmV0ID0gYzRfY2hhbl91cCAoREVWX1RPX1BSSVYgKGhkbGMpLT5jaSwgREVWX1RPX1BSSVYgKGhkbGMpLT5jaGFubnVtKSkpCi0gICAgICAgIHJldHVybiAtcmV0OwotICAgIE1PRF9JTkNfVVNFX0NPVU5UOwotICAgIG5ldGlmX3N0YXJ0X3F1ZXVlIChoZGxjX3RvX2RldiAoaGRsYykpOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgPSBzdWNjZXNzICovCi19Ci0jZW5kaWYKLQotI2Vsc2UKLQotLyoqIExpbnV4IDIuNiAqKi8KIFNUQVRJQyBpbnQKIGNoYW5fb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZGV2KQogewpAQCAtMzUxLDM5ICszMDIsOCBAQAogICAgIG5ldGlmX3N0YXJ0X3F1ZXVlIChuZGV2KTsKICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yID0gc3VjY2VzcyAqLwogfQotI2VuZGlmCiAKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2lmICFkZWZpbmVkKEdFTkVSSUNfSERMQ19WRVJTSU9OKSB8fCAoR0VORVJJQ19IRExDX1ZFUlNJT04gPCA0KQotCi0vKiogTGludXggMi40LjE4LTE5ICoqLwotU1RBVElDIHZvaWQKLWNoYW5fY2xvc2UgKGhkbGNfZGV2aWNlICogaGRsYykKLXsKLSAgICBuZXRpZl9zdG9wX3F1ZXVlIChoZGxjX3RvX2RldiAoaGRsYykpOwotICAgIG11c3ljY19jaGFuX2Rvd24gKChjaV90ICopIDAsIERFVl9UT19QUklWIChoZGxjKS0+Y2hhbm51bSk7Ci0gICAgTU9EX0RFQ19VU0VfQ09VTlQ7Ci19Ci0jZWxzZQotCi0vKiogTGludXggMi40LjIwIGFuZCBoaWdoZXIgKiovCi1TVEFUSUMgaW50Ci1jaGFuX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqIG5kZXYpCi17Ci0gICAgaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyAobmRldik7Ci0KLSAgICBuZXRpZl9zdG9wX3F1ZXVlIChoZGxjX3RvX2RldiAoaGRsYykpOwotICAgIG11c3ljY19jaGFuX2Rvd24gKChjaV90ICopIDAsIERFVl9UT19QUklWIChoZGxjKS0+Y2hhbm51bSk7Ci0gICAgaGRsY19jbG9zZSAoaGRsYyk7Ci0gICAgTU9EX0RFQ19VU0VfQ09VTlQ7Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2Vsc2UKLQotLyoqIExpbnV4IDIuNiAqKi8KIFNUQVRJQyBpbnQKIGNoYW5fY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICogbmRldikKIHsKQEAgLTM5NiwzNyArMzE2LDggQEAKICAgICBtb2R1bGVfcHV0IChUSElTX01PRFVMRSk7CiAgICAgcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogCi0jaWYgIWRlZmluZWQoR0VORVJJQ19IRExDX1ZFUlNJT04pIHx8IChHRU5FUklDX0hETENfVkVSU0lPTiA8IDQpCi0KLS8qKiBMaW51eCAyLjQuMTgtMTkgKiovCi1TVEFUSUMgaW50Ci1jaGFuX2lvY3RsIChoZGxjX2RldmljZSAqIGhkbGMsIHN0cnVjdCBpZnJlcSAqIGlmciwgaW50IGNtZCkKLXsKLSAgICBpZiAoY21kID09IEhETENTQ0xPQ0spCi0gICAgewotICAgICAgICBpZnItPmlmcl9pZnJ1LmlmcnVfaXZhbHVlID0gTElORV9ERUZBVUxUOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoR0VORVJJQ19IRExDX1ZFUlNJT04pIHx8IChHRU5FUklDX0hETENfVkVSU0lPTiA8IDQpCi1TVEFUSUMgaW50Ci1jaGFuX2Rldl9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKiBoZGxjLCBzdHJ1Y3QgaWZyZXEgKiBpZnIsIGludCBjbWQpCi17Ci0gICAgaWYgKGNtZCA9PSBIRExDU0NMT0NLKQotICAgIHsKLSAgICAgICAgaWZyLT5pZnJfaWZydS5pZnJ1X2l2YWx1ZSA9IExJTkVfREVGQVVMVDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotfQotI2Vsc2UKIFNUQVRJQyBpbnQKIGNoYW5fZGV2X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGlmcmVxICogaWZyLCBpbnQgY21kKQogewpAQCAtNDM1LDE2ICszMjYsMTEgQEAKIAogCiBTVEFUSUMgaW50Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1jaGFuX2F0dGFjaF9ub29wIChoZGxjX2RldmljZSAqIGhkbGMsIHVuc2lnbmVkIHNob3J0IGZvb18xLCB1bnNpZ25lZCBzaG9ydCBmb29fMikKLSNlbHNlCiBjaGFuX2F0dGFjaF9ub29wIChzdHJ1Y3QgbmV0X2RldmljZSAqIG5kZXYsIHVuc2lnbmVkIHNob3J0IGZvb18xLCB1bnNpZ25lZCBzaG9ydCBmb29fMikKLSNlbmRpZgogewogICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBvdXIgZHJpdmVyIGhhcyBub3RoaW5nIHRvIGRvIGhlcmUsIHNob3cncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvdmVyLCBnbyBob21lICovCiB9Ci0jZW5kaWYKIAogCiBTVEFUSUMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgpAQCAtNDU1LDE2ICszNDEsMTIgQEAKICAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKnN0YXRzOwogICAgIGludCAgICAgICAgIGNoYW5udW07CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICBjaGFubnVtID0gREVWX1RPX1BSSVYgKG5kZXYpLT5jaGFubnVtOwotI2Vsc2UKICAgICB7CiAgICAgICAgIHN0cnVjdCBjNF9wcml2ICpwcml2OwogCiAgICAgICAgIHByaXYgPSAoc3RydWN0IGM0X3ByaXYgKikgZGV2X3RvX2hkbGMgKG5kZXYpLT5wcml2OwogICAgICAgICBjaGFubnVtID0gcHJpdi0+Y2hhbm51bTsKICAgICB9Ci0jZW5kaWYKIAogICAgIGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKTsKICAgICBpZiAoY2ggPT0gTlVMTCkKQEAgLTUxMSwzNCArMzkzLDE5IEBACiB9CiAKIAotI2lmICFkZWZpbmVkKEdFTkVSSUNfSERMQ19WRVJTSU9OKSB8fCAoR0VORVJJQ19IRExDX1ZFUlNJT04gPCA0KQotU1RBVElDIGludAotYzRfbGludXhfeG1pdCAoaGRsY19kZXZpY2UgKiBoZGxjLCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYikKLXsKLSAgICBpbnQgICAgICAgICBydmFsOwotCi0gICAgcnZhbCA9IG11c3ljY19zdGFydF94bWl0IChERVZfVE9fUFJJViAoaGRsYyktPmNpLCBERVZfVE9fUFJJViAoaGRsYyktPmNoYW5udW0sIHNrYik7Ci0gICAgcmV0dXJuIC1ydmFsOwotfQotI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXcgKi8KIFNUQVRJQyBpbnQKIGM0X2xpbnV4X3htaXQgKHN0cnVjdCBza19idWZmICogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqIG5kZXYpCiB7CiAgICAgY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CiAgICAgaW50ICAgICAgICAgcnZhbDsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgIHByaXYgPSBERVZfVE9fUFJJViAobmRldik7Ci0jZWxzZQogICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOwogCiAgICAgcHJpdiA9IGhkbGMtPnByaXY7Ci0jZW5kaWYKIAogICAgIHJ2YWwgPSBtdXN5Y2Nfc3RhcnRfeG1pdCAocHJpdi0+Y2ksIHByaXYtPmNoYW5udW0sIHNrYik7CiAgICAgcmV0dXJuIC1ydmFsOwogfQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHRU5FUklDX0hETENfVkVSU0lPTiAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGNoYW5fb3BzID0gewogICAgICAgIC5uZG9fb3BlbiAgICAgICA9IGNoYW5fb3BlbiwKQEAgLTgyMywxOCArNjkwLDEwIEBACiAgICAgcmV0ID0gbWtyZXQgKGM0X25ld19jaGFuIChjaSwgY3AucG9ydCwgY3AuY2hhbm51bSwgZGV2KSk7CiAgICAgaWYgKHJldCkKICAgICB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0gICAgICAgIHJ0bmxfdW5sb2NrICgpOyAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICAgICAgVjcgKHVucmVnaXN0ZXJfaGRsY19kZXZpY2UpIChkZXZfdG9faGRsYyAoZGV2KSk7Ci0gICAgICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICAgICAgT1Nfa2ZyZWUgKERFVl9UT19QUklWIChkZXYpKTsKLSAgICAgICAgT1Nfa2ZyZWUgKGRldik7Ci0jZWxzZQogICAgICAgICBydG5sX3VubG9jayAoKTsgICAgICAgICAgICAgLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCiAgICAgICAgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2UgKGRldik7CiAgICAgICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KICAgICAgICAgZnJlZV9uZXRkZXYgKGRldik7Ci0jZW5kaWYKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTg4MywxMSArNzQyLDcgQEAKICAgICAgICAgY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CiAgICAgICAgIGludCAgICAgICAgIGNoYW5udW07CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICAgICAgcHJpdiA9IERFVl9UT19QUklWIChuZGV2KTsKLSNlbHNlCiAgICAgICAgIHByaXYgPSAoc3RydWN0IGM0X3ByaXYgKikgZGV2X3RvX2hkbGMgKG5kZXYpLT5wcml2OwotI2VuZGlmCiAgICAgICAgIGNpID0gcHJpdi0+Y2k7CiAgICAgICAgIGNoYW5udW0gPSBwcml2LT5jaGFubnVtOwogCkBAIC04OTcsMjIgKzc1MiwxMiBAQAogICAgICAgICBjaC0+dXNlciA9IDA7ICAgICAgICAgICAgICAgLyogd2lsbCBiZSBmcmVlZCwgYmVsb3cgKi8KICAgICB9CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICBpZiAobG9ja2l0KQotICAgICAgICBydG5sX3VubG9jayAoKTsgICAgICAgICAgICAgLyogbmVlZGVkIGlmIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICBWNyAodW5yZWdpc3Rlcl9oZGxjX2RldmljZSkgKGRldl90b19oZGxjIChuZGV2KSk7Ci0gICAgaWYgKGxvY2tpdCkKLSAgICAgICAgcnRubF9sb2NrICgpOyAgICAgICAgICAgICAgIC8qIG5lZWRlZCBpZiBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgT1Nfa2ZyZWUgKERFVl9UT19QUklWIChuZGV2KSk7Ci0gICAgT1Nfa2ZyZWUgKG5kZXYpOwotI2Vsc2UKICAgICBpZiAobG9ja2l0KQogICAgICAgICBydG5sX3VubG9jayAoKTsgICAgICAgICAgICAgLyogbmVlZGVkIGlmIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KICAgICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlIChuZGV2KTsKICAgICBpZiAobG9ja2l0KQogICAgICAgICBydG5sX2xvY2sgKCk7ICAgICAgICAgICAgICAgLyogbmVlZGVkIGlmIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KICAgICBmcmVlX25ldGRldiAobmRldik7Ci0jZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTMzOSwxNCArMTE4NCw2IEBACiBtb2R1bGVfaW5pdCAoYzRfbW9kX2luaXQpOwogbW9kdWxlX2V4aXQgKGM0X21vZF9yZW1vdmUpOwogCi0jaWZuZGVmIFNCRV9JTkNMVURFX1NZTUJPTFMKLSNpZm5kZWYgQ09ORklHX1NCRV9XQU5DMjRfTkNPTU0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLUVYUE9SVF9OT19TWU1CT0xTOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCiBNT0RVTEVfQVVUSE9SICgiU0JFIFRlY2huaWNhbCBTZXJ2aWNlcyA8c3VwcG9ydEBzYmVpLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTiAoIndhblBDSS1DeFQxRTEgR2VuZXJpYyBIRExDIFdBTiBEcml2ZXIgbW9kdWxlIik7CiAjaWZkZWYgTU9EVUxFX0xJQ0VOU0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCmluZGV4IGQzZjVhNWIuLjEyYzc2YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYwpAQCAtNDA1LDcgKzQwNSw2IEBACiB9CiAKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0MSkKIC8qCiAgKiBUaGlzIGlzIHRoZSB3b3JrcSB0YXNrIGV4ZWN1dGVkIGJ5IHRoZSBPUyB3aGVuIG91ciBxdWV1ZV93b3JrKCkgaXMKICAqIHNjaGVkdWxlZCBhbmQgcnVuLiAgSXQgY2FuIGZpcmUgb2ZmIGVpdGhlciBSWCBvciBUWCBBQ1RJVkFUSU9OIGRlcGVuZGluZwpAQCAtNTE1LDcgKzUxNCw2IEBACiAjZW5kaWYKICAgICB9CiB9Ci0jZW5kaWYKIAogCiAgLyoKQEAgLTUzMSw3ICs1MjksNiBAQAogICAgICAgICAgICAgY2gtPmNoYW5udW0sIGNoLT50eGRfaXJxX3NydiwgY2gtPnR4ZF9pcnFfc3J2LT5zdGF0dXMpOwogI2VuZGlmCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDEpCiAgICAgLyogMi42IC0gZmluZCBuZXh0IHVucHJvY2Vzc2VkIG1lc3NhZ2UsIHRoZW4gc2V0IFRYIHRocCB0byBpdCAqLwogI2lmZGVmIFJMRF9SRVNUQVJUX0RFQlVHCiAgICAgcHJfaW5mbygiPj4gbXVzeWNjX2NoYW5fcmVzdGFydDogc2NoZWR1bGluZyBDaGFuICV4IHdvcmtRIEAgJXBcbiIsIGNoLT5jaGFubnVtLCAmY2gtPmNoX3dvcmspOwpAQCAtNTM5LDUxICs1MzYsOSBAQAogICAgIGM0X3drX2NoYW5fcmVzdGFydCAoY2gpOyAgICAgICAgLyogd29yayBxdWV1ZSBtZWNoYW5pc20gZmlyZXMgb2ZmOiBSZWY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtdXN5Y2Nfd3FfY2hhbl9yZXN0YXJ0ICgpICovCiAKLSNlbHNlCi0KLQotICAgIC8qIDIuNCAtIGZpbmQgbmV4dCB1bnByb2Nlc3NlZCBtZXNzYWdlLCB0aGVuIHNldCBUWCB0aHAgdG8gaXQgKi8KLSNpZmRlZiBSTERfUkVTVEFSVF9ERUJVRwotICAgIHByX2luZm8oIj4+IG11c3ljY19jaGFuX3Jlc3RhcnQ6IHNjaGVkdWxpbmcgQ2hhbiAleCBzdGFydF90eCAleFxuIiwgY2gtPmNoYW5udW0sIGNoLT5jaF9zdGFydF90eCk7Ci0jZW5kaWYKLSAgICAvKiByZXN0YXJ0IHRyYW5zbWlzc2lvbiBmcm9tIGJhY2tncm91bmQgbG9vcCAqLwotICAgIGNoLT51cC0+dXAtPndkX25vdGlmeSA9IFdEX05PVElGWV8xVFg7Ci0jZW5kaWYKIH0KIAogCi0jaWYgMAotdm9pZAotbXVzeWNjX2NsZWFudXAgKGNpX3QgKiBjaSkKLXsKLSAgICBtcGlfdCAgICAgICpwaTsKLSAgICBpbnQgICAgICAgICBpLCBqOwotCi0gICAgLyogZnJlZSB1cCBkcml2ZXIgcmVzb3VyY2VzICovCi0gICAgY2ktPnN0YXRlID0gQ19JTklUOyAgICAgICAgICAgICAvKiBtYXJrIGFzIGhhcmR3YXJlIG5vdCBhdmFpbGFibGUgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBjaS0+bWF4X3BvcnRzOyBpKyspCi0gICAgewotICAgICAgICBwaSA9ICZjaS0+cG9ydFtpXTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDEpCi0gICAgICAgIGM0X3dxX3BvcnRfY2xlYW51cCAocGkpOwotI2VuZGlmCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBNVVNZQ0NfTkNIQU5TOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwaS0+Y2hhbltqXSkKLSAgICAgICAgICAgICAgICBPU19rZnJlZSAocGktPmNoYW5bal0pOyAvKiBmcmVlIG1jaF90IHN0cnVjdCAqLwotICAgICAgICB9Ci0gICAgICAgIE9TX2tmcmVlIChwaS0+cmVncmFtX3NhdmVkKTsKLSAgICB9Ci0jaWYgMAotICAgIC8qIG9ic29sZXRlIC0gd2F0Y2hkb2cgaXMgbm93IHN0YXRpYyB3L2luIGNpX3QgKi8KLSAgICBPU19mcmVlX3dhdGNoZG9nIChjaS0+d2QpOwotI2VuZGlmCi0gICAgT1Nfa2ZyZWUgKGNpLT5pcWRfcF9zYXZlZCk7Ci0gICAgT1Nfa2ZyZWUgKGNpKTsKLX0KLSNlbmRpZgotCiB2b2lkCiBybGRfcHV0X2xlZCAobXBpX3QgKiBwaSwgdV9pbnQzMl90IGxlZHZhbCkKIHsKQEAgLTIwMDgsMzcgKzE5NjMsMTMgQEAKICAgICBhdG9taWNfYWRkIChsZW4sICZjaS0+dHhfcGVuZGluZyk7CiAgICAgY2gtPnMudHhfcGFja2V0cysrOwogICAgIGNoLT5zLnR4X2J5dGVzICs9IGxlbjsKLSNpZiAwCi0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoLT5jaF90eGxvY2ssIGZsYWdzKTsgICAvKiBhbGxvdyBwZW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHQgdG8gc25lYWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRocnUgKi8KLSNlbmRpZgotCiAgICAgLyoKICAgICAgKiBJZiBhbiBPTlIgd2FzIHNlZW4sIHRoZW4gY2hhbm5lbCByZXF1aXJlcyBwb2tpbmcgdG8gcmVzdGFydAogICAgICAqIHRyYW5zbWlzc2lvbi4KICAgICAgKi8KICAgICBpZiAoY2gtPmNoX3N0YXJ0X3R4KQogICAgIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw1LDQxKQotICAgICAgICBTRF9TRU1fVEFLRSAoJmNpLT5zZW1fd2RidXN5LCAiX3dkXyIpOyAgLyogb25seSAxIHRocnUgaGVyZSwgcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBib2FyZCAqLwotICAgICAgICBpZiAoKGNoLT5jaF9zdGFydF90eCA9PSBDSF9TVEFSVF9UWF9PTlIpICYmIChjaC0+cC5jaGFuX21vZGUgPT0gQ0ZHX0NIX1BST1RPX1RSQU5TKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogT05SIHJlc3RhcnQgdHJhbnNtaXNzaW9uIGZyb20gYmFja2dyb3VuZCBsb29wICovCi0gICAgICAgICAgICBjaS0+d2Rfbm90aWZ5ID0gV0RfTk9USUZZX09OUjsgICAgICAvKiBlbmFibGVkIGdsb2JhbCB3YXRjaGRvZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2Nhbi10aHJ1ICAqLwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogc3RhcnQgZmlyc3QgdHJhbnNtaXNzaW9uIGZyb20gYmFja2dyb3VuZCBsb29wICovCi0gICAgICAgICAgICBjaS0+d2Rfbm90aWZ5ID0gV0RfTk9USUZZXzFUWDsgICAgICAvKiBlbmFibGVkIGdsb2JhbCB3YXRjaGRvZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2Nhbi10aHJ1ICAqLwotICAgICAgICB9CiAgICAgICAgIG11c3ljY19jaGFuX3Jlc3RhcnQgKGNoKTsKLSAgICAgICAgU0RfU0VNX0dJVkUgKCZjaS0+c2VtX3dkYnVzeSk7Ci0jZWxzZQotICAgICAgICBtdXN5Y2NfY2hhbl9yZXN0YXJ0IChjaCk7Ci0jZW5kaWYKICAgICB9CiAjaWZkZWYgU0JFX1dBTjI1NlQzX0VOQUJMRQogICAgIHdhbjI1NnQzX2xlZCAoY2ksIExFRF9UWCwgTEVEVl9HKTsKQEAgLTIwNDcsMTM5ICsxOTc4LDQgQEAKIH0KIAogCi0jaWYgMAotaW50Ci1tdXN5Y2Nfc2V0X2NoYW4gKGNpX3QgKiBjaSwgaW50IGNoYW5udW0sIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqIHApCi17Ci0gICAgbWNoX3QgICAgICAqY2g7Ci0gICAgaW50ICAgICAgICAgcm9rID0gMDsKLSAgICBpbnQgICAgICAgICBuID0gMDsKLQotICAgIGlmIChjaGFubnVtIDwgMCB8fCBjaGFubnVtID49IChNVVNZQ0NfTlBPUlRTICogTVVTWUNDX05DSEFOUykpICAgICAgLyogc2FuaXR5IGNoayBwYXJhbSAqLwotICAgICAgICByZXR1cm4gRUNIUk5HOwotICAgIGlmICghKGNoID0gc2RfZmluZF9jaGFuIChjaSwgY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOwotICAgIGlmIChjaC0+Y2hhbm51bSAhPSBwLT5jaGFubnVtKQotICAgICAgICByZXR1cm4gRUlOVkFMOwotICAgIGlmIChzZF9saW5lX2lzX29rIChjaC0+dXNlcikpCi0gICAgewotICAgICAgICByb2sgPSAxOwotICAgICAgICBzZF9saW5lX2lzX2Rvd24gKGNoLT51c2VyKTsKLSAgICB9Ci0gICAgaWYgKGNoLT5zdGF0ZSA9PSBVUCAmJiAgICAgICAgICAvKiBicmluZyBkb3duIGluIGN1cnJlbnQgY29uZmlndXJhdGlvbiAqLwotICAgICAgICAoY2gtPnAuc3RhdHVzICE9IHAtPnN0YXR1cyB8fAotICAgICAgICAgY2gtPnAuY2hhbl9tb2RlICE9IHAtPmNoYW5fbW9kZSB8fAotICAgICAgICAgY2gtPnAuaW50cl9tYXNrICE9IHAtPmludHJfbWFzayB8fAotICAgICAgICAgY2gtPnR4ZF9mcmVlIDwgY2gtPnR4ZF9udW0pKQotICAgIHsKLSAgICAgICAgaWYgKChuID0gbXVzeWNjX2NoYW5fZG93biAoY2ksIGNoYW5udW0pKSkKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICBpZiAoY2gtPnAubW9kZV81NmsgIT0gcC0+bW9kZV81NmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoLT5wID0gKnA7ICAgICAgICAgICAgIC8qIGNvcHkgaW4gbmV3IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgIG11c3ljY191cGRhdGVfdGltZXNsb3RzICgmY2ktPnBvcnRbY2gtPmNoYW5udW0gLyBNVVNZQ0NfTkNIQU5TXSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgY2gtPnAgPSAqcDsgICAgICAgICAgICAgLyogY29weSBpbiBuZXcgcGFyYW1ldGVycyAqLwotICAgICAgICBpZiAoKG4gPSBtdXN5Y2NfY2hhbl91cCAoY2ksIGNoYW5udW0pKSkKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICBzZF9lbmFibGVfeG1pdCAoY2gtPnVzZXIpOyAgLyogcmUtZW5hYmxlIHRvIGNhdGNoIGZsb3cgY29udHJvbGxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbCAqLwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGNoLT5wLm1vZGVfNTZrICE9IHAtPm1vZGVfNTZrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaC0+cCA9ICpwOyAgICAgICAgICAgICAvKiBjb3B5IGluIG5ldyBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICBtdXN5Y2NfdXBkYXRlX3RpbWVzbG90cyAoJmNpLT5wb3J0W2NoLT5jaGFubnVtIC8gTVVTWUNDX05DSEFOU10pOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNoLT5wID0gKnA7ICAgICAgICAgICAgIC8qIGNvcHkgaW4gbmV3IHBhcmFtZXRlcnMgKi8KLSAgICB9Ci0KLSAgICBpZiAocm9rKQotICAgICAgICBzZF9saW5lX2lzX3VwIChjaC0+dXNlcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotCi1pbnQKLW11c3ljY19nZXRfY2hhbiAoY2lfdCAqIGNpLCBpbnQgY2hhbm51bSwgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtICogcCkKLXsKLSAgICBtY2hfdCAgICAgICpjaDsKLQotI2lmIDAKLSAgICBpZiAoY2hhbm51bSA8IDAgfHwgY2hhbm51bSA+PSAoTVVTWUNDX05QT1JUUyAqIE1VU1lDQ19OQ0hBTlMpKSAgICAgIC8qIHNhbml0eSBjaGsgcGFyYW0gKi8KLSAgICAgICAgcmV0dXJuIEVDSFJORzsKLSNlbmRpZgotICAgIGlmICghKGNoID0gc2RfZmluZF9jaGFuIChjaSwgY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOwotICAgICpwID0gY2gtPnA7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50Ci1tdXN5Y2NfZ2V0X2NoYW5fc3RhdHMgKGNpX3QgKiBjaSwgaW50IGNoYW5udW0sIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqIHApCi17Ci0gICAgbWNoX3QgICAgICAqY2g7Ci0KLSAgICBpZiAoY2hhbm51bSA8IDAgfHwgY2hhbm51bSA+PSAoTVVTWUNDX05QT1JUUyAqIE1VU1lDQ19OQ0hBTlMpKSAgICAgIC8qIHNhbml0eSBjaGsgcGFyYW0gKi8KLSAgICAgICAgcmV0dXJuIEVDSFJORzsKLSAgICBpZiAoIShjaCA9IHNkX2ZpbmRfY2hhbiAoY2ksIGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKLSAgICAqcCA9IGNoLT5zOwotICAgIHAtPnR4X3BlbmRpbmcgPSBhdG9taWNfcmVhZCAoJmNoLT50eF9wZW5kaW5nKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLSNpZmRlZiBTQkVfV0FOMjU2VDNfRU5BQkxFCi1pbnQKLW11c3ljY19jaGFuX2Rvd24gKGNpX3QgKiBjaSwgaW50IGNoYW5udW0pCi17Ci0gICAgbWNoX3QgICAgICAqY2g7Ci0gICAgbXBpX3QgICAgICAqcGk7Ci0gICAgaW50ICAgICAgICAgaSwgZ2NoYW47Ci0KLSAgICBpZiAoIShjaCA9IHNkX2ZpbmRfY2hhbiAoY2ksIGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVJTlZBTDsKLSAgICBwaSA9IGNoLT51cDsKLSAgICBnY2hhbiA9IGNoLT5nY2hhbjsKLQotICAgIC8qIERlYWN0aXZhdGUgdGhlIGNoYW5uZWwgKi8KLSAgICBtdXN5Y2Nfc2Vydl9yZXEgKHBpLCBTUl9DSEFOTkVMX0RFQUNUSVZBVEUgfCBTUl9SWF9ESVJFQ1RJT04gfCBnY2hhbik7Ci0gICAgY2gtPmNoX3N0YXJ0X3J4ID0gMDsKLSAgICBtdXN5Y2Nfc2Vydl9yZXEgKHBpLCBTUl9DSEFOTkVMX0RFQUNUSVZBVEUgfCBTUl9UWF9ESVJFQ1RJT04gfCBnY2hhbik7Ci0gICAgY2gtPmNoX3N0YXJ0X3R4ID0gMDsKLQotICAgIGlmIChjaC0+c3RhdGUgPT0gRE9XTikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2gtPnN0YXRlID0gRE9XTjsKLQotICAgIHBpLT5yZWdyYW0tPnRocFtnY2hhbl0gPSAwOwotICAgIHBpLT5yZWdyYW0tPnRtcFtnY2hhbl0gPSAwOwotICAgIHBpLT5yZWdyYW0tPnJocFtnY2hhbl0gPSAwOwotICAgIHBpLT5yZWdyYW0tPnJtcFtnY2hhbl0gPSAwOwotICAgIEZMVVNIX01FTV9XUklURSAoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY2gtPnR4ZF9udW07IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChjaC0+bWR0W2ldLm1lbV90b2tlbiAhPSAwKQotICAgICAgICAgICAgT1NfbWVtX3Rva2VuX2ZyZWUgKGNoLT5tZHRbaV0ubWVtX3Rva2VuKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2gtPnJ4ZF9udW07IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChjaC0+bWRyW2ldLm1lbV90b2tlbiAhPSAwKQotICAgICAgICAgICAgT1NfbWVtX3Rva2VuX2ZyZWUgKGNoLT5tZHJbaV0ubWVtX3Rva2VuKTsKLSAgICB9Ci0KLSAgICBPU19rZnJlZSAoY2gtPm1kdCk7Ci0gICAgY2gtPm1kdCA9IDA7Ci0gICAgT1Nfa2ZyZWUgKGNoLT5tZHIpOwotICAgIGNoLT5tZHIgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogLyoqKiBFbmQtb2YtRmlsZSAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtYzkzeDZfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtYzkzeDZfZWVwcm9tLmMKaW5kZXggMWM4ZGZiOC4uNjJiMTJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWM5M3g2X2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jOTN4Nl9lZXByb20uYwpAQCAtNTAwLDExICs1MDAsNyBAQAogICAgIHRpbWVfdCAgICAgIGNyZWF0ZVRpbWU7CiAgICAgaW50ICAgICAgICAgaTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgIGNyZWF0ZVRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0jZWxzZQogICAgIGNyZWF0ZVRpbWUgPSBnZXRfc2Vjb25kcyAoKTsKLSNlbmRpZgogCiAgICAgLyogdXNlIHRlbXBsYXRlIGRhdGEgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChGTERfVFlQRTIpOyArK2kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmggYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmgKaW5kZXggMjZjMWYwZS4uZWY2YWM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzQuaApAQCAtMTE3LDEyICsxMTcsOCBAQAogCiAjaW5jbHVkZSAicG1jYzRfcHJpdmF0ZS5oIgogCi0jaWYgIShMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiBjaGFyICAgICAgICpnZXRfaGRsY19uYW1lIChoZGxjX2RldmljZSAqKTsKIAotI2VuZGlmCi0KLQogLyoKICAqIGV4dGVybmFsIGludGVyZmFjZQogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYwppbmRleCAzMzNjZjI2Li45ZjczMGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKQEAgLTExOSwxMiArMTE5LDEwIEBACiAjZGVmaW5lIEtFUk5fV0FSTiBLRVJOX1dBUk5JTkcKIAogLyogZm9yd2FyZCByZWZlcmVuY2VzICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDQxKQogc3RhdHVzX3QgICAgYzRfd2tfY2hhbl9pbml0IChtcGlfdCAqLCBtY2hfdCAqKTsKIHZvaWQgICAgICAgIGM0X3dxX3BvcnRfY2xlYW51cCAobXBpX3QgKik7CiBzdGF0dXNfdCAgICBjNF93cV9wb3J0X2luaXQgKG1waV90ICopOwogCi0jZW5kaWYKIGludCAgICAgICAgIGM0X2xvb3BfcG9ydCAoY2lfdCAqLCBpbnQsIHVfaW50OF90KTsKIHN0YXR1c190ICAgIGM0X3NldF9wb3J0IChjaV90ICosIGludCk7CiBzdGF0dXNfdCAgICBtdXN5Y2NfY2hhbl9kb3duIChjaV90ICosIGludCk7CkBAIC01MzMsMTQ1ICs1MzEsMTUgQEAKIFNUQVRJQyB2b2lkCiBjNF93YXRjaGRvZyAoY2lfdCAqIGNpKQogewotI2lmIDAKLSAgICAvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZW5kaWYKLQogICAgIGlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkKICAgICB7CiAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl9pbmZvKCJkcnZyIG5vdCBhdmFpbGFibGUgKCV4KVxuIiwgZHJ2cl9zdGF0ZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0jaWYgMAotICAgIFNEX1NFTV9UQUtFICgmY2ktPnNlbV93ZGJ1c3ksICJfd2RfIik7ICAgIC8qIG9ubHkgMSB0aHJ1IGhlcmUsIHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkICovCi0jZW5kaWYKLQogICAgIGNpLT53ZGNvdW50Kys7CiAgICAgY2hlY2tQb3J0cyAoY2kpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDUsNDEpCi0gICAgaWYgKGNpLT53ZF9ub3RpZnkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyB0aGVyZSBhIHN0YXRlIGNoYW5nZSB0byBzZWFyY2ggZm9yICovCi0gICAgICAgIGludCAgICAgICAgIHBvcnQsIGdjaGFuOwotCi0gICAgICAgIGNpLT53ZF9ub3RpZnkgPSAwOyAgICAgICAgICAvKiByZXNldCBub3RpZmljYXRpb24gKi8KLSAgICAgICAgZm9yIChnY2hhbiA9IDA7IGdjaGFuIDwgTVVTWUNDX05DSEFOUzsgZ2NoYW4rKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChwb3J0ID0gMDsgcG9ydCA8IGNpLT5tYXhfcG9ydDsgcG9ydCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1jaF90ICAgICAgKmNoID0gY2ktPnBvcnRbcG9ydF0uY2hhbltnY2hhbl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNoIHx8IGNpLT5zdGF0ZSAhPSBDX1JVTk5JTkcpICAgICAgLyogc3RhdGUgY2hhbmdlZCB3aGlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhY3F1aXJpbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmIChjaC0+c3RhdGUgPT0gVVApLyogY2hhbm5lbCBtdXN0IGJlIHNldCB1cCAqLwotICAgICAgICAgICAgICAgIHsKLSNpZiAwCi0jaWZkZWYgUkxEX1RSQU5TX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgIGlmICgxIHx8IGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiB3YXRjaGRvZyByZXZpdmluZyBQb3J0ICVkIENoYW5uZWwgJWQgWyVkXSBzdHMgJXgvJXgsIHN0YXJ0X1RYICV4IGZyZWUgJXggc3RhcnRfUlggJXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoLT5jaGFubnVtLCBwb3J0LCBnY2hhbiwgY2gtPmNoYW5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5wLnN0YXR1cywgY2gtPnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+Y2hfc3RhcnRfdHgsIGNoLT50eGRfZnJlZSwgY2gtPmNoX3N0YXJ0X3J4KTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAvKiogY2hlY2sgZm9yIFJYIHJlc3RhcnQgcmVxdWVzdCAqKi8KLSAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoLT5jaF9zdGFydF9yeCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGNoLT5zdGF0dXMgJiBSWF9FTkFCTEVEKSkgICAgICAvKiByZXF1aXJlcyBzdGFydCBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIFJYICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5jaF9zdGFydF9yeCA9IDA7ICAgIC8qIHdlIGFyZSByZXN0YXJ0aW5nIFJYLi4uICovCi0jaWZkZWYgUkxEX1RSQU5TX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgICAgICBwcl9pbmZvKCIrKyBjNF93YXRjaGRvZygpIENIQU4gUlggQUNUSVZBVEU6IGNoYW4gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5jaGFubnVtKTsKLSNlbmRpZgotI2lmZGVmIFJMRF9SWEFDVF9ERUJVRwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtZGVzYyAqbWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCAgaGVyZWI0ID0gNzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlYjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlYjQtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQgPSAmY2gtPm1kcltjaC0+cnhpeF9pcnFfc3J2XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiKysgYzRfd2F0Y2hkb2dbJWRdIENIQU4gUlggQUNUSVZBVEU6IHJ4aXhfaXJxX3NydiAlZCwgbWQgJXAgc3RzICV4LCByeHBrdCAlbHVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gtPmNoYW5udW0sIGNoLT5yeGl4X2lycV9zcnYsIG1kLCBsZTMyX3RvX2NwdSAobWQtPnN0YXR1cyksIGNoLT5zLnJ4X3BhY2tldHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN5Y2NfZHVtcF9yeGJ1ZmZlcl9yaW5nIChjaCwgMSk7ICAgICAgLyogUkxEIERFQlVHICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBtdXN5Y2Nfc2Vydl9yZXEgKGNoLT51cCwgU1JfQ0hBTk5FTF9BQ1RJVkFURSB8IFNSX1JYX0RJUkVDVElPTiB8IGdjaGFuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgLyoqIGNoZWNrIGZvciBUWCByZXN0YXJ0IHJlcXVlc3QgKiovCi0gICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaC0+Y2hfc3RhcnRfdHggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChjaC0+c3RhdHVzICYgVFhfRU5BQkxFRCkpICAgICAgLyogcmVxdWlyZXMgc3RhcnQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZW5hYmxlZCBUWCAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWRlc2MgKm1kOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogZmluZCBuZXh0IHVucHJvY2Vzc2VkIG1lc3NhZ2UsIHRoZW4gc2V0IFRYIHRocCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICogaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbXVzeWNjX3VwZGF0ZV90eF90aHAgKGNoKTsKLQotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlICgmY2gtPmNoX3R4bG9jaywgZmxhZ3MpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBtZCA9IGNoLT50eGRfaXJxX3NydjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiLS0gYzRfd2F0Y2hkb2dbJWRdOiBXQVJOSU5HLCBzdGFydGluZyBOVUxMIG1kXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gtPmNoYW5udW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIi0tICAgY2hhbiAlZCB0eGRfaXJxX3NydiAlcCBzdHMgJXggdXNyX2FkZCAlcCBzdHMgJXgsIHR4cGt0ICVsdVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5jaGFubnVtLCBjaC0+dHhkX2lycV9zcnYsIGxlMzJfdG9fY3B1ICgoc3RydWN0IG1kZXNjICopIChjaC0+dHhkX2lycV9zcnYpLT5zdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gtPnR4ZF91c3JfYWRkLCBsZTMyX3RvX2NwdSAoKHN0cnVjdCBtZGVzYyAqKSAoY2gtPnR4ZF91c3JfYWRkKS0+c3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5zLnR4X3BhY2tldHMpOwotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICgmY2gtPmNoX3R4bG9jaywgZmxhZ3MpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1kLT5kYXRhICYmICgobGUzMl90b19jcHUgKG1kLT5zdGF0dXMpKSAmIE1VU1lDQ19UWF9PV05FRCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgUkxEX1RSQU5TX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiKysgYzRfd2F0Y2hkb2dbJWRdIENIQU4gVFggQUNUSVZBVEU6IHN0YXJ0X3R4ICV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gtPmNoYW5udW0sIGNoLT5jaF9zdGFydF90eCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+Y2hfc3RhcnRfdHggPSAwOyAgICAgICAgLyogd2UgYXJlIHJlc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVFguLi4gKi8KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoLT5jaF90eGxvY2ssIGZsYWdzKTsgICAvKiBhbGxvdyBpbnRlcnJ1cHRzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VydmljZSByZXF1ZXN0ICovCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN5Y2Nfc2Vydl9yZXEgKGNoLT51cCwgU1JfQ0hBTk5FTF9BQ1RJVkFURSB8IFNSX1RYX0RJUkVDVElPTiB8IGdjaGFuKTsKLSNpZmRlZiBSTERfVFJBTlNfREVCVUcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSB8fCBsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiKysgU0FDS1tQJWQvQyVkXSBhY2snZCwgY29udGludWluZy4uLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+dXAtPnBvcnRudW0sIGNoLT5jaGFubnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbHNlCiAgICAgY2ktPndkX25vdGlmeSA9IDA7Ci0jZW5kaWYKLSNpZiAwCi0gICAgU0RfU0VNX0dJVkUgKCZjaS0+c2VtX3dkYnVzeSk7LyogcmVsZWFzZSBwZXItYm9hcmQgaG9sZCAqLwotI2VuZGlmCiB9CiAKIApAQCAtNjkwLDkgKzU1OCw3IEBACiAgICAgICAgIGZvciAocG9ydG51bSA9IDA7IHBvcnRudW0gPCBjaS0+bWF4X3BvcnQ7IHBvcnRudW0rKykKICAgICAgICAgewogICAgICAgICAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDQxKQogICAgICAgICAgICAgYzRfd3FfcG9ydF9jbGVhbnVwIChwaSk7Ci0jZW5kaWYKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBNVVNZQ0NfTkNIQU5TOyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKHBpLT5jaGFuW2pdKQpAQCAtNzAwLDEwICs1NjYsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgT1Nfa2ZyZWUgKHBpLT5yZWdyYW1fc2F2ZWQpOwogICAgICAgICB9Ci0jaWYgMAotICAgICAgICAvKiBvYnNvbGV0ZSAtIHdhdGNoZG9nIGlzIG5vdyBzdGF0aWMgdy9pbiBjaV90ICovCi0gICAgICAgIE9TX2ZyZWVfd2F0Y2hkb2cgKGNpLT53ZCk7Ci0jZW5kaWYKICAgICAgICAgT1Nfa2ZyZWUgKGNpLT5pcWRfcF9zYXZlZCk7CiAgICAgICAgIE9TX2tmcmVlIChjaSk7CiAgICAgICAgIGNpID0gbmV4dDsgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIG5leHQgYm9hcmQsIGlmIGFueSAqLwpAQCAtMTE0NSw3ICsxMDA3LDYgQEAKICAgICAgICAgcmV0dXJuIEVCVVNZOyAgICAgICAgICAgICAgIC8qIGdyb3VwIG5lZWRzIGluaXRpYWxpemF0aW9uIG9ubHkgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBjaGFubmVsIG9mIGEgZ3JvdXAgKi8KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0MSkKICAgICB7CiAgICAgICAgIHN0YXR1c190ICAgIHJldDsKIApAQCAtMTE1Myw3ICsxMDE0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdvcmtxdWV1ZV9zdHJ1Y3QgKi8KICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICB9Ci0jZW5kaWYKIAogICAgIGluaXRfY29tZXQgKGNpLCBwaS0+Y29tZXRiYXNlLCBwcC0+cG9ydF9tb2RlLCAxIC8qIGNsb2NrbWFzdGVyID09IHRydWUgKi8gLCBwcC0+cG9ydFApOwogICAgIGNsY2sgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY2ktPmNwbGRiYXNlLT5tY2xrKSAmIFBNQ0M0X0NQTERfTUNMS19NQVNLOwpAQCAtMTI2OSwxNCArMTEyOSwxMiBAQAogICAgIHNwaW5fbG9ja19pbml0ICgmY2gtPmNoX3J4bG9jayk7CiAgICAgc3Bpbl9sb2NrX2luaXQgKCZjaC0+Y2hfdHhsb2NrKTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0MSkKICAgICB7CiAgICAgICAgIHN0YXR1c190ICAgIHJldDsKIAogICAgICAgICBpZiAoKHJldCA9IGM0X3drX2NoYW5faW5pdCAocGksIGNoKSkpCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSNlbmRpZgogCiAgICAgLyogc2F2ZSBvZmYgaW50ZXJmYWNlIGFzc2lnbm1lbnRzIHdoaWNoIGJvdW5kIGEgYm9hcmQgKi8KICAgICBpZiAoY2ktPmZpcnN0X2lmID09IDApICAgICAgICAgIC8qIGZpcnN0IGNoYW5uZWwgcmVnaXN0ZXJlZCBpcyBhc3N1bWVkIHRvCkBAIC0xNzA1LDMxICsxNTYzLDIzIEBACiAKICAgICBpZiAoY2ktPmZpcnN0X2lmKQogICAgIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICAgICAgbnAgPSAoY2hhciAqKSBoZGxjX3RvX25hbWUgKGNpLT5maXJzdF9pZik7Ci0jZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCiAgICAgICAgICAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgY2ktPmZpcnN0X2lmOwogICAgICAgICAgICAgbnAgPSAoY2hhciAqKSBkZXYtPm5hbWU7CiAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICBzdHJuY3B5IChiaXAtPmZpcnN0X2luYW1lLCBucCwgQ0hOTV9TVFJMRU4gLSAxKTsKICAgICB9IGVsc2UKICAgICAgICAgc3RyY3B5IChiaXAtPmZpcnN0X2luYW1lLCAiPE5VTEw+Iik7CiAgICAgaWYgKGNpLT5sYXN0X2lmKQogICAgIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICAgICAgbnAgPSAoY2hhciAqKSBoZGxjX3RvX25hbWUgKGNpLT5sYXN0X2lmKTsKLSNlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKICAgICAgICAgICAgIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBjaS0+bGFzdF9pZjsKICAgICAgICAgICAgIG5wID0gKGNoYXIgKikgZGV2LT5uYW1lOwogICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgc3RybmNweSAoYmlwLT5sYXN0X2luYW1lLCBucCwgQ0hOTV9TVFJMRU4gLSAxKTsKICAgICB9IGVsc2UKICAgICAgICAgc3RyY3B5IChiaXAtPmxhc3RfaW5hbWUsICI8TlVMTD4iKTsKQEAgLTE3NjMsMTEgKzE2MTMsNyBAQAogICAgIGlmICghKGRldiA9IGdldHVzZXJieWNoYW4gKGlpcC0+Y2hhbm51bSkpKQogICAgICAgICByZXR1cm4gRU5PRU5UOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0gICAgbnAgPSAoY2hhciAqKSBoZGxjX3RvX25hbWUgKGRldl90b19oZGxjIChkZXYpKTsKLSNlbHNlCiAgICAgbnAgPSBkZXYtPm5hbWU7Ci0jZW5kaWYKICAgICBzdHJuY3B5IChpaXAtPmluYW1lLCBucCwgQ0hOTV9TVFJMRU4gLSAxKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTE4MjYsMTEgKzE2NzIsNyBAQAogICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY2ktPnJlZy0+Z2xjZCwgR0NEX01BR0lDIHwgTVVTWUNDX0dDRF9JTlRCX0RJU0FCTEUpOwogI2VuZGlmCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKQotICAgIHJldHVybjsKLSNlbHNlCiAgICAgcmV0dXJuIElSUV9SRVRWQUwgKGhhbmRsZWQpOwotI2VuZGlmCiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9zYmVjb21faW5saW5lX2xpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZWNvbV9pbmxpbmVfbGludXguaAppbmRleCBjNjUxNzJkLi41YTcyY2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZWNvbV9pbmxpbmVfbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZWNvbV9pbmxpbmVfbGludXguaApAQCAtNDgsOSArNDgsNiBAQAogI2Vsc2UKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTgpCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmICEgZGVmaW5lZChfX1NNUF9fKQogI2RlZmluZSBfX1NNUF9fCiAjZW5kaWYKQEAgLTYwLDEyICs1Nyw4IEBACiAKICNpZmRlZiBNT0RVTEUKICNpZmRlZiBNT0RWRVJTSU9OUwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2luY2x1ZGUgPGxpbnV4L21vZHZlcnNpb25zLmg+Ci0jZWxzZQogI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgogI2VuZGlmCi0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNlbmRpZgogI2VuZGlmCkBAIC0yNjAsMTEgKzI1Myw3IEBACiBzdHJ1Y3Qgd2F0Y2hkb2cKIHsKICAgICBzdHJ1Y3QgdGltZXJfbGlzdCBoOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgIHN0cnVjdCB0cV9zdHJ1Y3QgdHE7Ci0jZWxzZQogICAgIHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotI2VuZGlmCiAgICAgdm9pZCAgICAgICAqc29mdGM7CiAgICAgdm9pZCAgICAgICAgKCpmdW5jKSAodm9pZCAqc29mdGMpOwogICAgIGludCAgICAgICAgIHRpY2tzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fdmZlOHguYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX3ZmZTh4LmMKaW5kZXggZTYxZmRiYS4uZDg3ZDU2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fdmZlOHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV92ZmU4eC5jCkBAIC02NDQsMTcgKzY0NCwxMCBAQAogCQlpZiAoIWF4aWQpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlheGlvID0KLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnKSwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJc2l6ZW9mKHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnKSkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwkJYXhpbyA9IG1lbWR1cF91c2VyKCh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdmZlX2NtZF9heGlfb3V0cHV0X2NvbmZpZykpOworCQlpZiAoSVNfRVJSKGF4aW8pKQorCQkJcmV0dXJuIFBUUl9FUlIoYXhpbyk7CiAKIAkJdmZlX2NvbmZpZ19heGkoT1VUUFVUXzEsIGF4aWQsIGF4aW8pOwogCQl2ZmVfYXhpX291dHB1dF9jb25maWcoYXhpbyk7CkBAIC02NjksMTcgKzY2MiwxMCBAQAogCQlpZiAoIWF4aWQpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlheGlvID0KLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnKSwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgdmZlX2NtZF9heGlfb3V0cHV0X2NvbmZpZykpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJCWF4aW8gPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHZmZV9jbWRfYXhpX291dHB1dF9jb25maWcpKTsKKwkJaWYgKElTX0VSUihheGlvKSkKKwkJCXJldHVybiBQVFJfRVJSKGF4aW8pOwogCiAJCXZmZV9jb25maWdfYXhpKE9VVFBVVF8yLCBheGlkLCBheGlvKTsKIApAQCAtNjk0LDE3ICs2ODAsMTAgQEAKIAkJaWYgKCFheGlkKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJYXhpbyA9Ci0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlX2NtZF9heGlfb3V0cHV0X2NvbmZpZyksCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCXNpemVvZihzdHJ1Y3QgdmZlX2NtZF9heGlfb3V0cHV0X2NvbmZpZykpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJCWF4aW8gPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHZmZV9jbWRfYXhpX291dHB1dF9jb25maWcpKTsKKwkJaWYgKElTX0VSUihheGlvKSkKKwkJCXJldHVybiBQVFJfRVJSKGF4aW8pOwogCiAJCXZmZV9jb25maWdfYXhpKE9VVFBVVF8xX0FORF8yLAogCQkJYXhpZCwgYXhpbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcG1lbS5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3BtZW0uYwppbmRleCA2Mzg3MzY1Li43ZDZiYmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcG1lbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9wbWVtLmMKQEAgLTI0LDggKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNkZWZpbmUgUE1FTV9NQVhfREVWSUNFUyAxMApAQCAtMTc1LDcgKzE3NSw3IEBACiBzdGF0aWMgaW50IHBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgbG9uZyBwbWVtX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG1lbV9mb3BzID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbWVtX2ZvcHMgPSB7CiAJLnJlbGVhc2UgPSBwbWVtX3JlbGVhc2UsCiAJLm1tYXAgPSBwbWVtX21tYXAsCiAJLm9wZW4gPSBwbWVtX29wZW4sCkBAIC0yMDksNyArMjA5LDcgQEAKIAogCWlmICh1bmxpa2VseSghZmlsZS0+cHJpdmF0ZV9kYXRhKSkKIAkJcmV0dXJuIDA7Ci0JZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKHVubGlrZWx5KGRhdGEtPmluZGV4IDwgMCkpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKIAlpZiAoIWlzX3BtZW1fZmlsZShmaWxlKSB8fCAhaGFzX2FsbG9jYXRpb24oZmlsZSkpCiAJCXJldHVybiAwOwotCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmIChQTUVNX0ZMQUdTX01BU1RFUk1BUCAmIGRhdGEtPmZsYWdzKQogCQlyZXR1cm4gMTsKIAltYXN0ZXJfZmlsZSA9IGZnZXRfbGlnaHQoZGF0YS0+bWFzdGVyX2ZkLCAmcHV0X25lZWRlZCk7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAogc3RhdGljIGludCBwbWVtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHBtZW1fcmVnaW9uX25vZGUgKnJlZ2lvbl9ub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CiAJaW50IGlkID0gZ2V0X2lkKGZpbGUpLCByZXQgPSAwOwpAQCAtMzk5LDggKzM5OSw4IEBACiAJRExPRygib3JkZXIgJWx4XG4iLCBvcmRlcik7CiAKIAkvKiBsb29rIHRocm91Z2ggdGhlIGJpdG1hcDoKLQkgKiAJaWYgeW91IGZpbmQgYSBmcmVlIHNsb3Qgb2YgdGhlIGNvcnJlY3Qgb3JkZXIgdXNlIGl0Ci0JICogCW90aGVyd2lzZSwgdXNlIHRoZSBiZXN0IGZpdCAoc21hbGxlc3Qgd2l0aCBzaXplID4gb3JkZXIpIHNsb3QKKwkgKglpZiB5b3UgZmluZCBhIGZyZWUgc2xvdCBvZiB0aGUgY29ycmVjdCBvcmRlciB1c2UgaXQKKwkgKglvdGhlcndpc2UsIHVzZSB0aGUgYmVzdCBmaXQgKHNtYWxsZXN0IHdpdGggc2l6ZSA+IG9yZGVyKSBzbG90CiAJICovCiAJd2hpbGUgKGN1cnIgPCBlbmQpIHsKIAkJaWYgKFBNRU1fSVNfRlJFRShpZCwgY3VycikpIHsKQEAgLTQyNiw4ICs0MjYsOCBAQAogCX0KIAogCS8qIG5vdyBwYXJ0aXRpb24gdGhlIGJlc3QgZml0OgotCSAqIAlzcGxpdCB0aGUgc2xvdCBpbnRvIDIgYnVkZGllcyBvZiBvcmRlciAtIDEKLQkgKiAJcmVwZWF0IHVudGlsIHRoZSBzbG90IGlzIG9mIHRoZSBjb3JyZWN0IG9yZGVyCisJICoJc3BsaXQgdGhlIHNsb3QgaW50byAyIGJ1ZGRpZXMgb2Ygb3JkZXIgLSAxCisJICoJcmVwZWF0IHVudGlsIHRoZSBzbG90IGlzIG9mIHRoZSBjb3JyZWN0IG9yZGVyCiAJICovCiAJd2hpbGUgKFBNRU1fT1JERVIoaWQsIGJlc3RfZml0KSA+ICh1bnNpZ25lZCBjaGFyKW9yZGVyKSB7CiAJCWludCBidWRkeTsKQEAgLTU5MSw3ICs1OTEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOwogCS8qIGNoZWNrIHRoaXMgZmlsZSBpc24ndCBhbHJlYWR5IG1tYXBlZCwgZm9yIHN1Ym1hcHMgY2hlY2sgdGhpcyBmaWxlCiAJICogaGFzIG5ldmVyIGJlZW4gbW1hcGVkICovCkBAIC02OTAsNyArNjkwLDcgQEAKICNlbmRpZgogCQlyZXR1cm4gLTE7CiAJfQotCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWRvd25fcmVhZCgmZGF0YS0+c2VtKTsKIAlpZiAoZGF0YS0+dm1hKSB7CiAJCSpzdGFydCA9IGRhdGEtPnZtYS0+dm1fc3RhcnQ7CkBAIC03MTIsNyArNzEyLDcgQEAKIAlpZiAoIWlzX3BtZW1fZmlsZShmaWxlKSB8fCAhaGFzX2FsbG9jYXRpb24oZmlsZSkpCiAJCXJldHVybiAtMTsKIAotCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmIChkYXRhLT5pbmRleCA9PSAtMSkgewogI2lmIFBNRU1fREVCVUcKIAkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogcmVxdWVzdGVkIHBtZW0gZGF0YSBmcm9tIGZpbGUgd2l0aCBubyAiCkBAIC03NjYsNyArNzY2LDcgQEAKIAlpZiAoIWlzX3BtZW1fZmlsZShmaWxlKSkKIAkJcmV0dXJuOwogCWlkID0gZ2V0X2lkKGZpbGUpOwotCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogI2lmIFBNRU1fREVCVUcKIAlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOwogCWlmIChkYXRhLT5yZWYgPT0gMCkgewpAQCAtNzkzLDcgKzc5Myw3IEBACiAJCXJldHVybjsKIAogCWlkID0gZ2V0X2lkKGZpbGUpOwotCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICghcG1lbVtpZF0uY2FjaGVkKQogCQlyZXR1cm47CiAKQEAgLTgyMiw3ICs4MjIsNyBAQAogCiBzdGF0aWMgaW50IHBtZW1fY29ubmVjdCh1bnNpZ25lZCBsb25nIGNvbm5lY3QsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwbWVtX2RhdGEgKnNyY19kYXRhOwogCXN0cnVjdCBmaWxlICpzcmNfZmlsZTsKIAlpbnQgcmV0ID0gMCwgcHV0X25lZWRlZDsKQEAgLTg0Miw3ICs4NDIsNyBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9iYWRfZmlsZTsKIAl9Ci0Jc3JjX2RhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKXNyY19maWxlLT5wcml2YXRlX2RhdGE7CisJc3JjX2RhdGEgPSBzcmNfZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGhhc19hbGxvY2F0aW9uKGZpbGUpICYmIChkYXRhLT5pbmRleCAhPSBzcmNfZGF0YS0+aW5kZXgpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInBtZW06IGZpbGUgaXMgYWxyZWFkeSBtYXBwZWQgYnV0IGRvZXNuJ3QgIgpAQCAtOTI5LDcgKzkyOSw3IEBACiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOwogCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CiAJaW50IGlkID0gZ2V0X2lkKGZpbGUpOwotCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJLyogcG1lbSByZWdpb24gbXVzdCBiZSBhbGlnbmVkIG9uIGEgcGFnZSBib3VuZHJ5ICovCiAJaWYgKHVubGlrZWx5KCFQTUVNX0lTX1BBR0VfQUxJR05FRChyZWdpb24tPm9mZnNldCkgfHwKQEAgLTEwNTMsNyArMTA1Myw3IEBACiAKIHN0YXRpYyB2b2lkIHBtZW1fZ2V0X3NpemUoc3RydWN0IHBtZW1fcmVnaW9uICpyZWdpb24sIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCBpZCA9IGdldF9pZChmaWxlKTsKIAogCWlmICghaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJCQkJcmVnaW9uLm9mZnNldCA9IDA7CiAJCQkJcmVnaW9uLmxlbiA9IDA7CiAJCQl9IGVsc2UgewotCQkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCQlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCQkJCXJlZ2lvbi5vZmZzZXQgPSBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpOwogCQkJCXJlZ2lvbi5sZW4gPSBwbWVtX2xlbihpZCwgZGF0YSk7CiAJCQl9CkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWdpb24sICh2b2lkIF9fdXNlciAqKWFyZywKIAkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCWRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCQlyZXR1cm4gcG1lbV9yZW1hcCgmcmVnaW9uLCBmaWxlLCBQTUVNX01BUCk7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMTA5LDcgKzExMDksNyBAQAogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWdpb24sICh2b2lkIF9fdXNlciAqKWFyZywKIAkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCWRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCQlyZXR1cm4gcG1lbV9yZW1hcCgmcmVnaW9uLCBmaWxlLCBQTUVNX1VOTUFQKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMTM5LDcgKzExMzksNyBAQAogCQl7CiAJCQlpZiAoaGFzX2FsbG9jYXRpb24oZmlsZSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCQkJZGF0YS0+aW5kZXggPSBwbWVtX2FsbG9jYXRlKGlkLCBhcmcpOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzMjkzYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWNvbmZpZyBEVDMxNTUKLQl0cmlzdGF0ZSAiRFQzMTU1IERpZ2l0aXplciBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZmMjFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLW9iai0kKENPTkZJR19EVDMxNTUpCSs9IGR0MzE1NS5vCi1kdDMxNTUtb2JqcyA6PQlcCi0JCWR0MzE1NV9kcnYubwlcCi0JCWR0MzE1NV9pc3IubwlcCi0JCWR0MzE1NV9pby5vCVwKLQkJYWxsb2NhdG9yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhYTNiNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UT0RPOgotCS0gZml4IGNoZWNrcGF0Y2gucGwgaXNzdWVzCi0JLSByZW1vdmUgb2xkIGtlcm5lbCBzdXBwb3J0LCBpdCBpcyBub3QgbmVlZGVkCi0JLSBjb252ZXJ0IHRvIHByb3BlciBQQ0kgZGV2aWNlIEFQSQotCS0gZml4IHNwYXJzZSB3YXJuaW5ncwotCS0gYXVkaXQgZm9yIGNvcnJlY3Qgc3Vic3lzdGVtIGludGVyYWN0aW9uCi0JLSByZXZpZXcgcmV2aWV3IHJldmlldyEKLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgotYW5kIFNjb3R0IFNtZWRsZXkgPHNzQGFhby5nb3YuYXU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2FsbG9jYXRvci5SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2FsbG9jYXRvci5SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NzAwYjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NS9hbGxvY2F0b3IuUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotCi1UaGUgYWxsb2NhdG9yIHNob3duIGhlcmUgIGV4cGxvaXRzIGhpZ2ggbWVtb3J5LiBUaGlzIGRvY3VtZW50IGV4cGxhaW5zCi1ob3cgIGEgdXNlciBjYW4gIGRlYWwgICB3aXRoIGRyaXZlcnMgdXNlcyAgIHRoaXMgIGFsbG9jYXRvciBhbmQgaG93ICBhCi1wcm9ncmFtbWVyIGNhbiBsaW5rIGluIHRoZSBtb2R1bGUuCi0KLVRoZSBtb2R1bGUgaXMgYmVpbmcgdXNlZCBieSBteSBweGMgYW5kIHB4ZHJ2IGRldmljZSBkcml2ZXJzIChhcyB3ZWxsIGFzCi1vdGhlciBvbmVzKSwgYXZhaWxhYmxlIGZyb20gZnRwLnN5c3RlbXkuaXQvcHViL2RldmVsb3AgYW5kCi1mdHAubGludXguaXQvcHViL1Blb3BsZS9SdWJpbmkKLQotCVVzZXIncyBtYW51YWwKLQk9PT09PT09PT09PT09Ci0KLQotT25lIG9mIHRoZSBtb3N0IGNvbXBlbGxpbmcgcHJvYmxlbXMgd2l0aCBhbnkgRE1BLWNhcGFibGUgZGV2aWNlIGlzIHRoZQotYWxsb2NhdGlvbiAgb2YgYSBzdWl0YWJsZSAgbWVtb3J5IGJ1ZmZlci4gVGhlICJhbGxvY2F0b3IiIG1vZHVsZSB0cmllcwotdG8gZGVhbCB3aXRoICB0aGUgcHJvYmxlbSBpbiAgYSBjbGVhbiB3YXkuICBUaGUgbW9kdWxlIGlzICBhYmxlIHRvIHVzZQotaGlnaCAgIG1lbW9yeSAgKGFib3ZlIHRoZSAgb25lICAgdXNlZCBpbiAgbm9ybWFsICAgb3BlcmF0aW9uKSAgZm9yIERNQQotYWxsb2NhdGlvbi4KLQotVG8gcHJldmVudCAgdGhlICBrZXJuZWwgZm9yIHVzaW5nICAgaGlnaCBtZW1vcnksICBzbyAgdGhhdCBpdCAgcmVtYWlucwotYXZhaWxhYmxlIGZvciAgRE1BLCB5b3Ugc2hvdWxkICBwYXNzIGEgIGNvbW1hbmQgIGxpbmUgYXJndW1lbnQgdG8gIHRoZQota2VybmVsLiAgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyAgY2FuIGJlIHBhc3NlZCB0byAgTGlsbywgdG8gTG9hZGxpbiBvcgotdG8gd2hpY2hldmVyIGxvYWRlciAgeW91IGFyZSB1c2luZyAgKHVubGVzcyBpdCdzIHZlcnkgcG9vciBpbiBkZXNpZ24pLgotRm9yIExpbG8sIGVpdGhlciB1c2UgICJhcHBlbmQ9IiBpbiAgL2V0Yy9saWxvLmNvbmYgb3IgYWRkICBjb21tYW5kbGluZQotYXJndW1lbnRzIHRvIHRoZSAgaW50ZXJhY3RpdmUgcHJvbXB0LiBGb3IgIGV4YW1wbGUsIEkgaGF2ZSBhIDMyTUIgIGJveAotYW5kIHJlc2VydmUgdHdvIG1lZ3MgZm9yIERNQToKLQotSW4gbGlsby5jb25mOgotCWltYWdlID0gL3pJbWFnZQotCWxhYmVsID0gbGludXgKLQlhcHBlbmQgPSAibWVtPTMwTSIKLQotT3IsIGludGVyYWN0aXZlbHk6Ci0JTElMTzogbGludXggbWVtPTMwTQotCi1PbmNlICB0aGUga2VybmVsIGlzIGJvb3RlZCAgd2l0aCB0aGUgIHJpZ2h0IGNvbW1hbmQtbGluZSBhcmd1bWVudCwgYW55Ci1kcml2ZXIgIGxpbmtlZCAgIHdpdGggIHRoZSAgYWxsb2NhdG9yICAgbW9kdWxlICB3aWxsICBiZSBhYmxlICAgdG8gZ2V0Ci1ETUEtY2FwYWJsZSBtZW1vcnkgd2l0aG91dCAgbXVjaCAgdHJvdWJsZSAodW5sZXNzIHRoZSAgdmFyaW91cyBkcml2ZXJzCi1uZWVkIG1vcmUgbWVtb3J5IHRoYW4gYXZhaWxhYmxlKS4KLQotVGhlIG1vZHVsZSBpbXBsZW1lbnRzIGFuIGFsbG9jL2ZyZWUgIG1lY2hhbmlzbSwgIHNvIHRoYXQgaXQgY2FuICBzZXJ2ZQotbXVsdGlwbGUgZHJpdmVycyAgYXQgdGhlICBzYW1lIHRpbWUuIE5vdGUgIGhvd2V2ZXIgdGhhdCAgdGhlIGFsbG9jYXRvcgotdXNlcyBhbGwgb2YgIGhpZ2ggbWVtb3J5IGFuZCBhc3N1bWVzIHRvICBiZSB0aGUgb25seSBwaWVjZSBvZiBzb2Z0d2FyZQotdXNpbmcgc3VjaCBtZW1vcnkuCi0KLQotCVByb2dyYW1tZXIncyBtYW51YWwKLQk9PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBhbGxvY2F0b3IsICBhcyAgcmVsZWFzZWQsIGlzIGRlc2lnbmVkICB0byAgYmUgbGlua2VkICB0byAgYSBkZXZpY2UKLWRyaXZlci4gIEluIHRoaXMgIGNhc2UsIHRoZSBkcml2ZXIgIG11c3QgY2FsbCBhbGxvY2F0b3JfaW5pdCgpICBiZWZvcmUKLXVzaW5nICAgdGhlICBhbGxvY2F0b3IgICBhbmQgIG11c3QgIGNhbGwgICBhbGxvY2F0b3JfY2xlYW51cCgpICBiZWZvcmUKLXVubG9hZGluZy4gIFRoaXMgaXMgIHVzdWFsbHkgIGRvbmUgICBmcm9tIHdpdGhpbiAgaW5pdF9tb2R1bGUoKSAgICBhbmQKLWNsZWFudXBfbW9kdWxlKCkuIElmIHRoZSBhbGxvY2F0b3IgaXMgbGlua2VkIHRvICBhIGRyaXZlciwgaXQgd29uJ3QgYmUKLXBvc3NpYmxlIGZvciBzZXZlcmFsIGRyaXZlcnMgdG8gYWxsb2NhdGUgaGlnaCBETUEgbWVtb3J5LCBhcyBleHBsYWluZWQKLWFib3ZlLgotCi1JdCBpcyBwb3NzaWJsZSwgb24gdGhlIG90aGVyIGhhbmQsIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBhIHN0YW5kYWxvbmUKLW1vZHVsZSwgc28gdGhhdCBzZXZlcmFsIG1vZHVsZXMgY2FuIHJlbHkgb24gdGhlIGFsbG9jYXRvciBmb3IgdGhleSBETUEKLWJ1ZmZlcnMuIFRvIGNvbXBpbGUgdGhlIGFsbG9jYXRvciBhcyBhIHN0YW5kYWxvbmUgbW9kdWxlLCBkbyB0aGUKLWZvbGxvd2luZyBpbiB0aGlzIGRpcmVjdG9yeSAob3IgcHJvdmlkZSBhIHN1aXRhYmxlIE1ha2VmaWxlLCBvciBlZGl0Ci10aGUgc291cmNlIGNvZGUpOgotCi0JbWFrZSBhbGxvY2F0b3IubyBDQz0iZ2NjIC1EYWxsb2NhdG9yX2luaXQ9aW5pdF9tb2R1bGUgLURhbGxvY2F0b3JfY2xlYW51cD1jbGVhbnVwX21vZHVsZSAtaW5jbHVkZSAvdXNyL2luY2x1ZGUvbGludXgvbW9kdWxlLmgiCi0KLVRoZSBwcmV2aW91cyBjb21tYW5kbGluZSAgdGVsbHMgICB0byBpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4gIGluICB0aGUKLWZpcnN0IHBsYWNlLCAgYW5kIHRvIHJlbmFtZSB0aGUgaW5pdCAgYW5kIGNsZWFudXAgZnVuY3Rpb24gdG8gdGhlIG9uZXMKLW5lZWRlZCBmb3IgIG1vZHVsZSBsb2FkaW5nIGFuZCAgdW5sb2FkaW5nLiAgRHJpdmVycyB1c2luZyBhIHN0YW5kYWxvbmUKLWFsbG9jYXRvciB3b24ndCBuZWVkIHRvIGNhbGwgYWxsb2NhdG9yX2luaXQoKSBub3IgYWxsb2NhdG9yX2NsZWFudXAoKS4KLQotVGhlIGFsbG9jYXRvciBleHBvcnRzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIChkZWNsYXJlZCBpbiBhbGxvY2F0b3IuaCk6Ci0KLSAgIHVuc2lnbmVkIGxvbmcgYWxsb2NhdG9yX2FsbG9jYXRlX2RtYSAodW5zaWduZWQgbG9uZyBraWxvYnl0ZXMsCi0JCQkJCSBpbnQgcHJpb3JpdHkpOwotCi0JVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGh5c2ljYWwgYWRkcmVzcywgb3ZlciBoaWdoX21lbW9yeSwKLQl3aGljaCBjb3JyZXNwb25kcyB0byBhbiBhcmVhIG9mIGF0IGxlYXN0ICJraWxvYnl0ZXMiIGtpbG9ieXRlcy4KLQlUaGUgYXJlYSB3aWxsIGJlIG93bmVkIGJ5IHRoZSBtb2R1bGUgY2FsbGluZyB0aGUgZnVuY3Rpb24uCi0JVGhlIHJldHVybmVkIGFkZHJlc3MgY2FuIGJlIHBhc3NlZCB0byBkZXZpY2UgYm9hcmRzLCB0byBpbnN0cnVjdAotCXRoZWlyIERNQSBjb250cm9sbGVycywgdmlhIHBoeXNfdG9fYnVzKCkuIFRoZSBhZGRyZXNzIGNhbiBiZSB1c2VkCi0JYnkgQyBjb2RlIGFmdGVyIHZyZW1hcCgpL2lvcmVtYXAoKS4gVGhlICJwcmlvcml0eSIgYXJndW1lbnQgc2hvdWxkCi0JYmUgR0ZQX0tFUk5FTCBvciBHRlBfQVRPTUlDLCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRleHQgb2YgdGhlCi0JY2FsbGVyOyBpdCBpcyB1c2VkIHRvIGNhbGwga21hbGxvYygpLCBhcyB0aGUgYWxsb2NhdG9yIG11c3Qga2VlcAotCXRyYWNrIG9mIGFueSByZWdpb24gaXQgZ2l2ZXMgYXdheS4gSW4gY2FzZSBvZiBlcnJvciB0aGUgZnVuY3Rpb24KLQlyZXR1cm5zIDAsIGFuZCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGlzc3VlIGEgLUVOT01FTSBlcnJvci4KLQotCi0gICB2b2lkIGFsbG9jYXRvcl9mcmVlX2RtYSAodW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKLQotCVRoaXMgZnVuY3Rpb24gaXMgdGhlIHJldmVyc2Ugb2YgdGhlIHByZXZpb3VzIG9uZS4gSWYgYSBkcml2ZXIKLQlkb2Vzbid0IGZyZWUgdGhlIERNQSBtZW1vcnkgaXQgYWxsb2NhdGVkLCB0aGUgYWxsb2NhdG9yIHdpbGwKLQljb25zaWRlciBzdWNoIG1lbW9yeSBhcyBidXN5LiBOb3RlLCBob3dldmVyLCB0aGF0Ci0JYWxsb2NhdG9yX2NsZWFudXAoKSBjYWxscyBrZnJlZSgpIG9uIGV2ZXJ5IHJlZ2lvbiBpdCByZWNsYWltZWQsCi0Jc28gdGhhdCBhIGRyaXZlciB3aXRoIHRoZSBhbGxvY2F0b3IgbGlua2VkIGluIGNhbiBhdm9pZCBjYWxsaW5nCi0JYWxsb2NhdG9yX2ZyZWVfZG1hKCkgYXQgdW5sb2FkIHRpbWUuCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2FsbG9jYXRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2R0MzE1NS9hbGxvY2F0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzOTQ3Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2FsbG9jYXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0gKiBhbGxvY2F0b3IuYyAtLSBhbGxvY2F0ZSBhZnRlciBoaWdoX21lbW9yeSwgaWYgYXZhaWxhYmxlCi0gKgotICogTk9URTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBteSBwcmV2aW91cyBhbGxvY2F0b3IsIHRoZSBvbmUgdGhhdAotICogICAgICAgYXNzZW1ibGVzIHBhZ2VzLCB3aGljaCByZXZlYWxlZCBpdHNlbGYgYm90aCBzbG93IGFuZCB1bnJlbGlhYmxlLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCAgIHJ1YmluaUBsaW51eC5pdCAoQWxlc3NhbmRybyBSdWJpbmkpCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLQotLS0gQ2hhbmdlcyAtLQotCi0gIERhdGUJICAgICAgUHJvZ3JhbW1lciAgRGVzY3JpcHRpb24gb2YgY2hhbmdlcyBtYWRlCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgMDItQXVnLTIwMDIgTkpDICAgICAgICAgYWxsb2NhdG9yIG5vdyBzdGVwcyBpbiAxTUIgaW5jcmVtZW50cywgcmF0aGVyCi0JCQkgIHRoYW4gZG91YmxpbmcgaXRzIHNpemUgZWFjaCB0aW1lLgotCQkJICBBbHNvLCBhbGxvY2F0b3JfaW5pdCh1MzIgKikgbm93IHJldHVybnMKLQkJCSAgKGluIHRoZSBmaXJzdCBhcmcpIHRoZSBzaXplIG9mIHRoZSBmcmVlCi0JCQkgIHNwYWNlLiAgVGhpcyBpcyBubyBsb25nZXIgY29uc2lzdGVudCB3aXRoCi0JCQkgIHVzaW5nIHRoZSBhbGxvY2F0b3IgYXMgYSBtb2R1bGUsIGFuZCBzb21lIGNoYW5nZXMKLQkJCSAgbWF5IGJlIG5lY2Vzc2FyeSBmb3IgdGhhdCBwdXJwb3NlLiAgVGhpcyB3YXMKLQkJCSAgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBEVDMxNTUgZHJpdmVyLCBpbgotCQkJICBzdGFuZCBhbG9uZSBtb2RlIG9ubHkhISEKLSAgMjYtT2N0LTIwMDkgU1MJICBQb3J0IHRvIDIuNi4zMCBrZXJuZWwuCi0gKi8KLQotCi0jaWZuZGVmIF9fS0VSTkVMX18KLSMgIGRlZmluZSBfX0tFUk5FTF9fCi0jZW5kaWYKLSNpZm5kZWYgTU9EVUxFCi0jICBkZWZpbmUgTU9EVUxFCi0jZW5kaWYKLQotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4JLyogUEFHRV9BTElHTigpICovCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0jaW5jbHVkZSAiYWxsb2NhdG9yLmgiCi0KLS8qI2RlZmluZSBBTExfREVCVUcqLwotI2RlZmluZSBBTExfTVNHICJhbGxvY2F0b3I6ICIKLQotI3VuZGVmIFBERUJVRyAgICAgICAgICAgICAvKiB1bmRlZiBpdCwganVzdCBpbiBjYXNlICovCi0jaWZkZWYgQUxMX0RFQlVHCi0jICBkZWZpbmUgX19zdGF0aWMKLSMgIGRlZmluZSBEVU1QX0xJU1QoKSBkdW1wX2xpc3QoKQotIyAgaWZkZWYgX19LRVJORUxfXwotICAgICAvKiBUaGlzIG9uZSBpZiBkZWJ1Z2dpbmcgaXMgb24sIGFuZCBrZXJuZWwgc3BhY2UgKi8KLSMgICAgZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIEFMTF9NU0cgZm10LCAjIyBhcmdzKQotIyAgZWxzZQotICAgICAvKiBUaGlzIG9uZSBmb3IgdXNlciBzcGFjZSAqLwotIyAgICBkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgYXJncykKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pIC8qIG5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KLSMgIGRlZmluZSBEVU1QX0xJU1QoKQotIyAgZGVmaW5lIF9fc3RhdGljIHN0YXRpYwotI2VuZGlmCi0KLSN1bmRlZiBQREVCVUdHCi0jZGVmaW5lIFBERUJVR0coZm10LCBhcmdzLi4uKQotLyojZGVmaW5lIFBERUJVR0coZm10LCBhcmdzLi4uKSBwcmludGsoIEtFUk5fREVCVUcgQUxMX01TRyBmbXQsICMjIGFyZ3MpKi8KLQotCi1zdGF0aWMgaW50IGFsbG9jYXRvcl9oaW1lbSA9IDE7IC8qIDAgPSBwcm9iZSwgcG9zLiA9IG1lZ3MsIG5lZy4gPSBkaXNhYmxlICAgKi8KLXN0YXRpYyBpbnQgYWxsb2NhdG9yX3N0ZXAgPSAxOyAgLyogVGhpcyBpcyB0aGUgc3RlcCBzaXplIGluIE1CICAgICAgICAgICAgICAqLwotc3RhdGljIGludCBhbGxvY2F0b3JfcHJvYmUgPSAxOyAvKiBUaGlzIGlzIGEgZmxhZyAtLSAxPXByb2JlLCAwPWRvbid0IHByb2JlICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jYXRvcl9idWZmZXI7CQkvKiBwaHlzaWNhbCBhZGRyZXNzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY2F0b3JfYnVmZmVyX3NpemU7CS8qIGtpbG9ieXRlcyAqLwotCi0vKgotICogVGhlIGFsbG9jYXRvciBrZWVwcyBhIGxpc3Qgb2YgRE1BIGFyZWFzLCBzbyBtdWx0aXBsZSBkZXZpY2VzCi0gKiBjYW4gY29leGlzdC4gVGhlIGxpc3QgaXMga2VwdCBzb3J0ZWQgYnkgYWRkcmVzcwotICovCi0KLXN0cnVjdCBhbGxvY2F0b3Jfc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXN0cnVjdCBhbGxvY2F0b3Jfc3RydWN0ICpuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBhbGxvY2F0b3Jfc3RydWN0ICphbGxvY2F0b3JfbGlzdDsKLQotI2lmZGVmIEFMTF9ERUJVRwotc3RhdGljIGludCBkdW1wX2xpc3Qodm9pZCkKLXsKLQlzdHJ1Y3QgYWxsb2NhdG9yX3N0cnVjdCAqcHRyOwotCi0JUERFQlVHKCJDdXJyZW50IGxpc3Q6XG4iKTsKLQlmb3IgKHB0ciA9IGFsbG9jYXRvcl9saXN0OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKLQkJUERFQlVHKCIweCUwOGx4IChzaXplICVsaWtCKVxuIiwgcHRyLT5hZGRyZXNzLCBwdHItPnNpemU+PjEwKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGFjdHVhbCBhbGxvY2F0b3IuCi0gKgotICogSWYgc3BhY2UgaXMgYXZhaWxhYmxlIGluIGhpZ2ggbWVtb3J5IChhcyBkZXRlY3RlZCBhdCBsb2FkIHRpbWUpLCB0aGF0Ci0gKiBvbmUgaXMgcmV0dXJuZWQuIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwaHlzaWNhbCBhZGRyZXNzIChpLmUuLCBpdCBjYW4KLSAqIGJlIHVzZWQgc3RyYWlnaHQgYWhlYWQgZm9yIERNQSwgYnV0IG5lZWRzIHJlbWFwcGluZyBmb3IgcHJvZ3JhbSB1c2UpLgotICovCi0KLXVuc2lnbmVkIGxvbmcgYWxsb2NhdG9yX2FsbG9jYXRlX2RtYSh1bnNpZ25lZCBsb25nIGtpbG9ieXRlcywgZ2ZwX3QgZmxhZ3MpCi17Ci0Jc3RydWN0IGFsbG9jYXRvcl9zdHJ1Y3QgKnB0ciA9IGFsbG9jYXRvcl9saXN0LCAqbmV3cHRyOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBraWxvYnl0ZXMgPDwgMTA7Ci0KLQkvKiBjaGVjayBpZiBoaWdoIG1lbW9yeSBpcyBhdmFpbGFibGUgKi8KLQlpZiAoIWFsbG9jYXRvcl9idWZmZXIpCi0JCXJldHVybiAwOwotCi0JLyogUm91bmQgaXQgdG8gYSBtdWx0aXBsZSBvZiB0aGUgcGFnZXNpemUgKi8KLQlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOwotCVBERUJVRygicmVxdWVzdCBmb3IgJWxpIGJ5dGVzXG4iLCBieXRlcyk7Ci0KLQl3aGlsZSAocHRyICYmIHB0ci0+bmV4dCkgewotCQlpZiAocHRyLT5uZXh0LT5hZGRyZXNzIC0gKHB0ci0+YWRkcmVzcyArIHB0ci0+c2l6ZSkgPj0gYnl0ZXMpCi0JCQlicmVhazsgLyogZW5vdWdoIHNwYWNlICovCi0JCXB0ciA9IHB0ci0+bmV4dDsKLQl9Ci0JaWYgKCFwdHItPm5leHQpIHsKLQkJRFVNUF9MSVNUKCk7Ci0JCVBERUJVRygiYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7IC8qIGVuZCBvZiBsaXN0ICovCi0JfQotCW5ld3B0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGxvY2F0b3Jfc3RydWN0KSwgZmxhZ3MpOwotCWlmICghbmV3cHRyKQotCQlyZXR1cm4gMDsKLQotCS8qIG9rLCBub3cgc3RpY2sgaXQgYWZ0ZXIgcHRyICovCi0JbmV3cHRyLT5hZGRyZXNzID0gcHRyLT5hZGRyZXNzICsgcHRyLT5zaXplOwotCW5ld3B0ci0+c2l6ZSA9IGJ5dGVzOwotCW5ld3B0ci0+bmV4dCA9IHB0ci0+bmV4dDsKLQlwdHItPm5leHQgPSBuZXdwdHI7Ci0KLQlEVU1QX0xJU1QoKTsKLQlQREVCVUcoInJldHVybmluZyAweCUwOGx4XG4iLCBuZXdwdHItPmFkZHJlc3MpOwotCXJldHVybiBuZXdwdHItPmFkZHJlc3M7Ci19Ci0KLWludCBhbGxvY2F0b3JfZnJlZV9kbWEodW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXN0cnVjdCBhbGxvY2F0b3Jfc3RydWN0ICpwdHIgPSBhbGxvY2F0b3JfbGlzdCwgKnByZXY7Ci0KLQl3aGlsZSAocHRyICYmIHB0ci0+bmV4dCkgewotCQlpZiAocHRyLT5uZXh0LT5hZGRyZXNzID09IGFkZHJlc3MpCi0JCQlicmVhazsKLQkJcHRyID0gcHRyLT5uZXh0OwotCX0KLQkvKiB0aGUgb25lIGJlaW5nIGZyZWVkIGlzIHB0ci0+bmV4dCAqLwotCXByZXYgPSBwdHI7IHB0ciA9IHB0ci0+bmV4dDsKLQotCWlmICghcHRyKSB7Ci0JCXByX2VycihBTExfTVNHICJmcmVlX2RtYSBidXQgYWRkLiBub3QgYWxsb2NhdGVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCVBERUJVR0coImZyZWVpbmc6ICUwOGx4ICglbGkpIG5leHQgJTA4bHhcbiIsIHB0ci0+YWRkcmVzcywgcHRyLT5zaXplLAotCQlwdHItPm5leHQtPmFkZHJlc3MpOwotCXByZXYtPm5leHQgPSBwdHItPm5leHQ7Ci0Ja2ZyZWUocHRyKTsKLQotCS8qIGR1bXBfbGlzdCgpOyAqLwotCXJldHVybiAwOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluaXQgYW5kIGNsZWFudXAKLSAqCi0gKiBPbiBjbGVhbnVwIGV2ZXJ5dGhpbmcgaXMgcmVsZWFzZWQuIElmIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSwgdGhhdCBhCi0gKiBwcm9ibGVtIG9mIG91ciBjbGllbnRzCi0gKi8KLWludCBhbGxvY2F0b3JfaW5pdCh1MzIgKmFsbG9jYXRvcl9tYXgpCi17Ci0JLyogY2hlY2sgaG93IG11Y2ggZnJlZSBtZW1vcnkgaXMgdGhlcmUgKi8KLQl2b2lkICpyZW1hcHBlZDsKLQl1bnNpZ25lZCBsb25nIG1heDsKLQl1bnNpZ25lZCBsb25nIHRyaWFsX3NpemUgPSBhbGxvY2F0b3JfaGltZW08PDIwOwotCXVuc2lnbmVkIGxvbmcgbGFzdF90cmlhbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGVwID0gYWxsb2NhdG9yX3N0ZXA8PDIwOwotCXVuc2lnbmVkIGxvbmcgaSA9IDA7Ci0Jc3RydWN0IGFsbG9jYXRvcl9zdHJ1Y3QgKmhlYWQsICp0YWlsOwotCWNoYXIgdGVzdF9zdHJpbmdbXSA9ICIwMTIzNDU2Nzg5YWJjZGUiOyAvKiAxNiBieXRlcyAqLwotCi0JUERFQlVHRygiaGltZW0gPSAlaVxuIiwgYWxsb2NhdG9yX2hpbWVtKTsKLQlpZiAoYWxsb2NhdG9yX2hpbWVtIDwgMCkgLyogZG9uJ3QgZXZlbiB0cnkgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXRyaWFsX3NpemUpCi0JCXRyaWFsX3NpemUgPSAxPDwyMDsgLyogbm90IHNwZWNpZmllZDogdHJ5IG9uZSBtZWcgKi8KLQotCXdoaWxlICgxKSB7Ci0JCXJlbWFwcGVkID0gaW9yZW1hcChfX3BhKGhpZ2hfbWVtb3J5KSwgdHJpYWxfc2l6ZSk7Ci0JCWlmICghcmVtYXBwZWQpIHsKLQkJCVBERUJVR0coIiVsaSBtZWdzIGZhaWxlZCFcbiIsIHRyaWFsX3NpemU+PjIwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCVBERUJVR0coIlRyeWluZyAlbGkgbWVncyAoYXQgJXAsICVwKVxuIiwgdHJpYWxfc2l6ZT4+MjAsCi0JCQkodm9pZCAqKV9fcGEoaGlnaF9tZW1vcnkpLCByZW1hcHBlZCk7Ci0JCWZvciAoaSA9IGxhc3RfdHJpYWw7IGkgPCB0cmlhbF9zaXplOyBpICs9IDE2KSB7Ci0JCQlzdHJjcHkoKGNoYXIgKikocmVtYXBwZWQpK2ksIHRlc3Rfc3RyaW5nKTsKLQkJCWlmIChzdHJjbXAoKGNoYXIgKikocmVtYXBwZWQpK2ksIHRlc3Rfc3RyaW5nKSkKLQkJCQlicmVhazsKLQkJCX0KLQkJaW91bm1hcCgodm9pZCAqKXJlbWFwcGVkKTsKLQkJc2NoZWR1bGUoKTsKLQkJbGFzdF90cmlhbCA9IHRyaWFsX3NpemU7Ci0JCWlmIChpID09IHRyaWFsX3NpemUpCi0JCQl0cmlhbF9zaXplICs9IHN0ZXA7IC8qIGluY3JlbWVudCwgaWYgYWxsIHdlbnQgd2VsbCAqLwotCQllbHNlIHsKLQkJCVBERUJVR0coIiVsaSBtZWdzIGNvcHkgdGVzdCBmYWlsZWQhXG4iLCB0cmlhbF9zaXplPj4yMCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIWFsbG9jYXRvcl9wcm9iZSkKLQkJCWJyZWFrOwotCX0KLQlQREVCVUcoIiVsaSBtZWdzICglbGkgaywgJWxpIGIpXG4iLCBpPj4yMCwgaT4+MTAsIGkpOwotCWFsbG9jYXRvcl9idWZmZXJfc2l6ZSA9IGk+PjEwOyAvKiBraWxvYnl0ZXMgKi8KLQlhbGxvY2F0b3JfYnVmZmVyID0gX19wYShoaWdoX21lbW9yeSk7Ci0JaWYgKCFhbGxvY2F0b3JfYnVmZmVyX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBBTExfTVNHICJubyBmcmVlIGhpZ2ggbWVtb3J5IHRvIHVzZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qCi0JKiB0byBzaW1wbGlmeSB0aGluZ3MsIGFsd2F5cyBoYXZlIHR3byBjZWxscyBpbiB0aGUgbGlzdDoKLQkqIHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QuIFRoaXMgYXZvaWRzIHNvbWUgY29uZGl0aW9uYWxzIGFuZAotCSogZXh0cmEgY29kZSB3aGVuIGFsbG9jYXRpbmcgYW5kIGRlYWxsb2NhdGluZzogd2Ugb25seSBwbGF5Ci0JKiBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsaXN0Ci0JKi8KLQloZWFkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFsbG9jYXRvcl9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhlYWQpCi0JCXJldHVybiAtRU5PTUVNOwotCXRhaWwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxsb2NhdG9yX3N0cnVjdCksIEdGUF9LRVJORUwpOwotCWlmICghdGFpbCkgewotCQlrZnJlZShoZWFkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWF4ID0gYWxsb2NhdG9yX2J1ZmZlcl9zaXplPDwxMDsKLQotCWhlYWQtPnNpemUgPSB0YWlsLT5zaXplID0gMDsKLQloZWFkLT5hZGRyZXNzID0gYWxsb2NhdG9yX2J1ZmZlcjsKLQl0YWlsLT5hZGRyZXNzID0gYWxsb2NhdG9yX2J1ZmZlciArIG1heDsKLQloZWFkLT5uZXh0ID0gdGFpbDsKLQl0YWlsLT5uZXh0ID0gTlVMTDsKLQlhbGxvY2F0b3JfbGlzdCA9IGhlYWQ7Ci0KLQkvKiBCYWNrIHRvIHRoZSB1c2VyIGNvZGUsIGluIEtCICovCi0JKmFsbG9jYXRvcl9tYXggPSBhbGxvY2F0b3JfYnVmZmVyX3NpemU7Ci0KLQlyZXR1cm4gMDsgLyogb2ssIHJlYWR5ICovCi19Ci0KLXZvaWQgYWxsb2NhdG9yX2NsZWFudXAodm9pZCkKLXsKLQlzdHJ1Y3QgYWxsb2NhdG9yX3N0cnVjdCAqcHRyLCAqbmV4dDsKLQotCWZvciAocHRyID0gYWxsb2NhdG9yX2xpc3Q7IHB0cjsgcHRyID0gbmV4dCkgewotCQluZXh0ID0gcHRyLT5uZXh0OwotCQlQREVCVUcoImZyZWVpbmcgbGlzdDogMHglMDhseFxuIiwgcHRyLT5hZGRyZXNzKTsKLQkJa2ZyZWUocHRyKTsKLQl9Ci0KLQlhbGxvY2F0b3JfYnVmZmVyICAgICAgPSAwOwotCWFsbG9jYXRvcl9idWZmZXJfc2l6ZSA9IDA7Ci0JYWxsb2NhdG9yX2xpc3QgPSBOVUxMOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvYWxsb2NhdG9yLmggYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2FsbG9jYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjViNzBmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvYWxsb2NhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogYWxsb2NhdG9yLmggLS0gcHJvdG90eXBlcyBmb3IgYWxsb2NhdGluZyBoaWdoIG1lbW9yeQotICoKLSAqIE5PVEU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gbXkgcHJldmlvdXMgYWxsb2NhdG9yLCB0aGUgb25lIHRoYXQKLSAqICAgICAgIGFzc2VtYmxlcyBwYWdlcywgd2hpY2ggcmV2ZWFsZWQgaXRzZWxmIGJvdGggc2xvdyBhbmQgdW5yZWxpYWJsZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggICBydWJpbmlAbGludXguaXQgKEFsZXNzYW5kcm8gUnViaW5pKQotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKi8KLQotaW50IGFsbG9jYXRvcl9mcmVlX2RtYSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwotdW5zaWduZWQgbG9uZyBhbGxvY2F0b3JfYWxsb2NhdGVfZG1hKHVuc2lnbmVkIGxvbmcga2lsb2J5dGVzLCBnZnBfdCBmbGFncyk7Ci1pbnQgYWxsb2NhdG9yX2luaXQodTMyICopOwotdm9pZCBhbGxvY2F0b3JfY2xlYW51cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1LmggYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTNlMmZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IDE5OTYsMjAwMiwyMDA1IEdyZWdvcnkgRC4gSGFnZXIsIEFsZnJlZCBBLiBSaXp6aSwgTm9haCBKLiBDb3dhbiwKLQkJCSBKYXNvbiBMYXBlbnRhLCBTY290dCBTbWVkbGV5Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBEVDMxNTUgRGV2aWNlIERyaXZlci4KLQotVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci1hbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotTUEgMDIxMTEtMTMwNyBVU0EKLQotLS0gQ2hhbmdlcyAtLQotCi0gIERhdGUgICAgIFByb2dyYW1tZXIgIERlc2NyaXB0aW9uIG9mIGNoYW5nZXMgbWFkZQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIDAzLUp1bC0yMDAwIEpNTCAgICAgbi9hCi0gIDEwLU9jdC0yMDAxIFNTICAgICAgcG9ydCB0byAyLjQga2VybmVsLgotICAyNC1KdWwtMjAwMiBTUyAgICAgIHJlbW92ZSB1bnVzZWQgY29kZSAmIGFkZGVkIEdQTCBsaWNlbmNlLgotICAwNS1BdWctMjAwNSBTUyAgICAgIHBvcnQgdG8gMi42IGtlcm5lbDsgbWFrZSBDQ0lSIG1vZGUgZGVmYXVsdC4KLQotKi8KLQotI2lmbmRlZiBfRFQzMTU1X0lOQwotI2RlZmluZSBfRFQzMTU1X0lOQwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+CQkvKiBzdHJ1Y3QgdGltZXZhbCAqLwotCi0KLS8qIFVuY29tbWVudCB0aGlzIGZvciA1MEh6IENDSVIgKi8KLSNkZWZpbmUgQ0NJUiAxCi0KLS8qIENhbiBiZSAxIG9yIDIgKi8KLSNkZWZpbmUgTUFYQk9BUkRTIDEKLQotI2RlZmluZSBCT0FSRF9NQVhfQlVGRlMJMwotI2RlZmluZSBNQVhCVUZGRVJTCShCT0FSRF9NQVhfQlVGRlMqTUFYQk9BUkRTKQotCi0jZGVmaW5lIFBDSV9QQUdFX1NJWkUJKDEgPDwgMTIpCi0KLSNpZmRlZiBDQ0lSCi0jZGVmaW5lIERUMzE1NV9NQVhfUk9XUwk1NzYKLSNkZWZpbmUgRFQzMTU1X01BWF9DT0xTCTc2OAotI2RlZmluZSBGT1JNQVQ1MEhaCTEKLSNlbHNlCi0jZGVmaW5lIERUMzE1NV9NQVhfUk9XUwk0ODAKLSNkZWZpbmUgRFQzMTU1X01BWF9DT0xTCTY0MAotI2RlZmluZSBGT1JNQVQ1MEhaCTAKLSNlbmRpZgotCi0vKiBDb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwotc3RydWN0IGR0MzE1NV9jb25maWcgewotCXUzMiBhY3FfbW9kZTsKLQl1MzIgY29scywgcm93czsKLQl1MzIgY29udGludW91czsKLX07Ci0KLQotLyogaG9sZCBkYXRhIGZvciBlYWNoIGZyYW1lICovCi1zdHJ1Y3QgZnJhbWVfaW5mbyB7Ci0JdTMyIGFkZHI7CQkvKiBhZGRyZXNzIG9mIHRoZSBidWZmZXIgd2l0aCB0aGUgZnJhbWUgKi8KLQl1MzIgdGFnOwkJLyogdW5pcXVlIG51bWJlciBmb3IgdGhlIGZyYW1lICovCi0Jc3RydWN0IHRpbWV2YWwgdGltZTsJLyogdGltZSB0aGF0IGNhcHR1cmUgdG9vayBwbGFjZSAqLwotfTsKLQotLyoKLSAqIFN0cnVjdHVyZSBmb3IgaW50ZXJydXB0IGFuZCBidWZmZXIgaGFuZGxpbmcuCi0gKiBUaGlzIGlzIHRoZSBzZXR1cCBmb3IgMSBjYXJkCi0gKi8KLXN0cnVjdCBkdDMxNTVfZmJ1ZmZlciB7Ci0JaW50ICAgIG5idWZmZXJzOwotCi0Jc3RydWN0IGZyYW1lX2luZm8gZnJhbWVfaW5mb1tCT0FSRF9NQVhfQlVGRlNdOwotCi0JaW50IGVtcHR5X2J1ZmZlcnNbQk9BUkRfTUFYX0JVRkZTXTsJLyogaW5kZXhlcyBlbXB0eSBmcmFtZXMgKi8KLQlpbnQgZW1wdHlfbGVuOwkJCQkvKiBOdW1iZXIgb2YgZW1wdHkgYnVmZmVycyAqLwotCQkJCQkJLyogWmVybyBtZWFucyBlbXB0eSAqLwotCi0JaW50IGFjdGl2ZV9idWY7CQkJLyogV2hlcmUgZGF0YSBpcyBjdXJyZW50bHkgZG1hJ2luZyAqLwotCWludCBsb2NrZWRfYnVmOwkJCS8qIEJ1ZmZlcnMgdXNlZCBieSB1c2VyICovCi0KLQlpbnQgcmVhZHlfcXVlW0JPQVJEX01BWF9CVUZGU107Ci0JdTMyIHJlYWR5X2hlYWQ7CS8qIFRoZSBtb3N0IHJlY2VudCBidWZmZXIgbG9jYXRlZCBoZXJlICovCi0JdTMyIHJlYWR5X2xlbjsJLyogVGhlIG51bWJlciBvZiByZWFkeSBidWZmZXJzICovCi0KLQlpbnQgZXZlbl9oYXBwZW5lZDsKLQlpbnQgZXZlbl9zdG9wcGVkOwotCi0JaW50IHN0b3BfYWNxdWlyZTsJLyogRmxhZyB0byBzdG9wIGludGVycnVwdHMgKi8KLQl1MzIgZnJhbWVfY291bnQ7CS8qIENvdW50ZXIgZm9yIGZyYW1lcyBhY3F1aXJlZCBieSB0aGlzIGNhcmQgKi8KLX07Ci0KLQotCi0jZGVmaW5lIERUMzE1NV9NT0RFX0ZSQU1FCTEKLSNkZWZpbmUgRFQzMTU1X01PREVfRklFTEQJMgotCi0jZGVmaW5lIERUMzE1NV9TTkFQCQkxCi0jZGVmaW5lIERUMzE1NV9BQ1EJCTIKLQotLyogVGhlcmUgaXMgb25lIHN0YXR1cyBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2FyZC4gKi8KLXN0cnVjdCBkdDMxNTVfc3RhdHVzIHsKLQlpbnQgZml4ZWRfbW9kZTsJCS8qIGlmIDEsIHdlIGFyZSBpbiBmaXhlZCBmcmFtZSBtb2RlICovCi0JdTMyIHJlZ19hZGRyOwkvKiBSZWdpc3RlciBhZGRyZXNzIGZvciBhIHNpbmdsZSBjYXJkICovCi0JdTMyIG1lbV9hZGRyOwkvKiBCdWZmZXIgc3RhcnQgYWRkciBmb3IgdGhpcyBjYXJkICovCi0JdTMyIG1lbV9zaXplOwkvKiBUaGlzIGlzIHRoZSBhbW91bnQgb2YgbWVtIGF2YWlsYWJsZSAgKi8KLQl1MzIgaXJxOwkJLyogdGhpcyBjYXJkJ3MgaXJxICovCi0Jc3RydWN0IGR0MzE1NV9jb25maWcgY29uZmlnOwkJLyogY29uZmlndXJhdGlvbiBzdHJ1Y3QgKi8KLQlzdHJ1Y3QgZHQzMTU1X2ZidWZmZXIgZmJ1ZmZlcjsJLyogZnJhbWUgYnVmZmVyIHN0YXRlIHN0cnVjdCAqLwotCXUzMiBzdGF0ZTsJCS8qIHRoaXMgY2FyZCdzIHN0YXRlICovCi0JdTMyIGRldmljZV9pbnN0YWxsZWQ7CS8qIEZsYWcgaWYgaW5zdGFsbGVkLiAxPWluc3RhbGxlZCAqLwotfTsKLQotLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBzdGF0dXMgc3RydWN0dXJlICovCi1leHRlcm4gc3RydWN0IGR0MzE1NV9zdGF0dXMgZHQzMTU1X3N0YXR1c1tNQVhCT0FSRFNdOwotCi0jZGVmaW5lIERUMzE1NV9TVEFURV9JRExFCTB4MDAKLSNkZWZpbmUgRFQzMTU1X1NUQVRFX0ZSQU1FCTB4MDEKLSNkZWZpbmUgRFQzMTU1X1NUQVRFX0ZMRAkweDAyCi0jZGVmaW5lIERUMzE1NV9TVEFURV9TVE9QCTB4MTAwCi0jZGVmaW5lIERUMzE1NV9TVEFURV9FUlJPUgkweDIwMAotI2RlZmluZSBEVDMxNTVfU1RBVEVfTU9ERQkweDBmZgotCi0jZGVmaW5lIERUMzE1NV9JT0NfTUFHSUMJJyEnCi0KLSNkZWZpbmUgRFQzMTU1X1NFVF9DT05GSUcJX0lPVyhEVDMxNTVfSU9DX01BR0lDLCAxLCBzdHJ1Y3QgZHQzMTU1X2NvbmZpZykKLSNkZWZpbmUgRFQzMTU1X0dFVF9DT05GSUcJX0lPUihEVDMxNTVfSU9DX01BR0lDLCAyLCBzdHJ1Y3QgZHQzMTU1X3N0YXR1cykKLSNkZWZpbmUgRFQzMTU1X1NUT1AJCV9JTyhEVDMxNTVfSU9DX01BR0lDLCAzKQotI2RlZmluZSBEVDMxNTVfU1RBUlQJCV9JTyhEVDMxNTVfSU9DX01BR0lDLCA0KQotI2RlZmluZSBEVDMxNTVfRkxVU0gJCV9JTyhEVDMxNTVfSU9DX01BR0lDLCA1KQotI2RlZmluZSBEVDMxNTVfSU9DX01BWE5SCTUKLQotLyogRXJyb3IgY29kZXMgKi8KLQotI2RlZmluZSBEVF9FUlJfTk9fQlVGRkVSUwkweDEwMDAwCS8qIG5vdCB1c2VkIGJ1dCBpdCBtaWdodCBiZSBvbmUgZGF5ICovCi0jZGVmaW5lIERUX0VSUl9DT1JSVVBUCQkweDIwMDAwCi0jZGVmaW5lIERUX0VSUl9PVkVSUlVOCQkweDMwMDAwCi0jZGVmaW5lIERUX0VSUl9JMkNfVElNRU9VVAkweDQwMDAwCi0jZGVmaW5lIERUX0VSUl9NQVNLCQkweGZmMDAwMC8qIG5vdCB1c2VkIGJ1dCBpdCBtaWdodCBiZSBvbmUgZGF5ICovCi0KLS8qIFVzZXIgY29kZSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gZGVjbGFyZSBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggY2FyZCAqLwotc3RydWN0IGR0MzE1NV9yZWFkIHsKLQl1MzIgb2Zmc2V0OwotCXUzMiBmcmFtZV9zZXE7Ci0JdTMyIHN0YXRlOwotCi0Jc3RydWN0IGZyYW1lX2luZm8gZnJhbWVfaW5mbzsKLX07Ci0KLSNlbmRpZiAvKiBfRFQzMTU1X2luYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NS9kdDMxNTUuc3lzdmluaXQgYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NS5zeXN2aW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlYzA5My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NS5zeXN2aW5pdAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMKLSMgTW9kdWxlIGxvYWQvdW5sb2FkIHNjcmlwdCBmb3IgdXNlIHdpdGggU3lzVi1zdHlsZSAvZXRjL2luaXQuZC8gc3lzdGVtcy4KLSMgT24gYSBEZWJpYW4gc3lzdGVtLCBjb3B5IHRoaXMgdG8gL2V0Yy9pbml0LmQvZHQzMTU1IGFuZCB0aGVuIHJ1bgotIyAJL3Vzci9zYmluL3VwZGF0ZS1yYy5kIGR0MzE1NSBkZWZhdWx0cyA1NQotIyB0byBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIC9ldGMvcmM/LmQvW1NLXTU1ZHQzMTU1IHN0YXJ0L3N0b3AgbGlua3MuCi0jIChUaGUgIjU1IiBpcyBhcmJpdHJhcnkgYnV0IGlzIHdoYXQgSSB1c2UgdG8gbG9hZCB0aGlzIHJhdGhlciBsYXRlLikKLSMKLSMgICAgQW5keSBEb3VnaGVydHkgICBGZWIgMjIgMjAwMAlkb3VnaGVyYUBsYWZheWV0dGUuZWR1Ci0jICAgIERlcHQuIG9mIFBoeXNpY3MKLSMgICAgTGFmYXlldHRlIENvbGxlZ2UsIEVhc3RvbiBQQSAxODA0MgotIwotCi1QQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2Jpbjovc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbgotCi0jIEVkaXQgdG8gcG9pbnQgdG8geW91ciBsb2NhbCBjb3B5LgotRklMRT0vdXNyL2xvY2FsL2xpYi9tb2R1bGVzL2R0MzE1NS9kdDMxNTUubwotTkFNRT0iZHQzMTU1IgotREVTQz0iZHQzMTU1IEZyYW1lIEdyYWJiZXIgbW9kdWxlIgotREVWPSJkdDMxNTUiCi0KLWlmIHRlc3QgISAtZiAkRklMRTsgdGhlbgotICAgIGVjaG8gIlVuYWJsZSB0byBsb2NhdGUgJEZJTEUiCi0gICAgZXhpdCAwCi1maQotCi1zZXQgLWUKLQotY2FzZSAiJDEiIGluCi0gIHN0YXJ0KQotICAgIGVjaG8gLW4gIkxvYWRpbmcgJERFU0MgIgotICAgIGlmIC9zYmluL2luc21vZCAtdiAtZiAkRklMRTsgdGhlbgotCW1ham9yPWBncmVwICRERVYgL3Byb2MvZGV2aWNlcyB8IGF3ayAie3ByaW50IFxcJDF9ImAKLQlybSAtZiAvZGV2L2R0MzE1NT8KLQlta25vZCAvZGV2L2R0MzE1NWEgYyAkbWFqb3IgMAotCW1rbm9kIC9kZXYvZHQzMTU1YiBjICRtYWpvciAxCi0JY2htb2QgZ28rcncgL2Rldi9kdDMxNTU/Ci0JZWNobwotICAgIGVsc2UKLQllY2hvICIkRklMRSBub3QgbG9hZGVkLiIKLSAgICBmaQotICAgIDs7Ci0gIHN0b3ApCi0gICAgZWNobyAtbiAiVW5sb2FkaW5nICRERVNDOiAiCi0gICAgaWYgL3NiaW4vcm1tb2QgJE5BTUUgOyB0aGVuCi0JZWNobwotICAgIGVsc2UKLQllY2hvICIkREVWIG5vdCByZW1vdmVkIgotCWV4aXQgMAotICAgIGZpCi0gICAgcm0gLWYgL2Rldi9kdDMxNTU/Ci0gICAgOzsKLSAgKikKLSAgICBlY2hvICJVc2FnZTogL2V0Yy9pbml0LmQvJE5BTUUge3N0YXJ0fHN0b3B9IgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMAotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NV9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2Rydi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGVmOTdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2Rydi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5OSArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgMTk5NiwyMDAyLDIwMDUgR3JlZ29yeSBELiBIYWdlciwgQWxmcmVkIEEuIFJpenppLCBOb2FoIEouIENvd2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIEphc29uIExhcGVudGEsIFNjb3R0IFNtZWRsZXksIEdyZWcgU2hhcnAKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyLgotCi1UaGUgRFQzMTU1IERldmljZSBEcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLWFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgRFQzMTU1IERldmljZSBEcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi11c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci1vZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgRFQzMTU1IERldmljZSBEcml2ZXI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi1NQSAwMjExMS0xMzA3IFVTQQotCi0tLSBDaGFuZ2VzIC0tCi0KLSAgRGF0ZSAgICAgUHJvZ3JhbW1lcglEZXNjcmlwdGlvbiBvZiBjaGFuZ2VzIG1hZGUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAwMy1KdWwtMjAwMCBKTUwgICAgICAgbi9hCi0gIDEwLU9jdC0yMDAxIFNTICAgICAgICBwb3J0IHRvIDIuNCBrZXJuZWwKLSAgMDItQXByLTIwMDIgU1MgICAgICAgIE1vZHMgdG8gdXNlIGFsbG9jYXRvciBhcyBhIHN0YW5kYWxvbmUgbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVyZ2VkIEpvaG4gUm9sbCdzIGNoYW5nZXMgKGpvaG5AY2ZhLmhhcnZhcmQuZWR1KQotICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSB3b3JrIHdpdGggbXVsdGlwbGUgYm9hcmRzLgotICAwMi1KdWwtMjAwMiBTUyAgICAgICAgTWVyZ2VkIEphbWVzIFJvc2UncyBjaGFnZXMgKHJvc2VqckBwdXJkdWUuZWR1KSB0bzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpeCBzdWNjZXNzaXZlIGludGVycnVwdC1kcml2ZW4gY2FwdHVyZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZCBzZWxlY3QvcG9sbCBzdXBwb3J0LgotICAxMC1KdWwtMjAwMiBHQ1MgICAgICAgQWRkIGVycm9yIGNoZWNrIHdoZW4gbmRldmljZXMgPiBNQVhCT0FSRFMuCi0gIDAyLUF1Zy0yMDAyIEdDUyAgICAgICBGaXggZmllbGQgbW9kZSBzbyB0aGF0IG9kZCAobG93ZXIpIGZpZWxkIGlzIHN0b3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgaW4gbG93ZXIgaGFsZiBvZiBidWZmZXIuCi0gIDA1LUF1Zy0yMDA1IFNTICAgICAgICBwb3J0IHRvIDIuNiBrZXJuZWwuCi0gIDI2LU9jdC0yMDA5IFNTCXBvcnQgdG8gMi42LjMwIGtlcm5lbC4KLQotLS0gTm90ZXMgLS0KLQotKiogYXBwZW5kZWQgIm1lbT0xMjQiIGluIGxpbG8uY29uZiB0byBhbGxvdyBmb3IgNG1lZ3MgZnJlZSBvbiBteSAxMjhtZWcgc3lzdGVtLgotICogdXNpbmcgYWxsb2NhdG9yLmMgYW5kIGFsbG9jYXRvci5oIGZyb20gbydyZWlsbHkgYm9vayAoYWxlc3NhbmRybyBydWJpbmkpCi0gICAgZnRwOi8vZnRwLnN5c3RlbXkuaXQvcHViL2RldmVsb3AgKHNlZSBSRUFETUUuYWxsb2NhdG9yKQotCi0gKyBtaWdodCB3YW50IHRvIGdldCByaWQgb2YgTUFYYm9hcmRzIGZvciBhbGxvY2F0aW5nIGluaXRpYWwgYnVmZmVyLgotICAgIGNvbmZ1c2luZyBhbmQgbm90IG5lY2Vzc2FyeQotCi0gKyBpbiBjbGVhbnVwX21vZHVsZSB0aGUgTU9EX0lOX1VTRSBsb29rcyBsaWtlIGl0IGlzIGNoZWNrIGFmdGVyIGl0IHNob3VsZAotCi0gKiBHRlBfRE1BIHNob3VsZCBub3QgYmUgc2V0IHdpdGggYSBQQ0kgc3lzdGVtIChwZyAyOTEpCi0KLSAtIE5KQyB3aHkgYXJlIG9ubHkgdHdvIGJ1ZmZlcnMgYWxsb3dlZD8gKHNlZSBpc3IsIGFwcHJveCBsaW5lIDM1OCkKLQotKi8KLQotZXh0ZXJuIHZvaWQgcHJpbnRxdWVzKGludCk7Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiZHQzMTU1LmgiCi0jaW5jbHVkZSAiZHQzMTU1X2Rydi5oIgotI2luY2x1ZGUgImR0MzE1NV9pc3IuaCIKLSNpbmNsdWRlICJkdDMxNTVfaW8uaCIKLSNpbmNsdWRlICJhbGxvY2F0b3IuaCIKLQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qIEVycm9yIHZhcmlhYmxlLiAgWmVybyBtZWFucyBubyBlcnJvci4gKi8KLWludCBkdDMxNTVfZXJybm8gPSAwOwotCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfNzExNgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzcxMTYgMHgxMjIzCi0jZW5kaWYKLQotI2RlZmluZSBEVDMxNTVfVkVORE9SSUQgICAgUENJX1ZFTkRPUl9JRF9JTlRFTAotI2RlZmluZSBEVDMxNTVfREVWSUNFSUQgICAgUENJX0RFVklDRV9JRF9JTlRFTF83MTE2Ci0jZGVmaW5lIE1BWFBDSSAgICAxNgotCi0jaWZkZWYgRFRfREVCVUcKLSNkZWZpbmUgRFRfMzE1NV9ERUJVR19NU0coeCx5KSBwcmludGsoeCx5KQotI2Vsc2UKLSNkZWZpbmUgRFRfMzE1NV9ERUJVR19NU0coeCx5KQotI2VuZGlmCi0KLS8qIHdhaXQgcXVldWUgZm9yIGludGVycnVwdHMgKi8KLXdhaXRfcXVldWVfaGVhZF90IGR0MzE1NV9yZWFkX3dhaXRfcXVldWVbTUFYQk9BUkRTXTsKLQotI2RlZmluZSBEVF8zMTU1X1NVQ0NFU1MgMAotI2RlZmluZSBEVF8zMTU1X0ZBSUxVUkUgLUVJTwotCi0vKiBzZXQgdG8gZHluYW1pY2FseSBhbGxvY2F0ZSwgYnV0IGl0IGlzIHR1bmFibGU6ICovCi0vKiBpbnNtb2QgRFRfMzE1NSBkdDMxNTUgZHQzMTU1X21ham9yPVhYICovCi1pbnQgZHQzMTU1X21ham9yID0gMDsKLQotLyogVGhlIG1pbm9yIG51bWJlcnMgYXJlIDAgYW5kIDEgLi4uIHRoZXkgYXJlIG5vdCB0dW5hYmxlLgotICogVGhleSBhcmUgdXNlZCBhcyB0aGUgaW5kaWNlcyBmb3IgdGhlIHN0cnVjdHVyZSB2ZWN0b3JzLAotICogYW5kIHJlZ2lzdGVyIGFkZHJlc3MgdmVjdG9ycwotICovCi0KLS8qIEdsb2JhbCBzdHJ1Y3R1cmVzIGFuZCB2YXJpYWJsZXMgKi8KLQotLyogU3RhdHVzIG9mIGVhY2ggZGV2aWNlICovCi1zdHJ1Y3QgZHQzMTU1X3N0YXR1cyBkdDMxNTVfc3RhdHVzW01BWEJPQVJEU107Ci0KLS8qIGtlcm5lbCBsb2dpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvYXJkICovCi11OCAqZHQzMTU1X2xiYXNlW01BWEJPQVJEU10gPSB7IE5VTEwKLSNpZiBNQVhCT0FSRFMgPT0gMgotCQkJCSAgICAgICwgTlVMTAotI2VuZGlmCi19OwotLyogRFQzMTU1IHJlZ2lzdGVycyAgICAgICAgICAgICAgKi8KLXU4ICpkdDMxNTVfYmJhc2UgPSBOVUxMOwkJICAvKiBrZXJuZWwgbG9naWNhbCBhZGRyZXNzIG9mIHRoZSAqCi0JCQkJCSAgICogYnVmZmVyIHJlZ2lvbiAgICAgICAgICAgICAgICAgKi8KLXUzMiAgZHQzMTU1X2Rldl9vcGVuW01BWEJPQVJEU10gPSB7MAotI2lmIE1BWEJPQVJEUyA9PSAyCi0JCQkJICAgICAgICwgMAotI2VuZGlmCi19OwotCi11MzIgIG5kZXZpY2VzID0gMDsKLXUzMiB1bmlxdWVfdGFnID0gMDs7Ci0KLQotLyoKLSAqIFN0b3BzIGludGVycnVwdCBnZW5lcmF0aW9uIHJpZ2h0IGF3YXkgYW5kIHJlc2V0cyB0aGUgc3RhdHVzCi0gKiB0byBpZGxlLiAgSSBkb24ndCBrbm93IHdoeSB0aGlzIHdvcmtzIGFuZCB0aGUgb3RoZXIgd2F5IGRvZXNuJ3QuCi0gKiAoSmFtZXMgUm9zZSkKLSAqLwotc3RhdGljIHZvaWQgcXVpY2tfc3RvcCAoaW50IG1pbm9yKQotewotICAvLyBUT0RPOiBzY290dCB3YXMgaGVyZQotI2lmIDEKLSAgUmVhZE1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBJTlRfQ1NSKSwgaW50X2Nzcl9yLnJlZyk7Ci0gIC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotICBpbnRfY3NyX3IuZmxkLkZMRF9FTkRfRVZFX0VOID0gMDsKLSAgaW50X2Nzcl9yLmZsZC5GTERfRU5EX09ERF9FTiA9IDA7Ci0gIFdyaXRlTVJlZygoZHQzMTU1X2xiYXNlW21pbm9yXSArIElOVF9DU1IpLCBpbnRfY3NyX3IucmVnKTsKLQotICBkdDMxNTVfc3RhdHVzW21pbm9yXS5zdGF0ZSAmPSB+KERUMzE1NV9TVEFURV9TVE9QfDB4ZmYpOwotICAvKiBtYXJrIHRoZSBzeXN0ZW0gc3RvcHBlZDogKi8KLSAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgfD0gRFQzMTU1X1NUQVRFX0lETEU7Ci0gIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+c3RvcF9hY3F1aXJlID0gMDsKLSAgZHQzMTU1X2ZidWZmZXJbbWlub3JdLT5ldmVuX3N0b3BwZWQgPSAwOwotI2Vsc2UKLSAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgfD0gRFQzMTU1X1NUQVRFX1NUT1A7Ci0gIGR0MzE1NV9zdGF0dXNbbWlub3JdLmZidWZmZXIuc3RvcF9hY3F1aXJlID0gMTsKLSNlbmRpZgotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgZHQzMTU1X2lzcigpIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpZW4KLSAqCi0gKiAtIGxvb2tzIGxpa2UgdGhpcyBpc3Igc3VwcG9ydHMgSVJRIHNoYXJpbmcgKG9yIGNvdWxkKSBKTUwKLSAqIC0gQXNzdW1lcyBpcnEncyBhcmUgZGlzYWJsZWQsIHZpYSBTQV9JTlRFUlJVUFQgZmxhZwotICogYmVpbmcgc2V0IGluIHJlcXVlc3RfaXJxKCkgY2FsbCBmcm9tIGluaXRfbW9kdWxlKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGR0MzE1NV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLSAgaW50ICAgIG1pbm9yID0gLTE7Ci0gIGludCAgICBpbmRleDsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgdTMyIGJ1ZmZlcl9hZGRyOwotCi0gIC8qIGZpbmQgb3V0IHdobyBpc3N1ZWQgdGhlIGludGVycnVwdCAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuZGV2aWNlczsgaW5kZXgrKykgewotICAgIGlmKGRldl9pZCA9PSAodm9pZCopICZkdDMxNTVfc3RhdHVzW2luZGV4XSkKLSAgICAgIHsKLQltaW5vciA9IGluZGV4OwotCWJyZWFrOwotICAgICAgfQotICB9Ci0KLSAgLyogaG9wZWZ1bGx5IHdlIHNob3VsZCBub3QgZ2V0IGhlcmUgKi8KLSAgaWYgKG1pbm9yIDwgMCB8fCBtaW5vciA+PSBNQVhCT0FSRFMpIHsKLSAgICBwcmludGsoS0VSTl9FUlIgImR0MzE1NV9pc3IgY2FsbGVkIHdpdGggaW52YWxpZCBkZXZfaWRcbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIENoZWNrIGZvciBjb3JydXB0aW9uIGFuZCBzZXQgYSBmbGFnIGlmIHNvICovCi0gIFJlYWRNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgQ1NSMSksIGNzcjFfci5yZWcpOwotCi0gIGlmICgoY3NyMV9yLmZsZC5GTERfQ1JQVF9FVkUpIHx8IChjc3IxX3IuZmxkLkZMRF9DUlBUX09ERCkpCi0gICAgewotICAgICAgLyogVE9ETzogdGhpcyBzaG91bGQgcHJvYmFibHkgc3RvcCBhY3F1aXNpdGlvbiAqLwotICAgICAgLyogYW5kIHNldCBzb21lIGZsYWdzIHNvIHRoYXQgZHQzMTU1X3JlYWQgICAgICAqLwotICAgICAgLyogcmV0dXJucyBhbiBlcnJvciBuZXh0IHRpbWUgaXQgaXMgY2FsbGVkICAgICAqLwotICAgICAgZHQzMTU1X2Vycm5vID0gRFRfRVJSX0NPUlJVUFQ7Ci0gICAgICBwcmludGsoImR0MzE1NTogIGNvcnJ1cHQgZmllbGRcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBSZWFkTVJlZygoZHQzMTU1X2xiYXNlW21pbm9yXSArIElOVF9DU1IpLCBpbnRfY3NyX3IucmVnKTsKLQotICAvKiBIYW5kbGUgdGhlIGV2ZW4gZmllbGQgLi4uICovCi0gIGlmIChpbnRfY3NyX3IuZmxkLkZMRF9FTkRfRVZFKQotICAgIHsKLSAgICAgIGlmICgoZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgJiBEVDMxNTVfU1RBVEVfTU9ERSkgPT0KLQkgICBEVDMxNTVfU1RBVEVfRkxEKQotCXsKLQkgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+ZnJhbWVfY291bnQrKzsKLQl9Ci0KLSAgICAgIFJlYWRJMkMoZHQzMTU1X2xiYXNlW21pbm9yXSwgRVZFTl9DU1IsICZpMmNfZXZlbl9jc3IucmVnKTsKLQotICAgICAgLyogQ2xlYXIgdGhlIGludGVycnVwdD8gKi8KLSAgICAgIGludF9jc3Jfci5mbGQuRkxEX0VORF9FVkUgPSAxOwotCi0gICAgICAvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgaWYgbGFzdCBmaWVsZCAqLwotICAgICAgaWYgKGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+c3RvcF9hY3F1aXJlKQotCXsKLQkgIHByaW50aygiZHQzMTU1OiAgZXZlbiBzdG9wcGVkLlxuIik7Ci0JICBkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPmV2ZW5fc3RvcHBlZCA9IDE7Ci0JICBpZiAoaTJjX2V2ZW5fY3NyLmZsZC5TTkdMX0VWRSkKLQkgICAgewotCSAgICAgIGludF9jc3Jfci5mbGQuRkxEX0VORF9FVkVfRU4gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpMmNfZXZlbl9jc3IuZmxkLlNOR0xfRVZFICA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIFdyaXRlTVJlZygoZHQzMTU1X2xiYXNlW21pbm9yXSArIElOVF9DU1IpLCBpbnRfY3NyX3IucmVnKTsKLQotICAgICAgLyogU2V0IHVwIG5leHQgRE1BIGlmIHdlIGFyZSBkb2luZyBGSUVMRFMgKi8KLSAgICAgIGlmICgoZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgJiBEVDMxNTVfU1RBVEVfTU9ERSkgPT0KLQkgICBEVDMxNTVfU1RBVEVfRkxEKQotCXsKLQkgIC8qIEdDUyAoQXVnIDIsIDIwMDIpIC0tIEluIGZpZWxkIG1vZGUsIGRtYSB0aGUgb2RkIGZpZWxkCi0JICAgICBpbnRvIHRoZSBsb3dlciBoYWxmIG9mIHRoZSBidWZmZXIgKi8KLQkgIGNvbnN0IHUzMiBzdHJpZGUgPSAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uY29uZmlnLmNvbHM7Ci0JICBidWZmZXJfYWRkciA9IGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+Ci0JICAgIGZyYW1lX2luZm9bZHQzMTU1X2ZidWZmZXJbbWlub3JdLT5hY3RpdmVfYnVmXS5hZGRyCi0JICAgICsgKERUMzE1NV9NQVhfUk9XUyAvIDIpICogc3RyaWRlOwotCSAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JICBsb2NhbF9pcnFfZGlzYWJsZSgpOwotCSAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkdDMxNTVfcmVhZF93YWl0X3F1ZXVlW21pbm9yXSk7Ci0KLQkgIC8qIFNldCB1cCB0aGUgRE1BIGFkZHJlc3MgZm9yIHRoZSBuZXh0IGZpZWxkICovCi0JICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JICBXcml0ZU1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBPRERfRE1BX1NUQVJUKSwgYnVmZmVyX2FkZHIpOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KLSAgICAgIGkyY19ldmVuX2Nzci5mbGQuRE9ORV9FVkUgPSAxOwotICAgICAgaWYgKGkyY19ldmVuX2Nzci5mbGQuRVJST1JfRVZFKQotCWR0MzE1NV9lcnJubyA9IERUX0VSUl9PVkVSUlVOOwotCi0gICAgICBXcml0ZUkyQyhkdDMxNTVfbGJhc2VbbWlub3JdLCBFVkVOX0NTUiwgaTJjX2V2ZW5fY3NyLnJlZyk7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBzYXcgYW4gZXZlbiBmaWVsZCBtZWFuaW5nICAqLwotICAgICAgLyogdGhhdCBzdWJzZXF1ZW50IG9kZCBmaWVsZCBjb21wbGV0ZSB0aGUgZnJhbWUgICAgICovCi0gICAgICBkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPmV2ZW5faGFwcGVuZWQgPSAxOwotCi0gICAgICAvKiByZWNvcmRpbmcgdGhlIHRpbWUgdGhhdCB0aGUgZXZlbiBmaWVsZCBmaW5pc2hlZCwgdGhpcyBzaG91bGQgYmUgKi8KLSAgICAgIC8qIGFib3V0IHRpbWUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZnJhbWUgKi8KLSAgICAgIGRvX2dldHRpbWVvZmRheSgmKGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+Ci0JCQkgZnJhbWVfaW5mb1tkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPgotCQkJCSAgICAgYWN0aXZlX2J1Zl0udGltZSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiAuLi4gbm93IGhhbmRsZSB0aGUgb2RkIGZpZWxkICovCi0gIGlmIChpbnRfY3NyX3IuZmxkLkZMRF9FTkRfT0REKQotICAgIHsKLSAgICAgIFJlYWRJMkMoZHQzMTU1X2xiYXNlW21pbm9yXSwgT0REX0NTUiwgJmkyY19vZGRfY3NyLnJlZyk7Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQ/ICovCi0gICAgICBpbnRfY3NyX3IuZmxkLkZMRF9FTkRfT0REID0gMTsKLQotICAgICAgaWYgKGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+ZXZlbl9oYXBwZW5lZCB8fAotCSAgKGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlICYgRFQzMTU1X1NUQVRFX01PREUpID09Ci0JICBEVDMxNTVfU1RBVEVfRkxEKQotCXsKLQkgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+ZnJhbWVfY291bnQrKzsKLQl9Ci0KLSAgICAgIGlmIChkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPnN0b3BfYWNxdWlyZSAmJgotCSAgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+ZXZlbl9zdG9wcGVkKQotCXsKLQkgIHByaW50ayhLRVJOX0RFQlVHICJkdDMxNTU6ICBzdG9wcGluZyBvZGQuLlxuIik7Ci0JICBpZiAoaTJjX29kZF9jc3IuZmxkLlNOR0xfT0REKQotCSAgICB7Ci0JICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JICAgICAgaW50X2Nzcl9yLmZsZC5GTERfRU5EX09ERF9FTiA9IDA7Ci0JICAgICAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgJj0gfihEVDMxNTVfU1RBVEVfU1RPUHwweGZmKTsKLQotCSAgICAgIC8qIG1hcmsgdGhlIHN5c3RlbSBzdG9wcGVkOiAqLwotCSAgICAgIGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlIHw9IERUMzE1NV9TVEFURV9JRExFOwotCSAgICAgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+c3RvcF9hY3F1aXJlID0gMDsKLQkgICAgICBkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPmV2ZW5fc3RvcHBlZCA9IDA7Ci0KLQkgICAgICBwcmludGsoS0VSTl9ERUJVRyAiZHQzMTU1OiAgc3RhdGUgaXMgbm93ICV4XG4iLAotCQkgICAgIGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaTJjX29kZF9jc3IuZmxkLlNOR0xfT0REICA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIFdyaXRlTVJlZygoZHQzMTU1X2xiYXNlW21pbm9yXSArIElOVF9DU1IpLCBpbnRfY3NyX3IucmVnKTsKLQotICAgICAgLyogaWYgdGhlIG9kZCBmaWVsZCBoYXMgYmVlbiBhY3F1aXJlZCwgdGhlbiAgICAgKi8KLSAgICAgIC8qIGNoYW5nZSB0aGUgbmV4dCBkbWEgbG9jYXRpb24gZm9yIGJvdGggZmllbGRzICovCi0gICAgICAvKiBhbmQgd2FrZSB1cCB0aGUgcHJvY2VzcyBpZiBzbGVlcGluZyAgICAgICAgICAqLwotICAgICAgaWYgKGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+ZXZlbl9oYXBwZW5lZCB8fAotCSAgIChkdDMxNTVfc3RhdHVzW21pbm9yXS5zdGF0ZSAmIERUMzE1NV9TVEFURV9NT0RFKSA9PQotCSAgIERUMzE1NV9TVEFURV9GTEQpCi0JewotCi0JICBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQkgIGxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLSNpZmRlZiBERUJVR19RVUVTX0IKLQkgIHByaW50cXVlcyhtaW5vcik7Ci0jZW5kaWYKLQkgIGlmIChkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPm5idWZmZXJzID4gMikKLQkgICAgewotCSAgICAgIGlmICghYXJlX2VtcHR5X2J1ZmZlcnMobWlub3IpKQotCQl7Ci0JCSAgLyogVGhlIG51bWJlciBvZiBhY3RpdmUgKyBsb2NrZWQgYnVmZmVycyBpcwotCQkgICAqIGF0IG1vc3QgMiwgYW5kIHNpbmNlIHRoZXJlIGFyZSBub25lIGVtcHR5LCB0aGVyZQotCQkgICAqIG11c3QgYmUgYXQgbGVhc3QgbmJ1ZmZlcnMtMiByZWFkeSBidWZmZXJzLgotCQkgICAqIFRoaXMgaXMgd2hlcmUgd2UgJ2Ryb3AgZnJhbWVzJywgb2xkZXN0IGZpcnN0LiAqLwotCQkgIHB1c2hfZW1wdHkocG9wX3JlYWR5KG1pbm9yKSwgIG1pbm9yKTsKLQkJfQotCi0JICAgICAgLyogVGhlIHJlYWR5X3F1ZSBjYW4ndCBiZSBmdWxsLCBzaW5jZSB3ZSBrbm93Ci0JICAgICAgICogdGhlcmUgaXMgb25lIGFjdGl2ZSBidWZmZXIgcmlnaHQgbm93LCBzbyBpdCdzIHNhZmUKLQkgICAgICAgKiB0byBwdXNoIHRoZSBhY3RpdmUgYnVmIG9uIHRoZSByZWFkeV9xdWUuICovCi0JICAgICAgcHVzaF9yZWFkeShtaW5vciwgZHQzMTU1X2ZidWZmZXJbbWlub3JdLT5hY3RpdmVfYnVmKTsKLQkgICAgICAvKiBUaGVyZSdzIGF0IGxlYXN0IDEgZW1wdHkgLS0gbWFrZSBpdCBhY3RpdmUgKi8KLQkgICAgICBkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPmFjdGl2ZV9idWYgPSBwb3BfZW1wdHkobWlub3IpOwotCSAgICAgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+Ci0JCWZyYW1lX2luZm9bZHQzMTU1X2ZidWZmZXJbbWlub3JdLT4KLQkJCSAgICBhY3RpdmVfYnVmXS50YWcgPSArK3VuaXF1ZV90YWc7Ci0JICAgIH0KLQkgIGVsc2UgLyogbmJ1ZmZlcnMgPT0gMiwgc3BlY2lhbCBjYXNlICovCi0JICAgIHsgLyogVGhlcmUgaXMgMSBhY3RpdmUgYnVmZmVyLgotCSAgICAgICAqIElmIHRoZXJlIGlzIGEgbG9ja2VkIGJ1ZmZlciwga2VlcCB0aGUgYWN0aXZlIGJ1ZmZlcgotCSAgICAgICAqIHRoZSBzYW1lIC0tIHRoYXQgbWVhbnMgd2UgZHJvcCBhIGZyYW1lLgotCSAgICAgICAqLwotCSAgICAgIGlmIChkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPmxvY2tlZF9idWYgPCAwKQotCQl7Ci0JCSAgcHVzaF9yZWFkeShtaW5vciwKLQkJCSAgICAgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+YWN0aXZlX2J1Zik7Ci0JCSAgaWYgKGFyZV9lbXB0eV9idWZmZXJzKG1pbm9yKSkKLQkJICAgIHsKLQkJICAgICAgZHQzMTU1X2ZidWZmZXJbbWlub3JdLT5hY3RpdmVfYnVmID0KLQkJCXBvcF9lbXB0eShtaW5vcik7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgeyAvKiBubyBlbXB0eSBvciBsb2NrZWQgYnVmZmVycywgc28gdXNlIGEgcmVhZHlidWYgKi8KLQkJICAgICAgZHQzMTU1X2ZidWZmZXJbbWlub3JdLT5hY3RpdmVfYnVmID0KLQkJCXBvcF9yZWFkeShtaW5vcik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0jaWZkZWYgREVCVUdfUVVFU19CCi0JICBwcmludHF1ZXMobWlub3IpOwotI2VuZGlmCi0KLQkgIGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+ZXZlbl9oYXBwZW5lZCA9IDA7Ci0KLQkgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmZHQzMTU1X3JlYWRfd2FpdF9xdWV1ZVttaW5vcl0pOwotCi0JICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotCi0KLSAgICAgIC8qIFNldCB1cCB0aGUgRE1BIGFkZHJlc3MgZm9yIHRoZSBuZXh0IGZyYW1lL2ZpZWxkICovCi0gICAgICBidWZmZXJfYWRkciA9IGR0MzE1NV9mYnVmZmVyW21pbm9yXS0+Ci0JZnJhbWVfaW5mb1tkdDMxNTVfZmJ1ZmZlclttaW5vcl0tPmFjdGl2ZV9idWZdLmFkZHI7Ci0gICAgICBpZiAoKGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlICYgRFQzMTU1X1NUQVRFX01PREUpID09Ci0JICAgRFQzMTU1X1NUQVRFX0ZMRCkKLQl7Ci0JICBXcml0ZU1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBFVkVOX0RNQV9TVEFSVCksIGJ1ZmZlcl9hZGRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgRVZFTl9ETUFfU1RBUlQpLCBidWZmZXJfYWRkcik7Ci0KLQkgIFdyaXRlTVJlZygoZHQzMTU1X2xiYXNlW21pbm9yXSArIE9ERF9ETUFfU1RBUlQpLCBidWZmZXJfYWRkcgotCQkgICAgKyBkdDMxNTVfc3RhdHVzW21pbm9yXS5jb25maWcuY29scyk7Ci0JfQotCi0gICAgICAvKiBEbyBlcnJvciBjaGVja2luZyAqLwotICAgICAgaTJjX29kZF9jc3IuZmxkLkRPTkVfT0REID0gMTsKLSAgICAgIGlmIChpMmNfb2RkX2Nzci5mbGQuRVJST1JfT0REKQotCWR0MzE1NV9lcnJubyA9IERUX0VSUl9PVkVSUlVOOwotCi0gICAgICBXcml0ZUkyQyhkdDMxNTVfbGJhc2VbbWlub3JdLCBPRERfQ1NSLCBpMmNfb2RkX2Nzci5yZWcpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIE9kZCBGaWVsZCB3YXNuJ3QgaXQgZWl0aGVyLi4uICovCi0gIHByaW50aygibmVpdGhlciBldmVuIG5vciBvZGQuICBzaGFyZWQgcGVyaGFwcz9cbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGluaXRfaXNyKGludCBtaW5vcikKLSAqICAgdHVybnMgb24gaW50ZXJ1cHQgZ2VuZXJhdGlvbiBmb3IgdGhlIGNhcmQKLSAqICAgZGVzaWduYXRlZCBieSAibWlub3IiLgotICogICBJdCBpcyBjYWxsZWQgKm9ubHkqIGZyb20gaW5zaWRlIGlvY3RsKCkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkdDMxNTVfaW5pdF9pc3IoaW50IG1pbm9yKQotewotICBjb25zdCB1MzIgc3RyaWRlID0gIGR0MzE1NV9zdGF0dXNbbWlub3JdLmNvbmZpZy5jb2xzOwotCi0gIHN3aXRjaCAoZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgJiBEVDMxNTVfU1RBVEVfTU9ERSkKLSAgICB7Ci0gICAgY2FzZSBEVDMxNTVfU1RBVEVfRkxEOgotICAgICAgewotCWV2ZW5fZG1hX3N0YXJ0X3IgID0gZHQzMTU1X3N0YXR1c1ttaW5vcl0uCi0JICBmYnVmZmVyLmZyYW1lX2luZm9bZHQzMTU1X3N0YXR1c1ttaW5vcl0uZmJ1ZmZlci5hY3RpdmVfYnVmXS5hZGRyOwotCWV2ZW5fZG1hX3N0cmlkZV9yID0gMDsKLQlvZGRfZG1hX3N0cmlkZV9yICA9IDA7Ci0KLQlXcml0ZU1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBFVkVOX0RNQV9TVEFSVCksCi0JCSAgZXZlbl9kbWFfc3RhcnRfcik7Ci0JV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgRVZFTl9ETUFfU1RSSURFKSwKLQkJICBldmVuX2RtYV9zdHJpZGVfcik7Ci0JV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgT0REX0RNQV9TVFJJREUpLAotCQkgIG9kZF9kbWFfc3RyaWRlX3IpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBEVDMxNTVfU1RBVEVfRlJBTUU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlldmVuX2RtYV9zdGFydF9yICA9IGR0MzE1NV9zdGF0dXNbbWlub3JdLgotCSAgZmJ1ZmZlci5mcmFtZV9pbmZvW2R0MzE1NV9zdGF0dXNbbWlub3JdLmZidWZmZXIuYWN0aXZlX2J1Zl0uYWRkcjsKLQlvZGRfZG1hX3N0YXJ0X3IgICA9ICBldmVuX2RtYV9zdGFydF9yICsgc3RyaWRlOwotCWV2ZW5fZG1hX3N0cmlkZV9yID0gIHN0cmlkZTsKLQlvZGRfZG1hX3N0cmlkZV9yICA9ICBzdHJpZGU7Ci0KLQlXcml0ZU1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBFVkVOX0RNQV9TVEFSVCksCi0JCSAgZXZlbl9kbWFfc3RhcnRfcik7Ci0JV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgT0REX0RNQV9TVEFSVCksCi0JCSAgb2RkX2RtYV9zdGFydF9yKTsKLQlXcml0ZU1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBFVkVOX0RNQV9TVFJJREUpLAotCQkgIGV2ZW5fZG1hX3N0cmlkZV9yKTsKLQlXcml0ZU1SZWcoKGR0MzE1NV9sYmFzZVttaW5vcl0gKyBPRERfRE1BX1NUUklERSksCi0JCSAgb2RkX2RtYV9zdHJpZGVfcik7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qIDUwLzYwIEh6IHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoaXMgcG9pbnQgYnV0IGxldCdzIG1ha2Ugc3VyZSBpdCBpcyAqLwotICAvKiByaWdodCBhbnl3YXkgKi8KLQotICBSZWFkSTJDKGR0MzE1NV9sYmFzZVttaW5vcl0sIENTUjIsICZpMmNfY3NyMi5yZWcpOwotICBpMmNfY3NyMi5mbGQuSFo1MCA9IEZPUk1BVDUwSFo7Ci0gIFdyaXRlSTJDKGR0MzE1NV9sYmFzZVttaW5vcl0sIENTUjIsIGkyY19jc3IyLnJlZyk7Ci0KLSAgLyogZW5hYmxlIGJ1c21hc3RlciBjaGlwLCBjbGVhciBmbGFncyAqLwotCi0gIC8qCi0gICAqIFRPRE86Ci0gICAqIHNob3VsZG4ndCB3ZSBiZSBjb25jZXJlZCB3aXRoIGNvbnRpbnVvdXMgdmFsdWVzIG9mCi0gICAqIERUMzE1NV9TTkFQICYgRFQzMTU1X0FDUSBoZXJlPyAoU1MpCi0gICAqLwotCi0gIGNzcjFfci5yZWcgICAgICAgICAgICAgICAgPSAwOwotICBjc3IxX3IuZmxkLkNBUF9DT05UX0VWRSAgID0gMTsgLyogdXNlIGNvbnRpbnVvdXMgY2FwdHVyZSBiaXRzIHRvICovCi0gIGNzcjFfci5mbGQuQ0FQX0NPTlRfT0REICAgPSAxOyAvKiBlbmFibGUgKi8KLSAgY3NyMV9yLmZsZC5GTERfRE5fRVZFICAgICA9IDE7IC8qIHdyaXRpbmcgYSAxIGNsZWFycyBmbGFncyAqLwotICBjc3IxX3IuZmxkLkZMRF9ETl9PREQgICAgID0gMTsKLSAgY3NyMV9yLmZsZC5TUlNUICAgICAgICAgICA9IDE7IC8qIHJlc2V0ICAgICAgICAtIG11c3QgYmUgMSAqLwotICBjc3IxX3IuZmxkLkZJRk9fRU4gICAgICAgID0gMTsgLyogZmlmbyBjb250cm9sIC0gbXVzdCBiZSAxICovCi0gIGNzcjFfci5mbGQuRkxEX0NSUFRfRVZFICAgPSAxOyAvKiB3cml0aW5nIGEgMSBjbGVhcnMgZmxhZ3MgKi8KLSAgY3NyMV9yLmZsZC5GTERfQ1JQVF9PREQgICA9IDE7Ci0KLSAgV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgQ1NSMSksY3NyMV9yLnJlZyk7Ci0KLSAgLyogRW5hYmxlIGludGVycnVwdHMgYXQgdGhlIGVuZCBvZiBlYWNoIGZpZWxkICovCi0KLSAgaW50X2Nzcl9yLnJlZyA9IDA7Ci0gIGludF9jc3Jfci5mbGQuRkxEX0VORF9FVkVfRU4gPSAxOwotICBpbnRfY3NyX3IuZmxkLkZMRF9FTkRfT0REX0VOID0gMTsKLSAgaW50X2Nzcl9yLmZsZC5GTERfU1RBUlRfRU4gPSAwOwotCi0gIFdyaXRlTVJlZygoZHQzMTU1X2xiYXNlW21pbm9yXSArIElOVF9DU1IpLCBpbnRfY3NyX3IucmVnKTsKLQotICAvKiBzdGFydCBpbnRlcm5hbCBCVVNZIGJpdHMgKi8KLQotICBSZWFkSTJDKGR0MzE1NV9sYmFzZVttaW5vcl0sIENTUjIsICZpMmNfY3NyMi5yZWcpOwotICBpMmNfY3NyMi5mbGQuQlVTWV9PREQgID0gMTsKLSAgaTJjX2NzcjIuZmxkLkJVU1lfRVZFICA9IDE7Ci0gIFdyaXRlSTJDKGR0MzE1NV9sYmFzZVttaW5vcl0sIENTUjIsIGkyY19jc3IyLnJlZyk7Ci0KLSAgLyogTm93IGl0cyB1cCB0byB0aGUgaW50ZXJydXB0IHJvdXRpbmUhISAqLwotCi0gIHJldHVybjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGlvY3RsKCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGR0MzE1NV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJc3RydWN0IGZpbGUgKmZpbGUsCi0JCQl1bnNpZ25lZCBpbnQgY21kLAotCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0gIGludCBtaW5vciA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOyAvKiBXaGF0IGRldmljZSBhcmUgd2UgaW9jdGwoKSdpbmc/ICovCi0KLSAgaWYgKG1pbm9yID49IE1BWEJPQVJEUyB8fCBtaW5vciA8IDApCi0gICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgLyogbWFrZSBzdXJlIGl0IGlzIHZhbGlkIGNvbW1hbmQgKi8KLSAgaWYgKF9JT0NfTlIoY21kKSA+IERUMzE1NV9JT0NfTUFYTlIpCi0gICAgewotICAgICAgcHJpbnRrKCJEVDMxNTU6IGludmFsaWQgSU9DVEwoMHgleClcbiIsY21kKTsKLSAgICAgIHByaW50aygiRFQzMTU1OiBWYWxpZCBjb21tYW5kcyAoMHgleCksICgweCV4KSwgKDB4JXgpLCAoMHgleCksICgweCV4KVxuIiwKLQkgICAgICh1bnNpZ25lZCBpbnQpRFQzMTU1X0dFVF9DT05GSUcsCi0JICAgICAodW5zaWduZWQgaW50KURUMzE1NV9TRVRfQ09ORklHLAotCSAgICAgKHVuc2lnbmVkIGludClEVDMxNTVfU1RBUlQsCi0JICAgICAodW5zaWduZWQgaW50KURUMzE1NV9TVE9QLAotCSAgICAgKHVuc2lnbmVkIGludClEVDMxNTVfRkxVU0gpOwotICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICBjYXNlIERUMzE1NV9TRVRfQ09ORklHOgotICAgICAgewotCWlmIChkdDMxNTVfc3RhdHVzW21pbm9yXS5zdGF0ZSAhPSBEVDMxNTVfU1RBVEVfSURMRSkKLQkgIHJldHVybiAtRUJVU1k7Ci0KLQl7Ci0JICBzdHJ1Y3QgZHQzMTU1X2NvbmZpZyB0bXA7Ci0JICBpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdG1wLCAodm9pZCAqKSBhcmcsIHNpemVvZih0bXApKSkKLQkgICAgICByZXR1cm4gLUVGQVVMVDsKLQkgIC8qIGNoZWNrIGZvciB2YWxpZCBzZXR0aW5ncyAqLwotCSAgaWYgKHRtcC5yb3dzID4gRFQzMTU1X01BWF9ST1dTIHx8Ci0JICAgICAgdG1wLmNvbHMgPiBEVDMxNTVfTUFYX0NPTFMgfHwKLQkgICAgICAodG1wLmFjcV9tb2RlICE9IERUMzE1NV9NT0RFX0ZSQU1FICYmCi0JICAgICAgIHRtcC5hY3FfbW9kZSAhPSBEVDMxNTVfTU9ERV9GSUVMRCkgfHwKLQkgICAgICAodG1wLmNvbnRpbnVvdXMgIT0gRFQzMTU1X1NOQVAgJiYKLQkgICAgICAgdG1wLmNvbnRpbnVvdXMgIT0gRFQzMTU1X0FDUSkpCi0JICAgIHsKLQkgICAgICByZXR1cm4gLUVJTlZBTDsKLQkgICAgfQotCSAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uY29uZmlnID0gdG1wOwotCX0KLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBjYXNlIERUMzE1NV9HRVRfQ09ORklHOgotICAgICAgewotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAodm9pZCAqKSAmZHQzMTU1X3N0YXR1c1ttaW5vcl0sCi0JCSAgICAgc2l6ZW9mKHN0cnVjdCBkdDMxNTVfc3RhdHVzKSkpCi0JICAgIHJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGNhc2UgRFQzMTU1X0ZMVVNIOiAvKiBGbHVzaGVzIHRoZSBidWZmZXJzIC0tIGVuc3VyZXMgZnJlc2ggZGF0YSAqLwotICAgICAgewotCWlmIChkdDMxNTVfc3RhdHVzW21pbm9yXS5zdGF0ZSAhPSBEVDMxNTVfU1RBVEVfSURMRSkKLQkgIHJldHVybiAtRUJVU1k7Ci0JcmV0dXJuIGR0MzE1NV9mbHVzaChtaW5vcik7Ci0gICAgICB9Ci0gICAgY2FzZSBEVDMxNTVfU1RPUDoKLSAgICAgIHsKLQlpZiAoZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgJiBEVDMxNTVfU1RBVEVfU1RPUCB8fAotCSAgICBkdDMxNTVfc3RhdHVzW21pbm9yXS5mYnVmZmVyLnN0b3BfYWNxdWlyZSkKLQkgIHJldHVybiAtRUJVU1k7Ci0KLQlpZiAoZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgPT0gRFQzMTU1X1NUQVRFX0lETEUpCi0JICByZXR1cm4gMDsKLQotCXF1aWNrX3N0b3AobWlub3IpOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAodm9pZCAqKSAmZHQzMTU1X3N0YXR1c1ttaW5vcl0sCi0JCSAgICAgc2l6ZW9mKHN0cnVjdCBkdDMxNTVfc3RhdHVzKSkpCi0JICAgIHJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGNhc2UgRFQzMTU1X1NUQVJUOgotICAgICAgewotCWlmIChkdDMxNTVfc3RhdHVzW21pbm9yXS5zdGF0ZSAhPSBEVDMxNTVfU1RBVEVfSURMRSkKLQkgIHJldHVybiAtRUJVU1k7Ci0KLQlkdDMxNTVfc3RhdHVzW21pbm9yXS5mYnVmZmVyLnN0b3BfYWNxdWlyZSA9IDA7Ci0JZHQzMTU1X3N0YXR1c1ttaW5vcl0uZmJ1ZmZlci5mcmFtZV9jb3VudCA9IDA7Ci0KLQkvKiBTZXQgdGhlIE1PREUgaW4gdGhlIHN0YXR1cyAtLSB3ZSBkZWZhdWx0IHRvIEZSQU1FICovCi0JaWYgKGR0MzE1NV9zdGF0dXNbbWlub3JdLmNvbmZpZy5hY3FfbW9kZSA9PSBEVDMxNTVfTU9ERV9GSUVMRCkKLQkgIHsKLQkgICAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgPSBEVDMxNTVfU1RBVEVfRkxEOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZHQzMTU1X3N0YXR1c1ttaW5vcl0uc3RhdGUgPSBEVDMxNTVfU1RBVEVfRlJBTUU7Ci0JICB9Ci0KLQlkdDMxNTVfaW5pdF9pc3IobWlub3IpOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAodm9pZCAqKSAmZHQzMTU1X3N0YXR1c1ttaW5vcl0sCi0JCSAgICAgIHNpemVvZihzdHJ1Y3QgZHQzMTU1X3N0YXR1cykpKQotCSAgICByZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgewotCXByaW50aygiRFQzMTU1OiBpbnZhbGlkIElPQ1RMKDB4JXgpXG4iLGNtZCk7Ci0gICAgICBwcmludGsoIkRUMzE1NTogVmFsaWQgY29tbWFuZHMgKDB4JXgpLCAoMHgleCksICgweCV4KSwgKDB4JXgpLCAoMHgleClcbiIsCi0JICAgICAodW5zaWduZWQgaW50KURUMzE1NV9HRVRfQ09ORklHLAotCSAgICAgKHVuc2lnbmVkIGludClEVDMxNTVfU0VUX0NPTkZJRywKLQkgICAgIERUMzE1NV9TVEFSVCwgRFQzMTU1X1NUT1AsIERUMzE1NV9GTFVTSCk7Ci0JcmV0dXJuIC1FTk9TWVM7Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBtbWFwKCkKLSAqCi0gKiBvbmx5IGFsbG93IHRoZSB1c2VyIHRvIG1tYXAgdGhlIHJlZ2lzdGVycyBhbmQgYnVmZmVyCi0gKiBJdCBpcyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHRoaXMgaXMgYnJva2VuLCBzaW5jZSB0aGUKLSAqIGFkZGl0aW9uIG9mIG9mIHRoZSBjYXBhY2l0eSBmb3IgdHdvIGNhcmRzISEhISEhISEKLSAqIEl0ICpsb29rcyogbGlrZSBpdCBzaG91bGQgd29yayBidXQgc2luY2UgSSdtIG5vdAotICogc3VyZSBob3cgdG8gdXNlIGl0LCBJJ20gbm90IGFjdHVhbGx5IHN1cmUuIChOSkM/IGRpdHRvIGJ5IFNTKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBkdDMxNTVfbW1hcCAoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCi17Ci0gIC8qIHdoaWNoIGRldmljZSBhcmUgd2UgbW1hcHBpbmc/ICovCi0gIGludAkJCQltaW5vciA9IE1JTk9SKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYpOwotICB1bnNpZ25lZCBsb25nCW9mZnNldDsKLSAgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCi0gIGlmIChvZmZzZXQgPj0gX19wYShoaWdoX21lbW9yeSkgfHwgKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpKQotICAgIHZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87Ci0KLSAgLyogRG9uJ3QgdHJ5IHRvIHN3YXAgb3V0IHBoeXNpY2FsIHBhZ2VzLi4gKi8KLSAgdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKLQotICAvKiB0aGV5IGFyZSBtYXBwaW5nIHRoZSByZWdpc3RlcnMgb3IgdGhlIGJ1ZmZlciAqLwotICBpZiAoKG9mZnNldCA9PSBkdDMxNTVfc3RhdHVzW21pbm9yXS5yZWdfYWRkciAmJgotICAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA9PSBQQ0lfUEFHRV9TSVpFKSB8fAotICAgICAgKG9mZnNldCA9PSBkdDMxNTVfc3RhdHVzW21pbm9yXS5tZW1fYWRkciAmJgotICAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA9PSBkdDMxNTVfc3RhdHVzW21pbm9yXS5tZW1fc2l6ZSkpCi0gICAgewotICAgICAgaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsCi0JCQl2bWEtPnZtX3N0YXJ0LAotCQkJb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCi0JCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCi0JCQl2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKLQkgIHByaW50aygiRFQzMTU1OiByZW1hcF9wYWdlX3JhbmdlKCkgZmFpbGVkLlxuIik7Ci0JICByZXR1cm4gLUVBR0FJTjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRrKCJEVDMxNTU6IGR0MzE1NV9tbWFwKCkgYmFkIGNhbGwuXG4iKTsKLSAgICAgIHJldHVybiAtRU5YSU87Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogb3BlbigpCi0gKgotICogT3VyIHNwZWNpYWwgb3BlbiBjb2RlLgotICogTU9EX0lOQ19VU0VfQ09VTlQgbWFrZSBzdXJlIHRoYXQgdGhlIGRyaXZlciBtZW1vcnkgaXMgbm90IGZyZWVkCi0gKiB3aGlsZSB0aGUgZGV2aWNlIGlzIGluIHVzZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZHQzMTU1X29wZW4oc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbGVwKQotewotICBpbnQgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsgLyogd2hhdCBkZXZpY2UgYXJlIHdlIG9wZW5pbmc/ICovCi0gIGlmIChkdDMxNTVfZGV2X29wZW5bbWlub3JdKSB7Ci0gICAgcHJpbnRrICgiRFQzMTU1OiAgQWxyZWFkeSBvcGVuZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7Ci0gICAgcmV0dXJuIC1FQlVTWTsKLSAgfQotCi0gIGlmIChkdDMxNTVfc3RhdHVzW21pbm9yXS5kZXZpY2VfaW5zdGFsbGVkPT0wKQotICAgIHsKLSAgICAgIHByaW50aygiRFQzMTU1IE9wZW4gRXJyb3I6IE5vIHN1Y2ggZGV2aWNlIGR0MzE1NSBtaW5vciBudW1iZXIgJWRcbiIsCi0JICAgICBtaW5vcik7Ci0gICAgICByZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgaWYgKGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlICE9IERUMzE1NV9TVEFURV9JRExFKSB7Ci0gICAgcHJpbnRrICgiRFQzMTU1OiAgTm90IGluIGlkbGUgc3RhdGUgKHN0YXRlID0gJXgpXG4iLAotCSAgICBkdDMxNTVfc3RhdHVzW21pbm9yXS5zdGF0ZSk7Ci0gICAgcmV0dXJuIC1FQlVTWTsKLSAgfQotCi0gIHByaW50aygiRFQzMTU1OiBEZXZpY2Ugb3BlbmVkLlxuIik7Ci0KLSAgZHQzMTU1X2Rldl9vcGVuW21pbm9yXSA9IDEgOwotCi0gIGR0MzE1NV9mbHVzaChtaW5vcik7Ci0KLSAgLyogRGlzYWJsZSBBTEwgaW50ZXJydXB0cyAqLwotICBpbnRfY3NyX3IucmVnID0gMDsKLSAgV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbbWlub3JdICsgSU5UX0NTUiksIGludF9jc3Jfci5yZWcpOwotCi0gIGluaXRfd2FpdHF1ZXVlX2hlYWQoJihkdDMxNTVfcmVhZF93YWl0X3F1ZXVlW21pbm9yXSkpOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogY2xvc2UoKQotICoKLSAqIE5vdyBkZWNyZW1lbnQgdGhlIHVzZSBjb3VudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGR0MzE1NV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCi17Ci0gIGludCBtaW5vcjsKLQotICBtaW5vciA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOyAvKiB3aGljaCBkZXZpY2UgYXJlIHdlIGNsb3NpbmcgKi8KLSAgaWYgKCFkdDMxNTVfZGV2X29wZW5bbWlub3JdKQotICAgIHsKLSAgICAgIHByaW50aygiRFQzMTU1OiBhdHRlbXB0IHRvIENMT1NFIGEgbm90IE9QRU4gZGV2aWNlXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkdDMxNTVfZGV2X29wZW5bbWlub3JdID0gMDsKLQotICAgICAgaWYgKGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlICE9IERUMzE1NV9TVEFURV9JRExFKQotCXsKLQkgIHF1aWNrX3N0b3AobWlub3IpOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHJlYWQoKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzc2l6ZV90IGR0MzE1NV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlcCwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAvKiB3aGljaCBkZXZpY2UgYXJlIHdlIHJlYWRpbmcgZnJvbT8gKi8KLSAgaW50CQltaW5vciA9IE1JTk9SKGZpbGVwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKLSAgdTMyCQlvZmZzZXQ7Ci0gIGludAkJZnJhbWVfaW5kZXg7Ci0gIHN0cnVjdCBmcmFtZV9pbmZvCSpmcmFtZV9pbmZvOwotCi0gIC8qIFRPRE86IHRoaXMgc2hvdWxkIGNoZWNrIHRoZSBlcnJvciBmbGFnIGFuZCAqLwotICAvKiAgIHJldHVybiBhbiBlcnJvciBvbiBoYXJkd2FyZSBmYWlsdXJlcyAqLwotICBpZiAoY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBkdDMxNTVfcmVhZCkpCi0gICAgewotICAgICAgcHJpbnRrKCJEVDMxNTUgRVJST1IgKE5KQyk6IGNvdW50IGlzIG5vdCByaWdodFxuIik7Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLQotICAvKiBIYWNrIGhlcmUgLS0gSSdtIGdvaW5nIHRvIGFsbG93IHJlYWRpbmcgZXZlbiB3aGVuIGlkbGUuCi0gICAqIHRoaXMgaXMgc28gdGhhdCB0aGUgZnJhbWVzIGNhbiBiZSByZWFkIGFmdGVyIFNUT1AgaGFzCi0gICAqIGJlZW4gY2FsbGVkLiAgTGVhdmluZyBpdCBoZXJlLCBjb21tZW50ZWQgb3V0LCBhcyBhIHJlbWluZGVyCi0gICAqIGZvciBhIHNob3J0IHdoaWxlIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcHJvYmxlbXMuCi0gICAqIE5vdGUgdGhhdCBpZiB0aGUgZHJpdmVyIGlzIG5vdCBvcGVuZWQgaW4gbm9uX2Jsb2NraW5nIG1vZGUsCi0gICAqIGFuZCB0aGUgZGV2aWNlIGlzIGlkbGUsIHRoZW4gaXQgY291bGQgc2l0IGhlcmUgZm9yZXZlciEgKi8KLQotICAvKiAgaWYgKGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlID09IERUMzE1NV9TVEFURV9JRExFKSovCi0gIC8qICAgIHJldHVybiAtRUJVU1k7Ki8KLQotICAvKiBub24tYmxvY2tpbmcgcmVhZHMgc2hvdWxkIHJldHVybiBpZiBubyBkYXRhICovCi0gIGlmIChmaWxlcC0+Zl9mbGFncyAmIE9fTkRFTEFZKQotICAgIHsKLSAgICAgIGlmICgoZnJhbWVfaW5kZXggPSBkdDMxNTVfZ2V0X3JlYWR5X2J1ZmZlcihtaW5vcikpIDwgMCkgewotCS8qcHJpbnRrKCJkdDMxNTU6ICBubyBidWZmZXJzIGF2YWlsYWJsZSAoPylcbiIpOyovCi0JLyogCQlwcmludHF1ZXMobWlub3IpOyAqLwotCXJldHVybiAtRUFHQUlOOwotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBzbGVlcCB0aWxsIGRhdGEgYXJyaXZlcyAsIG9yIHdlIGdldCBpbnRlcnJ1cHRlZC4KLSAgICAgICAqIE5vdGUgdGhhdCB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSBkb2VzIG5vdCBhY3R1YWxseQotICAgICAgICogc2xlZXAvd2FpdCBpZiBpdCdzIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSB1cG9uIGVudHJ5LgotICAgICAgICovCi0gICAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZHQzMTU1X3JlYWRfd2FpdF9xdWV1ZVttaW5vcl0sCi0JCQkgICAgICAgKGZyYW1lX2luZGV4ID0gZHQzMTU1X2dldF9yZWFkeV9idWZmZXIobWlub3IpKQotCQkJICAgICAgID49IDApOwotCi0gICAgICBpZiAoZnJhbWVfaW5kZXggPCAwKQotCXsKLQkgIHByaW50ayAoIkRUMzE1NTogcmVhZDogaW50ZXJydXB0ZWRcbiIpOwotCSAgcXVpY2tfc3RvcCAobWlub3IpOwotCSAgcHJpbnRxdWVzKG1pbm9yKTsKLQkgIHJldHVybiAtRUlOVFI7Ci0JfQotICAgIH0KLQotICBmcmFtZV9pbmZvID0gJmR0MzE1NV9zdGF0dXNbbWlub3JdLmZidWZmZXIuZnJhbWVfaW5mb1tmcmFtZV9pbmRleF07Ci0KLSAgLyogbWFrZSB0aGlzIGFuIG9mZnNldCAqLwotICBvZmZzZXQgPSBmcmFtZV9pbmZvLT5hZGRyIC0gZHQzMTU1X3N0YXR1c1ttaW5vcl0ubWVtX2FkZHI7Ci0KLSAgcHV0X3VzZXIob2Zmc2V0LCAodW5zaWduZWQgaW50ICopIGJ1Zik7Ci0gIGJ1ZiArPSBzaXplb2YodTMyKTsKLSAgcHV0X3VzZXIoZHQzMTU1X3N0YXR1c1ttaW5vcl0uZmJ1ZmZlci5mcmFtZV9jb3VudCwgKHVuc2lnbmVkIGludCAqKSBidWYpOwotICBidWYgKz0gc2l6ZW9mKHUzMik7Ci0gIHB1dF91c2VyKGR0MzE1NV9zdGF0dXNbbWlub3JdLnN0YXRlLCAodW5zaWduZWQgaW50ICopIGJ1Zik7Ci0gIGJ1ZiArPSBzaXplb2YodTMyKTsKLSAgaWYgKGNvcHlfdG9fdXNlcihidWYsIGZyYW1lX2luZm8sIHNpemVvZigqZnJhbWVfaW5mbykpKQotICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0KLSAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgZHQzMTU1X3JlYWQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGR0MzE1NV9wb2xsIChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0gIGludCBtaW5vciA9IE1JTk9SKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYpOwotCi0gIGlmICghaXNfcmVhZHlfYnVmX2VtcHR5KG1pbm9yKSkKLSAgICByZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQotICBwb2xsX3dhaXQgKGZpbHAsICZkdDMxNTVfcmVhZF93YWl0X3F1ZXVlW21pbm9yXSwgd2FpdCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1kdDMxNTVfdW5sb2NrZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQ7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCXJldCA9IGR0MzE1NV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBmaWxlIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IERUMzE1NSBkcml2ZXIKLSAqICBuZWVkZWQgYnkgaW5pdF9tb2R1bGUKLSAqICByZWdpc3Rlcl9jaHJkZXYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR0MzE1NV9mb3BzID0gewotCS5yZWFkCQk9IGR0MzE1NV9yZWFkLAotCS51bmxvY2tlZF9pb2N0bAk9IGR0MzE1NV91bmxvY2tlZF9pb2N0bCwKLQkubW1hcAkJPSBkdDMxNTVfbW1hcCwKLQkucG9sbAkJPSBkdDMxNTVfcG9sbCwKLQkub3BlbgkJPSBkdDMxNTVfb3BlbiwKLQkucmVsZWFzZQk9IGR0MzE1NV9jbG9zZQotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGZpbmRfUENJKCk7Ci0gKgotICogUENJIGhhcyBiZWVuIHRvdGFsbHkgcmV3b3JrZWQgaW4gMi4xLi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZmluZF9QQ0kgKHZvaWQpCi17Ci0gIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKLSAgaW50IGVycm9yLCBwY2lfaW5kZXggPSAwOwotICB1bnNpZ25lZCBzaG9ydCByZXZfZGV2aWNlOwotICB1bnNpZ25lZCBsb25nIGJhc2U7Ci0gIHVuc2lnbmVkIGNoYXIgaXJxOwotCi0gIHdoaWxlICgocGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlCi0JICAoRFQzMTU1X1ZFTkRPUklELCBEVDMxNTVfREVWSUNFSUQsIHBjaV9kZXYpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHBjaV9pbmRleCArKzsKLQotICAgICAgLyogSXMgaXQgcmVhbGx5IHRoZXJlPyAqLwotICAgICAgaWYgKChlcnJvciA9Ci0JICAgcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX0NMQVNTX0RFVklDRSwgJnJldl9kZXZpY2UpKSkKLQljb250aW51ZTsKLQotICAgICAgLyogRm91bmQgYSBib2FyZCAqLwotICAgICAgRFRfMzE1NV9ERUJVR19NU0coIkRUMzE1NTogRGV2aWNlIG51bWJlciAlZCBcbiIsIHBjaV9pbmRleCk7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIHdhcyBjb21waWxlZCB3aXRoIGVub3VnaCBidWZmZXJzIHRvIGhhbmRsZQotCSB0aGlzIG1hbnkgYm9hcmRzICovCi0gICAgICBpZiAocGNpX2luZGV4ID4gTUFYQk9BUkRTKSB7Ci0JcHJpbnRrKCJEVDMxNTU6IEVSUk9SIC0gZm91bmQgJWQgZGV2aWNlcywgYnV0IGRyaXZlciBvbmx5IGNvbmZpZ3VyZWQgIgotCSAgICAgICAiZm9yICVkIGRldmljZXNcbiIKLQkgICAgICAgIkRUMzE1NTogUGxlYXNlIGNoYW5nZSBNQVhCT0FSRFMgaW4gZHQzMTU1LmhcbiIsCi0JICAgICAgIHBjaV9pbmRleCwgTUFYQk9BUkRTKTsKLQlnb3RvIGVycjsKLSAgICAgIH0KLQotICAgICAgLyogTm93LCBqdXN0IGdvIG91dCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhpcy90aGVzZSBkZXZpY2UocykgaXMvYXJlCi0JIGFjdHVhbGx5IG1hcHBlZCBpbnRvIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZSAqLwotICAgICAgaWYgKChlcnJvciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsCi0JCQkJCSAgKHUzMiAqKSAmYmFzZSkpKQotCXsKLQkgIHByaW50aygiRFQzMTU1OiBXYXMgbm90IGFibGUgdG8gZmluZCBkZXZpY2UgXG4iKTsKLQkgIGdvdG8gZXJyOwotCX0KLQotICAgICAgRFRfMzE1NV9ERUJVR19NU0coIkRUMzE1NTogQmFzZSBhZGRyZXNzIDAgZm9yIGRldmljZSBpcyAlbHggXG4iLCBiYXNlKTsKLSAgICAgIGR0MzE1NV9zdGF0dXNbcGNpX2luZGV4LTFdLnJlZ19hZGRyID0gYmFzZTsKLQotICAgICAgLyogUmVtYXAgdGhlIGJhc2UgYWRkcmVzcyB0byBhIGxvZ2ljYWwgYWRkcmVzcyB0aHJvdWdoIHdoaWNoIHdlCi0gICAgICAgKiBjYW4gYWNjZXNzIGl0LiAqLwotICAgICAgZHQzMTU1X2xiYXNlW3BjaV9pbmRleCAtIDFdID0gaW9yZW1hcChiYXNlLFBDSV9QQUdFX1NJWkUpOwotICAgICAgZHQzMTU1X3N0YXR1c1twY2lfaW5kZXggLSAxXS5yZWdfYWRkciA9IGJhc2U7Ci0gICAgICBEVF8zMTU1X0RFQlVHX01TRygiRFQzMTU1OiBOZXcgbG9naWNhbCBhZGRyZXNzIGlzICVwIFxuIiwKLQkJCWR0MzE1NV9sYmFzZVtwY2lfaW5kZXgtMV0pOwotICAgICAgaWYgKCFkdDMxNTVfbGJhc2VbcGNpX2luZGV4LTFdKQotCXsKLQkgIHByaW50aygiRFQzMTU1OiBVbmFibGUgdG8gcmVtYXAgY29udHJvbCByZWdpc3RlcnNcbiIpOwotCSAgZ290byBlcnI7Ci0JfQotCi0gICAgICBpZiAoKGVycm9yID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaXJxKSkpCi0JewotCSAgcHJpbnRrKCJEVDMxNTU6IFdhcyBub3QgYWJsZSB0byBmaW5kIGRldmljZSBcbiIpOwotCSAgZ290byBlcnI7Ci0JfQotCi0gICAgICBEVF8zMTU1X0RFQlVHX01TRygiRFQzMTU1OiBJUlEgaXMgJWQgXG4iLGlycSk7Ci0gICAgICBkdDMxNTVfc3RhdHVzW3BjaV9pbmRleC0xXS5pcnEgPSBpcnE7Ci0gICAgICAvKiBTZXQgZmxhZzoga3RoIGRldmljZSBmb3VuZCEgKi8KLSAgICAgIGR0MzE1NV9zdGF0dXNbcGNpX2luZGV4LTFdLmRldmljZV9pbnN0YWxsZWQgPSAxOwotICAgICAgcHJpbnRrKCJEVDMxNTU6IEluc3RhbGxpbmcgZGV2aWNlICVkIHcvaXJxICVkIGFuZCBhZGRyZXNzICVwXG4iLAotCSAgICAgcGNpX2luZGV4LAotCSAgICAgZHQzMTU1X3N0YXR1c1twY2lfaW5kZXgtMV0uaXJxLAotCSAgICAgZHQzMTU1X2xiYXNlW3BjaV9pbmRleC0xXSk7Ci0KLSAgICB9Ci0gIG5kZXZpY2VzID0gcGNpX2luZGV4OwotCi0gIHJldHVybiBEVF8zMTU1X1NVQ0NFU1M7Ci0KLWVycjoKLSAgcGNpX2Rldl9wdXQocGNpX2Rldik7Ci0gIHJldHVybiBEVF8zMTU1X0ZBSUxVUkU7Ci19Ci0KLXUzMiBhbGxvY2F0b3JBZGRyID0gMDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBpbml0X21vZHVsZSgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLSAgaW50IGluZGV4OwotICBpbnQgcmNvZGUgPSAwOwotICBjaGFyICpkZXZuYW1lW01BWEJPQVJEU107Ci0KLSAgZGV2bmFtZVswXSA9ICJkdDMxNTVhIjsKLSNpZiBNQVhCT0FSRFMgPT0gMgotICBkZXZuYW1lWzFdID0gImR0MzE1NWIiOwotI2VuZGlmCi0KLSAgcHJpbnRrKCJEVDMxNTU6IExvYWRpbmcgbW9kdWxlLi4uXG4iKTsKLQotICAvKiBSZWdpc3RlciB0aGUgZGV2aWNlIGRyaXZlciAqLwotICByY29kZSA9IHJlZ2lzdGVyX2NocmRldihkdDMxNTVfbWFqb3IsICJkdDMxNTUiLCAmZHQzMTU1X2ZvcHMpOwotICBpZihyY29kZSA8IDApCi0gICAgewotICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRFQzMTU1OiByZWdpc3Rlcl9jaHJkZXYgZmFpbGVkIFxuIik7Ci0gICAgICByZXR1cm4gcmNvZGU7Ci0gICAgfQotCi0gIGlmKGR0MzE1NV9tYWpvciA9PSAwKQotICAgIGR0MzE1NV9tYWpvciA9IHJjb2RlOyAvKiBkeW5hbWljICovCi0KLQotICAvKiBpbml0IHRoZSBzdGF0dXMgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERNQSBtZW1vcnkgaXMgdGFrZW4gY2FyZSBvZiBpbiBzZXR1cF9idWZmZXJzKCkgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYQk9BUkRTOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGR0MzE1NV9zdGF0dXNbaW5kZXhdLmNvbmZpZy5hY3FfbW9kZSAgID0gRFQzMTU1X01PREVfRlJBTUU7Ci0gICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5jb25maWcuY29udGludW91cyA9IERUMzE1NV9BQ1E7Ci0gICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5jb25maWcuY29scyAgICAgICA9IERUMzE1NV9NQVhfQ09MUzsKLSAgICAgIGR0MzE1NV9zdGF0dXNbaW5kZXhdLmNvbmZpZy5yb3dzICAgICAgID0gRFQzMTU1X01BWF9ST1dTOwotICAgICAgZHQzMTU1X3N0YXR1c1tpbmRleF0uc3RhdGUgPSBEVDMxNTVfU1RBVEVfSURMRTsKLQotICAgICAgLyogZmluZF9QQ0koKSB3aWxsIGNoZWNrIGlmIGRldmljZXMgYXJlIGluc3RhbGxlZDsgKi8KLSAgICAgIC8qIGZpcnN0IGFzc3VtZSB0aGV5J3JlIG5vdDogICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5tZW1fYWRkciAgICAgICAgICA9IDA7Ci0gICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5tZW1fc2l6ZSAgICAgICAgICA9IDA7Ci0gICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5zdGF0ZSAgICAgICAgICAgICA9IERUMzE1NV9TVEFURV9JRExFOwotICAgICAgZHQzMTU1X3N0YXR1c1tpbmRleF0uZGV2aWNlX2luc3RhbGxlZCAgPSAwOwotICAgIH0KLQotICAvKiBOb3cgbGV0J3MgZmluZCB0aGUgaGFyZHdhcmUuICBmaW5kX1BDSSgpIHdpbGwgc2V0IG5kZXZpY2VzIHRvIHRoZQotICAgKiBudW1iZXIgb2YgY2FyZHMgZm91bmQgaW4gdGhpcyBtYWNoaW5lLiAqLwotICAgIHsKLSAgICAgIGlmICgocmNvZGUgPSBmaW5kX1BDSSgpKSAhPSAgRFRfMzE1NV9TVUNDRVNTKQotCXsKLQkgIHByaW50aygiRFQzMTU1IGVycm9yOiBmaW5kX1BDSSgpIGZhaWxlZCB0byBmaW5kIGR0MzE1NSBib2FyZChzKVxuIik7Ci0JICB1bnJlZ2lzdGVyX2NocmRldihkdDMxNTVfbWFqb3IsICJkdDMxNTUiKTsKLQkgIHJldHVybiByY29kZTsKLQl9Ci0gICAgfQotCi0gIC8qIE9rLCB0aW1lIHRvIHNldHVwIHRoZSBmcmFtZSBidWZmZXJzICovCi0gIGlmKChyY29kZSA9IGR0MzE1NV9zZXR1cF9idWZmZXJzKCZhbGxvY2F0b3JBZGRyKSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50aygiRFQzMTU1OiBFcnJvcjogc2V0dGluZyB1cCBidWZmZXIgbm90IGxhcmdlIGVub3VnaC4iKTsKLSAgICAgIHVucmVnaXN0ZXJfY2hyZGV2KGR0MzE1NV9tYWpvciwgImR0MzE1NSIpOwotICAgICAgcmV0dXJuIHJjb2RlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgdGhpcyBmYXIsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIFJBTSAqLwotICAvKiBmb3IgdGhlIGJ1ZmZlcnM6IFByaW50IHRoZSBjb25maWd1cmF0aW9uLiAgICAqLwotICBmb3IoIGluZGV4ID0gMDsgIGluZGV4IDwgbmRldmljZXM7ICBpbmRleCsrKQotICAgIHsKLSAgICAgIHByaW50aygiRFQzMTU1OiBEZXZpY2UgPSAlZDsgYWNxX21vZGUgPSAlZDsgIgotCSAgICAgImNvbnRpbnVvdXMgPSAlZDsgY29scyA9ICVkOyByb3dzID0gJWQ7XG4iLAotCSAgICAgaW5kZXggLAotCSAgICAgZHQzMTU1X3N0YXR1c1tpbmRleF0uY29uZmlnLmFjcV9tb2RlLAotCSAgICAgZHQzMTU1X3N0YXR1c1tpbmRleF0uY29uZmlnLmNvbnRpbnVvdXMsCi0JICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5jb25maWcuY29scywKLQkgICAgIGR0MzE1NV9zdGF0dXNbaW5kZXhdLmNvbmZpZy5yb3dzKTsKLSAgICAgIHByaW50aygiRFQzMTU1OiBtX2FkZHIgPSAweCV4OyBtX3NpemUgPSAlbGQ7ICIKLQkgICAgICJzdGF0ZSA9ICVkOyBkZXZpY2VfaW5zdGFsbGVkID0gJWRcbiIsCi0JICAgICBkdDMxNTVfc3RhdHVzW2luZGV4XS5tZW1fYWRkciwKLQkgICAgIChsb25nIGludClkdDMxNTVfc3RhdHVzW2luZGV4XS5tZW1fc2l6ZSwKLQkgICAgIGR0MzE1NV9zdGF0dXNbaW5kZXhdLnN0YXRlLAotCSAgICAgZHQzMTU1X3N0YXR1c1tpbmRleF0uZGV2aWNlX2luc3RhbGxlZCk7Ci0gICAgfQotCi0gIC8qIERpc2FibGUgQUxMIGludGVycnVwdHMgKi8KLSAgaW50X2Nzcl9yLnJlZyA9IDA7Ci0gIGZvciggaW5kZXggPSAwOyAgaW5kZXggPCBuZGV2aWNlczsgIGluZGV4KyspCi0gICAgewotICAgICAgV3JpdGVNUmVnKChkdDMxNTVfbGJhc2VbaW5kZXhdICsgSU5UX0NTUiksIGludF9jc3Jfci5yZWcpOwotICAgICAgaWYoZHQzMTU1X3N0YXR1c1tpbmRleF0uZGV2aWNlX2luc3RhbGxlZCkKLQl7Ci0JICAvKgotCSAgICogVGhpcyBkcml2ZXIgKmxvb2tzKiBsaWtlIGl0IGNhbiBoYW5kbGUgc2hhcmluZyBpbnRlcnJ1cHRzLAotCSAgICogYnV0IEkgY2FuJ3QgYWN0dWFsbHkgdGVzdCBteXNlbGYuIEkndmUgaGFkIHJlcG9ydHMgdGhhdCBpdAotCSAgICogRE9FUyB3b3JrIHNvIEknbGwgZW5hYmxlIGl0IGZvciBub3cuIFRoaXMgY29tbWVudCB3aWxsIHJlbWFpbgotCSAgICogYXMgYSByZW1pbmRlciBpbiBjYXNlIGFueSBwcm9ibGVtcyBhcmlzZS4gKFNTKQotCSAgICovCi0JICAvKiBpbiBvbGRlciBrZXJuZWxzIGZsYWdzIGFyZTogU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQgKi8KLQkgIHJjb2RlID0gcmVxdWVzdF9pcnEoZHQzMTU1X3N0YXR1c1tpbmRleF0uaXJxLCAodm9pZCAqKWR0MzE1NV9pc3IsCi0JCQkgICAgICAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXZuYW1lW2luZGV4XSwKLQkJCSAgICAgICAodm9pZCopICZkdDMxNTVfc3RhdHVzW2luZGV4XSk7Ci0JICBpZihyY29kZSA8IDApCi0JICAgIHsKLQkgICAgICBwcmludGsoIkRUMzE1NTogbWlub3IgJWQgcmVxdWVzdF9pcnEgZmFpbGVkIGZvciBJUlEgJWRcbiIsCi0JCSAgICAgaW5kZXgsIGR0MzE1NV9zdGF0dXNbaW5kZXhdLmlycSk7Ci0JICAgICAgdW5yZWdpc3Rlcl9jaHJkZXYoZHQzMTU1X21ham9yLCAiZHQzMTU1Iik7Ci0JICAgICAgcmV0dXJuIHJjb2RlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBwcmludGsoIkRUMzE1NTogZmluaXNoZWQgbG9hZGluZ1xuIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogY2xlYW51cF9tb2R1bGUodm9pZCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0gIGludCBpbmRleDsKLQotICBwcmludGsoIkRUMzE1NTogIGNsZWFudXBfbW9kdWxlIGNhbGxlZFxuIik7Ci0KLSAgLyogcmVtb3ZlZCBETUEgYWxsb2NhdGVkIHdpdGggdGhlIGFsbG9jYXRvciAqLwotI2lmZGVmIFNUQU5EQUxPTkVfQUxMT0NBVE9SCi0gIGlmIChhbGxvY2F0b3JBZGRyICE9IDApCi0gICAgYWxsb2NhdG9yX2ZyZWVfZG1hKGFsbG9jYXRvckFkZHIpOwotI2Vsc2UKLSAgYWxsb2NhdG9yX2NsZWFudXAoKTsKLSNlbmRpZgotCi0gIHVucmVnaXN0ZXJfY2hyZGV2KGR0MzE1NV9tYWpvciwgImR0MzE1NSIpOwotCi0gIGZvcihpbmRleCA9IDA7IGluZGV4IDwgbmRldmljZXM7IGluZGV4KyspCi0gICAgewotICAgICAgaWYoZHQzMTU1X3N0YXR1c1tpbmRleF0uZGV2aWNlX2luc3RhbGxlZCA9PSAxKQotCXsKLQkgIHByaW50aygiRFQzMTU1OiBGcmVlaW5nIGlycSAlZCBmb3IgZGV2aWNlICVkXG4iLAotCQkgIGR0MzE1NV9zdGF0dXNbaW5kZXhdLmlycSwgaW5kZXgpOwotCSAgZnJlZV9pcnEoZHQzMTU1X3N0YXR1c1tpbmRleF0uaXJxLCAodm9pZCopJmR0MzE1NV9zdGF0dXNbaW5kZXhdKTsKLQl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NV9kcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2Rydi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWU2OGMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2Rydi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IDE5OTYsMjAwMiBHcmVnb3J5IEQuIEhhZ2VyLCBBbGZyZWQgQS4gUml6emksIE5vYWggSi4gQ293YW4sCi0JCSAgICBTY290dCBTbWVkbGV5Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBEVDMxNTUgRGV2aWNlIERyaXZlci4KLQotVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci1hbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotTUEgMDIxMTEtMTMwNyBVU0EKLSovCi0KLSNpZm5kZWYgRFQzMTU1X0RSVl9JTkMKLSNkZWZpbmUgRFQzMTU1X0RSVl9JTkMKLQotLyoga2VybmVsIGxvZ2ljYWwgYWRkcmVzcyBvZiB0aGUgZnJhbWUgZ3JhYmJlcnMgKi8KLWV4dGVybiB1OCAqZHQzMTU1X2xiYXNlW01BWEJPQVJEU107Ci0KLS8qIGtlcm5lbCBsb2dpY2FsIGFkZHJlc3Mgb2YgcmFtIGJ1ZmZlciAqLwotZXh0ZXJuIHU4ICpkdDMxNTVfYmJhc2U7Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0vKiB3YWl0IHF1ZXVlIGZvciByZWFkcyAqLwotZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGR0MzE1NV9yZWFkX3dhaXRfcXVldWVbTUFYQk9BUkRTXTsKLSNlbmRpZgotCi0vKiBudW1iZXIgb2YgZGV2aWNlcyAqLwotZXh0ZXJuIHUzMiBuZGV2aWNlczsKLQotZXh0ZXJuIGludCBkdDMxNTVfZXJybm87Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NS9kdDMxNTVfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTJlNzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NS9kdDMxNTVfaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTYsMjAwMiwyMDA1IEdyZWdvcnkgRC4gSGFnZXIsIEFsZnJlZCBBLiBSaXp6aSwgTm9haCBKLiBDb3dhbiwKLSAqCQkJICAgIEphc29uIExhcGVudGEsIFNjb3R0IFNtZWRsZXkKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRFQzMTU1IERldmljZSBEcml2ZXIuCi0gKgotICogVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGUgRFQzMTU1IERldmljZSBEcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgc29tZSBiYXNpYyByZWdpc3RlciBpbyByb3V0aW5lcy4gIEl0IGlzIG1vZGlmaWVkIGZyb20KLSAqIGRlbW8gY29kZSBwcm92aWRlZCBieSBEYXRhIFRyYW5zbGF0aW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJkdDMxNTUuaCIKLSNpbmNsdWRlICJkdDMxNTVfaW8uaCIKLSNpbmNsdWRlICJkdDMxNTVfZHJ2LmgiCi0KLQotLyoqKioqKiBsb2NhbCBjb3BpZXMgb2YgYm9hcmQncyAzMiBiaXQgcmVnaXN0ZXJzICoqKioqKi8KLXUzMiBldmVuX2RtYV9zdGFydF9yOwkvKiAgYml0IDAgc2hvdWxkIGFsd2F5cyBiZSAwICovCi11MzIgb2RkX2RtYV9zdGFydF9yOwkvKiAgICAgICAgICAgICAgIC4uICovCi11MzIgZXZlbl9kbWFfc3RyaWRlX3I7CS8qICBiaXRzIDAmMSBzaG91bGQgYWx3YXlzIGJlIDAgKi8KLXUzMiBvZGRfZG1hX3N0cmlkZV9yOwkvKiAgICAgICAgICAgICAgIC4uICovCi11MzIgZXZlbl9waXhlbF9mbXRfcjsKLXUzMiBvZGRfcGl4ZWxfZm10X3I7Ci0KLUZJRk9fVFJJR0dFUl9SCQlmaWZvX3RyaWdnZXJfcjsKLVhGRVJfTU9ERV9SCQl4ZmVyX21vZGVfcjsKLUNTUjFfUgkJCWNzcjFfcjsKLVJFVFJZX1dBSVRfQ05UX1IJcmV0cnlfd2FpdF9jbnRfcjsKLUlOVF9DU1JfUgkJaW50X2Nzcl9yOwotCi11MzIgZXZlbl9mbGRfbWFza19yOwotdTMyIG9kZF9mbGRfbWFza19yOwotCi1NQVNLX0xFTkdUSF9SCQltYXNrX2xlbmd0aF9yOwotRklGT19GTEFHX0NOVF9SCQlmaWZvX2ZsYWdfY250X3I7Ci1JSUNfQ0xLX0RVUl9SCQlpaWNfY2xrX2R1cl9yOwotSUlDX0NTUjFfUgkJaWljX2NzcjFfcjsKLUlJQ19DU1IyX1IJCWlpY19jc3IyX3I7Ci1ETUFfVVBQRVJfTE1UX1IJCWV2ZW5fZG1hX3VwcGVyX2xtdF9yOwotRE1BX1VQUEVSX0xNVF9SCQlvZGRfZG1hX3VwcGVyX2xtdF9yOwotCi0KLQotLyoqKioqKioqIGxvY2FsIGNvcGllcyBvZiBib2FyZCdzIDggYml0IEkyQyByZWdpc3RlcnMgKioqKioqLwotSTJDX0NTUjIgaTJjX2NzcjI7Ci1JMkNfRVZFTl9DU1IgaTJjX2V2ZW5fY3NyOwotSTJDX09ERF9DU1IgaTJjX29kZF9jc3I7Ci1JMkNfQ09ORklHIGkyY19jb25maWc7Ci11OCBpMmNfZHRfaWQ7Ci11OCBpMmNfeF9jbGlwX3N0YXJ0OwotdTggaTJjX3lfY2xpcF9zdGFydDsKLXU4IGkyY194X2NsaXBfZW5kOwotdTggaTJjX3lfY2xpcF9lbmQ7Ci11OCBpMmNfYWRfYWRkcjsKLXU4IGkyY19hZF9sdXQ7Ci1JMkNfQURfQ01EIGkyY19hZF9jbWQ7Ci11OCBpMmNfZGlnX291dDsKLXU4IGkyY19wbV9sdXRfYWRkcjsKLXU4IGkyY19wbV9sdXRfZGF0YTsKLQotLyoKLSAqIHdhaXRfaWJzeWNscigpCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlYWQvd3JpdGUgdGltaW5nIGFuZCByL3cgdGltZW91dCBlcnJvcgotICovCi1zdGF0aWMgaW50IHdhaXRfaWJzeWNscih1OCAqbHBSZWcpCi17Ci0JLyogd2FpdCAxMDAgbWljcm9zZWNvbmRzICovCi0JdWRlbGF5KDEwMEwpOwotCS8qIF9fZGVsYXkobG9vcHNfcGVyX3NlYy8xMDAwMCk7ICovCi0KLQlSZWFkTVJlZyhscFJlZyArIElJQ19DU1IyLCBpaWNfY3NyMl9yLnJlZyk7Ci0JaWYgKGlpY19jc3IyX3IuZmxkLk5FV19DWUNMRSkgewotCQkvKiBpZiBORVdfQ1lDTEUgZGlkbid0IGNsZWFyICovCi0JCS8qIFRJTUVPVVQgRVJST1IgKi8KLQkJZHQzMTU1X2Vycm5vID0gRFRfRVJSX0kyQ19USU1FT1VUOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9Ci0KLQlyZXR1cm4gMDsJLyogbm8gZXJyb3IgKi8KLX0KLQotLyoKLSAqIFdyaXRlSTJDKCkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgd3JpdGluZyB0byA4LWJpdCBEVDMxNTUgcmVnaXN0ZXJzCi0gKgotICogMXN0IHBhcmFtZXRlciBpcyBwb2ludGVyIHRvIDMyLWJpdCByZWdpc3RlciBiYXNlIGFkZHJlc3MKLSAqIDJuZCBwYXJhbWV0ZXIgaXMgcmVnLiBpbmRleDsKLSAqIDNyZCBpcyB2YWx1ZSB0byBiZSB3cml0dGVuCi0gKi8KLWludCBXcml0ZUkyQyh1OCAqbHBSZWcsIHVfc2hvcnQgd0lyZWdJbmRleCwgdTggYnlWYWwpCi17Ci0JLyogcmVhZCAzMiBiaXQgSUlDX0NTUjIgcmVnaXN0ZXIgZGF0YSBpbnRvIHVuaW9uICovCi0KLQlSZWFkTVJlZygobHBSZWcgKyBJSUNfQ1NSMiksIGlpY19jc3IyX3IucmVnKTsKLQotCS8qIGZvciB3cml0ZSBvcGVyYXRpb24gKi8KLQlpaWNfY3NyMl9yLmZsZC5ESVJfUkQgICAgICA9IDA7Ci0JLyogSTJDIGFkZHJlc3Mgb2YgSTJDIHJlZ2lzdGVyOiAqLwotCWlpY19jc3IyX3IuZmxkLkRJUl9BRERSICAgID0gd0lyZWdJbmRleDsKLQkvKiA4IGJpdCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gSTJDIHJlZyAqLwotCWlpY19jc3IyX3IuZmxkLkRJUl9XUl9EQVRBID0gYnlWYWw7Ci0JLyogd2lsbCBzdGFydCBhIGRpcmVjdCBJMkMgY3ljbGU6ICovCi0JaWljX2NzcjJfci5mbGQuTkVXX0NZQ0xFICAgPSAxOwotCi0JLyogeGZlciB1bmlvbiBkYXRhIGludG8gMzIgYml0IElJQ19DU1IyIHJlZ2lzdGVyICovCi0JV3JpdGVNUmVnKChscFJlZyArIElJQ19DU1IyKSwgaWljX2NzcjJfci5yZWcpOwotCi0JLyogd2FpdCBmb3IgSUlDIGN5Y2xlIHRvIGZpbmlzaCAqLwotCXJldHVybiB3YWl0X2lic3ljbHIobHBSZWcpOwotfQotCi0vKgotICogUmVhZEkyQygpCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlYWRpbmcgZnJvbSA4LWJpdCBEVDMxNTUgcmVnaXN0ZXJzCi0gKgotICogMXN0IHBhcmFtZXRlciBpcyBwb2ludGVyIHRvIDMyLWJpdCByZWdpc3RlciBiYXNlIGFkZHJlc3MKLSAqIDJuZCBwYXJhbWV0ZXIgaXMgcmVnLiBpbmRleDsKLSAqIDNyZCBpcyBhZHJzIG9mIHZhbHVlIHRvIGJlIHJlYWQKLSAqLwotaW50IFJlYWRJMkModTggKmxwUmVnLCB1X3Nob3J0IHdJcmVnSW5kZXgsIHU4ICpieVZhbCkKLXsKLQlpbnQgd3JpdGVzdGF0OwkvKiBzdGF0dXMgZm9yIHJldHVybiAqLwotCi0JLyogIHJlYWQgMzIgYml0IElJQ19DU1IyIHJlZ2lzdGVyIGRhdGEgaW50byB1bmlvbiAqLwotCVJlYWRNUmVnKChscFJlZyArIElJQ19DU1IyKSwgaWljX2NzcjJfci5yZWcpOwotCi0JLyogIGZvciByZWFkIG9wZXJhdGlvbiAqLwotCWlpY19jc3IyX3IuZmxkLkRJUl9SRCAgICAgPSAxOwotCi0JLyogIEkyQyBhZGRyZXNzIG9mIEkyQyByZWdpc3RlcjogKi8KLQlpaWNfY3NyMl9yLmZsZC5ESVJfQUREUiAgID0gd0lyZWdJbmRleDsKLQotCS8qICB3aWxsIHN0YXJ0IGEgZGlyZWN0IEkyQyBjeWNsZTogKi8KLQlpaWNfY3NyMl9yLmZsZC5ORVdfQ1lDTEUgID0gMTsKLQotCS8qICB4ZmVyIHVuaW9uJ3MgZGF0YSBpbnRvIDMyIGJpdCBJSUNfQ1NSMiByZWdpc3RlciAqLwotCVdyaXRlTVJlZygobHBSZWcgKyBJSUNfQ1NSMiksIGlpY19jc3IyX3IucmVnKTsKLQotCS8qIHdhaXQgZm9yIElJQyBjeWNsZSB0byBmaW5pc2ggKi8KLQl3cml0ZXN0YXQgPSB3YWl0X2lic3ljbHIobHBSZWcpOwotCi0JLyogTmV4dCAyIGNvbW1hbmRzIHJlYWQgMzIgYml0IElJQ19DU1IxIHJlZ2lzdGVyJ3MgZGF0YSBpbnRvIHVuaW9uICovCi0JLyogZmlyc3QgcmVhZCBkYXRhIGlzIGluIElJQ19DU1IxICovCi0JUmVhZE1SZWcoKGxwUmVnICsgSUlDX0NTUjEpLCBpaWNfY3NyMV9yLnJlZyk7Ci0KLQkvKiBub3cgZ2V0IGRhdGEgdTggb3V0IG9mIHJlZ2lzdGVyICovCi0JKmJ5VmFsID0gKHU4KSBpaWNfY3NyMV9yLmZsZC5SRF9EQVRBOwotCi0JcmV0dXJuIHdyaXRlc3RhdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2lvLmggYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NV9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWEyNTEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLQotQ29weXJpZ2h0IDE5OTYsMjAwMiBHcmVnb3J5IEQuIEhhZ2VyLCBBbGZyZWQgQS4gUml6emksIE5vYWggSi4gQ293YW4sCi0JCSAgICBKYXNvbiBMYXBlbnRhLCBTY290dCBTbWVkbGV5Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBEVDMxNTUgRGV2aWNlIERyaXZlci4KLQotVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci1hbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIERUMzE1NSBEZXZpY2UgRHJpdmVyOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotTUEgMDIxMTEtMTMwNyBVU0EKLQotCi0tLSBDaGFuZ2VzIC0tCi0KLSAgRGF0ZSAgICAgUHJvZ3JhbW1lciAgRGVzY3JpcHRpb24gb2YgY2hhbmdlcyBtYWRlCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgMjQtSnVsLTIwMDIgU1MgICAgICAgR1BMIGxpY2VuY2UuCi0KLSovCi0KLS8qIFRoaXMgY29kZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgZXhhbXBsZXMgcHJvdmlkZWQgYnkgRGF0YSBUcmFuc2xhdGlvbnMuKi8KLQotI2lmbmRlZiBEVDMxNTVfSU9fSU5DCi0jZGVmaW5lIERUMzE1NV9JT19JTkMKLQotLyogbWFjcm9zIHRvIGFjY2VzcyByZWdpc3RlcnMgKi8KLQotI2RlZmluZSBXcml0ZU1SZWcoQWRkcmVzcywgRGF0YSkJKCooKHUzMiAqKShBZGRyZXNzKSkgPSBEYXRhKQotI2RlZmluZSBSZWFkTVJlZyhBZGRyZXNzLCBEYXRhKQkJKERhdGEgPSAqKCh1MzIgKikoQWRkcmVzcykpKQotCi0vKioqKioqKioqKioqKioqKiogMzIgYml0IHJlZ2lzdGVyIGdsb2JhbHMgICoqKioqKioqKioqKioqLwotCi0vKiAgb2Zmc2V0cyBmb3IgMzItYml0IG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgRVZFTl9ETUFfU1RBUlQJCTB4MDAwCi0jZGVmaW5lIE9ERF9ETUFfU1RBUlQJCTB4MDBDCi0jZGVmaW5lIEVWRU5fRE1BX1NUUklERQkJMHgwMTgKLSNkZWZpbmUgT0REX0RNQV9TVFJJREUJCTB4MDI0Ci0jZGVmaW5lIEVWRU5fUElYRUxfRk1UCQkweDAzMAotI2RlZmluZSBPRERfUElYRUxfRk1UCQkweDAzNAotI2RlZmluZSBGSUZPX1RSSUdHRVIJCTB4MDM4Ci0jZGVmaW5lIFhGRVJfTU9ERQkJMHgwM0MKLSNkZWZpbmUgQ1NSMQkJCTB4MDQwCi0jZGVmaW5lIFJFVFJZX1dBSVRfQ05UCQkweDA0NAotI2RlZmluZSBJTlRfQ1NSCQkJMHgwNDgKLSNkZWZpbmUgRVZFTl9GTERfTUFTSwkJMHgwNEMKLSNkZWZpbmUgT0REX0ZMRF9NQVNLCQkweDA1MAotI2RlZmluZSBNQVNLX0xFTkdUSAkJMHgwNTQKLSNkZWZpbmUgRklGT19GTEFHX0NOVAkJMHgwNTgKLSNkZWZpbmUgSUlDX0NMS19EVVIJCTB4MDVDCi0jZGVmaW5lIElJQ19DU1IxCQkweDA2MAotI2RlZmluZSBJSUNfQ1NSMgkJMHgwNjQKLSNkZWZpbmUgRVZFTl9ETUFfVVBQUl9MTVQJMHgwOEMKLSNkZWZpbmUgT0REX0RNQV9VUFBSX0xNVAkweDA5MAotCi0jZGVmaW5lIENMS19EVVJfVkFMCQkweDAxMDEwMTAxCi0KLQotCi0vKioqKioqKiogQXNzaWdubWVudHMgYW5kIFR5cGVkZWZzIGZvciAzMiBiaXQgTWVtb3J5IE1hcHBlZCBSZWdpc3RlcnMgKioqKioqKiovCi0KLXR5cGVkZWYgdW5pb24gZmlmb190cmlnZ2VyX3RhZyB7Ci0JdTMyICAgcmVnOwotCXN0cnVjdCB7Ci0JCXUzMiBQQUNLRUQ6NjsKLQkJdTMyICAgICAgIDo5OwotCQl1MzIgUExBTkVSOjc7Ci0JCXUzMiAgICAgICA6OTsKLQl9IGZsZDsKLX0gRklGT19UUklHR0VSX1I7Ci0KLXR5cGVkZWYgdW5pb24geGZlcl9tb2RlX3RhZyB7Ci0JdTMyICAgcmVnOwotCXN0cnVjdCB7Ci0JCXUzMiAgICAgICAgICAgICA6MjsKLQkJdTMyIEZJRUxEX1RPR0dMRToxOwotCQl1MzIgICAgICAgICAgICAgOjU7Ci0JCXUzMiAgICAgICAgICAgICA6MjsKLQkJdTMyICAgICAgICAgICAgIDoyMjsKLQl9IGZsZDsKLX0gWEZFUl9NT0RFX1I7Ci0KLXR5cGVkZWYgdW5pb24gY3NyMV90YWcgewotCXUzMiAgIHJlZzsKLQlzdHJ1Y3QgewotCQl1MzIgQ0FQX0NPTlRfRVZFOjE7Ci0JCXUzMiBDQVBfQ09OVF9PREQ6MTsKLQkJdTMyIENBUF9TTkdMX0VWRToxOwotCQl1MzIgQ0FQX1NOR0xfT0REOjE7Ci0JCXUzMiBGTERfRE5fRVZFICA6MTsKLQkJdTMyIEZMRF9ETl9PREQgIDoxOwotCQl1MzIgU1JTVCAgICAgICAgOjE7Ci0JCXUzMiBGSUZPX0VOICAgICA6MTsKLQkJdTMyIEZMRF9DUlBUX0VWRToxOwotCQl1MzIgRkxEX0NSUFRfT0REOjE7Ci0JCXUzMiBBRERSX0VSUl9FVkU6MTsKLQkJdTMyIEFERFJfRVJSX09ERDoxOwotCQl1MzIgQ1JQVF9ESVMgICAgOjE7Ci0JCXUzMiBSQU5HRV9FTiAgICA6MTsKLQkJdTMyICAgICAgICAgICAgIDoxNjsKLQl9IGZsZDsKLX0gQ1NSMV9SOwotCi10eXBlZGVmIHVuaW9uIHJldHJ5X3dhaXRfY250X3RhZyB7Ci0JdTMyICAgcmVnOwotCXN0cnVjdCB7Ci0JCXUzMiBSVFJZX1dBSVRfQ05UOjg7Ci0JCXUzMiAgICAgICAgICAgICAgOjI0OwotCX0gZmxkOwotfSBSRVRSWV9XQUlUX0NOVF9SOwotCi10eXBlZGVmIHVuaW9uIGludF9jc3JfdGFnIHsKLQl1MzIgICByZWc7Ci0Jc3RydWN0IHsKLQkJdTMyIEZMRF9FTkRfRVZFICAgOjE7Ci0JCXUzMiBGTERfRU5EX09ERCAgIDoxOwotCQl1MzIgRkxEX1NUQVJUICAgICA6MTsKLQkJdTMyICAgICAgICAgICAgICAgOjU7Ci0JCXUzMiBGTERfRU5EX0VWRV9FTjoxOwotCQl1MzIgRkxEX0VORF9PRERfRU46MTsKLQkJdTMyIEZMRF9TVEFSVF9FTiAgOjE7Ci0JCXUzMiAgICAgICAgICAgICAgIDoyMTsKLQl9IGZsZDsKLX0gSU5UX0NTUl9SOwotCi10eXBlZGVmIHVuaW9uIG1hc2tfbGVuZ3RoX3RhZyB7Ci0JdTMyICAgcmVnOwotCXN0cnVjdCB7Ci0JCXUzMiBNQVNLX0xFTl9FVkU6NTsKLQkJdTMyICAgICAgICAgICAgIDoxMTsKLQkJdTMyIE1BU0tfTEVOX09ERDo1OwotCQl1MzIgICAgICAgICAgICAgOjExOwotCX0gZmxkOwotfSBNQVNLX0xFTkdUSF9SOwotCi10eXBlZGVmIHVuaW9uIGZpZm9fZmxhZ19jbnRfdGFnIHsKLQl1MzIgICByZWc7Ci0Jc3RydWN0IHsKLQkJdTMyIEFGX0NPVU5UOjc7Ci0JCXUzMiAgICAgICAgIDo5OwotCQl1MzIgQUVfQ09VTlQ6NzsKLQkJdTMyICAgICAgICAgOjk7Ci0JfSBmbGQ7Ci19IEZJRk9fRkxBR19DTlRfUjsKLQotdHlwZWRlZiB1bmlvbiBpaWNfY2xrX2R1ciB7Ci0JdTMyICAgcmVnOwotCXN0cnVjdCB7Ci0JCXUzMiBQSEFTRV8xOjg7Ci0JCXUzMiBQSEFTRV8yOjg7Ci0JCXUzMiBQSEFTRV8zOjg7Ci0JCXUzMiBQSEFTRV80Ojg7Ci0JfSBmbGQ7Ci19IElJQ19DTEtfRFVSX1I7Ci0KLXR5cGVkZWYgdW5pb24gaWljX2NzcjFfdGFnIHsKLQl1MzIgICByZWc7Ci0Jc3RydWN0IHsKLQkJdTMyIEFVVE9fRU4gICAgIDoxOwotCQl1MzIgQllQQVNTICAgICAgOjE7Ci0JCXUzMiBTREFfT1VUICAgICA6MTsKLQkJdTMyIFNDTF9PVVQgICAgIDoxOwotCQl1MzIgICAgICAgICAgICAgOjQ7Ci0JCXUzMiBBVVRPX0FCT1JUICA6MTsKLQkJdTMyIERJUkVDVF9BQk9SVDoxOwotCQl1MzIgU0RBX0lOICAgICAgOjE7Ci0JCXUzMiBTQ0xfSU4gICAgICA6MTsKLQkJdTMyICAgICAgICAgICAgIDo0OwotCQl1MzIgQVVUT19BRERSICAgOjg7Ci0JCXUzMiBSRF9EQVRBICAgICA6ODsKLQl9IGZsZDsKLX0gSUlDX0NTUjFfUjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGlpY19jc3IyX3RhZwotICovCi10eXBlZGVmIHVuaW9uIGlpY19jc3IyX3RhZyB7Ci0JdTMyICAgcmVnOwotCXN0cnVjdCB7Ci0JCXUzMiBESVJfV1JfREFUQSA6ODsKLQkJdTMyIERJUl9TVUJfQUREUjo4OwotCQl1MzIgRElSX1JEICAgICAgOjE7Ci0JCXUzMiBESVJfQUREUiAgICA6NzsKLQkJdTMyIE5FV19DWUNMRSAgIDoxOwotCQl1MzIgICAgICAgICAgICAgOjc7Ci0JfSBmbGQ7Ci19ICBJSUNfQ1NSMl9SOwotCi0vKiB1c2UgZm9yIGJvdGggRVZFTiBhbmQgT0REIERNQSBVUFBFUiBMSU1JVFMgKi8KLQotLyoKLSAqIGRtYV91cHBlcl9sbXRfdGFnCi0gKi8KLXR5cGVkZWYgdW5pb24gZG1hX3VwcGVyX2xtdF90YWcgICB7Ci0JdTMyIHJlZzsKLQlzdHJ1Y3QgewotCQl1MzIgRE1BX1VQUEVSX0xNVF9WQUw6MjQ7Ci0JCXUzMiAgICAgICAgICAgICAgICAgIDo4OwotCX0gZmxkOwotfSBETUFfVVBQRVJfTE1UX1I7Ci0KLQotLyoKLSAqIEdsb2JhbCBkZWNsYXJhdGlvbnMgb2YgbG9jYWwgY29waWVzIG9mIGJvYXJkcycgMzIgYml0IHJlZ2lzdGVycwotICovCi1leHRlcm4gdTMyIGV2ZW5fZG1hX3N0YXJ0X3I7CQkvKiAgYml0IDAgc2hvdWxkIGFsd2F5cyBiZSAwICovCi1leHRlcm4gdTMyIG9kZF9kbWFfc3RhcnRfcjsJCS8qICAgICAgICAgICAgICAgLi4gICAgICAgICAgKi8KLWV4dGVybiB1MzIgZXZlbl9kbWFfc3RyaWRlX3I7CS8qICBiaXRzIDAmMSBzaG91bGQgYWx3YXlzIGJlIDAgKi8KLWV4dGVybiB1MzIgb2RkX2RtYV9zdHJpZGVfcjsJCS8qICAgICAgICAgICAgICAgLi4gICAgICAgICAgICAgKi8KLWV4dGVybiB1MzIgZXZlbl9waXhlbF9mbXRfcjsKLWV4dGVybiB1MzIgb2RkX3BpeGVsX2ZtdF9yOwotCi1leHRlcm4gRklGT19UUklHR0VSX1IJCWZpZm9fdHJpZ2dlcl9yOwotZXh0ZXJuIFhGRVJfTU9ERV9SCQl4ZmVyX21vZGVfcjsKLWV4dGVybiBDU1IxX1IJCQljc3IxX3I7Ci1leHRlcm4gUkVUUllfV0FJVF9DTlRfUgkJcmV0cnlfd2FpdF9jbnRfcjsKLWV4dGVybiBJTlRfQ1NSX1IJCWludF9jc3JfcjsKLQotZXh0ZXJuIHUzMiBldmVuX2ZsZF9tYXNrX3I7Ci1leHRlcm4gdTMyIG9kZF9mbGRfbWFza19yOwotCi1leHRlcm4gTUFTS19MRU5HVEhfUgkJbWFza19sZW5ndGhfcjsKLWV4dGVybiBGSUZPX0ZMQUdfQ05UX1IJCWZpZm9fZmxhZ19jbnRfcjsKLWV4dGVybiBJSUNfQ0xLX0RVUl9SCQlpaWNfY2xrX2R1cl9yOwotZXh0ZXJuIElJQ19DU1IxX1IJCWlpY19jc3IxX3I7Ci1leHRlcm4gSUlDX0NTUjJfUgkJaWljX2NzcjJfcjsKLWV4dGVybiBETUFfVVBQRVJfTE1UX1IJCWV2ZW5fZG1hX3VwcGVyX2xtdF9yOwotZXh0ZXJuIERNQV9VUFBFUl9MTVRfUgkJb2RkX2RtYV91cHBlcl9sbXRfcjsKLQotCi0KLS8qKioqKioqKioqKioqKioqKiA4IGJpdCBJMkMgcmVnaXN0ZXIgZ2xvYmFscyAgKioqKioqKioqKiovCi0jZGVmaW5lIENTUjIJCTB4MDEwCS8qIGluZGljZXMgb2YgOC1iaXQgSTJDIG1hcHBlZCByZWcncyovCi0jZGVmaW5lIEVWRU5fQ1NSCTB4MDExCi0jZGVmaW5lIE9ERF9DU1IJCTB4MDEyCi0jZGVmaW5lIENPTkZJRwkJMHgwMTMKLSNkZWZpbmUgRFRfSUQJCTB4MDFGCi0jZGVmaW5lIFhfQ0xJUF9TVEFSVAkweDAyMAotI2RlZmluZSBZX0NMSVBfU1RBUlQJMHgwMjIKLSNkZWZpbmUgWF9DTElQX0VORAkweDAyNAotI2RlZmluZSBZX0NMSVBfRU5ECTB4MDI2Ci0jZGVmaW5lIEFEX0FERFIJCTB4MDMwCi0jZGVmaW5lIEFEX0xVVAkJMHgwMzEKLSNkZWZpbmUgQURfQ01ECQkweDAzMgotI2RlZmluZSBESUdfT1VUCQkweDA0MAotI2RlZmluZSBQTV9MVVRfQUREUgkweDA1MAotI2RlZmluZSBQTV9MVVRfREFUQQkweDA1MQotCi0KLS8qKioqKioqKiBBc3NpZ25tZW50cyBhbmQgVHlwZWRlZnMgZm9yIDggYml0IEkyQyBSZWdpc3RlcnMqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB1bmlvbiBpMmNfY3NyMl90YWcgewotCXU4IHJlZzsKLQlzdHJ1Y3QgewotCQl1OCBDSFJPTV9GSUw6MTsKLQkJdTggU1lOQ19TTlRMOjE7Ci0JCXU4IEhaNTA6MTsKLQkJdTggU1lOQ19QUkVTRU5UOjE7Ci0JCXU4IEJVU1lfRVZFOjE7Ci0JCXU4IEJVU1lfT0REOjE7Ci0JCXU4IERJU1BfUEFTUzoxOwotCX0gZmxkOwotfSBJMkNfQ1NSMjsKLQotdHlwZWRlZiB1bmlvbiBpMmNfZXZlbl9jc3JfdGFnIHsKLQl1OCAgICByZWc7Ci0Jc3RydWN0IHsKLQkJdTggRE9ORV9FVkUgOjE7Ci0JCXU4IFNOR0xfRVZFIDoxOwotCQl1OCBFUlJPUl9FVkU6MTsKLQkJdTggICAgICAgICAgOjU7Ci0JfSBmbGQ7Ci19IEkyQ19FVkVOX0NTUjsKLQotdHlwZWRlZiB1bmlvbiBpMmNfb2RkX2Nzcl90YWcgewotCXU4IHJlZzsKLQlzdHJ1Y3QgewotCQl1OCBET05FX09ERDoxOwotCQl1OCBTTkdMX09ERDoxOwotCQl1OCBFUlJPUl9PREQ6MTsKLQkJdTggOjU7Ci0JfSBmbGQ7Ci19IEkyQ19PRERfQ1NSOwotCi10eXBlZGVmIHVuaW9uIGkyY19jb25maWdfdGFnIHsKLQl1OCByZWc7Ci0Jc3RydWN0IHsKLQkJdTggQUNRX01PREU6MjsKLQkJdTggRVhUX1RSSUdfRU46MTsKLQkJdTggRVhUX1RSSUdfUE9MOjE7Ci0JCXU4IEhfU0NBTEU6MTsKLQkJdTggQ0xJUDoxOwotCQl1OCBQTV9MVVRfU0VMOjE7Ci0JCXU4IFBNX0xVVF9QR006MTsKLQl9IGZsZDsKLX0gSTJDX0NPTkZJRzsKLQotCi10eXBlZGVmIHVuaW9uIGkyY19hZF9jbWRfdGFnIHsKLQkvKiBiaXRzIGNhbiBoYXZlIDMgZGlmZmVyZW50IG1lYW5pbmdzIGRlcGVuZGluZyBvbiB2YWx1ZSBvZiBBRF9BRERSICovCi0JdTggcmVnOwotCS8qIEJ0MjUyIENvbW1hbmQgUmVnaXN0ZXIgaWYgQURfQUREUiA9IDAwaCAqLwotCXN0cnVjdCB7Ci0JCXU4ICAgICAgICAgICAgIDoyOwotCQl1OCBTWU5DX0xWTF9TRUw6MjsKLQkJdTggU1lOQ19DTkxfU0VMOjI7Ci0JCXU4IERJR0lUSVpFX0NOTF9TRUwxOjI7Ci0JCX0gYnQyNTJfY29tbWFuZDsKLQotCS8qIEJ0MjUyIElPVVQwIHJlZ2lzdGVyIGlmIEFEX0FERFIgPSAwMWggKi8KLQlzdHJ1Y3QgewotCQl1OCBJT1VUX0RBVEE6ODsKLQl9IGJ0MjUyX2lvdXQwOwotCi0JLyogQlQyNTIgSU9VVDEgcmVnaXN0ZXIgaWYgQURfQUREUiA9IDAyaCAqLwotCXN0cnVjdCB7Ci0JCXU4IElPVVRfREFUQTo4OwotCX0gYnQyNTJfaW91dDE7Ci19IEkyQ19BRF9DTUQ7Ci0KLQotLyoqKioqIEdsb2JhbCBkZWNsYXJhdGlvbnMgb2YgbG9jYWwgY29waWVzIG9mIGJvYXJkcycgOCBiaXQgSTJDIHJlZ2lzdGVycyAqKiovCi0KLWV4dGVybiBJMkNfQ1NSMgkJCWkyY19jc3IyOwotZXh0ZXJuIEkyQ19FVkVOX0NTUgkJaTJjX2V2ZW5fY3NyOwotZXh0ZXJuIEkyQ19PRERfQ1NSCQlpMmNfb2RkX2NzcjsKLWV4dGVybiBJMkNfQ09ORklHCQlpMmNfY29uZmlnOwotZXh0ZXJuIHU4CQkJaTJjX2R0X2lkOwotZXh0ZXJuIHU4CQkJaTJjX3hfY2xpcF9zdGFydDsKLWV4dGVybiB1OAkJCWkyY195X2NsaXBfc3RhcnQ7Ci1leHRlcm4gdTgJCQlpMmNfeF9jbGlwX2VuZDsKLWV4dGVybiB1OAkJCWkyY195X2NsaXBfZW5kOwotZXh0ZXJuIHU4CQkJaTJjX2FkX2FkZHI7Ci1leHRlcm4gdTgJCQlpMmNfYWRfbHV0OwotZXh0ZXJuIEkyQ19BRF9DTUQJCWkyY19hZF9jbWQ7Ci1leHRlcm4gdTgJCQlpMmNfZGlnX291dDsKLWV4dGVybiB1OAkJCWkyY19wbV9sdXRfYWRkcjsKLWV4dGVybiB1OAkJCWkyY19wbV9sdXRfZGF0YTsKLQotLyogRnVuY3Rpb25zIGZvciBHbG9iYWwgdXNlICovCi0KLS8qIGFjY2VzcyA4LWJpdCBJSUMgcmVnaXN0ZXJzICovCi0KLWV4dGVybiBpbnQgUmVhZEkyQyh1OCAqbHBSZWcsIHVfc2hvcnQgd0lyZWdJbmRleCwgdTggKmJ5VmFsKTsKLWV4dGVybiBpbnQgV3JpdGVJMkModTggKmxwUmVnLCB1X3Nob3J0IHdJcmVnSW5kZXgsIHU4IGJ5VmFsKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NV9pc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2lzci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RkYzljLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTUvZHQzMTU1X2lzci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAxOTk2LDIwMDIsMjAwNSBHcmVnb3J5IEQuIEhhZ2VyLCBBbGZyZWQgQS4gUml6emksIE5vYWggSi4gQ293YW4sCi0JCQkJSmFzb24gTGFwZW50YSwgU2NvdHQgU21lZGxleSwgR3JlZyBTaGFycAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRFQzMTU1IERldmljZSBEcml2ZXIuCi0KLVRoZSBEVDMxNTUgRGV2aWNlIERyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBEVDMxNTUgRGV2aWNlIERyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLXVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLW9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBEVDMxNTUgRGV2aWNlIERyaXZlcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLU1BIDAyMTExLTEzMDcgVVNBCi0KLSAgIEZpbGU6IGR0MzE1NV9pc3IuYwotUHVycG9zZTogQnVmZmVyIG1hbmFnZW1lbnQgcm91dGluZXMsIGFuZCBvdGhlciByb3V0aW5lcyBmb3IgdGhlIElTUgotCQkodGhlIGFjdHVhbCBpc3IgaXMgaW4gZHQzMTU1X2Rydi5jKQotCi0tLSBDaGFuZ2VzIC0tCi0KLSAgRGF0ZSAgICAgICBQcm9ncmFtbWVyICBEZXNjcmlwdGlvbiBvZiBjaGFuZ2VzIG1hZGUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAwMy1KdWwtMjAwMCBKTUwgICAgICAgbi9hCi0gIDAyLUFwci0yMDAyIFNTICAgICAgICBNb2RzIHRvIG1ha2Ugd29yayB3aXRoIHNlcGFyYXRlIGFsbG9jYXRvcgotCQkJbW9kdWxlOyBNZXJnZWQgSm9obiBSb2xsJ3MgbW9kcyB0byBtYWtlIHdvcmsgd2l0aAotCQkJbXVsdGlwbGUgYm9hcmRzLgotICAxMC1KdWwtMjAwMiBHQ1MgICAgICAgQ29tcGxldGUgcmV3cml0ZSBvZiBzZXR1cF9idWZmZXJzIHRvIGRpc2FsbG93Ci0JCQlidWZmZXJzIHdoaWNoIHNwYW4gYSA0TUIgYm91bmRhcnkuCi0gIDI0LUp1bC0yMDAyIFNTICAgICAgICBHUEwgbGljZW5jZS4KLSAgMzAtSnVsLTIwMDIgTkpDICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGJ1ZmZlciBsb29wLgotICAzMS1KdWwtMjAwMiBOSkMgICAgICAgQ29tcGxldGUgcmV3cml0ZSBvZiBidWZmZXIgbWFuYWdlbWVudAotICAwMi1BdWctMjAwMiBOSkMgICAgICAgSW5jbHVkaW5nIHNsYWIuaCBpbnN0ZWFkIG9mIG1hbGxvYy5oIChubyB3YXJuaW5nKS4KLQkJCUFsc28sIGFsbG9jYXRvcl9pbml0KCkgbm93IHJldHVybnMgYWxsb2NhdG9yX21heAotCQkJc28gY2xlYW5lZCB1cCBhbGxvY2F0ZV9idWZmZXJzKCkgYWNjb3JkaW5nbHkuCi0gIDA4LUF1Zy0yMDA1IFNTICAgICAgICBwb3J0IHRvIDIuNiBrZXJuZWwuCi0KLSovCi0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaW5jbHVkZSAiZHQzMTU1LmgiCi0jaW5jbHVkZSAiZHQzMTU1X2Rydi5oIgotI2luY2x1ZGUgImR0MzE1NV9pby5oIgotI2luY2x1ZGUgImR0MzE1NV9pc3IuaCIKLSNpbmNsdWRlICJhbGxvY2F0b3IuaCIKLQotI2RlZmluZSBGT1VSX01CICAgICAgICAgKDB4MDQwMDAwMCkgIC8qIENhbid0IERNQSBhY2Nyb3NzIGEgNE1CIGJvdW5kYXJ5ISovCi0jZGVmaW5lIFVQUEVSXzEwX0JJVFMgICAoMHgzRkY8PDIyKSAgLyogQ2FuJ3QgRE1BIGFjY3Jvc3MgYSA0TUIgYm91bmRhcnkhKi8KLQotCi0vKiBQb2ludGVyIGludG8gZ2xvYmFsIHN0cnVjdHVyZSBmb3IgaGFuZGxpbmcgYnVmZmVycyAqLwotc3RydWN0IGR0MzE1NV9mYnVmZmVyICpkdDMxNTVfZmJ1ZmZlcltNQVhCT0FSRFNdID0ge05VTEwKLSNpZiBNQVhCT0FSRFMgPT0gMgotCQkJCQkJICAgICAgLCBOVUxMCi0jZW5kaWYKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNpbXBsZSBhcnJheSBiYXNlZCBxdWUgc3RydWN0Ci0gKgotICogU29tZSBoYW5keSBmdW5jdGlvbnMgdXNpbmcgdGhlIGJ1ZmZlcmluZyBzdHJ1Y3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYXJlX2VtcHR5X2J1ZmZlcnMKLSAqIG0gaXMgbWlub3IgIyBvZiBkZXZpY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGFyZV9lbXB0eV9idWZmZXJzKGludCBtKQotewotICByZXR1cm4gZHQzMTU1X2ZidWZmZXJbbV0tPmVtcHR5X2xlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwdXNoX2VtcHR5Ci0gKiBtIGlzIG1pbm9yICMgb2YgZGV2aWNlCi0gKgotICogVGhpcyBpcyBzbGlnaHRseSBjb25mdXNpbmcuICBUaGUgbnVtYmVyIGVtcHR5X2xlbiBpcyB0aGUgbGl0ZXJhbCAjCi0gKiBvZiBlbXB0eSBidWZmZXJzLiAgQWZ0ZXIgY2FsbGluZywgZW1wdHlfbGVuLTEgaXMgdGhlIGluZGV4IGludG8gdGhlCi0gKiBlbXB0eSBidWZmZXIgc3RhY2suICBTbywgaWYgZW1wdHlfbGVuID09IDEsIHRoZXJlIGlzIG9uZSBlbXB0eSBidWZmZXIsCi0gKiBnaXZlbiBieSBkdDMxNTVfZmJ1ZmZlclttXS0+ZW1wdHlfYnVmZmVyc1swXS4KLSAqIGVtcHR5X2J1ZmZlcnMgc2hvdWxkIG5ldmVyIGZpbGwgdXAsIHRob3VnaCB0aGlzIGlzIG5vdCBjaGVja2VkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwdXNoX2VtcHR5KGludCBpbmRleCwgaW50IG0pCi17Ci0gIGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9idWZmZXJzW2R0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9sZW5dID0gaW5kZXg7Ci0gIGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9sZW4rKzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwb3BfZW1wdHkobSkKLSAqIG0gaXMgbWlub3IgIyBvZiBkZXZpY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBwb3BfZW1wdHkoaW50IG0pCi17Ci0gIGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9sZW4tLTsKLSAgcmV0dXJuIGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9idWZmZXJzW2R0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9sZW5dOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKgotICogaXNfcmVhZHlfYnVmX2VtcHR5KG0pCi0gKiBtIGlzIG1pbm9yICMgb2YgZGV2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgaXNfcmVhZHlfYnVmX2VtcHR5KGludCBtKQotewotICByZXR1cm4gKChkdDMxNTVfZmJ1ZmZlclttXS0+cmVhZHlfbGVuKSA9PSAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGlzX3JlYWR5X2J1Zl9mdWxsKG0pCi0gKiBtIGlzIG1pbm9yICMgb2YgZGV2aWNlCi0gKiB0aGlzIHNob3VsZCAqbmV2ZXIqIGJlIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhY3RpdmUsIGxvY2tlZCBvciBlbXB0eQotICogYnVmZmVycywgc2luY2UgaXQgY29ycmVzcG9uZHMgdG8gbmJ1ZmZlcnMgcmVhZHkgYnVmZmVycyEhCi0gKiA3LzMxLzAyOiB0b3RhbCByZXdyaXRlLiAtLU5KQwotICoqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGlzX3JlYWR5X2J1Zl9mdWxsKGludCBtKQotewotICByZXR1cm4gZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X2xlbiA9PSBkdDMxNTVfZmJ1ZmZlclttXS0+bmJ1ZmZlcnM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHVzaF9yZWFkeShtLCBidWZmZXIpCi0gKiBtIGlzIG1pbm9yICMgb2YgZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwdXNoX3JlYWR5KGludCBtLCBpbnQgaW5kZXgpCi17Ci0gIGludCBoZWFkID0gZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X2hlYWQ7Ci0KLSAgZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X3F1ZVtoZWFkXSA9IGluZGV4OwotICBkdDMxNTVfZmJ1ZmZlclttXS0+cmVhZHlfaGVhZCA9ICgoaGVhZCArIDEpICUKLQkJCQkgICAgICAoZHQzMTU1X2ZidWZmZXJbbV0tPm5idWZmZXJzKSk7Ci0gIGR0MzE1NV9mYnVmZmVyW21dLT5yZWFkeV9sZW4rKzsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGdldF90YWlsKCkKLSAqIG0gaXMgbWlub3IgIyBvZiBkZXZpY2UKLSAqCi0gKiBTaW1wbHkgY29tcHR1dGVzIHRoZSB0YWlsIGdpdmVuIHRoZSBoZWFkIGFuZCB0aGUgbGVuZ3RoLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBnZXRfdGFpbChpbnQgbSkKLXsKLSAgcmV0dXJuIChkdDMxNTVfZmJ1ZmZlclttXS0+cmVhZHlfaGVhZCAtCi0JICAgZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X2xlbiArCi0JICAgZHQzMTU1X2ZidWZmZXJbbV0tPm5idWZmZXJzKSUKLQkgIChkdDMxNTVfZmJ1ZmZlclttXS0+bmJ1ZmZlcnMpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwb3BfcmVhZHkoKQotICogbSBpcyBtaW5vciAjIG9mIGRldmljZQotICoKLSAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgcmVhZHkgYnVmZmVyIHJlYWR5Li4uIHNob3VsZAotICogYmUgY2hlY2tlZCAoZS5nLiB3aXRoIGlzX3JlYWR5X2J1Zl9lbXB0eSgpICBwcmlvciB0byBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHBvcF9yZWFkeShpbnQgbSkKLXsKLSAgaW50IHRhaWw7Ci0gIHRhaWwgPSBnZXRfdGFpbChtKTsKLSAgZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X2xlbi0tOwotICByZXR1cm4gZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X3F1ZVt0YWlsXTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByaW50cXVlcwotICogbSBpcyBtaW5vciAjIG9mIGRldmljZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcmludHF1ZXMoaW50IG0pCi17Ci0gIGludCBoZWFkID0gZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X2hlYWQ7Ci0gIGludCB0YWlsOwotICBpbnQgbnVtID0gZHQzMTU1X2ZidWZmZXJbbV0tPm5idWZmZXJzOwotICBpbnQgZnJhbWVfaW5kZXg7Ci0gIGludCBpbmRleDsKLQotICB0YWlsID0gZ2V0X3RhaWwobSk7Ci0KLSAgcHJpbnRrKCJcbiBSOiIpOwotICAgIGZvciAoaW5kZXggPSB0YWlsOyBpbmRleCAhPSBoZWFkOyBpbmRleCsrLCBpbmRleCA9IGluZGV4ICUgKG51bSkpIHsKLQlmcmFtZV9pbmRleCA9IGR0MzE1NV9mYnVmZmVyW21dLT5yZWFkeV9xdWVbaW5kZXhdOwotCXByaW50aygiICVkICIsIGZyYW1lX2luZGV4KTsKLSAgICB9Ci0KLSAgcHJpbnRrKCJcbiBFOiIpOwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9sZW47IGluZGV4KyspIHsKLQlmcmFtZV9pbmRleCA9IGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9idWZmZXJzW2luZGV4XTsKLQlwcmludGsoIiAlZCAiLCBmcmFtZV9pbmRleCk7Ci0gICAgfQotCi0gIGZyYW1lX2luZGV4ID0gZHQzMTU1X2ZidWZmZXJbbV0tPmFjdGl2ZV9idWY7Ci0gIHByaW50aygiXG4gQTogJWQiLCBmcmFtZV9pbmRleCk7Ci0KLSAgZnJhbWVfaW5kZXggPSBkdDMxNTVfZmJ1ZmZlclttXS0+bG9ja2VkX2J1ZjsKLSAgcHJpbnRrKCJcbiBMOiAlZFxuIiwgZnJhbWVfaW5kZXgpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYWRqdXN0XzRNQgotICoKLSAqICBJZiBhIGJ1ZmZlciBpbnRlcnNlY3RzIHRoZSA0TUIgYm91bmRhcnksIHB1c2gKLSAqICB0aGUgc3RhcnQgYWRkcmVzcyB1cCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICogIG5leHQgNE1CIGNodW5rIChhc3N1bWluZyBidWZzaXplIDwgNE1CKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBhZGp1c3RfNE1CKHUzMiBidWZfYWRkciwgdTMyIGJ1ZnNpemUpCi17Ci0gICAgaWYgKCgoYnVmX2FkZHIrYnVmc2l6ZSkgJiBVUFBFUl8xMF9CSVRTKSAhPSAoYnVmX2FkZHIgJiBVUFBFUl8xMF9CSVRTKSkKLQlyZXR1cm4gKGJ1Zl9hZGRyK2J1ZnNpemUpICYgVVBQRVJfMTBfQklUUzsKLSAgICBlbHNlCi0JcmV0dXJuIGJ1Zl9hZGRyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYWxsb2NhdGVfYnVmZmVycwotICoKLSAqICBUcnkgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgYWxsIHJlcXVlc3RlZAotICogIGJ1ZmZlcnMuICBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGZyZWUgc3BhY2UKLSAqICB0cnkgZm9yIGxlc3MgbWVtb3J5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhbGxvY2F0ZV9idWZmZXJzKHUzMiAqYnVmX2FkZHIsIHUzMiogdG90YWxfc2l6ZV9rYnMsCi0JCSAgICAgICB1MzIgYnVmc2l6ZSkKLXsKLSAgLyogQ29tcHV0ZSB0aGUgbWluaW11bSBhbW91bnQgb2YgbWVtb3J5IGd1YXJhbnRlZWQgdG8gaG9sZCBhbGwKLSAgICAgTUFYQlVGRkVSUyBzdWNoIHRoYXQgbm8gYnVmZmVyIGNyb3NzZXMgdGhlIDRNQiBib3VuZGFyeS4KLSAgICAgU3RvcmUgdGhpcyB2YWx1ZSBpbiB0aGUgdmFyaWFibGUgImZ1bGxfc2l6ZSIgKi8KLQotICB1MzIgYWxsb2NhdG9yX21heDsKLSAgdTMyIGJ1ZnNfcGVyX2NodW5rID0gKEZPVVJfTUIgLyBidWZzaXplKTsKLSAgdTMyIGZpbGxlZF9jaHVua3MgPSAoTUFYQlVGRkVSUy0xKSAvIGJ1ZnNfcGVyX2NodW5rOwotICB1MzIgbGVmdG92ZXJfYnVmcyA9IE1BWEJVRkZFUlMgLSBmaWxsZWRfY2h1bmtzICogYnVmc19wZXJfY2h1bms7Ci0KLSAgdTMyIGZ1bGxfc2l6ZSA9IGJ1ZnNpemUgICAgICAvKiBwb3NzaWJseSB1bnVzYWJsZSBwYXJ0IG9mIDFzdCBjaHVuayAqLwotICAgICsgZmlsbGVkX2NodW5rcyAqIEZPVVJfTUIgICAvKiBtYXggIyBvZiBjb21wbGV0ZWx5IGZpbGxlZCA0bWIgY2h1bmtzICovCi0gICAgKyBsZWZ0b3Zlcl9idWZzICogYnVmc2l6ZTsgIC8qIHRoZXNlIGJ1ZmZzIHdpbGwgYmUgaW4gYSBwYXJ0bHkgZmlsbGVkCi0JCQkJICAgY2h1bmsgYXQgYmVnaW5uaW5nIG9yIGVuZCAqLwotCi0gIHUzMiBmdWxsX3NpemVfa2JzID0gMSArIChmdWxsX3NpemUtMSkgLyAxMDI0OwotICB1MzIgbWluX3NpemVfa2JzID0gMipuZGV2aWNlcypidWZzaXplIC8gMTAyNDsKLSAgdTMyIHNpemVfa2JzOwotCi0gIC8qIE5vdywgdHJ5IHRvIGFsbG9jYXRlIGZ1bGxfc2l6ZS4gIElmIHRoaXMgZmFpbHMsIGtlZXAgdHJ5aW5nIGZvcgotICAgICBsZXNzICYgbGVzcyBtZW1vcnkgdW50aWwgaXQgc3VjY2VlZHMuICovCi0jaWZuZGVmIFNUQU5EQUxPTkVfQUxMT0NBVE9SCi0gIC8qIGluaXRpYWxpemUgdGhlIGFsbG9jYXRvciAgICAgICAgICAgICovCi0gIGFsbG9jYXRvcl9pbml0KCZhbGxvY2F0b3JfbWF4KTsKLSNlbmRpZgotICBzaXplX2ticyA9IGZ1bGxfc2l6ZV9rYnM7Ci0gICpidWZfYWRkciA9IDA7Ci0gIHByaW50aygiRFQzMTU1OiBXZSB3b3VsZCBsaWtlIHRvIGdldDogJWQgS0JcbiIsIGZ1bGxfc2l6ZV9rYnMpOwotICBwcmludGsoIkRUMzE1NTogLi4uYnV0IG5lZWQgYXQgbGVhc3Q6ICVkIEtCXG4iLCBtaW5fc2l6ZV9rYnMpOwotICBwcmludGsoIkRUMzE1NTogLi4udGhlIGFsbG9jYXRvciBoYXM6ICVkIEtCXG4iLCBhbGxvY2F0b3JfbWF4KTsKLSAgc2l6ZV9rYnMgPSAoZnVsbF9zaXplX2ticyA8PSBhbGxvY2F0b3JfbWF4ID8gZnVsbF9zaXplX2ticyA6IGFsbG9jYXRvcl9tYXgpOwotICAgIGlmIChzaXplX2ticyA+IG1pbl9zaXplX2ticykgewotCWlmICgoKmJ1Zl9hZGRyID0gYWxsb2NhdG9yX2FsbG9jYXRlX2RtYShzaXplX2ticywgR0ZQX0tFUk5FTCkpICE9IDApIHsKLQkJcHJpbnRrKCJEVDMxNTU6ICBNYW5hZ2VkIHRvIGFsbG9jYXRlOiAlZCBLQlxuIiwgc2l6ZV9rYnMpOwotCQkqdG90YWxfc2l6ZV9rYnMgPSBzaXplX2ticzsKLQkJcmV0dXJuOwotCX0KLSAgICB9Ci0gIC8qIElmIHdlIGdvdCBoZXJlLCB0aGUgYWxsb2NhdGlvbiBmYWlsZWQgKi8KLSAgcHJpbnRrKCJEVDMxNTU6IEFsbG9jYXRvciBmYWlsZWQhXG4iKTsKLSAgKmJ1Zl9hZGRyID0gMDsKLSAgKnRvdGFsX3NpemVfa2JzID0gMDsKLSAgcmV0dXJuOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkdDMxNTVfc2V0dXBfYnVmZmVycwotICoKLSAqICBzZXR1cF9idWZmZXJzIGp1c3QgcHV0cyB0aGUgYnVmZmVyaW5nIHN5c3RlbSBpbnRvCi0gKiAgYSBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSB0aGUgc3RhcnQgb2YgaW50ZXJydXB0cwotICoKLSAqIEpNTCA6IGl0IGxvb2tzIGxpa2UgYWxsIHRoZSBidWZmZXJzIG5lZWQgdG8gYmUKLSAqIGNvbnRpbnVvdXMuIFNvIEknbSBnb2luZyB0byB0cnkgYW5kIGFsbG9jYXRlIG9uZQotICogY29udGludW91cyBidWZmZXIuCi0gKgotICogR0NTIDogRml4IERNQSBwcm9ibGVtcyB3aGVuIGJ1ZmZlciBzcGFucwotICogNE1CIGJvdW5kYXJ5LiAgQWxzbywgYWRkIGVycm9yIGNoZWNraW5nLiAgVGhpcwotICogZnVuY3Rpb24gd2lsbCByZXR1cm4gLUVOT01FTSB3aGVuIG5vdCBlbm91Z2ggbWVtb3J5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGR0MzE1NV9zZXR1cF9idWZmZXJzKHUzMiAqYWxsb2NhdG9yQWRkcikKLQotewotICB1MzIgaW5kZXg7Ci0gIHUzMiByYW1idWZmX2FkZHI7IC8qIHN0YXJ0IG9mIGFsbG9jYXRpb24gKi8KLSAgdTMyIHJhbWJ1ZmZfc2l6ZTsgLyogdG90YWwgc2l6ZSBhbGxvY2F0ZWQgdG8gZHJpdmVyICovCi0gIHUzMiByYW1idWZmX2FjbTsgIC8qIGFjY3VtbGF0b3IsIGtlZXAgdHJhY2sgb2YgaG93IG11Y2gKLQkJCSAgaXMgbGVmdCBhZnRlciBiZWluZyBzcGxpdCB1cCovCi0gIHUzMiByYW1idWZmX2VuZDsgIC8qIGVuZCBvZiByYW1idWZmICovCi0gIHUzMiBudW1idWZzOyAgICAgIC8qIG51bWJlciBvZiB1c2VmdWwgYnVmZmVycyBhbGxvY2F0ZWQgKHBlciBkZXZpY2UpICovCi0gIHUzMiBidWZzaXplICAgICAgPSBEVDMxNTVfTUFYX1JPV1MgKiBEVDMxNTVfTUFYX0NPTFM7Ci0gIGludCBtOyAgICAgICAgICAgICAgIC8qIG1pbm9yICMgb2YgZGV2aWNlLCBsb29wZWQgZm9yIGFsbCBkZXZzICovCi0KLSAgLyogemVybyB0aGUgZmJ1ZmZlciBzdGF0dXMgYW5kIGFkZHJlc3Mgc3RydWN0dXJlICovCi0gICAgZm9yIChtID0gMDsgbSA8IG5kZXZpY2VzOyBtKyspIHsKLQlkdDMxNTVfZmJ1ZmZlclttXSA9ICYoZHQzMTU1X3N0YXR1c1ttXS5mYnVmZmVyKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBidWZmZXJpbmcgdmFyaWFibGVzIGFyZSBjb25zaXN0ZW50ICovCi0gICAgICB7Ci0JdTggKnB0ciA9ICh1OCAqKSBkdDMxNTVfZmJ1ZmZlclttXTsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZW9mKHN0cnVjdCBkdDMxNTVfZmJ1ZmZlcik7IGluZGV4KyspCi0JCQkqKHB0cisrKSA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qIGFsbG9jYXRlIGEgbGFyZ2UgY29udGlndW91cyBjaHVuayBvZiBSQU0gKi8KLSAgYWxsb2NhdGVfYnVmZmVycygmcmFtYnVmZl9hZGRyLCAmcmFtYnVmZl9zaXplLCBidWZzaXplKTsKLSAgcHJpbnRrKCJEVDMxNTU6IG1lbSBpbmZvXG4iKTsKLSAgcHJpbnRrKCIgIC0gcmFtYnVmX2FkZHIgPSAweCV4XG4iLCByYW1idWZmX2FkZHIpOwotICBwcmludGsoIiAgLSBsZW5ndGggKGtiKSA9ICV1XG4iLCByYW1idWZmX3NpemUpOwotICAgIGlmIChyYW1idWZmX2FkZHIgPT0gMCkgewotCXByaW50ayhLRVJOX0lORk8KLQkgICAgIkRUMzE1NTogRXJyb3Igc2V0dXBfYnVmZmVycygpIGFsbG9jYXRvciBkbWEgZmFpbGVkXG4iKTsKLQlyZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0gICphbGxvY2F0b3JBZGRyID0gcmFtYnVmZl9hZGRyOwotICByYW1idWZmX2VuZCA9IHJhbWJ1ZmZfYWRkciArIDEwMjQgKiByYW1idWZmX3NpemU7Ci0KLSAgLyogYWZ0ZXIgYWxsb2NhdGlvbiwgd2UgbmVlZCB0byBjb3VudCBob3cgbWFueSB1c2VmdWwgYnVmZmVycyB0aGVyZQotICAgICBhcmUgc28gd2UgY2FuIGdpdmUgYW4gZXF1YWwgbnVtYmVyIHRvIGVhY2ggZGV2aWNlICovCi0gIHJhbWJ1ZmZfYWNtID0gcmFtYnVmZl9hZGRyOwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWEJVRkZFUlM7IGluZGV4KyspIHsKLQlyYW1idWZmX2FjbSA9IGFkanVzdF80TUIocmFtYnVmZl9hY20sIGJ1ZnNpemUpOy8qYXZvaWQgc3Bhbm5pbmcgNE1CIGJkcnkqLwotCWlmIChyYW1idWZmX2FjbSArIGJ1ZnNpemUgPiByYW1idWZmX2VuZCkKLQkJYnJlYWs7Ci0JcmFtYnVmZl9hY20gKz0gYnVmc2l6ZTsKLSAgICB9Ci0gIC8qIEZvbGxvd2luZyBsaW5lIGlzIE9LLCB3aWxsIHdhc3RlIGJ1ZmZlcnMgaWYgaW5kZXgKLSAgICogbm90IGV2ZW5seSBkaXZpc2libGUgYnkgbmRldmljZXMgLU5KQyovCi0gIG51bWJ1ZnMgPSBpbmRleCAvIG5kZXZpY2VzOwotICBwcmludGsoIiAgLSBudW1idWZzID0gJXVcbiIsIG51bWJ1ZnMpOwotICAgIGlmIChudW1idWZzIDwgMikgewotCXByaW50ayhLRVJOX0lORk8KLQkiRFQzMTU1OiBFcnJvciBzZXR1cF9idWZmZXJzKCkgY291bGRuJ3QgYWxsb2NhdGUgMiBidWZzL2JvYXJkXG4iKTsKLQlyZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgd2UgaGF2ZSBib2FyZCBtZW1vcnkgd2Ugc3BpdCBpdCB1cCAqLwotICAvKiBiZXR3ZWVuIHRoZSBib2FyZHMgYW5kIHRoZSBidWZmZXJzICAgICAgICAgICovCi0gICAgcmFtYnVmZl9hY20gPSByYW1idWZmX2FkZHI7Ci0gICAgZm9yIChtID0gMDsgbSA8IG5kZXZpY2VzOyBtKyspIHsKLQlyYW1idWZmX2FjbSA9IGFkanVzdF80TUIocmFtYnVmZl9hY20sIGJ1ZnNpemUpOwotCi0JLyogU2F2ZSB0aGUgc3RhcnQgb2YgdGhpcyBib2FyZHMgYnVmZmVyIHNwYWNlIChmb3IgbW1hcCkuICAqLwotCWR0MzE1NV9zdGF0dXNbbV0ubWVtX2FkZHIgPSByYW1idWZmX2FjbTsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJ1ZnM7IGluZGV4KyspIHsKLQkJcmFtYnVmZl9hY20gPSBhZGp1c3RfNE1CKHJhbWJ1ZmZfYWNtLCBidWZzaXplKTsKLQkJaWYgKHJhbWJ1ZmZfYWNtICsgYnVmc2l6ZSA+IHJhbWJ1ZmZfZW5kKSB7Ci0JCQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCi0JCQlwcmludGsoIkRUMzE1NSBQUk9HUkFNIEVSUk9SIChHQ1MpXG4iCi0JCQkiRXJyb3IgZGlzdHJpYnV0aW5nIGFsbG9jYXRlZCBidWZmZXJzXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJZHQzMTU1X2ZidWZmZXJbbV0tPmZyYW1lX2luZm9baW5kZXhdLmFkZHIgPSByYW1idWZmX2FjbTsKLQkJcHVzaF9lbXB0eShpbmRleCwgbSk7Ci0JCS8qIHByaW50aygiICAtIEJ1ZmZlciA6ICVseFxuIiwKLQkJKiBkdDMxNTVfZmJ1ZmZlclttXS0+ZnJhbWVfaW5mb1tpbmRleF0uYWRkcik7Ci0JCSovCi0JCWR0MzE1NV9mYnVmZmVyW21dLT5uYnVmZmVycyArPSAxOwotCQlyYW1idWZmX2FjbSArPSBidWZzaXplOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhbiBhY3RpdmUgYnVmZmVyIHRoZXJlLiAqLwotCWR0MzE1NV9mYnVmZmVyW21dLT5hY3RpdmVfYnVmICAgID0gcG9wX2VtcHR5KG0pOwotCWR0MzE1NV9mYnVmZmVyW21dLT5ldmVuX2hhcHBlbmVkID0gMDsKLQlkdDMxNTVfZmJ1ZmZlclttXS0+ZXZlbl9zdG9wcGVkICA9IDA7Ci0KLQkvKiBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gbG9ja2VkX2J1ZiBKTUwgMi8yOC8wMCAqLwotCWR0MzE1NV9mYnVmZmVyW21dLT5sb2NrZWRfYnVmID0gLTE7Ci0KLQlkdDMxNTVfc3RhdHVzW21dLm1lbV9zaXplID0KLQlyYW1idWZmX2FjbSAtIGR0MzE1NV9zdGF0dXNbbV0ubWVtX2FkZHI7Ci0KLQkvKiBzZXR1cCB0aGUgcmVhZHkgcXVldWUgKi8KLQlkdDMxNTVfZmJ1ZmZlclttXS0+cmVhZHlfaGVhZCA9IDA7Ci0JZHQzMTU1X2ZidWZmZXJbbV0tPnJlYWR5X2xlbiA9IDA7Ci0JcHJpbnRrKCJBdmFpbGFibGUgYnVmZmVycyBmb3IgZGV2aWNlICVkOiAlZFxuIiwKLQkgICAgbSwgZHQzMTU1X2ZidWZmZXJbbV0tPm5idWZmZXJzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBpbnRlcm5hbF9yZWxlYXNlX2xvY2tlZF9idWZmZXIKLSAqCi0gKiBUaGUgaW50ZXJuYWwgZnVuY3Rpb24gZm9yIHJlbGVhc2luZyBhIGxvY2tlZCBidWZmZXIuCi0gKiBJdCBhc3N1bWVzIGludGVycnVwdHMgYXJlIHR1cm5lZCBvZmYuCi0gKgotICogbSBpcyBtaW5vciBudW1iZXIgb2YgZGV2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbnRlcm5hbF9yZWxlYXNlX2xvY2tlZF9idWZmZXIoaW50IG0pCi17Ci0gIC8qIFBvaW50ZXIgaW50byBnbG9iYWwgc3RydWN0dXJlIGZvciBoYW5kbGluZyBidWZmZXJzICovCi0gICAgaWYgKGR0MzE1NV9mYnVmZmVyW21dLT5sb2NrZWRfYnVmID49IDApIHsKLQlwdXNoX2VtcHR5KGR0MzE1NV9mYnVmZmVyW21dLT5sb2NrZWRfYnVmLCBtKTsKLQlkdDMxNTVfZmJ1ZmZlclttXS0+bG9ja2VkX2J1ZiA9IC0xOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGR0MzE1NV9yZWxlYXNlX2xvY2tlZF9idWZmZXIoKQotICogbSBpcyBtaW5vciAjIG9mIGRldmljZQotICoKLSAqIFRoZSB1c2VyIGZ1bmN0aW9uIG9mIHRoZSBhYm92ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGR0MzE1NV9yZWxlYXNlX2xvY2tlZF9idWZmZXIoaW50IG0pCi17Ci0JdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7Ci0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpbnRlcm5hbF9yZWxlYXNlX2xvY2tlZF9idWZmZXIobSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZHQzMTU1X2ZsdXNoKCkKLSAqIG0gaXMgbWlub3IgIyBvZiBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZHQzMTU1X2ZsdXNoKGludCBtKQotewotICBpbnQgaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOwotICBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLSAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotICBpbnRlcm5hbF9yZWxlYXNlX2xvY2tlZF9idWZmZXIobSk7Ci0gIGR0MzE1NV9mYnVmZmVyW21dLT5lbXB0eV9sZW4gPSAwOwotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZHQzMTU1X2ZidWZmZXJbbV0tPm5idWZmZXJzOyBpbmRleCsrKQotCXB1c2hfZW1wdHkoaW5kZXgsICBtKTsKLQotICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYW4gYWN0aXZlIGJ1ZmZlciB0aGVyZS4gKi8KLSAgZHQzMTU1X2ZidWZmZXJbbV0tPmFjdGl2ZV9idWYgPSBwb3BfZW1wdHkobSk7Ci0KLSAgZHQzMTU1X2ZidWZmZXJbbV0tPmV2ZW5faGFwcGVuZWQgPSAwOwotICBkdDMxNTVfZmJ1ZmZlclttXS0+ZXZlbl9zdG9wcGVkICA9IDA7Ci0KLSAgLyogc2V0dXAgdGhlIHJlYWR5IHF1ZXVlICAqLwotICBkdDMxNTVfZmJ1ZmZlclttXS0+cmVhZHlfaGVhZCA9IDA7Ci0gIGR0MzE1NV9mYnVmZmVyW21dLT5yZWFkeV9sZW4gPSAwOwotCi0gIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkdDMxNTVfZ2V0X3JlYWR5X2J1ZmZlcigpCi0gKiBtIGlzIG1pbm9yICMgb2YgZGV2aWNlCi0gKgotICogZ2V0X3JlYWR5X2J1ZmZlciB3aWxsIGdyYWIgdGhlIG5leHQgY2h1bmsgb2YgZGF0YQotICogaWYgaXQgaXMgYWxyZWFkeSB0aGVyZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgMC4KLSAqIElmIHRoZSB1c2VyIGhhcyBhIGJ1ZmZlciBsb2NrZWQgaXQgd2lsbCB1bmxvY2sKLSAqIHRoYXQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcgdGhlIG5ldyBvbmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZHQzMTU1X2dldF9yZWFkeV9idWZmZXIoaW50IG0pCi17Ci0gIGludCBmcmFtZV9pbmRleDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7Ci0gIGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotICBsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0jaWZkZWYgREVCVUdfUVVFU19BCi0gIHByaW50cXVlcyhtKTsKLSNlbmRpZgotCi0gIGludGVybmFsX3JlbGVhc2VfbG9ja2VkX2J1ZmZlcihtKTsKLQotICAgIGlmIChpc19yZWFkeV9idWZfZW1wdHkobSkpCi0JZnJhbWVfaW5kZXggPSAtMTsKLSAgICBlbHNlIHsKLQlmcmFtZV9pbmRleCA9IHBvcF9yZWFkeShtKTsKLQlkdDMxNTVfZmJ1ZmZlclttXS0+bG9ja2VkX2J1ZiA9IGZyYW1lX2luZGV4OwotICAgIH0KLQotI2lmZGVmIERFQlVHX1FVRVNfQgotICBwcmludHF1ZXMobSk7Ci0jZW5kaWYKLQotICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgcmV0dXJuIGZyYW1lX2luZGV4OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NS9kdDMxNTVfaXNyLmggYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NV9pc3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0NzRjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1L2R0MzE1NV9pc3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0KLUNvcHlyaWdodCAxOTk2LDIwMDIgR3JlZ29yeSBELiBIYWdlciwgQWxmcmVkIEEuIFJpenppLCBOb2FoIEouIENvd2FuLAotCQkgICAgSmFzb24gTGFwZW50YSwgU2NvdHQgU21lZGxleQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRFQzMTU1IERldmljZSBEcml2ZXIuCi0KLVRoZSBEVDMxNTUgRGV2aWNlIERyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAotYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLUxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoZSBEVDMxNTUgRGV2aWNlIERyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLXVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKLW9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBEVDMxNTUgRGV2aWNlIERyaXZlcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLU1BIDAyMTExLTEzMDcgVVNBCi0KLQotLS0gQ2hhbmdlcyAtLQotCi0gIERhdGUgICAgIFByb2dyYW1tZXIgICBEZXNjcmlwdGlvbiBvZiBjaGFuZ2VzIG1hZGUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAwMy1KdWwtMjAwMCBKTUwgICAgICAgbi9hCi0gIDI0LUp1bC0yMDAyIFNTICAgICAgICBHUEwgbGljZW5jZS4KLSAgMjYtT2N0LTIwMDkgU1MJUG9ydGluZyB0byAyLjYuMzAga2VybmVsLgotCi0tLSBub3RlcyAtLQotCi0qLwotCi0jaWZuZGVmIERUMzE1NV9JU1JfSAotI2RlZmluZSBEVDMxNTVfSVNSX0gKLQotZXh0ZXJuIHN0cnVjdCBkdDMxNTVfZmJ1ZmZlciAqZHQzMTU1X2ZidWZmZXJbTUFYQk9BUkRTXTsKLQotLyogVXNlciBmdW5jdGlvbnMgZm9yIGJ1ZmZlcmluZyAqLwotLyogSW5pdGlhbGl6ZSB0aGUgYnVmZmVyaW5nIHN5c3RlbS4gIFRoaXMgc2hvdWxkICovCi0vKiBiZSBjYWxsZWQgcHJpb3IgdG8gZW5hYmxpbmcgaW50ZXJydXB0cyAqLwotCi11MzIgZHQzMTU1X3NldHVwX2J1ZmZlcnModTMyICphbGxvY2F0b3JBZGRyKTsKLQotLyogR2V0IHRoZSBuZXh0IGZyYW1lIG9mIGRhdGEgaWYgaXQgaXMgcmVhZHkuICBSZXR1cm5zICovCi0vKiB6ZXJvIGlmIG5vIGRhdGEgaXMgcmVhZHkuICBJZiB0aGVyZSBpcyBkYXRhIGJ1dCAqLwotLyogdGhlIHVzZXIgaGFzIGEgbG9ja2VkIGJ1ZmZlciwgaXQgd2lsbCB1bmxvY2sgdGhhdCAqLwotLyogYnVmZmVyIGFuZCByZXR1cm4gaXQgdG8gdGhlIGZyZWUgbGlzdC4gKi8KLQotaW50IGR0MzE1NV9nZXRfcmVhZHlfYnVmZmVyKGludCBtaW5vcik7Ci0KLS8qIFJldHVybiBhIGxvY2tlZCBidWZmZXIgdG8gdGhlIGZyZWUgbGlzdCAqLwotCi12b2lkIGR0MzE1NV9yZWxlYXNlX2xvY2tlZF9idWZmZXIoaW50IG1pbm9yKTsKLQotLyogRmx1c2ggdGhlIGJ1ZmZlciBzeXN0ZW0gKi8KLWludCBkdDMxNTVfZmx1c2goaW50IG1pbm9yKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNpbXBsZSBhcnJheSBiYXNlZCBxdWUgc3RydWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYm9vbCBhcmVfZW1wdHlfYnVmZmVycyhpbnQgbWlub3IpOwotdm9pZCBwdXNoX2VtcHR5KGludCBpbmRleCwgaW50IG1pbm9yKTsKLQotaW50ICBwb3BfZW1wdHkoaW50IG1pbm9yKTsKLQotYm9vbCBpc19yZWFkeV9idWZfZW1wdHkoaW50IG1pbm9yKTsKLWJvb2wgaXNfcmVhZHlfYnVmX2Z1bGwoaW50IG1pbm9yKTsKLQotdm9pZCBwdXNoX3JlYWR5KGludCBtaW5vciwgaW50IGluZGV4KTsKLWludCAgcG9wX3JlYWR5KGludCBtaW5vcik7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwppbmRleCA2ZGMzYWY2Li5mZDQ4YjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvZHQzMTU1djRsLmMKQEAgLTEwMDgsNiArMTAwOCw4IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdAogZHQzMTU1X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtOworCWRtYV9hZGRyX3QgZGV2X2Jhc2U7CiAJaW50IHBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOwogCWludCBiaXRtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1MocGFnZXMpICogc2l6ZW9mKGxvbmcpOwogCkBAIC0xMDE4LDI1ICsxMDIwLDI4IEBACiAJaWYgKGRldi0+ZG1hX21lbSkKIAkJZ290byBvdXQ7CiAKLQlkZXYtPmRtYV9tZW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5kbWFfbWVtKQorCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKCptZW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbSkKIAkJZ290byBvdXQ7Ci0JZGV2LT5kbWFfbWVtLT5iaXRtYXAgPSBremFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+ZG1hX21lbS0+Yml0bWFwKQorCW1lbS0+dmlydF9iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJmRldl9iYXNlLAorCQkJCQkJCURUMzE1NV9DT0hfRkxBR1MpOworCWlmICghbWVtLT52aXJ0X2Jhc2UpCisJCWdvdG8gZXJyX2FsbG9jX2NvaGVyZW50OworCW1lbS0+Yml0bWFwID0ga3phbGxvYyhiaXRtYXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW0tPmJpdG1hcCkKIAkJZ290byBlcnJfYml0bWFwOwogCi0JZGV2LT5kbWFfbWVtLT52aXJ0X2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLAotCQkJCSZkZXYtPmRtYV9tZW0tPmRldmljZV9iYXNlLCBEVDMxNTVfQ09IX0ZMQUdTKTsKLQlpZiAoIWRldi0+ZG1hX21lbS0+dmlydF9iYXNlKQotCQlnb3RvIGVycl9jb2hlcmVudDsKLQlkZXYtPmRtYV9tZW0tPnNpemUgPSBwYWdlczsKLQlkZXYtPmRtYV9tZW0tPmZsYWdzID0gZmxhZ3M7CisJLyogY29oZXJlbnRfZG1hX21hc2sgaXMgYWxyZWFkeSBzZXQgdG8gMzIgYml0cyAqLworCW1lbS0+ZGV2aWNlX2Jhc2UgPSBkZXZfYmFzZTsKKwltZW0tPnNpemUgPSBwYWdlczsKKwltZW0tPmZsYWdzID0gZmxhZ3M7CisJZGV2LT5kbWFfbWVtID0gbWVtOwogCXJldHVybiBETUFfTUVNT1JZX01BUDsKIAotZXJyX2NvaGVyZW50OgotCWtmcmVlKGRldi0+ZG1hX21lbS0+Yml0bWFwKTsKIGVycl9iaXRtYXA6Ci0Ja2ZyZWUoZGV2LT5kbWFfbWVtKTsKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIG1lbS0+dmlydF9iYXNlLCBkZXZfYmFzZSk7CitlcnJfYWxsb2NfY29oZXJlbnQ6CisJa2ZyZWUobWVtKTsKIG91dDoKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTZmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9LY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKK2NvbmZpZyBFQVNZQ0FQCisJdHJpc3RhdGUgIkVhc3lDQVAgVVNCIElEIDA1ZTE6MDQwOCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBpbnRlZ3JhdGVkIGF1ZGlvL3ZpZGVvIGRyaXZlciBmb3IgRWFzeUNBUCBjYXJkcyB3aXRoCisJICBVU0IgSUQgMDVlMTowNDA4LiAgSXQgc3VwcG9ydHMgdHdvIGhhcmR3YXJlIHZhcmlhbnRzOgorCisJICAqICBFYXN5Q0FQIFVTQiAyLjAgVmlkZW8gQWRhcHRlciB3aXRoIEF1ZGlvLCBNb2RlbCBEQzYwLAorCSAgICAgaGF2aW5nIGlucHV0IGNhYmxlcyBsYWJlbGxlZCBDVkJTLCBTLVZJREVPLCBBVURJTyhMKSwgQVVESU8oUikKKworCSAgKiAgRWFzeUNBUDAwMiA0LUNoYW5uZWwgVVNCIDIuMCBEVlIsIGhhdmluZyBpbnB1dCBjYWJsZXMgbGFiZWxsZWQKKwkgICAgIDEsIDIsIDMsIDQgYW5kIGFuIHVubGFiZWxsZWQgaW5wdXQgY2FibGUgZm9yIGEgbWljcm9waG9uZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZWFzeWNhcAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2JkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisKK29iai0kKENPTkZJR19FQVNZQ0FQKQkrPSBlYXN5Y2FwLm8KKworZWFzeWNhcC1vYmpzCTo9IGVhc3ljYXBfbWFpbi5vIGVhc3ljYXBfbG93Lm8gZWFzeWNhcF9zb3VuZC5vCitlYXN5Y2FwLW9ianMJKz0gZWFzeWNhcF9pb2N0bC5vIGVhc3ljYXBfc2V0dGluZ3MubworZWFzeWNhcC1vYmpzCSs9IGVhc3ljYXBfdGVzdGNhcmQubworCitFWFRSQV9DRkxBR1MgKz0gLVdhbGwKKyMgSW1wb3NlIGFsbCBvciBub25lIG9mIHRoZSBmb2xsb3dpbmc6CitFWFRSQV9DRkxBR1MgKz0gLURFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVAorRVhUUkFfQ0ZMQUdTICs9IC1ERUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9ICitFWFRSQV9DRkxBR1MgKz0gLURFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL1JFQURNRQpAQCAtMCwwICsxLDEzMCBAQAorCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICogICBFYXN5Q0FQIFVTQiAyLjAgVmlkZW8gQWRhcHRlciB3aXRoIEF1ZGlvLCBNb2RlbCBEQzYwICAqCisgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICogICAgICAgICAgICAgRWFzeUNBUDAwMiA0LUNoYW5uZWwgVVNCIDIuMCBEVlIgICAgICAgICAgICAqCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICBNaWtlIFRob21hcyAgPHJtdGhvbWFzQHNjaW9sdXMub3JnPgorCisKKworU1VQUE9SVEVEIEhBUkRXQVJFCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGhhcmR3YXJlIGhhdmluZyBVU0IgSUQgMDVlMTowNDA4LgorVHdvIGtpbmRzIG9mIEVhc3lDQVAgaGF2ZSB0aGlzIFVTQiBJRCwgbmFtZWx5OgorCisgICAgKiAgRWFzeUNBUCBVU0IgMi4wIFZpZGVvIEFkYXB0ZXIgd2l0aCBBdWRpbywgTW9kZWwgREM2MCwKKyAgICAgICBoYXZpbmcgaW5wdXQgY2FibGVzIGxhYmVsbGVkIENWQlMsIFMtVklERU8sIEFVRElPKEwpLCBBVURJTyhSKQorCisgICAgKiAgRWFzeUNBUDAwMiA0LUNoYW5uZWwgVVNCIDIuMCBEVlIsIGhhdmluZyBpbnB1dCBjYWJsZXMgbGFiZWxsZWQKKyAgICAgICAxLCAyLCAzLCA0IGFuZCBhbiB1bmxhYmVsbGVkIGlucHV0IGNhYmxlIGZvciBhIG1pY3JvcGhvbmUuCisKKworQlVJTEQgT1BUSU9OUyBBTkQgREVQRU5ERU5DSUVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgdGhlIHBhcmFtZXRlciBFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCBpcyB1bmRlZmluZWQgZHVyaW5nIGNvbXBpbGF0aW9uCit0aGUgYnVpbHQgbW9kdWxlIGlzIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIHRoZSB2aWRlb2RldiBtb2R1bGUsIGFuZCB3aGVuCit0aGUgRWFzeUNBUCBpcyBwaHlzaWNhbGx5IHBsdWdnZWQgaW50byBhIFVTQiBwb3J0IHRoZSBzcGVjaWFsIGZpbGVzCisvZGV2L2Vhc3ljYXAwIGFuZCAvZGV2L2Vhc3lzbmQxIGFyZSBjcmVhdGVkIGFzIHZpZGVvIGFuZCBzb3VuZCBzb3VyY2VzCityZXNwZWN0aXZlbHkuCisKK0lmIHRoZSBwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgZGVmaW5lZCBkdXJpbmcgY29tcGlsYXRpb24KK3RoZSBidWlsdCBlYXN5Y2FwIG1vZHVsZSBpcyBjb25maWd1cmVkIHRvIHJlZ2lzdGVyIHdpdGggdGhlIHZpZGVvZGV2IG1vZHVsZSwKK2luIHdoaWNoIGNhc2UgdGhlIHNwZWNpYWwgZmlsZXMgY3JlYXRlZCB3aGVuIHRoZSBFYXN5Q0FQIGlzIHBsdWdnZWQgaW4gYXJlCisvZGV2L3ZpZGVvMCBhbmQgL2Rldi9lYXN5c25kMC4gIFVzZSBvZiB0aGUgZWFzeWNhcCBtb2R1bGUgYXMgYSBjbGllbnQgb2YKK3RoZSB2aWRlb2RldiBtb2R1bGUgaGFzIHJlY2VpdmVkIHZlcnkgbGl0dGxlIHRlc3RpbmcgYXMgb2YgSnVuZSAyMDEwLgorCisKK0tOT1dOIEJVSUxEIFBST0JMRU1TCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgUmVjZW50IGdjYyB2ZXJzaW9ucyBtYXkgZ2VuZXJhdGUgdGhlIG1lc3NhZ2U6CisKKyAgICAgd2FybmluZzogdGhlIGZyYW1lIHNpemUgb2YgLi4uLiBieXRlcyBpcyBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzCisKK1RoaXMgd2FybmluZyBjYW4gYmUgc3VwcHJlc3NlZCBieSBzcGVjaWZ5aW5nIGluIHRoZSBNYWtlZmlsZToKKworICAgICBFWFRSQV9DRkxBR1MgKz0gLVdmcmFtZS1sYXJnZXItdGhhbj04MTkyCisKK2J1dCBpdCB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIHJlbW92ZSB0aGUgY2F1c2Ugb2YgdGhlIHdhcm5pbmcuCisKKworS05PV04gUlVOVElNRSBJU1NVRVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBSYW5kb21seSAobWF5YmUgNSB0byAxMCUgb2Ygb2NjYXNpb25zKSB0aGUgZHJpdmVyIGZhaWxzIHRvIHByb2R1Y2UgYW55CitvdXRwdXQgYXQgc3RhcnQtdXAuICBDbG9zaW5nIG1wbGF5ZXIgKG9yIHdoYXRldmVyIHRoZSB1c2VyIHByb2dyYW0gaXMpIGFuZAorcmVzdGFydGluZyBpdCByZXN0b3JlcyBub3JtYWwgcGVyZm9ybWFuY2Ugd2l0aG91dCBhbnkgb3RoZXIgcmVtZWRpYWwgYWN0aW9uCitiZWluZyBuZWNlc3NhcnkuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzIG5vdCBrbm93bi4KKworKDIpIEludGVudGlvbmFsbHksIHRoaXMgZHJpdmVyIHdpbGwgbm90IHN0cmVhbSBtYXRlcmlhbCB3aGljaCBpcyB1bmFtYmlndW91c2x5CitpZGVudGlmaWVkIGJ5IHRoZSBoYXJkd2FyZSBhcyBjb3B5LXByb3RlY3RlZC4gIFRoZSB2aWRlbyBvdXRwdXQgd2lsbCBmcmVlemUKK3dpdGhpbiBhYm91dCBhIG1pbnV0ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KKworKDMpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAorYWx3YXlzIHdvcmsgcHJvcGVybHkuCisKKyg0KSBSZWR1Y2VkLXJlc29sdXRpb24gUy1WaWRlbyBzZWVtcyB0byBzdWZmZXIgZnJvbSBtb2lyZSBhcnRlZmFjdHMuICBObworYXR0ZW1wdCBoYXMgeWV0IGJlZW4gbWFkZSB0byByZW1lbWR5IHRoaXMuCisKKworU1VQUE9SVEVEIFRWIFNUQU5EQVJEUyBBTkQgUkVTT0xVVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgVFYgc3RhbmRhcmRzIGFyZSBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBhcmUKK3VzYWJsZSBhcyAoZm9yIGV4YW1wbGUpIHRoZSAibm9ybT0iIHBhcmFtZXRlciBpbiB0aGUgbXBsYXllciBjb21tYW5kOgorCisgICAgUEFMX0JHSElOLCAgICBOVFNDX05fNDQzLAorICAgIFBBTF9OYywgICAgICAgTlRTQ19OLAorICAgIFNFQ0FNLCAgICAgICAgTlRTQ19NLCAgICAgICAgTlRTQ19NX0pQLAorICAgIFBBTF82MCwgICAgICAgTlRTQ180NDMsCisgICAgUEFMX00uCisKK1RoZSBhdmFpbGFibGUgcGljdHVyZSBzaXplcyBhcmU6CisKKyAgICAgYXQgMjUgZnJhbWVzIHBlciBzZWNvbmQ6ICAgNzIweDU3NiwgNzA0eDU3NiwgNjQweDQ4MCwgMzYweDI4OCwgMzIweDI0MDsKKyAgICAgYXQgMzAgZnJhbWVzIHBlciBzZWNvbmQ6ICAgNzIweDQ4MCwgNjQweDQ4MCwgMzYweDI0MCwgMzIweDI0MDsKKworCitXSEFUJ1MgVEVTVEVEIEFORCBXSEFUJ1MgTk9UCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGlzIGtub3duIHRvIHdvcmsgd2l0aCBtcGxheWVyLCBtZW5jb2RlciwgdHZ0aW1lIGFuZCBzdWZmaWNpZW50bHkKK3JlY2VudCB2ZXJzaW9ucyBvZiB2bGMuICBBbiBpbnRlcmZhY2UgdG8gZmZtcGVnIGlzIGltcGxlbWVudGVkLCBidXQgc2VyaW91cworYXVkaW8tdmlkZW8gc3luY2hyb25pemF0aW9uIHByb2JsZW1zIHJlbWFpbi4KKworVGhlIGRyaXZlciBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFsbCB0aGUgVFYgc3RhbmRhcmRzIGFjY2VwdGVkIGJ5IHRoZQoraGFyZHdhcmUsIGJ1dCBhcyB5ZXQgaXQgaGFzIGFjdHVhbGx5IGJlZW4gdGVzdGVkIG9uIG9ubHkgYSBmZXcgb2YgdGhlc2UuCisKK0kgaGF2ZSBiZWVuIHVuYWJsZSB0byB0ZXN0IGFuZCBjYWxpYnJhdGUgdGhlIFMtdmlkZW8gaW5wdXQgbXlzZWxmIGJlY2F1c2UgSQorZG8gbm90IHBvc3Nlc3MgYW55IGVxdWlwbWVudCB3aXRoIFMtdmlkZW8gb3V0cHV0LgorCitUaGlzIGRyaXZlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBWNEwxIElPQ1RMIGNvbW1hbmRzLCBzbyBwcm9ncmFtcyBzdWNoCithcyBjYW1vcmFtYSBhcmUgbm90IGNvbXBhdGlibGUuICBUaGVyZSBhcmUgcmVwb3J0cyB0aGF0IHRoZSBkcml2ZXIgZG9lcword29yayB3aXRoIHN1ZmZpY2llbnRseSByZWNlbnQgKFY0TDIpIHZlcnNpb25zIG9mIHpvbmVtaW5kZXIsIGJ1dCBJIGhhdmUgbm90CithdHRlbXB0ZWQgdG8gY29uZmlybSB0aGlzIG15c2VsZi4KKworCitVREVWIFJVTEVTCistLS0tLS0tLS0tCisKK0luIG9yZGVyIHRoYXQgdGhlIHNwZWNpYWwgZmlsZXMgL2Rldi9lYXN5Y2FwMCBhbmQgL2Rldi9lYXN5c25kMSBhcmUgY3JlYXRlZAord2l0aCBjb252ZW5pZW50bHkgcmVsYXhlZCBwZXJtaXNzaW9ucyB3aGVuIHRoZSBFYXN5Q0FQIGlzIHBsdWdnZWQgaW4sIGEgZmlsZQoraXMgcHJlZmVyYWJseSB0byBiZSBwcm92aWRlZCBpbiBkaXJlY3RvcnkgL2V0Yy91ZGV2L3J1bGVzLmQgd2l0aCBjb250ZW50OgorCitBQ1RJT04hPSJhZGR8Y2hhbmdlIiwgR09UTz0iZWFzeWNhcF9ydWxlc19lbmQiCitBVFRSU3tpZFZlbmRvcn09PSIwNWUxIiwgQVRUUlN7aWRQcm9kdWN0fT09IjA0MDgiLCBcCisJTU9ERT0iMDY2NiIsIE9XTkVSPSJyb290IiwgR1JPVVA9InJvb3QiCitMQUJFTD0iZWFzeWNhcF9ydWxlc19lbmQiCisKKworQUNLTk9XTEVHRU1FTlRTIEFORCBSRUZFUkVOQ0VTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZHJpdmVyIG1ha2VzIHVzZSBvZiBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFN5bnRlayBTZW1pY29uIERDLTExMjUKK0RyaXZlciwgcHJlc2VudGx5IG1haW50YWluZWQgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zeW50ZWtkcml2ZXIvCitieSBOaWNvbGFzIFZpdmllbi4gIFBhcnRpY3VsYXJseSB1c2VmdWwgaGFzIGJlZW4gYSBwYXRjaCB0byB0aGUgbGF0dGVyIGRyaXZlcgorcHJvdmlkZWQgYnkgSXZvciBIZXdpdHQgaW4gSmFudWFyeSAyMDA5LiAgVGhlIE5UU0MgaW1wbGVtZW50YXRpb24gaXMgdGFrZW4KK2Zyb20gdGhlIHdvcmsgb2YgQmVuIFRyYXNrLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmggYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4MzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaApAQCAtMCwwICsxLDY0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIGVhc3ljYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBSLk0uIFRob21hcyAgPHJtdGhvbWFzQHNjaW9sdXMub3JnPgorICoKKyAqCisgKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoZSBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRIRSBGT0xMT1dJTkcgUEFSQU1FVEVSUyBBUkUgVU5ERUZJTkVEOgorICoKKyAqICAgICAgICAgICAgICAgIEVBU1lDQVBfREVCVUcKKyAqICAgICAgICAgICAgICAgIEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UCisgKiAgICAgICAgICAgICAgICBFQVNZQ0FQX05FRURTX1VTQlZJREVPX0gKKyAqICAgICAgICAgICAgICAgIEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSAorICogICAgICAgICAgICAgICAgRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMKKyAqCisgKiAgSUYgUkVRVUlSRUQgVEhFWSBNVVNUIEJFIEVYVEVSTkFMTFkgREVGSU5FRCwgRk9SIEVYQU1QTEUgQVMgQ09NUElMRVIKKyAqICBPUFRJT05TLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIWRlZmluZWQoRUFTWUNBUF9IKSkKKyNkZWZpbmUgRUFTWUNBUF9ICisKKyNpZiBkZWZpbmVkKEVBU1lDQVBfREVCVUcpCisjaWYgKDkgPCBFQVNZQ0FQX0RFQlVHKQorI2Vycm9yIERlYnVnIGxldmVscyAwIHRvIDkgYXJlIG9rYXkuXAorICBUbyBhY2hpZXZlIGhpZ2hlciBsZXZlbHMsIHJlbW92ZSB0aGlzIHRyYXAgbWFudWFsbHkgZnJvbSBlYXN5Y2FwLmgKKyNlbmRpZgorI2VuZGlmIC8qRUFTWUNBUF9ERUJVRyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRIRVNFIEFSRSBGT1IgTUFJTlRFTkFOQ0UgT05MWSAtIE5PUk1BTExZIFVOREVGSU5FRDoKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3VuZGVmICBQUkVGRVJfTlRTQworI3VuZGVmICBFQVNZQ0FQX1RFU1RDQVJECisjdW5kZWYgIEVBU1lDQVBfVEVTVFRPTkUKKyN1bmRlZiAgTE9DS0ZSQU1FCisjdW5kZWYgIE5PUkVBREJBQ0sKKyN1bmRlZiAgQVVESU9USU1FCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICoKKyAqICBERUZJTkUgICBCUklER0VSICAgVE8gQUNUSVZBVEUgVEhFIFJPVVRJTkUgRk9SIEJSSURHSU5HIFZJREVPVEFQRSBEUk9QT1VUUy4KKyAqCisgKiAgICAgICAgICAgICAqKiogVU5ERVIgREVWRUxPUE1FTlQvVEVTVElORyAtIE5PVCBSRUFEWSBZRVQhKioqCisgKgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjdW5kZWYgIEJSSURHRVIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCisjaWYgKCFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pKQorI2RlZmluZSBfX09MRF9WSURJT0NfCisjZW5kaWYgLyogIWRlZmluZWQoX19PTERfVklESU9DXykgKi8KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CisKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworCisjaWYgKCFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pKQorI2RlZmluZSBfX09MRF9WSURJT0NfCisjZW5kaWYgLyogIWRlZmluZWQoX19PTERfVklESU9DXykgKi8KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorCisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1VTQlZJREVPX0gpCisjaW5jbHVkZSA8Y29uZmlnL3ZpZGVvL3VzYnZpZGVvLmg+CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1VTQlZJREVPX0gqLworCisjaWYgKCFkZWZpbmVkKFBBR0VfU0laRSkpCisjZXJyb3IgIlBBR0VfU0laRSBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisjZGVmaW5lIFNUUklOR0laRV9BR0FJTih4KSAjeAorI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFX0FHQUlOKHgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICBWRU5ET1IsIFBST0RVQ1Q6ICBTeW50ZWsgU2VtaWNvbmR1Y3RvciBDby4sIEx0ZAorICoKKyAqICAgICAgRUlUSEVSICAgICAgICBFYXN5Q0FQIFVTQiAyLjAgVmlkZW8gQWRhcHRlciB3aXRoIEF1ZGlvLCBNb2RlbCBOby4gREM2MAorICogICAgICAgICAgICAgICB3aXRoIGlucHV0IGNhYmxpbmc6ICBBVURJTyhMKSwgQVVESU8oUiksIENWQlMsIFMtVklERU8uCisgKgorICogICAgICAgICAgT1IgICAgICAgIEVhc3lDQVAgNENIQU5ORUwgVVNCIDIuMCBEVlIsIE1vZGVsIE5vLiBFYXN5Q0FQMDAyCisgKiAgICAgICAgICAgICAgIHdpdGggaW5wdXQgY2FibGluZzogIE1JQ1JPUEhPTkUsIENWQlMxLCBDVkJTMiwgQ1ZCUzMsIENWQlM0LgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFVTQl9FQVNZQ0FQX1ZFTkRPUl9JRAkweDA1ZTEKKyNkZWZpbmUgVVNCX0VBU1lDQVBfUFJPRFVDVF9JRAkweDA0MDgKKworI2RlZmluZSBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OICIwLjguMjEiCisjZGVmaW5lIEVBU1lDQVBfRFJJVkVSX0RFU0NSSVBUSU9OICJlYXN5Y2FwZGM2MCIKKworI2RlZmluZSBVU0JfU0tFTF9NSU5PUl9CQVNFICAgICAxOTIKKyNkZWZpbmUgVklERU9fREVWSUNFX01BTlkgOAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIERFRkFVTFQgTFVNSU5BTkNFLCBDT05UUkFTVCwgU0FUVVJBVElPTiBBTkQgSFVFCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU0FBXzBBX0RFRkFVTFQgMHg3RgorI2RlZmluZSBTQUFfMEJfREVGQVVMVCAweDNGCisjZGVmaW5lIFNBQV8wQ19ERUZBVUxUIDB4MkYKKyNkZWZpbmUgU0FBXzBEX0RFRkFVTFQgMHgwMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBWSURFTyBTVFJFQU1JTkcgUEFSQU1FVEVSUzoKKyAqICBVU0IgMi4wIFBST1ZJREVTIEZPUiBISUdILUJBTkRXSURUSCBFTkRQT0lOVFMgV0lUSCBBTiBVUFBFUiBMSU1JVAorICogIE9GIDMwNzIgQllURVMgUEVSIE1JQ1JPRlJBTUUgZm9yIHdNYXhQYWNrZXRTaXplLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFZJREVPX0lTT0NfQlVGRkVSX01BTlkgMTYKKyNkZWZpbmUgVklERU9fSVNPQ19PUkRFUiAzCisjZGVmaW5lIFZJREVPX0lTT0NfRlJBTUVTUEVSREVTQyAoKHVuc2lnbmVkIGludCkgMSA8PCBWSURFT19JU09DX09SREVSKQorI2RlZmluZSBVU0JfMl8wX01BWFBBQ0tFVFNJWkUgMzA3MgorI2lmIChVU0JfMl8wX01BWFBBQ0tFVFNJWkUgPiBQQUdFX1NJWkUpCisjZXJyb3IgdmlkZW9faXNvY19idWZmZXJbLl0gd2lsbCBub3QgYmUgYmlnIGVub3VnaAorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFZJREVPIEJVRkZFUlMKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBGSUVMRF9CVUZGRVJfU0laRSAoMjAzICogUEFHRV9TSVpFKQorI2RlZmluZSBGUkFNRV9CVUZGRVJfU0laRSAoNDA1ICogUEFHRV9TSVpFKQorI2RlZmluZSBGSUVMRF9CVUZGRVJfTUFOWSA0CisjZGVmaW5lIEZSQU1FX0JVRkZFUl9NQU5ZIDYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgQVVESU8gU1RSRUFNSU5HIFBBUkFNRVRFUlMKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBBVURJT19JU09DX0JVRkZFUl9NQU5ZIDE2CisjZGVmaW5lIEFVRElPX0lTT0NfT1JERVIgMworI2RlZmluZSBBVURJT19JU09DX0JVRkZFUl9TSVpFIChQQUdFX1NJWkUgPDwgQVVESU9fSVNPQ19PUkRFUikKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgQVVESU8gQlVGRkVSUworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEFVRElPX0ZSQUdNRU5UX01BTlkgMzIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSVQgSVMgRVNTRU5USUFMIFRIQVQgRVZFTi1OVU1CRVJFRCBTVEFOREFSRFMgQVJFIDI1IEZSQU1FUyBQRVIgU0VDT05ELAorICogICAgICAgICAgICAgICAgICAgICAgICBPREQtTlVNQkVSRUQgU1RBTkRBUkRTIEFSRSAzMCBGUkFNRVMgUEVSIFNFQ09ORC4KKyAqICBUSEUgTlVNQkVSSU5HIE9GIFNUQU5EQVJEUyBNVVNUIE5PVCBCRSBDSEFOR0VEIFdJVEhPVVQgRFVFIENBUkUuICBOT1QKKyAqICBPTkxZIE1VU1QgVEhFIFBBUkFNRVRFUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQU5EQVJEX01BTlkKKyAqICBCRSBDSEFOR0VEIFRPIENPUlJFU1BPTkQgVE8gVEhFIE5FVyBOVU1CRVIgT0YgU1RBTkRBUkRTLCBCVVQgQUxTTyBUSEUKKyAqICBOVU1CRVJJTkcgTVVTVCBSRU1BSU4gQU4gVU5CUk9LRU4gQVNDRU5ESU5HIFNFUVVFTkNFOiAgRFVNTVkgU1RBTkRBUkRTCisgKiAgTUFZIE5FRUQgVE8gQkUgQURERUQuICAgQVBQUk9QUklBVEUgQ0hBTkdFUyBXSUxMIEFMV0FZUyBCRSBSRVFVSVJFRCBJTgorICogIFJPVVRJTkUgZmlsbGluX2Zvcm1hdHMoKSBBTkQgUE9TU0lCTFkgRUxTRVdIRVJFLiAgQkVXQVJFLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lICBQQUxfQkdISU4gICAgICAwCisjZGVmaW5lICBQQUxfTmMgICAgICAgICAyCisjZGVmaW5lICBTRUNBTSAgICAgICAgICA0CisjZGVmaW5lICBOVFNDX04gICAgICAgICA2CisjZGVmaW5lICBOVFNDX05fNDQzICAgICA4CisjZGVmaW5lICBOVFNDX00gICAgICAgICAxCisjZGVmaW5lICBOVFNDXzQ0MyAgICAgICAzCisjZGVmaW5lICBOVFNDX01fSlAgICAgICA1CisjZGVmaW5lICBQQUxfNjAgICAgICAgICA3CisjZGVmaW5lICBQQUxfTSAgICAgICAgICA5CisjZGVmaW5lICBTVEFOREFSRF9NQU5ZIDEwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEVOVU1TCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VudW0geworQVRfNzIweDU3NiwKK0FUXzcwNHg1NzYsCitBVF82NDB4NDgwLAorQVRfNzIweDQ4MCwKK0FUXzM2MHgyODgsCitBVF8zMjB4MjQwLAorQVRfMzYweDI0MCwKK1JFU09MVVRJT05fTUFOWQorfTsKK2VudW0geworRk1UX1VZVlksCitGTVRfWVVZMiwKK0ZNVF9SR0IyNCwKK0ZNVF9SR0IzMiwKK0ZNVF9CR1IyNCwKK0ZNVF9CR1IzMiwKK1BJWEVMRk9STUFUX01BTlkKK307CitlbnVtIHsKK0ZJRUxEX05PTkUsCitGSUVMRF9JTlRFUkxBQ0VELAorRklFTERfQUxURVJOQVRFLAorSU5URVJMQUNFX01BTlkKK307CisjZGVmaW5lIFNFVFRJTkdTX01BTlkJKFNUQU5EQVJEX01BTlkgKiBcCisJCQlSRVNPTFVUSU9OX01BTlkgKiBcCisJCQkyICogXAorCQkJUElYRUxGT1JNQVRfTUFOWSAqIFwKKwkJCUlOVEVSTEFDRV9NQU5ZKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTVFJVQ1RVUkUgREVGSU5JVElPTlMKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGRhdGFfYnVmZmVyIHsKK3N0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOwordm9pZCAqcGdvOwordm9pZCAqcHRvOworX191MTYga291bnQ7Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGRhdGFfdXJiIHsKK3N0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOworc3RydWN0IHVyYiAqcHVyYjsKK2ludCBpc2J1ZjsKK2ludCBsZW5ndGg7Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgeworX191MTYgbWFzazsKK3N0cnVjdCB2NGwyX3N0YW5kYXJkIHY0bDJfc3RhbmRhcmQ7Cit9Oworc3RydWN0IGVhc3ljYXBfZm9ybWF0IHsKK19fdTE2IG1hc2s7CitjaGFyIG5hbWVbMTI4XTsKK3N0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKK307CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogICBlYXN5Y2FwLmlsayA9PSAwICAgPT4gIENWQlMrUy1WSURFTyBIQVJEV0FSRSwgQVVESU8gd01heFBhY2tldFNpemU9MjU2CisgKiAgIGVhc3ljYXAuaWxrID09IDIgICA9PiAgQ1ZCUytTLVZJREVPIEhBUkRXQVJFLCBBVURJTyB3TWF4UGFja2V0U2l6ZT05CisgKiAgIGVhc3ljYXAuaWxrID09IDMgICA9PiAgICAgRk9VUi1DVkJTIEhBUkRXQVJFLCBBVURJTyB3TWF4UGFja2V0U2l6ZT05CisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBlYXN5Y2FwIHsKK3Vuc2lnbmVkIGludCBhdWRpb19wYWdlc19wZXJfZnJhZ21lbnQ7Cit1bnNpZ25lZCBpbnQgYXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50OwordW5zaWduZWQgaW50IGF1ZGlvX2J1ZmZlcl9wYWdlX21hbnk7CisKKyNkZWZpbmUgVVBTQU1QTEUKKyNpZiBkZWZpbmVkKFVQU0FNUExFKQorX19zMTYgb2xkYXVkaW87CisjZW5kaWYgLypVUFNBTVBMRSovCisKK3N0cnVjdCBlYXN5Y2FwX2Zvcm1hdCBlYXN5Y2FwX2Zvcm1hdFsxICsgU0VUVElOR1NfTUFOWV07CisKK2ludCBpbGs7Citib29sIG1pY3JvcGhvbmU7CisKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmlkZW9fZGV2aWNlOworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisKK3N0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZTsKK3N0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGVyZmFjZTsKKworc3RydWN0IGtyZWYga3JlZjsKKworc3RydWN0IG11dGV4IG11dGV4X21tYXBfdmlkZW9bRlJBTUVfQlVGRkVSX01BTlldOworc3RydWN0IG11dGV4IG11dGV4X3RpbWV2YWwwOworc3RydWN0IG11dGV4IG11dGV4X3RpbWV2YWwxOworCitpbnQgcXVldWVkW0ZSQU1FX0JVRkZFUl9NQU5ZXTsKK2ludCBkb25lW0ZSQU1FX0JVRkZFUl9NQU5ZXTsKKword2FpdF9xdWV1ZV9oZWFkX3Qgd3FfdmlkZW87Cit3YWl0X3F1ZXVlX2hlYWRfdCB3cV9hdWRpbzsKKworaW50IGlucHV0OworaW50IHBvbGxlZDsKK2ludCBzdGFuZGFyZF9vZmZzZXQ7CitpbnQgZm9ybWF0X29mZnNldDsKKworaW50IGZwczsKK2ludCB1c2VjOworaW50IHRvbGVyYXRlOworaW50IG1lcml0WzE4MF07CisKK3N0cnVjdCB0aW1ldmFsIHRpbWV2YWwwOworc3RydWN0IHRpbWV2YWwgdGltZXZhbDE7CitzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMjsKK3N0cnVjdCB0aW1ldmFsIHRpbWV2YWw3OworbG9uZyBsb25nIGludCBkbmJ5ZHQ7CisKK2ludCAgICB2aWRlb19pbnRlcmZhY2U7CitpbnQgICAgdmlkZW9fYWx0c2V0dGluZ19vbjsKK2ludCAgICB2aWRlb19hbHRzZXR0aW5nX29mZjsKK2ludCAgICB2aWRlb19lbmRwb2ludG51bWJlcjsKK2ludCAgICB2aWRlb19pc29jX21heGZyYW1lc2l6ZTsKK2ludCAgICB2aWRlb19pc29jX2J1ZmZlcl9zaXplOworaW50ICAgIHZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKworaW50ICAgIHZpZGVvX2lzb2Nfc3RyZWFtaW5nOworaW50ICAgIHZpZGVvX2lzb2Nfc2VxdWVuY2U7CitpbnQgICAgdmlkZW9faWRsZTsKK2ludCAgICB2aWRlb19lb2Y7CitpbnQgICAgdmlkZW9fanVuazsKKworaW50ICAgIGZ1ZGdlOworCitzdHJ1Y3QgZGF0YV9idWZmZXIgdmlkZW9faXNvY19idWZmZXJbVklERU9fSVNPQ19CVUZGRVJfTUFOWV07CitzdHJ1Y3QgZGF0YV9idWZmZXIgXAorCSAgICAgZmllbGRfYnVmZmVyW0ZJRUxEX0JVRkZFUl9NQU5ZXVsoRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFKV07CitzdHJ1Y3QgZGF0YV9idWZmZXIgXAorCSAgICAgZnJhbWVfYnVmZmVyW0ZSQU1FX0JVRkZFUl9NQU5ZXVsoRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFKV07CisKK3N0cnVjdCBsaXN0X2hlYWQgdXJiX3ZpZGVvX2hlYWQ7CitzdHJ1Y3QgbGlzdF9oZWFkICpwdXJiX3ZpZGVvX2hlYWQ7CisKK2ludCB2bWFfbWFueTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBCVUZGRVIgSU5ESUNBVE9SUworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZmllbGRfZmlsbDsJCS8qIEZpZWxkIGJ1ZmZlciBiZWluZyBmaWxsZWQgYnkgZWFzeWNhcF9jb21wbGV0ZSgpLiAgKi8KKwkJCS8qICAgQnVtcGVkIG9ubHkgYnkgZWFzeWNhcF9jb21wbGV0ZSgpLiAgICAgICAgICAgICAgKi8KK2ludCBmaWVsZF9wYWdlOwkJLyogUGFnZSBvZiBmaWVsZCBidWZmZXIgcGFnZSBiZWluZyBmaWxsZWQgYnkgICAgICAgICAqLworCQkJLyogICBlYXN5Y2FwX2NvbXBsZXRlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IGZpZWxkX3JlYWQ7CQkvKiBGaWVsZCBidWZmZXIgdG8gYmUgcmVhZCBieSBmaWVsZDJmcmFtZSgpLiAgICAgICAgICovCisJCQkvKiAgIEJ1bXBlZCBvbmx5IGJ5IGVhc3ljYXBfY29tcGxldGUoKS4gICAgICAgICAgICAgICovCitpbnQgZnJhbWVfZmlsbDsJCS8qIEZyYW1lIGJ1ZmZlciBiZWluZyBmaWxsZWQgYnkgZmllbGQyZnJhbWUoKS4gICAgICAgKi8KKwkJCS8qICAgQnVtcGVkIG9ubHkgYnkgZWFzeWNhcF9kcWJ1ZigpIHdoZW4gICAgICAgICAgICAgKi8KKwkJCS8qICAgZmllbGQyZnJhbWUoKSBoYXMgY3JlYXRlZCBhIGNvbXBsZXRlIGZyYW1lLiAgICAgKi8KK2ludCBmcmFtZV9yZWFkOwkJLyogRnJhbWUgYnVmZmVyIG9mZmVyZWQgdG8gdXNlciBieSBEUUJVRi4gICAgICAgICAgICAqLworCQkJLyogICBTZXQgb25seSBieSBlYXN5Y2FwX2RxYnVmKCkgdG8gdHJhaWwgZnJhbWVfZmlsbC4qLworaW50IGZyYW1lX2xvY2s7CQkvKiBGbGFnIHNldCB0byAxIGJ5IERRQlVGIGFuZCBjbGVhcmVkIGJ5IFFCVUYgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElNQUdFIFBST1BFUlRJRVMKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX191MzIgICAgICAgICAgICAgICAgICAgcGl4ZWxmb3JtYXQ7CitfX3UzMiAgICAgICAgICAgICAgICAgICBmaWVsZDsKK2ludCAgICAgICAgICAgICAgICAgICAgIHdpZHRoOworaW50ICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OworaW50ICAgICAgICAgICAgICAgICAgICAgYnl0ZXNwZXJwaXhlbDsKK2Jvb2wgICAgICAgICAgICAgICAgICAgIGJ5dGVzd2Fwb3JkZXI7Citib29sICAgICAgICAgICAgICAgICAgICBkZWNpbWF0ZXBpeGVsOworYm9vbCAgICAgICAgICAgICAgICAgICAgb2ZmZXJmaWVsZHM7CitpbnQgICAgICAgICAgICAgICAgICAgICBmcmFtZV9idWZmZXJfdXNlZDsKK2ludCAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2J1ZmZlcl9tYW55OworaW50ICAgICAgICAgICAgICAgICAgICAgdmlkZW9maWVsZGFtb3VudDsKKworaW50ICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzczsKK2ludCAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0OworaW50ICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbjsKK2ludCAgICAgICAgICAgICAgICAgICAgIGh1ZTsKKworaW50IGFsbG9jYXRpb25fdmlkZW9fdXJiOworaW50IGFsbG9jYXRpb25fdmlkZW9fcGFnZTsKK2ludCBhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdDsKK2ludCByZWdpc3RlcmVkX3ZpZGVvOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTT1VORCBQUk9QRVJUSUVTCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBhdWRpb19pbnRlcmZhY2U7CitpbnQgYXVkaW9fYWx0c2V0dGluZ19vbjsKK2ludCBhdWRpb19hbHRzZXR0aW5nX29mZjsKK2ludCBhdWRpb19lbmRwb2ludG51bWJlcjsKK2ludCBhdWRpb19pc29jX21heGZyYW1lc2l6ZTsKK2ludCBhdWRpb19pc29jX2J1ZmZlcl9zaXplOworaW50IGF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKworaW50IGF1ZGlvX2lzb2Nfc3RyZWFtaW5nOworaW50IGF1ZGlvX2lkbGU7CitpbnQgYXVkaW9fZW9mOworaW50IHZvbHVtZTsKK2ludCBtdXRlOworCitzdHJ1Y3QgZGF0YV9idWZmZXIgYXVkaW9faXNvY19idWZmZXJbQVVESU9fSVNPQ19CVUZGRVJfTUFOWV07CisKK3N0cnVjdCBsaXN0X2hlYWQgdXJiX2F1ZGlvX2hlYWQ7CitzdHJ1Y3QgbGlzdF9oZWFkICpwdXJiX2F1ZGlvX2hlYWQ7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEJVRkZFUiBJTkRJQ0FUT1JTCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBhdWRpb19maWxsOwkJLyogQXVkaW8gYnVmZmVyIGJlaW5nIGZpbGxlZCBieSBlYXN5c25kX2NvbXBsZXRlKCkuICAqLworCQkJLyogICBCdW1wZWQgb25seSBieSBlYXN5c25kX2NvbXBsZXRlKCkuICAgICAgICAgICAgICAqLworaW50IGF1ZGlvX3JlYWQ7CQkvKiBBdWRpbyBidWZmZXIgcGFnZSBiZWluZyByZWFkIGJ5IGVhc3lzbmRfcmVhZCgpLiAgICovCisJCQkvKiAgIFNldCBieSBlYXN5c25kX3JlYWQoKSB0byB0cmFpbCBhdWRpb19maWxsIGJ5ICAgICovCisJCQkvKiAgIG9uZSBmcmFnbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFNPVU5EIFBST1BFUlRJRVMKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgYXVkaW9fYnVmZmVyX21hbnk7CisKK2ludCBhbGxvY2F0aW9uX2F1ZGlvX3VyYjsKK2ludCBhbGxvY2F0aW9uX2F1ZGlvX3BhZ2U7CitpbnQgYWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3Q7CitpbnQgcmVnaXN0ZXJlZF9hdWRpbzsKKworbG9uZyBsb25nIGludCBhdWRpb19zYW1wbGU7Citsb25nIGxvbmcgaW50IGF1ZGlvX25pdmVhdTsKK2xvbmcgbG9uZyBpbnQgYXVkaW9fc3F1YXJlOworCitzdHJ1Y3QgZGF0YV9idWZmZXIgYXVkaW9fYnVmZmVyW107Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBWSURFTyBGVU5DVElPTiBQUk9UT1RZUEVTCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgICAgICAgICAgICAgZWFzeWNhcF9jb21wbGV0ZShzdHJ1Y3QgdXJiICopOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCBcCisJCQkJCQl1bnNpZ25lZCBpbnQsICB1bnNpZ25lZCBsb25nKTsKKworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK2ludCAgICAgICAgICAgICAgZWFzeWNhcF9vcGVuX25vaW5vZGUoc3RydWN0IGZpbGUgKik7CitpbnQgICAgICAgICAgICAgIGVhc3ljYXBfcmVsZWFzZV9ub2lub2RlKHN0cnVjdCBmaWxlICopOworbG9uZyAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsX25vaW5vZGUoc3RydWN0IGZpbGUgKiwgXAorCQkJCQkJdW5zaWduZWQgaW50LCAgdW5zaWduZWQgbG9uZyk7CitpbnQgICAgICAgICAgICAgIHZpZGVvZGV2X3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKTsKKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworCit1bnNpZ25lZCBpbnQgICAgIGVhc3ljYXBfcG9sbChzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX21tYXAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBcCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKK3ZvaWQgICAgICAgICAgICAgZWFzeWNhcF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKK3ZvaWQgICAgICAgICAgICAgZWFzeWNhcF9kZWxldGUoc3RydWN0IGtyZWYgKik7CisKK3ZvaWQgICAgICAgICAgICAgZWFzeWNhcF92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Cit2b2lkICAgICAgICAgICAgIGVhc3ljYXBfdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK2ludCAgICAgICAgICAgICAgZWFzeWNhcF92bWFfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHN0cnVjdCB2bV9mYXVsdCAqKTsKK2ludCAgICAgICAgICAgICAgZWFzeWNhcF9kcWJ1ZihzdHJ1Y3QgZWFzeWNhcCAqLCBpbnQpOworaW50ICAgICAgICAgICAgICBzdWJtaXRfdmlkZW9fdXJicyhzdHJ1Y3QgZWFzeWNhcCAqKTsKK2ludCAgICAgICAgICAgICAga2lsbF92aWRlb191cmJzKHN0cnVjdCBlYXN5Y2FwICopOworaW50ICAgICAgICAgICAgICBmaWVsZDJmcmFtZShzdHJ1Y3QgZWFzeWNhcCAqKTsKK2ludCAgICAgICAgICAgICAgcmVkYXViKHN0cnVjdCBlYXN5Y2FwICosIHZvaWQgKiwgdm9pZCAqLCBcCisJCQkJCQlpbnQsIGludCwgX191OCwgX191OCwgYm9vbCk7Cit2b2lkICAgICAgICAgICAgIGRlYnJpZWYoc3RydWN0IGVhc3ljYXAgKik7Cit2b2lkICAgICAgICAgICAgIHNheXJlYWRvbmx5KHN0cnVjdCBlYXN5Y2FwICopOwordm9pZCAgICAgICAgICAgICBlYXN5Y2FwX3Rlc3RjYXJkKHN0cnVjdCBlYXN5Y2FwICosIGludCk7CitpbnQgICAgICAgICAgICAgIGV4cGxhaW5faW9jdGwoX191MzIpOworaW50ICAgICAgICAgICAgICBleHBsYWluX2NpZChfX3UzMik7CitpbnQgICAgICAgICAgICAgIGZpbGxpbl9mb3JtYXRzKHZvaWQpOworaW50ICAgICAgICAgICAgICBhZGp1c3Rfc3RhbmRhcmQoc3RydWN0IGVhc3ljYXAgKiwgdjRsMl9zdGRfaWQpOworaW50ICAgICAgICAgICAgICBhZGp1c3RfZm9ybWF0KHN0cnVjdCBlYXN5Y2FwICosIF9fdTMyLCBfX3UzMiwgX191MzIsIFwKKwkJCQkJCQkJaW50LCBib29sKTsKK2ludCAgICAgICAgICAgICAgYWRqdXN0X2JyaWdodG5lc3Moc3RydWN0IGVhc3ljYXAgKiwgaW50KTsKK2ludCAgICAgICAgICAgICAgYWRqdXN0X2NvbnRyYXN0KHN0cnVjdCBlYXN5Y2FwICosIGludCk7CitpbnQgICAgICAgICAgICAgIGFkanVzdF9zYXR1cmF0aW9uKHN0cnVjdCBlYXN5Y2FwICosIGludCk7CitpbnQgICAgICAgICAgICAgIGFkanVzdF9odWUoc3RydWN0IGVhc3ljYXAgKiwgaW50KTsKK2ludCAgICAgICAgICAgICAgYWRqdXN0X3ZvbHVtZShzdHJ1Y3QgZWFzeWNhcCAqLCBpbnQpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBBVURJTyBGVU5DVElPTiBQUk9UT1RZUEVTCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgICAgICAgICAgICAgZWFzeXNuZF9jb21wbGV0ZShzdHJ1Y3QgdXJiICopOworc3NpemVfdCAgICAgICAgICBlYXN5c25kX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitpbnQgICAgICAgICAgICAgIGVhc3lzbmRfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitpbnQgICAgICAgICAgICAgIGVhc3lzbmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitpbnQgICAgICAgICAgICAgIGVhc3lzbmRfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIFwKKwkJCQkJCXVuc2lnbmVkIGludCwgIHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgaW50ICAgICBlYXN5c25kX3BvbGwoc3RydWN0IGZpbGUgKiwgcG9sbF90YWJsZSAqKTsKK3ZvaWQgICAgICAgICAgICAgZWFzeXNuZF9kZWxldGUoc3RydWN0IGtyZWYgKik7CitpbnQgICAgICAgICAgICAgIHN1Ym1pdF9hdWRpb191cmJzKHN0cnVjdCBlYXN5Y2FwICopOworaW50ICAgICAgICAgICAgICBraWxsX2F1ZGlvX3VyYnMoc3RydWN0IGVhc3ljYXAgKik7Cit2b2lkICAgICAgICAgICAgIGVhc3lzbmRfdGVzdHRvbmUoc3RydWN0IGVhc3ljYXAgKiwgaW50KTsKK2ludCAgICAgICAgICAgICAgYXVkaW9fc2V0dXAoc3RydWN0IGVhc3ljYXAgKik7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIExPVy1MRVZFTCBGVU5DVElPTiBQUk9UT1RZUEVTCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCAgICAgICAgICAgICAgYXVkaW9fZ2FpbmdldChzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgYXVkaW9fZ2FpbnNldChzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3M4KTsKKworaW50ICAgICAgICAgICAgICBzZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2KTsKK2ludCAgICAgICAgICAgICAgd2FrZXVwX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgY29uZmlybV9yZXNvbHV0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICBjb25maXJtX3N0cmVhbShzdHJ1Y3QgdXNiX2RldmljZSAqKTsKKworaW50ICAgICAgICAgICAgICBzZXR1cF9zdGsoc3RydWN0IHVzYl9kZXZpY2UgKik7CitpbnQgICAgICAgICAgICAgIHNldHVwX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgc2V0dXBfdnQoc3RydWN0IHVzYl9kZXZpY2UgKik7CitpbnQgICAgICAgICAgICAgIGNoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgY2hlY2tfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICByZWFkeV9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKik7CitpbnQgICAgICAgICAgICAgIG1lcml0X3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgY2hlY2tfdnQoc3RydWN0IHVzYl9kZXZpY2UgKik7CitpbnQgICAgICAgICAgICAgIHNlbGVjdF9pbnB1dChzdHJ1Y3QgdXNiX2RldmljZSAqLCBpbnQsIGludCk7CitpbnQgICAgICAgICAgICAgIHNldF9yZXNvbHV0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICosIFwKKwkJCQkJCV9fdTE2LCBfX3UxNiwgX191MTYsIF9fdTE2KTsKKworaW50ICAgICAgICAgICAgICByZWFkX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3UxNik7CitpbnQgICAgICAgICAgICAgIHJlYWRfc3RrKHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTMyKTsKK2ludCAgICAgICAgICAgICAgd3JpdGVfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2LCBfX3UxNik7CitpbnQgICAgICAgICAgICAgIHdhaXRfaTJjKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICB3cml0ZV8wMDAoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYsIF9fdTE2KTsKK2ludCAgICAgICAgICAgICAgc3RhcnRfMTAwKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICBzdG9wXzEwMChzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgd3JpdGVfMzAwKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICByZWFkX3Z0KHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2KTsKK2ludCAgICAgICAgICAgICAgd3JpdGVfdnQoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYsIF9fdTE2KTsKKworaW50ICAgICAgICAgICAgICBzZXQydG83OChzdHJ1Y3QgdXNiX2RldmljZSAqKTsKK2ludCAgICAgICAgICAgICAgc2V0MnRvOTMoc3RydWN0IHVzYl9kZXZpY2UgKik7CisKK2ludCAgICAgICAgICAgICAgcmVnc2V0KHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2LCBfX3UxNik7CitpbnQgICAgICAgICAgICAgIHJlZ2dldChzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3UxNiwgdm9pZCAqKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCB7Citsb25nIGxvbmcgaW50IHF1b3RpZW50OwordW5zaWduZWQgbG9uZyBsb25nIGludCByZW1haW5kZXI7Cit9IHNpZ25lZF9kaXYobG9uZyBsb25nIGludCwgbG9uZyBsb25nIGludCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE1BQ1JPUworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEdFVChYLCBZLCBaKSBkbyB7IFwKKwlpbnQgcmM7IFwKKwkqKFopID0gKF9fdTE2KTA7IFwKKwlyYyA9IHJlZ2dldChYLCBZLCBaKTsgXAorCWlmICgwID4gcmMpIHsgXAorCQlKT1QoOCwgIjotKCVpXG4iLCBfX0xJTkVfXyk7ICByZXR1cm4ocmMpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVChYLCBZLCBaKSBkbyB7IFwKKwlpbnQgcmM7IFwKKwlyYyA9IHJlZ3NldChYLCBZLCBaKTsgXAorCWlmICgwID4gcmMpIHsgXAorCQlKT1QoOCwgIjotKCVpXG4iLCBfX0xJTkVfXyk7ICByZXR1cm4ocmMpOyBcCisJfSBcCit9IHdoaWxlICgwKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFNBWShmb3JtYXQsIGFyZ3MuLi4pIGRvIHsgXAorCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOiAlczogIiBmb3JtYXQsIF9fZnVuY19fLCAjI2FyZ3MpOyBcCit9IHdoaWxlICgwKQorCisKKyNpZiBkZWZpbmVkKEVBU1lDQVBfREVCVUcpCisjZGVmaW5lIEpPVChuLCBmb3JtYXQsIGFyZ3MuLi4pIGRvIHsgXAorCWlmIChuIDw9IGVhc3ljYXBfZGVidWcpIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiZWFzeWNhcDogJXM6ICIgZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTsgXAorCX0gXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEpPVChuLCBmb3JtYXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qRUFTWUNBUF9ERUJVRyovCisKKyNkZWZpbmUgUE9VVCBKT1QoOCwgIjotKGluIGZpbGUgJXMgbGluZSAlNGlcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKworI2RlZmluZSBNSUNST1NFQ09ORFMoWCwgWSkgXAorCQkJKCgxMDAwMDAwKigobG9uZyBsb25nIGludCkoWC50dl9zZWMgLSBZLnR2X3NlYykpKSArIFwKKwkJCQkJKGxvbmcgbG9uZyBpbnQpKFgudHZfdXNlYyAtIFkudHZfdXNlYykpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgKHVuc2lnbmVkIGNoYXIgKilQICAgICAgICAgICBwb2ludGVyIHRvIG5leHQgYnl0ZSBwYWlyCisgKiAgICAgICAobG9uZyBpbnQgKilYICAgICAgICAgICBwb2ludGVyIHRvIGFjY3VtdWxhdGluZyBjb3VudAorICogICAgICAgKGxvbmcgaW50ICopWSAgICAgICAgICAgcG9pbnRlciB0byBhY2N1bXVsYXRpbmcgc3VtCisgKiAgKGxvbmcgbG9uZyBpbnQgKilaICAgICAgICAgICBwb2ludGVyIHRvIGFjY3VtdWxhdGluZyBzdW0gb2Ygc3F1YXJlcworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFNVTU1FUihQLCBYLCBZLCBaKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGNoYXIgKnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGludCB1MCwgdTEsIHUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWxvbmcgaW50IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXAgPSAodW5zaWduZWQgY2hhciAqKShQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXUwID0gKHVuc2lnbmVkIGludCkgKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXUxID0gKHVuc2lnbmVkIGludCkgKCoocCArIDEpKTsgICAgICAgICAgICAgICAgICAgICAgXAorCXUyID0gKHVuc2lnbmVkIGludCkgKCh1MSA8PCA4KSB8IHUwKTsgICAgICAgICAgICAgICAgXAorCWlmICgweDgwMDAgJiB1MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlzID0gLShsb25nIGludCkoMHg3RkZGICYgKH51MikpOyAgICAgICAgICAgICBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXMgPSAgKGxvbmcgaW50KSgweDdGRkYgJiB1Mik7ICAgICAgICAgICAgICAgIFwKKwkqKChYKSkgKz0gKGxvbmcgaW50KSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkqKChZKSkgKz0gKGxvbmcgaW50KSBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkqKChaKSkgKz0gKChsb25nIGxvbmcgaW50KShzKSAqIChsb25nIGxvbmcgaW50KShzKSk7IFwKK30gd2hpbGUgKDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbmRpZiAvKkVBU1lDQVBfSCovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxMGQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfZGVidWcuaApAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgZWFzeWNhcF9kZWJ1Zy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFIuTS4gVGhvbWFzICA8cm10aG9tYXNAc2Npb2x1cy5vcmc+CisgKgorICoKKyAqICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhlIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgZWFzeWNhcF9kZWJ1ZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZiNjNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCkBAIC0wLDAgKzEsMjY4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgZWFzeWNhcF9pb2N0bC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFIuTS4gVGhvbWFzICA8cm10aG9tYXNAc2Npb2x1cy5vcmc+CisgKgorICoKKyAqICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhlIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImVhc3ljYXAuaCIKKyNpbmNsdWRlICJlYXN5Y2FwX2RlYnVnLmgiCisjaW5jbHVkZSAiZWFzeWNhcF9zdGFuZGFyZC5oIgorI2luY2x1ZGUgImVhc3ljYXBfaW9jdGwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFVOTEVTUyBUSEVSRSBJUyBBIFBSRU1BVFVSRSBFUlJPUiBSRVRVUk4gVEhJUyBST1VUSU5FIFVQREFURVMgVEhFCisgKiAgRk9MTE9XSU5HOgorICogICAgICAgICAgcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldAorICogICAgICAgICAgcGVhc3ljYXAtPmZwcworICogICAgICAgICAgcGVhc3ljYXAtPnVzZWMKKyAqICAgICAgICAgIHBlYXN5Y2FwLT50b2xlcmF0ZQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYWRqdXN0X3N0YW5kYXJkKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCwgdjRsMl9zdGRfaWQgc3RkX2lkKQoreworc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOworX191MTYgcmVnLCBzZXQ7CitpbnQgaXIsIHJjLCBuZWVkOwordW5zaWduZWQgaW50IGl0d2FzLCBpc25vdzsKKworaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFswXTsKK3doaWxlICgweEZGRkYgIT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKKwlpZiAoc3RkX2lkICYgcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuaWQpCisJCWJyZWFrOworCXBlYXN5Y2FwX3N0YW5kYXJkKys7Cit9CitpZiAoMHhGRkZGID09IHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7CisJU0FZKCJFUlJPUjogMHglMDhYPXN0ZF9pZDogc3RhbmRhcmQgbm90IGZvdW5kXG4iLCBcCisJCQkJCQkJKHVuc2lnbmVkIGludClzdGRfaWQpOworCXJldHVybiAtRUlOVkFMOworfQorU0FZKCJ1c2VyIHJlcXVlc3RzIHN0YW5kYXJkOiAlc1xuIiwgXAorCQkJJihwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5uYW1lWzBdKSk7CitpZiAocGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCA9PSBcCisJCQkoaW50KShwZWFzeWNhcF9zdGFuZGFyZCAtICZlYXN5Y2FwX3N0YW5kYXJkWzBdKSkgeworCVNBWSgicmVxdWVzdGVkIHN0YW5kYXJkIGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKKwlyZXR1cm4gMDsKK30KK3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgPSAoaW50KShwZWFzeWNhcF9zdGFuZGFyZCAtICZlYXN5Y2FwX3N0YW5kYXJkWzBdKTsKK3BlYXN5Y2FwLT5mcHMgPSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciAvIFwKKwkJcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuZnJhbWVwZXJpb2QubnVtZXJhdG9yOworaWYgKCFwZWFzeWNhcC0+ZnBzKSB7CisJU0FZKCJNSVNUQUtFOiBmcmFtZXMtcGVyLXNlY29uZCBpcyB6ZXJvXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK0pPVCg4LCAiJWkgZnJhbWVzLXBlci1zZWNvbmRcbiIsIHBlYXN5Y2FwLT5mcHMpOworcGVhc3ljYXAtPnVzZWMgPSAxMDAwMDAwIC8gKDIgKiBwZWFzeWNhcC0+ZnBzKTsKK3BlYXN5Y2FwLT50b2xlcmF0ZSA9IDEwMDAgKiAoMjUgLyBwZWFzeWNhcC0+ZnBzKTsKKwora2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFNBQTcxMTNIIERBVEFTSEVFVCBQQUdFIDQ0LCBUQUJMRSA0MgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK25lZWQgPSAwOyAgaXR3YXMgPSAwOyAgcmVnID0gMHgwMDsgIHNldCA9IDB4MDA7Citzd2l0Y2ggKHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrICYgMHgwMDBGKSB7CitjYXNlIE5UU0NfTV9KUDogeworCXJlZyA9IDB4MEE7ICBzZXQgPSAweDk1OworCWlyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOworCWlmICgwID4gaXIpCisJCVNBWSgiRVJST1I6IGNhbm5vdCByZWFkIFNBQSByZWdpc3RlciAweCUwMlhcbiIsIHJlZyk7CisJZWxzZQorCQlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7CisKKworCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CisKKworCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOworCWlmICgwICE9IHJjKQorCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAiIFwKKwkJCSIweCUwMlggdG8gMHglMDJYIGZvciBKUCBzdGFuZGFyZFxuIiwgcmVnLCBzZXQpOworCWVsc2UgeworCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOworCQlpZiAoMCA+IGlyKQorCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQkJInRvIDB4JTAyWFxuIiwgcmVnLCBpc25vdyk7CisJCWVsc2UKKwkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKKworCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCisJfQorCisJcmVnID0gMHgwQjsgIHNldCA9IDB4NDg7CisJaXIgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CisJaWYgKDAgPiBpcikKKwkJU0FZKCJFUlJPUjogY2Fubm90IHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWFxuIiwgcmVnKTsKKwllbHNlCisJCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKKworCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CisKKwlyYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKKwlpZiAoMCAhPSByYykKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWCAiIFwKKwkJCQkJCSJmb3IgSlAgc3RhbmRhcmRcbiIsIHJlZywgc2V0KTsKKwllbHNlIHsKKwkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKKwkJaWYgKDAgPiBpcikKKwkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJCSJ0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOworCQllbHNlCisJCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CisKKwkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworCX0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBOT1RFOiAgTk8gYnJlYWsgSEVSRTogIFJVTiBPTiBUTyBORVhUIENBU0UKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9CitjYXNlIE5UU0NfTToKK2Nhc2UgUEFMX0JHSElOOiB7CisJcmVnID0gMHgwRTsgIHNldCA9IDB4MDE7ICBuZWVkID0gMTsgIGJyZWFrOworfQorY2FzZSBOVFNDX05fNDQzOgorY2FzZSBQQUxfNjA6IHsKKwlyZWcgPSAweDBFOyAgc2V0ID0gMHgxMTsgIG5lZWQgPSAxOyAgYnJlYWs7Cit9CitjYXNlIE5UU0NfNDQzOgorY2FzZSBQQUxfTmM6IHsKKwlyZWcgPSAweDBFOyAgc2V0ID0gMHgyMTsgIG5lZWQgPSAxOyAgYnJlYWs7Cit9CitjYXNlIE5UU0NfTjoKK2Nhc2UgUEFMX006IHsKKwlyZWcgPSAweDBFOyAgc2V0ID0gMHgzMTsgIG5lZWQgPSAxOyAgYnJlYWs7Cit9CitjYXNlIFNFQ0FNOiB7CisJcmVnID0gMHgwRTsgIHNldCA9IDB4NTE7ICBuZWVkID0gMTsgIGJyZWFrOworfQorZGVmYXVsdDoKKwlicmVhazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKG5lZWQpIHsKKwlpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKKwlpZiAoMCA+IGlyKQorCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOworCWVsc2UKKwkJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOworCisJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOworCWlmICgwICE9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAiIFwKKwkJCSIweCUwMlggdG8gMHglMDJYIGZvciB0YWJsZSA0MlxuIiwgcmVnLCBzZXQpOworCX0gZWxzZSB7CisJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CisJCWlmICgwID4gaXIpCisJCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCQkidG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKKwkJZWxzZQorCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTQUE3MTEzSCBEQVRBU0hFRVQgUEFHRSA0MQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3JlZyA9IDB4MDg7CitpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKK2lmICgwID4gaXIpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCAiIFwKKwkJCQkJCSJzbyBjYW5ub3QgcmVzZXRcbiIsIHJlZyk7CitlbHNlIHsKKwlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7CisJaWYgKHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrICYgMHgwMDAxKQorCQlzZXQgPSBpdHdhcyB8IDB4NDAgOworCWVsc2UKKwkJc2V0ID0gaXR3YXMgJiB+MHg0MCA7CisKK3NldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CisKK3JjICA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKK2lmICgwICE9IHJjKQorCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgc2V0KTsKK2Vsc2UgeworCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CisJaWYgKDAgPiBpcikKKwkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgdG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKKwllbHNlCisJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTQUE3MTEzSCBEQVRBU0hFRVQgUEFHRSA1MSwgVEFCTEUgNTcKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcmVnID0gMHg0MDsKK2lyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOworaWYgKDAgPiBpcikKKwlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYICIgXAorCQkJCQkJInNvIGNhbm5vdCByZXNldFxuIiwgcmVnKTsKK2Vsc2UgeworCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKKwlpZiAocGVhc3ljYXBfc3RhbmRhcmQtPm1hc2sgJiAweDAwMDEpCisJCXNldCA9IGl0d2FzIHwgMHg4MCA7CisJZWxzZQorCQlzZXQgPSBpdHdhcyAmIH4weDgwIDsKKworc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworcmMgPSB3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcsIHNldCk7CitpZiAoMCAhPSByYykKKwlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIHNldCk7CitlbHNlIHsKKwlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOworCWlmICgwID4gaXIpCisJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkIHRvIDB4JTAyWFxuIiwgcmVnLCBpc25vdyk7CisJZWxzZQorCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU0FBNzExM0ggREFUQVNIRUVUIFBBR0UgNTMsIFRBQkxFIDY2CisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcmVnID0gMHg1QTsKK2lyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOworaWYgKDAgPiBpcikKKwlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYIGJ1dCBjb250aW51aW5nXG4iLCByZWcpOworCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKKwlpZiAocGVhc3ljYXBfc3RhbmRhcmQtPm1hc2sgJiAweDAwMDEpCisJCXNldCA9IDB4MEEgOworCWVsc2UKKwkJc2V0ID0gMHgwNyA7CisKKwlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCisJaWYgKDAgIT0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpKQorCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCBcCisJCQkJCQkJCXJlZywgc2V0KTsKKwllbHNlIHsKKwkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKKwkJaWYgKDAgPiBpcikKKwkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIKKwkJCQkidG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKKwkJZWxzZQorCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIgorCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKKwl9CisJaWYgKDAgIT0gY2hlY2tfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSkpCisJCVNBWSgiRVJST1I6IGNoZWNrX3NhYSgpIGZhaWxlZFxuIik7CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBUSEUgQUxHT1JJVEhNIEZPUiBSRVNQT05ESU5HIFRPIFRIRSBWSURJT19TX0ZNVCBJT0NUTCBERVBFTkRTIE9OIFRIRQorICogIENVUlJFTlQgVkFMVUUgT0YgcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldC4KKyAqICBQUk9WSURFRCBUSEUgQVJHVU1FTlQgdHJ5IElTIGZhbHNlIEFORCBUSEVSRSBJUyBOTyBQUkVNQVRVUkUgRVJST1IgUkVUVVJOCisgKiAgVEhJUyBST1VUSU5FIFVQREFURVMgVEhFIEZPTExPV0lORzoKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0CisgKiAgICAgICAgICBwZWFzeWNhcC0+cGl4ZWxmb3JtYXQKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5maWVsZAorICogICAgICAgICAgcGVhc3ljYXAtPmhlaWdodAorICogICAgICAgICAgcGVhc3ljYXAtPndpZHRoCisgKiAgICAgICAgICBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbAorICogICAgICAgICAgcGVhc3ljYXAtPmJ5dGVzd2Fwb3JkZXIKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5kZWNpbWF0ZXBpeGVsCisgKiAgICAgICAgICBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQKKyAqICAgICAgICAgIHBlYXN5Y2FwLT52aWRlb2ZpZWxkYW1vdW50CisgKiAgICAgICAgICBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMKKyAqCisgKiAgSUYgU1VDQ0VTU0ZVTCBUSEUgRlVOQ1RJT04gUkVUVVJOUyBUSEUgT0ZGU0VUIElOIGVhc3ljYXBfZm9ybWF0W10KKyAqICBJREVOVElGWUlORyBUSEUgRk9STUFUIFdISUNIIElTIFRPIFJFVFVSTkVEIFRPIFRIRSBVU0VSLgorICogIEVSUk9SUyBSRVRVUk4gQSBORUdBVElWRSBOVU1CRVIuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGFkanVzdF9mb3JtYXQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBcCisJX191MzIgd2lkdGgsIF9fdTMyIGhlaWdodCwgX191MzIgcGl4ZWxmb3JtYXQsIGludCBmaWVsZCwgYm9vbCB0cnkpCit7CitzdHJ1Y3QgZWFzeWNhcF9mb3JtYXQgKnBlYXN5Y2FwX2Zvcm1hdCwgKnBlYXN5Y2FwX2Jlc3RfZm9ybWF0OworX191MTYgbWFzazsKK3N0cnVjdCB1c2JfZGV2aWNlICpwOworaW50IG1pc3MsIG11bHRpcGxpZXIsIGJlc3Q7CitjaGFyIGJmWzVdLCAqcGM7CitfX3UzMiB1YzsKKworaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3AgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwKSB7CisJU0FZKCJFUlJPUjogcGVheWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwYyA9ICZiZlswXTsKK3VjID0gcGl4ZWxmb3JtYXQ7ICBtZW1jcHkoKHZvaWQgKilwYywgKHZvaWQgKikoJnVjKSwgNCk7ICBiZls0XSA9IDA7CittYXNrID0gZWFzeWNhcF9zdGFuZGFyZFtwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XS5tYXNrOworU0FZKCJzb3VnaHQ6ICAgICVpeCVpLCVzKDB4JTA4WCksJWk9ZmllbGQsMHglMDJYPXN0ZCBtYXNrXG4iLCBcCisJCQkJd2lkdGgsIGhlaWdodCwgcGMsIHBpeGVsZm9ybWF0LCBmaWVsZCwgbWFzayk7CitpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKKwlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwlTQVkoInByZWZlcjogICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEPWZpZWxkLCB3YXMgVjRMMl9GSUVMRF9BTllcbiIpOworfQorcGVhc3ljYXBfYmVzdF9mb3JtYXQgPSAoc3RydWN0IGVhc3ljYXBfZm9ybWF0ICopTlVMTDsKK3BlYXN5Y2FwX2Zvcm1hdCA9ICZlYXN5Y2FwX2Zvcm1hdFswXTsKK3doaWxlICgwICE9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgeworCUpPVCgxNiwgIi4+ICVpICVpIDB4JTA4WCAlaXglaVxuIiwgXAorCQlwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDAxLAorCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQsCisJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCwKKwkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoLAorCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KTsKKworCWlmICgoKHBlYXN5Y2FwX2Zvcm1hdC0+bWFzayAmIDB4MEYpID09IChtYXNrICYgMHgwRikpICYmIFwKKwkJKHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5maWVsZCA9PSBmaWVsZCkgJiYgXAorCQkocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFwKKwkJCQkJCQlwaXhlbGZvcm1hdCkgJiYgXAorCQkocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoICA9PSB3aWR0aCkgJiYgXAorCQkocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCA9PSBoZWlnaHQpKSB7CisJCQlwZWFzeWNhcF9iZXN0X2Zvcm1hdCA9IHBlYXN5Y2FwX2Zvcm1hdDsKKwkJCWJyZWFrOworCQl9CisJcGVhc3ljYXBfZm9ybWF0Kys7Cit9CitpZiAoMCA9PSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKKwlTQVkoImNhbm5vdCBkbzogJWl4JWkgd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAorCQkJCQkJCXdpZHRoLCBoZWlnaHQsIG1hc2spOworCXBlYXN5Y2FwX2Zvcm1hdCA9ICZlYXN5Y2FwX2Zvcm1hdFswXTsgIGJlc3QgPSAtMTsKKwl3aGlsZSAoMCAhPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKKwkJaWYgKCgocGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgwRikgPT0gKG1hc2sgJiAweDBGKSkgJiYgXAorCQkJCSAocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4XAorCQkJCQkJLmZpZWxkID09IGZpZWxkKSAmJiBcCisJCQkJIChwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXhcCisJCQkJCQkucGl4ZWxmb3JtYXQgPT0gcGl4ZWxmb3JtYXQpKSB7CisJCQltaXNzID0gYWJzKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoICAtIHdpZHRoKTsKKwkJCWlmICgoYmVzdCA+IG1pc3MpIHx8IChiZXN0IDwgMCkpIHsKKwkJCQliZXN0ID0gbWlzczsKKwkJCQlwZWFzeWNhcF9iZXN0X2Zvcm1hdCA9IHBlYXN5Y2FwX2Zvcm1hdDsKKwkJCQlpZiAoIW1pc3MpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXBlYXN5Y2FwX2Zvcm1hdCsrOworCX0KKwlpZiAoLTEgPT0gYmVzdCkgeworCQlTQVkoImNhbm5vdCBkbyAlaXguLi4gd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAorCQkJCQkJCQl3aWR0aCwgbWFzayk7CisJCVNBWSgiY2Fubm90IGRvIC4uLnglaSB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCisJCQkJCQkJCWhlaWdodCwgbWFzayk7CisJCVNBWSgiICAgICAgICAgICAlaXglaSB1bm1hdGNoZWRcbiIsIHdpZHRoLCBoZWlnaHQpOworCQlyZXR1cm4gcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQ7CisJfQorfQoraWYgKChzdHJ1Y3QgZWFzeWNhcF9mb3JtYXQgKilOVUxMID09IHBlYXN5Y2FwX2Jlc3RfZm9ybWF0KSB7CisJU0FZKCJNSVNUQUtFOiBwZWFzeWNhcF9iZXN0X2Zvcm1hdCBpcyBOVUxMIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitwZWFzeWNhcF9mb3JtYXQgPSBwZWFzeWNhcF9iZXN0X2Zvcm1hdDsKKworLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLworaWYgKHRydWUgPT0gdHJ5KQorCXJldHVybiAoaW50KShwZWFzeWNhcF9iZXN0X2Zvcm1hdCAtICZlYXN5Y2FwX2Zvcm1hdFswXSk7CisvKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCisKK2lmIChmYWxzZSAhPSB0cnkpIHsKKwlTQVkoIk1JU1RBS0U6IHRydWU9PXRyeSB3aGVyZSBpcyBzaG91bGQgYmUgZmFsc2VcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorU0FZKCJhY3Rpb25pbmc6ICVpeCVpICVzXG4iLCBcCisJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgsIFwKKwkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQsCisJCQkmcGVhc3ljYXBfZm9ybWF0LT5uYW1lWzBdKTsKK3BlYXN5Y2FwLT5oZWlnaHQgICAgICAgID0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodDsKK3BlYXN5Y2FwLT53aWR0aCAgICAgICAgID0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoOworcGVhc3ljYXAtPnBpeGVsZm9ybWF0ICAgPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQ7CitwZWFzeWNhcC0+ZmllbGQgICAgICAgICA9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5maWVsZDsKK3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0ID0gKGludCkocGVhc3ljYXBfZm9ybWF0IC0gJmVhc3ljYXBfZm9ybWF0WzBdKTsKK3BlYXN5Y2FwLT5ieXRlc3BlcnBpeGVsID0gKDB4MDBGMCAmIHBlYXN5Y2FwX2Zvcm1hdC0+bWFzaykgPj4gNCA7CitpZiAoMHgwMTAwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKQorCXBlYXN5Y2FwLT5ieXRlc3dhcG9yZGVyID0gdHJ1ZTsKK2Vsc2UKKwlwZWFzeWNhcC0+Ynl0ZXN3YXBvcmRlciA9IGZhbHNlOworaWYgKDB4MDgwMCAmIHBlYXN5Y2FwX2Zvcm1hdC0+bWFzaykKKwlwZWFzeWNhcC0+ZGVjaW1hdGVwaXhlbCA9IHRydWU7CitlbHNlCisJcGVhc3ljYXAtPmRlY2ltYXRlcGl4ZWwgPSBmYWxzZTsKK2lmICgweDEwMDAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spCisJcGVhc3ljYXAtPm9mZmVyZmllbGRzID0gdHJ1ZTsKK2Vsc2UKKwlwZWFzeWNhcC0+b2ZmZXJmaWVsZHMgPSBmYWxzZTsKK2lmICh0cnVlID09IHBlYXN5Y2FwLT5kZWNpbWF0ZXBpeGVsKQorCW11bHRpcGxpZXIgPSAyOworZWxzZQorCW11bHRpcGxpZXIgPSAxOworcGVhc3ljYXAtPnZpZGVvZmllbGRhbW91bnQgPSBtdWx0aXBsaWVyICogcGVhc3ljYXAtPndpZHRoICogXAorCQkJCQltdWx0aXBsaWVyICogcGVhc3ljYXAtPmhlaWdodDsKK3BlYXN5Y2FwLT5mcmFtZV9idWZmZXJfdXNlZCA9IHBlYXN5Y2FwLT5ieXRlc3BlcnBpeGVsICogXAorCQkJCQlwZWFzeWNhcC0+d2lkdGggKiBwZWFzeWNhcC0+aGVpZ2h0OworCitpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpIHsKKwlTQVkoIldBUk5JTkc6ICVpPXBlYXN5Y2FwLT5maWVsZCBpcyB1bnRlc3RlZDogIiBcCisJCQkJInBsZWFzZSByZXBvcnQgcHJvYmxlbXNcbiIsIHBlYXN5Y2FwLT5maWVsZCk7CisKKworLyoKKyAqICAgIEZJWE1FIC0tLS0gVEhJUyBJUyBVTlRFU1RFRCwgTUFZIEJFIChBTkQgUFJPQkFCTFkgSVMpIElOQ09SUkVDVDoKKyAqCisgKiAgICBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQgPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQgLyAyOworICoKKyAqICAgIFNPIERPIE5PVCBSSVNLIElUIFlFVC4KKyAqCisgKi8KKworCisKK30KKwora2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBQQUwKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKDAgPT0gKDB4MDEgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spKSB7CisJaWYgKCgoNzIwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXAorCQkJKDU3NiA9PSBcCisJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkgfHwgXAorCQkJKCgzNjAgPT0gXAorCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSAmJiBcCisJCQkoMjg4ID09IFwKKwkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSkgeworCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMDAsIDB4MDAwMSwgMHgwNUEwLCAweDAxMjEpKSB7CisJCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoKDcwNCA9PSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpICYmIFwKKwkJCSg1NzYgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpIHsKKwkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDA0LCAweDAwMDEsIDB4MDU4NCwgMHgwMTIxKSkgeworCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKCgoNjQwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXAorCQkJKDQ4MCA9PSBcCisJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkgfHwgXAorCQkJKCgzMjAgPT0gXAorCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSAmJiBcCisJCQkoMjQwID09IFwKKwkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSkgeworCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMTQsIDB4MDAyMCwgMHgwNTE0LCAweDAxMTApKSB7CisJCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCVNBWSgiTUlTVEFLRTogYmFkIGZvcm1hdCwgY2Fubm90IHNldCByZXNvbHV0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBOVFNDCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK30gZWxzZSB7CisJaWYgKCgoNzIwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXAorCQkJKDQ4MCA9PSBcCisJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkgfHwgXAorCQkJKCgzNjAgPT0gXAorCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSAmJiBcCisJCQkoMjQwID09IFwKKwkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSkgeworCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMDAsIDB4MDAwMywgMHgwNUEwLCAweDAwRjMpKSB7CisJCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoKCg2NDAgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSAmJiBcCisJCQkoNDgwID09IFwKKwkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSB8fCBcCisJCQkoKDMyMCA9PSBcCisJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpICYmIFwKKwkJCSgyNDAgPT0gXAorCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpKSB7CisJCWlmICgwICE9IHNldF9yZXNvbHV0aW9uKHAsIDB4MDAxNCwgMHgwMDAzLCAweDA1MTQsIDB4MDBGMykpIHsKKwkJCVNBWSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJU0FZKCJNSVNUQUtFOiBiYWQgZm9ybWF0LCBjYW5ub3Qgc2V0IHJlc29sdXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NoZWNrX3N0ayhwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCityZXR1cm4gKGludCkocGVhc3ljYXBfYmVzdF9mb3JtYXQgLSAmZWFzeWNhcF9mb3JtYXRbMF0pOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGFkanVzdF9icmlnaHRuZXNzKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCwgaW50IHZhbHVlKQorewordW5zaWduZWQgaW50IG1vb2Q7CitpbnQgaTE7CisKK2lmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2kxID0gMDsKK3doaWxlICgweEZGRkZGRkZGICE9IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwlpZiAoVjRMMl9DSURfQlJJR0hUTkVTUyA9PSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CisJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtID4gdmFsdWUpIHx8IFwKKwkJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKKwkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCQlwZWFzeWNhcC0+YnJpZ2h0bmVzcyA9IHZhbHVlOworCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludClwZWFzeWNhcC0+YnJpZ2h0bmVzczsKKworCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCisJCWlmICghd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgwQSwgbW9vZCkpIHsKKwkJCVNBWSgiYWRqdXN0aW5nIGJyaWdodG5lc3MgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBicmlnaHRuZXNzICIgXAorCQkJCQkJCSJ0byAweCUwMlhcbiIsIG1vb2QpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKworCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCisJCWJyZWFrOworCX0KKwlpMSsrOworfQorU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGJyaWdodG5lc3M6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK3JldHVybiAtRU5PRU5UOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGFkanVzdF9jb250cmFzdChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKK3sKK3Vuc2lnbmVkIGludCBtb29kOworaW50IGkxOworCitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpMSA9IDA7Cit3aGlsZSAoMHhGRkZGRkZGRiAhPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CisJaWYgKFY0TDJfQ0lEX0NPTlRSQVNUID09IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPiB2YWx1ZSkgfHwgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtIDwgdmFsdWUpKQorCQkJdmFsdWUgPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmRlZmF1bHRfdmFsdWU7CisJCXBlYXN5Y2FwLT5jb250cmFzdCA9IHZhbHVlOworCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludCkgKHBlYXN5Y2FwLT5jb250cmFzdCAtIDEyOCk7CisKKwkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEIsIG1vb2QpKSB7CisJCQlTQVkoImFkanVzdGluZyBjb250cmFzdCB0byAgMHglMDJYXG4iLCBtb29kKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGNvbnRyYXN0IHRvICIgXAorCQkJCQkJCSIweCUwMlhcbiIsIG1vb2QpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKworCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCisJCWJyZWFrOworCX0KKwlpMSsrOworfQorU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGNvbnRyYXN0OiBjb250cm9sIG5vdCBmb3VuZFxuIik7CityZXR1cm4gLUVOT0VOVDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBhZGp1c3Rfc2F0dXJhdGlvbihzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKK3sKK3Vuc2lnbmVkIGludCBtb29kOworaW50IGkxOworCitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpMSA9IDA7Cit3aGlsZSAoMHhGRkZGRkZGRiAhPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CisJaWYgKFY0TDJfQ0lEX1NBVFVSQVRJT04gPT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgeworCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCisJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCisJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKwkJcGVhc3ljYXAtPnNhdHVyYXRpb24gPSB2YWx1ZTsKKwkJbW9vZCA9IDB4MDBGRiAmICh1bnNpZ25lZCBpbnQpIChwZWFzeWNhcC0+c2F0dXJhdGlvbiAtIDEyOCk7CisKKwkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEMsIG1vb2QpKSB7CisJCQlTQVkoImFkanVzdGluZyBzYXR1cmF0aW9uIHRvICAweCUwMlhcbiIsIG1vb2QpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgc2F0dXJhdGlvbiB0byAiIFwKKwkJCQkJCQkiMHglMDJYXG4iLCBtb29kKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCWJyZWFrOworCisJCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CisKKwl9CisJaTErKzsKK30KK1NBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBzYXR1cmF0aW9uOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CityZXR1cm4gLUVOT0VOVDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBhZGp1c3RfaHVlKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCwgaW50IHZhbHVlKQorewordW5zaWduZWQgaW50IG1vb2Q7CitpbnQgaTEsIGkyOworCitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpMSA9IDA7Cit3aGlsZSAoMHhGRkZGRkZGRiAhPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CisJaWYgKFY0TDJfQ0lEX0hVRSA9PSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CisJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtID4gdmFsdWUpIHx8IFwKKwkJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKKwkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCQlwZWFzeWNhcC0+aHVlID0gdmFsdWU7CisJCWkyID0gcGVhc3ljYXAtPmh1ZSAtIDEyODsKKwkJbW9vZCA9IDB4MDBGRiAmICgoaW50KSBpMik7CisKKwkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEQsIG1vb2QpKSB7CisJCQlTQVkoImFkanVzdGluZyBodWUgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBodWUgdG8gMHglMDJYXG4iLCBtb29kKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisKKwkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKworCQlicmVhazsKKwl9CisJaTErKzsKK30KK1NBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBodWU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK3JldHVybiAtRU5PRU5UOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGFkanVzdF92b2x1bWUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCit7CitfX3M4IG1vb2Q7CitpbnQgaTE7CisKK2lmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2kxID0gMDsKK3doaWxlICgweEZGRkZGRkZGICE9IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwlpZiAoVjRMMl9DSURfQVVESU9fVk9MVU1FID09IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPiB2YWx1ZSkgfHwgXAorCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKKwkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCQlwZWFzeWNhcC0+dm9sdW1lID0gdmFsdWU7CisJCW1vb2QgPSAoMTYgPiBwZWFzeWNhcC0+dm9sdW1lKSA/IDE2IDogXAorCQkJKCgzMSA8IHBlYXN5Y2FwLT52b2x1bWUpID8gMzEgOiBcCisJCQkoX19zOCkgcGVhc3ljYXAtPnZvbHVtZSk7CisJCWlmICghYXVkaW9fZ2FpbnNldChwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIG1vb2QpKSB7CisJCQlTQVkoImFkanVzdGluZyB2b2x1bWUgdG8gMHglMDFYXG4iLCBtb29kKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IHZvbHVtZSB0byAiIFwKKwkJCQkJCQkiMHglMVhcbiIsIG1vb2QpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJYnJlYWs7CisJfQoraTErKzsKK30KK1NBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK3JldHVybiAtRU5PRU5UOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBBTiBBTFRFUk5BVElWRSBNRVRIT0QgT0YgTVVUSU5HIE1JR0hUIFNFRU0gVE8gQkU6CisgKiAgICAgICAgICAgIHVzYl9zZXRfaW50ZXJmYWNlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29mZik7CisgKiAgSE9XRVZFUiwgQUZURVIgVEhJUyBDT01NQU5EIElTIElTU1VFRCBBTEwgU1VCU0VRVUVOVCBVUkJTIFJFQ0VJVkUgU1RBVFVTCisgKiAgLUVTSFVURE9XTi4gIFRIRSBIQU5ETEVSIFJPVVRJTkUgZWFzeXNuZF9jb21wbGV0ZSgpIERFQ0xJTkVTIFRPIFJFU1VCTUlUCisgKiAgVEhFIFVSQiBBTkQgVEhFIFBJUEVMSU5FIENPTExBUFNFUyBJUlJFVFJJRVZBQkxZLiAgQkVXQVJFLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYWRqdXN0X211dGUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCit7CitpbnQgaTE7CisKK2lmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2kxID0gMDsKK3doaWxlICgweEZGRkZGRkZGICE9IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwlpZiAoVjRMMl9DSURfQVVESU9fTVVURSA9PSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CisJCXBlYXN5Y2FwLT5tdXRlID0gdmFsdWU7CisJCXN3aXRjaCAocGVhc3ljYXAtPm11dGUpIHsKKwkJY2FzZSAxOiB7CisJCQlwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDE7CisJCQlwZWFzeWNhcC0+dGltZXZhbDAudHZfc2VjID0gMDsKKwkJCVNBWSgiYWRqdXN0aW5nIG11dGU6ICVpPXBlYXN5Y2FwLT5hdWRpb19pZGxlXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGVmYXVsdDogeworCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUgPSAwOworCQkJU0FZKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+YXVkaW9faWRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl9CisJCWJyZWFrOworCX0KKwlpMSsrOworfQorU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IG11dGU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK3JldHVybiAtRU5PRU5UOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQorbG9uZworZWFzeWNhcF9pb2N0bF9ub2lub2RlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcCisJCQkJCQkJCQl7CisJcmV0dXJuIGVhc3ljYXBfaW9jdGwoKHN0cnVjdCBpbm9kZSAqKU5VTEwsIGZpbGUsIGNtZCwgYXJnKTsKK30KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZWFzeWNhcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgXAorCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKK3N0YXRpYyBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2UgKnA7CitzdGF0aWMgX191MzIgaXNlcXVlbmNlOworCitwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtMTsKK30KK3AgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBNT1NUIE9GIFRIRSBWQVJJQUJMRVMgREVDTEFSRUQgc3RhdGljIElOIFRIRSBjYXNle30gQkxPQ0tTIEJFTE9XIEFSRSBTTworICogIERFQ0xBUkVEIFNJTVBMWSBUTyBBVk9JRCBBIENPTVBJTEVSIFdBUk5JTkcgT0YgVEhFIEtJTkQ6CisgKiAgZWFzeWNhcF9pb2N0bC5jOiB3YXJuaW5nOgorICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFtZSBzaXplIG9mIC4uLiBieXRlcyBpcyBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N3aXRjaCAoY21kKSB7CitjYXNlIFZJRElPQ19RVUVSWUNBUDogeworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHY0bDJfY2FwYWJpbGl0eTsKKwlzdGF0aWMgY2hhciB2ZXJzaW9uWzE2XSwgKnAxLCAqcDI7CisJc3RhdGljIGludCBpLCByYywga1szXTsKKwlzdGF0aWMgbG9uZyBsbmc7CisKKwlKT1QoOCwgIlZJRElPQ19RVUVSWUNBUFxuIik7CisKKwlpZiAoMTYgPD0gc3RybGVuKEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04pKSB7CisJCVNBWSgiRVJST1I6IGJhZCBkcml2ZXIgdmVyc2lvbiBzdHJpbmdcbiIpOyByZXR1cm4gLUVJTlZBTDsKKwl9CisJc3RyY3B5KCZ2ZXJzaW9uWzBdLCBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlrW2ldID0gMDsKKwlwMiA9ICZ2ZXJzaW9uWzBdOyAgaSA9IDA7CisJd2hpbGUgKCpwMikgeworCQlwMSA9IHAyOworCQl3aGlsZSAoKnAyICYmICgnLicgIT0gKnAyKSkKKwkJCXAyKys7CisJCWlmICgqcDIpCisJCQkqcDIrKyA9IDA7CisJCWlmICgzID4gaSkgeworCQkJcmMgPSAoaW50KSBzdHJpY3Rfc3RydG9sKHAxLCAxMCwgJmxuZyk7CisJCQlpZiAoMCAhPSByYykgeworCQkJCVNBWSgiRVJST1I6ICVpPXN0cmljdF9zdHJ0b2woJXMsLiwsKVxuIiwgXAorCQkJCQkJCQlyYywgcDEpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJa1tpXSA9IChpbnQpbG5nOworCQl9CisJCWkrKzsKKwl9CisKKwltZW1zZXQoJnY0bDJfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpKTsKKwlzdHJsY3B5KCZ2NGwyX2NhcGFiaWxpdHkuZHJpdmVyWzBdLCAiZWFzeWNhcCIsIFwKKwkJCQkJc2l6ZW9mKHY0bDJfY2FwYWJpbGl0eS5kcml2ZXIpKTsKKworCXY0bDJfY2FwYWJpbGl0eS5jYXBhYmlsaXRpZXMgPSBcCisJCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORyB8IFwKKwkJCQlWNEwyX0NBUF9BVURJTyAgICAgICAgIHwgVjRMMl9DQVBfUkVBRFdSSVRFOworCisJdjRsMl9jYXBhYmlsaXR5LnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTihrWzBdLCBrWzFdLCBrWzJdKTsKKwlKT1QoOCwgInY0bDJfY2FwYWJpbGl0eS52ZXJzaW9uPSglaSwlaSwlaSlcbiIsIGtbMF0sIGtbMV0sIGtbMl0pOworCisJc3RybGNweSgmdjRsMl9jYXBhYmlsaXR5LmNhcmRbMF0sICJFYXN5Q0FQIERDNjAiLCBcCisJCXNpemVvZih2NGwyX2NhcGFiaWxpdHkuY2FyZCkpOworCisJaWYgKHVzYl9tYWtlX3BhdGgocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAmdjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvWzBdLFwKKwkJCQlzaXplb2YodjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvKSkgPCAwKSB7CisJCXN0cmxjcHkoJnY0bDJfY2FwYWJpbGl0eS5idXNfaW5mb1swXSwgIkVhc3lDQVAgYnVzX2luZm8iLCBcCisJCQkJCXNpemVvZih2NGwyX2NhcGFiaWxpdHkuYnVzX2luZm8pKTsKKwkJSk9UKDgsICIlcz12NGwyX2NhcGFiaWxpdHkuYnVzX2luZm9cbiIsIFwKKwkJCQkJJnY0bDJfY2FwYWJpbGl0eS5idXNfaW5mb1swXSk7CisJfQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2NhcGFiaWxpdHksIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19FTlVNSU5QVVQ6IHsKKwlzdGF0aWMgc3RydWN0IHY0bDJfaW5wdXQgdjRsMl9pbnB1dDsKKwlzdGF0aWMgX191MzIgaW5kZXg7CisKKwlKT1QoOCwgIlZJRElPQ19FTlVNSU5QVVRcbiIpOworCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfaW5wdXQsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpbmRleCA9IHY0bDJfaW5wdXQuaW5kZXg7CisJbWVtc2V0KCZ2NGwyX2lucHV0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKKworCXN3aXRjaCAoaW5kZXgpIHsKKwljYXNlIDA6IHsKKwkJdjRsMl9pbnB1dC5pbmRleCA9IGluZGV4OworCQlzdHJjcHkoJnY0bDJfaW5wdXQubmFtZVswXSwgIkNWQlMwIik7CisJCXY0bDJfaW5wdXQudHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJCXY0bDJfaW5wdXQuYXVkaW9zZXQgPSAweDAxOworCQl2NGwyX2lucHV0LnR1bmVyID0gMDsKKwkJdjRsMl9pbnB1dC5zdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSB8IFwKKwkJCQlWNEwyX1NURF9OVFNDIDsKKwkJdjRsMl9pbnB1dC5zdGF0dXMgPSAwOworCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOworCQlicmVhazsKKwl9CisJY2FzZSAxOiB7CisJCXY0bDJfaW5wdXQuaW5kZXggPSBpbmRleDsKKwkJc3RyY3B5KCZ2NGwyX2lucHV0Lm5hbWVbMF0sICJDVkJTMSIpOworCQl2NGwyX2lucHV0LnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQl2NGwyX2lucHV0LmF1ZGlvc2V0ID0gMHgwMTsKKwkJdjRsMl9pbnB1dC50dW5lciA9IDA7CisJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCisJCQkJVjRMMl9TVERfTlRTQyA7CisJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgMjogeworCQl2NGwyX2lucHV0LmluZGV4ID0gaW5kZXg7CisJCXN0cmNweSgmdjRsMl9pbnB1dC5uYW1lWzBdLCAiQ1ZCUzIiKTsKKwkJdjRsMl9pbnB1dC50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJdjRsMl9pbnB1dC5hdWRpb3NldCA9IDB4MDE7CisJCXY0bDJfaW5wdXQudHVuZXIgPSAwOworCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAorCQkJCVY0TDJfU1REX05UU0MgOworCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7CisJCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCWJyZWFrOworCX0KKwljYXNlIDM6IHsKKwkJdjRsMl9pbnB1dC5pbmRleCA9IGluZGV4OworCQlzdHJjcHkoJnY0bDJfaW5wdXQubmFtZVswXSwgIkNWQlMzIik7CisJCXY0bDJfaW5wdXQudHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJCXY0bDJfaW5wdXQuYXVkaW9zZXQgPSAweDAxOworCQl2NGwyX2lucHV0LnR1bmVyID0gMDsKKwkJdjRsMl9pbnB1dC5zdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSB8IFwKKwkJCQlWNEwyX1NURF9OVFNDIDsKKwkJdjRsMl9pbnB1dC5zdGF0dXMgPSAwOworCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOworCQlicmVhazsKKwl9CisJY2FzZSA0OiB7CisJCXY0bDJfaW5wdXQuaW5kZXggPSBpbmRleDsKKwkJc3RyY3B5KCZ2NGwyX2lucHV0Lm5hbWVbMF0sICJDVkJTNCIpOworCQl2NGwyX2lucHV0LnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQl2NGwyX2lucHV0LmF1ZGlvc2V0ID0gMHgwMTsKKwkJdjRsMl9pbnB1dC50dW5lciA9IDA7CisJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCisJCQkJVjRMMl9TVERfTlRTQyA7CisJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgNTogeworCQl2NGwyX2lucHV0LmluZGV4ID0gaW5kZXg7CisJCXN0cmNweSgmdjRsMl9pbnB1dC5uYW1lWzBdLCAiUy1WSURFTyIpOworCQl2NGwyX2lucHV0LnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCQl2NGwyX2lucHV0LmF1ZGlvc2V0ID0gMHgwMTsKKwkJdjRsMl9pbnB1dC50dW5lciA9IDA7CisJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCisJCQkJVjRMMl9TVERfTlRTQyA7CisJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJSk9UKDgsICIlaT1pbmRleDogZXhoYXVzdHMgaW5wdXRzXG4iLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl9CisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9pbnB1dCwgXAorCQkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfR19JTlBVVDogeworCXN0YXRpYyBfX3UzMiBpbmRleDsKKworCUpPVCg4LCAiVklESU9DX0dfSU5QVVRcbiIpOworCWluZGV4ID0gKF9fdTMyKXBlYXN5Y2FwLT5pbnB1dDsKKwlKT1QoOCwgInVzZXIgaXMgdG9sZDogJWlcbiIsIGluZGV4KTsKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5kZXgsIHNpemVvZihfX3UzMikpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX1NfSU5QVVQ6CisJeworCXN0YXRpYyBfX3UzMiBpbmRleDsKKworCUpPVCg4LCAiVklESU9DX1NfSU5QVVRcbiIpOworCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluZGV4LCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihfX3UzMikpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCUpPVCg4LCAidXNlciByZXF1ZXN0cyBpbnB1dCAlaVxuIiwgaW5kZXgpOworCisJaWYgKChpbnQpaW5kZXggPT0gcGVhc3ljYXAtPmlucHV0KSB7CisJCVNBWSgicmVxdWVzdGVkIGlucHV0IGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCgwID4gaW5kZXgpIHx8ICg1IDwgaW5kZXgpKSB7CisJCUpPVCg4LCAiRVJST1I6ICBiYWQgcmVxdWVzdGVkIGlucHV0OiAlaVxuIiwgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGVhc3ljYXAtPmlucHV0ID0gKGludClpbmRleDsKKworCXNlbGVjdF9pbnB1dChwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHBlYXN5Y2FwLT5pbnB1dCwgOSk7CisKKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX0VOVU1BVURJTzogeworCUpPVCg4LCAiVklESU9DX0VOVU1BVURJT1xuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19FTlVNQVVET1VUOiB7CisJc3RhdGljIHN0cnVjdCB2NGwyX2F1ZGlvb3V0IHY0bDJfYXVkaW9vdXQ7CisKKwlKT1QoOCwgIlZJRElPQ19FTlVNQVVET1VUXG4iKTsKKworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2F1ZGlvb3V0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2F1ZGlvb3V0KSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKDAgIT0gdjRsMl9hdWRpb291dC5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KCZ2NGwyX2F1ZGlvb3V0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfYXVkaW9vdXQpKTsKKwl2NGwyX2F1ZGlvb3V0LmluZGV4ID0gMDsKKwlzdHJjcHkoJnY0bDJfYXVkaW9vdXQubmFtZVswXSwgIlNvdW5kdHJhY2siKTsKKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2F1ZGlvb3V0LCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9hdWRpb291dCkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX1FVRVJZQ1RSTDogeworCXN0YXRpYyBpbnQgaTE7CisJc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2NGwyX3F1ZXJ5Y3RybDsKKworCUpPVCg4LCAiVklESU9DX1FVRVJZQ1RSTFxuIik7CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9xdWVyeWN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaTEgPSAwOworCXdoaWxlICgweEZGRkZGRkZGICE9IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwkJaWYgKGVhc3ljYXBfY29udHJvbFtpMV0uaWQgPT0gdjRsMl9xdWVyeWN0cmwuaWQpIHsKKwkJCUpPVCg4LCAiVklESU9DX1FVRVJZQ1RSTCAgJXM9ZWFzeWNhcF9jb250cm9sWyVpXSIgXAorCQkJCSIubmFtZVxuIiwgJmVhc3ljYXBfY29udHJvbFtpMV0ubmFtZVswXSwgaTEpOworCQkJbWVtY3B5KCZ2NGwyX3F1ZXJ5Y3RybCwgJmVhc3ljYXBfY29udHJvbFtpMV0sIFwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpKTsKKwkJCWJyZWFrOworCQl9CisJCWkxKys7CisJfQorCWlmICgweEZGRkZGRkZGID09IGVhc3ljYXBfY29udHJvbFtpMV0uaWQpIHsKKwkJSk9UKDgsICIlaT1pbmRleDogZXhoYXVzdHMgY29udHJvbHNcbiIsIGkxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX3F1ZXJ5Y3RybCwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfUVVFUllNRU5VOiB7CisJSk9UKDgsICJWSURJT0NfUVVFUllNRU5VIHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX0dfQ1RSTDogeworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHY0bDJfY29udHJvbDsKKworCUpPVCg4LCAiVklESU9DX0dfQ1RSTFxuIik7CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9jb250cm9sLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzd2l0Y2ggKHY0bDJfY29udHJvbC5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogeworCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBwZWFzeWNhcC0+YnJpZ2h0bmVzczsKKwkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIGJyaWdodG5lc3M6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogeworCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBwZWFzeWNhcC0+Y29udHJhc3Q7CisJCUpPVCg4LCAidXNlciBlbnF1aXJlcyBjb250cmFzdDogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046IHsKKwkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPnNhdHVyYXRpb247CisJCUpPVCg4LCAidXNlciBlbnF1aXJlcyBzYXR1cmF0aW9uOiAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9DSURfSFVFOiB7CisJCXY0bDJfY29udHJvbC52YWx1ZSA9IHBlYXN5Y2FwLT5odWU7CisJCUpPVCg4LCAidXNlciBlbnF1aXJlcyBodWU6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IHsKKwkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPnZvbHVtZTsKKwkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIHZvbHVtZTogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IHsKKwkJaWYgKDEgPT0gcGVhc3ljYXAtPm11dGUpCisJCQl2NGwyX2NvbnRyb2wudmFsdWUgPSB0cnVlOworCQllbHNlCisJCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBmYWxzZTsKKwkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIG11dGU6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlTQVkoIkVSUk9SOiB1bmtub3duIFY0TDIgY29udHJvbDogMHglMDhYPWlkXG4iLCBcCisJCQkJCQkJdjRsMl9jb250cm9sLmlkKTsKKwkJZXhwbGFpbl9jaWQodjRsMl9jb250cm9sLmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCX0KKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9jb250cm9sLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTF9PTEQpCitjYXNlIFZJRElPQ19TX0NUUkxfT0xEOiB7CisJSk9UKDgsICJWSURJT0NfU19DVFJMX09MRCByZXF1aXJlZCBhdCBsZWFzdCBmb3IgeGF3dHZcbiIpOworfQorI2VuZGlmIC8qVklESU9DX1NfQ1RSTF9PTEQqLworY2FzZSBWSURJT0NfU19DVFJMOgorCXsKKwlzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCB2NGwyX2NvbnRyb2w7CisKKwlKT1QoOCwgIlZJRElPQ19TX0NUUkxcbiIpOworCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfY29udHJvbCwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3dpdGNoICh2NGwyX2NvbnRyb2wuaWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6IHsKKwkJSk9UKDgsICJ1c2VyIHJlcXVlc3RzIGJyaWdodG5lc3MgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCWlmICgwICE9IGFkanVzdF9icmlnaHRuZXNzKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQorCQkJOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogeworCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgY29udHJhc3QgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCWlmICgwICE9IGFkanVzdF9jb250cmFzdChwZWFzeWNhcCwgdjRsMl9jb250cm9sLnZhbHVlKSkKKwkJCTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjogeworCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgc2F0dXJhdGlvbiAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJaWYgKDAgIT0gYWRqdXN0X3NhdHVyYXRpb24ocGVhc3ljYXAsIHY0bDJfY29udHJvbC52YWx1ZSkpCisJCQk7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQ0lEX0hVRTogeworCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgaHVlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlpZiAoMCAhPSBhZGp1c3RfaHVlKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQorCQkJOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IHsKKwkJSk9UKDgsICJ1c2VyIHJlcXVlc3RzIHZvbHVtZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJaWYgKDAgIT0gYWRqdXN0X3ZvbHVtZShwZWFzeWNhcCwgdjRsMl9jb250cm9sLnZhbHVlKSkKKwkJCTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURTogeworCQlpbnQgbXV0ZTsKKworCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgbXV0ZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJaWYgKHRydWUgPT0gdjRsMl9jb250cm9sLnZhbHVlKQorCQkJbXV0ZSA9IDE7CisJCWVsc2UKKwkJCW11dGUgPSAwOworCisJCWlmICgwICE9IGFkanVzdF9tdXRlKHBlYXN5Y2FwLCBtdXRlKSkKKwkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlIHRvICVpXG4iLCBtdXRlKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJU0FZKCJFUlJPUjogdW5rbm93biBWNEwyIGNvbnRyb2w6IDB4JTA4WD1pZFxuIiwgXAorCQkJCQkJCXY0bDJfY29udHJvbC5pZCk7CisJCWV4cGxhaW5fY2lkKHY0bDJfY29udHJvbC5pZCk7CisJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX1NfRVhUX0NUUkxTOiB7CisJSk9UKDgsICJWSURJT0NfU19FWFRfQ1RSTFMgdW5zdXBwb3J0ZWRcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfRU5VTV9GTVQ6IHsKKwlzdGF0aWMgX191MzIgaW5kZXg7CisJc3RhdGljIHN0cnVjdCB2NGwyX2ZtdGRlc2MgdjRsMl9mbXRkZXNjOworCisJSk9UKDgsICJWSURJT0NfRU5VTV9GTVRcbiIpOworCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfZm10ZGVzYywgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaW5kZXggPSB2NGwyX2ZtdGRlc2MuaW5kZXg7CisJbWVtc2V0KCZ2NGwyX2ZtdGRlc2MsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSk7CisKKwl2NGwyX2ZtdGRlc2MuaW5kZXggPSBpbmRleDsKKwl2NGwyX2ZtdGRlc2MudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworCXN3aXRjaCAoaW5kZXgpIHsKKwljYXNlIDA6IHsKKwkJdjRsMl9mbXRkZXNjLmZsYWdzID0gMDsKKwkJc3RyY3B5KCZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0sICJ1eXZ5Iik7CisJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOworCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlicmVhazsKKwl9CisJY2FzZSAxOiB7CisJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CisJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAieXV5MiIpOworCQl2NGwyX2ZtdGRlc2MucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgMjogeworCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOworCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInJnYjI0Iik7CisJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgMzogeworCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOworCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInJnYjMyIik7CisJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgNDogeworCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOworCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgImJncjI0Iik7CisJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IyNDsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgNTogeworCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOworCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgImJncjMyIik7CisJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IzMjsKKwkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJSk9UKDgsICIlaT1pbmRleDogZXhoYXVzdHMgZm9ybWF0c1xuIiwgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJfQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2ZtdGRlc2MsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2ZtdGRlc2MpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19FTlVNX0ZSQU1FU0laRVM6IHsKKwlKT1QoOCwgIlZJRElPQ19FTlVNX0ZSQU1FU0laRVMgdW5zdXBwb3J0ZWRcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorY2FzZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUzogeworCUpPVCg4LCAiVklESU9DX0VOVU1fRlJBTUVfSU5URVJWQUxTIHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX0dfRk1UOiB7CisJc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKKwlzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7CisKKwlKT1QoOCwgIlZJRElPQ19HX0ZNVFxuIik7CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9mb3JtYXQsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHY0bDJfZm9ybWF0LnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldCgmdjRsMl9waXhfZm9ybWF0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCXY0bDJfZm9ybWF0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJbWVtY3B5KCYodjRsMl9mb3JtYXQuZm10LnBpeCksIFwKKwkJCSAmKGVhc3ljYXBfZm9ybWF0W3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XVwKKwkJCS52NGwyX2Zvcm1hdC5mbXQucGl4KSwgc2l6ZW9mKHY0bDJfcGl4X2Zvcm1hdCkpOworCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAorCQkJJmVhc3ljYXBfZm9ybWF0W3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XS5uYW1lWzBdKTsKKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2Zvcm1hdCwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfVFJZX0ZNVDoKK2Nhc2UgVklESU9DX1NfRk1UOiB7CisJc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKKwlzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7CisJc3RhdGljIGJvb2wgdHJ5OworCXN0YXRpYyBpbnQgYmVzdF9mb3JtYXQ7CisKKwlpZiAoVklESU9DX1RSWV9GTVQgPT0gY21kKSB7CisJCUpPVCg4LCAiVklESU9DX1RSWV9GTVRcbiIpOworCQl0cnkgPSB0cnVlOworCX0gZWxzZSB7CisJCUpPVCg4LCAiVklESU9DX1NfRk1UXG4iKTsKKwkJdHJ5ID0gZmFsc2U7CisJfQorCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfZm9ybWF0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWJlc3RfZm9ybWF0ID0gYWRqdXN0X2Zvcm1hdChwZWFzeWNhcCwgXAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoLCBcCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0LCBcCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQsIFwKKwkJCQkJdjRsMl9mb3JtYXQuZm10LnBpeC5maWVsZCwgXAorCQkJCQl0cnkpOworCWlmICgwID4gYmVzdF9mb3JtYXQpIHsKKwkJSk9UKDgsICJXQVJOSU5HOiBhZGp1c3RfZm9ybWF0KCkgcmV0dXJuZWQgJWlcbiIsIGJlc3RfZm9ybWF0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLworCW1lbXNldCgmdjRsMl9waXhfZm9ybWF0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCXY0bDJfZm9ybWF0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisKKwltZW1jcHkoJih2NGwyX2Zvcm1hdC5mbXQucGl4KSwgJihlYXN5Y2FwX2Zvcm1hdFtiZXN0X2Zvcm1hdF1cCisJCQkudjRsMl9mb3JtYXQuZm10LnBpeCksIHNpemVvZih2NGwyX3BpeF9mb3JtYXQpKTsKKwlKT1QoOCwgInVzZXIgaXMgdG9sZDogJXNcbiIsICZlYXN5Y2FwX2Zvcm1hdFtiZXN0X2Zvcm1hdF0ubmFtZVswXSk7CisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mb3JtYXQsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX0NST1BDQVA6IHsKKwlzdGF0aWMgc3RydWN0IHY0bDJfY3JvcGNhcCB2NGwyX2Nyb3BjYXA7CisKKwlKT1QoOCwgIlZJRElPQ19DUk9QQ0FQXG4iKTsKKworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2Nyb3BjYXAsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY3JvcGNhcCkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICh2NGwyX2Nyb3BjYXAudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCUpPVCg4LCAidjRsMl9jcm9wY2FwLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXG4iKTsKKworCW1lbXNldCgmdjRsMl9jcm9wY2FwLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfY3JvcGNhcCkpOworCXY0bDJfY3JvcGNhcC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXY0bDJfY3JvcGNhcC5ib3VuZHMubGVmdCAgICAgID0gMDsKKwl2NGwyX2Nyb3BjYXAuYm91bmRzLnRvcCAgICAgICA9IDA7CisJdjRsMl9jcm9wY2FwLmJvdW5kcy53aWR0aCAgICAgPSBwZWFzeWNhcC0+d2lkdGg7CisJdjRsMl9jcm9wY2FwLmJvdW5kcy5oZWlnaHQgICAgPSBwZWFzeWNhcC0+aGVpZ2h0OworCXY0bDJfY3JvcGNhcC5kZWZyZWN0LmxlZnQgICAgID0gMDsKKwl2NGwyX2Nyb3BjYXAuZGVmcmVjdC50b3AgICAgICA9IDA7CisJdjRsMl9jcm9wY2FwLmRlZnJlY3Qud2lkdGggICAgPSBwZWFzeWNhcC0+d2lkdGg7CisJdjRsMl9jcm9wY2FwLmRlZnJlY3QuaGVpZ2h0ICAgPSBwZWFzeWNhcC0+aGVpZ2h0OworCXY0bDJfY3JvcGNhcC5waXhlbGFzcGVjdC5udW1lcmF0b3IgPSAxOworCXY0bDJfY3JvcGNhcC5waXhlbGFzcGVjdC5kZW5vbWluYXRvciA9IDE7CisKKwlKT1QoOCwgInVzZXIgaXMgdG9sZDogJWl4JWlcbiIsIHBlYXN5Y2FwLT53aWR0aCwgcGVhc3ljYXAtPmhlaWdodCk7CisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9jcm9wY2FwLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jcm9wY2FwKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfR19DUk9QOgorY2FzZSBWSURJT0NfU19DUk9QOiB7CisJSk9UKDgsICJWSURJT0NfR19DUk9QfFZJRElPQ19TX0NST1AgIHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX1FVRVJZU1REOiB7CisJSk9UKDgsICJWSURJT0NfUVVFUllTVEQ6ICIgXAorCQkJIkVhc3lDQVAgaXMgaW5jYXBhYmxlIG9mIGRldGVjdGluZyBzdGFuZGFyZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRIRSBNQU5JUFVMQVRJT05TIElOVk9MVklORyBsYXN0MCxsYXN0MSxsYXN0MixsYXN0MyBDT05TVElUVVRFIEEgV09SS0FST1VORAorICogIEZPUiBXSEFUIEFQUEVBUlMgVE8gQkUgQSBCVUcgSU4gNjQtQklUIG1wbGF5ZXIuCisgKiAgTk9UIE5FRURFRCwgQlVUIEhPUEVGVUxMWSBIQVJNTEVTUywgRk9SIDMyLUJJVCBtcGxheWVyLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjYXNlIFZJRElPQ19FTlVNU1REOiB7CisJc3RhdGljIGludCBsYXN0MCA9IC0xLCBsYXN0MSA9IC0xLCBsYXN0MiA9IC0xLCBsYXN0MyA9IC0xOworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB2NGwyX3N0YW5kYXJkOworCXN0YXRpYyBfX3UzMiBpbmRleDsKKwlzdGF0aWMgc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOworCisJSk9UKDgsICJWSURJT0NfRU5VTVNURFxuIik7CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9zdGFuZGFyZCwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpbmRleCA9IHY0bDJfc3RhbmRhcmQuaW5kZXg7CisKKwlsYXN0MyA9IGxhc3QyOyBsYXN0MiA9IGxhc3QxOyBsYXN0MSA9IGxhc3QwOyBsYXN0MCA9IGluZGV4OworCWlmICgoaW5kZXggPT0gbGFzdDMpICYmIChpbmRleCA9PSBsYXN0MikgJiYgXAorCQkJKGluZGV4ID09IGxhc3QxKSAmJiAoaW5kZXggPT0gbGFzdDApKSB7CisJCWluZGV4Kys7CisJCWxhc3QzID0gbGFzdDI7IGxhc3QyID0gbGFzdDE7IGxhc3QxID0gbGFzdDA7IGxhc3QwID0gaW5kZXg7CisJfQorCisJbWVtc2V0KCZ2NGwyX3N0YW5kYXJkLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKTsKKworCXBlYXN5Y2FwX3N0YW5kYXJkID0gJmVhc3ljYXBfc3RhbmRhcmRbMF07CisJd2hpbGUgKDB4RkZGRiAhPSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCQlpZiAoKGludCkocGVhc3ljYXBfc3RhbmRhcmQgLSAmZWFzeWNhcF9zdGFuZGFyZFswXSkgPT0gaW5kZXgpCisJCQlicmVhazsKKwkJcGVhc3ljYXBfc3RhbmRhcmQrKzsKKwl9CisJaWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCQlKT1QoOCwgIiVpPWluZGV4OiBleGhhdXN0cyBzdGFuZGFyZHNcbiIsIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgXAorCQkJCSYocGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQubmFtZVswXSkpOworCW1lbWNweSgmdjRsMl9zdGFuZGFyZCwgJihwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZCksIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSk7CisKKwl2NGwyX3N0YW5kYXJkLmluZGV4ID0gaW5kZXg7CisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9zdGFuZGFyZCwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19HX1NURDogeworCXN0YXRpYyB2NGwyX3N0ZF9pZCBzdGRfaWQ7CisJc3RhdGljIHN0cnVjdCBlYXN5Y2FwX3N0YW5kYXJkIGNvbnN0ICpwZWFzeWNhcF9zdGFuZGFyZDsKKworCUpPVCg4LCAiVklESU9DX0dfU1REXG4iKTsKKworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZzdGRfaWQsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQkJc2l6ZW9mKHY0bDJfc3RkX2lkKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFtwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XTsKKwlzdGRfaWQgPSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5pZDsKKworCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAorCQkJCSZwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5uYW1lWzBdKTsKKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZzdGRfaWQsIFwKKwkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX1NfU1REOiB7CisJc3RhdGljIHY0bDJfc3RkX2lkIHN0ZF9pZDsKKwlzdGF0aWMgaW50IHJjOworCisJSk9UKDgsICJWSURJT0NfU19TVERcbiIpOworCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnN0ZF9pZCwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCQlzaXplb2YodjRsMl9zdGRfaWQpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGFkanVzdF9zdGFuZGFyZChwZWFzeWNhcCwgc3RkX2lkKTsKKwlpZiAoMCA+IHJjKSB7CisJCUpPVCg4LCAiV0FSTklORzogYWRqdXN0X3N0YW5kYXJkKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfUkVRQlVGUzogeworCXN0YXRpYyBpbnQgbmJ1ZmZlcnM7CisJc3RhdGljIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHY0bDJfcmVxdWVzdGJ1ZmZlcnM7CisKKwlKT1QoOCwgIlZJRElPQ19SRVFCVUZTXG4iKTsKKworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX3JlcXVlc3RidWZmZXJzLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHY0bDJfcmVxdWVzdGJ1ZmZlcnMubWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW5idWZmZXJzID0gdjRsMl9yZXF1ZXN0YnVmZmVycy5jb3VudDsKKwlKT1QoOCwgIiAgICAgICAgICAgICAgICAgICBVc2VyIHJlcXVlc3RzICVpIGJ1ZmZlcnMgLi4uXG4iLCBuYnVmZmVycyk7CisJaWYgKG5idWZmZXJzIDwgMikKKwkJbmJ1ZmZlcnMgPSAyOworCWlmIChuYnVmZmVycyA+IEZSQU1FX0JVRkZFUl9NQU5ZKQorCQluYnVmZmVycyA9IEZSQU1FX0JVRkZFUl9NQU5ZOworCWlmICh2NGwyX3JlcXVlc3RidWZmZXJzLmNvdW50ID09IG5idWZmZXJzKSB7CisJCUpPVCg4LCAiICAgICAgICAgICAgICAgICAgIC4uLiBhZ3JlZSB0byAgJWkgYnVmZmVyc1xuIiwgXAorCQkJCQkJCQluYnVmZmVycyk7CisJfSBlbHNlIHsKKwkJSk9UKDgsICIgICAgICAgICAgICAgICAgICAuLi4gaW5zaXN0IG9uICAlaSBidWZmZXJzXG4iLCBcCisJCQkJCQkJCW5idWZmZXJzKTsKKwkJdjRsMl9yZXF1ZXN0YnVmZmVycy5jb3VudCA9IG5idWZmZXJzOworCX0KKwlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkgPSBuYnVmZmVyczsKKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX3JlcXVlc3RidWZmZXJzLCBcCisJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfUVVFUllCVUY6IHsKKwlzdGF0aWMgX191MzIgaW5kZXg7CisJc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKworCUpPVCg4LCAiVklESU9DX1FVRVJZQlVGXG4iKTsKKworCWlmIChwZWFzeWNhcC0+dmlkZW9fZW9mKSB7CisJCUpPVCg4LCAicmV0dXJuaW5nIC0xIGJlY2F1c2UgICVpPXZpZGVvX2VvZlxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19lb2YpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfYnVmZmVyLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICh2NGwyX2J1ZmZlci50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaW5kZXggPSB2NGwyX2J1ZmZlci5pbmRleDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KCZ2NGwyX2J1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpOworCXY0bDJfYnVmZmVyLmluZGV4ID0gaW5kZXg7CisJdjRsMl9idWZmZXIudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwl2NGwyX2J1ZmZlci5ieXRlc3VzZWQgPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQ7CisJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFwKKwkJCQkJCXBlYXN5Y2FwLT5kb25lW2luZGV4XSB8IFwKKwkJCQkJCXBlYXN5Y2FwLT5xdWV1ZWRbaW5kZXhdOworCXY0bDJfYnVmZmVyLmZpZWxkID0gcGVhc3ljYXAtPmZpZWxkOworCXY0bDJfYnVmZmVyLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJdjRsMl9idWZmZXIubS5vZmZzZXQgPSBpbmRleCAqIEZSQU1FX0JVRkZFUl9TSVpFOworCXY0bDJfYnVmZmVyLmxlbmd0aCA9IEZSQU1FX0JVRkZFUl9TSVpFOworCisJSk9UKDE2LCAiICAlMTBpPWluZGV4XG4iLCB2NGwyX2J1ZmZlci5pbmRleCk7CisJSk9UKDE2LCAiICAweCUwOFg9dHlwZVxuIiwgdjRsMl9idWZmZXIudHlwZSk7CisJSk9UKDE2LCAiICAlMTBpPWJ5dGVzdXNlZFxuIiwgdjRsMl9idWZmZXIuYnl0ZXN1c2VkKTsKKwlKT1QoMTYsICIgIDB4JTA4WD1mbGFnc1xuIiwgdjRsMl9idWZmZXIuZmxhZ3MpOworCUpPVCgxNiwgIiAgJTEwaT1maWVsZFxuIiwgdjRsMl9idWZmZXIuZmllbGQpOworCUpPVCgxNiwgIiAgJTEwbGk9dGltZXN0YW1wLnR2X3VzZWNcbiIsIFwKKwkJCQkJIChsb25nKXY0bDJfYnVmZmVyLnRpbWVzdGFtcC50dl91c2VjKTsKKwlKT1QoMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKKwlKT1QoMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7CisJSk9UKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7CisJSk9UKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2J1ZmZlciwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfUUJVRjogeworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CisKKwlKT1QoOCwgIlZJRElPQ19RQlVGXG4iKTsKKworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2J1ZmZlciwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2NGwyX2J1ZmZlci5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHY0bDJfYnVmZmVyLmluZGV4IDwgMCB8fCBcCisJCSAodjRsMl9idWZmZXIuaW5kZXggPj0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOworCisJcGVhc3ljYXAtPmRvbmVbdjRsMl9idWZmZXIuaW5kZXhdICAgPSAwOworCXBlYXN5Y2FwLT5xdWV1ZWRbdjRsMl9idWZmZXIuaW5kZXhdID0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9idWZmZXIsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCUpPVCg4LCAiLi4uLi4gICB1c2VyIHF1ZXVlaW5nIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAorCQkJCQkJKGludCl2NGwyX2J1ZmZlci5pbmRleCk7CisKKwlwZWFzeWNhcC0+ZnJhbWVfbG9jayA9IDA7CisKKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX0RRQlVGOgorCXsKKyNpZiBkZWZpbmVkKEFVRElPVElNRSkKKwlzdGF0aWMgc3RydWN0IHNpZ25lZF9kaXZfcmVzdWx0IHNkcjsKKwlzdGF0aWMgbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3csIGRuYnlkdCwgZnVkZ2UsIHNsbDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGw7CisJc3RhdGljIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwwOworCXN0cnVjdCB0aW1ldmFsIHRpbWV2YWwxOworI2VuZGlmIC8qQVVESU9USU1FKi8KKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgdGltZXZhbCwgdGltZXZhbDI7CisJc3RhdGljIGludCBpLCBqOworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CisKKwlKT1QoOCwgIlZJRElPQ19EUUJVRlxuIik7CisKKwlpZiAoKHBlYXN5Y2FwLT52aWRlb19pZGxlKSB8fCAocGVhc3ljYXAtPnZpZGVvX2VvZikpIHsKKwkJSk9UKDgsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlICAiIFwKKwkJCQkiJWk9dmlkZW9faWRsZSAgJWk9dmlkZW9fZW9mXG4iLCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUsIHBlYXN5Y2FwLT52aWRlb19lb2YpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9idWZmZXIsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHY0bDJfYnVmZmVyLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJCUpPVCgxNiwgInJldHVybmluZyAtRUlPIGJlY2F1c2UgdmlkZW8gdXJicyBub3Qgc3RyZWFtaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBUSEUgVVNFUiBIQVMgUFJFVklPVVNMWSBDQUxMRUQgZWFzeWNhcF9wb2xsKCksIEFTIERFVEVSTUlORUQgQlkgRklORElORworICogIFRIRSBGTEFHIHBlYXN5Y2FwLT5wb2xsZWQgU0VULCBUSEVSRSBNVVNUIEJFIE5PIEZVUlRIRVIgV0FJVCBIRVJFLiAgSU4gVEhJUworICogIENBU0UsIEpVU1QgQ0hPT1NFIFRIRSBGUkFNRSBJTkRJQ0FURUQgQlkgcGVhc3ljYXAtPmZyYW1lX3JlYWQKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaWYgKCFwZWFzeWNhcC0+cG9sbGVkKSB7CisJCWlmICgtRUlPID09IGVhc3ljYXBfZHFidWYocGVhc3ljYXAsIDApKQorCQkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKFY0TDJfQlVGX0ZMQUdfRE9ORSAhPSBwZWFzeWNhcC0+ZG9uZVtwZWFzeWNhcC0+ZnJhbWVfcmVhZF0pIHsKKwkJU0FZKCJFUlJPUjogVjRMMl9CVUZfRkxBR19ET05FICE9IDB4JTA4WFxuIiwgXAorCQkJCQlwZWFzeWNhcC0+ZG9uZVtwZWFzeWNhcC0+ZnJhbWVfcmVhZF0pOworCX0KKwlwZWFzeWNhcC0+cG9sbGVkID0gMDsKKworCWlmICghKGlzZXF1ZW5jZSAlIDEwKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTc5OyBpKyspCisJCQlwZWFzeWNhcC0+bWVyaXRbaV0gPSBwZWFzeWNhcC0+bWVyaXRbaSsxXTsKKwkJcGVhc3ljYXAtPm1lcml0WzE3OV0gPSBtZXJpdF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKwkJaiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKKwkJCWogKz0gcGVhc3ljYXAtPm1lcml0W2ldOworCQlpZiAoOTAgPCBqKSB7CisJCQlTQVkoImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gIiBcCisJCQkJCQkJIm9uIGNvbmRpdGlvbiBibHVlXG4iKTsKKwkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOyBwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKKwkJfQorCX0KKworCXY0bDJfYnVmZmVyLmluZGV4ID0gcGVhc3ljYXAtPmZyYW1lX3JlYWQ7CisJdjRsMl9idWZmZXIudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwl2NGwyX2J1ZmZlci5ieXRlc3VzZWQgPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQ7CisJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwl2NGwyX2J1ZmZlci5maWVsZCA9ICBwZWFzeWNhcC0+ZmllbGQ7CisJaWYgKFY0TDJfRklFTERfQUxURVJOQVRFID09IHY0bDJfYnVmZmVyLmZpZWxkKQorCQl2NGwyX2J1ZmZlci5maWVsZCA9IFwKKwkJCQkweDAwMEYgJiAocGVhc3ljYXAtPlwKKwkJCQlmcmFtZV9idWZmZXJbcGVhc3ljYXAtPmZyYW1lX3JlYWRdWzBdLmtvdW50KTsKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWwpOworCXRpbWV2YWwyID0gdGltZXZhbDsKKworI2lmIGRlZmluZWQoQVVESU9USU1FKQorCWlmICghcGVhc3ljYXAtPnRpbWV2YWwwLnR2X3NlYykgeworCQl0aW1ldmFsMCA9IHRpbWV2YWw7CisJCXRpbWV2YWwxID0gdGltZXZhbDsKKwkJdGltZXZhbDIgPSB0aW1ldmFsOworCQlkbmJ5ZHQgPSAxOTIwMDA7CisKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJcGVhc3ljYXAtPnRpbWV2YWwwID0gdGltZXZhbDA7CisJCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpOworCX0gZWxzZSB7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRuYnlkdCA9IHBlYXN5Y2FwLT5kbmJ5ZHQ7CisJCXRpbWV2YWwxID0gcGVhc3ljYXAtPnRpbWV2YWwxOworCQltdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKTsKKwkJYWJvdmUgPSBkbmJ5ZHQgKiBNSUNST1NFQ09ORFModGltZXZhbCwgdGltZXZhbDEpOworCQliZWxvdyA9IDE5MjAwMDsKKwkJc2RyID0gc2lnbmVkX2RpdihhYm92ZSwgYmVsb3cpOworCisJCWFib3ZlID0gc2RyLnF1b3RpZW50ICsgdGltZXZhbDEudHZfdXNlYyAtIDM1MDAwMDsKKworCQliZWxvdyA9IDEwMDAwMDA7CisJCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKKwkJdGltZXZhbDIudHZfdXNlYyA9IHNkci5yZW1haW5kZXI7CisJCXRpbWV2YWwyLnR2X3NlYyA9IHRpbWV2YWwxLnR2X3NlYyArIHNkci5xdW90aWVudDsKKwl9CisJaWYgKCEoaXNlcXVlbmNlICUgNTAwKSkgeworCQlmdWRnZSA9ICgobG9uZyBsb25nIGludCkoMTAwMDAwMCkpICogXAorCQkJCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgLSBcCisJCQkJCQl0aW1ldmFsMi50dl9zZWMpKSArIFwKKwkJCQkobG9uZyBsb25nIGludCkodGltZXZhbC50dl91c2VjIC0gXAorCQkJCXRpbWV2YWwyLnR2X3VzZWMpOworCQlzZHIgPSBzaWduZWRfZGl2KGZ1ZGdlLCAxMDAwKTsKKwkJc2xsID0gc2RyLnF1b3RpZW50OworCQl1bGwgPSBzZHIucmVtYWluZGVyOworCisJCVNBWSgiJTVsbGkuJS0zbGxpPW1zIHRpbWVzdGFtcCBmdWRnZVxuIiwgc2xsLCB1bGwpOworCX0KKyNlbmRpZiAvKkFVRElPVElNRSovCisKKwl2NGwyX2J1ZmZlci50aW1lc3RhbXAgPSB0aW1ldmFsMjsKKwl2NGwyX2J1ZmZlci5zZXF1ZW5jZSA9IGlzZXF1ZW5jZSsrOworCXY0bDJfYnVmZmVyLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJdjRsMl9idWZmZXIubS5vZmZzZXQgPSB2NGwyX2J1ZmZlci5pbmRleCAqIEZSQU1FX0JVRkZFUl9TSVpFOworCXY0bDJfYnVmZmVyLmxlbmd0aCA9IEZSQU1FX0JVRkZFUl9TSVpFOworCisJSk9UKDE2LCAiICAlMTBpPWluZGV4XG4iLCB2NGwyX2J1ZmZlci5pbmRleCk7CisJSk9UKDE2LCAiICAweCUwOFg9dHlwZVxuIiwgdjRsMl9idWZmZXIudHlwZSk7CisJSk9UKDE2LCAiICAlMTBpPWJ5dGVzdXNlZFxuIiwgdjRsMl9idWZmZXIuYnl0ZXN1c2VkKTsKKwlKT1QoMTYsICIgIDB4JTA4WD1mbGFnc1xuIiwgdjRsMl9idWZmZXIuZmxhZ3MpOworCUpPVCgxNiwgIiAgJTEwaT1maWVsZFxuIiwgdjRsMl9idWZmZXIuZmllbGQpOworCUpPVCgxNiwgIiAgJTEwbGk9dGltZXN0YW1wLnR2X3VzZWNcbiIsIFwKKwkJCQkJKGxvbmcpdjRsMl9idWZmZXIudGltZXN0YW1wLnR2X3VzZWMpOworCUpPVCgxNiwgIiAgJTEwaT1zZXF1ZW5jZVxuIiwgdjRsMl9idWZmZXIuc2VxdWVuY2UpOworCUpPVCgxNiwgIiAgMHglMDhYPW1lbW9yeVxuIiwgdjRsMl9idWZmZXIubWVtb3J5KTsKKwlKT1QoMTYsICIgICUxMGk9bS5vZmZzZXRcbiIsIHY0bDJfYnVmZmVyLm0ub2Zmc2V0KTsKKwlKT1QoMTYsICIgICUxMGk9bGVuZ3RoXG4iLCB2NGwyX2J1ZmZlci5sZW5ndGgpOworCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfYnVmZmVyLCBcCisJCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJSk9UKDgsICIuLi4uLiB1c2VyIGlzIG9mZmVyZWQgZnJhbWUgYnVmZmVyICVpXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZyYW1lX3JlYWQpOworCXBlYXN5Y2FwLT5mcmFtZV9sb2NrID0gMTsKKwlpZiAocGVhc3ljYXAtPmZyYW1lX3JlYWQgPT0gcGVhc3ljYXAtPmZyYW1lX2ZpbGwpIHsKKwkJaWYgKHBlYXN5Y2FwLT5mcmFtZV9sb2NrKSB7CisJCQlKT1QoOCwgIkVSUk9SOiAgZmlsbGluZyBmcmFtZSBidWZmZXIgIiBcCisJCQkJCQkid2hpbGUgb2ZmZXJlZCB0byB1c2VyXG4iKTsKKwkJfQorCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgQVVESU8gVVJCUyBIQVZFIEFMUkVBRFkgQkVFTiBTVUJNSVRURUQgV0hFTiBUSElTIENPTU1BTkQgSVMgUkVDRUlWRUQ7CisgKiAgVklERU8gVVJCUyBIQVZFIE5PVC4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY2FzZSBWSURJT0NfU1RSRUFNT046IHsKKwlzdGF0aWMgaW50IGk7CisKKwlKT1QoOCwgIlZJRElPQ19TVFJFQU1PTlxuIik7CisKKwlpc2VxdWVuY2UgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKKwkJcGVhc3ljYXAtPm1lcml0W2ldID0gMDsKKwlpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc3VibWl0X3ZpZGVvX3VyYnMocGVhc3ljYXApOworCXBlYXN5Y2FwLT52aWRlb19pZGxlID0gMDsKKwlwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDA7CisJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDA7CisJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDA7CisJYnJlYWs7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19TVFJFQU1PRkY6IHsKKwlKT1QoOCwgIlZJRElPQ19TVFJFQU1PRkZcbiIpOworCisJaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcGVhc3ljYXAtPnZpZGVvX2lkbGUgPSAxOworCXBlYXN5Y2FwLT5hdWRpb19pZGxlID0gMTsgIHBlYXN5Y2FwLT50aW1ldmFsMC50dl9zZWMgPSAwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBUSEUgV0FJVCBRVUVVRVMgQVJFIE5PVCBDTEVBUkVEIElOIFJFU1BPTlNFIFRPIFRIRSBTVFJFQU1PRkYgQ09NTUFORAorICogIFRIRSBVU0VSU1BBQ0UgUFJPR1JBTSwgRS5HLiBtcGxheWVyLCBNQVkgSEFORyBPTiBFWElULiAgIEJFV0FSRS4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCUpPVCg4LCAiY2FsbGluZyB3YWtlX3VwIG9uIHdxX3ZpZGVvIGFuZCB3cV9hdWRpb1xuIik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX2F1ZGlvKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJYnJlYWs7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19HX1BBUk06IHsKKwlzdGF0aWMgc3RydWN0IHY0bDJfc3RyZWFtcGFybSB2NGwyX3N0cmVhbXBhcm07CisKKwlKT1QoOCwgIlZJRElPQ19HX1BBUk1cbiIpOworCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfc3RyZWFtcGFybSwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSkpIHsKKwkJUE9VVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHY0bDJfc3RyZWFtcGFybS50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQlQT1VUOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gMDsKKwl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gMDsKKwl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxOworCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gMzA7CisJdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueTsKKwl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLmV4dGVuZGVkbW9kZSA9IDA7CisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfc3RyZWFtcGFybSwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfc3RyZWFtcGFybSkpKSB7CisJCVBPVVQ7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKK30KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK2Nhc2UgVklESU9DX1NfUEFSTTogeworCUpPVCg4LCAiVklESU9DX1NfUEFSTSB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19HX0FVRElPOiB7CisJSk9UKDgsICJWSURJT0NfR19BVURJTyB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19TX0FVRElPOiB7CisJSk9UKDgsICJWSURJT0NfU19BVURJTyB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19TX1RVTkVSOiB7CisJSk9UKDgsICJWSURJT0NfU19UVU5FUiB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitjYXNlIFZJRElPQ19HX0ZCVUY6CitjYXNlIFZJRElPQ19TX0ZCVUY6CitjYXNlIFZJRElPQ19PVkVSTEFZOiB7CisJSk9UKDgsICJWSURJT0NfR19GQlVGfFZJRElPQ19TX0ZCVUZ8VklESU9DX09WRVJMQVkgdW5zdXBwb3J0ZWRcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworY2FzZSBWSURJT0NfR19UVU5FUjogeworCUpPVCg4LCAiVklESU9DX0dfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6CitjYXNlIFZJRElPQ19TX0ZSRVFVRU5DWTogeworCUpPVCg4LCAiVklESU9DX0dfRlJFUVVFTkNZfFZJRElPQ19TX0ZSRVFVRU5DWSB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCitkZWZhdWx0OiB7CisJSk9UKDgsICJFUlJPUjogdW5yZWNvZ25pemVkIFY0TDIgSU9DVEwgY29tbWFuZDogMHglMDhYXG4iLCBjbWQpOworCWV4cGxhaW5faW9jdGwoY21kKTsKKwlQT1VUOworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9Cit9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK2xvbmcKK2Vhc3lzbmRfaW9jdGxfbm9pbm9kZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGVhc3lzbmRfaW9jdGwoKHN0cnVjdCBpbm9kZSAqKU5VTEwsIGZpbGUsIGNtZCwgYXJnKTsKK30KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZWFzeXNuZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgXAorCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKK3N0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKK3N0cnVjdCB1c2JfZGV2aWNlICpwOworCitwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTEwuXG4iKTsKKwlyZXR1cm4gLTE7Cit9CitwID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3dpdGNoIChjbWQpIHsKK2Nhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOiB7CisJaW50IGNhcHM7CisJSk9UKDgsICJTTkRDVExfRFNQX0dFVENBUFNcbiIpOworCisjaWYgZGVmaW5lZChVUFNBTVBMRSkKKwlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bWljcm9waG9uZSkKKwkJY2FwcyA9IDB4MDQ0MDAwMDA7CisJZWxzZQorCQljYXBzID0gMHgwNDQwMDAwMDsKKyNlbHNlCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCisJCWNhcHMgPSAweDAyNDAwMDAwOworCWVsc2UKKwkJY2FwcyA9IDB4MDQ0MDAwMDA7CisjZW5kaWYgLypVUFNBTVBMRSovCisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY2Fwcywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKK30KK2Nhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiB7CisJaW50IGluY29taW5nOworCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKworI2lmIGRlZmluZWQoVVBTQU1QTEUpCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCisJCWluY29taW5nID0gQUZNVF9TMTZfTEU7CisJZWxzZQorCQlpbmNvbWluZyA9IEFGTVRfUzE2X0xFOworI2Vsc2UKKwlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bWljcm9waG9uZSkKKwkJaW5jb21pbmcgPSBBRk1UX1MxNl9MRTsKKwllbHNlCisJCWluY29taW5nID0gQUZNVF9TMTZfTEU7CisjZW5kaWYgLypVUFNBTVBMRSovCisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnJlYWs7Cit9CitjYXNlIFNORENUTF9EU1BfU0VURk1UOiB7CisJaW50IGluY29taW5nLCBvdXRnb2luZzsKKwlKT1QoOCwgIlNORENUTF9EU1BfU0VURk1UXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisKKyNpZiBkZWZpbmVkKFVQU0FNUExFKQorCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQorCQlvdXRnb2luZyA9IEFGTVRfUzE2X0xFOworCWVsc2UKKwkJb3V0Z29pbmcgPSBBRk1UX1MxNl9MRTsKKyNlbHNlCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCisJCW91dGdvaW5nID0gQUZNVF9TMTZfTEU7CisJZWxzZQorCQlvdXRnb2luZyA9IEFGTVRfUzE2X0xFOworI2VuZGlmIC8qVVBTQU1QTEUqLworCisJaWYgKGluY29taW5nICE9IG91dGdvaW5nKSB7CisJCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9b3V0Z29pbmdcbiIsIG91dGdvaW5nKTsKKwkJSk9UKDgsICIgICAgICAgIGNmLiAlaT1BRk1UX1MxNl9MRVxuIiwgQUZNVF9TMTZfTEUpOworCQlKT1QoOCwgIiAgICAgICAgY2YuICVpPUFGTVRfVThcbiIsIEFGTVRfVTgpOworCQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmb3V0Z29pbmcsIFwKKwkJCQkJCQkJc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRUlOVkFMIDsKKwl9CisJYnJlYWs7Cit9CitjYXNlIFNORENUTF9EU1BfU1RFUkVPOiB7CisJaW50IGluY29taW5nOworCUpPVCg4LCAiU05EQ1RMX0RTUF9TVEVSRU9cbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKworI2lmIGRlZmluZWQoVVBTQU1QTEUpCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCisJCWluY29taW5nID0gMTsKKwllbHNlCisJCWluY29taW5nID0gMTsKKyNlbHNlCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCisJCWluY29taW5nID0gMDsKKwllbHNlCisJCWluY29taW5nID0gMTsKKyNlbmRpZiAvKlVQU0FNUExFKi8KKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKK30KK2Nhc2UgU05EQ1RMX0RTUF9TUEVFRDogeworCWludCBpbmNvbWluZzsKKwlKT1QoOCwgIlNORENUTF9EU1BfU1BFRURcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKworI2lmIGRlZmluZWQoVVBTQU1QTEUpCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCisJCWluY29taW5nID0gMzIwMDA7CisJZWxzZQorCQlpbmNvbWluZyA9IDQ4MDAwOworI2Vsc2UKKwlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bWljcm9waG9uZSkKKwkJaW5jb21pbmcgPSA4MDAwOworCWVsc2UKKwkJaW5jb21pbmcgPSA0ODAwMDsKKyNlbmRpZiAvKlVQU0FNUExFKi8KKworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKK30KK2Nhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOiB7CisJaW50IGluY29taW5nOworCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisKKwlpbmNvbWluZyA9IFBDTV9FTkFCTEVfSU5QVVQ7CisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCWJyZWFrOworfQorY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6IHsKKwlpbnQgaW5jb21pbmc7CisJSk9UKDgsICJTTkRDVExfRFNQX1NFVFRSSUdHRVJcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwlKT1QoOCwgIi4uLi4uLi4uLi4uIGNmIDB4JXg9UENNX0VOQUJMRV9JTlBVVCAiIFwKKwkJCQkiMHgleD1QQ01fRU5BQkxFX09VVFBVVFxuIiwgXAorCQkJCQlQQ01fRU5BQkxFX0lOUFVULCBQQ01fRU5BQkxFX09VVFBVVCk7CisJOworCTsKKwk7CisJOworCWJyZWFrOworfQorY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6IHsKKwlpbnQgaW5jb21pbmc7CisJSk9UKDgsICJTTkRDVExfRFNQX0dFVEJMS1NJWkVcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwlpbmNvbWluZyA9IHBlYXN5Y2FwLT5hdWRpb19ieXRlc19wZXJfZnJhZ21lbnQ7CisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCWJyZWFrOworfQorY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRTogeworCXN0cnVjdCBhdWRpb19idWZfaW5mbyBhdWRpb19idWZfaW5mbzsKKworCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRJU1BBQ0VcbiIpOworCisJYXVkaW9fYnVmX2luZm8uYnl0ZXMgICAgICA9IHBlYXN5Y2FwLT5hdWRpb19ieXRlc19wZXJfZnJhZ21lbnQ7CisJYXVkaW9fYnVmX2luZm8uZnJhZ21lbnRzICA9IDE7CisJYXVkaW9fYnVmX2luZm8uZnJhZ3NpemUgICA9IDA7CisJYXVkaW9fYnVmX2luZm8uZnJhZ3N0b3RhbCA9IDA7CisKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYXVkaW9fYnVmX2luZm8sIFwKKwkJCQkJCQkJc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKK30KK2RlZmF1bHQ6IHsKKwlKT1QoOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgRFNQIElPQ1RMIGNvbW1hbmQ6IDB4JTA4WFxuIiwgY21kKTsKKwlQT1VUOworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9Cit9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBleHBsYWluX2lvY3RsKF9fdTMyIHdvdCkKK3sKK2ludCBrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBUSEUgREFUQSBGT1IgVEhFIEFSUkFZIG1lc3MgQkVMT1cgV0VSRSBDT05TVFJVQ1RFRCBCWSBSVU5OSU5HIFRIRSBGT0xMT1dJTkcKKyAqICBTSEVMTCBTQ1JJUFQ6CisgKiAgIworICogIGNhdCAvdXNyL3NyYy9saW51eC1oZWFkZXJzLWB1bmFtZSAtcmAvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCB8IFwKKyAqICAgICBncmVwICJeI2RlZmluZSBWSURJT0NfIiAtIHwgZ3JlcCAtdiAiX09MRCIgLSB8IFwKKyAqICAgICBzZWQgLWUgInMsX0lPLiokLCw7cCIgfCBzZWQgLWUgIk47cyxcbiwsICIgfCBcCisgKiAgICAgc2VkIC1lICJzL14jZGVmaW5lIC8gIHsvO3MvI2RlZmluZSAvLCBcIi87cy8kL1wifSwvIiB8IFwKKyAqICAgICBzZWQgLWUgInMsCSwsZztzLCAsLGciID5pb2N0bC50bXAKKyAqICBlY2hvICJ7MHhGRkZGRkZGRixcIlwifSIgPj5pb2N0bC50bXAKKyAqICBleGl0IDAKKyAqICAjCisgKiBBTkQgUkVJTlNUQVRJTkcgVEhFIEVYQ0lTRUQgIl9PTEQiIENBU0VTIFdFUkUgTEFURVIgTUFOVUFMTFkuCisgKgorICogVEhFIERBVEEgRk9SIFRIRSBBUlJBWSBtZXNzMSBCRUxPVyBXRVJFIENPTlNUUlVDVEVEIEJZIFJVTk5JTkcgVEhFIEZPTExPV0lORworICogU0hFTEwgU0NSSVBUOgorICogIGNhdCAvdXNyL3NyYy9saW51eC1oZWFkZXJzLWB1bmFtZSAtcmAvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oIHwgXAorICogICAgIGdyZXAgIl4jZGVmaW5lIFZJRElPQyIgLSB8IGdyZXAgLXYgIl9PTEQiIC0gfCBcCisgKiAgICAgc2VkIC1lICJzLF9JTy4qJCwsO3AiIHwgc2VkIC1lICJOO3MsXG4sLCAiIHwgXAorICogICAgIHNlZCAtZSAicy9eI2RlZmluZSAvICB7LztzLyNkZWZpbmUgLywgXCIvO3MvJC9cIn0sLyIgfCBcCisgKiAgICAgc2VkIC1lICJzLCAgICwsZztzLCAsLGciID5pb2N0bC50bXAKKyAqICBlY2hvICJ7MHhGRkZGRkZGRixcIlwifSIgPj5pb2N0bC50bXAKKyAqICBleGl0IDAKKyAqICAjCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgbWVzcyB7CisJX191MzIgY29tbWFuZDsKKwljaGFyICBuYW1lWzY0XTsKK30gbWVzc1tdID0geworI2lmIGRlZmluZWQoVklESU9DX1FVRVJZQ0FQKQore1ZJRElPQ19RVUVSWUNBUCwgIlZJRElPQ19RVUVSWUNBUCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfUkVTRVJWRUQpCit7VklESU9DX1JFU0VSVkVELCAiVklESU9DX1JFU0VSVkVEIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19FTlVNX0ZNVCkKK3tWSURJT0NfRU5VTV9GTVQsICJWSURJT0NfRU5VTV9GTVQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfRk1UKQore1ZJRElPQ19HX0ZNVCwgIlZJRElPQ19HX0ZNVCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19GTVQpCit7VklESU9DX1NfRk1ULCAiVklESU9DX1NfRk1UIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19SRVFCVUZTKQore1ZJRElPQ19SRVFCVUZTLCAiVklESU9DX1JFUUJVRlMifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1FVRVJZQlVGKQore1ZJRElPQ19RVUVSWUJVRiwgIlZJRElPQ19RVUVSWUJVRiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19GQlVGKQore1ZJRElPQ19HX0ZCVUYsICJWSURJT0NfR19GQlVGIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX0ZCVUYpCit7VklESU9DX1NfRkJVRiwgIlZJRElPQ19TX0ZCVUYifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX09WRVJMQVkpCit7VklESU9DX09WRVJMQVksICJWSURJT0NfT1ZFUkxBWSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfUUJVRikKK3tWSURJT0NfUUJVRiwgIlZJRElPQ19RQlVGIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19EUUJVRikKK3tWSURJT0NfRFFCVUYsICJWSURJT0NfRFFCVUYifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1NUUkVBTU9OKQore1ZJRElPQ19TVFJFQU1PTiwgIlZJRElPQ19TVFJFQU1PTiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU1RSRUFNT0ZGKQore1ZJRElPQ19TVFJFQU1PRkYsICJWSURJT0NfU1RSRUFNT0ZGIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19HX1BBUk0pCit7VklESU9DX0dfUEFSTSwgIlZJRElPQ19HX1BBUk0ifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1NfUEFSTSkKK3tWSURJT0NfU19QQVJNLCAiVklESU9DX1NfUEFSTSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19TVEQpCit7VklESU9DX0dfU1RELCAiVklESU9DX0dfU1REIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX1NURCkKK3tWSURJT0NfU19TVEQsICJWSURJT0NfU19TVEQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0VOVU1TVEQpCit7VklESU9DX0VOVU1TVEQsICJWSURJT0NfRU5VTVNURCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfRU5VTUlOUFVUKQore1ZJRElPQ19FTlVNSU5QVVQsICJWSURJT0NfRU5VTUlOUFVUIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19HX0NUUkwpCit7VklESU9DX0dfQ1RSTCwgIlZJRElPQ19HX0NUUkwifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTCkKK3tWSURJT0NfU19DVFJMLCAiVklESU9DX1NfQ1RSTCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19UVU5FUikKK3tWSURJT0NfR19UVU5FUiwgIlZJRElPQ19HX1RVTkVSIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX1RVTkVSKQore1ZJRElPQ19TX1RVTkVSLCAiVklESU9DX1NfVFVORVIifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfQVVESU8pCit7VklESU9DX0dfQVVESU8sICJWSURJT0NfR19BVURJTyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19BVURJTykKK3tWSURJT0NfU19BVURJTywgIlZJRElPQ19TX0FVRElPIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWUNUUkwpCit7VklESU9DX1FVRVJZQ1RSTCwgIlZJRElPQ19RVUVSWUNUUkwifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1FVRVJZTUVOVSkKK3tWSURJT0NfUVVFUllNRU5VLCAiVklESU9DX1FVRVJZTUVOVSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19JTlBVVCkKK3tWSURJT0NfR19JTlBVVCwgIlZJRElPQ19HX0lOUFVUIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX0lOUFVUKQore1ZJRElPQ19TX0lOUFVULCAiVklESU9DX1NfSU5QVVQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfT1VUUFVUKQore1ZJRElPQ19HX09VVFBVVCwgIlZJRElPQ19HX09VVFBVVCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19PVVRQVVQpCit7VklESU9DX1NfT1VUUFVULCAiVklESU9DX1NfT1VUUFVUIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19FTlVNT1VUUFVUKQore1ZJRElPQ19FTlVNT1VUUFVULCAiVklESU9DX0VOVU1PVVRQVVQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfQVVET1VUKQore1ZJRElPQ19HX0FVRE9VVCwgIlZJRElPQ19HX0FVRE9VVCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19BVURPVVQpCit7VklESU9DX1NfQVVET1VULCAiVklESU9DX1NfQVVET1VUIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19HX01PRFVMQVRPUikKK3tWSURJT0NfR19NT0RVTEFUT1IsICJWSURJT0NfR19NT0RVTEFUT1IifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1NfTU9EVUxBVE9SKQore1ZJRElPQ19TX01PRFVMQVRPUiwgIlZJRElPQ19TX01PRFVMQVRPUiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19GUkVRVUVOQ1kpCit7VklESU9DX0dfRlJFUVVFTkNZLCAiVklESU9DX0dfRlJFUVVFTkNZIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX0ZSRVFVRU5DWSkKK3tWSURJT0NfU19GUkVRVUVOQ1ksICJWSURJT0NfU19GUkVRVUVOQ1kifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0NST1BDQVApCit7VklESU9DX0NST1BDQVAsICJWSURJT0NfQ1JPUENBUCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19DUk9QKQore1ZJRElPQ19HX0NST1AsICJWSURJT0NfR19DUk9QIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX0NST1ApCit7VklESU9DX1NfQ1JPUCwgIlZJRElPQ19TX0NST1AifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfSlBFR0NPTVApCit7VklESU9DX0dfSlBFR0NPTVAsICJWSURJT0NfR19KUEVHQ09NUCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19KUEVHQ09NUCkKK3tWSURJT0NfU19KUEVHQ09NUCwgIlZJRElPQ19TX0pQRUdDT01QIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWVNURCkKK3tWSURJT0NfUVVFUllTVEQsICJWSURJT0NfUVVFUllTVEQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1RSWV9GTVQpCit7VklESU9DX1RSWV9GTVQsICJWSURJT0NfVFJZX0ZNVCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfRU5VTUFVRElPKQore1ZJRElPQ19FTlVNQVVESU8sICJWSURJT0NfRU5VTUFVRElPIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19FTlVNQVVET1VUKQore1ZJRElPQ19FTlVNQVVET1VULCAiVklESU9DX0VOVU1BVURPVVQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfUFJJT1JJVFkpCit7VklESU9DX0dfUFJJT1JJVFksICJWSURJT0NfR19QUklPUklUWSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19QUklPUklUWSkKK3tWSURJT0NfU19QUklPUklUWSwgIlZJRElPQ19TX1BSSU9SSVRZIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQKQore1ZJRElPQ19HX1NMSUNFRF9WQklfQ0FQLCAiVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0xPR19TVEFUVVMpCit7VklESU9DX0xPR19TVEFUVVMsICJWSURJT0NfTE9HX1NUQVRVUyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfR19FWFRfQ1RSTFMpCit7VklESU9DX0dfRVhUX0NUUkxTLCAiVklESU9DX0dfRVhUX0NUUkxTIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19TX0VYVF9DVFJMUykKK3tWSURJT0NfU19FWFRfQ1RSTFMsICJWSURJT0NfU19FWFRfQ1RSTFMifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1RSWV9FWFRfQ1RSTFMpCit7VklESU9DX1RSWV9FWFRfQ1RSTFMsICJWSURJT0NfVFJZX0VYVF9DVFJMUyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfRU5VTV9GUkFNRVNJWkVTKQore1ZJRElPQ19FTlVNX0ZSQU1FU0laRVMsICJWSURJT0NfRU5VTV9GUkFNRVNJWkVTIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTKQore1ZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTLCAiVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfRU5DX0lOREVYKQore1ZJRElPQ19HX0VOQ19JTkRFWCwgIlZJRElPQ19HX0VOQ19JTkRFWCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfRU5DT0RFUl9DTUQpCit7VklESU9DX0VOQ09ERVJfQ01ELCAiVklESU9DX0VOQ09ERVJfQ01EIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19UUllfRU5DT0RFUl9DTUQpCit7VklESU9DX1RSWV9FTkNPREVSX0NNRCwgIlZJRElPQ19UUllfRU5DT0RFUl9DTUQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfQ0hJUF9JREVOVCkKK3tWSURJT0NfR19DSElQX0lERU5ULCAiVklESU9DX0dfQ0hJUF9JREVOVCJ9LAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZJRElPQ19PVkVSTEFZX09MRCkKK3tWSURJT0NfT1ZFUkxBWV9PTEQsICJWSURJT0NfT1ZFUkxBWV9PTEQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX1NfUEFSTV9PTEQpCit7VklESU9DX1NfUEFSTV9PTEQsICJWSURJT0NfU19QQVJNX09MRCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfU19DVFJMX09MRCkKK3tWSURJT0NfU19DVFJMX09MRCwgIlZJRElPQ19TX0NUUkxfT0xEIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRElPX09MRCkKK3tWSURJT0NfR19BVURJT19PTEQsICJWSURJT0NfR19BVURJT19PTEQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DX0dfQVVET1VUX09MRCkKK3tWSURJT0NfR19BVURPVVRfT0xELCAiVklESU9DX0dfQVVET1VUX09MRCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NfQ1JPUENBUF9PTEQpCit7VklESU9DX0NST1BDQVBfT0xELCAiVklESU9DX0NST1BDQVBfT0xEIn0sCisjZW5kaWYKK3sweEZGRkZGRkZGLCAiIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVzcyBtZXNzMVtdID0gXAoreworI2lmIGRlZmluZWQoVklESU9DR0NBUCkKK3tWSURJT0NHQ0FQLCAiVklESU9DR0NBUCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NHQ0hBTikKK3tWSURJT0NHQ0hBTiwgIlZJRElPQ0dDSEFOIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ1NDSEFOKQore1ZJRElPQ1NDSEFOLCAiVklESU9DU0NIQU4ifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DR1RVTkVSKQore1ZJRElPQ0dUVU5FUiwgIlZJRElPQ0dUVU5FUiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NTVFVORVIpCit7VklESU9DU1RVTkVSLCAiVklESU9DU1RVTkVSIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ0dQSUNUKQore1ZJRElPQ0dQSUNULCAiVklESU9DR1BJQ1QifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DU1BJQ1QpCit7VklESU9DU1BJQ1QsICJWSURJT0NTUElDVCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NDQVBUVVJFKQore1ZJRElPQ0NBUFRVUkUsICJWSURJT0NDQVBUVVJFIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ0dXSU4pCit7VklESU9DR1dJTiwgIlZJRElPQ0dXSU4ifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DU1dJTikKK3tWSURJT0NTV0lOLCAiVklESU9DU1dJTiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NHRkJVRikKK3tWSURJT0NHRkJVRiwgIlZJRElPQ0dGQlVGIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ1NGQlVGKQore1ZJRElPQ1NGQlVGLCAiVklESU9DU0ZCVUYifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DS0VZKQore1ZJRElPQ0tFWSwgIlZJRElPQ0tFWSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NHRlJFUSkKK3tWSURJT0NHRlJFUSwgIlZJRElPQ0dGUkVRIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ1NGUkVRKQore1ZJRElPQ1NGUkVRLCAiVklESU9DU0ZSRVEifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DR0FVRElPKQore1ZJRElPQ0dBVURJTywgIlZJRElPQ0dBVURJTyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NTQVVESU8pCit7VklESU9DU0FVRElPLCAiVklESU9DU0FVRElPIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ1NZTkMpCit7VklESU9DU1lOQywgIlZJRElPQ1NZTkMifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DTUNBUFRVUkUpCit7VklESU9DTUNBUFRVUkUsICJWSURJT0NNQ0FQVFVSRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NHTUJVRikKK3tWSURJT0NHTUJVRiwgIlZJRElPQ0dNQlVGIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ0dVTklUKQore1ZJRElPQ0dVTklULCAiVklESU9DR1VOSVQifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DR0NBUFRVUkUpCit7VklESU9DR0NBUFRVUkUsICJWSURJT0NHQ0FQVFVSRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NTQ0FQVFVSRSkKK3tWSURJT0NTQ0FQVFVSRSwgIlZJRElPQ1NDQVBUVVJFIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ1NQTEFZTU9ERSkKK3tWSURJT0NTUExBWU1PREUsICJWSURJT0NTUExBWU1PREUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVklESU9DU1dSSVRFTU9ERSkKK3tWSURJT0NTV1JJVEVNT0RFLCAiVklESU9DU1dSSVRFTU9ERSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWSURJT0NHUExBWUlORk8pCit7VklESU9DR1BMQVlJTkZPLCAiVklESU9DR1BMQVlJTkZPIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZJRElPQ1NNSUNST0NPREUpCit7VklESU9DU01JQ1JPQ09ERSwgIlZJRElPQ1NNSUNST0NPREUifSwKKyNlbmRpZgorezB4RkZGRkZGRkYsICIifQorfTsKKworayA9IDA7Cit3aGlsZSAobWVzc1trXS5uYW1lWzBdKSB7CisJaWYgKHdvdCA9PSBtZXNzW2tdLmNvbW1hbmQpIHsKKwkJSk9UKDgsICJpb2N0bCAweCUwOFggaXMgJXNcbiIsIFwKKwkJCQkJbWVzc1trXS5jb21tYW5kLCAmbWVzc1trXS5uYW1lWzBdKTsKKwkJcmV0dXJuIDA7CisJfQorCWsrKzsKK30KK0pPVCg4LCAiaW9jdGwgMHglMDhYIGlzIG5vdCBpbiB2aWRlb2RldjIuaFxuIiwgd290KTsKKworayA9IDA7Cit3aGlsZSAobWVzczFba10ubmFtZVswXSkgeworCWlmICh3b3QgPT0gbWVzczFba10uY29tbWFuZCkgeworCQlKT1QoOCwgImlvY3RsIDB4JTA4WCBpcyAlcyAoVjRMMSlcbiIsIFwKKwkJCQkJbWVzczFba10uY29tbWFuZCwgJm1lc3MxW2tdLm5hbWVbMF0pOworCQlyZXR1cm4gMDsKKwl9CisJaysrOworfQorSk9UKDgsICJpb2N0bCAweCUwOFggaXMgbm90IGluIHZpZGVvZGV2LmhcbiIsIHdvdCk7CityZXR1cm4gLTE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZXhwbGFpbl9jaWQoX191MzIgd290KQoreworaW50IGs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRIRSBEQVRBIEZPUiBUSEUgQVJSQVkgbWVzcyBCRUxPVyBXRVJFIENPTlNUUlVDVEVEIEJZIFJVTk5JTkcgVEhFIEZPTExPV0lORworICogIFNIRUxMIFNDUklQVDoKKyAqICAjCisgKiAgY2F0IC91c3Ivc3JjL2xpbnV4LWhlYWRlcnMtYHVuYW1lIC1yYC9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIHwgXAorICogICAgIGdyZXAgIl4jZGVmaW5lIFY0TDJfQ0lEXyIgfCAgXAorICogICAgIHNlZCAtZSAicywoLiokLCw7cCIgfCBzZWQgLWUgIk47cyxcbiwsICIgfCBcCisgKiAgICAgc2VkIC1lICJzL14jZGVmaW5lIC8gIHsvO3MvI2RlZmluZSAvLCBcIi87cy8kL1wifSwvIiB8IFwKKyAqICAgICBzZWQgLWUgInMsCSwsZztzLCAsLGciIHwgZ3JlcCAtdiAiX0JBU0UiIHwgZ3JlcCAtdiAiTVBFRyIgPmNpZC50bXAKKyAqICBlY2hvICJ7MHhGRkZGRkZGRixcIlwifSIgPj5jaWQudG1wCisgKiAgZXhpdCAwCisgKiAgIworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IG1lc3MKK3sKK19fdTMyIGNvbW1hbmQ7CitjaGFyICBuYW1lWzY0XTsKK30gbWVzc1tdID0geworI2lmIGRlZmluZWQoVjRMMl9DSURfVVNFUl9DTEFTUykKK3tWNEwyX0NJRF9VU0VSX0NMQVNTLCAiVjRMMl9DSURfVVNFUl9DTEFTUyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9CUklHSFRORVNTKQore1Y0TDJfQ0lEX0JSSUdIVE5FU1MsICJWNEwyX0NJRF9CUklHSFRORVNTIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0NPTlRSQVNUKQore1Y0TDJfQ0lEX0NPTlRSQVNULCAiVjRMMl9DSURfQ09OVFJBU1QifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfU0FUVVJBVElPTikKK3tWNEwyX0NJRF9TQVRVUkFUSU9OLCAiVjRMMl9DSURfU0FUVVJBVElPTiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9IVUUpCit7VjRMMl9DSURfSFVFLCAiVjRMMl9DSURfSFVFIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKK3tWNEwyX0NJRF9BVURJT19WT0xVTUUsICJWNEwyX0NJRF9BVURJT19WT0xVTUUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fQkFMQU5DRSkKK3tWNEwyX0NJRF9BVURJT19CQUxBTkNFLCAiVjRMMl9DSURfQVVESU9fQkFMQU5DRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19CQVNTKQore1Y0TDJfQ0lEX0FVRElPX0JBU1MsICJWNEwyX0NJRF9BVURJT19CQVNTIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX1RSRUJMRSkKK3tWNEwyX0NJRF9BVURJT19UUkVCTEUsICJWNEwyX0NJRF9BVURJT19UUkVCTEUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fTVVURSkKK3tWNEwyX0NJRF9BVURJT19NVVRFLCAiVjRMMl9DSURfQVVESU9fTVVURSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19MT1VETkVTUykKK3tWNEwyX0NJRF9BVURJT19MT1VETkVTUywgIlY0TDJfQ0lEX0FVRElPX0xPVURORVNTIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0JMQUNLX0xFVkVMKQore1Y0TDJfQ0lEX0JMQUNLX0xFVkVMLCAiVjRMMl9DSURfQkxBQ0tfTEVWRUwifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFKQore1Y0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwgIlY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFKQore1Y0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0UsICJWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX1JFRF9CQUxBTkNFKQore1Y0TDJfQ0lEX1JFRF9CQUxBTkNFLCAiVjRMMl9DSURfUkVEX0JBTEFOQ0UifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfQkxVRV9CQUxBTkNFKQore1Y0TDJfQ0lEX0JMVUVfQkFMQU5DRSwgIlY0TDJfQ0lEX0JMVUVfQkFMQU5DRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9HQU1NQSkKK3tWNEwyX0NJRF9HQU1NQSwgIlY0TDJfQ0lEX0dBTU1BIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX1dISVRFTkVTUykKK3tWNEwyX0NJRF9XSElURU5FU1MsICJWNEwyX0NJRF9XSElURU5FU1MifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfRVhQT1NVUkUpCit7VjRMMl9DSURfRVhQT1NVUkUsICJWNEwyX0NJRF9FWFBPU1VSRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9BVVRPR0FJTikKK3tWNEwyX0NJRF9BVVRPR0FJTiwgIlY0TDJfQ0lEX0FVVE9HQUlOIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0dBSU4pCit7VjRMMl9DSURfR0FJTiwgIlY0TDJfQ0lEX0dBSU4ifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfSEZMSVApCit7VjRMMl9DSURfSEZMSVAsICJWNEwyX0NJRF9IRkxJUCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9WRkxJUCkKK3tWNEwyX0NJRF9WRkxJUCwgIlY0TDJfQ0lEX1ZGTElQIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0hDRU5URVIpCit7VjRMMl9DSURfSENFTlRFUiwgIlY0TDJfQ0lEX0hDRU5URVIifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfVkNFTlRFUikKK3tWNEwyX0NJRF9WQ0VOVEVSLCAiVjRMMl9DSURfVkNFTlRFUiJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSkKK3tWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSwgIlY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0hVRV9BVVRPKQore1Y0TDJfQ0lEX0hVRV9BVVRPLCAiVjRMMl9DSURfSFVFX0FVVE8ifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSkKK3tWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFLCAiVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9TSEFSUE5FU1MpCit7VjRMMl9DSURfU0hBUlBORVNTLCAiVjRMMl9DSURfU0hBUlBORVNTIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04pCit7VjRMMl9DSURfQkFDS0xJR0hUX0NPTVBFTlNBVElPTiwgIlY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04ifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfQ0hST01BX0FHQykKK3tWNEwyX0NJRF9DSFJPTUFfQUdDLCAiVjRMMl9DSURfQ0hST01BX0FHQyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9DT0xPUl9LSUxMRVIpCit7VjRMMl9DSURfQ09MT1JfS0lMTEVSLCAiVjRMMl9DSURfQ09MT1JfS0lMTEVSIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0xBU1RQMSkKK3tWNEwyX0NJRF9MQVNUUDEsICJWNEwyX0NJRF9MQVNUUDEifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfQ0FNRVJBX0NMQVNTKQore1Y0TDJfQ0lEX0NBTUVSQV9DTEFTUywgIlY0TDJfQ0lEX0NBTUVSQV9DTEFTUyJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9FWFBPU1VSRV9BVVRPKQore1Y0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sICJWNEwyX0NJRF9FWFBPU1VSRV9BVVRPIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFKQore1Y0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFLCAiVjRMMl9DSURfRVhQT1NVUkVfQUJTT0xVVEUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSkKK3tWNEwyX0NJRF9FWFBPU1VSRV9BVVRPX1BSSU9SSVRZLCAiVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9QQU5fUkVMQVRJVkUpCit7VjRMMl9DSURfUEFOX1JFTEFUSVZFLCAiVjRMMl9DSURfUEFOX1JFTEFUSVZFIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUpCit7VjRMMl9DSURfVElMVF9SRUxBVElWRSwgIlY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfUEFOX1JFU0VUKQore1Y0TDJfQ0lEX1BBTl9SRVNFVCwgIlY0TDJfQ0lEX1BBTl9SRVNFVCJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9USUxUX1JFU0VUKQore1Y0TDJfQ0lEX1RJTFRfUkVTRVQsICJWNEwyX0NJRF9USUxUX1JFU0VUIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX1BBTl9BQlNPTFVURSkKK3tWNEwyX0NJRF9QQU5fQUJTT0xVVEUsICJWNEwyX0NJRF9QQU5fQUJTT0xVVEUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfVElMVF9BQlNPTFVURSkKK3tWNEwyX0NJRF9USUxUX0FCU09MVVRFLCAiVjRMMl9DSURfVElMVF9BQlNPTFVURSJ9LAorI2VuZGlmCisjaWYgZGVmaW5lZChWNEwyX0NJRF9GT0NVU19BQlNPTFVURSkKK3tWNEwyX0NJRF9GT0NVU19BQlNPTFVURSwgIlY0TDJfQ0lEX0ZPQ1VTX0FCU09MVVRFIn0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKFY0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFKQore1Y0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFLCAiVjRMMl9DSURfRk9DVVNfUkVMQVRJVkUifSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVjRMMl9DSURfRk9DVVNfQVVUTykKK3tWNEwyX0NJRF9GT0NVU19BVVRPLCAiVjRMMl9DSURfRk9DVVNfQVVUTyJ9LAorI2VuZGlmCit7MHhGRkZGRkZGRiwgIiJ9Cit9OworCitrID0gMDsKK3doaWxlIChtZXNzW2tdLm5hbWVbMF0pIHsKKwlpZiAod290ID09IG1lc3Nba10uY29tbWFuZCkgeworCQlKT1QoOCwgImlvY3RsIDB4JTA4WCBpcyAlc1xuIiwgXAorCQkJCQltZXNzW2tdLmNvbW1hbmQsICZtZXNzW2tdLm5hbWVbMF0pOworCQlyZXR1cm4gMDsKKwl9CisJaysrOworfQorSk9UKDgsICJjaWQgMHglMDhYIGlzIG5vdCBpbiB2aWRlb2RldjIuaFxuIiwgd290KTsKK3JldHVybiAtMTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBjZDYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBlYXN5Y2FwX2lvY3RsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgUi5NLiBUaG9tYXMgIDxybXRob21hc0BzY2lvbHVzLm9yZz4KKyAqCisgKgorICogIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGUgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHN0cnVjdCBlYXN5Y2FwX2Zvcm1hdCBlYXN5Y2FwX2Zvcm1hdFtdOworZXh0ZXJuIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBlYXN5Y2FwX2NvbnRyb2xbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMWZjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jCkBAIC0wLDAgKzEsMTA0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgZWFzeWNhcF9sb3cuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgUi5NLiBUaG9tYXMgIDxybXRob21hc0BzY2lvbHVzLm9yZz4KKyAqCisgKgorICogIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGUgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICBBQ0tOT1dMRUdFTUVOVFMgQU5EIFJFRkVSRU5DRVMKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIGRyaXZlciBtYWtlcyB1c2Ugb2YgcmVnaXN0ZXIgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBTeW50ZWsKKyAqICBTZW1pY29uIERDLTExMjUgZHJpdmVyIGhvc3RlZCBhdAorICogICAgICAgICAgICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3N5bnRla2RyaXZlci8uCisgKiAgUGFydGljdWxhcmx5IHVzZWZ1bCBoYXMgYmVlbiBhIHBhdGNoIHRvIHRoZSBsYXR0ZXIgZHJpdmVyIHByb3ZpZGVkIGJ5CisgKiAgSXZvciBIZXdpdHQgaW4gSmFudWFyeSAyMDA5LiAgVGhlIE5UU0MgaW1wbGVtZW50YXRpb24gaXMgdGFrZW4gZnJvbSB0aGUKKyAqICB3b3JrIG9mIEJlbiBUcmFzay4KKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImVhc3ljYXBfZGVidWcuaCIKKyNpbmNsdWRlICJlYXN5Y2FwLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY29uc3Qgc3RydWN0IHN0azExNjBjb25maWcgeyBpbnQgcmVnOyBpbnQgc2V0OyB9IHN0azExNjBjb25maWdbMjU2XSA9IHsKKwl7MHgwMDAsIDB4MDA5OH0sCisJezB4MDAyLCAweDAwOTN9LAorCisJezB4MDAxLCAweDAwMDN9LAorCXsweDAwMywgMHgwMDgwfSwKKwl7MHgwMEQsIDB4MDAwMH0sCisJezB4MDBGLCAweDAwMDJ9LAorCXsweDAxOCwgMHgwMDEwfSwKKwl7MHgwMTksIDB4MDAwMH0sCisJezB4MDFBLCAweDAwMTR9LAorCXsweDAxQiwgMHgwMDBFfSwKKwl7MHgwMUMsIDB4MDA0Nn0sCisKKwl7MHgxMDAsIDB4MDAzM30sCisJezB4MTAzLCAweDAwMDB9LAorCXsweDEwNCwgMHgwMDAwfSwKKwl7MHgxMDUsIDB4MDAwMH0sCisJezB4MTA2LCAweDAwMDB9LAorCisjaWYgZGVmaW5lZChQUkVGRVJfTlRTQykKKworI3VuZGVmICBPTERNQVJHSU4KKyNpZiBkZWZpbmVkKE9MRE1BUkdJTikKKwl7MHgxMTAsIDB4MDAwOH0sCisjZWxzZQorCXsweDExMCwgMHgwMDE0fSwKKyNlbmRpZiAvKk9MRE1BUkdJTiovCisKKwl7MHgxMTEsIDB4MDAwMH0sCisJezB4MTEyLCAweDAwMDN9LAorCXsweDExMywgMHgwMDAwfSwKKworI2lmIGRlZmluZWQoT0xETUFSR0lOKQorCXsweDExNCwgMHgwNTA4fSwKKyNlbHNlCisJezB4MTE0LCAweDA1MTR9LAorI2VuZGlmIC8qT0xETUFSR0lOKi8KKworCXsweDExNSwgMHgwMDA1fSwKKwl7MHgxMTYsIDB4MDBGM30sCisJezB4MTE3LCAweDAwMDB9LAorCisjZWxzZSAvKiAhIFBSRUZFUl9OVFNDKi8KKworI2lmIGRlZmluZWQoT0xETUFSR0lOKQorCXsweDExMCwgMHgwMDA4fSwKKyNlbHNlCisJezB4MTEwLCAweDAwMTR9LAorI2VuZGlmIC8qT0xETUFSR0lOKi8KKworCXsweDExMSwgMHgwMDAwfSwKKwl7MHgxMTIsIDB4MDAyMH0sCisJezB4MTEzLCAweDAwMDB9LAorCisjaWYgZGVmaW5lZChPTERNQVJHSU4pCisJezB4MTE0LCAweDA1MDh9LAorI2Vsc2UKKwl7MHgxMTQsIDB4MDUxNH0sCisjZW5kaWYgLypPTERNQVJHSU4qLworCisJezB4MTE1LCAweDAwMDV9LAorCXsweDExNiwgMHgwMTEwfSwKKwl7MHgxMTcsIDB4MDAwMX0sCisKKyNlbmRpZiAvKiAhIFBSRUZFUl9OVFNDKi8KKworCXsweDIwMiwgMHgwMDBGfSwKKwl7MHgyMDMsIDB4MDA0QX0sCisJezB4MkZGLCAweDAwMDB9LAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXsweEZGRiwgMHhGRkZGfQorCX07CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IHN0cnVjdCBzYWE3MTEzY29uZmlnIHsgaW50IHJlZzsgaW50IHNldDsgfSBzYWE3MTEzY29uZmlnWzI1Nl0gPSB7CisJezB4MDEsIDB4MDh9LAorCXsweDAyLCAweDgwfSwKKwl7MHgwMywgMHgzM30sCisJezB4MDQsIDB4MDB9LAorCXsweDA1LCAweDAwfSwKKwl7MHgwNiwgMHhFOX0sCisJezB4MDcsIDB4MER9LAorI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCisJezB4MDgsIDB4Nzh9LAorI2Vsc2UKKwl7MHgwOCwgMHgzOH0sCisjZW5kaWYgLyogISBQUkVGRVJfTlRTQyovCisJezB4MDksIDB4MDB9LAorCXsweDBBLCBTQUFfMEFfREVGQVVMVH0sCisJezB4MEIsIFNBQV8wQl9ERUZBVUxUfSwKKwl7MHgwQywgU0FBXzBDX0RFRkFVTFR9LAorCXsweDBELCBTQUFfMERfREVGQVVMVH0sCisJezB4MEUsIDB4MDF9LAorCXsweDBGLCAweDM2fSwKKwl7MHgxMCwgMHgwMH0sCisJezB4MTEsIDB4MEN9LAorCXsweDEyLCAweEU3fSwKKwl7MHgxMywgMHgwMH0sCisJezB4MTUsIDB4MDB9LAorCXsweDE2LCAweDAwfSwKKyNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQorCXsweDQwLCAweDgyfSwKKyNlbHNlCisJezB4NDAsIDB4MDJ9LAorI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLworCXsweDQxLCAweEZGfSwKKwl7MHg0MiwgMHhGRn0sCisJezB4NDMsIDB4RkZ9LAorCXsweDQ0LCAweEZGfSwKKwl7MHg0NSwgMHhGRn0sCisJezB4NDYsIDB4RkZ9LAorCXsweDQ3LCAweEZGfSwKKwl7MHg0OCwgMHhGRn0sCisJezB4NDksIDB4RkZ9LAorCXsweDRBLCAweEZGfSwKKwl7MHg0QiwgMHhGRn0sCisJezB4NEMsIDB4RkZ9LAorCXsweDRELCAweEZGfSwKKwl7MHg0RSwgMHhGRn0sCisJezB4NEYsIDB4RkZ9LAorCXsweDUwLCAweEZGfSwKKwl7MHg1MSwgMHhGRn0sCisJezB4NTIsIDB4RkZ9LAorCXsweDUzLCAweEZGfSwKKwl7MHg1NCwgMHhGRn0sCisJezB4NTUsIDB4RkZ9LAorCXsweDU2LCAweEZGfSwKKwl7MHg1NywgMHhGRn0sCisJezB4NTgsIDB4NDB9LAorCXsweDU5LCAweDU0fSwKKyNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQorCXsweDVBLCAweDBBfSwKKyNlbHNlCisJezB4NUEsIDB4MDd9LAorI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLworCXsweDVCLCAweDgzfSwKKwl7MHhGRiwgMHhGRn0KKwl9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Citjb25maXJtX3Jlc29sdXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnApCit7CitfX3U4IGdldDAsIGdldDEsIGdldDIsIGdldDMsIGdldDQsIGdldDUsIGdldDYsIGdldDc7CitHRVQocCwgMHgwMTEwLCAmZ2V0MCk7CitHRVQocCwgMHgwMTExLCAmZ2V0MSk7CitHRVQocCwgMHgwMTEyLCAmZ2V0Mik7CitHRVQocCwgMHgwMTEzLCAmZ2V0Myk7CitHRVQocCwgMHgwMTE0LCAmZ2V0NCk7CitHRVQocCwgMHgwMTE1LCAmZ2V0NSk7CitHRVQocCwgMHgwMTE2LCAmZ2V0Nik7CitHRVQocCwgMHgwMTE3LCAmZ2V0Nyk7CitKT1QoOCwgICIweCUwM1gsIDB4JTAzWCwgIiBcCisJIjB4JTAzWCwgMHglMDNYLCAiIFwKKwkiMHglMDNYLCAweCUwM1gsICIgXAorCSIweCUwM1gsIDB4JTAzWFxuIiwgXAorCWdldDAsIGdldDEsIGdldDIsIGdldDMsIGdldDQsIGdldDUsIGdldDYsIGdldDcpOworSk9UKDgsICAiLi4uLmNmIFBBTF83MjB4NTI2OiAiIFwKKwkiMHglMDNYLCAweCUwM1gsICIgXAorCSIweCUwM1gsIDB4JTAzWCwgIiBcCisJIjB4JTAzWCwgMHglMDNYLCAiIFwKKwkiMHglMDNYLCAweCUwM1hcbiIsIFwKKwkweDAwMCwgMHgwMDAsIDB4MDAxLCAweDAwMCwgMHg1QTAsIDB4MDA1LCAweDEyMSwgMHgwMDEpOworSk9UKDgsICAiLi4uLmNmIFBBTF83MDR4NTI2OiAiIFwKKwkiMHglMDNYLCAweCUwM1gsICIgXAorCSIweCUwM1gsIDB4JTAzWCwgIiBcCisJIjB4JTAzWCwgMHglMDNYLCAiIFwKKwkiMHglMDNYLCAweCUwM1hcbiIsIFwKKwkweDAwNCwgMHgwMDAsIDB4MDAxLCAweDAwMCwgMHg1ODQsIDB4MDA1LCAweDEyMSwgMHgwMDEpOworSk9UKDgsICAiLi4uLmNmIFZHQV82NDB4NDgwOiAiIFwKKwkiMHglMDNYLCAweCUwM1gsICIgXAorCSIweCUwM1gsIDB4JTAzWCwgIiBcCisJIjB4JTAzWCwgMHglMDNYLCAiIFwKKwkiMHglMDNYLCAweCUwM1hcbiIsIFwKKwkweDAwOCwgMHgwMDAsIDB4MDIwLCAweDAwMCwgMHg1MDgsIDB4MDA1LCAweDExMCwgMHgwMDEpOworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorY29uZmlybV9zdHJlYW0oc3RydWN0IHVzYl9kZXZpY2UgKnApCit7CitfX3UxNiBnZXQyOworX191OCBpZ290OworCitHRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQyID0gMHg4MCAmIGlnb3Q7CitpZiAoMHg4MCA9PSBnZXQyKQorCUpPVCg4LCAiY29uZmlybV9zdHJlYW06ICBPS1xuIik7CitlbHNlCisJSk9UKDgsICJjb25maXJtX3N0cmVhbTogIFNUVUNLXG4iKTsKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3NldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3sKK2ludCBpMDsKKworaTAgPSAwOword2hpbGUgKDB4RkZGICE9IHN0azExNjBjb25maWdbaTBdLnJlZykgeworCVNFVChwLCBzdGsxMTYwY29uZmlnW2kwXS5yZWcsIHN0azExNjBjb25maWdbaTBdLnNldCk7CisJaTArKzsKKwl9CisKK3dyaXRlXzMwMChwKTsKKworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwKQoreworaW50IGkwLCBpcjsKKworCitzZXQydG83OChwKTsKKworCitpMCA9IDA7Cit3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnW2kwXS5yZWcpIHsKKwlpciA9IHdyaXRlX3NhYShwLCBzYWE3MTEzY29uZmlnW2kwXS5yZWcsIHNhYTcxMTNjb25maWdbaTBdLnNldCk7CisJaTArKzsKKwl9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50Cit3cml0ZV8wMDAoc3RydWN0IHVzYl9kZXZpY2UgKnAsIF9fdTE2IHNldDIsIF9fdTE2IHNldDApCit7CitfX3U4IGlnb3QwLCBpZ290MjsKKworR0VUKHAsIDB4MDAwMiwgJmlnb3QyKTsKK0dFVChwLCAweDAwMDAsICZpZ290MCk7CitTRVQocCwgMHgwMDAyLCBzZXQyKTsKK1NFVChwLCAweDAwMDAsIHNldDApOworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAord3JpdGVfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBfX3UxNiByZWcwLCBfX3UxNiBzZXQwKQoreworU0VUKHAsIDB4MjAwLCAweDAwKTsKK1NFVChwLCAweDIwNCwgcmVnMCk7CitTRVQocCwgMHgyMDUsIHNldDApOworU0VUKHAsIDB4MjAwLCAweDAxKTsKK3JldHVybiB3YWl0X2kyYyhwKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFJFR0lTVEVSIDUwMDogIFNFVFRJTkcgVkFMVUUgVE8gMHgwMDhCIFJFQURTIEZST00gVlQxNjEyQSAoPykKKyAqICBSRUdJU1RFUiA1MDA6ICBTRVRUSU5HIFZBTFVFIFRPIDB4MDA4QyBXUklURVMgVE8gIFZUMTYxMkEKKyAqICBSRUdJU1RFUiA1MDI6ICBMRUFTVCBTSUdOSUZJQ0FOVCBCWVRFIE9GIFZBTFVFIFRPIFNFVAorICogIFJFR0lTVEVSIDUwMzogIE1PU1QgU0lHTklGSUNBTlQgQllURSBPRiBWQUxVRSBUTyBTRVQKKyAqICBSRUdJU1RFUiA1MDQ6ICBUQVJHRVQgQUREUkVTUyBPTiBWVDE2MTJBCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50Cit3cml0ZV92dChzdHJ1Y3QgdXNiX2RldmljZSAqcCwgX191MTYgcmVnMCwgX191MTYgc2V0MCkKK3sKK19fdTggaWdvdDsKK19fdTE2IGdvdDUwMiwgZ290NTAzOworX191MTYgc2V0NTAyLCBzZXQ1MDM7CisKK1NFVChwLCAweDA1MDQsIHJlZzApOworU0VUKHAsIDB4MDUwMCwgMHgwMDhCKTsKKworR0VUKHAsIDB4MDUwMiwgJmlnb3QpOyAgZ290NTAyID0gKDB4RkYgJiBpZ290KTsKK0dFVChwLCAweDA1MDMsICZpZ290KTsgIGdvdDUwMyA9ICgweEZGICYgaWdvdCk7CisKK0pPVCgxNiwgIndyaXRlX3Z0KC4sIDB4JTA0WCwgMHglMDRYKTogd2FzIDB4JTA0WFxuIiwgXAorCQkJCQlyZWcwLCBzZXQwLCAoKGdvdDUwMyA8PCA4KSB8IGdvdDUwMikpOworCitzZXQ1MDIgPSAgKDB4MDBGRiAmIHNldDApOworc2V0NTAzID0gKCgweEZGMDAgJiBzZXQwKSA+PiA4KTsKKworU0VUKHAsIDB4MDUwNCwgcmVnMCk7CitTRVQocCwgMHgwNTAyLCBzZXQ1MDIpOworU0VUKHAsIDB4MDUwMywgc2V0NTAzKTsKK1NFVChwLCAweDA1MDAsIDB4MDA4Qyk7CisKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUkVHSVNURVIgNTAwOiAgU0VUVElORyBWQUxVRSBUTyAweDAwOEIgUkVBRFMgRlJPTSBWVDE2MTJBICg/KQorICogIFJFR0lTVEVSIDUwMDogIFNFVFRJTkcgVkFMVUUgVE8gMHgwMDhDIFdSSVRFUyBUTyAgVlQxNjEyQQorICogIFJFR0lTVEVSIDUwMjogIExFQVNUIFNJR05JRklDQU5UIEJZVEUgT0YgVkFMVUUgVE8gR0VUCisgKiAgUkVHSVNURVIgNTAzOiAgTU9TVCBTSUdOSUZJQ0FOVCBCWVRFIE9GIFZBTFVFIFRPIEdFVAorICogIFJFR0lTVEVSIDUwNDogIFRBUkdFVCBBRERSRVNTIE9OIFZUMTYxMkEKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK3JlYWRfdnQoc3RydWN0IHVzYl9kZXZpY2UgKnAsIF9fdTE2IHJlZzApCit7CitfX3U4IGlnb3Q7CitfX3UxNiBnb3Q1MDIsIGdvdDUwMzsKKworU0VUKHAsIDB4MDUwNCwgcmVnMCk7CitTRVQocCwgMHgwNTAwLCAweDAwOEIpOworCitHRVQocCwgMHgwNTAyLCAmaWdvdCk7ICBnb3Q1MDIgPSAoMHhGRiAmIGlnb3QpOworR0VUKHAsIDB4MDUwMywgJmlnb3QpOyAgZ290NTAzID0gKDB4RkYgJiBpZ290KTsKKworSk9UKDE2LCAicmVhZF92dCguLCAweCUwNFgpOiBoYXMgMHglMDRYXG4iLCByZWcwLCAoKGdvdDUwMyA8PCA4KSB8IGdvdDUwMikpOworCityZXR1cm4gKGdvdDUwMyA8PCA4KSB8IGdvdDUwMjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRIRVNFIEFQUEVBUiBUTyBIQVZFIE5PIEVGRkVDVCBPTiBFSVRIRVIgVklERU8gT1IgQVVESU8uCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50Cit3cml0ZV8zMDAoc3RydWN0IHVzYl9kZXZpY2UgKnApCit7CitTRVQocCwgMHgzMDAsIDB4MDAxMik7CitTRVQocCwgMHgzNTAsIDB4MDAyRCk7CitTRVQocCwgMHgzNTEsIDB4MDAwMSk7CitTRVQocCwgMHgzNTIsIDB4MDAwMCk7CitTRVQocCwgMHgzNTMsIDB4MDAwMCk7CitTRVQocCwgMHgzMDAsIDB4MDA4MCk7CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE5PVEU6IFRIRSBGT0xMT1dJTkcgSVMgTk9UIENIRUNLRUQ6CisgKiAgUkVHSVNURVIgMHgwRiwgV0hJQ0ggSVMgSU5WT0xWRUQgSU4gQ0hST01JTkFOQ0UgQVVUT01BVElDIEdBSU4gQ09OVFJPTC4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2NoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3sKK2ludCBpMCwgaXIsIHJjOworaTAgPSAwOworCityYyA9IDA7Cit3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnW2kwXS5yZWcpIHsKKwlpZiAoMHgwRiA9PSBzYWE3MTEzY29uZmlnW2kwXS5yZWcpIHsKKwkJaTArKzsgY29udGludWU7CisJfQorCisJaXIgPSByZWFkX3NhYShwLCBzYWE3MTEzY29uZmlnW2kwXS5yZWcpOworCWlmIChpciAhPSBzYWE3MTEzY29uZmlnW2kwXS5zZXQpIHsKKwkJU0FZKCJTQUEgcmVnaXN0ZXIgMHglMDJYIGhhcyAweCUwMlgsIGV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJc2FhNzExM2NvbmZpZ1tpMF0ucmVnLCBpciwgc2FhNzExM2NvbmZpZ1tpMF0uc2V0KTsKKwkJcmMtLTsKKwl9CisJaTArKzsKK30KK2lmICgtOCA+IHJjKQorCXJldHVybiByYzsKK2Vsc2UKKwlyZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CittZXJpdF9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKnApCit7CitpbnQgcmM7CisKK3JjID0gcmVhZF9zYWEocCwgMHgxRik7CitpZiAoKDAgPiByYykgfHwgKDB4MDIgJiByYykpCisJcmV0dXJuIDEgOworZWxzZQorCXJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3JlYWR5X3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3sKK2ludCBqLCByYzsKK3N0YXRpYyBpbnQgbWF4ID0gMTA7CisKK2ogPSAwOword2hpbGUgKG1heCA+IGopIHsKKwlyYyA9IHJlYWRfc2FhKHAsIDB4MUYpOworCWlmICgwIDw9IHJjKSB7CisJCWlmICgoMSA9PSAoMHgwMSAmIHJjKSkmJigwID09ICgweDQwICYgcmMpKSkKKwkJCWJyZWFrOworCX0KKwltc2xlZXAoMTAwKTsgIGorKzsKK30KK2lmIChtYXggPT0gaikKKwlyZXR1cm4gLTE7CitlbHNlIHsKKwlpZiAoMHgyMCAmIHJjKQorCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgNjAgSHpcbiIpOworCWVsc2UKKwkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIDUwIEh6XG4iKTsKKwlpZiAoMHg4MCAmIHJjKQorCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgaW50ZXJsYWNpbmdcbiIpOworCWVsc2UKKwkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIG5vIGludGVybGFjaW5nXG4iKTsKK30KK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgTk9URTogVEhFIEZPTExPV0lORyBBUkUgTk9UIENIRUNLRUQ6CisgKiAgUkVHSVNURVJTIDB4MDAwLCAweDAwMjogIEZVTkNUSU9OQUxJVFkgSVMgTk9UIEtOT1dOCisgKiAgUkVHSVNURVIgIDB4MTAwOiAgQUNDRVBUIEFMU08gKDB4ODAgfCBzdGsxMTYwY29uZmlnWy5dLnNldCkKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2NoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3sKK2ludCBpMCwgaXI7CitpMCA9IDA7Cit3aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7CisJaWYgKDB4MDAwID09IHN0azExNjBjb25maWdbaTBdLnJlZykgeworCQlpMCsrOyBjb250aW51ZTsKKwl9CisJaWYgKDB4MDAyID09IHN0azExNjBjb25maWdbaTBdLnJlZykgeworCQlpMCsrOyBjb250aW51ZTsKKwl9CisKKwlpciA9IHJlYWRfc3RrKHAsIHN0azExNjBjb25maWdbaTBdLnJlZyk7CisKKwlpZiAoMHgxMDAgPT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7CisJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSAmJiBcCisJCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpKSAmJiBcCisJCQkJKDB4RkZGRiAhPSBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSB7CisJCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCisJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJc3RrMTE2MGNvbmZpZ1tpMF0ucmVnLCBpciwgXAorCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5zZXQpOworCQkJfQorCQlpMCsrOyBjb250aW51ZTsKKwkJfQorCisJaWYgKChpciAhPSAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpICYmIFwKKwkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0uc2V0KSkgeworCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCisJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJc3RrMTE2MGNvbmZpZ1tpMF0ucmVnLCBpciwgXAorCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5zZXQpOworCQl9CisJaTArKzsKKwl9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CityZWFkX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCwgX191MTYgcmVnMCkKK3sKK19fdTggaWdvdDsKKworU0VUKHAsIDB4MjA4LCByZWcwKTsKK1NFVChwLCAweDIwMCwgMHgyMCk7CitpZiAoMCAhPSB3YWl0X2kyYyhwKSkKKwlyZXR1cm4gLTE7CitpZ290ID0gMDsKK0dFVChwLCAweDAyMDksICZpZ290KTsKK3JldHVybiBpZ290OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3JlYWRfc3RrKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBfX3UzMiByZWcwKQoreworX191OCBpZ290OworCitpZ290ID0gMDsKK0dFVChwLCByZWcwLCAmaWdvdCk7CityZXR1cm4gaWdvdDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgICBIQVJEV0FSRSAgICBVU0VSU1BBQ0UgSU5QVVQgTlVNQkVSICAgUEhZU0lDQUwgSU5QVVQgICBEUklWRVIgaW5wdXQgVkFMVUUKKyAqCisgKiAgQ1ZCUytTLVZJREVPICAgICAgICAgICAwIG9yIDEgICAgICAgICAgICAgIENWQlMgICAgICAgICAgICAgICAgIDEKKyAqICAgRk9VUi1DVkJTICAgICAgICAgICAgIDAgb3IgMSAgICAgICAgICAgICAgQ1ZCUzEgICAgICAgICAgICAgICAgMQorICogICBGT1VSLUNWQlMgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICBDVkJTMiAgICAgICAgICAgICAgICAyCisgKiAgIEZPVVItQ1ZCUyAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAgIENWQlMzICAgICAgICAgICAgICAgIDMKKyAqICAgRk9VUi1DVkJTICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgQ1ZCUzQgICAgICAgICAgICAgICAgNAorICogIENWQlMrUy1WSURFTyAgICAgICAgICAgICAgNSAgICAgICAgICAgICAgIFMtVklERU8gICAgICAgICAgICAgICA1CisgKgorICogIFdIRU4gNT09aW5wdXQgVEhFIEFSR1VNRU5UIG1vZGUgTVVTVCBBTFNPIEJFIFNVUFBMSUVEOgorICoKKyAqICAgICBtb2RlICA3ICAgPT4gR0FJTiBUTyBCRSBTRVQgRVhQTElDSVRMWSBVU0lORyBSRUdJU1RFUiAweDA1IChVTlRFU1RFRCkKKyAqICAgICBtb2RlICA5ICAgPT4gVVNFIEFVVE9NQVRJQyBHQUlOIENPTlRST0wgKERFRkFVTFQpCisgKgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAorc2VsZWN0X2lucHV0KHN0cnVjdCB1c2JfZGV2aWNlICpwLCBpbnQgaW5wdXQsIGludCBtb2RlKQoreworCitzdG9wXzEwMChwKTsKKworbXNsZWVwKDIwKTsKK3N3aXRjaCAoaW5wdXQpIHsKK2Nhc2UgMDoKK2Nhc2UgMTogeworCVNFVChwLCAweDAwMDAsIDB4MDA5OCk7IGJyZWFrOworfQorY2FzZSAyOiB7CisJU0VUKHAsIDB4MDAwMCwgMHgwMDkwKTsgYnJlYWs7Cit9CitjYXNlIDM6IHsKKwlTRVQocCwgMHgwMDAwLCAweDAwODgpOyBicmVhazsKK30KK2Nhc2UgNDogeworCVNFVChwLCAweDAwMDAsIDB4MDA4MCk7IGJyZWFrOworfQorY2FzZSA1OiB7CisJaWYgKDkgIT0gbW9kZSkKKwkJbW9kZSA9IDc7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSA3OgorCQl7CisJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDg3KSkgeworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCisJCQkJInJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICIgXAorCQkJCSIlaVxuIiwgaW5wdXQpOworCQl9CisJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDA1LCAweEZGKSkgeworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCisJCQkJInJlZ2lzdGVyIDB4MDUgZm9yIGlucHV0ICIgXAorCQkJCSIlaVxuIiwgaW5wdXQpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIDk6CisJCXsKKwkJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODkpKSB7CisJCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSAiIFwKKwkJCQkicmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgIiBcCisJCQkJIiVpXG4iLCBpbnB1dCk7CisJCX0KKwkJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDUsIDB4MDApKSB7CisJCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSAiIFwKKwkJCQkicmVnaXN0ZXIgMHgwNSBmb3IgaW5wdXQgIiBcCisJCQkJIiVpXG4iLCBpbnB1dCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXsKKwkJU0FZKCJNSVNUQUtFOiAgYmFkIG1vZGU6ICVpXG4iLCBtb2RlKTsKKwkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDA0LCAweDAwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDA0ICIgXAorCQkJCQkiZm9yIGlucHV0ICVpXG4iLCBpbnB1dCk7CisJfQorCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDA5LCAweDgwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDA5ICIgXAorCQkJCQkiZm9yIGlucHV0ICVpXG4iLCBpbnB1dCk7CisJfQorCWJyZWFrOworfQorZGVmYXVsdDoKKwl7CisJU0FZKCJFUlJPUjogIGJhZCBpbnB1dDogJWlcbiIsIGlucHV0KTsKKwlyZXR1cm4gLTE7Cit9Cit9Cittc2xlZXAoMjApOworU0VUKHAsIDB4MDAwMiwgMHgwMDkzKTsKK21zbGVlcCgyMCk7CisKK3N0YXJ0XzEwMChwKTsKKworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorc2V0X3Jlc29sdXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnAsIFwKKwkJCQlfX3UxNiBzZXQwLCBfX3UxNiBzZXQxLCBfX3UxNiBzZXQyLCBfX3UxNiBzZXQzKQoreworX191MTYgdTB4MDExMSwgdTB4MDExMywgdTB4MDExNSwgdTB4MDExNzsKKwordTB4MDExMSA9ICgoMHhGRjAwICYgc2V0MCkgPj4gOCk7Cit1MHgwMTEzID0gKCgweEZGMDAgJiBzZXQxKSA+PiA4KTsKK3UweDAxMTUgPSAoKDB4RkYwMCAmIHNldDIpID4+IDgpOwordTB4MDExNyA9ICgoMHhGRjAwICYgc2V0MykgPj4gOCk7CisKK1NFVChwLCAweDAxMTAsICgweDAwRkYgJiBzZXQwKSk7CitTRVQocCwgMHgwMTExLCB1MHgwMTExKTsKK1NFVChwLCAweDAxMTIsICgweDAwRkYgJiBzZXQxKSk7CitTRVQocCwgMHgwMTEzLCB1MHgwMTEzKTsKK1NFVChwLCAweDAxMTQsICgweDAwRkYgJiBzZXQyKSk7CitTRVQocCwgMHgwMTE1LCB1MHgwMTE1KTsKK1NFVChwLCAweDAxMTYsICgweDAwRkYgJiBzZXQzKSk7CitTRVQocCwgMHgwMTE3LCB1MHgwMTE3KTsKKworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorc3RhcnRfMTAwKHN0cnVjdCB1c2JfZGV2aWNlICpwKQoreworX191MTYgZ2V0MDsKK19fdTggaWdvdDsKKworR0VUKHAsIDB4MDEwMCwgJmlnb3QpOyAgZ2V0MCA9IGlnb3Q7Cittc2xlZXAoMHgxZjQpOworU0VUKHAsIDB4MDEwMCwgKDB4ODAgfCBnZXQwKSk7Cittc2xlZXAoMHgxZjQpOworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorc3RvcF8xMDAoc3RydWN0IHVzYl9kZXZpY2UgKnApCit7CitfX3UxNiBnZXQwOworX191OCBpZ290OworCitHRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQwID0gaWdvdDsKK21zbGVlcCgweDFmNCk7CitTRVQocCwgMHgwMTAwLCAoMHg3RiAmIGdldDApKTsKK21zbGVlcCgweDFmNCk7CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEZVTkNUSU9OIHdhaXRfaTJjKCkgUkVUVVJOUyAwIE9OIFNVQ0NFU1MKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAord2FpdF9pMmMoc3RydWN0IHVzYl9kZXZpY2UgKnApCit7CitfX3UxNiBnZXQwOworX191OCBpZ290OworY29uc3QgaW50IG1heCA9IDQ7CitpbnQgazsKKworZm9yIChrID0gMDsgIGsgPCBtYXg7ICBrKyspIHsKKwlHRVQocCwgMHgwMjAxLCAmaWdvdCk7ICBnZXQwID0gaWdvdDsKKwlzd2l0Y2ggKGdldDApIHsKKwljYXNlIDB4MDQ6CisJY2FzZSAweDAxOiB7CisJCXJldHVybiAwOworCX0KKwljYXNlIDB4MDA6IHsKKwkJbXNsZWVwKDEwKTsKKwkJY29udGludWU7CisJfQorCWRlZmF1bHQ6IHsKKwkJcmV0dXJuIGdldDAgLSAxOworCX0KKwl9Cit9CityZXR1cm4gLTE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorcmVnc2V0KHN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZSwgX191MTYgaW5kZXgsIF9fdTE2IHZhbHVlKQoreworX191MTYgaWdvdDsKK2ludCByYzAsIHJjMTsKKworaWYgKCFwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVGQVVMVDsKKworcmMxID0gMDsgIGlnb3QgPSAwOworcmMwID0gdXNiX2NvbnRyb2xfbXNnKHB1c2JfZGV2aWNlLCB1c2Jfc25kY3RybHBpcGUocHVzYl9kZXZpY2UsIDApLCBcCisJCShfX3U4KTB4MDEsIFwKKwkJKF9fdTgpKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSksIFwKKwkJKF9fdTE2KXZhbHVlLCBcCisJCShfX3UxNilpbmRleCwgXAorCQkodm9pZCAqKU5VTEwsIFwKKwkJKF9fdTE2KTAsIFwKKwkJKGludCk1MDApOworCisjaWYgZGVmaW5lZChOT1JFQURCQUNLKQorIworI2Vsc2UKK3JjMSA9IHVzYl9jb250cm9sX21zZyhwdXNiX2RldmljZSwgdXNiX3JjdmN0cmxwaXBlKHB1c2JfZGV2aWNlLCAwKSwgXAorCQkoX191OCkweDAwLCBcCisJCShfX3U4KShVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSksIFwKKwkJKF9fdTE2KTB4MDAsIFwKKwkJKF9fdTE2KWluZGV4LCBcCisJCSh2b2lkICopJmlnb3QsIFwKKwkJKF9fdTE2KXNpemVvZihfX3UxNiksIFwKKwkJKGludCk1MDAwMCk7CitpZ290ID0gMHhGRiAmIGlnb3Q7Citzd2l0Y2ggKGluZGV4KSB7CitjYXNlIDB4MDAwOgorY2FzZSAweDUwMDoKK2Nhc2UgMHg1MDI6CitjYXNlIDB4NTAzOgorY2FzZSAweDUwNDoKK2Nhc2UgMHg1MDY6CitjYXNlIDB4NTA3OiB7CisJYnJlYWs7Cit9CitjYXNlIDB4MjA0OgorY2FzZSAweDIwNToKK2Nhc2UgMHgzNTA6CitjYXNlIDB4MzUxOiB7CisJaWYgKDAgIT0gaWdvdCkgeworCQlKT1QoOCwgInVuZXhwZWN0ZWQgMHglMDJYIGZvciBTVEsgcmVnaXN0ZXIgMHglMDNYXG4iLCBcCisJCQkJCQkJCWlnb3QsIGluZGV4KTsKKwl9CiticmVhazsKK30KK2Nhc2UgMHgxMTQ6CitjYXNlIDB4MTE2OiB7CisJaWYgKCgweEZGICYgdmFsdWUpICE9IGlnb3QpIHsKKwkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCAhPSAweCUwMlggIiBcCisJCQkJCQkiZm9yIFNUSyByZWdpc3RlciAweCUwM1hcbiIsIFwKKwkJCQkJCWlnb3QsIHZhbHVlLCBpbmRleCk7CisJfQorYnJlYWs7Cit9CitjYXNlIDB4MjAwOiB7CisJaWYgKDAgPT0gaWdvdCkKKwkJYnJlYWs7Cit9CitkZWZhdWx0OiB7CisJaWYgKHZhbHVlICE9IGlnb3QpIHsKKwkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCAhPSAweCUwMlggIiBcCisJCQkJCSJmb3IgU1RLIHJlZ2lzdGVyIDB4JTAzWFxuIiwgXAorCQkJCQlpZ290LCB2YWx1ZSwgaW5kZXgpOworCX0KK2JyZWFrOworfQorfQorI2VuZGlmIC8qICEgTk9SRUFEQkFDSyovCisKK3JldHVybiAoMCA+IHJjMCkgPyByYzAgOiByYzE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3JlZ2dldChzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2UsIF9fdTE2IGluZGV4LCB2b2lkICpwdm9pZCkKK3sKK2ludCBpcjsKKworaWYgKCFwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVGQVVMVDsKKworaXIgPSB1c2JfY29udHJvbF9tc2cocHVzYl9kZXZpY2UsIHVzYl9yY3ZjdHJscGlwZShwdXNiX2RldmljZSwgMCksIFwKKwkJKF9fdTgpMHgwMCwgXAorCQkoX191OCkoVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UpLCBcCisJCShfX3UxNikweDAwLCBcCisJCShfX3UxNilpbmRleCwgXAorCQkodm9pZCAqKXB2b2lkLCBcCisJCXNpemVvZihfX3U4KSwgXAorCQkoaW50KTUwMDAwKTsKK3JldHVybiAweEZGICYgaXI7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3dha2V1cF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlKQoreworcmV0dXJuIHVzYl9jb250cm9sX21zZyhwdXNiX2RldmljZSwgdXNiX3NuZGN0cmxwaXBlKHB1c2JfZGV2aWNlLCAwKSwgXAorCQkoX191OClVU0JfUkVRX1NFVF9GRUFUVVJFLCBcCisJCShfX3U4KShVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRSksIFwKKwkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQLCBcCisJCShfX3UxNikwLCBcCisJCSh2b2lkICopIE5VTEwsIFwKKwkJKF9fdTE2KTAsIFwKKwkJKGludCk1MDAwMCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEFOVDoKKyAqICBUSEUgTUVTU0FHRSBPRiBUWVBFIChVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSkKKyAqICBDQVVTRVMgTVVUSU5HIElGIFRIRSBWQUxVRSAweDAxMDAgSVMgU0VOVC4KKyAqICBUTyBFTkFCTEUgQVVESU8gIFRIRSBWQUxVRSAweDAyMDAgTVVTVCBCRSBTRU5ULgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2F1ZGlvX3NldHVwKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKK3sKK3N0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZTsKK3N0YXRpYyBfX3U4IHJlcXVlc3QgPSAweDAxOworc3RhdGljIF9fdTggcmVxdWVzdHR5cGUgPSBcCisJCShfX3U4KShVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSk7CisKK3N0YXRpYyBfX3UxNiB2YWx1ZV91bm11dGUgPSAweDAyMDA7CitzdGF0aWMgX191MTYgaW5kZXggPSAweDAzMDE7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxXTsKK3N0YXRpYyBfX3UxNiBsZW5ndGggPSAxOworaW50IHJjLCBpZDEsIGlkMjsKKworaWYgKE5VTEwgPT0gcGVhc3ljYXApCisJcmV0dXJuIC1FRkFVTFQ7CisKK3B1c2JfZGV2aWNlID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOworaWYgKE5VTEwgPT0gcHVzYl9kZXZpY2UpCisJcmV0dXJuIC1FRkFVTFQ7CisKK0pPVCg4LCAiJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAlcCisJCQlyZXF1ZXN0dHlwZSwgcmVxdWVzdCwJCVwKKwkJCSgweDAwRkYgJiB2YWx1ZV91bm11dGUpLAlcCisJCQkoMHhGRjAwICYgdmFsdWVfdW5tdXRlKSA+PiA4LAlcCisJCQkoMHgwMEZGICYgaW5kZXgpLAkJXAorCQkJKDB4RkYwMCAmIGluZGV4KSA+PiA4LAkJXAorCQkJKDB4MDBGRiAmIGxlbmd0aCksCQlcCisJCQkoMHhGRjAwICYgbGVuZ3RoKSA+PiA4KTsKKworYnVmZmVyWzBdID0gMHgwMTsKKworcmMgPSB1c2JfY29udHJvbF9tc2cocHVzYl9kZXZpY2UsIHVzYl9zbmRjdHJscGlwZShwdXNiX2RldmljZSwgMCksCVwKKwkJCShfX3U4KXJlcXVlc3QsCQkJCQlcCisJCQkoX191OClyZXF1ZXN0dHlwZSwJCQkJXAorCQkJKF9fdTE2KXZhbHVlX3VubXV0ZSwJCQkJXAorCQkJKF9fdTE2KWluZGV4LAkJCQkJXAorCQkJKHZvaWQgKikmYnVmZmVyWzBdLAkJCQlcCisJCQkoX191MTYpbGVuZ3RoLAkJCQkJXAorCQkJKGludCk1MDAwMCk7CisKK0pPVCg4LCAiMHglMDJYPWJ1ZmZlclxuIiwgKigoX191OCAqKSAmYnVmZmVyWzBdKSk7CitpZiAocmMgIT0gKGludClsZW5ndGgpCisJU0FZKCJFUlJPUjogdXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVpXG4iLCByYyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBSRUdJU1RFUiA1MDA6ICBTRVRUSU5HIFZBTFVFIFRPIDB4MDA5NCBSRVNFVFMgQVVESU8gQ09ORklHVVJBVElPTiA/Pz8KKyAqICBSRUdJU1RFUiA1MDY6ICBBTkFMT0dVRSBBVURJTyBBVFRFTlRVQVRPUiA/Pz8KKyAqICAgICAgICAgICAgICAgICBGT1IgVEhFIENWQlMrUy1WSURFTyBIQVJEV0FSRToKKyAqICAgICAgICAgICAgICAgICAgICBTRVRUSU5HIFZBTFVFIFRPIDB4MDAwMCBHSVZFUyBRVUlFVCBTT1VORC4KKyAqICAgICAgICAgICAgICAgICAgICBUSEUgVVBQRVIgQllURSBTRUVNUyBUTyBIQVZFIE5PIEVGRkVDVC4KKyAqICAgICAgICAgICAgICAgICBGT1IgVEhFIEZPVVItQ1ZCUyBIQVJEV0FSRToKKyAqICAgICAgICAgICAgICAgICAgICBTRVRUSU5HIFZBTFVFIFRPIDB4MDAwMCBTRUVNUyBUTyBIQVZFIE5PIEVGRkVDVC4KKyAqICBSRUdJU1RFUiA1MDc6ICBBTkFMT0dVRSBBVURJTyBQUkVBTVBMSUZJRVIgT04vT0ZGID8/PworICogICAgICAgICAgICAgICAgIEZPUiBUSEUgQ1ZCUy1TLVZJREVPIEhBUkRXQVJFOgorICogICAgICAgICAgICAgICAgICAgIFNFVFRJTkcgVkFMVUUgVE8gMHgwMDAxIEdJVkVTIFZFUlkgTE9VRCwgRElTVE9SVEVEIFNPVU5ELgorICogICAgICAgICAgICAgICAgICAgIFRIRSBVUFBFUiBCWVRFIFNFRU1TIFRPIEhBVkUgTk8gRUZGRUNULgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworU0VUKHB1c2JfZGV2aWNlLCAweDA1MDAsIDB4MDA5NCk7CisKK1NFVChwdXNiX2RldmljZSwgMHgwNTAwLCAweDAwOEMpOworCitTRVQocHVzYl9kZXZpY2UsIDB4MDUwNiwgMHgwMDAxKTsKK1NFVChwdXNiX2RldmljZSwgMHgwNTA3LCAweDAwMDApOworCitpZDEgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwN0MpOworaWQyID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDdFKTsKK1NBWSgiMHglMDRYOjB4JTA0WCBpcyBhdWRpbyB2ZW5kb3IgaWRcbiIsIGlkMSwgaWQyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyogICBTRUxFQ1QgQVVESU8gU09VUkNFICJMSU5FIElOIiBBTkQgU0VUIERFRkFVTFQgR0FJTiBUTyAwIGRCLgorKgorKiAgIFRIRVNFIENPTU1BTkRTIFNFRU0gVE8gQkUgQUNDRVBURUQgKFRIT1VHSCBQT1NTSUJMWSBJR05PUkVEKSBFVkVOIFdIRU4KKyogICBUSEVSRSBJUyBOTyBTRVBBUkFURSBBVURJTyBDSElQIFBSRVNFTlQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDAyLCAweDgwMDApOword3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxQywgMHg4MDAwKTsKKword3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwRSwgMHgwMDAwKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTAsIDB4MDAwMCk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEyLCAweDgwMDApOword3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxNiwgMHgwMDAwKTsKKword3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxQSwgMHgwNDA0KTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIsIDB4MDAwMCk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAweDAwMDApOworCitjaGVja192dChwdXNiX2RldmljZSk7CisKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitjaGVja192dChzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2UpCit7CitpbnQgaWdvdDsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAwMik7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDAyXG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDAyKTsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAwRSk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDBFXG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDBFKTsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxMCk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDEwXG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDEwKTsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxMik7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDEyXG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDEyKTsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxNik7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDE2XG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDE2KTsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxQSk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDFBXG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDFBKTsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxQyk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDFDXG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDFDKTsKKworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE5PVEU6ICBUSElTIERPRVMgSU5DUkVBU0UgVEhFIFZPTFVNRSBEUkFNQVRJQ0FMTFk6CisgKiAgICAgICAgIGF1ZGlvX2dhaW5zZXQocHVzYl9kZXZpY2UsIDB4MDAwRik7CisgKgorICogIElGIDE2PGxvdWQ8MzEgVlQxNjIxQSBSRUdJU1RFUiAweDFDIElTIFNFVCBGT1IgUE9TSVRJVkUgR0FJTi4KKyAqICBJRiBsb3VkPD0xNiBWVDE2MjFBIFJFR0lTVEVSIDB4MUMgSVMgU0VUIEZPUiBaRVJPIEdBSU4uCisgKiAgVEhFUkUgSVMgTkVWRVIgQU5ZIChBRERJVElPTkFMKSBBVFRFTlVBVElPTi4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CithdWRpb19nYWluc2V0KHN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZSwgX19zOCBsb3VkKQoreworaW50IGlnb3Q7CitfX3U4IHU4OworX191MTYgbXV0ZTsKKworaWYgKDE2ID4gbG91ZCkKKwlsb3VkID0gMTY7Cit1OCA9IDB4MDAwRiAmIChfX3U4KShsb3VkIC0gMTYpOworCit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDAyLCAweDgwMDApOworCitpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKK2lmICgwID4gaWdvdCkgeworCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQ1xuIik7CisJbXV0ZSA9IDB4MDAwMDsKK30gZWxzZQorCW11dGUgPSAweDgwMDAgJiAoKHVuc2lnbmVkIGludClpZ290KTsKKworSk9UKDgsICIweCUwNFg9KG11dGV8dTh8KHU4PDw4KSlcbiIsIG11dGUgfCB1OCB8ICh1OCA8PCA4KSk7CisKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMsIDB4ODAwMCk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDAyLCAweDAwMDApOworCityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYXVkaW9fZ2FpbmdldChzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2UpCit7CitpbnQgaWdvdDsKKworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxQyk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDFDXG4iKTsKK3JldHVybiBpZ290OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitzZXQydG83OChzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3sKK2ludCBpcjsKKworbXNsZWVwKDIwKTsKK2lyID0gcmVnc2V0KHAsIDB4MDAwMiwgMHgwMDc4KTsKK2lmICgwID4gaXIpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCByZWdpc3RlciAweDAwMDIgdG8gMHgwMDc4XG4iKTsKK21zbGVlcCgyMCk7CityZXR1cm4gaXI7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3NldDJ0bzkzKHN0cnVjdCB1c2JfZGV2aWNlICpwKQoreworaW50IGlyOworCittc2xlZXAoMjApOworaXIgPSByZWdzZXQocCwgMHgwMDAyLCAweDAwOTMpOworaWYgKDAgPiBpcikKKwlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IHJlZ2lzdGVyIDB4MDAwMiB0byAweDAwNzhcbiIpOworbXNsZWVwKDIwKTsKK3JldHVybiBpcjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljMTk0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jCkBAIC0wLDAgKzEsNDM1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgZWFzeWNhcF9tYWluLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgVmlkZW8gZHJpdmVyIGZvciBFYXN5Q0FQIFVTQjIuMCBWaWRlbyBDYXB0dXJlIERldmljZSBEQzYwICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFIuTS4gVGhvbWFzIDxybXRob21hc0BzY2lvbHVzLm9yZz4KKyAqCisgKgorICogIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGUgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZWFzeWNhcC5oIgorI2luY2x1ZGUgImVhc3ljYXBfc3RhbmRhcmQuaCIKKworaW50IGVhc3ljYXBfZGVidWc7Cittb2R1bGVfcGFyYW0oZWFzeWNhcF9kZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUEFSQU1FVEVSUyBBUFBMSUNBQkxFIFRPIEVOVElSRSBEUklWRVIsIEkuRS4gQk9USCBWSURFTyBBTkQgQVVESU8KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IHVzYl9kZXZpY2VfaWQgZWFzeWNhcF91c2JfZGV2aWNlX2lkX3RhYmxlW10gPSB7Cit7IFVTQl9ERVZJQ0UoVVNCX0VBU1lDQVBfVkVORE9SX0lELCBVU0JfRUFTWUNBUF9QUk9EVUNUX0lEKSB9LAoreyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGVhc3ljYXBfdXNiX2RldmljZV9pZF90YWJsZSk7CitzdHJ1Y3QgdXNiX2RyaXZlciBlYXN5Y2FwX3VzYl9kcml2ZXIgPSB7CisubmFtZSA9ICJlYXN5Y2FwIiwKKy5pZF90YWJsZSA9IGVhc3ljYXBfdXNiX2RldmljZV9pZF90YWJsZSwKKy5wcm9iZSA9IGVhc3ljYXBfdXNiX3Byb2JlLAorLmRpc2Nvbm5lY3QgPSBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0LAorfTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUEFSQU1FVEVSUyBVU0VEIFdIRU4gUkVHSVNURVJJTkcgVEhFIFZJREVPIElOVEVSRkFDRQorICoKKyAqICBOT1RFOiBTT01FIEtFUk5FTFMgSUdOT1JFIHVzYl9jbGFzc19kcml2ZXIubWlub3JfYmFzZSwgQVMgTUVOVElPTkVEIEJZCisgKiAgICAgICAgQ09SQkVUIEVUIEFMLiAiTElOVVggREVWSUNFIERSSVZFUlMiLCAzcmQgRURJVElPTiwgUEFHRSAyNTMuCisgKiAgICAgICAgVEhJUyBJUyBUSEUgQ0FTRSBGT1IgT3BlblNVU0UuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWFzeWNhcF9mb3BzID0geworLm93bmVyID0gICBUSElTX01PRFVMRSwKKy5vcGVuID0gICAgZWFzeWNhcF9vcGVuLAorLnJlbGVhc2UgPSBlYXN5Y2FwX3JlbGVhc2UsCisuaW9jdGwgPSAgIGVhc3ljYXBfaW9jdGwsCisucG9sbCA9ICAgIGVhc3ljYXBfcG9sbCwKKy5tbWFwID0gICAgZWFzeWNhcF9tbWFwLAorLmxsc2VlayA9ICBub19sbHNlZWssCit9Oworc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGVhc3ljYXBfdm1fb3BzID0geworLm9wZW4gID0gZWFzeWNhcF92bWFfb3BlbiwKKy5jbG9zZSA9IGVhc3ljYXBfdm1hX2Nsb3NlLAorLmZhdWx0ID0gZWFzeWNhcF92bWFfZmF1bHQsCit9Oworc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgZWFzeWNhcF9jbGFzcyA9IHsKKy5uYW1lID0gInVzYi9lYXN5Y2FwJWQiLAorLmZvcHMgPSAmZWFzeWNhcF9mb3BzLAorLm1pbm9yX2Jhc2UgPSBVU0JfU0tFTF9NSU5PUl9CQVNFLAorfTsKKworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKQorY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHY0bDJfZm9wcyA9IHsKKy5vd25lciA9ICAgVEhJU19NT0RVTEUsCisub3BlbiA9ICAgIGVhc3ljYXBfb3Blbl9ub2lub2RlLAorLnJlbGVhc2UgPSBlYXN5Y2FwX3JlbGVhc2Vfbm9pbm9kZSwKKy5pb2N0bCA9ICAgZWFzeWNhcF9pb2N0bF9ub2lub2RlLAorLnBvbGwgPSAgICBlYXN5Y2FwX3BvbGwsCisubW1hcCA9ICAgIGVhc3ljYXBfbW1hcCwKK307CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUyovCitpbnQgdmlkZW9fZGV2aWNlX21hbnkgLyo9MCovOworc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2FycmF5W1ZJREVPX0RFVklDRV9NQU5ZXSwgKnB2aWRlb19kZXZpY2U7CisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFBBUkFNRVRFUlMgVVNFRCBXSEVOIFJFR0lTVEVSSU5HIFRIRSBBVURJTyBJTlRFUkZBQ0UKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVhc3lzbmRfZm9wcyA9IHsKKy5vd25lciA9ICAgVEhJU19NT0RVTEUsCisub3BlbiA9ICAgIGVhc3lzbmRfb3BlbiwKKy5yZWxlYXNlID0gZWFzeXNuZF9yZWxlYXNlLAorLmlvY3RsID0gICBlYXN5c25kX2lvY3RsLAorLnJlYWQgPSAgICBlYXN5c25kX3JlYWQsCisubGxzZWVrID0gIG5vX2xsc2VlaywKK307CitzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBlYXN5c25kX2NsYXNzID0geworLm5hbWUgPSAidXNiL2Vhc3lzbmQlZCIsCisuZm9wcyA9ICZlYXN5c25kX2ZvcHMsCisubWlub3JfYmFzZSA9IFVTQl9TS0VMX01JTk9SX0JBU0UsCit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSVQgSVMgTk9UIEFQUFJPUFJJQVRFIEZPUiBlYXN5Y2FwX29wZW4oKSBUTyBTVUJNSVQgVEhFIFZJREVPIFVSQlMgSEVSRSwKKyAqICBCRUNBVVNFIFRIRVJFIFdJTEwgQUxXQVlTIEJFIFNVQlNFUVVFTlQgTkVHT1RJQVRJT04gT0YgVFYgU1RBTkRBUkQgQU5ECisgKiAgRk9STUFUIEJZIElPQ1RMIEFORCBJVCBJUyBJTkFEVklTQUJMRSBUTyBIQVZFIFRIRSBVUkJTIFJVTk5JTkcgV0hJTEUKKyAqICBSRUdJU1RFUlMgT0YgVEhFIFNBNzExM0ggQVJFIEJFSU5HIE1BTklQVUxBVEVELgorICoKKyAqICBUSEUgU1VCTUlTU0lPTiBPRiBWSURFTyBVUkJTIElTIFRIRVJFRk9SRSBERUxBWUVEIFVOVElMIFRIRSBJT0NUTCBDT01NQU5ECisgKiAgU1RSRUFNT04gSVMgUkVDRUlWRUQuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK2ludAorZWFzeWNhcF9vcGVuX25vaW5vZGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CityZXR1cm4gZWFzeWNhcF9vcGVuKChzdHJ1Y3QgaW5vZGUgKilOVUxMLCBmaWxlKTsKK30KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworaW50CitlYXN5Y2FwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkKK3N0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGVyZmFjZTsKKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KK3N0cnVjdCB1c2JfZGV2aWNlICpwOworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworaW50IGksIGssIG0sIHJjOworCitKT1QoNCwgIlxuIik7CitTQVkoIj09PT09PT09PT1PUEVOPT09PT09PT09XG4iKTsKKworcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCitpZiAoKHN0cnVjdCBpbm9kZSAqKU5VTEwgPT0gaW5vZGUpIHsKKwlTQVkoIkVSUk9SOiBpbm9kZSBpcyBOVUxMLlxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwdXNiX2ludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmZWFzeWNhcF91c2JfZHJpdmVyLCBpbWlub3IoaW5vZGUpKTsKK2lmICghcHVzYl9pbnRlcmZhY2UpIHsKKwlTQVkoIkVSUk9SOiBwdXNiX2ludGVyZmFjZSBpcyBOVUxMLlxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwZWFzeWNhcCA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjZWxzZQorZm9yIChpID0gMDsgIGkgPCB2aWRlb19kZXZpY2VfbWFueTsgIGkrKykgeworCXB2aWRlb19kZXZpY2UgPSBwdmlkZW9fYXJyYXlbaV07CisJaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCAhPSBwdmlkZW9fZGV2aWNlKSB7CisJCXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopdmlkZW9fZ2V0X2RydmRhdGEocHZpZGVvX2RldmljZSk7CisJCWJyZWFrOworCX0KK30KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIk1JU1RBS0U6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGVhc3ljYXA7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElOSVRJQUxJWkFUSU9OCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0pPVCg0LCAic3RhcnRpbmcgaW5pdGlhbGl6YXRpb25cbiIpOworCitmb3IgKGsgPSAwOyAgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyAgaysrKSB7CisJZm9yIChtID0gMDsgIG0gPCBGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspCisJCW1lbXNldChwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbywgMCwgUEFHRV9TSVpFKTsKK30KK3AgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfSBlbHNlIHsKKwlKT1QoMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgXAorCQkJCQkobG9uZyBpbnQpcGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK30KK3JjID0gd2FrZXVwX2RldmljZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworaWYgKDAgPT0gcmMpCisJSk9UKDgsICJ3YWtldXBfZGV2aWNlKCkgT0tcbiIpOworZWxzZSB7CisJU0FZKCJFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CityYyA9IHNldHVwX3N0ayhwKTsgIHBlYXN5Y2FwLT5pbnB1dCA9IDA7CitpZiAoMCA9PSByYykKKwlKT1QoOCwgInNldHVwX3N0aygpIE9LXG4iKTsKK2Vsc2UgeworCVNBWSgiRVJST1I6IHNldHVwX3N0aygpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CityYyA9IHNldHVwX3NhYShwKTsKK2lmICgwID09IHJjKQorCUpPVCg4LCAic2V0dXBfc2FhKCkgT0tcbiIpOworZWxzZSB7CisJU0FZKCJFUlJPUjogc2V0dXBfc2FhKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gY2hlY2tfc2FhKHApOworaWYgKDAgPT0gcmMpCisJSk9UKDgsICJjaGVja19zYWEoKSBPS1xuIik7CitlbHNlIGlmICgtOCA8IHJjKQorCVNBWSgiY2hlY2tfc2FhKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKK2Vsc2UgeworCVNBWSgiRVJST1I6IGNoZWNrX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0ID0gLTE7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChQUkVGRVJfTlRTQykKKworcmMgPSBhZGp1c3Rfc3RhbmRhcmQocGVhc3ljYXAsIFY0TDJfU1REX05UU0NfTSk7CitpZiAoMCA9PSByYykKKwlKT1QoOCwgImFkanVzdF9zdGFuZGFyZCguLE5UU0NfTSkgT0tcbiIpOworZWxzZSB7CisJU0FZKCJFUlJPUjogYWRqdXN0X3N0YW5kYXJkKC4sTlRTQ19NKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorcmMgPSBhZGp1c3RfZm9ybWF0KHBlYXN5Y2FwLCA2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX1VZVlksIFY0TDJfRklFTERfTk9ORSwgXAorCQkJCQkJCQkJZmFsc2UpOworaWYgKDAgPD0gcmMpCisJSk9UKDgsICJhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCxVWVZZKSBPS1xuIik7CitlbHNlIHsKKwlTQVkoIkVSUk9SOiBhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCxVWVZZKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorCisjZWxzZQorCityYyA9IGFkanVzdF9zdGFuZGFyZChwZWFzeWNhcCwgXAorCQkoVjRMMl9TVERfUEFMX0IgfCBWNEwyX1NURF9QQUxfRyB8IFY0TDJfU1REX1BBTF9IIHwgXAorCQlWNEwyX1NURF9QQUxfSSB8IFY0TDJfU1REX1BBTF9OKSk7CitpZiAoMCA9PSByYykKKwlKT1QoOCwgImFkanVzdF9zdGFuZGFyZCguLFBBTF9CR0hJTikgT0tcbiIpOworZWxzZSB7CisJU0FZKCJFUlJPUjogYWRqdXN0X3N0YW5kYXJkKC4sUEFMX0JHSElOKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorcmMgPSBhZGp1c3RfZm9ybWF0KHBlYXN5Y2FwLCA2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX1VZVlksIFY0TDJfRklFTERfTk9ORSwgXAorCQkJCQkJCQkJZmFsc2UpOworaWYgKDAgPD0gcmMpCisJSk9UKDgsICJhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCx1eXZ5LGZhbHNlKSBPS1xuIik7CitlbHNlIHsKKwlTQVkoIkVSUk9SOiBhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCx1eXZ5LGZhbHNlKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorCisjZW5kaWYgLyogIVBSRUZFUl9OVFNDKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3JjID0gYWRqdXN0X2JyaWdodG5lc3MocGVhc3ljYXAsIC04MTkyKTsKK2lmICgwICE9IHJjKSB7CisJU0FZKCJFUlJPUjogYWRqdXN0X2JyaWdodG5lc3MoZGVmYXVsdCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gYWRqdXN0X2NvbnRyYXN0KHBlYXN5Y2FwLCAtODE5Mik7CitpZiAoMCAhPSByYykgeworCVNBWSgiRVJST1I6IGFkanVzdF9jb250cmFzdChkZWZhdWx0KSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorcmMgPSBhZGp1c3Rfc2F0dXJhdGlvbihwZWFzeWNhcCwgLTgxOTIpOworaWYgKDAgIT0gcmMpIHsKKwlTQVkoIkVSUk9SOiBhZGp1c3Rfc2F0dXJhdGlvbihkZWZhdWx0KSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorcmMgPSBhZGp1c3RfaHVlKHBlYXN5Y2FwLCAtODE5Mik7CitpZiAoMCAhPSByYykgeworCVNBWSgiRVJST1I6IGFkanVzdF9odWUoZGVmYXVsdCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3JjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CitpZiAoMCA9PSByYykKKwlKT1QoOCwgInVzYl9zZXRfaW50ZXJmYWNlKC4sJWksJWkpIE9LXG4iLCBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CitlbHNlIHsKKwlTQVkoIkVSUk9SOiB1c2Jfc2V0X2ludGVyZmFjZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CityYyA9IHN0YXJ0XzEwMChwKTsKK2lmICgwID09IHJjKQorCUpPVCg4LCAic3RhcnRfMTAwKCkgT0tcbiIpOworZWxzZSB7CisJU0FZKCJFUlJPUjogc3RhcnRfMTAwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3BlYXN5Y2FwLT52aWRlb19pc29jX3NlcXVlbmNlID0gVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDE7CitwZWFzeWNhcC0+dmlkZW9faWRsZSA9IDA7CitwZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7Citmb3IgKGkgPSAwOyBpIDwgMTgwOyBpKyspCisJcGVhc3ljYXAtPm1lcml0W2ldID0gMDsKK3BlYXN5Y2FwLT52aWRlb19lb2YgPSAwOworcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDA7CisKK2RvX2dldHRpbWVvZmRheSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKKworcGVhc3ljYXAtPmZ1ZGdlID0gMDsKKworSk9UKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorc3VibWl0X3ZpZGVvX3VyYnMoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CitzdHJ1Y3QgdXJiICpwdXJiOworc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKK2ludCBqLCBpc2JhZCwgbSwgcmM7CitpbnQgaXNidWY7CisKK2lmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCB1bmluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICghcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisKKworCisKKworCisKKworCUpPVCg0LCAic3VibWlzc2lvbiBvZiBhbGwgdmlkZW8gdXJic1xuIik7CisJaWYgKDAgIT0gcmVhZHlfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSkpIHsKKwkJU0FZKCJFUlJPUjogbm90IHJlYWR5IHRvIGNhcHR1cmUgYWZ0ZXIgd2FpdGluZyAiIFwKKwkJCQkJCQkib25lIHNlY29uZFxuIik7CisJCVNBWSgiLi4uLi4gIGNvbnRpbnVpbmcgYW55d2F5XG4iKTsKKwl9CisJaXNiYWQgPSAwOyAgbSA9IDA7CisJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpIHsKKwkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCWlmIChOVUxMICE9IHBkYXRhX3VyYikgeworCQkJcHVyYiA9IHBkYXRhX3VyYi0+cHVyYjsKKwkJCWlmIChOVUxMICE9IHB1cmIpIHsKKwkJCQlpc2J1ZiA9IHBkYXRhX3VyYi0+aXNidWY7CisJCQkJcHVyYi0+aW50ZXJ2YWwgPSAxOworCQkJCXB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKKwkJCQlwdXJiLT5waXBlID0gXAorCQkJCQl1c2JfcmN2aXNvY3BpcGUocGVhc3ljYXAtPnB1c2JfZGV2aWNlLFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyKTsKKwkJCQlwdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJCQlwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcltpc2J1Zl0ucGdvOworCQkJCXB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplOworCQkJCXB1cmItPmNvbXBsZXRlID0gZWFzeWNhcF9jb21wbGV0ZTsKKwkJCQlwdXJiLT5jb250ZXh0ID0gcGVhc3ljYXA7CisJCQkJcHVyYi0+c3RhcnRfZnJhbWUgPSAwOworCQkJCXB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjOworCisJCQkJZm9yIChqID0gMDsgIGogPCBwZWFzeWNhcC0+XAorCQkJCQl2aWRlb19pc29jX2ZyYW1lc3BlcmRlc2M7IGorKykgeworCQkJCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0uXAorCQkJCQkJb2Zmc2V0ID0gaiAqIFwKKwkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQl2aWRlb19pc29jX21heGZyYW1lc2l6ZTsKKwkJCQkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2pdLlwKKwkJCQkJCWxlbmd0aCA9IHBlYXN5Y2FwLT5cCisJCQkJCQl2aWRlb19pc29jX21heGZyYW1lc2l6ZTsKKwkJCQkJfQorCisJCQkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoMCAhPSByYykgeworCQkJCQlpc2JhZCsrOworCQkJCQlTQVkoIkVSUk9SOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKKwkJCQkJCQkiZm9yIHVyYiB3aXRoIHJjOlxuIik7CisJCQkJCXN3aXRjaCAocmMpIHsKKwkJCQkJY2FzZSAtRU5PTUVNOiB7CisJCQkJCQlTQVkoIkVOT01FTVxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FTk9ERVY6IHsKKwkJCQkJCVNBWSgiRU5PREVWXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgLUVOWElPOiB7CisJCQkJCQlTQVkoIkVOWElPXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgLUVJTlZBTDogeworCQkJCQkJU0FZKCJFSU5WQUxcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAtRUFHQUlOOiB7CisJCQkJCQlTQVkoIkVBR0FJTlxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FRkJJRzogeworCQkJCQkJU0FZKCJFRkJJR1xuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FUElQRTogeworCQkJCQkJU0FZKCJFUElQRVxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FTVNHU0laRTogeworCQkJCQkJU0FZKCJFTVNHU0laRVxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlTQVkoInVua25vd24gZXJyb3IgY29kZSAlaVxuIixcCisJCQkJCQkJCQkgcmMpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW0rKzsKKwkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaXNiYWQrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCSBpc2JhZCsrOworCQkJfQorCQl9CisJaWYgKGlzYmFkKSB7CisJCUpPVCg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CisJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CisJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgXAorCQkJCQkJCQlsaXN0X2hlYWQpOworCQkJaWYgKE5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJcHVyYiA9IHBkYXRhX3VyYi0+cHVyYjsKKwkJCQlpZiAoTlVMTCAhPSBwdXJiKQorCQkJCQl1c2Jfa2lsbF91cmIocHVyYik7CisJCQl9CisJCX0KKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nID0gMDsKKwl9IGVsc2UgeworCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAxOworCQlKT1QoNCwgInN1Ym1pdHRlZCAlaSB2aWRlbyB1cmJzXG4iLCBtKTsKKwl9CisKKworCisKKworCit9IGVsc2UgeworCUpPVCg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgdmlkZW8gdXJic1xuIik7Cit9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAora2lsbF92aWRlb191cmJzKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKK3sKK2ludCBtOworc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKK3N0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOworCitpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgeworCisKKworCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgeworCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAwOworCQlKT1QoNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7CisJCW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSkgeworCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIFwKKwkJCQkJCQkJbGlzdF9oZWFkKTsKKwkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IHBkYXRhX3VyYi0+cHVyYikgeworCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKKwkJCQkJbSsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlKT1QoNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKKwl9IGVsc2UgeworCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9Cit9IGVsc2UgeworCUpPVCg4LCAiJWk9dmlkZW9faXNvY19zdHJlYW1pbmcsIG5vIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZyk7Cit9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK2ludAorZWFzeWNhcF9yZWxlYXNlX25vaW5vZGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CityZXR1cm4gZWFzeWNhcF9yZWxlYXNlKChzdHJ1Y3QgaW5vZGUgKilOVUxMLCBmaWxlKTsKK30KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2Vhc3ljYXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyNpZiAoIWRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKQorc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworCitKT1QoNCwgIlxuIik7CisKK3BlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTC5cbiIpOworCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKKwlTQVkoIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9UKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKyMKKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworCityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK2ludAordmlkZW9kZXZfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmQpCit7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitpbnQgaSwgaiwgazsKKworSk9UKDQsICJcbiIpOworCitrID0gMDsKK2ZvciAoaSA9IDA7ICBpIDwgdmlkZW9fZGV2aWNlX21hbnk7ICBpKyspIHsKKwlwdmlkZW9fZGV2aWNlID0gcHZpZGVvX2FycmF5W2ldOworCWlmICgoc3RydWN0IHZpZGVvX2RldmljZSAqKU5VTEwgIT0gcHZpZGVvX2RldmljZSkgeworCQlpZiAocHZkLT5taW5vciA9PSBwdmlkZW9fZGV2aWNlLT5taW5vcikgeworCQkJcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilcCisJCQkJCXZpZGVvX2dldF9kcnZkYXRhKHB2aWRlb19kZXZpY2UpOworCQkJaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKKwkJCQlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCQkJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHlcbiIpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJaWYgKDAgIT0ga2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKSkgeworCQkJCVNBWSgiRVJST1I6IGtpbGxfdmlkZW9fdXJicygpIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlKT1QoNCwgImZyZWVpbmcgdmlkZW9fZGV2aWNlIHN0cnVjdHVyZTogIiBcCisJCQkJCQkJIi9kZXYvdmlkZW8laVxuIiwgaSk7CisJCQlrZnJlZSgodm9pZCAqKXB2aWRlb19kZXZpY2UpOworCQkJZm9yIChqID0gaTsgIGogPCAoVklERU9fREVWSUNFX01BTlkgLSAxKTsgIGorKykKKwkJCQlwdmlkZW9fYXJyYXlbal0gPSBwdmlkZW9fYXJyYXlbaiArIDFdOworCQkJdmlkZW9fZGV2aWNlX21hbnktLTsgIGsrKzsKKwkJCWJyZWFrOworCQl9CisJfQorfQoraWYgKCFrKSB7CisJU0FZKCJFUlJPUjogbG9zdCB2aWRlb19kZXZpY2Ugc3RydWN0dXJlIGZvciAlaT1taW5vclxuIiwgcHZkLT5taW5vcik7CisJU0FZKCJjYW5ub3QgZnJlZTogbWF5IGNhdXNlIG1lbW9yeSBsZWFrXG4iKTsKKwlTQVkoImVuZGluZyB1bnN1Y2Nlc3NmdWxseVxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK0pPVCg0LCAiZW5kaW5nIHN1Y2Nlc3NmdWxseVxuIik7CityZXR1cm4gMDsKK30KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgVEhJUyBGVU5DVElPTiBJUyBDQUxMRUQgRlJPTSBXSVRISU4gZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpLgorICogIEJZIFRISVMgU1RBR0UgVEhFIERFVklDRSBIQVMgQUxSRUFEWSBCRUVOIFBIWVNJQ0FMTFkgVU5QTFVHR0VELgorICogIHBlYXN5Y2FwLT5wdXNiX2RldmljZSBJUyBOTyBMT05HRVIgVkFMSUQgQU5EIFNIT1VMRCBIQVZFIEJFRU4gU0VUIFRPIE5VTEwuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2Vhc3ljYXBfZGVsZXRlKHN0cnVjdCBrcmVmICpwa3JlZikKK3sKK2ludCBrLCBtLCBsb3N0OworaW50IGFsbG9jYXRpb25fdmlkZW9fdXJiLCBhbGxvY2F0aW9uX3ZpZGVvX3BhZ2UsIGFsbG9jYXRpb25fdmlkZW9fc3RydWN0OworaW50IGFsbG9jYXRpb25fYXVkaW9fdXJiLCBhbGxvY2F0aW9uX2F1ZGlvX3BhZ2UsIGFsbG9jYXRpb25fYXVkaW9fc3RydWN0OworaW50IHJlZ2lzdGVyZWRfdmlkZW8sIHJlZ2lzdGVyZWRfYXVkaW87CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKK3N0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQsICpwbGlzdF9uZXh0OworCitKT1QoNCwgIlxuIik7CisKK3BlYXN5Y2FwID0gY29udGFpbmVyX29mKHBrcmVmLCBzdHJ1Y3QgZWFzeWNhcCwga3JlZik7CitpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEw6IGNhbm5vdCBwZXJmb3JtIGRlbGV0aW9uc1xuIik7CisJcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBGUkVFIFZJREVPLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpIHsKKwlKT1QoNCwgImZyZWVpbmcgdmlkZW8gdXJic1xuIik7CisJbSA9IDA7CisJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpIHsKKwkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCWlmIChOVUxMID09IHBkYXRhX3VyYikKKwkJCUpPVCg0LCAiRVJST1I6IHBkYXRhX3VyYiBpcyBOVUxMXG4iKTsKKwkJZWxzZSB7CisJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IHBkYXRhX3VyYi0+cHVyYikgeworCQkJCXVzYl9mcmVlX3VyYihwZGF0YV91cmItPnB1cmIpOworCQkJCXBkYXRhX3VyYi0+cHVyYiA9IChzdHJ1Y3QgdXJiICopTlVMTDsKKwkJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmIgLT0gMTsKKwkJCQltKys7CisJCQl9CisJCX0KKwl9CisKKwlKT1QoNCwgIiVpIHZpZGVvIHVyYnMgZnJlZWRcbiIsIG0pOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCUpPVCg0LCAiZnJlZWluZyB2aWRlbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzLlxuIik7CisJbSA9IDA7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBsaXN0X2hlYWQsIHBsaXN0X25leHQsIHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpIHsKKwkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCWtmcmVlKHBkYXRhX3VyYik7ICBwZGF0YV91cmIgPSAoc3RydWN0IGRhdGFfdXJiICopTlVMTDsKKwkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCAtPSBcCisJCQkJCQlzaXplb2Yoc3RydWN0IGRhdGFfdXJiKTsKKwkJCW0rKzsKKwkJfQorCX0KKwlKT1QoNCwgIiVpIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOworCUpPVCg0LCAic2V0dGluZyBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkPU5VTExcbiIpOworCXBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgPSAoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEw7CisJfSBlbHNlIHsKK0pPVCg0LCAicGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCBpcyBOVUxMXG4iKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0pPVCg0LCAiZnJlZWluZyB2aWRlbyBpc29jIGJ1ZmZlcnMuXG4iKTsKK20gPSAwOworZm9yIChrID0gMDsgIGsgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyAgaysrKSB7CisJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ucGdvKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpXAorCQkJCShwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ucGdvKSwgXAorCQkJCVZJREVPX0lTT0NfT1JERVIpOworCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ucGdvID0gKHZvaWQgKilOVUxMOworCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlIC09IFwKKwkJCQkoKHVuc2lnbmVkIGludCkoMHgwMSA8PCBWSURFT19JU09DX09SREVSKSk7CisJCW0rKzsKKwl9Cit9CitKT1QoNCwgImlzb2MgdmlkZW8gYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIG0gKiAoMHgwMSA8PCBWSURFT19JU09DX09SREVSKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitKT1QoNCwgImZyZWVpbmcgdmlkZW8gZmllbGQgYnVmZmVycy5cbiIpOworbG9zdCA9IDA7Citmb3IgKGsgPSAwOyAgayA8IEZJRUxEX0JVRkZFUl9NQU5ZOyAgaysrKSB7CisJZm9yIChtID0gMDsgIG0gPCBGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspIHsKKwkJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbykgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKVwKKwkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba11bbV0ucGdvKSk7CisJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbyA9ICh2b2lkICopTlVMTDsKKwkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgLT0gMTsKKwkJCWxvc3QrKzsKKwkJfQorCX0KK30KK0pPVCg0LCAidmlkZW8gZmllbGQgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGxvc3QpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworSk9UKDQsICJmcmVlaW5nIHZpZGVvIGZyYW1lIGJ1ZmZlcnMuXG4iKTsKK2xvc3QgPSAwOworZm9yIChrID0gMDsgIGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgIGsrKykgeworCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CisJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28pIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylcCisJCQkJCShwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbykpOworCQkJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28gPSAodm9pZCAqKU5VTEw7CisJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlIC09IDE7CisJCQlsb3N0Kys7CisJCX0KKwl9Cit9CitKT1QoNCwgInZpZGVvIGZyYW1lIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBsb3N0KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgRlJFRSBBVURJTy4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7CisJSk9UKDQsICJmcmVlaW5nIGF1ZGlvIHVyYnNcbiIpOworCW0gPSAwOworCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CisJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOworCQlpZiAoTlVMTCA9PSBwZGF0YV91cmIpCisJCQlKT1QoNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CisJCWVsc2UgeworCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKKwkJCQl1c2JfZnJlZV91cmIocGRhdGFfdXJiLT5wdXJiKTsKKwkJCQlwZGF0YV91cmItPnB1cmIgPSAoc3RydWN0IHVyYiAqKU5VTEw7CisJCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fdXJiIC09IDE7CisJCQkJbSsrOworCQkJfQorCQl9CisJfQorCUpPVCg0LCAiJWkgYXVkaW8gdXJicyBmcmVlZFxuIiwgbSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJSk9UKDQsICJmcmVlaW5nIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMuXG4iKTsKKwltID0gMDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocGxpc3RfaGVhZCwgcGxpc3RfbmV4dCwgcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgeworCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKKwkJaWYgKChzdHJ1Y3QgZGF0YV91cmIgKilOVUxMICE9IHBkYXRhX3VyYikgeworCQkJa2ZyZWUocGRhdGFfdXJiKTsgIHBkYXRhX3VyYiA9IChzdHJ1Y3QgZGF0YV91cmIgKilOVUxMOworCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0IC09IFwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgZGF0YV91cmIpOworCQkJbSsrOworCQl9CisJfQorSk9UKDQsICIlaSBhdWRpbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzIGZyZWVkXG4iLCBtKTsKK0pPVCg0LCAic2V0dGluZyBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkPU5VTExcbiIpOworcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTDsKK30gZWxzZSB7CitKT1QoNCwgInBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitKT1QoNCwgImZyZWVpbmcgYXVkaW8gaXNvYyBidWZmZXJzLlxuIik7CittID0gMDsKK2ZvciAoayA9IDA7ICBrIDwgQVVESU9fSVNPQ19CVUZGRVJfTUFOWTsgIGsrKykgeworCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyW2tdLnBnbykgeworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKVwKKwkJCQkocGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyW2tdLnBnbyksIFwKKwkJCQlBVURJT19JU09DX09SREVSKTsKKwkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyW2tdLnBnbyA9ICh2b2lkICopTlVMTDsKKwkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fcGFnZSAtPSBcCisJCQkJKCh1bnNpZ25lZCBpbnQpKDB4MDEgPDwgQVVESU9fSVNPQ19PUkRFUikpOworCQltKys7CisJfQorfQorSk9UKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBcCisJCQkJCW0gKiAoMHgwMSA8PCBBVURJT19JU09DX09SREVSKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitKT1QoNCwgImZyZWVpbmcgYXVkaW8gYnVmZmVycy5cbiIpOworbG9zdCA9IDA7Citmb3IgKGsgPSAwOyAgayA8IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55OyAgaysrKSB7CisJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW2tdLnBnbykgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSk7CisJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvID0gKHZvaWQgKilOVUxMOworCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlIC09IDE7CisJCWxvc3QrKzsKKwl9Cit9CitKT1QoNCwgImVhc3lzbmRfZGVsZXRlKCk6IGF1ZGlvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBsb3N0KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0pPVCg0LCAiZnJlZWluZyBlYXN5Y2FwIHN0cnVjdHVyZS5cbiIpOworYWxsb2NhdGlvbl92aWRlb191cmIgICAgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmI7CithbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgICA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2U7CithbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdDsKK3JlZ2lzdGVyZWRfdmlkZW8gICAgICAgID0gcGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW87CithbGxvY2F0aW9uX2F1ZGlvX3VyYiAgICA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3VyYjsKK2FsbG9jYXRpb25fYXVkaW9fcGFnZSAgID0gcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fcGFnZTsKK2FsbG9jYXRpb25fYXVkaW9fc3RydWN0ID0gcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0OworcmVnaXN0ZXJlZF9hdWRpbyAgICAgICAgPSBwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbzsKK20gPSAwOworaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgIT0gcGVhc3ljYXApIHsKKwlrZnJlZShwZWFzeWNhcCk7ICBwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEw7CisJYWxsb2NhdGlvbl92aWRlb19zdHJ1Y3QgLT0gc2l6ZW9mKHN0cnVjdCBlYXN5Y2FwKTsKKwltKys7Cit9CitKT1QoNCwgIiVpIGVhc3ljYXAgc3RydWN0dXJlIGZyZWVkXG4iLCBtKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworU0FZKCIlOGk9IHZpZGVvIHVyYnMgICAgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fdXJiKTsKK1NBWSgiJThpPSB2aWRlbyBwYWdlcyAgICBhZnRlciBhbGwgZGVsZXRpb25zXG4iLCBhbGxvY2F0aW9uX3ZpZGVvX3BhZ2UpOworU0FZKCIlOGk9IHZpZGVvIHN0cnVjdHMgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fc3RydWN0KTsKK1NBWSgiJThpPSB2aWRlbyBkZXZpY2VzICBhZnRlciBhbGwgZGVsZXRpb25zXG4iLCByZWdpc3RlcmVkX3ZpZGVvKTsKK1NBWSgiJThpPSBhdWRpbyB1cmJzICAgICBhZnRlciBhbGwgZGVsZXRpb25zXG4iLCBhbGxvY2F0aW9uX2F1ZGlvX3VyYik7CitTQVkoIiU4aT0gYXVkaW8gcGFnZXMgICAgYWZ0ZXIgYWxsIGRlbGV0aW9uc1xuIiwgYWxsb2NhdGlvbl9hdWRpb19wYWdlKTsKK1NBWSgiJThpPSBhdWRpbyBzdHJ1Y3RzICBhZnRlciBhbGwgZGVsZXRpb25zXG4iLCBhbGxvY2F0aW9uX2F1ZGlvX3N0cnVjdCk7CitTQVkoIiU4aT0gYXVkaW8gZGV2aWNlcyAgYWZ0ZXIgYWxsIGRlbGV0aW9uc1xuIiwgcmVnaXN0ZXJlZF9hdWRpbyk7CisKK0pPVCg0LCAiZW5kaW5nLlxuIik7CityZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgZWFzeWNhcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworCitKT1QoOCwgIlxuIik7CisKK2lmIChOVUxMID09ICgocG9sbF90YWJsZSAqKXdhaXQpKQorCUpPVCg4LCAiV0FSTklORzogIHBvbGwgdGFibGUgcG9pbnRlciBpcyBOVUxMIC4uLiBjb250aW51aW5nXG4iKTsKK2lmIChOVUxMID09ICgoc3RydWN0IGZpbGUgKilmaWxlKSkgeworCVNBWSgiRVJST1I6ICBmaWxlIHBvaW50ZXIgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorcGVhc3ljYXAtPnBvbGxlZCA9IDE7CisKK2lmICgwID09IGVhc3ljYXBfZHFidWYocGVhc3ljYXAsIDApKQorCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworZWxzZQorCXJldHVybiBQT0xMRVJSOworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElGIG1vZGUgSVMgTk9OWkVSTyBUSElTIFJPVVRJTkUgUkVUVVJOUyAtRUFHQUlOIFJBVEhFUiBUSEFOIEJMT0NLSU5HLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2Vhc3ljYXBfZHFidWYoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgbW9kZSkKK3sKK2ludCBtaXNzLCByYzsKKworSk9UKDgsICJcbiIpOworCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgV0FJVCBGT1IgRklFTEQgMAorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCittaXNzID0gMDsKK2lmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpKQorCXJldHVybiAtRVJFU1RBUlRTWVM7Cit3aGlsZSAoKHBlYXN5Y2FwLT5maWVsZF9yZWFkID09IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB8fCBcCisJCQkJKDAgIT0gKDB4RkYwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSB8fCBcCisJCQkJKDAgIT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkgeworCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7CisKKwlpZiAobW9kZSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlKT1QoOCwgImZpcnN0IHdhaXQgIG9uIHdxX3ZpZGVvLCAiIFwKKwkJCQkiJWk9ZmllbGRfcmVhZCAgJWk9ZmllbGRfZmlsbFxuIiwgXAorCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCk7CisKKwltc2xlZXAoMSk7CisJaWYgKDAgIT0gKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwZWFzeWNhcC0+d3FfdmlkZW8sIFwKKwkJCShwZWFzeWNhcC0+dmlkZW9faWRsZSB8fCBwZWFzeWNhcC0+dmlkZW9fZW9mICB8fCBcCisJCQkoKHBlYXN5Y2FwLT5maWVsZF9yZWFkICE9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSAmJiBcCisJCQkJKDAgPT0gKDB4RkYwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSAmJiBcCisJCQkJKDAgPT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkpKSkpeworCQlTQVkoImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJCX0KKwlpZiAocGVhc3ljYXAtPnZpZGVvX2lkbGUpIHsKKwkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZVxuIiwgcGVhc3ljYXAtPnZpZGVvX2lkbGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpIHsKKwkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9fZW9mXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKKwkJZGVicmllZihwZWFzeWNhcCk7CisJCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisJCXJldHVybiAtRUlPOworCX0KK21pc3MrKzsKK2lmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpKQorCXJldHVybiAtRVJFU1RBUlRTWVM7Cit9CittdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOworSk9UKDgsICJmaXJzdCBhd2FrZW5pbmcgb24gd3FfdmlkZW8gYWZ0ZXIgJWkgd2FpdHNcbiIsIG1pc3MpOworCityYyA9IGZpZWxkMmZyYW1lKHBlYXN5Y2FwKTsKK2lmICgwICE9IHJjKQorCVNBWSgiRVJST1I6IGZpZWxkMmZyYW1lKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKworaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKSB7CisJcGVhc3ljYXAtPmZyYW1lX3JlYWQgPSBwZWFzeWNhcC0+ZnJhbWVfZmlsbDsKKwkocGVhc3ljYXAtPmZyYW1lX2ZpbGwpKys7CisJaWYgKHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSA8PSBwZWFzeWNhcC0+ZnJhbWVfZmlsbCkKKwkJcGVhc3ljYXAtPmZyYW1lX2ZpbGwgPSAwOworCisJaWYgKDB4MDEgJiBlYXN5Y2FwX3N0YW5kYXJkW3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRdLm1hc2spIHsKKwkJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltwZWFzeWNhcC0+ZnJhbWVfcmVhZF1bMF0ua291bnQgPSBcCisJCQkJCQkJVjRMMl9GSUVMRF9CT1RUT007CisJfSBlbHNlIHsKKwkJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltwZWFzeWNhcC0+ZnJhbWVfcmVhZF1bMF0ua291bnQgPSBcCisJCQkJCQkJVjRMMl9GSUVMRF9UT1A7CisJfQorSk9UKDgsICJzZXR0aW5nOiAgICAlaT1wZWFzeWNhcC0+ZnJhbWVfcmVhZFxuIiwgcGVhc3ljYXAtPmZyYW1lX3JlYWQpOworSk9UKDgsICJidW1wZWQgdG86ICAlaT1wZWFzeWNhcC0+ZnJhbWVfZmlsbFxuIiwgcGVhc3ljYXAtPmZyYW1lX2ZpbGwpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXQUlUIEZPUiBGSUVMRCAxCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK21pc3MgPSAwOworaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK3doaWxlICgocGVhc3ljYXAtPmZpZWxkX3JlYWQgPT0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHx8IFwKKwkJCQkoMCAhPSAoMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpIHx8IFwKKwkJCQkoMCA9PSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpKSB7CisJbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKTsKKworCWlmIChtb2RlKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCUpPVCg4LCAic2Vjb25kIHdhaXQgb24gd3FfdmlkZW8sICIgXAorCQkJCSIlaT1maWVsZF9yZWFkICAlaT1maWVsZF9maWxsXG4iLCBcCisJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIHBlYXN5Y2FwLT5maWVsZF9maWxsKTsKKwltc2xlZXAoMSk7CisJaWYgKDAgIT0gKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwZWFzeWNhcC0+d3FfdmlkZW8sIFwKKwkJCShwZWFzeWNhcC0+dmlkZW9faWRsZSB8fCBwZWFzeWNhcC0+dmlkZW9fZW9mICB8fCBcCisJCQkoKHBlYXN5Y2FwLT5maWVsZF9yZWFkICE9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSAmJiBcCisJCQkJKDAgPT0gKDB4RkYwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSAmJiBcCisJCQkJKDAgIT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkpKSkpeworCQlTQVkoImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChwZWFzeWNhcC0+dmlkZW9faWRsZSkgeworCQlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19pZGxlXG4iLCBwZWFzeWNhcC0+dmlkZW9faWRsZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgeworCQlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19lb2ZcbiIsIHBlYXN5Y2FwLT52aWRlb19lb2YpOworCQlkZWJyaWVmKHBlYXN5Y2FwKTsKKwkJa2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorbWlzcysrOworaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KK211dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7CitKT1QoOCwgInNlY29uZCBhd2FrZW5pbmcgb24gd3FfdmlkZW8gYWZ0ZXIgJWkgd2FpdHNcbiIsIG1pc3MpOworCityYyA9IGZpZWxkMmZyYW1lKHBlYXN5Y2FwKTsKK2lmICgwICE9IHJjKQorCVNBWSgiRVJST1I6IGZpZWxkMmZyYW1lKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKworcGVhc3ljYXAtPmZyYW1lX3JlYWQgPSBwZWFzeWNhcC0+ZnJhbWVfZmlsbDsKK3BlYXN5Y2FwLT5xdWV1ZWRbcGVhc3ljYXAtPmZyYW1lX3JlYWRdID0gMDsKK3BlYXN5Y2FwLT5kb25lW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXSAgID0gVjRMMl9CVUZfRkxBR19ET05FOworCisocGVhc3ljYXAtPmZyYW1lX2ZpbGwpKys7CitpZiAocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55IDw9IHBlYXN5Y2FwLT5mcmFtZV9maWxsKQorCXBlYXN5Y2FwLT5mcmFtZV9maWxsID0gMDsKKworaWYgKDB4MDEgJiBlYXN5Y2FwX3N0YW5kYXJkW3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRdLm1hc2spIHsKKwlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCA9IFwKKwkJCQkJCQlWNEwyX0ZJRUxEX1RPUDsKK30gZWxzZSB7CisJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltwZWFzeWNhcC0+ZnJhbWVfcmVhZF1bMF0ua291bnQgPSBcCisJCQkJCQkJVjRMMl9GSUVMRF9CT1RUT007Cit9CisKK0pPVCg4LCAic2V0dGluZzogICAgJWk9cGVhc3ljYXAtPmZyYW1lX3JlYWRcbiIsIHBlYXN5Y2FwLT5mcmFtZV9yZWFkKTsKK0pPVCg4LCAiYnVtcGVkIHRvOiAgJWk9cGVhc3ljYXAtPmZyYW1lX2ZpbGxcbiIsIHBlYXN5Y2FwLT5mcmFtZV9maWxsKTsKKworcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEJZIERFRklOSVRJT04sIG9kZCBJUyB0cnVlICBGT1IgVEhFIEZJRUxEIE9DQ1VQWUlORyBMSU5FUyAxLDMsNSwuLi4sNDc5CisgKiAgICAgICAgICAgICAgICAgb2RkIElTIGZhbHNlIEZPUiBUSEUgRklFTEQgT0NDVVBZSU5HIExJTkVTIDAsMiw0LC4uLiw0NzgKKyAqCisgKiAgV0hFTiBCT09MRUFOIFBBUkFNRVRFUiBkZWNpbWF0ZXBpeGVsIElTIHRydWUsIE9OTFkgVEhFIEZJRUxEIEZPUiBXSElDSAorICogIG9kZD09ZmFsc2UgSVMgVFJBTlNGRVJSRUQgVE8gVEhFIEZSQU1FIEJVRkZFUi4KKyAqCisgKiAgVEhFIEJPT0xFQU4gUEFSQU1FVEVSIG9mZmVyZmllbGRzIElTIHRydWUgT05MWSBXSEVOIFRIRSBVU0VSIFBST0dSQU0KKyAqICBDSE9PU0VTIFRIRSBPUFRJT04gVjRMMl9GSUVMRF9BTFRFUk5BVEUuICBOTyBVU0VSU1BBQ0UgUFJPR1JBTSBURVNURUQKKyAqICBUTyBEQVRFIEhBUyBET05FIFRISVMuICBCVUdTIEFSRSBMSUtFTFkuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAorZmllbGQyZnJhbWUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworc3RhdGljIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwwOworc3RydWN0IHRpbWV2YWwgdGltZXZhbDsKK2xvbmcgbG9uZyBpbnQgYWJvdmUsIGJlbG93OworX191MzIgcmVtYWluZGVyOworc3RydWN0IHNpZ25lZF9kaXZfcmVzdWx0IHNkcjsKKwordm9pZCAqcGV4LCAqcGFkOworaW50IGtleCwga2FkLCBtZXgsIG1hZCwgcmV4LCByYWQsIHJhZDI7CitpbnQgYzIsIGMzLCB3MiwgdzMsIGN6LCB3ejsKK2ludCByYywgYnl0ZXNwZXJwaXhlbCwgbXVsdGlwbGllciwgbXVjaCwgbW9yZSwgb3ZlciwgcnVtcCwgY2FjaGVzOworX191OCBtYXNrLCBtYXJnaW47Citib29sIG9kZCwgaXN1eSwgZGVjaW1hdGVwaXhlbCwgb2ZmZXJmaWVsZHM7CisKK0pPVCg4LCAiPT09PT0gIHBhcml0eSAlaSwgZmllbGQgYnVmZmVyICVpIC0tPiBmcmFtZSBidWZmZXIgJWlcbiIsIFwKKwkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50LFwKKwkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CitKT1QoOCwgIj09PT09ICAlaT1ieXRlc3BlcnBpeGVsXG4iLCBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbCk7CitpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpCisJSk9UKDgsICI9PT09PSBvZmZlcmZpZWxkc1xuIik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUkVKRUNUIE9SIENMRUFOIEJBRCBGSUVMRFMKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKHBlYXN5Y2FwLT5maWVsZF9yZWFkID09IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB7CisJU0FZKCJFUlJPUjogb24gZW50cnksIHN0aWxsIGZpbGxpbmcgZmllbGQgYnVmZmVyICVpXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQpOworCXJldHVybiAwOworfQorI2lmIGRlZmluZWQoRUFTWUNBUF9URVNUQ0FSRCkKK2Vhc3ljYXBfdGVzdGNhcmQocGVhc3ljYXAsIHBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKKyNlbHNlCitpZiAoMCAhPSAoMHgwNDAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKQorCWVhc3ljYXBfdGVzdGNhcmQocGVhc3ljYXAsIHBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKKyNlbmRpZiAvKkVBU1lDQVBfVEVTVENBUkQqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitvZmZlcmZpZWxkcyA9IHBlYXN5Y2FwLT5vZmZlcmZpZWxkczsKK2J5dGVzcGVycGl4ZWwgPSBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbDsKK2RlY2ltYXRlcGl4ZWwgPSBwZWFzeWNhcC0+ZGVjaW1hdGVwaXhlbDsKKworaWYgKCgyICE9IGJ5dGVzcGVycGl4ZWwpICYmIFwKKwkJCSgzICE9IGJ5dGVzcGVycGl4ZWwpICYmIFwKKwkJCSg0ICE9IGJ5dGVzcGVycGl4ZWwpKSB7CisJU0FZKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBieXRlc3BlcnBpeGVsKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICh0cnVlID09IGRlY2ltYXRlcGl4ZWwpCisJbXVsdGlwbGllciA9IDI7CitlbHNlCisJbXVsdGlwbGllciA9IDE7CisKK3cyID0gMiAqIG11bHRpcGxpZXIgKiAocGVhc3ljYXAtPndpZHRoKTsKK3czID0gYnl0ZXNwZXJwaXhlbCAqIFwKKwkJbXVsdGlwbGllciAqIFwKKwkJKHBlYXN5Y2FwLT53aWR0aCk7Cit3eiA9IG11bHRpcGxpZXIgKiBcCisJCShwZWFzeWNhcC0+aGVpZ2h0KSAqIFwKKwkJbXVsdGlwbGllciAqIFwKKwkJKHBlYXN5Y2FwLT53aWR0aCk7CisKK2tleCA9IHBlYXN5Y2FwLT5maWVsZF9yZWFkOyAgbWV4ID0gMDsKK2thZCA9IHBlYXN5Y2FwLT5mcmFtZV9maWxsOyAgbWFkID0gMDsKKworcGV4ID0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrZXhdWzBdLnBnbzsgIHJleCA9IFBBR0VfU0laRTsKK3BhZCA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba2FkXVswXS5wZ287ICByYWQgPSBQQUdFX1NJWkU7CitpZiAocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrZXhdWzBdLmtvdW50KQorCW9kZCA9IHRydWU7CitlbHNlCisJb2RkID0gZmFsc2U7CisKK2lmICgodHJ1ZSA9PSBvZGQpICYmIChmYWxzZSA9PSBvZmZlcmZpZWxkcykgJiYoZmFsc2UgPT0gZGVjaW1hdGVwaXhlbCkpIHsKKwlKT1QoOCwgIiAgaW5pdGlhbCBza2lwcGluZyAgICAlNGkgICAgICAgICAgYnl0ZXMgcC4lNGlcbiIsIFwKKwkJCQkJCQl3My9tdWx0aXBsaWVyLCBtYWQpOworCXBhZCArPSAodzMgLyBtdWx0aXBsaWVyKTsgIHJhZCAtPSAodzMgLyBtdWx0aXBsaWVyKTsKK30KK2lzdXkgPSB0cnVlOworbWFzayA9IDA7ICBydW1wID0gMDsgIGNhY2hlcyA9IDA7CisKK2N6ID0gMDsKK3doaWxlIChjeiA8IHd6KSB7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKgorCSoqICBQUk9DRVNTIE9ORSBMSU5FIE9GIEZSQU1FIEFUIEZVTEwgUkVTT0xVVElPTjoKKwkqKiAgUkVBRCAgIHcyICAgQllURVMgRlJPTSBGSUVMRCBCVUZGRVIsCisJKiogIFdSSVRFICB3MyAgIEJZVEVTIFRPIEZSQU1FIEJVRkZFUgorCSoqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGZhbHNlID09IGRlY2ltYXRlcGl4ZWwpIHsKKwkJb3ZlciA9IHcyOworCQlkbyB7CisJCQltdWNoID0gb3ZlcjsgIG1vcmUgPSAwOyAgbWFyZ2luID0gMDsgIG1hc2sgPSAweDAwOworCQkJaWYgKHJleCA8IG11Y2gpCisJCQkJbXVjaCA9IHJleDsKKwkJCXJ1bXAgPSAwOworCisJCQlpZiAobXVjaCAlIDIpIHsKKwkJCQlTQVkoIk1JU1RBS0U6IG11Y2ggaXMgb2RkXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJbW9yZSA9IChieXRlc3BlcnBpeGVsICogXAorCQkJCQltdWNoKSAvIDI7CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisJCQlpZiAoMSA8IGJ5dGVzcGVycGl4ZWwpIHsKKwkJCQlpZiAoKHJhZCAqIFwKKwkJCQkJMikgPCAobXVjaCAqIFwKKwkJCQkJCWJ5dGVzcGVycGl4ZWwpKSB7CisJCQkJCS8qCisJCQkJCSoqICAgSU5KVURJQ0lPVVMgQUxURVJBVElPTiBPRiBUSElTCisJCQkJCSoqICAgQkxPQ0sgV0lMTCBDQVVTRSBCUkVBS0FHRS4KKwkJCQkJKiogICBCRVdBUkUuCisJCQkJCSoqLworCQkJCQlyYWQyID0gcmFkICsgYnl0ZXNwZXJwaXhlbCAtIDE7CisJCQkJCW11Y2ggPSAoKCgoMiAqIFwKKwkJCQkJCXJhZDIpL2J5dGVzcGVycGl4ZWwpLzIpICogMik7CisJCQkJCXJ1bXAgPSAoKGJ5dGVzcGVycGl4ZWwgKiBcCisJCQkJCQkJbXVjaCkgLyAyKSAtIHJhZDsKKwkJCQkJbW9yZSA9IHJhZDsKKwkJCQkJfQorCQkJCW1hc2sgPSAoX191OClydW1wOworCQkJCW1hcmdpbiA9IDA7CisJCQkJaWYgKG11Y2ggPT0gcmV4KSB7CisJCQkJCW1hc2sgfD0gMHgwNDsKKwkJCQkJaWYgKChtZXggKyAxKSA8IEZJRUxEX0JVRkZFUl9TSVpFLyBcCisJCQkJCQkJCVBBR0VfU0laRSkgeworCQkJCQkJbWFyZ2luID0gKigoX191OCAqKShwZWFzeWNhcC0+XAorCQkJCQkJCWZpZWxkX2J1ZmZlclwKKwkJCQkJCQlba2V4XVttZXggKyAxXS5wZ28pKTsKKwkJCQkJfSBlbHNlCisJCQkJCQltYXNrIHw9IDB4MDg7CisJCQkJfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQkJfSBlbHNlIHsKKwkJCQlTQVkoIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIFwKKwkJCQkJCWJ5dGVzcGVycGl4ZWwpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQkJaWYgKHJ1bXApCisJCQkJY2FjaGVzKys7CisKKwkJCXJjID0gcmVkYXViKHBlYXN5Y2FwLCBwYWQsIHBleCwgbXVjaCwgbW9yZSwgXAorCQkJCQkJCW1hc2ssIG1hcmdpbiwgaXN1eSk7CisJCQlpZiAoMCA+IHJjKSB7CisJCQkJU0FZKCJFUlJPUjogcmVkYXViKCkgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWlmIChtdWNoICUgNCkgeworCQkJCWlmIChpc3V5KQorCQkJCQlpc3V5ID0gZmFsc2U7CisJCQkJZWxzZQorCQkJCQlpc3V5ID0gdHJ1ZTsKKwkJCX0KKwkJCW92ZXIgLT0gbXVjaDsgICBjeiArPSBtdWNoOworCQkJcGV4ICArPSBtdWNoOyAgcmV4IC09IG11Y2g7CisJCQlpZiAoIXJleCkgeworCQkJCW1leCsrOworCQkJCXBleCA9IHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba2V4XVttZXhdLnBnbzsKKwkJCQlyZXggPSBQQUdFX1NJWkU7CisJCQl9CisJCQlwYWQgICs9IG1vcmU7CisJCQlyYWQgLT0gbW9yZTsKKwkJCWlmICghcmFkKSB7CisJCQkJbWFkKys7CisJCQkJcGFkID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrYWRdW21hZF0ucGdvOworCQkJCXJhZCA9IFBBR0VfU0laRTsKKwkJCQlpZiAocnVtcCkgeworCQkJCQlwYWQgKz0gcnVtcDsKKwkJCQkJcmFkIC09IHJ1bXA7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChvdmVyKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU0tJUCAgdzMgQllURVMgSU4gVEFSR0VUIEZSQU1FIEJVRkZFUiwKKyAqICBVTkxFU1MgSVQgSVMgVEhFIExBU1QgTElORSBPRiBBTiBPREQgRlJBTUUKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQlpZiAoKChmYWxzZSA9PSBvZGQpIHx8IChjeiAhPSB3eikpJiYoZmFsc2UgPT0gb2ZmZXJmaWVsZHMpKSB7CisJCQlvdmVyID0gdzM7CisJCQlkbyB7CisJCQkJaWYgKCFyYWQpIHsKKwkJCQkJbWFkKys7CisJCQkJCXBhZCA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJcCisJCQkJCQlba2FkXVttYWRdLnBnbzsKKwkJCQkJcmFkID0gUEFHRV9TSVpFOworCQkJCX0KKwkJCQltb3JlID0gb3ZlcjsKKwkJCQlpZiAocmFkIDwgbW9yZSkKKwkJCQkJbW9yZSA9IHJhZDsKKwkJCQlvdmVyIC09IG1vcmU7CisJCQkJcGFkICArPSBtb3JlOworCQkJCXJhZCAgLT0gbW9yZTsKKwkJCX0gd2hpbGUgKG92ZXIpOworCQl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFBST0NFU1MgT05FIExJTkUgT0YgRlJBTUUgQVQgUkVEVUNFRCBSRVNPTFVUSU9OOgorICogIE9OTFkgSUYgZmFsc2U9PW9kZCwKKyAqICBSRUFEICAgdzIgICBCWVRFUyBGUk9NIEZJRUxEIEJVRkZFUiwKKyAqICBXUklURSAgdzMgLyAyICBCWVRFUyBUTyBGUkFNRSBCVUZGRVIKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCX0gZWxzZSBpZiAoZmFsc2UgPT0gb2RkKSB7CisJCW92ZXIgPSB3MjsKKwkJZG8geworCQkJbXVjaCA9IG92ZXI7ICBtb3JlID0gMDsgIG1hcmdpbiA9IDA7ICBtYXNrID0gMHgwMDsKKwkJCWlmIChyZXggPCBtdWNoKQorCQkJCW11Y2ggPSByZXg7CisJCQlydW1wID0gMDsKKworCQkJaWYgKG11Y2ggJSAyKSB7CisJCQkJU0FZKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCW1vcmUgPSAoYnl0ZXNwZXJwaXhlbCAqIFwKKwkJCQkJbXVjaCkgLyA0OworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQkJaWYgKDEgPCBieXRlc3BlcnBpeGVsKSB7CisJCQkJaWYgKChyYWQgKiA0KSA8IChtdWNoICogXAorCQkJCQkJYnl0ZXNwZXJwaXhlbCkpIHsKKwkJCQkJLyoKKwkJCQkJKiogICBJTkpVRElDSU9VUyBBTFRFUkFUSU9OIE9GIFRISVMKKwkJCQkJKiogICBCTE9DSyBXSUxMIENBVVNFIEJSRUFLQUdFLgorCQkJCQkqKiAgIEJFV0FSRS4KKwkJCQkJKiovCisJCQkJCXJhZDIgPSByYWQgKyBieXRlc3BlcnBpeGVsIC0gMTsKKwkJCQkJbXVjaCA9ICgoKCgyICogcmFkMikvYnl0ZXNwZXJwaXhlbCkvMilcCisJCQkJCQkJCQkqIDQpOworCQkJCQlydW1wID0gKChieXRlc3BlcnBpeGVsICogXAorCQkJCQkJCW11Y2gpIC8gNCkgLSByYWQ7CisJCQkJCW1vcmUgPSByYWQ7CisJCQkJCX0KKwkJCQltYXNrID0gKF9fdTgpcnVtcDsKKwkJCQltYXJnaW4gPSAwOworCQkJCWlmIChtdWNoID09IHJleCkgeworCQkJCQltYXNrIHw9IDB4MDQ7CisJCQkJCWlmICgobWV4ICsgMSkgPCBGSUVMRF9CVUZGRVJfU0laRS8gXAorCQkJCQkJCQlQQUdFX1NJWkUpIHsKKwkJCQkJCW1hcmdpbiA9ICooKF9fdTggKikocGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9idWZmZXJcCisJCQkJCQkJW2tleF1bbWV4ICsgMV0ucGdvKSk7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCW1hc2sgfD0gMHgwODsKKwkJCQkJfQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQkJCX0gZWxzZSB7CisJCQkJCVNBWSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgXAorCQkJCQkJYnl0ZXNwZXJwaXhlbCk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKwkJCWlmIChydW1wKQorCQkJCWNhY2hlcysrOworCisJCQlyYyA9IHJlZGF1YihwZWFzeWNhcCwgcGFkLCBwZXgsIG11Y2gsIG1vcmUsIFwKKwkJCQkJCQltYXNrLCBtYXJnaW4sIGlzdXkpOworCQkJaWYgKDAgPiByYykgeworCQkJCVNBWSgiRVJST1I6IHJlZGF1YigpIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlvdmVyIC09IG11Y2g7ICAgY3ogKz0gbXVjaDsKKwkJCXBleCAgKz0gbXVjaDsgIHJleCAtPSBtdWNoOworCQkJaWYgKCFyZXgpIHsKKwkJCQltZXgrKzsKKwkJCQlwZXggPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5wZ287CisJCQkJcmV4ID0gUEFHRV9TSVpFOworCQkJfQorCQkJcGFkICArPSBtb3JlOworCQkJcmFkIC09IG1vcmU7CisJCQlpZiAoIXJhZCkgeworCQkJCW1hZCsrOworCQkJCXBhZCA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba2FkXVttYWRdLnBnbzsKKwkJCQlyYWQgPSBQQUdFX1NJWkU7CisJCQkJaWYgKHJ1bXApIHsKKwkJCQkJcGFkICs9IHJ1bXA7CisJCQkJCXJhZCAtPSBydW1wOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAob3Zlcik7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE9USEVSV0lTRSBKVVNUCisgKiAgUkVBRCAgIHcyICAgQllURVMgRlJPTSBGSUVMRCBCVUZGRVIgQU5EIERJU0NBUkQgVEhFTQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJfSBlbHNlIHsKKwkJb3ZlciA9IHcyOworCQlkbyB7CisJCQlpZiAoIXJleCkgeworCQkJCW1leCsrOworCQkJCXBleCA9IHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba2V4XVttZXhdLnBnbzsKKwkJCQlyZXggPSBQQUdFX1NJWkU7CisJCQl9CisJCQltdWNoID0gb3ZlcjsKKwkJCWlmIChyZXggPCBtdWNoKQorCQkJCW11Y2ggPSByZXg7CisJCQlvdmVyIC09IG11Y2g7CisJCQljeiArPSBtdWNoOworCQkJcGV4ICArPSBtdWNoOworCQkJcmV4IC09IG11Y2g7CisJCX0gd2hpbGUgKG92ZXIpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU0FOSVRZIENIRUNLUworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjMiA9IChtZXggKyAxKSpQQUdFX1NJWkUgLSByZXg7CitpZiAoY3ogIT0gYzIpCisJU0FZKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgcmVhZFxuIiwgYzIgLSBjeik7CitjMyA9IChtYWQgKyAxKSpQQUdFX1NJWkUgLSByYWQ7CisKK2lmIChmYWxzZSA9PSBkZWNpbWF0ZXBpeGVsKSB7CisJaWYgKGJ5dGVzcGVycGl4ZWwgKiBcCisJCWN6ICE9IGMzKSBcCisJCVNBWSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKKwkJCQkJCWMzIC0gKGJ5dGVzcGVycGl4ZWwgKiBcCisJCQkJCQkJCQljeikpOworfSBlbHNlIHsKKwlpZiAoZmFsc2UgPT0gb2RkKSB7CisJCWlmIChieXRlc3BlcnBpeGVsICogXAorCQkJY3ogIT0gKDQgKiBjMykpCisJCQlTQVkoIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSBpbiBieXRlcyB3cml0dGVuXG4iLCBcCisJCQkJCQkoMipjMyktKGJ5dGVzcGVycGl4ZWwgKiBcCisJCQkJCQkJCQljeikpOworCQl9IGVsc2UgeworCQkJaWYgKDAgIT0gYzMpCisJCQkJU0FZKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgIiBcCisJCQkJCQkiaW4gYnl0ZXMgd3JpdHRlblxuIiwgYzMpOworCQl9Cit9CitpZiAocnVtcCkKKwlTQVkoIkVSUk9SOiB1bmRpc2NoYXJnZWQgY2FjaGUgYXQgZW5kIG9mIGxpbmUgaW4gZnJhbWUgYnVmZmVyXG4iKTsKKworSk9UKDgsICI9PT09PSBmaWVsZDJmcmFtZSgpOiAlaSBieXRlcyAtLT4gJWkgYnl0ZXMgKGluY2wgc2tpcClcbiIsIGMyLCBjMyk7CitKT1QoOCwgIj09PT09IGZpZWxkMmZyYW1lKCk6ICVpPW1hZCAgJWk9cmFkXG4iLCBtYWQsIHJhZCk7CisKK2lmICh0cnVlID09IG9kZCkKKwlKT1QoOCwgIisrKysrIGZpZWxkMmZyYW1lKCk6ICBmcmFtZSBidWZmZXIgJWkgaXMgZnVsbFxuIiwga2FkKTsKKworaWYgKHBlYXN5Y2FwLT5maWVsZF9yZWFkID09IHBlYXN5Y2FwLT5maWVsZF9maWxsKQorCVNBWSgiV0FSTklORzogb24gZXhpdCwgZmlsbGluZyBmaWVsZCBidWZmZXIgJWlcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIENBTENVTEFURSBWSURFTyBTVFJFQU1JTkcgUkFURQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWwpOworaWYgKHRpbWV2YWwwLnR2X3NlYykgeworCWJlbG93ID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCisJCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgIC0gdGltZXZhbDAudHZfc2VjKSkgKyBcCisJCQkgKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfdXNlYyAtIHRpbWV2YWwwLnR2X3VzZWMpOworCWFib3ZlID0gKGxvbmcgbG9uZyBpbnQpMTAwMDAwMDsKKworCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKKwlhYm92ZSA9IHNkci5xdW90aWVudDsKKwlyZW1haW5kZXIgPSAoX191MzIpc2RyLnJlbWFpbmRlcjsKKworCUpPVCg4LCAidmlkZW8gc3RyZWFtaW5nIGF0ICUzbGxpLiUwM2kgZmllbGRzIHBlciBzZWNvbmRcbiIsIGFib3ZlLCBcCisJCQkJCQkJKHJlbWFpbmRlci8xMDAwKSk7Cit9Cit0aW1ldmFsMCA9IHRpbWV2YWw7CisKK2lmIChjYWNoZXMpCisJSk9UKDgsICIlaT1jYWNoZXNcbiIsIGNhY2hlcyk7CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdAorc2lnbmVkX2Rpdihsb25nIGxvbmcgaW50IGFib3ZlLCBsb25nIGxvbmcgaW50IGJlbG93KQoreworc3RydWN0IHNpZ25lZF9kaXZfcmVzdWx0IHNkcjsKKworaWYgKCgoMCA8PSBhYm92ZSkgJiYgKDAgPD0gYmVsb3cpKSB8fCAoKDAgID4gYWJvdmUpICYmICgwICA+IGJlbG93KSkpIHsKKwlzZHIucmVtYWluZGVyID0gKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGRvX2RpdihhYm92ZSwgYmVsb3cpOworCXNkci5xdW90aWVudCAgPSAobG9uZyBsb25nIGludCkgYWJvdmU7Cit9IGVsc2UgeworCWlmICgwID4gYWJvdmUpCisJCWFib3ZlID0gLWFib3ZlOworCWlmICgwID4gYmVsb3cpCisJCWJlbG93ID0gLWJlbG93OworCXNkci5yZW1haW5kZXIgPSAodW5zaWduZWQgbG9uZyBsb25nIGludCkgZG9fZGl2KGFib3ZlLCBiZWxvdyk7CisJc2RyLnF1b3RpZW50ICA9IC0oKGxvbmcgbG9uZyBpbnQpIGFib3ZlKTsKK30KK3JldHVybiBzZHI7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIERFQ0lNQVRJT04gQU5EIENPTE9VUlNQQUNFIENPTlZFUlNJT04uCisgKgorICogIFRISVMgUk9VVElORSBSRVFVSVJFUyBUSEFUIEFMTCBUSEUgREFUQSBUTyBCRSBSRUFEIFJFU0lERVMgT04gT05FIFBBR0UKKyAqICBBTkQgVEhBVCBBTEwgVEhFIERBVEEgVE8gQkUgV1JJVFRFTiBSRVNJREVTIE9OIE9ORSAoRElGRkVSRU5UKSBQQUdFLgorICogIFRIRSBDQUxMSU5HIFJPVVRJTkUgTVVTVCBFTlNVUkUgVEhBVCBUSElTIFJFUVVJUkVNRU5UIElTIE1FVCwgQU5EIE1VU1QKKyAqICBBTFNPIEVOU1VSRSBUSEFUIG11Y2ggSVMgRVZFTi4KKyAqCisgKiAgbXVjaCBCWVRFUyBBUkUgUkVBRCwgQVQgTEVBU1QgKGJ5dGVzcGVycGl4ZWwgKiBtdWNoKS8yIEJZVEVTIEFSRSBXUklUVEVOCisgKiAgSUYgVEhFUkUgSVMgTk8gREVDSU1BVElPTiwgSEFMRiBUSElTIEFNT1VOVCBJRiBUSEVSRSBJUyBERUNJTUFUSU9OLgorICoKKyAqICBtYXNrIElTIFpFUk8gV0hFTiBOTyBTUEVDSUFMIEJFSEFWSU9VUiBSRVFVSVJFRC4gT1RIRVJXSVNFIElUIElTIFNFVCBUSFVTOgorICogICAgIDB4MDMgJiBtYXNrID0gIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIGNhY2hlIGluc3RlYWQgb2YgdG8KKyAqICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIKKyAqICAgICAweDA0ICYgbWFzayA9PiB1c2UgYXJndW1lbnQgbWFyZ2luIHRvIHNldCB0aGUgY2hyb21pbmFuY2UgZm9yIGxhc3QgcGl4ZWwKKyAqICAgICAweDA4ICYgbWFzayA9PiBkbyBub3Qgc2V0IHRoZSBjaHJvbWluYW5jZSBmb3IgbGFzdCBwaXhlbAorICoKKyAqICBZVVYgdG8gUkdCIENPTlZFUlNJT04gSVMgKE9SIFNIT1VMRCBCRSkgSVRVLVIgQlQgNjAxLgorICoKKyAqICBUSEVSRSBJUyBBIExPVCBPRiBDT0RFIFJFUEVUSVRJT04gSU4gVEhJUyBST1VUSU5FIElOIE9SREVSIFRPIEFWT0lECisgKiAgSU5FRkZJQ0lFTlQgU1dJVENISU5HIElOU0lERSBJTk5FUiBMT09QUy4gIFJFQVJSQU5HSU5HIFRIRSBMT0dJQyBUTworICogIFJFRFVDRSBDT0RFIExFTkdUSCBXSUxMIEdFTkVSQUxMWSBJTVBBSVIgUlVOVElNRSBQRVJGT1JNQU5DRS4gIEJFV0FSRS4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CityZWRhdWIoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCB2b2lkICpwYWQsIHZvaWQgKnBleCwgaW50IG11Y2gsIGludCBtb3JlLCBcCisJCQkJCV9fdTggbWFzaywgX191OCBtYXJnaW4sIGJvb2wgaXN1eSkKK3sKK3N0YXRpYyBfX3MzMiBheVsyNTZdLCBidVsyNTZdLCBydlsyNTZdLCBndVsyNTZdLCBndlsyNTZdOworc3RhdGljIF9fdTggY2FjaGVbOF0sICpwY2FjaGU7CitfX3U4IHIsIGcsIGIsIHksIHUsIHYsIGMsICpwMiwgKnAzLCAqcHosICpwcjsKK2ludCAgYnl0ZXNwZXJwaXhlbDsKK2Jvb2wgYnl0ZXN3YXBvcmRlciwgZGVjaW1hdGVwaXhlbCwgbGFzdDsKK2ludCBqLCBydW1wOworX19zMzIgczMyOworCitpZiAobXVjaCAlIDIpIHsKKwlTQVkoIk1JU1RBS0U6IG11Y2ggaXMgb2RkXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2J5dGVzcGVycGl4ZWwgPSBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbDsKK2J5dGVzd2Fwb3JkZXIgPSBwZWFzeWNhcC0+Ynl0ZXN3YXBvcmRlcjsKK2RlY2ltYXRlcGl4ZWwgPSBwZWFzeWNhcC0+ZGVjaW1hdGVwaXhlbDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKCFidVsyNTVdKSB7CisJZm9yIChqID0gMDsgaiA8IDExMjsgaisrKSB7CisJCXMzMiA9ICgweEZGMDAgJiAoNDUzICogaikpID4+IDg7CisJCWJ1W2ogKyAxMjhdID0gIHMzMjsgYnVbMTI3IC0gal0gPSAtczMyOworCQlzMzIgPSAoMHhGRjAwICYgKDM1OSAqIGopKSA+PiA4OworCQlydltqICsgMTI4XSA9ICBzMzI7IHJ2WzEyNyAtIGpdID0gLXMzMjsKKwkJczMyID0gKDB4RkYwMCAmICg4OCAqIGopKSA+PiA4OworCQlndVtqICsgMTI4XSA9ICBzMzI7IGd1WzEyNyAtIGpdID0gLXMzMjsKKwkJczMyID0gKDB4RkYwMCAmICgxODMgKiBqKSkgPj4gODsKKwkJZ3ZbaiArIDEyOF0gPSAgczMyOyBndlsxMjcgLSBqXSA9IC1zMzI7CisJfQorCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCWJ1W2pdID0gYnVbMTZdOyBydltqXSA9IHJ2WzE2XTsKKwkJZ3Vbal0gPSBndVsxNl07IGd2W2pdID0gZ3ZbMTZdOworCX0KKwlmb3IgKGogPSAyNDA7IGogPCAyNTY7IGorKykgeworCQlidVtqXSA9IGJ1WzIzOV07IHJ2W2pdID0gcnZbMjM5XTsKKwkJZ3Vbal0gPSBndVsyMzldOyBndltqXSA9IGd2WzIzOV07CisJfQorCWZvciAoaiA9ICAxNjsgaiA8IDIzNjsgaisrKQorCQlheVtqXSA9IGo7CisJZm9yIChqID0gICAwOyBqIDwgIDE2OyBqKyspCisJCWF5W2pdID0gYXlbMTZdOworCWZvciAoaiA9IDIzNjsgaiA8IDI1NjsgaisrKQorCQlheVtqXSA9IGF5WzIzNV07CisJSk9UKDgsICJsb29rdXAgdGFibGVzIGFyZSBwcmVwYXJlZFxuIik7Cit9CitpZiAoKF9fdTggKilOVUxMID09IHBjYWNoZSkKKwlwY2FjaGUgPSAmY2FjaGVbMF07CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRSQU5TRkVSIENPTlRFTlRTIE9GIENBQ0hFIFRPIFRIRSBGUkFNRSBCVUZGRVIKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKCFwY2FjaGUpIHsKKwlTQVkoIk1JU1RBS0U6IHBjYWNoZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworaWYgKHBjYWNoZSAhPSAmY2FjaGVbMF0pCisJSk9UKDE2LCAiY2FjaGUgaGFzICVpIGJ5dGVzXG4iLCAoaW50KShwY2FjaGUgLSAmY2FjaGVbMF0pKTsKK3AyID0gJmNhY2hlWzBdOworcDMgPSAoX191OCAqKXBhZCAtIChpbnQpKHBjYWNoZSAtICZjYWNoZVswXSk7Cit3aGlsZSAocDIgPCBwY2FjaGUpIHsKKwkqcDMrKyA9ICpwMjsgIHAyKys7Cit9CitwY2FjaGUgPSAmY2FjaGVbMF07CitpZiAocDMgIT0gcGFkKSB7CisJU0FZKCJNSVNUQUtFOiBwb2ludGVyIG1pc2FsaWdubWVudFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitydW1wID0gKGludCkoMHgwMyAmIG1hc2spOwordSA9IDA7IHYgPSAwOworcDIgPSAoX191OCAqKXBleDsgIHB6ID0gcDIgKyBtdWNoOyAgcHIgPSBwMyArIG1vcmU7ICBsYXN0ID0gZmFsc2U7CitwMisrOworCitpZiAodHJ1ZSA9PSBpc3V5KQorCXUgPSAqKHAyIC0gMSk7CitlbHNlCisJdiA9ICoocDIgLSAxKTsKKworaWYgKHJ1bXApCisJSk9UKDE2LCAiJTRpPW11Y2ggICU0aT1tb3JlICAlaT1ydW1wXG4iLCBtdWNoLCBtb3JlLCBydW1wKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3dpdGNoIChieXRlc3BlcnBpeGVsKSB7CitjYXNlIDI6IHsKKwlpZiAoZmFsc2UgPT0gZGVjaW1hdGVwaXhlbCkgeworCQltZW1jcHkocGFkLCBwZXgsIChzaXplX3QpbXVjaCk7CisJCWlmIChmYWxzZSA9PSBieXRlc3dhcG9yZGVyKQorCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBVWVZZCisJCQkqLworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJcmV0dXJuIDA7CisJCWVsc2UgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBZVVlWCisJCQkqLworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJcDMgPSAoX191OCAqKXBhZDsgIHB6ID0gcDMgKyBtdWNoOworCQkJd2hpbGUgIChweiA+IHAzKSB7CisJCQkJYyA9ICpwMzsKKwkJCQkqcDMgPSAqKHAzICsgMSk7CisJCQkJKihwMyArIDEpID0gYzsKKwkJCQlwMyArPSAyOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZmFsc2UgPT0gYnl0ZXN3YXBvcmRlcikgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBVWVZZIERFQ0lNQVRFRAorCQkJKi8KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCXAyID0gKF9fdTggKilwZXg7ICBwMyA9IChfX3U4ICopcGFkOyAgcHogPSBwMiArIG11Y2g7CisJCQl3aGlsZSAocHogPiBwMikgeworCQkJCSpwMyA9ICpwMjsKKwkJCQkqKHAzICsgMSkgPSAqKHAyICsgMSk7CisJCQkJKihwMyArIDIpID0gKihwMiArIDIpOworCQkJCSoocDMgKyAzKSA9ICoocDIgKyAzKTsKKwkJCQlwMyArPSA0OyAgcDIgKz0gODsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBZVVlWIERFQ0lNQVRFRAorCQkJKiovCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQlwMiA9IChfX3U4ICopcGV4OyAgcDMgPSAoX191OCAqKXBhZDsgIHB6ID0gcDIgKyBtdWNoOworCQkJd2hpbGUgKHB6ID4gcDIpIHsKKwkJCQkqcDMgPSAqKHAyICsgMSk7CisJCQkJKihwMyArIDEpID0gKnAyOworCQkJCSoocDMgKyAyKSA9ICoocDIgKyAzKTsKKwkJCQkqKHAzICsgMykgPSAqKHAyICsgMik7CisJCQkJcDMgKz0gNDsgIHAyICs9IDg7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlicmVhazsKKwl9CitjYXNlIDM6CisJeworCWlmIChmYWxzZSA9PSBkZWNpbWF0ZXBpeGVsKSB7CisJCWlmIChmYWxzZSA9PSBieXRlc3dhcG9yZGVyKSB7CisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkvKgorCQkJKiogIFJHQgorCQkJKiovCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQl3aGlsZSAocHogPiBwMikgeworCQkJCWlmIChwciA8PSAocDMgKyBieXRlc3BlcnBpeGVsKSkKKwkJCQkJbGFzdCA9IHRydWU7CisJCQkJZWxzZQorCQkJCQlsYXN0ID0gZmFsc2U7CisJCQkJeSA9ICpwMjsKKwkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgKDB4MEMgJiBtYXNrKSkgeworCQkJCQlpZiAoMHgwNCAmIG1hc2spIHsKKwkJCQkJCWlmICh0cnVlID09IGlzdXkpCisJCQkJCQkJdiA9IG1hcmdpbjsKKwkJCQkJCWVsc2UKKwkJCQkJCQl1ID0gbWFyZ2luOworCQkJCQl9IGVsc2UKKwkJCQkJCWlmICgweDA4ICYgbWFzaykKKwkJCQkJCQk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJCXYgPSAqKHAyICsgMSk7CisJCQkJCWVsc2UKKwkJCQkJCXUgPSAqKHAyICsgMSk7CisJCQkJfQorCisJCQkJczMyID0gYXlbKGludCl5XSArIHJ2WyhpbnQpdl07CisJCQkJciA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQlzMzIgPSBheVsoaW50KXldIC0gZ3VbKGludCl1XSAtIGd2WyhpbnQpdl07CisJCQkJZyA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQlzMzIgPSBheVsoaW50KXldICsgYnVbKGludCl1XTsKKwkJCQliID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCTAgOiAoX191OClzMzIpOworCisJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKKwkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQlzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwgLSBydW1wKSB7CisJCQkJCWNhc2UgMTogeworCQkJCQkJKnAzID0gcjsKKwkJCQkJCSpwY2FjaGUrKyA9IGc7CisJCQkJCQkqcGNhY2hlKysgPSBiOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAyOiB7CisJCQkJCQkqcDMgPSByOworCQkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJCSpwY2FjaGUrKyA9IGI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OiB7CisJCQkJCQlTQVkoIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKKwkJCQkJCQlieXRlc3BlcnBpeGVsIC0gcnVtcCk7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJKnAzID0gcjsKKwkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJKihwMyArIDIpID0gYjsKKwkJCQl9CisJCQkJcDIgKz0gMjsKKwkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQlpc3V5ID0gZmFsc2U7CisJCQkJZWxzZQorCQkJCQlpc3V5ID0gdHJ1ZTsKKwkJCQlwMyArPSBieXRlc3BlcnBpeGVsOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkvKgorCQkJKiogIEJHUgorCQkJKi8KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCXdoaWxlIChweiA+IHAyKSB7CisJCQkJaWYgKHByIDw9IChwMyArIGJ5dGVzcGVycGl4ZWwpKQorCQkJCQlsYXN0ID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWxhc3QgPSBmYWxzZTsKKwkJCQl5ID0gKnAyOworCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiAoMHgwQyAmIG1hc2spKSB7CisJCQkJCWlmICgweDA0ICYgbWFzaykgeworCQkJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJCQl2ID0gbWFyZ2luOworCQkJCQkJZWxzZQorCQkJCQkJCXUgPSBtYXJnaW47CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCWlmICgweDA4ICYgbWFzaykKKwkJCQkJCTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJdiA9ICoocDIgKyAxKTsKKwkJCQkJZWxzZQorCQkJCQkJdSA9ICoocDIgKyAxKTsKKwkJCQl9CisKKwkJCQlzMzIgPSBheVsoaW50KXldICsgcnZbKGludCl2XTsKKwkJCQlyID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQlzMzIgPSBheVsoaW50KXldIC0gZ3VbKGludCl1XSAtIGd2WyhpbnQpdl07CisJCQkJZyA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisJCQkJczMyID0gYXlbKGludCl5XSArIGJ1WyhpbnQpdV07CisJCQkJYiA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisKKwkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgeworCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKKwkJCQkJY2FzZSAxOiB7CisJCQkJCQkqcDMgPSBiOworCQkJCQkJKnBjYWNoZSsrID0gZzsKKwkJCQkJCSpwY2FjaGUrKyA9IHI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIDI6IHsKKwkJCQkJCSpwMyA9IGI7CisJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJKnBjYWNoZSsrID0gcjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkqcDMgPSBiOworCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkqKHAzICsgMikgPSByOworCQkJCQl9CisJCQkJcDIgKz0gMjsKKwkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQlpc3V5ID0gZmFsc2U7CisJCQkJZWxzZQorCQkJCQlpc3V5ID0gdHJ1ZTsKKwkJCQlwMyArPSBieXRlc3BlcnBpeGVsOworCQkJCX0KKwkJCX0KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGZhbHNlID09IGJ5dGVzd2Fwb3JkZXIpIHsKKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCS8qCisJCQkqKiAgUkdCIERFQ0lNQVRFRAorCQkJKi8KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCXdoaWxlIChweiA+IHAyKSB7CisJCQkJaWYgKHByIDw9IChwMyArIGJ5dGVzcGVycGl4ZWwpKQorCQkJCQlsYXN0ID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWxhc3QgPSBmYWxzZTsKKwkJCQl5ID0gKnAyOworCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiAoMHgwQyAmIG1hc2spKSB7CisJCQkJCWlmICgweDA0ICYgbWFzaykgeworCQkJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJCQl2ID0gbWFyZ2luOworCQkJCQkJZWxzZQorCQkJCQkJCXUgPSBtYXJnaW47CisJCQkJCX0gZWxzZQorCQkJCQkJaWYgKDB4MDggJiBtYXNrKQorCQkJCQkJCTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJdiA9ICoocDIgKyAxKTsKKwkJCQkJZWxzZQorCQkJCQkJdSA9ICoocDIgKyAxKTsKKwkJCQl9CisKKwkJCQlpZiAodHJ1ZSA9PSBpc3V5KSB7CisJCQkJCXMzMiA9IGF5WyhpbnQpeV0gKyBydlsoaW50KXZdOworCQkJCQlyID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQkJczMyID0gYXlbKGludCl5XSAtIGd1WyhpbnQpdV0gLSBcCisJCQkJCQkJCWd2WyhpbnQpdl07CisJCQkJCWcgPSAoMjU1IDwgczMyKSA/IDI1NSA6ICgoMCA+IHMzMikgPyBcCisJCQkJCQkJCTAgOiAoX191OClzMzIpOworCQkJCQlzMzIgPSBheVsoaW50KXldICsgYnVbKGludCl1XTsKKwkJCQkJYiA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisKKwkJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKKwkJCQkJCXBjYWNoZSA9ICZjYWNoZVswXTsKKwkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKKwkJCQkJCWNhc2UgMTogeworCQkJCQkJCSpwMyA9IHI7CisJCQkJCQkJKnBjYWNoZSsrID0gZzsKKwkJCQkJCQkqcGNhY2hlKysgPSBiOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJY2FzZSAyOiB7CisJCQkJCQkJKnAzID0gcjsKKwkJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJCSpwY2FjaGUrKyA9IGI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlkZWZhdWx0OiB7CisJCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQkiJWk9cnVtcFxuIiwgXAorCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSpwMyA9IHI7CisJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJKihwMyArIDIpID0gYjsKKwkJCQkJfQorCQkJCQlpc3V5ID0gZmFsc2U7CisJCQkJCXAzICs9IGJ5dGVzcGVycGl4ZWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaXN1eSA9IHRydWU7CisJCQkJfQorCQkJCXAyICs9IDI7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCS8qCisJCQkgKiAgQkdSIERFQ0lNQVRFRAorCQkJICovCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQl3aGlsZSAocHogPiBwMikgeworCQkJCWlmIChwciA8PSAocDMgKyBieXRlc3BlcnBpeGVsKSkKKwkJCQkJbGFzdCA9IHRydWU7CisJCQkJZWxzZQorCQkJCQlsYXN0ID0gZmFsc2U7CisJCQkJeSA9ICpwMjsKKwkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgKDB4MEMgJiBtYXNrKSkgeworCQkJCQlpZiAoMHgwNCAmIG1hc2spIHsKKwkJCQkJCWlmICh0cnVlID09IGlzdXkpCisJCQkJCQkJdiA9IG1hcmdpbjsKKwkJCQkJCWVsc2UKKwkJCQkJCQl1ID0gbWFyZ2luOworCQkJCQl9IGVsc2UKKwkJCQkJCWlmICgweDA4ICYgbWFzaykKKwkJCQkJCQk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJCXYgPSAqKHAyICsgMSk7CisJCQkJCWVsc2UKKwkJCQkJCXUgPSAqKHAyICsgMSk7CisJCQkJfQorCisJCQkJaWYgKHRydWUgPT0gaXN1eSkgeworCisJCQkJCXMzMiA9IGF5WyhpbnQpeV0gKyBydlsoaW50KXZdOworCQkJCQlyID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQkJczMyID0gYXlbKGludCl5XSAtIGd1WyhpbnQpdV0gLSBcCisJCQkJCQkJCWd2WyhpbnQpdl07CisJCQkJCWcgPSAoMjU1IDwgczMyKSA/IDI1NSA6ICgoMCA+IHMzMikgPyBcCisJCQkJCQkJCTAgOiAoX191OClzMzIpOworCQkJCQlzMzIgPSBheVsoaW50KXldICsgYnVbKGludCl1XTsKKwkJCQkJYiA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisKKwkJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKKwkJCQkJCXBjYWNoZSA9ICZjYWNoZVswXTsKKwkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKKwkJCQkJCWNhc2UgMTogeworCQkJCQkJCSpwMyA9IGI7CisJCQkJCQkJKnBjYWNoZSsrID0gZzsKKwkJCQkJCQkqcGNhY2hlKysgPSByOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJY2FzZSAyOiB7CisJCQkJCQkJKnAzID0gYjsKKwkJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJCSpwY2FjaGUrKyA9IHI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlkZWZhdWx0OiB7CisJCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQkiJWk9cnVtcFxuIiwgXAorCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSpwMyA9IGI7CisJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJKihwMyArIDIpID0gcjsKKwkJCQkJCX0KKwkJCQkJaXN1eSA9IGZhbHNlOworCQkJCQlwMyArPSBieXRlc3BlcnBpeGVsOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQlpc3V5ID0gdHJ1ZTsKKwkJCQlwMiArPSAyOworCQkJCX0KKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJYnJlYWs7CisJfQorY2FzZSA0OgorCXsKKwlpZiAoZmFsc2UgPT0gZGVjaW1hdGVwaXhlbCkgeworCQlpZiAoZmFsc2UgPT0gYnl0ZXN3YXBvcmRlcikgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBSR0JBCisJCQkqLworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJd2hpbGUgKHB6ID4gcDIpIHsKKwkJCQlpZiAocHIgPD0gKHAzICsgYnl0ZXNwZXJwaXhlbCkpCisJCQkJCWxhc3QgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJbGFzdCA9IGZhbHNlOworCQkJCXkgPSAqcDI7CisJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmICgweDBDICYgbWFzaykpIHsKKwkJCQkJaWYgKDB4MDQgJiBtYXNrKSB7CisJCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJCXYgPSBtYXJnaW47CisJCQkJCQllbHNlCisJCQkJCQkJdSA9IG1hcmdpbjsKKwkJCQkJfSBlbHNlCisJCQkJCQkgaWYgKDB4MDggJiBtYXNrKQorCQkJCQkJCTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJdiA9ICoocDIgKyAxKTsKKwkJCQkJZWxzZQorCQkJCQkJdSA9ICoocDIgKyAxKTsKKwkJCQl9CisKKwkJCQlzMzIgPSBheVsoaW50KXldICsgcnZbKGludCl2XTsKKwkJCQlyID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQlzMzIgPSBheVsoaW50KXldIC0gZ3VbKGludCl1XSAtIGd2WyhpbnQpdl07CisJCQkJZyA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisJCQkJczMyID0gYXlbKGludCl5XSArIGJ1WyhpbnQpdV07CisJCQkJYiA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisKKwkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgeworCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKKwkJCQkJY2FzZSAxOiB7CisJCQkJCQkqcDMgPSByOworCQkJCQkJKnBjYWNoZSsrID0gZzsKKwkJCQkJCSpwY2FjaGUrKyA9IGI7CisJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAyOiB7CisJCQkJCQkqcDMgPSByOworCQkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJCSpwY2FjaGUrKyA9IGI7CisJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAzOiB7CisJCQkJCQkqcDMgPSByOworCQkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJCSoocDMgKyAyKSA9IGI7CisJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJU0FZKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCisJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCSpwMyA9IHI7CisJCQkJCSoocDMgKyAxKSA9IGc7CisJCQkJCSoocDMgKyAyKSA9IGI7CisJCQkJCSoocDMgKyAzKSA9IDA7CisJCQkJfQorCQkJCXAyICs9IDI7CisJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJaXN1eSA9IGZhbHNlOworCQkJCWVsc2UKKwkJCQkJaXN1eSA9IHRydWU7CisJCQkJcDMgKz0gYnl0ZXNwZXJwaXhlbDsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBCR1JBCisJCQkqLworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJd2hpbGUgKHB6ID4gcDIpIHsKKwkJCQlpZiAocHIgPD0gKHAzICsgYnl0ZXNwZXJwaXhlbCkpCisJCQkJCWxhc3QgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJbGFzdCA9IGZhbHNlOworCQkJCXkgPSAqcDI7CisJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmICgweDBDICYgbWFzaykpIHsKKwkJCQkJaWYgKDB4MDQgJiBtYXNrKSB7CisJCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJCXYgPSBtYXJnaW47CisJCQkJCQllbHNlCisJCQkJCQkJdSA9IG1hcmdpbjsKKwkJCQkJfSBlbHNlCisJCQkJCQkgaWYgKDB4MDggJiBtYXNrKQorCQkJCQkJCTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJdiA9ICoocDIgKyAxKTsKKwkJCQkJZWxzZQorCQkJCQkJdSA9ICoocDIgKyAxKTsKKwkJCQl9CisKKwkJCQlzMzIgPSBheVsoaW50KXldICsgcnZbKGludCl2XTsKKwkJCQlyID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQlzMzIgPSBheVsoaW50KXldIC0gZ3VbKGludCl1XSAtIGd2WyhpbnQpdl07CisJCQkJZyA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisJCQkJczMyID0gYXlbKGludCl5XSArIGJ1WyhpbnQpdV07CisJCQkJYiA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisKKwkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgeworCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKKwkJCQkJY2FzZSAxOiB7CisJCQkJCQkqcDMgPSBiOworCQkJCQkJKnBjYWNoZSsrID0gZzsKKwkJCQkJCSpwY2FjaGUrKyA9IHI7CisJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAyOiB7CisJCQkJCQkqcDMgPSBiOworCQkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJCSpwY2FjaGUrKyA9IHI7CisJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAzOiB7CisJCQkJCQkqcDMgPSBiOworCQkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJCSoocDMgKyAyKSA9IHI7CisJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDogeworCQkJCQkJU0FZKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCisJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCSpwMyA9IGI7CisJCQkJCSoocDMgKyAxKSA9IGc7CisJCQkJCSoocDMgKyAyKSA9IHI7CisJCQkJCSoocDMgKyAzKSA9IDA7CisJCQkJfQorCQkJCXAyICs9IDI7CisJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJaXN1eSA9IGZhbHNlOworCQkJCWVsc2UKKwkJCQkJaXN1eSA9IHRydWU7CisJCQkJcDMgKz0gYnl0ZXNwZXJwaXhlbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoZmFsc2UgPT0gYnl0ZXN3YXBvcmRlcikgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBSR0JBIERFQ0lNQVRFRAorCQkJKi8KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCXdoaWxlIChweiA+IHAyKSB7CisJCQkJaWYgKHByIDw9IChwMyArIGJ5dGVzcGVycGl4ZWwpKQorCQkJCQlsYXN0ID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWxhc3QgPSBmYWxzZTsKKwkJCQl5ID0gKnAyOworCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiAoMHgwQyAmIG1hc2spKSB7CisJCQkJCWlmICgweDA0ICYgbWFzaykgeworCQkJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJCQl2ID0gbWFyZ2luOworCQkJCQkJZWxzZQorCQkJCQkJCXUgPSBtYXJnaW47CisJCQkJCX0gZWxzZQorCQkJCQkJaWYgKDB4MDggJiBtYXNrKQorCQkJCQkJCTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJdiA9ICoocDIgKyAxKTsKKwkJCQkJZWxzZQorCQkJCQkJdSA9ICoocDIgKyAxKTsKKwkJCQl9CisKKwkJCQlpZiAodHJ1ZSA9PSBpc3V5KSB7CisKKwkJCQkJczMyID0gYXlbKGludCl5XSArIHJ2WyhpbnQpdl07CisJCQkJCXIgPSAoMjU1IDwgczMyKSA/IDI1NSA6ICgoMCA+IHMzMikgPyBcCisJCQkJCQkJCTAgOiAoX191OClzMzIpOworCQkJCQlzMzIgPSBheVsoaW50KXldIC0gZ3VbKGludCl1XSAtIFwKKwkJCQkJCQkJZ3ZbKGludCl2XTsKKwkJCQkJZyA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisJCQkJCXMzMiA9IGF5WyhpbnQpeV0gKyBidVsoaW50KXVdOworCQkJCQliID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKworCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgeworCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgeworCQkJCQkJY2FzZSAxOiB7CisJCQkJCQkJKnAzID0gcjsKKwkJCQkJCQkqcGNhY2hlKysgPSBnOworCQkJCQkJCSpwY2FjaGUrKyA9IGI7CisJCQkJCQkJKnBjYWNoZSsrID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWNhc2UgMjogeworCQkJCQkJCSpwMyA9IHI7CisJCQkJCQkJKihwMyArIDEpID0gZzsKKwkJCQkJCQkqcGNhY2hlKysgPSBiOworCQkJCQkJCSpwY2FjaGUrKyA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQljYXNlIDM6IHsKKwkJCQkJCQkqcDMgPSByOworCQkJCQkJCSoocDMgKyAxKSA9IGc7CisJCQkJCQkJKihwMyArIDIpID0gYjsKKwkJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZGVmYXVsdDogeworCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJIiVpPXJ1bXBcbiIsIFwKKwkJCQkJCQlieXRlc3BlcnBpeGVsIC0gXAorCQkJCQkJCXJ1bXApOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSpwMyA9IHI7CisJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJKihwMyArIDIpID0gYjsKKwkJCQkJCSoocDMgKyAzKSA9IDA7CisJCQkJCQl9CisJCQkJCWlzdXkgPSBmYWxzZTsKKwkJCQkJcDMgKz0gYnl0ZXNwZXJwaXhlbDsKKwkJCQl9IGVsc2UKKwkJCQkJaXN1eSA9IHRydWU7CisJCQkJcDIgKz0gMjsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyoKKwkJCSoqICBCR1JBIERFQ0lNQVRFRAorCQkJKi8KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCXdoaWxlIChweiA+IHAyKSB7CisJCQkJaWYgKHByIDw9IChwMyArIGJ5dGVzcGVycGl4ZWwpKQorCQkJCQlsYXN0ID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWxhc3QgPSBmYWxzZTsKKwkJCQl5ID0gKnAyOworCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiAoMHgwQyAmIG1hc2spKSB7CisJCQkJCWlmICgweDA0ICYgbWFzaykgeworCQkJCQkJaWYgKHRydWUgPT0gaXN1eSkKKwkJCQkJCQl2ID0gbWFyZ2luOworCQkJCQkJZWxzZQorCQkJCQkJCXUgPSBtYXJnaW47CisJCQkJCX0gZWxzZQorCQkJCQkJaWYgKDB4MDggJiBtYXNrKQorCQkJCQkJCTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodHJ1ZSA9PSBpc3V5KQorCQkJCQkJdiA9ICoocDIgKyAxKTsKKwkJCQkJZWxzZQorCQkJCQkJdSA9ICoocDIgKyAxKTsKKwkJCQl9CisKKwkJCQlpZiAodHJ1ZSA9PSBpc3V5KSB7CisJCQkJCXMzMiA9IGF5WyhpbnQpeV0gKyBydlsoaW50KXZdOworCQkJCQlyID0gKDI1NSA8IHMzMikgPyAyNTUgOiAoKDAgPiBzMzIpID8gXAorCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKKwkJCQkJczMyID0gYXlbKGludCl5XSAtIGd1WyhpbnQpdV0gLSBcCisJCQkJCQkJCWd2WyhpbnQpdl07CisJCQkJCWcgPSAoMjU1IDwgczMyKSA/IDI1NSA6ICgoMCA+IHMzMikgPyBcCisJCQkJCQkJCTAgOiAoX191OClzMzIpOworCQkJCQlzMzIgPSBheVsoaW50KXldICsgYnVbKGludCl1XTsKKwkJCQkJYiA9ICgyNTUgPCBzMzIpID8gMjU1IDogKCgwID4gczMyKSA/IFwKKwkJCQkJCQkJMCA6IChfX3U4KXMzMik7CisKKwkJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKKwkJCQkJCXBjYWNoZSA9ICZjYWNoZVswXTsKKwkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKKwkJCQkJCWNhc2UgMTogeworCQkJCQkJCSpwMyA9IGI7CisJCQkJCQkJKnBjYWNoZSsrID0gZzsKKwkJCQkJCQkqcGNhY2hlKysgPSByOworCQkJCQkJCSpwY2FjaGUrKyA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQljYXNlIDI6IHsKKwkJCQkJCQkqcDMgPSBiOworCQkJCQkJCSoocDMgKyAxKSA9IGc7CisJCQkJCQkJKnBjYWNoZSsrID0gcjsKKwkJCQkJCQkqcGNhY2hlKysgPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJY2FzZSAzOiB7CisJCQkJCQkJKnAzID0gYjsKKwkJCQkJCQkqKHAzICsgMSkgPSBnOworCQkJCQkJCSoocDMgKyAyKSA9IHI7CisJCQkJCQkJKnBjYWNoZSsrID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCQlTQVkoIk1JU1RBS0U6ICIgXAorCQkJCQkJCSIlaT1ydW1wXG4iLCBcCisJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJKnAzID0gYjsKKwkJCQkJCSoocDMgKyAxKSA9IGc7CisJCQkJCQkqKHAzICsgMikgPSByOworCQkJCQkJKihwMyArIDMpID0gMDsKKwkJCQkJfQorCQkJCQlpc3V5ID0gZmFsc2U7CisJCQkJCXAzICs9IGJ5dGVzcGVycGl4ZWw7CisJCQkJfSBlbHNlCisJCQkJCWlzdXkgPSB0cnVlOworCQkJCQlwMiArPSAyOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWJyZWFrOworCX0KK2RlZmF1bHQ6IHsKKwlTQVkoIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIGJ5dGVzcGVycGl4ZWwpOworCXJldHVybiAtRUZBVUxUOworCX0KK30KK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZGVicmllZihzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCit7CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCAhPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwljaGVja19zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKwljaGVja19zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKwlzYXlyZWFkb25seShwZWFzeWNhcCk7CisJU0FZKCIlaT1wZWFzeWNhcC0+ZmllbGRfZmlsbFxuIiwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwpOworCVNBWSgiJWk9cGVhc3ljYXAtPmZpZWxkX3JlYWRcbiIsIHBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKKwlTQVkoIiVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CisJU0FZKCIlaT1wZWFzeWNhcC0+ZnJhbWVfcmVhZFxuIiwgcGVhc3ljYXAtPmZyYW1lX3JlYWQpOworfQorcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorc2F5cmVhZG9ubHkoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworc3RhdGljIGludCBkb25lOworaW50IGdvdDAwLCBnb3QxRiwgZ290NjAsIGdvdDYxLCBnb3Q2MjsKKworaWYgKCghZG9uZSkgJiYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkgeworCWRvbmUgPSAxOworCWdvdDAwID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDAwKTsKKwlnb3QxRiA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgxRik7CisJZ290NjAgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4NjApOworCWdvdDYxID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDYxKTsKKwlnb3Q2MiA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHg2Mik7CisJU0FZKCIweCUwMlg9cmVnMHgwMCAgMHglMDJYPXJlZzB4MUZcbiIsIGdvdDAwLCBnb3QxRik7CisJU0FZKCIweCUwMlg9cmVnMHg2MCAgMHglMDJYPXJlZzB4NjEgIDB4JTAyWD1yZWcweDYyXG4iLCBcCisJCQkJCQkJZ290NjAsIGdvdDYxLCBnb3Q2Mik7Cit9CityZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFNFRSBDT1JCRVQgRVQgQUwuICJMSU5VWCBERVZJQ0UgRFJJVkVSUyIsIDNyZCBFRElUSU9OLCBQQUdFUyA0MzAtNDM0CisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBlYXN5Y2FwX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqcHZtYSkKK3sKKworSk9UKDgsICJcbiIpOworCitwdm1hLT52bV9vcHMgPSAmZWFzeWNhcF92bV9vcHM7Citwdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKK2lmIChOVUxMICE9IGZpbGUpCisJcHZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworZWFzeWNhcF92bWFfb3Blbihwdm1hKTsKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZWFzeWNhcF92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnB2bWEpCit7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CisKK3BlYXN5Y2FwID0gcHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworaWYgKE5VTEwgIT0gcGVhc3ljYXApCisJcGVhc3ljYXAtPnZtYV9tYW55Kys7CisKK0pPVCg4LCAiJWk9cGVhc3ljYXAtPnZtYV9tYW55XG4iLCBwZWFzeWNhcC0+dm1hX21hbnkpOworCityZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlYXN5Y2FwX3ZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnB2bWEpCit7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CisKK3BlYXN5Y2FwID0gcHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworaWYgKE5VTEwgIT0gcGVhc3ljYXApIHsKKwlwZWFzeWNhcC0+dm1hX21hbnktLTsKKwlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52bWFfbWFueVxuIiwgcGVhc3ljYXAtPnZtYV9tYW55KTsKK30KK3JldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorZWFzeWNhcF92bWFfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpwdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnB2bWYpCit7CitpbnQgaywgbSwgcmV0Y29kZTsKK3ZvaWQgKnBidWY7CitzdHJ1Y3QgcGFnZSAqcGFnZTsKK3N0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKKworcmV0Y29kZSA9IFZNX0ZBVUxUX05PUEFHRTsKK3BidWYgPSAodm9pZCAqKU5VTEw7CitwYWdlID0gKHN0cnVjdCBwYWdlICopTlVMTDsKKworaWYgKE5VTEwgPT0gcHZtYSkgeworCVNBWSgicHZtYSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gcmV0Y29kZTsKK30KK2lmIChOVUxMID09IHB2bWYpIHsKKwlTQVkoInB2bWYgaXMgTlVMTFxuIik7CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK2sgPSAocHZtZi0+cGdvZmYpIC8gKEZSQU1FX0JVRkZFUl9TSVpFL1BBR0VfU0laRSk7CittID0gKHB2bWYtPnBnb2ZmKSAlIChGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkUpOworCitpZiAoIW0pCisJSk9UKDQsICIlNGk9aywgJTRpPW1cbiIsIGssIG0pOworZWxzZQorCUpPVCgxNiwgIiU0aT1rLCAlNGk9bVxuIiwgaywgbSk7CisKK2lmICgoMCA+IGspIHx8IChGUkFNRV9CVUZGRVJfTUFOWSA8PSBrKSkgeworCVNBWSgiRVJST1I6IGJ1ZmZlciBpbmRleCAlaSBvdXQgb2YgcmFuZ2VcbiIsIGspOworCXJldHVybiByZXRjb2RlOworfQoraWYgKCgwID4gbSkgfHwgKEZSQU1FX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBtKSkgeworCVNBWSgiRVJST1I6IHBhZ2UgbnVtYmVyICAlaSBvdXQgb2YgcmFuZ2VcbiIsIG0pOworCXJldHVybiByZXRjb2RlOworfQorcGVhc3ljYXAgPSBwdm1hLT52bV9wcml2YXRlX2RhdGE7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiByZXRjb2RlOworfQorbXV0ZXhfbG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitwYnVmID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ287CitpZiAoTlVMTCA9PSBwYnVmKSB7CisJU0FZKCJFUlJPUjogIHBidWYgaXMgTlVMTFxuIik7CisJZ290byBmaW5pc2g7Cit9CitwYWdlID0gdmlydF90b19wYWdlKHBidWYpOworaWYgKE5VTEwgPT0gcGFnZSkgeworCVNBWSgiRVJST1I6ICBwYWdlIGlzIE5VTExcbiIpOworCWdvdG8gZmluaXNoOworfQorZ2V0X3BhZ2UocGFnZSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitmaW5pc2g6CittdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOworaWYgKE5VTEwgPT0gcGFnZSkgeworCVNBWSgiRVJST1I6ICBwYWdlIGlzIE5VTEwgYWZ0ZXIgZ2V0X3BhZ2UocGFnZSlcbiIpOworfSBlbHNlIHsKKwlwdm1mLT5wYWdlID0gcGFnZTsKKwlyZXRjb2RlID0gVk1fRkFVTFRfTUlOT1I7Cit9CityZXR1cm4gcmV0Y29kZTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgT04gQ09NUExFVElPTiBPRiBBIFZJREVPIFVSQiBJVFMgREFUQSBJUyBDT1BJRUQgVE8gVEhFIEZJRUxEIEJVRkZFUlMKKyAqICBQUk9WSURFRCBwZWFzeWNhcC0+dmlkZW9faWRsZSBJUyBaRVIwLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCisgKiAgSVQgSVMgUkVTVUJNSVRURUQgUFJPVklERUQgcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nIElTIE5PVCBaRVJPLgorICoKKyAqICBUSElTIEZVTkNUSU9OIElTIEFOIElOVEVSUlVQVCBTRVJWSUNFIFJPVVRJTkUgQU5EIE1VU1QgTk9UIFNMRUVQLgorICoKKyAqICBJTkZPUk1BVElPTiBBQk9VVCBUSEUgVkFMSURJVFkgT0YgVEhFIENPTlRFTlRTIE9GIFRIRSBGSUVMRCBCVUZGRVIgQVJFCisgKiAgU1RPUkVEIElOIFRIRSBUV08tQllURSBTVEFUVVMgUEFSQU1FVEVSCisgKiAgICAgICAgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+ZmllbGRfZmlsbF1bMF0ua291bnQKKyAqICBOT1RJQ0UgVEhBVCBUSEUgSU5GT1JNQVRJT04gSVMgU1RPUkVEIE9OTFkgV0lUSCBQQUdFIDAgT0YgVEhFIEZJRUxEIEJVRkZFUi4KKyAqCisgKiAgVEhFIExPV0VSIEJZVEUgQ09OVEFJTlMgVEhFIEZJRUxEIFBBUklUWSBCWVRFIEZVUk5JU0hFRCBCWSBUSEUgU0FBNzExM0gKKyAqICBDSElQLgorICoKKyAqICBUSEUgVVBQRVIgQllURSBJUyBaRVJPIElGIE5PIFBST0JMRU1TLCBPVEhFUldJU0U6CisgKiAgICAgIDAgIT0gKGtvdW50ICYgMHg4MDAwKSAgID0+IEFUIExFQVNUIE9ORSBVUkIgQ09NUExFVEVEIFdJVEggRVJST1JTCisgKiAgICAgIDAgIT0gKGtvdW50ICYgMHg0MDAwKSAgID0+IEJVRkZFUiBIQVMgVE9PIE1VQ0ggREFUQQorICogICAgICAwICE9IChrb3VudCAmIDB4MjAwMCkgICA9PiBCVUZGRVIgSEFTIE5PVCBFTk9VR0ggREFUQQorICogICAgICAwICE9IChrb3VudCAmIDB4MDQwMCkgICA9PiBGSUVMRCBXQVMgU1VCTUlUVEVEIEJZIEJSSURHRVIgUk9VVElORQorICogICAgICAwICE9IChrb3VudCAmIDB4MDIwMCkgICA9PiBGSUVMRCBCVUZGRVIgTk9UIFlFVCBDSEVDS0VECisgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgwMTAwKSAgID0+IEJVRkZFUiBIQVMgVFdPIEVYVFJBIEJZVEVTIC0gV0hZPworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitlYXN5Y2FwX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCit7CitzdGF0aWMgaW50IG10Oworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworc3RydWN0IGRhdGFfYnVmZmVyICpwZmllbGRfYnVmZmVyOworY2hhciBlcnJidWZbMTZdOworaW50IGksIG1vcmUsIG11Y2gsIGxlYXAsIHJjLCBsYXN0OworaW50IHZpZGVvZmllbGRhbW91bnQ7Cit1bnNpZ25lZCBpbnQgb3ZlcnJpZGU7CitpbnQgZnJhbWVzdGF0dXMsIGZyYW1lbGVuZ3RoLCBmcmFtZWFjdHVhbCwgZnJhbWVvZmZzZXQ7CitfX3U4ICpwdTsKKyNpZiBkZWZpbmVkKEJSSURHRVIpCitzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsOworbG9uZyBsb25nIHVzZWM7CisjZW5kaWYgLypCUklER0VSKi8KKworaWYgKE5VTEwgPT0gcHVyYikgeworCVNBWSgiRVJST1I6IGVhc3ljYXBfY29tcGxldGUoKTogcHVyYiBpcyBOVUxMXG4iKTsKKwlyZXR1cm47Cit9CitwZWFzeWNhcCA9IHB1cmItPmNvbnRleHQ7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IGVhc3ljYXBfY29tcGxldGUoKTogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuOworfQorCitpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikKKwlyZXR1cm47CisKK2ZvciAoaSA9IDA7IGkgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyBpKyspCisJaWYgKHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJbaV0ucGdvKQorCQlicmVhazsKK0pPVCgxNiwgIiUyaT11cmJcbiIsIGkpOworbGFzdCA9IHBlYXN5Y2FwLT52aWRlb19pc29jX3NlcXVlbmNlOworaWYgKCgoKFZJREVPX0lTT0NfQlVGRkVSX01BTlkgLSAxKSA9PSBsYXN0KSAmJiBcCisJCQkJCQkoMCAhPSBpKSkgfHwgXAorCSgoKFZJREVPX0lTT0NfQlVGRkVSX01BTlkgLSAxKSAhPSBsYXN0KSAmJiBcCisJCQkJCQkoKGxhc3QgKyAxKSAhPSBpKSkpIHsKKwlTQVkoIkVSUk9SOiBvdXQtb2Ytb3JkZXIgdXJicyAlaSwlaSAuLi4gY29udGludWluZ1xuIiwgbGFzdCwgaSk7Cit9CitwZWFzeWNhcC0+dmlkZW9faXNvY19zZXF1ZW5jZSA9IGk7CisKK2lmIChwZWFzeWNhcC0+dmlkZW9faWRsZSkgeworCUpPVCgxNiwgIiVpPXZpZGVvX2lkbGUgICVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCisJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSwgcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKTsKKwlpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT12aWRlb19pZGxlLCAiIFwKKwkJCQkJInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGggcmM6XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOworCQkJc3dpdGNoIChyYykgeworCQkJY2FzZSAtRU5PTUVNOiB7CisJCQkJU0FZKCJFTk9NRU1cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAtRU5PREVWOiB7CisJCQkJU0FZKCJFTk9ERVZcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAtRU5YSU86IHsKKwkJCQlTQVkoIkVOWElPXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVJTlZBTDogeworCQkJCVNBWSgiRUlOVkFMXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVBR0FJTjogeworCQkJCVNBWSgiRUFHQUlOXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVGQklHOiB7CisJCQkJU0FZKCJFRkJJR1xuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIC1FUElQRTogeworCQkJCVNBWSgiRVBJUEVcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAtRU1TR1NJWkU6IHsKKwkJCQlTQVkoIkVNU0dTSVpFXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVOT1NQQzogeworCQkJCVNBWSgiRU5PU1BDXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6IHsKKwkJCQlTQVkoIjB4JTA4WFxuIiwgcmMpOworCQkJCWJyZWFrOworCQkJfQorCQkJfQorCQl9CisJfQorcmV0dXJuOworfQorb3ZlcnJpZGUgPSAwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKKwlyZXR1cm47Cit9CitpZiAocHVyYi0+c3RhdHVzKSB7CisJaWYgKCgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgfHwgKC1FTk9FTlQgPT0gcHVyYi0+c3RhdHVzKSkgeworCQlKT1QoOCwgInVyYiBzdGF0dXMgLUVTSFVURE9XTiBvciAtRU5PRU5UXG4iKTsKKwkJcmV0dXJuOworCX0KKworCShwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5rb3VudCkgfD0gMHg4MDAwIDsKKwlTQVkoIkVSUk9SOiBiYWQgdXJiIHN0YXR1czpcbiIpOworCXN3aXRjaCAocHVyYi0+c3RhdHVzKSB7CisJY2FzZSAtRUlOUFJPR1JFU1M6IHsKKwkJU0FZKCItRUlOUFJPR1JFU1NcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU5PU1I6IHsKKwkJU0FZKCItRU5PU1JcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRVBJUEU6IHsKKwkJU0FZKCItRVBJUEVcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU9WRVJGTE9XOiB7CisJCVNBWSgiLUVPVkVSRkxPV1xuIik7IGJyZWFrOworCX0KKwljYXNlIC1FUFJPVE86IHsKKwkJU0FZKCItRVBST1RPXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVJTFNFUTogeworCQlTQVkoIi1FSUxTRVFcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRVRJTUVET1VUOiB7CisJCVNBWSgiLUVUSU1FRE9VVFxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FTVNHU0laRTogeworCQlTQVkoIi1FTVNHU0laRVxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FT1BOT1RTVVBQOiB7CisJCVNBWSgiLUVPUE5PVFNVUFBcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRVBGTk9TVVBQT1JUOiB7CisJCVNBWSgiLUVQRk5PU1VQUE9SVFxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FQUZOT1NVUFBPUlQ6IHsKKwkJU0FZKCItRUFGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVBRERSSU5VU0U6IHsKKwkJU0FZKCItRUFERFJJTlVTRVxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FQUREUk5PVEFWQUlMOiB7CisJCVNBWSgiLUVBRERSTk9UQVZBSUxcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU5PQlVGUzogeworCQlTQVkoIi1FTk9CVUZTXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVJU0NPTk46IHsKKwkJU0FZKCItRUlTQ09OTlxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FTk9UQ09OTjogeworCQlTQVkoIi1FTk9UQ09OTlxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FU0hVVERPV046IHsKKwkJU0FZKCItRVNIVVRET1dOXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVOT0VOVDogeworCQlTQVkoIi1FTk9FTlRcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRUNPTk5SRVNFVDogeworCQlTQVkoIi1FQ09OTlJFU0VUXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVOT1NQQzogeworCQlTQVkoIkVOT1NQQ1xuIik7IGJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCVNBWSgidW5rbm93biBlcnJvciBjb2RlIDB4JTA4WFxuIiwgcHVyYi0+c3RhdHVzKTsgYnJlYWs7CisJfQorCX0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK30gZWxzZSB7CisJZm9yIChpID0gMDsgIGkgPCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCWlmICgwICE9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgeworCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5rb3VudCkgfD0gMHg4MDAwIDsKKwkJCXN3aXRjaCAocHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSB7CisJCQljYXNlICAwOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICJPSyIpOyBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVOT0VOVDogeworCQkJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT0VOVCIpOyBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVJTlBST0dSRVNTOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRUlOUFJPR1JFU1MiKTsgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FUFJPVE86IHsKKwkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FUFJPVE8iKTsgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FSUxTRVE6IHsKKwkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSUxTRVEiKTsgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FVElNRTogeworCQkJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVUSU1FIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRVRJTUVET1VUOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVRJTUVET1VUIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRVBJUEU6IHsKKwkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FUElQRSIpOyBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVDT01NOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRUNPTU0iKTsgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FTk9TUjogeworCQkJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT1NSIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRU9WRVJGTE9XOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRU9WRVJGTE9XIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRVJFTU9URUlPOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVJFTU9URUlPIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRU5PREVWOiB7CisJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRU5PREVWIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRVhERVY6IHsKKwkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FWERFViIpOyBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVJTlZBTDogeworCQkJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVJTlZBTCIpOyBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVDT05OUkVTRVQ6IHsKKwkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09OTlJFU0VUIik7IGJyZWFrOworCQkJfQorCQkJY2FzZSAtRU5PU1BDOiB7CisJCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVTSFVURE9XTjogeworCQkJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVTSFVURE9XTiIpOyBicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6IHsKKwkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgInVua25vd24gZXJyb3IiKTsgYnJlYWs7CisJCQl9CisJCQl9CisJCX0KKwkJZnJhbWVzdGF0dXMgPSBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisJCWZyYW1lbGVuZ3RoID0gcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoOworCQlmcmFtZWFjdHVhbCA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCWZyYW1lb2Zmc2V0ID0gcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCisJCUpPVCgxNiwgImZyYW1lWyUyaV06IiBcCisJCQkJIiU0aT1zdGF0dXMgIiAgXAorCQkJCSIlNGk9YWN0dWFsICIgIFwKKwkJCQkiJTRpPWxlbmd0aCAiICBcCisJCQkJIiU1aT1vZmZzZXRcbiIsIFwKKwkJCWksIGZyYW1lc3RhdHVzLCBmcmFtZWFjdHVhbCwgZnJhbWVsZW5ndGgsIGZyYW1lb2Zmc2V0KTsKKwkJaWYgKCFwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpIHsKKwkJCW1vcmUgPSBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCSAgW3BlYXN5Y2FwLT5maWVsZF9maWxsXVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CisJCQl2aWRlb2ZpZWxkYW1vdW50ID0gKHBlYXN5Y2FwLT5maWVsZF9wYWdlICogXAorCQkJCVBBR0VfU0laRSkgKyBcCisJCQkJKGludCkocGZpZWxkX2J1ZmZlci0+cHRvIC0gcGZpZWxkX2J1ZmZlci0+cGdvKTsKKwkJaWYgKDQgPT0gbW9yZSkKKwkJCW10Kys7CisJCWlmICg0IDwgbW9yZSkgeworCQkJaWYgKG10KSB7CisJCQkJSk9UKDgsICIlNGkgZW1wdHkgdmlkZW8gdXJiIGZyYW1lc1xuIiwgbXQpOworCQkJCW10ID0gMDsKKwkJCX0KKwkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgeworCQkJCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UpIHsKKwkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX3BhZ2VcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdW3BlYXN5Y2FwLT5maWVsZF9wYWdlXTsKKwkJCXB1ID0gKF9fdTggKikocHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgXAorCQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQpOworCQkJaWYgKDB4ODAgJiAqcHUpCisJCQkJbGVhcCA9IDg7CisJCQllbHNlCisJCQkJbGVhcCA9IDQ7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgRUlHSFQtQllURSBFTkQtT0YtVklERU9GSUVMRCBNQVJLRVIuCisgKiAgTk9URTogIEEgU1VDQ0VTU0lPTiBPRiBVUkIgRlJBTUVTIEZPTExPV0lORyBUSElTIEFSRSBFTVBUWSwKKyAqICAgICAgICAgQ09SUkVTUE9ORElORyBUTyBUSEUgRklFTEQgRkxZQkFDSyAoVkVSVElDQUwgQkxBTktJTkcpIFBFUklPRC4KKyAqCisgKiAgUFJPVklERUQgVEhFIEZJRUxEIEJVRkZFUiBDT05UQUlOUyBHT09EIERBVEEgQVMgSU5ESUNBVEVEIEJZIEEgWkVSTyBVUFBFUgorICogIEJZVEUgT0YKKyAqICAgICAgICBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5rb3VudAorICogIFRIRSBDT05URU5UUyBPRiBUSEUgRklFTEQgQlVGRkVSIEFSRSBPRkZFUkVEIFRPIGRxYnVmKCksIGZpZWxkX3JlYWQgSVMKKyAqICBVUERBVEVEIEFORCBmaWVsZF9maWxsIElTIEJVTVBFRC4gIElGIFRIRSBGSUVMRCBCVUZGRVIgQ09OVEFJTlMgQkFEIERBVEEKKyAqICBOT1RISU5HIElTIE9GRkVSRUQgVE8gZHFidWYoKS4KKyAqCisgKiAgVEhFIERFQ0lTSU9OIE9OIFdIRVRIRVIgVEhFIFBBUklUWSBPRiBUSEUgT0ZGRVJFRCBGSUVMRCBCVUZGRVIgSVMgUklHSFQKKyAqICBSRVNUUyBXSVRIIGRxYnVmKCkuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCWlmICgoOCA9PSBtb3JlKSB8fCBvdmVycmlkZSkgeworCQkJCWlmICh2aWRlb2ZpZWxkYW1vdW50ID4gXAorCQkJCQkJcGVhc3ljYXAtPnZpZGVvZmllbGRhbW91bnQpIHsKKwkJCQkJaWYgKDIgPT0gdmlkZW9maWVsZGFtb3VudCAtIFwKKwkJCQkJCQlwZWFzeWNhcC0+XAorCQkJCQkJCXZpZGVvZmllbGRhbW91bnQpCisJCQkJCQkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCisJCQkJCQkJWzBdLmtvdW50KSB8PSAweDAxMDA7CisJCQkJCWVsc2UKKwkJCQkJCShwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVwKKwkJCQkJCQlbMF0ua291bnQpIHw9IDB4NDAwMDsKKwkJCQkJfSBlbHNlIGlmICh2aWRlb2ZpZWxkYW1vdW50IDwgXAorCQkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQkJdmlkZW9maWVsZGFtb3VudCkgeworCQkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAorCQkJCQkJCVswXS5rb3VudCkgfD0gMHgyMDAwOworCQkJCQl9CisJCQkJaWYgKCEoMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCisJCQkJCQlbMF0ua291bnQpKSB7CisJCQkJCShwZWFzeWNhcC0+dmlkZW9fanVuayktLTsKKwkJCQkJaWYgKC0xNiA+IHBlYXN5Y2FwLT52aWRlb19qdW5rKQorCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAtMTY7CisJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gXAorCQkJCQkJCShwZWFzeWNhcC0+XAorCQkJCQkJCQlmaWVsZF9maWxsKSsrOworCisJCQkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBcCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCkKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsID0gMDsKKwkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOworCQkJCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5cCisJCQkJCQlmaWVsZF9idWZmZXJcCisJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAorCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9wYWdlXTsKKwkJCQkJcGZpZWxkX2J1ZmZlci0+cHRvID0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbzsKKworCQkJCQlKT1QoOCwgImJ1bXBlZCB0bzogJWk9cGVhc3ljYXAtPiIgXAorCQkJCQkJImZpZWxkX2ZpbGwgICVpPXBhcml0eVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKKwkJCQkJCTB4MDBGRiAmIHBmaWVsZF9idWZmZXItPmtvdW50KTsKKwkJCQkJSk9UKDgsICJmaWVsZCBidWZmZXIgJWkgaGFzICVpICIgXAorCQkJCQkJImJ5dGVzIGZpdCB0byBiZSByZWFkXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgXAorCQkJCQkJdmlkZW9maWVsZGFtb3VudCk7CisJCQkJCUpPVCg4LCAid2FrZXVwIGNhbGwgdG8gd3FfdmlkZW8sICIgXAorCQkJCQkJIiVpPWZpZWxkX3JlYWQgJWk9ZmllbGRfZmlsbCAiXAorCQkJCQkJIiVpPXBhcml0eVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIFwKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCisJCQkJCQkweDAwRkYgJiBwZWFzeWNhcC0+XAorCQkJCQkJZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5cCisJCQkJCQlmaWVsZF9yZWFkXVswXS5rb3VudCk7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5cCisJCQkJCQkJCXdxX3ZpZGVvKSk7CisJCQkJCWRvX2dldHRpbWVvZmRheSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsrKzsKKwkJCQkJSk9UKDgsICJmaWVsZCBidWZmZXIgJWkgaGFkICVpICIgXAorCQkJCQkJImJ5dGVzLCBub3cgZGlzY2FyZGVkXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAorCQkJCQkJdmlkZW9maWVsZGFtb3VudCk7CisKKwkJCQkJKHBlYXN5Y2FwLT5maWVsZF9maWxsKSsrOworCisJCQkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwpCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCA9IDA7CisJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKKwkJCQkJcGZpZWxkX2J1ZmZlciA9IFwKKwkJCQkJCSZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVwKKwkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CisJCQkJCXBmaWVsZF9idWZmZXItPnB0byA9IFwKKwkJCQkJCQlwZmllbGRfYnVmZmVyLT5wZ287CisKKwkJCQkJSk9UKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT4iIFwKKwkJCQkJCSJmaWVsZF9maWxsICAlaT1wYXJpdHlcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCisJCQkJCQkweDAwRkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7CisJCQkJfQorCQkJCWlmICg4ID09IG1vcmUpIHsKKwkJCQkJSk9UKDgsICJlbmQtb2YtZmllbGQ6IHJlY2VpdmVkICIgXAorCQkJCQkJInBhcml0eSBieXRlIDB4JTAyWFxuIiwgXAorCQkJCQkJKDB4RkYgJiAqcHUpKTsKKwkJCQkJaWYgKDB4NDAgJiAqcHUpCisJCQkJCQlwZmllbGRfYnVmZmVyLT5rb3VudCA9IDB4MDAwMDsKKwkJCQkJZWxzZQorCQkJCQkJcGZpZWxkX2J1ZmZlci0+a291bnQgPSAweDAwMDE7CisJCQkJCUpPVCg4LCAiZW5kLW9mLWZpZWxkOiAweCUwMlg9a291bnRcbiIsXAorCQkJCQkJMHhGRiAmIHBmaWVsZF9idWZmZXItPmtvdW50KTsKKwkJCQl9CisJCQl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIENPUFkgbW9yZSBCWVRFUyBGUk9NIElTT0MgQlVGRkVSIFRPIEZJRUxEIEJVRkZFUgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQlwdSArPSBsZWFwOworCQkJbW9yZSAtPSBsZWFwOworCisJCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHsKKwkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUgPD0gXAorCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlKSB7CisJCQkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9wYWdlXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CisJCQl3aGlsZSAobW9yZSkgeworCQkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCisJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3BhZ2VdOworCQkJCWlmIChQQUdFX1NJWkUgPCAocGZpZWxkX2J1ZmZlci0+cHRvIC0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbykpIHsKKwkJCQkJU0FZKCJFUlJPUjogYmFkIHBmaWVsZF9idWZmZXItPnB0b1xuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYgKFBBR0VfU0laRSA9PSAocGZpZWxkX2J1ZmZlci0+cHRvIC0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbykpIHsKKwkJCQkJKHBlYXN5Y2FwLT5maWVsZF9wYWdlKSsrOworCQkJCQlpZiAoRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFIDw9IFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcGFnZSkgeworCQkJCQkJSk9UKDE2LCAid3JhcHBpbmcgcGVhc3ljYXAtPiIgXAorCQkJCQkJCSJmaWVsZF9wYWdlXG4iKTsKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKKwkJCQkJfQorCQkJCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfYnVmZmVyXAorCQkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCisJCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9wYWdlXTsKKwkJCQkJcGZpZWxkX2J1ZmZlci0+cHRvID0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbzsKKwkJCQl9CisKKwkJCQltdWNoID0gUEFHRV9TSVpFIC0gKGludCkocGZpZWxkX2J1ZmZlci0+cHRvIC0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbyk7CisKKwkJCQlpZiAobXVjaCA+IG1vcmUpCisJCQkJCW11Y2ggPSBtb3JlOworCQkJCW1lbWNweShwZmllbGRfYnVmZmVyLT5wdG8sIHB1LCBtdWNoKTsKKwkJCQlwdSArPSBtdWNoOworCQkJCShwZmllbGRfYnVmZmVyLT5wdG8pICs9IG11Y2g7CisJCQkJbW9yZSAtPSBtdWNoOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKgorICoKKyAqICAgICAgICAgICAgICoqKiBVTkRFUiBERVZFTE9QTUVOVC9URVNUSU5HIC0gTk9UIFJFQURZIFlFVCEgKioqCisgKgorICoKKyAqCisgKiAgVklERU9UQVBFUyBNQVkgSEFWRSBCRUVOIE1BTlVBTExZIFBBVVNFRCBBTkQgUkVTVEFSVEVEIERVUklORyBSRUNPUkRJTkcuCisgKiAgVEhJUyBDQVVTRVMgTE9TUyBPRiBTWU5DLCBDT05GVVNJTkcgRE9XTlNUUkVBTSBVU0VSU1BBQ0UgUFJPR1JBTVMgV0hJQ0gKKyAqICBNQVkgSU5URVJQUkVUIFRIRSBJTlRFUlJVUFRJT04gQVMgQSBTWU1QVE9NIE9GIExBVEVOQ1kuICBUTyBPVkVSQ09NRSBUSElTCisgKiAgVEhFIERSSVZFUiBCUklER0VTIFRIRSBISUFUVVMgQlkgU0VORElORyBEVU1NWSBWSURFTyBGUkFNRVMgQVQgUk9VR0hMWQorICogIFRIRSBSSUdIVCBUSU1FIElOVEVSVkFMUyBJTiBUSEUgSE9QRSBPRiBQRVJTVUFESU5HIFRIRSBET1dOU1RSRUFNIFVTRVJTUEFDRQorICogIFBST0dSQU0gVE8gUkVTVU1FIE5PUk1BTCBTRVJWSUNFIFdIRU4gVEhFIElOVEVSUlVQVElPTiBJUyBPVkVSLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChCUklER0VSKQorZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKK2lmIChwZWFzeWNhcC0+dGltZXZhbDcudHZfc2VjKSB7CisJdXNlYyA9IDEwMDAwMDAqKHRpbWV2YWwudHZfc2VjICAtIHBlYXN5Y2FwLT50aW1ldmFsNy50dl9zZWMpICsgXAorCQkJKHRpbWV2YWwudHZfdXNlYyAtIHBlYXN5Y2FwLT50aW1ldmFsNy50dl91c2VjKTsKKwlpZiAodXNlYyA+IChwZWFzeWNhcC0+dXNlYyArIHBlYXN5Y2FwLT50b2xlcmF0ZSkpIHsKKwkJSk9UKDgsICJicmlkZ2luZyBoaWF0dXNcbiIpOworCQlwZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7CisJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdWzBdLmtvdW50IHw9IDB4MDQwMDsKKworCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCA9IChwZWFzeWNhcC0+ZmllbGRfZmlsbCkrKzsKKworCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIFwKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsID0gMDsKKwkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOworCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CisJCXBmaWVsZF9idWZmZXItPnB0byA9IHBmaWVsZF9idWZmZXItPnBnbzsKKworCQlKT1QoOCwgImJ1bXBlZCB0bzogJWk9cGVhc3ljYXAtPmZpZWxkX2ZpbGwgICVpPXBhcml0eVxuIiwgXAorCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIDB4MDBGRiAmIHBmaWVsZF9idWZmZXItPmtvdW50KTsKKwkJSk9UKDgsICJmaWVsZCBidWZmZXIgJWkgaGFzICVpIGJ5dGVzIHRvIGJlIG92ZXJ3cml0dGVuXG4iLCBcCisJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgdmlkZW9maWVsZGFtb3VudCk7CisJCUpPVCg4LCAid2FrZXVwIGNhbGwgdG8gd3FfdmlkZW8sICIgXAorCQkJIiVpPWZpZWxkX3JlYWQgJWk9ZmllbGRfZmlsbCAlaT1wYXJpdHlcbiIsIFwKKwkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAorCQkJMHgwMEZGICYgXAorCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKKwkJZG9fZ2V0dGltZW9mZGF5KCZwZWFzeWNhcC0+dGltZXZhbDcpOworCX0KK30KKyNlbmRpZiAvKkJSSURHRVIqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBSRVNVQk1JVCBUSElTIFVSQiwgVU5MRVNTIEEgU0VWRVJFIFBFUlNJU1RFTlQgRVJST1IgQ09ORElUSU9OIEVYSVNUUy4KKyAqCisgKiAgSUYgVEhFIFdBSVQgUVVFVUVTIEFSRSBOT1QgQ0xFQVJFRCBJTiBSRVNQT05TRSBUTyBBTiBFUlJPUiBDT05ESVRJT04KKyAqICBUSEUgVVNFUlNQQUNFIFBST0dSQU0sIEUuRy4gbXBsYXllciwgTUFZIEhBTkcgT04gRVhJVC4gICBCRVdBUkUuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChWSURFT19JU09DX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT52aWRlb19qdW5rKSB7CisJU0FZKCJlYXN5Y2FwIGRyaXZlciBzaHV0dGluZyBkb3duIG9uIGNvbmRpdGlvbiBncmVlblxuIik7CisJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7CisJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAtVklERU9fSVNPQ19CVUZGRVJfTUFOWTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfYXVkaW8pKTsKKwlyZXR1cm47Cit9CitpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoMCAhPSByYykgeworCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT12aWRlb19pZGxlLCB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKKwkJCQkJIndpdGggcmM6XG4iLCBwZWFzeWNhcC0+dmlkZW9faWRsZSk7CisJCXN3aXRjaCAocmMpIHsKKwkJY2FzZSAtRU5PTUVNOiB7CisJCQlTQVkoIkVOT01FTVxuIik7IGJyZWFrOworCQl9CisJCWNhc2UgLUVOT0RFVjogeworCQkJU0FZKCJFTk9ERVZcbiIpOyBicmVhazsKKwkJfQorCQljYXNlIC1FTlhJTzogeworCQkJU0FZKCJFTlhJT1xuIik7IGJyZWFrOworCQl9CisJCWNhc2UgLUVJTlZBTDogeworCQkJU0FZKCJFSU5WQUxcbiIpOyBicmVhazsKKwkJfQorCQljYXNlIC1FQUdBSU46IHsKKwkJCVNBWSgiRUFHQUlOXG4iKTsgYnJlYWs7CisJCX0KKwkJY2FzZSAtRUZCSUc6IHsKKwkJCVNBWSgiRUZCSUdcbiIpOyBicmVhazsKKwkJfQorCQljYXNlIC1FUElQRTogeworCQkJU0FZKCJFUElQRVxuIik7IGJyZWFrOworCQl9CisJCWNhc2UgLUVNU0dTSVpFOiB7CisJCQlTQVkoIkVNU0dTSVpFXG4iKTsgIGJyZWFrOworCQl9CisJCWNhc2UgLUVOT1NQQzogeworCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlTQVkoIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKKwkJfQorCQl9CisJfQorfQorcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhNRQorICoKKyAqCisgKiAgVEhJUyBGVU5DVElPTiBBU1NVTUVTIFRIQVQsIE9OIEVBQ0ggQU5EIEVWRVJZIE9DQ0FTSU9OIFRIQVQgVEhFIERFVklDRSBJUworICogIFBIWVNJQ0FMTFkgUExVR0dFRCBJTiwgSU5URVJGQUNFIDAgSVMgUFJPQkVEIEZJUlNULgorICogIElGIFRISVMgSVMgTk9UIFRSVUUsIFRIRVJFIElTIFRIRSBQT1NTSUJJTElUWSBPRiBBTiBPb3BzLgorICoKKyAqICBUSElTIEhBUyBORVZFUiBCRUVOIEEgUFJPQkxFTSBJTiBQUkFDVElDRSwgQlVUIFNPTUVUSElORyBTRUVNUyBXUk9ORyBIRVJFLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2Vhc3ljYXBfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGVyZmFjZSwgXAorCQkJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlLCAqcHVzYl9kZXZpY2UxOworc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqcHVzYl9ob3N0X2ludGVyZmFjZTsKK3N0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqcGVwZDsKK3N0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKnB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3I7CitzdHJ1Y3QgdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yICpwdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yOworc3RydWN0IHVyYiAqcHVyYjsKK3N0YXRpYyBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAgLyo9TlVMTCovOworc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CitzaXplX3Qgd01heFBhY2tldFNpemU7CitpbnQgSVNPQ3dNYXhQYWNrZXRTaXplOworaW50IEJVTEt3TWF4UGFja2V0U2l6ZTsKK2ludCBJTlR3TWF4UGFja2V0U2l6ZTsKK2ludCBDVFJMd01heFBhY2tldFNpemU7CitfX3U4IGJFbmRwb2ludEFkZHJlc3M7CitfX3U4IElTT0NiRW5kcG9pbnRBZGRyZXNzOworX191OCBJTlRiRW5kcG9pbnRBZGRyZXNzOworaW50IGlzaW4sIGksIGosIGssIG07CitfX3U4IGJJbnRlcmZhY2VOdW1iZXI7CitfX3U4IGJJbnRlcmZhY2VDbGFzczsKK19fdTggYkludGVyZmFjZVN1YkNsYXNzOwordm9pZCAqcGJ1ZjsKK2ludCBva2FsdFs4XSwgaXNva2FsdDsKK2ludCBva2Vwbls4XSwgaXNva2VwbjsKK2ludCBva21wc1s4XSwgaXNva21wczsKK2ludCBtYXhwYWNrZXRzaXplOworaW50IHJjOworCitKT1QoNCwgIlxuIik7CisKK2lmICgoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilOVUxMID09IHB1c2JfaW50ZXJmYWNlKSB7CisJU0FZKCJFUlJPUjogcHVzYl9pbnRlcmZhY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEdFVCBQT0lOVEVSIFRPIFNUUlVDVFVSRSB1c2JfZGV2aWNlCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3B1c2JfZGV2aWNlMSA9IGNvbnRhaW5lcl9vZihwdXNiX2ludGVyZmFjZS0+ZGV2LnBhcmVudCwgXAorCQkJCQkJc3RydWN0IHVzYl9kZXZpY2UsIGRldik7CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwdXNiX2RldmljZTEpIHsKKwlTQVkoIkVSUk9SOiBwdXNiX2RldmljZTEgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwdXNiX2RldmljZSA9IHVzYl9nZXRfZGV2KHB1c2JfZGV2aWNlMSk7CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6IHB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKCh1bnNpZ25lZCBsb25nIGludClwdXNiX2RldmljZTEgIT0gKHVuc2lnbmVkIGxvbmcgaW50KXB1c2JfZGV2aWNlKSB7CisJSk9UKDQsICJFUlJPUjogcHVzYl9kZXZpY2UxICE9IHB1c2JfZGV2aWNlXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworSk9UKDQsICJiTnVtQ29uZmlndXJhdGlvbnM9JWlcbiIsIHB1c2JfZGV2aWNlLT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3B1c2JfaG9zdF9pbnRlcmZhY2UgPSBwdXNiX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CitpZiAoTlVMTCA9PSBwdXNiX2hvc3RfaW50ZXJmYWNlKSB7CisJU0FZKCJFUlJPUjogcHVzYl9ob3N0X2ludGVyZmFjZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3B1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgPSAmKHB1c2JfaG9zdF9pbnRlcmZhY2UtPmRlc2MpOworaWYgKE5VTEwgPT0gcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcikgeworCVNBWSgiRVJST1I6IHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEdFVCBQUk9QRVJUSUVTIE9GIFBST0JFRCBJTlRFUkZBQ0UKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYkludGVyZmFjZU51bWJlciA9IHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VOdW1iZXI7CitiSW50ZXJmYWNlQ2xhc3MgPSBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlQ2xhc3M7CitiSW50ZXJmYWNlU3ViQ2xhc3MgPSBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlU3ViQ2xhc3M7CisKK0pPVCg0LCAiaW50ZlslaV06IHB1c2JfaW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZz0laVxuIiwgXAorCQkJYkludGVyZmFjZU51bWJlciwgcHVzYl9pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKK0pPVCg0LCAiaW50ZlslaV06IHB1c2JfaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZyAtICIgXAorCQkJInB1c2JfaW50ZXJmYWNlLT5hbHRzZXR0aW5nPSVsaVxuIiwgYkludGVyZmFjZU51bWJlciwgXAorCQkJKGxvbmcgaW50KShwdXNiX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmcgLSBcCisJCQkJCQlwdXNiX2ludGVyZmFjZS0+YWx0c2V0dGluZykpOworc3dpdGNoIChiSW50ZXJmYWNlQ2xhc3MpIHsKK2Nhc2UgVVNCX0NMQVNTX0FVRElPOiB7CisJSk9UKDQsICJpbnRmWyVpXTogYkludGVyZmFjZUNsYXNzPTB4JTAyWD1VU0JfQ0xBU1NfQVVESU9cbiIsIFwKKwkJCQliSW50ZXJmYWNlTnVtYmVyLCBiSW50ZXJmYWNlQ2xhc3MpOyBicmVhazsKKwl9CitjYXNlIFVTQl9DTEFTU19WSURFTzogeworCUpPVCg0LCAiaW50ZlslaV06IGJJbnRlcmZhY2VDbGFzcz0weCUwMlg9VVNCX0NMQVNTX1ZJREVPXG4iLCBcCisJCQkJYkludGVyZmFjZU51bWJlciwgYkludGVyZmFjZUNsYXNzKTsgYnJlYWs7CisJfQorY2FzZSBVU0JfQ0xBU1NfVkVORE9SX1NQRUM6IHsKKwlKT1QoNCwgImludGZbJWldOiBiSW50ZXJmYWNlQ2xhc3M9MHglMDJYPVVTQl9DTEFTU19WRU5ET1JfU1BFQ1xuIiwgXAorCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGJJbnRlcmZhY2VDbGFzcyk7IGJyZWFrOworCX0KK2RlZmF1bHQ6CisJYnJlYWs7Cit9Citzd2l0Y2ggKGJJbnRlcmZhY2VTdWJDbGFzcykgeworY2FzZSAweDAxOiB7CisJSk9UKDQsICJpbnRmWyVpXTogYkludGVyZmFjZVN1YkNsYXNzPTB4JTAyWD1BVURJT0NPTlRST0xcbiIsIFwKKwkJCWJJbnRlcmZhY2VOdW1iZXIsIGJJbnRlcmZhY2VTdWJDbGFzcyk7IGJyZWFrOworfQorY2FzZSAweDAyOiB7CisJSk9UKDQsICJpbnRmWyVpXTogYkludGVyZmFjZVN1YkNsYXNzPTB4JTAyWD1BVURJT1NUUkVBTUlOR1xuIiwgXAorCQkJYkludGVyZmFjZU51bWJlciwgYkludGVyZmFjZVN1YkNsYXNzKTsgYnJlYWs7Cit9CitjYXNlIDB4MDM6IHsKKwlKT1QoNCwgImludGZbJWldOiBiSW50ZXJmYWNlU3ViQ2xhc3M9MHglMDJYPU1JRElTVFJFQU1JTkdcbiIsIFwKKwkJCWJJbnRlcmZhY2VOdW1iZXIsIGJJbnRlcmZhY2VTdWJDbGFzcyk7IGJyZWFrOworfQorZGVmYXVsdDoKKwlicmVhazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3B1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IgPSBwdXNiX2ludGVyZmFjZS0+aW50Zl9hc3NvYzsKK2lmIChOVUxMICE9IHB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IpIHsKKwlKT1QoNCwgImludGZbJWldOiBiRmlyc3RJbnRlcmZhY2U9MHglMDJYICBiSW50ZXJmYWNlQ291bnQ9MHglMDJYXG4iLCBcCisJCQliSW50ZXJmYWNlTnVtYmVyLCBcCisJCQlwdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yLT5iRmlyc3RJbnRlcmZhY2UsIFwKKwkJCXB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VDb3VudCk7Cit9IGVsc2UgeworSk9UKDQsICJpbnRmWyVpXTogcHVzYl9pbnRlcmZhY2VfYXNzb2NfZGVzY3JpcHRvciBpcyBOVUxMXG4iLCBcCisJCQkJCQkJYkludGVyZmFjZU51bWJlcik7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEEgTkVXIHN0cnVjdCBlYXN5Y2FwIElTIEFMV0FZUyBBTExPQ0FURUQgV0hFTiBJTlRFUkZBQ0UgMCBJUyBQUk9CRUQuCisgKiAgSVQgSVMgTk9UIFBPU1NJQkxFIEhFUkUgVE8gRlJFRSBBTlkgRVhJU1RJTkcgc3RydWN0IGVhc3ljYXAuICBUSElTCisgKiAgU0hPVUxEIEhBVkUgQkVFTiBET05FIEJZIGVhc3ljYXBfZGVsZXRlKCkgV0hFTiBUSEUgREVWSUNFIFdBUyBQSFlTSUNBTExZCisgKiAgVU5QTFVHR0VELgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoMCA9PSBiSW50ZXJmYWNlTnVtYmVyKSB7CisJcGVhc3ljYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWFzeWNhcCksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBwZWFzeWNhcFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHNpemVvZihzdHJ1Y3QgZWFzeWNhcCk7CisJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgPSAwOworCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmIgPSAwOworCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgPSAwOworCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlID0gMDsKKwkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fdXJiID0gMDsKKwl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElOSVRJQUxJWkUgVEhFIE5FVyBlYXN5Y2FwIFNUUlVDVFVSRS4KKyAqICBOTyBQQVJBTUVURVJTIEFSRSBTUEVDSUZJRUQgSEVSRSBSRVFVSVJJTkcgVEhFIFNFVFRJTkcgT0YgUkVHSVNURVJTLgorICogIFRIQVQgSVMgRE9ORSBGSVJTVCBCWSBlYXN5Y2FwX29wZW4oKSBBTkQgTEFURVIgQlkgZWFzeWNhcF9pb2N0bCgpLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGVhc3ljYXAtPnB1c2JfZGV2aWNlID0gcHVzYl9kZXZpY2U7CisJcGVhc3ljYXAtPnB1c2JfaW50ZXJmYWNlID0gcHVzYl9pbnRlcmZhY2U7CisKKwlrcmVmX2luaXQoJnBlYXN5Y2FwLT5rcmVmKTsKKwlKT1QoOCwgImludGZbJWldOiBhZnRlciBrcmVmX2luaXQoLi4uX3ZpZGVvKSAiIFwKKwkJCSIlaT1wZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyXG4iLCBcCisJCQliSW50ZXJmYWNlTnVtYmVyLCBwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYocGVhc3ljYXAtPndxX2F1ZGlvKSk7CisKKwltdXRleF9pbml0KCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwwKSk7CisJbXV0ZXhfaW5pdCgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMSkpOworCisJZm9yIChrID0gMDsgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyBrKyspCisJCW11dGV4X2luaXQoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1trXSkpOworCisJcGVhc3ljYXAtPmlsayA9IDA7CisJcGVhc3ljYXAtPm1pY3JvcGhvbmUgPSBmYWxzZTsKKworCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UgPSAtMTsKKwlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbiA9IC0xOworCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29mZiA9IC0xOworCXBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlciA9IC0xOworCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSA9IC0xOworCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplID0gLTE7CisKKwlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlID0gLTE7CisJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24gPSAtMTsKKwlwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vZmYgPSAtMTsKKwlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIgPSAtMTsKKwlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUgPSAtMTsKKwlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSA9IC0xOworCisJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55ID0gRlJBTUVfQlVGRkVSX01BTlk7CisKKwlpZiAoKHN0cnVjdCBtdXRleCAqKU5VTEwgPT0gJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpIHsKKwkJU0FZKCJFUlJPUjogJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1slaV0pIGlzIE5VTExcbiIsIDApOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIERZTkFNSUNBTExZIEZJTEwgSU4gVEhFIEFWQUlMQUJMRSBGT1JNQVRTLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmMgPSBmaWxsaW5fZm9ybWF0cygpOworCWlmICgwID4gcmMpIHsKKwkJU0FZKCJFUlJPUjogZmlsbGluX2Zvcm1hdHMoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJSk9UKDQsICIlaSBmb3JtYXRzIGF2YWlsYWJsZVxuIiwgcmMpOworCX0gZWxzZSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7CisJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMICIgXAorCQkJCQkid2hlbiBwcm9iaW5nIGludGVyZmFjZSAlaVxuIiwgXAorCQkJCQkJCWJJbnRlcmZhY2VOdW1iZXIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCUpPVCg4LCAia3JlZl9nZXQoKSB3aXRoICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKKwkJCQkJKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKKwlrcmVmX2dldCgmcGVhc3ljYXAtPmtyZWYpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKChVU0JfQ0xBU1NfVklERU8gPT0gYkludGVyZmFjZUNsYXNzKSB8fCBcCisJKFVTQl9DTEFTU19WRU5ET1JfU1BFQyA9PSBiSW50ZXJmYWNlQ2xhc3MpKSB7CisJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpIHsKKwkJcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSA9IGJJbnRlcmZhY2VOdW1iZXI7CisJCUpPVCg0LCAic2V0dGluZyBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlPSVpXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlKTsKKwl9IGVsc2UgeworCQlpZiAocGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSAhPSBiSW50ZXJmYWNlTnVtYmVyKSB7CisJCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlc2V0ICIgXAorCQkJCQkicGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZVxuIik7CisJCQlTQVkoIi4uLi4uLiBjb250aW51aW5nIHdpdGggIiBcCisJCQkJCSIlaT1wZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpOworCQl9CisJfQorfSBlbHNlIGlmICgoVVNCX0NMQVNTX0FVRElPID09IGJJbnRlcmZhY2VDbGFzcykgJiYgXAorCQkJCQkJKDB4MDIgPT0gYkludGVyZmFjZVN1YkNsYXNzKSkgeworCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlKSB7CisJCXBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UgPSBiSW50ZXJmYWNlTnVtYmVyOworCQlKT1QoNCwgInNldHRpbmcgcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZT0laVxuIiwgXAorCQkJCQkJIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UpOworCX0gZWxzZSB7CisJCWlmIChwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlICE9IGJJbnRlcmZhY2VOdW1iZXIpIHsKKwkJCVNBWSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVzZXQgIiBcCisJCQkJCSJwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlXG4iKTsKKwkJCVNBWSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKKwkJCQkJIiVpPXBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2VcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSk7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElOVkVTVElHQVRFIEFMTCBBTFRTRVRUSU5HUy4KKyAqICBET05FIElOIERFVEFJTCBCRUNBVVNFIFVTQiBERVZJQ0UgMDVlMTowNDA4IEhBUyBESVNQQVJBVEUgSU5DQVJOQVRJT05TLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpc29rYWx0ID0gMDsKK2lzb2tlcG4gPSAwOworaXNva21wcyA9IDA7CisKK2ZvciAoaSA9IDA7IGkgPCBwdXNiX2ludGVyZmFjZS0+bnVtX2FsdHNldHRpbmc7IGkrKykgeworCXB1c2JfaG9zdF9pbnRlcmZhY2UgPSAmKHB1c2JfaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldKTsKKwlpZiAoKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKilOVUxMID09IHB1c2JfaG9zdF9pbnRlcmZhY2UpIHsKKwkJU0FZKCJFUlJPUjogcHVzYl9ob3N0X2ludGVyZmFjZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgPSAmKHB1c2JfaG9zdF9pbnRlcmZhY2UtPmRlc2MpOworCWlmICgoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKU5VTEwgPT0gXAorCQkJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcikgeworCQlTQVkoIkVSUk9SOiBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iRGVzY3JpcHRvclR5cGU9MHglMDJYXG4iLCBcCisJYkludGVyZmFjZU51bWJlciwgaSwgcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkRlc2NyaXB0b3JUeXBlKTsKKwlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlTnVtYmVyPTB4JTAyWFxuIiwgXAorCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VOdW1iZXIpOworCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJBbHRlcm5hdGVTZXR0aW5nPTB4JTAyWFxuIiwgXAorCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJBbHRlcm5hdGVTZXR0aW5nKTsKKwlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iTnVtRW5kcG9pbnRzPTB4JTAyWFxuIiwgXAorCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJOdW1FbmRwb2ludHMpOworCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VDbGFzcz0weCUwMlhcbiIsIFwKKwliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlQ2xhc3MpOworCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VTdWJDbGFzcz0weCUwMlhcbiIsIFwKKwliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlU3ViQ2xhc3MpOworCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VQcm90b2NvbD0weCUwMlhcbiIsIFwKKwliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlUHJvdG9jb2wpOworCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmlJbnRlcmZhY2U9MHglMDJYXG4iLCBcCisJYkludGVyZmFjZU51bWJlciwgaSwgcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+aUludGVyZmFjZSk7CisKKwlJU09Dd01heFBhY2tldFNpemUgPSAtMTsKKwlCVUxLd01heFBhY2tldFNpemUgPSAtMTsKKwlJTlR3TWF4UGFja2V0U2l6ZSA9IC0xOworCUNUUkx3TWF4UGFja2V0U2l6ZSA9IC0xOworCUlTT0NiRW5kcG9pbnRBZGRyZXNzID0gMDsKKwlJTlRiRW5kcG9pbnRBZGRyZXNzID0gMDsKKworCWlmICgwID09IHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJOdW1FbmRwb2ludHMpCisJCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV0gaGFzIG5vIGVuZHBvaW50c1xuIiwgXAorCQkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGkpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWZvciAoaiA9IDA7IGogPCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iTnVtRW5kcG9pbnRzOyBqKyspIHsKKwkJcGVwZCA9ICYocHVzYl9ob3N0X2ludGVyZmFjZS0+ZW5kcG9pbnRbal0uZGVzYyk7CisJCWlmICgoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopTlVMTCA9PSBwZXBkKSB7CisJCQlTQVkoIkVSUk9SOiAgcGVwZCBpcyBOVUxMLlxuIik7CisJCQlTQVkoIi4uLi4uLiBza2lwcGluZ1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQl3TWF4UGFja2V0U2l6ZSA9IGxlMTZfdG9fY3B1KHBlcGQtPndNYXhQYWNrZXRTaXplKTsKKwkJYkVuZHBvaW50QWRkcmVzcyA9IHBlcGQtPmJFbmRwb2ludEFkZHJlc3M7CisKKwkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiRW5kcG9pbnRBZGRyZXNzPTB4JVhcbiIsIFwKKwkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCisJCQkJcGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CisJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogYm1BdHRyaWJ1dGVzPTB4JVhcbiIsIFwKKwkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCisJCQkJcGVwZC0+Ym1BdHRyaWJ1dGVzKTsKKwkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiB3TWF4UGFja2V0U2l6ZT0laVxuIiwgXAorCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGosIFwKKwkJCQlwZXBkLT53TWF4UGFja2V0U2l6ZSk7CisJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogYkludGVydmFsPSVpXG4iLAorCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGosIFwKKwkJCQlwZXBkLT5iSW50ZXJ2YWwpOworCisJCWlmIChwZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgeworCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBJTiAgZW5kcG9pbnRcbiIsXAorCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CisJCQlpc2luID0gMTsKKwkJfSBlbHNlIHsKKwkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgT1VUIGVuZHBvaW50XG4iLFwKKwkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOworCQkJU0FZKCJFUlJPUjogT1VUIGVuZHBvaW50IHVuZXhwZWN0ZWRcbiIpOworCQkJU0FZKCIuLi4uLi4gY29udGludWluZ1xuIik7CisJCQlpc2luID0gMDsKKwkJfQorCQlpZiAoKHBlcGQtPmJtQXR0cmlidXRlcyAmIFwKKwkJCQlVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gXAorCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiBJU09DIGVuZHBvaW50XG4iLFwKKwkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOworCQkJaWYgKGlzaW4pIHsKKwkJCQlzd2l0Y2ggKGJJbnRlcmZhY2VDbGFzcykgeworCQkJCWNhc2UgVVNCX0NMQVNTX1ZJREVPOgorCQkJCWNhc2UgVVNCX0NMQVNTX1ZFTkRPUl9TUEVDOiB7CisJCQkJCWlmICghcGVhc3ljYXApIHsKKwkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJInBlYXN5Y2FwIGlzIE5VTExcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQkJaWYgKHBlcGQtPndNYXhQYWNrZXRTaXplKSB7CisJCQkJCQlpZiAoOCA+IGlzb2thbHQpIHsKKwkJCQkJCQlva2FsdFtpc29rYWx0XSA9IGk7CisJCQkJCQkJSk9UKDQsXAorCQkJCQkJCSIlaT1va2FsdFslaV1cbiIsIFwKKwkJCQkJCQlva2FsdFtpc29rYWx0XSwgXAorCQkJCQkJCWlzb2thbHQpOworCQkJCQkJCWlzb2thbHQrKzsKKwkJCQkJCX0KKwkJCQkJCWlmICg4ID4gaXNva2VwbikgeworCQkJCQkJCW9rZXBuW2lzb2tlcG5dID0gXAorCQkJCQkJCXBlcGQtPlwKKwkJCQkJCQliRW5kcG9pbnRBZGRyZXNzICYgXAorCQkJCQkJCTB4MEY7CisJCQkJCQkJSk9UKDQsXAorCQkJCQkJCSIlaT1va2VwblslaV1cbiIsIFwKKwkJCQkJCQlva2Vwbltpc29rZXBuXSwgXAorCQkJCQkJCWlzb2tlcG4pOworCQkJCQkJCWlzb2tlcG4rKzsKKwkJCQkJCX0KKwkJCQkJCWlmICg4ID4gaXNva21wcykgeworCQkJCQkJCW9rbXBzW2lzb2ttcHNdID0gXAorCQkJCQkJCWxlMTZfdG9fY3B1KHBlcGQtPlwKKwkJCQkJCQl3TWF4UGFja2V0U2l6ZSk7CisJCQkJCQkJSk9UKDQsXAorCQkJCQkJCSIlaT1va21wc1slaV1cbiIsIFwKKwkJCQkJCQlva21wc1tpc29rbXBzXSwgXAorCQkJCQkJCWlzb2ttcHMpOworCQkJCQkJCWlzb2ttcHMrKzsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgtMSA9PSBwZWFzeWNhcC0+XAorCQkJCQkJCXZpZGVvX2FsdHNldHRpbmdfb2ZmKSB7CisJCQkJCQkJcGVhc3ljYXAtPlwKKwkJCQkJCQl2aWRlb19hbHRzZXR0aW5nX29mZiA9XAorCQkJCQkJCQkJIGk7CisJCQkJCQkJSk9UKDQsICIlaT12aWRlb18iIFwKKwkJCQkJCQkiYWx0c2V0dGluZ19vZmYgIiBcCisJCQkJCQkJCSI8PT09PVxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQkJdmlkZW9fYWx0c2V0dGluZ19vZmYpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCIgXAorCQkJCQkJCSItPnZpZGVvX2FsdHNldHRpbmdfIiBcCisJCQkJCQkJIm9mZiBhbHJlYWR5IHNldFxuIik7CisJCQkJCQkJU0FZKCIuLi4uLi4gIiBcCisJCQkJCQkJImNvbnRpbnVpbmcgd2l0aCAiIFwKKwkJCQkJCQkiJWk9cGVhc3ljYXAtPnZpZGVvXyIgXAorCQkJCQkJCSJhbHRzZXR0aW5nX29mZlxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQkJdmlkZW9fYWx0c2V0dGluZ19vZmYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFVTQl9DTEFTU19BVURJTzogeworCQkJCQlpZiAoMHgwMiAhPSBiSW50ZXJmYWNlU3ViQ2xhc3MpCisJCQkJCQlicmVhazsKKwkJCQkJaWYgKCFwZWFzeWNhcCkgeworCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCSJwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJCWlmIChwZXBkLT53TWF4UGFja2V0U2l6ZSkgeworCQkJCQkJaWYgKDggPiBpc29rYWx0KSB7CisJCQkJCQkJb2thbHRbaXNva2FsdF0gPSBpIDsKKwkJCQkJCQlKT1QoNCxcCisJCQkJCQkJIiVpPW9rYWx0WyVpXVxuIiwgXAorCQkJCQkJCW9rYWx0W2lzb2thbHRdLCBcCisJCQkJCQkJaXNva2FsdCk7CisJCQkJCQkJaXNva2FsdCsrOworCQkJCQkJfQorCQkJCQkJaWYgKDggPiBpc29rZXBuKSB7CisJCQkJCQkJb2tlcG5baXNva2Vwbl0gPSBcCisJCQkJCQkJcGVwZC0+XAorCQkJCQkJCWJFbmRwb2ludEFkZHJlc3MgJiBcCisJCQkJCQkJMHgwRjsKKwkJCQkJCQlKT1QoNCxcCisJCQkJCQkJIiVpPW9rZXBuWyVpXVxuIiwgXAorCQkJCQkJCW9rZXBuW2lzb2tlcG5dLCBcCisJCQkJCQkJaXNva2Vwbik7CisJCQkJCQkJaXNva2VwbisrOworCQkJCQkJfQorCQkJCQkJaWYgKDggPiBpc29rbXBzKSB7CisJCQkJCQkJb2ttcHNbaXNva21wc10gPSBcCisJCQkJCQkJbGUxNl90b19jcHUocGVwZC0+XAorCQkJCQkJCXdNYXhQYWNrZXRTaXplKTsKKwkJCQkJCQlKT1QoNCxcCisJCQkJCQkJIiVpPW9rbXBzWyVpXVxuIixcCisJCQkJCQkJb2ttcHNbaXNva21wc10sIFwKKwkJCQkJCQlpc29rbXBzKTsKKwkJCQkJCQlpc29rbXBzKys7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoLTEgPT0gcGVhc3ljYXAtPlwKKwkJCQkJCQlhdWRpb19hbHRzZXR0aW5nX29mZikgeworCQkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQkJYXVkaW9fYWx0c2V0dGluZ19vZmYgPVwKKwkJCQkJCQkJCSBpOworCQkJCQkJCUpPVCg0LCAiJWk9YXVkaW9fIiBcCisJCQkJCQkJImFsdHNldHRpbmdfb2ZmICIgXAorCQkJCQkJCSI8PT09PVxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQkJYXVkaW9fYWx0c2V0dGluZ19vZmYpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCIgXAorCQkJCQkJCSItPmF1ZGlvX2FsdHNldHRpbmdfIiBcCisJCQkJCQkJIm9mZiBhbHJlYWR5IHNldFxuIik7CisJCQkJCQkJU0FZKCIuLi4uLi4gIiBcCisJCQkJCQkJImNvbnRpbnVpbmcgd2l0aCAiIFwKKwkJCQkJCQkiJWk9cGVhc3ljYXAtPlwKKwkJCQkJCQlhdWRpb19hbHRzZXR0aW5nXyIgXAorCQkJCQkJCSJvZmZcbiIsCisJCQkJCQkJcGVhc3ljYXAtPlwKKwkJCQkJCQlhdWRpb19hbHRzZXR0aW5nX29mZik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKChwZXBkLT5ibUF0dHJpYnV0ZXMgJiBcCisJCQkJCQlVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT1cCisJCQkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisJCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYSAgQlVMSyBlbmRwb2ludFxuIixcCisJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKKwkJfSBlbHNlIGlmICgocGVwZC0+Ym1BdHRyaWJ1dGVzICYgXAorCQkJCQkJVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09XAorCQkJCQkJVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisJCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIElOVCBlbmRwb2ludFxuIixcCisJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKKwkJfSBlbHNlIHsKKwkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhICBDVFJMIGVuZHBvaW50XG4iLFwKKwkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOworCQl9CisJCWlmICgwID09IHBlcGQtPndNYXhQYWNrZXRTaXplKSB7CisJCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gIiBcCisJCQkJCQkiaGFzIHplcm8gcGFja2V0IHNpemVcbiIsIFwKKwkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOworCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBQRVJGT1JNIElOSVRJQUxJWkFUSU9OIE9GIFRIRSBQUk9CRUQgSU5URVJGQUNFCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0pPVCg0LCAiaW5pdGlhbGl6YXRpb24gYmVnaW5zIGZvciBpbnRlcmZhY2UgJWlcbiIsIFwKKwkJCQlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKK3N3aXRjaCAoYkludGVyZmFjZU51bWJlcikgeworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJTlRFUkZBQ0UgMCBJUyBUSEUgVklERU8gSU5URVJGQUNFCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Nhc2UgMDogeworCWlmICghcGVhc3ljYXApIHsKKwkJU0FZKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICghaXNva2FsdCkgeworCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2FsdHNldHRpbmdfb25cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9IGVsc2UgeworCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbiA9IG9rYWx0W2lzb2thbHQgLSAxXTsKKwkJSk9UKDQsICIlaT12aWRlb19hbHRzZXR0aW5nX29uIDw9PT09XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uKTsKKwl9CisJaWYgKCFpc29rZXBuKSB7CisJCVNBWSgiRVJST1I6ICBubyB2aWFibGUgdmlkZW9fZW5kcG9pbnRudW1iZXJcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9IGVsc2UgeworCQlwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rZXBuIC0gMV07CisJCUpPVCg0LCAiJWk9dmlkZW9fZW5kcG9pbnRudW1iZXJcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyKTsKKwkJfQorCWlmICghaXNva21wcykgeworCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX21heHBhY2tldHNpemVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgREVDSURFIFRIRSBWSURFTyBTVFJFQU1JTkcgUEFSQU1FVEVSUworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJfSBlbHNlIHsKKwkJbWF4cGFja2V0c2l6ZSA9IG9rbXBzW2lzb2ttcHMgLSAxXSAtIDEwMjQ7CisJCWlmIChVU0JfMl8wX01BWFBBQ0tFVFNJWkUgPiBtYXhwYWNrZXRzaXplKSB7CisJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgPSBtYXhwYWNrZXRzaXplOworCQl9IGVsc2UgeworCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplID0gXAorCQkJCQkJCVVTQl8yXzBfTUFYUEFDS0VUU0laRTsKKwkJfQorCQlKT1QoNCwgIiVpPXZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSk7CisJCWlmICgwID49IHBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSkgeworCQkJU0FZKCJFUlJPUjogIGJhZCB2aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjID0gVklERU9fSVNPQ19GUkFNRVNQRVJERVNDOworCQlKT1QoNCwgIiVpPXZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKTsKKwkJaWYgKDAgPj0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYykgeworCQkJU0FZKCJFUlJPUjogIGJhZCB2aWRlb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUgPSBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSAqIFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwkJSk9UKDQsICIlaT12aWRlb19pc29jX2J1ZmZlcl9zaXplXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplKTsKKwkJaWYgKChQQUdFX1NJWkUgPDwgVklERU9fSVNPQ19PUkRFUikgPCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplKSB7CisJCQlTQVkoIk1JU1RBS0U6ICIgXAorCQkJCSJwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSB0b28gYmlnXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlKSB7CisJCVNBWSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2FsdHNldHRpbmdfb24pIHsKKwkJU0FZKCJNSVNUQUtFOiAgdmlkZW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2FsdHNldHRpbmdfb2ZmKSB7CisJCVNBWSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZV9vZmYgaXMgdW5zZXRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlcikgeworCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19lbmRwb2ludG51bWJlciBpcyB1bnNldFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCVNBWSgiTUlTVEFLRTogIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSkgeworCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBBTExPQ0FURSBNRU1PUlkgRk9SIFZJREVPIEJVRkZFUlMuICBMSVNUUyBNVVNUIEJFIElOSVRJQUxJWkVEIEZJUlNULgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJSU5JVF9MSVNUX0hFQUQoJihwZWFzeWNhcC0+dXJiX3ZpZGVvX2hlYWQpKTsKKwlwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkID0gJihwZWFzeWNhcC0+dXJiX3ZpZGVvX2hlYWQpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCUpPVCg0LCAiYWxsb2NhdGluZyAlaSBmcmFtZSBidWZmZXJzIG9mIHNpemUgJWxpXG4iLCAgXAorCQkJRlJBTUVfQlVGRkVSX01BTlksIChsb25nIGludClGUkFNRV9CVUZGRVJfU0laRSk7CisJSk9UKDQsICIuLi4uIGVhY2ggc2NhdHRlcmVkIG92ZXIgJWxpIHBhZ2VzXG4iLCBcCisJCQkJCQlGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkUpOworCisJZm9yIChrID0gMDsgIGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgIGsrKykgeworCQlmb3IgKG0gPSAwOyAgbSA8IEZSQU1FX0JVRkZFUl9TSVpFL1BBR0VfU0laRTsgIG0rKykgeworCQkJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbykKKwkJCQlTQVkoImF0dGVtcHRpbmcgdG8gcmVhbGxvY2F0ZSBmcmFtZSAiIFwKKwkJCQkJCQkJIiBidWZmZXJzXG4iKTsKKwkJCWVsc2UgeworCQkJCXBidWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJCQlpZiAoKHZvaWQgKilOVUxMID09IHBidWYpIHsKKwkJCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lICJcCisJCQkJCQkiYnVmZmVyICVpIHBhZ2UgJWlcbiIsIGssIG0pOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9IGVsc2UKKwkJCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fcGFnZSArPSAxOworCQkJCXBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvID0gcGJ1ZjsKKwkJCX0KKwkJCXBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucHRvID0gXAorCQkJCQlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbzsKKwkJfQorCX0KKworCXBlYXN5Y2FwLT5mcmFtZV9maWxsID0gMDsKKwlwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IDA7CisJSk9UKDQsICJhbGxvY2F0aW9uIG9mIGZyYW1lIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAorCQkJCQkJCQltKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlKT1QoNCwgImFsbG9jYXRpbmcgJWkgZmllbGQgYnVmZmVycyBvZiBzaXplICVsaVxuIiwgIFwKKwkJCUZJRUxEX0JVRkZFUl9NQU5ZLCAobG9uZyBpbnQpRklFTERfQlVGRkVSX1NJWkUpOworCUpPVCg0LCAiLi4uLiBlYWNoIHNjYXR0ZXJlZCBvdmVyICVsaSBwYWdlc1xuIiwgXAorCQkJCQlGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpOworCisJZm9yIChrID0gMDsgIGsgPCBGSUVMRF9CVUZGRVJfTUFOWTsgIGsrKykgeworCQlmb3IgKG0gPSAwOyAgbSA8IEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRTsgIG0rKykgeworCQkJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbykgeworCQkJCVNBWSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVhbGxvY2F0ZSAiIFwKKwkJCQkJCQkiZmllbGQgYnVmZmVyc1xuIik7CisJCQl9IGVsc2UgeworCQkJCXBidWYgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCh2b2lkICopTlVMTCA9PSBwYnVmKSB7CisJCQkJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBmaWVsZCIgXAorCQkJCQkJIiBidWZmZXIgJWkgcGFnZSAlaVxuIiwgaywgbSk7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlICs9IDE7CisJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28gPSBwYnVmOworCQkJCX0KKwkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJba11bbV0ucHRvID0gXAorCQkJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbzsKKwkJfQorCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdWzBdLmtvdW50ID0gMHgwMjAwOworCX0KKwlwZWFzeWNhcC0+ZmllbGRfZmlsbCA9IDA7CisJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOworCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gMDsKKwlKT1QoNCwgImFsbG9jYXRpb24gb2YgZmllbGQgYnVmZmVycyBkb25lOiAgJWkgcGFnZXNcbiIsIGsgKiBcCisJCQkJCQkJCW0pOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCUpPVCg0LCAiYWxsb2NhdGluZyAlaSBpc29jIHZpZGVvIGJ1ZmZlcnMgb2Ygc2l6ZSAlaVxuIiwgIFwKKwkJCQkJVklERU9fSVNPQ19CVUZGRVJfTUFOWSwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7CisJSk9UKDQsICIuLi4uIGVhY2ggb2NjdXB5aW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHBhZ2VzXG4iKTsKKworCWZvciAoayA9IDA7ICBrIDwgVklERU9fSVNPQ19CVUZGRVJfTUFOWTsgaysrKSB7CisJCXBidWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgVklERU9fSVNPQ19PUkRFUik7CisJCWlmIChOVUxMID09IHBidWYpIHsKKwkJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBpc29jIHZpZGVvIGJ1ZmZlciAiIFwKKwkJCQkJCQkJIiVpXG4iLCBrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UKKwkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgKz0gXAorCQkJCSgodW5zaWduZWQgaW50KSgweDAxIDw8IFZJREVPX0lTT0NfT1JERVIpKTsKKworCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ucGdvID0gcGJ1ZjsKKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyW2tdLnB0byA9IHBidWYgKyBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplOworCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ua291bnQgPSBrOworCX0KKwlKT1QoNCwgImFsbG9jYXRpb24gb2YgaXNvYyB2aWRlbyBidWZmZXJzIGRvbmU6ICVpIHBhZ2VzXG4iLCBcCisJCQkJCWsgKiAoMHgwMSA8PCBWSURFT19JU09DX09SREVSKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEFMTE9DQVRFIEFORCBJTklUSUFMSVpFIE1VTFRJUExFIHN0cnVjdCB1cmIgLi4uCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlKT1QoNCwgImFsbG9jYXRpbmcgJWkgc3RydWN0IHVyYi5cbiIsIFZJREVPX0lTT0NfQlVGRkVSX01BTlkpOworCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKTsKKwlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOworCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemVuIiwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7CisKKwlmb3IgKGsgPSAwOyAgayA8IFZJREVPX0lTT0NfQlVGRkVSX01BTlk7IGsrKykgeworCQlwdXJiID0gdXNiX2FsbG9jX3VyYihwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjLCBcCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoTlVMTCA9PSBwdXJiKSB7CisJCQlTQVkoIkVSUk9SOiB1c2JfYWxsb2NfdXJiIHJldHVybmVkIE5VTEwgZm9yIGJ1ZmZlciAiIFwKKwkJCQkJCQkJIiVpXG4iLCBrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UKKwkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3VyYiArPSAxOworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQlwZGF0YV91cmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF0YV91cmIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKE5VTEwgPT0gcGRhdGFfdXJiKSB7CisJCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IGRhdGFfdXJiLlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlCisJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19zdHJ1Y3QgKz0gXAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBkYXRhX3VyYik7CisKKwkJcGRhdGFfdXJiLT5wdXJiID0gcHVyYjsKKwkJcGRhdGFfdXJiLT5pc2J1ZiA9IGs7CisJCXBkYXRhX3VyYi0+bGVuZ3RoID0gMDsKKwkJbGlzdF9hZGRfdGFpbCgmKHBkYXRhX3VyYi0+bGlzdF9oZWFkKSwgXAorCQkJCQkJcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIC4uLiBBTkQgSU5JVElBTElaRSBUSEVNCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJaWYgKCFrKSB7CisJCQlKT1QoNCwgImluaXRpYWxpemluZyB2aWRlbyB1cmJzIHRodXM6XG4iKTsKKwkJCUpPVCg0LCAiICBwdXJiLT5pbnRlcnZhbCA9IDE7XG4iKTsKKwkJCUpPVCg0LCAiICBwdXJiLT5kZXYgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7XG4iKTsKKwkJCUpPVCg0LCAiICBwdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlIiBcCisJCQkJCSIocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCVpKTtcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyKTsKKwkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBlYXN5Y2FwLT4iIFwKKwkJCQkJInZpZGVvX2lzb2NfYnVmZmVyWy5dLnBnbztcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAlaTtcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpOworCQkJSk9UKDQsICIgIHB1cmItPmNvbXBsZXRlID0gZWFzeWNhcF9jb21wbGV0ZTtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPnN0YXJ0X2ZyYW1lID0gMDtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gJWk7XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MpOworCQkJSk9UKDQsICIgIGZvciAoaiA9IDA7IGogPCAlaTsgaisrKVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKTsKKwkJCUpPVCg0LCAiICAgIHtcbiIpOworCQkJSk9UKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gaiolaTtcbiIsXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOworCQkJSk9UKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSk7CisJCQlKT1QoNCwgIiAgICB9XG4iKTsKKwkJfQorCisJCXB1cmItPmludGVydmFsID0gMTsKKwkJcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOworCQlwdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgXAorCQkJCQlwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIpOworCQlwdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyW2tdLnBnbzsKKwkJcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemU7CisJCXB1cmItPmNvbXBsZXRlID0gZWFzeWNhcF9jb21wbGV0ZTsKKwkJcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwOworCQlwdXJiLT5zdGFydF9mcmFtZSA9IDA7CisJCXB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwkJZm9yIChqID0gMDsgIGogPCBwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjOyBqKyspIHsKKwkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGogKiBcCisJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZTsKKwkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IFwKKwkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplOworCQl9CisJfQorCUpPVCg0LCAiYWxsb2NhdGlvbiBvZiAlaSBzdHJ1Y3QgdXJiIGRvbmUuXG4iLCBrKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gVEhJUyBJTlRFUkZBQ0UuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIHBlYXN5Y2FwKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBUSEUgVklERU8gREVWSUNFIENBTiBCRSBSRUdJU1RFUkVEIE5PVywgQVMgSVQgSVMgUkVBRFkuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCisJaWYgKDAgIT0gKHVzYl9yZWdpc3Rlcl9kZXYocHVzYl9pbnRlcmZhY2UsICZlYXN5Y2FwX2NsYXNzKSkpIHsKKwkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UiKTsKKwkJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSwgTlVMTCk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZQorCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pKys7CisJU0FZKCJlYXN5Y2FwIGF0dGFjaGVkIHRvIG1pbm9yICMlZFxuIiwgcHVzYl9pbnRlcmZhY2UtPm1pbm9yKTsKKwlicmVhazsKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKwlwdmlkZW9fZGV2aWNlID0gKHN0cnVjdCB2aWRlb19kZXZpY2UgKilcCisJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCA9PSBwdmlkZW9fZGV2aWNlKSB7CisJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBzdHJ1Y3R1cmUgdmlkZW9fZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChWSURFT19ERVZJQ0VfTUFOWSA8PSB2aWRlb19kZXZpY2VfbWFueSkgeworCQlTQVkoIkVSUk9SOiBUb28gbWFueSAvZGV2L3ZpZGVvc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwdmlkZW9fYXJyYXlbdmlkZW9fZGV2aWNlX21hbnldID0gcHZpZGVvX2RldmljZTsgIHZpZGVvX2RldmljZV9tYW55Kys7CisKKwlzdHJjcHkoJnB2aWRlb19kZXZpY2UtPm5hbWVbMF0sICJlYXN5Y2FwZGM2MCIpOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMpCisJcHZpZGVvX2RldmljZS0+Zm9wcyA9ICZ2NGwyX2ZvcHM7CisjZWxzZQorCXB2aWRlb19kZXZpY2UtPmZvcHMgPSAmZWFzeWNhcF9mb3BzOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMqLworCXB2aWRlb19kZXZpY2UtPm1pbm9yID0gLTE7CisJcHZpZGVvX2RldmljZS0+cmVsZWFzZSA9ICh2b2lkICopKCZ2aWRlb2Rldl9yZWxlYXNlKTsKKworCXZpZGVvX3NldF9kcnZkYXRhKHB2aWRlb19kZXZpY2UsICh2b2lkICopcGVhc3ljYXApOworCisJcmMgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocHZpZGVvX2RldmljZSwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmICgwICE9IHJjKSB7CisJCWVycigiTm90IGFibGUgdG8gcmVnaXN0ZXIgd2l0aCB2aWRlb2RldiIpOworCQl2aWRlb2Rldl9yZWxlYXNlKHB2aWRlb19kZXZpY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UgeworCQlwZWFzeWNhcC0+cHZpZGVvX2RldmljZSA9IHB2aWRlb19kZXZpY2U7CisJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF92aWRlbykrKzsKKwkJSk9UKDQsICJyZWdpc3RlcmVkIHdpdGggdmlkZW9kZXY6ICVpPW1pbm9yXG4iLCBcCisJCQkJCQkJcHZpZGVvX2RldmljZS0+bWlub3IpOworCX0KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworCWJyZWFrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElOVEVSRkFDRSAxIElTIFRIRSBBVURJTyBDT05UUk9MIElOVEVSRkFDRQorICogIElOVEVSRkFDRSAyIElTIFRIRSBBVURJTyBTVFJFQU1JTkcgSU5URVJGQUNFCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY2FzZSAxOiB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU0FWRSBQT0lOVEVSIHBlYXN5Y2FwIElOIElOVEVSRkFDRSAxCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIHBlYXN5Y2FwKTsKKwlKT1QoNCwgIm5vIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGZvciBpbnRlcmZhY2UgJWlcbiIsIFwKKwkJCQlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKKwlicmVhazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY2FzZSAyOiB7CisJaWYgKCFwZWFzeWNhcCkgeworCQlTQVkoIk1JU1RBS0U6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKCFpc29rYWx0KSB7CisJCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fYWx0c2V0dGluZ19vblxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZSB7CisJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uID0gb2thbHRbaXNva2FsdCAtIDFdOworCQlKT1QoNCwgIiVpPWF1ZGlvX2FsdHNldHRpbmdfb24gPD09PT1cbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKKwl9CisJaWYgKCFpc29rZXBuKSB7CisJCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fZW5kcG9pbnRudW1iZXJcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9IGVsc2UgeworCQlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rZXBuIC0gMV07CisJCUpPVCg0LCAiJWk9YXVkaW9fZW5kcG9pbnRudW1iZXJcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKKwl9CisJaWYgKCFpc29rbXBzKSB7CisJCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fbWF4cGFja2V0c2l6ZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZSB7CisJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSA9IG9rbXBzW2lzb2ttcHMgLSAxXTsKKwkJSk9UKDQsICIlaT1hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOworCQlpZiAoMCA+PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKKwkJCVNBWSgiRVJST1I6ICBiYWQgYXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJaWYgKDkgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCQlwZWFzeWNhcC0+aWxrIHw9IDB4MDI7CisJCQlTQVkoImhhcmR3YXJlIGlzIEZPVVItQ1ZCU1xuIik7CisJCQlwZWFzeWNhcC0+bWljcm9waG9uZSA9IHRydWU7CisJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50ID0gNDsKKwkJfSBlbHNlIGlmICgyNTYgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCQlwZWFzeWNhcC0+aWxrICY9IH4weDAyOworCQkJU0FZKCJoYXJkd2FyZSBpcyBDVkJTK1MtVklERU9cbiIpOworCQkJcGVhc3ljYXAtPm1pY3JvcGhvbmUgPSBmYWxzZTsKKwkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OworCQl9IGVsc2UgeworCQkJU0FZKCJoYXJkd2FyZSBpcyB1bmlkZW50aWZpZWQ6XG4iKTsKKwkJCVNBWSgiJWk9YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisKKwkJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCA9IFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCAqIFwKKwkJCQkJCQkJUEFHRV9TSVpFIDsKKwkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPSAoQVVESU9fRlJBR01FTlRfTUFOWSAqIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCk7CisKKwkJSk9UKDQsICIlNmk9QVVESU9fRlJBR01FTlRfTUFOWVxuIiwgQVVESU9fRlJBR01FTlRfTUFOWSk7CisJCUpPVCg0LCAiJTZpPWF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudFxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KTsKKwkJSk9UKDQsICIlNmk9YXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19ieXRlc19wZXJfZnJhZ21lbnQpOworCQlKT1QoNCwgIiU2aT1hdWRpb19idWZmZXJfcGFnZV9tYW55XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55KTsKKworCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjID0gMTI4OworCisJCUpPVCg0LCAiJWk9YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpOworCQlpZiAoMCA+PSBwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKSB7CisJCQlTQVkoIkVSUk9SOiAgYmFkIGF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCisJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplID0gXAorCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSAqIFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjOworCQlKT1QoNCwgIiVpPWF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOworCQlpZiAoQVVESU9fSVNPQ19CVUZGRVJfU0laRSA8IFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpIHsKKwkJCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfYnVmZmVyX3NpemUgYmlnZ2VyICIKKwkJCSJ0aGFuICVsaT1BVURJT19JU09DX0JVRkZFUl9TSVpFXG4iLCBcCisJCQkJCQlBVURJT19JU09DX0JVRkZFUl9TSVpFKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UpIHsKKwkJU0FZKCJNSVNUQUtFOiAgYXVkaW9faW50ZXJmYWNlIGlzIHVuc2V0XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vbikgeworCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19hbHRzZXR0aW5nX29uIGlzIHVuc2V0XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vZmYpIHsKKwkJU0FZKCJNSVNUQUtFOiAgYXVkaW9faW50ZXJmYWNlX29mZiBpcyB1bnNldFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKSB7CisJCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2VuZHBvaW50bnVtYmVyIGlzIHVuc2V0XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKKwkJU0FZKCJNSVNUQUtFOiAgYXVkaW9faXNvY19tYXhmcmFtZXNpemUgaXMgdW5zZXRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplKSB7CisJCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfYnVmZmVyX3NpemUgaXMgdW5zZXRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEFMTE9DQVRFIE1FTU9SWSBGT1IgQVVESU8gQlVGRkVSUy4gIExJU1RTIE1VU1QgQkUgSU5JVElBTElaRUQgRklSU1QuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlJTklUX0xJU1RfSEVBRCgmKHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCkpOworCXBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgPSAmKHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCk7CisKKwlKT1QoNCwgImFsbG9jYXRpbmcgYW4gYXVkaW8gYnVmZmVyXG4iKTsKKwlKT1QoNCwgIi4uLi4gc2NhdHRlcmVkIG92ZXIgJWkgcGFnZXNcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkpOworCisJZm9yIChrID0gMDsgIGsgPCBwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueTsgIGsrKykgeworCQlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSB7CisJCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgYXVkaW8gYnVmZmVyc1xuIik7CisJCX0gZWxzZSB7CisJCQlwYnVmID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQkJaWYgKCh2b2lkICopTlVMTCA9PSBwYnVmKSB7CisJCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvICIgXAorCQkJCQkJCSJidWZmZXIgcGFnZSAlaVxuIiwgayk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9IGVsc2UKKwkJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlICs9IDE7CisKKwkJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvID0gcGJ1ZjsKKwkJfQorCQlwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW2tdLnB0byA9IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvOworCX0KKworCXBlYXN5Y2FwLT5hdWRpb19maWxsID0gMDsKKwlwZWFzeWNhcC0+YXVkaW9fcmVhZCA9IDA7CisJSk9UKDQsICJhbGxvY2F0aW9uIG9mIGF1ZGlvIGJ1ZmZlciBkb25lOiAgJWkgcGFnZXNcbiIsIGspOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCUpPVCg0LCAiYWxsb2NhdGluZyAlaSBpc29jIGF1ZGlvIGJ1ZmZlcnMgb2Ygc2l6ZSAlaVxuIiwgIFwKKwkJQVVESU9fSVNPQ19CVUZGRVJfTUFOWSwgcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOworCUpPVCg0LCAiLi4uLiBlYWNoIG9jY3VweWluZyBjb250aWd1b3VzIG1lbW9yeSBwYWdlc1xuIik7CisKKwlmb3IgKGsgPSAwOyAgayA8IEFVRElPX0lTT0NfQlVGRkVSX01BTlk7ICBrKyspIHsKKwkJcGJ1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBBVURJT19JU09DX09SREVSKTsKKwkJaWYgKE5VTEwgPT0gcGJ1ZikgeworCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGlzb2MgYXVkaW8gYnVmZmVyICIgXAorCQkJCQkJCSIlaVxuIiwgayk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlCisJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlICs9IFwKKwkJCQkoKHVuc2lnbmVkIGludCkoMHgwMSA8PCBBVURJT19JU09DX09SREVSKSk7CisKKwkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyW2tdLnBnbyA9IHBidWY7CisJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcltrXS5wdG8gPSBwYnVmICsgXAorCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZTsKKwkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyW2tdLmtvdW50ID0gazsKKwl9CisJSk9UKDQsICJhbGxvY2F0aW9uIG9mIGlzb2MgYXVkaW8gYnVmZmVycyBkb25lLlxuIik7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIEFMTE9DQVRFIEFORCBJTklUSUFMSVpFIE1VTFRJUExFIHN0cnVjdCB1cmIgLi4uCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlKT1QoNCwgImFsbG9jYXRpbmcgJWkgc3RydWN0IHVyYi5cbiIsIEFVRElPX0lTT0NfQlVGRkVSX01BTlkpOworCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKKwlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOworCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOworCisJZm9yIChrID0gMDsgIGsgPCBBVURJT19JU09DX0JVRkZFUl9NQU5ZOyBrKyspIHsKKwkJcHVyYiA9IHVzYl9hbGxvY191cmIocGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYywgXAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKE5VTEwgPT0gcHVyYikgeworCQkJU0FZKCJFUlJPUjogdXNiX2FsbG9jX3VyYiByZXR1cm5lZCBOVUxMIGZvciBidWZmZXIgIiBcCisJCQkJCQkJIiVpXG4iLCBrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UKKwkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3VyYiArPSAxIDsKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKwkJcGRhdGFfdXJiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRhdGFfdXJiKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChOVUxMID09IHBkYXRhX3VyYikgeworCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gZWxzZQorCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0ICs9IFwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgZGF0YV91cmIpOworCisJCXBkYXRhX3VyYi0+cHVyYiA9IHB1cmI7CisJCXBkYXRhX3VyYi0+aXNidWYgPSBrOworCQlwZGF0YV91cmItPmxlbmd0aCA9IDA7CisJCWxpc3RfYWRkX3RhaWwoJihwZGF0YV91cmItPmxpc3RfaGVhZCksIFwKKwkJCQkJCXBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICAuLi4gQU5EIElOSVRJQUxJWkUgVEhFTQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCWlmICghaykgeworCQkJSk9UKDQsICJpbml0aWFsaXppbmcgYXVkaW8gdXJicyB0aHVzOlxuIik7CisJCQlKT1QoNCwgIiAgcHVyYi0+aW50ZXJ2YWwgPSAxO1xuIik7CisJCQlKT1QoNCwgIiAgcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlO1xuIik7CisJCQlKT1QoNCwgIiAgcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShwZWFzeWNhcC0+IiBcCisJCQkJCSJwdXNiX2RldmljZSwlaSk7XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19lbmRwb2ludG51bWJlcik7CisJCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7XG4iKTsKKwkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSAiIFwKKwkJCQkicGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyWy5dLnBnbztcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAlaTtcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOworCQkJSk9UKDQsICIgIHB1cmItPmNvbXBsZXRlID0gZWFzeXNuZF9jb21wbGV0ZTtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPnN0YXJ0X2ZyYW1lID0gMDtcbiIpOworCQkJSk9UKDQsICIgIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gJWk7XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpOworCQkJSk9UKDQsICIgIGZvciAoaiA9IDA7IGogPCAlaTsgaisrKVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKKwkJCUpPVCg0LCAiICAgIHtcbiIpOworCQkJSk9UKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gaiolaTtcbiIsXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOworCQkJSk9UKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7CisJCQlKT1QoNCwgIiAgICB9XG4iKTsKKwkJCX0KKworCQlwdXJiLT5pbnRlcnZhbCA9IDE7CisJCXB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKKwkJcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKKwkJcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXB1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcltrXS5wZ287CisJCXB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplOworCQlwdXJiLT5jb21wbGV0ZSA9IGVhc3lzbmRfY29tcGxldGU7CisJCXB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDsKKwkJcHVyYi0+c3RhcnRfZnJhbWUgPSAwOworCQlwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IHBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2M7CisJCWZvciAoaiA9IDA7ICBqIDwgcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsgaisrKSB7CisJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqICogXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemU7CisJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZTsKKwkJfQorCX0KKwlKT1QoNCwgImFsbG9jYXRpb24gb2YgJWkgc3RydWN0IHVyYiBkb25lLlxuIiwgayk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFNBVkUgUE9JTlRFUiBwZWFzeWNhcCBJTiBUSElTIElOVEVSRkFDRS4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIHBlYXN5Y2FwKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgVEhFIEFVRElPIERFVklDRSBDQU4gQkUgUkVHSVNURVJFRCBOT1csIEFTIElUIElTIFJFQURZLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmMgPSB1c2JfcmVnaXN0ZXJfZGV2KHB1c2JfaW50ZXJmYWNlLCAmZWFzeXNuZF9jbGFzcyk7CisJaWYgKDAgIT0gcmMpIHsKKwkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIE5VTEwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9IGVsc2UKKwkJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX2F1ZGlvKSsrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBMRVQgVEhFIFVTRVIgS05PVyBXSEFUIE5PREUgVEhFIEFVRElPIERFVklDRSBJUyBBVFRBQ0hFRCBUTy4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCVNBWSgiZWFzeXNuZCBhdHRhY2hlZCB0byBtaW5vciAjJWRcbiIsIHB1c2JfaW50ZXJmYWNlLT5taW5vcik7CisJYnJlYWs7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElOVEVSRkFDRVMgT1RIRVIgVEhBTiAwLCAxIEFORCAyIEFSRSBVTkVYUEVDVEVECisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2RlZmF1bHQ6IHsKKwlKT1QoNCwgIkVSUk9SOiB1bmV4cGVjdGVkIGludGVyZmFjZSAlaVxuIiwgYkludGVyZmFjZU51bWJlcik7CisJcmV0dXJuIC1FSU5WQUw7Cit9Cit9CitKT1QoNCwgImVuZHMgc3VjY2Vzc2Z1bGx5IGZvciBpbnRlcmZhY2UgJWlcbiIsIFwKKwkJCQlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXSEVOIFRISVMgRlVOQ1RJT04gSVMgQ0FMTEVEIFRIRSBERVZJQ0UgSEFTIEFMUkVBRFkgQkVFTiBQSFlTSUNBTExZCisgKiAgVU5QTFVHR0VELgorICogIEhFTkNFIHBlYXN5Y2FwLT5wdXNiX2RldmljZSBJUyBOTyBMT05HRVIgVkFMSUQgQU5EIE1VU1QgQkUgU0VUIFRPIE5VTEwuCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK2Vhc3ljYXBfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZXJmYWNlKQoreworc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqcHVzYl9ob3N0X2ludGVyZmFjZTsKK3N0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKnB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3I7CitfX3U4IGJJbnRlcmZhY2VOdW1iZXI7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CisKK3N0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7CitzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKK2ludCBtaW5vciwgbTsKKworSk9UKDQsICJcbiIpOworCitpZiAoKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopTlVMTCA9PSBwdXNiX2ludGVyZmFjZSkgeworCUpPVCg0LCAiRVJST1I6IHB1c2JfaW50ZXJmYWNlIGlzIE5VTExcbiIpOworCXJldHVybjsKK30KK3B1c2JfaG9zdF9pbnRlcmZhY2UgPSBwdXNiX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CitpZiAoKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKilOVUxMID09IHB1c2JfaG9zdF9pbnRlcmZhY2UpIHsKKwlKT1QoNCwgIkVSUk9SOiBwdXNiX2hvc3RfaW50ZXJmYWNlIGlzIE5VTExcbiIpOworCXJldHVybjsKK30KK3B1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgPSAmKHB1c2JfaG9zdF9pbnRlcmZhY2UtPmRlc2MpOworaWYgKChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICopTlVMTCA9PSBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yKSB7CisJSk9UKDQsICJFUlJPUjogcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpcyBOVUxMXG4iKTsKKwlyZXR1cm47Cit9CitiSW50ZXJmYWNlTnVtYmVyID0gcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZU51bWJlcjsKK21pbm9yID0gcHVzYl9pbnRlcmZhY2UtPm1pbm9yOworSk9UKDQsICJpbnRmWyVpXTogbWlub3I9JWlcbiIsIGJJbnRlcmZhY2VOdW1iZXIsIG1pbm9yKTsKKworcGVhc3ljYXAgPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50ZXJmYWNlKTsKK2lmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKQorCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworZWxzZSB7CisJcGVhc3ljYXAtPnB1c2JfZGV2aWNlID0gKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTDsKKwlzd2l0Y2ggKGJJbnRlcmZhY2VOdW1iZXIpIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwljYXNlIDA6IHsKKwkJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7CisJCQlKT1QoNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7CisJCQltID0gMDsKKwkJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKQorCQkJCXsKKwkJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIFwKKwkJCQkJCXN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKKwkJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJCWlmICgoc3RydWN0IHVyYiAqKU5VTEwgIT0gXAorCQkJCQkJCXBkYXRhX3VyYi0+cHVyYikgeworCQkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CisJCQkJCQltKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlKT1QoNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKKwkJfSBlbHNlCisJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkIGlzIE5VTExcbiIpOworCQlicmVhazsKKwl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJY2FzZSAyOiB7CisJCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgeworCQkJSk9UKDQsICJraWxsaW5nIGF1ZGlvIHVyYnNcbiIpOworCQkJbSA9IDA7CisJCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIFwKKwkJCQkJCShwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgeworCQkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAorCQkJCQkJc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOworCQkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCisJCQkJCQkJcGRhdGFfdXJiLT5wdXJiKSB7CisJCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKKwkJCQkJCW0rKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUpPVCg0LCAiJWkgYXVkaW8gdXJicyBraWxsZWRcbiIsIG0pOworCQl9IGVsc2UKKwkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7CisJCWJyZWFrOworCX0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgREVSRUdJU1RFUgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N3aXRjaCAoYkludGVyZmFjZU51bWJlcikgeworY2FzZSAwOiB7CisjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkKKwlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOworCX0gZWxzZSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXVzYl9kZXJlZ2lzdGVyX2RldihwdXNiX2ludGVyZmFjZSwgJmVhc3ljYXBfY2xhc3MpOworCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07CisKKwkJSk9UKDQsICJpbnRmWyVpXTogdXNiX2RlcmVnaXN0ZXJfZGV2KClcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCVNBWSgiZWFzeWNhcCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOworCX0KKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKwlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkKKwkJU0FZKCJFUlJPUjogcGVhc3ljYXAgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwllbHNlIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGVhc3ljYXAtPnB2aWRlb19kZXZpY2UpOworCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07CisJCXVubG9ja19rZXJuZWwoKTsKKwkJSk9UKDQsICJ1bnJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIFwKKwkJCQkJCQlwdmlkZW9fZGV2aWNlLT5taW5vcik7CisJfQorLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisJYnJlYWs7Cit9CitjYXNlIDI6IHsKKwlsb2NrX2tlcm5lbCgpOworCisJdXNiX2RlcmVnaXN0ZXJfZGV2KHB1c2JfaW50ZXJmYWNlLCAmZWFzeXNuZF9jbGFzcyk7CisJaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgIT0gcGVhc3ljYXApCisJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbyktLTsKKworCUpPVCg0LCAiaW50ZlslaV06IHVzYl9kZXJlZ2lzdGVyX2RldigpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlTQVkoImVhc3lzbmQgZGV0YWNoZWQgZnJvbSBtaW5vciAjJWRcbiIsIG1pbm9yKTsKKwlicmVhazsKK30KK2RlZmF1bHQ6CisJYnJlYWs7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIENBTEwgZWFzeWNhcF9kZWxldGUoKSBJRiBOTyBSRU1BSU5JTkcgUkVGRVJFTkNFUyBUTyBwZWFzeWNhcAorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGhhcyBiZWNvbWUgTlVMTFxuIik7CisJU0FZKCJjYW5ub3QgY2FsbCBrcmVmX3B1dCgpXG4iKTsKKwlTQVkoImVuZGluZyB1bnN1Y2Nlc3NmdWxseTogbWF5IGNhdXNlIG1lbW9yeSBsZWFrXG4iKTsKKwlyZXR1cm47Cit9CitpZiAoIXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXIpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyIGlzIHplcm8gIiBcCisJCQkJCQkic28gY2Fubm90IGNhbGwga3JlZl9wdXQoKVxuIik7CisJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHk6IG1heSBjYXVzZSBtZW1vcnkgbGVha1xuIik7CisJcmV0dXJuOworfQorSk9UKDQsICJpbnRmWyVpXToga3JlZl9wdXQoKSB3aXRoICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKKwkJYkludGVyZmFjZU51bWJlciwgKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKK2tyZWZfcHV0KCZwZWFzeWNhcC0+a3JlZiwgZWFzeWNhcF9kZWxldGUpOworSk9UKDQsICJpbnRmWyVpXToga3JlZl9wdXQoKSBkb25lLlxuIiwgYkludGVyZmFjZU51bWJlcik7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0pPVCg0LCAiZW5kc1xuIik7CityZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgX19pbml0CitlYXN5Y2FwX21vZHVsZV9pbml0KHZvaWQpCit7CitpbnQgcmVzdWx0OworCitTQVkoIj09PT09PT09ZWFzeWNhcD09PT09PT1cbiIpOworSk9UKDQsICJiZWdpbnMuICAlaT1kZWJ1Z1xuIiwgZWFzeWNhcF9kZWJ1Zyk7CitTQVkoInZlcnNpb246ICIgRUFTWUNBUF9EUklWRVJfVkVSU0lPTiAiXG4iKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUkVHSVNURVIgVEhJUyBEUklWRVIgV0lUSCBUSEUgVVNCIFNVQlNZVEVNLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitKT1QoNCwgInJlZ2lzdGVyaW5nIGRyaXZlciBlYXN5Y2FwXG4iKTsKKworcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZlYXN5Y2FwX3VzYl9kcml2ZXIpOworaWYgKDAgIT0gcmVzdWx0KQorCVNBWSgiRVJST1I6ICB1c2JfcmVnaXN0ZXIgcmV0dXJuZWQgJWlcbiIsIHJlc3VsdCk7CisKK0pPVCg0LCAiZW5kc1xuIik7CityZXR1cm4gcmVzdWx0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX2V4aXQKK2Vhc3ljYXBfbW9kdWxlX2V4aXQodm9pZCkKK3sKK0pPVCg0LCAiYmVnaW5zXG4iKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBERVJFR0lTVEVSIFRISVMgRFJJVkVSIFdJVEggVEhFIFVTQiBTVUJTWVRFTS4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordXNiX2RlcmVnaXN0ZXIoJmVhc3ljYXBfdXNiX2RyaXZlcik7CisKK0pPVCg0LCAiZW5kc1xuIik7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK21vZHVsZV9pbml0KGVhc3ljYXBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoZWFzeWNhcF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlIuTS4gVGhvbWFzIDxybXRob21hc0BzY2lvbHVzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTihFQVNZQ0FQX0RSSVZFUl9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OKTsKKyNpZiBkZWZpbmVkKEVBU1lDQVBfREVCVUcpCitNT0RVTEVfUEFSTV9ERVNDKGVhc3ljYXBfZGVidWcsICJkZWJ1ZzogMCAoZGVmYXVsdCksIDEsIDIsLi4uIik7CisjZW5kaWYgLypFQVNZQ0FQX0RFQlVHKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ5NDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jCkBAIC0wLDAgKzEsNDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBlYXN5Y2FwX3NldHRpbmdzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgUi5NLiBUaG9tYXMgIDxybXRob21hc0BzY2lvbHVzLm9yZz4KKyAqCisgKgorICogIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGUgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZWFzeWNhcC5oIgorI2luY2x1ZGUgImVhc3ljYXBfZGVidWcuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBUSEUgTEVBU1QgU0lHTklGSUNBTlQgQklUIE9GIGVhc3ljYXBfc3RhbmRhcmQubWFzayBIQVMgTUVBTklORzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gMjUgZnBzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAxID0+IDMwIGZwcworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjb25zdCBzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBlYXN5Y2FwX3N0YW5kYXJkW10gPSB7Cit7CisubWFzayA9IDB4MDAwRiAmIFBBTF9CR0hJTiAsCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBQQUxfQkdISU4sCisJLmlkID0gKFY0TDJfU1REX1BBTF9CIHwgVjRMMl9TVERfUEFMX0cgfCBWNEwyX1NURF9QQUxfSCB8IFwKKwkJCQkJVjRMMl9TVERfUEFMX0kgfCBWNEwyX1NURF9QQUxfTiksCisJLm5hbWUgPSAiUEFMX0JHSElOIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgMjV9LAorCS5mcmFtZWxpbmVzID0gNjI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorCX0KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4MDAwRiAmIE5UU0NfTl80NDMgLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19OXzQ0MywKKwkuaWQgPSBWNEwyX1NURF9VTktOT1dOLAorCS5uYW1lID0gIk5UU0NfTl80NDMiLAorCS5mcmFtZXBlcmlvZCA9IHsxLCAyNX0sCisJLmZyYW1lbGluZXMgPSA0ODAsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDAwMEYgJiBQQUxfTmMgLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX05jLAorCS5pZCA9IFY0TDJfU1REX1BBTF9OYywKKwkubmFtZSA9ICJQQUxfTmMiLAorCS5mcmFtZXBlcmlvZCA9IHsxLCAyNX0sCisJLmZyYW1lbGluZXMgPSA2MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDAwMEYgJiBOVFNDX04gLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19OLAorCS5pZCA9IFY0TDJfU1REX1VOS05PV04sCisJLm5hbWUgPSAiTlRTQ19OIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgMjV9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHgwMDBGICYgU0VDQU0gLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gU0VDQU0sCisJLmlkID0gVjRMMl9TVERfU0VDQU0sCisJLm5hbWUgPSAiU0VDQU0iLAorCS5mcmFtZXBlcmlvZCA9IHsxLCAyNX0sCisJLmZyYW1lbGluZXMgPSA2MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDAwMEYgJiBOVFNDX00gLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19NLAorCS5pZCA9IFY0TDJfU1REX05UU0NfTSwKKwkubmFtZSA9ICJOVFNDX00iLAorCS5mcmFtZXBlcmlvZCA9IHsxLCAzMH0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDAwMEYgJiBOVFNDX01fSlAgLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19NX0pQLAorCS5pZCA9IFY0TDJfU1REX05UU0NfTV9KUCwKKwkubmFtZSA9ICJOVFNDX01fSlAiLAorCS5mcmFtZXBlcmlvZCA9IHsxLCAzMH0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDAwMEYgJiBQQUxfNjAgLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMXzYwLAorCS5pZCA9IFY0TDJfU1REX1BBTF82MCwKKwkubmFtZSA9ICJQQUxfNjAiLAorCS5mcmFtZXBlcmlvZCA9IHsxLCAzMH0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDAwMEYgJiBOVFNDXzQ0MyAsCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDXzQ0MywKKwkuaWQgPSBWNEwyX1NURF9OVFNDXzQ0MywKKwkubmFtZSA9ICJOVFNDXzQ0MyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDMwfSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4MDAwRiAmIFBBTF9NICwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IFBBTF9NLAorCS5pZCA9IFY0TDJfU1REX1BBTF9NLAorCS5uYW1lID0gIlBBTF9NIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgMzB9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHhGRkZGCit9Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBUSEUgMTYtQklUIGVhc3ljYXBfZm9ybWF0Lm1hc2sgSEFTIE1FQU5JTkc6CisgKiAgICAobGVhc3Qgc2lnbmlmaWNhbnQpIEJJVCAgMDogICAgIDAgPT4gUEFMLCAyNSBGUFM7ICAgMSA9PiBOVFNDLCAzMCBGUFMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQklUUyAxLTM6ICAgUkVTRVJWRUQgRk9SIERJRkZFUkVOVElBVElORyBTVEFOREFSRFMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQklUUyA0LTc6ICAgTlVNQkVSIE9GIEJZVEVTIFBFUiBQSVhFTAorICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgIDg6ICAgICAwID0+IE5BVElWRSBCWVRFIE9SREVSOyAgMSA9PiBTV0FQUEVECisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgOS0xMDogIFJFU0VSVkVEIEZPUiBPVEhFUiBCWVRFIFBFUk1VVEFUSU9OUworICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTE6ICAgICAwID0+IFVOREVDSU1BVEVEOyAgMSA9PiBERUNJTUFURUQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQklUIDEyOiAgICAgMCA9PiBPRkZFUiBGUkFNRVM7IDEgPT4gT0ZGRVIgRklFTERTCisgKiAgICAgKG1vc3Qgc2lnbmlmaWNhbnQpIEJJVFMgMTMtMTU6IFJFU0VSVkVEIEZPUiBPVEhFUiBGSUVMRCBPUkRFUiBPUFRJT05TCisgKiAgSVQgRk9MTE9XUyBUSEFUOgorICogICAgIGJ5dGVzcGVycGl4ZWwgSVMgICAgICAgICAoKDB4MDBGMCAmIGVhc3ljYXBfZm9ybWF0Lm1hc2spID4+IDQpCisgKiAgICAgYnl0ZXN3YXBvcmRlciBJUyB0cnVlIElGICgwICE9ICgweDAxMDAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSkKKyAqCisgKiAgICAgZGVjaW1hdGVwaXhlbCBJUyB0cnVlIElGICgwICE9ICgweDA4MDAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSkKKyAqCisgKiAgICAgICBvZmZlcmZpZWxkcyBJUyB0cnVlIElGICgwICE9ICgweDEwMDAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSkKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgZWFzeWNhcF9mb3JtYXQgZWFzeWNhcF9mb3JtYXRbMSArIFNFVFRJTkdTX01BTlldOworCitpbnQKK2ZpbGxpbl9mb3JtYXRzKHZvaWQpCit7CitpbnQgaSwgaiwgaywgbSwgbjsKK19fdTMyIHdpZHRoLCBoZWlnaHQsIHBpeGVsZm9ybWF0LCBieXRlc3BlcmxpbmUsIHNpemVpbWFnZTsKK19fdTMyIGZpZWxkLCBjb2xvcnNwYWNlOworX191MTYgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQ7CitjaGFyIG5hbWUxWzMyXSwgbmFtZTJbMzJdLCBuYW1lM1szMl0sIG5hbWU0WzMyXTsKKworZm9yIChpID0gMCwgbiA9IDA7IGkgPCBTVEFOREFSRF9NQU5ZOyBpKyspIHsKKwltYXNrMSA9IDB4MDAwMDsKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIFBBTF9CR0hJTjogeworCQltYXNrMSA9IFBBTF9CR0hJTjsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF9CR0hJTiIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFNFQ0FNOiB7CisJCW1hc2sxID0gU0VDQU07CisJCXN0cmNweSgmbmFtZTFbMF0sICJTRUNBTSIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFBBTF9OYzogeworCQltYXNrMSA9IFBBTF9OYzsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF9OYyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFBBTF82MDogeworCQltYXNrMSA9IFBBTF82MDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF82MCIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFBBTF9NOiB7CisJCW1hc2sxID0gUEFMX007CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfTSIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfTTogeworCQltYXNrMSA9IE5UU0NfTTsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTSIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ180NDM6IHsKKwkJbWFzazEgPSBOVFNDXzQ0MzsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfNDQzIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CisJY2FzZSBOVFNDX01fSlA6IHsKKwkJbWFzazEgPSBOVFNDX01fSlA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX01fSlAiKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfTjogeworCQltYXNrMSA9IE5UU0NfTTsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTiIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ19OXzQ0MzogeworCQltYXNrMSA9IE5UU0NfTl80NDM7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX05fNDQzIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaiA9IDA7IGogPCBSRVNPTFVUSU9OX01BTlk7IGorKykgeworCQltYXNrMiA9IDB4MDAwMDsKKwkJc3dpdGNoIChqKSB7CisJCWNhc2UgQVRfNzIweDU3NjogeworCQkJaWYgKDB4MSAmIG1hc2sxKQorCQkJCWNvbnRpbnVlOworCQkJc3RyY3B5KCZuYW1lMlswXSwgIl9BVF83MjB4NTc2Iik7CisJCQl3aWR0aCA9IDcyMDsgaGVpZ2h0ID0gNTc2OyBicmVhazsKKwkJfQorCQljYXNlIEFUXzcwNHg1NzY6IHsKKwkJCWlmICgweDEgJiBtYXNrMSkKKwkJCQljb250aW51ZTsKKwkJCXN0cmNweSgmbmFtZTJbMF0sICJfQVRfNzA0eDU3NiIpOworCQkJd2lkdGggPSA3MDQ7IGhlaWdodCA9IDU3NjsgYnJlYWs7CisJCX0KKwkJY2FzZSBBVF82NDB4NDgwOiB7CisJCQlzdHJjcHkoJm5hbWUyWzBdLCAiX0FUXzY0MHg0ODAiKTsKKwkJCXdpZHRoID0gNjQwOyBoZWlnaHQgPSA0ODA7IGJyZWFrOworCQl9CisJCWNhc2UgQVRfNzIweDQ4MDogeworCQkJaWYgKCEoMHgxICYgbWFzazEpKQorCQkJCWNvbnRpbnVlOworCQkJc3RyY3B5KCZuYW1lMlswXSwgIl9BVF83MjB4NDgwIik7CisJCQl3aWR0aCA9IDcyMDsgaGVpZ2h0ID0gNDgwOyBicmVhazsKKwkJfQorCQljYXNlIEFUXzM2MHgyODg6IHsKKwkJCWlmICgweDEgJiBtYXNrMSkKKwkJCQljb250aW51ZTsKKwkJCXN0cmNweSgmbmFtZTJbMF0sICJfQVRfMzYweDI4OCIpOworCQkJd2lkdGggPSAzNjA7IGhlaWdodCA9IDI4ODsgbWFzazIgPSAweDA4MDA7IGJyZWFrOworCQl9CisJCWNhc2UgQVRfMzIweDI0MDogeworCQkJc3RyY3B5KCZuYW1lMlswXSwgIl9BVF8zMjB4MjQwIik7CisJCQl3aWR0aCA9IDMyMDsgaGVpZ2h0ID0gMjQwOyBtYXNrMiA9IDB4MDgwMDsgYnJlYWs7CisJCX0KKwkJY2FzZSBBVF8zNjB4MjQwOiB7CisJCQlpZiAoISgweDEgJiBtYXNrMSkpCisJCQkJY29udGludWU7CisJCQlzdHJjcHkoJm5hbWUyWzBdLCAiX0FUXzM2MHgyNDAiKTsKKwkJCXdpZHRoID0gMzYwOyBoZWlnaHQgPSAyNDA7IG1hc2syID0gMHgwODAwOyBicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0yOworCQl9CisKKwkJZm9yIChrID0gMDsgayA8IFBJWEVMRk9STUFUX01BTlk7IGsrKykgeworCQkJbWFzazMgPSAweDAwMDA7CisJCQlzd2l0Y2ggKGspIHsKKwkJCWNhc2UgRk1UX1VZVlk6IHsKKwkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9VWVZZKSk7CisJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfVVlWWTsKKwkJCQltYXNrMyB8PSAoMHgwMiA8PCA0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgRk1UX1lVWTI6IHsKKwkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9ZVVkyKSk7CisJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKKwkJCQltYXNrMyB8PSAoMHgwMiA8PCA0KTsKKwkJCQltYXNrMyB8PSAweDAxMDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEZNVF9SR0IyNDogeworCQkJCXN0cmNweSgmbmFtZTNbMF0sICJfIiBTVFJJTkdJWkUoRk1UX1JHQjI0KSk7CisJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCMjQ7CisJCQkJbWFzazMgfD0gKDB4MDMgPDwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEZNVF9SR0IzMjogeworCQkJCXN0cmNweSgmbmFtZTNbMF0sICJfIiBTVFJJTkdJWkUoRk1UX1JHQjMyKSk7CisJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCMzI7CisJCQkJbWFzazMgfD0gKDB4MDQgPDwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEZNVF9CR1IyNDogeworCQkJCXN0cmNweSgmbmFtZTNbMF0sICJfIiBTVFJJTkdJWkUoRk1UX0JHUjI0KSk7CisJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfQkdSMjQ7CisJCQkJbWFzazMgfD0gKDB4MDMgPDwgNCk7CisJCQkJbWFzazMgfD0gMHgwMTAwOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBGTVRfQkdSMzI6IHsKKwkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9CR1IzMikpOworCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjMyOworCQkJCW1hc2szIHw9ICgweDA0IDw8IDQpOworCQkJCW1hc2szIHw9IDB4MDEwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC0zOworCQkJfQorCQkJYnl0ZXNwZXJsaW5lID0gd2lkdGggKiAoKG1hc2szICYgMHgwMEYwKSA+PiA0KTsKKwkJCXNpemVpbWFnZSA9ICBieXRlc3BlcmxpbmUgKiBoZWlnaHQ7CisKKwkJCWZvciAobSA9IDA7IG0gPCBJTlRFUkxBQ0VfTUFOWTsgbSsrKSB7CisJCQkJbWFzazQgPSAweDAwMDA7CisJCQkJc3dpdGNoIChtKSB7CisJCQkJY2FzZSBGSUVMRF9OT05FOiB7CisJCQkJCXN0cmNweSgmbmFtZTRbMF0sICItbiIpOworCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgRklFTERfSU5URVJMQUNFRDogeworCQkJCQlzdHJjcHkoJm5hbWU0WzBdLCAiLWkiKTsKKwkJCQkJZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEZJRUxEX0FMVEVSTkFURTogeworCQkJCQlzdHJjcHkoJm5hbWU0WzBdLCAiLWEiKTsKKwkJCQkJbWFzazQgfD0gMHgxMDAwOworCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfQUxURVJOQVRFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC00OworCQkJCX0KKwkJCQlpZiAoU0VUVElOR1NfTUFOWSA8PSBuKQorCQkJCQlyZXR1cm4gLTU7CisJCQkJc3RyY3B5KCZlYXN5Y2FwX2Zvcm1hdFtuXS5uYW1lWzBdLCAmbmFtZTFbMF0pOworCQkJCXN0cmNhdCgmZWFzeWNhcF9mb3JtYXRbbl0ubmFtZVswXSwgJm5hbWUyWzBdKTsKKwkJCQlzdHJjYXQoJmVhc3ljYXBfZm9ybWF0W25dLm5hbWVbMF0sICZuYW1lM1swXSk7CisJCQkJc3RyY2F0KCZlYXN5Y2FwX2Zvcm1hdFtuXS5uYW1lWzBdLCAmbmFtZTRbMF0pOworCQkJCWVhc3ljYXBfZm9ybWF0W25dLm1hc2sgPSBcCisJCQkJCQltYXNrMSB8IG1hc2syIHwgbWFzazMgfCBtYXNrNDsKKwkJCQllYXN5Y2FwX2Zvcm1hdFtuXS52NGwyX2Zvcm1hdFwKKwkJCQkJLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQkJZWFzeWNhcF9mb3JtYXRbbl0udjRsMl9mb3JtYXRcCisJCQkJCS5mbXQucGl4LndpZHRoID0gd2lkdGg7CisJCQkJZWFzeWNhcF9mb3JtYXRbbl0udjRsMl9mb3JtYXRcCisJCQkJCS5mbXQucGl4LmhlaWdodCA9IGhlaWdodDsKKwkJCQllYXN5Y2FwX2Zvcm1hdFtuXS52NGwyX2Zvcm1hdFwKKwkJCQkJLmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKKwkJCQllYXN5Y2FwX2Zvcm1hdFtuXS52NGwyX2Zvcm1hdFwKKwkJCQkJLmZtdC5waXguZmllbGQgPSBmaWVsZDsKKwkJCQllYXN5Y2FwX2Zvcm1hdFtuXS52NGwyX2Zvcm1hdFwKKwkJCQkJLmZtdC5waXguYnl0ZXNwZXJsaW5lID0gYnl0ZXNwZXJsaW5lOworCQkJCWVhc3ljYXBfZm9ybWF0W25dLnY0bDJfZm9ybWF0XAorCQkJCQkuZm10LnBpeC5zaXplaW1hZ2UgPSBzaXplaW1hZ2U7CisJCQkJZWFzeWNhcF9mb3JtYXRbbl0udjRsMl9mb3JtYXRcCisJCQkJCS5mbXQucGl4LmNvbG9yc3BhY2UgPSBjb2xvcnNwYWNlOworCQkJCWVhc3ljYXBfZm9ybWF0W25dLnY0bDJfZm9ybWF0XAorCQkJCQkuZm10LnBpeC5wcml2ID0gMDsKKwkJCQluKys7CisJCQl9CisJCX0KKwl9Cit9CitpZiAoKDEgKyBTRVRUSU5HU19NQU5ZKSA8PSBuKQorCXJldHVybiAtNjsKK2Vhc3ljYXBfZm9ybWF0W25dLm1hc2sgPSAweEZGRkY7CityZXR1cm4gbjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBlYXN5Y2FwX2NvbnRyb2xbXSA9IFwKKyB7eworLmlkICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKy50eXBlICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisubmFtZSAgICAgPSAiQnJpZ2h0bmVzcyIsCisubWluaW11bSAgPSAwLAorLm1heGltdW0gID0gMjU1LAorLnN0ZXAgICAgID0gIDEsCisuZGVmYXVsdF92YWx1ZSA9IFNBQV8wQV9ERUZBVUxULAorLmZsYWdzICAgID0gMCwKKy5yZXNlcnZlZCA9IHswLCAwfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5pZCAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAorLnR5cGUgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKy5uYW1lICAgICA9ICJDb250cmFzdCIsCisubWluaW11bSAgPSAwLAorLm1heGltdW0gID0gMjU1LAorLnN0ZXAgICAgID0gICAxLAorLmRlZmF1bHRfdmFsdWUgPSBTQUFfMEJfREVGQVVMVCArIDEyOCwKKy5mbGFncyAgICA9IDAsCisucmVzZXJ2ZWQgPSB7MCwgMH0KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisuaWQgICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorLnR5cGUgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKy5uYW1lICAgICA9ICJTYXR1cmF0aW9uIiwKKy5taW5pbXVtICA9IDAsCisubWF4aW11bSAgPSAyNTUsCisuc3RlcCAgICAgPSAgIDEsCisuZGVmYXVsdF92YWx1ZSA9IFNBQV8wQ19ERUZBVUxUICsgMTI4LAorLmZsYWdzICAgID0gMCwKKy5yZXNlcnZlZCA9IHswLCAwfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5pZCAgICAgICA9IFY0TDJfQ0lEX0hVRSwKKy50eXBlICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisubmFtZSAgICAgPSAiSHVlIiwKKy5taW5pbXVtICA9IDAsCisubWF4aW11bSAgPSAyNTUsCisuc3RlcCAgICAgPSAgIDEsCisuZGVmYXVsdF92YWx1ZSA9IFNBQV8wRF9ERUZBVUxUICsgMTI4LAorLmZsYWdzICAgID0gMCwKKy5yZXNlcnZlZCA9IHswLCAwfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5pZCAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKKy50eXBlICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisubmFtZSAgICAgPSAiVm9sdW1lIiwKKy5taW5pbXVtICA9IDAsCisubWF4aW11bSAgPSAzMSwKKy5zdGVwICAgICA9ICAgMSwKKy5kZWZhdWx0X3ZhbHVlID0gMTYsCisuZmxhZ3MgICAgPSAwLAorLnJlc2VydmVkID0gezAsIDB9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLmlkICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKy50eXBlICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisubmFtZSAgICAgPSAiTXV0ZSIsCisuZGVmYXVsdF92YWx1ZSA9IHRydWUsCisuZmxhZ3MgICAgPSAwLAorLnJlc2VydmVkID0gezAsIDB9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLmlkID0gMHhGRkZGRkZGRgorfQorIH07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NjJiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIGVhc3ljYXBfc291bmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIEF1ZGlvIGRyaXZlciBmb3IgRWFzeUNBUCBVU0IyLjAgVmlkZW8gQ2FwdHVyZSBEZXZpY2UgREM2MCAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBSLk0uIFRob21hcyAgPHJtdGhvbWFzQHNjaW9sdXMub3JnPgorICoKKyAqCisgKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoZSBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJlYXN5Y2FwLmgiCisjaW5jbHVkZSAiZWFzeWNhcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImVhc3ljYXBfc291bmQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBPTiBDT01QTEVUSU9OIE9GIEFOIEFVRElPIFVSQiBJVFMgREFUQSBJUyBDT1BJRUQgVE8gVEhFIEFVRElPIEJVRkZFUlMKKyAqICBQUk9WSURFRCBwZWFzeWNhcC0+YXVkaW9faWRsZSBJUyBaRVIwLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCisgKiAgSVQgSVMgUkVTVUJNSVRURUQgUFJPVklERUQgcGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nIElTIE5PVCBaRVJPLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitlYXN5c25kX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCit7CitzdGF0aWMgaW50IG10Oworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworc3RydWN0IGRhdGFfYnVmZmVyICpwYXVkaW9fYnVmZmVyOworY2hhciBlcnJidWZbMTZdOworX191OCAqcDEsICpwMjsKK19fczE2IHMxNjsKK2ludCBpLCBqLCBtb3JlLCBtdWNoLCBsZWFwLCByYzsKKyNpZiBkZWZpbmVkKFVQU0FNUExFKQoraW50IGs7CitfX3MxNiBvbGRhdWRpbywgbmV3YXVkaW8sIGRlbHRhOworI2VuZGlmIC8qVVBTQU1QTEUqLworCitKT1QoMTYsICJcbiIpOworCitpZiAoTlVMTCA9PSBwdXJiKSB7CisJU0FZKCJFUlJPUjogcHVyYiBpcyBOVUxMXG4iKTsKKwlyZXR1cm47Cit9CitwZWFzeWNhcCA9IHB1cmItPmNvbnRleHQ7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybjsKK30KK211Y2ggPSAwOworCisKK2lmIChwZWFzeWNhcC0+YXVkaW9faWRsZSkgeworCUpPVCgxNiwgIiVpPWF1ZGlvX2lkbGUgICVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCisJCQlwZWFzeWNhcC0+YXVkaW9faWRsZSwgcGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKTsKKwlpZiAocGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKSB7CisJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT1hdWRpb19pZGxlLCAiIFwKKwkJCQkJInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGggcmM6XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOworCQkJc3dpdGNoIChyYykgeworCQkJY2FzZSAtRU5PTUVNOiB7CisJCQkJU0FZKCJFTk9NRU1cbiIpOyAgICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVOT0RFVjogeworCQkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FTlhJTzogeworCQkJCVNBWSgiRU5YSU9cbiIpOyAgICAgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FSU5WQUw6IHsKKwkJCQlTQVkoIkVJTlZBTFxuIik7ICAgIGJyZWFrOworCQkJfQorCQkJY2FzZSAtRUFHQUlOOiB7CisJCQkJU0FZKCJFQUdBSU5cbiIpOyAgICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVGQklHOiB7CisJCQkJU0FZKCJFRkJJR1xuIik7ICAgICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVQSVBFOiB7CisJCQkJU0FZKCJFUElQRVxuIik7ICAgICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVNU0dTSVpFOiB7CisJCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVOT1NQQzogeworCQkJCVNBWSgiRU5PU1BDXG4iKTsgIGJyZWFrOworCQkJfQorCQkJZGVmYXVsdDogeworCQkJCVNBWSgiMHglMDhYXG4iLCByYyk7IGJyZWFrOworCQkJfQorCQkJfQorCQl9CisJfQorcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKHB1cmItPnN0YXR1cykgeworCWlmICgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgeworCQlKT1QoMTYsICJpbW1lZGlhdGUgcmV0dXJuIGJlY2F1c2UgLUVTSFVURE9XTj1wdXJiLT5zdGF0dXNcbiIpOworCQlyZXR1cm47CisJfQorCVNBWSgiRVJST1I6IG5vbi16ZXJvIHVyYiBzdGF0dXM6XG4iKTsKKwlzd2l0Y2ggKHB1cmItPnN0YXR1cykgeworCWNhc2UgLUVJTlBST0dSRVNTOiB7CisJCVNBWSgiLUVJTlBST0dSRVNTXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVOT1NSOiB7CisJCVNBWSgiLUVOT1NSXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVQSVBFOiB7CisJCVNBWSgiLUVQSVBFXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVPVkVSRkxPVzogeworCQlTQVkoIi1FT1ZFUkZMT1dcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRVBST1RPOiB7CisJCVNBWSgiLUVQUk9UT1xuIik7IGJyZWFrOworCX0KKwljYXNlIC1FSUxTRVE6IHsKKwkJU0FZKCItRUlMU0VRXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVUSU1FRE9VVDogeworCQlTQVkoIi1FVElNRURPVVRcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU1TR1NJWkU6IHsKKwkJU0FZKCItRU1TR1NJWkVcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU9QTk9UU1VQUDogeworCQlTQVkoIi1FT1BOT1RTVVBQXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVQRk5PU1VQUE9SVDogeworCQlTQVkoIi1FUEZOT1NVUFBPUlRcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRUFGTk9TVVBQT1JUOiB7CisJCVNBWSgiLUVBRk5PU1VQUE9SVFxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FQUREUklOVVNFOiB7CisJCVNBWSgiLUVBRERSSU5VU0VcbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRUFERFJOT1RBVkFJTDogeworCQlTQVkoIi1FQUREUk5PVEFWQUlMXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVOT0JVRlM6IHsKKwkJU0FZKCItRU5PQlVGU1xuIik7IGJyZWFrOworCX0KKwljYXNlIC1FSVNDT05OOiB7CisJCVNBWSgiLUVJU0NPTk5cbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU5PVENPTk46IHsKKwkJU0FZKCItRU5PVENPTk5cbiIpOyBicmVhazsKKwl9CisJY2FzZSAtRVNIVVRET1dOOiB7CisJCVNBWSgiLUVTSFVURE9XTlxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FTk9FTlQ6IHsKKwkJU0FZKCItRU5PRU5UXG4iKTsgYnJlYWs7CisJfQorCWNhc2UgLUVDT05OUkVTRVQ6IHsKKwkJU0FZKCItRUNPTk5SRVNFVFxuIik7IGJyZWFrOworCX0KKwljYXNlIC1FTk9TUEM6IHsKKwkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKKwl9CisJfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBSRVNVQk1JVCBUSElTIFVSQiBBRlRFUiBBTiBFUlJPUgorICoKKyAqICAoVEhJUyBJUyBEVVBMSUNBVEUgQ09ERSBUTyBSRURVQ0UgSU5ERU5UQVRJT04gT0YgVEhFIE5PLUVSUk9SIFBBVEgpCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAocGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKSB7CisJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT1hdWRpb19pZGxlLCB1c2Jfc3VibWl0X3VyYigpICIKKwkJCQkiZmFpbGVkIHdpdGggcmM6XG4iLCBwZWFzeWNhcC0+YXVkaW9faWRsZSk7CisJCQlzd2l0Y2ggKHJjKSB7CisJCQljYXNlIC1FTk9NRU06IHsKKwkJCQlTQVkoIkVOT01FTVxuIik7ICAgIGJyZWFrOworCQkJfQorCQkJY2FzZSAtRU5PREVWOiB7CisJCQkJU0FZKCJFTk9ERVZcbiIpOyAgICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVOWElPOiB7CisJCQkJU0FZKCJFTlhJT1xuIik7ICAgICBicmVhazsKKwkJCX0KKwkJCWNhc2UgLUVJTlZBTDogeworCQkJCVNBWSgiRUlOVkFMXG4iKTsgICAgYnJlYWs7CisJCQl9CisJCQljYXNlIC1FQUdBSU46IHsKKwkJCQlTQVkoIkVBR0FJTlxuIik7ICAgIGJyZWFrOworCQkJfQorCQkJY2FzZSAtRUZCSUc6IHsKKwkJCQlTQVkoIkVGQklHXG4iKTsgICAgIGJyZWFrOworCQkJfQorCQkJY2FzZSAtRVBJUEU6IHsKKwkJCQlTQVkoIkVQSVBFXG4iKTsgICAgIGJyZWFrOworCQkJfQorCQkJY2FzZSAtRU1TR1NJWkU6IHsKKwkJCQlTQVkoIkVNU0dTSVpFXG4iKTsgIGJyZWFrOworCQkJfQorCQkJZGVmYXVsdDogeworCQkJCVNBWSgiMHglMDhYXG4iLCByYyk7IGJyZWFrOworCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUFJPQ0VFRCBIRVJFIFdIRU4gTk8gRVJST1IKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVBTQU1QTEUpCitvbGRhdWRpbyA9IHBlYXN5Y2FwLT5vbGRhdWRpbzsKKyNlbmRpZiAvKlVQU0FNUExFKi8KKworZm9yIChpID0gMDsgIGkgPCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJc3dpdGNoIChwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpIHsKKwljYXNlICAwOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiT0siKTsgYnJlYWs7CisJfQorCWNhc2UgLUVOT0VOVDogeworCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9FTlQiKTsgYnJlYWs7CisJfQorCWNhc2UgLUVJTlBST0dSRVNTOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVJTlBST0dSRVNTIik7IGJyZWFrOworCX0KKwljYXNlIC1FUFJPVE86IHsKKwkJc3RyY3B5KCZlcnJidWZbMF0sICItRVBST1RPIik7IGJyZWFrOworCX0KKwljYXNlIC1FSUxTRVE6IHsKKwkJc3RyY3B5KCZlcnJidWZbMF0sICItRUlMU0VRIik7IGJyZWFrOworCX0KKwljYXNlIC1FVElNRTogeworCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FVElNRSIpOyBicmVhazsKKwl9CisJY2FzZSAtRVRJTUVET1VUOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVUSU1FRE9VVCIpOyBicmVhazsKKwl9CisJY2FzZSAtRVBJUEU6IHsKKwkJc3RyY3B5KCZlcnJidWZbMF0sICItRVBJUEUiKTsgYnJlYWs7CisJfQorCWNhc2UgLUVDT01NOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVDT01NIik7IGJyZWFrOworCX0KKwljYXNlIC1FTk9TUjogeworCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9TUiIpOyBicmVhazsKKwl9CisJY2FzZSAtRU9WRVJGTE9XOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVPVkVSRkxPVyIpOyBicmVhazsKKwl9CisJY2FzZSAtRVJFTU9URUlPOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVSRU1PVEVJTyIpOyBicmVhazsKKwl9CisJY2FzZSAtRU5PREVWOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT0RFViIpOyBicmVhazsKKwl9CisJY2FzZSAtRVhERVY6IHsKKwkJc3RyY3B5KCZlcnJidWZbMF0sICItRVhERVYiKTsgYnJlYWs7CisJfQorCWNhc2UgLUVJTlZBTDogeworCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSU5WQUwiKTsgYnJlYWs7CisJfQorCWNhc2UgLUVDT05OUkVTRVQ6IHsKKwkJc3RyY3B5KCZlcnJidWZbMF0sICItRUNPTk5SRVNFVCIpOyBicmVhazsKKwl9CisJY2FzZSAtRU5PU1BDOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT1NQQyIpOyBicmVhazsKKwl9CisJY2FzZSAtRVNIVVRET1dOOiB7CisJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVTSFVURE9XTiIpOyBicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlzdHJjcHkoJmVycmJ1ZlswXSwgIlVOS05PV04iKTsgYnJlYWs7CisJfQorCX0KKwlpZiAoKCFwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpICYmIDApIHsKKwkJSk9UKDE2LCAiZnJhbWVbJTJpXTogJWk9c3RhdHVzez0lMTZzfSAgIiAgXAorCQkJCQkJIiU1aT1hY3R1YWwgICIgIFwKKwkJCQkJCSIlNWk9bGVuZ3RoICAiICBcCisJCQkJCQkiJTNpPW9mZnNldFxuIiwgXAorCQkJCWksIHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cywgJmVycmJ1ZlswXSwKKwkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoLAorCQkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCwKKwkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQpOworCX0KKwlpZiAoIXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgeworCQltb3JlID0gcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKworI2lmIGRlZmluZWQoVEVTVFRPTkUpCisJCWlmICghbW9yZSkKKwkJCW1vcmUgPSBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGg7CisjZW5kaWYKKworCQlpZiAoIW1vcmUpCisJCQltdCsrOworCQllbHNlIHsKKwkJCWlmIChtdCkgeworCQkJCUpPVCgxNiwgIiU0aSBlbXB0eSBhdWRpbyB1cmIgZnJhbWVzXG4iLCBtdCk7CisJCQkJbXQgPSAwOworCQkJfQorCisJCQlwMSA9IChfX3U4ICopKHB1cmItPnRyYW5zZmVyX2J1ZmZlciArIFwKKwkJCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0KTsKKworCQkJbGVhcCA9IDA7CisJCQlwMSArPSBsZWFwOworCQkJbW9yZSAtPSBsZWFwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBDT1BZIG1vcmUgQllURVMgRlJPTSBJU09DIEJVRkZFUiBUTyBBVURJTyBCVUZGRVIsCisgKiAgQ09OVkVSVElORyA4LUJJVCBNT05PIFRPIDE2LUJJVCBTSUdORUQgTElUVExFLUVORElBTiBTQU1QTEVTIElGIE5FQ0VTU0FSWQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQl3aGlsZSAobW9yZSkgeworCQkJCWlmICgwID4gbW9yZSkgeworCQkJCQlTQVkoImVhc3lzbmRfY29tcGxldGU6IE1JU1RBS0U6ICIgXAorCQkJCQkJCSJtb3JlIGlzIG5lZ2F0aXZlXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlpZiAocGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPD0gXAorCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19maWxsKSB7CisJCQkJCVNBWSgiRVJST1I6IGJhZCAiIFwKKwkJCQkJCSJwZWFzeWNhcC0+YXVkaW9fZmlsbFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlwYXVkaW9fYnVmZmVyID0gJnBlYXN5Y2FwLT5hdWRpb19idWZmZXJcCisJCQkJCQkJW3BlYXN5Y2FwLT5hdWRpb19maWxsXTsKKwkJCQlpZiAoUEFHRV9TSVpFIDwgKHBhdWRpb19idWZmZXItPnB0byAtIFwKKwkJCQkJCXBhdWRpb19idWZmZXItPnBnbykpIHsKKwkJCQkJU0FZKCJFUlJPUjogYmFkIHBhdWRpb19idWZmZXItPnB0b1xuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYgKFBBR0VfU0laRSA9PSAocGF1ZGlvX2J1ZmZlci0+cHRvIC0gXAorCQkJCQkJCXBhdWRpb19idWZmZXItPnBnbykpIHsKKworI2lmIGRlZmluZWQoVEVTVFRPTkUpCisJCQkJCWVhc3lzbmRfdGVzdHRvbmUocGVhc3ljYXAsIFwKKwkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZmlsbCk7CisjZW5kaWYgLypURVNUVE9ORSovCisKKwkJCQkJcGF1ZGlvX2J1ZmZlci0+cHRvID0gXAorCQkJCQkJCXBhdWRpb19idWZmZXItPnBnbzsKKwkJCQkJKHBlYXN5Y2FwLT5hdWRpb19maWxsKSsrOworCQkJCQlpZiAocGVhc3ljYXAtPlwKKwkJCQkJCWF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPD0gXAorCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19maWxsKQorCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ZpbGwgPSAwOworCisJCQkJCUpPVCgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+IiBcCisJCQkJCQkJImF1ZGlvX2ZpbGwgdG8gJWlcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZmlsbCk7CisKKwkJCQkJcGF1ZGlvX2J1ZmZlciA9ICZwZWFzeWNhcC0+XAorCQkJCQkJCWF1ZGlvX2J1ZmZlclwKKwkJCQkJCQlbcGVhc3ljYXAtPmF1ZGlvX2ZpbGxdOworCQkJCQlwYXVkaW9fYnVmZmVyLT5wdG8gPSBcCisJCQkJCQkJcGF1ZGlvX2J1ZmZlci0+cGdvOworCisJCQkJCWlmICghKHBlYXN5Y2FwLT5hdWRpb19maWxsICUgXAorCQkJCQkJcGVhc3ljYXAtPlwKKwkJCQkJCWF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpIHsKKwkJCQkJCUpPVCgxMiwgIndha2V1cCBjYWxsIG9uIHdxXyIgXAorCQkJCQkJImF1ZGlvLCAlaT1mcmFnIHJlYWRpbmcgICVpIiBcCisJCQkJCQkiPWZyYWdtZW50IGZpbGxcbiIsIFwKKwkJCQkJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIFwKKwkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQlhdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpLCBcCisJCQkJCQkocGVhc3ljYXAtPmF1ZGlvX2ZpbGwgLyBcCisJCQkJCQlwZWFzeWNhcC0+XAorCQkJCQkJYXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGVcCisJCQkJCQkoJihwZWFzeWNhcC0+d3FfYXVkaW8pKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCW11Y2ggPSBQQUdFX1NJWkUgLSAoaW50KShwYXVkaW9fYnVmZmVyLT5wdG8gLVwKKwkJCQkJCQkgcGF1ZGlvX2J1ZmZlci0+cGdvKTsKKworCQkJCWlmIChmYWxzZSA9PSBwZWFzeWNhcC0+bWljcm9waG9uZSkgeworCQkJCQlpZiAobXVjaCA+IG1vcmUpCisJCQkJCQltdWNoID0gbW9yZTsKKworCQkJCQltZW1jcHkocGF1ZGlvX2J1ZmZlci0+cHRvLCBwMSwgbXVjaCk7CisJCQkJCXAxICs9IG11Y2g7CisJCQkJCW1vcmUgLT0gbXVjaDsKKwkJCQl9IGVsc2UgeworI2lmIGRlZmluZWQoVVBTQU1QTEUpCisJCQkJCWlmIChtdWNoICUgMTYpCisJCQkJCQlKT1QoOCwgIk1JU1RBS0U/IG11Y2giIFwKKwkJCQkJCSIgaXMgbm90IGRpdmlzaWJsZSBieSAxNlxuIik7CisJCQkJCWlmIChtdWNoID4gKDE2ICogXAorCQkJCQkJCW1vcmUpKQorCQkJCQkJbXVjaCA9IDE2ICogXAorCQkJCQkJCW1vcmU7CisJCQkJCXAyID0gKF9fdTggKilwYXVkaW9fYnVmZmVyLT5wdG87CisKKwkJCQkJZm9yIChqID0gMDsgIGogPCAobXVjaC8xNik7ICBqKyspIHsKKwkJCQkJCW5ld2F1ZGlvID0gICgoaW50KSAqcDEpIC0gMTI4OworCQkJCQkJbmV3YXVkaW8gPSAxMjggKiBcCisJCQkJCQkJCW5ld2F1ZGlvOworCisJCQkJCQlkZWx0YSA9IChuZXdhdWRpbyAtIG9sZGF1ZGlvKSBcCisJCQkJCQkJCQkvIDQ7CisJCQkJCQlzMTYgPSBvbGRhdWRpbyArIGRlbHRhOworCisJCQkJCQlmb3IgKGsgPSAwOyAgayA8IDQ7ICBrKyspIHsKKwkJCQkJCQkqcDIgPSAoMHgwMEZGICYgczE2KTsKKwkJCQkJCQkqKHAyICsgMSkgPSAoMHhGRjAwICYgXAorCQkJCQkJCQlzMTYpID4+IDg7CisJCQkJCQkJcDIgKz0gMjsKKwkJCQkJCQkqcDIgPSAoMHgwMEZGICYgczE2KTsKKwkJCQkJCQkqKHAyICsgMSkgPSAoMHhGRjAwICYgXAorCQkJCQkJCQlzMTYpID4+IDg7CisJCQkJCQkJcDIgKz0gMjsKKworCQkJCQkJCXMxNiArPSBkZWx0YTsKKwkJCQkJCX0KKwkJCQkJCXAxKys7CisJCQkJCQltb3JlLS07CisJCQkJCQlvbGRhdWRpbyA9IHMxNjsKKwkJCQkJfQorI2Vsc2UKKwkJCQkJaWYgKG11Y2ggPiAoMiAqIG1vcmUpKQorCQkJCQkJbXVjaCA9IDIgKiBtb3JlOworCQkJCQlwMiA9IChfX3U4ICopcGF1ZGlvX2J1ZmZlci0+cHRvOworCisJCQkJCWZvciAoaiA9IDA7ICBqIDwgKG11Y2ggLyAyKTsgIGorKykgeworCQkJCQkJczE2ID0gICgoaW50KSAqcDEpIC0gMTI4OworCQkJCQkJczE2ID0gMTI4ICogXAorCQkJCQkJCQlzMTY7CisJCQkJCQkqcDIgPSAoMHgwMEZGICYgczE2KTsKKwkJCQkJCSoocDIgKyAxKSA9ICgweEZGMDAgJiBzMTYpID4+IFwKKwkJCQkJCQkJCTg7CisJCQkJCQlwMSsrOyAgcDIgKz0gMjsKKwkJCQkJCW1vcmUtLTsKKwkJCQkJfQorI2VuZGlmIC8qVVBTQU1QTEUqLworCQkJCX0KKwkJCQkocGF1ZGlvX2J1ZmZlci0+cHRvKSArPSBtdWNoOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJSk9UKDEyLCAiZGlzY2FyZGluZyBhdWRpbyBzYW1wbGVzIGJlY2F1c2UgIiBcCisJCQkiJWk9cHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzXG4iLCBcCisJCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKKwl9CisKKyNpZiBkZWZpbmVkKFVQU0FNUExFKQorcGVhc3ljYXAtPm9sZGF1ZGlvID0gb2xkYXVkaW87CisjZW5kaWYgLypVUFNBTVBMRSovCisKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgUkVTVUJNSVQgVEhJUyBVUkIgQUZURVIgTk8gRVJST1IKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgeworCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKDAgIT0gcmMpIHsKKwkJU0FZKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQgIiBcCisJCQkJCSJ3aXRoIHJjOlxuIiwgcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOworCQlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgLUVOT01FTTogeworCQkJU0FZKCJFTk9NRU1cbiIpOyAgICBicmVhazsKKwkJfQorCQljYXNlIC1FTk9ERVY6IHsKKwkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCX0KKwkJY2FzZSAtRU5YSU86IHsKKwkJCVNBWSgiRU5YSU9cbiIpOyAgICAgYnJlYWs7CisJCX0KKwkJY2FzZSAtRUlOVkFMOiB7CisJCQlTQVkoIkVJTlZBTFxuIik7ICAgIGJyZWFrOworCQl9CisJCWNhc2UgLUVBR0FJTjogeworCQkJU0FZKCJFQUdBSU5cbiIpOyAgICBicmVhazsKKwkJfQorCQljYXNlIC1FRkJJRzogeworCQkJU0FZKCJFRkJJR1xuIik7ICAgICBicmVhazsKKwkJfQorCQljYXNlIC1FUElQRTogeworCQkJU0FZKCJFUElQRVxuIik7ICAgICBicmVhazsKKwkJfQorCQljYXNlIC1FTVNHU0laRTogeworCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJfQorCQljYXNlIC1FTk9TUEM6IHsKKwkJCVNBWSgiRU5PU1BDXG4iKTsgIGJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCVNBWSgiMHglMDhYXG4iLCByYyk7IGJyZWFrOworCQl9CisJCX0KKwl9Cit9CityZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFRIRSBBVURJTyBVUkJTIEFSRSBTVUJNSVRURUQgQVQgVEhJUyBFQVJMWSBTVEFHRSBTTyBUSEFUIElUIElTIFBPU1NJQkxFIFRPCisgKiAgU1RSRUFNIEZST00gL2Rldi9lYXN5c25kMSBXSVRIIFNJTVBMRSBQUk9HUkFNUyBTVUNIIEFTIGNhdCBXSElDSCBETyBOT1QKKyAqICBIQVZFIEFOIElPQ1RMIElOVEVSRkFDRS4gIFRIRSBWSURFTyBVUkJTLCBCWSBDT05UUkFTVCwgTVVTVCBCRSBTVUJNSVRURUQKKyAqICBNVUNIIExBVEVSOiBTRUUgQ09NTUVOVFMgSU4gRklMRSBlYXN5Y2FwX21haW4uYy4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CitlYXN5c25kX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CitzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRlcmZhY2U7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitpbnQgc3VibWlub3IsIHJjOworCitKT1QoNCwgImJlZ2lucy5cbiIpOworCitzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisKK3B1c2JfaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZlYXN5Y2FwX3VzYl9kcml2ZXIsIHN1Ym1pbm9yKTsKK2lmIChOVUxMID09IHB1c2JfaW50ZXJmYWNlKSB7CisJU0FZKCJFUlJPUjogcHVzYl9pbnRlcmZhY2UgaXMgTlVMTFxuIik7CisJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHlcbiIpOworCXJldHVybiAtMTsKK30KK3BlYXN5Y2FwID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSk7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ZpbGUtPnByaXZhdGVfZGF0YSA9IHBlYXN5Y2FwOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElOSVRJQUxJWkFUSU9OLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitKT1QoNCwgInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKKworaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfSBlbHNlIHsKKwlKT1QoMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgXAorCQkJCQkobG9uZyBpbnQpcGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK30KKworcmMgPSBhdWRpb19zZXR1cChwZWFzeWNhcCk7CitpZiAoMCA8PSByYykKKwlKT1QoOCwgImF1ZGlvX3NldHVwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKK2Vsc2UKKwlKT1QoOCwgImVhc3lzbmQgb3BlbigpOiBFUlJPUjogYXVkaW9fc2V0dXAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gYWRqdXN0X3ZvbHVtZShwZWFzeWNhcCwgLTgxOTIpOworaWYgKDAgIT0gcmMpIHsKKwlTQVkoIkVSUk9SOiBhZGp1c3Rfdm9sdW1lKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKK0pPVCg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgcmV0dXJuZWQgJWlcbiIsIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24sIHJjKTsKKworaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGhhcyBiZWNvbWUgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CityYyA9IHdha2V1cF9kZXZpY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK2lmICgwID09IHJjKQorCUpPVCg4LCAid2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CitlbHNlCisJSk9UKDgsICJlYXN5c25kIG9wZW4oKTogRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3N1Ym1pdF9hdWRpb191cmJzKHBlYXN5Y2FwKTsKK3BlYXN5Y2FwLT5hdWRpb19pZGxlID0gMDsKKworcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3NlYyAgPSAwOworcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3VzZWMgPSAwOworCitKT1QoNCwgImZpbmlzaGVkIGluaXRpYWxpemF0aW9uXG4iKTsKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitlYXN5c25kX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CisKK0pPVCg0LCAiYmVnaW5zXG4iKTsKKworcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMLlxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAoMCAhPSBraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApKSB7CisJU0FZKCJFUlJPUjoga2lsbF9hdWRpb191cmJzKCkgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK0pPVCg0LCAiZW5kaW5nIHN1Y2Nlc3NmdWxseVxuIik7CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NzaXplX3QKK2Vhc3lzbmRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnB1c2Vyc3BhY2VidWZmZXIsIFwKKwkJCQkJCXNpemVfdCBrb3VudCwgbG9mZl90ICpwb2ZmKQoreworc3RydWN0IHRpbWV2YWwgdGltZXZhbDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMTsKK3N0YXRpYyBsb25nIGxvbmcgaW50IGF1ZGlvX2J5dGVzLCBhYm92ZSwgYmVsb3csIG1lYW47CitzdHJ1Y3Qgc2lnbmVkX2Rpdl9yZXN1bHQgc2RyOwordW5zaWduZWQgY2hhciAqcDA7Citsb25nIGludCBrb3VudDEsIG1vcmUsIHJjLCBsMCwgbG07CitpbnQgZnJhZ21lbnQ7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitzdHJ1Y3QgZGF0YV9idWZmZXIgKnBkYXRhX2J1ZmZlcjsKK3NpemVfdCBzenJldDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBETyBBIEJMT0NLSU5HIFJFQUQgVE8gVFJBTlNGRVIgREFUQSBUTyBVU0VSIFNQQUNFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKiAgTi5CLiAgSUYgVEhJUyBGVU5DVElPTiBSRVRVUk5TIDAsIE5PVEhJTkcgSVMgU0VFTiBJTiBVU0VSIFNQQUNFLiAqKioqKioKKyAqKioqKiAgICAgICAgVEhJUyBDT05ESVRJT04gU0lHTklGSUVTIEVORC1PRi1GSUxFLiAgICAgICAgICAgICAgICAgICAgICAqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitKT1QoOCwgIj09PT09IGVhc3lzbmRfcmVhZCgpOiBrb3VudD0laSwgKnBvZmY9JWlcbiIsIChpbnQpa291bnQsIChpbnQpKCpwb2ZmKSk7CisKK3BlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopKGZpbGUtPnByaXZhdGVfZGF0YSk7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1IgaW4gZWFzeXNuZF9yZWFkKCk6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKCgwID4gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpIHx8IFwKKwkJKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55IDw9IHBlYXN5Y2FwLT5hdWRpb19yZWFkKSkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5hdWRpb19yZWFkIG91dCBvZiByYW5nZVxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitwZGF0YV9idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltwZWFzeWNhcC0+YXVkaW9fcmVhZF07CitpZiAoKHN0cnVjdCBkYXRhX2J1ZmZlciAqKU5VTEwgPT0gcGRhdGFfYnVmZmVyKSB7CisJU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9UKDEyLCAiYmVmb3JlIHdhaXQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCisJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpLCBcCisJCShwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKTsKK2ZyYWdtZW50ID0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCk7Cit3aGlsZSAoKGZyYWdtZW50ID09IChwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSkgfHwgXAorCQkoMCA9PSAoUEFHRV9TSVpFIC0gKHBkYXRhX2J1ZmZlci0+cHRvIC0gcGRhdGFfYnVmZmVyLT5wZ28pKSkpIHsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJSk9UKDE2LCAicmV0dXJuaW5nIC1FQUdBSU4gYXMgaW5zdHJ1Y3RlZFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwZWFzeWNhcC0+d3FfYXVkaW8sIFwKKwkJKHBlYXN5Y2FwLT5hdWRpb19pZGxlICB8fCBwZWFzeWNhcC0+YXVkaW9fZW9mICAgfHwgXAorCQkoKGZyYWdtZW50ICE9IChwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSkgJiYgXAorCQkoMCA8IChQQUdFX1NJWkUgLSAocGRhdGFfYnVmZmVyLT5wdG8gLSBwZGF0YV9idWZmZXItPnBnbykpKSkpKTsKKwlpZiAoMCAhPSByYykgeworCQlTQVkoImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKHBlYXN5Y2FwLT5hdWRpb19lb2YpIHsKKwkJSk9UKDgsICJyZXR1cm5pbmcgMCBiZWNhdXNlICAlaT1hdWRpb19lb2ZcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZW9mKTsKKwkJa2lsbF9hdWRpb191cmJzKHBlYXN5Y2FwKTsKKwkJbXNsZWVwKDUwMCk7CisJCXJldHVybiAwOworCX0KKwlpZiAocGVhc3ljYXAtPmF1ZGlvX2lkbGUpIHsKKwkJSk9UKDE2LCAicmV0dXJuaW5nIDAgYmVjYXVzZSAgJWk9YXVkaW9faWRsZVxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKSB7CisJCUpPVCgxNiwgInJldHVybmluZyAwIGJlY2F1c2UgYXVkaW8gdXJicyBub3Qgc3RyZWFtaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorfQorSk9UKDEyLCAiYWZ0ZXIgIHdhaXQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCisJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpLCBcCisJCShwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKTsKK3N6cmV0ID0gKHNpemVfdCkwOword2hpbGUgKGZyYWdtZW50ID09IChwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSkgeworCWlmIChOVUxMID09IHBkYXRhX2J1ZmZlci0+cGdvKSB7CisJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cGdvIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKE5VTEwgPT0gcGRhdGFfYnVmZmVyLT5wdG8pIHsKKwkJU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wdG8gaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrb3VudDEgPSBQQUdFX1NJWkUgLSAocGRhdGFfYnVmZmVyLT5wdG8gLSBwZGF0YV9idWZmZXItPnBnbyk7CisJaWYgKDAgPiBrb3VudDEpIHsKKwkJU0FZKCJlYXN5c25kX3JlYWQ6IE1JU1RBS0U6IGtvdW50MSBpcyBuZWdhdGl2ZVxuIik7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmICgha291bnQxKSB7CisJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCkrKzsKKwkJaWYgKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55IDw9IHBlYXN5Y2FwLT5hdWRpb19yZWFkKQorCQkJcGVhc3ljYXAtPmF1ZGlvX3JlYWQgPSAwOworCQlKT1QoMTIsICJidW1wZWQgcGVhc3ljYXAtPmF1ZGlvX3JlYWQgdG8gJWlcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5hdWRpb19yZWFkKTsKKworCQlpZiAoZnJhZ21lbnQgIT0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSkKKwkJCWJyZWFrOworCisJCWlmICgoMCA+IHBlYXN5Y2FwLT5hdWRpb19yZWFkKSB8fCBcCisJCQkocGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPD0gXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9fcmVhZCkpIHsKKwkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5hdWRpb19yZWFkIG91dCBvZiByYW5nZVxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwZGF0YV9idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltwZWFzeWNhcC0+YXVkaW9fcmVhZF07CisJCWlmICgoc3RydWN0IGRhdGFfYnVmZmVyICopTlVMTCA9PSBwZGF0YV9idWZmZXIpIHsKKwkJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChOVUxMID09IHBkYXRhX2J1ZmZlci0+cGdvKSB7CisJCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnBnbyBpcyBOVUxMXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChOVUxMID09IHBkYXRhX2J1ZmZlci0+cHRvKSB7CisJCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnB0byBpcyBOVUxMXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWtvdW50MSA9IFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKTsKKwl9CisJSk9UKDEyLCAicmVhZHkgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50MSk7CisJSk9UKDEyLCAic3RpbGwgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50KTsKKwltb3JlID0ga291bnQxOworCWlmIChtb3JlID4ga291bnQpCisJCW1vcmUgPSBrb3VudDsKKwlKT1QoMTIsICJhZ3JlZWQgdG8gc2VuZCAlbGkgYnl0ZXMgZnJvbSBwYWdlICVpXG4iLCBcCisJCQkJCQltb3JlLCBwZWFzeWNhcC0+YXVkaW9fcmVhZCk7CisJaWYgKCFtb3JlKQorCQlicmVhazsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBBQ0NVTVVMQVRFIERZTkFNSUMtUkFOR0UgSU5GT1JNQVRJT04KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXAwID0gKHVuc2lnbmVkIGNoYXIgKilwZGF0YV9idWZmZXItPnBnbzsgIGwwID0gMDsgIGxtID0gbW9yZS8yOworCXdoaWxlIChsMCA8IGxtKSB7CisJCVNVTU1FUihwMCwgJnBlYXN5Y2FwLT5hdWRpb19zYW1wbGUsICZwZWFzeWNhcC0+YXVkaW9fbml2ZWF1LCBcCisJCQkJJnBlYXN5Y2FwLT5hdWRpb19zcXVhcmUpOyAgbDArKzsgIHAwICs9IDI7CisJfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXJjID0gY29weV90b191c2VyKHB1c2Vyc3BhY2VidWZmZXIsIHBkYXRhX2J1ZmZlci0+cHRvLCBtb3JlKTsKKwlpZiAoMCAhPSByYykgeworCQlTQVkoIkVSUk9SOiBjb3B5X3RvX3VzZXIoKSByZXR1cm5lZCAlbGlcbiIsIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCSpwb2ZmICs9IChsb2ZmX3QpbW9yZTsKKwlzenJldCArPSAoc2l6ZV90KW1vcmU7CisJcGRhdGFfYnVmZmVyLT5wdG8gKz0gbW9yZTsKKwlwdXNlcnNwYWNlYnVmZmVyICs9IG1vcmU7CisJa291bnQgLT0gKHNpemVfdCltb3JlOworfQorSk9UKDEyLCAiYWZ0ZXIgIHJlYWQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCisJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpLCBcCisJCShwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKTsKK2lmIChrb3VudCA8IDApIHsKKwlTQVkoIk1JU1RBS0U6ICAlbGk9a291bnQgICVsaT1zenJldFxuIiwgXAorCQkJCQkobG9uZyBpbnQpa291bnQsIChsb25nIGludClzenJldCk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIENBTENVTEFURSBEWU5BTUlDIFJBTkdFIEZPUiAoVkFQT1VSV0FSRSkgQVVUT01BVElDIFZPTFVNRSBDT05UUk9MCisgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChwZWFzeWNhcC0+YXVkaW9fc2FtcGxlKSB7CisJYmVsb3cgPSBwZWFzeWNhcC0+YXVkaW9fc2FtcGxlOworCWFib3ZlID0gcGVhc3ljYXAtPmF1ZGlvX3NxdWFyZTsKKwlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCBiZWxvdyk7CisJYWJvdmUgPSBzZHIucXVvdGllbnQ7CisJbWVhbiA9IHBlYXN5Y2FwLT5hdWRpb19uaXZlYXU7CisJc2RyID0gc2lnbmVkX2RpdihtZWFuLCBwZWFzeWNhcC0+YXVkaW9fc2FtcGxlKTsKKworCUpPVCg4LCAiJThsbGk9bWVhbiAgJThsbGk9bWVhbnNxdWFyZSBhZnRlciAlbGxpIHNhbXBsZXMsID0+XG4iLCBcCisJCQkJc2RyLnF1b3RpZW50LCBhYm92ZSwgcGVhc3ljYXAtPmF1ZGlvX3NhbXBsZSk7CisKKwlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCAzMjc2OCk7CisJSk9UKDgsICJhdWRpbyBkeW5hbWljIHJhbmdlIGlzIHJvdWdobHkgJWxsaVxuIiwgc2RyLnF1b3RpZW50KTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgVVBEQVRFIFRIRSBBVURJTyBDTE9DSworICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWwpOworaWYgKCFwZWFzeWNhcC0+dGltZXZhbDEudHZfc2VjKSB7CisJYXVkaW9fYnl0ZXMgPSAwOworCXRpbWV2YWwxID0gdGltZXZhbDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlwZWFzeWNhcC0+dGltZXZhbDEgPSB0aW1ldmFsMTsKKwltdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKTsKKwlzZHIucXVvdGllbnQgPSAxOTIwMDA7Cit9IGVsc2UgeworCWF1ZGlvX2J5dGVzICs9IChsb25nIGxvbmcgaW50KSBzenJldDsKKwliZWxvdyA9ICgobG9uZyBsb25nIGludCkoMTAwMDAwMCkpICogXAorCQkoKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfc2VjICAtIHRpbWV2YWwxLnR2X3NlYykpICsgXAorCQkobG9uZyBsb25nIGludCkodGltZXZhbC50dl91c2VjIC0gdGltZXZhbDEudHZfdXNlYyk7CisJYWJvdmUgPSAxMDAwMDAwICogKChsb25nIGxvbmcgaW50KSBhdWRpb19ieXRlcyk7CisKKwlpZiAoYmVsb3cpCisJCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKKwllbHNlCisJCXNkci5xdW90aWVudCA9IDE5MjAwMDsKK30KK0pPVCg4LCAiYXVkaW8gc3RyZWFtaW5nIGF0ICVsbGkgYnl0ZXMvc2Vjb25kXG4iLCBzZHIucXVvdGllbnQpOworaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMSkpKQorCXJldHVybiAtRVJFU1RBUlRTWVM7CitwZWFzeWNhcC0+ZG5ieWR0ID0gc2RyLnF1b3RpZW50OworbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CisKK0pPVCg4LCAicmV0dXJuaW5nICVsaVxuIiwgKGxvbmcgaW50KXN6cmV0KTsKK3JldHVybiBzenJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU1VCTUlUIEFMTCBBVURJTyBVUkJTLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK3N1Ym1pdF9hdWRpb191cmJzKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKK3sKK3N0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOworc3RydWN0IHVyYiAqcHVyYjsKK3N0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7CitpbnQgaiwgaXNiYWQsIG0sIHJjOworaW50IGlzYnVmOworCitpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMID09IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+dXJiX2F1ZGlvX2hlYWQgdW5pbml0aWFsaXplZFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAoIXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgeworCUpPVCg0LCAiaW5pdGlhbCBzdWJtaXNzaW9uIG9mIGFsbCBhdWRpbyB1cmJzXG4iKTsKKwlyYyA9IHVzYl9zZXRfaW50ZXJmYWNlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vbik7CisJSk9UKDgsICJ1c2Jfc2V0X2ludGVyZmFjZSguLCVpLCVpKSByZXR1cm5lZCAlaVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uLCByYyk7CisKKwlpc2JhZCA9IDA7ICBtID0gMDsKKwlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgeworCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKKwkJaWYgKE5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQlwdXJiID0gcGRhdGFfdXJiLT5wdXJiOworCQkJaWYgKE5VTEwgIT0gcHVyYikgeworCQkJCWlzYnVmID0gcGRhdGFfdXJiLT5pc2J1ZjsKKworCQkJCXB1cmItPmludGVydmFsID0gMTsKKwkJCQlwdXJiLT5kZXYgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CisJCQkJcHVyYi0+cGlwZSA9IFwKKwkJCQkJdXNiX3Jjdmlzb2NwaXBlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSxcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19lbmRwb2ludG51bWJlcik7CisJCQkJcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCQkJcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJbaXNidWZdLnBnbzsKKwkJCQlwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZTsKKwkJCQlwdXJiLT5jb21wbGV0ZSA9IGVhc3lzbmRfY29tcGxldGU7CisJCQkJcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwOworCQkJCXB1cmItPnN0YXJ0X2ZyYW1lID0gMDsKKwkJCQlwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwkJCQlmb3IgKGogPSAwOyAgaiA8IHBlYXN5Y2FwLT5cCisJCQkJCQlhdWRpb19pc29jX2ZyYW1lc3BlcmRlc2M7IFwKKwkJCQkJCQkJCWorKykgeworCQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqICogXAorCQkJCQkJcGVhc3ljYXAtPlwKKwkJCQkJCWF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplOworCQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBcCisJCQkJCQlwZWFzeWNhcC0+XAorCQkJCQkJYXVkaW9faXNvY19tYXhmcmFtZXNpemU7CisJCQkJfQorCisJCQkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoMCAhPSByYykgeworCQkJCQlpc2JhZCsrOworCQkJCQlTQVkoIkVSUk9SOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCIgXAorCQkJCQkJCSIgZm9yIHVyYiB3aXRoIHJjOlxuIik7CisJCQkJCXN3aXRjaCAocmMpIHsKKwkJCQkJY2FzZSAtRU5PTUVNOiB7CisJCQkJCQlTQVkoIkVOT01FTVxuIik7IGJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgLUVOT0RFVjogeworCQkJCQkJU0FZKCJFTk9ERVZcbiIpOyBicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FTlhJTzogeworCQkJCQkJU0FZKCJFTlhJT1xuIik7IGJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgLUVJTlZBTDogeworCQkJCQkJU0FZKCJFSU5WQUxcbiIpOyBicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FQUdBSU46IHsKKwkJCQkJCVNBWSgiRUFHQUlOXG4iKTsgYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAtRUZCSUc6IHsKKwkJCQkJCVNBWSgiRUZCSUdcbiIpOyBicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FUElQRTogeworCQkJCQkJU0FZKCJFUElQRVxuIik7IGJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgLUVNU0dTSVpFOiB7CisJCQkJCQlTQVkoIkVNU0dTSVpFXG4iKTsgYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAtRU5PU1BDOiB7CisJCQkJCQlTQVkoIkVOT1NQQ1xuIik7IGJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6IHsKKwkJCQkJCVNBWSgidW5rbm93biBlcnJvciBjb2RlICVpXG4iLFwKKwkJCQkJCQkJIHJjKTsgYnJlYWs7CisJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCSBtKys7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpc2JhZCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJaXNiYWQrKzsKKwkJfQorCX0KKwlpZiAoaXNiYWQpIHsKKwkJSk9UKDQsICJhdHRlbXB0aW5nIGNsZWFudXAgaW5zdGVhZCBvZiBzdWJtaXR0aW5nXG4iKTsKKwkJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkpIHsKKwkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBcCisJCQkJCQkJCWxpc3RfaGVhZCk7CisJCQlpZiAoTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQlwdXJiID0gcGRhdGFfdXJiLT5wdXJiOworCQkJCWlmIChOVUxMICE9IHB1cmIpCisJCQkJCXVzYl9raWxsX3VyYihwdXJiKTsKKwkJCX0KKwkJfQorCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgPSAwOworCX0gZWxzZSB7CisJCXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyA9IDE7CisJCUpPVCg0LCAic3VibWl0dGVkICVpIGF1ZGlvIHVyYnNcbiIsIG0pOworCX0KK30gZWxzZQorCUpPVCg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgYXVkaW8gdXJic1xuIik7CisKK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBLSUxMIEFMTCBBVURJTyBVUkJTLgorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2tpbGxfYXVkaW9fdXJicyhzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCit7CitpbnQgbTsKK3N0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7CitzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKKworaWYgKHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgeworCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgeworCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgPSAwOworCQlKT1QoNCwgImtpbGxpbmcgYXVkaW8gdXJic1xuIik7CisJCW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgeworCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsCisJCQkJCQkJCWxpc3RfaGVhZCk7CisJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKKwkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CisJCQkJCW0rKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJSk9UKDQsICIlaSBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgbSk7CisJfSBlbHNlIHsKKwkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorfSBlbHNlIHsKKwlKT1QoOCwgIiVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nLCBubyBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpOworfQorcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmggYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxMjczOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuaApAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgZWFzeWNhcF9zb3VuZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFIuTS4gVGhvbWFzICA8cm10aG9tYXNAc2Npb2x1cy5vcmc+CisgKgorICoKKyAqICBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhlIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgc29mdHdhcmU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitleHRlcm4gc3RydWN0IHVzYl9kcml2ZXIgZWFzeWNhcF91c2JfZHJpdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zdGFuZGFyZC5oIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zdGFuZGFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGM4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3N0YW5kYXJkLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIGVhc3ljYXBfc3RhbmRhcmQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBSLk0uIFRob21hcyAgPHJtdGhvbWFzQHNjaW9sdXMub3JnPgorICoKKyAqCisgKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoZSBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgZWFzeWNhcF9zdGFuZGFyZFtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmNlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIGVhc3ljYXBfdGVzdGNhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBSLk0uIFRob21hcyAgPHJtdGhvbWFzQHNjaW9sdXMub3JnPgorICoKKyAqCisgKiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoZSBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJlYXN5Y2FwLmgiCisjaW5jbHVkZSAiZWFzeWNhcF9kZWJ1Zy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRFU1RDQVJEX0JZVEVTUEVSTElORSAoMiAqIDE0NDApCit2b2lkCitlYXN5Y2FwX3Rlc3RjYXJkKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCwgaW50IGZpZWxkX2ZpbGwpCit7CitpbnQgdG90YWw7CitpbnQgeSwgdSwgdiwgciwgZywgYjsKK3Vuc2lnbmVkIGNoYXIgdXl2eVs0XTsKKworaW50IGkxLCBsaW5lLCBrLCBtLCBuLCBtb3JlLCBtdWNoLCBiYXJ3aWR0aDsKK3Vuc2lnbmVkIGNoYXIgYmZiYXJbVEVTVENBUkRfQllURVNQRVJMSU5FIC8gOF0sICpwMSwgKnAyOworc3RydWN0IGRhdGFfYnVmZmVyICpwZmllbGRfYnVmZmVyOworCitKT1QoOCwgIiVpPWZpZWxkX2ZpbGxcbiIsIGZpZWxkX2ZpbGwpOworCitpZiAoKFRFU1RDQVJEX0JZVEVTUEVSTElORSAvIDIpIDwgcGVhc3ljYXAtPndpZHRoKSB7CisJU0FZKCJFUlJPUjogaW1hZ2UgaXMgdG9vIHdpZGVcbiIpOworCXJldHVybjsKK30KK2lmIChwZWFzeWNhcC0+d2lkdGggJSAxNikgeworCVNBWSgiRVJST1I6IGluZGl2aXNpYmxlIGltYWdlIHdpZHRoXG4iKTsKKwlyZXR1cm47Cit9CisKK3RvdGFsID0gMDsKK2JhcndpZHRoID0gKDIgKiBwZWFzeWNhcC0+d2lkdGgpIC8gODsKKworayA9IGZpZWxkX2ZpbGw7CittID0gMDsKK24gPSAwOworCitmb3IgKGxpbmUgPSAwOyAgbGluZSA8IChwZWFzeWNhcC0+aGVpZ2h0IC8gMik7ICBsaW5lKyspIHsKKwlmb3IgKGkxID0gMDsgIGkxIDwgODsgIGkxKyspIHsKKwkJciA9IChpMSAqIDI1NikvODsKKwkJZyA9IChpMSAqIDI1NikvODsKKwkJYiA9IChpMSAqIDI1NikvODsKKworCQl5ID0gIDI5OSpyLzEwMDAgKyA1ODcqZy8xMDAwICsgMTE0KmIvMTAwMCA7CisJCXUgPSAtMTQ3KnIvMTAwMCAtIDI4OSpnLzEwMDAgKyA0MzYqYi8xMDAwIDsgIHUgPSB1ICsgMTI4OworCQl2ID0gIDYxNSpyLzEwMDAgLSA1MTUqZy8xMDAwIC0gMTAwKmIvMTAwMCA7ICB2ID0gdiArIDEyODsKKworCQl1eXZ5WzBdID0gIDB4RkYgJiB1IDsKKwkJdXl2eVsxXSA9ICAweEZGICYgeSA7CisJCXV5dnlbMl0gPSAgMHhGRiAmIHYgOworCQl1eXZ5WzNdID0gIDB4RkYgJiB5IDsKKworCQlwMSA9ICZiZmJhclswXTsKKwkJd2hpbGUgKHAxIDwgJmJmYmFyW2JhcndpZHRoXSkgeworCQkJKnAxKysgPSB1eXZ5WzBdIDsKKwkJCSpwMSsrID0gdXl2eVsxXSA7CisJCQkqcDErKyA9IHV5dnlbMl0gOworCQkJKnAxKysgPSB1eXZ5WzNdIDsKKwkJCXRvdGFsICs9IDQ7CisJCQl9CisKKwkJcDEgPSAmYmZiYXJbMF07CisJCW1vcmUgPSBiYXJ3aWR0aDsKKworCQl3aGlsZSAobW9yZSkgeworCQkJaWYgKChGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpIDw9IG0pIHsKKwkJCQlTQVkoIkVSUk9SOiAgYmFkIG0gcmVhY2hlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQlpZiAoUEFHRV9TSVpFIDwgbikgeworCQkJU0FZKCJFUlJPUjogIGJhZCBuIHJlYWNoZWRcbiIpOyByZXR1cm47CisJCX0KKworCQlpZiAoMCA+IG1vcmUpIHsKKwkJCVNBWSgiRVJST1I6ICBpbnRlcm5hbCBmYXVsdFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQltdWNoID0gUEFHRV9TSVpFIC0gbjsKKwkJaWYgKG11Y2ggPiBtb3JlKQorCQkJbXVjaCA9IG1vcmU7CisJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXTsKKwkJcDIgPSBwZmllbGRfYnVmZmVyLT5wZ28gKyBuOworCQltZW1jcHkocDIsIHAxLCBtdWNoKTsKKworCQlwMSArPSBtdWNoOworCQluICs9IG11Y2g7CisJCW1vcmUgLT0gbXVjaDsKKwkJaWYgKFBBR0VfU0laRSA9PSBuKSB7CisJCQltKys7CisJCQluID0gMDsKKwkJCX0KKwkJfQorCX0KK30KKworSk9UKDgsICIlaT10b3RhbFxuIiwgdG90YWwpOworaWYgKHRvdGFsICE9IHBlYXN5Y2FwLT53aWR0aCAqIHBlYXN5Y2FwLT5oZWlnaHQpCisJU0FZKCJFUlJPUjogd3JvbmcgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW46ICAlaVxuIiwgdG90YWwpOworcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoRUFTWUNBUF9URVNUVE9ORSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RIRSB0b25lc1tdIEFSUkFZIEJFTE9XIElTIFRIRSBPVVRQVVQgT0YgVEhJUyBQUk9HUkFNLAorQ09NUElMRUQgZ2NjIC1vIHByb2cgLWxtIHByb2cuYworLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitpbnQgbWFpbih2b2lkKTsKK2ludAorbWFpbih2b2lkKQoreworaW50IGkxLCBpMiwgbGFzdDsKK2RvdWJsZSBkMSwgZDI7CisKK2xhc3QgPSAxMDI0IC0gMTsKK2QxID0gMTAuMCozLjE0MTU5MjY1LzEwMjQuMDsKK3ByaW50ZigiaW50IHRvbmVzWzIwNDhdID1cbntcbiIpOworZm9yIChpMSA9IDA7ICBpMSA8PSBsYXN0OyAgaTErKykKKwl7CisJZDIgPSAoKGRvdWJsZSlpMSkgKiBkMTsKKwlpMiA9IChpbnQpKDE2Mzg0LjAqc2luKGQyKSk7CisKKwlpZiAobGFzdCAhPSBpMSkKKwkJeworCQlwcmludGYoIiU2aSwgIiwgaTIpOyAgcHJpbnRmKCIlNmksICIsIGkyKTsKKwkJaWYgKCEoKGkxICsgMSklNSkpIHByaW50ZigiXG4iKTsKKwkJfQorCWVsc2UKKwkJeworCQlwcmludGYoIiU2aSwgIiwgaTIpOyAgcHJpbnRmKCIlNmlcbn07XG4iLCBpMik7CisJCX0KKwl9CityZXR1cm4oMCk7Cit9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgdG9uZXNbMjA0OF0gPSB7CisgICAgIDAsICAgICAwLCAgIDUwMiwgICA1MDIsICAxMDA0LCAgMTAwNCwgIDE1MDUsICAxNTA1LCAgMjAwNSwgIDIwMDUsCisgIDI1MDMsICAyNTAzLCAgMjk5OCwgIDI5OTgsICAzNDkxLCAgMzQ5MSwgIDM5ODAsICAzOTgwLCAgNDQ2NiwgIDQ0NjYsCisgIDQ5NDgsICA0OTQ4LCAgNTQyNCwgIDU0MjQsICA1ODk2LCAgNTg5NiwgIDYzNjIsICA2MzYyLCAgNjgyMiwgIDY4MjIsCisgIDcyNzYsICA3Mjc2LCAgNzcyMywgIDc3MjMsICA4MTYyLCAgODE2MiwgIDg1OTQsICA4NTk0LCAgOTAxOCwgIDkwMTgsCisgIDk0MzQsICA5NDM0LCAgOTg0MCwgIDk4NDAsIDEwMjM3LCAxMDIzNywgMTA2MjUsIDEwNjI1LCAxMTAwMiwgMTEwMDIsCisgMTEzNzAsIDExMzcwLCAxMTcyNiwgMTE3MjYsIDEyMDcyLCAxMjA3MiwgMTI0MDYsIDEyNDA2LCAxMjcyOCwgMTI3MjgsCisgMTMwMzgsIDEzMDM4LCAxMzMzNywgMTMzMzcsIDEzNjIyLCAxMzYyMiwgMTM4OTUsIDEzODk1LCAxNDE1NSwgMTQxNTUsCisgMTQ0MDEsIDE0NDAxLCAxNDYzNCwgMTQ2MzQsIDE0ODUzLCAxNDg1MywgMTUwNTgsIDE1MDU4LCAxNTI0OSwgMTUyNDksCisgMTU0MjYsIDE1NDI2LCAxNTU4OCwgMTU1ODgsIDE1NzM1LCAxNTczNSwgMTU4NjgsIDE1ODY4LCAxNTk4NSwgMTU5ODUsCisgMTYwODgsIDE2MDg4LCAxNjE3NSwgMTYxNzUsIDE2MjQ4LCAxNjI0OCwgMTYzMDUsIDE2MzA1LCAxNjM0NiwgMTYzNDYsCisgMTYzNzIsIDE2MzcyLCAxNjM4MywgMTYzODMsIDE2Mzc5LCAxNjM3OSwgMTYzNTksIDE2MzU5LCAxNjMyMywgMTYzMjMsCisgMTYyNzIsIDE2MjcyLCAxNjIwNiwgMTYyMDYsIDE2MTI1LCAxNjEyNSwgMTYwMjgsIDE2MDI4LCAxNTkxNywgMTU5MTcsCisgMTU3OTAsIDE1NzkwLCAxNTY0OSwgMTU2NDksIDE1NDkyLCAxNTQ5MiwgMTUzMjIsIDE1MzIyLCAxNTEzNiwgMTUxMzYsCisgMTQ5MzcsIDE0OTM3LCAxNDcyMywgMTQ3MjMsIDE0NDk2LCAxNDQ5NiwgMTQyNTUsIDE0MjU1LCAxNDAwMSwgMTQwMDEsCisgMTM3MzMsIDEzNzMzLCAxMzQ1MiwgMTM0NTIsIDEzMTU5LCAxMzE1OSwgMTI4NTQsIDEyODU0LCAxMjUzNiwgMTI1MzYsCisgMTIyMDcsIDEyMjA3LCAxMTg2NiwgMTE4NjYsIDExNTEzLCAxMTUxMywgMTExNTAsIDExMTUwLCAxMDc3NywgMTA3NzcsCisgMTAzOTMsIDEwMzkzLCAxMDAwMCwgMTAwMDAsICA5NTk3LCAgOTU5NywgIDkxODUsICA5MTg1LCAgODc2NSwgIDg3NjUsCisgIDgzMzYsICA4MzM2LCAgNzkwMCwgIDc5MDAsICA3NDU2LCAgNzQ1NiwgIDcwMDUsICA3MDA1LCAgNjU0NywgIDY1NDcsCisgIDYwODMsICA2MDgzLCAgNTYxNCwgIDU2MTQsICA1MTM5LCAgNTEzOSwgIDQ2NTksICA0NjU5LCAgNDE3NSwgIDQxNzUsCisgIDM2ODcsICAzNjg3LCAgMzE5NiwgIDMxOTYsICAyNzAxLCAgMjcwMSwgIDIyMDQsICAyMjA0LCAgMTcwNSwgIDE3MDUsCisgIDEyMDUsICAxMjA1LCAgIDcwMywgICA3MDMsICAgMjAxLCAgIDIwMSwgIC0zMDEsICAtMzAxLCAgLTgwMywgIC04MDMsCisgLTEzMDUsIC0xMzA1LCAtMTgwNSwgLTE4MDUsIC0yMzA0LCAtMjMwNCwgLTI4MDEsIC0yODAxLCAtMzI5NCwgLTMyOTQsCisgLTM3ODUsIC0zNzg1LCAtNDI3MiwgLTQyNzIsIC00NzU2LCAtNDc1NiwgLTUyMzQsIC01MjM0LCAtNTcwOCwgLTU3MDgsCisgLTYxNzYsIC02MTc2LCAtNjYzOSwgLTY2MzksIC03MDk1LCAtNzA5NSwgLTc1NDUsIC03NTQ1LCAtNzk4OCwgLTc5ODgsCisgLTg0MjMsIC04NDIzLCAtODg1MCwgLTg4NTAsIC05MjY4LCAtOTI2OCwgLTk2NzksIC05Njc5LCAtMTAwNzksIC0xMDA3OSwKKy0xMDQ3MSwgLTEwNDcxLCAtMTA4NTMsIC0xMDg1MywgLTExMjI0LCAtMTEyMjQsIC0xMTU4NSwgLTExNTg1LCAtMTE5MzUsIC0xMTkzNSwKKy0xMjI3MywgLTEyMjczLCAtMTI2MDAsIC0xMjYwMCwgLTEyOTE2LCAtMTI5MTYsIC0xMzIxOSwgLTEzMjE5LCAtMTM1MTAsIC0xMzUxMCwKKy0xMzc4OCwgLTEzNzg4LCAtMTQwNTMsIC0xNDA1MywgLTE0MzA0LCAtMTQzMDQsIC0xNDU0MywgLTE0NTQzLCAtMTQ3NjcsIC0xNDc2NywKKy0xNDk3OCwgLTE0OTc4LCAtMTUxNzUsIC0xNTE3NSwgLTE1MzU3LCAtMTUzNTcsIC0xNTUyNSwgLTE1NTI1LCAtMTU2NzgsIC0xNTY3OCwKKy0xNTgxNywgLTE1ODE3LCAtMTU5NDAsIC0xNTk0MCwgLTE2MDQ5LCAtMTYwNDksIC0xNjE0MiwgLTE2MTQyLCAtMTYyMjEsIC0xNjIyMSwKKy0xNjI4NCwgLTE2Mjg0LCAtMTYzMzEsIC0xNjMzMSwgLTE2MzY0LCAtMTYzNjQsIC0xNjM4MSwgLTE2MzgxLCAtMTYzODIsIC0xNjM4MiwKKy0xNjM2OCwgLTE2MzY4LCAtMTYzMzksIC0xNjMzOSwgLTE2Mjk0LCAtMTYyOTQsIC0xNjIzNCwgLTE2MjM0LCAtMTYxNTksIC0xNjE1OSwKKy0xNjA2OSwgLTE2MDY5LCAtMTU5NjMsIC0xNTk2MywgLTE1ODQyLCAtMTU4NDIsIC0xNTcwNywgLTE1NzA3LCAtMTU1NTcsIC0xNTU1NywKKy0xNTM5MiwgLTE1MzkyLCAtMTUyMTIsIC0xNTIxMiwgLTE1MDE4LCAtMTUwMTgsIC0xNDgxMCwgLTE0ODEwLCAtMTQ1ODksIC0xNDU4OSwKKy0xNDM1MywgLTE0MzUzLCAtMTQxMDQsIC0xNDEwNCwgLTEzODQyLCAtMTM4NDIsIC0xMzU2NiwgLTEzNTY2LCAtMTMyNzgsIC0xMzI3OCwKKy0xMjk3NywgLTEyOTc3LCAtMTI2NjUsIC0xMjY2NSwgLTEyMzQwLCAtMTIzNDAsIC0xMjAwMywgLTEyMDAzLCAtMTE2NTYsIC0xMTY1NiwKKy0xMTI5NywgLTExMjk3LCAtMTA5MjgsIC0xMDkyOCwgLTEwNTQ4LCAtMTA1NDgsIC0xMDE1OSwgLTEwMTU5LCAtOTc1OSwgLTk3NTksCisgLTkzNTEsIC05MzUxLCAtODkzNCwgLTg5MzQsIC04NTA5LCAtODUwOSwgLTgwNzUsIC04MDc1LCAtNzYzNCwgLTc2MzQsCisgLTcxODYsIC03MTg2LCAtNjczMSwgLTY3MzEsIC02MjY5LCAtNjI2OSwgLTU4MDIsIC01ODAyLCAtNTMyOSwgLTUzMjksCisgLTQ4NTIsIC00ODUyLCAtNDM2OSwgLTQzNjksIC0zODgzLCAtMzg4MywgLTMzOTMsIC0zMzkzLCAtMjkwMCwgLTI5MDAsCisgLTI0MDQsIC0yNDA0LCAtMTkwNSwgLTE5MDUsIC0xNDA1LCAtMTQwNSwgIC05MDQsICAtOTA0LCAgLTQwMiwgIC00MDIsCisgICAxMDAsICAgMTAwLCAgIDYwMywgICA2MDMsICAxMTA1LCAgMTEwNSwgIDE2MDUsICAxNjA1LCAgMjEwNSwgIDIxMDUsCisgIDI2MDIsICAyNjAyLCAgMzA5NywgIDMwOTcsICAzNTg5LCAgMzU4OSwgIDQwNzgsICA0MDc4LCAgNDU2MywgIDQ1NjMsCisgIDUwNDMsICA1MDQzLCAgNTUxOSwgIDU1MTksICA1OTkwLCAgNTk5MCwgIDY0NTUsICA2NDU1LCAgNjkxNCwgIDY5MTQsCisgIDczNjYsICA3MzY2LCAgNzgxMSwgIDc4MTEsICA4MjQ5LCAgODI0OSwgIDg2ODAsICA4NjgwLCAgOTEwMiwgIDkxMDIsCisgIDk1MTYsICA5NTE2LCAgOTkyMCwgIDk5MjAsIDEwMzE1LCAxMDMxNSwgMTA3MDEsIDEwNzAxLCAxMTA3NywgMTEwNzcsCisgMTE0NDIsIDExNDQyLCAxMTc5NiwgMTE3OTYsIDEyMTM5LCAxMjEzOSwgMTI0NzEsIDEyNDcxLCAxMjc5MSwgMTI3OTEsCisgMTMwOTksIDEzMDk5LCAxMzM5NSwgMTMzOTUsIDEzNjc4LCAxMzY3OCwgMTM5NDgsIDEzOTQ4LCAxNDIwNSwgMTQyMDUsCisgMTQ0NDksIDE0NDQ5LCAxNDY3OSwgMTQ2NzksIDE0ODk1LCAxNDg5NSwgMTUwOTgsIDE1MDk4LCAxNTI4NiwgMTUyODYsCisgMTU0NTksIDE1NDU5LCAxNTYxOCwgMTU2MTgsIDE1NzYzLCAxNTc2MywgMTU4OTIsIDE1ODkyLCAxNjAwNywgMTYwMDcsCisgMTYxMDcsIDE2MTA3LCAxNjE5MSwgMTYxOTEsIDE2MjYwLCAxNjI2MCwgMTYzMTQsIDE2MzE0LCAxNjM1MywgMTYzNTMsCisgMTYzNzYsIDE2Mzc2LCAxNjM4NCwgMTYzODQsIDE2Mzc2LCAxNjM3NiwgMTYzNTMsIDE2MzUzLCAxNjMxNCwgMTYzMTQsCisgMTYyNjAsIDE2MjYwLCAxNjE5MSwgMTYxOTEsIDE2MTA3LCAxNjEwNywgMTYwMDcsIDE2MDA3LCAxNTg5MiwgMTU4OTIsCisgMTU3NjMsIDE1NzYzLCAxNTYxOCwgMTU2MTgsIDE1NDU5LCAxNTQ1OSwgMTUyODYsIDE1Mjg2LCAxNTA5OCwgMTUwOTgsCisgMTQ4OTUsIDE0ODk1LCAxNDY3OSwgMTQ2NzksIDE0NDQ5LCAxNDQ0OSwgMTQyMDUsIDE0MjA1LCAxMzk0OCwgMTM5NDgsCisgMTM2NzgsIDEzNjc4LCAxMzM5NSwgMTMzOTUsIDEzMDk5LCAxMzA5OSwgMTI3OTEsIDEyNzkxLCAxMjQ3MSwgMTI0NzEsCisgMTIxMzksIDEyMTM5LCAxMTc5NiwgMTE3OTYsIDExNDQyLCAxMTQ0MiwgMTEwNzcsIDExMDc3LCAxMDcwMSwgMTA3MDEsCisgMTAzMTUsIDEwMzE1LCAgOTkyMCwgIDk5MjAsICA5NTE2LCAgOTUxNiwgIDkxMDIsICA5MTAyLCAgODY4MCwgIDg2ODAsCisgIDgyNDksICA4MjQ5LCAgNzgxMSwgIDc4MTEsICA3MzY2LCAgNzM2NiwgIDY5MTQsICA2OTE0LCAgNjQ1NSwgIDY0NTUsCisgIDU5OTAsICA1OTkwLCAgNTUxOSwgIDU1MTksICA1MDQzLCAgNTA0MywgIDQ1NjMsICA0NTYzLCAgNDA3OCwgIDQwNzgsCisgIDM1ODksICAzNTg5LCAgMzA5NywgIDMwOTcsICAyNjAyLCAgMjYwMiwgIDIxMDUsICAyMTA1LCAgMTYwNSwgIDE2MDUsCisgIDExMDUsICAxMTA1LCAgIDYwMywgICA2MDMsICAgMTAwLCAgIDEwMCwgIC00MDIsICAtNDAyLCAgLTkwNCwgIC05MDQsCisgLTE0MDUsIC0xNDA1LCAtMTkwNSwgLTE5MDUsIC0yNDA0LCAtMjQwNCwgLTI5MDAsIC0yOTAwLCAtMzM5MywgLTMzOTMsCisgLTM4ODMsIC0zODgzLCAtNDM2OSwgLTQzNjksIC00ODUyLCAtNDg1MiwgLTUzMjksIC01MzI5LCAtNTgwMiwgLTU4MDIsCisgLTYyNjksIC02MjY5LCAtNjczMSwgLTY3MzEsIC03MTg2LCAtNzE4NiwgLTc2MzQsIC03NjM0LCAtODA3NSwgLTgwNzUsCisgLTg1MDksIC04NTA5LCAtODkzNCwgLTg5MzQsIC05MzUxLCAtOTM1MSwgLTk3NTksIC05NzU5LCAtMTAxNTksIC0xMDE1OSwKKy0xMDU0OCwgLTEwNTQ4LCAtMTA5MjgsIC0xMDkyOCwgLTExMjk3LCAtMTEyOTcsIC0xMTY1NiwgLTExNjU2LCAtMTIwMDMsIC0xMjAwMywKKy0xMjM0MCwgLTEyMzQwLCAtMTI2NjUsIC0xMjY2NSwgLTEyOTc3LCAtMTI5NzcsIC0xMzI3OCwgLTEzMjc4LCAtMTM1NjYsIC0xMzU2NiwKKy0xMzg0MiwgLTEzODQyLCAtMTQxMDQsIC0xNDEwNCwgLTE0MzUzLCAtMTQzNTMsIC0xNDU4OSwgLTE0NTg5LCAtMTQ4MTAsIC0xNDgxMCwKKy0xNTAxOCwgLTE1MDE4LCAtMTUyMTIsIC0xNTIxMiwgLTE1MzkyLCAtMTUzOTIsIC0xNTU1NywgLTE1NTU3LCAtMTU3MDcsIC0xNTcwNywKKy0xNTg0MiwgLTE1ODQyLCAtMTU5NjMsIC0xNTk2MywgLTE2MDY5LCAtMTYwNjksIC0xNjE1OSwgLTE2MTU5LCAtMTYyMzQsIC0xNjIzNCwKKy0xNjI5NCwgLTE2Mjk0LCAtMTYzMzksIC0xNjMzOSwgLTE2MzY4LCAtMTYzNjgsIC0xNjM4MiwgLTE2MzgyLCAtMTYzODEsIC0xNjM4MSwKKy0xNjM2NCwgLTE2MzY0LCAtMTYzMzEsIC0xNjMzMSwgLTE2Mjg0LCAtMTYyODQsIC0xNjIyMSwgLTE2MjIxLCAtMTYxNDIsIC0xNjE0MiwKKy0xNjA0OSwgLTE2MDQ5LCAtMTU5NDAsIC0xNTk0MCwgLTE1ODE3LCAtMTU4MTcsIC0xNTY3OCwgLTE1Njc4LCAtMTU1MjUsIC0xNTUyNSwKKy0xNTM1NywgLTE1MzU3LCAtMTUxNzUsIC0xNTE3NSwgLTE0OTc4LCAtMTQ5NzgsIC0xNDc2NywgLTE0NzY3LCAtMTQ1NDMsIC0xNDU0MywKKy0xNDMwNCwgLTE0MzA0LCAtMTQwNTMsIC0xNDA1MywgLTEzNzg4LCAtMTM3ODgsIC0xMzUxMCwgLTEzNTEwLCAtMTMyMTksIC0xMzIxOSwKKy0xMjkxNiwgLTEyOTE2LCAtMTI2MDAsIC0xMjYwMCwgLTEyMjczLCAtMTIyNzMsIC0xMTkzNSwgLTExOTM1LCAtMTE1ODUsIC0xMTU4NSwKKy0xMTIyNCwgLTExMjI0LCAtMTA4NTMsIC0xMDg1MywgLTEwNDcxLCAtMTA0NzEsIC0xMDA3OSwgLTEwMDc5LCAtOTY3OSwgLTk2NzksCisgLTkyNjgsIC05MjY4LCAtODg1MCwgLTg4NTAsIC04NDIzLCAtODQyMywgLTc5ODgsIC03OTg4LCAtNzU0NSwgLTc1NDUsCisgLTcwOTUsIC03MDk1LCAtNjYzOSwgLTY2MzksIC02MTc2LCAtNjE3NiwgLTU3MDgsIC01NzA4LCAtNTIzNCwgLTUyMzQsCisgLTQ3NTYsIC00NzU2LCAtNDI3MiwgLTQyNzIsIC0zNzg1LCAtMzc4NSwgLTMyOTQsIC0zMjk0LCAtMjgwMSwgLTI4MDEsCisgLTIzMDQsIC0yMzA0LCAtMTgwNSwgLTE4MDUsIC0xMzA1LCAtMTMwNSwgIC04MDMsICAtODAzLCAgLTMwMSwgIC0zMDEsCisgICAyMDEsICAgMjAxLCAgIDcwMywgICA3MDMsICAxMjA1LCAgMTIwNSwgIDE3MDUsICAxNzA1LCAgMjIwNCwgIDIyMDQsCisgIDI3MDEsICAyNzAxLCAgMzE5NiwgIDMxOTYsICAzNjg3LCAgMzY4NywgIDQxNzUsICA0MTc1LCAgNDY1OSwgIDQ2NTksCisgIDUxMzksICA1MTM5LCAgNTYxNCwgIDU2MTQsICA2MDgzLCAgNjA4MywgIDY1NDcsICA2NTQ3LCAgNzAwNSwgIDcwMDUsCisgIDc0NTYsICA3NDU2LCAgNzkwMCwgIDc5MDAsICA4MzM2LCAgODMzNiwgIDg3NjUsICA4NzY1LCAgOTE4NSwgIDkxODUsCisgIDk1OTcsICA5NTk3LCAxMDAwMCwgMTAwMDAsIDEwMzkzLCAxMDM5MywgMTA3NzcsIDEwNzc3LCAxMTE1MCwgMTExNTAsCisgMTE1MTMsIDExNTEzLCAxMTg2NiwgMTE4NjYsIDEyMjA3LCAxMjIwNywgMTI1MzYsIDEyNTM2LCAxMjg1NCwgMTI4NTQsCisgMTMxNTksIDEzMTU5LCAxMzQ1MiwgMTM0NTIsIDEzNzMzLCAxMzczMywgMTQwMDEsIDE0MDAxLCAxNDI1NSwgMTQyNTUsCisgMTQ0OTYsIDE0NDk2LCAxNDcyMywgMTQ3MjMsIDE0OTM3LCAxNDkzNywgMTUxMzYsIDE1MTM2LCAxNTMyMiwgMTUzMjIsCisgMTU0OTIsIDE1NDkyLCAxNTY0OSwgMTU2NDksIDE1NzkwLCAxNTc5MCwgMTU5MTcsIDE1OTE3LCAxNjAyOCwgMTYwMjgsCisgMTYxMjUsIDE2MTI1LCAxNjIwNiwgMTYyMDYsIDE2MjcyLCAxNjI3MiwgMTYzMjMsIDE2MzIzLCAxNjM1OSwgMTYzNTksCisgMTYzNzksIDE2Mzc5LCAxNjM4MywgMTYzODMsIDE2MzcyLCAxNjM3MiwgMTYzNDYsIDE2MzQ2LCAxNjMwNSwgMTYzMDUsCisgMTYyNDgsIDE2MjQ4LCAxNjE3NSwgMTYxNzUsIDE2MDg4LCAxNjA4OCwgMTU5ODUsIDE1OTg1LCAxNTg2OCwgMTU4NjgsCisgMTU3MzUsIDE1NzM1LCAxNTU4OCwgMTU1ODgsIDE1NDI2LCAxNTQyNiwgMTUyNDksIDE1MjQ5LCAxNTA1OCwgMTUwNTgsCisgMTQ4NTMsIDE0ODUzLCAxNDYzNCwgMTQ2MzQsIDE0NDAxLCAxNDQwMSwgMTQxNTUsIDE0MTU1LCAxMzg5NSwgMTM4OTUsCisgMTM2MjIsIDEzNjIyLCAxMzMzNywgMTMzMzcsIDEzMDM4LCAxMzAzOCwgMTI3MjgsIDEyNzI4LCAxMjQwNiwgMTI0MDYsCisgMTIwNzIsIDEyMDcyLCAxMTcyNiwgMTE3MjYsIDExMzcwLCAxMTM3MCwgMTEwMDIsIDExMDAyLCAxMDYyNSwgMTA2MjUsCisgMTAyMzcsIDEwMjM3LCAgOTg0MCwgIDk4NDAsICA5NDM0LCAgOTQzNCwgIDkwMTgsICA5MDE4LCAgODU5NCwgIDg1OTQsCisgIDgxNjIsICA4MTYyLCAgNzcyMywgIDc3MjMsICA3Mjc2LCAgNzI3NiwgIDY4MjIsICA2ODIyLCAgNjM2MiwgIDYzNjIsCisgIDU4OTYsICA1ODk2LCAgNTQyNCwgIDU0MjQsICA0OTQ4LCAgNDk0OCwgIDQ0NjYsICA0NDY2LCAgMzk4MCwgIDM5ODAsCisgIDM0OTEsICAzNDkxLCAgMjk5OCwgIDI5OTgsICAyNTAzLCAgMjUwMywgIDIwMDUsICAyMDA1LCAgMTUwNSwgIDE1MDUsCisgIDEwMDQsICAxMDA0LCAgIDUwMiwgICA1MDIsICAgICAwLCAgICAgMCwgIC01MDIsICAtNTAyLCAtMTAwNCwgLTEwMDQsCisgLTE1MDUsIC0xNTA1LCAtMjAwNSwgLTIwMDUsIC0yNTAzLCAtMjUwMywgLTI5OTgsIC0yOTk4LCAtMzQ5MSwgLTM0OTEsCisgLTM5ODAsIC0zOTgwLCAtNDQ2NiwgLTQ0NjYsIC00OTQ4LCAtNDk0OCwgLTU0MjQsIC01NDI0LCAtNTg5NiwgLTU4OTYsCisgLTYzNjIsIC02MzYyLCAtNjgyMiwgLTY4MjIsIC03Mjc2LCAtNzI3NiwgLTc3MjMsIC03NzIzLCAtODE2MiwgLTgxNjIsCisgLTg1OTQsIC04NTk0LCAtOTAxOCwgLTkwMTgsIC05NDM0LCAtOTQzNCwgLTk4NDAsIC05ODQwLCAtMTAyMzcsIC0xMDIzNywKKy0xMDYyNSwgLTEwNjI1LCAtMTEwMDIsIC0xMTAwMiwgLTExMzcwLCAtMTEzNzAsIC0xMTcyNiwgLTExNzI2LCAtMTIwNzIsIC0xMjA3MiwKKy0xMjQwNiwgLTEyNDA2LCAtMTI3MjgsIC0xMjcyOCwgLTEzMDM4LCAtMTMwMzgsIC0xMzMzNywgLTEzMzM3LCAtMTM2MjIsIC0xMzYyMiwKKy0xMzg5NSwgLTEzODk1LCAtMTQxNTUsIC0xNDE1NSwgLTE0NDAxLCAtMTQ0MDEsIC0xNDYzNCwgLTE0NjM0LCAtMTQ4NTMsIC0xNDg1MywKKy0xNTA1OCwgLTE1MDU4LCAtMTUyNDksIC0xNTI0OSwgLTE1NDI2LCAtMTU0MjYsIC0xNTU4OCwgLTE1NTg4LCAtMTU3MzUsIC0xNTczNSwKKy0xNTg2OCwgLTE1ODY4LCAtMTU5ODUsIC0xNTk4NSwgLTE2MDg4LCAtMTYwODgsIC0xNjE3NSwgLTE2MTc1LCAtMTYyNDgsIC0xNjI0OCwKKy0xNjMwNSwgLTE2MzA1LCAtMTYzNDYsIC0xNjM0NiwgLTE2MzcyLCAtMTYzNzIsIC0xNjM4MywgLTE2MzgzLCAtMTYzNzksIC0xNjM3OSwKKy0xNjM1OSwgLTE2MzU5LCAtMTYzMjMsIC0xNjMyMywgLTE2MjcyLCAtMTYyNzIsIC0xNjIwNiwgLTE2MjA2LCAtMTYxMjUsIC0xNjEyNSwKKy0xNjAyOCwgLTE2MDI4LCAtMTU5MTcsIC0xNTkxNywgLTE1NzkwLCAtMTU3OTAsIC0xNTY0OSwgLTE1NjQ5LCAtMTU0OTIsIC0xNTQ5MiwKKy0xNTMyMiwgLTE1MzIyLCAtMTUxMzYsIC0xNTEzNiwgLTE0OTM3LCAtMTQ5MzcsIC0xNDcyMywgLTE0NzIzLCAtMTQ0OTYsIC0xNDQ5NiwKKy0xNDI1NSwgLTE0MjU1LCAtMTQwMDEsIC0xNDAwMSwgLTEzNzMzLCAtMTM3MzMsIC0xMzQ1MiwgLTEzNDUyLCAtMTMxNTksIC0xMzE1OSwKKy0xMjg1NCwgLTEyODU0LCAtMTI1MzYsIC0xMjUzNiwgLTEyMjA3LCAtMTIyMDcsIC0xMTg2NiwgLTExODY2LCAtMTE1MTMsIC0xMTUxMywKKy0xMTE1MCwgLTExMTUwLCAtMTA3NzcsIC0xMDc3NywgLTEwMzkzLCAtMTAzOTMsIC0xMDAwMCwgLTEwMDAwLCAtOTU5NywgLTk1OTcsCisgLTkxODUsIC05MTg1LCAtODc2NSwgLTg3NjUsIC04MzM2LCAtODMzNiwgLTc5MDAsIC03OTAwLCAtNzQ1NiwgLTc0NTYsCisgLTcwMDUsIC03MDA1LCAtNjU0NywgLTY1NDcsIC02MDgzLCAtNjA4MywgLTU2MTQsIC01NjE0LCAtNTEzOSwgLTUxMzksCisgLTQ2NTksIC00NjU5LCAtNDE3NSwgLTQxNzUsIC0zNjg3LCAtMzY4NywgLTMxOTYsIC0zMTk2LCAtMjcwMSwgLTI3MDEsCisgLTIyMDQsIC0yMjA0LCAtMTcwNSwgLTE3MDUsIC0xMjA1LCAtMTIwNSwgIC03MDMsICAtNzAzLCAgLTIwMSwgIC0yMDEsCisgICAzMDEsICAgMzAxLCAgIDgwMywgICA4MDMsICAxMzA1LCAgMTMwNSwgIDE4MDUsICAxODA1LCAgMjMwNCwgIDIzMDQsCisgIDI4MDEsICAyODAxLCAgMzI5NCwgIDMyOTQsICAzNzg1LCAgMzc4NSwgIDQyNzIsICA0MjcyLCAgNDc1NiwgIDQ3NTYsCisgIDUyMzQsICA1MjM0LCAgNTcwOCwgIDU3MDgsICA2MTc2LCAgNjE3NiwgIDY2MzksICA2NjM5LCAgNzA5NSwgIDcwOTUsCisgIDc1NDUsICA3NTQ1LCAgNzk4OCwgIDc5ODgsICA4NDIzLCAgODQyMywgIDg4NTAsICA4ODUwLCAgOTI2OCwgIDkyNjgsCisgIDk2NzksICA5Njc5LCAxMDA3OSwgMTAwNzksIDEwNDcxLCAxMDQ3MSwgMTA4NTMsIDEwODUzLCAxMTIyNCwgMTEyMjQsCisgMTE1ODUsIDExNTg1LCAxMTkzNSwgMTE5MzUsIDEyMjczLCAxMjI3MywgMTI2MDAsIDEyNjAwLCAxMjkxNiwgMTI5MTYsCisgMTMyMTksIDEzMjE5LCAxMzUxMCwgMTM1MTAsIDEzNzg4LCAxMzc4OCwgMTQwNTMsIDE0MDUzLCAxNDMwNCwgMTQzMDQsCisgMTQ1NDMsIDE0NTQzLCAxNDc2NywgMTQ3NjcsIDE0OTc4LCAxNDk3OCwgMTUxNzUsIDE1MTc1LCAxNTM1NywgMTUzNTcsCisgMTU1MjUsIDE1NTI1LCAxNTY3OCwgMTU2NzgsIDE1ODE3LCAxNTgxNywgMTU5NDAsIDE1OTQwLCAxNjA0OSwgMTYwNDksCisgMTYxNDIsIDE2MTQyLCAxNjIyMSwgMTYyMjEsIDE2Mjg0LCAxNjI4NCwgMTYzMzEsIDE2MzMxLCAxNjM2NCwgMTYzNjQsCisgMTYzODEsIDE2MzgxLCAxNjM4MiwgMTYzODIsIDE2MzY4LCAxNjM2OCwgMTYzMzksIDE2MzM5LCAxNjI5NCwgMTYyOTQsCisgMTYyMzQsIDE2MjM0LCAxNjE1OSwgMTYxNTksIDE2MDY5LCAxNjA2OSwgMTU5NjMsIDE1OTYzLCAxNTg0MiwgMTU4NDIsCisgMTU3MDcsIDE1NzA3LCAxNTU1NywgMTU1NTcsIDE1MzkyLCAxNTM5MiwgMTUyMTIsIDE1MjEyLCAxNTAxOCwgMTUwMTgsCisgMTQ4MTAsIDE0ODEwLCAxNDU4OSwgMTQ1ODksIDE0MzUzLCAxNDM1MywgMTQxMDQsIDE0MTA0LCAxMzg0MiwgMTM4NDIsCisgMTM1NjYsIDEzNTY2LCAxMzI3OCwgMTMyNzgsIDEyOTc3LCAxMjk3NywgMTI2NjUsIDEyNjY1LCAxMjM0MCwgMTIzNDAsCisgMTIwMDMsIDEyMDAzLCAxMTY1NiwgMTE2NTYsIDExMjk3LCAxMTI5NywgMTA5MjgsIDEwOTI4LCAxMDU0OCwgMTA1NDgsCisgMTAxNTksIDEwMTU5LCAgOTc1OSwgIDk3NTksICA5MzUxLCAgOTM1MSwgIDg5MzQsICA4OTM0LCAgODUwOSwgIDg1MDksCisgIDgwNzUsICA4MDc1LCAgNzYzNCwgIDc2MzQsICA3MTg2LCAgNzE4NiwgIDY3MzEsICA2NzMxLCAgNjI2OSwgIDYyNjksCisgIDU4MDIsICA1ODAyLCAgNTMyOSwgIDUzMjksICA0ODUyLCAgNDg1MiwgIDQzNjksICA0MzY5LCAgMzg4MywgIDM4ODMsCisgIDMzOTMsICAzMzkzLCAgMjkwMCwgIDI5MDAsICAyNDA0LCAgMjQwNCwgIDE5MDUsICAxOTA1LCAgMTQwNSwgIDE0MDUsCisgICA5MDQsICAgOTA0LCAgIDQwMiwgICA0MDIsICAtMTAwLCAgLTEwMCwgIC02MDMsICAtNjAzLCAtMTEwNSwgLTExMDUsCisgLTE2MDUsIC0xNjA1LCAtMjEwNSwgLTIxMDUsIC0yNjAyLCAtMjYwMiwgLTMwOTcsIC0zMDk3LCAtMzU4OSwgLTM1ODksCisgLTQwNzgsIC00MDc4LCAtNDU2MywgLTQ1NjMsIC01MDQzLCAtNTA0MywgLTU1MTksIC01NTE5LCAtNTk5MCwgLTU5OTAsCisgLTY0NTUsIC02NDU1LCAtNjkxNCwgLTY5MTQsIC03MzY2LCAtNzM2NiwgLTc4MTEsIC03ODExLCAtODI0OSwgLTgyNDksCisgLTg2ODAsIC04NjgwLCAtOTEwMiwgLTkxMDIsIC05NTE2LCAtOTUxNiwgLTk5MjAsIC05OTIwLCAtMTAzMTUsIC0xMDMxNSwKKy0xMDcwMSwgLTEwNzAxLCAtMTEwNzcsIC0xMTA3NywgLTExNDQyLCAtMTE0NDIsIC0xMTc5NiwgLTExNzk2LCAtMTIxMzksIC0xMjEzOSwKKy0xMjQ3MSwgLTEyNDcxLCAtMTI3OTEsIC0xMjc5MSwgLTEzMDk5LCAtMTMwOTksIC0xMzM5NSwgLTEzMzk1LCAtMTM2NzgsIC0xMzY3OCwKKy0xMzk0OCwgLTEzOTQ4LCAtMTQyMDUsIC0xNDIwNSwgLTE0NDQ5LCAtMTQ0NDksIC0xNDY3OSwgLTE0Njc5LCAtMTQ4OTUsIC0xNDg5NSwKKy0xNTA5OCwgLTE1MDk4LCAtMTUyODYsIC0xNTI4NiwgLTE1NDU5LCAtMTU0NTksIC0xNTYxOCwgLTE1NjE4LCAtMTU3NjMsIC0xNTc2MywKKy0xNTg5MiwgLTE1ODkyLCAtMTYwMDcsIC0xNjAwNywgLTE2MTA3LCAtMTYxMDcsIC0xNjE5MSwgLTE2MTkxLCAtMTYyNjAsIC0xNjI2MCwKKy0xNjMxNCwgLTE2MzE0LCAtMTYzNTMsIC0xNjM1MywgLTE2Mzc2LCAtMTYzNzYsIC0xNjM4MywgLTE2MzgzLCAtMTYzNzYsIC0xNjM3NiwKKy0xNjM1MywgLTE2MzUzLCAtMTYzMTQsIC0xNjMxNCwgLTE2MjYwLCAtMTYyNjAsIC0xNjE5MSwgLTE2MTkxLCAtMTYxMDcsIC0xNjEwNywKKy0xNjAwNywgLTE2MDA3LCAtMTU4OTIsIC0xNTg5MiwgLTE1NzYzLCAtMTU3NjMsIC0xNTYxOCwgLTE1NjE4LCAtMTU0NTksIC0xNTQ1OSwKKy0xNTI4NiwgLTE1Mjg2LCAtMTUwOTgsIC0xNTA5OCwgLTE0ODk1LCAtMTQ4OTUsIC0xNDY3OSwgLTE0Njc5LCAtMTQ0NDksIC0xNDQ0OSwKKy0xNDIwNSwgLTE0MjA1LCAtMTM5NDgsIC0xMzk0OCwgLTEzNjc4LCAtMTM2NzgsIC0xMzM5NSwgLTEzMzk1LCAtMTMwOTksIC0xMzA5OSwKKy0xMjc5MSwgLTEyNzkxLCAtMTI0NzEsIC0xMjQ3MSwgLTEyMTM5LCAtMTIxMzksIC0xMTc5NiwgLTExNzk2LCAtMTE0NDIsIC0xMTQ0MiwKKy0xMTA3NywgLTExMDc3LCAtMTA3MDEsIC0xMDcwMSwgLTEwMzE1LCAtMTAzMTUsIC05OTIwLCAtOTkyMCwgLTk1MTYsIC05NTE2LAorIC05MTAyLCAtOTEwMiwgLTg2ODAsIC04NjgwLCAtODI0OSwgLTgyNDksIC03ODExLCAtNzgxMSwgLTczNjYsIC03MzY2LAorIC02OTE0LCAtNjkxNCwgLTY0NTUsIC02NDU1LCAtNTk5MCwgLTU5OTAsIC01NTE5LCAtNTUxOSwgLTUwNDMsIC01MDQzLAorIC00NTYzLCAtNDU2MywgLTQwNzgsIC00MDc4LCAtMzU4OSwgLTM1ODksIC0zMDk3LCAtMzA5NywgLTI2MDIsIC0yNjAyLAorIC0yMTA1LCAtMjEwNSwgLTE2MDUsIC0xNjA1LCAtMTEwNSwgLTExMDUsICAtNjAzLCAgLTYwMywgIC0xMDAsICAtMTAwLAorICAgNDAyLCAgIDQwMiwgICA5MDQsICAgOTA0LCAgMTQwNSwgIDE0MDUsICAxOTA1LCAgMTkwNSwgIDI0MDQsICAyNDA0LAorICAyOTAwLCAgMjkwMCwgIDMzOTMsICAzMzkzLCAgMzg4MywgIDM4ODMsICA0MzY5LCAgNDM2OSwgIDQ4NTIsICA0ODUyLAorICA1MzI5LCAgNTMyOSwgIDU4MDIsICA1ODAyLCAgNjI2OSwgIDYyNjksICA2NzMxLCAgNjczMSwgIDcxODYsICA3MTg2LAorICA3NjM0LCAgNzYzNCwgIDgwNzUsICA4MDc1LCAgODUwOSwgIDg1MDksICA4OTM0LCAgODkzNCwgIDkzNTEsICA5MzUxLAorICA5NzU5LCAgOTc1OSwgMTAxNTksIDEwMTU5LCAxMDU0OCwgMTA1NDgsIDEwOTI4LCAxMDkyOCwgMTEyOTcsIDExMjk3LAorIDExNjU2LCAxMTY1NiwgMTIwMDMsIDEyMDAzLCAxMjM0MCwgMTIzNDAsIDEyNjY1LCAxMjY2NSwgMTI5NzcsIDEyOTc3LAorIDEzMjc4LCAxMzI3OCwgMTM1NjYsIDEzNTY2LCAxMzg0MiwgMTM4NDIsIDE0MTA0LCAxNDEwNCwgMTQzNTMsIDE0MzUzLAorIDE0NTg5LCAxNDU4OSwgMTQ4MTAsIDE0ODEwLCAxNTAxOCwgMTUwMTgsIDE1MjEyLCAxNTIxMiwgMTUzOTIsIDE1MzkyLAorIDE1NTU3LCAxNTU1NywgMTU3MDcsIDE1NzA3LCAxNTg0MiwgMTU4NDIsIDE1OTYzLCAxNTk2MywgMTYwNjksIDE2MDY5LAorIDE2MTU5LCAxNjE1OSwgMTYyMzQsIDE2MjM0LCAxNjI5NCwgMTYyOTQsIDE2MzM5LCAxNjMzOSwgMTYzNjgsIDE2MzY4LAorIDE2MzgyLCAxNjM4MiwgMTYzODEsIDE2MzgxLCAxNjM2NCwgMTYzNjQsIDE2MzMxLCAxNjMzMSwgMTYyODQsIDE2Mjg0LAorIDE2MjIxLCAxNjIyMSwgMTYxNDIsIDE2MTQyLCAxNjA0OSwgMTYwNDksIDE1OTQwLCAxNTk0MCwgMTU4MTcsIDE1ODE3LAorIDE1Njc4LCAxNTY3OCwgMTU1MjUsIDE1NTI1LCAxNTM1NywgMTUzNTcsIDE1MTc1LCAxNTE3NSwgMTQ5NzgsIDE0OTc4LAorIDE0NzY3LCAxNDc2NywgMTQ1NDMsIDE0NTQzLCAxNDMwNCwgMTQzMDQsIDE0MDUzLCAxNDA1MywgMTM3ODgsIDEzNzg4LAorIDEzNTEwLCAxMzUxMCwgMTMyMTksIDEzMjE5LCAxMjkxNiwgMTI5MTYsIDEyNjAwLCAxMjYwMCwgMTIyNzMsIDEyMjczLAorIDExOTM1LCAxMTkzNSwgMTE1ODUsIDExNTg1LCAxMTIyNCwgMTEyMjQsIDEwODUzLCAxMDg1MywgMTA0NzEsIDEwNDcxLAorIDEwMDc5LCAxMDA3OSwgIDk2NzksICA5Njc5LCAgOTI2OCwgIDkyNjgsICA4ODUwLCAgODg1MCwgIDg0MjMsICA4NDIzLAorICA3OTg4LCAgNzk4OCwgIDc1NDUsICA3NTQ1LCAgNzA5NSwgIDcwOTUsICA2NjM5LCAgNjYzOSwgIDYxNzYsICA2MTc2LAorICA1NzA4LCAgNTcwOCwgIDUyMzQsICA1MjM0LCAgNDc1NiwgIDQ3NTYsICA0MjcyLCAgNDI3MiwgIDM3ODUsICAzNzg1LAorICAzMjk0LCAgMzI5NCwgIDI4MDEsICAyODAxLCAgMjMwNCwgIDIzMDQsICAxODA1LCAgMTgwNSwgIDEzMDUsICAxMzA1LAorICAgODAzLCAgIDgwMywgICAzMDEsICAgMzAxLCAgLTIwMSwgIC0yMDEsICAtNzAzLCAgLTcwMywgLTEyMDUsIC0xMjA1LAorIC0xNzA1LCAtMTcwNSwgLTIyMDQsIC0yMjA0LCAtMjcwMSwgLTI3MDEsIC0zMTk2LCAtMzE5NiwgLTM2ODcsIC0zNjg3LAorIC00MTc1LCAtNDE3NSwgLTQ2NTksIC00NjU5LCAtNTEzOSwgLTUxMzksIC01NjE0LCAtNTYxNCwgLTYwODMsIC02MDgzLAorIC02NTQ3LCAtNjU0NywgLTcwMDUsIC03MDA1LCAtNzQ1NiwgLTc0NTYsIC03OTAwLCAtNzkwMCwgLTgzMzYsIC04MzM2LAorIC04NzY1LCAtODc2NSwgLTkxODUsIC05MTg1LCAtOTU5NywgLTk1OTcsIC0xMDAwMCwgLTEwMDAwLCAtMTAzOTMsIC0xMDM5MywKKy0xMDc3NywgLTEwNzc3LCAtMTExNTAsIC0xMTE1MCwgLTExNTEzLCAtMTE1MTMsIC0xMTg2NiwgLTExODY2LCAtMTIyMDcsIC0xMjIwNywKKy0xMjUzNiwgLTEyNTM2LCAtMTI4NTQsIC0xMjg1NCwgLTEzMTU5LCAtMTMxNTksIC0xMzQ1MiwgLTEzNDUyLCAtMTM3MzMsIC0xMzczMywKKy0xNDAwMSwgLTE0MDAxLCAtMTQyNTUsIC0xNDI1NSwgLTE0NDk2LCAtMTQ0OTYsIC0xNDcyMywgLTE0NzIzLCAtMTQ5MzcsIC0xNDkzNywKKy0xNTEzNiwgLTE1MTM2LCAtMTUzMjIsIC0xNTMyMiwgLTE1NDkyLCAtMTU0OTIsIC0xNTY0OSwgLTE1NjQ5LCAtMTU3OTAsIC0xNTc5MCwKKy0xNTkxNywgLTE1OTE3LCAtMTYwMjgsIC0xNjAyOCwgLTE2MTI1LCAtMTYxMjUsIC0xNjIwNiwgLTE2MjA2LCAtMTYyNzIsIC0xNjI3MiwKKy0xNjMyMywgLTE2MzIzLCAtMTYzNTksIC0xNjM1OSwgLTE2Mzc5LCAtMTYzNzksIC0xNjM4MywgLTE2MzgzLCAtMTYzNzIsIC0xNjM3MiwKKy0xNjM0NiwgLTE2MzQ2LCAtMTYzMDUsIC0xNjMwNSwgLTE2MjQ4LCAtMTYyNDgsIC0xNjE3NSwgLTE2MTc1LCAtMTYwODgsIC0xNjA4OCwKKy0xNTk4NSwgLTE1OTg1LCAtMTU4NjgsIC0xNTg2OCwgLTE1NzM1LCAtMTU3MzUsIC0xNTU4OCwgLTE1NTg4LCAtMTU0MjYsIC0xNTQyNiwKKy0xNTI0OSwgLTE1MjQ5LCAtMTUwNTgsIC0xNTA1OCwgLTE0ODUzLCAtMTQ4NTMsIC0xNDYzNCwgLTE0NjM0LCAtMTQ0MDEsIC0xNDQwMSwKKy0xNDE1NSwgLTE0MTU1LCAtMTM4OTUsIC0xMzg5NSwgLTEzNjIyLCAtMTM2MjIsIC0xMzMzNywgLTEzMzM3LCAtMTMwMzgsIC0xMzAzOCwKKy0xMjcyOCwgLTEyNzI4LCAtMTI0MDYsIC0xMjQwNiwgLTEyMDcyLCAtMTIwNzIsIC0xMTcyNiwgLTExNzI2LCAtMTEzNzAsIC0xMTM3MCwKKy0xMTAwMiwgLTExMDAyLCAtMTA2MjUsIC0xMDYyNSwgLTEwMjM3LCAtMTAyMzcsIC05ODQwLCAtOTg0MCwgLTk0MzQsIC05NDM0LAorIC05MDE4LCAtOTAxOCwgLTg1OTQsIC04NTk0LCAtODE2MiwgLTgxNjIsIC03NzIzLCAtNzcyMywgLTcyNzYsIC03Mjc2LAorIC02ODIyLCAtNjgyMiwgLTYzNjIsIC02MzYyLCAtNTg5NiwgLTU4OTYsIC01NDI0LCAtNTQyNCwgLTQ5NDgsIC00OTQ4LAorIC00NDY2LCAtNDQ2NiwgLTM5ODAsIC0zOTgwLCAtMzQ5MSwgLTM0OTEsIC0yOTk4LCAtMjk5OCwgLTI1MDMsIC0yNTAzLAorIC0yMDA1LCAtMjAwNSwgLTE1MDUsIC0xNTA1LCAtMTAwNCwgLTEwMDQsICAtNTAyLCAgLTUwMgorfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2Vhc3lzbmRfdGVzdHRvbmUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgYXVkaW9fZmlsbCkKK3sKK2ludCBpMTsKK3Vuc2lnbmVkIGNoYXIgKnAyOworc3RydWN0IGRhdGFfYnVmZmVyICpwYXVkaW9fYnVmZmVyOworCitKT1QoOCwgIiVpPWF1ZGlvX2ZpbGxcbiIsIGF1ZGlvX2ZpbGwpOworCitwYXVkaW9fYnVmZmVyID0gJnBlYXN5Y2FwLT5hdWRpb19idWZmZXJbYXVkaW9fZmlsbF07CisKK3AyID0gKHVuc2lnbmVkIGNoYXIgKikocGF1ZGlvX2J1ZmZlci0+cGdvKTsKK2ZvciAoaTEgPSAwOyAgaTEgPCBQQUdFX1NJWkU7ICBpMSArPSA0LCBwMiArPSA0KSB7CisJKnAyICAgICAgID0gKHVuc2lnbmVkIGNoYXIpICgweDAwRkYgJiB0b25lc1tpMS8yXSk7CisJKihwMiArIDEpID0gKHVuc2lnbmVkIGNoYXIpKCgweEZGMDAgJiB0b25lc1tpMS8yXSkgPj4gOCk7CisJKihwMiArIDIpID0gKHVuc2lnbmVkIGNoYXIpICgweDAwRkYgJiB0b25lc1tpMS8yICsgMV0pOworCSoocDIgKyAzKSA9ICh1bnNpZ25lZCBjaGFyKSgoMHhGRjAwICYgdG9uZXNbaTEvMiArIDFdKSA+PiA4KTsKKwl9CityZXR1cm47Cit9CisjZW5kaWYgLypFQVNZQ0FQX1RFU1RUT05FKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMKaW5kZXggYTZkOWYyOS4uMjFjNWVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMKQEAgLTc2MCw3ICs3NjAsOCBAQAogCQkJaWYgKGV0ZGV2LT5saW5rc3BlZWQgPT0gVFJVRVBIWV9TUEVFRF8xME1CUFMpIHsKIAkJCQkvKiBOT1RFIC0gSXMgdGhlcmUgYSB3YXkgdG8gcXVlcnkgdGhpcyB3aXRob3V0CiAJCQkJICogVHJ1ZVBIWT8KLQkJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShldGRldi0+aFRydWVQaHksIDApID09IEVNSV9UUlVFUEhZX0ExM08pIHsKKwkJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShldGRldi0+aFRydWVQaHksIDApID09CisJCQkJICogRU1JX1RSVUVQSFlfQTEzTykgewogCQkJCSAqLwogCQkJCXUxNiBSZWdpc3RlcjE4OwogCkBAIC03NzgsNyArNzc5LDcgQEAKIAkJCSAqIGluIHRoZSBMaW5rRGV0ZWN0aW9uRFBDKS4KIAkJCSAqLwogCQkJaWYgKCEoZXRkZXYtPkZsYWdzICYgZk1QX0FEQVBURVJfTElOS19ERVRFQ1RJT04pIHx8Ci0JCQkgIChldGRldi0+TWVkaWFTdGF0ZSA9PSBORVRJRl9TVEFUVVNfTUVESUFfRElTQ09OTkVDVCkpIHsKKwkJCSAoZXRkZXYtPk1lZGlhU3RhdGUgPT0gTkVUSUZfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpKSB7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5Mb2NrLCBmbGFncyk7CiAJCQkJZXRkZXYtPk1lZGlhU3RhdGUgPQogCQkJCSAgICBORVRJRl9TVEFUVVNfTUVESUFfRElTQ09OTkVDVDsKQEAgLTgzNiw3ICs4MzcsOCBAQAogCQkJCS8qCiAJCQkJICogTk9URSAtIElzIHRoZXJlIGEgd2F5IHRvIHF1ZXJ5IHRoaXMgd2l0aG91dAogCQkJCSAqIFRydWVQSFk/Ci0JCQkJICogJiYgVFJVX1F1ZXJ5Q29yZVR5cGUoZXRkZXYtPmhUcnVlUGh5LCAwKT09IEVNSV9UUlVFUEhZX0ExM08pIHsKKwkJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShldGRldi0+aFRydWVQaHksIDApPT0KKwkJCQkgKiBFTUlfVFJVRVBIWV9BMTNPKSB7CiAJCQkJICovCiAJCQkJdTE2IFJlZ2lzdGVyMTg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2h2L0tjb25maWcKaW5kZXggOTc0ODBmNS4uNzQ1NWM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L0tjb25maWcKQEAgLTE3LDcgKzE3LDcgQEAKIAogY29uZmlnIEhZUEVSVl9CTE9DSwogCXRyaXN0YXRlICJNaWNyb3NvZnQgSHlwZXItViB2aXJ0dWFsIGJsb2NrIGRyaXZlciIKLQlkZXBlbmRzIG9uIEJMT0NLICYmIFNDU0kgJiYgTEJEQUYKKwlkZXBlbmRzIG9uIEJMT0NLICYmIFNDU0kgJiYgKExCREFGIHx8IDY0QklUKQogCWRlZmF1bHQgSFlQRVJWCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSB0aGUgSHlwZXItViB2aXJ0dWFsIGJsb2NrIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQppbmRleCAxODY2ZjgwLi5iNjM1MTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAotb2JqLSQoQ09ORklHX0hZUEVSVikJCSs9IGh2X3ZtYnVzLm8KK29iai0kKENPTkZJR19IWVBFUlYpCQkrPSBodl92bWJ1cy5vIGh2X3RpbWVzb3VyY2Uubwogb2JqLSQoQ09ORklHX0hZUEVSVl9TVE9SQUdFKQkrPSBodl9zdG9ydnNjLm8KIG9iai0kKENPTkZJR19IWVBFUlZfQkxPQ0spCSs9IGh2X2Jsa3ZzYy5vCiBvYmotJChDT05GSUdfSFlQRVJWX05FVCkJKz0gaHZfbmV0dnNjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYwppbmRleCAwZGFlYmM0Li45MjkyMzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzYy5jCkBAIC00MCwxNSArNDAsMTEgQEAKIAlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqZGV2aWNlSW5mbzsKIAlpbnQgcmV0ID0gMDsKIAotCURQUklOVF9FTlRFUihCTEtWU0MpOwotCiAJZGV2aWNlSW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKUFkZGl0aW9uYWxJbmZvOwogCiAJcmV0ID0gU3RvclZzY09uRGV2aWNlQWRkKERldmljZSwgQWRkaXRpb25hbEluZm8pOwotCWlmIChyZXQgIT0gMCkgewotCQlEUFJJTlRfRVhJVChCTEtWU0MpOworCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gdXNlIHRoZSBkZXZpY2UgaW5zdGFuY2UgZ3VpZCB0byBzZXQgdGhlIHBhdGggYW5kIHRhcmdldApAQCAtNjMsOCArNTksNiBAQAogCWRldmljZUluZm8tPlRhcmdldElkID0gRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzVdIDw8IDggfAogCQkJICAgICAgIERldmljZS0+ZGV2aWNlSW5zdGFuY2UuZGF0YVs0XTsKIAotCURQUklOVF9FWElUKEJMS1ZTQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC03Myw4ICs2Nyw2IEBACiAJc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqc3RvckRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCURQUklOVF9FTlRFUihCTEtWU0MpOwotCiAJc3RvckRyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopRHJpdmVyOwogCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhdCBsZWFzdCAyIHBhZ2VzIHNpbmNlIDEgcGFnZSBpcyB1c2VkIGZvciBjb250cm9sICovCkBAIC0xMDYsNyArOTgsNSBAQAogCXN0b3JEcml2ZXItPkJhc2UuT25DbGVhbnVwID0gU3RvclZzY09uQ2xlYW51cDsKIAlzdG9yRHJpdmVyLT5PbklPUmVxdWVzdAk9IFN0b3JWc2NPbklPUmVxdWVzdDsKIAotCURQUklOVF9FWElUKEJMS1ZTQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMKaW5kZXggNjFiZDBiZS4uZjdlYTJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjX2Rydi5jCkBAIC0xNzUsOCArMTc1LDYgQEAKIAlzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRydl9jdHggPSAmZ19ibGt2c2NfZHJ2LmRydl9jdHg7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihCTEtWU0NfRFJWKTsKLQogCXZtYnVzX2dldF9pbnRlcmZhY2UoJnN0b3J2c2NfZHJ2X29iai0+QmFzZS5WbWJ1c0NoYW5uZWxJbnRlcmZhY2UpOwogCiAJc3RvcnZzY19kcnZfb2JqLT5SaW5nQnVmZmVyU2l6ZSA9IGJsa3ZzY19yaW5nYnVmZmVyX3NpemU7CkBAIC0xOTUsOCArMTkzLDYgQEAKIAkvKiBUaGUgZHJpdmVyIGJlbG9uZ3MgdG8gdm1idXMgKi8KIAlyZXQgPSB2bWJ1c19jaGlsZF9kcml2ZXJfcmVnaXN0ZXIoZHJ2X2N0eCk7CiAKLQlEUFJJTlRfRVhJVChCTEtWU0NfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxNCw4ICsyMTAsNiBAQAogCXN0cnVjdCBkZXZpY2UgKmN1cnJlbnRfZGV2OwogCWludCByZXQ7CiAKLQlEUFJJTlRfRU5URVIoQkxLVlNDX0RSVik7Ci0KIAl3aGlsZSAoMSkgewogCQljdXJyZW50X2RldiA9IE5VTEw7CiAKQEAgLTI0MSw4ICsyMzUsNiBAQAogCiAJdm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIoZHJ2X2N0eCk7CiAKLQlEUFJJTlRfRVhJVChCTEtWU0NfRFJWKTsKLQogCXJldHVybjsKIH0KIApAQCAtMjY4LDggKzI2MCw2IEBACiAJc3RhdGljIGludCBpZGUwX3JlZ2lzdGVyZWQ7CiAJc3RhdGljIGludCBpZGUxX3JlZ2lzdGVyZWQ7CiAKLQlEUFJJTlRfRU5URVIoQkxLVlNDX0RSVik7Ci0KIAlEUFJJTlRfREJHKEJMS1ZTQ19EUlYsICJibGt2c2NfcHJvYmUgLSBlbnRlciIpOwogCiAJaWYgKCFzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQpIHsKQEAgLTQxMyw4ICs0MDMsNiBAQAogCQlibGtkZXYgPSBOVUxMOwogCX0KIAotCURQUklOVF9FWElUKEJMS1ZTQ19EUlYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzUxLDE0ICs3MzksMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQlEUFJJTlRfRU5URVIoQkxLVlNDX0RSVik7Ci0KIAlEUFJJTlRfREJHKEJMS1ZTQ19EUlYsICJibGt2c2NfcmVtb3ZlKClcbiIpOwogCi0JaWYgKCFzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpIHsKLQkJRFBSSU5UX0VYSVQoQkxLVlNDX0RSVik7CisJaWYgKCFzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpCiAJCXJldHVybiAtMTsKLQl9CiAKIAkvKgogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCkBAIC04MDIsOCArNzg2LDYgQEAKIAogCWtmcmVlKGJsa2Rldik7CiAKLQlEUFJJTlRfRVhJVChCTEtWU0NfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0OTIsMjIgKzE0NzQsMTYgQEAKIAogCUJVSUxEX0JVR19PTihzaXplb2Yoc2VjdG9yX3QpICE9IDgpOwogCi0JRFBSSU5UX0VOVEVSKEJMS1ZTQ19EUlYpOwotCiAJRFBSSU5UX0lORk8oQkxLVlNDX0RSViwgIkJsa3ZzYyBpbml0aWFsaXppbmcuLi4uIik7CiAKIAlyZXQgPSBibGt2c2NfZHJ2X2luaXQoQmxrVnNjSW5pdGlhbGl6ZSk7CiAKLQlEUFJJTlRfRVhJVChCTEtWU0NfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBibGt2c2NfZXhpdCh2b2lkKQogewotCURQUklOVF9FTlRFUihCTEtWU0NfRFJWKTsKIAlibGt2c2NfZHJ2X2V4aXQoKTsKLQlEUFJJTlRfRU5URVIoQkxLVlNDX0RSVik7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jCmluZGV4IGYwNDdjNWEuLmZlY2UzMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWwuYwpAQCAtNzQsOCArNzQsNiBAQAogewogCXN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKm1vbml0b3JQYWdlOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWlmIChDaGFubmVsLT5PZmZlck1zZy5Nb25pdG9yQWxsb2NhdGVkKSB7CiAJCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KIAkJc2V0X2JpdChDaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkICYgMzEsCkBAIC05Miw4ICs5MCw2IEBACiAJfSBlbHNlIHsKIAkJVm1idXNTZXRFdmVudChDaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkKTsKIAl9Ci0KLQlEUFJJTlRfRVhJVChWTUJVUyk7CiB9CiAKICNpZiAwCkBAIC0xMDEsOCArOTcsNiBAQAogewogCXN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKm1vbml0b3JQYWdlOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWlmIChDaGFubmVsLT5PZmZlck1zZy5Nb25pdG9yQWxsb2NhdGVkKSB7CiAJCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KIAkJY2xlYXJfYml0KENoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQgJiAzMSwKQEAgLTExNyw4ICsxMTEsNiBAQAogCQkJICAodW5zaWduZWQgbG9uZyAqKSZtb25pdG9yUGFnZS0+VHJpZ2dlckdyb3VwCiAJCQkJCVtDaGFubmVsLT5Nb25pdG9yR3JvdXBdLlBlbmRpbmcpOwogCX0KLQotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogI2VuZGlmCkBAIC0xODAsOCArMTcyLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQsIGVyciA9IDA7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJLyogQWxpZ25lZCB0byBwYWdlIHNpemUgKi8KIAkvKiBBU1NFUlQoIShTZW5kUmluZ0J1ZmZlclNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKTsgKi8KIAkvKiBBU1NFUlQoIShSZWN2UmluZ0J1ZmZlclNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKTsgKi8KQEAgLTMwNSw5ICsyOTUsNiBAQAogCiAJa2ZyZWUob3BlbkluZm8tPldhaXRFdmVudCk7CiAJa2ZyZWUob3BlbkluZm8pOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIDA7CiAKIGVycm9yb3V0OgpAQCAtNDY1LDYgKzQ1Miw4IEBACiAJCQkgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIpICsKIAkJCSAgc2l6ZW9mKHN0cnVjdCBncGFfcmFuZ2UpICsgcGFnZUNvdW50ICogc2l6ZW9mKHU2NCk7CiAJCW1zZ0hlYWRlciA9IGt6YWxsb2MobXNnU2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChtc2dIZWFkZXIgPT0gTlVMTCkKKwkJCWdvdG8gbm9tZW07CiAJCW1zZ0hlYWRlci0+TWVzc2FnZVNpemUgPSBtc2dTaXplOwogCiAJCWdwYUhlYWRlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKiltc2dIZWFkZXItPk1zZzsKQEAgLTUwOSw4ICs0OTgsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJbmV4dEdwYWRsSGFuZGxlID0gYXRvbWljX3JlYWQoJmdWbWJ1c0Nvbm5lY3Rpb24uTmV4dEdwYWRsSGFuZGxlKTsKIAlhdG9taWNfaW5jKCZnVm1idXNDb25uZWN0aW9uLk5leHRHcGFkbEhhbmRsZSk7CiAKQEAgLTU5Miw5ICs1NzksNiBAQAogCiAJa2ZyZWUobXNnSW5mby0+V2FpdEV2ZW50KTsKIAlrZnJlZShtc2dJbmZvKTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYwOCw4ICs1OTIsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAkvKiBBU1NFUlQoR3BhZGxIYW5kbGUgIT0gMCk7ICovCiAKIAlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pICsKQEAgLTY1MCw5ICs2MzIsNiBAQAogCiAJa2ZyZWUoaW5mby0+V2FpdEV2ZW50KTsKIAlrZnJlZShpbmZvKTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY2Niw4ICs2NDUsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAkvKiBTdG9wIGNhbGxiYWNrIGFuZCBjYW5jZWwgdGhlIHRpbWVyIGFzYXAgKi8KIAlDaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9IE5VTEw7CiAJZGVsX3RpbWVyX3N5bmMoJkNoYW5uZWwtPnBvbGxfdGltZXIpOwpAQCAtNzIwLDggKzY5Nyw2IEBACiAKIAkJRnJlZVZtYnVzQ2hhbm5lbChDaGFubmVsKTsKIAl9Ci0KLQlEUFJJTlRfRVhJVChWTUJVUyk7CiB9CiAKIC8qKgpAQCAtNzQ5LDcgKzcyNCw2IEBACiAJdTY0IGFsaWduZWREYXRhID0gMDsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKIAlEUFJJTlRfREJHKFZNQlVTLCAiY2hhbm5lbCAlcCBidWZmZXIgJXAgbGVuICVkIiwKIAkJICAgQ2hhbm5lbCwgQnVmZmVyLCBCdWZmZXJMZW4pOwogCkBAIC03NzYsOCArNzUwLDYgQEAKIAlpZiAocmV0ID09IDAgJiYgIUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCZDaGFubmVsLT5PdXRib3VuZCkpCiAJCVZtYnVzQ2hhbm5lbFNldEV2ZW50KENoYW5uZWwpOwogCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woVm1idXNDaGFubmVsU2VuZFBhY2tldCk7CkBAIC04MDAsOCArNzcyLDYgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgYnVmZmVyTGlzdFszXTsKIAl1NjQgYWxpZ25lZERhdGEgPSAwOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWlmIChQYWdlQ291bnQgPiBNQVhfUEFHRV9CVUZGRVJfQ09VTlQpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC04NDQsOCArODE0LDYgQEAKIAlpZiAocmV0ID09IDAgJiYgIUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCZDaGFubmVsLT5PdXRib3VuZCkpCiAJCVZtYnVzQ2hhbm5lbFNldEV2ZW50KENoYW5uZWwpOwogCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODY3LDggKzgzNSw2IEBACiAJdTMyIFBmbkNvdW50ID0gTlVNX1BBR0VTX1NQQU5ORUQoTXVsdGlQYWdlQnVmZmVyLT5PZmZzZXQsCiAJCQkJCSBNdWx0aVBhZ2VCdWZmZXItPkxlbmd0aCk7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJRHVtcFZtYnVzQ2hhbm5lbChDaGFubmVsKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJkYXRhIGJ1ZmZlciAtIG9mZnNldCAldSBsZW4gJXUgcGZuIGNvdW50ICV1IiwKQEAgLTkxNCw4ICs4ODAsNiBAQAogCWlmIChyZXQgPT0gMCAmJiAhR2V0UmluZ0J1ZmZlckludGVycnVwdE1hc2soJkNoYW5uZWwtPk91dGJvdW5kKSkKIAkJVm1idXNDaGFubmVsU2V0RXZlbnQoQ2hhbm5lbCk7CiAKLQlEUFJJTlRfRVhJVChWTUJVUyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC05NDIsOCArOTA2LDYgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJKkJ1ZmZlckFjdHVhbExlbiA9IDA7CiAJKlJlcXVlc3RJZCA9IDA7CiAKQEAgLTk1NSw3ICs5MTcsNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZDaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAogCQkvKiBEUFJJTlRfREJHKFZNQlVTLCAibm90aGluZyB0byByZWFkISEiKTsgKi8KLQkJRFBSSU5UX0VYSVQoVk1CVVMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTk3Nyw4ICs5MzgsNiBAQAogCiAJCURQUklOVF9FUlIoVk1CVVMsICJidWZmZXIgdG9vIHNtYWxsIC0gZ290ICVkIG5lZWRzICVkIiwKIAkJCSAgIEJ1ZmZlckxlbiwgdXNlckxlbik7Ci0JCURQUklOVF9FWElUKFZNQlVTKTsKLQogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05OTAsOCArOTQ5LDYgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwogCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKFZtYnVzQ2hhbm5lbFJlY3ZQYWNrZXQpOwpAQCAtMTAwOSw4ICs5NjYsNiBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAkqQnVmZmVyQWN0dWFsTGVuID0gMDsKIAkqUmVxdWVzdElkID0gMDsKIApAQCAtMTAyMiw3ICs5NzcsNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZDaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAogCQkvKiBEUFJJTlRfREJHKFZNQlVTLCAibm90aGluZyB0byByZWFkISEiKTsgKi8KLQkJRFBSSU5UX0VYSVQoVk1CVVMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEwNDMsNyArOTk3LDYgQEAKIAogCQlEUFJJTlRfRVJSKFZNQlVTLCAiYnVmZmVyIHRvbyBzbWFsbCAtIG5lZWRlZCAlZCBieXRlcyBidXQgIgogCQkJICAgImdvdCBzcGFjZSBmb3Igb25seSAlZCBieXRlcyIsIHBhY2tldExlbiwgQnVmZmVyTGVuKTsKLQkJRFBSSU5UX0VYSVQoVk1CVVMpOwogCQlyZXR1cm4gLTI7CiAJfQogCkBAIC0xMDUzLDkgKzEwMDYsNiBAQAogCXJldCA9IFJpbmdCdWZmZXJSZWFkKCZDaGFubmVsLT5JbmJvdW5kLCBCdWZmZXIsIHBhY2tldExlbiwgMCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZDaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmMKaW5kZXggMTJkYjU1NS4uNmNjZjUwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYwpAQCAtMjY3LDE1ICsyNjcsMTEgQEAKIHsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJRFBSSU5UX0RCRyhWTUJVUywgInJlbGVhc2luZyBjaGFubmVsICglcCkiLCBjaGFubmVsKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShjaGFubmVsLT5Db250cm9sV1EpOwogCURQUklOVF9EQkcoVk1CVVMsICJjaGFubmVsIHJlbGVhc2VkICglcCkiLCBjaGFubmVsKTsKIAogCWtmcmVlKGNoYW5uZWwpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtMzI2LDggKzMyMiw2IEBACiAJaW50IGNudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgbmV3IG9mZmVyICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKQEAgLTM1Myw3ICszNDcsNiBAQAogCQlEUFJJTlRfREJHKFZNQlVTLCAiSWdub3JpbmcgZHVwbGljYXRlIG9mZmVyIGZvciByZWxpZCAoJWQpIiwKIAkJCSAgIG5ld0NoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQpOwogCQlGcmVlVm1idXNDaGFubmVsKG5ld0NoYW5uZWwpOwotCQlEUFJJTlRfRVhJVChWTUJVUyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQxMCw3ICs0MDMsNiBAQAogCQkJfQogCQl9CiAJfQotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogLyoKQEAgLTQyMCw5ICs0MTIsNyBAQAogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7CiAJVm1idXNDaGlsZERldmljZVJlbW92ZShjaGFubmVsLT5EZXZpY2VPYmplY3QpOwotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogLyoKQEAgLTQ0MSw4ICs0MzEsNiBAQAogCWludCBpOwogCWludCBmU3VwcG9ydGVkID0gMDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAlvZmZlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsICopaGRyOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0RFVklDRV9DTEFTU0VTX1NVUFBPUlRFRDsgaSsrKSB7CiAJCWlmIChtZW1jbXAoJm9mZmVyLT5PZmZlci5JbnRlcmZhY2VUeXBlLApAQCAtNDU1LDcgKzQ0Myw2IEBACiAJaWYgKCFmU3VwcG9ydGVkKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJJZ25vcmluZyBjaGFubmVsIG9mZmVyIG5vdGlmaWNhdGlvbiBmb3IgIgogCQkJICAgImNoaWxkIHJlbGlkICVkIiwgb2ZmZXItPkNoaWxkUmVsSWQpOwotCQlEUFJJTlRfRVhJVChWTUJVUyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTUwNCw4ICs0OTEsNiBAQAogCS8qIFRPRE86IE1ha2Ugc3VyZSB0aGUgb2ZmZXIgY29tZXMgZnJvbSBvdXIgcGFyZW50IHBhcnRpdGlvbiAqLwogCW9zZF9zY2hlZHVsZV9jYWxsYmFjayhuZXdDaGFubmVsLT5Db250cm9sV1EsIFZtYnVzQ2hhbm5lbFByb2Nlc3NPZmZlciwKIAkJCSAgICAgIG5ld0NoYW5uZWwpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtNTE4LDggKzUwMyw2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfcmVzY2luZF9vZmZlciAqcmVzY2luZDsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAlyZXNjaW5kID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX3Jlc2NpbmRfb2ZmZXIgKiloZHI7CiAJY2hhbm5lbCA9IEdldENoYW5uZWxGcm9tUmVsSWQocmVzY2luZC0+Q2hpbGRSZWxJZCk7CiAJaWYgKGNoYW5uZWwgPT0gTlVMTCkgewpAQCAtNTMxLDggKzUxNCw2IEBACiAJb3NkX3NjaGVkdWxlX2NhbGxiYWNrKGNoYW5uZWwtPkNvbnRyb2xXUSwKIAkJCSAgICAgIFZtYnVzQ2hhbm5lbFByb2Nlc3NSZXNjaW5kT2ZmZXIsCiAJCQkgICAgICBjaGFubmVsKTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogLyoKQEAgLTU0Myw4ICs1MjQsNiBAQAogc3RhdGljIHZvaWQgVm1idXNDaGFubmVsT25PZmZlcnNEZWxpdmVyZWQoCiAJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqaGRyKQogewotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtNTYzLDggKzU0Miw2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICpvcGVuTXNnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJcmVzdWx0ID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fcmVzdWx0ICopaGRyOwogCURQUklOVF9EQkcoVk1CVVMsICJ2bWJ1cyBvcGVuIHJlc3VsdCAtICVkIiwgcmVzdWx0LT5TdGF0dXMpOwogCkBAIC01OTEsOCArNTY4LDYgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtNjExLDggKzU4Niw2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICpncGFkbEhlYWRlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWdwYWRsQ3JlYXRlZCA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkICopaGRyOwogCURQUklOVF9EQkcoVk1CVVMsICJ2bWJ1cyBncGFkbCBjcmVhdGVkIHJlc3VsdCAtICVkIiwKIAkJICAgZ3BhZGxDcmVhdGVkLT5DcmVhdGlvblN0YXR1cyk7CkBAIC02NDMsOCArNjE2LDYgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtNjY0LDggKzYzNSw2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24gKmdwYWRsVGVhcmRvd247CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAlncGFkbFRvcm5kb3duID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duICopaGRyOwogCiAJLyoKQEAgLTY5MSw4ICs2NjAsNiBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0KLQlEUFJJTlRfRVhJVChWTUJVUyk7CiB9CiAKIC8qCkBAIC03MTIsOCArNjc5LDYgQEAKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3Jlc3BvbnNlICp2ZXJzaW9uUmVzcG9uc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAl2ZXJzaW9uUmVzcG9uc2UgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfdmVyc2lvbl9yZXNwb25zZSAqKWhkcjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIApAQCAtNzMyLDggKzY5Nyw2IEBACiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogLyogQ2hhbm5lbCBtZXNzYWdlIGRpc3BhdGNoIHRhYmxlICovCkBAIC03NjksOCArNzMyLDYgQEAKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqaGRyOwogCWludCBzaXplOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWhkciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZy0+dS5QYXlsb2FkOwogCXNpemUgPSBtc2ctPkhlYWRlci5QYXlsb2FkU2l6ZTsKIApAQCAtNzk0LDcgKzc1NSw2IEBACiAKIAkvKiBGcmVlIHRoZSBtc2cgdGhhdCB3YXMgYWxsb2NhdGVkIGluIFZtYnVzT25Nc2dEUEMoKSAqLwogCWtmcmVlKG1zZyk7Ci0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtODA2LDggKzc2Niw2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqbXNnSW5mbzsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCW1zZ0luZm8gPSBrbWFsbG9jKHNpemVvZigqbXNnSW5mbykgKwogCQkJICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIpLAogCQkJICBHRlBfS0VSTkVMKTsKQEAgLTg1Myw3ICs4MTEsNiBAQAogCQlrZnJlZShtc2dJbmZvKTsKIAl9CiAKLQlEUFJJTlRfRVhJVChWTUJVUyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5oCmluZGV4IDU5MDhiODEuLmY5NjkyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmgKQEAgLTI0Nyw4ICsyNDcsOCBAQAogCS8qIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHJpbmcgYnVmZmVyICovCiAJdm9pZCAqUmluZ0J1ZmZlclBhZ2VzOwogCXUzMiBSaW5nQnVmZmVyUGFnZUNvdW50OwotCVJJTkdfQlVGRkVSX0lORk8gT3V0Ym91bmQ7CS8qIHNlbmQgdG8gcGFyZW50ICovCi0JUklOR19CVUZGRVJfSU5GTyBJbmJvdW5kOwkvKiByZWNlaXZlIGZyb20gcGFyZW50ICovCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gT3V0Ym91bmQ7CS8qIHNlbmQgdG8gcGFyZW50ICovCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gSW5ib3VuZDsJLyogcmVjZWl2ZSBmcm9tIHBhcmVudCAqLwogCXNwaW5sb2NrX3QgaW5ib3VuZF9sb2NrOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpDb250cm9sV1E7CiAKQEAgLTI3Miw4ICsyNzIsOCBAQAogCXUzMiBDbGllbnRNb25pdG9yTGF0ZW5jeTsKIAl1MzIgQ2xpZW50TW9uaXRvckNvbm5lY3Rpb25JZDsKIAotCVJJTkdfQlVGRkVSX0RFQlVHX0lORk8gSW5ib3VuZDsKLQlSSU5HX0JVRkZFUl9ERUJVR19JTkZPIE91dGJvdW5kOworCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvIEluYm91bmQ7CisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gT3V0Ym91bmQ7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jb25uZWN0aW9uLmMKaW5kZXggZTg4MjRkYS4uMWY0ZDY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY29ubmVjdGlvbi5jCkBAIC00NCw4ICs0NCw2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCAqbXNnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBub3QgY29ubmVjdGluZyBvciBjb25uZWN0ZWQgKi8KIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5Db25uZWN0U3RhdGUgIT0gRGlzY29ubmVjdGVkKQogCQlyZXR1cm4gLTE7CkBAIC0xNTUsOCArMTUzLDYgQEAKIAogCWtmcmVlKG1zZ0luZm8tPldhaXRFdmVudCk7CiAJa2ZyZWUobXNnSW5mbyk7Ci0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIDA7CiAKIENsZWFudXA6CkBAIC0xODAsOCArMTc2LDYgQEAKIAkJa2ZyZWUobXNnSW5mbyk7CiAJfQogCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTkzLDggKzE4Nyw2IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKm1zZzsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAkvKiBNYWtlIHN1cmUgd2UgYXJlIGNvbm5lY3RlZCAqLwogCWlmIChnVm1idXNDb25uZWN0aW9uLkNvbm5lY3RTdGF0ZSAhPSBDb25uZWN0ZWQpCiAJCXJldHVybiAtMTsKQEAgLTIyMSw3ICsyMTMsNiBAQAogCiBDbGVhbnVwOgogCWtmcmVlKG1zZyk7Ci0JRFBSSU5UX0VYSVQoVk1CVVMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI4NSw4ICsyNzYsNiBAQAogCWludCByZWxpZDsKIAl1MzIgKnJlY3ZJbnRlcnJ1cHRQYWdlID0gZ1ZtYnVzQ29ubmVjdGlvbi5SZWN2SW50ZXJydXB0UGFnZTsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAkvKiBDaGVjayBldmVudHMgKi8KIAlpZiAocmVjdkludGVycnVwdFBhZ2UpIHsKIAkJZm9yIChkd29yZCA9IDA7IGR3b3JkIDwgbWF4ZHdvcmQ7IGR3b3JkKyspIHsKQEAgLTMxMCw4ICsyOTksNiBAQAogCQkJfQogCQkgfQogCX0KLQlEUFJJTlRfRVhJVChWTUJVUyk7Ci0KIAlyZXR1cm47CiB9CiAKQEAgLTMzMiwxOCArMzE5LDEwIEBACiAgKi8KIGludCBWbWJ1c1NldEV2ZW50KHUzMiBjaGlsZFJlbElkKQogewotCWludCByZXQgPSAwOwotCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KIAlzZXRfYml0KGNoaWxkUmVsSWQgJiAzMSwKIAkJKHVuc2lnbmVkIGxvbmcgKilnVm1idXNDb25uZWN0aW9uLlNlbmRJbnRlcnJ1cHRQYWdlICsKIAkJKGNoaWxkUmVsSWQgPj4gNSkpOwogCi0JcmV0ID0gSHZTaWduYWxFdmVudCgpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gSHZTaWduYWxFdmVudCgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYwppbmRleCA2Yzc3ZTY0Li44NmIxZGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYwpAQCAtMTkyLDggKzE5Miw2IEBACiAJdW5pb24gaHZfeDY0X21zcl9oeXBlcmNhbGxfY29udGVudHMgaHlwZXJjYWxsTXNyOwogCXZvaWQgKnZpcnRBZGRyID0gTlVMTDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAltZW1zZXQoZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZSwgMCwgc2l6ZW9mKHZvaWQgKikgKiBNQVhfTlVNX0NQVVMpOwogCW1lbXNldChnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2UsIDAsIHNpemVvZih2b2lkICopICogTUFYX05VTV9DUFVTKTsKIApAQCAtMjc1LDggKzI3Myw2IEBACiAJZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLT5GbGFnTnVtYmVyID0gMDsKIAlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPlJzdmRaID0gMDsKIAotCURQUklOVF9FWElUKFZNQlVTKTsKLQogCXJldHVybiByZXQ7CiAKIENsZWFudXA6CkBAIC0yODksOCArMjg1LDYgQEAKIAkJdmZyZWUodmlydEFkZHIpOwogCX0KIAlyZXQgPSAtMTsKLQlEUFJJTlRfRVhJVChWTUJVUyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMDMsOCArMjk3LDYgQEAKIHsKIAl1bmlvbiBodl94NjRfbXNyX2h5cGVyY2FsbF9jb250ZW50cyBoeXBlcmNhbGxNc3I7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJa2ZyZWUoZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlcik7CiAJZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlciA9IE5VTEw7CiAJZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtID0gTlVMTDsKQEAgLTMxNSw4ICszMDcsNiBAQAogCQl2ZnJlZShnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UpOwogCQlnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UgPSBOVUxMOwogCX0KLQotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogLyoKQEAgLTM5MiwxMiArMzgyLDggQEAKIAl1MzIgaXJxVmVjdG9yID0gKigodTMyICopKGlycWFyZykpOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCi0JaWYgKCFnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UpIHsKLQkJRFBSSU5UX0VYSVQoVk1CVVMpOworCWlmICghZ0h2Q29udGV4dC5IeXBlcmNhbGxQYWdlKQogCQlyZXR1cm47Ci0JfQogCiAJLyogQ2hlY2sgdGhlIHZlcnNpb24gKi8KIAlyZG1zcmwoSFZfWDY0X01TUl9TVkVSU0lPTiwgdmVyc2lvbik7CkBAIC00NjQsOSArNDUwLDYgQEAKIAl3cm1zcmwoSFZfWDY0X01TUl9TQ09OVFJPTCwgc2N0cmwuQXNVSU5UNjQpOwogCiAJZ0h2Q29udGV4dC5TeW5JQ0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKLQogCXJldHVybjsKIAogQ2xlYW51cDoKQEAgLTQ3NSw4ICs0NTgsNiBAQAogCiAJaWYgKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdKQogCQlvc2RfUGFnZUZyZWUoZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlW2NwdV0sIDEpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwogCXJldHVybjsKIH0KIApAQCAtNDkwLDEyICs0NzEsOCBAQAogCXVuaW9uIGh2X3N5bmljX3NpZWZwIHNpZWZwOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCi0JaWYgKCFnSHZDb250ZXh0LlN5bklDSW5pdGlhbGl6ZWQpIHsKLQkJRFBSSU5UX0VYSVQoVk1CVVMpOworCWlmICghZ0h2Q29udGV4dC5TeW5JQ0luaXRpYWxpemVkKQogCQlyZXR1cm47Ci0JfQogCiAJcmRtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZFNpbnQuQXNVSU5UNjQpOwogCkBAIC01MTksNiArNDk2LDQgQEAKIAogCW9zZF9QYWdlRnJlZShnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XSwgMSk7CiAJb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSwgMSk7Ci0KLQlEUFJJTlRfRVhJVChWTUJVUyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfdGltZXNvdXJjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3RpbWVzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VlNTMzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl90aW1lc291cmNlLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBBIGNsb2Nrc291cmNlIGZvciBMaW51eCBydW5uaW5nIG9uIEh5cGVyVi4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBOb3ZlbGwsIEluYy4KKyAqIEF1dGhvciA6IEsuIFkuIFNyaW5pdmFzYW4gPGtzcmluaXZhc2FuQG5vdmVsbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnYuaD4KKyNpbmNsdWRlIDxhc20vbXNoeXBlcnYuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgorCisjZGVmaW5lIEhWX0NMT0NLX1NISUZUCTIyCisKK3N0YXRpYyBjeWNsZV90IHJlYWRfaHZfY2xvY2soc3RydWN0IGNsb2Nrc291cmNlICphcmcpCit7CisJY3ljbGVfdCBjdXJyZW50X3RpY2s7CisJLyoKKwkgKiBSZWFkIHRoZSBwYXJ0aXRpb24gY291bnRlciB0byBnZXQgdGhlIGN1cnJlbnQgdGljayBjb3VudC4gVGhpcyBjb3VudAorCSAqIGlzIHNldCB0byAwIHdoZW4gdGhlIHBhcnRpdGlvbiBpcyBjcmVhdGVkIGFuZCBpcyBpbmNyZW1lbnRlZCBpbgorCSAqIDEwMCBuYW5vc2Vjb25kIHVuaXRzLgorCSAqLworCXJkbXNybChIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5ULCBjdXJyZW50X3RpY2spOworCXJldHVybiBjdXJyZW50X3RpY2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgaHlwZXJ2X2NzID0geworCS5uYW1lICAgICAgICAgICA9ICJoeXBlcnZfY2xvY2tzb3VyY2UiLAorCS5yYXRpbmcgICAgICAgICA9IDQwMCwgLyogdXNlIHRoaXMgd2hlbiBydW5uaW5nIG9uIEh5cGVydiovCisJLnJlYWQgICAgICAgICAgID0gcmVhZF9odl9jbG9jaywKKwkubWFzayAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKKwkvKgorCSAqIFRoZSB0aW1lIHJlZiBjb3VudGVyIGluIEh5cGVyViBpcyBpbiAxMDBucyB1bml0cy4KKwkgKiBUaGUgZGVmaW5pdGlvbiBvZiBtdWx0IGlzOgorCSAqIG11bHQvMl5zaGlmdCA9IG5zL2N5YyA9IDEwMAorCSAqIG11bHQgPSAoMTAwIDw8IHNoaWZ0KQorCSAqLworCS5tdWx0ICAgICAgICAgICA9ICgxMDAgPDwgSFZfQ0xPQ0tfU0hJRlQpLAorCS5zaGlmdCAgICAgICAgICA9IEhWX0NMT0NLX1NISUZULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGNvbnN0Citodl90aW1lc291cmNlX2RtaV90YWJsZVtdIF9fbWF5YmVfdW51c2VkICA9IHsKKwl7CisJCS5pZGVudCA9ICJIeXBlci1WIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNaWNyb3NvZnQgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVmlydHVhbCBNYWNoaW5lIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJWaXJ0dWFsIE1hY2hpbmUiKSwKKwkJfSwKKwl9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgaHZfdGltZXNvdXJjZV9kbWlfdGFibGUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19pbml0Y29uc3QKK2h2X3RpbWVzb3VyY2VfcGNpX3RhYmxlW10gX19tYXliZV91bnVzZWQgPSB7CisJeyBQQ0lfREVWSUNFKDB4MTQxNCwgMHg1MzUzKSB9LCAvKiBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyICovCisJeyAwIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaHZfdGltZXNvdXJjZV9wY2lfdGFibGUpOworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHZfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwlpZiAoKHg4Nl9oeXBlciAhPSAmeDg2X2h5cGVyX21zX2h5cGVydikgfHwKKwkJIShtc19oeXBlcnYuZmVhdHVyZXMgJiBIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5UX0FWQUlMQUJMRSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGh2X3RpbWVzb3VyY2VfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmluZyBIeXBlclYgY2xvY2sgc291cmNlXG4iKTsKKwlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmh5cGVydl9jcyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaHZfY2xvY2tzb3VyY2UpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIeXBlclYgYmFzZWQgY2xvY2tzb3VyY2UiKTsKK01PRFVMRV9BVVRIT1IoIksuIFkuIFNyaW5pdmFzYW4gPGtzcmluaXZhc2FuQG5vdmVsbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jCmluZGV4IDJhZGM5YjQuLjZlYjc5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jCkBAIC01Miw4ICs1Miw2IEBACiAJc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHJwOwogCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wID0gTlVMTDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7Ci0KIAlidWZsZW4gPSBQQUdFX1NJWkU7CiAJYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwogCkBAIC0xMDIsOCArMTAwLDYgQEAKIAogCWtmcmVlKGJ1Zik7CiAKLQlEUFJJTlRfRVhJVChWTUJVUyk7Ci0KIAlpZiAoZXhlY3V0ZV9zaHV0ZG93biA9PSB0cnVlKQogCQlvcmRlcmx5X3Bvd2Vyb2ZmKGZhbHNlKTsKIH0KQEAgLTE2MCw4ICsxNTYsNiBAQAogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICp0aW1lZGF0YXA7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJYnVmbGVuID0gUEFHRV9TSVpFOwogCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKIApAQCAtMTkyLDggKzE4Niw2IEBACiAJfQogCiAJa2ZyZWUoYnVmKTsKLQotCURQUklOVF9FWElUKFZNQlVTKTsKIH0KIAogLyoKQEAgLTIxMCw4ICsyMDIsNiBAQAogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaGVhcnRiZWF0X21zZ19kYXRhICpoZWFydGJlYXRfbXNnOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWJ1ZmxlbiA9IFBBR0VfU0laRTsKIAlidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0FUT01JQyk7CiAKQEAgLTI0OSw4ICsyMzksNiBAQAogCX0KIAogCWtmcmVlKGJ1Zik7Ci0KLQlEUFJJTlRfRVhJVChWTUJVUyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2luaXRjb25zdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2xvZ2dpbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9sb2dnaW5nLmgKaW5kZXggYWQ0Y2ZjZi4uMjBkNGQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2xvZ2dpbmcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvbG9nZ2luZy5oCkBAIC05MiwyMSArOTIsNCBAQAogCQkgICAgICAgX19mdW5jX18sICMjIGFyZ3MpO1wKIAl9IHdoaWxlICgwKQogCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgRFBSSU5UX0VOVEVSKG1vZCkgZG8ge1wKLQlpZiAoKG1vZCAmIChISVdPUkQodm1idXNfbG9nbGV2ZWwpKSkgJiYgXAotCSAgICAoREVCVUdfTFZMX0VOVEVSRVhJVCA8PSBMT1dPUkQodm1idXNfbG9nbGV2ZWwpKSkJXAotCQlwcmludGsoS0VSTl9ERUJVRyAiWyIjbW9kIl06ICVzKCkgZW50ZXJcbiIsIF9fZnVuY19fKTtcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBEUFJJTlRfRVhJVChtb2QpIGRvIHtcCi0JaWYgKChtb2QgJiAoSElXT1JEKHZtYnVzX2xvZ2xldmVsKSkpICYmIFwKLQkgICAgKERFQlVHX0xWTF9FTlRFUkVYSVQgPD0gTE9XT1JEKHZtYnVzX2xvZ2xldmVsKSkpCVwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlsiI21vZCJdOiAlcygpIGV4aXRcbiIsIF9fZnVuY19fKTtcCi0JfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERQUklOVF9FTlRFUihtb2QpCi0jZGVmaW5lIERQUklOVF9FWElUKG1vZCkKLSNlbmRpZgotCiAjZW5kaWYgLyogX0xPR0dJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYwppbmRleCBiYTE1MDU5Li4xZDJlYmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5jCkBAIC0xNzQsOCArMTc0LDYgQEAKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJpdmVyID0gKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopZHJ2OwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlEUFJJTlRfREJHKE5FVFZTQywgInNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCk9JXpkLCAiCiAJCSAgICJzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSk9JXpkLCAiCiAJCSAgICJzaXplb2Yoc3RydWN0IHZtdHJhbnNmZXJfcGFnZV9wYWNrZXRfaGVhZGVyKT0lemQiLApAQCAtMjAyLDkgKzIwMCw2IEBACiAJZHJpdmVyLT5PblNlbmQJCQk9IE5ldFZzY09uU2VuZDsKIAogCVJuZGlzRmlsdGVySW5pdChkcml2ZXIpOwotCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMTQsMTMgKzIwOSwxMCBAQAogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKIAotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJbmV0RGV2aWNlID0gR2V0T3V0Ym91bmROZXREZXZpY2UoRGV2aWNlKTsKIAlpZiAoIW5ldERldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBnZXQgbmV0IGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwotCQlEUFJJTlRfRVhJVChORVRWU0MpOwogCQlyZXR1cm4gLTE7CiAJfQogCS8qIEFTU0VSVChuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplID4gMCk7ICovCkBAIC0zMzUsNyArMzI3LDYgQEAKIAogRXhpdDoKIAlQdXROZXREZXZpY2UoRGV2aWNlKTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM0NSwxMyArMzM2LDEwIEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0UGFja2V0OwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAluZXREZXZpY2UgPSBHZXRPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwogCWlmICghbmV0RGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7Ci0JCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKG5ldERldmljZS0+U2VuZEJ1ZmZlclNpemUgPD0gMCkgewpAQCAtNDM0LDcgKzQyMiw2IEBACiAKIEV4aXQ6CiAJUHV0TmV0RGV2aWNlKERldmljZSk7Ci0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NDMsOCArNDMwLDYgQEAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VQYWNrZXQ7CiAJaW50IHJldCA9IDA7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qCiAJICogSWYgd2UgZ290IGEgc2VjdGlvbiBjb3VudCwgaXQgbWVhbnMgd2UgcmVjZWl2ZWQgYQogCSAqIFNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUgbXNnIChpZSBzZW50CkBAIC00NzUsNyArNDYwLDYgQEAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBzZW5kIHJldm9rZSByZWNlaXZlICIKIAkJCQkgICAiYnVmZmVyIHRvIG5ldHZzcCIpOwotCQkJRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTQ5Miw3ICs0NzYsNiBAQAogCQlpZiAocmV0ICE9IDApIHsKIAkJCURQUklOVF9FUlIoTkVUVlNDLAogCQkJCSAgICJ1bmFibGUgdG8gdGVhcmRvd24gcmVjZWl2ZSBidWZmZXIncyBncGFkbCIpOwotCQkJRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJHcGFkbEhhbmRsZSA9IDA7CkBAIC01MTMsOCArNDk2LDYgQEAKIAkJTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMgPSBOVUxMOwogCX0KIAotCURQUklOVF9FWElUKE5FVFZTQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MjMsOCArNTA0LDYgQEAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VQYWNrZXQ7CiAJaW50IHJldCA9IDA7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qCiAJICogSWYgd2UgZ290IGEgc2VjdGlvbiBjb3VudCwgaXQgbWVhbnMgd2UgcmVjZWl2ZWQgYQogCSAqICBTZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlIG1zZyAoaWUgc2VudApAQCAtNTU0LDcgKzUzMyw2IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gc2VuZCByZXZva2Ugc2VuZCBidWZmZXIgIgogCQkJCSAgICJ0byBuZXR2c3AiKTsKLQkJCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC01NzIsNyArNTUwLDYgQEAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byB0ZWFyZG93biBzZW5kIGJ1ZmZlcidzICIKIAkJCQkgICAiZ3BhZGwiKTsKLQkJCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJTmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGUgPSAwOwpAQCAtNTg3LDggKzU2NCw2IEBACiAJCU5ldERldmljZS0+U2VuZEJ1ZmZlciA9IE5VTEw7CiAJfQogCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYwMCwxMyArNTc1LDEwIEBACiAJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKIAlpbnQgbmRpc1ZlcnNpb247CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7CiAJaWYgKCFuZXREZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjk2LDE4ICs2NjgsMTMgQEAKIAogQ2xlYW51cDoKIAlQdXROZXREZXZpY2UoRGV2aWNlKTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIE5ldFZzY0Rpc2Nvbm5lY3RGcm9tVnNwKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpOZXREZXZpY2UpCiB7Ci0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihOZXREZXZpY2UpOwogCU5ldFZzY0Rlc3Ryb3lTZW5kQnVmZmVyKE5ldERldmljZSk7Ci0KLQlEUFJJTlRfRVhJVChORVRWU0MpOwogfQogCiAvKgpAQCAtNzIyLDggKzY4OSw2IEBACiAJc3RydWN0IG5ldHZzY19kcml2ZXIgKm5ldERyaXZlciA9CiAJCQkJKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopRGV2aWNlLT5Ecml2ZXI7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCW5ldERldmljZSA9IEFsbG9jTmV0RGV2aWNlKERldmljZSk7CiAJaWYgKCFuZXREZXZpY2UpIHsKIAkJcmV0ID0gLTE7CkBAIC03ODcsNyArNzUyLDYgQEAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICIqKiogTmV0VlNDIGNoYW5uZWwgaGFuZHNoYWtlIHJlc3VsdCAtICVkICoqKiIsCiAJCSAgICByZXQpOwogCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAlyZXR1cm4gcmV0OwogCiBDbG9zZToKQEAgLTgxMiw3ICs3NzYsNiBAQAogCQlGcmVlTmV0RGV2aWNlKG5ldERldmljZSk7CiAJfQogCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MjQsOCArNzg3LDYgQEAKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpuZXR2c2NQYWNrZXQsICpwb3M7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCURQUklOVF9JTkZPKE5FVFZTQywgIkRpc2FibGluZyBvdXRib3VuZCB0cmFmZmljIG9uIG5ldCBkZXZpY2UgKCVwKS4uLiIsCiAJCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CiAKQEAgLTg2OCw4ICs4MjksNiBAQAogCiAJa2ZyZWUobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKIAlGcmVlTmV0RGV2aWNlKG5ldERldmljZSk7Ci0KLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCXJldHVybiAwOwogfQogCkBAIC04NzgsOCArODM3LDYgQEAKICAqLwogc3RhdGljIHZvaWQgTmV0VnNjT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKIHsKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogfQogCiBzdGF0aWMgdm9pZCBOZXRWc2NPblNlbmRDb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKQEAgLTg4OSwxMyArODQ2LDEwIEBACiAJc3RydWN0IG52c3BfbWVzc2FnZSAqbnZzcFBhY2tldDsKIAlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbnZzY1BhY2tldDsKIAotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJbmV0RGV2aWNlID0gR2V0SW5ib3VuZE5ldERldmljZShEZXZpY2UpOwogCWlmICghbmV0RGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7Ci0JCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTkyOSw3ICs4ODMsNiBAQAogCX0KIAogCVB1dE5ldERldmljZShEZXZpY2UpOwotCURQUklOVF9FWElUKE5FVFZTQyk7CiB9CiAKIHN0YXRpYyBpbnQgTmV0VnNjT25TZW5kKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKQEAgLTk0MCwxMyArODkzLDEwIEBACiAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHNlbmRNZXNzYWdlOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAluZXREZXZpY2UgPSBHZXRPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwogCWlmICghbmV0RGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAibmV0IGRldmljZSAoJXApIHNodXR0aW5nIGRvd24uLi4iCiAJCQkgICAiaWdub3Jpbmcgb3V0Ym91bmQgcGFja2V0cyIsIG5ldERldmljZSk7Ci0JCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCXJldHVybiAtMjsKIAl9CiAKQEAgLTk4Niw4ICs5MzYsNiBAQAogCiAJYXRvbWljX2luYygmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKTsKIAlQdXROZXREZXZpY2UoRGV2aWNlKTsKLQotCURQUklOVF9FWElUKE5FVFZTQyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAwNywxMyArOTU1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlMSVNUX0hFQUQobGlzdEhlYWQpOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAluZXREZXZpY2UgPSBHZXRJbmJvdW5kTmV0RGV2aWNlKERldmljZSk7CiAJaWYgKCFuZXREZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE4OSw3ICsxMTM0LDYgQEAKIAkvKiBBU1NFUlQobGlzdF9lbXB0eSgmbGlzdEhlYWQpKTsgKi8KIAogCVB1dE5ldERldmljZShEZXZpY2UpOwotCURQUklOVF9FWElUKE5FVFZTQyk7CiB9CiAKIHN0YXRpYyB2b2lkIE5ldFZzY1NlbmRSZWNlaXZlQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCkBAIC0xMjQ4LDggKzExOTIsNiBAQAogCWJvb2wgZlNlbmRSZWNlaXZlQ29tcCA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qIEFTU0VSVChwYWNrZXQtPlhmZXJQYWdlUGFja2V0KTsgKi8KIAogCS8qCkBAIC0xMjYxLDcgKzEyMDMsNiBAQAogCWlmICghbmV0RGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7Ci0JCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyOTIsNyArMTIzMyw2IEBACiAJCU5ldFZzY1NlbmRSZWNlaXZlQ29tcGxldGlvbihkZXZpY2UsIHRyYW5zYWN0aW9uSWQpOwogCiAJUHV0TmV0RGV2aWNlKGRldmljZSk7Ci0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIH0KIAogc3RhdGljIHZvaWQgTmV0VnNjT25DaGFubmVsQ2FsbGJhY2sodm9pZCAqQ29udGV4dCkKQEAgLTEzMDcsOSArMTI0Nyw2IEBACiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCWludCBidWZmZXJsZW4gPSBORVRWU0NfUEFDS0VUX1NJWkU7CiAKLQotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJLyogQVNTRVJUKGRldmljZSk7ICovCiAKIAlwYWNrZXQgPSBremFsbG9jKE5FVFZTQ19QQUNLRVRfU0laRSAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSwKQEAgLTEzMjIsNyArMTI1OSw2IEBACiAJaWYgKCFuZXREZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJuZXQgZGV2aWNlICglcCkgc2h1dHRpbmcgZG93bi4uLiIKIAkJCSAgICJpZ25vcmluZyBpbmJvdW5kIHBhY2tldHMiLCBuZXREZXZpY2UpOwotCQlEUFJJTlRfRVhJVChORVRWU0MpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEzODYsNyArMTMyMiw2IEBACiAJfSB3aGlsZSAoMSk7CiAKIAlQdXROZXREZXZpY2UoZGV2aWNlKTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogb3V0OgogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfZHJ2LmMKaW5kZXggNTViOTkzMjkuLjU2ZTExNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYwpAQCAtNzYsOCArNzYsNiBAQAogCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZV9vYmogPSAmbmV0X2RldmljZV9jdHgtPmRldmljZV9jdHgtPmRldmljZV9vYmo7CiAJaW50IHJldCA9IDA7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7Ci0KIAlpZiAobmV0aWZfY2Fycmllcl9vayhuZXQpKSB7CiAJCS8qIE9wZW4gdXAgdGhlIGRldmljZSAqLwogCQlyZXQgPSBSbmRpc0ZpbHRlck9uT3BlbihkZXZpY2Vfb2JqKTsKQEAgLTkyLDcgKzkwLDYgQEAKIAkJRFBSSU5UX0VSUihORVRWU0NfRFJWLCAidW5hYmxlIHRvIG9wZW4gZGV2aWNlLi4ubGluayBpcyBkb3duLiIpOwogCX0KIAotCURQUklOVF9FWElUKE5FVFZTQ19EUlYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMiwxNiArOTksMTIgQEAKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqID0gJm5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4LT5kZXZpY2Vfb2JqOwogCWludCByZXQ7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7Ci0KIAluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CiAKIAlyZXQgPSBSbmRpc0ZpbHRlck9uQ2xvc2UoZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKQogCQlEUFJJTlRfRVJSKE5FVFZTQ19EUlYsICJ1bmFibGUgdG8gY2xvc2UgZGV2aWNlIChyZXQgJWQpLiIsIHJldCk7CiAKLQlEUFJJTlRfRVhJVChORVRWU0NfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMSw4ICsxMTQsNiBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikKIAkJKHVuc2lnbmVkIGxvbmcpcGFja2V0LT5Db21wbGV0aW9uLlNlbmQuU2VuZENvbXBsZXRpb25UaWQ7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7Ci0KIAlrZnJlZShwYWNrZXQpOwogCiAJaWYgKHNrYikgewpAQCAtMTM1LDggKzEyNiw2IEBACiAJCWlmICgobmV0X2RldmljZV9jdHgtPmF2YWlsICs9IG51bV9wYWdlcykgPj0gUEFDS0VUX1BBR0VTX0hJV0FURVIpCiAgCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXQpOwogCX0KLQotCURQUklOVF9FWElUKE5FVFZTQ19EUlYpOwogfQogCiBzdGF0aWMgaW50IG5ldHZzY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCkBAIC0xNTEsOCArMTQwLDYgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBpLCBudW1fcGFnZXM7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7Ci0KIAlEUFJJTlRfREJHKE5FVFZTQ19EUlYsICJ4bWl0IHBhY2tldCAtIGxlbiAlZCBkYXRhX2xlbiAlZCIsCiAJCSAgIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuKTsKIApAQCAtMjI1LDcgKzIxMiw2IEBACiAJCW5ldHZzY194bWl0X2NvbXBsZXRpb24ocGFja2V0KTsKIAl9CiAKLQlEUFJJTlRfRVhJVChORVRWU0NfRFJWKTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCkBAIC0yMzgsOCArMjI0LDYgQEAKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0gdG9fdm1fZGV2aWNlKGRldmljZV9vYmopOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBkZXZfZ2V0X2RydmRhdGEoJmRldmljZV9jdHgtPmRldmljZSk7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7Ci0KIAlpZiAoIW5ldCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQ19EUlYsICJnb3QgbGluayBzdGF0dXMgYnV0IG5ldCBkZXZpY2UgIgogCQkJCSJub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CkBAIC0yNTMsNyArMjM3LDYgQEAKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwogCX0KLQlEUFJJTlRfRVhJVChORVRWU0NfRFJWKTsKIH0KIAogLyoKQEAgLTI3MCw4ICsyNTMsNiBAQAogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7Ci0KIAlpZiAoIW5ldCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQ19EUlYsICJnb3QgcmVjZWl2ZSBjYWxsYmFjayBidXQgbmV0IGRldmljZSAiCiAJCQkJIm5vdCBpbml0aWFsaXplZCB5ZXQiKTsKQEAgLTMyMyw4ICszMDQsNiBAQAogCURQUklOVF9EQkcoTkVUVlNDX0RSViwgIiMgb2YgcmVjdnMgJWx1IHRvdGFsIHNpemUgJWx1IiwKIAkJICAgbmV0LT5zdGF0cy5yeF9wYWNrZXRzLCBuZXQtPnN0YXRzLnJ4X2J5dGVzKTsKIAotCURQUklOVF9FWElUKE5FVFZTQ19EUlYpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2NCw4ICszNDMsNiBAQAogCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gZGV2aWNlX2luZm87CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihORVRWU0NfRFJWKTsKLQogCWlmICghbmV0X2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQpCiAJCXJldHVybiAtMTsKIApAQCAtNDIyLDcgKzM5OSw2IEBACiAJCWZyZWVfbmV0ZGV2KG5ldCk7CiAJfQogCi0JRFBSSU5UX0VYSVQoTkVUVlNDX0RSVik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDM4LDE4ICs0MTQsMTMgQEAKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqID0gJmRldmljZV9jdHgtPmRldmljZV9vYmo7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihORVRWU0NfRFJWKTsKLQogCWlmIChuZXQgPT0gTlVMTCkgewogCQlEUFJJTlRfSU5GTyhORVRWU0MsICJubyBuZXQgZGV2aWNlIHRvIHJlbW92ZSIpOwotCQlEUFJJTlRfRVhJVChORVRWU0NfRFJWKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkgewotCQlEUFJJTlRfRVhJVChORVRWU0NfRFJWKTsKKwlpZiAoIW5ldF9kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKQogCQlyZXR1cm4gLTE7Ci0JfQogCiAJLyogU3RvcCBvdXRib3VuZCBhc2FwICovCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwpAQCAtNDY4LDcgKzQzOSw2IEBACiAJfQogCiAJZnJlZV9uZXRkZXYobmV0KTsKLQlEUFJJTlRfRVhJVChORVRWU0NfRFJWKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00ODgsOCArNDU4LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpjdXJyZW50X2RldjsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQ19EUlYpOwotCiAJd2hpbGUgKDEpIHsKIAkJY3VycmVudF9kZXYgPSBOVUxMOwogCkBAIC01MTUsOCArNDgzLDYgQEAKIAogCXZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKGRydl9jdHgpOwogCi0JRFBSSU5UX0VYSVQoTkVUVlNDX0RSVik7Ci0KIAlyZXR1cm47CiB9CiAKQEAgLTUyNiw4ICs0OTIsNiBAQAogCXN0cnVjdCBkcml2ZXJfY29udGV4dCAqZHJ2X2N0eCA9ICZnX25ldHZzY19kcnYuZHJ2X2N0eDsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQ19EUlYpOwotCiAJdm1idXNfZ2V0X2ludGVyZmFjZSgmbmV0X2Rydl9vYmotPkJhc2UuVm1idXNDaGFubmVsSW50ZXJmYWNlKTsKIAogCW5ldF9kcnZfb2JqLT5SaW5nQnVmZmVyU2l6ZSA9IHJpbmdfc2l6ZSAqIFBBR0VfU0laRTsKQEAgLTU0Nyw4ICs1MTEsNiBAQAogCS8qIFRoZSBkcml2ZXIgYmVsb25ncyB0byB2bWJ1cyAqLwogCXJldCA9IHZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlcihkcnZfY3R4KTsKIAotCURQUklOVF9FWElUKE5FVFZTQ19EUlYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTY4LDI2ICs1MzAsMTcgQEAKIAogc3RhdGljIGludCBfX2luaXQgbmV0dnNjX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCi0JRFBSSU5UX0VOVEVSKE5FVFZTQ19EUlYpOwogCURQUklOVF9JTkZPKE5FVFZTQ19EUlYsICJOZXR2c2MgaW5pdGlhbGl6aW5nLi4uLiIpOwogCiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGh2X25ldHZzY19kbWlfdGFibGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldCA9IG5ldHZzY19kcnZfaW5pdChOZXRWc2NJbml0aWFsaXplKTsKLQotCURQUklOVF9FWElUKE5FVFZTQ19EUlYpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gbmV0dnNjX2Rydl9pbml0KE5ldFZzY0luaXRpYWxpemUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmV0dnNjX2V4aXQodm9pZCkKIHsKLQlEUFJJTlRfRU5URVIoTkVUVlNDX0RSVik7CiAJbmV0dnNjX2Rydl9leGl0KCk7Ci0JRFBSSU5UX0VYSVQoTkVUVlNDX0RSVik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2luaXRjb25zdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JpbmdfYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYwppbmRleCBhZTJhMTBlLi4xN2JjNzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYwpAQCAtNDYsNyArNDYsNyBAQAogCiAtLSovCiBzdGF0aWMgaW5saW5lIHZvaWQKLUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKFJJTkdfQlVGRkVSX0lORk8gKnJiaSwgdTMyICpyZWFkLCB1MzIgKndyaXRlKQorR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSwgdTMyICpyZWFkLCB1MzIgKndyaXRlKQogewogCXUzMiByZWFkX2xvYywgd3JpdGVfbG9jOwogCkBAIC02OCw3ICs2OCw3IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdTMyCi1HZXROZXh0V3JpdGVMb2NhdGlvbihSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbykKK0dldE5leHRXcml0ZUxvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKIHsKIAl1MzIgbmV4dCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4OwogCkBAIC04Nyw3ICs4Nyw4IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotU2V0TmV4dFdyaXRlTG9jYXRpb24oUklOR19CVUZGRVJfSU5GTyAqUmluZ0luZm8sIHUzMiBOZXh0V3JpdGVMb2NhdGlvbikKK1NldE5leHRXcml0ZUxvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKKwkJICAgICB1MzIgTmV4dFdyaXRlTG9jYXRpb24pCiB7CiAJUmluZ0luZm8tPlJpbmdCdWZmZXItPldyaXRlSW5kZXggPSBOZXh0V3JpdGVMb2NhdGlvbjsKIH0KQEAgLTEwMiw3ICsxMDMsNyBAQAogCiAtLSovCiBzdGF0aWMgaW5saW5lIHUzMgotR2V0TmV4dFJlYWRMb2NhdGlvbihSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbykKK0dldE5leHRSZWFkTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQogewogCXUzMiBuZXh0ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKIApAQCAtMTIyLDcgKzEyMyw3IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdTMyCi1HZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldChSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbywgdTMyIE9mZnNldCkKK0dldE5leHRSZWFkTG9jYXRpb25XaXRoT2Zmc2V0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdTMyIE9mZnNldCkKIHsKIAl1MzIgbmV4dCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXg7CiAKQEAgLTE0Myw3ICsxNDQsNyBAQAogCiAtLSovCiBzdGF0aWMgaW5saW5lIHZvaWQKLVNldE5leHRSZWFkTG9jYXRpb24oUklOR19CVUZGRVJfSU5GTyAqUmluZ0luZm8sIHUzMiBOZXh0UmVhZExvY2F0aW9uKQorU2V0TmV4dFJlYWRMb2NhdGlvbihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHUzMiBOZXh0UmVhZExvY2F0aW9uKQogewogCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXggPSBOZXh0UmVhZExvY2F0aW9uOwogfQpAQCAtMTU5LDcgKzE2MCw3IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqCi1HZXRSaW5nQnVmZmVyKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvKQorR2V0UmluZ0J1ZmZlcihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pCiB7CiAJcmV0dXJuICh2b2lkICopUmluZ0luZm8tPlJpbmdCdWZmZXItPkJ1ZmZlcjsKIH0KQEAgLTE3NSw3ICsxNzYsNyBAQAogCiAtLSovCiBzdGF0aWMgaW5saW5lIHUzMgotR2V0UmluZ0J1ZmZlclNpemUoUklOR19CVUZGRVJfSU5GTyAqUmluZ0luZm8pCitHZXRSaW5nQnVmZmVyU2l6ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pCiB7CiAJcmV0dXJuIFJpbmdJbmZvLT5SaW5nRGF0YVNpemU7CiB9CkBAIC0xOTAsNyArMTkxLDcgQEAKIAogLS0qLwogc3RhdGljIGlubGluZSB1NjQKLUdldFJpbmdCdWZmZXJJbmRpY2VzKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvKQorR2V0UmluZ0J1ZmZlckluZGljZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQogewogCXJldHVybiAoKHU2NClSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleCA8PCAzMikKIAl8fCBSaW5nSW5mby0+UmluZ0J1ZmZlci0+UmVhZEluZGV4OwpAQCAtMjA2LDcgKzIwNyw3IEBACiAJRHVtcCBvdXQgdG8gY29uc29sZSB0aGUgcmluZyBidWZmZXIgaW5mbwogCiAtLSovCi12b2lkIER1bXBSaW5nSW5mbyhSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbywgY2hhciAqUHJlZml4KQordm9pZCBEdW1wUmluZ0luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCBjaGFyICpQcmVmaXgpCiB7CiAJdTMyIGJ5dGVzQXZhaWxUb1dyaXRlOwogCXUzMiBieXRlc0F2YWlsVG9SZWFkOwpAQCAtMjMzLDE0ICsyMzQsMTQgQEAKIAogc3RhdGljIHUzMgogQ29weVRvUmluZ0J1ZmZlcigKLQlSSU5HX0JVRkZFUl9JTkZPCSpSaW5nSW5mbywKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCiAJdTMyCQkJCVN0YXJ0V3JpdGVPZmZzZXQsCiAJdm9pZAkJCQkqU3JjLAogCXUzMgkJCQlTcmNMZW4pOwogCiBzdGF0aWMgdTMyCiBDb3B5RnJvbVJpbmdCdWZmZXIoCi0JUklOR19CVUZGRVJfSU5GTwkqUmluZ0luZm8sCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKlJpbmdJbmZvLAogCXZvaWQJCQkJKkRlc3QsCiAJdTMyCQkJCURlc3RMZW4sCiAJdTMyCQkJCVN0YXJ0UmVhZE9mZnNldCk7CkBAIC0yNTYsOCArMjU3LDggQEAKIAlHZXQgdmFyaW91cyBkZWJ1ZyBtZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KLXZvaWQgUmluZ0J1ZmZlckdldERlYnVnSW5mbyhSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbywKLQkJCSAgICBSSU5HX0JVRkZFUl9ERUJVR19JTkZPICpEZWJ1Z0luZm8pCit2b2lkIFJpbmdCdWZmZXJHZXREZWJ1Z0luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLAorCQkJICAgIHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvICpkZWJ1Z19pbmZvKQogewogCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKIAl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKQEAgLTI2NywxMSArMjY4LDExIEBACiAJCQkJCSZieXRlc0F2YWlsVG9SZWFkLAogCQkJCQkmYnl0ZXNBdmFpbFRvV3JpdGUpOwogCi0JCURlYnVnSW5mby0+Qnl0ZXNBdmFpbFRvUmVhZCA9IGJ5dGVzQXZhaWxUb1JlYWQ7Ci0JCURlYnVnSW5mby0+Qnl0ZXNBdmFpbFRvV3JpdGUgPSBieXRlc0F2YWlsVG9Xcml0ZTsKLQkJRGVidWdJbmZvLT5DdXJyZW50UmVhZEluZGV4ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKLQkJRGVidWdJbmZvLT5DdXJyZW50V3JpdGVJbmRleCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4OwotCQlEZWJ1Z0luZm8tPkN1cnJlbnRJbnRlcnJ1cHRNYXNrID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPkludGVycnVwdE1hc2s7CisJCWRlYnVnX2luZm8tPkJ5dGVzQXZhaWxUb1JlYWQgPSBieXRlc0F2YWlsVG9SZWFkOworCQlkZWJ1Z19pbmZvLT5CeXRlc0F2YWlsVG9Xcml0ZSA9IGJ5dGVzQXZhaWxUb1dyaXRlOworCQlkZWJ1Z19pbmZvLT5DdXJyZW50UmVhZEluZGV4ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKKwkJZGVidWdfaW5mby0+Q3VycmVudFdyaXRlSW5kZXggPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleDsKKwkJZGVidWdfaW5mby0+Q3VycmVudEludGVycnVwdE1hc2sgPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+SW50ZXJydXB0TWFzazsKIAl9CiB9CiAKQEAgLTI4NSw3ICsyODYsNyBAQAogCUdldCB0aGUgaW50ZXJydXB0IG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwotdTMyIEdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKFJJTkdfQlVGRkVSX0lORk8gKnJiaSkKK3UzMiBHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmJpKQogewogCXJldHVybiByYmktPlJpbmdCdWZmZXItPkludGVycnVwdE1hc2s7CiB9CkBAIC0yOTksMTggKzMwMCwxOCBAQAogCUluaXRpYWxpemUgdGhlIHJpbmcgYnVmZmVyCiAKIC0tKi8KLWludCBSaW5nQnVmZmVySW5pdChSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLCB1MzIgQnVmZmVyTGVuKQoraW50IFJpbmdCdWZmZXJJbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLCB1MzIgQnVmZmVyTGVuKQogewotCWlmIChzaXplb2YoUklOR19CVUZGRVIpICE9IFBBR0VfU0laRSkKKwlpZiAoc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcikgIT0gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbXNldChSaW5nSW5mbywgMCwgc2l6ZW9mKFJJTkdfQlVGRkVSX0lORk8pKTsKKwltZW1zZXQoUmluZ0luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbykpOwogCi0JUmluZ0luZm8tPlJpbmdCdWZmZXIgPSAoUklOR19CVUZGRVIgKilCdWZmZXI7CisJUmluZ0luZm8tPlJpbmdCdWZmZXIgPSAoc3RydWN0IGh2X3JpbmdfYnVmZmVyICopQnVmZmVyOwogCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXggPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleCA9IDA7CiAKIAlSaW5nSW5mby0+UmluZ1NpemUgPSBCdWZmZXJMZW47Ci0JUmluZ0luZm8tPlJpbmdEYXRhU2l6ZSA9IEJ1ZmZlckxlbiAtIHNpemVvZihSSU5HX0JVRkZFUik7CisJUmluZ0luZm8tPlJpbmdEYXRhU2l6ZSA9IEJ1ZmZlckxlbiAtIHNpemVvZihzdHJ1Y3QgaHZfcmluZ19idWZmZXIpOwogCiAJc3Bpbl9sb2NrX2luaXQoJlJpbmdJbmZvLT5yaW5nX2xvY2spOwogCkBAIC0zMjYsNyArMzI3LDcgQEAKIAlDbGVhbnVwIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCi12b2lkIFJpbmdCdWZmZXJDbGVhbnVwKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvKQordm9pZCBSaW5nQnVmZmVyQ2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pCiB7CiB9CiAKQEAgLTMzOSw3ICszNDAsNyBAQAogCVdyaXRlIHRvIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCi1pbnQgUmluZ0J1ZmZlcldyaXRlKFJJTkdfQlVGRkVSX0lORk8gKk91dFJpbmdJbmZvLAoraW50IFJpbmdCdWZmZXJXcml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqT3V0UmluZ0luZm8sCiAJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdTMyIHNnY291bnQpCiB7CiAJaW50IGkgPSAwOwpAQCAtMzUyLDggKzM1Myw2IEBACiAJdTY0IHByZXZJbmRpY2VzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIHNnY291bnQsIGkpCiAJewogCQl0b3RhbEJ5dGVzVG9Xcml0ZSArPSBzZy0+bGVuZ3RoOwpAQCAtMzgyLDkgKzM4MSw2IEBACiAJCQlieXRlQXZhaWxUb1dyaXRlKTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZPdXRSaW5nSW5mby0+cmluZ19sb2NrLCBmbGFncyk7Ci0KLQkJRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTQxNiw5ICs0MTIsNiBAQAogCS8qIER1bXBSaW5nSW5mbyhPdXRSaW5nSW5mbywgIkFGVEVSICIpOyAqLwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzMiw3ICs0MjUsNyBAQAogCVJlYWQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHJlYWQgaW5kZXgKIAogLS0qLwotaW50IFJpbmdCdWZmZXJQZWVrKFJJTkdfQlVGRkVSX0lORk8gKkluUmluZ0luZm8sIHZvaWQgKkJ1ZmZlciwgdTMyIEJ1ZmZlckxlbikKK2ludCBSaW5nQnVmZmVyUGVlayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqSW5SaW5nSW5mbywgdm9pZCAqQnVmZmVyLCB1MzIgQnVmZmVyTGVuKQogewogCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKIAl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKQEAgLTQ4MSw3ICs0NzQsNyBAQAogCVJlYWQgYW5kIGFkdmFuY2UgdGhlIHJlYWQgaW5kZXgKIAogLS0qLwotaW50IFJpbmdCdWZmZXJSZWFkKFJJTkdfQlVGRkVSX0lORk8gKkluUmluZ0luZm8sIHZvaWQgKkJ1ZmZlciwKK2ludCBSaW5nQnVmZmVyUmVhZChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqSW5SaW5nSW5mbywgdm9pZCAqQnVmZmVyLAogCQkgICB1MzIgQnVmZmVyTGVuLCB1MzIgT2Zmc2V0KQogewogCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKQEAgLTU1Niw3ICs1NDksNyBAQAogLS0qLwogc3RhdGljIHUzMgogQ29weVRvUmluZ0J1ZmZlcigKLQlSSU5HX0JVRkZFUl9JTkZPCSpSaW5nSW5mbywKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCiAJdTMyCQkJCVN0YXJ0V3JpdGVPZmZzZXQsCiAJdm9pZAkJCQkqU3JjLAogCXUzMgkJCQlTcmNMZW4pCkBAIC01OTQsNyArNTg3LDcgQEAKIC0tKi8KIHN0YXRpYyB1MzIKIENvcHlGcm9tUmluZ0J1ZmZlcigKLQlSSU5HX0JVRkZFUl9JTkZPCSpSaW5nSW5mbywKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCiAJdm9pZAkJCQkqRGVzdCwKIAl1MzIJCQkJRGVzdExlbiwKIAl1MzIJCQkJU3RhcnRSZWFkT2Zmc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JpbmdfYnVmZmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaAppbmRleCA2MjAyMTU3Li5hN2YxNzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaApAQCAtMjcsNyArMjcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgX1JJTkdfQlVGRkVSIHsKK3N0cnVjdCBodl9yaW5nX2J1ZmZlciB7CiAJLyogT2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHJpbmcgZGF0YSBiZWxvdyAqLwogCXZvbGF0aWxlIHUzMiBXcml0ZUluZGV4OwogCkBAIC01MSw1MSArNTEsNTIgQEAKIAkgKiAhISEgRE8gTk9UIHBsYWNlIGFueSBmaWVsZHMgYmVsb3cgdGhpcyAhISEKIAkgKi8KIAl1OCBCdWZmZXJbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIFJJTkdfQlVGRkVSOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JJTkdfQlVGRkVSX0lORk8gewotCVJJTkdfQlVGRkVSICpSaW5nQnVmZmVyOworc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8geworCXN0cnVjdCBodl9yaW5nX2J1ZmZlciAqUmluZ0J1ZmZlcjsKIAl1MzIgUmluZ1NpemU7CQkJLyogSW5jbHVkZSB0aGUgc2hhcmVkIGhlYWRlciAqLwogCXNwaW5sb2NrX3QgcmluZ19sb2NrOwogCiAJdTMyIFJpbmdEYXRhU2l6ZTsJCS8qIDwgcmluZ1NpemUgKi8KIAl1MzIgUmluZ0RhdGFTdGFydE9mZnNldDsKK307CiAKLX0gUklOR19CVUZGRVJfSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JJTkdfQlVGRkVSX0RFQlVHX0lORk8geworc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gewogCXUzMiBDdXJyZW50SW50ZXJydXB0TWFzazsKIAl1MzIgQ3VycmVudFJlYWRJbmRleDsKIAl1MzIgQ3VycmVudFdyaXRlSW5kZXg7CiAJdTMyIEJ5dGVzQXZhaWxUb1JlYWQ7CiAJdTMyIEJ5dGVzQXZhaWxUb1dyaXRlOwotfSBSSU5HX0JVRkZFUl9ERUJVR19JTkZPOworfTsKIAogCiAKIC8qIEludGVyZmFjZSAqLwogCiAKLWludCBSaW5nQnVmZmVySW5pdChSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLCB1MzIgQnVmZmVyTGVuKTsKK2ludCBSaW5nQnVmZmVySW5pdChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHZvaWQgKkJ1ZmZlciwKKwkJICAgdTMyIEJ1ZmZlckxlbik7CiAKLXZvaWQgUmluZ0J1ZmZlckNsZWFudXAoUklOR19CVUZGRVJfSU5GTyAqUmluZ0luZm8pOwordm9pZCBSaW5nQnVmZmVyQ2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pOwogCi1pbnQgUmluZ0J1ZmZlcldyaXRlKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvLAoraW50IFJpbmdCdWZmZXJXcml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sCiAJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKIAkJICAgIHUzMiBzZ2NvdW50KTsKIAotaW50IFJpbmdCdWZmZXJQZWVrKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvLCB2b2lkICpCdWZmZXIsIHUzMiBCdWZmZXJMZW4pOworaW50IFJpbmdCdWZmZXJQZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLAorCQkgICB1MzIgQnVmZmVyTGVuKTsKIAotaW50IFJpbmdCdWZmZXJSZWFkKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvLAoraW50IFJpbmdCdWZmZXJSZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKIAkJICAgdm9pZCAqQnVmZmVyLAogCQkgICB1MzIgQnVmZmVyTGVuLAogCQkgICB1MzIgT2Zmc2V0KTsKIAotdTMyIEdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvKTsKK3UzMiBHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pOwogCi12b2lkIER1bXBSaW5nSW5mbyhSSU5HX0JVRkZFUl9JTkZPICpSaW5nSW5mbywgY2hhciAqUHJlZml4KTsKK3ZvaWQgRHVtcFJpbmdJbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgY2hhciAqUHJlZml4KTsKIAotdm9pZCBSaW5nQnVmZmVyR2V0RGVidWdJbmZvKFJJTkdfQlVGRkVSX0lORk8gKlJpbmdJbmZvLAotCQkJICAgIFJJTkdfQlVGRkVSX0RFQlVHX0lORk8gKkRlYnVnSW5mbyk7Cit2b2lkIFJpbmdCdWZmZXJHZXREZWJ1Z0luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLAorCQkJICAgIHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvICpkZWJ1Z19pbmZvKTsKIAogI2VuZGlmIC8qIF9SSU5HX0JVRkZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jCmluZGV4IDVlZGYwODUzLi5mYTIxNDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jCkBAIC0yNDQsOCArMjQ0LDYgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQ7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qIFNldHVwIHRoZSBwYWNrZXQgdG8gc2VuZCBpdCAqLwogCXBhY2tldCA9ICZSZXF1ZXN0LT5QYWNrZXQ7CiAKQEAgLTI2NSw3ICsyNjMsNiBAQAogCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uVGlkID0gKHVuc2lnbmVkIGxvbmcpRGV2aWNlOwogCiAJcmV0ID0gZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uU2VuZChEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLCBwYWNrZXQpOwotCURQUklOVF9FWElUKE5FVFZTQyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjc2LDggKzI3Myw2IEBACiAJYm9vbCBmb3VuZCA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxdWVzdCwgJkRldmljZS0+UmVxdWVzdExpc3QsIExpc3RFbnRyeSkgewogCQkvKgpAQCAtMzI1LDggKzMyMCw2IEBACiAJCQkgICBSZXNwb25zZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuUmVxdWVzdElkLAogCQkJICAgUmVzcG9uc2UtPk5kaXNNZXNzYWdlVHlwZSk7CiAJfQotCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIH0KIAogc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJSZWNlaXZlSW5kaWNhdGVTdGF0dXMoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLApAQCAtMzUzLDggKzM0Niw2IEBACiAJc3RydWN0IHJuZGlzX3BhY2tldCAqcm5kaXNQYWNrZXQ7CiAJdTMyIGRhdGFPZmZzZXQ7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qIGVtcHR5IGV0aGVybmV0IGZyYW1lID8/ICovCiAJLyogQVNTRVJUKFBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoID4gKi8KIAkvKiAJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19wYWNrZXQpKTsgKi8KQEAgLTM3Nyw4ICszNjgsNiBAQAogCiAJZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uUmVjZWl2ZUNhbGxiYWNrKERldmljZS0+TmV0RGV2aWNlLT5EZXZpY2UsCiAJCQkJCQkgICBQYWNrZXQpOwotCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIH0KIAogc3RhdGljIGludCBSbmRpc0ZpbHRlck9uUmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCkBAIC0zODksOCArMzc4LDYgQEAKIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBybmRpc01lc3NhZ2U7CiAJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzSGVhZGVyOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlpZiAoIW5ldERldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTM5OCw3ICszODUsNiBAQAogCWlmICghbmV0RGV2aWNlLT5FeHRlbnNpb24pIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJnb3Qgcm5kaXMgbWVzc2FnZSBidXQgbm8gcm5kaXMgZGV2aWNlLi4uIgogCQkJICAiZHJvcHBpbmcgdGhpcyBtZXNzYWdlISIpOwotCQlEUFJJTlRfRVhJVChORVRWU0MpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC00MDYsNyArMzkyLDYgQEAKIAlpZiAocm5kaXNEZXZpY2UtPlN0YXRlID09IFJORElTX0RFVl9VTklOSVRJQUxJWkVEKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiZ290IHJuZGlzIG1lc3NhZ2UgYnV0IHJuZGlzIGRldmljZSAiCiAJCQkgICAidW5pbml0aWFsaXplZC4uLmRyb3BwaW5nIHRoaXMgbWVzc2FnZSEiKTsKLQkJRFBSSU5UX0VYSVQoTkVUVlNDKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNDMxLDcgKzQxNiw2IEBACiAJCQkgICAiYnl0ZXMgZ290ICV1KS4uLmRyb3BwaW5nIHRoaXMgbWVzc2FnZSEiLAogCQkJICAgcm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGgsCiAJCQkgICBQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCk7Ci0JCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCXJldHVybiAtMTsKIAl9CiAjZW5kaWYKQEAgLTQ3OSw3ICs0NjMsNiBAQAogCQlicmVhazsKIAl9CiAKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCXJldHVybiAwOwogfQogCkBAIC00OTIsOCArNDc1LDYgQEAKIAlzdHJ1Y3Qgcm5kaXNfcXVlcnlfY29tcGxldGUgKnF1ZXJ5Q29tcGxldGU7CiAJaW50IHJldCA9IDA7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCWlmICghUmVzdWx0KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNTM2LDcgKzUxNyw2IEBACiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQogCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU2OCw4ICs1NDgsNiBAQAogCXUzMiBzdGF0dXM7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJLyogQVNTRVJUKFJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpICsgc2l6ZW9mKHUzMikgPD0gKi8KIAkvKiAJc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSk7ICovCiAKQEAgLTYxNCwxNSArNTkyLDExIEBACiAJaWYgKHJlcXVlc3QpCiAJCVB1dFJuZGlzUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOwogRXhpdDoKLQlEUFJJTlRfRVhJVChORVRWU0MpOwotCiAJcmV0dXJuIHJldDsKIH0KIAogaW50IFJuZGlzRmlsdGVySW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqRHJpdmVyKQogewotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJRFBSSU5UX0RCRyhORVRWU0MsICJzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpID09ICV6ZCIsCiAJCSAgIHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCkpOwogCkBAIC02NTgsOCArNjMyLDYgQEAKIAkvKiBEcml2ZXItPlF1ZXJ5TGlua1N0YXR1cyA9IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2VMaW5rU3RhdHVzOyAqLwogCURyaXZlci0+T25SZWNlaXZlQ2FsbGJhY2sgPSBSbmRpc0ZpbHRlck9uUmVjZWl2ZTsKIAotCURQUklOVF9FWElUKE5FVFZTQyk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjcxLDggKzY0Myw2IEBACiAJdTMyIHN0YXR1czsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlyZXF1ZXN0ID0gR2V0Um5kaXNSZXF1ZXN0KERldmljZSwgUkVNT1RFX05ESVNfSU5JVElBTElaRV9NU0csCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX2luaXRpYWxpemVfcmVxdWVzdCkpOwogCWlmICghcmVxdWVzdCkgewpAQCAtNzEwLDcgKzY4MCw2IEBACiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQogCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTcyMCw4ICs2ODksNiBAQAogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwogCXN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgKmhhbHQ7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qIEF0dGVtcHQgdG8gZG8gYSBybmRpcyBkZXZpY2UgaGFsdCAqLwogCXJlcXVlc3QgPSBHZXRSbmRpc1JlcXVlc3QoRGV2aWNlLCBSRU1PVEVfTkRJU19IQUxUX01TRywKIAkJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX2hhbHRfcmVxdWVzdCkpOwpAQCAtNzQwLDcgKzcwNyw2IEBACiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQogCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKLQlEUFJJTlRfRVhJVChORVRWU0MpOwogCXJldHVybjsKIH0KIApAQCAtNzQ4LDggKzcxNCw2IEBACiB7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJaWYgKERldmljZS0+U3RhdGUgIT0gUk5ESVNfREVWX0lOSVRJQUxJWkVEKQogCQlyZXR1cm4gMDsKIApAQCAtNzYwLDcgKzcyNCw2IEBACiAJaWYgKHJldCA9PSAwKQogCQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX0RBVEFJTklUSUFMSVpFRDsKIAotCURQUklOVF9FWElUKE5FVFZTQyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzY4LDggKzczMSw2IEBACiB7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJaWYgKERldmljZS0+U3RhdGUgIT0gUk5ESVNfREVWX0RBVEFJTklUSUFMSVpFRCkKIAkJcmV0dXJuIDA7CiAKQEAgLTc3Nyw4ICs3MzgsNiBAQAogCWlmIChyZXQgPT0gMCkKIAkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKIAotCURQUklOVF9FWElUKE5FVFZTQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC03OTAsMTMgKzc0OSw5IEBACiAJc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNEZXZpY2U7CiAJc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyAqZGV2aWNlSW5mbyA9IEFkZGl0aW9uYWxJbmZvOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlybmRpc0RldmljZSA9IEdldFJuZGlzRGV2aWNlKCk7Ci0JaWYgKCFybmRpc0RldmljZSkgewotCQlEUFJJTlRfRVhJVChORVRWU0MpOworCWlmICghcm5kaXNEZXZpY2UpCiAJCXJldHVybiAtMTsKLQl9CiAKIAlEUFJJTlRfREJHKE5FVFZTQywgInJuZGlzIGRldmljZSBvYmplY3QgYWxsb2NhdGVkIC0gJXAiLCBybmRpc0RldmljZSk7CiAKQEAgLTgwOCw3ICs3NjMsNiBAQAogCXJldCA9IGdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlQWRkKERldmljZSwgQWRkaXRpb25hbEluZm8pOwogCWlmIChyZXQgIT0gMCkgewogCQlrZnJlZShybmRpc0RldmljZSk7Ci0JCURQUklOVF9FWElUKE5FVFZTQyk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC04NDksOCArODAzLDYgQEAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEZXZpY2UgMHglcCBsaW5rIHN0YXRlICVzIiwgcm5kaXNEZXZpY2UsCiAJCSAgICAoKGRldmljZUluZm8tPkxpbmtTdGF0ZSkgPyAoImRvd24iKSA6ICgidXAiKSkpOwogCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg1OSw4ICs4MTEsNiBAQAogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKIAlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpybmRpc0RldmljZSA9IG5ldERldmljZS0+RXh0ZW5zaW9uOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAkvKiBIYWx0IGFuZCByZWxlYXNlIHRoZSBybmRpcyBkZXZpY2UgKi8KIAlSbmRpc0ZpbHRlckhhbHREZXZpY2Uocm5kaXNEZXZpY2UpOwogCkBAIC04NzAsNTAgKzgyMCwzMSBAQAogCS8qIFBhc3MgY29udHJvbCB0byBpbm5lciBkcml2ZXIgdG8gcmVtb3ZlIHRoZSBkZXZpY2UgKi8KIAlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuQmFzZS5PbkRldmljZVJlbW92ZShEZXZpY2UpOwogCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCiB7Ci0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KLQlEUFJJTlRfRVhJVChORVRWU0MpOwogfQogCiBpbnQgUm5kaXNGaWx0ZXJPbk9wZW4oc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQogewotCWludCByZXQ7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlpZiAoIW5ldERldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlck9wZW5EZXZpY2UobmV0RGV2aWNlLT5FeHRlbnNpb24pOwotCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIFJuZGlzRmlsdGVyT3BlbkRldmljZShuZXREZXZpY2UtPkV4dGVuc2lvbik7CiB9CiAKIGludCBSbmRpc0ZpbHRlck9uQ2xvc2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQogewotCWludCByZXQ7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOwogCi0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAlpZiAoIW5ldERldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlckNsb3NlRGV2aWNlKG5ldERldmljZS0+RXh0ZW5zaW9uKTsKLQotCURQUklOVF9FWElUKE5FVFZTQyk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBSbmRpc0ZpbHRlckNsb3NlRGV2aWNlKG5ldERldmljZS0+RXh0ZW5zaW9uKTsKIH0KIAogc3RhdGljIGludCBSbmRpc0ZpbHRlck9uU2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCkBAIC05MjUsOCArODU2LDYgQEAKIAlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc1BhY2tldDsKIAl1MzIgcm5kaXNNZXNzYWdlU2l6ZTsKIAotCURQUklOVF9FTlRFUihORVRWU0MpOwotCiAJLyogQWRkIHRoZSBybmRpcyBoZWFkZXIgKi8KIAlmaWx0ZXJQYWNrZXQgPSAoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKilQYWNrZXQtPkV4dGVuc2lvbjsKIAkvKiBBU1NFUlQoZmlsdGVyUGFja2V0KTsgKi8KQEAgLTk3MSw4ICs5MDAsNiBAQAogCQkJCWZpbHRlclBhY2tldC0+Q29tcGxldGlvbkNvbnRleHQ7CiAJfQogCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk4MCwxOSArOTA3LDEyIEBACiB7CiAJc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKmZpbHRlclBhY2tldCA9IENvbnRleHQ7CiAKLQlEUFJJTlRfRU5URVIoTkVUVlNDKTsKLQogCS8qIFBhc3MgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgaGFuZGxlciAqLwogCWZpbHRlclBhY2tldC0+T25Db21wbGV0aW9uKGZpbHRlclBhY2tldC0+Q29tcGxldGlvbkNvbnRleHQpOwotCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIH0KIAogCiBzdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uU2VuZFJlcXVlc3RDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpCiB7Ci0JRFBSSU5UX0VOVEVSKE5FVFZTQyk7Ci0KIAkvKiBOb29wICovCi0JRFBSSU5UX0VYSVQoTkVUVlNDKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzYy5jCmluZGV4IDI3YTI3NmUuLjZiZDJmZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYwpAQCAtMTg2LDcgKzE4Niw2IEBACiAJaWYgKCFzdG9yRGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJRFBSSU5UX0VYSVQoU1RPUlZTQyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTM0NCw4ICszNDMsNiBAQAogCXJlcXVlc3QtPldhaXRFdmVudCA9IE5VTEw7CiBub21lbToKIAlQdXRTdG9yRGV2aWNlKERldmljZSk7Ci0KLQlEUFJJTlRfRVhJVChTVE9SVlNDKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNTYsMTMgKzM1MywxMCBAQAogCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3Q7CiAJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0MpOwotCiAJc3RvckRldmljZSA9IE11c3RHZXRTdG9yRGV2aWNlKERldmljZSk7CiAJaWYgKCFzdG9yRGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJRFBSSU5UX0VYSVQoU1RPUlZTQyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQxNCw4ICs0MDgsNiBAQAogCWF0b21pY19kZWMoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpOwogCiAJUHV0U3RvckRldmljZShEZXZpY2UpOwotCi0JRFBSSU5UX0VYSVQoU1RPUlZTQyk7CiB9CiAKIHN0YXRpYyB2b2lkIFN0b3JWc2NPblJlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLApAQCAtNDQ5LDE1ICs0NDEsMTIgQEAKIAlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdDsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0MpOwotCiAJLyogQVNTRVJUKGRldmljZSk7ICovCiAKIAlzdG9yRGV2aWNlID0gTXVzdEdldFN0b3JEZXZpY2UoZGV2aWNlKTsKIAlpZiAoIXN0b3JEZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAidW5hYmxlIHRvIGdldCBzdG9yIGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwotCQlEUFJJTlRfRVhJVChTVE9SVlNDKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTAxLDggKzQ5MCw2IEBACiAJfSB3aGlsZSAoMSk7CiAKIAlQdXRTdG9yRGV2aWNlKGRldmljZSk7Ci0KLQlEUFJJTlRfRVhJVChTVE9SVlNDKTsKIAlyZXR1cm47CiB9CiAKQEAgLTU0Nyw4ICs1MzQsNiBAQAogCXN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICpkZXZpY2VJbmZvOwogCWludCByZXQgPSAwOwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0MpOwotCiAJZGV2aWNlSW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKUFkZGl0aW9uYWxJbmZvOwogCXN0b3JEZXZpY2UgPSBBbGxvY1N0b3JEZXZpY2UoRGV2aWNlKTsKIAlpZiAoIXN0b3JEZXZpY2UpIHsKQEAgLTU4NCw4ICs1NjksNiBAQAogCQkgICBzdG9yRGV2aWNlLT5UYXJnZXRJZCk7CiAKIENsZWFudXA6Ci0JRFBSSU5UX0VYSVQoU1RPUlZTQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC01OTYsOCArNTc5LDYgQEAKIHsKIAlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CiAKLQlEUFJJTlRfRU5URVIoU1RPUlZTQyk7Ci0KIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiZGlzYWJsaW5nIHN0b3JhZ2UgZGV2aWNlICglcCkuLi4iLAogCQkgICAgRGV2aWNlLT5FeHRlbnNpb24pOwogCkBAIC02MjUsOCArNjA2LDYgQEAKIAlEZXZpY2UtPkRyaXZlci0+Vm1idXNDaGFubmVsSW50ZXJmYWNlLkNsb3NlKERldmljZSk7CiAKIAlGcmVlU3RvckRldmljZShzdG9yRGV2aWNlKTsKLQotCURQUklOVF9FWElUKFNUT1JWU0MpOwogCXJldHVybiAwOwogfQogCkBAIC02MzcsMTUgKzYxNiwxMiBAQAogCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yUGFja2V0OwogCWludCByZXQ7CiAKLQlEUFJJTlRfRU5URVIoU1RPUlZTQyk7Ci0KIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAicmVzZXR0aW5nIGhvc3QgYWRhcHRlci4uLiIpOwogCiAJc3RvckRldmljZSA9IEdldFN0b3JEZXZpY2UoRGV2aWNlKTsKIAlpZiAoIXN0b3JEZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAidW5hYmxlIHRvIGdldCBzdG9yIGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwotCQlEUFJJTlRfRVhJVChTVE9SVlNDKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjg3LDcgKzY2Myw2IEBACiAKIENsZWFudXA6CiAJUHV0U3RvckRldmljZShEZXZpY2UpOwotCURQUklOVF9FWElUKFNUT1JWU0MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTcwMiw4ICs2NzcsNiBAQAogCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yUGFja2V0OwogCWludCByZXQgPSAwOwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0MpOwotCiAJcmVxdWVzdEV4dGVuc2lvbiA9CiAJCShzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqKVJlcXVlc3QtPkV4dGVuc2lvbjsKIAl2c3RvclBhY2tldCA9ICZyZXF1ZXN0RXh0ZW5zaW9uLT5WU3RvclBhY2tldDsKQEAgLTcyMCw3ICs2OTMsNiBAQAogCWlmICghc3RvckRldmljZSkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gZ2V0IHN0b3IgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7Ci0JCURQUklOVF9FWElUKFNUT1JWU0MpOwogCQlyZXR1cm4gLTI7CiAJfQogCkBAIC03ODYsOCArNzU4LDYgQEAKIAlhdG9taWNfaW5jKCZzdG9yRGV2aWNlLT5OdW1PdXRzdGFuZGluZ1JlcXVlc3RzKTsKIAogCVB1dFN0b3JEZXZpY2UoRGV2aWNlKTsKLQotCURQUklOVF9FWElUKFNUT1JWU0MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc5Niw4ICs3NjYsNiBAQAogICovCiBzdGF0aWMgdm9pZCBTdG9yVnNjT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKkRyaXZlcikKIHsKLQlEUFJJTlRfRU5URVIoU1RPUlZTQyk7Ci0JRFBSSU5UX0VYSVQoU1RPUlZTQyk7CiB9CiAKIC8qCkBAIC04MDcsOCArNzc1LDYgQEAKIHsKIAlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yRHJpdmVyOwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0MpOwotCiAJc3RvckRyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopRHJpdmVyOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAic2l6ZW9mKFNUT1JWU0NfUkVRVUVTVCk9JXpkICIKQEAgLTg1Miw3ICs4MTgsNSBAQAogCiAJc3RvckRyaXZlci0+T25JT1JlcXVlc3QJCT0gU3RvclZzY09uSU9SZXF1ZXN0OwogCi0JRFBSSU5UX0VYSVQoU1RPUlZTQyk7Ci0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMKaW5kZXggZDIyZTM1Zi4uMDc1YjYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMKQEAgLTE0MSw4ICsxNDEsNiBAQAogCXN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKnN0b3J2c2NfZHJ2X29iaiA9ICZnX3N0b3J2c2NfZHJ2LmRydl9vYmo7CiAJc3RydWN0IGRyaXZlcl9jb250ZXh0ICpkcnZfY3R4ID0gJmdfc3RvcnZzY19kcnYuZHJ2X2N0eDsKIAotCURQUklOVF9FTlRFUihTVE9SVlNDX0RSVik7Ci0KIAl2bWJ1c19nZXRfaW50ZXJmYWNlKCZzdG9ydnNjX2Rydl9vYmotPkJhc2UuVm1idXNDaGFubmVsSW50ZXJmYWNlKTsKIAogCXN0b3J2c2NfZHJ2X29iai0+UmluZ0J1ZmZlclNpemUgPSBzdG9ydnNjX3JpbmdidWZmZXJfc2l6ZTsKQEAgLTE3NSw4ICsxNzMsNiBAQAogCS8qIFRoZSBkcml2ZXIgYmVsb25ncyB0byB2bWJ1cyAqLwogCXJldCA9IHZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlcihkcnZfY3R4KTsKIAotCURQUklOVF9FWElUKFNUT1JWU0NfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE5NCw4ICsxOTAsNiBAQAogCXN0cnVjdCBkZXZpY2UgKmN1cnJlbnRfZGV2ID0gTlVMTDsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0NfRFJWKTsKLQogCXdoaWxlICgxKSB7CiAJCWN1cnJlbnRfZGV2ID0gTlVMTDsKIApAQCAtMjE5LDkgKzIxMyw2IEBACiAJCXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkNsZWFudXAoJnN0b3J2c2NfZHJ2X29iai0+QmFzZSk7CiAKIAl2bWJ1c19jaGlsZF9kcml2ZXJfdW5yZWdpc3RlcihkcnZfY3R4KTsKLQotCURQUklOVF9FWElUKFNUT1JWU0NfRFJWKTsKLQogCXJldHVybjsKIH0KIApAQCAtMjQzLDggKzIzNCw2IEBACiAJc3RydWN0IGhvc3RfZGV2aWNlX2NvbnRleHQgKmhvc3RfZGV2aWNlX2N0eDsKIAlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKIAotCURQUklOVF9FTlRFUihTVE9SVlNDX0RSVik7Ci0KIAlpZiAoIXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkKIAkJcmV0dXJuIC0xOwogCkBAIC0yNzEsOCArMjYwLDYgQEAKIAogCWlmICghaG9zdF9kZXZpY2VfY3R4LT5yZXF1ZXN0X3Bvb2wpIHsKIAkJc2NzaV9ob3N0X3B1dChob3N0KTsKLQkJRFBSSU5UX0VYSVQoU1RPUlZTQ19EUlYpOwotCiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjg0LDggKzI3MSw2IEBACiAJCURQUklOVF9FUlIoU1RPUlZTQ19EUlYsICJ1bmFibGUgdG8gYWRkIHNjc2kgdnNjIGRldmljZSIpOwogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaG9zdF9kZXZpY2VfY3R4LT5yZXF1ZXN0X3Bvb2wpOwogCQlzY3NpX2hvc3RfcHV0KGhvc3QpOwotCQlEUFJJTlRfRVhJVChTVE9SVlNDX0RSVik7Ci0KIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMzA5LDE1ICsyOTQsMTAgQEAKIAogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaG9zdF9kZXZpY2VfY3R4LT5yZXF1ZXN0X3Bvb2wpOwogCQlzY3NpX2hvc3RfcHV0KGhvc3QpOwotCQlEUFJJTlRfRVhJVChTVE9SVlNDX0RSVik7Ci0KIAkJcmV0dXJuIC0xOwogCX0KIAogCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwotCi0JRFBSSU5UX0VYSVQoU1RPUlZTQ19EUlYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzQwLDEyICszMjAsOCBAQAogCQkJKHN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICopaG9zdC0+aG9zdGRhdGE7CiAKIAotCURQUklOVF9FTlRFUihTVE9SVlNDX0RSVik7Ci0KLQlpZiAoIXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkgewotCQlEUFJJTlRfRVhJVChTVE9SVlNDX0RSVik7CisJaWYgKCFzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpCiAJCXJldHVybiAtMTsKLQl9CiAKIAkvKgogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCkBAIC0zNjgsOSArMzQ0LDYgQEAKIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJyZWxlYXNpbmcgaG9zdCBhZGFwdGVyICglcCkuLi4iLCBob3N0KTsKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwotCi0JRFBSSU5UX0VYSVQoU1RPUlZTQ19EUlYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzkzLDggKzM2Niw2IEBACiAJLyogICAgICAgICh1bnNpZ25lZCBsb25nKWNtZF9yZXF1ZXN0KTsgKi8KIAkvKiBBU1NFUlQoc2NtbmQtPnNjc2lfZG9uZSk7ICovCiAKLQlEUFJJTlRfRU5URVIoU1RPUlZTQ19EUlYpOwotCiAJaWYgKGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50KSB7CiAJCS8qIHVzaW5nIGJvdW5jZSBidWZmZXIgKi8KIAkJLyogcHJpbnRrKCJjb3B5X2Zyb21fYm91bmNlX2J1ZmZlclxuIik7ICovCkBAIC00MjcsOCArMzk4LDYgQEAKIAlzY3NpX2RvbmVfZm4oc2NtbmQpOwogCiAJa21lbV9jYWNoZV9mcmVlKGhvc3RfZGV2aWNlX2N0eC0+cmVxdWVzdF9wb29sLCBjbWRfcmVxdWVzdCk7Ci0KLQlEUFJJTlRfRVhJVChTVE9SVlNDX0RSVik7CiB9CiAKIHN0YXRpYyBpbnQgZG9fYm91bmNlX2J1ZmZlcihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IHNnX2NvdW50KQpAQCAtNjQ3LDggKzYxNiw2IEBACiAJaW50IGk7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2w7CiAKLQlEUFJJTlRfRU5URVIoU1RPUlZTQ19EUlYpOwotCiAJRFBSSU5UX0RCRyhTVE9SVlNDX0RSViwgInNjbW5kICVwIGRpciAlZCwgdXNlX3NnICVkIGJ1ZiAlcCBsZW4gJWQgIgogCQkgICAicXVldWUgZGVwdGggJWQgdGFnZ2VkICVkIiwgc2NtbmQsIHNjbW5kLT5zY19kYXRhX2RpcmVjdGlvbiwKIAkJICAgc2NzaV9zZ19jb3VudChzY21uZCksIHNjc2lfc2dsaXN0KHNjbW5kKSwKQEAgLTgxMiw4ICs3NzksNiBAQAogCQlyZXQgPSBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJfQogCi0JRFBSSU5UX0VYSVQoU1RPUlZTQ19EUlYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODczLDIzICs4MzgsMTcgQEAKIAkJKHN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICopc2NtbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IHZtX2RldmljZSAqZGV2aWNlX2N0eCA9IGhvc3RfZGV2aWNlX2N0eC0+ZGV2aWNlX2N0eDsKIAotCURQUklOVF9FTlRFUihTVE9SVlNDX0RSVik7Ci0KIAlEUFJJTlRfSU5GTyhTVE9SVlNDX0RSViwgInNkZXYgKCVwKSBkZXYgb2JqICglcCkgLSBob3N0IHJlc2V0dGluZy4uLiIsCiAJCSAgICBzY21uZC0+ZGV2aWNlLCAmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaik7CiAKIAkvKiBJbnZva2VzIHRoZSB2c2MgdG8gcmVzZXQgdGhlIGhvc3QvYnVzICovCiAJcmV0ID0gU3RvclZzY09uSG9zdFJlc2V0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJRFBSSU5UX0VYSVQoU1RPUlZTQ19EUlYpOworCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDX0RSViwgInNkZXYgKCVwKSBkZXYgb2JqICglcCkgLSBob3N0IHJlc2V0ZWQiLAogCQkgICAgc2NtbmQtPmRldmljZSwgJmRldmljZV9jdHgtPmRldmljZV9vYmopOwogCi0JRFBSSU5UX0VYSVQoU1RPUlZTQ19EUlYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTc3LDE4ICs5MzYsMTQgQEAKIHsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFNUT1JWU0NfRFJWKTsKIAlEUFJJTlRfSU5GTyhTVE9SVlNDX0RSViwgIlN0b3J2c2MgaW5pdGlhbGl6aW5nLi4uLiIpOwogCXJldCA9IHN0b3J2c2NfZHJ2X2luaXQoU3RvclZzY0luaXRpYWxpemUpOwotCURQUklOVF9FWElUKFNUT1JWU0NfRFJWKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3RvcnZzY19leGl0KHZvaWQpCiB7Ci0JRFBSSU5UX0VOVEVSKFNUT1JWU0NfRFJWKTsKIAlzdG9ydnNjX2Rydl9leGl0KCk7Ci0JRFBSSU5UX0VOVEVSKFNUT1JWU0NfRFJWKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYwppbmRleCAwMDc1NDNiLi5jYTFlMThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYwpAQCAtNTcsOSArNTcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBWbWJ1c0dldENoYW5uZWxPZmZlcnModm9pZCkKIHsKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwogCVZtYnVzQ2hhbm5lbFJlcXVlc3RPZmZlcnMoKTsKLQlEUFJJTlRfRVhJVChWTUJVUyk7CiB9CiAKIC8qCkBAIC0xMjAsOCArMTE4LDYgQEAKIAl1MzIgKmlycXZlY3RvciA9IEFkZGl0aW9uYWxJbmZvOwogCWludCByZXQ7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVMpOwotCiAJZ0RldmljZSA9IGRldjsKIAogCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlVHlwZSwgJmdWbWJ1c0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwpAQCAtMTM2LDggKzEzMiw2IEBACiAJcmV0ID0gVm1idXNDb25uZWN0KCk7CiAKIAkvKiBWbWJ1c1NlbmRFdmVudChkZXZpY2UtPmxvY2FsUG9ydElkKzEpOyAqLwotCURQUklOVF9FWElUKFZNQlVTKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0OCwxMiArMTQyLDkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCURQUklOVF9FTlRFUihWTUJVUyk7CiAJVm1idXNDaGFubmVsUmVsZWFzZVVuYXR0YWNoZWRDaGFubmVscygpOwogCVZtYnVzRGlzY29ubmVjdCgpOwogCW9uX2VhY2hfY3B1KEh2U3luaWNDbGVhbnVwLCBOVUxMLCAxKTsKLQlEUFJJTlRfRVhJVChWTUJVUyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNjQsOSArMTU1LDcgQEAKIHsKIAkvKiBzdHJ1Y3Qgdm1idXNfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWRydjsgKi8KIAotCURQUklOVF9FTlRFUihWTUJVUyk7CiAJSHZDbGVhbnVwKCk7Ci0JRFBSSU5UX0VYSVQoVk1CVVMpOwogfQogCiAvKgpAQCAtMjM5LDggKzIyOCw2IEBACiAJcGFnZV9hZGRyID0gZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlW2NwdV07CiAJbXNnID0gKHN0cnVjdCBodl9tZXNzYWdlICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgbXNncyB0byBiZSBwcm9jZXNzICovCiAJaWYgKG1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlICE9IEh2TWVzc2FnZVR5cGVOb25lKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJyZWNlaXZlZCBtc2cgdHlwZSAlZCBzaXplICVkIiwKQEAgLTI1OSw3ICsyNDYsNiBAQAogCQlyZXQgfD0gMHgyOwogCX0KIAotCURQUklOVF9FWElUKFZNQlVTKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNzEsOCArMjU3LDYgQEAKIAlzdHJ1Y3Qgdm1idXNfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWRydjsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTKTsKLQogCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBIViBEcml2ZXIgdmVyc2lvbiA9ICVzICsrKysrKysiLAogCQkgICAgSFZfRFJWX1ZFUlNJT04pOwogCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBWbWJ1cyBzdXBwb3J0ZWQgdmVyc2lvbiA9ICVkICsrKysrKysiLApAQCAtMzA1LDcgKzI4OSw1IEBACiAJCQkJcmV0KTsKIAlnRHJpdmVyID0gZHJ2OwogCi0JRFBSSU5UX0VYSVQoVk1CVVMpOwotCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYwppbmRleCAyMmM4MGVjLi4wOTJmMDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jCkBAIC0yNTQsOCArMjU0LDYgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCB2ZWN0b3I7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVNfRFJWKTsKLQogCS8qCiAJICogU2V0IHRoaXMgdXAgdG8gYWxsb3cgbG93ZXIgbGF5ZXIgdG8gY2FsbGJhY2sgdG8gYWRkL3JlbW92ZSBjaGlsZAogCSAqIGRldmljZXMgb24gdGhlIGJ1cwpAQCAtMzYwLDggKzM1OCw2IEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmaHZfY2hhbm5lbF9yZWFkeSk7CiAKIGNsZWFudXA6Ci0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3Nyw4ICszNzMsNiBAQAogCiAJc3RydWN0IHZtX2RldmljZSAqZGV2X2N0eCA9ICZnX3ZtYnVzX2Rydi5kZXZpY2VfY3R4OwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7Ci0KIAkvKiBSZW1vdmUgdGhlIHJvb3QgZGV2aWNlICovCiAJaWYgKHZtYnVzX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpCiAJCXZtYnVzX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoJmRldl9jdHgtPmRldmljZV9vYmopOwpAQCAtMzk1LDEwICszODksNiBAQAogCiAJdGFza2xldF9raWxsKCZ2bWJ1c19kcnZfY3R4LT5tc2dfZHBjKTsKIAl0YXNrbGV0X2tpbGwoJnZtYnVzX2Rydl9jdHgtPmV2ZW50X2RwYyk7Ci0KLQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOwotCi0JcmV0dXJuOwogfQogCiAKQEAgLTQxOSw4ICs0MDksNiBAQAogCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2Rydl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7Ci0KIAlEUFJJTlRfSU5GTyhWTUJVU19EUlYsICJjaGlsZCBkcml2ZXIgKCVwKSByZWdpc3RlcmluZyAtIG5hbWUgJXMiLAogCQkgICAgZHJpdmVyX2N0eCwgZHJpdmVyX2N0eC0+ZHJpdmVyLm5hbWUpOwogCkBAIC00MzEsOCArNDE5LDYgQEAKIAogCXZtYnVzX2Rydl9vYmotPkdldENoYW5uZWxPZmZlcnMoKTsKIAotCURQUklOVF9FWElUKFZNQlVTX0RSVik7Ci0KIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh2bWJ1c19jaGlsZF9kcml2ZXJfcmVnaXN0ZXIpOwpAQCAtNDUwLDE2ICs0MzYsMTIgQEAKICAqLwogdm9pZCB2bWJ1c19jaGlsZF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRyaXZlcl9jdHgpCiB7Ci0JRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7Ci0KIAlEUFJJTlRfSU5GTyhWTUJVU19EUlYsICJjaGlsZCBkcml2ZXIgKCVwKSB1bnJlZ2lzdGVyaW5nIC0gbmFtZSAlcyIsCiAJCSAgICBkcml2ZXJfY3R4LCBkcml2ZXJfY3R4LT5kcml2ZXIubmFtZSk7CiAKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX2N0eC0+ZHJpdmVyKTsKIAogCWRyaXZlcl9jdHgtPmRyaXZlci5idXMgPSBOVUxMOwotCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIpOwogCkBAIC01MDYsMTUgKzQ4OCwxMSBAQAogCXN0cnVjdCB2bV9kZXZpY2UgKmNoaWxkX2RldmljZV9jdHg7CiAJc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iajsKIAotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJLyogQWxsb2NhdGUgdGhlIG5ldyBjaGlsZCBkZXZpY2UgKi8KIAljaGlsZF9kZXZpY2VfY3R4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZtX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghY2hpbGRfZGV2aWNlX2N0eCkgewogCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwKIAkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlX2NvbnRleHQgZm9yIGNoaWxkIGRldmljZSIpOwotCQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOwotCiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtNTQ2LDggKzUyNCw2IEBACiAJbWVtY3B5KCZjaGlsZF9kZXZpY2VfY3R4LT5jbGFzc19pZCwgdHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAJbWVtY3B5KCZjaGlsZF9kZXZpY2VfY3R4LT5kZXZpY2VfaWQsIGluc3RhbmNlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAotCURQUklOVF9FWElUKFZNQlVTX0RSVik7Ci0KIAlyZXR1cm4gY2hpbGRfZGV2aWNlX29iajsKIH0KIApAQCAtNTY0LDggKzU0MCw2IEBACiAJCQkJdG9fdm1fZGV2aWNlKGNoaWxkX2RldmljZV9vYmopOwogCXN0YXRpYyBhdG9taWNfdCBkZXZpY2VfbnVtID0gQVRPTUlDX0lOSVQoMCk7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVNfRFJWKTsKLQogCURQUklOVF9EQkcoVk1CVVNfRFJWLCAiY2hpbGQgZGV2aWNlICglcCkgcmVnaXN0ZXJpbmciLAogCQkgICBjaGlsZF9kZXZpY2VfY3R4KTsKIApAQCAtNTk0LDggKzU2OCw2IEBACiAJCURQUklOVF9JTkZPKFZNQlVTX0RSViwgImNoaWxkIGRldmljZSAoJXApIHJlZ2lzdGVyZWQiLAogCQkJICAgICZjaGlsZF9kZXZpY2VfY3R4LT5kZXZpY2UpOwogCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYwNyw4ICs1NzksNiBAQAogewogCXN0cnVjdCB2bV9kZXZpY2UgKmRldmljZV9jdHggPSB0b192bV9kZXZpY2UoZGV2aWNlX29iaik7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVNfRFJWKTsKLQogCURQUklOVF9JTkZPKFZNQlVTX0RSViwgInVucmVnaXN0ZXJpbmcgY2hpbGQgZGV2aWNlICglcCkiLAogCQkgICAgJmRldmljZV9jdHgtPmRldmljZSk7CiAKQEAgLTYyMCw4ICs1OTAsNiBAQAogCiAJRFBSSU5UX0lORk8oVk1CVVNfRFJWLCAiY2hpbGQgZGV2aWNlICglcCkgdW5yZWdpc3RlcmVkIiwKIAkJICAgICZkZXZpY2VfY3R4LT5kZXZpY2UpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKIH0KIAogLyoKQEAgLTYyOSw5ICs1OTcsNiBAQAogICovCiBzdGF0aWMgdm9pZCB2bWJ1c19jaGlsZF9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKQogewotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKIH0KIAogLyoKQEAgLTY0Niw4ICs2MTEsNiBAQAogCXN0cnVjdCB2bV9kZXZpY2UgKmRldmljZV9jdHggPSBkZXZpY2VfdG9fdm1fZGV2aWNlKGRldmljZSk7CiAJaW50IHJldDsKIAotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJRFBSSU5UX0lORk8oVk1CVVNfRFJWLCAiZ2VuZXJhdGluZyB1ZXZlbnQgLSBWTUJVU19ERVZJQ0VfQ0xBU1NfR1VJRD17IgogCQkgICAgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgogCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSIsCkBAIC03MDgsOCArNjcxLDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQogCXJldHVybiAwOwogfQogCkBAIC03MjIsOCArNjgzLDYgQEAKIAlzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRyaXZlcl9jdHggPSBkcml2ZXJfdG9fZHJpdmVyX2NvbnRleHQoZHJpdmVyKTsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0gZGV2aWNlX3RvX3ZtX2RldmljZShkZXZpY2UpOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7Ci0KIAkvKiBXZSBmb3VuZCBvdXIgZHJpdmVyID8gKi8KIAlpZiAobWVtY21wKCZkZXZpY2VfY3R4LT5jbGFzc19pZCwgJmRyaXZlcl9jdHgtPmNsYXNzX2lkLAogCQkgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSA9PSAwKSB7CkBAIC03NDIsOSArNzAxLDYgQEAKIAogCQltYXRjaCA9IDE7CiAJfQotCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQogCXJldHVybiBtYXRjaDsKIH0KIApAQCAtNzU5LDggKzcxNSw2IEBACiB7CiAJc3RydWN0IHZtX2RldmljZSAqZGV2aWNlX2N0eCA9IChzdHJ1Y3Qgdm1fZGV2aWNlICopY29udGV4dDsKIAotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJLyoKIAkgKiBLaWNrIG9mZiB0aGUgcHJvY2VzcyBvZiB1bnJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UuCiAJICogVGhpcyB3aWxsIGNhbGwgdm1idXNfcmVtb3ZlKCkgYW5kIGV2ZW50dWFsbHkgdm1idXNfZGV2aWNlX3JlbGVhc2UoKQpAQCAtNzY4LDcgKzcyMiw2IEBACiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldmljZV9jdHgtPmRldmljZSk7CiAKIAkvKiBwdXRfZGV2aWNlKCZkZXZpY2VfY3R4LT5kZXZpY2UpOyAqLwotCURQUklOVF9FWElUKFZNQlVTX0RSVik7CiB9CiAKIC8qCkBAIC03ODIsOCArNzM1LDYgQEAKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0KIAkJCWRldmljZV90b192bV9kZXZpY2UoY2hpbGRfZGV2aWNlKTsKIAotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJLyogTGV0IHRoZSBzcGVjaWZpYyBvcGVuLXNvdXJjZSBkcml2ZXIgaGFuZGxlcyB0aGUgcHJvYmUgaWYgaXQgY2FuICovCiAJaWYgKGRyaXZlcl9jdHgtPnByb2JlKSB7CiAJCXJldCA9IGRldmljZV9jdHgtPnByb2JlX2Vycm9yID0gZHJpdmVyX2N0eC0+cHJvYmUoY2hpbGRfZGV2aWNlKTsKQEAgLTgwMiw4ICs3NTMsNiBAQAogCQkJICAgY2hpbGRfZGV2aWNlLT5kcml2ZXItPm5hbWUpOwogCQlyZXQgPSAtMTsKIAl9Ci0KLQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTgxNSwxNSArNzY0LDEyIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRyaXZlcl9jdHg7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVNfRFJWKTsKLQogCS8qIFNwZWNpYWwgY2FzZSByb290IGJ1cyBkZXZpY2UgKi8KIAlpZiAoY2hpbGRfZGV2aWNlLT5wYXJlbnQgPT0gTlVMTCkgewogCQkvKgogCQkgKiBOby1vcCBzaW5jZSBpdCBpcyBzdGF0aWNhbGx5IGRlZmluZWQgYW5kIGhhbmRsZSBpbgogCQkgKiB2bWJ1c19idXNfZXhpdCgpCiAJCSAqLwotCQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTg0NCw4ICs3OTAsNiBAQAogCQl9CiAJfQogCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQogCXJldHVybiAwOwogfQogCkBAIC04NTYsMjMgKzgwMCwxOCBAQAogewogCXN0cnVjdCBkcml2ZXJfY29udGV4dCAqZHJpdmVyX2N0eDsKIAotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJLyogU3BlY2lhbCBjYXNlIHJvb3QgYnVzIGRldmljZSAqLwogCWlmIChjaGlsZF9kZXZpY2UtPnBhcmVudCA9PSBOVUxMKSB7CiAJCS8qCiAJCSAqIE5vLW9wIHNpbmNlIGl0IGlzIHN0YXRpY2FsbHkgZGVmaW5lZCBhbmQgaGFuZGxlIGluCiAJCSAqIHZtYnVzX2J1c19leGl0KCkKIAkJICovCi0JCURQUklOVF9FWElUKFZNQlVTX0RSVik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBUaGUgZGV2aWNlIG1heSBub3QgYmUgYXR0YWNoZWQgeWV0ICovCi0JaWYgKCFjaGlsZF9kZXZpY2UtPmRyaXZlcikgewotCQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOworCWlmICghY2hpbGRfZGV2aWNlLT5kcml2ZXIpCiAJCXJldHVybjsKLQl9CiAKIAlkcml2ZXJfY3R4ID0gZHJpdmVyX3RvX2RyaXZlcl9jb250ZXh0KGNoaWxkX2RldmljZS0+ZHJpdmVyKTsKIApAQCAtODgwLDggKzgxOSw2IEBACiAJaWYgKGRyaXZlcl9jdHgtPnNodXRkb3duKQogCQlkcml2ZXJfY3R4LT5zaHV0ZG93bihjaGlsZF9kZXZpY2UpOwogCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQogCXJldHVybjsKIH0KIApAQCAtODkwLDEzICs4MjcsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgdm1idXNfYnVzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwogCS8qIEZJWE1FICovCiAJLyogRW1wdHkgcmVsZWFzZSBmdW5jdGlvbnMgYXJlIGEgYnVnLCBvciBhIG1ham9yIHNpZ24KIAkgKiBvZiBhIHByb2JsZW0gZGVzaWduLCB0aGlzIE1VU1QgQkUgRklYRUQhICovCiAJZGV2X2VycihkZXZpY2UsICIlcyBuZWVkcyB0byBiZSBmaXhlZCFcbiIsIF9fZnVuY19fKTsKIAlXQVJOX09OKDEpOwotCURQUklOVF9FWElUKFZNQlVTX0RSVik7CiB9CiAKIC8qCkBAIC05MDYsMTUgKzg0MSwxMCBAQAogewogCXN0cnVjdCB2bV9kZXZpY2UgKmRldmljZV9jdHggPSBkZXZpY2VfdG9fdm1fZGV2aWNlKGRldmljZSk7CiAKLQlEUFJJTlRfRU5URVIoVk1CVVNfRFJWKTsKLQogCS8qIHZtYnVzX2NoaWxkX2RldmljZV9kZXN0cm95KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsgKi8KIAlrZnJlZShkZXZpY2VfY3R4KTsKIAogCS8qICEhRE8gTk9UIFJFRkVSRU5DRSBkZXZpY2VfY3R4IGFueW1vcmUgYXQgdGhpcyBwb2ludCEhICovCi0JRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTkyNCwxNCArODU0LDEwIEBACiB7CiAJc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZGF0YTsKIAotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJLyogQVNTRVJUKHZtYnVzX2Rydl9vYmotPk9uTXNnRHBjICE9IE5VTEwpOyAqLwogCiAJLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGhhbmRsZSBpbnRlcnJ1cHQgKi8KIAl2bWJ1c19kcnZfb2JqLT5Pbk1zZ0RwYygmdm1idXNfZHJ2X29iai0+QmFzZSk7Ci0KLQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOwogfQogCiAvKgpAQCAtOTQxLDE0ICs4NjcsMTAgQEAKIHsKIAlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c19kcnZfb2JqID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilkYXRhOwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7Ci0KIAkvKiBBU1NFUlQodm1idXNfZHJ2X29iai0+T25FdmVudERwYyAhPSBOVUxMKTsgKi8KIAogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBoYW5kbGUgaW50ZXJydXB0ICovCiAJdm1idXNfZHJ2X29iai0+T25FdmVudERwYygmdm1idXNfZHJ2X29iai0+QmFzZSk7Ci0KLQlEUFJJTlRfRVhJVChWTUJVU19EUlYpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgdm1idXNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTk1Niw4ICs4NzgsNiBAQAogCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2RyaXZlcl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlpbnQgcmV0OwogCi0JRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7Ci0KIAkvKiBBU1NFUlQodm1idXNfZHJpdmVyX29iai0+T25Jc3IgIT0gTlVMTCk7ICovCiAKIAkvKiBDYWxsIHRvIGJ1cyBkcml2ZXIgdG8gaGFuZGxlIGludGVycnVwdCAqLwpAQCAtOTcxLDEwICs4OTEsOCBAQAogCQlpZiAodGVzdF9iaXQoMSwgKHVuc2lnbmVkIGxvbmcgKikmcmV0KSkKIAkJCXRhc2tsZXRfc2NoZWR1bGUoJmdfdm1idXNfZHJ2LmV2ZW50X2RwYyk7CiAKLQkJRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0gZWxzZSB7Ci0JCURQUklOVF9FWElUKFZNQlVTX0RSVik7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiB9CkBAIC05OTQsMTAgKzkxMiw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHZtYnVzX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gMDsKLQotCURQUklOVF9FTlRFUihWTUJVU19EUlYpOwotCiAJRFBSSU5UX0lORk8oVk1CVVNfRFJWLAogCQkiVm1idXMgaW5pdGlhbGl6aW5nLi4uLiBjdXJyZW50IGxvZyBsZXZlbCAweCV4ICgleCwleCkiLAogCQl2bWJ1c19sb2dsZXZlbCwgSElXT1JEKHZtYnVzX2xvZ2xldmVsKSwgTE9XT1JEKHZtYnVzX2xvZ2xldmVsKSk7CkBAIC0xMDA2LDIwICs5MjAsMTMgQEAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0obWljcm9zb2Z0X2h2X2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0ID0gdm1idXNfYnVzX2luaXQoVm1idXNJbml0aWFsaXplKTsKLQotCURQUklOVF9FWElUKFZNQlVTX0RSVik7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdm1idXNfYnVzX2luaXQoVm1idXNJbml0aWFsaXplKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHZtYnVzX2V4aXQodm9pZCkKIHsKLQlEUFJJTlRfRU5URVIoVk1CVVNfRFJWKTsKLQogCXZtYnVzX2J1c19leGl0KCk7CiAJLyogVG9kbzogaXQgaXMgdXNlZCBmb3IgbG9nbGV2ZWwsIHRvIGJlIHBvcnRlZCB0byBuZXcga2VybmVsLiAqLwotCURQUklOVF9FWElUKFZNQlVTX0RSVik7Ci0JcmV0dXJuOwogfQogCiAvKgpAQCAtMTAyOCw3ICs5MzUsNyBAQAogICogaW5zdGFsbGVkIGFuZC9vciBjb25maWd1cmVkLiAgV2UgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZSB3aXRoIHRoZSB0YWJsZSwgYnV0CiAgKiBpdCBuZWVkcyB0byBiZSBwcmVzZW50LgogICovCi1jb25zdCBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWljcm9zb2Z0X2h2X3BjaV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1pY3Jvc29mdF9odl9wY2lfdGFibGVbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoMHgxNDE0LCAweDUzNTMpIH0sCS8qIFZHQSBjb21wYXRpYmxlIGNvbnRyb2xsZXIgKi8KIAl7IDAgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vb3ZlcnZpZXcudHh0CmluZGV4IGUzOWRmYzEuLmNjNmVjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dApAQCAtNDQsNyArNDQsNyBAQAogYXBwbGljYXRpb25zIGl0IGl0IHVzZWZ1bCB0byBiZSBhYmxlIHRvIGNhcHR1cmUgZGF0YSBiYXNlZCBvbiBzb21lCiBleHRlcm5hbCBzaWduYWwgKHRyaWdnZXIpLiAgVGhlc2UgdHJpZ2dlcnMgbWlnaHQgYmUgYSBkYXRhIHJlYWR5CiBzaWduYWwsIGEgZ3BpbyBsaW5lIGNvbm5lY3RlZCB0byBzb21lIGV4dGVybmFsIHN5c3RlbSBvciBhbiBvbgotcHJvY2Vzc29yIHBlcmlvZGljIGludGVycnVwdC4gIEEgc2luZ2xlIHRyaWdnZXIgbWFueSBpbml0aWFsaXplIGRhdGEKK3Byb2Nlc3NvciBwZXJpb2RpYyBpbnRlcnJ1cHQuICBBIHNpbmdsZSB0cmlnZ2VyIG1heSBpbml0aWFsaXplIGRhdGEKIGNhcHR1cmUgb3IgcmVhZGluZyBmcm9tIGEgbnVtYmVyIG9mIHNlbnNvcnMuICBUaGVzZSB0cmlnZ2VycyBhcmUKIHVzZWQgaW4gaWlvIHRvIGZpbGwgc29mdHdhcmUgcmluZyBidWZmZXJzIGFjdGluZyBpbiBhIHZlcnkgc2ltaWxhcgogZmFzaGlvbiB0byB0aGUgaGFyZHdhcmUgYnVmZmVycyBkZXNjcmliZWQgYWJvdmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKaW5kZXggYjBlNjI0NC4uZWQ0ODgxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwpAQCAtMjEsNiArMjEsNyBAQAogaWYgSUlPX1JJTkdfQlVGRkVSCiAKIGNvbmZpZyBJSU9fU1dfUklORworICAgICAgIHNlbGVjdCBJSU9fVFJJR0dFUgogCXRyaXN0YXRlICJJbmR1c3RyaWFsIEkvTyBsb2NrIGZyZWUgc29mdHdhcmUgcmluZyIKIAloZWxwCiAJICBFeGFtcGxlIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlc2lnbiBhaW0KQEAgLTQ0LDYgKzQ1LDcgQEAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vaW11L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vTWFrZWZpbGUKaW5kZXggMzUwMmIzOS4uZTkwOTY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL01ha2VmaWxlCkBAIC0xNCw1ICsxNCw1IEBACiBvYmoteSArPSBneXJvLwogb2JqLXkgKz0gaW11Lwogb2JqLXkgKz0gbGlnaHQvCi0KLW9iai15ICs9IHRyaWdnZXIvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorb2JqLXkgKz0gdHJpZ2dlci8KK29iai15ICs9IG1hZ25ldG9tZXRlci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vVE9ETwppbmRleCAxNWRhMGMyLi44OThjYmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9UT0RPCkBAIC02Niw0ICs2Niw0IEBACiAyKSBTb21lIGRldmljZSByZXF1aXJlIGluZHZpZHVhbCBkb2NzLgogCiBDb250YWN0OiBKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BjYW0uYWMudWs+LgotTWFpbGluZyBsaXN0OiBMS01MLgorTWFpbGluZyBsaXN0OiBsaW51eC1paW9Admdlci5rZXJuZWwub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKaW5kZXggYjRlNTdkMS4uNTkyNmMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZwpAQCAtNCwyOSArNCwyOSBAQAogY29tbWVudCAiQWNjZWxlcm9tZXRlcnMiCiAKIGNvbmZpZyBBRElTMTYyMDkKLSAgICAgICB0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjA5IER1YWwtQXhpcyBEaWdpdGFsIEluY2xpbm9tZXRlciBhbmQgQWNjZWxlcm9tZXRlciIKLSAgICAgICBkZXBlbmRzIG9uIFNQSQotICAgICAgIHNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKLSAgICAgICBzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCi0gICAgICAgaGVscAotICAgICAgICAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjIwOSBkdWFsLWF4aXMgZGlnaXRhbCBpbmNsaW5vbWV0ZXIKLQkgYW5kIGFjY2VsZXJvbWV0ZXIuCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwOSBEdWFsLUF4aXMgRGlnaXRhbCBJbmNsaW5vbWV0ZXIgYW5kIEFjY2VsZXJvbWV0ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyMDkgZHVhbC1heGlzIGRpZ2l0YWwgaW5jbGlub21ldGVyCisJICBhbmQgYWNjZWxlcm9tZXRlci4KIAogY29uZmlnIEFESVMxNjIyMAotICAgICAgIHRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMjAgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgVmlicmF0aW9uIFNlbnNvciBkcml2ZXIiCi0gICAgICAgZGVwZW5kcyBvbiBTUEkKLSAgICAgICBoZWxwCi0gICAgICAgICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjIwIHByb2dyYW1tYWJsZQotICAgICAgICAgZGlnaXRhbCB2aWJyYXRpb24gc2Vuc29yLgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMjAgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgVmlicmF0aW9uIFNlbnNvciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyMjAgcHJvZ3JhbW1hYmxlCisJICBkaWdpdGFsIHZpYnJhdGlvbiBzZW5zb3IuCiAKIGNvbmZpZyBBRElTMTYyNDAKLSAgICAgICB0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjQwIFByb2dyYW1tYWJsZSBJbXBhY3QgU2Vuc29yIGFuZCBSZWNvcmRlciIKLSAgICAgICBkZXBlbmRzIG9uIFNQSQotICAgICAgIHNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKLSAgICAgICBzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCi0gICAgICAgaGVscAotICAgICAgICAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjI0MCBwcm9ncmFtbWFibGUKLQkgaW1wYWN0IFNlbnNvciBhbmQgcmVjb3JkZXIuCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI0MCBQcm9ncmFtbWFibGUgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyNDAgcHJvZ3JhbW1hYmxlCisJICBpbXBhY3QgU2Vuc29yIGFuZCByZWNvcmRlci4KIAogY29uZmlnIEtYU0Q5CiAJdHJpc3RhdGUgIktpb25peCBLWFNEOSBBY2NlbGVyb21ldGVyIERyaXZlciIKQEAgLTQ2LDkgKzQ2LDkgQEAKIAkgIGFuZCBhbiBldmVudCBpbnRlcmZhY2UgdmlhIGEgY2hhcmFjdGVyIGRldmljZS4KIAogY29uZmlnIFNDQTMwMDAKLSAgICAgICBkZXBlbmRzIG9uIElJT19SSU5HX0JVRkZFUgotICAgICAgIGRlcGVuZHMgb24gU1BJCi0gICAgICAgdHJpc3RhdGUgIlZUSSBTQ0EzMDAwIHNlcmllcyBhY2NlbGVyb21ldGVycyIKLSAgICAgICBoZWxwCi0gICAgICAgICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFZUSSBTQ0EzMDAwIHNlcmllcyBvZiBTUEkKLQkgYWNjZWxlcm9tZXRlcnMuIFRoZXNlIGRldmljZXMgdXNlIGEgaGFyZHdhcmUgcmluZyBidWZmZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCWRlcGVuZHMgb24gSUlPX1JJTkdfQlVGRkVSCisJZGVwZW5kcyBvbiBTUEkKKwl0cmlzdGF0ZSAiVlRJIFNDQTMwMDAgc2VyaWVzIGFjY2VsZXJvbWV0ZXJzIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVlRJIFNDQTMwMDAgc2VyaWVzIG9mIFNQSQorCSAgYWNjZWxlcm9tZXRlcnMuIFRoZXNlIGRldmljZXMgdXNlIGEgaGFyZHdhcmUgcmluZyBidWZmZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9NYWtlZmlsZQppbmRleCBjMzRiMTM2Li5mZjg0NzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiAjCiAjIE1ha2VmaWxlIGZvciBpbmR1c3RyaWFsIEkvTyBhY2NlbGVyb21ldGVyIGRyaXZlcnMKICMKKwogYWRpczE2MjA5LXkgICAgICAgICAgICAgOj0gYWRpczE2MjA5X2NvcmUubwogYWRpczE2MjA5LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjA5X3JpbmcubyBhZGlzMTYyMDlfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2MjA5KSArPSBhZGlzMTYyMDkubwpAQCAtMTksNCArMjAsNCBAQAogb2JqLSQoQ09ORklHX0xJUzNMMDJEUSkJKz0gbGlzM2wwMmRxLm8KIAogc2NhMzAwMC15CQk6PSBzY2EzMDAwX2NvcmUubyBzY2EzMDAwX3Jpbmcubwotb2JqLSQoQ09ORklHX1NDQTMwMDApCSs9IHNjYTMwMDAubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai0kKENPTkZJR19TQ0EzMDAwKQkrPSBzY2EzMDAwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCmluZGV4IDg3N2ZkMmEuLjRlOTc1OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaApAQCAtMTA1LDggKzEwNSw2IEBACiAgKiBzdHJ1Y3QgYWRpczE2MjA5X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKICAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQogICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCi0gKiBAd29ya19jb250X3RocmVzaDogQ0xFQU4KLSAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKICAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKICAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KQEAgLTExNyw3ICsxMTUsNiBAQAogc3RydWN0IGFkaXMxNjIwOV9zdGF0ZSB7CiAJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOwotCXN0cnVjdCBpaW9fd29ya19jb250CQl3b3JrX2NvbnRfdGhyZXNoOwogCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKIAlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CiAJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKQEAgLTEyOSwxNiArMTI2LDE1IEBACiBpbnQgYWRpczE2MjA5X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CiAKICNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCi1lbnVtIGFkaXMxNjIwOV9zY2FuIHsKLQlBRElTMTYyMDlfU0NBTl9TVVBQTFksCi0JQURJUzE2MjA5X1NDQU5fQUNDX1gsCi0JQURJUzE2MjA5X1NDQU5fQUNDX1ksCi0JQURJUzE2MjA5X1NDQU5fQVVYX0FEQywKLQlBRElTMTYyMDlfU0NBTl9URU1QLAotCUFESVMxNjIwOV9TQ0FOX0lOQ0xJX1gsCi0JQURJUzE2MjA5X1NDQU5fSU5DTElfWSwKLQlBRElTMTYyMDlfU0NBTl9ST1QsCi19OworCisjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX1NVUFBMWQkwCisjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX0FDQ19YCTEKKyNkZWZpbmUgQURJUzE2MjA5X1NDQU5fQUNDX1kJMgorI2RlZmluZSBBRElTMTYyMDlfU0NBTl9BVVhfQURDCTMKKyNkZWZpbmUgQURJUzE2MjA5X1NDQU5fVEVNUAk0CisjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX0lOQ0xJX1gJNQorI2RlZmluZSBBRElTMTYyMDlfU0NBTl9JTkNMSV9ZCTYKKyNkZWZpbmUgQURJUzE2MjA5X1NDQU5fUk9UCTcKIAogdm9pZCBhZGlzMTYyMDlfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjA5X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CkBAIC0xNTAsOCArMTQ2LDYgQEAKIGludCBhZGlzMTYyMDlfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkaXMxNjIwOV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCi1pbnQgYWRpczE2MjA5X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKLXZvaWQgYWRpczE2MjA5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwogI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjA5X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCkBAIC0xODAsMTQgKzE3NCw1IEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwOV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwOV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotfQotCiAjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLwogI2VuZGlmIC8qIFNQSV9BRElTMTYyMDlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X2NvcmUuYwppbmRleCBhYzM3NWM1Li42YzY5MjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfY29yZS5jCkBAIC0xNCwxMiArMTQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgogI2luY2x1ZGUgImFjY2VsLmgiCiAjaW5jbHVkZSAiaW5jbGlub21ldGVyLmgiCiAjaW5jbHVkZSAiLi4vZ3lyby9neXJvLmgiCkBAIC03NiwxMSArNzcsMTMgQEAKIAkJCS5iaXRzX3Blcl93b3JkID0gOCwKIAkJCS5sZW4gPSAyLAogCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAzMCwKIAkJfSwgewogCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAorCQkJLmRlbGF5X3VzZWNzID0gMzAsCiAJCX0sCiAJfTsKIApAQCAtMTIwLDEzICsxMjMsMTMgQEAKIAkJCS5iaXRzX3Blcl93b3JkID0gOCwKIAkJCS5sZW4gPSAyLAogCQkJLmNzX2NoYW5nZSA9IDEsCi0JCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJCS5kZWxheV91c2VjcyA9IDMwLAogCQl9LCB7CiAJCQkucnhfYnVmID0gc3QtPnJ4LAogCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAogCQkJLmxlbiA9IDIsCiAJCQkuY3NfY2hhbmdlID0gMSwKLQkJCS5kZWxheV91c2VjcyA9IDIwLAorCQkJLmRlbGF5X3VzZWNzID0gMzAsCiAJCX0sCiAJfTsKIApAQCAtNTE4LDcgKzUyMSw3IEBACiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKIAlyZWdkb25lID0gMTsKIAotCXJldCA9IGFkaXMxNjIwOV9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYtPnJpbmcsIDApOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKQEAgLTU1MCw3ICs1NTMsNyBAQAogCWlmIChzcGktPmlycSkKIAkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CiBlcnJvcl91bmluaXRpYWxpemVfcmluZzoKLQlhZGlzMTYyMDlfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZyk7CiBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgogCWFkaXMxNjIwOV91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOwogZXJyb3JfZnJlZV9kZXY6CkBAIC01NzksNyArNTgyLDcgQEAKIAlpZiAoc3BpLT5pcnEpCiAJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CiAKLQlhZGlzMTYyMDlfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWFkaXMxNjIwOV91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CiAJa2ZyZWUoc3QtPnR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYwppbmRleCA1MzNlMjg1Li4yNWZkZTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKQEAgLTE2LDE2ICsxNyw2IEBACiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgogI2luY2x1ZGUgImFkaXMxNjIwOS5oIgogCi0vKioKLSAqIGNvbWJpbmVfOF90b18xNigpIHV0aWxpdHkgZnVuY3Rpb24gdG8gbXVuZ2UgdG8gdThzIGludG8gdTE2Ci0gKiovCi1zdGF0aWMgaW5saW5lIHUxNiBjb21iaW5lXzhfdG9fMTYodTggbG93ZXIsIHU4IHVwcGVyKQotewotCXUxNiBfbG93ZXIgPSBsb3dlcjsKLQl1MTYgX3VwcGVyID0gdXBwZXI7Ci0JcmV0dXJuIF9sb3dlciB8IChfdXBwZXIgPDwgOCk7Ci19Ci0KIHN0YXRpYyBJSU9fU0NBTl9FTF9DKHN1cHBseSwgQURJUzE2MjA5X1NDQU5fU1VQUExZLCBJSU9fVU5TSUdORUQoMTQpLAogCQkgICAgIEFESVMxNjIwOV9TVVBQTFlfT1VULCBOVUxMKTsKIHN0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3gsIEFESVMxNjIwOV9TQ0FOX0FDQ19YLCBJSU9fU0lHTkVEKDE0KSwKQEAgLTY3LDEwICs1OCwxMCBAQAogICogYWRpczE2MjA5X3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCiAgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CiAgKiovCi1zdGF0aWMgdm9pZCBhZGlzMTYyMDlfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCitzdGF0aWMgdm9pZCBhZGlzMTYyMDlfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQogewogCXN0cnVjdCBhZGlzMTYyMDlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOwotCXN0LT5sYXN0X3RpbWVzdGFtcCA9IGluZGlvX2Rldi0+dHJpZy0+dGltZXN0YW1wOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWU7CiAJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKIH0KIApAQCAtMTM4LDEwICsxMjksOSBAQAogCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQpCiAJCWlmIChhZGlzMTYyMDlfcmVhZF9yaW5nX2RhdGEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQotCQkJZm9yICg7IGkgPCBzdC0+aW5kaW9fZGV2LT5zY2FuX2NvdW50OyBpKyspIHsKLQkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzE2KHN0LT5yeFtpKjIrMV0sCi0JCQkJCQkJICBzdC0+cnhbaSoyXSk7Ci0JCQl9CisJCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOwogCiAJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKQpAQCAtMTU3LDUwICsxNDcsNiBAQAogCXJldHVybjsKIH0KIAotLyogaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcyBpcyBpdCBiZXR0ZXIgdG8gZ28gd2l0aCB1bmFsaWduZWQgcGFja2luZyBhbmQKLSAqIGRlYWwgd2l0aCB0aGUgY29zdD8qLwotc3RhdGljIGludCBhZGlzMTYyMDlfZGF0YV9yZHlfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlzaXplX3Qgc2l6ZTsKLQlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2FuIGVsZW1lbnRzIGVuYWJsZWQsIGlmIG5vdCBmYWlsKi8KLQlpZiAoIShpbmRpb19kZXYtPnNjYW5fY291bnQgfHwgaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9icGQpIHsKLQkJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCi0JCQlpZiAoaW5kaW9fZGV2LT5zY2FuX2NvdW50KQotCQkJCS8qIFRpbWVzdGFtcCAoYWxpZ25lZCB0byBzNjQpIGFuZCBkYXRhICovCi0JCQkJc2l6ZSA9ICgoKGluZGlvX2Rldi0+c2Nhbl9jb3VudCAqIHNpemVvZihzMTYpKQotCQkJCQkgKyBzaXplb2YoczY0KSAtIDEpCi0JCQkJCSYgfihzaXplb2YoczY0KSAtIDEpKQotCQkJCQkrIHNpemVvZihzNjQpOwotCQkJZWxzZSAvKiBUaW1lc3RhbXAgb25seSAgKi8KLQkJCQlzaXplID0gc2l6ZW9mKHM2NCk7Ci0JCWVsc2UgLyogRGF0YSBvbmx5ICovCi0JCQlzaXplID0gaW5kaW9fZGV2LT5zY2FuX2NvdW50KnNpemVvZihzMTYpOwotCQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnBkKGluZGlvX2Rldi0+cmluZywgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2MjA5X2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpCi0JCTogMDsKLX0KLQotc3RhdGljIGludCBhZGlzMTYyMDlfZGF0YV9yZHlfcmluZ19wcmVkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCi17Ci0JcmV0dXJuIGluZGlvX2Rldi0+dHJpZwotCQk/IGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJCWluZGlvX2Rldi0+cG9sbGZ1bmMpCi0JCTogMDsKLX0KLQogdm9pZCBhZGlzMTYyMDlfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwpAQCAtMjM1LDE4ICsxODEsMTYgQEAKIAlpbmRpb19kZXYtPnJpbmcgPSByaW5nOwogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKLQlyaW5nLT5wcmVlbmFibGUgPSAmYWRpczE2MjA5X2RhdGFfcmR5X3JpbmdfcHJlZW5hYmxlOwotCXJpbmctPnBvc3RlbmFibGUgPSAmYWRpczE2MjA5X2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZTsKLQlyaW5nLT5wcmVkaXNhYmxlID0gJmFkaXMxNjIwOV9kYXRhX3JkeV9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+YnBlID0gMjsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKIAlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCppbmRpb19kZXYtPnBvbGxmdW5jKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGluZGlvX2Rldi0+cG9sbGZ1bmMgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOzsKLQl9Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cG9sbF9mdW5jX21haW4gPSAmYWRpczE2MjA5X3BvbGxfZnVuY190aDsKLQlpbmRpb19kZXYtPnBvbGxmdW5jLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7CisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjIwOV9wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKIAlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCkBAIC0yNTQsMTMgKzE5OCwzIEBACiAJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKIAlyZXR1cm4gcmV0OwogfQotCi1pbnQgYWRpczE2MjA5X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXJldHVybiBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIocmluZywgMCk7Ci19Ci0KLXZvaWQgYWRpczE2MjA5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIocmluZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV90cmlnZ2VyLmMKaW5kZXggNGEwNTA3Yy4uMTQ4N2VmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3RyaWdnZXIuYwpAQCAtMjMsOCArMjMsNyBAQAogCXN0cnVjdCBhZGlzMTYyMDlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CiAKLQl0cmlnLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0JaWlvX3RyaWdnZXJfcG9sbCh0cmlnKTsKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC04MywxNCArODIsMTMgQEAKIAlzdHJ1Y3QgYWRpczE2MjA5X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CiAKIAlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7Ci0Jc3QtPnRyaWctPm5hbWUgPSBrbWFsbG9jKElJT19UUklHR0VSX05BTUVfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlzdC0+dHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCSAgICJhZGlzMTYyMDktZGV2JWQiLAorCQkJCSAgIGluZGlvX2Rldi0+aWQpOwogCWlmICghc3QtPnRyaWctPm5hbWUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9mcmVlX3RyaWc7CiAJfQotCXNucHJpbnRmKChjaGFyICopc3QtPnRyaWctPm5hbWUsCi0JCSBJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwKLQkJICJhZGlzMTYyMDktZGV2JWQiLCBpbmRpb19kZXYtPmlkKTsKIAlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKIAlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjAuaAppbmRleCAyYWJmNDg1Li43MDEzMzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwLmgKQEAgLTEyNyw3ICsxMjcsNiBAQAogICogc3RydWN0IGFkaXMxNjIyMF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCiAgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKICAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZwotICogQHdvcmtfY29udF90aHJlc2g6IENMRUFOCiAgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCiAgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKICAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMF9jb3JlLmMKaW5kZXggNmRlNDM5Zi4uYmI3ZDc2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtNzIsMTMgKzcyLDEzIEBACiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwgewogCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwogCkBAIC0xMTgsMTMgKzExOCwxMyBAQAogCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAogCQkJLmxlbiA9IDIsCiAJCQkuY3NfY2hhbmdlID0gMSwKLQkJCS5kZWxheV91c2VjcyA9IDI1LAorCQkJLmRlbGF5X3VzZWNzID0gMzUsCiAJCX0sIHsKIAkJCS5yeF9idWYgPSBzdC0+cngsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwogCkBAIC0yOTEsOSArMjkxLDkgQEAKIAlpZiAoc3RhdHVzICYgQURJUzE2MjIwX0RJQUdfU1RBVF9GTEFTSF9VUFQpCiAJCWRldl9lcnIoZGV2LCAiRmxhc2ggdXBkYXRlIGZhaWxlZFxuIik7CiAJaWYgKHN0YXR1cyAmIEFESVMxNjIyMF9ESUFHX1NUQVRfUE9XRVJfSElHSCkKLQkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYWJvdmUgNS4yNVZcbiIpOworCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNVZcbiIpOwogCWlmIChzdGF0dXMgJiBBRElTMTYyMjBfRElBR19TVEFUX1BPV0VSX0xPVykKLQkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYmVsb3cgNC43NVZcbiIpOworCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAzLjE1VlxuIik7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwpAQCAtNDE0LDcgKzQxNCw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfYWNjZWxfYmluX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfYWNjZWxfYmluX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJY2hhciAqYnVmLAogCQkJCQlsb2ZmX3Qgb2ZmLApAQCAtNDM4LDcgKzQzOCw3IEBACiAJLnNpemUgPSBBRElTMTYyMjBfQ0FQVFVSRV9TSVpFLAogfTsKIAotc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX2FkYzFfYmluX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfYWRjMV9iaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAogCQkJCXNpemVfdCBjb3VudCkKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCS5zaXplID0gQURJUzE2MjIwX0NBUFRVUkVfU0laRSwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF9hZGMyX2Jpbl9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX2FkYzJfYmluX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAogCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwKIAkJCQlzaXplX3QgY291bnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDAuaAppbmRleCBkY2ZmNDNjLi41MWE4MDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwLmgKQEAgLTEyNyw3ICsxMjcsNiBAQAogICogc3RydWN0IGFkaXMxNjI0MF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCiAgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKICAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZwotICogQHdvcmtfY29udF90aHJlc2g6IENMRUFOCiAgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCiAgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKICAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCkBAIC0xMzksNyArMTM4LDYgQEAKIHN0cnVjdCBhZGlzMTYyNDBfc3RhdGUgewogCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CiAJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKLQlzdHJ1Y3QgaWlvX3dvcmtfY29udAkJd29ya19jb250X3RocmVzaDsKIAlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CiAJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OwogCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CkBAIC0xNTUsMTQgKzE1MywxMiBAQAogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQogICovCiAKLWVudW0gYWRpczE2MjQwX3NjYW4gewotCUFESVMxNjI0MF9TQ0FOX1NVUFBMWSwKLQlBRElTMTYyNDBfU0NBTl9BQ0NfWCwKLQlBRElTMTYyNDBfU0NBTl9BQ0NfWSwKLQlBRElTMTYyNDBfU0NBTl9BQ0NfWiwKLQlBRElTMTYyNDBfU0NBTl9BVVhfQURDLAotCUFESVMxNjI0MF9TQ0FOX1RFTVAsCi19OworI2RlZmluZSBBRElTMTYyNDBfU0NBTl9TVVBQTFkJMAorI2RlZmluZSBBRElTMTYyNDBfU0NBTl9BQ0NfWAkxCisjZGVmaW5lIEFESVMxNjI0MF9TQ0FOX0FDQ19ZCTIKKyNkZWZpbmUgQURJUzE2MjQwX1NDQU5fQUNDX1oJMworI2RlZmluZSBBRElTMTYyNDBfU0NBTl9BVVhfQURDCTQKKyNkZWZpbmUgQURJUzE2MjQwX1NDQU5fVEVNUAk1CiAKIHZvaWQgYWRpczE2MjQwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjI0MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwpAQCAtMTc1LDggKzE3MSw2IEBACiBpbnQgYWRpczE2MjQwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBhZGlzMTYyNDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotaW50IGFkaXMxNjI0MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci12b2lkIGFkaXMxNjI0MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKICNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI0MF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQpAQCAtMjA1LDE0ICsxOTksNSBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBhZGlzMTYyNDBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNDBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLX0KLQogI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KICNlbmRpZiAvKiBTUElfQURJUzE2MjQwX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9jb3JlLmMKaW5kZXggNTRmZDZkNy4uM2U5NTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX2NvcmUuYwpAQCAtMTQsMTIgKzE0LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKICNpbmNsdWRlICJhY2NlbC5oIgogI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKIApAQCAtNzQsMTMgKzc1LDEzIEBACiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwgewogCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwogCkBAIC0xMjAsMTMgKzEyMSwxMyBAQAogCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAogCQkJLmxlbiA9IDIsCiAJCQkuY3NfY2hhbmdlID0gMSwKLQkJCS5kZWxheV91c2VjcyA9IDI1LAorCQkJLmRlbGF5X3VzZWNzID0gMzUsCiAJCX0sIHsKIAkJCS5yeF9idWYgPSBzdC0+cngsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwogCkBAIC01MDIsNyArNTAzLDcgQEAKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwogCXJlZ2RvbmUgPSAxOwogCi0JcmV0ID0gYWRpczE2MjQwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlyZXQgPSBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZywgMCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwpAQCAtNTM0LDcgKzUzNSw3IEBACiAJaWYgKHNwaS0+aXJxKQogCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgotCWFkaXMxNjI0MF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2LT5yaW5nKTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2MjQwX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2RldjoKQEAgLTU2Myw3ICs1NjQsNyBAQAogCWlmIChzcGktPmlycSkKIAkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKIAotCWFkaXMxNjI0MF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWRpczE2MjQwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIAlrZnJlZShzdC0+dHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfcmluZy5jCmluZGV4IDI2YjY3N2IuLmNkNjlhMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9yaW5nLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtMTYsMTYgKzE3LDYgQEAKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRpczE2MjQwLmgiCiAKLS8qKgotICogY29tYmluZV84X3RvXzE2KCkgdXRpbGl0eSBmdW5jdGlvbiB0byBtdW5nZSB0byB1OHMgaW50byB1MTYKLSAqKi8KLXN0YXRpYyBpbmxpbmUgdTE2IGNvbWJpbmVfOF90b18xNih1OCBsb3dlciwgdTggdXBwZXIpCi17Ci0JdTE2IF9sb3dlciA9IGxvd2VyOwotCXUxNiBfdXBwZXIgPSB1cHBlcjsKLQlyZXR1cm4gX2xvd2VyIHwgKF91cHBlciA8PCA4KTsKLX0KLQogc3RhdGljIElJT19TQ0FOX0VMX0Moc3VwcGx5LCBBRElTMTYyNDBfU0NBTl9TVVBQTFksIElJT19VTlNJR05FRCgxMCksCiAJCUFESVMxNjI0MF9TVVBQTFlfT1VULCBOVUxMKTsKIHN0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3gsIEFESVMxNjI0MF9TQ0FOX0FDQ19YLCBJSU9fU0lHTkVEKDEwKSwKQEAgLTYxLDEwICs1MiwxMCBAQAogICogYWRpczE2MjQwX3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCiAgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CiAgKiovCi1zdGF0aWMgdm9pZCBhZGlzMTYyNDBfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCitzdGF0aWMgdm9pZCBhZGlzMTYyNDBfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQogewogCXN0cnVjdCBhZGlzMTYyNDBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOwotCXN0LT5sYXN0X3RpbWVzdGFtcCA9IGluZGlvX2Rldi0+dHJpZy0+dGltZXN0YW1wOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWU7CiAJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKIH0KIApAQCAtMTMwLDEwICsxMjEsOSBAQAogCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQpCiAJCWlmIChhZGlzMTYyNDBfcmVhZF9yaW5nX2RhdGEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQotCQkJZm9yICg7IGkgPCBzdC0+aW5kaW9fZGV2LT5zY2FuX2NvdW50OyBpKyspIHsKLQkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzE2KHN0LT5yeFtpKjIrMV0sCi0JCQkJCQlzdC0+cnhbaSoyXSk7Ci0JCQl9CisJCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOwogCiAJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKQpAQCAtMTQ5LDQ4ICsxMzksNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBhZGlzMTYyNDBfZGF0YV9yZHlfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlzaXplX3Qgc2l6ZTsKLQlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2FuIGVsZW1lbnRzIGVuYWJsZWQsIGlmIG5vdCBmYWlsKi8KLQlpZiAoIShpbmRpb19kZXYtPnNjYW5fY291bnQgfHwgaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9icGQpIHsKLQkJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCi0JCQlpZiAoaW5kaW9fZGV2LT5zY2FuX2NvdW50KQotCQkJCS8qIFRpbWVzdGFtcCAoYWxpZ25lZCBzaXplb2YoczY0KSBhbmQgZGF0YSAqLwotCQkJCXNpemUgPSAoKChpbmRpb19kZXYtPnNjYW5fY291bnQgKiBzaXplb2YoczE2KSkKLQkJCQkJICsgc2l6ZW9mKHM2NCkgLSAxKQotCQkJCQkmIH4oc2l6ZW9mKHM2NCkgLSAxKSkKLQkJCQkJKyBzaXplb2YoczY0KTsKLQkJCWVsc2UgLyogVGltZXN0YW1wIG9ubHkgICovCi0JCQkJc2l6ZSA9IHNpemVvZihzNjQpOwotCQllbHNlIC8qIERhdGEgb25seSAqLwotCQkJc2l6ZSA9IGluZGlvX2Rldi0+c2Nhbl9jb3VudCpzaXplb2YoczE2KTsKLQkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2JwZChpbmRpb19kZXYtPnJpbmcsIHNpemUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkaXMxNjI0MF9kYXRhX3JkeV9yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlyZXR1cm4gaW5kaW9fZGV2LT50cmlnCi0JCT8gaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJaW5kaW9fZGV2LT5wb2xsZnVuYykKLQkJOiAwOwotfQotCi1zdGF0aWMgaW50IGFkaXMxNjI0MF9kYXRhX3JkeV9yaW5nX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlyZXR1cm4gaW5kaW9fZGV2LT50cmlnCi0JCT8gaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLAotCQkJCWluZGlvX2Rldi0+cG9sbGZ1bmMpCi0JCTogMDsKLX0KLQogdm9pZCBhZGlzMTYyNDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwpAQCAtMjIzLDE4ICsxNzEsMTYgQEAKIAlpbmRpb19kZXYtPnJpbmcgPSByaW5nOwogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKLQlyaW5nLT5wcmVlbmFibGUgPSAmYWRpczE2MjQwX2RhdGFfcmR5X3JpbmdfcHJlZW5hYmxlOwotCXJpbmctPnBvc3RlbmFibGUgPSAmYWRpczE2MjQwX2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZTsKLQlyaW5nLT5wcmVkaXNhYmxlID0gJmFkaXMxNjI0MF9kYXRhX3JkeV9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+YnBlID0gMjsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKIAlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCppbmRpb19kZXYtPnBvbGxmdW5jKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGluZGlvX2Rldi0+cG9sbGZ1bmMgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOzsKLQl9Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cG9sbF9mdW5jX21haW4gPSAmYWRpczE2MjQwX3BvbGxfZnVuY190aDsKLQlpbmRpb19kZXYtPnBvbGxmdW5jLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7CisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjI0MF9wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKIAlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCkBAIC0yNDMsMTIgKzE4OSwzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGFkaXMxNjI0MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOwotfQotCi12b2lkIGFkaXMxNjI0MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfdHJpZ2dlci5jCmluZGV4IGRmMTMxMmUuLjJiYTcxZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMKQEAgLTIzLDggKzIzLDcgQEAKIAlzdHJ1Y3QgYWRpczE2MjQwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOwogCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHN0LT50cmlnOwogCi0JdHJpZy0+dGltZXN0YW1wID0gdGltZXN0YW1wOwotCWlpb190cmlnZ2VyX3BvbGwodHJpZyk7CisJaWlvX3RyaWdnZXJfcG9sbCh0cmlnLCB0aW1lc3RhbXApOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtODMsMTQgKzgyLDEzIEBACiAJc3RydWN0IGFkaXMxNjI0MF9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOwogCiAJc3QtPnRyaWcgPSBpaW9fYWxsb2NhdGVfdHJpZ2dlcigpOwotCXN0LT50cmlnLT5uYW1lID0ga21hbGxvYyhJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkgICAiYWRpczE2MjQwLWRldiVkIiwKKwkJCQkgICBpbmRpb19kZXYtPmlkKTsKIAlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCX0KLQlzbnByaW50ZigoY2hhciAqKXN0LT50cmlnLT5uYW1lLAotCQkgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEgsCi0JCSAiYWRpczE2MjQwLWRldiVkIiwgaW5kaW9fZGV2LT5pZCk7CiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CiAJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9reHNkOS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9reHNkOS5jCmluZGV4IGFlN2ZmZTEuLjc5ZjU3OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwva3hzZDkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2t4c2Q5LmMKQEAgLTE2LDE3ICsxNiwxMSBAQAogICoJCWhlYXZpbHkgb3B0aW1pemVkIHJpbmcgYnVmZmVyIGFjY2VzcyBmdW5jdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRjLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHEuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxLmgKaW5kZXggZTc2YTk3OS4uNmU3MzA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oCkBAIC0xNDgsMzAgKzE0OCwzMSBAQAogI2RlZmluZSBMSVMzTDAyRFFfTUFYX1JYIDEyCiAvKioKICAqIHN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQGhlbHBlcjoJCWRhdGEgYW5kIGZ1bmMgcG9pbnRlciBhbGxvd2luZyBnZW5lcmljIGZ1bmN0aW9ucwogICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCi0gKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKLSAqIEB3b3JrX2NvbnRfdGhyZXNoOiBDTEVBTgorICogQHdvcmtfdGhyZXNoOgliaCBmb3IgdGhyZXNob2xkIGV2ZW50cworICogQHRocmVzaF90aW1lc3RhbXA6CXRpbWVzdGFtcCBmb3IgdGhyZXNob2xkIGludGVycnVwdHMuCiAgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCi0gKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKLSAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCiAgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCiAgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKICAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CiAgKiovCiBzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlIHsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfaGVscGVyX3N0YXRlCWhlbHA7CiAJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOwotCXN0cnVjdCBpaW9fd29ya19jb250CQl3b3JrX2NvbnRfdGhyZXNoOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190aHJlc2g7CisJczY0CQkJCXRocmVzaF90aW1lc3RhbXA7CiAJYm9vbAkJCQlpbnRlcjsKLQlzNjQJCQkJbGFzdF90aW1lc3RhbXA7Ci0Jc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OwogCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CiAJdTgJCQkJKnR4OwogCXU4CQkJCSpyeDsKIAlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKIH07CiAKKyNkZWZpbmUgbGlzM2wwMmRxX2hfdG9fcyhfaCkJCQkJXAorCWNvbnRhaW5lcl9vZihfaCwgc3RydWN0IGxpczNsMDJkcV9zdGF0ZSwgaGVscCkKKwogaW50IGxpczNsMDJkcV9zcGlfcmVhZF9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIHU4IHJlZ19hZGRyZXNzLAogCQkJICAgICB1OCAqdmFsKTsKQEAgLTE5NSwxNSArMTk2LDE1IEBACiBpbnQgbGlzM2wwMmRxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBsaXMzbDAyZHFfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotaW50IGxpczNsMDJkcV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci12b2lkIGxpczNsMDJkcV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKICNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KSB7fTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXMzbDAyZHFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KIHN0YXRpYyBpbmxpbmUgaW50IGxpczNsMDJkcV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJcmV0dXJuIDA7Ci19OworfQogCiBzdGF0aWMgaW5saW5lIHNzaXplX3QKIGxpczNsMDJkcV9yZWFkX2FjY2VsX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0yMTEsMTggKzIxMiwxNCBAQAogCQkJICAgICAgIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gMDsKLX07Cit9CiAKIHN0YXRpYyBpbnQgbGlzM2wwMmRxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJcmV0dXJuIDA7Ci19OworfQogc3RhdGljIGlubGluZSB2b2lkIGxpczNsMDJkcV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCi17fTsKLXN0YXRpYyBpbmxpbmUgaW50IGxpczNsMDJkcV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKIHsKLQlyZXR1cm4gMDsKLX07Ci1zdGF0aWMgaW5saW5lIHZvaWQgbGlzM2wwMmRxX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpIHt9OworfQogI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KICNlbmRpZiAvKiBTUElfTElTM0wwMkRRX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMKaW5kZXggNmI1NTc3ZC4uMGVlOTMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX2NvcmUuYwpAQCAtMjcsNiArMjcsOSBAQAogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisKICNpbmNsdWRlICJhY2NlbC5oIgogCiAjaW5jbHVkZSAibGlzM2wwMmRxLmgiCkBAIC00Nyw3ICs1MCw5IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfaGVscGVyX3N0YXRlICpoID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgKnN0ID0gbGlzM2wwMmRxX2hfdG9fcyhoKTsKKwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlciA9IHsKIAkJLnR4X2J1ZiA9IHN0LT50eCwKIAkJLnJ4X2J1ZiA9IHN0LT5yeCwKQEAgLTgyLDcgKzg3LDkgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgKmgKKwkJPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBsaXMzbDAyZHFfaF90b19zKGgpOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlciA9IHsKIAkJLnR4X2J1ZiA9IHN0LT50eCwKIAkJLmJpdHNfcGVyX3dvcmQgPSA4LApAQCAtOTYsNyArMTAzLDcgQEAKIAogCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOwotCXJldCA9ICBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CiAJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTExNiw3ICsxMjMsOSBAQAogCWludCByZXQ7CiAJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGlpb19zd19yaW5nX2hlbHBlcl9zdGF0ZSAqaAorCQk9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdCA9IGxpczNsMDJkcV9oX3RvX3MoaCk7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geyB7CiAJCQkudHhfYnVmID0gc3QtPnR4LAogCQkJLmJpdHNfcGVyX3dvcmQgPSA4LApAQCAtMTU4LDcgKzE2Nyw5IEBACiB7CiAJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGlpb19zd19yaW5nX2hlbHBlcl9zdGF0ZSAqaAorCQk9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdCA9IGxpczNsMDJkcV9oX3RvX3MoaCk7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7IHsKIAkJCS50eF9idWYgPSBzdC0+dHgsCkBAIC00MTEsNyArNDIyLDcgQEAKIAogCXZhbCA9IExJUzNMMDJEUV9ERUZBVUxUX0NUUkwxOwogCS8qIFdyaXRlIHN1aXRhYmxlIGRlZmF1bHRzIHRvIGN0cmwxICovCi0JcmV0ID0gbGlzM2wwMmRxX3NwaV93cml0ZV9yZWdfOCgmc3QtPmluZGlvX2Rldi0+ZGV2LAorCXJldCA9IGxpczNsMDJkcV9zcGlfd3JpdGVfcmVnXzgoJnN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2LAogCQkJCQlMSVMzTDAyRFFfUkVHX0NUUkxfMV9BRERSLAogCQkJCQkmdmFsKTsKIAlpZiAocmV0KSB7CkBAIC00MTksNyArNDMwLDcgQEAKIAkJZ290byBlcnJfcmV0OwogCX0KIAkvKiBSZXBlYXQgYXMgc29tZXRpbWVzIGRvZXNuJ3Qgd29yayBmaXJzdCB0aW1lPyovCi0JcmV0ID0gbGlzM2wwMmRxX3NwaV93cml0ZV9yZWdfOCgmc3QtPmluZGlvX2Rldi0+ZGV2LAorCXJldCA9IGxpczNsMDJkcV9zcGlfd3JpdGVfcmVnXzgoJnN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2LAogCQkJCQlMSVMzTDAyRFFfUkVHX0NUUkxfMV9BRERSLAogCQkJCQkmdmFsKTsKIAlpZiAocmV0KSB7CkBAIC00MjksMTcgKzQ0MCwxNyBAQAogCiAJLyogUmVhZCBiYWNrIHRvIGNoZWNrIHRoaXMgaGFzIHdvcmtlZCBhY3RzIGFzIGxvb3NlIHRlc3Qgb2YgY29ycmVjdAogCSAqIGNoaXAgKi8KLQlyZXQgPSBsaXMzbDAyZHFfc3BpX3JlYWRfcmVnXzgoJnN0LT5pbmRpb19kZXYtPmRldiwKKwlyZXQgPSBsaXMzbDAyZHFfc3BpX3JlYWRfcmVnXzgoJnN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2LAogCQkJCSAgICAgICBMSVMzTDAyRFFfUkVHX0NUUkxfMV9BRERSLAogCQkJCSAgICAgICAmdmFsdGVzdCk7CiAJaWYgKHJldCB8fCAodmFsdGVzdCAhPSB2YWwpKSB7Ci0JCWRldl9lcnIoJnN0LT5pbmRpb19kZXYtPmRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIik7CisJCWRldl9lcnIoJnN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwiKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfcmV0OwogCX0KIAogCXZhbCA9IExJUzNMMDJEUV9ERUZBVUxUX0NUUkwyOwotCXJldCA9IGxpczNsMDJkcV9zcGlfd3JpdGVfcmVnXzgoJnN0LT5pbmRpb19kZXYtPmRldiwKKwlyZXQgPSBsaXMzbDAyZHFfc3BpX3dyaXRlX3JlZ184KCZzdC0+aGVscC5pbmRpb19kZXYtPmRldiwKIAkJCQkJTElTM0wwMkRRX1JFR19DVFJMXzJfQUREUiwKIAkJCQkJJnZhbCk7CiAJaWYgKHJldCkgewpAQCAtNDQ4LDcgKzQ1OSw3IEBACiAJfQogCiAJdmFsID0gTElTM0wwMkRRX1JFR19XQUtFX1VQX0NGR19MQVRDSF9TUkM7Ci0JcmV0ID0gbGlzM2wwMmRxX3NwaV93cml0ZV9yZWdfOCgmc3QtPmluZGlvX2Rldi0+ZGV2LAorCXJldCA9IGxpczNsMDJkcV9zcGlfd3JpdGVfcmVnXzgoJnN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2LAogCQkJCQlMSVMzTDAyRFFfUkVHX1dBS0VfVVBfQ0ZHX0FERFIsCiAJCQkJCSZ2YWwpOwogCWlmIChyZXQpCkBAIC01MjQsOCArNTM1LDcgQEAKIAkJCQkgICAgICAgTElTM0wwMkRRX1JFR19XQUtFX1VQX0NGR19BRERSLAogCQkJCSAgICAgICAodTggKikmdmFsKTsKIAotCXJldHVybiByZXQgPyByZXQgOiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkJCSAgICh2YWwgJiB0aGlzX2F0dHItPm1hc2spID8gMSA6IDApOzsKKwlyZXR1cm4gcmV0ID8gcmV0IDogc3ByaW50ZihidWYsICIlZFxuIiwgISEodmFsICYgdGhpc19hdHRyLT5tYXNrKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxpczNsMDJkcV93cml0ZV9pbnRlcnJ1cHRfY29uZmlnKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTU5NSwxNiArNjA1LDE4IEBACiB9CiAKIAotc3RhdGljIGludCBsaXMzbDAyZHFfdGhyZXNoX2hhbmRsZXJfdGgoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorc3RhdGljIGludCBsaXMzbDAyZHFfdGhyZXNoX2hhbmRsZXJfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKIAkJCQkgICAgICAgaW50IGluZGV4LAogCQkJCSAgICAgICBzNjQgdGltZXN0YW1wLAogCQkJCSAgICAgICBpbnQgbm9fdGVzdCkKIHsKLQlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfaGVscGVyX3N0YXRlICpoCisJCT0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgKnN0ID0gbGlzM2wwMmRxX2hfdG9fcyhoKTsKIAogCS8qIFN0YXNoIHRoZSB0aW1lc3RhbXAgc29tZXdoZXJlIGNvbnZlbmllbnQgZm9yIHRoZSBiaCAqLwotCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQlzY2hlZHVsZV93b3JrKCZzdC0+d29ya19jb250X3RocmVzaC53cyk7CisJc3QtPnRocmVzaF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdGhyZXNoKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjE1LDQ4ICs2MjcsNDkgQEAKICAqLwogc3RhdGljIHZvaWQgbGlzM2wwMmRxX3RocmVzaF9oYW5kbGVyX2JoX25vX2NoZWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQogewotCXN0cnVjdCBpaW9fd29ya19jb250ICp3YwotCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBpaW9fd29ya19jb250LCB3cyk7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSB3Yy0+c3Q7CisgICAgICAgc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QKKwkgICAgICAgPSBjb250YWluZXJfb2Yod29ya19zLAorCQkgICAgICAgc3RydWN0IGxpczNsMDJkcV9zdGF0ZSwgd29ya190aHJlc2gpOworCiAJdTggdDsKIAotCWxpczNsMDJkcV9zcGlfcmVhZF9yZWdfOCgmc3QtPmluZGlvX2Rldi0+ZGV2LAorCWxpczNsMDJkcV9zcGlfcmVhZF9yZWdfOCgmc3QtPmhlbHAuaW5kaW9fZGV2LT5kZXYsCiAJCQkJIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9TUkNfQUREUiwKIAkJCQkgJnQpOwogCiAJaWYgKHQgJiBMSVMzTDAyRFFfUkVHX1dBS0VfVVBfU1JDX0lOVEVSUlVQVF9aX0hJR0gpCi0JCWlpb19wdXNoX2V2ZW50KHN0LT5pbmRpb19kZXYsIDAsCisJCWlpb19wdXNoX2V2ZW50KHN0LT5oZWxwLmluZGlvX2RldiwgMCwKIAkJCSAgICAgICBJSU9fRVZFTlRfQ09ERV9BQ0NFTF9aX0hJR0gsCi0JCQkgICAgICAgc3QtPmxhc3RfdGltZXN0YW1wKTsKKwkJCSAgICAgICBzdC0+dGhyZXNoX3RpbWVzdGFtcCk7CiAKIAlpZiAodCAmIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9TUkNfSU5URVJSVVBUX1pfTE9XKQotCQlpaW9fcHVzaF9ldmVudChzdC0+aW5kaW9fZGV2LCAwLAorCQlpaW9fcHVzaF9ldmVudChzdC0+aGVscC5pbmRpb19kZXYsIDAsCiAJCQkgICAgICAgSUlPX0VWRU5UX0NPREVfQUNDRUxfWl9MT1csCi0JCQkgICAgICAgc3QtPmxhc3RfdGltZXN0YW1wKTsKKwkJCSAgICAgICBzdC0+dGhyZXNoX3RpbWVzdGFtcCk7CiAKIAlpZiAodCAmIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9TUkNfSU5URVJSVVBUX1lfSElHSCkKLQkJaWlvX3B1c2hfZXZlbnQoc3QtPmluZGlvX2RldiwgMCwKKwkJaWlvX3B1c2hfZXZlbnQoc3QtPmhlbHAuaW5kaW9fZGV2LCAwLAogCQkJICAgICAgIElJT19FVkVOVF9DT0RFX0FDQ0VMX1lfSElHSCwKLQkJCSAgICAgICBzdC0+bGFzdF90aW1lc3RhbXApOworCQkJICAgICAgIHN0LT50aHJlc2hfdGltZXN0YW1wKTsKIAogCWlmICh0ICYgTElTM0wwMkRRX1JFR19XQUtFX1VQX1NSQ19JTlRFUlJVUFRfWV9MT1cpCi0JCWlpb19wdXNoX2V2ZW50KHN0LT5pbmRpb19kZXYsIDAsCisJCWlpb19wdXNoX2V2ZW50KHN0LT5oZWxwLmluZGlvX2RldiwgMCwKIAkJCSAgICAgICBJSU9fRVZFTlRfQ09ERV9BQ0NFTF9ZX0xPVywKLQkJCSAgICAgICBzdC0+bGFzdF90aW1lc3RhbXApOworCQkJICAgICAgIHN0LT50aHJlc2hfdGltZXN0YW1wKTsKIAogCWlmICh0ICYgTElTM0wwMkRRX1JFR19XQUtFX1VQX1NSQ19JTlRFUlJVUFRfWF9ISUdIKQotCQlpaW9fcHVzaF9ldmVudChzdC0+aW5kaW9fZGV2LCAwLAorCQlpaW9fcHVzaF9ldmVudChzdC0+aGVscC5pbmRpb19kZXYsIDAsCiAJCQkgICAgICAgSUlPX0VWRU5UX0NPREVfQUNDRUxfWF9ISUdILAotCQkJICAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisJCQkgICAgICAgc3QtPnRocmVzaF90aW1lc3RhbXApOwogCiAJaWYgKHQgJiBMSVMzTDAyRFFfUkVHX1dBS0VfVVBfU1JDX0lOVEVSUlVQVF9YX0xPVykKLQkJaWlvX3B1c2hfZXZlbnQoc3QtPmluZGlvX2RldiwgMCwKKwkJaWlvX3B1c2hfZXZlbnQoc3QtPmhlbHAuaW5kaW9fZGV2LCAwLAogCQkJICAgICAgIElJT19FVkVOVF9DT0RFX0FDQ0VMX1hfTE9XLAotCQkJICAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisJCQkgICAgICAgc3QtPnRocmVzaF90aW1lc3RhbXApOwogCS8qIHJlZW5hYmxlIHRoZSBpcnEgKi8KIAllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKIAkvKiBBY2sgYW5kIGFsbG93IGZvciBuZXcgaW50ZXJydXB0cyAqLwotCWxpczNsMDJkcV9zcGlfcmVhZF9yZWdfOCgmc3QtPmluZGlvX2Rldi0+ZGV2LAorCWxpczNsMDJkcV9zcGlfcmVhZF9yZWdfOCgmc3QtPmhlbHAuaW5kaW9fZGV2LT5kZXYsCiAJCQkJIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9BQ0tfQUREUiwKIAkJCQkgJnQpOwogCkBAIC03NTAsNiArNzYzLDcgQEAKIAkJcmV0ID0gIC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KKwlJTklUX1dPUksoJnN0LT53b3JrX3RocmVzaCwgbGlzM2wwMmRxX3RocmVzaF9oYW5kbGVyX2JoX25vX2NoZWNrKTsKIAkvKiB0aGlzIGlzIG9ubHkgdXNlZCB0b3IgcmVtb3ZhbCBwdXJwb3NlcyAqLwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKIApAQCAtNzY3LDU2ICs3ODEsNDYgQEAKIAlzdC0+dXMgPSBzcGk7CiAJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKIAkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KLQlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOwotCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwlzdC0+aGVscC5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5oZWxwLmluZGlvX2RldiA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV90eDsKIAl9CiAKLQlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwotCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOwotCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmxpczNsMDJkcV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7Ci0Jc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmbGlzM2wwMmRxX2F0dHJpYnV0ZV9ncm91cDsKLQlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKLQlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7Ci0Jc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlzdC0+aGVscC5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmhlbHAuaW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aGVscC5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmxpczNsMDJkcV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmhlbHAuaW5kaW9fZGV2LT5hdHRycyA9ICZsaXMzbDAyZHFfYXR0cmlidXRlX2dyb3VwOworCXN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKSgmc3QtPmhlbHApOworCXN0LT5oZWxwLmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5oZWxwLmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAotCXJldCA9IGxpczNsMDJkcV9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlyZXQgPSBsaXMzbDAyZHFfY29uZmlndXJlX3Jpbmcoc3QtPmhlbHAuaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5oZWxwLmluZGlvX2Rldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwogCXJlZ2RvbmUgPSAxOwogCi0JcmV0ID0gbGlzM2wwMmRxX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlyZXQgPSBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIoc3QtPmhlbHAuaW5kaW9fZGV2LT5yaW5nLCAwKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOwogCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CiAJfQogCiAJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKLQkJLyogVGhpcyBpcyBhIGxpdHRsZSB1bnVzdWFsLCBpbiB0aGF0IHRoZSBkZXZpY2Ugc2VlbXMKLQkJICAgdG8gbmVlZCBhIGZ1bGwgcmVhZCBvZiB0aGUgaW50ZXJydXB0IHNvdXJjZSByZWcgYmVmb3JlCi0JCSAgIHRoZSBpbnRlcnJ1cHQgd2lsbCByZXNldC4KLQkJICAgSGVuY2UgdGhlIHR3byBoYW5kbGVycyBhcmUgdGhlIHNhbWUgKi8KLQkJaWlvX2luaXRfd29ya19jb250KCZzdC0+d29ya19jb250X3RocmVzaCwKLQkJCQkgICBsaXMzbDAyZHFfdGhyZXNoX2hhbmRsZXJfYmhfbm9fY2hlY2ssCi0JCQkJICAgbGlzM2wwMmRxX3RocmVzaF9oYW5kbGVyX2JoX25vX2NoZWNrLAotCQkJCSAgIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9TUkNfQUREUiwKLQkJCQkgICAwLAotCQkJCSAgIHN0KTsKIAkJc3QtPmludGVyID0gMDsKIAkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAotCQkJCQkJICBzdC0+aW5kaW9fZGV2LAorCQkJCQkJICBzdC0+aGVscC5pbmRpb19kZXYsCiAJCQkJCQkgIDAsCiAJCQkJCQkgIElSUUZfVFJJR0dFUl9SSVNJTkcsCiAJCQkJCQkgICJsaXMzbDAyZHEiKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CiAKLQkJcmV0ID0gbGlzM2wwMmRxX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCXJldCA9IGxpczNsMDJkcV9wcm9iZV90cmlnZ2VyKHN0LT5oZWxwLmluZGlvX2Rldik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKIAl9CkBAIC04MjgsMjAgKzgzMiwyMCBAQAogCXJldHVybiAwOwogCiBlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKLQlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKLQkJbGlzM2wwMmRxX3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCWlmIChzdC0+aGVscC5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihzdC0+aGVscC5pbmRpb19kZXYpOwogZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgotCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQotCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKKwlpZiAoc3QtPmhlbHAuaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aGVscC5pbmRpb19kZXYsIDApOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JbGlzM2wwMmRxX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHN0LT5oZWxwLmluZGlvX2Rldi0+cmluZyk7CiBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgotCWxpczNsMDJkcV91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWxpczNsMDJkcV91bmNvbmZpZ3VyZV9yaW5nKHN0LT5oZWxwLmluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2RldjoKIAlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmhlbHAuaW5kaW9fZGV2KTsKIAllbHNlCi0JCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5oZWxwLmluZGlvX2Rldik7CiBlcnJvcl9mcmVlX3R4OgogCWtmcmVlKHN0LT50eCk7CiBlcnJvcl9mcmVlX3J4OgpAQCAtODU2LDcgKzg2MCw5IEBACiBzdGF0aWMgaW50IGxpczNsMDJkcV9zdG9wX2RldmljZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgKmgKKwkJPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBsaXMzbDAyZHFfaF90b19zKGgpOwogCXU4IHZhbCA9IDA7CiAKIAltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKQEAgLTg4Myw3ICs4ODksNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmhlbHAuaW5kaW9fZGV2OwogCiAJcmV0ID0gbGlzM2wwMmRxX3N0b3BfZGV2aWNlKGluZGlvX2Rldik7CiAJaWYgKHJldCkKQEAgLTg5NSw3ICs5MDEsNyBAQAogCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQogCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOwogCi0JbGlzM2wwMmRxX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKIAlsaXMzbDAyZHFfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWtmcmVlKHN0LT50eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKaW5kZXggZTRlMjAyZS4uYTk2MGE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwpAQCAtMTAzLDEzICsxMDMsMTUgQEAKICAqIGxpczNsMDJkcV9wb2xsX2Z1bmNfdGgoKSB0b3AgaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQgYnkgdHJpZ2dlcgogICogQHByaXZhdGVfZGF0YToJaWlvX2RldgogICoqLwotc3RhdGljIHZvaWQgbGlzM2wwMmRxX3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQorc3RhdGljIHZvaWQgbGlzM2wwMmRxX3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZSkKIHsKLSAgc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7Ci0Jc3QtPmxhc3RfdGltZXN0YW1wID0gaW5kaW9fZGV2LT50cmlnLT50aW1lc3RhbXA7Ci0Jc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKLQkvKiBJbmRpY2F0ZSB0aGF0IHRoaXMgaW50ZXJydXB0IGlzIGJlaW5nIGhhbmRsZWQgKi8KKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfaGVscGVyX3N0YXRlICpoCisJCT0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgKnN0ID0gbGlzM2wwMmRxX2hfdG9fcyhoKTsKKwkvKiBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBzbGlnaHRseSBleHRlbmQgdGhlIGhlbHBlciBmdW5jdGlvbiAqLworCWlpb19zd19wb2xsX2Z1bmNfdGgoaW5kaW9fZGV2LCB0aW1lKTsKIAorCS8qIEluZGljYXRlIHRoYXQgdGhpcyBpbnRlcnJ1cHQgaXMgYmVpbmcgaGFuZGxlZCAqLwogCS8qIFRlY2huaWNhbGx5IHRoaXMgaXMgdHJpZ2dlciByZWxhdGVkLCBidXQgd2l0aG91dCB0aGlzCiAJICogaGFuZGxlciBydW5uaW5nIHRoZXJlIGlzIGN1cnJlbnRseSBub3cgd2F5IGZvciB0aGUgaW50ZXJydXB0CiAJICogdG8gY2xlYXIuCkBAIC0xMjAsMTYgKzEyMiwxNiBAQAogLyoqCiAgKiBsaXMzbDAyZHFfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCiAgKiovCi1zdGF0aWMgaW50IGxpczNsMDJkcV9kYXRhX3JkeV90cmlnX3BvbGwoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorc3RhdGljIGludCBsaXMzbDAyZHFfZGF0YV9yZHlfdHJpZ19wb2xsKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkJICAgICAgIGludCBpbmRleCwKIAkJCQkgICAgICAgczY0IHRpbWVzdGFtcCwKIAkJCQkgICAgICAgaW50IG5vX3Rlc3QpCiB7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKLQlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSBzdC0+dHJpZzsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfaGVscGVyX3N0YXRlICpoCisJCT0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgKnN0ID0gbGlzM2wwMmRxX2hfdG9fcyhoKTsKIAotCXRyaWctPnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcpOworCWlpb190cmlnZ2VyX3BvbGwoc3QtPnRyaWcsIHRpbWVzdGFtcCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0yMTMsNyArMjE1LDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwogCWludCByZXQsIGksIGogPSAwOwogCi0JeGZlcnMgPSBremFsbG9jKChzdC0+aW5kaW9fZGV2LT5zY2FuX2NvdW50KSAqIDIKKwl4ZmVycyA9IGt6YWxsb2MoKHN0LT5oZWxwLmluZGlvX2Rldi0+c2Nhbl9jb3VudCkgKiAyCiAJCQkqIHNpemVvZigqeGZlcnMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXhmZXJzKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIyMSw3ICsyMjMsNyBAQAogCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWFkX2FsbF90eF9hcnJheSkvNDsgaSsrKSB7Ci0JCWlmIChzdC0+aW5kaW9fZGV2LT5zY2FuX21hc2sgJiAoMSA8PCBpKSkgeworCQlpZiAoc3QtPmhlbHAuaW5kaW9fZGV2LT5zY2FuX21hc2sgJiAoMSA8PCBpKSkgewogCQkJLyogbG93ZXIgYnl0ZSAqLwogCQkJeGZlcnNbal0udHhfYnVmID0gc3QtPnR4ICsgMipqOwogCQkJc3QtPnR4WzIqal0gPSByZWFkX2FsbF90eF9hcnJheVtpKjRdOwpAQCAtMjQ5LDcgKzI1MSw3IEBACiAJICogdmFsdWVzIGluIGFsdGVybmF0ZSBieXRlcwogCSAqLwogCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0JZm9yIChqID0gMDsgaiA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQgKiAyOyBqKyspCisJZm9yIChqID0gMDsgaiA8IHN0LT5oZWxwLmluZGlvX2Rldi0+c2Nhbl9jb3VudCAqIDI7IGorKykKIAkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzW2pdLCAmbXNnKTsKIAogCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CkBAIC0yNTksMTAyICsyNjEsMzcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLS8qIFdoaWxzdCB0aGlzIG1ha2VzIGEgbG90IG9mIGNhbGxzIHRvIGlpb19zd19yaW5nIGZ1bmN0aW9ucyAtIGl0IGlzIHRvIGRldmljZQotICogc3BlY2lmaWMgdG8gYmUgcm9sbGVkIGludG8gdGhlIGNvcmUuCi0gKi8KIHN0YXRpYyB2b2lkIGxpczNsMDJkcV90cmlnZ2VyX2JoX3RvX3Jpbmcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCiB7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QKLQkJPSBjb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlLAotCQkJICAgICAgIHdvcmtfdHJpZ2dlcl90b19yaW5nKTsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfaGVscGVyX3N0YXRlICpoCisJCT0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGlpb19zd19yaW5nX2hlbHBlcl9zdGF0ZSwKKwkJCXdvcmtfdHJpZ2dlcl90b19yaW5nKTsKKwlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdCA9IGxpczNsMDJkcV9oX3RvX3MoaCk7CiAKLQl1OCAqcnhfYXJyYXk7Ci0JaW50IGkgPSAwOwotCXUxNiAqZGF0YTsKLQlzaXplX3QgZGF0YXNpemUgPSBzdC0+aW5kaW9fZGV2Ci0JCS0+cmluZy0+YWNjZXNzLmdldF9icGQoc3QtPmluZGlvX2Rldi0+cmluZyk7Ci0KLQlkYXRhID0ga21hbGxvYyhkYXRhc2l6ZSAsIEdGUF9LRVJORUwpOwotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIHJpbmcgYmgiKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBEdWUgdG8gaW50ZXJsZWF2ZWQgbmF0dXJlIG9mIHRyYW5zbWlzc2lvbiB0aGlzIGJ1ZmZlciBtdXN0IGJlCi0JICogdHdpY2UgdGhlIG51bWJlciBvZiBieXRlcywgb3IgNCB0aW1lcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0JICovCi0JcnhfYXJyYXkgPSBrbWFsbG9jKDQgKiAoc3QtPmluZGlvX2Rldi0+c2Nhbl9jb3VudCksIEdGUF9LRVJORUwpOwotCWlmIChyeF9hcnJheSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7Ci0JCWtmcmVlKGRhdGEpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2hpbHN0IHRyaWdnZXIgc3BlY2lmaWMsIGlmIHRoaXMgcmVhZCBkb2VzIG50byBvY2N1ciB0aGUgZGF0YQotCSAgIHJlYWR5IGludGVycnVwdCB3aWxsIG5vdCBiZSBjbGVhcmVkLiAgTmVlZCB0byBhZGQgYSBtZWNoYW5pc20KLQkgICB0byBwcm92aWRlIGEgZHVtbXkgcmVhZCBmdW5jdGlvbiBpZiB0aGlzIGlzIG5vdCB0cmlnZ2VyaW5nIG9uCi0JICAgdGhlIGRhdGEgcmVhZHkgZnVuY3Rpb24gYnV0IHNvbWV0aGluZyBlbHNlIGlzLgotCSovCiAJc3QtPmludGVyID0gMDsKKwlpaW9fc3dfdHJpZ2dlcl9iaF90b19yaW5nKHdvcmtfcyk7Cit9CiAKLQlpZiAoc3QtPmluZGlvX2Rldi0+c2Nhbl9jb3VudCkKLQkJaWYgKGxpczNsMDJkcV9yZWFkX2FsbChzdCwgcnhfYXJyYXkpID49IDApCi0JCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKLQkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzE2KHJ4X2FycmF5W2kqNCsxXSwKLQkJCQkJCQkgIHJ4X2FycmF5W2kqNCszXSk7Ci0JLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCi0JaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKQotCQkqKChzNjQgKikoZGF0YSArICgoaSArIDMpLzQpKjQpKSA9IHN0LT5sYXN0X3RpbWVzdGFtcDsKK3N0YXRpYyBpbnQgbGlzM2wwMmRxX2dldF9yaW5nX2VsZW1lbnQoc3RydWN0IGlpb19zd19yaW5nX2hlbHBlcl9zdGF0ZSAqaCwKKwkJCQl1OCAqYnVmKQoreworCWludCByZXQsIGk7CisJdTggKnJ4X2FycmF5IDsKKwlzMTYgKmRhdGEgPSAoczE2ICopYnVmOwogCi0Jc3QtPmluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnN0b3JlX3RvKHN0LT5pbmRpb19kZXYtPnJpbmcsCi0JCQkJCSAgICAodTggKilkYXRhLAotCQkJCQkgICAgc3QtPmxhc3RfdGltZXN0YW1wKTsKLQotCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0LT5pbmRpb19kZXYtPnRyaWcpOworCXJ4X2FycmF5ID0ga3phbGxvYyg0ICogKGgtPmluZGlvX2Rldi0+c2Nhbl9jb3VudCksIEdGUF9LRVJORUwpOworCWlmIChyeF9hcnJheSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBsaXMzbDAyZHFfcmVhZF9hbGwobGlzM2wwMmRxX2hfdG9fcyhoKSwgcnhfYXJyYXkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBoLT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKKwkJZGF0YVtpXSA9IGNvbWJpbmVfOF90b18xNihyeF9hcnJheVtpKjQrMV0sCisJCQkJCXJ4X2FycmF5W2kqNCszXSk7CiAJa2ZyZWUocnhfYXJyYXkpOwotCWtmcmVlKGRhdGEpOwogCi0JcmV0dXJuOworCXJldHVybiBpKnNpemVvZihkYXRhWzBdKTsKIH0KLS8qIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMgaXMgaXQgYmV0dGVyIHRvIGdvIHdpdGggdW5hbGlnbmVkIHBhY2tpbmcgYW5kCi0gKiBkZWFsIHdpdGggdGhlIGNvc3Q/Ki8KLXN0YXRpYyBpbnQgbGlzM2wwMmRxX2RhdGFfcmR5X3JpbmdfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCi17Ci0Jc2l6ZV90IHNpemU7Ci0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2FuIGVsZW1lbnRzIGVuYWJsZWQsIGlmIG5vdCBmYWlsKi8KLQlpZiAoIShpbmRpb19kZXYtPnNjYW5fY291bnQgfHwgaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9icGQpIHsKLQkJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCi0JCQlpZiAoaW5kaW9fZGV2LT5zY2FuX2NvdW50KSAvKiBUaW1lc3RhbXAgYW5kIGRhdGEgKi8KLQkJCQlzaXplID0gMipzaXplb2YoczY0KTsKLQkJCWVsc2UgLyogVGltZXN0YW1wIG9ubHkgICovCi0JCQkJc2l6ZSA9IHNpemVvZihzNjQpOwotCQllbHNlIC8qIERhdGEgb25seSAqLwotCQkJc2l6ZSA9IGluZGlvX2Rldi0+c2Nhbl9jb3VudCpzaXplb2YoczE2KTsKLQkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2JwZChpbmRpb19kZXYtPnJpbmcsIHNpemUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxpczNsMDJkcV9kYXRhX3JkeV9yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlyZXR1cm4gaW5kaW9fZGV2LT50cmlnCi0JCT8gaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJCSAgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGlzM2wwMmRxX2RhdGFfcmR5X3JpbmdfcHJlZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJCQlpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19Ci0KIAogLyogQ2FsbGVyIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nIGFzIG5lY2Vzc2FyeS4gKi8KIHN0YXRpYyBpbnQKQEAgLTQyNyw3ICszNjQsNyBAQAogCXN0cnVjdCBsaXMzbDAyZHFfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOwogCWludCByZXQgPSAwOwogCXU4IHQ7Ci0JX19saXMzbDAyZHFfd3JpdGVfZGF0YV9yZWFkeV9jb25maWcoJnN0LT5pbmRpb19kZXYtPmRldiwKKwlfX2xpczNsMDJkcV93cml0ZV9kYXRhX3JlYWR5X2NvbmZpZygmc3QtPmhlbHAuaW5kaW9fZGV2LT5kZXYsCiAJCQkJCSAgICAmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCiAJCQkJCSAgICBzdGF0ZSk7CiAJaWYgKHN0YXRlID09IGZhbHNlKSB7CkBAIC00MzcsNyArMzc0LDcgQEAKIAkJLyogQ2xlYXIgYW55IG91dHN0YW5kaW5nIHJlYWR5IGV2ZW50cyAqLwogCQlyZXQgPSBsaXMzbDAyZHFfcmVhZF9hbGwoc3QsIE5VTEwpOwogCX0KLQlsaXMzbDAyZHFfc3BpX3JlYWRfcmVnXzgoJnN0LT5pbmRpb19kZXYtPmRldiwKKwlsaXMzbDAyZHFfc3BpX3JlYWRfcmVnXzgoJnN0LT5oZWxwLmluZGlvX2Rldi0+ZGV2LAogCQkJCSBMSVMzTDAyRFFfUkVHX1dBS0VfVVBfU1JDX0FERFIsCiAJCQkJICZ0KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDk1LDE0ICs0MzIsMTQgQEAKIAlpZiAoIXN0YXRlLT50cmlnKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXN0YXRlLT50cmlnLT5uYW1lID0ga21hbGxvYyhJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJc3RhdGUtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkgICAgICAibGlzM2wwMmRxLWRldiVkIiwKKwkJCQkgICAgICBpbmRpb19kZXYtPmlkKTsKIAlpZiAoIXN0YXRlLT50cmlnLT5uYW1lKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCX0KLQlzbnByaW50ZigoY2hhciAqKXN0YXRlLT50cmlnLT5uYW1lLAotCQkgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEgsCi0JCSAibGlzM2wwMmRxLWRldiVkIiwgaW5kaW9fZGV2LT5pZCk7CisKIAlzdGF0ZS0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdGF0ZS0+dXMtPmRldjsKIAlzdGF0ZS0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlzdGF0ZS0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CkBAIC01NDAsMTIgKzQ3NywxMiBAQAogCiBpbnQgbGlzM2wwMmRxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7Ci0JSU5JVF9XT1JLKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcsIGxpczNsMDJkcV90cmlnZ2VyX2JoX3RvX3JpbmcpOwotCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWludCByZXQ7CisJc3RydWN0IGlpb19zd19yaW5nX2hlbHBlcl9zdGF0ZSAqaCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKIAorCUlOSVRfV09SSygmaC0+d29ya190cmlnZ2VyX3RvX3JpbmcsIGxpczNsMDJkcV90cmlnZ2VyX2JoX3RvX3JpbmcpOworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWgtPmdldF9yaW5nX2VsZW1lbnQgPSAmbGlzM2wwMmRxX2dldF9yaW5nX2VsZW1lbnQ7CiAJaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LCBpaW9fc2Nhbl9lbF9hY2NlbF94Lm51bWJlcik7CiAJaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LCBpaW9fc2Nhbl9lbF9hY2NlbF95Lm51bWJlcik7CiAJaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LCBpaW9fc2Nhbl9lbF9hY2NlbF96Lm51bWJlcik7CkBAIC01NTMsMjYgKzQ5MCwyMSBAQAogCiAJaW5kaW9fZGV2LT5zY2FuX2VsX2F0dHJzID0gJmxpczNsMDJkcV9zY2FuX2VsX2dyb3VwOwogCi0JcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOwotCWlmICghcmluZykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpbmRpb19kZXYtPnJpbmcgPSByaW5nOwotCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KLQlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKLQlyaW5nLT5wcmVlbmFibGUgPSAmbGlzM2wwMmRxX2RhdGFfcmR5X3JpbmdfcHJlZW5hYmxlOwotCXJpbmctPnBvc3RlbmFibGUgPSAmbGlzM2wwMmRxX2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZTsKLQlyaW5nLT5wcmVkaXNhYmxlID0gJmxpczNsMDJkcV9kYXRhX3JkeV9yaW5nX3ByZWRpc2FibGU7Ci0JcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlpbmRpb19kZXYtPnJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIWluZGlvX2Rldi0+cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbmRpb19kZXYtPnBvbGxmdW5jID0ga3phbGxvYyhzaXplb2YoKmluZGlvX2Rldi0+cG9sbGZ1bmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZpbmRpb19kZXYtPnJpbmctPmFjY2Vzcyk7CisJaW5kaW9fZGV2LT5yaW5nLT5icGUgPSAyOworCWluZGlvX2Rldi0+cmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlpbmRpb19kZXYtPnJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlOworCWluZGlvX2Rldi0+cmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZsaXMzbDAyZHFfcG9sbF9mdW5jX3RoKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOzsKLQl9Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cG9sbF9mdW5jX21haW4gPSAmbGlzM2wwMmRxX3BvbGxfZnVuY190aDsKLQlpbmRpb19kZXYtPnBvbGxmdW5jLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7CiAJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIApAQCAtNTgwLDIzICs1MTIsMyBAQAogCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CiAJcmV0dXJuIHJldDsKIH0KLQotaW50IGxpczNsMDJkcV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOwotfQotCi12b2lkIGxpczNsMDJkcV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOwotfQotCi1pbnQgbGlzM2wwMmRxX3NldF9yaW5nX2xlbmd0aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgbGVuZ3RoKQotewotCS8qIFNldCBzZW5zaWJsZSBkZWZhdWx0cyBmb3IgdGhlIHJpbmcgYnVmZmVyICovCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9sZW5ndGgpCi0JCXJldHVybiBpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfbGVuZ3RoKGluZGlvX2Rldi0+cmluZywgNTAwKTsKLQlyZXR1cm4gMDsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCmluZGV4IGU1MzIxOTkuLjA5ZDk0NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCkBAIC0yNDIsNyArMjQyLDcgQEAKIAl2YWwgfD0gKHZhbCAmICgxIDw8IDEyKSkgPyAweEUwMDAgOiAwOwogCiAJcmV0dXJuIHZhbDsKLX07Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNjYTMwMDBfMTNiaXRfY29udmVydCh1aW50OF90IG1zYiwgdWludDhfdCBsc2IpCiB7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAl2YWwgfD0gKHZhbCAmICgxIDw8IDEyKSkgPyAweEUwMDAgOiAwOwogCiAJcmV0dXJuIHZhbDsKLX07Cit9CiAKIAogI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKQEAgLTI4NiwxNSArMjg2LDE5IEBACiB2b2lkIHNjYTMwMDBfcmluZ19pbnRfcHJvY2Vzcyh1OCB2YWwsIHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwogCiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNjYTMwMDBfcmVnaXN0ZXJfcmluZ19mdW5jcyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KSB7fTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2EzMDAwX3JlZ2lzdGVyX3JpbmdfZnVuY3Moc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KIAogc3RhdGljIGlubGluZQogaW50IHNjYTMwMDBfcmVnaXN0ZXJfcmluZ19hY2Nlc3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlyZXR1cm4gMDsKLX07Cit9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2EzMDAwX3JpbmdfaW50X3Byb2Nlc3ModTggdmFsLCB2b2lkICpyaW5nKSB7fTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2EzMDAwX3JpbmdfaW50X3Byb2Nlc3ModTggdmFsLCB2b2lkICpyaW5nKQoreworfQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKaW5kZXggZDRmODJjMy4uYjc4YjZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAljYXNlIFNDQTMwMDBfT1BfTU9ERV9CWVBBU1M6CiAJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiwgMSAtIGJ5cGFzcyBtb2RlIik7CiAJCWJyZWFrOwotCX07CisJfQogCXN3aXRjaCAoc3QtPmluZm8tPm9wdGlvbl9tb2RlXzIpIHsKIAljYXNlIFNDQTMwMDBfT1BfTU9ERV9XSURFOgogCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIsIDIgLSB3aWRlIG1vZGUiKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCQljYXNlIFNDQTMwMDBfT1BfTU9ERV9CWVBBU1M6CiAJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIxIC0gYnlwYXNzIG1vZGVcbiIpOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQ0EzMDAwX01FQVNfTU9ERV9PUF8yOgogCQlzd2l0Y2ggKHN0LT5pbmZvLT5vcHRpb25fbW9kZV8yKSB7CkBAIC00NDIsNyArNDQyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwotCX07CisJfQogCiBlcnJvcl9yZXQ6CiAJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CkBAIC01NTksNyArNTU5LDcgQEAKIAkJCSAgICAgICBzdC0+aW5mby0+b3B0aW9uX21vZGVfMl9mcmVxLzIsCiAJCQkgICAgICAgc3QtPmluZm8tPm9wdGlvbl9tb2RlXzJfZnJlcS80KTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAJa2ZyZWUocngpOwogCXJldHVybiBsZW47CiBlcnJvcl9yZXQ6CkBAIC01OTAsNyArNTkwLDcgQEAKIAljYXNlIFNDQTMwMDBfTUVBU19NT0RFX09QXzI6CiAJCSpiYXNlX2ZyZXEgPSBpbmZvLT5vcHRpb25fbW9kZV8yX2ZyZXE7CiAJCWJyZWFrOwotCX07CisJfQogCWtmcmVlKHJ4KTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwpAQCAtNjI3LDggKzYyNyw4IEBACiAJCWNhc2UgMHgwMjoKIAkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGJhc2VfZnJlcS80KTsKIAkJCWJyZWFrOwotCX07Ci0JCQlrZnJlZShyeCk7CisJfQorCWtmcmVlKHJ4KTsKIAlyZXR1cm4gbGVuOwogZXJyb3JfcmV0X211dDoKIAltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKaW5kZXggMThjOTM3Ni4uNjg4NTEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi0KKyMKICMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIEFEQyBkcml2ZXJzCiAjCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkYy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWRjLmgKaW5kZXggMDRlYjE2Zi4uNzg0MWU2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWRjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWRjLmgKQEAgLTI2LDMgKzI2LDYgQEAKIAkJCSAgICAgIF9zaG93LAkJCQkJXAogCQkJICAgICAgTlVMTCwJCQkJCVwKIAkJCSAgICAgIF9hZGRyKQorCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0lOX0hJR0hfVEhSRVNIKGEpIChJSU9fRVZFTlRfQ09ERV9BRENfQkFTRSAgKyBhKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9JTl9MT1dfVEhSRVNIKGEpIChJSU9fRVZFTlRfQ09ERV9BRENfQkFTRSAgKyBhICsgMzIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmgKaW5kZXggNzJjZjM2Ny4uOGYwZmUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2My5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaApAQCAtMzIsMTQgKzMyLDYgQEAKIAogLyogU3BlY2lmaWMgdG8gdGhlIG1heDEzNjMgKi8KICNkZWZpbmUgTUFYMTM2M19NT05fUkVTRVRfQ0hBTihhKSAoMSA8PCAoKGEpICsgNCkpCi0jZGVmaW5lIE1BWDEzNjNfTU9OX0NPTlZfUkFURV8xMzNrc3BzCQkwCi0jZGVmaW5lIE1BWDEzNjNfTU9OX0NPTlZfUkFURV82Nl81a3NwcwkJMHgwMgotI2RlZmluZSBNQVgxMzYzX01PTl9DT05WX1JBVEVfMzNfM2tzcHMJCTB4MDQKLSNkZWZpbmUgTUFYMTM2M19NT05fQ09OVl9SQVRFXzE2XzZrc3BzCQkweDA2Ci0jZGVmaW5lIE1BWDEzNjNfTU9OX0NPTlZfUkFURV84XzNrc3BzCQkweDA4Ci0jZGVmaW5lIE1BWDEzNjNfTU9OX0NPTlZfUkFURV80XzJrc3BzCQkweDBBCi0jZGVmaW5lIE1BWDEzNjNfTU9OX0NPTlZfUkFURV8yXzBrc3BzCQkweDBDCi0jZGVmaW5lIE1BWDEzNjNfTU9OX0NPTlZfUkFURV8xXzBrc3BzCQkweDBFCiAjZGVmaW5lIE1BWDEzNjNfTU9OX0lOVF9FTkFCTEUJCQkweDAxCiAKIC8qIGRlZmluZWQgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMgKi8KQEAgLTY3LDkgKzU5LDggQEAKIAogLyoqCiAgKiBzdHJ1Y3QgbWF4MTM2M19tb2RlIC0gc2NhbiBtb2RlIGluZm9ybWF0aW9uCi0gKiBAbmFtZToJTmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzY2FuIG1vZGUuCiAgKiBAY29uZjoJVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLSAqIEBudW12YWxzOglUaGUgbnVtYmVyIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhIHNpbmdsZSBzY2FuCisgKiBAbW9kZW1hc2s6CUJpdCBtYXNrIGNvcnJlc3BvbmRpbmcgdG8gY2hhbm5lbHMgZW5hYmxlZCBpbiB0aGlzIG1vZGUKICAqLwogc3RydWN0IG1heDEzNjNfbW9kZSB7CiAJaW50OF90CQljb25mOwpAQCAtMTIyLDE1ICsxMTMsNiBAQAogCQkJLm1vZGVtYXNrID0gX21hc2sJCQkJXAogfQogCi0vKiBOb3QgY3VycmVudGx5IGhhbmRsZWQgKi8KLSNkZWZpbmUgTUFYMTM2M19NT0RFX01PTklUT1IgewkJCQkJXAotCQkubmFtZSA9ICJtb25pdG9yIiwJCQkJXAotCQkJLmNvbmYgPSBNQVgxMzYzX0NIQU5ORUxfU0VMKDMpCQlcCi0JCQl8IE1BWDEzNjNfQ09ORklHX1NDQU5fTU9OSVRPUl9NT0RFCVwKLQkJCXwgTUFYMTM2M19DT05GSUdfU0UsCQkJXAotCQkJLm51bXZhbHMgPSAxMCwJCQkJXAotCQl9Ci0KIC8qIFRoaXMgbWF5IHNlZW0gYW4gb3Zlcmx5IGxvbmcgd2luZGVkIHdheSB0byBkbyB0aGlzLCBidXQgYXQgbGVhc3QgaXQgbWFrZXMKICAqIGNsZWFyIHdoYXQgYWxsIHRoZSB2YXJpb3VzIG9wdGlvbnMgYWN0dWFsbHkgZG8uIEFsdGVybmF0aXZlIHN1Z2dlc3Rpb25zCiAgKiB0aGF0IGRvbid0IHJlcXVpcmUgdXNlciB0byBoYXZlIGludGltYXRlIGtub3dsZWRnZSBvZiB0aGUgY2hpcCB3ZWxjb21lZC4KQEAgLTE0Nyw3ICsxMjksNyBAQAogCW1heDEzNjNfaW4xbWluMCwgbWF4MTM2M19pbjNtaW4yLAogCW1heDEzNjNfaW41bWluNCwgbWF4MTM2M19pbjdtaW42LAogCW1heDEzNjNfaW45bWluOCwgbWF4MTM2M19pbjExbWluMTAsCi0JfTsKK307CiAKIC8qIFRoaXMgbXVzdCBiZSBtYWludGFpbmVkIGFsb25nIHNpZGUgdGhlIG1heDEzNjNfbW9kZV90YWJsZSBpbiBtYXgxMzYzX2NvcmUgKi8KIGVudW0gbWF4MTM2M19tb2RlcyB7CkBAIC0xNzksNyArMTYxLDYgQEAKICAqIEBkZWZhdWx0X21vZGU6CXRoZSBzY2FuIG1vZGUgaW4gd2hpY2ggdGhlIGNoaXAgc3RhcnRzIHVwCiAgKi8KIHN0cnVjdCBtYXgxMzYzX2NoaXBfaW5mbyB7Ci0JY29uc3QgY2hhcgkJCSpuYW1lOwogCXU4CQkJCW51bV9pbnB1dHM7CiAJdTgJCQkJYml0czsKIAl1MTYJCQkJaW50X3ZyZWZfbXY7CkBAIC0xOTEsNyArMTcyLDYgQEAKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCQkqc2Nhbl9hdHRyczsKIH07CiAKLQogLyoqCiAgKiBzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAtIGRyaXZlciBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCiAgKiBAaW5kaW9fZGV2OgkJdGhlIGluZHVzdHJpYWwgSS9PIGRldmljZQpAQCAtMjA0LDEyICsxODQsMjAgQEAKICAqIEBwb2xsX3dvcms6CQlib3R0b20gaGFsZiBvZiBwb2xsaW5nIGludGVycnVwdCBoYW5kbGVyCiAgKiBAcHJvdGVjdF9yaW5nOgl1c2VkIHRvIGVuc3VyZSBvbmx5IG9uZSBwb2xsaW5nIGJoIHJ1bm5pbmcgYXQgYSB0aW1lCiAgKiBAcmVnOgkJc3VwcGx5IHJlZ3VsYXRvcgorICogQG1vbml0b3Jfb246CQl3aGV0aGVyIG1vbml0b3IgbW9kZSBpcyBlbmFibGVkCisgKiBAbW9uaXRvcl9zcGVlZDoJcGFyYW1ldGVyIGNvcnJlc3BvbmRpbmcgdG8gZGV2aWNlIG1vbml0b3Igc3BlZWQgc2V0dGluZworICogQG1hc2tfaGlnaDoJCWJpdG1hc2sgZm9yIGVuYWJsZWQgaGlnaCB0aHJlc2hvbGRzCisgKiBAbWFza19sb3c6CQliaXRtYXNrIGZvciBlbmFibGVkIGxvdyB0aHJlc2hvbGRzCisgKiBAdGhyZXNoX2hpZ2g6CWhpZ2ggdGhyZXNob2xkIHZhbHVlcworICogQHRocmVzaF9sb3c6CQlsb3cgdGhyZXNob2xkIHZhbHVlcworICogQGxhc3RfdGltZXN0YW1wOgl0aW1lc3RhbXAgb2YgbGFzdCBldmVudCBpbnRlcnJ1cHQKKyAqIEB0aHJlc2hfd29yazoJYmggd29yayBzdHJ1Y3R1cmUgZm9yIGV2ZW50IGhhbmRsaW5nCiAgKi8KIHN0cnVjdCBtYXgxMzYzX3N0YXRlIHsKIAlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CiAJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7Ci0JY2hhcgkJCQlzZXR1cGJ5dGU7Ci0JY2hhcgkJCQljb25maWdieXRlOworCXU4CQkJCXNldHVwYnl0ZTsKKwl1OAkJCQljb25maWdieXRlOwogCWNvbnN0IHN0cnVjdCBtYXgxMzYzX2NoaXBfaW5mbwkqY2hpcF9pbmZvOwogCWNvbnN0IHN0cnVjdCBtYXgxMzYzX21vZGUJKmN1cnJlbnRfbW9kZTsKIAl1MzIJCQkJcmVxdWVzdGVkbWFzazsKQEAgLTIxNyw2ICsyMDUsMTggQEAKIAlhdG9taWNfdAkJCXByb3RlY3RfcmluZzsKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOwogCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CisKKwkvKiBVc2luZyBtb25pdG9yIG1vZGVzIGFuZCBidWZmZXIgYXQgdGhlIHNhbWUgdGltZSBpcworCSAgIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkICovCisJYm9vbAkJCQltb25pdG9yX29uOworCXVuc2lnbmVkIGludAkJCW1vbml0b3Jfc3BlZWQ6MzsKKwl1OAkJCQltYXNrX2hpZ2g7CisJdTgJCQkJbWFza19sb3c7CisJLyogNHggdW5pcG9sYXIgZmlyc3QgdGhlbiB0aGUgZm91cnMgYmlwb2xhciBvbmVzICovCisJczE2CQkJCXRocmVzaF9oaWdoWzhdOworCXMxNgkJCQl0aHJlc2hfbG93WzhdOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXRocmVzaF93b3JrOwogfTsKIAogY29uc3Qgc3RydWN0IG1heDEzNjNfbW9kZQpAQCAtMjMwLDMyICsyMzAsMjEgQEAKIGludCBtYXgxMzYzX3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIG1heDEzNjNfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCi1pbnQgbWF4MTM2M19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci12b2lkIG1heDEzNjNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci0KICNlbHNlIC8qIENPTkZJR19NQVgxMzYzX1JJTkdfQlVGRkVSICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMzYzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci19OwotCi1zdGF0aWMgaW5saW5lIGludCBtYXgxMzYzX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXJldHVybiAwOwotfTsKLQogaW50IG1heDEzNjNfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKGxvbmcgbWFzaywgc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0KQogewogCXJldHVybiAtRUlOVkFMOwotfTsKLQorfQogCiBzdGF0aWMgaW5saW5lIGludAogbWF4MTM2M19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJcmV0dXJuIDA7Ci19OworfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWF4MTM2M19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldikge307CitzdGF0aWMgaW5saW5lIHZvaWQgbWF4MTM2M19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KICNlbmRpZiAvKiBDT05GSUdfTUFYMTM2M19SSU5HX0JVRkZFUiAqLwogI2VuZGlmIC8qIF9NQVgxMzYzX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfY29yZS5jCmluZGV4IDkwNWY4NTYuLjY0MzVlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfY29yZS5jCkBAIC0xOCwyMSArMTgsMTkgQEAKICAgKgogICAqIE5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCiAgICoKLSAgKiAtIE1vbml0b3IgaW50ZXJycnVwdCBnZW5lcmF0aW9uLgogICAqIC0gQ29udHJvbCBvZiBpbnRlcm5hbCByZWZlcmVuY2UuCiAgICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTQ4LDcgKzQ2LDcgQEAKIAlJSU9fU0NBTl9FTF9DKGluIyNudW1iZXIsIG51bWJlciwgSUlPX1VOU0lHTkVEKDE2KSwgMCwgTlVMTCk7CiAjZGVmaW5lIE1BWDEzNjNfU0NBTl9FTF9EKHAsIG4sIG51bWJlcikJCQkJCVwKIAlJSU9fU0NBTl9OQU1FRF9FTF9DKGluIyNwIyNtIyNpbiMjbiwgaW4jI3AtaW4jI24sCQlcCi0JCQludW1iZXIsIElJT19TSUdORUQoMTYpLCAwICwgTlVMTCk7CisJCQludW1iZXIsIElJT19TSUdORUQoMTYpLCAwLCBOVUxMKTsKIAogc3RhdGljIE1BWDEzNjNfU0NBTl9FTCgwKTsKIHN0YXRpYyBNQVgxMzYzX1NDQU5fRUwoMSk7CkBAIC0xNDgsNyArMTQ2LDcgQEAKIAkJCSAgICAgIG1hc2spKQogCQkJCXJldHVybiAmbWF4MTM2M19tb2RlX3RhYmxlW2NpLT5tb2RlX2xpc3RbaV1dOwogCXJldHVybiBOVUxMOwotfTsKK30KIAogc3RhdGljIHNzaXplX3QgbWF4MTM2M19zaG93X3ByZWNpc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0xNjcsNyArMTY1LDcgQEAKIAkJCQkgICAgICB1bnNpZ25lZCBjaGFyIGQyKQogewogCWludCByZXQ7Ci0JdTggKnR4X2J1ZiA9IGttYWxsb2MoMiAsIEdGUF9LRVJORUwpOworCXU4ICp0eF9idWYgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOwogCiAJaWYgKCF0eF9idWYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjA2LDYgKzIwNCwxNiBAQAogCWxvbmcgbWFzazsKIAogCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJLyoKKwkgKiBJZiBtb25pdG9yIG1vZGUgaXMgZW5hYmxlZCwgdGhlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHNpbmdsZQorCSAqIGNoYW5uZWwgd2lsbCBoYXZlIHRvIGJlIHJhdGhlciBkaWZmZXJlbnQgYW5kIGhhcyBub3QgeWV0CisJICogYmVlbiBpbXBsZW1lbnRlZC4KKwkgKi8KKwlpZiAoc3QtPm1vbml0b3Jfb24pIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKIAkvKiBJZiByaW5nIGJ1ZmZlciBjYXB0dXJlIGlzIG9jY3VyaW5nLCBxdWVyeSB0aGUgYnVmZmVyICovCiAJaWYgKGlpb19yaW5nX2VuYWJsZWQoZGV2X2luZm8pKSB7CiAJCW1hc2sgPSBtYXgxMzYzX21vZGVfdGFibGVbdGhpc19hdHRyLT5hZGRyZXNzXS5tb2RlbWFzazsKQEAgLTMwNSw3ICszMTMsNyBAQAogewogCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzdC0+Y2hpcF9pbmZvLT5uYW1lKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3QtPmNsaWVudC0+bmFtZSk7CiB9CiAKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgbWF4MTM2M19zaG93X25hbWUsIE5VTEwsIDApOwpAQCAtNTUyLDggKzU2MCw3IEBACiAKIC8qIG1heDEzNjMgYW5kIG1heDEzNjggdGVzdGVkIC0gcmVzdCBmcm9tIGRhdGEgc2hlZXQgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWF4MTM2M19jaGlwX2luZm8gbWF4MTM2M19jaGlwX2luZm9fdGJsW10gPSB7Ci0JewotCQkubmFtZSA9ICJtYXgxMzYxIiwKKwlbbWF4MTM2MV0gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMCwKIAkJLmludF92cmVmX212ID0gMjA0OCwKQEAgLTU2Myw4ICs1NzAsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTM2MiIsCisJfSwKKwlbbWF4MTM2Ml0gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMCwKIAkJLmludF92cmVmX212ID0gNDA5NiwKQEAgLTU3NCw4ICs1ODEsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTM2MyIsCisJfSwKKwlbbWF4MTM2M10gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMiwKIAkJLmludF92cmVmX212ID0gMjA0OCwKQEAgLTU4NSw4ICs1OTIsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTM2NCIsCisJfSwKKwlbbWF4MTM2NF0gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMiwKIAkJLmludF92cmVmX212ID0gNDA5NiwKQEAgLTU5Niw4ICs2MDMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTAzNiIsCisJfSwKKwlbbWF4MTAzNl0gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSA4LAogCQkuaW50X3ZyZWZfbXYgPSA0MDk2LApAQCAtNjA2LDggKzYxMyw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvMywKIAkJLmRldl9hdHRycyA9ICZtYXgxMzYzX2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMzYzX3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMDM3IiwKKwl9LAorCVttYXgxMDM3XSA9IHsKIAkJLm51bV9pbnB1dHMgPSA0LAogCQkuYml0cyA9IDgsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC02MTYsOCArNjIzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8zLAogCQkuZGV2X2F0dHJzID0gJm1heDEzNjNfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEzNjNfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDEwMzgiLAorCX0sCisJW21heDEwMzhdID0gewogCQkubnVtX2lucHV0cyA9IDEyLAogCQkuYml0cyA9IDgsCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCkBAIC02MjYsOCArNjMzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKIAkJLmRldl9hdHRycyA9ICZtYXgxMjM4X2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMjM4X3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMDM5IiwKKwl9LAorCVttYXgxMDM5XSA9IHsKIAkJLm51bV9pbnB1dHMgPSAxMiwKIAkJLmJpdHMgPSA4LAogCQkuaW50X3ZyZWZfbXYgPSAyMDQ4LApAQCAtNjM2LDggKzY0Myw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvMTEsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTIzOF9kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTIzOF9zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTEzNiIsCisJfSwKKwlbbWF4MTEzNl0gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMCwKIAkJLmludF92cmVmX212ID0gNDA5NiwKQEAgLTY0Niw4ICs2NTMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTEzNyIsCisJfSwKKwlbbWF4MTEzN10gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMCwKIAkJLmludF92cmVmX212ID0gMjA0OCwKQEAgLTY1Niw4ICs2NjMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTEzOCIsCisJfSwKKwlbbWF4MTEzOF0gPSB7CiAJCS5udW1faW5wdXRzID0gMTIsCiAJCS5iaXRzID0gMTAsCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCkBAIC02NjYsOCArNjczLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKIAkJLmRldl9hdHRycyA9ICZtYXgxMjM4X2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMjM4X3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMTM5IiwKKwl9LAorCVttYXgxMTM5XSA9IHsKIAkJLm51bV9pbnB1dHMgPSAxMiwKIAkJLmJpdHMgPSAxMCwKIAkJLmludF92cmVmX212ID0gMjA0OCwKQEAgLTY3Niw4ICs2ODMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLAogCQkuZGV2X2F0dHJzID0gJm1heDEyMzhfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEyMzhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDEyMzYiLAorCX0sCisJW21heDEyMzZdID0gewogCQkubnVtX2lucHV0cyA9IDQsCiAJCS5iaXRzID0gMTIsCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCkBAIC02ODYsOCArNjkzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8zLAogCQkuZGV2X2F0dHJzID0gJm1heDEzNjNfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEzNjNfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDEyMzciLAorCX0sCisJW21heDEyMzddID0gewogCQkubnVtX2lucHV0cyA9IDQsCiAJCS5iaXRzID0gMTIsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC02OTYsOCArNzAzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8zLAogCQkuZGV2X2F0dHJzID0gJm1heDEzNjNfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEzNjNfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDEyMzgiLAorCX0sCisJW21heDEyMzhdID0gewogCQkubnVtX2lucHV0cyA9IDEyLAogCQkuYml0cyA9IDEyLAogCQkuaW50X3ZyZWZfbXYgPSA0MDk2LApAQCAtNzA2LDggKzcxMyw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvMTEsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTIzOF9kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTIzOF9zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTIzOSIsCisJfSwKKwlbbWF4MTIzOV0gPSB7CiAJCS5udW1faW5wdXRzID0gMTIsCiAJCS5iaXRzID0gMTIsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC03MTYsOCArNzIzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKIAkJLmRldl9hdHRycyA9ICZtYXgxMjM4X2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMjM4X3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMTYwMCIsCisJfSwKKwlbbWF4MTE2MDBdID0gewogCQkubnVtX2lucHV0cyA9IDQsCiAJCS5iaXRzID0gOCwKIAkJLmludF92cmVmX212ID0gNDA5NiwKQEAgLTcyNiw4ICs3MzMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTE2MDEiLAorCX0sCisJW21heDExNjAxXSA9IHsKIAkJLm51bV9pbnB1dHMgPSA0LAogCQkuYml0cyA9IDgsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC03MzYsOCArNzQzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8zLAogCQkuZGV2X2F0dHJzID0gJm1heDEzNjNfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEzNjNfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjAyIiwKKwl9LAorCVttYXgxMTYwMl0gPSB7CiAJCS5udW1faW5wdXRzID0gOCwKIAkJLmJpdHMgPSA4LAogCQkuaW50X3ZyZWZfbXYgPSA0MDk2LApAQCAtNzQ2LDggKzc1Myw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvNywKIAkJLmRldl9hdHRycyA9ICZtYXgxMTYwOF9kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTE2MDhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjAzIiwKKwl9LAorCVttYXgxMTYwM10gPSB7CiAJCS5udW1faW5wdXRzID0gOCwKIAkJLmJpdHMgPSA4LAogCQkuaW50X3ZyZWZfbXYgPSAyMDQ4LApAQCAtNzU2LDggKzc2Myw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvNywKIAkJLmRldl9hdHRycyA9ICZtYXgxMTYwOF9kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTE2MDhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjA0IiwKKwl9LAorCVttYXgxMTYwNF0gPSB7CiAJCS5udW1faW5wdXRzID0gMTIsCiAJCS5iaXRzID0gOCwKIAkJLmludF92cmVmX212ID0gNDA5OCwKQEAgLTc2Niw4ICs3NzMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLAogCQkuZGV2X2F0dHJzID0gJm1heDEyMzhfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEyMzhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjA1IiwKKwl9LAorCVttYXgxMTYwNV0gPSB7CiAJCS5udW1faW5wdXRzID0gMTIsCiAJCS5iaXRzID0gOCwKIAkJLmludF92cmVmX212ID0gMjA0OCwKQEAgLTc3Niw4ICs3ODMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLAogCQkuZGV2X2F0dHJzID0gJm1heDEyMzhfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEyMzhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjA2IiwKKwl9LAorCVttYXgxMTYwNl0gPSB7CiAJCS5udW1faW5wdXRzID0gNCwKIAkJLmJpdHMgPSAxMCwKIAkJLmludF92cmVmX212ID0gNDA5NiwKQEAgLTc4Niw4ICs3OTMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzMsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTM2M19kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTM2M19zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTE2MDciLAorCX0sCisJW21heDExNjA3XSA9IHsKIAkJLm51bV9pbnB1dHMgPSA0LAogCQkuYml0cyA9IDEwLAogCQkuaW50X3ZyZWZfbXYgPSAyMDQ4LApAQCAtNzk2LDggKzgwMyw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvMywKIAkJLmRldl9hdHRycyA9ICZtYXgxMzYzX2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMzYzX3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMTYwOCIsCisJfSwKKwlbbWF4MTE2MDhdID0gewogCQkubnVtX2lucHV0cyA9IDgsCiAJCS5iaXRzID0gMTAsCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCkBAIC04MDYsOCArODEzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG83LAogCQkuZGV2X2F0dHJzID0gJm1heDExNjA4X2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMTYwOF9zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTE2MDkiLAorCX0sCisJW21heDExNjA5XSA9IHsKIAkJLm51bV9pbnB1dHMgPSA4LAogCQkuYml0cyA9IDEwLAogCQkuaW50X3ZyZWZfbXYgPSAyMDQ4LApAQCAtODE2LDggKzgyMyw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvNywKIAkJLmRldl9hdHRycyA9ICZtYXgxMTYwOF9kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTE2MDhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjEwIiwKKwl9LAorCVttYXgxMTYxMF0gPSB7CiAJCS5udW1faW5wdXRzID0gMTIsCiAJCS5iaXRzID0gMTAsCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTgsCkBAIC04MjYsOCArODMzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKIAkJLmRldl9hdHRycyA9ICZtYXgxMjM4X2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMjM4X3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMTYxMSIsCisJfSwKKwlbbWF4MTE2MTFdID0gewogCQkubnVtX2lucHV0cyA9IDEyLAogCQkuYml0cyA9IDEwLAogCQkuaW50X3ZyZWZfbXYgPSAyMDQ4LApAQCAtODM2LDggKzg0Myw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvMTEsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTIzOF9kZXZfYXR0cl9ncm91cCwKIAkJLnNjYW5fYXR0cnMgPSAmbWF4MTIzOF9zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTE2MTIiLAorCX0sCisJW21heDExNjEyXSA9IHsKIAkJLm51bV9pbnB1dHMgPSA0LAogCQkuYml0cyA9IDEyLAogCQkuaW50X3ZyZWZfbXYgPSA0MDk2LApAQCAtODQ2LDggKzg1Myw4IEBACiAJCS5kZWZhdWx0X21vZGUgPSBzMHRvMywKIAkJLmRldl9hdHRycyA9ICZtYXgxMzYzX2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMzYzX3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMTYxMyIsCisJfSwKKwlbbWF4MTE2MTNdID0gewogCQkubnVtX2lucHV0cyA9IDQsCiAJCS5iaXRzID0gMTIsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC04NTYsOCArODYzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8zLAogCQkuZGV2X2F0dHJzID0gJm1heDEzNjNfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEzNjNfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjE0IiwKKwl9LAorCVttYXgxMTYxNF0gPSB7CiAJCS5udW1faW5wdXRzID0gOCwKIAkJLmJpdHMgPSAxMiwKIAkJLmludF92cmVmX212ID0gNDA5NiwKQEAgLTg2Niw4ICs4NzMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzcsCiAJCS5kZXZfYXR0cnMgPSAmbWF4MTE2MDhfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDExNjA4X3NjYW5fZWxfZ3JvdXAsCi0JfSwgewotCQkubmFtZSA9ICJtYXgxMTYxNSIsCisJfSwKKwlbbWF4MTE2MTVdID0gewogCQkubnVtX2lucHV0cyA9IDgsCiAJCS5iaXRzID0gMTIsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC04NzYsOCArODgzLDggQEAKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG83LAogCQkuZGV2X2F0dHJzID0gJm1heDExNjA4X2Rldl9hdHRyX2dyb3VwLAogCQkuc2Nhbl9hdHRycyA9ICZtYXgxMTYwOF9zY2FuX2VsX2dyb3VwLAotCX0sIHsKLQkJLm5hbWUgPSAibWF4MTE2MTYiLAorCX0sCisJW21heDExNjE2XSA9IHsKIAkJLm51bV9pbnB1dHMgPSAxMiwKIAkJLmJpdHMgPSAxMiwKIAkJLmludF92cmVmX212ID0gNDA5OCwKQEAgLTg4Niw4ICs4OTMsOCBAQAogCQkuZGVmYXVsdF9tb2RlID0gczB0bzExLAogCQkuZGV2X2F0dHJzID0gJm1heDEyMzhfZGV2X2F0dHJfZ3JvdXAsCiAJCS5zY2FuX2F0dHJzID0gJm1heDEyMzhfc2Nhbl9lbF9ncm91cCwKLQl9LCB7Ci0JCS5uYW1lID0gIm1heDExNjE3IiwKKwl9LAorCVttYXgxMTYxN10gPSB7CiAJCS5udW1faW5wdXRzID0gMTIsCiAJCS5iaXRzID0gMTIsCiAJCS5pbnRfdnJlZl9tdiA9IDIwNDgsCkBAIC04OTksNiArOTA2LDY2OCBAQAogCX0KIH07CiAKK3N0YXRpYyBjb25zdCBpbnQgbWF4MTM2M19tb25pdG9yX3NwZWVkc1tdID0geyAxMzMwMDAsIDY2NTAwMCwgMzMzMDAsIDE2NjAwLAorCQkJCQkgICAgICA4MzAwLCA0MjAwLCAyMDAwLCAxMDAwIH07CisKK3N0YXRpYyBzc2l6ZV90IG1heDEzNjNfbW9uaXRvcl9zaG93X2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBtYXgxMzYzX21vbml0b3Jfc3BlZWRzW3N0LT5tb25pdG9yX3NwZWVkXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1heDEzNjNfbW9uaXRvcl9zdG9yZV9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgdmFsOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1heDEzNjNfbW9uaXRvcl9zcGVlZHMpOyBpKyspCisJCWlmICh2YWwgPT0gbWF4MTM2M19tb25pdG9yX3NwZWVkc1tpXSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJc3QtPm1vbml0b3Jfc3BlZWQgPSBpOworCW11dGV4X3VubG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lSVUdPIHwgU19JV1VTUiwKKwkJCW1heDEzNjNfbW9uaXRvcl9zaG93X2ZyZXEsCisJCQltYXgxMzYzX21vbml0b3Jfc3RvcmVfZnJlcSk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihzYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLAorCQkiMTMzMDAwIDY2NTAwMCAzMzMwMCAxNjYwMCA4MzAwIDQyMDAgMjAwMCAxMDAwIik7CisKK3N0YXRpYyBzc2l6ZV90IG1heDEzNjNfc2hvd190aHJlc2goc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZiwKKwkJCQlib29sIGhpZ2gpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJaWYgKGhpZ2gpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJc3QtPnRocmVzaF9oaWdoW3RoaXNfYXR0ci0+YWRkcmVzc10pOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQlzdC0+dGhyZXNoX2xvd1t0aGlzX2F0dHItPmFkZHJlc3MgJiAweDddKTsKK30KKworc3RhdGljIHNzaXplX3QgbWF4MTM2M19zaG93X3RocmVzaF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gbWF4MTM2M19zaG93X3RocmVzaChkZXYsIGF0dHIsIGJ1ZiwgZmFsc2UpOworfQorCitzdGF0aWMgc3NpemVfdCBtYXgxMzYzX3Nob3dfdGhyZXNoX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBtYXgxMzYzX3Nob3dfdGhyZXNoKGRldiwgYXR0ciwgYnVmLCB0cnVlKTsKK30KKworc3RhdGljIHNzaXplX3QgbWF4MTM2M19zdG9yZV90aHJlc2hfdW5zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgbGVuLAorCQkJCQlib29sIGhpZ2gpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKHN0LT5jaGlwX2luZm8tPmJpdHMpIHsKKwljYXNlIDEwOgorCQlpZiAodmFsID4gMHgzRkYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJaWYgKHZhbCA+IDB4RkZGKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaGlnaCkgeworCWNhc2UgMToKKwkJc3QtPnRocmVzaF9oaWdoW3RoaXNfYXR0ci0+YWRkcmVzc10gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJc3QtPnRocmVzaF9sb3dbdGhpc19hdHRyLT5hZGRyZXNzICYgMHg3XSA9IHZhbDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIG1heDEzNjNfc3RvcmVfdGhyZXNoX3Vuc2lnbmVkKGRldiwgYXR0ciwgYnVmLCBsZW4sIHRydWUpOworfQorCitzdGF0aWMgc3NpemVfdCBtYXgxMzYzX3N0b3JlX3RocmVzaF9sb3dfdW5zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCQlzaXplX3QgbGVuKQoreworCXJldHVybiBtYXgxMzYzX3N0b3JlX3RocmVzaF91bnNpZ25lZChkZXYsIGF0dHIsIGJ1ZiwgbGVuLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1heDEzNjNfc3RvcmVfdGhyZXNoX3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4sCisJCQkJCWJvb2wgaGlnaCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoIChzdC0+Y2hpcF9pbmZvLT5iaXRzKSB7CisJY2FzZSAxMDoKKwkJaWYgKHZhbCA8IC01MTIgfHwgdmFsID4gNTExKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWlmICh2YWwgPCAtMjA0OCB8fCB2YWwgPiAyMDQ3KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaGlnaCkgeworCWNhc2UgMToKKwkJc3QtPnRocmVzaF9oaWdoW3RoaXNfYXR0ci0+YWRkcmVzc10gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJc3QtPnRocmVzaF9sb3dbdGhpc19hdHRyLT5hZGRyZXNzICYgMHg3XSA9IHZhbDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCQlzaXplX3QgbGVuKQoreworCXJldHVybiBtYXgxMzYzX3N0b3JlX3RocmVzaF9zaWduZWQoZGV2LCBhdHRyLCBidWYsIGxlbiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1heDEzNjNfc3RvcmVfdGhyZXNoX2xvd19zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCQlzaXplX3QgbGVuKQoreworCXJldHVybiBtYXgxMzYzX3N0b3JlX3RocmVzaF9zaWduZWQoZGV2LCBhdHRyLCBidWYsIGxlbiwgZmFsc2UpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMF90aHJlc2hfaGlnaF92YWx1ZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCW1heDEzNjNfc2hvd190aHJlc2hfaGlnaCwKKwkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF91bnNpZ25lZCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMF90aHJlc2hfbG93X3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCW1heDEzNjNfc3RvcmVfdGhyZXNoX2xvd191bnNpZ25lZCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMV90aHJlc2hfaGlnaF92YWx1ZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCW1heDEzNjNfc2hvd190aHJlc2hfaGlnaCwKKwkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF91bnNpZ25lZCwgMSk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMV90aHJlc2hfbG93X3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCW1heDEzNjNfc3RvcmVfdGhyZXNoX2xvd191bnNpZ25lZCwgMSk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMl90aHJlc2hfaGlnaF92YWx1ZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCW1heDEzNjNfc2hvd190aHJlc2hfaGlnaCwKKwkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF91bnNpZ25lZCwgMik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMl90aHJlc2hfbG93X3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCW1heDEzNjNfc3RvcmVfdGhyZXNoX2xvd191bnNpZ25lZCwgMik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluM190aHJlc2hfaGlnaF92YWx1ZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCW1heDEzNjNfc2hvd190aHJlc2hfaGlnaCwKKwkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF91bnNpZ25lZCwgMyk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluM190aHJlc2hfbG93X3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCW1heDEzNjNfc3RvcmVfdGhyZXNoX2xvd191bnNpZ25lZCwgMyk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQoaW4wbWluMV90aHJlc2hfaGlnaF92YWx1ZSwKKwkJCWluMC1pbjFfdGhyZXNoX2hpZ2hfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9oaWdoLAorCQkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF9zaWduZWQsIDQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUl9OQU1FRChpbjBtaW4xX3RocmVzaF9sb3dfdmFsdWUsCisJCQlpbjAtaW4xX3RocmVzaF9sb3dfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCQltYXgxMzYzX3N0b3JlX3RocmVzaF9sb3dfc2lnbmVkLCA0KTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQoaW4ybWluM190aHJlc2hfaGlnaF92YWx1ZSwKKwkJCWluMi1pbjNfdGhyZXNoX2hpZ2hfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9oaWdoLAorCQkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF9zaWduZWQsIDUpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUl9OQU1FRChpbjJtaW4zX3RocmVzaF9sb3dfdmFsdWUsCisJCQlpbjItaW4zX3RocmVzaF9sb3dfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCQltYXgxMzYzX3N0b3JlX3RocmVzaF9sb3dfc2lnbmVkLCA1KTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQoaW4xbWluMF90aHJlc2hfaGlnaF92YWx1ZSwKKwkJCWluMS1pbjBfdGhyZXNoX2hpZ2hfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9oaWdoLAorCQkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF9zaWduZWQsIDYpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUl9OQU1FRChpbjFtaW4wX3RocmVzaF9sb3dfdmFsdWUsCisJCQlpbjEtaW4wX3RocmVzaF9sb3dfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCQltYXgxMzYzX3N0b3JlX3RocmVzaF9sb3dfc2lnbmVkLCA2KTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQoaW4zbWluMl90aHJlc2hfaGlnaF92YWx1ZSwKKwkJCWluMy1pbjJfdGhyZXNoX2hpZ2hfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9oaWdoLAorCQkJbWF4MTM2M19zdG9yZV90aHJlc2hfaGlnaF9zaWduZWQsIDcpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUl9OQU1FRChpbjNtaW4yX3RocmVzaF9sb3dfdmFsdWUsCisJCQlpbjMtaW4yX3RocmVzaF9sb3dfdmFsdWUsCisJCQlTX0lSVUdPIHwgU19JV1VTUiwgbWF4MTM2M19zaG93X3RocmVzaF9sb3csCisJCQltYXgxMzYzX3N0b3JlX3RocmVzaF9sb3dfc2lnbmVkLCA3KTsKKworc3RhdGljIGludCBtYXgxMzYzX2ludF90aChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCQlpbnQgaW5kZXgsCisJCQlzNjQgdGltZXN0YW1wLAorCQkJaW50IG5vdF90ZXN0KQoreworCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZzdC0+dGhyZXNoX3dvcmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXgxMzYzX3RocmVzaF9oYW5kbGVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBtYXgxMzYzX3N0YXRlLAorCQkJCQkJdGhyZXNoX3dvcmspOworCXU4IHJ4OworCXU4IHR4WzJdID0geyBzdC0+c2V0dXBieXRlLAorCQkgICAgIE1BWDEzNjNfTU9OX0lOVF9FTkFCTEUgfCAoc3QtPm1vbml0b3Jfc3BlZWQgPDwgMSkgfCAweEYwIH07CisKKwlpMmNfbWFzdGVyX3JlY3Yoc3QtPmNsaWVudCwgJnJ4LCAxKTsKKwlpZiAocnggJiAoMSA8PCAwKSkKKwkJaWlvX3B1c2hfZXZlbnQoc3QtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0lOX0xPV19USFJFU0goMyksCisJCQlzdC0+bGFzdF90aW1lc3RhbXApOworCWlmIChyeCAmICgxIDw8IDEpKQorCQlpaW9fcHVzaF9ldmVudChzdC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfSU5fSElHSF9USFJFU0goMyksCisJCQlzdC0+bGFzdF90aW1lc3RhbXApOworCWlmIChyeCAmICgxIDw8IDIpKQorCQlpaW9fcHVzaF9ldmVudChzdC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfSU5fTE9XX1RIUkVTSCgyKSwKKwkJCXN0LT5sYXN0X3RpbWVzdGFtcCk7CisJaWYgKHJ4ICYgKDEgPDwgMykpCisJCWlpb19wdXNoX2V2ZW50KHN0LT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9JTl9ISUdIX1RIUkVTSCgyKSwKKwkJCXN0LT5sYXN0X3RpbWVzdGFtcCk7CisJaWYgKHJ4ICYgKDEgPDwgNCkpCisJCWlpb19wdXNoX2V2ZW50KHN0LT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9JTl9MT1dfVEhSRVNIKDEpLAorCQkJc3QtPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAocnggJiAoMSA8PCA1KSkKKwkJaWlvX3B1c2hfZXZlbnQoc3QtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0lOX0hJR0hfVEhSRVNIKDEpLAorCQkJc3QtPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAocnggJiAoMSA8PCA2KSkKKwkJaWlvX3B1c2hfZXZlbnQoc3QtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0lOX0xPV19USFJFU0goMCksCisJCQlzdC0+bGFzdF90aW1lc3RhbXApOworCWlmIChyeCAmICgxIDw8IDcpKQorCQlpaW9fcHVzaF9ldmVudChzdC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfSU5fSElHSF9USFJFU0goMCksCisJCQlzdC0+bGFzdF90aW1lc3RhbXApOworCWVuYWJsZV9pcnEoc3QtPmNsaWVudC0+aXJxKTsKKwlpMmNfbWFzdGVyX3NlbmQoc3QtPmNsaWVudCwgdHgsIDIpOworfQorCitzdGF0aWMgc3NpemVfdCBtYXgxMzYzX3JlYWRfaW50ZXJydXB0X2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb19ldmVudF9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZXZlbnRfYXR0cihhdHRyKTsKKwlpbnQgdmFsOworCisJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwlpZiAodGhpc19hdHRyLT5tYXNrICYgMHg4KQorCQl2YWwgPSAoMSA8PCAodGhpc19hdHRyLT5tYXNrICYgMHg3KSkgJiBzdC0+bWFza19sb3c7CisJZWxzZQorCQl2YWwgPSAoMSA8PCB0aGlzX2F0dHItPm1hc2spICYgc3QtPm1hc2tfaGlnaDsKKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISF2YWwpOworfQorCitzdGF0aWMgaW50IG1heDEzNjNfbW9uaXRvcl9tb2RlX3VwZGF0ZShzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QsIGludCBlbmFibGVkKQoreworCXU4ICp0eF9idWY7CisJaW50IHJldCwgaSA9IDMsIGo7CisJdW5zaWduZWQgbG9uZyBudW1lbGVtZW50czsKKwlpbnQgbGVuOworCWxvbmcgbW9kZW1hc2s7CisKKwlpZiAoIWVuYWJsZWQpIHsKKwkJLyogdHJhbnNpdGlvbiB0byByaW5nIGNhcHR1cmUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKwkJc3QtPnNldHVwYnl0ZSAmPSB+TUFYMTM2M19TRVRVUF9NT05JVE9SX1NFVFVQOworCQlzdC0+Y29uZmlnYnl0ZSAmPSB+TUFYMTM2M19TQ0FOX01BU0s7CisJCXN0LT5tb25pdG9yX29uID0gZmFsc2U7CisJCXJldHVybiBtYXgxMzYzX3dyaXRlX2Jhc2ljX2NvbmZpZyhzdC0+Y2xpZW50LAorCQkJCQkJc3QtPnNldHVwYnl0ZSwKKwkJCQkJCXN0LT5jb25maWdieXRlKTsKKwl9CisKKwkvKiBFbnN1cmUgd2UgYXJlIGluIHRoZSByZWxldmFudCBtb2RlICovCisJc3QtPnNldHVwYnl0ZSB8PSBNQVgxMzYzX1NFVFVQX01PTklUT1JfU0VUVVA7CisJc3QtPmNvbmZpZ2J5dGUgJj0gfihNQVgxMzYzX0NIQU5ORUxfU0VMX01BU0sKKwkJCSAgICB8IE1BWDEzNjNfU0NBTl9NQVNLCisJCQl8IE1BWDEzNjNfU0VfREVfTUFTSyk7CisJc3QtPmNvbmZpZ2J5dGUgfD0gTUFYMTM2M19DT05GSUdfU0NBTl9NT05JVE9SX01PREU7CisJaWYgKChzdC0+bWFza19sb3cgfCBzdC0+bWFza19oaWdoKSAmIDB4MEYpIHsKKwkJc3QtPmNvbmZpZ2J5dGUgfD0gbWF4MTM2M19tb2RlX3RhYmxlW3MwdG8zXS5jb25mOworCQltb2RlbWFzayA9IG1heDEzNjNfbW9kZV90YWJsZVtzMHRvM10ubW9kZW1hc2s7CisJfSBlbHNlIGlmICgoc3QtPm1hc2tfbG93IHwgc3QtPm1hc2tfaGlnaCkgJiAweDMwKSB7CisJCXN0LT5jb25maWdieXRlIHw9IG1heDEzNjNfbW9kZV90YWJsZVtkMG0xdG8ybTNdLmNvbmY7CisJCW1vZGVtYXNrID0gbWF4MTM2M19tb2RlX3RhYmxlW2QwbTF0bzJtM10ubW9kZW1hc2s7CisJfSBlbHNlIHsKKwkJc3QtPmNvbmZpZ2J5dGUgfD0gbWF4MTM2M19tb2RlX3RhYmxlW2QxbTB0bzNtMl0uY29uZjsKKwkJbW9kZW1hc2sgPSBtYXgxMzYzX21vZGVfdGFibGVbZDFtMHRvM20yXS5tb2RlbWFzazsKKwl9CisJbnVtZWxlbWVudHMgPSBod2VpZ2h0X2xvbmcobW9kZW1hc2spOworCWxlbiA9IDMgKiBudW1lbGVtZW50cyArIDM7CisJdHhfYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghdHhfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwl0eF9idWZbMF0gPSBzdC0+Y29uZmlnYnl0ZTsKKwl0eF9idWZbMV0gPSBzdC0+c2V0dXBieXRlOworCXR4X2J1ZlsyXSA9IChzdC0+bW9uaXRvcl9zcGVlZCA8PCAxKTsKKworCS8qCisJICogU28gd2UgbmVlZCB0byBkbyB5ZXQgYW5vdGhlciBiaXQgb2YgbmVmYXJpb3VzIHNjYW4gbW9kZQorCSAqIHNldHVwIHRvIG1hdGNoIHdoYXQgd2UgbmVlZC4KKwkgKi8KKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQlpZiAobW9kZW1hc2sgJiAoMSA8PCBqKSkgeworCQkJLyogRXN0YWJsaXNoIHRoZSBtb2RlIGlzIGluIHRoZSBzY2FuICovCisJCQlpZiAoc3QtPm1hc2tfbG93ICYgKDEgPDwgaikpIHsKKwkJCQl0eF9idWZbaV0gPSAoc3QtPnRocmVzaF9sb3dbal0gPj4gNCkgJiAweEZGOworCQkJCXR4X2J1ZltpICsgMV0gPSAoc3QtPnRocmVzaF9sb3dbal0gPDwgNCkgJiAweEYwOworCQkJfSBlbHNlIGlmIChqIDwgNCkgeworCQkJCXR4X2J1ZltpXSA9IDA7CisJCQkJdHhfYnVmW2kgKyAxXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCXR4X2J1ZltpXSA9IDB4ODA7CisJCQkJdHhfYnVmW2kgKyAxXSA9IDA7CisJCQl9CisJCQlpZiAoc3QtPm1hc2tfaGlnaCAmICgxIDw8IGopKSB7CisJCQkJdHhfYnVmW2kgKyAxXSB8PQorCQkJCQkoc3QtPnRocmVzaF9oaWdoW2pdID4+IDgpICYgMHgwRjsKKwkJCQl0eF9idWZbaSArIDJdID0gc3QtPnRocmVzaF9oaWdoW2pdICYgMHhGRjsKKwkJCX0gZWxzZSBpZiAoaiA8IDQpIHsKKwkJCQl0eF9idWZbaSArIDFdIHw9IDB4MEY7CisJCQkJdHhfYnVmW2kgKyAyXSA9IDB4RkY7CisJCQl9IGVsc2UgeworCQkJCXR4X2J1ZltpICsgMV0gfD0gMHgwNzsKKwkJCQl0eF9idWZbaSArIDJdID0gMHhGRjsKKwkJCX0KKwkJCWkgKz0gMzsKKwkJfQorCisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc3QtPmNsaWVudCwgdHhfYnVmLCBsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3JldDsKKwlpZiAocmV0ICE9IGxlbikgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlIGhvcGVmdWxseSBoYXZlIHNlbnNpYmxlIHRocmVzaG9sZHMgaW4gcGxhY2UgaXQgaXMKKwkgKiB0aW1lIHRvIHR1cm4gdGhlIGludGVycnVwdHMgb24uCisJICogSXQgaXMgdW5jbGVhciBmcm9tIHRoZSBkYXRhIHNoZWV0IGlmIHRoaXMgc2hvdWxkIGJlIG5lY2Vzc2FyeQorCSAqIChpLmUuIHdoZXRoZXIgbW9uaXRvciBtb2RlIHNldHVwIGlzIGF0b21pYykgYnV0IGl0IGFwcGVhcnMgdG8KKwkgKiBiZSBpbiBwcmFjdGljZS4KKwkgKi8KKwl0eF9idWZbMF0gPSBzdC0+c2V0dXBieXRlOworCXR4X2J1ZlsxXSA9IE1BWDEzNjNfTU9OX0lOVF9FTkFCTEUgfCAoc3QtPm1vbml0b3Jfc3BlZWQgPDwgMSkgfCAweEYwOworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+Y2xpZW50LCB0eF9idWYsIDIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3JldDsKKwlpZiAocmV0ICE9IDIpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IDA7CisJc3QtPm1vbml0b3Jfb24gPSB0cnVlOworZXJyb3JfcmV0OgorCisJa2ZyZWUodHhfYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUbyBrZWVwIHRoaXMgbWFuYWdhYmxlIHdlIGFsd2F5cyB1c2Ugb25lIG9mIDMgc2NhbiBtb2Rlcy4KKyAqIFNjYW4gMC4uLjMsIDAtMSwyLTMgYW5kIDEtMCwzLTIKKyAqLworc3RhdGljIGlubGluZSBpbnQgX19tYXgxMzYzX2NoZWNrX2V2ZW50X21hc2soaW50IHRoaXNtYXNrLCBpbnQgY2hlY2ttYXNrKQoreworCWludCByZXQgPSAwOworCS8qIElzIGl0IHVuaXBvbGFyICovCisJaWYgKHRoaXNtYXNrIDwgNCkgeworCQlpZiAoY2hlY2ttYXNrICYgfjB4MEYpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJfSBlbHNlIGlmICh0aGlzbWFzayA8IDYpIHsKKwkJaWYgKGNoZWNrbWFzayAmIH4weDMwKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCX0gZWxzZSBpZiAoY2hlY2ttYXNrICYgfjB4QzApCisJCXJldCA9IC1FQlVTWTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBtYXgxMzYzX3dyaXRlX2ludGVycnVwdF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZXZlbnRfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2V2ZW50X2F0dHIoYXR0cik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1MTYgdW5pZmllZG1hc2s7CisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmc3QtPmluZGlvX2Rldi0+bWxvY2spOworCXVuaWZpZWRtYXNrID0gc3QtPm1hc2tfbG93IHwgc3QtPm1hc2tfaGlnaDsKKwlpZiAodGhpc19hdHRyLT5tYXNrICYgMHgwOCkgeworCQkvKiBJZiB3ZSBhcmUgZGlzYWJsaW5nIG5vIG5lZWQgdG8gdGVzdCAqLworCQlpZiAodmFsID09IDApCisJCQlzdC0+bWFza19sb3cgJj0gfigxIDw8ICh0aGlzX2F0dHItPm1hc2sgJiAweDcpKTsKKwkJZWxzZSB7CisJCQlyZXQgPSBfX21heDEzNjNfY2hlY2tfZXZlbnRfbWFzayh0aGlzX2F0dHItPm1hc2sgJiAweDcsCisJCQkJCQkJdW5pZmllZG1hc2spOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3JldDsKKwkJCXN0LT5tYXNrX2xvdyB8PSAoMSA8PCAodGhpc19hdHRyLT5tYXNrICYgMHg3KSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodmFsID09IDApCisJCQlzdC0+bWFza19oaWdoICY9IH4oMSA8PCAodGhpc19hdHRyLT5tYXNrKSk7CisJCWVsc2UgeworCQkJcmV0ID0gX19tYXgxMzYzX2NoZWNrX2V2ZW50X21hc2sodGhpc19hdHRyLT5tYXNrLAorCQkJCQkJCXVuaWZpZWRtYXNrKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcl9yZXQ7CisJCQlzdC0+bWFza19oaWdoIHw9ICgxIDw8IHRoaXNfYXR0ci0+bWFzayk7CisJCX0KKwl9CisJaWYgKHN0LT5tb25pdG9yX29uICYmICFzdC0+bWFza19oaWdoICYmICFzdC0+bWFza19sb3cpCisJCWlpb19yZW1vdmVfZXZlbnRfZnJvbV9saXN0KHRoaXNfYXR0ci0+bGlzdGVsLAorCQkJCQkmZGV2X2luZm8tPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCWlmICghc3QtPm1vbml0b3Jfb24gJiYgdmFsKQorCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QodGhpc19hdHRyLT5saXN0ZWwsCisJCQkJJmRldl9pbmZvLT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKworCW1heDEzNjNfbW9uaXRvcl9tb2RlX3VwZGF0ZShzdCwgISEoc3QtPm1hc2tfaGlnaCB8IHN0LT5tYXNrX2xvdykpOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworSUlPX0VWRU5UX1NIKG1heDEzNjNfdGhyZXNoLCBtYXgxMzYzX2ludF90aCk7CisKKyNkZWZpbmUgTUFYMTM2M19ISUdIX1RIUkVTSChhKSBhCisjZGVmaW5lIE1BWDEzNjNfTE9XX1RIUkVTSChhKSAoYSB8IDB4OCkKKworSUlPX0VWRU5UX0FUVFJfU0goaW4wX3RocmVzaF9oaWdoX2VuLAorCQlpaW9fZXZlbnRfbWF4MTM2M190aHJlc2gsCisJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQltYXgxMzYzX3dyaXRlX2ludGVycnVwdF9jb25maWcsCisJCU1BWDEzNjNfSElHSF9USFJFU0goMCkpOworCitJSU9fRVZFTlRfQVRUUl9TSChpbjBfdGhyZXNoX2xvd19lbiwKKwkJaWlvX2V2ZW50X21heDEzNjNfdGhyZXNoLAorCQltYXgxMzYzX3JlYWRfaW50ZXJydXB0X2NvbmZpZywKKwkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQlNQVgxMzYzX0xPV19USFJFU0goMCkpOworCitJSU9fRVZFTlRfQVRUUl9TSChpbjFfdGhyZXNoX2hpZ2hfZW4sCisJCWlpb19ldmVudF9tYXgxMzYzX3RocmVzaCwKKwkJbWF4MTM2M19yZWFkX2ludGVycnVwdF9jb25maWcsCisJCW1heDEzNjNfd3JpdGVfaW50ZXJydXB0X2NvbmZpZywKKwkJTUFYMTM2M19ISUdIX1RIUkVTSCgxKSk7CisKK0lJT19FVkVOVF9BVFRSX1NIKGluMV90aHJlc2hfbG93X2VuLAorCQlpaW9fZXZlbnRfbWF4MTM2M190aHJlc2gsCisJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQltYXgxMzYzX3dyaXRlX2ludGVycnVwdF9jb25maWcsCisJCU1BWDEzNjNfTE9XX1RIUkVTSCgxKSk7CisKK0lJT19FVkVOVF9BVFRSX1NIKGluMl90aHJlc2hfaGlnaF9lbiwKKwkJaWlvX2V2ZW50X21heDEzNjNfdGhyZXNoLAorCQltYXgxMzYzX3JlYWRfaW50ZXJydXB0X2NvbmZpZywKKwkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQlNQVgxMzYzX0hJR0hfVEhSRVNIKDIpKTsKKworSUlPX0VWRU5UX0FUVFJfU0goaW4yX3RocmVzaF9sb3dfZW4sCisJCWlpb19ldmVudF9tYXgxMzYzX3RocmVzaCwKKwkJbWF4MTM2M19yZWFkX2ludGVycnVwdF9jb25maWcsCisJCW1heDEzNjNfd3JpdGVfaW50ZXJydXB0X2NvbmZpZywKKwkJTUFYMTM2M19MT1dfVEhSRVNIKDIpKTsKKworSUlPX0VWRU5UX0FUVFJfU0goaW4zX3RocmVzaF9oaWdoX2VuLAorCQlpaW9fZXZlbnRfbWF4MTM2M190aHJlc2gsCisJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQltYXgxMzYzX3dyaXRlX2ludGVycnVwdF9jb25maWcsCisJCU1BWDEzNjNfSElHSF9USFJFU0goMykpOworCitJSU9fRVZFTlRfQVRUUl9TSChpbjNfdGhyZXNoX2xvd19lbiwKKwkJaWlvX2V2ZW50X21heDEzNjNfdGhyZXNoLAorCQltYXgxMzYzX3JlYWRfaW50ZXJydXB0X2NvbmZpZywKKwkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQlNQVgxMzYzX0xPV19USFJFU0goMykpOworCitJSU9fRVZFTlRfQVRUUl9OQU1FRF9TSChpbjBtaW4xX3RocmVzaF9oaWdoX2VuLAorCQkJaW4wLWluMV90aHJlc2hfaGlnaF9lbiwKKwkJCWlpb19ldmVudF9tYXgxMzYzX3RocmVzaCwKKwkJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQkJTUFYMTM2M19ISUdIX1RIUkVTSCg0KSk7CisKK0lJT19FVkVOVF9BVFRSX05BTUVEX1NIKGluMG1pbjFfdGhyZXNoX2xvd19lbiwKKwkJCWluMC1pbjFfdGhyZXNoX2xvd19lbiwKKwkJCWlpb19ldmVudF9tYXgxMzYzX3RocmVzaCwKKwkJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQkJTUFYMTM2M19MT1dfVEhSRVNIKDQpKTsKKworSUlPX0VWRU5UX0FUVFJfTkFNRURfU0goaW4zbWluMl90aHJlc2hfaGlnaF9lbiwKKwkJCWluMy1pbjJfdGhyZXNoX2hpZ2hfZW4sCisJCQlpaW9fZXZlbnRfbWF4MTM2M190aHJlc2gsCisJCQltYXgxMzYzX3JlYWRfaW50ZXJydXB0X2NvbmZpZywKKwkJCW1heDEzNjNfd3JpdGVfaW50ZXJydXB0X2NvbmZpZywKKwkJCU1BWDEzNjNfSElHSF9USFJFU0goNSkpOworCitJSU9fRVZFTlRfQVRUUl9OQU1FRF9TSChpbjNtaW4yX3RocmVzaF9sb3dfZW4sCisJCQlpbjMtaW4yX3RocmVzaF9sb3dfZW4sCisJCQlpaW9fZXZlbnRfbWF4MTM2M190aHJlc2gsCisJCQltYXgxMzYzX3JlYWRfaW50ZXJydXB0X2NvbmZpZywKKwkJCW1heDEzNjNfd3JpdGVfaW50ZXJydXB0X2NvbmZpZywKKwkJCU1BWDEzNjNfTE9XX1RIUkVTSCg1KSk7CisKK0lJT19FVkVOVF9BVFRSX05BTUVEX1NIKGluMW1pbjBfdGhyZXNoX2hpZ2hfZW4sCisJCQlpbjEtaW4wX3RocmVzaF9oaWdoX2VuLAorCQkJaWlvX2V2ZW50X21heDEzNjNfdGhyZXNoLAorCQkJbWF4MTM2M19yZWFkX2ludGVycnVwdF9jb25maWcsCisJCQltYXgxMzYzX3dyaXRlX2ludGVycnVwdF9jb25maWcsCisJCQlNQVgxMzYzX0hJR0hfVEhSRVNIKDYpKTsKKworSUlPX0VWRU5UX0FUVFJfTkFNRURfU0goaW4xbWluMF90aHJlc2hfbG93X2VuLAorCQkJaW4xLWluMF90aHJlc2hfbG93X2VuLAorCQkJaWlvX2V2ZW50X21heDEzNjNfdGhyZXNoLAorCQkJbWF4MTM2M19yZWFkX2ludGVycnVwdF9jb25maWcsCisJCQltYXgxMzYzX3dyaXRlX2ludGVycnVwdF9jb25maWcsCisJCQlNQVgxMzYzX0xPV19USFJFU0goNikpOworCitJSU9fRVZFTlRfQVRUUl9OQU1FRF9TSChpbjJtaW4zX3RocmVzaF9oaWdoX2VuLAorCQkJaW4yLWluM190aHJlc2hfaGlnaF9lbiwKKwkJCWlpb19ldmVudF9tYXgxMzYzX3RocmVzaCwKKwkJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQkJTUFYMTM2M19ISUdIX1RIUkVTSCg3KSk7CisKK0lJT19FVkVOVF9BVFRSX05BTUVEX1NIKGluMm1pbjNfdGhyZXNoX2xvd19lbiwKKwkJCWluMi1pbjNfdGhyZXNoX2xvd19lbiwKKwkJCWlpb19ldmVudF9tYXgxMzYzX3RocmVzaCwKKwkJCW1heDEzNjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCQkJbWF4MTM2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnLAorCQkJTUFYMTM2M19MT1dfVEhSRVNIKDcpKTsKKworLyoKKyAqIEFzIHdpdGggc2Nhbl9lbGVtZW50cywgb25seSBjZXJ0YWluIHNldHMgb2YgdGhlc2UgY2FuCisgKiBiZSBjb21iaW5lZC4KKyAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1heDEzNjNfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfaW4wX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjBfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4xX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4yX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjJfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4zX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjNfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4wbWluMV90aHJlc2hfaGlnaF92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4wbWluMV90aHJlc2hfbG93X3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjJtaW4zX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjJtaW4zX3RocmVzaF9sb3dfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMW1pbjBfdGhyZXNoX2hpZ2hfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMW1pbjBfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4zbWluMl90aHJlc2hfaGlnaF92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4zbWluMl90aHJlc2hfbG93X3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjBfdGhyZXNoX2hpZ2hfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4wX3RocmVzaF9sb3dfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4xX3RocmVzaF9oaWdoX2VuLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2luMV90aHJlc2hfbG93X2VuLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2luMl90aHJlc2hfaGlnaF9lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjJfdGhyZXNoX2xvd19lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjNfdGhyZXNoX2hpZ2hfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4zX3RocmVzaF9sb3dfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4wbWluMV90aHJlc2hfaGlnaF9lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjBtaW4xX3RocmVzaF9sb3dfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4zbWluMl90aHJlc2hfaGlnaF9lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjNtaW4yX3RocmVzaF9sb3dfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4xbWluMF90aHJlc2hfaGlnaF9lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjFtaW4wX3RocmVzaF9sb3dfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW4ybWluM190aHJlc2hfaGlnaF9lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbjJtaW4zX3RocmVzaF9sb3dfZW4uZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4MTM2M19ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gbWF4MTM2M19ldmVudF9hdHRyaWJ1dGVzLAorfTsKKwogc3RhdGljIGludCBtYXgxMzYzX2luaXRpYWxfc2V0dXAoc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0KQogewogCXN0LT5zZXR1cGJ5dGUgPSBNQVgxMzYzX1NFVFVQX0FJTjNfSVNfQUlOM19SRUZfSVNfVkRECkBAIC05MzAsMTkgKzE1OTksNyBAQAogCiAJYXRvbWljX3NldCgmc3QtPnByb3RlY3RfcmluZywgMCk7CiAKLQkvKiBGaW5kIHRoZSBjaGlwIG1vZGVsIHNwZWNpZmljIGRhdGEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYXgxMzYzX2NoaXBfaW5mb190YmwpOyBpKyspCi0JCWlmICghc3RyY21wKG1heDEzNjNfY2hpcF9pbmZvX3RibFtpXS5uYW1lLCBpZC0+bmFtZSkpIHsKLQkJCXN0LT5jaGlwX2luZm8gPSAmbWF4MTM2M19jaGlwX2luZm9fdGJsW2ldOwotCQkJYnJlYWs7Ci0JCX07Ci0JLyogVW5zdXBwb3J0ZWQgY2hpcCAqLwotCWlmICghc3QtPmNoaXBfaW5mbykgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGlkLT5uYW1lKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl9mcmVlX3N0OwotCX0KLQorCXN0LT5jaGlwX2luZm8gPSAmbWF4MTM2M19jaGlwX2luZm9fdGJsW2lkLT5kcml2ZXJfZGF0YV07CiAJc3QtPnJlZyA9IHJlZ3VsYXRvcl9nZXQoJmNsaWVudC0+ZGV2LCAidmNjIik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKIAkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnKTsKQEAgLTk3OCw2ICsxNjM1LDExIEBACiAJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CiAJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOwogCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaWYgKHN0LT5jaGlwX2luZm8tPm1vbml0b3JfbW9kZSAmJiBjbGllbnQtPmlycSkgeworCQlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwkJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMKKwkJCT0gJm1heDEzNjNfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCX0KIAogCXJldCA9IG1heDEzNjNfaW5pdGlhbF9zZXR1cChzdCk7CiAJaWYgKHJldCkKQEAgLTk5MSwxMCArMTY1MywyNSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOwogCXJlZ2RvbmUgPSAxOwotCXJldCA9IG1heDEzNjNfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihzdC0+aW5kaW9fZGV2LT5yaW5nLCAwKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKKworCWlmIChzdC0+Y2hpcF9pbmZvLT5tb25pdG9yX21vZGUgJiYgY2xpZW50LT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNsaWVudC0+aXJxLAorCQkJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkJCTAsCisJCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCQkJY2xpZW50LT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0X3Jpbmc7CisKKwkJSU5JVF9XT1JLKCZzdC0+dGhyZXNoX3dvcmssIG1heDEzNjNfdGhyZXNoX2hhbmRsZXJfYmgpOworCX0KKwogCXJldHVybiAwOworZXJyb3JfdW5pbml0X3Jpbmc6CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZyk7CiBlcnJvcl9jbGVhbnVwX3Jpbmc6CiAJbWF4MTM2M19yaW5nX2NsZWFudXAoc3QtPmluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2F2YWlsYWJsZV9zY2FuX21hc2tzOgpAQCAtMTAxMCw3ICsxNjg3LDYgQEAKIGVycm9yX3B1dF9yZWc6CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7Ci1lcnJvcl9mcmVlX3N0OgogCWtmcmVlKHN0KTsKIAogZXJyb3JfcmV0OgpAQCAtMTAyMSw3ICsxNjk3LDEwIEBACiB7CiAJc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7Ci0JbWF4MTM2M191bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCisJaWYgKHN0LT5jaGlwX2luZm8tPm1vbml0b3JfbW9kZSAmJiBjbGllbnQtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKIAltYXgxMzYzX3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogCWtmcmVlKHN0LT5pbmRpb19kZXYtPmF2YWlsYWJsZV9zY2FuX21hc2tzKTsKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2M19yaW5nLmMKaW5kZXggNTY2ODhkYy4uNzg2YjE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2M19yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2M19yaW5nLmMKQEAgLTY4LDcgKzY4LDcgQEAKIH0KIAogLyoqCi0gKiBtYXgxMzYzX3JpbmdfcHJlZW5hYmxlKCkgc2V0dXAgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHJpbmcgYmVmb3JlIGVuYWJsaW5nCisgKiBtYXgxMzYzX3JpbmdfcHJlZW5hYmxlKCkgLSBzZXR1cCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcmluZyBiZWZvcmUgZW5hYmxpbmcKICAqCiAgKiBUaGUgY29tcGxleCBuYXR1cmUgb2YgdGhlIHNldHRpbmcgb2YgdGhlIG51YmVyIG9mIGJ5dGVzIHBlciBkYXR1bSBpcyBkdWUKICAqIHRvIHRoaXMgZHJpdmVyIGN1cnJlbnRseSBlbnN1cmluZyB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgc3RvcmVkIGF0IGFuIDgKQEAgLTEwNSw0NCArMTA1LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogbWF4MTM2M19yaW5nX3Bvc3RlbmFibGUoKSB0eXBpY2FsIHJpbmcgcG9zdCBlbmFibGUKLSAqCi0gKiBPbmx5IG5vdCBtb3ZlZCBpbnRvIHRoZSBjb3JlIGZvciB0aGUgaGFyZHdhcmUgcmluZyBidWZmZXIgY2FzZXMKLSAqIHRoYXQgYXJlIG1vcmUgc29waGlzdGljYXRlZC4KLSAqKi8KLXN0YXRpYyBpbnQgbWF4MTM2M19yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlpZiAoaW5kaW9fZGV2LT50cmlnID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotfQogCiAvKioKLSAqIG1heDEzNjNfcmluZ19wcmVkaXNhYmxlKCkgcnVucyBqdXN0IHByaW9yIHRvIHJpbmcgYnVmZmVyIGJlaW5nIGRpc2FibGVkCi0gKgotICogVHlwaWNhbCBwcmVkaXNhYmxlIGZ1bmN0aW9uIHdoaWNoIGVuc3VyZXMgdGhhdCBubyB0cmlnZ2VyIGV2ZW50cyBjYW4KLSAqIG9jY3VyIGJlZm9yZSB3ZSBkaXNhYmxlIHRoZSByaW5nIGJ1ZmZlciAoYW5kIGhlbmNlIHdvdWxkIGhhdmUgbm8gaWRlYQotICogd2hhdCB0byBkbyB3aXRoIHRoZW0pCi0gKiovCi1zdGF0aWMgaW50IG1heDEzNjNfcmluZ19wcmVkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCi17Ci0JaWYgKGluZGlvX2Rldi0+dHJpZykKLQkJcmV0dXJuIGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJCSAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBtYXgxMzYzX3BvbGxfZnVuY190aCgpIHRoIG9mIHRyaWdnZXIgbGF1bmNoZWQgcG9sbGluZyB0byByaW5nIGJ1ZmZlcgorICogbWF4MTM2M19wb2xsX2Z1bmNfdGgoKSAtIHRoIG9mIHRyaWdnZXIgbGF1bmNoZWQgcG9sbGluZyB0byByaW5nIGJ1ZmZlcgogICoKICAqIEFzIHNhbXBsaW5nIG9ubHkgb2NjdXJzIG9uIGkyYyBjb21tcyBvY2N1cmluZywgbGVhdmUgdGltZXN0YW1waW5nIHVudGlsCiAgKiB0aGVuLiAgU29tZSB0cmlnZ2VycyB3aWxsIGdlbmVyYXRlIHRoZWlyIG93biB0aW1lIHN0YW1wLiAgQ3VycmVudGx5CiAgKiB0aGVyZSBpcyBubyB3YXkgb2Ygbm90aWZ5aW5nIHRoZW0gd2hlbiBubyBvbmUgY2FyZXMuCiAgKiovCi1zdGF0aWMgdm9pZCBtYXgxMzYzX3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQorc3RhdGljIHZvaWQgbWF4MTM2M19wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWUpCiB7CiAJc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKIApAQCAtMTUxLDcgKzEyMiw3IEBACiAJcmV0dXJuOwogfQogLyoqCi0gKiBtYXgxMzYzX3BvbGxfYmhfdG9fcmluZygpIGJoIG9mIHRyaWdnZXIgbGF1bmNoZWQgcG9sbGluZyB0byByaW5nIGJ1ZmZlcgorICogbWF4MTM2M19wb2xsX2JoX3RvX3JpbmcoKSAtIGJoIG9mIHRyaWdnZXIgbGF1bmNoZWQgcG9sbGluZyB0byByaW5nIGJ1ZmZlcgogICogQHdvcmtfczoJdGhlIHdvcmsgc3RydWN0IHRocm91Z2ggd2hpY2ggdGhpcyB3YXMgc2NoZWR1bGVkCiAgKgogICogQ3VycmVudGx5IHRoZXJlIGlzIG5vIG9wdGlvbiBpbiB0aGlzIGRyaXZlciB0byBkaXNhYmxlIHRoZSBzYXZpbmcgb2YKQEAgLTIyMywxOSArMTk0LDE0IEBACiAJfQogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmc3QtPmluZGlvX2Rldi0+cmluZy0+YWNjZXNzKTsKLQlpbmRpb19kZXYtPnBvbGxmdW5jID0ga3phbGxvYyhzaXplb2YoKmluZGlvX2Rldi0+cG9sbGZ1bmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07CisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJm1heDEzNjNfcG9sbF9mdW5jX3RoKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycm9yX2RlYWxsb2NhdGVfc3dfcmI7Ci0JfQotCS8qIENvbmZpZ3VyZSB0aGUgcG9sbGluZyBmdW5jdGlvbiBjYWxsZWQgb24gdHJpZ2dlciBpbnRlcnJ1cHRzICovCi0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cG9sbF9mdW5jX21haW4gPSAmbWF4MTM2M19wb2xsX2Z1bmNfdGg7Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cHJpdmF0ZV9kYXRhID0gaW5kaW9fZGV2OwogCiAJLyogUmluZyBidWZmZXIgZnVuY3Rpb25zIC0gaGVyZSB0cmlnZ2VyIHNldHVwIHJlbGF0ZWQgKi8KLQlpbmRpb19kZXYtPnJpbmctPnBvc3RlbmFibGUgPSAmbWF4MTM2M19yaW5nX3Bvc3RlbmFibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOwogCWluZGlvX2Rldi0+cmluZy0+cHJlZW5hYmxlID0gJm1heDEzNjNfcmluZ19wcmVlbmFibGU7Ci0JaW5kaW9fZGV2LT5yaW5nLT5wcmVkaXNhYmxlID0gJm1heDEzNjNfcmluZ19wcmVkaXNhYmxlOworCWluZGlvX2Rldi0+cmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKIAlJTklUX1dPUksoJnN0LT5wb2xsX3dvcmssICZtYXgxMzYzX3BvbGxfYmhfdG9fcmluZyk7CiAKIAkvKiBGbGFnIHRoYXQgcG9sbGVkIHJpbmcgYnVmZmVyaW5nIGlzIHBvc3NpYmxlICovCkBAIC0yNTgsMTMgKzIyNCwzIEBACiAJa2ZyZWUoaW5kaW9fZGV2LT5wb2xsZnVuYyk7CiAJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKIH0KLQotdm9pZCBtYXgxMzYzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIocmluZyk7Ci19OwotCi1pbnQgbWF4MTM2M19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOwotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NocmRldi5oCmluZGV4IDNmOTZmODYuLmZkMjNiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaApAQCAtNzMsOCArNzMsNiBAQAogICogQGRldF9ldmVudHM6CQlsaXN0IG9mIGRldGVjdGVkIGV2ZW50cwogICogQG1heF9ldmVudHM6CQltYXhpbXVtIG51bWJlciBvZiBldmVudHMgYmVmb3JlIG5ldyBvbmVzIGFyZSBkcm9wcGVkCiAgKiBAY3VycmVudF9ldmVudHM6CW51bWJlciBvZiBldmVudHMgaW4gZGV0ZWN0ZWQgbGlzdAotICogQGlkOgkJCWluZGVudGlmaWVyIHRvIGFsbG93IHRoZSBldmVudCBpbnRlcmZhY2UgdG8ga25vdyB3aGljaAotICoJCQlwaHlzaWNhbCBsaW5lIGl0IGNvcnJlc3BvbmRzIHRvCiAgKiBAYXR0cjoJCXRoaXMgY2hyZGV2J3MgbWlub3IgbnVtYmVyIHN5c2ZzIGF0dHJpYnV0ZQogICogQG93bmVyOgkJZW5zdXJlIHRoZSBkcml2ZXIgbW9kdWxlIG93bnMgdGhlIGZpbGUsIG5vdCBpaW8KICAqIEBwcml2YXRlOgkJZHJpdmVyIHNwZWNpZmljIGRhdGEKQEAgLTkwLDcgKzg4LDYgQEAKIAlzdHJ1Y3QgaWlvX2RldGVjdGVkX2V2ZW50X2xpc3QJCWRldF9ldmVudHM7CiAJaW50CQkJCQltYXhfZXZlbnRzOwogCWludAkJCQkJY3VycmVudF9ldmVudHM7Ci0JaW50CQkJCQlpZDsKIAlzdHJ1Y3QgaWlvX2NocmRldl9taW5vcl9hdHRyCQlhdHRyOwogCXN0cnVjdCBtb2R1bGUJCQkJKm93bmVyOwogCXZvaWQJCQkJCSpwcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlCmluZGV4IDZkMmM1NDcuLmI1ZjBkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi0KKyMKICMgTWFrZWZpbGUgZm9yIGRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvciBkcml2ZXJzCiAjCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaAppbmRleCBmMTllZmI0Li44MTI0NDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCkBAIC04NSw3ICs4NSw2IEBACiAgKiBzdHJ1Y3QgYWRpczE2MjYwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKICAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQogICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCi0gKiBAd29ya19jb250X3RocmVzaDogQ0xFQU4KICAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKICAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTk3LDcgKzk2LDYgQEAKIHN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgewogCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CiAJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKLQlzdHJ1Y3QgaWlvX3dvcmtfY29udAkJd29ya19jb250X3RocmVzaDsKIAlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CiAJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OwogCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CkBAIC0xMTMsMTMgKzExMSwxMSBAQAogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQogICovCiAKLWVudW0gYWRpczE2MjYwX3NjYW4gewotCUFESVMxNjI2MF9TQ0FOX1NVUFBMWSwKLQlBRElTMTYyNjBfU0NBTl9HWVJPLAotCUFESVMxNjI2MF9TQ0FOX0FVWF9BREMsCi0JQURJUzE2MjYwX1NDQU5fVEVNUCwKLQlBRElTMTYyNjBfU0NBTl9BTkdMLAotfTsKKyNkZWZpbmUgQURJUzE2MjYwX1NDQU5fU1VQUExZCTAKKyNkZWZpbmUgQURJUzE2MjYwX1NDQU5fR1lSTwkxCisjZGVmaW5lIEFESVMxNjI2MF9TQ0FOX0FVWF9BREMJMgorI2RlZmluZSBBRElTMTYyNjBfU0NBTl9URU1QCTMKKyNkZWZpbmUgQURJUzE2MjYwX1NDQU5fQU5HTAk0CiAKIHZvaWQgYWRpczE2MjYwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjI2MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwpAQCAtMTMyLDggKzEyOCw2IEBACiBpbnQgYWRpczE2MjYwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBhZGlzMTYyNjBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotaW50IGFkaXMxNjI2MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci12b2lkIGFkaXMxNjI2MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKICNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI2MF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQpAQCAtMTYyLDE0ICsxNTYsNSBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBhZGlzMTYyNjBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNjBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLX0KLQogI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KICNlbmRpZiAvKiBTUElfQURJUzE2MjYwX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCmluZGV4IGM5M2Y0ZDUuLjEzNGRmYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCkBAIC0xNCwxMiArMTQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgogI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKICNpbmNsdWRlICJneXJvLmgiCiAKQEAgLTU1NSw4ICs1NTYsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKIAlyZWdkb25lID0gMTsKLQotCXJldCA9IGFkaXMxNjI2MF9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYtPnJpbmcsIDApOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKQEAgLTU4OCw3ICs1ODgsNyBAQAogCWlmIChzcGktPmlycSkKIAkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CiBlcnJvcl91bmluaXRpYWxpemVfcmluZzoKLQlhZGlzMTYyNjBfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZyk7CiBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgogCWFkaXMxNjI2MF91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOwogZXJyb3JfZnJlZV9kZXY6CkBAIC02MjIsMTUgKzYyMiwxMyBAQAogCWlmIChzcGktPmlycSkKIAkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKIAotCWFkaXMxNjI2MF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYtPnJpbmcpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWFkaXMxNjI2MF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CiAJa2ZyZWUoc3QtPnR4KTsKIAlrZnJlZShzdC0+cngpOwogCWtmcmVlKHN0KTsKIAotCXJldHVybiAwOwotCiBlcnJfcmV0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcmluZy5jCmluZGV4IDRjNDM5MGMuLjllZjdmOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcmluZy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKQEAgLTE2LDE2ICsxNyw2IEBACiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgogI2luY2x1ZGUgImFkaXMxNjI2MC5oIgogCi0vKioKLSAqIGNvbWJpbmVfOF90b18xNigpIHV0aWxpdHkgZnVuY3Rpb24gdG8gbXVuZ2UgdG8gdThzIGludG8gdTE2Ci0gKiovCi1zdGF0aWMgaW5saW5lIHUxNiBjb21iaW5lXzhfdG9fMTYodTggbG93ZXIsIHU4IHVwcGVyKQotewotCXUxNiBfbG93ZXIgPSBsb3dlcjsKLQl1MTYgX3VwcGVyID0gdXBwZXI7Ci0JcmV0dXJuIF9sb3dlciB8IChfdXBwZXIgPDwgOCk7Ci19Ci0KIHN0YXRpYyBJSU9fU0NBTl9FTF9DKHN1cHBseSwgQURJUzE2MjYwX1NDQU5fU1VQUExZLCBJSU9fVU5TSUdORUQoMTIpLAogCQlBRElTMTYyNjBfU1VQUExZX09VVCwgTlVMTCk7CiBzdGF0aWMgSUlPX1NDQU5fRUxfQyhneXJvLCBBRElTMTYyNjBfU0NBTl9HWVJPLCBJSU9fU0lHTkVEKDE0KSwKQEAgLTU4LDEwICs0OSwxMCBAQAogICogYWRpczE2MjYwX3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCiAgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CiAgKiovCi1zdGF0aWMgdm9pZCBhZGlzMTYyNjBfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCitzdGF0aWMgdm9pZCBhZGlzMTYyNjBfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQogewogCXN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOwotCXN0LT5sYXN0X3RpbWVzdGFtcCA9IGluZGlvX2Rldi0+dHJpZy0+dGltZXN0YW1wOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWU7CiAJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKIH0KIApAQCAtMTMzLDEwICsxMjQsOSBAQAogCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQpCiAJCWlmIChhZGlzMTYyNjBfcmVhZF9yaW5nX2RhdGEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQotCQkJZm9yICg7IGkgPCBzdC0+aW5kaW9fZGV2LT5zY2FuX2NvdW50OyBpKyspIHsKLQkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzE2KHN0LT5yeFtpKjIrMV0sCi0JCQkJCQlzdC0+cnhbaSoyXSk7Ci0JCQl9CisJCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOwogCiAJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKQpAQCAtMTUyLDQ4ICsxNDIsNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBhZGlzMTYyNjBfZGF0YV9yZHlfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlzaXplX3Qgc2l6ZTsKLQlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2FuIGVsZW1lbnRzIGVuYWJsZWQsIGlmIG5vdCBmYWlsKi8KLQlpZiAoIShpbmRpb19kZXYtPnNjYW5fY291bnQgfHwgaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9icGQpIHsKLQkJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCi0JCQlpZiAoaW5kaW9fZGV2LT5zY2FuX2NvdW50KQotCQkJCS8qIFRpbWVzdGFtcCAoYWxpZ25lZCBzNjQpIGFuZCBkYXRhICovCi0JCQkJc2l6ZSA9ICgoKGluZGlvX2Rldi0+c2Nhbl9jb3VudCAqIHNpemVvZihzMTYpKQotCQkJCQkJKyBzaXplb2YoczY0KSAtIDEpCi0JCQkJCSYgfihzaXplb2YoczY0KSAtIDEpKQotCQkJCQkrIHNpemVvZihzNjQpOwotCQkJZWxzZSAvKiBUaW1lc3RhbXAgb25seSAgKi8KLQkJCQlzaXplID0gc2l6ZW9mKHM2NCk7Ci0JCWVsc2UgLyogRGF0YSBvbmx5ICovCi0JCQlzaXplID0gaW5kaW9fZGV2LT5zY2FuX2NvdW50KnNpemVvZihzMTYpOwotCQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnBkKGluZGlvX2Rldi0+cmluZywgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2MjYwX2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQlpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2MjYwX2RhdGFfcmR5X3JpbmdfcHJlZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJaW5kaW9fZGV2LT5wb2xsZnVuYykKLQkJOiAwOwotfQotCiB2b2lkIGFkaXMxNjI2MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJa2ZyZWUoaW5kaW9fZGV2LT5wb2xsZnVuYyk7CkBAIC0yMjUsMTggKzE3MywxNiBAQAogCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CiAJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLwogCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZyaW5nLT5hY2Nlc3MpOwotCXJpbmctPnByZWVuYWJsZSA9ICZhZGlzMTYyNjBfZGF0YV9yZHlfcmluZ19wcmVlbmFibGU7Ci0JcmluZy0+cG9zdGVuYWJsZSA9ICZhZGlzMTYyNjBfZGF0YV9yZHlfcmluZ19wb3N0ZW5hYmxlOwotCXJpbmctPnByZWRpc2FibGUgPSAmYWRpczE2MjYwX2RhdGFfcmR5X3JpbmdfcHJlZGlzYWJsZTsKKwlyaW5nLT5icGUgPSAyOworCXJpbmctPnByZWVuYWJsZSA9ICZpaW9fc3dfcmluZ19wcmVlbmFibGU7CisJcmluZy0+cG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZTsKKwlyaW5nLT5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlOwogCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQlpbmRpb19kZXYtPnBvbGxmdW5jID0ga3phbGxvYyhzaXplb2YoKmluZGlvX2Rldi0+cG9sbGZ1bmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7OwotCX0KLQlpbmRpb19kZXYtPnBvbGxmdW5jLT5wb2xsX2Z1bmNfbWFpbiA9ICZhZGlzMTYyNjBfcG9sbF9mdW5jX3RoOwotCWluZGlvX2Rldi0+cG9sbGZ1bmMtPnByaXZhdGVfZGF0YSA9IGluZGlvX2RldjsKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWRpczE2MjYwX3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKwogCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CiAJcmV0dXJuIDA7CiAKQEAgLTI0NCwxMyArMTkwLDMgQEAKIAlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOwogCXJldHVybiByZXQ7CiB9Ci0KLWludCBhZGlzMTYyNjBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKLX0KLQotdm9pZCBhZGlzMTYyNjBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF90cmlnZ2VyLmMKaW5kZXggYjNjNTY1OS4uZGUwMTUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF90cmlnZ2VyLmMKQEAgLTIzLDggKzIzLDcgQEAKIAlzdHJ1Y3QgYWRpczE2MjYwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOwogCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHN0LT50cmlnOwogCi0JdHJpZy0+dGltZXN0YW1wID0gdGltZXN0YW1wOwotCWlpb190cmlnZ2VyX3BvbGwodHJpZyk7CisJaWlvX3RyaWdnZXJfcG9sbCh0cmlnLCB0aW1lc3RhbXApOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtODMsMTQgKzgyLDEzIEBACiAJc3RydWN0IGFkaXMxNjI2MF9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOwogCiAJc3QtPnRyaWcgPSBpaW9fYWxsb2NhdGVfdHJpZ2dlcigpOwotCXN0LT50cmlnLT5uYW1lID0ga21hbGxvYyhJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkgICAiYWRpczE2MjYwLWRldiVkIiwKKwkJCQkgICBpbmRpb19kZXYtPmlkKTsKIAlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCX0KLQlzbnByaW50ZigoY2hhciAqKXN0LT50cmlnLT5uYW1lLAotCQkgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEgsCi0JCSAiYWRpczE2MjYwLWRldiVkIiwgaW5kaW9fZGV2LT5pZCk7CiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CiAJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvLmgKaW5kZXggZmNlZTQ3Yy4uOWQwY2ExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oCkBAIC0xNiw5ICsxNiw3IEBACiAjaW5jbHVkZSAiY2hyZGV2LmgiCiAKIC8qIElJTyBUT0RPIExJU1QgKi8KLS8qIFN0YXRpYyBkZXZpY2Ugc3BlY2lmaWMgZWxlbWVudHMgKGNvbnZlcnNpb24gZmFjdG9ycyBldGMpCi0gKiBzaG91bGQgYmUgZXhwb3J0ZWQgdmlhIHN5c2ZzCi0gKgorLyoKICAqIFByb3ZpZGUgbWVhbnMgb2YgYWRqdXN0aW5nIHRpbWVyIGFjY3VyYWN5LgogICogQ3VycmVudGx5IGFzc3VtZXMgbmFubyBzZWNvbmRzLgogICovCkBAIC0yODQsNDkgKzI4Miw2IEBACiAJCSAgczY0IHRpbWVzdGFtcCk7CiAKIC8qKgotICogc3RydWN0IGlpb193b3JrX2NvbnQgLSBjb250YWluZXIgZm9yIHdoZW4gc2luZ2xldG9uIGhhbmRsZXIgY2FzZSBtYXR0ZXJzCi0gKiBAd3M6CQkJW0RFVklDRV0gd29ya19zdHJ1Y3Qgd2hlbiBub3Qgb25seSBwb3NzaWJsZSBldmVudAotICogQHdzX25vY2hlY2s6CQlbREVWSUNFXSB3b3JrX3N0cnVjdCB3aGVuIG9ubHkgcG9zc2libGUgZXZlbnQKLSAqIEBhZGRyZXNzOgkJW0RFVklDRV0gYXNzb2NpYXRlZCByZWdpc3RlciBhZGRyZXNzCi0gKiBAbWFzazoJCVtERVZJQ0VdIGFzc29jaWF0ZWQgbWFzayBmb3IgaWRlbnRpZnlpbmcgZXZlbnQgc291cmNlCi0gKiBAc3Q6CQkJW0RFVklDRV0gZGV2aWNlIHNwZWNpZmljIHN0YXRlIGluZm9ybWF0aW9uCi0gKiovCi1zdHJ1Y3QgaWlvX3dvcmtfY29udCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXdzOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl3c19ub2NoZWNrOwotCWludAkJCWFkZHJlc3M7Ci0JaW50CQkJbWFzazsKLQl2b2lkCQkJKnN0OwotfTsKLQotI2RlZmluZSB0b19paW9fd29ya19jb250X2NoZWNrKF93cykJCQlcCi0JY29udGFpbmVyX29mKF93cywgc3RydWN0IGlpb193b3JrX2NvbnQsIHdzKQotCi0jZGVmaW5lIHRvX2lpb193b3JrX2NvbnRfbm9fY2hlY2soX3dzKQkJCQlcCi0JY29udGFpbmVyX29mKF93cywgc3RydWN0IGlpb193b3JrX2NvbnQsIHdzX25vY2hlY2spCi0KLS8qKgotICogaWlvX2luaXRfd29ya19jb250KCkgLSBpbnRpaWFsaXplIHRoZSBlbGVtZW50cyBvZiBhIHdvcmsgY29udGFpbmVyCi0gKiBAY29udDogdGhlIHdvcmsgY29udGFpbmVyCi0gKiBAX2NoZWNrZnVuYzogZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHBvc3NpYmxlIGludCBzb3VyY2VzCi0gKiBAX25vY2hlY2tmdW5jOiBmdW5jdGlvbiBmb3Igd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBpbnQgc291cmNlCi0gKiBAX2FkZDogZHJpdmVyIGRlcGVuZGVudCwgdHlwaWNhbGx5IGEgcmVnaXN0ZXIgYWRkcmVzcwotICogQF9tYXNrOiBkcml2ZXIgZGVwZW5kZW50LCB0eXBpY2FsbHkgYSBiaXQgbWFzayBmb3IgYSByZWdpc3RlcgotICogQF9zdDogZHJpdmVyIGRlcGVuZGVudCwgdHlwaWNhbGx5IHBvaW50ZXIgdG8gYSBkZXZpY2Ugc3RhdGUgc3RydWN0dXJlCi0gKiovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlpb19pbml0X3dvcmtfY29udChzdHJ1Y3QgaWlvX3dvcmtfY29udCAqY29udCwKLQkJICAgdm9pZCAoKl9jaGVja2Z1bmMpKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwKLQkJICAgdm9pZCAoKl9ub2NoZWNrZnVuYykoc3RydWN0IHdvcmtfc3RydWN0ICopLAotCQkgICBpbnQgX2FkZCwgaW50IF9tYXNrLCB2b2lkICpfc3QpCi17Ci0JSU5JVF9XT1JLKCYoY29udCktPndzLCBfY2hlY2tmdW5jKTsKLQlJTklUX1dPUksoJihjb250KS0+d3Nfbm9jaGVjaywgX25vY2hlY2tmdW5jKTsKLQljb250LT5hZGRyZXNzID0gX2FkZDsKLQljb250LT5tYXNrID0gX21hc2s7Ci0JY29udC0+c3QgPSBfc3Q7Ci19Ci0vKioKICAqIF9faWlvX3B1c2hfZXZlbnQoKSAtIHRyaWVzIHRvIGFkZCBhbiBldmVudCB0byB0aGUgbGlzdCBhc3NvY2lhdGVkIHdpdGggYSBjaHJkZXYKICAqIEBldl9pbnQ6CQl0aGUgZXZlbnQgaW50ZXJmYWNlIHRvIHdoaWNoIHdlIGFyZSBwdXNoaW5nIHRoZSBldmVudAogICogQGV2X2NvZGU6CQl0aGUgb3V0Z29pbmcgZXZlbnQgY29kZQpAQCAtNDI4LDcgKzM4Myw5IEBACiAgKiovCiB2b2lkIGlpb19nZXQodm9pZCk7CiAKLS8qIFJpbmcgYnVmZmVyIHJlbGF0ZWQgKi8KKy8qKgorICogaWlvX2RldmljZV9nZXRfY2hyZGV2X21pbm9yKCkgLSBnZXQgYW4gdW51c2VkIG1pbm9yIG51bWJlcgorICoqLwogaW50IGlpb19kZXZpY2VfZ2V0X2NocmRldl9taW5vcih2b2lkKTsKIHZvaWQgaWlvX2RldmljZV9mcmVlX2NocmRldl9taW5vcihpbnQgdmFsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L0tjb25maWcKaW5kZXggNjMwOGQ2Zi4uMzFhNjIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9LY29uZmlnCkBAIC02LDkgKzYsOCBAQAogY29uZmlnIEFESVMxNjMwMAogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYzMDAgSU1VIFNQSSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkKLQlzZWxlY3QgSUlPX1NXX1JJTkcKLQlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCi0Jc2VsZWN0IElJT19UUklHR0VSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MzAwIGZvdXIgZGVncmVlcwogCSAgb2YgZnJlZWRvbSBpbmVydGlhbCBzZW5zb3IuCkBAIC0yNCwxMCArMjMsOSBAQAogCiBjb25maWcgQURJUzE2NDAwCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjQwMC81IElNVSBTUEkgZHJpdmVyIgotIAlkZXBlbmRzIG9uIFNQSQotCXNlbGVjdCBJSU9fU1dfUklORwotCXNlbGVjdCBJSU9fUklOR19CVUZGRVIKLQlzZWxlY3QgSUlPX1RSSUdHRVIKLSAJaGVscAotIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTY0MDAvNSB0cmlheGlhbAotIAkgIGluZXJ0aWFsIHNlbnNvciB3aXRoIE1hZ25ldG9tZXRlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTY0MDAvNSB0cmlheGlhbAorCSAgaW5lcnRpYWwgc2Vuc29yIHdpdGggTWFnbmV0b21ldGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9NYWtlZmlsZQppbmRleCAzMWRmNzM1Li5mM2I0NTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIEluZXJ0aWFsIE1lYXN1cmVtZW50IFVuaXRzCiAjCisKIGFkaXMxNjMwMC15ICAgICAgICAgICAgIDo9IGFkaXMxNjMwMF9jb3JlLm8KIGFkaXMxNjMwMC0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjMwMF9yaW5nLm8gYWRpczE2MzAwX3RyaWdnZXIubwogb2JqLSQoQ09ORklHX0FESVMxNjMwMCkgKz0gYWRpczE2MzAwLm8KQEAgLTExLDQgKzEyLDQgQEAKIAogYWRpczE2NDAwLXkgICAgICAgICAgICAgOj0gYWRpczE2NDAwX2NvcmUubwogYWRpczE2NDAwLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2NDAwX3JpbmcubyBhZGlzMTY0MDBfdHJpZ2dlci5vCi1vYmotJChDT05GSUdfQURJUzE2NDAwKSArPSBhZGlzMTY0MDAubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai0kKENPTkZJR19BRElTMTY0MDApICs9IGFkaXMxNjQwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMC5oCmluZGV4IDFjN2VhNWMuLjFmMjVkNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMC5oCkBAIC05NCw3ICs5NCw2IEBACiAgKiBzdHJ1Y3QgYWRpczE2MzAwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKICAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQogICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCi0gKiBAd29ya19jb250X3RocmVzaDogQ0xFQU4KICAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKICAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTEwNiw3ICsxMDUsNiBAQAogc3RydWN0IGFkaXMxNjMwMF9zdGF0ZSB7CiAJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOwotCXN0cnVjdCBpaW9fd29ya19jb250CQl3b3JrX2NvbnRfdGhyZXNoOwogCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKIAlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CiAJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKQEAgLTExNSwzMCArMTEzLDIyIEBACiAJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7CiB9OwogCi1pbnQgYWRpczE2MzAwX3NwaV9yZWFkX2J1cnN0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KTsKLQogaW50IGFkaXMxNjMwMF9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOwogCi1pbnQgYWRpczE2MzAwX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLWludCBhZGlzMTYzMDBfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KICNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCiAvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCiAgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCiAgKi8KIAotZW51bSBhZGlzMTYzMDBfc2NhbiB7Ci0JQURJUzE2MzAwX1NDQU5fU1VQUExZLAotCUFESVMxNjMwMF9TQ0FOX0dZUk9fWCwKLQlBRElTMTYzMDBfU0NBTl9BQ0NfWCwKLQlBRElTMTYzMDBfU0NBTl9BQ0NfWSwKLQlBRElTMTYzMDBfU0NBTl9BQ0NfWiwKLQlBRElTMTYzMDBfU0NBTl9URU1QLAotCUFESVMxNjMwMF9TQ0FOX0FEQ18wLAotCUFESVMxNjMwMF9TQ0FOX0lOQ0xJX1gsCi0JQURJUzE2MzAwX1NDQU5fSU5DTElfWSwKLX07CisjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX1NVUFBMWQkwCisjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX0dZUk9fWAkxCisjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX0FDQ19YCTIKKyNkZWZpbmUgQURJUzE2MzAwX1NDQU5fQUNDX1kJMworI2RlZmluZSBBRElTMTYzMDBfU0NBTl9BQ0NfWgk0CisjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX1RFTVAJNQorI2RlZmluZSBBRElTMTYzMDBfU0NBTl9BRENfMAk2CisjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX0lOQ0xJX1gJNworI2RlZmluZSBBRElTMTYzMDBfU0NBTl9JTkNMSV9ZCTgKIAogdm9pZCBhZGlzMTYzMDBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MzAwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzAwX2NvcmUuYwppbmRleCA1YTdlNWVmLi5mMTk1MGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMF9jb3JlLmMKQEAgLTE0LDEyICsxNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCiAjaW5jbHVkZSAiLi4vYWNjZWwvYWNjZWwuaCIKICNpbmNsdWRlICIuLi9hY2NlbC9pbmNsaW5vbWV0ZXIuaCIKICNpbmNsdWRlICIuLi9neXJvL2d5cm8uaCIKQEAgLTI5LDEwICszMCw3IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYzMDAiCiAKLS8qIEF0IHRoZSBtb21lbnQgdGhlIHNwaSBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBnbG9iYWwgc2V0dGluZyBvZiBjc19jaGFuZ2UuCi0gKiBJdCdzIGluIHRoZSBsaWtlbHkgdG8gYmUgYWRkZWQgY29tbWVudCBhdCB0aGUgdG9wIG9mIHNwaS5oLgotICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfd3JpdGUgZXRjLgotICovCitzdGF0aWMgaW50IGFkaXMxNjMwMF9jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKIAogLyoqCiAgKiBhZGlzMTYzMDBfc3BpX3dyaXRlX3JlZ184KCkgLSB3cml0ZSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyCkBAIC03OSwxMSArNzcsMTMgQEAKIAkJCS5iaXRzX3Blcl93b3JkID0gOCwKIAkJCS5sZW4gPSAyLAogCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSA3NSwKIAkJfSwgewogCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAorCQkJLmRlbGF5X3VzZWNzID0gNzUsCiAJCX0sCiAJfTsKIApAQCAtMTIyLDEyICsxMjIsMTQgQEAKIAkJCS50eF9idWYgPSBzdC0+dHgsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKLQkJCS5jc19jaGFuZ2UgPSAwLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSA3NSwKIAkJfSwgewogCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKIAkJCS5iaXRzX3Blcl93b3JkID0gOCwKIAkJCS5sZW4gPSAyLAotCQkJLmNzX2NoYW5nZSA9IDAsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDc1LAogCQl9LAogCX07CiAKQEAgLTE1NCw1NCArMTU2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIGFkaXMxNjMwMF9zcGlfcmVhZF9idXJzdCgpIC0gcmVhZCBhbGwgZGF0YSByZWdpc3RlcnMKLSAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKLSAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMjQgYnl0ZXMpCi0gKiovCi1pbnQgYWRpczE2MzAwX3NwaV9yZWFkX2J1cnN0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KQotewotCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZGlzMTYzMDBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOwotCXUzMiBvbGRfc3BlZWRfaHogPSBzdC0+dXMtPm1heF9zcGVlZF9oejsKLQlpbnQgcmV0OwotCi0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0gewotCQl7Ci0JCQkudHhfYnVmID0gc3QtPnR4LAotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDIsCi0JCQkuY3NfY2hhbmdlID0gMCwKLQkJfSwgewotCQkJLnJ4X2J1ZiA9IHJ4LAotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDE4LAotCQkJLmNzX2NoYW5nZSA9IDAsCi0JCX0sCi0JfTsKLQotCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7Ci0Jc3QtPnR4WzBdID0gQURJUzE2MzAwX1JFQURfUkVHKEFESVMxNjMwMF9HTE9CX0NNRCk7Ci0Jc3QtPnR4WzFdID0gMDsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOwotCi0Jc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBtaW4oQURJUzE2MzAwX1NQSV9CVVJTVCwgb2xkX3NwZWVkX2h6KTsKLQlzcGlfc2V0dXAoc3QtPnVzKTsKLQotCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOwotCi0Jc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBvbGRfc3BlZWRfaHo7Ci0Jc3BpX3NldHVwKHN0LT51cyk7Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjMwMF9zcGlfcmVhZF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmLApAQCAtMjQwLDYgKzE5NCwyNCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOwogfQogCitzdGF0aWMgc3NpemVfdCBhZGlzMTYzMDBfcmVhZF8xNGJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYzMDBfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjMwMF9FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjMwMF9jaGVja19zdGF0dXMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDNGRkYpOworfQorCiBzdGF0aWMgc3NpemVfdCBhZGlzMTYzMDBfcmVhZF8xNGJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQpAQCAtMzU2LDYgKzMyOCwxOCBAQAogCXJldHVybiByZXQgPyByZXQgOiBsZW47CiB9CiAKK3N0YXRpYyBpbnQgYWRpczE2MzAwX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjMwMF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MzAwX0dMT0JfQ01ELAorCQkJQURJUzE2MzAwX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHNzaXplX3QgYWRpczE2MzAwX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKQEAgLTM3MSw4ICszNTUsNiBAQAogCXJldHVybiAtMTsKIH0KIAotCi0KIGludCBhZGlzMTYzMDBfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQogewogCWludCByZXQ7CkBAIC0zOTYsMTggKzM3OCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGFkaXMxNjMwMF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldDsKLQlyZXQgPSBhZGlzMTYzMDBfc3BpX3dyaXRlX3JlZ184KGRldiwKLQkJCUFESVMxNjMwMF9HTE9CX0NNRCwKLQkJCUFESVMxNjMwMF9HTE9CX0NNRF9TV19SRVNFVCk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLwogc3RhdGljIGludCBhZGlzMTYzMDBfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNDIxLDcgKzM5MSwyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhZGlzMTYzMDBfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYWRpczE2MzAwX3NlbGZfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYzMDBfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBRElTMTYzMDBfTVNDX0NUUkwsCisJCQlBRElTMTYzMDBfTVNDX0NUUkxfTUVNX1RFU1QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHNlbGYgdGVzdCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRpczE2MzAwX2NoZWNrX3N0YXR1cyhkZXYpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MzAwX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJdTE2IHN0YXR1czsKIAlpbnQgcmV0OwpAQCAtNDgzLDYgKzQ3MCwxMSBAQAogCX0KIAogCS8qIERvIHNlbGYgdGVzdCAqLworCXJldCA9IGFkaXMxNjMwMF9zZWxmX3Rlc3QoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic2VsZiB0ZXN0IGZhaWx1cmUiKTsKKwkJZ290byBlcnJfcmV0OworCX0KIAogCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSByZXN1bHQgKi8KIAlyZXQgPSBhZGlzMTYzMDBfY2hlY2tfc3RhdHVzKGRldik7CkBAIC01MjYsNyArNTE4LDcgQEAKIAkJYWRpczE2MzAwX3dyaXRlXzE2Yml0LAogCQlBRElTMTYzMDBfWkFDQ0xfT0ZGKTsKIAotc3RhdGljIElJT19ERVZfQVRUUl9JTl9OQU1FRF9SQVcoc3VwcGx5LCBhZGlzMTYzMDBfcmVhZF8xNGJpdF9zaWduZWQsCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVyhzdXBwbHksIGFkaXMxNjMwMF9yZWFkXzE0Yml0X3Vuc2lnbmVkLAogCQkJICAgQURJUzE2MzAwX1NVUFBMWV9PVVQpOwogc3RhdGljIElJT19DT05TVF9BVFRSKGluX3N1cHBseV9zY2FsZSwgIjAuMDAyNDIiKTsKIApAQCAtNTQ4LDcgKzU0MCw3IEBACiAJCUFESVMxNjMwMF9ZSU5DTElfT1VUKTsKIHN0YXRpYyBJSU9fQ09OU1RfQVRUUihpbmNsaV9zY2FsZSwgIjAuMDQ0IGQiKTsKIAotc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYzMDBfcmVhZF8xMmJpdF9zaWduZWQpOworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYzMDBfcmVhZF8xMmJpdF91bnNpZ25lZCk7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIxOTguMTYgSyIpOwogc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICIwLjE0IEsiKTsKIApAQCAtNjUzLDIxICs2NDUsMTMgQEAKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwogCXJlZ2RvbmUgPSAxOwogCi0JcmV0ID0gYWRpczE2MzAwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlyZXQgPSBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZywgMCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwogCX0KIAotCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKSB7Ci0jaWYgMCAvKiBmaXhtZTogaGVyZSB3ZSBzaG91bGQgc3VwcG9ydCAqLwotCQlpaW9faW5pdF93b3JrX2NvbnQoJnN0LT53b3JrX2NvbnRfdGhyZXNoLAotCQkJCU5VTEwsCi0JCQkJYWRpczE2MzAwX3RocmVzaF9oYW5kbGVyX2JoX25vX2NoZWNrLAotCQkJCTAsCi0JCQkJMCwKLQkJCQlzdCk7Ci0jZW5kaWYKKwlpZiAoc3BpLT5pcnEpIHsKIAkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAogCQkJCXN0LT5pbmRpb19kZXYsCiAJCQkJMCwKQEAgLTY4OCwxMyArNjcyLDEyIEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgotCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQotCQlhZGlzMTYzMDBfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJYWRpczE2MzAwX3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOwogZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgotCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCWlmIChzcGktPmlycSkKIAkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CiBlcnJvcl91bmluaXRpYWxpemVfcmluZzoKLQlhZGlzMTYzMDBfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZyk7CiBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgogCWFkaXMxNjMwMF91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOwogZXJyb3JfZnJlZV9kZXY6CkBAIC03MTIsNyArNjk1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IGFkaXMxNjMwMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlpbnQgcmV0OwpAQCAtNzI2LDEyICs3MDgsMTIgQEAKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJYWRpczE2MzAwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7Ci0JaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJaWYgKHNwaS0+aXJxKQogCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOwogCi0JYWRpczE2MzAwX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7Ci0JYWRpczE2MzAwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkaXMxNjMwMF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CiAJa2ZyZWUoc3QtPnR4KTsKIAlrZnJlZShzdC0+cngpOwogCWtmcmVlKHN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzMDBfcmluZy5jCmluZGV4IDc2Y2Y4YTYuLmZjOTMxNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzAwX3JpbmcuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCkBAIC0xNiwxNyArMTcsNyBAQAogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKICNpbmNsdWRlICJhZGlzMTYzMDAuaCIKIAotLyoqCi0gKiBjb21iaW5lXzhfdG9fMTYoKSB1dGlsaXR5IGZ1bmN0aW9uIHRvIG11bmdlIHRvIHU4cyBpbnRvIHUxNgotICoqLwotc3RhdGljIGlubGluZSB1MTYgY29tYmluZV84X3RvXzE2KHU4IGxvd2VyLCB1OCB1cHBlcikKLXsKLQl1MTYgX2xvd2VyID0gbG93ZXI7Ci0JdTE2IF91cHBlciA9IHVwcGVyOwotCXJldHVybiBfbG93ZXIgfCAoX3VwcGVyIDw8IDgpOwotfQotCi1zdGF0aWMgSUlPX1NDQU5fRUxfQyhzdXBwbHksIEFESVMxNjMwMF9TQ0FOX1NVUFBMWSwgSUlPX1NJR05FRCgxNCksCitzdGF0aWMgSUlPX1NDQU5fRUxfQyhzdXBwbHksIEFESVMxNjMwMF9TQ0FOX1NVUFBMWSwgSUlPX1VOU0lHTkVEKDE0KSwKIAkJICAgICBBRElTMTYzMDBfU1VQUExZX09VVCwgTlVMTCk7CiAKIHN0YXRpYyBJSU9fU0NBTl9FTF9DKGd5cm9feCwgQURJUzE2MzAwX1NDQU5fR1lST19YLCBJSU9fU0lHTkVEKDE0KSwKQEAgLTM5LDkgKzMwLDkgQEAKIHN0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3osIEFESVMxNjMwMF9TQ0FOX0FDQ19aLCBJSU9fU0lHTkVEKDE0KSwKIAkJICAgICBBRElTMTYzMDBfWkFDQ0xfT1VULCBOVUxMKTsKIAotc3RhdGljIElJT19TQ0FOX0VMX0ModGVtcCwgQURJUzE2MzAwX1NDQU5fVEVNUCwgSUlPX1NJR05FRCgxMiksCitzdGF0aWMgSUlPX1NDQU5fRUxfQyh0ZW1wLCBBRElTMTYzMDBfU0NBTl9URU1QLCBJSU9fVU5TSUdORUQoMTIpLAogCQkgICAgIEFESVMxNjMwMF9URU1QX09VVCwgTlVMTCk7Ci1zdGF0aWMgSUlPX1NDQU5fRUxfQyhhZGNfMCwgQURJUzE2MzAwX1NDQU5fQURDXzAsIElJT19TSUdORUQoMTIpLAorc3RhdGljIElJT19TQ0FOX0VMX0MoYWRjXzAsIEFESVMxNjMwMF9TQ0FOX0FEQ18wLCBJSU9fVU5TSUdORUQoMTIpLAogCQkgICAgIEFESVMxNjMwMF9BVVhfQURDLCBOVUxMKTsKIAogc3RhdGljIElJT19TQ0FOX0VMX0MoaW5jbGlfeCwgQURJUzE2MzAwX1NDQU5fSU5DTElfWCwgSUlPX1NJR05FRCgxMiksCkBAIC03NCwxMCArNjUsMTAgQEAKICAqIGFkaXMxNjMwMF9wb2xsX2Z1bmNfdGgoKSB0b3AgaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQgYnkgdHJpZ2dlcgogICogQHByaXZhdGVfZGF0YToJaWlvX2RldgogICoqLwotc3RhdGljIHZvaWQgYWRpczE2MzAwX3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQorc3RhdGljIHZvaWQgYWRpczE2MzAwX3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZSkKIHsKIAlzdHJ1Y3QgYWRpczE2MzAwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKLQlzdC0+bGFzdF90aW1lc3RhbXAgPSBpbmRpb19kZXYtPnRyaWctPnRpbWVzdGFtcDsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lOwogCXNjaGVkdWxlX3dvcmsoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZyk7CiAJLyogSW5kaWNhdGUgdGhhdCB0aGlzIGludGVycnVwdCBpcyBiZWluZyBoYW5kbGVkICovCiAKQEAgLTg3LDYgKzc4LDU0IEBACiAJICovCiB9CiAKKy8qKgorICogYWRpczE2MzAwX3NwaV9yZWFkX2J1cnN0KCkgLSByZWFkIGFsbCBkYXRhIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkIChtaW4gc2l6ZSBpcyAyNCBieXRlcykKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MzAwX3NwaV9yZWFkX2J1cnN0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYzMDBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXUzMiBvbGRfc3BlZWRfaHogPSBzdC0+dXMtPm1heF9zcGVlZF9oejsKKwlpbnQgcmV0OworCisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMCwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDE4LAorCQkJLmNzX2NoYW5nZSA9IDAsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MzAwX1JFQURfUkVHKEFESVMxNjMwMF9HTE9CX0NNRCk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCisJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYzMDBfU1BJX0JVUlNUOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiBidXJzdCByZWFkaW5nIik7CisKKwlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IG9sZF9zcGVlZF9oejsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKwogLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCiAgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KICAqLwpAQCAtMTA5LDEwICsxNDgsOSBAQAogCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQpCiAJCWlmIChhZGlzMTYzMDBfc3BpX3JlYWRfYnVyc3QoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQotCQkJZm9yICg7IGkgPCBzdC0+aW5kaW9fZGV2LT5zY2FuX2NvdW50OyBpKyspIHsKLQkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzE2KHN0LT5yeFtpKjIrMV0sCi0JCQkJCQkJICBzdC0+cnhbaSoyXSk7Ci0JCQl9CisJCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOwogCiAJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKQpAQCAtMTI3LDQ1ICsxNjUsNiBAQAogCiAJcmV0dXJuOwogfQotLyogaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcyBpcyBpdCBiZXR0ZXIgdG8gZ28gd2l0aCB1bmFsaWduZWQgcGFja2luZyBhbmQKLSAqIGRlYWwgd2l0aCB0aGUgY29zdD8qLwotc3RhdGljIGludCBhZGlzMTYzMDBfZGF0YV9yZHlfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlzaXplX3Qgc2l6ZTsKLQlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2FuIGVsZW1lbnRzIGVuYWJsZWQsIGlmIG5vdCBmYWlsKi8KLQlpZiAoIShpbmRpb19kZXYtPnNjYW5fY291bnQgfHwgaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9icGQpIHsKLQkJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCi0JCQlpZiAoaW5kaW9fZGV2LT5zY2FuX2NvdW50KSAvKiBUaW1lc3RhbXAgYW5kIGRhdGEgKi8KLQkJCQlzaXplID0gNCpzaXplb2YoczY0KTsKLQkJCWVsc2UgLyogVGltZXN0YW1wIG9ubHkgICovCi0JCQkJc2l6ZSA9IHNpemVvZihzNjQpOwotCQllbHNlIC8qIERhdGEgb25seSAqLwotCQkJc2l6ZSA9IGluZGlvX2Rldi0+c2Nhbl9jb3VudCpzaXplb2YoczE2KTsKLQkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2JwZChpbmRpb19kZXYtPnJpbmcsIHNpemUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkaXMxNjMwMF9kYXRhX3JkeV9yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlyZXR1cm4gaW5kaW9fZGV2LT50cmlnCi0JCT8gaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJCSAgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2MzAwX2RhdGFfcmR5X3JpbmdfcHJlZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJCQlpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19CiAKIHZvaWQgYWRpczE2MzAwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKQEAgLTIwMiwxOCArMjAxLDE2IEBACiAJaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCiAJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJnJpbmctPmFjY2Vzcyk7Ci0JcmluZy0+cHJlZW5hYmxlID0gJmFkaXMxNjMwMF9kYXRhX3JkeV9yaW5nX3ByZWVuYWJsZTsKLQlyaW5nLT5wb3N0ZW5hYmxlID0gJmFkaXMxNjMwMF9kYXRhX3JkeV9yaW5nX3Bvc3RlbmFibGU7Ci0JcmluZy0+cHJlZGlzYWJsZSA9ICZhZGlzMTYzMDBfZGF0YV9yZHlfcmluZ19wcmVkaXNhYmxlOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CiAJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCWluZGlvX2Rldi0+cG9sbGZ1bmMgPSBremFsbG9jKHNpemVvZigqaW5kaW9fZGV2LT5wb2xsZnVuYyksIEdGUF9LRVJORUwpOwotCWlmIChpbmRpb19kZXYtPnBvbGxmdW5jID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTs7Ci0JfQotCWluZGlvX2Rldi0+cG9sbGZ1bmMtPnBvbGxfZnVuY19tYWluID0gJmFkaXMxNjMwMF9wb2xsX2Z1bmNfdGg7Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cHJpdmF0ZV9kYXRhID0gaW5kaW9fZGV2OworCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZhZGlzMTYzMDBfcG9sbF9mdW5jX3RoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOworCiAJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIApAQCAtMjIyLDEyICsyMTksMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhZGlzMTYzMDBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKLX0KLQotdm9pZCBhZGlzMTYzMDBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzMDBfdHJpZ2dlci5jCmluZGV4IDU0ZWRiMjBiLi42NDAzNmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzMDBfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjMwMF90cmlnZ2VyLmMKQEAgLTIzLDggKzIzLDcgQEAKIAlzdHJ1Y3QgYWRpczE2MzAwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOwogCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHN0LT50cmlnOwogCi0JdHJpZy0+dGltZXN0YW1wID0gdGltZXN0YW1wOwotCWlpb190cmlnZ2VyX3BvbGwodHJpZyk7CisJaWlvX3RyaWdnZXJfcG9sbCh0cmlnLCB0aW1lc3RhbXApOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtODYsMTQgKzg1LDEzIEBACiAJc3RydWN0IGFkaXMxNjMwMF9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOwogCiAJc3QtPnRyaWcgPSBpaW9fYWxsb2NhdGVfdHJpZ2dlcigpOwotCXN0LT50cmlnLT5uYW1lID0ga21hbGxvYyhJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkgICAiYWRpczE2MzAwLWRldiVkIiwKKwkJCQkgICBpbmRpb19kZXYtPmlkKTsKIAlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCX0KLQlzbnByaW50ZigoY2hhciAqKXN0LT50cmlnLT5uYW1lLAotCQkgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEgsCi0JCSAiYWRpczE2MzAwLWRldiVkIiwgaW5kaW9fZGV2LT5pZCk7CiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CiAJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTAuaAppbmRleCAzMzRiMThhLi5iMDAwMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTAuaApAQCAtMTAwLDcgKzEwMCw2IEBACiAgKiBzdHJ1Y3QgYWRpczE2MzUwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKICAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQogICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCi0gKiBAd29ya19jb250X3RocmVzaDogQ0xFQU4KICAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKICAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTExMiw3ICsxMTEsNiBAQAogc3RydWN0IGFkaXMxNjM1MF9zdGF0ZSB7CiAJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOwotCXN0cnVjdCBpaW9fd29ya19jb250CQl3b3JrX2NvbnRfZGF0YV9yZHk7CiAJczY0CQkJCWxhc3RfdGltZXN0YW1wOwogCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOwpAQCAtMTI1LDE5ICsxMjMsMTcgQEAKIAogI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIAotZW51bSBhZGlzMTYzNTBfc2NhbiB7Ci0JQURJUzE2MzUwX1NDQU5fU1VQUExZLAotCUFESVMxNjM1MF9TQ0FOX0dZUk9fWCwKLQlBRElTMTYzNTBfU0NBTl9HWVJPX1ksCi0JQURJUzE2MzUwX1NDQU5fR1lST19aLAotCUFESVMxNjM1MF9TQ0FOX0FDQ19YLAotCUFESVMxNjM1MF9TQ0FOX0FDQ19ZLAotCUFESVMxNjM1MF9TQ0FOX0FDQ19aLAotCUFESVMxNjM1MF9TQ0FOX1RFTVBfWCwKLQlBRElTMTYzNTBfU0NBTl9URU1QX1ksCi0JQURJUzE2MzUwX1NDQU5fVEVNUF9aLAotCUFESVMxNjM1MF9TQ0FOX0FEQ18wCi19OworI2RlZmluZSBBRElTMTYzNTBfU0NBTl9TVVBQTFkJMAorI2RlZmluZSBBRElTMTYzNTBfU0NBTl9HWVJPX1gJMQorI2RlZmluZSBBRElTMTYzNTBfU0NBTl9HWVJPX1kJMgorI2RlZmluZSBBRElTMTYzNTBfU0NBTl9HWVJPX1oJMworI2RlZmluZSBBRElTMTYzNTBfU0NBTl9BQ0NfWAk0CisjZGVmaW5lIEFESVMxNjM1MF9TQ0FOX0FDQ19ZCTUKKyNkZWZpbmUgQURJUzE2MzUwX1NDQU5fQUNDX1oJNgorI2RlZmluZSBBRElTMTYzNTBfU0NBTl9URU1QX1gJNworI2RlZmluZSBBRElTMTYzNTBfU0NBTl9URU1QX1kJOAorI2RlZmluZSBBRElTMTYzNTBfU0NBTl9URU1QX1oJOQorI2RlZmluZSBBRElTMTYzNTBfU0NBTl9BRENfMAkxMAogCiB2b2lkIGFkaXMxNjM1MF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBhZGlzMTYzNTBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKQEAgLTE1MCw4ICsxNDYsNiBAQAogaW50IGFkaXMxNjM1MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWRpczE2MzUwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKLWludCBhZGlzMTYzNTBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBhZGlzMTYzNTBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiAjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYzNTBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKQEAgLTE3MSw3ICsxNjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFkaXMxNjM1MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQorc3RhdGljIGlubGluZSBpbnQgYWRpczE2MzUwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzksMTUgKzE3Myw1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MzUwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIH0KLQotc3RhdGljIGlubGluZSBpbnQgYWRpczE2MzUwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MzUwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCiAjZW5kaWYgLyogU1BJX0FESVMxNjM1MF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF9jb3JlLmMKaW5kZXggMGVkZGU3My4uMTU3NWI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfY29yZS5jCkBAIC0xNCwxMiArMTQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgogI2luY2x1ZGUgIi4uL2FjY2VsL2FjY2VsLmgiCiAjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgogI2luY2x1ZGUgIi4uL2d5cm8vZ3lyby5oIgpAQCAtNzUsMTMgKzc2LDEzIEBACiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwgewogCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwogCkBAIC0xMjEsMTMgKzEyMiwxMyBAQAogCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAogCQkJLmxlbiA9IDIsCiAJCQkuY3NfY2hhbmdlID0gMSwKLQkJCS5kZWxheV91c2VjcyA9IDI1LAorCQkJLmRlbGF5X3VzZWNzID0gMzUsCiAJCX0sIHsKIAkJCS5yeF9idWYgPSBzdC0+cngsCiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKIAkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjUsCisJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwogCkBAIC02MTksNyArNjIwLDcgQEAKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwogCXJlZ2RvbmUgPSAxOwogCi0JcmV0ID0gYWRpczE2MzUwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlyZXQgPSBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldi0+cmluZywgMCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwpAQCAtNjUxLDcgKzY1Miw3IEBACiAJaWYgKHNwaS0+aXJxKQogCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgotCWFkaXMxNjM1MF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2LT5yaW5nKTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2MzUwX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2RldjoKQEAgLTY4NSw3ICs2ODYsNyBAQAogCWlmIChzcGktPmlycSkKIAkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKIAotCWFkaXMxNjM1MF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWRpczE2MzUwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIAlrZnJlZShzdC0+dHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF9yaW5nLmMKaW5kZXggNWU5NzE2ZS4uZTA1M2U5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfcmluZy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKQEAgLTE2LDE2ICsxNyw2IEBACiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgogI2luY2x1ZGUgImFkaXMxNjM1MC5oIgogCi0vKioKLSAqIGNvbWJpbmVfOF90b18xNigpIHV0aWxpdHkgZnVuY3Rpb24gdG8gbXVuZ2UgdG8gdThzIGludG8gdTE2Ci0gKiovCi1zdGF0aWMgaW5saW5lIHUxNiBjb21iaW5lXzhfdG9fMTYodTggbG93ZXIsIHU4IHVwcGVyKQotewotCXUxNiBfbG93ZXIgPSBsb3dlcjsKLQl1MTYgX3VwcGVyID0gdXBwZXI7Ci0JcmV0dXJuIF9sb3dlciB8IChfdXBwZXIgPDwgOCk7Ci19Ci0KIHN0YXRpYyBJSU9fU0NBTl9FTF9DKHN1cHBseSwgQURJUzE2MzUwX1NDQU5fU1VQUExZLCBJSU9fVU5TSUdORUQoMTIpLAogCQlBRElTMTYzNTBfU1VQUExZX09VVCwgTlVMTCk7CiAKQEAgLTgwLDEwICs3MSwxMCBAQAogICogYWRpczE2MzUwX3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCiAgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CiAgKiovCi1zdGF0aWMgdm9pZCBhZGlzMTYzNTBfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCitzdGF0aWMgdm9pZCBhZGlzMTYzNTBfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQogewogCXN0cnVjdCBhZGlzMTYzNTBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOwotCXN0LT5sYXN0X3RpbWVzdGFtcCA9IGluZGlvX2Rldi0+dHJpZy0+dGltZXN0YW1wOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWU7CiAJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKIH0KIApAQCAtMTU3LDEwICsxNDgsOSBAQAogCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQpCiAJCWlmIChhZGlzMTYzNTBfc3BpX3JlYWRfYnVyc3QoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQotCQkJZm9yICg7IGkgPCBzdC0+aW5kaW9fZGV2LT5zY2FuX2NvdW50OyBpKyspIHsKLQkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzE2KHN0LT5yeFtpKjIrMV0sCi0JCQkJCQkJICBzdC0+cnhbaSoyXSk7Ci0JCQl9CisJCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOwogCiAJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCiAJaWYgKHN0LT5pbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKQpAQCAtMTc2LDQ4ICsxNjYsNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBhZGlzMTYzNTBfZGF0YV9yZHlfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlzaXplX3Qgc2l6ZTsKLQlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzY2FuIGVsZW1lbnRzIGVuYWJsZWQsIGlmIG5vdCBmYWlsKi8KLQlpZiAoIShpbmRpb19kZXYtPnNjYW5fY291bnQgfHwgaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnNldF9icGQpIHsKLQkJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCi0JCQlpZiAoaW5kaW9fZGV2LT5zY2FuX2NvdW50KQotCQkJCS8qIFRpbWVzdGFtcCAoYWxpZ25lZCBzaXplb2YoczY0KSBhbmQgZGF0YSAqLwotCQkJCXNpemUgPSAoKChpbmRpb19kZXYtPnNjYW5fY291bnQgKiBzaXplb2YoczE2KSkKLQkJCQkJCSsgc2l6ZW9mKHM2NCkgLSAxKQotCQkJCQkmIH4oc2l6ZW9mKHM2NCkgLSAxKSkKLQkJCQkJKyBzaXplb2YoczY0KTsKLQkJCWVsc2UgLyogVGltZXN0YW1wIG9ubHkgICovCi0JCQkJc2l6ZSA9IHNpemVvZihzNjQpOwotCQllbHNlIC8qIERhdGEgb25seSAqLwotCQkJc2l6ZSA9IGluZGlvX2Rldi0+c2Nhbl9jb3VudCpzaXplb2YoczE2KTsKLQkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2JwZChpbmRpb19kZXYtPnJpbmcsIHNpemUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkaXMxNjM1MF9kYXRhX3JkeV9yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlyZXR1cm4gaW5kaW9fZGV2LT50cmlnCi0JCT8gaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJCSAgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2MzUwX2RhdGFfcmR5X3JpbmdfcHJlZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCi0JCQkJCQlpbmRpb19kZXYtPnBvbGxmdW5jKQotCQk6IDA7Ci19Ci0KIHZvaWQgYWRpczE2MzUwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlrZnJlZShpbmRpb19kZXYtPnBvbGxmdW5jKTsKQEAgLTI1NSwxOCArMjAzLDE2IEBACiAJaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCiAJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJnJpbmctPmFjY2Vzcyk7Ci0JcmluZy0+cHJlZW5hYmxlID0gJmFkaXMxNjM1MF9kYXRhX3JkeV9yaW5nX3ByZWVuYWJsZTsKLQlyaW5nLT5wb3N0ZW5hYmxlID0gJmFkaXMxNjM1MF9kYXRhX3JkeV9yaW5nX3Bvc3RlbmFibGU7Ci0JcmluZy0+cHJlZGlzYWJsZSA9ICZhZGlzMTYzNTBfZGF0YV9yZHlfcmluZ19wcmVkaXNhYmxlOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CiAJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCWluZGlvX2Rldi0+cG9sbGZ1bmMgPSBremFsbG9jKHNpemVvZigqaW5kaW9fZGV2LT5wb2xsZnVuYyksIEdGUF9LRVJORUwpOwotCWlmIChpbmRpb19kZXYtPnBvbGxmdW5jID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTs7Ci0JfQotCWluZGlvX2Rldi0+cG9sbGZ1bmMtPnBvbGxfZnVuY19tYWluID0gJmFkaXMxNjM1MF9wb2xsX2Z1bmNfdGg7Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cHJpdmF0ZV9kYXRhID0gaW5kaW9fZGV2OworCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZhZGlzMTYzNTBfcG9sbF9mdW5jX3RoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOworCiAJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIApAQCAtMjc1LDEyICsyMjEsMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhZGlzMTYzNTBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKLX0KLQotdm9pZCBhZGlzMTYzNTBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfdHJpZ2dlci5jCmluZGV4IDFmZmE3NWQuLjc2ZWRjY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX3RyaWdnZXIuYwpAQCAtMjMsOCArMjMsNyBAQAogCXN0cnVjdCBhZGlzMTYzNTBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CiAKLQl0cmlnLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0JaWlvX3RyaWdnZXJfcG9sbCh0cmlnKTsKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC04NiwxNCArODUsMTMgQEAKIAlzdHJ1Y3QgYWRpczE2MzUwX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CiAKIAlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7Ci0Jc3QtPnRyaWctPm5hbWUgPSBrbWFsbG9jKElJT19UUklHR0VSX05BTUVfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlzdC0+dHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCSAgICJhZGlzMTYzNTAtZGV2JWQiLAorCQkJCSAgIGluZGlvX2Rldi0+aWQpOwogCWlmICghc3QtPnRyaWctPm5hbWUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9mcmVlX3RyaWc7CiAJfQotCXNucHJpbnRmKChjaGFyICopc3QtPnRyaWctPm5hbWUsCi0JCSBJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwKLQkJICJhZGlzMTYzNTAtZGV2JWQiLCBpbmRpb19kZXYtPmlkKTsKIAlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKIAlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCmluZGV4IDVhNjlhN2EuLjZmZjMzZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCkBAIC0xMjYsNyArMTI2LDYgQEAKICAqIHN0cnVjdCBhZGlzMTY0MDBfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQogICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCiAgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKLSAqIEB3b3JrX2NvbnRfdGhyZXNoOiBDTEVBTgogICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAogICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCiAgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTM4LDcgKzEzNyw2IEBACiBzdHJ1Y3QgYWRpczE2NDAwX3N0YXRlIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOwogCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7Ci0Jc3RydWN0IGlpb193b3JrX2NvbnQJCXdvcmtfY29udF90aHJlc2g7CiAJczY0CQkJCWxhc3RfdGltZXN0YW1wOwogCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOwpAQCAtMTQ3LDMzICsxNDUsMjUgQEAKIAlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKIH07CiAKLWludCBhZGlzMTY0MDBfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpOwotCiBpbnQgYWRpczE2NDAwX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CiAKLWludCBhZGlzMTY0MDBfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KTsKLQotaW50IGFkaXMxNjQwMF9jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKLQogI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIC8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKICAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKICAqLwogCi1lbnVtIGFkaXMxNjQwMF9zY2FuIHsKLQlBRElTMTY0MDBfU0NBTl9TVVBQTFksCi0JQURJUzE2NDAwX1NDQU5fR1lST19YLAotCUFESVMxNjQwMF9TQ0FOX0dZUk9fWSwKLQlBRElTMTY0MDBfU0NBTl9HWVJPX1osCi0JQURJUzE2NDAwX1NDQU5fQUNDX1gsCi0JQURJUzE2NDAwX1NDQU5fQUNDX1ksCi0JQURJUzE2NDAwX1NDQU5fQUNDX1osCi0JQURJUzE2NDAwX1NDQU5fTUFHTl9YLAotCUFESVMxNjQwMF9TQ0FOX01BR05fWSwKLQlBRElTMTY0MDBfU0NBTl9NQUdOX1osCi0JQURJUzE2NDAwX1NDQU5fVEVNUCwKLQlBRElTMTY0MDBfU0NBTl9BRENfMAotfTsKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fU1VQUExZCTAKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fR1lST19YCTEKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fR1lST19ZCTIKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fR1lST19aCTMKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fQUNDX1gJNAorI2RlZmluZSBBRElTMTY0MDBfU0NBTl9BQ0NfWQk1CisjZGVmaW5lIEFESVMxNjQwMF9TQ0FOX0FDQ19aCTYKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fTUFHTl9YCTcKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fTUFHTl9ZCTgKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fTUFHTl9aCTkKKyNkZWZpbmUgQURJUzE2NDAwX1NDQU5fVEVNUAkxMAorI2RlZmluZSBBRElTMTY0MDBfU0NBTl9BRENfMAkxMQogCiB2b2lkIGFkaXMxNjQwMF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBhZGlzMTY0MDBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKQEAgLTE4Niw4ICsxNzYsNiBAQAogaW50IGFkaXMxNjQwMF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWRpczE2NDAwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKLWludCBhZGlzMTY0MDBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBhZGlzMTY0MDBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiAjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTY0MDBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKQEAgLTIxNiwxNCArMjA0LDUgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYWRpczE2NDAwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2NDAwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCiAjZW5kaWYgLyogU1BJX0FESVMxNjQwMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9jb3JlLmMKaW5kZXggZTY5ZTJjZS4uNjAxM2ZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCkBAIC0yMSwxMiArMjEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgogI2luY2x1ZGUgIi4uL2FjY2VsL2FjY2VsLmgiCiAjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgogI2luY2x1ZGUgIi4uL2d5cm8vZ3lyby5oIgpAQCAtMzYsNiArMzcsOCBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2NDAwIgogCitzdGF0aWMgaW50IGFkaXMxNjQwMF9jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKKwogLyogQXQgdGhlIG1vbWVudCB0aGUgc3BpIGZyYW1ld29yayBkb2Vzbid0IGFsbG93IGdsb2JhbCBzZXR0aW5nIG9mIGNzX2NoYW5nZS4KICAqIEl0J3MgaW4gdGhlIGxpa2VseSB0byBiZSBhZGRlZCBjb21tZW50IGF0IHRoZSB0b3Agb2Ygc3BpLmguCiAgKiBUaGlzIG1lYW5zIHRoYXQgdXNlIGNhbm5vdCBiZSBtYWRlIG9mIHNwaV93cml0ZSBldGMuCkBAIC0xNjEsNTQgKzE2NCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiBhZGlzMTY0MDBfc3BpX3JlYWRfYnVyc3QoKSAtIHJlYWQgYWxsIGRhdGEgcmVnaXN0ZXJzCi0gKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCi0gKiBAcng6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQgKG1pbiBzaXplIGlzIDI0IGJ5dGVzKQotICoqLwotaW50IGFkaXMxNjQwMF9zcGlfcmVhZF9idXJzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKLXsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWRpczE2NDAwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKLQl1MzIgb2xkX3NwZWVkX2h6ID0gc3QtPnVzLT5tYXhfc3BlZWRfaHo7Ci0JaW50IHJldDsKLQotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKLQkJewotCQkJLnR4X2J1ZiA9IHN0LT50eCwKLQkJCS5iaXRzX3Blcl93b3JkID0gOCwKLQkJCS5sZW4gPSAyLAotCQkJLmNzX2NoYW5nZSA9IDAsCi0JCX0sIHsKLQkJCS5yeF9idWYgPSByeCwKLQkJCS5iaXRzX3Blcl93b3JkID0gOCwKLQkJCS5sZW4gPSAyNCwKLQkJCS5jc19jaGFuZ2UgPSAxLAotCQl9LAotCX07Ci0KLQltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwotCXN0LT50eFswXSA9IEFESVMxNjQwMF9SRUFEX1JFRyhBRElTMTY0MDBfR0xPQl9DTUQpOwotCXN0LT50eFsxXSA9IDA7Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKLQotCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gbWluKEFESVMxNjQwMF9TUElfQlVSU1QsIG9sZF9zcGVlZF9oeik7Ci0Jc3BpX3NldHVwKHN0LT51cyk7Ci0KLQlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIGJ1cnN0IHJlYWRpbmciKTsKLQotCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gb2xkX3NwZWVkX2h6OwotCXNwaV9zZXR1cChzdC0+dXMpOwotCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgc3NpemVfdCBhZGlzMTY0MDBfc3BpX3JlYWRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNoYXIgKmJ1ZiwKQEAgLTI3Nyw3ICsyMzIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIHNzaXplX3QgYWRpczE2NDAwX3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNvbnN0IGNoYXIgKmJ1ZiwKQEAgLTM0OSw2ICszMDMsMTggQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQogCitzdGF0aWMgaW50IGFkaXMxNjQwMF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTY0MDBfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjQwMF9HTE9CX0NNRCwKKwkJCUFESVMxNjQwMF9HTE9CX0NNRF9TV19SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjQwMF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCkBAIC0zNjQsOCArMzMwLDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLQotCiBpbnQgYWRpczE2NDAwX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKIHsKIAlpbnQgcmV0OwpAQCAtMzg4LDE4ICszNTIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhZGlzMTY0MDBfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQ7Ci0JcmV0ID0gYWRpczE2NDAwX3NwaV93cml0ZV9yZWdfOChkZXYsCi0JCQlBRElTMTY0MDBfR0xPQl9DTUQsCi0JCQlBRElTMTY0MDBfR0xPQl9DTURfU1dfUkVTRVQpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoZGV2LCAicHJvYmxlbSByZXNldHRpbmcgZGV2aWNlIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KIHN0YXRpYyBpbnQgYWRpczE2NDAwX3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTQzMCw3ICszODIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhZGlzMTY0MDBfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYWRpczE2NDAwX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJdTE2IHN0YXR1czsKIAlpbnQgcmV0OwpAQCAtNDk2LDYgKzQ0OCwxMSBAQAogCX0KIAogCS8qIERvIHNlbGYgdGVzdCAqLworCXJldCA9IGFkaXMxNjQwMF9zZWxmX3Rlc3QoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic2VsZiB0ZXN0IGZhaWx1cmUiKTsKKwkJZ290byBlcnJfcmV0OworCX0KIAogCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSByZXN1bHQgKi8KIAlyZXQgPSBhZGlzMTY0MDBfY2hlY2tfc3RhdHVzKGRldik7CkBAIC02ODUsMjEgKzY0MiwxMyBAQAogCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CiAJcmVnZG9uZSA9IDE7CiAKLQlyZXQgPSBhZGlzMTY0MDBfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihzdC0+aW5kaW9fZGV2LT5yaW5nLCAwKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOwogCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CiAJfQogCiAJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKLSNpZiAwIC8qIGZpeG1lOiBoZXJlIHdlIHNob3VsZCBzdXBwb3J0ICovCi0JCWlpb19pbml0X3dvcmtfY29udCgmc3QtPndvcmtfY29udF90aHJlc2gsCi0JCQkJTlVMTCwKLQkJCQlhZGlzMTY0MDBfdGhyZXNoX2hhbmRsZXJfYmhfbm9fY2hlY2ssCi0JCQkJMCwKLQkJCQkwLAotCQkJCXN0KTsKLSNlbmRpZgogCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCiAJCQkJc3QtPmluZGlvX2RldiwKIAkJCQkwLApAQCAtNzI2LDcgKzY3NSw3IEBACiAJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCiAJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JYWRpczE2NDAwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYtPnJpbmcpOwogZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKIAlhZGlzMTY0MDBfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgpAQCAtNzYxLDcgKzcxMCw3IEBACiAJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCiAJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CiAKLQlhZGlzMTY0MDBfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2LT5yaW5nKTsKIAlhZGlzMTY0MDBfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWtmcmVlKHN0LT50eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYwppbmRleCA1NTI5YjMyLi45NDlkYjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtMTYsMTYgKzE3LDYgQEAKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRpczE2NDAwLmgiCiAKLS8qKgotICogY29tYmluZV84X3RvXzE2KCkgdXRpbGl0eSBmdW5jdGlvbiB0byBtdW5nZSB0byB1OHMgaW50byB1MTYKLSAqKi8KLXN0YXRpYyBpbmxpbmUgdTE2IGNvbWJpbmVfOF90b18xNih1OCBsb3dlciwgdTggdXBwZXIpCi17Ci0JdTE2IF9sb3dlciA9IGxvd2VyOwotCXUxNiBfdXBwZXIgPSB1cHBlcjsKLQlyZXR1cm4gX2xvd2VyIHwgKF91cHBlciA8PCA4KTsKLX0KLQogc3RhdGljIElJT19TQ0FOX0VMX0Moc3VwcGx5LCBBRElTMTY0MDBfU0NBTl9TVVBQTFksIElJT19TSUdORUQoMTQpLAogCQkgICAgIEFESVMxNjQwMF9TVVBQTFlfT1VULCBOVUxMKTsKIApAQCAtODMsMTAgKzc0LDEwIEBACiAgKiBhZGlzMTY0MDBfcG9sbF9mdW5jX3RoKCkgdG9wIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRyaWdnZXIKICAqIEBwcml2YXRlX2RhdGE6CWlpb19kZXYKICAqKi8KLXN0YXRpYyB2b2lkIGFkaXMxNjQwMF9wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3N0YXRpYyB2b2lkIGFkaXMxNjQwMF9wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWUpCiB7CiAJc3RydWN0IGFkaXMxNjQwMF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7Ci0Jc3QtPmxhc3RfdGltZXN0YW1wID0gaW5kaW9fZGV2LT50cmlnLT50aW1lc3RhbXA7CisJc3QtPmxhc3RfdGltZXN0YW1wID0gdGltZTsKIAlzY2hlZHVsZV93b3JrKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcpOwogCS8qIEluZGljYXRlIHRoYXQgdGhpcyBpbnRlcnJ1cHQgaXMgYmVpbmcgaGFuZGxlZCAqLwogCkBAIC05Niw2ICs4Nyw1NCBAQAogCSAqLwogfQogCisvKioKKyAqIGFkaXMxNjQwMF9zcGlfcmVhZF9idXJzdCgpIC0gcmVhZCBhbGwgZGF0YSByZWdpc3RlcnMKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMjQgYnl0ZXMpCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjQwMF9zcGlfcmVhZF9idXJzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2NDAwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwl1MzIgb2xkX3NwZWVkX2h6ID0gc3QtPnVzLT5tYXhfc3BlZWRfaHo7CisJaW50IHJldDsKKworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDAsCisJCX0sIHsKKwkJCS5yeF9idWYgPSByeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyNCwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjQwMF9SRUFEX1JFRyhBRElTMTY0MDBfR0xPQl9DTUQpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKworCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gbWluKEFESVMxNjQwMF9TUElfQlVSU1QsIG9sZF9zcGVlZF9oeik7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIGJ1cnN0IHJlYWRpbmciKTsKKworCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gb2xkX3NwZWVkX2h6OworCXNwaV9zZXR1cChzdC0+dXMpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKiBXaGlsc3QgdGhpcyBtYWtlcyBhIGxvdCBvZiBjYWxscyB0byBpaW9fc3dfcmluZyBmdW5jdGlvbnMgLSBpdCBpcyB0byBkZXZpY2UKICAqIHNwZWNpZmljIHRvIGJlIHJvbGxlZCBpbnRvIHRoZSBjb3JlLgogICovCkBAIC0xMTgsMTAgKzE1Nyw5IEBACiAKIAlpZiAoc3QtPmluZGlvX2Rldi0+c2Nhbl9jb3VudCkKIAkJaWYgKGFkaXMxNjQwMF9zcGlfcmVhZF9idXJzdCgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCi0JCQlmb3IgKDsgaSA8IHN0LT5pbmRpb19kZXYtPnNjYW5fY291bnQ7IGkrKykgewotCQkJCWRhdGFbaV0gPSBjb21iaW5lXzhfdG9fMTYoc3QtPnJ4W2kqMisxXSwKLQkJCQkJCQkgIHN0LT5yeFtpKjJdKTsKLQkJCX0KKwkJCWZvciAoOyBpIDwgc3QtPmluZGlvX2Rldi0+c2Nhbl9jb3VudDsgaSsrKQorCQkJCWRhdGFbaV0JPSBiZTE2X3RvX2NwdXAoCisJCQkJCShfX2JlMTYgKikmKHN0LT5yeFtpKjJdKSk7CiAKIAkvKiBHdWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgd2l0aCA4IGJ5dGUgYm91bmRhcnkgKi8KIAlpZiAoc3QtPmluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCkBAIC0xMzYsNDUgKzE3NCw2IEBACiAKIAlyZXR1cm47CiB9Ci0vKiBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzIGlzIGl0IGJldHRlciB0byBnbyB3aXRoIHVuYWxpZ25lZCBwYWNraW5nIGFuZAotICogZGVhbCB3aXRoIHRoZSBjb3N0PyovCi1zdGF0aWMgaW50IGFkaXMxNjQwMF9kYXRhX3JkeV9yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXNpemVfdCBzaXplOwotCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHNjYW4gZWxlbWVudHMgZW5hYmxlZCwgaWYgbm90IGZhaWwqLwotCWlmICghKGluZGlvX2Rldi0+c2Nhbl9jb3VudCB8fCBpbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2JwZCkgewotCQlpZiAoaW5kaW9fZGV2LT5zY2FuX3RpbWVzdGFtcCkKLQkJCWlmIChpbmRpb19kZXYtPnNjYW5fY291bnQpIC8qIFRpbWVzdGFtcCBhbmQgZGF0YSAqLwotCQkJCXNpemUgPSA2KnNpemVvZihzNjQpOwotCQkJZWxzZSAvKiBUaW1lc3RhbXAgb25seSAgKi8KLQkJCQlzaXplID0gc2l6ZW9mKHM2NCk7Ci0JCWVsc2UgLyogRGF0YSBvbmx5ICovCi0JCQlzaXplID0gaW5kaW9fZGV2LT5zY2FuX2NvdW50KnNpemVvZihzMTYpOwotCQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnBkKGluZGlvX2Rldi0+cmluZywgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2NDAwX2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCXJldHVybiBpbmRpb19kZXYtPnRyaWcKLQkJPyBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpCi0JCTogMDsKLX0KLQotc3RhdGljIGludCBhZGlzMTY0MDBfZGF0YV9yZHlfcmluZ19wcmVkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCi17Ci0JcmV0dXJuIGluZGlvX2Rldi0+dHJpZwotCQk/IGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJCWluZGlvX2Rldi0+cG9sbGZ1bmMpCi0JCTogMDsKLX0KIAogdm9pZCBhZGlzMTY0MDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewpAQCAtMjE0LDE4ICsyMTMsMTYgQEAKIAlpbmRpb19kZXYtPnJpbmcgPSByaW5nOwogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKLQlyaW5nLT5wcmVlbmFibGUgPSAmYWRpczE2NDAwX2RhdGFfcmR5X3JpbmdfcHJlZW5hYmxlOwotCXJpbmctPnBvc3RlbmFibGUgPSAmYWRpczE2NDAwX2RhdGFfcmR5X3JpbmdfcG9zdGVuYWJsZTsKLQlyaW5nLT5wcmVkaXNhYmxlID0gJmFkaXMxNjQwMF9kYXRhX3JkeV9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+YnBlID0gMjsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKIAlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCppbmRpb19kZXYtPnBvbGxmdW5jKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGluZGlvX2Rldi0+cG9sbGZ1bmMgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOzsKLQl9Ci0JaW5kaW9fZGV2LT5wb2xsZnVuYy0+cG9sbF9mdW5jX21haW4gPSAmYWRpczE2NDAwX3BvbGxfZnVuY190aDsKLQlpbmRpb19kZXYtPnBvbGxmdW5jLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7CisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjQwMF9wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKIAlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCkBAIC0yMzMsMTMgKzIzMCwzIEBACiAJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKIAlyZXR1cm4gcmV0OwogfQotCi1pbnQgYWRpczE2NDAwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXJldHVybiBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIocmluZywgMCk7Ci19Ci0KLXZvaWQgYWRpczE2NDAwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIocmluZyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3RyaWdnZXIuYwppbmRleCAzYjMyNTBhLi5hYWZlNjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF90cmlnZ2VyLmMKQEAgLTIzLDggKzIzLDcgQEAKIAlzdHJ1Y3QgYWRpczE2NDAwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOwogCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHN0LT50cmlnOwogCi0JdHJpZy0+dGltZXN0YW1wID0gdGltZXN0YW1wOwotCWlpb190cmlnZ2VyX3BvbGwodHJpZyk7CisJaWlvX3RyaWdnZXJfcG9sbCh0cmlnLCB0aW1lc3RhbXApOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtODYsMTQgKzg1LDEzIEBACiAJc3RydWN0IGFkaXMxNjQwMF9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOwogCiAJc3QtPnRyaWcgPSBpaW9fYWxsb2NhdGVfdHJpZ2dlcigpOwotCXN0LT50cmlnLT5uYW1lID0ga21hbGxvYyhJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkgICAiYWRpczE2NDAwLWRldiVkIiwKKwkJCQkgICBpbmRpb19kZXYtPmlkKTsKIAlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCX0KLQlzbnByaW50ZigoY2hhciAqKXN0LT50cmlnLT5uYW1lLAotCQkgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEgsCi0JCSAiYWRpczE2NDAwLWRldiVkIiwgaW5kaW9fZGV2LT5pZCk7CiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CiAJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCmluZGV4IDAxMDMwNjguLmRkNGQ4N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKQEAgLTMwLDkgKzMwLDYgQEAKIAogLyogSURSIHRvIGFzc2lnbiBlYWNoIHJlZ2lzdGVyZWQgZGV2aWNlIGEgdW5pcXVlIGlkKi8KIHN0YXRpYyBERUZJTkVfSURSKGlpb19pZHIpOwotCi0vKiBJRFIgZm9yIGdlbmVyYWwgZXZlbnQgaWRlbnRpZmllcnMgKi8KLXN0YXRpYyBERUZJTkVfSURSKGlpb19ldmVudF9pZHIpOwogLyogSURSIHRvIGFsbG9jYXRlIGNoYXJhY3RlciBkZXZpY2UgbWlub3IgbnVtYmVycyAqLwogc3RhdGljIERFRklORV9JRFIoaWlvX2NocmRldl9pZHIpOwogLyogTG9jayB1c2VkIHRvIHByb3RlY3QgYm90aCBvZiB0aGUgYWJvdmUgKi8KQEAgLTY1NCwxNiArNjUxLDExIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2X2luZm8tPm51bV9pbnRlcnJ1cHRfbGluZXM7IGkrKykgewogCQlkZXZfaW5mby0+ZXZlbnRfaW50ZXJmYWNlc1tpXS5vd25lciA9IGRldl9pbmZvLT5kcml2ZXJfbW9kdWxlOwotCQlyZXQgPSBpaW9fZ2V0X25ld19pZHJfdmFsKCZpaW9fZXZlbnRfaWRyKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX2ZyZWVfc2V0dXBfZXZfaW50czsKLQkJZWxzZQotCQkJZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0uaWQgPSByZXQ7CiAKIAkJc25wcmludGYoZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0uX25hbWUsIDIwLAogCQkJICIlczpldmVudCVkIiwKIAkJCSBkZXZfbmFtZSgmZGV2X2luZm8tPmRldiksCi0JCQkgZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0uaWQpOworCQkJIGkpOwogCiAJCXJldCA9IGlpb19zZXR1cF9ldl9pbnQoJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzW2ldLAogCQkJCSAgICAgICAoY29uc3QgY2hhciAqKShkZXZfaW5mbwpAQCAtNjc0LDggKzY2Niw2IEBACiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmRldl9pbmZvLT5kZXYsCiAJCQkJIkNvdWxkIG5vdCBnZXQgY2hyZGV2IGludGVyZmFjZVxuIik7Ci0JCQlpaW9fZnJlZV9pZHJfdmFsKCZpaW9fZXZlbnRfaWRyLAotCQkJCQkgZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0uaWQpOwogCQkJZ290byBlcnJvcl9mcmVlX3NldHVwX2V2X2ludHM7CiAJCX0KIApAQCAtNzExLDExICs3MDEsOCBAQAogCQkJCSAgIC0+ZXZlbnRfaW50ZXJmYWNlc1tqXS5kZXYua29iaiwKIAkJCQkgICAmZGV2X2luZm8tPmV2ZW50X2F0dHJzW2pdKTsKIGVycm9yX2ZyZWVfc2V0dXBfZXZfaW50czoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCWlpb19mcmVlX2lkcl92YWwoJmlpb19ldmVudF9pZHIsCi0JCQkJIGRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzW2pdLmlkKTsKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQlpaW9fZnJlZV9ldl9pbnQoJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzW2pdKTsKLQl9CiAJa2ZyZWUoZGV2X2luZm8tPmludGVycnVwdHMpOwogZXJyb3JfZnJlZV9ldmVudF9pbnRlcmZhY2VzOgogCWtmcmVlKGRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzKTsKQEAgLTczNSwxMSArNzIyLDggQEAKIAkJCQkgICAtPmV2ZW50X2ludGVyZmFjZXNbaV0uZGV2LmtvYmosCiAJCQkJICAgJmRldl9pbmZvLT5ldmVudF9hdHRyc1tpXSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGV2X2luZm8tPm51bV9pbnRlcnJ1cHRfbGluZXM7IGkrKykgewotCQlpaW9fZnJlZV9pZHJfdmFsKCZpaW9fZXZlbnRfaWRyLAotCQkJCSBkZXZfaW5mby0+ZXZlbnRfaW50ZXJmYWNlc1tpXS5pZCk7CisJZm9yIChpID0gMDsgaSA8IGRldl9pbmZvLT5udW1faW50ZXJydXB0X2xpbmVzOyBpKyspCiAJCWlpb19mcmVlX2V2X2ludCgmZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0pOwotCX0KIAlrZnJlZShkZXZfaW5mby0+aW50ZXJydXB0cyk7CiAJa2ZyZWUoZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tcmluZy5jCmluZGV4IGFkYTE1OWIuLjZhYjU3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXJpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1yaW5nLmMKQEAgLTE0OSwxMiArMTQ5LDEwIEBACiB7CiAJaW50IHJldDsKIAotCWJ1Zi0+ZXZfaW50LmlkID0gaWQ7Ci0KIAlzbnByaW50ZihidWYtPmV2X2ludC5fbmFtZSwgc2l6ZW9mKGJ1Zi0+ZXZfaW50Ll9uYW1lKSwKIAkJICIlczpldmVudCVkIiwKIAkJIGRldl9uYW1lKCZidWYtPmRldiksCi0JCSBidWYtPmV2X2ludC5pZCk7CisJCSBpZCk7CiAJcmV0ID0gaWlvX3NldHVwX2V2X2ludCgmKGJ1Zi0+ZXZfaW50KSwKIAkJCSAgICAgICBidWYtPmV2X2ludC5fbmFtZSwKIAkJCSAgICAgICBvd25lciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwppbmRleCA1NjgyZTYxLi41N2RkOTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCkBAIC0zMSw3ICszMSw2IEBACiAgKiBBbnkgb3RoZXIgc3VnZ2VzdGlvbnM/CiAgKi8KIAotCiBzdGF0aWMgREVGSU5FX0lEUihpaW9fdHJpZ2dlcl9pZHIpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpaW9fdHJpZ2dlcl9pZHJfbG9jayk7CiAKQEAgLTE3Myw3ICsxNzIsNyBAQAogfQogRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl9maW5kX2J5X25hbWUpOwogCi12b2lkIGlpb190cmlnZ2VyX3BvbGwoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQordm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgczY0IHRpbWUpCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmX2N1cnNvcjsKIApAQCAtMTg1LDcgKzE4NCw4IEBACiAJfQogCWxpc3RfZm9yX2VhY2hfZW50cnkocGZfY3Vyc29yLCAmdHJpZy0+cG9sbGZ1bmNfbGlzdCwgbGlzdCkgewogCQlpZiAocGZfY3Vyc29yLT5wb2xsX2Z1bmNfbWFpbikgewotCQkJcGZfY3Vyc29yLT5wb2xsX2Z1bmNfbWFpbihwZl9jdXJzb3ItPnByaXZhdGVfZGF0YSk7CisJCQlwZl9jdXJzb3ItPnBvbGxfZnVuY19tYWluKHBmX2N1cnNvci0+cHJpdmF0ZV9kYXRhLAorCQkJCQkJICB0aW1lKTsKIAkJCXRyaWctPnVzZV9jb3VudCsrOwogCQl9CiAJfQpAQCAtMTk4LDggKzE5OCw3IEBACiAJaWYgKHRyaWctPnVzZV9jb3VudCA9PSAwICYmIHRyaWctPnRyeV9yZWVuYWJsZSkKIAkJaWYgKHRyaWctPnRyeV9yZWVuYWJsZSh0cmlnKSkgewogCQkJLyogTWlzc2VkIGFuZCBpbnRlcnJ1cHQgc28gbGF1bmNoIG5ldyBwb2xsIG5vdyAqLwotCQkJdHJpZy0+dGltZXN0YW1wID0gMDsKLQkJCWlpb190cmlnZ2VyX3BvbGwodHJpZyk7CisJCQlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIDApOwogCQl9CiB9CiBFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX25vdGlmeV9kb25lKTsKQEAgLTI4NCw3ICsyODMsNyBAQAogRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyk7CiAKIC8qKgotICogaWlvX3RyaWdnZXJfcmVhZF9jdXJycmVudCgpIHRyaWdnZXIgY29uc3VtZXIgc3lzZnMgcXVlcnkgd2hpY2ggdHJpZ2dlcgorICogaWlvX3RyaWdnZXJfcmVhZF9jdXJycmVudCgpIC0gdHJpZ2dlciBjb25zdW1lciBzeXNmcyBxdWVyeSB3aGljaCB0cmlnZ2VyCiAgKgogICogRm9yIHRyaWdnZXIgY29uc3VtZXJzIHRoZSBjdXJyZW50X3RyaWdnZXIgaW50ZXJmYWNlIGFsbG93cyB0aGUgdHJpZ2dlcgogICogdXNlZCBieSB0aGUgZGV2aWNlIHRvIGJlIHF1ZXJpZWQuCkBAIC0yOTYsMTAgKzI5NSw5IEBACiAJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGxlbiA9IDA7CiAJaWYgKGRldl9pbmZvLT50cmlnKQotCQlsZW4gPSBzbnByaW50ZihidWYsCi0JCQkgICAgICAgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEgsCi0JCQkgICAgICAgIiVzXG4iLAotCQkJICAgICAgIGRldl9pbmZvLT50cmlnLT5uYW1lKTsKKwkJbGVuID0gc3ByaW50ZihidWYsCisJCQkgICAgICAiJXNcbiIsCisJCQkgICAgICBkZXZfaW5mby0+dHJpZy0+bmFtZSk7CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMzI0LDggKzMyMiw2IEBACiAJfQogCW11dGV4X3VubG9jaygmZGV2X2luZm8tPm1sb2NrKTsKIAotCWxlbiA9IGxlbiA8IElJT19UUklHR0VSX05BTUVfTEVOR1RIID8gbGVuIDogSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEg7Ci0KIAlkZXZfaW5mby0+dHJpZyA9IGlpb190cmlnZ2VyX2ZpbmRfYnlfbmFtZShidWYsIGxlbik7CiAJaWYgKG9sZHRyaWcgJiYgZGV2X2luZm8tPnRyaWcgIT0gb2xkdHJpZykKIAkJaWlvX3B1dF90cmlnZ2VyKG9sZHRyaWcpOwpAQCAtNDAyLDMgKzM5OCwzNCBAQAogfQogRVhQT1JUX1NZTUJPTChpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcik7CiAKK2ludCBpaW9fYWxsb2NfcG9sbGZ1bmMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJICAgICAgIHZvaWQgKCppbW1lZGlhdGUpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpLAorCQkgICAgICAgdm9pZCAoKm1haW4pKHN0cnVjdCBpaW9fZGV2ICpwcml2YXRlX2RhdGEsIHM2NCB0aW1lKSkKK3sKKwlpbmRpb19kZXYtPnBvbGxmdW5jID0ga3phbGxvYyhzaXplb2YoKmluZGlvX2Rldi0+cG9sbGZ1bmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbmRpb19kZXYtPnBvbGxmdW5jLT5wb2xsX2Z1bmNfaW1tZWRpYXRlID0gaW1tZWRpYXRlOworCWluZGlvX2Rldi0+cG9sbGZ1bmMtPnBvbGxfZnVuY19tYWluID0gbWFpbjsKKwlpbmRpb19kZXYtPnBvbGxmdW5jLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlpb19hbGxvY19wb2xsZnVuYyk7CisKK2ludCBpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiBpbmRpb19kZXYtPnRyaWcKKwkJPyBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKKwkJCQkJICAgICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpCisJCTogMDsKK30KK0VYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUpOworCitpbnQgaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gaW5kaW9fZGV2LT50cmlnCisJCT8gaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLAorCQkJCQkJaW5kaW9fZGV2LT5wb2xsZnVuYykKKwkJOiAwOworfQorRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcKaW5kZXggODBjYjZlNS4uM2RkYzQ3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZwpAQCAtMTIsNCArMTIsMyBAQAogCiAJIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgd2lsbCBiZSBjYWxsZWQgdHNsMjU2My4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9saWdodC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9saWdodC5oCmluZGV4IGYwMGY4MjcuLmU0ZTFlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvbGlnaHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2xpZ2h0LmgKQEAgLTIsMTEgKzIsNiBAQAogCiAvKiBMaWdodCB0byBkaWdpdGFsIHNlbnNvciBhdHRyaWJ1dGVzICovCiAKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0xJR0hUX0lORlJBUkVEKF9udW0sIF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGxpZ2h0X2luZnJhcmVkIyNfbnVtLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0xJR0hUX1RIUkVTSCBJSU9fRVZFTlRfQ09ERV9MSUdIVF9CQVNFCiAKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0xJR0hUX0JST0FEKF9udW0sIF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGxpZ2h0X2Jyb2Fkc3BlY3RydW0jI19udW0sIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKIAotI2RlZmluZSBJSU9fREVWX0FUVFJfTElHSFRfVklTSUJMRShfbnVtLCBfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihsaWdodF92aXNpYmxlIyNfbnVtLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5jCmluZGV4IGU0YjBhNWUuLjk4ZjhiNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTcsMTUgKzExOCwxNyBAQAogCXN0cnVjdCBpaW9fZGV2CQkqaW5kaW9fZGV2OwogCXN0cnVjdCBkZWxheWVkX3dvcmsJcG93ZXJvZmZfd29yazsKIAorCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrX3RocmVzaDsKKwlzNjQJCQlldmVudF90aW1lc3RhbXA7CiAJLyogUmVtZW1iZXIgc3RhdGUgZm9yIHN1c3BlbmQgYW5kIHJlc3VtZSBmdW5jdGlvbnMgKi8KIAlwbV9tZXNzYWdlX3QJCXN0YXRlOwogCiAJc3RydWN0IHRzbDI1NjNfZ2FpbmxldmVsX2NvZWZmICpnYWlubGV2ZWw7CiAKLQkvKiBUaHJlc2hvbGRzIGFyZSBpbiBsdXggKi8KIAl1MTYJCQlsb3dfdGhyZXM7CiAJdTE2CQkJaGlnaF90aHJlczsKIAl1OAkJCWludHI7CisJYm9vbAkJCWludF9lbmFibGVkOwogCiAJLyogQ2FsaWJyYXRpb24gY29lZmZpY2llbnRzICovCiAJdTMyCQkJY2FsaWIwOwpAQCAtMTg5LDE3ICsxOTIsMjkgQEAKIAogc3RhdGljIGludCB0c2wyNTYzX2NvbmZpZ3VyZShzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CiAJaW50IHJldDsKIAotCXJldCA9IHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19USU1JTkcsCisJcmV0ID0gdHNsMjU2M193cml0ZShjaGlwLT5jbGllbnQsIFRTTDI1NjNfUkVHX1RJTUlORywKIAkJCWNoaXAtPmdhaW5sZXZlbC0+Z2FpbnRpbWUpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gdHNsMjU2M193cml0ZShjbGllbnQsIFRTTDI1NjNfUkVHX0lOVCwgY2hpcC0+aW50cik7Ci0KLW91dDoKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gdHNsMjU2M193cml0ZShjaGlwLT5jbGllbnQsIFRTTDI1NjNfUkVHX0hJR0hMT1csCisJCQljaGlwLT5oaWdoX3RocmVzICYgMHhGRik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gdHNsMjU2M193cml0ZShjaGlwLT5jbGllbnQsIFRTTDI1NjNfUkVHX0hJR0hISUdILAorCQkJKGNoaXAtPmhpZ2hfdGhyZXMgPj4gOCkgJiAweEZGKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSB0c2wyNTYzX3dyaXRlKGNoaXAtPmNsaWVudCwgVFNMMjU2M19SRUdfTE9XTE9XLAorCQkJY2hpcC0+bG93X3RocmVzICYgMHhGRik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gdHNsMjU2M193cml0ZShjaGlwLT5jbGllbnQsIFRTTDI1NjNfUkVHX0xPV0hJR0gsCisJCQkoY2hpcC0+bG93X3RocmVzID4+IDgpICYgMHhGRik7CisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgaXMgYXV0b21hdGljYWxseSB3cml0dGVuIGFueXdheSBpZiBpdCBpcyByZWxldmFudAorICAgc28gaXMgbm90IGhlcmUgKi8KK2Vycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMjMsMjEgKzMzOCwyMyBAQAogCWlmIChjaGlwLT5zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTikKIAkJZ290byBvdXQ7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrKTsKKwlpZiAoIWNoaXAtPmludF9lbmFibGVkKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNoaXAtPnBvd2Vyb2ZmX3dvcmspOwogCi0JaWYgKCF0c2wyNTYzX2dldF9wb3dlcihjaGlwKSkgewotCQlyZXQgPSB0c2wyNTYzX3NldF9wb3dlcihjaGlwLCAxKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCQlyZXQgPSB0c2wyNTYzX2NvbmZpZ3VyZShjaGlwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCQl0c2wyNTYzX3dhaXRfYWRjKGNoaXApOworCQlpZiAoIXRzbDI1NjNfZ2V0X3Bvd2VyKGNoaXApKSB7CisJCQlyZXQgPSB0c2wyNTYzX3NldF9wb3dlcihjaGlwLCAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCQlyZXQgPSB0c2wyNTYzX2NvbmZpZ3VyZShjaGlwKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCQl0c2wyNTYzX3dhaXRfYWRjKGNoaXApOworCQl9CiAJfQogCiAJd2hpbGUgKHJldHJ5KSB7CiAJCXJldCA9IHRzbDI1NjNfcmVhZChjbGllbnQsCi0JCQkJICAgVFNMMjU2M19SRUdfREFUQTBMT1cgfCBUU0wyNTYzX0NMRUFSSU5ULAorCQkJCSAgIFRTTDI1NjNfUkVHX0RBVEEwTE9XLAogCQkJCSAgIGJ1ZjAsIHNpemVvZihidWYwKSk7CiAJCWlmIChyZXQgIT0gc2l6ZW9mKGJ1ZjApKQogCQkJZ290byBvdXQ7CkBAIC0zNTYsNyArMzczLDggQEAKIAljaGlwLT5kYXRhMCA9IG5vcm1hbGl6ZV9hZGMoYWRjMCwgY2hpcC0+Z2FpbmxldmVsLT5nYWludGltZSk7CiAJY2hpcC0+ZGF0YTEgPSBub3JtYWxpemVfYWRjKGFkYzEsIGNoaXAtPmdhaW5sZXZlbC0+Z2FpbnRpbWUpOwogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrLCA1ICogSFopOworCWlmICghY2hpcC0+aW50X2VuYWJsZWQpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yaywgNSAqIEhaKTsKIAogCXJldCA9IDA7CiBvdXQ6CkBAIC00NDksMTEgKzQ2NywxMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgU3lzZnMgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHNzaXplX3QgdHNsMjU2M19hZGMwX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIHNzaXplX3QgdHNsMjU2M19hZGNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKQEAgLTQ2MiwyNiArNDgxLDE0IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjaGlwLT5kYXRhMCk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCB0c2wyNTYzX2FkYzFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwotCi0JcmV0ID0gdHNsMjU2M19nZXRfYWRjKGNoaXApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2hpcC0+ZGF0YTEpOworCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CisJY2FzZSAwOgorCQlyZXQgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjaGlwLT5kYXRhMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2hpcC0+ZGF0YTEpOworCQlicmVhazsKKwl9CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTI3LDM3ICs1MzQsMzYgQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2FsaWJfdG9fc3lzZnMoY2FsaWIpKTsKIH0KIAotc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfY2FsaWJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKLQlyZXQgPSBmb3JtYXRfY2FsaWIoYnVmLCBQQUdFX1NJWkUsIGNoaXAtPmNhbGliMCk7CisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIDA6CisJCXJldCA9IGZvcm1hdF9jYWxpYihidWYsIFBBR0VfU0laRSwgY2hpcC0+Y2FsaWIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZXQgPSBmb3JtYXRfY2FsaWIoYnVmLCBQQUdFX1NJWkUsIGNoaXAtPmNhbGliMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJfQogCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfY2FsaWJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwotCXJldCA9IGZvcm1hdF9jYWxpYihidWYsIFBBR0VfU0laRSwgY2hpcC0+Y2FsaWIxKTsKLQltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fY2FsaWJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0JCQkgIGludCBjaCkKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCWludCB2YWx1ZTsKIAl1MzIgY2FsaWI7CiAKQEAgLTU2NiwzNyArNTcyLDI3IEBACiAKIAljYWxpYiA9IGNhbGliX2Zyb21fc3lzZnModmFsdWUpOwogCi0JaWYgKGNoKQotCQljaGlwLT5jYWxpYjEgPSBjYWxpYjsKLQllbHNlCisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIDA6CiAJCWNoaXAtPmNhbGliMCA9IGNhbGliOworCQlicmVhazsKKwljYXNlIDE6CisJCWNoaXAtPmNhbGliMSA9IGNhbGliOworCQlicmVhazsKKwl9CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgc3NpemVfdCB0c2wyNTYzX2NhbGliMF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0JcmV0dXJuIGRvX2NhbGliX3N0b3JlKGRldiwgYnVmLCBsZW4sIDApOwotfQotCi1zdGF0aWMgc3NpemVfdCB0c2wyNTYzX2NhbGliMV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0JcmV0dXJuIGRvX2NhbGliX3N0b3JlKGRldiwgYnVmLCBsZW4sIDEpOwotfQotCi0vKiBBbWl0WFhYWDogQ29udmVydCB0byBJSU9fREVWX0FUVFJfTElHSFQqIGFzIGluIHRzbDI1NjEKLSAqIG9uY2UgSSB1bmRlcnN0YW5kIHdoYXQgdGhleSBtZWFuICovCi1zdGF0aWMgREVWSUNFX0FUVFIoYWRjMCwgU19JUlVHTywgdHNsMjU2M19hZGMwX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGFkYzEsIFNfSVJVR08sIHRzbDI1NjNfYWRjMV9zaG93LCBOVUxMKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW50ZW5zaXR5X2JvdGhfcmF3LCBTX0lSVUdPLAorCQl0c2wyNTYzX2FkY19zaG93LCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW50ZW5zaXR5X2lyX3JhdywgU19JUlVHTywKKwkJdHNsMjU2M19hZGNfc2hvdywgTlVMTCwgMSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaWxsdW1pbmFuY2UwX2lucHV0LCBTX0lSVUdPLCB0c2wyNTYzX2x1eF9zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjYWxpYjAsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICB0c2wyNTYzX2NhbGliMF9zaG93LCB0c2wyNTYzX2NhbGliMF9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY2FsaWIxLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgdHNsMjU2M19jYWxpYjFfc2hvdywgdHNsMjU2M19jYWxpYjFfc3RvcmUpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbnRlbnNpdHlfYm90aF9jYWxpYmdhaW4sIFNfSVJVR08gfCBTX0lXVVNSLAorCQl0c2wyNTYzX2NhbGliX3Nob3csIHRzbDI1NjNfY2FsaWJfc3RvcmUsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbnRlbnNpdHlfaXJfY2FsaWJnYWluLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJdHNsMjU2M19jYWxpYl9zaG93LCB0c2wyNTYzX2NhbGliX3N0b3JlLCAxKTsKIAogc3RhdGljIHNzaXplX3QgdHNsMjU2M19zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtNjEwLDExICs2MDYsMTEgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCB0c2wyNTYzX3Nob3dfbmFtZSwgTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0c2wyNTYzX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfYWRjMC5hdHRyLAotCSZkZXZfYXR0cl9hZGMxLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbnRlbnNpdHlfYm90aF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ludGVuc2l0eV9pcl9yYXcuZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfaWxsdW1pbmFuY2UwX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2NhbGliMC5hdHRyLAotCSZkZXZfYXR0cl9jYWxpYjEuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ludGVuc2l0eV9ib3RoX2NhbGliZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW50ZW5zaXR5X2lyX2NhbGliZ2Fpbi5kZXZfYXR0ci5hdHRyLAogCSZkZXZfYXR0cl9uYW1lLmF0dHIsCiAJTlVMTAogfTsKQEAgLTYyMyw2ICs2MTksMTkyIEBACiAJLmF0dHJzID0gdHNsMjU2M19hdHRyaWJ1dGVzLAogfTsKIAorc3RhdGljIHNzaXplX3QgdHNsMjU2M19yZWFkX3RocmVzaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXUxNiB2YWwgPSAwOworCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CisJY2FzZSBUU0wyNTYzX1JFR19ISUdITE9XOgorCQl2YWwgPSBjaGlwLT5oaWdoX3RocmVzOworCQlicmVhazsKKwljYXNlIFRTTDI1NjNfUkVHX0xPV0xPVzoKKwkJdmFsID0gY2hpcC0+bG93X3RocmVzOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfd3JpdGVfdGhyZXNoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCXJldCA9IHRzbDI1NjNfd3JpdGUoY2hpcC0+Y2xpZW50LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCAmIDB4RkYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHRzbDI1NjNfd3JpdGUoY2hpcC0+Y2xpZW50LCB0aGlzX2F0dHItPmFkZHJlc3MgKyAxLAorCQkJKHZhbCA+PiA4KSAmIDB4RkYpOworCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CisJY2FzZSBUU0wyNTYzX1JFR19ISUdITE9XOgorCQljaGlwLT5oaWdoX3RocmVzID0gdmFsOworCQlicmVhazsKKwljYXNlIFRTTDI1NjNfUkVHX0xPV0xPVzoKKwkJY2hpcC0+bG93X3RocmVzID0gdmFsOworCQlicmVhazsKKwl9CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW50ZW5zaXR5X2JvdGhfdGhyZXNoX2hpZ2hfdmFsdWUsCisJCVNfSVJVR08gfCBTX0lXVVNSLAorCQl0c2wyNTYzX3JlYWRfdGhyZXNoLAorCQl0c2wyNTYzX3dyaXRlX3RocmVzaCwKKwkJVFNMMjU2M19SRUdfSElHSExPVyk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW50ZW5zaXR5X2JvdGhfdGhyZXNoX2xvd192YWx1ZSwKKwkJU19JUlVHTyB8IFNfSVdVU1IsCisJCXRzbDI1NjNfcmVhZF90aHJlc2gsCisJCXRzbDI1NjNfd3JpdGVfdGhyZXNoLAorCQlUU0wyNTYzX1JFR19MT1dMT1cpOworCitzdGF0aWMgaW50IHRzbDI1NjNfaW50X3RoKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJCWludCBpbmRleCwKKwkJCXM2NCB0aW1lc3RhbXAsCisJCQlpbnQgbm90X3Rlc3QpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmV2ZW50X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT53b3JrX3RocmVzaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHNsMjU2M19pbnRfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcAorCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsCisJCQlzdHJ1Y3QgdHNsMjU2M19jaGlwLCB3b3JrX3RocmVzaCk7CisJdTggY21kID0gVFNMMjU2M19DTUQgfCBUU0wyNTYzX0NMRUFSSU5UOworCisJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQlJSU9fRVZFTlRfQ09ERV9MSUdIVF9CQVNFLAorCQljaGlwLT5ldmVudF90aW1lc3RhbXApOworCisJLyogcmVlbmFibGVfaXJxICovCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisJLyogY2xlYXIgdGhlIGludGVycnVwdCBhbmQgcHVzaCB0aGUgZXZlbnQgKi8KKwlpMmNfbWFzdGVyX3NlbmQoY2hpcC0+Y2xpZW50LCAmY21kLCBzaXplb2YoY21kKSk7CisKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19ldmVudF9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZXZlbnRfYXR0cihhdHRyKTsKKwlpbnQgaW5wdXQsIHJldCA9IDA7CisKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJWQiLCAmaW5wdXQpOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisJaWYgKGlucHV0ICYmICEoY2hpcC0+aW50ciAmIDB4MzApKSB7CisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCh0aGlzX2F0dHItPmxpc3RlbCwKKwkJCQkmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKwkJY2hpcC0+aW50ciAmPSB+MHgzMDsKKwkJY2hpcC0+aW50ciB8PSAweDEwOworCQkvKiBlbnN1cmUgdGhlIGNoaXAgaXMgYWN0dWFsbHkgb24gKi8KKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yayk7CisJCWlmICghdHNsMjU2M19nZXRfcG93ZXIoY2hpcCkpIHsKKwkJCXJldCA9IHRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJCXJldCA9IHRzbDI1NjNfY29uZmlndXJlKGNoaXApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSB0c2wyNTYzX3dyaXRlKGNoaXAtPmNsaWVudCwgVFNMMjU2M19SRUdfSU5ULCBjaGlwLT5pbnRyKTsKKwkJY2hpcC0+aW50X2VuYWJsZWQgPSB0cnVlOworCX0KKworCWlmICghaW5wdXQgJiYgKGNoaXAtPmludHIgJiAweDMwKSkgeworCQljaGlwLT5pbnRyIHw9IH4weDMwOworCQlyZXQgPSB0c2wyNTYzX3dyaXRlKGNoaXAtPmNsaWVudCwgVFNMMjU2M19SRUdfSU5ULCBjaGlwLT5pbnRyKTsKKwkJaWlvX3JlbW92ZV9ldmVudF9mcm9tX2xpc3QodGhpc19hdHRyLT5saXN0ZWwsCisJCQkJCSZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCQljaGlwLT5pbnRfZW5hYmxlZCA9IGZhbHNlOworCQkvKiBub3cgdGhlIGludGVycnVwdCBpcyBub3QgZW5hYmxlZCwgd2UgY2FuIGdvIHRvIHNsZWVwICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yaywgNSAqIEhaKTsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1OCByeGJ1ZjsKKwlzc2l6ZV90IGxlbjsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCXJldCA9IHRzbDI1NjNfcmVhZChjaGlwLT5jbGllbnQsCisJCQlUU0wyNTYzX1JFR19JTlQsCisJCQkmcnhidWYsCisJCQlzaXplb2YocnhidWYpKTsKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3JldDsKKwlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIShyeGJ1ZiAmIDB4MzApKTsKK2Vycm9yX3JldDoKKworCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiBsZW47Cit9CisKK0lJT19FVkVOVF9BVFRSKGludGVuc2l0eV9ib3RoX3RocmVzaF9ib3RoX2VuLAorCXRzbDI1NjNfcmVhZF9pbnRlcnJ1cHRfY29uZmlnLAorCXRzbDI1NjNfd3JpdGVfaW50ZXJydXB0X2NvbmZpZywKKwkwLAorCXRzbDI1NjNfaW50X3RoKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRzbDI1NjNfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9pbnRlbnNpdHlfYm90aF90aHJlc2hfYm90aF9lbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW50ZW5zaXR5X2JvdGhfdGhyZXNoX2hpZ2hfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ludGVuc2l0eV9ib3RoX3RocmVzaF9sb3dfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdHNsMjU2M19ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gdHNsMjU2M19ldmVudF9hdHRyaWJ1dGVzLAorfTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiAgICAgICAgICAgICAgICAgICAgICBQcm9iZSwgQXR0YWNoLCBSZW1vdmUgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjQxLDYgKzgyMyw3IEBACiAJaWYgKCFjaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCUlOSVRfV09SSygmY2hpcC0+d29ya190aHJlc2gsIHRzbDI1NjNfaW50X2JoKTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKIAljaGlwLT5jbGllbnQgPSBjbGllbnQ7CiAKQEAgLTY3OSwxOCArODYyLDM2IEBACiAJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOwogCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOwogCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpZiAoY2xpZW50LT5pcnEpIHsKKwkJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwkJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycworCQkJPSAmdHNsMjU2M19ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJfQogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWwxOwogCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkJCTAsCisJCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCQkJY2xpZW50LT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDI7CisJfQogCWVyciA9IHRzbDI1NjNfY29uZmlndXJlKGNoaXApOwogCWlmIChlcnIpCi0JCWdvdG8gZmFpbDI7CisJCWdvdG8gZmFpbDM7CiAKIAlJTklUX0RFTEFZRURfV09SSygmY2hpcC0+cG93ZXJvZmZfd29yaywgdHNsMjU2M19wb3dlcm9mZl93b3JrKTsKKwkvKiBUaGUgaW50ZXJydXB0IGNhbm5vdCB5ZXQgYmUgZW5hYmxlZCBzbyB0aGlzIGlzIGZpbmUgd2l0aG91dCBsb2NrICovCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrLCA1ICogSFopOwogCiAJcmV0dXJuIDA7CitmYWlsMzoKKwlpZiAoY2xpZW50LT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CiBmYWlsMjoKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKIGZhaWwxOgpAQCAtNzAxLDcgKzkwMiwxNSBAQAogc3RhdGljIGludCB0c2wyNTYzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQorCWlmICghY2hpcC0+aW50X2VuYWJsZWQpCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNoaXAtPnBvd2Vyb2ZmX3dvcmspOworCS8qIEVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIGRpc2FibGVkIC0gdGhlbiBmbHVzaCBhbnkgYm90dG9tIGhhbHZlcyAqLworCWNoaXAtPmludHIgfD0gfjB4MzA7CisJdHNsMjU2M193cml0ZShjaGlwLT5jbGllbnQsIFRTTDI1NjNfUkVHX0lOVCwgY2hpcC0+aW50cik7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl0c2wyNTYzX3NldF9wb3dlcihjaGlwLCAwKTsKKwlpZiAoY2xpZW50LT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CiAKIAlrZnJlZShjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFnbmV0b21ldGVyIHNlbnNvcnMKKyMKK2NvbW1lbnQgIk1hZ25ldG9tZXRlciBzZW5zb3JzIgorCitjb25maWcgU0VOU09SU19ITUM1ODQzCisJdHJpc3RhdGUgIkhvbmV5d2VsbCBITUM1ODQzIDMtQXhpcyBNYWduZXRvbWV0ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgSG9uZXl3ZWxsIEhNQyA1ODQzIDMtQXhpcworCSAgTWFnbmV0b21ldGVyIChkaWdpdGFsIGNvbXBhc3MpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBobWM1ODQzCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliZmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gTWFnbmV0b21ldGVyIHNlbnNvcnMKKyMKKworb2JqLSQoQ09ORklHX1NFTlNPUlNfSE1DNTg0MykJKz0gaG1jNTg0My5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNmM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDMuYwpAQCAtMCwwICsxLDYyNCBAQAorLyogIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cworICAgIEF1dGhvcjogU2h1YmhyYWp5b3RpIERhdHRhIDxzaHViaHJhanlvdGlAdGkuY29tPgorICAgIEFja25vd2xlZGdlbWVudDogSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAY2FtLmFjLnVrPiBmb3IgdmFsdWFibGUgaW5wdXRzLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWFnbmV0LmgiCisKKyNkZWZpbmUgSE1DNTg0M19JMkNfQUREUkVTUwkJCTB4MUUKKworI2RlZmluZSBITUM1ODQzX0NPTkZJR19SRUdfQQkJCTB4MDAKKyNkZWZpbmUgSE1DNTg0M19DT05GSUdfUkVHX0IJCQkweDAxCisjZGVmaW5lIEhNQzU4NDNfTU9ERV9SRUcJCQkweDAyCisjZGVmaW5lIEhNQzU4NDNfREFUQV9PVVRfWF9NU0JfUkVHCQkweDAzCisjZGVmaW5lIEhNQzU4NDNfREFUQV9PVVRfWF9MU0JfUkVHCQkweDA0CisjZGVmaW5lIEhNQzU4NDNfREFUQV9PVVRfWV9NU0JfUkVHCQkweDA1CisjZGVmaW5lIEhNQzU4NDNfREFUQV9PVVRfWV9MU0JfUkVHCQkweDA2CisjZGVmaW5lIEhNQzU4NDNfREFUQV9PVVRfWl9NU0JfUkVHCQkweDA3CisjZGVmaW5lIEhNQzU4NDNfREFUQV9PVVRfWl9MU0JfUkVHCQkweDA4CisjZGVmaW5lIEhNQzU4NDNfU1RBVFVTX1JFRwkJCTB4MDkKKyNkZWZpbmUgSE1DNTg0M19JRF9SRUdfQQkJCTB4MEEKKyNkZWZpbmUgSE1DNTg0M19JRF9SRUdfQgkJCTB4MEIKKyNkZWZpbmUgSE1DNTg0M19JRF9SRUdfQwkJCTB4MEMKKworI2RlZmluZSBITUM1ODQzX0lEX1JFR19MRU5HVEgJCQkweDAzCisjZGVmaW5lIEhNQzU4NDNfSURfU1RSSU5HCQkJIkg0MyIKKworLyoKKyAqIFJhbmdlIHNldHRpbmdzIGluICAoKy0pR2EKKyAqICovCisjZGVmaW5lIFJBTkdFX0dBSU5fT0ZGU0VUCQkJMHgwNQorCisjZGVmaW5lCVJBTkdFXzBfNwkJCQkweDAwCisjZGVmaW5lCVJBTkdFXzFfMAkJCQkweDAxIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUJUkFOR0VfMV81CQkJCTB4MDIKKyNkZWZpbmUJUkFOR0VfMl8wCQkJCTB4MDMKKyNkZWZpbmUJUkFOR0VfM18yCQkJCTB4MDQKKyNkZWZpbmUJUkFOR0VfM184CQkJCTB4MDUKKyNkZWZpbmUJUkFOR0VfNF81CQkJCTB4MDYKKyNkZWZpbmUJUkFOR0VfNl81CQkJCTB4MDcgLyogTm90IHJlY29tbWVuZGVkICovCisKKy8qCisgKiBEZXZpY2Ugc3RhdHVzCisgKi8KKyNkZWZpbmUJREFUQV9SRUFEWSAgCQkJCTB4MDEKKyNkZWZpbmUJREFUQV9PVVRQVVRfTE9DSyAgCQkJMHgwMgorI2RlZmluZQlWT0xUQUdFX1JFR1VMQVRPUl9FTkFCTEVEICAJCTB4MDQKKworLyoKKyAqIE1vZGUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lCU1PREVfQ09OVkVSU0lPTl9DT05USU5VT1VTCQkweDAwCisjZGVmaW5lCU1PREVfQ09OVkVSU0lPTl9TSU5HTEUJCQkweDAxCisjZGVmaW5lCU1PREVfSURMRQkJCQkweDAyCisjZGVmaW5lCU1PREVfU0xFRVAJCQkJMHgwMworCisvKiBNaW5pbXVtIERhdGEgT3V0cHV0IFJhdGUgaW4gMS8xMCBIeiAgKi8KKyNkZWZpbmUgUkFURV9PRkZTRVQJCQkJMHgwMgorI2RlZmluZSBSQVRFX0JJVE1BU0sJCQkJMHgxQworI2RlZmluZQlSQVRFXzUJCQkJCTB4MDAKKyNkZWZpbmUJUkFURV8xMAkJCQkJMHgwMQorI2RlZmluZQlSQVRFXzIwCQkJCQkweDAyCisjZGVmaW5lCVJBVEVfNTAJCQkJCTB4MDMKKyNkZWZpbmUJUkFURV8xMDAJCQkJMHgwNAorI2RlZmluZQlSQVRFXzIwMAkJCQkweDA1CisjZGVmaW5lCVJBVEVfNTAwCQkJCTB4MDYKKyNkZWZpbmUJUkFURV9OT1RfVVNFRAkJCQkweDA3CisKKy8qCisgKiBEZXZpY2UgQ29uZmlndXRyYXRpb24KKyAqLworI2RlZmluZQlDT05GX05PUk1BTCAgCQkJCTB4MDAKKyNkZWZpbmUJQ09ORl9QT1NJVElWRV9CSUFTCQkJMHgwMQorI2RlZmluZQlDT05GX05FR0FUSVZFX0JJQVMJCQkweDAyCisjZGVmaW5lCUNPTkZfTk9UX1VTRUQJCQkJMHgwMworI2RlZmluZQlNRUFTX0NPTkZfTUFTSwkJCQkweDAzCisKK3N0YXRpYyBjb25zdCBpbnQgcmVndmFsX3RvX2NvdW50c19wZXJfbWdbXSA9IHsKKwkxNjIwLAorCTEzMDAsCisJOTcwLAorCTc4MCwKKwk1MzAsCisJNDYwLAorCTM5MCwKKwkyODAKK307CitzdGF0aWMgY29uc3QgaW50IHJlZ3ZhbF90b19pbnB1dF9maWVsZF9tZ1tdID0geworCTcwMCwKKwkxMDAwLAorCTE1MDAsCisJMjAwMCwKKwkzMjAwLAorCTM4MDAsCisJNDUwMCwKKwk2NTAwCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKnJlZ3ZhbF90b19zYW1wX2ZyZXFbXSA9IHsKKwkiMC41IiwKKwkiMSIsCisJIjIiLAorCSI1IiwKKwkiMTAiLAorCSIyMCIsCisJIjUwIiwKK307CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuOiAweDFFICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBITUM1ODQzX0kyQ19BRERSRVNTLAorCQkJCQkJCUkyQ19DTElFTlRfRU5EIH07CisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IGhtYzU4NDNfZGF0YSB7CisJc3RydWN0IGlpb19kZXYJKmluZGlvX2RldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1OAkJcmF0ZTsKKwl1OAkJbWVhc19jb25mOworCXU4CQlvcGVyYXRpbmdfbW9kZTsKKwl1OAkJcmFuZ2U7Cit9OworCitzdGF0aWMgdm9pZCBobWM1ODQzX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgczMyIGhtYzU4NDNfY29uZmlndXJlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgIHU4IG9wZXJhdGluZ19tb2RlKQoreworCS8qIFRoZSBsb3dlciB0d28gYml0cyBjb250YWluIHRoZSBjdXJyZW50IGNvbnZlcnNpb24gbW9kZSAqLworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJSE1DNTg0M19NT0RFX1JFRywKKwkJCQkJKG9wZXJhdGluZ19tb2RlICYgMHgwMykpOworfQorCisvKiBSZXR1cm4gdGhlIG1lYXN1cmVtZW50IHZhbHVlIGZyb20gdGhlICBzcGVjaWZpZWQgY2hhbm5lbCAqLworc3RhdGljIHNzaXplX3QgaG1jNTg0M19yZWFkX21lYXN1cmVtZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoaW5kaW9fZGV2LT5kZXYucGFyZW50KTsKKwlzMTYgY29vcmRpbmF0ZV92YWw7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXMzMiByZXN1bHQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJlc3VsdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEhNQzU4NDNfU1RBVFVTX1JFRyk7CisJd2hpbGUgKCEocmVzdWx0ICYgREFUQV9SRUFEWSkpCisJCXJlc3VsdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEhNQzU4NDNfU1RBVFVTX1JFRyk7CisKKwlyZXN1bHQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCB0aGlzX2F0dHItPmFkZHJlc3MpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJY29vcmRpbmF0ZV92YWwJPSAoczE2KXN3YWIxNigodTE2KXJlc3VsdCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNvb3JkaW5hdGVfdmFsKTsKK30KK3N0YXRpYyBJSU9fREVWX0FUVFJfTUFHTl9YKGhtYzU4NDNfcmVhZF9tZWFzdXJlbWVudCwKKwkJSE1DNTg0M19EQVRBX09VVF9YX01TQl9SRUcpOworc3RhdGljIElJT19ERVZfQVRUUl9NQUdOX1koaG1jNTg0M19yZWFkX21lYXN1cmVtZW50LAorCQlITUM1ODQzX0RBVEFfT1VUX1lfTVNCX1JFRyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX01BR05fWihobWM1ODQzX3JlYWRfbWVhc3VyZW1lbnQsCisJCUhNQzU4NDNfREFUQV9PVVRfWl9NU0JfUkVHKTsKKworLyoKKyAqIEZyb20gdGhlIGRhdGFzaGVldAorICogMCAtIENvbnRpbnVvdXMtQ29udmVyc2lvbiBNb2RlOiBJbiBjb250aW51b3VzLWNvbnZlcnNpb24gbW9kZSwgdGhlCisgKiBkZXZpY2UgY29udGludW91c2x5IHBlcmZvcm1zIGNvbnZlcnNpb25zIGFuIHBsYWNlcyB0aGUgcmVzdWx0IGluIHRoZQorICogZGF0YSByZWdpc3Rlci4KKyAqCisgKiAxIC0gU2luZ2xlLUNvbnZlcnNpb24gTW9kZSA6IGRldmljZSBwZXJmb3JtcyBhIHNpbmdsZSBtZWFzdXJlbWVudCwKKyAqICBzZXRzIFJEWSBoaWdoIGFuZCByZXR1cm5lZCB0byBzbGVlcCBtb2RlCisgKgorICogMiAtIElkbGUgTW9kZSA6ICBEZXZpY2UgaXMgcGxhY2VkIGluIGlkbGUgbW9kZS4KKyAqCisgKiAzIC0gU2xlZXAgTW9kZS4gRGV2aWNlIGlzIHBsYWNlZCBpbiBzbGVlcCBtb2RlLgorICoKKyAqLworc3RhdGljIHNzaXplX3QgaG1jNTg0M19zaG93X29wZXJhdGluZ19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPm9wZXJhdGluZ19tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgaG1jNTg0M19zZXRfb3BlcmF0aW5nX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGluZGlvX2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXVuc2lnbmVkIGxvbmcgb3BlcmF0aW5nX21vZGUgPSAwOworCXMzMiBzdGF0dXM7CisJaW50IGVycm9yOworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWVycm9yID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJm9wZXJhdGluZ19tb2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlkZXZfZGJnKGRldiwgInNldCBDb252ZXJzaW9uIG1vZGUgdG8gJWx1XG4iLCBvcGVyYXRpbmdfbW9kZSk7CisJaWYgKG9wZXJhdGluZ19tb2RlID4gTU9ERV9TTEVFUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHRoaXNfYXR0ci0+YWRkcmVzcywKKwkJCQkJb3BlcmF0aW5nX21vZGUpOworCWlmIChzdGF0dXMpIHsKKwkJY291bnQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWRhdGEtPm9wZXJhdGluZ19tb2RlID0gb3BlcmF0aW5nX21vZGU7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG9wZXJhdGluZ19tb2RlLAorCQkJU19JV1VTUiB8IFNfSVJVR08sCisJCQlobWM1ODQzX3Nob3dfb3BlcmF0aW5nX21vZGUsCisJCQlobWM1ODQzX3NldF9vcGVyYXRpbmdfbW9kZSwKKwkJCUhNQzU4NDNfTU9ERV9SRUcpOworCisvKgorICogQVBJIGZvciBzZXR0aW5nIHRoZSBtZWFzdXJlbWVudCBjb25maWd1cmF0aW9uIHRvCisgKiBOb3JtYWwsIFBvc2l0aXZlIGJpYXMgYW5kIE5lZ2F0aXZlIGJpYXMKKyAqIEZyb20gdGhlIGRhdGFzaGVldAorICoKKyAqIE5vcm1hbCBtZWFzdXJlbWVudCBjb25maWd1cmF0aW9uIChkZWZhdWx0KTogSW4gbm9ybWFsIG1lYXN1cmVtZW50CisgKiBjb25maWd1cmF0aW9uIHRoZSBkZXZpY2UgZm9sbG93cyBub3JtYWwgbWVhc3VyZW1lbnQgZmxvdy4gUGlucyBCUCBhbmQgQk4KKyAqIGFyZSBsZWZ0IGZsb2F0aW5nIGFuZCBoaWdoIGltcGVkYW5jZS4KKyAqCisgKiBQb3NpdGl2ZSBiaWFzIGNvbmZpZ3VyYXRpb246IEluIHBvc2l0aXZlIGJpYXMgY29uZmlndXJhdGlvbiwgYSBwb3NpdGl2ZQorICogY3VycmVudCBpcyBmb3JjZWQgYWNyb3NzIHRoZSByZXNpc3RpdmUgbG9hZCBvbiBwaW5zIEJQIGFuZCBCTi4KKyAqCisgKiBOZWdhdGl2ZSBiaWFzIGNvbmZpZ3VyYXRpb24uIEluIG5lZ2F0aXZlIGJpYXMgY29uZmlndXJhdGlvbiwgYSBuZWdhdGl2ZQorICogY3VycmVudCBpcyBmb3JjZWQgYWNyb3NzIHRoZSByZXNpc3RpdmUgbG9hZCBvbiBwaW5zIEJQIGFuZCBCTi4KKyAqCisgKi8KK3N0YXRpYyBzMzIgaG1jNTg0M19zZXRfbWVhc19jb25mKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgdTggbWVhc19jb25mKQoreworCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCByZWdfdmFsOworCXJlZ192YWwgPSAobWVhc19jb25mICYgTUVBU19DT05GX01BU0spIHwgIChkYXRhLT5yYXRlIDw8IFJBVEVfT0ZGU0VUKTsKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEhNQzU4NDNfQ09ORklHX1JFR19BLCByZWdfdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgaG1jNTg0M19zaG93X21lYXN1cmVtZW50X2NvbmZpZ3VyYXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5tZWFzX2NvbmYpOworfQorCitzdGF0aWMgc3NpemVfdCBobWM1ODQzX3NldF9tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChpbmRpb19kZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIG1lYXNfY29uZiA9IDA7CisJaW50IGVycm9yID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJm1lYXNfY29uZik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKKwlkZXZfZGJnKGRldiwgInNldCBtb2RlIHRvICVsdVxuIiwgbWVhc19jb25mKTsKKwlpZiAoaG1jNTg0M19zZXRfbWVhc19jb25mKGNsaWVudCwgbWVhc19jb25mKSkgeworCQljb3VudCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJZGF0YS0+bWVhc19jb25mID0gbWVhc19jb25mOworCitleGl0OgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihtZWFzX2NvbmYsCisJCQlTX0lXVVNSIHwgU19JUlVHTywKKwkJCWhtYzU4NDNfc2hvd19tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uLAorCQkJaG1jNTg0M19zZXRfbWVhc3VyZW1lbnRfY29uZmlndXJhdGlvbiwKKwkJCTApOworCisvKgorICogRnJvbSBEYXRhc2hlZXQKKyAqIFRoZSB0YWJsZSBzaG93cyB0aGUgbWluaW11bSBkYXRhIG91dHB1dAorICogVmFsdWUJfCBNaW5pbXVtIGRhdGEgb3V0cHV0IHJhdGUoSHopCisgKiAwCQl8IDAuNQorICogMQkJfCAxCisgKiAyCQl8IDIKKyAqIDMJCXwgNQorICogNAkJfCAxMCAoZGVmYXVsdCkKKyAqIDUJCXwgMjAKKyAqIDYJCXwgNTAKKyAqIDcJCXwgTm90IHVzZWQKKyAqLworc3RhdGljIElJT19DT05TVF9BVFRSX0FWQUlMX1NBTVBfRlJFUSgiMC41IDEgMiA1IDEwIDIwIDUwIik7CisKK3N0YXRpYyBzMzIgaG1jNTg0M19zZXRfcmF0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCXU4IHJhdGUpCit7CisJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IHJlZ192YWw7CisKKwlyZWdfdmFsID0gKGRhdGEtPm1lYXNfY29uZikgfCAgKHJhdGUgPDwgUkFURV9PRkZTRVQpOworCWlmIChyYXRlID49IFJBVEVfTk9UX1VTRUQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiVGhpcyBkYXRhIG91dHB1dCByYXRlIGlzIG5vdCBzdXBwb3J0ZWQgXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSE1DNTg0M19DT05GSUdfUkVHX0EsIHJlZ192YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfc2FtcGxpbmdfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGluZGlvX2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyByYXRlID0gMDsKKworCWlmIChzdHJuY21wKGJ1ZiwgIjAuNSIgLCAzKSA9PSAwKQorCQlyYXRlID0gUkFURV81OworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiMSIgLCAxKSA9PSAwKQorCQlyYXRlID0gUkFURV8xMDsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgIjIiLCAxKSA9PSAwKQorCQlyYXRlID0gUkFURV8yMDsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgIjUiLCAxKSA9PSAwKQorCQlyYXRlID0gUkFURV81MDsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgIjEwIiwgMikgPT0gMCkKKwkJcmF0ZSA9IFJBVEVfMTAwOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiMjAiICwgMikgPT0gMCkKKwkJcmF0ZSA9IFJBVEVfMjAwOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiNTAiICwgMikgPT0gMCkKKwkJcmF0ZSA9IFJBVEVfNTAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlkZXZfZGJnKGRldiwgInNldCByYXRlIHRvICVsdVxuIiwgcmF0ZSk7CisJaWYgKGhtYzU4NDNfc2V0X3JhdGUoY2xpZW50LCByYXRlKSkgeworCQljb3VudCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJZGF0YS0+cmF0ZSA9IHJhdGU7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGluZGlvX2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXUzMiByYXRlOworCisJcmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsICB0aGlzX2F0dHItPmFkZHJlc3MpOworCWlmIChyYXRlIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmF0ZSA9IChyYXRlICYgUkFURV9CSVRNQVNLKSA+PiBSQVRFX09GRlNFVDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcmVndmFsX3RvX3NhbXBfZnJlcVtyYXRlXSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHNhbXBsaW5nX2ZyZXF1ZW5jeSwKKwkJCVNfSVdVU1IgfCBTX0lSVUdPLAorCQkJc2hvd19zYW1wbGluZ19mcmVxdWVuY3ksCisJCQlzZXRfc2FtcGxpbmdfZnJlcXVlbmN5LAorCQkJSE1DNTg0M19DT05GSUdfUkVHX0EpOworCisvKgorICogRnJvbSBEYXRhc2hlZXQKKyAqCU5vbWluYWwgZ2FpbiBzZXR0aW5ncworICogVmFsdWUJfCBTZW5zb3IgSW5wdXQgRmllbGQgUmFuZ2UoR2EpCXwgR2Fpbihjb3VudHMvIG1pbGxpLWdhdXNzKQorICowCQl8KCstKTAuNwkJCXwxNjIwCisgKjEJCXwoKy0pMS4wCQkJfDEzMDAKKyAqMgkJfCgrLSkxLjUJCQl8OTcwCisgKjMJCXwoKy0pMi4wCQkJfDc4MAorICo0CQl8KCstKTMuMgkJCXw1MzAKKyAqNQkJfCgrLSkzLjgJCQl8NDYwCisgKjYJCXwoKy0pNC41CQkJfDM5MAorICo3CQl8KCstKTYuNQkJCXwyODAKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19yYW5nZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXU4IHJhbmdlOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXJhbmdlID0gZGF0YS0+cmFuZ2U7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlZ3ZhbF90b19pbnB1dF9maWVsZF9tZ1tyYW5nZV0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcmFuZ2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGluZGlvX2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSAwOworCWludCBlcnJvcjsKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZyYW5nZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZGV2X2RiZyhkZXYsICJzZXQgcmFuZ2UgdG8gJWx1XG4iLCByYW5nZSk7CisKKwlpZiAocmFuZ2UgPiBSQU5HRV82XzUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YS0+cmFuZ2UgPSByYW5nZTsKKwlyYW5nZSA9IHJhbmdlIDw8IFJBTkdFX0dBSU5fT0ZGU0VUOworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgdGhpc19hdHRyLT5hZGRyZXNzLCByYW5nZSkpCisJCWNvdW50ID0gLUVJTlZBTDsKKworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIGNvdW50OworCit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1hZ25fcmFuZ2UsCisJCQlTX0lXVVNSIHwgU19JUlVHTywKKwkJCXNob3dfcmFuZ2UsCisJCQlzZXRfcmFuZ2UsCisJCQlITUM1ODQzX0NPTkZJR19SRUdfQik7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlZ3ZhbF90b19jb3VudHNfcGVyX21nW2RhdGEtPnJhbmdlXSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1hZ25fZ2FpbiwKKwkJCVNfSVJVR08sCisJCQlzaG93X2dhaW4sCisJCQlOVUxMICwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpobWM1ODQzX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX21lYXNfY29uZi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3BlcmF0aW5nX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbWFnbl9yYW5nZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbWFnbl9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tYWduX3hfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tYWduX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tYWduX3pfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2F2YWlsYWJsZV9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBobWM1ODQzX2dyb3VwID0geworCS5hdHRycyA9IGhtYzU4NDNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgaG1jNTg0M19kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgaWRfc3RyW0hNQzU4NDNfSURfUkVHX0xFTkdUSF07CisKKwlpZiAoY2xpZW50LT5hZGRyICE9IEhNQzU4NDNfSTJDX0FERFJFU1MpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgSE1DNTg0M19JRF9SRUdfQSwKKwkJCQlITUM1ODQzX0lEX1JFR19MRU5HVEgsIGlkX3N0cikKKwkJCSE9IEhNQzU4NDNfSURfUkVHX0xFTkdUSCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoMCAhPSBzdHJuY21wKGlkX3N0ciwgSE1DNTg0M19JRF9TVFJJTkcsIEhNQzU4NDNfSURfUkVHX0xFTkdUSCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgSE1DNTg0My4gKi8KK3N0YXRpYyB2b2lkIGhtYzU4NDNfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaG1jNTg0M19zZXRfbWVhc19jb25mKGNsaWVudCwgZGF0YS0+bWVhc19jb25mKTsKKwlobWM1ODQzX3NldF9yYXRlKGNsaWVudCwgZGF0YS0+cmF0ZSk7CisJaG1jNTg0M19jb25maWd1cmUoY2xpZW50LCBkYXRhLT5vcGVyYXRpbmdfbW9kZSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEhNQzU4NDNfQ09ORklHX1JFR19CLCBkYXRhLT5yYW5nZSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisJcHJfaW5mbygiSE1DNTg0MyBpbml0aWFsaXplZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgaG1jNTg0M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBobWM1ODQzX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCS8qIGRlZmF1bHQgc2V0dGluZ3MgYXQgcHJvYmUgKi8KKworCWRhdGEtPm1lYXNfY29uZiA9IENPTkZfTk9STUFMOworCWRhdGEtPnJhbmdlID0gUkFOR0VfMV8wOworCWRhdGEtPm9wZXJhdGluZ19tb2RlID0gTU9ERV9DT05WRVJTSU9OX0NPTlRJTlVPVVM7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKworCS8qIEluaXRpYWxpemUgdGhlIEhNQzU4NDMgY2hpcCAqLworCWhtYzU4NDNfaW5pdF9jbGllbnQoY2xpZW50KTsKKworCWRhdGEtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWRhdGEtPmluZGlvX2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZnJlZTE7CisJfQorCWRhdGEtPmluZGlvX2Rldi0+YXR0cnMgPSAmaG1jNTg0M19ncm91cDsKKwlkYXRhLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJZGF0YS0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGRhdGEpOworCWRhdGEtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWRhdGEtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwllcnIgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGRhdGEtPmluZGlvX2Rldik7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWUyOworCXJldHVybiAwOworZXhpdF9mcmVlMjoKKwlpaW9fZnJlZV9kZXZpY2UoZGF0YS0+aW5kaW9fZGV2KTsKK2V4aXRfZnJlZTE6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaG1jNTg0M19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJIC8qICBzbGVlcCBtb2RlIHRvIHNhdmUgcG93ZXIgKi8KKwlobWM1ODQzX2NvbmZpZ3VyZShjbGllbnQsIE1PREVfU0xFRVApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5pbmRpb19kZXYpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobWM1ODQzX3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJaG1jNTg0M19jb25maWd1cmUoY2xpZW50LCBNT0RFX1NMRUVQKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobWM1ODQzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlobWM1ODQzX2NvbmZpZ3VyZShjbGllbnQsIGRhdGEtPm9wZXJhdGluZ19tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGhtYzU4NDNfaWRbXSA9IHsKKwl7ICJobWM1ODQzIiwgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGhtYzU4NDNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImhtYzU4NDMiLAorCX0sCisJLmlkX3RhYmxlCT0gaG1jNTg0M19pZCwKKwkucHJvYmUJCT0gaG1jNTg0M19wcm9iZSwKKwkucmVtb3ZlCQk9IGhtYzU4NDNfcmVtb3ZlLAorCS5kZXRlY3QJCT0gaG1jNTg0M19kZXRlY3QsCisJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCisJLnN1c3BlbmQJPSBobWM1ODQzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBobWM1ODQzX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhtYzU4NDNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaG1jNTg0M19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaG1jNTg0M19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmhtYzU4NDNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU2h1YmhyYWp5b3RpIERhdHRhIDxzaHViaHJhanlvdGlAdGkuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhNQzU4NDMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGhtYzU4NDNfaW5pdCk7Cittb2R1bGVfZXhpdChobWM1ODQzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2dlbmVyaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmgKaW5kZXggMGU0NDM3NS4uYTg3MmQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2dlbmVyaWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfZ2VuZXJpYy5oCkBAIC0xMSw2ICsxMSw4IEBACiAjZGVmaW5lIF9JSU9fUklOR19HRU5FUklDX0hfCiAjaW5jbHVkZSAiaWlvLmgiCiAKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCisKIHN0cnVjdCBpaW9faGFuZGxlcjsKIHN0cnVjdCBpaW9fcmluZ19idWZmZXI7CiBzdHJ1Y3QgaWlvX2RldjsKQEAgLTk4LDYgKzEwMCw3IEBACiAgKiBAYWNjZXNzX2lkOgkJZGV2aWNlIGlkIG51bWJlcgogICogQGxlbmd0aDoJCVtERVZJQ0VdIG51bWJlciBvZiBkYXR1bXMgaW4gcmluZwogICogQGJwZDoJCVtERVZJQ0VdIHNpemUgb2YgaW5kaXZpZHVhbCBkYXR1bSBpbmNsdWRpbmcgdGltZXN0YW1wCisgKiBAYnBlOgkJW0RFVklDRV0gc2l6ZSBvZiBpbmRpdmlkdWFsIGNoYW5uZWwgdmFsdWUKICAqIEBsb29wY291bnQ6CQlbSU5URVJOXSBudW1iZXIgb2YgdGltZXMgdGhlIHJpbmcgaGFzIGxvb3BlZAogICogQGFjY2Vzc19oYW5kbGVyOglbSU5URVJOXSBjaHJkZXYgYWNjZXNzIGhhbmRsaW5nCiAgKiBAZXZfaW50OgkJW0lOVEVSTl0gY2hyZGV2IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50IGNocmRldgpAQCAtMTE5LDYgKzEyMiw3IEBACiAJaW50CQkJCWFjY2Vzc19pZDsKIAlpbnQJCQkJbGVuZ3RoOwogCWludAkJCQlicGQ7CisJaW50CQkJCWJwZTsKIAlpbnQJCQkJbG9vcGNvdW50OwogCXN0cnVjdCBpaW9faGFuZGxlcgkJYWNjZXNzX2hhbmRsZXI7CiAJc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UJZXZfaW50OwpAQCAtMjEzLDcgKzIxNyw3IEBACiAgKiBAX2xhYmVsOglpbmRlbnRpZmljYXRpb24gdmFyaWFibGUgdXNlZCBieSBkcml2ZXJzLiAgT2Z0ZW4gYSByZWcgYWRkcmVzcy4KICAqIEBfY29udHJvbGZ1bmM6IGZ1bmN0aW9uIHVzZWQgdG8gbm90aWZ5IGhhcmR3YXJlIG9mIHdoZXRoZXIgc3RhdGUgY2hhbmdlcwogICoqLwotI2RlZmluZSBJSU9fU0NBTl9FTF9DKF9uYW1lLCBfbnVtYmVyLCBfYml0cywgX2xhYmVsLCBfY29udHJvbGZ1bmMpCVwKKyNkZWZpbmUgX19JSU9fU0NBTl9FTF9DKF9uYW1lLCBfbnVtYmVyLCBfYml0cywgX2xhYmVsLCBfY29udHJvbGZ1bmMpCVwKIAlzdHJ1Y3QgaWlvX3NjYW5fZWwgaWlvX3NjYW5fZWxfIyNfbmFtZSA9IHsJCQlcCiAJCS5kZXZfYXR0ciA9IF9fQVRUUihfbnVtYmVyIyNfIyNfbmFtZSMjX2VuLAkJXAogCQkJCSAgIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKQEAgLTIyNSw3ICsyMjksMTAgQEAKIAkJLnNldF9zdGF0ZSA9IF9jb250cm9sZnVuYywJCQkJXAogCX0KIAotI2RlZmluZSBJSU9fU0NBTl9OQU1FRF9FTF9DKF9uYW1lLCBfc3RyaW5nLCBfbnVtYmVyLCBfYml0cywgX2xhYmVsLCBfY2YpIFwKKyNkZWZpbmUgSUlPX1NDQU5fRUxfQyhfbmFtZSwgX251bWJlciwgX2JpdHMsIF9sYWJlbCwgX2NvbnRyb2xmdW5jKQlcCisJX19JSU9fU0NBTl9FTF9DKF9uYW1lLCBfbnVtYmVyLCBfYml0cywgX2xhYmVsLCBfY29udHJvbGZ1bmMpCisKKyNkZWZpbmUgX19JSU9fU0NBTl9OQU1FRF9FTF9DKF9uYW1lLCBfc3RyaW5nLCBfbnVtYmVyLCBfYml0cywgX2xhYmVsLCBfY2YpIFwKIAlzdHJ1Y3QgaWlvX3NjYW5fZWwgaWlvX3NjYW5fZWxfIyNfbmFtZSA9IHsJCQlcCiAJCS5kZXZfYXR0ciA9IF9fQVRUUihfbnVtYmVyIyNfIyNfc3RyaW5nIyNfZW4sCQlcCiAJCQkJICAgU19JUlVHTyB8IFNfSVdVU1IsCQkJXApAQCAtMjM2LDcgKzI0Myw4IEBACiAJCS5sYWJlbCA9IF9sYWJlbCwJCQkJCVwKIAkJLnNldF9zdGF0ZSA9IF9jZiwJCQkJCVwKIAl9Ci0KKyNkZWZpbmUgSUlPX1NDQU5fTkFNRURfRUxfQyhfbmFtZSwgX3N0cmluZywgX251bWJlciwgX2JpdHMsIF9sYWJlbCwgX2NmKSBcCisJX19JSU9fU0NBTl9OQU1FRF9FTF9DKF9uYW1lLCBfc3RyaW5nLCBfbnVtYmVyLCBfYml0cywgX2xhYmVsLCBfY2YpCiAvKioKICAqIElJT19TQ0FOX0VMX1RJTUVTVEFNUCAtIGRlY2xhcmUgYSBzcGVjaWFsIHNjYW4gZWxlbWVudCBmb3IgdGltZXN0YW1wcwogICoKQEAgLTI4Nyw1ICsyOTUsMTQgQEAKICNkZWZpbmUgSUlPX1JJTkdfRU5BQkxFX0FUVFIgREVWSUNFX0FUVFIocmluZ19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBcCiAJCQkJCSBpaW9fc2hvd19yaW5nX2VuYWJsZSwJCVwKIAkJCQkJIGlpb19zdG9yZV9yaW5nX2VuYWJsZSkKKyNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgaWQpCit7CisJcmV0dXJuIDA7Cit9Oworc3RhdGljIGlubGluZSB2b2lkIGlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7fTsKKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KIAogI2VuZGlmIC8qIF9JSU9fUklOR19HRU5FUklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19zdy5jCmluZGV4IDI5NDI3MmQuLmUyZjAxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19zdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19zdy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSAicmluZ19zdy5oIgorI2luY2x1ZGUgInRyaWdnZXIuaCIKIAogc3RhdGljIGlubGluZSBpbnQgX19paW9fYWxsb2NhdGVfc3dfcmluZ19idWZmZXIoc3RydWN0IGlpb19zd19yaW5nX2J1ZmZlciAqcmluZywKIAkJCQkJCWludCBieXRlc19wZXJfZGF0dW0sIGludCBsZW5ndGgpCkBAIC00MzEsNSArNDMyLDczIEBACiAJCWlpb19wdXRfcmluZ19idWZmZXIocik7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19zd19yYl9mcmVlKTsKKworaW50IGlpb19zd19yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXNpemVfdCBzaXplOworCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHNjYW4gZWxlbWVudHMgZW5hYmxlZCwgaWYgbm90IGZhaWwqLworCWlmICghKGluZGlvX2Rldi0+c2Nhbl9jb3VudCB8fCBpbmRpb19kZXYtPnNjYW5fdGltZXN0YW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCisJCWlmIChpbmRpb19kZXYtPnNjYW5fY291bnQpCisJCQkvKiBUaW1lc3RhbXAgKGFsaWduZWQgdG8gczY0KSBhbmQgZGF0YSAqLworCQkJc2l6ZSA9ICgoKGluZGlvX2Rldi0+c2Nhbl9jb3VudCAqIGluZGlvX2Rldi0+cmluZy0+YnBlKQorCQkJCQkrIHNpemVvZihzNjQpIC0gMSkKKwkJCQkmIH4oc2l6ZW9mKHM2NCkgLSAxKSkKKwkJCQkrIHNpemVvZihzNjQpOworCQllbHNlIC8qIFRpbWVzdGFtcCBvbmx5ICAqLworCQkJc2l6ZSA9IHNpemVvZihzNjQpOworCWVsc2UgLyogRGF0YSBvbmx5ICovCisJCXNpemUgPSBpbmRpb19kZXYtPnNjYW5fY291bnQgKiBpbmRpb19kZXYtPnJpbmctPmJwZTsKKwlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnBkKGluZGlvX2Rldi0+cmluZywgc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWlvX3N3X3JpbmdfcHJlZW5hYmxlKTsKKwordm9pZCBpaW9fc3dfdHJpZ2dlcl9iaF90b19yaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgKnN0CisJCT0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGlpb19zd19yaW5nX2hlbHBlcl9zdGF0ZSwKKwkJCXdvcmtfdHJpZ2dlcl90b19yaW5nKTsKKwlpbnQgbGVuID0gMDsKKwlzaXplX3QgZGF0YXNpemUgPSBzdC0+aW5kaW9fZGV2CisJCS0+cmluZy0+YWNjZXNzLmdldF9icGQoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJY2hhciAqZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOworCisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKHN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3QtPmluZGlvX2Rldi0+c2Nhbl9jb3VudCkKKwkJbGVuID0gc3QtPmdldF9yaW5nX2VsZW1lbnQoc3QsIGRhdGEpOworCisJICAvKiBHdWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgd2l0aCA4IGJ5dGUgYm91bmRhcnkgKi8KKwlpZiAoc3QtPmluZGlvX2Rldi0+c2Nhbl90aW1lc3RhbXApCisJCSooczY0ICopKCgocGh5c19hZGRyX3QpZGF0YSArIGxlbgorCQkJCSsgc2l6ZW9mKHM2NCkgLSAxKSAmIH4oc2l6ZW9mKHM2NCkgLSAxKSkKKwkJCT0gc3QtPmxhc3RfdGltZXN0YW1wOworCSAgc3QtPmluZGlvX2Rldi0+cmluZy0+YWNjZXNzLnN0b3JlX3RvKHN0LT5pbmRpb19kZXYtPnJpbmcsCisJCQkJCSh1OCAqKWRhdGEsCisJCQlzdC0+bGFzdF90aW1lc3RhbXApOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3QtPmluZGlvX2Rldi0+dHJpZyk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MKGlpb19zd190cmlnZ2VyX2JoX3RvX3JpbmcpOworCit2b2lkIGlpb19zd19wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWUpCit7CXN0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgKmgKKwkJPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lOworCXNjaGVkdWxlX3dvcmsoJmgtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKK30KK0VYUE9SVF9TWU1CT0woaWlvX3N3X3BvbGxfZnVuY190aCk7CisKIE1PRFVMRV9ERVNDUklQVElPTigiSW5kdXN0cmlhbGlvIEkvTyBzb2Z0d2FyZSByaW5nIGJ1ZmZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaAppbmRleCBmZDY3N2YwLi42MWYxZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaApAQCAtMjA3LDEwICsyMDcsMjEgQEAKIHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKmlpb19zd19yYl9hbGxvY2F0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgaWlvX3N3X3JiX2ZyZWUoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiAKK2ludCBpaW9fc3dfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKK3N0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgeworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCWludCAoKmdldF9yaW5nX2VsZW1lbnQpKHN0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgKnN0LCB1OCAqYnVmKTsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7Cit9OworCit2b2lkIGlpb19zd19wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWUpOwordm9pZCBpaW9fc3dfdHJpZ2dlcl9iaF90b19yaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKTsKIAogI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiovCi1zdGF0aWMgaW5saW5lIHZvaWQgaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3Moc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyAqcmEpCi17fTsKK3N0cnVjdCBpaW9fc3dfcmluZ19oZWxwZXJfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKK307CiAjZW5kaWYgLyogIUNPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KICNlbmRpZiAvKiBfSUlPX1JJTkdfU1dfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaAppbmRleCBhZmNmNWFiLi42MDgzNDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCkBAIC0yODQsNiArMjg0LDE0IEBACiAJICAgIC5tYXNrID0gX21hc2ssCQkJCQkJXAogCSAgICAubGlzdGVsID0gJl9ldl9saXN0IH07CiAKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfTkFNRURfU0goX3ZuYW1lLCBfbmFtZSwgX2V2X2xpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJc3RhdGljIHN0cnVjdCBpaW9fZXZlbnRfYXR0cgkJCQkJXAorCWlpb19ldmVudF9hdHRyXyMjX3ZuYW1lCQkJCQkJXAorCT0geyAuZGV2X2F0dHIgPSBfX0FUVFIoX25hbWUsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQkJICAgICAgIF9zaG93LCBfc3RvcmUpLAkJCQlcCisJICAgIC5tYXNrID0gX21hc2ssCQkJCQkJXAorCSAgICAubGlzdGVsID0gJl9ldl9saXN0IH07CisKIC8qKgogICogSUlPX0VWRU5UX0FUVFIgLSBub24tc2hhcmVkIGV2ZW50IGF0dHJpYnV0ZQogICogQF9uYW1lOiBldmVudCBuYW1lCkBAIC0yOTMsMTAgKzMwMSw3IEBACiAgKiBAX2hhbmRsZXI6IGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCiAgKiovCiAjZGVmaW5lIElJT19FVkVOVF9BVFRSKF9uYW1lLCBfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpCQlcCi0Jc3RhdGljIHN0cnVjdCBpaW9fZXZlbnRfaGFuZGxlcl9saXN0CQkJCVwKLQlpaW9fZXZlbnRfIyNfbmFtZSA9IHsJCQkJCQlcCi0JCS5oYW5kbGVyID0gX2hhbmRsZXIsCQkJCQlcCi0JfTsJCQkJCQkJCVwKKwlJSU9fRVZFTlRfU0goX25hbWUsIF9oYW5kbGVyKTsJCQkJCVwKIAlzdGF0aWMgc3RydWN0CQkJCQkJCVwKIAlpaW9fZXZlbnRfYXR0cgkJCQkJCQlcCiAJaWlvX2V2ZW50X2F0dHJfIyNfbmFtZQkJCQkJCVwKQEAgLTMyNCw2ICszMjksNyBAQAogI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9HWVJPX0JBU0UJNDAwCiAjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEQ19CQVNFCQk1MDAKICNkZWZpbmUgSUlPX0VWRU5UX0NPREVfTUlTQ19CQVNFCTYwMAorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9MSUdIVF9CQVNFCTcwMAogCiAjZGVmaW5lIElJT19FVkVOVF9DT0RFX0RFVklDRV9TUEVDSUZJQwkxMDAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKaW5kZXggNzg0ZTdiNi4uNDY5OTU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKQEAgLTgsMTAgKzgsNiBAQAogICovCiAjaWZuZGVmIF9JSU9fVFJJR0dFUl9IXwogI2RlZmluZSBfSUlPX1RSSUdHRVJfSF8KLSNkZWZpbmUgSUlPX1RSSUdHRVJfTkFNRV9MRU5HVEggMjAKLSNkZWZpbmUgSUlPX1RSSUdHRVJfSURfUFJFRklYICJpaW86dHJpZ2dlciIKLSNkZWZpbmUgSUlPX1RSSUdHRVJfSURfRk9STUFUIElJT19UUklHR0VSX0lEX1BSRUZJWCAiJWQiCi0KIAogLyoqCiAgKiBzdHJ1Y3QgaWlvX3RyaWdnZXIgLSBpbmR1c3RyaWFsIEkvTyB0cmlnZ2VyIGRldmljZQpAQCAtMjUsNyArMjEsNiBAQAogICogQHBvbGxmdW5jX2xpc3RfbG9jazoJW0lOVEVSTl0gcHJvdGVjdGlvbiBvZiB0aGUgcG9sbGluZyBmdW5jdGlvbiBsaXN0CiAgKiBAcG9sbGZ1bmNfbGlzdDoJW0lOVEVSTl0gbGlzdCBvZiBmdW5jdGlvbnMgdG8gcnVuIG9uIHRyaWdnZXIuCiAgKiBAY29udHJvbF9hdHRyczoJW0RSSVZFUl0gc3lzZnMgYXR0cmlidXRlcyByZWxldmFudCB0byB0cmlnZ2VyIHR5cGUKLSAqIEB0aW1lc3RhbXA6CQlbSU5URVJOXSB0aW1lc3RhbXAgdXNlc2QgYnkgc29tZSB0cmlncyAoZS5nLiBkYXRhcmR5KQogICogQG93bmVyOgkJW0RSSVZFUl0gdXNlZCB0byBtb25pdG9yIHVzYWdlIGNvdW50IG9mIHRoZSB0cmlnZ2VyLgogICogQHVzZV9jb3VudDoJCXVzZSBjb3VudCBmb3IgdGhlIHRyaWdnZXIKICAqIEBzZXRfdHJpZ2dlcl9zdGF0ZToJW0RSSVZFUl0gc3dpdGNoIG9uL29mZiB0aGUgdHJpZ2dlciBvbiBkZW1hbmQKQEAgLTQzLDcgKzM4LDYgQEAKIAlzcGlubG9ja190CQkJcG9sbGZ1bmNfbGlzdF9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJCXBvbGxmdW5jX2xpc3Q7CiAJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkqY29udHJvbF9hdHRyczsKLQlzNjQJCQkJdGltZXN0YW1wOwogCXN0cnVjdCBtb2R1bGUJCQkqb3duZXI7CiAJaW50IHVzZV9jb3VudDsKIApAQCAtMTI0LDcgKzExOCw3IEBACiAgKgogICogVHlwaWNhbGx5IGNhbGxlZCBpbiByZWxldmFudCBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlci4KICAqKi8KLXZvaWQgaWlvX3RyaWdnZXJfcG9sbChzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwordm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgczY0IHRpbWUpOwogdm9pZCBpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwogCiAvKioKQEAgLTE0OCwxMyArMTQyLDI3IEBACiAJc3RydWN0CQkJCWxpc3RfaGVhZCBsaXN0OwogCXZvaWQJCQkJKnByaXZhdGVfZGF0YTsKIAl2b2lkICgqcG9sbF9mdW5jX2ltbWVkaWF0ZSkoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Ci0Jdm9pZCAoKnBvbGxfZnVuY19tYWluKShzdHJ1Y3QgaWlvX2RldiAgKnByaXZhdGVfZGF0YSk7CisJdm9pZCAoKnBvbGxfZnVuY19tYWluKShzdHJ1Y3QgaWlvX2RldiAqcHJpdmF0ZV9kYXRhLCBzNjQgdGltZSk7CiAKIH07CiAKK2ludCBpaW9fYWxsb2NfcG9sbGZ1bmMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJICAgICAgIHZvaWQgKCppbW1lZGlhdGUpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpLAorCQkgICAgICAgdm9pZCAoKm1haW4pKHN0cnVjdCBpaW9fZGV2ICpwcml2YXRlX2RhdGEsIHM2NCB0aW1lKSk7CisKKy8qCisgKiBUd28gZnVuY3Rpb25zIGZvciBjb21tb24gY2FzZSB3aGVyZSBhbGwgdGhhdCBoYXBwZW5zIGlzIGEgcG9sbGZ1bmMKKyAqIGlzIGF0dGFjaGVkIGFuZCBkZXRhY2hlZCBmb3JtIGEgdHJpZ2dlcgorICovCitpbnQgaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX2FsbG9jYXRlX3RyaWdnZXIodm9pZCk7CiAKIHZvaWQgaWlvX2ZyZWVfdHJpZ2dlcihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwogCiAKK3N0cnVjdCBpaW9fc2ltcGxlX3RyaWdnZXIgeworCXN0cnVjdCBpaW9fdHJpZ2dlciB0cmlnOworfTsKICNlbmRpZiAvKiBfSUlPX1RSSUdHRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9NYWtlZmlsZQppbmRleCBlNWY5NmQyLi4xMGFlY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL01ha2VmaWxlCkBAIC0xLDUgKzEsNiBAQAogIwogIyBNYWtlZmlsZSBmb3IgdHJpZ2dlcnMgbm90IGFzc29jaWF0ZWQgd2l0aCBpaW8tZGV2aWNlcwogIworCiBvYmotJChDT05GSUdfSUlPX1BFUklPRElDX1JUQ19UUklHR0VSKSArPSBpaW8tdHJpZy1wZXJpb2RpYy1ydGMubwotb2JqLSQoQ09ORklHX0lJT19HUElPX1RSSUdHRVIpICs9IGlpby10cmlnLWdwaW8ubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai0kKENPTkZJR19JSU9fR1BJT19UUklHR0VSKSArPSBpaW8tdHJpZy1ncGlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctZ3Bpby5jCmluZGV4IDFkYTI4NWQuLmY5M2NjOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1ncGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWdwaW8uYwpAQCAtNDIsNyArNDIsOCBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaWlvX2dwaW9fdHJpZ2dlcl9wb2xsKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCiB7Ci0JaWlvX3RyaWdnZXJfcG9sbChwcml2YXRlKTsKKwkvKiBUaW1lc3RhbXAgbm90IGN1cnJlbnRseSBwcm92aWRlZCAqLworCWlpb190cmlnZ2VyX3BvbGwocHJpdmF0ZSwgMCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC05MywxNiArOTQsMTEgQEAKIAkJCXRyaWctPnByaXZhdGVfZGF0YSA9IHRyaWdfaW5mbzsKIAkJCXRyaWdfaW5mby0+aXJxID0gaXJxOwogCQkJdHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJCXRyaWctPm5hbWUgPSBrbWFsbG9jKElJT19UUklHR0VSX05BTUVfTEVOR1RILAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJCWlmICghdHJpZy0+bmFtZSkgeworCQkJdHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiaXJxdHJpZyVkIiwgaXJxKTsKKwkJCWlmICh0cmlnLT5uYW1lID09IE5VTEwpIHsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWdvdG8gZXJyb3JfZnJlZV90cmlnX2luZm87CiAJCQl9Ci0JCQlzbnByaW50ZigoY2hhciAqKXRyaWctPm5hbWUsCi0JCQkJIElJT19UUklHR0VSX05BTUVfTEVOR1RILAotCQkJCSAiaXJxdHJpZyVkIiwgaXJxKTsKLQogCQkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBpaW9fZ3Bpb190cmlnZ2VyX3BvbGwsCiAJCQkJCSAgaXJxZmxhZ3MsIHRyaWctPm5hbWUsIHRyaWcpOwogCQkJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLXBlcmlvZGljLXJ0Yy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLXBlcmlvZGljLXJ0Yy5jCmluZGV4IDRlZTNhZTEuLmIwYjUyZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1wZXJpb2RpYy1ydGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctcGVyaW9kaWMtcnRjLmMKQEAgLTI1LDcgKzI1LDYgQEAKIHN0cnVjdCBpaW9fcHJ0Y190cmlnZ2VyX2luZm8gewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJaW50IGZyZXF1ZW5jeTsKLQljaGFyICpuYW1lOwogCXN0cnVjdCBydGNfdGFzayB0YXNrOwogfTsKIApAQCAtNzgsOCArNzcsNyBAQAogCQkJCQkgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGlpb19wcnRjX3RyaWdnZXJfaW5mbyAqdHJpZ19pbmZvID0gdHJpZy0+cHJpdmF0ZV9kYXRhOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0cmlnX2luZm8tPm5hbWUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0cmlnLT5uYW1lKTsKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sCkBAIC0xMDAsNyArOTgsOCBAQAogCiBzdGF0aWMgdm9pZCBpaW9fcHJ0Y190cmlnZ2VyX3BvbGwodm9pZCAqcHJpdmF0ZV9kYXRhKQogewotCWlpb190cmlnZ2VyX3BvbGwocHJpdmF0ZV9kYXRhKTsKKwkvKiBUaW1lc3RhbXAgaXMgbm90IHByb3ZpZGVkIGN1cnJlbnRseSAqLworCWlpb190cmlnZ2VyX3BvbGwocHJpdmF0ZV9kYXRhLCAwKTsKIH0KIAogc3RhdGljIGludCBpaW9fdHJpZ19wZXJpb2RpY19ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtMTI5LDE2ICsxMjgsMTIgQEAKIAkJdHJpZy0+cHJpdmF0ZV9kYXRhID0gdHJpZ19pbmZvOwogCQl0cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOwogCQl0cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZpaW9fdHJpZ19wZXJpb2RpY19ydGNfc2V0X3N0YXRlOwotCQl0cmlnLT5uYW1lID0ga21hbGxvYyhJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJCXRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInBlcmlvZGljJXMiLCBwZGF0YVtpXSk7CiAJCWlmICh0cmlnLT5uYW1lID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ19pbmZvOwogCQl9Ci0JCXNucHJpbnRmKChjaGFyICopdHJpZy0+bmFtZSwKLQkJCSBJSU9fVFJJR0dFUl9OQU1FX0xFTkdUSCwKLQkJCSAicGVyaW9kaWMlcyIsCi0JCQkgcGRhdGFbaV0pOwotCQl0cmlnX2luZm8tPm5hbWUgPSAoY2hhciAqKXRyaWctPm5hbWU7CisKIAkJLyogUlRDIGFjY2VzcyAqLwogCQl0cmlnX2luZm8tPnJ0YwogCQkJPSBydGNfY2xhc3Nfb3BlbihwZGF0YVtpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9LY29uZmlnCmluZGV4IDc4NTJkNGEuLmJjMWZmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCXRyaXN0YXRlICJMaW5lNiBVU0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBTTkQKIAlzZWxlY3QgU05EX1JBV01JREkKKwlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBndWl0YXIgYW1wLCBjYWIsIGFuZCBlZmZlY3RzIG1vZGVsbGVyCiAJICBQT0R4dCBQcm8gYnkgTGluZTYgKGFuZCBzaW1pbGFyIGRldmljZXMpLCBzdXBwb3J0aW5nIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCmluZGV4IDFkNWE0NzMuLjI3Yjk4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKQEAgLTY3OSw4ICs2NzksMTAgQEAKIAl1c2JfZ2V0X2Rldih1c2JkZXYpOwogCiAJLyogd2UgZG9uJ3QgaGFuZGxlIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zICovCi0JaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9wdXQ7CisJfQogCiAJLyogY2hlY2sgdmVuZG9yIGFuZCBwcm9kdWN0IGlkICovCiAJZm9yIChkZXZ0eXBlID0gQVJSQVlfU0laRShsaW5lNl9pZF90YWJsZSkgLSAxOyBkZXZ0eXBlLS07KSB7CkBAIC02OTIsMTYgKzY5NCwyMCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGRldnR5cGUgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoZGV2dHlwZSA8IDApIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcHV0OworCX0KIAogCS8qIGZpbmQgZnJlZSBzbG90IGluIGRldmljZSB0YWJsZTogKi8KIAlmb3IgKGRldm51bSA9IDA7IGRldm51bSA8IExJTkU2X01BWF9ERVZJQ0VTOyArK2Rldm51bSkKIAkJaWYgKGxpbmU2X2RldmljZXNbZGV2bnVtXSA9PSBOVUxMKQogCQkJYnJlYWs7CiAKLQlpZiAoZGV2bnVtID09IExJTkU2X01BWF9ERVZJQ0VTKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoZGV2bnVtID09IExJTkU2X01BWF9ERVZJQ0VTKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3B1dDsKKwl9CiAKIAkvKiBpbml0aWFsaXplIGRldmljZSBpbmZvOiAqLwogCXByb3BlcnRpZXMgPSAmbGluZTZfcHJvcGVydGllc190YWJsZVtkZXZ0eXBlXTsKQEAgLTc2MiwxMyArNzY4LDE0IEBACiAKIAlkZWZhdWx0OgogCQlNSVNTSU5HX0NBU0U7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9wdXQ7CiAJfQogCiAJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodXNiZGV2LCBpbnRlcmZhY2VfbnVtYmVyLCBhbHRlcm5hdGUpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAic2V0X2ludGVyZmFjZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9wdXQ7CiAJfQogCiAJLyogaW5pdGlhbGl6ZSBkZXZpY2UgZGF0YSBiYXNlZCBvbiBwcm9kdWN0IGlkOiAqLwpAQCAtODE1LDcgKzgyMiw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfcHV0OwogCQl9CiAJCWJyZWFrOwogCkBAIC04MjcsMTkgKzgzNSwyMiBAQAogCiAJZGVmYXVsdDoKIAkJTUlTU0lOR19DQVNFOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcHV0OwogCX0KIAogCWlmIChzaXplID09IDApIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAiZHJpdmVyIGJ1ZzogaW50ZXJmYWNlIGRhdGEgc2l6ZSBub3Qgc2V0XG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3B1dDsKIAl9CiAKIAlsaW5lNiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAobGluZTYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcHV0OwogCX0KIAogCS8qIHN0b3JlIGJhc2ljIGRhdGE6ICovCkBAIC04NzUsMTYgKzg4NiwxNiBAQAogCiAJCWlmIChsaW5lNi0+YnVmZmVyX2xpc3RlbiA9PSBOVUxMKSB7CiAJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwotCQkJbGluZTZfZGVzdHJ1Y3QoaW50ZXJmYWNlKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2Rlc3RydWN0OwogCQl9CiAKIAkJbGluZTYtPmJ1ZmZlcl9tZXNzYWdlID0ga21hbGxvYyhMSU5FNl9NRVNTQUdFX01BWExFTiwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKGxpbmU2LT5idWZmZXJfbWVzc2FnZSA9PSBOVUxMKSB7CiAJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwotCQkJbGluZTZfZGVzdHJ1Y3QoaW50ZXJmYWNlKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2Rlc3RydWN0OwogCQl9CiAKIAkJbGluZTYtPnVyYl9saXN0ZW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwpAQCAtODkyLDE1ICs5MDMsMTUgQEAKIAkJaWYgKGxpbmU2LT51cmJfbGlzdGVuID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCQlsaW5lNl9kZXN0cnVjdChpbnRlcmZhY2UpOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZGVzdHJ1Y3Q7CiAJCX0KIAogCQlyZXQgPSBsaW5lNl9zdGFydF9saXN0ZW4obGluZTYpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkXG4iLAogCQkJCV9fZnVuY19fKTsKLQkJCWxpbmU2X2Rlc3RydWN0KGludGVyZmFjZSk7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byBlcnJfZGVzdHJ1Y3Q7CiAJCX0KIAl9CiAKQEAgLTk1MiwyMiArOTYzLDI1IEBACiAJCXJldCA9IC1FTk9ERVY7CiAJfQogCi0JaWYgKHJldCA8IDApIHsKLQkJbGluZTZfZGVzdHJ1Y3QoaW50ZXJmYWNlKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2Rlc3RydWN0OwogCiAJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmludGVyZmFjZS0+ZGV2LmtvYmosICZ1c2JkZXYtPmRldi5rb2JqLAogCQkJCSJ1c2JfZGV2aWNlIik7Ci0JaWYgKHJldCA8IDApIHsKLQkJbGluZTZfZGVzdHJ1Y3QoaW50ZXJmYWNlKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2Rlc3RydWN0OwogCiAJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiTGluZTYgJXMgbm93IGF0dGFjaGVkXG4iLAogCQkgbGluZTYtPnByb3BlcnRpZXMtPm5hbWUpOwogCWxpbmU2X2RldmljZXNbZGV2bnVtXSA9IGxpbmU2OwogCWxpbmU2X2xpc3RfZGV2aWNlcygpOworCXJldHVybiAwOworCitlcnJfZGVzdHJ1Y3Q6CisJbGluZTZfZGVzdHJ1Y3QoaW50ZXJmYWNlKTsKK2Vycl9wdXQ6CisJdXNiX3B1dF9pbnRmKGludGVyZmFjZSk7CisJdXNiX3B1dF9kZXYodXNiZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhjMmFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL0tjb25maWcKQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgTElSQyBkcml2ZXIocykgY29uZmlndXJhdGlvbgorIworbWVudWNvbmZpZyBMSVJDX1NUQUdJTkcKKwlib29sICJMaW51eCBJbmZyYXJlZCBSZW1vdGUgQ29udHJvbCBJUiByZWNlaXZlci90cmFuc21pdHRlciBkcml2ZXJzIgorCWhlbHAKKwkgIFNheSBZIGhlcmUsIGFuZCBhbGwgc3VwcG9ydGVkIExpbnV4IEluZnJhcmVkIFJlbW90ZSBDb250cm9sIElSIGFuZAorCSAgUkYgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIGRyaXZlcnMgd2lsbCBiZSBkaXNwbGF5ZWQuIFdoZW4gcGFpcmVkCisJICB3aXRoIGEgcmVtb3RlIGNvbnRyb2wgYW5kIHRoZSBsaXJjIGRhZW1vbiwgdGhlIHJlY2VpdmVyIGRyaXZlcnMKKwkgIGFsbG93IGNvbnRyb2wgb2YgeW91ciBMaW51eCBzeXN0ZW0gdmlhIHJlbW90ZSBjb250cm9sLgorCitpZiBMSVJDX1NUQUdJTkcKKworY29uZmlnIExJUkNfQlQ4MjkKKyAgICAgICAgdHJpc3RhdGUgIkJUODI5IGJhc2VkIGhhcmR3YXJlIgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgSVIgaW50ZXJmYWNlIG9uIEJUODI5LWJhc2VkIGhhcmR3YXJlCisKK2NvbmZpZyBMSVJDX0VORTAxMDAKKwl0cmlzdGF0ZSAiRU5FIEtCMzkyNC9FTkUwMTAwIENJUiBQb3J0IFJlY2lldmVyIgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgQ0lSIHBvcnQgaGFuZGxlZCBieSBFTkUgS0IzOTI0IGVtYmVkZGVkCisJICBjb250cm9sbGVyIGZvdW5kIG9uIHNvbWUgbm90ZWJvb2tzLgorCSAgSXQgYXBwZWFycyBvbiBQTlAgbGlzdCBhcyBFTkUwMTAwLgorCitjb25maWcgTElSQ19JMkMKKwl0cmlzdGF0ZSAiSTJDIEJhc2VkIElSIFJlY2VpdmVycyIKKwlkZXBlbmRzIG9uIExJUkNfU1RBR0lORworCWhlbHAKKwkgIERyaXZlciBmb3IgSTJDLWJhc2VkIElSIHJlY2VpdmVycywgc3VjaCBhcyB0aG9zZSBjb21tb25seQorCSAgZm91bmQgb25ib2FyZCBIYXVwcGF1Z2UgUFZSLTE1MC8yNTAvMzUwIHZpZGVvIGNhcHR1cmUgY2FyZHMKKworY29uZmlnIExJUkNfSUdPUlBMVUdVU0IKKwl0cmlzdGF0ZSAiSWdvciBDZXNrbydzIFVTQiBJUiBSZWNlaXZlciIKKwlkZXBlbmRzIG9uIExJUkNfU1RBR0lORyAmJiBVU0IKKwloZWxwCisJICBEcml2ZXIgZm9yIElnb3IgQ2Vza28ncyBVU0IgSVIgUmVjZWl2ZXIKKworY29uZmlnIExJUkNfSU1PTgorCXRyaXN0YXRlICJMZWdhY3kgU291bmRHcmFwaCBpTU9OIFJlY2VpdmVyIGFuZCBEaXNwbGF5IgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgb3JpZ2luYWwgU291bmRHcmFwaCBpTU9OIElSIFJlY2VpdmVyIGFuZCBEaXNwbGF5CisKKwkgIEN1cnJlbnQgZ2VuZXJhdGlvbiBpTU9OIGRldmljZXMgdXNlIHRoZSBpbnB1dCBsYXllciBpbW9uIGRyaXZlci4KKworY29uZmlnIExJUkNfSVQ4NworCXRyaXN0YXRlICJJVEUgSVQ4N1hYIENJUiBQb3J0IFJlY2VpdmVyIgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgSVRFIElUODd4eCBJUiBSZWNlaXZlcgorCitjb25maWcgTElSQ19JVEU4NzA5CisJdHJpc3RhdGUgIklURTg3MDkgQ0lSIFBvcnQgUmVjZWl2ZXIiCisJZGVwZW5kcyBvbiBMSVJDX1NUQUdJTkcgJiYgUE5QCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgSVRFODcwOSBJUiBSZWNlaXZlcgorCitjb25maWcgTElSQ19QQVJBTExFTAorCXRyaXN0YXRlICJIb21lYnJldyBQYXJhbGxlbCBQb3J0IFJlY2VpdmVyIgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HICYmICFTTVAKKwloZWxwCisJICBEcml2ZXIgZm9yIEhvbWVicmV3IFBhcmFsbGVsIFBvcnQgUmVjZWl2ZXJzCisKK2NvbmZpZyBMSVJDX1NBU0VNCisJdHJpc3RhdGUgIlNhc2VtIFVTQiBJUiBSZW1vdGUiCisJZGVwZW5kcyBvbiBMSVJDX1NUQUdJTkcKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBTYXNlbSBPbkFpciBSZW1vY29uLVYgb3IgRGlnbiBIVjUgSFRQQyBJUi9WRkQgTW9kdWxlCisKK2NvbmZpZyBMSVJDX1NFUklBTAorCXRyaXN0YXRlICJIb21lYnJldyBTZXJpYWwgUG9ydCBSZWNlaXZlciIKKwlkZXBlbmRzIG9uIExJUkNfU1RBR0lORworCWhlbHAKKwkgIERyaXZlciBmb3IgSG9tZWJyZXcgU2VyaWFsIFBvcnQgUmVjZWl2ZXJzCisKK2NvbmZpZyBMSVJDX1NFUklBTF9UUkFOU01JVFRFUgorCWJvb2wgIlNlcmlhbCBQb3J0IFRyYW5zbWl0dGVyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTElSQ19TRVJJQUwKKwloZWxwCisJICBTZXJpYWwgUG9ydCBUcmFuc21pdHRlciBzdXBwb3J0CisKK2NvbmZpZyBMSVJDX1NJUgorCXRyaXN0YXRlICJCdWlsdC1pbiBTSVIgSXJEQSBwb3J0IgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgU0lSIElyREEgcG9ydAorCitjb25maWcgTElSQ19TVFJFQU1aQVAKKwl0cmlzdGF0ZSAiU3RyZWFtemFwIFBDIFJlY2VpdmVyIgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HCisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgU3RyZWFtemFwIFBDIFJlY2VpdmVyCisKK2NvbmZpZyBMSVJDX1RUVVNCSVIKKwl0cmlzdGF0ZSAiVGVjaG5vdHJlbmQgVVNCIElSIFJlY2VpdmVyIgorCWRlcGVuZHMgb24gTElSQ19TVEFHSU5HICYmIFVTQgorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIFRlY2hub3RyZW5kIFVTQiBJUiBSZWNlaXZlcgorCitjb25maWcgTElSQ19aSUxPRworCXRyaXN0YXRlICJaaWxvZy9IYXVwcGF1Z2UgSVIgVHJhbnNtaXR0ZXIiCisJZGVwZW5kcyBvbiBMSVJDX1NUQUdJTkcKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBaaWxvZy9IYXVwcGF1Z2UgSVIgVHJhbnNtaXR0ZXIsIGZvdW5kIG9uCisJICBQVlItMTUwLzUwMCwgSFZSLTEyMDAvMTI1MC8xNzAwLzE4MDAsIEhELVBWUiBhbmQgb3RoZXIgY2FyZHMKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTkxODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9NYWtlZmlsZQpAQCAtMCwwICsxLDE5IEBACisjIE1ha2VmaWxlIGZvciB0aGUgbGlyYyBkcml2ZXJzLgorIworCisjIEVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlcyBhIGxpc3Qgb2YgZmlsZXMuCisKK29iai0kKENPTkZJR19MSVJDX0JUODI5KQkrPSBsaXJjX2J0ODI5Lm8KK29iai0kKENPTkZJR19MSVJDX0VORTAxMDApCSs9IGxpcmNfZW5lMDEwMC5vCitvYmotJChDT05GSUdfTElSQ19JMkMpCQkrPSBsaXJjX2kyYy5vCitvYmotJChDT05GSUdfTElSQ19JR09SUExVR1VTQikJKz0gbGlyY19pZ29ycGx1Z3VzYi5vCitvYmotJChDT05GSUdfTElSQ19JTU9OKQkJKz0gbGlyY19pbW9uLm8KK29iai0kKENPTkZJR19MSVJDX0lUODcpCQkrPSBsaXJjX2l0ODcubworb2JqLSQoQ09ORklHX0xJUkNfSVRFODcwOSkJKz0gbGlyY19pdGU4NzA5Lm8KK29iai0kKENPTkZJR19MSVJDX1BBUkFMTEVMKQkrPSBsaXJjX3BhcmFsbGVsLm8KK29iai0kKENPTkZJR19MSVJDX1NBU0VNKQkrPSBsaXJjX3Nhc2VtLm8KK29iai0kKENPTkZJR19MSVJDX1NFUklBTCkJKz0gbGlyY19zZXJpYWwubworb2JqLSQoQ09ORklHX0xJUkNfU0lSKQkJKz0gbGlyY19zaXIubworb2JqLSQoQ09ORklHX0xJUkNfU1RSRUFNWkFQKQkrPSBsaXJjX3N0cmVhbXphcC5vCitvYmotJChDT05GSUdfTElSQ19UVFVTQklSKQkrPSBsaXJjX3R0dXNiaXIubworb2JqLSQoQ09ORklHX0xJUkNfWklMT0cpCSs9IGxpcmNfemlsb2cubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjYjU5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL1RPRE8KQEAgLTAsMCArMSw4IEBACistIEFsbCBkcml2ZXJzIHNob3VsZCBlaXRoZXIgYmUgcG9ydGVkIHRvIGlyLWNvcmUsIG9yIGRyb3BwZWQgZW50aXJlbHkKKyAgKHNlZSBkcml2ZXJzL21lZGlhL0lSL21jZXVzYi5jIHZzLiBsaXJjX21jZXVzYi5jIGluIGxpcmMgY3ZzIGZvciBhbgorICBleGFtcGxlIG9mIGEgcHJldmlvdXNseSBjb21wbGV0ZWQgcG9ydCkuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG86CitKYXJvZCBXaWxzb24gPGphcm9kQHdpbHNvbmV0LmNvbT4KK0dyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL1RPRE8ubGlyY19pMmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9UT0RPLmxpcmNfaTJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGE2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9UT0RPLmxpcmNfaTJjCkBAIC0wLDAgKzEsMyBAQAorbGlyY19pMmMgcHJvdmlkZXMgc3VwcG9ydCBmb3Igc29tZSBkcml2ZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGEgUkMKK2RyaXZlciB1bmRlciBkcml2ZXJzL21lZGlhL3ZpZGVvLiBJdCBzaG91bGQgYmUgaW50ZWdyYXRlZCBpbnRvIHRob3NlCitkcml2ZXJzLCBpbiBzcGVjaWFsIHdpdGggZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2J0ODI5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2J0ODI5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4ODEwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfYnQ4MjkuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIFJlbW90ZSBjb250cm9sIGRyaXZlciBmb3IgdGhlIFRWLWNhcmQgYmFzZWQgb24gYnQ4MjkKKyAqCisgKiAgYnkgTGVvbmlkIEZyb2VuY2hlbmtvIDxsZnJvZW5AZ2FsaWxlby5jby5pbD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKworc3RhdGljIGludCBwb2xsX21haW4odm9pZCk7CitzdGF0aWMgaW50IGF0aXJfaW5pdF9zdGFydCh2b2lkKTsKKworc3RhdGljIHZvaWQgd3JpdGVfaW5kZXgodW5zaWduZWQgY2hhciBpbmRleCwgdW5zaWduZWQgaW50IHZhbHVlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9pbmRleCh1bnNpZ25lZCBjaGFyIGluZGV4KTsKKworc3RhdGljIHZvaWQgZG9faTJjX3N0YXJ0KHZvaWQpOworc3RhdGljIHZvaWQgZG9faTJjX3N0b3Aodm9pZCk7CisKK3N0YXRpYyB2b2lkIHNlZW1zX3dyX2J5dGUodW5zaWduZWQgY2hhciBhbCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBzZWVtc19yZF9ieXRlKHZvaWQpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfaW5kZXgodW5zaWduZWQgY2hhciBhbCk7CitzdGF0aWMgdm9pZCB3cml0ZV9pbmRleCh1bnNpZ25lZCBjaGFyIGFoLCB1bnNpZ25lZCBpbnQgZWR4KTsKKworc3RhdGljIHZvaWQgY3ljbGVfZGVsYXkoaW50IGN5Y2xlKTsKKworc3RhdGljIHZvaWQgZG9fc2V0X2JpdHModW5zaWduZWQgY2hhciBibCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBkb19nZXRfYml0cyh2b2lkKTsKKworI2RlZmluZSBEQVRBX1BDSV9PRkYgMHg3RkZDMDAKKyNkZWZpbmUgV0FJVF9DWUNMRSAgIDIwCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImxpcmNfYnQ4MjkiCisKK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQkJCQkJCSBcCisJZG8gewkJCQkJCQkJIFwKKwkJaWYgKGRlYnVnKQkJCQkJCSBcCisJCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiAiZm10LCAjIyBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgYXRpcl9taW5vcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjaV9hZGRyX3BoeXM7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGNpX2FkZHJfbGluOworCitzdGF0aWMgc3RydWN0IGxpcmNfZHJpdmVyIGF0aXJfZHJpdmVyOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmRvX3BjaV9wcm9iZSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpteV9kZXY7CisJbXlfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BVEksCisJCQkJUENJX0RFVklDRV9JRF9BVElfMjY0VlQsIE5VTEwpOworCWlmIChteV9kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IFVzaW5nIGRldmljZTogJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShteV9kZXYpKTsKKwkJcGNpX2FkZHJfcGh5cyA9IDA7CisJCWlmIChteV9kZXYtPnJlc291cmNlWzBdLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJCXBjaV9hZGRyX3BoeXMgPSBteV9kZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBtZW1vcnkgYXQgMHglMDhYXG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpcGNpX2FkZHJfcGh5cyk7CisJCX0KKwkJaWYgKHBjaV9hZGRyX3BoeXMgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IG5vIG1lbW9yeSByZXNvdXJjZSA/XG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IHBjaV9wcm9iZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG15X2RldjsKK30KKworc3RhdGljIGludCBhdGlyX2FkZF90b19idWYodm9pZCAqZGF0YSwgc3RydWN0IGxpcmNfYnVmZmVyICpidWYpCit7CisJdW5zaWduZWQgY2hhciBrZXk7CisJaW50IHN0YXR1czsKKwlzdGF0dXMgPSBwb2xsX21haW4oKTsKKwlrZXkgPSAoc3RhdHVzID4+IDgpICYgMHhGRjsKKwlpZiAoc3RhdHVzICYgMHhGRikgeworCQlkcHJpbnRrKCJyZWFkaW5nIGtleSAlMDJYXG4iLCBrZXkpOworCQlsaXJjX2J1ZmZlcl93cml0ZShidWYsICZrZXkpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9EQVRBOworfQorCitzdGF0aWMgaW50IGF0aXJfc2V0X3VzZV9pbmModm9pZCAqZGF0YSkKK3sKKwlkcHJpbnRrKCJkcml2ZXIgaXMgb3BlbmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRpcl9zZXRfdXNlX2RlYyh2b2lkICpkYXRhKQoreworCWRwcmludGsoImRyaXZlciBpcyBjbG9zZWRcbiIpOworfQorCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXBkZXYgPSBkb19wY2lfcHJvYmUoKTsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmICghYXRpcl9pbml0X3N0YXJ0KCkpCisJCXJldHVybiAxOworCisJc3RyY3B5KGF0aXJfZHJpdmVyLm5hbWUsICJBVElSIik7CisJYXRpcl9kcml2ZXIubWlub3IgICAgICAgPSAtMTsKKwlhdGlyX2RyaXZlci5jb2RlX2xlbmd0aCA9IDg7CisJYXRpcl9kcml2ZXIuc2FtcGxlX3JhdGUgPSAxMDsKKwlhdGlyX2RyaXZlci5kYXRhICAgICAgICA9IDA7CisJYXRpcl9kcml2ZXIuYWRkX3RvX2J1ZiAgPSBhdGlyX2FkZF90b19idWY7CisJYXRpcl9kcml2ZXIuc2V0X3VzZV9pbmMgPSBhdGlyX3NldF91c2VfaW5jOworCWF0aXJfZHJpdmVyLnNldF91c2VfZGVjID0gYXRpcl9zZXRfdXNlX2RlYzsKKwlhdGlyX2RyaXZlci5kZXYgICAgICAgICA9ICZwZGV2LT5kZXY7CisJYXRpcl9kcml2ZXIub3duZXIgICAgICAgPSBUSElTX01PRFVMRTsKKworCWF0aXJfbWlub3IgPSBsaXJjX3JlZ2lzdGVyX2RyaXZlcigmYXRpcl9kcml2ZXIpOworCWlmIChhdGlyX21pbm9yIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogZmFpbGVkIHRvIHJlZ2lzdGVyIGRyaXZlciFcbiIpOworCQlyZXR1cm4gYXRpcl9taW5vcjsKKwl9CisJZHByaW50aygiZHJpdmVyIGlzIHJlZ2lzdGVyZWQgb24gbWlub3IgJWRcbiIsIGF0aXJfbWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIoYXRpcl9taW5vcik7Cit9CisKKworc3RhdGljIGludCBhdGlyX2luaXRfc3RhcnQodm9pZCkKK3sKKwlwY2lfYWRkcl9saW4gPSBpb3JlbWFwKHBjaV9hZGRyX3BoeXMgKyBEQVRBX1BDSV9PRkYsIDB4NDAwKTsKKwlpZiAocGNpX2FkZHJfbGluID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBwY2kgbWVtIG11c3QgYmUgbWFwcGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjeWNsZV9kZWxheShpbnQgY3ljbGUpCit7CisJdWRlbGF5KFdBSVRfQ1lDTEUqY3ljbGUpOworfQorCisKK3N0YXRpYyBpbnQgcG9sbF9tYWluKCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1c19oaWdoLCBzdGF0dXNfbG93OworCisJZG9faTJjX3N0YXJ0KCk7CisKKwlzZWVtc193cl9ieXRlKDB4QUEpOworCXNlZW1zX3dyX2J5dGUoMHgwMSk7CisKKwlkb19pMmNfc3RhcnQoKTsKKworCXNlZW1zX3dyX2J5dGUoMHhBQik7CisKKwlzdGF0dXNfbG93ID0gc2VlbXNfcmRfYnl0ZSgpOworCXN0YXR1c19oaWdoID0gc2VlbXNfcmRfYnl0ZSgpOworCisJZG9faTJjX3N0b3AoKTsKKworCXJldHVybiAoc3RhdHVzX2hpZ2ggPDwgOCkgfCBzdGF0dXNfbG93OworfQorCitzdGF0aWMgdm9pZCBkb19pMmNfc3RhcnQodm9pZCkKK3sKKwlkb19zZXRfYml0cygzKTsKKwljeWNsZV9kZWxheSg0KTsKKworCWRvX3NldF9iaXRzKDEpOworCWN5Y2xlX2RlbGF5KDcpOworCisJZG9fc2V0X2JpdHMoMCk7CisJY3ljbGVfZGVsYXkoMik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2kyY19zdG9wKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBiaXRzOworCWJpdHMgPSAgZG9fZ2V0X2JpdHMoKSAmIDB4RkQ7CisJZG9fc2V0X2JpdHMoYml0cyk7CisJY3ljbGVfZGVsYXkoMSk7CisKKwliaXRzIHw9IDE7CisJZG9fc2V0X2JpdHMoYml0cyk7CisJY3ljbGVfZGVsYXkoMik7CisKKwliaXRzIHw9IDI7CisJZG9fc2V0X2JpdHMoYml0cyk7CisJYml0cyA9IDM7CisJZG9fc2V0X2JpdHMoYml0cyk7CisJY3ljbGVfZGVsYXkoMik7Cit9CisKK3N0YXRpYyB2b2lkIHNlZW1zX3dyX2J5dGUodW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKworCXJlZyA9IGRvX2dldF9iaXRzKCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAodmFsdWUgJiAweDgwKQorCQkJcmVnIHw9IDB4MDI7CisJCWVsc2UKKwkJCXJlZyAmPSAweEZEOworCisJCWRvX3NldF9iaXRzKHJlZyk7CisJCWN5Y2xlX2RlbGF5KDEpOworCisJCXJlZyB8PSAxOworCQlkb19zZXRfYml0cyhyZWcpOworCQljeWNsZV9kZWxheSgxKTsKKworCQlyZWcgJj0gMHhGRTsKKwkJZG9fc2V0X2JpdHMocmVnKTsKKwkJY3ljbGVfZGVsYXkoMSk7CisJCXZhbHVlIDw8PSAxOworCX0KKwljeWNsZV9kZWxheSgyKTsKKworCXJlZyB8PSAyOworCWRvX3NldF9iaXRzKHJlZyk7CisKKwlyZWcgfD0gMTsKKwlkb19zZXRfYml0cyhyZWcpOworCisJY3ljbGVfZGVsYXkoMSk7CisJZG9fZ2V0X2JpdHMoKTsKKworCXJlZyAmPSAweEZFOworCWRvX3NldF9iaXRzKHJlZyk7CisJY3ljbGVfZGVsYXkoMyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNlZW1zX3JkX2J5dGUodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmRfYnl0ZTsKKwl1bnNpZ25lZCBjaGFyIGJpdHNfMiwgYml0c18xOworCisJYml0c18xID0gZG9fZ2V0X2JpdHMoKSB8IDI7CisJZG9fc2V0X2JpdHMoYml0c18xKTsKKworCXJkX2J5dGUgPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYml0c18xICY9IDB4RkU7CisJCWRvX3NldF9iaXRzKGJpdHNfMSk7CisJCWN5Y2xlX2RlbGF5KDIpOworCisJCWJpdHNfMSB8PSAxOworCQlkb19zZXRfYml0cyhiaXRzXzEpOworCQljeWNsZV9kZWxheSgxKTsKKworCQliaXRzXzIgPSBkb19nZXRfYml0cygpOworCQlpZiAoYml0c18yICYgMikKKwkJCXJkX2J5dGUgfD0gMTsKKworCQlyZF9ieXRlIDw8PSAxOworCX0KKworCWJpdHNfMSA9IDA7CisJaWYgKGJpdHNfMiA9PSAwKQorCQliaXRzXzEgfD0gMjsKKworCWRvX3NldF9iaXRzKGJpdHNfMSk7CisJY3ljbGVfZGVsYXkoMik7CisKKwliaXRzXzEgfD0gMTsKKwlkb19zZXRfYml0cyhiaXRzXzEpOworCWN5Y2xlX2RlbGF5KDMpOworCisJYml0c18xICY9IDB4RkU7CisJZG9fc2V0X2JpdHMoYml0c18xKTsKKwljeWNsZV9kZWxheSgyKTsKKworCXJkX2J5dGUgPj49IDE7CisJcmRfYnl0ZSAmPSAweEZGOworCXJldHVybiByZF9ieXRlOworfQorCitzdGF0aWMgdm9pZCBkb19zZXRfYml0cyh1bnNpZ25lZCBjaGFyIG5ld19iaXRzKQoreworCWludCByZWdfdmFsOworCXJlZ192YWwgPSByZWFkX2luZGV4KDB4MzQpOworCWlmIChuZXdfYml0cyAmIDIpIHsKKwkJcmVnX3ZhbCAmPSAweEZGRkZGRkRGOworCQlyZWdfdmFsIHw9IDE7CisJfSBlbHNlIHsKKwkJcmVnX3ZhbCAmPSAweEZGRkZGRkZFOworCQlyZWdfdmFsIHw9IDB4MjA7CisJfQorCXJlZ192YWwgfD0gMHgxMDsKKwl3cml0ZV9pbmRleCgweDM0LCByZWdfdmFsKTsKKworCXJlZ192YWwgPSByZWFkX2luZGV4KDB4MzEpOworCWlmIChuZXdfYml0cyAmIDEpCisJCXJlZ192YWwgfD0gMHgxMDAwMDAwOworCWVsc2UKKwkJcmVnX3ZhbCAmPSAweEZFRkZGRkZGOworCisJcmVnX3ZhbCB8PSAweDgwMDAwMDA7CisJd3JpdGVfaW5kZXgoMHgzMSwgcmVnX3ZhbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRvX2dldF9iaXRzKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBiaXRzOworCWludCByZWdfdmFsOworCisJcmVnX3ZhbCA9IHJlYWRfaW5kZXgoMHgzNCk7CisJcmVnX3ZhbCB8PSAweDEwOworCXJlZ192YWwgJj0gMHhGRkZGRkZERjsKKwl3cml0ZV9pbmRleCgweDM0LCByZWdfdmFsKTsKKworCXJlZ192YWwgPSByZWFkX2luZGV4KDB4MzQpOworCWJpdHMgPSAwOworCWlmIChyZWdfdmFsICYgOCkKKwkJYml0cyB8PSAyOworCWVsc2UKKwkJYml0cyAmPSAweEZEOworCisJcmVnX3ZhbCA9IHJlYWRfaW5kZXgoMHgzMSk7CisJaWYgKHJlZ192YWwgJiAweDEwMDAwMDApCisJCWJpdHMgfD0gMTsKKwllbHNlCisJCWJpdHMgJj0gMHhGRTsKKworCXJldHVybiBiaXRzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfaW5kZXgodW5zaWduZWQgY2hhciBpbmRleCkKK3sKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwkvKiAgYWRkciA9IHBjaV9hZGRyX2xpbiArIERBVEFfUENJX09GRiArICgoaW5kZXggJiAweEZGKSA8PCAyKTsgKi8KKwlhZGRyID0gcGNpX2FkZHJfbGluICsgKChpbmRleCAmIDB4RkYpIDw8IDIpOworCXZhbHVlID0gcmVhZGwoYWRkcik7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pbmRleCh1bnNpZ25lZCBjaGFyIGluZGV4LCB1bnNpZ25lZCBpbnQgcmVnX3ZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCWFkZHIgPSBwY2lfYWRkcl9saW4gKyAoKGluZGV4ICYgMHhGRikgPDwgMik7CisJd3JpdGVsKHJlZ192YWwsIGFkZHIpOworfQorCitNT0RVTEVfQVVUSE9SKCJGcm9lbmNoZW5rbyBMZW9uaWQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVIgcmVtb3RlIGRyaXZlciBmb3IgYnQ4MjkgYmFzZWQgVFYgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfZW5lMDEwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19lbmUwMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1MmM1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfZW5lMDEwMC5jCkBAIC0wLDAgKzEsNjQ2IEBACisvKgorICogZHJpdmVyIGZvciBFTkUgS0IzOTI2IEIvQy9EIENJUiAoYWxzbyBrbm93biBhcyBFTkUwMTAwKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXhpbSBMZXZpdHNreSA8bWF4aW1sZXZpdHNreUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICogVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJsaXJjX2VuZTAxMDAuaCIKKworc3RhdGljIGludCBzYW1wbGVfcGVyaW9kID0gNzU7CitzdGF0aWMgaW50IGVuYWJsZV9pZGxlID0gMTsKK3N0YXRpYyBpbnQgZW5hYmxlX2xlYXJuaW5nOworCitzdGF0aWMgdm9pZCBlbmVfc2V0X2lkbGUoc3RydWN0IGVuZV9kZXZpY2UgKmRldiwgaW50IGlkbGUpOworc3RhdGljIHZvaWQgZW5lX3NldF9pbnB1dHMoc3RydWN0IGVuZV9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSk7CisKKy8qIHJlYWQgYSBoYXJkd2FyZSByZWdpc3RlciAqLworc3RhdGljIHU4IGVuZV9od19yZWFkX3JlZyhzdHJ1Y3QgZW5lX2RldmljZSAqZGV2LCB1MTYgcmVnKQoreworCW91dGIocmVnID4+IDgsIGRldi0+aHdfaW8gKyBFTkVfQUREUl9ISSk7CisJb3V0YihyZWcgJiAweEZGLCBkZXYtPmh3X2lvICsgRU5FX0FERFJfTE8pOworCXJldHVybiBpbmIoZGV2LT5od19pbyArIEVORV9JTyk7Cit9CisKKy8qIHdyaXRlIGEgaGFyZHdhcmUgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIGVuZV9od193cml0ZV9yZWcoc3RydWN0IGVuZV9kZXZpY2UgKmRldiwgdTE2IHJlZywgdTggdmFsdWUpCit7CisJb3V0YihyZWcgPj4gOCwgZGV2LT5od19pbyArIEVORV9BRERSX0hJKTsKKwlvdXRiKHJlZyAmIDB4RkYsIGRldi0+aHdfaW8gKyBFTkVfQUREUl9MTyk7CisJb3V0Yih2YWx1ZSwgZGV2LT5od19pbyArIEVORV9JTyk7Cit9CisKKy8qIGNoYW5nZSBzcGVjaWZpYyBiaXRzIGluIGhhcmR3YXJlIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBlbmVfaHdfd3JpdGVfcmVnX21hc2soc3RydWN0IGVuZV9kZXZpY2UgKmRldiwKKwkJCQkgIHUxNiByZWcsIHU4IHZhbHVlLCB1OCBtYXNrKQoreworCXU4IHJlZ3ZhbHVlOworCisJb3V0YihyZWcgPj4gOCwgZGV2LT5od19pbyArIEVORV9BRERSX0hJKTsKKwlvdXRiKHJlZyAmIDB4RkYsIGRldi0+aHdfaW8gKyBFTkVfQUREUl9MTyk7CisKKwlyZWd2YWx1ZSA9IGluYihkZXYtPmh3X2lvICsgRU5FX0lPKSAmIH5tYXNrOworCXJlZ3ZhbHVlIHw9ICh2YWx1ZSAmIG1hc2spOworCW91dGIocmVndmFsdWUsIGRldi0+aHdfaW8gKyBFTkVfSU8pOworfQorCisvKiByZWFkIGlycSBzdGF0dXMgYW5kIGFjayBpdCAqLworc3RhdGljIGludCBlbmVfaHdfaXJxX3N0YXR1cyhzdHJ1Y3QgZW5lX2RldmljZSAqZGV2LCBpbnQgKmJ1ZmZlcl9wb2ludGVyKQoreworCXU4IGlycV9zdGF0dXM7CisJdTggZndfZmxhZ3MxLCBmd19mbGFnczI7CisKKwlmd19mbGFnczIgPSBlbmVfaHdfcmVhZF9yZWcoZGV2LCBFTkVfRlcyKTsKKworCWlmIChidWZmZXJfcG9pbnRlcikKKwkJKmJ1ZmZlcl9wb2ludGVyID0gNCAqIChmd19mbGFnczIgJiBFTkVfRlcyX0JVRl9ISUdIKTsKKworCWlmIChkZXYtPmh3X3JldmlzaW9uIDwgRU5FX0hXX0MpIHsKKwkJaXJxX3N0YXR1cyA9IGVuZV9od19yZWFkX3JlZyhkZXYsIEVORUJfSVJRX1NUQVRVUyk7CisKKwkJaWYgKCEoaXJxX3N0YXR1cyAmIEVORUJfSVJRX1NUQVRVU19JUikpCisJCQlyZXR1cm4gMDsKKwkJZW5lX2h3X3dyaXRlX3JlZyhkZXYsIEVORUJfSVJRX1NUQVRVUywKKwkJCQkgaXJxX3N0YXR1cyAmIH5FTkVCX0lSUV9TVEFUVVNfSVIpOworCisJCS8qIHJldiBCIHN1cHBvcnQgb25seSByZWNpZXZpbmcgKi8KKwkJcmV0dXJuIEVORV9JUlFfUlg7CisJfQorCisJaXJxX3N0YXR1cyA9IGVuZV9od19yZWFkX3JlZyhkZXYsIEVORUNfSVJRKTsKKworCWlmICghKGlycV9zdGF0dXMgJiBFTkVDX0lSUV9TVEFUVVMpKQorCQlyZXR1cm4gMDsKKworCS8qIG9yaWdpbmFsIGRyaXZlciBkb2VzIHRoYXQgdHdpY2UgLSBhIHdvcmthcm91bmQgPyAqLworCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVDX0lSUSwgaXJxX3N0YXR1cyAmIH5FTkVDX0lSUV9TVEFUVVMpOworCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVDX0lSUSwgaXJxX3N0YXR1cyAmIH5FTkVDX0lSUV9TVEFUVVMpOworCisJLyogY2xlYXIgdW5rbm93biBmbGFnIGluIEY4RjkgKi8KKwlpZiAoZndfZmxhZ3MyICYgRU5FX0ZXMl9JUlFfQ0xSKQorCQllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FX0ZXMiwgZndfZmxhZ3MyICYgfkVORV9GVzJfSVJRX0NMUik7CisKKwkvKiBjaGVjayBpZiB0aGlzIGlzIGEgVFggaW50ZXJydXB0ICovCisJZndfZmxhZ3MxID0gZW5lX2h3X3JlYWRfcmVnKGRldiwgRU5FX0ZXMSk7CisKKwlpZiAoZndfZmxhZ3MxICYgRU5FX0ZXMV9UWElSUSkgeworCQllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FX0ZXMSwgZndfZmxhZ3MxICYgfkVORV9GVzFfVFhJUlEpOworCQlyZXR1cm4gRU5FX0lSUV9UWDsKKwl9IGVsc2UKKwkJcmV0dXJuIEVORV9JUlFfUlg7Cit9CisKK3N0YXRpYyBpbnQgZW5lX2h3X2RldGVjdChzdHJ1Y3QgZW5lX2RldmljZSAqZGV2KQoreworCXU4IGNoaXBfbWFqb3IsIGNoaXBfbWlub3I7CisJdTggaHdfcmV2aXNpb24sIG9sZF92ZXI7CisJdTggdG1wOworCXU4IGZ3X2NhcGFiaWxpdGllczsKKworCXRtcCA9IGVuZV9od19yZWFkX3JlZyhkZXYsIEVORV9IV19VTkspOworCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVfSFdfVU5LLCB0bXAgJiB+RU5FX0hXX1VOS19DTFIpOworCisJY2hpcF9tYWpvciA9IGVuZV9od19yZWFkX3JlZyhkZXYsIEVORV9IV19WRVJfTUFKT1IpOworCWNoaXBfbWlub3IgPSBlbmVfaHdfcmVhZF9yZWcoZGV2LCBFTkVfSFdfVkVSX01JTk9SKTsKKworCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVfSFdfVU5LLCB0bXApOworCWh3X3JldmlzaW9uID0gZW5lX2h3X3JlYWRfcmVnKGRldiwgRU5FX0hXX1ZFUlNJT04pOworCW9sZF92ZXIgPSBlbmVfaHdfcmVhZF9yZWcoZGV2LCBFTkVfSFdfVkVSX09MRCk7CisKKwlpZiAoaHdfcmV2aXNpb24gPT0gMHhGRikgeworCisJCWVuZV9wcmludGsoS0VSTl9XQVJOSU5HLCAiZGV2aWNlIHNlZW1zIHRvIGJlIGRpc2FibGVkXG4iKTsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkic2VuZCBhIG1haWwgdG8gbGlyYy1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuIik7CisJCWVuZV9wcmludGsoS0VSTl9XQVJOSU5HLCAicGxlYXNlIGF0dGFjaCBvdXRwdXQgb2YgYWNwaWR1bXBcbiIpOworCisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjaGlwX21ham9yID09IDB4MzMpIHsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsICJjaGlwcyAweDMzeHggYXJlbid0IHN1cHBvcnRlZCB5ZXRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2hpcF9tYWpvciA9PSAweDM5ICYmIGNoaXBfbWlub3IgPT0gMHgyNiAmJiBod19yZXZpc2lvbiA9PSAweEMwKSB7CisJCWRldi0+aHdfcmV2aXNpb24gPSBFTkVfSFdfQzsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCSAgICAgICAiS0IzOTI2QyBkZXRlY3RlZCwgZHJpdmVyIHN1cHBvcnQgaXMgbm90IGNvbXBsZXRlIVxuIik7CisKKwl9IGVsc2UgaWYgKG9sZF92ZXIgPT0gMHgyNCAmJiBod19yZXZpc2lvbiA9PSAweEMwKSB7CisJCWRldi0+aHdfcmV2aXNpb24gPSBFTkVfSFdfQjsKKwkJZW5lX3ByaW50ayhLRVJOX05PVElDRSwgIktCMzkyNkIgZGV0ZWN0ZWRcbiIpOworCX0gZWxzZSB7CisJCWRldi0+aHdfcmV2aXNpb24gPSBFTkVfSFdfRDsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkidW5rbm93biBFTkUgY2hpcCBkZXRlY3RlZCwgYXNzdW1pbmcgS0IzOTI2RFxuIik7CisJCWVuZV9wcmludGsoS0VSTl9XQVJOSU5HLCAiZHJpdmVyIHN1cHBvcnQgaW5jb21wbGV0ZSIpOworCisJfQorCisJZW5lX3ByaW50ayhLRVJOX0RFQlVHLCAiY2hpcCBpcyAweCUwMnglMDJ4IC0gMHglMDJ4LCAweCUwMnhcbiIsCisJCWNoaXBfbWFqb3IsIGNoaXBfbWlub3IsIG9sZF92ZXIsIGh3X3JldmlzaW9uKTsKKworCisJLyogZGV0ZWN0IGZlYXR1cmVzIGhhcmR3YXJlIHN1cHBvcnRzICovCisKKwlpZiAoZGV2LT5od19yZXZpc2lvbiA8IEVORV9IV19DKQorCQlyZXR1cm4gMDsKKworCWZ3X2NhcGFiaWxpdGllcyA9IGVuZV9od19yZWFkX3JlZyhkZXYsIEVORV9GVzIpOworCisJZGV2LT5od19ncGlvNDBfbGVhcm5pbmcgPSBmd19jYXBhYmlsaXRpZXMgJiBFTkVfRlcyX0dQNDBfQVNfTEVBUk47CisJZGV2LT5od19sZWFybmluZ19hbmRfdHhfY2FwYWJsZSA9IGZ3X2NhcGFiaWxpdGllcyAmIEVORV9GVzJfTEVBUk5JTkc7CisKKwlkZXYtPmh3X2Zhbl9hc19ub3JtYWxfaW5wdXQgPSBkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlICYmCisJICAgIGZ3X2NhcGFiaWxpdGllcyAmIEVORV9GVzJfRkFOX0FTX05STUxfSU47CisKKwllbmVfcHJpbnRrKEtFUk5fTk9USUNFLCAiaGFyZHdhcmUgZmVhdHVyZXM6XG4iKTsKKwllbmVfcHJpbnRrKEtFUk5fTk9USUNFLAorCQkibGVhcm5pbmcgYW5kIHR4ICVzLCBncGlvNDBfbGVhcm4gJXMsIGZhbl9pbiAlc1xuIiwKKwkgICAgICAgZGV2LT5od19sZWFybmluZ19hbmRfdHhfY2FwYWJsZSA/ICJvbiIgOiAib2ZmIiwKKwkgICAgICAgZGV2LT5od19ncGlvNDBfbGVhcm5pbmcgPyAib24iIDogIm9mZiIsCisJICAgICAgIGRldi0+aHdfZmFuX2FzX25vcm1hbF9pbnB1dCA/ICJvbiIgOiAib2ZmIik7CisKKwlpZiAoIWRldi0+aHdfbGVhcm5pbmdfYW5kX3R4X2NhcGFibGUgJiYgZW5hYmxlX2xlYXJuaW5nKQorCQllbmFibGVfbGVhcm5pbmcgPSAwOworCisJaWYgKGRldi0+aHdfbGVhcm5pbmdfYW5kX3R4X2NhcGFibGUpIHsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCSJEZXZpY2Ugc3VwcG9ydHMgdHJhbnNtaXR0aW5nLCBidXQgdGhlIGRyaXZlciBkb2Vzbid0XG4iKTsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCSJkdWUgdG8gbGFjayBvZiBoYXJkd2FyZSB0byB0ZXN0IGFnYWluc3QuXG4iKTsKKwkJZW5lX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCSJTZW5kIGEgbWFpbCB0bzogbGlyYy1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuIik7CisJfQorCXJldHVybiAwOworfQorCisvKiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCBlbmVfaHdfaW5pdCh2b2lkICpkYXRhKQoreworCXU4IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgZW5lX2RldmljZSAqZGV2ID0gKHN0cnVjdCBlbmVfZGV2aWNlICopZGF0YTsKKwlkZXYtPmluX3VzZSA9IDE7CisKKwlpZiAoZGV2LT5od19yZXZpc2lvbiA8IEVORV9IV19DKSB7CisJCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVCX0lSUSwgZGV2LT5pcnEgPDwgMSk7CisJCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVCX0lSUV9VTksxLCAweDAxKTsKKwl9IGVsc2UgeworCQlyZWdfdmFsdWUgPSBlbmVfaHdfcmVhZF9yZWcoZGV2LCBFTkVDX0lSUSkgJiAweEYwOworCQlyZWdfdmFsdWUgfD0gRU5FQ19JUlFfVU5LX0VOOworCQlyZWdfdmFsdWUgJj0gfkVORUNfSVJRX1NUQVRVUzsKKwkJcmVnX3ZhbHVlIHw9IChkZXYtPmlycSAmIEVORUNfSVJRX01BU0spOworCQllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FQ19JUlEsIHJlZ192YWx1ZSk7CisJCWVuZV9od193cml0ZV9yZWcoZGV2LCBFTkVfVFhfVU5LMSwgMHg2Myk7CisJfQorCisJZW5lX2h3X3dyaXRlX3JlZyhkZXYsIEVORV9DSVJfQ09ORjIsIDB4MDApOworCWVuZV9zZXRfaW5wdXRzKGRldiwgZW5hYmxlX2xlYXJuaW5nKTsKKworCS8qIHNldCBzYW1wbGluZyBwZXJpb2QgKi8KKwllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FX0NJUl9TQU1QTEVfUEVSSU9ELCBzYW1wbGVfcGVyaW9kKTsKKworCS8qIGFjayBhbnkgcGVuZGluZyBpcnFzIC0ganVzdCBpbiBjYXNlICovCisJZW5lX2h3X2lycV9zdGF0dXMoZGV2LCBOVUxMKTsKKworCS8qIGVudGVyIGlkbGUgbW9kZSAqLworCWVuZV9zZXRfaWRsZShkZXYsIDEpOworCisJLyogZW5hYmxlIGZpcm13YXJlIGJpdHMgKi8KKwllbmVfaHdfd3JpdGVfcmVnX21hc2soZGV2LCBFTkVfRlcxLAorCQkJICAgICAgRU5FX0ZXMV9FTkFCTEUgfCBFTkVfRlcxX0lSUSwKKwkJCSAgICAgIEVORV9GVzFfRU5BQkxFIHwgRU5FX0ZXMV9JUlEpOworCS8qIGNsZWFyIHN0YXRzICovCisJZGV2LT5zYW1wbGUgPSAwOworCXJldHVybiAwOworfQorCisvKiB0aGlzIGVuYWJsZXMgZ3BpbzQwIHNpZ25hbCwgdXNlZCBpZiBjb25uZWN0ZWQgdG8gd2lkZSBiYW5kIGlucHV0Ki8KK3N0YXRpYyB2b2lkIGVuZV9lbmFibGVfZ3BpbzQwKHN0cnVjdCBlbmVfZGV2aWNlICpkZXYsIGludCBlbmFibGUpCit7CisJZW5lX2h3X3dyaXRlX3JlZ19tYXNrKGRldiwgRU5FX0NJUl9DT05GMSwgZW5hYmxlID8KKwkJCSAgICAgIDAgOiBFTkVfQ0lSX0NPTkYyX0dQSU80MERJUywKKwkJCSAgICAgIEVORV9DSVJfQ09ORjJfR1BJTzQwRElTKTsKK30KKworLyogdGhpcyBlbmFibGVzIHRoZSBjbGFzc2ljIHNhbXBsZXIgKi8KK3N0YXRpYyB2b2lkIGVuZV9lbmFibGVfbm9ybWFsX3JlY2lldmUoc3RydWN0IGVuZV9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKKwllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FX0NJUl9DT05GMSwgZW5hYmxlID8gRU5FX0NJUl9DT05GMV9BRENfT04gOiAwKTsKK30KKworLyogdGhpcyBlbmFibGVzIHJlY2lldmUgdmlhIGZhbiBpbnB1dCAqLworc3RhdGljIHZvaWQgZW5lX2VuYWJsZV9mYW5fcmVjaWV2ZShzdHJ1Y3QgZW5lX2RldmljZSAqZGV2LCBpbnQgZW5hYmxlKQoreworCWlmICghZW5hYmxlKQorCQllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FX0ZBTl9BU19JTjEsIDApOworCWVsc2UgeworCQllbmVfaHdfd3JpdGVfcmVnKGRldiwgRU5FX0ZBTl9BU19JTjEsIEVORV9GQU5fQVNfSU4xX0VOKTsKKwkJZW5lX2h3X3dyaXRlX3JlZyhkZXYsIEVORV9GQU5fQVNfSU4yLCBFTkVfRkFOX0FTX0lOMl9FTik7CisJfQorCWRldi0+ZmFuX2lucHV0X2ludXNlID0gZW5hYmxlOworfQorCisvKiBkZXRlcm1pbmUgd2hpY2ggaW5wdXQgdG8gdXNlKi8KK3N0YXRpYyB2b2lkIGVuZV9zZXRfaW5wdXRzKHN0cnVjdCBlbmVfZGV2aWNlICpkZXYsIGludCBsZWFybmluZ19lbmFibGUpCit7CisJZW5lX2VuYWJsZV9ub3JtYWxfcmVjaWV2ZShkZXYsIDEpOworCisJLyogb2xkIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCBsZWFybmluZyBtb2RlIGZvciBzdXJlICovCisJaWYgKGRldi0+aHdfcmV2aXNpb24gPD0gRU5FX0hXX0IpCisJCXJldHVybjsKKworCS8qIHJlY2lldmVyIG5vdCBsZWFybmluZyBjYXBhYmxlLCBzdGlsbCBzZXQgZ3BpbzQwIGNvcnJlY3RseSAqLworCWlmICghZGV2LT5od19sZWFybmluZ19hbmRfdHhfY2FwYWJsZSkgeworCQllbmVfZW5hYmxlX2dwaW80MChkZXYsICFkZXYtPmh3X2dwaW80MF9sZWFybmluZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgbGVhcm5pbmcgbW9kZSAqLworCWlmIChsZWFybmluZ19lbmFibGUpIHsKKwkJZW5lX2VuYWJsZV9ncGlvNDAoZGV2LCBkZXYtPmh3X2dwaW80MF9sZWFybmluZyk7CisKKwkJLyogZmFuIGlucHV0IGlzIG5vdCB1c2VkIGZvciBsZWFybmluZyAqLworCQlpZiAoZGV2LT5od19mYW5fYXNfbm9ybWFsX2lucHV0KQorCQkJZW5lX2VuYWJsZV9mYW5fcmVjaWV2ZShkZXYsIDApOworCisJLyogZGlzYWJsZSBsZWFybmluZyBtb2RlICovCisJfSBlbHNlIHsKKwkJaWYgKGRldi0+aHdfZmFuX2FzX25vcm1hbF9pbnB1dCkgeworCQkJZW5lX2VuYWJsZV9mYW5fcmVjaWV2ZShkZXYsIDEpOworCQkJZW5lX2VuYWJsZV9ub3JtYWxfcmVjaWV2ZShkZXYsIDApOworCQl9IGVsc2UKKwkJCWVuZV9lbmFibGVfZ3BpbzQwKGRldiwgIWRldi0+aHdfZ3BpbzQwX2xlYXJuaW5nKTsKKwl9CisKKwkvKiBzZXQgZmV3IGFkZGl0aW9uYWwgc2V0dGluZ3MgZm9yIHRoaXMgbW9kZSAqLworCWVuZV9od193cml0ZV9yZWdfbWFzayhkZXYsIEVORV9DSVJfQ09ORjEsIGxlYXJuaW5nX2VuYWJsZSA/CisJCQkgICAgICBFTkVfQ0lSX0NPTkYxX0xFQVJOMSA6IDAsIEVORV9DSVJfQ09ORjFfTEVBUk4xKTsKKworCWVuZV9od193cml0ZV9yZWdfbWFzayhkZXYsIEVORV9DSVJfQ09ORjIsIGxlYXJuaW5nX2VuYWJsZSA/CisJCQkgICAgICBFTkVfQ0lSX0NPTkYyX0xFQVJOMiA6IDAsIEVORV9DSVJfQ09ORjJfTEVBUk4yKTsKK30KKworLyogZGVpbml0aWFsaXphdGlvbiAqLworc3RhdGljIHZvaWQgZW5lX2h3X2RlaW5pdCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmVfZGV2aWNlICpkZXYgPSAoc3RydWN0IGVuZV9kZXZpY2UgKilkYXRhOworCisJLyogZGlzYWJsZSBzYW1wbGVycyAqLworCWVuZV9lbmFibGVfbm9ybWFsX3JlY2lldmUoZGV2LCAwKTsKKworCWlmIChkZXYtPmh3X2Zhbl9hc19ub3JtYWxfaW5wdXQpCisJCWVuZV9lbmFibGVfZmFuX3JlY2lldmUoZGV2LCAwKTsKKworCS8qIGRpc2FibGUgaGFyZHdhcmUgSVJRIGFuZCBmaXJtd2FyZSBmbGFnICovCisJZW5lX2h3X3dyaXRlX3JlZ19tYXNrKGRldiwgRU5FX0ZXMSwgMCwgRU5FX0ZXMV9FTkFCTEUgfCBFTkVfRlcxX0lSUSk7CisKKwllbmVfc2V0X2lkbGUoZGV2LCAxKTsKKwlkZXYtPmluX3VzZSA9IDA7Cit9CisKKy8qICBzZW5kcyBjdXJyZW50IHNhbXBsZSB0byB1c2Vyc3BhY2UgKi8KK3N0YXRpYyB2b2lkIHNlbmRfc2FtcGxlKHN0cnVjdCBlbmVfZGV2aWNlICpkZXYpCit7CisJaW50IHZhbHVlID0gYWJzKGRldi0+c2FtcGxlKSAmIFBVTFNFX01BU0s7CisKKwlpZiAoZGV2LT5zYW1wbGUgPiAwKQorCQl2YWx1ZSB8PSBQVUxTRV9CSVQ7CisKKwlpZiAoIWxpcmNfYnVmZmVyX2Z1bGwoZGV2LT5saXJjX2RyaXZlci0+cmJ1ZikpIHsKKwkJbGlyY19idWZmZXJfd3JpdGUoZGV2LT5saXJjX2RyaXZlci0+cmJ1ZiwgKHZvaWQgKikmdmFsdWUpOworCQl3YWtlX3VwKCZkZXYtPmxpcmNfZHJpdmVyLT5yYnVmLT53YWl0X3BvbGwpOworCX0KKwlkZXYtPnNhbXBsZSA9IDA7Cit9CisKKy8qICB0aGlzIHVwZGF0ZXMgY3VycmVudCBzYW1wbGUgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zYW1wbGUoc3RydWN0IGVuZV9kZXZpY2UgKmRldiwgaW50IHNhbXBsZSkKK3sKKwlpZiAoIWRldi0+c2FtcGxlKQorCQlkZXYtPnNhbXBsZSA9IHNhbXBsZTsKKwllbHNlIGlmIChzYW1lX3NpZ24oZGV2LT5zYW1wbGUsIHNhbXBsZSkpCisJCWRldi0+c2FtcGxlICs9IHNhbXBsZTsKKwllbHNlIHsKKwkJc2VuZF9zYW1wbGUoZGV2KTsKKwkJZGV2LT5zYW1wbGUgPSBzYW1wbGU7CisJfQorfQorCisvKiBlbmFibGUgb3IgZGlzYWJsZSBpZGxlIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGVuZV9zZXRfaWRsZShzdHJ1Y3QgZW5lX2RldmljZSAqZGV2LCBpbnQgaWRsZSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJaW50IGRpc2FibGUgPSBpZGxlICYmIGVuYWJsZV9pZGxlICYmIChkZXYtPmh3X3JldmlzaW9uIDwgRU5FX0hXX0MpOworCisJZW5lX2h3X3dyaXRlX3JlZ19tYXNrKGRldiwgRU5FX0NJUl9TQU1QTEVfUEVSSU9ELAorCQkJICAgICAgZGlzYWJsZSA/IDAgOiBFTkVfQ0lSX1NBTVBMRV9PVkVSRkxPVywKKwkJCSAgICAgIEVORV9DSVJfU0FNUExFX09WRVJGTE9XKTsKKwlkZXYtPmlkbGUgPSBpZGxlOworCisJLyogcmVtZW1iZXIgd2hlbiB3ZSBoYXZlIGVudGVyZWQgdGhlIGlkbGUgbW9kZSAqLworCWlmIChpZGxlKSB7CisJCWRvX2dldHRpbWVvZmRheSgmZGV2LT5nYXBfc3RhcnQpOworCQlyZXR1cm47CisJfQorCisJLyogc2VuZCB0aGUgZ2FwIGJldHdlZW4ga2V5cHJlc3NlcyBub3cgKi8KKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisKKwlpZiAobm93LnR2X3NlYyAtIGRldi0+Z2FwX3N0YXJ0LnR2X3NlYyA+IDE2KQorCQlkZXYtPnNhbXBsZSA9IHNwYWNlKFBVTFNFX01BU0spOworCWVsc2UKKwkJZGV2LT5zYW1wbGUgPSBkZXYtPnNhbXBsZSArCisJCSAgICBzcGFjZSgxMDAwMDAwdWxsICogKG5vdy50dl9zZWMgLSBkZXYtPmdhcF9zdGFydC50dl9zZWMpKQorCQkgICAgKyBzcGFjZShub3cudHZfdXNlYyAtIGRldi0+Z2FwX3N0YXJ0LnR2X3VzZWMpOworCisJaWYgKGFicyhkZXYtPnNhbXBsZSkgPiBQVUxTRV9NQVNLKQorCQlkZXYtPnNhbXBsZSA9IHNwYWNlKFBVTFNFX01BU0spOworCXNlbmRfc2FtcGxlKGRldik7Cit9CisKKy8qIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZW5lX2h3X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXUxNiBod192YWx1ZTsKKwlpbnQgaSwgaHdfc2FtcGxlOworCWludCBzcGFjZTsKKwlpbnQgYnVmZmVyX3BvaW50ZXI7CisJaW50IGlycV9zdGF0dXM7CisKKwlzdHJ1Y3QgZW5lX2RldmljZSAqZGV2ID0gKHN0cnVjdCBlbmVfZGV2aWNlICopZGF0YTsKKwlpcnFfc3RhdHVzID0gZW5lX2h3X2lycV9zdGF0dXMoZGV2LCAmYnVmZmVyX3BvaW50ZXIpOworCisJaWYgKCFpcnFfc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBUT0RPOiBvbmx5IFJYIGZvciBub3cgKi8KKwlpZiAoaXJxX3N0YXR1cyA9PSBFTkVfSVJRX1RYKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5FX1NBTVBMRVNfU0laRTsgaSsrKSB7CisKKwkJaHdfdmFsdWUgPSBlbmVfaHdfcmVhZF9yZWcoZGV2LAorCQkJCUVORV9TQU1QTEVfQlVGRkVSICsgYnVmZmVyX3BvaW50ZXIgKyBpKTsKKworCQlpZiAoZGV2LT5mYW5faW5wdXRfaW51c2UpIHsKKwkJCS8qIHJlYWQgaGlnaCBwYXJ0IG9mIHRoZSBzYW1wbGUgKi8KKwkJCWh3X3ZhbHVlIHw9IGVuZV9od19yZWFkX3JlZyhkZXYsCisJCQkgICAgRU5FX1NBTVBMRV9CVUZGRVJfRkFOICsgYnVmZmVyX3BvaW50ZXIgKyBpKSA8PCA4OworCisJCQkvKiB0ZXN0IGZvciBfc3BhY2VfIGJpdCAqLworCQkJc3BhY2UgPSAhKGh3X3ZhbHVlICYgRU5FX0ZBTl9TTVBMX1BVTFNfTVNLKTsKKworCQkJLyogY2xlYXIgc3BhY2UgYml0LCBhbmQgb3RoZXIgdW51c2VkIGJpdHMgKi8KKwkJCWh3X3ZhbHVlICY9IEVORV9GQU5fVkFMVUVfTUFTSzsKKwkJCWh3X3NhbXBsZSA9IGh3X3ZhbHVlICogRU5FX1NBTVBMRV9QRVJJT0RfRkFOOworCisJCX0gZWxzZSB7CisJCQlzcGFjZSA9IGh3X3ZhbHVlICYgRU5FX1NBTVBMRV9TUENfTUFTSzsKKwkJCWh3X3ZhbHVlICY9IEVORV9TQU1QTEVfVkFMVUVfTUFTSzsKKwkJCWh3X3NhbXBsZSA9IGh3X3ZhbHVlICogc2FtcGxlX3BlcmlvZDsKKwkJfQorCisJCS8qIG5vIG1vcmUgZGF0YSAqLworCQlpZiAoIShod192YWx1ZSkpCisJCQlicmVhazsKKworCQlpZiAoc3BhY2UpCisJCQlod19zYW1wbGUgKj0gLTE7CisKKwkJLyogb3ZlcmZsb3cgc2FtcGxlIHJlY2lldmVkLCBoYW5kbGUgaXQgKi8KKworCQlpZiAoIWRldi0+ZmFuX2lucHV0X2ludXNlICYmIGh3X3ZhbHVlID09IEVORV9TQU1QTEVfT1ZFUkZMT1cpIHsKKworCQkJaWYgKGRldi0+aWRsZSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGRldi0+c2FtcGxlID4gMCB8fCBhYnMoZGV2LT5zYW1wbGUpIDw9IEVORV9NQVhHQVApCisJCQkJdXBkYXRlX3NhbXBsZShkZXYsIGh3X3NhbXBsZSk7CisJCQllbHNlCisJCQkJZW5lX3NldF9pZGxlKGRldiwgMSk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbm9ybWFsIGZpcnN0IHNhbXBsZSByZWNpZXZlZCAqLworCQlpZiAoIWRldi0+ZmFuX2lucHV0X2ludXNlICYmIGRldi0+aWRsZSkgeworCQkJZW5lX3NldF9pZGxlKGRldiwgMCk7CisKKwkJCS8qIGRpc2NhcmQgZmlyc3QgcmVjaWV2ZWQgdmFsdWUsIGl0cyByYW5kb20KKwkJCSAgIHNpbmNlIGl0cyB0aGUgdGltZSBzaWduYWwgd2FzIG9mZiBiZWZvcmUKKwkJCSAgIGZpcnN0IHB1bHNlIGlmIGlkbGUgbW9kZSBpcyBlbmFibGVkLCBIVworCQkJICAgZG9lcyB0aGF0IGZvciB1cyAqLworCisJCQlpZiAoIWVuYWJsZV9pZGxlKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXVwZGF0ZV9zYW1wbGUoZGV2LCBod19zYW1wbGUpOworCQlzZW5kX3NhbXBsZShkZXYpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZW5lX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2LAorCQkgICAgIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJc3RydWN0IGVuZV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlyY19kcml2ZXIgKmxpcmNfZHJpdmVyOworCWludCBlcnJvciA9IC1FTk9NRU07CisKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW5lX2RldmljZSksIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYpCisJCWdvdG8gZXJyMTsKKworCWRldi0+cG5wX2RldiA9IHBucF9kZXY7CisJcG5wX3NldF9kcnZkYXRhKHBucF9kZXYsIGRldik7CisKKworCS8qIHByZXBhcmUgbGlyYyBpbnRlcmZhY2UgKi8KKwllcnJvciA9IC1FTk9NRU07CisJbGlyY19kcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlyY19kcml2ZXIpCisJCWdvdG8gZXJyMjsKKworCWRldi0+bGlyY19kcml2ZXIgPSBsaXJjX2RyaXZlcjsKKworCXN0cmNweShsaXJjX2RyaXZlci0+bmFtZSwgRU5FX0RSSVZFUl9OQU1FKTsKKwlsaXJjX2RyaXZlci0+bWlub3IgPSAtMTsKKwlsaXJjX2RyaXZlci0+Y29kZV9sZW5ndGggPSBzaXplb2YoaW50KSAqIDg7CisJbGlyY19kcml2ZXItPmZlYXR1cmVzID0gTElSQ19DQU5fUkVDX01PREUyOworCWxpcmNfZHJpdmVyLT5kYXRhID0gZGV2OworCWxpcmNfZHJpdmVyLT5zZXRfdXNlX2luYyA9IGVuZV9od19pbml0OworCWxpcmNfZHJpdmVyLT5zZXRfdXNlX2RlYyA9IGVuZV9od19kZWluaXQ7CisJbGlyY19kcml2ZXItPmRldiA9ICZwbnBfZGV2LT5kZXY7CisJbGlyY19kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlsaXJjX2RyaXZlci0+cmJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXJjX2J1ZmZlciksIEdGUF9LRVJORUwpOworCisJaWYgKCFsaXJjX2RyaXZlci0+cmJ1ZikKKwkJZ290byBlcnIzOworCisJaWYgKGxpcmNfYnVmZmVyX2luaXQobGlyY19kcml2ZXItPnJidWYsIHNpemVvZihpbnQpLCBzaXplb2YoaW50KSAqIDI1NikpCisJCWdvdG8gZXJyNDsKKworCWVycm9yID0gLUVOT0RFVjsKKwlpZiAobGlyY19yZWdpc3Rlcl9kcml2ZXIobGlyY19kcml2ZXIpKQorCQlnb3RvIGVycjU7CisKKwkvKiB2YWxpZGF0ZSByZXNvdXJjZXMgKi8KKwlpZiAoIXBucF9wb3J0X3ZhbGlkKHBucF9kZXYsIDApIHx8CisJICAgIHBucF9wb3J0X2xlbihwbnBfZGV2LCAwKSA8IEVORV9NQVhfSU8pCisJCWdvdG8gZXJyNjsKKworCWlmICghcG5wX2lycV92YWxpZChwbnBfZGV2LCAwKSkKKwkJZ290byBlcnI2OworCisJZGV2LT5od19pbyA9IHBucF9wb3J0X3N0YXJ0KHBucF9kZXYsIDApOworCWRldi0+aXJxID0gcG5wX2lycShwbnBfZGV2LCAwKTsKKworCS8qIGNsYWltIHRoZSByZXNvdXJjZXMgKi8KKwllcnJvciA9IC1FQlVTWTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+aHdfaW8sIEVORV9NQVhfSU8sIEVORV9EUklWRVJfTkFNRSkpCisJCWdvdG8gZXJyNjsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZW5lX2h3X2lycSwKKwkJCUlSUUZfU0hBUkVELCBFTkVfRFJJVkVSX05BTUUsICh2b2lkICopZGV2KSkKKwkJZ290byBlcnI3OworCisJLyogZGV0ZWN0IGhhcmR3YXJlIHZlcnNpb24gYW5kIGZlYXR1cmVzICovCisJZXJyb3IgPSBlbmVfaHdfZGV0ZWN0KGRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycjg7CisKKwllbmVfcHJpbnRrKEtFUk5fTk9USUNFLCAiZHJpdmVyIGhhcyBiZWVuIHN1Y2Nlc2Z1bGx5IGxvYWRlZFxuIik7CisJcmV0dXJuIDA7CisKK2Vycjg6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnI3OgorCXJlbGVhc2VfcmVnaW9uKGRldi0+aHdfaW8sIEVORV9NQVhfSU8pOworZXJyNjoKKwlsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKGxpcmNfZHJpdmVyLT5taW5vcik7CitlcnI1OgorCWxpcmNfYnVmZmVyX2ZyZWUobGlyY19kcml2ZXItPnJidWYpOworZXJyNDoKKwlrZnJlZShsaXJjX2RyaXZlci0+cmJ1Zik7CitlcnIzOgorCWtmcmVlKGxpcmNfZHJpdmVyKTsKK2VycjI6CisJa2ZyZWUoZGV2KTsKK2VycjE6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBlbmVfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2KQoreworCXN0cnVjdCBlbmVfZGV2aWNlICpkZXYgPSBwbnBfZ2V0X2RydmRhdGEocG5wX2Rldik7CisJZW5lX2h3X2RlaW5pdChkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+aHdfaW8sIEVORV9NQVhfSU8pOworCWxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIoZGV2LT5saXJjX2RyaXZlci0+bWlub3IpOworCWxpcmNfYnVmZmVyX2ZyZWUoZGV2LT5saXJjX2RyaXZlci0+cmJ1Zik7CisJa2ZyZWUoZGV2LT5saXJjX2RyaXZlcik7CisJa2ZyZWUoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBUT0RPOiBtYWtlICd3YWtlIG9uIElSJyBjb25maWd1cmFibGUgYW5kIGFkZCAuc2h1dGRvd24gKi8KKy8qIGN1cnJlbnRseSBpbXBvc3NpYmxlIGR1ZSB0byBsYWNrIG9mIGtlcm5lbCBzdXBwb3J0ICovCisKK3N0YXRpYyBpbnQgZW5lX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKnBucF9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZW5lX2RldmljZSAqZGV2ID0gcG5wX2dldF9kcnZkYXRhKHBucF9kZXYpOworCWVuZV9od193cml0ZV9yZWdfbWFzayhkZXYsIEVORV9GVzEsIEVORV9GVzFfV0FLRSwgRU5FX0ZXMV9XQUtFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmVfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2KQoreworCXN0cnVjdCBlbmVfZGV2aWNlICpkZXYgPSBwbnBfZ2V0X2RydmRhdGEocG5wX2Rldik7CisJaWYgKGRldi0+aW5fdXNlKQorCQllbmVfaHdfaW5pdChkZXYpOworCisJZW5lX2h3X3dyaXRlX3JlZ19tYXNrKGRldiwgRU5FX0ZXMSwgMCwgRU5FX0ZXMV9XQUtFKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBlbmVfaWRzW10gPSB7CisJey5pZCA9ICJFTkUwMTAwIix9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIGVuZV9kcml2ZXIgPSB7CisJLm5hbWUgPSBFTkVfRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlID0gZW5lX2lkcywKKwkuZmxhZ3MgPSBQTlBfRFJJVkVSX1JFU19ET19OT1RfQ0hBTkdFLAorCisJLnByb2JlID0gZW5lX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChlbmVfcmVtb3ZlKSwKKworI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gZW5lX3N1c3BlbmQsCisJLnJlc3VtZSA9IGVuZV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVuZV9pbml0KHZvaWQpCit7CisJaWYgKHNhbXBsZV9wZXJpb2QgPCA1KSB7CisJCWVuZV9wcmludGsoS0VSTl9FUlIsICJzYW1wbGUgcGVyaW9kIG11c3QgYmUgYXRcbiIpOworCQllbmVfcHJpbnRrKEtFUk5fRVJSLCAibGVhc3QgNSB1cywgKGF0IGxlYXN0IDMwIHJlY29tbWVuZGVkKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmZW5lX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGVuZV9leGl0KHZvaWQpCit7CisJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZlbmVfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKHNhbXBsZV9wZXJpb2QsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHNhbXBsZV9wZXJpb2QsICJIYXJkd2FyZSBzYW1wbGUgcGVyaW9kICg3NSB1cyBkZWZhdWx0KSIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX2lkbGUsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2lkbGUsCisJIkVuYWJsZXMgdHVybmluZyBvZmYgc2lnbmFsIHNhbXBsaW5nIGFmdGVyIGxvbmcgaW5hY3Rpdml0eSB0aW1lOyAiCisJImlmIGRpc2FibGVkIG1pZ2h0IGhlbHAgZGV0ZWN0aW5nIGlucHV0IHNpZ25hbCAoZGVmYXVsdDogZW5hYmxlZCkiKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9sZWFybmluZywgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9sZWFybmluZywgIlVzZSB3aWRlIGJhbmQgKGxlYXJuaW5nKSByZWNpZXZlciIpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgZW5lX2lkcyk7CitNT0RVTEVfREVTQ1JJUFRJT04KKyAgICAoIkxJUkMgZHJpdmVyIGZvciBLQjM5MjZCL0tCMzkyNkMvS0IzOTI2RCAoYWthIEVORTAxMDApIENJUiBwb3J0Iik7CitNT0RVTEVfQVVUSE9SKCJNYXhpbSBMZXZpdHNreSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChlbmVfaW5pdCk7Cittb2R1bGVfZXhpdChlbmVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2VuZTAxMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfZW5lMDEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmI2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2VuZTAxMDAuaApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIGRyaXZlciBmb3IgRU5FIEtCMzkyNiBCL0MvRCBDSVIgKGFsc28ga25vd24gYXMgRU5FMDEwMCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWF4aW0gTGV2aXRza3kgPG1heGltbGV2aXRza3lAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICovCisKKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKworLyogaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBFTkVfU1RBVFVTCQkwCSAvKiBoYXJkd2FyZSBzdGF0dXMgLSB1bnVzZWQgKi8KKyNkZWZpbmUgRU5FX0FERFJfSEkJCTEJIC8qIGhpIGJ5dGUgb2YgcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBFTkVfQUREUl9MTwkJMgkgLyogbG93IGJ5dGUgb2YgcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBFTkVfSU8JCQkzCSAvKiByZWFkL3dyaXRlIHdpbmRvdyAqLworI2RlZmluZSBFTkVfTUFYX0lPCQk0CisKKy8qIDggYnl0ZXMgb2Ygc2FtcGxlcywgZGl2aWRlZCBpbiAyIGhhbGZzKi8KKyNkZWZpbmUgRU5FX1NBTVBMRV9CVUZGRVIJMHhGOEYwCSAvKiByZWd1bGFyIHNhbXBsZSBidWZmZXIgKi8KKyNkZWZpbmUgRU5FX1NBTVBMRV9TUENfTUFTSwkoMSA8PCA3KSAvKiBzYW1wbGUgaXMgc3BhY2UgKi8KKyNkZWZpbmUgRU5FX1NBTVBMRV9WQUxVRV9NQVNLCTB4N0YKKyNkZWZpbmUgRU5FX1NBTVBMRV9PVkVSRkxPVwkweDdGCisjZGVmaW5lIEVORV9TQU1QTEVTX1NJWkUJNAorCisvKiBmYW4gaW5wdXQgc2FtcGxlIGJ1ZmZlciAqLworI2RlZmluZSBFTkVfU0FNUExFX0JVRkZFUl9GQU4JMHhGOEZCCSAvKiB0aGlzIGJ1ZmZlciBob2xkcyBoaWdoIGJ5dGUgb2YgKi8KKwkJCQkJIC8qIGVhY2ggc2FtcGxlIG9mIG5vcm1hbCBidWZmZXIgKi8KKworI2RlZmluZSBFTkVfRkFOX1NNUExfUFVMU19NU0sJMHg4MDAwCSAvKiB0aGlzIGJpdCBvZiBjb21iaW5lZCBzYW1wbGUgKi8KKwkJCQkJIC8qIGlmIHNldCwgc2F5cyB0aGF0IHNhbXBsZSBpcyBwdWxzZSAqLworI2RlZmluZSBFTkVfRkFOX1ZBTFVFX01BU0sJMHgwRkZGICAgLyogbWFzayBmb3IgdmFsaWQgYml0cyBvZiB0aGUgdmFsdWUgKi8KKworLyogZmlyc3QgZmlybXdhcmUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5FX0ZXMQkJCTB4RjhGOAorI2RlZmluZQlFTkVfRlcxX0VOQUJMRQkJKDEgPDwgMCkgLyogZW5hYmxlIGZ3IHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgRU5FX0ZXMV9UWElSUQkJKDEgPDwgMSkgLyogVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgRU5FX0ZXMV9XQUtFCQkoMSA8PCA2KSAvKiBlbmFibGUgd2FrZSBmcm9tIFMzICovCisjZGVmaW5lIEVORV9GVzFfSVJRCQkoMSA8PCA3KSAvKiBlbmFibGUgaW50ZXJydXB0ICovCisKKy8qIHNlY29uZCBmaXJtd2FyZSByZWdpc3RlciAqLworI2RlZmluZSBFTkVfRlcyCQkJMHhGOEY5CisjZGVmaW5lIEVORV9GVzJfQlVGX0hJR0gJKDEgPDwgMCkgLyogd2hpY2ggaGFsZiBvZiB0aGUgYnVmZmVyIHRvIHJlYWQgKi8KKyNkZWZpbmUgRU5FX0ZXMl9JUlFfQ0xSCQkoMSA8PCAyKSAvKiBjbGVhciB0aGlzIG9uIElSUSAqLworI2RlZmluZSBFTkVfRlcyX0dQNDBfQVNfTEVBUk4JKDEgPDwgNCkgLyogbm9ybWFsIGlucHV0IGlzIHVzZWQgYXMgKi8KKwkJCQkJIC8qIGxlYXJuaW5nIGlucHV0ICovCisjZGVmaW5lIEVORV9GVzJfRkFOX0FTX05STUxfSU4JKDEgPDwgNikgLyogZmFuIGlzIHVzZWQgYXMgbm9ybWFsIGlucHV0ICovCisjZGVmaW5lIEVORV9GVzJfTEVBUk5JTkcJKDEgPDwgNykgLyogaGFyZHdhcmUgc3VwcG9ydHMgbGVhcm5pbmcgYW5kIFRYICovCisKKy8qIGZhbiBhcyBpbnB1dCBzZXR0aW5ncyAtIG9ubHkgaWYgbGVhcm5pbmcgY2FwYWJsZSAqLworI2RlZmluZSBFTkVfRkFOX0FTX0lOMQkJMHhGRTMwICAgLyogZmFuIGluaXQgcmVnIDEgKi8KKyNkZWZpbmUgRU5FX0ZBTl9BU19JTjFfRU4JMHhDRAorI2RlZmluZSBFTkVfRkFOX0FTX0lOMgkJMHhGRTMxICAgLyogZmFuIGluaXQgcmVnIDIgKi8KKyNkZWZpbmUgRU5FX0ZBTl9BU19JTjJfRU4JMHgwMworI2RlZmluZSBFTkVfU0FNUExFX1BFUklPRF9GQU4gICA2MQkgLyogZmFuIGlucHV0IGhhcyBmaXhlZCBzYW1wbGUgcGVyaW9kICovCisKKy8qIElSUSByZWdpc3RlcnMgYmxvY2sgKGZvciByZXZpc2lvbiBCKSAqLworI2RlZmluZSBFTkVCX0lSUQkJMHhGRDA5CSAvKiBJUlEgbnVtYmVyICovCisjZGVmaW5lIEVORUJfSVJRX1VOSzEJCTB4RkQxNwkgLyogdW5rbm93biBzZXR0aW5nID0gMSAqLworI2RlZmluZSBFTkVCX0lSUV9TVEFUVVMJCTB4RkQ4MAkgLyogaXJxIHN0YXR1cyAqLworI2RlZmluZSBFTkVCX0lSUV9TVEFUVVNfSVIJKDEgPDwgNSkgLyogSVIgaXJxICovCisKKy8qIElSUSByZWdpc3RlcnMgYmxvY2sgKGZvciByZXZpc2lvbiBDLEQpICovCisjZGVmaW5lIEVORUNfSVJRCQkweEZFOUIJIC8qIG5ldyBpcnEgc2V0dGluZ3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5FQ19JUlFfTUFTSwkJMHgwRgkgLyogaXJxIG51bWJlciBtYXNrICovCisjZGVmaW5lIEVORUNfSVJRX1VOS19FTgkJKDEgPDwgNCkgLyogYWx3YXlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgRU5FQ19JUlFfU1RBVFVTCQkoMSA8PCA1KSAvKiBpcnEgc3RhdHVzIGFuZCBBQ0sgKi8KKworLyogQ0lSIGJsb2NrIHNldHRpbmdzICovCisjZGVmaW5lIEVORV9DSVJfQ09ORjEJCTB4RkVDMAorI2RlZmluZSBFTkVfQ0lSX0NPTkYxX0FEQ19PTgkweDcJIC8qIHJlY2lldmVyIG9uIGdwaW80MCBlbmFibGVkICovCisjZGVmaW5lIEVORV9DSVJfQ09ORjFfTEVBUk4xCSgxIDw8IDMpIC8qIGVuYWJsZWQgb24gbGVhcm5pbmcgbW9kZSAqLworI2RlZmluZSBFTkVfQ0lSX0NPTkYxX1RYX09OCTB4MzAJIC8qIGVuYWJsZWQgb24gdHJhbnNtaXQgKi8KKyNkZWZpbmUgRU5FX0NJUl9DT05GMV9UWF9DQVJSCSgxIDw8IDcpIC8qIHNlbmQgVFggY2FycmllciBvciBub3QgKi8KKworI2RlZmluZSBFTkVfQ0lSX0NPTkYyCQkweEZFQzEJIC8qIHVua25vd24gc2V0dGluZyA9IDAgKi8KKyNkZWZpbmUgRU5FX0NJUl9DT05GMl9MRUFSTjIJKDEgPDwgNCkgLyogc2V0IG9uIGVuYWJsZSBsZWFybmluZyAqLworI2RlZmluZSBFTkVfQ0lSX0NPTkYyX0dQSU80MERJUwkoMSA8PCA1KSAvKiBkaXNhYmxlIG5vcm1hbCBpbnB1dCB2aWEgZ3BpbzQwICovCisKKyNkZWZpbmUgRU5FX0NJUl9TQU1QTEVfUEVSSU9ECTB4RkVDOAkgLyogc2FtcGxlIHBlcmlvZCBpbiB1cyAqLworI2RlZmluZSBFTkVfQ0lSX1NBTVBMRV9PVkVSRkxPVwkoMSA8PCA3KSAvKiBpbnRlcnJ1cHQgb24gb3ZlcmZsb3dzIGlmIHNldCAqLworCisKKy8qIHRyYW5zbWl0dGVyIC0gbm90IGltcGxlbWVudGVkIHlldCAqLworLyogS0IzOTI2QyBhbmQgaGlnaGVyICovCisvKiB0cmFuc21pc3Npb24gaXMgdmVyeSBzaW1pbGlhciB0byByZWNpZXZpbmcsIGEgYnl0ZSBpcyB3cml0dGVuIHRvICovCisvKiBFTkVfVFhfSU5QVVQsIGluIHNhbWUgbWFubmVyIGFzIGl0IGlzIHJlYWQgZnJvbSBzYW1wbGUgYnVmZmVyICovCisvKiBzYW1wbGUgcGVyaW9kIGlzIGZpeGVkKi8KKworCisvKiB0cmFuc21pdHRlciBwb3J0cyAqLworI2RlZmluZSBFTkVfVFhfUE9SVDEJCTB4RkMwMQkgLyogdGhpcyBlbmFibGVzIG9uZSBvciBib3RoICovCisjZGVmaW5lIEVORV9UWF9QT1JUMV9FTgkJKDEgPDwgNSkgLyogVFggcG9ydHMgKi8KKyNkZWZpbmUgRU5FX1RYX1BPUlQyCQkweEZDMDgKKyNkZWZpbmUgRU5FX1RYX1BPUlQyX0VOCQkoMSA8PCAxKQorCisjZGVmaW5lIEVORV9UWF9JTlBVVAkJMHhGRUM5CSAvKiBuZXh0IGJ5dGUgdG8gdHJhbnNtaXQgKi8KKyNkZWZpbmUgRU5FX1RYX1NQQ19NQVNLCQkoMSA8PCA3KSAvKiBUcmFuc21pdHRlZCBzYW1wbGUgaXMgc3BhY2UgKi8KKyNkZWZpbmUgRU5FX1RYX1VOSzEJCTB4RkVDQgkgLyogc2V0IHRvIDB4NjMgKi8KKyNkZWZpbmUgRU5FX1RYX1NNUExfUEVSSU9ECTUwCSAvKiB0cmFuc21pdCBzYW1wbGUgcGVyaW9kICovCisKKworI2RlZmluZSBFTkVfVFhfQ0FSUklFUgkJMHhGRUNFCSAvKiBUWCBjYXJyaWVyICogMiAoa2h6KSAqLworI2RlZmluZSBFTkVfVFhfQ0FSUklFUl9VTktCSVQJMHg4MAkgLyogVGhpcyBiaXQgc2V0IG9uIHRyYW5zbWl0ICovCisjZGVmaW5lIEVORV9UWF9DQVJSSUVSX0xPVwkweEZFQ0YJIC8qIFRYIGNhcnJpZXIgLyAyICovCisKKy8qIEhhcmR3YXJlIHZlcnNpb25zICovCisjZGVmaW5lIEVORV9IV19WRVJTSU9OCQkweEZGMDAJIC8qIGhhcmR3YXJlIHJldmlzaW9uICovCisjZGVmaW5lIEVORV9IV19VTksJCTB4RkYxRAorI2RlZmluZSBFTkVfSFdfVU5LX0NMUgkJKDEgPDwgMikKKyNkZWZpbmUgRU5FX0hXX1ZFUl9NQUpPUgkweEZGMUUJIC8qIGNoaXAgdmVyc2lvbiAqLworI2RlZmluZSBFTkVfSFdfVkVSX01JTk9SCTB4RkYxRgorI2RlZmluZSBFTkVfSFdfVkVSX09MRAkJMHhGRDAwCisKKyNkZWZpbmUgc2FtZV9zaWduKGEsIGIpICgoKChhKSA+IDApICYmIChiKSA+IDApIHx8ICgoYSkgPCAwICYmIChiKSA8IDApKQorCisjZGVmaW5lIEVORV9EUklWRVJfTkFNRQkJImVuZWNpciIKKyNkZWZpbmUgRU5FX01BWEdBUAkJMjUwMDAwCSAvKiB0aGlzIGlzIGFtb3VudCBvZiB0aW1lIHdlIHdhaXQKKwkJCQkJIGJlZm9yZSB0dXJuaW5nIHRoZSBzYW1wbGVyLCBjaG9zZW4KKwkJCQkJIGFyYml0cnkgKi8KKworI2RlZmluZSBzcGFjZShsZW4pCSAgICAgICAoLShsZW4pKQkgLyogYWRkIGEgc3BhY2UgKi8KKworLyogc29mdHdhcmUgZGVmaW5lcyAqLworI2RlZmluZSBFTkVfSVJRX1JYCQkxCisjZGVmaW5lIEVORV9JUlFfVFgJCTIKKworI2RlZmluZSAgRU5FX0hXX0IJCTEJLyogMzkyNkIgKi8KKyNkZWZpbmUgIEVORV9IV19DCQkyCS8qIDM5MjZDICovCisjZGVmaW5lICBFTkVfSFdfRAkJMwkvKiAzOTI2RCAqLworCisjZGVmaW5lIGVuZV9wcmludGsobGV2ZWwsIHRleHQsIC4uLikgXAorCXByaW50ayhsZXZlbCBFTkVfRFJJVkVSX05BTUUgIjogIiB0ZXh0LCAjIyBfX1ZBX0FSR1NfXykKKworc3RydWN0IGVuZV9kZXZpY2UgeworCXN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2OworCXN0cnVjdCBsaXJjX2RyaXZlciAqbGlyY19kcml2ZXI7CisKKwkvKiBodyBzZXR0aW5ncyAqLworCXVuc2lnbmVkIGxvbmcgaHdfaW87CisJaW50IGlycTsKKworCWludCBod19yZXZpc2lvbjsJCQkvKiBoYXJkd2FyZSByZXZpc2lvbiAqLworCWludCBod19sZWFybmluZ19hbmRfdHhfY2FwYWJsZTsJCS8qIGxlYXJuaW5nIGNhcGFibGUgKi8KKwlpbnQgaHdfZ3BpbzQwX2xlYXJuaW5nOwkJCS8qIGdwaW80MCBpcyBsZWFybmluZyAqLworCWludCBod19mYW5fYXNfbm9ybWFsX2lucHV0OwkvKiBmYW4gaW5wdXQgaXMgdXNlZCBhcyByZWd1bGFyIGlucHV0ICovCisKKwkvKiBkZXZpY2UgZGF0YSAqLworCWludCBpZGxlOworCWludCBmYW5faW5wdXRfaW51c2U7CisKKwlpbnQgc2FtcGxlOworCWludCBpbl91c2U7CisKKwlzdHJ1Y3QgdGltZXZhbCBnYXBfc3RhcnQ7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmMmMwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaTJjLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBsaXJjX2kyYy5jCisgKgorICogaTJjIElSIGRyaXZlciBmb3IgdGhlIG9uYm9hcmQgSVIgcG9ydCBvbiBtYW55IFRWIHR1bmVyIGNhcmRzLCBpbmNsdWRpbmc6CisgKiAgLUZsYXZvcnMgb2YgdGhlIEhhdXBwYXVnZSBQVlItMTUwLzI1MC8zNTAKKyAqICAtSGF1cHBhdWdlIEhWUi0xMzAwCisgKiAgLVBpeGVsVmlldyAoQlQ4NzhQK1cvRk0pCisgKiAgLUtOQyBPTkUgVFYgU3RhdGlvbi9BbnViaXMgVHlwaG9vbiBUVmlldyBUdW5lcgorICogIC1Bc3VzIFRWLUJveCBhbmQgQ3JlYXRpdmUvVmlzaW9uVGVrIEJyZWFrT3V0LUJveAorICogIC1MZWFkdGVrIFdpbmZhc3QgUFZSMjAwMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgorICogbW9kaWZpZWQgZm9yIFBpeGVsVmlldyAoQlQ4NzhQK1cvRk0pIGJ5CisgKiAgICAgIE1pY2hhbCBLb2NoYW5vd2ljeiA8bWtvY2hhbm9AcGxkLm9yZy5wbD4KKyAqICAgICAgQ2hyaXN0b3BoIEJhcnRlbG11cyA8bGlyY0BiYXJ0ZWxtdXMuZGU+CisgKiBtb2RpZmllZCBmb3IgS05DIE9ORSBUViBTdGF0aW9uL0FudWJpcyBUeXBob29uIFRWaWV3IFR1bmVyIGJ5CisgKiAgICAgIFVscmljaCBNdWVsbGVyIDx1bHJpY2gubXVlbGxlcjQyQHdlYi5kZT4KKyAqIG1vZGlmaWVkIGZvciBBc3VzIFRWLUJveCBhbmQgQ3JlYXRpdmUvVmlzaW9uVGVrIEJyZWFrT3V0LUJveCBieQorICogICAgICBTdGVmYW4gSmFobiA8c3RlZmFuQGxrY2Mub3JnPgorICogbW9kaWZpZWQgZm9yIGluY2x1c2lvbiBpbnRvIGtlcm5lbCBzb3VyY2VzIGJ5CisgKiAgICAgIEplcm9tZSBCcm9jayA8amJyb2NrQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIG1vZGlmaWVkIGZvciBMZWFkdGVrIFdpbmZhc3QgUFZSMjAwMCBieQorICogICAgICBUaG9tYXMgUmVpdG1heXIgKHRyZWl0bWF5ckB5YWhvby5jb20pCisgKiBtb2RpZmllZCBmb3IgSGF1cHBhdWdlIEhWUi0xMzAwIGJ5CisgKiAgICAgIEphbiBGcmV5IChqZnJleUBnbXguZGUpCisgKgorICogcGFydHMgYXJlIGN1dCZwYXN0ZWQgZnJvbSB0aGUgb2xkIGxpcmNfaGF1cC5jIGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgorCitzdHJ1Y3QgSVIgeworCXN0cnVjdCBsaXJjX2RyaXZlciBsOworCXN0cnVjdCBpMmNfY2xpZW50ICBjOworCWludCBuZXh0a2V5OworCXVuc2lnbmVkIGNoYXIgYlszXTsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisJdW5zaWduZWQgY2hhciBmbGFnOworfTsKKworI2RlZmluZSBERVZJQ0VfTkFNRSAibGlyY19pMmMiCisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGRlYnVnOwkvKiBkZWJ1ZyBvdXRwdXQgKi8KK3N0YXRpYyBpbnQgbWlub3IgPSAtMTsJLyogbWlub3IgbnVtYmVyICovCisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGRlYnVnKQkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHIERFVklDRV9OQU1FICI6ICIgZm10LAkJXAorCQkJICAgICAgICMjIGFyZ3MpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCByZXZlcnNlKGludCBkYXRhLCBpbnQgYml0cykKK3sKKwlpbnQgaTsKKwlpbnQgYzsKKworCWZvciAoYyA9IDAsIGkgPSAwOyBpIDwgYml0czsgaSsrKQorCQljIHw9ICgoZGF0YSAmICgxPDxpKSkgPyAxIDogMCkgPDwgKGJpdHMtMS1pKTsKKworCXJldHVybiBjOworfQorCitzdGF0aWMgaW50IGFkZF90b19idWZfYWRhcCh2b2lkICpkYXRhLCBzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGtleWJ1Zls0XTsKKworCWtleWJ1ZlswXSA9IDB4MDA7CisJaTJjX21hc3Rlcl9zZW5kKCZpci0+Yywga2V5YnVmLCAxKTsKKwkvKiBwb2xsIElSIGNoaXAgKi8KKwlpZiAoaTJjX21hc3Rlcl9yZWN2KCZpci0+Yywga2V5YnVmLCBzaXplb2Yoa2V5YnVmKSkgIT0gc2l6ZW9mKGtleWJ1ZikpIHsKKwkJZHByaW50aygicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRwcmludGsoImtleSAoMHglMDJ4JTAyeCUwMnglMDJ4KVxuIiwKKwkJa2V5YnVmWzBdLCBrZXlidWZbMV0sIGtleWJ1ZlsyXSwga2V5YnVmWzNdKTsKKworCS8qIGtleSBwcmVzc2VkID8gKi8KKwlpZiAoa2V5YnVmWzJdID09IDB4ZmYpCisJCXJldHVybiAtRU5PREFUQTsKKworCS8qIHJlbW92ZSByZXBlYXQgYml0ICovCisJa2V5YnVmWzJdICY9IDB4N2Y7CisJa2V5YnVmWzNdIHw9IDB4ODA7CisKKwlsaXJjX2J1ZmZlcl93cml0ZShidWYsIGtleWJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RvX2J1Zl9wY2Y4NTc0KHZvaWQgKmRhdGEsIHN0cnVjdCBsaXJjX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBJUiAqaXIgPSBkYXRhOworCWludCByYzsKKwl1bnNpZ25lZCBjaGFyIGFsbCwgbWFzazsKKwl1bnNpZ25lZCBjaGFyIGtleTsKKworCS8qIGNvbXB1dGUgYWxsIHZhbGlkIGJpdHMgKGtleSBjb2RlICsgcHJlc3NlZC9yZWxlYXNlIGZsYWcpICovCisJYWxsID0gaXItPmJpdHMgfCBpci0+ZmxhZzsKKworCS8qIHNhdmUgSVIgd3JpdGFibGUgbWFzayBiaXRzICovCisJbWFzayA9IGkyY19zbWJ1c19yZWFkX2J5dGUoJmlyLT5jKSAmIH5hbGw7CisKKwkvKiBzZW5kIGJpdCBtYXNrICovCisJcmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZSgmaXItPmMsICgweGZmICYgYWxsKSB8IG1hc2spOworCisJLyogcmVjZWl2ZSBzY2FuIGNvZGUgKi8KKwlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGUoJmlyLT5jKTsKKworCWlmIChyYyA9PSAtMSkgeworCQlkcHJpbnRrKCIlcyByZWFkIGVycm9yXG4iLCBpci0+Yy5uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogZHJvcCBkdXBsaWNhdGUgcG9sbHMgKi8KKwlpZiAoaXItPmJbMF0gPT0gKHJjICYgYWxsKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJaXItPmJbMF0gPSByYyAmIGFsbDsKKworCWRwcmludGsoIiVzIGtleSAweCUwMlggJXNcbiIsIGlyLT5jLm5hbWUsIHJjICYgaXItPmJpdHMsCisJCShyYyAmIGlyLT5mbGFnKSA/ICJyZWxlYXNlZCIgOiAicHJlc3NlZCIpOworCisJLyogaWdub3JlIHJlbGVhc2VkIGJ1dHRvbnMgKi8KKwlpZiAocmMgJiBpci0+ZmxhZykKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJLyogc2V0IHZhbGlkIGtleSBjb2RlICovCisJa2V5ICA9IHJjICYgaXItPmJpdHM7CisJbGlyY19idWZmZXJfd3JpdGUoYnVmLCAma2V5KTsKKwlyZXR1cm4gMDsKK30KKworLyogY29tbW9uIGZvciBIYXVwcGF1Z2UgSVIgcmVjZWl2ZXJzICovCitzdGF0aWMgaW50IGFkZF90b19idWZfaGF1cF9jb21tb24odm9pZCAqZGF0YSwgc3RydWN0IGxpcmNfYnVmZmVyICpidWYsCisJCXVuc2lnbmVkIGNoYXIgKmtleWJ1ZiwgaW50IHNpemUsIGludCBvZmZzZXQpCit7CisJc3RydWN0IElSICppciA9IGRhdGE7CisJX191MTYgY29kZTsKKwl1bnNpZ25lZCBjaGFyIGNvZGVzWzJdOworCWludCByZXQ7CisKKwkvKiBwb2xsIElSIGNoaXAgKi8KKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoJmlyLT5jLCBrZXlidWYsIHNpemUpOworCWlmIChyZXQgPT0gc2l6ZSkgeworCQlpci0+YlswXSA9IGtleWJ1ZltvZmZzZXRdOworCQlpci0+YlsxXSA9IGtleWJ1ZltvZmZzZXQrMV07CisJCWlyLT5iWzJdID0ga2V5YnVmW29mZnNldCsyXTsKKwkJaWYgKGlyLT5iWzBdICE9IDB4MDAgJiYgaXItPmJbMV0gIT0gMHgwMCkKKwkJCWRwcmludGsoImtleSAoMHglMDJ4LzB4JTAyeClcbiIsIGlyLT5iWzBdLCBpci0+YlsxXSk7CisJfSBlbHNlIHsKKwkJZHByaW50aygicmVhZCBlcnJvciAocmV0PSVkKVxuIiwgcmV0KTsKKwkJLyoga2VlcCBsYXN0IHN1Y2Nlc3NmdWwgcmVhZCBidWZmZXIgKi8KKwl9CisKKwkvKiBrZXkgcHJlc3NlZCA/ICovCisJaWYgKChpci0+YlswXSAmIDB4ODApID09IDApCisJCXJldHVybiAtRU5PREFUQTsKKworCS8qIGxvb2sgd2hhdCB3ZSBoYXZlICovCisJY29kZSA9ICgoKF9fdTE2KWlyLT5iWzBdJjB4N2YpPDw2KSB8IChpci0+YlsxXT4+Mik7CisKKwljb2Rlc1swXSA9IChjb2RlID4+IDgpICYgMHhmZjsKKwljb2Rlc1sxXSA9IGNvZGUgJiAweGZmOworCisJLyogcmV0dXJuIGl0ICovCisJZHByaW50aygic2VuZGluZyBjb2RlIDB4JTAyeCUwMnggdG8gbGlyY1xuIiwgY29kZXNbMF0sIGNvZGVzWzFdKTsKKwlsaXJjX2J1ZmZlcl93cml0ZShidWYsIGNvZGVzKTsKKwlyZXR1cm4gMDsKK30KKworLyogc3BlY2lmaWMgZm9yIHRoZSBIYXVwcGF1Z2UgUFZSMTUwIElSIHJlY2VpdmVyICovCitzdGF0aWMgaW50IGFkZF90b19idWZfaGF1cF9wdnIxNTAodm9pZCAqZGF0YSwgc3RydWN0IGxpcmNfYnVmZmVyICpidWYpCit7CisJdW5zaWduZWQgY2hhciBrZXlidWZbNl07CisJLyogZmV0Y2ggNiBieXRlcywgZmlyc3QgcmVsZXZhbnQgaXMgYXQgb2Zmc2V0IDMgKi8KKwlyZXR1cm4gYWRkX3RvX2J1Zl9oYXVwX2NvbW1vbihkYXRhLCBidWYsIGtleWJ1ZiwgNiwgMyk7Cit9CisKKy8qIHVzZWQgZm9yIGFsbCBIYXVwcGF1Z2UgSVIgcmVjZWl2ZXJzIGJ1dCB0aGUgUFZSMTUwICovCitzdGF0aWMgaW50IGFkZF90b19idWZfaGF1cCh2b2lkICpkYXRhLCBzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBjaGFyIGtleWJ1ZlszXTsKKwkvKiBmZXRjaCAzIGJ5dGVzLCBmaXJzdCByZWxldmFudCBpcyBhdCBvZmZzZXQgMCAqLworCXJldHVybiBhZGRfdG9fYnVmX2hhdXBfY29tbW9uKGRhdGEsIGJ1Ziwga2V5YnVmLCAzLCAwKTsKK30KKworCitzdGF0aWMgaW50IGFkZF90b19idWZfcHZyMjAwMCh2b2lkICpkYXRhLCBzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGtleTsKKwlzMzIgZmxhZ3M7CisJczMyIGNvZGU7CisKKwkvKiBwb2xsIElSIGNoaXAgKi8KKwlmbGFncyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmaXItPmMsIDB4MTApOworCWlmICgtMSA9PSBmbGFncykgeworCQlkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKwkvKiBrZXkgcHJlc3NlZCA/ICovCisJaWYgKDAgPT0gKGZsYWdzICYgMHg4MCkpCisJCXJldHVybiAtRU5PREFUQTsKKworCS8qIHJlYWQgYWN0dWFsIGtleSBjb2RlICovCisJY29kZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmaXItPmMsIDB4MDApOworCWlmICgtMSA9PSBjb2RlKSB7CisJCWRwcmludGsoInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVOT0RBVEE7CisJfQorCisJa2V5ID0gY29kZSAmIDB4RkY7CisKKwlkcHJpbnRrKCJJUiBLZXkvRmxhZ3M6ICgweCUwMngvMHglMDJ4KVxuIiwga2V5LCBmbGFncyAmIDB4RkYpOworCisJLyogcmV0dXJuIGl0ICovCisJbGlyY19idWZmZXJfd3JpdGUoYnVmLCAma2V5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfdG9fYnVmX3BpeGVsdmlldyh2b2lkICpkYXRhLCBzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGtleTsKKworCS8qIHBvbGwgSVIgY2hpcCAqLworCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdigmaXItPmMsICZrZXksIDEpKSB7CisJCWRwcmludGsoInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRwcmludGsoImtleSAlMDJ4XG4iLCBrZXkpOworCisJLyogcmV0dXJuIGl0ICovCisJbGlyY19idWZmZXJfd3JpdGUoYnVmLCAma2V5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfdG9fYnVmX3B2OTUxKHZvaWQgKmRhdGEsIHN0cnVjdCBsaXJjX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBJUiAqaXIgPSBkYXRhOworCXVuc2lnbmVkIGNoYXIga2V5OworCXVuc2lnbmVkIGNoYXIgY29kZXNbNF07CisKKwkvKiBwb2xsIElSIGNoaXAgKi8KKwlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoJmlyLT5jLCAma2V5LCAxKSkgeworCQlkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKwkvKiBpZ25vcmUgMHhhYSAqLworCWlmIChrZXkgPT0gMHhhYSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWRwcmludGsoImtleSAlMDJ4XG4iLCBrZXkpOworCisJY29kZXNbMF0gPSAweDYxOworCWNvZGVzWzFdID0gMHhENjsKKwljb2Rlc1syXSA9IHJldmVyc2Uoa2V5LCA4KTsKKwljb2Rlc1szXSA9ICh+Y29kZXNbMl0pJjB4ZmY7CisKKwlsaXJjX2J1ZmZlcl93cml0ZShidWYsIGNvZGVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfdG9fYnVmX2tuYzEodm9pZCAqZGF0YSwgc3RydWN0IGxpcmNfYnVmZmVyICpidWYpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFzdF9rZXkgPSAweEZGOworCXN0cnVjdCBJUiAqaXIgPSBkYXRhOworCXVuc2lnbmVkIGNoYXIga2V5OworCisJLyogcG9sbCBJUiBjaGlwICovCisJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KCZpci0+YywgJmtleSwgMSkpIHsKKwkJZHByaW50aygicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CisKKwkvKgorCSAqIGl0IHNlZW1zIHRoYXQgMHhGRSBpbmRpY2F0ZXMgdGhhdCBhIGJ1dHRvbiBpcyBzdGlsbCBoZWxkCisJICogZG93biwgd2hpbGUgMHhGRiBpbmRpY2F0ZXMgdGhhdCBubyBidXR0b24gaXMgaGVsZAorCSAqIGRvd24uIDB4RkUgc2VxdWVuY2VzIGFyZSBzb21ldGltZXMgaW50ZXJydXB0ZWQgYnkgMHhGRgorCSAqLworCisJZHByaW50aygia2V5ICUwMnhcbiIsIGtleSk7CisKKwlpZiAoa2V5ID09IDB4RkYpCisJCXJldHVybiAtRU5PREFUQTsKKworCWlmIChrZXkgPT0gMHhGRSkKKwkJa2V5ID0gbGFzdF9rZXk7CisKKwlsYXN0X2tleSA9IGtleTsKKwlsaXJjX2J1ZmZlcl93cml0ZShidWYsICZrZXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3VzZV9pbmModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKworCWRwcmludGsoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJLyogbG9jayBidHR2IGluIG1lbW9yeSB3aGlsZSAvZGV2L2xpcmMgaXMgaW4gdXNlICAqLworCWkyY191c2VfY2xpZW50KCZpci0+Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3VzZV9kZWModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gZGF0YTsKKworCWRwcmludGsoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJaTJjX3JlbGVhc2VfY2xpZW50KCZpci0+Yyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlyY19kcml2ZXIgbGlyY190ZW1wbGF0ZSA9IHsKKwkubmFtZQkJPSAibGlyY19pMmMiLAorCS5zZXRfdXNlX2luYwk9IHNldF91c2VfaW5jLAorCS5zZXRfdXNlX2RlYwk9IHNldF91c2VfZGVjLAorCS5kZXYJCT0gTlVMTCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGlyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgaW50IGlyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQgaXJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXJfcmVjZWl2ZXJfaWRbXSA9IHsKKwkvKiBHZW5lcmljIGVudHJ5IGZvciBhbnkgSVIgcmVjZWl2ZXIgKi8KKwl7ICJpcl92aWRlbyIsIDAgfSwKKwkvKiBJUiBkZXZpY2Ugc3BlY2lmaWMgZW50cmllcyBjb3VsZCBiZSBhZGRlZCBoZXJlICovCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJpMmMgaXIgZHJpdmVyIiwKKwl9LAorCS5wcm9iZQkJPSBpcl9wcm9iZSwKKwkucmVtb3ZlCQk9IGlyX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBpcl9yZWNlaXZlcl9pZCwKKwkuY29tbWFuZAk9IGlyX2NvbW1hbmQsCit9OworCitzdGF0aWMgdm9pZCBwY2ZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IElSICppcikKK3sKKwlpbnQgcmV0MSwgcmV0MiwgcmV0MywgcmV0NDsKKworCXJldDEgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIDB4ZmYpOworCXJldDIgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJcmV0MyA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgMHgwMCk7CisJcmV0NCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKKworCS8qIGluIHRoZSBBc3VzIFRWLUJveDogYml0IDEtMCAqLworCWlmICgoKHJldDIgJiAweDAzKSA9PSAweDAzKSAmJiAoKHJldDQgJiAweDAzKSA9PSAweDAwKSkgeworCQlpci0+Yml0cyA9ICh1bnNpZ25lZCBjaGFyKSB+MHgwNzsKKwkJaXItPmZsYWcgPSAweDA0OworCS8qIGluIHRoZSBDcmVhdGl2ZS9WaXNpb25UZWsgQnJlYWtPdXQtQm94OiBiaXQgNy02ICovCisJfSBlbHNlIGlmICgoKHJldDIgJiAweGMwKSA9PSAweGMwKSAmJiAoKHJldDQgJiAweGMwKSA9PSAweDAwKSkgeworCQlpci0+Yml0cyA9ICh1bnNpZ25lZCBjaGFyKSB+MHhlMDsKKwkJaXItPmZsYWcgPSAweDIwOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGludCBpcl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IElSICppcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSBjbGllbnQtPmFkYXB0ZXI7CisJdW5zaWduZWQgc2hvcnQgYWRkciA9IGNsaWVudC0+YWRkcjsKKwlpbnQgcmV0dmFsOworCisJaXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgSVIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoJmlyLT5sLCAmbGlyY190ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBsaXJjX2RyaXZlcikpOworCW1lbWNweSgmaXItPmMsIGNsaWVudCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpcik7CisJaXItPmwuZGF0YSAgICA9IGlyOworCWlyLT5sLm1pbm9yICAgPSBtaW5vcjsKKwlpci0+bC5zYW1wbGVfcmF0ZSA9IDEwOworCWlyLT5sLmRldiAgICAgPSAmaXItPmMuZGV2OworCWlyLT5uZXh0a2V5ICAgPSAtMTsKKworCXN3aXRjaCAoYWRkcikgeworCWNhc2UgMHg2NDoKKwkJc3RybGNweShpci0+Yy5uYW1lLCAiUGl4ZWx2aWV3IElSIiwgSTJDX05BTUVfU0laRSk7CisJCWlyLT5sLmNvZGVfbGVuZ3RoID0gODsKKwkJaXItPmwuYWRkX3RvX2J1ZiA9IGFkZF90b19idWZfcGl4ZWx2aWV3OworCQlicmVhazsKKwljYXNlIDB4NGI6CisJCXN0cmxjcHkoaXItPmMubmFtZSwgIlBWOTUxIElSIiwgSTJDX05BTUVfU0laRSk7CisJCWlyLT5sLmNvZGVfbGVuZ3RoID0gMzI7CisJCWlyLT5sLmFkZF90b19idWYgPSBhZGRfdG9fYnVmX3B2OTUxOworCQlicmVhazsKKwljYXNlIDB4NzE6CisJCWlmIChhZGFwLT5pZCA9PSBJMkNfSFdfQl9DWDIzODh4KQorCQkJc3RybGNweShpci0+Yy5uYW1lLCAiSGF1cHBhdWdlIEhWUjEzMDAiLCBJMkNfTkFNRV9TSVpFKTsKKwkJZWxzZSAvKiBidDh4eCBvciBjeDIzNDF4ICovCisJCQkvKgorCQkJICogVGhlIFBWUjE1MCBJUiByZWNlaXZlciB1c2VzIHRoZSBzYW1lIHByb3RvY29sIGFzCisJCQkgKiBvdGhlciBIYXVwcGF1Z2UgY2FyZHMsIGJ1dCB0aGUgZGF0YSBmbG93IGlzCisJCQkgKiBkaWZmZXJlbnQsIHNvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIGl0IGJ5IGl0cyBvd24uCisJCQkgKi8KKwkJCXN0cmxjcHkoaXItPmMubmFtZSwgIkhhdXBwYXVnZSBQVlIxNTAiLCBJMkNfTkFNRV9TSVpFKTsKKwkJaXItPmwuY29kZV9sZW5ndGggPSAxMzsKKwkJaXItPmwuYWRkX3RvX2J1ZiA9IGFkZF90b19idWZfaGF1cF9wdnIxNTA7CisJCWJyZWFrOworCWNhc2UgMHg2YjoKKwkJc3RybGNweShpci0+Yy5uYW1lLCAiQWRhcHRlYyBJUiIsIEkyQ19OQU1FX1NJWkUpOworCQlpci0+bC5jb2RlX2xlbmd0aCA9IDMyOworCQlpci0+bC5hZGRfdG9fYnVmID0gYWRkX3RvX2J1Zl9hZGFwOworCQlicmVhazsKKwljYXNlIDB4MTg6CisJY2FzZSAweDFhOgorCQlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX0JfQ1gyMzg4eCkgeworCQkJc3RybGNweShpci0+Yy5uYW1lLCAiTGVhZHRlayBJUiIsIEkyQ19OQU1FX1NJWkUpOworCQkJaXItPmwuY29kZV9sZW5ndGggPSA4OworCQkJaXItPmwuYWRkX3RvX2J1ZiA9IGFkZF90b19idWZfcHZyMjAwMDsKKwkJfSBlbHNlIHsgLyogYnQ4eHggb3IgY3gyMzQxeCAqLworCQkJc3RybGNweShpci0+Yy5uYW1lLCAiSGF1cHBhdWdlIElSIiwgSTJDX05BTUVfU0laRSk7CisJCQlpci0+bC5jb2RlX2xlbmd0aCA9IDEzOworCQkJaXItPmwuYWRkX3RvX2J1ZiA9IGFkZF90b19idWZfaGF1cDsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4MzA6CisJCXN0cmxjcHkoaXItPmMubmFtZSwgIktOQyBPTkUgSVIiLCBJMkNfTkFNRV9TSVpFKTsKKwkJaXItPmwuY29kZV9sZW5ndGggPSA4OworCQlpci0+bC5hZGRfdG9fYnVmID0gYWRkX3RvX2J1Zl9rbmMxOworCQlicmVhazsKKwljYXNlIDB4MjE6CisJY2FzZSAweDIzOgorCQlwY2ZfcHJvYmUoY2xpZW50LCBpcik7CisJCXN0cmxjcHkoaXItPmMubmFtZSwgIlRWLUJveCBJUiIsIEkyQ19OQU1FX1NJWkUpOworCQlpci0+bC5jb2RlX2xlbmd0aCA9IDg7CisJCWlyLT5sLmFkZF90b19idWYgPSBhZGRfdG9fYnVmX3BjZjg1NzQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJcHJpbnRrKCJsaXJjX2kyYzogSHVoPyB1bmtub3duIGkyYyBhZGRyZXNzICgweCUwMngpP1xuIiwgYWRkcik7CisJCWtmcmVlKGlyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByaW50ayhLRVJOX0lORk8gImxpcmNfaTJjOiBjaGlwIDB4JXggZm91bmQgQCAweCUwMnggKCVzKVxuIiwKKwkgICAgICAgYWRhcC0+aWQsIGFkZHIsIGlyLT5jLm5hbWUpOworCisJcmV0dmFsID0gbGlyY19yZWdpc3Rlcl9kcml2ZXIoJmlyLT5sKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGlyY19pMmM6IGZhaWxlZCB0byByZWdpc3RlciBkcml2ZXIhXG4iKTsKKwkJa2ZyZWUoaXIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlyLT5sLm1pbm9yID0gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IElSICppciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJLyogdW5yZWdpc3RlciBkZXZpY2UgKi8KKwlsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKGlyLT5sLm1pbm9yKTsKKworCS8qIGZyZWUgbWVtb3J5ICovCisJa2ZyZWUoaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCS8qIG5vdGhpbmcgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbGlyY19pMmNfaW5pdCh2b2lkKQoreworCWkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGlyY19pMmNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkluZnJhcmVkIHJlY2VpdmVyIGRyaXZlciBmb3IgSGF1cHBhdWdlIGFuZCAiCisJCSAgICJQaXhlbHZpZXcgY2FyZHMgKGkyYyBzdGFjaykiKTsKK01PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIsIE1pY2hhbCBLb2NoYW5vd2ljeiwgQ2hyaXN0b3BoIEJhcnRlbG11cywgIgorCSAgICAgICJVbHJpY2ggTXVlbGxlciwgU3RlZmFuIEphaG4sIEplcm9tZSBCcm9jayIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0obWlub3IsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLCAiUHJlZmVycmVkIG1pbm9yIGRldmljZSBudW1iZXIiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyIpOworCittb2R1bGVfaW5pdChsaXJjX2kyY19pbml0KTsKK21vZHVsZV9leGl0KGxpcmNfaTJjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTYwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKiBsaXJjX2lnb3JwbHVndXNiIC0gVVNCIHJlbW90ZSBzdXBwb3J0IGZvciBMSVJDCisgKgorICogU3VwcG9ydHMgdGhlIHN0YW5kYXJkIGhvbWVicmV3IElnb3JQbHVnVVNCIHJlY2VpdmVyIHdpdGggSWdvcidzIGZpcm13YXJlLgorICogU2VlIGh0dHA6Ly93d3cuY2Vza28uaG9zdC5zay9JZ29yUGx1Z1VTQi9JZ29yUGx1Zy1VU0IlMjAoQVZSKV9lbmcuaHRtCisgKgorICogVGhlIGRldmljZSBjYW4gb25seSByZWNvcmQgYnVyc3RzIG9mIHVwIHRvIDM2IHB1bHNlcy9zcGFjZXMuCisgKiBXb3JrcyBmaW5lIHdpdGggUkM1LiBMb25nZXIgY29tbWFuZHMgbGVhZCB0byBkZXZpY2UgYnVmZmVyIG92ZXJydW4uCisgKiAoTWF5YmUgYSBiZXR0ZXIgZmlybXdhcmUgb3IgYSBtaWNyb2NvbnRyb2xsZXIgd2l0aCBtb3JlIHJhbSBjYW4gaGVscD8pCisgKgorICogVmVyc2lvbiAwLjEgIFtiZXRhIHN0YXR1c10KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmFuIE0uIEhvY2hzdGVpbgorICoJPGhvY2hzdGVpbkBhbGdvLmluZm9ybWF0aWsudHUtZGFybXN0YWR0LmRlPgorICoKKyAqIFRoaXMgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb206CisgKiAgIFBhdWwgTWlsbGVyIDxwbWlsbGVyOUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiAgICAgICJsaXJjX2F0aXVzYiIgbW9kdWxlCisgKiAgIFZsYWRpbWlyIERlcmdhY2hldiA8dm9sb2R5YUBtaW5zcHJpbmcuY29tPidzIDIwMDIKKyAqICAgICAgIlVTQiBBVEkgUmVtb3RlIHN1cHBvcnQiIChpbnB1dCBkZXZpY2UpCisgKiAgIEFkcmlhbiBEZXdodXJzdCA8c2FpbG9yLWxrQHNhaWxvcmZyYWcubmV0PidzIDIwMDIKKyAqICAgICAgIlVTQiBTdHJlYW1aYXAgcmVtb3RlIGRyaXZlciIgKExJUkMpCisgKiAgIEFydHVyIExpcG93c2tpIDxhbGlwb3dza2lAa2tpLm5ldC5wbD4ncyAyMDAyCisgKiAgICAgICJsaXJjX2RldiIgYW5kICJsaXJjX2dwaW8iIExJUkMgbW9kdWxlcworICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgorI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CisKKworLyogbW9kdWxlIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMC4xIgorI2RlZmluZSBEUklWRVJfQVVUSE9SCQlcCisJIkphbiBNLiBIb2Noc3RlaW4gPGhvY2hzdGVpbkBhbGdvLmluZm9ybWF0aWsudHUtZGFybXN0YWR0LmRlPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJVU0IgcmVtb3RlIGRyaXZlciBmb3IgTElSQyIKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJsaXJjX2lnb3JwbHVndXNiIgorCisvKiBkZWJ1Z2dpbmcgc3VwcG9ydCAqLworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKK3N0YXRpYyBpbnQgZGVidWcgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVidWc7CisjZW5kaWYKKworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKGRlYnVnKQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgZm10LCAjIyBhcmdzKTsJXAorCX0gd2hpbGUgKDApCisKKy8qIE9uZSBtb2RlMiBwdWxzZS9zcGFjZSBoYXMgNCBieXRlcy4gKi8KKyNkZWZpbmUgQ09ERV9MRU5HVEgJICAgICBzaXplb2YoaW50KQorCisvKiBJZ29yJ3MgZmlybXdhcmUgY2Fubm90IHJlY29yZCBidXJzdHMgbG9uZ2VyIHRoYW4gMzYuICovCisjZGVmaW5lIERFVklDRV9CVUZMRU4JICAgMzYKKworLyoKKyAqIEhlYWRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZXZpY2UncyBidWZmZXI6CisgKgl1bnNpZ25lZCBjaGFyIGRhdGFfbGVuZ3RoCisgKgl1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnQgICAgKCE9MCBtZWFucyByaW5nLWJ1ZmZlciBvdmVycnVuKQorICoJdW5zaWduZWQgY2hhciBjb3VudGVyICAgICAgIChpbmNyZW1lbnRlZCBieSBlYWNoIGJ1cnN0KQorICovCisjZGVmaW5lIERFVklDRV9IRUFERVJMRU4JMworCisvKiBUaGlzIGlzIGZvciB0aGUgZ2FwICovCisjZGVmaW5lIEFERElUSU9OQUxfTElSQ19CWVRFUyAgIDIKKworLyogdGltZXMgdG8gcG9sbCBwZXIgc2Vjb25kICovCisjZGVmaW5lIFNBTVBMRV9SQVRFCSAgICAgMTAwCitzdGF0aWMgaW50IHNhbXBsZV9yYXRlID0gU0FNUExFX1JBVEU7CisKKworLyoqKiogSWdvcidzIFVTQiBSZXF1ZXN0IENvZGVzICovCisKKyNkZWZpbmUgU0VUX0lORlJBQlVGRkVSX0VNUFRZICAgMQorLyoqCisgKiBQYXJhbXM6IG5vbmUKKyAqIEFuc3dlcjogZW1wdHkKKyAqLworCisjZGVmaW5lIEdFVF9JTkZSQUNPREUJICAgMgorLyoqCisgKiBQYXJhbXM6CisgKiAgIHdWYWx1ZTogb2Zmc2V0IHRvIGJlZ2luIHJlYWRpbmcgaW5mcmEgYnVmZmVyCisgKgorICogQW5zd2VyOiBpbmZyYSBkYXRhCisgKi8KKworI2RlZmluZSBTRVRfREFUQVBPUlRfRElSRUNUSU9OICAzCisvKioKKyAqIFBhcmFtczoKKyAqICAgd1ZhbHVlOiAoYnl0ZSkgMSBiaXQgZm9yIGVhY2ggZGF0YSBwb3J0IHBpbiAoMD1pbiwgMT1vdXQpCisgKgorICogQW5zd2VyOiBlbXB0eQorICovCisKKyNkZWZpbmUgR0VUX0RBVEFQT1JUX0RJUkVDVElPTiAgNAorLyoqCisgKiBQYXJhbXM6IG5vbmUKKyAqCisgKiBBbnN3ZXI6IChieXRlKSAxIGJpdCBmb3IgZWFjaCBkYXRhIHBvcnQgcGluICgwPWluLCAxPW91dCkKKyAqLworCisjZGVmaW5lIFNFVF9PVVRfREFUQVBPUlQJNQorLyoqCisgKiBQYXJhbXM6CisgKiAgIHdWYWx1ZTogYnl0ZSB0byB3cml0ZSB0byBvdXRwdXQgZGF0YSBwb3J0CisgKgorICogQW5zd2VyOiBlbXB0eQorICovCisKKyNkZWZpbmUgR0VUX09VVF9EQVRBUE9SVAk2CisvKioKKyAqIFBhcmFtczogbm9uZQorICoKKyAqIEFuc3dlcjogbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIHJlYWQgZnJvbSBvdXRwdXQgZGF0YSBwb3J0CisgKi8KKworI2RlZmluZSBHRVRfSU5fREFUQVBPUlQJIDcKKy8qKgorICogUGFyYW1zOiBub25lCisgKgorICogQW5zd2VyOiBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgcmVhZCBmcm9tIGlucHV0IGRhdGEgcG9ydAorICovCisKKyNkZWZpbmUgUkVBRF9FRVBST00JICAgICA4CisvKioKKyAqIFBhcmFtczoKKyAqICAgd1ZhbHVlOiBvZmZzZXQgdG8gYmVnaW4gcmVhZGluZyBFRVBST00KKyAqCisgKiBBbnN3ZXI6IEVFUFJPTSBieXRlcworICovCisKKyNkZWZpbmUgV1JJVEVfRUVQUk9NCSAgICA5CisvKioKKyAqIFBhcmFtczoKKyAqICAgd1ZhbHVlOiBvZmZzZXQgdG8gRUVQUk9NIGJ5dGUKKyAqICAgd0luZGV4OiBieXRlIHRvIHdyaXRlCisgKgorICogQW5zd2VyOiBlbXB0eQorICovCisKKyNkZWZpbmUgU0VORF9SUzIzMgkgICAgICAxMAorLyoqCisgKiBQYXJhbXM6CisgKiAgIHdWYWx1ZTogYnl0ZSB0byBzZW5kCisgKgorICogQW5zd2VyOiBlbXB0eQorICovCisKKyNkZWZpbmUgUkVDVl9SUzIzMgkgICAgICAxMQorLyoqCisgKiBQYXJhbXM6IG5vbmUKKyAqCisgKiBBbnN3ZXI6IGJ5dGUgcmVjZWl2ZWQKKyAqLworCisjZGVmaW5lIFNFVF9SUzIzMl9CQVVECSAgMTIKKy8qKgorICogUGFyYW1zOgorICogICB3VmFsdWU6IGJ5dGUgdG8gd3JpdGUgdG8gVUFSVCBiaXQgcmF0ZSByZWdpc3RlciAoVUJSUikKKyAqCisgKiBBbnN3ZXI6IGVtcHR5CisgKi8KKworI2RlZmluZSBHRVRfUlMyMzJfQkFVRAkgIDEzCisvKioKKyAqIFBhcmFtczogbm9uZQorICoKKyAqIEFuc3dlcjogYnl0ZSByZWFkIGZyb20gVUFSVCBiaXQgcmF0ZSByZWdpc3RlciAoVUJSUikKKyAqLworCisKKy8qIGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIHVzYiByZW1vdGUgKi8KK3N0cnVjdCBpZ29ycGx1ZyB7CisKKwkvKiB1c2IgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCB1cmIgKnVyYl9pbjsKKwlpbnQgZGV2bnVtOworCisJdW5zaWduZWQgY2hhciAqYnVmX2luOworCXVuc2lnbmVkIGludCBsZW5faW47CisJaW50IGluX3NwYWNlOworCXN0cnVjdCB0aW1ldmFsIGxhc3RfdGltZTsKKworCWRtYV9hZGRyX3QgZG1hX2luOworCisJLyogbGlyYyAqLworCXN0cnVjdCBsaXJjX2RyaXZlciAqZDsKKworCS8qIGhhbmRsZSBzZW5kaW5nIChpbml0IHN0cmluZ3MpICovCisJaW50IHNlbmRfZmxhZ3M7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9vdXQ7Cit9OworCitzdGF0aWMgaW50IHVucmVnaXN0ZXJfZnJvbV9saXJjKHN0cnVjdCBpZ29ycGx1ZyAqaXIpCit7CisJc3RydWN0IGxpcmNfZHJpdmVyICpkID0gaXItPmQ7CisJaW50IGRldm51bTsKKworCWlmICghaXItPmQpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2bnVtID0gaXItPmRldm51bTsKKwlkcHJpbnRrKERSSVZFUl9OQU1FICJbJWRdOiB1bnJlZ2lzdGVyIGZyb20gbGlyYyBjYWxsZWRcbiIsIGRldm51bSk7CisKKwlsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKGQtPm1pbm9yKTsKKworCXByaW50ayhEUklWRVJfTkFNRSAiWyVkXTogdXNiIHJlbW90ZSBkaXNjb25uZWN0ZWRcbiIsIGRldm51bSk7CisKKwlrZnJlZShkKTsKKwlpci0+ZCA9IE5VTEw7CisJa2ZyZWUoaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF91c2VfaW5jKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlnb3JwbHVnICppciA9IGRhdGE7CisKKwlpZiAoIWlyKSB7CisJCXByaW50ayhEUklWRVJfTkFNRSAiWz9dOiBzZXRfdXNlX2luYyBjYWxsZWQgd2l0aCBubyBjb250ZXh0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRwcmludGsoRFJJVkVSX05BTUUgIlslZF06IHNldCB1c2UgaW5jXG4iLCBpci0+ZGV2bnVtKTsKKworCWlmICghaXItPnVzYmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3VzZV9kZWModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWdvcnBsdWcgKmlyID0gZGF0YTsKKworCWlmICghaXIpIHsKKwkJcHJpbnRrKERSSVZFUl9OQU1FICJbP106IHNldF91c2VfZGVjIGNhbGxlZCB3aXRoIG5vIGNvbnRleHRcbiIpOworCQlyZXR1cm47CisJfQorCWRwcmludGsoRFJJVkVSX05BTUUgIlslZF06IHNldCB1c2UgZGVjXG4iLCBpci0+ZGV2bnVtKTsKK30KKworCisvKioKKyAqIENhbGxlZCBpbiB1c2VyIGNvbnRleHQuCisgKiByZXR1cm4gMCBpZiBkYXRhIHdhcyBhZGRlZCB0byB0aGUgYnVmZmVyIGFuZAorICogLUVOT0RBVEEgaWYgbm9uZSB3YXMgYXZhaWxhYmxlLiBUaGlzIHNob3VsZCBhZGQgc29tZSBudW1iZXIgb2YgYml0cworICogZXZlbmx5IGRpdmlzaWJsZSBieSBjb2RlX2xlbmd0aCB0byB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgdXNiX3JlbW90ZV9wb2xsKHZvaWQgKmRhdGEsIHN0cnVjdCBsaXJjX2J1ZmZlciAqYnVmKQoreworCWludCByZXQ7CisJc3RydWN0IGlnb3JwbHVnICppciA9IChzdHJ1Y3QgaWdvcnBsdWcgKilkYXRhOworCisJaWYgKCFpci0+dXNiZGV2KSAgLyogSGFzIHRoZSBkZXZpY2UgYmVlbiByZW1vdmVkPyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKworCW1lbXNldChpci0+YnVmX2luLCAwLCBpci0+bGVuX2luKTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZygKKwkgICAgICBpci0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUoaXItPnVzYmRldiwgMCksCisJICAgICAgR0VUX0lORlJBQ09ERSwgVVNCX1RZUEVfVkVORE9SfFVTQl9ESVJfSU4sCisJICAgICAgMC8qIG9mZnNldCAqLywgLyp1bnVzZWQqLzAsCisJICAgICAgaXItPmJ1Zl9pbiwgaXItPmxlbl9pbiwKKwkgICAgICAvKnRpbWVvdXQqL0haICogVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCWlmIChyZXQgPiAwKSB7CisJCWludCBpID0gREVWSUNFX0hFQURFUkxFTjsKKwkJaW50IGNvZGUsIHRpbWVkaWZmOworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwkJaWYgKHJldCA8PSAxKSAgLyogQUNLIHBhY2tldCBoYXMgMSBieXRlIC0tPiBpZ25vcmUgKi8KKwkJCXJldHVybiAtRU5PREFUQTsKKworCQlkcHJpbnRrKERSSVZFUl9OQU1FICI6IEdvdCAlZCBieXRlcy4gSGVhZGVyOiAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCXJldCwgaXItPmJ1Zl9pblswXSwgaXItPmJ1Zl9pblsxXSwgaXItPmJ1Zl9pblsyXSk7CisKKwkJaWYgKGlyLT5idWZfaW5bMl0gIT0gMCkgeworCQkJcHJpbnRrKERSSVZFUl9OQU1FICJbJWRdOiBEZXZpY2UgYnVmZmVyIG92ZXJydW4uXG4iLAorCQkJCWlyLT5kZXZudW0pOworCQkJLyogc3RhcnQgYXQgZWFybGllc3QgYnl0ZSAqLworCQkJaSA9IERFVklDRV9IRUFERVJMRU4gKyBpci0+YnVmX2luWzJdOworCQkJLyogd2hlcmUgYXJlIHdlIG5vdz8gc3BhY2UsIGdhcCBvciBwdWxzZT8gKi8KKwkJfQorCisJCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwkJdGltZWRpZmYgPSBub3cudHZfc2VjIC0gaXItPmxhc3RfdGltZS50dl9zZWM7CisJCWlmICh0aW1lZGlmZiArIDEgPiBQVUxTRV9NQVNLIC8gMTAwMDAwMCkKKwkJCXRpbWVkaWZmID0gUFVMU0VfTUFTSzsKKwkJZWxzZSB7CisJCQl0aW1lZGlmZiAqPSAxMDAwMDAwOworCQkJdGltZWRpZmYgKz0gbm93LnR2X3VzZWMgLSBpci0+bGFzdF90aW1lLnR2X3VzZWM7CisJCX0KKwkJaXItPmxhc3RfdGltZS50dl9zZWMgPSBub3cudHZfc2VjOworCQlpci0+bGFzdF90aW1lLnR2X3VzZWMgPSBub3cudHZfdXNlYzsKKworCQkvKiBjcmVhdGUgbGVhZGluZyBnYXAgICovCisJCWNvZGUgPSB0aW1lZGlmZjsKKwkJbGlyY19idWZmZXJfd3JpdGUoYnVmLCAodW5zaWduZWQgY2hhciAqKSZjb2RlKTsKKwkJaXItPmluX3NwYWNlID0gMTsgICAvKiBuZXh0IGNvbWVzIGEgcHVsc2UgKi8KKworCQkvKiBNT0RFMjogcHVsc2Uvc3BhY2UgKFBVTFNFX0JJVCkgaW4gMXVzIHVuaXRzICovCisKKwkJd2hpbGUgKGkgPCByZXQpIHsKKwkJCS8qIDEgSWdvci10aWNrID0gODUuMzMzMzMzIHVzICovCisJCQljb2RlID0gKHVuc2lnbmVkIGludClpci0+YnVmX2luW2ldICogODUKKwkJCQkrICh1bnNpZ25lZCBpbnQpaXItPmJ1Zl9pbltpXSAvIDM7CisJCQlpZiAoaXItPmluX3NwYWNlKQorCQkJCWNvZGUgfD0gUFVMU0VfQklUOworCQkJbGlyY19idWZmZXJfd3JpdGUoYnVmLCAodW5zaWduZWQgY2hhciAqKSZjb2RlKTsKKwkJCS8qIDEgY2h1bmsgPSBDT0RFX0xFTkdUSCBieXRlcyAqLworCQkJaXItPmluX3NwYWNlIF49IDE7CisJCQkrK2k7CisJCX0KKworCQlyZXQgPSB1c2JfY29udHJvbF9tc2coCisJCSAgICAgIGlyLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShpci0+dXNiZGV2LCAwKSwKKwkJICAgICAgU0VUX0lORlJBQlVGRkVSX0VNUFRZLCBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9JTiwKKwkJICAgICAgLyp1bnVzZWQqLzAsIC8qdW51c2VkKi8wLAorCQkgICAgICAvKmR1bW15Ki9pci0+YnVmX2luLCAvKmR1bW15Ki9pci0+bGVuX2luLAorCQkgICAgICAvKnRpbWVvdXQqL0haICogVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50ayhEUklWRVJfTkFNRSAiWyVkXTogU0VUX0lORlJBQlVGRkVSX0VNUFRZOiAiCisJCQkgICAgICAgImVycm9yICVkXG4iLCBpci0+ZGV2bnVtLCByZXQpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHJldCA8IDApCisJCXByaW50ayhEUklWRVJfTkFNRSAiWyVkXTogR0VUX0lORlJBQ09ERTogZXJyb3IgJWRcbiIsCisJCQlpci0+ZGV2bnVtLCByZXQpOworCisJcmV0dXJuIC1FTk9EQVRBOworfQorCisKKworc3RhdGljIGludCB1c2JfcmVtb3RlX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZGVzYyA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcF9jdGwyOworCXN0cnVjdCBpZ29ycGx1ZyAqaXIgPSBOVUxMOworCXN0cnVjdCBsaXJjX2RyaXZlciAqZHJpdmVyID0gTlVMTDsKKwlpbnQgZGV2bnVtLCBwaXBlLCBtYXhwOworCWludCBtaW5vciA9IDA7CisJY2hhciBidWZbNjNdLCBuYW1lWzEyOF0gPSAiIjsKKwlpbnQgbWVtX2ZhaWx1cmUgPSAwOworCWludCByZXQ7CisKKwlkcHJpbnRrKERSSVZFUl9OQU1FICI6IHVzYiBwcm9iZSBjYWxsZWQuXG4iKTsKKworCWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlpZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGlkZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZXBfY3RsMiA9IGlkZXNjLT5lbmRwb2ludDsKKwlpZiAoKChlcF9jdGwyLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisJICAgICE9IFVTQl9ESVJfSU4pCisJICAgIHx8IChlcF9jdGwyLT5kZXNjLmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQorCSAgICAhPSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwaXBlID0gdXNiX3JjdmN0cmxwaXBlKGRldiwgZXBfY3RsMi0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKKwlkZXZudW0gPSBkZXYtPmRldm51bTsKKwltYXhwID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCWRwcmludGsoRFJJVkVSX05BTUUgIlslZF06IGJ5dGVzX2luX2tleT0lbHUgbWF4cD0lZFxuIiwKKwkJZGV2bnVtLCBDT0RFX0xFTkdUSCwgbWF4cCk7CisKKworCW1lbV9mYWlsdXJlID0gMDsKKwlpciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZ29ycGx1ZyksIEdGUF9LRVJORUwpOworCWlmICghaXIpIHsKKwkJbWVtX2ZhaWx1cmUgPSAxOworCQlnb3RvIG1lbV9mYWlsdXJlX3N3aXRjaDsKKwl9CisJZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcml2ZXIpIHsKKwkJbWVtX2ZhaWx1cmUgPSAyOworCQlnb3RvIG1lbV9mYWlsdXJlX3N3aXRjaDsKKwl9CisKKwlpci0+YnVmX2luID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldiwKKwkJCSAgICAgIERFVklDRV9CVUZMRU4rREVWSUNFX0hFQURFUkxFTiwKKwkJCSAgICAgIEdGUF9BVE9NSUMsICZpci0+ZG1hX2luKTsKKwlpZiAoIWlyLT5idWZfaW4pIHsKKwkJbWVtX2ZhaWx1cmUgPSAzOworCQlnb3RvIG1lbV9mYWlsdXJlX3N3aXRjaDsKKwl9CisKKwlzdHJjcHkoZHJpdmVyLT5uYW1lLCBEUklWRVJfTkFNRSAiICIpOworCWRyaXZlci0+bWlub3IgPSAtMTsKKwlkcml2ZXItPmNvZGVfbGVuZ3RoID0gQ09ERV9MRU5HVEggKiA4OyAvKiBpbiBiaXRzICovCisJZHJpdmVyLT5mZWF0dXJlcyA9IExJUkNfQ0FOX1JFQ19NT0RFMjsKKwlkcml2ZXItPmRhdGEgPSBpcjsKKwlkcml2ZXItPmNodW5rX3NpemUgPSBDT0RFX0xFTkdUSDsKKwlkcml2ZXItPmJ1ZmZlcl9zaXplID0gREVWSUNFX0JVRkxFTiArIEFERElUSU9OQUxfTElSQ19CWVRFUzsKKwlkcml2ZXItPnNldF91c2VfaW5jID0gJnNldF91c2VfaW5jOworCWRyaXZlci0+c2V0X3VzZV9kZWMgPSAmc2V0X3VzZV9kZWM7CisJZHJpdmVyLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOyAgICAvKiBwZXIgc2Vjb25kICovCisJZHJpdmVyLT5hZGRfdG9fYnVmID0gJnVzYl9yZW1vdGVfcG9sbDsKKwlkcml2ZXItPmRldiA9ICZpbnRmLT5kZXY7CisJZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXItPndhaXRfb3V0KTsKKworCW1pbm9yID0gbGlyY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsKKwlpZiAobWlub3IgPCAwKQorCQltZW1fZmFpbHVyZSA9IDk7CisKK21lbV9mYWlsdXJlX3N3aXRjaDoKKworCXN3aXRjaCAobWVtX2ZhaWx1cmUpIHsKKwljYXNlIDk6CisJCXVzYl9mcmVlX2NvaGVyZW50KGRldiwgREVWSUNFX0JVRkxFTitERVZJQ0VfSEVBREVSTEVOLAorCQkJaXItPmJ1Zl9pbiwgaXItPmRtYV9pbik7CisJY2FzZSAzOgorCQlrZnJlZShkcml2ZXIpOworCWNhc2UgMjoKKwkJa2ZyZWUoaXIpOworCWNhc2UgMToKKwkJcHJpbnRrKERSSVZFUl9OQU1FICJbJWRdOiBvdXQgb2YgbWVtb3J5IChjb2RlPSVkKVxuIiwKKwkJCWRldm51bSwgbWVtX2ZhaWx1cmUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkcml2ZXItPm1pbm9yID0gbWlub3I7CisJaXItPmQgPSBkcml2ZXI7CisJaXItPmRldm51bSA9IGRldm51bTsKKwlpci0+dXNiZGV2ID0gZGV2OworCWlyLT5sZW5faW4gPSBERVZJQ0VfQlVGTEVOK0RFVklDRV9IRUFERVJMRU47CisJaXItPmluX3NwYWNlID0gMTsgLyogRmlyc3QgbW9kZTIgZXZlbnQgaXMgYSBzcGFjZS4gKi8KKwlkb19nZXR0aW1lb2ZkYXkoJmlyLT5sYXN0X3RpbWUpOworCisJaWYgKGRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyCisJICAgICYmIHVzYl9zdHJpbmcoZGV2LCBkZXYtPmRlc2NyaXB0b3IuaU1hbnVmYWN0dXJlciwKKwkJCSAgYnVmLCBzaXplb2YoYnVmKSkgPiAwKQorCQlzdHJsY3B5KG5hbWUsIGJ1Ziwgc2l6ZW9mKG5hbWUpKTsKKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0CisJICAgICYmIHVzYl9zdHJpbmcoZGV2LCBkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID4gMCkKKwkJc25wcmludGYobmFtZSArIHN0cmxlbihuYW1lKSwgc2l6ZW9mKG5hbWUpIC0gc3RybGVuKG5hbWUpLAorCQkJICIgJXMiLCBidWYpOworCXByaW50ayhEUklWRVJfTkFNRSAiWyVkXTogJXMgb24gdXNiJWQ6JWRcbiIsIGRldm51bSwgbmFtZSwKKwkgICAgICAgZGV2LT5idXMtPmJ1c251bSwgZGV2bnVtKTsKKworCS8qIGNsZWFyIGRldmljZSBidWZmZXIgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2coaXItPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKGlyLT51c2JkZXYsIDApLAorCQlTRVRfSU5GUkFCVUZGRVJfRU1QVFksIFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX0lOLAorCQkvKnVudXNlZCovMCwgLyp1bnVzZWQqLzAsCisJCS8qZHVtbXkqL2lyLT5idWZfaW4sIC8qZHVtbXkqL2lyLT5sZW5faW4sCisJCS8qdGltZW91dCovSFogKiBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCXByaW50ayhEUklWRVJfTkFNRSAiWyVkXTogU0VUX0lORlJBQlVGRkVSX0VNUFRZOiBlcnJvciAlZFxuIiwKKwkJCWRldm51bSwgcmV0KTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaXIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHVzYl9yZW1vdGVfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgaWdvcnBsdWcgKmlyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJaWYgKCFpciB8fCAhaXItPmQpCisJCXJldHVybjsKKworCWlyLT51c2JkZXYgPSBOVUxMOworCXdha2VfdXBfYWxsKCZpci0+d2FpdF9vdXQpOworCisJdXNiX2ZyZWVfY29oZXJlbnQoZGV2LCBpci0+bGVuX2luLCBpci0+YnVmX2luLCBpci0+ZG1hX2luKTsKKworCXVucmVnaXN0ZXJfZnJvbV9saXJjKGlyKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9yZW1vdGVfaWRfdGFibGVbXSA9IHsKKwkvKiBJZ29yIFBsdWcgVVNCIChBdG1lbCdzIE1hbnVmYWN0LiBJRCkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDAwMDIpIH0sCisKKwkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl9yZW1vdGVfZHJpdmVyID0geworCS5uYW1lID0JCURSSVZFUl9OQU1FLAorCS5wcm9iZSA9CXVzYl9yZW1vdGVfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JfcmVtb3RlX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JdXNiX3JlbW90ZV9pZF90YWJsZQorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX3JlbW90ZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIKKwkgICAgICAgRFJJVkVSX05BTUUgIjogIiBEUklWRVJfREVTQyAiIHYiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCXByaW50ayhEUklWRVJfTkFNRSAiOiAiIERSSVZFUl9BVVRIT1IgIlxuIik7CisJZHByaW50ayhEUklWRVJfTkFNRSAiOiBkZWJ1ZyBtb2RlIGVuYWJsZWRcbiIpOworCisJaSA9IHVzYl9yZWdpc3RlcigmdXNiX3JlbW90ZV9kcml2ZXIpOworCWlmIChpIDwgMCkgeworCQlwcmludGsoRFJJVkVSX05BTUUgIjogdXNiIHJlZ2lzdGVyIGZhaWxlZCwgcmVzdWx0ID0gJWRcbiIsIGkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVzYl9yZW1vdGVfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfcmVtb3RlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYl9yZW1vdGVfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfcmVtb3RlX2V4aXQpOworCisjaW5jbHVkZSA8bGludXgvdmVybWFnaWMuaD4KK01PRFVMRV9JTkZPKHZlcm1hZ2ljLCBWRVJNQUdJQ19TVFJJTkcpOworCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JfcmVtb3RlX2lkX3RhYmxlKTsKKworbW9kdWxlX3BhcmFtKHNhbXBsZV9yYXRlLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Moc2FtcGxlX3JhdGUsICJTYW1wbGluZyByYXRlIGluIEh6IChkZWZhdWx0OiAxMDApIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0OTMyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaW1vbi5jCkBAIC0wLDAgKzEsMTA1OCBAQAorLyoKKyAqICAgbGlyY19pbW9uLmM6ICBMSVJDL1ZGRC9MQ0QgZHJpdmVyIGZvciBTb3VuZEdyYXBoIGlNT04gSVIvVkZEL0xDRAorICoJCSAgIGluY2x1ZGluZyB0aGUgaU1PTiBQQUQgbW9kZWwKKyAqCisgKiAgIENvcHlyaWdodChDKSAyMDA0ICBWZW5reSBSYWp1KGRldkB2ZW5reS53cykKKyAqICAgQ29weXJpZ2h0KEMpIDIwMDkgIEphcm9kIFdpbHNvbiA8amFyb2RAd2lsc29uZXQuY29tPgorICoKKyAqICAgbGlyY19pbW9uIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPG1lZGlhL2xpcmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgorCisKKyNkZWZpbmUgTU9EX0FVVEhPUgkiVmVua3kgUmFqdSA8ZGV2QHZlbmt5LndzPiIKKyNkZWZpbmUgTU9EX0RFU0MJIkRyaXZlciBmb3IgU291bmRHcmFwaCBpTU9OIE11bHRpTWVkaWEgSVIvRGlzcGxheSIKKyNkZWZpbmUgTU9EX05BTUUJImxpcmNfaW1vbiIKKyNkZWZpbmUgTU9EX1ZFUlNJT04JIjAuOCIKKworI2RlZmluZSBESVNQTEFZX01JTk9SX0JBU0UJMTQ0CisjZGVmaW5lIERFVklDRV9OQU1FCSJsY2QlZCIKKworI2RlZmluZSBCVUZfQ0hVTktfU0laRQk0CisjZGVmaW5lIEJVRl9TSVpFCTEyOAorCisjZGVmaW5lIEJJVF9EVVJBVElPTgkyNTAJLyogZWFjaCBiaXQgcmVjZWl2ZWQgaXMgMjUwdXMgKi8KKworLyoqKiBQIFIgTyBUIE8gVCBZIFAgRSBTICoqKi8KKworLyogVVNCIENhbGxiYWNrIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgaW1vbl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgaW1vbl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworc3RhdGljIHZvaWQgdXNiX3J4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCB1c2JfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKKworLyogc3VzcGVuZC9yZXN1bWUgc3VwcG9ydCAqLworc3RhdGljIGludCBpbW9uX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgaW50IGltb25fc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOworCisvKiBEaXNwbGF5IGZpbGVfb3BlcmF0aW9ucyBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IGRpc3BsYXlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGRpc3BsYXlfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCisvKiBWRkQgd3JpdGUgb3BlcmF0aW9uICovCitzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSBzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpOworCisvKiBMSVJDIGRyaXZlciBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IGlyX29wZW4odm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBpcl9jbG9zZSh2b2lkICpkYXRhKTsKKworLyogRHJpdmVyIGluaXQvZXhpdCBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IF9faW5pdCBpbW9uX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgaW1vbl9leGl0KHZvaWQpOworCisvKioqIEcgTCBPIEIgQSBMIFMgKioqLworI2RlZmluZSBJTU9OX0RBVEFfQlVGX1NaCTM1CisKK3N0cnVjdCBpbW9uX2NvbnRleHQgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJLyogTmV3ZXIgZGV2aWNlcyBoYXZlIHR3byBpbnRlcmZhY2VzICovCisJaW50IGRpc3BsYXk7CQkJLyogbm90IGFsbCBjb250cm9sbGVycyBkbyAqLworCWludCBkaXNwbGF5X2lzb3BlbjsJCS8qIGRpc3BsYXkgcG9ydCBoYXMgYmVlbiBvcGVuZWQgKi8KKwlpbnQgaXJfaXNvcGVuOwkJCS8qIElSIHBvcnQgb3BlbgkqLworCWludCBkZXZfcHJlc2VudDsJCS8qIFVTQiBkZXZpY2UgcHJlc2VuY2UgKi8KKwlzdHJ1Y3QgbXV0ZXggY3R4X2xvY2s7CQkvKiB0byBsb2NrIHRoaXMgb2JqZWN0ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVtb3ZlX29rOwkvKiBGb3IgdW5leHBlY3RlZCBVU0IgZGlzY29ubmVjdHMgKi8KKworCWludCB2ZmRfcHJvdG9fNnA7CQkvKiBzb21lIFZGRCByZXF1aXJlIGEgNnRoIHBhY2tldCAqLworCisJc3RydWN0IGxpcmNfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpyeF9lbmRwb2ludDsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKnR4X2VuZHBvaW50OworCXN0cnVjdCB1cmIgKnJ4X3VyYjsKKwlzdHJ1Y3QgdXJiICp0eF91cmI7CisJdW5zaWduZWQgY2hhciB1c2JfcnhfYnVmWzhdOworCXVuc2lnbmVkIGNoYXIgdXNiX3R4X2J1Zls4XTsKKworCXN0cnVjdCByeF9kYXRhIHsKKwkJaW50IGNvdW50OwkJLyogbGVuZ3RoIG9mIDAgb3IgMSBzZXF1ZW5jZSAqLworCQlpbnQgcHJldl9iaXQ7CQkvKiBsb2dpYyBsZXZlbCBvZiBzZXF1ZW5jZSAqLworCQlpbnQgaW5pdGlhbF9zcGFjZTsJLyogaW5pdGlhbCBzcGFjZSBmbGFnICovCisJfSByeDsKKworCXN0cnVjdCB0eF90IHsKKwkJdW5zaWduZWQgY2hhciBkYXRhX2J1ZltJTU9OX0RBVEFfQlVGX1NaXTsgLyogdXNlciBkYXRhIGJ1ZmZlciAqLworCQlzdHJ1Y3QgY29tcGxldGlvbiBmaW5pc2hlZDsJLyogd2FpdCBmb3Igd3JpdGUgdG8gZmluaXNoICovCisJCWF0b21pY190IGJ1c3k7CQkJLyogd3JpdGUgaW4gcHJvZ3Jlc3MgKi8KKwkJaW50IHN0YXR1czsJCQkvKiBzdGF0dXMgb2YgdHggY29tcGxldGlvbiAqLworCX0gdHg7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkaXNwbGF5X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9ICZkaXNwbGF5X29wZW4sCisJLndyaXRlCQk9ICZ2ZmRfd3JpdGUsCisJLnJlbGVhc2UJPSAmZGlzcGxheV9jbG9zZQorfTsKKworLyoKKyAqIFVTQiBEZXZpY2UgSUQgZm9yIGlNT04gVVNCIENvbnRyb2wgQm9hcmRzCisgKgorICogVGhlIFdpbmRvd3MgZHJpdmVycyBjb250YWluIDYgZGlmZmVyZW50IGluZiBmaWxlcywgbW9yZSBvciBsZXNzIG9uZSBmb3IKKyAqIGVhY2ggbmV3IGRldmljZSB1bnRpbCB0aGUgMHgwMDM0LTB4MDA0NiBkZXZpY2VzLCB3aGljaCBhbGwgdXNlIHRoZSBzYW1lCisgKiBkcml2ZXIuIFNvbWUgb2YgdGhlIGRldmljZXMgaW4gdGhlIDM0LTQ2IHJhbmdlIGhhdmVuJ3QgYmVlbiBkZWZpbml0aXZlbHkKKyAqIGlkZW50aWZpZWQgeWV0LiBFYXJseSBkZXZpY2VzIGhhdmUgZWl0aGVyIGEgVHJpR2VtIENvbXB1dGVyLCBJbmMuIG9yIGEKKyAqIFNhbXN1bmcgdmVuZG9yIElEICgweDBhYTggYW5kIDB4MDRlOCByZXNwZWN0aXZlbHkpLCB3aGlsZSBhbGwgbGF0ZXIKKyAqIGRldmljZXMgdXNlIHRoZSBTb3VuZEdyYXBoIHZlbmRvciBJRCAoMHgxNWMyKS4KKyAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGltb25fdXNiX2lkX3RhYmxlW10gPSB7CisJLyogVHJpR2VtIGlNT04gKElSIG9ubHkpIC0tIFRHX2lNT04uaW5mICovCisJeyBVU0JfREVWSUNFKDB4MGFhOCwgMHg4MDAxKSB9LAorCisJLyogU291bmRHcmFwaCBpTU9OIChJUiBvbmx5KSAtLSBzZ19pbW9uLmluZiAqLworCXsgVVNCX0RFVklDRSgweDA0ZTgsIDB4ZmYzMCkgfSwKKworCS8qIFNvdW5kR3JhcGggaU1PTiBWRkQgKElSICYgVkZEKSAtLSBpTU9OX1ZGRC5pbmYgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwYWE4LCAweGZmZGEpIH0sCisKKwkvKiBTb3VuZEdyYXBoIGlNT04gU1MgKElSICYgVkZEKSAtLSBpTU9OX1NTLmluZiAqLworCXsgVVNCX0RFVklDRSgweDE1YzIsIDB4ZmZkYSkgfSwKKworCXt9Cit9OworCisvKiBTb21lIGlNT04gVkZEIG1vZGVscyByZXF1aXJlcyBhIDZ0aCBwYWNrZXQgZm9yIFZGRCB3cml0ZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB2ZmRfcHJvdG9fNnBfbGlzdFtdID0geworCXsgVVNCX0RFVklDRSgweDE1YzIsIDB4ZmZkYSkgfSwKKwl7fQorfTsKKworLyogU29tZSBpTU9OIGRldmljZXMgaGF2ZSBubyBsY2QvdmZkLCBkb24ndCBzZXQgb25lIHVwICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaXJfb25seV9saXN0W10gPSB7CisJeyBVU0JfREVWSUNFKDB4MGFhOCwgMHg4MDAxKSB9LAorCXsgVVNCX0RFVklDRSgweDA0ZTgsIDB4ZmYzMCkgfSwKKwl7fQorfTsKKworLyogVVNCIERldmljZSBkYXRhICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaW1vbl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gTU9EX05BTUUsCisJLnByb2JlCQk9IGltb25fcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBpbW9uX2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQJPSBpbW9uX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpbW9uX3Jlc3VtZSwKKwkuaWRfdGFibGUJPSBpbW9uX3VzYl9pZF90YWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBpbW9uX2NsYXNzID0geworCS5uYW1lCQk9IERFVklDRV9OQU1FLAorCS5mb3BzCQk9ICZkaXNwbGF5X2ZvcHMsCisJLm1pbm9yX2Jhc2UJPSBESVNQTEFZX01JTk9SX0JBU0UsCit9OworCisvKiB0byBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCksIHByb2JpbmcsIGV0YyAqLworc3RhdGljIERFRklORV9NVVRFWChkcml2ZXJfbG9jayk7CisKK3N0YXRpYyBpbnQgZGVidWc7CisKKy8qKiogIE0gTyBEIFUgTCBFICAgQyBPIEQgRSAqKiovCisKK01PRFVMRV9BVVRIT1IoTU9EX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oTU9EX0RFU0MpOworTU9EVUxFX1ZFUlNJT04oTU9EX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGltb25fdXNiX2lkX3RhYmxlKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbWVzc2FnZXM6IDA9bm8sIDE9eWVzKGRlZmF1bHQ6IG5vKSIpOworCitzdGF0aWMgdm9pZCBmcmVlX2ltb25fY29udGV4dChzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQtPmRyaXZlci0+ZGV2OworCXVzYl9mcmVlX3VyYihjb250ZXh0LT50eF91cmIpOworCXVzYl9mcmVlX3VyYihjb250ZXh0LT5yeF91cmIpOworCWxpcmNfYnVmZmVyX2ZyZWUoY29udGV4dC0+ZHJpdmVyLT5yYnVmKTsKKwlrZnJlZShjb250ZXh0LT5kcml2ZXItPnJidWYpOworCWtmcmVlKGNvbnRleHQtPmRyaXZlcik7CisJa2ZyZWUoY29udGV4dCk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBpTU9OIGNvbnRleHQgZnJlZWRcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgZGVyZWdpc3Rlcl9mcm9tX2xpcmMoc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dCkKK3sKKwlpbnQgcmV0dmFsOworCWludCBtaW5vciA9IGNvbnRleHQtPmRyaXZlci0+bWlub3I7CisKKwlyZXR2YWwgPSBsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKG1pbm9yKTsKKwlpZiAocmV0dmFsKQorCQllcnIoIiVzOiB1bmFibGUgdG8gZGVyZWdpc3RlciBmcm9tIGxpcmMoJWQpIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyBNT0RfTkFNRSAiOiBEZXJlZ2lzdGVyZWQgaU1PTiBkcml2ZXIgIgorCQkgICAgICAgIihtaW5vcjolZClcbiIsIG1pbm9yKTsKKworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBEaXNwbGF5IGRldmljZSAoZS5nLiAvZGV2L2xjZDApCisgKiBpcyBvcGVuZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICovCitzdGF0aWMgaW50IGRpc3BsYXlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCWludCBzdWJtaW5vcjsKKwlpbnQgcmV0dmFsID0gMDsKKworCS8qIHByZXZlbnQgcmFjZXMgd2l0aCBkaXNjb25uZWN0ICovCisJbXV0ZXhfbG9jaygmZHJpdmVyX2xvY2spOworCisJc3VibWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmaW1vbl9kcml2ZXIsIHN1Ym1pbm9yKTsKKwlpZiAoIWludGVyZmFjZSkgeworCQllcnIoIiVzOiBjb3VsZCBub3QgZmluZCBpbnRlcmZhY2UgZm9yIG1pbm9yICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisJY29udGV4dCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICghY29udGV4dCkgeworCQllcnIoIiVzOiBubyBjb250ZXh0IGZvdW5kIGZvciBtaW5vciAlZCIsCisJCQkJCV9fZnVuY19fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwlpZiAoIWNvbnRleHQtPmRpc3BsYXkpIHsKKwkJZXJyKCIlczogZGlzcGxheSBub3Qgc3VwcG9ydGVkIGJ5IGRldmljZSIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwl9IGVsc2UgaWYgKGNvbnRleHQtPmRpc3BsYXlfaXNvcGVuKSB7CisJCWVycigiJXM6IGRpc3BsYXkgcG9ydCBpcyBhbHJlYWR5IG9wZW4iLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQljb250ZXh0LT5kaXNwbGF5X2lzb3BlbiA9IDE7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNvbnRleHQ7CisJCWRldl9pbmZvKGNvbnRleHQtPmRyaXZlci0+ZGV2LCAiZGlzcGxheSBwb3J0IG9wZW5lZFxuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgZGlzcGxheSBkZXZpY2UgKGUuZy4gL2Rldi9sY2QwKQorICogaXMgY2xvc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAqLworc3RhdGljIGludCBkaXNwbGF5X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCisJY29udGV4dCA9IChzdHJ1Y3QgaW1vbl9jb250ZXh0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjb250ZXh0KSB7CisJCWVycigiJXM6IG5vIGNvbnRleHQgZm9yIGRldmljZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXV0ZXhfbG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJaWYgKCFjb250ZXh0LT5kaXNwbGF5KSB7CisJCWVycigiJXM6IGRpc3BsYXkgbm90IHN1cHBvcnRlZCBieSBkZXZpY2UiLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJfSBlbHNlIGlmICghY29udGV4dC0+ZGlzcGxheV9pc29wZW4pIHsKKwkJZXJyKCIlczogZGlzcGxheSBpcyBub3Qgb3BlbiIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVJTzsKKwl9IGVsc2UgeworCQljb250ZXh0LT5kaXNwbGF5X2lzb3BlbiA9IDA7CisJCWRldl9pbmZvKGNvbnRleHQtPmRyaXZlci0+ZGV2LCAiZGlzcGxheSBwb3J0IGNsb3NlZFxuIik7CisJCWlmICghY29udGV4dC0+ZGV2X3ByZXNlbnQgJiYgIWNvbnRleHQtPmlyX2lzb3BlbikgeworCQkJLyoKKwkJCSAqIERldmljZSBkaXNjb25uZWN0ZWQgYmVmb3JlIGNsb3NlIGFuZCBJUiBwb3J0IGlzIG5vdAorCQkJICogb3Blbi4gSWYgSVIgcG9ydCBpcyBvcGVuLCBjb250ZXh0IHdpbGwgYmUgZGVsZXRlZCBieQorCQkJICogaXJfY2xvc2UuCisJCQkgKi8KKwkJCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCQkJZnJlZV9pbW9uX2NvbnRleHQoY29udGV4dCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZW5kcyBhIHBhY2tldCB0byB0aGUgZGV2aWNlIC0tIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAqIHdpdGggY29udGV4dC0+Y3R4X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBzZW5kX3BhY2tldChzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBwaXBlOworCWludCBpbnRlcnZhbCA9IDA7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY29udHJvbF9yZXEgPSBOVUxMOworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byB1c2UgY29udHJvbCBvciBpbnRlcnJ1cHQgdXJiICovCisJcGlwZSA9IHVzYl9zbmRpbnRwaXBlKGNvbnRleHQtPnVzYmRldiwKKwkJCSAgICAgIGNvbnRleHQtPnR4X2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwlpbnRlcnZhbCA9IGNvbnRleHQtPnR4X2VuZHBvaW50LT5iSW50ZXJ2YWw7CisKKwl1c2JfZmlsbF9pbnRfdXJiKGNvbnRleHQtPnR4X3VyYiwgY29udGV4dC0+dXNiZGV2LCBwaXBlLAorCQkJIGNvbnRleHQtPnVzYl90eF9idWYsCisJCQkgc2l6ZW9mKGNvbnRleHQtPnVzYl90eF9idWYpLAorCQkJIHVzYl90eF9jYWxsYmFjaywgY29udGV4dCwgaW50ZXJ2YWwpOworCisJY29udGV4dC0+dHhfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCWluaXRfY29tcGxldGlvbigmY29udGV4dC0+dHguZmluaXNoZWQpOworCWF0b21pY19zZXQoJihjb250ZXh0LT50eC5idXN5KSwgMSk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihjb250ZXh0LT50eF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAwKTsKKwkJZXJyKCIlczogZXJyb3Igc3VibWl0dGluZyB1cmIoJWQpIiwgX19mdW5jX18sIHJldHZhbCk7CisJfSBlbHNlIHsKKwkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlIChvciBhYm9ydCkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJCXJldHZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKKwkJCQkmY29udGV4dC0+dHguZmluaXNoZWQpOworCQlpZiAocmV0dmFsKQorCQkJZXJyKCIlczogdGFzayBpbnRlcnJ1cHRlZCIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfbG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJCXJldHZhbCA9IGNvbnRleHQtPnR4LnN0YXR1czsKKwkJaWYgKHJldHZhbCkKKwkJCWVycigiJXM6IHBhY2tldCB0eCBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByZXR2YWwpOworCX0KKworCWtmcmVlKGNvbnRyb2xfcmVxKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogV3JpdGVzIGRhdGEgdG8gdGhlIFZGRC4gIFRoZSBpTU9OIFZGRCBpcyAyeDE2IGNoYXJhY3RlcnMKKyAqIGFuZCByZXF1aXJlcyBkYXRhIGluIDUgY29uc2VjdXRpdmUgVVNCIGludGVycnVwdCBwYWNrZXRzLAorICogZWFjaCBwYWNrZXQgYnV0IHRoZSBsYXN0IGNhcnJ5aW5nIDcgYnl0ZXMuCisgKgorICogSSBkb24ndCBrbm93IGlmIHRoZSBWRkQgYm9hcmQgc3VwcG9ydHMgZmVhdHVyZXMgc3VjaCBhcworICogc2Nyb2xsaW5nLCBjbGVhcmluZyByb3dzLCBibGFua2luZywgZXRjLiBzbyBhdAorICogdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSBmdWxsIHNjcmVlbiBvZiBkYXRhLiAgSWYgZmV3ZXIKKyAqIHRoYW4gMzIgYnl0ZXMgYXJlIHByb3ZpZGVkIHNwYWNlcyB3aWxsIGJlIGFwcGVuZGVkIHRvCisgKiBnZW5lcmF0ZSBhIGZ1bGwgc2NyZWVuLgorICovCitzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSBzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpCit7CisJaW50IGk7CisJaW50IG9mZnNldDsKKwlpbnQgc2VxOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQ7CisJY29uc3QgdW5zaWduZWQgY2hhciB2ZmRfcGFja2V0NltdID0geworCQkweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGIH07CisJaW50ICpkYXRhX2J1ZjsKKworCWNvbnRleHQgPSAoc3RydWN0IGltb25fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIWNvbnRleHQpIHsKKwkJZXJyKCIlczogbm8gY29udGV4dCBmb3IgZGV2aWNlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwlpZiAoIWNvbnRleHQtPmRldl9wcmVzZW50KSB7CisJCWVycigiJXM6IG5vIGlNT04gZGV2aWNlIHByZXNlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAobl9ieXRlcyA8PSAwIHx8IG5fYnl0ZXMgPiBJTU9OX0RBVEFfQlVGX1NaIC0gMykgeworCQllcnIoIiVzOiBpbnZhbGlkIHBheWxvYWQgc2l6ZSIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWRhdGFfYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuX2J5dGVzKTsKKwlpZiAoSVNfRVJSKGRhdGFfYnVmKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGRhdGFfYnVmKTsKKwkJZ290byBleGl0OworCX0KKworCW1lbWNweShjb250ZXh0LT50eC5kYXRhX2J1ZiwgZGF0YV9idWYsIG5fYnl0ZXMpOworCisJLyogUGFkIHdpdGggc3BhY2VzICovCisJZm9yIChpID0gbl9ieXRlczsgaSA8IElNT05fREFUQV9CVUZfU1ogLSAzOyArK2kpCisJCWNvbnRleHQtPnR4LmRhdGFfYnVmW2ldID0gJyAnOworCisJZm9yIChpID0gSU1PTl9EQVRBX0JVRl9TWiAtIDM7IGkgPCBJTU9OX0RBVEFfQlVGX1NaOyArK2kpCisJCWNvbnRleHQtPnR4LmRhdGFfYnVmW2ldID0gMHhGRjsKKworCW9mZnNldCA9IDA7CisJc2VxID0gMDsKKworCWRvIHsKKwkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsIGNvbnRleHQtPnR4LmRhdGFfYnVmICsgb2Zmc2V0LCA3KTsKKwkJY29udGV4dC0+dXNiX3R4X2J1Zls3XSA9ICh1bnNpZ25lZCBjaGFyKSBzZXE7CisKKwkJcmV0dmFsID0gc2VuZF9wYWNrZXQoY29udGV4dCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWVycigiJXM6IHNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZCIsCisJCQkJCV9fZnVuY19fLCBzZXEvMik7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlzZXEgKz0gMjsKKwkJCW9mZnNldCArPSA3OworCQl9CisKKwl9IHdoaWxlIChvZmZzZXQgPCBJTU9OX0RBVEFfQlVGX1NaKTsKKworCWlmIChjb250ZXh0LT52ZmRfcHJvdG9fNnApIHsKKwkJLyogU2VuZCBwYWNrZXQgIzYgKi8KKwkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsICZ2ZmRfcGFja2V0Niwgc2l6ZW9mKHZmZF9wYWNrZXQ2KSk7CisJCWNvbnRleHQtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcikgc2VxOworCQlyZXR2YWwgPSBzZW5kX3BhY2tldChjb250ZXh0KTsKKwkJaWYgKHJldHZhbCkKKwkJCWVycigiJXM6IHNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZCIsCisJCQkJCV9fZnVuY19fLCBzZXEvMik7CisJfQorCitleGl0OgorCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJcmV0dXJuICghcmV0dmFsKSA/IG5fYnl0ZXMgOiByZXR2YWw7Cit9CisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogdHJhbnNtaXQgZGF0YQorICovCitzdGF0aWMgdm9pZCB1c2JfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQ7CisKKwlpZiAoIXVyYikKKwkJcmV0dXJuOworCWNvbnRleHQgPSAoc3RydWN0IGltb25fY29udGV4dCAqKXVyYi0+Y29udGV4dDsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybjsKKworCWNvbnRleHQtPnR4LnN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJLyogbm90aWZ5IHdhaXRlcnMgdGhhdCB3cml0ZSBoYXMgZmluaXNoZWQgKi8KKwlhdG9taWNfc2V0KCZjb250ZXh0LT50eC5idXN5LCAwKTsKKwljb21wbGV0ZSgmY29udGV4dC0+dHguZmluaXNoZWQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIENhbGxlZCBieSBsaXJjX2RldiB3aGVuIHRoZSBhcHBsaWNhdGlvbiBvcGVucyAvZGV2L2xpcmMKKyAqLworc3RhdGljIGludCBpcl9vcGVuKHZvaWQgKmRhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dDsKKworCS8qIHByZXZlbnQgcmFjZXMgd2l0aCBkaXNjb25uZWN0ICovCisJbXV0ZXhfbG9jaygmZHJpdmVyX2xvY2spOworCisJY29udGV4dCA9IChzdHJ1Y3QgaW1vbl9jb250ZXh0ICopZGF0YTsKKworCS8qIGluaXRpYWwgSVIgcHJvdG9jb2wgZGVjb2RlIHZhcmlhYmxlcyAqLworCWNvbnRleHQtPnJ4LmNvdW50ID0gMDsKKwljb250ZXh0LT5yeC5pbml0aWFsX3NwYWNlID0gMTsKKwljb250ZXh0LT5yeC5wcmV2X2JpdCA9IDA7CisKKwljb250ZXh0LT5pcl9pc29wZW4gPSAxOworCWRldl9pbmZvKGNvbnRleHQtPmRyaXZlci0+ZGV2LCAiSVIgcG9ydCBvcGVuZWRcbiIpOworCisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgbGlyY19kZXYgd2hlbiB0aGUgYXBwbGljYXRpb24gY2xvc2VzIC9kZXYvbGlyYworICovCitzdGF0aWMgdm9pZCBpcl9jbG9zZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQ7CisKKwljb250ZXh0ID0gKHN0cnVjdCBpbW9uX2NvbnRleHQgKilkYXRhOworCWlmICghY29udGV4dCkgeworCQllcnIoIiVzOiBubyBjb250ZXh0IGZvciBkZXZpY2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwljb250ZXh0LT5pcl9pc29wZW4gPSAwOworCWRldl9pbmZvKGNvbnRleHQtPmRyaXZlci0+ZGV2LCAiSVIgcG9ydCBjbG9zZWRcbiIpOworCisJaWYgKCFjb250ZXh0LT5kZXZfcHJlc2VudCkgeworCQkvKgorCQkgKiBEZXZpY2UgZGlzY29ubmVjdGVkIHdoaWxlIElSIHBvcnQgd2FzIHN0aWxsIG9wZW4uIERyaXZlcgorCQkgKiB3YXMgbm90IGRlcmVnaXN0ZXJlZCBhdCBkaXNjb25uZWN0IHRpbWUsIHNvIGRvIGl0IG5vdy4KKwkJICovCisJCWRlcmVnaXN0ZXJfZnJvbV9saXJjKGNvbnRleHQpOworCisJCWlmICghY29udGV4dC0+ZGlzcGxheV9pc29wZW4pIHsKKwkJCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCQkJZnJlZV9pbW9uX2NvbnRleHQoY29udGV4dCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICogSWYgZGlzcGxheSBwb3J0IGlzIG9wZW4sIGNvbnRleHQgd2lsbCBiZSBkZWxldGVkIGJ5CisJCSAqIGRpc3BsYXlfY2xvc2UKKwkJICovCisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJcmV0dXJuOworfQorCisvKioKKyAqIENvbnZlcnQgYml0IGNvdW50IHRvIHRpbWUgZHVyYXRpb24gKGluIHVzKSBhbmQgc3VibWl0CisgKiB0aGUgdmFsdWUgdG8gbGlyY19kZXYuCisgKi8KK3N0YXRpYyB2b2lkIHN1Ym1pdF9kYXRhKHN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQpCit7CisJdW5zaWduZWQgY2hhciBidWZbNF07CisJaW50IHZhbHVlID0gY29udGV4dC0+cnguY291bnQ7CisJaW50IGk7CisKKwlkZXZfZGJnKGNvbnRleHQtPmRyaXZlci0+ZGV2LCAic3VibWl0dGluZyBkYXRhIHRvIExJUkNcbiIpOworCisJdmFsdWUgKj0gQklUX0RVUkFUSU9OOworCXZhbHVlICY9IFBVTFNFX01BU0s7CisJaWYgKGNvbnRleHQtPnJ4LnByZXZfYml0KQorCQl2YWx1ZSB8PSBQVUxTRV9CSVQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCQlidWZbaV0gPSB2YWx1ZT4+KGkqOCk7CisKKwlsaXJjX2J1ZmZlcl93cml0ZShjb250ZXh0LT5kcml2ZXItPnJidWYsIGJ1Zik7CisJd2FrZV91cCgmY29udGV4dC0+ZHJpdmVyLT5yYnVmLT53YWl0X3BvbGwpOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHYyaW50KGNvbnN0IHN0cnVjdCB0aW1ldmFsICphLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqYikKK3sKKwlpbnQgdXNlY3MgPSAwOworCWludCBzZWMgICA9IDA7CisKKwlpZiAoYi0+dHZfdXNlYyA+IGEtPnR2X3VzZWMpIHsKKwkJdXNlY3MgPSAxMDAwMDAwOworCQlzZWMtLTsKKwl9CisKKwl1c2VjcyArPSBhLT50dl91c2VjIC0gYi0+dHZfdXNlYzsKKworCXNlYyArPSBhLT50dl9zZWMgLSBiLT50dl9zZWM7CisJc2VjICo9IDEwMDA7CisJdXNlY3MgLz0gMTAwMDsKKwlzZWMgKz0gdXNlY3M7CisKKwlpZiAoc2VjIDwgMCkKKwkJc2VjID0gMTAwMDsKKworCXJldHVybiBzZWM7Cit9CisKKy8qKgorICogUHJvY2VzcyB0aGUgaW5jb21pbmcgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIGltb25faW5jb21pbmdfcGFja2V0KHN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQsCisJCQkJIHN0cnVjdCB1cmIgKnVyYiwgaW50IGludGYpCit7CisJaW50IGxlbiA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0LT5kcml2ZXItPmRldjsKKwlpbnQgb2N0ZXQsIGJpdDsKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJaW50IGksIGNodW5rX251bTsKKworCS8qCisJICoganVzdCBiYWlsIG91dCBpZiBubyBsaXN0ZW5pbmcgSVIgY2xpZW50CisJICovCisJaWYgKCFjb250ZXh0LT5pcl9pc29wZW4pCisJCXJldHVybjsKKworCWlmIChsZW4gIT0gOCkgeworCQlkZXZfd2FybihkZXYsICJpbW9uICVzOiBpbnZhbGlkIGluY29taW5nIHBhY2tldCAiCisJCQkgInNpemUgKGxlbiA9ICVkLCBpbnRmJWQpXG4iLCBfX2Z1bmNfXywgbGVuLCBpbnRmKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZWJ1ZykgeworCQlwcmludGsoS0VSTl9JTkZPICJyYXcgcGFja2V0OiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorCQkJcHJpbnRrKCIlMDJ4ICIsIGJ1ZltpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwkvKgorCSAqIFRyYW5zbGF0ZSByZWNlaXZlZCBkYXRhIHRvIHB1bHNlIGFuZCBzcGFjZSBsZW5ndGhzLgorCSAqIFJlY2VpdmVkIGRhdGEgaXMgYWN0aXZlIGxvdywgaS5lLiBwdWxzZXMgYXJlIDAgYW5kCisJICogc3BhY2VzIGFyZSAxLgorCSAqCisJICogTXkgb3JpZ2luYWwgYWxnb3JpdGhtIHdhcyBlc3NlbnRpYWxseSBzaW1pbGFyIHRvCisJICogQ2hhbmd3b28gUnl1J3Mgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgaGUgc3dpdGNoZWQKKwkgKiB0aGUgaW5jb21pbmcgYml0cyB0byBhY3RpdmUgaGlnaCBhbmQgYWxzbyBmZWQgYW4KKwkgKiBpbml0aWFsIHNwYWNlIHRvIExJUkMgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHNlcXVlbmNlCisJICogaWYgdGhlIHByZXZpb3VzIGJpdCB3YXMgYSBwdWxzZS4KKwkgKgorCSAqIEkndmUgZGVjaWRlZCB0byBhZG9wdCBoaXMgYWxnb3JpdGhtLgorCSAqLworCisJaWYgKGJ1Zls3XSA9PSAxICYmIGNvbnRleHQtPnJ4LmluaXRpYWxfc3BhY2UpIHsKKwkJLyogTElSQyByZXF1aXJlcyBhIGxlYWRpbmcgc3BhY2UgKi8KKwkJY29udGV4dC0+cngucHJldl9iaXQgPSAwOworCQljb250ZXh0LT5yeC5jb3VudCA9IDQ7CisJCXN1Ym1pdF9kYXRhKGNvbnRleHQpOworCQljb250ZXh0LT5yeC5jb3VudCA9IDA7CisJfQorCisJZm9yIChvY3RldCA9IDA7IG9jdGV0IDwgNTsgKytvY3RldCkgeworCQltYXNrID0gMHg4MDsKKwkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyArK2JpdCkgeworCQkJaW50IGN1cnJfYml0ID0gIShidWZbb2N0ZXRdICYgbWFzayk7CisJCQlpZiAoY3Vycl9iaXQgIT0gY29udGV4dC0+cngucHJldl9iaXQpIHsKKwkJCQlpZiAoY29udGV4dC0+cnguY291bnQpIHsKKwkJCQkJc3VibWl0X2RhdGEoY29udGV4dCk7CisJCQkJCWNvbnRleHQtPnJ4LmNvdW50ID0gMDsKKwkJCQl9CisJCQkJY29udGV4dC0+cngucHJldl9iaXQgPSBjdXJyX2JpdDsKKwkJCX0KKwkJCSsrY29udGV4dC0+cnguY291bnQ7CisJCQltYXNrID4+PSAxOworCQl9CisJfQorCisJaWYgKGNodW5rX251bSA9PSAxMCkgeworCQlpZiAoY29udGV4dC0+cnguY291bnQpIHsKKwkJCXN1Ym1pdF9kYXRhKGNvbnRleHQpOworCQkJY29udGV4dC0+cnguY291bnQgPSAwOworCQl9CisJCWNvbnRleHQtPnJ4LmluaXRpYWxfc3BhY2UgPSBjb250ZXh0LT5yeC5wcmV2X2JpdDsKKwl9Cit9CisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogcmVjZWl2ZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9yeF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IGxlbjsKKwlpbnQgaW50Zm51bSA9IDA7CisKKwlpZiAoIXVyYikKKwkJcmV0dXJuOworCisJY29udGV4dCA9IChzdHJ1Y3QgaW1vbl9jb250ZXh0ICopdXJiLT5jb250ZXh0OworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJYnVmID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgLUVOT0VOVDoJCS8qIHVzYmNvcmUgdW5saW5rIHN1Y2Nlc3NmdWwhICovCisJCXJldHVybjsKKworCWNhc2UgMDoKKwkJaW1vbl9pbmNvbWluZ19wYWNrZXQoY29udGV4dCwgdXJiLCBpbnRmbnVtKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfd2Fybihjb250ZXh0LT5kcml2ZXItPmRldiwgImltb24gJXM6IHN0YXR1cyglZCk6IGlnbm9yZWRcbiIsCisJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJdXNiX3N1Ym1pdF91cmIoY29udGV4dC0+cnhfdXJiLCBHRlBfQVRPTUlDKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgVVNCIGNvcmUgQVBJOiBQcm9iZQorICovCitzdGF0aWMgaW50IGltb25fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2MgPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqcnhfZW5kcG9pbnQgPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdHhfZW5kcG9pbnQgPSBOVUxMOworCXN0cnVjdCB1cmIgKnJ4X3VyYiA9IE5VTEw7CisJc3RydWN0IHVyYiAqdHhfdXJiID0gTlVMTDsKKwlzdHJ1Y3QgbGlyY19kcml2ZXIgKmRyaXZlciA9IE5VTEw7CisJc3RydWN0IGxpcmNfYnVmZmVyICpyYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50ZXJmYWNlLT5kZXY7CisJaW50IGlmbnVtOworCWludCBsaXJjX21pbm9yID0gMDsKKwlpbnQgbnVtX2VuZHB0czsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgZGlzcGxheV9lcF9mb3VuZCA9IDA7CisJaW50IGlyX2VwX2ZvdW5kID0gMDsKKwlpbnQgYWxsb2Nfc3RhdHVzID0gMDsKKwlpbnQgdmZkX3Byb3RvXzZwID0gMDsKKwlpbnQgY29kZV9sZW5ndGg7CisJc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJaW50IGk7CisJdTE2IHZlbmRvciwgcHJvZHVjdDsKKworCWNvbnRleHQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW1vbl9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250ZXh0KSB7CisJCWVycigiJXM6IGt6YWxsb2MgZmFpbGVkIGZvciBjb250ZXh0IiwgX19mdW5jX18pOworCQlhbGxvY19zdGF0dXMgPSAxOworCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CisJfQorCisJLyoKKwkgKiBUcnkgdG8gYXV0by1kZXRlY3QgdGhlIHR5cGUgb2YgZGlzcGxheSBpZiB0aGUgdXNlciBoYXNuJ3Qgc2V0CisJICogaXQgYnkgaGFuZCB2aWEgdGhlIGRpc3BsYXlfdHlwZSBtb2RwYXJhbS4gRGVmYXVsdCBpcyBWRkQuCisJICovCisJaWYgKHVzYl9tYXRjaF9pZChpbnRlcmZhY2UsIGlyX29ubHlfbGlzdCkpCisJCWNvbnRleHQtPmRpc3BsYXkgPSAwOworCWVsc2UKKwkJY29udGV4dC0+ZGlzcGxheSA9IDE7CisKKwljb2RlX2xlbmd0aCA9IEJVRl9DSFVOS19TSVpFICogODsKKworCXVzYmRldiAgICAgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCW51bV9lbmRwdHMgPSBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7CisJaWZudW0gICAgICA9IGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwl2ZW5kb3IgICAgID0gbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwlwcm9kdWN0ICAgID0gbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBmb3VuZCBpTU9OIGRldmljZSAoJTA0eDolMDR4LCBpbnRmJWQpXG4iLAorCQlfX2Z1bmNfXywgdmVuZG9yLCBwcm9kdWN0LCBpZm51bSk7CisKKwkvKiBwcmV2ZW50IHJhY2VzIHByb2JpbmcgZGV2aWNlcyB3L211bHRpcGxlIGludGVyZmFjZXMgKi8KKwltdXRleF9sb2NrKCZkcml2ZXJfbG9jayk7CisKKwkvKgorCSAqIFNjYW4gdGhlIGVuZHBvaW50IGxpc3QgYW5kIHNldDoKKwkgKglmaXJzdCBpbnB1dCBlbmRwb2ludCA9IElSIGVuZHBvaW50CisJICoJZmlyc3Qgb3V0cHV0IGVuZHBvaW50ID0gZGlzcGxheSBlbmRwb2ludAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5kcHRzICYmICEoaXJfZXBfZm91bmQgJiYgZGlzcGxheV9lcF9mb3VuZCk7ICsraSkgeworCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworCQlpbnQgZXBfZGlyOworCQlpbnQgZXBfdHlwZTsKKwkJZXAgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJZXBfZGlyID0gZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCWVwX3R5cGUgPSBlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0s7CisKKwkJaWYgKCFpcl9lcF9mb3VuZCAmJgorCQkJZXBfZGlyID09IFVTQl9ESVJfSU4gJiYKKwkJCWVwX3R5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisKKwkJCXJ4X2VuZHBvaW50ID0gZXA7CisJCQlpcl9lcF9mb3VuZCA9IDE7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBmb3VuZCBJUiBlbmRwb2ludFxuIiwgX19mdW5jX18pOworCisJCX0gZWxzZSBpZiAoIWRpc3BsYXlfZXBfZm91bmQgJiYgZXBfZGlyID09IFVTQl9ESVJfT1VUICYmCisJCQkgICBlcF90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgeworCQkJdHhfZW5kcG9pbnQgPSBlcDsKKwkJCWRpc3BsYXlfZXBfZm91bmQgPSAxOworCQkJZGV2X2RiZyhkZXYsICIlczogZm91bmQgZGlzcGxheSBlbmRwb2ludFxuIiwgX19mdW5jX18pOworCQl9CisJfQorCisJLyoKKwkgKiBTb21lIGlNT04gcmVjZWl2ZXJzIGhhdmUgbm8gZGlzcGxheS4gVW5mb3J0dW5hdGVseSwgaXQgc2VlbXMKKwkgKiB0aGF0IFNvdW5kR3JhcGggcmVjeWNsZXMgZGV2aWNlIElEcyBiZXR3ZWVuIGRldmljZXMgYm90aCB3aXRoCisJICogYW5kIHdpdGhvdXQuLi4gOlwKKwkgKi8KKwlpZiAoY29udGV4dC0+ZGlzcGxheSA9PSAwKSB7CisJCWRpc3BsYXlfZXBfZm91bmQgPSAwOworCQlkZXZfZGJnKGRldiwgIiVzOiBkZXZpY2UgaGFzIG5vIGRpc3BsYXlcbiIsIF9fZnVuY19fKTsKKwl9CisKKwkvKiBJbnB1dCBlbmRwb2ludCBpcyBtYW5kYXRvcnkgKi8KKwlpZiAoIWlyX2VwX2ZvdW5kKSB7CisJCWVycigiJXM6IG5vIHZhbGlkIGlucHV0IChJUikgZW5kcG9pbnQgZm91bmQuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlhbGxvY19zdGF0dXMgPSAyOworCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CisJfQorCisJLyogRGV0ZXJtaW5lIGlmIGRpc3BsYXkgcmVxdWlyZXMgNiBwYWNrZXRzICovCisJaWYgKGRpc3BsYXlfZXBfZm91bmQpIHsKKwkJaWYgKHVzYl9tYXRjaF9pZChpbnRlcmZhY2UsIHZmZF9wcm90b182cF9saXN0KSkKKwkJCXZmZF9wcm90b182cCA9IDE7CisKKwkJZGV2X2RiZyhkZXYsICIlczogdmZkX3Byb3RvXzZwOiAlZFxuIiwKKwkJCV9fZnVuY19fLCB2ZmRfcHJvdG9fNnApOworCX0KKworCWRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXJjX2RyaXZlciksIEdGUF9LRVJORUwpOworCWlmICghZHJpdmVyKSB7CisJCWVycigiJXM6IGt6YWxsb2MgZmFpbGVkIGZvciBsaXJjX2RyaXZlciIsIF9fZnVuY19fKTsKKwkJYWxsb2Nfc3RhdHVzID0gMjsKKwkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOworCX0KKwlyYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYnVmKSB7CisJCWVycigiJXM6IGttYWxsb2MgZmFpbGVkIGZvciBsaXJjX2J1ZmZlciIsIF9fZnVuY19fKTsKKwkJYWxsb2Nfc3RhdHVzID0gMzsKKwkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOworCX0KKwlpZiAobGlyY19idWZmZXJfaW5pdChyYnVmLCBCVUZfQ0hVTktfU0laRSwgQlVGX1NJWkUpKSB7CisJCWVycigiJXM6IGxpcmNfYnVmZmVyX2luaXQgZmFpbGVkIiwgX19mdW5jX18pOworCQlhbGxvY19zdGF0dXMgPSA0OworCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CisJfQorCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF91cmIpIHsKKwkJZXJyKCIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWQgZm9yIElSIHVyYiIsIF9fZnVuY19fKTsKKwkJYWxsb2Nfc3RhdHVzID0gNTsKKwkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOworCX0KKwl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghdHhfdXJiKSB7CisJCWVycigiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBkaXNwbGF5IHVyYiIsCisJCSAgICBfX2Z1bmNfXyk7CisJCWFsbG9jX3N0YXR1cyA9IDY7CisJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKKwl9CisKKwltdXRleF9pbml0KCZjb250ZXh0LT5jdHhfbG9jayk7CisJY29udGV4dC0+dmZkX3Byb3RvXzZwID0gdmZkX3Byb3RvXzZwOworCisJc3RyY3B5KGRyaXZlci0+bmFtZSwgTU9EX05BTUUpOworCWRyaXZlci0+bWlub3IgPSAtMTsKKwlkcml2ZXItPmNvZGVfbGVuZ3RoID0gc2l6ZW9mKGludCkgKiA4OworCWRyaXZlci0+c2FtcGxlX3JhdGUgPSAwOworCWRyaXZlci0+ZmVhdHVyZXMgPSBMSVJDX0NBTl9SRUNfTU9ERTI7CisJZHJpdmVyLT5kYXRhID0gY29udGV4dDsKKwlkcml2ZXItPnJidWYgPSByYnVmOworCWRyaXZlci0+c2V0X3VzZV9pbmMgPSBpcl9vcGVuOworCWRyaXZlci0+c2V0X3VzZV9kZWMgPSBpcl9jbG9zZTsKKwlkcml2ZXItPmRldiA9ICZpbnRlcmZhY2UtPmRldjsKKwlkcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwljb250ZXh0LT5kcml2ZXIgPSBkcml2ZXI7CisJLyogc3RhcnQgb3V0IGluIGtleWJvYXJkIG1vZGUgKi8KKworCWxpcmNfbWlub3IgPSBsaXJjX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworCWlmIChsaXJjX21pbm9yIDwgMCkgeworCQllcnIoIiVzOiBsaXJjX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWFsbG9jX3N0YXR1cyA9IDc7CisJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKKwl9IGVsc2UKKwkJZGV2X2luZm8oZGV2LCAiUmVnaXN0ZXJlZCBpTU9OIGRyaXZlciAiCisJCQkgIihsaXJjIG1pbm9yOiAlZClcbiIsIGxpcmNfbWlub3IpOworCisJLyogTmVlZGVkIHdoaWxlIHVucmVnaXN0ZXJpbmchICovCisJZHJpdmVyLT5taW5vciA9IGxpcmNfbWlub3I7CisKKwljb250ZXh0LT51c2JkZXYgPSB1c2JkZXY7CisJY29udGV4dC0+ZGV2X3ByZXNlbnQgPSAxOworCWNvbnRleHQtPnJ4X2VuZHBvaW50ID0gcnhfZW5kcG9pbnQ7CisJY29udGV4dC0+cnhfdXJiID0gcnhfdXJiOworCisJLyoKKwkgKiB0eCBpcyB1c2VkIHRvIHNlbmQgY2hhcmFjdGVycyB0byBsY2QvdmZkLCBhc3NvY2lhdGUgUkYKKwkgKiByZW1vdGVzLCBzZXQgSVIgcHJvdG9jb2wsIGFuZCBtYXliZSBtb3JlLi4uCisJICovCisJY29udGV4dC0+dHhfZW5kcG9pbnQgPSB0eF9lbmRwb2ludDsKKwljb250ZXh0LT50eF91cmIgPSB0eF91cmI7CisKKwlpZiAoZGlzcGxheV9lcF9mb3VuZCkKKwkJY29udGV4dC0+ZGlzcGxheSA9IDE7CisKKwl1c2JfZmlsbF9pbnRfdXJiKGNvbnRleHQtPnJ4X3VyYiwgY29udGV4dC0+dXNiZGV2LAorCQl1c2JfcmN2aW50cGlwZShjb250ZXh0LT51c2JkZXYsCisJCQljb250ZXh0LT5yeF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCWNvbnRleHQtPnVzYl9yeF9idWYsIHNpemVvZihjb250ZXh0LT51c2JfcnhfYnVmKSwKKwkJdXNiX3J4X2NhbGxiYWNrLCBjb250ZXh0LAorCQljb250ZXh0LT5yeF9lbmRwb2ludC0+YkludGVydmFsKTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGNvbnRleHQtPnJ4X3VyYiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmV0dmFsKSB7CisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCBmb3IgaW50ZjAgKCVkKSIsCisJCSAgICBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgY29udGV4dCk7CisKKwlpZiAoY29udGV4dC0+ZGlzcGxheSAmJiBpZm51bSA9PSAwKSB7CisJCWRldl9kYmcoZGV2LCAiJXM6IFJlZ2lzdGVyaW5nIGlNT04gZGlzcGxheSB3aXRoIHN5c2ZzXG4iLAorCQkJX19mdW5jX18pOworCisJCWlmICh1c2JfcmVnaXN0ZXJfZGV2KGludGVyZmFjZSwgJmltb25fY2xhc3MpKSB7CisJCQkvKiBOb3QgYSBmYXRhbCBlcnJvciwgc28gaWdub3JlICovCisJCQlkZXZfaW5mbyhkZXYsICIlczogY291bGQgbm90IGdldCBhIG1pbm9yIG51bWJlciBmb3IgIgorCQkJCSAiZGlzcGxheVxuIiwgX19mdW5jX18pOworCQl9CisJfQorCisJZGV2X2luZm8oZGV2LCAiaU1PTiBkZXZpY2UgKCUwNHg6JTA0eCwgaW50ZiVkKSBvbiAiCisJCSAidXNiPCVkOiVkPiBpbml0aWFsaXplZFxuIiwgdmVuZG9yLCBwcm9kdWN0LCBpZm51bSwKKwkJIHVzYmRldi0+YnVzLT5idXNudW0sIHVzYmRldi0+ZGV2bnVtKTsKKworYWxsb2Nfc3RhdHVzX3N3aXRjaDoKKwltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKworCXN3aXRjaCAoYWxsb2Nfc3RhdHVzKSB7CisJY2FzZSA3OgorCQl1c2JfZnJlZV91cmIodHhfdXJiKTsKKwljYXNlIDY6CisJCXVzYl9mcmVlX3VyYihyeF91cmIpOworCWNhc2UgNToKKwkJaWYgKHJidWYpCisJCQlsaXJjX2J1ZmZlcl9mcmVlKHJidWYpOworCWNhc2UgNDoKKwkJa2ZyZWUocmJ1Zik7CisJY2FzZSAzOgorCQlrZnJlZShkcml2ZXIpOworCWNhc2UgMjoKKwkJa2ZyZWUoY29udGV4dCk7CisJCWNvbnRleHQgPSBOVUxMOworCWNhc2UgMToKKwkJaWYgKHJldHZhbCAhPSAtRU5PREVWKQorCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlyZXR2YWwgPSAwOworCX0KKworZXhpdDoKKwltdXRleF91bmxvY2soJmRyaXZlcl9sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogZGlzY29ubmVjdAorICovCitzdGF0aWMgdm9pZCBpbW9uX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0OworCWludCBpZm51bTsKKworCS8qIHByZXZlbnQgcmFjZXMgd2l0aCBpcl9vcGVuKCkvZGlzcGxheV9vcGVuKCkgKi8KKwltdXRleF9sb2NrKCZkcml2ZXJfbG9jayk7CisKKwljb250ZXh0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmbnVtID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCisJbXV0ZXhfbG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJLyogQWJvcnQgb25nb2luZyB3cml0ZSAqLworCWlmIChhdG9taWNfcmVhZCgmY29udGV4dC0+dHguYnVzeSkpIHsKKwkJdXNiX2tpbGxfdXJiKGNvbnRleHQtPnR4X3VyYik7CisJCWNvbXBsZXRlX2FsbCgmY29udGV4dC0+dHguZmluaXNoZWQpOworCX0KKworCWNvbnRleHQtPmRldl9wcmVzZW50ID0gMDsKKwl1c2Jfa2lsbF91cmIoY29udGV4dC0+cnhfdXJiKTsKKwlpZiAoY29udGV4dC0+ZGlzcGxheSkKKwkJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGVyZmFjZSwgJmltb25fY2xhc3MpOworCisJaWYgKCFjb250ZXh0LT5pcl9pc29wZW4gJiYgIWNvbnRleHQtPmRldl9wcmVzZW50KSB7CisJCWRlcmVnaXN0ZXJfZnJvbV9saXJjKGNvbnRleHQpOworCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKwkJaWYgKCFjb250ZXh0LT5kaXNwbGF5X2lzb3BlbikKKwkJCWZyZWVfaW1vbl9jb250ZXh0KGNvbnRleHQpOworCX0gZWxzZQorCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKworCW11dGV4X3VubG9jaygmZHJpdmVyX2xvY2spOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGlNT04gZGV2aWNlIChpbnRmJWQpIGRpc2Nvbm5lY3RlZFxuIiwKKwkgICAgICAgX19mdW5jX18sIGlmbnVtKTsKK30KKworc3RhdGljIGludCBpbW9uX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdXNiX2tpbGxfdXJiKGNvbnRleHQtPnJ4X3VyYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbW9uX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdXNiX2ZpbGxfaW50X3VyYihjb250ZXh0LT5yeF91cmIsIGNvbnRleHQtPnVzYmRldiwKKwkJdXNiX3JjdmludHBpcGUoY29udGV4dC0+dXNiZGV2LAorCQkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQljb250ZXh0LT51c2JfcnhfYnVmLCBzaXplb2YoY29udGV4dC0+dXNiX3J4X2J1ZiksCisJCXVzYl9yeF9jYWxsYmFjaywgY29udGV4dCwKKwkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisKKwlyYyA9IHVzYl9zdWJtaXRfdXJiKGNvbnRleHQtPnJ4X3VyYiwgR0ZQX0FUT01JQyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGltb25faW5pdCh2b2lkKQoreworCWludCByYzsKKworCXByaW50ayhLRVJOX0lORk8gTU9EX05BTUUgIjogIiBNT0RfREVTQyAiLCB2IiBNT0RfVkVSU0lPTiAiXG4iKTsKKworCXJjID0gdXNiX3JlZ2lzdGVyKCZpbW9uX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCWVycigiJXM6IHVzYiByZWdpc3RlciBmYWlsZWQoJWQpIiwgX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpbW9uX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmaW1vbl9kcml2ZXIpOworCXByaW50ayhLRVJOX0lORk8gTU9EX05BTUUgIjogbW9kdWxlIHJlbW92ZWQuIEdvb2RieWUhXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW1vbl9pbml0KTsKK21vZHVsZV9leGl0KGltb25fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2l0ODcuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaXQ4Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2l0ODcuYwpAQCAtMCwwICsxLDEwMTkgQEAKKy8qCisgKiBMSVJDIGRyaXZlciBmb3IgSVRFIElUODcxMi9JVDg3MDUgQ0lSIHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSGFucy1HdW50ZXIgTHV0a2UgVXBodWVzIDxoZ19sdUB3ZWIuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICoKKyAqIElURSBJVDg3MDUgYW5kIElUODcxMihub3QgdGVzdGVkKSBhbmQgSVQ4NzIwIENJUi1wb3J0IHN1cHBvcnQgZm9yIGxpcmMgYmFzZWQKKyAqIHZpYSBjdXQgYW5kIHBhc3RlIGZyb20gbGlyY19zaXIuYyAoQykgMjAwMCBNaWxhbiBQaWt1bGEKKyAqCisgKiBBdHRlbnRpb246IFNlbmRtb2RlIG9ubHkgdGVzdGVkIHdpdGggZGVidWdnaW5nIGxvZ3MKKyAqCisgKiAyMDAxLzAyLzI3IENocmlzdG9waCBCYXJ0ZWxtdXMgPGxpcmNAYmFydGVsbXVzLmRlPiA6CisgKiAgIHJlaW1wbGVtZW50ZWQgcmVhZCBmdW5jdGlvbgorICogMjAwNS8wNi8wNSBBbmRyZXcgQ2Fsa2luIGltcGxlbWVudGVkIHN1cHBvcnQgZm9yIEFzdXMgRGlnaW1hdHJpeCwKKyAqICAgYmFzZWQgb24gd29yayBvZiB0aGUgZm9sbG93aW5nIG1lbWJlciBvZiB0aGUgT3V0ZXJ0cmFjayBEaWdpbWF0cml4CisgKiAgIEZvcnVtOiBBcnQxMDMgPHJfdGF5QGhvdG1haWwuY29tPgorICogMjAwOS8xMi8yNCBKYW1lcyBFZHdhcmRzIDxqaW1iby1saXJjQGVkd2FyZHNjbGFuLm5ldD4gaW1wbGVtZXRlZCBzdXBwb3J0CisgKiAgIGZvciBJVEU4NzA0L0lURTg3MTgsIG9uIG15IG1hY2hpbmUsIHRoZSBEU0RUIHJlcG9ydHMgODcwNCwgYnV0IHRoZQorICogICBjaGlwIGlkZW50aWZpZXMgYXMgMTguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorCisjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgorI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CisKKyNpbmNsdWRlICJsaXJjX2l0ODcuaCIKKworI2lmZGVmIExJUkNfSVQ4N19ESUdJTUFUUklYCitzdGF0aWMgaW50IGRpZ2ltYXRyaXggPSAxOworc3RhdGljIGludCBpdDg3X2ZyZXEgPSAzNjsgLyoga0h6ICovCitzdGF0aWMgaW50IGlycSA9IDk7CisjZWxzZQorc3RhdGljIGludCBkaWdpbWF0cml4Oworc3RhdGljIGludCBpdDg3X2ZyZXEgPSAzODsgLyoga0h6ICovCitzdGF0aWMgaW50IGlycSA9IElUODdfQ0lSX0RFRkFVTFRfSVJROworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGl0ODdfYml0c19pbl9ieXRlX291dDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGl0ODdfc2VuZF9jb3VudGVyOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXQ4N19SWEVOX21hc2sgPSBJVDg3X0NJUl9SQ1JfUlhFTjsKKworI2RlZmluZSBSQlVGX0xFTiAxMDI0CisKKyNkZWZpbmUgTElSQ19EUklWRVJfTkFNRSAibGlyY19pdDg3IgorCisvKiB0aW1lb3V0IGZvciBzZXF1ZW5jZXMgaW4gamlmZmllcyAoPTUvMTAwcykgKi8KKy8qIG11c3QgYmUgbG9uZ2VyIHRoYW4gVElNRV9DT05TVCAqLworI2RlZmluZSBJVDg3X1RJTUVPVVQJKEhaKjUvMTAwKQorCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChkZWJ1ZykJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHIExJUkNfRFJJVkVSX05BTUUgIjogIglcCisJCQkgICAgICAgZm10LCAjIyBhcmdzKTsJCQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBpbyA9IElUODdfQ0lSX0RFRkFVTFRfSU9CQVNFOworLyogcmVjZWl2ZXIgZGVtb2R1bGF0b3IgZGVmYXVsdDogb2ZmICovCitzdGF0aWMgaW50IGl0ODdfZW5hYmxlX2RlbW9kdWxhdG9yOworCitzdGF0aWMgaW50IHRpbWVyX2VuYWJsZWQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpbWVyX2xvY2spOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVybGlzdDsKKy8qIHRpbWUgb2YgbGFzdCBzaWduYWwgY2hhbmdlIGRldGVjdGVkICovCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgbGFzdF90diA9IHswLCAwfTsKKy8qIHRpbWUgb2YgbGFzdCBVQVJUIGRhdGEgcmVhZHkgaW50ZXJydXB0ICovCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgbGFzdF9pbnRyX3R2ID0gezAsIDB9Oworc3RhdGljIGludCBsYXN0X3ZhbHVlOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobGlyY19yZWFkX3F1ZXVlKTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhoYXJkd2FyZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGV2X2xvY2spOworCitzdGF0aWMgaW50IHJ4X2J1ZltSQlVGX0xFTl07Cit1bnNpZ25lZCBpbnQgcnhfdGFpbCwgcnhfaGVhZDsKKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIGl0ODdfcG5wX2RyaXZlcjsKKworLyogU0VDVElPTjogUHJvdG90eXBlcyAqLworCisvKiBDb21tdW5pY2F0aW9uIHdpdGggdXNlci1zcGFjZSAqLworc3RhdGljIGludCBsaXJjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBsaXJjX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGlyY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3N0YXRpYyBzc2l6ZV90IGxpcmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGxpcmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgc2l6ZV90IG4sIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyBsb25nIGxpcmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBhZGRfcmVhZF9xdWV1ZShpbnQgZmxhZywgdW5zaWduZWQgbG9uZyB2YWwpOworc3RhdGljIGludCBpbml0X2NocmRldih2b2lkKTsKK3N0YXRpYyB2b2lkIGRyb3BfY2hyZGV2KHZvaWQpOworLyogSGFyZHdhcmUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpdDg3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIHZvaWQgc2VuZF9zcGFjZSh1bnNpZ25lZCBsb25nIGxlbik7CitzdGF0aWMgdm9pZCBzZW5kX3B1bHNlKHVuc2lnbmVkIGxvbmcgbGVuKTsKK3N0YXRpYyB2b2lkIGluaXRfc2VuZCh2b2lkKTsKK3N0YXRpYyB2b2lkIHRlcm1pbmF0ZV9zZW5kKHVuc2lnbmVkIGxvbmcgbGVuKTsKK3N0YXRpYyBpbnQgaW5pdF9oYXJkd2FyZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGRyb3BfaGFyZHdhcmUodm9pZCk7CisvKiBJbml0aWFsaXNhdGlvbiAqLworc3RhdGljIGludCBpbml0X3BvcnQodm9pZCk7CitzdGF0aWMgdm9pZCBkcm9wX3BvcnQodm9pZCk7CisKKworLyogU0VDVElPTjogQ29tbXVuaWNhdGlvbiB3aXRoIHVzZXItc3BhY2UgKi8KKworc3RhdGljIGludCBsaXJjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3Bpbl9sb2NrKCZkZXZfbG9jayk7CisJaWYgKG1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSkpIHsKKwkJc3Bpbl91bmxvY2soJmRldl9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJc3Bpbl91bmxvY2soJmRldl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxpcmNfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBsaXJjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJcG9sbF93YWl0KGZpbGUsICZsaXJjX3JlYWRfcXVldWUsIHdhaXQpOworCWlmIChyeF9oZWFkICE9IHJ4X3RhaWwpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGxpcmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBuID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCXdoaWxlIChuIDwgY291bnQpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLICYmIHJ4X2hlYWQgPT0gcnhfdGFpbCkgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShsaXJjX3JlYWRfcXVldWUsCisJCQkJCQkgIHJ4X2hlYWQgIT0gcnhfdGFpbCk7CisJCWlmIChyZXR2YWwpCisJCQlicmVhazsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGJ1ZiArIG4sICh2b2lkICopIChyeF9idWYgKyByeF9oZWFkKSwKKwkJCQkgc2l6ZW9mKGludCkpKSB7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcnhfaGVhZCA9IChyeF9oZWFkICsgMSkgJiAoUkJVRl9MRU4gLSAxKTsKKwkJbiArPSBzaXplb2YoaW50KTsKKwl9CisJaWYgKG4pCisJCXJldHVybiBuOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHNzaXplX3QgbGlyY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkJICBzaXplX3QgbiwgbG9mZl90ICpwb3MpCit7CisJaW50IGkgPSAwOworCWludCAqdHhfYnVmOworCisJaWYgKG4gJSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdHhfYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuKTsKKwlpZiAoSVNfRVJSKHR4X2J1ZikpCisJCXJldHVybiBQVFJfRVJSKHR4X2J1Zik7CisJbiAvPSBzaXplb2YoaW50KTsKKwlpbml0X3NlbmQoKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoaSA+PSBuKQorCQkJYnJlYWs7CisJCWlmICh0eF9idWZbaV0pCisJCQlzZW5kX3B1bHNlKHR4X2J1ZltpXSk7CisJCWkrKzsKKwkJaWYgKGkgPj0gbikKKwkJCWJyZWFrOworCQlpZiAodHhfYnVmW2ldKQorCQkJc2VuZF9zcGFjZSh0eF9idWZbaV0pOworCQlpKys7CisJfQorCXRlcm1pbmF0ZV9zZW5kKHR4X2J1ZltpIC0gMV0pOworCXJldHVybiBuOworfQorCisKK3N0YXRpYyBsb25nIGxpcmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKwl1bnNpZ25lZCBpbnQgaXZhbHVlOworCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CisKKwlpZiAoY21kID09IExJUkNfR0VUX0ZFQVRVUkVTKQorCQl2YWx1ZSA9IExJUkNfQ0FOX1NFTkRfUFVMU0UgfAorCQkJTElSQ19DQU5fU0VUX1NFTkRfQ0FSUklFUiB8CisJCQlMSVJDX0NBTl9SRUNfTU9ERTI7CisJZWxzZSBpZiAoY21kID09IExJUkNfR0VUX1NFTkRfTU9ERSkKKwkJdmFsdWUgPSBMSVJDX01PREVfUFVMU0U7CisJZWxzZSBpZiAoY21kID09IExJUkNfR0VUX1JFQ19NT0RFKQorCQl2YWx1ZSA9IExJUkNfTU9ERV9NT0RFMjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBMSVJDX0dFVF9GRUFUVVJFUzoKKwljYXNlIExJUkNfR0VUX1NFTkRfTU9ERToKKwljYXNlIExJUkNfR0VUX1JFQ19NT0RFOgorCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIExJUkNfU0VUX1NFTkRfTU9ERToKKwljYXNlIExJUkNfU0VUX1JFQ19NT0RFOgorCQlyZXR2YWwgPSBnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIExJUkNfU0VUX1NFTkRfQ0FSUklFUjoKKwkJcmV0dmFsID0gZ2V0X3VzZXIoaXZhbHVlLCAodW5zaWduZWQgaW50ICopIGFyZyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlpdmFsdWUgLz0gMTAwMDsKKwkJaWYgKGl2YWx1ZSA+IElUODdfQ0lSX0ZSRVFfTUFYIHx8CisJCSAgICBpdmFsdWUgPCBJVDg3X0NJUl9GUkVRX01JTikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWl0ODdfZnJlcSA9IGl2YWx1ZTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFyZHdhcmVfbG9jaywgaHdfZmxhZ3MpOworCQlvdXRiKCgoaW5iKGlvICsgSVQ4N19DSVJfVENSMikgJiBJVDg3X0NJUl9UQ1IyX1RYTVBXKSB8CisJCSAgICAgIChpdDg3X2ZyZXEgLSBJVDg3X0NJUl9GUkVRX01JTikgPDwgMyksCisJCSAgICAgIGlvICsgSVQ4N19DSVJfVENSMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhcmR3YXJlX2xvY2ssIGh3X2ZsYWdzKTsKKwkJZHByaW50aygiZGVtb2R1bGF0aW9uIGZyZXF1ZW5jeTogJWQga0h6XG4iLCBpdDg3X2ZyZXEpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKGNtZCA9PSBMSVJDX1NFVF9SRUNfTU9ERSkgeworCQlpZiAodmFsdWUgIT0gTElSQ19NT0RFX01PREUyKQorCQkJcmV0dmFsID0gLUVOT1NZUzsKKwl9IGVsc2UgaWYgKGNtZCA9PSBMSVJDX1NFVF9TRU5EX01PREUpIHsKKwkJaWYgKHZhbHVlICE9IExJUkNfTU9ERV9QVUxTRSkKKwkJCXJldHZhbCA9IC1FTk9TWVM7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yZWFkX3F1ZXVlKGludCBmbGFnLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X3J4X3RhaWw7CisJaW50IG5ld3ZhbDsKKworCWRwcmludGsoImFkZCBmbGFnICVkIHdpdGggdmFsICVsdVxuIiwgZmxhZywgdmFsKTsKKworCW5ld3ZhbCA9IHZhbCAmIFBVTFNFX01BU0s7CisKKwkvKgorCSAqIHN0YXRpc3RpY2FsbHksIHB1bHNlcyBhcmUgflRJTUVfQ09OU1QvMiB0b28gbG9uZy4gd2UgY291bGQKKwkgKiBtYXliZSBtYWtlIHRoaXMgbW9yZSBleGFjdCwgYnV0IHRoaXMgaXMgZ29vZCBlbm91Z2gKKwkgKi8KKwlpZiAoZmxhZykgeworCQkvKiBwdWxzZSAqLworCQlpZiAobmV3dmFsID4gVElNRV9DT05TVCAvIDIpCisJCQluZXd2YWwgLT0gVElNRV9DT05TVCAvIDI7CisJCWVsc2UgLyogc2hvdWxkIG5vdCBldmVyIGhhcHBlbiAqLworCQkJbmV3dmFsID0gMTsKKwkJbmV3dmFsIHw9IFBVTFNFX0JJVDsKKwl9IGVsc2UKKwkJbmV3dmFsICs9IFRJTUVfQ09OU1QgLyAyOworCW5ld19yeF90YWlsID0gKHJ4X3RhaWwgKyAxKSAmIChSQlVGX0xFTiAtIDEpOworCWlmIChuZXdfcnhfdGFpbCA9PSByeF9oZWFkKSB7CisJCWRwcmludGsoIkJ1ZmZlciBvdmVycnVuLlxuIik7CisJCXJldHVybjsKKwl9CisJcnhfYnVmW3J4X3RhaWxdID0gbmV3dmFsOworCXJ4X3RhaWwgPSBuZXdfcnhfdGFpbDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpcmNfcmVhZF9xdWV1ZSk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGlyY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBsaXJjX3JlYWQsCisJLndyaXRlCQk9IGxpcmNfd3JpdGUsCisJLnBvbGwJCT0gbGlyY19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpcmNfaW9jdGwsCisJLm9wZW4JCT0gbGlyY19vcGVuLAorCS5yZWxlYXNlCT0gbGlyY19jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgc2V0X3VzZV9pbmModm9pZCAqZGF0YSkKK3sKKyAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3VzZV9kZWModm9pZCAqZGF0YSkKK3sKK30KKworc3RhdGljIHN0cnVjdCBsaXJjX2RyaXZlciBkcml2ZXIgPSB7CisgICAgICAgLm5hbWUJCT0gTElSQ19EUklWRVJfTkFNRSwKKyAgICAgICAubWlub3IJCT0gLTEsCisgICAgICAgLmNvZGVfbGVuZ3RoCT0gMSwKKyAgICAgICAuc2FtcGxlX3JhdGUJPSAwLAorICAgICAgIC5kYXRhCQk9IE5VTEwsCisgICAgICAgLmFkZF90b19idWYJPSBOVUxMLAorICAgICAgIC5zZXRfdXNlX2luYwk9IHNldF91c2VfaW5jLAorICAgICAgIC5zZXRfdXNlX2RlYwk9IHNldF91c2VfZGVjLAorICAgICAgIC5mb3BzCQk9ICZsaXJjX2ZvcHMsCisgICAgICAgLmRldgkJPSBOVUxMLAorICAgICAgIC5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGludCBpbml0X2NocmRldih2b2lkKQoreworCWRyaXZlci5taW5vciA9IGxpcmNfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCisJaWYgKGRyaXZlci5taW5vciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExJUkNfRFJJVkVSX05BTUUgIjogaW5pdF9jaHJkZXYoKSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGRyb3BfY2hyZGV2KHZvaWQpCit7CisJbGlyY191bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIubWlub3IpOworfQorI2VuZGlmCisKKworLyogU0VDVElPTjogSGFyZHdhcmUgKi8KK3N0YXRpYyBsb25nIGRlbHRhKHN0cnVjdCB0aW1ldmFsICp0djEsIHN0cnVjdCB0aW1ldmFsICp0djIpCit7CisJdW5zaWduZWQgbG9uZyBkZWx0djsKKworCWRlbHR2ID0gdHYyLT50dl9zZWMgLSB0djEtPnR2X3NlYzsKKwlpZiAoZGVsdHYgPiAxNSkKKwkJZGVsdHYgPSAweEZGRkZGRjsKKwllbHNlCisJCWRlbHR2ID0gZGVsdHYqMTAwMDAwMCArIHR2Mi0+dHZfdXNlYyAtIHR2MS0+dHZfdXNlYzsKKwlyZXR1cm4gZGVsdHY7Cit9CisKK3N0YXRpYyB2b2lkIGl0ODdfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIGludGVycnVwdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGlnaW1hdHJpeCkgeworCQkvKiBXZSBoYXZlIHRpbWVkIG91dC4gRGlzYWJsZSB0aGUgUlggbWVjaGFuaXNtLiAqLworCisJCW91dGIoKGluYihpbyArIElUODdfQ0lSX1JDUikgJiB+SVQ4N19DSVJfUkNSX1JYRU4pIHwKKwkJICAgICBJVDg3X0NJUl9SQ1JfUlhBQ1QsIGlvICsgSVQ4N19DSVJfUkNSKTsKKwkJaWYgKGl0ODdfUlhFTl9tYXNrKQorCQkJb3V0YihpbmIoaW8gKyBJVDg3X0NJUl9SQ1IpIHwgSVQ4N19DSVJfUkNSX1JYRU4sCisJCQkgICAgIGlvICsgSVQ4N19DSVJfUkNSKTsKKwkJZHByaW50aygiIFRJTUVPVVRcbiIpOworCQl0aW1lcl9lbmFibGVkID0gMDsKKworCQkvKiBmaWZvIGNsZWFyICovCisJCW91dGIoaW5iKGlvICsgSVQ4N19DSVJfVENSMSkgfCBJVDg3X0NJUl9UQ1IxX0ZJRk9DTFIsCisJCSAgICAgaW8rSVQ4N19DSVJfVENSMSk7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiBpZiBsYXN0IHJlY2VpdmVkIHNpZ25hbCB3YXMgYSBwdWxzZSwgYnV0IHJlY2VpdmluZyBzdG9wcGVkCisJCSAqIHdpdGhpbiB0aGUgOSBiaXQgZnJhbWUsIHdlIG5lZWQgdG8gZmluaXNoIHRoaXMgcHVsc2UgYW5kCisJCSAqIHNpbXVsYXRlIGEgc2lnbmFsIGNoYW5nZSB0byBmcm9tIHB1bHNlIHRvIHNwYWNlLiBPdGhlcndpc2UKKwkJICogdXBwZXIgbGF5ZXJzIHdpbGwgcmVjZWl2ZSB0d28gc2VxdWVuY2VzIG5leHQgdGltZS4KKwkJICovCisKKwkJaWYgKGxhc3RfdmFsdWUpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcHVsc2VfZW5kOworCisJCQkvKiBkZXRlcm1pbmUgJ3ZpcnR1YWwnIHB1bHNlIGVuZDogKi8KKwkJCXB1bHNlX2VuZCA9IGRlbHRhKCZsYXN0X3R2LCAmbGFzdF9pbnRyX3R2KTsKKwkJCWRwcmludGsoInRpbWVvdXQgYWRkICVkIGZvciAlbHUgdXNlY1xuIiwKKwkJCQlsYXN0X3ZhbHVlLCBwdWxzZV9lbmQpOworCQkJYWRkX3JlYWRfcXVldWUobGFzdF92YWx1ZSwgcHVsc2VfZW5kKTsKKwkJCWxhc3RfdmFsdWUgPSAwOworCQkJbGFzdF90diA9IGxhc3RfaW50cl90djsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpdDg3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdW5zaWduZWQgY2hhciBkYXRhOworCXN0cnVjdCB0aW1ldmFsIGN1cnJfdHY7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVsdHY7CisJdW5zaWduZWQgbG9uZyBkZWx0aW50cnR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGh3X2ZsYWdzOworCWludCBpaXIsIGxzcjsKKwlpbnQgZmlmbyA9IDA7CisJc3RhdGljIGNoYXIgbGFzdGJpdDsKKwljaGFyIGJpdDsKKworCS8qIEJpdCBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMgKi8KKwljb25zdCB1bnNpZ25lZCBsb25nIGJpdF9kdXJhdGlvbiA9IDEwMDAwMDB1bCAvCisJCSgxMTUyMDAgLyBJVDg3X0NJUl9CQVVEUkFURV9ESVZJU09SKTsKKworCisJaWlyID0gaW5iKGlvICsgSVQ4N19DSVJfSUlSKTsKKworCXN3aXRjaCAoaWlyICYgSVQ4N19DSVJfSUlSX0lJRCkgeworCWNhc2UgMHg0OgorCWNhc2UgMHg2OgorCQlsc3IgPSBpbmIoaW8gKyBJVDg3X0NJUl9SU1IpICYgKElUODdfQ0lSX1JTUl9SWEZUTyB8CisJCQkJCQlJVDg3X0NJUl9SU1JfUlhGQkMpOworCQlmaWZvID0gbHNyICYgSVQ4N19DSVJfUlNSX1JYRkJDOworCQlkcHJpbnRrKCJpaXI6IDB4JXggZmlmbzogMHgleFxuIiwgaWlyLCBsc3IpOworCisJCS8qIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIHRpbWVyICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lcl9sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXJkd2FyZV9sb2NrLCBod19mbGFncyk7CisJCWlmIChkaWdpbWF0cml4KSB7CisJCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBhY2NfcHVsc2U7CisJCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBhY2Nfc3BhY2U7CisKKwkJCWRvIHsKKwkJCQlkYXRhID0gaW5iKGlvICsgSVQ4N19DSVJfRFIpOworCQkJCWRhdGEgPSB+ZGF0YTsKKwkJCQlmaWZvLS07CisJCQkJaWYgKGRhdGEgIT0gMHgwMCkgeworCQkJCQlpZiAodGltZXJfZW5hYmxlZCkKKwkJCQkJCWRlbF90aW1lcigmdGltZXJsaXN0KTsKKwkJCQkJLyoKKwkJCQkJICogc3RhcnQgdGltZXIgZm9yIGVuZCBvZgorCQkJCQkgKiBzZXF1ZW5jZSBkZXRlY3Rpb24KKwkJCQkJICovCisJCQkJCXRpbWVybGlzdC5leHBpcmVzID0gamlmZmllcyArCisJCQkJCQkJICAgIElUODdfVElNRU9VVDsKKwkJCQkJYWRkX3RpbWVyKCZ0aW1lcmxpc3QpOworCQkJCQl0aW1lcl9lbmFibGVkID0gMTsKKwkJCQl9CisJCQkJLyogTG9vcCB0aHJvdWdoICovCisJCQkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyArK2JpdCkgeworCQkJCQlpZiAoKGRhdGEgPj4gYml0KSAmIDEpIHsKKwkJCQkJCSsrYWNjX3B1bHNlOworCQkJCQkJaWYgKGxhc3RiaXQgPT0gMCkgeworCQkJCQkJCWFkZF9yZWFkX3F1ZXVlKDAsCisJCQkJCQkJCWFjY19zcGFjZSAqCisJCQkJCQkJCSBiaXRfZHVyYXRpb24pOworCQkJCQkJCWFjY19zcGFjZSA9IDA7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkrK2FjY19zcGFjZTsKKwkJCQkJCWlmIChsYXN0Yml0ID09IDEpIHsKKwkJCQkJCQlhZGRfcmVhZF9xdWV1ZSgxLAorCQkJCQkJCQlhY2NfcHVsc2UgKgorCQkJCQkJCQkgYml0X2R1cmF0aW9uKTsKKwkJCQkJCQlhY2NfcHVsc2UgPSAwOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWxhc3RiaXQgPSAoZGF0YSA+PiBiaXQpICYgMTsKKwkJCQl9CisKKwkJCX0gd2hpbGUgKGZpZm8gIT0gMCk7CisJCX0gZWxzZSB7IC8qIE5vcm1hbCBPcGVyYXRpb24gKi8KKwkJCWRvIHsKKwkJCQlkZWxfdGltZXIoJnRpbWVybGlzdCk7CisJCQkJZGF0YSA9IGluYihpbyArIElUODdfQ0lSX0RSKTsKKworCQkJCWRwcmludGsoImRhdGE9JTAyeFxuIiwgZGF0YSk7CisJCQkJZG9fZ2V0dGltZW9mZGF5KCZjdXJyX3R2KTsKKwkJCQlkZWx0diA9IGRlbHRhKCZsYXN0X3R2LCAmY3Vycl90dik7CisJCQkJZGVsdGludHJ0diA9IGRlbHRhKCZsYXN0X2ludHJfdHYsICZjdXJyX3R2KTsKKworCQkJCWRwcmludGsoInQgJWx1ICwgZCAlZFxuIiwKKwkJCQkJZGVsdGludHJ0diwgKGludClkYXRhKTsKKworCQkJCS8qCisJCQkJICogaWYgbm90aGluZyBjYW1lIGluIGxhc3QgMiBjeWNsZXMsCisJCQkJICogaXQgd2FzIGdhcAorCQkJCSAqLworCQkJCWlmIChkZWx0aW50cnR2ID4gVElNRV9DT05TVCAqIDIpIHsKKwkJCQkJaWYgKGxhc3RfdmFsdWUpIHsKKwkJCQkJCWRwcmludGsoIkdBUFxuIik7CisKKwkJCQkJCS8qIHNpbXVsYXRlIHNpZ25hbCBjaGFuZ2UgKi8KKwkJCQkJCWFkZF9yZWFkX3F1ZXVlKGxhc3RfdmFsdWUsCisJCQkJCQkJICAgICAgIGRlbHR2IC0KKwkJCQkJCQkgICAgICAgZGVsdGludHJ0dik7CisJCQkJCQlsYXN0X3ZhbHVlID0gMDsKKwkJCQkJCWxhc3RfdHYudHZfc2VjID0KKwkJCQkJCQlsYXN0X2ludHJfdHYudHZfc2VjOworCQkJCQkJbGFzdF90di50dl91c2VjID0KKwkJCQkJCQlsYXN0X2ludHJfdHYudHZfdXNlYzsKKwkJCQkJCWRlbHR2ID0gZGVsdGludHJ0djsKKwkJCQkJfQorCQkJCX0KKwkJCQlkYXRhID0gMTsKKwkJCQlpZiAoZGF0YSBeIGxhc3RfdmFsdWUpIHsKKwkJCQkJLyoKKwkJCQkJICogZGVsdGludHJ0diA+IDIqVElNRV9DT05TVCwKKwkJCQkJICogcmVtZW1iZXIgPyB0aGUgb3RoZXIgY2FzZSBpcworCQkJCQkgKiB0aW1lb3V0CisJCQkJCSAqLworCQkJCQlhZGRfcmVhZF9xdWV1ZShsYXN0X3ZhbHVlLAorCQkJCQkJICAgICAgIGRlbHR2LVRJTUVfQ09OU1QpOworCQkJCQlsYXN0X3ZhbHVlID0gZGF0YTsKKwkJCQkJbGFzdF90diA9IGN1cnJfdHY7CisJCQkJCWlmIChsYXN0X3R2LnR2X3VzZWMgPj0gVElNRV9DT05TVCkKKwkJCQkJCWxhc3RfdHYudHZfdXNlYyAtPSBUSU1FX0NPTlNUOworCQkJCQllbHNlIHsKKwkJCQkJCWxhc3RfdHYudHZfc2VjLS07CisJCQkJCQlsYXN0X3R2LnR2X3VzZWMgKz0gMTAwMDAwMCAtCisJCQkJCQkJVElNRV9DT05TVDsKKwkJCQkJfQorCQkJCX0KKwkJCQlsYXN0X2ludHJfdHYgPSBjdXJyX3R2OworCQkJCWlmIChkYXRhKSB7CisJCQkJCS8qCisJCQkJCSAqIHN0YXJ0IHRpbWVyIGZvciBlbmQgb2YKKwkJCQkJICogc2VxdWVuY2UgZGV0ZWN0aW9uCisJCQkJCSAqLworCQkJCQl0aW1lcmxpc3QuZXhwaXJlcyA9CisJCQkJCQlqaWZmaWVzICsgSVQ4N19USU1FT1VUOworCQkJCQlhZGRfdGltZXIoJnRpbWVybGlzdCk7CisJCQkJfQorCQkJCW91dGIoKGluYihpbyArIElUODdfQ0lSX1JDUikgJgorCQkJCSAgICAgfklUODdfQ0lSX1JDUl9SWEVOKSB8CisJCQkJICAgICBJVDg3X0NJUl9SQ1JfUlhBQ1QsCisJCQkJICAgICBpbyArIElUODdfQ0lSX1JDUik7CisJCQkJaWYgKGl0ODdfUlhFTl9tYXNrKQorCQkJCQlvdXRiKGluYihpbyArIElUODdfQ0lSX1JDUikgfAorCQkJCQkgICAgIElUODdfQ0lSX1JDUl9SWEVOLAorCQkJCQkgICAgIGlvICsgSVQ4N19DSVJfUkNSKTsKKwkJCQlmaWZvLS07CisJCQl9IHdoaWxlIChmaWZvICE9IDApOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhcmR3YXJlX2xvY2ssIGh3X2ZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXJfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiBJUlFfUkVUVkFMKElSUV9IQU5ETEVEKTsKKworCWRlZmF1bHQ6CisJCS8qIG5vdCBvdXIgaXJxICovCisJCWRwcmludGsoInVua25vd24gSVJRIChzaG91bGRuJ3QgaGFwcGVuKSAhIVxuIik7CisJCXJldHVybiBJUlFfUkVUVkFMKElSUV9OT05FKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc2VuZF9pdDg3KHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHN0aW1lLAorCQkgICAgICB1bnNpZ25lZCBjaGFyIHNlbmRfYnl0ZSwgdW5zaWduZWQgaW50IGNvdW50X2JpdHMpCit7CisJbG9uZyBjb3VudCA9IGxlbiAvIHN0aW1lOworCWxvbmcgdGltZV9sZWZ0ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBieXRlX291dDsKKwl1bnNpZ25lZCBsb25nIGh3X2ZsYWdzOworCisJZHByaW50aygiJXM6IGxlbj0lbGQsIHNiPSVkXG4iLCBfX2Z1bmNfXywgbGVuLCBzZW5kX2J5dGUpOworCisJdGltZV9sZWZ0ID0gKGxvbmcpbGVuIC0gKGxvbmcpY291bnQgKiAobG9uZylzdGltZTsKKwljb3VudCArPSAoKDIgKiB0aW1lX2xlZnQpIC8gc3RpbWUpOworCXdoaWxlIChjb3VudCkgeworCQlsb25nIGkgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnRfYml0czsgaSsrKSB7CisJCQlieXRlX291dCA9IChieXRlX291dCA8PCAxKSB8IChzZW5kX2J5dGUgJiAxKTsKKwkJCWl0ODdfYml0c19pbl9ieXRlX291dCsrOworCQl9CisJCWlmIChpdDg3X2JpdHNfaW5fYnl0ZV9vdXQgPT0gOCkgeworCQkJZHByaW50aygib3V0PTB4JXgsIHRzcl90eGZiYzogMHgleFxuIiwKKwkJCQlieXRlX291dCwKKwkJCQlpbmIoaW8gKyBJVDg3X0NJUl9UU1IpICYKKwkJCQlJVDg3X0NJUl9UU1JfVFhGQkMpOworCisJCQl3aGlsZSAoKGluYihpbyArIElUODdfQ0lSX1RTUikgJgorCQkJCUlUODdfQ0lSX1RTUl9UWEZCQykgPj0gSVQ4N19DSVJfRklGT19TSVpFKQorCQkJCTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlX2xvY2ssIGh3X2ZsYWdzKTsKKwkJCW91dGIoYnl0ZV9vdXQsIGlvICsgSVQ4N19DSVJfRFIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVfbG9jaywgaHdfZmxhZ3MpOworCisJCQlpdDg3X2JpdHNfaW5fYnl0ZV9vdXQgPSAwOworCQkJaXQ4N19zZW5kX2NvdW50ZXIrKzsKKwkJCWJ5dGVfb3V0ID0gMDsKKwkJfQorCQljb3VudC0tOworCX0KK30KKworCisvKlRPRE86IG1heWJlIGV4Y2hhbmdlIHNwYWNlIGFuZCBwdWxzZSBiZWNhdXNlIGl0ODcwNSBvbmx5IG1vZHVsYXRlcyAwLWJpdHMgKi8KKworc3RhdGljIHZvaWQgc2VuZF9zcGFjZSh1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzZW5kX2l0ODcobGVuLCBUSU1FX0NPTlNULCBJVDg3X0NJUl9TUEFDRSwgSVQ4N19DSVJfQkFVRFJBVEVfRElWSVNPUik7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcHVsc2UodW5zaWduZWQgbG9uZyBsZW4pCit7CisJc2VuZF9pdDg3KGxlbiwgVElNRV9DT05TVCwgSVQ4N19DSVJfUFVMU0UsIElUODdfQ0lSX0JBVURSQVRFX0RJVklTT1IpOworfQorCisKK3N0YXRpYyB2b2lkIGluaXRfc2VuZCgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJLyogUlhFTj0wOiByZWNlaXZlciBkaXNhYmxlICovCisJaXQ4N19SWEVOX21hc2sgPSAwOworCW91dGIoaW5iKGlvICsgSVQ4N19DSVJfUkNSKSAmIH5JVDg3X0NJUl9SQ1JfUlhFTiwKKwkgICAgIGlvICsgSVQ4N19DSVJfUkNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJaXQ4N19iaXRzX2luX2J5dGVfb3V0ID0gMDsKKwlpdDg3X3NlbmRfY291bnRlciA9IDA7Cit9CisKKworc3RhdGljIHZvaWQgdGVybWluYXRlX3NlbmQodW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGxhc3QgPSAwOworCisJbGFzdCA9IGl0ODdfc2VuZF9jb3VudGVyOworCS8qIG1ha2Ugc3VyZSBhbGwgbmVjZXNzYXJ5IGRhdGEgaGFzIGJlZW4gc2VudCAqLworCXdoaWxlIChsYXN0ID09IGl0ODdfc2VuZF9jb3VudGVyKQorCQlzZW5kX3NwYWNlKGxlbik7CisJLyogd2FpdCB1bnRpbCBhbGwgZGF0YSBzZW50ICovCisJd2hpbGUgKChpbmIoaW8gKyBJVDg3X0NJUl9UU1IpICYgSVQ4N19DSVJfVFNSX1RYRkJDKSAhPSAwKQorCQk7CisJLyogdGhlbiByZS1lbmFibGUgcmVjZWl2ZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWl0ODdfUlhFTl9tYXNrID0gSVQ4N19DSVJfUkNSX1JYRU47CisJb3V0YihpbmIoaW8gKyBJVDg3X0NJUl9SQ1IpIHwgSVQ4N19DSVJfUkNSX1JYRU4sCisJICAgICBpbyArIElUODdfQ0lSX1JDUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9oYXJkd2FyZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBpdDg3X3JjciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCS8qIGluaXQgY2lyLXBvcnQgKi8KKwkvKiBlbmFibGUgci93LWFjY2VzcyB0byBCYXVkcmF0ZS1SZWdpc3RlciAqLworCW91dGIoSVQ4N19DSVJfSUVSX0JSLCBpbyArIElUODdfQ0lSX0lFUik7CisJb3V0YihJVDg3X0NJUl9CQVVEUkFURV9ESVZJU09SICUgMHgxMDAsIGlvK0lUODdfQ0lSX0JETFIpOworCW91dGIoSVQ4N19DSVJfQkFVRFJBVEVfRElWSVNPUiAvIDB4MTAwLCBpbytJVDg3X0NJUl9CREhSKTsKKwkvKiBCYXVkcmF0ZSBSZWdpc3RlciBvZmYsIGRlZmluZSBJUlFzOiBJbnB1dCBvbmx5ICovCisJaWYgKGRpZ2ltYXRyaXgpIHsKKwkJb3V0YihJVDg3X0NJUl9JRVJfSUVDIHwgSVQ4N19DSVJfSUVSX1JGT0lFLCBpbyArIElUODdfQ0lSX0lFUik7CisJCS8qIFJYOiBIQ0ZTPTAsIFJYRENSID0gMDAxYiAoMzMsNzUuLjM4LDI1IGtIeiksIFJYRU49MSAqLworCX0gZWxzZSB7CisJCW91dGIoSVQ4N19DSVJfSUVSX0lFQyB8IElUODdfQ0lSX0lFUl9SREFJRSwgaW8gKyBJVDg3X0NJUl9JRVIpOworCQkvKiBSWDogSENGUz0wLCBSWERDUiA9IDAwMWIgKDM1LDYuLjQwLDMga0h6KSwgUlhFTj0xICovCisJfQorCWl0ODdfcmNyID0gKElUODdfQ0lSX1JDUl9SWEVOICYgaXQ4N19SWEVOX21hc2spIHwgMHgxOworCWlmIChpdDg3X2VuYWJsZV9kZW1vZHVsYXRvcikKKwkJaXQ4N19yY3IgfD0gSVQ4N19DSVJfUkNSX1JYRU5EOworCW91dGIoaXQ4N19yY3IsIGlvICsgSVQ4N19DSVJfUkNSKTsKKwlpZiAoZGlnaW1hdHJpeCkgeworCQkvKiBTZXQgRklGTyBkZXB0aCB0byAxIGJ5dGUsIGFuZCBkaXNhYmxlIFRYICovCisJCW91dGIoaW5iKGlvICsgSVQ4N19DSVJfVENSMSkgfCAgMHgwMCwKKwkJICAgICBpbyArIElUODdfQ0lSX1RDUjEpOworCisJCS8qCisJCSAqIFRYOiBpdDg3X2ZyZXEgKDM2a0h6KSwgJ3Jlc2VydmVkJyBzZW5zaXRpdml0eQorCQkgKiBzZXR0aW5nICgweDAwKQorCQkgKi8KKwkJb3V0YigoKGl0ODdfZnJlcSAtIElUODdfQ0lSX0ZSRVFfTUlOKSA8PCAzKSB8IDB4MDAsCisJCSAgICAgaW8gKyBJVDg3X0NJUl9UQ1IyKTsKKwl9IGVsc2UgeworCQkvKiBUWDogMzhrSHosIDEzLDN1cyAocHVsc2Utd2lkdGgpICovCisJCW91dGIoKChpdDg3X2ZyZXEgLSBJVDg3X0NJUl9GUkVRX01JTikgPDwgMykgfCAweDA2LAorCQkgICAgIGlvICsgSVQ4N19DSVJfVENSMik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBkcm9wX2hhcmR3YXJlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZGlzYWJsZV9pcnEoaXJxKTsKKwkvKiByZWNlaXZlciBkaXNhYmxlICovCisJaXQ4N19SWEVOX21hc2sgPSAwOworCW91dGIoMHgxLCBpbyArIElUODdfQ0lSX1JDUik7CisJLyogdHVybiBvZmYgaXJxcyAqLworCW91dGIoMCwgaW8gKyBJVDg3X0NJUl9JRVIpOworCS8qIGZpZm8gY2xlYXIgKi8KKwlvdXRiKElUODdfQ0lSX1RDUjFfRklGT0NMUiwgaW8rSVQ4N19DSVJfVENSMSk7CisJLyogcmVzZXQgKi8KKwlvdXRiKElUODdfQ0lSX0lFUl9SRVNFVCwgaW8rSVQ4N19DSVJfSUVSKTsKKwllbmFibGVfaXJxKGlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGl0ODdfcmVhZCh1bnNpZ25lZCBjaGFyIHBvcnQpCit7CisJb3V0Yihwb3J0LCBJVDg3X0FEUlBPUlQpOworCXJldHVybiBpbmIoSVQ4N19EQVRBUE9SVCk7Cit9CisKKworc3RhdGljIHZvaWQgaXQ4N193cml0ZSh1bnNpZ25lZCBjaGFyIHBvcnQsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKHBvcnQsIElUODdfQURSUE9SVCk7CisJb3V0YihkYXRhLCBJVDg3X0RBVEFQT1JUKTsKK30KKworCisvKiBTRUNUSU9OOiBJbml0aWFsaXNhdGlvbiAqLworCitzdGF0aWMgaW50IGluaXRfcG9ydCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaHdfZmxhZ3M7CisJaW50IHJldHZhbCA9IDA7CisKKwl1bnNpZ25lZCBjaGFyIGluaXRfYnl0ZXNbNF0gPSBJVDg3X0lOSVQ7CisJdW5zaWduZWQgY2hhciBpdDg3X2NoaXBpZCA9IDA7CisJdW5zaWduZWQgY2hhciBsZG4gPSAwOworCXVuc2lnbmVkIGludCAgaXQ4N19pbyA9IDA7CisJdW5zaWduZWQgaW50ICBpdDg3X2lycSA9IDA7CisKKwkvKiBFbnRlciBNQiBQblAgTW9kZSAqLworCW91dGIoaW5pdF9ieXRlc1swXSwgSVQ4N19BRFJQT1JUKTsKKwlvdXRiKGluaXRfYnl0ZXNbMV0sIElUODdfQURSUE9SVCk7CisJb3V0Yihpbml0X2J5dGVzWzJdLCBJVDg3X0FEUlBPUlQpOworCW91dGIoaW5pdF9ieXRlc1szXSwgSVQ4N19BRFJQT1JUKTsKKworCS8qIDg3MTIgb3IgODcwNSA/ICovCisJaXQ4N19jaGlwaWQgPSBpdDg3X3JlYWQoSVQ4N19DSElQX0lEMSk7CisJaWYgKGl0ODdfY2hpcGlkICE9IDB4ODcpIHsKKwkJcmV0dmFsID0gLUVOWElPOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpdDg3X2NoaXBpZCA9IGl0ODdfcmVhZChJVDg3X0NISVBfSUQyKTsKKwlpZiAoKGl0ODdfY2hpcGlkICE9IDB4MDUpICYmCisJCShpdDg3X2NoaXBpZCAhPSAweDEyKSAmJgorCQkoaXQ4N19jaGlwaWQgIT0gMHgxOCkgJiYKKwkJKGl0ODdfY2hpcGlkICE9IDB4MjApKSB7CisJCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogbm8gSVQ4NzA0LzA1LzEyLzE4LzIwIGZvdW5kIChjbGFpbWVkIElUODclMDJ4KSwgIgorCQkgICAgICAgImV4aXRpbmcuLlxuIiwgaXQ4N19jaGlwaWQpOworCQlyZXR2YWwgPSAtRU5YSU87CisJCXJldHVybiByZXR2YWw7CisJfQorCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRQorCSAgICAgICAiOiBmb3VuZCBJVDg3JTAyeC5cbiIsCisJICAgICAgIGl0ODdfY2hpcGlkKTsKKworCS8qIGdldCBJL08tUG9ydCBhbmQgSVJRICovCisJaWYgKGl0ODdfY2hpcGlkID09IDB4MTIgfHwgaXQ4N19jaGlwaWQgPT0gMHgxOCkKKwkJbGRuID0gSVQ4NzEyX0NJUl9MRE47CisJZWxzZQorCQlsZG4gPSBJVDg3MDVfQ0lSX0xETjsKKwlpdDg3X3dyaXRlKElUODdfTEROLCBsZG4pOworCisJaXQ4N19pbyA9IGl0ODdfcmVhZChJVDg3X0NJUl9CQVNFX01TQikgKiAyNTYgKworCQkgIGl0ODdfcmVhZChJVDg3X0NJUl9CQVNFX0xTQik7CisJaWYgKGl0ODdfaW8gPT0gMCkgeworCQlpZiAoaW8gPT0gMCkKKwkJCWlvID0gSVQ4N19DSVJfREVGQVVMVF9JT0JBU0U7CisJCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogc2V0IGRlZmF1bHQgaW8gMHgleFxuIiwKKwkJICAgICAgIGlvKTsKKwkJaXQ4N193cml0ZShJVDg3X0NJUl9CQVNFX01TQiwgaW8gLyAweDEwMCk7CisJCWl0ODdfd3JpdGUoSVQ4N19DSVJfQkFTRV9MU0IsIGlvICUgMHgxMDApOworCX0gZWxzZQorCQlpbyA9IGl0ODdfaW87CisKKwlpdDg3X2lycSA9IGl0ODdfcmVhZChJVDg3X0NJUl9JUlEpOworCWlmIChkaWdpbWF0cml4IHx8IGl0ODdfaXJxID09IDApIHsKKwkJaWYgKGlycSA9PSAwKQorCQkJaXJxID0gSVQ4N19DSVJfREVGQVVMVF9JUlE7CisJCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogc2V0IGRlZmF1bHQgaXJxIDB4JXhcbiIsCisJCSAgICAgICBpcnEpOworCQlpdDg3X3dyaXRlKElUODdfQ0lSX0lSUSwgaXJxKTsKKwl9IGVsc2UKKwkJaXJxID0gaXQ4N19pcnE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGFyZHdhcmVfbG9jaywgaHdfZmxhZ3MpOworCS8qIHJlc2V0ICovCisJb3V0YihJVDg3X0NJUl9JRVJfUkVTRVQsIGlvK0lUODdfQ0lSX0lFUik7CisJLyogZmlmbyBjbGVhciAqLworCW91dGIoSVQ4N19DSVJfVENSMV9GSUZPQ0xSIHwKKwkgICAgIC8qCSAgICAgSVQ4N19DSVJfVENSMV9JTEUgfCAqLworCSAgICAgSVQ4N19DSVJfVENSMV9UWFJMRSB8CisJICAgICBJVDg3X0NJUl9UQ1IxX1RYRU5ERiwgaW8rSVQ4N19DSVJfVENSMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVfbG9jaywgaHdfZmxhZ3MpOworCisJLyogZ2V0IEkvTyBwb3J0IGFjY2VzcyBhbmQgSVJRIGxpbmUgKi8KKwlpZiAocmVxdWVzdF9yZWdpb24oaW8sIDgsIExJUkNfRFJJVkVSX05BTUUpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExJUkNfRFJJVkVSX05BTUUKKwkJICAgICAgICI6IGkvbyBwb3J0IDB4JS40eCBhbHJlYWR5IGluIHVzZS5cbiIsIGlvKTsKKwkJLyogTGVhdmluZyBNQiBQblAgTW9kZSAqLworCQlpdDg3X3dyaXRlKElUODdfQ0ZHQ1RSTCwgMHgyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBhY3RpdmF0ZSBDSVItRGV2aWNlICovCisJaXQ4N193cml0ZShJVDg3X0NJUl9BQ1QsIDB4MSk7CisKKwkvKiBMZWF2aW5nIE1CIFBuUCBNb2RlICovCisJaXQ4N193cml0ZShJVDg3X0NGR0NUUkwsIDB4Mik7CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIGl0ODdfaW50ZXJydXB0LCAwIC8qSVJRRl9ESVNBQkxFRCovLAorCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCBOVUxMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJICAgICAgIGlycSk7CisJCXJlbGVhc2VfcmVnaW9uKGlvLCA4KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIExJUkNfRFJJVkVSX05BTUUKKwkgICAgICAgIjogSS9PIHBvcnQgMHglLjR4LCBJUlEgJWQuXG4iLCBpbywgaXJxKTsKKworCWluaXRfdGltZXIoJnRpbWVybGlzdCk7CisJdGltZXJsaXN0LmZ1bmN0aW9uID0gaXQ4N190aW1lb3V0OworCXRpbWVybGlzdC5kYXRhID0gMHhhYmFkY2FmZTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGRyb3BfcG9ydCh2b2lkKQoreworI2lmIDAKKwl1bnNpZ25lZCBjaGFyIGluaXRfYnl0ZXNbNF0gPSBJVDg3X0lOSVQ7CisKKwkvKiBFbnRlciBNQiBQblAgTW9kZSAqLworCW91dGIoaW5pdF9ieXRlc1swXSwgSVQ4N19BRFJQT1JUKTsKKwlvdXRiKGluaXRfYnl0ZXNbMV0sIElUODdfQURSUE9SVCk7CisJb3V0Yihpbml0X2J5dGVzWzJdLCBJVDg3X0FEUlBPUlQpOworCW91dGIoaW5pdF9ieXRlc1szXSwgSVQ4N19BRFJQT1JUKTsKKworCS8qIGRlYWN0aXZhdGUgQ0lSLURldmljZSAqLworCWl0ODdfd3JpdGUoSVQ4N19DSVJfQUNULCAweDApOworCisJLyogTGVhdmluZyBNQiBQblAgTW9kZSAqLworCWl0ODdfd3JpdGUoSVQ4N19DRkdDVFJMLCAweDIpOworI2VuZGlmCisKKwlkZWxfdGltZXJfc3luYygmdGltZXJsaXN0KTsKKwlmcmVlX2lycShpcnEsIE5VTEwpOworCXJlbGVhc2VfcmVnaW9uKGlvLCA4KTsKK30KKworCitzdGF0aWMgaW50IGluaXRfbGlyY19pdDg3KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxpcmNfcmVhZF9xdWV1ZSk7CisJcmV0dmFsID0gaW5pdF9wb3J0KCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJaW5pdF9oYXJkd2FyZSgpOworCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRSAiOiBJbnN0YWxsZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDg3X3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQoreworCWludCByZXR2YWw7CisKKwlkcml2ZXIuZGV2ID0gJnBucF9kZXYtPmRldjsKKworCXJldHZhbCA9IGluaXRfY2hyZGV2KCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBpbml0X2xpcmNfaXQ4NygpOworCWlmIChyZXR2YWwpCisJCWdvdG8gaW5pdF9saXJjX2l0ODdfZmFpbGVkOworCisJcmV0dXJuIDA7CisKK2luaXRfbGlyY19pdDg3X2ZhaWxlZDoKKwlkcm9wX2NocmRldigpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2luaXQgbGlyY19pdDg3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaXQ4N19wbnBfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgbGlyY19pdDg3X2V4aXQodm9pZCkKK3sKKwlkcm9wX2hhcmR3YXJlKCk7CisJZHJvcF9jaHJkZXYoKTsKKwlkcm9wX3BvcnQoKTsKKwlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJml0ODdfcG5wX2RyaXZlcik7CisJcHJpbnRrKEtFUk5fSU5GTyBMSVJDX0RSSVZFUl9OQU1FICI6IFVuaW5zdGFsbGVkLlxuIik7Cit9CisKKy8qIFNFQ1RJT046IFBOUCBmb3IgSVRFODcwNC8xOCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgcG5wX2Rldl90YWJsZVtdID0geworCXsiSVRFODcwNCIsIDB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgcG5wX2Rldl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciBpdDg3X3BucF9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgID0gTElSQ19EUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgICAgICAgPSBwbnBfZGV2X3RhYmxlLAorCS5wcm9iZQkJPSBpdDg3X3Byb2JlLAorfTsKKworbW9kdWxlX2luaXQobGlyY19pdDg3X2luaXQpOworbW9kdWxlX2V4aXQobGlyY19pdDg3X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxJUkMgZHJpdmVyIGZvciBJVEUgSVQ4NzA0LzA1LzEyLzE4LzIwIENJUiBwb3J0Iik7CitNT0RVTEVfQVVUSE9SKCJIYW5zLUd1bnRlciBMdXRrZSBVcGh1ZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MgKGRlZmF1bHQ6IDB4MzEwKSIpOworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIFNfSVJVR08pOworI2lmZGVmIExJUkNfSVQ4N19ESUdJTUFUUklYCitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkludGVycnVwdCAoMSwzLTEyKSAoZGVmYXVsdDogOSkiKTsKKyNlbHNlCitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkludGVycnVwdCAoMSwzLTEyKSAoZGVmYXVsdDogNykiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oaXQ4N19lbmFibGVfZGVtb2R1bGF0b3IsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpdDg3X2VuYWJsZV9kZW1vZHVsYXRvciwKKwkJICJSZWNlaXZlciBkZW1vZHVsYXRvciBlbmFibGUvZGlzYWJsZSAoMS8wKSwgZGVmYXVsdDogMCIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIik7CisKK21vZHVsZV9wYXJhbShkaWdpbWF0cml4LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CisjaWZkZWYgTElSQ19JVDg3X0RJR0lNQVRSSVgKK01PRFVMRV9QQVJNX0RFU0MoZGlnaW1hdHJpeCwKKwkiQXN1cyBEaWdpbWF0cml4IGl0ODcgY29tcGF0LiBlbmFibGUvZGlzYWJsZSAoMS8wKSwgZGVmYXVsdDogMSIpOworI2Vsc2UKK01PRFVMRV9QQVJNX0RFU0MoZGlnaW1hdHJpeCwKKwkiQXN1cyBEaWdpbWF0cml4IGl0ODcgY29tcGF0LiBlbmFibGUvZGlzYWJsZSAoMS8wKSwgZGVmYXVsdDogMCIpOworI2VuZGlmCisKKworbW9kdWxlX3BhcmFtKGl0ODdfZnJlcSwgaW50LCBTX0lSVUdPKTsKKyNpZmRlZiBMSVJDX0lUODdfRElHSU1BVFJJWAorTU9EVUxFX1BBUk1fREVTQyhpdDg3X2ZyZXEsCisgICAgIkNhcnJpZXIgZGVtb2R1bGF0b3IgZnJlcXVlbmN5IChrSHopLCAoZGVmYXVsdDogMzYpIik7CisjZWxzZQorTU9EVUxFX1BBUk1fREVTQyhpdDg3X2ZyZXEsCisgICAgIkNhcnJpZXIgZGVtb2R1bGF0b3IgZnJlcXVlbmN5IChrSHopLCAoZGVmYXVsdDogMzgpIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaXQ4Ny5oIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pdDg3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwMjFjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaXQ4Ny5oCkBAIC0wLDAgKzEsMTE2IEBACisvKiBsaXJjX2l0ODcuaCAqLworLyogU0VDVElPTjogRGVmaW5pdGlvbnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJVEUgSVQ4N3h4ICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogYmFzZWQgb24gdGhlIGZvbGxvd2luZyBkb2N1bWVudGF0aW9uIGZyb20gSVRFOgorICAgYSkgSVQ4NzEyRiBQcmVsaW1pbmFyeSBDSVIgUHJvZ3JhbW1pbmcgR3VpZGUgVjAuMQorICAgYikgSVQ4NzA1RiBTaW1wbGUgTFBDIEkvTyBQcmVsaW1pbmFyeSBTcGVjaWZpY2F0aW9uIFYwLjMKKyAgIGMpIElUODcxMkYgRUMtTFBDIEkvTyBQcmVsaW1pbmFyeSBTcGVjaWZpY2F0aW9uIFYwLjUKKyovCisKKy8qIElUODcxMi8wNSBQb3J0czogKi8KKyNkZWZpbmUgSVQ4N19BRFJQT1JUICAgICAgMHgyZQorI2RlZmluZSBJVDg3X0RBVEFQT1JUICAgICAweDJmCisjZGVmaW5lIElUODdfSU5JVCAgICAgICAgIHsweDg3LCAweDAxLCAweDU1LCAweDU1fQorCisvKiBhbHRlcm5hdGUgUG9ydHM6ICovCisvKgorI2RlZmluZSBJVDg3X0FEUlBPUlQgICAgICAweDRlCisjZGVmaW5lIElUODdfREFUQVBPUlQgICAgIDB4NGYKKyNkZWZpbmUgSVQ4N19JTklUICAgICAgICAgezB4ODcsIDB4MDEsIDB4NTUsIDB4YWF9CisgKi8KKworLyogSVQ4NzEyLzA1IFJlZ2lzdGVycyAqLworI2RlZmluZSBJVDg3X0NGR0NUUkwgICAgICAweDIKKyNkZWZpbmUgSVQ4N19MRE4gICAgICAgICAgMHg3CisjZGVmaW5lIElUODdfQ0hJUF9JRDEgICAgIDB4MjAKKyNkZWZpbmUgSVQ4N19DSElQX0lEMiAgICAgMHgyMQorI2RlZmluZSBJVDg3X0NGR19WRVJTSU9OICAweDIyCisjZGVmaW5lIElUODdfU1dTVVNQRU5EICAgIDB4MjMKKworI2RlZmluZSBJVDg3MTJfQ0lSX0xETiAgICAweGEKKyNkZWZpbmUgSVQ4NzA1X0NJUl9MRE4gICAgMHg3CisKKy8qIENJUiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSVQ4N19DSVJfQUNUICAgICAgMHgzMAorI2RlZmluZSBJVDg3X0NJUl9CQVNFX01TQiAweDYwCisjZGVmaW5lIElUODdfQ0lSX0JBU0VfTFNCIDB4NjEKKyNkZWZpbmUgSVQ4N19DSVJfSVJRICAgICAgMHg3MAorI2RlZmluZSBJVDg3X0NJUl9DT05GSUcgICAweGYwCisKKy8qIExpc3Qgb2YgSVQ4N19DSVIgcmVnaXN0ZXJzOiBvZmZzZXQgdG8gQmFzZUFkZHIgKi8KKyNkZWZpbmUgSVQ4N19DSVJfRFIgICAwCisjZGVmaW5lIElUODdfQ0lSX0lFUiAgMQorI2RlZmluZSBJVDg3X0NJUl9SQ1IgIDIKKyNkZWZpbmUgSVQ4N19DSVJfVENSMSAzCisjZGVmaW5lIElUODdfQ0lSX1RDUjIgNAorI2RlZmluZSBJVDg3X0NJUl9UU1IgIDUKKyNkZWZpbmUgSVQ4N19DSVJfUlNSICA2CisjZGVmaW5lIElUODdfQ0lSX0JETFIgNQorI2RlZmluZSBJVDg3X0NJUl9CREhSIDYKKyNkZWZpbmUgSVQ4N19DSVJfSUlSICA3CisKKy8qIEJpdCBEZWZpbml0aW9uICovCisvKiBJRVI6ICovCisjZGVmaW5lIElUODdfQ0lSX0lFUl9UTV9FTiAgIDB4ODAKKyNkZWZpbmUgSVQ4N19DSVJfSUVSX1JFU0VWRUQgMHg0MAorI2RlZmluZSBJVDg3X0NJUl9JRVJfUkVTRVQgICAweDIwCisjZGVmaW5lIElUODdfQ0lSX0lFUl9CUiAgICAgIDB4MTAKKyNkZWZpbmUgSVQ4N19DSVJfSUVSX0lFQyAgICAgMHg4CisjZGVmaW5lIElUODdfQ0lSX0lFUl9SRk9JRSAgIDB4NAorI2RlZmluZSBJVDg3X0NJUl9JRVJfUkRBSUUgICAweDIKKyNkZWZpbmUgSVQ4N19DSVJfSUVSX1RMRExJRSAgMHgxCisKKy8qIFJDUjogKi8KKyNkZWZpbmUgSVQ4N19DSVJfUkNSX1JEV09TICAweDgwCisjZGVmaW5lIElUODdfQ0lSX1JDUl9IQ0ZTICAgMHg0MAorI2RlZmluZSBJVDg3X0NJUl9SQ1JfUlhFTiAgIDB4MjAKKyNkZWZpbmUgSVQ4N19DSVJfUkNSX1JYRU5EICAweDEwCisjZGVmaW5lIElUODdfQ0lSX1JDUl9SWEFDVCAgMHg4CisjZGVmaW5lIElUODdfQ0lSX1JDUl9SWERDUiAgMHg3CisKKy8qIFRDUjE6ICovCisjZGVmaW5lIElUODdfQ0lSX1RDUjFfRklGT0NMUiAweDgwCisjZGVmaW5lIElUODdfQ0lSX1RDUjFfSUxFICAgICAweDQwCisjZGVmaW5lIElUODdfQ0lSX1RDUjFfRklGT1RMICAweDMwCisjZGVmaW5lIElUODdfQ0lSX1RDUjFfVFhSTEUgICAweDgKKyNkZWZpbmUgSVQ4N19DSVJfVENSMV9UWEVOREYgIDB4NAorI2RlZmluZSBJVDg3X0NJUl9UQ1IxX1RYTVBNICAgMHgzCisKKy8qIFRDUjI6ICovCisjZGVmaW5lIElUODdfQ0lSX1RDUjJfQ0ZRICAgMHhmOAorI2RlZmluZSBJVDg3X0NJUl9UQ1IyX1RYTVBXIDB4NworCisvKiBUU1I6ICovCisjZGVmaW5lIElUODdfQ0lSX1RTUl9SRVNFUlZFRCAweGMwCisjZGVmaW5lIElUODdfQ0lSX1RTUl9UWEZCQyAgICAweDNmCisKKy8qIFJTUjogKi8KKyNkZWZpbmUgSVQ4N19DSVJfUlNSX1JYRlRPICAgIDB4ODAKKyNkZWZpbmUgSVQ4N19DSVJfUlNSX1JFU0VSVkVEIDB4NDAKKyNkZWZpbmUgSVQ4N19DSVJfUlNSX1JYRkJDICAgIDB4M2YKKworLyogSUlSOiAqLworI2RlZmluZSBJVDg3X0NJUl9JSVJfUkVTRVJWRUQgMHhmOAorI2RlZmluZSBJVDg3X0NJUl9JSVJfSUlEICAgICAgMHg2CisjZGVmaW5lIElUODdfQ0lSX0lJUl9JSVAgICAgICAweDEKKworLyogVE06ICovCisjZGVmaW5lIElUODdfQ0lSX1RNX0lMX1NFTCAgICAweDgwCisjZGVmaW5lIElUODdfQ0lSX1RNX1JFU0VSVkVEICAweDQwCisjZGVmaW5lIElUODdfQ0lSX1RNX1RNX1JFRyAgICAweDNmCisKKyNkZWZpbmUgSVQ4N19DSVJfRklGT19TSVpFIDMyCisKKy8qIEJhdWRyYXRlZGl2aXNvciBmb3IgSVQ4NzogcG93ZXIgb2YgMjogb25seSAxLDIsNCBvciA4KSAqLworI2RlZmluZSBJVDg3X0NJUl9CQVVEUkFURV9ESVZJU09SIDB4MQorI2RlZmluZSBJVDg3X0NJUl9ERUZBVUxUX0lPQkFTRSAweDMxMAorI2RlZmluZSBJVDg3X0NJUl9ERUZBVUxUX0lSUSAgICAweDcKKyNkZWZpbmUgSVQ4N19DSVJfU1BBQ0UgMHgwMAorI2RlZmluZSBJVDg3X0NJUl9QVUxTRSAweGZmCisjZGVmaW5lIElUODdfQ0lSX0ZSRVFfTUlOIDI3CisjZGVmaW5lIElUODdfQ0lSX0ZSRVFfTUFYIDU4CisjZGVmaW5lIFRJTUVfQ09OU1QgKElUODdfQ0lSX0JBVURSQVRFX0RJVklTT1IgKiA4MDAwMDAwdWwgLyAxMTUyMDB1bCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJVEUgSVQ4N3h4ICoqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaXRlODcwOS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pdGU4NzA5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1MmY0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaXRlODcwOS5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogTElSQyBkcml2ZXIgZm9yIElURTg3MDkgQ0lSIHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR3LDqWdvcnkgTGFyZGnDqHJlIDxzcG1mMjAwNC1saXJjQHlhaG9vLmZyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL2xpcmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgorCisjZGVmaW5lIExJUkNfRFJJVkVSX05BTUUgImxpcmNfaXRlODcwOSIKKworI2RlZmluZSBCVUZfQ0hVTktfU0laRQlzaXplb2YoaW50KQorI2RlZmluZSBCVUZfU0laRQkoMTI4KkJVRl9DSFVOS19TSVpFKQorCisvKgorICogVGhlIElURTg3MDkgZGV2aWNlIHNlZW1zIHRvIGJlIHRoZSBjb21iaW5hdGlvbiBvZiBJVDg1MTIgc3VwZXJJTyBjaGlwIGFuZAorICogYSBzcGVjaWZpYyBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBJVDg1MTIncyBlbWJlZGRlZCBtaWNyby1jb250cm9sbGVyLgorICogSW4gYWRkaXRpb24gb2YgdGhlIGVtYmVkZGVkIG1pY3JvLWNvbnRyb2xsZXIsIHRoZSBJVDg1MTIgY2hpcCBjb250YWlucyBhCisgKiBDSVIgbW9kdWxlIGFuZCBzZXZlcmFsIG90aGVyIG1vZHVsZXMuIEEgZmV3IG1vZHVsZXMgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUKKyAqIGJ5IHRoZSBob3N0IENQVSwgYnV0IG1vc3Qgb2YgdGhlbSBhcmUgb25seSBhY2Nlc3NpYmxlIGJ5IHRoZQorICogbWljcm8tY29udHJvbGxlci4gVGhlIENJUiBtb2R1bGUgaXMgb25seSBhY2Nlc3NpYmxlIGJ5IHRoZSBtaWNyby1jb250cm9sbGVyLgorICogVGhlIGJhdHRlcnktYmFja2VkIFNSQU0gbW9kdWxlIGlzIGFjY2Vzc2libGUgYnkgdGhlIGhvc3QgQ1BVIGFuZCB0aGUKKyAqIG1pY3JvLWNvbnRyb2xsZXIuIFNvIG9uZSBvZiB0aGUgTUMncyBmaXJtd2FyZSByb2xlIGlzIHRvIGFjdCBhcyBhIGJyaWRnZQorICogYmV0d2VlbiB0aGUgaG9zdCBDUFUgYW5kIHRoZSBDSVIgbW9kdWxlLiBUaGUgZmlybXdhcmUgaW1wbGVtZW50cyBhIGtpbmQgb2YKKyAqIGNvbW11bmljYXRpb24gcHJvdG9jb2wgdXNpbmcgdGhlIFNSQU0gbW9kdWxlIGFzIGEgc2hhcmVkIG1lbW9yeS4gVGhlIElUODUxMgorICogc3BlY2lmaWNhdGlvbiBpcyBwdWJsaWNseSBhdmFpbGFibGUgb24gSVRFJ3Mgd2ViIHNpdGUsIGJ1dCB0aGUgY29tbXVuaWNhdGlvbgorICogcHJvdG9jb2wgaXMgbm90LCBzbyBpdCB3YXMgcmV2ZXJzZS1lbmdpbmVlcmVkLgorICovCisKKy8qIElURTg3MDkgUmVnaXN0ZXJzIGFkZHJlc3NlcyBhbmQgdmFsdWVzIChyZXZlcnNlLWVuZ2luZWVyZWQpICovCisjZGVmaW5lIElURTg3MDlfTU9ERQkJMHgxYQorI2RlZmluZSBJVEU4NzA5X1JFR19BRFIJCTB4MWIKKyNkZWZpbmUgSVRFODcwOV9SRUdfVkFMCQkweDFjCisjZGVmaW5lIElURTg3MDlfSUlSCQkweDFlICAvKiBJbnRlcnJ1cHQgaWRlbnRpZmljYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVRFODcwOV9SRlNSCQkweDFmICAvKiBSZWNlaXZlciBGSUZPIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJVEU4NzA5X0ZJRk9fU1RBUlQJMHgyMAorCisjZGVmaW5lIElURTg3MDlfTU9ERV9SRUFEWQkwWDAwCisjZGVmaW5lIElURTg3MDlfTU9ERV9XUklURQkwWDAxCisjZGVmaW5lIElURTg3MDlfTU9ERV9SRUFECTBYMDIKKyNkZWZpbmUgSVRFODcwOV9JSVJfUkRBSQkweDAyICAvKiBSZWNlaXZlciBkYXRhIGF2YWlsYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVRFODcwOV9JSVJfUkZPSQkweDA0ICAvKiBSZWNlaXZlciBGSUZPIG92ZXJydW4gaW50ZXJydXB0ICovCisjZGVmaW5lIElURTg3MDlfUkZTUl9NQVNLCTB4M2YgIC8qIEZJRk8gYnl0ZSBjb3VudCBtYXNrICovCisKKy8qCisgKiBJVDg1MTIgQ0lSLW1vZHVsZSByZWdpc3RlcnMgYWRkcmVzc2VzIGFuZCB2YWx1ZXMKKyAqIChmcm9tIElUODUxMiBFL0Ygc3BlY2lmaWNhdGlvbiB2MC40LjEpCisgKi8KKyNkZWZpbmUgSVQ4NTEyX1JFR19NU1RDUgkweDAxICAvKiBNYXN0ZXIgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJVDg1MTJfUkVHX0lFUgkJMHgwMiAgLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworI2RlZmluZSBJVDg1MTJfUkVHX0NGUgkJMHgwNCAgLyogQ2FycmllciBmcmVxdWVuY3kgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVQ4NTEyX1JFR19SQ1IJCTB4MDUgIC8qIFJlY2VpdmUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJVDg1MTJfUkVHX0JETFIJCTB4MDggIC8qIEJhdWQgcmF0ZSBkaXZpc29yIGxvdyBieXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIElUODUxMl9SRUdfQkRIUgkJMHgwOSAgLyogQmF1ZCByYXRlIGRpdmlzb3IgaGlnaCBieXRlIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSVQ4NTEyX01TVENSX1JFU0VUCTB4MDEgIC8qIFJlc2V0IHJlZ2lzdGVycyB0byBkZWZhdWx0IHZhbHVlICovCisjZGVmaW5lIElUODUxMl9NU1RDUl9GSUZPQ0xSCTB4MDIgIC8qIENsZWFyIEZJRk8gKi8KKyNkZWZpbmUgSVQ4NTEyX01TVENSX0ZJRk9UTF83CTB4MDQgIC8qIEZJRk8gdGhyZXNob2xkIGxldmVsIDogNyAqLworI2RlZmluZSBJVDg1MTJfTVNUQ1JfRklGT1RMXzI1CTB4MGMgIC8qIEZJRk8gdGhyZXNob2xkIGxldmVsIDogMjUgKi8KKyNkZWZpbmUgSVQ4NTEyX0lFUl9SREFJRQkweDAyICAvKiBFbmFibGUgZGF0YSBpbnRlcnJ1cHQgcmVxdWVzdCAqLworI2RlZmluZSBJVDg1MTJfSUVSX1JGT0lFCTB4MDQgIC8qIEVuYWJsZSBGSUZPIG92ZXJydW4gaW50ZXJydXB0IHJlcSAqLworI2RlZmluZSBJVDg1MTJfSUVSX0lFQwkJMHg4MCAgLyogRW5hYmxlIGludGVycnVwdCByZXF1ZXN0ICovCisjZGVmaW5lIElUODUxMl9DRlJfQ0ZfMzZLSFoJMHgwOSAgLyogQ2FycmllciBmcmVxIDogbG93IHNwZWVkLCAzNmtIeiAqLworI2RlZmluZSBJVDg1MTJfUkNSX1JYRENSXzEJMHgwMSAgLyogRGVtb2R1bGF0aW9uIGNhcnJpZXIgcmFuZ2UgOiAxICovCisjZGVmaW5lIElUODUxMl9SQ1JfUlhBQ1QJMHgwOCAgLyogUmVjZWl2ZXIgYWN0aXZlICovCisjZGVmaW5lIElUODUxMl9SQ1JfUlhFTgkJMHg4MCAgLyogUmVjZWl2ZXIgZW5hYmxlICovCisjZGVmaW5lIElUODUxMl9CRFJfNgkJNiAgICAgLyogQmF1ZCByYXRlIGRpdmlzb3IgOiA2ICovCisKKy8qIEFjdHVhbCB2YWx1ZXMgdXNlZCBieSB0aGlzIGRyaXZlciAqLworI2RlZmluZSBDRkdfRklGT1RMCUlUODUxMl9NU1RDUl9GSUZPVExfMjUKKyNkZWZpbmUgQ0ZHX0NSX0ZSRVEJSVQ4NTEyX0NGUl9DRl8zNktIWgorI2RlZmluZSBDRkdfRENSCQlJVDg1MTJfUkNSX1JYRENSXzEKKyNkZWZpbmUgQ0ZHX0JEUgkJSVQ4NTEyX0JEUl82CisjZGVmaW5lIENGR19USU1FT1VUCTEwMDAwMCAvKiBSZWFybSBpbnRlcnJ1cHQgd2hlbiBhIHNwYWNlIGlzID4gMTAwIG1zICovCisKK3N0YXRpYyBpbnQgZGVidWc7CisKK3N0cnVjdCBpdGU4NzA5X2RldmljZSB7CisJaW50IHVzZV9jb3VudDsKKwlpbnQgaW87CisJaW50IGlycTsKKwlzcGlubG9ja190IGhhcmR3YXJlX2xvY2s7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjY19wdWxzZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWNjX3NwYWNlOworCWNoYXIgbGFzdGJpdDsKKwlzdHJ1Y3QgdGltZXZhbCBsYXN0X3R2OworCXN0cnVjdCBsaXJjX2RyaXZlciBkcml2ZXI7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CisJY2hhciBmb3JjZV9yZWFybTsKKwljaGFyIHJlYXJtZWQ7CisJY2hhciBkZXZpY2VfYnVzeTsKK307CisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChkZWJ1ZykJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHIExJUkNfRFJJVkVSX05BTUUgIjogIglcCisJCQkJZm10LCAjIyBhcmdzKTsJCQlcCisJfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdW5zaWduZWQgY2hhciBpdGU4NzA5X3JlYWQoc3RydWN0IGl0ZTg3MDlfZGV2aWNlICpkZXYsCisJCQkJCXVuc2lnbmVkIGNoYXIgcG9ydCkKK3sKKwlvdXRiKHBvcnQsIGRldi0+aW8pOworCXJldHVybiBpbmIoZGV2LT5pbysxKTsKK30KKworc3RhdGljIHZvaWQgaXRlODcwOV93cml0ZShzdHJ1Y3QgaXRlODcwOV9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBwb3J0LAorCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKHBvcnQsIGRldi0+aW8pOworCW91dGIoZGF0YSwgZGV2LT5pbysxKTsKK30KKworc3RhdGljIHZvaWQgaXRlODcwOV93YWl0X2RldmljZShzdHJ1Y3QgaXRlODcwOV9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSA9IDA7CisJLyoKKwkgKiBsb29wIHVudGlsIGRldmljZSB0ZWxscyBpdCdzIHJlYWR5IHRvIGNvbnRpbnVlCisJICogaXRlcmF0aW9ucyBjb3VudCBpcyB1c3VhbGx5IH43NTAgYnV0IGNhbiBzb21ldGltZXMgYWNoaWV2ZSAxMzAwMAorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxNTAwMDsgaSsrKSB7CisJCXVkZWxheSgyKTsKKwkJaWYgKGl0ZTg3MDlfcmVhZChkZXYsIElURTg3MDlfTU9ERSkgPT0gSVRFODcwOV9NT0RFX1JFQURZKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpdGU4NzA5X3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBpdGU4NzA5X2RldmljZSAqZGV2LAorCQkJCXVuc2lnbmVkIGNoYXIgcmVnX2FkciwgdW5zaWduZWQgY2hhciByZWdfdmFsdWUpCit7CisJaXRlODcwOV93YWl0X2RldmljZShkZXYpOworCisJaXRlODcwOV93cml0ZShkZXYsIElURTg3MDlfUkVHX1ZBTCwgcmVnX3ZhbHVlKTsKKwlpdGU4NzA5X3dyaXRlKGRldiwgSVRFODcwOV9SRUdfQURSLCByZWdfYWRyKTsKKwlpdGU4NzA5X3dyaXRlKGRldiwgSVRFODcwOV9NT0RFLCBJVEU4NzA5X01PREVfV1JJVEUpOworfQorCitzdGF0aWMgdm9pZCBpdGU4NzA5X2luaXRfaGFyZHdhcmUoc3RydWN0IGl0ZTg3MDlfZGV2aWNlICpkZXYpCit7CisJc3Bpbl9sb2NrX2lycSgmZGV2LT5oYXJkd2FyZV9sb2NrKTsKKwlkZXYtPmRldmljZV9idXN5ID0gMTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+aGFyZHdhcmVfbG9jayk7CisKKwlpdGU4NzA5X3dyaXRlX3JlZ2lzdGVyKGRldiwgSVQ4NTEyX1JFR19CREhSLCAoQ0ZHX0JEUiA+PiA4KSAmIDB4ZmYpOworCWl0ZTg3MDlfd3JpdGVfcmVnaXN0ZXIoZGV2LCBJVDg1MTJfUkVHX0JETFIsIENGR19CRFIgJiAweGZmKTsKKwlpdGU4NzA5X3dyaXRlX3JlZ2lzdGVyKGRldiwgSVQ4NTEyX1JFR19DRlIsIENGR19DUl9GUkVRKTsKKwlpdGU4NzA5X3dyaXRlX3JlZ2lzdGVyKGRldiwgSVQ4NTEyX1JFR19JRVIsCisJCQlJVDg1MTJfSUVSX0lFQyB8IElUODUxMl9JRVJfUkZPSUUgfCBJVDg1MTJfSUVSX1JEQUlFKTsKKwlpdGU4NzA5X3dyaXRlX3JlZ2lzdGVyKGRldiwgSVQ4NTEyX1JFR19SQ1IsIENGR19EQ1IpOworCWl0ZTg3MDlfd3JpdGVfcmVnaXN0ZXIoZGV2LCBJVDg1MTJfUkVHX01TVENSLAorCQkJCQlDRkdfRklGT1RMIHwgSVQ4NTEyX01TVENSX0ZJRk9DTFIpOworCWl0ZTg3MDlfd3JpdGVfcmVnaXN0ZXIoZGV2LCBJVDg1MTJfUkVHX1JDUiwKKwkJCQlJVDg1MTJfUkNSX1JYRU4gfCBJVDg1MTJfUkNSX1JYQUNUIHwgQ0ZHX0RDUik7CisKKwlzcGluX2xvY2tfaXJxKCZkZXYtPmhhcmR3YXJlX2xvY2spOworCWRldi0+ZGV2aWNlX2J1c3kgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5oYXJkd2FyZV9sb2NrKTsKKworCXRhc2tsZXRfZW5hYmxlKCZkZXYtPnRhc2tsZXQpOworfQorCitzdGF0aWMgdm9pZCBpdGU4NzA5X2Ryb3BfaGFyZHdhcmUoc3RydWN0IGl0ZTg3MDlfZGV2aWNlICpkZXYpCit7CisJdGFza2xldF9kaXNhYmxlKCZkZXYtPnRhc2tsZXQpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5oYXJkd2FyZV9sb2NrKTsKKwlkZXYtPmRldmljZV9idXN5ID0gMTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+aGFyZHdhcmVfbG9jayk7CisKKwlpdGU4NzA5X3dyaXRlX3JlZ2lzdGVyKGRldiwgSVQ4NTEyX1JFR19SQ1IsIDApOworCWl0ZTg3MDlfd3JpdGVfcmVnaXN0ZXIoZGV2LCBJVDg1MTJfUkVHX01TVENSLAorCQkJCUlUODUxMl9NU1RDUl9SRVNFVCB8IElUODUxMl9NU1RDUl9GSUZPQ0xSKTsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+aGFyZHdhcmVfbG9jayk7CisJZGV2LT5kZXZpY2VfYnVzeSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmhhcmR3YXJlX2xvY2spOworfQorCitzdGF0aWMgaW50IGl0ZTg3MDlfc2V0X3VzZV9pbmModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXRlODcwOV9kZXZpY2UgKmRldjsKKwlkZXYgPSBkYXRhOworCWlmIChkZXYtPnVzZV9jb3VudCA9PSAwKQorCQlpdGU4NzA5X2luaXRfaGFyZHdhcmUoZGV2KTsKKwlkZXYtPnVzZV9jb3VudCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpdGU4NzA5X3NldF91c2VfZGVjKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGl0ZTg3MDlfZGV2aWNlICpkZXY7CisJZGV2ID0gZGF0YTsKKwlkZXYtPnVzZV9jb3VudC0tOworCWlmIChkZXYtPnVzZV9jb3VudCA9PSAwKQorCQlpdGU4NzA5X2Ryb3BfaGFyZHdhcmUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaXRlODcwOV9hZGRfcmVhZF9xdWV1ZShzdHJ1Y3QgaXRlODcwOV9kZXZpY2UgKmRldiwgaW50IGZsYWcsCisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCit7CisJaW50IHZhbHVlOworCisJZHByaW50aygiYWRkIGEgJWxsdSB1c2VjICVzXG4iLCB2YWwsIGZsYWcgPyAicHVsc2UiIDogInNwYWNlIik7CisKKwl2YWx1ZSA9ICh2YWwgPiBQVUxTRV9NQVNLKSA/IFBVTFNFX01BU0sgOiB2YWw7CisJaWYgKGZsYWcpCisJCXZhbHVlIHw9IFBVTFNFX0JJVDsKKworCWlmICghbGlyY19idWZmZXJfZnVsbChkZXYtPmRyaXZlci5yYnVmKSkgeworCQlsaXJjX2J1ZmZlcl93cml0ZShkZXYtPmRyaXZlci5yYnVmLCAodm9pZCAqKSAmdmFsdWUpOworCQl3YWtlX3VwKCZkZXYtPmRyaXZlci5yYnVmLT53YWl0X3BvbGwpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGl0ZTg3MDlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJaW50IGlpciwgcmZzciwgaTsKKwlpbnQgZmlmbyA9IDA7CisJY2hhciBiaXQ7CisJc3RydWN0IHRpbWV2YWwgY3Vycl90djsKKworCS8qIEJpdCBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMgKi8KKwljb25zdCB1bnNpZ25lZCBsb25nIGJpdF9kdXJhdGlvbiA9IDEwMDAwMDB1bCAvICgxMTUyMDAgLyBDRkdfQkRSKTsKKworCXN0cnVjdCBpdGU4NzA5X2RldmljZSAqZGV2OworCWRldiA9IGRldl9pZDsKKworCS8qCisJICogSWYgZGV2aWNlIGlzIGJ1c3ksIHdlIHNpbXBseSBkaXNjYXJkIGRhdGEgYmVjYXVzZSB3ZSBhcmUgaW4gb25lIG9mCisJICogdGhlc2UgdHdvIGNhc2VzIDogc2h1dHRpbmcgZG93biBvciByZWFybWluZyB0aGUgZGV2aWNlLCBzbyB0aGlzCisJICogZG9lc24ndCByZWFsbHkgbWF0dGVyIGFuZCB0aGlzIGF2b2lkcyB3YWl0aW5nIHRvbyBsb25nIGluIElSUSBjdHgKKwkgKi8KKwlzcGluX2xvY2soJmRldi0+aGFyZHdhcmVfbG9jayk7CisJaWYgKGRldi0+ZGV2aWNlX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJmRldi0+aGFyZHdhcmVfbG9jayk7CisJCXJldHVybiBJUlFfUkVUVkFMKElSUV9IQU5ETEVEKTsKKwl9CisKKwlpaXIgPSBpdGU4NzA5X3JlYWQoZGV2LCBJVEU4NzA5X0lJUik7CisKKwlzd2l0Y2ggKGlpcikgeworCWNhc2UgSVRFODcwOV9JSVJfUkZPSToKKwkJZHByaW50aygiZmlmbyBvdmVycnVuLCBzY2hlZHVsaW5nIGZvcmNlZCByZWFybSBqdXN0IGluIGNhc2VcbiIpOworCQlkZXYtPmZvcmNlX3JlYXJtID0gMTsKKwkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT50YXNrbGV0KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+aGFyZHdhcmVfbG9jayk7CisJCXJldHVybiBJUlFfUkVUVkFMKElSUV9IQU5ETEVEKTsKKworCWNhc2UgSVRFODcwOV9JSVJfUkRBSToKKwkJcmZzciA9IGl0ZTg3MDlfcmVhZChkZXYsIElURTg3MDlfUkZTUik7CisJCWZpZm8gPSByZnNyICYgSVRFODcwOV9SRlNSX01BU0s7CisJCWlmIChmaWZvID4gMzIpCisJCQlmaWZvID0gMzI7CisJCWRwcmludGsoImlpcjogMHgleCByZnNyOiAweCV4IGZpZm86ICVkXG4iLCBpaXIsIHJmc3IsIGZpZm8pOworCisJCWlmIChkZXYtPnJlYXJtZWQpIHsKKwkJCWRvX2dldHRpbWVvZmRheSgmY3Vycl90dik7CisJCQlkZXYtPmFjY19zcGFjZSArPSAxMDAwMDAwdWxsCisJCQkJKiAoY3Vycl90di50dl9zZWMgLSBkZXYtPmxhc3RfdHYudHZfc2VjKQorCQkJCSsgKGN1cnJfdHYudHZfdXNlYyAtIGRldi0+bGFzdF90di50dl91c2VjKTsKKwkJCWRldi0+cmVhcm1lZCA9IDA7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGZpZm87IGkrKykgeworCQkJZGF0YSA9IGl0ZTg3MDlfcmVhZChkZXYsIGkrSVRFODcwOV9GSUZPX1NUQVJUKTsKKwkJCWRhdGEgPSB+ZGF0YTsKKwkJCS8qIExvb3AgdGhyb3VnaCAqLworCQkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyArK2JpdCkgeworCQkJCWlmICgoZGF0YSA+PiBiaXQpICYgMSkgeworCQkJCQlkZXYtPmFjY19wdWxzZSArPSBiaXRfZHVyYXRpb247CisJCQkJCWlmIChkZXYtPmxhc3RiaXQgPT0gMCkgeworCQkJCQkJaXRlODcwOV9hZGRfcmVhZF9xdWV1ZShkZXYsIDAsCisJCQkJCQkJZGV2LT5hY2Nfc3BhY2UpOworCQkJCQkJZGV2LT5hY2Nfc3BhY2UgPSAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZGV2LT5hY2Nfc3BhY2UgKz0gYml0X2R1cmF0aW9uOworCQkJCQlpZiAoZGV2LT5sYXN0Yml0ID09IDEpIHsKKwkJCQkJCWl0ZTg3MDlfYWRkX3JlYWRfcXVldWUoZGV2LCAxLAorCQkJCQkJCWRldi0+YWNjX3B1bHNlKTsKKwkJCQkJCWRldi0+YWNjX3B1bHNlID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlkZXYtPmxhc3RiaXQgPSAoZGF0YSA+PiBiaXQpICYgMTsKKwkJCX0KKwkJfQorCQlpdGU4NzA5X3dyaXRlKGRldiwgSVRFODcwOV9SRlNSLCAwKTsKKworCQlpZiAoZGV2LT5hY2Nfc3BhY2UgPiBDRkdfVElNRU9VVCkgeworCQkJZHByaW50aygic2NoZWR1bGluZyByZWFybSBJUlFcbiIpOworCQkJZG9fZ2V0dGltZW9mZGF5KCZkZXYtPmxhc3RfdHYpOworCQkJZGV2LT5mb3JjZV9yZWFybSA9IDA7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPnRhc2tsZXQpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmRldi0+aGFyZHdhcmVfbG9jayk7CisJCXJldHVybiBJUlFfUkVUVkFMKElSUV9IQU5ETEVEKTsKKworCWRlZmF1bHQ6CisJCS8qIG5vdCBvdXIgaXJxICovCisJCWRwcmludGsoInVua25vd24gSVJRIChzaG91bGRuJ3QgaGFwcGVuKSAhIVxuIik7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmhhcmR3YXJlX2xvY2spOworCQlyZXR1cm4gSVJRX1JFVFZBTChJUlFfTk9ORSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpdGU4NzA5X3JlYXJtX2lycSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGl0ZTg3MDlfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkZXYgPSAoc3RydWN0IGl0ZTg3MDlfZGV2aWNlICopIGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZGV2LT5kZXZpY2VfYnVzeSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5mb3JjZV9yZWFybSB8fCBkZXYtPmFjY19zcGFjZSA+IENGR19USU1FT1VUKSB7CisJCWRwcmludGsoInJlYXJtaW5nIElSUVxuIik7CisJCWl0ZTg3MDlfd3JpdGVfcmVnaXN0ZXIoZGV2LCBJVDg1MTJfUkVHX1JDUiwKKwkJCQkJCUlUODUxMl9SQ1JfUlhBQ1QgfCBDRkdfRENSKTsKKwkJaXRlODcwOV93cml0ZV9yZWdpc3RlcihkZXYsIElUODUxMl9SRUdfTVNUQ1IsCisJCQkJCUNGR19GSUZPVEwgfCBJVDg1MTJfTVNUQ1JfRklGT0NMUik7CisJCWl0ZTg3MDlfd3JpdGVfcmVnaXN0ZXIoZGV2LCBJVDg1MTJfUkVHX1JDUiwKKwkJCQlJVDg1MTJfUkNSX1JYRU4gfCBJVDg1MTJfUkNSX1JYQUNUIHwgQ0ZHX0RDUik7CisJCWlmICghZGV2LT5mb3JjZV9yZWFybSkKKwkJCWRldi0+cmVhcm1lZCA9IDE7CisJCWRldi0+Zm9yY2VfcmVhcm0gPSAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlkZXYtPmRldmljZV9idXN5ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBpdGU4NzA5X2NsZWFudXAoc3RydWN0IGl0ZTg3MDlfZGV2aWNlICpkZXYsIGludCBzdGFnZSwgaW50IGVycm5vLAorCQkJCWNoYXIgKm1zZykKK3sKKwlpZiAobXNnICE9IE5VTEwpCisJCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FICI6ICVzXG4iLCBtc2cpOworCisJc3dpdGNoIChzdGFnZSkgeworCWNhc2UgNjoKKwkJaWYgKGRldi0+dXNlX2NvdW50ID4gMCkKKwkJCWl0ZTg3MDlfZHJvcF9oYXJkd2FyZShkZXYpOworCWNhc2UgNToKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJY2FzZSA0OgorCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvLCAyKTsKKwljYXNlIDM6CisJCWxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIoZGV2LT5kcml2ZXIubWlub3IpOworCWNhc2UgMjoKKwkJbGlyY19idWZmZXJfZnJlZShkZXYtPmRyaXZlci5yYnVmKTsKKwkJa2ZyZWUoZGV2LT5kcml2ZXIucmJ1Zik7CisJY2FzZSAxOgorCQlrZnJlZShkZXYpOworCWNhc2UgMDoKKwkJOworCX0KKworCXJldHVybiBlcnJubzsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaXRlODcwOV9wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbGlyY19kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgaXRlODcwOV9kZXZpY2UgKml0ZTg3MDlfZGV2OworCWludCByZXQ7CisKKwkvKiBDaGVjayByZXNvdXJjZXMgdmFsaWRpdHkgKi8KKwlpZiAoIXBucF9pcnFfdmFsaWQoZGV2LCAwKSkKKwkJcmV0dXJuIGl0ZTg3MDlfY2xlYW51cChOVUxMLCAwLCAtRU5PREVWLCAiaW52YWxpZCBJUlEiKTsKKwlpZiAoIXBucF9wb3J0X3ZhbGlkKGRldiwgMikpCisJCXJldHVybiBpdGU4NzA5X2NsZWFudXAoTlVMTCwgMCwgLUVOT0RFViwgImludmFsaWQgSU8gcG9ydCIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2Ugc3RydWN0ICovCisJaXRlODcwOV9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXRlODcwOV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaXRlODcwOV9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIGl0ZTg3MDlfY2xlYW51cChOVUxMLCAwLCAtRU5PTUVNLCAia3phbGxvYyBmYWlsZWQiKTsKKwlwbnBfc2V0X2RydmRhdGEoZGV2LCBpdGU4NzA5X2Rldik7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBzdHJ1Y3QgKi8KKwlpdGU4NzA5X2Rldi0+dXNlX2NvdW50ID0gMDsKKwlpdGU4NzA5X2Rldi0+aXJxID0gcG5wX2lycShkZXYsIDApOworCWl0ZTg3MDlfZGV2LT5pbyA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMik7CisJaXRlODcwOV9kZXYtPmhhcmR3YXJlX2xvY2sgPQorCQlfX1NQSU5fTE9DS19VTkxPQ0tFRChpdGU4NzA5X2Rldi0+aGFyZHdhcmVfbG9jayk7CisJaXRlODcwOV9kZXYtPmFjY19wdWxzZSA9IDA7CisJaXRlODcwOV9kZXYtPmFjY19zcGFjZSA9IDA7CisJaXRlODcwOV9kZXYtPmxhc3RiaXQgPSAwOworCWRvX2dldHRpbWVvZmRheSgmaXRlODcwOV9kZXYtPmxhc3RfdHYpOworCXRhc2tsZXRfaW5pdCgmaXRlODcwOV9kZXYtPnRhc2tsZXQsIGl0ZTg3MDlfcmVhcm1faXJxLAorCQkJCQkJCShsb25nKSBpdGU4NzA5X2Rldik7CisJaXRlODcwOV9kZXYtPmZvcmNlX3JlYXJtID0gMDsKKwlpdGU4NzA5X2Rldi0+cmVhcm1lZCA9IDA7CisJaXRlODcwOV9kZXYtPmRldmljZV9idXN5ID0gMDsKKworCS8qIEluaXRpYWxpemUgZHJpdmVyIHN0cnVjdCAqLworCWRyaXZlciA9ICZpdGU4NzA5X2Rldi0+ZHJpdmVyOworCXN0cmNweShkcml2ZXItPm5hbWUsIExJUkNfRFJJVkVSX05BTUUpOworCWRyaXZlci0+bWlub3IgPSAtMTsKKwlkcml2ZXItPmNvZGVfbGVuZ3RoID0gc2l6ZW9mKGludCkgKiA4OworCWRyaXZlci0+c2FtcGxlX3JhdGUgPSAwOworCWRyaXZlci0+ZmVhdHVyZXMgPSBMSVJDX0NBTl9SRUNfTU9ERTI7CisJZHJpdmVyLT5kYXRhID0gaXRlODcwOV9kZXY7CisJZHJpdmVyLT5hZGRfdG9fYnVmID0gTlVMTDsKKwlkcml2ZXItPnNldF91c2VfaW5jID0gaXRlODcwOV9zZXRfdXNlX2luYzsKKwlkcml2ZXItPnNldF91c2VfZGVjID0gaXRlODcwOV9zZXRfdXNlX2RlYzsKKwlkcml2ZXItPmRldiA9ICZkZXYtPmRldjsKKwlkcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkvKiBJbml0aWFsaXplIExJUkMgYnVmZmVyICovCisJZHJpdmVyLT5yYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcml2ZXItPnJidWYpCisJCXJldHVybiBpdGU4NzA5X2NsZWFudXAoaXRlODcwOV9kZXYsIDEsIC1FTk9NRU0sCisJCQkJICAgICAgICJjYW4ndCBhbGxvY2F0ZSBsaXJjX2J1ZmZlciIpOworCWlmIChsaXJjX2J1ZmZlcl9pbml0KGRyaXZlci0+cmJ1ZiwgQlVGX0NIVU5LX1NJWkUsIEJVRl9TSVpFKSkKKwkJcmV0dXJuIGl0ZTg3MDlfY2xlYW51cChpdGU4NzA5X2RldiwgMSwgLUVOT01FTSwKKwkJCQkgICAgICAgImxpcmNfYnVmZmVyX2luaXQoKSBmYWlsZWQiKTsKKworCS8qIFJlZ2lzdGVyIExJUkMgZHJpdmVyICovCisJcmV0ID0gbGlyY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIGl0ZTg3MDlfY2xlYW51cChpdGU4NzA5X2RldiwgMiwgcmV0LAorCQkJCQkibGlyY19yZWdpc3Rlcl9kcml2ZXIoKSBmYWlsZWQiKTsKKworCS8qIFJlc2VydmUgSS9PIHBvcnQgYWNjZXNzICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpdGU4NzA5X2Rldi0+aW8sIDIsIExJUkNfRFJJVkVSX05BTUUpKQorCQlyZXR1cm4gaXRlODcwOV9jbGVhbnVwKGl0ZTg3MDlfZGV2LCAzLCAtRUJVU1ksCisJCQkJCQkiaS9vIHBvcnQgYWxyZWFkeSBpbiB1c2UiKTsKKworCS8qIFJlc2VydmUgSVJRIGxpbmUgKi8KKwlyZXQgPSByZXF1ZXN0X2lycShpdGU4NzA5X2Rldi0+aXJxLCBpdGU4NzA5X2ludGVycnVwdCwgMCwKKwkJCQkJTElSQ19EUklWRVJfTkFNRSwgaXRlODcwOV9kZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gaXRlODcwOV9jbGVhbnVwKGl0ZTg3MDlfZGV2LCA0LCByZXQsCisJCQkJCQkiSVJRIGFscmVhZHkgaW4gdXNlIik7CisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlICovCisJaXRlODcwOV9kcm9wX2hhcmR3YXJlKGl0ZTg3MDlfZGV2KTsgLyogU2h1dGRvd24gaHcgdW50aWwgZmlyc3QgdXNlICovCisKKwlwcmludGsoS0VSTl9JTkZPIExJUkNfRFJJVkVSX05BTUUgIjogZGV2aWNlIGZvdW5kIDogaXJxPSVkIGlvPTB4JXhcbiIsCisJCQkJCWl0ZTg3MDlfZGV2LT5pcnEsIGl0ZTg3MDlfZGV2LT5pbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGl0ZTg3MDlfcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCXN0cnVjdCBpdGU4NzA5X2RldmljZSAqaXRlODcwOV9kZXY7CisJaXRlODcwOV9kZXYgPSBwbnBfZ2V0X2RydmRhdGEoZGV2KTsKKworCWl0ZTg3MDlfY2xlYW51cChpdGU4NzA5X2RldiwgNiwgMCwgTlVMTCk7CisKKwlwcmludGsoS0VSTl9JTkZPIExJUkNfRFJJVkVSX05BTUUgIjogZGV2aWNlIHJlbW92ZWRcbiIpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGl0ZTg3MDlfcG5wX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBpdGU4NzA5X2RldmljZSAqaXRlODcwOV9kZXY7CisJaXRlODcwOV9kZXYgPSBwbnBfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChpdGU4NzA5X2Rldi0+dXNlX2NvdW50ID4gMCkKKwkJaXRlODcwOV9kcm9wX2hhcmR3YXJlKGl0ZTg3MDlfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0ZTg3MDlfcG5wX3Jlc3VtZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCXN0cnVjdCBpdGU4NzA5X2RldmljZSAqaXRlODcwOV9kZXY7CisJaXRlODcwOV9kZXYgPSBwbnBfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChpdGU4NzA5X2Rldi0+dXNlX2NvdW50ID4gMCkKKwkJaXRlODcwOV9pbml0X2hhcmR3YXJlKGl0ZTg3MDlfZGV2KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaXRlODcwOV9wbnBfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGl0ZTg3MDlfcG5wX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIHBucF9kZXZfdGFibGVbXSA9IHsKKwl7IklURTg3MDkiLCAwfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHBucF9kZXZfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgaXRlODcwOV9wbnBfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9IExJUkNfRFJJVkVSX05BTUUsCisJLnByb2JlICAgICAgICAgID0gaXRlODcwOV9wbnBfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3AoaXRlODcwOV9wbnBfcmVtb3ZlKSwKKwkuc3VzcGVuZCAgICAgICAgPSBpdGU4NzA5X3BucF9zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9IGl0ZTg3MDlfcG5wX3Jlc3VtZSwKKwkuaWRfdGFibGUgICAgICAgPSBwbnBfZGV2X3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXRlODcwOV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZpdGU4NzA5X3BucF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoaXRlODcwOV9pbml0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpdGU4NzA5X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZpdGU4NzA5X3BucF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaXRlODcwOV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTElSQyBkcml2ZXIgZm9yIElURTg3MDkgQ0lSIHBvcnQiKTsKK01PRFVMRV9BVVRIT1IoIkdyw6lnb3J5IExhcmRpw6hyZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3BhcmFsbGVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3BhcmFsbGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlYmQwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfcGFyYWxsZWwuYwpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAqIGxpcmNfcGFyYWxsZWwuYworICoKKyAqIGxpcmNfcGFyYWxsZWwgLSBkZXZpY2UgZHJpdmVyIGZvciBpbmZyYS1yZWQgc2lnbmFsIHJlY2VpdmluZyBhbmQKKyAqICAgICAgICAgICAgICAgICB0cmFuc21pdHRpbmcgdW5pdCBidWlsdCBieSB0aGUgYXV0aG9yCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IENocmlzdG9waCBCYXJ0ZWxtdXMgPGxpcmNAYmFydGVsbXVzLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisvKioqIEluY2x1ZGVzICoqKi8KKworI2lmZGVmIENPTkZJR19TTVAKKyNlcnJvciAiLS0tIFNvcnJ5LCB0aGlzIGRyaXZlciBpcyBub3QgU01QIHNhZmUuIC0tLSIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL2xpcmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgorCisjaW5jbHVkZSAibGlyY19wYXJhbGxlbC5oIgorCisjZGVmaW5lIExJUkNfRFJJVkVSX05BTUUgImxpcmNfcGFyYWxsZWwiCisKKyNpZm5kZWYgTElSQ19JUlEKKyNkZWZpbmUgTElSQ19JUlEgNworI2VuZGlmCisjaWZuZGVmIExJUkNfUE9SVAorI2RlZmluZSBMSVJDX1BPUlQgMHgzNzgKKyNlbmRpZgorI2lmbmRlZiBMSVJDX1RJTUVSCisjZGVmaW5lIExJUkNfVElNRVIgNjU1MzYKKyNlbmRpZgorCisvKioqIEdsb2JhbCBWYXJpYWJsZXMgKioqLworCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGludCBjaGVja19wc2VsZWNkOworCit1bnNpZ25lZCBpbnQgaXJxID0gTElSQ19JUlE7Cit1bnNpZ25lZCBpbnQgaW8gPSBMSVJDX1BPUlQ7CisjaWZkZWYgTElSQ19USU1FUgordW5zaWduZWQgaW50IHRpbWVyOwordW5zaWduZWQgaW50IGRlZmF1bHRfdGltZXIgPSBMSVJDX1RJTUVSOworI2VuZGlmCisKKyNkZWZpbmUgUkJVRl9TSVpFICgyNTYpIC8qIHRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIgbGFyZ2VyIHRoYW4gMSAqLworCitzdGF0aWMgaW50IHJidWZbUkJVRl9TSVpFXTsKKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobGlyY193YWl0KTsKKwordW5zaWduZWQgaW50IHJwdHI7Cit1bnNpZ25lZCBpbnQgd3B0cjsKK3Vuc2lnbmVkIGludCBsb3N0X2lycXM7CitpbnQgaXNfb3BlbjsKKworc3RydWN0IHBhcnBvcnQgKnBwb3J0Oworc3RydWN0IHBhcmRldmljZSAqcHBkZXZpY2U7CitpbnQgaXNfY2xhaW1lZDsKKwordW5zaWduZWQgaW50IHR4X21hc2sgPSAxOworCisvKioqIEludGVybmFsIEZ1bmN0aW9ucyAqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW4oaW50IG9mZnNldCkKK3sKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgTElSQ19MUF9CQVNFOgorCQlyZXR1cm4gcGFycG9ydF9yZWFkX2RhdGEocHBvcnQpOworCWNhc2UgTElSQ19MUF9TVEFUVVM6CisJCXJldHVybiBwYXJwb3J0X3JlYWRfc3RhdHVzKHBwb3J0KTsKKwljYXNlIExJUkNfTFBfQ09OVFJPTDoKKwkJcmV0dXJuIHBhcnBvcnRfcmVhZF9jb250cm9sKHBwb3J0KTsKKwl9CisJcmV0dXJuIDA7IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KK30KKworc3RhdGljIHZvaWQgb3V0KGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgTElSQ19MUF9CQVNFOgorCQlwYXJwb3J0X3dyaXRlX2RhdGEocHBvcnQsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBMSVJDX0xQX0NPTlRST0w6CisJCXBhcnBvcnRfd3JpdGVfY29udHJvbChwcG9ydCwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIExJUkNfTFBfU1RBVFVTOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogYXR0ZW1wdCB0byB3cml0ZSB0byBzdGF0dXMgcmVnaXN0ZXJcbiIsCisJCSAgICAgICBMSVJDX0RSSVZFUl9OQU1FKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxpcmNfZ2V0X3RpbWVyKHZvaWQpCit7CisJcmV0dXJuIGluKExJUkNfUE9SVF9USU1FUikgJiBMSVJDX1BPUlRfVElNRVJfQklUOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxpcmNfZ2V0X3NpZ25hbCh2b2lkKQoreworCXJldHVybiBpbihMSVJDX1BPUlRfU0lHTkFMKSAmIExJUkNfUE9SVF9TSUdOQUxfQklUOworfQorCitzdGF0aWMgdm9pZCBsaXJjX29uKHZvaWQpCit7CisJb3V0KExJUkNfUE9SVF9EQVRBLCB0eF9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgbGlyY19vZmYodm9pZCkKK3sKKwlvdXQoTElSQ19QT1JUX0RBVEEsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfbGlyY190aW1lcih2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2LCBub3c7CisJdW5zaWduZWQgaW50IGxldmVsLCBuZXdsZXZlbCwgdGltZWVsYXBzZWQsIG5ld3RpbWVyOworCWludCBjb3VudCA9IDA7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwl0di50dl9zZWMrKzsgICAgICAgICAgICAgICAgICAgICAvKiB3YWl0IG1heC4gMSBzZWMuICovCisJbGV2ZWwgPSBsaXJjX2dldF90aW1lcigpOworCWRvIHsKKwkJbmV3bGV2ZWwgPSBsaXJjX2dldF90aW1lcigpOworCQlpZiAobGV2ZWwgPT0gMCAmJiBuZXdsZXZlbCAhPSAwKQorCQkJY291bnQrKzsKKwkJbGV2ZWwgPSBuZXdsZXZlbDsKKwkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCX0gd2hpbGUgKGNvdW50IDwgMTAwMCAmJiAobm93LnR2X3NlYyA8IHR2LnR2X3NlYworCQkJICAgICB8fCAobm93LnR2X3NlYyA9PSB0di50dl9zZWMKKwkJCQkgJiYgbm93LnR2X3VzZWMgPCB0di50dl91c2VjKSkpOworCisJdGltZWVsYXBzZWQgPSAoKG5vdy50dl9zZWMgKyAxIC0gdHYudHZfc2VjKSoxMDAwMDAwCisJCSAgICAgKyAobm93LnR2X3VzZWMgLSB0di50dl91c2VjKSk7CisJaWYgKGNvdW50ID49IDEwMDAgJiYgdGltZWVsYXBzZWQgPiAwKSB7CisJCWlmIChkZWZhdWx0X3RpbWVyID09IDApIHsKKwkJCS8qIGF1dG9kZXRlY3QgdGltZXIgKi8KKwkJCW5ld3RpbWVyID0gKDEwMDAwMDAqY291bnQpL3RpbWVlbGFwc2VkOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICV1IEh6IHRpbWVyIGRldGVjdGVkXG4iLAorCQkJICAgICAgIExJUkNfRFJJVkVSX05BTUUsIG5ld3RpbWVyKTsKKwkJCXJldHVybiBuZXd0aW1lcjsKKwkJfSAgZWxzZSB7CisJCQluZXd0aW1lciA9ICgxMDAwMDAwKmNvdW50KS90aW1lZWxhcHNlZDsKKwkJCWlmIChhYnMobmV3dGltZXIgLSBkZWZhdWx0X3RpbWVyKSA+IGRlZmF1bHRfdGltZXIvMTApIHsKKwkJCQkvKiBiYWQgdGltZXIgKi8KKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBiYWQgdGltZXI6ICV1IEh6XG4iLAorCQkJCSAgICAgICBMSVJDX0RSSVZFUl9OQU1FLCBuZXd0aW1lcik7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdXNpbmcgZGVmYXVsdCB0aW1lcjogIgorCQkJCSAgICAgICAiJXUgSHpcbiIsCisJCQkJICAgICAgIExJUkNfRFJJVkVSX05BTUUsIGRlZmF1bHRfdGltZXIpOworCQkJCXJldHVybiBkZWZhdWx0X3RpbWVyOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXUgSHogdGltZXIgZGV0ZWN0ZWRcbiIsCisJCQkJICAgICAgIExJUkNfRFJJVkVSX05BTUUsIG5ld3RpbWVyKTsKKwkJCQlyZXR1cm4gbmV3dGltZXI7IC8qIHVzZSBkZXRlY3RlZCB2YWx1ZSAqLworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogbm8gdGltZXIgZGV0ZWN0ZWRcbiIsIExJUkNfRFJJVkVSX05BTUUpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbGlyY19jbGFpbSh2b2lkKQoreworCWlmIChwYXJwb3J0X2NsYWltKHBwZGV2aWNlKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgY2xhaW0gcG9ydFxuIiwKKwkJICAgICAgIExJUkNfRFJJVkVSX05BTUUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogd2FpdGluZyBmb3IgcG9ydCBiZWNvbWluZyBhdmFpbGFibGUiCisJCSAgICAgICAiXG4iLCBMSVJDX0RSSVZFUl9OQU1FKTsKKwkJaWYgKHBhcnBvcnRfY2xhaW1fb3JfYmxvY2socHBkZXZpY2UpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY291bGQgbm90IGNsYWltIHBvcnQsIGdpdmluZyIKKwkJCSAgICAgICAiIHVwXG4iLCBMSVJDX0RSSVZFUl9OQU1FKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCW91dChMSVJDX0xQX0NPTlRST0wsIExQX1BTRUxFQ1B8TFBfUElOSVRQKTsKKwlpc19jbGFpbWVkID0gMTsKKwlyZXR1cm4gMTsKK30KKworLyoqKiBpbnRlcnJ1cHQgaGFuZGxlciAqKiovCisKK3N0YXRpYyB2b2lkIHJidWZfd3JpdGUoaW50IHNpZ25hbCkKK3sKKwl1bnNpZ25lZCBpbnQgbndwdHI7CisKKwlud3B0ciA9ICh3cHRyICsgMSkgJiAoUkJVRl9TSVpFIC0gMSk7CisJaWYgKG53cHRyID09IHJwdHIpIHsKKwkJLyogbm8gbmV3IHNpZ25hbHMgd2lsbCBiZSBhY2NlcHRlZCAqLworCQlsb3N0X2lycXMrKzsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogYnVmZmVyIG92ZXJydW5cbiIsIExJUkNfRFJJVkVSX05BTUUpOworCQlyZXR1cm47CisJfQorCXJidWZbd3B0cl0gPSBzaWduYWw7CisJd3B0ciA9IG53cHRyOworfQorCitzdGF0aWMgdm9pZCBpcnFfaGFuZGxlcih2b2lkICpibGFoKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBsYXN0dHY7CisJc3RhdGljIGludCBpbml0OworCWxvbmcgc2lnbmFsOworCWludCBkYXRhOworCXVuc2lnbmVkIGludCBsZXZlbCwgbmV3bGV2ZWw7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisKKwlpZiAoIW1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSkpCisJCXJldHVybjsKKworCWlmICghaXNfY2xhaW1lZCkKKwkJcmV0dXJuOworCisjaWYgMAorCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJICBkaXNhYmxlX2lycShpcnEpOworCSAgb3V0KExJUkNfUE9SVF9JUlEsIGluKExJUkNfUE9SVF9JUlEpICYgKH5MUF9QSU5URU4pKTsKKyNlbmRpZgorCWlmIChjaGVja19wc2VsZWNkICYmIChpbigxKSAmIExQX1BTRUxFQ0QpKQorCQlyZXR1cm47CisKKyNpZmRlZiBMSVJDX1RJTUVSCisJaWYgKGluaXQpIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisKKwkJc2lnbmFsID0gdHYudHZfc2VjIC0gbGFzdHR2LnR2X3NlYzsKKwkJaWYgKHNpZ25hbCA+IDE1KQorCQkJLyogcmVhbGx5IGxvbmcgdGltZSAqLworCQkJZGF0YSA9IFBVTFNFX01BU0s7CisJCWVsc2UKKwkJCWRhdGEgPSAoaW50KSAoc2lnbmFsKjEwMDAwMDAgKworCQkJCQkgdHYudHZfdXNlYyAtIGxhc3R0di50dl91c2VjICsKKwkJCQkJIExJUkNfU0ZINTA2X0RFTEFZKTsKKworCQlyYnVmX3dyaXRlKGRhdGEpOyAvKiBzcGFjZSAqLworCX0gZWxzZSB7CisJCWlmICh0aW1lciA9PSAwKSB7CisJCQkvKgorCQkJICogd2FrZSB1cDsgd2UnbGwgbG9zZSB0aGlzIHNpZ25hbCwgYnV0IGl0IHdpbGwgYmUKKwkJCSAqIGdhcmJhZ2UgaWYgdGhlIGRldmljZSBpcyB0dXJuZWQgb24gYW55d2F5CisJCQkgKi8KKwkJCXRpbWVyID0gaW5pdF9saXJjX3RpbWVyKCk7CisJCQkvKiBlbmFibGVfaXJxKGlycSk7ICovCisJCQlyZXR1cm47CisJCX0KKwkJaW5pdCA9IDE7CisJfQorCisJdGltZW91dCA9IHRpbWVyLzEwOwkvKiB0aW1lb3V0IGFmdGVyIDEvMTAgc2VjLiAqLworCXNpZ25hbCA9IDE7CisJbGV2ZWwgPSBsaXJjX2dldF90aW1lcigpOworCWRvIHsKKwkJbmV3bGV2ZWwgPSBsaXJjX2dldF90aW1lcigpOworCQlpZiAobGV2ZWwgPT0gMCAmJiBuZXdsZXZlbCAhPSAwKQorCQkJc2lnbmFsKys7CisJCWxldmVsID0gbmV3bGV2ZWw7CisKKwkJLyogZ2l2aW5nIHVwICovCisJCWlmIChzaWduYWwgPiB0aW1lb3V0CisJCSAgICB8fCAoY2hlY2tfcHNlbGVjZCAmJiAoaW4oMSkgJiBMUF9QU0VMRUNEKSkpIHsKKwkJCXNpZ25hbCA9IDA7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0aW1lb3V0XG4iLCBMSVJDX0RSSVZFUl9OQU1FKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAobGlyY19nZXRfc2lnbmFsKCkpOworCisJaWYgKHNpZ25hbCAhPSAwKSB7CisJCS8qIGFqdXN0IHZhbHVlIHRvIHVzZWNzICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBoZWxwZXI7CisKKwkJaGVscGVyID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIHNpZ25hbCkqMTAwMDAwMDsKKwkJZG9fZGl2KGhlbHBlciwgdGltZXIpOworCQlzaWduYWwgPSAobG9uZykgaGVscGVyOworCisJCWlmIChzaWduYWwgPiBMSVJDX1NGSDUwNl9ERUxBWSkKKwkJCWRhdGEgPSBzaWduYWwgLSBMSVJDX1NGSDUwNl9ERUxBWTsKKwkJZWxzZQorCQkJZGF0YSA9IDE7CisJCXJidWZfd3JpdGUoUFVMU0VfQklUfGRhdGEpOyAvKiBwdWxzZSAqLworCX0KKwlkb19nZXR0aW1lb2ZkYXkoJmxhc3R0dik7CisjZWxzZQorCS8qIGFkZCB5b3VyIGNvZGUgaGVyZSAqLworI2VuZGlmCisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpcmNfd2FpdCk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJLyoKKwkgIGVuYWJsZV9pcnEoaXJxKTsKKwkgIG91dChMSVJDX1BPUlRfSVJRLCBpbihMSVJDX1BPUlRfSVJRKXxMUF9QSU5URU4pOworCSovCit9CisKKy8qKiogZmlsZSBvcGVyYXRpb25zICoqKi8KKworc3RhdGljIGxvZmZfdCBsaXJjX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxlcCwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJcmV0dXJuIC1FU1BJUEU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpcmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IG4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgY291bnQgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKG4gJSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSgmbGlyY193YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoY291bnQgPCBuKSB7CisJCWlmIChycHRyICE9IHdwdHIpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmK2NvdW50LCAoY2hhciAqKSAmcmJ1ZltycHRyXSwKKwkJCQkJIHNpemVvZihpbnQpKSkgeworCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlycHRyID0gKHJwdHIgKyAxKSAmIChSQlVGX1NJWkUgLSAxKTsKKwkJCWNvdW50ICs9IHNpemVvZihpbnQpOworCQl9IGVsc2UgeworCQkJaWYgKGZpbGVwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJlc3VsdCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmbGlyY193YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gY291bnQgPyBjb3VudCA6IHJlc3VsdDsKK30KKworc3RhdGljIHNzaXplX3QgbGlyY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4sCisJCQkgIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGxldmVsLCBuZXdsZXZlbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudHRpbWVyOworCWludCAqd2J1ZjsKKworCWlmICghaXNfY2xhaW1lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNvdW50ID0gbiAvIHNpemVvZihpbnQpOworCisJaWYgKG4gJSBzaXplb2YoaW50KSB8fCBjb3VudCAlIDIgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3YnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuKTsKKwlpZiAoSVNfRVJSKHdidWYpKQorCQlyZXR1cm4gUFRSX0VSUih3YnVmKTsKKworI2lmZGVmIExJUkNfVElNRVIKKwlpZiAodGltZXIgPT0gMCkgeworCQkvKiB0cnkgYWdhaW4gaWYgZGV2aWNlIGlzIHJlYWR5ICovCisJCXRpbWVyID0gaW5pdF9saXJjX3RpbWVyKCk7CisJCWlmICh0aW1lciA9PSAwKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJLyogYWRqdXN0IHZhbHVlcyBmcm9tIHVzZWNzICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGhlbHBlcjsKKworCQloZWxwZXIgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgd2J1ZltpXSkqdGltZXI7CisJCWRvX2RpdihoZWxwZXIsIDEwMDAwMDApOworCQl3YnVmW2ldID0gKGludCkgaGVscGVyOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGNvdW50KSB7CisJCWxldmVsID0gbGlyY19nZXRfdGltZXIoKTsKKwkJY291bnR0aW1lciA9IDA7CisJCWxpcmNfb24oKTsKKwkJZG8geworCQkJbmV3bGV2ZWwgPSBsaXJjX2dldF90aW1lcigpOworCQkJaWYgKGxldmVsID09IDAgJiYgbmV3bGV2ZWwgIT0gMCkKKwkJCQljb3VudHRpbWVyKys7CisJCQlsZXZlbCA9IG5ld2xldmVsOworCQkJaWYgKGNoZWNrX3BzZWxlY2QgJiYgKGluKDEpICYgTFBfUFNFTEVDRCkpIHsKKwkJCQlsaXJjX29mZigpOworCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfSB3aGlsZSAoY291bnR0aW1lciA8IHdidWZbaV0pOworCQlpKys7CisKKwkJbGlyY19vZmYoKTsKKwkJaWYgKGkgPT0gY291bnQpCisJCQlicmVhazsKKwkJY291bnR0aW1lciA9IDA7CisJCWRvIHsKKwkJCW5ld2xldmVsID0gbGlyY19nZXRfdGltZXIoKTsKKwkJCWlmIChsZXZlbCA9PSAwICYmIG5ld2xldmVsICE9IDApCisJCQkJY291bnR0aW1lcisrOworCQkJbGV2ZWwgPSBuZXdsZXZlbDsKKwkJCWlmIChjaGVja19wc2VsZWNkICYmIChpbigxKSAmIExQX1BTRUxFQ0QpKSB7CisJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9IHdoaWxlIChjb3VudHRpbWVyIDwgd2J1ZltpXSk7CisJCWkrKzsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2Vsc2UKKwkvKiBwbGFjZSBjb2RlIHRoYXQgaGFuZGxlcyB3cml0ZSB3aXRob3V0IGV4dGVybmFsIHRpbWVyIGhlcmUgKi8KKyNlbmRpZgorCXJldHVybiBuOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxpcmNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlwb2xsX3dhaXQoZmlsZSwgJmxpcmNfd2FpdCwgd2FpdCk7CisJaWYgKHJwdHIgIT0gd3B0cikKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGxpcmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmVhdHVyZXMgPSBMSVJDX0NBTl9TRVRfVFJBTlNNSVRURVJfTUFTSyB8CisJCQkJIExJUkNfQ0FOX1NFTkRfUFVMU0UgfCBMSVJDX0NBTl9SRUNfTU9ERTI7CisJdW5zaWduZWQgbG9uZyBtb2RlOworCXVuc2lnbmVkIGludCBpdmFsdWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTElSQ19HRVRfRkVBVFVSRVM6CisJCXJlc3VsdCA9IHB1dF91c2VyKGZlYXR1cmVzLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJYnJlYWs7CisJY2FzZSBMSVJDX0dFVF9TRU5EX01PREU6CisJCXJlc3VsdCA9IHB1dF91c2VyKExJUkNfTU9ERV9QVUxTRSwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWJyZWFrOworCWNhc2UgTElSQ19HRVRfUkVDX01PREU6CisJCXJlc3VsdCA9IHB1dF91c2VyKExJUkNfTU9ERV9NT0RFMiwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWJyZWFrOworCWNhc2UgTElSQ19TRVRfU0VORF9NT0RFOgorCQlyZXN1bHQgPSBnZXRfdXNlcihtb2RlLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKG1vZGUgIT0gTElSQ19NT0RFX1BVTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgTElSQ19TRVRfUkVDX01PREU6CisJCXJlc3VsdCA9IGdldF91c2VyKG1vZGUsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAobW9kZSAhPSBMSVJDX01PREVfTU9ERTIpCisJCQlyZXR1cm4gLUVOT1NZUzsKKwkJYnJlYWs7CisJY2FzZSBMSVJDX1NFVF9UUkFOU01JVFRFUl9NQVNLOgorCQlyZXN1bHQgPSBnZXRfdXNlcihpdmFsdWUsICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmICgoaXZhbHVlICYgTElSQ19QQVJBTExFTF9UUkFOU01JVFRFUl9NQVNLKSAhPSBpdmFsdWUpCisJCQlyZXR1cm4gTElSQ19QQVJBTExFTF9NQVhfVFJBTlNNSVRURVJTOworCQl0eF9tYXNrID0gaXZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaXJjX29wZW4oc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaWYgKG1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSkgfHwgIWxpcmNfY2xhaW0oKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBhcnBvcnRfZW5hYmxlX2lycShwcG9ydCk7CisKKwkvKiBpbml0IHJlYWQgcHRyICovCisJcnB0ciA9IDA7CisJd3B0ciA9IDA7CisJbG9zdF9pcnFzID0gMDsKKworCWlzX29wZW4gPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpcmNfY2xvc2Uoc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJaWYgKGlzX2NsYWltZWQpIHsKKwkJaXNfY2xhaW1lZCA9IDA7CisJCXBhcnBvcnRfcmVsZWFzZShwcGRldmljZSk7CisJfQorCWlzX29wZW4gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaXJjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbGlyY19sc2VlaywKKwkucmVhZAkJPSBsaXJjX3JlYWQsCisJLndyaXRlCQk9IGxpcmNfd3JpdGUsCisJLnBvbGwJCT0gbGlyY19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpcmNfaW9jdGwsCisJLm9wZW4JCT0gbGlyY19vcGVuLAorCS5yZWxlYXNlCT0gbGlyY19jbG9zZQorfTsKKworc3RhdGljIGludCBzZXRfdXNlX2luYyh2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfdXNlX2RlYyh2b2lkICpkYXRhKQoreworfQorCitzdGF0aWMgc3RydWN0IGxpcmNfZHJpdmVyIGRyaXZlciA9IHsKKyAgICAgICAubmFtZQkJPSBMSVJDX0RSSVZFUl9OQU1FLAorICAgICAgIC5taW5vcgkJPSAtMSwKKyAgICAgICAuY29kZV9sZW5ndGgJPSAxLAorICAgICAgIC5zYW1wbGVfcmF0ZQk9IDAsCisgICAgICAgLmRhdGEJCT0gTlVMTCwKKyAgICAgICAuYWRkX3RvX2J1Zgk9IE5VTEwsCisgICAgICAgLnNldF91c2VfaW5jCT0gc2V0X3VzZV9pbmMsCisgICAgICAgLnNldF91c2VfZGVjCT0gc2V0X3VzZV9kZWMsCisgICAgICAgLmZvcHMJCT0gJmxpcmNfZm9wcywKKyAgICAgICAuZGV2CQk9IE5VTEwsCisgICAgICAgLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBwZih2b2lkICpoYW5kbGUpOworc3RhdGljIHZvaWQga2Yodm9pZCAqaGFuZGxlKTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBvbGxfdGltZXI7CitzdGF0aWMgdm9pZCBwb2xsX3N0YXRlKHVuc2lnbmVkIGxvbmcgaWdub3JlZCk7CisKK3N0YXRpYyB2b2lkIHBvbGxfc3RhdGUodW5zaWduZWQgbG9uZyBpZ25vcmVkKQoreworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHRpbWVcbiIsCisJICAgICAgIExJUkNfRFJJVkVSX05BTUUpOworCWRlbF90aW1lcigmcG9sbF90aW1lcik7CisJaWYgKGlzX2NsYWltZWQpCisJCXJldHVybjsKKwlrZihOVUxMKTsKKwlpZiAoIWlzX2NsYWltZWQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY291bGQgbm90IGNsYWltIHBvcnQsIGdpdmluZyB1cFxuIiwKKwkJICAgICAgIExJUkNfRFJJVkVSX05BTUUpOworCQlpbml0X3RpbWVyKCZwb2xsX3RpbWVyKTsKKwkJcG9sbF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlwb2xsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdXJyZW50OworCQlwb2xsX3RpbWVyLmZ1bmN0aW9uID0gcG9sbF9zdGF0ZTsKKwkJYWRkX3RpbWVyKCZwb2xsX3RpbWVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGYodm9pZCAqaGFuZGxlKQoreworCXBhcnBvcnRfZGlzYWJsZV9pcnEocHBvcnQpOworCWlzX2NsYWltZWQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrZih2b2lkICpoYW5kbGUpCit7CisJaWYgKCFpc19vcGVuKQorCQlyZXR1cm47CisJaWYgKCFsaXJjX2NsYWltKCkpCisJCXJldHVybjsKKwlwYXJwb3J0X2VuYWJsZV9pcnEocHBvcnQpOworCWxpcmNfb2ZmKCk7CisJLyogdGhpcyBpcyBhIGJpdCBhbm5veWluZyB3aGVuIHlvdSBhY3R1YWxseSBwcmludC4uLiovCisJLyoKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVjbGFpbWVkIHBvcnRcbiIsIExJUkNfRFJJVkVSX05BTUUpOworCSovCit9CisKKy8qKiogbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwICoqKi8KKworc3RhdGljIGludCBfX2luaXQgbGlyY19wYXJhbGxlbF9pbml0KHZvaWQpCit7CisJcHBvcnQgPSBwYXJwb3J0X2ZpbmRfYmFzZShpbyk7CisJaWYgKHBwb3J0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogbm8gcG9ydCBhdCAleCBmb3VuZFxuIiwKKwkJICAgICAgIExJUkNfRFJJVkVSX05BTUUsIGlvKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcHBkZXZpY2UgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcG9ydCwgTElSQ19EUklWRVJfTkFNRSwKKwkJCQkJICAgcGYsIGtmLCBpcnFfaGFuZGxlciwgMCwgTlVMTCk7CisJcGFycG9ydF9wdXRfcG9ydChwcG9ydCk7CisJaWYgKHBwZGV2aWNlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UoKSBmYWlsZWRcbiIsCisJCSAgICAgICBMSVJDX0RSSVZFUl9OQU1FKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKHBhcnBvcnRfY2xhaW0ocHBkZXZpY2UpICE9IDApCisJCWdvdG8gc2tpcF9pbml0OworCWlzX2NsYWltZWQgPSAxOworCW91dChMSVJDX0xQX0NPTlRST0wsIExQX1BTRUxFQ1B8TFBfUElOSVRQKTsKKworI2lmZGVmIExJUkNfVElNRVIKKwlpZiAoZGVidWcpCisJCW91dChMSVJDX1BPUlRfREFUQSwgdHhfbWFzayk7CisKKwl0aW1lciA9IGluaXRfbGlyY190aW1lcigpOworCisjaWYgMAkvKiBjb250aW51ZSBldmVuIGlmIGRldmljZSBpcyBvZmZsaW5lICovCisJaWYgKHRpbWVyID09IDApIHsKKwkJaXNfY2xhaW1lZCA9IDA7CisJCXBhcnBvcnRfcmVsZWFzZShwcG9ydCk7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBkZXZpY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKyNlbmRpZgorCWlmIChkZWJ1ZykKKwkJb3V0KExJUkNfUE9SVF9EQVRBLCAwKTsKKyNlbmRpZgorCisJaXNfY2xhaW1lZCA9IDA7CisJcGFycG9ydF9yZWxlYXNlKHBwZGV2aWNlKTsKKyBza2lwX2luaXQ6CisJZHJpdmVyLm1pbm9yID0gbGlyY19yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJaWYgKGRyaXZlci5taW5vciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogcmVnaXN0ZXJfY2hyZGV2KCkgZmFpbGVkXG4iLAorCQkgICAgICAgTElSQ19EUklWRVJfTkFNRSk7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBkZXZpY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGluc3RhbGxlZCB1c2luZyBwb3J0IDB4JTA0eCBpcnEgJWRcbiIsCisJICAgICAgIExJUkNfRFJJVkVSX05BTUUsIGlvLCBpcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGlyY19wYXJhbGxlbF9leGl0KHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcGRldmljZSk7CisJbGlyY191bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIubWlub3IpOworfQorCittb2R1bGVfaW5pdChsaXJjX3BhcmFsbGVsX2luaXQpOworbW9kdWxlX2V4aXQobGlyY19wYXJhbGxlbF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbmZyYXJlZCByZWNlaXZlciBkcml2ZXIgZm9yIHBhcmFsbGVsIHBvcnRzLiIpOworTU9EVUxFX0FVVEhPUigiQ2hyaXN0b3BoIEJhcnRlbG11cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3MgYmFzZSAoMHgzYmMsIDB4Mzc4IG9yIDB4Mjc4KSIpOworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJbnRlcnJ1cHQgKDcgb3IgNSkiKTsKKworbW9kdWxlX3BhcmFtKHR4X21hc2ssIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHR4X21heGssICJUcmFuc21pdHRlciBtYXNrIChkZWZhdWx0OiAweDAxKSIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIik7CisKK21vZHVsZV9wYXJhbShjaGVja19wc2VsZWNkLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiQ2hlY2sgZm9yIHByaW50ZXIgKGRlZmF1bHQ6IDApIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3BhcmFsbGVsLmggYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3BhcmFsbGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZDZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfcGFyYWxsZWwuaApAQCAtMCwwICsxLDI2IEBACisvKiBsaXJjX3BhcmFsbGVsLmggKi8KKworI2lmbmRlZiBfTElSQ19QQVJBTExFTF9ICisjZGVmaW5lIF9MSVJDX1BBUkFMTEVMX0gKKworI2luY2x1ZGUgPGxpbnV4L2xwLmg+CisKKyNkZWZpbmUgTElSQ19QT1JUX0xFTiAzCisKKyNkZWZpbmUgTElSQ19MUF9CQVNFICAgIDAKKyNkZWZpbmUgTElSQ19MUF9TVEFUVVMgIDEKKyNkZWZpbmUgTElSQ19MUF9DT05UUk9MIDIKKworI2RlZmluZSBMSVJDX1BPUlRfREFUQSAgICAgICAgICAgTElSQ19MUF9CQVNFICAgIC8qIGJhc2UgKi8KKyNkZWZpbmUgTElSQ19QT1JUX1RJTUVSICAgICAgICBMSVJDX0xQX1NUQVRVUyAgICAvKiBzdGF0dXMgcG9ydCAqLworI2RlZmluZSBMSVJDX1BPUlRfVElNRVJfQklUICAgICAgICAgIExQX1BCVVNZICAgIC8qIGJ1c3kgc2lnbmFsICovCisjZGVmaW5lIExJUkNfUE9SVF9TSUdOQUwgICAgICAgTElSQ19MUF9TVEFUVVMgICAgLyogc3RhdHVzIHBvcnQgKi8KKyNkZWZpbmUgTElSQ19QT1JUX1NJR05BTF9CSVQgICAgICAgICAgTFBfUEFDSyAgICAvKiBhY2sgc2lnbmFsICovCisjZGVmaW5lIExJUkNfUE9SVF9JUlEgICAgICAgICBMSVJDX0xQX0NPTlRST0wgICAgLyogY29udHJvbCBwb3J0ICovCisKKyNkZWZpbmUgTElSQ19TRkg1MDZfREVMQVkgMCAgICAgICAgICAgICAvKiBkZWxheSB0X3BobCBpbiB1c2VjcyAqLworCisjZGVmaW5lIExJUkNfUEFSQUxMRUxfTUFYX1RSQU5TTUlUVEVSUyA4CisjZGVmaW5lIExJUkNfUEFSQUxMRUxfVFJBTlNNSVRURVJfTUFTSyAoKDE8PExJUkNfUEFSQUxMRUxfTUFYX1RSQU5TTUlUVEVSUykgLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2FzZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2FzZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE2NmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zYXNlbS5jCkBAIC0wLDAgKzEsOTMzIEBACisvKgorICogbGlyY19zYXNlbS5jIC0gVVNCIHJlbW90ZSBzdXBwb3J0IGZvciBMSVJDCisgKiBWZXJzaW9uIDAuNQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE9saXZlciBTdGFiZWwgPG9saXZlci5zdGFiZWxAZ214LmRlPgorICoJCQkgVGltIERhdmllcyA8dGltQG9wZW5zeXN0ZW1zLm5ldC5hdT4KKyAqCisgKiBUaGlzIGRyaXZlciB3YXMgZGVyaXZlZCBmcm9tOgorICogICBWZW5reSBSYWp1IDxkZXZAdmVua3kud3M+CisgKiAgICAgICJsaXJjX2ltb24gLSAiTElSQy9WRkQgZHJpdmVyIGZvciBBaGFuaXgvU291bmRncmFwaCBJTU9OIElSL1ZGRCIKKyAqICAgUGF1bCBNaWxsZXIgPHBtaWxsZXI5QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4ncyAyMDAzLTIwMDQKKyAqICAgICAgImxpcmNfYXRpdXNiIC0gVVNCIHJlbW90ZSBzdXBwb3J0IGZvciBMSVJDIgorICogICBDdWx2ZXIgQ29uc3VsdGluZyBTZXJ2aWNlcyA8aGVucnlAY3VsY29uLmNvbT4ncyAyMDAzCisgKiAgICAgICJTYXNlbSBPbkFpciBWRkQvSVIgVVNCIGRyaXZlciIKKyAqCisgKgorICogTk9URSAtIFRoZSBMQ0Rwcm9jIGlNb24gZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggdGhpcyBtb2R1bGUuICBNb3JlIGluZm8gYXQKKyAqCWh0dHA6Ly93d3cuZnJvZ3N0b3JtLmluZm8vc2FzZW0KKyAqLworCisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKworCisjZGVmaW5lIE1PRF9BVVRIT1IJIk9saXZlciBTdGFiZWwgPG9saXZlci5zdGFiZWxAZ214LmRlPiwgIiBcCisJCQkiVGltIERhdmllcyA8dGltQG9wZW5zeXN0ZW1zLm5ldC5hdT4iCisjZGVmaW5lIE1PRF9ERVNDCSJVU0IgRHJpdmVyIGZvciBTYXNlbSBSZW1vdGUgQ29udHJvbGxlciBWMS4xIgorI2RlZmluZSBNT0RfTkFNRQkibGlyY19zYXNlbSIKKyNkZWZpbmUgTU9EX1ZFUlNJT04JIjAuNSIKKworI2RlZmluZSBWRkRfTUlOT1JfQkFTRQkxNDQJLyogU2FtZSBhcyBMQ0QgKi8KKyNkZWZpbmUgREVWSUNFX05BTUUJImxjZCVkIgorCisjZGVmaW5lIEJVRl9DSFVOS19TSVpFCTgKKyNkZWZpbmUgQlVGX1NJWkUJMTI4CisKKyNkZWZpbmUgSU9DVExfTENEX0NPTlRSQVNUIDEKKworLyoqKiBQIFIgTyBUIE8gVCBZIFAgRSBTICoqKi8KKworLyogVVNCIENhbGxiYWNrIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgc2FzZW1fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBzYXNlbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworc3RhdGljIHZvaWQgdXNiX3J4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCB1c2JfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKKworLyogVkZEIGZpbGVfb3BlcmF0aW9ucyBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IHZmZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBsb25nIHZmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHZmZF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpOworCisvKiBMSVJDIGRyaXZlciBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IGlyX29wZW4odm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBpcl9jbG9zZSh2b2lkICpkYXRhKTsKKworLyogRHJpdmVyIGluaXQvZXhpdCBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IF9faW5pdCBzYXNlbV9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19leGl0IHNhc2VtX2V4aXQodm9pZCk7CisKKy8qKiogRyBMIE8gQiBBIEwgUyAqKiovCisjZGVmaW5lIFNBU0VNX0RBVEFfQlVGX1NaCTMyCisKK3N0cnVjdCBzYXNlbV9jb250ZXh0IHsKKworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJaW50IHZmZF9pc29wZW47CQkJLyogVkZEIHBvcnQgaGFzIGJlZW4gb3BlbmVkICAgICAgICovCisJdW5zaWduZWQgaW50IHZmZF9jb250cmFzdDsJLyogVkZEIGNvbnRyYXN0CQkgICAqLworCWludCBpcl9pc29wZW47CQkJLyogSVIgcG9ydCBoYXMgYmVlbiBvcGVuZWQJKi8KKwlpbnQgZGV2X3ByZXNlbnQ7CQkvKiBVU0IgZGV2aWNlIHByZXNlbmNlCSAgICAqLworCXN0cnVjdCBtdXRleCBjdHhfbG9jazsJCS8qIHRvIGxvY2sgdGhpcyBvYmplY3QJICAgICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVtb3ZlX29rOwkvKiBGb3IgdW5leHBlY3RlZCBVU0IgZGlzY29ubmVjdHMgKi8KKworCXN0cnVjdCBsaXJjX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqcnhfZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICp0eF9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiICpyeF91cmI7CisJc3RydWN0IHVyYiAqdHhfdXJiOworCXVuc2lnbmVkIGNoYXIgdXNiX3J4X2J1Zls4XTsKKwl1bnNpZ25lZCBjaGFyIHVzYl90eF9idWZbOF07CisKKwlzdHJ1Y3QgdHhfdCB7CisJCXVuc2lnbmVkIGNoYXIgZGF0YV9idWZbU0FTRU1fREFUQV9CVUZfU1pdOyAvKiB1c2VyIGRhdGEgYnVmZmVyICovCisJCXN0cnVjdCBjb21wbGV0aW9uIGZpbmlzaGVkOyAgLyogd2FpdCBmb3Igd3JpdGUgdG8gZmluaXNoICAqLworCQlhdG9taWNfdCBidXN5OwkJICAgICAvKiB3cml0ZSBpbiBwcm9ncmVzcwkgKi8KKwkJaW50IHN0YXR1czsJCSAgICAgLyogc3RhdHVzIG9mIHR4IGNvbXBsZXRpb24gICAqLworCX0gdHg7CisKKwkvKiBmb3IgZGVhbGluZyB3aXRoIHJlcGVhdCBjb2RlcyAod2lzaCB0aGVyZSB3YXMgYSB0b2dnbGUgYml0ISkgKi8KKwlzdHJ1Y3QgdGltZXZhbCBwcmVzc3RpbWU7CisJY2hhciBsYXN0Y29kZVs4XTsKKwlpbnQgY29kZXNhdmVkOworfTsKKworLyogVkZEIGZpbGUgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmZkX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9ICZ2ZmRfb3BlbiwKKwkud3JpdGUJCT0gJnZmZF93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSAmdmZkX2lvY3RsLAorCS5yZWxlYXNlCT0gJnZmZF9jbG9zZSwKK307CisKKy8qIFVTQiBEZXZpY2UgSUQgZm9yIFNhc2VtIFVTQiBDb250cm9sIEJvYXJkICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgc2FzZW1fdXNiX2lkX3RhYmxlW10gPSB7CisJLyogU2FzZW0gVVNCIENvbnRyb2wgQm9hcmQgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMWJhLCAweDAxMDEpIH0sCisJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKwl7fQorfTsKKworLyogVVNCIERldmljZSBkYXRhICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc2FzZW1fZHJpdmVyID0geworCS5uYW1lCQk9IE1PRF9OQU1FLAorCS5wcm9iZQkJPSBzYXNlbV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHNhc2VtX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gc2FzZW1fdXNiX2lkX3RhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIHNhc2VtX2NsYXNzID0geworCS5uYW1lCQk9IERFVklDRV9OQU1FLAorCS5mb3BzCQk9ICZ2ZmRfZm9wcywKKwkubWlub3JfYmFzZQk9IFZGRF9NSU5PUl9CQVNFLAorfTsKKworLyogdG8gcHJldmVudCByYWNlcyBiZXR3ZWVuIG9wZW4oKSBhbmQgZGlzY29ubmVjdCgpICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRpc2Nvbm5lY3RfbG9jayk7CisKK3N0YXRpYyBpbnQgZGVidWc7CisKKworLyoqKiBNIE8gRCBVIEwgRSAgIEMgTyBEIEUgKioqLworCitNT0RVTEVfQVVUSE9SKE1PRF9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKE1PRF9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbWVzc2FnZXM6IDA9bm8sIDE9eWVzIChkZWZhdWx0OiBubykiKTsKKworc3RhdGljIHZvaWQgZGVsZXRlX2NvbnRleHQoc3RydWN0IHNhc2VtX2NvbnRleHQgKmNvbnRleHQpCit7CisJdXNiX2ZyZWVfdXJiKGNvbnRleHQtPnR4X3VyYik7ICAvKiBWRkQgKi8KKwl1c2JfZnJlZV91cmIoY29udGV4dC0+cnhfdXJiKTsgIC8qIElSICovCisJbGlyY19idWZmZXJfZnJlZShjb250ZXh0LT5kcml2ZXItPnJidWYpOworCWtmcmVlKGNvbnRleHQtPmRyaXZlci0+cmJ1Zik7CisJa2ZyZWUoY29udGV4dC0+ZHJpdmVyKTsKKwlrZnJlZShjb250ZXh0KTsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbnRleHQgZGVsZXRlZFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyX2Zyb21fbGlyYyhzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dCkKK3sKKwlpbnQgcmV0dmFsOworCWludCBtaW5vciA9IGNvbnRleHQtPmRyaXZlci0+bWlub3I7CisKKwlyZXR2YWwgPSBsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKG1pbm9yKTsKKwlpZiAocmV0dmFsKQorCQllcnIoIiVzOiB1bmFibGUgdG8gZGVyZWdpc3RlciBmcm9tIGxpcmMgKCVkKSIsCisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkRlcmVnaXN0ZXJlZCBTYXNlbSBkcml2ZXIgKG1pbm9yOiVkKVxuIiwKKwkJICAgICAgIG1pbm9yKTsKKworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBWRkQgZGV2aWNlIChlLmcuIC9kZXYvdXNiL2xjZCkKKyAqIGlzIG9wZW5lZCBieSB0aGUgYXBwbGljYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgdmZkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJaW50IHN1Ym1pbm9yOworCWludCByZXR2YWwgPSAwOworCisJLyogcHJldmVudCByYWNlcyB3aXRoIGRpc2Nvbm5lY3QgKi8KKwltdXRleF9sb2NrKCZkaXNjb25uZWN0X2xvY2spOworCisJc3VibWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmc2FzZW1fZHJpdmVyLCBzdWJtaW5vcik7CisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJZXJyKCIlczogY291bGQgbm90IGZpbmQgaW50ZXJmYWNlIGZvciBtaW5vciAlZCIsCisJCSAgICBfX2Z1bmNfXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCWNvbnRleHQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIWNvbnRleHQpIHsKKwkJZXJyKCIlczogbm8gY29udGV4dCBmb3VuZCBmb3IgbWlub3IgJWQiLAorCQkJCQlfX2Z1bmNfXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJbXV0ZXhfbG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJaWYgKGNvbnRleHQtPnZmZF9pc29wZW4pIHsKKwkJZXJyKCIlczogVkZEIHBvcnQgaXMgYWxyZWFkeSBvcGVuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJY29udGV4dC0+dmZkX2lzb3BlbiA9IDE7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNvbnRleHQ7CisJCXByaW50ayhLRVJOX0lORk8gIlZGRCBwb3J0IG9wZW5lZFxuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIFZGRCBkZXZpY2UgKGUuZy4gL2Rldi91c2IvbGNkKQorICogaXMgY2xvc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAqLworc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzYXNlbV9jb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKworCWNvbnRleHQgPSAoc3RydWN0IHNhc2VtX2NvbnRleHQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjb250ZXh0KSB7CisJCWVycigiJXM6IG5vIGNvbnRleHQgZm9yIGRldmljZSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXV0ZXhfbG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElPQ1RMX0xDRF9DT05UUkFTVDoKKwkJaWYgKGFyZyA+IDEwMDApCisJCQlhcmcgPSAxMDAwOworCQljb250ZXh0LT52ZmRfY29udHJhc3QgPSAodW5zaWduZWQgaW50KWFyZzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBJT0NUTCBjb21tYW5kXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7ICAvKiBub3Qgc3VwcG9ydGVkICovCisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIFZGRCBkZXZpY2UgKGUuZy4gL2Rldi91c2IvbGNkKQorICogaXMgY2xvc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAqLworc3RhdGljIGludCB2ZmRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNhc2VtX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCisJY29udGV4dCA9IChzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWNvbnRleHQpIHsKKwkJZXJyKCIlczogbm8gY29udGV4dCBmb3IgZGV2aWNlIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwlpZiAoIWNvbnRleHQtPnZmZF9pc29wZW4pIHsKKwkJZXJyKCIlczogVkZEIGlzIG5vdCBvcGVuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRUlPOworCX0gZWxzZSB7CisJCWNvbnRleHQtPnZmZF9pc29wZW4gPSAwOworCQlwcmludGsoS0VSTl9JTkZPICJWRkQgcG9ydCBjbG9zZWRcbiIpOworCQlpZiAoIWNvbnRleHQtPmRldl9wcmVzZW50ICYmICFjb250ZXh0LT5pcl9pc29wZW4pIHsKKworCQkJLyogRGV2aWNlIGRpc2Nvbm5lY3RlZCBiZWZvcmUgY2xvc2UgYW5kIElSIHBvcnQgaXMKKwkJCSAqIG5vdCBvcGVuLiBJZiBJUiBwb3J0IGlzIG9wZW4sIGNvbnRleHQgd2lsbCBiZQorCQkJICogZGVsZXRlZCBieSBpcl9jbG9zZS4gKi8KKwkJCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCQkJZGVsZXRlX2NvbnRleHQoY29udGV4dCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZW5kcyBhIHBhY2tldCB0byB0aGUgVkZELgorICovCitzdGF0aWMgaW50IHNlbmRfcGFja2V0KHN0cnVjdCBzYXNlbV9jb250ZXh0ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBwaXBlOworCWludCBpbnRlcnZhbCA9IDA7CisJaW50IHJldHZhbCA9IDA7CisKKwlwaXBlID0gdXNiX3NuZGludHBpcGUoY29udGV4dC0+ZGV2LAorCQkJY29udGV4dC0+dHhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCWludGVydmFsID0gY29udGV4dC0+dHhfZW5kcG9pbnQtPmJJbnRlcnZhbDsKKworCXVzYl9maWxsX2ludF91cmIoY29udGV4dC0+dHhfdXJiLCBjb250ZXh0LT5kZXYsIHBpcGUsCisJCWNvbnRleHQtPnVzYl90eF9idWYsIHNpemVvZihjb250ZXh0LT51c2JfdHhfYnVmKSwKKwkJdXNiX3R4X2NhbGxiYWNrLCBjb250ZXh0LCBpbnRlcnZhbCk7CisKKwljb250ZXh0LT50eF91cmItPmFjdHVhbF9sZW5ndGggPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LT50eC5maW5pc2hlZCk7CisJYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAxKTsKKworCXJldHZhbCA9ICB1c2Jfc3VibWl0X3VyYihjb250ZXh0LT50eF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAwKTsKKwkJZXJyKCIlczogZXJyb3Igc3VibWl0dGluZyB1cmIgKCVkKSIsIF9fZnVuY19fLCByZXR2YWwpOworCX0gZWxzZSB7CisJCS8qIFdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAob3IgYWJvcnQpICovCisJCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb250ZXh0LT50eC5maW5pc2hlZCk7CisJCW11dGV4X2xvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKworCQlyZXR2YWwgPSBjb250ZXh0LT50eC5zdGF0dXM7CisJCWlmIChyZXR2YWwpCisJCQllcnIoIiVzOiBwYWNrZXQgdHggZmFpbGVkICglZCkiLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFdyaXRlcyBkYXRhIHRvIHRoZSBWRkQuICBUaGUgU2FzZW0gVkZEIGlzIDJ4MTYgY2hhcmFjdGVycworICogYW5kIHJlcXVpcmVzIGRhdGEgaW4gOSBjb25zZWN1dGl2ZSBVU0IgaW50ZXJydXB0IHBhY2tldHMsCisgKiBlYWNoIHBhY2tldCBjYXJyeWluZyA4IGJ5dGVzLgorICovCitzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpCit7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHNhc2VtX2NvbnRleHQgKmNvbnRleHQ7CisJaW50ICpkYXRhX2J1ZjsKKworCWNvbnRleHQgPSAoc3RydWN0IHNhc2VtX2NvbnRleHQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghY29udGV4dCkgeworCQllcnIoIiVzOiBubyBjb250ZXh0IGZvciBkZXZpY2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW11dGV4X2xvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKworCWlmICghY29udGV4dC0+ZGV2X3ByZXNlbnQpIHsKKwkJZXJyKCIlczogbm8gU2FzZW0gZGV2aWNlIHByZXNlbnQiLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAobl9ieXRlcyA8PSAwIHx8IG5fYnl0ZXMgPiBTQVNFTV9EQVRBX0JVRl9TWikgeworCQllcnIoIiVzOiBpbnZhbGlkIHBheWxvYWQgc2l6ZSIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWRhdGFfYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuX2J5dGVzKTsKKwlpZiAoUFRSX0VSUihkYXRhX2J1ZikpCisJCXJldHVybiBQVFJfRVJSKGRhdGFfYnVmKTsKKworCW1lbWNweShjb250ZXh0LT50eC5kYXRhX2J1ZiwgZGF0YV9idWYsIG5fYnl0ZXMpOworCisJLyogUGFkIHdpdGggc3BhY2VzICovCisJZm9yIChpID0gbl9ieXRlczsgaSA8IFNBU0VNX0RBVEFfQlVGX1NaOyArK2kpCisJCWNvbnRleHQtPnR4LmRhdGFfYnVmW2ldID0gJyAnOworCisJLyogTmluZSA4IGJ5dGUgcGFja2V0cyB0byBiZSBzZW50ICovCisJLyogTk9URTogIlx4MDdceDAxXDBcMFwwXDBcMFwwIiBvciAiXHgwY1wwXDBcMFwwXDBcMFwwIgorCSAqICAgICAgIHdpbGwgY2xlYXIgdGhlIFZGRCAqLworCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCW1lbWNweShjb250ZXh0LT51c2JfdHhfYnVmLCAiXHgwN1wwXDBcMFwwXDBcMFwwIiwgOCk7CisJCQljb250ZXh0LT51c2JfdHhfYnVmWzFdID0gKGNvbnRleHQtPnZmZF9jb250cmFzdCkgPworCQkJCSgweDJCIC0gKGNvbnRleHQtPnZmZF9jb250cmFzdCAtIDEpIC8gMjUwKQorCQkJCTogMHgyQjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQltZW1jcHkoY29udGV4dC0+dXNiX3R4X2J1ZiwgIlx4MDlceDAxXDBcMFwwXDBcMFwwIiwgOCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsICJceDBiXHgwMVwwXDBcMFwwXDBcMCIsIDgpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW1lbWNweShjb250ZXh0LT51c2JfdHhfYnVmLCBjb250ZXh0LT50eC5kYXRhX2J1ZiwgOCk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsCisJCQkgICAgICAgY29udGV4dC0+dHguZGF0YV9idWYgKyA4LCA4KTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQltZW1jcHkoY29udGV4dC0+dXNiX3R4X2J1ZiwgIlx4MDlceDAxXDBcMFwwXDBcMFwwIiwgOCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsICJceDBiXHgwMlwwXDBcMFwwXDBcMCIsIDgpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCW1lbWNweShjb250ZXh0LT51c2JfdHhfYnVmLAorCQkJICAgICAgIGNvbnRleHQtPnR4LmRhdGFfYnVmICsgMTYsIDgpOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCW1lbWNweShjb250ZXh0LT51c2JfdHhfYnVmLAorCQkJICAgICAgIGNvbnRleHQtPnR4LmRhdGFfYnVmICsgMjQsIDgpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dmFsID0gc2VuZF9wYWNrZXQoY29udGV4dCk7CisJCWlmIChyZXR2YWwpIHsKKworCQkJZXJyKCIlczogc2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkIiwKKwkJCQkJX19mdW5jX18sIGkpOworCQkJZ290byBleGl0OworCQl9CisJfQorZXhpdDoKKworCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJcmV0dXJuICghcmV0dmFsKSA/IG5fYnl0ZXMgOiByZXR2YWw7Cit9CisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogdHJhbnNtaXQgZGF0YQorICovCitzdGF0aWMgdm9pZCB1c2JfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzYXNlbV9jb250ZXh0ICpjb250ZXh0OworCisJaWYgKCF1cmIpCisJCXJldHVybjsKKwljb250ZXh0ID0gKHN0cnVjdCBzYXNlbV9jb250ZXh0ICopIHVyYi0+Y29udGV4dDsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybjsKKworCWNvbnRleHQtPnR4LnN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJLyogbm90aWZ5IHdhaXRlcnMgdGhhdCB3cml0ZSBoYXMgZmluaXNoZWQgKi8KKwlhdG9taWNfc2V0KCZjb250ZXh0LT50eC5idXN5LCAwKTsKKwljb21wbGV0ZSgmY29udGV4dC0+dHguZmluaXNoZWQpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIENhbGxlZCBieSBsaXJjX2RldiB3aGVuIHRoZSBhcHBsaWNhdGlvbiBvcGVucyAvZGV2L2xpcmMKKyAqLworc3RhdGljIGludCBpcl9vcGVuKHZvaWQgKmRhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHNhc2VtX2NvbnRleHQgKmNvbnRleHQ7CisKKwkvKiBwcmV2ZW50IHJhY2VzIHdpdGggZGlzY29ubmVjdCAqLworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbG9jayk7CisKKwljb250ZXh0ID0gKHN0cnVjdCBzYXNlbV9jb250ZXh0ICopIGRhdGE7CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwlpZiAoY29udGV4dC0+aXJfaXNvcGVuKSB7CisJCWVycigiJXM6IElSIHBvcnQgaXMgYWxyZWFkeSBvcGVuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl1c2JfZmlsbF9pbnRfdXJiKGNvbnRleHQtPnJ4X3VyYiwgY29udGV4dC0+ZGV2LAorCQl1c2JfcmN2aW50cGlwZShjb250ZXh0LT5kZXYsCisJCQkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQljb250ZXh0LT51c2JfcnhfYnVmLCBzaXplb2YoY29udGV4dC0+dXNiX3J4X2J1ZiksCisJCXVzYl9yeF9jYWxsYmFjaywgY29udGV4dCwgY29udGV4dC0+cnhfZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihjb250ZXh0LT5yeF91cmIsIEdGUF9LRVJORUwpOworCisJaWYgKHJldHZhbCkKKwkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkIGZvciBpcl9vcGVuICglZCkiLAorCQkgICAgX19mdW5jX18sIHJldHZhbCk7CisJZWxzZSB7CisJCWNvbnRleHQtPmlyX2lzb3BlbiA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIklSIHBvcnQgb3BlbmVkXG4iKTsKKwl9CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IGxpcmNfZGV2IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGNsb3NlcyAvZGV2L2xpcmMKKyAqLworc3RhdGljIHZvaWQgaXJfY2xvc2Uodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dDsKKworCWNvbnRleHQgPSAoc3RydWN0IHNhc2VtX2NvbnRleHQgKilkYXRhOworCWlmICghY29udGV4dCkgeworCQllcnIoIiVzOiBubyBjb250ZXh0IGZvciBkZXZpY2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwl1c2Jfa2lsbF91cmIoY29udGV4dC0+cnhfdXJiKTsKKwljb250ZXh0LT5pcl9pc29wZW4gPSAwOworCXByaW50ayhLRVJOX0lORk8gIklSIHBvcnQgY2xvc2VkXG4iKTsKKworCWlmICghY29udGV4dC0+ZGV2X3ByZXNlbnQpIHsKKworCQkvKgorCQkgKiBEZXZpY2UgZGlzY29ubmVjdGVkIHdoaWxlIElSIHBvcnQgd2FzCisJCSAqIHN0aWxsIG9wZW4uIERyaXZlciB3YXMgbm90IGRlcmVnaXN0ZXJlZAorCQkgKiBhdCBkaXNjb25uZWN0IHRpbWUsIHNvIGRvIGl0IG5vdy4KKwkJICovCisJCWRlcmVnaXN0ZXJfZnJvbV9saXJjKGNvbnRleHQpOworCisJCWlmICghY29udGV4dC0+dmZkX2lzb3BlbikgeworCisJCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKwkJCWRlbGV0ZV9jb250ZXh0KGNvbnRleHQpOworCQkJcmV0dXJuOworCQl9CisJCS8qIElmIFZGRCBwb3J0IGlzIG9wZW4sIGNvbnRleHQgd2lsbCBiZSBkZWxldGVkIGJ5IHZmZF9jbG9zZSAqLworCX0KKworCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCXJldHVybjsKK30KKworLyoqCisgKiBQcm9jZXNzIHRoZSBpbmNvbWluZyBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgaW5jb21pbmdfcGFja2V0KHN0cnVjdCBzYXNlbV9jb250ZXh0ICpjb250ZXh0LAorCQkJCSAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWxvbmcgbXM7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlpZiAobGVuICE9IDgpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaW5jb21pbmcgcGFja2V0IHNpemUgKCVkKVxuIiwKKwkJICAgICBfX2Z1bmNfXywgbGVuKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIERFQlVHCisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJTAyeCAiLCBidWZbaV0pOworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisjZW5kaWYKKworCS8qCisJICogTGlyYyBjb3VsZCBkZWFsIHdpdGggdGhlIHJlcGVhdCBjb2RlLCBidXQgd2UgcmVhbGx5IG5lZWQgdG8gYmxvY2sgaXQKKwkgKiBpZiBpdCBhcnJpdmVzIHRvbyBsYXRlLiAgT3RoZXJ3aXNlIHdlIGNvdWxkIHJlcGVhdCB0aGUgd3JvbmcgY29kZS4KKwkgKi8KKworCS8qIGdldCB0aGUgdGltZSBzaW5jZSB0aGUgbGFzdCBidXR0b24gcHJlc3MgKi8KKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwltcyA9ICh0di50dl9zZWMgLSBjb250ZXh0LT5wcmVzc3RpbWUudHZfc2VjKSAqIDEwMDAgKworCSAgICAgKHR2LnR2X3VzZWMgLSBjb250ZXh0LT5wcmVzc3RpbWUudHZfdXNlYykgLyAxMDAwOworCisJaWYgKG1lbWNtcChidWYsICJceDA4XDBcMFwwXDBcMFwwXDAiLCA4KSA9PSAwKSB7CisJCS8qCisJCSAqIHRoZSByZXBlYXQgY29kZSBpcyBiZWluZyBzZW50LCBzbyB3ZSBjb3B5CisJCSAqIHRoZSBvbGQgY29kZSB0byBMSVJDCisJCSAqLworCisJCS8qCisJCSAqIE5PVEU6IE9ubHkgaWYgdGhlIGxhc3QgY29kZSB3YXMgbGVzcyB0aGFuIDI1MG1zIGFnbworCQkgKiAtIG5vIG9uZSBzaG91bGQgYmUgYWJsZSB0byBwdXNoIGFub3RoZXIgKHVuZGV0ZWN0ZWQpIGJ1dHRvbgorCQkgKiAgIGluIHRoYXQgdGltZSBhbmQgdGhlbiBnZXQgYSBmYWxzZSByZXBlYXQgb2YgdGhlIHByZXZpb3VzCisJCSAqICAgcHJlc3MgYnV0IGl0IGlzIGxvbmcgZW5vdWdoIGZvciBhIGdlbnVpbmUgcmVwZWF0CisJCSAqLworCQlpZiAoKG1zIDwgMjUwKSAmJiAoY29udGV4dC0+Y29kZXNhdmVkICE9IDApKSB7CisJCQltZW1jcHkoYnVmLCAmY29udGV4dC0+bGFzdGNvZGUsIDgpOworCQkJY29udGV4dC0+cHJlc3N0aW1lLnR2X3NlYyA9IHR2LnR2X3NlYzsKKwkJCWNvbnRleHQtPnByZXNzdGltZS50dl91c2VjID0gdHYudHZfdXNlYzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHNhdmUgdGhlIGN1cnJlbnQgdmFsaWQgY29kZSBmb3IgcmVwZWF0cyAqLworCQltZW1jcHkoJmNvbnRleHQtPmxhc3Rjb2RlLCBidWYsIDgpOworCQkvKgorCQkgKiBzZXQgZmxhZyB0byBzaWduYWwgYSB2YWxpZCBjb2RlIHdhcyBzYXZlOworCQkgKiBqdXN0IGZvciBzYWZldHkgcmVhc29ucworCQkgKi8KKwkJY29udGV4dC0+Y29kZXNhdmVkID0gMTsKKwkJY29udGV4dC0+cHJlc3N0aW1lLnR2X3NlYyA9IHR2LnR2X3NlYzsKKwkJY29udGV4dC0+cHJlc3N0aW1lLnR2X3VzZWMgPSB0di50dl91c2VjOworCX0KKworCWxpcmNfYnVmZmVyX3dyaXRlKGNvbnRleHQtPmRyaXZlci0+cmJ1ZiwgYnVmKTsKKwl3YWtlX3VwKCZjb250ZXh0LT5kcml2ZXItPnJidWYtPndhaXRfcG9sbCk7Cit9CisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogcmVjZWl2ZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9yeF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHNhc2VtX2NvbnRleHQgKmNvbnRleHQ7CisKKwlpZiAoIXVyYikKKwkJcmV0dXJuOworCWNvbnRleHQgPSAoc3RydWN0IHNhc2VtX2NvbnRleHQgKikgdXJiLT5jb250ZXh0OworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCisJY2FzZSAtRU5PRU5UOgkJLyogdXNiY29yZSB1bmxpbmsgc3VjY2Vzc2Z1bCEgKi8KKwkJcmV0dXJuOworCisJY2FzZSAwOgorCQlpZiAoY29udGV4dC0+aXJfaXNvcGVuKQorCQkJaW5jb21pbmdfcGFja2V0KGNvbnRleHQsIHVyYik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHN0YXR1cyAoJWQpOiBpZ25vcmVkIiwKKwkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlicmVhazsKKwl9CisKKwl1c2Jfc3VibWl0X3VyYihjb250ZXh0LT5yeF91cmIsIEdGUF9BVE9NSUMpOworCXJldHVybjsKK30KKworCisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogUHJvYmUKKyAqLworc3RhdGljIGludCBzYXNlbV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2MgPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqcnhfZW5kcG9pbnQgPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdHhfZW5kcG9pbnQgPSBOVUxMOworCXN0cnVjdCB1cmIgKnJ4X3VyYiA9IE5VTEw7CisJc3RydWN0IHVyYiAqdHhfdXJiID0gTlVMTDsKKwlzdHJ1Y3QgbGlyY19kcml2ZXIgKmRyaXZlciA9IE5VTEw7CisJc3RydWN0IGxpcmNfYnVmZmVyICpyYnVmID0gTlVMTDsKKwlpbnQgbGlyY19taW5vciA9IDA7CisJaW50IG51bV9lbmRwb2ludHM7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHZmZF9lcF9mb3VuZDsKKwlpbnQgaXJfZXBfZm91bmQ7CisJaW50IGFsbG9jX3N0YXR1czsKKwlzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogZm91bmQgU2FzZW0gZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisKKworCWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisJbnVtX2VuZHBvaW50cyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKKworCS8qCisJICogU2NhbiB0aGUgZW5kcG9pbnQgbGlzdCBhbmQgc2V0OgorCSAqCWZpcnN0IGlucHV0IGVuZHBvaW50ID0gSVIgZW5kcG9pbnQKKwkgKglmaXJzdCBvdXRwdXQgZW5kcG9pbnQgPSBWRkQgZW5kcG9pbnQKKwkgKi8KKworCWlyX2VwX2ZvdW5kID0gMDsKKwl2ZmRfZXBfZm91bmQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmRwb2ludHMgJiYgIShpcl9lcF9mb3VuZCAmJiB2ZmRfZXBfZm91bmQpOyArK2kpIHsKKworCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworCQlpbnQgZXBfZGlyOworCQlpbnQgZXBfdHlwZTsKKwkJZXAgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnQgW2ldLmRlc2M7CisJCWVwX2RpciA9IGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQllcF90eXBlID0gZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOworCisJCWlmICghaXJfZXBfZm91bmQgJiYKKwkJCWVwX2RpciA9PSBVU0JfRElSX0lOICYmCisJCQllcF90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgeworCisJCQlyeF9lbmRwb2ludCA9IGVwOworCQkJaXJfZXBfZm91bmQgPSAxOworCQkJaWYgKGRlYnVnKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBJUiBlbmRwb2ludFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCisJCX0gZWxzZSBpZiAoIXZmZF9lcF9mb3VuZCAmJgorCQkJZXBfZGlyID09IFVTQl9ESVJfT1VUICYmCisJCQllcF90eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgeworCisJCQl0eF9lbmRwb2ludCA9IGVwOworCQkJdmZkX2VwX2ZvdW5kID0gMTsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogZm91bmQgVkZEIGVuZHBvaW50XG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwkvKiBJbnB1dCBlbmRwb2ludCBpcyBtYW5kYXRvcnkgKi8KKwlpZiAoIWlyX2VwX2ZvdW5kKSB7CisKKwkJZXJyKCIlczogbm8gdmFsaWQgaW5wdXQgKElSKSBlbmRwb2ludCBmb3VuZC4iLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIXZmZF9lcF9mb3VuZCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHZhbGlkIG91dHB1dCAoVkZEKSBlbmRwb2ludCBmb3VuZC5cbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisKKworCS8qIEFsbG9jYXRlIG1lbW9yeSAqLworCWFsbG9jX3N0YXR1cyA9IDA7CisKKwljb250ZXh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhc2VtX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRleHQpIHsKKwkJZXJyKCIlczoga3phbGxvYyBmYWlsZWQgZm9yIGNvbnRleHQiLCBfX2Z1bmNfXyk7CisJCWFsbG9jX3N0YXR1cyA9IDE7CisJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKKwl9CisJZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcml2ZXIpIHsKKwkJZXJyKCIlczoga3phbGxvYyBmYWlsZWQgZm9yIGxpcmNfZHJpdmVyIiwgX19mdW5jX18pOworCQlhbGxvY19zdGF0dXMgPSAyOworCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CisJfQorCXJidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJidWYpIHsKKwkJZXJyKCIlczoga21hbGxvYyBmYWlsZWQgZm9yIGxpcmNfYnVmZmVyIiwgX19mdW5jX18pOworCQlhbGxvY19zdGF0dXMgPSAzOworCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CisJfQorCWlmIChsaXJjX2J1ZmZlcl9pbml0KHJidWYsIEJVRl9DSFVOS19TSVpFLCBCVUZfU0laRSkpIHsKKwkJZXJyKCIlczogbGlyY19idWZmZXJfaW5pdCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWFsbG9jX3N0YXR1cyA9IDQ7CisJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKKwl9CisJcnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4X3VyYikgeworCQllcnIoIiVzOiB1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgSVIgdXJiIiwgX19mdW5jX18pOworCQlhbGxvY19zdGF0dXMgPSA1OworCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CisJfQorCWlmICh2ZmRfZXBfZm91bmQpIHsKKwkJdHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0eF91cmIpIHsKKwkJCWVycigiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBWRkQgdXJiIiwKKwkJCSAgICBfX2Z1bmNfXyk7CisJCQlhbGxvY19zdGF0dXMgPSA2OworCQkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOworCQl9CisJfQorCisJbXV0ZXhfaW5pdCgmY29udGV4dC0+Y3R4X2xvY2spOworCisJc3RyY3B5KGRyaXZlci0+bmFtZSwgTU9EX05BTUUpOworCWRyaXZlci0+bWlub3IgPSAtMTsKKwlkcml2ZXItPmNvZGVfbGVuZ3RoID0gNjQ7CisJZHJpdmVyLT5zYW1wbGVfcmF0ZSA9IDA7CisJZHJpdmVyLT5mZWF0dXJlcyA9IExJUkNfQ0FOX1JFQ19MSVJDQ09ERTsKKwlkcml2ZXItPmRhdGEgPSBjb250ZXh0OworCWRyaXZlci0+cmJ1ZiA9IHJidWY7CisJZHJpdmVyLT5zZXRfdXNlX2luYyA9IGlyX29wZW47CisJZHJpdmVyLT5zZXRfdXNlX2RlYyA9IGlyX2Nsb3NlOworCWRyaXZlci0+ZGV2ICAgPSAmaW50ZXJmYWNlLT5kZXY7CisJZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJbXV0ZXhfbG9jaygmY29udGV4dC0+Y3R4X2xvY2spOworCisJbGlyY19taW5vciA9IGxpcmNfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7CisJaWYgKGxpcmNfbWlub3IgPCAwKSB7CisJCWVycigiJXM6IGxpcmNfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJYWxsb2Nfc3RhdHVzID0gNzsKKwkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWdpc3RlcmVkIFNhc2VtIGRyaXZlciAobWlub3I6JWQpXG4iLAorCQkJX19mdW5jX18sIGxpcmNfbWlub3IpOworCithbGxvY19zdGF0dXNfc3dpdGNoOgorCisJc3dpdGNoIChhbGxvY19zdGF0dXMpIHsKKworCWNhc2UgNzoKKwkJaWYgKHZmZF9lcF9mb3VuZCkKKwkJCXVzYl9mcmVlX3VyYih0eF91cmIpOworCWNhc2UgNjoKKwkJdXNiX2ZyZWVfdXJiKHJ4X3VyYik7CisJY2FzZSA1OgorCQlsaXJjX2J1ZmZlcl9mcmVlKHJidWYpOworCWNhc2UgNDoKKwkJa2ZyZWUocmJ1Zik7CisJY2FzZSAzOgorCQlrZnJlZShkcml2ZXIpOworCWNhc2UgMjoKKwkJa2ZyZWUoY29udGV4dCk7CisJCWNvbnRleHQgPSBOVUxMOworCWNhc2UgMToKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCS8qIE5lZWRlZCB3aGlsZSB1bnJlZ2lzdGVyaW5nISAqLworCWRyaXZlci0+bWlub3IgPSBsaXJjX21pbm9yOworCisJY29udGV4dC0+ZGV2ID0gZGV2OworCWNvbnRleHQtPmRldl9wcmVzZW50ID0gMTsKKwljb250ZXh0LT5yeF9lbmRwb2ludCA9IHJ4X2VuZHBvaW50OworCWNvbnRleHQtPnJ4X3VyYiA9IHJ4X3VyYjsKKwlpZiAodmZkX2VwX2ZvdW5kKSB7CisJCWNvbnRleHQtPnR4X2VuZHBvaW50ID0gdHhfZW5kcG9pbnQ7CisJCWNvbnRleHQtPnR4X3VyYiA9IHR4X3VyYjsKKwkJY29udGV4dC0+dmZkX2NvbnRyYXN0ID0gMTAwMDsgICAvKiByYW5nZSAwIC0gMTAwMCAqLworCX0KKwljb250ZXh0LT5kcml2ZXIgPSBkcml2ZXI7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgY29udGV4dCk7CisKKwlpZiAodmZkX2VwX2ZvdW5kKSB7CisKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVnaXN0ZXJpbmcgVkZEIHdpdGggc3lzZnNcbiIpOworCQlpZiAodXNiX3JlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZzYXNlbV9jbGFzcykpCisJCQkvKiBOb3QgYSBmYXRhbCBlcnJvciwgc28gaWdub3JlICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY291bGQgbm90IGdldCBhIG1pbm9yIG51bWJlciAiCisJCQkgICAgICAgImZvciBWRkRcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU2FzZW0gZGV2aWNlIG9uIHVzYjwlZDolZD4gaW5pdGlhbGl6ZWRcbiIsCisJCQlfX2Z1bmNfXywgZGV2LT5idXMtPmJ1c251bSwgZGV2LT5kZXZudW0pOworCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogZGlzb25uZWN0CisgKi8KK3N0YXRpYyB2b2lkIHNhc2VtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dDsKKworCS8qIHByZXZlbnQgcmFjZXMgd2l0aCBpcl9vcGVuKCkvdmZkX29wZW4oKSAqLworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbG9jayk7CisKKwljb250ZXh0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCW11dGV4X2xvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTYXNlbSBkZXZpY2UgZGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJY29udGV4dC0+ZGV2X3ByZXNlbnQgPSAwOworCisJLyogU3RvcCByZWNlcHRpb24gKi8KKwl1c2Jfa2lsbF91cmIoY29udGV4dC0+cnhfdXJiKTsKKworCS8qIEFib3J0IG9uZ29pbmcgd3JpdGUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNvbnRleHQtPnR4LmJ1c3kpKSB7CisKKwkJdXNiX2tpbGxfdXJiKGNvbnRleHQtPnR4X3VyYik7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbnRleHQtPnR4LmZpbmlzaGVkKTsKKwl9CisKKwkvKiBEZS1yZWdpc3RlciBmcm9tIGxpcmNfZGV2IGlmIElSIHBvcnQgaXMgbm90IG9wZW4gKi8KKwlpZiAoIWNvbnRleHQtPmlyX2lzb3BlbikKKwkJZGVyZWdpc3Rlcl9mcm9tX2xpcmMoY29udGV4dCk7CisKKwl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmc2FzZW1fY2xhc3MpOworCisJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CisKKwlpZiAoIWNvbnRleHQtPmlyX2lzb3BlbiAmJiAhY29udGV4dC0+dmZkX2lzb3BlbikKKwkJZGVsZXRlX2NvbnRleHQoY29udGV4dCk7CisKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNhc2VtX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlwcmludGsoS0VSTl9JTkZPIE1PRF9ERVNDICIsIHYiIE1PRF9WRVJTSU9OICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gTU9EX0FVVEhPUiAiXG4iKTsKKworCXJjID0gdXNiX3JlZ2lzdGVyKCZzYXNlbV9kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJZXJyKCIlczogdXNiIHJlZ2lzdGVyIGZhaWxlZCAoJWQpIiwgX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2FzZW1fZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzYXNlbV9kcml2ZXIpOworCXByaW50ayhLRVJOX0lORk8gIm1vZHVsZSByZW1vdmVkLiBHb29kYnllIVxuIik7Cit9CisKKworbW9kdWxlX2luaXQoc2FzZW1faW5pdCk7Cittb2R1bGVfZXhpdChzYXNlbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTZmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCkBAIC0wLDAgKzEsMTMxMyBAQAorLyoKKyAqIGxpcmNfc2VyaWFsLmMKKyAqCisgKiBsaXJjX3NlcmlhbCAtIERldmljZSBkcml2ZXIgdGhhdCByZWNvcmRzIHB1bHNlLSBhbmQgcGF1c2UtbGVuZ3RocworICoJICAgICAgIChzcGFjZS1sZW5ndGhzKSBiZXR3ZWVuIEREQ0QgZXZlbnQgb24gYSBzZXJpYWwgcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsOTcgUmFscGggTWV0emxlciA8cmprbUB0aHAudW5pLWtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk4IFRyZW50IFBpZXBobyA8eHl6enlAdS53YXNoaW5ndG9uLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBCZW4gUGZhZmYgPGJscEBnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAxOTk5IENocmlzdG9waCBCYXJ0ZWxtdXMgPGxpcmNAYmFydGVsbXVzLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFuZHJlaSBUYW5hcyA8YW5kcmVpQHRhbmFzLmNhPiAoc3VzcGVuZC9yZXN1bWUgc3VwcG9ydCkKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisvKgorICogU3RldmUncyBjaGFuZ2VzIHRvIGltcHJvdmUgdHJhbnNtaXNzaW9uIGZpZGVsaXR5OgorICogICAtIGZvciBzeXN0ZW1zIHdpdGggdGhlIHJkdHNjIGluc3RydWN0aW9uIGFuZCB0aGUgY2xvY2sgY291bnRlciwgYQorICogICAgIHNlbmRfcHVsZSB0aGF0IHRpbWVzIHRoZSBwdWxzZXMgZGlyZWN0bHkgdXNpbmcgdGhlIGNvdW50ZXIuCisgKiAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSBMSVJDX1NFUklBTF9UUkFOU01JVFRFUl9MQVRFTkNZIGZ1ZGdlIGlzCisgKiAgICAgbm90IG5lZWRlZC4gTWVhc3VyZW1lbnQgc2hvd3MgdmVyeSBzdGFibGUgd2F2ZWZvcm0sIGV2ZW4gd2hlcmUKKyAqICAgICBQQ0kgYWN0aXZpdHkgc2xvd3MgdGhlIGFjY2VzcyB0byB0aGUgVUFSVCwgd2hpY2ggdHJpcHMgdXAgb3RoZXIKKyAqICAgICB2ZXJzaW9ucy4KKyAqICAgLSBGb3Igb3RoZXIgc3lzdGVtLCBub24taW50ZWdlci1taWNyb3NlY29uZCBwdWxzZS9zcGFjZSBsZW5ndGhzLAorICogICAgIGRvbmUgdXNpbmcgZml4ZWQgcG9pbnQgYmluYXJ5LiBTbywgbXVjaCBtb3JlIGFjY3VyYXRlIGNhcnJpZXIKKyAqICAgICBmcmVxdWVuY3kuCisgKiAgIC0gZmluZSB0dW5lZCB0cmFuc21pdHRlciBsYXRlbmN5LCB0YWtpbmcgYWR2YW50YWdlIG9mIGZyYWN0aW9uYWwKKyAqICAgICBtaWNyb3NlY29uZHMgaW4gcHJldmlvdXMgY2hhbmdlCisgKiAgIC0gRml4ZWQgYnVnIGluIHRoZSB3YXkgdHJhbnNtaXR0ZXIgbGF0ZW5jeSB3YXMgYWNjb3VudGVkIGZvciBieQorICogICAgIHR1bmluZyB0aGUgcHVsc2UgbGVuZ3RocyBkb3duIC0gdGhlIHNlbmRfcHVsc2Ugcm91dGluZSBpZ25vcmVkCisgKiAgICAgdGhpcyBvdmVyaGVhZCBhcyBpdCB0aW1lZCB0aGUgb3ZlcmFsbCBwdWxzZSBsZW5ndGggLSBzbyB0aGUKKyAqICAgICBwdWxzZSBmcmVxdWVuY3kgd2FzIHJpZ2h0IGJ1dCBvdmVyYWxsIHB1bHNlIGxlbmd0aCB3YXMgdG9vCisgKiAgICAgbG9uZy4gRml4ZWQgYnkgYWNjb3VudGluZyBmb3IgbGF0ZW5jeSBvbiBlYWNoIHB1bHNlL3NwYWNlCisgKiAgICAgaXRlcmF0aW9uLgorICoKKyAqIFN0ZXZlIERhdmllcyA8c3RldmVAZGF2aWVzZmFtLm9yZz4gIEp1bHkgMjAwMQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBDT05GSUdfTElSQ19TRVJJQUxfTlNMVTIKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNlbmRpZgorLyogRnJvbSBJbnRlbCBJWFA0MlggRGV2ZWxvcGVyJ3MgTWFudWFsICgjMjUyNDgwLTAwNSk6ICovCisvKiBmdHA6Ly9kb3dubG9hZC5pbnRlbC5jb20vZGVzaWduL25ldHdvcmsvbWFudWFscy8yNTI0ODAwNS5wZGYgKi8KKyNkZWZpbmUgVUFSVF9JRV9JWFA0MlhfVVVFICAgMHg0MCAvKiBJWFA0MlggVUFSVCBVbml0IGVuYWJsZSAqLworI2RlZmluZSBVQVJUX0lFX0lYUDQyWF9SVE9JRSAweDEwIC8qIElYUDQyWCBSZWNlaXZlciBEYXRhIFRpbWVvdXQgaW50LmVuYWJsZSAqLworCisjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgorI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CisKKyNkZWZpbmUgTElSQ19EUklWRVJfTkFNRSAibGlyY19zZXJpYWwiCisKK3N0cnVjdCBsaXJjX3NlcmlhbCB7CisJaW50IHNpZ25hbF9waW47CisJaW50IHNpZ25hbF9waW5fY2hhbmdlOworCXU4IG9uOworCXU4IG9mZjsKKwlsb25nICgqc2VuZF9wdWxzZSkodW5zaWduZWQgbG9uZyBsZW5ndGgpOworCXZvaWQgKCpzZW5kX3NwYWNlKShsb25nIGxlbmd0aCk7CisJaW50IGZlYXR1cmVzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKyNkZWZpbmUgTElSQ19IT01FQlJFVwkJMAorI2RlZmluZSBMSVJDX0lSREVPCQkxCisjZGVmaW5lIExJUkNfSVJERU9fUkVNT1RFCTIKKyNkZWZpbmUgTElSQ19BTklNQVgJCTMKKyNkZWZpbmUgTElSQ19JR09SCQk0CisjZGVmaW5lIExJUkNfTlNMVTIJCTUKKworLyoqKiBtb2R1bGUgcGFyYW1ldGVycyAqKiovCitzdGF0aWMgaW50IHR5cGU7CitzdGF0aWMgaW50IGlvOworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGlvbW1hcDsKK3N0YXRpYyBpbnQgaW9zaGlmdDsKK3N0YXRpYyBpbnQgc29mdGNhcnJpZXIgPSAxOworc3RhdGljIGludCBzaGFyZV9pcnE7CitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGludCBzZW5zZSA9IC0xOwkvKiAtMSA9IGF1dG8sIDAgPSBhY3RpdmUgaGlnaCwgMSA9IGFjdGl2ZSBsb3cgKi8KK3N0YXRpYyBpbnQgdHhzZW5zZTsJLyogMCA9IGFjdGl2ZSBoaWdoLCAxID0gYWN0aXZlIGxvdyAqLworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoZGVidWcpCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyBMSVJDX0RSSVZFUl9OQU1FICI6ICIJXAorCQkJICAgICAgIGZtdCwgIyMgYXJncyk7CQkJXAorCX0gd2hpbGUgKDApCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgbG9uZyBzZW5kX3B1bHNlX2lyZGVvKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKK3N0YXRpYyBsb25nIHNlbmRfcHVsc2VfaG9tZWJyZXcodW5zaWduZWQgbG9uZyBsZW5ndGgpOworc3RhdGljIHZvaWQgc2VuZF9zcGFjZV9pcmRlbyhsb25nIGxlbmd0aCk7CitzdGF0aWMgdm9pZCBzZW5kX3NwYWNlX2hvbWVicmV3KGxvbmcgbGVuZ3RoKTsKKworc3RhdGljIHN0cnVjdCBsaXJjX3NlcmlhbCBoYXJkd2FyZVtdID0geworCVtMSVJDX0hPTUVCUkVXXSA9IHsKKwkJLnNpZ25hbF9waW4gICAgICAgID0gVUFSVF9NU1JfRENELAorCQkuc2lnbmFsX3Bpbl9jaGFuZ2UgPSBVQVJUX01TUl9ERENELAorCQkub24gID0gKFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIgfCBVQVJUX01DUl9EVFIpLAorCQkub2ZmID0gKFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpLAorCQkuc2VuZF9wdWxzZSA9IHNlbmRfcHVsc2VfaG9tZWJyZXcsCisJCS5zZW5kX3NwYWNlID0gc2VuZF9zcGFjZV9ob21lYnJldywKKyNpZmRlZiBDT05GSUdfTElSQ19TRVJJQUxfVFJBTlNNSVRURVIKKwkJLmZlYXR1cmVzICAgID0gKExJUkNfQ0FOX1NFVF9TRU5EX0RVVFlfQ1lDTEUgfAorCQkJCUxJUkNfQ0FOX1NFVF9TRU5EX0NBUlJJRVIgfAorCQkJCUxJUkNfQ0FOX1NFTkRfUFVMU0UgfCBMSVJDX0NBTl9SRUNfTU9ERTIpCisjZWxzZQorCQkuZmVhdHVyZXMgICAgPSBMSVJDX0NBTl9SRUNfTU9ERTIKKyNlbmRpZgorCX0sCisKKwlbTElSQ19JUkRFT10gPSB7CisJCS5zaWduYWxfcGluICAgICAgICA9IFVBUlRfTVNSX0RTUiwKKwkJLnNpZ25hbF9waW5fY2hhbmdlID0gVUFSVF9NU1JfRERTUiwKKwkJLm9uICA9IFVBUlRfTUNSX09VVDIsCisJCS5vZmYgPSAoVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfT1VUMiksCisJCS5zZW5kX3B1bHNlICA9IHNlbmRfcHVsc2VfaXJkZW8sCisJCS5zZW5kX3NwYWNlICA9IHNlbmRfc3BhY2VfaXJkZW8sCisJCS5mZWF0dXJlcyAgICA9IChMSVJDX0NBTl9TRVRfU0VORF9EVVRZX0NZQ0xFIHwKKwkJCQlMSVJDX0NBTl9TRU5EX1BVTFNFIHwgTElSQ19DQU5fUkVDX01PREUyKQorCX0sCisKKwlbTElSQ19JUkRFT19SRU1PVEVdID0geworCQkuc2lnbmFsX3BpbiAgICAgICAgPSBVQVJUX01TUl9EU1IsCisJCS5zaWduYWxfcGluX2NoYW5nZSA9IFVBUlRfTVNSX0REU1IsCisJCS5vbiAgPSAoVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfT1VUMiksCisJCS5vZmYgPSAoVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfT1VUMiksCisJCS5zZW5kX3B1bHNlICA9IHNlbmRfcHVsc2VfaXJkZW8sCisJCS5zZW5kX3NwYWNlICA9IHNlbmRfc3BhY2VfaXJkZW8sCisJCS5mZWF0dXJlcyAgICA9IChMSVJDX0NBTl9TRVRfU0VORF9EVVRZX0NZQ0xFIHwKKwkJCQlMSVJDX0NBTl9TRU5EX1BVTFNFIHwgTElSQ19DQU5fUkVDX01PREUyKQorCX0sCisKKwlbTElSQ19BTklNQVhdID0geworCQkuc2lnbmFsX3BpbiAgICAgICAgPSBVQVJUX01TUl9EQ0QsCisJCS5zaWduYWxfcGluX2NoYW5nZSA9IFVBUlRfTVNSX0REQ0QsCisJCS5vbiAgPSAwLAorCQkub2ZmID0gKFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX09VVDIpLAorCQkuc2VuZF9wdWxzZSA9IE5VTEwsCisJCS5zZW5kX3NwYWNlID0gTlVMTCwKKwkJLmZlYXR1cmVzICAgPSBMSVJDX0NBTl9SRUNfTU9ERTIKKwl9LAorCisJW0xJUkNfSUdPUl0gPSB7CisJCS5zaWduYWxfcGluICAgICAgICA9IFVBUlRfTVNSX0RTUiwKKwkJLnNpZ25hbF9waW5fY2hhbmdlID0gVUFSVF9NU1JfRERTUiwKKwkJLm9uICA9IChVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyIHwgVUFSVF9NQ1JfRFRSKSwKKwkJLm9mZiA9IChVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwKKwkJLnNlbmRfcHVsc2UgPSBzZW5kX3B1bHNlX2hvbWVicmV3LAorCQkuc2VuZF9zcGFjZSA9IHNlbmRfc3BhY2VfaG9tZWJyZXcsCisjaWZkZWYgQ09ORklHX0xJUkNfU0VSSUFMX1RSQU5TTUlUVEVSCisJCS5mZWF0dXJlcyAgICA9IChMSVJDX0NBTl9TRVRfU0VORF9EVVRZX0NZQ0xFIHwKKwkJCQlMSVJDX0NBTl9TRVRfU0VORF9DQVJSSUVSIHwKKwkJCQlMSVJDX0NBTl9TRU5EX1BVTFNFIHwgTElSQ19DQU5fUkVDX01PREUyKQorI2Vsc2UKKwkJLmZlYXR1cmVzICAgID0gTElSQ19DQU5fUkVDX01PREUyCisjZW5kaWYKKwl9LAorCisjaWZkZWYgQ09ORklHX0xJUkNfU0VSSUFMX05TTFUyCisJLyoKKwkgKiBNb2RpZmllZCBMaW5rc3lzIE5ldHdvcmsgU3RvcmFnZSBMaW5rIFVTQiAyLjAgKE5TTFUyKToKKwkgKiBXZSByZWNlaXZlIG9uIENUUyBvZiB0aGUgMm5kIHNlcmlhbCBwb3J0IChSMTQyLExIUyksIHdlCisJICogdHJhbnNtaXQgd2l0aCBhIElSIGRpb2RlIGJldHdlZW4gR1BJT1sxXSAoZ3JlZW4gc3RhdHVzIExFRCksCisJICogYW5kIGdyb3VuZCAoTWF0dGhpYXMgR29lYmwgPG1hdHRoaWFzLmdvZWJsQGdvZWJsLm5ldD4pLgorCSAqIFNlZSBhbHNvIGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnIGZvciB0aGlzIGRldmljZQorCSAqLworCVtMSVJDX05TTFUyXSA9IHsKKwkJLnNpZ25hbF9waW4gICAgICAgID0gVUFSVF9NU1JfQ1RTLAorCQkuc2lnbmFsX3Bpbl9jaGFuZ2UgPSBVQVJUX01TUl9EQ1RTLAorCQkub24gID0gKFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIgfCBVQVJUX01DUl9EVFIpLAorCQkub2ZmID0gKFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpLAorCQkuc2VuZF9wdWxzZSA9IHNlbmRfcHVsc2VfaG9tZWJyZXcsCisJCS5zZW5kX3NwYWNlID0gc2VuZF9zcGFjZV9ob21lYnJldywKKyNpZmRlZiBDT05GSUdfTElSQ19TRVJJQUxfVFJBTlNNSVRURVIKKwkJLmZlYXR1cmVzICAgID0gKExJUkNfQ0FOX1NFVF9TRU5EX0RVVFlfQ1lDTEUgfAorCQkJCUxJUkNfQ0FOX1NFVF9TRU5EX0NBUlJJRVIgfAorCQkJCUxJUkNfQ0FOX1NFTkRfUFVMU0UgfCBMSVJDX0NBTl9SRUNfTU9ERTIpCisjZWxzZQorCQkuZmVhdHVyZXMgICAgPSBMSVJDX0NBTl9SRUNfTU9ERTIKKyNlbmRpZgorCX0sCisjZW5kaWYKKworfTsKKworI2RlZmluZSBSU19JU1JfUEFTU19MSU1JVCAyNTYKKworLyoKKyAqIEEgbG9uZyBwdWxzZSBjb2RlIGZyb20gYSByZW1vdGUgbWlnaHQgdGFrZSB1cCB0byAzMDAgYnl0ZXMuICBUaGUKKyAqIGRhZW1vbiBzaG91bGQgcmVhZCB0aGUgYnl0ZXMgYXMgc29vbiBhcyB0aGV5IGFyZSBnZW5lcmF0ZWQsIHNvIHRha2UKKyAqIHRoZSBudW1iZXIgb2Yga2V5cyB5b3UgdGhpbmsgeW91IGNhbiBwdXNoIGJlZm9yZSB0aGUgZGFlbW9uIHJ1bnMKKyAqIGFuZCBtdWx0aXBseSBieSAzMDAuICBUaGUgZHJpdmVyIHdpbGwgd2FybiB5b3UgaWYgeW91IG92ZXJydW4gdGhpcworICogYnVmZmVyLiAgSWYgeW91IGhhdmUgYSBzbG93IGNvbXB1dGVyIG9yIG5vbi1idXNtYXN0ZXJpbmcgSURFIGRpc2tzLAorICogbWF5YmUgeW91IHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGlzLgorICovCisKKy8qIFRoaXMgTVVTVCBiZSBhIHBvd2VyIG9mIHR3byEgIEl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiAxIGFzIHdlbGwuICovCisKKyNkZWZpbmUgUkJVRl9MRU4gMjU2CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBsYXN0dHYgPSB7MCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgbGlyY19idWZmZXIgcmJ1ZjsKKworc3RhdGljIHVuc2lnbmVkIGludCBmcmVxID0gMzgwMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGR1dHlfY3ljbGUgPSA1MDsKKworLyogSW5pdGlhbGl6ZWQgaW4gaW5pdF90aW1pbmdfcGFyYW1zKCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmlvZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHB1bHNlX3dpZHRoOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3BhY2Vfd2lkdGg7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorLyoKKyAqIEZyb206CisgKiBMaW51eCBJL08gcG9ydCBwcm9ncmFtbWluZyBtaW5pLUhPV1RPCisgKiBBdXRob3I6IFJpa3UgU2Fpa2tvbmVuIDxSaWt1LlNhaWtrb25lbkBodXQuZmk+CisgKiB2LCAyOCBEZWNlbWJlciAxOTk3CisgKgorICogWy4uLl0KKyAqIEFjdHVhbGx5LCBhIHBvcnQgSS9PIGluc3RydWN0aW9uIG9uIG1vc3QgcG9ydHMgaW4gdGhlIDAtMHgzZmYgcmFuZ2UKKyAqIHRha2VzIGFsbW9zdCBleGFjdGx5IDEgbWljcm9zZWNvbmQsIHNvIGlmIHlvdSdyZSwgZm9yIGV4YW1wbGUsIHVzaW5nCisgKiB0aGUgcGFyYWxsZWwgcG9ydCBkaXJlY3RseSwganVzdCBkbyBhZGRpdGlvbmFsIGluYigpcyBmcm9tIHRoYXQgcG9ydAorICogdG8gZGVsYXkuCisgKiBbLi4uXQorICovCisvKiB0cmFuc21pdHRlciBsYXRlbmN5IDEuNTYyNXVzIDB4MS45MCAtIHRoaXMgZmlndXJlIGFycml2ZWQgYXQgZnJvbQorICogY29tbWVudCBhYm92ZSBwbHVzIHRyaW1taW5nIHRvIG1hdGNoIGFjdHVhbCBtZWFzdXJlZCBmcmVxdWVuY3kuCisgKiBUaGlzIHdpbGwgYmUgc2Vuc2l0aXZlIHRvIGNwdSBzcGVlZCwgdGhvdWdoIGhvcGVmdWxseSBtb3N0IG9mIHRoZSAxLjV1cworICogaXMgc3BlbnQgaW4gdGhlIHVhcnQgYWNjZXNzLiAgU3RpbGwgLSBmb3IgcmVmZXJlbmNlIHRlc3QgbWFjaGluZSB3YXMgYQorICogMS4xM0dIeiBBdGhsb24gc3lzdGVtIC0gU3RldmUKKyAqLworCisvKgorICogY2hhbmdlZCBmcm9tIDQwMCB0byA0NTAgYXMgdGhpcyB3b3JrcyBiZXR0ZXIgb24gc2xvd2VyIG1hY2hpbmVzOworICogZmFzdGVyIG1hY2hpbmVzIHdpbGwgdXNlIHRoZSByZHRzYyBjb2RlIGFueXdheQorICovCisjZGVmaW5lIExJUkNfU0VSSUFMX1RSQU5TTUlUVEVSX0xBVEVOQ1kgNDUwCisKKyNlbHNlCisKKy8qIGRvZXMgYW55Ym9keSBoYXZlIGluZm9ybWF0aW9uIG9uIG90aGVyIHBsYXRmb3JtcyA/ICovCisvKiAyNTYgPSAxPDw4ICovCisjZGVmaW5lIExJUkNfU0VSSUFMX1RSQU5TTUlUVEVSX0xBVEVOQ1kgMjU2CisKKyNlbmRpZiAgLyogX19pMzg2X18gKi8KKy8qCisgKiBGSVhNRTogc2hvdWxkIHdlIGJlIHVzaW5nIGhydGltZXJzIGluc3RlYWQgb2YgdGhpcworICogTElSQ19TRVJJQUxfVFJBTlNNSVRURVJfTEFURU5DWSBub25zZW5zZT8KKyAqLworCisvKiBmZXRjaCBzZXJpYWwgaW5wdXQgcGFja2V0ICgxIGJ5dGUpIGZyb20gcmVnaXN0ZXIgb2Zmc2V0ICovCitzdGF0aWMgdTggc2lucChpbnQgb2Zmc2V0KQoreworCWlmIChpb21tYXAgIT0gMCkKKwkJLyogdGhlIHJlZ2lzdGVyIGlzIG1lbW9yeS1tYXBwZWQgKi8KKwkJb2Zmc2V0IDw8PSBpb3NoaWZ0OworCisJcmV0dXJuIGluYihpbyArIG9mZnNldCk7Cit9CisKKy8qIHdyaXRlIHNlcmlhbCBvdXRwdXQgcGFja2V0ICgxIGJ5dGUpIG9mIHZhbHVlIHRvIHJlZ2lzdGVyIG9mZnNldCAqLworc3RhdGljIHZvaWQgc291dHAoaW50IG9mZnNldCwgdTggdmFsdWUpCit7CisJaWYgKGlvbW1hcCAhPSAwKQorCQkvKiB0aGUgcmVnaXN0ZXIgaXMgbWVtb3J5LW1hcHBlZCAqLworCQlvZmZzZXQgPDw9IGlvc2hpZnQ7CisKKwlvdXRiKHZhbHVlLCBpbyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0xJUkNfU0VSSUFMX05TTFUyCisJLyoKKwkgKiBPbiBOU0xVMiwgd2UgcHV0IHRoZSB0cmFuc21pdCBkaW9kZSBiZXR3ZWVuIHRoZSBvdXRwdXQgb2YgdGhlIGdyZWVuCisJICogc3RhdHVzIExFRCBhbmQgZ3JvdW5kCisJICovCisJaWYgKHR5cGUgPT0gTElSQ19OU0xVMikgeworCQlncGlvX2xpbmVfc2V0KE5TTFUyX0xFRF9HUk4sIElYUDRYWF9HUElPX0xPVyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAodHhzZW5zZSkKKwkJc291dHAoVUFSVF9NQ1IsIGhhcmR3YXJlW3R5cGVdLm9mZik7CisJZWxzZQorCQlzb3V0cChVQVJUX01DUiwgaGFyZHdhcmVbdHlwZV0ub24pOworfQorCitzdGF0aWMgdm9pZCBvZmYodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTElSQ19TRVJJQUxfTlNMVTIKKwlpZiAodHlwZSA9PSBMSVJDX05TTFUyKSB7CisJCWdwaW9fbGluZV9zZXQoTlNMVTJfTEVEX0dSTiwgSVhQNFhYX0dQSU9fSElHSCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAodHhzZW5zZSkKKwkJc291dHAoVUFSVF9NQ1IsIGhhcmR3YXJlW3R5cGVdLm9uKTsKKwllbHNlCisJCXNvdXRwKFVBUlRfTUNSLCBoYXJkd2FyZVt0eXBlXS5vZmYpOworfQorCisjaWZuZGVmIE1BWF9VREVMQVlfTVMKKyNkZWZpbmUgTUFYX1VERUxBWV9VUyA1MDAwCisjZWxzZQorI2RlZmluZSBNQVhfVURFTEFZX1VTIChNQVhfVURFTEFZX01TKjEwMDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2FmZV91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwl3aGlsZSAodXNlY3MgPiBNQVhfVURFTEFZX1VTKSB7CisJCXVkZWxheShNQVhfVURFTEFZX1VTKTsKKwkJdXNlY3MgLT0gTUFYX1VERUxBWV9VUzsKKwl9CisJdWRlbGF5KHVzZWNzKTsKK30KKworI2lmZGVmIFVTRV9SRFRTQworLyoKKyAqIFRoaXMgaXMgYW4gb3ZlcmZsb3cvcHJlY2lzaW9uIGp1Z2dsZSwgY29tcGxpY2F0ZWQgaW4gdGhhdCB3ZSBjYW4ndAorICogZG8gbG9uZyBsb25nIGRpdmlkZSBpbiB0aGUga2VybmVsCisgKi8KKworLyoKKyAqIFdoZW4gd2UgdXNlIHRoZSByZHRzYyBpbnN0cnVjdGlvbiB0byBtZWFzdXJlIGNsb2Nrcywgd2Uga2VlcCB0aGUKKyAqIHB1bHNlIGFuZCBzcGFjZSB3aWR0aHMgYXMgY2xvY2sgY3ljbGVzLiAgQXMgdGhpcyBpcyBDUFUgc3BlZWQKKyAqIGRlcGVuZGVudCwgdGhlIHdpZHRocyBtdXN0IGJlIGNhbGN1bGF0ZWQgaW4gaW5pdF9wb3J0IGFuZCBpb2N0bAorICogdGltZQorICovCisKKy8qIFNvIHNlbmRfcHVsc2UgY2FuIHF1aWNrbHkgY29udmVydCBtaWNyb3NlY29uZHMgdG8gY2xvY2tzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb252X3VzX3RvX2Nsb2NrczsKKworc3RhdGljIGludCBpbml0X3RpbWluZ19wYXJhbXModW5zaWduZWQgaW50IG5ld19kdXR5X2N5Y2xlLAorCQl1bnNpZ25lZCBpbnQgbmV3X2ZyZXEpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGxvb3BzX3Blcl9zZWMsIHdvcms7CisKKwlkdXR5X2N5Y2xlID0gbmV3X2R1dHlfY3ljbGU7CisJZnJlcSA9IG5ld19mcmVxOworCisJbG9vcHNfcGVyX3NlYyA9IGN1cnJlbnRfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5OworCWxvb3BzX3Blcl9zZWMgKj0gSFo7CisKKwkvKiBIb3cgbWFueSBjbG9ja3MgaW4gYSBtaWNyb3NlY29uZD8sIGF2b2lkaW5nIGxvbmcgbG9uZyBkaXZpZGUgKi8KKwl3b3JrID0gbG9vcHNfcGVyX3NlYzsKKwl3b3JrICo9IDQyOTU7ICAvKiA0Mjk1ID0gMl4zMiAvIDFlNiAqLworCWNvbnZfdXNfdG9fY2xvY2tzID0gKHdvcmsgPj4gMzIpOworCisJLyoKKwkgKiBDYXJyaWVyIHBlcmlvZCBpbiBjbG9ja3MsIGFwcHJvYWNoIGdvb2QgdXAgdG8gMzJHSHogY2xvY2ssCisJICogZ2V0cyBjYXJyaWVyIGZyZXF1ZW5jeSB3aXRoaW4gOEh6CisJICovCisJcGVyaW9kID0gbG9vcHNfcGVyX3NlYyA+PiAzOworCXBlcmlvZCAvPSAoZnJlcSA+PiAzKTsKKworCS8qIERlcml2ZSBwdWxzZSBhbmQgc3BhY2UgZnJvbSB0aGUgcGVyaW9kICovCisJcHVsc2Vfd2lkdGggPSBwZXJpb2QgKiBkdXR5X2N5Y2xlIC8gMTAwOworCXNwYWNlX3dpZHRoID0gcGVyaW9kIC0gcHVsc2Vfd2lkdGg7CisJZHByaW50aygiaW4gaW5pdF90aW1pbmdfcGFyYW1zLCBmcmVxPSVkLCBkdXR5X2N5Y2xlPSVkLCAiCisJCSJjbGsvamlmZnk9JWxkLCBwdWxzZT0lbGQsIHNwYWNlPSVsZCwgIgorCQkiY29udl91c190b19jbG9ja3M9JWxkXG4iLAorCQlmcmVxLCBkdXR5X2N5Y2xlLCBjdXJyZW50X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeSwKKwkJcHVsc2Vfd2lkdGgsIHNwYWNlX3dpZHRoLCBjb252X3VzX3RvX2Nsb2Nrcyk7CisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiAhIFVTRV9SRFRTQyAqLworc3RhdGljIGludCBpbml0X3RpbWluZ19wYXJhbXModW5zaWduZWQgaW50IG5ld19kdXR5X2N5Y2xlLAorCQl1bnNpZ25lZCBpbnQgbmV3X2ZyZXEpCit7CisvKgorICogcGVyaW9kLCBwdWxzZS9zcGFjZSB3aWR0aCBhcmUga2VwdCB3aXRoIDggYmluYXJ5IHBsYWNlcyAtCisgKiBJRSBtdWx0aXBsaWVkIGJ5IDI1Ni4KKyAqLworCWlmICgyNTYgKiAxMDAwMDAwTCAvIG5ld19mcmVxICogbmV3X2R1dHlfY3ljbGUgLyAxMDAgPD0KKwkgICAgTElSQ19TRVJJQUxfVFJBTlNNSVRURVJfTEFURU5DWSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKDI1NiAqIDEwMDAwMDBMIC8gbmV3X2ZyZXEgKiAoMTAwIC0gbmV3X2R1dHlfY3ljbGUpIC8gMTAwIDw9CisJICAgIExJUkNfU0VSSUFMX1RSQU5TTUlUVEVSX0xBVEVOQ1kpCisJCXJldHVybiAtRUlOVkFMOworCWR1dHlfY3ljbGUgPSBuZXdfZHV0eV9jeWNsZTsKKwlmcmVxID0gbmV3X2ZyZXE7CisJcGVyaW9kID0gMjU2ICogMTAwMDAwMEwgLyBmcmVxOworCXB1bHNlX3dpZHRoID0gcGVyaW9kICogZHV0eV9jeWNsZSAvIDEwMDsKKwlzcGFjZV93aWR0aCA9IHBlcmlvZCAtIHB1bHNlX3dpZHRoOworCWRwcmludGsoImluIGluaXRfdGltaW5nX3BhcmFtcywgZnJlcT0lZCBwdWxzZT0lbGQsICIKKwkJInNwYWNlPSVsZFxuIiwgZnJlcSwgcHVsc2Vfd2lkdGgsIHNwYWNlX3dpZHRoKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBVU0VfUkRUU0MgKi8KKworCisvKiByZXR1cm4gdmFsdWU6IHNwYWNlIGxlbmd0aCBkZWx0YSAqLworCitzdGF0aWMgbG9uZyBzZW5kX3B1bHNlX2lyZGVvKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCWxvbmcgcmF3Yml0cywgcmV0OworCWludCBpOworCXVuc2lnbmVkIGNoYXIgb3V0cHV0OworCXVuc2lnbmVkIGNoYXIgY2h1bmssIHNoaWZ0ZWQ7CisKKwkvKiBob3cgbWFueSBiaXRzIGhhdmUgdG8gYmUgc2VudCA/ICovCisJcmF3Yml0cyA9IGxlbmd0aCAqIDExNTIgLyAxMDAwMDsKKwlpZiAoZHV0eV9jeWNsZSA+IDUwKQorCQljaHVuayA9IDM7CisJZWxzZQorCQljaHVuayA9IDE7CisJZm9yIChpID0gMCwgb3V0cHV0ID0gMHg3ZjsgcmF3Yml0cyA+IDA7IHJhd2JpdHMgLT0gMykgeworCQlzaGlmdGVkID0gY2h1bmsgPDwgKGkgKiAzKTsKKwkJc2hpZnRlZCA+Pj0gMTsKKwkJb3V0cHV0ICY9ICh+c2hpZnRlZCk7CisJCWkrKzsKKwkJaWYgKGkgPT0gMykgeworCQkJc291dHAoVUFSVF9UWCwgb3V0cHV0KTsKKwkJCXdoaWxlICghKHNpbnAoVUFSVF9MU1IpICYgVUFSVF9MU1JfVEhSRSkpCisJCQkJOworCQkJb3V0cHV0ID0gMHg3ZjsKKwkJCWkgPSAwOworCQl9CisJfQorCWlmIChpICE9IDApIHsKKwkJc291dHAoVUFSVF9UWCwgb3V0cHV0KTsKKwkJd2hpbGUgKCEoc2lucChVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwkJCTsKKwl9CisKKwlpZiAoaSA9PSAwKQorCQlyZXQgPSAoLXJhd2JpdHMpICogMTAwMDAgLyAxMTUyOworCWVsc2UKKwkJcmV0ID0gKDMgLSBpKSAqIDMgKiAxMDAwMCAvIDExNTIgKyAoLXJhd2JpdHMpICogMTAwMDAgLyAxMTUyOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFVTRV9SRFRTQworLyogVmVyc2lvbiB0aGF0IHVzZXMgUGVudGl1bSByZHRzYyBpbnN0cnVjdGlvbiB0byBtZWFzdXJlIGNsb2NrcyAqLworCisvKgorICogVGhpcyB2ZXJzaW9uIGRvZXMgc3ViLW1pY3Jvc2Vjb25kIHRpbWluZyB1c2luZyByZHRzYyBpbnN0cnVjdGlvbiwKKyAqIGFuZCBkb2VzIGF3YXkgd2l0aCB0aGUgZnVkZ2VkIExJUkNfU0VSSUFMX1RSQU5TTUlUVEVSX0xBVEVOQ1kKKyAqIEltcGxpY2l0bHkgaTU4NiBhcmNoaXRlY3R1cmUuLi4gIC0gU3RldmUKKyAqLworCitzdGF0aWMgbG9uZyBzZW5kX3B1bHNlX2hvbWVicmV3X3NvZnRjYXJyaWVyKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCWludCBmbGFnOworCXVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBzdGFydCwgbm93OworCisJLyogR2V0IGdvaW5nIHF1aWNrIGFzIHdlIGNhbiAqLworCXJkdHNjbChzdGFydCk7CisJb24oKTsKKwkvKiBDb252ZXJ0IGxlbmd0aCBmcm9tIG1pY3Jvc2Vjb25kcyB0byBjbG9ja3MgKi8KKwlsZW5ndGggKj0gY29udl91c190b19jbG9ja3M7CisJLyogQW5kIGxvb3AgdGlsbCB0aW1lIGlzIHVwIC0gZmxpcHBpbmcgYXQgcmlnaHQgaW50ZXJ2YWxzICovCisJbm93ID0gc3RhcnQ7CisJdGFyZ2V0ID0gcHVsc2Vfd2lkdGg7CisJZmxhZyA9IDE7CisJLyoKKwkgKiBGSVhNRTogVGhpcyBsb29rcyBsaWtlIGEgaGFyZCBidXN5IHdhaXQsIHdpdGhvdXQgZXZlbiBhbiBvY2Nhc2lvbmFsLAorCSAqIHBvbGl0ZSwgY3B1X3JlbGF4KCkgY2FsbC4gIFRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheT8KKwkgKgorCSAqIFRoZSBpMmMgY29kZSBoYXMgdGhlIHJlc3VsdCBvZiBhIGxvdCBvZiBiaXQtYmFuZ2luZyB3b3JrLCBJIHdvbmRlciBpZgorCSAqIHRoZXJlJ3Mgc29tZXRoaW5nIHRoZXJlIHdoaWNoIGNvdWxkIGJlIGhlbHBmdWwgaGVyZS4KKwkgKi8KKwl3aGlsZSAoKG5vdyAtIHN0YXJ0KSA8IGxlbmd0aCkgeworCQkvKiBEZWxheSB0aWxsIGZsaXAgdGltZSAqLworCQlkbyB7CisJCQlyZHRzY2wobm93KTsKKwkJfSB3aGlsZSAoKG5vdyAtIHN0YXJ0KSA8IHRhcmdldCk7CisKKwkJLyogZmxpcCAqLworCQlpZiAoZmxhZykgeworCQkJcmR0c2NsKG5vdyk7CisJCQlvZmYoKTsKKwkJCXRhcmdldCArPSBzcGFjZV93aWR0aDsKKwkJfSBlbHNlIHsKKwkJCXJkdHNjbChub3cpOyBvbigpOworCQkJdGFyZ2V0ICs9IHB1bHNlX3dpZHRoOworCQl9CisJCWZsYWcgPSAhZmxhZzsKKwl9CisJcmR0c2NsKG5vdyk7CisJcmV0dXJuICgobm93IC0gc3RhcnQpIC0gbGVuZ3RoKSAvIGNvbnZfdXNfdG9fY2xvY2tzOworfQorI2Vsc2UgLyogISBVU0VfUkRUU0MgKi8KKy8qIFZlcnNpb24gdXNpbmcgdWRlbGF5KCkgKi8KKworLyoKKyAqIGhlcmUgd2UgdXNlIGZpeGVkIHBvaW50IGFyaXRobWV0aWMsIHdpdGggOAorICogZnJhY3Rpb25hbCBiaXRzLiAgdGhhdCBnZXRzIHVzIHdpdGhpbiAwLjElIG9yIHNvIG9mIHRoZSByaWdodCBhdmVyYWdlCisgKiBmcmVxdWVuY3ksIGFsYmVpdCB3aXRoIHNvbWUgaml0dGVyIGluIHB1bHNlIGxlbmd0aCAtIFN0ZXZlCisgKi8KKworLyogVG8gbWF0Y2ggOCBmcmFjdGlvbmFsIGJpdHMgdXNlZCBmb3IgcHVsc2Uvc3BhY2UgbGVuZ3RoICovCisKK3N0YXRpYyBsb25nIHNlbmRfcHVsc2VfaG9tZWJyZXdfc29mdGNhcnJpZXIodW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJaW50IGZsYWc7CisJdW5zaWduZWQgbG9uZyBhY3R1YWwsIHRhcmdldCwgZDsKKwlsZW5ndGggPDw9IDg7CisKKwlhY3R1YWwgPSAwOyB0YXJnZXQgPSAwOyBmbGFnID0gMDsKKwl3aGlsZSAoYWN0dWFsIDwgbGVuZ3RoKSB7CisJCWlmIChmbGFnKSB7CisJCQlvZmYoKTsKKwkJCXRhcmdldCArPSBzcGFjZV93aWR0aDsKKwkJfSBlbHNlIHsKKwkJCW9uKCk7CisJCQl0YXJnZXQgKz0gcHVsc2Vfd2lkdGg7CisJCX0KKwkJZCA9ICh0YXJnZXQgLSBhY3R1YWwgLQorCQkgICAgIExJUkNfU0VSSUFMX1RSQU5TTUlUVEVSX0xBVEVOQ1kgKyAxMjgpID4+IDg7CisJCS8qCisJCSAqIE5vdGUgLSB3ZSd2ZSBjaGVja2VkIGluIGlvY3RsIHRoYXQgdGhlIHB1bHNlL3NwYWNlCisJCSAqIHdpZHRocyBhcmUgYmlnIGVub3VnaCBzbyB0aGF0IGQgaXMgPiAwCisJCSAqLworCQl1ZGVsYXkoZCk7CisJCWFjdHVhbCArPSAoZCA8PCA4KSArIExJUkNfU0VSSUFMX1RSQU5TTUlUVEVSX0xBVEVOQ1k7CisJCWZsYWcgPSAhZmxhZzsKKwl9CisJcmV0dXJuIChhY3R1YWwtbGVuZ3RoKSA+PiA4OworfQorI2VuZGlmIC8qIFVTRV9SRFRTQyAqLworCitzdGF0aWMgbG9uZyBzZW5kX3B1bHNlX2hvbWVicmV3KHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCWlmIChsZW5ndGggPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc29mdGNhcnJpZXIpCisJCXJldHVybiBzZW5kX3B1bHNlX2hvbWVicmV3X3NvZnRjYXJyaWVyKGxlbmd0aCk7CisJZWxzZSB7CisJCW9uKCk7CisJCXNhZmVfdWRlbGF5KGxlbmd0aCk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHZvaWQgc2VuZF9zcGFjZV9pcmRlbyhsb25nIGxlbmd0aCkKK3sKKwlpZiAobGVuZ3RoIDw9IDApCisJCXJldHVybjsKKworCXNhZmVfdWRlbGF5KGxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfc3BhY2VfaG9tZWJyZXcobG9uZyBsZW5ndGgpCit7CisJb2ZmKCk7CisJaWYgKGxlbmd0aCA8PSAwKQorCQlyZXR1cm47CisJc2FmZV91ZGVsYXkobGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgcmJ3cml0ZShpbnQgbCkKK3sKKwlpZiAobGlyY19idWZmZXJfZnVsbCgmcmJ1ZikpIHsKKwkJLyogbm8gbmV3IHNpZ25hbHMgd2lsbCBiZSBhY2NlcHRlZCAqLworCQlkcHJpbnRrKCJCdWZmZXIgb3ZlcnJ1blxuIik7CisJCXJldHVybjsKKwl9CisJbGlyY19idWZmZXJfd3JpdGUoJnJidWYsICh2b2lkICopJmwpOworfQorCitzdGF0aWMgdm9pZCBmcmJ3cml0ZShpbnQgbCkKK3sKKwkvKiBzaW1wbGUgbm9pc2UgZmlsdGVyICovCisJc3RhdGljIGludCBwdWxzZSwgc3BhY2U7CisJc3RhdGljIHVuc2lnbmVkIGludCBwdHI7CisKKwlpZiAocHRyID4gMCAmJiAobCAmIFBVTFNFX0JJVCkpIHsKKwkJcHVsc2UgKz0gbCAmIFBVTFNFX01BU0s7CisJCWlmIChwdWxzZSA+IDI1MCkgeworCQkJcmJ3cml0ZShzcGFjZSk7CisJCQlyYndyaXRlKHB1bHNlIHwgUFVMU0VfQklUKTsKKwkJCXB0ciA9IDA7CisJCQlwdWxzZSA9IDA7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoIShsICYgUFVMU0VfQklUKSkgeworCQlpZiAocHRyID09IDApIHsKKwkJCWlmIChsID4gMjAwMDApIHsKKwkJCQlzcGFjZSA9IGw7CisJCQkJcHRyKys7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGwgPiAyMDAwMCkgeworCQkJCXNwYWNlICs9IHB1bHNlOworCQkJCWlmIChzcGFjZSA+IFBVTFNFX01BU0spCisJCQkJCXNwYWNlID0gUFVMU0VfTUFTSzsKKwkJCQlzcGFjZSArPSBsOworCQkJCWlmIChzcGFjZSA+IFBVTFNFX01BU0spCisJCQkJCXNwYWNlID0gUFVMU0VfTUFTSzsKKwkJCQlwdWxzZSA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcmJ3cml0ZShzcGFjZSk7CisJCQlyYndyaXRlKHB1bHNlIHwgUFVMU0VfQklUKTsKKwkJCXB0ciA9IDA7CisJCQlwdWxzZSA9IDA7CisJCX0KKwl9CisJcmJ3cml0ZShsKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBpLCB2b2lkICpibGFoKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCBjb3VudGVyLCBkY2Q7CisJdTggc3RhdHVzOworCWxvbmcgZGVsdHY7CisJaW50IGRhdGE7CisJc3RhdGljIGludCBsYXN0X2RjZCA9IC0xOworCisJaWYgKChzaW5wKFVBUlRfSUlSKSAmIFVBUlRfSUlSX05PX0lOVCkpIHsKKwkJLyogbm90IG91ciBpbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWNvdW50ZXIgPSAwOworCWRvIHsKKwkJY291bnRlcisrOworCQlzdGF0dXMgPSBzaW5wKFVBUlRfTVNSKTsKKwkJaWYgKGNvdW50ZXIgPiBSU19JU1JfUEFTU19MSU1JVCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBMSVJDX0RSSVZFUl9OQU1FICI6IEFJRUVFRTogIgorCQkJICAgICAgICJXZSdyZSBjYXVnaHQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoc3RhdHVzICYgaGFyZHdhcmVbdHlwZV0uc2lnbmFsX3Bpbl9jaGFuZ2UpCisJCSAgICAmJiBzZW5zZSAhPSAtMSkgeworCQkJLyogZ2V0IGN1cnJlbnQgdGltZSAqLworCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisKKwkJCS8qIE5ldyBtb2RlLCB3cml0dGVuIGJ5IFRyZW50IFBpZXBobworCQkJICAgPHh5enp5QHUud2FzaGluZ3Rvbi5lZHU+LiAqLworCisJCQkvKgorCQkJICogVGhlIG9sZCBmb3JtYXQgd2FzIG5vdCB2ZXJ5IHBvcnRhYmxlLgorCQkJICogV2Ugbm93IHVzZSBhbiBpbnQgdG8gcGFzcyBwdWxzZXMKKwkJCSAqIGFuZCBzcGFjZXMgdG8gdXNlciBzcGFjZS4KKwkJCSAqCisJCQkgKiBJZiBQVUxTRV9CSVQgaXMgc2V0IGEgcHVsc2UgaGFzIGJlZW4KKwkJCSAqIHJlY2VpdmVkLCBvdGhlcndpc2UgYSBzcGFjZSBoYXMgYmVlbgorCQkJICogcmVjZWl2ZWQuICBUaGUgZHJpdmVyIG5lZWRzIHRvIGtub3cgaWYgeW91cgorCQkJICogcmVjZWl2ZXIgaXMgYWN0aXZlIGhpZ2ggb3IgYWN0aXZlIGxvdywgb3IKKwkJCSAqIHRoZSBzcGFjZS9wdWxzZSBzZW5zZSBjb3VsZCBiZQorCQkJICogaW52ZXJ0ZWQuIFRoZSBiaXRzIGRlbm90ZWQgYnkgUFVMU0VfTUFTSyBhcmUKKwkJCSAqIHRoZSBsZW5ndGggaW4gbWljcm9zZWNvbmRzLiBMZW5ndGhzIGdyZWF0ZXIKKwkJCSAqIHRoYW4gb3IgZXF1YWwgdG8gMTYgc2Vjb25kcyBhcmUgY2xhbXBlZCB0bworCQkJICogUFVMU0VfTUFTSy4gIEFsbCBvdGhlciBiaXRzIGFyZSB1bnVzZWQuCisJCQkgKiBUaGlzIGlzIGEgbXVjaCBzaW1wbGVyIGludGVyZmFjZSBmb3IgdXNlcgorCQkJICogcHJvZ3JhbXMsIGFzIHdlbGwgYXMgZWxpbWluYXRpbmcgIm91dCBvZgorCQkJICogcGhhc2UiIGVycm9ycyB3aXRoIHNwYWNlL3B1bHNlCisJCQkgKiBhdXRvZGV0ZWN0aW9uLgorCQkJICovCisKKwkJCS8qIGNhbGMgdGltZSBzaW5jZSBsYXN0IGludGVycnVwdCBpbiBtaWNyb3NlY29uZHMgKi8KKwkJCWRjZCA9IChzdGF0dXMgJiBoYXJkd2FyZVt0eXBlXS5zaWduYWxfcGluKSA/IDEgOiAwOworCisJCQlpZiAoZGNkID09IGxhc3RfZGNkKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBMSVJDX0RSSVZFUl9OQU1FCisJCQkJIjogaWdub3Jpbmcgc3Bpa2U6ICVkICVkICVseCAlbHggJWx4ICVseFxuIiwKKwkJCQlkY2QsIHNlbnNlLAorCQkJCXR2LnR2X3NlYywgbGFzdHR2LnR2X3NlYywKKwkJCQl0di50dl91c2VjLCBsYXN0dHYudHZfdXNlYyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRlbHR2ID0gdHYudHZfc2VjLWxhc3R0di50dl9zZWM7CisJCQlpZiAodHYudHZfc2VjIDwgbGFzdHR2LnR2X3NlYyB8fAorCQkJICAgICh0di50dl9zZWMgPT0gbGFzdHR2LnR2X3NlYyAmJgorCQkJICAgICB0di50dl91c2VjIDwgbGFzdHR2LnR2X3VzZWMpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBMSVJDX0RSSVZFUl9OQU1FCisJCQkJICAgICAgICI6IEFJRUVFRTogeW91ciBjbG9jayBqdXN0IGp1bXBlZCAiCisJCQkJICAgICAgICJiYWNrd2FyZHNcbiIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgTElSQ19EUklWRVJfTkFNRQorCQkJCSAgICAgICAiOiAlZCAlZCAlbHggJWx4ICVseCAlbHhcbiIsCisJCQkJICAgICAgIGRjZCwgc2Vuc2UsCisJCQkJICAgICAgIHR2LnR2X3NlYywgbGFzdHR2LnR2X3NlYywKKwkJCQkgICAgICAgdHYudHZfdXNlYywgbGFzdHR2LnR2X3VzZWMpOworCQkJCWRhdGEgPSBQVUxTRV9NQVNLOworCQkJfSBlbHNlIGlmIChkZWx0diA+IDE1KSB7CisJCQkJZGF0YSA9IFBVTFNFX01BU0s7IC8qIHJlYWxseSBsb25nIHRpbWUgKi8KKwkJCQlpZiAoIShkY2Rec2Vuc2UpKSB7CisJCQkJCS8qIHNhbml0eSBjaGVjayAqLworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIExJUkNfRFJJVkVSX05BTUUKKwkJCQkJICAgICAgICI6IEFJRUVFRTogIgorCQkJCQkgICAgICAgIiVkICVkICVseCAlbHggJWx4ICVseFxuIiwKKwkJCQkJICAgICAgIGRjZCwgc2Vuc2UsCisJCQkJCSAgICAgICB0di50dl9zZWMsIGxhc3R0di50dl9zZWMsCisJCQkJCSAgICAgICB0di50dl91c2VjLCBsYXN0dHYudHZfdXNlYyk7CisJCQkJCS8qCisJCQkJCSAqIGRldGVjdGluZyBwdWxzZSB3aGlsZSB0aGlzCisJCQkJCSAqIE1VU1QgYmUgYSBzcGFjZSEKKwkJCQkJICovCisJCQkJCXNlbnNlID0gc2Vuc2UgPyAwIDogMTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlkYXRhID0gKGludCkgKGRlbHR2KjEwMDAwMDAgKworCQkJCQkgICAgICAgdHYudHZfdXNlYyAtCisJCQkJCSAgICAgICBsYXN0dHYudHZfdXNlYyk7CisJCQlmcmJ3cml0ZShkY2Rec2Vuc2UgPyBkYXRhIDogKGRhdGF8UFVMU0VfQklUKSk7CisJCQlsYXN0dHYgPSB0djsKKwkJCWxhc3RfZGNkID0gZGNkOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyYnVmLndhaXRfcG9sbCk7CisJCX0KKwl9IHdoaWxlICghKHNpbnAoVUFSVF9JSVIpICYgVUFSVF9JSVJfTk9fSU5UKSk7IC8qIHN0aWxsIHBlbmRpbmcgPyAqLworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaW50IGhhcmR3YXJlX2luaXRfcG9ydCh2b2lkKQoreworCXU4IHNjcmF0Y2gsIHNjcmF0Y2gyLCBzY3JhdGNoMzsKKworCS8qCisJICogVGhpcyBpcyBhIHNpbXBsZSBwb3J0IGV4aXN0ZW5jZSB0ZXN0LCBib3Jyb3dlZCBmcm9tIHRoZSBhdXRvY29uZmlnCisJICogZnVuY3Rpb24gaW4gZHJpdmVycy9zZXJpYWwvODI1MC5jCisJICovCisJc2NyYXRjaCA9IHNpbnAoVUFSVF9JRVIpOworCXNvdXRwKFVBUlRfSUVSLCAwKTsKKyNpZmRlZiBfX2kzODZfXworCW91dGIoMHhmZiwgMHgwODApOworI2VuZGlmCisJc2NyYXRjaDIgPSBzaW5wKFVBUlRfSUVSKSAmIDB4MGY7CisJc291dHAoVUFSVF9JRVIsIDB4MGYpOworI2lmZGVmIF9faTM4Nl9fCisJb3V0YigweDAwLCAweDA4MCk7CisjZW5kaWYKKwlzY3JhdGNoMyA9IHNpbnAoVUFSVF9JRVIpICYgMHgwZjsKKwlzb3V0cChVQVJUX0lFUiwgc2NyYXRjaCk7CisJaWYgKHNjcmF0Y2gyICE9IDAgfHwgc2NyYXRjaDMgIT0gMHgwZikgeworCQkvKiB3ZSBmYWlsLCB0aGVyZSdzIG5vdGhpbmcgaGVyZSAqLworCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRSAiOiBwb3J0IGV4aXN0ZW5jZSB0ZXN0ICIKKwkJICAgICAgICJmYWlsZWQsIGNhbm5vdCBjb250aW51ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisKKwkvKiBTZXQgRExBQiAwLiAqLworCXNvdXRwKFVBUlRfTENSLCBzaW5wKFVBUlRfTENSKSAmICh+VUFSVF9MQ1JfRExBQikpOworCisJLyogRmlyc3Qgb2YgYWxsLCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJc291dHAoVUFSVF9JRVIsIHNpbnAoVUFSVF9JRVIpICYKKwkgICAgICAofihVQVJUX0lFUl9NU0l8VUFSVF9JRVJfUkxTSXxVQVJUX0lFUl9USFJJfFVBUlRfSUVSX1JESSkpKTsKKworCS8qIENsZWFyIHJlZ2lzdGVycy4gKi8KKwlzaW5wKFVBUlRfTFNSKTsKKwlzaW5wKFVBUlRfUlgpOworCXNpbnAoVUFSVF9JSVIpOworCXNpbnAoVUFSVF9NU1IpOworCisjaWZkZWYgQ09ORklHX0xJUkNfU0VSSUFMX05TTFUyCisJaWYgKHR5cGUgPT0gTElSQ19OU0xVMikgeworCQkvKiBTZXR1cCBOU0xVMiBVQVJUICovCisKKwkJLyogRW5hYmxlIFVBUlQgKi8KKwkJc291dHAoVUFSVF9JRVIsIHNpbnAoVUFSVF9JRVIpIHwgVUFSVF9JRV9JWFA0MlhfVVVFKTsKKwkJLyogRGlzYWJsZSBSZWNlaXZlciBkYXRhIFRpbWUgb3V0IGludGVycnVwdCAqLworCQlzb3V0cChVQVJUX0lFUiwgc2lucChVQVJUX0lFUikgJiB+VUFSVF9JRV9JWFA0MlhfUlRPSUUpOworCQkvKiBzZXQgb3V0MiA9IGludGVycnVwdCB1bm1hc2s7IG9mZigpIGRvZXNuJ3Qgc2V0IE1DUgorCQkgICBvbiBOU0xVMiAqLworCQlzb3V0cChVQVJUX01DUiwgVUFSVF9NQ1JfUlRTfFVBUlRfTUNSX09VVDIpOworCX0KKyNlbmRpZgorCisJLyogU2V0IGxpbmUgZm9yIHBvd2VyIHNvdXJjZSAqLworCW9mZigpOworCisJLyogQ2xlYXIgcmVnaXN0ZXJzIGFnYWluIHRvIGJlIHN1cmUuICovCisJc2lucChVQVJUX0xTUik7CisJc2lucChVQVJUX1JYKTsKKwlzaW5wKFVBUlRfSUlSKTsKKwlzaW5wKFVBUlRfTVNSKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTElSQ19JUkRFTzoKKwljYXNlIExJUkNfSVJERU9fUkVNT1RFOgorCQkvKiBzZXR1cCBwb3J0IHRvIDdOMSBAIDExNTIwMCBCYXVkICovCisJCS8qIDdOMStzdGFydCA9IDkgYml0cyBhdCAxMTUyMDAgfiAzIGJpdHMgYXQgMzhrSHogKi8KKworCQkvKiBTZXQgRExBQiAxLiAqLworCQlzb3V0cChVQVJUX0xDUiwgc2lucChVQVJUX0xDUikgfCBVQVJUX0xDUl9ETEFCKTsKKwkJLyogU2V0IGRpdmlzb3IgdG8gMSA9PiAxMTUyMDAgQmF1ZCAqLworCQlzb3V0cChVQVJUX0RMTSwgMCk7CisJCXNvdXRwKFVBUlRfRExMLCAxKTsKKwkJLyogU2V0IERMQUIgMCArICA3TjEgKi8KKwkJc291dHAoVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU43KTsKKwkJLyogVEhSIGludGVycnVwdCBhbHJlYWR5IGRpc2FibGVkIGF0IHRoaXMgcG9pbnQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9wb3J0KHZvaWQpCit7CisJaW50IGksIG5sb3csIG5oaWdoOworCisJLyogUmVzZXJ2ZSBpbyByZWdpb24uICovCisJLyoKKwkgKiBGdXR1cmUgTU1BUC1EZXZlbG9wZXJzOiBBdHRlbnRpb24hCisJICogRm9yIG1lbW9yeSBtYXBwZWQgSS9PIHlvdSAqbWlnaHQqIG5lZWQgdG8gdXNlIGlvcmVtYXAoKSBmaXJzdCwKKwkgKiBmb3IgdGhlIE5TTFUyIGl0J3MgZG9uZSBpbiBib290IGNvZGUuCisJICovCisJaWYgKCgoaW9tbWFwICE9IDApCisJICAgICAmJiAocmVxdWVzdF9tZW1fcmVnaW9uKGlvbW1hcCwgOCA8PCBpb3NoaWZ0LAorCQkJCSAgICBMSVJDX0RSSVZFUl9OQU1FKSA9PSBOVUxMKSkKKwkgICB8fCAoKGlvbW1hcCA9PSAwKQorCSAgICAgICAmJiAocmVxdWVzdF9yZWdpb24oaW8sIDgsIExJUkNfRFJJVkVSX05BTUUpID09IE5VTEwpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIExJUkNfRFJJVkVSX05BTUUKKwkJICAgICAgICI6IHBvcnQgJTA0eCBhbHJlYWR5IGluIHVzZVxuIiwgaW8pOworCQlwcmludGsoS0VSTl9XQVJOSU5HIExJUkNfRFJJVkVSX05BTUUKKwkJICAgICAgICI6IHVzZSAnc2V0c2VyaWFsIC9kZXYvdHR5U1ggdWFydCBub25lJ1xuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogb3IgY29tcGlsZSB0aGUgc2VyaWFsIHBvcnQgZHJpdmVyIGFzIG1vZHVsZSBhbmRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIExJUkNfRFJJVkVSX05BTUUKKwkJICAgICAgICI6IG1ha2Ugc3VyZSB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgZmlyc3RcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChoYXJkd2FyZV9pbml0X3BvcnQoKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSW5pdGlhbGl6ZSBwdWxzZS9zcGFjZSB3aWR0aHMgKi8KKwlpbml0X3RpbWluZ19wYXJhbXMoZHV0eV9jeWNsZSwgZnJlcSk7CisKKwkvKiBJZiBwaW4gaXMgaGlnaCwgdGhlbiB0aGlzIG11c3QgYmUgYW4gYWN0aXZlIGxvdyByZWNlaXZlci4gKi8KKwlpZiAoc2Vuc2UgPT0gLTEpIHsKKwkJLyogd2FpdCAxLzIgc2VjIGZvciB0aGUgcG93ZXIgc3VwcGx5ICovCisJCW1zbGVlcCg1MDApOworCisJCS8qCisJCSAqIHByb2JlIDkgdGltZXMgZXZlcnkgMC4wNHMsIGNvbGxlY3QgInZvdGVzIiBmb3IKKwkJICogYWN0aXZlIGhpZ2gvbG93CisJCSAqLworCQlubG93ID0gMDsKKwkJbmhpZ2ggPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCQlpZiAoc2lucChVQVJUX01TUikgJiBoYXJkd2FyZVt0eXBlXS5zaWduYWxfcGluKQorCQkJCW5sb3crKzsKKwkJCWVsc2UKKwkJCQluaGlnaCsrOworCQkJbXNsZWVwKDQwKTsKKwkJfQorCQlzZW5zZSA9IChubG93ID49IG5oaWdoID8gMSA6IDApOworCQlwcmludGsoS0VSTl9JTkZPIExJUkNfRFJJVkVSX05BTUUgICI6IGF1dG8tZGV0ZWN0ZWQgYWN0aXZlICIKKwkJICAgICAgICIlcyByZWNlaXZlclxuIiwgc2Vuc2UgPyAibG93IiA6ICJoaWdoIik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRSAgIjogTWFudWFsbHkgdXNpbmcgYWN0aXZlICIKKwkJICAgICAgICIlcyByZWNlaXZlclxuIiwgc2Vuc2UgPyAibG93IiA6ICJoaWdoIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdXNlX2luYyh2b2lkICpkYXRhKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGluaXRpYWxpemUgdGltZXN0YW1wICovCisJZG9fZ2V0dGltZW9mZGF5KCZsYXN0dHYpOworCisJcmVzdWx0ID0gcmVxdWVzdF9pcnEoaXJxLCBpcnFfaGFuZGxlciwKKwkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IChzaGFyZV9pcnEgPyBJUlFGX1NIQVJFRCA6IDApLAorCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCAodm9pZCAqKSZoYXJkd2FyZSk7CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVCVVNZOgorCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRSAiOiBJUlEgJWQgYnVzeVxuIiwgaXJxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIC1FSU5WQUw6CisJCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FCisJCSAgICAgICAiOiBCYWQgaXJxIG51bWJlciBvciBoYW5kbGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoKKwkJZHByaW50aygiSW50ZXJydXB0ICVkLCBwb3J0ICUwNHggb2J0YWluZWRcbiIsIGlycSwgaW8pOworCQlicmVhazsKKwl9OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKKworCS8qIFNldCBETEFCIDAuICovCisJc291dHAoVUFSVF9MQ1IsIHNpbnAoVUFSVF9MQ1IpICYgKH5VQVJUX0xDUl9ETEFCKSk7CisKKwlzb3V0cChVQVJUX0lFUiwgc2lucChVQVJUX0lFUil8VUFSVF9JRVJfTVNJKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfdXNlX2RlYyh2b2lkICpkYXRhKQorewl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKKworCS8qIFNldCBETEFCIDAuICovCisJc291dHAoVUFSVF9MQ1IsIHNpbnAoVUFSVF9MQ1IpICYgKH5VQVJUX0xDUl9ETEFCKSk7CisKKwkvKiBGaXJzdCBvZiBhbGwsIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlzb3V0cChVQVJUX0lFUiwgc2lucChVQVJUX0lFUikgJgorCSAgICAgICh+KFVBUlRfSUVSX01TSXxVQVJUX0lFUl9STFNJfFVBUlRfSUVSX1RIUkl8VUFSVF9JRVJfUkRJKSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKKworCWZyZWVfaXJxKGlycSwgKHZvaWQgKikmaGFyZHdhcmUpOworCisJZHByaW50aygiZnJlZWQgSVJRICVkXG4iLCBpcnEpOworfQorCitzdGF0aWMgc3NpemVfdCBsaXJjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IG4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaSwgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGRlbHRhID0gMDsKKwlpbnQgKndidWY7CisKKwlpZiAoIShoYXJkd2FyZVt0eXBlXS5mZWF0dXJlcyAmIExJUkNfQ0FOX1NFTkRfUFVMU0UpKQorCQlyZXR1cm4gLUVCQURGOworCisJY291bnQgPSBuIC8gc2l6ZW9mKGludCk7CisJaWYgKG4gJSBzaXplb2YoaW50KSB8fCBjb3VudCAlIDIgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJd2J1ZiA9IG1lbWR1cF91c2VyKGJ1Ziwgbik7CisJaWYgKFBUUl9FUlIod2J1ZikpCisJCXJldHVybiBQVFJfRVJSKHdidWYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZoYXJkd2FyZVt0eXBlXS5sb2NrLCBmbGFncyk7CisJaWYgKHR5cGUgPT0gTElSQ19JUkRFTykgeworCQkvKiBEVFIsIFJUUyBkb3duICovCisJCW9uKCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChpJTIpCisJCQloYXJkd2FyZVt0eXBlXS5zZW5kX3NwYWNlKHdidWZbaV0gLSBkZWx0YSk7CisJCWVsc2UKKwkJCWRlbHRhID0gaGFyZHdhcmVbdHlwZV0uc2VuZF9wdWxzZSh3YnVmW2ldKTsKKwl9CisJb2ZmKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVbdHlwZV0ubG9jaywgZmxhZ3MpOworCXJldHVybiBuOworfQorCitzdGF0aWMgbG9uZyBsaXJjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGludCBpdmFsdWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTElSQ19HRVRfU0VORF9NT0RFOgorCQlpZiAoIShoYXJkd2FyZVt0eXBlXS5mZWF0dXJlcyZMSVJDX0NBTl9TRU5EX01BU0spKQorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCQlyZXN1bHQgPSBwdXRfdXNlcihMSVJDX1NFTkQyTU9ERQorCQkJCSAgKGhhcmR3YXJlW3R5cGVdLmZlYXR1cmVzJkxJUkNfQ0FOX1NFTkRfTUFTSyksCisJCQkJICAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJYnJlYWs7CisKKwljYXNlIExJUkNfU0VUX1NFTkRfTU9ERToKKwkJaWYgKCEoaGFyZHdhcmVbdHlwZV0uZmVhdHVyZXMmTElSQ19DQU5fU0VORF9NQVNLKSkKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQkvKiBvbmx5IExJUkNfTU9ERV9QVUxTRSBzdXBwb3J0ZWQgKi8KKwkJaWYgKHZhbHVlICE9IExJUkNfTU9ERV9QVUxTRSkKKwkJCXJldHVybiAtRU5PU1lTOworCQlicmVhazsKKworCWNhc2UgTElSQ19HRVRfTEVOR1RIOgorCQlyZXR1cm4gLUVOT1NZUzsKKwkJYnJlYWs7CisKKwljYXNlIExJUkNfU0VUX1NFTkRfRFVUWV9DWUNMRToKKwkJZHByaW50aygiU0VUX1NFTkRfRFVUWV9DWUNMRVxuIik7CisJCWlmICghKGhhcmR3YXJlW3R5cGVdLmZlYXR1cmVzJkxJUkNfQ0FOX1NFVF9TRU5EX0RVVFlfQ1lDTEUpKQorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCQlyZXN1bHQgPSBnZXRfdXNlcihpdmFsdWUsICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmIChpdmFsdWUgPD0gMCB8fCBpdmFsdWUgPiAxMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGluaXRfdGltaW5nX3BhcmFtcyhpdmFsdWUsIGZyZXEpOworCQlicmVhazsKKworCWNhc2UgTElSQ19TRVRfU0VORF9DQVJSSUVSOgorCQlkcHJpbnRrKCJTRVRfU0VORF9DQVJSSUVSXG4iKTsKKwkJaWYgKCEoaGFyZHdhcmVbdHlwZV0uZmVhdHVyZXMmTElSQ19DQU5fU0VUX1NFTkRfQ0FSUklFUikpCisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJCXJlc3VsdCA9IGdldF91c2VyKGl2YWx1ZSwgKHVuc2lnbmVkIGludCAqKSBhcmcpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKGl2YWx1ZSA+IDUwMDAwMCB8fCBpdmFsdWUgPCAyMDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gaW5pdF90aW1pbmdfcGFyYW1zKGR1dHlfY3ljbGUsIGl2YWx1ZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxpcmNfZGV2X2ZvcF9pb2N0bChmaWxlcCwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGlyY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCT0gbGlyY193cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBsaXJjX2lvY3RsLAorCS5yZWFkCQk9IGxpcmNfZGV2X2ZvcF9yZWFkLAorCS5wb2xsCQk9IGxpcmNfZGV2X2ZvcF9wb2xsLAorCS5vcGVuCQk9IGxpcmNfZGV2X2ZvcF9vcGVuLAorCS5yZWxlYXNlCT0gbGlyY19kZXZfZm9wX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBsaXJjX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gTElSQ19EUklWRVJfTkFNRSwKKwkubWlub3IJCT0gLTEsCisJLmNvZGVfbGVuZ3RoCT0gMSwKKwkuc2FtcGxlX3JhdGUJPSAwLAorCS5kYXRhCQk9IE5VTEwsCisJLmFkZF90b19idWYJPSBOVUxMLAorCS5yYnVmCQk9ICZyYnVmLAorCS5zZXRfdXNlX2luYwk9IHNldF91c2VfaW5jLAorCS5zZXRfdXNlX2RlYwk9IHNldF91c2VfZGVjLAorCS5mb3BzCQk9ICZsaXJjX2ZvcHMsCisJLmRldgkJPSBOVUxMLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpsaXJjX3NlcmlhbF9kZXY7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxpcmNfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbGlyY19zZXJpYWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaXJjX3NlcmlhbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJLyogU2V0IERMQUIgMC4gKi8KKwlzb3V0cChVQVJUX0xDUiwgc2lucChVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlzb3V0cChVQVJUX0lFUiwgc2lucChVQVJUX0lFUikgJgorCSAgICAgICh+KFVBUlRfSUVSX01TSXxVQVJUX0lFUl9STFNJfFVBUlRfSUVSX1RIUkl8VUFSVF9JRVJfUkRJKSkpOworCisJLyogQ2xlYXIgcmVnaXN0ZXJzLiAqLworCXNpbnAoVUFSVF9MU1IpOworCXNpbnAoVUFSVF9SWCk7CisJc2lucChVQVJUX0lJUik7CisJc2lucChVQVJUX01TUik7CisKKwlyZXR1cm4gMDsKK30KKworLyogdHdpc3R5IG1hemUuLi4gbmVlZCBhIGZvcndhcmQtZGVjbGFyYXRpb24gaGVyZS4uLiAqLworc3RhdGljIHZvaWQgbGlyY19zZXJpYWxfZXhpdCh2b2lkKTsKKworc3RhdGljIGludCBsaXJjX3NlcmlhbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaGFyZHdhcmVfaW5pdF9wb3J0KCkgPCAwKSB7CisJCWxpcmNfc2VyaWFsX2V4aXQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlW3R5cGVdLmxvY2ssIGZsYWdzKTsKKwkvKiBFbmFibGUgSW50ZXJydXB0ICovCisJZG9fZ2V0dGltZW9mZGF5KCZsYXN0dHYpOworCXNvdXRwKFVBUlRfSUVSLCBzaW5wKFVBUlRfSUVSKXxVQVJUX0lFUl9NU0kpOworCW9mZigpOworCisJbGlyY19idWZmZXJfY2xlYXIoJnJidWYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVbdHlwZV0ubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxpcmNfc2VyaWFsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbGlyY19zZXJpYWxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChsaXJjX3NlcmlhbF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gbGlyY19zZXJpYWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGxpcmNfc2VyaWFsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGlyY19zZXJpYWwiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbGlyY19zZXJpYWxfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwkvKiBJbml0IHJlYWQgYnVmZmVyLiAqLworCXJlc3VsdCA9IGxpcmNfYnVmZmVyX2luaXQoJnJidWYsIHNpemVvZihpbnQpLCBSQlVGX0xFTik7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzdWx0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsaXJjX3NlcmlhbF9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKCJsaXJjIHJlZ2lzdGVyIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGV4aXRfYnVmZmVyX2ZyZWU7CisJfQorCisJbGlyY19zZXJpYWxfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJsaXJjX3NlcmlhbCIsIDApOworCWlmICghbGlyY19zZXJpYWxfZGV2KSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9kcml2ZXJfdW5yZWdpc3RlcjsKKwl9CisKKwlyZXN1bHQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGxpcmNfc2VyaWFsX2Rldik7CisJaWYgKHJlc3VsdCkKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisKKwlyZXR1cm4gMDsKKworZXhpdF9kZXZpY2VfcHV0OgorCXBsYXRmb3JtX2RldmljZV9wdXQobGlyY19zZXJpYWxfZGV2KTsKK2V4aXRfZHJpdmVyX3VucmVnaXN0ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmxpcmNfc2VyaWFsX2RyaXZlcik7CitleGl0X2J1ZmZlcl9mcmVlOgorCWxpcmNfYnVmZmVyX2ZyZWUoJnJidWYpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGxpcmNfc2VyaWFsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihsaXJjX3NlcmlhbF9kZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZsaXJjX3NlcmlhbF9kcml2ZXIpOworCWxpcmNfYnVmZmVyX2ZyZWUoJnJidWYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBsaXJjX3NlcmlhbF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBsaXJjX3NlcmlhbF9pbml0KCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTElSQ19IT01FQlJFVzoKKwljYXNlIExJUkNfSVJERU86CisJY2FzZSBMSVJDX0lSREVPX1JFTU9URToKKwljYXNlIExJUkNfQU5JTUFYOgorCWNhc2UgTElSQ19JR09SOgorCQkvKiBpZiBub3RoaW5nIHNwZWNpZmllZCwgdXNlIHR0eVMwL2NvbTEgYW5kIGlycSA0ICovCisJCWlvID0gaW8gPyBpbyA6IDB4M2Y4OworCQlpcnEgPSBpcnEgPyBpcnEgOiA0OworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfTElSQ19TRVJJQUxfTlNMVTIKKwljYXNlIExJUkNfTlNMVTI6CisJCWlvID0gaW8gPyBpbyA6IElSUV9JWFA0WFhfVUFSVDI7CisJCWlycSA9IGlycSA/IGlycSA6IChJWFA0WFhfVUFSVDJfQkFTRV9WSVJUICsgUkVHX09GRlNFVCk7CisJCWlvbW1hcCA9IGlvbW1hcCA/IGlvbW1hcCA6IElYUDRYWF9VQVJUMl9CQVNFX1BIWVM7CisJCWlvc2hpZnQgPSBpb3NoaWZ0ID8gaW9zaGlmdCA6IDI7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0X3NlcmlhbF9leGl0OworCX0KKwlpZiAoIXNvZnRjYXJyaWVyKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIExJUkNfSE9NRUJSRVc6CisJCWNhc2UgTElSQ19JR09SOgorI2lmZGVmIENPTkZJR19MSVJDX1NFUklBTF9OU0xVMgorCQljYXNlIExJUkNfTlNMVTI6CisjZW5kaWYKKwkJCWhhcmR3YXJlW3R5cGVdLmZlYXR1cmVzICY9CisJCQkJfihMSVJDX0NBTl9TRVRfU0VORF9EVVRZX0NZQ0xFfAorCQkJCSAgTElSQ19DQU5fU0VUX1NFTkRfQ0FSUklFUik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlc3VsdCA9IGluaXRfcG9ydCgpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGV4aXRfc2VyaWFsX2V4aXQ7CisJZHJpdmVyLmZlYXR1cmVzID0gaGFyZHdhcmVbdHlwZV0uZmVhdHVyZXM7CisJZHJpdmVyLmRldiA9ICZsaXJjX3NlcmlhbF9kZXYtPmRldjsKKwlkcml2ZXIubWlub3IgPSBsaXJjX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlpZiAoZHJpdmVyLm1pbm9yIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIExJUkNfRFJJVkVSX05BTUUKKwkJICAgICAgICI6IHJlZ2lzdGVyX2NocmRldiBmYWlsZWQhXG4iKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCXJldHVybiAwOworZXhpdF9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKGlvLCA4KTsKK2V4aXRfc2VyaWFsX2V4aXQ6CisJbGlyY19zZXJpYWxfZXhpdCgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsaXJjX3NlcmlhbF9leGl0X21vZHVsZSh2b2lkKQoreworCWxpcmNfc2VyaWFsX2V4aXQoKTsKKwlpZiAoaW9tbWFwICE9IDApCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpb21tYXAsIDggPDwgaW9zaGlmdCk7CisJZWxzZQorCQlyZWxlYXNlX3JlZ2lvbihpbywgOCk7CisJbGlyY191bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIubWlub3IpOworCWRwcmludGsoImNsZWFuZWQgdXAgbW9kdWxlXG4iKTsKK30KKworCittb2R1bGVfaW5pdChsaXJjX3NlcmlhbF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChsaXJjX3NlcmlhbF9leGl0X21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSW5mcmEtcmVkIHJlY2VpdmVyIGRyaXZlciBmb3Igc2VyaWFsIHBvcnRzLiIpOworTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciwgVHJlbnQgUGllcGhvLCBCZW4gUGZhZmYsICIKKwkgICAgICAiQ2hyaXN0b3BoIEJhcnRlbG11cywgQW5kcmVpIFRhbmFzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbSh0eXBlLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh0eXBlLCAiSGFyZHdhcmUgdHlwZSAoMCA9IGhvbWUtYnJldywgMSA9IElSZGVvLCIKKwkJICIgMiA9IElSZGVvIFJlbW90ZSwgMyA9IEFuaW1hWCwgNCA9IElnb3JQbHVnLCIKKwkJICIgNSA9IE5TTFUyIFJYOkNUUzIvVFg6R3JlZW5MRUQpIik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBiYXNlICgweDNmOCBvciAweDJmOCkiKTsKKworLyogc29tZSBhcmNoaXRlY3R1cmVzIChlLmcuIGludGVsIHhzY2FsZSkgaGF2ZSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworbW9kdWxlX3BhcmFtKGlvbW1hcCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlvbW1hcCwgInBoeXNpY2FsIGJhc2UgZm9yIG1lbW9yeSBtYXBwZWQgSS9PIgorCQkiICgwID0gbm8gbWVtb3J5IG1hcHBlZCBpbykiKTsKKworLyoKKyAqIHNvbWUgYXJjaGl0ZWN0dXJlcyAoZS5nLiBpbnRlbCB4c2NhbGUpIGFsaWduIHRoZSA4Yml0IHNlcmlhbCByZWdpc3RlcnMKKyAqIG9uIDMyYml0IHdvcmQgYm91bmRhcmllcy4KKyAqIFNlZSBsaW51eC1rZXJuZWwvc2VyaWFsLzgyNTAuYyBzZXJpYWxfaW4oKS9vdXQoKQorICovCittb2R1bGVfcGFyYW0oaW9zaGlmdCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9zaGlmdCwgInNoaWZ0IEkvTyByZWdpc3RlciBvZmZzZXQgKDAgPSBubyBzaGlmdCkiKTsKKworbW9kdWxlX3BhcmFtKGlycSwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSW50ZXJydXB0ICg0IG9yIDMpIik7CisKK21vZHVsZV9wYXJhbShzaGFyZV9pcnEsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzaGFyZV9pcnEsICJTaGFyZSBpbnRlcnJ1cHRzICgwID0gb2ZmLCAxID0gb24pIik7CisKK21vZHVsZV9wYXJhbShzZW5zZSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHNlbnNlLCAiT3ZlcnJpZGUgYXV0b2RldGVjdGlvbiBvZiBJUiByZWNlaXZlciBjaXJjdWl0IgorCQkgIiAoMCA9IGFjdGl2ZSBoaWdoLCAxID0gYWN0aXZlIGxvdyApIik7CisKKyNpZmRlZiBDT05GSUdfTElSQ19TRVJJQUxfVFJBTlNNSVRURVIKK21vZHVsZV9wYXJhbSh0eHNlbnNlLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0ModHhzZW5zZSwgIlNlbnNlIG9mIHRyYW5zbWl0dGVyIGNpcmN1aXQiCisJCSAiICgwID0gYWN0aXZlIGhpZ2gsIDEgPSBhY3RpdmUgbG93ICkiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oc29mdGNhcnJpZXIsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzb2Z0Y2FycmllciwgIlNvZnR3YXJlIGNhcnJpZXIgKDAgPSBvZmYsIDEgPSBvbiwgZGVmYXVsdCBvbikiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwOGZhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMKQEAgLTAsMCArMSwxMjgyIEBACisvKgorICogTElSQyBTSVIgZHJpdmVyLCAoQykgMjAwMCBNaWxhbiBQaWt1bGEgPHd3d0Bmb3JuYXguc2s+CisgKgorICogbGlyY19zaXIgLSBEZXZpY2UgZHJpdmVyIGZvciB1c2Ugd2l0aCBTSVIgKHNlcmlhbCBpbmZyYSByZWQpCisgKiBtb2RlIG9mIElyREEgb24gbWFueSBub3RlYm9va3MuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqIDIwMDAvMDkvMTYgRnJhbmsgUHJ6eWJ5bHNraSA8bWFpbEBmcmFua3ByenlieWxza2kuZGU+IDoKKyAqICBhZGRlZCB0aW1lb3V0IGFuZCByZWxheGVkIHB1bHNlIGRldGVjdGlvbiwgcmVtb3ZlZCBnYXAgYnVnCisgKgorICogMjAwMC8xMi8xNSBDaHJpc3RvcGggQmFydGVsbXVzIDxsaXJjQGJhcnRlbG11cy5kZT4gOgorICogICBhZGRlZCBzdXBwb3J0IGZvciBUZWtyYW0gSXJtYXRlIDIxMCAoc2VuZGluZyBkb2VzIG5vdCB3b3JrIHlldCwKKyAqICAga2luZCBvZiBkaXNhcHBvaW50aW5nIHRoYXQgbm9ib2R5IHdhcyBhYmxlIHRvIGltcGxlbWVudCB0aGF0CisgKiAgIGJlZm9yZSksCisgKiAgIG1ham9yIGNsZWFuLXVwCisgKgorICogMjAwMS8wMi8yNyBDaHJpc3RvcGggQmFydGVsbXVzIDxsaXJjQGJhcnRlbG11cy5kZT4gOgorICogICBhZGRlZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gU0ExMTAwIGVtYmVkZGVkIG1pY3JvcHJvY2Vzc29yCisgKiAgIHBhcnRzIGN1dCduJ3Bhc3RlZCBmcm9tIHNhMTEwMF9pci5jIChDKSAyMDAwIFJ1c3NlbGwgS2luZworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaWZkZWYgTElSQ19PTl9TQTExMDAKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpZmRlZiBDT05GSUdfU0ExMTAwX0NPTExJRQorI2luY2x1ZGUgPGFzbS9hcmNoL3RjMzUxNDMuaD4KKyNpbmNsdWRlIDxhc20vdWNiMTIwMC5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKworLyogU0VDVElPTjogRGVmaW5pdGlvbnMgKi8KKworLyoqKiBUZWtyYW0gZG9uZ2xlICoqKi8KKyNpZmRlZiBMSVJDX1NJUl9URUtSQU0KKy8qIHN0b2xlbiBmcm9tIGtlcm5lbCBzb3VyY2UgKi8KKy8qIGRlZmluaXRpb25zIGZvciBUZWtyYW0gZG9uZ2xlICovCisjZGVmaW5lIFRFS1JBTV8xMTUyMDAgMHgwMAorI2RlZmluZSBURUtSQU1fNTc2MDAgIDB4MDEKKyNkZWZpbmUgVEVLUkFNXzM4NDAwICAweDAyCisjZGVmaW5lIFRFS1JBTV8xOTIwMCAgMHgwMworI2RlZmluZSBURUtSQU1fOTYwMCAgIDB4MDQKKyNkZWZpbmUgVEVLUkFNXzI0MDAgICAweDA4CisKKyNkZWZpbmUgVEVLUkFNX1BXIDB4MTAgLyogUHVsc2Ugc2VsZWN0IGJpdCAqLworCisvKiAxMGJpdCAqIDFzLzExNTIwMGJpdCBpbiBtaWxsaXNlY29uZHMgPSA4N21zKi8KKyNkZWZpbmUgVElNRV9DT05TVCAoMTAwMDAwMDB1bC8xMTUyMDB1bCkKKworI2VuZGlmCisKKyNpZmRlZiBMSVJDX1NJUl9BQ1RJU1lTX0FDVDIwMEwKK3N0YXRpYyB2b2lkIGluaXRfYWN0MjAwKHZvaWQpOworI2VsaWYgZGVmaW5lZChMSVJDX1NJUl9BQ1RJU1lTX0FDVDIyMEwpCitzdGF0aWMgdm9pZCBpbml0X2FjdDIyMCh2b2lkKTsKKyNlbmRpZgorCisvKioqIFNBMTEwMCAqKiovCisjaWZkZWYgTElSQ19PTl9TQTExMDAKK3N0cnVjdCBzYTExMDBfc2VyMl9yZWdpc3RlcnMgeworCS8qIEhTU1AgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGNoYXIgaHNjcjA7CisJLyogVUFSVCByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBjaGFyIHV0Y3IwOworCXVuc2lnbmVkIGNoYXIgdXRjcjE7CisJdW5zaWduZWQgY2hhciB1dGNyMjsKKwl1bnNpZ25lZCBjaGFyIHV0Y3IzOworCXVuc2lnbmVkIGNoYXIgdXRjcjQ7CisJdW5zaWduZWQgY2hhciB1dGRyOworCXVuc2lnbmVkIGNoYXIgdXRzcjA7CisJdW5zaWduZWQgY2hhciB1dHNyMTsKK30gc3I7CisKK3N0YXRpYyBpbnQgaXJxID0gSVJRX1NlcjJJQ1A7CisKKyNkZWZpbmUgTElSQ19PTl9TQTExMDBfVFJBTlNNSVRURVJfTEFURU5DWSAwCisKKy8qIHB1bHNlL3NwYWNlIHJhdGlvIG9mIDUwLzUwICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwdWxzZV93aWR0aCA9ICgxMy1MSVJDX09OX1NBMTEwMF9UUkFOU01JVFRFUl9MQVRFTkNZKTsKKy8qIDEwMDAwMDAvZnJlcS1wdWxzZV93aWR0aCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3BhY2Vfd2lkdGggPSAoMTMtTElSQ19PTl9TQTExMDBfVFJBTlNNSVRURVJfTEFURU5DWSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGZyZXEgPSAzODAwMDsgICAgICAvKiBtb2R1bGF0aW9uIGZyZXF1ZW5jeSAqLworc3RhdGljIHVuc2lnbmVkIGludCBkdXR5X2N5Y2xlID0gNTA7ICAgLyogZHV0eSBjeWNsZSBvZiA1MCUgKi8KKworI2VuZGlmCisKKyNkZWZpbmUgUkJVRl9MRU4gMTAyNAorI2RlZmluZSBXQlVGX0xFTiAxMDI0CisKKyNkZWZpbmUgTElSQ19EUklWRVJfTkFNRSAibGlyY19zaXIiCisKKyNkZWZpbmUgUFVMU0UgJ1snCisKKyNpZm5kZWYgTElSQ19TSVJfVEVLUkFNCisvKiA5Yml0ICogMXMvMTE1MjAwYml0IGluIG1pbGxpIHNlY29uZHMgPSA3OC4xMjVtcyovCisjZGVmaW5lIFRJTUVfQ09OU1QgKDkwMDAwMDB1bC8xMTUyMDB1bCkKKyNlbmRpZgorCisKKy8qIHRpbWVvdXQgZm9yIHNlcXVlbmNlcyBpbiBqaWZmaWVzICg9NS8xMDBzKSwgbXVzdCBiZSBsb25nZXIgdGhhbiBUSU1FX0NPTlNUICovCisjZGVmaW5lIFNJUl9USU1FT1VUCShIWio1LzEwMCkKKworI2lmbmRlZiBMSVJDX09OX1NBMTEwMAorI2lmbmRlZiBMSVJDX0lSUQorI2RlZmluZSBMSVJDX0lSUSA0CisjZW5kaWYKKyNpZm5kZWYgTElSQ19QT1JUCisvKiBmb3IgZXh0ZXJuYWwgZG9uZ2xlcywgZGVmYXVsdCB0byBjb20xICovCisjaWYgZGVmaW5lZChMSVJDX1NJUl9BQ1RJU1lTX0FDVDIwMEwpIHx8IFwKKyAgICBkZWZpbmVkKExJUkNfU0lSX0FDVElTWVNfQUNUMjIwTCkgfHwgXAorICAgIGRlZmluZWQoTElSQ19TSVJfVEVLUkFNKQorI2RlZmluZSBMSVJDX1BPUlQgMHgzZjgKKyNlbHNlCisvKiBvbmJvYXJkIHNpciBwb3J0cyBhcmUgdHlwaWNhbGx5IGNvbTMgKi8KKyNkZWZpbmUgTElSQ19QT1JUIDB4M2U4CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW50IGlvID0gTElSQ19QT1JUOworc3RhdGljIGludCBpcnEgPSBMSVJDX0lSUTsKK3N0YXRpYyBpbnQgdGhyZXNob2xkID0gMzsKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpbWVyX2xvY2spOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVybGlzdDsKKy8qIHRpbWUgb2YgbGFzdCBzaWduYWwgY2hhbmdlIGRldGVjdGVkICovCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgbGFzdF90diA9IHswLCAwfTsKKy8qIHRpbWUgb2YgbGFzdCBVQVJUIGRhdGEgcmVhZHkgaW50ZXJydXB0ICovCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgbGFzdF9pbnRyX3R2ID0gezAsIDB9Oworc3RhdGljIGludCBsYXN0X3ZhbHVlOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobGlyY19yZWFkX3F1ZXVlKTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhoYXJkd2FyZV9sb2NrKTsKKworc3RhdGljIGludCByeF9idWZbUkJVRl9MRU5dOworc3RhdGljIHVuc2lnbmVkIGludCByeF90YWlsLCByeF9oZWFkOworCitzdGF0aWMgaW50IGRlYnVnOworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoZGVidWcpCQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgTElSQ19EUklWRVJfTkFNRSAiOiAiCQlcCisJCQkJZm10LCAjIyBhcmdzKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qIFNFQ1RJT046IFByb3RvdHlwZXMgKi8KKworLyogQ29tbXVuaWNhdGlvbiB3aXRoIHVzZXItc3BhY2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGlyY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3N0YXRpYyBzc2l6ZV90IGxpcmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCWxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBsaXJjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuLAorCQlsb2ZmX3QgKnBvcyk7CitzdGF0aWMgbG9uZyBsaXJjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgYWRkX3JlYWRfcXVldWUoaW50IGZsYWcsIHVuc2lnbmVkIGxvbmcgdmFsKTsKK3N0YXRpYyBpbnQgaW5pdF9jaHJkZXYodm9pZCk7CitzdGF0aWMgdm9pZCBkcm9wX2NocmRldih2b2lkKTsKKy8qIEhhcmR3YXJlICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIHZvaWQgc2VuZF9zcGFjZSh1bnNpZ25lZCBsb25nIGxlbik7CitzdGF0aWMgdm9pZCBzZW5kX3B1bHNlKHVuc2lnbmVkIGxvbmcgbGVuKTsKK3N0YXRpYyBpbnQgaW5pdF9oYXJkd2FyZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGRyb3BfaGFyZHdhcmUodm9pZCk7CisvKiBJbml0aWFsaXNhdGlvbiAqLworc3RhdGljIGludCBpbml0X3BvcnQodm9pZCk7CitzdGF0aWMgdm9pZCBkcm9wX3BvcnQodm9pZCk7CisKKyNpZmRlZiBMSVJDX09OX1NBMTEwMAorc3RhdGljIHZvaWQgb24odm9pZCkKK3sKKwlQUFNSIHw9IFBQQ19UWEQyOworfQorCitzdGF0aWMgdm9pZCBvZmYodm9pZCkKK3sKKwlQUFNSICY9IH5QUENfVFhEMjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzaW5wKGludCBvZmZzZXQpCit7CisJcmV0dXJuIGluYihpbyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3V0cChpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJb3V0Yih2YWx1ZSwgaW8gKyBvZmZzZXQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTUFYX1VERUxBWV9NUworI2RlZmluZSBNQVhfVURFTEFZX1VTIDUwMDAKKyNlbHNlCisjZGVmaW5lIE1BWF9VREVMQVlfVVMgKE1BWF9VREVMQVlfTVMqMTAwMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzYWZlX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQoreworCXdoaWxlICh1c2VjcyA+IE1BWF9VREVMQVlfVVMpIHsKKwkJdWRlbGF5KE1BWF9VREVMQVlfVVMpOworCQl1c2VjcyAtPSBNQVhfVURFTEFZX1VTOworCX0KKwl1ZGVsYXkodXNlY3MpOworfQorCisvKiBTRUNUSU9OOiBDb21tdW5pY2F0aW9uIHdpdGggdXNlci1zcGFjZSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGxpcmNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlwb2xsX3dhaXQoZmlsZSwgJmxpcmNfcmVhZF9xdWV1ZSwgd2FpdCk7CisJaWYgKHJ4X2hlYWQgIT0gcnhfdGFpbCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpcmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgbiA9IDA7CisJaW50IHJldHZhbCA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoY291bnQgJSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRfd2FpdF9xdWV1ZSgmbGlyY19yZWFkX3F1ZXVlLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAobiA8IGNvdW50KSB7CisJCWlmIChyeF9oZWFkICE9IHJ4X3RhaWwpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYnVmICsgbiwKKwkJCQkJKHZvaWQgKikgKHJ4X2J1ZiArIHJ4X2hlYWQpLAorCQkJCQlzaXplb2YoaW50KSkpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJcnhfaGVhZCA9IChyeF9oZWFkICsgMSkgJiAoUkJVRl9MRU4gLSAxKTsKKwkJCW4gKz0gc2l6ZW9mKGludCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCX0KKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmxpcmNfcmVhZF9xdWV1ZSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIG4gPyBuIDogcmV0dmFsOworfQorc3RhdGljIHNzaXplX3QgbGlyY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbiwKKwkJCQlsb2ZmX3QgKnBvcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBjb3VudDsKKwlpbnQgKnR4X2J1ZjsKKworCWNvdW50ID0gbiAvIHNpemVvZihpbnQpOworCWlmIChuICUgc2l6ZW9mKGludCkgfHwgY291bnQgJSAyID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXR4X2J1ZiA9IG1lbWR1cF91c2VyKGJ1Ziwgbik7CisJaWYgKElTX0VSUih0eF9idWYpKQorCQlyZXR1cm4gUFRSX0VSUih0eF9idWYpOworCWkgPSAwOworI2lmZGVmIExJUkNfT05fU0ExMTAwCisJLyogZGlzYWJsZSByZWNlaXZlciAqLworCVNlcjJVVENSMyA9IDA7CisjZW5kaWYKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGkgPj0gY291bnQpCisJCQlicmVhazsKKwkJaWYgKHR4X2J1ZltpXSkKKwkJCXNlbmRfcHVsc2UodHhfYnVmW2ldKTsKKwkJaSsrOworCQlpZiAoaSA+PSBjb3VudCkKKwkJCWJyZWFrOworCQlpZiAodHhfYnVmW2ldKQorCQkJc2VuZF9zcGFjZSh0eF9idWZbaV0pOworCQlpKys7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNpZmRlZiBMSVJDX09OX1NBMTEwMAorCW9mZigpOworCXVkZWxheSgxMDAwKTsgLyogd2FpdCAxbXMgZm9yIElSIGRpb2RlIHRvIHJlY292ZXIgKi8KKwlTZXIyVVRDUjMgPSAwOworCS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciB0byBwcmV2ZW50IHVud2FudGVkIGludGVycnVwdHMgKi8KKwlTZXIyVVRTUjAgJj0gKFVUU1IwX1JJRCB8IFVUU1IwX1JCQiB8IFVUU1IwX1JFQik7CisJLyogZW5hYmxlIHJlY2VpdmVyICovCisJU2VyMlVUQ1IzID0gVVRDUjNfUlhFfFVUQ1IzX1JJRTsKKyNlbmRpZgorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGxvbmcgbGlyY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAwOworI2lmZGVmIExJUkNfT05fU0ExMTAwCisJdW5zaWduZWQgaW50IGl2YWx1ZTsKKworCWlmIChjbWQgPT0gTElSQ19HRVRfRkVBVFVSRVMpCisJCXZhbHVlID0gTElSQ19DQU5fU0VORF9QVUxTRSB8CisJCQlMSVJDX0NBTl9TRVRfU0VORF9EVVRZX0NZQ0xFIHwKKwkJCUxJUkNfQ0FOX1NFVF9TRU5EX0NBUlJJRVIgfAorCQkJTElSQ19DQU5fUkVDX01PREUyOworCWVsc2UgaWYgKGNtZCA9PSBMSVJDX0dFVF9TRU5EX01PREUpCisJCXZhbHVlID0gTElSQ19NT0RFX1BVTFNFOworCWVsc2UgaWYgKGNtZCA9PSBMSVJDX0dFVF9SRUNfTU9ERSkKKwkJdmFsdWUgPSBMSVJDX01PREVfTU9ERTI7CisjZWxzZQorCWlmIChjbWQgPT0gTElSQ19HRVRfRkVBVFVSRVMpCisJCXZhbHVlID0gTElSQ19DQU5fU0VORF9QVUxTRSB8IExJUkNfQ0FOX1JFQ19NT0RFMjsKKwllbHNlIGlmIChjbWQgPT0gTElSQ19HRVRfU0VORF9NT0RFKQorCQl2YWx1ZSA9IExJUkNfTU9ERV9QVUxTRTsKKwllbHNlIGlmIChjbWQgPT0gTElSQ19HRVRfUkVDX01PREUpCisJCXZhbHVlID0gTElSQ19NT0RFX01PREUyOworI2VuZGlmCisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTElSQ19HRVRfRkVBVFVSRVM6CisJY2FzZSBMSVJDX0dFVF9TRU5EX01PREU6CisJY2FzZSBMSVJDX0dFVF9SRUNfTU9ERToKKwkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBMSVJDX1NFVF9TRU5EX01PREU6CisJY2FzZSBMSVJDX1NFVF9SRUNfTU9ERToKKwkJcmV0dmFsID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCWJyZWFrOworI2lmZGVmIExJUkNfT05fU0ExMTAwCisJY2FzZSBMSVJDX1NFVF9TRU5EX0RVVFlfQ1lDTEU6CisJCXJldHZhbCA9IGdldF91c2VyKGl2YWx1ZSwgKHVuc2lnbmVkIGludCAqKSBhcmcpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKGl2YWx1ZSA8PSAwIHx8IGl2YWx1ZSA+IDEwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiAoaXZhbHVlLzEwMCkqKDEwMDAwMDAvZnJlcSkgKi8KKwkJZHV0eV9jeWNsZSA9IGl2YWx1ZTsKKwkJcHVsc2Vfd2lkdGggPSAodW5zaWduZWQgbG9uZykgZHV0eV9jeWNsZSoxMDAwMC9mcmVxOworCQlzcGFjZV93aWR0aCA9ICh1bnNpZ25lZCBsb25nKSAxMDAwMDAwTC9mcmVxLXB1bHNlX3dpZHRoOworCQlpZiAocHVsc2Vfd2lkdGggPj0gTElSQ19PTl9TQTExMDBfVFJBTlNNSVRURVJfTEFURU5DWSkKKwkJCXB1bHNlX3dpZHRoIC09IExJUkNfT05fU0ExMTAwX1RSQU5TTUlUVEVSX0xBVEVOQ1k7CisJCWlmIChzcGFjZV93aWR0aCA+PSBMSVJDX09OX1NBMTEwMF9UUkFOU01JVFRFUl9MQVRFTkNZKQorCQkJc3BhY2Vfd2lkdGggLT0gTElSQ19PTl9TQTExMDBfVFJBTlNNSVRURVJfTEFURU5DWTsKKwkJYnJlYWs7CisJY2FzZSBMSVJDX1NFVF9TRU5EX0NBUlJJRVI6CisJCXJldHZhbCA9IGdldF91c2VyKGl2YWx1ZSwgKHVuc2lnbmVkIGludCAqKSBhcmcpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKGl2YWx1ZSA+IDUwMDAwMCB8fCBpdmFsdWUgPCAyMDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmcmVxID0gaXZhbHVlOworCQlwdWxzZV93aWR0aCA9ICh1bnNpZ25lZCBsb25nKSBkdXR5X2N5Y2xlKjEwMDAwL2ZyZXE7CisJCXNwYWNlX3dpZHRoID0gKHVuc2lnbmVkIGxvbmcpIDEwMDAwMDBML2ZyZXEtcHVsc2Vfd2lkdGg7CisJCWlmIChwdWxzZV93aWR0aCA+PSBMSVJDX09OX1NBMTEwMF9UUkFOU01JVFRFUl9MQVRFTkNZKQorCQkJcHVsc2Vfd2lkdGggLT0gTElSQ19PTl9TQTExMDBfVFJBTlNNSVRURVJfTEFURU5DWTsKKwkJaWYgKHNwYWNlX3dpZHRoID49IExJUkNfT05fU0ExMTAwX1RSQU5TTUlUVEVSX0xBVEVOQ1kpCisJCQlzcGFjZV93aWR0aCAtPSBMSVJDX09OX1NBMTEwMF9UUkFOU01JVFRFUl9MQVRFTkNZOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FTk9JT0NUTENNRDsKKworCX0KKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGNtZCA9PSBMSVJDX1NFVF9SRUNfTU9ERSkgeworCQlpZiAodmFsdWUgIT0gTElSQ19NT0RFX01PREUyKQorCQkJcmV0dmFsID0gLUVOT1NZUzsKKwl9IGVsc2UgaWYgKGNtZCA9PSBMSVJDX1NFVF9TRU5EX01PREUpIHsKKwkJaWYgKHZhbHVlICE9IExJUkNfTU9ERV9QVUxTRSkKKwkJCXJldHZhbCA9IC1FTk9TWVM7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgYWRkX3JlYWRfcXVldWUoaW50IGZsYWcsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGludCBuZXdfcnhfdGFpbDsKKwlpbnQgbmV3dmFsOworCisJZHByaW50aygiYWRkIGZsYWcgJWQgd2l0aCB2YWwgJWx1XG4iLCBmbGFnLCB2YWwpOworCisJbmV3dmFsID0gdmFsICYgUFVMU0VfTUFTSzsKKworCS8qCisJICogc3RhdGlzdGljYWxseSwgcHVsc2VzIGFyZSB+VElNRV9DT05TVC8yIHRvbyBsb25nLiB3ZSBjb3VsZAorCSAqIG1heWJlIG1ha2UgdGhpcyBtb3JlIGV4YWN0LCBidXQgdGhpcyBpcyBnb29kIGVub3VnaAorCSAqLworCWlmIChmbGFnKSB7CisJCS8qIHB1bHNlICovCisJCWlmIChuZXd2YWwgPiBUSU1FX0NPTlNULzIpCisJCQluZXd2YWwgLT0gVElNRV9DT05TVC8yOworCQllbHNlIC8qIHNob3VsZCBub3QgZXZlciBoYXBwZW4gKi8KKwkJCW5ld3ZhbCA9IDE7CisJCW5ld3ZhbCB8PSBQVUxTRV9CSVQ7CisJfSBlbHNlIHsKKwkJbmV3dmFsICs9IFRJTUVfQ09OU1QvMjsKKwl9CisJbmV3X3J4X3RhaWwgPSAocnhfdGFpbCArIDEpICYgKFJCVUZfTEVOIC0gMSk7CisJaWYgKG5ld19yeF90YWlsID09IHJ4X2hlYWQpIHsKKwkJZHByaW50aygiQnVmZmVyIG92ZXJydW4uXG4iKTsKKwkJcmV0dXJuOworCX0KKwlyeF9idWZbcnhfdGFpbF0gPSBuZXd2YWw7CisJcnhfdGFpbCA9IG5ld19yeF90YWlsOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGlyY19yZWFkX3F1ZXVlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGlyY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBsaXJjX3JlYWQsCisJLndyaXRlCQk9IGxpcmNfd3JpdGUsCisJLnBvbGwJCT0gbGlyY19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpcmNfaW9jdGwsCisJLm9wZW4JCT0gbGlyY19kZXZfZm9wX29wZW4sCisJLnJlbGVhc2UJPSBsaXJjX2Rldl9mb3BfY2xvc2UsCit9OworCitzdGF0aWMgaW50IHNldF91c2VfaW5jKHZvaWQgKmRhdGEpCit7CisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF91c2VfZGVjKHZvaWQgKmRhdGEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlyY19kcml2ZXIgZHJpdmVyID0geworICAgICAgIC5uYW1lCQk9IExJUkNfRFJJVkVSX05BTUUsCisgICAgICAgLm1pbm9yCQk9IC0xLAorICAgICAgIC5jb2RlX2xlbmd0aAk9IDEsCisgICAgICAgLnNhbXBsZV9yYXRlCT0gMCwKKyAgICAgICAuZGF0YQkJPSBOVUxMLAorICAgICAgIC5hZGRfdG9fYnVmCT0gTlVMTCwKKyAgICAgICAuc2V0X3VzZV9pbmMJPSBzZXRfdXNlX2luYywKKyAgICAgICAuc2V0X3VzZV9kZWMJPSBzZXRfdXNlX2RlYywKKyAgICAgICAuZm9wcwkJPSAmbGlyY19mb3BzLAorICAgICAgIC5kZXYJCT0gTlVMTCwKKyAgICAgICAub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCisKK3N0YXRpYyBpbnQgaW5pdF9jaHJkZXYodm9pZCkKK3sKKwlkcml2ZXIubWlub3IgPSBsaXJjX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlpZiAoZHJpdmVyLm1pbm9yIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRSAiOiBpbml0X2NocmRldigpIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRyb3BfY2hyZGV2KHZvaWQpCit7CisJbGlyY191bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIubWlub3IpOworfQorCisvKiBTRUNUSU9OOiBIYXJkd2FyZSAqLworc3RhdGljIGxvbmcgZGVsdGEoc3RydWN0IHRpbWV2YWwgKnR2MSwgc3RydWN0IHRpbWV2YWwgKnR2MikKK3sKKwl1bnNpZ25lZCBsb25nIGRlbHR2OworCisJZGVsdHYgPSB0djItPnR2X3NlYyAtIHR2MS0+dHZfc2VjOworCWlmIChkZWx0diA+IDE1KQorCQlkZWx0diA9IDB4RkZGRkZGOworCWVsc2UKKwkJZGVsdHYgPSBkZWx0dioxMDAwMDAwICsKKwkJCXR2Mi0+dHZfdXNlYyAtCisJCQl0djEtPnR2X3VzZWM7CisJcmV0dXJuIGRlbHR2OworfQorCitzdGF0aWMgdm9pZCBzaXJfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLyoKKwkgKiBpZiBsYXN0IHJlY2VpdmVkIHNpZ25hbCB3YXMgYSBwdWxzZSwgYnV0IHJlY2VpdmluZyBzdG9wcGVkCisJICogd2l0aGluIHRoZSA5IGJpdCBmcmFtZSwgd2UgbmVlZCB0byBmaW5pc2ggdGhpcyBwdWxzZSBhbmQKKwkgKiBzaW11bGF0ZSBhIHNpZ25hbCBjaGFuZ2UgdG8gZnJvbSBwdWxzZSB0byBzcGFjZS4gT3RoZXJ3aXNlCisJICogdXBwZXIgbGF5ZXJzIHdpbGwgcmVjZWl2ZSB0d28gc2VxdWVuY2VzIG5leHQgdGltZS4KKwkgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwdWxzZV9lbmQ7CisKKwkvKiBhdm9pZCBpbnRlcmZlcmVuY2Ugd2l0aCBpbnRlcnJ1cHQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXJfbG9jaywgZmxhZ3MpOworCWlmIChsYXN0X3ZhbHVlKSB7CisjaWZuZGVmIExJUkNfT05fU0ExMTAwCisJCS8qIGNsZWFyIHVucmVhZCBiaXRzIGluIFVBUlQgYW5kIHJlc3RhcnQgKi8KKwkJb3V0YihVQVJUX0ZDUl9DTEVBUl9SQ1ZSLCBpbyArIFVBUlRfRkNSKTsKKyNlbmRpZgorCQkvKiBkZXRlcm1pbmUgJ3ZpcnR1YWwnIHB1bHNlIGVuZDogKi8KKwkJcHVsc2VfZW5kID0gZGVsdGEoJmxhc3RfdHYsICZsYXN0X2ludHJfdHYpOworCQlkcHJpbnRrKCJ0aW1lb3V0IGFkZCAlZCBmb3IgJWx1IHVzZWNcbiIsIGxhc3RfdmFsdWUsIHB1bHNlX2VuZCk7CisJCWFkZF9yZWFkX3F1ZXVlKGxhc3RfdmFsdWUsIHB1bHNlX2VuZCk7CisJCWxhc3RfdmFsdWUgPSAwOworCQlsYXN0X3R2ID0gbGFzdF9pbnRyX3R2OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJc3RydWN0IHRpbWV2YWwgY3Vycl90djsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWx0djsKKyNpZmRlZiBMSVJDX09OX1NBMTEwMAorCWludCBzdGF0dXM7CisJc3RhdGljIGludCBuOworCisJc3RhdHVzID0gU2VyMlVUU1IwOworCS8qCisJICogRGVhbCB3aXRoIGFueSByZWNlaXZlIGVycm9ycyBmaXJzdC4gIFRoZSBieXRlcyBpbiBlcnJvciBtYXkgYmUKKwkgKiB0aGUgb25seSBieXRlcyBpbiB0aGUgcmVjZWl2ZSBGSUZPLCBzbyB3ZSBkbyB0aGlzIGZpcnN0LgorCSAqLworCXdoaWxlIChzdGF0dXMgJiBVVFNSMF9FSUYpIHsKKwkJaW50IGJzdGF0OworCisJCWlmIChkZWJ1ZykgeworCQkJZHByaW50aygiRUlGXG4iKTsKKwkJCWJzdGF0ID0gU2VyMlVUU1IxOworCisJCQlpZiAoYnN0YXQgJiBVVFNSMV9GUkUpCisJCQkJZHByaW50aygiZnJhbWUgZXJyb3JcbiIpOworCQkJaWYgKGJzdGF0ICYgVVRTUjFfUk9SKQorCQkJCWRwcmludGsoInJlY2VpdmUgZmlmbyBvdmVycnVuXG4iKTsKKwkJCWlmIChic3RhdCAmIFVUU1IxX1BSRSkKKwkJCQlkcHJpbnRrKCJwYXJpdHkgZXJyb3JcbiIpOworCQl9CisKKwkJYnN0YXQgPSBTZXIyVVREUjsKKwkJbisrOworCQlzdGF0dXMgPSBTZXIyVVRTUjA7CisJfQorCisJaWYgKHN0YXR1cyAmIChVVFNSMF9SRlMgfCBVVFNSMF9SSUQpKSB7CisJCWRvX2dldHRpbWVvZmRheSgmY3Vycl90dik7CisJCWRlbHR2ID0gZGVsdGEoJmxhc3RfdHYsICZjdXJyX3R2KTsKKwkJZG8geworCQkJZGF0YSA9IFNlcjJVVERSOworCQkJZHByaW50aygiJWQgZGF0YTogJXVcbiIsIG4sICh1bnNpZ25lZCBpbnQpIGRhdGEpOworCQkJbisrOworCQl9IHdoaWxlIChzdGF0dXMgJiBVVFNSMF9SSUQgJiYgLyogZG8gbm90IGVtcHR5IGZpZm8gaW4gb3JkZXIgdG8KKwkJCQkJCSogZ2V0IFVUU1IwX1JJRCBpbiBhbnkgY2FzZSAqLworCQkgICAgICBTZXIyVVRTUjEgJiBVVFNSMV9STkUpOyAvKiBkYXRhIHJlYWR5ICovCisKKwkJaWYgKHN0YXR1cyZVVFNSMF9SSUQpIHsKKwkJCWFkZF9yZWFkX3F1ZXVlKDAgLCBkZWx0diAtIG4gKiBUSU1FX0NPTlNUKTsgLypzcGFjZSovCisJCQlhZGRfcmVhZF9xdWV1ZSgxLCBuICogVElNRV9DT05TVCk7IC8qcHVsc2UqLworCQkJbiA9IDA7CisJCQlsYXN0X3R2ID0gY3Vycl90djsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgJiBVVFNSMF9URlMpCisJCXByaW50ayhLRVJOX0VSUiAidHJhbnNtaXQgZmlmbyBub3QgZnVsbCwgc2hvdWxkbid0IGhhcHBlblxuIik7CisKKwkvKiBXZSBtdXN0IGNsZWFyIGNlcnRhaW4gYml0cy4gKi8KKwlzdGF0dXMgJj0gKFVUU1IwX1JJRCB8IFVUU1IwX1JCQiB8IFVUU1IwX1JFQik7CisJaWYgKHN0YXR1cykKKwkJU2VyMlVUU1IwID0gc3RhdHVzOworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIGRlbHRpbnRydHY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaWlyLCBsc3I7CisKKwl3aGlsZSAoKGlpciA9IGluYihpbyArIFVBUlRfSUlSKSAmIFVBUlRfSUlSX0lEKSkgeworCQlzd2l0Y2ggKGlpciZVQVJUX0lJUl9JRCkgeyAvKiBGSVhNRSB0b3RvIHRyZWJhIHByZXJpZWRpdCAqLworCQljYXNlIFVBUlRfSUlSX01TSToKKwkJCSh2b2lkKSBpbmIoaW8gKyBVQVJUX01TUik7CisJCQlicmVhazsKKwkJY2FzZSBVQVJUX0lJUl9STFNJOgorCQkJKHZvaWQpIGluYihpbyArIFVBUlRfTFNSKTsKKwkJCWJyZWFrOworCQljYXNlIFVBUlRfSUlSX1RIUkk6CisjaWYgMAorCQkJaWYgKGxzciAmIFVBUlRfTFNSX1RIUkUpIC8qIEZJRk8gaXMgZW1wdHkgKi8KKwkJCQlvdXRiKGRhdGEsIGlvICsgVUFSVF9UWCkKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgVUFSVF9JSVJfUkRJOgorCQkJLyogYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggdGltZXIgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lcl9sb2NrLCBmbGFncyk7CisJCQlkbyB7CisJCQkJZGVsX3RpbWVyKCZ0aW1lcmxpc3QpOworCQkJCWRhdGEgPSBpbmIoaW8gKyBVQVJUX1JYKTsKKwkJCQlkb19nZXR0aW1lb2ZkYXkoJmN1cnJfdHYpOworCQkJCWRlbHR2ID0gZGVsdGEoJmxhc3RfdHYsICZjdXJyX3R2KTsKKwkJCQlkZWx0aW50cnR2ID0gZGVsdGEoJmxhc3RfaW50cl90diwgJmN1cnJfdHYpOworCQkJCWRwcmludGsoInQgJWx1LCBkICVkXG4iLCBkZWx0aW50cnR2LCAoaW50KWRhdGEpOworCQkJCS8qCisJCQkJICogaWYgbm90aGluZyBjYW1lIGluIGxhc3QgWCBjeWNsZXMsCisJCQkJICogaXQgd2FzIGdhcAorCQkJCSAqLworCQkJCWlmIChkZWx0aW50cnR2ID4gVElNRV9DT05TVCAqIHRocmVzaG9sZCkgeworCQkJCQlpZiAobGFzdF92YWx1ZSkgeworCQkJCQkJZHByaW50aygiR0FQXG4iKTsKKwkJCQkJCS8qIHNpbXVsYXRlIHNpZ25hbCBjaGFuZ2UgKi8KKwkJCQkJCWFkZF9yZWFkX3F1ZXVlKGxhc3RfdmFsdWUsCisJCQkJCQkJICAgICAgIGRlbHR2IC0KKwkJCQkJCQkgICAgICAgZGVsdGludHJ0dik7CisJCQkJCQlsYXN0X3ZhbHVlID0gMDsKKwkJCQkJCWxhc3RfdHYudHZfc2VjID0KKwkJCQkJCQlsYXN0X2ludHJfdHYudHZfc2VjOworCQkJCQkJbGFzdF90di50dl91c2VjID0KKwkJCQkJCQlsYXN0X2ludHJfdHYudHZfdXNlYzsKKwkJCQkJCWRlbHR2ID0gZGVsdGludHJ0djsKKwkJCQkJfQorCQkJCX0KKwkJCQlkYXRhID0gMTsKKwkJCQlpZiAoZGF0YSBeIGxhc3RfdmFsdWUpIHsKKwkJCQkJLyoKKwkJCQkJICogZGVsdGludHJ0diA+IDIqVElNRV9DT05TVCwgcmVtZW1iZXI/CisJCQkJCSAqIHRoZSBvdGhlciBjYXNlIGlzIHRpbWVvdXQKKwkJCQkJICovCisJCQkJCWFkZF9yZWFkX3F1ZXVlKGxhc3RfdmFsdWUsCisJCQkJCQkgICAgICAgZGVsdHYtVElNRV9DT05TVCk7CisJCQkJCWxhc3RfdmFsdWUgPSBkYXRhOworCQkJCQlsYXN0X3R2ID0gY3Vycl90djsKKwkJCQkJaWYgKGxhc3RfdHYudHZfdXNlYyA+PSBUSU1FX0NPTlNUKSB7CisJCQkJCQlsYXN0X3R2LnR2X3VzZWMgLT0gVElNRV9DT05TVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxhc3RfdHYudHZfc2VjLS07CisJCQkJCQlsYXN0X3R2LnR2X3VzZWMgKz0gMTAwMDAwMCAtCisJCQkJCQkJVElNRV9DT05TVDsKKwkJCQkJfQorCQkJCX0KKwkJCQlsYXN0X2ludHJfdHYgPSBjdXJyX3R2OworCQkJCWlmIChkYXRhKSB7CisJCQkJCS8qCisJCQkJCSAqIHN0YXJ0IHRpbWVyIGZvciBlbmQgb2YKKwkJCQkJICogc2VxdWVuY2UgZGV0ZWN0aW9uCisJCQkJCSAqLworCQkJCQl0aW1lcmxpc3QuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJCQkJCQlTSVJfVElNRU9VVDsKKwkJCQkJYWRkX3RpbWVyKCZ0aW1lcmxpc3QpOworCQkJCX0KKworCQkJCWxzciA9IGluYihpbyArIFVBUlRfTFNSKTsKKwkJCX0gd2hpbGUgKGxzciAmIFVBUlRfTFNSX0RSKTsgLyogZGF0YSByZWFkeSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXJfbG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBJUlFfUkVUVkFMKElSUV9IQU5ETEVEKTsKK30KKworI2lmZGVmIExJUkNfT05fU0ExMTAwCitzdGF0aWMgdm9pZCBzZW5kX3B1bHNlKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgaywgZGVsYXk7CisJaW50IGZsYWc7CisKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybjsKKwkvKgorCSAqIHRoaXMgd29uJ3QgZ2l2ZSB1cyB0aGUgY2FycmllciBmcmVxdWVuY3kgd2UgcmVhbGx5IHdhbnQKKwkgKiBkdWUgdG8gaW50ZWdlciBhcml0aG1ldGljLCBidXQgd2UgY2FuIGFjY2VwdCB0aGlzIGluYWNjdXJhY3kKKwkgKi8KKworCWZvciAoayA9IGZsYWcgPSAwOyBrIDwgbGVuZ3RoOyBrICs9IGRlbGF5LCBmbGFnID0gIWZsYWcpIHsKKwkJaWYgKGZsYWcpIHsKKwkJCW9mZigpOworCQkJZGVsYXkgPSBzcGFjZV93aWR0aDsKKwkJfSBlbHNlIHsKKwkJCW9uKCk7CisJCQlkZWxheSA9IHB1bHNlX3dpZHRoOworCQl9CisJCXNhZmVfdWRlbGF5KGRlbGF5KTsKKwl9CisJb2ZmKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfc3BhY2UodW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm47CisJb2ZmKCk7CisJc2FmZV91ZGVsYXkobGVuZ3RoKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzZW5kX3NwYWNlKHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXNhZmVfdWRlbGF5KGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcHVsc2UodW5zaWduZWQgbG9uZyBsZW4pCit7CisJbG9uZyBieXRlc19vdXQgPSBsZW4gLyBUSU1FX0NPTlNUOworCWxvbmcgdGltZV9sZWZ0OworCisJdGltZV9sZWZ0ID0gKGxvbmcpbGVuIC0gKGxvbmcpYnl0ZXNfb3V0ICogKGxvbmcpVElNRV9DT05TVDsKKwlpZiAoYnl0ZXNfb3V0ID09IDApIHsKKwkJYnl0ZXNfb3V0Kys7CisJCXRpbWVfbGVmdCA9IDA7CisJfQorCXdoaWxlIChieXRlc19vdXQtLSkgeworCQlvdXRiKFBVTFNFLCBpbyArIFVBUlRfVFgpOworCQkvKiBGSVhNRSB0cmViYSBzZXJpb3puZSBjYWthbmllIHogY2hhci9zZXJpYWwuYyAqLworCQl3aGlsZSAoIShpbmIoaW8gKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkKKwkJCTsKKwl9CisjaWYgMAorCWlmICh0aW1lX2xlZnQgPiAwKQorCQlzYWZlX3VkZWxheSh0aW1lX2xlZnQpOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQTExMDBfQ09MTElFCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3NldF9wb3dlcl9jb2xsaWUoaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSkgeworCQkvKgorCQkgKiAgMCAtIG9mZgorCQkgKiAgMSAtIHNob3J0IHJhbmdlLCBsb3dlc3QgcG93ZXIKKwkJICogIDIgLSBtZWRpdW0gcmFuZ2UsIG1lZGl1bSBwb3dlcgorCQkgKiAgMyAtIG1heGltdW0gcmFuZ2UsIGhpZ2ggcG93ZXIKKwkJICovCisJCXVjYjEyMDBfc2V0X2lvX2RpcmVjdGlvbihUQzM1MTQzX0dQSU9fSVJfT04sCisJCQkJCSBUQzM1MTQzX0lPRElSX09VVFBVVCk7CisJCXVjYjEyMDBfc2V0X2lvKFRDMzUxNDNfR1BJT19JUl9PTiwgVEMzNTE0M19JT0RBVF9MT1cpOworCQl1ZGVsYXkoMTAwKTsKKwl9IGVsc2UgeworCQkvKiBPRkYgKi8KKwkJdWNiMTIwMF9zZXRfaW9fZGlyZWN0aW9uKFRDMzUxNDNfR1BJT19JUl9PTiwKKwkJCQkJIFRDMzUxNDNfSU9ESVJfT1VUUFVUKTsKKwkJdWNiMTIwMF9zZXRfaW8oVEMzNTE0M19HUElPX0lSX09OLCBUQzM1MTQzX0lPREFUX0hJR0gpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXRfaGFyZHdhcmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkvKiByZXNldCBVQVJUICovCisjaWZkZWYgTElSQ19PTl9TQTExMDAKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0JJVFNZCisJaWYgKG1hY2hpbmVfaXNfYml0c3koKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJQb3dlciBvbiBJUiBtb2R1bGVcbiIpOworCQlzZXRfYml0c3lfZWdwaW8oRUdQSU9fQklUU1lfSVJfT04pOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQTExMDBfQ09MTElFCisJc2ExMTAwX2lyZGFfc2V0X3Bvd2VyX2NvbGxpZSgzKTsJLyogcG93ZXIgb24gKi8KKyNlbmRpZgorCXNyLmhzY3IwID0gU2VyMkhTQ1IwOworCisJc3IudXRjcjAgPSBTZXIyVVRDUjA7CisJc3IudXRjcjEgPSBTZXIyVVRDUjE7CisJc3IudXRjcjIgPSBTZXIyVVRDUjI7CisJc3IudXRjcjMgPSBTZXIyVVRDUjM7CisJc3IudXRjcjQgPSBTZXIyVVRDUjQ7CisKKwlzci51dGRyID0gU2VyMlVURFI7CisJc3IudXRzcjAgPSBTZXIyVVRTUjA7CisJc3IudXRzcjEgPSBTZXIyVVRTUjE7CisKKwkvKiBjb25maWd1cmUgR1BJTyAqLworCS8qIG91dHB1dCAqLworCVBQRFIgfD0gUFBDX1RYRDI7CisJUFNEUiB8PSBQUENfVFhEMjsKKwkvKiBzZXQgb3V0cHV0IHRvIDAgKi8KKwlvZmYoKTsKKworCS8qIEVuYWJsZSBIUC1TSVIgbW9kdWxhdGlvbiwgYW5kIGVuc3VyZSB0aGF0IHRoZSBwb3J0IGlzIGRpc2FibGVkLiAqLworCVNlcjJVVENSMyA9IDA7CisJU2VyMkhTQ1IwID0gc3IuaHNjcjAgJiAofkhTQ1IwX0hTU1ApOworCisJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIHRvIHByZXZlbnQgdW53YW50ZWQgaW50ZXJydXB0cyAqLworCVNlcjJVVFNSMCAmPSAoVVRTUjBfUklEIHwgVVRTUjBfUkJCIHwgVVRTUjBfUkVCKTsKKworCS8qIDdOMSAqLworCVNlcjJVVENSMCA9IFVUQ1IwXzFTdHBCaXR8VVRDUjBfN0JpdERhdGE7CisJLyogMTE1MjAwICovCisJU2VyMlVUQ1IxID0gMDsKKwlTZXIyVVRDUjIgPSAxOworCS8qIHVzZSBIUFNJUiwgMS42IHVzZWMgcHVsc2VzICovCisJU2VyMlVUQ1I0ID0gVVRDUjRfSFBTSVJ8VVRDUjRfWjFfNnVzOworCisJLyogZW5hYmxlIHJlY2VpdmVyLCByZWNlaXZlIGZpZm8gaW50ZXJydXB0ICovCisJU2VyMlVUQ1IzID0gVVRDUjNfUlhFfFVUQ1IzX1JJRTsKKworCS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciB0byBwcmV2ZW50IHVud2FudGVkIGludGVycnVwdHMgKi8KKwlTZXIyVVRTUjAgJj0gKFVUU1IwX1JJRCB8IFVUU1IwX1JCQiB8IFVUU1IwX1JFQik7CisKKyNlbGlmIGRlZmluZWQoTElSQ19TSVJfVEVLUkFNKQorCS8qIGRpc2FibGUgRklGTyAqLworCXNvdXRwKFVBUlRfRkNSLAorCSAgICAgIFVBUlRfRkNSX0NMRUFSX1JDVlJ8CisJICAgICAgVUFSVF9GQ1JfQ0xFQVJfWE1JVHwKKwkgICAgICBVQVJUX0ZDUl9UUklHR0VSXzEpOworCisJLyogU2V0IERMQUIgMC4gKi8KKwlzb3V0cChVQVJUX0xDUiwgc2lucChVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpKTsKKworCS8qIEZpcnN0IG9mIGFsbCwgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCXNvdXRwKFVBUlRfSUVSLCBzaW5wKFVBUlRfSUVSKSAmCisJICAgICAgKH4oVUFSVF9JRVJfTVNJfFVBUlRfSUVSX1JMU0l8VUFSVF9JRVJfVEhSSXxVQVJUX0lFUl9SREkpKSk7CisKKwkvKiBTZXQgRExBQiAxLiAqLworCXNvdXRwKFVBUlRfTENSLCBzaW5wKFVBUlRfTENSKSB8IFVBUlRfTENSX0RMQUIpOworCisJLyogU2V0IGRpdmlzb3IgdG8gMTIgPT4gOTYwMCBCYXVkICovCisJc291dHAoVUFSVF9ETE0sIDApOworCXNvdXRwKFVBUlRfRExMLCAxMik7CisKKwkvKiBTZXQgRExBQiAwLiAqLworCXNvdXRwKFVBUlRfTENSLCBzaW5wKFVBUlRfTENSKSAmICh+VUFSVF9MQ1JfRExBQikpOworCisJLyogcG93ZXIgc3VwcGx5ICovCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX1JUU3xVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfT1VUMik7CisJc2FmZV91ZGVsYXkoNTAqMTAwMCk7CisKKwkvKiAtRFRSIGxvdyAtPiByZXNldCBQSUMgKi8KKwlzb3V0cChVQVJUX01DUiwgVUFSVF9NQ1JfUlRTfFVBUlRfTUNSX09VVDIpOworCXVkZWxheSgxKjEwMDApOworCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX1JUU3xVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfT1VUMik7CisJdWRlbGF5KDEwMCk7CisKKworCS8qIC1SVFMgbG93IC0+IHNlbmQgY29udHJvbCBieXRlICovCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX0RUUnxVQVJUX01DUl9PVVQyKTsKKwl1ZGVsYXkoNyk7CisJc291dHAoVUFSVF9UWCwgVEVLUkFNXzExNTIwMHxURUtSQU1fUFcpOworCisJLyogb25lIGJ5dGUgdGFrZXMgfjEwNDIgdXNlYyB0byB0cmFuc21pdCBhdCA5NjAwLDhOMSAqLworCXVkZWxheSgxNTAwKTsKKworCS8qIGJhY2sgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLworCXNvdXRwKFVBUlRfTUNSLCBVQVJUX01DUl9SVFN8VUFSVF9NQ1JfRFRSfFVBUlRfTUNSX09VVDIpOworCXVkZWxheSg1MCk7CisKKwl1ZGVsYXkoMTUwMCk7CisKKwkvKiByZWFkIHByZXZpb3VzIGNvbnRyb2wgYnl0ZSAqLworCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRQorCSAgICAgICAiOiAweCUwMnhcbiIsIHNpbnAoVUFSVF9SWCkpOworCisJLyogU2V0IERMQUIgMS4gKi8KKwlzb3V0cChVQVJUX0xDUiwgc2lucChVQVJUX0xDUikgfCBVQVJUX0xDUl9ETEFCKTsKKworCS8qIFNldCBkaXZpc29yIHRvIDEgPT4gMTE1MjAwIEJhdWQgKi8KKwlzb3V0cChVQVJUX0RMTSwgMCk7CisJc291dHAoVUFSVF9ETEwsIDEpOworCisJLyogU2V0IERMQUIgMCwgOCBCaXQgKi8KKwlzb3V0cChVQVJUX0xDUiwgVUFSVF9MQ1JfV0xFTjgpOworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJc291dHAoVUFSVF9JRVIsIHNpbnAoVUFSVF9JRVIpfFVBUlRfSUVSX1JESSk7CisjZWxzZQorCW91dGIoMCwgaW8gKyBVQVJUX01DUik7CisJb3V0YigwLCBpbyArIFVBUlRfSUVSKTsKKwkvKiBpbml0IFVBUlQgKi8KKwkvKiBzZXQgRExBQiwgc3BlZWQgPSAxMTUyMDAgKi8KKwlvdXRiKFVBUlRfTENSX0RMQUIgfCBVQVJUX0xDUl9XTEVONywgaW8gKyBVQVJUX0xDUik7CisJb3V0YigxLCBpbyArIFVBUlRfRExMKTsgb3V0YigwLCBpbyArIFVBUlRfRExNKTsKKwkvKiA3TjErc3RhcnQgPSA5IGJpdHMgYXQgMTE1MjAwIH4gMyBiaXRzIGF0IDQ0MDAwICovCisJb3V0YihVQVJUX0xDUl9XTEVONywgaW8gKyBVQVJUX0xDUik7CisJLyogRklGTyBvcGVyYXRpb24gKi8KKwlvdXRiKFVBUlRfRkNSX0VOQUJMRV9GSUZPLCBpbyArIFVBUlRfRkNSKTsKKwkvKiBpbnRlcnJ1cHRzICovCisJLyogb3V0YihVQVJUX0lFUl9STFNJfFVBUlRfSUVSX1JESXxVQVJUX0lFUl9USFJJLCBpbyArIFVBUlRfSUVSKTsgKi8KKwlvdXRiKFVBUlRfSUVSX1JESSwgaW8gKyBVQVJUX0lFUik7CisJLyogdHVybiBvbiBVQVJUICovCisJb3V0YihVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfUlRTfFVBUlRfTUNSX09VVDIsIGlvICsgVUFSVF9NQ1IpOworI2lmZGVmIExJUkNfU0lSX0FDVElTWVNfQUNUMjAwTAorCWluaXRfYWN0MjAwKCk7CisjZWxpZiBkZWZpbmVkKExJUkNfU0lSX0FDVElTWVNfQUNUMjIwTCkKKwlpbml0X2FjdDIyMCgpOworI2VuZGlmCisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRyb3BfaGFyZHdhcmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIExJUkNfT05fU0ExMTAwCisJU2VyMlVUQ1IzID0gMDsKKworCVNlcjJVVENSMCA9IHNyLnV0Y3IwOworCVNlcjJVVENSMSA9IHNyLnV0Y3IxOworCVNlcjJVVENSMiA9IHNyLnV0Y3IyOworCVNlcjJVVENSNCA9IHNyLnV0Y3I0OworCVNlcjJVVENSMyA9IHNyLnV0Y3IzOworCisJU2VyMkhTQ1IwID0gc3IuaHNjcjA7CisjaWZkZWYgQ09ORklHX1NBMTEwMF9CSVRTWQorCWlmIChtYWNoaW5lX2lzX2JpdHN5KCkpCisJCWNscl9iaXRzeV9lZ3BpbyhFR1BJT19CSVRTWV9JUl9PTik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0ExMTAwX0NPTExJRQorCXNhMTEwMF9pcmRhX3NldF9wb3dlcl9jb2xsaWUoMCk7CS8qIHBvd2VyIG9mZiAqLworI2VuZGlmCisjZWxzZQorCS8qIHR1cm4gb2ZmIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIGlvICsgVUFSVF9JRVIpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCisvKiBTRUNUSU9OOiBJbml0aWFsaXNhdGlvbiAqLworCitzdGF0aWMgaW50IGluaXRfcG9ydCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiBnZXQgSS9PIHBvcnQgYWNjZXNzIGFuZCBJUlEgbGluZSAqLworI2lmbmRlZiBMSVJDX09OX1NBMTEwMAorCWlmIChyZXF1ZXN0X3JlZ2lvbihpbywgOCwgTElSQ19EUklWRVJfTkFNRSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRQorCQkgICAgICAgIjogaS9vIHBvcnQgMHglLjR4IGFscmVhZHkgaW4gdXNlLlxuIiwgaW8pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyNlbmRpZgorCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgc2lyX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAgTElSQ19EUklWRVJfTkFNRSwgTlVMTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKyMgICAgICAgICAgICAgICBpZm5kZWYgTElSQ19PTl9TQTExMDAKKwkJcmVsZWFzZV9yZWdpb24oaW8sIDgpOworIyAgICAgICAgICAgICAgIGVuZGlmCisJCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FCisJCQkiOiBJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLAorCQkJaXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisjaWZuZGVmIExJUkNfT05fU0ExMTAwCisJcHJpbnRrKEtFUk5fSU5GTyBMSVJDX0RSSVZFUl9OQU1FCisJCSI6IEkvTyBwb3J0IDB4JS40eCwgSVJRICVkLlxuIiwKKwkJaW8sIGlycSk7CisjZW5kaWYKKworCWluaXRfdGltZXIoJnRpbWVybGlzdCk7CisJdGltZXJsaXN0LmZ1bmN0aW9uID0gc2lyX3RpbWVvdXQ7CisJdGltZXJsaXN0LmRhdGEgPSAweGFiYWRjYWZlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRyb3BfcG9ydCh2b2lkKQoreworCWZyZWVfaXJxKGlycSwgTlVMTCk7CisJZGVsX3RpbWVyX3N5bmMoJnRpbWVybGlzdCk7CisjaWZuZGVmIExJUkNfT05fU0ExMTAwCisJcmVsZWFzZV9yZWdpb24oaW8sIDgpOworI2VuZGlmCit9CisKKyNpZmRlZiBMSVJDX1NJUl9BQ1RJU1lTX0FDVDIwMEwKKy8qIENyeXN0YWwvQ2lycnVzIENTODEzMCBJUiB0cmFuc2NlaXZlciwgdXNlZCBpbiBBY3Rpc3lzIEFjdDIwMEwgZG9uZ2xlICovCisvKiBzb21lIGNvZGUgYm9ycm93ZWQgZnJvbSBMaW51eCBJUkRBIGRyaXZlciAqLworCisvKiBSZWdpc3RlciAwOiBDb250cm9sIHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHMCAgICAweDAwCisjZGVmaW5lIEFDVDIwMExfVFhFTiAgICAweDAxIC8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBBQ1QyMDBMX1JYRU4gICAgMHgwMiAvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9FQ0hPICAgIDB4MDggLyogRWNobyBjb250cm9sIGNoYXJzICovCisKKy8qIFJlZ2lzdGVyIDE6IENvbnRyb2wgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxICAgIDB4MTAKKyNkZWZpbmUgQUNUMjAwTF9MT0RCICAgIDB4MDEgLyogTG9hZCBuZXcgYmF1ZCByYXRlIGNvdW50IHZhbHVlICovCisjZGVmaW5lIEFDVDIwMExfV0lERSAgICAweDA0IC8qIEV4cGFuZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgcHVsc2UgKi8KKworLyogUmVnaXN0ZXIgMzogVHJhbnNtaXQgbW9kZSByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzMgICAgMHgzMAorI2RlZmluZSBBQ1QyMDBMX0IwICAgICAgMHgwMSAvKiBEYXRhQml0cywgMD02LCAxPTcsIDI9OCwgMz05KDhQKSAgKi8KKyNkZWZpbmUgQUNUMjAwTF9CMSAgICAgIDB4MDIgLyogRGF0YUJpdHMsIDA9NiwgMT03LCAyPTgsIDM9OSg4UCkgICovCisjZGVmaW5lIEFDVDIwMExfQ0hTWSAgICAweDA0IC8qIFN0YXJ0Qml0IFN5bmNlZCAwPWJpdHRpbWUsIDE9c3RhcnRiaXQgKi8KKworLyogUmVnaXN0ZXIgNDogT3V0cHV0IFBvd2VyIHJlZ2lzdGVyICovCisjZGVmaW5lIEFDVDIwMExfUkVHNCAgICAweDQwCisjZGVmaW5lIEFDVDIwMExfT1AwICAgICAweDAxIC8qIEVuYWJsZSBMRUQxQyBvdXRwdXQgKi8KKyNkZWZpbmUgQUNUMjAwTF9PUDEgICAgIDB4MDIgLyogRW5hYmxlIExFRDJDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX0JMS1IgICAgMHgwNAorCisvKiBSZWdpc3RlciA1OiBSZWNlaXZlIE1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc1ICAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9SV0lETCAgIDB4MDEgLyogZml4ZWQgMS42dXMgcHVsc2UgbW9kZSAqLworICAgIC8qLi4gb3RoZXIgdmFyaW91cyBJUkRBIGJpdCBtb2RlcywgYW5kIFRWIHJlbW90ZSBtb2Rlcy4uKi8KKworLyogUmVnaXN0ZXIgNjogUmVjZWl2ZSBTZW5zaXRpdml0eSByZWdpc3RlciAjMSAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzYgICAgMHg2MAorI2RlZmluZSBBQ1QyMDBMX1JTMCAgICAgMHgwMSAvKiByZWNlaXZlIHRocmVzaG9sZCBiaXQgMCAqLworI2RlZmluZSBBQ1QyMDBMX1JTMSAgICAgMHgwMiAvKiByZWNlaXZlIHRocmVzaG9sZCBiaXQgMSAqLworCisvKiBSZWdpc3RlciA3OiBSZWNlaXZlIFNlbnNpdGl2aXR5IHJlZ2lzdGVyICMyICovCisjZGVmaW5lIEFDVDIwMExfUkVHNyAgICAweDcwCisjZGVmaW5lIEFDVDIwMExfRU5QT1MgICAweDA0IC8qIElnbm9yZSB0aGUgZmFsbGluZyBlZGdlICovCisKKy8qIFJlZ2lzdGVyIDgsOTogQmF1ZCBSYXRlIERpdmlkZXIgcmVnaXN0ZXIgIzEsIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc4ICAgIDB4ODAKKyNkZWZpbmUgQUNUMjAwTF9SRUc5ICAgIDB4OTAKKworI2RlZmluZSBBQ1QyMDBMXzI0MDAgICAgMHg1ZgorI2RlZmluZSBBQ1QyMDBMXzk2MDAgICAgMHgxNworI2RlZmluZSBBQ1QyMDBMXzE5MjAwICAgMHgwYgorI2RlZmluZSBBQ1QyMDBMXzM4NDAwICAgMHgwNQorI2RlZmluZSBBQ1QyMDBMXzU3NjAwICAgMHgwMworI2RlZmluZSBBQ1QyMDBMXzExNTIwMCAgMHgwMQorCisvKiBSZWdpc3RlciAxMzogQ29udHJvbCByZWdpc3RlciAjMyAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEzICAgMHhkMAorI2RlZmluZSBBQ1QyMDBMX1NIRFcgICAgMHgwMSAvKiBFbmFibGUgYWNjZXNzIHRvIHNoYWRvdyByZWdpc3RlcnMgKi8KKworLyogUmVnaXN0ZXIgMTU6IFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzE1ICAgMHhmMAorCisvKiBSZWdpc3RlciAyMTogQ29udHJvbCByZWdpc3RlciAjNCAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzIxICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX0VYQ0sgICAgMHgwMiAvKiBEaXNhYmxlIGNsb2NrIG91dHB1dCBkcml2ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9PU0NMICAgIDB4MDQgLyogb3NjaWxsYXRvciBpbiBsb3cgcG93ZXIsIG1lZGl1bSBhY2N1cmFjeSBtb2RlICovCisKK3N0YXRpYyB2b2lkIGluaXRfYWN0MjAwKHZvaWQpCit7CisJaW50IGk7CisJX191OCBjb250cm9sW10gPSB7CisJCUFDVDIwMExfUkVHMTUsCisJCUFDVDIwMExfUkVHMTMgfCBBQ1QyMDBMX1NIRFcsCisJCUFDVDIwMExfUkVHMjEgfCBBQ1QyMDBMX0VYQ0sgfCBBQ1QyMDBMX09TQ0wsCisJCUFDVDIwMExfUkVHMTMsCisJCUFDVDIwMExfUkVHNyAgfCBBQ1QyMDBMX0VOUE9TLAorCQlBQ1QyMDBMX1JFRzYgIHwgQUNUMjAwTF9SUzAgIHwgQUNUMjAwTF9SUzEsCisJCUFDVDIwMExfUkVHNSAgfCBBQ1QyMDBMX1JXSURMLAorCQlBQ1QyMDBMX1JFRzQgIHwgQUNUMjAwTF9PUDAgIHwgQUNUMjAwTF9PUDEgfCBBQ1QyMDBMX0JMS1IsCisJCUFDVDIwMExfUkVHMyAgfCBBQ1QyMDBMX0IwLAorCQlBQ1QyMDBMX1JFRzAgIHwgQUNUMjAwTF9UWEVOIHwgQUNUMjAwTF9SWEVOLAorCQlBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfMTE1MjAwICAgICAgICYgMHgwZiksCisJCUFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF8xMTUyMDAgPj4gNCkgJiAweDBmKSwKKwkJQUNUMjAwTF9SRUcxIHwgQUNUMjAwTF9MT0RCIHwgQUNUMjAwTF9XSURFCisJfTsKKworCS8qIFNldCBETEFCIDEuICovCisJc291dHAoVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIgfCBVQVJUX0xDUl9XTEVOOCk7CisKKwkvKiBTZXQgZGl2aXNvciB0byAxMiA9PiA5NjAwIEJhdWQgKi8KKwlzb3V0cChVQVJUX0RMTSwgMCk7CisJc291dHAoVUFSVF9ETEwsIDEyKTsKKworCS8qIFNldCBETEFCIDAuICovCisJc291dHAoVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU44KTsKKwkvKiBTZXQgZGl2aXNvciB0byAxMiA9PiA5NjAwIEJhdWQgKi8KKworCS8qIHBvd2VyIHN1cHBseSAqLworCXNvdXRwKFVBUlRfTUNSLCBVQVJUX01DUl9SVFN8VUFSVF9NQ1JfRFRSfFVBUlRfTUNSX09VVDIpOworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKQorCQlzYWZlX3VkZWxheSgxMDAwKTsKKworCQkvKiBSZXNldCB0aGUgZG9uZ2xlIDogc2V0IFJUUyBsb3cgZm9yIDI1IG1zICovCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX0RUUnxVQVJUX01DUl9PVVQyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykKKwkJdWRlbGF5KDEwMDApOworCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX1JUU3xVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfT1VUMik7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX1JUU3xVQVJUX01DUl9PVVQyKTsKKwl1ZGVsYXkoNyk7CisKKwkvKiBzZW5kIG91dCB0aGUgY29udHJvbCByZWdpc3RlciBzZXR0aW5ncyBmb3IgMTE1SyA3TjEgU0lSIG9wZXJhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY29udHJvbCk7IGkrKykgeworCQlzb3V0cChVQVJUX1RYLCBjb250cm9sW2ldKTsKKwkJLyogb25lIGJ5dGUgdGFrZXMgfjEwNDIgdXNlYyB0byB0cmFuc21pdCBhdCA5NjAwLDhOMSAqLworCQl1ZGVsYXkoMTUwMCk7CisJfQorCisJLyogYmFjayB0byBub3JtYWwgb3BlcmF0aW9uICovCisJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX1JUU3xVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfT1VUMik7CisJdWRlbGF5KDUwKTsKKworCXVkZWxheSgxNTAwKTsKKwlzb3V0cChVQVJUX0xDUiwgc2lucChVQVJUX0xDUikgfCBVQVJUX0xDUl9ETEFCKTsKKworCS8qIFNldCBETEFCIDEuICovCisJc291dHAoVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIgfCBVQVJUX0xDUl9XTEVONyk7CisKKwkvKiBTZXQgZGl2aXNvciB0byAxID0+IDExNTIwMCBCYXVkICovCisJc291dHAoVUFSVF9ETE0sIDApOworCXNvdXRwKFVBUlRfRExMLCAxKTsKKworCS8qIFNldCBETEFCIDAuICovCisJc291dHAoVUFSVF9MQ1IsIHNpbnAoVUFSVF9MQ1IpICYgKH5VQVJUX0xDUl9ETEFCKSk7CisKKwkvKiBTZXQgRExBQiAwLCA3IEJpdCAqLworCXNvdXRwKFVBUlRfTENSLCBVQVJUX0xDUl9XTEVONyk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXNvdXRwKFVBUlRfSUVSLCBzaW5wKFVBUlRfSUVSKXxVQVJUX0lFUl9SREkpOworfQorI2VuZGlmCisKKyNpZmRlZiBMSVJDX1NJUl9BQ1RJU1lTX0FDVDIyMEwKKy8qCisgKiBEZXJpdmVkIGZyb20gbGludXggSXJEQSBkcml2ZXIgKG5ldC9pcmRhL2FjdGlzeXMuYykKKyAqIERyb3AgbWUgYSBtYWlsIGZvciBhbnkga2luZCBvZiBjb21tZW50OiBtYXh4QHNwYWNlYm95ei5uZXQKKyAqLworCit2b2lkIGluaXRfYWN0MjIwKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBETEFCIDEgKi8KKwlzb3V0cChVQVJUX0xDUiwgVUFSVF9MQ1JfRExBQnxVQVJUX0xDUl9XTEVONyk7CisKKwkvKiA5NjAwIGJhdWQgKi8KKwlzb3V0cChVQVJUX0RMTSwgMCk7CisJc291dHAoVUFSVF9ETEwsIDEyKTsKKworCS8qIERMQUIgMCAqLworCXNvdXRwKFVBUlRfTENSLCBVQVJUX0xDUl9XTEVONyk7CisKKwkvKiByZXNldCB0aGUgZG9uZ2xlLCBzZXQgRFRSIGxvdyBmb3IgMTB1cyAqLworCXNvdXRwKFVBUlRfTUNSLCBVQVJUX01DUl9SVFN8VUFSVF9NQ1JfT1VUMik7CisJdWRlbGF5KDEwKTsKKworCS8qIGJhY2sgdG8gbm9ybWFsIChzdGlsbCA5NjAwKSAqLworCXNvdXRwKFVBUlRfTUNSLCBVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfUlRTfFVBUlRfTUNSX09VVDIpOworCisJLyoKKwkgKiBzZW5kIFJUUyBwdWxzZXMgdW50aWwgd2UgcmVhY2ggMTE1MjAwCisJICogaSBob3BlIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGZvciBhY3QyMjBsL2FjdDIyMGwrCisJICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1ZGVsYXkoMTApOworCQkvKiBzZXQgUlRTIGxvdyBmb3IgMTAgdXMgKi8KKwkJc291dHAoVUFSVF9NQ1IsIFVBUlRfTUNSX0RUUnxVQVJUX01DUl9PVVQyKTsKKwkJdWRlbGF5KDEwKTsKKwkJLyogc2V0IFJUUyBoaWdoIGZvciAxMCB1cyAqLworCQlzb3V0cChVQVJUX01DUiwgVUFSVF9NQ1JfUlRTfFVBUlRfTUNSX0RUUnxVQVJUX01DUl9PVVQyKTsKKwl9CisKKwkvKiBiYWNrIHRvIG5vcm1hbCBvcGVyYXRpb24gKi8KKwl1ZGVsYXkoMTUwMCk7IC8qIGJldHRlciBzYWZlIHRoYW4gc29ycnkgOykgKi8KKworCS8qIFNldCBETEFCIDEuICovCisJc291dHAoVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIgfCBVQVJUX0xDUl9XTEVONyk7CisKKwkvKiBTZXQgZGl2aXNvciB0byAxID0+IDExNTIwMCBCYXVkICovCisJc291dHAoVUFSVF9ETE0sIDApOworCXNvdXRwKFVBUlRfRExMLCAxKTsKKworCS8qIFNldCBETEFCIDAsIDcgQml0ICovCisJLyogVGhlIGRvbmdsZSBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhbnkgcHJvYmxlbXMgd2l0aCBvcGVyYXRpb24gYXQgN04xICovCisJc291dHAoVUFSVF9MQ1IsIFVBUlRfTENSX1dMRU43KTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJc291dHAoVUFSVF9JRVIsIFVBUlRfSUVSX1JESSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpbml0X2xpcmNfc2lyKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxpcmNfcmVhZF9xdWV1ZSk7CisJcmV0dmFsID0gaW5pdF9wb3J0KCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJaW5pdF9oYXJkd2FyZSgpOworCXByaW50ayhLRVJOX0lORk8gTElSQ19EUklWRVJfTkFNRQorCQkiOiBJbnN0YWxsZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBsaXJjX3Npcl9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGluaXRfY2hyZGV2KCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gaW5pdF9saXJjX3NpcigpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9jaHJkZXYoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsaXJjX3Npcl9leGl0KHZvaWQpCit7CisJZHJvcF9oYXJkd2FyZSgpOworCWRyb3BfY2hyZGV2KCk7CisJZHJvcF9wb3J0KCk7CisJcHJpbnRrKEtFUk5fSU5GTyBMSVJDX0RSSVZFUl9OQU1FICI6IFVuaW5zdGFsbGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KGxpcmNfc2lyX2luaXQpOworbW9kdWxlX2V4aXQobGlyY19zaXJfZXhpdCk7CisKKyNpZmRlZiBMSVJDX1NJUl9URUtSQU0KK01PRFVMRV9ERVNDUklQVElPTigiSW5mcmFyZWQgcmVjZWl2ZXIgZHJpdmVyIGZvciBUZWtyYW0gSXJtYXRlIDIxMCIpOworTU9EVUxFX0FVVEhPUigiQ2hyaXN0b3BoIEJhcnRlbG11cyIpOworI2VsaWYgZGVmaW5lZChMSVJDX09OX1NBMTEwMCkKK01PRFVMRV9ERVNDUklQVElPTigiTElSQyBkcml2ZXIgZm9yIFN0cm9uZ0FSTSBTQTExMDAgZW1iZWRkZWQgbWljcm9wcm9jZXNzb3IiKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzdG9waCBCYXJ0ZWxtdXMiKTsKKyNlbGlmIGRlZmluZWQoTElSQ19TSVJfQUNUSVNZU19BQ1QyMDBMKQorTU9EVUxFX0RFU0NSSVBUSU9OKCJMSVJDIGRyaXZlciBmb3IgQWN0aXN5cyBBY3QyMDBMIik7CitNT0RVTEVfQVVUSE9SKCJLYXJsIEJvbmdlcnMiKTsKKyNlbGlmIGRlZmluZWQoTElSQ19TSVJfQUNUSVNZU19BQ1QyMjBMKQorTU9EVUxFX0RFU0NSSVBUSU9OKCJMSVJDIGRyaXZlciBmb3IgQWN0aXN5cyBBY3QyMjBMKCspIik7CitNT0RVTEVfQVVUSE9SKCJKYW4gUm9lbWlzY2giKTsKKyNlbHNlCitNT0RVTEVfREVTQ1JJUFRJT04oIkluZnJhcmVkIHJlY2VpdmVyIGRyaXZlciBmb3IgU0lSIHR5cGUgc2VyaWFsIHBvcnRzIik7CitNT0RVTEVfQVVUSE9SKCJNaWxhbiBQaWt1bGEiKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgTElSQ19PTl9TQTExMDAKK21vZHVsZV9wYXJhbShpcnEsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkludGVycnVwdCAoMTYpIik7CisjZWxzZQorbW9kdWxlX3BhcmFtKGlvLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIGJhc2UgKDB4M2Y4IG9yIDB4MmY4KSIpOworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJbnRlcnJ1cHQgKDQgb3IgMykiKTsKKworbW9kdWxlX3BhcmFtKHRocmVzaG9sZCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0ModGhyZXNob2xkLCAic3BhY2UgZGV0ZWN0aW9uIHRocmVzaG9sZCAoMykiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3N0cmVhbXphcC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zdHJlYW16YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA5YzEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zdHJlYW16YXAuYwpAQCAtMCwwICsxLDgyMSBAQAorLyoKKyAqIFN0cmVhbXphcCBSZW1vdGUgQ29udHJvbCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2hyaXN0b3BoIEJhcnRlbG11cyA8bGlyY0BiYXJ0ZWxtdXMuZGU+CisgKgorICogVGhpcyBkcml2ZXIgd2FzIGJhc2VkIG9uIHRoZSB3b3JrIG9mIEdyZWcgV2lja2hhbSBhbmQgQWRyaWFuCisgKiBEZXdodXJzdC4gSXQgd2FzIHN1YnN0YW50aWFsbHkgcmV3cml0dGVuIHRvIHN1cHBvcnQgY29ycmVjdCBzaWduYWwKKyAqIGdhcHMgYW5kIG5vdyBtYWludGFpbnMgYSBkZWxheSBidWZmZXIsIHdoaWNoIGlzIHVzZWQgdG8gcHJlc2VudAorICogY29uc2lzdGVudCB0aW1pbmcgYmVoYXZpb3VyIHRvIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zLiBXaXRob3V0IHRoZQorICogZGVsYXkgYnVmZmVyIGFuIHVnbHkgaGFjayB3b3VsZCBiZSByZXF1aXJlZCBpbiBsaXJjZCwgd2hpY2ggY2FuCisgKiBjYXVzZSBzbHVnZ2lzaCBzaWduYWwgZGVjb2RpbmcgaW4gY2VydGFpbiBzaXR1YXRpb25zLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBVU0Igc2tlbGV0b24gZHJpdmVyIHBhY2thZ2VkIHdpdGggdGhlCisgKiBrZXJuZWw7IGNvcHlyaWdodCAoQykgMjAwMS0yMDAzIEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKworI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMS4yOCIKKyNkZWZpbmUgRFJJVkVSX05BTUUJImxpcmNfc3RyZWFtemFwIgorI2RlZmluZSBEUklWRVJfREVTQwkiU3RyZWFtemFwIFJlbW90ZSBDb250cm9sIGRyaXZlciIKKworc3RhdGljIGludCBkZWJ1ZzsKKworI2RlZmluZSBVU0JfU1RSRUFNWkFQX1ZFTkRPUl9JRAkJMHgwZTljCisjZGVmaW5lIFVTQl9TVFJFQU1aQVBfUFJPRFVDVF9JRAkweDAwMDAKKworLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoZGVidWcpCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiWyVkXTogIglcCisJCQkgICAgICAgZm10ICJcbiIsICMjIGFyZ3MpOwkJXAorCX0gd2hpbGUgKDApCisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBzdHJlYW16YXBfdGFibGVbXSA9IHsKKwkvKiBTdHJlYW16YXAgUmVtb3RlIENvbnRyb2wgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1NUUkVBTVpBUF9WRU5ET1JfSUQsIFVTQl9TVFJFQU1aQVBfUFJPRFVDVF9JRCkgfSwKKwkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHN0cmVhbXphcF90YWJsZSk7CisKKyNkZWZpbmUgU1RSRUFNWkFQX1BVTFNFX01BU0sgMHhmMAorI2RlZmluZSBTVFJFQU1aQVBfU1BBQ0VfTUFTSyAweDBmCisjZGVmaW5lIFNUUkVBTVpBUF9USU1FT1VUICAgIDB4ZmYKKyNkZWZpbmUgU1RSRUFNWkFQX1JFU09MVVRJT04gMjU2CisKKy8qIG51bWJlciBvZiBzYW1wbGVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIFNUUkVBTVpBUF9CVUZfTEVOIDEyOAorCitlbnVtIFN0cmVhbXphcERlY29kZXJTdGF0ZSB7CisJUHVsc2VTcGFjZSwKKwlGdWxsUHVsc2UsCisJRnVsbFNwYWNlLAorCUlnbm9yZVB1bHNlCit9OworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZgorICoKKyAqIHNvbWUgcmVtYXJrcyByZWdhcmRpbmcgbG9ja2luZzoKKyAqIHRoZW9yZXRpY2FsbHkgdGhpcyBzdHJ1Y3QgY2FuIGJlIGFjY2Vzc2VkIGZyb20gdGhyZWUgdGhyZWFkczoKKyAqCisgKiAtIGZyb20gbGlyY19kZXYgdGhyb3VnaCBzZXRfdXNlX2luYy9zZXRfdXNlX2RlYworICoKKyAqIC0gZnJvbSB0aGUgVVNCIGxheWVyIHRocm91aCBwcm9iZS9kaXNjb25uZWN0L2lycQorICoKKyAqICAgQ2FyZWZ1bCBwbGFjZW1lbnQgb2YgbGlyY19yZWdpc3Rlcl9kcml2ZXIvbGlyY191bnJlZ2lzdGVyX2RyaXZlcgorICogICBjYWxscyB3aWxsIHByZXZlbnQgY29uZmxpY3RzLiBsaXJjX2RldiBtYWtlcyBzdXJlIHRoYXQKKyAqICAgc2V0X3VzZV9pbmMvc2V0X3VzZV9kZWMgYXJlIG5vdCBiZWluZyBleGVjdXRlZCBhbmQgd2lsbCBub3QgYmUKKyAqICAgY2FsbGVkIGFmdGVyIGxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIgcmV0dXJucy4KKyAqCisgKiAtIGJ5IHRoZSB0aW1lciBjYWxsYmFjaworICoKKyAqICAgVGhlIHRpbWVyIGlzIG9ubHkgcnVubmluZyB3aGVuIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCB0aGUKKyAqICAgTElSQyBkZXZpY2UgaXMgb3Blbi4gTWFraW5nIHN1cmUgdGhlIHRpbWVyIGlzIGRlbGV0ZWQgYnkKKyAqICAgc2V0X3VzZV9kZWMgd2lsbCBtYWtlIGNvbmZsaWN0cyBpbXBvc3NpYmxlLgorICovCitzdHJ1Y3QgdXNiX3N0cmVhbXphcCB7CisKKwkvKiB1c2IgKi8KKwkvKiBzYXZlIG9mZiB0aGUgdXNiIGRldmljZSBwb2ludGVyICovCisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CisJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZXJmYWNlOworCisJLyogYnVmZmVyICYgZG1hICovCisJdW5zaWduZWQgY2hhcgkJKmJ1Zl9pbjsKKwlkbWFfYWRkcl90CQlkbWFfaW47CisJdW5zaWduZWQgaW50CQlidWZfaW5fbGVuOworCisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKworCS8qIElSUSAqLworCXN0cnVjdCB1cmIJCSp1cmJfaW47CisKKwkvKiBsaXJjICovCisJc3RydWN0IGxpcmNfZHJpdmVyCSpkcml2ZXI7CisJc3RydWN0IGxpcmNfYnVmZmVyCSpkZWxheV9idWY7CisKKwkvKiB0aW1lciB1c2VkIHRvIHN1cHBvcnQgZGVsYXkgYnVmZmVyaW5nICovCisJc3RydWN0IHRpbWVyX2xpc3QJZGVsYXlfdGltZXI7CisJaW50CQkJdGltZXJfcnVubmluZzsKKwlzcGlubG9ja190CQl0aW1lcl9sb2NrOworCisJLyogdHJhY2tzIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgc29tZSBzaWduYWwgKi8KKwlpbnQJCQlpZGxlOworCS8qIHN1bSBvZiBzaWduYWwgbGVuZ3RocyByZWNlaXZlZCBzaW5jZSBzaWduYWwgc3RhcnQgKi8KKwl1bnNpZ25lZCBsb25nCQlzdW07CisJLyogc3RhcnQgdGltZSBvZiBzaWduYWw7IG5lY2Vzc2FyeSBmb3IgZ2FwIHRyYWNraW5nICovCisJc3RydWN0IHRpbWV2YWwJCXNpZ25hbF9sYXN0OworCXN0cnVjdCB0aW1ldmFsCQlzaWduYWxfc3RhcnQ7CisJZW51bSBTdHJlYW16YXBEZWNvZGVyU3RhdGUgZGVjb2Rlcl9zdGF0ZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlmbHVzaF90aW1lcjsKKwlpbnQJCQlmbHVzaDsKKwlpbnQJCQlpbl91c2U7CisJaW50CQkJdGltZW91dF9lbmFibGVkOworfTsKKworCisvKiBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IHN0cmVhbXphcF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHN0cmVhbXphcF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworc3RhdGljIHZvaWQgdXNiX3N0cmVhbXphcF9pcnEoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBpbnQgc3RyZWFtemFwX3VzZV9pbmModm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBzdHJlYW16YXBfdXNlX2RlYyh2b2lkICpkYXRhKTsKK3N0YXRpYyBsb25nIHN0cmVhbXphcF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBzdHJlYW16YXBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOworc3RhdGljIGludCBzdHJlYW16YXBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc3RyZWFtemFwX2RyaXZlciA9IHsKKwkubmFtZSA9CQlEUklWRVJfTkFNRSwKKwkucHJvYmUgPQlzdHJlYW16YXBfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQlzdHJlYW16YXBfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CXN0cmVhbXphcF9zdXNwZW5kLAorCS5yZXN1bWUgPQlzdHJlYW16YXBfcmVzdW1lLAorCS5pZF90YWJsZSA9CXN0cmVhbXphcF90YWJsZSwKK307CisKK3N0YXRpYyB2b2lkIHN0b3BfdGltZXIoc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3otPnRpbWVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoc3otPnRpbWVyX3J1bm5pbmcpIHsKKwkJc3otPnRpbWVyX3J1bm5pbmcgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzei0+dGltZXJfbG9jaywgZmxhZ3MpOworCQlkZWxfdGltZXJfc3luYygmc3otPmRlbGF5X3RpbWVyKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzei0+dGltZXJfbG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgZmx1c2hfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNiX3N0cmVhbXphcCAqc3ogPSAoc3RydWN0IHVzYl9zdHJlYW16YXAgKikgYXJnOworCisJLyogZmluYWxseSBzdGFydCBhY2NlcHRpbmcgZGF0YSAqLworCXN6LT5mbHVzaCA9IDA7Cit9CitzdGF0aWMgdm9pZCBkZWxheV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogZGVsaXZlciBkYXRhIGV2ZXJ5IDEwIG1zICovCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfaW5jID0KKwkJKDEwMDAwLygxMDAwMDAwL0haKSkgPT0gMCA/IDEgOiAoMTAwMDAvKDEwMDAwMDAvSFopKTsKKwlzdHJ1Y3QgdXNiX3N0cmVhbXphcCAqc3ogPSAoc3RydWN0IHVzYl9zdHJlYW16YXAgKikgYXJnOworCWludCBkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN6LT50aW1lcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWxpcmNfYnVmZmVyX2VtcHR5KHN6LT5kZWxheV9idWYpICYmCisJICAgICFsaXJjX2J1ZmZlcl9mdWxsKHN6LT5kcml2ZXItPnJidWYpKSB7CisJCWxpcmNfYnVmZmVyX3JlYWQoc3otPmRlbGF5X2J1ZiwgKHVuc2lnbmVkIGNoYXIgKikgJmRhdGEpOworCQlsaXJjX2J1ZmZlcl93cml0ZShzei0+ZHJpdmVyLT5yYnVmLCAodW5zaWduZWQgY2hhciAqKSAmZGF0YSk7CisJfQorCWlmICghbGlyY19idWZmZXJfZW1wdHkoc3otPmRlbGF5X2J1ZikpIHsKKwkJd2hpbGUgKGxpcmNfYnVmZmVyX2F2YWlsYWJsZShzei0+ZGVsYXlfYnVmKSA8CisJCSAgICAgICBTVFJFQU1aQVBfQlVGX0xFTiAvIDIgJiYKKwkJICAgICAgICFsaXJjX2J1ZmZlcl9mdWxsKHN6LT5kcml2ZXItPnJidWYpKSB7CisJCQlsaXJjX2J1ZmZlcl9yZWFkKHN6LT5kZWxheV9idWYsCisJCQkJCSAgICh1bnNpZ25lZCBjaGFyICopICZkYXRhKTsKKwkJCWxpcmNfYnVmZmVyX3dyaXRlKHN6LT5kcml2ZXItPnJidWYsCisJCQkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZGF0YSk7CisJCX0KKwkJaWYgKHN6LT50aW1lcl9ydW5uaW5nKSB7CisJCQlzei0+ZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lcl9pbmM7CisJCQlhZGRfdGltZXIoJnN6LT5kZWxheV90aW1lcik7CisJCX0KKwl9IGVsc2UgeworCQlzei0+dGltZXJfcnVubmluZyA9IDA7CisJfQorCisJaWYgKCFsaXJjX2J1ZmZlcl9lbXB0eShzei0+ZHJpdmVyLT5yYnVmKSkKKwkJd2FrZV91cCgmc3otPmRyaXZlci0+cmJ1Zi0+d2FpdF9wb2xsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN6LT50aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2RlbGF5X2J1ZmZlcihzdHJ1Y3QgdXNiX3N0cmVhbXphcCAqc3opCit7CisJaW50IGRhdGE7CisJaW50IGVtcHR5ID0gMTsKKworCXdoaWxlICghbGlyY19idWZmZXJfZW1wdHkoc3otPmRlbGF5X2J1ZikpIHsKKwkJZW1wdHkgPSAwOworCQlsaXJjX2J1ZmZlcl9yZWFkKHN6LT5kZWxheV9idWYsICh1bnNpZ25lZCBjaGFyICopICZkYXRhKTsKKwkJaWYgKCFsaXJjX2J1ZmZlcl9mdWxsKHN6LT5kcml2ZXItPnJidWYpKSB7CisJCQlsaXJjX2J1ZmZlcl93cml0ZShzei0+ZHJpdmVyLT5yYnVmLAorCQkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmRhdGEpOworCQl9IGVsc2UgeworCQkJZHByaW50aygiYnVmZmVyIG92ZXJmbG93Iiwgc3otPmRyaXZlci0+bWlub3IpOworCQl9CisJfQorCWlmICghZW1wdHkpCisJCXdha2VfdXAoJnN6LT5kcml2ZXItPnJidWYtPndhaXRfcG9sbCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2goc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6LCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3otPnRpbWVyX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlyY19idWZmZXJfZnVsbChzei0+ZGVsYXlfYnVmKSkgeworCQlpbnQgcmVhZF9kYXRhOworCisJCWxpcmNfYnVmZmVyX3JlYWQoc3otPmRlbGF5X2J1ZiwKKwkJCQkgICAodW5zaWduZWQgY2hhciAqKSAmcmVhZF9kYXRhKTsKKwkJaWYgKCFsaXJjX2J1ZmZlcl9mdWxsKHN6LT5kcml2ZXItPnJidWYpKSB7CisJCQlsaXJjX2J1ZmZlcl93cml0ZShzei0+ZHJpdmVyLT5yYnVmLAorCQkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnJlYWRfZGF0YSk7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKCJidWZmZXIgb3ZlcmZsb3ciLCBzei0+ZHJpdmVyLT5taW5vcik7CisJCX0KKwl9CisKKwlsaXJjX2J1ZmZlcl93cml0ZShzei0+ZGVsYXlfYnVmLCBkYXRhKTsKKworCWlmICghc3otPnRpbWVyX3J1bm5pbmcpIHsKKwkJc3otPmRlbGF5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovMTA7CisJCWFkZF90aW1lcigmc3otPmRlbGF5X3RpbWVyKTsKKwkJc3otPnRpbWVyX3J1bm5pbmcgPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN6LT50aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfZnVsbF9wdWxzZShzdHJ1Y3QgdXNiX3N0cmVhbXphcCAqc3osCisJCQkgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgcHVsc2U7CisKKwlpZiAoc3otPmlkbGUpIHsKKwkJbG9uZyBkZWx0djsKKwkJaW50IHRtcDsKKworCQlzei0+c2lnbmFsX2xhc3QgPSBzei0+c2lnbmFsX3N0YXJ0OworCQlkb19nZXR0aW1lb2ZkYXkoJnN6LT5zaWduYWxfc3RhcnQpOworCisJCWRlbHR2ID0gc3otPnNpZ25hbF9zdGFydC50dl9zZWMtc3otPnNpZ25hbF9sYXN0LnR2X3NlYzsKKwkJaWYgKGRlbHR2ID4gMTUpIHsKKwkJCS8qIHJlYWxseSBsb25nIHRpbWUgKi8KKwkJCXRtcCA9IExJUkNfU1BBQ0UoTElSQ19WQUxVRV9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IChpbnQpIChkZWx0dioxMDAwMDAwKworCQkJCQlzei0+c2lnbmFsX3N0YXJ0LnR2X3VzZWMgLQorCQkJCQlzei0+c2lnbmFsX2xhc3QudHZfdXNlYyk7CisJCQl0bXAgLT0gc3otPnN1bTsKKwkJCXRtcCA9IExJUkNfU1BBQ0UodG1wKTsKKwkJfQorCQlkcHJpbnRrKCJscyAldSIsIHN6LT5kcml2ZXItPm1pbm9yLCB0bXApOworCQlwdXNoKHN6LCAoY2hhciAqKSZ0bXApOworCisJCXN6LT5pZGxlID0gMDsKKwkJc3otPnN1bSA9IDA7CisJfQorCisJcHVsc2UgPSAoKGludCkgdmFsdWUpICogU1RSRUFNWkFQX1JFU09MVVRJT047CisJcHVsc2UgKz0gU1RSRUFNWkFQX1JFU09MVVRJT04gLyAyOworCXN6LT5zdW0gKz0gcHVsc2U7CisJcHVsc2UgPSBMSVJDX1BVTFNFKHB1bHNlKTsKKworCWRwcmludGsoInAgJXUiLCBzei0+ZHJpdmVyLT5taW5vciwgcHVsc2UgJiBQVUxTRV9NQVNLKTsKKwlwdXNoKHN6LCAoY2hhciAqKSZwdWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfaGFsZl9wdWxzZShzdHJ1Y3QgdXNiX3N0cmVhbXphcCAqc3osCisJCQkgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlwdXNoX2Z1bGxfcHVsc2Uoc3osICh2YWx1ZSAmIFNUUkVBTVpBUF9QVUxTRV9NQVNLKT4+NCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfZnVsbF9zcGFjZShzdHJ1Y3QgdXNiX3N0cmVhbXphcCAqc3osCisJCQkgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgc3BhY2U7CisKKwlzcGFjZSA9ICgoaW50KSB2YWx1ZSkqU1RSRUFNWkFQX1JFU09MVVRJT047CisJc3BhY2UgKz0gU1RSRUFNWkFQX1JFU09MVVRJT04vMjsKKwlzei0+c3VtICs9IHNwYWNlOworCXNwYWNlID0gTElSQ19TUEFDRShzcGFjZSk7CisJZHByaW50aygicyAldSIsIHN6LT5kcml2ZXItPm1pbm9yLCBzcGFjZSk7CisJcHVzaChzeiwgKGNoYXIgKikmc3BhY2UpOworfQorCitzdGF0aWMgdm9pZCBwdXNoX2hhbGZfc3BhY2Uoc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6LAorCQkJICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJcHVzaF9mdWxsX3NwYWNlKHN6LCB2YWx1ZSAmIFNUUkVBTVpBUF9TUEFDRV9NQVNLKTsKK30KKworLyoqCisgKiB1c2Jfc3RyZWFtemFwX2lycSAtIElSUSBoYW5kbGVyCisgKgorICogVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCBvbiByZWNlcHRpb24gb2YgZGF0YSBmcm9tCisgKiB0aGUgdXNiIHJlbW90ZS4KKyAqLworc3RhdGljIHZvaWQgdXNiX3N0cmVhbXphcF9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2Jfc3RyZWFtemFwICpzejsKKwlpbnQJCWxlbjsKKwl1bnNpZ25lZCBpbnQJaSA9IDA7CisKKwlpZiAoIXVyYikKKwkJcmV0dXJuOworCisJc3ogPSB1cmItPmNvbnRleHQ7CisJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyoKKwkJICogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAuCisJCSAqIHN6IG1pZ2h0IGFscmVhZHkgYmUgaW52YWxpZCBhdCB0aGlzIHBvaW50CisJCSAqLworCQlkcHJpbnRrKCJ1cmIgc3RhdHVzOiAlZCIsIC0xLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlkcHJpbnRrKCJyZWNlaXZlZCAlZCIsIHN6LT5kcml2ZXItPm1pbm9yLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWlmICghc3otPmZsdXNoKSB7CisJCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkrKykgeworCQkJZHByaW50aygiJWQ6ICV4Iiwgc3otPmRyaXZlci0+bWlub3IsCisJCQkJaSwgKHVuc2lnbmVkIGNoYXIpIHN6LT5idWZfaW5baV0pOworCQkJc3dpdGNoIChzei0+ZGVjb2Rlcl9zdGF0ZSkgeworCQkJY2FzZSBQdWxzZVNwYWNlOgorCQkJCWlmICgoc3otPmJ1Zl9pbltpXSZTVFJFQU1aQVBfUFVMU0VfTUFTSykgPT0KKwkJCQkgICAgU1RSRUFNWkFQX1BVTFNFX01BU0spIHsKKwkJCQkJc3otPmRlY29kZXJfc3RhdGUgPSBGdWxsUHVsc2U7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoKHN6LT5idWZfaW5baV0mU1RSRUFNWkFQX1NQQUNFX01BU0spCisJCQkJCSAgID09IFNUUkVBTVpBUF9TUEFDRV9NQVNLKSB7CisJCQkJCXB1c2hfaGFsZl9wdWxzZShzeiwgc3otPmJ1Zl9pbltpXSk7CisJCQkJCXN6LT5kZWNvZGVyX3N0YXRlID0gRnVsbFNwYWNlOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlwdXNoX2hhbGZfcHVsc2Uoc3osIHN6LT5idWZfaW5baV0pOworCQkJCQlwdXNoX2hhbGZfc3BhY2Uoc3osIHN6LT5idWZfaW5baV0pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRnVsbFB1bHNlOgorCQkJCXB1c2hfZnVsbF9wdWxzZShzeiwgc3otPmJ1Zl9pbltpXSk7CisJCQkJc3otPmRlY29kZXJfc3RhdGUgPSBJZ25vcmVQdWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRnVsbFNwYWNlOgorCQkJCWlmIChzei0+YnVmX2luW2ldID09IFNUUkVBTVpBUF9USU1FT1VUKSB7CisJCQkJCXN6LT5pZGxlID0gMTsKKwkJCQkJc3RvcF90aW1lcihzeik7CisJCQkJCWlmIChzei0+dGltZW91dF9lbmFibGVkKSB7CisJCQkJCQlpbnQgdGltZW91dCA9CisJCQkJCQkJTElSQ19USU1FT1VUCisJCQkJCQkJKFNUUkVBTVpBUF9USU1FT1VUICoKKwkJCQkJCQlTVFJFQU1aQVBfUkVTT0xVVElPTik7CisJCQkJCQlwdXNoKHN6LCAoY2hhciAqKSZ0aW1lb3V0KTsKKwkJCQkJfQorCQkJCQlmbHVzaF9kZWxheV9idWZmZXIoc3opOworCQkJCX0gZWxzZQorCQkJCQlwdXNoX2Z1bGxfc3BhY2Uoc3osIHN6LT5idWZfaW5baV0pOworCQkJCXN6LT5kZWNvZGVyX3N0YXRlID0gUHVsc2VTcGFjZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSWdub3JlUHVsc2U6CisJCQkJaWYgKChzei0+YnVmX2luW2ldJlNUUkVBTVpBUF9TUEFDRV9NQVNLKSA9PQorCQkJCSAgICBTVFJFQU1aQVBfU1BBQ0VfTUFTSykgeworCQkJCQlzei0+ZGVjb2Rlcl9zdGF0ZSA9IEZ1bGxTcGFjZTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXB1c2hfaGFsZl9zcGFjZShzeiwgc3otPmJ1Zl9pbltpXSk7CisJCQkJc3otPmRlY29kZXJfc3RhdGUgPSBQdWxzZVNwYWNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RyZWFtemFwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS51bmxvY2tlZF9pb2N0bAk9IHN0cmVhbXphcF9pb2N0bCwKKwkucmVhZAkJPSBsaXJjX2Rldl9mb3BfcmVhZCwKKwkud3JpdGUJCT0gbGlyY19kZXZfZm9wX3dyaXRlLAorCS5wb2xsCQk9IGxpcmNfZGV2X2ZvcF9wb2xsLAorCS5vcGVuCQk9IGxpcmNfZGV2X2ZvcF9vcGVuLAorCS5yZWxlYXNlCT0gbGlyY19kZXZfZm9wX2Nsb3NlLAorfTsKKworCisvKioKKyAqCXN0cmVhbXphcF9wcm9iZQorICoKKyAqCUNhbGxlZCBieSB1c2ItY29yZSB0byBhc3NvY2lhdGVkIHdpdGggYSBjYW5kaWRhdGUgZGV2aWNlCisgKglPbiBhbnkgZmFpbHVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBFUlJPUgorICoJT24gc3VjY2VzcyByZXR1cm4gMAorICovCitzdGF0aWMgaW50IHN0cmVhbXphcF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2hvc3Q7CisJc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6OworCXN0cnVjdCBsaXJjX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCBsaXJjX2J1ZmZlciAqbGlyY19idWY7CisJc3RydWN0IGxpcmNfYnVmZmVyICpkZWxheV9idWY7CisJY2hhciBidWZbNjNdLCBuYW1lWzEyOF0gPSAiIjsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwlpbnQgbWlub3IgPSAwOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGRldmljZSBkcml2ZXIgc3BlY2lmaWMgZGF0YSAqLworCXN6ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zdHJlYW16YXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3ogPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzei0+dWRldiA9IHVkZXY7CisJc3otPmludGVyZmFjZSA9IGludGVyZmFjZTsKKworCS8qIENoZWNrIHRvIGVuc3VyZSBlbmRwb2ludCBpbmZvcm1hdGlvbiBtYXRjaGVzIHJlcXVpcmVtZW50cyAqLworCWlmYWNlX2hvc3QgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGlmYWNlX2hvc3QtPmRlc2MuYk51bUVuZHBvaW50cyAhPSAxKSB7CisJCWVycigiJXM6IFVuZXhwZWN0ZWQgZGVzYy5iTnVtRW5kcG9pbnRzICglZCkiLCBfX2Z1bmNfXywKKwkJICAgIGlmYWNlX2hvc3QtPmRlc2MuYk51bUVuZHBvaW50cyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9zejsKKwl9CisKKwlzei0+ZW5kcG9pbnQgPSAmKGlmYWNlX2hvc3QtPmVuZHBvaW50WzBdLmRlc2MpOworCWlmICgoc3otPmVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorCSAgICAhPSBVU0JfRElSX0lOKSB7CisJCWVycigiJXM6IGVuZHBvaW50IGRvZXNuJ3QgbWF0Y2ggaW5wdXQgZGV2aWNlIDAyJTAyeCIsCisJCSAgICBfX2Z1bmNfXywgc3otPmVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3N6OworCX0KKworCWlmICgoc3otPmVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKKwkgICAgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisJCWVycigiJXM6IGVuZHBvaW50IGF0dHJpYnV0ZXMgZG9uJ3QgbWF0Y2ggeGZlciAwMiUwMngiLAorCQkgICAgX19mdW5jX18sIHN6LT5lbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3N6OworCX0KKworCWlmIChzei0+ZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplID09IDApIHsKKwkJZXJyKCIlczogZW5kcG9pbnQgbWVzc2FnZSBzaXplPT0wPyAiLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9zejsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgVVNCIGJ1ZmZlciBhbmQgSVJRIFVSQiAqLworCisJc3otPmJ1Zl9pbl9sZW4gPSBzei0+ZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplOworCXN6LT5idWZfaW4gPSB1c2JfYWxsb2NfY29oZXJlbnQoc3otPnVkZXYsIHN6LT5idWZfaW5fbGVuLAorCQkJCSAgICAgIEdGUF9BVE9NSUMsICZzei0+ZG1hX2luKTsKKwlpZiAoc3otPmJ1Zl9pbiA9PSBOVUxMKQorCQlnb3RvIGZyZWVfc3o7CisKKwlzei0+dXJiX2luID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3otPnVyYl9pbiA9PSBOVUxMKQorCQlnb3RvIGZyZWVfc3o7CisKKwkvKiBDb25uZWN0IHRoaXMgZGV2aWNlIHRvIHRoZSBMSVJDIHN1Yi1zeXN0ZW0gKi8KKwlkcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRyaXZlcikKKwkJZ290byBmcmVlX3N6OworCisJbGlyY19idWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpcmNfYnVmKQorCQlnb3RvIGZyZWVfZHJpdmVyOworCWlmIChsaXJjX2J1ZmZlcl9pbml0KGxpcmNfYnVmLCBzaXplb2YoaW50KSwgU1RSRUFNWkFQX0JVRl9MRU4pKQorCQlnb3RvIGtmcmVlX2xpcmNfYnVmOworCisJZGVsYXlfYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWxheV9idWYpCisJCWdvdG8gZnJlZV9saXJjX2J1ZjsKKwlpZiAobGlyY19idWZmZXJfaW5pdChkZWxheV9idWYsIHNpemVvZihpbnQpLCBTVFJFQU1aQVBfQlVGX0xFTikpCisJCWdvdG8ga2ZyZWVfZGVsYXlfYnVmOworCisJc3otPmRyaXZlciA9IGRyaXZlcjsKKwlzdHJjcHkoc3otPmRyaXZlci0+bmFtZSwgRFJJVkVSX05BTUUpOworCXN6LT5kcml2ZXItPm1pbm9yID0gLTE7CisJc3otPmRyaXZlci0+c2FtcGxlX3JhdGUgPSAwOworCXN6LT5kcml2ZXItPmNvZGVfbGVuZ3RoID0gc2l6ZW9mKGludCkgKiA4OworCXN6LT5kcml2ZXItPmZlYXR1cmVzID0gTElSQ19DQU5fUkVDX01PREUyIHwKKwkJTElSQ19DQU5fR0VUX1JFQ19SRVNPTFVUSU9OIHwKKwkJTElSQ19DQU5fU0VUX1JFQ19USU1FT1VUOworCXN6LT5kcml2ZXItPmRhdGEgPSBzejsKKwlzei0+ZHJpdmVyLT5taW5fdGltZW91dCA9IFNUUkVBTVpBUF9USU1FT1VUICogU1RSRUFNWkFQX1JFU09MVVRJT047CisJc3otPmRyaXZlci0+bWF4X3RpbWVvdXQgPSBTVFJFQU1aQVBfVElNRU9VVCAqIFNUUkVBTVpBUF9SRVNPTFVUSU9OOworCXN6LT5kcml2ZXItPnJidWYgPSBsaXJjX2J1ZjsKKwlzei0+ZGVsYXlfYnVmID0gZGVsYXlfYnVmOworCXN6LT5kcml2ZXItPnNldF91c2VfaW5jID0gJnN0cmVhbXphcF91c2VfaW5jOworCXN6LT5kcml2ZXItPnNldF91c2VfZGVjID0gJnN0cmVhbXphcF91c2VfZGVjOworCXN6LT5kcml2ZXItPmZvcHMgPSAmc3RyZWFtemFwX2ZvcHM7CisJc3otPmRyaXZlci0+ZGV2ID0gJmludGVyZmFjZS0+ZGV2OworCXN6LT5kcml2ZXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlzei0+aWRsZSA9IDE7CisJc3otPmRlY29kZXJfc3RhdGUgPSBQdWxzZVNwYWNlOworCWluaXRfdGltZXIoJnN6LT5kZWxheV90aW1lcik7CisJc3otPmRlbGF5X3RpbWVyLmZ1bmN0aW9uID0gZGVsYXlfdGltZW91dDsKKwlzei0+ZGVsYXlfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzejsKKwlzei0+dGltZXJfcnVubmluZyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnN6LT50aW1lcl9sb2NrKTsKKworCWluaXRfdGltZXIoJnN6LT5mbHVzaF90aW1lcik7CisJc3otPmZsdXNoX3RpbWVyLmZ1bmN0aW9uID0gZmx1c2hfdGltZW91dDsKKwlzei0+Zmx1c2hfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzejsKKwkvKiBDb21wbGV0ZSBmaW5hbCBpbml0aWFsaXNhdGlvbnMgKi8KKworCXVzYl9maWxsX2ludF91cmIoc3otPnVyYl9pbiwgdWRldiwKKwkJdXNiX3JjdmludHBpcGUodWRldiwgc3otPmVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJc3otPmJ1Zl9pbiwgc3otPmJ1Zl9pbl9sZW4sIHVzYl9zdHJlYW16YXBfaXJxLCBzeiwKKwkJc3otPmVuZHBvaW50LT5iSW50ZXJ2YWwpOworCXN6LT51cmJfaW4tPnRyYW5zZmVyX2RtYSA9IHN6LT5kbWFfaW47CisJc3otPnVyYl9pbi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwlpZiAodWRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyCisJICAgICYmIHVzYl9zdHJpbmcodWRldiwgdWRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyLAorCQkJICBidWYsIHNpemVvZihidWYpKSA+IDApCisJCXN0cmxjcHkobmFtZSwgYnVmLCBzaXplb2YobmFtZSkpOworCisJaWYgKHVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QKKwkgICAgJiYgdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0LAorCQkJICBidWYsIHNpemVvZihidWYpKSA+IDApCisJCXNucHJpbnRmKG5hbWUgKyBzdHJsZW4obmFtZSksIHNpemVvZihuYW1lKSAtIHN0cmxlbihuYW1lKSwKKwkJCSAiICVzIiwgYnVmKTsKKworCW1pbm9yID0gbGlyY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsKKworCWlmIChtaW5vciA8IDApCisJCWdvdG8gZnJlZV9kZWxheV9idWY7CisKKwlzei0+ZHJpdmVyLT5taW5vciA9IG1pbm9yOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHN6KTsKKworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIlslZF06ICVzIG9uIHVzYiVkOiVkIGF0dGFjaGVkXG4iLAorCSAgICAgICBzei0+ZHJpdmVyLT5taW5vciwgbmFtZSwKKwkgICAgICAgdWRldi0+YnVzLT5idXNudW0sIHN6LT51ZGV2LT5kZXZudW0pOworCisJcmV0dXJuIDA7CisKK2ZyZWVfZGVsYXlfYnVmOgorCWxpcmNfYnVmZmVyX2ZyZWUoc3otPmRlbGF5X2J1Zik7CitrZnJlZV9kZWxheV9idWY6CisJa2ZyZWUoZGVsYXlfYnVmKTsKK2ZyZWVfbGlyY19idWY6CisJbGlyY19idWZmZXJfZnJlZShzei0+ZHJpdmVyLT5yYnVmKTsKK2tmcmVlX2xpcmNfYnVmOgorCWtmcmVlKGxpcmNfYnVmKTsKK2ZyZWVfZHJpdmVyOgorCWtmcmVlKGRyaXZlcik7CitmcmVlX3N6OgorCWlmIChyZXR2YWwgPT0gLUVOT01FTSkKKwkJZXJyKCJPdXQgb2YgbWVtb3J5Iik7CisKKwlpZiAoc3opIHsKKwkJdXNiX2ZyZWVfdXJiKHN6LT51cmJfaW4pOworCQl1c2JfZnJlZV9jb2hlcmVudCh1ZGV2LCBzei0+YnVmX2luX2xlbiwgc3otPmJ1Zl9pbiwgc3otPmRtYV9pbik7CisJCWtmcmVlKHN6KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHN0cmVhbXphcF91c2VfaW5jKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6ID0gZGF0YTsKKworCWlmICghc3opIHsKKwkJZHByaW50aygiJXMgY2FsbGVkIHdpdGggbm8gY29udGV4dCIsIC0xLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkcHJpbnRrKCJzZXQgdXNlIGluYyIsIHN6LT5kcml2ZXItPm1pbm9yKTsKKworCWxpcmNfYnVmZmVyX2NsZWFyKHN6LT5kcml2ZXItPnJidWYpOworCWxpcmNfYnVmZmVyX2NsZWFyKHN6LT5kZWxheV9idWYpOworCisJc3otPmZsdXNoX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJc3otPmZsdXNoID0gMTsKKwlhZGRfdGltZXIoJnN6LT5mbHVzaF90aW1lcik7CisKKwlzei0+dXJiX2luLT5kZXYgPSBzei0+dWRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIoc3otPnVyYl9pbiwgR0ZQX0FUT01JQykpIHsKKwkJZHByaW50aygib3BlbiByZXN1bHQgPSAtRUlPIGVycm9yIHN1Ym1pdHRpbmcgdXJiIiwKKwkJCXN6LT5kcml2ZXItPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXN6LT5pbl91c2UrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW16YXBfdXNlX2RlYyh2b2lkICpkYXRhKQoreworCXN0cnVjdCB1c2Jfc3RyZWFtemFwICpzeiA9IGRhdGE7CisKKwlpZiAoIXN6KSB7CisJCWRwcmludGsoIiVzIGNhbGxlZCB3aXRoIG5vIGNvbnRleHQiLCAtMSwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWRwcmludGsoInNldCB1c2UgZGVjIiwgc3otPmRyaXZlci0+bWlub3IpOworCisJaWYgKHN6LT5mbHVzaCkgeworCQlzei0+Zmx1c2ggPSAwOworCQlkZWxfdGltZXJfc3luYygmc3otPmZsdXNoX3RpbWVyKTsKKwl9CisKKwl1c2Jfa2lsbF91cmIoc3otPnVyYl9pbik7CisKKwlzdG9wX3RpbWVyKHN6KTsKKworCXN6LT5pbl91c2UtLTsKK30KKworc3RhdGljIGxvbmcgc3RyZWFtemFwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgdmFsOworCXN0cnVjdCB1c2Jfc3RyZWFtemFwICpzeiA9IGxpcmNfZ2V0X3BkYXRhKGZpbGVwKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBMSVJDX0dFVF9SRUNfUkVTT0xVVElPTjoKKwkJcmVzdWx0ID0gcHV0X3VzZXIoU1RSRUFNWkFQX1JFU09MVVRJT04sICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBMSVJDX1NFVF9SRUNfVElNRU9VVDoKKwkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKwkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQlpZiAodmFsID09IFNUUkVBTVpBUF9USU1FT1VUICogU1RSRUFNWkFQX1JFU09MVVRJT04pCisJCQkJc3otPnRpbWVvdXRfZW5hYmxlZCA9IDE7CisJCQllbHNlIGlmICh2YWwgPT0gMCkKKwkJCQlzei0+dGltZW91dF9lbmFibGVkID0gMDsKKwkJCWVsc2UKKwkJCQlyZXN1bHQgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBsaXJjX2Rldl9mb3BfaW9jdGwoZmlsZXAsIGNtZCwgYXJnKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBzdHJlYW16YXBfZGlzY29ubmVjdAorICoKKyAqIENhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICoKKyAqIFRoaXMgcm91dGluZSBndWFyYW50ZWVzIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBzdWJtaXQgYW55IG1vcmUgdXJicworICogYnkgY2xlYXJpbmcgZGV2LT51ZGV2LiAgSXQgaXMgYWxzbyBzdXBwb3NlZCB0byB0ZXJtaW5hdGUgYW55IGN1cnJlbnRseQorICogYWN0aXZlIHVyYnMuICBVbmZvcnR1bmF0ZWx5LCB1c2JfYnVsa19tc2coKSwgdXNlZCBpbiBzdHJlYW16YXBfcmVhZCgpLAorICogZG9lcyBub3QgcHJvdmlkZSBhbnkgd2F5IHRvIGRvIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkIHN0cmVhbXphcF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6OworCWludCBlcnJudW07CisJaW50IG1pbm9yOworCisJc3ogPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwkvKiB1bnJlZ2lzdGVyIGZyb20gdGhlIExJUkMgc3ViLXN5c3RlbSAqLworCisJZXJybnVtID0gbGlyY191bnJlZ2lzdGVyX2RyaXZlcihzei0+ZHJpdmVyLT5taW5vcik7CisJaWYgKGVycm51bSAhPSAwKQorCQlkcHJpbnRrKCJlcnJvciBpbiBsaXJjX3VucmVnaXN0ZXI6IChyZXR1cm5lZCAlZCkiLAorCQkJc3otPmRyaXZlci0+bWlub3IsIGVycm51bSk7CisKKwlsaXJjX2J1ZmZlcl9mcmVlKHN6LT5kZWxheV9idWYpOworCWxpcmNfYnVmZmVyX2ZyZWUoc3otPmRyaXZlci0+cmJ1Zik7CisKKwkvKiB1bnJlZ2lzdGVyIGZyb20gdGhlIFVTQiBzdWItc3lzdGVtICovCisKKwl1c2JfZnJlZV91cmIoc3otPnVyYl9pbik7CisKKwl1c2JfZnJlZV9jb2hlcmVudChzei0+dWRldiwgc3otPmJ1Zl9pbl9sZW4sIHN6LT5idWZfaW4sIHN6LT5kbWFfaW4pOworCisJbWlub3IgPSBzei0+ZHJpdmVyLT5taW5vcjsKKwlrZnJlZShzei0+ZHJpdmVyLT5yYnVmKTsKKwlrZnJlZShzei0+ZHJpdmVyKTsKKwlrZnJlZShzei0+ZGVsYXlfYnVmKTsKKwlrZnJlZShzeik7CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICJbJWRdOiBkaXNjb25uZWN0ZWRcbiIsIG1pbm9yKTsKK30KKworc3RhdGljIGludCBzdHJlYW16YXBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIlslZF06IHN1c3BlbmRcbiIsIHN6LT5kcml2ZXItPm1pbm9yKTsKKwlpZiAoc3otPmluX3VzZSkgeworCQlpZiAoc3otPmZsdXNoKSB7CisJCQlzei0+Zmx1c2ggPSAwOworCQkJZGVsX3RpbWVyX3N5bmMoJnN6LT5mbHVzaF90aW1lcik7CisJCX0KKworCQlzdG9wX3RpbWVyKHN6KTsKKworCQl1c2Jfa2lsbF91cmIoc3otPnVyYl9pbik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmVhbXphcF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9zdHJlYW16YXAgKnN6ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWxpcmNfYnVmZmVyX2NsZWFyKHN6LT5kcml2ZXItPnJidWYpOworCWxpcmNfYnVmZmVyX2NsZWFyKHN6LT5kZWxheV9idWYpOworCisJaWYgKHN6LT5pbl91c2UpIHsKKwkJc3otPmZsdXNoX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCXN6LT5mbHVzaCA9IDE7CisJCWFkZF90aW1lcigmc3otPmZsdXNoX3RpbWVyKTsKKworCQlzei0+dXJiX2luLT5kZXYgPSBzei0+dWRldjsKKwkJaWYgKHVzYl9zdWJtaXRfdXJiKHN6LT51cmJfaW4sIEdGUF9BVE9NSUMpKSB7CisJCQlkcHJpbnRrKCJvcGVuIHJlc3VsdCA9IC1FSU8gZXJyb3Igc3VibWl0dGluZyB1cmIiLAorCQkJCXN6LT5kcml2ZXItPm1pbm9yKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXVzYl9zdHJlYW16YXBfaW5pdAorICovCitzdGF0aWMgaW50IF9faW5pdCB1c2Jfc3RyZWFtemFwX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3Rlcigmc3RyZWFtemFwX2RyaXZlcik7CisKKwlpZiAocmVzdWx0KSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwKKwkJICAgIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04gIiByZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl1c2Jfc3RyZWFtemFwX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl9zdHJlYW16YXBfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzdHJlYW16YXBfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdCh1c2Jfc3RyZWFtemFwX2luaXQpOworbW9kdWxlX2V4aXQodXNiX3N0cmVhbXphcF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQ2hyaXN0b3BoIEJhcnRlbG11cywgR3JlZyBXaWNraGFtLCBBZHJpYW4gRGV3aHVyc3QiKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfdHR1c2Jpci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY190dHVzYmlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0NWFiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfdHR1c2Jpci5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogbGlyY190dHVzYmlyLmMKKyAqCisgKiBsaXJjX3R0dXNiaXIgLSBMSVJDIGRldmljZSBkcml2ZXIgZm9yIHRoZSBUZWNobm9UcmVuZCBVU0IgSVIgUmVjZWl2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU3RlZmFuIE1hY2hlciA8c3RfbWFrZXItbGlyY0B5YWhvby5kZT4KKyAqCisgKiBUaGlzIExJUkMgZHJpdmVyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgVGVjaG5vVHJlbmQgVVNCIElSIFJlY2VpdmVyLgorICogVGhlIHJlY2VpdmVyIGRlbGl2ZXJzIHRoZSBJUiBzaWduYWwgYXMgcmF3IHNhbXBsZWQgdHJ1ZS9mYWxzZSBkYXRhIGluCisgKiBpc29jaHJvbm91cyBVU0IgcGFja2V0cyBlYWNoIG9mIHNpemUgMTI4IGJ5dGUuCisgKiBDdXJyZW50bHkgdGhlIGRyaXZlciByZWR1Y2VzIHRoZSBzYW1wbGluZyByYXRlIGJ5IGZhY3RvciBvZiA4IGFzIHRoaXMKKyAqIGlzIHN0aWxsIG1vcmUgdGhhbiBlbm91Z2ggdG8gZGVjb2RlIFJDLTUgLSBvdGhlcnMgc2hvdWxkIGJlIGFuYWx5emVkLgorICogQnV0IHRoZSBkcml2ZXIgZG9lcyBub3QgcmVseSBvbiBSQy01IGl0IHNob3VsZCBiZSBhYmxlIHRvIGRlY29kZSBldmVyeQorICogSVIgc2lnbmFsIHRoYXQgaXMgbm90IHRvbyBmYXN0LgorICovCisKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPG1lZGlhL2xpcmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlRlY2hub1RyZW5kIFVTQiBJUiBkZXZpY2UgZHJpdmVyIGZvciBMSVJDIik7CitNT0RVTEVfQVVUSE9SKCJTdGVmYW4gTWFjaGVyIChzdF9tYWtlci1saXJjQHlhaG9vLmRlKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAjZGVmaW5lIERFQlVHICovCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRFBSSU5USyBwcmludGsKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoX3hfLCBhLi4uKQorI2VuZGlmCisKKy8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBwcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIGRpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworc3RhdGljIHZvaWQgdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgaW50IHNldF91c2VfaW5jKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgc2V0X3VzZV9kZWModm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbnQgbnVtX3VyYnMgPSAyOworbW9kdWxlX3BhcmFtKG51bV91cmJzLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhudW1fdXJicywKKwkJICJOdW1iZXIgb2YgVVJCcyBpbiBxdWV1ZS4gVHJ5IHRvIGluY3JlYXNlIHRvIDQgaW4gY2FzZSAiCisJCSAib2YgcHJvYmxlbXMgKGRlZmF1bHQ6IDI7IG1pbmltdW06IDIpIik7CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfaWRfdGFibGVbXSA9IHsKKwkvKiBUZWNobm9UcmVuZCBVU0IgSVIgUmVjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwQjQ4LCAweDIwMDMpIH0sCisJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX2lkX3RhYmxlKTsKKworLyogVVNCIGRyaXZlciBkZWZpbml0aW9uICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJUVFVTQklSIiwKKwkuaWRfdGFibGUgPSAmKGRldmljZV9pZF90YWJsZVswXSksCisJLnByb2JlID0gcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkaXNjb25uZWN0LAorfTsKKworLyogVVNCIGRldmljZSBkZWZpbml0aW9uICovCitzdHJ1Y3QgdHR1c2Jpcl9kZXZpY2UgeworCXN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJpdmVyOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmY7CisJc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgY2xhc3NfZHJpdmVyOworCXVuc2lnbmVkIGludCBpZm51bTsgLyogSW50ZXJmYWNlIG51bWJlciB0byB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgYWx0X3NldHRpbmc7IC8qIGFsdGVybmF0ZSBzZXR0aW5nIHRvIHVzZSAqLworCXVuc2lnbmVkIGludCBlbmRwb2ludDsgLyogRW5kcG9pbnQgdG8gdXNlICovCisJc3RydWN0IHVyYiAqKnVyYjsgLyogbnVtX3VyYiBVUkIgcG9pbnRlcnMqLworCWNoYXIgKipidWZmZXI7IC8qIDEyOCBieXRlIGJ1ZmZlciBmb3IgZWFjaCBVUkIgKi8KKwlzdHJ1Y3QgbGlyY19idWZmZXIgcmJ1ZjsgLyogQnVmZmVyIHRvd2FyZHMgTElSQyAqLworCXN0cnVjdCBsaXJjX2RyaXZlciBkcml2ZXI7CisJaW50IG1pbm9yOworCWludCBsYXN0X3B1bHNlOyAvKiByZW1lbWJlcnMgaWYgbGFzdCByZWNlaXZlZCBieXRlIHdhcyBwdWxzZSBvciBzcGFjZSAqLworCWludCBsYXN0X251bTsgLyogcmVtZW1iZXJzIGhvdyBtYW55IGxhc3QgYnl0ZXMgYXBwZWFyZWQgKi8KKwlpbnQgb3BlbmVkOworfTsKKworLyoqKiBMSVJDIHNwZWNpZmljIGZ1bmN0aW9ucyAqKiovCitzdGF0aWMgaW50IHNldF91c2VfaW5jKHZvaWQgKmRhdGEpCit7CisJaW50IGksIHJldHZhbDsKKwlzdHJ1Y3QgdHR1c2Jpcl9kZXZpY2UgKnR0dXNiaXIgPSBkYXRhOworCisJRFBSSU5USygiU2VuZGluZyBmaXJzdCBVUkJzXG4iKTsKKwkvKiBAVE9ETyBEbyBJIG5lZWQgdG8gY2hlY2sgaWYgSSBhbSBhbHJlYWR5IG9wZW5lZCAqLworCXR0dXNiaXItPm9wZW5lZCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3VyYnM7IGkrKykgeworCQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih0dHVzYmlyLT51cmJbaV0sIEdGUF9LRVJORUwpOworCQlpZiAocmV0dmFsKSB7CisJCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgb24gdXJiICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgaSk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfdXNlX2RlYyh2b2lkICpkYXRhKQoreworCXN0cnVjdCB0dHVzYmlyX2RldmljZSAqdHR1c2JpciA9IGRhdGE7CisKKwlEUFJJTlRLKCJEZXZpY2UgY2xvc2VkXG4iKTsKKworCXR0dXNiaXItPm9wZW5lZCA9IDA7Cit9CisKKy8qKiogVVNCIHNwZWNpZmljIGZ1bmN0aW9ucyAqKiovCisKKy8qCisgKiBUaGlzIG1hcHBpbmcgdGFibGUgaXMgdXNlZCB0byBkbyBhIHZlcnkgc2ltcGxlIGZpbHRlcmluZyBvZiB0aGUKKyAqIGlucHV0IHNpZ25hbC4KKyAqIEZvciBhIHZhbHVlIHdpdGggYXQgbGVhc3QgNCBiaXRzIHNldCBpdCByZXR1cm5zIDB4RkYgb3RoZXJ3aXNlCisgKiAweDAwLiAgRm9yIGZhc3RlciBJUiBzaWduYWxzIHRoaXMgY2FuIG5vdCBiZSB1c2VkLiBCdXQgZm9yIFJDLTUgd2UKKyAqIHN0aWxsIGhhdmUgYWJvdXQgMTQgc2FtcGxlcyBwZXIgcHVsc2Uvc3BhY2UsIGkuZS4gd2Ugc2FtcGxlIHdpdGggMTQKKyAqIHRpbWVzIGhpZ2hlciBmcmVxdWVuY3kgdGhhbiB0aGUgc2lnbmFsIGZyZXF1ZW5jeQorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIG1hcF90YWJsZVtdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweDAwLCAweEZGLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweDAwLCAweEZGLCAweEZGLCAweEZGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweDAwLCAweEZGLCAweEZGLCAweEZGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorfTsKKworc3RhdGljIHZvaWQgdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdHR1c2Jpcl9kZXZpY2UgKnR0dXNiaXI7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCBpOworCWludCBsOworCisJdHR1c2JpciA9IHVyYi0+Y29udGV4dDsKKworCWlmICghdHR1c2Jpci0+b3BlbmVkKQorCQlyZXR1cm47CisKKwlidWYgPSAodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCS8qIEhlcmUgd2UgZG8gdGhlIGZpbHRlcmluZyBhbmQgc29tZSBraW5kIG9mIGRvd24gc2FtcGxpbmcgKi8KKwkJYnVmW2ldID0gfm1hcF90YWJsZVtidWZbaV1dOworCQlpZiAodHR1c2Jpci0+bGFzdF9wdWxzZSA9PSBidWZbaV0pIHsKKwkJCWlmICh0dHVzYmlyLT5sYXN0X251bSA8IFBVTFNFX01BU0svNjMpCisJCQkJdHR1c2Jpci0+bGFzdF9udW0rKzsKKwkJLyoKKwkJICogZWxzZSB3ZSBhcmUgaW4gYSBpZGxlIHBlcmlvZCBhbmQgZG8gbm90IG5lZWQgdG8KKwkJICogaW5jcmVtZW50IGFueSBsb25nZXIKKwkJICovCisJCX0gZWxzZSB7CisJCQlsID0gdHR1c2Jpci0+bGFzdF9udW0gKiA2MjsgLyogYWJvdXQgNjIgPSB1cy9ieXRlICovCisJCQlpZiAodHR1c2Jpci0+bGFzdF9wdWxzZSkgLyogcHVsc2Ugb3Igc3BhY2U/ICovCisJCQkJbCB8PSBQVUxTRV9CSVQ7CisJCQlpZiAoIWxpcmNfYnVmZmVyX2Z1bGwoJnR0dXNiaXItPnJidWYpKSB7CisJCQkJbGlyY19idWZmZXJfd3JpdGUoJnR0dXNiaXItPnJidWYsICh2b2lkICopJmwpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR1c2Jpci0+cmJ1Zi53YWl0X3BvbGwpOworCQkJfQorCQkJdHR1c2Jpci0+bGFzdF9udW0gPSAwOworCQkJdHR1c2Jpci0+bGFzdF9wdWxzZSA9IGJ1ZltpXTsKKwkJfQorCX0KKwl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOyAvKiBrZWVwIGRhdGEgcm9sbGluZyA6LSkgKi8KK30KKworLyoKKyAqIENhbGxlZCB3aGVuZXZlciB0aGUgVVNCIHN1YnN5c3RlbSB0aGlua3Mgd2UgY291bGQgYmUgdGhlIHJpZ2h0IGRyaXZlcgorICogdG8gaGFuZGxlIHRoaXMgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgYWx0X3NldCwgZW5kcDsKKwlpbnQgZm91bmQgPSAwOworCWludCBpLCBqOworCWludCBzdHJ1Y3Rfc2l6ZTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpob3N0X2ludGVyZjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZfZGVzYzsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhvc3RfZW5kcG9pbnQ7CisJc3RydWN0IHR0dXNiaXJfZGV2aWNlICp0dHVzYmlyOworCisJRFBSSU5USygiTW9kdWxlIHR0dXNiaXIgcHJvYmVcbiIpOworCisJLyogVG8gcmVkdWNlIG1lbW9yeSBmcmFnbWVudGF0aW9uIHdlIHVzZSBvbmx5IG9uZSBhbGxvY2F0aW9uICovCisJc3RydWN0X3NpemUgPSAgc2l6ZW9mKHN0cnVjdCB0dHVzYmlyX2RldmljZSkgKworCQkoc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiBudW1fdXJicykgKworCQkoc2l6ZW9mKGNoYXIgKikgKiBudW1fdXJicykgKworCQkobnVtX3VyYnMgKiAxMjgpOworCXR0dXNiaXIgPSBremFsbG9jKHN0cnVjdF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR0dXNiaXIpCisJCXJldHVybiAtRU5PTUVNOworCisJdHR1c2Jpci0+dXJiID0gKHN0cnVjdCB1cmIgKiopKChjaGFyICopdHR1c2JpciArCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB0dHVzYmlyX2RldmljZSkpOworCXR0dXNiaXItPmJ1ZmZlciA9IChjaGFyICoqKSgoY2hhciAqKXR0dXNiaXItPnVyYiArCisJCQkJICAgKHNpemVvZihzdHJ1Y3QgdXJiICopICogbnVtX3VyYnMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3VyYnM7IGkrKykKKwkJdHR1c2Jpci0+YnVmZmVyW2ldID0gKGNoYXIgKil0dHVzYmlyLT5idWZmZXIgKworCQkJKHNpemVvZihjaGFyICopKm51bV91cmJzKSArIChpICogMTI4KTsKKworCXR0dXNiaXItPnVzYl9kcml2ZXIgPSAmdXNiX2RyaXZlcjsKKwl0dHVzYmlyLT5hbHRfc2V0dGluZyA9IC0xOworCS8qIEBUT0RPIGNoZWNrIGlmIGVycm9yIGNhbiBiZSByZXR1cm5lZCAqLworCXR0dXNiaXItPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKKwl0dHVzYmlyLT5pbnRlcmYgPSBpbnRmOworCXR0dXNiaXItPmxhc3RfcHVsc2UgPSAweDAwOworCXR0dXNiaXItPmxhc3RfbnVtID0gMDsKKworCS8qCisJICogTm93IGxvb2sgZm9yIGludGVyZmFjZSBzZXR0aW5nIHdlIGNhbiBoYW5kbGUKKwkgKiBXZSBhcmUgc2VhcmNoaW5nIGZvciB0aGUgYWx0IHNldHRpbmcgd2hlcmUgZW5kIHBvaW50CisJICogMHg4MiBoYXMgbWF4IHBhY2tldCBzaXplIDE2CisJICovCisJZm9yIChhbHRfc2V0ID0gMDsgYWx0X3NldCA8IGludGYtPm51bV9hbHRzZXR0aW5nICYmICFmb3VuZDsgYWx0X3NldCsrKSB7CisJCWhvc3RfaW50ZXJmID0gJmludGYtPmFsdHNldHRpbmdbYWx0X3NldF07CisJCWludGVyZl9kZXNjID0gJmhvc3RfaW50ZXJmLT5kZXNjOworCQlmb3IgKGVuZHAgPSAwOyBlbmRwIDwgaW50ZXJmX2Rlc2MtPmJOdW1FbmRwb2ludHM7IGVuZHArKykgeworCQkJaG9zdF9lbmRwb2ludCA9ICZob3N0X2ludGVyZi0+ZW5kcG9pbnRbZW5kcF07CisJCQlpZiAoKGhvc3RfZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyA9PSAweDgyKSAmJgorCQkJICAgIChob3N0X2VuZHBvaW50LT5kZXNjLndNYXhQYWNrZXRTaXplID09IDB4MTApKSB7CisJCQkJdHR1c2Jpci0+YWx0X3NldHRpbmcgPSBhbHRfc2V0OworCQkJCXR0dXNiaXItPmVuZHBvaW50ID0gZW5kcDsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKHR0dXNiaXItPmFsdF9zZXR0aW5nICE9IC0xKQorCQlEUFJJTlRLKCJhbHQgc2V0dGluZzogJWRcbiIsIHR0dXNiaXItPmFsdF9zZXR0aW5nKTsKKwllbHNlIHsKKwkJZXJyKCJDb3VsZCBub3QgZmluZCBhbHRlcm5hdGUgc2V0dGluZ1xuIik7CisJCWtmcmVlKHR0dXNiaXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBPSyBsZXRzIHNldHVwIHRoaXMgaW50ZXJmYWNlIHNldHRpbmcgKi8KKwl1c2Jfc2V0X2ludGVyZmFjZSh0dHVzYmlyLT51ZGV2LCAwLCB0dHVzYmlyLT5hbHRfc2V0dGluZyk7CisKKwkvKiBTdG9yZSBkZXZpY2UgaW5mbyBpbiBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCB0dHVzYmlyKTsKKworCS8qIFJlZ2lzdGVyIGFzIGEgTElSQyBkcml2ZXIgKi8KKwlpZiAobGlyY19idWZmZXJfaW5pdCgmdHR1c2Jpci0+cmJ1Ziwgc2l6ZW9mKGludCksIDI1NikgPCAwKSB7CisJCWVycigiQ291bGQgbm90IGdldCBtZW1vcnkgZm9yIExJUkMgZGF0YSBidWZmZXJcbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlrZnJlZSh0dHVzYmlyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN0cmNweSh0dHVzYmlyLT5kcml2ZXIubmFtZSwgIlRUVVNCSVIiKTsKKwl0dHVzYmlyLT5kcml2ZXIubWlub3IgPSAtMTsKKwl0dHVzYmlyLT5kcml2ZXIuY29kZV9sZW5ndGggPSAxOworCXR0dXNiaXItPmRyaXZlci5zYW1wbGVfcmF0ZSA9IDA7CisJdHR1c2Jpci0+ZHJpdmVyLmRhdGEgPSB0dHVzYmlyOworCXR0dXNiaXItPmRyaXZlci5hZGRfdG9fYnVmID0gTlVMTDsKKwl0dHVzYmlyLT5kcml2ZXIucmJ1ZiA9ICZ0dHVzYmlyLT5yYnVmOworCXR0dXNiaXItPmRyaXZlci5zZXRfdXNlX2luYyA9IHNldF91c2VfaW5jOworCXR0dXNiaXItPmRyaXZlci5zZXRfdXNlX2RlYyA9IHNldF91c2VfZGVjOworCXR0dXNiaXItPmRyaXZlci5kZXYgPSAmaW50Zi0+ZGV2OworCXR0dXNiaXItPmRyaXZlci5vd25lciA9IFRISVNfTU9EVUxFOworCXR0dXNiaXItPmRyaXZlci5mZWF0dXJlcyA9IExJUkNfQ0FOX1JFQ19NT0RFMjsKKwl0dHVzYmlyLT5taW5vciA9IGxpcmNfcmVnaXN0ZXJfZHJpdmVyKCZ0dHVzYmlyLT5kcml2ZXIpOworCWlmICh0dHVzYmlyLT5taW5vciA8IDApIHsKKwkJZXJyKCJFcnJvciByZWdpc3RlcmluZyBhcyBMSVJDIGRyaXZlclxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCWxpcmNfYnVmZmVyX2ZyZWUoJnR0dXNiaXItPnJidWYpOworCQlrZnJlZSh0dHVzYmlyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQWxsb2NhdGUgYW5kIHNldHVwIHRoZSBVUkIgdGhhdCB3ZSB3aWxsIHVzZSB0byB0YWxrIHRvIHRoZSBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3VyYnM7IGkrKykgeworCQl0dHVzYmlyLT51cmJbaV0gPSB1c2JfYWxsb2NfdXJiKDgsIEdGUF9LRVJORUwpOworCQlpZiAoIXR0dXNiaXItPnVyYltpXSkgeworCQkJZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVVJCXG4iKTsKKwkJCWZvciAoaiA9IGkgLSAxOyBqID49IDA7IGotLSkKKwkJCQlrZnJlZSh0dHVzYmlyLT51cmJbal0pOworCQkJbGlyY19idWZmZXJfZnJlZSgmdHR1c2Jpci0+cmJ1Zik7CisJCQlsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKHR0dXNiaXItPm1pbm9yKTsKKwkJCWtmcmVlKHR0dXNiaXIpOworCQkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXR0dXNiaXItPnVyYltpXS0+ZGV2ID0gdHR1c2Jpci0+dWRldjsKKwkJdHR1c2Jpci0+dXJiW2ldLT5jb250ZXh0ID0gdHR1c2JpcjsKKwkJdHR1c2Jpci0+dXJiW2ldLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHR0dXNiaXItPnVkZXYsCisJCQkJCQkJdHR1c2Jpci0+ZW5kcG9pbnQpOworCQl0dHVzYmlyLT51cmJbaV0tPmludGVydmFsID0gMTsKKwkJdHR1c2Jpci0+dXJiW2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdHR1c2Jpci0+dXJiW2ldLT50cmFuc2Zlcl9idWZmZXIgPSAmdHR1c2Jpci0+YnVmZmVyW2ldWzBdOworCQl0dHVzYmlyLT51cmJbaV0tPmNvbXBsZXRlID0gdXJiX2NvbXBsZXRlOworCQl0dHVzYmlyLT51cmJbaV0tPm51bWJlcl9vZl9wYWNrZXRzID0gODsKKwkJdHR1c2Jpci0+dXJiW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTI4OworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQl0dHVzYmlyLT51cmJbaV0tPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqMTY7CisJCQl0dHVzYmlyLT51cmJbaV0tPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IDE2OworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQgb3IgdGhlIGRldmljZSBpcyB1bnBsdWdnZWQKKyAqLworc3RhdGljIHZvaWQgZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdHR1c2Jpcl9kZXZpY2UgKnR0dXNiaXI7CisKKwlEUFJJTlRLKCJNb2R1bGUgdHR1c2JpciBkaXNjb25uZWN0XG4iKTsKKworCXR0dXNiaXIgPSAoc3RydWN0IHR0dXNiaXJfZGV2aWNlICopIHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKHR0dXNiaXItPm1pbm9yKTsKKwlEUFJJTlRLKCJ1bnJlZ2lzdGVyZWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bV91cmJzOyBpKyspIHsKKwkJdXNiX2tpbGxfdXJiKHR0dXNiaXItPnVyYltpXSk7CisJCXVzYl9mcmVlX3VyYih0dHVzYmlyLT51cmJbaV0pOworCX0KKwlEUFJJTlRLKCJVUkJzIGtpbGxlZFxuIik7CisJbGlyY19idWZmZXJfZnJlZSgmdHR1c2Jpci0+cmJ1Zik7CisJa2ZyZWUodHR1c2Jpcik7Cit9CisKK3N0YXRpYyBpbnQgdHR1c2Jpcl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlEUFJJTlRLKEtFUk5fREVCVUcgIk1vZHVsZSB0dHVzYmlyIGluaXRcbiIpOworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdXNiX2RyaXZlcik7CisJaWYgKHJlc3VsdCkKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHR0dXNiaXJfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiTW9kdWxlIHR0dXNiaXIgZXhpdFxuIik7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0dHVzYmlyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHR0dXNiaXJfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGNhYWIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jCkBAIC0wLDAgKzEsMTM4NyBAQAorLyoKKyAqIGkyYyBJUiBsaXJjIGRyaXZlciBmb3IgZGV2aWNlcyB3aXRoIHppbG9nIElSIHByb2Nlc3NvcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgR2VyZCBLbm9yciA8a3JheGVsQGdvbGRiYWNoLmluLWJlcmxpbi5kZT4KKyAqIG1vZGlmaWVkIGZvciBQaXhlbFZpZXcgKEJUODc4UCtXL0ZNKSBieQorICogICAgICBNaWNoYWwgS29jaGFub3dpY3ogPG1rb2NoYW5vQHBsZC5vcmcucGw+CisgKiAgICAgIENocmlzdG9waCBCYXJ0ZWxtdXMgPGxpcmNAYmFydGVsbXVzLmRlPgorICogbW9kaWZpZWQgZm9yIEtOQyBPTkUgVFYgU3RhdGlvbi9BbnViaXMgVHlwaG9vbiBUVmlldyBUdW5lciBieQorICogICAgICBVbHJpY2ggTXVlbGxlciA8dWxyaWNoLm11ZWxsZXI0MkB3ZWIuZGU+CisgKiBtb2RpZmllZCBmb3IgQXN1cyBUVi1Cb3ggYW5kIENyZWF0aXZlL1Zpc2lvblRlayBCcmVha091dC1Cb3ggYnkKKyAqICAgICAgU3RlZmFuIEphaG4gPHN0ZWZhbkBsa2NjLm9yZz4KKyAqIG1vZGlmaWVkIGZvciBpbmNsdXNpb24gaW50byBrZXJuZWwgc291cmNlcyBieQorICogICAgICBKZXJvbWUgQnJvY2sgPGpicm9ja0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBtb2RpZmllZCBmb3IgTGVhZHRlayBXaW5mYXN0IFBWUjIwMDAgYnkKKyAqICAgICAgVGhvbWFzIFJlaXRtYXlyICh0cmVpdG1heXJAeWFob28uY29tKQorICogbW9kaWZpZWQgZm9yIEhhdXBwYXVnZSBQVlItMTUwIElSIFRYIGRldmljZSBieQorICogICAgICBNYXJrIFdlYXZlciA8bWFya0BucHNsLmNvLnVrPgorICogY2hhbmdlZCBuYW1lIGZyb20gbGlyY19wdnIxNTAgdG8gbGlyY196aWxvZywgd29ya3Mgb24gbW9yZSB0aGFuIHB2ci0xNTAKKyAqCUphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4KKyAqCisgKiBwYXJ0cyBhcmUgY3V0JnBhc3RlZCBmcm9tIHRoZSBsaXJjX2kyYy5jIGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaW5jbHVkZSA8bWVkaWEvbGlyY19kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisKK3N0cnVjdCBJUiB7CisJc3RydWN0IGxpcmNfZHJpdmVyIGw7CisKKwkvKiBEZXZpY2UgaW5mbyAqLworCXN0cnVjdCBtdXRleCBpcl9sb2NrOworCWludCBvcGVuOworCisJLyogUlggZGV2aWNlICovCisJc3RydWN0IGkyY19jbGllbnQgY19yeDsKKwlpbnQgaGF2ZV9yeDsKKworCS8qIFJYIGRldmljZSBidWZmZXIgJiBsb2NrICovCisJc3RydWN0IGxpcmNfYnVmZmVyIGJ1ZjsKKwlzdHJ1Y3QgbXV0ZXggYnVmX2xvY2s7CisKKwkvKiBSWCBwb2xsaW5nIHRocmVhZCBkYXRhICovCisJc3RydWN0IGNvbXBsZXRpb24gKnRfbm90aWZ5OworCXN0cnVjdCBjb21wbGV0aW9uICp0X25vdGlmeTI7CisJaW50IHNodXRkb3duOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCS8qIFJYIHJlYWQgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgYlszXTsKKworCS8qIFRYIGRldmljZSAqLworCXN0cnVjdCBpMmNfY2xpZW50IGNfdHg7CisJaW50IG5lZWRfYm9vdDsKKwlpbnQgaGF2ZV90eDsKK307CisKKy8qIE1pbm9yIC0+IGRhdGEgbWFwcGluZyAqLworc3RhdGljIHN0cnVjdCBJUiAqaXJfZGV2aWNlc1tNQVhfSVJDVExfREVWSUNFU107CisKKy8qIEJsb2NrIHNpemUgZm9yIElSIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIFRYX0JMT0NLX1NJWkUJOTkKKworLyogSGF1cHBhdWdlIElSIHRyYW5zbWl0dGVyIGRhdGEgKi8KK3N0cnVjdCB0eF9kYXRhX3N0cnVjdCB7CisJLyogQm9vdCBibG9jayAqLworCXVuc2lnbmVkIGNoYXIgKmJvb3RfZGF0YTsKKworCS8qIFN0YXJ0IG9mIGJpbmFyeSBkYXRhIGJsb2NrICovCisJdW5zaWduZWQgY2hhciAqZGF0YXA7CisKKwkvKiBFbmQgb2YgYmluYXJ5IGRhdGEgYmxvY2sgKi8KKwl1bnNpZ25lZCBjaGFyICplbmRwOworCisJLyogTnVtYmVyIG9mIGluc3RhbGxlZCBjb2Rlc2V0cyAqLworCXVuc2lnbmVkIGludCBudW1fY29kZV9zZXRzOworCisJLyogUG9pbnRlcnMgdG8gY29kZXNldHMgKi8KKwl1bnNpZ25lZCBjaGFyICoqY29kZV9zZXRzOworCisJLyogR2xvYmFsIGZpeGVkIGRhdGEgdGVtcGxhdGUgKi8KKwlpbnQgZml4ZWRbVFhfQkxPQ0tfU0laRV07Cit9OworCitzdGF0aWMgc3RydWN0IHR4X2RhdGFfc3RydWN0ICp0eF9kYXRhOworc3RhdGljIHN0cnVjdCBtdXRleCB0eF9kYXRhX2xvY2s7CisKKyNkZWZpbmUgemlsb2dfbm90aWZ5KHMsIGFyZ3MuLi4pIHByaW50ayhLRVJOX05PVElDRSBLQlVJTERfTU9ETkFNRSAiOiAiIHMsIFwKKwkJCQkJIyMgYXJncykKKyNkZWZpbmUgemlsb2dfZXJyb3IocywgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FICI6ICIgcywgIyMgYXJncykKKworI2RlZmluZSBaSUxPR19IQVVQUEFVR0VfSVJfUlhfTkFNRSAiWmlsb2cvSGF1cHBhdWdlIElSIFJYIgorI2RlZmluZSBaSUxPR19IQVVQUEFVR0VfSVJfVFhfTkFNRSAiWmlsb2cvSGF1cHBhdWdlIElSIFRYIgorCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBkZWJ1ZzsJLyogZGVidWcgb3V0cHV0ICovCitzdGF0aWMgaW50IGRpc2FibGVfcng7CS8qIGRpc2FibGUgUlggZGV2aWNlICovCitzdGF0aWMgaW50IGRpc2FibGVfdHg7CS8qIGRpc2FibGUgVFggZGV2aWNlICovCitzdGF0aWMgaW50IG1pbm9yID0gLTE7CS8qIG1pbm9yIG51bWJlciAqLworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChkZWJ1ZykJCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdCwJXAorCQkJCSAjIyBhcmdzKTsJCQkJXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgYWRkX3RvX2J1ZihzdHJ1Y3QgSVIgKmlyKQoreworCV9fdTE2IGNvZGU7CisJdW5zaWduZWQgY2hhciBjb2Rlc1syXTsKKwl1bnNpZ25lZCBjaGFyIGtleWJ1Zls2XTsKKwlpbnQgZ290X2RhdGEgPSAwOworCWludCByZXQ7CisJaW50IGZhaWx1cmVzID0gMDsKKwl1bnNpZ25lZCBjaGFyIHNlbmRidWZbMV0gPSB7IDAgfTsKKworCWlmIChsaXJjX2J1ZmZlcl9mdWxsKCZpci0+YnVmKSkgeworCQlkcHJpbnRrKCJidWZmZXIgb3ZlcmZsb3dcbiIpOworCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwl9CisKKwkvKgorCSAqIHNlcnZpY2UgdGhlIGRldmljZSBhcyBsb25nIGFzIGl0IGlzIHJldHVybmluZworCSAqIGRhdGEgYW5kIHdlIGhhdmUgc3BhY2UKKwkgKi8KKwlkbyB7CisJCS8qCisJCSAqIExvY2sgaTJjIGJ1cyBmb3IgdGhlIGR1cmF0aW9uLiAgUlgvVFggY2hpcHMgaW50ZXJmZXJlIHNvCisJCSAqIHRoaXMgaXMgd29ydGggaXQKKwkJICovCisJCW11dGV4X2xvY2soJmlyLT5pcl9sb2NrKTsKKworCQkvKgorCQkgKiBTZW5kIHJhbmRvbSAicG9sbCBjb21tYW5kIiAoPykgIFdpbmRvd3MgZHJpdmVyIGRvZXMgdGhpcworCQkgKiBhbmQgaXQgaXMgYSBnb29kIHBvaW50IHRvIGRldGVjdCBjaGlwIGZhaWx1cmUuCisJCSAqLworCQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoJmlyLT5jX3J4LCBzZW5kYnVmLCAxKTsKKwkJaWYgKHJldCAhPSAxKSB7CisJCQl6aWxvZ19lcnJvcigiaTJjX21hc3Rlcl9zZW5kIGZhaWxlZCB3aXRoICVkXG4iLAlyZXQpOworCQkJaWYgKGZhaWx1cmVzID49IDMpIHsKKwkJCQltdXRleF91bmxvY2soJmlyLT5pcl9sb2NrKTsKKwkJCQl6aWxvZ19lcnJvcigidW5hYmxlIHRvIHJlYWQgZnJvbSB0aGUgSVIgY2hpcCAiCisJCQkJCSAgICAiYWZ0ZXIgMyByZXNldHMsIGdpdmluZyB1cFxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJLyogTG9va3MgbGlrZSB0aGUgY2hpcCBjcmFzaGVkLCByZXNldCBpdCAqLworCQkJemlsb2dfZXJyb3IoInBvbGxpbmcgdGhlIElSIHJlY2VpdmVyIGNoaXAgZmFpbGVkLCAiCisJCQkJICAgICJ0cnlpbmcgcmVzZXRcbiIpOworCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KCgxMDAgKiBIWiArIDk5OSkgLyAxMDAwKTsKKwkJCWlyLT5uZWVkX2Jvb3QgPSAxOworCisJCQkrK2ZhaWx1cmVzOworCQkJbXV0ZXhfdW5sb2NrKCZpci0+aXJfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IGkyY19tYXN0ZXJfcmVjdigmaXItPmNfcngsIGtleWJ1Ziwgc2l6ZW9mKGtleWJ1ZikpOworCQltdXRleF91bmxvY2soJmlyLT5pcl9sb2NrKTsKKwkJaWYgKHJldCAhPSBzaXplb2Yoa2V5YnVmKSkgeworCQkJemlsb2dfZXJyb3IoImkyY19tYXN0ZXJfcmVjdiBmYWlsZWQgd2l0aCAlZCAtLSAiCisJCQkJICAgICJrZWVwaW5nIGxhc3QgcmVhZCBidWZmZXJcbiIsIHJldCk7CisJCX0gZWxzZSB7CisJCQlpci0+YlswXSA9IGtleWJ1ZlszXTsKKwkJCWlyLT5iWzFdID0ga2V5YnVmWzRdOworCQkJaXItPmJbMl0gPSBrZXlidWZbNV07CisJCQlkcHJpbnRrKCJrZXkgKDB4JTAyeC8weCUwMngpXG4iLCBpci0+YlswXSwgaXItPmJbMV0pOworCQl9CisKKwkJLyoga2V5IHByZXNzZWQgPyAqLworI2lmZGVmIEkyQ19IV19CX0hEUFZSCisJCWlmIChpci0+Y19yeC5hZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9IRFBWUikgeworCQkJaWYgKGdvdF9kYXRhICYmIChrZXlidWZbMF0gPT0gMHg4MCkpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlIGlmIChnb3RfZGF0YSAmJiAoa2V5YnVmWzBdID09IDB4MDApKQorCQkJCXJldHVybiAtRU5PREFUQTsKKwkJfSBlbHNlIGlmICgoaXItPmJbMF0gJiAweDgwKSA9PSAwKQorI2Vsc2UKKwkJaWYgKChpci0+YlswXSAmIDB4ODApID09IDApCisjZW5kaWYKKwkJCXJldHVybiBnb3RfZGF0YSA/IDAgOiAtRU5PREFUQTsKKworCQkvKiBsb29rIHdoYXQgd2UgaGF2ZSAqLworCQljb2RlID0gKCgoX191MTYpaXItPmJbMF0gJiAweDdmKSA8PCA2KSB8IChpci0+YlsxXSA+PiAyKTsKKworCQljb2Rlc1swXSA9IChjb2RlID4+IDgpICYgMHhmZjsKKwkJY29kZXNbMV0gPSBjb2RlICYgMHhmZjsKKworCQkvKiByZXR1cm4gaXQgKi8KKwkJbGlyY19idWZmZXJfd3JpdGUoJmlyLT5idWYsIGNvZGVzKTsKKwkJKytnb3RfZGF0YTsKKwl9IHdoaWxlICghbGlyY19idWZmZXJfZnVsbCgmaXItPmJ1ZikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWluIGZ1bmN0aW9uIG9mIHRoZSBwb2xsaW5nIHRocmVhZCAtLSBmcm9tIGxpcmNfZGV2LgorICogV2UgZG9uJ3QgZml0IHRoZSBMSVJDIG1vZGVsIGF0IGFsbCBhbnltb3JlLiAgVGhpcyBpcyBob3JyaWJsZSwgYnV0CisgKiBiYXNpY2FsbHkgd2UgaGF2ZSBhIHNpbmdsZSBSWC9UWCBkZXZpY2Ugd2l0aCBhIG5hc3R5IGZhaWx1cmUgbW9kZQorICogdGhhdCBuZWVkcyB0byBiZSBhY2NvdW50ZWQgZm9yIGFjcm9zcyB0aGUgcGFpci4gIGxpcmMgbGV0cyB1cyBwcm92aWRlCisgKiBmb3BzLCBidXQgcHJldmVudHMgdXMgZnJvbSB1c2luZyB0aGUgaW50ZXJuYWwgcG9sbGluZywgZXRjLiBpZiB3ZSBkbworICogc28uICBIZW5jZSB0aGUgcmVwbGljYXRpb24uICBNaWdodCBiZSBuZWF0ZXIgdG8gZXh0ZW5kIHRoZSBMSVJDIG1vZGVsCisgKiB0byBhY2NvdW50IGZvciB0aGlzIGJ1dCBJJ2QgdGhpbmsgaXQncyBhIHZlcnkgc3BlY2lhbCBjYXNlIG9mIHNlcmlvdXNseQorICogbWVzc2VkIHVwIGhhcmR3YXJlLgorICovCitzdGF0aWMgaW50IGxpcmNfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gYXJnOworCisJaWYgKGlyLT50X25vdGlmeSAhPSBOVUxMKQorCQljb21wbGV0ZShpci0+dF9ub3RpZnkpOworCisJZHByaW50aygicG9sbCB0aHJlYWQgc3RhcnRlZFxuIik7CisKKwlkbyB7CisJCWlmIChpci0+b3BlbikgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJLyoKKwkJCSAqIFRoaXMgaXMgfjExMyoyICsgMjQgKyBqaXR0ZXIgKDIqcmVwZWF0IGdhcCArCisJCQkgKiBjb2RlIGxlbmd0aCkuICBXZSB1c2UgdGhpcyBpbnRlcnZhbCBhcyB0aGUgY2hpcAorCQkJICogcmVzZXRzIGV2ZXJ5IHRpbWUgeW91IHBvbGwgaXQgKGJhZCEpLiAgVGhpcyBpcworCQkJICogdGhlcmVmb3JlIGp1c3Qgc3VmZmljaWVudCB0byBjYXRjaCBhbGwgb2YgdGhlCisJCQkgKiBidXR0b24gcHJlc3Nlcy4gIEl0IG1ha2VzIHRoZSByZW1vdGUgbXVjaCBtb3JlCisJCQkgKiByZXNwb25zaXZlLiAgWW91IGNhbiBzZWUgdGhlIGRpZmZlcmVuY2UgYnkKKwkJCSAqIHJ1bm5pbmcgaXJ3IGFuZCBob2xkaW5nIGRvd24gYSBidXR0b24uICBXaXRoCisJCQkgKiAxMDBtcywgdGhlIG9sZCBwb2xsaW5nIGludGVydmFsLCB5b3UnbGwgbm90aWNlCisJCQkgKiBicmVha3MgaW4gdGhlIHJlcGVhdCBzZXF1ZW5jZSBjb3JyZXNwb25kaW5nIHRvCisJCQkgKiBsb3N0IGtleXByZXNzZXMuCisJCQkgKi8KKwkJCXNjaGVkdWxlX3RpbWVvdXQoKDI2MCAqIEhaKSAvIDEwMDApOworCQkJaWYgKGlyLT5zaHV0ZG93bikKKwkJCQlicmVhazsKKwkJCWlmICghYWRkX3RvX2J1ZihpcikpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpci0+YnVmLndhaXRfcG9sbCk7CisJCX0gZWxzZSB7CisJCQkvKiBpZiBkZXZpY2Ugbm90IG9wZW5lZCBzbyB3ZSBjYW4gc2xlZXAgaGFsZiBhIHNlY29uZCAqLworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFovMik7CisJCX0KKwl9IHdoaWxlICghaXItPnNodXRkb3duKTsKKworCWlmIChpci0+dF9ub3RpZnkyICE9IE5VTEwpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oaXItPnRfbm90aWZ5Mik7CisKKwlpci0+dGFzayA9IE5VTEw7CisJaWYgKGlyLT50X25vdGlmeSAhPSBOVUxMKQorCQljb21wbGV0ZShpci0+dF9ub3RpZnkpOworCisJZHByaW50aygicG9sbCB0aHJlYWQgZW5kZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF91c2VfaW5jKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IElSICppciA9IGRhdGE7CisKKwlpZiAoaXItPmwub3duZXIgPT0gTlVMTCB8fCB0cnlfbW9kdWxlX2dldChpci0+bC5vd25lcikgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBsb2NrIGJ0dHYgaW4gbWVtb3J5IHdoaWxlIC9kZXYvbGlyYyBpcyBpbiB1c2UgICovCisJLyoKKwkgKiB0aGlzIGlzIGNvbXBsZXRlbHkgYnJva2VuIGNvZGUuIGxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIoKQorCSAqIG11c3QgYmUgcG9zc2libGUgZXZlbiB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbgorCSAqLworCWlmIChpci0+Y19yeC5hZGRyKQorCQlpMmNfdXNlX2NsaWVudCgmaXItPmNfcngpOworCWlmIChpci0+Y190eC5hZGRyKQorCQlpMmNfdXNlX2NsaWVudCgmaXItPmNfdHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF91c2VfZGVjKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IElSICppciA9IGRhdGE7CisKKwlpZiAoaXItPmNfcnguYWRkcikKKwkJaTJjX3JlbGVhc2VfY2xpZW50KCZpci0+Y19yeCk7CisJaWYgKGlyLT5jX3R4LmFkZHIpCisJCWkyY19yZWxlYXNlX2NsaWVudCgmaXItPmNfdHgpOworCWlmIChpci0+bC5vd25lciAhPSBOVUxMKQorCQltb2R1bGVfcHV0KGlyLT5sLm93bmVyKTsKK30KKworLyogc2FmZSByZWFkIG9mIGEgdWludDMyIChhbHdheXMgbmV0d29yayBieXRlIG9yZGVyKSAqLworc3RhdGljIGludCByZWFkX3VpbnQzMih1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmVuZHAsIHVuc2lnbmVkIGludCAqdmFsKQoreworCWlmICgqZGF0YSArIDQgPiBlbmRwKQorCQlyZXR1cm4gMDsKKwkqdmFsID0gKCgqZGF0YSlbMF0gPDwgMjQpIHwgKCgqZGF0YSlbMV0gPDwgMTYpIHwKKwkgICAgICAgKCgqZGF0YSlbMl0gPDwgOCkgfCAoKmRhdGEpWzNdOworCSpkYXRhICs9IDQ7CisJcmV0dXJuIDE7Cit9CisKKy8qIHNhZmUgcmVhZCBvZiBhIHVpbnQ4ICovCitzdGF0aWMgaW50IHJlYWRfdWludDgodW5zaWduZWQgY2hhciAqKmRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgKmVuZHAsIHVuc2lnbmVkIGNoYXIgKnZhbCkKK3sKKwlpZiAoKmRhdGEgKyAxID4gZW5kcCkKKwkJcmV0dXJuIDA7CisJKnZhbCA9ICooKCpkYXRhKSsrKTsKKwlyZXR1cm4gMTsKK30KKworLyogc2FmZSBza2lwcGluZyBvZiBOIGJ5dGVzICovCitzdGF0aWMgaW50IHNraXAodW5zaWduZWQgY2hhciAqKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICplbmRwLCB1bnNpZ25lZCBpbnQgZGlzdGFuY2UpCit7CisJaWYgKCpkYXRhICsgZGlzdGFuY2UgPiBlbmRwKQorCQlyZXR1cm4gMDsKKwkqZGF0YSArPSBkaXN0YW5jZTsKKwlyZXR1cm4gMTsKK30KKworLyogZGVjb21wcmVzcyBrZXkgZGF0YSBpbnRvIHRoZSBnaXZlbiBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZ2V0X2tleV9kYXRhKHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvZGVzZXQsIHVuc2lnbmVkIGludCBrZXkpCit7CisJdW5zaWduZWQgY2hhciAqZGF0YSwgKmVuZHAsICpkaWZmcywgKmtleV9ibG9jazsKKwl1bnNpZ25lZCBjaGFyIGtleXMsIG5kaWZmcywgaWQ7CisJdW5zaWduZWQgaW50IGJhc2UsIGxpbSwgcG9zLCBpOworCisJLyogQmluYXJ5IHNlYXJjaCBmb3IgdGhlIGNvZGVzZXQgKi8KKwlmb3IgKGJhc2UgPSAwLCBsaW0gPSB0eF9kYXRhLT5udW1fY29kZV9zZXRzOyBsaW07IGxpbSA+Pj0gMSkgeworCQlwb3MgPSBiYXNlICsgKGxpbSA+PiAxKTsKKwkJZGF0YSA9IHR4X2RhdGEtPmNvZGVfc2V0c1twb3NdOworCisJCWlmICghcmVhZF91aW50MzIoJmRhdGEsIHR4X2RhdGEtPmVuZHAsICZpKSkKKwkJCWdvdG8gY29ycnVwdDsKKworCQlpZiAoaSA9PSBjb2Rlc2V0KQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKGNvZGVzZXQgPiBpKSB7CisJCQliYXNlID0gcG9zICsgMTsKKwkJCS0tbGltOworCQl9CisJfQorCS8qIE5vdCBmb3VuZD8gKi8KKwlpZiAoIWxpbSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwkvKiBTZXQgZW5kIG9mIGRhdGEgYmxvY2sgKi8KKwllbmRwID0gcG9zIDwgdHhfZGF0YS0+bnVtX2NvZGVfc2V0cyAtIDEgPworCQl0eF9kYXRhLT5jb2RlX3NldHNbcG9zICsgMV0gOiB0eF9kYXRhLT5lbmRwOworCisJLyogUmVhZCB0aGUgYmxvY2sgaGVhZGVyICovCisJaWYgKCFyZWFkX3VpbnQ4KCZkYXRhLCBlbmRwLCAma2V5cykgfHwKKwkgICAgIXJlYWRfdWludDgoJmRhdGEsIGVuZHAsICZuZGlmZnMpIHx8CisJICAgIG5kaWZmcyA+IFRYX0JMT0NLX1NJWkUgfHwga2V5cyA9PSAwKQorCQlnb3RvIGNvcnJ1cHQ7CisKKwkvKiBTYXZlIGRpZmZzICYgc2tpcCAqLworCWRpZmZzID0gZGF0YTsKKwlpZiAoIXNraXAoJmRhdGEsIGVuZHAsIG5kaWZmcykpCisJCWdvdG8gY29ycnVwdDsKKworCS8qIFJlYWQgdGhlIGlkIG9mIHRoZSBmaXJzdCBrZXkgKi8KKwlpZiAoIXJlYWRfdWludDgoJmRhdGEsIGVuZHAsICZpZCkpCisJCWdvdG8gY29ycnVwdDsKKworCS8qIFVucGFjayB0aGUgZmlyc3Qga2V5J3MgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9CTE9DS19TSVpFOyArK2kpIHsKKwkJaWYgKHR4X2RhdGEtPmZpeGVkW2ldID09IC0xKSB7CisJCQlpZiAoIXJlYWRfdWludDgoJmRhdGEsIGVuZHAsICZidWZbaV0pKQorCQkJCWdvdG8gY29ycnVwdDsKKwkJfSBlbHNlIHsKKwkJCWJ1ZltpXSA9ICh1bnNpZ25lZCBjaGFyKXR4X2RhdGEtPmZpeGVkW2ldOworCQl9CisJfQorCisJLyogRWFybHkgb3V0IGtleSBmb3VuZC9ub3QgZm91bmQgKi8KKwlpZiAoa2V5ID09IGlkKQorCQlyZXR1cm4gMDsKKwlpZiAoa2V5cyA9PSAxKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWtleV9ibG9jayA9IGRhdGE7CisJaWYgKCFza2lwKCZkYXRhLCBlbmRwLCAoa2V5cyAtIDEpICogKG5kaWZmcyArIDEpKSkKKwkJZ290byBjb3JydXB0OworCisJLyogQmluYXJ5IHNlYXJjaCBmb3IgdGhlIGtleSAqLworCWZvciAoYmFzZSA9IDAsIGxpbSA9IGtleXMgLSAxOyBsaW07IGxpbSA+Pj0gMSkgeworCQkvKiBTZWVrIHRvIGJsb2NrICovCisJCXVuc2lnbmVkIGNoYXIgKmtleV9kYXRhOworCQlwb3MgPSBiYXNlICsgKGxpbSA+PiAxKTsKKwkJa2V5X2RhdGEgPSBrZXlfYmxvY2sgKyAobmRpZmZzICsgMSkgKiBwb3M7CisKKwkJaWYgKCprZXlfZGF0YSA9PSBrZXkpIHsKKwkJCS8qIHNraXAga2V5IGlkICovCisJCQkrK2tleV9kYXRhOworCisJCQkvKiBmb3VuZCwgc28gdW5wYWNrIHRoZSBkaWZmcyAqLworCQkJZm9yIChpID0gMDsgaSA8IG5kaWZmczsgKytpKSB7CisJCQkJdW5zaWduZWQgY2hhciB2YWw7CisJCQkJaWYgKCFyZWFkX3VpbnQ4KCZrZXlfZGF0YSwgZW5kcCwgJnZhbCkgfHwKKwkJCQkgICAgZGlmZnNbaV0gPj0gVFhfQkxPQ0tfU0laRSkKKwkJCQkJZ290byBjb3JydXB0OworCQkJCWJ1ZltkaWZmc1tpXV0gPSB2YWw7CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGtleSA+ICprZXlfZGF0YSkgeworCQkJYmFzZSA9IHBvcyArIDE7CisJCQktLWxpbTsKKwkJfQorCX0KKwkvKiBLZXkgbm90IGZvdW5kICovCisJcmV0dXJuIC1FUFJPVE87CisKK2NvcnJ1cHQ6CisJemlsb2dfZXJyb3IoImZpcm13YXJlIGlzIGNvcnJ1cHRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorCisvKiBzZW5kIGEgYmxvY2sgb2YgZGF0YSB0byB0aGUgSVIgVFggZGV2aWNlICovCitzdGF0aWMgaW50IHNlbmRfZGF0YV9ibG9jayhzdHJ1Y3QgSVIgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhX2Jsb2NrKQoreworCWludCBpLCBqLCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbNV07CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfQkxPQ0tfU0laRTspIHsKKwkJaW50IHRvc2VuZCA9IFRYX0JMT0NLX1NJWkUgLSBpOworCQlpZiAodG9zZW5kID4gNCkKKwkJCXRvc2VuZCA9IDQ7CisJCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKShpICsgMSk7CisJCWZvciAoaiA9IDA7IGogPCB0b3NlbmQ7ICsraikKKwkJCWJ1ZlsxICsgal0gPSBkYXRhX2Jsb2NrW2kgKyBqXTsKKwkJZHByaW50aygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKKwkJCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdKTsKKwkJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKCZpci0+Y190eCwgYnVmLCB0b3NlbmQgKyAxKTsKKwkJaWYgKHJldCAhPSB0b3NlbmQgKyAxKSB7CisJCQl6aWxvZ19lcnJvcigiaTJjX21hc3Rlcl9zZW5kIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUZBVUxUOworCQl9CisJCWkgKz0gdG9zZW5kOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogc2VuZCBib290IGRhdGEgdG8gdGhlIElSIFRYIGRldmljZSAqLworc3RhdGljIGludCBzZW5kX2Jvb3RfZGF0YShzdHJ1Y3QgSVIgKmlyKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbNF07CisKKwkvKiBzZW5kIHRoZSBib290IGJsb2NrICovCisJcmV0ID0gc2VuZF9kYXRhX2Jsb2NrKGlyLCB0eF9kYXRhLT5ib290X2RhdGEpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGtpY2sgaXQgb2ZmPyAqLworCWJ1ZlswXSA9IDB4MDA7CisJYnVmWzFdID0gMHgyMDsKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoJmlyLT5jX3R4LCBidWYsIDIpOworCWlmIChyZXQgIT0gMikgeworCQl6aWxvZ19lcnJvcigiaTJjX21hc3Rlcl9zZW5kIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FRkFVTFQ7CisJfQorCXJldCA9IGkyY19tYXN0ZXJfc2VuZCgmaXItPmNfdHgsIGJ1ZiwgMSk7CisJaWYgKHJldCAhPSAxKSB7CisJCXppbG9nX2Vycm9yKCJpMmNfbWFzdGVyX3NlbmQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVGQVVMVDsKKwl9CisKKwkvKiBIZXJlIGNvbWVzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uLi4uIChob3BlZnVsbHkpICovCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KCZpci0+Y190eCwgYnVmLCA0KTsKKwlpZiAocmV0ICE9IDQpIHsKKwkJemlsb2dfZXJyb3IoImkyY19tYXN0ZXJfcmVjdiBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChidWZbMF0gIT0gMHg4MCkgeworCQl6aWxvZ19lcnJvcigidW5leHBlY3RlZCBJUiBUWCByZXNwb25zZTogJTAyeFxuIiwgYnVmWzBdKTsKKwkJcmV0dXJuIDA7CisJfQorCXppbG9nX25vdGlmeSgiWmlsb2cvSGF1cHBhdWdlIElSIGJsYXN0ZXIgZmlybXdhcmUgdmVyc2lvbiAiCisJCSAgICAgIiVkLiVkLiVkIGxvYWRlZFxuIiwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogdW5sb2FkICJmaXJtd2FyZSIsIGxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgZndfdW5sb2FkX2xvY2tlZCh2b2lkKQoreworCWlmICh0eF9kYXRhKSB7CisJCWlmICh0eF9kYXRhLT5jb2RlX3NldHMpCisJCQl2ZnJlZSh0eF9kYXRhLT5jb2RlX3NldHMpOworCisJCWlmICh0eF9kYXRhLT5kYXRhcCkKKwkJCXZmcmVlKHR4X2RhdGEtPmRhdGFwKTsKKworCQl2ZnJlZSh0eF9kYXRhKTsKKwkJdHhfZGF0YSA9IE5VTEw7CisJCWRwcmludGsoInN1Y2Nlc3NmdWxseSB1bmxvYWRlZCBJUiBibGFzdGVyIGZpcm13YXJlXG4iKTsKKwl9Cit9CisKKy8qIHVubG9hZCAiZmlybXdhcmUiIGZvciB0aGUgSVIgVFggZGV2aWNlICovCitzdGF0aWMgdm9pZCBmd191bmxvYWQodm9pZCkKK3sKKwltdXRleF9sb2NrKCZ0eF9kYXRhX2xvY2spOworCWZ3X3VubG9hZF9sb2NrZWQoKTsKKwltdXRleF91bmxvY2soJnR4X2RhdGFfbG9jayk7Cit9CisKKy8qIGxvYWQgImZpcm13YXJlIiBmb3IgdGhlIElSIFRYIGRldmljZSAqLworc3RhdGljIGludCBmd19sb2FkKHN0cnVjdCBJUiAqaXIpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhLCB2ZXJzaW9uLCBudW1fZ2xvYmFsX2ZpeGVkOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CisKKwkvKiBBbHJlYWR5IGxvYWRlZD8gKi8KKwltdXRleF9sb2NrKCZ0eF9kYXRhX2xvY2spOworCWlmICh0eF9kYXRhKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJlcXVlc3QgY29kZXNldCBkYXRhIGZpbGUgKi8KKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhhdXAtaXItYmxhc3Rlci5iaW4iLCAmaXItPmNfdHguZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJemlsb2dfZXJyb3IoImZpcm13YXJlIGhhdXAtaXItYmxhc3Rlci5iaW4gbm90IGF2YWlsYWJsZSAiCisJCQkgICAgIiglZClcbiIsIHJldCk7CisJCXJldCA9IHJldCA8IDAgPyByZXQgOiAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisJZHByaW50aygiZmlybXdhcmUgb2Ygc2l6ZSAlenUgbG9hZGVkXG4iLCBmd19lbnRyeS0+c2l6ZSk7CisKKwkvKiBQYXJzZSB0aGUgZmlsZSAqLworCXR4X2RhdGEgPSB2bWFsbG9jKHNpemVvZigqdHhfZGF0YSkpOworCWlmICh0eF9kYXRhID09IE5VTEwpIHsKKwkJemlsb2dfZXJyb3IoIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXR4X2RhdGEtPmNvZGVfc2V0cyA9IE5VTEw7CisKKwkvKiBDb3B5IHRoZSBkYXRhIHNvIGhvdHBsdWcgZG9lc24ndCBnZXQgY29uZnVzZWQgYW5kIHRpbWVvdXQgKi8KKwl0eF9kYXRhLT5kYXRhcCA9IHZtYWxsb2MoZndfZW50cnktPnNpemUpOworCWlmICh0eF9kYXRhLT5kYXRhcCA9PSBOVUxMKSB7CisJCXppbG9nX2Vycm9yKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCXZmcmVlKHR4X2RhdGEpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJbWVtY3B5KHR4X2RhdGEtPmRhdGFwLCBmd19lbnRyeS0+ZGF0YSwgZndfZW50cnktPnNpemUpOworCXR4X2RhdGEtPmVuZHAgPSB0eF9kYXRhLT5kYXRhcCArIGZ3X2VudHJ5LT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOyBmd19lbnRyeSA9IE5VTEw7CisKKwkvKiBDaGVjayB2ZXJzaW9uICovCisJZGF0YSA9IHR4X2RhdGEtPmRhdGFwOworCWlmICghcmVhZF91aW50OCgmZGF0YSwgdHhfZGF0YS0+ZW5kcCwgJnZlcnNpb24pKQorCQlnb3RvIGNvcnJ1cHQ7CisJaWYgKHZlcnNpb24gIT0gMSkgeworCQl6aWxvZ19lcnJvcigidW5zdXBwb3J0ZWQgY29kZSBzZXQgZmlsZSB2ZXJzaW9uICgldSwgZXhwZWN0ZWQiCisJCQkgICAgIjEpIC0tIHBsZWFzZSB1cGdyYWRlIHRvIGEgbmV3ZXIgZHJpdmVyIiwKKwkJCSAgICB2ZXJzaW9uKTsKKwkJZndfdW5sb2FkX2xvY2tlZCgpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTYXZlIGJvb3QgYmxvY2sgZm9yIGxhdGVyICovCisJdHhfZGF0YS0+Ym9vdF9kYXRhID0gZGF0YTsKKwlpZiAoIXNraXAoJmRhdGEsIHR4X2RhdGEtPmVuZHAsIFRYX0JMT0NLX1NJWkUpKQorCQlnb3RvIGNvcnJ1cHQ7CisKKwlpZiAoIXJlYWRfdWludDMyKCZkYXRhLCB0eF9kYXRhLT5lbmRwLAorCQkJICAgICAgJnR4X2RhdGEtPm51bV9jb2RlX3NldHMpKQorCQlnb3RvIGNvcnJ1cHQ7CisKKwlkcHJpbnRrKCIldSBJUiBibGFzdGVyIGNvZGVzZXRzIGxvYWRlZFxuIiwgdHhfZGF0YS0+bnVtX2NvZGVfc2V0cyk7CisKKwl0eF9kYXRhLT5jb2RlX3NldHMgPSB2bWFsbG9jKAorCQl0eF9kYXRhLT5udW1fY29kZV9zZXRzICogc2l6ZW9mKGNoYXIgKikpOworCWlmICh0eF9kYXRhLT5jb2RlX3NldHMgPT0gTlVMTCkgeworCQlmd191bmxvYWRfbG9ja2VkKCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9CTE9DS19TSVpFOyArK2kpCisJCXR4X2RhdGEtPmZpeGVkW2ldID0gLTE7CisKKwkvKiBSZWFkIGdsb2JhbCBmaXhlZCBkYXRhIHRlbXBsYXRlICovCisJaWYgKCFyZWFkX3VpbnQ4KCZkYXRhLCB0eF9kYXRhLT5lbmRwLCAmbnVtX2dsb2JhbF9maXhlZCkgfHwKKwkgICAgbnVtX2dsb2JhbF9maXhlZCA+IFRYX0JMT0NLX1NJWkUpCisJCWdvdG8gY29ycnVwdDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2dsb2JhbF9maXhlZDsgKytpKSB7CisJCXVuc2lnbmVkIGNoYXIgcG9zLCB2YWw7CisJCWlmICghcmVhZF91aW50OCgmZGF0YSwgdHhfZGF0YS0+ZW5kcCwgJnBvcykgfHwKKwkJICAgICFyZWFkX3VpbnQ4KCZkYXRhLCB0eF9kYXRhLT5lbmRwLCAmdmFsKSB8fAorCQkgICAgcG9zID49IFRYX0JMT0NLX1NJWkUpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCXR4X2RhdGEtPmZpeGVkW3Bvc10gPSAoaW50KXZhbDsKKwl9CisKKwkvKiBGaWxjaCBvdXQgdGhlIHBvc2l0aW9uIG9mIGVhY2ggY29kZSBzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdHhfZGF0YS0+bnVtX2NvZGVfc2V0czsgKytpKSB7CisJCXVuc2lnbmVkIGludCBpZDsKKwkJdW5zaWduZWQgY2hhciBrZXlzOworCQl1bnNpZ25lZCBjaGFyIG5kaWZmczsKKworCQkvKiBTYXZlIHRoZSBjb2Rlc2V0IHBvc2l0aW9uICovCisJCXR4X2RhdGEtPmNvZGVfc2V0c1tpXSA9IGRhdGE7CisKKwkJLyogUmVhZCBoZWFkZXIgKi8KKwkJaWYgKCFyZWFkX3VpbnQzMigmZGF0YSwgdHhfZGF0YS0+ZW5kcCwgJmlkKSB8fAorCQkgICAgIXJlYWRfdWludDgoJmRhdGEsIHR4X2RhdGEtPmVuZHAsICZrZXlzKSB8fAorCQkgICAgIXJlYWRfdWludDgoJmRhdGEsIHR4X2RhdGEtPmVuZHAsICZuZGlmZnMpIHx8CisJCSAgICBuZGlmZnMgPiBUWF9CTE9DS19TSVpFIHx8IGtleXMgPT0gMCkKKwkJCWdvdG8gY29ycnVwdDsKKworCQkvKiBza2lwIGRpZmYgcG9zaXRpb25zICovCisJCWlmICghc2tpcCgmZGF0YSwgdHhfZGF0YS0+ZW5kcCwgbmRpZmZzKSkKKwkJCWdvdG8gY29ycnVwdDsKKworCQkvKgorCQkgKiBBZnRlciB0aGUgZGlmZnMgd2UgaGF2ZSB0aGUgZmlyc3Qga2V5IGlkICsgZGF0YSAtCisJCSAqIGdsb2JhbCBmaXhlZAorCQkgKi8KKwkJaWYgKCFza2lwKCZkYXRhLCB0eF9kYXRhLT5lbmRwLAorCQkJICAgICAgIDEgKyBUWF9CTE9DS19TSVpFIC0gbnVtX2dsb2JhbF9maXhlZCkpCisJCQlnb3RvIGNvcnJ1cHQ7CisKKwkJLyogVGhlbiB3ZSBoYXZlIGtleXMtMSBibG9ja3Mgb2Yga2V5IGlkK2RpZmZzICovCisJCWlmICghc2tpcCgmZGF0YSwgdHhfZGF0YS0+ZW5kcCwKKwkJCSAgICAgICAobmRpZmZzICsgMSkgKiAoa2V5cyAtIDEpKSkKKwkJCWdvdG8gY29ycnVwdDsKKwl9CisJcmV0ID0gMDsKKwlnb3RvIG91dDsKKworY29ycnVwdDoKKwl6aWxvZ19lcnJvcigiZmlybXdhcmUgaXMgY29ycnVwdFxuIik7CisJZndfdW5sb2FkX2xvY2tlZCgpOworCXJldCA9IC1FRkFVTFQ7CisKK291dDoKKwltdXRleF91bmxvY2soJnR4X2RhdGFfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogaW5pdGlhbGlzZSB0aGUgSVIgVFggZGV2aWNlICovCitzdGF0aWMgaW50IHR4X2luaXQoc3RydWN0IElSICppcikKK3sKKwlpbnQgcmV0OworCisJLyogTG9hZCAnZmlybXdhcmUnICovCisJcmV0ID0gZndfbG9hZChpcik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2VuZCBib290IGJsb2NrICovCisJcmV0ID0gc2VuZF9ib290X2RhdGEoaXIpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlpci0+bmVlZF9ib290ID0gMDsKKworCS8qIExvb2tzIGdvb2QgKi8KKwlyZXR1cm4gMDsKK30KKworLyogZG8gbm90aGluZyBzdHViIHRvIG1ha2UgTElSQyBoYXBweSAqLworc3RhdGljIGxvZmZfdCBsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZXAsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworCXJldHVybiAtRVNQSVBFOworfQorCisvKiBjb3BpZWQgZnJvbSBsaXJjX2RldiAqLworc3RhdGljIHNzaXplX3QgcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZXAsIGNoYXIgKm91dGJ1Ziwgc2l6ZV90IG4sIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gKHN0cnVjdCBJUiAqKWZpbGVwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciBidWZbaXItPmJ1Zi5jaHVua19zaXplXTsKKwlpbnQgcmV0ID0gMCwgd3JpdHRlbiA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlkcHJpbnRrKCJyZWFkIGNhbGxlZFxuIik7CisJaWYgKGlyLT5jX3J4LmFkZHIgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpci0+YnVmX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKG4gJSBpci0+YnVmLmNodW5rX3NpemUpIHsKKwkJZHByaW50aygicmVhZCByZXN1bHQgPSAtRUlOVkFMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZpci0+YnVmX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHdlIGFkZCBvdXJzZWx2ZXMgdG8gdGhlIHRhc2sgcXVldWUgYmVmb3JlIGJ1ZmZlciBjaGVjaworCSAqIHRvIGF2b2lkIGxvc2luZyBzY2FuIGNvZGUgKGluIGNhc2Ugd2hlbiBxdWV1ZSBpcyBhd2FrZW4gc29tZXdoZXJlCisJICogYmV0d2VlbiB3aGlsZSBjb25kaXRpb24gY2hlY2tpbmcgYW5kIHNjaGVkdWxpbmcpCisJICovCisJYWRkX3dhaXRfcXVldWUoJmlyLT5idWYud2FpdF9wb2xsLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCS8qCisJICogd2hpbGUgd2UgZGlkbid0IHByb3ZpZGUgJ2xlbmd0aCcgYnl0ZXMsIGRldmljZSBpcyBvcGVuZWQgaW4gYmxvY2tpbmcKKwkgKiBtb2RlIGFuZCAnY29weV90b191c2VyJyBpcyBoYXBweSwgd2FpdCBmb3IgZGF0YS4KKwkgKi8KKwl3aGlsZSAod3JpdHRlbiA8IG4gJiYgcmV0ID09IDApIHsKKwkJaWYgKGxpcmNfYnVmZmVyX2VtcHR5KCZpci0+YnVmKSkgeworCQkJLyoKKwkJCSAqIEFjY29yZGluZyB0byB0aGUgcmVhZCgyKSBtYW4gcGFnZSwgJ3dyaXR0ZW4nIGNhbiBiZQorCQkJICogcmV0dXJuZWQgYXMgbGVzcyB0aGFuICduJywgaW5zdGVhZCBvZiBibG9ja2luZworCQkJICogYWdhaW4sIHJldHVybmluZyAtRVdPVUxEQkxPQ0ssIG9yIHJldHVybmluZworCQkJICogLUVSRVNUQVJUU1lTCisJCQkgKi8KKwkJCWlmICh3cml0dGVuKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGVwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl9IGVsc2UgeworCQkJbGlyY19idWZmZXJfcmVhZCgmaXItPmJ1ZiwgYnVmKTsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCAqKW91dGJ1Zit3cml0dGVuLCBidWYsCisJCQkJCSAgIGlyLT5idWYuY2h1bmtfc2l6ZSk7CisJCQl3cml0dGVuICs9IGlyLT5idWYuY2h1bmtfc2l6ZTsKKwkJfQorCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZpci0+YnVmLndhaXRfcG9sbCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJbXV0ZXhfdW5sb2NrKCZpci0+YnVmX2xvY2spOworCisJZHByaW50aygicmVhZCByZXN1bHQgPSAlcyAoJWQpXG4iLAorCQlyZXQgPyAiLUVGQVVMVCIgOiAiT0siLCByZXQpOworCisJcmV0dXJuIHJldCA/IHJldCA6IHdyaXR0ZW47Cit9CisKKy8qIHNlbmQgYSBrZXlwcmVzcyB0byB0aGUgSVIgVFggZGV2aWNlICovCitzdGF0aWMgaW50IHNlbmRfY29kZShzdHJ1Y3QgSVIgKmlyLCB1bnNpZ25lZCBpbnQgY29kZSwgdW5zaWduZWQgaW50IGtleSkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGFfYmxvY2tbVFhfQkxPQ0tfU0laRV07CisJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IGksIHJldDsKKworCS8qIEdldCBkYXRhIGZvciB0aGUgY29kZXNldC9rZXkgKi8KKwlyZXQgPSBnZXRfa2V5X2RhdGEoZGF0YV9ibG9jaywgY29kZSwga2V5KTsKKworCWlmIChyZXQgPT0gLUVQUk9UTykgeworCQl6aWxvZ19lcnJvcigiZmFpbGVkIHRvIGdldCBkYXRhIGZvciBjb2RlICV1LCBrZXkgJXUgLS0gY2hlY2sgIgorCQkJICAgICJsaXJjZC5jb25mIGVudHJpZXNcbiIsIGNvZGUsIGtleSk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNlbmQgdGhlIGRhdGEgYmxvY2sgKi8KKwlyZXQgPSBzZW5kX2RhdGFfYmxvY2soaXIsIGRhdGFfYmxvY2spOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNlbmQgZGF0YSBibG9jayBsZW5ndGg/ICovCisJYnVmWzBdID0gMHgwMDsKKwlidWZbMV0gPSAweDQwOworCXJldCA9IGkyY19tYXN0ZXJfc2VuZCgmaXItPmNfdHgsIGJ1ZiwgMik7CisJaWYgKHJldCAhPSAyKSB7CisJCXppbG9nX2Vycm9yKCJpMmNfbWFzdGVyX3NlbmQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVGQVVMVDsKKwl9CisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKCZpci0+Y190eCwgYnVmLCAxKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJemlsb2dfZXJyb3IoImkyY19tYXN0ZXJfc2VuZCBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUZBVUxUOworCX0KKworCS8qIFNlbmQgZmluaXNoZWQgZG93bmxvYWQ/ICovCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KCZpci0+Y190eCwgYnVmLCAxKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJemlsb2dfZXJyb3IoImkyY19tYXN0ZXJfcmVjdiBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUZBVUxUOworCX0KKwlpZiAoYnVmWzBdICE9IDB4QTApIHsKKwkJemlsb2dfZXJyb3IoInVuZXhwZWN0ZWQgSVIgVFggcmVzcG9uc2UgIzE6ICUwMnhcbiIsCisJCQlidWZbMF0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBTZW5kIHByZXBhcmUgY29tbWFuZD8gKi8KKwlidWZbMF0gPSAweDAwOworCWJ1ZlsxXSA9IDB4ODA7CisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKCZpci0+Y190eCwgYnVmLCAyKTsKKwlpZiAocmV0ICE9IDIpIHsKKwkJemlsb2dfZXJyb3IoImkyY19tYXN0ZXJfc2VuZCBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUZBVUxUOworCX0KKworI2lmZGVmIEkyQ19IV19CX0hEUFZSCisJLyoKKwkgKiBUaGUgc2xlZXAgYml0cyBhcmVuJ3QgbmVjZXNzYXJ5IG9uIHRoZSBIRCBQVlIsIGFuZCBpbiBmYWN0LCB0aGUKKwkgKiBsYXN0IGkyY19tYXN0ZXJfcmVjdiBhbHdheXMgZmFpbHMgd2l0aCBhIC01LCBzbyBmb3Igbm93LCB3ZSdyZQorCSAqIGdvaW5nIHRvIHNraXAgdGhpcyB3aG9sZSBtZXNzIGFuZCBzYXkgd2UncmUgZG9uZSBvbiB0aGUgSEQgUFZSCisJICovCisJaWYgKGlyLT5jX3J4LmFkYXB0ZXItPmlkID09IEkyQ19IV19CX0hEUFZSKQorCQlnb3RvIGRvbmU7CisjZW5kaWYKKworCS8qCisJICogVGhpcyBiaXQgTkFLcyB1bnRpbCB0aGUgZGV2aWNlIGlzIHJlYWR5LCBzbyB3ZSByZXRyeSBpdAorCSAqIHNsZWVwaW5nIGEgYml0IGVhY2ggdGltZS4gIFRoaXMgc2VlbXMgdG8gYmUgd2hhdCB0aGUgd2luZG93cworCSAqIGRyaXZlciBkb2VzLCBhcHByb3hpbWF0ZWx5LgorCSAqIFRyeSBmb3IgdXAgdG8gMXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDIwOyArK2kpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KCg1MCAqIEhaICsgOTk5KSAvIDEwMDApOworCQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoJmlyLT5jX3R4LCBidWYsIDEpOworCQlpZiAocmV0ID09IDEpCisJCQlicmVhazsKKwkJZHByaW50aygiTkFLIGV4cGVjdGVkOiBpMmNfbWFzdGVyX3NlbmQgIgorCQkJImZhaWxlZCB3aXRoICVkICh0cnkgJWQpXG4iLCByZXQsIGkrMSk7CisJfQorCWlmIChyZXQgIT0gMSkgeworCQl6aWxvZ19lcnJvcigiSVIgVFggY2hpcCBuZXZlciBnb3QgcmVhZHk6IGxhc3QgaTJjX21hc3Rlcl9zZW5kICIKKwkJCSAgICAiZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVGQVVMVDsKKwl9CisKKwkvKiBTZWVtcyB0byBiZSBhbiAnb2snIHJlc3BvbnNlICovCisJaSA9IGkyY19tYXN0ZXJfcmVjdigmaXItPmNfdHgsIGJ1ZiwgMSk7CisJaWYgKGkgIT0gMSkgeworCQl6aWxvZ19lcnJvcigiaTJjX21hc3Rlcl9yZWN2IGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGJ1ZlswXSAhPSAweDgwKSB7CisJCXppbG9nX2Vycm9yKCJ1bmV4cGVjdGVkIElSIFRYIHJlc3BvbnNlICMyOiAlMDJ4XG4iLCBidWZbMF0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKK2RvbmU6CisJLyogT2ggZ29vZCwgaXQgd29ya2VkICovCisJZHByaW50aygic2VudCBjb2RlICV1LCBrZXkgJXVcbiIsIGNvZGUsIGtleSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhIGNvZGUgdG8gdGhlIGRldmljZS4gIFdlIHRha2UgaW4gYSAzMi1iaXQgbnVtYmVyIChhbiBpbnQpIGFuZCB0aGVuCisgKiBkZWNvZGUgdGhpcyB0byBhIGNvZGVzZXQva2V5IGluZGV4LiAgVGhlIGtleSBkYXRhIGlzIHRoZW4gZGVjb21wcmVzc2VkIGFuZAorICogc2VudCB0byB0aGUgZGV2aWNlLiAgV2UgaGF2ZSBhIHNwaW4gbG9jayBhcyBwZXIgaTJjIGRvY3VtZW50YXRpb24gdG8gcHJldmVudAorICogbXVsdGlwbGUgY29uY3VycmVudCBzZW5kcyB3aGljaCB3b3VsZCBwcm9iYWJseSBjYXVzZSB0aGUgZGV2aWNlIHRvIGV4cGxvZGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlKHN0cnVjdCBmaWxlICpmaWxlcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbiwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBJUiAqaXIgPSAoc3RydWN0IElSICopZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlzaXplX3QgaTsKKwlpbnQgZmFpbHVyZXMgPSAwOworCisJaWYgKGlyLT5jX3R4LmFkZHIgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBWYWxpZGF0ZSB1c2VyIHBhcmFtZXRlcnMgKi8KKwlpZiAobiAlIHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIExvY2sgaTJjIGJ1cyBmb3IgdGhlIGR1cmF0aW9uICovCisJbXV0ZXhfbG9jaygmaXItPmlyX2xvY2spOworCisJLyogU2VuZCBlYWNoIGtleXByZXNzICovCisJZm9yIChpID0gMDsgaSA8IG47KSB7CisJCWludCByZXQgPSAwOworCQlpbnQgY29tbWFuZDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbW1hbmQsIGJ1ZiArIGksIHNpemVvZihjb21tYW5kKSkpIHsKKwkJCW11dGV4X3VubG9jaygmaXItPmlyX2xvY2spOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBTZW5kIGJvb3QgZGF0YSBmaXJzdCBpZiByZXF1aXJlZCAqLworCQlpZiAoaXItPm5lZWRfYm9vdCA9PSAxKSB7CisJCQlyZXQgPSBzZW5kX2Jvb3RfZGF0YShpcik7CisJCQlpZiAocmV0ID09IDApCisJCQkJaXItPm5lZWRfYm9vdCA9IDA7CisJCX0KKworCQkvKiBTZW5kIHRoZSBjb2RlICovCisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gc2VuZF9jb2RlKGlyLCAodW5zaWduZWQpY29tbWFuZCA+PiAxNiwKKwkJCQkJICAgICh1bnNpZ25lZCljb21tYW5kICYgMHhGRkZGKTsKKwkJCWlmIChyZXQgPT0gLUVQUk9UTykgeworCQkJCW11dGV4X3VubG9jaygmaXItPmlyX2xvY2spOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBIbW0sIGEgZmFpbHVyZS4gIElmIHdlJ3ZlIGhhZCBhIGZldyB0aGVuIGdpdmUgdXAsIG90aGVyd2lzZQorCQkgKiB0cnkgYSByZXNldAorCQkgKi8KKwkJaWYgKHJldCAhPSAwKSB7CisJCQkvKiBMb29rcyBsaWtlIHRoZSBjaGlwIGNyYXNoZWQsIHJlc2V0IGl0ICovCisJCQl6aWxvZ19lcnJvcigic2VuZGluZyB0byB0aGUgSVIgdHJhbnNtaXR0ZXIgY2hpcCAiCisJCQkJICAgICJmYWlsZWQsIHRyeWluZyByZXNldFxuIik7CisKKwkJCWlmIChmYWlsdXJlcyA+PSAzKSB7CisJCQkJemlsb2dfZXJyb3IoInVuYWJsZSB0byBzZW5kIHRvIHRoZSBJUiBjaGlwICIKKwkJCQkJICAgICJhZnRlciAzIHJlc2V0cywgZ2l2aW5nIHVwXG4iKTsKKwkJCQltdXRleF91bmxvY2soJmlyLT5pcl9sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgoMTAwICogSFogKyA5OTkpIC8gMTAwMCk7CisJCQlpci0+bmVlZF9ib290ID0gMTsKKwkJCSsrZmFpbHVyZXM7CisJCX0gZWxzZQorCQkJaSArPSBzaXplb2YoaW50KTsKKwl9CisKKwkvKiBSZWxlYXNlIGkyYyBidXMgKi8KKwltdXRleF91bmxvY2soJmlyLT5pcl9sb2NrKTsKKworCS8qIEFsbCBsb29rcyBnb29kICovCisJcmV0dXJuIG47Cit9CisKKy8qIGNvcGllZCBmcm9tIGxpcmNfZGV2ICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvbGwoc3RydWN0IGZpbGUgKmZpbGVwLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBJUiAqaXIgPSAoc3RydWN0IElSICopZmlsZXAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJZHByaW50aygicG9sbCBjYWxsZWRcbiIpOworCWlmIChpci0+Y19yeC5hZGRyID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmaXItPmJ1Zl9sb2NrKTsKKworCXBvbGxfd2FpdChmaWxlcCwgJmlyLT5idWYud2FpdF9wb2xsLCB3YWl0KTsKKworCWRwcmludGsoInBvbGwgcmVzdWx0ID0gJXNcbiIsCisJCWxpcmNfYnVmZmVyX2VtcHR5KCZpci0+YnVmKSA/ICIwIiA6ICJQT0xMSU58UE9MTFJETk9STSIpOworCisJcmV0ID0gbGlyY19idWZmZXJfZW1wdHkoJmlyLT5idWYpID8gMCA6IChQT0xMSU58UE9MTFJETk9STSk7CisKKwltdXRleF91bmxvY2soJmlyLT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gKHN0cnVjdCBJUiAqKWZpbGVwLT5wcml2YXRlX2RhdGE7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG1vZGUsIGZlYXR1cmVzID0gMDsKKworCWlmIChpci0+Y19yeC5hZGRyICE9IDApCisJCWZlYXR1cmVzIHw9IExJUkNfQ0FOX1JFQ19MSVJDQ09ERTsKKwlpZiAoaXItPmNfdHguYWRkciAhPSAwKQorCQlmZWF0dXJlcyB8PSBMSVJDX0NBTl9TRU5EX1BVTFNFOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIExJUkNfR0VUX0xFTkdUSDoKKwkJcmVzdWx0ID0gcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpMTMsCisJCQkJICAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgTElSQ19HRVRfRkVBVFVSRVM6CisJCXJlc3VsdCA9IHB1dF91c2VyKGZlYXR1cmVzLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIExJUkNfR0VUX1JFQ19NT0RFOgorCQlpZiAoIShmZWF0dXJlcyZMSVJDX0NBTl9SRUNfTUFTSykpCisJCQlyZXR1cm4gLUVOT1NZUzsKKworCQlyZXN1bHQgPSBwdXRfdXNlcihMSVJDX1JFQzJNT0RFCisJCQkJICAoZmVhdHVyZXMmTElSQ19DQU5fUkVDX01BU0spLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCQlicmVhazsKKwljYXNlIExJUkNfU0VUX1JFQ19NT0RFOgorCQlpZiAoIShmZWF0dXJlcyZMSVJDX0NBTl9SRUNfTUFTSykpCisJCQlyZXR1cm4gLUVOT1NZUzsKKworCQlyZXN1bHQgPSBnZXRfdXNlcihtb2RlLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJCWlmICghcmVzdWx0ICYmICEoTElSQ19NT0RFMlJFQyhtb2RlKSAmIGZlYXR1cmVzKSkKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgTElSQ19HRVRfU0VORF9NT0RFOgorCQlpZiAoIShmZWF0dXJlcyZMSVJDX0NBTl9TRU5EX01BU0spKQorCQkJcmV0dXJuIC1FTk9TWVM7CisKKwkJcmVzdWx0ID0gcHV0X3VzZXIoTElSQ19NT0RFX1BVTFNFLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIExJUkNfU0VUX1NFTkRfTU9ERToKKwkJaWYgKCEoZmVhdHVyZXMmTElSQ19DQU5fU0VORF9NQVNLKSkKKwkJCXJldHVybiAtRU5PU1lTOworCisJCXJlc3VsdCA9IGdldF91c2VyKG1vZGUsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCWlmICghcmVzdWx0ICYmIG1vZGUgIT0gTElSQ19NT0RFX1BVTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogT3BlbiB0aGUgSVIgZGV2aWNlLiAgR2V0IGhvbGQgb2Ygb3VyIElSIHN0cnVjdHVyZSBhbmQKKyAqIHN0YXNoIGl0IGluIHByaXZhdGVfZGF0YSBmb3IgdGhlIGZpbGUKKyAqLworc3RhdGljIGludCBvcGVuKHN0cnVjdCBpbm9kZSAqbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCXN0cnVjdCBJUiAqaXI7CisJaW50IHJldDsKKworCS8qIGZpbmQgb3VyIElSIHN0cnVjdCAqLworCXVuc2lnbmVkIG1pbm9yID0gTUlOT1Iobm9kZS0+aV9yZGV2KTsKKwlpZiAobWlub3IgPj0gTUFYX0lSQ1RMX0RFVklDRVMpIHsKKwkJZHByaW50aygibWlub3IgJWQ6IG9wZW4gcmVzdWx0ID0gLUVOT0RFVlxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlyID0gaXJfZGV2aWNlc1ttaW5vcl07CisKKwkvKiBpbmNyZW1lbnQgaW4gdXNlIGNvdW50ICovCisJbXV0ZXhfbG9jaygmaXItPmlyX2xvY2spOworCSsraXItPm9wZW47CisJcmV0ID0gc2V0X3VzZV9pbmMoaXIpOworCWlmIChyZXQgIT0gMCkgeworCQktLWlyLT5vcGVuOworCQltdXRleF91bmxvY2soJmlyLT5pcl9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpci0+aXJfbG9jayk7CisKKwkvKiBzdGFzaCBvdXIgSVIgc3RydWN0ICovCisJZmlsZXAtPnByaXZhdGVfZGF0YSA9IGlyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENsb3NlIHRoZSBJUiBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgY2xvc2Uoc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJLyogZmluZCBvdXIgSVIgc3RydWN0ICovCisJc3RydWN0IElSICppciA9IChzdHJ1Y3QgSVIgKilmaWxlcC0+cHJpdmF0ZV9kYXRhOworCWlmIChpciA9PSBOVUxMKSB7CisJCXppbG9nX2Vycm9yKCJjbG9zZTogbm8gcHJpdmF0ZV9kYXRhIGF0dGFjaGVkIHRvIHRoZSBmaWxlIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGRlY3JlbWVudCBpbiB1c2UgY291bnQgKi8KKwltdXRleF9sb2NrKCZpci0+aXJfbG9jayk7CisJLS1pci0+b3BlbjsKKwlzZXRfdXNlX2RlYyhpcik7CisJbXV0ZXhfdW5sb2NrKCZpci0+aXJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsaXJjX2RyaXZlciBsaXJjX3RlbXBsYXRlID0geworCS5uYW1lCQk9ICJsaXJjX3ppbG9nIiwKKwkuc2V0X3VzZV9pbmMJPSBzZXRfdXNlX2luYywKKwkuc2V0X3VzZV9kZWMJPSBzZXRfdXNlX2RlYywKKwkub3duZXIJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgaXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBpcl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOworc3RhdGljIGludCBpcl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpcl90cmFuc2NlaXZlcl9pZFtdID0geworCS8qIEdlbmVyaWMgZW50cnkgZm9yIGFueSBJUiB0cmFuc2NlaXZlciAqLworCXsgImlyX3ZpZGVvIiwgMCB9LAorCS8qIElSIGRldmljZSBzcGVjaWZpYyBlbnRyaWVzIHNob3VsZCBiZSBhZGRlZCBoZXJlICovCisJeyAiaXJfdHhfejhmMDgxMV9oYXVwIiwgMCB9LAorCXsgImlyX3J4X3o4ZjA4MTFfaGF1cCIsIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gIlppbG9nL0hhdXBwYXVnZSBpMmMgSVIiLAorCX0sCisJLnByb2JlCQk9IGlyX3Byb2JlLAorCS5yZW1vdmUJCT0gaXJfcmVtb3ZlLAorCS5jb21tYW5kCT0gaXJfY29tbWFuZCwKKwkuaWRfdGFibGUJPSBpcl90cmFuc2NlaXZlcl9pZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpcmNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBsc2VlaywKKwkucmVhZAkJPSByZWFkLAorCS53cml0ZQkJPSB3cml0ZSwKKwkucG9sbAkJPSBwb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IGlvY3RsLAorCS5vcGVuCQk9IG9wZW4sCisJLnJlbGVhc2UJPSBjbG9zZQorfTsKKworc3RhdGljIGludCBpcl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltdXRleF9sb2NrKCZpci0+aXJfbG9jayk7CisKKwlpZiAoaXItPmhhdmVfcnggfHwgaXItPmhhdmVfdHgpIHsKKwkJREVDTEFSRV9DT01QTEVUSU9OKHRuKTsKKwkJREVDTEFSRV9DT01QTEVUSU9OKHRuMik7CisKKwkJLyogZW5kIHVwIHBvbGxpbmcgdGhyZWFkICovCisJCWlmIChpci0+dGFzayAmJiAhSVNfRVJSKGlyLT50YXNrKSkgeworCQkJaXItPnRfbm90aWZ5ID0gJnRuOworCQkJaXItPnRfbm90aWZ5MiA9ICZ0bjI7CisJCQlpci0+c2h1dGRvd24gPSAxOworCQkJd2FrZV91cF9wcm9jZXNzKGlyLT50YXNrKTsKKwkJCWNvbXBsZXRlKCZ0bjIpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmdG4pOworCQkJaXItPnRfbm90aWZ5ID0gTlVMTDsKKwkJCWlyLT50X25vdGlmeTIgPSBOVUxMOworCQl9CisKKwl9IGVsc2UgeworCQltdXRleF91bmxvY2soJmlyLT5pcl9sb2NrKTsKKwkJemlsb2dfZXJyb3IoIiVzOiBkZXRhY2hlZCBmcm9tIHNvbWV0aGluZyB3ZSBkaWRuJ3QgIgorCQkJICAgICJhdHRhY2ggdG9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogdW5yZWdpc3RlciBsaXJjIGRyaXZlciAqLworCWlmIChpci0+bC5taW5vciA+PSAwICYmIGlyLT5sLm1pbm9yIDwgTUFYX0lSQ1RMX0RFVklDRVMpIHsKKwkJbGlyY191bnJlZ2lzdGVyX2RyaXZlcihpci0+bC5taW5vcik7CisJCWlyX2RldmljZXNbaXItPmwubWlub3JdID0gTlVMTDsKKwl9CisKKwkvKiBmcmVlIG1lbW9yeSAqLworCWxpcmNfYnVmZmVyX2ZyZWUoJmlyLT5idWYpOworCW11dGV4X3VubG9jaygmaXItPmlyX2xvY2spOworCWtmcmVlKGlyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgSVIgKmlyID0gTlVMTDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSBjbGllbnQtPmFkYXB0ZXI7CisJY2hhciBidWY7CisJaW50IHJldDsKKwlpbnQgaGF2ZV9yeCA9IDAsIGhhdmVfdHggPSAwOworCisJZHByaW50aygiJXM6IGFkYXB0ZXIgaWQ9MHgleCwgY2xpZW50IGFkZHI9MHglMDJ4XG4iLAorCQlfX2Z1bmNfXywgYWRhcC0+aWQsIGNsaWVudC0+YWRkcik7CisKKwkvKgorCSAqIFRoZSBleHRlcm5hbCBJUiByZWNlaXZlciBpcyBhdCBpMmMgYWRkcmVzcyAweDcxLgorCSAqIFRoZSBJUiB0cmFuc21pdHRlciBpcyBhdCAweDcwLgorCSAqLworCWNsaWVudC0+YWRkciA9IDB4NzA7CisKKwlpZiAoIWRpc2FibGVfdHgpIHsKKwkJaWYgKGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZidWYsIDEpID09IDEpCisJCQloYXZlX3R4ID0gMTsKKwkJZHByaW50aygicHJvYmUgMHg3MCBAICVzOiAlc1xuIiwKKwkJCWFkYXAtPm5hbWUsIGhhdmVfdHggPyAic3VjY2VzcyIgOiAiZmFpbGVkIik7CisJfQorCisJaWYgKCFkaXNhYmxlX3J4KSB7CisJCWNsaWVudC0+YWRkciA9IDB4NzE7CisJCWlmIChpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCAmYnVmLCAxKSA9PSAxKQorCQkJaGF2ZV9yeCA9IDE7CisJCWRwcmludGsoInByb2JlIDB4NzEgQCAlczogJXNcbiIsCisJCQlhZGFwLT5uYW1lLCBoYXZlX3J4ID8gInN1Y2Nlc3MiIDogImZhaWxlZCIpOworCX0KKworCWlmICghKGhhdmVfcnggfHwgaGF2ZV90eCkpIHsKKwkJemlsb2dfZXJyb3IoIiVzOiBubyBkZXZpY2VzIGZvdW5kXG4iLCBhZGFwLT5uYW1lKTsKKwkJZ290byBvdXRfbm9kZXY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAibGlyY196aWxvZzogY2hpcCBmb3VuZCB3aXRoICVzXG4iLAorCQloYXZlX3J4ICYmIGhhdmVfdHggPyAiUlggYW5kIFRYIiA6CisJCQloYXZlX3J4ID8gIlJYIG9ubHkiIDogIlRYIG9ubHkiKTsKKworCWlyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IElSKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWlyKQorCQlnb3RvIG91dF9ub21lbTsKKworCXJldCA9IGxpcmNfYnVmZmVyX2luaXQoJmlyLT5idWYsIDIsIEJVRkxFTiAvIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X25vbWVtOworCisJbXV0ZXhfaW5pdCgmaXItPmlyX2xvY2spOworCW11dGV4X2luaXQoJmlyLT5idWZfbG9jayk7CisJaXItPm5lZWRfYm9vdCA9IDE7CisKKwltZW1jcHkoJmlyLT5sLCAmbGlyY190ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBsaXJjX2RyaXZlcikpOworCWlyLT5sLm1pbm9yID0gLTE7CisKKwkvKiBJMkMgYXR0YWNoIHRvIGRldmljZSAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGlyKTsKKworCS8qIGluaXRpYWxpc2UgUlggZGV2aWNlICovCisJaWYgKGhhdmVfcngpIHsKKwkJREVDTEFSRV9DT01QTEVUSU9OKHRuKTsKKwkJbWVtY3B5KCZpci0+Y19yeCwgY2xpZW50LCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKworCQlpci0+Y19yeC5hZGRyID0gMHg3MTsKKwkJc3RybGNweShpci0+Y19yeC5uYW1lLCBaSUxPR19IQVVQUEFVR0VfSVJfUlhfTkFNRSwKKwkJCUkyQ19OQU1FX1NJWkUpOworCisJCS8qIHRyeSB0byBmaXJlIHVwIHBvbGxpbmcgdGhyZWFkICovCisJCWlyLT50X25vdGlmeSA9ICZ0bjsKKwkJaXItPnRhc2sgPSBrdGhyZWFkX3J1bihsaXJjX3RocmVhZCwgaXIsICJsaXJjX3ppbG9nIik7CisJCWlmIChJU19FUlIoaXItPnRhc2spKSB7CisJCQlyZXQgPSBQVFJfRVJSKGlyLT50YXNrKTsKKwkJCXppbG9nX2Vycm9yKCJsaXJjX3JlZ2lzdGVyX2RyaXZlcjogY2Fubm90IHJ1biAiCisJCQkJICAgICJwb2xsIHRocmVhZCAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRuKTsKKwkJaXItPnRfbm90aWZ5ID0gTlVMTDsKKwkJaXItPmhhdmVfcnggPSAxOworCX0KKworCS8qIGluaXRpYWxpc2UgVFggZGV2aWNlICovCisJaWYgKGhhdmVfdHgpIHsKKwkJbWVtY3B5KCZpci0+Y190eCwgY2xpZW50LCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKKwkJaXItPmNfdHguYWRkciA9IDB4NzA7CisJCXN0cmxjcHkoaXItPmNfdHgubmFtZSwgWklMT0dfSEFVUFBBVUdFX0lSX1RYX05BTUUsCisJCQlJMkNfTkFNRV9TSVpFKTsKKwkJaXItPmhhdmVfdHggPSAxOworCX0KKworCS8qIHNldCBsaXJjX2RldiBzdHVmZiAqLworCWlyLT5sLmNvZGVfbGVuZ3RoID0gMTM7CisJaXItPmwucmJ1ZgkgID0gJmlyLT5idWY7CisJaXItPmwuZm9wcwkgID0gJmxpcmNfZm9wczsKKwlpci0+bC5kYXRhCSAgPSBpcjsKKwlpci0+bC5taW5vciAgICAgICA9IG1pbm9yOworCWlyLT5sLmRldiAgICAgICAgID0gJmFkYXAtPmRldjsKKwlpci0+bC5zYW1wbGVfcmF0ZSA9IDA7CisKKwkvKiByZWdpc3RlciB3aXRoIGxpcmMgKi8KKwlpci0+bC5taW5vciA9IGxpcmNfcmVnaXN0ZXJfZHJpdmVyKCZpci0+bCk7CisJaWYgKGlyLT5sLm1pbm9yIDwgMCB8fCBpci0+bC5taW5vciA+PSBNQVhfSVJDVExfREVWSUNFUykgeworCQl6aWxvZ19lcnJvcigiaXJfYXR0YWNoOiBcIm1pbm9yXCIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkICIKKwkJCSAgICAiKCVkKSFcbiIsIE1BWF9JUkNUTF9ERVZJQ0VTLTEsIGlyLT5sLm1pbm9yKTsKKwkJcmV0ID0gLUVCQURSUUM7CisJCWdvdG8gZXJyOworCX0KKworCS8qIHN0b3JlIHRoaXMgZm9yIGdldHRpbmcgYmFjayBpbiBvcGVuKCkgbGF0ZXIgb24gKi8KKwlpcl9kZXZpY2VzW2lyLT5sLm1pbm9yXSA9IGlyOworCisJLyoKKwkgKiBpZiB3ZSBoYXZlIHRoZSB0eCBkZXZpY2UsIGxvYWQgdGhlICdmaXJtd2FyZScuICBXZSBkbyB0aGlzCisJICogYWZ0ZXIgcmVnaXN0ZXJpbmcgd2l0aCBsaXJjIGFzIG90aGVyd2lzZSBob3RwbHVnIHNlZW1zIHRvIHRha2UKKwkgKiAxMHMgdG8gY3JlYXRlIHRoZSBsaXJjIGRldmljZS4KKwkgKi8KKwlpZiAoaGF2ZV90eCkgeworCQkvKiBTcGVjaWFsIFRYIGluaXQgKi8KKwkJcmV0ID0gdHhfaW5pdChpcik7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJLyogdW5kbyBldmVyeXRoaW5nLCBob3BlZnVsbHkuLi4gKi8KKwlpZiAoaXItPmNfcnguYWRkcikKKwkJaXJfcmVtb3ZlKCZpci0+Y19yeCk7CisJaWYgKGlyLT5jX3R4LmFkZHIpCisJCWlyX3JlbW92ZSgmaXItPmNfdHgpOworCXJldHVybiByZXQ7CisKK291dF9ub2RldjoKKwl6aWxvZ19lcnJvcigibm8gZGV2aWNlIGZvdW5kXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworb3V0X25vbWVtOgorCXppbG9nX2Vycm9yKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwlrZnJlZShpcik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgaXJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJLyogbm90aGluZyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB6aWxvZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXppbG9nX25vdGlmeSgiWmlsb2cvSGF1cHBhdWdlIElSIGRyaXZlciBpbml0aWFsaXppbmdcbiIpOworCisJbXV0ZXhfaW5pdCgmdHhfZGF0YV9sb2NrKTsKKworCXJlcXVlc3RfbW9kdWxlKCJmaXJtd2FyZV9jbGFzcyIpOworCisJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7CisJaWYgKHJldCkKKwkJemlsb2dfZXJyb3IoImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJZWxzZQorCQl6aWxvZ19ub3RpZnkoImluaXRpYWxpemF0aW9uIGNvbXBsZXRlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6aWxvZ19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7CisJLyogaWYgbG9hZGVkICovCisJZndfdW5sb2FkKCk7CisJemlsb2dfbm90aWZ5KCJaaWxvZy9IYXVwcGF1Z2UgSVIgZHJpdmVyIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoemlsb2dfaW5pdCk7Cittb2R1bGVfZXhpdCh6aWxvZ19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJaaWxvZy9IYXVwcGF1Z2UgaW5mcmFyZWQgdHJhbnNtaXR0ZXIgZHJpdmVyIChpMmMgc3RhY2spIik7CitNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyLCBNaWNoYWwgS29jaGFub3dpY3osIENocmlzdG9waCBCYXJ0ZWxtdXMsICIKKwkgICAgICAiVWxyaWNoIE11ZWxsZXIsIFN0ZWZhbiBKYWhuLCBKZXJvbWUgQnJvY2ssIE1hcmsgV2VhdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisvKiBmb3IgY29tcGF0IHdpdGggb2xkIG5hbWUsIHdoaWNoIGlzbid0IGFsbCB0aGF0IGFjY3VyYXRlIGFueW1vcmUgKi8KK01PRFVMRV9BTElBUygibGlyY19wdnIxNTAiKTsKKworbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtaW5vciwgIlByZWZlcnJlZCBtaW5vciBkZXZpY2UgbnVtYmVyIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyIpOworCittb2R1bGVfcGFyYW0oZGlzYWJsZV9yeCwgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfcngsICJEaXNhYmxlIHRoZSBJUiByZWNlaXZlciBkZXZpY2UiKTsKKworbW9kdWxlX3BhcmFtKGRpc2FibGVfdHgsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX3R4LCAiRGlzYWJsZSB0aGUgSVIgdHJhbnNtaXR0ZXIgZGV2aWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL1RPRE8KaW5kZXggMDA4NzQ0Ny4uNDM1ZTA5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lbXJhci9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvVE9ETwpAQCAtMSw3ICsxLDcgQEAKIFJBUiBIYW5kbGVyIChtZW1yYXIpIERyaXZlciBUT0RPIEl0ZW1zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1NYWludGFpbmVyOiBPc3NhbWEgT3RobWFuIDxvc3NhbWEub3RobWFuQGludGVsLmNvbT4KK01haW50YWluZXI6IEV1Z2VuZSBFcHNodGV5biA8ZXVnZW5lLmVwc2h0ZXluQGludGVsLmNvbT4KIAogbWVtcmFyLmgKIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci1hYmkgYi9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci1hYmkKaW5kZXggOThhNmJiMS4uYzIzZmM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lbXJhci9tZW1yYXItYWJpCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLWFiaQpAQCAtMSw3ICsxLDcgQEAKIFdoYXQ6CQkvZGV2L21lbXJhcgogRGF0ZToJCU1hcmNoIDIwMTAKLUtlcm5lbFZlcnNpb246CUtlcm5lbCB2ZXJzaW9uIHRoaXMgZmVhdHVyZSBmaXJzdCBzaG93ZWQgdXAgaW4uCi1Db250YWN0OglPc3NhbWEgT3RobWFuIDxvc3NhbWEub3RobWFuQGludGVsLmNvbT4KK0tlcm5lbFZlcnNpb246CTIuNi4zNAorQ29udGFjdDoJRXVnZW5lIEVwc2h0ZXluIDxldWdlbmUuZXBzaHRleW5AaW50ZWwuY29tPgogRGVzY3JpcHRpb246CVRoZSBJbnRlbCBNb29yZXN0b3duIFJlc3RyaWN0ZWQgQWNjZXNzIFJlZ2lvbiAoUkFSKQogCQlIYW5kbGVyIGRyaXZlciBleHBvc2VzIGFuIGlvY3RsKCkgYmFzZWQgaW50ZXJmYWNlIHRoYXQKIAkJYWxsb3dzIGEgdXNlciB0byByZXNlcnZlIGFuZCByZWxlYXNlIGJsb2NrcyBvZiBSQVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyX2hhbmRsZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyX2hhbmRsZXIuYwppbmRleCBlZmE3ZmQ2Li5hOThiM2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhcl9oYW5kbGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lbXJhci9tZW1yYXJfaGFuZGxlci5jCkBAIC00Nyw4ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSAiLi4vcmFyX3JlZ2lzdGVyL3Jhcl9yZWdpc3Rlci5oIgorI2luY2x1ZGUgPGxpbnV4L3Jhcl9yZWdpc3Rlci5oPgogCiAjaW5jbHVkZSAibWVtcmFyLmgiCiAjaW5jbHVkZSAibWVtcmFyX2FsbG9jYXRvci5oIgpAQCAtMjc5LDE5ICsyNzgsMTAgQEAKIAlCVUdfT04oIW1lbXJhcl9pc192YWxpZF9yYXJfdHlwZShyYXJudW0pKTsKIAlCVUdfT04ocmFyLT5hbGxvY2F0ZWQpOwogCi0JbXV0ZXhfaW5pdCgmcmFyLT5sb2NrKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgcHJvY2VzcyB0YWJsZSBiZWZvcmUgd2UgcmVhY2ggYW55Ci0JICogY29kZSB0aGF0IGV4aXQgb24gZmFpbHVyZSBzaW5jZSB0aGUgZmluYWxpemF0aW9uCi0JICogY29kZSByZXF1aXJlcyBhbiBpbml0aWFsaXplZCBsaXN0LgotCSAqLwotCUlOSVRfTElTVF9IRUFEKCZyYXItPmJ1ZmZlcnMubGlzdCk7Ci0KIAlpZiAocmFyX2dldF9hZGRyZXNzKHJhcm51bSwgJmxvdywgJmhpZ2gpICE9IDApCiAJCS8qIE5vIFJBUiBpcyBhdmFpbGFibGUuICovCiAJCXJldHVybiAtRU5PREVWOwotCQorCiAJaWYgKGxvdyA9PSAwIHx8IGhpZ2ggPT0gMCkgewogCQlyYXItPmJhc2UgICAgICA9IDA7CiAJCXJhci0+bGVuZ3RoICAgID0gMDsKQEAgLTMxMSw3ICszMDEsOCBAQAogCS8qIENsYWltIFJBUiBtZW1vcnkgYXMgb3VyIG93bi4gKi8KIAlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGxvdywgcmFyLT5sZW5ndGgsIGRldm5hbWUpID09IE5VTEwpIHsKIAkJcmFyLT5sZW5ndGggPSAwOwotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gY2xhaW0gUkFSWyVkXSBtZW1vcnkuXG4iLCBkZXZuYW1lLCByYXJudW0pOworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gY2xhaW0gUkFSWyVkXSBtZW1vcnkuXG4iLAorCQkgICAgICAgZGV2bmFtZSwgcmFybnVtKTsKIAkJcHJfZXJyKCIlczogUkFSWyVkXSBkaXNhYmxlZC5cbiIsIGRldm5hbWUsIHJhcm51bSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMzQ3LDcgKzMzOCw3IEBACiAJfQogCiAJcHJfaW5mbygiJXM6IEJSQVJbJWRdIGJ1cyBhZGRyZXNzIHJhbmdlID0gWzB4JWx4LCAweCVseF1cbiIsCi0JCQlkZXZuYW1lLCByYXJudW0sICh1bnNpZ25lZCBsb25nKSBsb3csICh1bnNpZ25lZCBsb25nKSBoaWdoKTsKKwkJZGV2bmFtZSwgcmFybnVtLCAodW5zaWduZWQgbG9uZykgbG93LCAodW5zaWduZWQgbG9uZykgaGlnaCk7CiAKIAlwcl9pbmZvKCIlczogQlJBUlslZF0gc2l6ZSA9ICV6dSBLaUJcbiIsCiAJCQlkZXZuYW1lLCByYXJudW0sIHJhci0+YWxsb2NhdG9yLT5jYXBhY2l0eSAvIDEwMjQpOwpAQCAtNTMxLDcgKzUyMiw3IEBACiB7CiAJc3RydWN0IG1lbXJhcl9hbGxvY2F0b3IgKmFsbG9jYXRvcjsKIAotIAlpZiAoIW1lbXJhcl9pc192YWxpZF9yYXJfdHlwZShyLT50eXBlKSkKKwlpZiAoIW1lbXJhcl9pc192YWxpZF9yYXJfdHlwZShyLT50eXBlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIW1lbXJhcnNbci0+dHlwZV0uYWxsb2NhdGVkKQpAQCAtOTQwLDkgKzkzMSwyOCBAQAogc3RhdGljIGludCBfX2luaXQgbWVtcmFyX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOworCWludCBpOwogCiAJcHJpbnRrKGJhbm5lcik7CiAKKwkvKgorCSAqIFNvbWUgZGVsYXllZCBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgaW4gdGhpcyBkcml2ZXIuCisJICogTWFrZSBzdXJlIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGR1cmluZyBkcml2ZXIgY2xlYW4tdXAKKwkgKiAoZS5nLiBkdXJpbmcgZHJpdmVyJ3MgcmVsZWFzZSgpIGZ1bmN0aW9uKSBhcmUgZnVsbHkKKwkgKiBpbml0aWFsaXplZCBiZWZvcmUgZmlyc3QgdXNlLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKKwkgKiBpbXBvcnRhbnQgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGRlbGF5ZWQgaW5pdGlhbGl6YXRpb24KKwkgKiBpc24ndCBjb21wbGV0ZWQsIGxlYXZpbmcgYmVoaW5kIGEgcGFydGlhbGx5IGluaXRpYWxpemVkCisJICogZHJpdmVyLgorCSAqCisJICogU3VjaCBhIHNjZW5hcmlvIGNhbiBvY2N1ciB3aGVuIFJBUiBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZQorCSAqIHBsYXRmb3JtLCBhbmQgdGhlIGRyaXZlciBpcyByZWxlYXNlKClkLgorCSAqLworCWZvciAoaSA9IDA7IGkgIT0gQVJSQVlfU0laRShtZW1yYXJzKTsgKytpKSB7CisJCXN0cnVjdCBtZW1yYXJfcmFyX2luZm8gKiBjb25zdCByYXIgPSAmbWVtcmFyc1tpXTsKKwkJbXV0ZXhfaW5pdCgmcmFyLT5sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnJhci0+YnVmZmVycy5saXN0KTsKKwl9CisKIAllcnIgPSBtaXNjX3JlZ2lzdGVyKCZtZW1yYXJfbWlzY2Rldik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tc20vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vS2NvbmZpZwppbmRleCBjNTcwMzlmLi5jNTMwOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbXNtL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL21zbS9LY29uZmlnCkBAIC00NiwyMSArNDYsMTEgQEAKIAlzZWxlY3QgRkJfTVNNX0xDRENfUEFORUwKIAlkZWZhdWx0IG4KIAotY29uZmlnIEZCX01TTV9MQ0RDX1NUMV9XWEdBCi0JYm9vbAotCXNlbGVjdCBGQl9NU01fTENEQ19QQU5FTAotCWRlZmF1bHQgbgotCiBjb25maWcgRkJfTVNNX0xDRENfU1QxNV9XWEdBCiAgICAgICAgIGJvb2wKICAgICAgICAgc2VsZWN0IEZCX01TTV9MQ0RDX1BBTkVMCiAgICAgICAgIGRlZmF1bHQgbgogCi1jb25maWcgRkJfTVNNX0xDRENfV1hHQQotCWJvb2wKLQlzZWxlY3QgRkJfTVNNX0xDRENfUEFORUwKLQlkZWZhdWx0IG4KLQogY2hvaWNlCiAJcHJvbXB0ICJMQ0QgUGFuZWwiCiAJZGVmYXVsdCBGQl9NU01fTENEQ19TVDE1X1BBTkVMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21zbS9NYWtlZmlsZQppbmRleCA5OGEwY2UxLi5iYjM2MDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbXNtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vTWFrZWZpbGUKQEAgLTYxLDE0ICs2MSwxMiBAQAogb2JqLXkgKz0gbWRkaV90b3NoaWJhLm8KIG9iai15ICs9IG1kZGlfdG9zaGliYV92Z2Eubwogb2JqLXkgKz0gbWRkaV90b3NoaWJhX3d2Z2FfcHQubwotb2JqLXkgKz0gbWRkaV90b3NoaWJhX3d2Z2Eubwogb2JqLXkgKz0gbWRkaV9zaGFycC5vCiBlbHNlCiBvYmotJChDT05GSUdfRkJfTVNNX01ERElfUFJJU01fV1ZHQSkgKz0gbWRkaV9wcmlzbS5vCiBvYmotJChDT05GSUdfRkJfTVNNX01ERElfVE9TSElCQV9DT01NT04pICs9IG1kZGlfdG9zaGliYS5vCiBvYmotJChDT05GSUdfRkJfTVNNX01ERElfVE9TSElCQV9DT01NT05fVkdBKSArPSBtZGRpX3Rvc2hpYmFfdmdhLm8KIG9iai0kKENPTkZJR19GQl9NU01fTURESV9UT1NISUJBX1dWR0FfUE9SVFJBSVQpICs9IG1kZGlfdG9zaGliYV93dmdhX3B0Lm8KLW9iai0kKENPTkZJR19GQl9NU01fTURESV9UT1NISUJBX1dWR0EpICs9IG1kZGlfdG9zaGliYV93dmdhLm8KIG9iai0kKENPTkZJR19GQl9NU01fTURESV9TSEFSUF9RVkdBXzEyOHgxMjgpICs9IG1kZGlfc2hhcnAubwogZW5kaWYKIApAQCAtNzYsMTEgKzc0LDggQEAKIG9iai0kKENPTkZJR19GQl9NU01fTENEQ19QUklTTV9XVkdBKSArPSBsY2RjX3ByaXNtLm8KIG9iai0kKENPTkZJR19GQl9NU01fTENEQ19FWFRFUk5BTF9XWEdBKSArPSBsY2RjX2V4dGVybmFsLm8KIG9iai0kKENPTkZJR19GQl9NU01fTENEQ19HT1JET05fVkdBKSArPSBsY2RjX2dvcmRvbi5vCi1vYmotJChDT05GSUdfRkJfTVNNX0xDRENfV1hHQSkgKz0gbGNkY193eGdhLm8KIG9iai0kKENPTkZJR19GQl9NU01fTENEQ19UT1NISUJBX1dWR0FfUFQpICs9IGxjZGNfdG9zaGliYV93dmdhX3B0Lm8KIG9iai0kKENPTkZJR19GQl9NU01fTENEQ19TSEFSUF9XVkdBX1BUKSArPSBsY2RjX3NoYXJwX3d2Z2FfcHQubwotb2JqLSQoQ09ORklHX0ZCX01TTV9MQ0RDX0dSQVBFRlJVSVRfVkdBKSArPSBsY2RjX2dyYXBlZnJ1aXQubwotb2JqLSQoQ09ORklHX0ZCX01TTV9MQ0RDX1NUMV9XWEdBKSArPSBsY2RjX3N0MV93eGdhLm8KIG9iai0kKENPTkZJR19GQl9NU01fTENEQ19TVDE1X1dYR0EpICs9IGxjZGNfc3QxNS5vCiBvYmotJChDT05GSUdfRkJfTVNNX0hETUlfU0lJX0VYVEVSTkFMXzcyMFApICs9IGhkbWlfc2lpOTAyMi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY19ncmFwZWZydWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfZ3JhcGVmcnVpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjg0NjQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY19ncmFwZWZydWl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgIm1zbV9mYi5oIgotCi0jaWZkZWYgQ09ORklHX0ZCX01TTV9UUllfTURESV9DQVRDSF9MQ0RDX1BSSVNNCi0jaW5jbHVkZSAibWRkaWhvc3RpLmgiCi0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgbGNkY19ncmFwZWZydWl0X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBtc21fcGFuZWxfaW5mbyBwaW5mbzsKLQotI2lmZGVmIENPTkZJR19GQl9NU01fVFJZX01ERElfQ0FUQ0hfTENEQ19QUklTTQotCWlmIChtc21fZmJfZGV0ZWN0X2NsaWVudCgibGNkY19ncmFwZWZydWl0X3ZnYSIpKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0JcGluZm8ueHJlcyA9IDEwMjQ7Ci0JcGluZm8ueXJlcyA9IDYwMDsKLQlwaW5mby50eXBlID0gTENEQ19QQU5FTDsKLQlwaW5mby5wZGVzdCA9IERJU1BMQVlfMTsKLQlwaW5mby53YWl0X2N5Y2xlID0gMDsKLQlwaW5mby5icHAgPSAxODsKLQlwaW5mby5mYl9udW0gPSAyOwotCXBpbmZvLmNsa19yYXRlID0gNDAwMDAwMDA7Ci0KLQlwaW5mby5sY2RjLmhfYmFja19wb3JjaCA9IDg4OwotCXBpbmZvLmxjZGMuaF9mcm9udF9wb3JjaCA9IDQwOwotCXBpbmZvLmxjZGMuaF9wdWxzZV93aWR0aCA9IDEyODsKLQlwaW5mby5sY2RjLnZfYmFja19wb3JjaCA9IDIzOwotCXBpbmZvLmxjZGMudl9mcm9udF9wb3JjaCA9IDE7Ci0JcGluZm8ubGNkYy52X3B1bHNlX3dpZHRoID0gNDsKLQlwaW5mby5sY2RjLmJvcmRlcl9jbHIgPSAwOwkvKiBibGsgKi8KLQlwaW5mby5sY2RjLnVuZGVyZmxvd19jbHIgPSAweGZmOwkvKiBibHVlICovCi0JcGluZm8ubGNkYy5oc3luY19za2V3ID0gMDsKLQotCXJldCA9IGxjZGNfZGV2aWNlX3JlZ2lzdGVyKCZwaW5mbyk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSFcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLW1vZHVsZV9pbml0KGxjZGNfZ3JhcGVmcnVpdF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY19zdDFfd3hnYS5jIGIvZHJpdmVycy9zdGFnaW5nL21zbS9sY2RjX3N0MV93eGdhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzYwMDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9sY2RjX3N0MV93eGdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgIm1zbV9mYi5oIgotCi1zdGF0aWMgaW50IF9faW5pdCBsY2RjX3N0MV93eGdhX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBtc21fcGFuZWxfaW5mbyBwaW5mbzsKLQotCWlmIChtc21fZmJfZGV0ZWN0X2NsaWVudCgibGNkY19zdDFfd3hnYSIpKQotCQlyZXR1cm4gMDsKLQotCXBpbmZvLnhyZXMgPSAxMjgwOwotCXBpbmZvLnlyZXMgPSA3MjA7Ci0JcGluZm8udHlwZSA9IExDRENfUEFORUw7Ci0JcGluZm8ucGRlc3QgPSBESVNQTEFZXzE7Ci0JcGluZm8ud2FpdF9jeWNsZSA9IDA7Ci0JcGluZm8uYnBwID0gMTg7Ci0JcGluZm8uZmJfbnVtID0gMjsKLQlwaW5mby5jbGtfcmF0ZSA9IDc0MjUwMDAwOwotCi0JcGluZm8ubGNkYy5oX2JhY2tfcG9yY2ggPSAxMjQ7Ci0JcGluZm8ubGNkYy5oX2Zyb250X3BvcmNoID0gMTEwOwotCXBpbmZvLmxjZGMuaF9wdWxzZV93aWR0aCA9IDEzNjsKLQlwaW5mby5sY2RjLnZfYmFja19wb3JjaCA9IDE5OwotCXBpbmZvLmxjZGMudl9mcm9udF9wb3JjaCA9IDU7Ci0JcGluZm8ubGNkYy52X3B1bHNlX3dpZHRoID0gNjsKLQlwaW5mby5sY2RjLmJvcmRlcl9jbHIgPSAwOwkvKiBibGsgKi8KLQlwaW5mby5sY2RjLnVuZGVyZmxvd19jbHIgPSAweGZmOwkvKiBibHVlICovCi0JcGluZm8ubGNkYy5oc3luY19za2V3ID0gMDsKLQotCXJldCA9IGxjZGNfZGV2aWNlX3JlZ2lzdGVyKCZwaW5mbyk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSFcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLW1vZHVsZV9pbml0KGxjZGNfc3QxX3d4Z2FfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfd3hnYS5jIGIvZHJpdmVycy9zdGFnaW5nL21zbS9sY2RjX3d4Z2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYzkyYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfd3hnYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJtc21fZmIuaCIKLQotc3RhdGljIGludCBfX2luaXQgbGNkY193eGdhX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBtc21fcGFuZWxfaW5mbyBwaW5mbzsKLQotI2lmZGVmIENPTkZJR19GQl9NU01fTURESV9BVVRPX0RFVEVDVAotCWlmIChtc21fZmJfZGV0ZWN0X2NsaWVudCgibGNkY193eGdhIikpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLQlwaW5mby54cmVzID0gMTI4MDsKLQlwaW5mby55cmVzID0gNzIwOwotCXBpbmZvLnR5cGUgPSBMQ0RDX1BBTkVMOwotCXBpbmZvLnBkZXN0ID0gRElTUExBWV8xOwotCXBpbmZvLndhaXRfY3ljbGUgPSAwOwotCXBpbmZvLmJwcCA9IDI0OwotCXBpbmZvLmZiX251bSA9IDI7Ci0JcGluZm8uY2xrX3JhdGUgPSA3NDI1MDAwMDsKLQotCXBpbmZvLmxjZGMuaF9iYWNrX3BvcmNoID0gMTI0OwotCXBpbmZvLmxjZGMuaF9mcm9udF9wb3JjaCA9IDExMDsKLQlwaW5mby5sY2RjLmhfcHVsc2Vfd2lkdGggPSAxMzY7Ci0JcGluZm8ubGNkYy52X2JhY2tfcG9yY2ggPSAxOTsKLQlwaW5mby5sY2RjLnZfZnJvbnRfcG9yY2ggPSA1OwotCXBpbmZvLmxjZGMudl9wdWxzZV93aWR0aCA9IDY7Ci0JcGluZm8ubGNkYy5ib3JkZXJfY2xyID0gMDsJLyogYmxrICovCi0JcGluZm8ubGNkYy51bmRlcmZsb3dfY2xyID0gMHhmZjsJLyogYmx1ZSAqLwotCXBpbmZvLmxjZGMuaHN5bmNfc2tldyA9IDA7Ci0KLQlyZXQgPSBsY2RjX2RldmljZV9yZWdpc3RlcigmcGluZm8pOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1tb2R1bGVfaW5pdChsY2RjX3d4Z2FfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL21kZGlfdG9zaGliYV93dmdhLmMgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL21kZGlfdG9zaGliYV93dmdhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2IwZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9tZGRpX3Rvc2hpYmFfd3ZnYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJtc21fZmIuaCIKLSNpbmNsdWRlICJtZGRpaG9zdC5oIgotI2luY2x1ZGUgIm1kZGlfdG9zaGliYS5oIgotCi1zdGF0aWMgaW50IF9faW5pdCBtZGRpX3Rvc2hpYmFfd3ZnYV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgbXNtX3BhbmVsX2luZm8gcGluZm87Ci0KLSNpZmRlZiBDT05GSUdfRkJfTVNNX01ERElfQVVUT19ERVRFQ1QKLQlpZiAobXNtX2ZiX2RldGVjdF9jbGllbnQoIm1kZGlfdG9zaGliYV93dmdhIikpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLQlwaW5mby54cmVzID0gODAwOwotCXBpbmZvLnlyZXMgPSA0ODA7Ci0JcGluZm8ucGRlc3QgPSBESVNQTEFZXzI7Ci0JcGluZm8udHlwZSA9IE1ERElfUEFORUw7Ci0JcGluZm8ubWRkaS52ZG9wa3QgPSBNRERJX0RFRkFVTFRfUFJJTV9QSVhfQVRUUjsKLQlwaW5mby53YWl0X2N5Y2xlID0gMDsKLQlwaW5mby5icHAgPSAxODsKLQlwaW5mby5sY2QudnN5bmNfZW5hYmxlID0gVFJVRTsKLQlwaW5mby5sY2QucmVmeDEwMCA9IDYxMTg7Ci0JcGluZm8ubGNkLnZfYmFja19wb3JjaCA9IDY7Ci0JcGluZm8ubGNkLnZfZnJvbnRfcG9yY2ggPSAwOwotCXBpbmZvLmxjZC52X3B1bHNlX3dpZHRoID0gMDsKLQlwaW5mby5sY2QuaHdfdnN5bmNfbW9kZSA9IEZBTFNFOwotCXBpbmZvLmxjZC52c3luY19ub3RpZmllcl9wZXJpb2QgPSAoMSAqIEhaKTsKLQlwaW5mby5ibF9tYXggPSA0OwotCXBpbmZvLmJsX21pbiA9IDE7Ci0JcGluZm8uY2xrX3JhdGUgPSAxOTIwMDAwMDA7Ci0JcGluZm8uY2xrX21pbiA9ICAxOTAwMDAwMDA7Ci0JcGluZm8uY2xrX21heCA9ICAyMDAwMDAwMDA7Ci0JcGluZm8uZmJfbnVtID0gMjsKLQotCXJldCA9IG1kZGlfdG9zaGliYV9kZXZpY2VfcmVnaXN0ZXIoJnBpbmZvLCBUT1NISUJBX1ZHQV9QUklNLAotCQkJCQkgICBMQ0RfVE9TSElCQV8yUDRfV1ZHQSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLW1vZHVsZV9pbml0KG1kZGlfdG9zaGliYV93dmdhX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS9tZGRpaG9zdC5oIGIvZHJpdmVycy9zdGFnaW5nL21zbS9tZGRpaG9zdC5oCmluZGV4IDIwYjgxNzguLmM0NmYyNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vbWRkaWhvc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL21kZGlob3N0LmgKQEAgLTQ0LDggKzQ0LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgIm1zbV9mYl9wYW5lbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL21kcDRfZGVidWdmcy5jIGIvZHJpdmVycy9zdGFnaW5nL21zbS9tZHA0X2RlYnVnZnMuYwppbmRleCA4NDRkNDY3Li4zNjk1NGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbXNtL21kcDRfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbWRwNF9kZWJ1Z2ZzLmMKQEAgLTYzLDEzICs2Myw2IEBACiAJCQkiJWxseFxuIik7CiAKIAotc3RhdGljIGludCBtZHA0X2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQkvKiBub24tc2Vla2FibGUgKi8KLQlmaWxlLT5mX21vZGUgJj0gfihGTU9ERV9MU0VFSyB8IEZNT0RFX1BSRUFEIHwgRk1PREVfUFdSSVRFKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtZHA0X2RlYnVnZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gMDsKQEAgLTE0NCwxMCArMTM3LDExIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1kcDRfZGVidWdmc19mb3BzID0gewotCS5vcGVuID0gbWRwNF9kZWJ1Z2ZzX29wZW4sCisJLm9wZW4gPSBub25zZWVrYWJsZV9vcGVuLAogCS5yZWxlYXNlID0gbWRwNF9kZWJ1Z2ZzX3JlbGVhc2UsCiAJLnJlYWQgPSBtZHA0X2RlYnVnZnNfcmVhZCwKIAkud3JpdGUgPSBtZHA0X2RlYnVnZnNfd3JpdGUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKIH07CiAKIGludCBtZHA0X2RlYnVnZnNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS9tZHA0X292ZXJsYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbWRwNF9vdmVybGF5LmMKaW5kZXggMzA0YmI4Mi4uZGUyODRjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9tZHA0X292ZXJsYXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL21kcDRfb3ZlcmxheS5jCkBAIC04NzQsOCArODc0LDggQEAKIAkJaWYgKHBpcGUtPnBpcGVfbmR4ID09IDApIHsKIAkJCXBpcGUtPnBpcGVfbmR4ID0gaSArIDE7CS8qIHN0YXJ0IGZyb20gMSAqLwogCQkJaW5pdF9jb21wbGV0aW9uKCZwaXBlLT5jb21wKTsKLQlwcmludGsoS0VSTl9JTkZPICJtZHA0X292ZXJsYXlfcGlwZV9hbGxvYzogcGlwZT0leCBuZHg9JWRcbiIsCi0JCQkJCShpbnQpcGlwZSwgcGlwZS0+cGlwZV9uZHgpOworCXByaW50ayhLRVJOX0lORk8gIm1kcDRfb3ZlcmxheV9waXBlX2FsbG9jOiBwaXBlPSVwIG5keD0lZFxuIiwKKwkJCQkJcGlwZSwgcGlwZS0+cGlwZV9uZHgpOwogCQkJcmV0dXJuIHBpcGU7CiAJCX0KIAkJcGlwZSsrOwpAQCAtODg3LDggKzg4Nyw4IEBACiAKIHZvaWQgbWRwNF9vdmVybGF5X3BpcGVfZnJlZShzdHJ1Y3QgbWRwNF9vdmVybGF5X3BpcGUgKnBpcGUpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibWRwNF9vdmVybGF5X3BpcGVfZnJlZTogcGlwZT0leCBuZHg9JWRcbiIsCi0JCQkJCShpbnQpcGlwZSwgcGlwZS0+cGlwZV9uZHgpOworCXByaW50ayhLRVJOX0lORk8gIm1kcDRfb3ZlcmxheV9waXBlX2ZyZWU6IHBpcGU9JXAgbmR4PSVkXG4iLAorCQkJCQlwaXBlLCBwaXBlLT5waXBlX25keCk7CiAJbWVtc2V0KHBpcGUsIDAsIHNpemVvZigqcGlwZSkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL21zbV9mYl9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbXNtX2ZiX2RlZi5oCmluZGV4IDZkZTQ0MDkuLmM1ZjllOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vbXNtX2ZiX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbXNtX2ZiX2RlZi5oCkBAIC01MCwxNSArNTAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgImxpbnV4L3Byb2NfZnMuaCIKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS9zdGFnaW5nLWRldmljZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vc3RhZ2luZy1kZXZpY2VzLmMKaW5kZXggMGY4ZWMzZS4uODYxZjMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9zdGFnaW5nLWRldmljZXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL3N0YWdpbmctZGV2aWNlcy5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAibXNtX21kcC5oIgogI2luY2x1ZGUgIm1lbW9yeV9sbC5oIgogLy8jaW5jbHVkZSAiYW5kcm9pZF9wbWVtLmgiCi0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogCiAjaWZkZWYgQ09ORklHX01TTV9TT0NfUkVWX0EKICNkZWZpbmUgTVNNX1NNSV9CQVNFIDB4RTAwMDAwMDAKQEAgLTExNSwxNyArMTE0LDcgQEAKIAl9IGVsc2UgaWYgKChtYWNoaW5lX2lzX3FzZDh4NTBfc3VyZigpIHx8IG1hY2hpbmVfaXNfcXNkOHg1MGFfc3VyZigpKQogCQkJJiYgIXN0cmNtcChuYW1lLCAibGNkY19leHRlcm5hbCIpKQogCQlyZXQgPSAwOwotCWVsc2UgaWYgKDAgLyptYWNoaW5lX2lzX3FzZDh4NTBfZ3JhcGVmcnVpdCgpICovKSB7Ci0JCWlmICghc3RyY21wKG5hbWUsICJsY2RjX2dyYXBlZnJ1aXRfdmdhIikpCi0JCQlyZXQgPSAwOwotCQllbHNlCi0JCQlyZXQgPSAtRU5PREVWOwotCX0gZWxzZSBpZiAobWFjaGluZV9pc19xc2Q4eDUwX3N0MSgpKSB7Ci0JCWlmICghc3RyY21wKG5hbWUsICJsY2RjX3N0MV93eGdhIikpCi0JCQlyZXQgPSAwOwotCQllbHNlCi0JCQlyZXQgPSAtRU5PREVWOwotCX0gZWxzZSBpZiAobWFjaGluZV9pc19xc2Q4eDUwYV9zdDFfNSgpKSB7CisJZWxzZSBpZiAobWFjaGluZV9pc19xc2Q4eDUwYV9zdDFfNSgpKSB7CiAJCWlmICghc3RyY21wKG5hbWUsICJsY2RjX3N0MTUiKSB8fAogCQkgICAgIXN0cmNtcChuYW1lLCAiaGRtaV9zaWk5MDIyIikpCiAJCQlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LWNtZC1xdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LWNtZC1xdWV1ZS5jCmluZGV4IDk3NjIyN2IuLmU5ODA5ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1jbWQtcXVldWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2N2bXgtY21kLXF1ZXVlLmMKQEAgLTE0MCwyMSArMTQwLDIxIEBACiAJaWYgKHFzdGF0ZS0+YmFzZV9wdHJfZGl2MTI4KSB7CiAJCWlmIChtYXhfZGVwdGggIT0gKGludClxc3RhdGUtPm1heF9kZXB0aCkgewogCQkJY3ZteF9kcHJpbnRmKCJFUlJPUjogY3ZteF9jbWRfcXVldWVfaW5pdGlhbGl6ZTogIgotCQkJCSJRdWV1ZSBhbHJlYWR5IGluaXRhbGl6ZWQgd2l0aCBkaWZmZXJlbnQgIgorCQkJCSJRdWV1ZSBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggZGlmZmVyZW50ICIKIAkJCQkibWF4X2RlcHRoICglZCkuXG4iLAogCQkJICAgICAoaW50KXFzdGF0ZS0+bWF4X2RlcHRoKTsKIAkJCXJldHVybiBDVk1YX0NNRF9RVUVVRV9JTlZBTElEX1BBUkFNOwogCQl9CiAJCWlmIChmcGFfcG9vbCAhPSBxc3RhdGUtPmZwYV9wb29sKSB7CiAJCQljdm14X2RwcmludGYoIkVSUk9SOiBjdm14X2NtZF9xdWV1ZV9pbml0aWFsaXplOiAiCi0JCQkJIlF1ZXVlIGFscmVhZHkgaW5pdGFsaXplZCB3aXRoIGRpZmZlcmVudCAiCisJCQkJIlF1ZXVlIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBkaWZmZXJlbnQgIgogCQkJCSJGUEEgcG9vbCAoJXUpLlxuIiwKIAkJCSAgICAgcXN0YXRlLT5mcGFfcG9vbCk7CiAJCQlyZXR1cm4gQ1ZNWF9DTURfUVVFVUVfSU5WQUxJRF9QQVJBTTsKIAkJfQogCQlpZiAoKHBvb2xfc2l6ZSA+PiAzKSAtIDEgIT0gcXN0YXRlLT5wb29sX3NpemVfbTEpIHsKIAkJCWN2bXhfZHByaW50ZigiRVJST1I6IGN2bXhfY21kX3F1ZXVlX2luaXRpYWxpemU6ICIKLQkJCQkiUXVldWUgYWxyZWFkeSBpbml0YWxpemVkIHdpdGggZGlmZmVyZW50ICIKKwkJCQkiUXVldWUgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGRpZmZlcmVudCAiCiAJCQkJIkZQQSBwb29sIHNpemUgKCV1KS5cbiIsCiAJCQkgICAgIChxc3RhdGUtPnBvb2xfc2l6ZV9tMSArIDEpIDw8IDMpOwogCQkJcmV0dXJuIENWTVhfQ01EX1FVRVVFX0lOVkFMSURfUEFSQU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2N2bXgtZmF1LmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2N2bXgtZmF1LmgKaW5kZXggMjliZGNlNi4uYTY5MzlmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LWZhdS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1mYXUuaApAQCAtMjk5LDcgKzI5OSw3IEBACiAvKioKICAqIEJ1aWxkcyBJL08gZGF0YSBmb3IgYXN5bmMgb3BlcmF0aW9ucwogICoKLSAqIEBzY3JhZGRyOiBTY3JhdGNoIHBhZCBieXRlIGFkZHJlcyB0byB3cml0ZSB0by4gIE11c3QgYmUgOCBieXRlIGFsaWduZWQKKyAqIEBzY3JhZGRyOiBTY3JhdGNoIHBhZCBieXRlIGFkZHJlc3MgdG8gd3JpdGUgdG8uICBNdXN0IGJlIDggYnl0ZSBhbGlnbmVkCiAgKiBAdmFsdWU6ICAgU2lnbmVkIHZhbHVlIHRvIGFkZC4KICAqICAgICAgICAgICAgICAgIE5vdGU6IFdoZW4gcGVyZm9ybWluZyAzMiBhbmQgNjQgYml0IGFjY2Vzcywgb25seSB0aGUgbG93CiAgKiAgICAgICAgICAgICAgICAyMiBiaXRzIGFyZSBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jCmluZGV4IDdlMGJlOGQuLjEwYTgyZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlpZiAoIXByaXYtPnBoeWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIGlmX21paShycSksIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKIH0KIAogc3RhdGljIHZvaWQgY3ZtX29jdF9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtc3BpLmMKaW5kZXggYjU4Yjg5Ny4uOTcwODI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1zcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXNwaS5jCkBAIC0yOTQsNiArMjk0LDggQEAKIAlpZiAobnVtYmVyX3NwaV9wb3J0cyA9PSAwKSB7CiAJCXIgPSByZXF1ZXN0X2lycShPQ1RFT05fSVJRX1JNTCwgY3ZtX29jdF9zcGlfcm1sX2ludGVycnVwdCwKIAkJCQlJUlFGX1NIQVJFRCwgIlNQSSIsICZudW1iZXJfc3BpX3BvcnRzKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKIAl9CiAJbnVtYmVyX3NwaV9wb3J0cysrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3R4cnguYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCmluZGV4IGExMjcxOTYuLjEzNTE2N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCkBAIC0zMTE3LDcgKzMxMTcsNyBAQAogCiAgICAgaW5kZXggPSAoc3JjWzJdK3VwKSAmIChaTV9GSUxURVJfVEFCTEVfUk9XLTEpOwogCi0gICAgLyogVEJEIDogZmlsdGVyIGZyYW1lIHdpdGggc291cmNlIGFkZHJlc3MgPT0gb3duIE1BQyBhZHJlc3MgKi8KKyAgICAvKiBUQkQgOiBmaWx0ZXIgZnJhbWUgd2l0aCBzb3VyY2UgYWRkcmVzcyA9PSBvd24gTUFDIGFkZHJlc3MgKi8KICAgICBpZiAoKHdkLT5tYWNBZGRyWzBdID09IHNyY1swXSkgJiYgKHdkLT5tYWNBZGRyWzFdID09IHNyY1sxXSkKICAgICAgICAgICAgICYmICh3ZC0+bWFjQWRkclsyXSA9PSBzcmNbMl0pKQogICAgIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9UT0RPCmluZGV4IDRjYWYwMjYuLjZmZWE5NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETwpAQCAtMiwxNSArMiw3IEBACiByZWFsbHkgaGF2ZSBwZW9wbGUgaGVscCB0aGVtIG91dCBvbiB0aGUgImNsZWFuIiBhcjkxNzAgZHJpdmVyIHRoYXQgY2FuCiBiZSBmb3VuZCBhdCB0aGUgbGludXgtd2lyZWxlc3MgZGV2ZWxvcGVyIHNpdGUuCiAKLUJ1dCwgaWYgeW91IHdpc2ggdG8gY2xlYW4gdXAgdGhpcyBkcml2ZXIgaW5zdGVhZCwgaGVyZSdzIGEgc2hvcnQgbGlzdCBvZgotdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIGdldCBpdCBpbnRvIGEgbW9yZSBtZXJnYWJsZSBzaGFwZToKLQotVE9ETzoKLQktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKLQktIHNwYXJzZSBjbGVhbnVwcwotCS0gcG9ydCB0byBpbi1rZXJuZWwgODAyMTEgc3RhY2sKLQktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQotCi1QbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKLUx1aXMgUm9kcmlndWV6IDxMdWlzLlJvZHJpZ3VlekBBdGhlcm9zLmNvbT4gYW5kIHRoZQotb3R1cy1kZXZlbEBsaXN0cy5tYWR3aWZpLXByb2plY3Qub3JnIG1haWxpbmcgbGlzdC4KK1RoaXMgZHJpdmVyIGlzIHVubWFpbnRhaW5lZCBhbmQgaXRzIG9ubHkgcHVycG9zZSBpcyBhcyBhCitzb3VyY2Ugb2YgZG9jdW1lbnRhdGlvbiBmb3IgZGV2ZWxvcGVycyB3b3JraW5nIG9uIGFyOTE3MCBhbmQgY2FybDkxNzAuCitPbmNlIGNhcmw5MTcwIGdldHMgMTFuIHN1cHBvcnQgYW5kIG1lcmdlZCB1cHN0cmVhbSB0aGVuIHRoaXMgZHJpdmVyCitjYW4gYmUgcmVtb3ZlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCmluZGV4IGI1OTAyOGUuLjA5NDE1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpAQCAtOTAsMjggKzkwLDYgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBjaGFyIGhleChjaGFyIHYpCi17Ci0JaWYgKGlzZGlnaXQodikpCi0JCXJldHVybiB2IC0gJzAnOwotCWVsc2UgaWYgKGlzeGRpZ2l0KHYpKQotCQlyZXR1cm4gdG9sb3dlcih2KSAtICdhJyArIDEwOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlOwotCi0JdmFsdWUgPSBoZXgoKnN0cikgJiAweDBmOwotCXZhbHVlID0gdmFsdWUgPDwgNDsKLQlzdHIrKzsKLQl2YWx1ZSB8PSBoZXgoKnN0cikgJiAweDBmOwotCi0JcmV0dXJuIHZhbHVlOwotfQotCiBjaGFyICpwcmduYW1lOwogCiBpbnQgc2V0X2lvY3RsKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKQEAgLTE4MCw3ICsxNTgsNyBAQAogCWlmIChhcmdjIDwgMykgewogCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1c2FnZSBpcyBcIiVzIDxpZm5hbWU+IDxvcGVyYXRpb24+IgogCQkJCSJbPGFkZHJlc3M+XSBbPHZhbHVlPl1cIlxuIiwgcHJnbmFtZSwgcHJnbmFtZSk7Ci0JCWZwcmludGYoc3RkZXJyLCAidmFsaWQgb3BlcmF0aW9uIDogcmVhZCwgd3JpdGUsIG1lbSwgcmVnLCBcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgInZhbGlkIG9wZXJhdGlvbiA6IHJlYWQsIHdyaXRlLCBtZW0sIHJlZyxcbiIpOwogCQlmcHJpbnRmKHN0ZGVyciwgIgkJOiB0eGQsIHJ4ZCwgcm1lbSwgd21lbVxuIik7CiAJCWZwcmludGYoc3RkZXJyLCAiCQk6IGRtYXQsIHJlZ3QsIHRlc3RcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5jCmluZGV4IGY1M2U0ODMuLjliOTQyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5jCkBAIC03Miw3ICs3Miw2IEBACiAKIHZvaWQgemZIcEFuaUF0dGFjaCh6ZGV2X3QgKmRldikKIHsKLSNkZWZpbmUgTihhKSAgICAgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKICAgICB1MzJfdCBpOwogICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2OwogCkBAIC0xMjUsNyArMTI0LDYgQEAKICAgICBIcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZnYnJzc2kgPSBaTV9SU1NJX0RVTU1ZX01BUktFUjsKICAgICBIcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZncnNzaSA9IFpNX1JTU0lfRFVNTVlfTUFSS0VSOwogICAgIEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmd0eHJzc2kgPSBaTV9SU1NJX0RVTU1ZX01BUktFUjsKLSN1bmRlZiBOCiB9CiAKIC8qCkBAIC0xMzMsNyArMTMxLDYgQEAKICAqLwogdThfdCB6ZkhwQW5pQ29udHJvbCh6ZGV2X3QgKmRldiwgWk1fSEFMX0FOSV9DTUQgY21kLCBpbnQgcGFyYW0pCiB7Ci0jZGVmaW5lIE4oYSkgKHNpemVvZihhKS9zaXplb2YoYVswXSkpCiAgICAgdHlwZWRlZiBzMzJfdCBUQUJMRVtdOwogICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2OwogICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKQEAgLTE0OCw5ICsxNDUsOSBAQAogICAgIHsKICAgICAgICAgdTMyX3QgbGV2ZWwgPSBwYXJhbTsKIAotICAgICAgICBpZiAobGV2ZWwgPj0gTihIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWQpKSB7CisgICAgICAgIGlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZCkpIHsKICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7Ci0gICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgTihIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWQpKTsKKyAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJtYXggbGV2ZWwgOiAiLCBBUlJBWV9TSVpFKEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZCkpOwogICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogCkBAIC0yNjAsMTAgKzI1NywxMCBAQAogICAgICAgICBjb25zdCBUQUJMRSBmaXJzdGVwID0geyAwLCA0LCA4IH07CiAgICAgICAgIHUzMl90IGxldmVsID0gcGFyYW07CiAKLSAgICAgICAgaWYgKGxldmVsID49IE4oZmlyc3RlcCkpCisgICAgICAgIGlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKGZpcnN0ZXApKQogICAgICAgICB7CiAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7Ci0gICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJtYXggbGV2ZWwgOiAiLCBOKGZpcnN0ZXApKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm1heCBsZXZlbCA6ICIsIEFSUkFZX1NJWkUoZmlyc3RlcCkpOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0ZJTkRfU0lHLApAQCAtMjgzLDEwICsyODAsMTAgQEAKICAgICAgICAgY29uc3QgVEFCTEUgY3ljcHdyVGhyMSA9IHsgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYgfTsKICAgICAgICAgdTMyX3QgbGV2ZWwgPSBwYXJhbTsKIAotICAgICAgICBpZiAobGV2ZWwgPj0gTihjeWNwd3JUaHIxKSkKKyAgICAgICAgaWYgKGxldmVsID49IEFSUkFZX1NJWkUoY3ljcHdyVGhyMSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImxldmVsIG91dCBvZiByYW5nZSwgZGVzaXJlZCBsZXZlbCA6ICIsIGxldmVsKTsKLSAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm1heCBsZXZlbCA6ICIsIE4oY3ljcHdyVGhyMSkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgQVJSQVlfU0laRShjeWNwd3JUaHIxKSk7CiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfVElNSU5HNSwKQEAgLTMzNSw3ICszMzIsNiBAQAogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwotI3VuZGVmICBOCiB9CiAKIHZvaWQgemZIcEFuaVJlc3RhcnQoemRldl90KiBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBtYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBtYWluLmMKaW5kZXggNWY0MTJlMC4uNmQyZDM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocG1haW4uYwpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICogUmVnaXN0ZXIgc2V0dGluZyBieSBtb2RlCiAgICAgICovCiAKLSAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNk1vZGVzKSAvIHNpemVvZigqYXI1NDE2TW9kZXMpOworICAgIGVudHJpZXMgPSBBUlJBWV9TSVpFKGFyNTQxNk1vZGVzKTsKICAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMiwgIk1vZGVzIHJlZ2lzdGVyIHNldHRpbmcgZW50cmllcz0iLCBlbnRyaWVzKTsKICAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCiAgICAgewpAQCAtNDk2LDcgKzQ5Niw3IEBACiAgICAgLyoKICAgICAgKiBDb21tb24gUmVnaXN0ZXIgc2V0dGluZwogICAgICAqLwotICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2Q29tbW9uKSAvIHNpemVvZigqYXI1NDE2Q29tbW9uKTsKKyAgICBlbnRyaWVzID0gQVJSQVlfU0laRShhcjU0MTZDb21tb24pOwogICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKICAgICB7CiAgICAgICAgIHJlZ193cml0ZShhcjU0MTZDb21tb25baV1bMF0sIGFyNTQxNkNvbW1vbltpXVsxXSk7CkBAIC01MDYsNyArNTA2LDcgQEAKICAgICAvKgogICAgICAqIFJGIEdhaW4gc2V0dGluZyBieSBmcmVxSW5kZXgKICAgICAgKi8KLSAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJCX1JmR2FpbikgLyBzaXplb2YoKmFyNTQxNkJCX1JmR2Fpbik7CisgICAgZW50cmllcyA9IEFSUkFZX1NJWkUoYXI1NDE2QkJfUmZHYWluKTsKICAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCiAgICAgewogICAgICAgICByZWdfd3JpdGUoYXI1NDE2QkJfUmZHYWluW2ldWzBdLCBhcjU0MTZCQl9SZkdhaW5baV1bZnJlcUluZGV4XSk7CkBAIC05NjMsNyArOTYzLDYgQEAKIC8qIEJhbmsgMCAxIDIgMyA1IDYgNyAqLwogdm9pZCB6ZlNldFJmUmVncyh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KQogewotICAgIHUxNl90IGVudHJpZXM7CiAgICAgdTE2X3QgZnJlcUluZGV4ID0gMDsKICAgICB1MTZfdCBpOwogCkBAIC05ODQsMzMgKzk4MywyOCBAQAogICAgIH0KIAogI2lmIDEKLSAgICBlbnRyaWVzID0gc2l6ZW9mKG90dXNCYW5rKSAvIHNpemVvZigqb3R1c0JhbmspOwotICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICBmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKG90dXNCYW5rKTsgaSsrKQogICAgIHsKICAgICAgICAgcmVnX3dyaXRlKG90dXNCYW5rW2ldWzBdLCBvdHVzQmFua1tpXVtmcmVxSW5kZXhdKTsKICAgICB9CiAjZWxzZQogICAgIC8qIEJhbmswICovCi0gICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMCkgLyBzaXplb2YoKmFyNTQxNkJhbmswKTsKLSAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgZm9yIChpPTA7IGk8QVJSQVlfU0laRShhcjU0MTZCYW5rMCk7IGkrKykKICAgICB7CiAgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rMFtpXVswXSwgYXI1NDE2QmFuazBbaV1bMV0pOwogICAgIH0KICAgICAvKiBCYW5rMSAqLwotICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazEpIC8gc2l6ZW9mKCphcjU0MTZCYW5rMSk7Ci0gICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIGZvciAoaT0wOyBpPEFSUkFZX1NJWkUoYXI1NDE2QmFuazEpOyBpKyspCiAgICAgewogICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazFbaV1bMF0sIGFyNTQxNkJhbmsxW2ldWzFdKTsKICAgICB9CiAgICAgLyogQmFuazIgKi8KLSAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbmsyKSAvIHNpemVvZigqYXI1NDE2QmFuazIpOwotICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICBmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGFyNTQxNkJhbmsyKTsgaSsrKQogICAgIHsKICAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbmsyW2ldWzBdLCBhcjU0MTZCYW5rMltpXVsxXSk7CiAgICAgfQogICAgIC8qIEJhbmszICovCi0gICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMykgLyBzaXplb2YoKmFyNTQxNkJhbmszKTsKLSAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgZm9yIChpPTA7IGk8QVJSQVlfU0laRShhcjU0MTZCYW5rMyk7IGkrKykKICAgICB7CiAgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rM1tpXVswXSwgYXI1NDE2QmFuazNbaV1bZnJlcUluZGV4XSk7CiAgICAgfQpAQCAtMTAxOCwxNCArMTAxMiwxMiBAQAogICAgIHJlZ193cml0ZSAoMHg5OGIwLCAgMHgwMDAwMDAxMyk7CiAgICAgcmVnX3dyaXRlICgweDk4ZTQsICAweDAwMDAwMDAyKTsKICAgICAvKiBCYW5rNiAqLwotICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazYpIC8gc2l6ZW9mKCphcjU0MTZCYW5rNik7Ci0gICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIGZvciAoaT0wOyBpPEFSUkFZX1NJWkUoYXI1NDE2QmFuazYpOyBpKyspCiAgICAgewogICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazZbaV1bMF0sIGFyNTQxNkJhbms2W2ldW2ZyZXFJbmRleF0pOwogICAgIH0KICAgICAvKiBCYW5rNyAqLwotICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazcpIC8gc2l6ZW9mKCphcjU0MTZCYW5rNyk7Ci0gICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIGZvciAoaT0wOyBpPEFSUkFZX1NJWkUoYXI1NDE2QmFuazcpOyBpKyspCiAgICAgewogICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazdbaV1bMF0sIGFyNTQxNkJhbms3W2ldWzFdKTsKICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5jCmluZGV4IGRhM2I3NzQuLjliMDQ2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5jCkBAIC0yOSw5ICsyOSw2IEBACiAjaW5jbHVkZSAiaHByZWcuaCIKICNpbmNsdWRlICJocHVzYi5oIgogCi0vKiB1c2VkIHRocm91Z2hvdXQgdGhpcyBmaWxlLi4uICovCi0jZGVmaW5lCU4oYSkJKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKLQogI2RlZmluZSBIQUxfTU9ERV8xMUFfVFVSQk8JSEFMX01PREVfMTA4QQogI2RlZmluZSBIQUxfTU9ERV8xMUdfVFVSQk8JSEFMX01PREVfMTA4RwogCkBAIC0xNTU3LDcgKzE1NTQsNyBAQAogCXU2NF90IGZsYWdzID0gTk9fUkVROwogCVJFR19ETU5fUEFJUl9NQVBQSU5HICpyZWdQYWlyID0gTlVMTDsKIAotCWZvciAoaSA9IDAsIGZvdW5kID0gMDsgKGkgPCBOKHJlZ0RvbWFpblBhaXJzKSkgJiYgKCFmb3VuZCk7IGkrKykgeworCWZvciAoaSA9IDAsIGZvdW5kID0gMDsgKGkgPCBBUlJBWV9TSVpFKHJlZ0RvbWFpblBhaXJzKSkgJiYgKCFmb3VuZCk7IGkrKykgewogCQlpZiAocmVnRG9tYWluUGFpcnNbaV0ucmVnRG1uRW51bSA9PSByZWdpb25Db2RlKSB7CiAJCQlyZWdQYWlyID0gJnJlZ0RvbWFpblBhaXJzW2ldOwogCQkJZm91bmQgPSAxOwpAQCAtMTU4MSw3ICsxNTc4LDcgQEAKIAkgKiB1bml0YXJ5IHJlZyBkb21haW4gb2YgdGhlIHBhaXIKIAkgKi8KIAotCWZvciAoaSA9IDAgOyBpIDwgTihyZWdEb21haW5zKSA7IGkrKykgeworCWZvciAoaSA9IDAgOyBpIDwgQVJSQVlfU0laRShyZWdEb21haW5zKSA7IGkrKykgewogCQlpZiAocmVnRG9tYWluc1tpXS5yZWdEbW5FbnVtID09IHJlZ0RtbikgewogCQkJaWYgKHJkICE9IE5VTEwpIHsKIAkJCQkJemZNZW1vcnlDb3B5KCh1OF90ICopcmQsICh1OF90ICopJnJlZ0RvbWFpbnNbaV0sCkBAIC0xNjUzLDcgKzE2NTAsNyBAQAogCiAJem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKIAotCWZvciAoY20gPSBtb2RlczsgY20gPCAmbW9kZXNbTihtb2RlcyldOyBjbSsrKSB7CisJZm9yIChjbSA9IG1vZGVzOyBjbSA8ICZtb2Rlc1tBUlJBWV9TSVpFKG1vZGVzKV07IGNtKyspIHsKIAkJdTE2X3QgYzsKIAkJdTY0X3QgKmNoYW5uZWxCTSA9IE5VTEw7CiAJCVJFR19ET01BSU4gKnJkID0gTlVMTDsKQEAgLTE4NDYsNyArMTg0Myw3IEBACiAKIAl6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOwogCi0JZm9yIChpID0gMDsgaSA8IE4oYWxsQ291bnRyaWVzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxsQ291bnRyaWVzKTsgaSsrKSB7CiAJCWlmIChDb3VudHJ5Q29kZSA9PSBhbGxDb3VudHJpZXNbaV0uY291bnRyeUNvZGUpIHsKIAkJCVJlZ0RvbWFpbiA9IGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtOwogCkBAIC0xODgxLDcgKzE4NzgsNyBAQAogCQlzdHJMZW4gPSAzOyAqLwogCX0KIAkvKiB6bV9kZWJ1Z19tc2dfcygiRGVzaXJlZCBpc28gbmFtZSA9ICIsIGlzb05hbWUpOyAqLwotCWZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsbENvdW50cmllcyk7IGkrKykgewogCQkvKiB6bV9kZWJ1Z19tc2dfcygiQ3VycmVudCBpc28gbmFtZSA9ICIsIGFsbENvdW50cmllc1tpXS5pc29OYW1lKTsgKi8KIAkJaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCAqKWFsbENvdW50cmllc1tpXS5pc29OYW1lLCAodThfdCAqKSZjb3VudHJ5SW5mb1syXSwgbGVuZ3RoLTEpKSB7CiAJCQkvKiBEYmdQcmludCgiU2V0IGN1cnJlbnQgaXNvIG5hbWUgPSAlc1xuIiwgYWxsQ291bnRyaWVzW2ldLmlzb05hbWUpOyAqLwpAQCAtMTkzNyw3ICsxOTM0LDcgQEAKIHsKIAl1MTZfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE4oYWxsQ291bnRyaWVzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxsQ291bnRyaWVzKTsgaSsrKSB7CiAJCWlmIChhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bSA9PSByZWdpb25Db2RlKQogCQkJcmV0dXJuIGFsbENvdW50cmllc1tpXS5pc29OYW1lOwogCX0KQEAgLTE5NTMsNyArMTk1MCw3IEBACiAJLyogaWYgbm8gbWF0Y2hpbmcgaXRlbSwgcmV0dXJuIGRlZmF1bHQgKi8KIAlyZWdpb25Db2RlID0gREVGX1JFR0RNTjsKIAotCWZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsbENvdW50cmllcyk7IGkrKykgewogCQlpZiAoemZNZW1vcnlJc0VxdWFsKCh1OF90ICopYWxsQ291bnRyaWVzW2ldLmlzb05hbWUsIGNvdW50cnlJc29OYW1lLCAyKSkgewogCQkJcmVnaW9uQ29kZSA9IGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9pb2N0bC5jCmluZGV4IGE0OGM4ZTQuLmRjMzA2NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaW9jdGwuYwpAQCAtNjMsOCArNjMsNyBAQAogCiBleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QgKmRldik7CiAKLXN0YXRpYyBjb25zdCB1MzJfdCBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbXSA9Ci17CitzdGF0aWMgY29uc3QgdTMyX3QgY2hhbm5lbF9mcmVxdWVuY3lfMTFBW10gPSB7CiAJLyogRXZlbiBlbGVtZW50IGZvciBDaGFubmVsIE51bWJlciwgT2RkIGZvciBGcmVxdWVuY3kgKi8KIAkzNiwgNTE4MCwKIAk0MCwgNTIwMCwKQEAgLTUwNyw3ICs1MDYsNyBAQAogewogCS8qIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsgKi8KIAotCXN0cmNweSh3cnEtPm5hbWUsICJJRUVFIDgwMi4xMS1NSU1PIik7CisJc3RyY3B5KHdycS0+bmFtZSwgIklFRUUgODAyLjExYWJnbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzYxLDcgKzEzNjAsNyBAQAogfQogCiAvKmludCB1c2JkcnZ3ZXh0X3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0qCQkgICAJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQorKgkJCQl2b2lkICp3LCBjaGFyICpleHRyYSkKICp7CiAqCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGRldi0+bWxfcHJpdjsKICoJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2ljOwpAQCAtMjI2MSwxMCArMjI2MCwxMCBAQAogCQlwcmludGsoS0VSTl9FUlIgIndkLT5hcC53cGFMZW4gOiAlIGRcbiIsIGxlbik7CiAKIAkJLyogRFVNUCBXUEEgSUUgKi8KLQkJZm9yKGlpID0gMDsgaWkgPCBsZW47KSB7CisJCWZvciAoaWkgPSAwOyBpaSA8IGxlbjspIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIHdwYWllW2lpXSk7CiAKLQkJCWlmKCgrK2lpICUgMTYpID09IDApCisJCQlpZiAoKCsraWkgJSAxNikgPT0gMCkKIAkJCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CiAJCX0KIAkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwpAQCAtMjMwOSwxMSArMjMwOCwxMCBAQAogCS8qIEdldCB0aGUgQVAgSWQgKi8KIAlhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOwogCi0JaWYgKGFwSWQgPT0gMHhmZmZmKSB7CisJaWYgKGFwSWQgPT0gMHhmZmZmKQogCQlhcElkID0gMDsKLQl9IGVsc2UgeworCWVsc2UKIAkJYXBJZCA9IGFwSWQgKyAxOwotCX0KIAogCXN3aXRjaCAoemRwYXJtLT5jbWQpIHsKIAljYXNlIFpNX0NNRF9DRU5DX1NFVENFTkM6CkBAIC0yMzM0LDE1ICsyMzMyLDE1IEBACiAKIAkJcHJpbnRrKEtFUk5fRVJSICJLZXkgSW5kZXggOiAlIGRcbiIsIHpkcGFybS0+dS5jcnlwdC5rZXlpZCk7CiAJCXByaW50ayhLRVJOX0VSUiAiRW5jcnlwdGlvbiBrZXkgPSAiKTsKLQkJZm9yIChpaSA9IDA7IGlpIDwgMTY7IGlpKyspIHsKKwkJZm9yIChpaSA9IDA7IGlpIDwgMTY7IGlpKyspCiAJCQlwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB6ZHBhcm0tPnUuY3J5cHQua2V5W2lpXSk7Ci0JCX0KKwogCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CiAKIAkJcHJpbnRrKEtFUk5fRVJSICJNSUMga2V5ID0gIik7Ci0JCWZvcihpaSA9IDE2OyBpaSA8IFpNX0NFTkNfS0VZX1NJWkU7IGlpKyspIHsKKwkJZm9yIChpaSA9IDE2OyBpaSA8IFpNX0NFTkNfS0VZX1NJWkU7IGlpKyspCiAJCQlwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB6ZHBhcm0tPnUuY3J5cHQua2V5W2lpXSk7Ci0JCX0KKwogCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CiAKIAkJLyogU2V0IHVwIGtleSBpbmZvcm1hdGlvbiAqLwpAQCAtMjQyNCw3ICsyNDIyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBTSU9DU0lXUlRTOgogCQllcnIgPSB1c2JkcnZfaW9jdGxfc2V0cnRzKGRldiwgJndycS0+dS5ydHMpOwotCQlpZiAoISBlcnIpCisJCWlmICghZXJyKQogCQkJY2hhbmdlZCA9IDE7CiAJCWJyZWFrOwogCS8qIHNldF9hdXRoICovCkBAIC0yNTgyLDggKzI1ODAsNyBAQAogCQkJCQkJCVpNX0FVVEhfTU9ERV9XUEEpOwogCQkJCQl9IGVsc2UgaWYgKChtYWNwLT5zdXBJZVsxN10gPT0gMHhmKSAmJgogCQkJCQkJKG1hY3AtPnN1cEllWzE4XSA9PSAweGFjKSAmJgotCQkJCQkJKG1hY3AtPnN1cEllWzE5XSA9PSAweDIpKQotCQkJCQl7CisJCQkJCQkobWFjcC0+c3VwSWVbMTldID09IDB4MikpIHsKIAkJCQkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJ3ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0tcbiIpOwogCQkJCS8qIHdkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlBTSzsgKi8KQEAgLTI1OTIsOCArMjU4OSw3IEBACiAJCQkJWk1fQVVUSF9NT0RFX1dQQTJQU0spOwogCQkJfSBlbHNlIGlmICgobWFjcC0+c3VwSWVbMTddID09IDB4ZikgJiYKIAkJCQkobWFjcC0+c3VwSWVbMThdID09IDB4YWMpICYmCi0JCQkJKG1hY3AtPnN1cEllWzE5XSA9PSAweDEpKQotCQkJCXsKKwkJCQkobWFjcC0+c3VwSWVbMTldID09IDB4MSkpIHsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlxuIik7CiAJCQkJLyogd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyOyAqLwpAQCAtMjYxOCw3ICsyNjE0LDcgQEAKIAkJCQl6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9BRVMpOwogCQkJCX0KIAkJCX0KLQkJCS8vV1BBMiBvciBXUEEyUFNLCisJCQkvKldQQTIgb3IgV1BBMlBTSyovCiAJCQlpZiAoKG1hY3AtPnN1cEllWzE3XSA9PSAweGYpIHx8CiAJCQkJKG1hY3AtPnN1cEllWzE4XSA9PSAweGFjKSkgewogCQkJCWlmIChtYWNwLT5zdXBJZVsxM10gPT0gMHgyKSB7CkBAIC0yNjU2LDcgKzI2NTIsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJIioqKioqKioqKioqKioqKipaRF9QQVJBTV9DT1VOVEVSTUVBU1VSRVMgOiAiKTsKIAotCQkJaWYoYXJnKSB7CisJCQlpZiAoYXJnKSB7CiAJCQkJLyogICAgbUNvdW50ZXJNZWFzdXJlU3RhdGU9MTsgKi8KIAkJCQlwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CiAJCQl9IGVsc2UgewpAQCAtMjY2NywyMCArMjY2MywxOCBAQAogCQlpZiAob3AgPT0gWkRfUEFSQU1fRFJPUFVORU5DUllQVEVEKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlpEX1BBUkFNX0RST1BVTkVOQ1JZUFRFRCA6ICIpOwogCi0JCQlpZihhcmcpIHsKKwkJCWlmIChhcmcpCiAJCQkJcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOwotCQkJfQogCQl9CiAJCWlmIChvcCA9PSBaRF9QQVJBTV9BVVRIX0FMR1MpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fQVVUSF9BTEdTIDogIik7CiAKLQkJCWlmIChhcmcgPT0gMCkgeworCQkJaWYgKGFyZyA9PSAwKQogCQkJCXByaW50ayhLRVJOX0VSUiAiT1BFTl9TWVNURU1cbiIpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlwcmludGsoS0VSTl9FUlIgIlNIQVJFRF9LRVlcbiIpOwotCQkJfQogCQl9CiAJCWlmIChvcCA9PSBaRF9QQVJBTV9XUFNfRklMVEVSKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlpEX1BBUkFNX1dQU19GSUxURVIgOiAiKTsKQEAgLTI3MDUsMTEgKzI2OTksMTAgQEAKIAkJLyogR2V0IHRoZSBBUCBJZCAqLwogCQlhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOwogCi0JCWlmIChhcElkID09IDB4ZmZmZikgeworCQlpZiAoYXBJZCA9PSAweGZmZmYpCiAJCQlhcElkID0gMDsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJYXBJZCA9IGFwSWQgKyAxOwotCQl9CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXFfd3BhaWUsIGlmci0+aWZyX2RhdGEsCiAJCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllKSkpIHsKQEAgLTI3MjEsMTAgKzI3MTQsMTAgQEAKIAkJCWZvciAoaiA9IDA7IGogPCBJRUVFODAyMTFfQUREUl9MRU47IGorKykgewogCQkJCWlmIChtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPQogCQkJCQkJcmVxX3dwYWllLndwYV9tYWNhZGRyW2pdKQotCQkJCWJyZWFrOworCQkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChqID09IDYpCi0JCQlicmVhazsKKwkJCQlicmVhazsKIAkJfQogCiAJCWlmIChpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMKaW5kZXggMGIyMzhlOS4uMWZiYTdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jCkBAIC0zNiw3ICszNiw3IEBACiB1MTZfdCB6ZkxueENlbmNBc29jTm90aWZ5KHpkZXZfdCAqZGV2LCB1MTZfdCAqbWFjQWRkciwgdThfdCAqYm9keSwKIAkJCQl1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKIHsKLQlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSAoc3RydWN0IHVzYmRydl9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgenlkYXNfY2VuY19zdGFfaW5mbyBjZW5jX2luZm87CiAJLyogc3RydWN0IHNvY2sgKm5ldGxpbmtfc2s7CSovCiAJdThfdCBpZV9sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYwppbmRleCA5MzQ1OWNhLi45ZjA0MDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMKQEAgLTEwNCw2ICsxMDQsMTEgQEAKIAogCWlmIChzaXplID4gMCkgewogCQlidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCXByX2VycigiemZ3VXNiU3VibWl0Q29udHJvbCgpIGZhaWxlZCwgIgorCQkJCSAgImttYWxsb2MoKSByZXR1cm5lZCBOVUxMXG4iKTsKKwkJCXJldHVybiAxOworCQl9CiAJCW1lbWNweShidWYsICh1OF90ICopZGF0YSwgc2l6ZSk7CiAJfSBlbHNlCiAJCWJ1ZiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3dyYXAuYwppbmRleCBiMDJlYjQyLi5mY2QzZGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3d3cmFwLmMKQEAgLTI5LDI0ICsyOSwyNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCi1leHRlcm4gdm9pZCB6ZmlSZWN2ODAyMTEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOwotZXh0ZXJuIHZvaWQgemZDb3JlUmVjdih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7Ci1leHRlcm4gdm9pZCB6ZklkbENoa1JzcCh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKLWV4dGVybiB2b2lkIHpmSWRsUnNwKHpkZXZfdCogZGV2LCB1MzJfdCAqcnNwLCB1MTZfdCByc3BMZW4pOworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvKTsKK2V4dGVybiB2b2lkIHpmQ29yZVJlY3YoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gKmFkZEluZm8pOworZXh0ZXJuIHZvaWQgemZJZGxDaGtSc3AoemRldl90ICpkZXYsIHUzMl90ICpyc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QgKmRldiwgdTMyX3QgKnJzcCwgdTE2X3QgcnNwTGVuKTsKIAogCiAKLS8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKy8qZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsqLwogZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKIAotdTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90KiBkZXYpOwotdTMyX3QgemZMbnhVc2JJbih6ZGV2X3QqIGRldiwgdXJiX3QgKnVyYiwgemJ1Zl90ICpidWYpOwordTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90ICpkZXYpOwordTMyX3QgemZMbnhVc2JJbih6ZGV2X3QgKmRldiwgdXJiX3QgKnVyYiwgemJ1Zl90ICpidWYpOwogdTMyX3QgemZMbnhTdWJtaXRSZWdJblVyYih6ZGV2X3QgKmRldik7CiB1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKLSAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpOworCXZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KTsKIHUzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCi0gICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0LAotICAgICAgICB1MzJfdCBpbnRlcnZhbCk7CisJdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCisJdTMyX3QgaW50ZXJ2YWwpOwogCiB1MTZfdCB6ZkxueEdldEZyZWVUeFVyYih6ZGV2X3QgKmRldikKIHsKQEAgLTU2LDIyICs1NiwxOSBAQAogCiAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogCi0gICAgLy9pZHggPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOworICAgIC8qaWR4ID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsqLwogCi0gICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4VXJiSGVhZCkKLSAgICBpZiAobWFjcC0+VHhVcmJDbnQgIT0gMCkKLSAgICB7Ci0gICAgICAgIGlkeCA9IG1hY3AtPlR4VXJiVGFpbDsKLSAgICAgICAgbWFjcC0+VHhVcmJUYWlsID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKLSAgICAgICAgbWFjcC0+VHhVcmJDbnQtLTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm1hY3AtPlR4VXJiQ250OiAlZFxuIiwgbWFjcC0+VHhVcmJDbnQpOwotICAgICAgICBpZHggPSAweGZmZmY7Ci0gICAgfQorICAgIC8qaWYgKGlkeCAhPSBtYWNwLT5UeFVyYkhlYWQpKi8KKyAgICBpZiAobWFjcC0+VHhVcmJDbnQgIT0gMCkgeworCWlkeCA9IG1hY3AtPlR4VXJiVGFpbDsKKwltYWNwLT5UeFVyYlRhaWwgPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOworCW1hY3AtPlR4VXJiQ250LS07CisJfSBlbHNlIHsKKwkvKnByaW50ayhLRVJOX0VSUiAibWFjcC0+VHhVcmJDbnQ6ICVkXG4iLCBtYWNwLT5UeFVyYkNudCk7Ki8KKwlpZHggPSAweGZmZmY7CisJfQogCi0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICAgcmV0dXJuIGlkeDsKIH0KIApAQCAtODUsMTYgKzgyLDEzIEBACiAKICAgICBpZHggPSAoKG1hY3AtPlR4VXJiSGVhZCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOwogCi0gICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4VXJiVGFpbCkKLSAgICBpZiAobWFjcC0+VHhVcmJDbnQgPCBaTV9NQVhfVFhfVVJCX05VTSkKLSAgICB7Ci0gICAgICAgIG1hY3AtPlR4VXJiSGVhZCA9IGlkeDsKLSAgICAgICAgbWFjcC0+VHhVcmJDbnQrKzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVc2JUeFVyYlEgaW5jb25zaXN0ZW50OiBUeFVyYkhlYWQ6ICVkLCBUeFVyYlRhaWw6ICVkXG4iLAotICAgICAgICAgICAgICAgIG1hY3AtPlR4VXJiSGVhZCwgbWFjcC0+VHhVcmJUYWlsKTsKKyAgICAvKmlmIChpZHggIT0gbWFjcC0+VHhVcmJUYWlsKSovCisgICAgaWYgKG1hY3AtPlR4VXJiQ250IDwgWk1fTUFYX1RYX1VSQl9OVU0pIHsKKwltYWNwLT5UeFVyYkhlYWQgPSBpZHg7CisJbWFjcC0+VHhVcmJDbnQrKzsKKyAgICB9IGVsc2UgeworCXByaW50aygiVXNiVHhVcmJRIGluY29uc2lzdGVudDogVHhVcmJIZWFkOiAlZCwgVHhVcmJUYWlsOiAlZFxuIiwKKwltYWNwLT5UeFVyYkhlYWQsIG1hY3AtPlR4VXJiVGFpbCk7CiAgICAgfQogCiAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CkBAIC0xMjUsMjQgKzExOSwyMCBAQAogCiAgICAgaWR4ID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CiAKLSAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhCdWZUYWlsKQotICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA+IDApCi0gICAgewotICAgICAgICAvL3ByaW50aygiQ1dZIC0gemZ3R2V0VXNiVHhCdWZmZXIgLG1hY3AtPlR4QnVmQ250ID0gJWRcbiIsIG1hY3AtPlR4QnVmQ250KTsKLSAgICAgICAgVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZIZWFkXSk7Ci0gICAgICAgIG1hY3AtPlR4QnVmSGVhZCA9ICgobWFjcC0+VHhCdWZIZWFkKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOwotICAgICAgICBtYWNwLT5UeEJ1ZkNudC0tOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAobWFjcC0+VHhCdWZIZWFkICE9IG1hY3AtPlR4QnVmVGFpbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZndHZXRVc2JUeEJ1ZiBVc2JUeEJ1ZlEgaW5jb25zaXN0ZW50OiBUeEJ1ZkhlYWQ6ICVkLCBUeEJ1ZlRhaWw6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCk7Ci0gICAgICAgIH0KKyAgICAvKmlmIChpZHggIT0gbWFjcC0+VHhCdWZUYWlsKSovCisgICAgaWYgKG1hY3AtPlR4QnVmQ250ID4gMCkgeworCS8qcHJpbnRrKCJDV1kgLSB6ZndHZXRVc2JUeEJ1ZmZlciAsbWFjcC0+VHhCdWZDbnQgPSAlZFxuIiwgbWFjcC0+VHhCdWZDbnQpOyovCisJVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZIZWFkXSk7CisJbWFjcC0+VHhCdWZIZWFkID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CisJbWFjcC0+VHhCdWZDbnQtLTsKKwl9IGVsc2UgeworCWlmIChtYWNwLT5UeEJ1ZkhlYWQgIT0gbWFjcC0+VHhCdWZUYWlsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiemZ3R2V0VXNiVHhCdWYgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZFxuIiwKKwkJbWFjcC0+VHhCdWZIZWFkLCBtYWNwLT5UeEJ1ZlRhaWwpOworCX0KIAotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisJcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CkBAIC0xNTAsOCArMTQwLDggQEAKIH0KIAogdTE2X3QgemZMbnhQdXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sCi0gICAgICAgIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sCi0gICAgICAgIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCisJdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwKKwl6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQogewogICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgICB1MTZfdCBpZHg7CkBAIC0xNjMsMzIgKzE1MywyOSBAQAogICAgIGlkeCA9ICgobWFjcC0+VHhCdWZUYWlsKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOwogCiAgICAgLyogRm9yIFR4IGRlYnVnICovCi0gICAgLy96bV9hc3NlcnQobWFjcC0+VHhCdWZDbnQgPj0gMCk7IC8vIGRlbGV0ZWQgYmVjYXVzZSBvZiBhbHdheXMgdHJ1ZQorICAgIC8qem1fYXNzZXJ0KG1hY3AtPlR4QnVmQ250ID49IDApOyAvLyBkZWxldGVkIGJlY2F1c2Ugb2YgYWx3YXlzIHRydWUqLwogCi0gICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmSGVhZCkKLSAgICBpZiAobWFjcC0+VHhCdWZDbnQgPCBaTV9NQVhfVFhfQlVGX05VTSkKLSAgICB7Ci0gICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciAsbWFjcC0+VHhCdWZDbnQgPSAlZFxuIiwgbWFjcC0+VHhCdWZDbnQpOwotICAgICAgICBUeFEgPSAoVXNiVHhRX3QgKikmKG1hY3AtPlVzYlR4QnVmUVttYWNwLT5UeEJ1ZlRhaWxdKTsKLSAgICAgICAgbWVtY3B5KFR4US0+aGRyLCBoZHIsIGhkcmxlbik7Ci0gICAgICAgIFR4US0+aGRybGVuID0gaGRybGVuOwotICAgICAgICBtZW1jcHkoVHhRLT5zbmFwLCBzbmFwLCBzbmFwTGVuKTsKLSAgICAgICAgVHhRLT5zbmFwTGVuID0gc25hcExlbjsKLSAgICAgICAgbWVtY3B5KFR4US0+dGFpbCwgdGFpbCwgdGFpbExlbik7Ci0gICAgICAgIFR4US0+dGFpbExlbiA9IHRhaWxMZW47Ci0gICAgICAgIFR4US0+YnVmID0gYnVmOwotICAgICAgICBUeFEtPm9mZnNldCA9IG9mZnNldDsKKyAgICAvKmlmIChpZHggIT0gbWFjcC0+VHhCdWZIZWFkKSovCisgICAgaWYgKG1hY3AtPlR4QnVmQ250IDwgWk1fTUFYX1RYX0JVRl9OVU0pIHsKKwkvKnByaW50aygiQ1dZIC0gemZ3UHV0VXNiVHhCdWZmZXIgLG1hY3AtPlR4QnVmQ250ID0gJWRcbiIsIG1hY3AtPlR4QnVmQ250KTsqLworCVR4USA9IChVc2JUeFFfdCAqKSYobWFjcC0+VXNiVHhCdWZRW21hY3AtPlR4QnVmVGFpbF0pOworCW1lbWNweShUeFEtPmhkciwgaGRyLCBoZHJsZW4pOworCVR4US0+aGRybGVuID0gaGRybGVuOworCW1lbWNweShUeFEtPnNuYXAsIHNuYXAsIHNuYXBMZW4pOworCVR4US0+c25hcExlbiA9IHNuYXBMZW47CisJbWVtY3B5KFR4US0+dGFpbCwgdGFpbCwgdGFpbExlbik7CisJVHhRLT50YWlsTGVuID0gdGFpbExlbjsKKwlUeFEtPmJ1ZiA9IGJ1ZjsKKwlUeFEtPm9mZnNldCA9IG9mZnNldDsKIAotICAgICAgICBtYWNwLT5UeEJ1ZlRhaWwgPSAoKG1hY3AtPlR4QnVmVGFpbCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKLSAgICAgICAgbWFjcC0+VHhCdWZDbnQrKzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZkxueFB1dFVzYlR4QnVmZmVyIFVzYlR4QnVmUSBpbmNvbnNpc3RlbnQ6IFR4QnVmSGVhZDogJWQsIFR4QnVmVGFpbDogJWQsIFR4QnVmQ250OiAlZFxuIiwKLSAgICAgICAgICAgIG1hY3AtPlR4QnVmSGVhZCwgbWFjcC0+VHhCdWZUYWlsLCBtYWNwLT5UeEJ1ZkNudCk7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwotICAgICAgICByZXR1cm4gMHhmZmZmOwotICAgIH0KKwltYWNwLT5UeEJ1ZlRhaWwgPSAoKG1hY3AtPlR4QnVmVGFpbCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKwltYWNwLT5UeEJ1ZkNudCsrOworCX0gZWxzZSB7CisJcHJpbnRrKEtFUk5fRVJSICJ6ZkxueFB1dFVzYlR4QnVmZmVyIFVzYlR4QnVmUSBpbmNvbnNpc3RlbnQ6IFR4QnVmSGVhZDogJWQsIFR4QnVmVGFpbDogJWQsIFR4QnVmQ250OiAlZFxuIiwKKwkJbWFjcC0+VHhCdWZIZWFkLCBtYWNwLT5UeEJ1ZlRhaWwsIG1hY3AtPlR4QnVmQ250KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKwlyZXR1cm4gMHhmZmZmOworCX0KIAogICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgIHJldHVybiAwOwpAQCAtMTk3LDI4ICsxODQsMjUgQEAKIHpidWZfdCAqemZMbnhHZXRVc2JSeEJ1ZmZlcih6ZGV2X3QgKmRldikKIHsKICAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7Ci0gICAgLy91MTZfdCBpZHg7CisgICAgLyp1MTZfdCBpZHg7Ki8KICAgICB6YnVmX3QgKmJ1ZjsKICAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CiAKICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAKLSAgICAvL2lkeCA9ICgobWFjcC0+UnhCdWZIZWFkKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOworICAgIC8qaWR4ID0gKChtYWNwLT5SeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7Ki8KIAotICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZlRhaWwpCi0gICAgaWYgKG1hY3AtPlJ4QnVmQ250ICE9IDApCi0gICAgewotICAgICAgICBidWYgPSBtYWNwLT5Vc2JSeEJ1ZlFbbWFjcC0+UnhCdWZIZWFkXTsKLSAgICAgICAgbWFjcC0+UnhCdWZIZWFkID0gKChtYWNwLT5SeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7Ci0gICAgICAgIG1hY3AtPlJ4QnVmQ250LS07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKLSAgICAgICAgICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQsIG1hY3AtPlJ4QnVmVGFpbCk7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgICAgLyppZiAoaWR4ICE9IG1hY3AtPlJ4QnVmVGFpbCkqLworICAgIGlmIChtYWNwLT5SeEJ1ZkNudCAhPSAwKSB7CisJYnVmID0gbWFjcC0+VXNiUnhCdWZRW21hY3AtPlJ4QnVmSGVhZF07CisJbWFjcC0+UnhCdWZIZWFkID0gKChtYWNwLT5SeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7CisJbWFjcC0+UnhCdWZDbnQtLTsKKyAgICB9IGVsc2UgeworCXByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKKwkJbWFjcC0+UnhCdWZIZWFkLCBtYWNwLT5SeEJ1ZlRhaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCXJldHVybiBOVUxMOworCX0KIAogICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgIHJldHVybiBidWY7CkBAIC0yMzQsNjEgKzIxOCw1NiBAQAogCiAgICAgaWR4ID0gKChtYWNwLT5SeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7CiAKLSAgICAvL2lmIChpZHggIT0gbWFjcC0+UnhCdWZIZWFkKQotICAgIGlmIChtYWNwLT5SeEJ1ZkNudCAhPSBaTV9NQVhfUlhfVVJCX05VTSkKLSAgICB7Ci0gICAgICAgIG1hY3AtPlVzYlJ4QnVmUVttYWNwLT5SeEJ1ZlRhaWxdID0gYnVmOwotICAgICAgICBtYWNwLT5SeEJ1ZlRhaWwgPSBpZHg7Ci0gICAgICAgIG1hY3AtPlJ4QnVmQ250Kys7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKLSAgICAgICAgICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQsIG1hY3AtPlJ4QnVmVGFpbCk7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwotICAgICAgICByZXR1cm4gMHhmZmZmOwotICAgIH0KKyAgICAvKmlmIChpZHggIT0gbWFjcC0+UnhCdWZIZWFkKSovCisgICAgaWYgKG1hY3AtPlJ4QnVmQ250ICE9IFpNX01BWF9SWF9VUkJfTlVNKSB7CisJbWFjcC0+VXNiUnhCdWZRW21hY3AtPlJ4QnVmVGFpbF0gPSBidWY7CisJbWFjcC0+UnhCdWZUYWlsID0gaWR4OworCW1hY3AtPlJ4QnVmQ250Kys7CisgICAgfSBlbHNlIHsKKwlwcmludGsoIlJ4QnVmUSBpbmNvbnNpc3RlbnQ6IFJ4QnVmSGVhZDogJWQsIFJ4QnVmVGFpbDogJWRcbiIsCisJCW1hY3AtPlJ4QnVmSGVhZCwgbWFjcC0+UnhCdWZUYWlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKwlyZXR1cm4gMHhmZmZmOworCX0KIAotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwotICAgIHJldHVybiAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCXJldHVybiAwOwogfQogCiB2b2lkIHpmTG54VXNiRGF0YU91dF9jYWxsYmFjayh1cmJfdCAqdXJiKQogewotICAgIHpkZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OwotICAgIC8vVXNiVHhRX3QgKlR4RGF0YTsKKyAgICB6ZGV2X3QgKmRldiA9IHVyYi0+Y29udGV4dDsKKyAgICAvKlVzYlR4UV90ICpUeERhdGE7Ki8KIAogICAgIC8qIEdpdmUgdGhlIHVyYiBiYWNrICovCiAgICAgemZMbnhQdXRUeFVyYihkZXYpOwogCiAgICAgLyogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbnkgcGVuZGluZyBidWZmZXIgbmVlZGVkICovCiAgICAgLyogdG8gYmUgc2VudCAqLwotICAgIGlmICh6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KSAhPSAwKQotICAgIHsKLSAgICAgICAgLy9UeERhdGEgPSB6ZndHZXRVc2JUeEJ1ZmZlcihkZXYpOwotCi0gICAgICAgIC8vaWYgKFR4RGF0YSA9PSBOVUxMKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgcHJpbnRrKCJHZXQgYSBOVUxMIGJ1ZmZlciBmcm9tIHpmd0dldFVzYlR4QnVmZmVyXG4iKTsKLSAgICAgICAgLy8gICAgcmV0dXJuOwotICAgICAgICAvL30KLSAgICAgICAgLy9lbHNlCi0gICAgICAgIC8vewotICAgICAgICAgICAgemZMbnhVc2JTdWJtaXRUeERhdGEoZGV2KTsKLSAgICAgICAgLy99CisgICAgaWYgKHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpICE9IDApIHsKKwkvKlR4RGF0YSA9IHpmd0dldFVzYlR4QnVmZmVyKGRldik7CisJLy9pZiAoVHhEYXRhID09IE5VTEwpCisJLy97CisJLy8gICAgcHJpbnRrKCJHZXQgYSBOVUxMIGJ1ZmZlciBmcm9tIHpmd0dldFVzYlR4QnVmZmVyXG4iKTsKKwkvLyAgICByZXR1cm47CisJLy99CisJLy9lbHNlCisJLy97CisJCXpmTG54VXNiU3VibWl0VHhEYXRhKGRldik7CisJLy99Ki8KICAgICB9CiB9CiAKIHZvaWQgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2sodXJiX3QgKnVyYikKIHsKLSAgICB6ZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKKyAgICB6ZGV2X3QgKmRldiA9IHVyYi0+Y29udGV4dDsKICAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICAgemJ1Zl90ICpidWY7CiAgICAgemJ1Zl90ICpuZXdfYnVmOwogICAgIGludCBzdGF0dXM7CiAKICNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQotICAgIHN0YXRpYyBpbnQgcmVtYWluX2xlbiA9IDAsIGNoZWNrX3BhZCA9IDAsIGNoZWNrX2xlbiA9IDA7CisgICAgc3RhdGljIGludCByZW1haW5fbGVuLCBjaGVja19wYWQsIGNoZWNrX2xlbjsKICAgICBpbnQgaW5kZXggPSAwOwogICAgIGludCBjaGtfaWR4OwogICAgIHUxNl90IHBrdF9sZW47CkBAIC0yOTksNDcgKzI3OCw0NSBAQAogI2VuZGlmCiAKICAgICAvKiBDaGVjayBzdGF0dXMgZm9yIFVSQiAqLwotICAgIGlmICh1cmItPnN0YXR1cyAhPSAwKXsKLSAgICAgICAgcHJpbnRrKCJ6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaygpIDogc3RhdHVzPTB4JXhcbiIsIHVyYi0+c3RhdHVzKTsKLSAgICAgICAgaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCi0gICAgICAgICAgICAmJiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKXsKLSAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQSVBFIik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOwotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCXByaW50aygiemZMbnhVc2JEYXRhSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7CisJaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCisJCSYmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSkgeworCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKSB7CisJCQkvKnByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBJUEUiKTsqLworCQkJc3RhdHVzID0gLTE7CisJCX0KIAotICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKLSAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQUk9UTyIpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8pIHsKKwkJCS8qcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUFJPVE8iKTsqLworCQkJc3RhdHVzID0gLTE7CisJCX0KKwl9CiAKLSAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInVyYi0+c3RhdHVzOiAweCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKKwkvKnByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOyovCiAKLSAgICAgICAgLyogRGVxdWV1ZSBza2IgYnVmZmVyICovCi0gICAgICAgIGJ1ZiA9IHpmTG54R2V0VXNiUnhCdWZmZXIoZGV2KTsKLSAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKLSAgICAgICAgI2lmIDAKLSAgICAgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCi0gICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBidWYpOworCS8qIERlcXVldWUgc2tiIGJ1ZmZlciAqLworCWJ1ZiA9IHpmTG54R2V0VXNiUnhCdWZmZXIoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiX2FueShidWYpOworCSNpZiAwCisJLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCisJemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIGJ1Zik7CiAKLSAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCi0gICAgICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIGJ1Zik7Ci0gICAgICAgICNlbmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQorCS8qIFN1Ym1pdCBhIFJ4IHVyYiAqLworCXpmTG54VXNiSW4oZGV2LCB1cmIsIGJ1Zik7CisJI2VuZGlmCisJcmV0dXJuOworCX0KIAotICAgIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiAiR2V0IGFuIFVSQiB3aG9zZSBsZW5ndGggaXMgemVybyIpOwotICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApIHsKKwlwcmludGsoS0VSTl9FUlIgIkdldCBhbiBVUkIgd2hvc2UgbGVuZ3RoIGlzIHplcm8iKTsKKwlzdGF0dXMgPSAtMTsKICAgICB9CiAKICAgICAvKiBEZXF1ZXVlIHNrYiBidWZmZXIgKi8KICAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CiAKLSAgICAvL3pmd0J1ZlNldFNpemUoZGV2LCBidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisgICAgLyp6ZndCdWZTZXRTaXplKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOyovCiAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCiAgICAgYnVmLT50YWlsID0gMDsKICAgICBidWYtPmxlbiA9IDA7CkBAIC0zNTMsMTM0ICszMzAsMTIyIEBACiAgICAgc2tiX3B1dChidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKICNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQotICAgIGlmIChyZW1haW5fbGVuICE9IDApCi0gICAgewotICAgICAgICB6YnVmX3QgKnJlbWFpbl9idWYgPSBtYWNwLT5yZWFtaW5fYnVmOworICAgIGlmIChyZW1haW5fbGVuICE9IDApIHsKKwl6YnVmX3QgKnJlbWFpbl9idWYgPSBtYWNwLT5yZWFtaW5fYnVmOwogCi0gICAgICAgIGluZGV4ID0gcmVtYWluX2xlbjsKLSAgICAgICAgcmVtYWluX2xlbiAtPSBjaGVja19wYWQ7CisJaW5kZXggPSByZW1haW5fbGVuOworCXJlbWFpbl9sZW4gLT0gY2hlY2tfcGFkOwogCi0gICAgICAgIC8qICBDb3B5IGRhdGEgKi8KLSAgICAgICAgbWVtY3B5KCYocmVtYWluX2J1Zi0+ZGF0YVtjaGVja19sZW5dKSwgYnVmLT5kYXRhLCByZW1haW5fbGVuKTsKLSAgICAgICAgY2hlY2tfbGVuICs9IHJlbWFpbl9sZW47Ci0gICAgICAgIHJlbWFpbl9sZW4gPSAwOworCS8qICBDb3B5IGRhdGEgKi8KKwltZW1jcHkoJihyZW1haW5fYnVmLT5kYXRhW2NoZWNrX2xlbl0pLCBidWYtPmRhdGEsIHJlbWFpbl9sZW4pOworCWNoZWNrX2xlbiArPSByZW1haW5fbGVuOworCXJlbWFpbl9sZW4gPSAwOwogCi0gICAgICAgIHJ4QnVmUG9vbFtyeEJ1ZlBvb2xJbmRleCsrXSA9IHJlbWFpbl9idWY7CisJcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluX2J1ZjsKICAgICB9CiAKLSAgICB3aGlsZShpbmRleCA8IHVyYi0+YWN0dWFsX2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIHBrdF9sZW4gPSBidWYtPmRhdGFbaW5kZXhdICsgKGJ1Zi0+ZGF0YVtpbmRleCsxXSA8PCA4KTsKLSAgICAgICAgcGt0X3RhZyA9IGJ1Zi0+ZGF0YVtpbmRleCsyXSArIChidWYtPmRhdGFbaW5kZXgrM10gPDwgOCk7CisgICAgd2hpbGUgKGluZGV4IDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJcGt0X2xlbiA9IGJ1Zi0+ZGF0YVtpbmRleF0gKyAoYnVmLT5kYXRhW2luZGV4KzFdIDw8IDgpOworCXBrdF90YWcgPSBidWYtPmRhdGFbaW5kZXgrMl0gKyAoYnVmLT5kYXRhW2luZGV4KzNdIDw8IDgpOwogCi0gICAgICAgIGlmIChwa3RfdGFnID09IDB4NGUwMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHBhZF9sZW47CisJaWYgKHBrdF90YWcgPT0gMHg0ZTAwKSB7CisJCWludCBwYWRfbGVuOwogCi0gICAgICAgICAgICAvL3ByaW50aygiR2V0IGEgcGFja2V0LCBpbmRleDogJWQsIHBrdF9sZW46IDB4JTA0eFxuIiwgaW5kZXgsIHBrdF9sZW4pOwotICAgICAgICAgICAgI2lmIDAKLSAgICAgICAgICAgIC8qIER1bXAgZGF0YSAqLwotICAgICAgICAgICAgZm9yIChpaSA9IGluZGV4OyBpaSA8IHBrdF9sZW4rNDspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCIlMDJ4ICIsIChidWYtPmRhdGFbaWldICYgMHhmZikpOworCQkvKnByaW50aygiR2V0IGEgcGFja2V0LCBpbmRleDogJWQsIHBrdF9sZW46IDB4JTA0eFxuIiwgaW5kZXgsIHBrdF9sZW4pOyovCisJCSNpZiAwCisJCS8qIER1bXAgZGF0YSAqLworCQlmb3IgKGlpID0gaW5kZXg7IGlpIDwgcGt0X2xlbis0OykgeworCQkJcHJpbnRrKCIlMDJ4ICIsIChidWYtPmRhdGFbaWldICYgMHhmZikpOwogCi0gICAgICAgICAgICAgICAgaWYgKCgrK2lpICUgMTYpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKLSAgICAgICAgICAgIH0KKwkJCWlmICgoKytpaSAlIDE2KSA9PSAwKQorCQkJcHJpbnRrKCJcbiIpOworCQkJfQogCi0gICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgICAgICAjZW5kaWYKKwkJCXByaW50aygiXG4iKTsKKwkJI2VuZGlmCiAKLSAgICAgICAgICAgIHBhZF9sZW4gPSA0IC0gKHBrdF9sZW4gJiAweDMpOworCQlwYWRfbGVuID0gNCAtIChwa3RfbGVuICYgMHgzKTsKIAotICAgICAgICAgICAgaWYocGFkX2xlbiA9PSA0KQotICAgICAgICAgICAgICAgIHBhZF9sZW4gPSAwOworCQlpZiAocGFkX2xlbiA9PSA0KQorCQlwYWRfbGVuID0gMDsKIAotICAgICAgICAgICAgY2hrX2lkeCA9IGluZGV4OwotICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDQgKyBwa3RfbGVuICsgcGFkX2xlbjsKKwkJY2hrX2lkeCA9IGluZGV4OworCQlpbmRleCA9IGluZGV4ICsgNCArIHBrdF9sZW4gKyBwYWRfbGVuOwogCi0gICAgICAgICAgICBpZiAoaW5kZXggPiBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVtYWluX2xlbiA9IGluZGV4IC0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFOyAvLyAtIHBhZF9sZW47Ci0gICAgICAgICAgICAgICAgY2hlY2tfbGVuID0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFIC0gY2hrX2lkeCAtIDQ7Ci0gICAgICAgICAgICAgICAgY2hlY2tfcGFkID0gcGFkX2xlbjsKKwkJaWYgKGluZGV4ID4gWk1fTUFYX1JYX0JVRkZFUl9TSVpFKSB7CisJCQlyZW1haW5fbGVuID0gaW5kZXggLSBaTV9NQVhfUlhfQlVGRkVSX1NJWkU7IC8qIC0gcGFkX2xlbjsqLworCQkJY2hlY2tfbGVuID0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFIC0gY2hrX2lkeCAtIDQ7CisJCQljaGVja19wYWQgPSBwYWRfbGVuOwogCi0gICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgLy9uZXdfYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisJCQkvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKwkJCS8qbmV3X2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsqLworCQkJbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKIAotICAgICAgICAgICAgICAgIC8qIFNldCBza2IgYnVmZmVyIGxlbmd0aCAqLwotICAgICAgICAgICAgI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAotICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSAwOwotICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7Ci0gICAgICAgICAgICAjZWxzZQotICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOwotICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7Ci0gICAgICAgICAgICAjZW5kaWYKKwkJCS8qIFNldCBza2IgYnVmZmVyIGxlbmd0aCAqLworCQkJI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorCQkJbmV3X2J1Zi0+dGFpbCA9IDA7CisJCQluZXdfYnVmLT5sZW4gPSAwOworCQkJI2Vsc2UKKwkJCW5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOworCQkJbmV3X2J1Zi0+bGVuID0gMDsKKwkJCSNlbmRpZgogCi0gICAgICAgICAgICAgICAgc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKKwkJCXNrYl9wdXQobmV3X2J1ZiwgcGt0X2xlbik7CiAKLSAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgJihidWYtPmRhdGFbY2hrX2lkeCs0XSksIGNoZWNrX2xlbik7CisJCQkvKiBDb3B5IHRoZSBidWZmZXIgKi8KKwkJCW1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgY2hlY2tfbGVuKTsKIAotICAgICAgICAgICAgICAgIC8qIFJlY29yZCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICBtYWNwLT5yZWFtaW5fYnVmID0gbmV3X2J1ZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgI2lmZGVmIFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKLSAgICAgICAgICAgICAgICBpZiAocnhCdWZQb29sSW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld19idWYgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKKwkJCS8qIFJlY29yZCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKwkJCW1hY3AtPnJlYW1pbl9idWYgPSBuZXdfYnVmOworCQl9IGVsc2UgIHsKKwkJCSNpZmRlZiBaTV9ET05UX0NPUFlfUlhfQlVGRkVSCisJCQlpZiAocnhCdWZQb29sSW5kZXggPT0gMCkgeworCQkJCW5ld19idWYgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKIAotICAgICAgICAgICAgICAgICAgICBuZXdfYnVmLT5kYXRhID0gJihidWYtPmRhdGFbY2hrX2lkeCs0XSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IHBrdF9sZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICNlbmRpZgotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisJCQkJbmV3X2J1Zi0+ZGF0YSA9ICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pOworCQkJCW5ld19idWYtPmxlbiA9IHBrdF9sZW47CisJCQl9IGVsc2UgIHsKKwkJCQkjZW5kaWYKKwkJCQkvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKwkJCQluZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOwogCi0gICAgICAgICAgICAgICAgLyogU2V0IHNrYiBidWZmZXIgbGVuZ3RoICovCi0gICAgICAgICAgICAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCi0gICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IDA7Ci0gICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKLSAgICAgICAgICAgICNlbHNlCi0gICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7Ci0gICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKLSAgICAgICAgICAgICNlbmRpZgorCQkJCS8qIFNldCBza2IgYnVmZmVyIGxlbmd0aCAqLworCQkJCSNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKwkJCQluZXdfYnVmLT50YWlsID0gMDsKKwkJCQluZXdfYnVmLT5sZW4gPSAwOworCQkJCSNlbHNlCisJCQkJbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7CisJCQkJbmV3X2J1Zi0+bGVuID0gMDsKKwkJCQkjZW5kaWYKIAotICAgICAgICAgICAgICAgIHNrYl9wdXQobmV3X2J1ZiwgcGt0X2xlbik7CisJCQkJc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKIAotICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgcGt0X2xlbik7CisJCQkJLyogQ29weSB0aGUgYnVmZmVyICovCisJCQkJbWVtY3B5KG5ld19idWYtPmRhdGEsICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pLCBwa3RfbGVuKTsKIAotICAgICAgICAjaWZkZWYgWk1fRE9OVF9DT1BZX1JYX0JVRkZFUgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gbmV3X2J1ZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCB0YWcsIHBrdF9sZW46IDB4JTA0eCwgdGFnOiAweCUwNHhcbiIsIHBrdF9sZW4sIHBrdF90YWcpOworCQkJCSNpZmRlZiBaTV9ET05UX0NPUFlfUlhfQlVGRkVSCisJCQkJfQorCQkJI2VuZGlmCisJCQlyeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSBuZXdfYnVmOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIHRhZywgcGt0X2xlbjogMHglMDR4LCB0YWc6IDB4JTA0eFxuIiwgcGt0X2xlbiwgcGt0X3RhZyk7CiAKLSAgICAgICAgICAgIC8qIEZyZWUgYnVmZmVyICovCi0gICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworCQkJLyogRnJlZSBidWZmZXIgKi8KKwkJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiAKLSAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLwotICAgICAgICAgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKwkJCS8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworCQkJbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKIAotICAgICAgICAgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCi0gICAgICAgICAgICB6ZkxueFB1dFVzYlJ4QnVmZmVyKGRldiwgbmV3X2J1Zik7CisJCQkvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KKwkJCXpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBuZXdfYnVmKTsKIAotICAgICAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCi0gICAgICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBuZXdfYnVmKTsKKwkJCS8qIFN1Ym1pdCBhIFJ4IHVyYiAqLworCQkJemZMbnhVc2JJbihkZXYsIHVyYiwgbmV3X2J1Zik7CiAKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KKwkJCXJldHVybjsKKwkJCX0KKwkJfQogCiAgICAgLyogRnJlZSBidWZmZXIgKi8KICAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOwpAQCAtNDk2LDkgKzQ2MSw4IEBACiAgICAgemZMbnhVc2JJbihkZXYsIHVyYiwgbmV3X2J1Zik7CiAKICNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQotICAgIGZvcihpaSA9IDA7IGlpIDwgcnhCdWZQb29sSW5kZXg7IGlpKyspCi0gICAgewotICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVjdihkZXYsIHJ4QnVmUG9vbFtpaV0pOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHJ4QnVmUG9vbEluZGV4OyBpaSsrKSB7CisJbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YoZGV2LCByeEJ1ZlBvb2xbaWldKTsKICAgICB9CiAjZWxzZQogICAgIC8qIHBhc3MgZGF0YSB0byB1cHBlciBsYXllciAqLwpAQCAtNTA4LDUxICs0NzIsNDggQEAKIAogdm9pZCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjayh1cmJfdCAqdXJiKQogewotICAgIC8vZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKKyAgICAvKmRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7Ki8KIAotICAgIC8vcHJpbnRrKEtFUk5fRVJSICJ6ZndVc2JSZWdPdXRfY2FsbGJhY2tcbiIpOworCS8qcHJpbnRrKEtFUk5fRVJSICJ6ZndVc2JSZWdPdXRfY2FsbGJhY2tcbiIpOyovCiB9CiAKIHZvaWQgemZMbnhVc2JSZWdJbl9jYWxsYmFjayh1cmJfdCAqdXJiKQogewotICAgIHpkZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OworICAgIHpkZXZfdCAqZGV2ID0gdXJiLT5jb250ZXh0OwogICAgIHUzMl90IHJzcFs2NC80XTsKICAgICBpbnQgc3RhdHVzOwogICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAogICAgIC8qIENoZWNrIHN0YXR1cyBmb3IgVVJCICovCi0gICAgaWYgKHVyYi0+c3RhdHVzICE9IDApewotICAgICAgICBwcmludGsoInpmTG54VXNiUmVnSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7Ci0gICAgICAgIGlmICgodXJiLT5zdGF0dXMgIT0gLUVOT0VOVCkgJiYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKQotICAgICAgICAgICAgJiYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUElQRSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUElQRSIpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwlwcmludGsoInpmTG54VXNiUmVnSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7CisJaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpICYmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSkgeworCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKSB7CisJCQkvKnByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBJUEUiKTsqLworCQkJc3RhdHVzID0gLTE7CisJCX0KIAotICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKLSAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQUk9UTyIpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8pIHsKKwkJCS8qcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUFJPVE8iKTsqLworCQkJc3RhdHVzID0gLTE7CisJCX0KKwl9CiAKLSAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInVyYi0+c3RhdHVzOiAweCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwkvKnByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOyovCisJcmV0dXJuOworCX0KIAotICAgIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiAiR2V0IGFuIFVSQiB3aG9zZSBsZW5ndGggaXMgemVybyIpOwotICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApIHsKKwlwcmludGsoS0VSTl9FUlIgIkdldCBhbiBVUkIgd2hvc2UgbGVuZ3RoIGlzIHplcm8iKTsKKwlzdGF0dXMgPSAtMTsKICAgICB9CiAKICAgICAvKiBDb3B5IGRhdGEgaW50byByZXNwb25lIGJ1ZmZlciAqLwogICAgIG1lbWNweShyc3AsIG1hY3AtPnJlZ1VzYlJlYWRCdWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKICAgICAvKiBOb3RpZnkgdG8gdXBwZXIgbGF5ZXIgKi8KLSAgICAvL3pmSWRsQ2hrUnNwKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLSAgICAvL3pmaVVzYlJlZ0luKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKyAgICAvKnpmSWRsQ2hrUnNwKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsqLworICAgIC8qemZpVXNiUmVnSW4oZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOyovCiAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlZ0luKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAogICAgIC8qIElzc3VlIGFub3RoZXIgVVNCIElOIFVSQiAqLwpAQCAtNTY0LDIyICs1MjUsMjIgQEAKICAgICB1MzJfdCByZXQ7CiAgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCi0gICAgLyogU3VibWl0IGEgcnggdXJiICovCisgICAgLyogU3VibWl0IGEgcnggdXJiCiAgICAgLy9yZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIobWFjcC0+UmVnSW5VcmIsIG1hY3AtPnVkZXYsCiAgICAgLy8gICAgICAgIFVTQl9SRUdfSU5fUElQRSwgVVNCX0RJUl9JTiwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwKICAgICAvLyAgICAgICAgWk1fVVNCX1JFR19NQVhfQlVGX1NJWkUsIHpmTG54VXNiUmVnSW5fY2FsbGJhY2ssIGRldik7CiAgICAgLy9DV1lhbmcoLSkKICAgICAvL2lmIChyZXQgIT0gMCkKLSAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKKyAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsqLwogCiAgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRJbnRVcmIobWFjcC0+UmVnSW5VcmIsIG1hY3AtPnVkZXYsCi0gICAgICAgICAgICBVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCi0gICAgICAgICAgICBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSwgemZMbnhVc2JSZWdJbl9jYWxsYmFjaywgZGV2LCAxKTsKKwlVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCisJWk1fVVNCX1JFR19NQVhfQlVGX1NJWkUsIHpmTG54VXNiUmVnSW5fY2FsbGJhY2ssIGRldiwgMSk7CiAKICAgICByZXR1cm4gcmV0OwogfQogCi11MzJfdCB6ZkxueFVzYlN1Ym1pdFR4RGF0YSh6ZGV2X3QqIGRldikKK3UzMl90IHpmTG54VXNiU3VibWl0VHhEYXRhKHpkZXZfdCAqZGV2KQogewogICAgIHUzMl90IGk7CiAgICAgdTMyX3QgcmV0OwpAQCAtNjAwLDM5ICs1NjEsMzMgQEAKICAgICBmcmVlVHhVcmIgPSB6ZkxueEdldEZyZWVUeFVyYihkZXYpOwogCiAgICAgLyogSWYgdGhlcmUgaXMgbm8gYW55IGZyZWUgVHggVXJiICovCi0gICAgaWYgKGZyZWVUeFVyYiA9PSAweGZmZmYpCi0gICAgewotICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKLSAgICAgICAgLy9wcmludGsoIkNXWSAtIENhbid0IGdldCBmcmVlIFR4IFVyYlxuIik7Ci0gICAgICAgIHJldHVybiAweGZmZmY7CisgICAgaWYgKGZyZWVUeFVyYiA9PSAweGZmZmYpIHsKKwkvKnByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKKwkvL3ByaW50aygiQ1dZIC0gQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsqLworCXJldHVybiAweGZmZmY7CiAgICAgfQogCiAjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKICAgICB1c2JUeEFnZ0NudCA9IHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpOwogCi0gICAgaWYgKHVzYlR4QWdnQ250ID49IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNKQotICAgIHsKLSAgICAgICB1c2JUeEFnZ0NudCA9IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHVzYlR4QWdnQ250ID0gMTsKKyAgICBpZiAodXNiVHhBZ2dDbnQgPj0gWk1fTUFYX1RYX0FHR1JFR0FURV9OVU0pIHsKKwl1c2JUeEFnZ0NudCA9IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNOworICAgIH0gZWxzZSB7CisJdXNiVHhBZ2dDbnQgPSAxOwogICAgIH0KIAotICAgIC8vcHJpbnRrKCJ1c2JUeEFnZ0NudDogJWRcbiIsIHVzYlR4QWdnQ250KTsKKyAgICAvKnByaW50aygidXNiVHhBZ2dDbnQ6ICVkXG4iLCB1c2JUeEFnZ0NudCk7Ki8KICNlbmRpZgogCiAjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKLSAgICBmb3IoaWkgPSAwOyBpaSA8IHVzYlR4QWdnQ250OyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCB1c2JUeEFnZ0NudDsgaWkrKykgewogI2VuZGlmCiAgICAgLyogRGVxdWV1ZSB0aGUgcGFja2V0IGZyb20gVXNiVHhCdWZRICovCiAgICAgVHhEYXRhID0gemZMbnhHZXRVc2JUeEJ1ZmZlcihkZXYpOwotICAgIGlmIChUeERhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIEdpdmUgdGhlIHVyYiBiYWNrICovCi0gICAgICAgIHpmTG54UHV0VHhVcmIoZGV2KTsKLSAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICBpZiAoVHhEYXRhID09IE5VTEwpIHsKKwkvKiBHaXZlIHRoZSB1cmIgYmFjayAqLworCXpmTG54UHV0VHhVcmIoZGV2KTsKKwlyZXR1cm4gMHhmZmZmOwogICAgIH0KIAogICAgIC8qIFBvaW50IHRvIHRoZSBmcmVlVHhVcmIgYnVmZmVyICovCkBAIC02NDQsMTE0ICs1OTksMTAzIEBACiAKICAgICAvKiBBZGQgdGhlIHBhY2tldCBsZW5ndGggYW5kIHRhZyBpbmZvcm1hdGlvbiAqLwogICAgICpwVXNiVHhIZHIrKyA9IFR4RGF0YS0+aGRybGVuICsgVHhEYXRhLT5zbmFwTGVuICsKLSAgICAgICAgICAgICAoVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0KSArICBUeERhdGEtPnRhaWxMZW47CisJKFR4RGF0YS0+YnVmLT5sZW4gLSBUeERhdGEtPm9mZnNldCkgKyAgVHhEYXRhLT50YWlsTGVuOwogCiAgICAgKnBVc2JUeEhkcisrID0gMHg2OTdlOwogCiAgICAgcHVUeEJ1ZiArPSA0OwotI2VuZGlmIC8vICNpZmRlZiBaTV9VU0JfVFhfU1RSRUFNX01PREUKKyNlbmRpZiAvKiAjaWZkZWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFKi8KIAogICAgIC8qIENvcHkgV0xBTiBoZWFkZXIgYW5kIHBhY2tldCBidWZmZXIgaW50byBVU0IgYnVmZmVyICovCi0gICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5oZHJsZW47IGkrKykKLSAgICB7Ci0gICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPmhkcltpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVHhEYXRhLT5oZHJsZW47IGkrKykgeworCSpwdVR4QnVmKysgPSBUeERhdGEtPmhkcltpXTsKICAgICB9CiAKICAgICAvKiBDb3B5IFNOQVAgaGVhZGVyICovCi0gICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5zbmFwTGVuOyBpKyspCi0gICAgewotICAgICAgICAqcHVUeEJ1ZisrID0gVHhEYXRhLT5zbmFwW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBUeERhdGEtPnNuYXBMZW47IGkrKykgeworCSpwdVR4QnVmKysgPSBUeERhdGEtPnNuYXBbaV07CiAgICAgfQogCiAgICAgLyogQ29weSBwYWNrZXQgYnVmZmVyICovCi0gICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0OyBpKyspCi0gICAgewotICAgIAkvLypwdVR4QnVmKysgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgVHhEYXRhLT5idWYsIGkpOwotICAgIAkqcHVUeEJ1ZisrID0gKih1OF90KikoKHU4X3QqKVR4RGF0YS0+YnVmLT5kYXRhK2krVHhEYXRhLT5vZmZzZXQpOworICAgIGZvciAoaSA9IDA7IGkgPCBUeERhdGEtPmJ1Zi0+bGVuIC0gVHhEYXRhLT5vZmZzZXQ7IGkrKykgeworCS8qcHVUeEJ1ZisrID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIFR4RGF0YS0+YnVmLCBpKTsqLworCSpwdVR4QnVmKysgPSAqKHU4X3QgKikoKHU4X3QgKilUeERhdGEtPmJ1Zi0+ZGF0YStpK1R4RGF0YS0+b2Zmc2V0KTsKICAgICB9CiAKICAgICAvKiBDb3B5IHRhaWwgKi8KLSAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPnRhaWxMZW47IGkrKykKLSAgICB7Ci0gICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPnRhaWxbaV07CisgICAgZm9yIChpID0gMDsgaSA8IFR4RGF0YS0+dGFpbExlbjsgaSsrKSB7CisJKnB1VHhCdWYrKyA9IFR4RGF0YS0+dGFpbFtpXTsKICAgICB9CiAKICAgICBsZW4gPSBUeERhdGEtPmhkcmxlbitUeERhdGEtPnNuYXBMZW4rVHhEYXRhLT5idWYtPmxlbitUeERhdGEtPnRhaWxMZW4tVHhEYXRhLT5vZmZzZXQ7CiAKICAgICAjaWYgMAotICAgIGlmIChUeERhdGEtPmhkcmxlbiAhPSAwKQotICAgIHsKLSAgICAgICAgcHVUeEJ1ZiA9IG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl07Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKCIlMDJ4ICIsIHB1VHhCdWZbaV0pOwotICAgICAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKLSAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRrKCJcbiIpOwotICAgIH0KKyAgICBpZiAoVHhEYXRhLT5oZHJsZW4gIT0gMCkgeworCXB1VHhCdWYgPSBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlwcmludGsoIiUwMnggIiwgcHVUeEJ1ZltpXSk7CisJCWlmIChpICUgMTYgPT0gMTUpCisJCXByaW50aygiXG4iKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQogICAgICNlbmRpZgogICAgICNpZiAwCiAgICAgLyogRm9yIGRlYnVnIHB1cnBvc2UgKi8KLSAgICBpZihUeERhdGEtPmhkcls5XSAmIDB4NDApCi0gICAgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgdTE2X3QgY3RybExlbiA9IFR4RGF0YS0+aGRyWzBdICsgKFR4RGF0YS0+aGRyWzFdIDw8IDgpOworICAgIGlmIChUeERhdGEtPmhkcls5XSAmIDB4NDApIHsKKwlpbnQgaTsKKwl1MTZfdCBjdHJsTGVuID0gVHhEYXRhLT5oZHJbMF0gKyAoVHhEYXRhLT5oZHJbMV0gPDwgOCk7CiAKLSAgICAgICAgaWYgKGN0cmxMZW4gIT0gbGVuICsgNCkKLSAgICAgICAgewotICAgICAgICAvKiBEdW1wIGNvbnRyb2wgc2V0dGluZyAqLwotICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIFR4RGF0YS0+aGRyW2ldKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisJaWYgKGN0cmxMZW4gIT0gbGVuICsgNCkgeworCS8qIER1bXAgY29udHJvbCBzZXR0aW5nICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCBUeERhdGEtPmhkcltpXSk7CisJfQorCXByaW50ayhLRVJOX0VSUiAiXG4iKTsKIAotICAgICAgICBwcmludGsoS0VSTl9FUlIgImN0ckxlbjogJWQsIGhkckxlbjogJWQsIHNuYXBMZW46ICVkXG4iLCBjdHJsTGVuLCBUeERhdGEtPmhkcmxlbiwgVHhEYXRhLT5zbmFwTGVuKTsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJidWZMZW46ICVkLCB0YWlsTGVuOiAlZCwgbGVuOiAlZFxuIiwgVHhEYXRhLT5idWYtPmxlbiwgVHhEYXRhLT50YWlsTGVuLCBsZW4pOwotICAgICAgICB9CisJcHJpbnRrKEtFUk5fRVJSICJjdHJMZW46ICVkLCBoZHJMZW46ICVkLCBzbmFwTGVuOiAlZFxuIiwgY3RybExlbiwgVHhEYXRhLT5oZHJsZW4sIFR4RGF0YS0+c25hcExlbik7CisJcHJpbnRrKEtFUk5fRVJSICJidWZMZW46ICVkLCB0YWlsTGVuOiAlZCwgbGVuOiAlZFxuIiwgVHhEYXRhLT5idWYtPmxlbiwgVHhEYXRhLT50YWlsTGVuLCBsZW4pOworCX0KICAgICB9CiAgICAgI2VuZGlmCiAKICNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQotICAgIC8vIEFkZCB0aGUgTGVuZ3RoIGFuZCBUYWcKKyAgICAvKiBBZGQgdGhlIExlbmd0aCBhbmQgVGFnKi8KICAgICBsZW4gKz0gNDsKIAotICAgIC8vcHJpbnRrKCIlZCBwYWNrZXQsIGxlbmd0aDogJWRcbiIsIGlpKzEsIGxlbik7CisgICAgLypwcmludGsoIiVkIHBhY2tldCwgbGVuZ3RoOiAlZFxuIiwgaWkrMSwgbGVuKTsqLwogCi0gICAgaWYgKGlpIDwgKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQotICAgIHsKLSAgICAgICAgLyogUGFkIHRoZSBidWZmZXIgdG8gZmlybXdhcmUgZGVzY3JpcHRvciBib3VuZGFyeSAqLwotICAgICAgICBvZmZzZXQgKz0gKCgobGVuLTEpIC8gNCkgKyAxKSAqIDQ7CisgICAgaWYgKGlpIDwgKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKSB7CisJLyogUGFkIHRoZSBidWZmZXIgdG8gZmlybXdhcmUgZGVzY3JpcHRvciBib3VuZGFyeSAqLworCW9mZnNldCArPSAoKChsZW4tMSkgLyA0KSArIDEpICogNDsKICAgICB9CiAKLSAgICBpZiAoaWkgPT0gKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQotICAgIHsKLSAgICAgICAgbGVuICs9IG9mZnNldDsKKyAgICBpZiAoaWkgPT0gKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKSB7CisJbGVuICs9IG9mZnNldDsKICAgICB9CiAKICAgICBUeFFQb29sW2lpXSA9IFR4RGF0YTsKIAotICAgIC8vRGJnUHJpbnQoIiVkIHBhY2tldCwgb2Zmc2V0OiAlZFxuIiwgaWkrMSwgcFVzYlR4VHJhbnNmZXItPm9mZnNldCk7CisgICAgLypEYmdQcmludCgiJWQgcGFja2V0LCBvZmZzZXQ6ICVkXG4iLCBpaSsxLCBwVXNiVHhUcmFuc2Zlci0+b2Zmc2V0KTsqLwogCiAgICAgLyogZnJlZSBwYWNrZXQgKi8KLSAgICAvL3pmQnVmRnJlZShkZXYsIHR4RGF0YS0+YnVmKTsKKyAgICAvKnpmQnVmRnJlZShkZXYsIHR4RGF0YS0+YnVmKTsqLwogICAgIH0KICNlbmRpZgotICAgIC8vcHJpbnRrKCJDV1kgLSBjYWxsIHpmd1VzYlN1Ym1pdEJ1bGtVcmIoKSwgbGVuID0gMHglZFxuIiwgbGVuKTsKKyAgICAvKnByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRCdWxrVXJiKCksIGxlbiA9IDB4JWRcbiIsIGxlbik7Ki8KICAgICAvKiBTdWJtaXQgYSB0eCB1cmIgKi8KICAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIobWFjcC0+V2xhblR4RGF0YVVyYltmcmVlVHhVcmJdLCBtYWNwLT51ZGV2LAotICAgICAgICAgICAgVVNCX1dMQU5fVFhfUElQRSwgVVNCX0RJUl9PVVQsIG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl0sCi0gICAgICAgICAgICBsZW4sIHpmTG54VXNiRGF0YU91dF9jYWxsYmFjaywgZGV2KTsKLSAgICAvL0NXWWFuZygtKQorCVVTQl9XTEFOX1RYX1BJUEUsIFVTQl9ESVJfT1VULCBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdLAorCWxlbiwgemZMbnhVc2JEYXRhT3V0X2NhbGxiYWNrLCBkZXYpOworICAgIC8qQ1dZYW5nKC0pCiAgICAgLy9pZiAocmV0ICE9IDApCi0gICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7CisgICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7Ki8KIAogICAgIC8qIGZyZWUgcGFja2V0ICovCi0gICAgLy9kZXZfa2ZyZWVfc2tiX2FueShUeERhdGEtPmJ1Zik7CisgICAgLypkZXZfa2ZyZWVfc2tiX2FueShUeERhdGEtPmJ1Zik7Ki8KICNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQotICAgIGZvcihpaSA9IDA7IGlpIDwgdXNiVHhBZ2dDbnQ7IGlpKyspCi0gICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIFR4UVBvb2xbaWldLT5idWYsIDEsIFR4UVBvb2xbaWldLT5oZHIpOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHVzYlR4QWdnQ250OyBpaSsrKQorCW1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIFR4UVBvb2xbaWldLT5idWYsIDEsIFR4UVBvb2xbaWldLT5oZHIpOwogI2Vsc2UKICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBUeERhdGEtPmJ1ZiwgMSwgVHhEYXRhLT5oZHIpOwogI2VuZGlmCkBAIC03NjEsMjMgKzcwNSwyMyBAQAogCiAKIAotdTMyX3QgemZMbnhVc2JJbih6ZGV2X3QqIGRldiwgdXJiX3QgKnVyYiwgemJ1Zl90ICpidWYpCit1MzJfdCB6ZkxueFVzYkluKHpkZXZfdCAqZGV2LCB1cmJfdCAqdXJiLCB6YnVmX3QgKmJ1ZikKIHsKICAgICB1MzJfdCByZXQ7CiAgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCiAgICAgLyogU3VibWl0IGEgcnggdXJiICovCiAgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKHVyYiwgbWFjcC0+dWRldiwgVVNCX1dMQU5fUlhfUElQRSwKLSAgICAgICAgICAgIFVTQl9ESVJfSU4sIGJ1Zi0+ZGF0YSwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2ssIGRldik7Ci0gICAgLy9DV1lhbmcoLSkKKwlVU0JfRElSX0lOLCBidWYtPmRhdGEsIFpNX01BWF9SWF9CVUZGRVJfU0laRSwKKwl6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaywgZGV2KTsKKyAgICAvKkNXWWFuZygtKQogICAgIC8vaWYgKHJldCAhPSAwKQotICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOworICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOyovCiAKICAgICByZXR1cm4gcmV0OwogfQogCi11MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit1MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCAqZGV2LCB1MzJfdCAqY21kLCB1MTZfdCBjbWRMZW4pCiB7CiAgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogICAgIHUzMl90IHJldDsKQEAgLTc4NSw3ICs3MjksNyBAQAogI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCiAgICAgaW50IGlpID0gMDsKIAotICAgIGZvcihpaT0wOyBpaTwoY21kTGVuPj4yKTsgaWkrKykKKyAgICBmb3IgKGlpID0gMDsgaWkgPCAoY21kTGVuPj4yKTsgaWkrKykKIAljbWRbaWldID0gY3B1X3RvX2xlMzIoY21kW2lpXSk7CiAjZW5kaWYKIApAQCAtNzk0LDM5ICs3MzgsMzggQEAKICAgICAvKiBJc3N1ZSBhbiBVU0IgT3V0IHRyYW5zZmVyICovCiAgICAgLyogU3VibWl0IGEgdHggdXJiICovCiAgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRJbnRVcmIobWFjcC0+UmVnT3V0VXJiLCBtYWNwLT51ZGV2LAotICAgICAgICAgICAgVVNCX1JFR19PVVRfUElQRSwgVVNCX0RJUl9PVVQsIG1hY3AtPnJlZ1VzYldyaXRlQnVmLAotICAgICAgICAgICAgY21kTGVuLCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjaywgZGV2LCAxKTsKKwlVU0JfUkVHX09VVF9QSVBFLCBVU0JfRElSX09VVCwgbWFjcC0+cmVnVXNiV3JpdGVCdWYsCisJY21kTGVuLCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjaywgZGV2LCAxKTsKIAogICAgIHJldHVybiByZXQ7CiB9CiAKIAotdTMyX3QgemZMbnhVc2JPdXQoemRldl90KiBkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAotICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQordTMyX3QgemZMbnhVc2JPdXQoemRldl90ICpkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAorCXU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCiB7CiAgICAgdTMyX3QgcmV0OwogICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAogICAgIC8qIENoZWNrIGxlbmd0aCBvZiB0YWlsIGJ1ZmZlciAqLwotICAgIC8vem1fYXNzZXJ0KCh0YWlsTGVuIDw9IDE2KSk7CisgICAgLyp6bV9hc3NlcnQoKHRhaWxMZW4gPD0gMTYpKTsqLwogCiAgICAgLyogRW5xdWV1ZSB0aGUgcGFja2V0IGludG8gVXNiVHhCdWZRICovCi0gICAgaWYgKHpmTG54UHV0VXNiVHhCdWZmZXIoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpID09IDB4ZmZmZikKLSAgICB7Ci0gICAgICAgIC8qIGZyZWUgcGFja2V0ICovCi0gICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciBFcnJvciwgZnJlZSBwYWNrZXRcbiIpOwotICAgICAgICAvL2Rldl9rZnJlZV9za2JfYW55KGJ1Zik7Ci0gICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIGJ1ZiwgMCwgaGRyKTsKLSAgICAgICAgcmV0dXJuIDB4ZmZmZjsKLSAgICB9CisgICAgaWYgKHpmTG54UHV0VXNiVHhCdWZmZXIoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpID09IDB4ZmZmZikgeworCS8qIGZyZWUgcGFja2V0ICovCisJLypwcmludGsoIkNXWSAtIHpmd1B1dFVzYlR4QnVmZmVyIEVycm9yLCBmcmVlIHBhY2tldFxuIik7CisJLy9kZXZfa2ZyZWVfc2tiX2FueShidWYpOyovCisJbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgYnVmLCAwLCBoZHIpOworCXJldHVybiAweGZmZmY7CisJfQogCi0gICAgLy9yZXR1cm4gMDsKLSAgICAvL3ByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRUeERhdGEoKVxuIik7CisgICAgLypyZXR1cm4gMDsKKyAgICAvL3ByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRUeERhdGEoKVxuIik7Ki8KICAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdFR4RGF0YShkZXYpOwogICAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgemZMbnhJbml0VXNiVHhRKHpkZXZfdCogZGV2KQordm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90ICpkZXYpCiB7CiAgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCkBAIC04NDIsNyArNzg1LDcgQEAKICAgICBtYWNwLT5UeFVyYkNudCA9IFpNX01BWF9UWF9VUkJfTlVNOwogfQogCi12b2lkIHpmTG54SW5pdFVzYlJ4USh6ZGV2X3QqIGRldikKK3ZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCAqZGV2KQogewogICAgIHUxNl90IGk7CiAgICAgemJ1Zl90ICpidWY7CkBAIC04NTMsNzYgKzc5Niw2NSBAQAogCiAgICAgbWFjcC0+UnhCdWZIZWFkID0gMDsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQotICAgIHsKLSAgICAgICAgLy9idWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX01BWF9SWF9CVUZGRVJfU0laRSk7Ci0gICAgICAgIGJ1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKLSAgICAgICAgbWFjcC0+VXNiUnhCdWZRW2ldID0gYnVmOwotICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykgeworCS8qYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOyovCisJYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCW1hY3AtPlVzYlJ4QnVmUVtpXSA9IGJ1ZjsKKwl9CiAKLSAgICAvL21hY3AtPlJ4QnVmVGFpbCA9IFpNX01BWF9SWF9VUkJfTlVNIC0gMTsKKyAgICAvKm1hY3AtPlJ4QnVmVGFpbCA9IFpNX01BWF9SWF9VUkJfTlVNIC0gMTsqLwogICAgIG1hY3AtPlJ4QnVmVGFpbCA9IDA7CiAKICAgICAvKiBTdWJtaXQgYWxsIFJ4IHVyYnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKLSAgICB7Ci0gICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBtYWNwLT5Vc2JSeEJ1ZlFbaV0pOwotICAgICAgICB6ZkxueFVzYkluKGRldiwgbWFjcC0+V2xhblJ4RGF0YVVyYltpXSwgbWFjcC0+VXNiUnhCdWZRW2ldKTsKLSAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspIHsKKwl6ZkxueFB1dFVzYlJ4QnVmZmVyKGRldiwgbWFjcC0+VXNiUnhCdWZRW2ldKTsKKwl6ZkxueFVzYkluKGRldiwgbWFjcC0+V2xhblJ4RGF0YVVyYltpXSwgbWFjcC0+VXNiUnhCdWZRW2ldKTsKKwl9CiB9CiAKIAogCiB1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKLSAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpCisJdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpCiB7CiAgICAgdTMyX3QgcmV0OwogCi0gICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQotICAgIHsKLSAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKLSAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKKyAgICBpZiAoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKSB7CisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKKwkJdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCk7CiAKLSAgICAgICAgdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCBlcG51bSksCi0gICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCk7CisJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CisgICAgfSBlbHNlIHsKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVzYiwgdXNiX3JjdmJ1bGtwaXBlKHVzYiwgZXBudW0pLAorCQl0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKICAgICB9CiAKLSAgICBpZiAoZXBudW0gPT0gNCkKLSAgICB7Ci0gICAgICAgIGlmICh1cmItPmhjcHJpdikKLSAgICAgICAgewotICAgICAgICAgICAgLy9wcmludGsoIkNXWSAtIHVyYi0+aGNwcml2IHNldCBieSB1bmtub3duIHJlYXNvbiwgcmVzZXQgaXRcbiIpOwotICAgICAgICAgICAgLy91cmItPmhjcHJpdiA9IDA7Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKGVwbnVtID09IDQpIHsKKwlpZiAodXJiLT5oY3ByaXYpIHsKKwkJLypwcmludGsoIkNXWSAtIHVyYi0+aGNwcml2IHNldCBieSB1bmtub3duIHJlYXNvbiwgcmVzZXQgaXRcbiIpOworCQkvL3VyYi0+aGNwcml2ID0gMDsqLworCQl9CisJfQogCiAgICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLSAgICBpZiAoKGVwbnVtID09IDQpICYgKHJldCAhPSAwKSkKLSAgICB7Ci0gICAgICAgIC8vcHJpbnRrKCJDV1kgLSByZXQgPSAleFxuIiwgcmV0KTsKKyAgICBpZiAoKGVwbnVtID09IDQpICYgKHJldCAhPSAwKSkgeworCS8qcHJpbnRrKCJDV1kgLSByZXQgPSAleFxuIiwgcmV0KTsqLwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCiB1MzJfdCB6ZkxueFVzYlN1Ym1pdEludFVyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAotICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCwKLSAgICAgICAgdTMyX3QgaW50ZXJ2YWwpCisJdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCisJdTMyX3QgaW50ZXJ2YWwpCiB7CiAgICAgdTMyX3QgcmV0OwogCi0gICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQotICAgIHsKLSAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3NuZGJ1bGtwaXBlKHVzYiwgZXBudW0pLAotICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3JjdmJ1bGtwaXBlKHVzYiwgZXBudW0pLAotICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKKyAgICBpZiAoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKSB7CisJdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3NuZGJ1bGtwaXBlKHVzYiwgZXBudW0pLAorCQl0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0LCBpbnRlcnZhbCk7CisgICAgfSBlbHNlIHsKKwl1c2JfZmlsbF9pbnRfdXJiKHVyYiwgdXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCBlcG51bSksCisJdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCwgaW50ZXJ2YWwpOwogICAgIH0KIAogICAgIHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CkBAIC05NDYsNTEgKzg3OCw0OCBAQAogCXNpemUgPSBOTE1TR19TUEFDRShsZW4pOwogCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKIAotCWlmKHNrYiA9PSBOVUxMKQotCXsKKwlpZiAoc2tiID09IE5VTEwpIHsKIAkJcHJpbnRrKCJkZXZfYWxsb2Nfc2tiIGZhaWx1cmUgXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCW9sZF90YWlsID0gc2tiLT50YWlsOwogCi0JLyrM7tC0yv2+3bGoz+C52NDFz6IqLworCS8qICovCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgV0FJX0tfTVNHLCBzaXplLXNpemVvZigqbmxoKSk7CiAJcG9zID0gTkxNU0dfREFUQShubGgpOwogCi0JLyq0q8rktb3Tw7unv9W85LXEyv2+3SovCisJLyogKi8KIAltZW1jcHkocG9zLCBtc2csICBsZW4pOwotCS8qvMbL476tuf3X1r3attTG5LrztcTK/b7dyrW8yrOktsgqLworCS8qICovCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBvbGRfdGFpbDsKIAlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gQ09NTVRZUEVfR1JPVVA7CiAJbmV0bGlua19icm9hZGNhc3QobmV0bGlua19zaywgc2tiLCAwLCBDT01NVFlQRV9HUk9VUCwgR0ZQX0FUT01JQyk7CiAJcmV0ID0gMDsKIG91dDoKIAlyZXR1cm4gcmV0Owotbmxtc2dfZmFpbHVyZTogLypOTE1TR19QVVQgyqew3KOs1PKzt8/6zNe909fWu7q05iovCitubG1zZ19mYWlsdXJlOiAvKiAqLwogCWtmcmVlX3NrYihza2IpOwogCWdvdG8gb3V0OwogCiAjdW5kZWYgQ09NTVRZUEVfR1JPVVAKICN1bmRlZiBXQUlfS19NU0cKIH0KLSNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjZW5kaWYgLypaTV9FTkFCTEVfQ0VOQyovCiAKIC8qIFNpbXBseSByZXR1cm4gMHhmZmZmIGlmIFZBUCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCi11MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KQordTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QgKmRldikKIHsKICAgICB1MTZfdCBpOwogCi0gICAgZm9yIChpPTA7IGk8Wk1fVkFQX1BPUlRfTlVNQkVSOyBpKyspCi0gICAgewotICAgICAgICBpZiAodmFwW2ldLmRldiA9PSBkZXYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAweGZmZmY7CisgICAgZm9yIChpID0gMDsgaSA8IFpNX1ZBUF9QT1JUX05VTUJFUjsgaSsrKSB7CisJaWYgKHZhcFtpXS5kZXYgPT0gZGV2KSB7CisJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAweGZmZmY7CiB9CiAKLXUzMl90IHpmd1JlYWRSZWcoemRldl90KiBkZXYsIHUzMl90IG9mZnNldCkKK3UzMl90IHpmd1JlYWRSZWcoemRldl90ICpkZXYsIHUzMl90IG9mZnNldCkKIHsKICAgICByZXR1cm4gMDsKIH0KQEAgLTEwMTIsMjUgKzk0MSwyMyBAQAogdm9pZCBrZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9Ci0gICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmRydl9wcml2YXRlLCBrZXZlbnQpOwotICAgIHpkZXZfdCAqZGV2ID0gbWFjcC0+ZGV2aWNlOworCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUsIGtldmVudCk7CisJemRldl90ICpkZXYgPSBtYWNwLT5kZXZpY2U7CiAKLSAgICBpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSZzbXBfa2V2ZW50X0xvY2spKQotICAgIHsKLSAgICAgICAgLy9zY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmc21wX2tldmVudF9Mb2NrKSkgeworCS8qc2NoZWR1bGVfd29yaygmbWFjcC0+a2V2ZW50KTsqLworCXJldHVybjsKICAgICB9CiAKICAgICBkb3duKCZtYWNwLT5pb2N0bF9zZW0pOwogCi0gICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLRVZFTlRfV0FUQ0hET0csICZtYWNwLT5rZXZlbnRfZmxhZ3MpKQotICAgIHsKKyAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtFVkVOVF9XQVRDSERPRywgJm1hY3AtPmtldmVudF9mbGFncykpIHsKICAgICBleHRlcm4gdTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QgKmRldik7Ci0gICAgICAgIC8vemZpSHdXYXRjaERvZ1JlaW5pdChkZXYpOwotICAgICAgICBwcmludGsoKCJcbiAqKioqKioqKioqKiogSHcgd2F0Y2hEb2cgb2NjdXIhISAqKioqKioqKioqKioqKiBcbiIpKTsKLSAgICAgICAgemZpV2xhblN1c3BlbmQoZGV2KTsKLSAgICAgICAgemZpV2xhblJlc3VtZShkZXYsMCk7Ci0gICAgICAgIHpmSHBTdGFydFJlY3YoZGV2KTsKKwkvKnpmaUh3V2F0Y2hEb2dSZWluaXQoZGV2KTsqLworCXByaW50aygoIlxuICoqKioqKioqKioqKiBIdyB3YXRjaERvZyBvY2N1ciEhICoqKioqKioqKioqKioqIFxuIikpOworCXpmaVdsYW5TdXNwZW5kKGRldik7CisJemZpV2xhblJlc3VtZShkZXYgLCAwKTsKKwl6ZkhwU3RhcnRSZWN2KGRldik7CiAgICAgfQogCiAgICAgY2xlYXJfYml0KDAsICh2b2lkICopJnNtcF9rZXZlbnRfTG9jayk7CkBAIC0xMDgzLDQxICsxMDEwLDM4IEBACiB7CiAgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCi0gICAgaWYgKG1hY3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50aygibWFjcCBpcyBOVUxMXG4iKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChtYWNwID09IE5VTEwpIHsKKwlwcmludGsoIm1hY3AgaXMgTlVMTFxuIik7CisJcmV0dXJuOwogICAgIH0KIAotICAgIGlmICgwICYmIG1hY3AtPmtldmVudF9yZWFkeSAhPSAxKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJLZXZlbnQgbm90IHJlYWR5XG4iKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmICgwICYmIG1hY3AtPmtldmVudF9yZWFkeSAhPSAxKSB7CisJcHJpbnRrKCJLZXZlbnQgbm90IHJlYWR5XG4iKTsKKwlyZXR1cm47CiAgICAgfQogCiAgICAgc2V0X2JpdChmbGFnLCAmbWFjcC0+a2V2ZW50X2ZsYWdzKTsKIAotICAgIGlmICghc2NoZWR1bGVfd29yaygmbWFjcC0+a2V2ZW50KSkKLSAgICB7Ci0gICAgICAgIC8vRmFpbHMgaXMgTm9ybWFsCi0gICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJzY2hlZHVsZV90YXNrIGZhaWxlZCwgZmxhZyA9ICV4XG4iLCBmbGFnKTsKLSAgICB9CisgICAgaWYgKCFzY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpKSB7CisJLypGYWlscyBpcyBOb3JtYWwKKwkvL3ByaW50ayhLRVJOX0VSUiAic2NoZWR1bGVfdGFzayBmYWlsZWQsIGZsYWcgPSAleFxuIiwgZmxhZyk7Ki8KKwl9CiB9CiAKIC8qIE5vdGlmeSB3cmFwcGVyIHRvZG8gcmVkb3dubG9hZCBmaXJtd2FyZSBhbmQgcmVpbml0IHByb2NlZHVyZSB3aGVuICovCiAvKiBoYXJkd2FyZSB3YXRjaGRvZyBvY2N1ciA6IHpmaUh3V2F0Y2hEb2dSZWluaXQoKSAqLwotdm9pZCB6ZkxueFdhdGNoRG9nTm90aWZ5KHpkZXZfdCogZGV2KQordm9pZCB6ZkxueFdhdGNoRG9nTm90aWZ5KHpkZXZfdCAqZGV2KQogewogICAgIHpmTG54U2lnbmFsVGhyZWFkKGRldiwgS0VWRU5UX1dBVENIRE9HKTsKIH0KIAogLyogUXVlcnkgRHVyYW50aW9uIG9mIEFjdGl2ZSBTY2FuICovCi12b2lkIHpmd0dldEFjdGl2ZVNjYW5EdXIoemRldl90KiBkZXYsIHU4X3QqIER1cikKK3ZvaWQgemZ3R2V0QWN0aXZlU2NhbkR1cih6ZGV2X3QgKmRldiwgdThfdCAqRHVyKQogewotICAgICpEdXIgPSAzMDsgLy8gZGVmYXVsdCAzMCBtcworICAgICpEdXIgPSAzMDsgLyogZGVmYXVsdCAzMCBtcyovCiB9CiAKLXZvaWQgemZ3R2V0U2hvd1plcm9MZW5ndGhTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBEdXIpCit2b2lkIHpmd0dldFNob3daZXJvTGVuZ3RoU1NJRCh6ZGV2X3QgKmRldiwgdThfdCAqRHVyKQogewogICAgICpEdXIgPSAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmMKaW5kZXggMmM3OTlhMi4uNDAxNGI3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5jCkBAIC00OCw3ICs0OCw3IEBACiAvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgemQxMjIxX2lkc1tdID0gewogCXsgVVNCX0RFVklDRShWRU5ET1JfQVRIUiwgUFJPRFVDVF9BUjkxNzApIH0sCi0gICAgICAgIHsgVVNCX0RFVklDRShWRU5ET1JfRExJTkssIFBST0RVQ1RfRFdBMTYwQSkgfSwKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0RMSU5LLCBQUk9EVUNUX0RXQTE2MEEpIH0sCiAJeyBVU0JfREVWSUNFKFZFTkRPUl9ORVRHRUFSLCBQUk9EVUNUX1dOREEzMTAwKSB9LAogCXsgVVNCX0RFVklDRShWRU5ET1JfTkVUR0VBUiwgUFJPRFVDVF9XTjExMXYyKSB9LAogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KQEAgLTYwLDkgKzYwLDkgQEAKIGV4dGVybiBpbnQgdXNiZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHU4X3QgemZMbnhDbGVhclN0cnVjdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHpmV2RzQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHpmVW5yZWdpc3Rlcldkc0RldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB3ZHNJZCk7CitleHRlcm4gaW50IHpmVW5yZWdpc3Rlcldkc0RldihzdHJ1Y3QgbmV0X2RldmljZSAqcGFyZW50RGV2LCB1MTZfdCB3ZHNJZCk7CiBleHRlcm4gaW50IHpmTG54VmFwQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHpmTG54VW5yZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB2YXBJZCk7CitleHRlcm4gaW50IHpmTG54VW5yZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSAqcGFyZW50RGV2LCB1MTZfdCB2YXBJZCk7CiAKIC8qIFdEUyAqLwogZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKQEAgLTczLDE0OCArNzMsMTM1IEBACiBzdGF0aWMgaW50IHpmTG54UHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKIAljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7Ci0gICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCi0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IE5VTEw7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gTlVMTDsKLSAgICBpbnQgdmVuZG9yX2lkLCBwcm9kdWN0X2lkOwotICAgIGludCByZXN1bHQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBOVUxMOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IE5VTEw7CisJaW50IHZlbmRvcl9pZCwgcHJvZHVjdF9pZDsKKwlpbnQgcmVzdWx0ID0gMDsKIAotICAgIHVzYl9nZXRfZGV2KGRldik7CisJdXNiX2dldF9kZXYoZGV2KTsKIAotICAgIHZlbmRvcl9pZCA9IGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcjsKLSAgICBwcm9kdWN0X2lkID0gZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKwl2ZW5kb3JfaWQgPSBkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3I7CisJcHJvZHVjdF9pZCA9IGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3Q7CiAKLSNpZmRlZiBITUFDX0RFQlVHCi0gICAgcHJpbnRrKEtFUk5fTk9USUNFICJ2ZW5kb3JfaWQgPSAlMDR4XG4iLCB2ZW5kb3JfaWQpOwotICAgIHByaW50ayhLRVJOX05PVElDRSAicHJvZHVjdF9pZCA9ICUwNHhcbiIsIHByb2R1Y3RfaWQpOworCSNpZmRlZiBITUFDX0RFQlVHCisJCXByaW50ayhLRVJOX05PVElDRSAidmVuZG9yX2lkID0gJTA0eFxuIiwgdmVuZG9yX2lkKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJwcm9kdWN0X2lkID0gJTA0eFxuIiwgcHJvZHVjdF9pZCk7CiAKLSAgICBpZiAoZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJVU0IgMi4wIEhvc3RcbiIpOwotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJVU0IgMS4xIEhvc3RcbiIpOwotI2VuZGlmCisJaWYgKGRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCXByaW50ayhLRVJOX05PVElDRSAiVVNCIDIuMCBIb3N0XG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX05PVElDRSAiVVNCIDEuMSBIb3N0XG4iKTsKKwkjZW5kaWYKIAotICAgIG1hY3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoIW1hY3ApCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIgIm91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkZXZpY2Ugc3RydWN0dXJlXG4iKTsKLSAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KKwltYWNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmRydl9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYWNwKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGRldmljZSBzdHJ1Y3R1cmVcbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQogCi0gICAgbmV0ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJbmV0ID0gYWxsb2NfZXRoZXJkZXYoMCk7CiAKLSAgICBpZiAobmV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIgInpmTG54UHJvYmU6IE5vdCBhYmxlIHRvIGFsbG9jIGV0aGVyZGV2IHN0cnVjdFxuIik7Ci0gICAgICAgIHJlc3VsdCA9IC1FTk9NRU07Ci0gICAgICAgIGdvdG8gZmFpbDE7Ci0gICAgfQorCWlmIChuZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInpmTG54UHJvYmU6IE5vdCBhYmxlIHRvIGFsbG9jIGV0aGVyZGV2IHN0cnVjdFxuIik7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDE7CisJfQogCi0gICAgc3RyY3B5KG5ldC0+bmFtZSwgImF0aCVkIik7CisJc3RyY3B5KG5ldC0+bmFtZSwgImF0aCVkIik7CiAKLSAgICBuZXQtPm1sX3ByaXYgPSBtYWNwOyAgIC8va2VybmVsIDIuNgotICAgIG1hY3AtPnVkZXYgPSBkZXY7Ci0gICAgbWFjcC0+ZGV2aWNlID0gbmV0OworCW5ldC0+bWxfcHJpdiA9IG1hY3A7ICAgLyoga2VybmVsIDIuNiAqLworCW1hY3AtPnVkZXYgPSBkZXY7CisJbWFjcC0+ZGV2aWNlID0gbmV0OwogCi0gICAgLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLwotICAgIC8qIGNoZWNrIG91dCB0aGUgZW5kcG9pbnRzICovCi0gICAgbWFjcC0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwkvKiBjaGVjayBvdXQgdGhlIGVuZHBvaW50cyAqLworCW1hY3AtPmludGVyZmFjZSA9IGludGVyZmFjZTsKIAotICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+cmVnU2V0X3dhaXQpOwotICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+aW9yd1JzcF93YWl0KTsKLSAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJm1hY3AtPnRlcm1fd2FpdCk7CisJLyogaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+cmVnU2V0X3dhaXQpOyAqLworCS8qIGluaXRfd2FpdHF1ZXVlX2hlYWQoJm1hY3AtPmlvcndSc3Bfd2FpdCk7ICovCisJLyogaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+dGVybV93YWl0KTsgKi8KIAotICAgIGlmICghemZMbnhBbGxvY0FsbFVyYnMobWFjcCkpCi0gICAgewotICAgICAgICByZXN1bHQgPSAtRU5PTUVNOwotICAgICAgICBnb3RvIGZhaWwyOwotICAgIH0KKwlpZiAoIXpmTG54QWxsb2NBbGxVcmJzKG1hY3ApKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDI7CisJfQogCi0gICAgaWYgKCF6ZkxueEluaXRTZXR1cChuZXQsIG1hY3ApKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gLUVJTzsKLSAgICAgICAgZ290byBmYWlsMzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIG1hY3ApOwotICAgICAgICBTRVRfTkVUREVWX0RFVihuZXQsICZpbnRlcmZhY2UtPmRldik7CisJaWYgKCF6ZkxueEluaXRTZXR1cChuZXQsIG1hY3ApKSB7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZmFpbDM7CisJfSBlbHNlIHsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIG1hY3ApOworCQlTRVRfTkVUREVWX0RFVihuZXQsICZpbnRlcmZhY2UtPmRldik7CiAKLSAgICAgICAgaWYgKHJlZ2lzdGVyX25ldGRldihuZXQpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDM7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmIChyZWdpc3Rlcl9uZXRkZXYobmV0KSAhPSAwKSB7CisJCQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJCQlnb3RvIGZhaWwzOworCQl9CisJfQogCi0gICAgbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKLSAgICBnb3RvIGRvbmU7Ci0KKwluZXRpZl9jYXJyaWVyX29mZihuZXQpOworCSAgICBnb3RvIGRvbmU7CiBmYWlsMzoKLSAgICB6ZkxueEZyZWVBbGxVcmJzKG1hY3ApOworCXpmTG54RnJlZUFsbFVyYnMobWFjcCk7CiBmYWlsMjoKLSAgICBmcmVlX25ldGRldihuZXQpOyAgLy9rZXJuZWwgMi42CisJZnJlZV9uZXRkZXYobmV0KTsgIC8qIGtlcm5lbCAyLjYgKi8KIGZhaWwxOgotICAgIGtmcmVlKG1hY3ApOwotCisJa2ZyZWUobWFjcCk7CiBmYWlsOgotICAgIHVzYl9wdXRfZGV2KGRldik7Ci0gICAgbWFjcCA9IE5VTEw7Ci0KKwl1c2JfcHV0X2RldihkZXYpOworCW1hY3AgPSBOVUxMOwogZG9uZToKLSAgICByZXR1cm4gcmVzdWx0OworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIHpmTG54RGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikgdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikgdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCi0gICAgcHJpbnRrKEtFUk5fREVCVUcgInpmTG54RGlzY29ubmVjdFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInpmTG54RGlzY29ubmVjdFxuIik7CiAKLSAgICBpZiAoIW1hY3ApCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIgInVucmVnaXN0ZXJpbmcgbm9uLWV4aXN0YW50IGRldmljZVxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisJaWYgKCFtYWNwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidW5yZWdpc3RlcmluZyBub24tZXhpc3RhbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KIAotICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpCi0gICAgewotICAgICAgICBpZiAobWFjcC0+ZGV2aWNlLT5mbGFncyAmIElGRl9VUCkKLSAgICAgICAgICAgIHVzYmRydl9jbG9zZShtYWNwLT5kZXZpY2UpOwotICAgIH0KKwlpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKQorCQlpZiAobWFjcC0+ZGV2aWNlLT5mbGFncyAmIElGRl9VUCkKKwkJCXVzYmRydl9jbG9zZShtYWNwLT5kZXZpY2UpOwogCi0jaWYgMAotICAgIC8qIENsb3NlIFdEUyAqLwotICAgIC8vemZXZHNDbG9zZSh3ZHNbMF0uZGV2KTsKLSAgICAvKiBVbnJlZ2lzdGVyIFdEUyAqLwotICAgIC8vemZVbnJlZ2lzdGVyV2RzRGV2KG1hY3AtPmRldmljZSwgMCk7CisJI2lmIDAKKwkJLyogQ2xvc2UgV0RTICovCisJCS8qIHpmV2RzQ2xvc2Uod2RzWzBdLmRldik7ICovCisJCS8qIFVucmVnaXN0ZXIgV0RTICovCisJCS8qIHpmVW5yZWdpc3Rlcldkc0RldihtYWNwLT5kZXZpY2UsIDApOyAqLwogCi0gICAgLyogQ2xvc2UgVkFQICovCi0gICAgemZMbnhWYXBDbG9zZSh2YXBbMF0uZGV2KTsKLSAgICAvKiBVbnJlZ2lzdGVyIFZBUCAqLwotICAgIHpmTG54VW5yZWdpc3RlclZhcERldihtYWNwLT5kZXZpY2UsIDApOwotI2VuZGlmCisJCS8qIENsb3NlIFZBUCAqLworCQl6ZkxueFZhcENsb3NlKHZhcFswXS5kZXYpOworCQkvKiBVbnJlZ2lzdGVyIFZBUCAqLworCQl6ZkxueFVucmVnaXN0ZXJWYXBEZXYobWFjcC0+ZGV2aWNlLCAwKTsKKwkjZW5kaWYKIAotICAgIHpmTG54Q2xlYXJTdHJ1Y3RzKG1hY3AtPmRldmljZSk7CisJemZMbnhDbGVhclN0cnVjdHMobWFjcC0+ZGV2aWNlKTsKIAotICAgIHVucmVnaXN0ZXJfbmV0ZGV2KG1hY3AtPmRldmljZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYobWFjcC0+ZGV2aWNlKTsKIAotICAgIHVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKIAotICAgIC8vcHJpbnRrKEtFUk5fRVJSICIzLiB6ZkxueFVubGlua0FsbFVyYnNcbiIpOwotICAgIC8vemZMbnhVbmxpbmtBbGxVcmJzKG1hY3ApOworCS8qIHByaW50ayhLRVJOX0VSUiAiMy4gemZMbnhVbmxpbmtBbGxVcmJzXG4iKTsgKi8KKwkvKiB6ZkxueFVubGlua0FsbFVyYnMobWFjcCk7ICovCiAKLSAgICAvKiBGcmVlIG5ldHdvcmsgaW50ZXJmYWNlICovCi0gICAgZnJlZV9uZXRkZXYobWFjcC0+ZGV2aWNlKTsKKwkvKiBGcmVlIG5ldHdvcmsgaW50ZXJmYWNlICovCisJZnJlZV9uZXRkZXYobWFjcC0+ZGV2aWNlKTsKIAotICAgIHpmTG54RnJlZUFsbFVyYnMobWFjcCk7Ci0gICAgLy96ZkxueENsZWFyU3RydWN0cyhtYWNwLT5kZXZpY2UpOwotICAgIGtmcmVlKG1hY3ApOwotICAgIG1hY3AgPSBOVUxMOworCXpmTG54RnJlZUFsbFVyYnMobWFjcCk7CisJLyogemZMbnhDbGVhclN0cnVjdHMobWFjcC0+ZGV2aWNlKTsgKi8KKwlrZnJlZShtYWNwKTsKKwltYWNwID0gTlVMTDsKIAotICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB6ZDEyMjFfZHJpdmVyID0gewpAQCAtMjI2LDEzICsyMTMsMTMgQEAKIAogaW50IF9faW5pdCB6ZkxueElpbml0KHZvaWQpCiB7Ci0gICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyAtIHZlcnNpb24gJXNcbiIsICBEUklWRVJfTkFNRSwgVkVSU0lPTklEKTsKLSAgICByZXR1cm4gdXNiX3JlZ2lzdGVyKCZ6ZDEyMjFfZHJpdmVyKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIC0gdmVyc2lvbiAlc1xuIiwgIERSSVZFUl9OQU1FLCBWRVJTSU9OSUQpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnpkMTIyMV9kcml2ZXIpOwogfQogCiB2b2lkIF9fZXhpdCB6ZkxueEV4aXQodm9pZCkKIHsKLSAgICB1c2JfZGVyZWdpc3RlcigmemQxMjIxX2RyaXZlcik7CisJdXNiX2RlcmVnaXN0ZXIoJnpkMTIyMV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdCh6ZkxueElpbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKaW5kZXggOWNhMGU5ZS4uMzIyMTgxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KQEAgLTY4LDExICs2OSwxNiBAQAogI2RlZmluZSBMQ0RfTUFYQllURVMJCTI1NgkvKiBtYXggYnVyc3Qgd3JpdGUgKi8KIAogI2RlZmluZSBLRVlQQURfQlVGRkVSCQk2NAotI2RlZmluZSBJTlBVVF9QT0xMX1RJTUUJCShIWi81MCkJLyogcG9sbCB0aGUga2V5Ym9hcmQgdGhpcyBldmVyeSBzZWNvbmQgKi8KLSNkZWZpbmUgS0VZUEFEX1JFUF9TVEFSVAkoMTApCS8qIGEga2V5IHN0YXJ0cyB0byByZXBlYXQgYWZ0ZXIgdGhpcyB0aW1lcyBJTlBVVF9QT0xMX1RJTUUgKi8KLSNkZWZpbmUgS0VZUEFEX1JFUF9ERUxBWQkoMikJLyogYSBrZXkgcmVwZWF0cyB0aGlzIHRpbWVzIElOUFVUX1BPTExfVElNRSAqLwogCi0jZGVmaW5lIEZMQVNIX0xJR0hUX1RFTVBPCSgyMDApCS8qIGtlZXAgdGhlIGxpZ2h0IG9uIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FIGZvciBlYWNoIGZsYXNoICovCisvKiBwb2xsIHRoZSBrZXlib2FyZCB0aGlzIGV2ZXJ5IHNlY29uZCAqLworI2RlZmluZSBJTlBVVF9QT0xMX1RJTUUJCShIWi81MCkKKy8qIGEga2V5IHN0YXJ0cyB0byByZXBlYXQgYWZ0ZXIgdGhpcyB0aW1lcyBJTlBVVF9QT0xMX1RJTUUgKi8KKyNkZWZpbmUgS0VZUEFEX1JFUF9TVEFSVAkoMTApCisvKiBhIGtleSByZXBlYXRzIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FICovCisjZGVmaW5lIEtFWVBBRF9SRVBfREVMQVkJKDIpCisKKy8qIGtlZXAgdGhlIGxpZ2h0IG9uIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FIGZvciBlYWNoIGZsYXNoICovCisjZGVmaW5lIEZMQVNIX0xJR0hUX1RFTVBPCSgyMDApCiAKIC8qIGNvbnZlcnRzIGFuIHJfc3RyKCkgaW5wdXQgdG8gYW4gYWN0aXZlIGhpZ2gsIGJpdHMgc3RyaW5nIDogMDAwQkFPU0UgKi8KICNkZWZpbmUgUE5MX1BJTlBVVChhKQkJKCgoKHVuc2lnbmVkIGNoYXIpKGEpKSBeIDB4N0YpID4+IDMpCkBAIC04NCw3ICs5MCw4IEBACiAjZGVmaW5lIFBOTF9QRVJST1JQCQkweDA4CS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGxvdyAqLwogCiAjZGVmaW5lIFBOTF9QQklESVIJCTB4MjAJLyogYmktZGlyZWN0aW9uYWwgcG9ydHMgKi8KLSNkZWZpbmUgUE5MX1BJTlRFTgkJMHgxMAkvKiBoaWdoIHRvIHJlYWQgZGF0YSBpbiBvci1lZCB3aXRoIGRhdGEgb3V0ICovCisvKiBoaWdoIHRvIHJlYWQgZGF0YSBpbiBvci1lZCB3aXRoIGRhdGEgb3V0ICovCisjZGVmaW5lIFBOTF9QSU5URU4JCTB4MTAKICNkZWZpbmUgUE5MX1BTRUxFQ1AJCTB4MDgJLyogaW52ZXJ0ZWQgb3V0cHV0LCBhY3RpdmUgbG93ICovCiAjZGVmaW5lIFBOTF9QSU5JVFAJCTB4MDQJLyogZGlyZWN0IG91dHB1dCwgYWN0aXZlIGxvdyAqLwogI2RlZmluZSBQTkxfUEFVVE9MRgkJMHgwMgkvKiBpbnZlcnRlZCBvdXRwdXQsIGFjdGl2ZSBsb3cgKi8KQEAgLTEyMyw3ICsxMzAsNyBAQAogI2RlZmluZSBMQ0RfRkxBR19OCQkweDAwNDAJLyogMi1yb3dzIG1vZGUgKi8KICNkZWZpbmUgTENEX0ZMQUdfTAkJMHgwMDgwCS8qIGJhY2tsaWdodCBlbmFibGVkICovCiAKLSNkZWZpbmUgTENEX0VTQ0FQRV9MRU4JCTI0CS8qIDI0IGNoYXJzIG1heCBmb3IgYW4gTENEIGVzY2FwZSBjb21tYW5kICovCisjZGVmaW5lIExDRF9FU0NBUEVfTEVOCQkyNAkvKiBtYXggY2hhcnMgZm9yIExDRCBlc2NhcGUgY29tbWFuZCAqLwogI2RlZmluZSBMQ0RfRVNDQVBFX0NIQVIJMjcJLyogdXNlIGNoYXIgMjcgZm9yIGVzY2FwZSBjb21tYW5kICovCiAKIC8qIG1hY3JvcyB0byBzaW1wbGlmeSB1c2Ugb2YgdGhlIHBhcmFsbGVsIHBvcnQgKi8KQEAgLTEzNCw4ICsxNDEsMTAgQEAKICNkZWZpbmUgd19kdHIoeCwgeSkgICAgIGRvIHsgcGFycG9ydF93cml0ZV9kYXRhKCh4KS0+cG9ydCwgKHkpKTsgfSB3aGlsZSAoMCkKIAogLyogdGhpcyBkZWZpbmVzIHdoaWNoIGJpdHMgYXJlIHRvIGJlIHVzZWQgYW5kIHdoaWNoIG9uZXMgdG8gYmUgaWdub3JlZCAqLwotc3RhdGljIF9fdTggc2Nhbl9tYXNrX287CS8qIGxvZ2ljYWwgb3Igb2YgdGhlIG91dHB1dCBiaXRzIGludm9sdmVkIGluIHRoZSBzY2FuIG1hdHJpeCAqLwotc3RhdGljIF9fdTggc2Nhbl9tYXNrX2k7CS8qIGxvZ2ljYWwgb3Igb2YgdGhlIGlucHV0IGJpdHMgaW52b2x2ZWQgaW4gdGhlIHNjYW4gbWF0cml4ICovCisvKiBsb2dpY2FsIG9yIG9mIHRoZSBvdXRwdXQgYml0cyBpbnZvbHZlZCBpbiB0aGUgc2NhbiBtYXRyaXggKi8KK3N0YXRpYyBfX3U4IHNjYW5fbWFza19vOworLyogbG9naWNhbCBvciBvZiB0aGUgaW5wdXQgYml0cyBpbnZvbHZlZCBpbiB0aGUgc2NhbiBtYXRyaXggKi8KK3N0YXRpYyBfX3U4IHNjYW5fbWFza19pOwogCiB0eXBlZGVmIF9fdTY0IHBtYXNrX3Q7CiAKQEAgLTE2MSwxNCArMTcwLDE0IEBACiAJX191OCByaXNlX3RpbWVyLCBmYWxsX3RpbWVyLCBoaWdoX3RpbWVyOwogCiAJdW5pb24gewotCQlzdHJ1Y3QgewkvKiB0aGlzIHN0cnVjdHVyZSBpcyB2YWxpZCB3aGVuIHR5cGUgPT0gSU5QVVRfVFlQRV9TVEQgKi8KKwkJc3RydWN0IHsJLyogdmFsaWQgd2hlbiB0eXBlID09IElOUFVUX1RZUEVfU1REICovCiAJCQl2b2lkICgqcHJlc3NfZmN0KSAoaW50KTsKIAkJCXZvaWQgKCpyZWxlYXNlX2ZjdCkgKGludCk7CiAJCQlpbnQgcHJlc3NfZGF0YTsKIAkJCWludCByZWxlYXNlX2RhdGE7CiAJCX0gc3RkOwotCQlzdHJ1Y3QgewkvKiB0aGlzIHN0cnVjdHVyZSBpcyB2YWxpZCB3aGVuIHR5cGUgPT0gSU5QVVRfVFlQRV9LQkQgKi8KLQkJCS8qIHN0cmluZ3MgY2FuIGJlIGZ1bGwtbGVuZ3RoIChpZS4gbm9uIG51bGwtdGVybWluYXRlZCkgKi8KKwkJc3RydWN0IHsJLyogdmFsaWQgd2hlbiB0eXBlID09IElOUFVUX1RZUEVfS0JEICovCisJCQkvKiBzdHJpbmdzIGNhbiBiZSBub24gbnVsbC10ZXJtaW5hdGVkICovCiAJCQljaGFyIHByZXNzX3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKIAkJCWNoYXIgcmVwZWF0X3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKIAkJCWNoYXIgcmVsZWFzZV9zdHJbc2l6ZW9mKHZvaWQgKikgKyBzaXplb2YoaW50KV07CkBAIC0xODgsMTEgKzE5NywxNyBAQAogICogMDAwMDAwMDAwMDAwMDAwMDAwMEJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRQogICogPC0tLS0tdW51c2VkLS0tLS0tPjxnbmQ+PGQwNz48ZDA2PjxkMDU+PGQwND48ZDAzPjxkMDI+PGQwMT48ZDAwPgogICovCi1zdGF0aWMgcG1hc2tfdCBwaHlzX3JlYWQ7CS8qIHdoYXQgaGFzIGp1c3QgYmVlbiByZWFkIGZyb20gdGhlIEkvTyBwb3J0cyAqLwotc3RhdGljIHBtYXNrX3QgcGh5c19yZWFkX3ByZXY7CS8qIHByZXZpb3VzIHBoeXNfcmVhZCAqLwotc3RhdGljIHBtYXNrX3QgcGh5c19jdXJyOwkvKiBzdGFiaWxpemVkIHBoeXNfcmVhZCAocGh5c19yZWFkfHBoeXNfcmVhZF9wcmV2KSAqLwotc3RhdGljIHBtYXNrX3QgcGh5c19wcmV2OwkvKiBwcmV2aW91cyBwaHlzX2N1cnIgKi8KLXN0YXRpYyBjaGFyIGlucHV0c19zdGFibGU7CS8qIDAgbWVhbnMgdGhhdCBhdCBsZWFzdCBvbmUgbG9naWNhbCBzaWduYWwgbmVlZHMgYmUgY29tcHV0ZWQgKi8KKworLyogd2hhdCBoYXMganVzdCBiZWVuIHJlYWQgZnJvbSB0aGUgSS9PIHBvcnRzICovCitzdGF0aWMgcG1hc2tfdCBwaHlzX3JlYWQ7CisvKiBwcmV2aW91cyBwaHlzX3JlYWQgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfcmVhZF9wcmV2OworLyogc3RhYmlsaXplZCBwaHlzX3JlYWQgKHBoeXNfcmVhZHxwaHlzX3JlYWRfcHJldikgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfY3VycjsKKy8qIHByZXZpb3VzIHBoeXNfY3VyciAqLworc3RhdGljIHBtYXNrX3QgcGh5c19wcmV2OworLyogMCBtZWFucyB0aGF0IGF0IGxlYXN0IG9uZSBsb2dpY2FsIHNpZ25hbCBuZWVkcyBiZSBjb21wdXRlZCAqLworc3RhdGljIGNoYXIgaW5wdXRzX3N0YWJsZTsKIAogLyogdGhlc2UgdmFyaWFibGVzIGFyZSBzcGVjaWZpYyB0byB0aGUga2V5cGFkICovCiBzdGF0aWMgY2hhciBrZXlwYWRfYnVmZmVyW0tFWVBBRF9CVUZGRVJdOwpAQCAtMjAyLDExICsyMTcsMTcgQEAKIHN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBrZXlwYWRfcmVhZF93YWl0OwogCiAvKiBsY2Qtc3BlY2lmaWMgdmFyaWFibGVzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgbGNkX2ZsYWdzOwkvKiBjb250YWlucyB0aGUgTENEIGNvbmZpZyBzdGF0ZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IGxjZF9hZGRyX3g7CS8qIGNvbnRhaW5zIHRoZSBMQ0QgWCBvZmZzZXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfYWRkcl95OwkvKiBjb250YWlucyB0aGUgTENEIFkgb2Zmc2V0ICovCi1zdGF0aWMgY2hhciBsY2RfZXNjYXBlW0xDRF9FU0NBUEVfTEVOICsgMV07CS8qIGN1cnJlbnQgZXNjYXBlIHNlcXVlbmNlLCAwIHRlcm1pbmF0ZWQgKi8KLXN0YXRpYyBpbnQgbGNkX2VzY2FwZV9sZW4gPSAtMTsJLyogbm90IGluIGVzY2FwZSBzdGF0ZS4gPj0wID0gZXNjYXBlIGNtZCBsZW4gKi8KKworLyogY29udGFpbnMgdGhlIExDRCBjb25maWcgc3RhdGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfZmxhZ3M7CisvKiBjb250YWlucyB0aGUgTENEIFggb2Zmc2V0ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgbGNkX2FkZHJfeDsKKy8qIGNvbnRhaW5zIHRoZSBMQ0QgWSBvZmZzZXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfYWRkcl95OworLyogY3VycmVudCBlc2NhcGUgc2VxdWVuY2UsIDAgdGVybWluYXRlZCAqLworc3RhdGljIGNoYXIgbGNkX2VzY2FwZVtMQ0RfRVNDQVBFX0xFTiArIDFdOworLyogbm90IGluIGVzY2FwZSBzdGF0ZS4gPj0wID0gZXNjYXBlIGNtZCBsZW4gKi8KK3N0YXRpYyBpbnQgbGNkX2VzY2FwZV9sZW4gPSAtMTsKIAogLyoKICAqIEJpdCBtYXNrcyB0byBjb252ZXJ0IExDRCBzaWduYWxzIHRvIHBhcmFsbGVsIHBvcnQgb3V0cHV0cy4KQEAgLTQzNiwxMSArNDU3LDEzIEBACiBzdGF0aWMgaW50IGxjZF90eXBlID0gLTE7CiBtb2R1bGVfcGFyYW0obGNkX3R5cGUsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF90eXBlLAotCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsIDM9aGFudHJvbml4IC8vLCA0PW5leGNvbSAvLywgNT1jb21waWxlZC1pbiIpOworCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsICIKKwkJICIzPWhhbnRyb25peCAvLywgND1uZXhjb20gLy8sIDU9Y29tcGlsZWQtaW4iKTsKIAogc3RhdGljIGludCBsY2RfcHJvdG8gPSAtMTsKIG1vZHVsZV9wYXJhbShsY2RfcHJvdG8sIGludCwgMDAwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxjZF9wcm90bywgIkxDRCBjb21tdW5pY2F0aW9uOiAwPXBhcmFsbGVsICgvLyksIDE9c2VyaWFsLCIKK01PRFVMRV9QQVJNX0RFU0MobGNkX3Byb3RvLAorCQkiTENEIGNvbW11bmljYXRpb246IDA9cGFyYWxsZWwgKC8vKSwgMT1zZXJpYWwsIgogCQkiMj1USSBMQ0QgSW50ZXJmYWNlIik7CiAKIHN0YXRpYyBpbnQgbGNkX2NoYXJzZXQgPSAtMTsKQEAgLTQ1MCwxMiArNDczLDE0IEBACiBzdGF0aWMgaW50IGtleXBhZF90eXBlID0gLTE7CiBtb2R1bGVfcGFyYW0oa2V5cGFkX3R5cGUsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGtleXBhZF90eXBlLAotCQkgIktleXBhZCB0eXBlOiAwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNisxIGtleXMsIDM9bmV4Y29tIDQga2V5cyIpOworCQkgIktleXBhZCB0eXBlOiAwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNisxIGtleXMsICIKKwkJICIzPW5leGNvbSA0IGtleXMiKTsKIAogc3RhdGljIGludCBwcm9maWxlID0gREVGQVVMVF9QUk9GSUxFOwogbW9kdWxlX3BhcmFtKHByb2ZpbGUsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHByb2ZpbGUsCi0JCSAiMT0xNngyIG9sZCBrcDsgMj1zZXJpYWwgMTZ4MiwgbmV3IGtwOyAzPTE2eDIgaGFudHJvbml4OyA0PTE2eDIgbmV4Y29tOyBkZWZhdWx0PTQweDIsIG9sZCBrcCIpOworCQkgIjE9MTZ4MiBvbGQga3A7IDI9c2VyaWFsIDE2eDIsIG5ldyBrcDsgMz0xNngyIGhhbnRyb25peDsgIgorCQkgIjQ9MTZ4MiBuZXhjb207IGRlZmF1bHQ9NDB4Miwgb2xkIGtwIik7CiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIHBhcmFsbGVsIHBvcnQgcGlucyB0aGUgTENEIGNvbnRyb2wgc2lnbmFscyBhcmUgY29ubmVjdGVkIHRvLgpAQCAtNDY5LDMyICs0OTQsMzggQEAKIHN0YXRpYyBpbnQgbGNkX2VfcGluICA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9lX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX2VfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ0UnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdFJyBzaWduYWwsICIKKwkJICJ3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgaW50IGxjZF9yc19waW4gPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfcnNfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfcnNfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JTJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlMnIHNpZ25hbCwgIgorCQkgIndpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX3J3X3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9yd19waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9yd19waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlcnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSVycgc2lnbmFsLCAiCisJCSAid2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGludCBsY2RfYmxfcGluID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX2JsX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX2JsX3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEIGJhY2tsaWdodCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEIGJhY2tsaWdodCwgIgorCQkgIndpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX2RhX3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9kYV9waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9kYV9waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NEQScgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTREEnICIKKwkJICJzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX2NsX3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9jbF9waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9jbF9waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NDTCcgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTQ0wnICIKKwkJICJzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpsY2RfY2hhcl9jb252OwogCkBAIC01NzIsMTIgKzYwMywxMiBAQAogCiAvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgYml0IGFycmF5IGNvbnRhaW5pbmcgc2lnbmFscyBzdGF0ZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgZTsJLyogcGFyYWxsZWwgTENEIEUgICAoZGF0YSBsYXRjaCBvbiBmYWxsaW5nIGVkZ2UpICovCi0JdW5zaWduZWQgY2hhciByczsJLyogcGFyYWxsZWwgTENEIFJTICAoMCA9IGNtZCwgMSA9IGRhdGEpICovCi0JdW5zaWduZWQgY2hhciBydzsJLyogcGFyYWxsZWwgTENEIFIvVyAoMCA9IFcsIDEgPSBSKSAqLwotCXVuc2lnbmVkIGNoYXIgYmw7CS8qIHBhcmFsbGVsIExDRCBiYWNrbGlnaHQgKDAgPSBvZmYsIDEgPSBvbikgKi8KLQl1bnNpZ25lZCBjaGFyIGNsOwkvKiBzZXJpYWwgTENEIGNsb2NrIChsYXRjaCBvbiByaXNpbmcgZWRnZSkgKi8KLQl1bnNpZ25lZCBjaGFyIGRhOwkvKiBzZXJpYWwgTENEIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIGU7ICAvKiBwYXJhbGxlbCBMQ0QgRSAoZGF0YSBsYXRjaCBvbiBmYWxsaW5nIGVkZ2UpICovCisJdW5zaWduZWQgY2hhciByczsgLyogcGFyYWxsZWwgTENEIFJTICAoMCA9IGNtZCwgMSA9IGRhdGEpICovCisJdW5zaWduZWQgY2hhciBydzsgLyogcGFyYWxsZWwgTENEIFIvVyAoMCA9IFcsIDEgPSBSKSAqLworCXVuc2lnbmVkIGNoYXIgYmw7IC8qIHBhcmFsbGVsIExDRCBiYWNrbGlnaHQgKDAgPSBvZmYsIDEgPSBvbikgKi8KKwl1bnNpZ25lZCBjaGFyIGNsOyAvKiBzZXJpYWwgTENEIGNsb2NrIChsYXRjaCBvbiByaXNpbmcgZWRnZSkgKi8KKwl1bnNpZ25lZCBjaGFyIGRhOyAvKiBzZXJpYWwgTENEIGRhdGEgKi8KIH0gYml0czsKIAogc3RhdGljIHZvaWQgaW5pdF9zY2FuX3RpbWVyKHZvaWQpOwpAQCAtNjY2LDcgKzY5Nyw3IEBACiAJCWNfYml0ID0gUE5MX1BBVVRPTEY7CiAJCWludiA9ICFpbnY7CiAJCWJyZWFrOwotCWNhc2UgUElOX0lOSVRQOgkvKiBpbml0LCBkaXJlY3QgKi8KKwljYXNlIFBJTl9JTklUUDoJCS8qIGluaXQsIGRpcmVjdCAqLwogCQljX2JpdCA9IFBOTF9QSU5JVFA7CiAJCWJyZWFrOwogCWNhc2UgUElOX1NFTEVDUDoJLyogc2VsZWN0X2luLCBpbnZlcnRlZCAqLwpAQCAtNjk4LDIzICs3MjksMjMgQEAKIAl9CiB9CiAKLS8qIHNlbmQgYSBzZXJpYWwgYnl0ZSB0byB0aGUgTENEIHBhbmVsLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nIGlmIG5lZWRlZC4gKi8KKy8qIHNlbmQgYSBzZXJpYWwgYnl0ZSB0byB0aGUgTENEIHBhbmVsLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nCisgICBpZiBuZWVkZWQuICovCiBzdGF0aWMgdm9pZCBsY2Rfc2VuZF9zZXJpYWwoaW50IGJ5dGUpCiB7CiAJaW50IGJpdDsKIAogCS8qIHRoZSBkYXRhIGJpdCBpcyBzZXQgb24gRDAsIGFuZCB0aGUgY2xvY2sgb24gU1RST0JFLgotCSAqIExDRCByZWFkcyBEMCBvbiBTVFJPQkUncyByaXNpbmcgZWRnZS4KLQkgKi8KKwkgKiBMQ0QgcmVhZHMgRDAgb24gU1RST0JFJ3MgcmlzaW5nIGVkZ2UuICovCiAJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgewogCQliaXRzLmNsID0gQklUX0NMUjsJLyogQ0xLIGxvdyAqLwogCQlwYW5lbF9zZXRfYml0cygpOwogCQliaXRzLmRhID0gYnl0ZSAmIDE7CiAJCXBhbmVsX3NldF9iaXRzKCk7Ci0JCXVkZWxheSgyKTsJLyogbWFpbnRhaW4gdGhlIGRhdGEgZHVyaW5nIDIgdXMgYmVmb3JlIENMSyB1cCAqLworCQl1ZGVsYXkoMik7ICAvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMiB1cyBiZWZvcmUgQ0xLIHVwICovCiAJCWJpdHMuY2wgPSBCSVRfU0VUOwkvKiBDTEsgaGlnaCAqLwogCQlwYW5lbF9zZXRfYml0cygpOwotCQl1ZGVsYXkoMSk7CS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDEgdXMgKi8KKwkJdWRlbGF5KDEpOyAgLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgMSB1cyAqLwogCQlieXRlID4+PSAxOwogCX0KIH0KQEAgLTc2MCwxOSArNzkxLDE5IEBACiAJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOwogCS8qIHByZXNlbnQgdGhlIGRhdGEgdG8gdGhlIGRhdGEgcG9ydCAqLwogCXdfZHRyKHBwcnQsIGNtZCk7Ci0JdWRlbGF5KDIwKTsJCS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCXVkZWxheSgyMCk7CS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLwogCiAJYml0cy5lID0gQklUX1NFVDsKIAliaXRzLnJzID0gQklUX0NMUjsKIAliaXRzLnJ3ID0gQklUX0NMUjsKIAlzZXRfY3RybF9iaXRzKCk7CiAKLQl1ZGVsYXkoNDApOwkJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgNDAgdXMgKi8KKwl1ZGVsYXkoNDApOwkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLwogCiAJYml0cy5lID0gQklUX0NMUjsKIAlzZXRfY3RybF9iaXRzKCk7CiAKLQl1ZGVsYXkoMTIwKTsJCS8qIHRoZSBzaG9ydGVzdCBjb21tYW5kIHRha2VzIGF0IGxlYXN0IDEyMCB1cyAqLworCXVkZWxheSgxMjApOwkvKiB0aGUgc2hvcnRlc3QgY29tbWFuZCB0YWtlcyBhdCBsZWFzdCAxMjAgdXMgKi8KIAlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKIH0KIApAQCAtNzgyLDE5ICs4MTMsMTkgQEAKIAlzcGluX2xvY2soJnBwcnRfbG9jayk7CiAJLyogcHJlc2VudCB0aGUgZGF0YSB0byB0aGUgZGF0YSBwb3J0ICovCiAJd19kdHIocHBydCwgZGF0YSk7Ci0JdWRlbGF5KDIwKTsJCS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCXVkZWxheSgyMCk7CS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLwogCiAJYml0cy5lID0gQklUX1NFVDsKIAliaXRzLnJzID0gQklUX1NFVDsKIAliaXRzLnJ3ID0gQklUX0NMUjsKIAlzZXRfY3RybF9iaXRzKCk7CiAKLQl1ZGVsYXkoNDApOwkJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgNDAgdXMgKi8KKwl1ZGVsYXkoNDApOwkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLwogCiAJYml0cy5lID0gQklUX0NMUjsKIAlzZXRfY3RybF9iaXRzKCk7CiAKLQl1ZGVsYXkoNDUpOwkJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDUgdXMgKi8KKwl1ZGVsYXkoNDUpOwkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0NSB1cyAqLwogCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOwogfQogCkBAIC04MjIsNyArODUzLDggQEAKIHsKIAlsY2Rfd3JpdGVfY21kKDB4ODAJLyogc2V0IEREUkFNIGFkZHJlc3MgKi8KIAkJICAgICAgfCAobGNkX2FkZHJfeSA/IGxjZF9od2lkdGggOiAwKQotCQkgICAgICAvKiB3ZSBmb3JjZSB0aGUgY3Vyc29yIHRvIHN0YXkgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBpZiBpdCB3YW50cyB0byBnbyBmYXJ0aGVyICovCisJCSAgICAgIC8qIHdlIGZvcmNlIHRoZSBjdXJzb3IgdG8gc3RheSBhdCB0aGUgZW5kIG9mIHRoZQorCQkJIGxpbmUgaWYgaXQgd2FudHMgdG8gZ28gZmFydGhlciAqLwogCQkgICAgICB8ICgobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpID8gbGNkX2FkZHJfeCAmCiAJCQkgKGxjZF9od2lkdGggLSAxKSA6IGxjZF9id2lkdGggLSAxKSk7CiB9CkBAIC04NzEsMTkgKzkwMywyMyBAQAogCWZvciAocG9zID0gMDsgcG9zIDwgbGNkX2hlaWdodCAqIGxjZF9od2lkdGg7IHBvcysrKSB7CiAJCS8qIHByZXNlbnQgdGhlIGRhdGEgdG8gdGhlIGRhdGEgcG9ydCAqLwogCQl3X2R0cihwcHJ0LCAnICcpOwotCQl1ZGVsYXkoMjApOwkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMjAgdXMgYmVmb3JlIHRoZSBzdHJvYmUgKi8KKworCQkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMjAgdXMgYmVmb3JlIHRoZSBzdHJvYmUgKi8KKwkJdWRlbGF5KDIwKTsKIAogCQliaXRzLmUgPSBCSVRfU0VUOwogCQliaXRzLnJzID0gQklUX1NFVDsKIAkJYml0cy5ydyA9IEJJVF9DTFI7CiAJCXNldF9jdHJsX2JpdHMoKTsKIAotCQl1ZGVsYXkoNDApOwkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLworCQkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLworCQl1ZGVsYXkoNDApOwogCiAJCWJpdHMuZSA9IEJJVF9DTFI7CiAJCXNldF9jdHJsX2JpdHMoKTsKIAotCQl1ZGVsYXkoNDUpOwkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0NSB1cyAqLworCQkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0NSB1cyAqLworCQl1ZGVsYXkoNDUpOwogCX0KIAlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKIApAQCAtOTU0LDcgKzk5MCw4IEBACiAKIAlsb25nX3NsZWVwKDEwKTsKIAotCWxjZF93cml0ZV9jbWQoMHgwNik7CS8qIGVudHJ5IG1vZGUgc2V0IDogaW5jcmVtZW50LCBjdXJzb3Igc2hpZnRpbmcgKi8KKwkvKiBlbnRyeSBtb2RlIHNldCA6IGluY3JlbWVudCwgY3Vyc29yIHNoaWZ0aW5nICovCisJbGNkX3dyaXRlX2NtZCgweDA2KTsKIAogCWxjZF9jbGVhcl9kaXNwbGF5KCk7CiB9CkBAIC05NjYsMzE3ICsxMDAzLDMzNiBAQAogICoKICAqLwogCitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfbGNkX3NwZWNpYWxfY29kZSh2b2lkKQoreworCS8qIExDRCBzcGVjaWFsIGNvZGVzICovCisKKwlpbnQgcHJvY2Vzc2VkID0gMDsKKworCWNoYXIgKmVzYyA9IGxjZF9lc2NhcGUgKyAyOworCWludCBvbGRmbGFncyA9IGxjZF9mbGFnczsKKworCS8qIGNoZWNrIGZvciBkaXNwbGF5IG1vZGUgZmxhZ3MgKi8KKwlzd2l0Y2ggKCplc2MpIHsKKwljYXNlICdEJzoJLyogRGlzcGxheSBPTiAqLworCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfRDsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CS8qIERpc3BsYXkgT0ZGICovCisJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfRDsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnQyc6CS8qIEN1cnNvciBPTiAqLworCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfQzsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CS8qIEN1cnNvciBPRkYgKi8KKwkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19DOworCQlwcm9jZXNzZWQgPSAxOworCQlicmVhazsKKwljYXNlICdCJzoJLyogQmxpbmsgT04gKi8KKwkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0I7CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ2InOgkvKiBCbGluayBPRkYgKi8KKwkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19COworCQlwcm9jZXNzZWQgPSAxOworCQlicmVhazsKKwljYXNlICcrJzoJLyogQmFjayBsaWdodCBPTiAqLworCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfTDsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnLSc6CS8qIEJhY2sgbGlnaHQgT0ZGICovCisJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfTDsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnKic6CisJCS8qIGZsYXNoIGJhY2sgbGlnaHQgdXNpbmcgdGhlIGtleXBhZCB0aW1lciAqLworCQlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKSB7CisJCQlpZiAobGlnaHRfdGVtcG8gPT0gMCAmJiAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0wpID09IDApKQorCQkJCWxjZF9iYWNrbGlnaHQoMSk7CisJCQlsaWdodF90ZW1wbyA9IEZMQVNIX0xJR0hUX1RFTVBPOworCQl9CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ2YnOgkvKiBTbWFsbCBGb250ICovCisJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfRjsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnRic6CS8qIExhcmdlIEZvbnQgKi8KKwkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0Y7CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ24nOgkvKiBPbmUgTGluZSAqLworCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX047CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ04nOgkvKiBUd28gTGluZXMgKi8KKwkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX047CisJCWJyZWFrOworCWNhc2UgJ2wnOgkvKiBTaGlmdCBDdXJzb3IgTGVmdCAqLworCQlpZiAobGNkX2FkZHJfeCA+IDApIHsKKwkJCS8qIGJhY2sgb25lIGNoYXIgaWYgbm90IGF0IGVuZCBvZiBsaW5lICovCisJCQlpZiAobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpCisJCQkJbGNkX3dyaXRlX2NtZCgweDEwKTsKKwkJCWxjZF9hZGRyX3gtLTsKKwkJfQorCQlwcm9jZXNzZWQgPSAxOworCQlicmVhazsKKwljYXNlICdyJzoJLyogc2hpZnQgY3Vyc29yIHJpZ2h0ICovCisJCWlmIChsY2RfYWRkcl94IDwgbGNkX3dpZHRoKSB7CisJCQkvKiBhbGxvdyB0aGUgY3Vyc29yIHRvIHBhc3MgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCQkJaWYgKGxjZF9hZGRyX3ggPAorCQkJICAgIChsY2RfYndpZHRoIC0gMSkpCisJCQkJbGNkX3dyaXRlX2NtZCgweDE0KTsKKwkJCWxjZF9hZGRyX3grKzsKKwkJfQorCQlwcm9jZXNzZWQgPSAxOworCQlicmVhazsKKwljYXNlICdMJzoJLyogc2hpZnQgZGlzcGxheSBsZWZ0ICovCisJCWxjZF9sZWZ0X3NoaWZ0Kys7CisJCWxjZF93cml0ZV9jbWQoMHgxOCk7CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ1InOgkvKiBzaGlmdCBkaXNwbGF5IHJpZ2h0ICovCisJCWxjZF9sZWZ0X3NoaWZ0LS07CisJCWxjZF93cml0ZV9jbWQoMHgxQyk7CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ2snOiB7CS8qIGtpbGwgZW5kIG9mIGxpbmUgKi8KKwkJaW50IHg7CisJCWZvciAoeCA9IGxjZF9hZGRyX3g7IHggPCBsY2RfYndpZHRoOyB4KyspCisJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOworCisJCS8qIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCWxjZF9nb3RveHkoKTsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0knOgkvKiByZWluaXRpYWxpemUgZGlzcGxheSAqLworCQlsY2RfaW5pdF9kaXNwbGF5KCk7CisJCWxjZF9sZWZ0X3NoaWZ0ID0gMDsKKwkJcHJvY2Vzc2VkID0gMTsKKwkJYnJlYWs7CisJY2FzZSAnRyc6IHsKKwkJLyogR2VuZXJhdG9yIDogTEdjeHh4eHguLi54eDsgbXVzdCBoYXZlIDxjPiBiZXR3ZWVuICcwJworCQkgKiBhbmQgJzcnLCByZXByZXNlbnRpbmcgdGhlIG51bWVyaWNhbCBBU0NJSSBjb2RlIG9mIHRoZQorCQkgKiByZWRlZmluZWQgY2hhcmFjdGVyLCBhbmQgPHh4Li4ueHg+IGEgc2VxdWVuY2Ugb2YgMTYKKwkJICogaGV4IGRpZ2l0cyByZXByZXNlbnRpbmcgOCBieXRlcyBmb3IgZWFjaCBjaGFyYWN0ZXIuCisJCSAqIE1vc3QgTENEcyB3aWxsIG9ubHkgdXNlIDUgbG93ZXIgYml0cyBvZiB0aGUgNyBmaXJzdAorCQkgKiBieXRlcy4KKwkJICovCisKKwkJdW5zaWduZWQgY2hhciBjZ2J5dGVzWzhdOworCQl1bnNpZ25lZCBjaGFyIGNnYWRkcjsKKwkJaW50IGNnb2Zmc2V0OworCQlpbnQgc2hpZnQ7CisJCWNoYXIgdmFsdWU7CisJCWludCBhZGRyOworCisJCWlmIChzdHJjaHIoZXNjLCAnOycpID09IE5VTEwpCisJCQlicmVhazsKKworCQllc2MrKzsKKworCQljZ2FkZHIgPSAqKGVzYysrKSAtICcwJzsKKwkJaWYgKGNnYWRkciA+IDcpIHsKKwkJCXByb2Nlc3NlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWNnb2Zmc2V0ID0gMDsKKwkJc2hpZnQgPSAwOworCQl2YWx1ZSA9IDA7CisJCXdoaWxlICgqZXNjICYmIGNnb2Zmc2V0IDwgOCkgeworCQkJc2hpZnQgXj0gNDsKKwkJCWlmICgqZXNjID49ICcwJyAmJiAqZXNjIDw9ICc5JykKKwkJCQl2YWx1ZSB8PSAoKmVzYyAtICcwJykgPDwgc2hpZnQ7CisJCQllbHNlIGlmICgqZXNjID49ICdBJyAmJiAqZXNjIDw9ICdaJykKKwkJCQl2YWx1ZSB8PSAoKmVzYyAtICdBJyArIDEwKSA8PCBzaGlmdDsKKwkJCWVsc2UgaWYgKCplc2MgPj0gJ2EnICYmICplc2MgPD0gJ3onKQorCQkJCXZhbHVlIHw9ICgqZXNjIC0gJ2EnICsgMTApIDw8IHNoaWZ0OworCQkJZWxzZSB7CisJCQkJZXNjKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChzaGlmdCA9PSAwKSB7CisJCQkJY2dieXRlc1tjZ29mZnNldCsrXSA9IHZhbHVlOworCQkJCXZhbHVlID0gMDsKKwkJCX0KKworCQkJZXNjKys7CisJCX0KKworCQlsY2Rfd3JpdGVfY21kKDB4NDAgfCAoY2dhZGRyICogOCkpOworCQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY2dvZmZzZXQ7IGFkZHIrKykKKwkJCWxjZF93cml0ZV9kYXRhKGNnYnl0ZXNbYWRkcl0pOworCisJCS8qIGVuc3VyZXMgdGhhdCB3ZSBzdG9wIHdyaXRpbmcgdG8gQ0dSQU0gKi8KKwkJbGNkX2dvdG94eSgpOworCQlwcm9jZXNzZWQgPSAxOworCQlicmVhazsKKwl9CisJY2FzZSAneCc6CS8qIGdvdG94eSA6IEx4WFhYW3lZWVldOyAqLworCWNhc2UgJ3knOgkvKiBnb3RveHkgOiBMeVlZWVt4WFhYXTsgKi8KKwkJaWYgKHN0cmNocihlc2MsICc7JykgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXdoaWxlICgqZXNjKSB7CisJCQljaGFyICplbmRwOworCisJCQlpZiAoKmVzYyA9PSAneCcpIHsKKwkJCQllc2MrKzsKKwkJCQlsY2RfYWRkcl94ID0gc2ltcGxlX3N0cnRvdWwoZXNjLCAmZW5kcCwgMTApOworCQkJCWVzYyA9IGVuZHA7CisJCQl9IGVsc2UgaWYgKCplc2MgPT0gJ3knKSB7CisJCQkJZXNjKys7CisJCQkJbGNkX2FkZHJfeSA9IHNpbXBsZV9zdHJ0b3VsKGVzYywgJmVuZHAsIDEwKTsKKwkJCQllc2MgPSBlbmRwOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CisJCX0KKworCQlsY2RfZ290b3h5KCk7CisJCXByb2Nlc3NlZCA9IDE7CisJCWJyZWFrOworCX0KKworCS8qIENoZWNrIHdldGhlciBvbmUgZmxhZyB3YXMgY2hhbmdlZCAqLworCWlmIChvbGRmbGFncyAhPSBsY2RfZmxhZ3MpIHsKKwkJLyogY2hlY2sgd2hldGhlciBvbmUgb2YgQixDLEQgZmxhZ3Mgd2VyZSBjaGFuZ2VkICovCisJCWlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYKKwkJICAgIChMQ0RfRkxBR19CIHwgTENEX0ZMQUdfQyB8IExDRF9GTEFHX0QpKQorCQkJLyogc2V0IGRpc3BsYXkgbW9kZSAqLworCQkJbGNkX3dyaXRlX2NtZCgweDA4CisJCQkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0QpID8gNCA6IDApCisJCQkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0MpID8gMiA6IDApCisJCQkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0IpID8gMSA6IDApKTsKKwkJLyogY2hlY2sgd2hldGhlciBvbmUgb2YgRixOIGZsYWdzIHdhcyBjaGFuZ2VkICovCisJCWVsc2UgaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJiAoTENEX0ZMQUdfRiB8IExDRF9GTEFHX04pKQorCQkJbGNkX3dyaXRlX2NtZCgweDMwCisJCQkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0YpID8gNCA6IDApCisJCQkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX04pID8gOCA6IDApKTsKKwkJLyogY2hlY2sgd2V0aGVyIEwgZmxhZyB3YXMgY2hhbmdlZCAqLworCQllbHNlIGlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYgKExDRF9GTEFHX0wpKSB7CisJCQlpZiAobGNkX2ZsYWdzICYgKExDRF9GTEFHX0wpKQorCQkJCWxjZF9iYWNrbGlnaHQoMSk7CisJCQllbHNlIGlmIChsaWdodF90ZW1wbyA9PSAwKQorCQkJCS8qIHN3aXRjaCBvZmYgdGhlIGxpZ2h0IG9ubHkgd2hlbiB0aGUgdGVtcG8KKwkJCQkgICBsaWdodGluZyBpcyBnb25lICovCisJCQkJbGNkX2JhY2tsaWdodCgwKTsKKwkJfQorCX0KKworCXJldHVybiBwcm9jZXNzZWQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGxjZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCiAJY29uc3QgY2hhciAqdG1wID0gYnVmOwogCWNoYXIgYzsKIAogCWZvciAoOyBjb3VudC0tID4gMDsgKHBwb3MgPyAoKnBwb3MpKysgOiAwKSwgKyt0bXApIHsKIAkJaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiAoKChjb3VudCArIDEpICYgMHgxZikgPT0gMCkpCi0JCQlzY2hlZHVsZSgpOwkvKiBsZXQncyBiZSBhIGxpdHRsZSBuaWNlIHdpdGggb3RoZXIgcHJvY2Vzc2VzIHRoYXQgbmVlZCBzb21lIENQVSAqLworCQkJLyogbGV0J3MgYmUgYSBsaXR0bGUgbmljZSB3aXRoIG90aGVyIHByb2Nlc3NlcworCQkJICAgdGhhdCBuZWVkIHNvbWUgQ1BVICovCisJCQlzY2hlZHVsZSgpOwogCiAJCWlmIChwcG9zID09IE5VTEwgJiYgZmlsZSA9PSBOVUxMKQotCQkJYyA9ICp0bXA7CS8qIGxldCdzIG5vdCB1c2UgZ2V0X3VzZXIoKSBmcm9tIHRoZSBrZXJuZWwgISAqLworCQkJLyogbGV0J3Mgbm90IHVzZSBnZXRfdXNlcigpIGZyb20gdGhlIGtlcm5lbCAhICovCisJCQljID0gKnRtcDsKIAkJZWxzZSBpZiAoZ2V0X3VzZXIoYywgdG1wKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCS8qIGZpcnN0LCB3ZSdsbCB0ZXN0IGlmIHdlJ3JlIGluIGVzY2FwZSBtb2RlICovCi0JCWlmICgoYyAhPSAnXG4nKSAmJiBsY2RfZXNjYXBlX2xlbiA+PSAwKSB7CS8qIHllcywgbGV0J3MgYWRkIHRoaXMgY2hhciB0byB0aGUgYnVmZmVyICovCisJCWlmICgoYyAhPSAnXG4nKSAmJiBsY2RfZXNjYXBlX2xlbiA+PSAwKSB7CisJCQkvKiB5ZXMsIGxldCdzIGFkZCB0aGlzIGNoYXIgdG8gdGhlIGJ1ZmZlciAqLwogCQkJbGNkX2VzY2FwZVtsY2RfZXNjYXBlX2xlbisrXSA9IGM7CiAJCQlsY2RfZXNjYXBlW2xjZF9lc2NhcGVfbGVuXSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlsY2RfZXNjYXBlX2xlbiA9IC0xOwkvKiBhYm9ydHMgYW55IHByZXZpb3VzIGVzY2FwZSBzZXF1ZW5jZSAqLworCQkJLyogYWJvcnRzIGFueSBwcmV2aW91cyBlc2NhcGUgc2VxdWVuY2UgKi8KKwkJCWxjZF9lc2NhcGVfbGVuID0gLTE7CiAKIAkJCXN3aXRjaCAoYykgewotCQkJY2FzZSBMQ0RfRVNDQVBFX0NIQVI6CS8qIHN0YXJ0IG9mIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLworCQkJY2FzZSBMQ0RfRVNDQVBFX0NIQVI6CisJCQkJLyogc3RhcnQgb2YgYW4gZXNjYXBlIHNlcXVlbmNlICovCiAJCQkJbGNkX2VzY2FwZV9sZW4gPSAwOwogCQkJCWxjZF9lc2NhcGVbbGNkX2VzY2FwZV9sZW5dID0gMDsKIAkJCQlicmVhazsKLQkJCWNhc2UgJ1xiJzoJLyogZ28gYmFjayBvbmUgY2hhciBhbmQgY2xlYXIgaXQgKi8KKwkJCWNhc2UgJ1xiJzoKKwkJCQkvKiBnbyBiYWNrIG9uZSBjaGFyIGFuZCBjbGVhciBpdCAqLwogCQkJCWlmIChsY2RfYWRkcl94ID4gMCkgewotCQkJCQlpZiAobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpCS8qIGNoZWNrIGlmIHdlJ3JlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lICovCi0JCQkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwkvKiBiYWNrIG9uZSBjaGFyICovCisJCQkJCS8qIGNoZWNrIGlmIHdlJ3JlIG5vdCBhdCB0aGUKKwkJCQkJICAgZW5kIG9mIHRoZSBsaW5lICovCisJCQkJCWlmIChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkKKwkJCQkJCS8qIGJhY2sgb25lIGNoYXIgKi8KKwkJCQkJCWxjZF93cml0ZV9jbWQoMHgxMCk7CiAJCQkJCWxjZF9hZGRyX3gtLTsKIAkJCQl9Ci0JCQkJbGNkX3dyaXRlX2RhdGEoJyAnKTsJLyogcmVwbGFjZSB3aXRoIGEgc3BhY2UgKi8KLQkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwkvKiBiYWNrIG9uZSBjaGFyIGFnYWluICovCisJCQkJLyogcmVwbGFjZSB3aXRoIGEgc3BhY2UgKi8KKwkJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOworCQkJCS8qIGJhY2sgb25lIGNoYXIgYWdhaW4gKi8KKwkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwogCQkJCWJyZWFrOwotCQkJY2FzZSAnXDAxNCc6CS8qIHF1aWNrbHkgY2xlYXIgdGhlIGRpc3BsYXkgKi8KKwkJCWNhc2UgJ1wwMTQnOgorCQkJCS8qIHF1aWNrbHkgY2xlYXIgdGhlIGRpc3BsYXkgKi8KIAkJCQlsY2RfY2xlYXJfZmFzdCgpOwogCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgkvKiBmbHVzaCB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IGxpbmUgYW5kIGdvIHRvIHRoZQotCQkJCQkgICBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZSAqLworCQkJY2FzZSAnXG4nOgorCQkJCS8qIGZsdXNoIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgbGluZSBhbmQKKwkJCQkgICBnbyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUgKi8KIAkJCQlmb3IgKDsgbGNkX2FkZHJfeCA8IGxjZF9id2lkdGg7IGxjZF9hZGRyX3grKykKIAkJCQkJbGNkX3dyaXRlX2RhdGEoJyAnKTsKIAkJCQlsY2RfYWRkcl94ID0gMDsKIAkJCQlsY2RfYWRkcl95ID0gKGxjZF9hZGRyX3kgKyAxKSAlIGxjZF9oZWlnaHQ7CiAJCQkJbGNkX2dvdG94eSgpOwogCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgkvKiBnbyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzYW1lIGxpbmUgKi8KKwkJCWNhc2UgJ1xyJzoKKwkJCQkvKiBnbyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzYW1lIGxpbmUgKi8KIAkJCQlsY2RfYWRkcl94ID0gMDsKIAkJCQlsY2RfZ290b3h5KCk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlICdcdCc6CS8qIHByaW50IGEgc3BhY2UgaW5zdGVhZCBvZiB0aGUgdGFiICovCisJCQljYXNlICdcdCc6CisJCQkJLyogcHJpbnQgYSBzcGFjZSBpbnN0ZWFkIG9mIHRoZSB0YWIgKi8KIAkJCQlsY2RfcHJpbnQoJyAnKTsKIAkJCQlicmVhazsKLQkJCWRlZmF1bHQ6CS8qIHNpbXBseSBwcmludCB0aGlzIGNoYXIgKi8KKwkJCWRlZmF1bHQ6CisJCQkJLyogc2ltcGx5IHByaW50IHRoaXMgY2hhciAqLwogCQkJCWxjZF9wcmludChjKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCiAJCS8qIG5vdyB3ZSdsbCBzZWUgaWYgd2UncmUgaW4gYW4gZXNjYXBlIG1vZGUgYW5kIGlmIHRoZSBjdXJyZW50Ci0JCSAgIGVzY2FwZSBzZXF1ZW5jZSBjYW4gYmUgdW5kZXJzdG9vZC4KLQkJICovCi0JCWlmIChsY2RfZXNjYXBlX2xlbiA+PSAyKSB7CS8qIG1pbmltYWwgbGVuZ3RoIGZvciBhbiBlc2NhcGUgY29tbWFuZCAqLwotCQkJaW50IHByb2Nlc3NlZCA9IDA7CS8qIDEgbWVhbnMgdGhlIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkICovCisJCSAgIGVzY2FwZSBzZXF1ZW5jZSBjYW4gYmUgdW5kZXJzdG9vZC4gKi8KKwkJaWYgKGxjZF9lc2NhcGVfbGVuID49IDIpIHsKKwkJCWludCBwcm9jZXNzZWQgPSAwOwogCi0JCQlpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiWzJKIikpIHsJLyogQ2xlYXIgdGhlIGRpc3BsYXkgKi8KLQkJCQlsY2RfY2xlYXJfZmFzdCgpOwkvKiBjbGVhciBkaXNwbGF5ICovCisJCQlpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiWzJKIikpIHsKKwkJCQkvKiBjbGVhciB0aGUgZGlzcGxheSAqLworCQkJCWxjZF9jbGVhcl9mYXN0KCk7CiAJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiW0giKSkgewkvKiBDdXJzb3IgdG8gaG9tZSAqLworCQkJfSBlbHNlIGlmICghc3RyY21wKGxjZF9lc2NhcGUsICJbSCIpKSB7CisJCQkJLyogY3Vyc29yIHRvIGhvbWUgKi8KIAkJCQlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CiAJCQkJbGNkX2dvdG94eSgpOwogCQkJCXByb2Nlc3NlZCA9IDE7CiAJCQl9CiAJCQkvKiBjb2RlcyBzdGFydGluZyB3aXRoIF5bW0wgKi8KIAkJCWVsc2UgaWYgKChsY2RfZXNjYXBlX2xlbiA+PSAzKSAmJgotCQkJCSAobGNkX2VzY2FwZVswXSA9PSAnWycpICYmIChsY2RfZXNjYXBlWzFdID09ICdMJykpIHsJLyogTENEIHNwZWNpYWwgY29kZXMgKi8KLQotCQkJCWNoYXIgKmVzYyA9IGxjZF9lc2NhcGUgKyAyOwotCQkJCWludCBvbGRmbGFncyA9IGxjZF9mbGFnczsKLQotCQkJCS8qIGNoZWNrIGZvciBkaXNwbGF5IG1vZGUgZmxhZ3MgKi8KLQkJCQlzd2l0Y2ggKCplc2MpIHsKLQkJCQljYXNlICdEJzoJLyogRGlzcGxheSBPTiAqLwotCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfRDsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnZCc6CS8qIERpc3BsYXkgT0ZGICovCi0JCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfRDsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnQyc6CS8qIEN1cnNvciBPTiAqLwotCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfQzsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnYyc6CS8qIEN1cnNvciBPRkYgKi8KLQkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19DOwotCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdCJzoJLyogQmxpbmsgT04gKi8KLQkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0I7Ci0JCQkJCXByb2Nlc3NlZCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ2InOgkvKiBCbGluayBPRkYgKi8KLQkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19COwotCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcrJzoJLyogQmFjayBsaWdodCBPTiAqLwotCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfTDsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnLSc6CS8qIEJhY2sgbGlnaHQgT0ZGICovCi0JCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfTDsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKic6CS8qIGZsYXNoIGJhY2sgbGlnaHQgdXNpbmcgdGhlIGtleXBhZCB0aW1lciAqLwotCQkJCQlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKSB7Ci0JCQkJCQlpZiAobGlnaHRfdGVtcG8gPT0gMAotCQkJCQkJICAgICYmICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTCkKLQkJCQkJCQk9PSAwKSkKLQkJCQkJCQlsY2RfYmFja2xpZ2h0KDEpOwotCQkJCQkJbGlnaHRfdGVtcG8gPSBGTEFTSF9MSUdIVF9URU1QTzsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdmJzoJLyogU21hbGwgRm9udCAqLwotCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0Y7Ci0JCQkJCXByb2Nlc3NlZCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ0YnOgkvKiBMYXJnZSBGb250ICovCi0JCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19GOwotCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICduJzoJLyogT25lIExpbmUgKi8KLQkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19OOwotCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdOJzoJLyogVHdvIExpbmVzICovCi0JCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19OOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgJ2wnOgkvKiBTaGlmdCBDdXJzb3IgTGVmdCAqLwotCQkJCQlpZiAobGNkX2FkZHJfeCA+IDApIHsKLQkJCQkJCWlmIChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkKLQkJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwkvKiBiYWNrIG9uZSBjaGFyIGlmIG5vdCBhdCBlbmQgb2YgbGluZSAqLwotCQkJCQkJbGNkX2FkZHJfeC0tOwotCQkJCQl9Ci0JCQkJCXByb2Nlc3NlZCA9IDE7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAncic6CS8qIHNoaWZ0IGN1cnNvciByaWdodCAqLwotCQkJCQlpZiAobGNkX2FkZHJfeCA8IGxjZF93aWR0aCkgewotCQkJCQkJaWYgKGxjZF9hZGRyX3ggPCAobGNkX2J3aWR0aCAtIDEpKQotCQkJCQkJCWxjZF93cml0ZV9jbWQoMHgxNCk7CS8qIGFsbG93IHRoZSBjdXJzb3IgdG8gcGFzcyB0aGUgZW5kIG9mIHRoZSBsaW5lICovCi0JCQkJCQlsY2RfYWRkcl94Kys7Ci0JCQkJCX0KLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlICdMJzoJLyogc2hpZnQgZGlzcGxheSBsZWZ0ICovCi0JCQkJCWxjZF9sZWZ0X3NoaWZ0Kys7Ci0JCQkJCWxjZF93cml0ZV9jbWQoMHgxOCk7Ci0JCQkJCXByb2Nlc3NlZCA9IDE7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAnUic6CS8qIHNoaWZ0IGRpc3BsYXkgcmlnaHQgKi8KLQkJCQkJbGNkX2xlZnRfc2hpZnQtLTsKLQkJCQkJbGNkX3dyaXRlX2NtZCgweDFDKTsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlICdrJzp7CS8qIGtpbGwgZW5kIG9mIGxpbmUgKi8KLQkJCQkJCWludCB4OwotCQkJCQkJZm9yICh4ID0gbGNkX2FkZHJfeDsgeCA8IGxjZF9id2lkdGg7IHgrKykKLQkJCQkJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOwotCQkJCQkJbGNkX2dvdG94eSgpOwkvKiByZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLwotCQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJY2FzZSAnSSc6CS8qIHJlaW5pdGlhbGl6ZSBkaXNwbGF5ICovCi0JCQkJCWxjZF9pbml0X2Rpc3BsYXkoKTsKLQkJCQkJbGNkX2xlZnRfc2hpZnQgPSAwOwotCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgJ0cnOgkvKiBHZW5lcmF0b3IgOiBMR2N4eHh4eC4uLnh4OyAqLyAgewotCQkJCQkJLyogbXVzdCBoYXZlIDxjPiBiZXR3ZWVuICcwJyBhbmQgJzcnLCByZXByZXNlbnRpbmcgdGhlIG51bWVyaWNhbAotCQkJCQkJICogQVNDSUkgY29kZSBvZiB0aGUgcmVkZWZpbmVkIGNoYXJhY3RlciwgYW5kIDx4eC4uLnh4PiBhIHNlcXVlbmNlCi0JCQkJCQkgKiBvZiAxNiBoZXggZGlnaXRzIHJlcHJlc2VudGluZyA4IGJ5dGVzIGZvciBlYWNoIGNoYXJhY3Rlci4gTW9zdAotCQkJCQkJICogTENEcyB3aWxsIG9ubHkgdXNlIDUgbG93ZXIgYml0cyBvZiB0aGUgNyBmaXJzdCBieXRlcy4KLQkJCQkJCSAqLwotCi0JCQkJCQl1bnNpZ25lZCBjaGFyIGNnYnl0ZXNbOF07Ci0JCQkJCQl1bnNpZ25lZCBjaGFyIGNnYWRkcjsKLQkJCQkJCWludCBjZ29mZnNldDsKLQkJCQkJCWludCBzaGlmdDsKLQkJCQkJCWNoYXIgdmFsdWU7Ci0JCQkJCQlpbnQgYWRkcjsKLQotCQkJCQkJaWYgKHN0cmNocihlc2MsICc7JykgPT0gTlVMTCkKLQkJCQkJCQlicmVhazsKLQotCQkJCQkJZXNjKys7Ci0KLQkJCQkJCWNnYWRkciA9ICooZXNjKyspIC0gJzAnOwotCQkJCQkJaWYgKGNnYWRkciA+IDcpIHsKLQkJCQkJCQlwcm9jZXNzZWQgPSAxOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQljZ29mZnNldCA9IDA7Ci0JCQkJCQlzaGlmdCA9IDA7Ci0JCQkJCQl2YWx1ZSA9IDA7Ci0JCQkJCQl3aGlsZSAoKmVzYyAmJiBjZ29mZnNldCA8IDgpIHsKLQkJCQkJCQlzaGlmdCBePSA0OwotCQkJCQkJCWlmICgqZXNjID49ICcwJyAmJiAqZXNjIDw9ICc5JykKLQkJCQkJCQkJdmFsdWUgfD0gKCplc2MgLSAnMCcpIDw8IHNoaWZ0OwotCQkJCQkJCWVsc2UgaWYgKCplc2MgPj0gJ0EnICYmICplc2MgPD0gJ1onKQotCQkJCQkJCQl2YWx1ZSB8PSAoKmVzYyAtICdBJyArIDEwKSA8PCBzaGlmdDsKLQkJCQkJCQllbHNlIGlmICgqZXNjID49ICdhJyAmJiAqZXNjIDw9ICd6JykKLQkJCQkJCQkJdmFsdWUgfD0gKCplc2MgLSAnYScgKyAxMCkgPDwgc2hpZnQ7Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWVzYysrOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoc2hpZnQgPT0gMCkgewotCQkJCQkJCQljZ2J5dGVzW2Nnb2Zmc2V0KytdID0gdmFsdWU7Ci0JCQkJCQkJCXZhbHVlID0gMDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQllc2MrKzsKLQkJCQkJCX0KLQotCQkJCQkJbGNkX3dyaXRlX2NtZCgweDQwIHwgKGNnYWRkciAqIDgpKTsKLQkJCQkJCWZvciAoYWRkciA9IDA7IGFkZHIgPCBjZ29mZnNldDsgYWRkcisrKQotCQkJCQkJCWxjZF93cml0ZV9kYXRhKGNnYnl0ZXNbYWRkcl0pOwotCi0JCQkJCQlsY2RfZ290b3h5KCk7CS8qIGVuc3VyZXMgdGhhdCB3ZSBzdG9wIHdyaXRpbmcgdG8gQ0dSQU0gKi8KLQkJCQkJCXByb2Nlc3NlZCA9IDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWNhc2UgJ3gnOgkvKiBnb3RveHkgOiBMeFhYWFt5WVlZXTsgKi8KLQkJCQljYXNlICd5JzoJLyogZ290b3h5IDogTHlZWVlbeFhYWF07ICovCi0JCQkJCWlmIChzdHJjaHIoZXNjLCAnOycpID09IE5VTEwpCi0JCQkJCQlicmVhazsKLQotCQkJCQl3aGlsZSAoKmVzYykgewotCQkJCQkJaWYgKCplc2MgPT0gJ3gnKSB7Ci0JCQkJCQkJZXNjKys7Ci0JCQkJCQkJbGNkX2FkZHJfeCA9IDA7Ci0JCQkJCQkJd2hpbGUgKGlzZGlnaXQoKmVzYykpIHsKLQkJCQkJCQkJbGNkX2FkZHJfeCA9Ci0JCQkJCQkJCSAgICBsY2RfYWRkcl94ICoKLQkJCQkJCQkJICAgIDEwICsgKCplc2MgLQotCQkJCQkJCQkJICAnMCcpOwotCQkJCQkJCQllc2MrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKCplc2MgPT0gJ3knKSB7Ci0JCQkJCQkJZXNjKys7Ci0JCQkJCQkJbGNkX2FkZHJfeSA9IDA7Ci0JCQkJCQkJd2hpbGUgKGlzZGlnaXQoKmVzYykpIHsKLQkJCQkJCQkJbGNkX2FkZHJfeSA9Ci0JCQkJCQkJCSAgICBsY2RfYWRkcl95ICoKLQkJCQkJCQkJICAgIDEwICsgKCplc2MgLQotCQkJCQkJCQkJICAnMCcpOwotCQkJCQkJCQllc2MrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCWxjZF9nb3RveHkoKTsKLQkJCQkJcHJvY2Vzc2VkID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQkvKiBlbmQgb2Ygc3dpdGNoICovCi0KLQkJCQkvKiBDaGVjayB3ZXRoZXIgb25lIGZsYWcgd2FzIGNoYW5nZWQgKi8KLQkJCQlpZiAob2xkZmxhZ3MgIT0gbGNkX2ZsYWdzKSB7Ci0JCQkJCS8qIGNoZWNrIHdldGhlciBvbmUgb2YgQixDLEQgZmxhZ3Mgd2FzIGNoYW5nZWQgKi8KLQkJCQkJaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJgotCQkJCQkgICAgKExDRF9GTEFHX0IgfCBMQ0RfRkxBR19DIHwgTENEX0ZMQUdfRCkpCi0JCQkJCQkvKiBzZXQgZGlzcGxheSBtb2RlICovCi0JCQkJCQlsY2Rfd3JpdGVfY21kKDB4MDggfAotCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfRCkgPyA0IDogMCkgfAotCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQykgPyAyIDogMCkgfAotCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQikgPyAxIDogMCkpOwotCQkJCQkvKiBjaGVjayB3ZXRoZXIgb25lIG9mIEYsTiBmbGFncyB3YXMgY2hhbmdlZCAqLwotCQkJCQllbHNlIGlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYKLQkJCQkJCSAoTENEX0ZMQUdfRiB8IExDRF9GTEFHX04pKQotCQkJCQkJbGNkX3dyaXRlX2NtZCgweDMwIHwKLQkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0YpID8gNCA6IDApIHwKLQkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX04pID8gOCA6IDApKTsKLQkJCQkJLyogY2hlY2sgd2V0aGVyIEwgZmxhZyB3YXMgY2hhbmdlZCAqLwotCQkJCQllbHNlIGlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYKLQkJCQkJCSAoTENEX0ZMQUdfTCkpIHsKLQkJCQkJCWlmIChsY2RfZmxhZ3MgJiAoTENEX0ZMQUdfTCkpCi0JCQkJCQkJbGNkX2JhY2tsaWdodCgxKTsKLQkJCQkJCWVsc2UgaWYgKGxpZ2h0X3RlbXBvID09IDApCS8qIHN3aXRjaCBvZmYgdGhlIGxpZ2h0IG9ubHkgd2hlbiB0aGUgdGVtcG8gbGlnaHRpbmcgaXMgZ29uZSAqLwotCQkJCQkJCWxjZF9iYWNrbGlnaHQoMCk7Ci0JCQkJCX0KLQkJCQl9CisJCQkJIChsY2RfZXNjYXBlWzBdID09ICdbJykgJiYKKwkJCQkgKGxjZF9lc2NhcGVbMV0gPT0gJ0wnKSkgeworCQkJCXByb2Nlc3NlZCA9IGhhbmRsZV9sY2Rfc3BlY2lhbF9jb2RlKCk7CiAJCQl9CiAKIAkJCS8qIExDRCBzcGVjaWFsIGVzY2FwZSBjb2RlcyAqLwotCQkJLyogZmx1c2ggdGhlIGVzY2FwZSBzZXF1ZW5jZSBpZiBpdCdzIGJlZW4gcHJvY2Vzc2VkIG9yIGlmIGl0IGlzCi0JCQkgICBnZXR0aW5nIHRvbyBsb25nLiAqLworCQkJLyogZmx1c2ggdGhlIGVzY2FwZSBzZXF1ZW5jZSBpZiBpdCdzIGJlZW4gcHJvY2Vzc2VkCisJCQkgICBvciBpZiBpdCBpcyBnZXR0aW5nIHRvbyBsb25nLiAqLwogCQkJaWYgKHByb2Nlc3NlZCB8fCAobGNkX2VzY2FwZV9sZW4gPj0gTENEX0VTQ0FQRV9MRU4pKQogCQkJCWxjZF9lc2NhcGVfbGVuID0gLTE7Ci0JCX0JCS8qIGVzY2FwZSBjb2RlcyAqLworCQl9IC8qIGVzY2FwZSBjb2RlcyAqLwogCX0KIAogCXJldHVybiB0bXAgLSBidWY7CkBAIC0xMjk1LDcgKzEzNTEsNyBAQAogCQlsY2RfbXVzdF9jbGVhciA9IDA7CiAJfQogCWxjZF9vcGVuX2NudCsrOwotCXJldHVybiAwOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIH0KIAogc3RhdGljIGludCBsY2RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTEzMDQsMTAgKzEzNjAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGNkX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsY2RfZm9wcyA9IHsKIAkud3JpdGUgICA9IGxjZF93cml0ZSwKIAkub3BlbiAgICA9IGxjZF9vcGVuLAogCS5yZWxlYXNlID0gbGNkX3JlbGVhc2UsCisJLmxsc2VlayAgPSBub19sbHNlZWssCiB9OwogCiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbGNkX2RldiA9IHsKQEAgLTEzMjcsNyArMTM4NCw4IEBACiB2b2lkIGxjZF9pbml0KHZvaWQpCiB7CiAJc3dpdGNoIChsY2RfdHlwZSkgewotCWNhc2UgTENEX1RZUEVfT0xEOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMgKi8KKwljYXNlIExDRF9UWVBFX09MRDoKKwkJLyogcGFyYWxsZWwgbW9kZSwgOCBiaXRzICovCiAJCWlmIChsY2RfcHJvdG8gPCAwKQogCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1BBUkFMTEVMOwogCQlpZiAobGNkX2NoYXJzZXQgPCAwKQpAQCAtMTM0Niw3ICsxNDA0LDggQEAKIAkJaWYgKGxjZF9oZWlnaHQgPCAwKQogCQkJbGNkX2hlaWdodCA9IDI7CiAJCWJyZWFrOwotCWNhc2UgTENEX1RZUEVfS1MwMDc0OgkvKiBzZXJpYWwgbW9kZSwga3MwMDc0ICovCisJY2FzZSBMQ0RfVFlQRV9LUzAwNzQ6CisJCS8qIHNlcmlhbCBtb2RlLCBrczAwNzQgKi8KIAkJaWYgKGxjZF9wcm90byA8IDApCiAJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fU0VSSUFMOwogCQlpZiAobGNkX2NoYXJzZXQgPCAwKQpAQCAtMTM2Nyw3ICsxNDI2LDggQEAKIAkJaWYgKGxjZF9oZWlnaHQgPCAwKQogCQkJbGNkX2hlaWdodCA9IDI7CiAJCWJyZWFrOwotCWNhc2UgTENEX1RZUEVfTkVYQ09NOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMsIGdlbmVyaWMgKi8KKwljYXNlIExDRF9UWVBFX05FWENPTToKKwkJLyogcGFyYWxsZWwgbW9kZSwgOCBiaXRzLCBnZW5lcmljICovCiAJCWlmIChsY2RfcHJvdG8gPCAwKQogCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1BBUkFMTEVMOwogCQlpZiAobGNkX2NoYXJzZXQgPCAwKQpAQCAtMTM4OCwxNCArMTQ0OCwxNiBAQAogCQlpZiAobGNkX2hlaWdodCA8IDApCiAJCQlsY2RfaGVpZ2h0ID0gMjsKIAkJYnJlYWs7Ci0JY2FzZSBMQ0RfVFlQRV9DVVNUT006CS8qIGN1c3RvbWVyLWRlZmluZWQgKi8KKwljYXNlIExDRF9UWVBFX0NVU1RPTToKKwkJLyogY3VzdG9tZXItZGVmaW5lZCAqLwogCQlpZiAobGNkX3Byb3RvIDwgMCkKIAkJCWxjZF9wcm90byA9IERFRkFVTFRfTENEX1BST1RPOwogCQlpZiAobGNkX2NoYXJzZXQgPCAwKQogCQkJbGNkX2NoYXJzZXQgPSBERUZBVUxUX0xDRF9DSEFSU0VUOwogCQkvKiBkZWZhdWx0IGdlb21ldHJ5IHdpbGwgYmUgc2V0IGxhdGVyICovCiAJCWJyZWFrOwotCWNhc2UgTENEX1RZUEVfSEFOVFJPTklYOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMsIGhhbnRyb25peC1saWtlICovCisJY2FzZSBMQ0RfVFlQRV9IQU5UUk9OSVg6CisJCS8qIHBhcmFsbGVsIG1vZGUsIDggYml0cywgaGFudHJvbml4LWxpa2UgKi8KIAlkZWZhdWx0OgogCQlpZiAobGNkX3Byb3RvIDwgMCkKIAkJCWxjZF9wcm90byA9IExDRF9QUk9UT19QQVJBTExFTDsKQEAgLTE0OTYsOCArMTU1OCw3IEBACiAKIAkvKiBiZWZvcmUgdGhpcyBsaW5lLCB3ZSBtdXN0IE5PVCBzZW5kIGFueXRoaW5nIHRvIHRoZSBkaXNwbGF5LgogCSAqIFNpbmNlIGxjZF9pbml0X2Rpc3BsYXkoKSBuZWVkcyB0byB3cml0ZSBkYXRhLCB3ZSBoYXZlIHRvCi0JICogZW5hYmxlIG1hcmsgdGhlIExDRCBpbml0aWFsaXplZCBqdXN0IGJlZm9yZS4KLQkgKi8KKwkgKiBlbmFibGUgbWFyayB0aGUgTENEIGluaXRpYWxpemVkIGp1c3QgYmVmb3JlLiAqLwogCWxjZF9pbml0aWFsaXplZCA9IDE7CiAJbGNkX2luaXRfZGlzcGxheSgpOwogCkBAIC0xNTExLDcgKzE1NzIsOCBAQAogCQkJUEFORUxfVkVSU0lPTik7CiAjZW5kaWYKIAlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7Ci0JbGNkX211c3RfY2xlYXIgPSAxOwkvKiBjbGVhciB0aGUgZGlzcGxheSBvbiB0aGUgbmV4dCBkZXZpY2Ugb3BlbmluZyAqLworCS8qIGNsZWFyIHRoZSBkaXNwbGF5IG9uIHRoZSBuZXh0IGRldmljZSBvcGVuaW5nICovCisJbGNkX211c3RfY2xlYXIgPSAxOwogCWxjZF9nb3RveHkoKTsKIH0KIApAQCAtMTUzNSw3ICsxNTk3LDggQEAKIAkJCXJldHVybiAtRUlOVFI7CiAJfQogCi0JZm9yICg7IGNvdW50LS0gPiAwICYmIChrZXlwYWRfYnVmbGVuID4gMCk7ICsraSwgKyt0bXAsIC0ta2V5cGFkX2J1ZmxlbikgeworCWZvciAoOyBjb3VudC0tID4gMCAmJiAoa2V5cGFkX2J1ZmxlbiA+IDApOworCSAgICAgKytpLCArK3RtcCwgLS1rZXlwYWRfYnVmbGVuKSB7CiAJCXB1dF91c2VyKGtleXBhZF9idWZmZXJba2V5cGFkX3N0YXJ0XSwgdG1wKTsKIAkJa2V5cGFkX3N0YXJ0ID0gKGtleXBhZF9zdGFydCArIDEpICUgS0VZUEFEX0JVRkZFUjsKIAl9CkBAIC0xNTY0LDcgKzE2MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrZXlwYWRfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtleXBhZF9mb3BzID0gewogCS5yZWFkICAgID0ga2V5cGFkX3JlYWQsCQkvKiByZWFkICovCiAJLm9wZW4gICAgPSBrZXlwYWRfb3BlbiwJCS8qIG9wZW4gKi8KIAkucmVsZWFzZSA9IGtleXBhZF9yZWxlYXNlLAkvKiBjbG9zZSAqLwpAQCAtMTU5MSwxNCArMTY1NCwxNSBAQAogCX0KIH0KIAotLyogdGhpcyBmdW5jdGlvbiBzY2FucyBhbGwgdGhlIGJpdHMgaW52b2x2aW5nIGF0IGxlYXN0IG9uZSBsb2dpY2FsIHNpZ25hbCwgYW5kIHB1dHMgdGhlCi0gKiByZXN1bHRzIGluIHRoZSBiaXRmaWVsZCAicGh5c19yZWFkIiAob25lIGJpdCBwZXIgZXN0YWJsaXNoZWQgY29udGFjdCksIGFuZCBzZXRzCi0gKiAicGh5c19yZWFkX3ByZXYiIHRvICJwaHlzX3JlYWQiLgorLyogdGhpcyBmdW5jdGlvbiBzY2FucyBhbGwgdGhlIGJpdHMgaW52b2x2aW5nIGF0IGxlYXN0IG9uZSBsb2dpY2FsIHNpZ25hbCwKKyAqIGFuZCBwdXRzIHRoZSByZXN1bHRzIGluIHRoZSBiaXRmaWVsZCAicGh5c19yZWFkIiAob25lIGJpdCBwZXIgZXN0YWJsaXNoZWQKKyAqIGNvbnRhY3QpLCBhbmQgc2V0cyAicGh5c19yZWFkX3ByZXYiIHRvICJwaHlzX3JlYWQiLgogICoKLSAqIE5vdGU6IHRvIGRlYm91bmNlIGlucHV0IHNpZ25hbHMsIHdlIHdpbGwgb25seSBjb25zaWRlciBhcyBzd2l0Y2hlZCBhIHNpZ25hbCB3aGljaCBpcwotICogc3RhYmxlIGFjcm9zcyAyIG1lYXN1cmVzLiBTaWduYWxzIHdoaWNoIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0d28gcmVhZHMgd2lsbCBiZSBrZXB0Ci0gKiBhcyB0aGV5IHByZXZpb3VzbHkgd2VyZSBpbiB0aGVpciBsb2dpY2FsIGZvcm0gKHBoeXNfcHJldikuIEEgc2lnbmFsIHdoaWNoIGhhcyBqdXN0Ci0gKiBzd2l0Y2hlZCB3aWxsIGhhdmUgYSAxIGluIChwaHlzX3JlYWQgXiBwaHlzX3JlYWRfcHJldikuCisgKiBOb3RlOiB0byBkZWJvdW5jZSBpbnB1dCBzaWduYWxzLCB3ZSB3aWxsIG9ubHkgY29uc2lkZXIgYXMgc3dpdGNoZWQgYSBzaWduYWwKKyAqIHdoaWNoIGlzIHN0YWJsZSBhY3Jvc3MgMiBtZWFzdXJlcy4gU2lnbmFscyB3aGljaCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdHdvCisgKiByZWFkcyB3aWxsIGJlIGtlcHQgYXMgdGhleSBwcmV2aW91c2x5IHdlcmUgaW4gdGhlaXIgbG9naWNhbCBmb3JtIChwaHlzX3ByZXYpLgorICogQSBzaWduYWwgd2hpY2ggaGFzIGp1c3Qgc3dpdGNoZWQgd2lsbCBoYXZlIGEgMSBpbgorICogKHBoeXNfcmVhZCBeIHBoeXNfcmVhZF9wcmV2KS4KICAqLwogc3RhdGljIHZvaWQgcGh5c19zY2FuX2NvbnRhY3RzKHZvaWQpCiB7CkBAIC0xNjExLDIxICsxNjc1LDMwIEBACiAJcGh5c19yZWFkX3ByZXYgPSBwaHlzX3JlYWQ7CiAJcGh5c19yZWFkID0gMDsJCS8qIGZsdXNoIGFsbCBzaWduYWxzICovCiAKLQlvbGR2YWwgPSByX2R0cihwcHJ0KSB8IHNjYW5fbWFza19vOwkvKiBrZWVwIHRyYWNrIG9mIG9sZCB2YWx1ZSwgd2l0aCBhbGwgb3V0cHV0cyBkaXNhYmxlZCAqLwotCXdfZHRyKHBwcnQsIG9sZHZhbCAmIH5zY2FuX21hc2tfbyk7CS8qIGFjdGl2YXRlIGFsbCBrZXlib2FyZCBvdXRwdXRzIChhY3RpdmUgbG93KSAqLwotCWJpdG1hc2sgPSBQTkxfUElOUFVUKHJfc3RyKHBwcnQpKSAmIHNjYW5fbWFza19pOwkvKiB3aWxsIGhhdmUgYSAxIGZvciBlYWNoIGJpdCBzZXQgdG8gZ25kICovCi0Jd19kdHIocHBydCwgb2xkdmFsKTsJLyogZGlzYWJsZSBhbGwgbWF0cml4IHNpZ25hbHMgKi8KKwkvKiBrZWVwIHRyYWNrIG9mIG9sZCB2YWx1ZSwgd2l0aCBhbGwgb3V0cHV0cyBkaXNhYmxlZCAqLworCW9sZHZhbCA9IHJfZHRyKHBwcnQpIHwgc2Nhbl9tYXNrX287CisJLyogYWN0aXZhdGUgYWxsIGtleWJvYXJkIG91dHB1dHMgKGFjdGl2ZSBsb3cpICovCisJd19kdHIocHBydCwgb2xkdmFsICYgfnNjYW5fbWFza19vKTsKKworCS8qIHdpbGwgaGF2ZSBhIDEgZm9yIGVhY2ggYml0IHNldCB0byBnbmQgKi8KKwliaXRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiBzY2FuX21hc2tfaTsKKwkvKiBkaXNhYmxlIGFsbCBtYXRyaXggc2lnbmFscyAqLworCXdfZHRyKHBwcnQsIG9sZHZhbCk7CiAKIAkvKiBub3cgdGhhdCBhbGwgb3V0cHV0cyBhcmUgY2xlYXJlZCwgdGhlIG9ubHkgYWN0aXZlIGlucHV0IGJpdHMgYXJlCiAJICogZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBncm91bmQKIAkgKi8KLQlnbmRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiBzY2FuX21hc2tfaTsJLyogMSBmb3IgZWFjaCBncm91bmRlZCBpbnB1dCAqLwogCi0JcGh5c19yZWFkIHw9IChwbWFza190KSBnbmRtYXNrIDw8IDQwOwkvKiBncm91bmRlZCBpbnB1dHMgYXJlIHNpZ25hbHMgNDAtNDQgKi8KKwkvKiAxIGZvciBlYWNoIGdyb3VuZGVkIGlucHV0ICovCisJZ25kbWFzayA9IFBOTF9QSU5QVVQocl9zdHIocHBydCkpICYgc2Nhbl9tYXNrX2k7CisKKwkvKiBncm91bmRlZCBpbnB1dHMgYXJlIHNpZ25hbHMgNDAtNDQgKi8KKwlwaHlzX3JlYWQgfD0gKHBtYXNrX3QpIGduZG1hc2sgPDwgNDA7CiAKIAlpZiAoYml0bWFzayAhPSBnbmRtYXNrKSB7Ci0JCS8qIHNpbmNlIGNsZWFyaW5nIHRoZSBvdXRwdXRzIGNoYW5nZWQgc29tZSBpbnB1dHMsIHdlIGtub3cgdGhhdCBzb21lCi0JCSAqIGlucHV0IHNpZ25hbHMgYXJlIGN1cnJlbnRseSB0aWVkIHRvIHNvbWUgb3V0cHV0cy4gU28gd2UnbGwgc2NhbiB0aGVtLgorCQkvKiBzaW5jZSBjbGVhcmluZyB0aGUgb3V0cHV0cyBjaGFuZ2VkIHNvbWUgaW5wdXRzLCB3ZSBrbm93CisJCSAqIHRoYXQgc29tZSBpbnB1dCBzaWduYWxzIGFyZSBjdXJyZW50bHkgdGllZCB0byBzb21lIG91dHB1dHMuCisJCSAqIFNvIHdlJ2xsIHNjYW4gdGhlbS4KIAkJICovCiAJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKIAkJCWJpdHZhbCA9IDEgPDwgYml0OwpAQCAtMTYzOSwxMSArMTcxMiwxMjcgQEAKIAkJfQogCQl3X2R0cihwcHJ0LCBvbGR2YWwpOwkvKiBkaXNhYmxlIGFsbCBvdXRwdXRzICovCiAJfQotCS8qIHRoaXMgaXMgZWFzeTogdXNlIG9sZCBiaXRzIHdoZW4gdGhleSBhcmUgZmxhcHBpbmcsIHVzZSBuZXcgb25lcyB3aGVuIHN0YWJsZSAqLwotCXBoeXNfY3VyciA9Ci0JICAgIChwaHlzX3ByZXYgJiAocGh5c19yZWFkIF4gcGh5c19yZWFkX3ByZXYpKSB8IChwaHlzX3JlYWQgJgotCQkJCQkJCSAgfihwaHlzX3JlYWQgXgotCQkJCQkJCSAgICBwaHlzX3JlYWRfcHJldikpOworCS8qIHRoaXMgaXMgZWFzeTogdXNlIG9sZCBiaXRzIHdoZW4gdGhleSBhcmUgZmxhcHBpbmcsCisJICogdXNlIG5ldyBvbmVzIHdoZW4gc3RhYmxlICovCisJcGh5c19jdXJyID0gKHBoeXNfcHJldiAmIChwaHlzX3JlYWQgXiBwaHlzX3JlYWRfcHJldikpIHwKKwkJICAgIChwaHlzX3JlYWQgJiB+KHBoeXNfcmVhZCBeIHBoeXNfcmVhZF9wcmV2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlucHV0X3N0YXRlX2hpZ2goc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmlucHV0KQoreworI2lmIDAKKwkvKiBGSVhNRToKKwkgKiB0aGlzIGlzIGFuIGludmFsaWQgdGVzdC4gSXQgdHJpZXMgdG8gY2F0Y2gKKwkgKiB0cmFuc2l0aW9ucyBmcm9tIHNpbmdsZS1rZXkgdG8gbXVsdGlwbGUta2V5LCBidXQKKwkgKiBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBjb250YWN0cyBwb2xhcml0eS4KKwkgKiBUaGUgb25seSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBpcyB0byBwYXJzZSBrZXlzCisJICogZnJvbSB0aGUgbW9zdCBjb21wbGV4IHRvIHRoZSBzaW1wbGVzdCBjb21iaW5hdGlvbnMsCisJICogYW5kIG1hcmsgdGhlbSBhcyAnY2F1Z2h0JyBvbmNlIGEgY29tYmluYXRpb24KKwkgKiBtYXRjaGVzLCB0aGVuIHVubWF0Y2ggaXQgZm9yIGFsbCBvdGhlciBvbmVzLgorCSAqLworCisJLyogdHJ5IHRvIGNhdGNoIGRhbmdlcm91cyB0cmFuc2l0aW9ucyBjYXNlcyA6CisJICogc29tZW9uZSBhZGRzIGEgYml0LCBzbyB0aGlzIHNpZ25hbCB3YXMgYSBmYWxzZQorCSAqIHBvc2l0aXZlIHJlc3VsdGluZyBmcm9tIGEgdHJhbnNpdGlvbi4gV2Ugc2hvdWxkCisJICogaW52YWxpZGF0ZSB0aGUgc2lnbmFsIGltbWVkaWF0ZWx5IGFuZCBub3QgY2FsbCB0aGUKKwkgKiByZWxlYXNlIGZ1bmN0aW9uLgorCSAqIGVnOiAwIC0ocHJlc3MgQSktPiBBIC0ocHJlc3MgQiktPiBBQiA6IGRvbid0IG1hdGNoIEEncyByZWxlYXNlLgorCSAqLworCWlmICgoKHBoeXNfcHJldiAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpCisJICAgICYmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID4gaW5wdXQtPnZhbHVlKSkgeworCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7IC8qIGludmFsaWRhdGUgKi8KKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpIHsKKwkJaWYgKChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX1NURCkgJiYKKwkJICAgIChpbnB1dC0+aGlnaF90aW1lciA9PSAwKSkgeworCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKKwkJCWlmIChpbnB1dC0+dS5zdGQucHJlc3NfZmN0ICE9IE5VTEwpCisJCQkJaW5wdXQtPnUuc3RkLnByZXNzX2ZjdChpbnB1dC0+dS5zdGQucHJlc3NfZGF0YSk7CisJCX0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCS8qIHdpbGwgdHVybiBvbiB0aGUgbGlnaHQgKi8KKwkJCWtleXByZXNzZWQgPSAxOworCisJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPT0gMCkgeworCQkJCWNoYXIgKnByZXNzX3N0ciA9IGlucHV0LT51LmtiZC5wcmVzc19zdHI7CisJCQkJaWYgKHByZXNzX3N0clswXSkKKwkJCQkJa2V5cGFkX3NlbmRfa2V5KHByZXNzX3N0ciwKKwkJCQkJCQlzaXplb2YocHJlc3Nfc3RyKSk7CisJCQl9CisKKwkJCWlmIChpbnB1dC0+dS5rYmQucmVwZWF0X3N0clswXSkgeworCQkJCWNoYXIgKnJlcGVhdF9zdHIgPSBpbnB1dC0+dS5rYmQucmVwZWF0X3N0cjsKKwkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPj0gS0VZUEFEX1JFUF9TVEFSVCkgeworCQkJCQlpbnB1dC0+aGlnaF90aW1lciAtPSBLRVlQQURfUkVQX0RFTEFZOworCQkJCQlrZXlwYWRfc2VuZF9rZXkocmVwZWF0X3N0ciwKKwkJCQkJCQlzaXplb2YocmVwZWF0X3N0cikpOworCQkJCX0KKwkJCQkvKiB3ZSB3aWxsIG5lZWQgdG8gY29tZSBiYWNrIGhlcmUgc29vbiAqLworCQkJCWlucHV0c19zdGFibGUgPSAwOworCQkJfQorCisJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPCAyNTUpCisJCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKKwkJfQorCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQkvKiBlbHNlIHNpZ25hbCBmYWxsaW5nIGRvd24uIExldCdzIGZhbGwgdGhyb3VnaC4gKi8KKwkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfRkFMTElORzsKKwkJaW5wdXQtPmZhbGxfdGltZXIgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlucHV0X3N0YXRlX2ZhbGxpbmcoc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmlucHV0KQoreworI2lmIDAKKwkvKiBGSVhNRSAhISEgc2FtZSBjb21tZW50IGFzIGluIGlucHV0X3N0YXRlX2hpZ2ggKi8KKwlpZiAoKChwaHlzX3ByZXYgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKQorCSAgICAmJiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA+IGlucHV0LT52YWx1ZSkpIHsKKwkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfTE9XOwkvKiBpbnZhbGlkYXRlICovCisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkgeworCQlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCS8qIHdpbGwgdHVybiBvbiB0aGUgbGlnaHQgKi8KKwkJCWtleXByZXNzZWQgPSAxOworCisJCQlpZiAoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHJbMF0pIHsKKwkJCQljaGFyICpyZXBlYXRfc3RyID0gaW5wdXQtPnUua2JkLnJlcGVhdF9zdHI7CisJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID49IEtFWVBBRF9SRVBfU1RBUlQpCisJCQkJCWlucHV0LT5oaWdoX3RpbWVyIC09IEtFWVBBRF9SRVBfREVMQVk7CisJCQkJCWtleXBhZF9zZW5kX2tleShyZXBlYXRfc3RyLAorCQkJCQkJCXNpemVvZihyZXBlYXRfc3RyKSk7CisJCQkJLyogd2Ugd2lsbCBuZWVkIHRvIGNvbWUgYmFjayBoZXJlIHNvb24gKi8KKwkJCQlpbnB1dHNfc3RhYmxlID0gMDsKKwkJCX0KKworCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyIDwgMjU1KQorCQkJCWlucHV0LT5oaWdoX3RpbWVyKys7CisJCX0KKwkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfSElHSDsKKwl9IGVsc2UgaWYgKGlucHV0LT5mYWxsX3RpbWVyID49IGlucHV0LT5mYWxsX3RpbWUpIHsKKwkJLyogY2FsbCByZWxlYXNlIGV2ZW50ICovCisJCWlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX1NURCkgeworCQkJdm9pZCAoKnJlbGVhc2VfZmN0KShpbnQpID0gaW5wdXQtPnUuc3RkLnJlbGVhc2VfZmN0OworCQkJaWYgKHJlbGVhc2VfZmN0ICE9IE5VTEwpCisJCQkJcmVsZWFzZV9mY3QoaW5wdXQtPnUuc3RkLnJlbGVhc2VfZGF0YSk7CisJCX0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCWNoYXIgKnJlbGVhc2Vfc3RyID0gaW5wdXQtPnUua2JkLnJlbGVhc2Vfc3RyOworCQkJaWYgKHJlbGVhc2Vfc3RyWzBdKQorCQkJCWtleXBhZF9zZW5kX2tleShyZWxlYXNlX3N0ciwKKwkJCQkJCXNpemVvZihyZWxlYXNlX3N0cikpOworCQl9CisKKwkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfTE9XOworCX0gZWxzZSB7CisJCWlucHV0LT5mYWxsX3RpbWVyKys7CisJCWlucHV0c19zdGFibGUgPSAwOworCX0KIH0KIAogc3RhdGljIHZvaWQgcGFuZWxfcHJvY2Vzc19pbnB1dHModm9pZCkKQEAgLTE2NjYsMTAgKzE4NTUsMTIgQEAKIAkJY2FzZSBJTlBVVF9TVF9MT1c6CiAJCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSAhPSBpbnB1dC0+dmFsdWUpCiAJCQkJYnJlYWs7Ci0JCQkvKiBpZiBhbGwgbmVlZGVkIG9uZXMgd2VyZSBhbHJlYWR5IHNldCBwcmV2aW91c2x5LCB0aGlzIG1lYW5zIHRoYXQKLQkJCSAqIHRoaXMgbG9naWNhbCBzaWduYWwgaGFzIGJlZW4gYWN0aXZhdGVkIGJ5IHRoZSByZWxlYXNpbmcgb2YKLQkJCSAqIGFub3RoZXIgY29tYmluZWQgc2lnbmFsLCBzbyB3ZSBkb24ndCB3YW50IHRvIG1hdGNoLgotCQkJICogZWc6IEFCIC0ocmVsZWFzZSBCKS0+IEEgLShyZWxlYXNlIEEpLT4gMCA6IGRvbid0IG1hdGNoIEEuCisJCQkvKiBpZiBhbGwgbmVlZGVkIG9uZXMgd2VyZSBhbHJlYWR5IHNldCBwcmV2aW91c2x5LAorCQkJICogdGhpcyBtZWFucyB0aGF0IHRoaXMgbG9naWNhbCBzaWduYWwgaGFzIGJlZW4KKwkJCSAqIGFjdGl2YXRlZCBieSB0aGUgcmVsZWFzaW5nIG9mIGFub3RoZXIgY29tYmluZWQKKwkJCSAqIHNpZ25hbCwgc28gd2UgZG9uJ3Qgd2FudCB0byBtYXRjaC4KKwkJCSAqIGVnOiBBQiAtKHJlbGVhc2UgQiktPiBBIC0ocmVsZWFzZSBBKS0+IDAgOgorCQkJICogICAgIGRvbid0IG1hdGNoIEEuCiAJCQkgKi8KIAkJCWlmICgocGh5c19wcmV2ICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkKIAkJCQlicmVhazsKQEAgLTE2OTAsMTIyICsxODgxLDExIEBACiAJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9ISUdIOwogCQkJLyogbm8gYnJlYWsgaGVyZSwgZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgSU5QVVRfU1RfSElHSDoKLSNpZiAwCi0JCQkvKiBGSVhNRToKLQkJCSAqIHRoaXMgaXMgYW4gaW52YWxpZCB0ZXN0LiBJdCB0cmllcyB0byBjYXRjaCB0cmFuc2l0aW9ucyBmcm9tIHNpbmdsZS1rZXkKLQkJCSAqIHRvIG11bHRpcGxlLWtleSwgYnV0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGNvbnRhY3RzIHBvbGFyaXR5LgotCQkJICogVGhlIG9ubHkgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gaXMgdG8gcGFyc2Uga2V5cyBmcm9tIHRoZSBtb3N0IGNvbXBsZXgKLQkJCSAqIHRvIHRoZSBzaW1wbGVzdCBjb21iaW5hdGlvbnMsIGFuZCBtYXJrIHRoZW0gYXMgJ2NhdWdodCcgb25jZSBhIGNvbWJpbmF0aW9uCi0JCQkgKiBtYXRjaGVzLCB0aGVuIHVubWF0Y2ggaXQgZm9yIGFsbCBvdGhlciBvbmVzLgotCQkJICovCi0KLQkJCS8qIHRyeSB0byBjYXRjaCBkYW5nZXJvdXMgdHJhbnNpdGlvbnMgY2FzZXMgOgotCQkJICogc29tZW9uZSBhZGRzIGEgYml0LCBzbyB0aGlzIHNpZ25hbCB3YXMgYSBmYWxzZQotCQkJICogcG9zaXRpdmUgcmVzdWx0aW5nIGZyb20gYSB0cmFuc2l0aW9uLiBXZSBzaG91bGQgaW52YWxpZGF0ZQotCQkJICogdGhlIHNpZ25hbCBpbW1lZGlhdGVseSBhbmQgbm90IGNhbGwgdGhlIHJlbGVhc2UgZnVuY3Rpb24uCi0JCQkgKiBlZzogMCAtKHByZXNzIEEpLT4gQSAtKHByZXNzIEIpLT4gQUIgOiBkb24ndCBtYXRjaCBBJ3MgcmVsZWFzZS4KLQkJCSAqLwotCQkJaWYgKCgocGh5c19wcmV2ICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkKLQkJCSAgICAmJiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA+IGlucHV0LT52YWx1ZSkpIHsKLQkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CS8qIGludmFsaWRhdGUgKi8KKwkJCWlmIChpbnB1dF9zdGF0ZV9oaWdoKGlucHV0KSkKIAkJCQlicmVhazsKLQkJCX0KLSNlbmRpZgotCi0JCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpIHsKLQkJCQlpZiAoKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfU1REKQotCQkJCSAgICAmJiAoaW5wdXQtPmhpZ2hfdGltZXIgPT0gMCkpIHsKLQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKLQkJCQkJaWYgKGlucHV0LT51LnN0ZC5wcmVzc19mY3QgIT0gTlVMTCkKLQkJCQkJCWlucHV0LT51LnN0ZC5wcmVzc19mY3QoaW5wdXQtPnUuCi0JCQkJCQkJCSAgICAgICBzdGQuCi0JCQkJCQkJCSAgICAgICBwcmVzc19kYXRhKTsKLQkJCQl9IGVsc2UgaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfS0JEKSB7Ci0JCQkJCWtleXByZXNzZWQgPSAxOwkvKiB3aWxsIHR1cm4gb24gdGhlIGxpZ2h0ICovCi0KLQkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID09IDApIHsKLQkJCQkJCWlmIChpbnB1dC0+dS5rYmQucHJlc3Nfc3RyWzBdKQotCQkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+Ci0JCQkJCQkJCQl1LmtiZC4KLQkJCQkJCQkJCXByZXNzX3N0ciwKLQkJCQkJCQkJCXNpemVvZgotCQkJCQkJCQkJKGlucHV0LT4KLQkJCQkJCQkJCSB1LmtiZC4KLQkJCQkJCQkJCSBwcmVzc19zdHIpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChpbnB1dC0+dS5rYmQucmVwZWF0X3N0clswXSkgewotCQkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID49Ci0JCQkJCQkgICAgS0VZUEFEX1JFUF9TVEFSVCkgewotCQkJCQkJCWlucHV0LT5oaWdoX3RpbWVyIC09Ci0JCQkJCQkJICAgIEtFWVBBRF9SRVBfREVMQVk7Ci0JCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT4KLQkJCQkJCQkJCXUua2JkLgotCQkJCQkJCQkJcmVwZWF0X3N0ciwKLQkJCQkJCQkJCXNpemVvZgotCQkJCQkJCQkJKGlucHV0LT4KLQkJCQkJCQkJCSB1LmtiZC4KLQkJCQkJCQkJCSByZXBlYXRfc3RyKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpbnB1dHNfc3RhYmxlID0gMDsJLyogd2Ugd2lsbCBuZWVkIHRvIGNvbWUgYmFjayBoZXJlIHNvb24gKi8KLQkJCQkJfQotCi0JCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA8IDI1NSkKLQkJCQkJCWlucHV0LT5oaWdoX3RpbWVyKys7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBlbHNlIHNpZ25hbCBmYWxsaW5nIGRvd24uIExldCdzIGZhbGwgdGhyb3VnaC4gKi8KLQkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9GQUxMSU5HOwotCQkJCWlucHV0LT5mYWxsX3RpbWVyID0gMDsKLQkJCX0KIAkJCS8qIG5vIGJyZWFrIGhlcmUsIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIElOUFVUX1NUX0ZBTExJTkc6Ci0jaWYgMAotCQkJLyogRklYTUUgISEhIHNhbWUgY29tbWVudCBhcyBhYm92ZSAqLwotCQkJaWYgKCgocGh5c19wcmV2ICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkKLQkJCSAgICAmJiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA+IGlucHV0LT52YWx1ZSkpIHsKLQkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CS8qIGludmFsaWRhdGUgKi8KLQkJCQlicmVhazsKLQkJCX0KLSNlbmRpZgotCi0JCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpIHsKLQkJCQlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKLQkJCQkJa2V5cHJlc3NlZCA9IDE7CS8qIHdpbGwgdHVybiBvbiB0aGUgbGlnaHQgKi8KLQotCQkJCQlpZiAoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHJbMF0pIHsKLQkJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA+PSBLRVlQQURfUkVQX1NUQVJUKQotCQkJCQkJCWlucHV0LT5oaWdoX3RpbWVyIC09IEtFWVBBRF9SRVBfREVMQVk7Ci0JCQkJCQlrZXlwYWRfc2VuZF9rZXkoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHIsCi0JCQkJCQkJCXNpemVvZihpbnB1dC0+dS5rYmQucmVwZWF0X3N0cikpOwotCQkJCQkJaW5wdXRzX3N0YWJsZSA9IDA7CS8qIHdlIHdpbGwgbmVlZCB0byBjb21lIGJhY2sgaGVyZSBzb29uICovCi0JCQkJCX0KLQotCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPCAyNTUpCi0JCQkJCQlpbnB1dC0+aGlnaF90aW1lcisrOwotCQkJCX0KLQkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9ISUdIOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChpbnB1dC0+ZmFsbF90aW1lciA+PSBpbnB1dC0+ZmFsbF90aW1lKSB7Ci0JCQkJLyogY2FsbCByZWxlYXNlIGV2ZW50ICovCi0JCQkJaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfU1REKSB7Ci0JCQkJCWlmIChpbnB1dC0+dS5zdGQucmVsZWFzZV9mY3QgIT0gTlVMTCkKLQkJCQkJCWlucHV0LT51LnN0ZC5yZWxlYXNlX2ZjdChpbnB1dC0+dS5zdGQucmVsZWFzZV9kYXRhKTsKLQotCQkJCX0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKLQkJCQkJaWYgKGlucHV0LT51LmtiZC5yZWxlYXNlX3N0clswXSkKLQkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+dS5rYmQucmVsZWFzZV9zdHIsCi0JCQkJCQkJCXNpemVvZihpbnB1dC0+dS5rYmQucmVsZWFzZV9zdHIpKTsKLQkJCQl9Ci0KLQkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWlucHV0LT5mYWxsX3RpbWVyKys7Ci0JCQkJaW5wdXRzX3N0YWJsZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpbnB1dF9zdGF0ZV9mYWxsaW5nKGlucHV0KTsKIAkJfQogCX0KIH0KQEAgLTE4MTUsNyArMTg5NSw5IEBACiAJaWYgKGtleXBhZF9lbmFibGVkICYmIGtleXBhZF9pbml0aWFsaXplZCkgewogCQlpZiAoc3Bpbl90cnlsb2NrKCZwcHJ0X2xvY2spKSB7CiAJCQlwaHlzX3NjYW5fY29udGFjdHMoKTsKLQkJCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOwkvKiBubyBuZWVkIGZvciB0aGUgcGFycG9ydCBhbnltb3JlICovCisKKwkJCS8qIG5vIG5lZWQgZm9yIHRoZSBwYXJwb3J0IGFueW1vcmUgKi8KKwkJCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOwogCQl9CiAKIAkJaWYgKCFpbnB1dHNfc3RhYmxlIHx8IHBoeXNfY3VyciAhPSBwaHlzX3ByZXYpCkBAIC0xODUwLDggKzE5MzIsOCBAQAogfQogCiAvKiBjb252ZXJ0cyBhIG5hbWUgb2YgdGhlIGZvcm0gIih7QmJBYVBwU3NFZX17MDEyMzQ1NjctfSkqIiB0byBhIHNlcmllcyBvZiBiaXRzLgotICogaWYgPG9tYXNrPiBvciA8aW1hc2s+IGFyZSBub24tbnVsbCwgdGhleSB3aWxsIGJlIG9yJ2VkIHdpdGggdGhlIGJpdHMgY29ycmVzcG9uZGluZwotICogdG8gb3V0IGFuZCBpbiBiaXRzIHJlc3BlY3RpdmVseS4KKyAqIGlmIDxvbWFzaz4gb3IgPGltYXNrPiBhcmUgbm9uLW51bGwsIHRoZXkgd2lsbCBiZSBvcidlZCB3aXRoIHRoZSBiaXRzCisgKiBjb3JyZXNwb25kaW5nIHRvIG91dCBhbmQgaW4gYml0cyByZXNwZWN0aXZlbHkuCiAgKiByZXR1cm5zIDEgaWYgb2ssIDAgaWYgZXJyb3IgKGluIHdoaWNoIGNhc2UsIG5vdGhpbmcgaXMgd3JpdHRlbikuCiAgKi8KIHN0YXRpYyBpbnQgaW5wdXRfbmFtZTJtYXNrKGNoYXIgKm5hbWUsIHBtYXNrX3QgKm1hc2ssIHBtYXNrX3QgKnZhbHVlLApAQCAtMTg2NCw3ICsxOTQ2LDggQEAKIAlvbSA9IGltID0gbSA9IHYgPSAwVUxMOwogCXdoaWxlICgqbmFtZSkgewogCQlpbnQgaW4sIG91dCwgYml0LCBuZWc7Ci0JCWZvciAoaW4gPSAwOyAoaW4gPCBzaXplb2Yoc2lndGFiKSkgJiYgKHNpZ3RhYltpbl0gIT0gKm5hbWUpOyBpbisrKQorCQlmb3IgKGluID0gMDsgKGluIDwgc2l6ZW9mKHNpZ3RhYikpICYmCisJCQkgICAgIChzaWd0YWJbaW5dICE9ICpuYW1lKTsgaW4rKykKIAkJCTsKIAkJaWYgKGluID49IHNpemVvZihzaWd0YWIpKQogCQkJcmV0dXJuIDA7CS8qIGlucHV0IG5hbWUgbm90IGZvdW5kICovCkBAIC0xOTEyLDggKzE5OTUsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWlmICghaW5wdXRfbmFtZTJtYXNrKG5hbWUsICZrZXktPm1hc2ssICZrZXktPnZhbHVlLCAmc2Nhbl9tYXNrX2ksCi0JCQkgICAgICZzY2FuX21hc2tfbykpCisJCQkgICAgICZzY2FuX21hc2tfbykpIHsKKwkJa2ZyZWUoa2V5KTsKIAkJcmV0dXJuIE5VTEw7CisJfQogCiAJa2V5LT50eXBlID0gSU5QVVRfVFlQRV9LQkQ7CiAJa2V5LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKQEAgLTE5MzYsNyArMjAyMSw4IEBACiAvKiB0cmllcyB0byBiaW5kIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIHNpZ25hbCBuYW1lIDxuYW1lPi4gVGhlIGZ1bmN0aW9uCiAgKiA8cHJlc3NfZmN0PiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSA8cHJlc3NfZGF0YT4gYXJnIHdoZW4gdGhlIHNpZ25hbCBpcwogICogYWN0aXZhdGVkLCBhbmQgc28gb24gZm9yIDxyZWxlYXNlX2ZjdD4vPHJlbGVhc2VfZGF0YT4KLSAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBzaWduYWwgaWYgb2ssIE5VTEwgaWYgdGhlIHNpZ25hbCBjb3VsZCBub3QgYmUgYm91bmQuCisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgc2lnbmFsIGlmIG9rLCBOVUxMIGlmIHRoZSBzaWduYWwgY291bGQgbm90CisgKiBiZSBib3VuZC4KICAqLwogc3RhdGljIHN0cnVjdCBsb2dpY2FsX2lucHV0ICpwYW5lbF9iaW5kX2NhbGxiYWNrKGNoYXIgKm5hbWUsCiAJCQkJCQkgdm9pZCAoKnByZXNzX2ZjdCkgKGludCksCkBAIC0yMDI4LDMzICsyMTE0LDUyIEBACiAKIAlpZiAocHBydCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJwYW5lbF9hdHRhY2goKTogcG9ydC0+bnVtYmVyPSVkIHBhcnBvcnQ9JWQsIGFscmVhZHkgcmVnaXN0ZXJlZCAhXG4iLAorCQkgICAgICAgInBhbmVsX2F0dGFjaCgpOiBwb3J0LT5udW1iZXI9JWQgcGFycG9ydD0lZCwgIgorCQkgICAgICAgImFscmVhZHkgcmVnaXN0ZXJlZCAhXG4iLAogCQkgICAgICAgcG9ydC0+bnVtYmVyLCBwYXJwb3J0KTsKIAkJcmV0dXJuOwogCX0KIAotCXBwcnQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCAicGFuZWwiLCBOVUxMLCBOVUxMLAkvKiBwZiwga2YgKi8KKwlwcHJ0ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgInBhbmVsIiwgTlVMTCwgTlVMTCwgIC8qIHBmLCBrZiAqLwogCQkJCSAgICAgICBOVUxMLAogCQkJCSAgICAgICAvKlBBUlBPUlRfREVWX0VYQ0wgKi8KIAkJCQkgICAgICAgMCwgKHZvaWQgKikmcHBydCk7Ci0KLQlpZiAocGFycG9ydF9jbGFpbShwcHJ0KSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJQYW5lbDogY291bGQgbm90IGNsYWltIGFjY2VzcyB0byBwYXJwb3J0JWQuIEFib3J0aW5nLlxuIiwKLQkJICAgICAgIHBhcnBvcnQpOworCWlmIChwcHJ0ID09IE5VTEwpIHsKKwkJcHJfZXJyKCJwYW5lbF9hdHRhY2goKTogcG9ydC0+bnVtYmVyPSVkIHBhcnBvcnQ9JWQsICIKKwkJICAgICAgICJwYXJwb3J0X3JlZ2lzdGVyX2RldmljZSgpIGZhaWxlZFxuIiwKKwkJICAgICAgIHBvcnQtPm51bWJlciwgcGFycG9ydCk7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBtdXN0IGluaXQgTENEIGZpcnN0LCBqdXN0IGluIGNhc2UgYW4gSVJRIGZyb20gdGhlIGtleXBhZCBpcyBnZW5lcmF0ZWQgYXQga2V5cGFkIGluaXQgKi8KKwlpZiAocGFycG9ydF9jbGFpbShwcHJ0KSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQYW5lbDogY291bGQgbm90IGNsYWltIGFjY2VzcyB0byBwYXJwb3J0JWQuICIKKwkJICAgICAgICJBYm9ydGluZy5cbiIsIHBhcnBvcnQpOworCQlnb3RvIGVycl91bnJlZ19kZXZpY2U7CisJfQorCisJLyogbXVzdCBpbml0IExDRCBmaXJzdCwganVzdCBpbiBjYXNlIGFuIElSUSBmcm9tIHRoZSBrZXlwYWQgaXMKKwkgKiBnZW5lcmF0ZWQgYXQga2V5cGFkIGluaXQKKwkgKi8KIAlpZiAobGNkX2VuYWJsZWQpIHsKIAkJbGNkX2luaXQoKTsKLQkJbWlzY19yZWdpc3RlcigmbGNkX2Rldik7CisJCWlmIChtaXNjX3JlZ2lzdGVyKCZsY2RfZGV2KSkKKwkJCWdvdG8gZXJyX3VucmVnX2RldmljZTsKIAl9CiAKIAlpZiAoa2V5cGFkX2VuYWJsZWQpIHsKIAkJa2V5cGFkX2luaXQoKTsKLQkJbWlzY19yZWdpc3Rlcigma2V5cGFkX2Rldik7CisJCWlmIChtaXNjX3JlZ2lzdGVyKCZrZXlwYWRfZGV2KSkKKwkJCWdvdG8gZXJyX2xjZF91bnJlZzsKIAl9CisJcmV0dXJuOworCitlcnJfbGNkX3VucmVnOgorCWlmIChsY2RfZW5hYmxlZCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZsY2RfZGV2KTsKK2Vycl91bnJlZ19kZXZpY2U6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwlwcHJ0ID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgcGFuZWxfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQpAQCAtMjA2NCw3ICsyMTY5LDggQEAKIAogCWlmICghcHBydCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJwYW5lbF9kZXRhY2goKTogcG9ydC0+bnVtYmVyPSVkIHBhcnBvcnQ9JWQsIG5vdGhpbmcgdG8gdW5yZWdpc3Rlci5cbiIsCisJCSAgICAgICAicGFuZWxfZGV0YWNoKCk6IHBvcnQtPm51bWJlcj0lZCBwYXJwb3J0PSVkLCAiCisJCSAgICAgICAibm90aGluZyB0byB1bnJlZ2lzdGVyLlxuIiwKIAkJICAgICAgIHBvcnQtPm51bWJlciwgcGFycG9ydCk7CiAJCXJldHVybjsKIAl9CkBAIC0yMTA1LDEzICsyMjExLDE1IEBACiAKIAkvKiB0YWtlIGNhcmUgb2YgYW4gZXZlbnR1YWwgcHJvZmlsZSAqLwogCXN3aXRjaCAocHJvZmlsZSkgewotCWNhc2UgUEFORUxfUFJPRklMRV9DVVNUT006CS8qIGN1c3RvbSBwcm9maWxlICovCisJY2FzZSBQQU5FTF9QUk9GSUxFX0NVU1RPTToKKwkJLyogY3VzdG9tIHByb2ZpbGUgKi8KIAkJaWYgKGtleXBhZF90eXBlIDwgMCkKIAkJCWtleXBhZF90eXBlID0gREVGQVVMVF9LRVlQQUQ7CiAJCWlmIChsY2RfdHlwZSA8IDApCiAJCQlsY2RfdHlwZSA9IERFRkFVTFRfTENEOwogCQlicmVhazsKLQljYXNlIFBBTkVMX1BST0ZJTEVfT0xEOgkvKiA4IGJpdHMsIDIqMTYsIG9sZCBrZXlwYWQgKi8KKwljYXNlIFBBTkVMX1BST0ZJTEVfT0xEOgorCQkvKiA4IGJpdHMsIDIqMTYsIG9sZCBrZXlwYWQgKi8KIAkJaWYgKGtleXBhZF90eXBlIDwgMCkKIAkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfT0xEOwogCQlpZiAobGNkX3R5cGUgPCAwKQpAQCAtMjEyMSwyNSArMjIyOSwyOSBAQAogCQlpZiAobGNkX2h3aWR0aCA8IDApCiAJCQlsY2RfaHdpZHRoID0gMTY7CiAJCWJyZWFrOwotCWNhc2UgUEFORUxfUFJPRklMRV9ORVc6CS8qIHNlcmlhbCwgMioxNiwgbmV3IGtleXBhZCAqLworCWNhc2UgUEFORUxfUFJPRklMRV9ORVc6CisJCS8qIHNlcmlhbCwgMioxNiwgbmV3IGtleXBhZCAqLwogCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQogCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9ORVc7CiAJCWlmIChsY2RfdHlwZSA8IDApCiAJCQlsY2RfdHlwZSA9IExDRF9UWVBFX0tTMDA3NDsKIAkJYnJlYWs7Ci0JY2FzZSBQQU5FTF9QUk9GSUxFX0hBTlRST05JWDoJLyogOCBiaXRzLCAyKjE2IGhhbnRyb25peC1saWtlLCBubyBrZXlwYWQgKi8KKwljYXNlIFBBTkVMX1BST0ZJTEVfSEFOVFJPTklYOgorCQkvKiA4IGJpdHMsIDIqMTYgaGFudHJvbml4LWxpa2UsIG5vIGtleXBhZCAqLwogCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQogCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9OT05FOwogCQlpZiAobGNkX3R5cGUgPCAwKQogCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9IQU5UUk9OSVg7CiAJCWJyZWFrOwotCWNhc2UgUEFORUxfUFJPRklMRV9ORVhDT006CS8qIGdlbmVyaWMgOCBiaXRzLCAyKjE2LCBuZXhjb20ga2V5cGFkLCBlZy4gTmV4Y29tLiAqLworCWNhc2UgUEFORUxfUFJPRklMRV9ORVhDT006CisJCS8qIGdlbmVyaWMgOCBiaXRzLCAyKjE2LCBuZXhjb20ga2V5cGFkLCBlZy4gTmV4Y29tLiAqLwogCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQogCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9ORVhDT007CiAJCWlmIChsY2RfdHlwZSA8IDApCiAJCQlsY2RfdHlwZSA9IExDRF9UWVBFX05FWENPTTsKIAkJYnJlYWs7Ci0JY2FzZSBQQU5FTF9QUk9GSUxFX0xBUkdFOgkvKiA4IGJpdHMsIDIqNDAsIG9sZCBrZXlwYWQgKi8KKwljYXNlIFBBTkVMX1BST0ZJTEVfTEFSR0U6CisJCS8qIDggYml0cywgMio0MCwgb2xkIGtleXBhZCAqLwogCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQogCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9PTEQ7CiAJCWlmIChsY2RfdHlwZSA8IDApCkBAIC0yMTc5LDYgKzIyOTEsNyBAQAogCQlpZiAocHBydCkgewogCQkJcGFycG9ydF9yZWxlYXNlKHBwcnQpOwogCQkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwkJCXBwcnQgPSBOVUxMOwogCQl9CiAJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcik7CiAJCXByaW50ayhLRVJOX0VSUiAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCkBAIC0yMTk1LDcgKzIzMDgsOCBAQAogCWVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCiAJCSAgICAgICAiIG5vdCB5ZXQgcmVnaXN0ZXJlZFxuIik7Ci0JLyogdGVsbHMgdmFyaW91cyBzdWJzeXN0ZW1zIGFib3V0IHRoZSBmYWN0IHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQgKi8KKwkvKiB0ZWxscyB2YXJpb3VzIHN1YnN5c3RlbXMgYWJvdXQgdGhlIGZhY3QgdGhhdCBpbml0aWFsaXphdGlvbgorCSAgIGlzIGZpbmlzaGVkICovCiAJaW5pdF9pbl9wcm9ncmVzcyA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjI4LDYgKzIzNDIsNyBAQAogCQkvKiBUT0RPOiBmcmVlIGFsbCBpbnB1dCBzaWduYWxzICovCiAJCXBhcnBvcnRfcmVsZWFzZShwcHJ0KTsKIAkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwkJcHBydCA9IE5VTEw7CiAJfQogCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvaW5vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCmluZGV4IDY0M2I0MTMuLmJjMWM2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCkBAIC04MTUsNyArODE1LDcgQEAKIH0KIAogLyoKLSAqIFNtYWxsIGFkZHJlcyBzcGFjZSBvcGVyYXRpb25zIGZvciBQT0hNRUxGUy4KKyAqIFNtYWxsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgUE9ITUVMRlMuCiAgKi8KIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcG9obWVsZnNfYW9wcyA9IHsKIAkucmVhZHBhZ2UJCT0gcG9obWVsZnNfcmVhZHBhZ2UsCkBAIC04NDcsNyArODQ3LDcgQEAKIH0KIAogLyoKLSAqIC0+YWxsb2NfaW5vZGUoKSBjYWxsYmFjay4gQWxsb2NhdGVzIGlub2RlIGFuZCBpbml0aWxpemVzIHByaXZhdGUgZGF0YS4KKyAqIC0+YWxsb2NfaW5vZGUoKSBjYWxsYmFjay4gQWxsb2NhdGVzIGlub2RlIGFuZCBpbml0aWFsaXplcyBwcml2YXRlIGRhdGEuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnBvaG1lbGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogewogCXN0cnVjdCBwb2htZWxmc19zYiAqcHNiID0gUE9ITUVMRlNfU0Ioc2IpOwogCXN0cnVjdCBwb2htZWxmc19pbm9kZSAqcGk7Ci0JdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IGluX2Ryb3BfbGlzdCA9IDA7CiAJc3RydWN0IGlub2RlICppbm9kZSwgKnRtcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9xdWF0ZWNoX3VzYjIvcXVhdGVjaF91c2IyLmMKaW5kZXggZWNkNzMxMy4uOTgzOGVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL3F1YXRlY2hfdXNiMi5jCkBAIC0yNTgsOCArMjU4LDYgQEAKIHN0YXRpYyBpbnQgcXQyX2JveF9zZXRfcmVnaXN0ZXIoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKIAkJdW5zaWduZWQgc2hvcnQgVWFydF9OdW1iZXIsIHVuc2lnbmVkIHNob3J0IFJlZ2lzdGVyX051bSwKIAkJdW5zaWduZWQgc2hvcnQgVmFsdWUpOwotc3RhdGljIGludCBxdDJfYm94X2ZsdXNoKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsICB1bnNpZ25lZCBjaGFyIHVhcnRfbnVtYmVyLAotCQl1bnNpZ25lZCBzaG9ydCByY3Zfb3JfeG1pdCk7CiBzdGF0aWMgaW50IHF0Ml9ib3hzZXR1YXJ0KHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHVuc2lnbmVkIHNob3J0IFVhcnRfTnVtYmVyLAogCQl1bnNpZ25lZCBzaG9ydCBkZWZhdWx0X2Rpdmlzb3IsIHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9MQ1IpOwogc3RhdGljIGludCBxdDJfYm94c2V0aHdfZmxvd2N0bChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLApAQCAtNjQ1LDkgKzY0Myw2IEBACiAJLyogZ2V0IHRoZSBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCiAJcG9ydF9leHRyYSA9IHF0Ml9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOyAvKiBwb3J0IHByaXZhdGUgZGF0YSAqLwogCi0JLyogd2UgZG9uJ3QgbmVlZCB0byBmb3JjZSBmbHVzaCB0aG91Z2ggdGhlIGhhcmR3YXJlLCBzbyB3ZSBza2lwIHVzaW5nCi0JICogcXQyX2JveF9mbHVzaCgpIGhlcmUgKi8KLQogCS8qIHdlIGNhbiBub3cgKGFuZCBvbmx5IG5vdykgc3RvcCByZWFkaW5nIGRhdGEgKi8KIAlwb3J0X2V4dHJhLT5jbG9zZV9wZW5kaW5nID0gdHJ1ZTsKIAlkYmcoIiVzKCk6IHBvcnRfZXh0cmEtPmNsb3NlX3BlbmRpbmcgPSB0cnVlIiwgX19mdW5jX18pOwpAQCAtMTg0MSwyNCArMTgzNiw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0vKiogQGJyaWVmIFJlcXVlc3QgdGhlIFR4IG9yIFJ4IGJ1ZmZlcnMgb24gdGhlIFVTQiBzaWRlIGJlIGZsdXNoZWQKLSAqCi0gKiBUeCBmbHVzaDogV2hlbiBhbGwgdGhlIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIGhhcyBiZWVuIHNlbnQsIHNlbmQgYW4gZXNjYXBlCi0gKiBzZXF1ZW5jZSBiYWNrIHVwIHRoZSBkYXRhIHN0cmVhbSB0byB1cwotICogUnggZmx1c2g6IGFkZCBhIGZsYWcgaW4gdGhlIGRhdGEgc3RyZWFtIG5vdyBzbyB3ZSBrbm93IHdoZW4gaXQncyBtYWRlIGl0J3MKLSAqIHdheSB1cCB0byB1cy4KLSAqLwotc3RhdGljIGludCBxdDJfYm94X2ZsdXNoKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsICB1bnNpZ25lZCBjaGFyIHVhcnRfbnVtYmVyLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcmN2X29yX3htaXQpCi17Ci0JaW50IHJlc3VsdDsKLQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCVFUMl9GTFVTSF9ERVZJQ0UsIDB4NDAsIHJjdl9vcl94bWl0LCB1YXJ0X251bWJlciwgTlVMTCwgMCwKLQkJMzAwKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCiAvKiogcXQyX2JveHNldHVhcnQgLSBJc3N1ZSBhIFNFVF9VQVJUIHZlbmRvci1zcGNpZmljIHJlcXVlc3Qgb24gdGhlIGRlZmF1bHQKICAqIGNvbnRyb2wgcGlwZS4gSWYgc3VjY2Vzc2Z1bCBzZXRzIGJhdWQgcmF0ZSBkaXZpc29yIGFuZCBMQ1IgdmFsdWUuCiAgKi8KQEAgLTE4NzMsNiArMTg1MCw3IEBACiAJCQlRVDJfR0VUX1NFVF9VQVJULCAweDQwLCBkZWZhdWx0X2Rpdmlzb3IsIFVhcnROdW1hbmRMQ1IsCiAJCQlOVUxMLCAwLCAzMDApOwogfQorCiAvKiogcXQyX2JveHNldGh3X2Zsb3djdGwgLSBUdXJuIGhhcmR3YXJlIChSVFMvQ1RTKSBmbG93IGNvbnRyb2wgb24gYW5kIG9mZiBmb3IKICAqIGEgaGFyZHdhcmUgVUFSVC4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3F1aWNrc3RhcnQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9xdWlja3N0YXJ0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlYTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9xdWlja3N0YXJ0L0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorY29uZmlnIEFDUElfUVVJQ0tTVEFSVAorCXRyaXN0YXRlICJBQ1BJIFF1aWNrc3RhcnQga2V5IGRyaXZlciIKKwlkZXBlbmRzIG9uIEFDUEkgJiYgSU5QVVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB0aGUgQUNQSQorCSAgcXVpY2tzdGFydCBrZXkgcHJvdG9jb2wuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHF1aWNrc3RhcnQuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9xdWlja3N0YXJ0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3F1aWNrc3RhcnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZTBlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9xdWlja3N0YXJ0L01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19BQ1BJX1FVSUNLU1RBUlQpCQkrPSBxdWlja3N0YXJ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9xdWlja3N0YXJ0L3F1aWNrc3RhcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9xdWlja3N0YXJ0L3F1aWNrc3RhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjEyMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3F1aWNrc3RhcnQvcXVpY2tzdGFydC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogIHF1aWNrc3RhcnQuYyAtIEFDUEkgRGlyZWN0IEFwcCBMYXVuY2ggZHJpdmVyCisgKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBBbmdlbG8gQXJyaWZhbm8gPG1pa25peEBnbWFpbC5jb20+CisgKgorICogIEluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gZGlzYXNzZWJsZWQgZHNkdCBhbmQgZnJvbSBoZXJlOgorICogICJodHRwOi8vZG93bmxvYWQubWljcm9zb2Z0LmNvbS9kb3dubG9hZC85L2MvNS8KKyAqICA5YzViMjE2Ny04MDE3LTRiYWUtOWZkZS1kNTk5YmFjODE4NGEvRGlyQXBwTGF1bmNoX1Zpc3RhLmRvYyIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2RlZmluZSBRVUlDS1NUQVJUX1ZFUlNJT04gIjEuMDMiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKK01PRFVMRV9BVVRIT1IoIkFuZ2VsbyBBcnJpZmFubyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIERpcmVjdCBBcHAgTGF1bmNoIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFFVSUNLU1RBUlRfQUNQSV9ERVZJQ0VfTkFNRSAgICJxdWlja3N0YXJ0IgorI2RlZmluZSBRVUlDS1NUQVJUX0FDUElfQ0xBU1MgICAgICAgICAicXVpY2tzdGFydCIKKyNkZWZpbmUgUVVJQ0tTVEFSVF9BQ1BJX0hJRCAgICAgICAgICAgIlBOUDBDMzIiCisKKyNkZWZpbmUgUVVJQ0tTVEFSVF9QRl9EUklWRVJfTkFNRSAgICAgInF1aWNrc3RhcnQiCisjZGVmaW5lIFFVSUNLU1RBUlRfUEZfREVWSUNFX05BTUUgICAgICJxdWlja3N0YXJ0IgorI2RlZmluZSBRVUlDS1NUQVJUX1BGX0RFVkFUVFJfTkFNRSAgICAicHJlc3NlZF9idXR0b24iCisKKyNkZWZpbmUgUVVJQ0tTVEFSVF9NQVhfQlROX05BTUVfTEVOICAgMTYKKworLyogVGhlcmUgd2lsbCBiZSB0d28gZXZlbnRzOgorCSAqIDB4MDIgLSBBIGhvdCBidXR0b24gd2FzIHByZXNzZWQgd2hpbGUgZGV2aWNlIHdhcyBvZmYvc2xlZXBpbmcuCisJICogMHg4MCAtIEEgaG90IGJ1dHRvbiB3YXMgcHJlc3NlZCB3aGlsZSBkZXZpY2Ugd2FzIHVwLiAqLworI2RlZmluZSBRVUlDS1NUQVJUX0VWRU5UX1dBS0UgICAgICAgICAweDAyCisjZGVmaW5lIFFVSUNLU1RBUlRfRVZFTlRfUlVOVElNRSAgICAgIDB4ODAKKworc3RydWN0IHF1aWNrc3RhcnRfYnRuIHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBpZDsKKwlzdHJ1Y3QgcXVpY2tzdGFydF9idG4gKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IHF1aWNrc3RhcnRfZHJpdmVyX2RhdGEgeworCXN0cnVjdCBxdWlja3N0YXJ0X2J0biAqYnRuX2xzdDsKKwlzdHJ1Y3QgcXVpY2tzdGFydF9idG4gKnByZXNzZWQ7Cit9IHF1aWNrc3RhcnRfZGF0YTsKKworLyogQUNQSSBkcml2ZXIgU3RydWN0cyAqLworc3RydWN0IHF1aWNrc3RhcnRfYWNwaSB7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IHF1aWNrc3RhcnRfYnRuICpidG47Cit9Oworc3RhdGljIGludCBxdWlja3N0YXJ0X2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgcXVpY2tzdGFydF9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAgcXVpY2tzdGFydF9kZXZpY2VfaWRzW10gPSB7CisJe1FVSUNLU1RBUlRfQUNQSV9ISUQsIDB9LAorCXsiIiwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHF1aWNrc3RhcnRfYWNwaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAicXVpY2tzdGFydCIsCisJLmNsYXNzID0gUVVJQ0tTVEFSVF9BQ1BJX0NMQVNTLAorCS5pZHMgPSBxdWlja3N0YXJ0X2RldmljZV9pZHMsCisJLm9wcyA9IHsKKwkJCS5hZGQgPSBxdWlja3N0YXJ0X2FjcGlfYWRkLAorCQkJLnJlbW92ZSA9IHF1aWNrc3RhcnRfYWNwaV9yZW1vdmUsCisJCX0sCit9OworCisvKiBJbnB1dCBkZXZpY2Ugc3RydWN0cyAqLworc3RydWN0IGlucHV0X2RldiAqcXVpY2tzdGFydF9pbnB1dDsKKworLyogUGxhdGZvcm0gZHJpdmVyIHN0cnVjdHMgKi8KK3N0YXRpYyBzc2l6ZV90IGJ1dHRvbnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpOworc3RhdGljIHNzaXplX3QgcHJlc3NlZF9idXR0b25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpOworc3RhdGljIHNzaXplX3QgcHJlc3NlZF9idXR0b25fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJIHNpemVfdCBjb3VudCk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJlc3NlZF9idXR0b24sIDA2NjYsIHByZXNzZWRfYnV0dG9uX3Nob3csCisJCQkJCSBwcmVzc2VkX2J1dHRvbl9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYnV0dG9ucywgMDQ0NCwgYnV0dG9uc19zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZl9kZXZpY2U7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwZl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBRVUlDS1NUQVJUX1BGX0RSSVZFUl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9Cit9OworCisvKgorICogUGxhdGZvcm0gZHJpdmVyIGZ1bmN0aW9ucworICovCitzdGF0aWMgc3NpemVfdCBidXR0b25zX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgcXVpY2tzdGFydF9idG4gKnB0ciA9IHF1aWNrc3RhcnRfZGF0YS5idG5fbHN0OworCisJaWYgKCFwdHIpCisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm5vbmUiKTsKKworCXdoaWxlIChwdHIgJiYgKGNvdW50IDwgUEFHRV9TSVpFKSkgeworCQlpZiAocHRyLT5uYW1lKSB7CisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwKKwkJCQkJUEFHRV9TSVpFIC0gY291bnQsCisJCQkJCSIlZFx0JXNcbiIsIHB0ci0+aWQsIHB0ci0+bmFtZSk7CisJCX0KKwkJcHRyID0gcHRyLT5uZXh0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgcHJlc3NlZF9idXR0b25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCShxdWlja3N0YXJ0X2RhdGEucHJlc3NlZD9xdWlja3N0YXJ0X2RhdGEucHJlc3NlZC0+bmFtZToibm9uZSIpKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBwcmVzc2VkX2J1dHRvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChjb3VudCA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0cm5jYXNlY21wKGJ1ZiwgIm5vbmUiLCA0KSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXF1aWNrc3RhcnRfZGF0YS5wcmVzc2VkID0gTlVMTDsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIEhvdHN0YXJ0IEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcXVpY2tzdGFydF9idG5sc3RfYWRkKHN0cnVjdCBxdWlja3N0YXJ0X2J0biAqKmRhdGEpCit7CisJc3RydWN0IHF1aWNrc3RhcnRfYnRuICoqcHRyID0gJnF1aWNrc3RhcnRfZGF0YS5idG5fbHN0OworCisJd2hpbGUgKCpwdHIpCisJCXB0ciA9ICYoKCpwdHIpLT5uZXh0KTsKKworCSpwdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcXVpY2tzdGFydF9idG4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpwdHIpIHsKKwkJKmRhdGEgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJKmRhdGEgPSAqcHRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHF1aWNrc3RhcnRfYnRubHN0X2RlbChzdHJ1Y3QgcXVpY2tzdGFydF9idG4gKmRhdGEpCit7CisJc3RydWN0IHF1aWNrc3RhcnRfYnRuICoqcHRyID0gJnF1aWNrc3RhcnRfZGF0YS5idG5fbHN0OworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKnB0cikgeworCQlpZiAoKnB0ciA9PSBkYXRhKSB7CisJCQkqcHRyID0gKCpwdHIpLT5uZXh0OworCQkJa2ZyZWUoZGF0YSk7CisJCQlyZXR1cm47CisJCX0KKwkJcHRyID0gJigoKnB0ciktPm5leHQpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcXVpY2tzdGFydF9idG5sc3RfZnJlZSh2b2lkKQoreworCXN0cnVjdCBxdWlja3N0YXJ0X2J0biAqcHRyID0gcXVpY2tzdGFydF9kYXRhLmJ0bl9sc3Q7CisJc3RydWN0IHF1aWNrc3RhcnRfYnRuICpscHRyID0gTlVMTDsKKworCXdoaWxlIChwdHIpIHsKKwkJbHB0ciA9IHB0cjsKKwkJcHRyID0gcHRyLT5uZXh0OworCQlrZnJlZShscHRyLT5uYW1lKTsKKwkJa2ZyZWUobHB0cik7CisJfQorCisJcmV0dXJuOworfQorCisvKiBBQ1BJIERyaXZlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHF1aWNrc3RhcnRfYWNwaV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHF1aWNrc3RhcnRfYWNwaSAqcXVpY2tzdGFydCA9IGRhdGE7CisKKwlpZiAoIXF1aWNrc3RhcnQpCisJCXJldHVybjsKKworCWlmIChldmVudCA9PSBRVUlDS1NUQVJUX0VWRU5UX1dBS0UpCisJCXF1aWNrc3RhcnRfZGF0YS5wcmVzc2VkID0gcXVpY2tzdGFydC0+YnRuOworCWVsc2UgaWYgKGV2ZW50ID09IFFVSUNLU1RBUlRfRVZFTlRfUlVOVElNRSkgeworCQlpbnB1dF9yZXBvcnRfa2V5KHF1aWNrc3RhcnRfaW5wdXQsIHF1aWNrc3RhcnQtPmJ0bi0+aWQsIDEpOworCQlpbnB1dF9zeW5jKHF1aWNrc3RhcnRfaW5wdXQpOworCQlpbnB1dF9yZXBvcnRfa2V5KHF1aWNrc3RhcnRfaW5wdXQsIHF1aWNrc3RhcnQtPmJ0bi0+aWQsIDApOworCQlpbnB1dF9zeW5jKHF1aWNrc3RhcnRfaW5wdXQpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHF1aWNrc3RhcnRfYWNwaV9naGlkKHN0cnVjdCBxdWlja3N0YXJ0X2FjcGkgKnF1aWNrc3RhcnQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdWludDMyX3QgdXNhZ2VpZCA9IDA7CisKKwlpZiAoIXF1aWNrc3RhcnQpCisJCXJldHVybjsKKworCS8qIFRoaXMgcmV0dXJucyBhIGJ1ZmZlciB0ZWxsaW5nIHRoZSBidXR0b24gdXNhZ2UgSUQsCisJICogYW5kIHRyaWdnZXJzIHBlbmRpbmcgbm90aWZ5IGV2ZW50cyAoVGhlIG9uZXMgYmVmb3JlIGJvb3RpbmcpLiAqLworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHF1aWNrc3RhcnQtPmRldmljZS0+aGFuZGxlLAorCQkJCQkiR0hJRCIsIE5VTEwsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhYnVmZmVyLnBvaW50ZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJxdWlja3N0YXJ0OiAlcyBHSElEIG1ldGhvZCBmYWlsZWQuXG4iLAorCQkgICAgICAgcXVpY2tzdGFydC0+YnRuLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChidWZmZXIubGVuZ3RoIDwgOCkKKwkJcmV0dXJuOworCisJLyogPDxUaGUgR0hJRCBtZXRob2QgY2FuIHJldHVybiBhIEJZVEUsIFdPUkQsIG9yIERXT1JELgorCSAqIFRoZSB2YWx1ZSBtdXN0IGJlIGVuY29kZWQgaW4gbGl0dGxlLWVuZGlhbiBieXRlCisJICogb3JkZXIgKGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QpLj4+ICovCisJdXNhZ2VpZCA9ICooKHVpbnQzMl90ICopKGJ1ZmZlci5wb2ludGVyICsgKGJ1ZmZlci5sZW5ndGggLSA4KSkpOworCXF1aWNrc3RhcnQtPmJ0bi0+aWQgPSB1c2FnZWlkOworCisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworfQorCitzdGF0aWMgaW50IHF1aWNrc3RhcnRfYWNwaV9jb25maWcoc3RydWN0IHF1aWNrc3RhcnRfYWNwaSAqcXVpY2tzdGFydCwgY2hhciAqYmlkKQoreworCWludCBsZW4gPSBzdHJsZW4oYmlkKTsKKwlpbnQgcmV0OworCisJLyogQWRkIGJ1dHRvbiB0byBsaXN0ICovCisJcmV0ID0gcXVpY2tzdGFydF9idG5sc3RfYWRkKCZxdWlja3N0YXJ0LT5idG4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlxdWlja3N0YXJ0LT5idG4tPm5hbWUgPSBremFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghcXVpY2tzdGFydC0+YnRuLT5uYW1lKSB7CisJCXF1aWNrc3RhcnRfYnRubHN0X2ZyZWUoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN0cmNweShxdWlja3N0YXJ0LT5idG4tPm5hbWUsIGJpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWlja3N0YXJ0X2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWludCByZXQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBxdWlja3N0YXJ0X2FjcGkgKnF1aWNrc3RhcnQgPSBOVUxMOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJcXVpY2tzdGFydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxdWlja3N0YXJ0X2FjcGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXF1aWNrc3RhcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJcXVpY2tzdGFydC0+ZGV2aWNlID0gZGV2aWNlOworCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIFFVSUNLU1RBUlRfQUNQSV9ERVZJQ0VfTkFNRSk7CisJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIFFVSUNLU1RBUlRfQUNQSV9DTEFTUyk7CisJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IHF1aWNrc3RhcnQ7CisKKwkvKiBBZGQgYnV0dG9uIHRvIGxpc3QgYW5kIGluaXRpYWxpemUgc29tZSBzdHVmZiAqLworCXJldCA9IHF1aWNrc3RhcnRfYWNwaV9jb25maWcocXVpY2tzdGFydCwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9jb25maWc7CisKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsCisJCQkJCQlBQ1BJX0FMTF9OT1RJRlksCisJCQkJCQlxdWlja3N0YXJ0X2FjcGlfbm90aWZ5LAorCQkJCQkJcXVpY2tzdGFydCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicXVpY2tzdGFydDogTm90aWZ5IGhhbmRsZXIgaW5zdGFsbCBlcnJvclxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9pbnN0YWxsbm90aWZ5OworCX0KKworCXF1aWNrc3RhcnRfYWNwaV9naGlkKHF1aWNrc3RhcnQpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfaW5zdGFsbG5vdGlmeToKKwlxdWlja3N0YXJ0X2J0bmxzdF9kZWwocXVpY2tzdGFydC0+YnRuKTsKKworZmFpbF9jb25maWc6CisKKwlrZnJlZShxdWlja3N0YXJ0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXVpY2tzdGFydF9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcXVpY2tzdGFydF9hY3BpICpxdWlja3N0YXJ0ID0gTlVMTDsKKworCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcXVpY2tzdGFydCA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKworCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGRldmljZS0+aGFuZGxlLAorCQkJCQkJIEFDUElfQUxMX05PVElGWSwKKwkJCQkJICAgIHF1aWNrc3RhcnRfYWNwaV9ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJxdWlja3N0YXJ0OiBFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIik7CisKKworCWtmcmVlKHF1aWNrc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZHVsZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgcXVpY2tzdGFydF9leGl0KHZvaWQpCit7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocXVpY2tzdGFydF9pbnB1dCk7CisJaW5wdXRfZnJlZV9kZXZpY2UocXVpY2tzdGFydF9pbnB1dCk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBmX2RldmljZS0+ZGV2LCAmZGV2X2F0dHJfcHJlc3NlZF9idXR0b24pOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGZfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9idXR0b25zKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBmX2RldmljZSk7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGZfZHJpdmVyKTsKKworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZxdWlja3N0YXJ0X2FjcGlfZHJpdmVyKTsKKworCXF1aWNrc3RhcnRfYnRubHN0X2ZyZWUoKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBfX2luaXQgcXVpY2tzdGFydF9pbml0X2lucHV0KHZvaWQpCit7CisJc3RydWN0IHF1aWNrc3RhcnRfYnRuICoqcHRyID0gJnF1aWNrc3RhcnRfZGF0YS5idG5fbHN0OworCWludCBjb3VudDsKKworCXF1aWNrc3RhcnRfaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKworCWlmICghcXVpY2tzdGFydF9pbnB1dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlxdWlja3N0YXJ0X2lucHV0LT5uYW1lID0gIlF1aWNrc3RhcnQgQUNQSSBCdXR0b25zIjsKKwlxdWlja3N0YXJ0X2lucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisKKwl3aGlsZSAoKnB0cikgeworCQljb3VudCsrOworCQlzZXRfYml0KEVWX0tFWSwgcXVpY2tzdGFydF9pbnB1dC0+ZXZiaXQpOworCQlzZXRfYml0KCgqcHRyKS0+aWQsIHF1aWNrc3RhcnRfaW5wdXQtPmtleWJpdCk7CisJCXB0ciA9ICYoKCpwdHIpLT5uZXh0KTsKKwl9CisKKwlyZXR1cm4gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHF1aWNrc3RhcnRfaW5wdXQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxdWlja3N0YXJ0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisKKwkvKiBBQ1BJIENoZWNrICovCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQUNQSSBkcml2ZXIgcmVnaXN0ZXIgKi8KKwlzdGF0dXMgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnF1aWNrc3RhcnRfYWNwaV9kcml2ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIElmIGV4aXN0aW5nIGJ1cyB3aXRoIG5vIGRldmljZXMgKi8KKwlpZiAoIXF1aWNrc3RhcnRfZGF0YS5idG5fbHN0KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9wZmRydl9yZWc7CisJfQorCisJLyogUGxhdGZvcm0gZHJpdmVyIHJlZ2lzdGVyICovCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwZl9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9wZmRydl9yZWc7CisKKwkvKiBQbGF0Zm9ybSBkZXZpY2UgcmVnaXN0ZXIgKi8KKwlwZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoUVVJQ0tTVEFSVF9QRl9ERVZJQ0VfTkFNRSwgLTEpOworCWlmICghcGZfZGV2aWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9wZmRldl9hbGxvYzsKKwl9CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZl9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9wZmRldl9hZGQ7CisKKwkvKiBDcmVhdGUgZGV2aWNlIHN5c2ZzIGZpbGUgKi8KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBmX2RldmljZS0+ZGV2LCAmZGV2X2F0dHJfcHJlc3NlZF9idXR0b24pOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9kZXZfZmlsZTsKKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGZfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9idXR0b25zKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZGV2X2ZpbGUyOworCisKKwkvKiBJbnB1dCBkZXZpY2UgKi8KKwlyZXQgPSBxdWlja3N0YXJ0X2luaXRfaW5wdXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfaW5wdXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJxdWlja3N0YXJ0OiBBQ1BJIERpcmVjdCBBcHAgTGF1bmNoIHZlciAlc1xuIiwKKwkJCQkJCVFVSUNLU1RBUlRfVkVSU0lPTik7CisKKwlyZXR1cm4gMDsKK2ZhaWxfaW5wdXQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZl9kZXZpY2UtPmRldiwgJmRldl9hdHRyX2J1dHRvbnMpOworCitmYWlsX2Rldl9maWxlMjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBmX2RldmljZS0+ZGV2LCAmZGV2X2F0dHJfcHJlc3NlZF9idXR0b24pOworCitmYWlsX2Rldl9maWxlOgorCXBsYXRmb3JtX2RldmljZV9kZWwocGZfZGV2aWNlKTsKKworZmFpbF9wZmRldl9hZGQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZl9kZXZpY2UpOworCitmYWlsX3BmZGV2X2FsbG9jOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwZl9kcml2ZXIpOworCitmYWlsX3BmZHJ2X3JlZzoKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmcXVpY2tzdGFydF9hY3BpX2RyaXZlcik7CisKKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChxdWlja3N0YXJ0X2luaXQpOworbW9kdWxlX2V4aXQocXVpY2tzdGFydF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2IzYzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1jb25maWcgUkFNWlNXQVAKLQl0cmlzdGF0ZSAiQ29tcHJlc3NlZCBpbi1tZW1vcnkgc3dhcCBkZXZpY2UgKHJhbXpzd2FwKSIKLQlkZXBlbmRzIG9uIFNXQVAKLQlzZWxlY3QgTFpPX0NPTVBSRVNTCi0Jc2VsZWN0IExaT19ERUNPTVBSRVNTCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgQ3JlYXRlcyB2aXJ0dWFsIGJsb2NrIGRldmljZXMgd2hpY2ggY2FuIChvbmx5KSBiZSB1c2VkIGFzIHN3YXAKLQkgIGRpc2tzLiBQYWdlcyBzd2FwcGVkIHRvIHRoZXNlIGRpc2tzIGFyZSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4KLQkgIG1lbW9yeSBpdHNlbGYuCi0KLQkgIFNlZSByYW16c3dhcC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0JICBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20vCi0KLWNvbmZpZyBSQU1aU1dBUF9TVEFUUwotCWJvb2wgIkVuYWJsZSByYW16c3dhcCBzdGF0cyIKLQlkZXBlbmRzIG9uIFJBTVpTV0FQCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgcmFtenN3YXAuIFRoaXMgYWRkcyBvbmx5IGEgbWluaW1hbAotCSAgb3ZlcmhlYWQuIEluIHVuc3VyZSwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2Q3ZGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1yYW16c3dhcC1vYmpzCTo9CXJhbXpzd2FwX2Rydi5vIHh2bWFsbG9jLm8KLQotb2JqLSQoQ09ORklHX1JBTVpTV0FQKQkrPQlyYW16c3dhcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXAudHh0IGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5NGFjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcmFtenN3YXA6IENvbXByZXNzZWQgUkFNIGJhc2VkIHN3YXAgZGV2aWNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVByb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbS8KLQotKiBJbnRyb2R1Y3Rpb24KLQotVGhlIHJhbXpzd2FwIG1vZHVsZSBjcmVhdGVzIFJBTSBiYXNlZCBibG9jayBkZXZpY2VzIHdoaWNoIGNhbiAob25seSkgYmUgdXNlZCBhcwotc3dhcCBkaXNrcy4gUGFnZXMgc3dhcHBlZCB0byB0aGVzZSBkZXZpY2VzIGFyZSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gbWVtb3J5Ci1pdHNlbGYuIFNlZSBwcm9qZWN0IGhvbWUgZm9yIHVzZSBjYXNlcywgcGVyZm9ybWFuY2UgbnVtYmVycyBhbmQgYSBsb3QgbW9yZS4KLQotSW5kaXZpZHVhbCByYW16c3dhcCBkZXZpY2VzIGFyZSBjb25maWd1cmVkIGFuZCBpbml0aWFsaXplZCB1c2luZyByenNjb250cm9sCi11c2Vyc3BhY2UgdXRpbGl0eSBhcyBzaG93biBpbiBleGFtcGxlcyBiZWxvdy4gU2VlIHJ6c2NvbnRyb2wgbWFuIHBhZ2UgZm9yIG1vcmUKLWRldGFpbHMuCi0KLSogVXNhZ2UKLQotRm9sbG93aW5nIHNob3dzIGEgdHlwaWNhbCBzZXF1ZW5jZSBvZiBzdGVwcyBmb3IgdXNpbmcgcmFtenN3YXAuCi0KLTEpIExvYWQgTW9kdWxlczoKLQltb2Rwcm9iZSByYW16c3dhcCBudW1fZGV2aWNlcz00Ci0JVGhpcyBjcmVhdGVzIDQgKHVuaW5pdGlhbGl6ZWQpIGRldmljZXM6IC9kZXYvcmFtenN3YXB7MCwxLDIsM30KLQkobnVtX2RldmljZXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBEZWZhdWx0OiAxKQotCi0yKSBJbml0aWFsaXplOgotCVVzZSByenNjb250cm9sIHV0aWxpdHkgdG8gY29uZmlndXJlIGFuZCBpbml0aWFsaXplIGluZGl2aWR1YWwKLQlyYW16c3dhcCBkZXZpY2VzLiBFeGFtcGxlOgotCXJ6c2NvbnRyb2wgL2Rldi9yYW16c3dhcDIgLS1pbml0ICMgdXNlcyBkZWZhdWx0IHZhbHVlIG9mIGRpc2tzaXplX2tiCi0KLQkqU2VlIHJ6c2NvbnRyb2wgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMqCi0KLTMpIEFjdGl2YXRlOgotCXN3YXBvbiAvZGV2L3JhbXpzd2FwMiAjIG9yIGFueSBvdGhlciBpbml0aWFsaXplZCByYW16c3dhcCBkZXZpY2UKLQotNCkgU3RhdHM6Ci0JcnpzY29udHJvbCAvZGV2L3JhbXpzd2FwMiAtLXN0YXRzCi0KLTUpIERlYWN0aXZhdGU6Ci0Jc3dhcG9mZiAvZGV2L3JhbXpzd2FwMgotCi02KSBSZXNldDoKLQlyenNjb250cm9sIC9kZXYvcmFtenN3YXAyIC0tcmVzZXQKLQkoVGhpcyBmcmVlcyBhbGwgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgZGV2aWNlKS4KLQotCi1QbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBhdDoKLSAtIE1haWxpbmcgbGlzdDogbGludXgtbW0tY2MgYXQgbGFwdG9wIGRvdCBvcmcKLSAtIElzc3VlIHRyYWNrZXI6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jb21wY2FjaGUvaXNzdWVzL2xpc3QKLQotTml0aW4gR3VwdGEKLW5ndXB0YUB2ZmxhcmUub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGJmOTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5jCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLS8qCi0gKiBDb21wcmVzc2VkIFJBTSBiYXNlZCBzd2FwIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCAgTml0aW4gR3VwdGEKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKLSAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCi0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKLSAqCi0gKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KLSAqLwotCi0jZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJyYW16c3dhcCIKLSNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2x6by5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSAicmFtenN3YXBfZHJ2LmgiCi0KLS8qIEdsb2JhbHMgKi8KLXN0YXRpYyBpbnQgcmFtenN3YXBfbWFqb3I7Ci1zdGF0aWMgc3RydWN0IHJhbXpzd2FwICpkZXZpY2VzOwotCi0vKiBNb2R1bGUgcGFyYW1zIChkb2N1bWVudGF0aW9uIGF0IGVuZCkgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2RldmljZXM7Ci0KLXN0YXRpYyBpbnQgcnpzX3Rlc3RfZmxhZyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgdTMyIGluZGV4LAotCQkJZW51bSByenNfcGFnZWZsYWdzIGZsYWcpCi17Ci0JcmV0dXJuIHJ6cy0+dGFibGVbaW5kZXhdLmZsYWdzICYgQklUKGZsYWcpOwotfQotCi1zdGF0aWMgdm9pZCByenNfc2V0X2ZsYWcoc3RydWN0IHJhbXpzd2FwICpyenMsIHUzMiBpbmRleCwKLQkJCWVudW0gcnpzX3BhZ2VmbGFncyBmbGFnKQotewotCXJ6cy0+dGFibGVbaW5kZXhdLmZsYWdzIHw9IEJJVChmbGFnKTsKLX0KLQotc3RhdGljIHZvaWQgcnpzX2NsZWFyX2ZsYWcoc3RydWN0IHJhbXpzd2FwICpyenMsIHUzMiBpbmRleCwKLQkJCWVudW0gcnpzX3BhZ2VmbGFncyBmbGFnKQotewotCXJ6cy0+dGFibGVbaW5kZXhdLmZsYWdzICY9IH5CSVQoZmxhZyk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFnZV96ZXJvX2ZpbGxlZCh2b2lkICpwdHIpCi17Ci0JdW5zaWduZWQgaW50IHBvczsKLQl1bnNpZ25lZCBsb25nICpwYWdlOwotCi0JcGFnZSA9ICh1bnNpZ25lZCBsb25nICopcHRyOwotCi0JZm9yIChwb3MgPSAwOyBwb3MgIT0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpwYWdlKTsgcG9zKyspIHsKLQkJaWYgKHBhZ2VbcG9zXSkKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCByYW16c3dhcF9zZXRfZGlza3NpemUoc3RydWN0IHJhbXpzd2FwICpyenMsIHNpemVfdCB0b3RhbHJhbV9ieXRlcykKLXsKLQlpZiAoIXJ6cy0+ZGlza3NpemUpIHsKLQkJcHJfaW5mbygKLQkJImRpc2sgc2l6ZSBub3QgcHJvdmlkZWQuIFlvdSBjYW4gdXNlIGRpc2tzaXplX2tiIG1vZHVsZSAiCi0JCSJwYXJhbSB0byBzcGVjaWZ5IHNpemUuXG5Vc2luZyBkZWZhdWx0OiAoJXUlJSBvZiBSQU0pLlxuIiwKLQkJZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbQotCQkpOwotCQlyenMtPmRpc2tzaXplID0gZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbSAqCi0JCQkJCSh0b3RhbHJhbV9ieXRlcyAvIDEwMCk7Ci0JfQotCi0JaWYgKHJ6cy0+ZGlza3NpemUgPiAyICogKHRvdGFscmFtX2J5dGVzKSkgewotCQlwcl9pbmZvKAotCQkiVGhlcmUgaXMgbGl0dGxlIHBvaW50IGNyZWF0aW5nIGEgcmFtenN3YXAgb2YgZ3JlYXRlciB0aGFuICIKLQkJInR3aWNlIHRoZSBzaXplIG9mIG1lbW9yeSBzaW5jZSB3ZSBleHBlY3QgYSAyOjEgY29tcHJlc3Npb24gIgotCQkicmF0aW8uIE5vdGUgdGhhdCByYW16c3dhcCB1c2VzIGFib3V0IDAuMSUlIG9mIHRoZSBzaXplIG9mICIKLQkJInRoZSBzd2FwIGRldmljZSB3aGVuIG5vdCBpbiB1c2Ugc28gYSBodWdlIHJhbXpzd2FwIGlzICIKLQkJIndhc3RlZnVsLlxuIgotCQkiXHRNZW1vcnkgU2l6ZTogJXp1IGtCXG4iCi0JCSJcdFNpemUgeW91IHNlbGVjdGVkOiAlenUga0JcbiIKLQkJIkNvbnRpbnVpbmcgYW55d2F5IC4uLlxuIiwKLQkJdG90YWxyYW1fYnl0ZXMgPj4gMTAsIHJ6cy0+ZGlza3NpemUKLQkJKTsKLQl9Ci0KLQlyenMtPmRpc2tzaXplICY9IFBBR0VfTUFTSzsKLX0KLQotLyoKLSAqIFN3YXAgaGVhZGVyICgxc3QgcGFnZSBvZiBzd2FwIGRldmljZSkgY29udGFpbnMgaW5mb3JtYXRpb24KLSAqIGFib3V0IGEgc3dhcCBmaWxlL3BhcnRpdGlvbi4gUHJlcGFyZSBzdWNoIGEgaGVhZGVyIGZvciB0aGUKLSAqIGdpdmVuIHJhbXpzd2FwIGRldmljZSBzbyB0aGF0IHN3YXBvbiBjYW4gaWRlbnRpZnkgaXQgYXMgYQotICogc3dhcCBwYXJ0aXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkIHNldHVwX3N3YXBfaGVhZGVyKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1bmlvbiBzd2FwX2hlYWRlciAqcykKLXsKLQlzLT5pbmZvLnZlcnNpb24gPSAxOwotCXMtPmluZm8ubGFzdF9wYWdlID0gKHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVCkgLSAxOwotCXMtPmluZm8ubnJfYmFkcGFnZXMgPSAwOwotCW1lbWNweShzLT5tYWdpYy5tYWdpYywgIlNXQVBTUEFDRTIiLCAxMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJhbXpzd2FwX2lvY3RsX2dldF9zdGF0cyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywKLQkJCXN0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cyAqcykKLXsKLQlzLT5kaXNrc2l6ZSA9IHJ6cy0+ZGlza3NpemU7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKLQl7Ci0Jc3RydWN0IHJhbXpzd2FwX3N0YXRzICpycyA9ICZyenMtPnN0YXRzOwotCXNpemVfdCBzdWNjX3dyaXRlcywgbWVtX3VzZWQ7Ci0JdW5zaWduZWQgaW50IGdvb2RfY29tcHJlc3NfcGVyYyA9IDAsIG5vX2NvbXByZXNzX3BlcmMgPSAwOwotCi0JbWVtX3VzZWQgPSB4dl9nZXRfdG90YWxfc2l6ZV9ieXRlcyhyenMtPm1lbV9wb29sKQotCQkJKyAocnMtPnBhZ2VzX2V4cGFuZCA8PCBQQUdFX1NISUZUKTsKLQlzdWNjX3dyaXRlcyA9IHJ6c19zdGF0NjRfcmVhZChyenMsICZycy0+bnVtX3dyaXRlcykgLQotCQkJcnpzX3N0YXQ2NF9yZWFkKHJ6cywgJnJzLT5mYWlsZWRfd3JpdGVzKTsKLQotCWlmIChzdWNjX3dyaXRlcyAmJiBycy0+cGFnZXNfc3RvcmVkKSB7Ci0JCWdvb2RfY29tcHJlc3NfcGVyYyA9IHJzLT5nb29kX2NvbXByZXNzICogMTAwCi0JCQkJCS8gcnMtPnBhZ2VzX3N0b3JlZDsKLQkJbm9fY29tcHJlc3NfcGVyYyA9IHJzLT5wYWdlc19leHBhbmQgKiAxMDAKLQkJCQkJLyBycy0+cGFnZXNfc3RvcmVkOwotCX0KLQotCXMtPm51bV9yZWFkcyA9IHJ6c19zdGF0NjRfcmVhZChyenMsICZycy0+bnVtX3JlYWRzKTsKLQlzLT5udW1fd3JpdGVzID0gcnpzX3N0YXQ2NF9yZWFkKHJ6cywgJnJzLT5udW1fd3JpdGVzKTsKLQlzLT5mYWlsZWRfcmVhZHMgPSByenNfc3RhdDY0X3JlYWQocnpzLCAmcnMtPmZhaWxlZF9yZWFkcyk7Ci0Jcy0+ZmFpbGVkX3dyaXRlcyA9IHJ6c19zdGF0NjRfcmVhZChyenMsICZycy0+ZmFpbGVkX3dyaXRlcyk7Ci0Jcy0+aW52YWxpZF9pbyA9IHJ6c19zdGF0NjRfcmVhZChyenMsICZycy0+aW52YWxpZF9pbyk7Ci0Jcy0+bm90aWZ5X2ZyZWUgPSByenNfc3RhdDY0X3JlYWQocnpzLCAmcnMtPm5vdGlmeV9mcmVlKTsKLQlzLT5wYWdlc196ZXJvID0gcnMtPnBhZ2VzX3plcm87Ci0KLQlzLT5nb29kX2NvbXByZXNzX3BjdCA9IGdvb2RfY29tcHJlc3NfcGVyYzsKLQlzLT5wYWdlc19leHBhbmRfcGN0ID0gbm9fY29tcHJlc3NfcGVyYzsKLQotCXMtPnBhZ2VzX3N0b3JlZCA9IHJzLT5wYWdlc19zdG9yZWQ7Ci0Jcy0+cGFnZXNfdXNlZCA9IG1lbV91c2VkID4+IFBBR0VfU0hJRlQ7Ci0Jcy0+b3JpZ19kYXRhX3NpemUgPSBycy0+cGFnZXNfc3RvcmVkIDw8IFBBR0VfU0hJRlQ7Ci0Jcy0+Y29tcHJfZGF0YV9zaXplID0gcnMtPmNvbXByX3NpemU7Ci0Jcy0+bWVtX3VzZWRfdG90YWwgPSBtZW1fdXNlZDsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1JBTVpTV0FQX1NUQVRTICovCi19Ci0KLXN0YXRpYyB2b2lkIHJhbXpzd2FwX2ZyZWVfcGFnZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc2l6ZV90IGluZGV4KQotewotCXUzMiBjbGVuOwotCXZvaWQgKm9iajsKLQotCXN0cnVjdCBwYWdlICpwYWdlID0gcnpzLT50YWJsZVtpbmRleF0ucGFnZTsKLQl1MzIgb2Zmc2V0ID0gcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0OwotCi0JaWYgKHVubGlrZWx5KCFwYWdlKSkgewotCQkvKgotCQkgKiBObyBtZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB6ZXJvIGZpbGxlZCBwYWdlcy4KLQkJICogU2ltcGx5IGNsZWFyIHplcm8gcGFnZSBmbGFnLgotCQkgKi8KLQkJaWYgKHJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1pFUk8pKSB7Ci0JCQlyenNfY2xlYXJfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTyk7Ci0JCQlyenNfc3RhdF9kZWMoJnJ6cy0+c3RhdHMucGFnZXNfemVybyk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmICh1bmxpa2VseShyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSkgewotCQljbGVuID0gUEFHRV9TSVpFOwotCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQkJcnpzX2NsZWFyX2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCk7Ci0JCXJ6c19zdGF0X2RlYygmcnpzLT5zdGF0cy5wYWdlc19leHBhbmQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlvYmogPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgKyBvZmZzZXQ7Ci0JY2xlbiA9IHh2X2dldF9vYmplY3Rfc2l6ZShvYmopIC0gc2l6ZW9mKHN0cnVjdCB6b2JqX2hlYWRlcik7Ci0Ja3VubWFwX2F0b21pYyhvYmosIEtNX1VTRVIwKTsKLQotCXh2X2ZyZWUocnpzLT5tZW1fcG9vbCwgcGFnZSwgb2Zmc2V0KTsKLQlpZiAoY2xlbiA8PSBQQUdFX1NJWkUgLyAyKQotCQlyenNfc3RhdF9kZWMoJnJ6cy0+c3RhdHMuZ29vZF9jb21wcmVzcyk7Ci0KLW91dDoKLQlyenMtPnN0YXRzLmNvbXByX3NpemUgLT0gY2xlbjsKLQlyenNfc3RhdF9kZWMoJnJ6cy0+c3RhdHMucGFnZXNfc3RvcmVkKTsKLQotCXJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UgPSBOVUxMOwotCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX3plcm9fcGFnZShzdHJ1Y3QgYmlvICpiaW8pCi17Ci0Jdm9pZCAqdXNlcl9tZW07Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlOwotCi0JdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JbWVtc2V0KHVzZXJfbWVtLCAwLCBQQUdFX1NJWkUpOwotCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKLQotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCi0Jc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfdW5jb21wcmVzc2VkX3BhZ2Uoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQl1MzIgaW5kZXg7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgY2hhciAqdXNlcl9tZW0sICpjbWVtOwotCi0JcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7Ci0JaW5kZXggPSBiaW8tPmJpX3NlY3RvciA+PiBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOwotCi0JdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JY21lbSA9IGttYXBfYXRvbWljKHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UsIEtNX1VTRVIxKSArCi0JCQlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQ7Ci0KLQltZW1jcHkodXNlcl9tZW0sIGNtZW0sIFBBR0VfU0laRSk7Ci0Ja3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOwotCWt1bm1hcF9hdG9taWMoY21lbSwgS01fVVNFUjEpOwotCi0JZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7Ci0KLQlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwotCWJpb19lbmRpbyhiaW8sIDApOwotCXJldHVybiAwOwotfQotCi0vKgotICogQ2FsbGVkIHdoZW4gcmVxdWVzdCBwYWdlIGlzIG5vdCBwcmVzZW50IGluIHJhbXpzd2FwLgotICogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYmVmb3JlIGFueSBwcmV2aW91cyB3cml0ZQotICogdG8gdGhpcyBsb2NhdGlvbiAtIHRoaXMgaGFwcGVucyBkdWUgdG8gcmVhZGFoZWFkIHdoZW4KLSAqIHN3YXAgZGV2aWNlIGlzIHJlYWQgZnJvbSB1c2VyLXNwYWNlIChlLmcuIGR1cmluZyBzd2Fwb24pCi0gKi8KLXN0YXRpYyBpbnQgaGFuZGxlX3JhbXpzd2FwX2ZhdWx0KHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCi17Ci0JcHJfZGVidWcoIlJlYWQgYmVmb3JlIHdyaXRlIG9uIHN3YXAgZGV2aWNlOiAiCi0JCSJzZWN0b3I9JWx1LCBzaXplPSV1LCBvZmZzZXQ9JXVcbiIsCi0JCSh1bG9uZykoYmlvLT5iaV9zZWN0b3IpLCBiaW8tPmJpX3NpemUsCi0JCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCk7Ci0KLQkvKiBEbyBub3RoaW5nLiBKdXN0IHJldHVybiBzdWNjZXNzICovCi0Jc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYW16c3dhcF9yZWFkKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCi17Ci0JaW50IHJldDsKLQl1MzIgaW5kZXg7Ci0Jc2l6ZV90IGNsZW47Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IHpvYmpfaGVhZGVyICp6aGVhZGVyOwotCXVuc2lnbmVkIGNoYXIgKnVzZXJfbWVtLCAqY21lbTsKLQotCXJ6c19zdGF0NjRfaW5jKHJ6cywgJnJ6cy0+c3RhdHMubnVtX3JlYWRzKTsKLQotCXBhZ2UgPSBiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlOwotCWluZGV4ID0gYmlvLT5iaV9zZWN0b3IgPj4gU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKLQotCWlmIChyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKSkKLQkJcmV0dXJuIGhhbmRsZV96ZXJvX3BhZ2UoYmlvKTsKLQotCS8qIFJlcXVlc3RlZCBwYWdlIGlzIG5vdCBwcmVzZW50IGluIGNvbXByZXNzZWQgYXJlYSAqLwotCWlmICghcnpzLT50YWJsZVtpbmRleF0ucGFnZSkKLQkJcmV0dXJuIGhhbmRsZV9yYW16c3dhcF9mYXVsdChyenMsIGJpbyk7Ci0KLQkvKiBQYWdlIGlzIHN0b3JlZCB1bmNvbXByZXNzZWQgc2luY2UgaXQncyBpbmNvbXByZXNzaWJsZSAqLwotCWlmICh1bmxpa2VseShyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSkKLQkJcmV0dXJuIGhhbmRsZV91bmNvbXByZXNzZWRfcGFnZShyenMsIGJpbyk7Ci0KLQl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQljbGVuID0gUEFHRV9TSVpFOwotCi0JY21lbSA9IGttYXBfYXRvbWljKHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UsIEtNX1VTRVIxKSArCi0JCQlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQ7Ci0KLQlyZXQgPSBsem8xeF9kZWNvbXByZXNzX3NhZmUoCi0JCWNtZW0gKyBzaXplb2YoKnpoZWFkZXIpLAotCQl4dl9nZXRfb2JqZWN0X3NpemUoY21lbSkgLSBzaXplb2YoKnpoZWFkZXIpLAotCQl1c2VyX21lbSwgJmNsZW4pOwotCi0Ja3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOwotCWt1bm1hcF9hdG9taWMoY21lbSwgS01fVVNFUjEpOwotCi0JLyogc2hvdWxkIE5FVkVSIGhhcHBlbiAqLwotCWlmICh1bmxpa2VseShyZXQgIT0gTFpPX0VfT0spKSB7Ci0JCXByX2VycigiRGVjb21wcmVzc2lvbiBmYWlsZWQhIGVycj0lZCwgcGFnZT0ldVxuIiwKLQkJCXJldCwgaW5kZXgpOwotCQlyenNfc3RhdDY0X2luYyhyenMsICZyenMtPnN0YXRzLmZhaWxlZF9yZWFkcyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCi0Jc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKLQotb3V0OgotCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhbXpzd2FwX3dyaXRlKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCi17Ci0JaW50IHJldDsKLQl1MzIgb2Zmc2V0LCBpbmRleDsKLQlzaXplX3QgY2xlbjsKLQlzdHJ1Y3Qgem9ial9oZWFkZXIgKnpoZWFkZXI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UsICpwYWdlX3N0b3JlOwotCXVuc2lnbmVkIGNoYXIgKnVzZXJfbWVtLCAqY21lbSwgKnNyYzsKLQotCXJ6c19zdGF0NjRfaW5jKHJ6cywgJnJ6cy0+c3RhdHMubnVtX3dyaXRlcyk7Ci0KLQlwYWdlID0gYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZTsKLQlpbmRleCA9IGJpby0+Ymlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7Ci0KLQlzcmMgPSByenMtPmNvbXByZXNzX2J1ZmZlcjsKLQotCW11dGV4X2xvY2soJnJ6cy0+bG9jayk7Ci0KLQl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQlpZiAocGFnZV96ZXJvX2ZpbGxlZCh1c2VyX21lbSkpIHsKLQkJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOwotCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7Ci0JCXJ6c19zdGF0X2luYygmcnpzLT5zdGF0cy5wYWdlc196ZXJvKTsKLQkJcnpzX3NldF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKTsKLQotCQlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwotCQliaW9fZW5kaW8oYmlvLCAwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0ID0gbHpvMXhfMV9jb21wcmVzcyh1c2VyX21lbSwgUEFHRV9TSVpFLCBzcmMsICZjbGVuLAotCQkJCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSk7Ci0KLQlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7Ci0KLQlpZiAodW5saWtlbHkocmV0ICE9IExaT19FX09LKSkgewotCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7Ci0JCXByX2VycigiQ29tcHJlc3Npb24gZmFpbGVkISBlcnI9JWRcbiIsIHJldCk7Ci0JCXJ6c19zdGF0NjRfaW5jKHJ6cywgJnJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogUGFnZSBpcyBpbmNvbXByZXNzaWJsZS4gU3RvcmUgaXQgYXMtaXMgKHVuY29tcHJlc3NlZCkKLQkgKiBzaW5jZSB3ZSBkbyBub3Qgd2FudCB0byByZXR1cm4gdG9vIG1hbnkgc3dhcCB3cml0ZQotCSAqIGVycm9ycyB3aGljaCBoYXMgc2lkZSBlZmZlY3Qgb2YgaGFuZ2luZyB0aGUgc3lzdGVtLgotCSAqLwotCWlmICh1bmxpa2VseShjbGVuID4gbWF4X3pwYWdlX3NpemUpKSB7Ci0JCWNsZW4gPSBQQUdFX1NJWkU7Ci0JCXBhZ2Vfc3RvcmUgPSBhbGxvY19wYWdlKEdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSk7Ci0JCWlmICh1bmxpa2VseSghcGFnZV9zdG9yZSkpIHsKLQkJCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKLQkJCXByX2luZm8oIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBpbmNvbXByZXNzaWJsZSAiCi0JCQkJInBhZ2U6ICV1XG4iLCBpbmRleCk7Ci0JCQlyenNfc3RhdDY0X2luYyhyenMsICZyenMtPnN0YXRzLmZhaWxlZF93cml0ZXMpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlvZmZzZXQgPSAwOwotCQlyenNfc2V0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCk7Ci0JCXJ6c19zdGF0X2luYygmcnpzLT5zdGF0cy5wYWdlc19leHBhbmQpOwotCQlyenMtPnRhYmxlW2luZGV4XS5wYWdlID0gcGFnZV9zdG9yZTsKLQkJc3JjID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCQlnb3RvIG1lbXN0b3JlOwotCX0KLQotCWlmICh4dl9tYWxsb2MocnpzLT5tZW1fcG9vbCwgY2xlbiArIHNpemVvZigqemhlYWRlciksCi0JCQkmcnpzLT50YWJsZVtpbmRleF0ucGFnZSwgJm9mZnNldCwKLQkJCUdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOwotCQlwcl9pbmZvKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgY29tcHJlc3NlZCAiCi0JCQkicGFnZTogJXUsIHNpemU9JXp1XG4iLCBpbmRleCwgY2xlbik7Ci0JCXJ6c19zdGF0NjRfaW5jKHJ6cywgJnJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotbWVtc3RvcmU6Ci0JcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0ID0gb2Zmc2V0OwotCi0JY21lbSA9IGttYXBfYXRvbWljKHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UsIEtNX1VTRVIxKSArCi0JCQlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQ7Ci0KLSNpZiAwCi0JLyogQmFjay1yZWZlcmVuY2UgbmVlZGVkIGZvciBtZW1vcnkgZGVmcmFnbWVudGF0aW9uICovCi0JaWYgKCFyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSB7Ci0JCXpoZWFkZXIgPSAoc3RydWN0IHpvYmpfaGVhZGVyICopY21lbTsKLQkJemhlYWRlci0+dGFibGVfaWR4ID0gaW5kZXg7Ci0JCWNtZW0gKz0gc2l6ZW9mKCp6aGVhZGVyKTsKLQl9Ci0jZW5kaWYKLQotCW1lbWNweShjbWVtLCBzcmMsIGNsZW4pOwotCi0Ja3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7Ci0JaWYgKHVubGlrZWx5KHJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCkpKQotCQlrdW5tYXBfYXRvbWljKHNyYywgS01fVVNFUjApOwotCi0JLyogVXBkYXRlIHN0YXRzICovCi0JcnpzLT5zdGF0cy5jb21wcl9zaXplICs9IGNsZW47Ci0JcnpzX3N0YXRfaW5jKCZyenMtPnN0YXRzLnBhZ2VzX3N0b3JlZCk7Ci0JaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKLQkJcnpzX3N0YXRfaW5jKCZyenMtPnN0YXRzLmdvb2RfY29tcHJlc3MpOwotCi0JbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOwotCi0Jc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKLQotb3V0OgotCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybiAwOwotfQotCi0vKgotICogQ2hlY2sgaWYgcmVxdWVzdCBpcyB3aXRoaW4gYm91bmRzIGFuZCBwYWdlIGFsaWduZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N3YXBfcmVxdWVzdChzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc3RydWN0IGJpbyAqYmlvKQotewotCWlmICh1bmxpa2VseSgKLQkJKGJpby0+Ymlfc2VjdG9yID49IChyenMtPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCkpIHx8Ci0JCShiaW8tPmJpX3NlY3RvciAmIChTRUNUT1JTX1BFUl9QQUdFIC0gMSkpIHx8Ci0JCShiaW8tPmJpX3ZjbnQgIT0gMSkgfHwKLQkJKGJpby0+Ymlfc2l6ZSAhPSBQQUdFX1NJWkUpIHx8Ci0JCShiaW8tPmJpX2lvX3ZlY1swXS5idl9vZmZzZXQgIT0gMCkpKSB7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogc3dhcCByZXF1ZXN0IGlzIHZhbGlkICovCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBhbGwgcmFtenN3YXAgSS9PIHJlcXVlc3RzLgotICovCi1zdGF0aWMgaW50IHJhbXpzd2FwX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgcmFtenN3YXAgKnJ6cyA9IHF1ZXVlLT5xdWV1ZWRhdGE7Ci0KLQlpZiAodW5saWtlbHkoIXJ6cy0+aW5pdF9kb25lKSkgewotCQliaW9faW9fZXJyb3IoYmlvKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCF2YWxpZF9zd2FwX3JlcXVlc3QocnpzLCBiaW8pKSB7Ci0JCXJ6c19zdGF0NjRfaW5jKHJ6cywgJnJ6cy0+c3RhdHMuaW52YWxpZF9pbyk7Ci0JCWJpb19pb19lcnJvcihiaW8pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGJpb19kYXRhX2RpcihiaW8pKSB7Ci0JY2FzZSBSRUFEOgotCQlyZXQgPSByYW16c3dhcF9yZWFkKHJ6cywgYmlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdSSVRFOgotCQlyZXQgPSByYW16c3dhcF93cml0ZShyenMsIGJpbyk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2V0X2RldmljZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cykKLXsKLQlzaXplX3QgaW5kZXg7Ci0KLQkvKiBEbyBub3QgYWNjZXB0IGFueSBuZXcgSS9PIHJlcXVlc3QgKi8KLQlyenMtPmluaXRfZG9uZSA9IDA7Ci0KLQkvKiBGcmVlIHZhcmlvdXMgcGVyLWRldmljZSBidWZmZXJzICovCi0Ja2ZyZWUocnpzLT5jb21wcmVzc193b3JrbWVtKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXJ6cy0+Y29tcHJlc3NfYnVmZmVyLCAxKTsKLQotCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSA9IE5VTEw7Ci0JcnpzLT5jb21wcmVzc19idWZmZXIgPSBOVUxMOwotCi0JLyogRnJlZSBhbGwgcGFnZXMgdGhhdCBhcmUgc3RpbGwgaW4gdGhpcyByYW16c3dhcCBkZXZpY2UgKi8KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCByenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7IGluZGV4KyspIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXUxNiBvZmZzZXQ7Ci0KLQkJcGFnZSA9IHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2U7Ci0JCW9mZnNldCA9IHJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKLQotCQlpZiAoIXBhZ2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAodW5saWtlbHkocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkpCi0JCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQkJZWxzZQotCQkJeHZfZnJlZShyenMtPm1lbV9wb29sLCBwYWdlLCBvZmZzZXQpOwotCX0KLQotCXZmcmVlKHJ6cy0+dGFibGUpOwotCXJ6cy0+dGFibGUgPSBOVUxMOwotCi0JeHZfZGVzdHJveV9wb29sKHJ6cy0+bWVtX3Bvb2wpOwotCXJ6cy0+bWVtX3Bvb2wgPSBOVUxMOwotCi0JLyogUmVzZXQgc3RhdHMgKi8KLQltZW1zZXQoJnJ6cy0+c3RhdHMsIDAsIHNpemVvZihyenMtPnN0YXRzKSk7Ci0KLQlyenMtPmRpc2tzaXplID0gMDsKLX0KLQotc3RhdGljIGludCByYW16c3dhcF9pb2N0bF9pbml0X2RldmljZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cykKLXsKLQlpbnQgcmV0OwotCXNpemVfdCBudW1fcGFnZXM7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5pb24gc3dhcF9oZWFkZXIgKnN3YXBfaGVhZGVyOwotCi0JaWYgKHJ6cy0+aW5pdF9kb25lKSB7Ci0JCXByX2luZm8oIkRldmljZSBhbHJlYWR5IGluaXRpYWxpemVkIVxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmFtenN3YXBfc2V0X2Rpc2tzaXplKHJ6cywgdG90YWxyYW1fcGFnZXMgPDwgUEFHRV9TSElGVCk7Ci0KLQlyenMtPmNvbXByZXNzX3dvcmttZW0gPSBremFsbG9jKExaTzFYX01FTV9DT01QUkVTUywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyenMtPmNvbXByZXNzX3dvcmttZW0pIHsKLQkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3Igd29ya2luZyBtZW1vcnkhXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJ6cy0+Y29tcHJlc3NfYnVmZmVyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKF9fR0ZQX1pFUk8sIDEpOwotCWlmICghcnpzLT5jb21wcmVzc19idWZmZXIpIHsKLQkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3IgYnVmZmVyIHNwYWNlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsOwotCX0KLQotCW51bV9wYWdlcyA9IHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsKLQlyenMtPnRhYmxlID0gdm1hbGxvYyhudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpKTsKLQlpZiAoIXJ6cy0+dGFibGUpIHsKLQkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHJhbXpzd2FwIGFkZHJlc3MgdGFibGVcbiIpOwotCQkvKiBUbyBwcmV2ZW50IGFjY2Vzc2luZyB0YWJsZSBlbnRyaWVzIGR1cmluZyBjbGVhbnVwICovCi0JCXJ6cy0+ZGlza3NpemUgPSAwOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7Ci0JfQotCW1lbXNldChyenMtPnRhYmxlLCAwLCBudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpKTsKLQotCXBhZ2UgPSBhbGxvY19wYWdlKF9fR0ZQX1pFUk8pOwotCWlmICghcGFnZSkgewotCQlwcl9lcnIoIkVycm9yIGFsbG9jYXRpbmcgc3dhcCBoZWFkZXIgcGFnZVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcnpzLT50YWJsZVswXS5wYWdlID0gcGFnZTsKLQlyenNfc2V0X2ZsYWcocnpzLCAwLCBSWlNfVU5DT01QUkVTU0VEKTsKLQotCXN3YXBfaGVhZGVyID0ga21hcChwYWdlKTsKLQlzZXR1cF9zd2FwX2hlYWRlcihyenMsIHN3YXBfaGVhZGVyKTsKLQlrdW5tYXAocGFnZSk7Ci0KLQlzZXRfY2FwYWNpdHkocnpzLT5kaXNrLCByenMtPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCk7Ci0KLQkvKiByYW16c3dhcCBkZXZpY2VzIHNvcnQgb2YgcmVzZW1ibGVzIG5vbi1yb3RhdGlvbmFsIGRpc2tzICovCi0JcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHJ6cy0+ZGlzay0+cXVldWUpOwotCi0JcnpzLT5tZW1fcG9vbCA9IHh2X2NyZWF0ZV9wb29sKCk7Ci0JaWYgKCFyenMtPm1lbV9wb29sKSB7Ci0JCXByX2VycigiRXJyb3IgY3JlYXRpbmcgbWVtb3J5IHBvb2xcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcnpzLT5pbml0X2RvbmUgPSAxOwotCi0JcHJfZGVidWcoIkluaXRpYWxpemF0aW9uIGRvbmUhXG4iKTsKLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlyZXNldF9kZXZpY2UocnpzKTsKLQotCXByX2VycigiSW5pdGlhbGl6YXRpb24gZmFpbGVkOiBlcnI9JWRcbiIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByYW16c3dhcF9pb2N0bF9yZXNldF9kZXZpY2Uoc3RydWN0IHJhbXpzd2FwICpyenMpCi17Ci0JaWYgKHJ6cy0+aW5pdF9kb25lKQotCQlyZXNldF9kZXZpY2UocnpzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhbXpzd2FwX2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQgPSAwOwotCXNpemVfdCBkaXNrc2l6ZV9rYjsKLQotCXN0cnVjdCByYW16c3dhcCAqcnpzID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFJaU0lPX1NFVF9ESVNLU0laRV9LQjoKLQkJaWYgKHJ6cy0+aW5pdF9kb25lKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRpc2tzaXplX2tiLCAodm9pZCAqKWFyZywKLQkJCQkJCV9JT0NfU0laRShjbWQpKSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXJ6cy0+ZGlza3NpemUgPSBkaXNrc2l6ZV9rYiA8PCAxMDsKLQkJcHJfaW5mbygiRGlzayBzaXplIHNldCB0byAlenUga0JcbiIsIGRpc2tzaXplX2tiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJaU0lPX0dFVF9TVEFUUzoKLQl7Ci0JCXN0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cyAqc3RhdHM7Ci0JCWlmICghcnpzLT5pbml0X2RvbmUpIHsKLQkJCXJldCA9IC1FTk9UVFk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlzdGF0cyA9IGt6YWxsb2Moc2l6ZW9mKCpzdGF0cyksIEdGUF9LRVJORUwpOwotCQlpZiAoIXN0YXRzKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJcmFtenN3YXBfaW9jdGxfZ2V0X3N0YXRzKHJ6cywgc3RhdHMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpKSB7Ci0JCQlrZnJlZShzdGF0cyk7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJa2ZyZWUoc3RhdHMpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBSWlNJT19JTklUOgotCQlyZXQgPSByYW16c3dhcF9pb2N0bF9pbml0X2RldmljZShyenMpOwotCQlicmVhazsKLQotCWNhc2UgUlpTSU9fUkVTRVQ6Ci0JCS8qIERvIG5vdCByZXNldCBhbiBhY3RpdmUgZGV2aWNlISAqLwotCQlpZiAoYmRldi0+YmRfaG9sZGVycykgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKiBNYWtlIHN1cmUgYWxsIHBlbmRpbmcgSS9PIGlzIGZpbmlzaGVkICovCi0JCWlmIChiZGV2KQotCQkJZnN5bmNfYmRldihiZGV2KTsKLQotCQlyZXQgPSByYW16c3dhcF9pb2N0bF9yZXNldF9kZXZpY2UocnpzKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9pbmZvKCJJbnZhbGlkIGlvY3RsICV1XG4iLCBjbWQpOwotCQlyZXQgPSAtRU5PVFRZOwotCX0KLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcmFtenN3YXBfc2xvdF9mcmVlX25vdGlmeShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBsb25nIGluZGV4KQotewotCXN0cnVjdCByYW16c3dhcCAqcnpzOwotCi0JcnpzID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCXJhbXpzd2FwX2ZyZWVfcGFnZShyenMsIGluZGV4KTsKLQlyenNfc3RhdDY0X2luYyhyenMsICZyenMtPnN0YXRzLm5vdGlmeV9mcmVlKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyByYW16c3dhcF9kZXZvcHMgPSB7Ci0JLmlvY3RsID0gcmFtenN3YXBfaW9jdGwsCi0JLnN3YXBfc2xvdF9mcmVlX25vdGlmeSA9IHJhbXpzd2FwX3Nsb3RfZnJlZV9ub3RpZnksCi0JLm93bmVyID0gVEhJU19NT0RVTEUKLX07Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2RldmljZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgaW50IGRldmljZV9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2luaXQoJnJ6cy0+bG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnJ6cy0+c3RhdDY0X2xvY2spOwotCi0JcnpzLT5xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKLQlpZiAoIXJ6cy0+cXVldWUpIHsKLQkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGRpc2sgcXVldWUgZm9yIGRldmljZSAlZFxuIiwKLQkJCWRldmljZV9pZCk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QocnpzLT5xdWV1ZSwgcmFtenN3YXBfbWFrZV9yZXF1ZXN0KTsKLQlyenMtPnF1ZXVlLT5xdWV1ZWRhdGEgPSByenM7Ci0KLQkgLyogZ2VuZGlzayBzdHJ1Y3R1cmUgKi8KLQlyenMtPmRpc2sgPSBhbGxvY19kaXNrKDEpOwotCWlmICghcnpzLT5kaXNrKSB7Ci0JCWJsa19jbGVhbnVwX3F1ZXVlKHJ6cy0+cXVldWUpOwotCQlwcl93YXJuaW5nKCJFcnJvciBhbGxvY2F0aW5nIGRpc2sgc3RydWN0dXJlIGZvciBkZXZpY2UgJWRcbiIsCi0JCQlkZXZpY2VfaWQpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyenMtPmRpc2stPm1ham9yID0gcmFtenN3YXBfbWFqb3I7Ci0JcnpzLT5kaXNrLT5maXJzdF9taW5vciA9IGRldmljZV9pZDsKLQlyenMtPmRpc2stPmZvcHMgPSAmcmFtenN3YXBfZGV2b3BzOwotCXJ6cy0+ZGlzay0+cXVldWUgPSByenMtPnF1ZXVlOwotCXJ6cy0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gcnpzOwotCXNucHJpbnRmKHJ6cy0+ZGlzay0+ZGlza19uYW1lLCAxNiwgInJhbXpzd2FwJWQiLCBkZXZpY2VfaWQpOwotCi0JLyogQWN0dWFsIGNhcGFjaXR5IHNldCB1c2luZyBSWlNJT19TRVRfRElTS1NJWkVfS0IgaW9jdGwgKi8KLQlzZXRfY2FwYWNpdHkocnpzLT5kaXNrLCAwKTsKLQotCWJsa19xdWV1ZV9waHlzaWNhbF9ibG9ja19zaXplKHJ6cy0+ZGlzay0+cXVldWUsIFBBR0VfU0laRSk7Ci0JYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShyenMtPmRpc2stPnF1ZXVlLCBQQUdFX1NJWkUpOwotCi0JYWRkX2Rpc2socnpzLT5kaXNrKTsKLQotCXJ6cy0+aW5pdF9kb25lID0gMDsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQotewotCWlmIChyenMtPmRpc2spIHsKLQkJZGVsX2dlbmRpc2socnpzLT5kaXNrKTsKLQkJcHV0X2Rpc2socnpzLT5kaXNrKTsKLQl9Ci0KLQlpZiAocnpzLT5xdWV1ZSkKLQkJYmxrX2NsZWFudXBfcXVldWUocnpzLT5xdWV1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJhbXpzd2FwX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0LCBkZXZfaWQ7Ci0KLQlpZiAobnVtX2RldmljZXMgPiBtYXhfbnVtX2RldmljZXMpIHsKLQkJcHJfd2FybmluZygiSW52YWxpZCB2YWx1ZSBmb3IgbnVtX2RldmljZXM6ICV1XG4iLAotCQkJCW51bV9kZXZpY2VzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmFtenN3YXBfbWFqb3IgPSByZWdpc3Rlcl9ibGtkZXYoMCwgInJhbXpzd2FwIik7Ci0JaWYgKHJhbXpzd2FwX21ham9yIDw9IDApIHsKLQkJcHJfd2FybmluZygiVW5hYmxlIHRvIGdldCBtYWpvciBudW1iZXJcbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghbnVtX2RldmljZXMpIHsKLQkJcHJfaW5mbygibnVtX2RldmljZXMgbm90IHNwZWNpZmllZC4gVXNpbmcgZGVmYXVsdDogMVxuIik7Ci0JCW51bV9kZXZpY2VzID0gMTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGV2aWNlIGFycmF5IGFuZCBpbml0aWFsaXplIGVhY2ggb25lICovCi0JcHJfaW5mbygiQ3JlYXRpbmcgJXUgZGV2aWNlcyAuLi5cbiIsIG51bV9kZXZpY2VzKTsKLQlkZXZpY2VzID0ga3phbGxvYyhudW1fZGV2aWNlcyAqIHNpemVvZihzdHJ1Y3QgcmFtenN3YXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldmljZXMpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byB1bnJlZ2lzdGVyOwotCX0KLQotCWZvciAoZGV2X2lkID0gMDsgZGV2X2lkIDwgbnVtX2RldmljZXM7IGRldl9pZCsrKSB7Ci0JCXJldCA9IGNyZWF0ZV9kZXZpY2UoJmRldmljZXNbZGV2X2lkXSwgZGV2X2lkKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZnJlZV9kZXZpY2VzOwotCX0KLQotCXJldHVybiAwOwotCi1mcmVlX2RldmljZXM6Ci0Jd2hpbGUgKGRldl9pZCkKLQkJZGVzdHJveV9kZXZpY2UoJmRldmljZXNbLS1kZXZfaWRdKTsKLXVucmVnaXN0ZXI6Ci0JdW5yZWdpc3Rlcl9ibGtkZXYocmFtenN3YXBfbWFqb3IsICJyYW16c3dhcCIpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCByYW16c3dhcF9leGl0KHZvaWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHJhbXpzd2FwICpyenM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgewotCQlyenMgPSAmZGV2aWNlc1tpXTsKLQotCQlkZXN0cm95X2RldmljZShyenMpOwotCQlpZiAocnpzLT5pbml0X2RvbmUpCi0JCQlyZXNldF9kZXZpY2UocnpzKTsKLQl9Ci0KLQl1bnJlZ2lzdGVyX2Jsa2RldihyYW16c3dhcF9tYWpvciwgInJhbXpzd2FwIik7Ci0KLQlrZnJlZShkZXZpY2VzKTsKLQlwcl9kZWJ1ZygiQ2xlYW51cCBkb25lIVxuIik7Ci19Ci0KLW1vZHVsZV9wYXJhbShudW1fZGV2aWNlcywgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG51bV9kZXZpY2VzLCAiTnVtYmVyIG9mIHJhbXpzd2FwIGRldmljZXMiKTsKLQotbW9kdWxlX2luaXQocmFtenN3YXBfaW5pdCk7Ci1tb2R1bGVfZXhpdChyYW16c3dhcF9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwotTU9EVUxFX0FVVEhPUigiTml0aW4gR3VwdGEgPG5ndXB0YUB2ZmxhcmUub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21wcmVzc2VkIFJBTSBCYXNlZCBTd2FwIERldmljZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5oIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MzMDQyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAgIE5pdGluIEd1cHRhCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCi0gKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCi0gKgotICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCi0gKi8KLQotI2lmbmRlZiBfUkFNWlNXQVBfRFJWX0hfCi0jZGVmaW5lIF9SQU1aU1dBUF9EUlZfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgInJhbXpzd2FwX2lvY3RsLmgiCi0jaW5jbHVkZSAieHZtYWxsb2MuaCIKLQotLyoKLSAqIFNvbWUgYXJiaXRyYXJ5IHZhbHVlLiBUaGlzIGlzIGp1c3QgdG8gY2F0Y2gKLSAqIGludmFsaWQgdmFsdWUgZm9yIG51bV9kZXZpY2VzIG1vZHVsZSBwYXJhbWV0ZXIuCi0gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfbnVtX2RldmljZXMgPSAzMjsKLQotLyoKLSAqIFN0b3JlZCBhdCBiZWdpbm5pbmcgb2YgZWFjaCBjb21wcmVzc2VkIG9iamVjdC4KLSAqCi0gKiBJdCBzdG9yZXMgYmFjay1yZWZlcmVuY2UgdG8gdGFibGUgZW50cnkgd2hpY2ggcG9pbnRzIHRvIHRoaXMKLSAqIG9iamVjdC4gVGhpcyBpcyByZXF1aXJlZCB0byBzdXBwb3J0IG1lbW9yeSBkZWZyYWdtZW50YXRpb24uCi0gKi8KLXN0cnVjdCB6b2JqX2hlYWRlciB7Ci0jaWYgMAotCXUzMiB0YWJsZV9pZHg7Ci0jZW5kaWYKLX07Ci0KLS8qLS0gQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMgKi8KLQotLyogRGVmYXVsdCByYW16c3dhcCBkaXNrIHNpemU6IDI1JSBvZiB0b3RhbCBSQU0gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBkZWZhdWx0X2Rpc2tzaXplX3BlcmNfcmFtID0gMjU7Ci0KLS8qCi0gKiBQYWdlcyB0aGF0IGNvbXByZXNzIHRvIHNpemUgZ3JlYXRlciB0aGFuIHRoaXMgYXJlIHN0b3JlZAotICogdW5jb21wcmVzc2VkIGluIG1lbW9yeS4KLSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heF96cGFnZV9zaXplID0gUEFHRV9TSVpFIC8gNCAqIDM7Ci0KLS8qCi0gKiBOT1RFOiBtYXhfenBhZ2Vfc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0bzoKLSAqICAgWFZfTUFYX0FMTE9DX1NJWkUgLSBzaXplb2Yoc3RydWN0IHpvYmpfaGVhZGVyKQotICogb3RoZXJ3aXNlLCB4dl9tYWxsb2MoKSB3b3VsZCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCi0gKi8KLQotLyotLSBFbmQgb2YgY29uZmlndXJhYmxlIHBhcmFtcyAqLwotCi0jZGVmaW5lIFNFQ1RPUl9TSElGVAkJOQotI2RlZmluZSBTRUNUT1JfU0laRQkJKDEgPDwgU0VDVE9SX1NISUZUKQotI2RlZmluZSBTRUNUT1JTX1BFUl9QQUdFX1NISUZUCShQQUdFX1NISUZUIC0gU0VDVE9SX1NISUZUKQotI2RlZmluZSBTRUNUT1JTX1BFUl9QQUdFCSgxIDw8IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQpCi0KLS8qIEZsYWdzIGZvciByYW16c3dhcCBwYWdlcyAodGFibGVbcGFnZV9ub10uZmxhZ3MpICovCi1lbnVtIHJ6c19wYWdlZmxhZ3MgewotCS8qIFBhZ2UgaXMgc3RvcmVkIHVuY29tcHJlc3NlZCAqLwotCVJaU19VTkNPTVBSRVNTRUQsCi0KLQkvKiBQYWdlIGNvbnNpc3RzIGVudGlyZWx5IG9mIHplcm9zICovCi0JUlpTX1pFUk8sCi0KLQlfX05SX1JaU19QQUdFRkxBR1MsCi19OwotCi0vKi0tIERhdGEgc3RydWN0dXJlcyAqLwotCi0vKgotICogQWxsb2NhdGVkIGZvciBlYWNoIHN3YXAgc2xvdCwgaW5kZXhlZCBieSBwYWdlIG5vLgotICogVGhlc2UgdGFibGUgZW50cmllcyBtdXN0IGZpdCBleGFjdGx5IGluIGEgcGFnZS4KLSAqLwotc3RydWN0IHRhYmxlIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1MTYgb2Zmc2V0OwotCXU4IGNvdW50OwkvKiBvYmplY3QgcmVmIGNvdW50IChub3QgeWV0IHVzZWQpICovCi0JdTggZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHJhbXpzd2FwX3N0YXRzIHsKLQkvKiBiYXNpYyBzdGF0cyAqLwotCXNpemVfdCBjb21wcl9zaXplOwkvKiBjb21wcmVzc2VkIHNpemUgb2YgcGFnZXMgc3RvcmVkIC0KLQkJCQkgKiBuZWVkZWQgdG8gZW5mb3JjZSBtZW1saW1pdCAqLwotCS8qIG1vcmUgc3RhdHMgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKLQl1NjQgbnVtX3JlYWRzOwkJLyogZmFpbGVkICsgc3VjY2Vzc2Z1bCAqLwotCXU2NCBudW1fd3JpdGVzOwkJLyogLS1kby0tICovCi0JdTY0IGZhaWxlZF9yZWFkczsJLyogc2hvdWxkIE5FVkVSISBoYXBwZW4gKi8KLQl1NjQgZmFpbGVkX3dyaXRlczsJLyogY2FuIGhhcHBlbiB3aGVuIG1lbW9yeSBpcyB0b28gbG93ICovCi0JdTY0IGludmFsaWRfaW87CQkvKiBub24tc3dhcCBJL08gcmVxdWVzdHMgKi8KLQl1NjQgbm90aWZ5X2ZyZWU7CS8qIG5vLiBvZiBzd2FwIHNsb3QgZnJlZSBub3RpZmljYXRpb25zICovCi0JdTMyIHBhZ2VzX3plcm87CQkvKiBuby4gb2YgemVybyBmaWxsZWQgcGFnZXMgKi8KLQl1MzIgcGFnZXNfc3RvcmVkOwkvKiBuby4gb2YgcGFnZXMgY3VycmVudGx5IHN0b3JlZCAqLwotCXUzMiBnb29kX2NvbXByZXNzOwkvKiAlIG9mIHBhZ2VzIHdpdGggY29tcHJlc3Npb24gcmF0aW88PTUwJSAqLwotCXUzMiBwYWdlc19leHBhbmQ7CS8qICUgb2YgaW5jb21wcmVzc2libGUgcGFnZXMgKi8KLSNlbmRpZgotfTsKLQotc3RydWN0IHJhbXpzd2FwIHsKLQlzdHJ1Y3QgeHZfcG9vbCAqbWVtX3Bvb2w7Ci0Jdm9pZCAqY29tcHJlc3Nfd29ya21lbTsKLQl2b2lkICpjb21wcmVzc19idWZmZXI7Ci0Jc3RydWN0IHRhYmxlICp0YWJsZTsKLQlzcGlubG9ja190IHN0YXQ2NF9sb2NrOwkvKiBwcm90ZWN0IDY0LWJpdCBzdGF0cyAqLwotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKLQlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKLQlpbnQgaW5pdF9kb25lOwotCS8qCi0JICogVGhpcyBpcyBsaW1pdCBvbiBhbW91bnQgb2YgKnVuY29tcHJlc3NlZCogd29ydGggb2YgZGF0YQotCSAqIHdlIGNhbiBob2xkLiBXaGVuIGJhY2tpbmcgc3dhcCBkZXZpY2UgaXMgcHJvdmlkZWQsIGl0IGlzCi0JICogc2V0IGVxdWFsIHRvIGRldmljZSBzaXplLgotCSAqLwotCXNpemVfdCBkaXNrc2l6ZTsJLyogYnl0ZXMgKi8KLQotCXN0cnVjdCByYW16c3dhcF9zdGF0cyBzdGF0czsKLX07Ci0KLS8qLS0gKi8KLQotLyogRGVidWdnaW5nIGFuZCBTdGF0cyAqLwotI2lmIGRlZmluZWQoQ09ORklHX1JBTVpTV0FQX1NUQVRTKQotc3RhdGljIHZvaWQgcnpzX3N0YXRfaW5jKHUzMiAqdikKLXsKLQkqdiA9ICp2ICsgMTsKLX0KLQotc3RhdGljIHZvaWQgcnpzX3N0YXRfZGVjKHUzMiAqdikKLXsKLQkqdiA9ICp2IC0gMTsKLX0KLQotc3RhdGljIHZvaWQgcnpzX3N0YXQ2NF9pbmMoc3RydWN0IHJhbXpzd2FwICpyenMsIHU2NCAqdikKLXsKLQlzcGluX2xvY2soJnJ6cy0+c3RhdDY0X2xvY2spOwotCSp2ID0gKnYgKyAxOwotCXNwaW5fdW5sb2NrKCZyenMtPnN0YXQ2NF9sb2NrKTsKLX0KLQotc3RhdGljIHU2NCByenNfc3RhdDY0X3JlYWQoc3RydWN0IHJhbXpzd2FwICpyenMsIHU2NCAqdikKLXsKLQl1NjQgdmFsOwotCi0Jc3Bpbl9sb2NrKCZyenMtPnN0YXQ2NF9sb2NrKTsKLQl2YWwgPSAqdjsKLQlzcGluX3VubG9jaygmcnpzLT5zdGF0NjRfbG9jayk7Ci0KLQlyZXR1cm4gdmFsOwotfQotI2Vsc2UKLSNkZWZpbmUgcnpzX3N0YXRfaW5jKHYpCi0jZGVmaW5lIHJ6c19zdGF0X2RlYyh2KQotI2RlZmluZSByenNfc3RhdDY0X2luYyhyLCB2KQotI2RlZmluZSByenNfc3RhdDY0X3JlYWQociwgdikKLSNlbmRpZiAvKiBDT05GSUdfUkFNWlNXQVBfU1RBVFMgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9pb2N0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk0YmNiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9pb2N0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvbXByZXNzZWQgUkFNIGJhc2VkIHN3YXAgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwICBOaXRpbiBHdXB0YQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAotICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAotICoKLSAqIFByb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbQotICovCi0KLSNpZm5kZWYgX1JBTVpTV0FQX0lPQ1RMX0hfCi0jZGVmaW5lIF9SQU1aU1dBUF9JT0NUTF9IXwotCi1zdHJ1Y3QgcmFtenN3YXBfaW9jdGxfc3RhdHMgewotCXU2NCBkaXNrc2l6ZTsJCS8qIHVzZXIgc3BlY2lmaWVkIG9yIGVxdWFsIHRvIGJhY2tpbmcgc3dhcAotCQkJCSAqIHNpemUgKGlmIHByZXNlbnQpICovCi0JdTY0IG51bV9yZWFkczsJCS8qIGZhaWxlZCArIHN1Y2Nlc3NmdWwgKi8KLQl1NjQgbnVtX3dyaXRlczsJCS8qIC0tZG8tLSAqLwotCXU2NCBmYWlsZWRfcmVhZHM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCi0JdTY0IGZhaWxlZF93cml0ZXM7CS8qIGNhbiBoYXBwZW4gd2hlbiBtZW1vcnkgaXMgdG9vIGxvdyAqLwotCXU2NCBpbnZhbGlkX2lvOwkJLyogbm9uLXN3YXAgSS9PIHJlcXVlc3RzICovCi0JdTY0IG5vdGlmeV9mcmVlOwkvKiBuby4gb2Ygc3dhcCBzbG90IGZyZWUgbm90aWZpY2F0aW9ucyAqLwotCXUzMiBwYWdlc196ZXJvOwkJLyogbm8uIG9mIHplcm8gZmlsbGVkIHBhZ2VzICovCi0JdTMyIGdvb2RfY29tcHJlc3NfcGN0OwkvKiBuby4gb2YgcGFnZXMgd2l0aCBjb21wcmVzc2lvbiByYXRpbzw9NTAlICovCi0JdTMyIHBhZ2VzX2V4cGFuZF9wY3Q7CS8qIG5vLiBvZiBpbmNvbXByZXNzaWJsZSBwYWdlcyAqLwotCXUzMiBwYWdlc19zdG9yZWQ7Ci0JdTMyIHBhZ2VzX3VzZWQ7Ci0JdTY0IG9yaWdfZGF0YV9zaXplOwotCXU2NCBjb21wcl9kYXRhX3NpemU7Ci0JdTY0IG1lbV91c2VkX3RvdGFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLSNkZWZpbmUgUlpTSU9fU0VUX0RJU0tTSVpFX0tCCV9JT1coJ3onLCAwLCBzaXplX3QpCi0jZGVmaW5lIFJaU0lPX0dFVF9TVEFUUwkJX0lPUigneicsIDEsIHN0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cykKLSNkZWZpbmUgUlpTSU9fSU5JVAkJX0lPKCd6JywgMikKLSNkZWZpbmUgUlpTSU9fUkVTRVQJCV9JTygneicsIDMpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Jhcl9yZWdpc3Rlci9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3Jhcl9yZWdpc3Rlci9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWMyNzczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9yYXJfcmVnaXN0ZXIvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMKLSMgUkFSIGRldmljZSBjb25maWd1cmF0aW9uCi0jCi0KLW1lbnUgIlJBUiBSZWdpc3RlciBEcml2ZXIiCi0jCi0jCVJlc3RyaWN0ZWQgQWNjZXNzIFJlZ2lzdGVyIE1hbmFnZXIKLSMKLWNvbmZpZyBSQVJfUkVHSVNURVIKLQl0cmlzdGF0ZSAiUmVzdHJpY3RlZCBBY2Nlc3MgUmVnaW9uIFJlZ2lzdGVyIERyaXZlciIKLQlkZXBlbmRzIG9uIFBDSQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIGFsbG93cyBvdGhlciBrZXJuZWwgZHJpdmVycyBhY2Nlc3MgdG8gdGhlCi0JICBjb250ZW50cyBvZiB0aGUgcmVzdHJpY3RlZCBhY2Nlc3MgcmVnaW9uIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi0JICBUaGUgcmVzdHJpY3RlZCBhY2Nlc3MgcmVnaW9uIGNvbnRyb2wgcmVnaXN0ZXJzCi0JICAocmFyX3JlZ2lzdGVycykgYXJlIHVzZWQgdG8gcGFzcyBhZGRyZXNzIGFuZAotCSAgbG9ja2luZyBpbmZvcm1hdGlvbiBvbiByZXN0cmljdGVkIGFjY2VzcyByZWdpb25zCi0JICB0byBvdGhlciBkcml2ZXJzIHRoYXQgdXNlIHJlc3RyaWN0ZWQgYWNjZXNzIHJlZ2lvbnMuCi0KLQkgIFRoZSByZXN0cmljdGVkIGFjY2VzcyByZWdpb25zIGFyZSByZWdpb25zIG9mIG1lbW9yeQotCSAgb24gdGhlIEludGVsIE1JRCBQbGF0Zm9ybSB0aGF0IGFyZSBub3QgYWNjZXNzaWJsZSB0bwotCSAgdGhlIHg4NiBwcm9jZXNzb3IsIGJ1dCBhcmUgYWNjZXNzaWJsZSB0byBkZWRpY2F0ZWQKLQkgIHByb2Nlc3NvcnMgb24gYm9hcmQgcGVyaXBoZXJhbCBkZXZpY2VzLgotCi0JICBUaGUgcHVycG9zZSBvZiB0aGUgcmVzdHJpY3RlZCBhY2Nlc3MgcmVnaW9ucyBpcyB0bwotCSAgcHJvdGVjdCBzZW5zaXRpdmUgZGF0YSBmcm9tIGNvbXByb21pc2UgYnkgdW5hdXRob3JpemVkCi0JICBwcm9ncmFtcyBydW5uaW5nIG9uIHRoZSB4ODYgcHJvY2Vzc29yLgotZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Jhcl9yZWdpc3Rlci9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9yYXJfcmVnaXN0ZXIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTU0Y2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Jhcl9yZWdpc3Rlci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotRVhUUkFfQ0ZMQUdTICs9IC1ETElUVExFX19FTkRJQU4KLW9iai0kKENPTkZJR19SQVJfUkVHSVNURVIpICs9IHJhcl9yZWdpc3Rlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFyX3JlZ2lzdGVyL3Jhcl9yZWdpc3Rlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Jhcl9yZWdpc3Rlci9yYXJfcmVnaXN0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4NTAzZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcmFyX3JlZ2lzdGVyL3Jhcl9yZWdpc3Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qCi0gKiAgcmFyX3JlZ2lzdGVyLmMgLSBBbiBJbnRlbCBSZXN0cmljdGVkIEFjY2VzcyBSZWdpb24gcmVnaXN0ZXIgZHJpdmVyCi0gKgotICogIENvcHlyaWdodChjKSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKLSAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gKiAgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAyMDA5MTIwNCBNYXJrIEFsbHluIDxtYXJrLmEuYWxseW5AaW50ZWwuY29tPgotICoJICAgICBPc3NhbWEgT3RobWFuIDxvc3NhbWEub3RobWFuQGludGVsLmNvbT4KLSAqCUNsZWFudXAgcGVyIGZlZWRiYWNrIGZyb20gQWxhbiBDb3ggYW5kIEFyamFuIFZhbiBEZSBWZW4KLSAqCi0gKiAgMjAwOTA4MDYgT3NzYW1hIE90aG1hbiA8b3NzYW1hLm90aG1hbkBpbnRlbC5jb20+Ci0gKiAgICAgIFJldHVybiB6ZXJvIGhpZ2ggYWRkcmVzcyBpZiB1cHBlciAyMiBiaXRzIGlzIHplcm8uCi0gKiAgICAgIENsZWFuZWQgdXAgY2hlY2twYXRjaCBlcnJvcnMuCi0gKiAgICAgIENsYXJpZmllZCB0aGF0IGRyaXZlciBpcyBkZWFsaW5nIHdpdGggYnVzIGFkZHJlc3Nlcy4KLSAqCi0gKiAgMjAwOTA3MDIgT3NzYW1hIE90aG1hbiA8b3NzYW1hLm90aG1hbkBpbnRlbC5jb20+Ci0gKiAgICAgIFJlbW92ZWQgdW5uZWNlc3NhcnkgaW5jbHVkZSBkaXJlY3RpdmVzCi0gKiAgICAgIENsZWFuZWQgdXAgc3BpbmxvY2tzLgotICogICAgICBDbGVhbmVkIHVwIGxvZ2dpbmcuCi0gKiAgICAgIEltcHJvdmVkIGludmFsaWQgcGFyYW1ldGVyIGNoZWNrcy4KLSAqICAgICAgRml4ZWQgYW5kIHNpbXBsaWZpZWQgUkFSIGFkZHJlc3MgcmV0cmlldmFsIGFuZCBSQVIgbG9ja2luZwotICogICAgICBjb2RlLgotICoKLSAqICAyMDA5MDYyNiBNYXJrIEFsbHluIDxtYXJrLmEuYWxseW5AaW50ZWwuY29tPgotICogICAgICBJbml0aWFsIHB1Ymxpc2gKLSAqLwotCi0jZGVmaW5lIERFQlVHIDEKLQotI2luY2x1ZGUgInJhcl9yZWdpc3Rlci5oIgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotLyogPT09IExpbmNyb2Z0IE1lc3NhZ2UgQnVzIEludGVyZmFjZSA9PT0gKi8KLSNkZWZpbmUgTE5DX01DUl9PRkZTRVQJCTB4RDAJLyogTWVzc2FnZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIExOQ19NRFJfT0ZGU0VUCQkweEQ0CS8qIE1lc3NhZ2UgRGF0YSBSZWdpc3RlciAqLwotCi0vKiBNZXNzYWdlIE9wY29kZXMgKi8KLSNkZWZpbmUgTE5DX01FU1NBR0VfUkVBRF9PUENPREUJMHhEMAotI2RlZmluZSBMTkNfTUVTU0FHRV9XUklURV9PUENPREUgMHhFMAotCi0vKiBNZXNzYWdlIFdyaXRlIEJ5dGUgRW5hYmxlcyAqLwotI2RlZmluZSBMTkNfTUVTU0FHRV9CWVRFX1dSSVRFX0VOQUJMRVMJMHhGCi0KLS8qIEItdW5pdCBQb3J0ICovCi0jZGVmaW5lIExOQ19CVU5JVF9QT1JUCTB4MwotCi0vKiA9PT0gTGluY3JvZnQgQi1Vbml0IFJlZ2lzdGVycyAtIFByb2dyYW1tZWQgYnkgSUEzMiBmaXJtd2FyZSA9PT0gKi8KLSNkZWZpbmUgTE5DX0JSQVIwTAkweDEwCi0jZGVmaW5lIExOQ19CUkFSMEgJMHgxMQotI2RlZmluZSBMTkNfQlJBUjFMCTB4MTIKLSNkZWZpbmUgTE5DX0JSQVIxSAkweDEzCi0vKiBSZXNlcnZlZCBmb3IgU2VQICovCi0jZGVmaW5lIExOQ19CUkFSMkwJMHgxNAotI2RlZmluZSBMTkNfQlJBUjJICTB4MTUKLQotLyogTW9vcmVzdG93biBzdXBwb3J0cyB0aHJlZSByZXN0cmljdGVkIGFjY2VzcyByZWdpb25zLiAqLwotI2RlZmluZSBNUlNUX05VTV9SQVIgMwotCi0vKiBSQVIgQnVzIEFkZHJlc3MgUmFuZ2UgKi8KLXN0cnVjdCByYXJfYWRkciB7Ci0JZG1hX2FkZHJfdCBsb3c7Ci0JZG1hX2FkZHJfdCBoaWdoOwotfTsKLQotLyoKLSAqCVdlIGNyZWF0ZSBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggUkFSCi0gKi8KLXN0cnVjdCBjbGllbnQgewotCWludCAoKmNhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpOwotCXVuc2lnbmVkIGxvbmcgZHJpdmVyX3ByaXY7Ci0JYm9vbCBidXN5OwotfTsKLQotc3RhdGljIERFRklORV9NVVRFWChyYXJfbXV0ZXgpOwotc3RhdGljIERFRklORV9NVVRFWChsbmNfcmVnX211dGV4KTsKLQotLyoKLSAqCU9uZSBwZXIgUkFSIGRldmljZSAoY3VycmVudGx5IG9ubHkgb25lIGRldmljZSkKLSAqLwotc3RydWN0IHJhcl9kZXZpY2UgewotCXN0cnVjdCByYXJfYWRkciByYXJfYWRkcltNUlNUX05VTV9SQVJdOwotCXN0cnVjdCBwY2lfZGV2ICpyYXJfZGV2OwotCWJvb2wgcmVnaXN0ZXJlZDsKLQlib29sIGFsbG9jYXRlZDsKLQlzdHJ1Y3QgY2xpZW50IGNsaWVudFtNUlNUX05VTV9SQVJdOwotfTsKLQotLyogQ3VycmVudCBwbGF0Zm9ybXMgaGF2ZSBvbmx5IG9uZSByYXJfZGV2aWNlIGZvciAzIHJhciByZWdpb25zICovCi1zdGF0aWMgc3RydWN0IHJhcl9kZXZpY2UgbXlfcmFyX2RldmljZTsKLQotLyoKLSAqCUFic3RyYWN0IG91dCBtdWx0aXBsZSBkZXZpY2Ugc3VwcG9ydC4gQ3VycmVudCBwbGF0Zm9ybXMgb25seQotICoJaGF2ZSBhIHNpbmdsZSBSQVIgZGV2aWNlLgotICovCi0KLS8qKgotICoJYWxsb2NfcmFyX2RldmljZQktCXJldHVybiBhIG5ldyBSQVIgc3RydWN0dXJlCi0gKgotICoJUmV0dXJuIGEgbmV3IChidXQgbm90IHlldCByZWFkeSkgUkFSIGRldmljZSBvYmplY3QKLSAqLwotc3RhdGljIHN0cnVjdCByYXJfZGV2aWNlICphbGxvY19yYXJfZGV2aWNlKHZvaWQpCi17Ci0JaWYgKG15X3Jhcl9kZXZpY2UuYWxsb2NhdGVkKQotCQlyZXR1cm4gTlVMTDsKLQlteV9yYXJfZGV2aWNlLmFsbG9jYXRlZCA9IDE7Ci0JcmV0dXJuICZteV9yYXJfZGV2aWNlOwotfQotCi0vKioKLSAqCWZyZWVfcmFyX2RldmljZQkJLQlmcmVlIGEgUkFSIG9iamVjdAotICoJQHJhcjogdGhlIFJBUiBkZXZpY2UgYmVpbmcgZnJlZWQKLSAqCi0gKglSZWxlYXNlIGEgUkFSIG9iamVjdCBhbmQgYW55IGF0dGFjaGVkIHJlc291cmNlcwotICovCi1zdGF0aWMgdm9pZCBmcmVlX3Jhcl9kZXZpY2Uoc3RydWN0IHJhcl9kZXZpY2UgKnJhcikKLXsKLQlwY2lfZGV2X3B1dChyYXItPnJhcl9kZXYpOwotCXJhci0+YWxsb2NhdGVkID0gMDsKLX0KLQotLyoqCi0gKglfcmFyX3RvX2RldmljZQkJLQlyZXR1cm4gdGhlIGRldmljZSBoYW5kbGluZyB0aGlzIFJBUgotICoJQHJhcjogUkFSIG51bWJlcgotICoJQG9mZjogcmV0dXJuZWQgb2Zmc2V0Ci0gKgotICoJSW50ZXJuYWwgaGVscGVyIGZvciBsb29raW5nIHVwIFJBUiBkZXZpY2VzLiBUaGlzIGFuZCBhbGxvYyBhcmUgdGhlCi0gKgl0d28gZnVuY3Rpb25zIHRoYXQgbmVlZCB0b3VjaGluZyB0byBnbyB0byBtdWx0aXBsZSBSQVIgZGV2aWNlcy4KLSAqLwotc3RhdGljIHN0cnVjdCByYXJfZGV2aWNlICpfcmFyX3RvX2RldmljZShpbnQgcmFyLCBpbnQgKm9mZikKLXsKLQlpZiAocmFyID49IDAgJiYgcmFyIDw9IDMpIHsKLQkJKm9mZiA9IHJhcjsKLQkJcmV0dXJuICZteV9yYXJfZGV2aWNlOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0vKioKLSAqCXJhcl90b19kZXZpY2UJCS0JcmV0dXJuIHRoZSBkZXZpY2UgaGFuZGxpbmcgdGhpcyBSQVIKLSAqCUByYXI6IFJBUiBudW1iZXIKLSAqCUBvZmY6IHJldHVybmVkIG9mZnNldAotICoKLSAqCVJldHVybiB0aGUgZGV2aWNlIHRoaXMgUkFSIG1hcHMgdG8gaWYgb25lIGlzIHByZXNlbnQsIG90aGVyd2lzZQotICoJcmV0dXJucyBOVUxMLiBSZXBvcnRzIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb2YgdGhpcwotICoJUkFSIGRldmljZSBpbiBvZmYuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmFyX2RldmljZSAqcmFyX3RvX2RldmljZShpbnQgcmFyLCBpbnQgKm9mZikKLXsKLQlzdHJ1Y3QgcmFyX2RldmljZSAqcmFyX2RldiA9IF9yYXJfdG9fZGV2aWNlKHJhciwgb2ZmKTsKLQlpZiAocmFyX2RldiA9PSBOVUxMIHx8ICFyYXJfZGV2LT5yZWdpc3RlcmVkKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gcmFyX2RldjsKLX0KLQotLyoqCi0gKglyYXJfdG9fY2xpZW50CQktCXJldHVybiB0aGUgY2xpZW50IGhhbmRsaW5nIHRoaXMgUkFSCi0gKglAcmFyOiBSQVIgbnVtYmVyCi0gKgotICoJUmV0dXJuIHRoZSBjbGllbnQgdGhpcyBSQVIgbWFwcyB0byBpZiBhIG1hcHBpbmcgaXMga25vd24sIG90aGVyd2lzZQotICoJcmV0dXJucyBOVUxMLgotICovCi1zdGF0aWMgc3RydWN0IGNsaWVudCAqcmFyX3RvX2NsaWVudChpbnQgcmFyKQotewotCWludCBpZHg7Ci0Jc3RydWN0IHJhcl9kZXZpY2UgKnIgPSBfcmFyX3RvX2RldmljZShyYXIsICZpZHgpOwotCWlmIChyICE9IE5VTEwpCi0JCXJldHVybiAmci0+Y2xpZW50W2lkeF07Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICoJcmFyX3JlYWRfYWRkcgkJLQlyZXRyaWV2ZSBhIFJBUiBtYXBwaW5nCi0gKglAcGRldjogUENJIGRldmljZSBmb3IgdGhlIFJBUgotICoJQG9mZnNldDogb2Zmc2V0IGZvciBtZXNzYWdlCi0gKglAYWRkcjogcmV0dXJuZWQgYWRkcmVzcwotICoKLSAqCVJlYWRzIHRoZSBhZGRyZXNzIG9mIGEgZ2l2ZW4gUkFSIHJlZ2lzdGVyLiBSZXR1cm5zIDAgb24gc3VjY2VzcwotICoJb3IgYW4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IHJhcl9yZWFkX2FkZHIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBvZmZzZXQsIGRtYV9hZGRyX3QgKmFkZHIpCi17Ci0JLyoKLQkgKiA9PT09PT09PSBUaGUgTGluY3JvZnQgTWVzc2FnZSBCdXMgSW50ZXJmYWNlID09PT09PT09Ci0JICogTGluY3JvZnQgcmVnaXN0ZXJzIG1heSBiZSBvYnRhaW5lZCB2aWEgUENJIGZyb20KLQkgKiB0aGUgaG9zdCBicmlkZ2UgdXNpbmcgdGhlIExpbmNyb2Z0IE1lc3NhZ2UgQnVzCi0JICogSW50ZXJmYWNlLiAgVGhhdCBtZXNzYWdlIGJ1cyBpbnRlcmZhY2UgaXMgZ2VuZXJhbGx5Ci0JICogY29tcHJpc2VkIG9mIHR3byByZWdpc3RlcnM6IGEgY29udHJvbCByZWdpc3RlciAoTUNSLCAweERPKQotCSAqIGFuZCBhIGRhdGEgcmVnaXN0ZXIgKE1EUiwgMHhENCkuCi0JICoKLQkgKiBUaGUgTUNSIChtZXNzYWdlIGNvbnRyb2wgcmVnaXN0ZXIpIGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgotCSAqICAgMS4gIFszMToyNF06IE9wY29kZQotCSAqICAgMi4gIFsyMzoxNl06IFBvcnQKLQkgKiAgIDMuICBbMTU6OF06IFJlZ2lzdGVyIE9mZnNldAotCSAqICAgNC4gIFs3OjRdOiBCeXRlIEVuYWJsZXMgKHVzZSAweEYgdG8gc2V0IGFsbCBvZiB0aGVzZSBiaXRzCi0JICogICAgICAgICAgICAgIHRvIDEpCi0JICogICA1LiAgWzM6MF06IHJlc2VydmVkCi0JICoKLQkgKiAgUmVhZCAoMHhEMCkgYW5kIHdyaXRlICgweEUwKSBvcGNvZGVzIGFyZSB3cml0dGVuIHRvIHRoZQotCSAqICBjb250cm9sIHJlZ2lzdGVyIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyB0byBMaW5jcm9mdAotCSAqICByZWdpc3RlcnMsIHJlc3BlY3RpdmVseS4KLQkgKgotCSAqICBXZSdyZSBpbnRlcmVzdGVkIGluIHJlZ2lzdGVycyBmb3VuZCBpbiB0aGUgTGluY3JvZnQKLQkgKiAgQi11bml0LiAgVGhlIEItdW5pdCBwb3J0IGlzIDB4My4KLQkgKgotCSAqICBUaGUgc2l4IEItdW5pdCBSQVIgcmVnaXN0ZXIgb2Zmc2V0cyB3ZSB1c2UgYXJlIGxpc3RlZAotCSAqICBlYXJsaWVyIGluIHRoaXMgZmlsZS4KLQkgKgotCSAqICBMYXN0bHkgd3JpdGluZyB0byB0aGUgTUNSIHJlZ2lzdGVyIHJlcXVpcmVzIHRoZSAiQnl0ZQotCSAqICBlbmFibGVzIiBiaXRzIHRvIGJlIHNldCB0byAxLiAgVGhpcyBtYXkgYmUgYWNoaWV2ZWQgYnkKLQkgKiAgd3JpdGluZyAweEYgYXQgYml0IDQuCi0JICoKLQkgKiBUaGUgTURSIChtZXNzYWdlIGRhdGEgcmVnaXN0ZXIpIGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgotCSAqICAgMS4gWzMxOjBdOiBSZWFkL1dyaXRlIERhdGEKLQkgKgotCSAqICBEYXRhIGJlaW5nIHJlYWQgZnJvbSB0aGlzIHJlZ2lzdGVyIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyCi0JICogIHdyaXRpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbnRyb2wgbWVzc2FnZSB0byB0aGUgTUNSCi0JICogIHJlZ2lzdGVyLgotCSAqCi0JICogIERhdGEgYmVpbmcgd3JpdHRlbiB0byB0aGlzIHJlZ2lzdGVyIG11c3QgYmUgd3JpdHRlbiBiZWZvcmUKLQkgKiAgd3JpdGluZyB0aGUgYXBwcm9wcmlhdGUgY29udHJvbCBtZXNzYWdlIHRvIHRoZSBNQ1IKLQkgKiAgcmVnaXN0ZXIuCi0JKi8KLQotCWludCByZXN1bHQ7Ci0JdTMyIGFkZHIzMjsKLQotCS8qIENvbnN0cnVjdCBjb250cm9sIG1lc3NhZ2UgKi8KLQl1MzIgY29uc3QgbWVzc2FnZSA9Ci0JCSAoTE5DX01FU1NBR0VfUkVBRF9PUENPREUgPDwgMjQpCi0JCSB8IChMTkNfQlVOSVRfUE9SVCA8PCAxNikKLQkJIHwgKG9mZnNldCA8PCA4KQotCQkgfCAoTE5DX01FU1NBR0VfQllURV9XUklURV9FTkFCTEVTIDw8IDQpOwotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiT2Zmc2V0IGZvciAnZ2V0JyBMTkMgTVNHIGlzICV4XG4iLCBvZmZzZXQpOwotCi0JLyoKLQkqIFdlIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgTGluY3JvZnQgTUNSIGFuZCBNRFIgcmVnaXN0ZXJzCi0JKiB1bnRpbCBCT1RIIHRoZSBjb21tYW5kIGlzIGlzc3VlZCB0aHJvdWdoIHRoZSBNQ1IgcmVnaXN0ZXIKLQkqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgTURSIHJlZ2lzdGVyLgotCSogT3RoZXJ3aXNlIGEgcmFjZSBjb25kaXRpb24gd291bGQgZXhpc3QgYmV0d2VlbiBhY2Nlc3NlcyB0bwotCSogYm90aCByZWdpc3RlcnMuCi0JKi8KLQotCW11dGV4X2xvY2soJmxuY19yZWdfbXV0ZXgpOwotCi0JLyogU2VuZCB0aGUgY29udHJvbCBtZXNzYWdlICovCi0JcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMTkNfTUNSX09GRlNFVCwgbWVzc2FnZSk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJLyogUmVhZCBiYWNrIHRoZSBhZGRyZXNzIGFzIGEgMzJiaXQgdmFsdWUgKi8KLQkJcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExOQ19NRFJfT0ZGU0VULCAmYWRkcjMyKTsKLQkJKmFkZHIgPSAoZG1hX2FkZHJfdClhZGRyMzI7Ci0JfQotCW11dGV4X3VubG9jaygmbG5jX3JlZ19tdXRleCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKglyYXJfc2V0X2FkZHIJCS0JU2V0IGEgUkFSIG1hcHBpbmcKLSAqCUBwZGV2OiBQQ0kgZGV2aWNlIGZvciB0aGUgUkFSCi0gKglAb2Zmc2V0OiBvZmZzZXQgZm9yIG1lc3NhZ2UKLSAqCUBhZGRyOiBhZGRyZXNzIHRvIHNldAotICoKLSAqCVNldHMgdGhlIGFkZHJlc3Mgb2YgYSBnaXZlbiBSQVIgcmVnaXN0ZXIuIFJldHVybnMgMCBvbiBzdWNjZXNzCi0gKglvciBhbiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQgcmFyX3NldF9hZGRyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCWludCBvZmZzZXQsCi0JZG1hX2FkZHJfdCBhZGRyKQotewotCS8qCi0JKiBEYXRhIGJlaW5nIHdyaXR0ZW4gdG8gdGhpcyByZWdpc3RlciBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlCi0JKiB3cml0aW5nIHRoZSBhcHByb3ByaWF0ZSBjb250cm9sIG1lc3NhZ2UgdG8gdGhlIE1DUgotCSogcmVnaXN0ZXIuCi0JKiBTZWUgcmFyX2dldF9hZGRycygpIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZQotCSogbWVzc2FnZSBidXMgaW50ZXJmYWNlIGJlaW5nIHVzZWQgaGVyZS4KLQkqLwotCi0JaW50IHJlc3VsdDsKLQotCS8qIENvbnN0cnVjdCBjb250cm9sIG1lc3NhZ2UgKi8KLQl1MzIgY29uc3QgbWVzc2FnZSA9IChMTkNfTUVTU0FHRV9XUklURV9PUENPREUgPDwgMjQpCi0JCXwgKExOQ19CVU5JVF9QT1JUIDw8IDE2KQotCQl8IChvZmZzZXQgPDwgOCkKLQkJfCAoTE5DX01FU1NBR0VfQllURV9XUklURV9FTkFCTEVTIDw8IDQpOwotCi0JLyoKLQkqIFdlIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgTGluY3JvZnQgTUNSIGFuZCBNRFIgcmVnaXN0ZXJzCi0JKiB1bnRpbCBCT1RIIHRoZSBjb21tYW5kIGlzIGlzc3VlZCB0aHJvdWdoIHRoZSBNQ1IgcmVnaXN0ZXIKLQkqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgTURSIHJlZ2lzdGVyLgotCSogT3RoZXJ3aXNlIGEgcmFjZSBjb25kaXRpb24gd291bGQgZXhpc3QgYmV0d2VlbiBhY2Nlc3NlcyB0bwotCSogYm90aCByZWdpc3RlcnMuCi0JKi8KLQotCW11dGV4X2xvY2soJmxuY19yZWdfbXV0ZXgpOwotCi0JLyogU2VuZCB0aGUgY29udHJvbCBtZXNzYWdlICovCi0JcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMTkNfTURSX09GRlNFVCwgYWRkcik7Ci0JaWYgKCFyZXN1bHQpCi0JCS8qIEFuZCBhZGRyZXNzICovCi0JCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTE5DX01DUl9PRkZTRVQsIG1lc3NhZ2UpOwotCi0JbXV0ZXhfdW5sb2NrKCZsbmNfcmVnX211dGV4KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICoJcmFyX2luaXRfcGFyYW1zCQktCUluaXRpYWxpemUgUkFSIHBhcmFtZXRlcnMKLSAqCUByYXI6IFJBUiBkZXZpY2UgdG8gaW5pdGlhbGlzZQotICoKLSAqCUluaXRpYWxpemUgUkFSIHBhcmFtZXRlcnMsIHN1Y2ggYXMgYnVzIGFkZHJlc3NlcywgZXRjLiBSZXR1cm5zIDAKLSAqCW9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBpbml0X3Jhcl9wYXJhbXMoc3RydWN0IHJhcl9kZXZpY2UgKnJhcikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHJhci0+cmFyX2RldjsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgb2Zmc2V0ID0gMHgxMDsJLyogUkFSIDAgdG8gMiBpbiBvcmRlciBsb3cvaGlnaC9sb3cvaGlnaC8uLi4gKi8KLQotCS8qIFJldHJpZXZlIFJBUiBzdGFydCBhbmQgZW5kIGJ1cyBhZGRyZXNzZXMuCi0JKiBBY2Nlc3MgdGhlIFJBUiByZWdpc3RlcnMgdGhyb3VnaCB0aGUgTGluY3JvZnQgTWVzc2FnZSBCdXMKLQkqIEludGVyZmFjZSBvbiBQQ0kgZGV2aWNlOiAwMDowMC4wIEhvc3QgYnJpZGdlLgotCSovCi0KLQlmb3IgKGkgPSAwOyBpIDwgTVJTVF9OVU1fUkFSOyArK2kpIHsKLQkJc3RydWN0IHJhcl9hZGRyICphZGRyID0gJnJhci0+cmFyX2FkZHJbaV07Ci0KLQkJcmVzdWx0ID0gcmFyX3JlYWRfYWRkcihwZGV2LCBvZmZzZXQrKywgJmFkZHItPmxvdyk7Ci0JCWlmIChyZXN1bHQgIT0gMCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJcmVzdWx0ID0gcmFyX3JlYWRfYWRkcihwZGV2LCBvZmZzZXQrKywgJmFkZHItPmhpZ2gpOwotCQlpZiAocmVzdWx0ICE9IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0KLQkJLyoKLQkJKiBPbmx5IHRoZSB1cHBlciAyMiBiaXRzIG9mIHRoZSBSQVIgYWRkcmVzc2VzIGFyZQotCQkqIHN0b3JlZCBpbiB0aGVpciBjb3JyZXNwb25kaW5nIFJBUiByZWdpc3RlcnMgc28gd2UKLQkJKiBtdXN0IHNldCB0aGUgbG93ZXIgMTAgYml0cyBhY2NvcmRpbmdseS4KLQotCQkqIFRoZSBsb3cgYWRkcmVzcyBoYXMgaXRzIGxvd2VyIDEwIGJpdHMgY2xlYXJlZCwgYW5kCi0JCSogdGhlIGhpZ2ggYWRkcmVzcyBoYXMgYWxsIGl0cyBsb3dlciAxMCBiaXRzIHNldCwKLQkJKiBlLmcuOgotCQkqIGxvdyA9IDB4MmZmZmZjMDAKLQkJKi8KLQotCQlhZGRyLT5sb3cgJj0gKGRtYV9hZGRyX3QpMHhmZmZmZmMwMHU7Ci0KLQkJLyoKLQkJKiBTZXQgYml0cyA5OjAgb24gdXBwc2VyIGFkZHJlc3MgaWYgYml0cyAzMToxMCBhcmUgbm9uCi0JCSogemVybzsgb3RoZXJ3aXplIGNsZWFyIGFsbCBiaXRzCi0JCSovCi0KLQkJaWYgKChhZGRyLT5oaWdoICYgMHhmZmZmZmMwMHUpID09IDApCi0JCQlhZGRyLT5oaWdoID0gMDsKLQkJZWxzZQotCQkJYWRkci0+aGlnaCB8PSAweDNmZnU7Ci0JfQotCS8qIERvbmUgYWNjZXNzaW5nIHRoZSBkZXZpY2UuICovCi0KLQlpZiAocmVzdWx0ID09IDApIHsKLQkJZm9yIChpID0gMDsgaSAhPSBNUlNUX05VTV9SQVI7ICsraSkgewotCQkJLyoKLQkJCSogIkJSQVIiIHJlZmVycyB0byB0aGUgUkFSIHJlZ2lzdGVycyBpbiB0aGUKLQkJCSogTGluY3JvZnQgQi11bml0LgotCQkJKi8KLQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJCUkFSWyV1XSBidXMgYWRkcmVzcyByYW5nZSA9ICIKLQkJCSAgIlslbHgsICVseF1cbiIsIGksCi0JCQkgICh1bnNpZ25lZCBsb25nKXJhci0+cmFyX2FkZHJbaV0ubG93LAotCQkJICAodW5zaWduZWQgbG9uZylyYXItPnJhcl9hZGRyW2ldLmhpZ2gpOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICoJcmFyX2dldF9hZGRyZXNzCQktCWdldCB0aGUgYnVzIGFkZHJlc3MgaW4gYSBSQVIKLSAqCUBzdGFydDogcmV0dXJuIHZhbHVlIG9mIHN0YXJ0IGFkZHJlc3Mgb2YgYmxvY2sKLSAqCUBlbmQ6IHJldHVybiB2YWx1ZSBvZiBlbmQgYWRkcmVzcyBvZiBibG9jawotICoKLSAqCVRoZSByYXJfZ2V0X2FkZHJlc3MgZnVuY3Rpb24gaXMgdXNlZCBieSBvdGhlciBkZXZpY2UgZHJpdmVycwotICoJdG8gb2J0YWluIFJBUiBhZGRyZXNzIGluZm9ybWF0aW9uIG9uIGEgUkFSLiBJdCB0YWtlcyB0aHJlZQotICoJcGFyYW1ldGVyczoKLSAqCi0gKglUaGUgZnVuY3Rpb24gcmV0dXJucyBhIDAgdXBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIFJBUgotICoJZmFjaWxpdHkgb24gdGhpcyBzeXN0ZW0uCi0gKi8KLWludCByYXJfZ2V0X2FkZHJlc3MoaW50IHJhcl9pbmRleCwgZG1hX2FkZHJfdCAqc3RhcnQsIGRtYV9hZGRyX3QgKmVuZCkKLXsKLQlpbnQgaWR4OwotCXN0cnVjdCByYXJfZGV2aWNlICpyYXIgPSByYXJfdG9fZGV2aWNlKHJhcl9pbmRleCwgJmlkeCk7Ci0KLQlpZiAocmFyID09IE5VTEwpIHsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JKnN0YXJ0ID0gcmFyLT5yYXJfYWRkcltpZHhdLmxvdzsKLQkqZW5kID0gcmFyLT5yYXJfYWRkcltpZHhdLmhpZ2g7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHJhcl9nZXRfYWRkcmVzcyk7Ci0KLS8qKgotICoJcmFyX2xvY2sJLQlsb2NrIGEgUkFSIHJlZ2lzdGVyCi0gKglAcmFyX2luZGV4OiBSQVIgdG8gbG9jayAoMC0yKQotICoKLSAqCVRoZSByYXJfbG9jayBmdW5jdGlvbiBpcyB1ZWQgYnkgb3RoZXIgZGV2aWNlIGRyaXZlcnMgdG8gbG9jayBhbiBSQVIuCi0gKglvbmNlIGEgUkFSIGlzIGxvY2tlZCwgaXQgc3RheXMgbG9ja2VkIHVudGlsIHRoZSBuZXh0IHN5c3RlbSByZWJvb3QuCi0gKgotICoJVGhlIGZ1bmN0aW9uIHJldHVybnMgYSAwIHVwb24gc3VjY2VzcyBvciBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBSQVIKLSAqCWZhY2lsaXR5IG9uIHRoaXMgc3lzdGVtLCBvciB0aGUgbG9ja2luZyBmYWlscwotICovCi1pbnQgcmFyX2xvY2soaW50IHJhcl9pbmRleCkKLXsKLQlzdHJ1Y3QgcmFyX2RldmljZSAqcmFyOwotCWludCByZXN1bHQ7Ci0JaW50IGlkeDsKLQlkbWFfYWRkcl90IGxvdywgaGlnaDsKLQotCXJhciA9IHJhcl90b19kZXZpY2UocmFyX2luZGV4LCAmaWR4KTsKLQotCWlmIChyYXIgPT0gTlVMTCkgewotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlsb3cgPSByYXItPnJhcl9hZGRyW2lkeF0ubG93ICYgMHhmZmZmZmMwMHU7Ci0JaGlnaCA9IHJhci0+cmFyX2FkZHJbaWR4XS5oaWdoICYgMHhmZmZmZmMwMHU7Ci0KLQkvKgotCSogT25seSBhbGxvdyBJL08gZnJvbSB0aGUgZ3JhcGhpY3MgYW5kIExhbmd3ZWxsOwotCSogbm90IGZyb20gdGhlIHg4NiBwcm9jZXNzb3IKLQkqLwotCi0JaWYgKHJhcl9pbmRleCA9PSBSQVJfVFlQRV9WSURFTykgewotCQlsb3cgfD0gMHgwMDAwMDAwOTsKLQkJaGlnaCB8PSAweDAwMDAwMDE1OwotCX0gZWxzZSBpZiAocmFyX2luZGV4ID09IFJBUl9UWVBFX0FVRElPKSB7Ci0JCS8qIE9ubHkgYWxsb3cgSS9PIGZyb20gTGFuZ3dlbGw7IG5vdGhpbmcgZnJvbSB4ODYgKi8KLQkJbG93IHw9IDB4MDAwMDAwMDg7Ci0JCWhpZ2ggfD0gMHgwMDAwMDAxODsKLQl9IGVsc2UKLQkJLyogUmVhZC1vbmx5IGZyb20gYWxsIGFnZW50cyAqLwotCQloaWdoIHw9IDB4MDAwMDAwMTg7Ci0KLQkvKgotCSogTm93IHByb2dyYW0gdGhlIHJlZ2lzdGVyIHVzaW5nIHRoZSBMaW5jcm9mdCBtZXNzYWdlCi0JKiBidXMgaW50ZXJmYWNlLgotCSovCi0JcmVzdWx0ID0gcmFyX3NldF9hZGRyKHJhci0+cmFyX2RldiwKLQkJCQkyICogaWR4LCBsb3cpOwotCi0JaWYgKHJlc3VsdCA9PSAwKQotCQlyZXN1bHQgPSByYXJfc2V0X2FkZHIocmFyLT5yYXJfZGV2LAotCQkJCTIgKiBpZHggKyAxLCBoaWdoKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHJhcl9sb2NrKTsKLQotLyoqCi0gKglyZWdpc3Rlcl9yYXIJCS0JcmVnaXN0ZXIgYSBSQVIgaGFuZGxlcgotICoJQG51bTogUkFSIHdlIHdpc2ggdG8gcmVnaXN0ZXIgZm9yCi0gKglAY2FsbGJhY2s6IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBSQVIgc3VwcG9ydCBpcyBhdmFpbGFibGUKLSAqCUBkYXRhOiBkYXRhIHRvIHBhc3MgdG8gdGhpcyBmdW5jdGlvbgotICoKLSAqCVRoZSByZWdpc3Rlcl9yYXIgZnVuY3Rpb24gaXMgdG8gdXNlZCBieSBvdGhlciBkZXZpY2UgZHJpdmVycwotICoJdG8gZW5zdXJlIHRoYXQgdGhpcyBkcml2ZXIgaXMgcmVhZHkuIEFzIHdlIGNhbm5vdCBiZSBzdXJlIG9mCi0gKgl0aGUgY29tcGlsZS9leGVjdXRlIG9yZGVyIG9mIGRyaXZlcnMgaW4gdGhlciBrZXJuZWwsIGl0IGlzCi0gKgliZXN0IHRvIGdpdmUgdGhpcyBkcml2ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4KLSAqCWl0IGlzIHJlYWR5IHRvIGdpdmUgb3V0IGFkZHJlc3Nlcy4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKgl3b3VsZCBoYXZlIHRob3NlIHN0ZXBzIHRoYXQgY29udGludWUgdGhlIGluaXRpYWxpemF0aW9uIG9mCi0gKglhIGRyaXZlciB0aGF0IGRvIHJlcXVpcmUgYSB2YWxpZCBSQVIgYWRkcmVzcy4gT25lIG9mIHRob3NlCi0gKglzdGVwcyB3b3VsZCBiZSB0byBjYWxsIHJhcl9nZXRfYWRkcmVzcygpCi0gKgotICoJVGhpcyBmdW5jdGlvbiByZXR1cm4gMCBvbiBzdWNjZXNzIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotaW50IHJlZ2lzdGVyX3JhcihpbnQgbnVtLCBpbnQgKCpjYWxsYmFjaykodW5zaWduZWQgbG9uZyBkYXRhKSwKLQkJCQkJCQl1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JLyogRm9yIG5vdyB3ZSBoYXJkY29kZSBhIHNpbmdsZSBSQVIgZGV2aWNlICovCi0Jc3RydWN0IHJhcl9kZXZpY2UgKnJhcjsKLQlzdHJ1Y3QgY2xpZW50ICpjOwotCWludCBpZHg7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQltdXRleF9sb2NrKCZyYXJfbXV0ZXgpOwotCi0JLyogRG8gd2UgaGF2ZSBhIGNsaWVudCBtYXBwaW5nIGZvciB0aGlzIFJBUiBudW1iZXIgPyAqLwotCWMgPSByYXJfdG9fY2xpZW50KG51bSk7Ci0JaWYgKGMgPT0gTlVMTCkgewotCQlyZXR2YWwgPSAtRVJBTkdFOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qIElzIGl0IGNsYWltZWQgPyAqLwotCWlmIChjLT5idXN5KSB7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQljLT5idXN5ID0gMTsKLQotCS8qIFNlZSBpZiB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyBSQVIgeWV0LCBpZiB3ZSBkbyB0aGVuIGZpcmUgaXQgKi8KLQlyYXIgPSByYXJfdG9fZGV2aWNlKG51bSwgJmlkeCk7Ci0KLQlpZiAocmFyKSB7Ci0JCS8qCi0JCSogaWYgdGhlIGRyaXZlciBhbHJlYWR5IHJlZ2lzdGVyZWQsIHRoZW4gd2UgY2FuIHNpbXBseQotCQkqIGNhbGwgdGhlIGNhbGxiYWNrIHJpZ2h0IG5vdwotCQkqLwotCQkoKmNhbGxiYWNrKShkYXRhKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIEFycmFuZ2UgdG8gYmUgY2FsbGVkIGJhY2sgd2hlbiB0aGUgaGFyZHdhcmUgaXMgZm91bmQgKi8KLQljLT5jYWxsYmFjayA9IGNhbGxiYWNrOwotCWMtPmRyaXZlcl9wcml2ID0gZGF0YTsKLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZyYXJfbXV0ZXgpOwotCXJldHVybiByZXR2YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3Jhcik7Ci0KLS8qKgotICoJdW5yZWdpc3Rlcl9yYXIJLQlyZWxlYXNlIGEgUkFSIGFsbG9jYXRpb24KLSAqCUBudW06IFJBUiBudW1iZXIKLSAqCi0gKglSZWxlYXNlcyBhIFJBUiBhbGxvY2F0aW9uLCBvciBwZW5kaW5nIGFsbG9jYXRpb24uIElmIGEgY2FsbGJhY2sgaXMKLSAqCXBlbmRpbmcgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgZWl0aGVyIGNvbXBsZXRlIGJlZm9yZSB0aGUgdW5yZWdpc3RlcgotICoJcmV0dXJucyBvciBub3QgYXQgYWxsLgotICovCi0KLXZvaWQgdW5yZWdpc3Rlcl9yYXIoaW50IG51bSkKLXsKLQlzdHJ1Y3QgY2xpZW50ICpjOwotCi0JbXV0ZXhfbG9jaygmcmFyX211dGV4KTsKLQljID0gcmFyX3RvX2NsaWVudChudW0pOwotCWlmIChjID09IE5VTEwgfHwgIWMtPmJ1c3kpCi0JCVdBUk5fT04oMSk7Ci0JZWxzZQotCQljLT5idXN5ID0gMDsKLQltdXRleF91bmxvY2soJnJhcl9tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcmFyKTsKLQotLyoqCi0gKglyYXJfY2FsbGJhY2sJCS0JUHJvY2VzcyBjYWxsYmFja3MKLSAqCUByYXI6IG5ldyBSQVIgZGV2aWNlCi0gKgotICoJUHJvY2VzcyB0aGUgY2FsbGJhY2tzIGZvciBhIG5ld2x5IGZvdW5kIFJBUiBkZXZpY2UuCi0gKi8KLQotc3RhdGljIHZvaWQgcmFyX2NhbGxiYWNrKHN0cnVjdCByYXJfZGV2aWNlICpyYXIpCi17Ci0Jc3RydWN0IGNsaWVudCAqYyA9ICZyYXItPmNsaWVudFswXTsKLQlpbnQgaTsKLQotCW11dGV4X2xvY2soJnJhcl9tdXRleCk7Ci0KLQlyYXItPnJlZ2lzdGVyZWQgPSAxOwkvKiBFbnN1cmUgbm8gbW9yZSBjYWxsYmFja3MgcXVldWUgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBNUlNUX05VTV9SQVI7IGkrKykgewotCQlpZiAoYy0+Y2FsbGJhY2sgJiYgYy0+YnVzeSkgewotCQkJYy0+Y2FsbGJhY2soYy0+ZHJpdmVyX3ByaXYpOwotCQkJYy0+Y2FsbGJhY2sgPSBOVUxMOwotCQl9Ci0JCWMrKzsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZyYXJfbXV0ZXgpOwotfQotCi0vKioKLSAqCXJhcl9wcm9iZQkJLQlQQ0kgcHJvYmUgY2FsbGJhY2sKLSAqCUBkZXY6IFBDSSBkZXZpY2UKLSAqCUBpZDogbWF0Y2hpbmcgZW50cnkgaW4gdGhlIG1hdGNoIHRhYmxlCi0gKgotICoJQSBSQVIgZGV2aWNlIGhhcyBiZWVuIGRpc2NvdmVyZWQuIEluaXRpYWxpc2UgaXQgYW5kIGlmIHN1Y2Nlc3NmdWwKLSAqCXByb2Nlc3MgYW55IHBlbmRpbmcgY2FsbGJhY2tzIHRoYXQgY2FuIG5vdyBiZSBjb21wbGV0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgcmFyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IHJhcl9kZXZpY2UgKnJhcjsKLQotCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIHByb2JlIHN0YXJ0aW5nXG4iKTsKLQotCXJhciA9IGFsbG9jX3Jhcl9kZXZpY2UoKTsKLQlpZiAocmFyID09IE5VTEwpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKiBFbmFibGUgdGhlIGRldmljZSAqLwotCWVycm9yID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsCi0JCQkiRXJyb3IgZW5hYmxpbmcgUkFSIHJlZ2lzdGVyIFBDSSBkZXZpY2VcbiIpOwotCQlnb3RvIGVuZF9mdW5jdGlvbjsKLQl9Ci0KLQkvKiBGaWxsIGluIHRoZSByYXJfZGV2aWNlIHN0cnVjdHVyZSAqLwotCXJhci0+cmFyX2RldiA9IHBjaV9kZXZfZ2V0KGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKGRldiwgcmFyKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgUkFSIHBhcmFtZXRlcnMsIHdoaWNoIGhhdmUgdG8gYmUgcmV0cmlldmVkCi0JICogdmlhIHRoZSBtZXNzYWdlIGJ1cyBpbnRlcmZhY2UuCi0JICovCi0JZXJyb3IgPSBpbml0X3Jhcl9wYXJhbXMocmFyKTsKLQlpZiAoZXJyb3IpIHsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgcmV0cmlldmluZyBSQVIgYWRkcmVzc2VzXG4iKTsKLQkJZ290byBlbmRfZnVuY3Rpb247Ci0JfQotCS8qIG5vdyBjYWxsIGFueW9uZSB3aG8gaGFzIHJlZ2lzdGVyZWQgKHVzaW5nIGNhbGxiYWNrcykgKi8KLQlyYXJfY2FsbGJhY2socmFyKTsKLQlyZXR1cm4gMDsKLWVuZF9mdW5jdGlvbjoKLQlmcmVlX3Jhcl9kZXZpY2UocmFyKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJhcl9wY2lfaWRfdGJsW10gPSB7Ci0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg0MTEwKSB9LAotCXsgMCB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcmFyX3BjaV9pZF90YmwpOwotCi1jb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqbXlfaWRfdGFibGUgPSByYXJfcGNpX2lkX3RibDsKLQotLyogZmllbGQgZm9yIHJlZ2lzdGVyaW5nIGRyaXZlciB0byBQQ0kgZGV2aWNlICovCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcmFyX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAicmFyX3JlZ2lzdGVyX2RyaXZlciIsCi0JLmlkX3RhYmxlID0gcmFyX3BjaV9pZF90YmwsCi0JLnByb2JlID0gcmFyX3Byb2JlLAotCS8qIENhbm5vdCBiZSB1bnBsdWdnZWQgLSBubyByZW1vdmUgKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJhcl9pbml0X2hhbmRsZXIodm9pZCkKLXsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcmFyX3BjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcmFyX2V4aXRfaGFuZGxlcih2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcmFyX3BjaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChyYXJfaW5pdF9oYW5kbGVyKTsKLW1vZHVsZV9leGl0KHJhcl9leGl0X2hhbmRsZXIpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFJlc3RyaWN0ZWQgQWNjZXNzIFJlZ2lvbiBSZWdpc3RlciBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaAppbmRleCAzZjc0NGE1Li5mYWFjODVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCkBAIC00Miw3ICs0Miw4IEBACiAKIC8qIGFwX3dwYS5jICovCiB2b2lkIFdwYVN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAotCQkJIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKwkJCSBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sCisJCQkgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAogI2lmZGVmIFJUTVBfTUFDX1VTQgogdm9pZCBCZWFjb25VcGRhdGVFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKQEAgLTYxLDYgKzYyLDcgQEAKIEJPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCiAJCQkgICAgdTE2IHdjaWQsIHU4ICpwQWRkcik7CiAKLXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKk1hY1RhYmxlTG9va3VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKTsKK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKk1hY1RhYmxlTG9va3VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCQkJdTggKnBBZGRyKTsKIAogI2VuZGlmIC8qIF9fQVBfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGxpc3QuaAppbmRleCBhZGE2NWU1Li4xMjMxZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmgKQEAgLTczLDM1ICs3MywzMSBAQAogZXh0ZXJuIHN0cnVjdCBydF9jaF9mcmVxX21hcCBDSF9IWl9JRF9NQVBbXTsKIGV4dGVybiBpbnQgQ0hfSFpfSURfTUFQX05VTTsKIAotI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKF9jaCwgX2toeikJCQkJCVwKLQkJZG97CQkJCQkJCQkJCQkJCVwKLQkJCWludCBfY2hJZHg7CQkJCQkJCQkJCQlcCi0JCQlmb3IgKF9jaElkeCA9IDA7IF9jaElkeCA8IENIX0haX0lEX01BUF9OVU07IF9jaElkeCsrKVwKLQkJCXsJCQkJCQkJCQkJCQkJXAotCQkJCWlmICgoX2NoKSA9PSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5jaGFubmVsKQkJCVwKLQkJCQl7CQkJCQkJCQkJCQkJXAotCQkJCQkoX2toeikgPSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5mcmVxS0h6ICogMTAwMDsJXAotCQkJCQlicmVhazsJCQkJCQkJCQkJXAotCQkJCX0JCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCVwKLQkJCWlmIChfY2hJZHggPT0gQ0hfSFpfSURfTUFQX05VTSkJCQkJCVwKLQkJCQkoX2toeikgPSAyNDEyMDAwOwkJCQkJCQkJCVwKLSAgICAgICAgICAgIH13aGlsZSgwKQorI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKF9jaCwgX2toeikJCVwKKwkJZG8gewkJCQkJCQlcCisJCQlpbnQgX2NoSWR4OwkJCQkJXAorCQkJZm9yIChfY2hJZHggPSAwOyBfY2hJZHggPCBDSF9IWl9JRF9NQVBfTlVNOyBfY2hJZHgrKykge1wKKwkJCQlpZiAoKF9jaCkgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uY2hhbm5lbCkgeyBcCisJCQkJCShfa2h6KSA9IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHogKiAxMDAwO1wKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCQl9CQkJCQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQlcCisJCQkJKF9raHopID0gMjQxMjAwMDsJCVwKKwkJfSB3aGlsZSAoMCkKIAogI2RlZmluZSAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKF9raHosIF9jaCkgICAgICAgICAgICAgICAgIFwKLQkJZG97CQkJCQkJCQkJCQkJCVwKLQkJCWludCBfY2hJZHg7CQkJCQkJCQkJCQlcCi0JCQlmb3IgKF9jaElkeCA9IDA7IF9jaElkeCA8IENIX0haX0lEX01BUF9OVU07IF9jaElkeCsrKVwKLQkJCXsJCQkJCQkJCQkJCQkJXAotCQkJCWlmICgoX2toeikgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uZnJlcUtIeikJCQlcCi0JCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJKF9jaCkgPSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5jaGFubmVsOwkJCVwKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoX2NoSWR4ID09IENIX0haX0lEX01BUF9OVU0pCQkJCQlcCi0JCQkJKF9jaCkgPSAxOwkJCQkJCQkJCQkJXAotCQl9d2hpbGUoMCkKKwkJZG8gewkJCQkJCQlcCisJCQlpbnQgX2NoSWR4OwkJCQlcCisJCQlmb3IgKF9jaElkeCA9IDA7IF9jaElkeCA8IENIX0haX0lEX01BUF9OVU07IF9jaElkeCsrKSB7XAorCQkJCWlmICgoX2toeikgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uZnJlcUtIeikge1wKKwkJCQkJKF9jaCkgPSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5jaGFubmVsOyBcCisJCQkJCWJyZWFrOwkJCVwKKwkJCQl9CQkJCQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCVwKKwkJCQkoX2NoKSA9IDE7CQkJCVwKKwkJfSB3aGlsZSAoMCkKIAogdm9pZCBCdWlsZENoYW5uZWxMaXN0RXgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCmluZGV4IGMxNmYzNzYuLjk0MTRhYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIERlc2NyaXB0aW9uOgotICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gaW5pdGlsaXplIDQtd2F5IGhhbmRzaGFrZQorICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSA0LXdheSBoYW5kc2hha2UKIAogICAgIFJldHVybjoKIApAQCAtODY3LDcgKzg2Nyw3IEBACiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBEZXNjcmlwdGlvbjoKICAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIGxhc3QgcGFja2V0IG9mIDQtd2F5IHBhaXJ3aXNla2V5IGhhbmRzaGFrZS4KLSAgICAgICAgSW5pdGlsaXplIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZSBmb2xsb3dpbmcuCisgICAgICAgIEluaXRpYWxpemUgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlIGZvbGxvd2luZy4KICAgICBSZXR1cm46CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RpbWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RpbWVyLmMKaW5kZXggNDJlNDdkOS4uYWI1MjA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90aW1lci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYwpAQCAtMTQzLDggKzE0Myw4IEBACiAJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2s7CiAJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOwogCi0JcFRhc2sgPSAoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqKUNvbnRleHQ7Ci0JcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilwVGFzay0+cHJpdjsKKwlwVGFzayA9IENvbnRleHQ7CisJcEFkID0gcFRhc2stPnByaXY7CiAKIAlSdG1wT1NUYXNrQ3VzdG9taXplKHBUYXNrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAppbmRleCA5OWM5MzYyLi4wMTQxNGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApAQCAtMzEsNyArMzEsNyBAQAogCiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKIAlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAogCkBAIC01MCw3ICs1MCw3IEBACiAjZGVmaW5lIE1MTUVfVEFTS19FWEVDX0lOVFYgICAgICAgICAxMDAvKjIwMCovCS8qICovCiAjZGVmaW5lIExFQURfVElNRSAgICAgICAgICAgICAgICAgICA1CiAjZGVmaW5lIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICAgICAgIDEwICAvKjUqLwkvKiBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIE1MTUVfVEFTS19FWEVDX0lOVFYgPSAxIHNlYyAqLwotI2RlZmluZSBSRU9SREVSX0VYRUNfSU5UViAgICAgICAgIAkxMDAJLyogMC4xIHNlYyAqLworI2RlZmluZSBSRU9SREVSX0VYRUNfSU5UVgkJMTAwCS8qIDAuMSBzZWMgKi8KIAogLyogVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbiAqLwogI2RlZmluZSBDRQkJMApAQCAtNjAsNyArNjAsNyBAQAogI2RlZmluZSBKQVBfVzU2CTQKICNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CiAKLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWgkvKiAyMDQ4IG1zZWMgPSAyIHNlYyAqLworI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgKDQgKiBPU19IWikJLyogMjA0OCBtc2VjID0gMiBzZWMgKi8KIAogI2RlZmluZSBETFNfVElNRU9VVCAgICAgICAgICAgICAgICAgMTIwMAkvKiB1bml0OiBtc2VjICovCiAjZGVmaW5lIEFVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAzMDAJLyogdW5pdDogbXNlYyAqLwpAQCAtMTE5LDggKzExOSw4IEBACiAjZGVmaW5lIE1BQ19BRERSX0lTX0dST1VQKEFkZHIpICAgICAgICgoKEFkZHJbMF0pICYgMHgwMSkpCiAjZGVmaW5lIE1BQ19BRERSX0hBU0goQWRkcikgICAgICAgICAgICAoQWRkclswXSBeIEFkZHJbMV0gXiBBZGRyWzJdIF4gQWRkclszXSBeIEFkZHJbNF0gXiBBZGRyWzVdKQogI2RlZmluZSBNQUNfQUREUl9IQVNIX0lOREVYKEFkZHIpICAgICAgKE1BQ19BRERSX0hBU0goQWRkcikgJSBIQVNIX1RBQkxFX1NJWkUpCi0jZGVmaW5lIFRJRF9NQUNfSEFTSChBZGRyLFRJRCkgICAgICAgICAgICAoVElEXkFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKLSNkZWZpbmUgVElEX01BQ19IQVNIX0lOREVYKEFkZHIsVElEKSAgICAgIChUSURfTUFDX0hBU0goQWRkcixUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQorI2RlZmluZSBUSURfTUFDX0hBU0goQWRkciwgVElEKSAgICAgICAgICAgIChUSUReQWRkclswXSBeIEFkZHJbMV0gXiBBZGRyWzJdIF4gQWRkclszXSBeIEFkZHJbNF0gXiBBZGRyWzVdKQorI2RlZmluZSBUSURfTUFDX0hBU0hfSU5ERVgoQWRkciwgVElEKSAgICAgIChUSURfTUFDX0hBU0goQWRkciwgVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKIAogLyogTEVEIENvbnRyb2wgKi8KIC8qIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZSAqLwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQogI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkJLyogODAyLjExZSBkOSAqLwogCi0jZGVmaW5lIENBUF9HRU5FUkFURShlc3MsaWJzcyxwcml2LHNfcHJlLHNfc2xvdCxzcGVjdHJ1bSkgICgoKGVzcykgPyAweDAwMDEgOiAweDAwMDApIHwgKChpYnNzKSA/IDB4MDAwMiA6IDB4MDAwMCkgfCAoKHByaXYpID8gMHgwMDEwIDogMHgwMDAwKSB8ICgoc19wcmUpID8gMHgwMDIwIDogMHgwMDAwKSB8ICgoc19zbG90KSA/IDB4MDQwMCA6IDB4MDAwMCkgfCAoKHNwZWN0cnVtKSA/IDB4MDEwMCA6IDB4MDAwMCkpCisjZGVmaW5lIENBUF9HRU5FUkFURShlc3MsIGlic3MsIHByaXYsIHNfcHJlLCBzX3Nsb3QsIHNwZWN0cnVtKSAgKCgoZXNzKSA/IDB4MDAwMSA6IDB4MDAwMCkgfCAoKGlic3MpID8gMHgwMDAyIDogMHgwMDAwKSB8ICgocHJpdikgPyAweDAwMTAgOiAweDAwMDApIHwgKChzX3ByZSkgPyAweDAwMjAgOiAweDAwMDApIHwgKChzX3Nsb3QpID8gMHgwNDAwIDogMHgwMDAwKSB8ICgoc3BlY3RydW0pID8gMHgwMTAwIDogMHgwMDAwKSkKIAogI2RlZmluZSBFUlBfSVNfTk9OX0VSUF9QUkVTRU5UKHgpICAgICAgICAoKCh4KSAmIDB4MDEpICE9IDApCS8qIDgwMi4xMWcgKi8KICNkZWZpbmUgRVJQX0lTX1VTRV9QUk9URUNUSU9OKHgpICAgICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQkvKiA4MDIuMTFnICovCkBAIC0xNTQsOSArMTU0LDkgQEAKICNkZWZpbmUgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQgICAgICAgOAkvKiAzICAvLyBqdXN0IHRlc3QgYnkgZ2FyeSAqLwogI2RlZmluZSBEUlNfUEVOQUxUWSAgICAgICAgICAgICAgICAgICAgICA4CiAKLSNkZWZpbmUgQkFfTk9UVVNFIAkyCisjZGVmaW5lIEJBX05PVFVTRQkyCiAvKkJBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSAqLwotI2RlZmluZSBJTU1FRF9CQSAJMQorI2RlZmluZSBJTU1FRF9CQQkxCiAjZGVmaW5lIERFTEFZX0JBCTAKIAogLyogQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lICovCkBAIC0xNzYsOCArMTc2LDcgQEAKIAogLyogcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzICovCiAjZGVmaW5lIFJFU0VUX09ORV9TRUNfVFhfQ05UKF9fcEVudHJ5KSBcCi1pZiAoKChfX3BFbnRyeSkpICE9IE5VTEwpIFwKLXsgXAoraWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSB7IFwKIAkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKIAkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKIAkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXApAQCAtODQ2LDcgKzg0NSw3IEBACiAJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSBFbnRyeVtNQVhfTEVOX09GX01MTUVfUVVFVUVdOwogfTsKIAotdHlwZWRlZiB2b2lkKCpTVEFURV9NQUNISU5FX0ZVTkMpICh2b2lkICogQWRhcHRvciwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7Cit0eXBlZGVmIHZvaWQoKlNUQVRFX01BQ0hJTkVfRlVOQykgKHZvaWQgKkFkYXB0b3IsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCiBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSB7CiAJdW5zaWduZWQgbG9uZyBCYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCmluZGV4IDAwMjliMmQuLjY1MzY5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOwogCWludCByZXQgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCi0JcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilwVGFzay0+cHJpdjsKKwlwQWQgPSBwVGFzay0+cHJpdjsKIAogI2lmZGVmIEtUSFJFQURfU1VQUE9SVAogCWlmIChwVGFzay0+a3RocmVhZF90YXNrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCmluZGV4IDgyYjZlNzguLjI4MjkzNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCkBAIC0yNTExLDcgKzI1MTEsNyBAQAogCQkgICB1OCBUSUQsCiAJCSAgIHU4IFR4UmF0ZSwKIAkJICAgdTggVHhvcG1vZGUsCi0JCSAgIElOIEJPT0xFQU4gQ2ZBY2ssIElOIEhUVFJBTlNNSVRfU0VUVElORyAqIHBUcmFuc21pdCk7CisJCSAgIElOIEJPT0xFQU4gQ2ZBY2ssIElOIEhUVFJBTlNNSVRfU0VUVElORyAqcFRyYW5zbWl0KTsKIAogdm9pZCBSVE1QV3JpdGVUeFdJX0RhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAogCQkJc3RydWN0IHJ0X3R4d2kgKnBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspOwpAQCAtMzA1OSw3ICszMDU5LDcgQEAKIAkJCQkgICAgdTE2ICpwQmVhY29uUGVyaW9kLAogCQkJCSAgICB1OCAqcENoYW5uZWwsCiAJCQkJICAgIHU4ICpwTmV3Q2hhbm5lbCwKLQkJCQkgICAgT1VUIExBUkdFX0lOVEVHRVIgKiBwVGltZXN0YW1wLAorCQkJCSAgICBPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKIAkJCQkgICAgc3RydWN0IHJ0X2NmX3Bhcm0gKnBDZlBhcm0sCiAJCQkJICAgIHUxNiAqcEF0aW1XaW4sCiAJCQkJICAgIHUxNiAqcENhcGFiaWxpdHlJbmZvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvdXNiX21haW5fZGV2LmMKaW5kZXggNjc0NzY5ZC4uYTBmZTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jCkBAIC02NCw2ICs2NCw3IEBACiAJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDcpfSwJLyogQUwgKi8KIAl7VVNCX0RFVklDRSgweDA1MEQsIDB4ODA1Myl9LAkvKiBCZWxraW4gKi8KIAl7VVNCX0RFVklDRSgweDA1MEQsIDB4ODI1Qil9LAkvKiBCZWxraW4gKi8KKwl7VVNCX0RFVklDRSgweDA1MEQsIDB4OTM1Qil9LAkvKiBCZWxraW4gRjZENDA1MCB2MiAqLwogCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzIzKX0sCS8qIEFpcmxpbmsgKi8KIAl7VVNCX0RFVklDRSgweDE0QjIsIDB4M0MyNyl9LAkvKiBBaXJsaW5rICovCiAJe1VTQl9ERVZJQ0UoMHgwN0FBLCAweDAwMkYpfSwJLyogQ29yZWdhICovCkBAIC00MjIsOCArNDIzLDggQEAKIAlpbnQgc3RhdHVzOwogCXN0YXR1cyA9IDA7CiAKLQlwVGFzayA9IChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICopQ29udGV4dDsKLQlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCXBUYXNrID0gQ29udGV4dDsKKwlwQWQgPSBwVGFzay0+cHJpdjsKIAogCVJ0bXBPU1Rhc2tDdXN0b21pemUocFRhc2spOwogCkBAIC00OTEsOCArNDkyLDggQEAKIAlpbnQgc3RhdHVzOwogCXN0YXR1cyA9IDA7CiAKLQlwVGFzayA9IChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICopQ29udGV4dDsKLQlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCXBUYXNrID0gQ29udGV4dDsKKwlwQWQgPSBwVGFzay0+cHJpdjsKIAogCVJ0bXBPU1Rhc2tDdXN0b21pemUocFRhc2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL21kNC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9tZDQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmYjYzNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL21kNC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX01ENF9IX18KLSNkZWZpbmUgX19NRDRfSF9fCi0KLS8qIE1ENCBjb250ZXh0LiAqLwotdHlwZWRlZglzdHJ1Y3QJX01ENF9DVFhfCXsKLQl1bnNpZ25lZCBsb25nCXN0YXRlWzRdOyAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCi0JdW5zaWduZWQgbG9uZwljb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLwotCXU4CWJ1ZmZlcls2NF07ICAgICAgLyogaW5wdXQgYnVmZmVyICovCi19CU1ENF9DVFg7Ci0KLXZvaWQgTUQ0SW5pdChNRDRfQ1RYICopOwotdm9pZCBNRDRVcGRhdGUoTUQ0X0NUWCAqLCB1OCAqLCBVSU5UKTsKLXZvaWQgTUQ0RmluYWwodTggWzE2XSwgTUQ0X0NUWCAqKTsKLQotI2VuZGlmIC8qX19NRDRfSF9fKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwppbmRleCAxNTVhNzhlLi4xYjMxMDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCkBAIC00LDYgKzQsNyBAQAogCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgV0VYVF9QUklWCiAJc2VsZWN0IEVFUFJPTV85M0NYNgorCXNlbGVjdCBDUllQVE8KIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBJZiBidWlsdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgcjgxODdzZS5rby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL0tjb25maWcKaW5kZXggMmFlMzc0NS4uMmU2NGIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL0tjb25maWcKQEAgLTMsNSArMyw2IEBACiAJZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgogCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgV0VYVF9QUklWCisJc2VsZWN0IENSWVBUTwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2RvdDExZC5jCmluZGV4IDkwOGY2MDUuLjZiYmYwOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvZG90MTFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9kb3QxMWQuYwpAQCAtMjE4LDIyICsyMTgsNCBAQAogCiAJcmV0dXJuIGRlZmF1bHRfY2huOwogfQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0vL0VYUE9SVF9TWU1CT0woRG90MTFkX0luaXQpOwotLy9FWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7Ci0vL0VYUE9SVF9TWU1CT0woRG90MTFkX1VwZGF0ZUNvdW50cnlJZSk7Ci0vL0VYUE9SVF9TWU1CT0woRE9UMTFEX0dldE1heFR4UHdySW5EYm0pOwotLy9FWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOwotLy9FWFBPUlRfU1lNQk9MKElzTGVnYWxDaGFubmVsKTsKLS8vRVhQT1JUX1NZTUJPTChUb0xlZ2FsQ2hhbm5lbCk7Ci0jZWxzZQotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoRG90MTFkX0luaXQpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoRG90MTFkX1Jlc2V0KTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoRE9UMTFEX0dldE1heFR4UHdySW5EYm0pOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoRE9UMTFEX1NjYW5Db21wbGV0ZSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhJc0xlZ2FsQ2hhbm5lbCk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhUb0xlZ2FsQ2hhbm5lbCk7Ci0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTEuaAppbmRleCA1MDcyOGY2Li5kZGE2NzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTI3LDEyICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLwogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvamZmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgpAQCAtNDQsMTIgKzM5LDYgQEAKICNpbmNsdWRlICJydGw4MTl4X0JBLmgiCiAjaW5jbHVkZSAicnRsODE5eF9UUy5oIgogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCi0jaWZuZGVmIGJvb2wKLXR5cGVkZWYgZW51bXtmYWxzZSA9IDAsIHRydWV9IGJvb2w7Ci0jZW5kaWYKLSNlbmRpZgotCiAjaWZuZGVmIElXX01PREVfTU9OSVRPUgogI2RlZmluZSBJV19NT0RFX01PTklUT1IgNgogI2VuZGlmCkBAIC00MjgsNDYgKzQxNyw5IEBACiAjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CiAjZW5kaWYKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi1zdGF0aWMgaW5saW5lIHZvaWQgdHFfaW5pdChzdHJ1Y3QgdHFfc3RydWN0ICogdGFzaywgdm9pZCgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQl0YXNrLT5yb3V0aW5lID0gZnVuYzsKLQl0YXNrLT5kYXRhIAk9IGRhdGE7Ci0JLy90YXNrLT5uZXh0ID0gTlVMTDsKLQlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdCk7Ci0JdGFzay0+c3luYyA9IDA7Ci19Ci0jZW5kaWYKLQogLy8gbGludXggdW5kZXIgMi42LjkgcmVsZWFzZSBtYXkgbm90IHN1cHBvcnQgaXQsIHNvIG1vZGlmeSBpdCBmb3IgY29tbW9uIHVzZQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOSkpCi0vLyNkZWZpbmUgTVNFQ1ModCkJKDEwMDAgKiAoKHQpIC8gSFopICsgMTAwMCAqICgodCkgJSBIWikgLyBIWikKLSNkZWZpbmUgTVNFQ1ModCkJKEhaICogKCh0KSAvIDEwMDApICsgKEhaICogKCh0KSAlIDEwMDApKSAvIDEwMDApCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsKHVuc2lnbmVkIGludCBtc2VjcykKLXsKLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE1TRUNTKG1zZWNzKSArIDE7Ci0KLSAgICAgICAgIHdoaWxlICh0aW1lb3V0KSB7Ci0gICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0gICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIHRpbWVvdXQ7Ci19Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwzMSkpCi1zdGF0aWMgaW5saW5lIHZvaWQgbXNsZWVwKHVuc2lnbmVkIGludCBtc2VjcykKLXsKLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE1TRUNTKG1zZWNzKSArIDE7Ci0KLSAgICAgICAgIHdoaWxlICh0aW1lb3V0KSB7Ci0gICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLSAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0gICAgICAgICB9Ci19Ci0jZW5kaWYKLSNlbHNlCiAjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKICNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQotI2VuZGlmCiAKICNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CiAvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCkBAIC0xNzQ3LDIxICsxNjk5LDYgQEAKICNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0NIQU5ORUxTIChJRUVFODAyMTFfNTJHSFpfTUFYX0NIQU5ORUwgLSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMICsgMSkKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKLWV4dGVybiBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQotewotICAgICAgICByZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOwotfQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCi1leHRlcm4gaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKLXsKLQlyZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAgXAotCQkoYWRkclszXSA9PSAweGZmKSAmJiAoYWRkcls0XSA9PSAweGZmKSAmJiAoYWRkcls1XSA9PSAweGZmKSk7Ci19Ci0jZW5kaWYKLQogdHlwZWRlZiBzdHJ1Y3QgdHhfcGVuZGluZ190ewogCWludCBmcmFnOwogCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGI7CkBAIC0xODM4LDExICsxNzc1LDcgQEAKIAlib29sCQkJCWJJUFNNb2RlQmFja3VwOwogCWJvb2wJCQkJYlN3UmZQcm9jZXNzaW5nOwogCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJc3RydWN0IHdvcmtfc3RydWN0IAlJbmFjdGl2ZVBzV29ya0l0ZW07Ci0jZWxzZQotCXN0cnVjdCB0cV9zdHJ1Y3QJSW5hY3RpdmVQc1dvcmtJdGVtOwotI2VuZGlmCiAJc3RydWN0IHRpbWVyX2xpc3QJSW5hY3RpdmVQc1RpbWVyOwogCiAJLy8gUmV0dXJuIHBvaW50IGZvciBqb2luIGFjdGlvbgpAQCAtMjMyOSwzNiArMjI2MiwxNiBAQAogCiAJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfY29tcGxldGVfd3E7CiAgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCiAgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgc29mdG1hY19zY2FuX3dxOwogICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKIAkgc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOwogCSBzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3dha2V1cF93cTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3NsZWVwX3dxOwotI2Vsc2UKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnRfaWJzc193cTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKLSNlbmRpZgorCiAgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCB3eF9zeW5jX3NjYW5fd3E7CiAgICAgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKLSNlbHNlCi0JLyogdXNlZCBmb3IgcGVyaW9kbHkgc2NhbiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHNjYW5fdGltZXI7Ci0KLQlzdHJ1Y3QgdHFfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKLQlzdHJ1Y3QgdHFfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKLQlzdHJ1Y3QgdHFfc3RydWN0IHN0YXJ0X2lic3Nfd3E7Ci0Jc3RydWN0IHRxX3N0cnVjdCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxOwotCXN0cnVjdCB0cV9zdHJ1Y3Qgc29mdG1hY19zY2FuX3dxOwotCXN0cnVjdCB0cV9zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOwotCi0jZW5kaWYKICAgICAgICAgLy8gUW9zIHJlbGF0ZWQuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTAxLgogICAgICAgICAvL1NUQV9RT1MgIFN0YVFvczsKIApAQCAtMjU1NywxMSArMjQ3MCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OwotI2Vsc2UKLQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRldi0+cHJpdiktPnByaXY7Ci0jZW5kaWYKIH0KIAogZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQpAQCAtMjgxNCwxMSArMjcyMyw3IEBACiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOwogCiAvL2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKIGV4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLSNlbHNlCi0gZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0jZW5kaWYKIAogCiBleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcmF3dHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwppbmRleCBkNWFhOWFmLi5hZTUwMzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKQEAgLTI0MywyMyArMjQzLDMgQEAKIAlrZnJlZShoY3J5cHQpOwogfQogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcik7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KTsKLQotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMpOwotI2Vsc2UKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KTsKLQotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMpOwotI2VuZGlmCi0KLS8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b19pbml0KTsKLS8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b19kZWluaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmgKaW5kZXggYTg0ZGY0Yi4uY2E3ZGQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oCkBAIC04MiwxMiArODIsNCBAQAogdm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7CiB2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jZGVmaW5lIG9mZnNldF9pbl9wYWdlKHApICgodW5zaWduZWQgbG9uZykocCkgJiB+UEFHRV9NQVNLKQotI2VuZGlmCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwzMSkpCi0jZGVmaW5lIGNyeXB0b19hbGxvY190Zm0gY3J5cHRvX2FsbG9jX3RmbV9yc2wKLSNkZWZpbmUgY3J5cHRvX2ZyZWVfdGZtIGNyeXB0b19mcmVlX3RmbV9yc2wKLSNlbmRpZgotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwppbmRleCA3MTY1YzRjLi5hNGUyMWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCkBAIC0yNCwxOCArMjQsOSBAQAogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNlbHNlCiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jZW5kaWYKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKLSAgICAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jZWxzZQogICAgICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgotI2VuZGlmCi0vLyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIAogTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBDQ01QIik7CkBAIC03NSwyMSArNjYsNyBAQAogdm9pZCBpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogCQkJICAgICBjb25zdCB1OCBwdFsxNl0sIHU4IGN0WzE2XSkKIHsKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjLCBkc3Q7Ci0KLQlzcmMucGFnZSA9IHZpcnRfdG9fcGFnZShwdCk7Ci0Jc3JjLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHB0KTsKLQlzcmMubGVuZ3RoID0gQUVTX0JMT0NLX0xFTjsKLQotCWRzdC5wYWdlID0gdmlydF90b19wYWdlKGN0KTsKLQlkc3Qub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoY3QpOwotCWRzdC5sZW5ndGggPSBBRVNfQkxPQ0tfTEVOOwotCi0JY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgJmRzdCwgJnNyYywgQUVTX0JMT0NLX0xFTik7Ci0jZWxzZQogCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoKHZvaWQqKXRmbSwgY3QsIHB0KTsKLSNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jY21wX2luaXQoaW50IGtleV9pZHgpCkBAIC0xMDEsMTQgKzc4LDYgQEAKIAkJZ290byBmYWlsOwogCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OwogCi0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghT1BFTlNVU0VfU0xFRCkpCi0JcHJpdi0+dGZtID0gY3J5cHRvX2FsbG9jX3RmbSgiYWVzIiwgMCk7Ci0JaWYgKHByaXYtPnRmbSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJICAgICAgICJjcnlwdG8gQVBJIGFlc1xuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0gICAgICAgI2Vsc2UKICAgICAgICBwcml2LT50Zm0gPSAodm9pZCopY3J5cHRvX2FsbG9jX2NpcGhlcigiYWVzIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT50Zm0pKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlICIKQEAgLTExNiwxNyArODUsMTIgQEAKIAkJcHJpdi0+dGZtID0gTlVMTDsKIAkJZ290byBmYWlsOwogCX0KLQkjZW5kaWYKIAlyZXR1cm4gcHJpdjsKIAogZmFpbDoKIAlpZiAocHJpdikgewogCQlpZiAocHJpdi0+dGZtKQotCQkJI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCi0JCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKLSAgICAgICAgICAgICAgICAgICAgI2Vsc2UKIAkJCWNyeXB0b19mcmVlX2NpcGhlcigodm9pZCopcHJpdi0+dGZtKTsKLQkJICAgICAgI2VuZGlmCiAJCWtmcmVlKHByaXYpOwogCX0KIApAQCAtMTM4LDExICsxMDIsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CiAJaWYgKF9wcml2ICYmIF9wcml2LT50Zm0pCi0jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKLQkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm0pOwotI2Vsc2UKIAkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkKilfcHJpdi0+dGZtKTsKLSNlbmRpZgogCWtmcmVlKHByaXYpOwogfQogCkBAIC01MjgsMTEgKzQ4OCwzIEBACiAJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOwogfQogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY2NtcF9udWxsKTsKLSNlbHNlCi1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfY2NtcF9udWxsKTsKLSNlbmRpZgotCi0vL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KTsKLS8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCmluZGV4IDY1ZjQ4ODkuLjE0Y2E2MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTI0LDE3ICsyNCw4IEBACiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNlbmRpZgotLy8jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQotICAgICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLSNlbHNlCi0gICAgICAgICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAKQEAgLTY4LDE3ICs1OSwxMCBAQAogCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzOwogCiAJaW50IGtleV9pZHg7Ci0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSB8fCAoT1BFTlNVU0VfU0xFRCkpCiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnJ4X3RmbV9hcmM0OwogCXN0cnVjdCBjcnlwdG9faGFzaCAqcnhfdGZtX21pY2hhZWw7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnR4X3RmbV9hcmM0OwogCXN0cnVjdCBjcnlwdG9faGFzaCAqdHhfdGZtX21pY2hhZWw7Ci0jZWxzZQotCXN0cnVjdCBjcnlwdG9fdGZtICp0eF90Zm1fYXJjNDsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdHhfdGZtX21pY2hhZWw7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnJ4X3RmbV9hcmM0OwotCXN0cnVjdCBjcnlwdG9fdGZtICpyeF90Zm1fbWljaGFlbDsKLSNlbmRpZgogCS8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgdmlydF90b19wYWdlKCkgKGNyeXB0byBBUEkpICovCiAJdTggcnhfaGRyWzE2XSwgdHhfaGRyWzE2XTsKIH07CkBAIC05MSwzNSArNzUsNiBAQAogCWlmIChwcml2ID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKIAlwcml2LT5rZXlfaWR4ID0ga2V5X2lkeDsKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKLQlwcml2LT50eF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY190Zm0oImFyYzQiLCAwKTsKLQlpZiAocHJpdi0+dHhfdGZtX2FyYzQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCQkJImNyeXB0byBBUEkgYXJjNFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwcml2LT50eF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY190Zm0oIm1pY2hhZWxfbWljIiwgMCk7Ci0JaWYgKHByaXYtPnR4X3RmbV9taWNoYWVsID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotCQkJCSJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXByaXYtPnJ4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX3RmbSgiYXJjNCIsIDApOwotCWlmIChwcml2LT5yeF90Zm1fYXJjNCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJCQkiY3J5cHRvIEFQSSBhcmM0XG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXByaXYtPnJ4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX3RmbSgibWljaGFlbF9taWMiLCAwKTsKLQlpZiAocHJpdi0+cnhfdGZtX21pY2hhZWwgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCQkJImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotI2Vsc2UKIAlwcml2LT50eF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCiAJCQlDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9hcmM0KSkgewpAQCAtMTU1LDIyICsxMTAsMTAgQEAKIAkJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBOVUxMOwogCQlnb3RvIGZhaWw7CiAJfQotI2VuZGlmCiAJcmV0dXJuIHByaXY7CiAKIGZhaWw6CiAJaWYgKHByaXYpIHsKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKLQkJaWYgKHByaXYtPnR4X3RmbV9taWNoYWVsKQotCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnR4X3RmbV9taWNoYWVsKTsKLQkJaWYgKHByaXYtPnR4X3RmbV9hcmM0KQotCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnR4X3RmbV9hcmM0KTsKLQkJaWYgKHByaXYtPnJ4X3RmbV9taWNoYWVsKQotCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnJ4X3RmbV9taWNoYWVsKTsKLQkJaWYgKHByaXYtPnJ4X3RmbV9hcmM0KQotCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnJ4X3RmbV9hcmM0KTsKLQotI2Vsc2UKIAkJaWYgKHByaXYtPnR4X3RmbV9taWNoYWVsKQogCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT50eF90Zm1fbWljaGFlbCk7CiAJCWlmIChwcml2LT50eF90Zm1fYXJjNCkKQEAgLTE3OSw3ICsxMjIsNiBAQAogCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT5yeF90Zm1fbWljaGFlbCk7CiAJCWlmIChwcml2LT5yeF90Zm1fYXJjNCkKIAkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT5yeF90Zm1fYXJjNCk7Ci0jZW5kaWYKIAkJa2ZyZWUocHJpdik7CiAJfQogCkBAIC0xOTAsMTYgKzEzMiw2IEBACiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfdGtpcF9kZWluaXQodm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqX3ByaXYgPSBwcml2OwotI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIU9QRU5TVVNFX1NMRUQpKQotCWlmIChfcHJpdi0+dHhfdGZtX21pY2hhZWwpCi0JCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dHhfdGZtX21pY2hhZWwpOwotCWlmIChfcHJpdi0+dHhfdGZtX2FyYzQpCi0JCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dHhfdGZtX2FyYzQpOwotCWlmIChfcHJpdi0+cnhfdGZtX21pY2hhZWwpCi0JCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+cnhfdGZtX21pY2hhZWwpOwotCWlmIChfcHJpdi0+cnhfdGZtX2FyYzQpCi0JCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+cnhfdGZtX2FyYzQpOwotI2Vsc2UKIAlpZiAoX3ByaXYpIHsKIAkJaWYgKF9wcml2LT50eF90Zm1fbWljaGFlbCkKIAkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnR4X3RmbV9taWNoYWVsKTsKQEAgLTIxMCw3ICsxNDIsNiBAQAogCQlpZiAoX3ByaXYtPnJ4X3RmbV9hcmM0KQogCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm1fYXJjNCk7CiAJfQotI2VuZGlmCiAJa2ZyZWUocHJpdik7CiB9CiAKQEAgLTM4MSwxMCArMzEyLDggQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOwogCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKIAotCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpIHx8IChPUEVOU1VTRV9TTEVEKSkKIAlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gdGtleS0+dHhfdGZtX2FyYzR9OwogCWludCByZXQgPSAwOwotCSNlbmRpZgogCXU4IHJjNGtleVsxNl0sICAqaWN2OwogCXUzMiBjcmM7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtNDQ3LDMyICszNzYsMTQgQEAKIAlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCiAJewogCQlpY3YgPSBza2JfcHV0KHNrYiwgNCk7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKIAkJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIGxlbik7Ci0jZWxzZQotCQljcmMgPSB+ZXRoZXJfY3JjX2xlKGxlbiwgcG9zKTsKLSNlbmRpZgogCQlpY3ZbMF0gPSBjcmM7CiAJCWljdlsxXSA9IGNyYyA+PiA4OwogCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CiAJCWljdlszXSA9IGNyYyA+PiAyNDsKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKLQkJY3J5cHRvX2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwotCQlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7Ci0JCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7Ci0JCXNnLmxlbmd0aCA9IGxlbiArIDQ7Ci0JCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0a2V5LT50eF90Zm1fYXJjNCwgJnNnLCAmc2csIGxlbiArIDQpOwotI2Vsc2UKIAkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwotI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCi0JCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKLQkJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKLQkJc2cubGVuZ3RoID0gbGVuICsgNDsKLSNlbHNlCiAJCXNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7Ci0jZW5kaWYKIAkJcmV0PSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKLSNlbmRpZgogCiAJfQogCkBAIC00ODMsMTEgKzM5NCw3IEBACiAJfQogCiAJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQotI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIU9QRU5TVVNFX1NMRUQpKQotCQlyZXR1cm4gMDsKLQkjZWxzZQogCQlyZXR1cm4gcmV0OwotCSNlbmRpZgogCWVsc2UKICAgICAgICAgCXJldHVybiAwOwogCkBAIC01MDIsOSArNDA5LDcgQEAKIAl1MTYgaXYxNjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOwogCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKLQkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSB8fCAoT1BFTlNVU0VfU0xFRCkpCiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHRrZXktPnJ4X3RmbV9hcmM0fTsKLQkjZW5kaWYKIAl1OCByYzRrZXlbMTZdOwogCXU4IGljdls0XTsKIAl1MzIgY3JjOwpAQCAtNTYzLDIxICs0NjgsOCBAQAogCiAJCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSAxMjsKIAotI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIU9QRU5TVVNFX1NMRUQpKQotCQljcnlwdG9fY2lwaGVyX3NldGtleSh0a2V5LT5yeF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7Ci0JCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKLQkJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKLQkJc2cubGVuZ3RoID0gcGxlbiArIDQ7Ci0JCWNyeXB0b19jaXBoZXJfZGVjcnlwdCh0a2V5LT5yeF90Zm1fYXJjNCwgJnNnLCAmc2csIHBsZW4gKyA0KTsKLSNlbHNlCiAJCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnJ4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKLSNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQotCQlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7Ci0JCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7Ci0JCXNnLmxlbmd0aCA9IHBsZW4gKyA0OwotI2Vsc2UKIAkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7Ci0jZW5kaWYKIAkJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICI6IFRLSVA6IGZhaWxlZCB0byBkZWNyeXB0ICIKQEAgLTU4NiwxMyArNDc4LDggQEAKIAkJCX0KIAkJCXJldHVybiAtNzsKIAkJfQotI2VuZGlmCiAKLQkjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKIAkJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIHBsZW4pOwotCSNlbHNlCi0JCWNyYyA9IH5ldGhlcl9jcmNfbGUocGxlbiwgcG9zKTsKLQkjZW5kaWYKIAkJaWN2WzBdID0gY3JjOwogCQlpY3ZbMV0gPSBjcmMgPj4gODsKIAkJaWN2WzJdID0gY3JjID4+IDE2OwpAQCAtNjQxLDQ3ICs1MjgsNiBAQAogfQogCiAKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKLXN0YXRpYyBpbnQgbWljaGFlbF9taWMoc3RydWN0IGNyeXB0b190Zm0gKiB0Zm1fbWljaGFlbCwgdTggKmtleSwgdTggKmhkciwKLQkJICAgICAgIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptaWMpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCi0gICAgICAgIHN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKLSAgICAgICAgaW50IHJldCA9IDA7Ci0jZW5kaWYKLQotCWlmICh0Zm1fbWljaGFlbCA9PSBOVUxMKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljaGFlbF9taWM6IHRmbV9taWNoYWVsID09IE5VTExcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaGRyKTsKLQlzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShoZHIpOwotCXNnWzBdLmxlbmd0aCA9IDE2OwotCi0Jc2dbMV0ucGFnZSA9IHZpcnRfdG9fcGFnZShkYXRhKTsKLQlzZ1sxXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhKTsKLQlzZ1sxXS5sZW5ndGggPSBkYXRhX2xlbjsKLQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQotCWNyeXB0b19kaWdlc3RfaW5pdCh0Zm1fbWljaGFlbCk7Ci0gICAgICAgIGNyeXB0b19kaWdlc3Rfc2V0a2V5KHRmbV9taWNoYWVsLCBrZXksIDgpOwotICAgICAgICBjcnlwdG9fZGlnZXN0X3VwZGF0ZSh0Zm1fbWljaGFlbCwgc2csIDIpOwotICAgICAgICBjcnlwdG9fZGlnZXN0X2ZpbmFsKHRmbV9taWNoYWVsLCBtaWMpOwotICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi1pZiAoY3J5cHRvX2hhc2hfc2V0a2V5KHRrZXktPnRmbV9taWNoYWVsLCBrZXksIDgpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotLy8gICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgZGVzYy50Zm0gPSB0a2V5LT50Zm1fbWljaGFlbDsKLSAgICAgICAgICAgICAgZGVzYy5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgIHJldCA9IGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgc2csIGRhdGFfbGVuICsgMTYsIG1pYyk7Ci0gICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0jZW5kaWYKLX0KLSNlbHNlCiBzdGF0aWMgaW50IG1pY2hhZWxfbWljKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtX21pY2hhZWwsIHU4ICoga2V5LCB1OCAqIGhkciwKICAgICAgICAgICAgICAgICAgICAgICAgdTggKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICogbWljKQogewpAQCAtNjkyLDE5ICs1MzgsOSBAQAogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCi0gICAgICAgIHNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaGRyKTsKLSAgICAgICAgc2dbMF0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoaGRyKTsKLSAgICAgICAgc2dbMF0ubGVuZ3RoID0gMTY7Ci0KLSAgICAgICAgc2dbMV0ucGFnZSA9IHZpcnRfdG9fcGFnZShkYXRhKTsKLSAgICAgICAgc2dbMV0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YSk7Ci0gICAgICAgIHNnWzFdLmxlbmd0aCA9IGRhdGFfbGVuOwotI2Vsc2UKICAgICAgICAgc2dfaW5pdF90YWJsZShzZywgMik7CiAgICAgICAgIHNnX3NldF9idWYoJnNnWzBdLCBoZHIsIDE2KTsKICAgICAgICAgc2dfc2V0X2J1Zigmc2dbMV0sIGRhdGEsIGRhdGFfbGVuKTsKLSNlbmRpZgogCiAgICAgICAgIGlmIChjcnlwdG9faGFzaF9zZXRrZXkodGZtX21pY2hhZWwsIGtleSwgOCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzEzLDcgKzU0OSw2IEBACiAgICAgICAgIGRlc2MuZmxhZ3MgPSAwOwogICAgICAgICByZXR1cm4gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKIH0KLSNlbmRpZgogCiAKIApAQCAtNzcyLDEzICs2MDcsOCBAQAogCX0KIAkvLyB9CiAJcG9zID0gc2tiX3B1dChza2IsIDgpOwotI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIU9QRU5TVVNFX1NMRUQpKQogCWlmIChtaWNoYWVsX21pYyh0a2V5LT50eF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKIAkJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBwb3MpKQotI2Vsc2UKLQlpZiAobWljaGFlbF9taWModGtleS0+dHhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMTZdLCB0a2V5LT50eF9oZHIsCi0JCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKLSNlbmRpZgogCQlyZXR1cm4gLTE7CiAKIAlyZXR1cm4gMDsKQEAgLTg1MCwxMyArNjgwLDggQEAKIAl9CiAJLy8gfQogCi0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghT1BFTlNVU0VfU0xFRCkpCiAJaWYgKG1pY2hhZWxfbWljKHRrZXktPnJ4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAogCQkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIG1pYykpCi0jZWxzZQotCWlmIChtaWNoYWVsX21pYyh0a2V5LT5yeF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsyNF0sIHRrZXktPnJ4X2hkciwKLQkJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQotI2VuZGlmCiAgICAgICAgICAgICAJcmV0dXJuIC0xOwogCWlmIChtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApIHsKIAkJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKQEAgLTg4NiwzMiArNzExLDE4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCWludCBrZXlpZHg7Ci0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghT1BFTlNVU0VfU0xFRCkpCi0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IHRrZXktPnR4X3RmbV9taWNoYWVsOwotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0yID0gdGtleS0+dHhfdGZtX2FyYzQ7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbTMgPSB0a2V5LT5yeF90Zm1fbWljaGFlbDsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtNCA9IHRrZXktPnJ4X3RmbV9hcmM0OwotI2Vsc2UKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSA9IHRrZXktPnR4X3RmbV9taWNoYWVsOwogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0yID0gdGtleS0+dHhfdGZtX2FyYzQ7CiAJc3RydWN0IGNyeXB0b19oYXNoICp0Zm0zID0gdGtleS0+cnhfdGZtX21pY2hhZWw7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTQgPSB0a2V5LT5yeF90Zm1fYXJjNDsKLSNlbmRpZgogCiAJa2V5aWR4ID0gdGtleS0+a2V5X2lkeDsKIAltZW1zZXQodGtleSwgMCwgc2l6ZW9mKCp0a2V5KSk7CiAJdGtleS0+a2V5X2lkeCA9IGtleWlkeDsKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKIAl0a2V5LT50eF90Zm1fbWljaGFlbCA9IHRmbTsKIAl0a2V5LT50eF90Zm1fYXJjNCA9IHRmbTI7CiAJdGtleS0+cnhfdGZtX21pY2hhZWwgPSB0Zm0zOwogCXRrZXktPnJ4X3RmbV9hcmM0ID0gdGZtNDsKLSNlbHNlCi0JdGtleS0+dHhfdGZtX21pY2hhZWwgPSB0Zm07Ci0JdGtleS0+dHhfdGZtX2FyYzQgPSB0Zm0yOwotCXRrZXktPnJ4X3RmbV9taWNoYWVsID0gdGZtMzsKLQl0a2V5LT5yeF90Zm1fYXJjNCA9IHRmbTQ7Ci0jZW5kaWYKIAogCWlmIChsZW4gPT0gVEtJUF9LRVlfTEVOKSB7CiAJCW1lbWNweSh0a2V5LT5rZXksIGtleSwgVEtJUF9LRVlfTEVOKTsKQEAgLTEwMjEsMTEgKzgzMiw0IEBACiAvLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm47CiB9Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdGtpcF9udWxsKTsKLSNlbHNlCi1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfdGtpcF9udWxsKTsKLSNlbmRpZgogCi0vL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KTsKLS8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwppbmRleCBjNGJiYzhkLi41ZGM5NzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMjEsMzAgKzIxLDExIEBACiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNlbmRpZgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQotICAgICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLSNlbHNlCi0gICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jZW5kaWYKLS8vI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KLS8vCi0vKgotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNlbmRpZgogCi0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KLSovCiBNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFdFUCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNTgsMTIgKzM5LDggQEAKIAl1OCBrZXlbV0VQX0tFWV9MRU4gKyAxXTsKIAl1OCBrZXlfbGVuOwogCXU4IGtleV9pZHg7Ci0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghT1BFTlNVU0VfU0xFRCkpCi0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKLQkjZWxzZQogICAgICAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtOwogICAgICAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtOwotICAgICAgICAjZW5kaWYKIH07CiAKIApAQCAtNzYsMTQgKzUzLDYgQEAKIAkJZ290byBmYWlsOwogCXByaXYtPmtleV9pZHggPSBrZXlpZHg7CiAKLSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFPUEVOU1VTRV9TTEVEKSkKLQlwcml2LT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJhcmM0IiwgMCk7Ci0JaWYgKHByaXYtPnRmbSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JI2Vsc2UKIAlwcml2LT50eF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKICAgICAgICAgaWYgKElTX0VSUihwcml2LT50eF90Zm0pKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCkBAIC05OCw3ICs2Nyw2IEBACiAgICAgICAgICAgICAgICAgcHJpdi0+cnhfdGZtID0gTlVMTDsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCiAKIAkvKiBzdGFydCBXRVAgSVYgZnJvbSBhIHJhbmRvbSB2YWx1ZSAqLwogCWdldF9yYW5kb21fYnl0ZXMoJnByaXYtPml2LCA0KTsKQEAgLTEwNiwxMyArNzQsNiBAQAogCXJldHVybiBwcml2OwogCiBmYWlsOgotI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIU9QRU5TVVNFX1NMRUQpKQotCWlmIChwcml2KSB7Ci0JCWlmIChwcml2LT50Zm0pCi0JCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKLQkJa2ZyZWUocHJpdik7Ci0JfQotCSNlbHNlCiAJaWYgKHByaXYpIHsKICAgICAgICAgICAgICAgICBpZiAocHJpdi0+dHhfdGZtKQogICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbSk7CkBAIC0xMjAsNyArODEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnJ4X3RmbSk7CiAgICAgICAgICAgICAgICAga2ZyZWUocHJpdik7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEyOCwxNyArODgsMTIgQEAKIHN0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OwotI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIU9QRU5TVVNFX1NMRUQpKQotCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtKQotCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbSk7Ci0JI2Vsc2UKIAlpZiAoX3ByaXYpIHsKICAgICAgICAgICAgICAgICBpZiAoX3ByaXYtPnR4X3RmbSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+dHhfdGZtKTsKICAgICAgICAgICAgICAgICBpZiAoX3ByaXYtPnJ4X3RmbSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+cnhfdGZtKTsKICAgICAgICAgfQotICAgICAgICAjZW5kaWYKIAlrZnJlZShwcml2KTsKIH0KIApAQCAtMTU1LDkgKzExMCw3IEBACiAJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CiAJdTggKnBvczsKIAljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0JI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgfHwgKE9QRU5TVVNFX1NMRUQpKQogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnR4X3RmbX07Ci0JI2VuZGlmCiAJdTMyIGNyYzsKIAl1OCAqaWN2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTE5NiwzNSArMTQ5LDE2IEBACiAJewogCiAJCS8qIEFwcGVuZCBsaXR0bGUtZW5kaWFuIENSQzMyIGFuZCBlbmNyeXB0IGl0IHRvIHByb2R1Y2UgSUNWICovCi0JI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiAJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOwotCSNlbHNlCi0JCWNyYyA9IH5ldGhlcl9jcmNfbGUobGVuLCBwb3MpOwotCSNlbmRpZgogCQlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CiAJCWljdlswXSA9IGNyYzsKIAkJaWN2WzFdID0gY3JjID4+IDg7CiAJCWljdlsyXSA9IGNyYyA+PiAxNjsKIAkJaWN2WzNdID0gY3JjID4+IDI0OwogCi0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghT1BFTlNVU0VfU0xFRCkpCi0JCWNyeXB0b19jaXBoZXJfc2V0a2V5KHdlcC0+dGZtLCBrZXksIGtsZW4pOwotCQlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7Ci0JCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7Ci0JCXNnLmxlbmd0aCA9IGxlbiArIDQ7Ci0JCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh3ZXAtPnRmbSwgJnNnLCAmc2csIGxlbiArIDQpOwotCQlyZXR1cm4gMDsKLQkjZWxzZQogCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnR4X3RmbSwga2V5LCBrbGVuKTsKLQkjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKLQkJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOwotCQlzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOwotCQlzZy5sZW5ndGggPSBsZW4gKyA0OwotCSNlbHNlCiAJCXNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7Ci0JI2VuZGlmCiAJCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKLQkjZW5kaWYKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI0NSw5ICsxNzksNyBAQAogCXU4IGtleVtXRVBfS0VZX0xFTiArIDNdOwogCXU4IGtleWlkeCwgKnBvczsKIAljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0JI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgfHwgKE9QRU5TVVNFX1NMRUQpKQogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnJ4X3RmbX07Ci0JI2VuZGlmCiAJdTMyIGNyYzsKIAl1OCBpY3ZbNF07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtMjcyLDI5ICsyMDQsMTEgQEAKIAogCWlmICghdGNiX2Rlc2MtPmJId1NlYykKIAl7Ci0jaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghT1BFTlNVU0VfU0xFRCkpCi0JCWNyeXB0b19jaXBoZXJfc2V0a2V5KHdlcC0+dGZtLCBrZXksIGtsZW4pOwotCQlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7Ci0JCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7Ci0JCXNnLmxlbmd0aCA9IHBsZW4gKyA0OwotCQljcnlwdG9fY2lwaGVyX2RlY3J5cHQod2VwLT50Zm0sICZzZywgJnNnLCBwbGVuICsgNCk7Ci0JI2Vsc2UKIAkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkod2VwLT5yeF90Zm0sIGtleSwga2xlbik7Ci0JI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCi0JCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKLQkJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKLQkJc2cubGVuZ3RoID0gcGxlbiArIDQ7Ci0JI2Vsc2UKIAkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7Ci0JI2VuZGlmCiAJCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpCiAJCQlyZXR1cm4gLTc7Ci0JI2VuZGlmCi0JI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiAJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKLQkjZWxzZQotCQljcmMgPSB+ZXRoZXJfY3JjX2xlKHBsZW4sIHBvcyk7Ci0JI2VuZGlmCiAJCWljdlswXSA9IGNyYzsKIAkJaWN2WzFdID0gY3JjID4+IDg7CiAJCWljdlsyXSA9IGNyYyA+PiAxNjsKQEAgLTM3OSwxNCArMjkzLDYgQEAKIAogdm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCkKIHsKLS8vCXByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybjsKIH0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93ZXBfbnVsbCk7Ci0jZWxzZQotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3dlcF9udWxsKTsKLSNlbmRpZgogCi0vL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQpOwotLy9tb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggNjE0YThiNi4uN2VkZjVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTMxLDcgKzMxLDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KQEAgLTExMCwxNCArMTA5LDcgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiAJaWVlZSA9IG5ldGRldl9wcml2KGRldik7Ci0jZWxzZQotCWllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkZXYtPnByaXY7Ci0jZW5kaWYKLSNpZiAwCi0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpZWVlODAyMTFfcnRsX3htaXQ7Ci0jZW5kaWYKIAogCW1lbXNldChpZWVlLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UpK3NpemVvZl9wcml2KTsKIAlpZWVlLT5kZXYgPSBkZXY7CkBAIC0xNjYsMTIgKzE1OCw3IEBACiAKIAlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOwogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCiAJaWVlZS0+cEhUSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKFJUX0hJR0hfVEhST1VHSFBVVCksIEdGUF9LRVJORUwpOwotI2Vsc2UKLQlpZWVlLT5wSFRJbmZvID0gKFJUX0hJR0hfVEhST1VHSFBVVCopa21hbGxvYyhzaXplb2YoUlRfSElHSF9USFJPVUdIUFVUKSwgR0ZQX0tFUk5FTCk7Ci0JbWVtc2V0KGllZWUtPnBIVEluZm8sMCxzaXplb2YoUlRfSElHSF9USFJPVUdIUFVUKSk7Ci0jZW5kaWYKIAlpZiAoaWVlZS0+cEhUSW5mbyA9PSBOVUxMKQogCXsKIAkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIEhUSW5mb1xuIik7CkBAIC0xODAsMTMgKzE2Nyw2IEBACiAJSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhpZWVlKTsKIAlIVEluaXRpYWxpemVIVEluZm8oaWVlZSk7IC8vbWF5IG1vdmUgdG8gb3RoZXIgcGxhY2UuCiAJVFNJbml0aWFsaXplKGllZWUpOwotI2lmIDAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCi0gCUlOSVRfV09SSygmaWVlZS0+aHRfb25Bc3NSc3AsICh2b2lkKCopKHZvaWQqKSkgSFRPbkFzc29jUnNwX3dxKTsKLSNlbHNlCi0JSU5JVF9XT1JLKCZpZWVlLT5odF9vbkFzc1JzcCwgKHZvaWQoKikodm9pZCopKSBIVE9uQXNzb2NSc3Bfd3EsIGllZWUpOwotI2VuZGlmCi0jZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKIAkJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pOwogCkBAIC0yMDUsMzIgKzE4NSwyMCBAQAogCiAgZmFpbGVkOgogCWlmIChkZXYpCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiAJCWZyZWVfbmV0ZGV2KGRldik7Ci0jZWxzZQotCQlrZnJlZShkZXYpOwotI2VuZGlmCiAJcmV0dXJuIE5VTEw7CiB9CiAKIAogdm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSNlbHNlCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkZXYtPnByaXY7Ci0jZW5kaWYKIAlpbnQgaTsKLQkvL3N0cnVjdCBsaXN0X2hlYWQgKnAsICpxOwotLy8JZGVsX3RpbWVyX3N5bmMoJmllZWUtPlN3QndUaW1lcik7Ci0jaWYgMQogCWlmIChpZWVlLT5wSFRJbmZvICE9IE5VTEwpCiAJewogCQlrZnJlZShpZWVlLT5wSFRJbmZvKTsKIAkJaWVlZS0+cEhUSW5mbyA9IE5VTEw7CiAJfQotI2VuZGlmCiAJUmVtb3ZlQWxsVFMoaWVlZSk7CiAJaWVlZTgwMjExX3NvZnRtYWNfZnJlZShpZWVlKTsKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKQEAgLTI0NywyMCArMjE1LDcgQEAKIAl9CiAKIAlpZWVlODAyMTFfbmV0d29ya3NfZnJlZShpZWVlKTsKLSNpZiAwCi0JZm9yIChpID0gMDsgaSA8IElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHEsICZpZWVlLT5pYnNzX21hY19oYXNoW2ldKSB7Ci0JCQlrZnJlZShsaXN0X2VudHJ5KHAsIHN0cnVjdCBpZWVlX2lic3Nfc2VxLCBsaXN0KSk7Ci0JCQlsaXN0X2RlbChwKTsKLQkJfQotCX0KLQotI2VuZGlmCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiAJZnJlZV9uZXRkZXYoZGV2KTsKLSNlbHNlCi0Ja2ZyZWUoZGV2KTsKLSNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwpAQCAtMzU4LDExICszMTMsNyBAQAogCX0KIAogCWllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IGRlYnVnOwotI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCi0JaWVlZTgwMjExX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgcHJvY19uZXQpOwotI2Vsc2UKIAlpZWVlODAyMTFfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBTX0lGRElSLCBpbml0X25ldC5wcm9jX25ldCk7Ci0jZW5kaWYKIAlpZiAoaWVlZTgwMjExX3Byb2MgPT0gTlVMTCkgewogCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgIiBEUlZfTkFNRQogCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOwpAQCAtMzcxLDExICszMjIsNyBAQAogCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkgICAgICBpZWVlODAyMTFfcHJvYyk7CiAJaWYgKCFlKSB7Ci0jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKLQkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIHByb2NfbmV0KTsKLSNlbHNlCiAJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7Ci0jZW5kaWYKIAkJaWVlZTgwMjExX3Byb2MgPSBOVUxMOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zOTAsMTEgKzMzNyw3IEBACiB7CiAJaWYgKGllZWU4MDIxMV9wcm9jKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJkZWJ1Z19sZXZlbCIsIGllZWU4MDIxMV9wcm9jKTsKLSNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQotCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOwotI2Vsc2UKIAkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKLSNlbmRpZgogCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CiAJfQogCWllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQoKTsKQEAgLTQwMywyMSArMzQ2LDEwIEBACiAJaWVlZTgwMjExX2NyeXB0b19kZWluaXQoKTsKIH0KIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwogCiAKLS8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX3J0bF9leGl0KTsKLS8vbW9kdWxlX2luaXQoaWVlZTgwMjExX3J0bF9pbml0KTsKLSNlbmRpZgogI2VuZGlmCiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotLy9FWFBPUlRfU1lNQk9MKGFsbG9jX2llZWU4MDIxMSk7Ci0vL0VYUE9SVF9TWU1CT0woZnJlZV9pZWVlODAyMTEpOwotI2Vsc2UKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGFsbG9jX2llZWU4MDIxMSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhmcmVlX2llZWU4MDIxMSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IGRhMTAwNjcuLmFhZjliOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtNTUsMTEgKzU1LDcgQEAKIAl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CiAKIAlza2ItPmRldiA9IGllZWUtPmRldjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQogICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotI2Vsc2UKLSAgICAgICAgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwotI2VuZGlmCiAKIAlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CkBAIC0yNzkzLDggKzI3ODksNiBAQAogI2VuZGlmCiAJCW1lbWNweSh0YXJnZXQsICZuZXR3b3JrLCBzaXplb2YoKnRhcmdldCkpOwogCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmxpc3QsICZpZWVlLT5uZXR3b3JrX2xpc3QpOwotCQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkKLQkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwmbmV0d29yayk7CiAJfSBlbHNlIHsKIAkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlVwZGF0aW5nICclcycgKCVwTSkgdmlhICVzLlxuIiwKIAkJCQkgICAgIGVzY2FwZV9lc3NpZCh0YXJnZXQtPnNzaWQsCkBAIC0yODIxLDggKzI4MTUsNiBAQAogCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKIAogCQl1cGRhdGVfbmV0d29yayh0YXJnZXQsICZuZXR3b3JrKTsKLQkJaWYocmVuZXcgJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSkKLQkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwmbmV0d29yayk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwpAQCAtMjg4MCwxMSArMjg3MiwzIEBACiAKIAl9CiB9Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeF9tZ3QpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeCk7Ci0jZWxzZQotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3J4X21ndCk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfcngpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggNDZiNmU4Yy4uYjdlYzFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtNTEwLDM0ICs1MTAsMTEgQEAKIH0KIH0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotLyogY2FsbGVkIGJvdGggYnkgd3Egd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLSNpZiAwCi0Jc2hvcnQgd2F0Y2hkb2cgPSAwOwotCWRvewotCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9Ci0JCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKLQkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCi0JCQkJcmV0dXJuOyAvKiBubyBnb29kIGNoYW5zICovCiAKLQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7Ci0jZW5kaWYKLQotCXNjaGVkdWxlX3Rhc2soJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7Ci19Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7Ci0jZWxzZQotdm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotI2VuZGlmCiAJc3RhdGljIHNob3J0IHdhdGNoZG9nID0gMDsKIAl1OCBsYXN0X2NoYW5uZWwgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKICNpZmRlZiBFTkFCTEVfRE9UMTFECkBAIC01NzUsMTMgKzU1Miw3IEBACiAJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CiAKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKLSNlbHNlCi0JLy9pZWVlLT5zY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKLQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSkKLQkJbW9kX3RpbWVyKCZpZWVlLT5zY2FuX3RpbWVyLChqaWZmaWVzICsgTVNFQ1MoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKSkpOwotI2VuZGlmCiAKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogCXJldHVybjsKQEAgLTU5NywxOSArNTY4LDYgQEAKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogfQogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fY2IodW5zaWduZWQgbG9uZyBfZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilfZGV2OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQlpZWVlODAyMTFfc29mdG1hY19zY2FuKGllZWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLX0KLSNlbmRpZgotCi0KIHZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY2NSwxMSArNjIzLDcgQEAKIAlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSl7CiAJCWllZWUtPnNjYW5uaW5nID0gMDsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOwotI2Vsc2UKLQkJZGVsX3RpbWVyX3N5bmMoJmllZWUtPnNjYW5fdGltZXIpOwotI2VuZGlmCiAJfQogCiAvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CkBAIC03MDQsMTYgKzY1OCw3IEBACiAJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7CiAJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKXsKIAkJCWllZWUtPnNjYW5uaW5nID0gMTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQogCQkJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCAwKTsKLSNlbHNlCi0KLQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOwotI2VuZGlmCi0jZWxzZQotCQkJaWVlZTgwMjExX3NvZnRtYWNfc2NhbihpZWVlKTsKLSNlbmRpZgogCQl9CiAJfWVsc2UKIAkJaWVlZS0+c3RhcnRfc2NhbihpZWVlLT5kZXYpOwpAQCAtMTQyOCwxMyArMTM3Myw4IEBACiAKIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSk7Ci0jZWxzZQotCXNjaGVkdWxlX3Rhc2soJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7Ci0jZW5kaWYKLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTUyNywxNCArMTQ2Nyw5IEBACiAJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJfQogfQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfY29tcGxldGVfd3EpOwotI2Vsc2UKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLSNlbmRpZgogCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKIAlpZWVlLT5pc19yb2FtaW5nID0gZmFsc2U7CiAJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCkBAIC0xNjA2LDIxICsxNTQxLDEyIEBACiAJfQogI2VuZGlmCiAJLy9pZWVlLT5VcGRhdGVIYWxSQVRSVGFibGVIYW5kbGVyKGRldiwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Ci0jZWxzZQotCXNjaGVkdWxlX3Rhc2soJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Ci0jZW5kaWYKIH0KIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0jZWxzZQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLSNlbmRpZgogCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKICNpZmRlZiBFTkFCTEVfSVBTCiAJaWYoaWVlZS0+aWVlZTgwMjExX2lwc19sZWF2ZSAhPSBOVUxMKQpAQCAtMTczNCwxMSArMTY2MCw3IEBACiAJCQkJCX0KIAogCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAkJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotI2Vsc2UKLQkJCQkJc2NoZWR1bGVfdGFzaygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0jZW5kaWYKIAkJCQl9ZWxzZXsKIAkJCQkJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCiAJCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKQEAgLTIzMzIsMTEgKzIyNTQsNyBAQAogCQkJCQkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCiAJCQkJCQllcnJjb2RlKTsKIAkJCQkJaWYoaWVlZS0+QXNvY1JldHJ5Q291bnQgPCBSVF9BU09DX1JFVFJZX0xJTUlUKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0jZWxzZQotCQkJCQkJc2NoZWR1bGVfdGFzaygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0jZW5kaWYKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CiAJCQkJCX0KQEAgLTI0NDYsMTEgKzIzNjQsNyBAQAogCQkJLy8Jbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOwogCQkJCS8vSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CiAJCQkJUmVtb3ZlUGVlclRTKGllZWUsIGhlYWRlci0+YWRkcjIpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKLSNlbHNlCi0JCQkJc2NoZWR1bGVfdGFzaygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0jZW5kaWYKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUOgpAQCAtMjY4NywxNiArMjYwMSwxMSBAQAogCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CiAJfQogfQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCiAgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHN0YXJ0X2lic3Nfd3EpOwotI2Vsc2UKLXZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0jZW5kaWYKIAkvKiBpd2NvbmZpZyBtb2RlIGFkLWhvYyB3aWxsIHNjaGVkdWxlIHRoaXMgYW5kIHJldHVybgogCSAqIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgd2lsbCBibG9jayBmdXJ0aGVyIGl3Y29uZmlnIFNFVAogCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfc2VtIGhvbGQuCkBAIC0yODA3LDExICsyNzE2LDcgQEAKIAogaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgMTUwKTsKLSNlbHNlCi0Jc2NoZWR1bGVfdGFzaygmaWVlZS0+c3RhcnRfaWJzc193cSk7Ci0jZW5kaWYKIH0KIAogLyogdGhpcyBpcyBjYWxsZWQgb25seSBpbiB1c2VyIGNvbnRleHQsIHdpdGggd3hfc2VtIGhlbGQgKi8KQEAgLTI4NzMsMjIgKzI3NzgsMjIgQEAKIAlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQlEb3QxMWRfUmVzZXQoaWVlZSk7CiAjZW5kaWYKLQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CiAJaWVlZS0+aXNfc2V0X2tleSA9IGZhbHNlOwogCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CiAJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKLQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgfHwKKwkgICAgaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HKSB7CisJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCX0KKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKIAogfQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7Ci0jZWxzZQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotI2VuZGlmCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRvd24oJmllZWUtPnd4X3NlbSk7CkBAIC0yOTkwLDEwICsyODk1LDggQEAKIAogCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EpOwotI2VuZGlmCiAJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKIAogCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CkBAIC0zMTE0LDExICszMDE3LDYgQEAKIAlpZWVlLT5zdGFfZWRjYV9wYXJhbVszXSA9IDB4MDAyRjMyNjI7CiAJaWVlZS0+YWdncmVnYXRpb24gPSB0cnVlOwogCWllZWUtPmVuYWJsZV9yeF9pbW1fQkEgPSAxOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWluaXRfdGltZXIoJmllZWUtPnNjYW5fdGltZXIpOwotCWllZWUtPnNjYW5fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7Ci0JaWVlZS0+c2Nhbl90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fY2I7Ci0jZW5kaWYKIAlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CiAKIAlpbml0X3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwpAQCAtMzEyOSwxNiArMzAyNywxMiBAQAogCWllZWUtPmJlYWNvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGllZWU7CiAJaWVlZS0+YmVhY29uX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAjaWZkZWYgUEZfU1lOQ1RIUkVBRAogCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSwwKTsKICNlbHNlCiAJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKICNlbmRpZgotI2VuZGlmCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQogICAgICAgICBJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSxpZWVlODAyMTFfc3RhcnRfaWJzc193cSk7CiAgICAgICAgIElOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKICAgICAgICAgSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CkBAIC0zMTQ2LDIzICszMDQwLDYgQEAKICAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSk7CiAgICAgICAgIElOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EpOwogCi0jZWxzZQotCUlOSVRfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSwodm9pZCgqKSh2b2lkKikpIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxLGllZWUpOwotCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCh2b2lkKCopKHZvaWQqKSkgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSxpZWVlKTsKLQlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwodm9pZCgqKSh2b2lkKikpIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EsaWVlZSk7Ci0JSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCh2b2lkKCopKHZvaWQqKSkgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EsaWVlZSk7Ci0JSU5JVF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsKHZvaWQoKikodm9pZCopKSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxLGllZWUpOwotCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLCh2b2lkKCopKHZvaWQqKSkgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSxpZWVlKTsKLSNlbmRpZgotCi0jZWxzZQotCXRxX2luaXQoJmllZWUtPnN0YXJ0X2lic3Nfd3EsKHZvaWQoKikodm9pZCopKSBpZWVlODAyMTFfc3RhcnRfaWJzc193cSxpZWVlKTsKLQl0cV9pbml0KCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsKHZvaWQoKikodm9pZCopKSBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxLGllZWUpOwotCXRxX2luaXQoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwodm9pZCgqKSh2b2lkKikpIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EsaWVlZSk7Ci0JdHFfaW5pdCgmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwodm9pZCgqKSh2b2lkKikpIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLGllZWUpOwotCXRxX2luaXQoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwodm9pZCgqKSh2b2lkKikpIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EsaWVlZSk7Ci0JdHFfaW5pdCgmaWVlZS0+d3hfc3luY19zY2FuX3dxLCh2b2lkKCopKHZvaWQqKSkgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSxpZWVlKTsKLSNlbmRpZgogCXNlbWFfaW5pdCgmaWVlZS0+d3hfc2VtLCAxKTsKIAlzZW1hX2luaXQoJmllZWUtPnNjYW5fc2VtLCAxKTsKICNpZmRlZiBFTkFCTEVfSVBTCkBAIC0zMTg5LDEwICszMDY2LDggQEAKICNlbmRpZgogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShpZWVlLT53cSk7Ci0jZW5kaWYKIAogCXVwKCZpZWVlLT53eF9zZW0pOwogfQpAQCAtMzY0Nyw0OSArMzUyMiwzIEBACiAJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQoaWVlZS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIH0KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2dldF9iZWFjb24pOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZSk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVzZXRfcXVldWUpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfc2hvcnRzbG90KTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfNTRnKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9wc190eF9hY2spOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3htaXQpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyk7Ci0vL0VYUE9SVF9TWU1CT0wobm90aWZ5X3d4X2Fzc29jX2V2ZW50KTsKLS8vRVhQT1JUX1NZTUJPTChTZW5kRGlzYXNzb2NpYXRpb24pOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9kaXNhc3NvY2lhdGUpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3NjYW4pOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKTsKLSNlbHNlCi1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfZ2V0X2JlYWNvbik7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfcnRsX3dha2VfcXVldWUpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9yZXNldF9xdWV1ZSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9pc19zaG9ydHNsb3QpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX2lzXzU0Zyk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3BzX3R4X2Fjayk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc29mdG1hY194bWl0KTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhub3RpZnlfd3hfYXNzb2NfZXZlbnQpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoU2VuZERpc2Fzc29jaWF0aW9uKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9kaXNhc3NvY2lhdGUpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc3RvcF9zY2FuKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc3RhX3BzX3NlbmRfcHNwb2xsX2ZyYW1lKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCmluZGV4IDFiYmQ0OWYuLmQwYTEwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTMxMiwxNCArMzEyLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd3hfc3luY19zY2FuX3dxKTsKLSNlbHNlCi12b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0jZW5kaWYKIAlzaG9ydCBjaGFuOwogCUhUX0VYVENITkxfT0ZGU0VUIGNoYW5fb2Zmc2V0PTA7CiAJSFRfQ0hBTk5FTF9XSURUSCBiYW5kd2lkdGg9MDsKQEAgLTMzNyw4ICszMzIsNiBAQAogCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDEpOwogI2VuZGlmCiAKLQluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOwotCiAJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQogCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOwogCkBAIC0zODksNyArMzgyLDYgQEAKIAlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKIAkJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKIAotCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKIAljb3VudCA9IDA7CiAJdXAoJmllZWUtPnd4X3NlbSk7CiAKQEAgLTQwOCwxMSArNDAwLDcgQEAKIAl9CiAKIAlpZiAoIGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d3hfc3luY19zY2FuX3dxKTsKLSNlbHNlCi0JCXNjaGVkdWxlX3Rhc2soJmllZWUtPnd4X3N5bmNfc2Nhbl93cSk7Ci0jZW5kaWYKIAkJLyogaW50ZW50aW9uYWxseSBmb3JnZXQgdG8gdXAgc2VtICovCiAJCXJldHVybiAwOwogCX0KQEAgLTQ1OSwyOSArNDQ3LDggQEAKIAlpZiAod3JxdS0+ZXNzaWQuZmxhZ3MgJiYgd3JxdS0+ZXNzaWQubGVuZ3RoKSB7CiAJCS8vZmlyc3QgZmx1c2ggY3VycmVudCBuZXR3b3JrLnNzaWQKIAkJbGVuID0gKCh3cnF1LT5lc3NpZC5sZW5ndGgtMSkgPCBJV19FU1NJRF9NQVhfU0laRSkgPyAod3JxdS0+ZXNzaWQubGVuZ3RoLTEpIDogSVdfRVNTSURfTUFYX1NJWkU7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgIEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKLQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbik7Ci0JCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IGxlbjsKLSNpZiAwCi0JCXsKLQkJCWludCBpOwotCQkJZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCQkJcHJpbnRrKCIlYyAiLCBleHRyYVtpXSk7Ci0JCQlwcmludGsoIlxuIik7Ci0JCX0KLSNlbmRpZgotI2Vsc2UKIAkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbisxKTsKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gbGVuKzE7Ci0jaWYgMAotCQl7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaT0wOyBpPGxlbiArIDE7IGkrKykKLQkJCQlwcmludGsoIiVjICIsIGV4dHJhW2ldKTsKLQkJCXByaW50aygiXG4iKTsKLQkJfQotI2VuZGlmCi0jZW5kaWYKIAkJaWVlZS0+c3NpZF9zZXQgPSAxOwogCX0KIAllbHNlewpAQCAtNjU5LDQyICs2MjYsNCBAQAogCXJldHVybiByZXQ7CiAKIH0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZXNzaWQpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZXNzaWQpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF0ZSk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9yYXRlKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3dhcCk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF93YXApOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfbW9kZSk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9tb2RlKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3NjYW4pOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZnJlcSk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9mcmVxKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X25hbWUpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcG93ZXIpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcG93ZXIpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3J0cyk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9ydHMpOwotI2Vsc2UKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9nZXRfZXNzaWQpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9lc3NpZCk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3hfc2V0X3JhdGUpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X2dldF9yYXRlKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9zZXRfd2FwKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9nZXRfd2FwKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9zZXRfbW9kZSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3hfZ2V0X21vZGUpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9zY2FuKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9nZXRfZnJlcSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3hfc2V0X2ZyZXEpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9yYXd0eCk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3hfZ2V0X25hbWUpOwotRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9wb3dlcik7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9zZXRfcnRzKTsKLUVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9nZXRfcnRzKTsKLSNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwppbmRleCBhNzVmMzY2Li5kZDhhMjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTI4NiwxMiArMjg2LDcgQEAKIAlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKIAkJcmV0dXJuIDA7CiAKLS8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikpCiAJaXAgPSBpcF9oZHIoc2tiKTsKLSNlbHNlCi0JaXAgPSAoc3RydWN0IGlwaGRyKikoc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBldGhlcl9oZWFkZXIpKTsKLSNlbmRpZgogCXN3aXRjaCAoaXAtPnRvcyAmIDB4ZmMpIHsKIAkJY2FzZSAweDIwOgogCQkJcmV0dXJuIDI7CkBAIC02MTMsMTEgKzYwOCw3IEBACiAKIGludCBpZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7Ci0jZWxzZQotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopZGV2LT5wcml2OwotI2VuZGlmCiAJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmZyYWdfaGRyOwogCWludCBpLCBieXRlc19wZXJfZnJhZywgbnJfZnJhZ3MsIGJ5dGVzX2xhc3RfZnJhZywgZnJhZ19zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKaW5kZXggNDk3MWIxYy4uYjc0NDkxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC01NCwyNSArNTQsNyBAQAogCXsiTi01RyIsNH0sCiB9OwogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi1zdGF0aWMgaW5saW5lIGNoYXIgKgotaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGNoYXIgKiAgICAgc3RyZWFtLCAgICAgICAgIC8qIFN0cmVhbSBvZiBldmVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiAgICAgZW5kcywgICAgICAgICAgIC8qIEVuZCBvZiBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19ldmVudCAqaXdlLCAgICAgIC8qIFBheWxvYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgZXZlbnRfbGVuKSAgICAgIC8qIFJlYWwgc2l6ZSBvZiBwYXlsb2FkICovCi17Ci0gICAgICAgIC8qIENoZWNrIGlmIGl0J3MgcG9zc2libGUgKi8KLSAgICAgICAgaWYoKHN0cmVhbSArIGV2ZW50X2xlbikgPCBlbmRzKSB7Ci0gICAgICAgICAgICAgICAgaXdlLT5sZW4gPSBldmVudF9sZW47Ci0JCW5kZWxheSgxKTsgICAvL25ldwotICAgICAgICAgICAgICAgIG1lbWNweShzdHJlYW0sIChjaGFyICopIGl3ZSwgZXZlbnRfbGVuKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gKz0gZXZlbnRfbGVuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJlYW07Ci19Ci0jZWxzZQogI2RlZmluZSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2wgaXdlX3N0cmVhbV9hZGRfZXZlbnQKLSNlbmRpZgogCiAjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0CiBzdGF0aWMgaW5saW5lIGNoYXIgKnJ0bDgxOXhfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCkBAIC05MywxMSArNzUsNyBAQAogCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CiAJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQogCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0jZWxzZQotCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0jZW5kaWYKIAkvKiBSZW1haW5pbmcgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgcHJvdmlkZSB0aGVtICovCiAKIAkvKiBBZGQgdGhlIEVTU0lEICovCkBAIC0xMDYsMjIgKzg0LDE0IEBACiAvLwlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7CiAJaWYgKG5ldHdvcmstPnNzaWRfbGVuID09IDApIHsKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBzaXplb2YoIjxoaWRkZW4+Iik7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7Ci0jZW5kaWYKICAgICAgICAgfSBlbHNlIHsKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4obmV0d29yay0+c3NpZF9sZW4sICh1OCkzMik7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7Ci0jZW5kaWYKICAgICAgICAgfQogCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKLQlmb3IoaT0wOyBpPChzaXplb2YoaWVlZTgwMjExX21vZGVzKS9zaXplb2YoaWVlZTgwMjExX21vZGVzWzBdKSk7IGkrKykgeworCWZvcihpPTA7IGk8QVJSQVlfU0laRShpZWVlODAyMTFfbW9kZXMpOyBpKyspIHsKIAkJaWYobmV0d29yay0+bW9kZSYoMTw8aSkpIHsKIAkJCXNwcmludGYocG5hbWUsaWVlZTgwMjExX21vZGVzW2ldLm1vZGVfc3RyaW5nLGllZWU4MDIxMV9tb2Rlc1tpXS5tb2RlX3NpemUpOwogCQkJcG5hbWUgKz1pZWVlODAyMTFfbW9kZXNbaV0ubW9kZV9zaXplOwpAQCAtMTI5LDExICs5OSw3IEBACiAJfQogCSpwbmFtZSA9ICdcMCc7CiAJc25wcmludGYoaXdlLnUubmFtZSwgSUZOQU1TSVosICJJRUVFODAyLjExJXMiLCBwcm90b19uYW1lKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQogICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQ0hBUl9MRU4pOwotI2Vsc2UKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKLSNlbmRpZgogICAgICAgICAvKiBBZGQgbW9kZSAqLwogICAgICAgICBpd2UuY21kID0gU0lPQ0dJV01PREU7CiAgICAgICAgIGlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYKQEAgLTE0MiwxMSArMTA4LDcgQEAKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKIAkJZWxzZQogCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOwotI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICAvKiBBZGQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KQEAgLTE1NiwxMSArMTE4LDcgQEAKIAlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOwogCWl3ZS51LmZyZXEuZSA9IDA7CiAJaXdlLnUuZnJlcS5pID0gMDsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQogICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOwotI2Vsc2UKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKLSNlbmRpZgogCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKIAlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQpAQCAtMTY4LDExICsxMjYsNyBAQAogCWVsc2UKIAkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKIAlpd2UudS5kYXRhLmxlbmd0aCA9IDA7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7Ci0jZWxzZQotICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKLSNlbmRpZgogCS8qIEFkZCBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMgKi8KIAltYXhfcmF0ZSA9IDA7CiAJcCA9IGN1c3RvbTsKQEAgLTIxNiwzMyArMTcwLDE1IEBACiAJCWlmIChyYXRlID4gbWF4X3JhdGUpCiAJCQltYXhfcmF0ZSA9IHJhdGU7CiAJfQotI2lmIDAKLQlwcmludGsoIm1heCByYXRlOiVkID09PWJhc2ljIHJhdGU6XG4iLCBtYXhfcmF0ZSk7Ci0JZm9yIChpPTA7aTxuZXR3b3JrLT5yYXRlc19sZW47aSsrKQotCQlwcmludGsoIiAleCIsIG5ldHdvcmstPnJhdGVzW2ldKTsKLQlwcmludGsoIlxuPT09PT09PWV4dGVuZCByYXRlXG4iKTsKLQlmb3IgKGk9MDsgaTxuZXR3b3JrLT5yYXRlc19leF9sZW47IGkrKykKLQkJcHJpbnRrKCIgJXgiLCBuZXR3b3JrLT5yYXRlc19leFtpXSk7Ci0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCiAJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOwogCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKIAlpd2UudS5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCiAJCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOwotI2Vsc2UKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woc3RhcnQsIHN0b3AsICZpd2UsCi0JCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOwotI2VuZGlmCiAJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOwogCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQogICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOwotI2Vsc2UKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKLSNlbmRpZgogCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KIAkvKiBUT0RPOiBGaXggdGhlc2UgdmFsdWVzLi4uICovCiAJaXdlLmNtZCA9IElXRVZRVUFMOwpAQCAtMjU3LDIxICsxOTMsMTMgQEAKIAlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1NJR05BTCkpCiAJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfSU5WQUxJRDsKIAlpd2UudS5xdWFsLnVwZGF0ZWQgPSA3OwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCiAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7Ci0jZWxzZQotICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwotI2VuZGlmCiAJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJcCA9IGN1c3RvbTsKIAogCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKIAlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7Ci0jZWxzZQotICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKLSNlbmRpZgogI2lmIChXSVJFTEVTU19FWFQgPCAxOCkKIAlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7CiAJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKQEAgLTI4NSwxMSArMjEzLDcgQEAKIAkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOwotI2VuZGlmCiAgICAgICAgIH0KIAogCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT5yc25faWVfbGVuKXsKQEAgLTMwNCwxMSArMjI4LDcgQEAKIAkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKICAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOwotI2VuZGlmCiAgICAgICAgIH0KICNlbHNlCiAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKQEAgLTMxOCwxMSArMjM4LDcgQEAKIAkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+d3BhX2llLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKIAkJaXdlLmNtZCA9IElXRVZHRU5JRTsKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT53cGFfaWVfbGVuOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCiAgICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSNlbmRpZgogICAgICAgICB9CiAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAlpZiAobmV0d29yay0+cnNuX2llX2xlbikKQEAgLTMzMSwxMSArMjQ3LDcgQEAKIAkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+cnNuX2llLCBuZXR3b3JrLT5yc25faWVfbGVuKTsKIAkJaXdlLmNtZCA9IElXRVZHRU5JRTsKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT5yc25faWVfbGVuOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCiAgICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSNlbmRpZgogICAgICAgICB9CiAjZW5kaWYKIApAQCAtMzQ4LDExICsyNjAsNyBAQAogCQkgICAgICAiIExhc3QgYmVhY29uOiAlbHVtcyBhZ28iLCAoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKIAlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CiAJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCiAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOwotI2Vsc2UKLSAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7Ci0jZW5kaWYKIAogCXJldHVybiBzdGFydDsKIH0KQEAgLTYzMiw3ICs1NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCWludCByZXQgPSAwOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CiAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CiAgICAgICAgIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKQEAgLTgwNyw3ICs3MTQsNiBAQAogICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtODcwLDcgKzc3Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKSBleHRyYTsKIAlzd2l0Y2ggKG1sbWUtPmNtZCkgewogICAgICAgICBjYXNlIElXX01MTUVfREVBVVRIOgpAQCAtODgwLDcgKzc4NSw2IEBACiAJIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwogICAgICAgICB9Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtODg4LDcgKzc5Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQogewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CiAgICAgICAgIGNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKIAkgICAgIC8qbmVlZCB0byBzdXBwb3J0IHdwYTIgaGVyZSovCkBAIC05NDYsMjMgKzg0OSwxMiBAQAogCWRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KLSNlbmRpZgogCXJldHVybiAwOwogfQogI2VuZGlmCiAjaWYgMQogaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pCiB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaWYgMAotCXByaW50aygiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCXsKLQkJaW50IGk7Ci0JCWZvciAoaT0wOyBpPGxlbjsgaSsrKQotCQlwcmludGsoIiUyeCAiLCBpZVtpXSYweGZmKTsKLQkJcHJpbnRrKCJcbiIpOwotCX0KLSNlbmRpZgogCXU4ICpidWY7CiAKIAlpZiAobGVuPk1BWF9XUEFfSUVfTEVOIHx8IChsZW4gJiYgaWUgPT0gTlVMTCkpCkBAIC05OTIsMjkgKzg4NCw3IEBACiAJCWllZWUtPndwYV9pZSA9IE5VTEw7CiAJCWllZWUtPndwYV9pZV9sZW4gPSAwOwogCX0KLSNlbmRpZgogCXJldHVybiAwOwogCiB9CiAjZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9nZW5faWUpOwotI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCi0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9tbG1lKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2F1dGgpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dCk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0KTsKLSNlbmRpZgotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfc2Nhbik7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGUpOwotLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKTsKLSNlbHNlCi0vL0VYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKTsKLS8vRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9tbG1lKTsKLS8vRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9hdXRoKTsKLS8vRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KTsKLS8vRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X2dldF9zY2FuKTsKLS8vRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3d4X3NldF9lbmNvZGUpOwotLy9FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwppbmRleCA0YzRiMWRmLi5iMGM5Yzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCkBAIC0xMDI0LDE3ICsxMDI0LDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQJT2Zmc2V0KTsKLSNpZiAwCi0vL0kgbmVlZCBtb3ZlIHRoaXMgZnVuY3Rpb24gdG8gb3RoZXIgcGxhY2VzLCBzdWNoIGFzIHJ4PwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKLXZvaWQgSFRPbkFzc29jUnNwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgaHRfb25Bc3NSc3ApOwotI2Vsc2UKLXZvaWQgSFRPbkFzc29jUnNwX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotI2VuZGlmCi0jZW5kaWYKIHZvaWQgSFRPbkFzc29jUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CkBAIC0xNzYwLDkgKzE3NDksMyBAQAogCiAJcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gZmFsc2U7CiB9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLS8vRVhQT1JUX1NZTUJPTF9OT1ZFUlMoSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcpOwotI2Vsc2UKLS8vRVhQT1JUX1NZTUJPTChIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MF9ydGw4MjU2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5jCmluZGV4IDczOTFmNWYuLjhiZDViMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MF9ydGw4MjU2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYwpAQCAtNTAxLDEzICs1MDEsMTMgQEAKIAkJCQlpZigocHJpdi0+aWVlZTgwMjExLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgJiYgUlRfSU5fUFNfTEVWRUwocFBTQywgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpKQogCQkJCXsgLy8gVGhlIGN1cnJlbnQgUkYgc3RhdGUgaXMgT0ZGIGFuZCB0aGUgUkYgT0ZGIGxldmVsIGlzIGhhbHRpbmcgdGhlIE5JQywgcmUtaW5pdGlhbGl6ZSB0aGUgTklDLgogCQkJCQlib29sIHJ0c3RhdHVzID0gdHJ1ZTsKLQkJCQkJdTMyIEluaXRpbGl6ZUNvdW50ID0gMzsKKwkJCQkJdTMyIEluaXRpYWxpemVDb3VudCA9IDM7CiAJCQkJCWRvCiAJCQkJCXsKLQkJCQkJCUluaXRpbGl6ZUNvdW50LS07CisJCQkJCQlJbml0aWFsaXplQ291bnQtLTsKIAkJCQkJCXByaXYtPlJlZ1JmT2ZmID0gZmFsc2U7CiAJCQkJCQlydHN0YXR1cyA9IE5pY0lGRW5hYmxlTklDKGRldik7Ci0JCQkJCX13aGlsZSggKHJ0c3RhdHVzICE9IHRydWUpICYmKEluaXRpbGl6ZUNvdW50ID4wKSApOworCQkJCQl9d2hpbGUoIChydHN0YXR1cyAhPSB0cnVlKSAmJihJbml0aWFsaXplQ291bnQgPjApICk7CiAKIAkJCQkJaWYocnRzdGF0dXMgIT0gdHJ1ZSkKIAkJCQkJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRS5oCmluZGV4IGY0YmU5Y2MuLjg2NWNkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFLmgKQEAgLTE0NjgsNyArMTQ2OCw2IEBACiAKICNlbmRpZgogYm9vbCBpbml0X2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBydGw4MTl4RV90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzaG9ydCBydGw4MTkyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmKiBza2IpOwogdTMyIHJlYWRfY2FtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpOwogdm9pZCB3cml0ZV9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkciwgdTMyIGRhdGEpOwpAQCAtMTUwMywxMCArMTUwMiw5IEBACiB2b2lkIHJ0bDgxODVfdHhfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhbnQpOwogdm9pZCBydGw4MTg3X3NldF9yeGNvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAvL3Nob3J0IGNoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBwcmlvcml0eV90IHByaW9yaXR5KTsKLXZvaWQgcnRsODE5Ml9zdGFydF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIENhbVJlc2V0QWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CiB2b2lkIEVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBzZXRLZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggRW50cnlObywgdTggS2V5SW5kZXgsIHUxNiBLZXlUeXBlLCB1OCAqTWFjQWRkciwgdTggRGVmYXVsdEtleSwgdTMyICpLZXlDb250ZW50ICk7Cit2b2lkIHNldEtleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBFbnRyeU5vLCB1OCBLZXlJbmRleCwgdTE2IEtleVR5cGUsIGNvbnN0IHU4ICpNYWNBZGRyLCB1OCBEZWZhdWx0S2V5LCB1MzIgKktleUNvbnRlbnQgKTsKIHZvaWQgQ2FtUHJpbnREYmdSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CiBleHRlcm4Jdm9pZAlkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldixib29sICBiaW5jaDE0KTsKIGV4dGVybiB2b2lkIGZpcm13YXJlX2luaXRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jCmluZGV4IGViNDE0MDIuLjRjZDA3MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jCkBAIC05MiwxMiArOTIsOCBAQAogCQkJLy8JQ09NUF9QT1dFUl9UUkFDS0lORwl8CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAJQ09NUF9JTlRSICAgICAgIHwKIAkJCQlDT01QX0VSUiA7IC8vYWx3YXlzIG9wZW4gZXJyIGZsYWdzIG9uCi0jaWZuZGVmIFBDSV9ERVZJQ0UKLSNkZWZpbmUgUENJX0RFVklDRSh2ZW5kLGRldilcCi0JLnZlbmRvcj0odmVuZCksLmRldmljZT0oZGV2KSxcCi0JLnN1YnZlbmRvcj1QQ0lfQU5ZX0lELC5zdWJkZXZpY2U9UENJX0FOWV9JRAotI2VuZGlmCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE5Ml9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxOTJfcGNpX2lkX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAjaWZkZWYgUlRMODE5MFAKIAkvKiBSZWFsdGVrICovCiAJLyogRGxpbmsgKi8KQEAgLTE1NSw2ICsxNTEsMTYgQEAKICNlbmRpZgogfTsKIAorc3RhdGljIHZvaWQgcnRsODE5Ml9zdGFydF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBydGw4MTkyX3N0b3BfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBydGw4MTkyX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaXJxX3R4X3Rhc2tsZXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgcnRsODE5Ml9wcmVwYXJlX2JlYWNvbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7CitzdGF0aWMgaXJxcmV0dXJuX3QgcnRsODE5Ml9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfdHJ5X3dha2VfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSk7CitzdGF0aWMgdm9pZCBydGw4MTl4RV90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKICNpZmRlZiBFTkFCTEVfRE9UMTFECiAKIHR5cGVkZWYgc3RydWN0IF9DSEFOTkVMX0xJU1QKQEAgLTE2Myw3ICsxNjksNyBAQAogCXU4CUxlbjsKIH1DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOwogCi1zdGF0aWMgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7CitzdGF0aWMgY29uc3QgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7CiAJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NCwxNDksMTUzLDE1NywxNjEsMTY1fSwyNH0sICAJCS8vRkNDCiAJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LCAgICAgICAgICAgICAgICAgICAgCQkJCS8vSUMKIAl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9FVFNJCkBAIC0zNDksOCArMzU1LDggQEAKIAkvL3N0cnVjdCByODE5Ml9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOwogCi0Jc3RhdGljIHU4IGNjbXBfaWVbNF0gPSB7MHgwMCwweDUwLDB4ZjIsMHgwNH07Ci0Jc3RhdGljIHU4IGNjbXBfcnNuX2llWzRdID0gezB4MDAsIDB4MGYsIDB4YWMsIDB4MDR9OworCXN0YXRpYyBjb25zdCB1OCBjY21wX2llWzRdID0gezB4MDAsMHg1MCwweGYyLDB4MDR9OworCXN0YXRpYyBjb25zdCB1OCBjY21wX3Jzbl9pZVs0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDA0fTsKIAlpbnQgd3BhX2llX2xlbj0gaWVlZS0+d3BhX2llX2xlbjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OwogCWludCBlbmNyeXB0OwpAQCAtNDg3LDE1ICs0OTMsMTMgQEAKIC8qIHRoaXMgbWlnaHQgc3RpbGwgY2FsbGVkIGluIHdoYXQgd2FzIHRoZSBQSFkgcnRsODE4NS9ydGw4MTkyIGNvbW1vbiBjb2RlCiAgKiBwbGFucyBhcmUgdG8gcG9zc2liaWx0eSB0dXJuIGl0IGFnYWluIGluIG9uZSBjb21tb24gY29kZS4uLgogICovCi1pbmxpbmUgdm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogfQogCiAKIC8vd2FybmluZyBtZXNzYWdlIFdCCi1pcnFyZXR1cm5fdCBydGw4MTkyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpuZXRkZXYpOwogLy9zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxOTJfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIHJ0bDgxOTJfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogLy92b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgcnRsODE5Ml9yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAvL3ZvaWQgcnRsODE5Ml9ycV90eF9hY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTk0MCw3ICs5NDQsNyBAQAogICogIEhJR0hfUVVFVUUgICAgID09PT4gICAgICAgICAgICAgICAgICAgICAgICA3CiAgKiAgQkVBQ09OX1FVRVVFICAgPT09PiAgICAgICAgICAgICAgICAgICAgICAgIDgKICAqICAqLwotc3RhdGljIHUzMiBUWF9ERVNDX0JBU0VbXSA9IHtCS1FEQSwgQkVRREEsIFZJUURBLCBWT1FEQSwgSENDQVFEQSwgQ1FEQSwgTVFEQSwgSFFEQSwgQlFEQX07CitzdGF0aWMgY29uc3QgdTMyIFRYX0RFU0NfQkFTRVtdID0ge0JLUURBLCBCRVFEQSwgVklRREEsIFZPUURBLCBIQ0NBUURBLCBDUURBLCBNUURBLCBIUURBLCBCUURBfTsKIHZvaWQgcnRsODE5Ml90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xMTE2LDcgKzExMjAsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB1MTYgcnRsX3JhdGVbXSA9IHsxMCwyMCw1NSwxMTAsNjAsOTAsMTIwLDE4MCwyNDAsMzYwLDQ4MCw1NDB9Oworc3RhdGljIGNvbnN0IHUxNiBydGxfcmF0ZVtdID0gezEwLDIwLDU1LDExMCw2MCw5MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MH07CiBpbmxpbmUgdTE2IHJ0bDgxOTJfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCiB7CiAJaWYgKHJhdGUgPjExKSByZXR1cm4gMDsKQEAgLTEyNTIsOCArMTI1Niw2IEBACiB9CiAKIAotdm9pZCBydGw4MTkyX3RyeV93YWtlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpOwotCiBzdGF0aWMgdm9pZCBydGw4MTkyX3R4X2lzcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpbykKIHsKICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNzMzLDExICsxNzM1LDYgQEAKICAgICBwZGVzYy0+Tm9FbmMgPSAxOwogICAgIHBkZXNjLT5TZWNUeXBlID0gMHgwOwogICAgIGlmICh0Y2JfZGVzYy0+Ykh3U2VjKSB7Ci0gICAgICAgIHN0YXRpYyB1OCB0bXAgPTA7Ci0gICAgICAgIGlmICghdG1wKSB7Ci0gICAgICAgICAgICBwcmludGsoIj09Pj09PT09PT09PT09PT09PT1odyBzZWNcbiIpOwotICAgICAgICAgICAgdG1wID0gMTsKLSAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgS0VZX1RZUEVfV0VQNDA6CiAgICAgICAgICAgICBjYXNlIEtFWV9UWVBFX1dFUDEwNDoKQEAgLTE5ODgsNyArMTk4NSw3IEBACiAvKgogKiBiYWNrZ3JvdW5kIHN1cHBvcnQgdG8gcnVuIFFvUyBhY3RpdmF0ZSBmdW5jdGlvbmFsaXR5CiAqLwotc3RhdGljIGludCBXRENBUEFSQV9BRERbXSA9IHtFRENBUEFSQV9CRSxFRENBUEFSQV9CSyxFRENBUEFSQV9WSSxFRENBUEFSQV9WT307CitzdGF0aWMgY29uc3QgaW50IFdEQ0FQQVJBX0FERFtdID0ge0VEQ0FQQVJBX0JFLEVEQ0FQQVJBX0JLLEVEQ0FQQVJBX1ZJLEVEQ0FQQVJBX1ZPfTsKIHN0YXRpYyB2b2lkIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspCiB7CiAgICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCBxb3NfYWN0aXZhdGUpOwpAQCAtMjY0NiwxMSArMjY0Myw2IEBACiAJbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwogfQogCi1leHRlcm4gIHZvaWQgICAgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLXZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci12b2lkIHJ0bDgxOTJfaXJxX3R4X3Rhc2tsZXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotdm9pZCBydGw4MTkyX3ByZXBhcmVfYmVhY29uKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKIC8vaW5pdCB0YXNrbGV0IGFuZCB3YWl0X3F1ZXVlIGhlcmUuIG9ubHkgMi42IGFib3ZlIGtlcm5lbCBpcyBjb25zaWRlcmVkCiAjZGVmaW5lIERSVl9OQU1FICJ3bGFuMCIKIHN0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UqIGRldikKQEAgLTM4MDcsNyArMzc5OSw3IEBACiAKIH0KIAotdm9pZCBydGw4MTkyX3ByZXBhcmVfYmVhY29uKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9wcmVwYXJlX2JlYWNvbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM4MzcsNyArMzgyOSw3IEBACiAgKiBydGw4MTkyX2JlYWNvbl90eF9lbmFibGUoKS4gcnRsODE5Ml9iZWFjb25fdHhfZGlzYWJsZSgpIG1pZ2h0CiAgKiBiZSB1c2VkIHRvIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbgogICovCi12b2lkIHJ0bDgxOTJfc3RhcnRfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX3N0YXJ0X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKQEAgLTQxMjQsMTQgKzQxMTYsMTQgQEAKIHsKIAl1OCBFbnRyeUlkID0gMDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JdTgqCU1hY0FkZHIgPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZDsKKwljb25zdCB1OCoJTWFjQWRkciA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkOwogCi0Jc3RhdGljIHU4CUNBTV9DT05TVF9BRERSWzRdWzZdID0geworCXN0YXRpYyBjb25zdCB1OAlDQU1fQ09OU1RfQUREUls0XVs2XSA9IHsKIAkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAogCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0sCiAJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyfSwKIAkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDN9fTsKLQlzdGF0aWMgdTgJQ0FNX0NPTlNUX0JST0FEW10gPQorCXN0YXRpYyBjb25zdCB1OAlDQU1fQ09OU1RfQlJPQURbXSA9CiAJCXsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKIAogCVJUX1RSQUNFKENPTVBfU0VDLCAiQ2FtUmVzdG9yZUFsbEVudHJ5OiBcbiIpOwpAQCAtNDMxOCw3ICs0MzEwLDYgQEAKIAkJCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKIAkJCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7Ci0JCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCQkJdXAoJmllZWUtPnd4X3NlbSk7CiAJCX0KIAkJZWxzZXsKQEAgLTQ2NjksNyArNDY2MCw3IEBACiB9CiAKIAotdm9pZCBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CiAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsd2F0Y2hfZG9nX3dxKTsKQEAgLTYwNzYsNyArNjA2Nyw3IEBACiAJfQogfQogCi12b2lkIHJ0bDgxOTJfaXJxX3R4X3Rhc2tsZXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX2lycV90eF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQogewogICAgICAgIHJ0bDgxOTJfdHhfcmVzdW1lKHByaXYtPmllZWU4MDIxMS0+ZGV2KTsKIH0KQEAgLTYzMDUsNyArNjI5Niw3IEBACiAKIH0KIAotdm9pZCBydGw4MTkyX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKIHsKICAgICAgICBydGw4MTkyX3J4KHByaXYtPmllZWU4MDIxMS0+ZGV2KTsKIAkvKiB1bm1hc2sgUkRVICovCkBAIC02NjQwLDcgKzY2MzEsNyBAQAogfQogCiAvL3dhcm5pbmcgbWVzc2FnZSBXQgotaXJxcmV0dXJuX3QgcnRsODE5Ml9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqbmV0ZGV2KQorc3RhdGljIGlycXJldHVybl90IHJ0bDgxOTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5ldGRldikKIHsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIG5ldGRldjsKICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CkBAIC02Nzg0LDcgKzY3NzUsNyBAQAogICAgIHJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZCBydGw4MTkyX3RyeV93YWtlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpCitzdGF0aWMgdm9pZCBydGw4MTkyX3RyeV93YWtlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpCiB7CiAjaWYgMAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02ODQ3LDcgKzY4MzgsNyBAQAogCQl1OCBFbnRyeU5vLAogCQl1OCBLZXlJbmRleCwKIAkJdTE2IEtleVR5cGUsCi0JCXU4ICpNYWNBZGRyLAorCQljb25zdCB1OCAqTWFjQWRkciwKIAkJdTggRGVmYXVsdEtleSwKIAkJdTMyICpLZXlDb250ZW50ICkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYwppbmRleCBhMjQ5ZjAwLi5hNTg4NGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kbS5jCkBAIC0yNiwyMCArMjYsMjAgQEAKIC8vIEluZGljYXRlIGRpZmZlcmVudCBBUCB2ZW5kb3IgZm9yIElPVCBpc3N1ZS4KIC8vCiAjaWZkZWYgIFJUTDgxOTBQCi1zdGF0aWMgdTMyIGVkY2Ffc2V0dGluZ19ETFtIVF9JT1RfUEVFUl9NQVhdID0KK3N0YXRpYyBjb25zdCB1MzIgZWRjYV9zZXR0aW5nX0RMW0hUX0lPVF9QRUVSX01BWF0gPQogeyAweDVlNDMyMiwgCTB4NWU0MzIyLCAJMHg1ZTQzMjIsICAJMHg2MDQzMjIsIAkweGE0NGYsIAkweDVlNDMyMiwJMHg1ZTQzMjJ9Owotc3RhdGljIHUzMiBlZGNhX3NldHRpbmdfVUxbSFRfSU9UX1BFRVJfTUFYXSA9CitzdGF0aWMgY29uc3QgdTMyIGVkY2Ffc2V0dGluZ19VTFtIVF9JT1RfUEVFUl9NQVhdID0KIHsgMHg1ZTQzMjIsIAkweGE0NGYsIAkweDVlNDMyMiwgIAkweDYwNDMyMiwgCTB4NWU0MzIyLCAJMHg1ZTQzMjIsCTB4NWU0MzIyfTsKICNlbHNlCiAjaWZkZWYgUlRMODE5MkUKLXN0YXRpYyB1MzIgZWRjYV9zZXR0aW5nX0RMW0hUX0lPVF9QRUVSX01BWF0gPQorc3RhdGljIGNvbnN0IHUzMiBlZGNhX3NldHRpbmdfRExbSFRfSU9UX1BFRVJfTUFYXSA9CiB7IDB4NWU0MzIyLCAJMHg1ZTQzMjIsIAkweDVlNDMyMiwgCTB4NjA0MzIyLCAJMHhhNDRmLCAJMHg1ZTQzMjIsCTB4NWU0MzIyfTsKLXN0YXRpYyB1MzIgZWRjYV9zZXR0aW5nX1VMW0hUX0lPVF9QRUVSX01BWF0gPQorc3RhdGljIGNvbnN0IHUzMiBlZGNhX3NldHRpbmdfVUxbSFRfSU9UX1BFRVJfTUFYXSA9CiB7IDB4NWU0MzIyLCAJMHhhNDRmLAkJMHg1ZTQzMjIsICAJMHg2MDQzMjIsIAkweDVlNDMyMiwgCTB4NWU0MzIyLCAJMHg1ZTQzMjJ9OwogI2Vsc2UKLXN0YXRpYyB1MzIgZWRjYV9zZXR0aW5nX0RMW0hUX0lPVF9QRUVSX01BWF0gPQorc3RhdGljIGNvbnN0IHUzMiBlZGNhX3NldHRpbmdfRExbSFRfSU9UX1BFRVJfTUFYXSA9CiB7IDB4NWU0MzIyLCAJMHg1ZTQzMjIsIAkweDVlNDMyMiwgCTB4NjA0MzIyLCAJMHhhNDRmLCAJMHg1ZWE0NGYsIAkweDVlNDMyMn07Ci1zdGF0aWMgdTMyIGVkY2Ffc2V0dGluZ19VTFtIVF9JT1RfUEVFUl9NQVhdID0KK3N0YXRpYyBjb25zdCB1MzIgZWRjYV9zZXR0aW5nX1VMW0hUX0lPVF9QRUVSX01BWF0gPQogeyAweDVlNDMyMiwgCTB4YTQ0ZiwgCTB4NWU0MzIyLCAJMHg2MDQzMjIsIAkweDVlYTQ0ZiwgCTB4NWVhNDRmLCAJMHg1ZTQzMjJ9OwogI2VuZGlmCiAjZW5kaWYKQEAgLTU5Miw3ICs1OTIsNyBAQAogCiAvL09GRE0gZGVmYXVsdCBhdCAwZGIsIGluZGV4PTYuCiAjaWZuZGVmIFJUTDgxOTBQCi1zdGF0aWMgdTMyIE9GRE1Td2luZ1RhYmxlW09GRE1fVGFibGVfTGVuZ3RoXSA9IHsKK3N0YXRpYyBjb25zdCB1MzIgT0ZETVN3aW5nVGFibGVbT0ZETV9UYWJsZV9MZW5ndGhdID0gewogCTB4N2Y4MDAxZmUsCS8vIDAsICs2ZGIKIAkweDcxYzAwMWM3LAkvLyAxLCArNWRiCiAJMHg2NTQwMDE5NSwJLy8gMiwgKzRkYgpAQCAtNjEzLDcgKzYxMyw3IEBACiAJMHgxMjAwMDA0OCwJLy8gMTcsIC0xMWRiCiAJMHgxMDAwMDA0MAkvLyAxOCwgLTEyZGIKIH07Ci1zdGF0aWMgdTgJQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKK3N0YXRpYyBjb25zdCB1OCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS19UYWJsZV9sZW5ndGhdWzhdID0gewogCXsweDM2LCAweDM1LCAweDJlLCAweDI1LCAweDFjLCAweDEyLCAweDA5LCAweDA0fSwJLy8gMCwgKzBkYiA9PT0+IENDSzQwTSBkZWZhdWx0CiAJezB4MzAsIDB4MmYsIDB4MjksIDB4MjEsIDB4MTksIDB4MTAsIDB4MDgsIDB4MDN9LAkvLyAxLCAtMWRiCiAJezB4MmIsIDB4MmEsIDB4MjUsIDB4MWUsIDB4MTYsIDB4MGUsIDB4MDcsIDB4MDN9LAkvLyAyLCAtMmRiCkBAIC02MjgsNyArNjI4LDcgQEAKIAl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0JLy8gMTEsIC0xMWRiCiB9OwogCi1zdGF0aWMgdTgJQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS19UYWJsZV9sZW5ndGhdWzhdID0geworc3RhdGljIGNvbnN0IHU4IENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKIAl7MHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDAsICswZGIgID09PT4gQ0NLNDBNIGRlZmF1bHQKIAl7MHgzMCwgMHgyZiwgMHgyOSwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDEsIC0xZGIKIAl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDIsIC0yZGIKQEAgLTIwOTQsOCArMjA5NCw2IEBACiAJCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2Z3ZmFsc2VfYWxhcm0oZGV2KTsKIAllbHNlIGlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfUlNTSSkKIAkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZHJpdmVycnNzaShkZXYpOwotCWVsc2UKLQkJcmV0dXJuOwogfQogCiAKQEAgLTI5MzgsOCArMjkzNiw2IEBACiAJUlRfUkZfUE9XRVJfU1RBVEUJZVJmUG93ZXJTdGF0ZVRvU2V0OwogCWJvb2wgYkFjdHVhbGx5U2V0ID0gZmFsc2U7CiAKLQkJYkFjdHVhbGx5U2V0PWZhbHNlOwotCiAJCWlmKCFwcml2LT51cCkKIAkJewogCQlSVF9UUkFDRSgoQ09NUF9JTklUIHwgQ09NUF9QT1dFUiB8IENPTVBfUkYpLCJkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjaygpOiBDYWxsYmFjayBmdW5jdGlvbiBicmVha3Mgb3V0ISFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5jCmluZGV4IDBiMGYzOWMuLjU3NDJjZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmMKQEAgLTI2LDcgKzI2LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIFJBVEVfQ09VTlQgMTIKLXN0YXRpYyB1MzIgcnRsODE4MF9yYXRlc1tdID0gezEwMDAwMDAsMjAwMDAwMCw1NTAwMDAwLDExMDAwMDAwLAorc3RhdGljIGNvbnN0IHUzMiBydGw4MTgwX3JhdGVzW10gPSB7MTAwMDAwMCwyMDAwMDAwLDU1MDAwMDAsMTEwMDAwMDAsCiAJNjAwMDAwMCw5MDAwMDAwLDEyMDAwMDAwLDE4MDAwMDAwLDI0MDAwMDAwLDM2MDAwMDAwLDQ4MDAwMDAwLDU0MDAwMDAwfTsKIAogCkBAIC0xMzcsMTYxICsxMzcsNiBAQAogCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOwogfQogCi0jaWZkZWYgSk9ITl9JT0NUTAotdTE2IHJlYWRfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyKTsKLXZvaWQgd3JpdGVfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKTsKLXUzMiBqb2huX3JlYWRfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIpOwotdm9pZCBfd3JpdGVfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKTsKLQotc3RhdGljIGludCByODE5Ml93eF9yZWFkX3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQl1OCBhZGRyOwotCXUxNiBkYXRhMTsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQotCWdldF91c2VyKGFkZHIsKHU4Kil3cnF1LT5kYXRhLnBvaW50ZXIpOwotCWRhdGExID0gcmVhZF9ydGw4MjI1KGRldiwgYWRkcik7Ci0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBkYXRhMTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCXJldHVybiAwOwotCi19Ci0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfd3JpdGVfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLSAgICAgICAgdTggYWRkcjsKLQotICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOwotCi0gICAgICAgIGdldF91c2VyKGFkZHIsICh1OCopd3JxdS0+ZGF0YS5wb2ludGVyKTsKLQl3cml0ZV9ydGw4MjI1KGRldiwgYWRkciwgd3JxdS0+ZGF0YS5sZW5ndGgpOwotCi0gICAgICAgIHVwKCZwcml2LT53eF9zZW0pOwotCXJldHVybiAwOwotCi19Ci0KLXZvaWQgcnRsODE4N193cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7Ci11OCBydGw4MTg3X3JlYWRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9iYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQl1OCBkYXRhYmI7Ci0jaWYgMAotCWludCBpOwotCWZvcihpPTA7aTwxMjtpKyspIHByaW50aygiJTh4XG4iLCByZWFkX2NhbShkZXYsIGkpICk7Ci0jZW5kaWYKLQotICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOwotCi0JZGF0YWJiID0gcnRsODE4N19yZWFkX3BoeShkZXYsICh1OCl3cnF1LT5kYXRhLmxlbmd0aCwgMHgwMDAwMDAwMCk7Ci0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBkYXRhYmI7Ci0KLQl1cCgmcHJpdi0+d3hfc2VtKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBydGw4MTg3X3dyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKLXN0YXRpYyBpbnQgcjgxOTJfd3hfd3JpdGVfYmIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotICAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0gICAgICAgIHU4IGRhdGFiYjsKLQotICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOwotCi0gICAgICAgIGdldF91c2VyKGRhdGFiYiwgKHU4Kil3cnF1LT5kYXRhLnBvaW50ZXIpOwotICAgICAgICBydGw4MTg3X3dyaXRlX3BoeShkZXYsIHdycXUtPmRhdGEubGVuZ3RoLCBkYXRhYmIpOwotCi0gICAgICAgIHVwKCZwcml2LT53eF9zZW0pOwotICAgICAgICByZXR1cm4gMDsKLQotfQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfd3JpdGVfbmljYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLSAgICAgICAgdTMyIGFkZHI7Ci0KLSAgICAgICAgZG93bigmcHJpdi0+d3hfc2VtKTsKLQotICAgICAgICBnZXRfdXNlcihhZGRyLCAodTMyKil3cnF1LT5kYXRhLnBvaW50ZXIpOwotICAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIGFkZHIsIHdycXUtPmRhdGEubGVuZ3RoKTsKLQotICAgICAgICB1cCgmcHJpdi0+d3hfc2VtKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0KLX0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9uaWNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLSAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotICAgICAgICB1MzIgYWRkcjsKLSAgICAgICAgdTE2IGRhdGExOwotCi0gICAgICAgIGRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLSAgICAgICAgZ2V0X3VzZXIoYWRkciwodTMyKil3cnF1LT5kYXRhLnBvaW50ZXIpOwotICAgICAgICBkYXRhMSA9IHJlYWRfbmljX2J5dGUoZGV2LCBhZGRyKTsKLSAgICAgICAgd3JxdS0+ZGF0YS5sZW5ndGggPSBkYXRhMTsKLQotICAgICAgICB1cCgmcHJpdi0+d3hfc2VtKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2FwX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OwotCWludCBuYW1lX2xlbjsKLQotICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOwotCi0JLy9jb3VudCB0aGUgbGVuZ3RoIG9mIGlucHV0IHNzaWQKLQlmb3IobmFtZV9sZW49MCA7ICgoY2hhciopd3JxdS0+ZGF0YS5wb2ludGVyKVtuYW1lX2xlbl0hPSdcMCcgOyBuYW1lX2xlbisrKTsKLQotCS8vc2VhcmNoIGZvciB0aGUgY29ycmVzcG9kaW5nIGluZm8gd2hpY2ggaXMgcmVjZWl2ZWQKLSAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoICh0YXJnZXQtPnNzaWRfbGVuID09IG5hbWVfbGVuKSAmJgotCQkgICAgIChzdHJuY21wKHRhcmdldC0+c3NpZCwgKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlciwgbmFtZV9sZW4pPT0wKSl7Ci0JCQlpZih0YXJnZXQtPndwYV9pZV9sZW4+MCB8fCB0YXJnZXQtPnJzbl9pZV9sZW4+MCApCi0JCQkJLy9zZXQgZmxhZ3M9MSB0byBpbmRpY2F0ZSB0aGlzIGFwIGlzIFdQQQotCQkJCXdycXUtPmRhdGEuZmxhZ3MgPSAxOwotCQkJZWxzZSB3cnF1LT5kYXRhLmZsYWdzID0gMDsKLQotCi0JCWJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVwKCZwcml2LT53eF9zZW0pOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi0KLSNlbmRpZgotCiBzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9yYXd0eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHkuYwppbmRleCA3YmQ0ZmFlLi5mZmQxZTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMKQEAgLTcsNyArNyw3IEBACiAjaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImllZWU4MDIxMS9kb3QxMWQuaCIKICNlbmRpZgotc3RhdGljIHUzMiBSRl9DSEFOTkVMX1RBQkxFX1pFQlJBW10gPSB7CitzdGF0aWMgY29uc3QgdTMyIFJGX0NIQU5ORUxfVEFCTEVfWkVCUkFbXSA9IHsKIAkwLAogCTB4MDg1YywgLy8yNDEyIDEKIAkweDA4ZGMsIC8vMjQxNyAyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcKaW5kZXggYjQyMmVhMS4uMjdiODlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZwpAQCAtNCw1ICs0LDYgQEAKIAlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IFdFWFRfUFJJVgogCXNlbGVjdCBFRVBST01fOTNDWDYKKwlzZWxlY3QgQ1JZUFRPCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9UT0RPCmluZGV4IDNjOGRhMTUuLmIxNTIwNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L1RPRE8KQEAgLTEsNCArMSwxMCBAQAogVE9ETzoKKy0gbWVyZ2UgcmVhbHRla3MgYnVnZml4ZXMgYW5kIG5ldyBmZWF0dXJlcyBpbnRvIHRoZSBkcml2ZXI6CisgIC0gYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyIGNhbiBiZSBmb3VuZCBoZXJlOgorICAgIGh0dHA6Ly93d3cuZ2V0bmV0LmV1L3Byb2R1Y3RzX0dOLTYyMVUuaHRtbAorICAtIG5vdGU6CisgICAgcmVhbHRlayBoYXMgc3RyaXBwZWQgYWxvbW9zdCBhbGwgY29tbWVudHMgZnJvbSB0aGUgc291cmNlLAorICAgIHNvIHBsZWFzZSBsZWF2ZSBhbGwgY29tbWVudHMgdGhhdCBtYXkgaGVscCBpbiBkZXZlbG9wbWVudCBpbiB0aGUgY29kZS4KIC0gcHJlcGFyZSBwcml2YXRlIGllZWU4MDIxMSBzdGFjayBmb3IgbWVyZ2Ugd2l0aCBydGw4MTg3c2UncyB2ZXJzaW9uOgogICAtIHJlbW92ZSBydGw4MTkyc3UncyBzcGVjaWZpYyBkZWFkIGNvZGUKICAgLSBjbGVhbnVwIGllZWU4MDIxMS5oCkBAIC03LDcgKzEzLDYgQEAKIC0gc3dpdGNoIHRvIHVzZSBzaGFyZWQgImxpYnJ0bCIgaW5zdGVhZCBvZiBwcml2YXRlIGllZWU4MDIxMSBzdGFjawogLSBzd2l0Y2ggdG8gdXNlIExJQjgwMjExCiAtIHN3aXRjaCB0byB1c2UgTUFDODAyMTEKLS0gc3dpdGNoIHRvIHVzZSBFRVBST01fOTNDWDYKIC0gdXNlIGtlcm5lbCBjb2Rpbmcgc3R5bGUKIC0gY2hlY2twYXRjaC5wbCBmaXhlcwogLSBzcGFyc2UgZml4ZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvZG90MTFkLmMKaW5kZXggMjI0ODQ2Mi4uNjI3NWNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvZG90MTFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTEsMTEgKzEsMjEgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCUZpbGU6Ci0vLwkJRG90MTFkLmMKLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlJbXBsZW1lbnQgODAyLjExZC4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZG90MTFkLmgiCiAKQEAgLTUwLDcgKzYwLDYgQEAKIAlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKIAlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAKLQkvL3ByaW50aygiRG90MTFkX1Jlc2V0KClcbiIpOwogfQogCiAvLwpAQCAtMTA1LDcgKzExNCw2IEBACiAJCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKCh1OCopcFRyaXBsZSArIDMpOwogCX0KICNpZiAxCi0JLy9wcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogQ2hhbm5lbCBMaXN0OlxuIik7CiAJcHJpbnRrKCJDaGFubmVsIExpc3Q6Iik7CiAJZm9yKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQogCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9kb3QxMWQuaAppbmRleCA5MTNhYzVkLi42MmEyYzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9kb3QxMWQuaApAQCAtMSwxMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKICNkZWZpbmUgX19JTkNfRE9UMTFEX0gKIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgogCi0vLyNkZWZpbmUgRE9UMTFEX01BWF9DSE5MX05VTSA4MwotCiB0eXBlZGVmIHN0cnVjdCBfQ0hOTF9UWFBPV0VSX1RSSVBMRSB7CiAJdTggRmlyc3RDaG5sOwogCXU4ICBOdW1DaG5sczsKQEAgLTE4LDcgKzM0LDYgQEAKIH1ET1QxMURfU1RBVEU7CiAKIHR5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7Ci0JLy9ERUNMQVJFX1JUX09CSkVDVChSVF9ET1QxMURfSU5GTyk7CiAKIAlib29sIGJFbmFibGVkOyAvLyBkb3QxMU11bHRpRG9tYWluQ2FwYWJpbGl0eUVuYWJsZWQKIApAQCAtMjgsOCArNDMsNiBAQAogCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsKIAogCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07ICAvLyEhIVZhbHVlIDA6IEludmFsaWQsIDE6IFZhbGlkIChhY3RpdmUgc2NhbiksIDI6IFZhbGlkIChwYXNzaXZlIHNjYW4pCi0JLy91OCAgQ2hubExpc3RMZW47IC8vICNCeXRlcyB2YWxpZCBpbiBDaG5sTGlzdFtdLgotCS8vdTggIENobmxMaXN0W0RPVDExRF9NQVhfQ0hOTF9OVU1dOwogCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwogCiAJRE9UMTFEX1NUQVRFIFN0YXRlOwpAQCAtOTUsNCArMTA4LDQgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKIAl1OCBjaGFubmVsCiApOwotI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTEuaAppbmRleCBiY2IyYjEyLi4xZDY3ODlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMTY4LDYgKzE2OCwxMCBAQAogLyogUU9TIGNvbnRyb2wgKi8KICNkZWZpbmUgSUVFRTgwMjExX1FDVExfVElEICAgICAgICAgICAgICAweDAwMEYKIAorI2RlZmluZSBPVUlfU1VCVFlQRV9XTU1fSU5GTwkJMAorI2RlZmluZSBPVUlfU1VCVFlQRV9XTU1fUEFSQU0JMQorI2RlZmluZSBPVUlfU1VCVFlQRV9RT1NfQ0FQQUJJCTUKKwogLyogZGVidWcgbWFjcm9zICovCiAjZGVmaW5lIENPTkZJR19JRUVFODAyMTFfREVCVUcKICNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCkBAIC0xMTIwLDExICsxMTI0LDI3IEBACiAJQ09VTlRSWV9DT0RFX01LSyA9IDUsCiAJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAogCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAotCUNPVU5UUllfQ09ERV9URUxFQywKLQlDT1VOVFJZX0NPREVfTUlDLAotCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOCisJQ09VTlRSWV9DT0RFX1RFTEVDID0gOCwKKwlDT1VOVFJZX0NPREVfTUlDID0gOSwKKwlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTiA9IDEwLAorCUNPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzID0gMTEsCisJQ09VTlRSWV9DT0RFX1RFTEVDX05FVEdFQVIgPSAxMiwKKwlDT1VOVFJZX0NPREVfTUFYCiB9OwogCisjZGVmaW5lCU5VTV9QTUtJRF9DQUNIRQkJMTYKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX1BNS0lEX0xJU1QKK3sKKwl1OAkJCQkJCWJVc2VkOworCXU4IAkJCQkJCUJzc2lkWzZdOworCXU4CQkJCQkJUE1LSURbMTZdOworCXU4CQkJCQkJU3NpZEJ1ZlszM107CisJdTgqCQkJCQkJc3NpZF9vY3RldDsKKwl1MTYgCQkJCQlzc2lkX2xlbmd0aDsKK30gUlRfUE1LSURfTElTVCwgKlBSVF9QTUtJRF9MSVNUOworCisKICNpbmNsdWRlICJpZWVlODAyMTFfcjgxOTJzLmgiCiAKIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlIHsKQEAgLTExMzQsNiArMTE1NCw3IEBACiAJLyogaHcgc2VjdXJpdHkgcmVsYXRlZCAqLwogCXU4IGh3c2VjX2FjdGl2ZTsKIAlib29sIGlzX3NpbGVudF9yZXNldDsKKwlib29sIGZvcmNlX21pY19lcnJvcjsKIAlib29sIGlzX3JvYW1pbmc7CiAJYm9vbCBpZWVlX3VwOwogCWJvb2wgYlN1cHBvcnRSZW1vdGVXYWtlVXA7CkBAIC0xMjQ3LDYgKzEyNjgsNyBAQAogCWludCBiY3J4X3N0YV9rZXk7IC8qIHVzZSBpbmRpdmlkdWFsIGtleXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGV2ZW4KIAkJCSAgICogd2l0aCBSWCBvZiBicm9hZC9tdWx0aWNhc3QgZnJhbWVzICovCiAKKwlSVF9QTUtJRF9MSVNUCQlQTUtJRExpc3RbTlVNX1BNS0lEX0NBQ0hFXTsKIAkvKiBGcmFnbWVudGF0aW9uIHN0cnVjdHVyZXMgKi8KIAkvLyBlYWNoIHN0cmVhbWluZyBjb250YWluIGEgZW50cnkKIAlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgZnJhZ19jYWNoZVsxN11bSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOXTsKQEAgLTEyOTUsNiArMTMxNywxMCBAQAogCSAqLwogCXZvaWQgKnBEb3QxMWRJbmZvOwogCWJvb2wgYkdsb2JhbERvbWFpbjsKKworCXU4ICAgSWJzc1N0YXJ0Q2hubDsKKwl1OCAgIGlic3NfbWF4am9pbl9jaGFsOworCiAJaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLwogCWludCBiYXNpY19yYXRlOwogCS8vRklYTUU6IHBsZWFjZSBjYWxsYmFjaywgc2VlIGlmIHJlZHVuZGFudCB3aXRoIHNvZnRtYWNfZmVhdHVyZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKaW5kZXggODAxOTQyMy4uMjRlN2Q1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKQEAgLTExLDcgKzExLDYgQEAKICAqCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIwMSw3ICsyMDAsNyBAQAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiB9OwogCi1pbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKQoraW50IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKQogewogCWludCByZXQgPSAtRU5PTUVNOwogCkBAIC0yMjEsNyArMjIwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQordm9pZCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CiAJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaAppbmRleCBiNThhM2JjLi40MmU1MmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApAQCAtNDksNyArNDksNyBAQAogCSAqIFRoZXNlIGNhbiBiZSBOVUxMIGlmIGZ1bGwgTVNEVSBvcGVyYXRpb25zIGFyZSBub3QgbmVlZGVkLiAqLwogCWludCAoKmVuY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOwogCWludCAoKmRlY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwgaW50IGhkcl9sZW4sCi0JCQkgICAgdm9pZCAqcHJpdik7CisJCQkgICAgdm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOwogCiAJaW50ICgqc2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKIAlpbnQgKCpnZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKaW5kZXggNzdkZTk1Ny4uY2FlZTQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCkBAIC05LDcgKzksNiBAQAogICogbW9yZSBkZXRhaWxzLgogICovCiAKLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMzEsNyArMTMwLDYgQEAKIAlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCiAJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHgwOCkpOwogICAgICAgICAqLwotCS8vIGZpeGVkIGJ5IERhdmlkIDoyMDA2LjkuNgogCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKIAkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDgwKSk7CiAJYWFkX2xlbiA9IDIyOwpAQCAtMjEwLDcgKzIwOCw2IEBACiAJcG9zID0gc2tiX3B1c2goc2tiLCBDQ01QX0hEUl9MRU4pOwogCW1lbW1vdmUocG9zLCBwb3MgKyBDQ01QX0hEUl9MRU4sIGhkcl9sZW4pOwogCXBvcyArPSBoZHJfbGVuOwotLy8JbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CiAKIAlpID0gQ0NNUF9QTl9MRU4gLSAxOwogCXdoaWxlIChpID49IDApIHsKQEAgLTI0MCw3ICsyMzcsNiBAQAogCQl1OCAqZSA9IGtleS0+dHhfZTsKIAkJdTggKnMwID0ga2V5LT50eF9zMDsKIAotCQkvL21pYyBpcyBtb3ZlZCB0byBoZXJlIGJ5IGpvaG4KIAkJbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CiAKIAkJY2NtcF9pbml0X2Jsb2NrcyhrZXktPnRmbSwgaGRyLCBrZXktPnR4X3BuLCBkYXRhX2xlbiwgYjAsIGIsIHMwKTsKQEAgLTQ0NSw3ICs0NDEsNiBAQAogCiB2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCkKIHsKLS8vICAgIHByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuOwogfQogCkBAIC00NzAsNyArNDY1LDcgQEAKIAlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9jY21wKTsKIH0KIAotdm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCkKK3ZvaWQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCkKIHsKIAlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwppbmRleCBhZGU1ZjZmLi41YWI5NGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTksNyArOSw2IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTQzLDYgKzQyLDcgQEAKIAogCXUzMiByeF9pdjMyOwogCXUxNiByeF9pdjE2OworCWJvb2wgaW5pdGlhbGl6ZWQ7CiAJdTE2IHJ4X3R0YWtbNV07CiAJaW50IHJ4X3BoYXNlMV9kb25lOwogCXUzMiByeF9pdjMyX25ldzsKQEAgLTQzMyw4ICs0MzMsOCBAQAogCiAJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQogCXsKLQkJaWYgKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8Ci0JCShpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkgeworCQlpZiAoKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8CisJCShpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkmJnRrZXktPmluaXRpYWxpemVkKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSVwTSIKIAkJCQkiIHByZXZpb3VzIFRTQyAlMDh4JTA0eCByZWNlaXZlZCBUU0MgIgpAQCAtNDQ0LDYgKzQ0NCw3IEBACiAJCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzKys7CiAJCQlyZXR1cm4gLTQ7CiAJCX0KKyAgICAgICAgICAgICAgICB0a2V5LT5pbml0aWFsaXplZCA9IHRydWU7CiAKIAkJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMiB8fCAhdGtleS0+cnhfcGhhc2UxX2RvbmUpIHsKIAkJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT5yeF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsIGl2MzIpOwpAQCAtNDUyLDEwICs0NTMsOCBAQAogCQl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnJ4X3R0YWssIGl2MTYpOwogCiAJCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSAxMjsKLQorCQlzZ19pbml0X29uZSgmc2csIHBvcywgcGxlbis0KTsKIAkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+cnhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwotCQlzZ19pbml0X29uZSgmc2csIHBvcywgcGxlbiArIDQpOwotCiAJCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAiOiBUS0lQOiBmYWlsZWQgdG8gZGVjcnlwdCAiCkBAIC01NzEsMTIgKzU3MCw5IEBACiAKIAltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT50eF9oZHIpOwogCi0JLy8geyBkYXZpZCwgMjAwNi45LjEKLQkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCiAJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKIAkJdGtleS0+dHhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKIAl9Ci0JLy8gfQogCXBvcyA9IHNrYl9wdXQoc2tiLCA4KTsKIAogCWlmIChtaWNoYWVsX21pYyh0a2V5LT50eF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKQEAgLTYwOCw3ICs2MDQsNyBAQAogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY192ZXJpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwKLQkJCQkgICAgIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQorCQkJCSAgICAgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQogewogCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKIAl1OCBtaWNbOF07CkBAIC02MjAsMTIgKzYxNiw5IEBACiAJCXJldHVybiAtMTsKIAogCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnJ4X2hkcik7Ci0JLy8geyBkYXZpZCwgMjAwNi45LjEKLQkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCiAJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKIAkJdGtleS0+cnhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKIAl9Ci0JLy8gfQogCiAJaWYgKG1pY2hhZWxfbWljKHRrZXktPnJ4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAogCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKQEAgLTYzNyw5ICs2MzAsMTQgQEAKIAkJICAgICAgICJNU0RVIGZyb20gJXBNIGtleWlkeD0lZFxuIiwKIAkJICAgICAgIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiTi9BIiwgaGRyLT5hZGRyMiwKIAkJICAgICAgIGtleWlkeCk7Ci0JCWlmIChza2ItPmRldikKKyAgICAgICAgICAgICAgICBwcmludGsoIiVkLCBmb3JjZV9taWNfZXJyb3IgPSAlZFxuIiwgKG1lbWNtcChtaWMsIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gOCwgOCkgIT0gMCksXAorICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+Zm9yY2VfbWljX2Vycm9yKTsKKwkJaWYgKHNrYi0+ZGV2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoInNrYi0+ZGV2ICE9IE5VTExcbiIpOwogCQkJaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc2tiLT5kZXYsIGhkciwga2V5aWR4KTsKKyAgICAgICAgICAgICAgICB9CiAJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKKyAgICAgICAgICAgICAgICBpZWVlLT5mb3JjZV9taWNfZXJyb3IgPSBmYWxzZTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNzYyLDE4ICs3NjAsMTcgQEAKIAkub3duZXIJCSAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKLWludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKK2ludCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKQogewogCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3RraXApOwogfQogCi12b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCh2b2lkKQordm9pZCBpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCh2b2lkKQogewogCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpCiB7Ci0vLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKaW5kZXggYTFjMGE1OS4uNTIxOWJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtOSw3ICs5LDYgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqLwogCi0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjc5LDE4ICsyNzgsMTcgQEAKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogfTsKIAotaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpCitpbnQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKQogewogCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7CiB9CiAKLXZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKK3ZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKQogewogCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOwogfQogCiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKQogewotLy8JcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IGE4NzY1MGEuLjQ5NDViM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTMxLDcgKzMxLDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KQEAgLTE0Miw3ICsxNDEsNiBAQAogCXNwaW5fbG9ja19pbml0KCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZpZWVlLT5id19zcGlubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmllZWUtPnJlb3JkZXJfc3BpbmxvY2spOwotCS8vYWRkZWQgYnkgV0IKIAlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX2NobmxvcCksIDApOwogCWF0b21pY19zZXQoJihpZWVlLT5hdG1fc3didyksIDApOwogCkBAIC0xNTMsNyArMTUxLDYgQEAKICAJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gMDsKICAJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CiAJaWVlZS0+cmF3X3R4ID0gMDsKLQkvL2llZWUtPmh3c2VjX3N1cHBvcnQgPSAxOyAvL2RlZmF1bHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCiAJaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsgLy9kaXNhYmxlIGh3c2VjLCBzd2l0Y2ggaXQgb24gd2hlbiBuZWNlc3NhcnkuCiAKIAlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOwpAQCAtMTk2LDggKzE5Myw2IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOwotCS8vc3RydWN0IGxpc3RfaGVhZCAqcCwgKnE7Ci0vLwlkZWxfdGltZXJfc3luYygmaWVlZS0+U3dCd1RpbWVyKTsKICNpZiAxCiAJaWYgKGllZWUtPnBIVEluZm8gIT0gTlVMTCkKIAl7CkBAIC0yMjgsMjMgKzIyMyw2IEBACiAKIHUzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOwogc3RhdGljIGludCBkZWJ1ZyA9IFwKLQkvLwkJICAgIElFRUU4MDIxMV9ETF9JTkZPCXwKLQkvLwkJICAgIElFRUU4MDIxMV9ETF9XWAl8Ci0JLy8JCSAgICBJRUVFODAyMTFfRExfU0NBTgl8Ci0JLy8JCSAgICBJRUVFODAyMTFfRExfU1RBVEUJfAotCS8vCQkgICAgSUVFRTgwMjExX0RMX01HTVQJfAotCS8vCQkgICAgSUVFRTgwMjExX0RMX0ZSQUcJfAotCS8vCQkgICAgSUVFRTgwMjExX0RMX0VBUAl8Ci0JLy8JCSAgICBJRUVFODAyMTFfRExfRFJPUAl8Ci0JLy8JCSAgICBJRUVFODAyMTFfRExfVFgJfAotCS8vCQkgICAgSUVFRTgwMjExX0RMX1JYCXwKLQkJCSAgICAvL0lFRUU4MDIxMV9ETF9RT1MgICAgfAotCS8vCQkgICAgSUVFRTgwMjExX0RMX0hUIAl8Ci0JLy8JCSAgICBJRUVFODAyMTFfRExfVFMJfAotLy8JCQkgICAgSUVFRTgwMjExX0RMX0JBIAl8Ci0JLy8JCSAgICBJRUVFODAyMTFfRExfUkVPUkRFUnwKLS8vCQkJICAgIElFRUU4MDIxMV9ETF9UUkFDRSAgfAotCQkJICAgIC8vSUVFRTgwMjExX0RMX0RBVEEJfAogCQkJICAgIElFRUU4MDIxMV9ETF9FUlIJICAvL2F3YXlscyBvcGVuIHRoaXMgZmxhZ3MgdG8gc2hvdyBlcnJvciBvdXQKIAkJCSAgICA7CiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmllZWU4MDIxMV9wcm9jID0gTlVMTDsKQEAgLTI4Miw3ICsyNjAsNyBAQAogCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwogfQogCi1pbnQgX19pbml0IGllZWU4MDIxMV9kZWJ1Z19pbml0KHZvaWQpCitpbnQgaWVlZTgwMjExX2RlYnVnX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CiAKQEAgLTMwOCw3ICsyODYsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fZXhpdCBpZWVlODAyMTFfZGVidWdfZXhpdCh2b2lkKQordm9pZCBpZWVlODAyMTFfZGVidWdfZXhpdCh2b2lkKQogewogCWlmIChpZWVlODAyMTFfcHJvYykgewogCQlyZW1vdmVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBpZWVlODAyMTFfcHJvYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfcjgxOTJzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfcjgxOTJzLmgKaW5kZXggMTgyNGNkYS4uN2U3ZmJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3I4MTkycy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yODE5MnMuaApAQCAtMzM5LDI4ICszMzksMzkgQEAKIH07CiAKIC8qIEZpcm13YXJlIHJlbGF0ZWQgQ01EIElPLiAqLwotdHlwZWRlZiBlbnVtIF9GV19DTURfSU9fVFlQRSB7Ci0JRldfQ01EX0RJR19FTkFCTEUgPSAwLAkJLyogZm9yIERJRyBETSAqLwordHlwZWRlZgllbnVtIF9GV19DTURfSU9fVFlQRXsKKwlGV19DTURfRElHX0VOQUJMRSA9IDAsIC8qIGZvciBESUcgRE0gKi8KIAlGV19DTURfRElHX0RJU0FCTEUgPSAxLAogCUZXX0NNRF9ESUdfSEFMVCA9IDIsCiAJRldfQ01EX0RJR19SRVNVTUUgPSAzLAotCUZXX0NNRF9ISUdIX1BXUl9FTkFCTEUgPSA0LAkvKiBmb3IgSGlnaCBQb3dlciBETSAqLworCUZXX0NNRF9ISUdIX1BXUl9FTkFCTEUgPSA0LCAvKiBmb3IgRElHIERNICovCiAJRldfQ01EX0hJR0hfUFdSX0RJU0FCTEUgPSA1LAotCUZXX0NNRF9SQV9SRVNFVCA9IDYsCQkvKiBmb3IgUmF0ZSBhZGFwdGl2ZSBETSAqLwotCUZXX0NNRF9SQV9BQ1RJVkUgPSA3LAotCUZXX0NNRF9SQV9SRUZSRVNIX04gPSA4LAotCUZXX0NNRF9SQV9SRUZSRVNIX0JHID0gOSwKLQlGV19DTURfSVFLX0VOQUJMRSA9IDEwLAkJLyogZm9yIEZXIHN1cHBvcnRlZCBJUUsgKi8KLQlGV19DTURfVFhQV1JfVFJBQ0tfRU5BQkxFID0gMTEsCS8qIFR4IHBvd2VyIHRyYWNraW5nIHN3aXRjaCAqLwotCUZXX0NNRF9UWFBXUl9UUkFDS19ESVNBQkxFID0gMTIsLyogVHggcG93ZXIgdHJhY2tpbmcgc3dpdGNoICovCi0JRldfQ01EX1BBVVNFX0RNX0JZX1NDQU4gPSAxMywKLQlGV19DTURfUkVTVU1FX0RNX0JZX1NDQU4gPSAxNCwKLQlGV19DTURfTUlEX0hJR0hfUFdSX0VOQUJMRSA9IDE1LAorCUZXX0NNRF9SQV9SRVNFVCA9IDYsIC8qIGZvciBESUcgRE0gKi8KKwlGV19DTURfUkFfQUNUSVZFPSA3LAorCUZXX0NNRF9SQV9SRUZSRVNIX049IDgsCisJRldfQ01EX1JBX1JFRlJFU0hfQkc9IDksCisJRldfQ01EX1JBX0lOSVQ9IDEwLCAvKiBmb3IgRlcgc3VwcG9ydGVkIElRSyAqLworCUZXX0NNRF9JUUtfRU5BQkxFID0gMTEsIC8qIFR4IHBvd2VyIHRyYWNraW5nIHN3aXRjaCAqLworCUZXX0NNRF9UWFBXUl9UUkFDS19FTkFCTEUgPSAxMiwgLyogVHggcG93ZXIgdHJhY2tpbmcgc3dpdGNoICovCisJRldfQ01EX1RYUFdSX1RSQUNLX0RJU0FCTEUgPSAxMywKKwlGV19DTURfVFhQV1JfVFJBQ0tfVEhFUk1BTCA9IDE0LAorCUZXX0NNRF9QQVVTRV9ETV9CWV9TQ0FOID0gMTUsCiAJLyogaW5kaWNhdGUgZmlybXdhcmUgdGhhdCBkcml2ZXIgZW50ZXJzIExQUywgZm9yIFBTLVBvbGwgaGFyZHdhcmUgYnVnICovCi0JRldfQ01EX0xQU19FTlRFUiA9IDE2LAorCUZXX0NNRF9SRVNVTUVfRE1fQllfU0NBTiA9IDE2LAogCS8qIGluZGljYXRlIGZpcm13YXJlIHRoYXQgZHJpdmVyIGxlYXZlIExQUyAqLwotCUZXX0NNRF9MUFNfTEVBVkUgPSAxNywKLX0gRldfQ01EX0lPX1RZUEU7CisJRldfQ01EX1JBX1JFRlJFU0hfTl9DT01CID0gMTcsCisJRldfQ01EX1JBX1JFRlJFU0hfQkdfQ09NQiA9IDE4LAorCUZXX0NNRF9BTlRFTk5BX1NXX0VOQUJMRSA9IDE5LAorCUZXX0NNRF9BTlRFTk5BX1NXX0RJU0FCTEUgPSAyMCwKKwlGV19DTURfVFhfRkVFREJBQ0tfQ0NYX0VOQUJMRSA9IDIxLAorCUZXX0NNRF9MUFNfRU5URVIgPSAyMiwKKwlGV19DTURfTFBTX0xFQVZFID0gMjMsCisJRldfQ01EX0RJR19NT0RFX1NTID0gMjQsCisJRldfQ01EX0RJR19NT0RFX0ZBID0gMjUsCisJRldfQ01EX0FERF9BMl9FTlRSWSA9IDI2LAorCUZXX0NNRF9DVFJMX0RNX0JZX0RSSVZFUiA9IDI3LAorCUZXX0NNRF9DVFJMX0RNX0JZX0RSSVZFUl9ORVcgPSAyOCwKK31GV19DTURfSU9fVFlQRSwqUEZXX0NNRF9JT19UWVBFOwogCiAjZGVmaW5lIFJUX01BWF9MRF9TTE9UX05VTQkxMAogc3RydWN0IHJ0X2xpbmtfZGV0ZWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggMWYyYmM3YS4uMDlhMDJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTM2MCw3ICszNjAsNyBAQAogCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSk7CiAKIAlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKLQlyZXMgPSBjcnlwdC0+b3BzLT5kZWNyeXB0X21zZHUoc2tiLCBrZXlpZHgsIGhkcmxlbiwgY3J5cHQtPnByaXYpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdShza2IsIGtleWlkeCwgaGRybGVuLCBjcnlwdC0+cHJpdixpZWVlKTsKIAlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKIAlpZiAocmVzIDwgMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDRmMWYyZjAuLjAyODUwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMTYwLDcgKzE2MCw2IEBACiAJaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gbmg7CiAJaWVlZS0+bWdtdF9xdWV1ZV9yaW5nW25oXSA9IHNrYjsKIAotCS8vcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBza19idWZmICpkZXF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCkBAIC0xODMsMTkgKzE4Miw1MyBAQAogCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7CiB9CiAKK3U4CitNZ250UXVlcnlfVHhSYXRlRXhjbHVkZUNDS1JhdGVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXUxNglpOworCXU4CVF1ZXJ5UmF0ZSA9IDA7CisJdTgJQmFzaWNSYXRlOworCisKKwlmb3IoIGkgPSAwOyBpIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbjsgaSsrKQorCXsKKwkJQmFzaWNSYXRlID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzW2ldJjB4N0Y7CisJCWlmKCFpZWVlODAyMTFfaXNfY2NrX3JhdGUoQmFzaWNSYXRlKSkKKwkJeworCQkJaWYoUXVlcnlSYXRlID09IDApCisJCQl7CisJCQkJUXVlcnlSYXRlID0gQmFzaWNSYXRlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKEJhc2ljUmF0ZSA8IFF1ZXJ5UmF0ZSkKKwkJCQl7CisJCQkJCVF1ZXJ5UmF0ZSA9IEJhc2ljUmF0ZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihRdWVyeVJhdGUgPT0gMCkKKwl7CisJCVF1ZXJ5UmF0ZSA9IDEyOworCQlwcmludGsoIk5vIEJhc2ljUmF0ZSBmb3VuZCEhXG4iKTsKKwl9CisJcmV0dXJuIFF1ZXJ5UmF0ZTsKK30KIHU4IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJUFJUX0hJR0hfVEhST1VHSFBVVCAgICAgIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwogCXU4IHJhdGU7CiAKLQkvLyAyMDA4LzAxLzI1IE1IIEZvciBicm9hZGNvbSwgTUdOVCBmcmFtZSBzZXQgYXMgT0ZETSA2TS4KLQlpZihwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSkKLQkJcmF0ZSA9IDB4MGM7CisJaWYocEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9XQV9JT1RfQnJvYWRjb20pCisJeworCQlyYXRlID0gTWdudFF1ZXJ5X1R4UmF0ZUV4Y2x1ZGVDQ0tSYXRlcyhpZWVlKTsKKwl9CiAJZWxzZQogCQlyYXRlID0gaWVlZS0+YmFzaWNfcmF0ZSAmIDB4N2Y7CiAKIAlpZihyYXRlID09IDApewotCQkvLyAyMDA1LjAxLjI2LCBieSByY25qa28uCiAJCWlmKGllZWUtPm1vZGUgPT0gSUVFRV9BfHwKIAkJICAgaWVlZS0+bW9kZT09IElFRUVfTl81R3x8CiAJCSAgIChpZWVlLT5tb2RlPT0gSUVFRV9OXzI0RyYmIXBIVEluZm8tPmJDdXJTdXBwQ0NLKSkKQEAgLTIwMywxNyArMjM2LDYgQEAKIAkJZWxzZQogCQkJcmF0ZSA9IDB4MDI7CiAJfQotCi0JLyoKLQkvLyBEYXRhIHJhdGUgb2YgUHJvYmVSZXEgaXMgYWxyZWFkeSBkZWNpZGVkLiBBbm5pZSwgMjAwNS0wMy0zMQotCWlmKCBwTWdudEluZm8tPmJTY2FuSW5Qcm9ncmVzcyB8fCAocE1nbnRJbmZvLT5iRHVhbE1vZGVTY2FuU3RlcCE9MCkgKQotCXsKLQlpZihwTWdudEluZm8tPmRvdDExQ3VycmVudFdpcmVsZXNzTW9kZT09V0lSRUxFU1NfTU9ERV9BKQotCXJhdGUgPSAweDBjOwotCWVsc2UKLQlyYXRlID0gMHgwMjsKLQl9Ci0JICovCiAJcmV0dXJuIHJhdGU7CiB9CiAKQEAgLTI1MSw5ICsyNzMsNyBAQAogCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CiAKIAkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCi0JLy8JCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOwotCQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAkJfQogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKQEAgLTI3OSw5ICsyOTksNyBAQAogCQkJcHJpbnRrKCIlcygpOmluc2VydCB0byB3YWl0cXVldWUhXG4iLF9fRlVOQ1RJT05fXyk7CiAJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7CiAJCX0gZWxzZSB7Ci0JCQkvL3ByaW50aygiVFggcGFja2V0IVxuIik7CiAJCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKLQkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFncyk7CiAJfQpAQCAtMjkzLDE2ICszMTEsMjQgQEAKIAlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlciA9CiAJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCXUxNiBmYyx0eXBlLHN0eXBlOwogICAgICAgICBjYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyA4KTsKIAorCWZjID0gaGVhZGVyLT5mcmFtZV9jb250cm9sOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlzdHlwZSA9IFdMQU5fRkNfR0VUX1NUWVBFKGZjKTsKKworCisJaWYoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX1BTUE9MTCkKIAl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBNR05UX1FVRVVFOworCWVsc2UKKwkJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gSElHSF9RVUVVRTsKIAl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gTWdudFF1ZXJ5X01nbnRGcmFtZVR4UmF0ZShpZWVlKTsKIAl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKIAl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CiAJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7Ci0JLy9wcmludGsoIj09PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKIAlpZihzaW5nbGUpewotCisJCWlmKCEodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfQ1RMKSkgewogCQloZWFkZXItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CiAKIAkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQpAQCAtMzEwLDEyICszMzYsMTIgQEAKIAkJZWxzZQogCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKIAorCQl9CiAJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCi0JLy8JaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKIAogCX1lbHNlewotCisJCWlmKCEodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfQ1RMKSkgewogCQloZWFkZXItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CiAKIAkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQpAQCAtMzIzLDEwICszNDksMTAgQEAKIAkJZWxzZQogCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKIAorCQl9CiAJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOwogCiAJfQotCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiB9CiAKIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKQEAgLTM3MywyNCArMzk5LDE2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpZighaWVlZS0+aWVlZV91cCkKIAkJcmV0dXJuOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKIAlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CiAKIAlpZiAoc2tiKXsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7Ci0JCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJfQotLy8JaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKLS8vCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKIAotCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKIAlpZihpZWVlLT5iZWFjb25fdHhpbmcgJiYgaWVlZS0+aWVlZV91cCl7Ci0vLwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmJlYWNvbl90aW1lcikpCi0vLwkJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKIAkJbW9kX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsamlmZmllcysoTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC01KSkpOwogCX0KLQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKIH0KIAogCkBAIC00MTQsNyArNDMyLDYgQEAKIAlpZiAoc2tiKXsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycSsrOwotCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwogCX0KIH0KIApAQCAtNTg1LDEyICs2MDIsOCBAQAogCiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLS8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvL2llZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKIAogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKLS8vCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJaWVlZS0+c2Nhbl93YXRjaF9kb2cgPSAwOwogCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKIAkJaWVlZS0+c2Nhbm5pbmcgPSAwOwpAQCAtNTk4LDcgKzYxMSw2IEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CiAJfQogCi0vLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKIH0KIApAQCAtNjcyLDcgKzY4NCw2IEBACiAJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKIAotCS8vYXV0aC0+YWxnb3JpdGhtID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOwogCWlmKGllZWUtPmF1dGhfbW9kZSA9PSAwKQogCQlhdXRoLT5hbGdvcml0aG0gPSBXTEFOX0FVVEhfT1BFTjsKIAllbHNlIGlmKGllZWUtPmF1dGhfbW9kZSA9PSAxKQpAQCAtNjg5LDYgKzcwMCwyNiBAQAogCiB9CiAKK3ZvaWQgY29uc3RydWN0V01NSUUodTgqIHdtbWllLCB1OCogd21tX2xlbix1OCBvdWlfc3VidHlwZSkKK3sKKwl1OAlzelFvU09VSVtdID17MjIxLCAwLCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAwLCAxfTsKKworCWlmIChvdWlfc3VidHlwZSA9PSBPVUlfU1VCVFlQRV9RT1NfQ0FQQUJJKQorCXsKKwkJc3pRb1NPVUlbMF0gPSA0NjsKKwkJc3pRb1NPVUlbMV0gPSAqd21tX2xlbjsKKwkJbWVtY3B5KHdtbWllLHN6UW9TT1VJLDMpOworCQkqd21tX2xlbiA9IDM7CisJfQorCWVsc2UKKwl7CisJCXN6UW9TT1VJWzFdID0gKndtbV9sZW4gKyA2OworCQlzelFvU09VSVs2XSA9IG91aV9zdWJ0eXBlOworCQltZW1jcHkod21taWUsIHN6UW9TT1VJLCA4KTsKKwkJKih3bW1pZSs4KSA9IDA7CisJCSp3bW1fbGVuID0gOTsKKwl9Cit9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX3Byb2JlX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQogewpAQCAtNzA3LDE0ICs3MzgsMTggQEAKIAlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CiAJdTggZXJwaW5mb19jb250ZW50ID0gMDsKIAotCXU4KiB0bXBfaHRfY2FwX2J1ZjsKKwl1OCogdG1wX2h0X2NhcF9idWY9TlVMTDsKIAl1OCB0bXBfaHRfY2FwX2xlbj0wOwotCXU4KiB0bXBfaHRfaW5mb19idWY7CisJdTgqIHRtcF9odF9pbmZvX2J1Zj1OVUxMOwogCXU4IHRtcF9odF9pbmZvX2xlbj0wOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CiAJdTgqIHRtcF9nZW5lcmljX2llX2J1Zj1OVUxMOwogCXU4IHRtcF9nZW5lcmljX2llX2xlbj0wOwogCisKKwl1OCB3bW1pZVs5XSA9IHswfTsKKwl1OCB3bW1fbGVuID0gMDsKKwogCWlmKHJhdGVfZXhfbGVuID4gMCkgcmF0ZV9leF9sZW4rPTI7CiAKIAlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKQpAQCAtNzIyLDcgKzc1Nyw3IEBACiAJZWxzZQogCQlhdGltX2xlbiA9IDA7CiAKLSNpZiAxCisjaWYgMAogCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSkKIAkJZXJwX2xlbiA9IDM7CiAJZWxzZQpAQCAtNzQ3LDIyICs3ODIsMzUgQEAKIAkJKCgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgfHwgd3BhX2llX2xlbikpOwogCS8vSFQgcmFsYXRlZCBlbGVtZW50CiAjaWYgMQotCXRtcF9odF9jYXBfYnVmID0odTgqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7Ci0JdG1wX2h0X2NhcF9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKLQl0bXBfaHRfaW5mb19idWYgPSh1OCopICYoaWVlZS0+cEhUSW5mby0+U2VsZkhUSW5mbyk7Ci0JdG1wX2h0X2luZm9fbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVEluZm8pOwotCUhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoaWVlZSwgdG1wX2h0X2NhcF9idWYsICZ0bXBfaHRfY2FwX2xlbixlbmNyeXB0KTsKLQlIVENvbnN0cnVjdEluZm9FbGVtZW50KGllZWUsdG1wX2h0X2luZm9fYnVmLCZ0bXBfaHRfaW5mb19sZW4sIGVuY3J5cHQpOworCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KXsKKwkJdG1wX2h0X2NhcF9idWYgPSh1OCopICYoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKKwkJdG1wX2h0X2NhcF9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKKwkJdG1wX2h0X2luZm9fYnVmID0odTgqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVEluZm8pOworCQl0bXBfaHRfaW5mb19sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUSW5mbyk7CisKKwkJSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChpZWVlLCB0bXBfaHRfY2FwX2J1ZiwgJnRtcF9odF9jYXBfbGVuLGVuY3J5cHQpOworCisJCUhUQ29uc3RydWN0SW5mb0VsZW1lbnQoaWVlZSx0bXBfaHRfaW5mb19idWYsJnRtcF9odF9pbmZvX2xlbiwgZW5jcnlwdCk7CiAKIAotICAgICAgICBpZihwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKLSAgICAgICAgewotICAgICAgICAJdG1wX2dlbmVyaWNfaWVfYnVmID0gaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcjsKLQkJdG1wX2dlbmVyaWNfaWVfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXIpOwotCQlIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChpZWVlLCB0bXBfZ2VuZXJpY19pZV9idWYsICZ0bXBfZ2VuZXJpY19pZV9sZW4pOwotICAgICAgICB9Ci0vLwlwcmludGsoIj09PT09PT09PT09PT09PT50bXBfaHRfY2FwX2xlbiBpcyAlZCx0bXBfaHRfaW5mb19sZW4gaXMgJWQsIHRtcF9nZW5lcmljX2llX2xlbiBpcyAlZFxuIix0bXBfaHRfY2FwX2xlbix0bXBfaHRfaW5mb19sZW4sdG1wX2dlbmVyaWNfaWVfbGVuKTsKKwkJaWYocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCisJCXsKKwkJCXRtcF9nZW5lcmljX2llX2J1ZiA9IGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXI7CisJCQl0bXBfZ2VuZXJpY19pZV9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcik7CisJCQlIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChpZWVlLCB0bXBfZ2VuZXJpY19pZV9idWYsICZ0bXBfZ2VuZXJpY19pZV9sZW4pOworCQl9CisJfQogI2VuZGlmCisKKwlpZihpZWVlLT5xb3Nfc3VwcG9ydCl7CisKKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQl7CisJCQl3bW1fbGVuID0gMTsKKwkJCWNvbnN0cnVjdFdNTUlFKHdtbWllLCZ3bW1fbGVuLE9VSV9TVUJUWVBFX1dNTV9JTkZPKTsKKwkJfQorCX0KKwogCWJlYWNvbl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UpKzIrCiAJCXNzaWRfbGVuCiAJCSszIC8vY2hhbm5lbApAQCAtODI1LDcgKzg3Myw2IEBACiAJdTE2IHZhbDE2OwogCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9JQlNTX1NFVDsKIAkJKih0YWcrKykgPSAyOwotCQkvLyooKHUxNiopKHRhZykpID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKIAkJIHZhbDE2ID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKIAkJbWVtY3B5KCh1OCAqKXRhZywgKHU4ICopJnZhbDE2LCAyKTsKIAkJdGFnKz0yOwpAQCAtODU0LDcgKzkwMSw2IEBACiAJCXRhZyArPSB3cGFfaWVfbGVuOwogCX0KIAotCS8vc2tiLT5kZXYgPSBpZWVlLT5kZXY7CiAJcmV0dXJuIHNrYjsKIH0KIApAQCAtOTk2LDE5ICsxMDQyLDM5IEBACiB9CiAKIAoraW5saW5lIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqYnNzaWQpCit7CisJaW50IGkgPSAwOworCisJZG8KKwl7CisJCWlmICgoaWVlZS0+UE1LSURMaXN0W2ldLmJVc2VkKSAmJiAobWVtY21wKGllZWUtPlBNS0lETGlzdFtpXS5Cc3NpZCwgYnNzaWQsIEVUSF9BTEVOKSA9PSAwKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpKys7CisJCX0KKwl9IHdoaWxlIChpIDwgTlVNX1BNS0lEX0NBQ0hFKTsKKworCWlmIChpID09IE5VTV9QTUtJRF9DQUNIRSkKKwl7CisJCWkgPSAtMTsKKwl9CisJZWxzZQorCXsKKwl9CisKKwlyZXR1cm4gKGkpOworCit9CiBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKIAl1OCAqdGFnOy8vLCpyc25faWU7Ci0JLy9zaG9ydCBpbmZvX2FkZHIgPSAwOwotCS8vaW50IGk7Ci0JLy91MTYgc3VpdGVfY291bnQgPSAwOwotCS8vdTggc3VpdF9zZWxlY3QgPSAwOwotCS8vdW5zaWduZWQgaW50IHdwYV9sZW4gPSBiZWFjb24tPndwYV9pZV9sZW47Ci0JLy9mb3IgSFQKIAl1OCogaHRfY2FwX2J1ZiA9IE5VTEw7CiAJdTggaHRfY2FwX2xlbj0wOwogCXU4KiByZWFsdGVrX2llX2J1Zj1OVUxMOwpAQCAtMTAxOSw2ICsxMDg1LDcgQEAKIAl1bnNpZ25lZCBpbnQgY3h2ZXJudW1faWVfbGVuPTA7CiAJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKIAlpbnQgZW5jcnlwdDsKKwlpbnQJUE1LQ2FjaGVJZHg7CiAKIAl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKIAl1bnNpZ25lZCBpbnQgd21tX2luZm9fbGVuID0gYmVhY29uLT5xb3NfZGF0YS5zdXBwb3J0ZWQ/OTowOwpAQCAtMTA2MCw2ICsxMTI3LDE0IEBACiAJewogCQljeHZlcm51bV9pZV9sZW4gPSA1KzI7CiAJfQorCisJUE1LQ2FjaGVJZHggPSBTZWNJc0luUE1LSURMaXN0KGllZWUsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCk7CisJaWYgKFBNS0NhY2hlSWR4ID49IDApCisJeworCQl3cGFfaWVfbGVuICs9IDE4OworCQlwcmludGsoIltQTUsgY2FjaGVdOiBXUEEyIElFIGxlbmd0aDogJXhcbiIsIHdwYV9pZV9sZW4pOworCX0KKwogCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKyAyCiAJCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAogCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCkBAIC0xMTg3LDYgKzEyNjIsMTMgQEAKIAl0YWcgPSBza2JfcHV0KHNrYiwgd3BhX2llX2xlbik7CiAJaWYgKHdwYV9pZV9sZW4pewogCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCQlpZiAoUE1LQ2FjaGVJZHggPj0gMCkKKwkJeworCQkJdGFnID0gc2tiX3B1dChza2IsIDE4KTsKKwkJCSp0YWcgPSAxOworCQkJKih0YWcgKyAxKSA9IDA7CisJCQltZW1jcHkoKHRhZyArIDIpLCAmaWVlZS0+UE1LSURMaXN0W1BNS0NhY2hlSWR4XS5QTUtJRCwgMTYpOworCQl9CiAJfQogCiAJdGFnID0gc2tiX3B1dChza2Isd21tX2luZm9fbGVuKTsKQEAgLTEyMTUsOCArMTI5Nyw2IEBACiAJCQltZW1jcHkodGFnLCByZWFsdGVrX2llX2J1ZixyZWFsdGVrX2llX2xlbiAtMiApOwogCQl9CiAJfQotLy8JcHJpbnRrKCI8PT09PT0lcygpLCAlcCwgJXBcbiIsIF9fRlVOQ1RJT05fXywgaWVlZS0+ZGV2LCBpZWVlLT5kZXYtPmRldl9hZGRyKTsKLS8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAlyZXR1cm4gc2tiOwogfQogCkBAIC0xMjcxLDcgKzEzNTEsNiBAQAogCWVsc2V7CiAJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7Ci0JCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKIAkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpewpAQCAtMTI4Nyw3ICsxMzY2LDYgQEAKIAl1OCAqYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLS8vCWludCBobGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOwogCiAJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOwogCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOwpAQCAtMTMwNyw3ICsxMzg1LDYgQEAKIAogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCQltb2RfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lciwgamlmZmllcyArIChIWi8yKSk7Ci0JCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJfQogCWtmcmVlKGNoYWxsZW5nZSk7CiB9CkBAIC0xMzI4LDcgKzE0MDUsNiBAQAogCWVsc2V7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCW1vZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIpKTsKLQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAl9CiB9CiAKQEAgLTEzNTYsNyArMTQzMiw2IEBACiAJewogCQlwcmludGsoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBub3QgZW5hYmxlZCglZCwgJWQpXG4iLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKTsKIAkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKLQkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKIAl9CiAJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDIgKiAoMSArIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwvNTAwKTsKIAkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBhc3NvY2lhdGlvbi4KQEAgLTEzODgsNyArMTQ2Myw2IEBACiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAKIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7Ci0JLy9pZWVlLT5VcGRhdGVIYWxSQVRSVGFibGVIYW5kbGVyKGRldiwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CiAJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiB9CiAKQEAgLTE0MDQsOSArMTQ3OCwxNCBAQAogCiAJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKIAlwcmludGsoIj09PT4lcygpLCBjaGFuOiVkXG4iLCBfX0ZVTkNUSU9OX18sIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQkvL2llZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwogCUhUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOwogCisJaWYoaWVlZS0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpCisJeworICAgICAgICAgICAgcHJpbnRrKCI9PT09PT09PT09PT09PiVzKCk6UmYgc3RhdGUgaXMgZVJmT2ZmLCBzY2hlZHVsZSBpcHNsZWF2ZSB3cSBhZ2FpbixyZXR1cm5cbiIsX19GVU5DVElPTl9fKTsKKwkJdXAoJmllZWUtPnd4X3NlbSk7CisJCXJldHVybjsKKwl9CiAJaWVlZS0+YXNzb2NpYXRlX3NlcSA9IDE7CiAJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShpZWVlKTsKIApAQCAtMTQzMiwxNCArMTUxMSwxNiBAQAogCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKIAkJcmV0dXJuOwogCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmIChuZXQtPmNoYW5uZWwgPiBpZWVlLT5pYnNzX21heGpvaW5fY2hhbCkpCisJCXJldHVybjsKIAogCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKXsKIAkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBBUCBNQUMsIHdlIG5lZWQgYWxzbyB0aGUgZXNzaWQKIAkJICogVGhpcyBjb3VsZCBiZSBvYnRhaW5lZCBieSBiZWFjb25zIG9yLCBpZiB0aGUgbmV0d29yayBkb2VzIG5vdAogCQkgKiBicm9hZGNhc3QgaXQsIGl0IGNhbiBiZSBwdXQgbWFudWFsbHkuCiAJCSAqLwotCQlhcHNldCA9IGllZWUtPndhcF9zZXQ7Ly8obWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgemVybyxFVEhfQUxFTikhPTAgKTsKLQkJc3NpZHNldCA9IGllZWUtPnNzaWRfc2V0Oy8vaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gIT0gJ1wwJzsKKwkJYXBzZXQgPSBpZWVlLT53YXBfc2V0OworCQlzc2lkc2V0ID0gaWVlZS0+c3NpZF9zZXQ7CiAJCXNzaWRicm9hZCA9ICAhKG5ldC0+c3NpZF9sZW4gPT0gMCB8fCBuZXQtPnNzaWRbMF09PSAnXDAnKTsKIAkJYXBtYXRjaCA9IChtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBuZXQtPmJzc2lkLCBFVEhfQUxFTik9PTApOwogCQlzc2lkbWF0Y2ggPSAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IG5ldC0+c3NpZF9sZW4pJiZcCkBAIC0xNDgwLDcgKzE1NjEsNiBAQAogCQkJCQlpZWVlLT5Bc29jUmV0cnlDb3VudCA9IDA7CiAJCQkJCS8vZm9yIEhUIGJ5IGFteSAwODA1MTQKIAkJCQkJaWYoKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMSkgJiYKLQkJCQkJICAvLyAoaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUICYmIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkpCiAJCQkJCSAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkKIC8qV0IsIDIwMDguMDkuMDk6YkN1cnJlbnRIVFN1cHBvcnQgYW5kIGJFbmFibGVIVCB0d28gZmxhZ3MgYXJlIGdvaW5nIHRvIHB1dCB0b2dldGhlciB0byBjaGVjayB3aGV0aGVyIHdlIGFyZSBpbiBIVCBub3csIHNvIG5lZWRuJ3QgdG8gY2hlY2sgYkVuYWJsZUhUIGZsYWdzIGhlcmUuIFRoYXQncyBpcyB0byBzYXkgd2Ugd2lsbCBzZXQgdG8gSFQgc3VwcG9ydCB3aGVuZXZlciBqb2luZWQgQVAgaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgSFQuIEFuZCB3aGV0aGVyIHdlIGFyZSBpbiBIVCBvciBub3QsIHBsZWFzZSBjaGVjayBiQ3VycmVudEhUU3VwcG9ydCYmYkVuYWJsZUhUIG5vdyBwbGVhc2UuKi8KIAkJCQkJewpAQCAtMTUwOCw3ICsxNTg4LDYgQEAKIAkJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CiAJCQkJCX0KIAkJCQkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKLQkJCQkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKIAkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwogCQkJCX0KIApAQCAtMTU5OCw2ICsxNjc3LDE2IEBACiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSkKIAkJcmV0dXJuIC0xOyAvKiBjb3JydXB0ZWQgKi8KIAorICAgICAgICBpZigobWVtY21wKGhlYWRlci0+YWRkcjMsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSAhPSAwKSYmCisgICAgICAgICAgICAgICAgKG1lbWNtcChoZWFkZXItPmFkZHIzLCJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLEVUSF9BTEVOKSAhPSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYobWVtY21wKGhlYWRlci0+YWRkcjMsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSA9PSAwKSB7CisgICAgICAgIH0KKworICAgICAgICBpZihtZW1jbXAoaGVhZGVyLT5hZGRyMywiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIixFVEhfQUxFTikgPT0gMCkgeworICAgICAgICB9CiAJbWVtY3B5KHNyYyxoZWFkZXItPmFkZHIyLCBFVEhfQUxFTik7CiAKIAlza2JlbmQgPSAodTgqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOwpAQCAtMTYxNSw3ICsxNzA0LDYgQEAKIAkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBuZXh0IHRhZyAqLwogCX0KIAotCS8vSUVFRTgwMjExRE1FU0coIkNhcmQgTUFDIGFkZHJlc3MgaXMgIk1BQ1NUUiwgTUFDMlNUUihzcmMpKTsKIAlpZiAoc3NpZGxlbiA9PSAwKSByZXR1cm4gMTsKIAogCWlmICghc3NpZCkgcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLwpAQCAtMTY3MywxMSArMTc2MSw4IEBACiB7CiAJdTggZGVzdFtFVEhfQUxFTl07CiAKLQkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfcHJvYmVfcnErKzsKLQkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOwogCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKLQkJLy9JRUVFODAyMTFETUVTRygiV2FzIGZvciBtZSEiKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycysrOwogCQlpZWVlODAyMTFfcmVzcF90b19wcm9iZShpZWVlLCBkZXN0KTsKIAl9CkBAIC0xNjg4LDE0ICsxNzczLDEyIEBACiB7CiAJdTggZGVzdFtFVEhfQUxFTl07CiAJaW50IHN0YXR1czsKLQkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9ycSsrOwogCiAJc3RhdHVzID0gYXV0aF9ycV9wYXJzZShza2IsIGRlc3QpOwogCWlmIChzdGF0dXMgIT0gLTEpIHsKIAkJaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChpZWVlLCBzdGF0dXMsIGRlc3QpOwogCX0KLQkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOwogCiB9CiAKQEAgLTE3MDQsNyArMTc4Nyw2IEBACiB7CiAKIAl1OCBkZXN0W0VUSF9BTEVOXTsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOwogCWlmIChhc3NvY19ycV9wYXJzZShza2IsZGVzdCkgIT0gLTEpewpAQCAtMTczOSw3ICsxODIxLDYgQEAKIAkJcmV0dXJuIDA7CiAJKi8KIAlkdGltID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YTsKLQkvL3ByaW50aygiRFRJTVxuIik7CiAJaWYoIShkdGltICYgSUVFRTgwMjExX0RUSU1fVkFMSUQpKQogCQlyZXR1cm4gMDsKIAl0aW1lb3V0ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsgLy9zaG91bGQgd2UgdXNlIHBzX3RpbWVvdXQgdmFsdWUgb3IgYmVhY29uX2ludGVydmFsCkBAIC0xNzYyLDcgKzE4NDMsNiBAQAogCWlmKHRpbWVfbCl7CiAJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCiAJCQkrIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKLQkJLy8JKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpICogMTAwMDsKIAl9CiAKIAlpZih0aW1lX2gpewpAQCAtMTc5MCw3ICsxODcwLDYgQEAKIAkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8CiAJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKXsKIAotCS8vCSN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwogCiAJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDEpOwpAQCAtMTgwOSw3ICsxODg4LDYgQEAKIAkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldix0aCx0bCk7CiAKIAkJZWxzZSBpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7Ci0JCS8vCXByaW50aygic2VuZCBudWxsIDFcbiIpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAogCQkJaWYoaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkoaWVlZS0+ZGV2KSl7CkBAIC0xOTE4LDggKzE5OTYsNiBAQAogCQkJaWVlZTgwMjExX3J4X0RFTEJBKGllZWUsIHNrYik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLS8vCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLS8vCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgInVua25vd24gYWN0aW9uIGZyYW1lKCVkKVxuIiwgdG1wKTsKIAkJCWJyZWFrOwogCX0KIAlyZXR1cm47CkBAIC0xOTM2LDcgKzIwMTIsNiBAQAogCWludCBjaGxlbj0wOwogCWludCBhaWQ7CiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2NfcmVzcDsKLS8vCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQ7CiAJYm9vbCBiU3VwcG9ydE5tb2RlID0gdHJ1ZSwgYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsgLy9kZWZhdWx0IHN1cHBvcnQgTiBtb2RlLCBkaXNhYmxlIGhhbGZObW9kZQogCiAJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCkBAIC0yMDk1LDggKzIxNzAsNiBAQAogCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOwogCQkJCWllZWUtPmlzX3JvYW1pbmcgPSB0cnVlOwogCQkJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Ci0JCQkvLwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7Ci0JCQkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKIAkJCQlSZW1vdmVQZWVyVFMoaWVlZSwgaGVhZGVyLT5hZGRyMik7CiAJCQkJaWYoaWVlZS0+TGVkQ29udHJvbEhhbmRsZXIgIT0gTlVMTCkKIAkJCQkgICAgICAgIGllZWUtPkxlZENvbnRyb2xIYW5kbGVyKGllZWUtPmRldiwgTEVEX0NUTF9TVEFSVF9UT19MSU5LKTsgLy9hZGRlZCBieSBhbXkgZm9yIExFRCAwOTAzMTgKQEAgLTIxMTEsNyArMjE4NCw2IEBACiAJCQlicmVhazsKIAl9CiAKLQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNjMsMjIgKzIyMzUsMTYgQEAKIAkJCS8qIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAogCQkJICogdG8gY2hlY2sgaXQgYW55IG1vcmUuCiAJCQkgKiAqLwotCQkJLy9wcmludGsoImVycm9yOm5vIGRlc2NyaXB0b3IgbGVmdEBxdWV1ZV9pbmRleCAlZCwgJWQsICVkXG4iLCBxdWV1ZV9pbmRleCwgc2tiX3F1ZXVlX2xlbigmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSksIGllZWUtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhpZWVlLT5kZXYscXVldWVfaW5kZXgpKTsKLQkJCS8vaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKGllZWUpOwogCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0sIHR4Yi0+ZnJhZ21lbnRzW2ldKTsKIAkJfWVsc2V7CiAJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAogCQkJCQl0eGItPmZyYWdtZW50c1tpXSwKIAkJCQkJaWVlZS0+ZGV2LGllZWUtPnJhdGUpOwotCQkJLy9pZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQkvL2llZWUtPnN0YXRzLnR4X2J5dGVzICs9IHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW47Ci0JCQkvL2llZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCQl9CiAJfQogI2VuZGlmCiAJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CiAKLS8vZXhpdDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKIAogfQpAQCAtMjE5Nyw5ICsyMjYzLDcgQEAKIAkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCiAJCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKIAkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7Ci0JCQkJLy8oaSsxKTxpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3MpOwogCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOwotCQkvLwlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAkJfQogCX0KIApAQCAtMjI0OSw3ICsyMzEzLDYgQEAKIAkJCQlpZWVlLT5zZXFfY3RybFswXSsrOwogCiAJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7Ci0JCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwogCQl9CiAJfQogCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKQEAgLTIyNjcsMTUgKzIzMzAsMTIgQEAKIAogdm9pZCBpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwotCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwogCiAJaWYgKCEgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKIAkJbmV0aWZfc3RvcF9xdWV1ZShpZWVlLT5kZXYpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhzdG9wKys7CiAJfQogCWllZWUtPnF1ZXVlX3N0b3AgPSAxOwotCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CiAKIH0KIApAQCAtMjM2Miw3ICsyNDIyLDcgQEAKIAogLy8JaWYoKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpICYmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSkKIAlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKLQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGllZWUtPklic3NTdGFydENobmw7CiAJLyogaWYgbm90IHRoZW4gdGhlIHN0YXRlIGlzIG5vdCBsaW5rZWQuIE1heWJlIHRoZSB1c2VyIHN3aXRoY2VkIHRvCiAJICogYWQtaG9jIG1vZGUganVzdCBhZnRlciBiZWluZyBpbiBtb25pdG9yIG1vZGUsIG9yIGp1c3QgYWZ0ZXIKIAkgKiBiZWluZyB2ZXJ5IGZldyB0aW1lIGluIG1hbmFnZWQgbW9kZSAoc28gdGhlIGNhcmQgaGF2ZSBoYWQgbm8KQEAgLTI1MDksMTEgKzI1NjksOSBAQAogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKIAlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7CiAKLQkvL0xaTSBmb3IgdXNiIGRldiBjcmFzaC4KLQkvL2llZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CiAJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+bGlua19jaGFuZ2Vfd3EsIDApOwogCi0JLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwogCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKIAogfQpAQCAtMjY1Nyw4ICsyNzE1LDYgQEAKIAogCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID09IDApCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSAxMDA7Ci0vLwlwcmludGsoIj09PT4lcygpLCBjaGFuOiVkXG4iLCBfX0ZVTkNUSU9OX18sIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLS8vCWllZWUtPnNldF9jaGFuKGllZWUtPmRldixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CiAKICAgICAgICAJZm9yKGkgPSAwOyBpIDwgMTc7IGkrKykgewogCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKQEAgLTI3MjEsNyArMjc3Nyw2IEBACiAJaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFswXT0gMHhmZjsvL3N1cHBvcnQgTUNTIDB+NwogCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMV09IDB4ZmY7Ly9zdXBwb3J0IE1DUyA4fjE1CiAJaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFs0XT0gMHgwMTsKLQkvL2FkZGVkIGJ5IGFteQogCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CiAJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiAJaWVlZS0+aXNfc2V0X2tleSA9IGZhbHNlOwpAQCAtMjg5MSw4ICsyOTQ2LDYgQEAKIAogCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCiAJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOwotCS8vZWxzZQotCS8vCXJldCA9IC1FT1BOT1RTVVBQOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMxNzMsNyArMzIyNiw2IEBACiAJaW50IHJldD0wOwogCiAJZG93bigmaWVlZS0+d3hfc2VtKTsKLQkvL0lFRUVfREVCVUdfSU5GTygid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKIAogCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKIAkJcmV0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggNDg0YzNhYi4uYTZhNWQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTMyLDcgKzMyLDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgpAQCAtMjA4LDcgKzIwNyw2IEBACiAJLyogVG8gZW5jcnlwdCwgZnJhbWUgZm9ybWF0IGlzOgogCSAqIElWICg0IGJ5dGVzKSwgY2xlYXIgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVApLCBJQ1YgKDQgYnl0ZXMpICovCiAKLQkvLyBQUjogRklYTUU6IENvcGllZCBmcm9tIGhvc3RhcC4gQ2hlY2sgZnJhZ21lbnRhdGlvbi9NU0RVL01QRFUgZW5jcnlwdGlvbi4KIAkvKiBIb3N0LWJhc2VkIElFRUUgODAyLjExIGZyYWdtZW50YXRpb24gZm9yIFRYIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbwogCSAqIGNhbGwgYm90aCBNU0RVIGFuZCBNUERVIGVuY3J5cHRpb24gZnVuY3Rpb25zIGZyb20gaGVyZS4gKi8KIAlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKQEAgLTIzMSw3ICsyMjksNiBAQAogCiAKIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIpIHsKLQkvL2ludCBpOwogCWlmICh1bmxpa2VseSghdHhiKSkKIAkJcmV0dXJuOwogCWtmcmVlKHR4Yik7CkBAIC0yODAsNyArMjc3LDYgQEAKIAlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKIAkJcmV0dXJuIDA7CiAKLS8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAlpcCA9IGlwX2hkcihza2IpOwogCiAJc3dpdGNoIChpcC0+dG9zICYgMHhmYykgewpAQCAtNjgxLDEwICs2NzcsOCBAQAogCQlpZiAoZW5jcnlwdCkKIAkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfRkNUTF9XRVA7CiAJCWVsc2UKLQogICAgICAgICAgICAgICAgICAgICAgICAgZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQTsKIAotCQkvL2lmKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQogCQlpZihxb3NfYWN0aXZlZCkKIAkJCWZjIHw9IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQTsKIAkJZWxzZQpAQCAtNzY1LDcgKzc1OSw2IEBACiAJCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKIAkJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKIAotCQkvL2lmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkKIAkJaWYocW9zX2FjdGl2ZWQpCiAJCXsKIAkJCXR4Yi0+cXVldWVfaW5kZXggPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKQEAgLTgxMiw3ICs4MDUsNiBAQAogCQkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IHRha2VzIHRoZSByZW1haW5pbmcgbGVuZ3RoICovCiAJCQkJYnl0ZXMgPSBieXRlc19sYXN0X2ZyYWc7CiAJCQl9Ci0JCQkvL2lmKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQogCQkJaWYocW9zX2FjdGl2ZWQpCiAJCQl7CiAJCQkJLy8gYWRkIDEgb25seSBpbmRpY2F0ZSB0byBjb3JyZXNwb25kaW5nIHNlcSBudW1iZXIgY29udHJvbCAyMDA2LzcvMTIKQEAgLTg4OSw3ICs4ODEsNiBAQAogCQlpZiAoIHRjYl9kZXNjLT5iTXVsdGljYXN0IHx8ICB0Y2JfZGVzYy0+YkJyb2FkY2FzdCkKIAkJCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBpZWVlLT5iYXNpY19yYXRlOwogCQllbHNlCi0JCQkvL3RjYl9kZXNjLT5kYXRhX3JhdGUgPSBDVVJSRU5UX1JBVEUoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUsIGllZWUtPnJhdGUsIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSk7CiAJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gQ1VSUkVOVF9SQVRFKGllZWUtPm1vZGUsIGllZWUtPnJhdGUsIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSk7CiAJCWllZWU4MDIxMV9xdXJleV9TaG9ydFByZWFtYmxlTW9kZShpZWVlLCB0Y2JfZGVzYyk7CiAJCWllZWU4MDIxMV90eF9xdWVyeV9hZ2dfY2FwKGllZWUsIHR4Yi0+ZnJhZ21lbnRzWzBdLCB0Y2JfZGVzYyk7CkBAIC04OTcsOCArODg4LDYgQEAKIAkJaWVlZTgwMjExX3F1ZXJ5X0JhbmR3aWR0aE1vZGUoaWVlZSwgdGNiX2Rlc2MpOwogCQlpZWVlODAyMTFfcXVlcnlfcHJvdGVjdGlvbm1vZGUoaWVlZSwgdGNiX2Rlc2MsIHR4Yi0+ZnJhZ21lbnRzWzBdKTsKIAkJaWVlZTgwMjExX3F1ZXJ5X3NlcW51bShpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgaGVhZGVyLmFkZHIxKTsKLS8vCQlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgdHhiLT5mcmFnbWVudHNbMF0tPmRhdGEsIHR4Yi0+ZnJhZ21lbnRzWzBdLT5sZW4pOwotCQkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCB0Y2JfZGVzYywgc2l6ZW9mKGNiX2Rlc2MpKTsKICNlbmRpZgogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDJjZTViZDUuLjk4NGEzNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJLyogQWRkIHRoZSBFU1NJRCAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0vLwlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7CiAJaWYgKG5ldHdvcmstPnNzaWRfbGVuID09IDApIHsKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBzaXplb2YoIjxoaWRkZW4+Iik7CiAgICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7CkBAIC0yNDAsOSArMjM5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJY2hhciAqZXYgPSBleHRyYTsKLS8vCWNoYXIgKnN0b3AgPSBldiArIElXX1NDQU5fTUFYX0RBVEE7CiAJY2hhciAqc3RvcCA9IGV2ICsgd3JxdS0+ZGF0YS5sZW5ndGg7Ly9JV19TQ0FOX01BWF9EQVRBOwotCS8vY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKIAlpbnQgaSA9IDA7CiAJaW50IGVyciA9IDA7CiAJSUVFRTgwMjExX0RFQlVHX1dYKCJHZXR0aW5nIHNjYW5cbiIpOwpAQCAtNTExLDcgKzUwOCw2IEBACiAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0gewogICAgICAgICAgICAgICAgIC5mbGFncyA9IDAsCiAgICAgICAgIH07Ci0JLy9wcmludGsoIj09PT09PT5lbmNvZGluZyBmbGFnOiV4LGV4dCBmbGFnOiV4LCBleHQgYWxnOiVkXG4iLCBlbmNvZGluZy0+ZmxhZ3MsZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKICAgICAgICAgaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwogICAgICAgICBpZiAoaWR4KSB7CiAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCkBAIC01NjIsNyArNTU4LDYgQEAKICAgICAgICAgfQogCiAJc2VjLmVuYWJsZWQgPSAxOwotICAgIC8vICAgIHNlYy5lbmNyeXB0ID0gMTsKIAogICAgICAgICBzd2l0Y2ggKGV4dC0+YWxnKSB7CiAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CkBAIC01ODAsNyArNTc1LDcgQEAKICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgfQotCXByaW50aygiYWxnIG5hbWU6JXNcbiIsYWxnKTsKKwlJRUVFODAyMTFfREVCVUdfV1goImFsZyBuYW1lOiAlc1xuIiwgYWxnKTsKIAogCSBvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKICAgICAgICAgaWYgKG9wcyA9PSBOVUxMKQpAQCAtNjI0LDggKzYxOSw2IEBACiAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CiAjaWYgMQotIC8vc2tpcF9ob3N0X2NyeXB0OgotCS8vcHJpbnRrKCJza2lwX2hvc3RfY3J5cHQ6ZXh0X2ZsYWdzOiV4XG4iLCBleHQtPmV4dF9mbGFncyk7CiAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgewogICAgICAgICAgICAgICAgIGllZWUtPnR4X2tleWlkeCA9IGlkeDsKICAgICAgICAgICAgICAgICBzZWMuYWN0aXZlX2tleSA9IGlkeDsKQEAgLTYzMyw3ICs2MjYsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfTk9ORSkgewotICAgICAgICAgICAgICAgIC8vbWVtY3B5KHNlYy5rZXlzW2lkeF0sIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOwogICAgICAgICAgICAgICAgIHNlYy5rZXlfc2l6ZXNbaWR4XSA9IGV4dC0+a2V5X2xlbjsKICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gKDEgPDwgaWR4KTsKICAgICAgICAgICAgICAgICBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19XRVApIHsKQEAgLTY5MCw3ICs2ODIsNiBAQAogCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CiAgICAgICAgIGNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKIAkgICAgIC8qbmVlZCB0byBzdXBwb3J0IHdwYTIgaGVyZSovCi0JCS8vcHJpbnRrKCJ3cGEgdmVyc2lvbjoleFxuIiwgZGF0YS0+dmFsdWUpOwogCQlicmVhazsKICAgICAgICAgY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKICAgICAgICAgY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKQEAgLTcwOCw4ICs2OTksNiBAQAogCQlicmVhazsKIAogCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLQkJLy9wcmludGsoIj09PT09PT4lcygpOmRhdGEtPnZhbHVlIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxkYXRhLT52YWx1ZSk7Ci0JLy8JaWVlZS0+b3Blbl93ZXAgPSAoZGF0YS0+dmFsdWUmSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pPzE6MDsKIAkJaWYoZGF0YS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKXsKIAkJCWllZWUtPm9wZW5fd2VwID0gMDsKIAkJCWllZWUtPmF1dGhfbW9kZSA9IDE7CkBAIC03MjEsMTcgKzcxMCwxNCBAQAogCQllbHNlIGlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfTEVBUCl7CiAJCQlpZWVlLT5vcGVuX3dlcCA9IDE7CiAJCQlpZWVlLT5hdXRoX21vZGUgPSAyOwotCQkJLy9wcmludGsoImhhaGFoYWE6TEVBUFxuIik7CiAJCX0KIAkJZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCS8vcHJpbnRrKCJvcGVuX3dlcDolZFxuIiwgaWVlZS0+b3Blbl93ZXApOwogCQlicmVhazsKIAogI2lmIDEKIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CiAJCWllZWUtPndwYV9lbmFibGVkID0gKGRhdGEtPnZhbHVlKT8xOjA7Ci0JCS8vcHJpbnRrKCJlbmFibGUgd3BhOiVkXG4iLCBpZWVlLT53cGFfZW5hYmxlZCk7CiAJCWJyZWFrOwogCiAjZW5kaWYKQEAgLTc1NSw3ICs3NDEsNiBAQAogCiAJaWYgKGxlbj5NQVhfV1BBX0lFX0xFTiB8fCAobGVuICYmIGllID09IE5VTEwpKQogCXsKLQkvLwlwcmludGsoInJldHVybiBlcnJvciBvdXQsIGxlbjolZFxuIiwgbGVuKTsKIAlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfQkEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfQkEuaAppbmRleCA4ZGRjOGJmOS4uMWMyYTQwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfQkEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X0JBLmgKQEAgLTEsMyArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX0JBVFlQRV9IXwogI2RlZmluZSBfQkFUWVBFX0hfCiAKQEAgLTE4LDE0ICszNiw3IEBACiAjZGVmaW5lCURFTEJBX1JFQVNPTl9FTkRfQkEJCQkzNwogI2RlZmluZQlERUxCQV9SRUFTT05fVU5LTk9XTl9CQQkzOAogI2RlZmluZQlERUxCQV9SRUFTT05fVElNRU9VVAkJCTM5Ci0vKiAgd2hldGhlciBuZWVkIGRlZmluZSBCQSBBY3Rpb24gZnJhbWVzIGhlcmU/Ci1zdHJ1Y3QgaWVlZTgwMjExX0FEREJBX1JlcXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKLQl1OAljYXRlZ29yeTsKLQl1OAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0qLwotLy9JcyB0aGlzIG5lZWQ/SSBwdXQgaGVyZSBqdXN0IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlZmluZSBzdHJ1Y3R1cmUgQkFfUkVDT1JEIC8vV0IKKwogdHlwZWRlZiB1bmlvbiBfU0VRVUVOQ0VfQ09OVFJPTHsKIAl1MTYgU2hvcnREYXRhOwogCXN0cnVjdApAQCAtNjUsNSArNzYsNCBAQAogCVNFUVVFTkNFX0NPTlRST0wJQmFTdGFydFNlcUN0cmw7CiB9IEJBX1JFQ09SRCwgKlBCQV9SRUNPUkQ7CiAKLSNlbmRpZiAvL2VuZCBfQkFUWVBFX0hfCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKaW5kZXggOGMzN2RkMS4uY2E2MTFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCkBAIC0xLDkgKzEsMjEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBmaWxlIGlzIGNyZWF0ZWQgdG8gcHJvY2VzcyBCQSBBY3Rpb24gRnJhbWUuIEFjY29yZGluZyB0byA4MDIuMTEgc3BlYywgdGhlcmUgYXJlIDMgQkEgYWN0aW9uIHR5cGVzIGF0IGFsbC4gQW5kIGFzIEJBIGlzCi0gKiByZWxhdGVkIHRvIFRTLCB0aGlzIHBhcnQgbmVlZCBzb21lIHN0cnV0dXJlIGRlZmluZWQgaW4gUU9TIHNpZGUgY29kZS4gQWxzbyBUWCBSWCBpcyBnb2luZyB0byBiZSByZXN0dXJjdHVyZWQsIHNvIGhvdyB0byBzZW5kCi0gKiBBRERCQVJFUSBBRERCQVJTUCBhbmQgREVMQkEgcGFja2V0IGlzIHN0aWxsIG9uIGNvbnNpZGVyYXRpb24uIFRlbXBvcmFyaWx5IHVzZSBNQU5BR0UgUVVFVUUgaW5zdGVhZCBvZiBOb3JtYWwgUXVldWUuCi0gKiBXQiAyMDA4LTA1LTI3Ci0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAjaW5jbHVkZSAicnRsODE5eF9CQS5oIgogCkBAIC0xMTIsNyArMTI0LDYgQEAKIAl1OCogdGFnID0gTlVMTDsKIAl1MTYgdG1wID0gMDsKIAl1MTYgbGVuID0gaWVlZS0+dHhfaGVhZHJvb20gKyA5OwotCS8vY2F0ZWdvcnkoMSkgKyBhY3Rpb24gZmllbGQoMSkgKyBEaWFsb2cgVG9rZW4oMSkgKyBCQSBQYXJhbWV0ZXIgU2V0KDIpICsgIEJBIFRpbWVvdXQgVmFsdWUoMikgKyAgQkEgU3RhcnQgU2VxQ3RybCgyKShvciBTdGF0dXNDb2RlKDIpKQogCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFJBQ0UgfCBJRUVFODAyMTFfRExfQkEsICI9PT09PT09PT4lcygpLCBmcmFtZSglZCkgc2VudGQgdG86JXBNLCBpZWVlLT5kZXY6JXBcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSwgRHN0LCBpZWVlLT5kZXYpOwogCWlmIChwQkEgPT0gTlVMTHx8aWVlZSA9PSBOVUxMKQogCXsKQEAgLTEzOCw3ICsxNDksNiBAQAogCiAJQkFSZXEtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVCk7IC8vYWN0aW9uIGZyYW1lCiAKLQkvL3RhZyArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsgLy9tb3ZlIHRvIGFjdGlvbiBmaWVsZAogCXRhZyA9ICh1OCopc2tiX3B1dChza2IsIDkpOwogCSp0YWcgKys9IEFDVF9DQVRfQkE7CiAJKnRhZyArKz0gdHlwZTsKQEAgLTE3MSw3ICsxODEsNiBAQAogCiAJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAlyZXR1cm4gc2tiOwotCS8vcmV0dXJuIE5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTk2LDcgKzIwNSw2IEBACiAJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBEZWxiYSA9IE5VTEw7CiAJdTgqIHRhZyA9IE5VTEw7CiAJdTE2IHRtcCA9IDA7Ci0JLy9sZW4gPSBoZWFkIGxlbiArIERFTEJBIFBhcmFtZXRlciBTZXQoMikgKyBSZWFzb24gQ29kZSgyKQogCXUxNiBsZW4gPSA2ICsgaWVlZS0+dHhfaGVhZHJvb207CiAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQpAQCAtMjEzLDcgKzIyMSw2IEBACiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgYWxsb2Mgc2tiIGZvciBBRERCQV9SRVFcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0vLwltZW1zZXQoc2tiLT5kYXRhLCAwLCBsZW4rc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOwogCiAJRGVsYmEgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYl9wdXQoc2tiLHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKQEAgLTI1OCw5ICsyNjUsNiBAQAogCWlmIChza2IpCiAJewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQkvL2FkZCBzdGF0aXN0aWMgbmVlZGVkIGhlcmUuCi0JCS8vYW5kIHNrYiB3aWxsIGJlIGZyZWVkIGluIHNvZnRtYWNfbWdtdF94bWl0KCksIHNvIG9taXQgYWxsIGRldl9rZnJlZV9za2JfYW55KCkgb3V0c2lkZSBzb2Z0bWFjX21nbXRfeG1pdCgpCi0JCS8vV0IKIAl9CiAJZWxzZQogCXsKQEAgLTI4NCw3ICsyODgsNiBAQAogCWlmIChza2IpCiAJewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQkvL3NhbWUgYWJvdmUKIAl9CiAJZWxzZQogCXsKQEAgLTMxMSw3ICszMTQsNiBAQAogCWlmIChza2IpCiAJewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQkvL3NhbWUgYWJvdmUKIAl9CiAJZWxzZQogCXsKQEAgLTM2MSw4ICszNjMsNyBAQAogLy9zb21lIG90aGVyIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5IG5vdy4KIAlpZigJKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCkgfHwKIAkJKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKSB8fAotCQkoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9SRUpFQ1RfQUREQkFfUkVRKSkgLy98fAotCS8vCShpZWVlLT5wU3RhUW9zLT5iRW5hYmxlUnhJbW1CQSA9PSBmYWxzZSkJKQorCQkoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9SRUpFQ1RfQUREQkFfUkVRKSkKIAl7CiAJCXJjID0gQUREQkFfU1RBVFVTX1JFRlVTRUQ7CiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiRmFpbGVkIHRvIHJlcGx5IG9uIEFEREJBX1JFUSBhcyBzb21lIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5KCVkLCAlZClcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KTsKQEAgLTM5NCw3ICszOTUsNiBAQAogCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKIAl9CiAJCS8vIEFkbWl0IHRoZSBBRERCQSBSZXF1ZXN0Ci0JLy8KIAlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEpOwogCXBCQS0+RGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOwogCXBCQS0+QmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKQEAgLTQwNiwxMCArNDA2LDkgQEAKIAlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQnVmZmVyU2l6ZSA9IDE7CiAJZWxzZQogCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7Ci0JQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSwgMCk7Ly9wQkEtPkJhVGltZW91dFZhbHVlKTsKKwlBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJBLCAwKTsKIAlpZWVlODAyMTFfc2VuZF9BRERCQVJzcChpZWVlLCBkc3QsIHBCQSwgQUREQkFfU1RBVFVTX1NVQ0NFU1MpOwogCi0JLy8gRW5kIG9mIHByb2NlZHVyZS4KIAlyZXR1cm4gMDsKIAogT25BRERCQVJlcV9GYWlsOgpAQCAtNTQxLDExICs1NDAsMTEgQEAKIAkJcEFkbWl0dGVkQkEtPkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7CiAJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBKTsKIAkJQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBLCAqcEJhVGltZW91dFZhbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIERlbGF5IG5leHQgQUREQkEgcHJvY2Vzcy4KKwl9IGVsc2UgewogCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOworCQlwVFMtPmJEaXNhYmxlX0FkZEJhID0gdHJ1ZTsKKwkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9FTkRfQkE7CisJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CiAJfQogCiAJLy8gRW5kIG9mIHByb2NlZHVyZQpAQCAtNjM1LDcgKzYzNCw2IEBACiAJCXBUeFRzLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CiAJCXBUeFRzLT5iQWRkQmFSZXFEZWxheWVkID0gZmFsc2U7CiAJCWRlbF90aW1lcl9zeW5jKCZwVHhUcy0+VHNBZGRCYVRpbWVyKTsKLQkJLy9QbGF0Zm9ybUNhbmNlbFRpbWVyKEFkYXB0ZXIsICZwVHhUcy0+VHNBZGRCYVRpbWVyKTsKIAkJVHhUc0RlbGV0ZUJBKGllZWUsIHBUeFRzKTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X0hULmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X0hULmgKaW5kZXggYTk3YzkwMS4uMTcxMjE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9IVC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfSFQuaApAQCAtMSwzICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfUlRMODE5WFVfSFRUWVBFX0hfCiAjZGVmaW5lIF9SVEw4MTlYVV9IVFRZUEVfSF8KIApAQCAtMzgxLDggKzM5OSw3IEBACiAJdTE2CQkJCQliZEhUSW5mb0xlbjsKIAogCUhUX1NQRUNfVkVSCQkJCWJkSFRTcGVjVmVyOwotCS8vSFRfQ0FQQUJJTElUWV9FTEUJCQliZEhUQ2FwRWxlOwotCS8vSFRfSU5GT1JNQVRJT05fRUxFCQliZEhUSW5mb0VsZTsKKwlIVF9DSEFOTkVMX1dJRFRICQkJYmRCYW5kV2lkdGg7CiAKIAl1OAkJCQkJYmRSVDJSVEFnZ3JlZ2F0aW9uOwogCXU4CQkJCQliZFJUMlJUTG9uZ1Nsb3RUaW1lOwpAQCAtNDA2LDcgKzQyMyw3IEBACiAKIHR5cGVkZWYgc3RydWN0IF9GQUxTRV9BTEFSTV9TVEFUSVNUSUNTewogCXUzMglDbnRfUGFyaXR5X0ZhaWw7Ci0JdTMyICAgIENudF9SYXRlX0lsbGVnYWw7CisJdTMyCUNudF9SYXRlX0lsbGVnYWw7CiAJdTMyCUNudF9DcmM4X2ZhaWw7CiAJdTMyCUNudF9hbGw7CiB9RkFMU0VfQUxBUk1fU1RBVElTVElDUywgKlBGQUxTRV9BTEFSTV9TVEFUSVNUSUNTOwpAQCAtNDc2LDEwICs0OTMsOSBAQAogCUhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGID0gMHgwMDAwMDIwMCwKIAlIVF9JT1RfQUNUX0ZPUkNFRF9SVFMgPSAweDAwMDAwNDAwLAogCUhUX0lPVF9BQ1RfQU1TRFVfRU5BQkxFID0gMHgwMDAwMDgwMCwKLQlIVF9JT1RfQUNUX01JRF9ISUdIUE9XRVIgPSAweDAwMDAxMDAwLAotCUhUX0lPVF9BQ1RfUkVKRUNUX0FEREJBX1JFUSA9IDB4MDAwMDIwMDAsCi0JSFRfSU9UX0FDVF9BTExPV19QRUVSX0FHR19PTkVfUEtUID0gMHgwMDAwNDAwMCwKLQlIVF9JT1RfQUNUX0VEQ0FfQklBU19PTl9SWCA9IDB4MDAwMDgwMDAsCisJSFRfSU9UX0FDVF9SRUpFQ1RfQUREQkFfUkVRID0gMHgwMDAwMTAwMCwKKwlIVF9JT1RfQUNUX0FMTE9XX1BFRVJfQUdHX09ORV9QS1QgPSAweDAwMDAyMDAwLAorCUhUX0lPVF9BQ1RfRURDQV9CSUFTX09OX1JYID0gMHgwMDAwNDAwMCwKIAogCUhUX0lPVF9BQ1RfSFlCUklEX0FHR1JFR0FUSU9OID0gMHgwMDAxMDAwMCwKIAlIVF9JT1RfQUNUX0RJU0FCTEVfU0hPUlRfR0kgPSAweDAwMDIwMDAwLApAQCAtNDg3LDEyICs1MDMsMTkgQEAKIAlIVF9JT1RfQUNUX0RJU0FCTEVfVFhfNDBfTUhaID0gMHgwMDA4MDAwMCwKIAlIVF9JT1RfQUNUX1RYX05PX0FHR1JFR0FUSU9OID0gMHgwMDEwMDAwMCwKIAlIVF9JT1RfQUNUX0RJU0FCTEVfVFhfMlNTID0gMHgwMDIwMDAwMCwKKwkKKyAgICAgICAgSFRfSU9UX0FDVF9NSURfSElHSFBPV0VSID0gMHgwMDQwMDAwMCwKKyAgICAgICAgSFRfSU9UX0FDVF9OVUxMX0RBVEFfUE9XRVJfU0FWSU5HID0gMHgwMDgwMDAwMCwKKyAgICAgICAgCisgICAgICAgIEhUX0lPVF9BQ1RfRElTQUJMRV9DQ0tfUkFURSA9IDB4MDEwMDAwMDAsCisJSFRfSU9UX0FDVF9GT1JDRURfRU5BQkxFX0JFX1RYT1AgPSAweDAyMDAwMDAwLAorCUhUX0lPVF9BQ1RfV0FfSU9UX0Jyb2FkY29tID0gMHgwNDAwMDAwMCwKIH1IVF9JT1RfQUNUSU9OX0UsICpQSFRfSU9UX0FDVElPTl9FOwogCiB0eXBlZGVmIGVudW0gX0hUX0lPVF9SQUZVTkN7CisJSFRfSU9UX1JBRlVOQ19ESVNBQkxFX0FMTCA9IDB4MDAsCiAJSFRfSU9UX1JBRlVOQ19QRUVSXzFSID0gMHgwMSwKIAlIVF9JT1RfUkFGVU5DX1RYX0FNU0RVID0gMHgwMiwKLQlIVF9JT1RfUkFGVU5DX0RJU0FCTEVfQUxMID0gMHg4MCwKIH1IVF9JT1RfUkFGVU5DLCAqUEhUX0lPVF9SQUZVTkM7CiAKIHR5cGVkZWYgZW51bSBfUlRfSFRfQ0FQewpAQCAtNTA0LDUgKzUyNyw0IEBACiAJUlRfSFRfQ0FQX1VTRV85MlNFID0gMHgyMCwKIH1SVF9IVF9DQVBCSUxJVFksICpQUlRfSFRfQ0FQQklMSVRZOwogCi0jZW5kaWYgLy9fUlRMODE5WFVfSFRUWVBFX0hfCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKaW5kZXggMDExMTRjNS4uY2ZkOWExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCkBAIC0xLDUgKzEsMjEgQEAKLQotLy9BcyB0aGlzIGZ1bmN0aW9uIGlzIG1haW5seSBwb3J0ZWQgZnJvbSBXaW5kb3dzIGRyaXZlciwgc28gbGVhdmUgdGhlIG5hbWUgbGl0dGxlIGNoYW5nZWQuIElmIGFueSBjb25mdXNpb24gY2F1c2VkLCB0ZWxsIG1lLiBDcmVhdGVkIGJ5IFdCLiAyMDA4LjA1LjA4CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgImllZWU4MDIxMS5oIgogI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKIHU4IE1DU19GSUxURVJfQUxMWzE2XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKQEAgLTgsMzIgKzI0LDMxIEBACiAKIHUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA9CiAJewl7CXsxMywgMjYsIDM5LCA1MiwgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzggLDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLAotCQkJMzksIDc4LCAxMTcsIDIzNCwgMzEyLCAzNTEsIDM5MCwgNTIsIDEwNCwgMTU2LCAyMDgsIDMxMiwgNDE2LCA0NjgsIDUyMCwKKwkJCTM5LCA3OCwgMTE3LCAyMzQsIDMxMiwgMzUxLCAzOTAsIDUyLCAxMDQsIDE1NiwgMjA4LCAzMTIsIDQxNiwgNDY4LCA1MjAsIAogCQkJMCwgNzgsIDEwNCwgMTMwLCAxMTcsIDE1NiwgMTk1LCAxMDQsIDEzMCwgMTMwLCAxNTYsIDE4MiwgMTgyLCAyMDgsIDE1NiwgMTk1LAotCQkJMTk1LCAyMzQsIDI3MywgMjczLCAzMTIsIDEzMCwgMTU2LCAxODEsIDE1NiwgMTgxLCAyMDgsIDIzNCwgMjA4LCAyMzQsIDI2MCwgMjYwLAotCQkJMjg2LCAxOTUsIDIzNCwgMjczLCAyMzQsIDI3MywgMzEyLCAzNTEsIDMxMiwgMzUxLCAzOTAsIDM5MCwgNDI5fSwJCQkvLyBMb25nIEdJLCAyME1IegotCQkJezE0LCAyOSwgNDMsIDU4LCA4NywgMTE2LCAxMzAsIDE0NCwgMjksIDU4LCA4NywgMTE2LCAxNzMsIDIzMSwgMjYwLCAyODksCi0JCQk0MywgODcsIDEzMCwgMTczLCAyNjAsIDM0NywgMzkwLCA0MzMsIDU4LCAxMTYsIDE3MywgMjMxLCAzNDcsIDQ2MiwgNTIwLCA1NzgsCi0JCQkwLCA4NywgMTE2LCAxNDQsIDEzMCwgMTczLCAyMTcsIDExNiwgMTQ0LCAxNDQsIDE3MywgMjAyLCAyMDIsIDIzMSwgMTczLCAyMTcsCi0JCQkyMTcsIDI2MCwgMzAzLCAzMDMsIDM0NywgMTQ0LCAxNzMsIDIwMiwgMTczLCAyMDIsIDIzMSwgMjYwLCAyMzEsIDI2MCwgMjg5LCAyODksCi0JCQkzMTgsIDIxNywgMjYwLCAzMDMsIDI2MCwgMzAzLCAzNDcsIDM5MCwgMzQ3LCAzOTAsIDQzMywgNDMzLCA0Nzd9CX0sCQkvLyBTaG9ydCBHSSwgMjBNSHoKLQkJewl7MjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsCi0JCQk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLCAxMDgsIDIxNiwgMzI0LCA0MzIsIDY0OCwgODY0LCA5NzIsIDEwODAsCi0JCQkxMiwgMTYyLCAyMTYsIDI3MCwgMjQzLCAzMjQsIDQwNSwgMjE2LCAyNzAsIDI3MCwgMzI0LCAzNzgsIDM3OCwgNDMyLCAzMjQsIDQwNSwKLQkJCTQwNSwgNDg2LCA1NjcsIDU2NywgNjQ4LCAyNzAsIDMyNCwgMzc4LCAzMjQsIDM3OCwgNDMyLCA0ODYsIDQzMiwgNDg2LCA1NDAsIDU0MCwKLQkJCTU5NCwgNDA1LCA0ODYsIDU2NywgNDg2LCA1NjcsIDY0OCwgNzI5LCA2NDgsIDcyOSwgODEwLCA4MTAsIDg5MX0sIAkvLyBMb25nIEdJLCA0ME1IegotCQkJezMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLAotCQkJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMCwgMTIwLCAyNDAsIDM2MCwgNDgwLCA3MjAsIDk2MCwgMTA4MCwgMTIwMCwKLQkJCTEzLCAxODAsIDI0MCwgMzAwLCAyNzAsIDM2MCwgNDUwLCAyNDAsIDMwMCwgMzAwLCAzNjAsIDQyMCwgNDIwLCA0ODAsIDM2MCwgNDUwLAotCQkJNDUwLCA1NDAsIDYzMCwgNjMwLCA3MjAsIDMwMCwgMzYwLCA0MjAsIDM2MCwgNDIwLCA0ODAsIDU0MCwgNDgwLCA1NDAsIDYwMCwgNjAwLAotCQkJNjYwLCA0NTAsIDU0MCwgNjMwLCA1NDAsIDYzMCwgNzIwLCA4MTAsIDcyMCwgODEwLCA5MDAsIDkwMCwgOTkwfQl9CS8vIFNob3J0IEdJLCA0ME1IegorCQkJMTk1LCAyMzQsIDI3MywgMjczLCAzMTIsIDEzMCwgMTU2LCAxODEsIDE1NiwgMTgxLCAyMDgsIDIzNCwgMjA4LCAyMzQsIDI2MCwgMjYwLCAKKwkJCTI4NiwgMTk1LCAyMzQsIDI3MywgMjM0LCAyNzMsIDMxMiwgMzUxLCAzMTIsIDM1MSwgMzkwLCAzOTAsIDQyOX0sCQkJCisJCQl7MTQsIDI5LCA0MywgNTgsIDg3LCAxMTYsIDEzMCwgMTQ0LCAyOSwgNTgsIDg3LCAxMTYsIDE3MywgMjMxLCAyNjAsIDI4OSwgCisJCQk0MywgODcsIDEzMCwgMTczLCAyNjAsIDM0NywgMzkwLCA0MzMsIDU4LCAxMTYsIDE3MywgMjMxLCAzNDcsIDQ2MiwgNTIwLCA1NzgsIAorCQkJMCwgODcsIDExNiwgMTQ0LCAxMzAsIDE3MywgMjE3LCAxMTYsIDE0NCwgMTQ0LCAxNzMsIDIwMiwgMjAyLCAyMzEsIDE3MywgMjE3LCAKKwkJCTIxNywgMjYwLCAzMDMsIDMwMywgMzQ3LCAxNDQsIDE3MywgMjAyLCAxNzMsIDIwMiwgMjMxLCAyNjAsIDIzMSwgMjYwLCAyODksIDI4OSwgCisJCQkzMTgsIDIxNywgMjYwLCAzMDMsIDI2MCwgMzAzLCAzNDcsIDM5MCwgMzQ3LCAzOTAsIDQzMywgNDMzLCA0Nzd9CX0sCQkKKwkJewl7MjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIAorCQkJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwgMTA4LCAyMTYsIDMyNCwgNDMyLCA2NDgsIDg2NCwgOTcyLCAxMDgwLCAKKwkJCTEyLCAxNjIsIDIxNiwgMjcwLCAyNDMsIDMyNCwgNDA1LCAyMTYsIDI3MCwgMjcwLCAzMjQsIDM3OCwgMzc4LCA0MzIsIDMyNCwgNDA1LCAKKwkJCTQwNSwgNDg2LCA1NjcsIDU2NywgNjQ4LCAyNzAsIDMyNCwgMzc4LCAzMjQsIDM3OCwgNDMyLCA0ODYsIDQzMiwgNDg2LCA1NDAsIDU0MCwgCisJCQk1OTQsIDQwNSwgNDg2LCA1NjcsIDQ4NiwgNTY3LCA2NDgsIDcyOSwgNjQ4LCA3MjksIDgxMCwgODEwLCA4OTF9LCAJCisJCQl7MzAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIAorCQkJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMCwgMTIwLCAyNDAsIDM2MCwgNDgwLCA3MjAsIDk2MCwgMTA4MCwgMTIwMCwgCisJCQkxMywgMTgwLCAyNDAsIDMwMCwgMjcwLCAzNjAsIDQ1MCwgMjQwLCAzMDAsIDMwMCwgMzYwLCA0MjAsIDQyMCwgNDgwLCAzNjAsIDQ1MCwgCisJCQk0NTAsIDU0MCwgNjMwLCA2MzAsIDcyMCwgMzAwLCAzNjAsIDQyMCwgMzYwLCA0MjAsIDQ4MCwgNTQwLCA0ODAsIDU0MCwgNjAwLCA2MDAsIAorCQkJNjYwLCA0NTAsIDU0MCwgNjMwLCA1NDAsIDYzMCwgNzIwLCA4MTAsIDcyMCwgODEwLCA5MDAsIDkwMCwgOTkwfQl9CQogCX07CiAKIHN0YXRpYyB1OCBVTktOT1dOX0JPUkFEQ09NWzNdID0gezB4MDAsIDB4MTQsIDB4YmZ9Owogc3RhdGljIHU4IExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTVszXSA9IHsweDAwLCAweDFhLCAweDcwfTsKIHN0YXRpYyB1OCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT01bM10gPSB7MHgwMCwgMHgxZCwgMHg3ZX07Ci1zdGF0aWMgdTggTkVUR0VBUjgzNEJ2Ml9CUk9BRENPTVszXSA9IHsweDAwLCAweDFiLCAweDJmfTsKLXN0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LWzNdID0gezB4MDAsIDB4MTcsIDB4M2Z9OwkvL2Nvc2EgMDMyMDIwMDgKK3N0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LWzNdID0gezB4MDAsIDB4MTcsIDB4M2Z9OwkKIHN0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOS1szXSA9IHsweDAwLCAweDFjLCAweGRmfTsKIHN0YXRpYyB1OCBQQ0lfUkFMSU5LWzNdID0gezB4MDAsIDB4OTAsIDB4Y2N9Owogc3RhdGljIHU4IEVESU1BWF9SQUxJTktbM10gPSB7MHgwMCwgMHgwZSwgMHgyZX07CkBAIC00MSwxMCArNTYsOSBAQAogc3RhdGljIHU4IERMSU5LX0FUSEVST1NfMVszXSA9IHsweDAwLCAweDFjLCAweGYwfTsKIHN0YXRpYyB1OCBETElOS19BVEhFUk9TXzJbM10gPSB7MHgwMCwgMHgyMSwgMHg5MX07CiBzdGF0aWMgdTggQ0lTQ09fQlJPQURDT01bM10gPSB7MHgwMCwgMHgxNywgMHg5NH07CitzdGF0aWMgdTggTkVUR0VBUl9CUk9BRENPTVszXSA9IHsweDAwLCAweDFmLCAweDMzfTsKIHN0YXRpYyB1OCBMSU5LU1lTX01BUlZFTExfNDQwME5bM10gPSB7MHgwMCwgMHgxNCwgMHhhNH07Ci0vLyAyMDA4LzA0LzAxIE1IIEZvciBDaXNjbyBHIG1vZGUgUlggVFAgV2UgbmVlZCB0byBjaGFuZ2UgRlcgZHVyYXRpb24uIFNob3VsZCB3ZSBwdXQgdGhlCi0vLyBjb2RlIGluIG90aGVyIHBsYWNlPz8KLS8vc3RhdGljIHU4IFdJRklfQ0lTQ09fR19BUFszXSA9IHsweDAwLCAweDQwLCAweDk2fTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB1cGRhdGUgZGVmYXVsdCBzZXR0aW5ncyBpbiBwSFRJbmZvIHN0cnVjdHVyZQogICogICBpbnB1dDogIFBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbwpAQCAtNTUsMTAgKzY5LDcgQEAKIHZvaWQgSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKIHsKIAlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCS8vY29uc3QgdHlwZW9mKCAoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopMCktPnBIVEluZm8gKSAqX19tcHRyID0gJnBIVEluZm87CiAKLQkvL3ByaW50aygicEhUaW5mbzolcCwgJnBIVGluZm86JXAsIG1wdHI6JXAsICBvZmZzZXRvZjoleFxuIiwgcEhUSW5mbywgJnBIVEluZm8sIF9fbXB0ciwgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHBIVEluZm8pKTsKLQkvL3ByaW50aygiPT09PmllZWU6JXAsXG4iLCBpZWVlKTsKIAkvLyBTaG9ydEdJIHN1cHBvcnQKIAlwSFRJbmZvLT5iUmVnU2hvcnRHSTIwTUh6PSAxOwogCXBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHo9IDE7CkBAIC0yOTEsNyArMzAyLDYgQEAKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5EYXRhUmF0ZSkKIHsKLQkvL1BSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CiAJdTE2CQlDQ0tPRkRNUmF0ZVsxMl0gPSB7MHgwMiAsIDB4MDQgLCAweDBiICwgMHgxNiAsIDB4MGMgLCAweDEyICwgMHgxOCAsIDB4MjQgLCAweDMwICwgMHg0OCAsIDB4NjAgLCAweDZjfTsKIAl1OAlpczQwTUh6ID0gMDsKIAl1OAlpc1Nob3J0R0kgPSAwOwpAQCAtMzA3LDI4ICszMTcsMjQgQEAKIAkJCWlzNDBNSHogPSAwOwogCQkJaXNTaG9ydEdJID0gMDsKIAotCQkgICAgICAvLyBuRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSAxMjsKIAkJfQogCQllbHNlIGlmKG5EYXRhUmF0ZSA+PTB4MjAgICYmIG5EYXRhUmF0ZSA8PSAweDJmICkgLy8oMjcsIDQ0KQogCQl7CiAJCQlpczQwTUh6ID0gMTsKIAkJCWlzU2hvcnRHSSA9IDA7CiAKLQkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gMjg7CiAJCX0KIAkJZWxzZSBpZihuRGF0YVJhdGUgPj0gMHgzMCAgJiYgbkRhdGFSYXRlIDw9IDB4M2YgKSAgLy8oNDMsIDYwKQogCQl7CiAJCQlpczQwTUh6ID0gMDsKIAkJCWlzU2hvcnRHSSA9IDE7CiAKLQkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gNDQ7CiAJCX0KIAkJZWxzZSBpZihuRGF0YVJhdGUgPj0gMHg0MCAgJiYgbkRhdGFSYXRlIDw9IDB4NGYgKSAvLyg1OSwgNzYpCiAJCXsKIAkJCWlzNDBNSHogPSAxOwogCQkJaXNTaG9ydEdJID0gMTsKIAotCQkJLy9uRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSA2MDsKIAkJfQogCQlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldW25EYXRhUmF0ZSYweGZdOwogCX0KQEAgLTM1MSw3ICszNTcsNiBAQAogCWVsc2UgaWYoKG1lbWNtcChuZXQtPmJzc2lkLCBVTktOT1dOX0JPUkFEQ09NLCAzKT09MCkgfHwKICAgICAJCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApfHwKICAgICAJCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzNTBfTElOS1NZU1dSVDE1MF9CUk9BRENPTSwgMyk9PTApfHwKLSAgICAJCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIE5FVEdFQVI4MzRCdjJfQlJPQURDT00sIDMpPT0wKSB8fAogICAgIAkJICAgIChuZXQtPmJyb2FkY29tX2NhcF9leGlzdCkpCiAgICAgCQkgIHJldFZhbHVlID0gdHJ1ZTsKIAllbHNlIGlmKG5ldC0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uKQpAQCAtMzc5LDEzICszODQsMTUgQEAKIAkJaWYobmV0LT5ic3NodC5SVDJSVF9IVF9Nb2RlICYgUlRfSFRfQ0FQX1VTRV85MlNFKXsKIAkJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9SRUFMVEVLXzkyU0U7CiAJCX0KKwkJaWYobmV0LT5ic3NodC5SVDJSVF9IVF9Nb2RlICYgUlRfSFRfQ0FQX1VTRV9TT0ZUQVApeworCQkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSXzkyVV9TT0ZUQVA7CisJCX0KIAl9CiAJZWxzZSBpZihuZXQtPmJyb2FkY29tX2NhcF9leGlzdCkKIAkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0JST0FEQ09NOwogCWVsc2UgaWYoKG1lbWNtcChuZXQtPmJzc2lkLCBVTktOT1dOX0JPUkFEQ09NLCAzKT09MCkgfHwKIAkJCShtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NLCAzKT09MCl8fAotCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT00sIDMpPT0wKXx8Ci0JCQkobWVtY21wKG5ldC0+YnNzaWQsIE5FVEdFQVI4MzRCdjJfQlJPQURDT00sIDMpPT0wKSApCisJCQkobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzNTBfTElOS1NZU1dSVDE1MF9CUk9BRENPTSwgMyk9PTApKQogCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQlJPQURDT007CiAJZWxzZSBpZigobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzNWMV9SQUxJTkssIDMpPT0wKSB8fAogCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOSywgMyk9PTApIHx8CkBAIC0zOTgsNyArNDA1LDcgQEAKIAkJKG1lbWNtcChuZXQtPmJzc2lkLCBETElOS19BVEhFUk9TXzEsIDMpID09IDApfHwKIAkJKG1lbWNtcChuZXQtPmJzc2lkLCBETElOS19BVEhFUk9TXzIsIDMpID09IDApKQogCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQVRIRVJPUzsKLQllbHNlIGlmKG1lbWNtcChuZXQtPmJzc2lkLCBDSVNDT19CUk9BRENPTSwgMyk9PTApCisJZWxzZSBpZiAoKG1lbWNtcChuZXQtPmJzc2lkLCBDSVNDT19CUk9BRENPTSwgMyk9PTApfHxuZXQtPmNpc2NvX2NhcF9leGlzdCkKIAkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0NJU0NPOwogCWVsc2UgaWYgKChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU19NQVJWRUxMXzQ0MDBOLCAzKSA9PSAwKSB8fAogCQkgIG5ldC0+bWFydmVsbF9jYXBfZXhpc3QpCkBAIC00MzksMjUgKzQ0Niw2IEBACiBib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCiB7CiAJYm9vbCByZXRWYWx1ZSA9IGZhbHNlOwotCi0jaWZkZWYgVE9ETwotCS8vIEFwcGx5IGZvciA4MTl1IG9ubHkKLSNpZiAoSEFMX0NPREVfQkFTRT09UlRMODE5MikKLQotI2lmIChERVZfQlVTX1RZUEUgPT0gVVNCX0lOVEVSRkFDRSkKLQkvLyBBbHdheSBkaXNhYmxlIE1DUzE1IGJ5IEplcnJ5IENoYW5nJ3MgcmVxdWVzdC5ieSBFbWlseSwgMjAwOC4wNC4xNQotCXJldFZhbHVlID0gdHJ1ZTsKLSNlbGlmIChERVZfQlVTX1RZUEUgPT0gUENJX0lOVEVSRkFDRSkKLQkvLyBFbmFibGUgTUNTMTUgaWYgdGhlIHBlZXIgaXMgQ2lzY28gQVAuIGJ5IEVtaWx5LCAyMDA4LjA1LjEyCi0vLwlpZihwQnNzRGVzYy0+YkNpc2NvQ2FwRXhpc3QpCi0vLwkJcmV0VmFsdWUgPSBmYWxzZTsKLS8vCWVsc2UKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQkvLyBKZXJyeSBDaGFuZyBzdWdnZXN0IHRoYXQgODE5MCAxeDIgZG9lcyBub3QgbmVlZCB0byBkaXNhYmxlIE1DUzE1Ci0KIAlyZXR1cm4gcmV0VmFsdWU7CiB9CiAKQEAgLTYyNCwxNyArNjEyLDExIEBACiAgIEhUSU9UQWN0SXNFRENBQmlhc1J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKIHsKIAl1OAlyZXRWYWx1ZSA9IDA7Ci0JLy9pZihJU19IQVJEV0FSRV9UWVBFXzgxOTJTVShBZGFwdGVyKSkKIAlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwogCXsKLS8vI2lmIFVOREVSX1ZJU1RBCi0vLwkJaWYocEJzc0Rlc2MtPlZlbmRlcj09SFRfSU9UX1BFRVJfQVRIRVJPUyB8fAotLy8JCQlwQnNzRGVzYy0+VmVuZGVyPT1IVF9JT1RfUEVFUl9SQUxJTkspCi0vLyNlbHNlCiAJCWlmKHBIVEluZm8tPklPVFBlZXI9PUhUX0lPVF9QRUVSX0FUSEVST1MgfHwKIAkJICAgcEhUSW5mby0+SU9UUGVlcj09SFRfSU9UX1BFRVJfQlJPQURDT00gfHwKIAkJICAgcEhUSW5mby0+SU9UUGVlcj09SFRfSU9UX1BFRVJfUkFMSU5LKQotLy8jZW5kaWYKIAkJCXJldHVybiAxOwogCiAJfQpAQCAtNjQ5LDcgKzYzMSw2IEBACiAKIAlpZihwSFRJbmZvLT5JT1RQZWVyPT1IVF9JT1RfUEVFUl9SQUxJTkspCiAJewotCQlpZihuZXR3b3JrLT5ic3NodC5iZEhUMVIpCiAJCQlyZXRWYWx1ZSA9IDE7CiAJfQogCkBAIC02NjIsOSArNjQzLDEwIEBACiAJdTgJcmV0VmFsdWUgPSAwOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CiAKLQlpZihwSFRJbmZvLT5JT1RQZWVyPT1IVF9JT1RfUEVFUl9SQUxJTkspCisJaWYocEhUSW5mby0+SU9UUGVlcj09SFRfSU9UX1BFRVJfUkFMSU5LIHx8CisJCXBIVEluZm8tPklPVFBlZXI9PUhUX0lPVF9QRUVSX1JFQUxURUsgfHwKKwkJcEhUSW5mby0+SU9UUGVlcj09SFRfSU9UX1BFRVJfUkVBTFRFS185MlNFKQogCXsKLQkJaWYobmV0d29yay0+YnNzaHQuYmRIVDFSKQogCQkJcmV0VmFsdWUgPSAxOwogCX0KIApAQCAtNzE4LDggKzcwMCw3IEBACiAJCShLRVlfVFlQRV9XRVA0MCA9PSBpZWVlLT5ncm91cF9rZXlfdHlwZSkgfHwKIAkJKEtFWV9UWVBFX1RLSVAgPT0gaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUpICkKIAl7Ci0JCWlmKHBIVEluZm8tPklPVFBlZXI9PUhUX0lPVF9QRUVSX1JFQUxURUsgfHwKLQkJICAgIHBIVEluZm8tPklPVFBlZXI9PUhUX0lPVF9QRUVSX1VOS05PV04pCisJCWlmKHBIVEluZm8tPklPVFBlZXI9PUhUX0lPVF9QRUVSX1JFQUxURUspCiAJCQlyZXRWYWx1ZSA9IDE7CiAJfQogCkBAIC03NTEsMTAgKzczMiwxMSBAQAogewogCWJvb2wgCXJldFZhbHVlID0gZmFsc2U7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlpZihwSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX0JST0FEQ09NKQogCXsKLQkJaWYocEhUSW5mby0+SU9UUGVlciA9PSBIVF9JT1RfUEVFUl9NQVJWRUxMKQorCQlpZigobWVtY21wKG5ldHdvcmstPmJzc2lkLCBORVRHRUFSX0JST0FEQ09NLCAzKT09MCkKKwkJCSYmIChuZXR3b3JrLT5ic3NodC5iZEJhbmRXaWR0aCA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKSkKIAkJCXJldHVybiB0cnVlOwotCiAJfQogCXJldHVybiByZXRWYWx1ZTsKIH0KQEAgLTc4Myw3ICs3NjUsNiBAQAogewogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUID0gaWVlZS0+cEhUSW5mbzsKIAlQSFRfQ0FQQUJJTElUWV9FTEUgCXBDYXBFTEUgPSBOVUxMOwotCS8vdTggYklzRGVjbGFyZU1DUzEzOwogCiAJaWYgKChwb3NIVENhcCA9PSBOVUxMKSB8fCAocEhUID09IE5VTEwpKQogCXsKQEAgLTgxMywxMyArNzk0LDExIEBACiAJCXBDYXBFTEUtPkNobFdpZHRoID0gKHBIVC0+YlJlZ0JXNDBNSHo/MTowKTsKIAl9CiAKLS8vCXBDYXBFTEUtPkNobFdpZHRoIAkJPSAocEhULT5iUmVnQlc0ME1Iej8xOjApOwogCXBDYXBFTEUtPk1pbW9Qd3JTYXZlIAkJPSBwSFQtPlNlbGZNaW1vUHM7CiAJcENhcEVMRS0+R3JlZW5GaWVsZAkJPSAwOyAvLyBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBub3chIQogCXBDYXBFTEUtPlNob3J0R0kyME1oegkJPSAxOyAvLyBXZSBjYW4gcmVjZWl2ZSBTaG9ydCBHSSEhCiAJcENhcEVMRS0+U2hvcnRHSTQwTWh6CQk9IDE7IC8vIFdlIGNhbiByZWNlaXZlIFNob3J0IEdJISEKLQkvL0RiZ1ByaW50KCJUWCBIVCBjYXAvaW5mbyBlbGUgQlc9JWQgU0cyMD0lZCBTRzQwPSVkXG5cciIsCi0JCS8vcENhcEVMRS0+Q2hsV2lkdGgsIHBDYXBFTEUtPlNob3J0R0kyME1oeiwgcENhcEVMRS0+U2hvcnRHSTQwTWh6KTsKKwogCXBDYXBFTEUtPlR4U1RCQyAJCT0gMTsKIAlwQ2FwRUxFLT5SeFNUQkMgCQk9IDA7CiAJcENhcEVMRS0+RGVsYXlCQQkJPSAwOwkvLyBEbyBub3Qgc3VwcG9ydCBub3chIQpAQCAtODc5LDEyICs4NTgsNiBAQAogCWVsc2UKIAkJKmxlbiA9IDI2ICsgMjsKIAotCi0KLS8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBIHwgSUVFRTgwMjExX0RMX0hULCBwb3NIVENhcCwgKmxlbiAtMik7Ci0KLQkvL1ByaW50IGVhY2ggZmllbGQgaW4gZGV0YWlsLiBEcml2ZXIgc2hvdWxkIG5vdCBwcmludCBvdXQgdGhpcyBtZXNzYWdlIGJ5IGRlZmF1bHQKLS8vCUhURGVidWdIVENhcGFiaWxpdHkocG9zSFRDYXAsICh1OCopIkhUQ29uc3RydWN0Q2FwYWJpbGl0eSgpIik7CiAJcmV0dXJuOwogCiB9CkBAIC05MzgsOCArOTExLDYgQEAKIAkJLy9TVEEgc2hvdWxkIG5vdCBnZW5lcmF0ZSBIaWdoIFRocm91Z2hwdXQgSW5mb3JtYXRpb24gRWxlbWVudAogCQkqbGVuID0gMDsKIAl9Ci0JLy9JRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSB8IElFRUU4MDIxMV9ETF9IVCwgcG9zSFRJbmZvLCAqbGVuIC0gMik7Ci0JLy9IVERlYnVnSFRJbmZvKHBvc0hUSW5mbywgIkhUQ29uc3RydWN0SW5mb3JFbGVtZW50Iik7CiAJcmV0dXJuOwogfQogCkBAIC0xMDA1LDcgKzk3Niw2IEBACiAJKi8KIAogI2Vsc2UKLQkvLyBEbyBOb3RoaW5nCiAjZW5kaWYKIAogCXBvc1JUMlJUQWdnLT5MZW5ndGggPSA2OwpAQCAtMTE4OCwxMiArMTE1OCw3IEBACiAJCXJldHVybjsKIAl9CiAJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT4gSFRPbkFzc29jUnNwX3dxKCk6IEhUX0VOQUJMRVxuIik7Ci0vLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgcEhUSW5mby0+UGVlckhUQ2FwQnVmLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9FTEUpKTsKLS8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBzaXplb2YoSFRfSU5GT1JNQVRJT05fRUxFKSk7CiAKLS8vCUhURGVidWdIVENhcGFiaWxpdHkocEhUSW5mby0+UGVlckhUQ2FwQnVmLCJIVE9uQXNzb2NSc3Bfd3EiKTsKLS8vCUhURGVidWdIVEluZm8ocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwiSFRPbkFzc29jUnNwX3dxIik7Ci0JLy8KIAlpZighbWVtY21wKHBIVEluZm8tPlBlZXJIVENhcEJ1ZixFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCiAJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmcEhUSW5mby0+UGVlckhUQ2FwQnVmWzRdKTsKIAllbHNlCkBAIC0xMjA5LDEyICsxMTc0LDEwIEBACiAJLy8gQ29uZmlndXJhdGlvbnM6CiAJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQXxJRUVFODAyMTFfRExfSFQsIHBQZWVySFRDYXAsIHNpemVvZihIVF9DQVBBQklMSVRZX0VMRSkpOwotLy8JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0hULCBwUGVlckhUSW5mbywgc2l6ZW9mKEhUX0lORk9STUFUSU9OX0VMRSkpOwotCS8vIENvbmZpZyBTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCBzZXR0aW5nCi0JLy8KKwogCUhUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCAoSFRfQ0hBTk5FTF9XSURUSCkocFBlZXJIVENhcC0+Q2hsV2lkdGgpLCAoSFRfRVhUQ0hOTF9PRkZTRVQpKHBQZWVySFRJbmZvLT5FeHRDaGxPZmZzZXQpKTsKIAotLy8JaWYocEhUSW5mby0+YkN1ckJXNDBNSHogPT0gdHJ1ZSkKKwlpZihwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9PSB0cnVlKQogCQlwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ID0gKChwUGVlckhUSW5mby0+UmVjb21tZW1kZWRUeFdpZHRoID09IDEpP3RydWU6ZmFsc2UpOwogCiAJLy8KQEAgLTEyOTUsNyArMTI1OCw3IEBACiAKIAkvLyA8Mj4gU2V0IEFNUERVIE1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nCiAJLy8gODAyLjExbiAzLjAgc2VjdGlvbiA5LjdkLjMKLSNpZiAxCisjaWYgMAogCWlmKHBIVEluZm8tPk1QRFVfRGVuc2l0eSA+IHBQZWVySFRDYXAtPk1QRFVEZW5zaXR5KQogCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5NUERVX0RlbnNpdHk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9Rb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfUW9zLmgKaW5kZXggZDQ1NjVlYy4uOTI4MDYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9Rb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oCkBAIC0xLDMgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fSU5DX1FPU19UWVBFX0gKICNkZWZpbmUgX19JTkNfUU9TX1RZUEVfSAogCkBAIC0zNiwxOCArNTQsNiBAQAogCiAjZGVmaW5lCU1BWF9XTU1FTEVfTEVOR1RICTY0CiAKLS8vCi0vLyBRb1MgbW9kZS4KLS8vIGVudW0gMCwgMSwgMiwgNDogc2luY2Ugd2UgY2FuIHVzZSB0aGUgT1IofCkgb3BlcmF0aW9uLgotLy8KLS8vIFFPU19NT0RFIGlzIHJlZGVmaW5lZCBmb3IgZW51bSBjYW4ndCBiZSArKywgfCB1bmRlciBDKysgY29tcGlsZXIsIDIwMDYuMDUuMTcsIGJ5IHJjbmprby4KLS8vdHlwZWRlZgllbnVtIF9RT1NfTU9ERXsKLS8vCVFPU19ESVNBQkxFCQk9IDAsCi0vLwlRT1NfV01NCQkJPSAxLAotLy8JUU9TX0VEQ0EJCQk9IDIsCi0vLwlRT1NfSENDQQkJCT0gNCwKLS8vfVFPU19NT0RFLCpQUU9TX01PREU7Ci0vLwogdHlwZWRlZiB1MzIgUU9TX01PREUsICpQUU9TX01PREU7CiAjZGVmaW5lIFFPU19ESVNBQkxFCQkwCiAjZGVmaW5lIFFPU19XTU0JCQkxCkBAIC0yMTksMTkgKzIyNSw2IEBACiAKIH1RT1NfSU5GT19GSUVMRCwgKlBRT1NfSU5GT19GSUVMRDsKIAotLy8KLS8vIEFDSSB0byBBQyBjb2RpbmcuCi0vLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTMuCi0vLwotLy8gQUNfQ09ESU5HIGlzIHJlZGVmaW5lZCBmb3IgZW51bSBjYW4ndCBiZSArKywgfCB1bmRlciBDKysgY29tcGlsZXIsIDIwMDYuMDUuMTcsIGJ5IHJjbmprby4KLS8vdHlwZWRlZgllbnVtIF9BQ19DT0RJTkd7Ci0vLwlBQzBfQkUJPSAwLAkJLy8gQUNJOiAweDAwCS8vIEJlc3QgRWZmb3J0Ci0vLwlBQzFfQksJPSAxLAkJLy8gQUNJOiAweDAxCS8vIEJhY2tncm91bmQKLS8vCUFDMl9WSQk9IDIsCQkvLyBBQ0k6IDB4MTAJLy8gVmlkZW8KLS8vCUFDM19WTwk9IDMsCQkvLyBBQ0k6IDB4MTEJLy8gVm9pY2UKLS8vCUFDX01BWCA9IDQsCQkvLyBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwgZW51bS4KLS8vfUFDX0NPRElORywqUEFDX0NPRElORzsKLS8vCiB0eXBlZGVmIHUzMiBBQ19DT0RJTkc7CiAjZGVmaW5lIEFDMF9CRQkwCQkvLyBBQ0k6IDB4MDAJLy8gQmVzdCBFZmZvcnQKICNkZWZpbmUgQUMxX0JLCTEJCS8vIEFDSTogMHgwMQkvLyBCYWNrZ3JvdW5kCkBAIC0yNTIsNyArMjQ1LDcgQEAKIAkJdTgJQUNNOjE7CiAJCXU4CUFDSToyOwogCQl1OAlSZXNlcnZlZDoxOwotCX1mOwkvLyBGaWVsZAorCX1mOwogfUFDSV9BSUZTTiwgKlBBQ0lfQUlGU047CiAKIC8vCkBAIC0yNjUsNyArMjU4LDcgQEAKIAl7CiAJCXU4CUVDV21pbjo0OwogCQl1OAlFQ1dtYXg6NDsKLQl9ZjsJLy8gRmllbGQKKwl9ZjsKIH1FQ1csICpQRUNXOwogCiAvLwpAQCAtMjgxLDcgKzI3NCw3IEBACiAJCUFDSV9BSUZTTglBY2lBaWZzbjsKIAkJRUNXCQlFY3c7CiAJCXUxNgkJVFhPUExpbWl0OwotCX1mOwkvLyBGaWVsZAorCX1mOwogfUFDX1BBUkFNLCAqUEFDX1BBUkFNOwogCiAKQEAgLTM1NCw3ICszNDcsNyBAQAogCQl1MzIJTWluUGh5UmF0ZTsKIAkJdTE2CVN1cnBsdXNCYW5kd2lkdGhBbGxvd2FuY2U7CiAJCXUxNglNZWRpdW1UaW1lOwotCX0gZjsJLy8gRmllbGQKKwl9IGY7CiB9VFNQRUNfQk9EWSwgKlBUU1BFQ19CT0RZOwogCiAKQEAgLTM4NCw3ICszNzcsNiBAQAogCiAKIHR5cGVkZWYgc3RydWN0IF9BQ017Ci0vLwl1OAkJUmVnRW5hYmxlQUNNOwogCXU2NAkJVXNlZFRpbWU7CiAJdTY0CQlNZWRpdW1UaW1lOwogCXU4CQlId0FjbUN0bDsJLy8gVFJVRTogVXNlZFRpbWUgZXhjZWVkID0+IERvIE5PVCBVU0UgdGhpcyBBQy4gSXQgd2xsIGJlIHdyaXR0ZW4gdG8gQUNNX0NPTlRST0woMHhCRiBCSVQgMC8xLzIgaW4gODE4NUIpLgpAQCAtNDA0LDEwICszOTYsNiBAQAogI2RlZmluZQlHRVRfQkVfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMykKICNkZWZpbmUJU0VUX0JFX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQzKQogCi0KLS8vdHlwZWRlZiBzdHJ1Y3QgX1RDTEFTU3sKLS8vIFRPRE8KLS8vfSBUQ0xBU1MsICpQVENMQVNTOwogdHlwZWRlZiB1bmlvbiBfUU9TX1RDTEFTewogCiAJc3RydWN0IF9UWVBFX0dFTkVSQUx7CkBAIC00NTksMzIgKzQ0NywxMiBAQAogCX0gVFlQRTJfODAyMVE7CiB9IFFPU19UQ0xBUywgKlBRT1NfVENMQVM7CiAKLS8vdHlwZWRlZiBzdHJ1Y3QgX1dNTV9UU1RSRUFNewotLy8KLS8vLSBUU1BFQwotLy8tIEFDICh3aGljaCB0byBtYXBwaW5nKQotLy99IFdNTV9UU1RSRUFNLCAqUFdNTV9UU1RSRUFNOwogdHlwZWRlZiBzdHJ1Y3QgX1FPU19UU1RSRUFNewogCXU4CQkJQUM7CiAJV01NX1RTUEVDCQlUU3BlYzsKIAlRT1NfVENMQVMJCVRDbGFzczsKIH0gUU9TX1RTVFJFQU0sICpQUU9TX1RTVFJFQU07CiAKLS8vdHlwZWRlZiBzdHJ1Y3QgX1VfQVBTRHsKLS8vLSBUcmlnZ2VyRW5hYmxlIFs0XQotLy8tIE1heFNQTGVuZ3RoCi0vLy0gSGlnaGVzdEFjQnVmZmVyZWQKLS8vfSBVX0FQU0QsICpQVV9BUFNEOwotCi0vL2pvc2VwaCBUT0RPOgotLy8JVUFQU0QgZnVuY3Rpb24gc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IDIgZGF0YSBzdHJ1Y3R1cmUKLS8vCSJRb3MgY29udHJvbCBmaWVsZCIgYW5kICJRb3MgaW5mbyBmaWVsZCIKLS8vdHlwZWRlZiBzdHJ1Y3QgX1FPU19VQVBTRHsKLS8vCXU4CQkJYlRyaWdnZXJFbmFibGVbNF07Ci0vLwl1OCAJCQlNYXhTUExlbmd0aDsKLS8vCXU4CQkJSGlnaGVzdEJ1ZkFDOwotLy99IFFPU19VQVBTRCwgKlBRT1NfQVBTRDsKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFN0YXR1cyBDb2RlIGZpZWxkCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ5OCw3ICs0NjYsNiBAQAogLy8gUmVmOiBET1QxMV9RT1MgaW4gODE4NSBjb2RlLiBbZGVmLiBpbiBRb1NfbXAuaF0KIC8vCiB0eXBlZGVmIHN0cnVjdCBfU1RBX1FPU3sKLQkvL0RFQ0xBUkVfUlRfT0JKRUNUKFNUQV9RT1MpOwogCXU4CQkJCVdNTUlFQnVmW01BWF9XTU1FTEVfTEVOR1RIXTsKIAl1OCoJCQkJV01NSUU7CiAKQEAgLTU2NSwxOCArNTMyLDkgQEAKIAlBQ19QQVJBTQkJQWNQYXJhbWV0ZXJbNF07CiB9QlNTX1FPUywgKlBCU1NfUU9TOwogCi0KLS8vCi0vLyBSZWY6IHNRb1NDdGxMbmcgYW5kIFFvU0N0bCBkZWZpbml0aW9uIGluIDgxODUgUW9TIGNvZGUuCi0vLyNkZWZpbmUgUW9TQ3RsICAgKCgJKEFkYXB0ZXItPmJSZWdRb1MpICYmIChBZGFwdGVyLT5kb3QxMVFvUy5Rb1NNb2RlICYoUU9TX0VEQ0F8UU9TX0hDQ0EpKQkgICkgID9zUW9TQ3RsTG5nOjApCi0vLwogI2RlZmluZSBzUW9TQ3RsTG5nCQkJMgogI2RlZmluZQlRT1NfQ1RSTF9MRU4oX1Fvc01vZGUpCQkoKF9Rb3NNb2RlID4gUU9TX0RJU0FCTEUpPyBzUW9TQ3RsTG5nIDogMCkKIAotCi0vL0FkZGVkIGJ5IGpvc2VwaAotLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKLS8vI2RlZmluZSBVUDJBQyh1cCkJCQkoKHVwPDMpPygodXA9PTApPzE6MCk6KHVwPj4xKSkKICNkZWZpbmUgSXNBQ1ZhbGlkKGFjKQkJCSgoYWM8PTcgKT90cnVlOmZhbHNlICkKIAotI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKaW5kZXggYmFhYWMyMS4uYTA3YjIzNDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9UUy5oCkBAIC0xLDMgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9UU1RZUEVfSF8KICNkZWZpbmUgX1RTVFlQRV9IXwogI2luY2x1ZGUgInJ0bDgxOXhfUW9zLmgiCkBAIC0zMCwxMCArNDgsMTAgQEAKIAl1MTYJCQkJVHhDdXJTZXE7CiAJQkFfUkVDT1JECQkJVHhQZW5kaW5nQkFSZWNvcmQ7ICAJLy8gRm9yIEJBIE9yaWdpbmF0b3IKIAlCQV9SRUNPUkQJCQlUeEFkbWl0dGVkQkFSZWNvcmQ7CS8vIEZvciBCQSBPcmlnaW5hdG9yCi0vLwlRT1NfRExfUkVDT1JECQlETFJlY29yZDsKIAl1OAkJCQliQWRkQmFSZXFJblByb2dyZXNzOwogCXU4CQkJCWJBZGRCYVJlcURlbGF5ZWQ7CiAJdTgJCQkJYlVzaW5nQmE7CisJdTggCQkJCWJEaXNhYmxlX0FkZEJhOwogCXN0cnVjdCB0aW1lcl9saXN0CQlUc0FkZEJhVGltZXI7CiAJdTgJCQkJbnVtOwogfSBUWF9UU19SRUNPUkQsICpQVFhfVFNfUkVDT1JEOwpAQCAtNDgsOSArNjYsNiBAQAogCXUxNgkJCQlSeExhc3RTZXFOdW07CiAJdTgJCQkJUnhMYXN0RnJhZ051bTsKIAl1OAkJCQludW07Ci0vLwlRT1NfRExfUkVDT1JECQlETFJlY29yZDsKIH0gUlhfVFNfUkVDT1JELCAqUFJYX1RTX1JFQ09SRDsKIAotCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKaW5kZXggZGUxNDNlYy4uN2ZmYzA2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCkBAIC0xLDMgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yOSw3ICs0Nyw2IEBACiAKIAlQUlhfUkVPUkRFUl9FTlRSWSAJcFJlb3JkZXJFbnRyeSA9IE5VTEw7CiAKLQkvL3UzMiBmbGFncyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJc3RydWN0IGllZWU4MDIxMV9yeGIgKnN0YXRzX0luZGljYXRlQXJyYXlbUkVPUkRFUl9XSU5fU0laRV07CiAJdTggaW5kZXggPSAwOwpAQCAtMzcsNyArNTQsNiBAQAogCiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7Ci0JLy9QbGF0Zm9ybUFjcXVpcmVTcGluTG9jayhBZGFwdGVyLCBSVF9SWF9TUElOTE9DSyk7CiAJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCI9PT09PT09PT09PT09PT09PT0+JXMoKVxuIixfX0ZVTkNUSU9OX18pOwogCWlmKHBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSAhPSAweGZmZmYpCiAJewpAQCAtNzIsNyArODgsNiBAQAogCiAJaWYoaW5kZXg+MCkKIAl7Ci0JCS8vIFNldCBSeFRpbWVvdXRJbmRpY2F0ZVNlcSB0byAweGZmZmYgdG8gaW5kaWNhdGUgbm8gcGVuZGluZyBwYWNrZXRzIGluIGJ1ZmZlciBub3cuCiAJCXBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKIAogCQkvLyBJbmRpY2F0ZSBwYWNrZXRzCkBAIC04Miw2ICs5Nyw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJaWVlZTgwMjExX2luZGljYXRlX3BhY2tldHMoaWVlZSwgc3RhdHNfSW5kaWNhdGVBcnJheSwgaW5kZXgpOworCQkgYlBrdEluQnVmID0gZmFsc2U7CiAJfQogCiAJaWYoYlBrdEluQnVmICYmIChwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikpCkBAIC0xMjYsNiArMTQyLDcgQEAKIAlwVFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKIAlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSBmYWxzZTsKIAlwVFMtPmJVc2luZ0JhID0gZmFsc2U7CisJcFRTLT5iRGlzYWJsZV9BZGRCYSA9IGZhbHNlOwogCVJlc2V0QmFFbnRyeSgmcFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQpOyAvL0ZvciBCQSBPcmlnaW5hdG9yCiAJUmVzZXRCYUVudHJ5KCZwVFMtPlR4UGVuZGluZ0JBUmVjb3JkKTsKIH0KQEAgLTIxMiw3ICsyMjksNiBAQAogCX0KIAkvLyBJbml0aWFsaXplIHVudXNlZCBSeCBSZW9yZGVyIExpc3QuCiAJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7Ci0vLyNpZmRlZiBUT19ET19MSVNUCiAJZm9yKGNvdW50ID0gMDsgY291bnQgPCBSRU9SREVSX0VOVFJZX05VTTsgY291bnQrKykKIAl7CiAJCWxpc3RfYWRkX3RhaWwoICZwUnhSZW9yZGVyRW50cnktPkxpc3QsJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7CkBAIC0yMjAsNyArMjM2LDYgQEAKIAkJCWJyZWFrOwogCQlwUnhSZW9yZGVyRW50cnkgPSAmaWVlZS0+UnhSZW9yZGVyRW50cnlbY291bnQrMV07CiAJfQotLy8jZW5kaWYKIAogfQogCkBAIC0yMzYsNyArMjUxLDYgQEAKIAogUFRTX0NPTU1PTl9JTkZPIFNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KglBZGRyLCB1OCBUSUQsIFRSX1NFTEVDVAlUeFJ4U2VsZWN0KQogewotCS8vRElSRUNUSU9OX1ZBTFVFIAlkaXI7CiAJdTggCWRpcjsKIAlib29sCQkJCXNlYXJjaF9kaXJbNF0gPSB7MCwgMCwgMCwgMH07CiAJc3RydWN0IGxpc3RfaGVhZCoJCXBzZWFyY2hfbGlzdDsgLy9GSVhNRQpAQCAtMjgyLDE4ICsyOTYsMTUgQEAKIAllbHNlCiAJCXBzZWFyY2hfbGlzdCA9ICZpZWVlLT5SeF9UU19BZG1pdF9MaXN0OwogCi0JLy9mb3IoZGlyID0gRElSX1VQOyBkaXIgPD0gRElSX0JJX0RJUjsgZGlyKyspCiAJZm9yKGRpciA9IDA7IGRpciA8PSBESVJfQklfRElSOyBkaXIrKykKIAl7CiAJCWlmKHNlYXJjaF9kaXJbZGlyXSA9PWZhbHNlICkKIAkJCWNvbnRpbnVlOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBSZXQsIHBzZWFyY2hfbGlzdCwgTGlzdCl7Ci0JLy8JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICJBREQ6JXBNLCBUSUQ6JWQsIGRpcjolZFxuIiwgcFJldC0+QWRkciwgcFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNUU0lELCBwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y0RpcmVjdGlvbik7CiAJCQlpZiAobWVtY21wKHBSZXQtPkFkZHIsIEFkZHIsIDYpID09IDApCiAJCQkJaWYgKHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRCA9PSBUSUQpCiAJCQkJCWlmKHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjRGlyZWN0aW9uID09IGRpcikKIAkJCQkJewotCS8vCQkJCQlwcmludGsoIkJpbmdvISBnb3QgaXRcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIApAQCAtMzUyLDEwICszNjMsOSBAQAogCS8vCiAJaWYoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoQWRkcikgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoQWRkcikpCiAJewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImdldCBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdFxuIik7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiRVJSISBnZXQgVFMgZm9yIEJyb2FkY2FzdCBvciBNdWx0aWNhc3RcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMCkKIAkJVVAgPSAwOwogCWVsc2UKQEAgLTM2Myw3ICszNzMsNyBAQAogCQkvLyBJbiBXTU0gY2FzZTogd2UgdXNlIDQgVElEIG9ubHkKIAkJaWYgKCFJc0FDVmFsaWQoVElEKSkKIAkJewotCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgaW4gJXMoKSwgVElEKCVkKSBpcyBub3QgdmFsaWRcbiIsIF9fRlVOQ1RJT05fXywgVElEKTsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiRVJSISBpbiAlcygpLCBUSUQoJWQpIGlzIG5vdCB2YWxpZFxuIiwgX19GVU5DVElPTl9fLCBUSUQpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKQEAgLTQ3OCw3ICs0ODgsNiBAQAogCVRSX1NFTEVDVAkJCVR4UnhTZWxlY3QKIAkpCiB7Ci0JLy91MzIgZmxhZ3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCWRlbF90aW1lcl9zeW5jKCZwVHMtPlNldHVwVGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZwVHMtPkluYWN0VGltZXIpOwpAQCAtNDg2LDcgKzQ5NSw2IEBACiAKIAlpZihUeFJ4U2VsZWN0ID09IFJYX0RJUikKIAl7Ci0vLyNpZmRlZiBUT19ET19MSVNUCiAJCVBSWF9SRU9SREVSX0VOVFJZCXBSeFJlb3JkZXJFbnRyeTsKIAkJUFJYX1RTX1JFQ09SRCAJCXBSeFRTID0gKFBSWF9UU19SRUNPUkQpcFRzOwogCQlpZih0aW1lcl9wZW5kaW5nKCZwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQpAQCAtNDk0LDkgKzUwMiw3IEBACiAKICAgICAgICAgICAgICAgICB3aGlsZSghbGlzdF9lbXB0eSgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAgICAgIFBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcFJ4UmVvcmRlckVudHJ5ID0gbGlzdF9lbnRyeSgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOwogCQkJcFJ4UmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCgmcFJ4UmVvcmRlckVudHJ5LT5MaXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTUxNCwxMSArNTIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ4YiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZwUnhSZW9yZGVyRW50cnktPkxpc3QsJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOwogICAgICAgICAgICAgICAgIH0KLQotLy8jZW5kaWYKIAl9CiAJZWxzZQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTVV9IV0ltZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX0hXSW1nLmMKaW5kZXggYmE4ZTEyYy4uN2M0ZmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX0hXSW1nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX0hXSW1nLmMKQEAgLTkzLDcgKzkzLDcgQEAKIDB4OTAwLDB4MDAwMDAwMDAsCiAweDkwNCwweDAwMDAwMDIzLAogMHg5MDgsMHgwMDAwMDAwMCwKLTB4OTBjLDB4MDMzMjEzMzMsCisweDkwYywweDAxMTIxMzEzLAogMHhhMDAsMHgwMGQwNDdjOCwKIDB4YTA0LDB4ODBmZjAwMDgsCiAweGEwOCwweDhjY2Q4MzAwLApAQCAtMTM1LDcgKzEzNSw3IEBACiAweGM2OCwweDY5NTQzNDIwLAogMHhjNmMsMHg0MzNjMDA5NCwKIDB4YzcwLDB4MmM3ZjAwMGQsCi0weGM3NCwweDAxODYxNTViLAorMHhjNzQsMHgwMTg2MTc1YiwKIDB4Yzc4LDB4MDAwMDAwMWYsCiAweGM3YywweDAwYjkxNjEyLAogMHhjODAsMHg0MDAwMDEwMCwKQEAgLTI1NiwxMyArMjU2LDM0IEBACiB9OwogCiB1MzIgUnRsODE5MlNVUEhZX1JFR19BcnJheV9QR1tQSFlfUkVHX0FycmF5X1BHTGVuZ3RoXSA9IHsKLTB4ZTAwLDB4ZmZmZmZmZmYsMHgwNjA5MDkwOSwKLTB4ZTA0LDB4ZmZmZmZmZmYsMHgwMDAzMDQwNiwKKzB4ZTAwLDB4ZmZmZmZmZmYsMHgwNDA2MDYwNiwKKzB4ZTA0LDB4ZmZmZmZmZmYsMHgwMDAyMDIwNCwKIDB4ZTA4LDB4MDAwMGZmMDAsMHgwMDAwMDAwMCwKLTB4ZTEwLDB4ZmZmZmZmZmYsMHgwYTBjMGQwZSwKLTB4ZTE0LDB4ZmZmZmZmZmYsMHgwNDA3MDgwOSwKLTB4ZTE4LDB4ZmZmZmZmZmYsMHgwYTBjMGQwZSwKLTB4ZTFjLDB4ZmZmZmZmZmYsMHgwNDA3MDgwOSwKKzB4ZTEwLDB4ZmZmZmZmZmYsMHgwNDA4MDgwYSwKKzB4ZTE0LDB4ZmZmZmZmZmYsMHgwMDAyMDIwNCwKKzB4ZTE4LDB4ZmZmZmZmZmYsMHgwNDA4MDgwYSwKKzB4ZTFjLDB4ZmZmZmZmZmYsMHgwMDAyMDIwNCwKKzB4ZTAwLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTA0LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTA4LDB4MDAwMGZmMDAsMHgwMDAwMDAwMCwKKzB4ZTEwLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTE0LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTE4LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTFjLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTAwLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTA0LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTA4LDB4MDAwMGZmMDAsMHgwMDAwMDAwMCwKKzB4ZTEwLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTE0LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTE4LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTFjLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTAwLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTA0LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTA4LDB4MDAwMGZmMDAsMHgwMDAwMDAwMCwKKzB4ZTEwLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTE0LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTE4LDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKKzB4ZTFjLDB4ZmZmZmZmZmYsMHgwMDAwMDAwMCwKIH07CiAKIHUzMiBSdGw4MTkyU1VSYWRpb0FfMVRfQXJyYXlbUmFkaW9BXzFUX0FycmF5TGVuZ3RoXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTVV9IV0ltZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX0hXSW1nLmgKaW5kZXggMzZlODRhZi4uNjlhNjZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX0hXSW1nLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX0hXSW1nLmgKQEAgLTEsMyArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19JTkNfSEFMODE5MlNVX0ZXX0lNR19ICiAjZGVmaW5lIF9fSU5DX0hBTDgxOTJTVV9GV19JTUdfSAogCkBAIC0xOSw3ICszNyw3IEBACiBleHRlcm4gdTMyIFJ0bDgxOTJTVVBIWV9DaGFuZ2VUb18xVDJSQXJyYXlbUEhZX0NoYW5nZVRvXzFUMlJBcnJheUxlbmd0aF07CiAjZGVmaW5lIFBIWV9DaGFuZ2VUb18yVDJSQXJyYXlMZW5ndGggNDUKIGV4dGVybiB1MzIgUnRsODE5MlNVUEhZX0NoYW5nZVRvXzJUMlJBcnJheVtQSFlfQ2hhbmdlVG9fMlQyUkFycmF5TGVuZ3RoXTsKLSNkZWZpbmUgUEhZX1JFR19BcnJheV9QR0xlbmd0aCAyMQorI2RlZmluZSBQSFlfUkVHX0FycmF5X1BHTGVuZ3RoIDg0CiBleHRlcm4gdTMyIFJ0bDgxOTJTVVBIWV9SRUdfQXJyYXlfUEdbUEhZX1JFR19BcnJheV9QR0xlbmd0aF07CiAjZGVmaW5lIFJhZGlvQV8xVF9BcnJheUxlbmd0aCAyMDIKIGV4dGVybiB1MzIgUnRsODE5MlNVUmFkaW9BXzFUX0FycmF5W1JhZGlvQV8xVF9BcnJheUxlbmd0aF07CkBAIC0zOCw1ICs1Niw1IEBACiAjZGVmaW5lIEFHQ1RBQl9BcnJheUxlbmd0aCAzMjAKIGV4dGVybiB1MzIgUnRsODE5MlNVQUdDVEFCX0FycmF5W0FHQ1RBQl9BcnJheUxlbmd0aF07CiAKLSNlbmRpZiAvL19fSU5DX0hBTDgxOTJTVV9GV19JTUdfSAorI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTVV9sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTVV9sZWQuYwppbmRleCA2MDlkYmE2Li41ZDk2YjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU1VfbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNVX2xlZC5jCkBAIC0xMDg3LDIyICsxMDg3LDEzIEBACiAJc3RydWN0IG5ldF9kZXZpY2UgCSpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwogCXN0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKIAlzY2hlZHVsZV93b3JrKCYocHJpdi0+QmxpbmtXb3JrSXRlbSkpOwotI2VuZGlmCiB9CiAKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCiB2b2lkIEJsaW5rV29ya0l0ZW1DYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIEJsaW5rV29ya0l0ZW0pOwotI2Vsc2UKLXZvaWQgQmxpbmtXb3JrSXRlbUNhbGxiYWNrKHZvaWQgKiBDb250ZXh0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilDb250ZXh0OwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLSNlbmRpZgogCiAJUExFRF84MTl4VXNiCSBwTGVkID0gcHJpdi0+cExlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfRWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX0VmdXNlLmMKaW5kZXggZjBjZTY1Ni4uYmJlZmQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfRWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19FZnVzZS5jCkBAIC0xLDI3ICsxLDI2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiAgICAgKGMpIENvcHlyaWdodCAgMjAwOCwgUmVhbFRFSyBUZWNobm9sb2dpZXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBNb2R1bGU6CUVmdXNlLmMJKCBTb3VyY2UgQyBGaWxlKQorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KICAqCi0gKiBOb3RlOgkJQ29weSBmcm9tIFdNQUMgZm9yIHRoZSBmaXJzdCB2ZXJzaW9uISEhIQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKICAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCiAgKgotICogRnVuY3Rpb246Ci0gKgotICogRXhwb3J0OgotICoKLSAqIEFiYnJldjoKLSAqCi0gKiBIaXN0b3J5OgotICogRGF0YQkJCVdobwkJUmVtYXJrCi0gKgotICogMDkvMjMvMjAwOAlNSEMJCVBvcnRpbmcgRWZ1c2UgUi9XIEFQSSBmcm9tIFdNQUMuCi0gKiAxMS8xMC8yMDA4CU1IQwkJMS4gUG9ydGluZyBmcm9tIDg3MTIgRUZVU0UuCi0gKgkJCQkJCTIuIEFkZCBkZXNjcmlwdGlvbiBhbmQgcmVvcmdhbml6ZSBjb2RlIGFyY2guCi0gKiAxMS8xNi8yMDA4IAlNSEMJCTEuIFJlb3JnYW5pemUgY29kZSBhcmNoaXRlY3R1cmUuCi0gKgkJCQkJCTIuIFJlbmFtZSBmb3Igc29tZSBBUEkgYW5kIGNoYW5nZSBleHRlcm4gb3Igc3RhdGljIHR5cGUuCi0gKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAicjgxOTJVLmgiCiAjaW5jbHVkZSAicjgxOTJTX2h3LmgiCkBAIC0zMCwyMCArMjksMTQgQEAKICNpbmNsdWRlICJyODE5MlNfRWZ1c2UuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAotLy90eXBlZGVmICBpbnQJSU5UMzI7Ci0vLwotLy8gSW4gdGhlIGZ1dHVyZSwgd2Ugd2lsbCBhbHdheXMgc3VwcG9ydCBFRlVTRSEhCi0vLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSAJX1BPV0VST05fREVMQVlfCiAjZGVmaW5lIAlfUFJFX0VYRUNVVEVfUkVBRF9DTURfCiAKICNkZWZpbmUJCUVGVVNFX1JFUEVBVF9USFJFU0hPTERfCQkzCiAjZGVmaW5lCQlFRlVTRV9FUlJPRV9IQU5ETEUJCTEKIAotCi0vLyBGcm9tIDg3MTIhISEhIQogdHlwZWRlZiBzdHJ1Y3QgX0VGVVNFX01BUF9BewogCXU4IG9mZnNldDsJCS8vMH4xNQogCXU4IHdvcmRfc3RhcnQ7CS8vMH4zCkBAIC05MSwxNCArODQsMTEgQEAKIAl1OAkJdHhfcG93ZXJfZ1sxNF07CiB9OwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBMb2NhbCBDb25zdGFudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogY29uc3QgdTggTUFYX1BHUEtUX1NJWkUgPSA5OyAvL2hlYWRlcisgMiogNCB3b3JkcyAoQllURVMpCiBjb25zdCB1OCBQR1BLVF9EQVRBX1NJWkUgPSA4OyAvL0JZVEVTIHNpemVvZih1OCkqOAogY29uc3QgdTMyIEVGVVNFX01BWF9TSVpFID0gNTEyOwogCitjb25zdCB1OCBFRlVTRV9PT0JfUFJPVEVDVF9CWVRFUyA9IDE0OwogCiBjb25zdCBFRlVTRV9NQVAgUlRMODcxMl9TRElPX0VGVVNFX1RBQkxFW109ewogCQkJCS8vb2Zmc2V0CXdvcmRfcwlieXRlX3N0YXJ0CWJ5dGVfY250cwpAQCAtMTE3LDE1ICsxMDcsNiBAQAogLypUeFB3SW5kZXggKi8JezExCQksMAkJLDAJCQksMjgJfSAgLy8gNTh+NzNoICAzLi4uNAogfTsKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGxvY2FsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLy8KIC8vIEZyb20gV01BQyBFZnVzZSBvbmUgYnl0ZSBSL1cKIC8vCkBAIC0xNzYsNyArMTU3LDcgQEAKIC8vCiBzdGF0aWMJdTgKIGVmdXNlX1BnUGFja2V0UmVhZCgJc3RydWN0IG5ldF9kZXZpY2UqIGRldix1OAlvZmZzZXQsdTggKmRhdGEpOwotc3RhdGljCXU4CitzdGF0aWMJdTMyCiBlZnVzZV9QZ1BhY2tldFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsdTggb2Zmc2V0LHU4IHdvcmRfZW4sdTgJKmRhdGEpOwogc3RhdGljCXZvaWQKIGVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZCgJdTggd29yZF9lbix1OCAqc291cmRhdGEsdTggKnRhcmdldGRhdGEpOwpAQCAtMTk0LDcgKzE3NSw2IEBACiAjaWZkZWYgVE9fRE9fTElTVAogc3RhdGljIHZvaWQgZWZ1c2VfcmVnX2N0cmwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggYlBvd2VyT24pOwogI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCiAKQEAgLTI0Miw4ICsyMjIsNyBAQAogCS8vU2V0IEUtZnVzZSBwcm9ncmFtIHRpbWUgJiByZWFkIHRpbWUgOiAweDMwWzMwOjI0XT0xMTEwMDEwYgogCXdyaXRlX25pY19ieXRlKGRldiwgRUZVU0VfQ1RSTCszLCAweDcyKTsKIAotfQkvKiBFRlVTRV9Jbml0aWFsaXplICovCi0KK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CUVGVVNFX1JlYWQxQnl0ZQpAQCAtMzAyLDcgKzI4MSw3IEBACiAJZWxzZQogCQlyZXR1cm4gMHhGRjsKIAotfQkvKiBFRlVTRV9SZWFkMUJ5dGUgKi8KK30KIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMjQsMTMgKzMwMywxMCBAQAogZXh0ZXJuCXZvaWQKIEVGVVNFX1dyaXRlMUJ5dGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTE2IEFkZHJlc3MsdTggVmFsdWUpCiB7Ci0JLy91OAlkYXRhOwogCXU4CUJ5dGV0ZW1wID0gezB4MDB9OwogCXU4CXRlbXAgPSB7MHgwMH07CiAJdTMyCWs9MDsKIAotCS8vUlRfVFJBQ0UoQ09NUF9FRlVTRSwgIkFkZHI9JXggRGF0YSA9JXhcbiIsIEFkZHJlc3MsIFZhbHVlKTsKLQogCWlmKCBBZGRyZXNzIDwgRUZVU0VfTUFDX0xFTikJLy9FLWZ1c2UgNTEyQnl0ZQogCXsKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBFRlVTRV9DVFJMLCBWYWx1ZSk7CkBAIC0zNDksNyArMzI1LDYgQEAKIAkJdGVtcCA9IEJ5dGV0ZW1wIHwgMHg4MDsKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBFRlVTRV9DVFJMKzMsIHRlbXApOwogCi0JCS8vV2FpdCBXcml0ZS1yZWFkeSAoMHgzMFszMV09MCkKIAkJQnl0ZXRlbXAgPSByZWFkX25pY19ieXRlKGRldiwgRUZVU0VfQ1RSTCszKTsKIAkJd2hpbGUoQnl0ZXRlbXAgJiAweDgwKQogCQl7CkBAIC0zNjMsOCArMzM4LDcgQEAKIAkJfQogCX0KIAotfQkvKiBFRlVTRV9Xcml0ZTFCeXRlICovCi0KK30KIAogI2lmZGVmIEVGVVNFX0ZPUl85MlNVCiAvLwpAQCAtMzgwLDEyICszNTQsMTAgQEAKIC8vCiB2b2lkIGRvXzkzYzQ2KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsICB1OCBhZGRvcnZhbHVlKQogewotICAgIAkvL3U4ICBjbGVhclsxXSA9IHsweDB9OyAgICAgIC8vIGNzPTAgLCBzaz0wICwgZGk9MCAsIGRvPTAKIAl1OCAgY3NbMV0gPSB7MHg4OH07ICAgICAgICAvLyBjcz0xICwgc2s9MCAsIGRpPTAgLCBkbz0wCiAJdTggIGNzc2tbMV0gPSB7MHg4Y307ICAgICAgLy8gY3M9MSAsIHNrPTEgLCBkaT0wICwgZG89MAogCXU4ICBjc2RpWzFdID0gezB4OGF9OyAgICAgIC8vIGNzPTEgLCBzaz0wICwgZGk9MSAsIGRvPTAKICAgICAJdTggIGNzc2tkaVsxXSA9IHsweDhlfTsgICAgLy8gY3M9MSAsIHNrPTEgLCBkaT0xICwgZG89MAotCS8vdTggIGRpWzFdID0gezB4ODJ9OyAgICAgICAgLy8gY3M9MCAsIHNrPTAgLCBkaT0xICwgZG89MAogICAgIAl1OCAgY291bnQ7CiAKICAgICAJZm9yKGNvdW50PTAgOyBjb3VudDw4IDsgY291bnQrKykKQEAgLTQyNCw3ICszOTYsNiBAQAogCXU4ICAJY3Nza1sxXSA9IHsweDhjfTsgICAgICAvLyBjcz0xICwgc2s9MSAsIGRpPTAgLCBkbz0wCiAJdTggIAljc2RpWzFdID0gezB4OGF9OyAgICAgIC8vIGNzPTEgLCBzaz0wICwgZGk9MSAsIGRvPTAKICAgIAl1OCAgCWNzc2tkaVsxXSA9IHsweDhlfTsgICAgLy8gY3M9MSAsIHNrPTEgLCBkaT0xICwgZG89MAotCS8vdTggIAlkaVsxXSA9IHsweDgyfTsgICAgICAgIC8vIGNzPTAgLCBzaz0wICwgZGk9MSAsIGRvPTAKIAl1OCAgCUVlcHJvbVNFTFsxXT17MHgwMH07CiAJdTggIAlhZGRyZXNzOwogCkBAIC00MzQsNyArNDA1LDYgQEAKIAogCWFkZHJlc3MgPSAodTgpUmVnOwogCi0JLy8gU3VnZ2VzdGVkIGJ5IFNEMSBBbGV4LCAyMDA4LjEwLjIwLiBSZXZpc2VkIGJ5IFJvZ2VyLgogCSpFZXByb21TRUw9IHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpOwogCiAJaWYoKCpFZXByb21TRUwgJiAweDEwKSA9PSAweDEwKSAvLyBzZWxlY3QgOTNjNDYKQEAgLTQ4NiwxMyArNDU2LDEwIEBACiB2b2lkCiBSZWFkRUZ1c2VCeXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsdTE2IF9vZmZzZXQsIHU4ICpwYnVmKQogewotCi0JLy91MTYgCWluZGV4az0wOwogCXUzMiAgdmFsdWUzMjsKIAl1OCAJcmVhZGJ5dGU7CiAJdTE2IAlyZXRyeTsKIAotCiAJLy9Xcml0ZSBBZGRyZXNzCiAJd3JpdGVfbmljX2J5dGUoZGV2LCBFRlVTRV9DVFJMKzEsIChfb2Zmc2V0ICYgMHhmZikpOwogCXJlYWRieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEVGVVNFX0NUUkwrMik7CkBAIC01MDUsNyArNDcyLDYgQEAKIAkvL0NoZWNrIGJpdCAzMiByZWFkLXJlYWR5CiAJcmV0cnkgPSAwOwogCXZhbHVlMzIgPSByZWFkX25pY19kd29yZChkZXYsIEVGVVNFX0NUUkwpOwotCS8vd2hpbGUoISgoKHZhbHVlMzIgPj4gMjQpICYgMHhmZikgJiAweDgwKSAgJiYgKHJldHJ5PDEwKSkKIAl3aGlsZSghKCgodmFsdWUzMiA+PiAyNCkgJiAweGZmKSAmIDB4ODApICAmJiAocmV0cnk8MTAwMDApKQogCXsKIAkJdmFsdWUzMiA9IHJlYWRfbmljX2R3b3JkKGRldiwgRUZVU0VfQ1RSTCk7CkBAIC01MzIsNzggKzQ5OCwxNDUgQEAKIFJlYWRFRnVzZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MTYJIF9vZmZzZXQsIHUxNiBfc2l6ZV9ieXRlLCB1OCAqcGJ1ZikKIHsKIAotCXU4ICAJZWZ1c2VUYmxbMTI4XTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggIAllZnVzZVRibFtFRlVTRV9NQVBfTEVOXTsKIAl1OCAgCXJ0ZW1wOFsxXTsKIAl1MTYgCWVGdXNlX0FkZHIgPSAwOwogCXU4ICAJb2Zmc2V0LCB3cmVuOwogCXUxNiAgCWksIGo7Ci0JdTE2IAllRnVzZVdvcmRbMTZdWzRdOy8vID0gezB4RkZ9Oy8vRklYTFpNCisJdTE2IAllRnVzZVdvcmRbRUZVU0VfTUFYX1NFQ1RJT05dW0VGVVNFX01BWF9XT1JEX1VOSVRdOworCXUxNgllZnVzZV91dGlsaXplZCA9IDA7CisJdTE2CWVmdXNlX3VzYWdlID0gMDsKIAotCWZvcihpPTA7IGk8MTY7IGkrKykKLQkJZm9yKGo9MDsgajw0OyBqKyspCi0JCQllRnVzZVdvcmRbaV1bal09MHhGRjsKLQotCS8vIERvIE5PVCBleGNlc3MgdG90YWwgc2l6ZSBvZiBFRnVzZSB0YWJsZS4gQWRkZWQgYnkgUm9nZXIsIDIwMDguMTEuMTAuCi0JaWYoKF9vZmZzZXQgKyBfc2l6ZV9ieXRlKT4xMjgpCi0Jey8vIHRvdGFsIEUtRnVzZSB0YWJsZSBpcyAxMjhieXRlcwotCQkvL1JUX1RSQUNFKENPTVBfRUZVU0UsICJSZWFkRUZ1c2UoKTogSW52YWxpZCBvZmZzZXQoJSN4KSB3aXRoIHJlYWQgYnl0ZXMoJSN4KSEhXG4iLF9vZmZzZXQsIF9zaXplX2J5dGUpOworCWlmKChfb2Zmc2V0ICsgX3NpemVfYnl0ZSk+RUZVU0VfTUFQX0xFTikKKwl7CiAJCXByaW50aygiUmVhZEVGdXNlKCk6IEludmFsaWQgb2Zmc2V0IHdpdGggcmVhZCBieXRlcyEhXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCS8vIFJlZnJlc2ggZWZ1c2UgaW5pdCBtYXAgYXMgYWxsIG94RkYuCi0JZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQotCQllZnVzZVRibFtpXSA9IDB4RkY7CisJZm9yKGkgPSAwOyBpIDwgRUZVU0VfTUFYX1NFQ1RJT047IGkrKykKKwkJZm9yKGogPSAwOyBqIDwgRUZVU0VfTUFYX1dPUkRfVU5JVDsgaisrKQorCQkJZUZ1c2VXb3JkW2ldW2pdPTB4RkZGRjsKIAogI2lmIChFRlVTRV9SRUFEX1NXSVRDSCA9PSAxKQogCVJlYWRFRnVzZUJ5dGUoZGV2LCBlRnVzZV9BZGRyLCBydGVtcDgpOwogI2Vsc2UKIAlydGVtcDhbMF0gPSBFRlVTRV9SZWFkMUJ5dGUoZGV2LCBlRnVzZV9BZGRyKTsKICNlbmRpZgotCWlmKCpydGVtcDggIT0gMHhGRikJCWVGdXNlX0FkZHIrKzsKLQl3aGlsZSgoKnJ0ZW1wOCAhPSAweEZGKSAmJiAoZUZ1c2VfQWRkciA8IDUxMikpeworCWlmKCpydGVtcDggIT0gMHhGRil7CisJCWVmdXNlX3V0aWxpemVkKys7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJBZGRyPSVkXG4iLCBlRnVzZV9BZGRyKTsKKwkJZUZ1c2VfQWRkcisrOworCX0KKworCXdoaWxlKCgqcnRlbXA4ICE9IDB4RkYpICYmIChlRnVzZV9BZGRyIDwgRUZVU0VfUkVBTF9DT05URU5UX0xFTikpCisJewogCQlvZmZzZXQgPSAoKCpydGVtcDggPj4gNCkgJiAweDBmKTsKLQkJaWYob2Zmc2V0IDw9IDB4MEYpeworCQlpZihvZmZzZXQgPCBFRlVTRV9NQVhfU0VDVElPTikKKwkJewogCQkJd3JlbiA9ICgqcnRlbXA4ICYgMHgwZik7Ci0JCQlmb3IoaT0wOyBpPDQ7IGkrKyl7Ci0JCQkJaWYoISh3cmVuICYgMHgwMSkpeworCQkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIk9mZnNldC0lZCBXb3JkZW49JXhcbiIsIG9mZnNldCwgd3Jlbik7CisKKwkJCWZvcihpID0gMDsgaSA8IEVGVVNFX01BWF9XT1JEX1VOSVQ7IGkrKykKKwkJCXsKKwkJCQlpZighKHdyZW4gJiAweDAxKSkKKwkJCQl7CisJCQkJCVJUX1RSQUNFKENPTVBfRVBST00sICJBZGRyPSVkXG4iLCBlRnVzZV9BZGRyKTsKICNpZiAoRUZVU0VfUkVBRF9TV0lUQ0ggPT0gMSkKIAkJCQkJUmVhZEVGdXNlQnl0ZShkZXYsIGVGdXNlX0FkZHIsIHJ0ZW1wOCk7CWVGdXNlX0FkZHIrKzsKICNlbHNlCiAJCQkJCXJ0ZW1wOFswXSA9IEVGVVNFX1JlYWQxQnl0ZShkZXYsIGVGdXNlX0FkZHIpOwllRnVzZV9BZGRyKys7CiAjZW5kaWYKKwkJCQkJZWZ1c2VfdXRpbGl6ZWQrKzsKIAkJCQkJZUZ1c2VXb3JkW29mZnNldF1baV0gPSAoKnJ0ZW1wOCAmIDB4ZmYpOwotCQkJCQlpZihlRnVzZV9BZGRyID49IDUxMikgYnJlYWs7CisJCQkJCWlmKGVGdXNlX0FkZHIgPj0gRUZVU0VfUkVBTF9DT05URU5UX0xFTikKKwkJCQkJCWJyZWFrOworCisJCQkJCVJUX1RSQUNFKENPTVBfRVBST00sICJBZGRyPSVkXG4iLCBlRnVzZV9BZGRyKTsKICNpZiAoRUZVU0VfUkVBRF9TV0lUQ0ggPT0gMSkKIAkJCQkJUmVhZEVGdXNlQnl0ZShkZXYsIGVGdXNlX0FkZHIsIHJ0ZW1wOCk7CWVGdXNlX0FkZHIrKzsKICNlbHNlCiAJCQkJCXJ0ZW1wOFswXSA9IEVGVVNFX1JlYWQxQnl0ZShkZXYsIGVGdXNlX0FkZHIpOwllRnVzZV9BZGRyKys7CiAjZW5kaWYKKwkJCQkJZWZ1c2VfdXRpbGl6ZWQrKzsKIAkJCQkJZUZ1c2VXb3JkW29mZnNldF1baV0gfD0gKCgodTE2KSpydGVtcDggPDwgOCkgJiAweGZmMDApOwotCQkJCQlpZihlRnVzZV9BZGRyID49IDUxMikgYnJlYWs7CisJCQkJCWlmKGVGdXNlX0FkZHIgPj0gRUZVU0VfUkVBTF9DT05URU5UX0xFTikKKwkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQl3cmVuID4+PSAxOwogCQkJfQogCQl9CisKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIkFkZHI9JWRcbiIsIGVGdXNlX0FkZHIpOwogI2lmIChFRlVTRV9SRUFEX1NXSVRDSCA9PSAxKQogCQlSZWFkRUZ1c2VCeXRlKGRldiwgZUZ1c2VfQWRkciwgcnRlbXA4KTsKICNlbHNlCiAJCXJ0ZW1wOFswXSA9IEVGVVNFX1JlYWQxQnl0ZShkZXYsIGVGdXNlX0FkZHIpOwllRnVzZV9BZGRyKys7CiAjZW5kaWYKLQkJaWYoKnJ0ZW1wOCAhPSAweEZGICYmIChlRnVzZV9BZGRyIDwgNTEyKSkJZUZ1c2VfQWRkcisrOworCQlpZigqcnRlbXA4ICE9IDB4RkYgJiYgKGVGdXNlX0FkZHIgPCA1MTIpKQorCQl7CisJCQllZnVzZV91dGlsaXplZCsrOworCQkJZUZ1c2VfQWRkcisrOworCQl9CiAJfQogCi0JZm9yKGk9MDsgaTwxNjsgaSsrKXsKLQkJZm9yKGo9MDsgajw0OyBqKyspeworCWZvcihpPTA7IGk8RUZVU0VfTUFYX1NFQ1RJT047IGkrKykKKwl7CisJCWZvcihqPTA7IGo8RUZVU0VfTUFYX1dPUkRfVU5JVDsgaisrKQorCQl7CiAJCQllZnVzZVRibFsoaSo4KSsoaioyKV09KGVGdXNlV29yZFtpXVtqXSAmIDB4ZmYpOwogCQkJZWZ1c2VUYmxbKGkqOCkrKChqKjIpKzEpXT0oKGVGdXNlV29yZFtpXVtqXSA+PiA4KSAmIDB4ZmYpOwogCQl9CiAJfQogCWZvcihpPTA7IGk8X3NpemVfYnl0ZTsgaSsrKQogCQlwYnVmW2ldID0gZWZ1c2VUYmxbX29mZnNldCtpXTsKLX0KLSNlbmRpZgkvLyAjaWYgKEVGVVNFX0ZPUl85MlNVID09IDEpCiAKKwllZnVzZV91c2FnZSA9ICh1OCkoKGVmdXNlX3V0aWxpemVkKjEwMCkvRUZVU0VfUkVBTF9DT05URU5UX0xFTik7CisJcHJpdi0+RWZ1c2VVc2VkQnl0ZXMgPSBlZnVzZV91dGlsaXplZDsKKwlwcml2LT5FZnVzZVVzZWRQZXJjZW50YWdlID0gKHU4KWVmdXNlX3VzYWdlOworfQorI2VuZGlmCisKK2V4dGVybglib29sCitFRlVTRV9TaGFkb3dVcGRhdGVDaGsoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJU2VjdGlvbklkeCwgaSwgQmFzZTsKKwl1MTYJV29yZHNOZWVkID0gMCwgSGRyTnVtID0gMCwgVG90YWxCeXRlcyA9IDAsIEVmdXNlVXNlZCA9IDA7CisJYm9vbAliV29yZENoYW5nZWQsIGJSZXN1bHQgPSB0cnVlOworCisJZm9yIChTZWN0aW9uSWR4ID0gMDsgU2VjdGlvbklkeCA8IDE2OyBTZWN0aW9uSWR4KyspCisJeworCQlCYXNlID0gU2VjdGlvbklkeCAqIDg7CisJCWJXb3JkQ2hhbmdlZCA9IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpPWkrMikKKwkJeworCQkJaWYoKHByaXYtPkVmdXNlTWFwW0VGVVNFX0lOSVRfTUFQXVtCYXNlK2ldICE9CisJCQkJcHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bQmFzZStpXSkgfHwKKwkJCQkocHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdW0Jhc2UraSsxXSAhPQorCQkJCXByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdW0Jhc2UraSsxXSkpCisJCQl7CisJCQkJV29yZHNOZWVkKys7CisJCQkJYldvcmRDaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWlmKCBiV29yZENoYW5nZWQ9PXRydWUgKQorCQkJSGRyTnVtKys7CisJfQorCisJVG90YWxCeXRlcyA9IEhkck51bSArIFdvcmRzTmVlZCoyOworCUVmdXNlVXNlZCA9IHByaXYtPkVmdXNlVXNlZEJ5dGVzOworCisJaWYoIChUb3RhbEJ5dGVzICsgRWZ1c2VVc2VkKSA+PSAoRUZVU0VfTUFYX1NJWkUtRUZVU0VfT09CX1BST1RFQ1RfQllURVMpKQorCQliUmVzdWx0ID0gdHJ1ZTsKKworCVJUX1RSQUNFKENPTVBfRVBST00sICJFRlVTRV9TaGFkb3dVcGRhdGVDaGsoKTogVG90YWxCeXRlcygleCksIEhkck51bSgleCksIFdvcmRzTmVlZCgleCksIEVmdXNlVXNlZCglZClcbiIsCisJCVRvdGFsQnl0ZXMsIEhkck51bSwgV29yZHNOZWVkLCBFZnVzZVVzZWQpOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOglFRlVTRV9TaGFkb3dSZWFkCkBAIC02MjQsOCArNjU3LDYgQEAKIGV4dGVybiB2b2lkCiBFRlVTRV9TaGFkb3dSZWFkKAlzdHJ1Y3QgbmV0X2RldmljZSoJZGV2LAl1OCBUeXBlLCB1MTYgT2Zmc2V0LCB1MzIgKlZhbHVlKQogewotCS8vSEFMX0RBVEFfVFlQRQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCiAJaWYgKFR5cGUgPT0gMSkKIAkJZWZ1c2VfU2hhZG93UmVhZDFCeXRlKGRldiwgT2Zmc2V0LCAodTggKilWYWx1ZSk7CiAJZWxzZSBpZiAoVHlwZSA9PSAyKQpAQCAtNjMzLDggKzY2NCw3IEBACiAJZWxzZSBpZiAoVHlwZSA9PSA0KQogCQllZnVzZV9TaGFkb3dSZWFkNEJ5dGUoZGV2LCBPZmZzZXQsICh1MzIgKilWYWx1ZSk7CiAKLX0JLy8gRUZVU0VfU2hhZG93UmVhZAotCit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOglFRlVTRV9TaGFkb3dXcml0ZQpAQCAtNjU1LDggKzY4NSw2IEBACiBleHRlcm4Jdm9pZAogRUZVU0VfU2hhZG93V3JpdGUoCXN0cnVjdCBuZXRfZGV2aWNlKglkZXYsCXU4IFR5cGUsIHUxNiBPZmZzZXQsdTMyCVZhbHVlKQogewotCS8vSEFMX0RBVEFfVFlQRQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCiAJaWYgKE9mZnNldCA+PSAweDE4ICYmIE9mZnNldCA8PSAweDFGKQogCQlyZXR1cm47CiAKQEAgLTY2Nyw4ICs2OTUsNyBAQAogCWVsc2UgaWYgKFR5cGUgPT0gNCkKIAkJZWZ1c2VfU2hhZG93V3JpdGU0Qnl0ZShkZXYsIE9mZnNldCwgKHUzMilWYWx1ZSk7CiAKLX0JLy8gRUZVU0VfU2hhZG93V3JpdGUKLQorfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbjoJRUZVU0VfU2hhZG93VXBkYXRlCkBAIC02ODYsMTUgKzcxMywyNSBAQAogICogMTEvMTIvMjAwOCAJTUhDCQlDcmVhdGUgVmVyc2lvbiAwLgogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybgl2b2lkCitleHRlcm4gYm9vbAogRUZVU0VfU2hhZG93VXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCiB7Ci0JLy9IQUxfREFUQV9UWVBFCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUxNgkJCWksIG9mZnNldCwgYmFzZSA9IDA7CiAJdTgJCQl3b3JkX2VuID0gMHgwRjsKLQlib29sIGZpcnN0X3BnID0gZmFsc2U7Ci0JLy8gRm9yIEVmdXNlIHdyaXRlIGFjdGlvbiwgd2UgbXVzdCBlbmFibGUgTERPMi41ViBhbmQgNDBNSFogY2xrLgorCWJvb2wJCQlmaXJzdF9wZyA9IGZhbHNlOworCisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIi0tLT5FRlVTRV9TaGFkb3dVcGRhdGUoKVxuIik7CisKKwlpZighRUZVU0VfU2hhZG93VXBkYXRlQ2hrKGRldikpCisJeworCQllZnVzZV9SZWFkQWxsTWFwKGRldiwgJnByaXYtPkVmdXNlTWFwW0VGVVNFX0lOSVRfTUFQXVswXSk7CisJCW1lbWNweSgodm9pZCAqKSZwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVswXSwKKwkJCSh2b2lkICopJnByaXYtPkVmdXNlTWFwW0VGVVNFX0lOSVRfTUFQXVswXSwgSFdTRVRfTUFYX1NJWkVfOTJTKTsKKworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiPC0tLUVGVVNFX1NoYWRvd1VwZGF0ZSgpOiBFZnVzZSBvdXQgb2YgY2FwYWNpdHkhIVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CiAJZWZ1c2VfUG93ZXJTd2l0Y2goZGV2LCBUUlVFKTsKIAogCS8vCkBAIC03MTIsMTYgKzc0OSwxMiBAQAogCQkvLwogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQl7Ci0JCQlpZiAob2Zmc2V0ID09IDAgJiYgcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdW2Jhc2UraV0gPT0gMHhGRikKLQkJCXsKLQkJCQlmaXJzdF9wZyA9IFRSVUU7Ci0JCQl9Ci0KLQkJCS8vIDIwMDgvMTIvMTEgTUggSFcgYXV0b2xvYWQgZmFpbCB3b3JrYXJvdW5kIGZvciBBL0JDVVQuCi0KIAkJCWlmIChmaXJzdF9wZyA9PSBUUlVFKQogCQkJewogCQkJCXdvcmRfZW4gJj0gfigxPDwoaS8yKSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwiU2VjdGlvbigleCkgQWRkclsleF0gJXggdXBkYXRlIHRvICV4LCBXb3JkX0VuPSUwMnhcbiIsCisJCQkJb2Zmc2V0LCBiYXNlK2ksIHByaXYtPkVmdXNlTWFwW0VGVVNFX0lOSVRfTUFQXVtiYXNlK2ldLAorCQkJCXByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdW2Jhc2UraV0sd29yZF9lbik7CiAJCQkJcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdW2Jhc2UraV0gPQogCQkJCXByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdW2Jhc2UraV07CiAJCQl9ZWxzZQpAQCAtNzMwLDggKzc2Myw5IEBACiAJCQkJcHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bYmFzZStpXSkKIAkJCXsKIAkJCQl3b3JkX2VuICY9IH4oRUZVU0VfQklUKGkvMikpOwotCQkJCS8vUlRfVFJBQ0UoQ09NUF9FRlVTRSwgICJPZmZzZXQ9JWQgQWRkciV4ICV4ID09PiAleCBXb3JkX0VuPSUwMnhcbiIsCi0JCQkJLy9vZmZzZXQsIGJhc2UraSwgcHJpdi0+RWZ1c2VNYXBbMF1bYmFzZStpXSwgcHJpdi0+RWZ1c2VNYXBbMV1bYmFzZStpXSx3b3JkX2VuKTsKKwkJCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiU2VjdGlvbigleCkgQWRkclsleF0gJXggdXBkYXRlIHRvICV4LCBXb3JkX0VuPSUwMnhcbiIsCisJCQkJb2Zmc2V0LCBiYXNlK2ksIHByaXYtPkVmdXNlTWFwWzBdW2Jhc2UraV0sCisJCQkJcHJpdi0+RWZ1c2VNYXBbMV1bYmFzZStpXSx3b3JkX2VuKTsKIAogCQkJCS8vIFVwZGF0ZSBpbml0IHRhYmxlISEhCiAJCQkJcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdW2Jhc2UraV0gPQpAQCAtNzQ3LDI1ICs3ODEsMjcgQEAKIAkJewogCQkJdTgJdG1wZGF0YVs4XTsKIAotCQkJLy9GSVhMWk0KLQkJCW1lbWNweSh0bXBkYXRhLCAmKHByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdW2Jhc2VdKSwgOCk7Ci0JCQkvL1JUX1BSSU5UX0RBVEEoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJVLUVGVVNFXG4iKSwgdG1wZGF0YSwgOCk7Ci0JCQllZnVzZV9QZ1BhY2tldFdyaXRlKGRldiwodTgpb2Zmc2V0LHdvcmRfZW4sdG1wZGF0YSk7CisJCQltZW1jcHkoKHZvaWQgKil0bXBkYXRhLCAodm9pZCAqKSYocHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bYmFzZV0pLCA4KTsKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIlUtRUZVU0VcbiIpOworCisJCQlpZighZWZ1c2VfUGdQYWNrZXRXcml0ZShkZXYsKHU4KW9mZnNldCx3b3JkX2VuLHRtcGRhdGEpKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfRVBST00sIkVGVVNFX1NoYWRvd1VwZGF0ZSgpOiBQRyBzZWN0aW9uKCV4KSBmYWlsISFcbiIsIG9mZnNldCk7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAogCX0KLQkvLyAyMDA4LzEyLzAxIE1IIEZvciBFZnVzZSBIVyBsb2FkIGJ1ZyB3b3JrYXJvdW5mIG1ldGhvZCEhISEKLQkvLyBXZSB3aWxsIGZvcmNlIHdyaXRlIDB4MTBFQyBpbnRvIGFkZHJlc3MgMTAmMTEgYWZ0ZXIgYWxsIEVmdXNlIGNvbnRlbnQuCi0JLy8KLQotCiAJLy8gRm9yIHdhcm0gcmVib290LCB3ZSBtdXN0IHJlc3VtZSBFZnVzZSBjbG9jayB0byA1MDBLLgorCiAJZWZ1c2VfUG93ZXJTd2l0Y2goZGV2LCBGQUxTRSk7Ci0JLy8gMjAwOC8xMi8wMSBNSCBXZSB1cGRhdGUgc2hhZG93IGNvbnRlbnQgYWdhaW4hISEhCi0JRUZVU0VfU2hhZG93TWFwVXBkYXRlKGRldik7CiAKLX0JLy8gRUZVU0VfU2hhZG93VXBkYXRlCisJZWZ1c2VfUmVhZEFsbE1hcChkZXYsICZwcml2LT5FZnVzZU1hcFtFRlVTRV9JTklUX01BUF1bMF0pOworCW1lbWNweSgodm9pZCAqKSZwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVswXSwKKwkJKHZvaWQgKikmcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdWzBdLCBIV1NFVF9NQVhfU0laRV85MlMpOwogCisJcmV0dXJuIHRydWU7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOglFRlVTRV9TaGFkb3dNYXBVcGRhdGUKQEAgLTc5MiwxMiArODI4LDEwIEBACiAJfWVsc2V7CiAJCWVmdXNlX1JlYWRBbGxNYXAoZGV2LCAmcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdWzBdKTsKIAl9Ci0JLy9QbGF0Zm9ybU1vdmVNZW1vcnkoJnByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdWzBdLAotCQkvLyZwcml2LT5FZnVzZU1hcFtFRlVTRV9JTklUX01BUF1bMF0sIEhXU0VUX01BWF9TSVpFXzkyUyk7Ly9GSVhMWk0KLQltZW1jcHkoJnByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdWzBdLAotCQkmcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdWzBdLCBIV1NFVF9NQVhfU0laRV85MlMpOworCW1lbWNweSgodm9pZCAqKSZwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVswXSwKKwkJKHZvaWQgKikmcHJpdi0+RWZ1c2VNYXBbRUZVU0VfSU5JVF9NQVBdWzBdLCBIV1NFVF9NQVhfU0laRV85MlMpOwogCi19CS8vIEVGVVNFX1NoYWRvd01hcFVwZGF0ZQorfQogCiBleHRlcm4Jdm9pZAogRUZVU0VfRm9yY2VXcml0ZVZlbmRvcklkKCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQpAQCAtODEwLDcgKzg0NCw3IEBACiAKIAllZnVzZV9Qb3dlclN3aXRjaChkZXYsIEZBTFNFKTsKIAotfQkvLyBFRlVTRV9Gb3JjZVdyaXRlVmVuZG9ySWQKK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CWVmdXNlX1NoYWRvd1JlYWQxQnl0ZQpAQCAtODM3LDcgKzg3MSw3IEBACiAKIAkqVmFsdWUgPSBwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVtPZmZzZXRdOwogCi19CS8vIEVGVVNFX1NoYWRvd1JlYWQxQnl0ZQorfQogCiAvLy0tLS0tLS0tLS0tLS0tLVJlYWQgVHdvIEJ5dGVzCiBzdGF0aWMJdm9pZApAQCAtODQ4LDcgKzg4Miw3IEBACiAJKlZhbHVlID0gcHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bT2Zmc2V0XTsKIAkqVmFsdWUgfD0gcHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bT2Zmc2V0KzFdPDw4OwogCi19CS8vIEVGVVNFX1NoYWRvd1JlYWQyQnl0ZQorfQogCiAvLy0tLS0tLS0tLS0tLS0tLVJlYWQgRm91ciBCeXRlcwogc3RhdGljCXZvaWQKQEAgLTg2MSw3ICs4OTUsNyBAQAogCSpWYWx1ZSB8PSBwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVtPZmZzZXQrMl08PDE2OwogCSpWYWx1ZSB8PSBwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVtPZmZzZXQrM108PDI0OwogCi19CS8vIGVmdXNlX1NoYWRvd1JlYWQ0Qnl0ZQorfQogCiAKIApAQCAtODkwLDcgKzkyNCw3IEBACiAKIAlwcml2LT5FZnVzZU1hcFtFRlVTRV9NT0RJRllfTUFQXVtPZmZzZXRdID0gVmFsdWU7CiAKLX0JLy8gZWZ1c2VfU2hhZG93V3JpdGUxQnl0ZQorfQogCiAvLy0tLS0tLS0tLS0tLS0tLVdyaXRlIFR3byBCeXRlcwogc3RhdGljCXZvaWQKQEAgLTkwMSw3ICs5MzUsNyBAQAogCXByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdW09mZnNldF0gPSBWYWx1ZSYweDAwRkY7CiAJcHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bT2Zmc2V0KzFdID0gVmFsdWU+Pjg7CiAKLX0JLy8gZWZ1c2VfU2hhZG93V3JpdGUxQnl0ZQorfQogCiAvLy0tLS0tLS0tLS0tLS0tLVdyaXRlIEZvdXIgQnl0ZXMKIHN0YXRpYwl2b2lkCkBAIC05MTQsMTAgKzk0OCw4IEBACiAJcHJpdi0+RWZ1c2VNYXBbRUZVU0VfTU9ESUZZX01BUF1bT2Zmc2V0KzJdID0gKHU4KSgoVmFsdWU+PjE2KSYweDAwRkYpOwogCXByaXYtPkVmdXNlTWFwW0VGVVNFX01PRElGWV9NQVBdW09mZnNldCszXSA9ICh1OCkoKFZhbHVlPj4yNCkmMHhGRik7CiAKLX0JLy8gZWZ1c2VfU2hhZG93V3JpdGUxQnl0ZQorfQogCi0KLS8qICAxMS8xNi8yMDA4IE1IIFJlYWQgb25lIGJ5dGUgZnJvbSByZWFsIEVmdXNlLiAqLwogc3RhdGljCXU4CiBlZnVzZV9PbmVCeXRlUmVhZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MTYgYWRkcix1OCAqZGF0YSkKIHsKQEAgLTk0Nyw3ICs5NzksNyBAQAogCQliUmVzdWx0ID0gRkFMU0U7CiAJfQogCXJldHVybiBiUmVzdWx0OwotfQkvLyBlZnVzZV9PbmVCeXRlUmVhZAorfQogCiAvKiAgMTEvMTYvMjAwOCBNSCBXcml0ZSBvbmUgYnl0ZSB0byByZWFsZCBFZnVzZS4gKi8KIHN0YXRpYwl1OApAQCAtOTU2LDEwICs5ODgsNiBAQAogCXU4IHRtcGlkeCA9IDA7CiAJdTggYlJlc3VsdDsKIAotCS8vUlRfVFJBQ0UoQ09NUF9FRlVTRSwgIkFkZHIgPSAleCBEYXRhPSV4XG4iLCBhZGRyLCBkYXRhKTsKLQotCS8vcmV0dXJuCTA7Ci0KIAkvLyAtLS0tLS0tLS0tLS0tLS0tLWUtZnVzZSByZWcgY3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkvL2FkZHJlc3MKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIEVGVVNFX0NUUkwrMSwgKHU4KShhZGRyJjB4ZmYpKTsKQEAgLTk4Myw4ICsxMDExLDcgQEAKIAl9CiAKIAlyZXR1cm4gYlJlc3VsdDsKLX0JLy8gZWZ1c2VfT25lQnl0ZVdyaXRlCi0KK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CWVmdXNlX1JlYWRBbGxNYXAKQEAgLTEwMDUsMTkgKzEwMzIsMTMgQEAKIHN0YXRpYwl2b2lkCiBlZnVzZV9SZWFkQWxsTWFwKHN0cnVjdCBuZXRfZGV2aWNlKglkZXYsIHU4CSpFZnVzZSkKIHsKLQkvL3U4IAlwZ19kYXRhWzhdOwotCS8vdTggCW9mZnNldCA9IDA7Ci0JLy91OCAJdG1waWR4OwotCS8vc3RhdGljCXU4CWluZGV4ID0gMDsKLQogCS8vCiAJLy8gV2UgbXVzdCBlbmFibGUgY2xvY2sgYW5kIExETyAyLjVWIG90aGVyd2lzZSwgcmVhZCBhbGwgbWFwIHdpbGwgYmUgZmFpbCEhISEKIAkvLwogCWVmdXNlX1Bvd2VyU3dpdGNoKGRldiwgVFJVRSk7CiAJUmVhZEVGdXNlKGRldiwgMCwgMTI4LCBFZnVzZSk7CiAJZWZ1c2VfUG93ZXJTd2l0Y2goZGV2LCBGQUxTRSk7Ci19CS8vIGVmdXNlX1JlYWRBbGxNYXAKLQorfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbjoJZWZ1c2VfV3JpdGVBbGxNYXAKQEAgLTEwNTcsMTggKzEwNzgsMTEgQEAKIAkJCS8vIDB4MTgtMWYgUmVzZXJ2ZSA+MHg1MCBSZXNlcnZlIGZvciB0eCBwb3dlcgogCQkJaWYgKG9mZnNldCA9PSAzLyogfHwgb2Zmc2V0ID4gOSovKQogCQkJCWNvbnRpbnVlOy8vd29yZF9lbiA9IDB4MEY7Ci0JCQkvL2Vsc2UgaWYgKG9mZnNldCA9PSA5KQkvLyAweDRjLTRmIFJlc2VydmUKLQkJCQkvL3dvcmRfZW4gPSAweDBDOwogCQkJZWxzZQogCQkJCXdvcmRfZW4gPSAweDAwOwogCQl9Ci0JCS8vUlRfVFJBQ0UoQ09NUF9FRlVTRSwgKCJBZGRyPSVkIHNpemU9JWQgV29yZF9Fbj0lMDJ4XG4iLCBvZmZzZXQsIGVlcHJvbV9zaXplLCB3b3JkX2VuKSk7CiAKLQkJLy9tZW1jcHkodG1wZGF0YSxlZXByb20rKG9mZnNldCpQR1BLVF9EQVRBX1NJWkUpLDgpOwogCQltZW1jcHkodG1wZGF0YSwgKGVlcHJvbSsob2Zmc2V0KlBHUEtUX0RBVEFfU0laRSkpLCA4KTsKLQotCQkvL1JUX1BSSU5UX0RBVEEoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJFRlVTRVx0IiksIHRtcGRhdGEsIDgpOwotCiAJCWVmdXNlX1BnUGFja2V0V3JpdGUoZGV2LG9mZnNldCx3b3JkX2VuLHRtcGRhdGEpOwogCiAKQEAgLTEwNzcsNyArMTA5MSw3IEBACiAJLy8gRm9yIHdhcm0gcmVib290LCB3ZSBtdXN0IHJlc3VtZSBFZnVzZSBjbG9jayB0byA1MDBLLgogCWVmdXNlX1Bvd2VyU3dpdGNoKGRldiwgRkFMU0UpOwogCi19CS8vIGVmdXNlX1dyaXRlQWxsTWFwCit9CiAjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExNCwxNSArMTEyOCw5IEBACiAJaWYoZGF0YT09TlVMTCkJcmV0dXJuIEZBTFNFOwogCWlmKG9mZnNldD4xNSkJCXJldHVybiBGQUxTRTsKIAotCS8vRklYTFpNCi0JLy9QbGF0Zm9ybUZpbGxNZW1vcnkoKFBWT0lEKWRhdGEsIHNpemVvZih1OCkqUEdQS1RfREFUQV9TSVpFLCAweGZmKTsKLQkvL1BsYXRmb3JtRmlsbE1lbW9yeSgoUFZPSUQpdG1wZGF0YSwgc2l6ZW9mKHU4KSpQR1BLVF9EQVRBX1NJWkUsIDB4ZmYpOwogCW1lbXNldChkYXRhLCAweGZmLCBzaXplb2YodTgpKlBHUEtUX0RBVEFfU0laRSk7CiAJbWVtc2V0KHRtcGRhdGEsIDB4ZmYsIHNpemVvZih1OCkqUEdQS1RfREFUQV9TSVpFKTsKIAotCS8vUlRfUFJJTlRfREFUQShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJlZnVzZV9QZ1BhY2tldFJlYWQtMVxuIiksIGRhdGEsIDgpOwotCi0JLy9lZnVzZV9yZWdfY3RybChwQWRhcHRlcixUUlVFKTsvL3Bvd2VyIG9uCiAJd2hpbGUoYkNvbnRpbnVhbCAmJiAoZWZ1c2VfYWRkciAgPCBFRlVTRV9NQVhfU0laRSkgKQogCXsKIAkJLy8tLS0tLS0tICBIZWFkZXIgUmVhZCAtLS0tLS0tLS0tLS0tCkBAIC0xMTY5LDkgKzExNzcsNiBAQAogCQl9CiAKIAl9Ci0JLy9lZnVzZV9yZWdfY3RybChwQWRhcHRlcixGQUxTRSk7Ly9wb3dlciBvZmYKLQotCS8vUlRfUFJJTlRfREFUQShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJlZnVzZV9QZ1BhY2tldFJlYWQtMlxuIiksIGRhdGEsIDgpOwogCiAJaWYoCShkYXRhWzBdPT0weGZmKSAmJihkYXRhWzFdPT0weGZmKSAmJiAoZGF0YVsyXT09MHhmZikgICYmIChkYXRhWzNdPT0weGZmKSAmJgogCQkoZGF0YVs0XT09MHhmZikgJiYoZGF0YVs1XT09MHhmZikgJiYgKGRhdGFbNl09PTB4ZmYpICAmJiAoZGF0YVs3XT09MHhmZikpCkBAIC0xMTc5LDggKzExODQsNyBAQAogCWVsc2UKIAkJcmV0dXJuIFRSVUU7CiAKLX0JLy8gZWZ1c2VfUGdQYWNrZXRSZWFkCi0KK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CWVmdXNlX1BnUGFja2V0V3JpdGUKQEAgLTEyMDAsNyArMTIwNCw3IEBACiAgKiAxMS8xNi8yMDA4IAlNSEMJCVJlb3JnYW5pemUgY29kZSBBcmNoIGFuZCBhc3NpZ24gYXMgbG9jYWwgQVBJLgogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB1OCBlZnVzZV9QZ1BhY2tldFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IG9mZnNldCwgdTggd29yZF9lbix1OCAqZGF0YSkKK3N0YXRpYyB1MzIgZWZ1c2VfUGdQYWNrZXRXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBvZmZzZXQsIHU4IHdvcmRfZW4sdTggKmRhdGEpCiB7CiAJdTggV3JpdGVTdGF0ZSA9IFBHX1NUQVRFX0hFQURFUjsKIApAQCAtMTIxMCwxMiArMTIxNCw5IEBACiAKIAl1OCBwZ19oZWFkZXIgPSAwOwogCi0JLy91MTYgdG1wX2FkZHI9MDsKIAl1OCB0bXBfd29yZF9jbnRzPTAsdGFyZ2V0X3dvcmRfY250cz0wOwogCXU4IHRtcF9oZWFkZXIsbWF0Y2hfd29yZF9lbix0bXBfd29yZF9lbjsKIAotCS8vdTgJZWZ1c2VfY2xrX29yaSxlZnVzZV9jbGtfbmV3OwotCiAJUEdQS1RfU1RSVUNUIHRhcmdldF9wa3Q7CiAJUEdQS1RfU1RSVUNUIHRtcF9wa3Q7CiAKQEAgLTEyNDAsNyArMTI0MSw2IEBACiAJZWZ1c2VfV29yZEVuYWJsZURhdGFSZWFkKHdvcmRfZW4sZGF0YSx0YXJnZXRfcGt0LmRhdGEpOwogCXRhcmdldF93b3JkX2NudHMgPSBlZnVzZV9DYWxjdWxhdGVXb3JkQ250cyh0YXJnZXRfcGt0LndvcmRfZW4pOwogCi0JLy9lZnVzZV9yZWdfY3RybChwQWRhcHRlcixUUlVFKTsvL3Bvd2VyIG9uCiAJcHJpbnRrKCJFRlVTRSBQb3dlciBPTlxuIik7CiAKIAl3aGlsZSggYkNvbnRpbnVhbCAmJiAoZWZ1c2VfYWRkciAgPCBFRlVTRV9NQVhfU0laRSkgKQpAQCAtMTMxMiwxNCArMTMxMiwxMiBAQAogCQkJCQkJCWJhZHdvcmRlbiA9IGVmdXNlX1dvcmRFbmFibGVEYXRhV3JpdGUoZGV2LGVmdXNlX2FkZHIrMSwgdG1wX3BrdC53b3JkX2VuICx0YXJnZXRfcGt0LmRhdGEpOwogCiAJCQkJCQkJLy8qKioqKioqKioqKiogIHNvLTItMi1BLTEgKioqKioqKioqKioqKioqKioqKgotCQkJCQkJCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCQkJCQkJCWlmKDB4MEYgIT0gKGJhZHdvcmRlbiYweDBGKSkKIAkJCQkJCQl7CiAJCQkJCQkJCXU4IHJlb3JnX29mZnNldCA9IG9mZnNldDsKIAkJCQkJCQkJdTggcmVvcmdfd29yZGVuPWJhZHdvcmRlbjsKIAkJCQkJCQkJZWZ1c2VfUGdQYWNrZXRXcml0ZShkZXYscmVvcmdfb2Zmc2V0LHJlb3JnX3dvcmRlbixvcmlnaW5hbGRhdGEpOwogCQkJCQkJCX0KLQkJCQkJCQkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogCQkJCQkJCXRtcF93b3JkX2VuID0gMHgwRjsKIAkJCQkJCQlpZiggICh0YXJnZXRfcGt0LndvcmRfZW4mQklUMCleKG1hdGNoX3dvcmRfZW4mQklUMCkgICkKQEAgLTEzNDIsMTMgKzEzNDAsMTMgQEAKIAkJCQkJCQkvLyoqKioqKioqKioqKiAgc28tMi0yLUEtMiAqKioqKioqKioqKioqKioqKioqCiAJCQkJCQkJaWYoKHRtcF93b3JkX2VuJjB4MEYpIT0weDBGKXsKIAkJCQkJCQkJLy9yZW9yZ2FuaXplIG90aGVyIHBnIHBhY2tldAotCQkJCQkJCQkvL2VmdXNlX2FkZHIgPSBlZnVzZV9hZGRyICsgKDIqdG1wX3dvcmRfY250cykgKzE7Ly9uZXh0IHBnIHBhY2tldCBhZGRyCi0JCQkJCQkJCWVmdXNlX2FkZHIgPSBlZnVzZV9HZXRDdXJyZW50U2l6ZShkZXYpOwotCQkJCQkJCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJCQkJCQl0YXJnZXRfcGt0Lm9mZnNldCA9IG9mZnNldDsKKworCQkJCQkJCWVmdXNlX2FkZHIgPSBlZnVzZV9HZXRDdXJyZW50U2l6ZShkZXYpOworCisJCQkJCQkJdGFyZ2V0X3BrdC5vZmZzZXQgPSBvZmZzZXQ7CiAJCQkJCQkJCXRhcmdldF9wa3Qud29yZF9lbj0gdG1wX3dvcmRfZW47Ci0JCQkJCQkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQkJCQkJfWVsc2V7CisKKwkJCQkJCX1lbHNlewogCQkJCQkJCQliQ29udGludWFsID0gRkFMU0U7CiAJCQkJCQkJfQogCQkJCQkJCSNpZiAoRUZVU0VfRVJST0VfSEFORExFID09IDEpCkBAIC0xMzYzLDEwICsxMzYxLDggQEAKIAkJCQkJCWVsc2V7Ly8qKioqKioqKioqKiogIHNvLTItMi1CICoqKioqKioqKioqKioqKioqKioKIAkJCQkJCQkvL3Jlb3JnYW5pemUgb3RoZXIgcGcgcGFja2V0CiAJCQkJCQkJZWZ1c2VfYWRkciA9IGVmdXNlX2FkZHIgKyAoMip0bXBfd29yZF9jbnRzKSArMTsvL25leHQgcGcgcGFja2V0IGFkZHIKLQkJCQkJCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PQogCQkJCQkJCXRhcmdldF9wa3Qub2Zmc2V0ID0gb2Zmc2V0OwogCQkJCQkJCXRhcmdldF9wa3Qud29yZF9lbj0gdGFyZ2V0X3BrdC53b3JkX2VuOwotCQkJCQkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJCQkJCQkJI2lmIChFRlVTRV9FUlJPRV9IQU5ETEUgPT0gMSkKIAkJCQkJCQlXcml0ZVN0YXRlPVBHX1NUQVRFX0hFQURFUjsKIAkJCQkJCQkjZW5kaWYKQEAgLTE0MDUsMTMgKzE0MDEsMTAgQEAKIAogCQkJCQkvLyoqKioqKioqKioqKiAgczEtMi1BIDpjb3ZlciB0aGUgZXhpc3QgZGF0YSAqKioqKioqKioqKioqKioqKioqCiAJCQkJCW1lbXNldChvcmlnaW5hbGRhdGEsMHhmZixzaXplb2YodTgpKjgpOwotCQkJCQkvL1BsYXRmb3JtRmlsbE1lbW9yeSgoUFZPSUQpb3JpZ2luYWxkYXRhLCBzaXplb2YodTgpKjgsIDB4ZmYpOwogCiAJCQkJCWlmKGVmdXNlX1BnUGFja2V0UmVhZCggZGV2LCB0bXBfcGt0Lm9mZnNldCxvcmlnaW5hbGRhdGEpKQogCQkJCQl7CS8vY2hlY2sgaWYgZGF0YSBleGlzdAotCQkJCQkJLy9lZnVzZV9yZWdfY3RybChwQWRhcHRlcixUUlVFKTsvL3Bvd2VyIG9uCiAJCQkJCQliYWR3b3JkZW4gPSBlZnVzZV9Xb3JkRW5hYmxlRGF0YVdyaXRlKGRldixlZnVzZV9hZGRyKzEsdG1wX3BrdC53b3JkX2VuLG9yaWdpbmFsZGF0YSk7Ci0JCQkJCQkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAkJCQkJCWlmKDB4MEYgIT0gKGJhZHdvcmRlbiYweDBGKSkKIAkJCQkJCXsKIAkJCQkJCQl1OCByZW9yZ19vZmZzZXQgPSB0bXBfcGt0Lm9mZnNldDsKQEAgLTE0MTksNyArMTQxMiw2IEBACiAJCQkJCQkJZWZ1c2VfUGdQYWNrZXRXcml0ZShkZXYscmVvcmdfb2Zmc2V0LHJlb3JnX3dvcmRlbixvcmlnaW5hbGRhdGEpOwogCQkJCQkJCWVmdXNlX2FkZHIgPSBlZnVzZV9HZXRDdXJyZW50U2l6ZShkZXYpOwogCQkJCQkJfQotCQkJCQkJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAJCQkJCQllbHNlewogCQkJCQkJCWVmdXNlX2FkZHIgPSBlZnVzZV9hZGRyICsgKHRtcF93b3JkX2NudHMqMikgKzE7IC8vTmV4dCBwZ19wYWNrZXQKIAkJCQkJCX0KQEAgLTE0NTksMTEgKzE0NTEsOSBAQAogCQkJey8vcmVvcmdhbml6ZSBvdGhlciBwZyBwYWNrZXQgLy8qKioqKioqKioqKiogIHMxLTEtQiAqKioqKioqKioqKioqKioqKioqCiAJCQkJZWZ1c2VfYWRkciA9IGVmdXNlX2FkZHIgKyAoMip0YXJnZXRfd29yZF9jbnRzKSArMTsvL25leHQgcGcgcGFja2V0IGFkZHIKIAotCQkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJCQkJdGFyZ2V0X3BrdC5vZmZzZXQgPSBvZmZzZXQ7CiAJCQkJdGFyZ2V0X3BrdC53b3JkX2VuPSBiYWR3b3JkZW47CiAJCQkJdGFyZ2V0X3dvcmRfY250cyA9ICBlZnVzZV9DYWxjdWxhdGVXb3JkQ250cyh0YXJnZXRfcGt0LndvcmRfZW4pOwotCQkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJCQkJI2lmIChFRlVTRV9FUlJPRV9IQU5ETEUgPT0gMSkKIAkJCQlXcml0ZVN0YXRlPVBHX1NUQVRFX0hFQURFUjsKIAkJCQlyZXBlYXRfdGltZXMrKzsKQEAgLTE0NzcsMTEgKzE0NjcsMTIgQEAKIAkJfQogCX0KIAotCS8vZWZ1c2VfcmVnX2N0cmwocEFkYXB0ZXIsRkFMU0UpOy8vcG93ZXIgb2ZmCi0KKwlpZihlZnVzZV9hZGRyICA+PSAoRUZVU0VfTUFYX1NJWkUtRUZVU0VfT09CX1BST1RFQ1RfQllURVMpKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgImVmdXNlX1BnUGFja2V0V3JpdGUoKTogZWZ1c2VfYWRkcigleCkgT3V0IG9mIHNpemUhIVxuIiwgZWZ1c2VfYWRkcik7CisJfQogCXJldHVybiBUUlVFOwotfQkvLyBlZnVzZV9QZ1BhY2tldFdyaXRlCi0KK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CWVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZApAQCAtMTUwMywxMiArMTQ5NCw2IEBACiBzdGF0aWMJdm9pZAogZWZ1c2VfV29yZEVuYWJsZURhdGFSZWFkKAl1OCB3b3JkX2VuLHU4ICpzb3VyZGF0YSx1OCAqdGFyZ2V0ZGF0YSkKIHsKLQkvL3U4IHRtcGluZGV4ID0gMDsKLQotCS8vRGJnUHJpbnQoImVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZCB3b3JkX2VuID0gJXhcbiIsIHdvcmRfZW4pOwotCi0JLy9SVF9QUklOVF9EQVRBKENPTVBfRUZVU0UsIERCR19MT1VELCAoInNvdXJkYXRhXG4iKSwgc291cmRhdGEsIDgpOwotCS8vUlRfUFJJTlRfREFUQShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJ0YXJnZXRkYXRhXG4iKSwgdGFyZ2V0ZGF0YSwgOCk7CiAKIAlpZiAoISh3b3JkX2VuJkJJVDApKQogCXsKQEAgLTE1MzAsOCArMTUxNSw3IEBACiAJCXRhcmdldGRhdGFbNl0gPSBzb3VyZGF0YVs2XTsvL3NvdXJkYXRhW3RtcGluZGV4KytdOwogCQl0YXJnZXRkYXRhWzddID0gc291cmRhdGFbN107Ly9zb3VyZGF0YVt0bXBpbmRleCsrXTsKIAl9Ci19CS8vIGVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZAotCit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOgllZnVzZV9Xb3JkRW5hYmxlRGF0YVdyaXRlCkBAIC0xNTU1LDE1ICsxNTM5LDkgQEAKIAl1MTYgdG1wYWRkciA9IDA7CiAJdTE2IHN0YXJ0X2FkZHIgPSBlZnVzZV9hZGRyOwogCXU4IGJhZHdvcmRlbiA9IDB4MEY7Ci0JLy91OCBOZXh0U3RhdGU7CiAJdTggdG1wZGF0YVs4XTsKIAogCW1lbXNldCh0bXBkYXRhLDB4ZmYsUEdQS1RfREFUQV9TSVpFKTsKLQkvL1BsYXRmb3JtRmlsbE1lbW9yeSgoUFZPSUQpdG1wZGF0YSwgUEdQS1RfREFUQV9TSVpFLCAweGZmKTsKLQotCS8vUlRfVFJBQ0UoQ09NUF9FRlVTRSwgIndvcmRfZW4gPSAleCBlZnVzZV9hZGRyPSV4XG4iLCB3b3JkX2VuLCBlZnVzZV9hZGRyKTsKLQotCS8vUlRfUFJJTlRfREFUQShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJVLUVGVVNFXG4iKSwgZGF0YSwgOCk7CiAKIAlpZighKHdvcmRfZW4mQklUMCkpCiAJewpAQCAtMTYxNCw4ICsxNTkyLDcgQEAKIAkJfQogCX0KIAlyZXR1cm4gYmFkd29yZGVuOwotfQkvLyBlZnVzZV9Xb3JkRW5hYmxlRGF0YVdyaXRlCi0KK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CWVmdXNlX1Bvd2VyU3dpdGNoCkBAIC0xNjU4LDggKzE2MzUsNyBAQAogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVGVVNFX0NMSywgMHgwMik7CiAJfQogCi19CS8qIGVmdXNlX1Bvd2VyU3dpdGNoICovCi0KK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb246CWVmdXNlX0dldEN1cnJlbnRTaXplCkBAIC0xNjg2LDggKzE2NjIsNiBAQAogCXU4IGhvZmZzZXQ9MCxod29yZGVuPTA7CiAJdTggZWZ1c2VfZGF0YSx3b3JkX2NudHM9MDsKIAotCS8vZWZ1c2VfcmVnX2N0cmwocEFkYXB0ZXIsVFJVRSk7Ly9wb3dlciBvbgotCiAJd2hpbGUgKAliQ29udGludWFsICYmCiAJCQllZnVzZV9PbmVCeXRlUmVhZChkZXYsIGVmdXNlX2FkZHIgLCZlZnVzZV9kYXRhKSAmJgogCQkJKGVmdXNlX2FkZHIgIDwgRUZVU0VfTUFYX1NJWkUpICkKQEAgLTE3MDYsMTIgKzE2ODAsOSBAQAogCQl9CiAJfQogCi0JLy9lZnVzZV9yZWdfY3RybChwQWRhcHRlcixGQUxTRSk7Ly9wb3dlciBvZmYKLQogCXJldHVybiBlZnVzZV9hZGRyOwogCi19CS8vIGVmdXNlX0dldEN1cnJlbnRTaXplfQotCit9CiAKIC8qICAxMS8xNi8yMDA4IE1IIEFkZCBkZXNjcmlwdGlvbi4gR2V0IGN1cnJlbnQgZWZ1c2UgYXJlYSBlbmFibGVkIHdvcmQhIS4gKi8KIHN0YXRpYyB1OApAQCAtMTcyMyw3ICsxNjk0LDcgQEAKIAlpZighKHdvcmRfZW4gJiBCSVQyKSkJd29yZF9jbnRzKys7CiAJaWYoISh3b3JkX2VuICYgQklUMykpCXdvcmRfY250cysrOwogCXJldHVybiB3b3JkX2NudHM7Ci19CS8vIGVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzCit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOglFRlVTRV9Qcm9ncmFtTWFwCkBAIC0xNzg2LDEyICsxNzU3LDEwIEBACiAJCQkJewogCQkJCQl1MzIJajsKIAotCQkJCQkvL0dldEhleFZhbHVlRnJvbVN0cmluZyhzekxpbmUsICZ1NGJSZWdWYWx1ZSwgJnU0Yk1vdmUpOwogCQkJCQllZnVzZV9QYXJzaW5nTWFwKHN6TGluZSwgJnU0YlJlZ1ZhbHVlLCAmdTRiTW92ZSk7CiAKIAkJCQkJLy8gR2V0IG5leHQgaGV4IHZhbHVlIGFzIEVFUFJPTSB2YWx1ZS4KIAkJCQkJc3pMaW5lICs9IHU0Yk1vdmU7Ci0JCQkJCS8vV3JpdGVFRXByb20oZGV2LCAodTE2KShpdGhMaW5lKjgraSksICh1MTYpdTRiUmVnVmFsdWUpOwogCQkJCQllZXByb21baW5kZXgrK10gPSAodTgpKHU0YlJlZ1ZhbHVlJjB4ZmYpOwogCQkJCQllZXByb21baW5kZXgrK10gPSAodTgpKCh1NGJSZWdWYWx1ZT4+OCkmMHhmZik7CiAKQEAgLTE4MDgsOSArMTc3Nyw2IEBACiAJCXJldHVybglSVF9TVEFUVVNfRkFJTFVSRTsKIAl9CiAKLQotCS8vUlRfUFJJTlRfREFUQShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJFRlVTRSAiKSwgZWVwcm9tLCBIV1NFVF9NQVhfU0laRV85MlMpOwotCiAJLy8gVXNlIG1hcCBmaWxlIHRvIHVwZGF0ZSByZWFsIEVmdXNlIG9yIHNoYWRvdyBtb2RpZnkgdGFibGUuCiAJaWYgKFRhYmxlVHlwZSA9PSAxKQogCXsKQEAgLTE4MjQsNDYgKzE3OTAsMTAgQEAKIAl9CiAKIAlyZXR1cm4JcnRTdGF0dXM7Ci19CS8qIEVGVVNFX1Byb2dyYW1NYXAgKi8KK30KIAogI2VuZGlmCiAKLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlSZXR1cm4gVFJVRSBpZiBjaFRtcCBpcyByZXByZXNlbnQgZm9yIGhleCBkaWdpdCBhbmQKLS8vCQlGQUxTRSBvdGhlcndpc2UuCi0vLwotLy8KLWJvb2wgSXNIZXhEaWdpdCgJY2hhciBjaFRtcCkKLXsKLQlpZiggKGNoVG1wID49ICcwJyAmJiBjaFRtcCA8PSAnOScpIHx8Ci0JCShjaFRtcCA+PSAnYScgJiYgY2hUbXAgPD0gJ2YnKSB8fAotCQkoY2hUbXAgPj0gJ0EnICYmIGNoVG1wIDw9ICdGJykgKQotCXsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlUcmFuc2xhdGUgYSBjaGFyYWN0ZXIgdG8gaGV4IGRpZ2l0LgotLy8KLXUzMiBNYXBDaGFyVG9IZXhEaWdpdChjaGFyIGNoVG1wKQotewotCWlmKGNoVG1wID49ICcwJyAmJiBjaFRtcCA8PSAnOScpCi0JCXJldHVybiAoY2hUbXAgLSAnMCcpOwotCWVsc2UgaWYoY2hUbXAgPj0gJ2EnICYmIGNoVG1wIDw9ICdmJykKLQkJcmV0dXJuICgxMCArIChjaFRtcCAtICdhJykpOwotCWVsc2UgaWYoY2hUbXAgPj0gJ0EnICYmIGNoVG1wIDw9ICdGJykKLQkJcmV0dXJuICgxMCArIChjaFRtcCAtICdBJykpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOgllZnVzZV9QYXJzaW5nTWFwCiAgKgpAQCAtMTg4OSw5ICsxODE5LDYgQEAKIAkvLyBDaGVjayBpbnB1dCBwYXJhbWV0ZXIuCiAJaWYoc3pTdHIgPT0gTlVMTCB8fCBwdTRiVmFsID09IE5VTEwgfHwgcHU0Yk1vdmUgPT0gTlVMTCkKIAl7Ci0JCS8vUlRfVFJBQ0UoQ09NUF9FRlVTRSwKLQkJLy8iZWVwcm9tX1BhcnNpbmdNYXAoKTogSW52YWxpZCBJTiBhcmdzISBzelN0cjogJXAsIHB1NGJWYWw6ICVwLCBwdTRiTW92ZTogJXBcbiIsCi0JCS8vc3pTdHIsIHB1NGJWYWwsIHB1NGJNb3ZlKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIApAQCAtMTkwOSwzNCArMTgzNiwyNiBAQAogCiAJLy8gQ2hlY2sgaWYgc3pTY2FuIGlzIG5vdyBwb2ludGVyIHRvIGEgY2hhcmFjdGVyIGZvciBoZXggZGlnaXQsCiAJLy8gaWYgbm90LCBpdCBtZWFucyB0aGlzIGlzIG5vdCBhIHZhbGlkIGhleCBudW1iZXIuCi0JaWYoIUlzSGV4RGlnaXQoKnN6U2NhbikpCi0JeworCWlmICghaXN4ZGlnaXQoKnN6U2NhbikpCiAJCXJldHVybiBGQUxTRTsKLQl9CiAKIAkvLyBQYXJzZSBlYWNoIGRpZ2l0LgogCWRvCiAJewotCQkoKnB1NGJWYWwpIDw8PSA0OwotCQkqcHU0YlZhbCArPSBNYXBDaGFyVG9IZXhEaWdpdCgqc3pTY2FuKTsKKwkJKnB1NGJWYWwgPSAoKnB1NGJWYWwgPDwgNCkgKyBoZXhfdG9fYmluKCpzelNjYW4pOwogCiAJCXN6U2NhbisrOwogCQkoKnB1NGJNb3ZlKSsrOwotCX0gd2hpbGUoSXNIZXhEaWdpdCgqc3pTY2FuKSk7CisJfSB3aGlsZSAoaXN4ZGlnaXQoKnN6U2NhbikpOwogCiAJcmV0dXJuIFRSVUU7CiAKLX0JLyogZWZ1c2VfUGFyc2luZ01hcCAqLworfQogI2VuZGlmCiAKLS8vCi0vLyBVc2VsZXNzIFNlY3Rpb24gQ29kZSBOb3chISEhISEKLS8vCi0vLyBQb3J0aW5nIGZyb20gODcxMiBTRElPCiBpbnQgZWZ1c2Vfb25lX2J5dGVfcncoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggYlJlYWQsIHUxNiBhZGRyLCB1OCAqZGF0YSkKIHsKIAl1MzIgYlJlc3VsdDsKLQkvL3U4IGVmdXNlX2N0bHJlZyx0bXBpZHggPSAwOwogCXU4IHRtcGlkeCA9IDA7CiAJdTggdG1wdjg9MDsKIApAQCAtMTk2NSw3ICsxODg0LDYgQEAKIAogCX0KIAllbHNlewotCQkvL3JldHVybgkwOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVGVVNFX0NUUkwsICpkYXRhKTsvL2RhdGEKIAogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVGVVNFX0NUUkwrMywgMHhGMik7Ly93cml0ZSBjbWQKQEAgLTE5ODcsMjEgKzE5MDUsMTggQEAKIAl9CiAJcmV0dXJuIGJSZXN1bHQ7CiB9Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiB2b2lkIGVmdXNlX2FjY2VzcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBiUmVhZCx1MTYgc3RhcnRfYWRkciwgdTggY250cywgdTggKmRhdGEpCiB7CiAJdTgJZWZ1c2VfY2xrX29yaSxlZnVzZV9jbGtfbmV3Oy8vLHRtcDg7CiAJdTMyIGkgPSAwOwogCiAJaWYoc3RhcnRfYWRkcj4weDIwMCkgcmV0dXJuOwotCS8vUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21wX2lvY3RsX2NfLF9kcnZfZXJyXywKLQkvLwkoIlxuID09PT4gZWZ1c2VfYWNjZXNzIFtzdGFydF9hZGRyPTB4JXggY250czolZCBkYXRhYXJyYXk6MHglMDh4ICBRdWVyeSBFZnVzZV0uXG4iLHN0YXJ0X2FkZHIsY250cyxkYXRhKSk7CiAJLy8gLS0tLS0tLS0tLS0tLS0tLS1TWVNfRlVOQ19FTiBEaWdpdGFsIENvcmUgVmRkIGVuYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAllZnVzZV9jbGtfb3JpID0gcmVhZF9uaWNfYnl0ZShkZXYsU1lTX0ZVTkNfRU4rMSk7CiAJZWZ1c2VfY2xrX25ldyA9IGVmdXNlX2Nsa19vcml8MHgyMDsKIAogCWlmKGVmdXNlX2Nsa19uZXchPSBlZnVzZV9jbGtfb3JpKXsKLQkJLy9SVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbXBfaW9jdGxfY18sX2Rydl9lcnJfLCgiPT09PXdyaXRlIDB4MTAyNTAwMDM9PT09PVxuIikpOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNZU19GVU5DX0VOKzEsIGVmdXNlX2Nsa19uZXcpOwogCX0KICNpZmRlZiBfUE9XRVJPTl9ERUxBWV8KQEAgLTIwMjEsOSArMTkzNiw4IEBACiAJLy8tLS0tLS0tLS0tLS0tLS0tLWUtZnVzZSBvbmUgYnl0ZSByZWFkIC8gd3JpdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJZm9yKGk9MDtpPGNudHM7aSsrKXsKIAkJZWZ1c2Vfb25lX2J5dGVfcncoZGV2LGJSZWFkLCBzdGFydF9hZGRyK2kgLCBkYXRhK2kpOwotCQkvLy8vUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21wX2lvY3RsX2NfLF9kcnZfZXJyXywoIj09PmVmdXNlX2FjY2VzcyBhZGRyOjB4JTAyeCB2YWx1ZToweCUwMnhcbiIsZGF0YStpLCooZGF0YStpKSkpOworCiAJfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tZS1mdXNlIHB3ciAmIGNsayByZWcgY3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAl3cml0ZV9uaWNfYnl0ZShkZXYsIEVGVVNFX1RFU1QrMywgcmVhZF9uaWNfYnl0ZShkZXYsIEVGVVNFX1RFU1QrMykmMHg3Zik7CiAJd3JpdGVfbmljX2J5dGUoZGV2LCBFRlVTRV9DTEtfQ1RSTCwgcmVhZF9uaWNfYnl0ZShkZXYsIEVGVVNFX0NMS19DVFJMKSYweGZkKTsKIApAQCAtMjAzMSw4ICsxOTQ1LDYgQEAKIAlpZihlZnVzZV9jbGtfbmV3ICE9IGVmdXNlX2Nsa19vcmkpCXdyaXRlX25pY19ieXRlKGRldiwgMHgxMDI1MDAwMywgZWZ1c2VfY2xrX29yaSk7CiAKIH0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAjaWZkZWYgVE9fRE9fTElTVAogc3RhdGljCXZvaWQgZWZ1c2VfcmVnX2N0cmwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggYlBvd2VyT24pCkBAIC0yMDYwLDE1ICsxOTcyLDEyIEBACiAJCXdyaXRlX25pY19ieXRlKGRldiwgRUZVU0VfQ0xLX0NUUkwsIHJlYWRfbmljX2J5dGUoZGV2LCBFRlVTRV9DTEtfQ1RSTCkmMHhmZCk7CiAJCS8vIC0tLS0tLS0tLS0tLS0tLS0tU1lTX0ZVTkNfRU4gRGlnaXRhbCBDb3JlIFZkZCBkaXNhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JCS8vd3JpdGVfbmljX2J5dGUocEFkYXB0ZXIsIFNZU19GVU5DX0VOKzEsICByZWFkX25pY19ieXRlKHBBZGFwdGVyLFNZU19GVU5DX0VOKzEpJjB4REYpOwogCX0KIAogCiB9CiAjZW5kaWYKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGVmdXNlX3JlYWRfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LHU4IGVmdXNlX3JlYWRfaXRlbSx1OCAqZGF0YSx1MzIgZGF0YV9zaXplKQogewogCXU4IG9mZnNldCwgd29yZF9zdGFydCxieXRlX3N0YXJ0LGJ5dGVfY250czsKQEAgLTIwNzksMTAgKzE5ODgsOCBAQAogCiAJdTggdG1waWR4OwogCXU4IHBnX2RhdGFbOF07Ci0JLy91OAl0ZW1wX3ZhbHVlWzhdID0gezB4ZmZ9OwogCiAJaWYoZWZ1c2VfcmVhZF9pdGVtPiAgKHNpemVvZihSVEw4NzEyX1NESU9fRUZVU0VfVEFCTEUpL3NpemVvZihFRlVTRV9NQVApKSl7Ci0JCS8vZXJyb3IgbXNnCiAJCXJldHVybiA7CiAJfQogCkBAIC0yMDkyLDQ4ICsxOTk5LDM5IEBACiAJYnl0ZV9jbnRzICAgCT0gUlRMODcxMl9TRElPX0VGVVNFX1RBQkxFW2VmdXNlX3JlYWRfaXRlbV0uYnl0ZV9jbnRzOwogCiAJaWYoZGF0YV9zaXplIT1ieXRlX2NudHMpewotCQkvL2Vycm9yIG1zZwogCQlyZXR1cm47CiAJfQogCiAJcGdfcGt0X2NudHMgPSAoYnl0ZV9jbnRzIC9QR1BLVF9EQVRBX1NJWkUpICsxOwogCiAJaWYocGdfcGt0X2NudHMgPiAxKXsKLQkJLy90bXBkYXRhID0gX21hbGxvYyhwZ19wa3RfY250cypQR1BLVF9EQVRBX1NJWkUpOwogCQl0bXBkYXRhID0gZWZ1c2VkYXRhOwogCiAJCWlmKHRtcGRhdGEhPU5VTEwpCiAJCXsKIAkJCW1lbXNldCh0bXBkYXRhLDB4ZmYscGdfcGt0X2NudHMqUEdQS1RfREFUQV9TSVpFKTsKLQkJCS8vUGxhdGZvcm1GaWxsTWVtb3J5KChQVk9JRClwZ19kYXRhLCBwZ19wa3RfY250cypQR1BLVF9EQVRBX1NJWkUsIDB4ZmYpOwogCiAJCQlmb3IodG1waWR4PTA7dG1waWR4PHBnX3BrdF9jbnRzO3RtcGlkeCsrKQogCQkJewogCQkJCW1lbXNldChwZ19kYXRhLDB4ZmYsUEdQS1RfREFUQV9TSVpFKTsKLQkJCQkvL1BsYXRmb3JtRmlsbE1lbW9yeSgoUFZPSUQpcGdfZGF0YSwgUEdQS1RfREFUQV9TSVpFLCAweGZmKTsKIAkJCQlpZihUUlVFPT0gZWZ1c2VfUGdQYWNrZXRSZWFkKGRldixvZmZzZXQrdG1waWR4LHBnX2RhdGEpKQogCQkJCXsKIAkJCQkJbWVtY3B5KHRtcGRhdGErKFBHUEtUX0RBVEFfU0laRSp0bXBpZHgpLHBnX2RhdGEsUEdQS1RfREFUQV9TSVpFKTsKLQkJCQkJLy9QbGF0Zm9ybU1vdmVNZW1vcnkoKFBWT0lEKSh0bXBkYXRhKyhQR1BLVF9EQVRBX1NJWkUqdG1waWR4KSksIChQVk9JRClwZ19kYXRhLCBQR1BLVF9EQVRBX1NJWkUpOwogCQkJCX0KIAkJCX0KIAkJCW1lbWNweShkYXRhLCh0bXBkYXRhKyAoMip3b3JkX3N0YXJ0KStieXRlX3N0YXJ0ICksZGF0YV9zaXplKTsKLQkJCS8vUGxhdGZvcm1Nb3ZlTWVtb3J5KChQVk9JRClkYXRhLCAoUFZPSUQpKHRtcGRhdGErICgyKndvcmRfc3RhcnQpK2J5dGVfc3RhcnQgKSwgZGF0YV9zaXplKTsKLQkJCS8vX21mcmVlKHRtcGRhdGEsIHBnX3BrdF9jbnRzKlBHUEtUX0RBVEFfU0laRSk7CiAJCX0KIAl9CiAJZWxzZQogCXsKIAkJbWVtc2V0KHBnX2RhdGEsMHhmZixQR1BLVF9EQVRBX1NJWkUpOwotCQkvL1BsYXRmb3JtRmlsbE1lbW9yeSgoUFZPSUQpcGdfZGF0YSwgUEdQS1RfREFUQV9TSVpFLCAweGZmKTsKIAkJaWYoVFJVRT09ZWZ1c2VfUGdQYWNrZXRSZWFkKGRldixvZmZzZXQscGdfZGF0YSkpewogCQkJbWVtY3B5KGRhdGEscGdfZGF0YSsgKDIqd29yZF9zdGFydCkrYnl0ZV9zdGFydCAsZGF0YV9zaXplKTsKLQkJCS8vUGxhdGZvcm1Nb3ZlTWVtb3J5KChQVk9JRClkYXRhLCAoUFZPSUQpKHBnX2RhdGErICgyKndvcmRfc3RhcnQpK2J5dGVfc3RhcnQpLCBkYXRhX3NpemUpOwogCQl9CiAJfQogCiB9Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAvL3BlciBpbnRlcmZhY2UgZG9lc24ndCBhbGlrZQogdm9pZCBlZnVzZV93cml0ZV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsdTggZWZ1c2Vfd3JpdGVfaXRlbSx1OCAqZGF0YSx1MzIgZGF0YV9zaXplLHUzMiBiV29yZFVuaXQpCiB7CkBAIC0yMTQ1LDcgKzIwNDMsNiBAQAogCXU4IHBnX2RhdGFbOF0sdG1wYnl0ZXM9MDsKIAogCWlmKGVmdXNlX3dyaXRlX2l0ZW0+ICAoc2l6ZW9mKFJUTDg3MTJfU0RJT19FRlVTRV9UQUJMRSkvc2l6ZW9mKEVGVVNFX01BUCkpKXsKLQkJLy9lcnJvciBtc2cKIAkJcmV0dXJuIDsKIAl9CiAKQEAgLTIxNTUsNyArMjA1Miw2IEBACiAJYnl0ZV9jbnRzICAgCT0gUlRMODcxMl9TRElPX0VGVVNFX1RBQkxFW2VmdXNlX3dyaXRlX2l0ZW1dLmJ5dGVfY250czsKIAogCWlmKGRhdGFfc2l6ZSA+ICBieXRlX2NudHMpewotCQkvL2Vycm9yIG1zZwogCQlyZXR1cm47CiAJfQogCXBnX3BrdF9jbnRzID0gKGJ5dGVfY250cyAvUEdQS1RfREFUQV9TSVpFKSArMTsKQEAgLTIxNjgsMTMgKzIwNjQsMTEgQEAKIAogCQlpZigoZWZ1c2Vfd3JpdGVfaXRlbT09RUZVU0VfRjBDSVMpfHwoZWZ1c2Vfd3JpdGVfaXRlbT09RUZVU0VfRjFDSVMpKXsKIAkJCW1lbXNldChwZ19kYXRhLDB4ZmYsUEdQS1RfREFUQV9TSVpFKTsKLQkJCS8vUGxhdGZvcm1GaWxsTWVtb3J5KChQVk9JRClwZ19kYXRhLCBQR1BLVF9EQVRBX1NJWkUsIDB4ZmYpOwogCQkJZWZ1c2VfUGdQYWNrZXRSZWFkKGRldixvZmZzZXQscGdfZGF0YSk7CiAKIAkJCWlmKGVmdXNlX3dyaXRlX2l0ZW09PUVGVVNFX0YwQ0lTKXsKIAkJCQl3b3JkX2VuID0gMHgwNzsKIAkJCQltZW1jcHkocGdfZGF0YSt3b3JkX3N0YXJ0KjIrYnl0ZV9zdGFydCxkYXRhLHNpemVvZih1OCkqMik7Ci0JCQkJLy9QbGF0Zm9ybU1vdmVNZW1vcnkoKFBWT0lEKShwZ19kYXRhK3dvcmRfc3RhcnQqMitieXRlX3N0YXJ0KSwgKFBWT0lEKWRhdGEsIHNpemVvZih1OCkqMik7CiAJCQkJZWZ1c2VfUGdQYWNrZXRXcml0ZShkZXYsb2Zmc2V0LHdvcmRfZW4scGdfZGF0YSsod29yZF9zdGFydCoyKSk7CiAKIAkJCQl3b3JkX2VuID0gMHgwMDsKQEAgLTIxODMsNyArMjA3Nyw2IEBACiAJCQkJd29yZF9lbiA9IDB4MDA7CiAJCQkJZWZ1c2VfUGdQYWNrZXRSZWFkKGRldixvZmZzZXQrMixwZ19kYXRhKTsKIAkJCQltZW1jcHkocGdfZGF0YSxkYXRhKzIrOCxzaXplb2YodTgpKjcpOwotCQkJCS8vUGxhdGZvcm1Nb3ZlTWVtb3J5KChQVk9JRCkocGdfZGF0YSksIChQVk9JRCkoZGF0YSsyKzgpLCBzaXplb2YodTgpKjcpOwogCiAJCQkJZWZ1c2VfUGdQYWNrZXRXcml0ZShkZXYsKG9mZnNldCsyKSx3b3JkX2VuLHBnX2RhdGEpOwogCQkJfQpAQCAtMjIwMiw3ICsyMDk1LDYgQEAKIAkJfQogCQllbHNlewogCQkJbWVtc2V0KHBnX2RhdGEsMHhmZixQR1BLVF9EQVRBX1NJWkUpOwotCQkJLy9QbGF0Zm9ybUZpbGxNZW1vcnkoKFBWT0lEKXBnX2RhdGEsIFBHUEtUX0RBVEFfU0laRSwgMHhmZik7CiAJCQlpZigoZWZ1c2Vfd3JpdGVfaXRlbT09RUZVU0VfU0RJT19TRVRUSU5HKXx8KGVmdXNlX3dyaXRlX2l0ZW09PUVGVVNFX0NDQ1IpKXsKIAkJCQl3b3JkX2VuID0gMHgwZSA7CiAJCQkJdG1wYnl0ZXMgPSAyOwpAQCAtMjIyMSwxMiArMjExMywxMCBAQAogCQkJfQogCQkJaWYoYldvcmRVbml0PT1UUlVFKXsKIAkJCQltZW1jcHkocGdfZGF0YSt3b3JkX3N0YXJ0KjIgLGRhdGEsc2l6ZW9mKHU4KSp0bXBieXRlcyk7Ci0JCQkJLy9QbGF0Zm9ybU1vdmVNZW1vcnkoKFBWT0lEKShwZ19kYXRhK3dvcmRfc3RhcnQqMiksIChQVk9JRCkoZGF0YSksIHNpemVvZih1OCkqdG1wYnl0ZXMpOwogCQkJfQogCQkJZWxzZXsKIAkJCQllZnVzZV9QZ1BhY2tldFJlYWQoZGV2LG9mZnNldCxwZ19kYXRhKTsKIAkJCQltZW1jcHkocGdfZGF0YSsoMip3b3JkX3N0YXJ0KStieXRlX3N0YXJ0LGRhdGEsc2l6ZW9mKHU4KSpieXRlX2NudHMpOwotCQkJCS8vUGxhdGZvcm1Nb3ZlTWVtb3J5KChQVk9JRCkocGdfZGF0YSsoMip3b3JkX3N0YXJ0KStieXRlX3N0YXJ0KSwgKFBWT0lEKShkYXRhKSwgc2l6ZW9mKHU4KSpieXRlX2NudHMpOwogCQkJfQogCiAJCQllZnVzZV9QZ1BhY2tldFdyaXRlKGRldixvZmZzZXQsd29yZF9lbixwZ19kYXRhKyh3b3JkX3N0YXJ0KjIpKTsKQEAgLTIyMzQsNyArMjEyNCw2IEBACiAJCX0KIAogCX0KLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCWVsc2UgaWYocGdfcGt0X2NudHM+MSl7Ly9zaXR1YXRpb24gQgogCQlpZih3b3JkX3N0YXJ0PT0wKXsKIAkJCXdvcmRfZW4gPSAweDAwOwpAQCAtMjI1NSw3ICsyMTQ0LDYgQEAKIAogCQl9CiAJfQotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJZWxzZXsvL3NpdHVhdGlvbiBDCiAJCXdvcmRfZW4gPSAweDBmOwogCQlmb3IodG1waWR4PSAwOyB0bXBpZHg8d29yZF9jbnRzIDsgdG1waWR4KyspCkBAIC0yMjY3LDcgKzIxNTUsNiBAQAogCX0KIAogfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBlZnVzZXRfdGVzdF9mdW5jX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKIHsKQEAgLTIyODgsNyArMjE3NSw2IEBACiAJbWVtc2V0KHR4cG93ZXJ0YWJsZSwwLHNpemVvZih1OCkqMjgpOwogCWVmdXNlX3JlYWRfZGF0YShkZXYsRUZVU0VfVFhQV19UQUIsdHhwb3dlcnRhYmxlLHNpemVvZih0eHBvd2VydGFibGUpKTsKIH0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgZWZ1c2V0X3Rlc3RfZnVuY193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewpAQCAtMjMxMSwxOSArMjE5NywzIEBACiAJZWZ1c2Vfd3JpdGVfZGF0YShkZXYsRUZVU0VfU0RJT19TRVRUSU5HLHRtcGRhdGEsc2l6ZW9mKHRtcGRhdGEpLGJXb3JkVW5pdCk7CiAKIH0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotCi0KLQotCi0KLQotCi0KLS8qIEVuZCBvZiBFZnVzZS5jICovCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX0VmdXNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19FZnVzZS5oCmluZGV4IDFlNTAxNTMuLmM0OGExMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX0VmdXNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfRWZ1c2UuaApAQCAtMSwzOSArMSwzOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotICogICAgIChjKSBDb3B5cmlnaHQgIDIwMDgsIFJlYWxURUsgVGVjaG5vbG9naWVzIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEJhc2VkIG9uIHRoZSByODE4MCBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+LCBldCBhbC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTW9kdWxlOglFZnVzZS5oCSggSGVhZGVyIEZpbGUpCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgogICoKLSAqIE5vdGU6CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQogICoKLSAqIEZ1bmN0aW9uOgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgogICoKLSAqIEV4cG9ydDoKLSAqCi0gKiBBYmJyZXY6Ci0gKgotICogSGlzdG9yeToKLSAqIERhdGEJCQlXaG8JCVJlbWFyawotICoKLSAqIDA5LzIzLzIwMDgJTUhDCQlQb3J0aW5nIEVmdXNlIFIvVyBBUEkgZnJvbSBXTUFDLgotICogMTEvMTAvMjAwOAlNSEMJCVBvcnRpbmcgRWZ1c2UuaCBmcm9tIDg3MTIgU0RJTy4KLSAqCQkJCQkJMS4gV2UgbXVzZSByZWRlZmluZSB0aGUgaGVhZGVyIGZpbGUgdG8gZml0IG91ciBjb2RpbmcKLSAqCQkJCQkJICAgc3R5bGUuCi0gKgkJCQkJCTIuIFRIZSBBUEkgd2UgZXhwb3J0IHRvIG90aGVyIG1vZHVsZSwgd2UgbXVzdCByZWRlZmluZQotICoJCQkJCQkgICBmb3IgODE5MlMgc2VyaWVzLgotICoKLSAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBoYXMgYmVlbiBpbmNsdWRlZCBhbHJlYWR5LiAgKi8KIAogI2lmbmRlZiBfX0lOQ19FRlVTRV9ICiAjZGVmaW5lIF9fSU5DX0VGVVNFX0gKIAotLy8gUm9nZXIgcG9ydGluZyBmb3IgODE5MlNVCiAjZGVmaW5lCQlFRlVTRV9GT1JfOTJTVQkJMQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUJCUVGVVNFX01BQ19MRU4JCQkJCTB4MjAwCisjZGVmaW5lCQlFRlVTRV9SRUFMX0NPTlRFTlRfTEVOCQk1MTIKKyNkZWZpbmUJCUVGVVNFX01BUF9MRU4JCQkJCTEyOAorI2RlZmluZQkJRUZVU0VfTUFYX1NFQ1RJT04JCQkxNgorI2RlZmluZQkJRUZVU0VfTUFYX1dPUkRfVU5JVAkJCTQKIAogI2RlZmluZQkJRUZVU0VfSU5JVF9NQVAJCQkJMAogI2RlZmluZQkJRUZVU0VfTU9ESUZZX01BUAkJCQkxCkBAIC00MSw3ICs0MCw2IEBACiAjZGVmaW5lCQlFRlVTRV9DTEtfQ1RSTAkJCUVGVVNFX0NUUkwKICNkZWZpbmUgCUVGVVNFX0JJVCh4KSAgKDEgPDwgKHgpKQogCi0vLyBGcm9tIDg3MTIhISEhISEhIQogI2RlZmluZQkJUEdfU1RBVEVfSEVBREVSIAkweDAxCiAjZGVmaW5lCQlQR19TVEFURV9XT1JEXzAJCTB4MDIKICNkZWZpbmUJCVBHX1NUQVRFX1dPUkRfMQkJMHgwNApAQCAtNTIsMjMgKzUwLDYgQEAKICNkZWZpbmUJCVBHX1NXQllURV9ICQkJMHgwMQogI2RlZmluZQkJUEdfU1dCWVRFX0wJCQkweDAyCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgUGFyYW1ldGVycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBleHRlcm4Jdm9pZAogRUZVU0VfSW5pdGlhbGl6ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKIGV4dGVybgl1OApAQCAtODEsMjEgKzYyLDE4IEBACiBSZWFkRUZ1c2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldix1MTYgX29mZnNldCx1MTYgX3NpemVfYnl0ZSx1OCogcGJ1Zik7CiBleHRlcm4Jdm9pZAogUmVhZEVGdXNlQnl0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LHUxNiAgX29mZnNldCx1OCAgKnBidWYpOwotI2VuZGlmCS8vICNpZiAoRUZVU0VfRk9SXzkyU1UgPT0gMSkKKyNlbmRpZgogCiBleHRlcm4Jdm9pZAogRUZVU0VfU2hhZG93UmVhZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LHVuc2lnbmVkIGNoYXIgVHlwZSx1bnNpZ25lZCBzaG9ydCBPZmZzZXQsdTMyICpWYWx1ZSk7CiBleHRlcm4Jdm9pZAogRUZVU0VfU2hhZG93V3JpdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldix1bnNpZ25lZCBjaGFyIFR5cGUsdW5zaWduZWQgc2hvcnQgT2Zmc2V0LHUzMiBWYWx1ZSk7Ci1leHRlcm4Jdm9pZAorZXh0ZXJuCWJvb2wKIEVGVVNFX1NoYWRvd1VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKIGV4dGVybgl2b2lkCiBFRlVTRV9TaGFkb3dNYXBVcGRhdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CiAKIGV4dGVybglib29sCiBFRlVTRV9Qcm9ncmFtTWFwKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsY2hhciogcEZpbGVOYW1lLCB1OCBUYWJsZVR5cGUpOwkJLy8gMD1TaGFkb3cgMT1SZWFsIEVmdXNlCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogRW5kIG9mIEVmdXNlLmggKi8KLQotI2VuZGlmIC8vX19JTkNfRUZVU0VfSAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfZmlybXdhcmUuYwppbmRleCA1MDM2ZDU0Li5kYjBkMmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX2Zpcm13YXJlLmMKQEAgLTEsMTYgKzEsMjIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHJvY2VkdXJlOiAgICBJbml0IGJvb3QgY29kZS9maXJtd2FyZSBjb2RlL2RhdGEgc2Vzc2lvbgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotICogRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGludGlhbGl6ZSBmaXJtd2FyZS4gSWYgYW55IGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uCi0gKiAJCXByb2Nlc3MsIHRoZSByb3V0aW5lIHNoYWxsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIGZhaWwuCi0gKgkJTklDIGRyaXZlciBzaG91bGQgY2FsbCBOZGlzT3BlbkZpbGUgb25seSBmcm9tIE1pbmlwb3J0SW5pdGlhbGl6ZS4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCiAgKgotICogQXJndW1lbnRzOiAgIFRoZSBwb2ludGVyIG9mIHRoZSBhZGFwdGVyCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICogUmV0dXJuczoKLSAqICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCi0gKiAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAicjgxOTJVLmgiCiAjaW5jbHVkZSAicjgxOTJTX2Zpcm13YXJlLmgiCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfZmlybXdhcmUuaAppbmRleCAyYzJjZjgwLi43ZjI2OGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19maXJtd2FyZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX2Zpcm13YXJlLmgKQEAgLTEsNDQgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fSU5DX0ZJUk1XQVJFX0gKICNkZWZpbmUgX19JTkNfRklSTVdBUkVfSAogCiAKLS8vI2RlZmluZSBSVEw4MTkwX0NQVV9TVEFSVF9PRkZTRVQJMHg4MAotLyogVE9ETzogdGhpcyBkZWZpbml0aW9uIGlzIFRCRCAqLwotLy8jZGVmaW5lIFVTQl9IV0RFU0NfSEVBREVSX0xFTgkwCi0KLS8qIEl0IHNob3VsZCBiZSBkb3VibGUgd29yZCBhbGlnbm1lbnQgKi8KLS8vI2lmIERFVl9CVVNfVFlQRT09UENJX0lOVEVSRkFDRQotLy8jZGVmaW5lIEdFVF9DT01NQU5EX1BBQ0tFVF9GUkFHX1RIUkVTSE9MRCh2KQk0Kih2LzQpIC0gOAotLy8jZWxzZQotLy8jZGVmaW5lIEdFVF9DT01NQU5EX1BBQ0tFVF9GUkFHX1RIUkVTSE9MRCh2KQkoNCoodi80KSAtIDggLSBVU0JfSFdERVNDX0hFQURFUl9MRU4pCi0vLyNlbmRpZgotCi0vL3R5cGVkZWYgZW51bSBfZmlybXdhcmVfaW5pdF9zdGVwewotLy8JRldfSU5JVF9TVEVQMF9CT09UID0gMCwKLS8vCUZXX0lOSVRfU1RFUDFfTUFJTiA9IDEsCi0vLwlGV19JTklUX1NURVAyX0RBVEEgPSAyLAotLy99ZmlybXdhcmVfaW5pdF9zdGVwX2U7Ci0KLS8vdHlwZWRlZiBlbnVtIF9ERVNDX1BBQ0tFVF9UWVBFewotLy8JREVTQ19QQUNLRVRfVFlQRV9JTklUID0gMCwKLS8vCURFU0NfUEFDS0VUX1RZUEVfTk9STUFMID0gMSwKLS8vfURFU0NfUEFDS0VUX1RZUEU7Ci0jZGVmaW5lCVJUTDgxOTJTX0ZXX1BLVF9GUkFHX1NJWkUJCTB4RkYwMAkvLyA2NEsKLQotCiAjZGVmaW5lIAlSVEw4MTkwX01BWF9GSVJNV0FSRV9DT0RFX1NJWkUJNjQwMDAJLy82NGsKICNkZWZpbmUJTUFYX0ZJUk1XQVJFX0NPREVfU0laRQkweEZGMDAgLy8gRmlybXdhcmUgTG9jYWwgYnVmZmVyIHNpemUuCiAjZGVmaW5lIAlSVEw4MTkwX0NQVV9TVEFSVF9PRkZTRVQJCQkweDgwCi0KKyNkZWZpbmUJUlRMODE5MlNfRldfUEtUX0ZSQUdfU0laRQkJMHg0MDAwCiAjZGVmaW5lIEdFVF9DT01NQU5EX1BBQ0tFVF9GUkFHX1RIUkVTSE9MRCh2KQkoNCoodi80KSAtIDggLSBVU0JfSFdERVNDX0hFQURFUl9MRU4pCiAKLS8vdHlwZWRlZiBlbnVtIF9ERVNDX1BBQ0tFVF9UWVBFewotLy8JREVTQ19QQUNLRVRfVFlQRV9JTklUID0gMCwKLS8vCURFU0NfUEFDS0VUX1RZUEVfTk9STUFMID0gMSwKLS8vfURFU0NfUEFDS0VUX1RZUEU7CiAKLS8vIEZvcndhcmQgZGVjbGFyYXRpb24uCi0vL3R5cGVkZWYJc3RydWN0IF9BREFQVEVSCUFEQVBURVIsICpQQURBUFRFUjsKICNpZmRlZiBSVEw4MTkyUwogdHlwZWRlZiBlbnVtIF9maXJtd2FyZV9pbml0X3N0ZXB7CiAJRldfSU5JVF9TVEVQMF9JTUVNID0gMCwKQEAgLTY0LDE3ICs1Miw4IEBACiAJT1BUX0ZJUk1XQVJFX1JFU0VUID0gMSwKIH1vcHRfcnN0X3R5cGVfZTsKIAotLyp0eXBlZGVmIGVudW0gX0ZJUk1XQVJFX1NUQVRVU3sKLQlGV19TVEFUVVNfMF9JTklUID0gMCwKLQlGV19TVEFUVVNfMV9NT1ZFX0JPT1RfQ09ERSA9IDEsCi0JRldfU1RBVFVTXzJfTU9WRV9NQUlOX0NPREUgPSAyLAotCUZXX1NUQVRVU18zX1RVUk5PTl9DUFUgPSAzLAotCUZXX1NUQVRVU180X01PVkVfREFUQV9DT0RFID0gNCwKLQlGV19TVEFUVVNfNV9SRUFEWSA9IDUsCi19RklSTVdBUkVfU1RBVFVTOwotKi8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJUTDgxOTJTIEZpcm13YXJlIHJlbGF0ZWQsIFJldmlzZWQgYnkgUm9nZXIsIDIwMDguMTIuMTguCisvLyBSVEw4MTkyUyBGaXJtd2FyZSByZWxhdGVkCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0eXBlZGVmICBzdHJ1Y3QgX1JUXzgxOTJTX0ZJUk1XQVJFX1BSSVYgeyAvLzgtYnl0ZXMgYWxpZ25tZW50IHJlcXVpcmVkCiAKQEAgLTE4MSw3ICsxNjAsNiBAQAogdHlwZWRlZiBzdHJ1Y3QgX3J0X2Zpcm13YXJlewogCVBSVF84MTkyU19GSVJNV0FSRV9IRFIJcEZ3SGVhZGVyOwogCUZJUk1XQVJFXzgxOTJTX1NUQVRVUwlGV1N0YXR1czsKLQl1MTYgICAgICAgICAgICAgRmlybXdhcmVWZXJzaW9uOwogCXU4CQlGd0lNRU1bUlRMODE5MF9NQVhfRklSTVdBUkVfQ09ERV9TSVpFXTsKIAl1OAkJRndFTUVNW1JUTDgxOTBfTUFYX0ZJUk1XQVJFX0NPREVfU0laRV07CiAJdTMyCQlGd0lNRU1MZW47CkBAIC0xODksMTEgKzE2Nyw0MyBAQAogCXU4CQlzekZ3VG1wQnVmZmVyWzE2NDAwMF07CiAgICAgICAgIHUzMiAgICAgICAgICAgICBzekZ3VG1wQnVmZmVyTGVuOwogCXUxNgkJQ21kUGFja2V0RnJhZ1RocmVzb2xkOworCXUxNgkJRmlybXdhcmVWZXJzaW9uOwogfXJ0X2Zpcm13YXJlLCAqcHJ0X2Zpcm13YXJlOwogCi0vL3R5cGVkZWYgc3RydWN0IF9SVF9GSVJNV0FSRV9JTkZPXzgxOTJTVXsKLS8vCXU4CQlzekluZm9bMTZdOwotLy99UlRfRklSTVdBUkVfSU5GT184MTkyU1UsICpQUlRfRklSTVdBUkVfSU5GT184MTkyU1U7CisjZGVmaW5lCQlGV19ESUdfRU5BQkxFX0NUTAkJCUJJVDAKKyNkZWZpbmUJCUZXX0hJR0hfUFdSX0VOQUJMRV9DVEwJCUJJVDEKKyNkZWZpbmUJCUZXX1NTX0NUTAkJCQkJCUJJVDIKKyNkZWZpbmUJCUZXX1JBX0lOSVRfQ1RMCQkJCUJJVDMKKyNkZWZpbmUJCUZXX1JBX0JHX0NUTAkJCQkJQklUNAorI2RlZmluZQkJRldfUkFfTl9DVEwJCQkJCUJJVDUKKyNkZWZpbmUJCUZXX1BXUl9UUktfQ1RMCQkJCUJJVDYKKyNkZWZpbmUJCUZXX0lRS19DVEwJCQkJCQlCSVQ3CisjZGVmaW5lCQlGV19BTlRFTk5BX1NXCQkJCUJJVDgKKyNkZWZpbmUJCUZXX0RJU0FCTEVfQUxMX0RNCQkJMAorCisjZGVmaW5lCQlGV19QV1JfVFJLX1BBUkFNX0NMUgkJMHgwMDAwZmZmZgorI2RlZmluZQkJRldfUkFfUEFSQU1fQ0xSCQkJCTB4ZmZmZjAwMDAKKworI2RlZmluZQlGV19DTURfSU9fQ0xSKF9wZGV2LCBfQml0KQkJXAorCXVkZWxheSgxMDAwKTsJCVwKKwkoKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoX3BkZXYpKS0+RndDbWRJT01hcCAmPSAofl9CaXQpOworCisjZGVmaW5lCUZXX0NNRF9JT19VUERBVEUoX3BkZXYsIF92YWwpCQlcCisJKChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KF9wZGV2KSktPkZ3Q21kSU9NYXAgPSBfdmFsOworCisjZGVmaW5lCQlGV19DTURfSU9fU0VUKF9wZGV2LCBfdmFsKSAJXAorCXdyaXRlX25pY193b3JkKF9wZGV2LCBMQlVTX01PTl9BRERSLCAodTE2KV92YWwpOwlcCisJRldfQ01EX0lPX1VQREFURShfcGRldiwgX3ZhbCk7CisKKyNkZWZpbmUJCUZXX0NNRF9QQVJBX1NFVChfcGRldiwgX3ZhbCkgCQlcCisJd3JpdGVfbmljX2R3b3JkKF9wZGV2LCBMQlVTX0FERFJfTUFTSywgX3ZhbCk7CVwKKwkoKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoX3BkZXYpKS0+RndDbWRJT1BhcmFtID0gX3ZhbDsKKworI2RlZmluZQkJRldfQ01EX0lPX1FVRVJZKF9wZGV2KQkodTE2KSgoKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoX3BkZXYpKS0+RndDbWRJT01hcCkKKyNkZWZpbmUJRldfQ01EX0lPX1BBUkFfUVVFUlkoX3BkZXYpCSh1MzIpKCgoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihfcGRldikpLT5Gd0NtZElPUGFyYW0pCisKKworCiBib29sIEZpcm13YXJlRG93bmxvYWQ5MlMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX2h3LmgKaW5kZXggODJlYTk2Yi4uZTYyYjc5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfaHcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19ody5oCkBAIC0xLDI1ICsxLDIyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUNvcHlyaWdodChjKSAyMDA4LCAgUmVhbFRFSyBUZWNobm9sb2d5IEluYy4gQWxsIFJpZ2h0IFJlc2VydmVkLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotICogTW9kdWxlOglfX0lOQ19IQUw4MTkyU0VSRUdfSAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQogICoKLSAqIE5vdGU6CTEuIERlZmluZSBNYWMgcmVnaXN0ZXIgYWRkcmVzcyBhbmQgY29ycmVzcG9uZGluZyBiaXQgbWFzayBtYXAKLSAqCQkJMi4gQ0NYIHJlZ2lzdGVyCi0gKgkJCTMuIEJhY2t3YXJkIGNvbXBhdGlibGUgcmVnaXN0ZXIgd2l0aCB1c2VsZXNzIGFkZHJlc3MuCi0gKgkJCTQuIERlZmluZSA5MlNVIHJlcXVpcmVkIHJlZ2lzdGVyIGFkZHJlc3MgYW5kIGRlZmluaXRpb24uCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCiAgKgotICoKLSAqIEV4cG9ydDoJQ29uc3RhbnRzLCBtYWNybywgZnVuY3Rpb25zKEFQSSksIGdsb2JhbCB2YXJpYWJsZXMoTm9uZSkuCi0gKgotICogQWJicmV2OgotICoKLSAqIEhpc3Rvcnk6Ci0gKgkJRGF0YQkJV2hvCQlSZW1hcmsKLSAqICAgICAgMDgvMDcvMjAwNyAgTUhDICAgIAkxLiBQb3J0aW5nIGZyb20gOXggc2VyaWVzIFBIWUNGRy5oLgotICoJCQkJCQkJMi4gUmVvcmdhbml6ZSBjb2RlIGFyY2hpdGVjdHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmbmRlZiBSODE5MlNfSFcKICNkZWZpbmUgUjgxOTJTX0hXCiAKQEAgLTI5LDIxICsyNiwxNCBAQAogCVZFUlNJT05fODE5MlNfQ0NVVAogfVZFUlNJT05fODE5MlMsKlBWRVJTSU9OXzgxOTJTOwogCi0vLyNpZmRlZiBSVEw4MTkyU1UKIHR5cGVkZWYgZW51bSBfVkVSU0lPTl84MTkyU1VzYnsKIAlWRVJTSU9OXzgxOTJTVV9BLCAvL0EtQ3V0CiAJVkVSU0lPTl84MTkyU1VfQiwgLy9CLUN1dAogCVZFUlNJT05fODE5MlNVX0MsIC8vQy1DdXQKIH1WRVJTSU9OXzgxOTJTVXNiLCAqUFZFUlNJT05fODE5MlNVc2I7Ci0vLyNlbHNlCi10eXBlZGVmIGVudW0gX1ZFUlNJT05fODE5eFV7Ci0JVkVSU0lPTl84MTl4VV9BLCAvLyBBLWN1dAotCVZFUlNJT05fODE5eFVfQiwgLy8gQi1jdXQKLQlWRVJTSU9OXzgxOXhVX0MsLy8gQy1jdXQKLX1WRVJTSU9OXzgxOXhVLCpQVkVSU0lPTl84MTl4VTsKLS8vI2VuZGlmCiAKLS8qIDIwMDcvMTEvMTUgTUggRGVmaW5lIGRpZmZlcmVudCBSRiB0eXBlLiAqLworCisvKiBSRiB0eXBlLiAqLwogdHlwZWRlZgllbnVtIF9SVF9SRl9UWVBFX0RFRklOSVRJT04KIHsKIAlSRl8xVDJSID0gMCwKQEAgLTUxLDkgKzQxLDYgQEAKIAlSRl8yVDJSLAogCVJGXzFUMVIsCiAJUkZfMlQyUl9HUkVFTiwKLQkvL1JGXzNUM1IsCi0JLy9SRl8zVDRSLAotCS8vUkZfNFQ0UiwKIAlSRl84MTlYX01BWF9UWVBFCiB9UlRfUkZfVFlQRV9ERUZfRTsKIApAQCAtNjgsMTIgKzU1LDEwIEBACiAjZGVmaW5lCVJUTDgxODdfUkVRX1NFVF9SRUdTCTB4MDUKIAogI2RlZmluZSBNQVhfVFhfVVJCIDUKLSNkZWZpbmUgTUFYX1JYX1VSQiAxNgorI2RlZmluZSBNQVhfUlhfVVJCIDgKIAogI2RlZmluZSBSODE4MF9NQVhfUkVUUlkgMjU1Ci0vLyNkZWZpbmUgTUFYX1JYX05PUk1BTF9VUkIgMwotLy8jZGVmaW5lIE1BWF9SWF9DT01NQU5EX1VSQiAyCi0jZGVmaW5lIFJYX1VSQl9TSVpFIAkJOTEwMAorI2RlZmluZSBSWF9VUkJfU0laRSAJCTB4NDAwMAogCiAjZGVmaW5lIEJCX0FOVEFUVEVOX0NIQU4xNAkweDBjCiAjZGVmaW5lIEJCX0FOVEVOTkFfQiAJCTB4NDAKQEAgLTEzNCw3ICsxMTksNiBAQAogI2RlZmluZSBNU1JfTElOS19FTkVEQ0EJICAgCSgxPDw0KQogCiAKLS8vI2RlZmluZSBDbWQ5MzQ2Q1JfOTM1NlNFTAkoMTw8NCkKICNkZWZpbmUgRVBST01fQ01EX1JFU0VSVkVEX01BU0sgCQkJKDE8PDUpCiAjZGVmaW5lIEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCAJNgogI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSyAJKCgxPDw3KXwoMTw8NikpCkBAIC0xNDcsMTMgKzEzMSw2IEBACiAjZGVmaW5lIEVQUk9NX1dfU0hJRlQgCQkJMQogI2RlZmluZSBFUFJPTV9SX1NISUZUIAkJCTAKIAotLy8jZGVmaW5lCU1BQzAgCQkJIDB4MDAwLAotLy8jZGVmaW5lCU1BQzEgCQkJIDB4MDAxLAotLy8jZGVmaW5lCU1BQzIgCQkJIDB4MDAyLAotLy8jZGVmaW5lCU1BQzMgCQkJIDB4MDAzLAotLy8jZGVmaW5lCU1BQzQgCQkJIDB4MDA0LAotLy8jZGVmaW5lCU1BQzUgCQkJIDB4MDA1LAotCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gICAgICAgODE5MlMgUmVnc2l0ZXIgb2Zmc2V0IGRlZmluaXRpb24KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MjksMTQgKzUwNiw2IEBACiAvLyBVU0IgUlBXTSByZWdpc3RlcgogI2RlZmluZQlVU0JfUlBXTQkJCTB4RkU1OAogCi0vL0ZJWExaTSBTVk5fQlJBQ0ggTk9UIE1PRCBIRVJFLCBJRiBNT0QgUlggSVMgTElUVExFIExPVwotLy8jaWYgKChIQUxfQ09ERV9CQVNFID09IFJUTDgxOTJfUykgJiYgIChERVZfQlVTX1RZUEU9PVBDSV9JTlRFUkZBQ0UpKQotLy8jZGVmaW5lCVJQV00JCVBDSV9SUFdNCi0vLyNlbGlmICgoSEFMX0NPREVfQkFTRSA9PSBSVEw4MTkyX1MpICYmICAoREVWX0JVU19UWVBFPT1VU0JfSU5URVJGQUNFKSkKLS8vI2RlZmluZQlSUFdNCQlVU0JfUlBXTQotLy8jZW5kaWYKLQotCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vICAgICAgIDgxOTAgUmVnc2l0ZXIgb2Zmc2V0IGRlZmluaXRpb24KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzc3LDEzICs3NDYsMTEgQEAKICNkZWZpbmUJCVJDUl9NWERNQV9PRkZTRVQJCTgKICNkZWZpbmUJCVJDUl9GSUZPX09GRlNFVAkJMTMKIAotLy9pbiA5MlUgRklYTFpNCi0vLyNpZmRlZiBSVEw4MTkyVQogI2RlZmluZSBSQ1JfT05MWUVSTFBLVAkJQklUMzEJCQkvLyBFYXJseSBSZWNlaXZpbmcgYmFzZWQgb24gUGFja2V0IFNpemUuCiAjZGVmaW5lIFJDUl9FTkNTMgkJCUJJVDMwCQkJLy8gRW5hYmxlIENhcnJpZXIgU2Vuc2UgRGV0ZWN0aW9uIE1ldGhvZCAyCiAjZGVmaW5lIFJDUl9FTkNTMQkJCUJJVDI5CQkJLy8gRW5hYmxlIENhcnJpZXIgU2Vuc2UgRGV0ZWN0aW9uIE1ldGhvZCAxCiAjZGVmaW5lIFJDUl9BQ0tUWEJXCQkJKEJJVDI0fEJJVDI1KQkJLy8gVFhCVyBTZXR0aW5nIG9mIEFDSyBmcmFtZXMKLS8vI2VuZGlmCisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgODE5MlMgKE1TUikgTWVkaWEgU3RhdHVzIFJlZ2lzdGVyCShPZmZzZXQgMHg0QywgOCBiaXRzKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjU5LDE3ICsxMjI2LDE4IEBACiAjZGVmaW5lCQlFRVBST01fQ0hBTk5FTF9QTEFOX0dMT0JBTF9ET01BSU4JMHg5CiAjZGVmaW5lCQlFRVBST01fQ0hBTk5FTF9QTEFOX1dPUkxEX1dJREVfMTMJMHhBCiAjZGVmaW5lCQlFRVBST01fQ0hBTk5FTF9QTEFOX0JZX0hXX01BU0sJMHg4MAorI2RlZmluZSAJRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCisjZGVmaW5lIAlFRVBST01fQ0lEX0FMUEhBCQkJMHgxCisjZGVmaW5lIAlFRVBST01fQ0lEX1NlbmFvCQkJMHgzCisjZGVmaW5lCQlFRVBST01fQ0lEX0NBTUVPCQkJMFg4CisjZGVmaW5lIAlFRVBST01fQ0lEX1NJVEVDT00JCQkweDkKKyNkZWZpbmUgCUVFUFJPTV9DSURfQ09SRUdBCQkJMHhCCisjZGVmaW5lIAlFRVBST01fQ0lEX0VESU1BWF9CRUxLSU4JCTB4QworI2RlZmluZQkJRUVQUk9NX0NJRF9TRVJDT01NX0JFTEtJTgkJMHhFCisjZGVmaW5lCQlFRVBST01fQ0lEX0NBTUVPMQkJCTB4RgorI2RlZmluZSAJRUVQUk9NX0NJRF9XSFFMIAkJCTB4RkUKKyNkZWZpbmUJCUVFUFJPTV9DSURfTmV0Q29yZQkJCTB4NQogCi0jZGVmaW5lIAkJRUVQUk9NX0NJRF9ERUZBVUxUCQkJCTB4MAotI2RlZmluZSAJCUVFUFJPTV9DSURfQUxQSEEJCQkJMHgxCi0jZGVmaW5lCQlFRVBST01fQ0lEX0NBTUVPCQkJCQkwWDgKLSNkZWZpbmUgCQlFRVBST01fQ0lEX1NJVEVDT00JCQkJMHg5Ci0KLS8vI2RlZmluZSBFRVBST01fQ0lEX1JVTlRPUAkJCQkJCTB4MgotLy8jZGVmaW5lIEVFUFJPTV9DSURfU2VuYW8JCQkJCQkweDMKLS8vI2RlZmluZSBFRVBST01fQ0lEX1RPU0hJQkEJCQkJCQkweDQKLS8vI2RlZmluZSBFRVBST01fQ0lEX05ldENvcmUJCQkJCQkweDUKLSNkZWZpbmUgCQlFRVBST01fQ0lEX1dIUUwgCQkJCTB4RkUgLy8gYWRkZWQgYnkgY2hpeW9rbyBmb3IgZHRtLCAyMDA5MDEwOAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAweDJjMCBGVyBDb21tYW5kIENvbnRyb2wgcmVnaXN0ZXIgZGVmaW5pdGlvbiwgYWRkZWQgYnkgUm9nZXIsIDIwMDguMTEuMjcuCkBAIC0xMjgyLDE4ICsxMjUwLDMyIEBACiAjZGVmaW5lCQlGV19ISUdIX1BXUl9FTkFCTEUJCQkweGZkMDAwMDA5CiAjZGVmaW5lCQlGV19UWFBXUl9UUkFDS19FTkFCTEUJCTB4ZmQwMDAwMTcKICNkZWZpbmUJCUZXX1RYUFdSX1RSQUNLX0RJU0FCTEUJCTB4ZmQwMDAwMTgKLSNkZWZpbmUJCUZXX1JBX1JFU0VUCQkJCQkweGZkMDAwMGFmCi0jZGVmaW5lCQlGV19SQV9BQ1RJVkUJCQkJCTB4ZmQwMDAwYTYKKyNkZWZpbmUJCUZXX1RYUFdSX1RSQUNLX1RIRVJNQUwJCTB4ZmQwMDAwMTkKKyNkZWZpbmUJCUZXX1JBX0lOSVQJCQkJCQkweGZkMDAwMDI2CisjZGVmaW5lCQlGV19SQV9JT1RfQkdfQ09NQgkJCTB4ZmQwMDAwMzAKKyNkZWZpbmUJCUZXX1JBX0lPVF9OX0NPTUIJCQkJMHhmZDAwMDAzMQogI2RlZmluZQkJRldfUkFfUkVGUkVTSAkJCQkJMHhmZDAwMDBhMAotI2RlZmluZQkJRldfUkFfRU5BQkxFX0JHCQkJCTB4ZmQwMDAwYWMKKyNkZWZpbmUJCUZXX1JBX0RJU0FCTEUJCQkJCTB4ZmQwMDAwYTQKKyNkZWZpbmUJCUZXX1JBX0FDVElWRQkJCQkJMHhmZDAwMDBhNgorI2RlZmluZQkJRldfUkFfRElTQUJMRV9SU1NJX01BU0sJCTB4ZmQwMDAwYWMKKyNkZWZpbmUJCUZXX1JBX0VOQUJMRV9SU1NJX01BU0sJCTB4ZmQwMDAwYWQKKyNkZWZpbmUJCUZXX1JBX1JFU0VUCQkJCQkweGZkMDAwMGFmCisjZGVmaW5lCQlGV19ETV9ESVNBQkxFCQkJCQkweGZkMDBhYTAwCiAjZGVmaW5lCQlGV19JUUtfRU5BQkxFCQkJCQkweGYwMDAwMDIwCiAjZGVmaW5lCQlGV19JUUtfU1VDQ0VTUwkJCQkweDAwMDBkZGRkCiAjZGVmaW5lCQlGV19JUUtfRkFJTAkJCQkJMHgwMDAwZmZmZgogI2RlZmluZQkJRldfT1BfRkFJTFVSRQkJCQkJMHhmZmZmZmZmZgotI2RlZmluZQkJRldfRE1fRElTQUJMRQkJCQkJMHhmZDAwYWEwMAorI2RlZmluZQkJRldfVFhfRkVFREJBQ0tfTk9ORQkJCQkweGZiMDAwMDAwCisjZGVmaW5lCQlGV19UWF9GRUVEQkFDS19EVE1fRU5BQkxFCQkoRldfVFhfRkVFREJBQ0tfTk9ORSB8IDB4MSkKKyNkZWZpbmUJCUZXX1RYX0ZFRURCQUNLX0NDWF9FTkFCTEUJCShGV19UWF9GRUVEQkFDS19OT05FIHwgMHgyKQogI2RlZmluZQkJRldfQkJfUkVTRVRfRU5BQkxFCQkJMHhmZjAwMDAwZAogI2RlZmluZQkJRldfQkJfUkVTRVRfRElTQUJMRQkJCTB4ZmYwMDAwMGUKLQorI2RlZmluZQkJRldfTFBTX0VOVEVSCQkJCQkweGZlMDAwMDEwCisjZGVmaW5lCQlGV19MUFNfTEVBVkUJCQkJCTB4ZmUwMDAwMTEKKyNkZWZpbmUJCUZXX0lORElSRUNUX1JFQUQJCQkJMHhmMjAwMDAwMAorI2RlZmluZQkJRldfSU5ESVJFQ1RfV1JJVEUJCQkJMHhmMjAwMDAwMQorI2RlZmluZQkJRldfVFhBTlRfU1dJVENIX0VOQUJMRQkJMHhmZDAwMDAyMworI2RlZmluZQkJRldfVFhBTlRfU1dJVENIX0RJU0FCTEUJCTB4ZmQwMDAwMjQKIC8vCiAvLy0tLS0tLS0tLS0tLS0tOTJTVSByZXF1aXJlIGRlbGV0ZSBvciBtb3ZlIHRvIG90aGVyIHBsYWNlIGxhdGVyCiAvLwpAQCAtMTQ2MCwzNCArMTQ0Miw0IEBACiAjZGVmaW5lCQlIQUxfODE5MlNfSFdfR1BJT19PRkZfTUFTSwkweEY3CiAjZGVmaW5lCQlIQUxfODE5MlNfSFdfR1BJT19XUFNfQklUCUJJVDQKIAotI2VuZGlmICAvL1I4MTkyU19IVwotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCmluZGV4IGI2YzBmMTkuLmE1ZmMyZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCkBAIC0xLDM1ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgKGMpIENvcHlyaWdodCAyMDA4LCBSZWFsVEVLIFRlY2hub2xvZ2llcyBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSBNb2R1bGU6CWhhbDgxOTJzcGh5LmMKLQotIE5vdGU6CQlNZXJnZSA5MlNFL1NVIFBIWSBjb25maWcgYXMgYmVsb3cKLQkJCTEuIEJCIHJlZ2lzdGVyIFIvVyBBUEkKLSAJCQkyLiBSRiByZWdpc3RlciBSL1cgQVBJCi0gCQkJMy4gSW5pdGlhbCBCQi9SRi9NQUMgY29uZmlnIGJ5IHJlYWRpbmcgQkIvTUFDL1JGIHR4dC4KLSAJCQkzLiBQb3dlciBzZXR0aW5nIEFQSQotIAkJCTQuIENoYW5uZWwgc3dpdGNoIEFQSQotIAkJCTUuIEluaXRpYWwgZ2FpbiBzd2l0Y2ggQVBJLgotIAkJCTYuIE90aGVyIEJCL01BQy9SRiBBUEkuCi0KLSBGdW5jdGlvbjoJUEhZOiBFeHRlcm4gZnVuY3Rpb24sIHBoeTogbG9jYWwgZnVuY3Rpb24KLQotIEV4cG9ydDoJUEhZX0Z1bmN0aW9uTmFtZQotCi0gQWJicmV2OglOT05FCi0KLSBIaXN0b3J5OgotCURhdGEJCVdobwkJUmVtYXJrCi0JMDgvMDgvMjAwOCAgTUhDICAgIAkxLiBQb3J0IGZyb20gOXggc2VyaWVzIHBoeWNmZy5jCi0JCQkJCQkyLiBSZW9yZ2FuaXplIGNvZGUgYXJjaCBhbmQgYWQgZGVzY3JpcHRpb24uCi0JCQkJCQkzLiBDb2xsZWN0IHNpbWlsYXIgZnVuY3Rpb24uCi0JCQkJCQk0LiBTZXBlcmF0ZSBleHRlcm4vbG9jYWwgQVBJLgotCTA4LzEyLzIwMDgJTUhDCQlXZSBtdXN0IG1lcmdlIG9yIG1vdmUgVVNCIFBIWSByZWxhdGl2ZSBmdW5jdGlvbiBsYXRlci4KLQkxMC8wNy8yMDA4CU1IQwkJQWRkIElRIGNhbGlicmF0aW9uIGZvciBQSFkuKE9ubHkgMVQyUiBtb2RlIG5vdyEhISkKLQkxMS8wNi8yMDA4CU1IQwkJQWRkIFRYIFBvd2VyIGluZGV4IFBHIGZpbGUgdG8gY29uZmlnIGluIDB4RXh4IHJlZ2lzdGVyCi0JCQkJCQlhcmVhIHRvIG1hcCB3aXRoIEVFUFJPTS9FRlVTRSB0eCBwd3IgaW5kZXguCi0KKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAicjgxOTJVLmgiCiAjaW5jbHVkZSAicjgxOTJVX2RtLmgiCkBAIC00MiwxNiArMjcsMTIgQEAKIAogI2luY2x1ZGUgImllZWU4MDIxMS9kb3QxMWQuaCIKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogQ2hhbm5lbCBzd2l0Y2g6VGhlIHNpemUgb2YgY29tbWFuZCB0YWJsZXMgZm9yIHN3aXRjaCBjaGFubmVsKi8KICNkZWZpbmUgTUFYX1BSRUNNRF9DTlQgMTYKICNkZWZpbmUgTUFYX1JGREVQRU5EQ01EX0NOVCAxNgogI2RlZmluZSBNQVhfUE9TVENNRF9DTlQgMTYKICNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU185eCA2NAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vLyAyMDA0LTA1LTExCi0KIHN0YXRpYwl1MzIKIHBoeV9DYWxjdWxhdGVCaXRTaGlmdCh1MzIgQml0TWFzayk7CiBzdGF0aWMJUlRfU1RBVFVTCkBAIC04Niw3ICs2Nyw2IEBACiBzdGF0aWMgdTggcGh5X0RibVRvVHhQd3JJZHgoIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFdJUkVMRVNTX01PREUgV2lyZWxlc3NNb2RlLCBsb25nIFBvd2VySW5EYm0pOwogdm9pZCBwaHlfU2V0RndDbWRJT0NhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOwogCi0vLyNpZiAoKEhBTF9DT0RFX0JBU0UgPT0gUlRMODE5Ml9TKSAmJiAoREVWX0JVU19UWVBFPT1VU0JfSU5URVJGQUNFKSkKIC8vCiAvLyBEZXNjcmlwdGlvbjoKIC8vCUJhc2UgQmFuZCByZWFkIGJ5IDQxODEgdG8gbWFrZSBzdXJlIHRoYXQgb3BlcmF0aW9uIGNvdWxkIGJlIGRvbmUgaW4gdW5saW1pdGVkIGN5Y2xlLgpAQCAtOTUsOCArNzUsNiBAQAogLy8JCS0JT25seSB1c2Ugb24gUlRMODE5MlMgVVNCIGludGVyZmFjZS4KIC8vCQktCVBBU1NJVkUgTEVWRUwKIC8vCi0vLyBDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA4LjA5LjA2LgotLy8KIC8vdXNlIGluIHBoeSBvbmx5CiB1MzIgcGh5X1F1ZXJ5VXNiQkJSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTMyCVJlZ0FkZHIpCiB7CkBAIC0xMTgsNyArOTYsNyBAQAogCQltc2xlZXAoMSk7IC8vIDEgbXMKIAogCQkvLyBXYWl0IHRvbyBsb25nLCByZXR1cm4gRkFMU0UgdG8gYXZvaWQgdG8gYmUgc3R1Y2sgaGVyZS4KLQkJaWYoKEJCV2FpdENvdW50ZXIgPiAxMDApICkvL3x8UlRfVVNCX0NBTk5PVF9JTyhBZGFwdGVyKSkKKwkJaWYoKEJCV2FpdENvdW50ZXIgPiAxMDApICkKIAkJewogCQkJUlRfVFJBQ0UoQ09NUF9SRiwgInBoeV9RdWVyeVVzYkJCUmVnKCk6ICglZCkgV2FpdCB0b28gbG9nbiB0byBxdWVyeSBCQiEhXG4iLCBCQldhaXRDb3VudGVyKTsKIAkJCXJldHVybiBSZXR1cm5WYWx1ZTsKQEAgLTE2MCw5ICsxMzgsNiBAQAogLy8gQXNzdW1wdGlvbjoKIC8vCQktCU9ubHkgdXNlIG9uIFJUTDgxOTJTIFVTQiBpbnRlcmZhY2UuCiAvLwkJLQlQQVNTSVZFIExFVkVMCi0vLwotLy8gQ3JlYXRlZCBieSBSb2dlciwgMjAwOC4wOS4wNi4KLS8vCiAvL3VzZSBpbiBwaHkgb25seQogdm9pZAogcGh5X1NldFVzYkJCUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsdTMyCVJlZ0FkZHIsdTMyIERhdGEpCkBAIC0xOTEsNyArMTY2LDYgQEAKIAl9CiAKIAlwcml2LT5iQ2hhbmdlQkJJblByb2dyZXNzID0gdHJ1ZTsKLQkvL3ByaW50aygiKioqKioqKioqKioqKiolczogUmVnQWRkcjoleCBEYXRhOiV4XG4iLCBfX0ZVTkNUSU9OX18sUmVnQWRkciwgRGF0YSk7CiAJd3JpdGVfbmljX2R3b3JkKGRldiwgUmVnQWRkciwgRGF0YSk7CiAKIAlwcml2LT5iQ2hhbmdlQkJJblByb2dyZXNzID0gZmFsc2U7CkBAIC0yMTUsOSArMTg5LDcgQEAKIHsKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQkvL3UzMgl2YWx1ZSAgPSAwLCBSZXR1cm5WYWx1ZSA9IDA7CiAJdTMyCVJldHVyblZhbHVlID0gMDsKLQkvL3UzMiAJdG1wbG9uZyx0bXBsb25nMjsKIAl1OAlQb2xsaW5nQ250ID0gNTA7CiAJdTgJUkZXYWl0Q291bnRlciA9IDA7CiAKQEAgLTIyOSw4ICsyMDEsNiBAQAogCS8vCiAJd2hpbGUocHJpdi0+YkNoYW5nZVJGSW5Qcm9ncmVzcykKIAl7Ci0JCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfUkZfT1BFUkFURV9TUElOTE9DSyk7Ci0JCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX2xvY2ssIGZsYWdzKTsJLy9MWk0sMDkwMzE4CiAJCWRvd24oJnByaXYtPnJmX3NlbSk7CiAKIAkJUkZXYWl0Q291bnRlciArKzsKQEAgLTI0NCwxNCArMjE0LDEwIEBACiAJCX0KIAkJZWxzZQogCQl7Ci0JCQkvL1BsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JGX09QRVJBVEVfU1BJTkxPQ0spOwogCQl9CiAJfQogCiAJcHJpdi0+YkNoYW5nZVJGSW5Qcm9ncmVzcyA9IHRydWU7Ci0JLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhBZGFwdGVyLCBSVF9SRl9PUEVSQVRFX1NQSU5MT0NLKTsKLQotCiAJT2Zmc2V0ICY9IDB4M2Y7IC8vUkZfT2Zmc2V0PSAweDAwfjB4M0YKIAogCXdyaXRlX25pY19kd29yZChkZXYsIFJGX0JCX0NNRF9BRERSLCAweEYwMDAwMDAyfApAQCAtMjY3LDggKzIzMyw2IEBACiAJLy8gRGF0YSBGVyByZWFkIGJhY2suCiAJUmV0dXJuVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIFJGX0JCX0NNRF9EQVRBKTsKIAotCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUkZfT1BFUkFURV9TUElOTE9DSyk7Ci0JLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7ICAgLy9MWk0sMDkwMzE4CiAJdXAoJnByaXYtPnJmX3NlbSk7CiAJcHJpdi0+YkNoYW5nZVJGSW5Qcm9ncmVzcyA9IGZhbHNlOwogCkBAIC0zMDYsMjcgKzI3MCwyMyBAQAogCS8vCiAJd2hpbGUocHJpdi0+YkNoYW5nZVJGSW5Qcm9ncmVzcykKIAl7Ci0JCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfUkZfT1BFUkFURV9TUElOTE9DSyk7Ci0JCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX2xvY2ssIGZsYWdzKTsJLy9MWk0sMDkwMzE4CiAJCWRvd24oJnByaXYtPnJmX3NlbSk7CiAKIAkJUkZXYWl0Q291bnRlciArKzsKIAkJUlRfVFJBQ0UoQ09NUF9SRiwgInBoeV9TZXRVc2JSRlJlZygpOiBXYWl0IDEgbXMgKCVkIHRpbWVzKS4uLlxuIiwgUkZXYWl0Q291bnRlcik7CiAJCW1zbGVlcCgxKTsgLy8gMSBtcwogCi0JCWlmKChSRldhaXRDb3VudGVyID4gMTAwKSkvLyB8fCBSVF9VU0JfQ0FOTk9UX0lPKEFkYXB0ZXIpKQorCQlpZigoUkZXYWl0Q291bnRlciA+IDEwMCkpCiAJCXsKIAkJCVJUX1RSQUNFKENPTVBfUkYsICJwaHlfU2V0VXNiUkZSZWcoKTogKCVkKSBXYWl0IHRvbyBsb2duIHRvIHF1ZXJ5IEJCISFcbiIsIFJGV2FpdENvdW50ZXIpOwogCQkJcmV0dXJuOwogCQl9CiAJCWVsc2UKIAkJewotCQkJLy9QbGF0Zm9ybUFjcXVpcmVTcGluTG9jayhBZGFwdGVyLCBSVF9SRl9PUEVSQVRFX1NQSU5MT0NLKTsKIAkJfQogCX0KIAogCXByaXYtPmJDaGFuZ2VSRkluUHJvZ3Jlc3MgPSB0cnVlOwotCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfUkZfT1BFUkFURV9TUElOTE9DSyk7CiAKIAogCVJlZ0FkZHIgJj0gMHgzZjsgLy9SRl9PZmZzZXQ9IDB4MDB+MHgzRgpAQCAtMzQ3LDE4ICszMDcsMTEgQEAKIAkJUlRfVFJBQ0UoQ09NUF9SRiwgInBoeV9TZXRVc2JSRlJlZygpOiBTZXQgUmVnQWRkciglI3gpID0gJSN4IEZhaWwhISFcbiIsIFJlZ0FkZHIsIERhdGEpOwogCX0KIAotCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUkZfT1BFUkFURV9TUElOTE9DSyk7Ci0JLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7ICAgLy9MWk0sMDkwMzE4CiAJdXAoJnByaXYtPnJmX3NlbSk7CiAJcHJpdi0+YkNoYW5nZVJGSW5Qcm9ncmVzcyA9IGZhbHNlOwogCiB9CiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUZ1bmN0aW9uIEJvZHktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8vCiAvLyAxLiBCQiByZWdpc3RlciBSL1cgQVBJCiAvLwpAQCAtMzc2LDggKzMyOSw2IEBACiAqIFJldHVybjoJCXUzMgkJCURhdGEJCQkvL1RoZSByZWFkYmFjayByZWdpc3RlciB2YWx1ZQogKiBOb3RlOgkJVGhpcyBmdW5jdGlvbiBpcyBlcXVhbCB0byAiR2V0UmVnU2V0dGluZyIgaW4gUEhZIHByb2dyYW1taW5nIGd1aWRlCiAqLwotLy91c2UgcGh5IGRtIGNvcmUgODIyNSA4MjU2IDYwNTIKLS8vdTMyIFBIWV9RdWVyeUJCUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsdTMyCQlSZWdBZGRyLAl1MzIJCUJpdE1hc2spCiB1MzIgcnRsODE5Ml9RdWVyeUJCUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaykKIHsKIApAQCAtMzkyLDEwICszNDMsOCBAQAogCS8vIGluZmluaXRlIGN5Y2xlLgogCS8vIDIwMDguMDkuMDYuCiAJLy8KLS8vI2lmICgoSEFMX0NPREVfQkFTRSA9PSBSVEw4MTkyX1MpICYmIChERVZfQlVTX1RZUEU9PVVTQl9JTlRFUkZBQ0UpKQogCWlmKElTX0JCX1JFR19PRkZTRVRfOTJTKFJlZ0FkZHIpKQogCXsKLQkJLy9pZihSVF9VU0JfQ0FOTk9UX0lPKEFkYXB0ZXIpKQlyZXR1cm4JRkFMU0U7CiAKIAkJaWYoKFJlZ0FkZHIgJiAweDAzKSAhPSAwKQogCQl7CkBAIC00MTMsNyArMzYyLDcgQEAKIAlCaXRTaGlmdCA9IHBoeV9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKIAlSZXR1cm5WYWx1ZSA9IChPcmlnaW5hbFZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7CiAKLQkvL1JUUFJJTlQoRlBIWSwgUEhZX0JCUiwgKCJCQlIgTUFTSz0weCV4IEFkZHJbMHgleF09MHgleFxuIiwgQml0TWFzaywgUmVnQWRkciwgT3JpZ2luYWxWYWx1ZSkpOworCiAJUlRfVFJBQ0UoQ09NUF9SRiwgIjwtLS1QSFlfUXVlcnlCQlJlZygpOiBSZWdBZGRyKCUjeCksIEJpdE1hc2soJSN4KSwgT3JpZ2luYWxWYWx1ZSglI3gpXG4iLCBSZWdBZGRyLCBCaXRNYXNrLCBPcmlnaW5hbFZhbHVlKTsKIAlyZXR1cm4gKFJldHVyblZhbHVlKTsKIH0KQEAgLTQzNSw4ICszODQsNiBAQAogKiBSZXR1cm46CQlOb25lCiAqIE5vdGU6CQlUaGlzIGZ1bmN0aW9uIGlzIGVxdWFsIHRvICJQdXRSZWdTZXR0aW5nIiBpbiBQSFkgcHJvZ3JhbW1pbmcgZ3VpZGUKICovCi0vL3VzZSBwaHkgZG0gY29yZSA4MjI1IDgyNTYKLS8vdm9pZCBQSFlfU2V0QkJSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldix1MzIJCVJlZ0FkZHIsCXUzMgkJQml0TWFzaywJdTMyCQlEYXRhCSkKIHZvaWQgcnRsODE5Ml9zZXRCQnJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQogewogCXUzMglPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdCwgTmV3VmFsdWU7CkBAIC00NTAsNyArMzk3LDYgQEAKIAkvLyBpbmZpbml0ZSBjeWNsZS4KIAkvLyAyMDA4LjA5LjA2LgogCS8vCi0vLyNpZiAoKEhBTF9DT0RFX0JBU0UgPT0gUlRMODE5Ml9TKSAmJiAoREVWX0JVU19UWVBFPT1VU0JfSU5URVJGQUNFKSkKIAlpZihJU19CQl9SRUdfT0ZGU0VUXzkyUyhSZWdBZGRyKSkKIAl7CiAJCWlmKChSZWdBZGRyICYgMHgwMykgIT0gMCkKQEAgLTQ4MCw3ICs0MjYsNiBAQAogCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUmVnQWRkciwgRGF0YSk7CiAJfQogCi0JLy9SVF9UUkFDRShDT01QX1JGLCAiPC0tLVBIWV9TZXRCQlJlZygpOiBSZWdBZGRyKCUjeCksIEJpdE1hc2soJSN4KSwgRGF0YSglI3gpXG4iLCBSZWdBZGRyLCBCaXRNYXNrLCBEYXRhKTsKIAogCXJldHVybjsKIH0KQEAgLTUwNSw4ICs0NTAsNiBAQAogKiBSZXR1cm46CQl1MzIJCQlSZWFkYmFjayB2YWx1ZQogKiBOb3RlOgkJVGhpcyBmdW5jdGlvbiBpcyBlcXVhbCB0byAiR2V0UkZSZWdTZXR0aW5nIiBpbiBQSFkgcHJvZ3JhbW1pbmcgZ3VpZGUKICovCi0vL2luIGRtIDgyNTYgYW5kIHBoeQotLy91MzIgUEhZX1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwJUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKQogdTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKQogewogCXUzMiBPcmlnaW5hbF9WYWx1ZSwgUmVhZGJhY2tfVmFsdWUsIEJpdFNoaWZ0Oy8vLCBmbGFnczsKQEAgLTUyNyw5ICs0NzAsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiAyMDA4LzAxLzE3IE1IIFdlIGdldCBhbmQgcmVsZWFzZSBzcGluIGxvY2sgd2hlbiByZWFkaW5nIFJGIHJlZ2lzdGVyLiAqLwotCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soZGV2LCBSVF9SRl9PUEVSQVRFX1NQSU5MT0NLKTtGSVhMWk0KLQkvL3NwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7CS8vWUosdGVzdCwwOTAxMTMKIAlkb3duKCZwcml2LT5yZl9zZW0pOwogCS8vCiAJLy8gPFJvZ2VyX05vdGVzPiBEdWUgdG8gODA1MSBvcGVyYXRpb24gY3ljbGUgKGxpbWl0YXRpb24gY3ljbGU6IDZ1cykgYW5kIDEtQnl0ZSBhY2Nlc3MgaXNzdWUsIHdlIHNob3VsZCB1c2UKQEAgLTUzNywxNyArNDc3LDExIEBACiAJLy8gaW5maW5pdGUgY3ljbGUuCiAJLy8gMjAwOC4wOS4wNi4KIAkvLwotLy8jaWYgKEhBTF9DT0RFX0JBU0UgPT0gUlRMODE5Ml9TICYmIERFVl9CVVNfVFlQRT09VVNCX0lOVEVSRkFDRSkKLQkvL2lmKFJUX1VTQl9DQU5OT1RfSU8oQWRhcHRlcikpCXJldHVybiBGQUxTRTsKIAlPcmlnaW5hbF9WYWx1ZSA9IHBoeV9RdWVyeVVzYlJGUmVnKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CiAKIAlCaXRTaGlmdCA9ICBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CiAJUmVhZGJhY2tfVmFsdWUgPSAoT3JpZ2luYWxfVmFsdWUgJiBCaXRNYXNrKSA+PiBCaXRTaGlmdDsKLQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX2xvY2ssIGZsYWdzKTsgICAvL1lKLHRlc3QsMDkwMTEzCiAJdXAoJnByaXYtPnJmX3NlbSk7Ci0JLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhkZXYsIFJUX1JGX09QRVJBVEVfU1BJTkxPQ0spOwotCi0JLy9SVFBSSU5UKEZQSFksIFBIWV9SRlIsICgiUkZSLSVkIE1BU0s9MHgleCBBZGRyWzB4JXhdPTB4JXhcbiIsIGVSRlBhdGgsIEJpdE1hc2ssIFJlZ0FkZHIsIE9yaWdpbmFsX1ZhbHVlKSk7CiAKIAlyZXR1cm4gKFJlYWRiYWNrX1ZhbHVlKTsKIH0KQEAgLTU3MCw4ICs1MDQsNiBAQAogKiBSZXR1cm46CQlOb25lCiAqIE5vdGU6CQlUaGlzIGZ1bmN0aW9uIGlzIGVxdWFsIHRvICJQdXRSRlJlZ1NldHRpbmciIGluIFBIWSBwcm9ncmFtbWluZyBndWlkZQogKi8KLS8vdXNlIHBoeSAgODIyNSA4MjU2Ci0vL3ZvaWQgUEhZX1NldFJGUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyCVJlZ0FkZHIsCXUzMiBCaXRNYXNrLHUzMglEYXRhCSkKIHZvaWQgcnRsODE5Ml9waHlfU2V0UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSkKIHsKIApAQCAtNTkyLDE4ICs1MjQsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIDIwMDgvMDEvMTcgTUggV2UgZ2V0IGFuZCByZWxlYXNlIHNwaW4gbG9jayB3aGVuIHdyaXRpbmcgUkYgcmVnaXN0ZXIuICovCi0JLy9QbGF0Zm9ybUFjcXVpcmVTcGluTG9jayhkZXYsIFJUX1JGX09QRVJBVEVfU1BJTkxPQ0spOwotCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX2xvY2ssIGZsYWdzKTsJLy9ZSix0ZXN0LDA5MDExMwogCWRvd24oJnByaXYtPnJmX3NlbSk7CiAJLy8KIAkvLyA8Um9nZXJfTm90ZXM+IER1ZSB0byA4MDUxIG9wZXJhdGlvbiBjeWNsZSAobGltaXRhdGlvbiBjeWNsZTogNnVzKSBhbmQgMS1CeXRlIGFjY2VzcyBpc3N1ZSwgd2Ugc2hvdWxkIHVzZQogCS8vIDQxODEgdG8gYWNjZXNzIEJhc2UgQmFuZCBpbnN0ZWFkIG9mIDgwNTEgb24gVVNCIGludGVyZmFjZSB0byBtYWtlIHN1cmUgdGhhdCBhY2Nlc3MgY291bGQgYmUgZG9uZSBpbgogCS8vIGluZmluaXRlIGN5Y2xlLgotCS8vIDIwMDguMDkuMDYuCi0JLy8KLS8vI2lmIChIQUxfQ09ERV9CQVNFID09IFJUTDgxOTJfUyAmJiBERVZfQlVTX1RZUEU9PVVTQl9JTlRFUkZBQ0UpCi0JCS8vaWYoUlRfVVNCX0NBTk5PVF9JTyhBZGFwdGVyKSkJcmV0dXJuOwogCiAJCWlmIChCaXRNYXNrICE9IGJSRlJlZ09mZnNldE1hc2spIC8vIFJGIGRhdGEgaXMgMTIgYml0cyBvbmx5CiAJCXsKQEAgLTYxNCwxMCArNTM5LDcgQEAKIAkJfQogCQllbHNlCiAJCQlwaHlfU2V0VXNiUkZSZWcoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKLQkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKGRldiwgUlRfUkZfT1BFUkFURV9TUElOTE9DSyk7Ci0JLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7ICAgLy9ZSix0ZXN0LDA5MDExMwogCXVwKCZwcml2LT5yZl9zZW0pOwotCS8vUlRQUklOVChGUEhZLCBQSFlfUkZXLCAoIlJGVy0lZCBNQVNLPTB4JXggQWRkclsweCV4XT0weCV4XG4iLCBlUkZQYXRoLCBCaXRNYXNrLCBSZWdBZGRyLCBEYXRhKSk7CiAJUlRfVFJBQ0UoQ09NUF9SRiwgIjwtLS1QSFlfU2V0UkZSZWcoKTogUmVnQWRkciglI3gpLCBCaXRNYXNrKCUjeCksIERhdGEoJSN4KSwgZVJGUGF0aCglI3gpXG4iLAogCQkJUmVnQWRkciwgQml0TWFzaywgRGF0YSwgZVJGUGF0aCk7CiAKQEAgLTY5MSwyOSArNjEzLDkgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAJKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXBoeV9Jbml0QkJSRlJlZ2lzdGVyRGVmaW5pdGlvbihkZXYpOwogCi0JLy8KLQkvLyBDb25maWcgQkIgYW5kIEFHQwotCS8vCi0JLy9zd2l0Y2goIEFkYXB0ZXItPk1nbnRJbmZvLmJSZWdId1BhcmFGaWxlICkKLQkvL3sKLQkvLwljYXNlIDA6Ci0JLy8JCXBoeV9CQjgxOTBfQ29uZmlnX0hhcmRDb2RlKGRldik7Ci0JLy8JCWJyZWFrOwogCi0JLy8JY2FzZSAxOgogCQkJcnRTdGF0dXMgPSBwaHlfQkI4MTkyU19Db25maWdfUGFyYUZpbGUoZGV2KTsKLQkvLwkJYnJlYWs7CiAKLQkvLwljYXNlIDI6Ci0JCQkvLyBQYXJ0aWFsIE1vZGlmeS4KLQkvLwkJcGh5X0JCODE5MF9Db25maWdfSGFyZENvZGUoZGV2KTsKLQkvLwkJcGh5X0JCODE5MlNfQ29uZmlnX1BhcmFGaWxlKGRldik7Ci0JLy8JCWJyZWFrOwotCi0JLy8JZGVmYXVsdDoKLQkvLwkJcGh5X0JCODE5MF9Db25maWdfSGFyZENvZGUoZGV2KTsKLQkvLwkJYnJlYWs7Ci0JLy99CiAJUGF0aE1hcCA9ICh1OCkocnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgckZQR0EwX1R4SW5mbywgMHhmKSB8CiAJCQkJcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4ZikpOwogCXByaXYtPnJmX3BhdGhtYXAgPSBQYXRoTWFwOwpAQCAtNzc0LDE1ICs2NzYsMTAgQEAKIH0KIAogCi0vLyBKb3NlcGggdGVzdDogbmV3IGluaXRpYWxpemUgb3JkZXIhIQotLy8gVGVzdCBvbmx5ISEgVGhpcyBwYXJ0IG5lZWQgdG8gYmUgcmUtb3JnYW5pemVkLgotLy8gTm93IGl0IGlzIGp1c3QgZm9yIDgyNTYuCi0vL3VzZSBpbiBwaHkgb25seQogI2lmZGVmIFRPX0RPX0xJU1QKIHN0YXRpYyBSVF9TVEFUVVMKIHBoeV9CQjgxOTBfQ29uZmlnX0hhcmRDb2RlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCiB7Ci0JLy9SVF9BU1NFUlQoRkFMU0UsICgiVGhpcyBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50IHlldCEhIFxuIikpOwogCXJldHVybiBSVF9TVEFUVVNfU1VDQ0VTUzsKIH0KICNlbmRpZgpAQCAtODExLDcgKzcwOCw2IEBACiAJdTMyKiAJCQlSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlOwogCXUxNgkJCQlQSFlfUkVHQXJyYXl0b1hUWFJMZW47CiAKLS8vI2lmIChIQUxfQ09ERV9CQVNFICE9IFJUTDgxOTJfUykKIAogCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQxUikKIAl7CkBAIC04MjMsMTEgKzcxOSw2IEBACiAJCVJ0bDgxOVhQSFlfUkVHQXJyYXl0b1hUWFJfVGFibGUgPSBSdGw4MTlYUEhZX1JFR190bzFUMlJfQXJyYXk7CiAJCVBIWV9SRUdBcnJheXRvWFRYUkxlbiA9IFBIWV9DaGFuZ2VUb18xVDJSQXJyYXlMZW5ndGg7CiAJfQotCS8vZWxzZSBpZihwcml2LT5yZl90eXBlID09IFJGXzJUMlIgfHwgcHJpdi0+cmZfdHlwZSA9PSBSRl8yVDJSX0dSRUVOKQotCS8vewotCS8vCVJ0bDgxOVhQSFlfUkVHQXJyYXl0b1hUWFJfVGFibGUgPSBSdGw4MTlYUEhZX1JFR190bzJUMlJfQXJyYXk7Ci0JLy8JUEhZX1JFR0FycmF5dG9YVFhSTGVuID0gUEhZX0NoYW5nZVRvXzJUMlJBcnJheUxlbmd0aDsKLQkvL30KIAllbHNlCiAJewogCQlyZXR1cm4gUlRfU1RBVFVTX0ZBSUxVUkU7CkBAIC04NTAsMTUgKzc0MSwxMSBAQAogCQkJZWxzZSBpZiAoUnRsODE5WFBIWV9SRUdBcnJheXRvWFRYUl9UYWJsZVtpXSA9PSAweGY5KQogCQkJCXVkZWxheSgxKTsKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlW2ldLCBSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlW2krMV0sIFJ0bDgxOVhQSFlfUkVHQXJyYXl0b1hUWFJfVGFibGVbaSsyXSk7Ci0JCQkvL1JUX1RSQUNFKENPTVBfU0VORCwKLQkJCS8vIlRoZSBSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlWzBdIGlzICVseCBSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlWzFdIGlzICVseCBSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlWzJdIGlzICVseCBcbiIsCi0JCQkvL1J0bDgxOVhQSFlfUkVHQXJyYXl0b1hUWFJfVGFibGVbaV0sUnRsODE5WFBIWV9SRUdBcnJheXRvWFRYUl9UYWJsZVtpKzFdLCBSdGw4MTlYUEhZX1JFR0FycmF5dG9YVFhSX1RhYmxlW2krMl0pOwogCQl9CiAJfQogCWVsc2UgewogCQlSVF9UUkFDRShDT01QX1NFTkQsICJwaHlfU2V0QkJ0b0RpZmZSRldpdGhIZWFkZXJGaWxlKCk6IENvbmZpZ1R5cGUgIT0gQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUdcbiIpOwogCX0KLS8vI2VuZGlmCS8vICNpZiAoSEFMX0NPREVfQkFTRSAhPSBSVEw4MTkyX1MpCiAJcmV0dXJuIFJUX1NUQVRVU19TVUNDRVNTOwogfQogCkBAIC04NjksMTQgKzc1Niw2IEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgCSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlSVF9TVEFUVVMJCQlydFN0YXR1cyA9IFJUX1NUQVRVU19TVUNDRVNTOwotCS8vdTgJCQkJdTJSZWdWYWx1ZTsKLQkvL3UxNgkJCQl1NFJlZ1ZhbHVlOwotCS8vY2hhcgkJCQlzekJCUmVnRmlsZVtdID0gUlRMODE5WF9QSFlfUkVHOwotCS8vY2hhcgkJCQlzekJCUmVnRmlsZTFUMlJbXSA9IFJUTDgxOVhfUEhZX1JFR18xVDJSOwotCS8vY2hhcgkJCQlzekJCUmVnUGdGaWxlW10gPSBSVEw4MTlYX1BIWV9SRUdfUEc7Ci0JLy9jaGFyCQkJCXN6QUdDVGFibGVGaWxlW10gPSBSVEw4MTlYX0FHQ19UQUI7Ci0JLy9jaGFyCQkJCXN6QkJSZWd0bzFUMVJGaWxlW10gPSBSVEw4MTlYX1BIWV9SRUdfdG8xVDFSOwotCS8vY2hhcgkJCQlzekJCUmVndG8xVDJSRmlsZVtdID0gUlRMODE5WF9QSFlfUkVHX3RvMVQyUjsKIAogCVJUX1RSQUNFKENPTVBfSU5JVCwgIj09PnBoeV9CQjgxOTJTX0NvbmZpZ19QYXJhRmlsZVxuIik7CiAKQEAgLTk1Niw0MiArODM1LDE2IEBACiAJdTMyCQkJCQlpID0gMDsKIAl1MzIJCQkJCUFycmF5TGVuZ3RoID0gMDsKIAl1MzIqCQkJCQlwdHJBcnJheTsKLQkvL3N0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKLS8vI2lmIChIQUxfQ09ERV9CQVNFICE9IFJUTDgxOTJfUykKLQkvKmlmKEFkYXB0ZXItPmJJbkhjdFRlc3QpCi0JewotCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELCAoIlJ0bDgxOVhNQUNQSFlfQXJyYXlEVE1cbiIpKTsKLQkJQXJyYXlMZW5ndGggPSBNQUNQSFlfQXJyYXlMZW5ndGhEVE07Ci0JCXB0ckFycmF5ID0gUnRsODE5WE1BQ1BIWV9BcnJheURUTTsKLQl9Ci0JZWxzZSBpZihwSGFsRGF0YS0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0pCi0JewotLy8JCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiUnRsODE5WE1BQ1BIWV9BcnJheV9QR1xuIikpOwotLy8JCUFycmF5TGVuZ3RoID0gTUFDUEhZX0FycmF5X1BHTGVuZ3RoOwotLy8JCXB0ckFycmF5ID0gUnRsODE5WE1BQ1BIWV9BcnJheV9QRzsKLQotCX1lbHNlKi8KIAl7IC8vMjAwOC4xMS4wNiBNb2RpZmllZCBieSB0eW5saS4KIAkJUlRfVFJBQ0UoQ09NUF9JTklULCAiUmVhZCBSdGw4MTlYTUFDUEhZX0FycmF5XG4iKTsKIAkJQXJyYXlMZW5ndGggPSBNQUNfMlRfQXJyYXlMZW5ndGg7CiAJCXB0ckFycmF5ID0gUnRsODE5WE1BQ19BcnJheTsKIAl9CiAKLQkvKmZvcihpID0gMCA7aSA8IEFycmF5TGVuZ3RoO2k9aSszKXsKLQkJUlRfVFJBQ0UoQ09NUF9TRU5ELCBEQkdfTE9VRCwgKCJUaGUgUnRsODE5WE1BQ1BIWV9BcnJheVswXSBpcyAlbHggUnRsODE5WE1BQ1BIWV9BcnJheVsxXSBpcyAlbHggUnRsODE5WE1BQ1BIWV9BcnJheVsyXSBpcyAlbHhcbiIscHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0pKTsKLQkJaWYocHRyQXJyYXlbaV0gPT0gMHgzMTgpCi0JCXsKLQkJCXB0ckFycmF5W2krMl0gPSAweDAwMDAwODAwOwotCQkJLy9EYmdQcmludCgicHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0gPSAleCwgJXgsICV4XG4iLAotCQkJLy8JcHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0pOwotCQl9Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBwdHJBcnJheVtpXSwgcHRyQXJyYXlbaSsxXSwgcHRyQXJyYXlbaSsyXSk7Ci0JfSovCiAJZm9yKGkgPSAwIDtpIDwgQXJyYXlMZW5ndGg7aT1pKzIpeyAvLyBBZGQgYnkgdHlubGkgZm9yIDIgY29sdW1uCiAJCXdyaXRlX25pY19ieXRlKGRldiwgcHRyQXJyYXlbaV0sICh1OClwdHJBcnJheVtpKzFdKTsKIAl9Ci0vLyNlbmRpZgogCXJldHVybiBSVF9TVEFUVVNfU1VDQ0VTUzsKIH0KIApAQCAtMTAxNSw0MSArODY4LDE0IEBACiBwaHlfQ29uZmlnQkJXaXRoSGVhZGVyRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LHU4IENvbmZpZ1R5cGUpCiB7CiAJaW50IAkJaTsKLQkvL3U4IAkJQXJyYXlMZW5ndGg7CiAJdTMyKglSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlOwogCXUzMioJUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZTsKIAl1MTYJCVBIWV9SRUdBcnJheUxlbiwgQUdDVEFCX0FycmF5TGVuOwotCS8vc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotLy8jaWYgKEhBTF9DT0RFX0JBU0UgIT0gUlRMODE5Ml9TKQotCS8qaWYoQWRhcHRlci0+YkluSGN0VGVzdCkKLQl7CiAKLQkJQUdDVEFCX0FycmF5TGVuID0gQUdDVEFCX0FycmF5TGVuZ3RoRFRNOwotCQlSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlID0gUnRsODE5WEFHQ1RBQl9BcnJheURUTTsKLQotCQlpZihwSGFsRGF0YS0+UkZfVHlwZSA9PSBSRl8yVDRSKQotCQl7Ci0JCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHQXJyYXlMZW5ndGhEVE07Ci0JCQlSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlID0gUnRsODE5WFBIWV9SRUdBcnJheURUTTsKLQkJfQotCQllbHNlIGlmIChwSGFsRGF0YS0+UkZfVHlwZSA9PSBSRl8xVDJSKQotCQl7Ci0JCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHXzFUMlJBcnJheUxlbmd0aERUTTsKLQkJCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGUgPSBSdGw4MTlYUEhZX1JFR18xVDJSQXJyYXlEVE07Ci0JCX0KLQotCX0KLQllbHNlCi0JKi8KLQkvL3sKLQkvLwotCS8vIDIwMDguMTEuMDYgTW9kaWZpZWQgYnkgdHlubGkuCi0JLy8KIAlBR0NUQUJfQXJyYXlMZW4gPSBBR0NUQUJfQXJyYXlMZW5ndGg7CiAJUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZSA9IFJ0bDgxOVhBR0NUQUJfQXJyYXk7CiAJUEhZX1JFR0FycmF5TGVuID0gUEhZX1JFR18yVDJSQXJyYXlMZW5ndGg7IC8vIERlZmF1bHQgUkZfdHlwZTogMlQyUgogCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGUgPSBSdGw4MTlYUEhZX1JFR19BcnJheTsKLQkvL30KIAogCWlmKENvbmZpZ1R5cGUgPT0gQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUcpCiAJewpAQCAtMTA2OCw3ICs4OTQsNiBAQAogCQkJZWxzZSBpZiAoUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZVtpXSA9PSAweGY5KQogCQkJCXVkZWxheSgxKTsKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2ldLCBiTWFza0RXb3JkLCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2krMV0pOwotCQkJLy9SVF9UUkFDRShDT01QX1NFTkQsICJUaGUgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZVswXSBpcyAlbHggUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAlbHggXG4iLFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaV0sIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaSsxXSk7CiAKIAkJfQogCX0KQEAgLTEwNzgsNyArOTAzLDYgQEAKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2ldLCBiTWFza0RXb3JkLCBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2krMV0pOwogCQl9CiAJfQotLy8jZW5kaWYJLy8gI2lmIChIQUxfQ09ERV9CQVNFICE9IFJUTDgxOTJfUykKIAlyZXR1cm4gUlRfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKQEAgLTExMDMsMTIgKzkyNyw4IEBACiBwaHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsdTggQ29uZmlnVHlwZSkKIHsKIAlpbnQgaTsKLQkvL3U4IEFycmF5TGVuZ3RoOwogCXUzMioJUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QRzsKIAl1MTYJUEhZX1JFR0FycmF5UEdMZW47Ci0JLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0vLyNpZiAoSEFMX0NPREVfQkFTRSAhPSBSVEw4MTkyX1MpCi0JLy8gRGVmYXVsdDogcEhhbERhdGEtPlJGX1R5cGUgPSBSRl8yVDJSLgogCiAJUEhZX1JFR0FycmF5UEdMZW4gPSBQSFlfUkVHX0FycmF5X1BHTGVuZ3RoOwogCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEcgPSBSdGw4MTlYUEhZX1JFR19BcnJheV9QRzsKQEAgLTExMzAsMTUgKzk1MCwxMyBAQAogCQkJZWxzZSBpZiAoUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QR1tpXSA9PSAweGY5KQogCQkJCXVkZWxheSgxKTsKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2ldLCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2krMV0sIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEdbaSsyXSk7Ci0JCQkvL1JUX1RSQUNFKENPTVBfU0VORCwgIlRoZSBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHWzBdIGlzICVseCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHWzFdIGlzICVseCBcbiIsCi0JCQkvLwkJUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QR1tpXSwgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QR1tpKzFdKTsKIAkJfQogCX1lbHNlewogCQlSVF9UUkFDRShDT01QX1NFTkQsICJwaHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlKCk6IENvbmZpZ1R5cGUgIT0gQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUdcbiIpOwogCX0KIAlyZXR1cm4gUlRfU1RBVFVTX1NVQ0NFU1M7CiAKLX0JLyogcGh5X0NvbmZpZ0JCV2l0aFBnSGVhZGVyRmlsZSAqLworfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbjogICAgUEhZX0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoKQpAQCAtMTE1NSwxOSArOTczLDE0IEBACiAgKgogICogTm90ZToJCURlbGF5IG1heSBiZSByZXF1aXJlZCBmb3IgUkYgY29uZmlndXJhdGlvbgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy9pbiA4MjU2IHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlIG9ubHkKLS8vUlRfU1RBVFVTIFBIWV9Db25maWdSRldpdGhIZWFkZXJGaWxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCkKIHU4IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UJZVJGUGF0aCkKIHsKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpbnQJCQlpOwotCS8vdTMyKglwUkZBcnJheTsKIAlSVF9TVEFUVVMJcnRTdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKIAl1MzIJCQkqUnRsODE5WFJhZGlvQV9BcnJheV9UYWJsZTsKIAl1MzIJCQkqUnRsODE5WFJhZGlvQl9BcnJheV9UYWJsZTsKLQkvL3UzMioJUnRsODE5WFJhZGlvQ19BcnJheV9UYWJsZTsKLQkvL3UzMioJUnRsODE5WFJhZGlvRF9BcnJheV9UYWJsZTsKIAl1MTYJCQlSYWRpb0FfQXJyYXlMZW4sUmFkaW9CX0FycmF5TGVuOwogCiAJewkvLzIwMDguMTEuMDYgTW9kaWZpZWQgYnkgdHlubGkKQEAgLTExOTAsMTggKzEwMDMsMTIgQEAKIAogCXJ0U3RhdHVzID0gUlRfU1RBVFVTX1NVQ0NFU1M7CiAKLQkvLyBXaGVuIGluaXRpYWxpemF0aW9uLCB3ZSB3YW50IHRoZSBkZWxheSBmdW5jdGlvbihtZGVsYXkoKSwgZGVsYXlfdXMoKQotCS8vID09PiBhY3R1YWxseSB3ZSBjYWxsIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oKSkgdG8gZG8gTmRpc1N0YWxsRXhlY3V0aW9uKCkKLQkvLyBbYnVzeSB3YWl0XSBpbnN0ZWFkIG9mIE5kaXNNU2xlZXAoKS4gU28gd2UgYWNxdWlyZSBSVF9JTklUSUFMX1NQSU5MT0NLCi0JLy8gdG8gcnVuIGF0IERpc3BhdGNoIGxldmVsIHRvIGFjaGl2ZSBpdC4KLQkvL2Nvc2EgUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfSU5JVElBTF9TUElOTE9DSyk7CiAKIAlzd2l0Y2goZVJGUGF0aCl7CiAJCWNhc2UgUkY5MF9QQVRIX0E6CiAJCQlmb3IoaSA9IDA7aTxSYWRpb0FfQXJyYXlMZW47IGk9aSsyKXsKIAkJCQlpZihSdGw4MTlYUmFkaW9BX0FycmF5X1RhYmxlW2ldID09IDB4ZmUpCiAJCQkJCXsgLy8gRGVheSBzcGVjaWZpYyBtcy4gT25seSBSRiBjb25maWd1cmF0aW9uIHJlcXVpcmUgZGVsYXkuCi0vLyNpZiAoREVWX0JVU19UWVBFID09IFVTQl9JTlRFUkZBQ0UpCiAJCQkJCQltZGVsYXkoMTAwMCk7CiAJCQkJfQogCQkJCQllbHNlIGlmIChSdGw4MTlYUmFkaW9BX0FycmF5X1RhYmxlW2ldID09IDB4ZmQpCkBAIC0xMjEwLDcgKzEwMTcsNiBAQAogCQkJCQkJbWRlbGF5KDEpOwogCQkJCQllbHNlIGlmIChSdGw4MTlYUmFkaW9BX0FycmF5X1RhYmxlW2ldID09IDB4ZmIpCiAJCQkJCQl1ZGVsYXkoNTApOwotCQkJCQkJLy9QbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDUwKTsKIAkJCQkJZWxzZSBpZiAoUnRsODE5WFJhZGlvQV9BcnJheV9UYWJsZVtpXSA9PSAweGZhKQogCQkJCQkJdWRlbGF5KDUpOwogCQkJCQllbHNlIGlmIChSdGw4MTlYUmFkaW9BX0FycmF5X1RhYmxlW2ldID09IDB4ZjkpCkBAIC0xMjI1LDcgKzEwMzEsNiBAQAogCQkJZm9yKGkgPSAwO2k8UmFkaW9CX0FycmF5TGVuOyBpPWkrMil7CiAJCQkJaWYoUnRsODE5WFJhZGlvQl9BcnJheV9UYWJsZVtpXSA9PSAweGZlKQogCQkJCQl7IC8vIERlYXkgc3BlY2lmaWMgbXMuIE9ubHkgUkYgY29uZmlndXJhdGlvbiByZXF1aXJlIGRlbGF5LgotLy8jaWYgKERFVl9CVVNfVFlQRSA9PSBVU0JfSU5URVJGQUNFKQogCQkJCQkJbWRlbGF5KDEwMDApOwogCQkJCX0KIAkJCQkJZWxzZSBpZiAoUnRsODE5WFJhZGlvQl9BcnJheV9UYWJsZVtpXSA9PSAweGZkKQpAQCAtMTI4MSw3ICsxMDg2LDYgQEAKIAlSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoCiAJKQogewotCS8vc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVJUX1NUQVRVUwkJCXJ0U3RhdHVzID0gUlRfU1RBVFVTX1NVQ0NFU1M7CiAJdTMyCQkJCWksIENoZWNrVGltZXMgPSA0LHVsUmVnUmVhZCA9IDA7CiAJdTMyCQkJCVdyaXRlQWRkcls0XTsKQEAgLTEzMDIsNyArMTEwNiw2IEBACiAJCXN3aXRjaChDaGVja0Jsb2NrKQogCQl7CiAJCWNhc2UgSFc5MF9CTE9DS19NQUM6Ci0JCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgMHgxMDAgaGVyZSEiKSk7CiAJCQlSVF9UUkFDRShDT01QX0lOSVQsICJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgMHgxMDAgaGVyZSFcbiIpOwogCQkJYnJlYWs7CiAKQEAgLTEzMTMsMTggKzExMTYsMTIgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgSFc5MF9CTE9DS19SRjoKLQkJCS8vIFdoZW4gaW5pdGlhbGl6YXRpb24sIHdlIHdhbnQgdGhlIGRlbGF5IGZ1bmN0aW9uKG1kZWxheSgpLCBkZWxheV91cygpCi0JCQkvLyA9PT4gYWN0dWFsbHkgd2UgY2FsbCBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKCkpIHRvIGRvIE5kaXNTdGFsbEV4ZWN1dGlvbigpCi0JCQkvLyBbYnVzeSB3YWl0XSBpbnN0ZWFkIG9mIE5kaXNNU2xlZXAoKS4gU28gd2UgYWNxdWlyZSBSVF9JTklUSUFMX1NQSU5MT0NLCi0JCQkvLyB0byBydW4gYXQgRGlzcGF0Y2ggbGV2ZWwgdG8gYWNoaXZlIGl0LgotCQkJLy9jb3NhIFBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKGRldiwgUlRfSU5JVElBTF9TUElOTE9DSyk7CiAJCQlXcml0ZURhdGFbaV0gJj0gMHhmZmY7CiAJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIFdyaXRlQWRkcltIVzkwX0JMT0NLX1JGXSwgYlJGUmVnT2Zmc2V0TWFzaywgV3JpdGVEYXRhW2ldKTsKIAkJCS8vIFRPRE86IHdlIHNob3VsZCBub3QgZGVsYXkgZm9yIHN1Y2ggYSBsb25nIHRpbWUuIEFzayBTRDMKIAkJCW1kZWxheSgxMCk7CiAJCQl1bFJlZ1JlYWQgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgZVJGUGF0aCwgV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUkZdLCBiTWFza0RXb3JkKTsKIAkJCW1kZWxheSgxMCk7Ci0JCQkvL2Nvc2EgUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soZGV2LCBSVF9JTklUSUFMX1NQSU5MT0NLKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC0xMzM4LDcgKzExMzUsNiBAQAogCQkvLwogCQlpZih1bFJlZ1JlYWQgIT0gV3JpdGVEYXRhW2ldKQogCQl7Ci0JCQkvL1JUX1RSQUNFKENPTVBfRlBHQSwgICgidWxSZWdSZWFkOiAleCwgV3JpdGVEYXRhOiAleCBcbiIsIHVsUmVnUmVhZCwgV3JpdGVEYXRhW2ldKSk7CiAJCQlSVF9UUkFDRShDT01QX0VSUiwgInJlYWQgYmFjayBlcnJvcihyZWFkOiV4LCB3cml0ZToleClcbiIsIHVsUmVnUmVhZCwgV3JpdGVEYXRhW2ldKTsKIAkJCXJ0U3RhdHVzID0gUlRfU1RBVFVTX0ZBSUxVUkU7CiAJCQlicmVhazsKQEAgLTEzNDgsNyArMTE0NCw2IEBACiAJcmV0dXJuIHJ0U3RhdHVzOwogfQogCi0vL25vIHVzZSB0ZW1wIGluIHdpbmRvd3MgZHJpdmVyCiAjaWZkZWYgVE9fRE9fTElTVAogdm9pZAogUEhZX1NldFJGUG93ZXJTdGF0ZTgxOTJTVXNiKApAQCAtMTM1OSw3ICsxMTU0LDYgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJYm9vbAkJCVdhaXRTaHV0RG93biA9IEZBTFNFOwogCXUzMgkJCURXb3JkQ29udGVudDsKLQkvL1JGOTBfUkFESU9fUEFUSF9FCWVSRlBhdGg7CiAJdTgJCQkJZVJGUGF0aDsKIAlCQl9SRUdJU1RFUl9ERUZJTklUSU9OX1QJKnBQaHlSZWc7CiAKQEAgLTEzNjgsNyArMTE2Miw2IEBACiAKIAlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gVFJVRTsKIAotCS8vIFRPRE86IEVtaWx5LCAyMDA2LjExLjIxLCB3ZSBzaG91bGQgcmV3cml0ZSB0aGlzIGZ1bmN0aW9uCiAKIAlpZihSRlBvd2VyU3RhdGU9PVJGX1NIVVRfRE9XTikKIAl7CkBAIC0xNDIwLDIyICsxMjEzLDIwIEBACiAKIAljYXNlIFJGXzgyNTg6CiAJCWJyZWFrOwotCX0vLyBzd2l0Y2goIHByaXYtPnJmX2NoaXAgKQorCX0KIAogCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBGQUxTRTsKIH0KICNlbmRpZgogCiAjaWZkZWYgUlRMODE5MlUKLS8vbm8gdXNlIHRlbXAgaW4gd2luZG93cyBkcml2ZXIKIHZvaWQKIFBIWV9VcGRhdGVJbml0aWFsR2FpbigKIAlzdHJ1Y3QgbmV0X2RldmljZSogZGV2CiAJKQogewogCXN0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JLy91bnNpZ25lZCBjaGFyCQkJKklHVGFibGU7Ci0JLy91OAkJCURJR19DdXJyZW50SW5pdGlhbEdhaW4gPSA0OworCiAKIAlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKIAl7CkBAIC0xNDU2LDcgKzEyNDcsNiBAQAogfQogI2VuZGlmCiAKLS8vWUosbW9kaWZpZWQsMDkwMTA3CiB2b2lkIFBIWV9HZXRIV1JlZ09yaWdpbmFsVmFsdWUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNjI1LDggKzE0MTUsNiBAQAogCS8vIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjayBQSSBtb2RlCiAJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkxTU0lSZWFkQmFja1BpID0gVHJhbnNjZWl2ZXJBX0hTUElfUmVhZGJhY2s7CiAJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkxTU0lSZWFkQmFja1BpID0gVHJhbnNjZWl2ZXJCX0hTUElfUmVhZGJhY2s7Ci0JLy9wSGFsRGF0YS0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkxTU0lSZWFkQmFja1BpID0gckZQR0EwX1hDX0xTU0lSZWFkQmFjazsKLQkvL3BIYWxEYXRhLT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmTFNTSVJlYWRCYWNrUGkgPSByRlBHQTBfWERfTFNTSVJlYWRCYWNrOwogCiB9CiAKQEAgLTE2MzcsOSArMTQyNSw3IEBACiAvLwlBc3N1bXB0aW9uOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcmUtc2NoZHVsYWJsZSBjb250ZXh0LAogLy8JCWllLiBQQVNTSVZFX0xFVkVMLgogLy8KLS8vCTA1MDgyMywgYnkgcmNuamtvLgotLy9ub3QgdW5kZXJzdGFuZCBpdCBzZWVtJ3MgdXNlIGluIGluaXQKLS8vU2V0SHdSZWc4MTkyU1VzYi0tLT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlcgorCiBib29sIFBIWV9TZXRSRlBvd2VyU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNjY1LDggKzE0NTEsNiBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlib29sCQkJYlJlc3VsdCA9IFRSVUU7Ci0JLy91OAkJZVJGUGF0aDsKLQkvL3U4CQlpLCBRdWV1ZUlEOwogCXU4IAkJdTFiVG1wOwogCiAJaWYocHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9PSBUUlVFKQpAQCAtMTY5Nyw5ICsxNDgxLDYgQEAKIAkJCQkJCWJyZWFrOwogCQkJCS8vCiAJCQkJLy9SRiBPZmYvU2xlZXAgc2VxdWVuY2UuIERlc2lnbmVkL3Rlc3RlZCBmcm9tIFNENCBTY290dCwgU0QxIEdyZW50IGFuZCBKb25ib24uCi0JCQkJLy8gQWRkZWQgYnkgQnJ1Y2UsIDIwMDgtMTEtMjIuCi0JCQkJLy8KLQkJCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCQkJCS8vICgwKSBEaXNhYmxlIEZXIEJCIHJlc2V0IGNoZWNraW5nCiAJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZNNSwgRldfQkJfUkVTRVRfRElTQUJMRSk7CiAKQEAgLTE3MjgsNyArMTUwOSw2IEBACiAKIAkJCWRlZmF1bHQ6CiAJCQkJYlJlc3VsdCA9IEZBTFNFOwotCQkJCS8vUlRfQVNTRVJUKEZBTFNFLCAoInBoeV9TZXRSRlBvd2VyU3RhdGU4MTkyU1UoKTogdW5rbm93biBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpKTsKIAkJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTE4NjAsNyArMTY0MCw2IEBACiAgdm9pZCBQSFlfU2V0VHhQb3dlckxldmVsODE5MlMoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTgJY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JLy9IQUxfREFUQV9UWVBFCQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoZGV2KTsKIAl1OAlwb3dlcmxldmVsID0gKHU4KUVFUFJPTV9EZWZhdWx0X1R4UG93ZXIsIHBvd2VybGV2ZWxPRkRNMjRHID0gMHgxMDsKIAlzOCAJYW50X3B3cl9kaWZmID0gMDsKIAl1MzIJdTRSZWdWYWx1ZTsKQEAgLTE5MDksMTQgKzE2ODgsNiBAQAogCQkJLy8gUkYgQiBIVCBPRkRNIHB3ci1SRkEgSFQgT0ZETSBwd3IKIAkJYW50X3B3cl9kaWZmID0gCXByaXYtPlJmVHhQd3JMZXZlbE9mZG0yVFsxXVtpbmRleF0gLQogCQkJCQkJcHJpdi0+UmZUeFB3ckxldmVsT2ZkbTJUWzBdW2luZGV4XTsKLQkJCS8vIFJGIEIgKEhUIE9GRE0gcHdyK2xlZ2FjeS1odC1kaWZmKSAtKFJGQSBIVCBPRkRNIHB3citsZWdhY3ktaHQtZGlmZikKLQkJLy8gV2UgY2FuIG5vdCBoYW5kbGUgUGF0aCBCJkEgSFQvTGVnYWN5IHB3ciBkaWZmIGZvciA5MlMgbm93LgotCi0JCS8vUlRQUklOVChGUEhZLCBQSFlfVFhQV1IsICgiQ0gtJWQgSFQ0MCBBL0IgUHdyIGluZGV4ID0gJXgvJXgoJWQvJWQpXG4iLAotCQkvL2NoYW5uZWwsIHByaXYtPlJmVHhQd3JMZXZlbE9mZG0yVFswXVtpbmRleF0sCi0JCS8vcHJpdi0+UmZUeFB3ckxldmVsT2ZkbTJUWzFdW2luZGV4XSwKLQkJLy9wcml2LT5SZlR4UHdyTGV2ZWxPZmRtMlRbMF1baW5kZXhdLAotCQkvL3ByaXYtPlJmVHhQd3JMZXZlbE9mZG0yVFsxXVtpbmRleF0pKTsKIAogCQlodDIwcHdyWzBdID0gaHQ0MHB3clswXSA9IHByaXYtPlJmVHhQd3JMZXZlbE9mZG0yVFswXVtpbmRleF07CiAJCWh0MjBwd3JbMV0gPSBodDQwcHdyWzFdID0gcHJpdi0+UmZUeFB3ckxldmVsT2ZkbTJUWzFdW2luZGV4XTsKQEAgLTE5NDksMTAgKzE3MjAsNiBAQAogCQkJLy8gUkYgQiBIVCBPRkRNIHB3ci1SRkEgSFQgT0ZETSBwd3IKIAkJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUMlIpCiAJCQkJYW50X3B3cl9kaWZmID0gaHQyMHB3clsxXSAtIGh0MjBwd3JbMF07Ci0KLQkJCS8vUlRQUklOVChGUEhZLCBQSFlfVFhQV1IsCi0JCQkvLygiSFQyMCB0byBIVDQwIHB3cmRpZmZbQS9CXT0lZC8lZCwgYW50X3B3cl9kaWZmPSVkKEItQT0lZC0lZClcbiIsCi0JCQkvL3B3cmRpZmZbMF0sIHB3cmRpZmZbMV0sIGFudF9wd3JfZGlmZiwgaHQyMHB3clsxXSwgaHQyMHB3clswXSkpOwogCQl9CiAKIAkJLy8gQmFuZCBFZGdlIHNjaGVtZSBpcyBlbmFibGVkIGZvciBGQ0MgbW9kZQpAQCAtMTk5NywxOCArMTc2NCwxMiBAQAogCQkJewogCQkJCWlmIChjaGFubmVsIDw9IDEgfHwgY2hhbm5lbCA+PSAxMSkKIAkJCQl7Ci0JCQkJCS8vUlRQUklOVChGUEhZLCBQSFlfVFhQV1IsCi0JCQkJCS8vKCJIVDIwIEJhbmQtZWRnZSBwd3JkaWZmW0EvQl09JWQvJWQsIGFudF9wd3JfZGlmZj0lZChCLUE9JWQtJWQpXG4iLAotCQkJCQkvL3B3cmRpZmZbMF0sIHB3cmRpZmZbMV0sIGFudF9wd3JfZGlmZiwgaHQyMHB3clsxXSwgaHQyMHB3clswXSkpOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlpZiAoY2hhbm5lbCA8PSAzIHx8IGNoYW5uZWwgPj0gOSkKIAkJCQl7Ci0JCQkJCS8vUlRQUklOVChGUEhZLCBQSFlfVFhQV1IsCi0JCQkJCS8vKCJIVDQwIEJhbmQtZWRnZSBwd3JkaWZmW0EvQl09JWQvJWQsIGFudF9wd3JfZGlmZj0lZChCLUE9JWQtJWQpXG4iLAotCQkJCQkvL3B3cmRpZmZbMF0sIHB3cmRpZmZbMV0sIGFudF9wd3JfZGlmZiwgaHQ0MHB3clsxXSwgaHQ0MHB3clswXSkpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjAyMSwxMCArMTc4Miw2IEBACiAJaWYoYW50X3B3cl9kaWZmIDwgLTgpCiAJCWFudF9wd3JfZGlmZiA9IC04OwogCi0JCS8vUlRQUklOVChGUEhZLCBQSFlfVFhQV1IsCi0JCS8vKCJDQ0svSFQgUG93ZXIgaW5kZXggPSAleC8leCglZC8lZCksIGFudF9wd3JfZGlmZj0lZFxuIiwKLQkJLy9wb3dlcmxldmVsLCBwb3dlcmxldmVsT0ZETTI0RywgcG93ZXJsZXZlbCwgcG93ZXJsZXZlbE9GRE0yNEcsIGFudF9wd3JfZGlmZikpOwotCiAJCWFudF9wd3JfZGlmZiAmPSAweGY7CiAKIAkJLy8gQW50ZW5uYSBUWCBwb3dlciBkaWZmZXJlbmNlCkBAIC0yMDUwLDcgKzE4MDcsNiBAQAogCS8vIFRPRE86CiAJLy8gMS4gODAyLjExaCBwb3dlciBjb250cmFpbnQKIAkvLwotCS8vIDA3MTAxMSwgYnkgcmNuamtvLgogCS8vCiAjaWZkZWYgVE9ETyAvL1dCLCAxMWggaGFzIG5vdCBpbXBsZW1lbnRlZCBub3cuCiAJaWYoCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmIHByaXYtPmJXaXRoQ2N4Q2VsbFB3ciAmJgpAQCAtMjA5NSw4ICsxODUxLDYgQEAKIAlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKIAl7CiAJCWNhc2UgUkZfODIyNToKLQkJCS8vUEhZX1NldFJGODIyNUNja1R4UG93ZXIoZGV2LCBwb3dlcmxldmVsKTsKLQkJCS8vUEhZX1NldFJGODIyNU9mZG1UeFBvd2VyKGRldiwgcG93ZXJsZXZlbE9GRE0yNEcpOwogCQlicmVhazsKIAogCQljYXNlIFJGXzgyNTY6CkBAIC0yMTIxLDggKzE4NzUsNiBAQAogLy8KIC8vCVRPRE86CiAvLwkJQSBtb2RlLgotLy8JQnkgQnJ1Y2UsIDIwMDgtMDItMDQuCi0vLyAgICBubyB1c2UgdGVtcAogYm9vbCBQSFlfVXBkYXRlVHhQb3dlckRibTgxOTJTKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGxvbmcgcG93ZXJJbkRibSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAJKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMjE2NCw4ICsxOTE2LDYgQEAKIAlEZXNjcmlwdGlvbjoKIAkJV2hlbiBiZWFjb24gaW50ZXJ2YWwgaXMgY2hhbmdlZCwgdGhlIHZhbHVlcyBvZiB0aGUKIAkJaHcgcmVnaXN0ZXJzIHNob3VsZCBiZSBtb2RpZmllZC4KLQlCeSB0eW5saSwgMjAwOC4xMC4yNC4KLQogKi8KIAogZXh0ZXJuIHZvaWQgUEhZX1NldEJlYWNvbkh3UmVnKAlzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MTYgQmVhY29uSW50ZXJ2YWwpCkBAIC0yMTczLDggKzE5MjMsNiBAQAogCXUzMiBOZXdCZWFjb25OdW07CiAKIAlOZXdCZWFjb25OdW0gPSBCZWFjb25JbnRlcnZhbCAqMzIgLSA2NDsKLQkvL1BsYXRmb3JtRUZJT1dyaXRlNEJ5dGUoQWRhcHRlciwgV0ZNMys0LCBOZXdCZWFjb25OdW0pOwotCS8vUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShBZGFwdGVyLCBXRk0zLCAweEIwMjYwMDdDKTsKIAl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk0zKzQsIE5ld0JlYWNvbk51bSk7CiAJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZNMywgMHhCMDI2MDA3Qyk7CiB9CkBAIC0yMTg0LDcgKzE5MzIsNiBAQAogLy8JCU1hcCBkQm0gaW50byBUeCBwb3dlciBpbmRleCBhY2NvcmRpbmcgdG8KIC8vCQljdXJyZW50IEhXIG1vZGVsLCBmb3IgZXhhbXBsZSwgUkYgYW5kIFBBLCBhbmQKIC8vCQljdXJyZW50IHdpcmVsZXNzIG1vZGUuCi0vLwlCeSBCcnVjZSwgMjAwOC0wMS0yOS4KIC8vICAgIHVzZSBpbiBwaHkgb25seQogc3RhdGljIHU4IHBoeV9EYm1Ub1R4UHdySWR4KAogCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCkBAIC0yMTkyLDcgKzE5MzksNiBAQAogCWxvbmcJCQlQb3dlckluRGJtCiAJKQogewotCS8vc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4CQkJCVR4UHdySWR4ID0gMDsKIAlsb25nCQkJCU9mZnNldCA9IDA7CiAKQEAgLTIyMDIsNyArMTk0OCw2IEBACiAJLy8gM2RibSwgYW5kIE9GRE0gSFQgZXF1YWxzIHRvIDBkYm0gcmVwZWN0aXZlbHkuCiAJLy8gTm90ZToKIAkvLwlUaGUgbWFwcGluZyBtYXkgYmUgZGlmZmVyZW50IGJ5IGRpZmZlcmVudCBOSUNzLiBEbyBub3QgdXNlIHRoaXMgZm9ybXVsYSBmb3Igd2hhdCBuZWVkcyBhY2N1cmF0ZSByZXN1bHQuCi0JLy8gQnkgQnJ1Y2UsIDIwMDgtMDEtMjkuCiAJLy8KIAlzd2l0Y2goV2lyZWxlc3NNb2RlKQogCXsKQEAgLTIyMzgsNyArMTk4Myw2IEBACiAvLwkJTWFwIFR4IHBvd2VyIGluZGV4IGludG8gZEJtIGFjY29yZGluZyB0bwogLy8JCWN1cnJlbnQgSFcgbW9kZWwsIGZvciBleGFtcGxlLCBSRiBhbmQgUEEsIGFuZAogLy8JCWN1cnJlbnQgd2lyZWxlc3MgbW9kZS4KLS8vCUJ5IEJydWNlLCAyMDA4LTAxLTI5LgogLy8gICAgdXNlIGluIHBoeSBvbmx5CiBzdGF0aWMgbG9uZyBwaHlfVHhQd3JJZHhUb0RibSgKIAlzdHJ1Y3QgbmV0X2RldmljZSogZGV2LApAQCAtMjI1NSw3ICsxOTk5LDYgQEAKIAkvLyAzZGJtLCBhbmQgT0ZETSBIVCBlcXVhbHMgdG8gMGRibSByZXBlY3RpdmVseS4KIAkvLyBOb3RlOgogCS8vCVRoZSBtYXBwaW5nIG1heSBiZSBkaWZmZXJlbnQgYnkgZGlmZmVyZW50IE5JQ3MuIERvIG5vdCB1c2UgdGhpcyBmb3JtdWxhIGZvciB3aGF0IG5lZWRzIGFjY3VyYXRlIHJlc3VsdC4KLQkvLyBCeSBCcnVjZSwgMjAwOC0wMS0yOS4KIAkvLwogCXN3aXRjaChXaXJlbGVzc01vZGUpCiAJewpAQCAtMjMyNyw5ICsyMDcwLDYgQEAKIHZvaWQgUEhZX0luaXRpYWxHYWluODE5MlMoc3RydWN0IG5ldF9kZXZpY2UqIGRldix1OCBPcGVyYXRpb24JKQogewogCi0JLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JLy91MzIJCQkJCUJpdE1hc2s7Ci0JLy91OAkJCQkJaW5pdGlhbF9nYWluOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzUzLDExICsyMDkzLDYgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTgJIAkJCXJlZ0J3T3BNb2RlOwogCi0JLy9yZXR1cm47Ci0KLQkvLyBBZGRlZCBpdCBmb3IgMjAvNDAgbWh6IHN3aXRjaCB0aW1lIGV2YWx1YXRpb24gYnkgZ3VhbmdhbiAwNzA1MzEKLQkvL3UzMgkJCQlOb3dMLCBOb3dIOwotCS8vdThCeXRlCQkJCUJlZ2luVGltZSwgRW5kVGltZTsKIAl1OAkJCQlyZWdSUlNSX1JTQzsKIAogCVJUX1RSQUNFKENPTVBfU1dCVywgIj09PlNldEJXTW9kZUNhbGxiYWNrODE5MFBjaSgpICBTd2l0Y2ggdG8gJXMgYmFuZHdpZHRoXG4iLCBcCkBAIC0yMzcyLDEwICsyMTA3LDYgQEAKIAlpZighcHJpdi0+dXApCiAJCXJldHVybjsKIAotCS8vIEFkZGVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIHRpbWUgZXZhbHVhdGlvbiBieSBndWFuZ2FuIDA3MDUzMQotCS8vTm93TCA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGUik7Ci0JLy9Ob3dIID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZSKzQpOwotCS8vQmVnaW5UaW1lID0gKCh1OEJ5dGUpTm93SCA8PCAzMikgKyBOb3dMOwogCiAJLy8zLy8KIAkvLzMvLzwxPlNldCBNQUMgcmVnaXN0ZXIKQEAgLTIzODYsOCArMjExNyw2IEBACiAJc3dpdGNoKHByaXYtPkN1cnJlbnRDaGFubmVsQlcpCiAJewogCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6Ci0JCQkvL2lmKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID49IFZFUlNJT05fODE5MlNfQkNVVCkKLQkJCS8vCXdyaXRlX25pY19ieXRlKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIsIDB4NTgpOwogCiAJCQlyZWdCd09wTW9kZSB8PSBCV19PUE1PREVfMjBNSFo7CiAJCSAgICAgICAJLy8gMjAwNy8wMi8wNyBNYXJrIGJ5IEVtaWx5IGJlY2FzdWUgd2UgaGF2ZSBub3QgdmVyaWZ5IHdoZXRoZXIgdGhpcyByZWdpc3RlciB3b3JrcwpAQCAtMjM5NSw4ICsyMTI0LDYgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKLQkJCS8vaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPj0gVkVSU0lPTl84MTkyU19CQ1VUKQotCQkJLy8Jd3JpdGVfbmljX2J5dGUoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiwgMHgxOCk7CiAKIAkJCXJlZ0J3T3BNb2RlICY9IH5CV19PUE1PREVfMjBNSFo7CiAgICAgICAgIAkJLy8gMjAwNy8wMi8wNyBNYXJrIGJ5IEVtaWx5IGJlY2FzdWUgd2UgaGF2ZSBub3QgdmVyaWZ5IHdoZXRoZXIgdGhpcyByZWdpc3RlciB3b3JrcwpAQCAtMjQyMSwxMiArMjE0OCw2IEBACiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MCk7CiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MCk7CiAKLQkJCS8vIENvcnJlY3QgdGhlIHR4IHBvd2VyIGZvciBDQ0sgcmF0ZSBpbiA0ME0uIFN1Z2dlc3QgYnkgWU4sIDIwMDcxMjA3Ci0JCQkvLyBJdCBpcyBzZXQgaW4gVHggZGVzY3JpcHRvciBmb3IgODE5Mnggc2VyaWVzCi0JCQkvL3dyaXRlX25pY19kd29yZChkZXYsIHJDQ0swX1R4RmlsdGVyMSwgMHgxYTFiMDAwMCk7Ci0JCQkvL3dyaXRlX25pY19kd29yZChkZXYsIHJDQ0swX1R4RmlsdGVyMiwgMHgwOTBlMTMxNyk7Ci0JCQkvL3dyaXRlX25pY19kd29yZChkZXYsIHJDQ0swX0RlYnVnUG9ydCwgMHgwMDAwMDIwNCk7Ci0KIAkJCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA+PSBWRVJTSU9OXzgxOTJTX0JDVVQpCiAJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiwgMHg1OCk7CiAKQEAgLTI0MzgsMTYgKzIxNTksMTEgQEAKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJSRk1PRCwgMHgxKTsKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTFfUkZNT0QsIGJSRk1PRCwgMHgxKTsKIAotCQkJLy8gQ29ycmVjdCB0aGUgdHggcG93ZXIgZm9yIENDSyByYXRlIGluIDQwTS4gU3VnZ2VzdCBieSBZTiwgMjAwNzEyMDcKLQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgckNDSzBfVHhGaWx0ZXIxLCAweDM1MzYwMDAwKTsKLQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgckNDSzBfVHhGaWx0ZXIyLCAweDEyMWMyNTJlKTsKLQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgckNDSzBfRGVidWdQb3J0LCAweDAwMDAwNDA5KTsKIAogCQkJLy8gU2V0IENvbnRyb2wgY2hhbm5lbCB0byB1cHBlciBvciBsb3dlci4gVGhlc2Ugc2V0dGluZ3MgYXJlIHJlcXVpcmVkIG9ubHkgZm9yIDQwTUh6CiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsIChwcml2LT5uQ3VyNDBNaHpQcmltZVNDPj4xKSk7CiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX0xTVEYsIDB4QzAwLCBwcml2LT5uQ3VyNDBNaHpQcmltZVNDKTsKIAotCQkJLy9ydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAzMDAwMDAsIDMpOwogCQkJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID49IFZFUlNJT05fODE5MlNfQkNVVCkKIAkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIyLCAweDE4KTsKIApAQCAtMjQ2MSwxMSArMjE3Nyw2IEBACiAJfQogCS8vU2tpcCBvdmVyIHNldHRpbmcgb2YgSi1tb2RlIGluIEJCIHJlZ2lzdGVyIGhlcmUuIERlZmF1bHQgdmFsdWUgaXMgIk5vbmUgSiBtb2RlIi4gRW1pbHkgMjAwNzAzMTUKIAotCS8vIEFkZGVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIHRpbWUgZXZhbHVhdGlvbiBieSBndWFuZ2FuIDA3MDUzMQotCS8vTm93TCA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGUik7Ci0JLy9Ob3dIID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZSKzQpOwotCS8vRW5kVGltZSA9ICgodThCeXRlKU5vd0ggPDwgMzIpICsgTm93TDsKLQkvL1JUX1RSQUNFKENPTVBfU0NBTiwgREJHX0xPVUQsICgiU2V0QldNb2RlQ2FsbGJhY2s4MTkwUGNpOiB0aW1lIG9mIFNldEJXTW9kZSA9ICVJNjRkIHVzIVxuIiwgKEVuZFRpbWUgLSBCZWdpblRpbWUpKSk7CiAKIAkvLzM8Mz5TZXQgUkYgcmVsYXRlZCByZWdpc3RlcgogCXN3aXRjaCggcHJpdi0+cmZfY2hpcCApCkBAIC0yNTE2LDM2ICsyMjI3LDExIEBACiAgKgogICogTm90ZToJCVdlIGRvIG5vdCB0YWtlIGogbW9kZSBpbnRvIGNvbnNpZGVyYXRpb24gbm93CiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vL2V4dGVybiB2b2lkIFBIWV9TZXRCV01vZGU4MTkyUygJc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKLS8vCUhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLAkvLyAyME0gb3IgNDBNCi0vLwlIVF9FWFRDSE5MX09GRlNFVAlPZmZzZXQJCS8vIFVwcGVyLCBMb3dlciwgb3IgRG9uJ3QgY2FyZQogdm9pZCBydGw4MTkyX1NldEJXTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlIVF9DSEFOTkVMX1dJRFRIIHRtcEJXID0gcHJpdi0+Q3VycmVudENoYW5uZWxCVzsKIAotCi0JLy8gTW9kaWZpZWQgaXQgZm9yIDIwLzQwIG1oeiBzd2l0Y2ggYnkgZ3VhbmdhbiAwNzA1MzEKLQotCS8vcmV0dXJuOwotCi0JLy9pZihwcml2LT5Td0NobmxJblByb2dyZXNzKQotLy8JaWYocE1nbnRJbmZvLT5iU2NhbkluUHJvZ3Jlc3MpCi0vLwl7Ci0vLwkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfTE9VRCwgKCJTZXRCV01vZGU4MTkwUGNpKCkgJXMgRXhpdCBiZWNhdXNlIGJTY2FuSW5Qcm9ncmVzcyFcbiIsCi0vLwkJCQkJQmFuZHdpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfMjA/IjIwTUh6IjoiNDBNSHoiKSk7Ci0vLwkJcmV0dXJuOwotLy8JfQotCi0vLwlpZihwcml2LT5TZXRCV01vZGVJblByb2dyZXNzKQotLy8JewotLy8JCS8vIE1vZGlmaWVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIGJ5IGd1YW5nYW4gMDcwNTMxCi0vLwkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfTE9VRCwgKCJTZXRCV01vZGU4MTkwUGNpKCkgJXMgY2FuY2VsIGxhc3QgdGltZXIgYmVjYXVzZSBTZXRCV01vZGVJblByb2dyZXNzIVxuIiwKLS8vCQkJCQlCYW5kd2lkdGggPT0gSFRfQ0hBTk5FTF9XSURUSF8yMD8iMjBNSHoiOiI0ME1IeiIpKTsKLS8vCQlQbGF0Zm9ybUNhbmNlbFRpbWVyKGRldiwgJnByaXYtPlNldEJXTW9kZVRpbWVyKTsKLS8vCQkvL3JldHVybjsKLS8vCX0KLQogCWlmKHByaXYtPlNldEJXTW9kZUluUHJvZ3Jlc3MpCiAJCXJldHVybjsKIApAQCAtMjU2MCw3ICsyMjQ2LDcgQEAKIAllbHNlCiAJCXByaXYtPm5DdXI0ME1oelByaW1lU0MgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwogCi0JaWYoKHByaXYtPnVwKSApLy8gJiYgIShSVF9DQU5OT1RfSU8oQWRhcHRlcikgJiYgQWRhcHRlci0+YkluU2V0UG93ZXIpICkKKwlpZigocHJpdi0+dXApICkKIAl7CiAJU2V0QldNb2RlQ2FsbGJhY2s4MTkyU1VzYldvcmtJdGVtKGRldik7CiAJfQpAQCAtMjU3OCw3ICsyMjY0LDYgQEAKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIJCWRlbGF5OwotCS8vYm9vbAkJCXJldDsKIAogCVJUX1RSQUNFKENPTVBfQ0gsICI9PT5Td0NobmxDYWxsYmFjazgxOTBQY2koKSwgc3dpdGNoIHRvIGNoYW5uZWwgJWRcbiIsIHByaXYtPmNoYW4pOwogCkBAIC0yNTk1LDE2ICsyMjgwLDExIEBACiAJCWlmKCFwcml2LT5Td0NobmxJblByb2dyZXNzKQogCQkJYnJlYWs7CiAKLQkJLy9pZighcGh5X1N3Q2hubFN0ZXBCeVN0ZXAoZGV2LCBwcml2LT5DdXJyZW50Q2hhbm5lbCwgJnByaXYtPlN3Q2hubFN0YWdlLCAmcHJpdi0+U3dDaG5sU3RlcCwgJmRlbGF5KSkKIAkJaWYoIXBoeV9Td0NobmxTdGVwQnlTdGVwKGRldiwgcHJpdi0+Y2hhbiwgJnByaXYtPlN3Q2hubFN0YWdlLCAmcHJpdi0+U3dDaG5sU3RlcCwgJmRlbGF5KSkKIAkJewogCQkJaWYoZGVsYXk+MCkKIAkJCXsKIAkJCQltZGVsYXkoZGVsYXkpOwotCQkJCS8vUGxhdGZvcm1TZXRUaW1lcihkZXYsICZwcml2LT5Td0NobmxUaW1lciwgZGVsYXkpOwotCQkJCS8vbW9kX3RpbWVyKCZwcml2LT5Td0NobmxUaW1lciwgIGppZmZpZXMgKyBNU0VDUyhkZWxheSkpOwotCQkJCS8vPT0+UEhZX1N3Q2hubENhbGxiYWNrODE5MlMoZGV2KTsgZm9yIDkyc2UKLQkJCQkvLz09PlN3Q2hubENhbGxiYWNrODE5MlNVc2IoZGV2KSBmb3IgOTJzdQogCQkJfQogCQkJZWxzZQogCQkJY29udGludWU7CkBAIC0yNjE4LDEyICsyMjk4LDkgQEAKIH0KIAogLy8gQ2FsbCBhZnRlciBpbml0aWFsaXphdGlvbgotLy9leHRlcm4gdm9pZCBQSFlfU3dDaG5sODE5MlMoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwJdTggY2hhbm5lbCkKIHU4IHJ0bDgxOTJfcGh5X1N3Q2hubChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBjaGFubmVsKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQkvL3U4IAkJCXRtcGNoYW5uZWwgPWNoYW5uZWw7Ci0JLy9ib29sCQkJYlJlc3VsdCA9IGZhbHNlOwogCiAgICAgICAgIGlmKCFwcml2LT51cCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMjYzNCw3ICsyMzExLDYgQEAKIAlpZihwcml2LT5TZXRCV01vZGVJblByb2dyZXNzKQogCQlyZXR1cm4gZmFsc2U7CiAKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+bW9kZSkKIAl7CiAJY2FzZSBXSVJFTEVTU19NT0RFX0E6CkBAIC0yNjYxLDEwICsyMzM3LDkgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQkJOy8vUlRfVFJBQ0UoQ09NUF9FUlIsICJJbnZhbGlkIFdpcmVsZXNzTW9kZSglI3gpISFcbiIsIHByaXYtPmllZWU4MDIxMS0+bW9kZSk7CisJCQk7CiAJCWJyZWFrOwogCX0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAlwcml2LT5Td0NobmxJblByb2dyZXNzID0gVFJVRTsKIAlpZiggY2hhbm5lbCA9PSAwKQpAQCAtMjY3NSw3ICsyMzUwLDcgQEAKIAlwcml2LT5Td0NobmxTdGFnZT0wOwogCXByaXYtPlN3Q2hubFN0ZXA9MDsKIAotCWlmKChwcml2LT51cCkpLy8gJiYgIShSVF9DQU5OT1RfSU8oQWRhcHRlcikgJiYgQWRhcHRlci0+YkluU2V0UG93ZXIpKQorCWlmKChwcml2LT51cCkpCiAJewogCVN3Q2hubENhbGxiYWNrODE5MlNVc2JXb3JrSXRlbShkZXYpOwogI2lmZGVmIFRPX0RPX0xJU1QKQEAgLTI2OTUsNyArMjM3MCw2IEBACiAJewogCQlSVF9UUkFDRShDT01QX1NDQU4sICJQSFlfU3dDaG5sODE5MlMgU3dDaG5sSW5Qcm9ncmVzcyBGQUxTRSBkcml2ZXIgc2xlZXAgb3IgdW5sb2FkXG4iKTsKIAkJcHJpdi0+U3dDaG5sSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkvL3ByaXYtPkN1cnJlbnRDaGFubmVsID0gdG1wY2hhbm5lbDsKIAl9CiAgICAgICAgIHJldHVybiB0cnVlOwogfQpAQCAtMjcwOSw4ICsyMzgzLDcgQEAKIC8vIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIG9wZXJ0ZWQgYWNjb3JkaW5nIHRvIFN3Q2hhbmxDYWxsYmFjazgxOTBQY2koKS4KIC8vIEhvd2V2ZXIsIHRoaXMgcHJvY2VkdXJlIGlzIHBlcmZvcm1lZCBzeW5jaHJvbm91c2x5ICB3aGljaCBzaG91bGQgYmUgcnVubmluZyB1bmRlcgogLy8gcGFzc2l2ZSBsZXZlbC4KLS8vCi0vL25vdCB1bmRlcnN0YW5kIGl0CisKIHZvaWQgUEhZX1N3Q2hubFBoeTgxOTJTKAkvLyBPbmx5IGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6ZQogCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCiAJdTgJCWNoYW5uZWwKQEAgLTI3NjcsMTQgKzI0NDAsMTAgQEAKIAogCWlmKENtZFRhYmxlID09IE5VTEwpCiAJewotCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJwaHlfU2V0U3dDaG5sQ21kQXJyYXkoKTogQ21kVGFibGUgY2Fubm90IGJlIE5VTEwuXG4iKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAJaWYoQ21kVGFibGVJZHggPj0gQ21kVGFibGVTeikKIAl7Ci0JCS8vUlRfQVNTRVJUKEZBTFNFLAotCQkJLy8JKCJwaHlfU2V0U3dDaG5sQ21kQXJyYXkoKTogQWNjZXNzIGludmFsaWQgaW5kZXgsIHBsZWFzZSBjaGVjayBzaXplIG9mIHRoZSB0YWJsZSwgQ21kVGFibGVJZHg6JWQsIENtZFRhYmxlU3o6JWRcbiIsCi0JCQkJLy9DbWRUYWJsZUlkeCwgQ21kVGFibGVTeikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCkBAIC0yNzk4LDcgKzI0NjcsNiBAQAogCSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JLy9QQ0hBTk5FTF9BQ0NFU1NfU0VUVElORwlwQ2hubEFjY2Vzc1NldHRpbmc7CiAJU3dDaG5sQ21kCQkJCVByZUNvbW1vbkNtZFtNQVhfUFJFQ01EX0NOVF07CiAJdTMyCQkJCQlQcmVDb21tb25DbWRDbnQ7CiAJU3dDaG5sQ21kCQkJCVBvc3RDb21tb25DbWRbTUFYX1BPU1RDTURfQ05UXTsKQEAgLTI4MDgsMjIgKzI0NzYsMTMgQEAKIAlTd0NobmxDbWQJCQkJKkN1cnJlbnRDbWQgPSBOVUxMOwogCXU4CQkJCQllUkZQYXRoOwogCi0JLy9SVF9BU1NFUlQoKGRldiAhPSBOVUxMKSwgKCJBZGFwdGVyIHNob3VsZCBub3QgYmUgTlVMTFxuIikpOwotCS8vUlRfQVNTRVJUKElzTGVnYWxDaGFubmVsKGRldiwgY2hhbm5lbCksICgiaWxsZWdhbCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbCkpOwogCVJUX1RSQUNFKENPTVBfQ0gsICI9PT09PT09PT09PT4lcygpLCBjaGFubmVsOiVkLCBzdGFnZTolZCwgc3RlcDolZFxuIiwgX19GVU5DVElPTl9fLCBjaGFubmVsLCAqc3RhZ2UsICpzdGVwKTsKLQkvL1JUX0FTU0VSVCgocEhhbERhdGEgIT0gTlVMTCksICgicEhhbERhdGEgc2hvdWxkIG5vdCBiZSBOVUxMXG4iKSk7CiAJaWYgKCFJc0xlZ2FsQ2hhbm5lbChwcml2LT5pZWVlODAyMTEsIGNoYW5uZWwpKQogCXsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PT09PT09PT09PnNldCB0byBpbGxlZ2FsIGNoYW5uZWw6JWRcbiIsIGNoYW5uZWwpOwogCQlyZXR1cm4gdHJ1ZTsgLy9yZXR1cm4gdHJ1ZSB0byB0ZWxsIHVwcGVyIGNhbGxlciBmdW5jdGlvbiB0aGlzIGNoYW5uZWwgc2V0dGluZyBpcyBmaW5pc2hlZCEgT3IgaXQgd2lsbCBpbiB3aGlsZSBsb29wLgogCX0KIAotCS8vcENobmxBY2Nlc3NTZXR0aW5nID0gJkFkYXB0ZXItPk1nbnRJbmZvLkluZm84MTg1LkNoYW5uZWxBY2Nlc3NTZXR0aW5nOwotCS8vUlRfQVNTRVJUKChwQ2hubEFjY2Vzc1NldHRpbmcgIT0gTlVMTCksICgicENobmxBY2Nlc3NTZXR0aW5nIHNob3VsZCBub3QgYmUgTlVMTFxuIikpOwotCi0JLy9mb3IoZVJGUGF0aCA9IFJGOTBfUEFUSF9BOyBlUkZQYXRoIDxwcml2LT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKQotCS8vZm9yKGVSRlBhdGggPSAwOyBlUkZQYXRoIDxwcml2LT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKQotCS8vewogCQkvLyA8MT4gRmlsbCB1cCBwcmUgY29tbW9uIGNvbW1hbmQuCiAJUHJlQ29tbW9uQ21kQ250ID0gMDsKIAlwaHlfU2V0U3dDaG5sQ21kQXJyYXkoUHJlQ29tbW9uQ21kLCBQcmVDb21tb25DbWRDbnQrKywgTUFYX1BSRUNNRF9DTlQsCkBAIC0yODQ0LDggKzI1MDMsNyBAQAogCQljYXNlIFJGXzgyMjU6CiAJCWlmIChjaGFubmVsIDwgMSB8fCBjaGFubmVsID4gMTQpCiAJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgemVicmE6JWRcbiIsIGNoYW5uZWwpOwotCQkvL1JUX0FTU0VSVCgoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpLCAoImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmE6ICVkXG4iLCBjaGFubmVsKSk7Ci0JCS8vIDIwMDgvMDkvMDQgTUggQ2hhbmdlIGNoYW5uZWwuCisKIAkJcGh5X1NldFN3Q2hubENtZEFycmF5KFJmRGVwZW5kQ21kLCBSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULAogCQkJQ21kSURfUkZfV3JpdGVSZWcsIHJSZkNoYW5uZWwsIGNoYW5uZWwsIDEwKTsKIAkJcGh5X1NldFN3Q2hubENtZEFycmF5KFJmRGVwZW5kQ21kLCBSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULApAQCAtMjg1NSw4ICsyNTEzLDYgQEAKIAljYXNlIFJGXzgyNTY6CiAJCWlmIChjaGFubmVsIDwgMSB8fCBjaGFubmVsID4gMTQpCiAJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgemVicmE6JWRcbiIsIGNoYW5uZWwpOwotCQkvLyBURVNUISEgVGhpcyBpcyBub3QgdGhlIHRhYmxlIGZvciA4MjU2ISEKLQkJLy9SVF9BU1NFUlQoKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSwgKCJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhOiAlZFxuIiwgY2hhbm5lbCkpOwogCQlwaHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCiAJCQlDbWRJRF9SRl9Xcml0ZVJlZywgclJmQ2hhbm5lbCwgY2hhbm5lbCwgMTApOwogCQlwaHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCkBAIC0yODc2LDcgKzI1MzIsNiBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCS8vUlRfQVNTRVJUKEZBTFNFLCAoIlVua25vd24gcmZfY2hpcDogJWRcbiIsIHByaXYtPnJmX2NoaXApKTsKIAkJcmV0dXJuIEZBTFNFOwogCQlicmVhazsKIAl9CkBAIC0yOTEzLDcgKzI1NjgsNiBAQAogCQlzd2l0Y2goQ3VycmVudENtZC0+Q21kSUQpCiAJCXsKIAkJY2FzZSBDbWRJRF9TZXRUeFBvd2VyTGV2ZWw6Ci0JCQkvL2lmKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID4gVkVSU0lPTl84MTkwX0JEKQogCQkJCVBIWV9TZXRUeFBvd2VyTGV2ZWw4MTkyUyhkZXYsY2hhbm5lbCk7CiAJCQlicmVhazsKIAkJY2FzZSBDbWRJRF9Xcml0ZVBvcnRVbG9uZzoKQEAgLTI5MzAsNyArMjU4NCw2IEBACiAJCQl7CiAJCQkvLyBGb3IgbmV3IFQ2NSBSRiAwMjIyZCByZWdpc3RlciAweDE4IGJpdCAwLTkgPSBjaGFubmVsIG51bWJlci4KIAkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBDdXJyZW50Q21kLT5QYXJhMSwgMHgxZiwgKEN1cnJlbnRDbWQtPlBhcmEyKSk7Ci0JCQkJLy9wcmludGsoIj09PT0+JXgsICV4LCByZWFkX2JhY2s6JXhcbiIsIEN1cnJlbnRDbWQtPlBhcmEyLEN1cnJlbnRDbWQtPlBhcmExLCBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIEN1cnJlbnRDbWQtPlBhcmExLCAweDFmKSk7CiAJCQl9CiAJCQlicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMjkzOSw3ICsyNTkyLDYgQEAKIAogCQlicmVhazsKIAl9d2hpbGUoVFJVRSk7Ci0JLy9jb3NhIH0vKmZvcihOdW1iZXIgb2YgUkYgcGF0aHMpKi8KIAogCSgqZGVsYXkpPUN1cnJlbnRDbWQtPm1zRGVsYXk7CiAJKCpzdGVwKSsrOwpAQCAtMjk4NSwxNCArMjYzNyw4IEBACiAgKgkxMS8xNS8yMDA3CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gLy9jYWxsZWQgYnkgcnRsODE5Ml9waHlfUXVlcnlSRlJlZywgcnRsODE5Ml9waHlfU2V0UkZSZWcsIFBIWV9TZXRSRlBvd2VyU3RhdGU4MTkyU1VzYgotLy9leHRlcm4JYm9vbAotLy9QSFlfQ2hlY2tJc0xlZ2FsUmZQYXRoODE5MlMoCi0vLwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAotLy8JdTMyCWVSRlBhdGgpCiB1OCBydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTMyIGVSRlBhdGgpCiB7Ci0vLwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJYm9vbAkJCQlydFZhbHVlID0gVFJVRTsKIAogCS8vIE5PdCBjaGVjayBSRiBQYXRoIG5vdy4hCkBAIC0zMDIzLDcgKzI2NjksNiBAQAogdm9pZAogUEhZX0lRQ2FsaWJyYXRlKAlzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewotCS8vc3RydWN0IHI4MTkyX3ByaXYgCSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MzIJCQkJaSwgcmVnOwogCXUzMgkJCQlvbGRfdmFsdWU7CiAJbG9uZwkJCQlYLCBZLCBUWDBbNF07CkBAIC0zMDM5LDcgKzI2ODQsNiBAQAogCXsKIAkJLy8gSVFLCiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCAweGMwNCwgYk1hc2tEV29yZCwgMHgwMGEwNTQzMCk7Ci0JCS8vUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbig1KTsKIAkJdWRlbGF5KDUpOwogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgMHhjMDgsIGJNYXNrRFdvcmQsIDB4MDAwODAwZTQpOwogCQl1ZGVsYXkoNSk7CkBAIC0zMTY5LDggKzI4MTMsNiBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZXh0ZXJuIHZvaWQgUEhZX0lRQ2FsaWJyYXRlQmN1dChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewotCS8vc3RydWN0IHI4MTkyX3ByaXYgCSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQkvL1BNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwQWRhcHRlci0+TWdudEluZm87CiAJdTMyCQkJCWksIHJlZzsKIAl1MzIJCQkJb2xkX3ZhbHVlOwogCWxvbmcJCQkJWCwgWSwgVFgwWzRdOwpAQCAtMzE4NCwyMSArMjgyNiw2IEBACiAJLy8KIAkvLyAxLiBTYXZlIGU3MH5lZTAgcmVnaXN0ZXIgc2V0dGluZywgYW5kIGxvYWQgY2FsaWJyYXRpb24gc2V0dGluZwogCS8vCi0JLyoKLQkweGVlMFszMTowXT0weDNmZWQ5MmZiOwotCTB4ZWRjWzMxOjBdID0weDNmZWQ5MmZiOwotCTB4ZTcwWzMxOjBdID0weDNmZWQ5MmZiOwotCTB4ZTc0WzMxOjBdID0weDNmZWQ5MmZiOwotCTB4ZTc4WzMxOjBdID0weDNmZWQ5MmZiOwotCTB4ZTdjWzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZTgwWzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZTg0WzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZTg4WzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZThjWzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZWQwWzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZWQ0WzMxOjBdPSAweDNmZWQ5MmZiOwotCTB4ZWQ4WzMxOjBdPSAweDNmZWQ5MmZiOwotCSovCiAJY2FsaWJyYXRlX3NldCBbMF0gPSAweGVlMDsKIAljYWxpYnJhdGVfc2V0IFsxXSA9IDB4ZWRjOwogCWNhbGlicmF0ZV9zZXQgWzJdID0gMHhlNzA7CkBAIC0zMjEyLDcgKzI4MzksNiBAQAogCWNhbGlicmF0ZV9zZXQgWzEwXSA9IDB4ZWQwOwogCWNhbGlicmF0ZV9zZXQgWzExXSA9IDB4ZWQ0OwogCWNhbGlicmF0ZV9zZXQgWzEyXSA9IDB4ZWQ4OwotCS8vUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwgKCJTYXZlIGU3MH5lZTAgcmVnaXN0ZXIgc2V0dGluZ1xuIikpOwogCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQogCXsKIAkJbG9hZF92YWx1ZVtpXSA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIGNhbGlicmF0ZV9zZXRbaV0sIGJNYXNrRFdvcmQpOwpAQCAtMzIzMiw3ICsyODU4LDYgQEAKIAkJLy9CQiBzd2l0Y2ggdG8gUEkgbW9kZS4gSWYgZGVmYXVsdCBpcyBQSSBtb2RlLCBpZ25vcmluZyAyIGNvbW1hbmRzIGJlbG93LgogCQlpZiAoIVJmUGlFbmFibGUpCS8vaWYgb3JpZ2luYWwgaXMgU0kgbW9kZSwgdGhlbiBzd2l0Y2ggdG8gUEkgbW9kZS4KIAkJewotCQkJLy9EYmdQcmludCgiSVFLIFN3aXRjaCB0byBQSSBtb2RlXG4iKTsKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCAweDgyMCwgYk1hc2tEV29yZCwgMHgwMTAwMDEwMCk7CiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgMHg4MjgsIGJNYXNrRFdvcmQsIDB4MDEwMDAxMDApOwogCQl9CkBAIC0zMjg2LDcgKzI5MTEsNiBAQAogCiAJCWlmICghUmZQaUVuYWJsZSkJLy9pZiBvcmlnaW5hbCBpcyBTSSBtb2RlLCB0aGVuIHN3aXRjaCB0byBQSSBtb2RlLgogCQl7Ci0JCQkvL0RiZ1ByaW50KCJJUUsgU3dpdGNoIGJhY2sgdG8gU0kgbW9kZVxuIik7CiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgMHg4MjAsIGJNYXNrRFdvcmQsIDB4MDEwMDAwMDApOwogCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIDB4ODI4LCBiTWFza0RXb3JkLCAweDAxMDAwMDAwKTsKIAkJfQpAQCAtMzM2OSw3ICsyOTkzLDYgQEAKIAkvLwogCS8vIDQuIFJlbG9hZCBlNzB+ZWUwIHJlZ2lzdGVyIHNldHRpbmcuCiAJLy8KLQkvL1JUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiUmVsb2FkIGU3MH5lZTAgcmVnaXN0ZXIgc2V0dGluZy5cbiIpKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIGNhbGlicmF0ZV9zZXRbaV0sIGJNYXNrRFdvcmQsIGxvYWRfdmFsdWVbaV0pOwogCkBAIC0zMzgwLDE0ICszMDAzLDEyIEBACiAKIAogCi19CS8vIFBIWV9JUUNhbGlicmF0ZUJjdXQKK30KIAogCiAvLwogLy8gTW92ZSBmcm9tIHBoeWNmZy5jIHRvIGdlbi5jIHRvIGJlIGNvZGUgaW5kZXBlbmRlbnQgbGF0ZXIKIC8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb3ZlIHRvIG90aGVyIERJUiBsYXRlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy8jaWYgKERFVl9CVVNfVFlQRSA9PSBVU0JfSU5URVJGQUNFKQogCiAvLyAgICB1c2UgaW4gcGh5IG9ubHkgKGluIHdpbiBpdCdzIHRpbWVyKQogdm9pZCBTd0NobmxDYWxsYmFjazgxOTJTVXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0zMzk1LDcgKzMwMTYsNiBAQAogCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMgkJCWRlbGF5OwotLy8JYm9vbAkJCXJldDsKIAogCVJUX1RSQUNFKENPTVBfU0NBTiwgIj09PlN3Q2hubENhbGxiYWNrODE5MFBjaSgpLCBzd2l0Y2ggdG8gY2hhbm5lbCAlZFxuIiwKIAkJIHByaXYtPmNoYW4pOwpAQCAtMzQxOCw3ICszMDM4LDYgQEAKIAkJewogCQkJaWYoZGVsYXk+MCkKIAkJCXsKLQkJCQkvL1BsYXRmb3JtU2V0VGltZXIoZGV2LCAmcHJpdi0+U3dDaG5sVGltZXIsIGRlbGF5KTsKIAogCQkJfQogCQkJZWxzZQpAQCAtMzQ3MywxNiArMzA5MiwxMiBAQAogICoJCQkoMikgV2lsbCB0d28gd29ya2l0ZW0gb2YgInN3aXRjaCBjaGFubmVsIiBhbmQgInN3aXRjaCBjaGFubmVsIGJhbmR3aWR0aCIgcnVuCiAgKgkJCSAgICAgY29uY3VycmVudGx5PwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy89PT09Pi8vcnRsODE5Ml9TZXRCV01vZGUKLS8vICAgIHVzZSBpbiBwaHkgb25seSAoaW4gd2luIGl0J3MgdGltZXIpCisvLyAgICB1c2UgaW4gcGh5IG9ubHkKIHZvaWQgU2V0QldNb2RlQ2FsbGJhY2s4MTkyU1VzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OAkgCQkJcmVnQndPcE1vZGU7CiAKLQkvLyBBZGRlZCBpdCBmb3IgMjAvNDAgbWh6IHN3aXRjaCB0aW1lIGV2YWx1YXRpb24gYnkgZ3VhbmdhbiAwNzA1MzEKLQkvL3UzMgkJCQlOb3dMLCBOb3dIOwotCS8vdThCeXRlCQkJCUJlZ2luVGltZSwgRW5kVGltZTsKIAl1OAkJCQlyZWdSUlNSX1JTQzsKIAogCVJUX1RSQUNFKENPTVBfU0NBTiwgIj09PlNldEJXTW9kZUNhbGxiYWNrODE5MFBjaSgpICBTd2l0Y2ggdG8gJXMgYmFuZHdpZHRoXG4iLCBcCkBAIC0zNDk3LDEwICszMTEyLDYgQEAKIAlpZighcHJpdi0+dXApCiAJCXJldHVybjsKIAotCS8vIEFkZGVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIHRpbWUgZXZhbHVhdGlvbiBieSBndWFuZ2FuIDA3MDUzMQotCS8vTm93TCA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGUik7Ci0JLy9Ob3dIID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZSKzQpOwotCS8vQmVnaW5UaW1lID0gKCh1OEJ5dGUpTm93SCA8PCAzMikgKyBOb3dMOwogCiAJLy8zPDE+U2V0IE1BQyByZWdpc3RlcgogCXJlZ0J3T3BNb2RlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSk7CkBAIC0zNTEwLDEzICszMTIxLDExIEBACiAJewogCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CiAJCQlyZWdCd09wTW9kZSB8PSBCV19PUE1PREVfMjBNSFo7Ci0JCSAgICAgICAvLyAyMDA3LzAyLzA3IE1hcmsgYnkgRW1pbHkgYmVjYXN1ZSB3ZSBoYXZlIG5vdCB2ZXJpZnkgd2hldGhlciB0aGlzIHJlZ2lzdGVyIHdvcmtzCiAJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgogCQkJcmVnQndPcE1vZGUgJj0gfkJXX09QTU9ERV8yME1IWjsKLSAgICAgICAgCQkvLyAyMDA3LzAyLzA3IE1hcmsgYnkgRW1pbHkgYmVjYXN1ZSB3ZSBoYXZlIG5vdCB2ZXJpZnkgd2hldGhlciB0aGlzIHJlZ2lzdGVyIHdvcmtzCiAJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOwogCiAJCQlyZWdSUlNSX1JTQyA9IChyZWdSUlNSX1JTQyYweDkwKSB8KHByaXYtPm5DdXI0ME1oelByaW1lU0M8PDUpOwpAQCAtMzU0NiwxMiArMzE1NSw2IEBACiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsIChwcml2LT5uQ3VyNDBNaHpQcmltZVNDPj4xKSk7CiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX0xTVEYsIDB4QzAwLCBwcml2LT5uQ3VyNDBNaHpQcmltZVNDKTsKIAotCQkJLy8gQ29ycmVjdCB0aGUgdHggcG93ZXIgZm9yIENDSyByYXRlIGluIDQwTS4gU3VnZ2VzdCBieSBZTiwgMjAwNzEyMDcKLQkJCS8vUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tEV29yZCwgMHgzNTM2MDAwMCk7Ci0JCQkvL1BIWV9TZXRCQlJlZyhBZGFwdGVyLCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIDB4MTIxYzI1MmUpOwotCQkJLy9QSFlfU2V0QkJSZWcoQWRhcHRlciwgckNDSzBfRGVidWdQb3J0LCBiTWFza0RXb3JkLCAweDAwMDAwNDA5KTsKLQkJCS8vUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCBiQURDbGtQaGFzZSwgMCk7Ci0KIAkJCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA+PSBWRVJTSU9OXzgxOTJTX0JDVVQpCiAJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIyLCAweGZmLCAweDE4KTsKIApAQCAtMzU2NCwxMiArMzE2Nyw2IEBACiAJfQogCS8vU2tpcCBvdmVyIHNldHRpbmcgb2YgSi1tb2RlIGluIEJCIHJlZ2lzdGVyIGhlcmUuIERlZmF1bHQgdmFsdWUgaXMgIk5vbmUgSiBtb2RlIi4gRW1pbHkgMjAwNzAzMTUKIAotCS8vIEFkZGVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIHRpbWUgZXZhbHVhdGlvbiBieSBndWFuZ2FuIDA3MDUzMQotCS8vTm93TCA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGUik7Ci0JLy9Ob3dIID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZSKzQpOwotCS8vRW5kVGltZSA9ICgodThCeXRlKU5vd0ggPDwgMzIpICsgTm93TDsKLQkvL1JUX1RSQUNFKENPTVBfU0NBTiwgREJHX0xPVUQsICgiU2V0QldNb2RlQ2FsbGJhY2s4MTkwUGNpOiB0aW1lIG9mIFNldEJXTW9kZSA9ICVJNjRkIHVzIVxuIiwgKEVuZFRpbWUgLSBCZWdpblRpbWUpKSk7Ci0KICNpZiAxCiAJLy8zPDM+U2V0IFJGIHJlbGF0ZWQgcmVnaXN0ZXIKIAlzd2l0Y2goIHByaXYtPnJmX2NoaXAgKQpAQCAtMzU5Nyw3ICszMTk0LDYgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJVbmtub3duIHJmX2NoaXA6ICVkXG4iLCBwcml2LT5yZl9jaGlwKSk7CiAJCQlicmVhazsKIAl9CiAjZW5kaWYKQEAgLTM3MDUsNyArMzMwMSw2IEBACiAJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcz0gRkFMU0U7CiB9CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb3ZlIHRvIG90ZXIgRElSIGxhdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkIEluaXRpYWxHYWluODE5MlMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJdTggT3BlcmF0aW9uKQogewogI2lmZGVmIFRPX0RPX0xJU1QKQEAgLTM4MTIsNyArMzQwNyw2IEBACiAKIAl1MTYJRndDbWRXYWl0TGltaXQgPSAxMDAwOwogCi0JLy9pZihJU19IQVJEV0FSRV9UWVBFXzgxOTJTVShBZGFwdGVyKSAmJiBBZGFwdGVyLT5iSW5IY3RUZXN0KQogCWlmKHByaXYtPmJJbkhjdFRlc3QpCiAJCXJldHVybiB0cnVlOwogCkBAIC0zODI4LDExICszNDIyLDYgQEAKICNpZiAxCiAJd2hpbGUocHJpdi0+U2V0RndDbWRJblByb2dyZXNzICYmIEZ3Q21kV2FpdENvdW50ZXI8RndDbWRXYWl0TGltaXQpCiAJewotCQkvL2lmKFJUX1VTQl9DQU5OT1RfSU8oQWRhcHRlcikpCi0JCS8vewotCQkvLwlSVF9UUkFDRShDT01QX0NNRCwgREJHX1dBUk5JTkcsICgiSGFsU2V0RndDbWQ4MTkyUygpOiBVU0IgY2FuIE5PVCBJTyEhXG4iKSk7Ci0JCS8vCXJldHVybiBGQUxTRTsKLQkJLy99CiAKIAkJUlRfVFJBQ0UoQ09NUF9DTUQsICJIYWxTZXRGd0NtZDgxOTJTKCk6IHByZXZpb3VzIHdvcmtpdGVtIG5vdCBmaW5pc2ghIVxuIik7CiAJCXJldHVybiBmYWxzZTsKQEAgLTM4NDMsOSArMzQzMiw3IEBACiAKIAlpZihGd0NtZFdhaXRDb3VudGVyID09IEZ3Q21kV2FpdExpbWl0KQogCXsKLQkJLy9SVF9BU1NFUlQoRkFMU0UsICgiU2V0RndDbWRJT1dvcmtJdGVtQ2FsbGJhY2soKTogV2FpdCB0b28gbG9nbiB0byBzZXQgRlcgQ01EXG4iKSk7CiAJCVJUX1RSQUNFKENPTVBfQ01ELCAiSGFsU2V0RndDbWQ4MTkyUygpOiBXYWl0IHRvbyBsb2duIHRvIHNldCBGVyBDTURcbiIpOwotCQkvL3JldHVybiBmYWxzZTsKIAl9CiAjZW5kaWYKIAlpZiAocHJpdi0+U2V0RndDbWRJblByb2dyZXNzKQpAQCAtMzg5OCwxMCArMzQ4NSwxMCBAQAogLy8KIHZvaWQgcGh5X1NldEZ3Q21kSU9DYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQogewotCS8vc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSopIGRhdGE7Ci0JdTMyIAkgCWlucHV0OwotCXN0YXRpYyB1MzIgU2NhblJlZ2lzdGVyOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBwcml2LT5pZWVlODAyMTEtPnBIVEluZm87CisJcnRfZmlybXdhcmUJCSpwRmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJdTMyCWlucHV0LCBDdXJyZW50QUlEID0gMDs7CiAJaWYoIXByaXYtPnVwKQogCXsKIAkJUlRfVFJBQ0UoQ09NUF9DTUQsICJTZXRGd0NtZElPVGltZXJDYWxsYmFjaygpOiBkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iKTsKQEAgLTM5MTAsNjEgKzM0OTcsMjIgQEAKIAogCVJUX1RSQUNFKENPTVBfQ01ELCAiLS0tPlNldEZ3Q21kSU9UaW1lckNhbGxiYWNrKCk6IENtZCglI3gpLCBTZXRGd0NtZEluUHJvZ3Jlc3MoJWQpXG4iLCBwcml2LT5DdXJyZW50RndDbWRJTywgcHJpdi0+U2V0RndDbWRJblByb2dyZXNzKTsKIAorCWlmKHBGaXJtd2FyZS0+RmlybXdhcmVWZXJzaW9uID49IDB4MzQpCisJeworCQlzd2l0Y2gocHJpdi0+Q3VycmVudEZ3Q21kSU8pCisJCXsKKwkJCWNhc2UgRldfQ01EX1JBX1JFRlJFU0hfTjoKKwkJCQlwcml2LT5DdXJyZW50RndDbWRJTyA9IEZXX0NNRF9SQV9SRUZSRVNIX05fQ09NQjsKKwkJCWJyZWFrOworCQkJY2FzZSBGV19DTURfUkFfUkVGUkVTSF9CRzoKKwkJCQlwcml2LT5DdXJyZW50RndDbWRJTyA9IEZXX0NNRF9SQV9SRUZSRVNIX0JHX0NPTUI7CisJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KIAlzd2l0Y2gocHJpdi0+Q3VycmVudEZ3Q21kSU8pCiAJewotCQljYXNlIEZXX0NNRF9ISUdIX1BXUl9FTkFCTEU6Ci0JCQlpZigocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0RJU0FCTEVfSElHSF9QT1dFUik9PTApCi0JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZNNSwgRldfSElHSF9QV1JfRU5BQkxFKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRldfQ01EX0hJR0hfUFdSX0RJU0FCTEU6Ci0JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19ISUdIX1BXUl9ESVNBQkxFKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRldfQ01EX0RJR19SRVNVTUU6Ci0JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19ESUdfUkVTVU1FKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRldfQ01EX0RJR19IQUxUOgotCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZNNSwgRldfRElHX0hBTFQpOwotCQkJYnJlYWs7Ci0KLQkJLy8KLQkJLy8gPFJvZ2VyX05vdGVzPiBUaGUgZm9sbG93aW5nIEZXIENNRCBJTyB3YXMgY29tYmluZWQgaW50byBzaW5nbGUgb3BlcmF0aW9uCi0JCS8vIChpLmUuLCB0byBwcmV2ZW50IG51bWJlciBvZiBzeXN0ZW0gd29ya2l0ZW0gb3V0IG9mIHJlc291cmNlISEpLgotCQkvLyAyMDA4LjEyLjA0LgotCQkvLwotCQljYXNlIEZXX0NNRF9SRVNVTUVfRE1fQllfU0NBTjoKLQkJCVJUX1RSQUNFKENPTVBfQ01ELCAiW0ZXIENNRF0gU2V0IEhJR0hQV1IgZW5hYmxlIGFuZCBESUcgcmVzdW1lISFcbiIpOwotCQkJaWYoKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX0hJR0hfUE9XRVIpPT0wKQotCQkJewotCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGTTUsIEZXX0hJR0hfUFdSX0VOQUJMRSk7IC8vYnJlYWs7Ci0JCQkJQ2hrRndDbWRJb0RvbmUoZGV2KTsKLQkJCX0KLQkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGTTUsIEZXX0RJR19SRVNVTUUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGV19DTURfUEFVU0VfRE1fQllfU0NBTjoKLQkJCVJUX1RSQUNFKENPTVBfQ01ELCAiW0ZXIENNRF0gU2V0IEhJR0hQV1IgZGlzYWJsZSBhbmQgRElHIGhhbHQhIVxuIik7Ci0JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19ISUdIX1BXUl9ESVNBQkxFKTsgLy9icmVhazsKLQkJCUNoa0Z3Q21kSW9Eb25lKGRldik7Ci0JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19ESUdfSEFMVCk7Ci0JCQlicmVhazsKLQotCQkvLwotCQkvLyA8Um9nZXJfTm90ZXM+IFRoZSBmb2xsb3dpbmcgRlcgQ01EIElPIHNob3VsZCBiZSBjaGVja2VkCi0JCS8vIChpLmUuLCB3b3JraXRlbSBzY2hlZHVsZSB0aW1pbmcgaXNzdWUhISkuCi0JCS8vIDIwMDguMTIuMDQuCi0JCS8vCi0JCWNhc2UgRldfQ01EX0RJR19ESVNBQkxFOgotCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgRElHIGRpc2FibGUhIVxuIik7Ci0JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19ESUdfRElTQUJMRSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEZXX0NNRF9ESUdfRU5BQkxFOgotCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgRElHIGVuYWJsZSEhXG4iKTsKLQkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGTTUsIEZXX0RJR19FTkFCTEUpOwotCQkJYnJlYWs7CiAKIAkJY2FzZSBGV19DTURfUkFfUkVTRVQ6CiAJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19SQV9SRVNFVCk7CkBAIC0zOTc1LDgyICszNTIzLDExMSBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBGV19DTURfUkFfUkVGUkVTSF9OOgotCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgUkEgcmVmcmVzaCEhIE5cbiIpOwotCQkJaWYocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RSYUZ1bmMgJiBIVF9JT1RfUkFGVU5DX0RJU0FCTEVfQUxMKQorCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgUkEgbiByZWZyZXNoISFcbiIpOworCQkJaWYocEhUSW5mby0+SU9UUmFGdW5jICYgSFRfSU9UX1JBRlVOQ19ESVNBQkxFX0FMTCkKIAkJCQlpbnB1dCA9IEZXX1JBX1JFRlJFU0g7CiAJCQllbHNlCi0JCQkJaW5wdXQgPSBGV19SQV9SRUZSRVNIIHwgKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UUmFGdW5jIDw8IDgpOworCQkJCWlucHV0ID0gRldfUkFfUkVGUkVTSCB8IChwSFRJbmZvLT5JT1RSYUZ1bmMgPDwgOCk7CiAJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBpbnB1dCk7CisJCQlDaGtGd0NtZElvRG9uZShkZXYpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZNNSwgRldfUkFfRU5BQkxFX1JTU0lfTUFTSyk7CisJCQlDaGtGd0NtZElvRG9uZShkZXYpOwogCQkJYnJlYWs7CiAJCWNhc2UgRldfQ01EX1JBX1JFRlJFU0hfQkc6Ci0JCQlSVF9UUkFDRShDT01QX0NNRCwgIltGVyBDTURdIFNldCBSQSByZWZyZXNoISEgQi9HXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfQ01ELCAiW0ZXIENNRF0gU2V0IFJBIEJHIHJlZnJlc2ghIVxuIik7CiAJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19SQV9SRUZSRVNIKTsKIAkJCUNoa0Z3Q21kSW9Eb25lKGRldik7Ci0JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19SQV9FTkFCTEVfQkcpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZNNSwgRldfUkFfRElTQUJMRV9SU1NJX01BU0spOworCQkJQ2hrRndDbWRJb0RvbmUoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRldfQ01EX1JBX1JFRlJFU0hfTl9DT01COgorCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgUkEgbiBDb21ibyByZWZyZXNoISFcbiIpOworCQkJaWYocEhUSW5mby0+SU9UUmFGdW5jICYgSFRfSU9UX1JBRlVOQ19ESVNBQkxFX0FMTCkKKwkJCQlpbnB1dCA9IEZXX1JBX0lPVF9OX0NPTUI7CisJCQllbHNlCisJCQkJaW5wdXQgPSBGV19SQV9JT1RfTl9DT01CIHwgKCgocEhUSW5mby0+SU9UUmFGdW5jKSYweDBmKSA8PCA4KTsKKwkJCWlucHV0ID0gaW5wdXQgfCgocEhUSW5mby0+SU9UUGVlciAmIDB4ZikgPDwxMik7CisJCQlSVF9UUkFDRShDT01QX0NNRCwgIltGVyBDTURdIFNldCBSQS9JT1QgQ29tYiBpbiBuIG1vZGUhISBpbnB1dCglI3gpXG4iLCBpbnB1dCk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBpbnB1dCk7CisJCQlDaGtGd0NtZElvRG9uZShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGV19DTURfUkFfUkVGUkVTSF9CR19DT01COgorCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgUkEgQi9HIENvbWJvIHJlZnJlc2ghIVxuIik7CisJCQlpZihwSFRJbmZvLT5JT1RSYUZ1bmMgJiBIVF9JT1RfUkFGVU5DX0RJU0FCTEVfQUxMKQorCQkJCWlucHV0ID0gRldfUkFfSU9UX0JHX0NPTUI7CisJCQllbHNlCisJCQkJaW5wdXQgPSBGV19SQV9JT1RfQkdfQ09NQiB8ICgoKHBIVEluZm8tPklPVFJhRnVuYykmMHgwZikgPDwgOCk7CisJCQlpbnB1dCA9IGlucHV0IHwoKHBIVEluZm8tPklPVFBlZXIgJiAweGYpIDw8MTIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBTZXQgUkEvSU9UIENvbWIgaW4gQi9HIG1vZGUhISBpbnB1dCglI3gpXG4iLCBpbnB1dCk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBpbnB1dCk7CisJCQlDaGtGd0NtZElvRG9uZShkZXYpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGV19DTURfSVFLX0VOQUJMRToKIAkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGTTUsIEZXX0lRS19FTkFCTEUpOworCQkJQ2hrRndDbWRJb0RvbmUoZGV2KTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRldfQ01EX1RYUFdSX1RSQUNLX0VOQUJMRToKIAkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGTTUsIEZXX1RYUFdSX1RSQUNLX0VOQUJMRSk7CisJCQlDaGtGd0NtZElvRG9uZShkZXYpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBGV19DTURfVFhQV1JfVFJBQ0tfRElTQUJMRToKIAkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGTTUsIEZXX1RYUFdSX1RSQUNLX0RJU0FCTEUpOworCQkJQ2hrRndDbWRJb0RvbmUoZGV2KTsKIAkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlSVF9UUkFDRShDT01QX0NNRCwiVW5rbm93biBGVyBDbWQgSU8oJSN4KVxuIiwgcHJpdi0+Q3VycmVudEZ3Q21kSU8pOworCQljYXNlIEZXX0NNRF9QQVVTRV9ETV9CWV9TQ0FOOgorCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIltGVyBDTURdIFBhdXNlIERNIGJ5IFNjYW4hIVxuIik7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIGJNYXNrQnl0ZTAsIDB4MTcpOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiTWFza0J5dGUwLCAweDE3KTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9DQ0EsIGJNYXNrQnl0ZTIsIDB4NDApOwogCQkJYnJlYWs7Ci0JfQogCi0JQ2hrRndDbWRJb0RvbmUoZGV2KTsKLQotCXN3aXRjaChwcml2LT5DdXJyZW50RndDbWRJTykKLQl7CisJCWNhc2UgRldfQ01EX1JFU1VNRV9ETV9CWV9TQ0FOOgorCQkJUlRfVFJBQ0UoQ09NUF9DTUQsICJbRlcgQ01EXSBSZXN1bWUgRE0gYnkgU2NhbiEhXG4iKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9DQ0EsIGJNYXNrQnl0ZTIsIDB4ODMpOworCQkJUEhZX1NldFR4UG93ZXJMZXZlbDgxOTJTKGRldiwgcHJpdi0+Y2hhbik7CisJCQlicmVhazsKIAkJY2FzZSBGV19DTURfSElHSF9QV1JfRElTQUJMRToKLQkJCS8vaWYocE1nbnRJbmZvLT5iVHVyYm9TY2FuKQotCQkJewotCQkJCS8vTG93ZXIgaW5pdGlhbCBnYWluCi0JCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBiTWFza0J5dGUwLCAweDE3KTsKLQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGJNYXNrQnl0ZTAsIDB4MTcpOwotCQkJCS8vIENDQSB0aHJlc2hvbGQKLQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBiTWFza0J5dGUyLCAweDQwKTsKLQkJCQkvLyBEaXNhYmxlIE9GRE0gUGFydAotCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfVFJNdXhQYXIsIGJNYXNrQnl0ZTIsIDB4MSk7Ci0JCQkJU2NhblJlZ2lzdGVyID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLGJNYXNrRFdvcmQpOwotCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4ZiwgMHhmKTsKLQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX1RSeFBhdGhFbmFibGUsIDB4ZiwgMHgwKTsKLQkJCX0KKwkJCVJUX1RSQUNFKENPTVBfQ01ELCAiW0ZXIENNRF0gSGlnaCBQd3IgRGlzYWJsZSEhXG4iKTsKKwkJCWlmKHByaXYtPkRNRmxhZyAmIEhBTF9ETV9ISVBXUl9ESVNBQkxFKQorCQkJCWJyZWFrOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBiTWFza0J5dGUwLCAweDE3KTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgYk1hc2tCeXRlMCwgMHgxNyk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBiTWFza0J5dGUyLCAweDQwKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRldfQ01EX0hJR0hfUFdSX0VOQUJMRToKLQkJCS8vaWYocE1nbnRJbmZvLT5iVHVyYm9TY2FuKQotCQkJewotCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgYk1hc2tCeXRlMCwgMHgzNik7Ci0JCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiTWFza0J5dGUwLCAweDM2KTsKKwkJCVJUX1RSQUNFKENPTVBfQ01ELCAiW0ZXIENNRF0gSGlnaCBQd3IgRW5hYmxlISFcbiIpOworCQkJaWYocHJpdi0+RE1GbGFnICYgSEFMX0RNX0hJUFdSX0RJU0FCTEUpCisJCQkJYnJlYWs7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBiTWFza0J5dGUyLCAweDgzKTsKKwkJCWJyZWFrOwogCi0JCQkJLy8gQ0NBIHRocmVzaG9sZAotCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9DQ0EsIGJNYXNrQnl0ZTIsIDB4ODMpOwotCQkJCS8vIEVuYWJsZSBPRkRNIFBhcnQKLQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1RSTXV4UGFyLCBiTWFza0J5dGUyLCAweDApOworCQljYXNlIEZXX0NNRF9MUFNfRU5URVI6CisJCQlSVF9UUkFDRShDT01QX0NNRCwgIltGVyBDTURdIEVudGVyIExQUyBtb2RlISFcbiIpOworCQkJQ3VycmVudEFJRCA9IHByaXYtPmllZWU4MDIxMS0+YXNzb2NfaWQ7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCAoRldfTFBTX0VOVEVSfCAoKEN1cnJlbnRBSUR8MHhjMDAwKTw8OCkpICAgICk7CisJCQlDaGtGd0NtZElvRG9uZShkZXYpOworCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9ICBIVF9JT1RfQUNUX0RJU0FCTEVfRURDQV9UVVJCTzsKKwkJCWJyZWFrOwogCi0JCQkJLy9MWk0gQUREIGJlY2F1c2Ugc29tZXRpbWVzIHRoZXJlIGlzIG5vIEZXX0NNRF9ISUdIX1BXUl9ESVNBQkxFLCB0aGlzIHZhbHVlIHdpbGwgYmUgMC4KLQkJCQlpZihTY2FuUmVnaXN0ZXIgIT0gMCl7Ci0JCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgYk1hc2tEV29yZCwgU2NhblJlZ2lzdGVyKTsKLQkJCQl9CisJCWNhc2UgRldfQ01EX0xQU19MRUFWRToKKwkJCVJUX1RSQUNFKENPTVBfQ01ELCAiW0ZXIENNRF0gTGVhdmUgTFBTIG1vZGUhIVxuIik7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRk01LCBGV19MUFNfTEVBVkUgKTsKKwkJCUNoa0Z3Q21kSW9Eb25lKGRldik7CisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gJj0gICh+SFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8pOworCQkJYnJlYWs7CiAKLQkJCQlpZihwcml2LT5yZl90eXBlID09IFJGXzFUMlIgfHwgcHJpdi0+cmZfdHlwZSA9PSBSRl8yVDJSKQotCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX1RSeFBhdGhFbmFibGUsIDB4ZiwgMHgzKTsKLQkJCQllbHNlCi0JCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHhmLCAweDEpOwotCQkJfQorCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJfQogCi0JcHJpdi0+U2V0RndDbWRJblByb2dyZXNzID0gZmFsc2U7Ly8gQ2xlYXIgRlcgQ01EIG9wZXJhdGlvbiBmbGFnLgorCXByaXYtPlNldEZ3Q21kSW5Qcm9ncmVzcyA9IGZhbHNlOwogCVJUX1RSQUNFKENPTVBfQ01ELCAiPC0tLVNldEZ3Q21kSU9Xb3JrSXRlbUNhbGxiYWNrKClcbiIpOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlUuaAppbmRleCBlY2NmNDQ3Li43NDFjNmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVLmgKQEAgLTEsMzMgKzEsNDAgQEAKLS8qCi0gICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlci4KLSAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Ci0gICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQotICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTkyIGRyaXZlciBza2VsZXRvbgotICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgotCi0gICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKLSAgIHByb2plY3QgQXV0aG9ycy4KLSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIFJUTDgxOTJVCisgKgorICogQmFzZWQgb24gdGhlIHI4MTg3IGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFI4MTl4VV9ICiAjZGVmaW5lIFI4MTl4VV9ICiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotLy8jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNTEsOSArNTgsNyBAQAogI2RlZmluZSBSVEw4MTlYX0VFUFJPTV9DTURfQ0sJCSgxIDw8IDIpCiAjZGVmaW5lIFJUTDgxOVhfRUVQUk9NX0NNRF9DUwkJKDEgPDwgMykKIAotLy8jZGVmaW5lIFJUTDgxOTJVCiAjZGVmaW5lIFJUTDgxOXhVX01PRFVMRV9OQU1FICJydGw4MTl4VSIKLS8vYWRkZWQgZm9yIEhXIHNlY3VyaXR5LCBqb2huLjA2MjkKICNkZWZpbmUgRkFMU0UgMAogI2RlZmluZSBUUlVFIDEKICNkZWZpbmUgTUFYX0tFWV9MRU4gICAgIDYxCkBAIC0xMTQsNiArMTE5LDcgQEAKIAogI2RlZmluZSBDT01QX1RSQUNFCQkJCUJJVDAJCS8vIEZvciBmdW5jdGlvbiBjYWxsIHRyYWNpbmcuCiAjZGVmaW5lIENPTVBfREJHCQkJCUJJVDEJCS8vIE9ubHkgZm9yIHRlbXBvcmFyeSBkZWJ1ZyBtZXNzYWdlLgorI2RlZmluZSBDT01QX01MTUUJCQkJQklUMQogI2RlZmluZSBDT01QX0lOSVQJCQkJQklUMgkJLy8gZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbiAvIGhhbHQgLyByZXNldC4KIAogCkBAIC0xMzcsMTQgKzE0MywxNCBAQAogI2RlZmluZSBDT01QX1NFQwkJCSAgICAgICAgQklUMjAJLy8gRXZlbnQgaGFuZGxpbmcKICNkZWZpbmUgQ09NUF9MRUQJCQkJQklUMjEJLy8gRm9yIExFRC4KICNkZWZpbmUgQ09NUF9SRgkJCQkJQklUMjIJLy8gRm9yIFJGLgotLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisjZGVmaW5lIENPTVBfUlhERVNDCQkJCUJJVDIzCisKICNkZWZpbmUgQ09NUF9SWERFU0MJCQkJQklUMjMJLy8gU2hvdyBSeCBkZXNjIGluZm9ybWF0aW9uIGZvciBTRDMgZGVidWcuIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA3LTE1LgotLy8xLy8xQXR0ZW50aW9uIFBsZWFzZSEhITwxMW4gb3IgODE5MCBzcGVjaWZpYyBjb2RlIHNob3VsZCBiZSBwdXQgYmVsb3cgdGhpcyBsaW5lPgotLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCiAKICNkZWZpbmUgQ09NUF9GSVJNV0FSRQkJCQlCSVQyNAkvL2ZvciBmaXJtd2FyZSBkb3dubG9hZGluZwogI2RlZmluZSBDT01QX0hUCQkJCQlCSVQyNQkvLyBGb3IgODAyLjExbiBIVCByZWxhdGVkIGluZm9ybWF0aW9uLiBieSBFbWlseSAyMDA2LTgtMTEKICNkZWZpbmUgQ09NUF9BTVNEVQkJCQlCSVQyNgkvLyBGb3IgQS1NU0RVIERlYnVnZ2luZworI2RlZmluZSBDT01QX1BTCQkJCQlCSVQyNgogCiAjZGVmaW5lIENPTVBfU0NBTgkJCQlCSVQyNwogI2RlZmluZSBDT01QX0NNRAkJCQlCSVQyOApAQCAtMTU5LDggKzE2NSw3IEBACiAgICAgICAgICAgICAgICAgcHJpbnRrKCAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwgXAogICAgICAgICAgICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7ICAgICAgICAgIFwKICAgICAgICAgfQotLy93YiBhZGRlZCB0byBkZWJ1ZyBvdXQgZGF0YSBidWYKLS8vaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwgdG8gREFUQXxCQQorCiAjZGVmaW5lIFJUX0RFQlVHX0RBVEEobGV2ZWwsIGRhdGEsIGRhdGFsZW4pICAgICAgXAogICAgICAgICBkb3sgaWYgKChydF9nbG9iYWxfZGVidWdfY29tcG9uZW50ICYgKGxldmVsKSkgPT0gKGxldmVsKSkgICBcCiAgICAgICAgICAgICAgICAgeyAgICAgICBcCkBAIC0xODAsMjUgKzE4NSwxNyBAQAogI2RlZmluZSBSVF9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKSBkbyB7fSB3aGlsZSgwKQogI2VuZGlmIC8qIFJUTDgxNjlfREVCVUcgKi8KIAotLy8jaWZkZWYgUlRMODE5MlNVCiAJLy8yVE9ETzogV2Ugc2hvdWxkIGRlZmluZSA4MTkyUyBmaXJtd2FyZSByZWxhdGVkIG1hY3JvIHNldHRpbmdzIGhlcmUhIQogCSNkZWZpbmUgUlRMODE5WF9ERUZBVUxUX1JGX1RZUEUJCQkJUkZfMVQyUgogCSNkZWZpbmUgUlRMODE5WF9UT1RBTF9SRl9QQVRICQkJCTIKIAotCS8vI2RlZmluZSBSdGw4MTlYRndCb290QXJyYXkJCQkJCVJ0bDgxOTJVc2JGd0Jvb3RBcnJheQotCS8vI2RlZmluZSBSdGw4MTlYRndNYWluQXJyYXkJCQkJCVJ0bDgxOTJVc2JGd01haW5BcnJheQotCS8vI2RlZmluZSBSdGw4MTlYRndEYXRhQXJyYXkJCQkJCVJ0bDgxOTJVc2JGd0RhdGFBcnJheQotCiAJI2RlZmluZSBSdGw4MTlYTUFDUEhZX0FycmF5X1BHCQkJCVJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlfUEcKIAkjZGVmaW5lIFJ0bDgxOVhNQUNQSFlfQXJyYXkJCQkJCVJ0bDgxOTJVc2JNQUNQSFlfQXJyYXkKIAkjZGVmaW5lIFJ0bDgxOVhQSFlfUkVHQXJyYXkJCQkJCVJ0bDgxOTJVc2JQSFlfUkVHQXJyYXkKIAkjZGVmaW5lIFJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheQkJCQlSdGw4MTkyVXNiUEhZX1JFR18xVDJSQXJyYXkKLQkvLyNkZWZpbmUgUnRsODE5WFJhZGlvQV9BcnJheQkJCQkJUnRsODE5MlVzYlJhZGlvQV9BcnJheQotCS8vI2RlZmluZSBSdGw4MTlYUmFkaW9CX0FycmF5CQkJCQlSdGw4MTkyVXNiUmFkaW9CX0FycmF5CiAJI2RlZmluZSBSdGw4MTlYUmFkaW9DX0FycmF5CQkJCQlSdGw4MTkyVXNiUmFkaW9DX0FycmF5CiAJI2RlZmluZSBSdGw4MTlYUmFkaW9EX0FycmF5CQkJCQlSdGw4MTkyVXNiUmFkaW9EX0FycmF5CiAKLQkvLzIwMDguMTEuMDYgQWRkLgogCSNkZWZpbmUgUnRsODE5WEZ3SW1hZ2VBcnJheQkJCQkJUnRsODE5MlNVRndJbWdBcnJheQogCSNkZWZpbmUgUnRsODE5WE1BQ19BcnJheQkJCQkJCVJ0bDgxOTJTVU1BQ18yVF9BcnJheQogCSNkZWZpbmUgUnRsODE5WEFHQ1RBQl9BcnJheQkJCQkJUnRsODE5MlNVQUdDVEFCX0FycmF5CkBAIC0yMTIsOCArMjA5LDYgQEAKIAkjZGVmaW5lIFJ0bDgxOVhSYWRpb0JfR01fQXJyYXkJCQkJUnRsODE5MlNVUmFkaW9CX0dNX0FycmF5CiAJI2RlZmluZSBSdGw4MTlYUmFkaW9BX3RvMVRfQXJyYXkJCQkJUnRsODE5MlNVUmFkaW9BX3RvMVRfQXJyYXkKIAkjZGVmaW5lIFJ0bDgxOVhSYWRpb0FfdG8yVF9BcnJheQkJCQlSdGw4MTkyU1VSYWRpb0FfdG8yVF9BcnJheQotLy8jZW5kaWYKLQogLy8KIC8vIFF1ZXVlIFNlbGVjdCBWYWx1ZSBpbiBUeERlc2MKIC8vCkBAIC0yNTYsNyArMjUxLDYgQEAKICNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYKICNkZWZpbmUgREVTQzkwX1JBVEVNQ1MzMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKIAotLy8jaWZkZWYgUlRMODE5MlNVCiAvLyBDQ0sgUmF0ZXMsIFR4SFQgPSAwCiAjZGVmaW5lIERFU0M5MlNfUkFURTFNCQkJCQkweDAwCiAjZGVmaW5lIERFU0M5MlNfUkFURTJNCQkJCQkweDAxCkBAIC0yOTIsMTMgKzI4NiwxMiBAQAogI2RlZmluZSBERVNDOTJTX1JBVEVNQ1MxNQkJCQkweDFiCiAjZGVmaW5lIERFU0M5MlNfUkFURU1DUzE1X1NHCQkJMHgxYwogI2RlZmluZSBERVNDOTJTX1JBVEVNQ1MzMgkJCQkweDIwCi0vLyNlbmRpZgogCiAjZGVmaW5lIFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFIFJGXzFUMlIKIAogI2RlZmluZSBJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUgICAgMjAwMAogI2RlZmluZQkJUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWAkJMTAKLS8vZm9yIHR4cG93ZXJ0cmFja2luZyBieSBhbXkKKy8vZm9yIHR4cG93ZXJ0cmFja2luZwogI2RlZmluZSAJT0ZETV9UYWJsZV9MZW5ndGgJMTkKICNkZWZpbmUJQ0NLX1RhYmxlX2xlbmd0aAkxMgogCkBAIC01MjIsNyArNTE1LDYgQEAKIAl1OCBvdXRfcGlwZTsKIH1ydGw4MTkyX3J4X2luZm8gOwogCi0vL3R5cGVkZWYgc3RydWN0IF9SWF9ERVNDX1NUQVRVU184MTkyU1V7CiB0eXBlZGVmIHN0cnVjdCByeF9kZXNjXzgxOXhfdXNiewogCS8vRFdPUkQgMAogCXUxNgkJTGVuZ3RoOjE0OwpAQCAtNTgyLDc3ICs1NzQsMzQgQEAKIAogCS8vRFdPUkQgNQogCXUzMgkJVFNGTDsKLS8vfVJYX0RFU0NfU1RBVFVTXzgxOTJTVSwgKlBSWF9ERVNDX1NUQVRVU184MTkyU1U7CiB9cnhfZGVzY184MTl4X3VzYiwgKnByeF9kZXNjXzgxOXhfdXNiOwogCiAKIC8vCiAvLyBEcml2ZXIgaW5mbyBhcmUgd3JpdHRlbiB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIFJ4QnVmZmVyCiAvLwotLy90eXBlZGVmIHN0cnVjdCBfUlhfRFJJVkVSX0lORk9fODE5MlN7CiB0eXBlZGVmIHN0cnVjdCByeF9kcnZpbmZvXzgxOXhfdXNiewotCS8vCi0JLy8gRHJpdmVyIGluZm8gY29udGFpbiBQSFkgc3RhdHVzIGFuZCBvdGhlciB2YXJpYWJlbCBzaXplIGluZm8KLQkvLyBQSFkgU3RhdHVzIGNvbnRlbnQgYXMgYmVsb3cKLQkvLwotCi0JLy9EV09SRCAwCi0JLyp1NEJ5dGUJCQlnYWluXzA6NzsKLQl1NEJ5dGUJCQl0cnN3XzA6MTsKLQl1NEJ5dGUJCQlnYWluXzE6NzsKLQl1NEJ5dGUJCQl0cnN3XzE6MTsKLQl1NEJ5dGUJCQlnYWluXzI6NzsKLQl1NEJ5dGUJCQl0cnN3XzI6MTsKLQl1NEJ5dGUJCQlnYWluXzM6NzsKLQl1NEJ5dGUJCQl0cnN3XzM6MTsJKi8KIAl1OAkJCWdhaW5fdHJzd1s0XTsKIAogCS8vRFdPUkQgMQotCS8qdTRCeXRlCQkJcHdkYl9hbGw6ODsKLQl1NEJ5dGUJCQljZm9zaG9fMDo4OwotCXU0Qnl0ZQkJCWNmb3Nob18xOjg7Ci0JdTRCeXRlCQkJY2Zvc2hvXzI6ODsqLwogCXU4CQkJcHdkYl9hbGw7CiAJdTgJCQljZm9zaG9bNF07CiAKIAkvL0RXT1JEIDIKLQkvKnU0Qnl0ZQkJCWNmb3Nob18zOjg7Ci0JdTRCeXRlCQkJY2ZvdGFpbF8wOjg7Ci0JdTRCeXRlCQkJY2ZvdGFpbF8xOjg7Ci0JdTRCeXRlCQkJY2ZvdGFpbF8yOjg7Ki8KIAl1OAkJCWNmb3RhaWxbNF07CiAKIAkvL0RXT1JEIDMKLQkvKnU0Qnl0ZQkJCWNmb3RhaWxfMzo4OwotCXU0Qnl0ZQkJCXJ4ZXZtXzA6ODsKLQl1NEJ5dGUJCQlyeGV2bV8xOjg7Ci0JdTRCeXRlCQkJcnhzbnJfMDo4OyovCiAJY2hhcgkJCSAgICAgICAgcnhldm1bMl07CiAJY2hhcgkJCSAgICAgICAgcnhzbnJbNF07CiAKIAkvL0RXT1JEIDQKLQkvKnU0Qnl0ZQkJCXJ4c25yXzE6ODsKLQl1NEJ5dGUJCQlyeHNucl8yOjg7Ci0JdTRCeXRlCQkJcnhzbnJfMzo4OwotCXU0Qnl0ZQkJCXBkc25yXzA6ODsqLwogCXU4CQkJcGRzbnJbMl07CiAKIAkvL0RXT1JEIDUKLQkvKnU0Qnl0ZQkJCXBkc25yXzE6ODsKLQl1NEJ5dGUJCQljc2lfY3VycmVudF8wOjg7Ci0JdTRCeXRlCQkJY3NpX2N1cnJlbnRfMTo4OwotCXU0Qnl0ZQkJCWNzaV90YXJnZXRfMDo4OyovCiAJdTgJCQljc2lfY3VycmVudFsyXTsKIAl1OAkJCWNzaV90YXJnZXRbMl07CiAKIAkvL0RXT1JEIDYKLQkvKnU0Qnl0ZQkJCWNzaV90YXJnZXRfMTo4OwotCXU0Qnl0ZQkJCXNpZ2V2bTo4OwotCXU0Qnl0ZQkJCW1heF9leF9wd3I6ODsKLQl1NEJ5dGUJCQlleF9pbnRmX2ZsYWc6MTsKLQl1NEJ5dGUJCQlzZ2lfZW46MTsKLQl1NEJ5dGUJCQlyeHNjOjI7Ci0JdTRCeXRlCQkJcmVzZXJ2ZTo0OyovCiAJdTgJCQlzaWdldm07CiAJdTgJCQltYXhfZXhfcHdyOwogCXU4CQkJZXhfaW50Zl9mbGFnOjE7CkBAIC02NjksMTAgKzYxOCw4IEBACiAKICNkZWZpbmUgTUFYX0RFVl9BRERSX1NJWkUJCTggIC8qIHN1cHBvcnQgdGlsbCA2NCBiaXQgYnVzIHdpZHRoIE9TICovCiAjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFICAgMzIgLyoyMDA2LzA0LzMwIGJ5IEVtaWx5IGZvclJUTDgxOTAqLwotLy8jZGVmaW5lIE1BWF84MDJfMTFfSEVBREVSX0xFTkdUSCAgICAgICAgKDQwICsgTUFYX0ZJUk1XQVJFX0lORk9STUFUSU9OX1NJWkUpCiAjZGVmaW5lIEVOQ1JZUFRJT05fTUFYX09WRVJIRUFECQkxMjgKICNkZWZpbmUJVVNCX0hXREVTQ19IRUFERVJfTEVOCQlzaXplb2YodHhfZGVzY184MTl4X3VzYikKLS8vI2RlZmluZSBUWF9QQUNLRVRfU0hJRlRfQllURVMgCSAgCShVU0JfSFdERVNDX0hFQURFUl9MRU4gKyBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSkKICNkZWZpbmUgTUFYX0ZSQUdNRU5UX0NPVU5UCQk4CiAjaWZkZWYgUlRMODE5MlUKICNkZWZpbmUgTUFYX1RSQU5TTUlUX0JVRkZFUl9TSVpFCQkJODAwMApAQCAtNjgxLDE5ICs2MjgsMTUgQEAKICNlbmRpZgogI2RlZmluZSBzY3JjbG5nCQkJCQk0CQkvLyBvY3RldHMgZm9yIGNyYzMyIChGQ1MsIElDVikKIAorI2RlZmluZQkJSEFMX0RNX0RJR19ESVNBQkxFCQkJCUJJVDAKKyNkZWZpbmUJCUhBTF9ETV9ISVBXUl9ESVNBQkxFCQkJCUJJVDEKKwogdHlwZWRlZiBlbnVtIHJmX29wdHlwZQogewogCVJGX09QX0J5X1NXXzN3aXJlID0gMCwKIAlSRl9PUF9CeV9GVywKIAlSRl9PUF9NQVgKIH1yZl9vcF90eXBlOwotLyogODE5MCBMb29wYmFjayBNb2RlIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgZW51bSBfcnRsODE5eFVzYl9sb29wYmFja3sKLQlSVEw4MTl4VV9OT19MT09QQkFDSyA9IDAsCi0JUlRMODE5eFVfTUFDX0xPT1BCQUNLID0gMSwKLQlSVEw4MTl4VV9ETUFfTE9PUEJBQ0sgPSAyLAotCVJUTDgxOXhVX0NDS19MT09QQkFDSyA9IDMsCi19cnRsODE5eFVzYl9sb29wYmFja19lOwogCiAvKiBmb3IgcnRsODE5eCAqLwogdHlwZWRlZiBlbnVtIF9SVF9TVEFUVVN7CkBAIC03MDMsMTYgKzY0NiwxMyBAQAogCVJUX1NUQVRVU19SRVNPVVJDRSA9IDMKIH1SVF9TVEFUVVMsKlBSVF9TVEFUVVM7CiAKLS8vI2lmZGVmIFJUTDgxOTJTVQogdHlwZWRlZiBlbnVtIF9SVEw4MTkyU1VTQl9MT09QQkFDS3sKIAlSVEw4MTkyU1VfTk9fTE9PUEJBQ0sgPSAwLAogCVJUTDgxOTJTVV9NQUNfTE9PUEJBQ0sgPSAxLAogCVJUTDgxOTJTVV9ETUFfTE9PUEJBQ0sgPSAyLAogCVJUTDgxOTJTVV9DQ0tfTE9PUEJBQ0sgPSAzLAogfVJUTDgxOTJTVVNCX0xPT1BCQUNLX0U7Ci0vLyNlbmRpZgogCi0vLytieSBhbXkgMDgwNTA3CiAjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFCTkxMDAJLy8gQWRkIHRoaXMgdG8gOTEwMCBieXRlcyB0byByZWNlaXZlIEEtTVNEVSBmcm9tIFJULUFQCiAKIApAQCAtNzkwLDEwICs3MzAsNiBAQAogdHlwZWRlZiBzdHJ1Y3QgX3J0Xzl4X3R4X3JhdGVfaGlzdG9yeSB7CiAJdTMyICAgICAgICAgICAgIGNja1s0XTsKIAl1MzIgICAgICAgICAgICAgb2ZkbVs4XTsKLQkvLyBIVF9NQ1NbMF1bXTogQlc9MCBTRz0wCi0JLy8gSFRfTUNTWzFdW106IEJXPTEgU0c9MAotCS8vIEhUX01DU1syXVtdOiBCVz0wIFNHPTEKLQkvLyBIVF9NQ1NbM11bXTogQlc9MSBTRz0xCiAJdTMyICAgICAgICAgICAgIGh0X21jc1s0XVsxNl07CiB9cnRfdHhfcmFoaXNfdCwgKnBydF90eF9yYWhpc190OwogdHlwZWRlZiBzdHJ1Y3QgX1JUX1NNT09USF9EQVRBXzRSRiB7CkBAIC04MDgsMTEgKzc0NCw2IEBACiB0eXBlZGVmIHN0cnVjdCBTdGF0cwogewogCXVuc2lnbmVkIGxvbmcgdHhyZHU7Ci0vLwl1bnNpZ25lZCBsb25nIHJ4cmR1OwotCS8vdW5zaWduZWQgbG9uZyByeG5vbGFzdDsKLQkvL3Vuc2lnbmVkIGxvbmcgcnhub2RhdGE7Ci0vLwl1bnNpZ25lZCBsb25nIHJ4cmVzZXQ7Ci0vLwl1bnNpZ25lZCBsb25nIHJ4bm9wb2ludGVyOwogCXVuc2lnbmVkIGxvbmcgcnhvazsKIAl1bnNpZ25lZCBsb25nIHJ4ZnJhbWdtZW50OwogCXVuc2lnbmVkIGxvbmcgcnhjbWRwa3RbNF07CQkvLzA4LzA1LzA4IGFteSByeCBjbWQgZWxlbWVudCB0eGZlZWRiYWNrL2JjbiByZXBvcnQvY2ZnIHNldC9xdWVyeQpAQCAtODMyLDE4ICs3NjMsOCBAQAogCXVuc2lnbmVkIGxvbmcgdHhucGVycjsKIAl1bnNpZ25lZCBsb25nIHR4bnBkcm9wOwogCXVuc2lnbmVkIGxvbmcgdHhyZXN1bWVkOwotLy8JdW5zaWduZWQgbG9uZyByeGVycjsKLS8vCXVuc2lnbmVkIGxvbmcgcnhvdmVyZmxvdzsKLS8vCXVuc2lnbmVkIGxvbmcgcnhpbnQ7CiAJdW5zaWduZWQgbG9uZyB0eG5wb2tpbnQ7Ci0vLwl1bnNpZ25lZCBsb25nIHR4aHBva2ludDsKLS8vCXVuc2lnbmVkIGxvbmcgdHhocGVycjsKLS8vCXVuc2lnbmVkIGxvbmcgaW50czsKLS8vCXVuc2lnbmVkIGxvbmcgc2hpbnRzOwogCXVuc2lnbmVkIGxvbmcgdHhvdmVyZmxvdzsKLS8vCXVuc2lnbmVkIGxvbmcgcnhkbWFmYWlsOwotLy8JdW5zaWduZWQgbG9uZyB0eGJlYWNvbjsKLS8vCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CiAJdW5zaWduZWQgbG9uZyB0eGxwb2tpbnQ7CiAJdW5zaWduZWQgbG9uZyB0eGxwZHJvcDsKIAl1bnNpZ25lZCBsb25nIHR4bHBlcnI7CkBAIC05MDksMTQgKzgzMCwxMSBAQAogCXUzMglDdXJyZW50U2hvd1R4YXRlOwogfSBTdGF0czsKIAotCiAvLyBCYW5kd2lkdGggT2Zmc2V0CiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCTAKICNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkJMQogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIJCQkyCiAKLS8vK2J5IGFteSAwODA1MDcKLQogdHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKIAl1MTYgU0lGU19UaW1lcjsKIAl1MTYgRElGU19UaW1lcjsKQEAgLTk1NiwxNCArODc0LDEyIEBACiAgICAgICAgIFJGX1BTRVVET18xMU4gPSA1LAogfVJUX1JGX1RZUEVfODE5eFUsICpQUlRfUkZfVFlQRV84MTl4VTsKIAotLy8jaWZkZWYgUlRMODE5MlNVCiB0eXBlZGVmIGVudW0gX1JGX1BPV0VSX1NUQVRFewogCVJGX09OLAogCVJGX1NMRUVQLAogCVJGX09GRiwKIAlSRl9TSFVUX0RPV04sCiB9UkZfUE9XRVJfU1RBVEUsICpQUkZfUE9XRVJfU1RBVEU7Ci0vLyNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBfcmF0ZV9hZGFwdGl2ZQogewpAQCAtMTAxNCw3ICs5MzAsNiBAQAogCXU4CQkJCWNjYTsKIAogfSBpbml0X2dhaW4sICpwaW5pdF9nYWluOwotLy9ieSBhbXkgMDYwNgogCiB0eXBlZGVmIHN0cnVjdCBfcGh5X29mZG1fcnhfc3RhdHVzX3JlcG9ydF84MTl4dXNiCiB7CkBAIC0xMDY2LDggKzk4MSwyNiBAQAogCVJUX0NJRF9OZXR0cm9uaXggPSAxMSwKIAlSVF9DSURfRExJTksgPSAxMiwKIAlSVF9DSURfUFJPTkVUID0gMTMsCisJUlRfQ0lEX0NPUkVHQSA9IDE0LAorCVJUX0NJRF84MTl4X0FMUEhBID0gMTUsCisJUlRfQ0lEXzgxOXhfU2l0ZWNvbSA9IDE2LAorCVJUX0NJRF9DQ1ggPSAxNywKKwlSVF9DSURfODE5eF9MZW5vdm8gPSAxOCwKKwlSVF9DSURfODE5eF9RTUkgPSAxOSwKKwlSVF9DSURfODE5eF9FZGltYXhfQmVsa2luID0gMjAsCisJUlRfQ0lEXzgxOXhfU2VyY29tbV9CZWxraW4gPSAyMSwKKwlSVF9DSURfODE5eF9DQU1FTzEgPSAyMiwKKwlSVF9DSURfODE5eF9NU0kgPSAyMywKKwlSVF9DSURfODE5eF9BY2VyID0gMjQsCiB9UlRfQ1VTVE9NRVJfSUQsICpQUlRfQ1VTVE9NRVJfSUQ7CiAKK3R5cGVkZWYgZW51bSBfUlRfT1BfTU9ERXsKKyAgICBSVF9PUF9NT0RFX0FQLAorICAgIFJUX09QX01PREVfSU5GUkFTVFJVQ1RVUkUsCisgICAgUlRfT1BfTU9ERV9JQlNTLAorICAgIFJUX09QX01PREVfTk9fTElOSywKK31SVF9PUF9NT0RFLCAqUFJUX09QX01PREU7CisKIHR5cGVkZWYgZW51bSBfUkVTRVRfVFlQRSB7CiAJUkVTRVRfVFlQRV9OT1JFU0VUID0gMHgwMCwKIAlSRVNFVF9UWVBFX05PUk1BTCA9IDB4MDEsCkBAIC0xMDkzLDggKzEwMjYsNiBAQAogCU5JQ184MTkyU1UgPSA1LAogCX0gbmljX3Q7CiAKLS8vZGVmaW5kZWQgYnkgV0IuIFJlYWR5IHRvIGZpbGwgaGFuZGxlcnMgZm9yIGRpZmZlcmVudCBOSUMgdHlwZXMuCi0vL2FkZCBoYW5kbGUgaGVyZSB3aGVuIG5lY2Vzc2FyeS4KIHN0cnVjdCBydGw4MTl4X29wc3sKIAluaWNfdCBuaWNfdHlwZTsKIAl2b2lkICgqIHJ0bDgxOXhfcmVhZF9lZXByb21faW5mbykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0xMTEzLDExICsxMDQ0LDEyIEBACiAJc3RydWN0IHJ0bDgxOXhfb3BzKiBvcHM7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJLyogYWRkZWQgZm9yIG1haW50YWluIGluZm8gZnJvbSBlZXByb20gKi8KKwlzaG9ydCBlcHJvbXR5cGU7CiAJdTE2IGVlcHJvbV92aWQ7CiAJdTE2IGVlcHJvbV9waWQ7CiAJdTggIGVlcHJvbV9DdXN0b21lcklEOwogCXU4ICBlZXByb21fU3ViQ3VzdG9tZXJJRDsKLQl1OCAgZWVwcm9tX0NoYW5uZWxQbGFuOworCXUxNiAgZWVwcm9tX0NoYW5uZWxQbGFuOwogCVJUX0NVU1RPTUVSX0lEIEN1c3RvbWVySUQ7CiAJTEVEX1NUUkFURUdZXzgxOXhVc2IJTGVkU3RyYXRlZ3k7CiAJdTggIHR4cXVldWVfdG9fb3V0cGlwZW1hcFs5XTsKQEAgLTExMjksNzYgKzEwNjEsNTUgQEAKIAlpbnQgaXJxOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CiAKKwl1OCBSQVRSVGFibGVCaXRtYXA7CisKKwl1MzIJSUNfQ3V0OwogCXNob3J0IGNhcmRfODE5MjsgLyogTzogcnRsODE5MiwgMTpydGw4MTg1IFYgQi9DLCAyOnJ0bDgxODUgViBEICovCi0JdTggY2FyZF84MTkyX3ZlcnNpb247IC8qIGlmIFRDUiByZXBvcnRzIGNhcmQgViBCL0MgdGhpcyBkaXNjcmltaW5hdGVzICovCi0vLwlzaG9ydCBwaHlfdmVyOyAvKiBtZWFuaW5nZnVsIGZvciBydGw4MjI1IDE6QSAyOkIgMzpDICovCisJdTMyIGNhcmRfODE5Ml92ZXJzaW9uOyAvKiBpZiBUQ1IgcmVwb3J0cyBjYXJkIFYgQi9DIHRoaXMgZGlzY3JpbWluYXRlcyAqLwogCXNob3J0IGVuYWJsZV9ncGlvMDsKIAllbnVtIGNhcmRfdHlwZSB7UENJLE1JTklQQ0ksQ0FSREJVUyxVU0J9Y2FyZF90eXBlOwogCXNob3J0IGh3X3BsY3BfbGVuOwogCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsKIAogCXNwaW5sb2NrX3QgaXJxX2xvY2s7Ci0vLwlzcGlubG9ja190IGlycV90aF9sb2NrOwogCXNwaW5sb2NrX3QgdHhfbG9jazsKIAlzcGlubG9ja190IHBzX2xvY2s7CiAgICAgICAgIHN0cnVjdCBtdXRleCBtdXRleDsKKwlib29sIHBzX2ZvcmNlOwogCXNwaW5sb2NrX3QgcmZfbG9jazsgLy91c2VkIHRvIGxvY2sgcmYgd3JpdGUgb3BlcmF0aW9uIGFkZGVkIGJ5IHdiCisJc3BpbmxvY2tfdCByZl9wc19sb2NrOwogCiAJdTE2IGlycV9tYXNrOwotLy8Jc2hvcnQgaXJxX2VuYWJsZWQ7Ci0vLwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvL2NvbW1lbnQgdGhpcyBvdXQuCiAJc2hvcnQgY2hhbjsKIAlzaG9ydCBzZW5zOwogCXNob3J0IG1heF9zZW5zOwogCi0KLQkvLwl1OCBjaHR4cHdyWzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKLS8vCXU4IGNodHhwd3Jfb2ZkbVsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCi0vLwl1OCBjY2tfdHhwd3JfYmFzZTsKLS8vCXU4IG9mZG1fdHhwd3JfYmFzZTsKLS8vCXU4IGNoYWxsb3dbMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAogCXNob3J0IHVwOwogCXNob3J0IGNyY21vbjsgLy9pZiAxIGFsbG93IGJhZCBjcmMgZnJhbWUgcmVjZXB0aW9uIGluIG1vbml0b3IgbW9kZQotLy8Jc2hvcnQgcHJpc21faGRyOworCWJvb2wgYlN1cnByaXNlUmVtb3ZlZDsKIAotLy8Jc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKLQkvKnNob3J0IHNjYW5wZW5kaW5nOwotCXNob3J0IHN0b3BzY2FuOyovCi0vLwlzcGlubG9ja190IHNjYW5fbG9jazsKLS8vCXU4IGFjdGl2ZV9wcm9iZTsKLQkvL3U4IGFjdGl2ZV9zY2FuX251bTsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHJmX3NlbTsgLy91c2VkIHRvIGxvY2sgcmYgd3JpdGUgb3BlcmF0aW9uIGFkZGVkIGJ5IHdiLCBtb2RpZmllZCBieSBkYXZpZAotLy8Jc2hvcnQgaHdfd2VwOwogCi0vLwlzaG9ydCBkaWdwaHk7Ci0vLwlzaG9ydCBhbnRiOwotLy8Jc2hvcnQgZGl2ZXJzaXR5OwotLy8JdTggY3NfdHJlc2hvbGQ7Ci0vLwlzaG9ydCByY3JfY3NlbnNlOwogCXU4IHJmX3R5cGU7IC8vMCBtZWFucyAxVDJSLCAxIG1lYW5zIDJUNFIKIAlSVF9SRl9UWVBFXzgxOXhVIHJmX2NoaXA7CiAKLS8vCXUzMiBrZXkwWzRdOwogCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7CiAJdTggKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCBjaCk7CiAJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0JLy9zaG9ydCByYXRlOwogCXNob3J0IHByb21pc2M7CisgICAgICAgIHUzMiBtY19maWx0ZXJbMl07CiAJLypzdGF0cyovCiAJc3RydWN0IFN0YXRzIHN0YXRzOwogCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXY7CiAKIAkvKlJYIHN0dWZmKi8KLS8vCXUzMiAqcnhyaW5nOwotLy8JdTMyICpyeHJpbmd0YWlsOwotLy8JZG1hX2FkZHJfdCByeHJpbmdkbWE7CiAJc3RydWN0IHVyYiAqKnJ4X3VyYjsKIAlzdHJ1Y3QgdXJiICoqcnhfY21kX3VyYjsKIAotLyogbW9kaWZpZWQgYnkgZGF2YWQgZm9yIFJ4IHByb2Nlc3MgKi8KKy8qIGZvciBSeCBwcm9jZXNzICovCiAgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9xdWV1ZTsKICAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9xdWV1ZTsKIApAQCAtMTIwOSw2ICsxMTIwLDcgQEAKIAogCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV9yeF90YXNrbGV0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfdHhfdGFza2xldDsKIAlzdHJ1Y3QgdXJiICpyeHVyYl90YXNrOwogCiAJLy8yIFR4IFJlbGF0ZWQgdmFyaWFibGVzCkBAIC0xMjM1LDYgKzExNDcsNyBAQAogCXN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgIENoYW5uZWxBY2Nlc3NTZXR0aW5nOwogCiAJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dxOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgbWNhc3Rfd3E7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8vZm9yIHJ0bDgxOXhVc2IKQEAgLTEyNDQsMjEgKzExNTcsMjggQEAKIAlib29sIAliRGN1dDsKIAlib29sIGJDdXJyZW50UnhBZ2dyRW5hYmxlOwogCXU4IFJmX01vZGU7IC8vYWRkIGZvciBGaXJtd2FyZSBSRiAtUi9XIHN3aXRjaAorCXU4IEZ3UnN2ZFR4UGFnZUNmZzsKIAlwcnRfZmlybXdhcmUJCXBGaXJtd2FyZTsKLQlydGw4MTl4VXNiX2xvb3BiYWNrX2UJTG9vcGJhY2tNb2RlOworCVJUTDgxOTJTVVNCX0xPT1BCQUNLX0UJTG9vcGJhY2tNb2RlOwogCWJvb2wgdXNiX2Vycm9yOwogCiAJdTE2IEVFUFJPTVR4UG93ZXJEaWZmOwogCXU4IEVFUFJPTVRoZXJtYWxNZXRlcjsKIAl1OCBFRVBST01Qd0RpZmY7CiAJdTggRUVQUk9NQ3J5c3RhbENhcDsKKwl1OCBFRVBST01CbHVldG9vdGhDb2V4aXN0OwogCXU4IEVFUFJPTV9EZWZfVmVyOwogCXU4IEVFUFJPTVR4UG93ZXJMZXZlbENDSzsvLyBDQ0sgY2hhbm5lbCAxfjE0CiAJdTggRUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzNdOwogCXU4IEVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbM107IC8vIE9GRE0gMi40RyBjaGFubmVsIDF+MTQKIAl1OCBFRVBST01UeFBvd2VyTGV2ZWxPRkRNNUdbMjRdOwkvLyBPRkRNIDVHCiAKLS8vUlRMODE5MlNVCisJdTggRUVQUk9NT3B0aW9uYWw7CisJdTggU2hvd1JhdGVNb2RlOworCWJvb2wgYkZvcmNlZFNob3dSeFJhdGU7CisKKwl1MzIJUmZSZWdDaG5sVmFsWzJdOworCiAJYm9vbAliRG1EaXNhYmxlUHJvdGVjdDsKIAlib29sCWJJZ25vcmVEaWZmUmF0ZVR4UG93ZXJPZmZzZXQ7CiAKQEAgLTEyNzgsNiArMTE5OCw5IEBACiAJYm9vbAkJRWVwcm9tT3JFZnVzZTsKIAlib29sCQliQm9vdEZyb21FZnVzZTsJLy8gc3lzdGVtIGJvb3QgZm9ybSBFRlVTRQogCXU4ICAJCUVmdXNlTWFwWzJdW0hXU0VUX01BWF9TSVpFXzkyU107CisJdTE2CQlFZnVzZVVzZWRCeXRlczsKKwl1OAkJRWZ1c2VVc2VkUGVyY2VudGFnZTsKKwogCiAJdTggIAkJRUVQUk9NVXNiT3B0aW9uOwogCXU4ICAJCUVFUFJPTVVzYlBoeVBhcmFtWzVdOwpAQCAtMTI5MCw2ICsxMjEzLDggQEAKIAl1OCAgCQlFRVBST01UeFB3clRrTW9kZTsKIAogCXU4ICAJCWJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNOworCXU4CQlFRVBST01SZWd1bGF0b3J5OworCXU4CQlFRVBST01Qd3JHcm91cFsyXVszXTsKIAogCXU4CQlFRVBST01WZXJzaW9uOwogCXU4CQlFRVBST01Vc2JFbmRQb2ludE51bWJlcjsKQEAgLTEyOTgsNyArMTIyMyw3IEBACiAJdTgJUmZUeFB3ckxldmVsQ2NrWzJdWzE0XTsKIAl1OAlSZlR4UHdyTGV2ZWxPZmRtMVRbMl1bMTRdOwogCXU4CVJmVHhQd3JMZXZlbE9mZG0yVFsyXVsxNF07Ci0JLy8gMjAwOS8wMS8yMCBNSCBBZGQgZm9yIG5ldyBFRVBST00gZm9ybWF0LgorCS8vIG5ldyBFRVBST00gZm9ybWF0LgogCXU4CQkJCQlUeFB3ckh0MjBEaWZmWzJdWzE0XTsJCQkJLy8gSFQgMjA8LT40MCBQd3IgZGlmZgogCXU4CQkJCQlUeFB3ckxlZ2FjeUh0RGlmZlsyXVsxNF07CQkvLyBGb3IgSFQ8LT5sZWdhY3kgcHdyIGRpZmYKIAl1OAkJCQkJVHhQd3JiYW5kRWRnZUh0NDBbMl1bMl07CQkvLyBCYW5kIGVkZ2UgZm9yIEhZIDQwTUhabG93L3VwIGNoYW5uZWwKQEAgLTEzMTAsNyArMTIzNSw2IEBACiAJdTggCQkJCU1pZEhpZ2hQd3JUSFJfTDE7CiAJdTggCQkJCU1pZEhpZ2hQd3JUSFJfTDI7CiAJdTgJCQkJVHhQd3JTYWZldHlGbGFnOwkJCQkvLyBmb3IgVHggcG93ZXIgc2FmZXR5IHNwZWMKLS8vUlRMODE5MlNVCiAKIC8qUEhZIHJlbGF0ZWQqLwogCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAlQSFlSZWdEZWZbNF07CS8vUmFkaW8gQS9CL0MvRApAQCAtMTMyMyw4ICsxMjQ3LDExIEBACiAJdTMyCVB3cl9UcmFjazsKIAl1OAlUeFBvd2VyRGlmZjsKIAl1OAlBbnRlbm5hVHhQd0RpZmZbMl07CQkJCS8vIEFudGVubmEgZ2FpbiBvZmZzZXQsIGluZGV4IDAgZm9yIEIsIDEgZm9yIEMsIGFuZCAyIGZvciBECisJdTgJVGhlcm1hbE1ldGVyWzJdOyAvLyBUaGVybWFsTWV0ZXIsIGluZGV4IDAgZm9yIFJGSUMwLCBhbmQgMSBmb3IgUkZJQzEKKwl1OAlUaGVybWFsVmFsdWU7CiAJdTgJQ3J5c3RhbENhcDsJCQkJCQkvLyBDcnlzdGFsQ2FwLgotCXU4CVRoZXJtYWxNZXRlclsyXTsJCQkJLy8gVGhlcm1hbE1ldGVyLCBpbmRleCAwIGZvciBSRklDMCwgYW5kIDEgZm9yIFJGSUMxCisJdTgJQmx1ZXRvb3RoQ29leGlzdDsKKwl1OAlFeHRlcm5hbFBBOwogCiAJdTgJQ2NrUHdFbmw7CiAJLy8gVXNlIHRvIGNhbGN1bGF0ZSBQV0JELgpAQCAtMTMzNywyNCArMTI2NCwyMiBAQAogCXU4CVN3Q2hubFN0ZXA7CiAJdTgJU2V0QldNb2RlSW5Qcm9ncmVzczsKIAlIVF9DSEFOTkVMX1dJRFRICQlDdXJyZW50Q2hhbm5lbEJXOworCWJvb2wgYkNobmxQbGFuRnJvbUhXOwogCXU4ICAgICAgQ2hhbm5lbFBsYW47CisJdTE2CVJlZ0NoYW5uZWxQbGFuOwogCXU4ICAgICAgcHdyR3JvdXBDbnQ7CiAJLy8gODE5MCA0ME1IeiBtb2RlCiAJLy8KIAl1OAluQ3VyNDBNaHpQcmltZVNDOwkvLyBDb250cm9sIGNoYW5uZWwgc3ViLWNhcnJpZXIKLQkvLyBKb3NlcGggdGVzdCBmb3Igc2hvcnRlbiBSRiBjb25maWd1cmF0aW9uIHRpbWUuCi0JLy8gV2Ugc2F2ZSBSRiByZWcwIGluIHRoaXMgdmFyaWFibGUgdG8gcmVkdWNlIFJGIHJlYWRpbmcuCi0JLy8KKwogCXUzMgkJCQkJUmZSZWcwVmFsdWVbNF07CiAJdTggCQkJCQlOdW1Ub3RhbFJGUGF0aDsKIAlib29sIAkJCQlicmZwYXRoX3J4ZW5hYmxlWzRdOwogCS8vUkYgc2V0IHJlbGF0ZWQKIAlib29sCQkJCVNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7Ci0vLytieSBhbXkgMDgwNTA3CisKIAlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaF9kb2dfdGltZXI7CiAKLS8vK2J5IGFteSAwODA1MTUgZm9yIGR5bmFtaWMgbWVjaGVuaXNtCi0JLy9BZGQgYnkgYW15IFR4IFBvd2VyIENvbnRyb2wgZm9yIE5lYXIvRmFyIFJhbmdlIDIwMDgvMDUvMTUKIAlib29sCWJkeW5hbWljX3R4cG93ZXI7ICAvL2JEeW5hbWljVHhQb3dlcgogCWJvb2wJYkR5bmFtaWNUeEhpZ2hQb3dlcjsgIC8vIFR4IGhpZ2ggcG93ZXIgc3RhdGUKIAlib29sCWJEeW5hbWljVHhMb3dQb3dlcjsgIC8vIFR4IGxvdyBwb3dlciBzdGF0ZQpAQCAtMTM2MywxNyArMTI4OCwxOCBAQAogCiAJYm9vbAlic3RvcmVfbGFzdF9kdHBmbGFnOwogCWJvb2wJYnN0YXJ0X3R4Y3RybF9ieWR0cDsgICAvL0RlZmluZSB0byBkaXNjcmltaW5hdGUgb24gSGlnaCBwb3dlciBTdGF0ZSBvciBvbiBzaXRlc3V2ZXkgdG8gY2hhbmdlIFR4IGdhaW4gaW5kZXgKLQkvL0FkZCBieSBhbXkgZm9yIFJhdGUgQWRhcHRpdmUKKwogCXJhdGVfYWRhcHRpdmUgcmF0ZV9hZGFwdGl2ZTsKLQkvL0FkZCBieSBhbXkgZm9yIFRYIHBvd2VyIHRyYWNraW5nCi0JLy8yMDA4LzA1LzE1ICBNYXJzIE9QRU4vQ0xPU0UgVFggUE9XRVIgVFJBQ0tJTkcKKwkvLyBUWCBwb3dlciB0cmFja2luZwogICAgICAgIHR4YmJnYWluX3N0cnVjdCB0eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoXTsKICAgICAgICB1OAlFRVBST01UeFBvd2VyVHJhY2tFbmFibGU7CiAJdTgJCQkgICB0eHBvd2VyX2NvdW50Oy8vRm9yIDYgc2VjIGRvIHRyYWNraW5nIGFnYWluCiAJYm9vbAkJCSAgIGJ0eHBvd2VyX3RyYWNraW5nSW5pdDsKIAl1OAkJCSAgIE9GRE1faW5kZXg7CiAJdTgJCQkgICBDQ0tfaW5kZXg7Ci0JLy8yMDA3LzA5LzEwIE1hcnMgQWRkIENDSyBUWCBQb3dlciBUcmFja2luZworCXU4CQkJICAgUmVjb3JkX0NDS18yME1pbmRleDsKKwl1OAkJCSAgIFJlY29yZF9DQ0tfNDBNaW5kZXg7CisJLy8gQ0NLIFRYIFBvd2VyIFRyYWNraW5nCiAJY2NrdHhiYmdhaW5fc3RydWN0CWNja190eGJiZ2Fpbl90YWJsZVtDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoXTsKIAljY2t0eGJiZ2Fpbl9zdHJ1Y3QJY2NrX3R4YmJnYWluX2NoMTRfdGFibGVbQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aF07CiAJdTggcmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4OwpAQCAtMTM5MCwxMCArMTMxNiwxNSBAQAogCWJvb2wgYmNja19pbl9jaDE0OwogCWJvb2wgYnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNOwogCXUxNiAJVFNTSV8xM2RCbTsKKwl1OAlDQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CisJdTgJQ0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0OworCWNoYXIJQ0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCWNoYXIJQ0NLUHJlc2VudEF0dGVudHVhdGlvbjsKKwlib29sIGJETUluaXRpYWxHYWluRW5hYmxlOwogCS8vRm9yIEJhY2t1cCBJbml0aWFsIEdhaW4KIAlpbml0X2dhaW4gaW5pdGdhaW5fYmFja3VwOwogCXU4IERlZmF1bHRJbml0aWFsR2Fpbls0XTsKLQkvLyBGb3IgRURDQSBUdXJibyBtb2RlLCBBZGRlZCBieSBhbXkgMDgwNTE1LgorCS8vIEZvciBFRENBIFR1cmJvIG1vZGUKIAlib29sCQliaXNfYW55X25vbmJlcGt0czsKIAlib29sCQliY3VycmVudF90dXJib19FRENBOwogCWJvb2wJCWJpc19jdXJfcmRsc3RhdGU7CkBAIC0xNDA3LDE3ICsxMzM4LDIzIEBACiAJdTgJZnJhbWVzeW5jOwogCXUzMiAJZnJhbWVzeW5jQzM0OwogCXU4ICAgCWZyYW1lc3luY01vbml0b3I7Ci0gICAgICAgIAkvL0FkZGVkIGJ5IGFteSAwODA1MTYgIGZvciBSWCByZWxhdGVkCisgICAgICAgIAkvLyBSWCByZWxhdGVkCiAJdTE2IAlucnhBTVBEVV9zaXplOwogCXU4IAlucnhBTVBEVV9hZ2dyX251bTsKIAotCS8vYnkgYW15IGZvciBncGlvCisJLy8gZ3BpbwogCSBib29sIGJId1JhZGlvT2ZmOwogCi0JLy9ieSBhbXkgZm9yIHJlc2V0X2NvdW50CisJYm9vbCBpc1JGT2ZmOworCWJvb2wgYkluUG93ZXJTYXZlTW9kZTsKKworCWJvb2wgUkZDaGFuZ2VJblByb2dyZXNzOworCWJvb2wgUmVnUmZPZmY7CisJdTgJYkh3UmZPZmZBY3Rpb247CisKIAl1MzIgcmVzZXRfY291bnQ7CiAJYm9vbCBicGJjX3ByZXNzZWQ7Ci0JLy9ieSBhbXkgZm9yIGRlYnVnCisJLy8gZGVidWcKIAl1MzIgdHhwb3dlcl9jaGVja2NudDsKIAl1MzIgdHhwb3dlcl90cmFja2luZ19jYWxsYmFja19jbnQ7CiAJdTggdGhlcm1hbF9yZWFkX3ZhbFs0MF07CkBAIC0xNDI2LDcgKzEzNjMsNyBAQAogCXUzMiBjY2t0eHBvd2VyX2FkanVzdGNudF9jaDE0OwogCXU4IHR4X2Z3aW5mb19mb3JjZV9zdWJjYXJyaWVybW9kZTsKIAl1OCB0eF9md2luZm9fZm9yY2Vfc3ViY2FycmllcnZhbDsKLQkvL2J5IGFteSBmb3Igc2lsZW50IHJlc2V0CisJLy8gc2lsZW50IHJlc2V0CiAJUkVTRVRfVFlQRQlSZXNldFByb2dyZXNzOwogCWJvb2wJCWJGb3JjZWRTaWxlbnRSZXNldDsKIAlib29sCQliRGlzYWJsZU5vcm1hbFJlc2V0Q2hlY2s7CkBAIC0xNDM1LDExICsxMzcyLDExIEBACiAJaW50CQlJcnBQZW5kaW5nQ291bnQ7CiAJYm9vbAkJYlJlc2V0SW5Qcm9ncmVzczsKIAlib29sCQlmb3JjZV9yZXNldDsKKwlib29sCQlmb3JjZV9scHM7CiAJdTgJCUluaXRpYWxHYWluT3BlcmF0ZVR5cGU7CiAKIAl1MTYJCVNpZnNUaW1lOwogCi0JLy9kZWZpbmUgd29yayBpdGVtIGJ5IGFteSAwODA1MjYKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHVwZGF0ZV9iZWFjb25fd3E7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB0eHBvd2VyX3RyYWNraW5nX3dxOwpAQCAtMTQ0OCw4ICsxMzg1LDcgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGluaXRpYWxnYWluX29wZXJhdGVfd3E7CiAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcHJpdl93cTsKLS8vI2lmZGVmIFJUTDgxOTJTVQotCS8vbHptIGFkZCBmb3IgODE5MlMKKwogCSB1MzIgCQkJSW50ck1hc2s7CiAJLy8gUkYgYW5kIEJCIGFjY2VzcyByZWxhdGVkIHN5bmNocm9uaXphdGlvbiBmbGFncy4KIAlib29sCQkJCWJDaGFuZ2VCQkluUHJvZ3Jlc3M7IC8vIEJhc2VCYW5kIFJXIGlzIHN0aWxsIGluIHByb2dyZXNzLgpAQCAtMTQ2NCw3ICsxNDAwLDYgQEAKIAl1OAkJCQlUaGVybWFsUmVhZEJhY2tJbmRleDsJCQkvL2RlYnVnIG9ubHkKIAl1OAkJCQlUaGVybWFsUmVhZFZhbFs0MF07CQkJCS8vZGVidWcgb25seQogCi0JLy8gRm9yIEhDVCB0ZXN0LCAyMDA1LjA3LjE1LCBieSByY25qa28uCiAJLy8gbm90IHJlYWxpemUgdHJ1ZSwganVzdCBkZWZpbmUgaXQsIHNldCBpdCAwIGRlZmF1bHQsIGJlY2F1c2Ugc29tZSBmdW5jIHVzZSBpdAogCWJvb2wJCQkJYkluSGN0VGVzdDsKIApAQCAtMTQ4MSw3ICsxNDE2LDYgQEAKIAljaGFyCQkJCQlSRl9DX1R4UHdEaWZmOwkJCQkJLy8gQW50ZW5uYSBnYWluIG9mZnNldCwgcmYtYyB0byByZi1hCiAKIAlib29sCWJSRlNpT3JQaTsvLzA9c2ksIDE9cGkuCi0JLy9sem0gYWRkIGZvciA4MTkyUwogCiAJYm9vbCBTZXRGd0NtZEluUHJvZ3Jlc3M7IC8vaXMgc2V0IEZXIENNRCBpbiBQcm9ncmVzcz8gOTJTIG9ubHkKIAl1OCBDdXJyZW50RndDbWRJTzsKQEAgLTE0OTUsMjUgKzE0MjksMTcgQEAKIAlMRURfODE5eFVzYgkJCVN3TGVkMDsKIAlMRURfODE5eFVzYgkJCVN3TGVkMTsKICAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVnVXNlTGVkOwotCXN0cnVjdCB3b3JrX3N0cnVjdAkJQmxpbmtXb3JrSXRlbTsgCisJc3RydWN0IHdvcmtfc3RydWN0CQlCbGlua1dvcmtJdGVtOwogCS8qIGFkZGVkIGZvciBsZWQgY29udHJvbCAqLwogCXUxNgkJCQlGd0NtZElPTWFwOwogCXUzMgkJCQlGd0NtZElPUGFyYW07Ci0JdTgJCQkJRE1GbGFnOyAKKwl1OAkJCQlETUZsYWc7CiAKIAogCiAKIH1yODE5Ml9wcml2OwogCi0vLyBmb3IgcnRsODE4NwotLy8gbm93IG1pcmdpbmcgdG8gcnRsODE4N0IKLS8qCi10eXBlZGVmIGVudW17Ci0JTE9XX1BSSU9SSVRZID0gMHgwMiwKLQlOT1JNX1BSSU9SSVRZCi0JfSBwcmlvcml0eV90OwotKi8KIC8vZm9yIHJ0bDgxODdCCiB0eXBlZGVmIGVudW17CiAJQlVMS19QUklPUklUWSA9IDB4MDEsCkBAIC0xNTQyLDYgKzE0NjgsOSBAQAogfTsKICNlbmRpZgogCit2b2lkIExlZENvbnRyb2w4MTkyU1VzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBMRURfQ1RMX01PREUgTGVkQWN0aW9uKTsKK3ZvaWQgSW5pdFN3TGVkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgRGVJbml0U3dMZWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc2hvcnQgcnRsODE5MlNVX3R4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHNob3J0IHJ0bDgxOTJTVV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKTsKIGJvb2wgRmlybXdhcmVEb3dubG9hZDkyUyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTE1NjcsNyArMTQ5Niw2IEBACiB2b2lkIHJ0bDgxOTJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwogCiB2b2lkIHJ0bDgxOTJfZGlzYXNzb2NpYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotLy92b2lkIGZpeF9yeF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBydGw4MTg1X3NldF9yZl9waW5zX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhKTsKIAogdm9pZCBydGw4MTkyX3NldF9hbmFwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhKTsKQEAgLTE1ODIsNyArMTUxMCw2IEBACiB2b2lkIHdyaXRlX3BoeV9vZmRtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOwogdm9pZCBydGw4MTg1X3R4X2FudGVubmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYW50KTsKIHZvaWQgcnRsODE5Ml9zZXRfcnhjb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotLy9zaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcHJpb3JpdHlfdCBwcmlvcml0eSk7CiBleHRlcm4gdm9pZCBydGw4MTl4dXNiX2JlYWNvbl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUxNiAgdHhfcmF0ZSk7CiB2b2lkIENhbVJlc2V0QWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CiB2b2lkIEVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfY29yZS5jCmluZGV4IDFiNjg5MDYuLjY5NzBjOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9jb3JlLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2VlcHJvbV85M2N4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICN1bmRlZiBMT09QX1RFU1QKICN1bmRlZiBEVU1QX1JYCkBAIC0xNjIsNiArMTYzLDggQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxOTJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE5Ml91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJ0bDgxOTJfbmV0ZGV2X29wczsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHJvY19uZXRkZXZfbm90aWZpZXI7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBydGw4MTkyX3VzYl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gUlRMODE5eFVfTU9EVUxFX05BTUUsCSAgICAgICAgICAvKiBEcml2ZXIgbmFtZSAgICovCkBAIC0yNTIsNTMgKzI1NSw0OSBAQAogewogCWludCBpLCBtYXhfY2hhbj0tMSwgbWluX2NoYW49LTE7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0Jc3dpdGNoIChjaGFubmVsX3BsYW4pCi0JewotCQljYXNlIENPVU5UUllfQ09ERV9GQ0M6Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX0lDOgotCQljYXNlIENPVU5UUllfQ09ERV9FVFNJOgotCQljYXNlIENPVU5UUllfQ09ERV9TUEFJTjoKLQkJY2FzZSBDT1VOVFJZX0NPREVfRlJBTkNFOgotCQljYXNlIENPVU5UUllfQ09ERV9NS0s6Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX01LSzE6Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX0lTUkFFTDoKLQkJY2FzZSBDT1VOVFJZX0NPREVfVEVMRUM6Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX01JQzoKLQkJewotCQkJRG90MTFkX0luaXQoaWVlZSk7Ci0JCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gZmFsc2U7Ci0JCQkvL2FjdHVyYWxseSA4MjI1ICYgODI1NiByZiBjaGlwIG9ubHkgc3VwcG9ydCBCLEcsMjROIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJpdi0+cmZfY2hpcCA9PSBSRl84MjI1KSB8fCAocHJpdi0+cmZfY2hpcCA9PSBSRl84MjU2KSB8fCAocHJpdi0+cmZfY2hpcCA9PSBSRl82MDUyKSkKLQkJCXsKLQkJCQltaW5fY2hhbiA9IDE7Ci0JCQkJbWF4X2NoYW4gPSAxNDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgInVua25vd24gcmYgY2hpcCwgY2FuJ3Qgc2V0IGNoYW5uZWwgbWFwIGluIGZ1bmN0aW9uOiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQl9Ci0JCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW4gIT0gMCl7Ci0JCQkJLy8gQ2xlYXIgb2xkIGNoYW5uZWwgbWFwCi0JCQkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsIHNpemVvZihHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKSk7Ci0JCQkJLy8gU2V0IG5ldyBjaGFubmVsIG1hcAotCQkJCWZvciAoaT0wO2k8Q2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW47aSsrKQotCQkJCXsKLQkJCQkJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXSA8IG1pbl9jaGFuIHx8IENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXSA+IG1heF9jaGFuKQotCQkJCQlicmVhazsKLQkJCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV1dID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKKworCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKwljYXNlIFJGXzgyMjU6CisJY2FzZSBSRl84MjU2OgorCWNhc2UgUkZfNjA1MjoKKwkJbWluX2NoYW4gPSAxOworCQltYXhfY2hhbiA9IDE0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzKCk6IHVua25vd24gcmYgY2hpcCwgY2FuJ3Qgc2V0IGNoYW5uZWwgbWFwXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKwlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW4gIT0gMCkgeworCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwKKwkJCQlzaXplb2YoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCkpOworCisJCWZvciAoaSA9IDA7IGkgPCBDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbjsgaSsrKSB7CisJCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldIDwgbWluX2NoYW4gfHwgQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldID4gbWF4X2NoYW4pCisJCQkJYnJlYWs7CisJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOwogCQl9Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU46Ci0JCXsKLQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+YkVuYWJsZWQgPSAwOy8vdGhpcyBmbGFnIGVuYWJsZWQgdG8gZm9sbG93IDExZCBjb3VudHJ5IElFIHNldHRpbmcsIG90aGVyd2lzZSwgaXQgc2hhbGwgZm9sbG93IGdsb2JhbCBkb21haW4gc2V0dGluZ3MuCi0JCQlEb3QxMWRfUmVzZXQoaWVlZSk7Ci0JCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwl9CisJc3dpdGNoIChjaGFubmVsX3BsYW4pIHsKKwljYXNlIENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOOgorCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gdHJ1ZTsKKwkJZm9yIChpID0gMTI7IGkgPD0gMTQ7IGkrKykKKwkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbaV0gPSAyOworCQlpZWVlLT5JYnNzU3RhcnRDaG5sID0gMTA7CisJCWllZWUtPmlic3NfbWF4am9pbl9jaGFsID0gMTE7CisJCWJyZWFrOworCWNhc2UgQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM6CisJCXByaW50ayhLRVJOX0lORk8gIndvcmxkIHdpZGUgMTNcbiIpOworCQlmb3IgKGkgPSAxMjsgaSA8PSAxMzsgaSsrKQorCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtpXSA9IDI7CisJCWllZWUtPklic3NTdGFydENobmwgPSAxMDsKKwkJaWVlZS0+aWJzc19tYXhqb2luX2NoYWwgPSAxMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWVlZS0+SWJzc1N0YXJ0Q2hubCA9IDE7CisJCWllZWUtPmlic3NfbWF4am9pbl9jaGFsID0gMTQ7CisJCWJyZWFrOwogCX0KIAlyZXR1cm47CiB9CkBAIC05OTEsMTUgKzk5MCwyNCBAQAogCXJldHVybiBsZW47CiB9CiAKLXZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KHZvaWQpCitpbnQgcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKIAlydGw4MTkyX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlpZiAoIXJ0bDgxOTJfcHJvYykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwcm9jX25ldGRldl9ub3RpZmllcik7CisJaWYgKHJldCkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiAKIHZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9yZW1vdmUodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHJvY19uZXRkZXZfbm90aWZpZXIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KFJUTDgxOXhVX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CiB9CiAKQEAgLTEwMjcsOCArMTAzNSw3IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMtZSIsIHByaXYtPmRpcl9kZXYpOwogCS8vCXJlbW92ZV9wcm9jX2VudHJ5KCJjY2stcmVnaXN0ZXJzIixwcml2LT5kaXJfZGV2KTsKIAkvLwlyZW1vdmVfcHJvY19lbnRyeSgib2ZkbS1yZWdpc3RlcnMiLHByaXYtPmRpcl9kZXYpOwotCQkvL3JlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgcnRsODE5Ml9wcm9jKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIndsYW4wIiwgcnRsODE5Ml9wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocHJpdi0+ZGlyX2Rldi0+bmFtZSwgcnRsODE5Ml9wcm9jKTsKIAkJcHJpdi0+ZGlyX2RldiA9IE5VTEw7CiAJfQogfQpAQCAtMTE0NSw2ICsxMTUyLDI1IEBACiAJCSAgICAgIGRldi0+bmFtZSk7CiAJfQogfQorCitzdGF0aWMgaW50IHByb2NfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcHRyOworCisJaWYgKG5ldF9kZXYtPm5ldGRldl9vcHMgPT0gJnJ0bDgxOTJfbmV0ZGV2X29wcyAmJgorCSAgICBldmVudCA9PSBORVRERVZfQ0hBTkdFTkFNRSkgeworCQlydGw4MTkyX3Byb2NfcmVtb3ZlX29uZShuZXRfZGV2KTsKKwkJcnRsODE5Ml9wcm9jX2luaXRfb25lKG5ldF9kZXYpOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcm9jX25ldGRldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHByb2NfbmV0ZGV2X2V2ZW50LAorfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTUlTQyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzM1NSw2ICs3MzgxLDggQEAKICAgICAgICAgUlRfVFJBQ0UoQ09NUF9JTklULCAiT29wczogaSdtIGNvbWluZ1xuIik7CiAKIAlkZXYgPSBhbGxvY19pZWVlODAyMTEoc2l6ZW9mKHN0cnVjdCByODE5Ml9wcml2KSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZpbnRmLT5kZXYpOwpAQCAtNzM5Miw3ICs3NDIwLDggQEAKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAotCXJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBmYWlsOwogCVJUX1RSQUNFKENPTVBfSU5JVCwgImRldiBuYW1lPT09PT09PT4gJXNcbiIsZGV2LT5uYW1lKTsKIAlydGw4MTkyX3Byb2NfaW5pdF9vbmUoZGV2KTsKIApAQCAtNzQ3NCwzNSArNzUwMyw2MyBAQAogCXJldCA9IGllZWU4MDIxMV9jcnlwdG9faW5pdCgpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZmFpbF9jcnlwdG87CiAJfQogCiAJcmV0ID0gaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKSBmYWlsZWQgJWRcbiIsCiAJCQlyZXQpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGZhaWxfY3J5cHRvX3RraXA7CiAJfQogCiAJcmV0ID0gaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKSBmYWlsZWQgJWRcbiIsCiAJCQlyZXQpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGZhaWxfY3J5cHRvX2NjbXA7CiAJfQogCiAJcmV0ID0gaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCgpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGZhaWxfY3J5cHRvX3dlcDsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxOTIgYmFzZWQgV0xBTiBjYXJkc1xuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDA3LTIwMDgsIFJlYWxzaWwgV2xhblxuIik7CiAJUlRfVFJBQ0UoQ09NUF9JTklULCAiSW5pdGlhbGl6aW5nIG1vZHVsZSIpOwogCVJUX1RSQUNFKENPTVBfSU5JVCwgIldpcmVsZXNzIGV4dGVuc2lvbnMgdmVyc2lvbiAlZCIsIFdJUkVMRVNTX0VYVCk7Ci0JcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KCk7Ci0JcmV0dXJuIHVzYl9yZWdpc3RlcigmcnRsODE5Ml91c2JfZHJpdmVyKTsKKworCXJldCA9IHJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJydGw4MTkyX3Byb2NfbW9kdWxlX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCWdvdG8gZmFpbF9wcm9jOworCX0KKworCXJldCA9IHVzYl9yZWdpc3RlcigmcnRsODE5Ml91c2JfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigidXNiX3JlZ2lzdGVyKCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWxfdXNiOworCX0KKworCXJldHVybiAwOworCitmYWlsX3VzYjoKKwlydGw4MTkyX3Byb2NfbW9kdWxlX3JlbW92ZSgpOworZmFpbF9wcm9jOgorCWllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQoKTsKK2ZhaWxfY3J5cHRvX3dlcDoKKwlpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCgpOworZmFpbF9jcnlwdG9fY2NtcDoKKwlpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCgpOworZmFpbF9jcnlwdG9fdGtpcDoKKwlpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCgpOworZmFpbF9jcnlwdG86CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCWllZWU4MDIxMV9kZWJ1Z19leGl0KCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9kbS5jCmluZGV4IGZhNWUyNDQuLmNlN2UxZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfZG0uYwpAQCAtMjY3Myw3ICsyNjczLDYgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOwotCS8vUFNUQV9RT1MJCQlwU3RhUW9zID0gcE1nbnRJbmZvLT5wU3RhUW9zOwogCiAJLy8gS2VlcCBwYXN0IFR4L1J4IHBhY2tldCBjb3VudCBmb3IgUlQtdG8tUlQgRURDQSB0dXJiby4KIAlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCWxhc3RUeE9rQ250ID0gMDsKQEAgLTI2ODEsMTAgKzI2ODAsOCBAQAogCXVuc2lnbmVkIGxvbmcJCQkJY3VyVHhPa0NudCA9IDA7CiAJdW5zaWduZWQgbG9uZwkJCQljdXJSeE9rQ250ID0gMDsKIAotCS8vCi0JLy8gRG8gbm90IGJlIFR1cmJvIGlmIGl0J3MgdW5kZXIgV2lGaSBjb25maWcgYW5kIFFvcyBFbmFibGVkLCBiZWNhdXNlIHRoZSBFRENBIHBhcmFtZXRlcnMKLQkvLyBzaG91bGQgZm9sbG93IHRoZSBzZXR0aW5ncyBmcm9tIFFBUC4gQnkgQnJ1Y2UsIDIwMDctMTItMDcuCi0JLy8KKwl1MzIJCQkJRURDQV9CRV9VTCA9IGVkY2Ffc2V0dGluZ19VTFtwSFRJbmZvLT5JT1RQZWVyXTsKKwl1MzIJCQkJRURDQV9CRV9ETCA9IGVkY2Ffc2V0dGluZ19ETFtwSFRJbmZvLT5JT1RQZWVyXTsKIAkjaWYgMQogCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKIAkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwpAQCAtMjY5Myw2ICsyNjkwLDE0IEBACiAJaWYocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0RJU0FCTEVfRURDQV9UVVJCTykKIAkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwogCisJaWYocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0ZPUkNFRF9FTkFCTEVfQkVfVFhPUCkKKwl7CisJCWlmKCEoRURDQV9CRV9VTCAmIDB4ZmZmZjAwMDApKQorCQkJRURDQV9CRV9VTCB8PSAweDAwNWUwMDAwOworCQlpZighKEVEQ0FfQkVfREwgJiAweGZmZmYwMDAwKSkKKwkJCUVEQ0FfQkVfREwgfD0gMHgwMDVlMDAwMDsKKwl9CisKIAl7CiAJCXU4KiBwZWVybmFtZVsxMV0gPSB7InVua25vd24iLCAicmVhbHRlayIsICJyZWFsdGVrXzkyc2UiLCAiYnJvYWRjb20iLCAicmFsaW5rIiwgImF0aGVyb3MiLCAiY2lzY28iLCAibWFydmVsbCIsICI5MnVfc29mdGFwIiwgInNlbGZfc29mdGFwIn07CiAJCXN0YXRpYyBpbnQgd2JfdG1wID0gMDsKQEAgLTI3MTQsNyArMjcxOSw3IEBACiAJCQl7CiAJCQkJaWYocHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fCAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKIAkJCQl7Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCBlZGNhX3NldHRpbmdfVUxbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwgRURDQV9CRV9VTCk7CiAJCQkJCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSBmYWxzZTsKIAkJCQl9CiAJCQl9CkBAIC0yNzIyLDcgKzI3MjcsNyBAQAogCQkJewogCQkJCWlmKCFwcml2LT5iaXNfY3VyX3JkbHN0YXRlIHx8ICFwcml2LT5iY3VycmVudF90dXJib19FRENBKQogCQkJCXsKLQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfQkUsIGVkY2Ffc2V0dGluZ19ETFtwSFRJbmZvLT5JT1RQZWVyXSk7CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCBFRENBX0JFX0RMKTsKIAkJCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IHRydWU7CiAJCQkJfQogCQkJfQpAQCAtMjczNCw3ICsyNzM5LDcgQEAKIAkJCXsKIAkJCQlpZighcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fCAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKIAkJCQl7Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCBlZGNhX3NldHRpbmdfRExbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwgRURDQV9CRV9ETCk7CiAJCQkJCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSB0cnVlOwogCQkJCX0KIAkJCX0KQEAgLTI3NDIsNyArMjc0Nyw3IEBACiAJCQl7CiAJCQkJaWYocHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fCAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKIAkJCQl7Ci0JCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCBlZGNhX3NldHRpbmdfVUxbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwgRURDQV9CRV9VTCk7CiAJCQkJCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSBmYWxzZTsKIAkJCQl9CiAJCQl9CkBAIC0yNzcxLDcgKzI3NzYsNyBAQAogCQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19tYXhbMF0pKTw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKXwKIAkJCQkJKCgodTMyKShxb3NfcGFyYW1ldGVycy0+Y3dfbWluWzBdKSk8PCBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCl8CiAJCQkJCSgodTMyKXUxYkFJRlMgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKLQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgV0RDQVBBUkFfQUREW2ldLCB1NGJBY1BhcmFtKTsKKwogCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCAgdTRiQWNQYXJhbSk7CiAKIAkJCS8vIENoZWNrIEFDTSBiaXQuCkBAIC0yNzgwLDcgKzI3ODUsNyBAQAogCQkJLy8gVE9ETzogIE1vZGlmaWVkIHRoaXMgcGFydCBhbmQgdHJ5IHRvIHNldCBhY20gY29udHJvbCBpbiBvbmx5IDEgSU8gcHJvY2Vzc2luZyEhCiAKIAkJCQkJUEFDSV9BSUZTTglwQWNpQWlmc24gPSAoUEFDSV9BSUZTTikmKHFvc19wYXJhbWV0ZXJzLT5haWZzWzBdKTsKLQkJCQkJdTgJCUFjbUN0cmwgPSByZWFkX25pY19ieXRlKCBkZXYsIEFjbUh3Q3RybCApOworCQkJCQl1OAkJQWNtQ3RybCA9IHByaXYtPkFjbUNvbnRyb2wgfCAweDE7CiAJCQkJCWlmKCBwQWNpQWlmc24tPmYuQUNNICkKIAkJCQkJeyAvLyBBQ00gYml0IGlzIDEuCiAJCQkJCQlBY21DdHJsIHw9IEFjbUh3X0JlcUVuOwpAQCAtMjgwNCw3ICsyODA5LDcgQEAKIAlwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzID0gZmFsc2U7CiAJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKIAlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OwotfQkvLyBkbV9DaGVja0VkY2FUdXJibworfQogI2VuZGlmCiAKIGV4dGVybiB2b2lkIERNX0NUU1RvU2VsZlNldHRpbmcoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsdTMyIERNX1R5cGUsIHUzMiBETV9WYWx1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV93eC5jCmluZGV4IGE3Y2M2ZjkuLjIwMDViODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfd3guYwpAQCAtMSwyMSArMSwyMyBAQAotLyoKLSAgIFRoaXMgZmlsZSBjb250YWlucyB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMuCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIFJUTDgxOTJVCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCi0gICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydAotICAgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCi0gICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KLQotICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCi0gICBwcm9qZWN0IEF1dGhvcnMuCi0qLwogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSAicjgxOTJVLmgiCkBAIC0yNDgsNiArMjUwLDcgQEAKICAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpsYXRlc3QgPSBOVUxMOwogCWludCBuYW1lX2xlbjsKIAogICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMjU5LDEzICsyNjIsMjAgQEAKICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoICh0YXJnZXQtPnNzaWRfbGVuID09IG5hbWVfbGVuKSAmJgogCQkgICAgIChzdHJuY21wKHRhcmdldC0+c3NpZCwgKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlciwgbmFtZV9sZW4pPT0wKSl7Ci0JCQlpZih0YXJnZXQtPndwYV9pZV9sZW4+MCB8fCB0YXJnZXQtPnJzbl9pZV9sZW4+MCApCi0JCQkJLy9zZXQgZmxhZ3M9MSB0byBpbmRpY2F0ZSB0aGlzIGFwIGlzIFdQQQotCQkJCXdycXUtPmRhdGEuZmxhZ3MgPSAxOwotCQkJZWxzZSB3cnF1LT5kYXRhLmZsYWdzID0gMDsKKwkJCWlmICgobGF0ZXN0ID09IE5VTEwpIHx8KHRhcmdldC0+bGFzdF9zY2FubmVkID4gbGF0ZXN0LT5sYXN0X3NjYW5uZWQpKQorCQkJCWxhdGVzdCA9IHRhcmdldDsKIAorCQl9CisgICAgICAgIH0KIAotCQlicmVhazsKKyAgICAgICAgaWYobGF0ZXN0ICE9IE5VTEwpCisgICAgICAgIHsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBsYXRlc3QtPlNpZ25hbFN0cmVuZ3RoOworCisJCWlmKGxhdGVzdC0+d3BhX2llX2xlbj4wIHx8IGxhdGVzdC0+cnNuX2llX2xlbj4wICkgeworCQkJd3JxdS0+ZGF0YS5mbGFncyA9IDE7CisJCX0gZWxzZSB7CisJCQl3cnF1LT5kYXRhLmZsYWdzID0gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDYwLDE0ICs0NzAsNiBAQAogCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwogCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE2OwogCi0vLwlyYW5nZS0+cmV0cnlfY2FwYTsJLyogV2hhdCByZXRyeSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KLS8vCXJhbmdlLT5yZXRyeV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpbWl0ICovCi0vLwlyYW5nZS0+cl90aW1lX2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGlmZSAqLwotLy8JcmFuZ2UtPm1pbl9yZXRyeTsJLyogTWluaW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLwotLy8JcmFuZ2UtPm1heF9yZXRyeTsJLyogTWF4aW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLwotLy8JcmFuZ2UtPm1pbl9yX3RpbWU7CS8qIE1pbmltYWwgcmV0cnkgbGlmZXRpbWUgKi8KLS8vCXJhbmdlLT5tYXhfcl90aW1lOwkvKiBNYXhpbWFsIHJldHJ5IGxpZmV0aW1lICovCi0KIAogCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7CiAKQEAgLTEwMTEsNiArMTAxMyw3MCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Bta2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGl3X3Bta3NhKiAgcFBNSyA9IChzdHJ1Y3QgaXdfcG1rc2EqKWV4dHJhOworCWludAlpbnRSZXR1cm4gPSBmYWxzZTsKKworCXN3aXRjaCAocFBNSy0+Y21kKQorCXsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BNS0lEX0NBQ0hFOyBpKyspCisJCQl7CisJCQkJaWYgKG1lbWNtcChpZWVlLT5QTUtJRExpc3RbaV0uQnNzaWQsIHBQTUstPmJzc2lkLnNhX2RhdGEsIEVUSF9BTEVOKSA9PSAwKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkJbWVtY3B5KGllZWUtPlBNS0lETGlzdFtpXS5QTUtJRCwgcFBNSy0+cG1raWQsIElXX1BNS0lEX0xFTik7CisJCQkJCW1lbWNweShpZWVlLT5QTUtJRExpc3RbaV0uQnNzaWQsIHBQTUstPmJzc2lkLnNhX2RhdGEsIEVUSF9BTEVOKTsKKwkJCQkJaWVlZS0+UE1LSURMaXN0W2ldLmJVc2VkID0gdHJ1ZTsKKwkJCQkJaW50UmV0dXJuID0gdHJ1ZTsKKwkJCQkJZ290byBfX0VYSVRfXzsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUE1LSURfQ0FDSEU7IGkrKykKKwkJCXsKKwkJCQlpZiAoaWVlZS0+UE1LSURMaXN0W2ldLmJVc2VkID09IGZhbHNlKQorCQkJCXsKKwkJCQkJbWVtY3B5KGllZWUtPlBNS0lETGlzdFtpXS5QTUtJRCwgcFBNSy0+cG1raWQsIElXX1BNS0lEX0xFTik7CisJCQkJCW1lbWNweShpZWVlLT5QTUtJRExpc3RbaV0uQnNzaWQsIHBQTUstPmJzc2lkLnNhX2RhdGEsIEVUSF9BTEVOKTsKKwkJCQkJaWVlZS0+UE1LSURMaXN0W2ldLmJVc2VkID0gdHJ1ZTsKKwkJCQkJaW50UmV0dXJuID0gdHJ1ZTsKKwkJCQkJZ290byBfX0VYSVRfXzsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUE1LSURfQ0FDSEU7IGkrKykKKwkJCXsKKwkJCQlpZiAobWVtY21wKGllZWUtPlBNS0lETGlzdFtpXS5Cc3NpZCwgcFBNSy0+YnNzaWQuc2FfZGF0YSwgRVRIX0FMRU4pID09IHRydWUpCisJCQkJeworCQkJCQltZW1zZXQoJmllZWUtPlBNS0lETGlzdFtpXSwgMHgwMCwgc2l6ZW9mKFJUX1BNS0lEX0xJU1QpKTsKKwkJCQkJaW50UmV0dXJuID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCSAgICAgICAgfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJCW1lbXNldCgmaWVlZS0+UE1LSURMaXN0WzBdLCAweDAwLCAoc2l6ZW9mKFJUX1BNS0lEX0xJU1QpICogTlVNX1BNS0lEX0NBQ0hFKSk7CisgICAgICAgICAgICBpbnRSZXR1cm4gPSB0cnVlOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworX19FWElUX186CisJcmV0dXJuIChpbnRSZXR1cm4pOworCit9CisKIHN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqZGF0YSwgY2hhciAqZXh0cmEpCkBAIC0xMDkzLDcgKzExNTksNyBAQAogCU5VTEwsLy9yODE5Ml93eF9nZXRfYXV0aCwvL05VTEwsIAkJCS8qIFNJT0NTSVdBVVRIICovCiAJcjgxOTJfd3hfc2V0X2VuY19leHQsIAkJCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KIAlOVUxMLC8vcjgxOTJfd3hfZ2V0X2VuY19leHQsLy9OVUxMLCAJCQkvKiBTSU9DU0lXRU5DT0RFRVhUICovCi0JTlVMTCwgCQkJLyogU0lPQ1NJV1BNS1NBICovCisJcjgxOTJfd3hfc2V0X3Bta2lkLCAvKiBTSU9DU0lXUE1LU0EgKi8KIAlOVUxMLCAJCQkgLyotLS1ob2xlLS0tKi8KIAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOXhVX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKaW5kZXggYThlOWQyZC4uN2FiOWUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKQEAgLTEsMTMgKzEsMjIgQEAKLS8qCi0gKiAoYykgQ29weXJpZ2h0IDIwMDgsIFJlYWxURUsgVGVjaG5vbG9naWVzIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogTGludXggZGV2aWNlIGRyaXZlciBmb3IgUlRMODE5MlUKICAqCi0gKiBNb2R1bGU6IHI4MTl4dXNiX2NtZHBrdC5jCi0gKiAoUlRMODE5MCBUWC9SWCBjb21tYW5kIHBhY2tldCBoYW5kbGVyIFNvdXJjZSBDIEZpbGUpCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgogICoKLSAqIE5vdGU6IFRoZSBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIFRYIGFuZCBSWCBjb21tYW5kIHBhY2tldC4KLSAqIDEuVFg6IFNlbmQgc2V0IGFuZCBxdWVyeSBjb25maWd1cmF0aW9uIGNvbW1hbmQgcGFja2V0LgotICogMi5SWDogUmVjZWl2ZSB0eCBmZWVkYmFjaywgYmVhY29uIHN0YXRlLCBxdWVyeSBjb25maWd1cmF0aW9uLCBjb21tYW5kIHBhY2tldC4KLSAqLworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAicjgxOTJVLmgiCiAjaW5jbHVkZSAicjgxOXhVX2NtZHBrdC5oIgogCkBAIC0xOSwxOSArMjgsMTMgQEAKIAljYl9kZXNjCQkgICAgKnRjYl9kZXNjOwogCXVuc2lnbmVkIGNoYXIJICAgICpwdHJfYnVmOwogCi0JLyogUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOyAqLwotCiAJLyoKIAkgKiBHZXQgVENCIGFuZCBsb2NhbCBidWZmZXIgZnJvbSBjb21tb24gcG9vbC4KIAkgKiAoSXQgaXMgc2hhcmVkIGJ5IENtZFEsIE1nbnRRLCBhbmQgVVNCIGNvYWxlc2NlIERhdGFRKQogCSAqLwogCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKFVTQl9IV0RFU0NfSEVBREVSX0xFTiArIERhdGFMZW4gKyA0KTsKLQlpZiAoc2tiID09IE5VTEwpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIoJXMpOiB1bmFibGUgdG8gYWxsb2Mgc2tiIGJ1ZmZlclxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQlydFN0YXR1cyA9IGZhbHNlOwotCQlyZXR1cm4gcnRTdGF0dXM7Ci0JfQorCWlmICghc2tiKQorCQlyZXR1cm4gZmFsc2U7CiAJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCAmZGV2LCBzaXplb2YoZGV2KSk7CiAJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwogCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOwpAQCAtNTEsNyArNTQsNiBAQAogCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CiAJCX0KIAotCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOwogCXJldHVybiBydFN0YXR1czsKIH0KIApAQCAtMjI0LDcgKzIyNiw2IEBACiAJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CiAJCS8vMiBtYXliZSBuZWVkIGVuZGlhbiB0cmFuc2Zvcm0/CiAJCXJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMgPSAqKCh1MzIgKikocG1zZyArIDQpKTsKLQkJLy9yeF9pbnRyX3N0YXR1cy5JbnRlcnJ1cHRTdGF0dXMgPSBOMkg0QllURSgqKChVSU5UMzIgKikocE1zZyArIDQpKSk7CiAKIAkJRE1FU0coImludGVycnVwdCBzdGF0dXMgPSAweCV4XG4iLCByeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzKTsKIApAQCAtNDkxLDYgKzQ5MiwxMyBAQAogCQkJY21wa19oYW5kbGVfdHhfcmF0ZV9oaXN0b3J5KGRldiwgcGNtZF9idWZmKTsKIAkJCWNtZF9sZW5ndGggPSBDTVBLX1RYX1JBSElTX1NJWkU7CiAJCQlicmVhazsKKwkJY2FzZSBSWF9UWF9UU1NJX01FQU5fQkFDSzoKKwkJCXsKKwkJCQl1MzIJKnBNc2c7CisJCQkJcE1zZyA9ICh1MzIgKilwY21kX2J1ZmY7CisJCQl9CisJCQljbWRfbGVuZ3RoID0gMzI7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCSBSVF9UUkFDRShDT01QX0VSUiwgIiglcyk6IHVua25vd24gQ01EIEVsZW1lbnRcbiIsCiAJCQkJCQkJCV9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOXhVX2NtZHBrdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmgKaW5kZXggZDNjNTYxNS4uOTU4ODViZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmgKQEAgLTE3Myw2ICsxNzMsNyBAQAogICAgIFJYX0RCR0lORk9fRkVFREJBQ0sgPSA1LAogICAgIFJYX1RYX1BFUl9QS1RfRkVFREJBQ0sgPSA2LAogICAgIFJYX1RYX1JBVEVfSElTVE9SWSA9IDcsCisgICAgUlhfVFhfVFNTSV9NRUFOX0JBQ0sgPSA4LAogICAgIFJYX0NNRF9FTEVfTUFYCiB9IGNtcGtfZWxlbWVudF9lOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9LY29uZmlnCmluZGV4IDA0MzljOTAuLjI4OTY5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9LY29uZmlnCkBAIC0zLDUgKzMsNiBAQAogCWRlcGVuZHMgb24gUENJICYmIFdMQU4gJiYgVVNCCiAJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBXRVhUX1BSSVYKKwlzZWxlY3QgQ1JZUFRPCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCmluZGV4IDA4NTFiOWQuLmQ5OWNjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvZG90MTFkLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIF9fSU5DX0RPVDExRF9ICiAKICNpZmRlZiBFTkFCTEVfRE9UMTFECi0jaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaW5jbHVkZSAiaWVlZTgwMjExL2llZWU4MDIxMS5oIgogCiAKIHR5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3MjYxMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTk1ICswLDAgQEAKLS8qCi0gKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKLSAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCi0gKgotICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcwotICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCi0gKiA8amttYWxpbmVAY2MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqCi0gKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKLSAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCi0gKgotICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbwotICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgSUVFRTgwMjExX0gKLSNkZWZpbmUgSUVFRTgwMjExX0gKLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLQotI2luY2x1ZGUgImllZWU4MDIxMS9ydGw4MTl4X0hULmgiCi0jaW5jbHVkZSAiaWVlZTgwMjExL3J0bDgxOXhfQkEuaCIKLSNpbmNsdWRlICJpZWVlODAyMTEvcnRsODE5eF9UUy5oIgotCi0KLSNpZm5kZWYgSVdfTU9ERV9NT05JVE9SCi0jZGVmaW5lIElXX01PREVfTU9OSVRPUiA2Ci0jZW5kaWYKLQotI2lmbmRlZiBJV0VWQ1VTVE9NCi0jZGVmaW5lIElXRVZDVVNUT00gMHg4YzAyCi0jZW5kaWYKLQotCi0jaWZuZGVmIGNvbnRhaW5lcl9vZgotLyoqCi0gKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcHRyOiAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KLSAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgotICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCi0gKgotICovCi0jZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAotCWNvbnN0IHR5cGVvZigoKHR5cGUgKikwKS0+bWVtYmVyKSAoKl9fbXB0ciA9IChwdHIpKTsgICAgXAotCSh0eXBlICopKChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSk7IH0pCi0jZW5kaWYKLQotI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCi0jZGVmaW5lIEtFWV9UWVBFX1dFUDQwCQkweDEKLSNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCi0jZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAotI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQotCi0vKiBhZGRlZCBmb3IgcnRsODE5eCB0eCBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgTUFYX1FVRVVFX1NJWkUJCTB4MTAKLQotLyoKLSAqIDgxOTAgcXVldWUgbWFwcGluZwotICovCi0jZGVmaW5lIEJLX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQkVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBWSV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFZPX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSENDQV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBUWENNRF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1HTlRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgSElHSF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBCRUFDT05fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0KLSNkZWZpbmUgTE9XX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfUVVFVUUKLSNkZWZpbmUgTk9STUFMX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgTUdOVF9RVUVVRQotCi0vKiBhZGRlZCBieSBhbXkgZm9yIHBzICovCi0jZGVmaW5lIFNXUkZfVElNRU9VVAkJCQk1MAotCi0vKiBhZGRlZCBieSBhbXkgZm9yIExFQVAgcmVsYXRlZCAqLwotI2RlZmluZSBJRV9DSVNDT19GTEFHX1BPU0lUSU9OCQkweDA4CS8qIEZsYWcgYnl0ZTogYnl0ZSA4LCBudW1iZXJlZCBmcm9tIDAuICovCi0jZGVmaW5lIFNVUFBPUlRfQ0tJUF9NSUMJCQkweDA4CS8qIGJpdDMgKi8KLSNkZWZpbmUgU1VQUE9SVF9DS0lQX1BLCQkJMHgxMAkvKiBiaXQ0ICovCi0vKiBkZWZpbmVkIGZvciBza2IgY2IgZmllbGQgKi8KLS8qIEF0IG1vc3QgMjggYnl0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgY2JfZGVzYyB7Ci0JLyogVHggRGVzYyBSZWxhdGVkIGZsYWdzICg4LTkpICovCi0JdTggYkxhc3RJbmlQa3Q6MTsKLQl1OCBiQ21kT3JJbml0OjE7Ci0JdTggYkZpcnN0U2VnOjE7Ci0JdTggYkxhc3RTZWc6MTsKLQl1OCBiRW5jcnlwdDoxOwotCXU4IGJUeERpc2FibGVSYXRlRmFsbEJhY2s6MTsKLQl1OCBiVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU6MTsKLQl1OCBiSHdTZWM6MTsgLyogaW5kaWNhdGUgd2hldGhlciB1c2UgSHcgc2VjdXJpdHkuIFdCICovCi0KLQl1OCByZXNlcnZlZDE7Ci0KLQkvKiBUeCBGaXJtd2FyZSBSZWxhZ2VkIGZsYWdzICgxMC0xMSkqLwotCXU4IGJDVFNFbmFibGU6MTsKLQl1OCBiUlRTRW5hYmxlOjE7Ci0JdTggYlVzZVNob3J0R0k6MTsKLQl1OCBiVXNlU2hvcnRQcmVhbWJsZToxOwotCXU4IGJUeEVuYWJsZUZ3Q2FsY0R1cjoxOwotCXU4IGJBTVBEVUVuYWJsZToxOwotCXU4IGJSVFNTVEJDOjE7Ci0JdTggUlRTU0M6MTsKLQotCXU4IGJSVFNCVzoxOwotCXU4IGJQYWNrZXRCVzoxOwotCXU4IGJSVFNVc2VTaG9ydFByZWFtYmxlOjE7Ci0JdTggYlJUU1VzZVNob3J0R0k6MTsKLQl1OCBiTXVsdGljYXN0OjE7Ci0JdTggYkJyb2FkY2FzdDoxOwotCXU4IGRydl9hZ2dfZW5hYmxlOjE7Ci0JdTggcmVzZXJ2ZWQyOjE7Ci0KLQkvKiBUeCBEZXNjIHJlbGF0ZWQgZWxlbWVudCgxMi0xOSkgKi8KLQl1OCByYXRhX2luZGV4OwotCXU4IHF1ZXVlX2luZGV4OwotCXUxNiB0eGJ1Zl9zaXplOwotCXU4IFJBVFJJbmRleDsKLQl1OCByZXNlcnZlZDY7Ci0JdTggcmVzZXJ2ZWQ3OwotCXU4IHJlc2VydmVkODsKLQotCS8qIFR4IGZpcm13YXJlIHJlbGF0ZWQgZWxlbWVudCgyMC0yNykgKi8KLQl1OCBkYXRhX3JhdGU7Ci0JdTggcnRzX3JhdGU7Ci0JdTggYW1wZHVfZmFjdG9yOwotCXU4IGFtcGR1X2RlbnNpdHk7Ci0JdTggRHJ2QWdnck51bTsKLQl1MTYgcGt0X3NpemU7Ci0JdTggcmVzZXJ2ZWQxMjsKLX0gY2JfZGVzYywgKnBjYl9kZXNjOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNR05fMU0gICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIE1HTl8yTSAgICAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTUdOXzVfNU0gICAgICAgICAgICAgICAgMHgwYgotI2RlZmluZSBNR05fMTFNICAgICAgICAgICAgICAgICAweDE2Ci0KLSNkZWZpbmUgTUdOXzZNICAgICAgICAgICAgICAgICAgMHgwYwotI2RlZmluZSBNR05fOU0gICAgICAgICAgICAgICAgICAweDEyCi0jZGVmaW5lIE1HTl8xMk0gICAgICAgICAgICAgICAgIDB4MTgKLSNkZWZpbmUgTUdOXzE4TSAgICAgICAgICAgICAgICAgMHgyNAotI2RlZmluZSBNR05fMjRNICAgICAgICAgICAgICAgICAweDMwCi0jZGVmaW5lIE1HTl8zNk0gICAgICAgICAgICAgICAgIDB4NDgKLSNkZWZpbmUgTUdOXzQ4TSAgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBNR05fNTRNICAgICAgICAgICAgICAgICAweDZjCi0KLSNkZWZpbmUgTUdOX01DUzAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBNR05fTUNTMSAgICAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIE1HTl9NQ1MyICAgICAgICAgICAgICAgIDB4ODIKLSNkZWZpbmUgTUdOX01DUzMgICAgICAgICAgICAgICAgMHg4MwotI2RlZmluZSBNR05fTUNTNCAgICAgICAgICAgICAgICAweDg0Ci0jZGVmaW5lIE1HTl9NQ1M1ICAgICAgICAgICAgICAgIDB4ODUKLSNkZWZpbmUgTUdOX01DUzYgICAgICAgICAgICAgICAgMHg4NgotI2RlZmluZSBNR05fTUNTNyAgICAgICAgICAgICAgICAweDg3Ci0jZGVmaW5lIE1HTl9NQ1M4ICAgICAgICAgICAgICAgIDB4ODgKLSNkZWZpbmUgTUdOX01DUzkgICAgICAgICAgICAgICAgMHg4OQotI2RlZmluZSBNR05fTUNTMTAgICAgICAgICAgICAgICAweDhhCi0jZGVmaW5lIE1HTl9NQ1MxMSAgICAgICAgICAgICAgIDB4OGIKLSNkZWZpbmUgTUdOX01DUzEyICAgICAgICAgICAgICAgMHg4YwotI2RlZmluZSBNR05fTUNTMTMgICAgICAgICAgICAgICAweDhkCi0jZGVmaW5lIE1HTl9NQ1MxNCAgICAgICAgICAgICAgIDB4OGUKLSNkZWZpbmUgTUdOX01DUzE1ICAgICAgICAgICAgICAgMHg4ZgotCi0vKgotICoJCTgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFJlYXNvbiBDb2RlIGZpZWxkCi0gKi8KLWVudW0JX1JlYXNvbkNvZGV7Ci0JdW5zcGVjX3JlYXNvbgk9IDB4MSwKLQlhdXRoX25vdF92YWxpZAk9IDB4MiwKLQlkZWF1dGhfbHZfc3MJPSAweDMsCi0JaW5hY3Rpdml0eQkJPSAweDQsCi0JYXBfb3ZlcmxvYWQgCT0gMHg1LAotCWNsYXNzMl9lcnIJCT0gMHg2LAotCWNsYXNzM19lcnIJCT0gMHg3LAotCWRpc2FzX2x2X3NzIAk9IDB4OCwKLQlhc29jX25vdF9hdXRoCT0gMHg5LAotCi0JLyogLS0tLU1JQ19DSEVDSyAqLwotCW1pY19mYWlsdXJlIAk9IDB4ZSwKLQkvKiAtLS0tRU5EIE1JQ19DSEVDSyAqLwotCi0JLyogUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA4MDIuMTFpIEQxMC4wIHAuMjguICovCi0JaW52YWxpZF9JRQkJPSAweDBkLAotCWZvdXJfd2F5X3Rtb3V0CT0gMHgwZiwKLQl0d29fd2F5X3Rtb3V0CT0gMHgxMCwKLQlJRV9kaXNtYXRjaCAJPSAweDExLAotCWludmFsaWRfR2NpcGhlciA9IDB4MTIsCi0JaW52YWxpZF9QY2lwaGVyID0gMHgxMywKLQlpbnZhbGlkX0FLTVAJPSAweDE0LAotCXVuc3VwX1JTTklFdmVyID0gMHgxNSwKLQlpbnZhbGlkX1JTTklFCT0gMHgxNiwKLQlhdXRoXzgwMl8xeF9mYWlsID0gMHgxNywKLQljaXBlcl9yZWplY3QJCT0gMHgxOCwKLQotCS8qIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiAqLwotCVFvU191bnNwZWMJCT0gMHgyMCwgLyogMzIgKi8KLQlRQVBfYmFuZHdpZHRoCT0gMHgyMSwgLyogMzMgKi8KLQlwb29yX2NvbmRpdGlvbgk9IDB4MjIsIC8qIDM0ICovCi0Jbm9fZmFjaWxpdHkgCT0gMHgyMywgLyogMzUgKi8KLQkJCQkJCQkvKiBXaGVyZSBpcyAzNj8/PyAqLwotCXJlcV9kZWNsaW5lZAk9IDB4MjUsIC8qIDM3ICovCi0JaW52YWxpZF9wYXJhbQk9IDB4MjYsIC8qIDM4ICovCi0JcmVxX25vdF9ob25vcmVkID0gMHgyNywJLyogMzkgKi8KLQlUU19ub3RfY3JlYXRlZAk9IDB4MkYsIC8qIDQ3ICovCi0JRExfbm90X2FsbG93ZWQJPSAweDMwLCAvKiA0OCAqLwotCWRlc3Rfbm90X2V4aXN0CT0gMHgzMSwgLyogNDkgKi8KLQlkZXN0X25vdF9RU1RBCT0gMHgzMiwgLyogNTAgKi8KLX07Ci0KLQotCi0jZGVmaW5lIGFTaWZzVGltZQkgKChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfQSkgfHwgXAotCQkocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKSB8fCBcCi0JCShwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl81RykpID8gMTYgOiAxMAotCi0jZGVmaW5lIE1HTVRfUVVFVUVfTlVNIDUKLQotI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQotI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgotI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKLSNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0Ci0KLSNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKLSNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgotI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKLSNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKLSNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1Ci0jZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2Ci0vKiBJdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMgKi8KLSNkZWZpbmUgSUVFRV9QQVJBTV9XUEFYX1NFTEVDVAkJCTcKLS8qIEFkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQotI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCi0vKiBBZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uICovCi0jZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKLSNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKLSNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgotI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKLSNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAotI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQotCi0jZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQotI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKLQotI2RlZmluZSBJRUVFX01MTUVfU1RBX0RFQVVUSAkJCTEKLSNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQwkJCTIKLQotCi0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHCQkyCi0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUREUgkJMwotI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRAk0Ci0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1Ci0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECTYKLSNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNwotCi0KLSNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgotCi0jZGVmaW5lIE1BWF9JRV9MRU4gIDB4ZmYKLQotLyogYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdCAqLwotI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMgCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllc19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCAJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3JzbAotI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyAgCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAotI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzIGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyAJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3JzbAotCi0jZGVmaW5lIGllZWU4MDIxMV9jY21wX251bGwJCWllZWU4MDIxMV9jY21wX251bGxfcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3RraXBfbnVsbAkJaWVlZTgwMjExX3RraXBfbnVsbF9yc2wKLQotI2RlZmluZSBpZWVlODAyMTFfd2VwX251bGwJCWllZWU4MDIxMV93ZXBfbnVsbF9yc2wKLQotI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICAJZnJlZV9pZWVlODAyMTFfcnNsCi0jZGVmaW5lIGFsbG9jX2llZWU4MDIxMSAgICAgICAgCQlhbGxvY19pZWVlODAyMTFfcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3J4IAkJCWllZWU4MDIxMV9yeF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9yc2wKLQotI2RlZmluZSBpZWVlODAyMTFfZ2V0X2JlYWNvbgkJaWVlZTgwMjExX2dldF9iZWFjb25fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlCQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUJCWllZWU4MDIxMV9zdG9wX3F1ZXVlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfcmVzZXRfcXVldWUJCWllZWU4MDIxMV9yZXNldF9xdWV1ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbAlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sX3JzbAotI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX2lzX3Nob3J0c2xvdAkJaWVlZTgwMjExX2lzX3Nob3J0c2xvdF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX2lzXzU0ZwkJaWVlZTgwMjExX2lzXzU0Z19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsCWllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3BzX3R4X2FjawkJaWVlZTgwMjExX3BzX3R4X2Fja19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfeG1pdAkJaWVlZTgwMjExX3NvZnRtYWNfeG1pdF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19yc2wKLSNkZWZpbmUgbm90aWZ5X3d4X2Fzc29jX2V2ZW50CQlub3RpZnlfd3hfYXNzb2NfZXZlbnRfcnNsCi0jZGVmaW5lIFNlbmREaXNhc3NvY2lhdGlvbgkJU2VuZERpc2Fzc29jaWF0aW9uX3JzbAotI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnNfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NjYW4JCWllZWU4MDIxMV9zdG9wX3NjYW5fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzX3JzbAotI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybwlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNyb19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNyb19yc2wKLQotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkCQlpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkCQlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJCWllZWU4MDIxMV93eF9zZXRfcmF0ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9yYXRlCQlpZWVlODAyMTFfd3hfZ2V0X3JhdGVfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfd2FwCQlpZWVlODAyMTFfd3hfc2V0X3dhcF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJCWllZWU4MDIxMV93eF9nZXRfd2FwX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21vZGUJCWllZWU4MDIxMV93eF9zZXRfbW9kZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9tb2RlCQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbgkJaWVlZTgwMjExX3d4X3NldF9zY2FuX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEJCWllZWU4MDIxMV93eF9nZXRfZnJlcV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9mcmVxCQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJCWllZWU4MDIxMV93eF9zZXRfcmF3dHhfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbmFtZQkJaWVlZTgwMjExX3d4X2dldF9uYW1lX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyCQlpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCQlpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcwlpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9ydHMJCWllZWU4MDIxMV93eF9zZXRfcnRzX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3J0cwkJaWVlZTgwMjExX3d4X2dldF9ydHNfcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3R4Yl9mcmVlCQlpZWVlODAyMTFfdHhiX2ZyZWVfcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9nZW5faWUJCWllZWU4MDIxMV93eF9zZXRfZ2VuX2llX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4JCWllZWU4MDIxMV93eF9nZXRfc2Nhbl9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUJCWllZWU4MDIxMV93eF9zZXRfZW5jb2RlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZQkJaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnNsCi0jaWYgV0lSRUxFU1NfRVhUID49IDE4Ci0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbWxtZQkJaWVlZTgwMjExX3d4X3NldF9tbG1lX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2F1dGgJCWllZWU4MDIxMV93eF9zZXRfYXV0aF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0CWllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0CWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dF9yc2wKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IGllZWVfcGFyYW0gewotCXUzMiBjbWQ7Ci0JdTggc3RhX2FkZHJbRVRIX0FMRU5dOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXU4IG5hbWU7Ci0JCQl1MzIgdmFsdWU7Ci0JCX0gd3BhX3BhcmFtOwotCQlzdHJ1Y3QgewotCQkJdTMyIGxlbjsKLQkJCXU4IHJlc2VydmVkWzMyXTsKLQkJCXU4IGRhdGFbMF07Ci0JCX0gd3BhX2llOwotCQlzdHJ1Y3R7Ci0JCQlpbnQgY29tbWFuZDsKLQkJCWludCByZWFzb25fY29kZTsKLQkJfSBtbG1lOwotCQlzdHJ1Y3QgewotCQkJdTggYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOXTsKLQkJCXU4IHNldF90eDsKLQkJCXUzMiBlcnI7Ci0JCQl1OCBpZHg7Ci0JCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCi0JCQl1MTYga2V5X2xlbjsKLQkJCXU4IGtleVswXTsKLQkJfSBjcnlwdDsKLQl9IHU7Ci19IGllZWVfcGFyYW07Ci0KLQotI2lmIFdJUkVMRVNTX0VYVCA8IDE3Ci0jZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAotI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKLSNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCi0jZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCi0jZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCi0jZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0Ci0jZW5kaWYKLQotCi0vKiBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlICovCi0jZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKLSNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQotCi0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAotLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgotICAgNi4yLjEuMS4yLgotCi0gICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgotICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcwotICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCi0gICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KLSNkZWZpbmUgSUVFRTgwMjExXzFBRERSX0xFTiAxMAotI2RlZmluZSBJRUVFODAyMTFfMkFERFJfTEVOIDE2Ci0jZGVmaW5lIElFRUU4MDIxMV8zQUREUl9MRU4gMjQKLSNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAzMAotI2RlZmluZSBJRUVFODAyMTFfRkNTX0xFTiAgICA0Ci0jZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCi0jZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQotI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0Ci0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0Ci0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCi0KLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCi0jZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0NlUKLQotCi0vKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLwotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDMKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYwotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZSQU1FVFlQRQkweDAwZmMKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCQkweDIwMDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfV0VQCQkweDQwMDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfT1JERVIJCTB4ODAwMAotCi0jZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9NR01UCQkweDAwMDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0NUTAkJMHgwMDA0Ci0jZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9EQVRBCQkweDAwMDgKLQotLyogbWFuYWdlbWVudCAqLwotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRCTB4MDAwMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCAJMHgwMDEwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUQkweDAwMjAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUAkweDAwMzAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUQkweDAwNDAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AJMHgwMDUwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9CRUFDT04JCTB4MDA4MAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVRJTQkJMHgwMDkwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQwkweDAwQTAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FVVEgJCTB4MDBCMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREVBVVRICQkweDAwQzAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX01BTkFHRV9BQ1QJMHgwMEQwCi0KLS8qIGNvbnRyb2wgKi8KLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1BTUE9MTAkJMHgwMEEwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SVFMJCTB4MDBCMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ1RTCQkweDAwQzAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FDSwkJMHgwMEQwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkVORAkJMHgwMEUwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkVOREFDSwkweDAwRjAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JMT0NLQUNLICAgMHgwMDk0Ci0KLS8qIGRhdGEgKi8KLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEEJCTB4MDAwMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLCQkweDAwNTAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQQkweDAwODAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMCTB4MDBDMAotCi0jZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgotI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAotCi0vKiBRT1MgY29udHJvbCAqLwotI2RlZmluZSBJRUVFODAyMTFfUUNUTF9USUQgICAgICAgICAgICAgIDB4MDAwRgotCi0jZGVmaW5lCUZDX1FPU19CSVQJCQkJCUJJVDcKLSNkZWZpbmUgSXNEYXRhRnJhbWUocGR1KQkJCSgoKHBkdVswXSAmIDB4MEMpID09IDB4MDgpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZQlJc0xlZ2FjeURhdGFGcmFtZShwZHUpCShJc0RhdGFGcmFtZShwZHUpICYmICghKHBkdVswXSZGQ19RT1NfQklUKSkpCi0KLSNkZWZpbmUgSXNRb1NEYXRhRnJhbWUocGZyYW1lKSAgKCgqKHUxNiAqKXBmcmFtZSYoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBfElFRUU4MDIxMV9GVFlQRV9EQVRBKSkgPT0gKElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQXxJRUVFODAyMTFfRlRZUEVfREFUQSkpCi0jZGVmaW5lIEZyYW1lX09yZGVyKHBmcmFtZSkgICAgICgqKHUxNiAqKXBmcmFtZSZJRUVFODAyMTFfRkNUTF9PUkRFUikKLSNkZWZpbmUgU05fTEVTUyhhLCBiKQkJKCgoYS1iKSYweDgwMCkgIT0gMCkKLSNkZWZpbmUgU05fRVFVQUwoYSwgYikJKGEgPT0gYikKLSNkZWZpbmUgTUFYX0RFVl9BRERSX1NJWkUgOAotdHlwZWRlZiBlbnVtIF9BQ1RfQ0FURUdPUll7Ci0JQUNUX0NBVF9RT1MgPSAxLAotCUFDVF9DQVRfRExTID0gMiwKLQlBQ1RfQ0FUX0JBICA9IDMsCi0JQUNUX0NBVF9IVCAgPSA3LAotCUFDVF9DQVRfV01NID0gMTcsCi19IEFDVF9DQVRFR09SWSwgKlBBQ1RfQ0FURUdPUlk7Ci0KLXR5cGVkZWYgZW51bSBfVFNfQUNUSU9OewotCUFDVF9BRERUU1JFUSA9IDAsCi0JQUNUX0FERFRTUlNQID0gMSwKLQlBQ1RfREVMVFMgICAgPSAyLAotCUFDVF9TQ0hFRFVMRSA9IDMsCi19IFRTX0FDVElPTiwgKlBUU19BQ1RJT047Ci0KLXR5cGVkZWYgZW51bSBfQkFfQUNUSU9OewotCUFDVF9BRERCQVJFUSA9IDAsCi0JQUNUX0FEREJBUlNQID0gMSwKLQlBQ1RfREVMQkEgICAgPSAyLAotfSBCQV9BQ1RJT04sICpQQkFfQUNUSU9OOwotCi10eXBlZGVmIGVudW0gX0luaXRpYWxHYWluT3BUeXBlewotCUlHX0JhY2t1cCA9IDAsCi0JSUdfUmVzdG9yZSwKLQlJR19NYXgKLX0gSW5pdGlhbEdhaW5PcFR5cGU7Ci0KLS8qIGRlYnVnIG1hY3JvcyAqLwotI2RlZmluZSBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwotZXh0ZXJuIHUzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWw7Ci0jZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCi1kbyB7IGlmIChpZWVlODAyMTFfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCi0gIHByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICIgZm10LCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKLS8qIHdiIGFkZGVkIHRvIGRlYnVnIG91dCBkYXRhIGJ1ZgotICogaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwKLSAqIHRvIERBVEF8QkEKLSAqLwotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAotCWRvIHsgaWYgKChpZWVlODAyMTFfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSA9PSAobGV2ZWwpKSB7IAlcCi0JCQlpbnQgaTsJCQkJCVwKLQkJCXU4KiBwZGF0YSA9ICh1OCAqKSBkYXRhOwkJCVwKLQkJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CVwKLQkJCWZvciAoaSA9IDA7IGkgPCAoaW50KShkYXRhbGVuKTsgaSsrKSB7CQlcCi0JCQkJcHJpbnRrKCIlMnggIiwgcGRhdGFbaV0pOwkJXAotCQkJCWlmICgoaSsxKSUxNiA9PSAwKSBcCi0JCQkJCXByaW50aygiXG4iKTsJXAotCQkJfQlcCi0JCQlwcmludGsoIlxuIik7CQkJXAotCQl9CQkJCQlcCi0JfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0RBVEEobGV2ZWwsIGRhdGEsIGRhdGFsZW4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KLQotLyogZGVidWcgbWFjcm9zIG5vdCBkZXBlbmRlbnQgb24gQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLwotCi0vKgotICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07Ci0gKgotICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQotICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgotICoKLSAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKLSAqCi0gKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKLSAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKLSAqCi0gKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKLSAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50Ci0gKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgotICoKLSAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KLSAqCi0gKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCi0gKgotICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgotICoKLSAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKLSAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCi0gKgotICovCi0KLSNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKLSNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQotI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKLSNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQotCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQotI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKLQotI2RlZmluZSBJRUVFODAyMTFfRExfSFQJCSAgICgxPDwxMCkgIC8qIEhUICovCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9CQQkJICAgKDE8PDExKSAgLyogYmEgKi8KLSNkZWZpbmUgSUVFRTgwMjExX0RMX1RTCQkgICAoMTw8MTIpICAvKiBUUyAqLwotI2RlZmluZSBJRUVFODAyMTFfRExfUU9TICAgICAgICAgICAoMTw8MTMpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9SRU9SREVSCSAgICgxPDwxNCkKLSNkZWZpbmUgSUVFRTgwMjExX0RMX0lPVAkgICAoMTw8MTUpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9JUFMJICAgKDE8PDE2KQotI2RlZmluZSBJRUVFODAyMTFfRExfVFJBQ0UJICAgKDE8PDI5KSAgLyogdHJhY2UgZnVuY3Rpb24sIG5lZWQgdG8gdXNlciBuZXRfcmF0ZWxpbWl0KCkgdG9nZXRoZXIgaW4gb3JkZXIgbm90IHRvIHByaW50IHRvbyBtdWNoIHRvIHRoZSBzY3JlZW4gKi8KLSNkZWZpbmUgSUVFRTgwMjExX0RMX0RBVEEJICAgKDE8PDMwKSAgIC8qIHVzZSB0aGlzIGZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHByaW50IGRhdGEgYnVmIG91dC4gKi8KLSNkZWZpbmUgSUVFRTgwMjExX0RMX0VSUgkgICAoMTw8MzEpICAgLyogYWx3YXlzIG9wZW4gKi8KLSNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKLQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKLSNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1FPUyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9RT1MsIGYsICMjIGEpCi0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0vKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KLSNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0Ci0vKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiBBbm5pZSwgMjAwNS0xMS0yMi4qLwotI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaCA+ICchJyAmJiBfY2ggPCAnficpCi0jZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkJCWlmICgoX0NvbXApICYgbGV2ZWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlpbnQgICAgICAgICAgICAgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCXU4ICBidWZmZXJbTUFYX1NUUl9MRU5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JCQkJaW50IGxlbmd0aCA9IChfTGVuIDwgTUFYX1NUUl9MRU4pID8gX0xlbiA6IChNQVhfU1RSX0xFTiAtIDEpOyAgCVwKLQkJCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgIAkJXAotCQkJCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCk7ICAgICAgICAgICAgCQlcCi0JCQkJZm9yIChfX2kgPSAwOyBfX2kgPCBNQVhfU1RSX0xFTjsgX19pKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJICAgICBpZiAoIVBSSU5UQUJMRShidWZmZXJbX19pXSkpICAgXAotCQkJCQkJYnVmZmVyW19faV0gPSAnPyc7ICAgICAJXAotCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlwcmludGsoIlJ0bDgxOXg6ICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkJCQlwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIGJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCX0KLSNlbHNlCi0jZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCi0KLSNpZm5kZWYgV0lSRUxFU1NfU1BZCi0jZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogZW5hYmxlIGl3c3B5IHN1cHBvcnQgKi8KLSNlbmRpZgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8qIG5ldyBkcml2ZXIgQVBJICovCi0KLSNpZm5kZWYgRVRIX1BfUEFFCi0jZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KLSNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KLQotI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCi0KLSNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCi0jZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKLSNlbmRpZgotCi0vKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCi0KLSNkZWZpbmUgUDgwMjExX09VSV9MRU4gMwotCi1zdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKLQotCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KLQl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCi0JdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLwotCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLwotCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCi0KLSNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQotI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQotI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKLQotI2RlZmluZSBXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFKQotI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCi0jZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLQotLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLwotI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCi0jZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKLSNkZWZpbmUgV0xBTl9BVVRIX0xFQVAgMgotCi0jZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAotCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1FPUyAoMTw8OSkKLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfRFNTU19PRkRNICgxPDwxMykKLQotLyogODAyLjExZyBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotI2RlZmluZSBXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgKDE8PDApCi0jZGVmaW5lIFdMQU5fRVJQX1VTRV9QUk9URUNUSU9OICgxPDwxKQotI2RlZmluZSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUgKDE8PDIpCi0KLS8qIFN0YXR1cyBjb2RlcyAqLwotZW51bSBpZWVlODAyMTFfc3RhdHVzY29kZSB7Ci0JV0xBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCi0JV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA9IDEsCi0JV0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCA9IDEwLAotCVdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgPSAxMSwKLQlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDID0gMTIsCi0JV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRyA9IDEzLAotCVdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiA9IDE0LAotCVdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMID0gMTUsCi0JV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUID0gMTYsCi0JV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBID0gMTcsCi0JV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTID0gMTgsCi0JLyogODAyLjExYiAqLwotCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUUFJFQU1CTEUgPSAxOSwKLQlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDID0gMjAsCi0JV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSA9IDIxLAotCS8qIDgwMi4xMWggKi8KLQlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TUEVDVFJVTSA9IDIyLAotCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9QT1dFUiA9IDIzLAotCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9TVVBQX0NIQU4gPSAyNCwKLQkvKiA4MDIuMTFnICovCi0JV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRUSU1FID0gMjUsCi0JV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PRFNTU09GRE0gPSAyNiwKLQkvKiA4MDIuMTFpICovCi0JV0xBTl9TVEFUVVNfSU5WQUxJRF9JRSA9IDQwLAotCVdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gNDEsCi0JV0xBTl9TVEFUVVNfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSA0MiwKLQlXTEFOX1NUQVRVU19JTlZBTElEX0FLTVAgPSA0MywKLQlXTEFOX1NUQVRVU19VTlNVUFBfUlNOX1ZFUlNJT04gPSA0NCwKLQlXTEFOX1NUQVRVU19JTlZBTElEX1JTTl9JRV9DQVAgPSA0NSwKLQlXTEFOX1NUQVRVU19DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSA0NiwKLX07Ci0KLS8qIFJlYXNvbiBjb2RlcyAqLwotZW51bSBpZWVlODAyMTFfcmVhc29uY29kZSB7Ci0JV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgPSAxLAotCVdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQgPSAyLAotCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HID0gMywKLQlXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA9IDQsCi0JV0xBTl9SRUFTT05fRElTQVNTT0NfQVBfQlVTWSA9IDUsCi0JV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgPSA2LAotCVdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA9IDcsCi0JV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUID0gOCwKLQlXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA9IDksCi0JLyogODAyLjExaCAqLwotCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9QT1dFUiA9IDEwLAotCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9TVVBQX0NIQU4gPSAxMSwKLQkvKiA4MDIuMTFpICovCi0JV0xBTl9SRUFTT05fSU5WQUxJRF9JRSA9IDEzLAotCVdMQU5fUkVBU09OX01JQ19GQUlMVVJFID0gMTQsCi0JV0xBTl9SRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE1LAotCVdMQU5fUkVBU09OX0dST1VQX0tFWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE2LAotCVdMQU5fUkVBU09OX0lFX0RJRkZFUkVOVCA9IDE3LAotCVdMQU5fUkVBU09OX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gMTgsCi0JV0xBTl9SRUFTT05fSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSAxOSwKLQlXTEFOX1JFQVNPTl9JTlZBTElEX0FLTVAgPSAyMCwKLQlXTEFOX1JFQVNPTl9VTlNVUFBfUlNOX1ZFUlNJT04gPSAyMSwKLQlXTEFOX1JFQVNPTl9JTlZBTElEX1JTTl9JRV9DQVAgPSAyMiwKLQlXTEFOX1JFQVNPTl9JRUVFODAyMVhfRkFJTEVEID0gMjMsCi0JV0xBTl9SRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gMjQsCi19OwotCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NwotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQotCi0jZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkJMHgwMgotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkJMHgwNAotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkJMHgwQgotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJCTB4MTYKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkJMHgwQwotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQgkJCTB4MTIKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKLSNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKLQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJCTB4MDAwMDAwMEYKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQotCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCi0JCQkJSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCi0KLSNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4Ci0jZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQkgICAgNAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0Ci0KLQotLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KLSNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKLSNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKLSNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAotI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKLQotI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKLQkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKLQkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCi0KLS8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KLSNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKLXN0cnVjdCBpZWVlX2lic3Nfc2VxIHsKLQl1OCBtYWNbRVRIX0FMRU5dOwotCXUxNiBzZXFfbnVtWzE3XTsKLQl1MTYgZnJhZ19udW1bMTddOwotCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KLS8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcwotICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCi0gKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLwotc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7Ci0JdTMyIG1hY190aW1lWzJdOwotCXM4IHJzc2k7Ci0JdTggc2lnbmFsOwotCXU4IG5vaXNlOwotCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLwotCXU4IHJlY2VpdmVkX2NoYW5uZWw7Ci0JdTggY29udHJvbDsKLQl1OCBtYXNrOwotCXU4IGZyZXE7Ci0JdTE2IGxlbjsKLQl1NjQgdHNmOwotCXUzMiBiZWFjb25fdGltZTsKLQl1OCBuaWNfdHlwZTsKLQl1MTYgICAgICAgTGVuZ3RoOwotCXU4ICAgICAgICBTaWduYWxRdWFsaXR5OyAvKiBpbiAwLTEwMCBpbmRleC4gKi8KLQlzMzIgICAgICAgUmVjdlNpZ25hbFBvd2VyOyAvKiBSZWFsIHBvd2VyIGluIGRCbSBmb3IgdGhpcyBwYWNrZXQsIG5vIGJlYXV0aWZpY2F0aW9uIGFuZCBhZ2dyZWdhdGlvbi4gKi8KLQlzOCAgICAgICAgUnhQb3dlcjsgLyogaW4gZEJtIFRyYW5zbGF0ZSBmcm9tIFBXZEIgKi8KLQl1OCAgICAgICAgU2lnbmFsU3RyZW5ndGg7IC8qIGluIDAtMTAwIGluZGV4LiAqLwotCXUxNiAgICAgICBiSHdFcnJvcjoxOwotCXUxNiAgICAgICBiQ1JDOjE7Ci0JdTE2ICAgICAgIGJJQ1Y6MTsKLQl1MTYgICAgICAgYlNob3J0UHJlYW1ibGU6MTsKLQl1MTYgICAgICAgQW50ZW5uYToxOyAgICAgIC8qIGZvciBydGw4MTg1ICovCi0JdTE2ICAgICAgIERlY3J5cHRlZDoxOyAgICAvKiBmb3IgcnRsODE4NSwgcnRsODE4NyAqLwotCXUxNiAgICAgICBXYWtldXA6MTsgICAgICAgLyogZm9yIHJ0bDgxODUgKi8KLQl1MTYgICAgICAgUmVzZXJ2ZWQwOjE7ICAgIC8qIGZvciBydGw4MTg1ICovCi0JdTggICAgICAgIEFHQzsKLQl1MzIgICAgICAgVGltZVN0YW1wTG93OwotCXUzMiAgICAgICBUaW1lU3RhbXBIaWdoOwotCWJvb2wgICAgICBiU2hpZnQ7Ci0JYm9vbCAgICAgIGJJc1Fvc0RhdGE7Ci0JdTggICAgICAgIFVzZXJQcmlvcml0eTsKLQotCS8qCi0JICogMUF0dGVudGlvbiBQbGVhc2UhISE8MTFuIG9yIDgxOTAgc3BlY2lmaWMgY29kZSBzaG91bGQgYmUgcHV0IGJlbG93IHRoaXMgbGluZT4KLQkgKi8KLQotCXU4ICAgICAgICBSeERydkluZm9TaXplOwotCXU4ICAgICAgICBSeEJ1ZlNoaWZ0OwotCWJvb2wgICAgICBiSXNBTVBEVTsKLQlib29sICAgICAgYkZpcnN0TVBEVTsKLQlib29sICAgICAgYkNvbnRhaW5IVEM7Ci0JYm9vbCAgICAgIFJ4SXM0ME1IelBhY2tldDsKLQl1MzIgICAgICAgUnhQV0RCQWxsOwotCXU4ICAgICAgICBSeE1JTU9TaWduYWxTdHJlbmd0aFs0XTsgICAgICAgIC8qIGluIDB+MTAwIGluZGV4ICovCi0JczggICAgICAgIFJ4TUlNT1NpZ25hbFF1YWxpdHlbMl07Ci0JYm9vbCAgICAgIGJQYWNrZXRNYXRjaEJTU0lEOwotCWJvb2wgICAgICBiSXNDQ0s7Ci0JYm9vbCAgICAgIGJQYWNrZXRUb1NlbGY7Ci0JdTgJKnZpcnR1YWxfYWRkcmVzczsKLQl1MTYgICAgICAgICAgcGFja2V0bGVuZ3RoOyAgICAgICAgICAgICAgLyogVG90YWwgcGFja2V0IGxlbmd0aDogTXVzdCBlcXVhbCB0byBzdW0gb2YgYWxsIEZyYWdMZW5ndGggKi8KLQl1MTYgICAgICAgICAgZnJhZ2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmFnTGVuZ3RoIHNob3VsZCBlcXVhbCB0byBQYWNrZXRMZW5ndGggaW4gbm9uLWZyYWdtZW50IGNhc2UgKi8KLQl1MTYgICAgICAgICAgZnJhZ29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIG9mZnNldCBmb3IgdGhpcyBmcmFnbWVudCAqLwotCXUxNiAgICAgICAgICBudG90YWxmcmFnOwotCWJvb2wgICAgICAJICBiaXNyeGFnZ3JzdWJmcmFtZTsKLQlib29sCQkgIGJQYWNrZXRCZWFjb247CS8qIGNvc2EgYWRkIGZvciByc3NpICovCi0JYm9vbAkJICBiVG9TZWxmQkE7CQkvKiBjb3NhIGFkZCBmb3IgcnNzaSAqLwotCWNoYXIgCSAgY2NrX2FkY19wd2RiWzRdOwkvKiBjb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24gKi8KLQl1MTYJCSAgU2VxX051bTsKLQotfTsKLQotLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKLSAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQotICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0Ci0gKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCi0jZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0Ci0KLXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7Ci0JdW5zaWduZWQgaW50IHNlcTsKLQl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTggc3JjX2FkZHJbRVRIX0FMRU5dOwotCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfc3RhdHMgewotCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKLQl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKLQl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOwotCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKLQl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKLQl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKLQl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKLQl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOwotCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKLQl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7Ci0JdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOwotCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOwotCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7Ci0JdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOwotCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOwotCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOwotCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7Ci0JdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOwotCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOwotCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7Ci0JdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Ci19OwotCi1zdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKLQotI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgotCi0jZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQotI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKLSNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCi0jZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQotI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKLSNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCi0jZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQotI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKLSNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCi0jZGVmaW5lIFNFQ19FTkNSWVBUICAgICAgICgxPDw5KQotCi0jZGVmaW5lIFNFQ19MRVZFTF8wICAgICAgMCAvKiBOb25lICovCi0jZGVmaW5lIFNFQ19MRVZFTF8xICAgICAgMSAvKiBXRVAgNDAgYW5kIDEwNCBiaXQgKi8KLSNkZWZpbmUgU0VDX0xFVkVMXzIgICAgICAyIC8qIExldmVsIDEgKyBUS0lQICovCi0jZGVmaW5lIFNFQ19MRVZFTF8yX0NLSVAgMyAvKiBMZXZlbCAxICsgQ0tJUCAqLwotI2RlZmluZSBTRUNfTEVWRUxfMyAgICAgIDQgLyogTGV2ZWwgMiArIENDTVAgKi8KLQotI2RlZmluZSBTRUNfQUxHX05PTkUgICAgICAgICAgICAwCi0jZGVmaW5lIFNFQ19BTEdfV0VQICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0VDX0FMR19US0lQICAgICAgICAgICAgMgotI2RlZmluZSBTRUNfQUxHX0NDTVAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgV0VQX0tFWVMgCQk0Ci0jZGVmaW5lIFdFUF9LRVlfTEVOCQkxMwotI2RlZmluZSBTQ01fS0VZX0xFTiAgICAgICAgICAgICAzMgotI2RlZmluZSBTQ01fVEVNUE9SQUxfS0VZX0xFTkdUSCAxNgotCi1zdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKLQl1MTYgYWN0aXZlX2tleToyLAotCSAgICBlbmFibGVkOjEsCi0JICAgIGF1dGhfbW9kZToyLAotCSAgICBhdXRoX2FsZ286NCwKLQkgICAgdW5pY2FzdF91c2VzX2dyb3VwOjEsCi0JICAgIGVuY3J5cHQ6MTsKLQl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOwotCXU4IGtleXNbV0VQX0tFWVNdW1NDTV9LRVlfTEVOXTsKLQl1OCBsZXZlbDsKLQl1MTYgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0vKgotIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKLSAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8Ci0gICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKLURlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIGZyYW1lICB8ICBmY3MgfAotICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8Ci0gICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLVRvdGFsOiAyOC0yMzQwIGJ5dGVzCi0qLwotCi0vKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KLWVudW0gaWVlZTgwMjExX21maWUgewotCU1GSUVfVFlQRV9TU0lEID0gMCwKLQlNRklFX1RZUEVfUkFURVMgPSAxLAotCU1GSUVfVFlQRV9GSF9TRVQgPSAyLAotCU1GSUVfVFlQRV9EU19TRVQgPSAzLAotCU1GSUVfVFlQRV9DRl9TRVQgPSA0LAotCU1GSUVfVFlQRV9USU0gPSA1LAotCU1GSUVfVFlQRV9JQlNTX1NFVCA9IDYsCi0JTUZJRV9UWVBFX0NPVU5UUlkgPSA3LAotCU1GSUVfVFlQRV9IT1BfUEFSQU1TID0gOCwKLQlNRklFX1RZUEVfSE9QX1RBQkxFID0gOSwKLQlNRklFX1RZUEVfUkVRVUVTVCA9IDEwLAotCU1GSUVfVFlQRV9DSEFMTEVOR0UgPSAxNiwKLQlNRklFX1RZUEVfUE9XRVJfQ09OU1RSQUlOVCA9IDMyLAotCU1GSUVfVFlQRV9QT1dFUl9DQVBBQklMSVRZID0gMzMsCi0JTUZJRV9UWVBFX1RQQ19SRVFVRVNUID0gMzQsCi0JTUZJRV9UWVBFX1RQQ19SRVBPUlQgPSAzNSwKLQlNRklFX1RZUEVfU1VQUF9DSEFOTkVMUyA9IDM2LAotCU1GSUVfVFlQRV9DU0EgPSAzNywKLQlNRklFX1RZUEVfTUVBU1VSRV9SRVFVRVNUID0gMzgsCi0JTUZJRV9UWVBFX01FQVNVUkVfUkVQT1JUID0gMzksCi0JTUZJRV9UWVBFX1FVSUVUID0gNDAsCi0JTUZJRV9UWVBFX0lCU1NfREZTID0gNDEsCi0JTUZJRV9UWVBFX0VSUCA9IDQyLAotCU1GSUVfVFlQRV9SU04gPSA0OCwKLQlNRklFX1RZUEVfUkFURVNfRVggPSA1MCwKLQlNRklFX1RZUEVfSFRfQ0FQID0gNDUsCi0JTUZJRV9UWVBFX0hUX0lORk8gPSA2MSwKLQlNRklFX1RZUEVfQUlST05FVCA9IDEzMywKLQlNRklFX1RZUEVfR0VORVJJQyA9IDIyMSwKLQlNRklFX1RZUEVfUU9TX1BBUkFNRVRFUiA9IDIyMiwKLX07Ci0KLS8qIE1pbmltYWwgaGVhZGVyOyBjYW4gYmUgdXNlZCBmb3IgcGFzc2luZyA4MDIuMTEgZnJhbWVzIHdpdGggc3VmZmljaWVudAotICogaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB1bmRlcmx5aW5nIGRhdGEgdHlwZSBpcyBhY3R1YWxseQotICogc3RvcmVkIGluIHRoZSBkYXRhLiAqLwotc3RydWN0IGllZWU4MDIxMV9oZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfaGRyXzJhZGRyIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCV9fbGUxNiBzZXFfY3RsOwotCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCV9fbGUxNiBzZXFfY3RsOwotCXU4IGFkZHI0W0VUSF9BTEVOXTsKLQl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IGFkZHIzW0VUSF9BTEVOXTsKLQlfX2xlMTYgc2VxX2N0bDsKLQl1OCBwYXlsb2FkWzBdOwotCV9fbGUxNiBxb3NfY3RsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IGFkZHIzW0VUSF9BTEVOXTsKLQlfX2xlMTYgc2VxX2N0bDsKLQl1OCBhZGRyNFtFVEhfQUxFTl07Ci0JdTggcGF5bG9hZFswXTsKLQlfX2xlMTYgcW9zX2N0bDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7Ci0JdTggaWQ7Ci0JdTggbGVuOwotCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCV9fbGUxNiBhbGdvcml0aG07Ci0JX19sZTE2IHRyYW5zYWN0aW9uOwotCV9fbGUxNiBzdGF0dXM7Ci0JLypjaGFsbGVuZ2UqLwotCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7Ci0JX19sZTE2IHJlYXNvbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKLQkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JX19sZTE2IGNhcGFiaWxpdHk7Ci0JLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBGSCBwYXJhbXMsIERTIHBhcmFtcywKLQkgKiBDRiBwYXJhbXMsIElCU1MgcGFyYW1zLCBUSU0gKGlmIGJlYWNvbiksIFJTTiAqLwotCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBBbGlhcyBiZWFjb24gZm9yIHByb2JlX3Jlc3BvbnNlICovCi0jZGVmaW5lIGllZWU4MDIxMV9iZWFjb24gaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCi0KLXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCV9fbGUxNiBjYXBhYmlsaXR5OwotCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0JLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9yZWFzc29jX3JlcXVlc3RfZnJhbWUgewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKLQlfX2xlMTYgY2FwYWJpbGl0eTsKLQlfX2xlMTYgbGlzdGVuX2ludGVydmFsOwotCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOwotCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgUlNOICovCi0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKLQlfX2xlMTYgY2FwYWJpbGl0eTsKLQlfX2xlMTYgc3RhdHVzOwotCV9fbGUxNiBhaWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3R4YiB7Ci0JdTggbnJfZnJhZ3M7Ci0JdTggZW5jcnlwdGVkOwotCXU4IHF1ZXVlX2luZGV4OwotCXU4IHJ0c19pbmNsdWRlZDsKLQl1MTYgcmVzZXJ2ZWQ7Ci0JX19sZTE2IGZyYWdfc2l6ZTsKLQlfX2xlMTYgcGF5bG9hZF9zaXplOwotCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Ci19OwotCi0jZGVmaW5lIE1BWF9UWF9BR0dfQ09VTlQJCSAgMTYKLXN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgewotCXU4IG5yX2Rydl9hZ2dfZnJhbWVzOwotCXN0cnVjdCBza19idWZmICp0eF9hZ2dfZnJhbWVzW01BWF9UWF9BR0dfQ09VTlRdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBNQVhfU1VCRlJBTUVfQ09VTlQgCQkgIDY0Ci1zdHJ1Y3QgaWVlZTgwMjExX3J4YiB7Ci0JdTggbnJfc3ViZnJhbWVzOwotCXN0cnVjdCBza19idWZmICpzdWJmcmFtZXNbTUFYX1NVQkZSQU1FX0NPVU5UXTsKLQl1OCBkc3RbRVRIX0FMRU5dOwotCXU4IHNyY1tFVEhfQUxFTl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi10eXBlZGVmIHVuaW9uIF9mcmFtZXFvcyB7Ci0JdTE2IHNob3J0ZGF0YTsKLQl1OCAgY2hhcmRhdGFbMl07Ci0Jc3RydWN0IHsKLQkJdTE2IHRpZDo0OwotCQl1MTYgZW9zcDoxOwotCQl1MTYgYWNrX3BvbGljeToyOwotCQl1MTYgcmVzZXJ2ZWQ6MTsKLQkJdTE2IHR4b3A6ODsKLQl9IGZpZWxkOwotfSBmcmFtZXFvcywgKnBmcmFtZXFvczsKLQotLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLwotI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKLSNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKLS8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcwotICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAotICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCi0gKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KLSNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCi0jZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQotI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAotCi0jZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCi0jZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgICAxMDAKLS8qIChIWiAvIDIpICovCi0jZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUgKEhaICogMikKLQotI2RlZmluZSBDUkNfTEVOR1RIICAgICAgICAgICAgICAgICA0VQotCi0jZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDY0Ci0KLSNkZWZpbmUgTkVUV09SS19FTVBUWV9FU1NJRCAoMTw8MCkKLSNkZWZpbmUgTkVUV09SS19IQVNfT0ZETSAgICAoMTw8MSkKLSNkZWZpbmUgTkVUV09SS19IQVNfQ0NLICAgICAoMTw8MikKLQotLyogUW9TIHN0cnVjdHVyZSAqLwotI2RlZmluZSBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUyAgICAgICgxPDwzKQotI2RlZmluZSBORVRXT1JLX0hBU19RT1NfSU5GT1JNQVRJT04gICAgICgxPDw0KQotI2RlZmluZSBORVRXT1JLX0hBU19RT1NfTUFTSyAgICAgICAgICAgIChORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUyB8IFwKLQkJCQkJIE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTikKLS8qIDgwMi4xMWggKi8KLSNkZWZpbmUgTkVUV09SS19IQVNfUE9XRVJfQ09OU1RSQUlOVCAgICAoMTw8NSkKLSNkZWZpbmUgTkVUV09SS19IQVNfQ1NBICAgICAgICAgICAgICAgICAoMTw8NikKLSNkZWZpbmUgTkVUV09SS19IQVNfUVVJRVQgICAgICAgICAgICAgICAoMTw8NykKLSNkZWZpbmUgTkVUV09SS19IQVNfSUJTU19ERlMgICAgICAgICAgICAoMTw8OCkKLSNkZWZpbmUgTkVUV09SS19IQVNfVFBDX1JFUE9SVCAgICAgICAgICAoMTw8OSkKLQotI2RlZmluZSBORVRXT1JLX0hBU19FUlBfVkFMVUUgICAgICAgICAgICgxPDwxMCkKLQotI2RlZmluZSBRT1NfUVVFVUVfTlVNICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUU9TX09VSV9MRU4gICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFFPU19PVUlfVFlQRSAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBRT1NfRUxFTUVOVF9JRCAgICAgICAgICAgICAgICAgIDIyMQotI2RlZmluZSBRT1NfT1VJX0lORk9fU1VCX1RZUEUgICAgICAgICAgIDAKLSNkZWZpbmUgUU9TX09VSV9QQVJBTV9TVUJfVFlQRSAgICAgICAgICAxCi0jZGVmaW5lIFFPU19WRVJTSU9OXzEgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBRT1NfQUlGU05fTUlOX1ZBTFVFICAgICAgICAgICAgIDIKLXN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgewotCXU4IGVsZW1lbnRJRDsKLQl1OCBsZW5ndGg7Ci0JdTggcXVpW1FPU19PVUlfTEVOXTsKLQl1OCBxdWlfdHlwZTsKLQl1OCBxdWlfc3VidHlwZTsKLQl1OCB2ZXJzaW9uOwotCXU4IGFjX2luZm87Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyIHsKLQl1OCBhY2lfYWlmc247Ci0JdTggZWN3X21pbl9tYXg7Ci0JX19sZTE2IHR4X29wX2xpbWl0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50IGluZm9fZWxlbWVudDsKLQl1OCByZXNlcnZlZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgYWNfcGFyYW1zX3JlY29yZFtRT1NfUVVFVUVfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzIHsKLQlfX2xlMTYgY3dfbWluW1FPU19RVUVVRV9OVU1dOwotCV9fbGUxNiBjd19tYXhbUU9TX1FVRVVFX05VTV07Ci0JdTggYWlmc1tRT1NfUVVFVUVfTlVNXTsKLQl1OCBmbGFnW1FPU19RVUVVRV9OVU1dOwotCV9fbGUxNiB0eF9vcF9saW1pdFtRT1NfUVVFVUVfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Fvc19kYXRhIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzIHBhcmFtZXRlcnM7Ci0JaW50IGFjdGl2ZTsKLQlpbnQgc3VwcG9ydGVkOwotCXU4IHBhcmFtX2NvdW50OwotCXU4IG9sZF9wYXJhbV9jb3VudDsKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMgewotCXU4IHRpbV9jb3VudDsKLQl1OCB0aW1fcGVyaW9kOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHsKLQl1OCBhY19hY2lfYWNtX2FpZnNuOwotCXU4IGFjX2Vjd21pbl9lY3dtYXg7Ci0JdTE2IGFjX3R4b3BfbGltaXQ7Ci19OwotCi1zdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHsKLQl1OCBhY19kaXJfdGlkOwotCXU4IGFjX3VwX3BzYjsKLQl1OCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3dtbV90c3BlY19lbGVtIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHRzX2luZm87Ci0JdTE2IG5vcm1fbXNkdV9zaXplOwotCXUxNiBtYXhfbXNkdV9zaXplOwotCXUzMiBtaW5fc2Vydl9pbnRlcjsKLQl1MzIgbWF4X3NlcnZfaW50ZXI7Ci0JdTMyIGluYWN0X2ludGVyOwotCXUzMiBzdXNwZW5faW50ZXI7Ci0JdTMyIHNlcnZfc3RhcnRfdGltZTsKLQl1MzIgbWluX2RhdGFfcmF0ZTsKLQl1MzIgbWVhbl9kYXRhX3JhdGU7Ci0JdTMyIHBlYWtfZGF0YV9yYXRlOwotCXUzMiBtYXhfYnVyc3Rfc2l6ZTsKLQl1MzIgZGVsYXlfYm91bmQ7Ci0JdTMyIG1pbl9waHlfcmF0ZTsKLQl1MTYgc3VycF9iYW5kX2FsbG93OwotCXUxNiBtZWRpdW1fdGltZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci1lbnVtIGVhcF90eXBlIHsKLQlFQVBfUEFDS0VUID0gMCwKLQlFQVBPTF9TVEFSVCwKLQlFQVBPTF9MT0dPRkYsCi0JRUFQT0xfS0VZLAotCUVBUE9MX0VOQ0FQX0FTRl9BTEVSVAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmVhcF90eXBlc1tdID0gewotCVtFQVBfUEFDS0VUXQkJPSAiRUFQLVBhY2tldCIsCi0JW0VBUE9MX1NUQVJUXQkJPSAiRUFQT0wtU3RhcnQiLAotCVtFQVBPTF9MT0dPRkZdCQk9ICJFQVBPTC1Mb2dvZmYiLAotCVtFQVBPTF9LRVldCQk9ICJFQVBPTC1LZXkiLAotCVtFQVBPTF9FTkNBUF9BU0ZfQUxFUlRdCT0gIkVBUE9MLUVuY2FwLUFTRi1BbGVydCIKLX07Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWFwX2dldF90eXBlKGludCB0eXBlKQotewotCXJldHVybiAoKHUzMil0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Ci19Ci1zdGF0aWMgaW5saW5lIHU4IEZyYW1lX1FvU1RJRCh1OCAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7Ci0JdTE2IGZjOwotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1ZjsKLQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKLQlyZXR1cm4gKHU4KSgoZnJhbWVxb3MgKikoYnVmICsgKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA/IDMwIDogMjQpKSktPmZpZWxkLnRpZDsKLX0KLQotCi1zdHJ1Y3QgZWFwb2wgewotCXU4IHNuYXBbNl07Ci0JdTE2IGV0aGVydHlwZTsKLQl1OCB2ZXJzaW9uOwotCXU4IHR5cGU7Ci0JdTE2IGxlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7Ci0JdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKLQl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKLQl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7Ci0JdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOwotCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOwotCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOwotCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOwotCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKLQl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKLQl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKLQl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOwotCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7Ci0JdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKLQl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7Ci0JdW5zaWduZWQgaW50IHJlYXNzb2M7Ci0JdW5zaWduZWQgaW50IHN3dHhzdG9wOwotCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Ci0JdW5zaWduZWQgY2hhciBDdXJyZW50U2hvd1R4YXRlOwotCXVuc2lnbmVkIGNoYXIgbGFzdF9wYWNrZXRfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgdHhyZXRyeWNvdW50OwotfTsKLQotI2RlZmluZSBCRUFDT05fUFJPQkVfU1NJRF9JRF9QT1NJVElPTiAxMgotCi1zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgewotCXU4IGlkOwotCXU4IGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKgotICogVGhlc2UgYXJlIHRoZSBkYXRhIHR5cGVzIHRoYXQgY2FuIG1ha2UgdXAgbWFuYWdlbWVudCBwYWNrZXRzCi0gKgotCXUxNiBhdXRoX2FsZ29yaXRobTsKLQl1MTYgYXV0aF9zZXF1ZW5jZTsKLQl1MTYgYmVhY29uX2ludGVydmFsOwotCXUxNiBjYXBhYmlsaXR5OwotCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0Jc3RydWN0IHsKLQkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiByZWFzb247Ci0JdTE2IHN0YXR1czsKLSovCi0KLSNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCi0jZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEUgMiAvKiAxTWJwcyAqLwotCi1lbnVtIHtXTU1fYWxsX2ZyYW1lLCBXTU1fdHdvX2ZyYW1lLCBXTU1fZm91cl9mcmFtZSwgV01NX3NpeF9mcmFtZX07Ci0jZGVmaW5lIE1BWF9TUF9MZW4gIChXTU1fYWxsX2ZyYW1lIDw8IDQpCi0jZGVmaW5lIElFRUU4MDIxMV9RT1NfVElEIDB4MGYKLSNkZWZpbmUgUU9TX0NUTF9OT1RDT05UQUlOX0FDSyAoMHgwMSA8PCA1KQotCi0jZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0Ci0jZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKLSNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQotI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKLQotI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAotI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAotI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAotCi0KLSNpZmRlZiBXTU1fSGFuZ184MTg3Ci0jdW5kZWYgV01NX0hhbmdfODE4NwotI2VuZGlmCi0KLSNkZWZpbmUgV01FX0FDX0JLICAgMHgwMAotI2RlZmluZSBXTUVfQUNfQkUgICAweDAxCi0jZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKLSNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMwotI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMwotI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCi0jZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgotCi0jZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKLQotLyogVVAgTWFwcGluZyB0byBBQywgdXNpbmcgaW4gTWdudFF1ZXJ5X1NlcXVlbmNlTnVtYmVyKCkgYW5kIG1heWJlIGZvciBEU0NQICovCi0jZGVmaW5lIFVQMkFDKHVwKSAoCQkgICBcCi0JKCh1cCkgPCAxKSA/IFdNRV9BQ19CRSA6IFwKLQkoKHVwKSA8IDMpID8gV01FX0FDX0JLIDogXAotCSgodXApIDwgNCkgPyBXTUVfQUNfQkUgOiBcCi0JKCh1cCkgPCA2KSA/IFdNRV9BQ19WSSA6IFwKLQlXTUVfQUNfVk8pCi0vKiBBQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUgKi8KLSNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKLQkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCi0JKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAotCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKLQkwKQotCi0jZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0ICAgICAgLyogbGVuZ3RoIG9mIHR3byBFdGhlcm5ldCBhZGRyZXNzIHBsdXMgZXRoZXIgdHlwZSovCi0KLXN0cnVjdAlldGhlcl9oZWFkZXIgewotCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKLQl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07Ci0JdTE2IGV0aGVyX3R5cGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jaWZuZGVmIEVUSEVSVFlQRV9QQUUKLSNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfSVAKLSNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBfYnNzX2h0ewotCi0JYm9vbAkJCQlzdXBwb3J0X2h0OwotCi0JLyogSFQgcmVsYXRlZCBlbGVtZW50cyAqLwotCXU4CQkJCQlodF9jYXBfYnVmWzMyXTsKLQl1MTYJCQkJCWh0X2NhcF9sZW47Ci0JdTgJCQkJCWh0X2luZm9fYnVmWzMyXTsKLQl1MTYJCQkJCWh0X2luZm9fbGVuOwotCi0JSFRfU1BFQ19WRVIJCQlodF9zcGVjX3ZlcjsKLQkvKiBIVF9DQVBBQklMSVRZX0VMRQkJCWJkSFRDYXBFbGU7ICovCi0JLyogSFRfSU5GT1JNQVRJT05fRUxFCQliZEhUSW5mb0VsZTsgKi8KLQotCWJvb2wJCQkJYWdncmVnYXRpb247Ci0JYm9vbAkJCQlsb25nX3Nsb3RfdGltZTsKLX0gYnNzX2h0LCAqcGJzc19odDsKLQotdHlwZWRlZiBlbnVtIF9lcnBfdHsKLQlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCi0JRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAotCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAotfSBlcnBfdDsKLQotCi1zdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgewotCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLwotCXU4IGJzc2lkW0VUSF9BTEVOXTsKLQl1OCBjaGFubmVsOwotCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCi0JdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOwotCXU4IHNzaWRfbGVuOwotCXN0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgcW9zX2RhdGE7Ci0JYm9vbAliV2l0aEFpcm9uZXRJRTsKLQlib29sCWJDa2lwU3VwcG9ydGVkOwotCWJvb2wJYkNjeFJtRW5hYmxlOwotCXUxNiAJQ2N4Um1TdGF0ZVsyXTsKLQkvKiBDQ1h2NCBTNTksIE1CU1NJRC4gKi8KLQlib29sCWJNQnNzaWRWYWxpZDsKLQl1OAlNQnNzaWRNYXNrOwotCXU4CU1Cc3NpZFs2XTsKLQkvKiBDQ1ggMiBTMzgsIFdMQU4gRGV2aWNlIFZlcnNpb24gTnVtYmVyIGVsZW1lbnQuICovCi0JYm9vbAliV2l0aENjeFZlck51bTsKLQl1OAlCc3NDY3hWZXJOdW1iZXI7Ci0JLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLwotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTggIHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOwotCXU4ICByYXRlc19sZW47Ci0JdTggIHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOwotCXU4ICByYXRlc19leF9sZW47Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7Ci0JdTggIG1vZGU7Ci0JdTMyIGZsYWdzOwotCXUzMiBsYXN0X2Fzc29jaWF0ZTsKLQl1MzIgdGltZV9zdGFtcFsyXTsKLQl1MTYgYmVhY29uX2ludGVydmFsOwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0JdTE2IGF0aW1fd2luZG93OwotCXU4ICBlcnBfdmFsdWU7Ci0JdTggIHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07Ci0Jc2l6ZV90IHdwYV9pZV9sZW47Ci0JdTggIHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07Ci0Jc2l6ZV90IHJzbl9pZV9sZW47Ci0KLQlzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzIHRpbTsKLQl1OCAgZHRpbV9wZXJpb2Q7Ci0JdTggIGR0aW1fZGF0YTsKLQl1MzIgbGFzdF9kdGltX3N0YV90aW1lWzJdOwotCi0JLyogYXBwZWRlZCBmb3IgUW9TICovCi0JdTggd21tX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOwotCXU4IFFvU19FbmFibGU7Ci0jaWZkZWYgVEhPTUFTX1RVUkJPCi0JdTggVHVyYm9fRW5hYmxlOy8qIGVuYWJsZSB0dXJibyBtb2RlLCBhZGRlZCBieSB0aG9tYXMgKi8KLSNlbmRpZgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQl1MTYgQ291bnRyeUllTGVuOwotCXU4IENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKLSNlbmRpZgotCS8qIEhUIFJlbGF0ZWQgKi8KLQlCU1NfSFQJYnNzaHQ7Ci0JLyogQWRkIHRvIGhhbmRsZSBicm9hZGNvbSBBUCBtYW5hZ2VtZW50IGZyYW1lIENDSyByYXRlLiAqLwotCWJvb2wgYnJvYWRjb21fY2FwX2V4aXN0OwotCWJvb2wgcmFsaW5rX2NhcF9leGlzdDsKLQlib29sIGF0aGVyb3NfY2FwX2V4aXN0OwotCWJvb2wgY2lzY29fY2FwX2V4aXN0OwotCWJvb2wgdW5rbm93bl9jYXBfZXhpc3Q7Ci0JYm9vbAliZXJwX2luZm9fdmFsaWQ7Ci0JYm9vbCBidXNlcHJvdGVjdGlvbjsKLQkvKiBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KLWVudW0gaWVlZTgwMjExX3N0YXRlIHsKLQotCS8qIHRoZSBjYXJkIGlzIG5vdCBsaW5rZWQgYXQgYWxsICovCi0JSUVFRTgwMjExX05PTElOSyA9IDAsCi0KLQkvKiBJRUVFODAyMTFfQVNTT0NJQVRJTkcqIGFyZSBmb3IgQlNTIGNsaWVudCBtb2RlCi0JICogdGhlIGRyaXZlciBzaGFsbCBub3QgcGVyZm9ybSBSWCBmaWx0ZXJpbmcgdW5sZXNzCi0JICogdGhlIHN0YXRlIGlzIExJTktFRC4KLQkgKiBUaGUgZHJpdmVyIHNoYWxsIGp1c3QgY2hlY2sgZm9yIHRoZSBzdGF0ZSBMSU5LRUQgYW5kCi0JICogZGVmYXVsdHMgdG8gTk9MSU5LIGZvciBBTEwgdGhlIG90aGVyIHN0YXRlcyAoaW5jbHVkaW5nCi0JICogTElOS0VEX1NDQU5OSU5HKQotCSAqLwotCi0JLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aWxsIHN0YXJ0ICh3cSBzY2hlZHVsaW5nKSovCi0JSUVFRTgwMjExX0FTU09DSUFUSU5HLAotCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSwKLQotCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaXMgc2VuZGluZyBBVVRIIHJlcXVlc3QqLwotCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORywKLQotCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaGFzIHN1Y2Nlc3NmdWxseSBhdXRoZW50Y2F0ZWQKLQkgKiBhbmQgaXMgc2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0Ci0JICovCi0JSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQsCi0KLQkvKiB0aGUgbGluayBpcyBvay4gdGhlIGNhcmQgYXNzb2NpYXRlZCB0byBhIEJTUyBvciBsaW5rZWQKLQkgKiB0byBhIGlic3MgY2VsbCBvciBhY3RpbmcgYXMgYW4gQVAgYW5kIGNyZWF0aW5nIHRoZSBic3MKLQkgKi8KLQlJRUVFODAyMTFfTElOS0VELAotCi0JLyogc2FtZSBhcyBMSU5LRUQsIGJ1dCB0aGUgZHJpdmVyIHNoYWxsIGFwcGx5IFJYIGZpbHRlcgotCSAqIHJ1bGVzIGFzIHdlIGFyZSBpbiBOT19MSU5LIG1vZGUuIEFzIHRoZSBjYXJkIGlzIHN0aWxsCi0JICogbG9naWNhbGx5IGxpbmtlZCwgYnV0IGl0IGlzIGRvaW5nIGEgc3luY3JvIHNpdGUgc3VydmV5Ci0JICogdGhlbiBpdCB3aWxsIGJlIGJhY2sgdG8gTElOS0VEIHN0YXRlLgotCSAqLwotCUlFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcsCi0KLX07Ci0KLSNkZWZpbmUgREVGQVVMVF9NQVhfU0NBTl9BR0UgKDE1ICogSFopCi0jZGVmaW5lIERFRkFVTFRfRlRTIDIzNDYKLQotI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQotI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQotI2RlZmluZSBDRkdfSUVFRTgwMjExX1JUUyAoMTw8MikKLQotI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfTUlOX0NIQU5ORUwgMQotI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfTUFYX0NIQU5ORUwgMTQKLSNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0NIQU5ORUxTIChJRUVFODAyMTFfMjRHSFpfTUFYX0NIQU5ORUwgLSBcCi0JCQkJICBJRUVFODAyMTFfMjRHSFpfTUlOX0NIQU5ORUwgKyAxKQotCi0jZGVmaW5lIElFRUU4MDIxMV81MkdIWl9NSU5fQ0hBTk5FTCAzNAotI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfTUFYX0NIQU5ORUwgMTY1Ci0jZGVmaW5lIElFRUU4MDIxMV81MkdIWl9DSEFOTkVMUyAoSUVFRTgwMjExXzUyR0haX01BWF9DSEFOTkVMIC0gXAotCQkJCSAgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMICsgMSkKLQotCi0KLXR5cGVkZWYgc3RydWN0IHR4X3BlbmRpbmdfdHsKLQlpbnQgZnJhZzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOwotfSB0eF9wZW5kaW5nX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9iYW5kd2lkdGhfYXV0b3N3aXRjaCB7Ci0JbG9uZyB0aHJlc2hvbGRfMjBNaHp0bzQwTWh6OwotCWxvbmcJdGhyZXNob2xkXzQwTWh6dG8yME1oejsKLQlib29sIGJmb3JjZWRfdHgyME1oejsKLQlib29sIGJhdXRvc3dpdGNoX2VuYWJsZTsKLX0gYmFuZHdpZHRoX2F1dG9zd2l0Y2gsICpwYmFuZHdpZHRoX2F1dG9zd2l0Y2g7Ci0KLQotCi0jZGVmaW5lIFJFT1JERVJfV0lOX1NJWkUJMTI4Ci0jZGVmaW5lIFJFT1JERVJfRU5UUllfTlVNCTEyOAotdHlwZWRlZiBzdHJ1Y3QgX1JYX1JFT1JERVJfRU5UUlkgewotCXN0cnVjdCBsaXN0X2hlYWQJTGlzdDsKLQl1MTYJCQlTZXFOdW07Ci0Jc3RydWN0IGllZWU4MDIxMV9yeGIgKnByeGI7Ci19IFJYX1JFT1JERVJfRU5UUlksICpQUlhfUkVPUkRFUl9FTlRSWTsKLQotdHlwZWRlZiBlbnVtIF9Gc3luY19TdGF0ZSB7Ci0JRGVmYXVsdF9Gc3luYywKLQlIV19Gc3luYywKLQlTV19Gc3luYwotfSBGc3luY19TdGF0ZTsKLQotLyogUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuICovCi10eXBlZGVmCWVudW0gX1JUX1BTX01PREUgewotCWVBY3RpdmUsCS8qIEFjdGl2ZS9Db250aW51b3VzIGFjY2Vzcy4gKi8KLQllTWF4UHMsCQkvKiBNYXggcG93ZXIgc2F2ZSBtb2RlLiAqLwotCWVGYXN0UHMJCS8qIEZhc3QgcG93ZXIgc2F2ZSBtb2RlLiAqLwotfSBSVF9QU19NT0RFOwotCi10eXBlZGVmIGVudW0gX0lQU19DQUxMQkFDS19GVU5DSU9OIHsKLQlJUFNfQ0FMTEJBQ0tfTk9ORSA9IDAsCi0JSVBTX0NBTExCQUNLX01HTlRfTElOS19SRVFVRVNUID0gMSwKLQlJUFNfQ0FMTEJBQ0tfSk9JTl9SRVFVRVNUID0gMiwKLX0gSVBTX0NBTExCQUNLX0ZVTkNJT047Ci0KLXR5cGVkZWYgZW51bSBfUlRfSk9JTl9BQ1RJT04gewotCVJUX0pPSU5fSU5GUkEgICA9IDEsCi0JUlRfSk9JTl9JQlNTICA9IDIsCi0JUlRfU1RBUlRfSUJTUyA9IDMsCi0JUlRfTk9fQUNUSU9OICA9IDQsCi19IFJUX0pPSU5fQUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBfSWJzc1Bhcm1zIHsKLQl1MTYgICBhdGltV2luOwotfSBJYnNzUGFybXMsICpQSWJzc1Bhcm1zOwotI2RlZmluZSBNQVhfTlVNX1JBVEVTCTI2NCAvKiBNYXggbnVtIG9mIHN1cHBvcnQgcmF0ZXMgZWxlbWVudDogOCwgIE1heCBudW0gb2YgZXh0LiBzdXBwb3J0IHJhdGU6IDI1NS4gMDYxMTIyLCBieSByY25qa28uICovCi0KLS8qIFJGIHN0YXRlLiAqLwotdHlwZWRlZgllbnVtIF9SVF9SRl9QT1dFUl9TVEFURSB7Ci0JZVJmT24sCi0JZVJmU2xlZXAsCi0JZVJmT2ZmCi19IFJUX1JGX1BPV0VSX1NUQVRFOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfUE9XRVJfU0FWRV9DT05UUk9MIHsKLQotCS8qIEluYWN0aXZlIFBvd2VyIFNhdmUoSVBTKSA6IERpc2FibGUgUkYgd2hlbiBkaXNjb25uZWN0ZWQgKi8KLQlib29sCQkJCWJJbmFjdGl2ZVBzOwotCWJvb2wJCQkJYklQU01vZGVCYWNrdXA7Ci0JYm9vbAkJCQliU3dSZlByb2Nlc3Npbmc7Ci0JUlRfUkZfUE9XRVJfU1RBVEUJZUluYWN0aXZlUG93ZXJTdGF0ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgCUluYWN0aXZlUHNXb3JrSXRlbTsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlJbmFjdGl2ZVBzVGltZXI7Ci0KLQkvKiBSZXR1cm4gcG9pbnQgZm9yIGpvaW4gYWN0aW9uICovCi0JSVBTX0NBTExCQUNLX0ZVTkNJT04JUmV0dXJuUG9pbnQ7Ci0KLQkvKiBSZWNvcmVkIFBhcmFtZXRlcnMgZm9yIHJlc2NoZWR1bGVkIEpvaW5SZXF1ZXN0ICovCi0JYm9vbAkJCQliVG1wQnNzRGVzYzsKLQlSVF9KT0lOX0FDVElPTgkJdG1wSm9pbkFjdGlvbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgdG1wQnNzRGVzYzsKLQotCS8qIFJlY29yZWQgUGFyYW1ldGVycyBmb3IgcmVzY2hlZHVsZWQgTWdudExpbmtSZXF1ZXN0ICovCi0JYm9vbAkJCQliVG1wU2Nhbk9ubHk7Ci0JYm9vbAkJCQliVG1wQWN0aXZlU2NhbjsKLQlib29sCQkJCWJUbXBGaWx0ZXJIaWRkZW5BUDsKLQlib29sCQkJCWJUbXBVcGRhdGVQYXJtczsKLQl1OAkJCQkJdG1wU3NpZEJ1ZlszM107Ci0JT0NURVRfU1RSSU5HCQkJdG1wU3NpZDJTY2FuOwotCWJvb2wJCQkJYlRtcFNzaWQyU2NhbjsKLQl1OAkJCQkJdG1wTmV0d29ya1R5cGU7Ci0JdTgJCQkJCXRtcENoYW5uZWxOdW1iZXI7Ci0JdTE2CQkJCQl0bXBCY25QZXJpb2Q7Ci0JdTgJCQkJCXRtcER0aW1QZXJpb2Q7Ci0JdTE2CQkJCQl0bXBtQ2FwOwotCU9DVEVUX1NUUklORwkJCXRtcFN1cHBSYXRlU2V0OwotCXU4CQkJCQl0bXBTdXBwUmF0ZUJ1ZltNQVhfTlVNX1JBVEVTXTsKLQlib29sCQkJCWJUbXBTdXBwUmF0ZTsKLQlJYnNzUGFybXMJCQkJdG1wSWJwbTsKLQlib29sCQkJCWJUbXBJYnBtOwotCi0JLyogTGVpc3JlIFBvc3dlciBTYXZlIDogRGlzYWJsZSBSRiBpZiBjb25uZWN0ZWQgYnV0IHRyYWZmaWMgaXMgbm90IGJ1c3kgKi8KLQlib29sCQkJCWJMZWlzdXJlUHM7Ci0KLX0gUlRfUE9XRVJfU0FWRV9DT05UUk9MLCAqUFJUX1BPV0VSX1NBVkVfQ09OVFJPTDsKLQotdHlwZWRlZiB1MzIgUlRfUkZfQ0hBTkdFX1NPVVJDRTsKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAotI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAotI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCS8qIERvIG5vdCBjaGFuZ2UgdGhlIFJGT2ZmIHJlYXNvbi4gKi8KLQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLXR5cGVkZWYgZW51bSB7Ci0JQ09VTlRSWV9DT0RFX0ZDQyA9IDAsCi0JQ09VTlRSWV9DT0RFX0lDID0gMSwKLQlDT1VOVFJZX0NPREVfRVRTSSA9IDIsCi0JQ09VTlRSWV9DT0RFX1NQQUlOID0gMywKLQlDT1VOVFJZX0NPREVfRlJBTkNFID0gNCwKLQlDT1VOVFJZX0NPREVfTUtLID0gNSwKLQlDT1VOVFJZX0NPREVfTUtLMSA9IDYsCi0JQ09VTlRSWV9DT0RFX0lTUkFFTCA9IDcsCi0JQ09VTlRSWV9DT0RFX1RFTEVDLAotCUNPVU5UUllfQ09ERV9NSUMsCi0JQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4KLX0gY291bnRyeV9jb2RlX3R5cGVfdDsKLSNlbmRpZgotCi0jZGVmaW5lIFJUX01BWF9MRF9TTE9UX05VTQkxMAotdHlwZWRlZiBzdHJ1Y3QgX1JUX0xJTktfREVURUNUX1QgewotCi0JdTMyCQkJCU51bVJlY3ZCY25JblBlcmlvZDsKLQl1MzIJCQkJTnVtUmVjdkRhdGFJblBlcmlvZDsKLQotCXUzMgkJCQlSeEJjbk51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvKiBudW1iZXIgb2YgUnggYmVhY29uIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzICovCi0JdTMyCQkJCVJ4RGF0YU51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvKiBudW1iZXIgb2YgUnggZGF0YSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cyAqLwotCXUxNgkJCQlTbG90TnVtOwkvKiBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMgKi8KLQl1MTYJCQkJU2xvdEluZGV4OwotCi0JdTMyCQkJCU51bVR4T2tJblBlcmlvZDsKLQl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOwotCWJvb2wJCQkJYkJ1c3lUcmFmZmljOwotfSBSVF9MSU5LX0RFVEVDVF9ULCAqUFJUX0xJTktfREVURUNUX1Q7Ci0KLQotc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWM7Ci0KLQkvKiBodyBzZWN1cml0eSByZWxhdGVkICovCi0JdTggaHdzZWNfYWN0aXZlOyAgLyogaHcgc2VjdXJpdHkgYWN0aXZlLiAqLwotCWJvb2wgaXNfc2lsZW50X3Jlc2V0OwotCWJvb2wgaWVlZV91cDsKLQlib29sIGJTdXBwb3J0UmVtb3RlV2FrZVVwOwotCVJUX1BTX01PREUJZG90MTFQb3dlclNhdmVNb2RlOyAvKiBQb3dlciBzYXZlIG1vZGUgY29uZmlndXJlZC4gKi8KLQlib29sIGFjdHNjYW5uaW5nOwotCWJvb2wgYmVpbnJldHJ5OwotCVJUX1JGX1BPV0VSX1NUQVRFCQllUkZQb3dlclN0YXRlOwotCVJUX1JGX0NIQU5HRV9TT1VSQ0UJUmZPZmZSZWFzb247Ci0JYm9vbCBpc19zZXRfa2V5OwotCS8qIDExbiBzcGVjIHJlbGF0ZWQgSSB3b25kZXIgaWYgVGhlc2UgaW5mbyBzdHJ1Y3R1cmUgbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgaWVlZTgwMjExX2RldmljZSAqLwotCi0JLyogMTFuIEhUIGJlbG93ICovCi0JUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvOwotCXNwaW5sb2NrX3QgYndfc3BpbmxvY2s7Ci0KLQlzcGlubG9ja190IHJlb3JkZXJfc3BpbmxvY2s7Ci0JLyogZm9yIEhUIG9wZXJhdGlvbiByYXRlIHNldC4gIHdlIHVzZSB0aGlzIG9uZSBmb3IgSFQgZGF0YSByYXRlIHRvCi0JICogc2VwYXJhdGUgZGlmZmVyZW50IGRlc2NyaXB0b3JzCi0JICogdGhlIHdheSBmaWxsIHRoaXMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIElFCi0JICovCi0JdTgJUmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvKiB1c2UgUkFUUiBmb3JtYXQgKi8KLQl1OAlkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzE2XTsJCS8qIHVzZSBSQVRSIGZvcm1hdCAqLwotCXU4CVJlZ0hUU3VwcFJhdGVTZXRbMTZdOwotCXU4CQkJCUhUQ3VycmVudE9wZXJhUmF0ZTsKLQl1OAkJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7Ci0JLyogd2IgYWRkZWQgZm9yIHJhdGUgb3BlcmF0aW9uIG1vZGUgdG8gZmlybXdhcmUgKi8KLQl1OAliVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOwotCXU4IAliVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU7Ci0JYXRvbWljX3QJYXRtX2NobmxvcDsKLQlhdG9taWNfdAlhdG1fc3didzsKLQotCS8qIDgwMi4xMWUgYW5kIFdNTSBUcmFmZmljIFN0cmVhbSBJbmZvIChUWCkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19BZG1pdF9MaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX1BlbmRpbmdfTGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19VbnVzZWRfTGlzdDsKLQlUWF9UU19SRUNPUkQJCVR4VHNSZWNvcmRbVE9UQUxfVFNfTlVNXTsKLQkvKiA4MDIuMTFlIGFuZCBXTU0gVHJhZmZpYyBTdHJlYW0gSW5mbyAoUlgpICovCi0Jc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfQWRtaXRfTGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19QZW5kaW5nX0xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfVW51c2VkX0xpc3Q7Ci0JUlhfVFNfUkVDT1JECQlSeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07Ci0JUlhfUkVPUkRFUl9FTlRSWQlSeFJlb3JkZXJFbnRyeVsxMjhdOwotCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UmVvcmRlcl9VbnVzZWRfTGlzdDsKLQkvKiBRb3MgcmVsYXRlZC4gKi8KLS8qCVBTVEFfUU9TCQkJcFN0YVFvczsgKi8KLQl1OAkJCQlGb3JjZWRQcmlvcml0eTsJCS8qIEZvcmNlIHBlci1wYWNrZXQgcHJpb3JpdHkgMX43LiAoZGVmYXVsdDogMCwgbm90IHRvIGZvcmNlIGl0LikgKi8KLQotCi0JLyogQm9va2tlZXBpbmcgc3RydWN0dXJlcyAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhdHMgaWVlZV9zdGF0czsKLQlzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHMgc29mdG1hY19zdGF0czsKLQotCS8qIFByb2JlIC8gQmVhY29uIG1hbmFnZW1lbnQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfZnJlZV9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19saXN0OwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29ya3M7Ci0JaW50IHNjYW5zOwotCWludCBzY2FuX2FnZTsKLQotCWludCBpd19tb2RlOyAvKiBvcGVyYXRpbmcgbW9kZSAoSVdfTU9ERV8qKSAqLwotCXN0cnVjdCBpd19zcHlfZGF0YSBzcHlfZGF0YTsKLQotCXNwaW5sb2NrX3QgbG9jazsKLQlzcGlubG9ja190IHdwYXhfc3VpdGxpc3RfbG9jazsKLQotCWludCB0eF9oZWFkcm9vbTsgLyogU2V0IHRvIHNpemUgb2YgYW55IGFkZGl0aW9uYWwgcm9vbSBuZWVkZWQgYXQgZnJvbnQKLQkJCSAgKiBvZiBhbGxvY2F0ZWQgVHggU0tCcyAqLwotCXUzMiBjb25maWc7Ci0KLQkvKiBXRVAgYW5kIG90aGVyIGVuY3J5cHRpb24gcmVsYXRlZCBzZXR0aW5ncyBhdCB0aGUgZGV2aWNlIGxldmVsICovCi0JaW50IG9wZW5fd2VwOyAvKiBTZXQgdG8gMSB0byBhbGxvdyB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KLQlpbnQgYXV0aF9tb2RlOwotCWludCByZXNldF9vbl9rZXljaGFuZ2U7IC8qIFNldCB0byAxIGlmIHRoZSBIVyBuZWVkcyB0byBiZSByZXNldCBvbgotCQkJCSAqIFdFUCBrZXkgY2hhbmdlcyAqLwotCi0JLyogSWYgdGhlIGhvc3QgcGVyZm9ybXMge2VuLGRlfWNyeXB0aW9uLCB0aGVuIHNldCB0byAxICovCi0JaW50IGhvc3RfZW5jcnlwdDsKLQlpbnQgaG9zdF9lbmNyeXB0X21zZHU7Ci0JaW50IGhvc3RfZGVjcnlwdDsKLQkvKiBob3N0IHBlcmZvcm1zIG11bHRpY2FzdCBkZWNyeXB0aW9uICovCi0JaW50IGhvc3RfbWNfZGVjcnlwdDsKLQotCS8qIGhvc3Qgc2hvdWxkIHN0cmlwIElWIGFuZCBJQ1YgZnJvbSBwcm90ZWN0ZWQgZnJhbWVzICovCi0JLyogbWVhbmluZ2Z1bCBvbmx5IHdoZW4gaGFyZHdhcmUgZGVjcnlwdGlvbiBpcyBiZWluZyB1c2VkICovCi0JaW50IGhvc3Rfc3RyaXBfaXZfaWN2OwotCi0JaW50IGhvc3Rfb3Blbl9mcmFnOwotCWludCBob3N0X2J1aWxkX2l2OwotCWludCBpZWVlODAyXzF4OyAvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCi0KLQkvKiBXUEEgZGF0YSAqLwotCWJvb2wgYkhhbGZXaXJlbGVzc04yNEdNb2RlOwotCWludCB3cGFfZW5hYmxlZDsKLQlpbnQgZHJvcF91bmVuY3J5cHRlZDsKLQlpbnQgdGtpcF9jb3VudGVybWVhc3VyZXM7Ci0JaW50IHByaXZhY3lfaW52b2tlZDsKLQlzaXplX3Qgd3BhX2llX2xlbjsKLQl1OCAqd3BhX2llOwotCXU4IGFwX21hY19hZGRyWzZdOwotCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKLQl1MTYgZ3JvdXBfa2V5X3R5cGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKLQlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7Ci0JaW50IGNyeXB0X3F1aWVzY2VkOwotCi0JaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgotCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KLQotCS8qIEZyYWdtZW50YXRpb24gc3RydWN0dXJlcyAqLwotCS8qIGVhY2ggc3RyZWFtaW5nIGNvbnRhaW4gYSBlbnRyeSAqLwotCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSBmcmFnX2NhY2hlWzE3XVtJRUVFODAyMTFfRlJBR19DQUNIRV9MRU5dOwotCXVuc2lnbmVkIGludCBmcmFnX25leHRfaWR4WzE3XTsKLQl1MTYgZnRzOyAvKiBGcmFnbWVudGF0aW9uIFRocmVzaG9sZCAqLwotI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgMjM0NlUKLSNkZWZpbmUgTUlOX1JUU19USFJFU0hPTEQgMQotI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAyMzQ2VQotCXUxNiBydHM7IC8qIFJUUyB0aHJlc2hvbGQgKi8KLQotCS8qIEFzc29jaWF0aW9uIGluZm8gKi8KLQl1OCBic3NpZFtFVEhfQUxFTl07Ci0KLQkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KLQkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKLQkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KLQkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KLQkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAotCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKLQkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCi0JICovCi0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKLQotCWVudW0gaWVlZTgwMjExX3N0YXRlIHN0YXRlOwotCi0JaW50IHNob3J0X3Nsb3Q7Ci0JaW50IHJlZ19tb2RlOwotCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCi0JaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLwotCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KLQlpbnQgYWJnX3RydWU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCi0KLQkvKiB1c2VkIGZvciBmb3JjaW5nIHRoZSBpYnNzIHdvcmtxdWV1ZSB0byB0ZXJtaW5hdGUKLQkgKiB3aXRob3V0IHdhaXQgZm9yIHRoZSBzeW5jcm8gc2NhbiB0byB0ZXJtaW5hdGUKLQkgKi8KLQlzaG9ydCBzeW5jX3NjYW5faHVycnl1cDsKLQotCWludCBwZXJmZWN0X3Jzc2k7Ci0JaW50IHdvcnN0X3Jzc2k7Ci0KLQl1MTYgcHJldl9zZXFfY3RsOyAgICAgICAvKiB1c2VkIHRvIGRyb3AgZHVwbGljYXRlIGZyYW1lcyAqLwotCi0JLyogbWFwIG9mIGFsbG93ZWQgY2hhbm5lbHMuIDAgaXMgZHVtbXkgKi8KLQkvKiBGSVhNRTogcmVtZWJlciB0byBkZWZhdWx0IHRvIGEgYmFzaWMgY2hhbm5lbCBwbGFuIGRlcGVuZGluZyBvZiB0aGUgUEhZIHR5cGUgKi8KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0Jdm9pZCAqcERvdDExZEluZm87Ci0JYm9vbCBiR2xvYmFsRG9tYWluOwotI2Vsc2UKLQlpbnQgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwotI2VuZGlmCi0JaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLwotCWludCBiYXNpY19yYXRlOwotCS8qIEZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzICovCi0Jc2hvcnQgYWN0aXZlX3NjYW47Ci0KLQkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCi0JdTE2IHNvZnRtYWNfZmVhdHVyZXM7Ci0KLQkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCi0JdTE2IHNlcV9jdHJsWzVdOwotCi0JLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLwotCXUxNiBhc3NvY2lhdGVfc2VxOwotCi0JLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KLQl1MTYgYXNzb2NfaWQ7Ci0KLQkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCi0Jc2hvcnQgcHM7Ci0Jc2hvcnQgc3RhX3NsZWVwOwotCWludCBwc190aW1lb3V0OwotCWludCBwc19wZXJpb2Q7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzX3Rhc2s7Ci0JdTMyIHBzX3RoOwotCXUzMiBwc190bDsKLQotCXNob3J0IHJhd190eDsKLQkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KLQlzaG9ydCBxdWV1ZV9zdG9wOwotCXNob3J0IHNjYW5uaW5nOwotCXNob3J0IHByb3RvX3N0YXJ0ZWQ7Ci0KLQlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNjYW5fc2VtOwotCi0Jc3BpbmxvY2tfdCBtZ210X3R4X2xvY2s7Ci0Jc3BpbmxvY2tfdCBiZWFjb25fbG9jazsKLQotCXNob3J0IGJlYWNvbl90eGluZzsKLQotCXNob3J0IHdhcF9zZXQ7Ci0Jc2hvcnQgc3NpZF9zZXQ7Ci0KLQl1OCAgd3BheF90eXBlX3NldDsKLQl1MzIgd3BheF90eXBlX25vdGlmeTsKLQotCS8qIFFvUyByZWxhdGVkIGZsYWcgKi8KLQljaGFyIGluaXRfd21tcGFyYW1fZmxhZzsKLQkvKiBzZXQgb24gaW5pdGlhbGl6YXRpb24gKi8KLQl1OCAgcW9zX3N1cHBvcnQ7Ci0KLQkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07Ci0KLQkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCi0JdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KLQl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOwotCi0JLyogZm9yIFBTIG1vZGUgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKLQotCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKLQlpbnQgbWdtdF9xdWV1ZV9oZWFkOwotCWludCBtZ210X3F1ZXVlX3RhaWw7Ci0vKiBhZGRlZCBmb3IgcnRsODE5eCAqLwotI2RlZmluZSBJRUVFODAyMTFfUVVFVUVfTElNSVQgMTI4Ci0JdTggQXNvY1JldHJ5Q291bnQ7Ci0JdW5zaWduZWQgaW50IGh3X2hlYWRlcjsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl93YWl0UVtNQVhfUVVFVUVfU0laRV07Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCAgc2tiX2FnZ1FbTUFYX1FVRVVFX1NJWkVdOwotCXN0cnVjdCBza19idWZmX2hlYWQgIHNrYl9kcnZfYWdnUVtNQVhfUVVFVUVfU0laRV07Ci0JdTMyCXN0YV9lZGNhX3BhcmFtWzRdOwotCWJvb2wgYWdncmVnYXRpb247Ci0JLyogRW5hYmxlL0Rpc2FibGUgUnggaW1tZWRpYXRlIEJBIGNhcGFiaWxpdHkuICovCi0JYm9vbCBlbmFibGVfcnhfaW1tX0JBOwotCWJvb2wgYmlic3Njb29yZGluYXRvcjsKLQotCS8qK2J5IGFteSBmb3IgRE0gLDA4MDUxNSAqLwotCS8qIER5bmFtaWMgVHggcG93ZXIgZm9yIG5lYXIvZmFyIHJhbmdlIGVuYWJsZS9EaXNhYmxlICAqLwotCWJvb2wJYmR5bmFtaWNfdHhwb3dlcl9lbmFibGU7Ci0KLQlib29sIGJDVFNUb1NlbGZFbmFibGU7Ci0JdTggCUNUU1RvU2VsZlRIOwotCi0JdTMyIAlmc3luY190aW1lX2ludGVydmFsOwotCXUzMglmc3luY19yYXRlX2JpdG1hcDsKLQl1OAlmc3luY19yc3NpX3RocmVzaG9sZDsKLQlib29sCWJmc3luY19lbmFibGU7Ci0KLQl1OAlmc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWw7CQkvKiBGc3luY011bHRpcGxlVGltZUludGVydmFsICogRnN5bmNUaW1lSW50ZXJ2YWwgKi8KLQl1MzIJZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ7CQkvKiBsb3cgdGhyZXNob2xkICovCi0JdTMyCWZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZDsJIC8qIGRlY3JlYXNlIHRocmVzaG9sZCAqLwotCUZzeW5jX1N0YXRlCQkJZnN5bmNfc3RhdGU7Ci0JYm9vbAkJYmlzX2FueV9ub25iZXBrdHM7Ci0JLyogMjBNaHogNDBNaHogQXV0b1N3aXRjaCBUaHJlc2hvbGQgKi8KLQliYW5kd2lkdGhfYXV0b3N3aXRjaCBiYW5kd2lkdGhfYXV0b19zd2l0Y2g7Ci0JLyogZm9yIHR4cG93ZXIgdHJhY2tpbmcgKi8KLQlib29sIEZ3UldSRjsKLQotCS8qIGFkZGVkIGJ5IGFteSBmb3IgQVAgcm9hbWluZyAqLwotCVJUX0xJTktfREVURUNUX1QJTGlua0RldGVjdEluZm87Ci0JLyogYWRkZWQgYnkgYW15IGZvciBwcyAqLwotCVJUX1BPV0VSX1NBVkVfQ09OVFJPTAlQb3dlclNhdmVDb250cm9sOwotCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLwotCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7Ci0KLQkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOwotCi0JLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKLQkgc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3eF9zeW5jX3NjYW5fd3E7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwotCS8qIFFvcyByZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0wMS4gKi8KLQkvKiBTVEFfUU9TICBTdGFRb3M7ICovCi0KLQotCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLwotCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7Ci0KLQkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCi0JICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcwotCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKLQkgKi8KLQlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCi0JCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLQlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQlpbnQgKCppc19xdWV1ZV9mdWxsKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSk7Ci0KLQlpbnQgKCpoYW5kbGVfbWFuYWdlbWVudCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssIHUxNiB0eXBlKTsKLQlpbnQgKCppc19xb3NfYWN0aXZlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLQkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCi0JICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcwotCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0Ci0JICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcwotCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KLQkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgotCSAqLwotCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0JLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQotCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKLQkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0Ci0JICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgotCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCi0JICovCi0Jdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJhdGUpOwotCi0JLyogc3RvcHMgdGhlIEhXIHF1ZXVlIGZvciBEQVRBIGZyYW1lcy4gVXNlZnVsIHRvIGF2b2lkCi0JICogd2FzdGUgdGltZSB0byBUWCBkYXRhIGZyYW1lIHdoZW4gd2UgYXJlIHJlYXNzb2NpYXRpbmcKLQkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KLQkgKi8KLQl2b2lkICgqZGF0YV9oYXJkX3N0b3ApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0JLyogT0sgdGhpcyBpcyBjb21wbGVtZW50YXIgdG8gZGF0YV9wb2xsX2hhcmRfc3RvcCAqLwotCXZvaWQgKCpkYXRhX2hhcmRfcmVzdW1lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8gLgotCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLiB0aGUgZHJpdmVyIHNob3VsZCBlbnN1cmUKLQkgKiB0aGUgcmFkaW8gaGFzIGJlZW4gc3dpdGhjZWQgYmVmb3JlIHJldHVybi4KLQkgKi8KLQl2b2lkICgqc2V0X2NoYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKTsKLQotCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCi0JICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KLQkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KLQkgKgotCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAotCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KLQkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKLQkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCi0JICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAotCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCi0JICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCi0JICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgotCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAotCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KLQkgKi8KLQl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCi0JICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgotCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCi0JICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAotCSAqLwotCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLQkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0Ci0JICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKLQkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQotCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKLQkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCi0JICovCi0Jdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eF9yYXRlKTsKLQl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkICovCi0Jdm9pZCAoKnN0YV93YWtlX3VwKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKnBzX3JlcXVlc3RfdHhfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmVudGVyX3NsZWVwX3N0YXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpOwotCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQlpbnQgKCpoYW5kbGVfYmVhY29uKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKmJlYWNvbiwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKTsKLQlpbnQgKCpoYW5kbGVfYXNzb2NfcmVzcG9uc2UpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICpyZXNwLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspOwotCi0KLQkvKiBjaGVjayB3aGV0aGVyIFR4IGh3IHJlc291Y2UgYXZhaWxhYmxlICovCi0Jc2hvcnQgKCpjaGVja19uaWNfZW5vdWdoX2Rlc2MpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7Ci0JLyogYWRkZWQgYnkgd2IgZm9yIEhUIHJlbGF0ZWQgKi8KLQl2b2lkICgqU2V0QldNb2RlSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCk7Ci0JYm9vbCAoKkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqU2V0V2lyZWxlc3NNb2RlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB3aXJlbGVzc19tb2RlKTsKLQlib29sICgqR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKkluaXRpYWxHYWluSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKTsKLQotCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCi0JICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KLQl1OCBwcml2WzBdOwotfTsKLQotI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQotI2RlZmluZSBJRUVFX05fMjRHIAkJICAoMTw8NCkKLSNkZWZpbmUJSUVFRV9OXzVHCQkgICgxPDw1KQotI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCi0KLS8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLwotCi0vKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQotICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKLSAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKLQotLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCi0jZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCi0KLS8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCi0jZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQotCi0vKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKLQotLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQotICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKLSAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCi0jZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKLQotLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0Ci0gKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KLSAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQotCi0vKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCi0gKiB0byB0aGUgY2FyZAotICovCi0jZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKLX0KLQotZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQotewotCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KLQlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQotCQlyZXR1cm4gMTsKLQotCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCi0Jd2hpbGUgKGVzc2lkX2xlbikgewotCQllc3NpZF9sZW4tLTsKLQkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1leHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCi17Ci0JLyoKLQkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKLQkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCi0JICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcwotCSAqCi0JICovCi0JaWYgKChtb2RlICYgSUVFRV9BKSAmJgotCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCi0JICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCi0JCXJldHVybiAxOwotCi0JaWYgKChtb2RlICYgSUVFRV9HKSAmJgotCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCi0JICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCi0JCXJldHVybiAxOwotCi0JaWYgKChtb2RlICYgSUVFRV9CKSAmJgotCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKLQkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQotewotCWludCBoZHJsZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOwotCi0Jc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgewotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6Ci0JCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQotCQkJaGRybGVuID0gSUVFRTgwMjExXzRBRERSX0xFTjsgLyogQWRkcjQgKi8KLQkJaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpCi0JCQloZHJsZW4gKz0gMjsgLyogUU9TIGN0cmwqLwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpKSB7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgotCQkJaGRybGVuID0gSUVFRTgwMjExXzFBRERSX0xFTjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaGRybGVuID0gSUVFRTgwMjExXzJBRERSX0xFTjsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBoZHJsZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggKmllZWU4MDIxMV9nZXRfcGF5bG9hZChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQotewotCXN3aXRjaCAoaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgewotCWNhc2UgSUVFRTgwMjExXzFBRERSX0xFTjoKLQkJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIgKiloZHIpLT5wYXlsb2FkOwotCWNhc2UgSUVFRTgwMjExXzJBRERSX0xFTjoKLQkJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9oZHJfMmFkZHIgKiloZHIpLT5wYXlsb2FkOwotCWNhc2UgSUVFRTgwMjExXzNBRERSX0xFTjoKLQkJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKiloZHIpLT5wYXlsb2FkOwotCWNhc2UgSUVFRTgwMjExXzRBRERSX0xFTjoKLQkJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKiloZHIpLT5wYXlsb2FkOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX29mZG1fcmF0ZSh1OCByYXRlKQotewotCXN3aXRjaCAocmF0ZSAmIH5JRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKSB7Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9pc19jY2tfcmF0ZSh1OCByYXRlKQotewotCXN3aXRjaCAocmF0ZSAmIH5JRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKSB7Ci0JY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COgotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qIGllZWU4MDIxMS5jICovCi1leHRlcm4gdm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaWVlZTgwMjExKGludCBzaXplb2ZfcHJpdik7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLQotLyogaWVlZTgwMjExX3R4LmMgKi8KLQotZXh0ZXJuIGludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKLQlpbnQgaGRyX2xlbik7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKik7Ci0KLQotLyogaWVlZTgwMjExX3J4LmMgKi8KLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlciwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOwotCi0vKiBpZWVlODAyMTFfd3guYyAqLwotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOwotI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLSNlbmRpZgotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKTsKLQotLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLwotZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7Ci1leHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCi0JCQl1MTYgc3R5cGUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpOwotCi12b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTgqIGFzU3RhLCB1OCBhc1Jzbik7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLQotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9kaXNhc3NvY2lhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiBpbnQgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcG9pbnQgKnApOwotZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpOwotCi1leHRlcm4gdm9pZCBzb2Z0bWFjX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0KLS8qIGllZWU4MDIxMV9jcnlwdF9jY21wJnRraXAmd2VwLmMgKi8KLWV4dGVybiB2b2lkIGllZWU4MDIxMV90a2lwX251bGwodm9pZCk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpOwotCi0vKiBpZWVlODAyMTFfc29mdG1hY193eC5jICovCi0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHQpOwotCi1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKLQkJCSBjaGFyICpleHRyYSk7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOwotCi1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotCi1leHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotCi1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKLQotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOwotCi1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKLQotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCi0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotCi1leHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLS8qIEhUICovCi0jZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKLWV4dGVybiB2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTggKkNhcElFLCB1OCAqVGl0bGVTdHJpbmcpOwotZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUSW5mbyh1OCAqSW5mb0lFLCB1OCAqVGl0bGVTdHJpbmcpOwotCi12b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUICAgIE9mZnNldCk7Ci1leHRlcm4gdm9pZCBIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIEhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwb3NIVENhcCwgdTggKmxlbiwgdTggaXNFbmNyeXB0KTsKLWV4dGVybiB2b2lkIEhUQ29uc3RydWN0SW5mb0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwb3NIVEluZm8sIHU4ICpsZW4sIHU4IGlzRW5jcnlwdCk7Ci1leHRlcm4gdm9pZCBIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBvc1JUMlJUQWdnLCB1OCAqbGVuKTsKLWV4dGVybiB2b2lkIEhUT25Bc3NvY1JzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBIVEluaXRpYWxpemVIVEluZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgSFRJbml0aWFsaXplQnNzRGVzYyhQQlNTX0hUIHBCc3NIVCk7Ci1leHRlcm4gdm9pZCBIVFJlc2V0U2VsZkFuZFNhdmVQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwTmV0d29yayk7Ci1leHRlcm4gdm9pZCBIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBOZXR3b3JrKTsKLWV4dGVybiB1OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqcE1DU1JhdGVTZXQsIHU4ICpwTUNTRmlsdGVyKTsKLWV4dGVybiB1OCBNQ1NfRklMVEVSX0FMTFtdOwotZXh0ZXJuIHUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA7Ci1leHRlcm4gdTggSFRDQ2hlY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwRnJhbWUpOwotZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoUFJUX0hJR0hfVEhST1VHSFBVVCAgcEhUSW5mbyk7Ci1leHRlcm4gYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgIHU4ICAgICAgbk1jc1JhdGUpOwotZXh0ZXJuIHUxNiBIVE1jc1RvRGF0YVJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKTsKLWV4dGVybiB1MTYgIFR4Q291bnRUb0RhdGFSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBuRGF0YVJhdGUpOwotLyogZnVuY3Rpb24gaW4gQkFQUk9DLmMgKi8KLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4X0FEREJBUmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4X0FEREJBUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiB2b2lkIFRzSW5pdEFkZEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFhfVFNfUkVDT1JEICAgcFRTLCB1OCBQb2xpY3ksIHU4IGJPdmVyd3JpdGVQZW5kaW5nKTsKLWV4dGVybiB2b2lkIFRzSW5pdERlbEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgVFJfU0VMRUNUIFR4UnhTZWxlY3QpOwotZXh0ZXJuIHZvaWQgQmFTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLWV4dGVybiB2b2lkIFR4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLWV4dGVybiB2b2lkIFJ4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLWV4dGVybiB2b2lkIFJlc2V0QmFFbnRyeShQQkFfUkVDT1JEIHBCQSk7Ci0vKiBmdW5jdGlvbiBpbiBUUy5jICovCi1leHRlcm4gYm9vbCBHZXRUcygKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQlQVFNfQ09NTU9OX0lORk8gKnBwVFMsCi0JdTgJCQkJKkFkZHIsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUQsCi0JVFJfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICBUeFJ4U2VsZWN0LCAgLyogUng6MSwgVHg6MCAqLwotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZE5ld1RzCi0JKTsKLWV4dGVybiB2b2lkIFRTSW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gIHZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRYX1RTX1JFQ09SRCAgIHBUeFRTKTsKLWV4dGVybiB2b2lkIFJlbW92ZVBlZXJUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKkFkZHIpOwotZXh0ZXJuIHZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0KLWV4dGVybiBjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW107Ci0KLWV4dGVybiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaW5jcmVtZW50X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWllZWUtPnNjYW5zKys7Ci19Ci0KLWV4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JcmV0dXJuIGllZWUtPnNjYW5zOwotfQotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKQotewotCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07Ci0JY29uc3QgY2hhciAqcyA9IGVzc2lkOwotCWNoYXIgKmQgPSBlc2NhcGVkOwotCi0JaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChlc3NpZCwgZXNzaWRfbGVuKSkgewotCQltZW1jcHkoZXNjYXBlZCwgIjxoaWRkZW4+Iiwgc2l6ZW9mKCI8aGlkZGVuPiIpKTsKLQkJcmV0dXJuIGVzY2FwZWQ7Ci0JfQotCi0JZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKLQl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKLQkJaWYgKCpzID09ICdcMCcpIHsKLQkJCSpkKysgPSAnXFwnOwotCQkJKmQrKyA9ICcwJzsKLQkJCXMrKzsKLQkJfSBlbHNlIHsKLQkJCSpkKysgPSAqcysrOwotCQl9Ci0JfQotCSpkID0gJ1wwJzsKLQlyZXR1cm4gZXNjYXBlZDsKLX0KLQotLyogRm9yIHRoZSBmdW5jdGlvbiBpcyBtb3JlIHJlbGF0ZWQgdG8gaGFyZHdhcmUgc2V0dGluZywgaXQncyBiZXR0ZXIgdG8gdXNlIHRoZQotICogaWVlZSBoYW5kbGVyIHRvIHJlZmVyIHRvIGl0LgotICovCi1leHRlcm4gc2hvcnQgY2hlY2tfbmljX2Vub3VnaF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IGllZWU4MDIxMV9wYXJzZV9pbmZvX3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LAotCQl1MTYgbGVuZ3RoLAotCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCi0JCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKLQotdm9pZCBpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9yeGIgKipwcnhiSW5kaWNhdGVBcnJheSwgdTggIGluZGV4KTsKLSNkZWZpbmUgUlRfQVNPQ19SRVRSWV9MSU1JVAk1Ci0jZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IGZiNzhlZDIuLmQ2ZjU1YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtODUsNyArODUsNyBAQAogCX0KIAkvKiBBZGQgdGhlIHByb3RvY29sIG5hbWUgKi8KIAlpd2UuY21kID0gU0lPQ0dJV05BTUU7Ci0JZm9yKGk9MDsgaTwoc2l6ZW9mKGllZWU4MDIxMV9tb2Rlcykvc2l6ZW9mKGllZWU4MDIxMV9tb2Rlc1swXSkpOyBpKyspIHsKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoaWVlZTgwMjExX21vZGVzKTsgaSsrKSB7CiAJCWlmKG5ldHdvcmstPm1vZGUmKDE8PGkpKSB7CiAJCQlzcHJpbnRmKHBuYW1lLGllZWU4MDIxMV9tb2Rlc1tpXS5tb2RlX3N0cmluZyxpZWVlODAyMTFfbW9kZXNbaV0ubW9kZV9zaXplKTsKIAkJCXBuYW1lICs9aWVlZTgwMjExX21vZGVzW2ldLm1vZGVfc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaAppbmRleCA2OWEyNzIxLi42MjA2ZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgImllZWU4MDIxMS9pZWVlODAyMTEuaCIKIAogI2RlZmluZSBSVEw4MTkyVQogI2RlZmluZSBSVEw4MTl4VV9NT0RVTEVfTkFNRSAicnRsODE5eFUiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCmluZGV4IGYzODQ3MmMuLjFmZjc4NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC00MTAsMTQgKzQxMCwxMiBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKIAogCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAotCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCAyLCBIWiAvIDIpOworCQkJCSAgICAgICBSVEw4MTg3X1JFUV9HRVRfUkVHUywgUlRMODE4N19SRVFUX1JFQUQsCisJCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsCisJCQkJCQkJJmRhdGEsIDIsIEhaIC8gMik7CiAKIAlpZiAoc3RhdHVzIDwgMCkKLQl7CiAJCXByaW50aygicmVhZF9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7Ci0JfQotCiAKIAlyZXR1cm4gZGF0YTsKIH0KQEAgLTQzMSwxMyArNDI5LDEwIEBACiAKIAlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAogCQkJICAgICAgIFJUTDgxODdfUkVRX0dFVF9SRUdTLCBSVEw4MTg3X1JFUVRfUkVBRCwKLQkJCSAgICAgICBpbmR4fDB4ZmUwMCwgMCwgJmRhdGEsIDIsIEhaIC8gMik7CisJCQkJICAgICAgIGluZHh8MHhmZTAwLCAwLCAmZGF0YSwgMiwgSFogLyAyKTsKIAogCWlmIChzdGF0dXMgPCAwKQotCXsKIAkJcHJpbnRrKCJyZWFkX25pY193b3JkIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKLQl9Ci0KIAogCXJldHVybiBkYXRhOwogfQpAQCAtNDQ2LDMxICs0NDEsMjkgQEAKIHsKIAl1MzIgZGF0YTsKIAlpbnQgc3RhdHVzOwotLy8JaW50IHJlc3VsdDsKKwkvKiBpbnQgcmVzdWx0OyAqLwogCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKIAogCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAotCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCA0LCBIWiAvIDIpOwotLy8JaWYoMCAhPSByZXN1bHQpIHsKLS8vCSAgcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZCBzaXplIG9mIGRhdGEgPSAlZFwsIGRhdGUgPSAlZFxuIiwgcmVzdWx0LCBkYXRhKTsKLS8vCX0KKwkJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJCQkoaW5keCYweGZmKXwweGZmMDAsIChpbmR4Pj44KSYweDBmLAorCQkJCQkJCSZkYXRhLCA0LCBIWiAvIDIpOworCS8qIGlmKDAgIT0gcmVzdWx0KSB7CisJICoJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZCBzaXplIG9mIGRhdGEgPSAlZFwsIGRhdGUgPSAlZFxuIiwKKwkgKgkJCQkJCQkgcmVzdWx0LCBkYXRhKTsKKwkgKiB9CisJICovCiAKIAlpZiAoc3RhdHVzIDwgMCkKLQl7CiAJCXByaW50aygicmVhZF9uaWNfZHdvcmQgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOwotCX0KLQotCiAKIAlyZXR1cm4gZGF0YTsKIH0KIAotCi0vL3U4IHJlYWRfcGh5X2NjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIpOwotLy91OCByZWFkX3BoeV9vZmRtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkcik7CisvKiB1OCByZWFkX3BoeV9jY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKTsgKi8KKy8qIHU4IHJlYWRfcGh5X29mZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKTsgKi8KIC8qIHRoaXMgbWlnaHQgc3RpbGwgY2FsbGVkIGluIHdoYXQgd2FzIHRoZSBQSFkgcnRsODE4NS9ydGw4MTkyIGNvbW1vbiBjb2RlCiAgKiBwbGFucyBhcmUgdG8gcG9zc2liaWx0eSB0dXJuIGl0IGFnYWluIGluIG9uZSBjb21tb24gY29kZS4uLgogICovCkBAIC00NzgsMjYgKzQ3MSwyMiBAQAogewogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE5Ml9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0vL3ZvaWQgcnRsODE5Ml9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogdm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7ICovCiB2b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotLy92b2lkIHJ0bDgxOTJfcnFfdHhfYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KKy8qIHZvaWQgcnRsODE5Ml9ycV90eF9hY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsgKi8KIHZvaWQgd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBST0NGUyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBST0NGUyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnRsODE5Ml9wcm9jID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJ0bDgxOTJfcHJvYzsKIAotCi0KLXN0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfYXAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX2FwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkJCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtNTA4LDE4ICs0OTcsMTIgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CiAKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotCQkiJXMgIiwgdGFyZ2V0LT5zc2lkKTsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiJXMgIiwgdGFyZ2V0LT5zc2lkKTsKIAotCQlpZih0YXJnZXQtPndwYV9pZV9sZW4+MCB8fCB0YXJnZXQtPnJzbl9pZV9sZW4+MCl7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiV1BBXG4iKTsKLQkJfQotCQllbHNlewotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotCQkJIm5vbl9XUEFcbiIpOwotCQl9Ci0KKwkJaWYgKHRhcmdldC0+d3BhX2llX2xlbiA+IDAgfHwgdGFyZ2V0LT5yc25faWVfbGVuID4gMCkKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIldQQVxuIik7CisJCWVsc2UKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIm5vbl9XUEFcbiIpOwogCX0KIAogCSplb2YgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5oCmluZGV4IGIyZjdhNTcuLmY0Y2YyODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmgKQEAgLTE1LDcgKzE1LDcgQEAKICNpZm5kZWYgUjgxODBfV1hfSAogI2RlZmluZSBSODE4MF9XWF9ICiAvLyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotLy8jaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKIGV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcjgxOTJfd3hfaGFuZGxlcnNfZGVmOwogLyogRW5hYmxlICB0aGUgcnRsODE5eF9jb3JlLmMgdG8gc2hhcmUgdGhpcyBmdW5jdGlvbiwgZGF2aWQgMjAwOC45LjIyICovCiBleHRlcm4gc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4MTkyX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwppbmRleCAzY2MyZDU3Li5iMTM2ZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgICAgICAgTkRJU19TVEFUVVNfRkFJTFVSRSAtIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaG91bGQgYmUgdGVybWluYXRlZAogICogICAgICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MgLSBpZiBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHN1Y2Nlc3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8jaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKICNpbmNsdWRlICJyODE5MlUuaCIKICNpbmNsdWRlICJyODE5MlVfaHcuaCIKICNpbmNsdWRlICJyODE5eFVfZmlybXdhcmVfaW1nLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmgKaW5kZXggMzgzNTQzZC4uN2VmMTZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9hcGkuaApAQCAtNjUsNyArNjUsNyBAQAogLyogZnJlZSBkeW5hbWljIGRhdGEgYWFsb2NhdGVkIGR1cmluZyB0YWJsZSBjcmVhdGlvbiAqLwogI2RlZmluZSBTRVBfSU9DRlJFRURNQVRBQkxFREFUQSAgICAgICAgICAgICAgICBfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIgLCA3KQogCi0vKiBnZXQgdGhlIHN0YXRpYyBwb29sIGFyZWEgYWRkZXJzc2VzIChwaHlzaWNhbCBhbmQgdmlydHVhbCkgKi8KKy8qIGdldCB0aGUgc3RhdGljIHBvb2wgYXJlYSBhZGRyZXNzZXMgKHBoeXNpY2FsIGFuZCB2aXJ0dWFsKSAqLwogI2RlZmluZSBTRVBfSU9DR0VUU1RBVElDUE9PTEFERFIgICAgICAgICAgICAgICBfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIgLCA4KQogCiAvKiBzZXQgZmxvdyBpZCBjb21tYW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmggYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKaW5kZXggZWIzYTYxOS4uYmVhYjQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaApAQCAtMTY4LDE3ICsxNjgsNiBAQAogCXN0cnVjdCBzbGljX3NwaW5sb2NrIGxvY2s7CiB9OwogCi0jaWZkZWYgU1RBVFVTX1NVQ0NFU1MKLSN1bmRlZiBTVEFUVVNfU1VDQ0VTUwotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1RBVFVTX1BFTkRJTkcgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgLTEKLSNkZWZpbmUgU1RBVFVTX0VSUk9SICAgICAgICAgICAgICAgLTIKLSNkZWZpbmUgU1RBVFVTX05PVF9TVVBQT1JURUQgICAgICAgLTMKLSNkZWZpbmUgU1RBVFVTX0JVRkZFUl9UT09fU0hPUlQgICAgLTQKLQogI2RlZmluZSBTTElDX01BWF9DQVJEUyAgICAgICAgICAgICAgMzIKICNkZWZpbmUgU0xJQ19NQVhfUE9SVFMgICAgICAgICAgICAgIDQgICAgICAgIC8qIE1heCAjIG9mIHBvcnRzIHBlciBjYXJkICAgKi8KIApAQCAtNTEwLDcgKzQ5OSw2IEBACiAgICAgc3RydWN0IHNsaWNfaWZldmVudHMgIGlmX2V2ZW50czsKICAgICBzdHJ1Y3Qgc2xpY19zdGF0cyAgICAgICAgaW5pY3N0YXRzX3ByZXY7CiAgICAgc3RydWN0IHNsaWNuZXRfc3RhdHMgICAgIHNsaWNfc3RhdHM7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwppbmRleCBiZWJmMGZkLi5mOGM0YjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCkBAIC05Nyw2NiArOTcsNiBAQAogI2luY2x1ZGUgInNsaWNody5oIgogI2luY2x1ZGUgInNsaWMuaCIKIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbGljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgc2xpY19lbnRyeV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBzbGljX2VudHJ5X2hhbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHNsaWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7Ci1zdGF0aWMgbmV0ZGV2X3R4X3Qgc2xpY194bWl0X3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgc2xpY194bWl0X2ZhaWwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICB2b2lkICpjbWQsIHUzMiBza2J0eXBlLCB1MzIgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIHNsaWNfY29uZmlnX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KTsKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2xpY19yY3ZxdWV1ZV9nZXRuZXh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBpbnQgc2xpY19tYWNfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcHRyKTsKLXN0YXRpYyB2b2lkIHNsaWNfbGlua19ldmVudF9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpc3IpOwotc3RhdGljIGludCBzbGljX3JzcHF1ZXVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc2xpY19yc3BxdWV1ZV9mcmVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpY19yc3BidWYgKnNsaWNfcnNwcXVldWVfZ2V0bmV4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IHNsaWNfY21kcV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHNsaWNfY21kcV9mcmVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHNsaWNfY21kcV9yZXNldChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX2NtZHFfYWRkY21kcGFnZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyICpwYWdlKTsKLXN0YXRpYyB2b2lkIHNsaWNfY21kcV9nZXRkb25lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHNsaWNfY21kcV9wdXRkb25lX2lycShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBzbGljX2hvc3RjbWQgKmNtZCk7Ci1zdGF0aWMgc3RydWN0IHNsaWNfaG9zdGNtZCAqc2xpY19jbWRxX2dldGZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIGludCBzbGljX3JjdnF1ZXVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIGludCBzbGljX3JjdnF1ZXVlX2ZpbGwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHUzMiBzbGljX3JjdnF1ZXVlX3JlaW5zZXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIHNsaWNfcmN2cXVldWVfZnJlZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX2FkYXB0ZXJfc2V0X2h3YWRkcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgaW50IHNsaWNfY2FyZF9pbml0KHN0cnVjdCBzbGljY2FyZCAqY2FyZCwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc2xpY19pbnRhZ2dfc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgdmFsdWUpOwotc3RhdGljIGludCBzbGljX2NhcmRfZG93bmxvYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHUzMiBzbGljX2NhcmRfbG9jYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBpbnQgc2xpY19pZl9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBpbnQgc2xpY19hZGFwdGVyX2FsbG9jcmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHNsaWNfYWRhcHRlcl9mcmVlcmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHNsaWNfbGlua19jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBsaW5rc3BlZWQsCi0JCQkgICAgIHUzMiBsaW5rZHVwbGV4KTsKLXN0YXRpYyB2b2lkIHNsaWNfdW5tYXBfbW1pb19zcGFjZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX2NhcmRfY2xlYW51cChzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQpOwotc3RhdGljIHZvaWQgc2xpY19zb2Z0X3Jlc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBib29sIHNsaWNfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgZXRoZXJfaGVhZGVyICpldGhlcl9mcmFtZSk7Ci1zdGF0aWMgdm9pZCBzbGljX21hY19hZGRyZXNzX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX21hY19jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc2xpY19tY2FzdF9zZXRfbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19zZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgbGlua2NoYW5nZSk7Ci1zdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19jbGVhcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19nZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjb25maWcsCi0JCQkgICAgdTMyIGNvbmZpZ2gpOwotc3RhdGljIHZvaWQgc2xpY190aW1lcl9sb2FkX2NoZWNrKHVsb25nIGNvbnRleHQpOwotc3RhdGljIHZvaWQgc2xpY19hc3NlcnRfZmFpbCh2b2lkKTsKLXN0YXRpYyB1c2hvcnQgc2xpY19lZXByb21fY2tzdW0oY2hhciAqbSwgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCBzbGljX3Vwcl9zdGFydChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzbGljX2xpbmtfdXByX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgSXNyKTsKLXN0YXRpYyBpbnQgIHNsaWNfdXByX3JlcXVlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB1cHJfcmVxdWVzdCwKLQkJCSAgICAgdTMyIHVwcl9kYXRhLCB1MzIgdXByX2RhdGFfaCwgdTMyIHVwcl9idWZmZXIsCi0JCQkgICAgIHUzMiB1cHJfYnVmZmVyX2gpOwotc3RhdGljIHZvaWQgc2xpY19tY2FzdF9zZXRfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotCiBzdGF0aWMgdWludCBzbGljX2ZpcnN0X2luaXQgPSAxOwogc3RhdGljIGNoYXIgKnNsaWNfYmFubmVyID0gIkFsYWNyaXRlY2ggU0xJQyBUZWNobm9sb2d5KHRtKSBTZXJ2ZXIgIlwKIAkJImFuZCBTdG9yYWdlIEFjY2VsZXJhdG9yIChOb24tQWNjZWxlcmF0ZWQpIjsKQEAgLTIwNiw2ICsxNDYsMTcgQEAKICN1bmRlZiBBU1NFUlQKICNlbmRpZgogCitzdGF0aWMgdm9pZCBzbGljX2Fzc2VydF9mYWlsKHZvaWQpCit7CisJdTMyIGNwdWlkOworCXUzMiBjdXJyX3BpZDsKKwljcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljdXJyX3BpZCA9IGN1cnJlbnQtPnBpZDsKKworCXByaW50ayhLRVJOX0VSUiAiJXMgQ1BVICMgJWQgLS0tLSBQSUQgIyAlZFxuIiwKKwkgICAgICAgX19mdW5jX18sIGNwdWlkLCBjdXJyX3BpZCk7Cit9CisKICNpZm5kZWYgQVNTRVJUCiAjZGVmaW5lIEFTU0VSVChhKSBkbyB7CQkJCQkJCVwKIAlpZiAoIShhKSkgewkJCQkJCQlcCkBAIC0yNDEsMTMgKzE5Miw2IEBACiAJCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCiB9CiAKLXN0YXRpYyB2b2lkIHNsaWNfZGVidWdfaW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIHNsaWNfZGVidWdfY2xlYW51cCh2b2lkKTsKLXN0YXRpYyB2b2lkIHNsaWNfZGVidWdfYWRhcHRlcl9jcmVhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc2xpY19kZWJ1Z19hZGFwdGVyX2Rlc3Ryb3koc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc2xpY19kZWJ1Z19jYXJkX2NyZWF0ZShzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQpOwotc3RhdGljIHZvaWQgc2xpY19kZWJ1Z19jYXJkX2Rlc3Ryb3koc3RydWN0IHNsaWNjYXJkICpjYXJkKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHNsaWNfcmVnMzJfd3JpdGUodm9pZCBfX2lvbWVtICpyZWcsIHUzMiB2YWx1ZSwgYm9vbCBmbHVzaCkKIHsKIAl3cml0ZWwodmFsdWUsIHJlZyk7CkBAIC0yNzIsMTAxNiArMjE2LDYgQEAKIAkJCQlhZGFwdGVyLT5iaXQ2NHJlZ2xvY2suZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBzbGljX2luaXRfZHJpdmVyKHZvaWQpCi17Ci0JaWYgKHNsaWNfZmlyc3RfaW5pdCkgewotCQlzbGljX2ZpcnN0X2luaXQgPSAwOwotCQlzcGluX2xvY2tfaW5pdCgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2subG9jayk7Ci0JCXNsaWNfZGVidWdfaW5pdCgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2xpY19pbml0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX3RibF9lbnRyeSwKLQkJCSAgICAgIHZvaWQgX19pb21lbSAqbWVtYWRkciwgaW50IGNoaXBfaWR4KQotewotCXVzaG9ydCBpbmRleDsKLQlzdHJ1Y3Qgc2xpY19oYW5kbGUgKnBzbGljX2hhbmRsZTsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLS8qCWFkYXB0ZXItPnBjaWRldiA9IHBjaWRldjsqLwotCWFkYXB0ZXItPnZlbmRpZCA9IHBjaV90YmxfZW50cnktPnZlbmRvcjsKLQlhZGFwdGVyLT5kZXZpZCA9IHBjaV90YmxfZW50cnktPmRldmljZTsKLQlhZGFwdGVyLT5zdWJzeXNpZCA9IHBjaV90YmxfZW50cnktPnN1YmRldmljZTsKLQlhZGFwdGVyLT5idXNudW1iZXIgPSBwY2lkZXYtPmJ1cy0+bnVtYmVyOwotCWFkYXB0ZXItPnNsb3RudW1iZXIgPSAoKHBjaWRldi0+ZGV2Zm4gPj4gMykgJiAweDFGKTsKLQlhZGFwdGVyLT5mdW5jdGlvbm51bWJlciA9IChwY2lkZXYtPmRldmZuICYgMHg3KTsKLQlhZGFwdGVyLT5tZW1vcnlsZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMCk7Ci0JYWRhcHRlci0+c2xpY19yZWdzID0gKF9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqKW1lbWFkZHI7Ci0JYWRhcHRlci0+aXJxID0gcGNpZGV2LT5pcnE7Ci0vKglhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7Ki8KLQlhZGFwdGVyLT5uZXh0X25ldGRldmljZSA9IGhlYWRfbmV0ZGV2aWNlOwotCWhlYWRfbmV0ZGV2aWNlID0gbmV0ZGV2OwotCWFkYXB0ZXItPmNoaXBpZCA9IGNoaXBfaWR4OwotCWFkYXB0ZXItPnBvcnQgPSAwOwkvKmFkYXB0ZXItPmZ1bmN0aW9ubnVtYmVyOyovCi0JYWRhcHRlci0+Y2FyZGluZGV4ID0gYWRhcHRlci0+cG9ydDsKLQlhZGFwdGVyLT5tZW1vcnliYXNlID0gbWVtYWRkcjsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dXByX2xvY2subG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmJpdDY0cmVnbG9jay5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+YWRhcHRlcl9sb2NrLmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5yZXNldF9sb2NrLmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrKTsKLQotCWFkYXB0ZXItPmNhcmRfc2l6ZSA9IDE7Ci0JLyoKLQkgIEluaXRpYWxpemUgc2xpY19oYW5kbGUgYXJyYXkKLQkqLwotCUFTU0VSVChTTElDX0NNRFFfTUFYQ01EUyA8PSAweEZGRkYpOwotCS8qCi0JIFN0YXJ0IHdpdGggMS4gIDAgaXMgYW4gaW52YWxpZCBob3N0IGhhbmRsZS4KLQkqLwotCWZvciAoaW5kZXggPSAxLCBwc2xpY19oYW5kbGUgPSAmYWRhcHRlci0+c2xpY19oYW5kbGVzWzFdOwotCSAgICAgaW5kZXggPCBTTElDX0NNRFFfTUFYQ01EUzsgaW5kZXgrKywgcHNsaWNfaGFuZGxlKyspIHsKLQotCQlwc2xpY19oYW5kbGUtPnRva2VuLmhhbmRsZV9pbmRleCA9IGluZGV4OwotCQlwc2xpY19oYW5kbGUtPnR5cGUgPSBTTElDX0hBTkRMRV9GUkVFOwotCQlwc2xpY19oYW5kbGUtPm5leHQgPSBhZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXM7Ci0JCWFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlcyA9IHBzbGljX2hhbmRsZTsKLQl9Ci0JYWRhcHRlci0+cHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopCi0JCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSwKLQkJCQkJJmFkYXB0ZXItPgotCQkJCQlwaHlzX3NobWVtKTsKLQlBU1NFUlQoYWRhcHRlci0+cHNobWVtKTsKLQotCW1lbXNldChhZGFwdGVyLT5wc2htZW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSkpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNsaWNfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4JCT0gc2xpY19lbnRyeV9vcGVuLAotCS5uZG9fc3RvcAkJPSBzbGljX2VudHJ5X2hhbHQsCi0JLm5kb19zdGFydF94bWl0CQk9IHNsaWNfeG1pdF9zdGFydCwKLQkubmRvX2RvX2lvY3RsCQk9IHNsaWNfaW9jdGwsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBzbGljX21hY19zZXRfYWRkcmVzcywKLQkubmRvX2dldF9zdGF0cwkJPSBzbGljX2dldF9zdGF0cywKLQkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHNsaWNfbWNhc3Rfc2V0X2xpc3QsCi0JLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi0JLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgc2xpY19lbnRyeV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfdGJsX2VudHJ5KQotewotCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQ7Ci0Jc3RhdGljIGludCBkaWRfdmVyc2lvbjsKLQlpbnQgZXJyID0gLUVOT0RFVjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOwotCXZvaWQgX19pb21lbSAqbWVtbWFwcGVkX2lvYWRkciA9IE5VTEw7Ci0JdTMyIHN0YXR1cyA9IDA7Ci0JdWxvbmcgbW1pb19zdGFydCA9IDA7Ci0JdWxvbmcgbW1pb19sZW4gPSAwOwotCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IE5VTEw7Ci0JaW50IHBjaV91c2luZ19kYWMgPSAwOwotCi0Jc2xpY19nbG9iYWwuZHluYW1pY19pbnRhZ2cgPSBkeW5hbWljX2ludGFnZzsKLQotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldik7Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKHNsaWNfZGVidWcgPiAwICYmIGRpZF92ZXJzaW9uKysgPT0gMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHNsaWNfYmFubmVyKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBzbGljX3Byb2NfdmVyc2lvbik7Ci0JfQotCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKLQkJcGNpX3VzaW5nX2RhYyA9IDE7Ci0JCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soNjQpKSkgewotCQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJ1bmFibGUgdG8gb2J0YWluIDY0LWJpdCBETUEgZm9yICIKLQkJCQkJImNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOwotCQkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGNpOwotCQl9Ci0JfSBlbHNlIGlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKLQkJcGNpX3VzaW5nX2RhYyA9IDA7Ci0JCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAibm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKLQkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGNpOwotCX0KLQotCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpZGV2LCBEUlZfTkFNRSk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImNhbid0IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKLQkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGNpOwotCX0KLQotCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7Ci0KLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFkYXB0ZXIpKTsKLQlpZiAoIW5ldGRldikgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXRfZXhpdF9zbGljX3Byb2JlOwotCX0KLQotCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBjaWRldi0+ZGV2KTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIG5ldGRldik7Ci0JYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OwotCWFkYXB0ZXItPnBjaWRldiA9IHBjaWRldjsKLQlpZiAocGNpX3VzaW5nX2RhYykKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7Ci0KLQltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7Ci0JbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMCk7Ci0KLQotLyoJbWVtbWFwcGVkX2lvYWRkciA9ICAodTMyKWlvcmVtYXBfbm9jYWNoZShtbWlvX3N0YXJ0LCBtbWlvX2xlbik7Ki8KLQltZW1tYXBwZWRfaW9hZGRyID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7Ci0JaWYgKCFtZW1tYXBwZWRfaW9hZGRyKSB7Ci0JCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiY2Fubm90IHJlbWFwIE1NSU8gcmVnaW9uICVseCBAICVseFxuIiwKLQkJCW1taW9fbGVuLCBtbWlvX3N0YXJ0KTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCX0KLQotCXNsaWNfY29uZmlnX3BjaShwY2lkZXYpOwotCi0Jc2xpY19pbml0X2RyaXZlcigpOwotCi0Jc2xpY19pbml0X2FkYXB0ZXIobmV0ZGV2LAotCQkJICBwY2lkZXYsIHBjaV90YmxfZW50cnksIG1lbW1hcHBlZF9pb2FkZHIsIGNhcmRzX2ZvdW5kKTsKLQotCXN0YXR1cyA9IHNsaWNfY2FyZF9sb2NhdGUoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImNhbm5vdCBsb2NhdGUgY2FyZFxuIik7Ci0JCWdvdG8gZXJyX291dF9mcmVlX21taW9fcmVnaW9uOwotCX0KLQotCWNhcmQgPSBhZGFwdGVyLT5jYXJkOwotCi0JaWYgKCFhZGFwdGVyLT5hbGxvY2F0ZWQpIHsKLQkJY2FyZC0+YWRhcHRlcnNfYWxsb2NhdGVkKys7Ci0JCWFkYXB0ZXItPmFsbG9jYXRlZCA9IDE7Ci0JfQotCi0Jc3RhdHVzID0gc2xpY19jYXJkX2luaXQoY2FyZCwgYWRhcHRlcik7Ci0KLQlpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCWNhcmQtPnN0YXRlID0gQ0FSRF9GQUlMOwotCQlhZGFwdGVyLT5zdGF0ZSA9IEFEQVBUX0ZBSUw7Ci0JCWFkYXB0ZXItPmxpbmtzdGF0ZSA9IExJTktfRE9XTjsKLQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJGQUlMRUQgc3RhdHVzWyV4XVxuIiwgc3RhdHVzKTsKLQl9IGVsc2UgewotCQlzbGljX2FkYXB0ZXJfc2V0X2h3YWRkcihhZGFwdGVyKTsKLQl9Ci0KLQluZXRkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPm1lbW9yeWJhc2U7Ci0JbmV0ZGV2LT5pcnEgPSBhZGFwdGVyLT5pcnE7Ci0JbmV0ZGV2LT5uZXRkZXZfb3BzID0gJnNsaWNfbmV0ZGV2X29wczsKLQotCXNsaWNfZGVidWdfYWRhcHRlcl9jcmVhdGUoYWRhcHRlcik7Ci0KLQlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dF91bm1hcDsKLQl9Ci0KLQljYXJkc19mb3VuZCsrOwotCi0JcmV0dXJuIHN0YXR1czsKLQotZXJyX291dF91bm1hcDoKLQlpb3VubWFwKG1lbW1hcHBlZF9pb2FkZHIpOwotZXJyX291dF9mcmVlX21taW9fcmVnaW9uOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbik7Ci1lcnJfb3V0X2ZyZWVfbmV0ZGV2OgotCWZyZWVfbmV0ZGV2KG5ldGRldik7Ci1lcnJfb3V0X2V4aXRfc2xpY19wcm9iZToKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaWRldik7Ci1lcnJfb3V0X2Rpc2FibGVfcGNpOgotCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpY19lbnRyeV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7Ci0JdTMyIGxvY2tlZCA9IDA7Ci0JaW50IHN0YXR1czsKLQotCUFTU0VSVChhZGFwdGVyKTsKLQlBU1NFUlQoY2FyZCk7Ci0KLQluZXRpZl9zdG9wX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2subG9jaywKLQkJCQlzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5mbGFncyk7Ci0JbG9ja2VkID0gMTsKLQlpZiAoIWFkYXB0ZXItPmFjdGl2YXRlZCkgewotCQljYXJkLT5hZGFwdGVyc19hY3RpdmF0ZWQrKzsKLQkJc2xpY19nbG9iYWwubnVtX3NsaWNfcG9ydHNfYWN0aXZlKys7Ci0JCWFkYXB0ZXItPmFjdGl2YXRlZCA9IDE7Ci0JfQotCXN0YXR1cyA9IHNsaWNfaWZfaW5pdChhZGFwdGVyKTsKLQotCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJaWYgKGFkYXB0ZXItPmFjdGl2YXRlZCkgewotCQkJY2FyZC0+YWRhcHRlcnNfYWN0aXZhdGVkLS07Ci0JCQlzbGljX2dsb2JhbC5udW1fc2xpY19wb3J0c19hY3RpdmUtLTsKLQkJCWFkYXB0ZXItPmFjdGl2YXRlZCA9IDA7Ci0JCX0KLQkJaWYgKGxvY2tlZCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2subG9jaywKLQkJCQkJCXNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmZsYWdzKTsKLQkJCWxvY2tlZCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JaWYgKCFjYXJkLT5tYXN0ZXIpCi0JCWNhcmQtPm1hc3RlciA9IGFkYXB0ZXI7Ci0KLQlpZiAobG9ja2VkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmxvY2ssCi0JCQkJCXNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmZsYWdzKTsKLQkJbG9ja2VkID0gMDsKLQl9Ci0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbGljX2VudHJ5X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKLQl1MzIgbW1pb19zdGFydCA9IDA7Ci0JdWludCBtbWlvX2xlbiA9IDA7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzbGljY2FyZCAqY2FyZDsKLQlzdHJ1Y3QgbWNhc3RfYWRkcmVzcyAqbWNhZGRyLCAqbWxpc3Q7Ci0KLQlBU1NFUlQoYWRhcHRlcik7Ci0Jc2xpY19hZGFwdGVyX2ZyZWVyZXNvdXJjZXMoYWRhcHRlcik7Ci0Jc2xpY191bm1hcF9tbWlvX3NwYWNlKGFkYXB0ZXIpOwotCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0KLQltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7Ci0JbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMCk7Ci0KLQlyZWxlYXNlX21lbV9yZWdpb24obW1pb19zdGFydCwgbW1pb19sZW4pOwotCi0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHIpOwotCS8qIGZyZWUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLwotCW1saXN0ID0gYWRhcHRlci0+bWNhc3RhZGRyczsKLQl3aGlsZSAobWxpc3QpIHsKLQkJbWNhZGRyID0gbWxpc3Q7Ci0JCW1saXN0ID0gbWxpc3QtPm5leHQ7Ci0JCWtmcmVlKG1jYWRkcik7Ci0JfQotCUFTU0VSVChhZGFwdGVyLT5jYXJkKTsKLQljYXJkID0gYWRhcHRlci0+Y2FyZDsKLQlBU1NFUlQoY2FyZC0+YWRhcHRlcnNfYWxsb2NhdGVkKTsKLQljYXJkLT5hZGFwdGVyc19hbGxvY2F0ZWQtLTsKLQlhZGFwdGVyLT5hbGxvY2F0ZWQgPSAwOwotCWlmICghY2FyZC0+YWRhcHRlcnNfYWxsb2NhdGVkKSB7Ci0JCXN0cnVjdCBzbGljY2FyZCAqY3Vycl9jYXJkID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOwotCQlpZiAoY3Vycl9jYXJkID09IGNhcmQpIHsKLQkJCXNsaWNfZ2xvYmFsLnNsaWNfY2FyZCA9IGNhcmQtPm5leHQ7Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoY3Vycl9jYXJkLT5uZXh0ICE9IGNhcmQpCi0JCQkJY3Vycl9jYXJkID0gY3Vycl9jYXJkLT5uZXh0OwotCQkJQVNTRVJUKGN1cnJfY2FyZCk7Ci0JCQljdXJyX2NhcmQtPm5leHQgPSBjYXJkLT5uZXh0OwotCQl9Ci0JCUFTU0VSVChzbGljX2dsb2JhbC5udW1fc2xpY19jYXJkcyk7Ci0JCXNsaWNfZ2xvYmFsLm51bV9zbGljX2NhcmRzLS07Ci0JCXNsaWNfY2FyZF9jbGVhbnVwKGNhcmQpOwotCX0KLQlrZnJlZShkZXYpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpZGV2KTsKLX0KLQotc3RhdGljIGludCBzbGljX2VudHJ5X2hhbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNsaWNjYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5sb2NrLAotCQkJCXNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmZsYWdzKTsKLQlBU1NFUlQoY2FyZCk7Ci0JbmV0aWZfc3RvcF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwotCWFkYXB0ZXItPnN0YXRlID0gQURBUFRfRE9XTjsKLQlhZGFwdGVyLT5saW5rc3RhdGUgPSBMSU5LX0RPV047Ci0JYWRhcHRlci0+dXByX2xpc3QgPSBOVUxMOwotCWFkYXB0ZXItPnVwcl9idXN5ID0gMDsKLQlhZGFwdGVyLT5kZXZmbGFnc19wcmV2ID0gMDsKLQlBU1NFUlQoY2FyZC0+YWRhcHRlclthZGFwdGVyLT5jYXJkaW5kZXhdID09IGFkYXB0ZXIpOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pY3IsIElDUl9JTlRfT0ZGLCBGTFVTSCk7Ci0JYWRhcHRlci0+YWxsX3JlZ193cml0ZXMrKzsKLQlhZGFwdGVyLT5pY3JfcmVnX3dyaXRlcysrOwotCXNsaWNfY29uZmlnX2NsZWFyKGFkYXB0ZXIpOwotCWlmIChhZGFwdGVyLT5hY3RpdmF0ZWQpIHsKLQkJY2FyZC0+YWRhcHRlcnNfYWN0aXZhdGVkLS07Ci0JCXNsaWNfZ2xvYmFsLm51bV9zbGljX3BvcnRzX2FjdGl2ZS0tOwotCQlhZGFwdGVyLT5hY3RpdmF0ZWQgPSAwOwotCX0KLSNpZmRlZiBBVVRPTUFUSUNfUkVTRVQKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmVzZXRfaWZhY2UsIDAsIEZMVVNIKTsKLSNlbmRpZgotCS8qCi0JICogIFJlc2V0IHRoZSBhZGFwdGVyJ3MgY21kIHF1ZXVlcwotCSAqLwotCXNsaWNfY21kcV9yZXNldChhZGFwdGVyKTsKLQotI2lmZGVmIEFVVE9NQVRJQ19SRVNFVAotCWlmICghY2FyZC0+YWRhcHRlcnNfYWN0aXZhdGVkKQotCQlzbGljX2NhcmRfaW5pdChjYXJkLCBhZGFwdGVyKTsKLSNlbmRpZgotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2subG9jaywKLQkJCQlzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5mbGFncyk7Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHNsaWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGV0aHRvb2xfY21kIGVkYXRhOwotCXN0cnVjdCBldGh0b29sX2NtZCBlY21kOwotCXUzMiBkYXRhWzddOwotCXUzMiBpbnRhZ2c7Ci0KLQlBU1NFUlQocnEpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DU0xJQ1NFVElOVEFHRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHJxLT5pZnJfZGF0YSwgMjgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWludGFnZyA9IGRhdGFbMF07Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXM6IHNldCBpbnRlcnJ1cHQgYWdncmVnYXRpb24gdG8gJWRcbiIsCi0JCQlfX2Z1bmNfXywgaW50YWdnKTsKLQkJc2xpY19pbnRhZ2dfc2V0KGFkYXB0ZXIsIGludGFnZyk7Ci0JCXJldHVybiAwOwotCi0jaWZkZWYgU0xJQ19UUkFDRV9EVU1QX0VOQUJMRUQKLQljYXNlIFNJT0NTTElDVFJBQ0VEVU1QOgotCQl7Ci0JCQl1MzIgdmFsdWU7Ci0JCQlEQkdfSU9DVEwoInNsaWNfaW9jdGwgIFNJT0NTTElDX1RSQUNFX0RVTVBcbiIpOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgcnEtPmlmcl9kYXRhLCAyOCkpIHsKLQkJCQlQUklOVF9FUlJPUgotCQkJCSAgICAoInNsaWM6IGNvcHlfZnJvbV91c2VyIEZBSUxFRCBnZXR0aW5nIGluaXRpYWwgc2ltYmEgcGFyYW1cbiIpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCi0JCQl2YWx1ZSA9IGRhdGFbMF07Ci0JCQlpZiAodHJhY2Vtb25fcmVxdWVzdCA9PSBTTElDX0RVTVBfRE9ORSkgewotCQkJCVBSSU5UX0VSUk9SCi0JCQkJICAgICgiQVRLIERpYWdub3N0aWMgVHJhY2UgRHVtcCBSZXF1ZXN0ZWRcbiIpOwotCQkJCXRyYWNlbW9uX3JlcXVlc3QgPSBTTElDX0RVTVBfUkVRVUVTVEVEOwotCQkJCXRyYWNlbW9uX3JlcXVlc3RfdHlwZSA9IHZhbHVlOwotCQkJCXRyYWNlbW9uX3RpbWVzdGFtcCA9IGppZmZpZXM7Ci0JCQl9IGVsc2UgaWYgKCh0cmFjZW1vbl9yZXF1ZXN0ID09IFNMSUNfRFVNUF9SRVFVRVNURUQpIHx8Ci0JCQkJICAgKHRyYWNlbW9uX3JlcXVlc3QgPT0KLQkJCQkgICAgU0xJQ19EVU1QX0lOX1BST0dSRVNTKSkgewotCQkJCVBSSU5UX0VSUk9SCi0JCQkJICAgICgiQVRLIERpYWdub3N0aWMgVHJhY2UgRHVtcCBSZXF1ZXN0ZWQgYnV0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuLi4gaWdub3JlXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUFJJTlRfRVJST1IKLQkJCQkgICAgKCJBVEsgRGlhZ25vc3RpYyBUcmFjZSBEdW1wIFJlcXVlc3RlZFxuIik7Ci0JCQkJdHJhY2Vtb25fcmVxdWVzdCA9IFNMSUNfRFVNUF9SRVFVRVNURUQ7Ci0JCQkJdHJhY2Vtb25fcmVxdWVzdF90eXBlID0gdmFsdWU7Ci0JCQkJdHJhY2Vtb25fdGltZXN0YW1wID0gamlmZmllczsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0jZW5kaWYKLQljYXNlIFNJT0NFVEhUT09MOgotCQlBU1NFUlQoYWRhcHRlcik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZWNtZCwgcnEtPmlmcl9kYXRhLCBzaXplb2YoZWNtZCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGVjbWQuY21kID09IEVUSFRPT0xfR1NFVCkgewotCQkJZWRhdGEuc3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAotCQkJCQkgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKLQkJCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAotCQkJCQkgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgIFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX01JSSk7Ci0JCQllZGF0YS5wb3J0ID0gUE9SVF9NSUk7Ci0JCQllZGF0YS50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JCQllZGF0YS5waHlfYWRkcmVzcyA9IDA7Ci0JCQlpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTAwTUIpCi0JCQkJZWRhdGEuc3BlZWQgPSBTUEVFRF8xMDA7Ci0JCQllbHNlIGlmIChhZGFwdGVyLT5saW5rc3BlZWQgPT0gTElOS18xME1CKQotCQkJCWVkYXRhLnNwZWVkID0gU1BFRURfMTA7Ci0JCQllbHNlCi0JCQkJZWRhdGEuc3BlZWQgPSAwOwotCi0JCQlpZiAoYWRhcHRlci0+bGlua2R1cGxleCA9PSBMSU5LX0ZVTExEKQotCQkJCWVkYXRhLmR1cGxleCA9IERVUExFWF9GVUxMOwotCQkJZWxzZQotCQkJCWVkYXRhLmR1cGxleCA9IERVUExFWF9IQUxGOwotCi0JCQllZGF0YS5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7Ci0JCQllZGF0YS5tYXh0eHBrdCA9IDE7Ci0JCQllZGF0YS5tYXhyeHBrdCA9IDE7Ci0JCQlpZiAoY29weV90b191c2VyKHJxLT5pZnJfZGF0YSwgJmVkYXRhLCBzaXplb2YoZWRhdGEpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQl9IGVsc2UgaWYgKGVjbWQuY21kID09IEVUSFRPT0xfU1NFVCkgewotCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJCXJldHVybiAtRVBFUk07Ci0KLQkJCWlmIChhZGFwdGVyLT5saW5rc3BlZWQgPT0gTElOS18xMDBNQikKLQkJCQllZGF0YS5zcGVlZCA9IFNQRUVEXzEwMDsKLQkJCWVsc2UgaWYgKGFkYXB0ZXItPmxpbmtzcGVlZCA9PSBMSU5LXzEwTUIpCi0JCQkJZWRhdGEuc3BlZWQgPSBTUEVFRF8xMDsKLQkJCWVsc2UKLQkJCQllZGF0YS5zcGVlZCA9IDA7Ci0KLQkJCWlmIChhZGFwdGVyLT5saW5rZHVwbGV4ID09IExJTktfRlVMTEQpCi0JCQkJZWRhdGEuZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCQllbHNlCi0JCQkJZWRhdGEuZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0KLQkJCWVkYXRhLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKLQkJCWVkYXRhLm1heHR4cGt0ID0gMTsKLQkJCWVkYXRhLm1heHJ4cGt0ID0gMTsKLQkJCWlmICgoZWNtZC5zcGVlZCAhPSBlZGF0YS5zcGVlZCkgfHwKLQkJCSAgICAoZWNtZC5kdXBsZXggIT0gZWRhdGEuZHVwbGV4KSkgewotCQkJCXUzMiBzcGVlZDsKLQkJCQl1MzIgZHVwbGV4OwotCi0JCQkJaWYgKGVjbWQuc3BlZWQgPT0gU1BFRURfMTApCi0JCQkJCXNwZWVkID0gMDsKLQkJCQllbHNlCi0JCQkJCXNwZWVkID0gUENSX1NQRUVEXzEwMDsKLQkJCQlpZiAoZWNtZC5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQkJCWR1cGxleCA9IFBDUl9EVVBMRVhfRlVMTDsKLQkJCQllbHNlCi0JCQkJCWR1cGxleCA9IDA7Ci0JCQkJc2xpY19saW5rX2NvbmZpZyhhZGFwdGVyLCBzcGVlZCwgZHVwbGV4KTsKLQkJCQlzbGljX2xpbmtfZXZlbnRfaGFuZGxlcihhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotfQotCi0jZGVmaW5lICBYTUlUX0ZBSUxfTElOS19TVEFURSAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgIFhNSVRfRkFJTF9aRVJPX0xFTkdUSCAgICAgICAgICAgICAgMgotI2RlZmluZSAgWE1JVF9GQUlMX0hPU1RDTURfRkFJTCAgICAgICAgICAgICAzCi0KLXN0YXRpYyB2b2lkIHNsaWNfeG1pdF9idWlsZF9yZXF1ZXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJICAgICBzdHJ1Y3Qgc2xpY19ob3N0Y21kICpoY21kLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBzbGljX2hvc3Q2NF9jbWQgKmloY21kOwotCXVsb25nIHBoeXNfYWRkcjsKLQotCWloY21kID0gJmhjbWQtPmNtZDY0OwotCi0JaWhjbWQtPmZsYWdzID0gKGFkYXB0ZXItPnBvcnQgPDwgSUhGTEdfSUZTSEZUKTsKLQlpaGNtZC0+Y29tbWFuZCA9IElIQ01EX1hNVF9SRVE7Ci0JaWhjbWQtPnUuc2xpY19idWZmZXJzLnRvdGxlbiA9IHNrYi0+bGVuOwotCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPnBjaWRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKLQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwotCWloY21kLT51LnNsaWNfYnVmZmVycy5idWZzWzBdLnBhZGRybCA9IFNMSUNfR0VUX0FERFJfTE9XKHBoeXNfYWRkcik7Ci0JaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMF0ucGFkZHJoID0gU0xJQ19HRVRfQUREUl9ISUdIKHBoeXNfYWRkcik7Ci0JaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMF0ubGVuZ3RoID0gc2tiLT5sZW47Ci0jaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQotCWhjbWQtPmNtZHNpemUgPSAodTMyKSAoKCgodTY0KSZpaGNtZC0+dS5zbGljX2J1ZmZlcnMuYnVmc1sxXSAtCi0JCQkJICAgICAodTY0KSBoY21kKSArIDMxKSA+PiA1KTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1g4NikKLQloY21kLT5jbWRzaXplID0gKCgoKHUzMikgJmloY21kLT51LnNsaWNfYnVmZmVycy5idWZzWzFdIC0KLQkJCSAgICh1MzIpIGhjbWQpICsgMzEpID4+IDUpOwotI2Vsc2UKLQlTdG9wIENvbXBpbGF0aW9uOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgTk9STUFMX0VUSEZSQU1FICAgICAwCi0KLXN0YXRpYyBuZXRkZXZfdHhfdCBzbGljX3htaXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzbGljX2hvc3RjbWQgKmhjbWQgPSBOVUxMOwotCXUzMiBzdGF0dXMgPSAwOwotCXUzMiBza2J0eXBlID0gTk9STUFMX0VUSEZSQU1FOwotCXZvaWQgKm9mZmxvYWRjbWQgPSBOVUxMOwotCi0JY2FyZCA9IGFkYXB0ZXItPmNhcmQ7Ci0JQVNTRVJUKGNhcmQpOwotCWlmICgoYWRhcHRlci0+bGlua3N0YXRlICE9IExJTktfVVApIHx8Ci0JICAgIChhZGFwdGVyLT5zdGF0ZSAhPSBBREFQVF9VUCkgfHwgKGNhcmQtPnN0YXRlICE9IENBUkRfVVApKSB7Ci0JCXN0YXR1cyA9IFhNSVRfRkFJTF9MSU5LX1NUQVRFOwotCQlnb3RvIHhtaXRfZmFpbDsKLQotCX0gZWxzZSBpZiAoc2tiLT5sZW4gPT0gMCkgewotCQlzdGF0dXMgPSBYTUlUX0ZBSUxfWkVST19MRU5HVEg7Ci0JCWdvdG8geG1pdF9mYWlsOwotCX0KLQotCWlmIChza2J0eXBlID09IE5PUk1BTF9FVEhGUkFNRSkgewotCQloY21kID0gc2xpY19jbWRxX2dldGZyZWUoYWRhcHRlcik7Ci0JCWlmICghaGNtZCkgewotCQkJYWRhcHRlci0+eG1pdHFfZnVsbCA9IDE7Ci0JCQlzdGF0dXMgPSBYTUlUX0ZBSUxfSE9TVENNRF9GQUlMOwotCQkJZ290byB4bWl0X2ZhaWw7Ci0JCX0KLQkJQVNTRVJUKGhjbWQtPnBzbGljX2hhbmRsZSk7Ci0JCUFTU0VSVChoY21kLT5jbWQ2NC5ob3N0aGFuZGxlID09Ci0JCSAgICAgICBoY21kLT5wc2xpY19oYW5kbGUtPnRva2VuLmhhbmRsZV90b2tlbik7Ci0JCWhjbWQtPnNrYiA9IHNrYjsKLQkJaGNtZC0+YnVzeSA9IDE7Ci0JCWhjbWQtPnR5cGUgPSBTTElDX0NNRF9EVU1COwotCQlpZiAoc2tidHlwZSA9PSBOT1JNQUxfRVRIRlJBTUUpCi0JCQlzbGljX3htaXRfYnVpbGRfcmVxdWVzdChhZGFwdGVyLCBoY21kLCBza2IpOwotCX0KLQlhZGFwdGVyLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JYWRhcHRlci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0KLSNpZmRlZiBERUJVR19EVU1QCi0JaWYgKGFkYXB0ZXItPmtpbGxfY2FyZCkgewotCQlzdHJ1Y3Qgc2xpY19ob3N0NjRfY21kIGloY21kOwotCi0JCWloY21kID0gJmhjbWQtPmNtZDY0OwotCi0JCWloY21kLT5mbGFncyB8PSAweDQwOwotCQlhZGFwdGVyLT5raWxsX2NhcmQgPSAwOwkvKiBvbmx5IGRvIHRoaXMgb25jZSAqLwotCX0KLSNlbmRpZgotCWlmIChoY21kLT5wYWRkcmggPT0gMCkgewotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfY2JhciwKLQkJCQkgKGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUpLCBET05UX0ZMVVNIKTsKLQl9IGVsc2UgewotCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfY2JhcjY0LAotCQkJCSAoaGNtZC0+cGFkZHJsIHwgaGNtZC0+Y21kc2l6ZSksCi0JCQkJICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgaGNtZC0+cGFkZHJoLCBET05UX0ZMVVNIKTsKLQl9Ci14bWl0X2RvbmU6Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLXhtaXRfZmFpbDoKLQlzbGljX3htaXRfZmFpbChhZGFwdGVyLCBza2IsIG9mZmxvYWRjbWQsIHNrYnR5cGUsIHN0YXR1cyk7Ci0JZ290byB4bWl0X2RvbmU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsaWNfeG1pdF9mYWlsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgIHZvaWQgKmNtZCwgdTMyIHNrYnR5cGUsIHUzMiBzdGF0dXMpCi17Ci0JaWYgKGFkYXB0ZXItPnhtaXRxX2Z1bGwpCi0JCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKLQlpZiAoKGNtZCA9PSBOVUxMKSAmJiAoc3RhdHVzIDw9IFhNSVRfRkFJTF9IT1NUQ01EX0ZBSUwpKSB7Ci0JCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCWNhc2UgWE1JVF9GQUlMX0xJTktfU1RBVEU6Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkicmVqZWN0IHhtaXQgc2tiWyVwOiAleF0gbGlua3N0YXRlWyVzXSAiCi0JCQkJImFkYXB0ZXJbJXM6JWRdIGNhcmRbJXM6JWRdXG4iLAotCQkJCXNrYiwgc2tiLT5wa3RfdHlwZSwKLQkJCQlTTElDX0xJTktTVEFURShhZGFwdGVyLT5saW5rc3RhdGUpLAotCQkJCVNMSUNfQURBUFRFUl9TVEFURShhZGFwdGVyLT5zdGF0ZSksCi0JCQkJYWRhcHRlci0+c3RhdGUsCi0JCQkJU0xJQ19DQVJEX1NUQVRFKGFkYXB0ZXItPmNhcmQtPnN0YXRlKSwKLQkJCQlhZGFwdGVyLT5jYXJkLT5zdGF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBYTUlUX0ZBSUxfWkVST19MRU5HVEg6Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkieG1pdF9zdGFydCBza2ItPmxlbiA9PSAwIHNrYlslcF0gdHlwZVsleF1cbiIsCi0JCQkJc2tiLCBza2ItPnBrdF90eXBlKTsKLQkJCWJyZWFrOwotCQljYXNlIFhNSVRfRkFJTF9IT1NUQ01EX0ZBSUw6Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkieG1pdF9zdGFydCBza2JbJXBdIHR5cGVbJXhdIE5vIGhvc3QgY29tbWFuZHMgIgotCQkJCSJhdmFpbGFibGVcbiIsIHNrYiwgc2tiLT5wa3RfdHlwZSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVCgwKTsKLQkJfQotCX0KLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOwotfQotCi1zdGF0aWMgdm9pZCBzbGljX3Jjdl9oYW5kbGVfZXJyb3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCXN0cnVjdCBzbGljX3JjdmJ1ZiAqcmN2YnVmKQotewotCXN0cnVjdCBzbGljX2hkZHJfd2RzICpoZHIgPSAoc3RydWN0IHNsaWNfaGRkcl93ZHMgKilyY3ZidWYtPmRhdGE7Ci0KLQlpZiAoYWRhcHRlci0+ZGV2aWQgIT0gU0xJQ18xR0JfREVWSUNFX0lEKSB7Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1czE0ICYgVlJIU1RBVF84MDJPRSkKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5vZmxvdzgwMisrOwotCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXMxNCAmIFZSSFNUQVRfVFBPRkxPKQotCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwcnRvZmxvdysrOwotCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfODAyVUUpCi0JCQlhZGFwdGVyLT5pZl9ldmVudHMudWZsb3c4MDIrKzsKLQkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX1JDVkUpIHsKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5yY3ZlYXJseSsrOwotCQkJYWRhcHRlci0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKLQkJfQotCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfQlVGRikgewotCQkJYWRhcHRlci0+aWZfZXZlbnRzLkJ1Zm92Kys7Ci0JCQlhZGFwdGVyLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwotCQl9Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9DQVJSRSkgewotCQkJYWRhcHRlci0+aWZfZXZlbnRzLkNhcnJlKys7Ci0JCQlhZGFwdGVyLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwotCQl9Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9MT05HRSkKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5Mb25nZSsrOwotCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfUFJFQSkKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JbnZwKys7Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9DUkMpIHsKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5DcmMrKzsKLQkJCWFkYXB0ZXItPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJfQotCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfRFJCTCkKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5EcmJsKys7Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9DT0RFKQotCQkJYWRhcHRlci0+aWZfZXZlbnRzLkNvZGUrKzsKLQkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX1RQQ1NVTSkKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5UcENzdW0rKzsKLQkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX1RQSExFTikKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5UcEhsZW4rKzsKLQkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX0lQQ1NVTSkKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JcENzdW0rKzsKLQkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX0lQTEVSUikKLQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JcExlbisrOwotCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfSVBIRVJSKQotCQkJYWRhcHRlci0+aWZfZXZlbnRzLklwSGxlbisrOwotCX0gZWxzZSB7Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1c0dCICYgVkdCU1RBVF9YUEVSUikgewotCQkJdTMyIHhlcnIgPSBoZHItPmZyYW1lX3N0YXR1c0dCID4+IFZHQlNUQVRfWEVSUlNIRlQ7Ci0KLQkJCWlmICh4ZXJyID09IFZHQlNUQVRfWENTRVJSKQotCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5UcENzdW0rKzsKLQkJCWlmICh4ZXJyID09IFZHQlNUQVRfWFVGTE9XKQotCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5UcHJ0b2Zsb3crKzsKLQkJCWlmICh4ZXJyID09IFZHQlNUQVRfWEhMRU4pCi0JCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwSGxlbisrOwotCQl9Ci0JCWlmIChoZHItPmZyYW1lX3N0YXR1c0dCICYgVkdCU1RBVF9ORVRFUlIpIHsKLQkJCXUzMiBuZXJyID0KLQkJCSAgICAoaGRyLT4KLQkJCSAgICAgZnJhbWVfc3RhdHVzR0IgPj4gVkdCU1RBVF9ORVJSU0hGVCkgJgotCQkJICAgIFZHQlNUQVRfTkVSUk1TSzsKLQkJCWlmIChuZXJyID09IFZHQlNUQVRfTkNTRVJSKQotCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JcENzdW0rKzsKLQkJCWlmIChuZXJyID09IFZHQlNUQVRfTlVGTE9XKQotCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JcExlbisrOwotCQkJaWYgKG5lcnIgPT0gVkdCU1RBVF9OSExFTikKLQkJCQlhZGFwdGVyLT5pZl9ldmVudHMuSXBIbGVuKys7Ci0JCX0KLQkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzR0IgJiBWR0JTVEFUX0xOS0VSUikgewotCQkJdTMyIGxlcnIgPSBoZHItPmZyYW1lX3N0YXR1c0dCICYgVkdCU1RBVF9MRVJSTVNLOwotCi0JCQlpZiAobGVyciA9PSBWR0JTVEFUX0xERUFSTFkpCi0JCQkJYWRhcHRlci0+aWZfZXZlbnRzLnJjdmVhcmx5Kys7Ci0JCQlpZiAobGVyciA9PSBWR0JTVEFUX0xCT0ZMTykKLQkJCQlhZGFwdGVyLT5pZl9ldmVudHMuQnVmb3YrKzsKLQkJCWlmIChsZXJyID09IFZHQlNUQVRfTENPREVSUikKLQkJCQlhZGFwdGVyLT5pZl9ldmVudHMuQ29kZSsrOwotCQkJaWYgKGxlcnIgPT0gVkdCU1RBVF9MREJMTkJMKQotCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5EcmJsKys7Ci0JCQlpZiAobGVyciA9PSBWR0JTVEFUX0xDUkNFUlIpCi0JCQkJYWRhcHRlci0+aWZfZXZlbnRzLkNyYysrOwotCQkJaWYgKGxlcnIgPT0gVkdCU1RBVF9MT0ZMTykKLQkJCQlhZGFwdGVyLT5pZl9ldmVudHMub2Zsb3c4MDIrKzsKLQkJCWlmIChsZXJyID09IFZHQlNUQVRfTFVGTE8pCi0JCQkJYWRhcHRlci0+aWZfZXZlbnRzLnVmbG93ODAyKys7Ci0JCX0KLQl9Ci0JcmV0dXJuOwotfQotCi0jZGVmaW5lIFRDUF9PRkZMT0FEX0ZSQU1FX1BVU0hGTEFHICAweDEwMDAwMDAwCi0jZGVmaW5lIE1fRkFTVF9QQVRIICAgICAgICAgICAgICAgICAweDAwNDAKLQotc3RhdGljIHZvaWQgc2xpY19yY3ZfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBzbGljX3JjdmJ1ZiAqcmN2YnVmOwotCXUzMiBmcmFtZXMgPSAwOwotCi0Jd2hpbGUgKChza2IgPSBzbGljX3JjdnF1ZXVlX2dldG5leHQoYWRhcHRlcikpKSB7Ci0JCXUzMiByeF9ieXRlczsKLQotCQlBU1NFUlQoc2tiLT5oZWFkKTsKLQkJcmN2YnVmID0gKHN0cnVjdCBzbGljX3JjdmJ1ZiAqKXNrYi0+aGVhZDsKLQkJYWRhcHRlci0+Y2FyZC0+ZXZlbnRzKys7Ci0JCWlmIChyY3ZidWYtPnN0YXR1cyAmIElSSEREUl9FUlIpIHsKLQkJCWFkYXB0ZXItPnJ4X2Vycm9ycysrOwotCQkJc2xpY19yY3ZfaGFuZGxlX2Vycm9yKGFkYXB0ZXIsIHJjdmJ1Zik7Ci0JCQlzbGljX3JjdnF1ZXVlX3JlaW5zZXJ0KGFkYXB0ZXIsIHNrYik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghc2xpY19tYWNfZmlsdGVyKGFkYXB0ZXIsIChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopCi0JCQkJCXJjdmJ1Zi0+ZGF0YSkpIHsKLQkJCXNsaWNfcmN2cXVldWVfcmVpbnNlcnQoYWRhcHRlciwgc2tiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNrYl9wdWxsKHNrYiwgU0xJQ19SQ1ZCVUZfSEVBRFNJWkUpOwotCQlyeF9ieXRlcyA9IChyY3ZidWYtPmxlbmd0aCAmIElSSEREUl9GTEVOX01TSyk7Ci0JCXNrYl9wdXQoc2tiLCByeF9ieXRlcyk7Ci0JCWFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJYWRhcHRlci0+c3RhdHMucnhfYnl0ZXMgKz0gcnhfYnl0ZXM7Ci0jaWYgU0xJQ19PRkZMT0FEX0lQX0NIRUNLU1VNCi0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0jZW5kaWYKLQotCQlza2ItPmRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOwotCQluZXRpZl9yeChza2IpOwotCi0JCSsrZnJhbWVzOwotI2lmIFNMSUNfSU5URVJSVVBUX1BST0NFU1NfTElNSVQKLQkJaWYgKGZyYW1lcyA+PSBTTElDX1JDVlFfTUFYX1BST0NFU1NfSVNSKSB7Ci0JCQlhZGFwdGVyLT5yY3ZfaW50ZXJydXB0X3lpZWxkcysrOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCX0KLQlhZGFwdGVyLT5tYXhfaXNyX3JjdnMgPSBtYXgoYWRhcHRlci0+bWF4X2lzcl9yY3ZzLCBmcmFtZXMpOwotfQotCi1zdGF0aWMgdm9pZCBzbGljX3htaXRfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHNsaWNfaG9zdGNtZCAqaGNtZDsKLQlzdHJ1Y3Qgc2xpY19yc3BidWYgKnJzcGJ1ZjsKLQl1MzIgZnJhbWVzID0gMDsKLQlzdHJ1Y3Qgc2xpY19oYW5kbGVfd29yZCBzbGljX2hhbmRsZV93b3JkOwotCi0JZG8gewotCQlyc3BidWYgPSBzbGljX3JzcHF1ZXVlX2dldG5leHQoYWRhcHRlcik7Ci0JCWlmICghcnNwYnVmKQotCQkJYnJlYWs7Ci0JCWFkYXB0ZXItPnhtaXRfY29tcGxldGVzKys7Ci0JCWFkYXB0ZXItPmNhcmQtPmV2ZW50cysrOwotCQkvKgotCQkgR2V0IHRoZSBjb21wbGV0ZSBob3N0IGNvbW1hbmQgYnVmZmVyCi0JCSovCi0JCXNsaWNfaGFuZGxlX3dvcmQuaGFuZGxlX3Rva2VuID0gcnNwYnVmLT5ob3N0aGFuZGxlOwotCQlBU1NFUlQoc2xpY19oYW5kbGVfd29yZC5oYW5kbGVfaW5kZXgpOwotCQlBU1NFUlQoc2xpY19oYW5kbGVfd29yZC5oYW5kbGVfaW5kZXggPD0gU0xJQ19DTURRX01BWENNRFMpOwotCQloY21kID0KLQkJICAgIChzdHJ1Y3Qgc2xpY19ob3N0Y21kICopCi0JCQlhZGFwdGVyLT5zbGljX2hhbmRsZXNbc2xpY19oYW5kbGVfd29yZC5oYW5kbGVfaW5kZXhdLgotCQkJCQkJCQkJYWRkcmVzczsKLS8qICAgICAgaGNtZCA9IChzdHJ1Y3Qgc2xpY19ob3N0Y21kICopIHJzcGJ1Zi0+aG9zdGhhbmRsZTsgKi8KLQkJQVNTRVJUKGhjbWQpOwotCQlBU1NFUlQoaGNtZC0+cHNsaWNfaGFuZGxlID09Ci0JCSAgICAgICAmYWRhcHRlci0+c2xpY19oYW5kbGVzW3NsaWNfaGFuZGxlX3dvcmQuaGFuZGxlX2luZGV4XSk7Ci0JCWlmIChoY21kLT50eXBlID09IFNMSUNfQ01EX0RVTUIpIHsKLQkJCWlmIChoY21kLT5za2IpCi0JCQkJZGV2X2tmcmVlX3NrYl9pcnEoaGNtZC0+c2tiKTsKLQkJCXNsaWNfY21kcV9wdXRkb25lX2lycShhZGFwdGVyLCBoY21kKTsKLQkJfQotCQlyc3BidWYtPnN0YXR1cyA9IDA7Ci0JCXJzcGJ1Zi0+aG9zdGhhbmRsZSA9IDA7Ci0JCWZyYW1lcysrOwotCX0gd2hpbGUgKDEpOwotCWFkYXB0ZXItPm1heF9pc3JfeG1pdHMgPSBtYXgoYWRhcHRlci0+bWF4X2lzcl94bWl0cywgZnJhbWVzKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNsaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOwotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgaXNyOwotCi0JaWYgKChhZGFwdGVyLT5wc2htZW0pICYmIChhZGFwdGVyLT5wc2htZW0tPmlzcikpIHsKLQkJc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ljciwKLQkJCQkgSUNSX0lOVF9NQVNLLCBGTFVTSCk7Ci0JCWlzciA9IGFkYXB0ZXItPmlzcmNvcHkgPSBhZGFwdGVyLT5wc2htZW0tPmlzcjsKLQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOwotCQlhZGFwdGVyLT5udW1faXNycysrOwotCQlzd2l0Y2ggKGFkYXB0ZXItPmNhcmQtPnN0YXRlKSB7Ci0JCWNhc2UgQ0FSRF9VUDoKLQkJCWlmIChpc3IgJiB+SVNSX0lPKSB7Ci0JCQkJaWYgKGlzciAmIElTUl9FUlIpIHsKLQkJCQkJYWRhcHRlci0+ZXJyb3JfaW50ZXJydXB0cysrOwotCQkJCQlpZiAoaXNyICYgSVNSX1JNSVNTKSB7Ci0JCQkJCQlpbnQgY291bnQ7Ci0JCQkJCQlpbnQgcHJlX2NvdW50OwotCQkJCQkJaW50IGVycm9yczsKLQotCQkJCQkJc3RydWN0IHNsaWNfcmN2cXVldWUgKnJjdnEgPQotCQkJCQkJICAgICZhZGFwdGVyLT5yY3ZxdWV1ZTsKLQotCQkJCQkJYWRhcHRlci0+Ci0JCQkJCQkgICAgZXJyb3Jfcm1pc3NfaW50ZXJydXB0cysrOwotCQkJCQkJaWYgKCFyY3ZxLT5lcnJvcnMpCi0JCQkJCQkJcmN2X2NvdW50ID0gcmN2cS0+Y291bnQ7Ci0JCQkJCQlwcmVfY291bnQgPSByY3ZxLT5jb3VudDsKLQkJCQkJCWVycm9ycyA9IHJjdnEtPmVycm9yczsKLQotCQkJCQkJd2hpbGUgKHJjdnEtPmNvdW50IDwKLQkJCQkJCSAgICAgICBTTElDX1JDVlFfRklMTFRIUkVTSCkgewotCQkJCQkJCWNvdW50ID0KLQkJCQkJCQkgICAgc2xpY19yY3ZxdWV1ZV9maWxsCi0JCQkJCQkJICAgIChhZGFwdGVyKTsKLQkJCQkJCQlpZiAoIWNvdW50KQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpc3IgJiBJU1JfWERST1ApIHsKLQkJCQkJCWRldl9lcnIoJmRldi0+ZGV2LAotCQkJCQkJCSJpc3IgJiBJU1JfRVJSIFsleF0gIgotCQkJCQkJCSJJU1JfWERST1AgXG4iLCBpc3IpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZGV2X2VycigmZGV2LT5kZXYsCi0JCQkJCQkJImlzciAmIElTUl9FUlIgWyV4XVxuIiwKLQkJCQkJCQlpc3IpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGlzciAmIElTUl9MRVZFTlQpIHsKLQkJCQkJYWRhcHRlci0+bGlua2V2ZW50X2ludGVycnVwdHMrKzsKLQkJCQkJc2xpY19saW5rX2V2ZW50X2hhbmRsZXIoYWRhcHRlcik7Ci0JCQkJfQotCi0JCQkJaWYgKChpc3IgJiBJU1JfVVBDKSB8fAotCQkJCSAgICAoaXNyICYgSVNSX1VQQ0VSUikgfHwgKGlzciAmIElTUl9VUENCU1kpKSB7Ci0JCQkJCWFkYXB0ZXItPnVwcl9pbnRlcnJ1cHRzKys7Ci0JCQkJCXNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoYWRhcHRlciwgaXNyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpc3IgJiBJU1JfUkNWKSB7Ci0JCQkJYWRhcHRlci0+cmN2X2ludGVycnVwdHMrKzsKLQkJCQlzbGljX3Jjdl9oYW5kbGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlpZiAoaXNyICYgSVNSX0NNRCkgewotCQkJCWFkYXB0ZXItPnhtaXRfaW50ZXJydXB0cysrOwotCQkJCXNsaWNfeG1pdF9jb21wbGV0ZShhZGFwdGVyKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FSRF9ET1dOOgotCQkJaWYgKChpc3IgJiBJU1JfVVBDKSB8fAotCQkJICAgIChpc3IgJiBJU1JfVVBDRVJSKSB8fCAoaXNyICYgSVNSX1VQQ0JTWSkpIHsKLQkJCQlhZGFwdGVyLT51cHJfaW50ZXJydXB0cysrOwotCQkJCXNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoYWRhcHRlciwgaXNyKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWFkYXB0ZXItPmlzcmNvcHkgPSAwOwotCQlhZGFwdGVyLT5hbGxfcmVnX3dyaXRlcyArPSAyOwotCQlhZGFwdGVyLT5pc3JfcmVnX3dyaXRlcysrOwotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfaXNyLCAwLCBGTFVTSCk7Ci0JfSBlbHNlIHsKLQkJYWRhcHRlci0+ZmFsc2VfaW50ZXJydXB0cysrOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiBzbGljX2xpbmtfZXZlbnRfaGFuZGxlciAtCi0gKgotICogSW5pdGlhdGUgYSBsaW5rIGNvbmZpZ3VyYXRpb24gc2VxdWVuY2UuICBUaGUgbGluayBjb25maWd1cmF0aW9uIGJlZ2lucwotICogYnkgaXNzdWluZyBhIFJFQURfTElOS19TVEFUVVMgY29tbWFuZCB0byB0aGUgVXRpbGl0eSBQcm9jZXNzb3Igb24gdGhlCi0gKiBTTElDLiAgU2luY2UgdGhlIGNvbW1hbmQgZmluaXNoZXMgYXN5bmNocm9ub3VzbHksIHRoZSBzbGljX3Vwcl9jb21sZXRlCi0gKiByb3V0aW5lIHdpbGwgZm9sbG93IGl0IHVwIHdpdGhhIFVQIGNvbmZpZ3VyYXRpb24gd3JpdGUgY29tbWFuZCwgd2hpY2gKLSAqIHdpbGwgYWxzbyBjb21wbGV0ZSBhc3luY2hyb25vdXNseS4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIHNsaWNfbGlua19ldmVudF9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWludCBzdGF0dXM7Ci0Jc3RydWN0IHNsaWNfc2htZW0gKnBzaG1lbTsKLQotCWlmIChhZGFwdGVyLT5zdGF0ZSAhPSBBREFQVF9VUCkgewotCQkvKiBBZGFwdGVyIGlzIG5vdCBvcGVyYXRpb25hbC4gIElnbm9yZS4gICovCi0JCXJldHVybjsKLQl9Ci0KLQlwc2htZW0gPSAoc3RydWN0IHNsaWNfc2htZW0gKilhZGFwdGVyLT5waHlzX3NobWVtOwotCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQotCXN0YXR1cyA9IHNsaWNfdXByX3JlcXVlc3QoYWRhcHRlciwKLQkJCQkgIFNMSUNfVVBSX1JMU1IsCi0JCQkJICBTTElDX0dFVF9BRERSX0xPVygmcHNobWVtLT5saW5rc3RhdHVzKSwKLQkJCQkgIFNMSUNfR0VUX0FERFJfSElHSCgmcHNobWVtLT5saW5rc3RhdHVzKSwKLQkJCQkgIDAsIDApOwotI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQotCXN0YXR1cyA9IHNsaWNfdXByX3JlcXVlc3QoYWRhcHRlciwgU0xJQ19VUFJfUkxTUiwKLQkJKHUzMikgJnBzaG1lbS0+bGlua3N0YXR1cywJLyogbm8gNEdCIHdyYXAgZ3VhcmFudGVlZCAqLwotCQkJCSAgMCwgMCwgMCk7Ci0jZWxzZQotCVN0b3AgY29tcGlsYXRpb247Ci0jZW5kaWYKLQlBU1NFUlQoKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgfHwgKHN0YXR1cyA9PSBTVEFUVVNfUEVORElORykpOwotfQotCi1zdGF0aWMgdm9pZCBzbGljX2luaXRfY2xlYW51cChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoYWRhcHRlci0+aW50cnJlZ2lzdGVyZWQpIHsKLQkJYWRhcHRlci0+aW50cnJlZ2lzdGVyZWQgPSAwOwotCQlmcmVlX2lycShhZGFwdGVyLT5uZXRkZXYtPmlycSwgYWRhcHRlci0+bmV0ZGV2KTsKLQotCX0KLQlpZiAoYWRhcHRlci0+cHNobWVtKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pLAotCQkJCSAgICBhZGFwdGVyLT5wc2htZW0sIGFkYXB0ZXItPnBoeXNfc2htZW0pOwotCQlhZGFwdGVyLT5wc2htZW0gPSBOVUxMOwotCQlhZGFwdGVyLT5waHlzX3NobWVtID0gKGRtYV9hZGRyX3QpIE5VTEw7Ci0JfQotCi0JaWYgKGFkYXB0ZXItPnBpbmd0aW1lcnNldCkgewotCQlhZGFwdGVyLT5waW5ndGltZXJzZXQgPSAwOwotCQlkZWxfdGltZXIoJmFkYXB0ZXItPnBpbmd0aW1lcik7Ci0JfQotCi0Jc2xpY19yc3BxdWV1ZV9mcmVlKGFkYXB0ZXIpOwotCXNsaWNfY21kcV9mcmVlKGFkYXB0ZXIpOwotCXNsaWNfcmN2cXVldWVfZnJlZShhZGFwdGVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbGljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCUFTU0VSVChhZGFwdGVyKTsKLQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgPSBhZGFwdGVyLT5zbGljX3N0YXRzLmlmYWNlLnhtaXRfY29sbGlzaW9uczsKLQlkZXYtPnN0YXRzLnJ4X2Vycm9ycyA9IGFkYXB0ZXItPnNsaWNfc3RhdHMuaWZhY2UucmN2X2Vycm9yczsKLQlkZXYtPnN0YXRzLnR4X2Vycm9ycyA9IGFkYXB0ZXItPnNsaWNfc3RhdHMuaWZhY2UueG10X2Vycm9yczsKLQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBhZGFwdGVyLT5zbGljX3N0YXRzLmlmYWNlLnJjdl9kaXNjYXJkczsKLQlkZXYtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOwotCWRldi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOwotCWRldi0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7Ci0JZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7Ci0JZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSAwOwotCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7Ci0KLQlyZXR1cm4gJmRldi0+c3RhdHM7Ci19Ci0KLS8qCi0gKiAgQWxsb2NhdGUgYSBtY2FzdF9hZGRyZXNzIHN0cnVjdHVyZSB0byBob2xkIHRoZSBtdWx0aWNhc3QgYWRkcmVzcy4KLSAqICBMaW5rIGl0IGluLgotICovCi1zdGF0aWMgaW50IHNsaWNfbWNhc3RfYWRkX2xpc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCi17Ci0Jc3RydWN0IG1jYXN0X2FkZHJlc3MgKm1jYWRkciwgKm1saXN0OwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIGl0IGFscmVhZHkgZXhpc3RzICovCi0JbWxpc3QgPSBhZGFwdGVyLT5tY2FzdGFkZHJzOwotCXdoaWxlIChtbGlzdCkgewotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihtbGlzdC0+YWRkcmVzcywgYWRkcmVzcykpCi0JCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci0JCW1saXN0ID0gbWxpc3QtPm5leHQ7Ci0JfQotCi0JLyogRG9lc24ndCBhbHJlYWR5IGV4aXN0LiAgQWxsb2NhdGUgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBpdCAqLwotCW1jYWRkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FzdF9hZGRyZXNzKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1jYWRkciA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCW1lbWNweShtY2FkZHItPmFkZHJlc3MsIGFkZHJlc3MsIDYpOwotCi0JbWNhZGRyLT5uZXh0ID0gYWRhcHRlci0+bWNhc3RhZGRyczsKLQlhZGFwdGVyLT5tY2FzdGFkZHJzID0gbWNhZGRyOwotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCiAvKgogICogRnVuY3Rpb25zIHRvIG9idGFpbiB0aGUgQ1JDIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzLgogICogVGhpcyBpcyBhIHN0YW5kYXJkIGV0aGVybmV0IENSQyBpbiB0aGF0IGl0IGlzIGEgMzItYml0LCByZWZsZWN0ZWQgQ1JDIHVzaW5nCkBAIC0xMzYyLDQ0ICsyOTYsNiBAQAogCWFkYXB0ZXItPm1jYXN0bWFzayB8PSAodTY0KSAxIDw8IGNyY3BvbHk7CiB9CiAKLXN0YXRpYyB2b2lkIHNsaWNfbWNhc3Rfc2V0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCWNoYXIgKmFkZHJlc3NlczsKLQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCi0JQVNTRVJUKGFkYXB0ZXIpOwotCi0JbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQlhZGRyZXNzZXMgPSAoY2hhciAqKSAmaGEtPmFkZHI7Ci0JCXN0YXR1cyA9IHNsaWNfbWNhc3RfYWRkX2xpc3QoYWRhcHRlciwgYWRkcmVzc2VzKTsKLQkJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCWJyZWFrOwotCQlzbGljX21jYXN0X3NldF9iaXQoYWRhcHRlciwgYWRkcmVzc2VzKTsKLQl9Ci0KLQlpZiAoYWRhcHRlci0+ZGV2ZmxhZ3NfcHJldiAhPSBkZXYtPmZsYWdzKSB7Ci0JCWFkYXB0ZXItPm1hY29wdHMgPSBNQUNfRElSRUNURUQ7Ci0JCWlmIChkZXYtPmZsYWdzKSB7Ci0JCQlpZiAoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpCi0JCQkJYWRhcHRlci0+bWFjb3B0cyB8PSBNQUNfQkNBU1Q7Ci0JCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQkJCWFkYXB0ZXItPm1hY29wdHMgfD0gTUFDX1BST01JU0M7Ci0JCQlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKLQkJCQlhZGFwdGVyLT5tYWNvcHRzIHw9IE1BQ19BTExNQ0FTVDsKLQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCkKLQkJCQlhZGFwdGVyLT5tYWNvcHRzIHw9IE1BQ19NQ0FTVDsKLQkJfQotCQlhZGFwdGVyLT5kZXZmbGFnc19wcmV2ID0gZGV2LT5mbGFnczsKLQkJc2xpY19jb25maWdfc2V0KGFkYXB0ZXIsIHRydWUpOwotCX0gZWxzZSB7Ci0JCWlmIChzdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlzbGljX21jYXN0X3NldF9tYXNrKGFkYXB0ZXIpOwotCX0KLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfbWNhc3Rfc2V0X21hc2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CkBAIC0xNDM5LDEyMyArMzM1LDYgQEAKIAlhZGRfdGltZXIoJmFkYXB0ZXItPnBpbmd0aW1lcik7CiB9CiAKLS8qCi0gKiAgc2xpY19pZl9pbml0Ci0gKgotICogIFBlcmZvcm0gaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHNsaWMgaW50ZXJmYWNlLgotICoKLSAqLwotc3RhdGljIGludCBzbGljX2lmX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHNsaWNjYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwotCXN0cnVjdCBzbGljX3NobWVtICpwc2htZW07Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlBU1NFUlQoY2FyZCk7Ci0KLQkvKiBhZGFwdGVyIHNob3VsZCBiZSBkb3duIGF0IHRoaXMgcG9pbnQgKi8KLQlpZiAoYWRhcHRlci0+c3RhdGUgIT0gQURBUFRfRE9XTikgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzOiBhZGFwdGVyLT5zdGF0ZSAhPSBBREFQVF9ET1dOXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JQVNTRVJUKGFkYXB0ZXItPmxpbmtzdGF0ZSA9PSBMSU5LX0RPV04pOwotCi0JYWRhcHRlci0+ZGV2ZmxhZ3NfcHJldiA9IGRldi0+ZmxhZ3M7Ci0JYWRhcHRlci0+bWFjb3B0cyA9IE1BQ19ESVJFQ1RFRDsKLQlpZiAoZGV2LT5mbGFncykgewotCQlpZiAoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpCi0JCQlhZGFwdGVyLT5tYWNvcHRzIHw9IE1BQ19CQ0FTVDsKLQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKLQkJCWFkYXB0ZXItPm1hY29wdHMgfD0gTUFDX1BST01JU0M7Ci0JCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQotCQkJYWRhcHRlci0+bWFjb3B0cyB8PSBNQUNfQUxMTUNBU1Q7Ci0JCWlmIChkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCkKLQkJCWFkYXB0ZXItPm1hY29wdHMgfD0gTUFDX01DQVNUOwotCX0KLQlzdGF0dXMgPSBzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlkZXZfZXJyKCZkZXYtPmRldiwKLQkJCSIlczogc2xpY19hZGFwdGVyX2FsbG9jcmVzb3VyY2VzIEZBSUxFRCAleFxuIiwKLQkJCV9fZnVuY19fLCBzdGF0dXMpOwotCQlzbGljX2FkYXB0ZXJfZnJlZXJlc291cmNlcyhhZGFwdGVyKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlpZiAoIWFkYXB0ZXItPnF1ZXVlc19pbml0aWFsaXplZCkgewotCQlpZiAoc2xpY19yc3BxdWV1ZV9pbml0KGFkYXB0ZXIpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWlmIChzbGljX2NtZHFfaW5pdChhZGFwdGVyKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlpZiAoc2xpY19yY3ZxdWV1ZV9pbml0KGFkYXB0ZXIpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWFkYXB0ZXItPnF1ZXVlc19pbml0aWFsaXplZCA9IDE7Ci0JfQotCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKLQltZGVsYXkoMSk7Ci0KLQlpZiAoIWFkYXB0ZXItPmlzcF9pbml0aWFsaXplZCkgewotCQlwc2htZW0gPSAoc3RydWN0IHNsaWNfc2htZW0gKilhZGFwdGVyLT5waHlzX3NobWVtOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2subG9jaywKLQkJCQkJYWRhcHRlci0+Yml0NjRyZWdsb2NrLmZsYWdzKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIFNMSUNfR0VUX0FERFJfSElHSCgmcHNobWVtLT5pc3IpLCBET05UX0ZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzcCwKLQkJCQkgU0xJQ19HRVRfQUREUl9MT1coJnBzaG1lbS0+aXNyKSwgRkxVU0gpOwotI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwgMCwgRE9OVF9GTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3AsICh1MzIpJnBzaG1lbS0+aXNyLCBGTFVTSCk7Ci0jZWxzZQotCQlTdG9wIENvbXBpbGF0aW9ucwotI2VuZGlmCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jay5sb2NrLAotCQkJCQlhZGFwdGVyLT5iaXQ2NHJlZ2xvY2suZmxhZ3MpOwotCQlhZGFwdGVyLT5pc3BfaW5pdGlhbGl6ZWQgPSAxOwotCX0KLQotCWFkYXB0ZXItPnN0YXRlID0gQURBUFRfVVA7Ci0JaWYgKCFjYXJkLT5sb2FkdGltZXJzZXQpIHsKLQkJaW5pdF90aW1lcigmY2FyZC0+bG9hZHRpbWVyKTsKLQkJY2FyZC0+bG9hZHRpbWVyLmV4cGlyZXMgPQotCQkgICAgamlmZmllcyArIChTTElDX0xPQURUSU1FUl9QRVJJT0QgKiBIWik7Ci0JCWNhcmQtPmxvYWR0aW1lci5kYXRhID0gKHVsb25nKSBjYXJkOwotCQljYXJkLT5sb2FkdGltZXIuZnVuY3Rpb24gPSAmc2xpY190aW1lcl9sb2FkX2NoZWNrOwotCQlhZGRfdGltZXIoJmNhcmQtPmxvYWR0aW1lcik7Ci0KLQkJY2FyZC0+bG9hZHRpbWVyc2V0ID0gMTsKLQl9Ci0KLQlpZiAoIWFkYXB0ZXItPnBpbmd0aW1lcnNldCkgewotCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5waW5ndGltZXIpOwotCQlhZGFwdGVyLT5waW5ndGltZXIuZXhwaXJlcyA9Ci0JCSAgICBqaWZmaWVzICsgKFBJTkdfVElNRVJfSU5URVJWQUwgKiBIWik7Ci0JCWFkYXB0ZXItPnBpbmd0aW1lci5kYXRhID0gKHVsb25nKSBkZXY7Ci0JCWFkYXB0ZXItPnBpbmd0aW1lci5mdW5jdGlvbiA9ICZzbGljX3RpbWVyX3Bpbmc7Ci0JCWFkZF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyKTsKLQkJYWRhcHRlci0+cGluZ3RpbWVyc2V0ID0gMTsKLQkJYWRhcHRlci0+Y2FyZC0+cGluZ3N0YXR1cyA9IElTUl9QSU5HTUFTSzsKLQl9Ci0KLQkvKgotCSAqICAgIGNsZWFyIGFueSBwZW5kaW5nIGV2ZW50cywgdGhlbiBlbmFibGUgaW50ZXJydXB0cwotCSAqLwotCWFkYXB0ZXItPmlzcmNvcHkgPSAwOwotCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNyLCAwLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PTiwgRkxVU0gpOwotCi0Jc2xpY19saW5rX2NvbmZpZyhhZGFwdGVyLCBMSU5LX0FVVE9TUEVFRCwgTElOS19BVVRPRCk7Ci0Jc2xpY19saW5rX2V2ZW50X2hhbmRsZXIoYWRhcHRlcik7Ci0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfdW5tYXBfbW1pb19zcGFjZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpZiAoYWRhcHRlci0+c2xpY19yZWdzKQpAQCAtMTU2Myw2NCArMzQyLDYgQEAKIAlhZGFwdGVyLT5zbGljX3JlZ3MgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IHNsaWNfYWRhcHRlcl9hbGxvY3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoIWFkYXB0ZXItPmludHJyZWdpc3RlcmVkKSB7Ci0JCWludCByZXR2YWw7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2subG9jaywKLQkJCQkJc2xpY19nbG9iYWwuZHJpdmVyX2xvY2suZmxhZ3MpOwotCi0JCXJldHZhbCA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm5ldGRldi0+aXJxLAotCQkJCSAgICAgJnNsaWNfaW50ZXJydXB0LAotCQkJCSAgICAgSVJRRl9TSEFSRUQsCi0JCQkJICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsIGFkYXB0ZXItPm5ldGRldik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmxvY2ssCi0JCQkJCXNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmZsYWdzKTsKLQotCQlpZiAocmV0dmFsKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkicmVxdWVzdF9pcnEgKCVzKSBGQUlMRUQgWyV4XVxuIiwKLQkJCQlhZGFwdGVyLT5uZXRkZXYtPm5hbWUsIHJldHZhbCk7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JCWFkYXB0ZXItPmludHJyZWdpc3RlcmVkID0gMTsKLQl9Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19wY2koc3RydWN0IHBjaV9kZXYgKnBjaWRldikKLXsKLQl1MTYgcGNpX2NvbW1hbmQ7Ci0JdTE2IG5ld19jb21tYW5kOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKLQotCW5ld19jb21tYW5kID0gcGNpX2NvbW1hbmQgfCBQQ0lfQ09NTUFORF9NQVNURVIKLQkgICAgfCBQQ0lfQ09NTUFORF9NRU1PUlkKLQkgICAgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCi0JICAgIHwgUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX0ZBU1RfQkFDSzsKLQlpZiAocGNpX2NvbW1hbmQgIT0gbmV3X2NvbW1hbmQpCi0JCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIFBDSV9DT01NQU5ELCBuZXdfY29tbWFuZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsaWNfYWRhcHRlcl9mcmVlcmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXNsaWNfaW5pdF9jbGVhbnVwKGFkYXB0ZXIpOwotCW1lbXNldCgmYWRhcHRlci0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOwotCWFkYXB0ZXItPmVycm9yX2ludGVycnVwdHMgPSAwOwotCWFkYXB0ZXItPnJjdl9pbnRlcnJ1cHRzID0gMDsKLQlhZGFwdGVyLT54bWl0X2ludGVycnVwdHMgPSAwOwotCWFkYXB0ZXItPmxpbmtldmVudF9pbnRlcnJ1cHRzID0gMDsKLQlhZGFwdGVyLT51cHJfaW50ZXJydXB0cyA9IDA7Ci0JYWRhcHRlci0+bnVtX2lzcnMgPSAwOwotCWFkYXB0ZXItPnhtaXRfY29tcGxldGVzID0gMDsKLQlhZGFwdGVyLT5yY3ZfYnJvYWRjYXN0cyA9IDA7Ci0JYWRhcHRlci0+cmN2X211bHRpY2FzdHMgPSAwOwotCWFkYXB0ZXItPnJjdl91bmljYXN0cyA9IDA7Ci19Ci0KIC8qCiAgKiAgc2xpY19saW5rX2NvbmZpZwogICoKQEAgLTE3NzQsMTggKzQ5NSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzbGljX2NhcmRfY2xlYW51cChzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQpCi17Ci0JaWYgKGNhcmQtPmxvYWR0aW1lcnNldCkgewotCQljYXJkLT5sb2FkdGltZXJzZXQgPSAwOwotCQlkZWxfdGltZXIoJmNhcmQtPmxvYWR0aW1lcik7Ci0JfQotCi0Jc2xpY19kZWJ1Z19jYXJkX2Rlc3Ryb3koY2FyZCk7Ci0KLQlrZnJlZShjYXJkKTsKLX0KLQogc3RhdGljIGludCBzbGljX2NhcmRfZG93bmxvYWRfZ2JyY3Yoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKQEAgLTE5NjcsNyArNjc2LDcgQEAKIAkgICBhbmQgcmVhY2ggbWFpbmxvb3AgKi8KIAltZGVsYXkoMjApOwogCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCXJldHVybiAwOwogfQogCiBNT0RVTEVfRklSTVdBUkUoInNsaWNvc3Mvb2FzaXNkb3dubG9hZC5zeXMiKTsKQEAgLTE5OTksMzE3ICs3MDgsNiBAQAogCWFkYXB0ZXItPmNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ID0gdmFsdWU7CiB9CiAKLXN0YXRpYyBpbnQgc2xpY19jYXJkX2luaXQoc3RydWN0IHNsaWNjYXJkICpjYXJkLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKLQlzdHJ1Y3Qgc2xpY19lZXByb20gKnBlZXByb207Ci0Jc3RydWN0IG9zbGljX2VlcHJvbSAqcE9lZXByb207Ci0JZG1hX2FkZHJfdCBwaHlzX2NvbmZpZzsKLQl1MzIgcGh5c19jb25maWdoOwotCXUzMiBwaHlzX2NvbmZpZ2w7Ci0JdTMyIGkgPSAwOwotCXN0cnVjdCBzbGljX3NobWVtICpwc2htZW07Ci0JaW50IHN0YXR1czsKLQl1aW50IG1hY2FkZHJzID0gY2FyZC0+Y2FyZF9zaXplOwotCXVzaG9ydCBlZWNvZGVzaXplOwotCXVzaG9ydCBkcmFtc2l6ZTsKLQl1c2hvcnQgZWVfY2hrc3VtOwotCXVzaG9ydCBjYWxjX2Noa3N1bTsKLQlzdHJ1Y3Qgc2xpY19jb25maWdfbWFjICpwbWFjOwotCXVuc2lnbmVkIGNoYXIgZnJ1Zm9ybWF0OwotCXVuc2lnbmVkIGNoYXIgb2VtZnJ1Zm9ybWF0OwotCXN0cnVjdCBhdGtfZnJ1ICpwYXRrZnJ1OwotCXVuaW9uIG9lbWZydSAqcG9lbWZydTsKLQotCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgZXhjZXB0IFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCi0Jc2xpY19zb2Z0X3Jlc2V0KGFkYXB0ZXIpOwotCi0JLyogRG93bmxvYWQgdGhlIG1pY3JvY29kZSAqLwotCXN0YXR1cyA9IHNsaWNfY2FyZF9kb3dubG9hZChhZGFwdGVyKTsKLQotCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCi0JCQkiZG93bmxvYWQgZmFpbGVkIGJ1cyAlZCBzbG90ICVkXG4iLAotCQkJYWRhcHRlci0+YnVzbnVtYmVyLCBhZGFwdGVyLT5zbG90bnVtYmVyKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlpZiAoIWNhcmQtPmNvbmZpZ19zZXQpIHsKLQkJcGVlcHJvbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19lZXByb20pLAotCQkJCQkgICAgICAgJnBoeXNfY29uZmlnKTsKLQotCQlwaHlzX2NvbmZpZ2wgPSBTTElDX0dFVF9BRERSX0xPVyhwaHlzX2NvbmZpZyk7Ci0JCXBoeXNfY29uZmlnaCA9IFNMSUNfR0VUX0FERFJfSElHSChwaHlzX2NvbmZpZyk7Ci0KLQkJaWYgKCFwZWVwcm9tKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKLQkJCQkiZWVwcm9tIHJlYWQgZmFpbGVkIHRvIGdldCBtZW1vcnkgIgotCQkJCSJidXMgJWQgc2xvdCAlZFxuIiwgYWRhcHRlci0+YnVzbnVtYmVyLAotCQkJCWFkYXB0ZXItPnNsb3RudW1iZXIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0gZWxzZSB7Ci0JCQltZW1zZXQocGVlcHJvbSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX2VlcHJvbSkpOwotCQl9Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pY3IsIElDUl9JTlRfT0ZGLCBGTFVTSCk7Ci0JCW1kZWxheSgxKTsKLQkJcHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopYWRhcHRlci0+cGh5c19zaG1lbTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLmxvY2ssCi0JCQkJCWFkYXB0ZXItPmJpdDY0cmVnbG9jay5mbGFncyk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCAwLCBET05UX0ZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzcCwKLQkJCQkgU0xJQ19HRVRfQUREUl9MT1coJnBzaG1lbS0+aXNyKSwgRkxVU0gpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2subG9jaywKLQkJCQkJYWRhcHRlci0+Yml0NjRyZWdsb2NrLmZsYWdzKTsKLQotCQlzbGljX2NvbmZpZ19nZXQoYWRhcHRlciwgcGh5c19jb25maWdsLCBwaHlzX2NvbmZpZ2gpOwotCi0JCWZvciAoOzspIHsKLQkJCWlmIChhZGFwdGVyLT5wc2htZW0tPmlzcikgewotCQkJCWlmIChhZGFwdGVyLT5wc2htZW0tPmlzciAmIElTUl9VUEMpIHsKLQkJCQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOwotCQkJCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsCi0JCQkJCQkmc2xpY19yZWdzLT5zbGljX2lzcCwgMCwKLQkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkJCTAsIEZMVVNIKTsKLQkJCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwKLQkJCQkJCQkgMCwgRkxVU0gpOwotCi0JCQkJCXNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoYWRhcHRlciwgMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQkJCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwKLQkJCQkJCQkgMCwgRkxVU0gpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWRlbGF5KDEpOwotCQkJCWkrKzsKLQkJCQlpZiAoaSA+IDUwMDApIHsKLQkJCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCi0JCQkJCQkiJWQgY29uZmlnIGRhdGEgZmV0Y2ggdGltZWQgb3V0IVxuIiwKLQkJCQkJCWFkYXB0ZXItPnBvcnQpOwotCQkJCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsCi0JCQkJCQkmc2xpY19yZWdzLT5zbGljX2lzcCwgMCwKLQkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkJCTAsIEZMVVNIKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgewotCQkvKiBPYXNpcyBjYXJkICovCi0JCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgotCQkJLyogZXh0cmFjdCBFRVBST00gZGF0YSBhbmQgcG9pbnRlcnMgdG8gRUVQUk9NIGRhdGEgKi8KLQkJCXBPZWVwcm9tID0gKHN0cnVjdCBvc2xpY19lZXByb20gKikgcGVlcHJvbTsKLQkJCWVlY29kZXNpemUgPSBwT2VlcHJvbS0+RWVjb2RlU2l6ZTsKLQkJCWRyYW1zaXplID0gcE9lZXByb20tPkRyYW1TaXplOwotCQkJcG1hYyA9IHBPZWVwcm9tLT5NYWNJbmZvOwotCQkJZnJ1Zm9ybWF0ID0gcE9lZXByb20tPkZydUZvcm1hdDsKLQkJCXBhdGtmcnUgPSAmcE9lZXByb20tPkF0a0ZydTsKLQkJCW9lbWZydWZvcm1hdCA9IHBPZWVwcm9tLT5PZW1GcnVGb3JtYXQ7Ci0JCQlwb2VtZnJ1ID0gJnBPZWVwcm9tLT5PZW1GcnU7Ci0JCQltYWNhZGRycyA9IDI7Ci0JCQkvKiBNaW5vciBrbHVkZ2UgZm9yIE9hc2lzIGNhcmQKLQkJCSAgICAgZ2V0IDIgTUFDIGFkZHJlc3NlcyBmcm9tIHRoZQotCQkJICAgICBFRVBST00gdG8gZW5zdXJlIHRoYXQgZnVuY3Rpb24gMQotCQkJICAgICBnZXRzIHRoZSBQb3J0IDEgTUFDIGFkZHJlc3MgKi8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogZXh0cmFjdCBFRVBST00gZGF0YSBhbmQgcG9pbnRlcnMgdG8gRUVQUk9NIGRhdGEgKi8KLQkJCWVlY29kZXNpemUgPSBwZWVwcm9tLT5FZWNvZGVTaXplOwotCQkJZHJhbXNpemUgPSBwZWVwcm9tLT5EcmFtU2l6ZTsKLQkJCXBtYWMgPSBwZWVwcm9tLT51Mi5tYWMuTWFjSW5mbzsKLQkJCWZydWZvcm1hdCA9IHBlZXByb20tPkZydUZvcm1hdDsKLQkJCXBhdGtmcnUgPSAmcGVlcHJvbS0+QXRrRnJ1OwotCQkJb2VtZnJ1Zm9ybWF0ID0gcGVlcHJvbS0+T2VtRnJ1Rm9ybWF0OwotCQkJcG9lbWZydSA9ICZwZWVwcm9tLT5PZW1GcnU7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhcmQtPmNvbmZpZy5FZXByb21WYWxpZCA9IGZhbHNlOwotCi0JCS8qICBzZWUgaWYgdGhlIEVFUFJPTSBpcyB2YWxpZCBieSBjaGVja2luZyBpdCdzIGNoZWNrc3VtICovCi0JCWlmICgoZWVjb2Rlc2l6ZSA8PSBNQVhfRUVDT0RFX1NJWkUpICYmCi0JCSAgICAoZWVjb2Rlc2l6ZSA+PSBNSU5fRUVDT0RFX1NJWkUpKSB7Ci0KLQkJCWVlX2Noa3N1bSA9Ci0JCQkgICAgKih1MTYgKikgKChjaGFyICopIHBlZXByb20gKyAoZWVjb2Rlc2l6ZSAtIDIpKTsKLQkJCS8qCi0JCQkgICAgY2FsY3VsYXRlIHRoZSBFRVBST00gY2hlY2tzdW0KLQkJCSovCi0JCQljYWxjX2Noa3N1bSA9Ci0JCQkgICAgfnNsaWNfZWVwcm9tX2Nrc3VtKChjaGFyICopIHBlZXByb20sCi0JCQkJCSAgICAgICAoZWVjb2Rlc2l6ZSAtIDIpKTsKLQkJCS8qCi0JCQkgICAgaWYgdGhlIHVjZG9lIGNoa3N1bSBmbGFnIGJpdCB3b3JrZWQsCi0JCQkgICAgd2Ugd291bGRuJ3QgbmVlZCB0aGlzIHNoaXQKLQkJCSovCi0JCQlpZiAoZWVfY2hrc3VtID09IGNhbGNfY2hrc3VtKQotCQkJCWNhcmQtPmNvbmZpZy5FZXByb21WYWxpZCA9IHRydWU7Ci0JCX0KLQkJLyogIGNvcHkgaW4gdGhlIERSQU0gc2l6ZSAqLwotCQljYXJkLT5jb25maWcuRHJhbVNpemUgPSBkcmFtc2l6ZTsKLQotCQkvKiAgY29weSBpbiB0aGUgTUFDIGFkZHJlc3MoZXMpICovCi0JCWZvciAoaSA9IDA7IGkgPCBtYWNhZGRyczsgaSsrKSB7Ci0JCQltZW1jcHkoJmNhcmQtPmNvbmZpZy5NYWNJbmZvW2ldLAotCQkJICAgICAgICZwbWFjW2ldLCBzaXplb2Yoc3RydWN0IHNsaWNfY29uZmlnX21hYykpOwotCQl9Ci0KLQkJLyogIGNvcHkgdGhlIEFsYWNyaXRlY2ggRlJVIGluZm9ybWF0aW9uICovCi0JCWNhcmQtPmNvbmZpZy5GcnVGb3JtYXQgPSBmcnVmb3JtYXQ7Ci0JCW1lbWNweSgmY2FyZC0+Y29uZmlnLkF0a0ZydSwgcGF0a2ZydSwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgYXRrX2ZydSkpOwotCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfZWVwcm9tKSwKLQkJCQkgICAgcGVlcHJvbSwgcGh5c19jb25maWcpOwotCi0JCWlmICgoIWNhcmQtPmNvbmZpZy5FZXByb21WYWxpZCkgJiYKLQkJICAgIChhZGFwdGVyLT5yZWdfcGFyYW1zLmZhaWxfb25fYmFkX2VlcHJvbSkpIHsKLQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19pc3AsIDAsCi0JCQkJCSAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCSAwLCBGTFVTSCk7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKLQkJCQkidW5zdXBwb3J0ZWQgQ09ORklHVVJBVElPTiBFRVBST00gaW52YWxpZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWNhcmQtPmNvbmZpZ19zZXQgPSAxOwotCX0KLQotCWlmIChzbGljX2NhcmRfZG93bmxvYWRfZ2JyY3YoYWRhcHRlcikpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCi0JCQkidW5hYmxlIHRvIGRvd25sb2FkIEdCIHJlY2VpdmUgbWljcm9jb2RlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNsaWNfZ2xvYmFsLmR5bmFtaWNfaW50YWdnKQotCQlzbGljX2ludGFnZ19zZXQoYWRhcHRlciwgMCk7Ci0JZWxzZQotCQlzbGljX2ludGFnZ19zZXQoYWRhcHRlciwgaW50YWdnX2RlbGF5KTsKLQotCS8qCi0JICogIEluaXRpYWxpemUgcGluZyBzdGF0dXMgdG8gIm9rIgotCSAqLwotCWNhcmQtPnBpbmdzdGF0dXMgPSBJU1JfUElOR01BU0s7Ci0KLQkvKgotCSAqIExhc3RseSwgbWFyayBvdXIgY2FyZCBzdGF0ZSBhcyB1cCBhbmQgcmV0dXJuIHN1Y2Nlc3MKLQkgKi8KLQljYXJkLT5zdGF0ZSA9IENBUkRfVVA7Ci0JY2FyZC0+cmVzZXRfaW5fcHJvZ3Jlc3MgPSAwOwotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgdTMyIHNsaWNfY2FyZF9sb2NhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHNsaWNjYXJkICpjYXJkID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOwotCXN0cnVjdCBwaHlzY2FyZCAqcGh5c2NhcmQgPSBzbGljX2dsb2JhbC5waHlzX2NhcmQ7Ci0JdXNob3J0IGNhcmRfaG9zdGlkOwotCXUxNiBfX2lvbWVtICpob3N0aWRfcmVnOwotCXVpbnQgaTsKLQl1aW50IHJkaG9zdGlkX29mZnNldCA9IDA7Ci0KLQlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7Ci0JY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCXJkaG9zdGlkX29mZnNldCA9IFNMSUNfUkRIT1NUSURfMkdCOwotCQlicmVhazsKLQljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKLQkJcmRob3N0aWRfb2Zmc2V0ID0gU0xJQ19SREhPU1RJRF8xR0I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUFTU0VSVCgwKTsKLQkJYnJlYWs7Ci0JfQotCi0JaG9zdGlkX3JlZyA9Ci0JICAgICh1MTYgX19pb21lbSAqKSAoKCh1OCBfX2lvbWVtICopIChhZGFwdGVyLT5zbGljX3JlZ3MpKSArCi0JICAgIHJkaG9zdGlkX29mZnNldCk7Ci0KLQkvKiByZWFkIHRoZSAxNiBiaXQgaG9zdGlkIGZyb20gU1JBTSAqLwotCWNhcmRfaG9zdGlkID0gKHVzaG9ydCkgcmVhZHcoaG9zdGlkX3JlZyk7Ci0KLQkvKiBJbml0aWFsaXplIGEgbmV3IGNhcmQgc3RydWN0dXJlIGlmIG5lZWQgYmUgKi8KLQlpZiAoY2FyZF9ob3N0aWQgPT0gU0xJQ19IT1NUSURfREVGQVVMVCkgewotCQljYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNsaWNjYXJkKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjYXJkID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQljYXJkLT5uZXh0ID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOwotCQlzbGljX2dsb2JhbC5zbGljX2NhcmQgPSBjYXJkOwotCQljYXJkLT5idXNudW1iZXIgPSBhZGFwdGVyLT5idXNudW1iZXI7Ci0JCWNhcmQtPnNsb3RudW1iZXIgPSBhZGFwdGVyLT5zbG90bnVtYmVyOwotCi0JCS8qIEZpbmQgYW4gYXZhaWxhYmxlIGNhcmRudW0gKi8KLQkJZm9yIChpID0gMDsgaSA8IFNMSUNfTUFYX0NBUkRTOyBpKyspIHsKLQkJCWlmIChzbGljX2dsb2JhbC5jYXJkbnVtaW51c2VbaV0gPT0gMCkgewotCQkJCXNsaWNfZ2xvYmFsLmNhcmRudW1pbnVzZVtpXSA9IDE7Ci0JCQkJY2FyZC0+Y2FyZG51bSA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc2xpY19nbG9iYWwubnVtX3NsaWNfY2FyZHMrKzsKLQotCQlzbGljX2RlYnVnX2NhcmRfY3JlYXRlKGNhcmQpOwotCX0gZWxzZSB7Ci0JCS8qIENhcmQgZXhpc3RzLCBmaW5kIHRoZSBjYXJkIHRoaXMgYWRhcHRlciBiZWxvbmdzIHRvICovCi0JCXdoaWxlIChjYXJkKSB7Ci0JCQlpZiAoY2FyZC0+Y2FyZG51bSA9PSBjYXJkX2hvc3RpZCkKLQkJCQlicmVhazsKLQkJCWNhcmQgPSBjYXJkLT5uZXh0OwotCQl9Ci0JfQotCi0JQVNTRVJUKGNhcmQpOwotCWlmICghY2FyZCkKLQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCS8qIFB1dCB0aGUgYWRhcHRlciBpbiB0aGUgY2FyZCdzIGFkYXB0ZXIgbGlzdCAqLwotCUFTU0VSVChjYXJkLT5hZGFwdGVyW2FkYXB0ZXItPnBvcnRdID09IE5VTEwpOwotCWlmICghY2FyZC0+YWRhcHRlclthZGFwdGVyLT5wb3J0XSkgewotCQljYXJkLT5hZGFwdGVyW2FkYXB0ZXItPnBvcnRdID0gYWRhcHRlcjsKLQkJYWRhcHRlci0+Y2FyZCA9IGNhcmQ7Ci0JfQotCi0JY2FyZC0+Y2FyZF9zaXplID0gMTsJLyogb25lIHBvcnQgcGVyICpsb2dpY2FsKiBjYXJkICovCi0KLQl3aGlsZSAocGh5c2NhcmQpIHsKLQkJZm9yIChpID0gMDsgaSA8IFNMSUNfTUFYX1BPUlRTOyBpKyspIHsKLQkJCWlmICghcGh5c2NhcmQtPmFkYXB0ZXJbaV0pCi0JCQkJY29udGludWU7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJQVNTRVJUKGkgIT0gU0xJQ19NQVhfUE9SVFMpOwotCQlpZiAocGh5c2NhcmQtPmFkYXB0ZXJbaV0tPnNsb3RudW1iZXIgPT0gYWRhcHRlci0+c2xvdG51bWJlcikKLQkJCWJyZWFrOwotCQlwaHlzY2FyZCA9IHBoeXNjYXJkLT5uZXh0OwotCX0KLQlpZiAoIXBoeXNjYXJkKSB7Ci0JCS8qIG5vIHN0cnVjdHVyZSBhbGxvY2F0ZWQgZm9yIHRoaXMgcGh5c2ljYWwgY2FyZCB5ZXQgKi8KLQkJcGh5c2NhcmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5c2NhcmQpLCBHRlBfQVRPTUlDKTsKLQkJQVNTRVJUKHBoeXNjYXJkKTsKLQotCQlwaHlzY2FyZC0+bmV4dCA9IHNsaWNfZ2xvYmFsLnBoeXNfY2FyZDsKLQkJc2xpY19nbG9iYWwucGh5c19jYXJkID0gcGh5c2NhcmQ7Ci0JCXBoeXNjYXJkLT5hZGFwdGVyc19hbGxvY2QgPSAxOwotCX0gZWxzZSB7Ci0JCXBoeXNjYXJkLT5hZGFwdGVyc19hbGxvY2QrKzsKLQl9Ci0JLyogTm90ZSAtIHRoaXMgaXMgWkVSTyByZWxhdGl2ZSAqLwotCWFkYXB0ZXItPnBoeXNwb3J0ID0gcGh5c2NhcmQtPmFkYXB0ZXJzX2FsbG9jZCAtIDE7Ci0KLQlBU1NFUlQocGh5c2NhcmQtPmFkYXB0ZXJbYWRhcHRlci0+cGh5c3BvcnRdID09IE5VTEwpOwotCXBoeXNjYXJkLT5hZGFwdGVyW2FkYXB0ZXItPnBoeXNwb3J0XSA9IGFkYXB0ZXI7Ci0JYWRhcHRlci0+cGh5c2NhcmQgPSBwaHlzY2FyZDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBzbGljX3NvZnRfcmVzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKGFkYXB0ZXItPmNhcmQtPnN0YXRlID09IENBUkRfVVApIHsKQEAgLTIzMjIsNiArNzIwLDYyIEBACiAJbWRlbGF5KDEpOwogfQogCitzdGF0aWMgdm9pZCBzbGljX21hY19hZGRyZXNzX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsdWU7CisJdTMyIHZhbHVlMjsKKwlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKKworCXZhbHVlID0gKih1MzIgKikgJmFkYXB0ZXItPmN1cnJtYWNhZGRyWzJdOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJhbCwgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JhZGRyYmwsIHZhbHVlLCBGTFVTSCk7CisKKwl2YWx1ZTIgPSAodTMyKSAoKGFkYXB0ZXItPmN1cnJtYWNhZGRyWzBdIDw8IDggfAorCQkJICAgICBhZGFwdGVyLT5jdXJybWFjYWRkclsxXSkgJiAweEZGRkYpOworCisJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmFoLCB2YWx1ZTIsIEZMVVNIKTsKKwlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JhZGRyYmgsIHZhbHVlMiwgRkxVU0gpOworCisJLyogV3JpdGUgb3VyIG11bHRpY2FzdCBtYXNrIG91dCB0byB0aGUgY2FyZC4gIFRoaXMgaXMgZG9uZSAqLworCS8qIGhlcmUgaW4gYWRkaXRpb24gdG8gdGhlIHNsaWNfbWNhc3RfYWRkcl9zZXQgcm91dGluZSAgICAgKi8KKwkvKiBiZWNhdXNlIEFMTF9NQ0FTVCBtYXkgaGF2ZSBiZWVuIGVuYWJsZWQgb3IgZGlzYWJsZWQgICAgICovCisJc2xpY19tY2FzdF9zZXRfbWFzayhhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgc2xpY19tYWNfY29uZmlnKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWx1ZTsKKwlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKKworCS8qIFNldHVwIEdNQUMgZ2FwcyAqLworCWlmIChhZGFwdGVyLT5saW5rc3BlZWQgPT0gTElOS18xMDAwTUIpIHsKKwkJdmFsdWUgPSAoKEdNQ1JfR0FQQkJfMTAwMCA8PCBHTUNSX0dBUEJCX1NISUZUKSB8CisJCQkgKEdNQ1JfR0FQUjFfMTAwMCA8PCBHTUNSX0dBUFIxX1NISUZUKSB8CisJCQkgKEdNQ1JfR0FQUjJfMTAwMCA8PCBHTUNSX0dBUFIyX1NISUZUKSk7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSAoKEdNQ1JfR0FQQkJfMTAwIDw8IEdNQ1JfR0FQQkJfU0hJRlQpIHwKKwkJCSAoR01DUl9HQVBSMV8xMDAgPDwgR01DUl9HQVBSMV9TSElGVCkgfAorCQkJIChHTUNSX0dBUFIyXzEwMCA8PCBHTUNSX0dBUFIyX1NISUZUKSk7CisJfQorCisJLyogZW5hYmxlIEdNSUkgKi8KKwlpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTAwME1CKQorCQl2YWx1ZSB8PSBHTUNSX0dCSVQ7CisKKwkvKiBlbmFibGUgZnVsbGR1cGxleCAqLworCWlmICgoYWRhcHRlci0+bGlua2R1cGxleCA9PSBMSU5LX0ZVTExEKQorCSAgICB8fCAoYWRhcHRlci0+bWFjb3B0cyAmIE1BQ19MT09QQkFDSykpIHsKKwkJdmFsdWUgfD0gR01DUl9GVUxMRDsKKwl9CisKKwkvKiB3cml0ZSBtYWMgY29uZmlnICovCisJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dtY2ZnLCB2YWx1ZSwgRkxVU0gpOworCisJLyogc2V0dXAgbWFjIGFkZHJlc3NlcyAqLworCXNsaWNfbWFjX2FkZHJlc3NfY29uZmlnKGFkYXB0ZXIpOworfQorCiBzdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19zZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgbGlua2NoYW5nZSkKIHsKIAl1MzIgdmFsdWU7CkBAIC0yNDAzLDc2ICs4NTcsMTAgQEAKIAlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOwogfQogCi1zdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19nZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjb25maWcsCi0JCQkJCQkJdTMyIGNvbmZpZ19oKQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBzbGljX3Vwcl9yZXF1ZXN0KGFkYXB0ZXIsCi0JCQkJICBTTElDX1VQUl9SQ09ORklHLAotCQkJCSAgKHUzMikgY29uZmlnLCAodTMyKSBjb25maWdfaCwgMCwgMCk7Ci0JQVNTRVJUKHN0YXR1cyA9PSAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2xpY19tYWNfYWRkcmVzc19jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTMyIHZhbHVlOwotCXUzMiB2YWx1ZTI7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7Ci0KLQl2YWx1ZSA9ICoodTMyICopICZhZGFwdGVyLT5jdXJybWFjYWRkclsyXTsKLQl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JhZGRyYWwsIHZhbHVlLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmJsLCB2YWx1ZSwgRkxVU0gpOwotCi0JdmFsdWUyID0gKHUzMikgKChhZGFwdGVyLT5jdXJybWFjYWRkclswXSA8PCA4IHwKLQkJCSAgICAgYWRhcHRlci0+Y3Vycm1hY2FkZHJbMV0pICYgMHhGRkZGKTsKLQotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJhaCwgdmFsdWUyLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmJoLCB2YWx1ZTIsIEZMVVNIKTsKLQotCS8qIFdyaXRlIG91ciBtdWx0aWNhc3QgbWFzayBvdXQgdG8gdGhlIGNhcmQuICBUaGlzIGlzIGRvbmUgKi8KLQkvKiBoZXJlIGluIGFkZGl0aW9uIHRvIHRoZSBzbGljX21jYXN0X2FkZHJfc2V0IHJvdXRpbmUgICAgICovCi0JLyogYmVjYXVzZSBBTExfTUNBU1QgbWF5IGhhdmUgYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkICAgICAqLwotCXNsaWNfbWNhc3Rfc2V0X21hc2soYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsaWNfbWFjX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgdmFsdWU7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7Ci0KLQkvKiBTZXR1cCBHTUFDIGdhcHMgKi8KLQlpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTAwME1CKSB7Ci0JCXZhbHVlID0gKChHTUNSX0dBUEJCXzEwMDAgPDwgR01DUl9HQVBCQl9TSElGVCkgfAotCQkJIChHTUNSX0dBUFIxXzEwMDAgPDwgR01DUl9HQVBSMV9TSElGVCkgfAotCQkJIChHTUNSX0dBUFIyXzEwMDAgPDwgR01DUl9HQVBSMl9TSElGVCkpOwotCX0gZWxzZSB7Ci0JCXZhbHVlID0gKChHTUNSX0dBUEJCXzEwMCA8PCBHTUNSX0dBUEJCX1NISUZUKSB8Ci0JCQkgKEdNQ1JfR0FQUjFfMTAwIDw8IEdNQ1JfR0FQUjFfU0hJRlQpIHwKLQkJCSAoR01DUl9HQVBSMl8xMDAgPDwgR01DUl9HQVBSMl9TSElGVCkpOwotCX0KLQotCS8qIGVuYWJsZSBHTUlJICovCi0JaWYgKGFkYXB0ZXItPmxpbmtzcGVlZCA9PSBMSU5LXzEwMDBNQikKLQkJdmFsdWUgfD0gR01DUl9HQklUOwotCi0JLyogZW5hYmxlIGZ1bGxkdXBsZXggKi8KLQlpZiAoKGFkYXB0ZXItPmxpbmtkdXBsZXggPT0gTElOS19GVUxMRCkKLQkgICAgfHwgKGFkYXB0ZXItPm1hY29wdHMgJiBNQUNfTE9PUEJBQ0spKSB7Ci0JCXZhbHVlIHw9IEdNQ1JfRlVMTEQ7Ci0JfQotCi0JLyogd3JpdGUgbWFjIGNvbmZpZyAqLwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193bWNmZywgdmFsdWUsIEZMVVNIKTsKLQotCS8qIHNldHVwIG1hYyBhZGRyZXNzZXMgKi8KLQlzbGljX21hY19hZGRyZXNzX2NvbmZpZyhhZGFwdGVyKTsKLX0KLQogc3RhdGljIGJvb2wgc2xpY19tYWNfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJc3RydWN0IGV0aGVyX2hlYWRlciAqZXRoZXJfZnJhbWUpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAl1MzIgb3B0cyA9IGFkYXB0ZXItPm1hY29wdHM7CiAJdTMyICpkaG9zdDQgPSAodTMyICopJmV0aGVyX2ZyYW1lLT5ldGhlcl9kaG9zdFswXTsKIAl1MTYgKmRob3N0MiA9ICh1MTYgKikmZXRoZXJfZnJhbWUtPmV0aGVyX2Rob3N0WzRdOwpAQCAtMjQ5Miw3ICs4ODAsNyBAQAogCWlmIChldGhlcl9mcmFtZS0+ZXRoZXJfZGhvc3RbMF0gJiAweDAxKSB7CiAJCWlmIChvcHRzICYgTUFDX0FMTE1DQVNUKSB7CiAJCQlhZGFwdGVyLT5yY3ZfbXVsdGljYXN0cysrOwotCQkJYWRhcHRlci0+c3RhdHMubXVsdGljYXN0Kys7CisJCQluZXRkZXYtPnN0YXRzLm11bHRpY2FzdCsrOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAkJaWYgKG9wdHMgJiBNQUNfTUNBU1QpIHsKQEAgLTI1MDIsNyArODkwLDcgQEAKIAkJCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihtY2FkZHItPmFkZHJlc3MsCiAJCQkJCQkJZXRoZXJfZnJhbWUtPmV0aGVyX2Rob3N0KSkgewogCQkJCQlhZGFwdGVyLT5yY3ZfbXVsdGljYXN0cysrOwotCQkJCQlhZGFwdGVyLT5zdGF0cy5tdWx0aWNhc3QrKzsKKwkJCQkJbmV0ZGV2LT5zdGF0cy5tdWx0aWNhc3QrKzsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQogCQkJCW1jYWRkciA9IG1jYWRkci0+bmV4dDsKQEAgLTI1OTcsMTcgKzk4NSw2IEBACiAJYWRkX3RpbWVyKCZjYXJkLT5sb2FkdGltZXIpOwogfQogCi1zdGF0aWMgdm9pZCBzbGljX2Fzc2VydF9mYWlsKHZvaWQpCi17Ci0JdTMyIGNwdWlkOwotCXUzMiBjdXJyX3BpZDsKLQljcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQljdXJyX3BpZCA9IGN1cnJlbnQtPnBpZDsKLQotCXByaW50ayhLRVJOX0VSUiAiJXMgQ1BVICMgJWQgLS0tLSBQSUQgIyAlZFxuIiwKLQkgICAgICAgX19mdW5jX18sIGNwdWlkLCBjdXJyX3BpZCk7Ci19Ci0KIHN0YXRpYyBpbnQgc2xpY191cHJfcXVldWVfcmVxdWVzdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgIHUzMiB1cHJfcmVxdWVzdCwKIAkJCSAgIHUzMiB1cHJfZGF0YSwKQEAgLTI2MzcsNyArMTAxNCw1NSBAQAogCX0gZWxzZSB7CiAJCWFkYXB0ZXItPnVwcl9saXN0ID0gdXByOwogCX0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfdXByX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzbGljX3VwciAqdXByOworCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOworLyoKKyAgICBjaGFyICogcHRyMTsKKyAgICBjaGFyICogcHRyMjsKKyAgICB1aW50IGNtZG9mZnNldDsKKyovCisJdXByID0gYWRhcHRlci0+dXByX2xpc3Q7CisJaWYgKCF1cHIpCisJCXJldHVybjsKKwlpZiAoYWRhcHRlci0+dXByX2J1c3kpCisJCXJldHVybjsKKwlhZGFwdGVyLT51cHJfYnVzeSA9IDE7CisKKwlzd2l0Y2ggKHVwci0+dXByX3JlcXVlc3QpIHsKKwljYXNlIFNMSUNfVVBSX1NUQVRTOgorCQlpZiAodXByLT51cHJfZGF0YV9oID09IDApIHsKKwkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19zdGF0cywgdXByLT51cHJfZGF0YSwKKwkJCQkJIEZMVVNIKTsKKwkJfSBlbHNlIHsKKwkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19zdGF0czY0LAorCQkJCQkgdXByLT51cHJfZGF0YSwKKwkJCQkJICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKKwkJCQkJIHVwci0+dXByX2RhdGFfaCwgRkxVU0gpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTElDX1VQUl9STFNSOgorCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfcmxzciwgdXByLT51cHJfZGF0YSwKKwkJCQkgJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCB1cHItPnVwcl9kYXRhX2gsCisJCQkJIEZMVVNIKTsKKwkJYnJlYWs7CisKKwljYXNlIFNMSUNfVVBSX1JDT05GSUc6CisJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19yY29uZmlnLAorCQkJCSB1cHItPnVwcl9kYXRhLCAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCisJCQkJIHVwci0+dXByX2RhdGFfaCwgRkxVU0gpOworCQlicmVhazsKKwljYXNlIFNMSUNfVVBSX1BJTkc6CisJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19waW5nLCAxLCBGTFVTSCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgc2xpY191cHJfcmVxdWVzdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKQEAgLTI2NDYsMjIgKzEwNzEsOTcgQEAKIAkJICAgICB1MzIgdXByX2RhdGFfaCwKIAkJICAgICB1MzIgdXByX2J1ZmZlciwgdTMyIHVwcl9idWZmZXJfaCkKIHsKLQlpbnQgc3RhdHVzOworCWludCByYzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT51cHJfbG9jay5sb2NrLCBhZGFwdGVyLT51cHJfbG9jay5mbGFncyk7Ci0Jc3RhdHVzID0gc2xpY191cHJfcXVldWVfcmVxdWVzdChhZGFwdGVyLAorCXJjID0gc2xpY191cHJfcXVldWVfcmVxdWVzdChhZGFwdGVyLAogCQkJCQl1cHJfcmVxdWVzdCwKIAkJCQkJdXByX2RhdGEsCiAJCQkJCXVwcl9kYXRhX2gsIHVwcl9idWZmZXIsIHVwcl9idWZmZXJfaCk7Ci0JaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT51cHJfbG9jay5sb2NrLAotCQkJCQlhZGFwdGVyLT51cHJfbG9jay5mbGFncyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQorCWlmIChyYykKKwkJZ290byBlcnJfdW5sb2NrX2lycTsKKwogCXNsaWNfdXByX3N0YXJ0KGFkYXB0ZXIpOworZXJyX3VubG9ja19pcnE6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dXByX2xvY2subG9jaywKIAkJCQlhZGFwdGVyLT51cHJfbG9jay5mbGFncyk7Ci0JcmV0dXJuIFNUQVRVU19QRU5ESU5HOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgc2xpY19saW5rX3Vwcl9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGlzcikKK3sKKwl1MzIgbGlua3N0YXR1cyA9IGFkYXB0ZXItPnBzaG1lbS0+bGlua3N0YXR1czsKKwl1aW50IGxpbmt1cDsKKwl1bnNpZ25lZCBjaGFyIGxpbmtzcGVlZDsKKwl1bnNpZ25lZCBjaGFyIGxpbmtkdXBsZXg7CisKKwlpZiAoKGlzciAmIElTUl9VUENFUlIpIHx8IChpc3IgJiBJU1JfVVBDQlNZKSkgeworCQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCisJCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKWFkYXB0ZXItPnBoeXNfc2htZW07CisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCQlzbGljX3Vwcl9xdWV1ZV9yZXF1ZXN0KGFkYXB0ZXIsCisJCQkJICAgICAgIFNMSUNfVVBSX1JMU1IsCisJCQkJICAgICAgIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmxpbmtzdGF0dXMpLAorCQkJCSAgICAgICBTTElDX0dFVF9BRERSX0hJR0goJnBzaG1lbS0+bGlua3N0YXR1cyksCisJCQkJICAgICAgIDAsIDApOworI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQorCQlzbGljX3Vwcl9xdWV1ZV9yZXF1ZXN0KGFkYXB0ZXIsCisJCQkJICAgICAgIFNMSUNfVVBSX1JMU1IsCisJCQkJICAgICAgICh1MzIpICZwc2htZW0tPmxpbmtzdGF0dXMsCisJCQkJICAgICAgIFNMSUNfR0VUX0FERFJfSElHSChwc2htZW0pLCAwLCAwKTsKKyNlbHNlCisJCVN0b3AgQ29tcGlsYXRpb247CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKwlpZiAoYWRhcHRlci0+c3RhdGUgIT0gQURBUFRfVVApCisJCXJldHVybjsKKworCUFTU0VSVCgoYWRhcHRlci0+ZGV2aWQgPT0gU0xJQ18xR0JfREVWSUNFX0lEKQorCSAgICAgICB8fCAoYWRhcHRlci0+ZGV2aWQgPT0gU0xJQ18yR0JfREVWSUNFX0lEKSk7CisKKwlsaW5rdXAgPSBsaW5rc3RhdHVzICYgR0lHX0xJTktVUCA/IExJTktfVVAgOiBMSU5LX0RPV047CisJaWYgKGxpbmtzdGF0dXMgJiBHSUdfU1BFRURfMTAwMCkKKwkJbGlua3NwZWVkID0gTElOS18xMDAwTUI7CisJZWxzZSBpZiAobGlua3N0YXR1cyAmIEdJR19TUEVFRF8xMDApCisJCWxpbmtzcGVlZCA9IExJTktfMTAwTUI7CisJZWxzZQorCQlsaW5rc3BlZWQgPSBMSU5LXzEwTUI7CisKKwlpZiAobGlua3N0YXR1cyAmIEdJR19GVUxMRFVQTEVYKQorCQlsaW5rZHVwbGV4ID0gTElOS19GVUxMRDsKKwllbHNlCisJCWxpbmtkdXBsZXggPSBMSU5LX0hBTEZEOworCisJaWYgKChhZGFwdGVyLT5saW5rc3RhdGUgPT0gTElOS19ET1dOKSAmJiAobGlua3VwID09IExJTktfRE9XTikpCisJCXJldHVybjsKKworCS8qIGxpbmsgdXAgZXZlbnQsIGJ1dCBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKChhZGFwdGVyLT5saW5rc3RhdGUgPT0gTElOS19VUCkgJiYKKwkgICAgKGxpbmt1cCA9PSBMSU5LX1VQKSAmJgorCSAgICAoYWRhcHRlci0+bGlua3NwZWVkID09IGxpbmtzcGVlZCkgJiYKKwkgICAgKGFkYXB0ZXItPmxpbmtkdXBsZXggPT0gbGlua2R1cGxleCkpCisJCXJldHVybjsKKworCS8qIGxpbmsgaGFzIGNoYW5nZWQgYXQgdGhpcyBwb2ludCAqLworCisJLyogbGluayBoYXMgZ29uZSBmcm9tIHVwIHRvIGRvd24gKi8KKwlpZiAobGlua3VwID09IExJTktfRE9XTikgeworCQlhZGFwdGVyLT5saW5rc3RhdGUgPSBMSU5LX0RPV047CisJCXJldHVybjsKKwl9CisKKwkvKiBsaW5rIGhhcyBnb25lIGZyb20gZG93biB0byB1cCAqLworCWFkYXB0ZXItPmxpbmtzcGVlZCA9IGxpbmtzcGVlZDsKKwlhZGFwdGVyLT5saW5rZHVwbGV4ID0gbGlua2R1cGxleDsKKworCWlmIChhZGFwdGVyLT5saW5rc3RhdGUgIT0gTElOS19VUCkgeworCQkvKiBzZXR1cCB0aGUgbWFjICovCisJCXNsaWNfY29uZmlnX3NldChhZGFwdGVyLCB0cnVlKTsKKwkJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19VUDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpc3IpCkBAIC0yNzg2LDEyOCArMTI4NiwxNSBAQAogCQkJCWFkYXB0ZXItPnVwcl9sb2NrLmZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgc2xpY191cHJfc3RhcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzbGljX2NvbmZpZ19nZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjb25maWcsCisJCQkJCQkJdTMyIGNvbmZpZ19oKQogewotCXN0cnVjdCBzbGljX3VwciAqdXByOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwotLyoKLSAgICBjaGFyICogcHRyMTsKLSAgICBjaGFyICogcHRyMjsKLSAgICB1aW50IGNtZG9mZnNldDsKLSovCi0JdXByID0gYWRhcHRlci0+dXByX2xpc3Q7Ci0JaWYgKCF1cHIpCi0JCXJldHVybjsKLQlpZiAoYWRhcHRlci0+dXByX2J1c3kpCi0JCXJldHVybjsKLQlhZGFwdGVyLT51cHJfYnVzeSA9IDE7CisJaW50IHN0YXR1czsKIAotCXN3aXRjaCAodXByLT51cHJfcmVxdWVzdCkgewotCWNhc2UgU0xJQ19VUFJfU1RBVFM6Ci0JCWlmICh1cHItPnVwcl9kYXRhX2ggPT0gMCkgewotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3N0YXRzLCB1cHItPnVwcl9kYXRhLAotCQkJCQkgRkxVU0gpOwotCQl9IGVsc2UgewotCQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmc2xpY19yZWdzLT5zbGljX3N0YXRzNjQsCi0JCQkJCSB1cHItPnVwcl9kYXRhLAotCQkJCQkgJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCQkgdXByLT51cHJfZGF0YV9oLCBGTFVTSCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNMSUNfVVBSX1JMU1I6Ci0JCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19ybHNyLCB1cHItPnVwcl9kYXRhLAotCQkJCSAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsIHVwci0+dXByX2RhdGFfaCwKLQkJCQkgRkxVU0gpOwotCQlicmVhazsKLQotCWNhc2UgU0xJQ19VUFJfUkNPTkZJRzoKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmc2xpY19yZWdzLT5zbGljX3Jjb25maWcsCi0JCQkJIHVwci0+dXByX2RhdGEsICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgdXByLT51cHJfZGF0YV9oLCBGTFVTSCk7Ci0JCWJyZWFrOwotCWNhc2UgU0xJQ19VUFJfUElORzoKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3BpbmcsIDEsIEZMVVNIKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQVNTRVJUKDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2xpY19saW5rX3Vwcl9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGlzcikKLXsKLQl1MzIgbGlua3N0YXR1cyA9IGFkYXB0ZXItPnBzaG1lbS0+bGlua3N0YXR1czsKLQl1aW50IGxpbmt1cDsKLQl1bnNpZ25lZCBjaGFyIGxpbmtzcGVlZDsKLQl1bnNpZ25lZCBjaGFyIGxpbmtkdXBsZXg7Ci0KLQlpZiAoKGlzciAmIElTUl9VUENFUlIpIHx8IChpc3IgJiBJU1JfVVBDQlNZKSkgewotCQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOwotCi0JCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKWFkYXB0ZXItPnBoeXNfc2htZW07Ci0jaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQotCQlzbGljX3Vwcl9xdWV1ZV9yZXF1ZXN0KGFkYXB0ZXIsCi0JCQkJICAgICAgIFNMSUNfVVBSX1JMU1IsCi0JCQkJICAgICAgIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmxpbmtzdGF0dXMpLAotCQkJCSAgICAgICBTTElDX0dFVF9BRERSX0hJR0goJnBzaG1lbS0+bGlua3N0YXR1cyksCi0JCQkJICAgICAgIDAsIDApOwotI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQotCQlzbGljX3Vwcl9xdWV1ZV9yZXF1ZXN0KGFkYXB0ZXIsCi0JCQkJICAgICAgIFNMSUNfVVBSX1JMU1IsCi0JCQkJICAgICAgICh1MzIpICZwc2htZW0tPmxpbmtzdGF0dXMsCi0JCQkJICAgICAgIFNMSUNfR0VUX0FERFJfSElHSChwc2htZW0pLCAwLCAwKTsKLSNlbHNlCi0JCVN0b3AgQ29tcGlsYXRpb247Ci0jZW5kaWYKLQkJcmV0dXJuOwotCX0KLQlpZiAoYWRhcHRlci0+c3RhdGUgIT0gQURBUFRfVVApCi0JCXJldHVybjsKLQotCUFTU0VSVCgoYWRhcHRlci0+ZGV2aWQgPT0gU0xJQ18xR0JfREVWSUNFX0lEKQotCSAgICAgICB8fCAoYWRhcHRlci0+ZGV2aWQgPT0gU0xJQ18yR0JfREVWSUNFX0lEKSk7Ci0KLQlsaW5rdXAgPSBsaW5rc3RhdHVzICYgR0lHX0xJTktVUCA/IExJTktfVVAgOiBMSU5LX0RPV047Ci0JaWYgKGxpbmtzdGF0dXMgJiBHSUdfU1BFRURfMTAwMCkKLQkJbGlua3NwZWVkID0gTElOS18xMDAwTUI7Ci0JZWxzZSBpZiAobGlua3N0YXR1cyAmIEdJR19TUEVFRF8xMDApCi0JCWxpbmtzcGVlZCA9IExJTktfMTAwTUI7Ci0JZWxzZQotCQlsaW5rc3BlZWQgPSBMSU5LXzEwTUI7Ci0KLQlpZiAobGlua3N0YXR1cyAmIEdJR19GVUxMRFVQTEVYKQotCQlsaW5rZHVwbGV4ID0gTElOS19GVUxMRDsKLQllbHNlCi0JCWxpbmtkdXBsZXggPSBMSU5LX0hBTEZEOwotCi0JaWYgKChhZGFwdGVyLT5saW5rc3RhdGUgPT0gTElOS19ET1dOKSAmJiAobGlua3VwID09IExJTktfRE9XTikpCi0JCXJldHVybjsKLQotCS8qIGxpbmsgdXAgZXZlbnQsIGJ1dCBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKChhZGFwdGVyLT5saW5rc3RhdGUgPT0gTElOS19VUCkgJiYKLQkgICAgKGxpbmt1cCA9PSBMSU5LX1VQKSAmJgotCSAgICAoYWRhcHRlci0+bGlua3NwZWVkID09IGxpbmtzcGVlZCkgJiYKLQkgICAgKGFkYXB0ZXItPmxpbmtkdXBsZXggPT0gbGlua2R1cGxleCkpCi0JCXJldHVybjsKLQotCS8qIGxpbmsgaGFzIGNoYW5nZWQgYXQgdGhpcyBwb2ludCAqLwotCi0JLyogbGluayBoYXMgZ29uZSBmcm9tIHVwIHRvIGRvd24gKi8KLQlpZiAobGlua3VwID09IExJTktfRE9XTikgewotCQlhZGFwdGVyLT5saW5rc3RhdGUgPSBMSU5LX0RPV047Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBsaW5rIGhhcyBnb25lIGZyb20gZG93biB0byB1cCAqLwotCWFkYXB0ZXItPmxpbmtzcGVlZCA9IGxpbmtzcGVlZDsKLQlhZGFwdGVyLT5saW5rZHVwbGV4ID0gbGlua2R1cGxleDsKLQotCWlmIChhZGFwdGVyLT5saW5rc3RhdGUgIT0gTElOS19VUCkgewotCQkvKiBzZXR1cCB0aGUgbWFjICovCi0JCXNsaWNfY29uZmlnX3NldChhZGFwdGVyLCB0cnVlKTsKLQkJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19VUDsKLQkJbmV0aWZfc3RhcnRfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKLQl9CisJc3RhdHVzID0gc2xpY191cHJfcmVxdWVzdChhZGFwdGVyLAorCQkJCSAgU0xJQ19VUFJfUkNPTkZJRywKKwkJCQkgICh1MzIpIGNvbmZpZywgKHUzMikgY29uZmlnX2gsIDAsIDApOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CiB9CiAKIC8qCkBAIC0zMDEyLDYgKzEzOTksMjQgQEAKIAlyZXR1cm4gKHVzaG9ydCkgc3VtOwogfQogCitzdGF0aWMgdm9pZCBzbGljX3JzcHF1ZXVlX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisJc3RydWN0IHNsaWNfcnNwcXVldWUgKnJzcHEgPSAmYWRhcHRlci0+cnNwcXVldWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnNwcS0+bnVtX3BhZ2VzOyBpKyspIHsKKwkJaWYgKHJzcHEtPnZhZGRyW2ldKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgcnNwcS0+dmFkZHJbaV0sIHJzcHEtPnBhZGRyW2ldKTsKKwkJfQorCQlyc3BxLT52YWRkcltpXSA9IE5VTEw7CisJCXJzcHEtPnBhZGRyW2ldID0gMDsKKwl9CisJcnNwcS0+b2Zmc2V0ID0gMDsKKwlyc3BxLT5wYWdlaW5kZXggPSAwOworCXJzcHEtPnJzcGJ1ZiA9IE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgc2xpY19yc3BxdWV1ZV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWludCBpOwpAQCAtMzAzMiw3ICsxNDM3LDcgQEAKIAkJCWRldl9lcnIoJmFkYXB0ZXItPnBjaWRldi0+ZGV2LAogCQkJCSJwY2lfYWxsb2NfY29uc2lzdGVudCBmYWlsZWRcbiIpOwogCQkJc2xpY19yc3BxdWV1ZV9mcmVlKGFkYXB0ZXIpOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KICNpZm5kZWYgQ09ORklHX1g4Nl82NAogCQlBU1NFUlQoKCh1MzIpIHJzcHEtPnZhZGRyW2ldICYgMHhGRkZGRjAwMCkgPT0KQEAgLTMwNTYsMjUgKzE0NjEsNyBAQAogCXJzcHEtPm9mZnNldCA9IDA7CiAJcnNwcS0+cGFnZWluZGV4ID0gMDsKIAlyc3BxLT5yc3BidWYgPSAoc3RydWN0IHNsaWNfcnNwYnVmICopcnNwcS0+dmFkZHJbMF07Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBzbGljX3JzcHF1ZXVlX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHNsaWNfcnNwcXVldWUgKnJzcHEgPSAmYWRhcHRlci0+cnNwcXVldWU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcnNwcS0+bnVtX3BhZ2VzOyBpKyspIHsKLQkJaWYgKHJzcHEtPnZhZGRyW2ldKSB7Ci0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwgUEFHRV9TSVpFLAotCQkJCQkgICAgcnNwcS0+dmFkZHJbaV0sIHJzcHEtPnBhZGRyW2ldKTsKLQkJfQotCQlyc3BxLT52YWRkcltpXSA9IE5VTEw7Ci0JCXJzcHEtPnBhZGRyW2ldID0gMDsKLQl9Ci0JcnNwcS0+b2Zmc2V0ID0gMDsKLQlyc3BxLT5wYWdlaW5kZXggPSAwOwotCXJzcHEtPnJzcGJ1ZiA9IE5VTEw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2xpY19yc3BidWYgKnNsaWNfcnNwcXVldWVfZ2V0bmV4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKQEAgLTMxNTksMzYgKzE1NDYsNiBAQAogCXJldHVybiBwYWdlYWRkcjsKIH0KIAotc3RhdGljIGludCBzbGljX2NtZHFfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgaTsKLQl1MzIgKnBhZ2VhZGRyOwotCi0JQVNTRVJUKGFkYXB0ZXItPnN0YXRlID09IEFEQVBUX0RPV04pOwotCW1lbXNldCgmYWRhcHRlci0+Y21kcV9hbGwsIDAsIHNpemVvZihzdHJ1Y3Qgc2xpY19jbWRxdWV1ZSkpOwotCW1lbXNldCgmYWRhcHRlci0+Y21kcV9mcmVlLCAwLCBzaXplb2Yoc3RydWN0IHNsaWNfY21kcXVldWUpKTsKLQltZW1zZXQoJmFkYXB0ZXItPmNtZHFfZG9uZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX2NtZHF1ZXVlKSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmNtZHFfYWxsLmxvY2subG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmNtZHFfZnJlZS5sb2NrLmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5jbWRxX2RvbmUubG9jay5sb2NrKTsKLQlzbGljX2NtZHFtZW1faW5pdChhZGFwdGVyKTsKLQlhZGFwdGVyLT5zbGljX2hhbmRsZV9peCA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IFNMSUNfQ01EUV9JTklUUEFHRVM7IGkrKykgewotCQlwYWdlYWRkciA9IHNsaWNfY21kcW1lbV9hZGRwYWdlKGFkYXB0ZXIpOwotI2lmbmRlZiBDT05GSUdfWDg2XzY0Ci0JCUFTU0VSVCgoKHUzMikgcGFnZWFkZHIgJiAweEZGRkZGMDAwKSA9PSAodTMyKSBwYWdlYWRkcik7Ci0jZW5kaWYKLQkJaWYgKCFwYWdlYWRkcikgewotCQkJc2xpY19jbWRxX2ZyZWUoYWRhcHRlcik7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQkJc2xpY19jbWRxX2FkZGNtZHBhZ2UoYWRhcHRlciwgcGFnZWFkZHIpOwotCX0KLQlhZGFwdGVyLT5zbGljX2hhbmRsZV9peCA9IDE7Ci0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfY21kcV9mcmVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBzbGljX2hvc3RjbWQgKmNtZDsKQEAgLTMyMTIsNTMgKzE1NjksNiBAQAogCXNsaWNfY21kcW1lbV9mcmVlKGFkYXB0ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBzbGljX2NtZHFfcmVzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHNsaWNfaG9zdGNtZCAqaGNtZDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXUzMiBvdXRzdGFuZGluZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5jbWRxX2ZyZWUubG9jay5sb2NrLAotCQkJYWRhcHRlci0+Y21kcV9mcmVlLmxvY2suZmxhZ3MpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5jbWRxX2RvbmUubG9jay5sb2NrLAotCQkJYWRhcHRlci0+Y21kcV9kb25lLmxvY2suZmxhZ3MpOwotCW91dHN0YW5kaW5nID0gYWRhcHRlci0+Y21kcV9hbGwuY291bnQgLSBhZGFwdGVyLT5jbWRxX2RvbmUuY291bnQ7Ci0Jb3V0c3RhbmRpbmcgLT0gYWRhcHRlci0+Y21kcV9mcmVlLmNvdW50OwotCWhjbWQgPSBhZGFwdGVyLT5jbWRxX2FsbC5oZWFkOwotCXdoaWxlIChoY21kKSB7Ci0JCWlmIChoY21kLT5idXN5KSB7Ci0JCQlza2IgPSBoY21kLT5za2I7Ci0JCQlBU1NFUlQoc2tiKTsKLQkJCWhjbWQtPmJ1c3kgPSAwOwotCQkJaGNtZC0+c2tiID0gTlVMTDsKLQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7Ci0JCX0KLQkJaGNtZCA9IGhjbWQtPm5leHRfYWxsOwotCX0KLQlhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQgPSAwOwotCWFkYXB0ZXItPmNtZHFfZnJlZS5oZWFkID0gTlVMTDsKLQlhZGFwdGVyLT5jbWRxX2ZyZWUudGFpbCA9IE5VTEw7Ci0JYWRhcHRlci0+Y21kcV9kb25lLmNvdW50ID0gMDsKLQlhZGFwdGVyLT5jbWRxX2RvbmUuaGVhZCA9IE5VTEw7Ci0JYWRhcHRlci0+Y21kcV9kb25lLnRhaWwgPSBOVUxMOwotCWFkYXB0ZXItPmNtZHFfZnJlZS5oZWFkID0gYWRhcHRlci0+Y21kcV9hbGwuaGVhZDsKLQloY21kID0gYWRhcHRlci0+Y21kcV9hbGwuaGVhZDsKLQl3aGlsZSAoaGNtZCkgewotCQlhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQrKzsKLQkJaGNtZC0+bmV4dCA9IGhjbWQtPm5leHRfYWxsOwotCQloY21kID0gaGNtZC0+bmV4dF9hbGw7Ci0JfQotCWlmIChhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQgIT0gYWRhcHRlci0+Y21kcV9hbGwuY291bnQpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCi0JCQkiZnJlZV9jb3VudCAlZCAhPSBhbGwgY291bnQgJWRcbiIsCi0JCQlhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQsIGFkYXB0ZXItPmNtZHFfYWxsLmNvdW50KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kcV9kb25lLmxvY2subG9jaywKLQkJCQlhZGFwdGVyLT5jbWRxX2RvbmUubG9jay5mbGFncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kcV9mcmVlLmxvY2subG9jaywKLQkJCQlhZGFwdGVyLT5jbWRxX2ZyZWUubG9jay5mbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfY21kcV9hZGRjbWRwYWdlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgKnBhZ2UpCiB7CiAJc3RydWN0IHNsaWNfaG9zdGNtZCAqY21kOwpAQCAtMzMyNCw2ICsxNjM0LDk5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kcS0+bG9jay5sb2NrLCBjbWRxLT5sb2NrLmZsYWdzKTsKIH0KIAorc3RhdGljIGludCBzbGljX2NtZHFfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKwl1MzIgKnBhZ2VhZGRyOworCisJQVNTRVJUKGFkYXB0ZXItPnN0YXRlID09IEFEQVBUX0RPV04pOworCW1lbXNldCgmYWRhcHRlci0+Y21kcV9hbGwsIDAsIHNpemVvZihzdHJ1Y3Qgc2xpY19jbWRxdWV1ZSkpOworCW1lbXNldCgmYWRhcHRlci0+Y21kcV9mcmVlLCAwLCBzaXplb2Yoc3RydWN0IHNsaWNfY21kcXVldWUpKTsKKwltZW1zZXQoJmFkYXB0ZXItPmNtZHFfZG9uZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX2NtZHF1ZXVlKSk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmNtZHFfYWxsLmxvY2subG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmNtZHFfZnJlZS5sb2NrLmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5jbWRxX2RvbmUubG9jay5sb2NrKTsKKwlzbGljX2NtZHFtZW1faW5pdChhZGFwdGVyKTsKKwlhZGFwdGVyLT5zbGljX2hhbmRsZV9peCA9IDE7CisJZm9yIChpID0gMDsgaSA8IFNMSUNfQ01EUV9JTklUUEFHRVM7IGkrKykgeworCQlwYWdlYWRkciA9IHNsaWNfY21kcW1lbV9hZGRwYWdlKGFkYXB0ZXIpOworI2lmbmRlZiBDT05GSUdfWDg2XzY0CisJCUFTU0VSVCgoKHUzMikgcGFnZWFkZHIgJiAweEZGRkZGMDAwKSA9PSAodTMyKSBwYWdlYWRkcik7CisjZW5kaWYKKwkJaWYgKCFwYWdlYWRkcikgeworCQkJc2xpY19jbWRxX2ZyZWUoYWRhcHRlcik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlzbGljX2NtZHFfYWRkY21kcGFnZShhZGFwdGVyLCBwYWdlYWRkcik7CisJfQorCWFkYXB0ZXItPnNsaWNfaGFuZGxlX2l4ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbGljX2NtZHFfcmVzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHNsaWNfaG9zdGNtZCAqaGNtZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBvdXRzdGFuZGluZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5jbWRxX2ZyZWUubG9jay5sb2NrLAorCQkJYWRhcHRlci0+Y21kcV9mcmVlLmxvY2suZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5jbWRxX2RvbmUubG9jay5sb2NrLAorCQkJYWRhcHRlci0+Y21kcV9kb25lLmxvY2suZmxhZ3MpOworCW91dHN0YW5kaW5nID0gYWRhcHRlci0+Y21kcV9hbGwuY291bnQgLSBhZGFwdGVyLT5jbWRxX2RvbmUuY291bnQ7CisJb3V0c3RhbmRpbmcgLT0gYWRhcHRlci0+Y21kcV9mcmVlLmNvdW50OworCWhjbWQgPSBhZGFwdGVyLT5jbWRxX2FsbC5oZWFkOworCXdoaWxlIChoY21kKSB7CisJCWlmIChoY21kLT5idXN5KSB7CisJCQlza2IgPSBoY21kLT5za2I7CisJCQlBU1NFUlQoc2tiKTsKKwkJCWhjbWQtPmJ1c3kgPSAwOworCQkJaGNtZC0+c2tiID0gTlVMTDsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCX0KKwkJaGNtZCA9IGhjbWQtPm5leHRfYWxsOworCX0KKwlhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQgPSAwOworCWFkYXB0ZXItPmNtZHFfZnJlZS5oZWFkID0gTlVMTDsKKwlhZGFwdGVyLT5jbWRxX2ZyZWUudGFpbCA9IE5VTEw7CisJYWRhcHRlci0+Y21kcV9kb25lLmNvdW50ID0gMDsKKwlhZGFwdGVyLT5jbWRxX2RvbmUuaGVhZCA9IE5VTEw7CisJYWRhcHRlci0+Y21kcV9kb25lLnRhaWwgPSBOVUxMOworCWFkYXB0ZXItPmNtZHFfZnJlZS5oZWFkID0gYWRhcHRlci0+Y21kcV9hbGwuaGVhZDsKKwloY21kID0gYWRhcHRlci0+Y21kcV9hbGwuaGVhZDsKKwl3aGlsZSAoaGNtZCkgeworCQlhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQrKzsKKwkJaGNtZC0+bmV4dCA9IGhjbWQtPm5leHRfYWxsOworCQloY21kID0gaGNtZC0+bmV4dF9hbGw7CisJfQorCWlmIChhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQgIT0gYWRhcHRlci0+Y21kcV9hbGwuY291bnQpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkiZnJlZV9jb3VudCAlZCAhPSBhbGwgY291bnQgJWRcbiIsCisJCQlhZGFwdGVyLT5jbWRxX2ZyZWUuY291bnQsIGFkYXB0ZXItPmNtZHFfYWxsLmNvdW50KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kcV9kb25lLmxvY2subG9jaywKKwkJCQlhZGFwdGVyLT5jbWRxX2RvbmUubG9jay5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kcV9mcmVlLmxvY2subG9jaywKKwkJCQlhZGFwdGVyLT5jbWRxX2ZyZWUubG9jay5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfY21kcV9nZXRkb25lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzbGljX2NtZHF1ZXVlICpkb25lX2NtZHEgPSAmYWRhcHRlci0+Y21kcV9kb25lOworCXN0cnVjdCBzbGljX2NtZHF1ZXVlICpmcmVlX2NtZHEgPSAmYWRhcHRlci0+Y21kcV9mcmVlOworCisJQVNTRVJUKGZyZWVfY21kcS0+aGVhZCA9PSBOVUxMKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG9uZV9jbWRxLT5sb2NrLmxvY2ssIGRvbmVfY21kcS0+bG9jay5mbGFncyk7CisKKwlmcmVlX2NtZHEtPmhlYWQgPSBkb25lX2NtZHEtPmhlYWQ7CisJZnJlZV9jbWRxLT5jb3VudCA9IGRvbmVfY21kcS0+Y291bnQ7CisJZG9uZV9jbWRxLT5oZWFkID0gTlVMTDsKKwlkb25lX2NtZHEtPnRhaWwgPSBOVUxMOworCWRvbmVfY21kcS0+Y291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbmVfY21kcS0+bG9jay5sb2NrLCBkb25lX2NtZHEtPmxvY2suZmxhZ3MpOworfQorCiBzdGF0aWMgc3RydWN0IHNsaWNfaG9zdGNtZCAqc2xpY19jbWRxX2dldGZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IHNsaWNfY21kcXVldWUgKmNtZHEgPSAmYWRhcHRlci0+Y21kcV9mcmVlOwpAQCAtMzM1NywyMiArMTc2MCw2IEBACiAJcmV0dXJuIGNtZDsKIH0KIAotc3RhdGljIHZvaWQgc2xpY19jbWRxX2dldGRvbmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHNsaWNfY21kcXVldWUgKmRvbmVfY21kcSA9ICZhZGFwdGVyLT5jbWRxX2RvbmU7Ci0Jc3RydWN0IHNsaWNfY21kcXVldWUgKmZyZWVfY21kcSA9ICZhZGFwdGVyLT5jbWRxX2ZyZWU7Ci0KLQlBU1NFUlQoZnJlZV9jbWRxLT5oZWFkID09IE5VTEwpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkb25lX2NtZHEtPmxvY2subG9jaywgZG9uZV9jbWRxLT5sb2NrLmZsYWdzKTsKLQotCWZyZWVfY21kcS0+aGVhZCA9IGRvbmVfY21kcS0+aGVhZDsKLQlmcmVlX2NtZHEtPmNvdW50ID0gZG9uZV9jbWRxLT5jb3VudDsKLQlkb25lX2NtZHEtPmhlYWQgPSBOVUxMOwotCWRvbmVfY21kcS0+dGFpbCA9IE5VTEw7Ci0JZG9uZV9jbWRxLT5jb3VudCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9uZV9jbWRxLT5sb2NrLmxvY2ssIGRvbmVfY21kcS0+bG9jay5mbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfY21kcV9wdXRkb25lX2lycShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJCQlzdHJ1Y3Qgc2xpY19ob3N0Y21kICpjbWQpCiB7CkBAIC0zMzg4LDc5ICsxNzc1LDYgQEAKIAlzcGluX3VubG9jaygmY21kcS0+bG9jay5sb2NrKTsKIH0KIAotc3RhdGljIGludCBzbGljX3JjdnF1ZXVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGksIGNvdW50OwotCXN0cnVjdCBzbGljX3JjdnF1ZXVlICpyY3ZxID0gJmFkYXB0ZXItPnJjdnF1ZXVlOwotCi0JQVNTRVJUKGFkYXB0ZXItPnN0YXRlID09IEFEQVBUX0RPV04pOwotCXJjdnEtPnRhaWwgPSBOVUxMOwotCXJjdnEtPmhlYWQgPSBOVUxMOwotCXJjdnEtPnNpemUgPSBTTElDX1JDVlFfRU5UUklFUzsKLQlyY3ZxLT5lcnJvcnMgPSAwOwotCXJjdnEtPmNvdW50ID0gMDsKLQlpID0gKFNMSUNfUkNWUV9FTlRSSUVTIC8gU0xJQ19SQ1ZRX0ZJTExFTlRSSUVTKTsKLQljb3VudCA9IDA7Ci0Jd2hpbGUgKGkpIHsKLQkJY291bnQgKz0gc2xpY19yY3ZxdWV1ZV9maWxsKGFkYXB0ZXIpOwotCQlpLS07Ci0JfQotCWlmIChyY3ZxLT5jb3VudCA8IFNMSUNfUkNWUV9NSU5FTlRSSUVTKSB7Ci0JCXNsaWNfcmN2cXVldWVfZnJlZShhZGFwdGVyKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCX0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsaWNfcmN2cXVldWVfZnJlZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc2xpY19yY3ZxdWV1ZSAqcmN2cSA9ICZhZGFwdGVyLT5yY3ZxdWV1ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0Jd2hpbGUgKHJjdnEtPmhlYWQpIHsKLQkJc2tiID0gcmN2cS0+aGVhZDsKLQkJcmN2cS0+aGVhZCA9IHJjdnEtPmhlYWQtPm5leHQ7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl9Ci0JcmN2cS0+dGFpbCA9IE5VTEw7Ci0JcmN2cS0+aGVhZCA9IE5VTEw7Ci0JcmN2cS0+Y291bnQgPSAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNsaWNfcmN2cXVldWVfZ2V0bmV4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc2xpY19yY3ZxdWV1ZSAqcmN2cSA9ICZhZGFwdGVyLT5yY3ZxdWV1ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBzbGljX3JjdmJ1ZiAqcmN2YnVmOwotCWludCBjb3VudDsKLQotCWlmIChyY3ZxLT5jb3VudCkgewotCQlza2IgPSByY3ZxLT5oZWFkOwotCQlyY3ZidWYgPSAoc3RydWN0IHNsaWNfcmN2YnVmICopc2tiLT5oZWFkOwotCQlBU1NFUlQocmN2YnVmKTsKLQotCQlpZiAocmN2YnVmLT5zdGF0dXMgJiBJUkhERFJfU1ZBTElEKSB7Ci0JCQlyY3ZxLT5oZWFkID0gcmN2cS0+aGVhZC0+bmV4dDsKLQkJCXNrYi0+bmV4dCA9IE5VTEw7Ci0JCQlyY3ZxLT5jb3VudC0tOwotCQl9IGVsc2UgewotCQkJc2tiID0gTlVMTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAotCQkJIlJjdlEgRW1wdHkhISByY3ZxWyVwXSBjb3VudFsleF1cbiIsIHJjdnEsIHJjdnEtPmNvdW50KTsKLQkJc2tiID0gTlVMTDsKLQl9Ci0Jd2hpbGUgKHJjdnEtPmNvdW50IDwgU0xJQ19SQ1ZRX0ZJTExUSFJFU0gpIHsKLQkJY291bnQgPSBzbGljX3JjdnF1ZXVlX2ZpbGwoYWRhcHRlcik7Ci0JCWlmICghY291bnQpCi0JCQlicmVhazsKLQl9Ci0JaWYgKHNrYikKLQkJcmN2cS0+ZXJyb3JzID0gMDsKLQlyZXR1cm4gc2tiOwotfQotCiBzdGF0aWMgaW50IHNsaWNfcmN2cXVldWVfZmlsbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAl2b2lkICpwYWRkcjsKQEAgLTM1NDgsNiArMTg2Miw3OSBAQAogCXJldHVybiBpOwogfQogCitzdGF0aWMgdm9pZCBzbGljX3JjdnF1ZXVlX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHNsaWNfcmN2cXVldWUgKnJjdnEgPSAmYWRhcHRlci0+cmN2cXVldWU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlIChyY3ZxLT5oZWFkKSB7CisJCXNrYiA9IHJjdnEtPmhlYWQ7CisJCXJjdnEtPmhlYWQgPSByY3ZxLT5oZWFkLT5uZXh0OworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCXJjdnEtPnRhaWwgPSBOVUxMOworCXJjdnEtPmhlYWQgPSBOVUxMOworCXJjdnEtPmNvdW50ID0gMDsKK30KKworc3RhdGljIGludCBzbGljX3JjdnF1ZXVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGksIGNvdW50OworCXN0cnVjdCBzbGljX3JjdnF1ZXVlICpyY3ZxID0gJmFkYXB0ZXItPnJjdnF1ZXVlOworCisJQVNTRVJUKGFkYXB0ZXItPnN0YXRlID09IEFEQVBUX0RPV04pOworCXJjdnEtPnRhaWwgPSBOVUxMOworCXJjdnEtPmhlYWQgPSBOVUxMOworCXJjdnEtPnNpemUgPSBTTElDX1JDVlFfRU5UUklFUzsKKwlyY3ZxLT5lcnJvcnMgPSAwOworCXJjdnEtPmNvdW50ID0gMDsKKwlpID0gKFNMSUNfUkNWUV9FTlRSSUVTIC8gU0xJQ19SQ1ZRX0ZJTExFTlRSSUVTKTsKKwljb3VudCA9IDA7CisJd2hpbGUgKGkpIHsKKwkJY291bnQgKz0gc2xpY19yY3ZxdWV1ZV9maWxsKGFkYXB0ZXIpOworCQlpLS07CisJfQorCWlmIChyY3ZxLT5jb3VudCA8IFNMSUNfUkNWUV9NSU5FTlRSSUVTKSB7CisJCXNsaWNfcmN2cXVldWVfZnJlZShhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNsaWNfcmN2cXVldWVfZ2V0bmV4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2xpY19yY3ZxdWV1ZSAqcmN2cSA9ICZhZGFwdGVyLT5yY3ZxdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzbGljX3JjdmJ1ZiAqcmN2YnVmOworCWludCBjb3VudDsKKworCWlmIChyY3ZxLT5jb3VudCkgeworCQlza2IgPSByY3ZxLT5oZWFkOworCQlyY3ZidWYgPSAoc3RydWN0IHNsaWNfcmN2YnVmICopc2tiLT5oZWFkOworCQlBU1NFUlQocmN2YnVmKTsKKworCQlpZiAocmN2YnVmLT5zdGF0dXMgJiBJUkhERFJfU1ZBTElEKSB7CisJCQlyY3ZxLT5oZWFkID0gcmN2cS0+aGVhZC0+bmV4dDsKKwkJCXNrYi0+bmV4dCA9IE5VTEw7CisJCQlyY3ZxLT5jb3VudC0tOworCQl9IGVsc2UgeworCQkJc2tiID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkJIlJjdlEgRW1wdHkhISByY3ZxWyVwXSBjb3VudFsleF1cbiIsIHJjdnEsIHJjdnEtPmNvdW50KTsKKwkJc2tiID0gTlVMTDsKKwl9CisJd2hpbGUgKHJjdnEtPmNvdW50IDwgU0xJQ19SQ1ZRX0ZJTExUSFJFU0gpIHsKKwkJY291bnQgPSBzbGljX3JjdnF1ZXVlX2ZpbGwoYWRhcHRlcik7CisJCWlmICghY291bnQpCisJCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJcmN2cS0+ZXJyb3JzID0gMDsKKwlyZXR1cm4gc2tiOworfQorCiBzdGF0aWMgdTMyIHNsaWNfcmN2cXVldWVfcmVpbnNlcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNsaWNfcmN2cXVldWUgKnJjdnEgPSAmYWRhcHRlci0+cmN2cXVldWU7CkBAIC0zODEzLDExICsyMjAwLDEwIEBACiBzdGF0aWMgaW50IHNsaWNfZGVidWdfYWRhcHRlcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAKLQlpZiAoKGFkYXB0ZXItPm5ldGRldikgJiYgKGFkYXB0ZXItPm5ldGRldi0+bmFtZSkpIHsKLQkJc2VxX3ByaW50ZihzZXEsICJpbmZvOiBpbnRlcmZhY2UgICAgICAgICAgOiAlc1xuIiwKKwlzZXFfcHJpbnRmKHNlcSwgImluZm86IGludGVyZmFjZSAgICAgICAgICA6ICVzXG4iLAogCQkJICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7Ci0JfQogCXNlcV9wcmludGYoc2VxLCAiaW5mbzogc3RhdHVzICAgICAgICAgICAgIDogJXNcbiIsCiAJCVNMSUNfTElOS1NUQVRFKGFkYXB0ZXItPmxpbmtzdGF0ZSkpOwogCXNlcV9wcmludGYoc2VxLCAiaW5mbzogcG9ydCAgICAgICAgICAgICAgIDogJWRcbiIsCkBAIC0zODM1LDkgKzIyMjEsOSBAQAogCXNlcV9wcmludGYoc2VxLCAiaW5mbzogUmN2USBjdXJyZW50ICAgICAgIDogJTQuNFhcbiIsCiAJCSAgICBhZGFwdGVyLT5yY3ZxdWV1ZS5jb3VudCk7CiAJc2VxX3ByaW50ZihzZXEsICJyeCBzdGF0czogcGFja2V0cyAgICAgICAgICAgICAgICAgIDogJTguOGxYXG4iLAotCQkgICAgYWRhcHRlci0+c3RhdHMucnhfcGFja2V0cyk7CisJCSAgICBuZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMpOwogCXNlcV9wcmludGYoc2VxLCAicnggc3RhdHM6IGJ5dGVzICAgICAgICAgICAgICAgICAgICA6ICU4LjhsWFxuIiwKLQkJICAgIGFkYXB0ZXItPnN0YXRzLnJ4X2J5dGVzKTsKKwkJICAgIG5ldGRldi0+c3RhdHMucnhfYnl0ZXMpOwogCXNlcV9wcmludGYoc2VxLCAicnggc3RhdHM6IGJyb2FkY2FzdHMgICAgICAgICAgICAgICA6ICU4LjhYXG4iLAogCQkgICAgYWRhcHRlci0+cmN2X2Jyb2FkY2FzdHMpOwogCXNlcV9wcmludGYoc2VxLCAicnggc3RhdHM6IG11bHRpY2FzdHMgICAgICAgICAgICAgICA6ICU4LjhYXG4iLApAQCAtMzg1MSwxMyArMjIzNywxMyBAQAogCXNlcV9wcmludGYoc2VxLCAicnggc3RhdHM6IGRyb3BzICAgICAgICAgICAgICAgICAgICA6ICU4LjhYXG4iLAogCQkJKHUzMikgYWRhcHRlci0+cmN2X2Ryb3BzKTsKIAlzZXFfcHJpbnRmKHNlcSwgInR4IHN0YXRzOiBwYWNrZXRzICAgICAgICAgICAgICAgICAgOiAlOC44bFhcbiIsCi0JCQlhZGFwdGVyLT5zdGF0cy50eF9wYWNrZXRzKTsKKwkJCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cyk7CiAJc2VxX3ByaW50ZihzZXEsICJ0eCBzdGF0czogYnl0ZXMgICAgICAgICAgICAgICAgICAgIDogJTguOGxYXG4iLAotCQkJYWRhcHRlci0+c3RhdHMudHhfYnl0ZXMpOworCQkJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyk7CiAJc2VxX3ByaW50ZihzZXEsICJ0eCBzdGF0czogZXJyb3JzICAgICAgICAgICAgICAgICAgIDogJTguOFhcbiIsCiAJCQkodTMyKSBhZGFwdGVyLT5zbGljX3N0YXRzLmlmYWNlLnhtdF9lcnJvcnMpOwogCXNlcV9wcmludGYoc2VxLCAicnggc3RhdHM6IG11bHRpY2FzdHMgICAgICAgICAgICAgICA6ICU4LjhsWFxuIiwKLQkJCWFkYXB0ZXItPnN0YXRzLm11bHRpY2FzdCk7CisJCQluZXRkZXYtPnN0YXRzLm11bHRpY2FzdCk7CiAJc2VxX3ByaW50ZihzZXEsICJ0eCBzdGF0czogY29sbGlzaW9uIGVycm9ycyAgICAgICAgIDogJTguOFhcbiIsCiAJCQkodTMyKSBhZGFwdGVyLT5zbGljX3N0YXRzLmlmYWNlLnhtaXRfY29sbGlzaW9ucyk7CiAJc2VxX3ByaW50ZihzZXEsICJwZXJmOiBNYXggcmN2IGZyYW1lcy9pc3IgICAgICAgICAgIDogJTguOFhcbiIsCkBAIC00MDM5LDkgKzI0MjUsMTU1NSBAQAogCX0KIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqICAgTU9EVUxFIElOSVRJQVRJT04gLyBURVJNSU5BVElPTiBGVU5DVElPTlMgICAqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNsaWNfbGlua19ldmVudF9oYW5kbGVyIC0KKyAqCisgKiBJbml0aWF0ZSBhIGxpbmsgY29uZmlndXJhdGlvbiBzZXF1ZW5jZS4gIFRoZSBsaW5rIGNvbmZpZ3VyYXRpb24gYmVnaW5zCisgKiBieSBpc3N1aW5nIGEgUkVBRF9MSU5LX1NUQVRVUyBjb21tYW5kIHRvIHRoZSBVdGlsaXR5IFByb2Nlc3NvciBvbiB0aGUKKyAqIFNMSUMuICBTaW5jZSB0aGUgY29tbWFuZCBmaW5pc2hlcyBhc3luY2hyb25vdXNseSwgdGhlIHNsaWNfdXByX2NvbWxldGUKKyAqIHJvdXRpbmUgd2lsbCBmb2xsb3cgaXQgdXAgd2l0aGEgVVAgY29uZmlndXJhdGlvbiB3cml0ZSBjb21tYW5kLCB3aGljaAorICogd2lsbCBhbHNvIGNvbXBsZXRlIGFzeW5jaHJvbm91c2x5LgorICoKKyAqLworc3RhdGljIHZvaWQgc2xpY19saW5rX2V2ZW50X2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCisJaWYgKGFkYXB0ZXItPnN0YXRlICE9IEFEQVBUX1VQKSB7CisJCS8qIEFkYXB0ZXIgaXMgbm90IG9wZXJhdGlvbmFsLiAgSWdub3JlLiAgKi8KKwkJcmV0dXJuOworCX0KKworCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKWFkYXB0ZXItPnBoeXNfc2htZW07CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisJc3RhdHVzID0gc2xpY191cHJfcmVxdWVzdChhZGFwdGVyLAorCQkJCSAgU0xJQ19VUFJfUkxTUiwKKwkJCQkgIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmxpbmtzdGF0dXMpLAorCQkJCSAgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmxpbmtzdGF0dXMpLAorCQkJCSAgMCwgMCk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19YODYpCisJc3RhdHVzID0gc2xpY191cHJfcmVxdWVzdChhZGFwdGVyLCBTTElDX1VQUl9STFNSLAorCQkodTMyKSAmcHNobWVtLT5saW5rc3RhdHVzLAkvKiBubyA0R0Igd3JhcCBndWFyYW50ZWVkICovCisJCQkJICAwLCAwLCAwKTsKKyNlbHNlCisJU3RvcCBjb21waWxhdGlvbjsKKyNlbmRpZgorCUFTU0VSVChzdGF0dXMgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfaW5pdF9jbGVhbnVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5pbnRycmVnaXN0ZXJlZCkgeworCQlhZGFwdGVyLT5pbnRycmVnaXN0ZXJlZCA9IDA7CisJCWZyZWVfaXJxKGFkYXB0ZXItPm5ldGRldi0+aXJxLCBhZGFwdGVyLT5uZXRkZXYpOworCisJfQorCWlmIChhZGFwdGVyLT5wc2htZW0pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCisJCQkJICAgIGFkYXB0ZXItPnBzaG1lbSwgYWRhcHRlci0+cGh5c19zaG1lbSk7CisJCWFkYXB0ZXItPnBzaG1lbSA9IE5VTEw7CisJCWFkYXB0ZXItPnBoeXNfc2htZW0gPSAoZG1hX2FkZHJfdCkgTlVMTDsKKwl9CisKKwlpZiAoYWRhcHRlci0+cGluZ3RpbWVyc2V0KSB7CisJCWFkYXB0ZXItPnBpbmd0aW1lcnNldCA9IDA7CisJCWRlbF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyKTsKKwl9CisKKwlzbGljX3JzcHF1ZXVlX2ZyZWUoYWRhcHRlcik7CisJc2xpY19jbWRxX2ZyZWUoYWRhcHRlcik7CisJc2xpY19yY3ZxdWV1ZV9mcmVlKGFkYXB0ZXIpOworfQorCisvKgorICogIEFsbG9jYXRlIGEgbWNhc3RfYWRkcmVzcyBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgbXVsdGljYXN0IGFkZHJlc3MuCisgKiAgTGluayBpdCBpbi4KKyAqLworc3RhdGljIGludCBzbGljX21jYXN0X2FkZF9saXN0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjaGFyICphZGRyZXNzKQoreworCXN0cnVjdCBtY2FzdF9hZGRyZXNzICptY2FkZHIsICptbGlzdDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyAqLworCW1saXN0ID0gYWRhcHRlci0+bWNhc3RhZGRyczsKKwl3aGlsZSAobWxpc3QpIHsKKwkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIobWxpc3QtPmFkZHJlc3MsIGFkZHJlc3MpKQorCQkJcmV0dXJuIDA7CisJCW1saXN0ID0gbWxpc3QtPm5leHQ7CisJfQorCisJLyogRG9lc24ndCBhbHJlYWR5IGV4aXN0LiAgQWxsb2NhdGUgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBpdCAqLworCW1jYWRkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FzdF9hZGRyZXNzKSwgR0ZQX0FUT01JQyk7CisJaWYgKG1jYWRkciA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCW1lbWNweShtY2FkZHItPmFkZHJlc3MsIGFkZHJlc3MsIDYpOworCisJbWNhZGRyLT5uZXh0ID0gYWRhcHRlci0+bWNhc3RhZGRyczsKKwlhZGFwdGVyLT5tY2FzdGFkZHJzID0gbWNhZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfbWNhc3Rfc2V0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHN0YXR1cyA9IDA7CisJY2hhciAqYWRkcmVzc2VzOworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisKKwlBU1NFUlQoYWRhcHRlcik7CisKKwluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisJCWFkZHJlc3NlcyA9IChjaGFyICopICZoYS0+YWRkcjsKKwkJc3RhdHVzID0gc2xpY19tY2FzdF9hZGRfbGlzdChhZGFwdGVyLCBhZGRyZXNzZXMpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQlicmVhazsKKwkJc2xpY19tY2FzdF9zZXRfYml0KGFkYXB0ZXIsIGFkZHJlc3Nlcyk7CisJfQorCisJaWYgKGFkYXB0ZXItPmRldmZsYWdzX3ByZXYgIT0gZGV2LT5mbGFncykgeworCQlhZGFwdGVyLT5tYWNvcHRzID0gTUFDX0RJUkVDVEVEOworCQlpZiAoZGV2LT5mbGFncykgeworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKQorCQkJCWFkYXB0ZXItPm1hY29wdHMgfD0gTUFDX0JDQVNUOworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJCQlhZGFwdGVyLT5tYWNvcHRzIHw9IE1BQ19QUk9NSVNDOworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCQkJYWRhcHRlci0+bWFjb3B0cyB8PSBNQUNfQUxMTUNBU1Q7CisJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpCisJCQkJYWRhcHRlci0+bWFjb3B0cyB8PSBNQUNfTUNBU1Q7CisJCX0KKwkJYWRhcHRlci0+ZGV2ZmxhZ3NfcHJldiA9IGRldi0+ZmxhZ3M7CisJCXNsaWNfY29uZmlnX3NldChhZGFwdGVyLCB0cnVlKTsKKwl9IGVsc2UgeworCQlpZiAoc3RhdHVzID09IDApCisJCQlzbGljX21jYXN0X3NldF9tYXNrKGFkYXB0ZXIpOworCX0KKwlyZXR1cm47Cit9CisKKyNkZWZpbmUgIFhNSVRfRkFJTF9MSU5LX1NUQVRFICAgICAgICAgICAgICAgMQorI2RlZmluZSAgWE1JVF9GQUlMX1pFUk9fTEVOR1RIICAgICAgICAgICAgICAyCisjZGVmaW5lICBYTUlUX0ZBSUxfSE9TVENNRF9GQUlMICAgICAgICAgICAgIDMKKworc3RhdGljIHZvaWQgc2xpY194bWl0X2J1aWxkX3JlcXVlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIHN0cnVjdCBzbGljX2hvc3RjbWQgKmhjbWQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNsaWNfaG9zdDY0X2NtZCAqaWhjbWQ7CisJdWxvbmcgcGh5c19hZGRyOworCisJaWhjbWQgPSAmaGNtZC0+Y21kNjQ7CisKKwlpaGNtZC0+ZmxhZ3MgPSAoYWRhcHRlci0+cG9ydCA8PCBJSEZMR19JRlNIRlQpOworCWloY21kLT5jb21tYW5kID0gSUhDTURfWE1UX1JFUTsKKwlpaGNtZC0+dS5zbGljX2J1ZmZlcnMudG90bGVuID0gc2tiLT5sZW47CisJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGNpZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJUENJX0RNQV9UT0RFVklDRSk7CisJaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMF0ucGFkZHJsID0gU0xJQ19HRVRfQUREUl9MT1cocGh5c19hZGRyKTsKKwlpaGNtZC0+dS5zbGljX2J1ZmZlcnMuYnVmc1swXS5wYWRkcmggPSBTTElDX0dFVF9BRERSX0hJR0gocGh5c19hZGRyKTsKKwlpaGNtZC0+dS5zbGljX2J1ZmZlcnMuYnVmc1swXS5sZW5ndGggPSBza2ItPmxlbjsKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisJaGNtZC0+Y21kc2l6ZSA9ICh1MzIpICgoKCh1NjQpJmloY21kLT51LnNsaWNfYnVmZmVycy5idWZzWzFdIC0KKwkJCQkgICAgICh1NjQpIGhjbWQpICsgMzEpID4+IDUpOworI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQorCWhjbWQtPmNtZHNpemUgPSAoKCgodTMyKSAmaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMV0gLQorCQkJICAgKHUzMikgaGNtZCkgKyAzMSkgPj4gNSk7CisjZWxzZQorCVN0b3AgQ29tcGlsYXRpb247CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc2xpY194bWl0X2ZhaWwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgdm9pZCAqY21kLCB1MzIgc2tidHlwZSwgdTMyIHN0YXR1cykKK3sKKwlpZiAoYWRhcHRlci0+eG1pdHFfZnVsbCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOworCWlmICgoY21kID09IE5VTEwpICYmIChzdGF0dXMgPD0gWE1JVF9GQUlMX0hPU1RDTURfRkFJTCkpIHsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBYTUlUX0ZBSUxfTElOS19TVEFURToKKwkJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkJCSJyZWplY3QgeG1pdCBza2JbJXA6ICV4XSBsaW5rc3RhdGVbJXNdICIKKwkJCQkiYWRhcHRlclslczolZF0gY2FyZFslczolZF1cbiIsCisJCQkJc2tiLCBza2ItPnBrdF90eXBlLAorCQkJCVNMSUNfTElOS1NUQVRFKGFkYXB0ZXItPmxpbmtzdGF0ZSksCisJCQkJU0xJQ19BREFQVEVSX1NUQVRFKGFkYXB0ZXItPnN0YXRlKSwKKwkJCQlhZGFwdGVyLT5zdGF0ZSwKKwkJCQlTTElDX0NBUkRfU1RBVEUoYWRhcHRlci0+Y2FyZC0+c3RhdGUpLAorCQkJCWFkYXB0ZXItPmNhcmQtPnN0YXRlKTsKKwkJCWJyZWFrOworCQljYXNlIFhNSVRfRkFJTF9aRVJPX0xFTkdUSDoKKwkJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkJCSJ4bWl0X3N0YXJ0IHNrYi0+bGVuID09IDAgc2tiWyVwXSB0eXBlWyV4XVxuIiwKKwkJCQlza2IsIHNrYi0+cGt0X3R5cGUpOworCQkJYnJlYWs7CisJCWNhc2UgWE1JVF9GQUlMX0hPU1RDTURfRkFJTDoKKwkJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkJCSJ4bWl0X3N0YXJ0IHNrYlslcF0gdHlwZVsleF0gTm8gaG9zdCBjb21tYW5kcyAiCisJCQkJImF2YWlsYWJsZVxuIiwgc2tiLCBza2ItPnBrdF90eXBlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCQl9CisJfQorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlhZGFwdGVyLT5uZXRkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKK30KKworc3RhdGljIHZvaWQgc2xpY19yY3ZfaGFuZGxlX2Vycm9yKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3Qgc2xpY19yY3ZidWYgKnJjdmJ1ZikKK3sKKwlzdHJ1Y3Qgc2xpY19oZGRyX3dkcyAqaGRyID0gKHN0cnVjdCBzbGljX2hkZHJfd2RzICopcmN2YnVmLT5kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwlpZiAoYWRhcHRlci0+ZGV2aWQgIT0gU0xJQ18xR0JfREVWSUNFX0lEKSB7CisJCWlmIChoZHItPmZyYW1lX3N0YXR1czE0ICYgVlJIU1RBVF84MDJPRSkKKwkJCWFkYXB0ZXItPmlmX2V2ZW50cy5vZmxvdzgwMisrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXMxNCAmIFZSSFNUQVRfVFBPRkxPKQorCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwcnRvZmxvdysrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfODAyVUUpCisJCQlhZGFwdGVyLT5pZl9ldmVudHMudWZsb3c4MDIrKzsKKwkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX1JDVkUpIHsKKwkJCWFkYXB0ZXItPmlmX2V2ZW50cy5yY3ZlYXJseSsrOworCQkJbmV0ZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9CisJCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9CVUZGKSB7CisJCQlhZGFwdGVyLT5pZl9ldmVudHMuQnVmb3YrKzsKKwkJCW5ldGRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJfQorCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfQ0FSUkUpIHsKKwkJCWFkYXB0ZXItPmlmX2V2ZW50cy5DYXJyZSsrOworCQkJbmV0ZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9MT05HRSkKKwkJCWFkYXB0ZXItPmlmX2V2ZW50cy5Mb25nZSsrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfUFJFQSkKKwkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JbnZwKys7CisJCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9DUkMpIHsKKwkJCWFkYXB0ZXItPmlmX2V2ZW50cy5DcmMrKzsKKwkJCW5ldGRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQl9CisJCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9EUkJMKQorCQkJYWRhcHRlci0+aWZfZXZlbnRzLkRyYmwrKzsKKwkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzX2IxNCAmIFZSSFNUQVRCX0NPREUpCisJCQlhZGFwdGVyLT5pZl9ldmVudHMuQ29kZSsrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfVFBDU1VNKQorCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwQ3N1bSsrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfVFBITEVOKQorCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwSGxlbisrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfSVBDU1VNKQorCQkJYWRhcHRlci0+aWZfZXZlbnRzLklwQ3N1bSsrOworCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNfYjE0ICYgVlJIU1RBVEJfSVBMRVJSKQorCQkJYWRhcHRlci0+aWZfZXZlbnRzLklwTGVuKys7CisJCWlmIChoZHItPmZyYW1lX3N0YXR1c19iMTQgJiBWUkhTVEFUQl9JUEhFUlIpCisJCQlhZGFwdGVyLT5pZl9ldmVudHMuSXBIbGVuKys7CisJfSBlbHNlIHsKKwkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzR0IgJiBWR0JTVEFUX1hQRVJSKSB7CisJCQl1MzIgeGVyciA9IGhkci0+ZnJhbWVfc3RhdHVzR0IgPj4gVkdCU1RBVF9YRVJSU0hGVDsKKworCQkJaWYgKHhlcnIgPT0gVkdCU1RBVF9YQ1NFUlIpCisJCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwQ3N1bSsrOworCQkJaWYgKHhlcnIgPT0gVkdCU1RBVF9YVUZMT1cpCisJCQkJYWRhcHRlci0+aWZfZXZlbnRzLlRwcnRvZmxvdysrOworCQkJaWYgKHhlcnIgPT0gVkdCU1RBVF9YSExFTikKKwkJCQlhZGFwdGVyLT5pZl9ldmVudHMuVHBIbGVuKys7CisJCX0KKwkJaWYgKGhkci0+ZnJhbWVfc3RhdHVzR0IgJiBWR0JTVEFUX05FVEVSUikgeworCQkJdTMyIG5lcnIgPQorCQkJICAgIChoZHItPgorCQkJICAgICBmcmFtZV9zdGF0dXNHQiA+PiBWR0JTVEFUX05FUlJTSEZUKSAmCisJCQkgICAgVkdCU1RBVF9ORVJSTVNLOworCQkJaWYgKG5lcnIgPT0gVkdCU1RBVF9OQ1NFUlIpCisJCQkJYWRhcHRlci0+aWZfZXZlbnRzLklwQ3N1bSsrOworCQkJaWYgKG5lcnIgPT0gVkdCU1RBVF9OVUZMT1cpCisJCQkJYWRhcHRlci0+aWZfZXZlbnRzLklwTGVuKys7CisJCQlpZiAobmVyciA9PSBWR0JTVEFUX05ITEVOKQorCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5JcEhsZW4rKzsKKwkJfQorCQlpZiAoaGRyLT5mcmFtZV9zdGF0dXNHQiAmIFZHQlNUQVRfTE5LRVJSKSB7CisJCQl1MzIgbGVyciA9IGhkci0+ZnJhbWVfc3RhdHVzR0IgJiBWR0JTVEFUX0xFUlJNU0s7CisKKwkJCWlmIChsZXJyID09IFZHQlNUQVRfTERFQVJMWSkKKwkJCQlhZGFwdGVyLT5pZl9ldmVudHMucmN2ZWFybHkrKzsKKwkJCWlmIChsZXJyID09IFZHQlNUQVRfTEJPRkxPKQorCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5CdWZvdisrOworCQkJaWYgKGxlcnIgPT0gVkdCU1RBVF9MQ09ERVJSKQorCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5Db2RlKys7CisJCQlpZiAobGVyciA9PSBWR0JTVEFUX0xEQkxOQkwpCisJCQkJYWRhcHRlci0+aWZfZXZlbnRzLkRyYmwrKzsKKwkJCWlmIChsZXJyID09IFZHQlNUQVRfTENSQ0VSUikKKwkJCQlhZGFwdGVyLT5pZl9ldmVudHMuQ3JjKys7CisJCQlpZiAobGVyciA9PSBWR0JTVEFUX0xPRkxPKQorCQkJCWFkYXB0ZXItPmlmX2V2ZW50cy5vZmxvdzgwMisrOworCQkJaWYgKGxlcnIgPT0gVkdCU1RBVF9MVUZMTykKKwkJCQlhZGFwdGVyLT5pZl9ldmVudHMudWZsb3c4MDIrKzsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKyNkZWZpbmUgVENQX09GRkxPQURfRlJBTUVfUFVTSEZMQUcgIDB4MTAwMDAwMDAKKyNkZWZpbmUgTV9GQVNUX1BBVEggICAgICAgICAgICAgICAgIDB4MDA0MAorCitzdGF0aWMgdm9pZCBzbGljX3Jjdl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2xpY19yY3ZidWYgKnJjdmJ1ZjsKKwl1MzIgZnJhbWVzID0gMDsKKworCXdoaWxlICgoc2tiID0gc2xpY19yY3ZxdWV1ZV9nZXRuZXh0KGFkYXB0ZXIpKSkgeworCQl1MzIgcnhfYnl0ZXM7CisKKwkJQVNTRVJUKHNrYi0+aGVhZCk7CisJCXJjdmJ1ZiA9IChzdHJ1Y3Qgc2xpY19yY3ZidWYgKilza2ItPmhlYWQ7CisJCWFkYXB0ZXItPmNhcmQtPmV2ZW50cysrOworCQlpZiAocmN2YnVmLT5zdGF0dXMgJiBJUkhERFJfRVJSKSB7CisJCQlhZGFwdGVyLT5yeF9lcnJvcnMrKzsKKwkJCXNsaWNfcmN2X2hhbmRsZV9lcnJvcihhZGFwdGVyLCByY3ZidWYpOworCQkJc2xpY19yY3ZxdWV1ZV9yZWluc2VydChhZGFwdGVyLCBza2IpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXNsaWNfbWFjX2ZpbHRlcihhZGFwdGVyLCAoc3RydWN0IGV0aGVyX2hlYWRlciAqKQorCQkJCQlyY3ZidWYtPmRhdGEpKSB7CisJCQlzbGljX3JjdnF1ZXVlX3JlaW5zZXJ0KGFkYXB0ZXIsIHNrYik7CisJCQljb250aW51ZTsKKwkJfQorCQlza2JfcHVsbChza2IsIFNMSUNfUkNWQlVGX0hFQURTSVpFKTsKKwkJcnhfYnl0ZXMgPSAocmN2YnVmLT5sZW5ndGggJiBJUkhERFJfRkxFTl9NU0spOworCQlza2JfcHV0KHNrYiwgcnhfYnl0ZXMpOworCQluZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByeF9ieXRlczsKKyNpZiBTTElDX09GRkxPQURfSVBfQ0hFQ0tTVU0KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKyNlbmRpZgorCisJCXNrYi0+ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisJCW5ldGlmX3J4KHNrYik7CisKKwkJKytmcmFtZXM7CisjaWYgU0xJQ19JTlRFUlJVUFRfUFJPQ0VTU19MSU1JVAorCQlpZiAoZnJhbWVzID49IFNMSUNfUkNWUV9NQVhfUFJPQ0VTU19JU1IpIHsKKwkJCWFkYXB0ZXItPnJjdl9pbnRlcnJ1cHRfeWllbGRzKys7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJfQorCWFkYXB0ZXItPm1heF9pc3JfcmN2cyA9IG1heChhZGFwdGVyLT5tYXhfaXNyX3JjdnMsIGZyYW1lcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfeG1pdF9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc2xpY19ob3N0Y21kICpoY21kOworCXN0cnVjdCBzbGljX3JzcGJ1ZiAqcnNwYnVmOworCXUzMiBmcmFtZXMgPSAwOworCXN0cnVjdCBzbGljX2hhbmRsZV93b3JkIHNsaWNfaGFuZGxlX3dvcmQ7CisKKwlkbyB7CisJCXJzcGJ1ZiA9IHNsaWNfcnNwcXVldWVfZ2V0bmV4dChhZGFwdGVyKTsKKwkJaWYgKCFyc3BidWYpCisJCQlicmVhazsKKwkJYWRhcHRlci0+eG1pdF9jb21wbGV0ZXMrKzsKKwkJYWRhcHRlci0+Y2FyZC0+ZXZlbnRzKys7CisJCS8qCisJCSBHZXQgdGhlIGNvbXBsZXRlIGhvc3QgY29tbWFuZCBidWZmZXIKKwkJKi8KKwkJc2xpY19oYW5kbGVfd29yZC5oYW5kbGVfdG9rZW4gPSByc3BidWYtPmhvc3RoYW5kbGU7CisJCUFTU0VSVChzbGljX2hhbmRsZV93b3JkLmhhbmRsZV9pbmRleCk7CisJCUFTU0VSVChzbGljX2hhbmRsZV93b3JkLmhhbmRsZV9pbmRleCA8PSBTTElDX0NNRFFfTUFYQ01EUyk7CisJCWhjbWQgPQorCQkgICAgKHN0cnVjdCBzbGljX2hvc3RjbWQgKikKKwkJCWFkYXB0ZXItPnNsaWNfaGFuZGxlc1tzbGljX2hhbmRsZV93b3JkLmhhbmRsZV9pbmRleF0uCisJCQkJCQkJCQlhZGRyZXNzOworLyogICAgICBoY21kID0gKHN0cnVjdCBzbGljX2hvc3RjbWQgKikgcnNwYnVmLT5ob3N0aGFuZGxlOyAqLworCQlBU1NFUlQoaGNtZCk7CisJCUFTU0VSVChoY21kLT5wc2xpY19oYW5kbGUgPT0KKwkJICAgICAgICZhZGFwdGVyLT5zbGljX2hhbmRsZXNbc2xpY19oYW5kbGVfd29yZC5oYW5kbGVfaW5kZXhdKTsKKwkJaWYgKGhjbWQtPnR5cGUgPT0gU0xJQ19DTURfRFVNQikgeworCQkJaWYgKGhjbWQtPnNrYikKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShoY21kLT5za2IpOworCQkJc2xpY19jbWRxX3B1dGRvbmVfaXJxKGFkYXB0ZXIsIGhjbWQpOworCQl9CisJCXJzcGJ1Zi0+c3RhdHVzID0gMDsKKwkJcnNwYnVmLT5ob3N0aGFuZGxlID0gMDsKKwkJZnJhbWVzKys7CisJfSB3aGlsZSAoMSk7CisJYWRhcHRlci0+bWF4X2lzcl94bWl0cyA9IG1heChhZGFwdGVyLT5tYXhfaXNyX3htaXRzLCBmcmFtZXMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2xpY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBpc3I7CisKKwlpZiAoKGFkYXB0ZXItPnBzaG1lbSkgJiYgKGFkYXB0ZXItPnBzaG1lbS0+aXNyKSkgeworCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfaWNyLAorCQkJCSBJQ1JfSU5UX01BU0ssIEZMVVNIKTsKKwkJaXNyID0gYWRhcHRlci0+aXNyY29weSA9IGFkYXB0ZXItPnBzaG1lbS0+aXNyOworCQlhZGFwdGVyLT5wc2htZW0tPmlzciA9IDA7CisJCWFkYXB0ZXItPm51bV9pc3JzKys7CisJCXN3aXRjaCAoYWRhcHRlci0+Y2FyZC0+c3RhdGUpIHsKKwkJY2FzZSBDQVJEX1VQOgorCQkJaWYgKGlzciAmIH5JU1JfSU8pIHsKKwkJCQlpZiAoaXNyICYgSVNSX0VSUikgeworCQkJCQlhZGFwdGVyLT5lcnJvcl9pbnRlcnJ1cHRzKys7CisJCQkJCWlmIChpc3IgJiBJU1JfUk1JU1MpIHsKKwkJCQkJCWludCBjb3VudDsKKwkJCQkJCWludCBwcmVfY291bnQ7CisJCQkJCQlpbnQgZXJyb3JzOworCisJCQkJCQlzdHJ1Y3Qgc2xpY19yY3ZxdWV1ZSAqcmN2cSA9CisJCQkJCQkgICAgJmFkYXB0ZXItPnJjdnF1ZXVlOworCisJCQkJCQlhZGFwdGVyLT4KKwkJCQkJCSAgICBlcnJvcl9ybWlzc19pbnRlcnJ1cHRzKys7CisJCQkJCQlpZiAoIXJjdnEtPmVycm9ycykKKwkJCQkJCQlyY3ZfY291bnQgPSByY3ZxLT5jb3VudDsKKwkJCQkJCXByZV9jb3VudCA9IHJjdnEtPmNvdW50OworCQkJCQkJZXJyb3JzID0gcmN2cS0+ZXJyb3JzOworCisJCQkJCQl3aGlsZSAocmN2cS0+Y291bnQgPAorCQkJCQkJICAgICAgIFNMSUNfUkNWUV9GSUxMVEhSRVNIKSB7CisJCQkJCQkJY291bnQgPQorCQkJCQkJCSAgICBzbGljX3JjdnF1ZXVlX2ZpbGwKKwkJCQkJCQkgICAgKGFkYXB0ZXIpOworCQkJCQkJCWlmICghY291bnQpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKGlzciAmIElTUl9YRFJPUCkgeworCQkJCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJCQkJImlzciAmIElTUl9FUlIgWyV4XSAiCisJCQkJCQkJIklTUl9YRFJPUCBcbiIsIGlzcik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkJCQkiaXNyICYgSVNSX0VSUiBbJXhdXG4iLAorCQkJCQkJCWlzcik7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoaXNyICYgSVNSX0xFVkVOVCkgeworCQkJCQlhZGFwdGVyLT5saW5rZXZlbnRfaW50ZXJydXB0cysrOworCQkJCQlzbGljX2xpbmtfZXZlbnRfaGFuZGxlcihhZGFwdGVyKTsKKwkJCQl9CisKKwkJCQlpZiAoKGlzciAmIElTUl9VUEMpIHx8CisJCQkJICAgIChpc3IgJiBJU1JfVVBDRVJSKSB8fCAoaXNyICYgSVNSX1VQQ0JTWSkpIHsKKwkJCQkJYWRhcHRlci0+dXByX2ludGVycnVwdHMrKzsKKwkJCQkJc2xpY191cHJfcmVxdWVzdF9jb21wbGV0ZShhZGFwdGVyLCBpc3IpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGlzciAmIElTUl9SQ1YpIHsKKwkJCQlhZGFwdGVyLT5yY3ZfaW50ZXJydXB0cysrOworCQkJCXNsaWNfcmN2X2hhbmRsZXIoYWRhcHRlcik7CisJCQl9CisKKwkJCWlmIChpc3IgJiBJU1JfQ01EKSB7CisJCQkJYWRhcHRlci0+eG1pdF9pbnRlcnJ1cHRzKys7CisJCQkJc2xpY194bWl0X2NvbXBsZXRlKGFkYXB0ZXIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDQVJEX0RPV046CisJCQlpZiAoKGlzciAmIElTUl9VUEMpIHx8CisJCQkgICAgKGlzciAmIElTUl9VUENFUlIpIHx8IChpc3IgJiBJU1JfVVBDQlNZKSkgeworCQkJCWFkYXB0ZXItPnVwcl9pbnRlcnJ1cHRzKys7CisJCQkJc2xpY191cHJfcmVxdWVzdF9jb21wbGV0ZShhZGFwdGVyLCBpc3IpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJYWRhcHRlci0+aXNyY29weSA9IDA7CisJCWFkYXB0ZXItPmFsbF9yZWdfd3JpdGVzICs9IDI7CisJCWFkYXB0ZXItPmlzcl9yZWdfd3JpdGVzKys7CisJCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19pc3IsIDAsIEZMVVNIKTsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5mYWxzZV9pbnRlcnJ1cHRzKys7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2RlZmluZSBOT1JNQUxfRVRIRlJBTUUgICAgIDAKKworc3RhdGljIG5ldGRldl90eF90IHNsaWNfeG1pdF9zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGljY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNsaWNfaG9zdGNtZCAqaGNtZCA9IE5VTEw7CisJdTMyIHN0YXR1cyA9IDA7CisJdTMyIHNrYnR5cGUgPSBOT1JNQUxfRVRIRlJBTUU7CisJdm9pZCAqb2ZmbG9hZGNtZCA9IE5VTEw7CisKKwljYXJkID0gYWRhcHRlci0+Y2FyZDsKKwlBU1NFUlQoY2FyZCk7CisJaWYgKChhZGFwdGVyLT5saW5rc3RhdGUgIT0gTElOS19VUCkgfHwKKwkgICAgKGFkYXB0ZXItPnN0YXRlICE9IEFEQVBUX1VQKSB8fCAoY2FyZC0+c3RhdGUgIT0gQ0FSRF9VUCkpIHsKKwkJc3RhdHVzID0gWE1JVF9GQUlMX0xJTktfU1RBVEU7CisJCWdvdG8geG1pdF9mYWlsOworCisJfSBlbHNlIGlmIChza2ItPmxlbiA9PSAwKSB7CisJCXN0YXR1cyA9IFhNSVRfRkFJTF9aRVJPX0xFTkdUSDsKKwkJZ290byB4bWl0X2ZhaWw7CisJfQorCisJaWYgKHNrYnR5cGUgPT0gTk9STUFMX0VUSEZSQU1FKSB7CisJCWhjbWQgPSBzbGljX2NtZHFfZ2V0ZnJlZShhZGFwdGVyKTsKKwkJaWYgKCFoY21kKSB7CisJCQlhZGFwdGVyLT54bWl0cV9mdWxsID0gMTsKKwkJCXN0YXR1cyA9IFhNSVRfRkFJTF9IT1NUQ01EX0ZBSUw7CisJCQlnb3RvIHhtaXRfZmFpbDsKKwkJfQorCQlBU1NFUlQoaGNtZC0+cHNsaWNfaGFuZGxlKTsKKwkJQVNTRVJUKGhjbWQtPmNtZDY0Lmhvc3RoYW5kbGUgPT0KKwkJICAgICAgIGhjbWQtPnBzbGljX2hhbmRsZS0+dG9rZW4uaGFuZGxlX3Rva2VuKTsKKwkJaGNtZC0+c2tiID0gc2tiOworCQloY21kLT5idXN5ID0gMTsKKwkJaGNtZC0+dHlwZSA9IFNMSUNfQ01EX0RVTUI7CisJCWlmIChza2J0eXBlID09IE5PUk1BTF9FVEhGUkFNRSkKKwkJCXNsaWNfeG1pdF9idWlsZF9yZXF1ZXN0KGFkYXB0ZXIsIGhjbWQsIHNrYik7CisJfQorCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyNpZmRlZiBERUJVR19EVU1QCisJaWYgKGFkYXB0ZXItPmtpbGxfY2FyZCkgeworCQlzdHJ1Y3Qgc2xpY19ob3N0NjRfY21kIGloY21kOworCisJCWloY21kID0gJmhjbWQtPmNtZDY0OworCisJCWloY21kLT5mbGFncyB8PSAweDQwOworCQlhZGFwdGVyLT5raWxsX2NhcmQgPSAwOwkvKiBvbmx5IGRvIHRoaXMgb25jZSAqLworCX0KKyNlbmRpZgorCWlmIChoY21kLT5wYWRkcmggPT0gMCkgeworCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfY2JhciwKKwkJCQkgKGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUpLCBET05UX0ZMVVNIKTsKKwl9IGVsc2UgeworCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfY2JhcjY0LAorCQkJCSAoaGNtZC0+cGFkZHJsIHwgaGNtZC0+Y21kc2l6ZSksCisJCQkJICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKKwkJCQkgaGNtZC0+cGFkZHJoLCBET05UX0ZMVVNIKTsKKwl9Cit4bWl0X2RvbmU6CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK3htaXRfZmFpbDoKKwlzbGljX3htaXRfZmFpbChhZGFwdGVyLCBza2IsIG9mZmxvYWRjbWQsIHNrYnR5cGUsIHN0YXR1cyk7CisJZ290byB4bWl0X2RvbmU7Cit9CisKKworc3RhdGljIHZvaWQgc2xpY19hZGFwdGVyX2ZyZWVyZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc2xpY19pbml0X2NsZWFudXAoYWRhcHRlcik7CisJYWRhcHRlci0+ZXJyb3JfaW50ZXJydXB0cyA9IDA7CisJYWRhcHRlci0+cmN2X2ludGVycnVwdHMgPSAwOworCWFkYXB0ZXItPnhtaXRfaW50ZXJydXB0cyA9IDA7CisJYWRhcHRlci0+bGlua2V2ZW50X2ludGVycnVwdHMgPSAwOworCWFkYXB0ZXItPnVwcl9pbnRlcnJ1cHRzID0gMDsKKwlhZGFwdGVyLT5udW1faXNycyA9IDA7CisJYWRhcHRlci0+eG1pdF9jb21wbGV0ZXMgPSAwOworCWFkYXB0ZXItPnJjdl9icm9hZGNhc3RzID0gMDsKKwlhZGFwdGVyLT5yY3ZfbXVsdGljYXN0cyA9IDA7CisJYWRhcHRlci0+cmN2X3VuaWNhc3RzID0gMDsKK30KKworc3RhdGljIGludCBzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCFhZGFwdGVyLT5pbnRycmVnaXN0ZXJlZCkgeworCQlpbnQgcmV0dmFsOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmxvY2ssCisJCQkJCXNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmZsYWdzKTsKKworCQlyZXR2YWwgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5uZXRkZXYtPmlycSwKKwkJCQkgICAgICZzbGljX2ludGVycnVwdCwKKwkJCQkgICAgIElSUUZfU0hBUkVELAorCQkJCSAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBhZGFwdGVyLT5uZXRkZXYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5sb2NrLAorCQkJCQlzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5mbGFncyk7CisKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkJInJlcXVlc3RfaXJxICglcykgRkFJTEVEIFsleF1cbiIsCisJCQkJYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCByZXR2YWwpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlhZGFwdGVyLT5pbnRycmVnaXN0ZXJlZCA9IDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIHNsaWNfaWZfaW5pdAorICoKKyAqICBQZXJmb3JtIGluaXRpYWxpemF0aW9uIG9mIG91ciBzbGljIGludGVyZmFjZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgc2xpY19pZl9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKKwlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCWludCByYzsKKworCUFTU0VSVChjYXJkKTsKKworCS8qIGFkYXB0ZXIgc2hvdWxkIGJlIGRvd24gYXQgdGhpcyBwb2ludCAqLworCWlmIChhZGFwdGVyLT5zdGF0ZSAhPSBBREFQVF9ET1dOKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXM6IGFkYXB0ZXItPnN0YXRlICE9IEFEQVBUX0RPV05cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQorCUFTU0VSVChhZGFwdGVyLT5saW5rc3RhdGUgPT0gTElOS19ET1dOKTsKKworCWFkYXB0ZXItPmRldmZsYWdzX3ByZXYgPSBkZXYtPmZsYWdzOworCWFkYXB0ZXItPm1hY29wdHMgPSBNQUNfRElSRUNURUQ7CisJaWYgKGRldi0+ZmxhZ3MpIHsKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKQorCQkJYWRhcHRlci0+bWFjb3B0cyB8PSBNQUNfQkNBU1Q7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCQlhZGFwdGVyLT5tYWNvcHRzIHw9IE1BQ19QUk9NSVNDOworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJCWFkYXB0ZXItPm1hY29wdHMgfD0gTUFDX0FMTE1DQVNUOworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpCisJCQlhZGFwdGVyLT5tYWNvcHRzIHw9IE1BQ19NQ0FTVDsKKwl9CisJcmMgPSBzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMoYWRhcHRlcik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIiVzOiBzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMgRkFJTEVEICV4XG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJc2xpY19hZGFwdGVyX2ZyZWVyZXNvdXJjZXMoYWRhcHRlcik7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghYWRhcHRlci0+cXVldWVzX2luaXRpYWxpemVkKSB7CisJCWlmICgocmMgPSBzbGljX3JzcHF1ZXVlX2luaXQoYWRhcHRlcikpKQorCQkJZ290byBlcnI7CisJCWlmICgocmMgPSBzbGljX2NtZHFfaW5pdChhZGFwdGVyKSkpCisJCQlnb3RvIGVycjsKKwkJaWYgKChyYyA9IHNsaWNfcmN2cXVldWVfaW5pdChhZGFwdGVyKSkpCisJCQlnb3RvIGVycjsKKwkJYWRhcHRlci0+cXVldWVzX2luaXRpYWxpemVkID0gMTsKKwl9CisKKwlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09GRiwgRkxVU0gpOworCW1kZWxheSgxKTsKKworCWlmICghYWRhcHRlci0+aXNwX2luaXRpYWxpemVkKSB7CisJCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKWFkYXB0ZXItPnBoeXNfc2htZW07CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jay5sb2NrLAorCQkJCQlhZGFwdGVyLT5iaXQ2NHJlZ2xvY2suZmxhZ3MpOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKKwkJCQkgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmlzciksIERPTlRfRkxVU0gpOworCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNwLAorCQkJCSBTTElDX0dFVF9BRERSX0xPVygmcHNobWVtLT5pc3IpLCBGTFVTSCk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19YODYpCisJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCAwLCBET05UX0ZMVVNIKTsKKwkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzcCwgKHUzMikmcHNobWVtLT5pc3IsIEZMVVNIKTsKKyNlbHNlCisJCVN0b3AgQ29tcGlsYXRpb25zCisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLmxvY2ssCisJCQkJCWFkYXB0ZXItPmJpdDY0cmVnbG9jay5mbGFncyk7CisJCWFkYXB0ZXItPmlzcF9pbml0aWFsaXplZCA9IDE7CisJfQorCisJYWRhcHRlci0+c3RhdGUgPSBBREFQVF9VUDsKKwlpZiAoIWNhcmQtPmxvYWR0aW1lcnNldCkgeworCQlpbml0X3RpbWVyKCZjYXJkLT5sb2FkdGltZXIpOworCQljYXJkLT5sb2FkdGltZXIuZXhwaXJlcyA9CisJCSAgICBqaWZmaWVzICsgKFNMSUNfTE9BRFRJTUVSX1BFUklPRCAqIEhaKTsKKwkJY2FyZC0+bG9hZHRpbWVyLmRhdGEgPSAodWxvbmcpIGNhcmQ7CisJCWNhcmQtPmxvYWR0aW1lci5mdW5jdGlvbiA9ICZzbGljX3RpbWVyX2xvYWRfY2hlY2s7CisJCWFkZF90aW1lcigmY2FyZC0+bG9hZHRpbWVyKTsKKworCQljYXJkLT5sb2FkdGltZXJzZXQgPSAxOworCX0KKworCWlmICghYWRhcHRlci0+cGluZ3RpbWVyc2V0KSB7CisJCWluaXRfdGltZXIoJmFkYXB0ZXItPnBpbmd0aW1lcik7CisJCWFkYXB0ZXItPnBpbmd0aW1lci5leHBpcmVzID0KKwkJICAgIGppZmZpZXMgKyAoUElOR19USU1FUl9JTlRFUlZBTCAqIEhaKTsKKwkJYWRhcHRlci0+cGluZ3RpbWVyLmRhdGEgPSAodWxvbmcpIGRldjsKKwkJYWRhcHRlci0+cGluZ3RpbWVyLmZ1bmN0aW9uID0gJnNsaWNfdGltZXJfcGluZzsKKwkJYWRkX3RpbWVyKCZhZGFwdGVyLT5waW5ndGltZXIpOworCQlhZGFwdGVyLT5waW5ndGltZXJzZXQgPSAxOworCQlhZGFwdGVyLT5jYXJkLT5waW5nc3RhdHVzID0gSVNSX1BJTkdNQVNLOworCX0KKworCS8qCisJICogICAgY2xlYXIgYW55IHBlbmRpbmcgZXZlbnRzLCB0aGVuIGVuYWJsZSBpbnRlcnJ1cHRzCisJICovCisJYWRhcHRlci0+aXNyY29weSA9IDA7CisJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOworCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3IsIDAsIEZMVVNIKTsKKwlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09OLCBGTFVTSCk7CisKKwlzbGljX2xpbmtfY29uZmlnKGFkYXB0ZXIsIExJTktfQVVUT1NQRUVELCBMSU5LX0FVVE9EKTsKKwlzbGljX2xpbmtfZXZlbnRfaGFuZGxlcihhZGFwdGVyKTsKKworZXJyOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBzbGljX2VudHJ5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKKwl1MzIgbG9ja2VkID0gMDsKKwlpbnQgc3RhdHVzOworCisJQVNTRVJUKGFkYXB0ZXIpOworCUFTU0VSVChjYXJkKTsKKworCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5sb2NrLAorCQkJCXNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmZsYWdzKTsKKwlsb2NrZWQgPSAxOworCWlmICghYWRhcHRlci0+YWN0aXZhdGVkKSB7CisJCWNhcmQtPmFkYXB0ZXJzX2FjdGl2YXRlZCsrOworCQlzbGljX2dsb2JhbC5udW1fc2xpY19wb3J0c19hY3RpdmUrKzsKKwkJYWRhcHRlci0+YWN0aXZhdGVkID0gMTsKKwl9CisJc3RhdHVzID0gc2xpY19pZl9pbml0KGFkYXB0ZXIpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWlmIChhZGFwdGVyLT5hY3RpdmF0ZWQpIHsKKwkJCWNhcmQtPmFkYXB0ZXJzX2FjdGl2YXRlZC0tOworCQkJc2xpY19nbG9iYWwubnVtX3NsaWNfcG9ydHNfYWN0aXZlLS07CisJCQlhZGFwdGVyLT5hY3RpdmF0ZWQgPSAwOworCQl9CisJCWlmIChsb2NrZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmxvY2ssCisJCQkJCQlzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5mbGFncyk7CisJCQlsb2NrZWQgPSAwOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICghY2FyZC0+bWFzdGVyKQorCQljYXJkLT5tYXN0ZXIgPSBhZGFwdGVyOworCisJaWYgKGxvY2tlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5sb2NrLAorCQkJCQlzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5mbGFncyk7CisJCWxvY2tlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfY2FyZF9jbGVhbnVwKHN0cnVjdCBzbGljY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+bG9hZHRpbWVyc2V0KSB7CisJCWNhcmQtPmxvYWR0aW1lcnNldCA9IDA7CisJCWRlbF90aW1lcigmY2FyZC0+bG9hZHRpbWVyKTsKKwl9CisKKwlzbGljX2RlYnVnX2NhcmRfZGVzdHJveShjYXJkKTsKKworCWtmcmVlKGNhcmQpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2xpY19lbnRyeV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7CisJdTMyIG1taW9fc3RhcnQgPSAwOworCXVpbnQgbW1pb19sZW4gPSAwOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQ7CisJc3RydWN0IG1jYXN0X2FkZHJlc3MgKm1jYWRkciwgKm1saXN0OworCisJQVNTRVJUKGFkYXB0ZXIpOworCXNsaWNfYWRhcHRlcl9mcmVlcmVzb3VyY2VzKGFkYXB0ZXIpOworCXNsaWNfdW5tYXBfbW1pb19zcGFjZShhZGFwdGVyKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJbW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwY2lkZXYsIDApOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKworCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyKTsKKwkvKiBmcmVlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKwltbGlzdCA9IGFkYXB0ZXItPm1jYXN0YWRkcnM7CisJd2hpbGUgKG1saXN0KSB7CisJCW1jYWRkciA9IG1saXN0OworCQltbGlzdCA9IG1saXN0LT5uZXh0OworCQlrZnJlZShtY2FkZHIpOworCX0KKwlBU1NFUlQoYWRhcHRlci0+Y2FyZCk7CisJY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CisJQVNTRVJUKGNhcmQtPmFkYXB0ZXJzX2FsbG9jYXRlZCk7CisJY2FyZC0+YWRhcHRlcnNfYWxsb2NhdGVkLS07CisJYWRhcHRlci0+YWxsb2NhdGVkID0gMDsKKwlpZiAoIWNhcmQtPmFkYXB0ZXJzX2FsbG9jYXRlZCkgeworCQlzdHJ1Y3Qgc2xpY2NhcmQgKmN1cnJfY2FyZCA9IHNsaWNfZ2xvYmFsLnNsaWNfY2FyZDsKKwkJaWYgKGN1cnJfY2FyZCA9PSBjYXJkKSB7CisJCQlzbGljX2dsb2JhbC5zbGljX2NhcmQgPSBjYXJkLT5uZXh0OworCQl9IGVsc2UgeworCQkJd2hpbGUgKGN1cnJfY2FyZC0+bmV4dCAhPSBjYXJkKQorCQkJCWN1cnJfY2FyZCA9IGN1cnJfY2FyZC0+bmV4dDsKKwkJCUFTU0VSVChjdXJyX2NhcmQpOworCQkJY3Vycl9jYXJkLT5uZXh0ID0gY2FyZC0+bmV4dDsKKwkJfQorCQlBU1NFUlQoc2xpY19nbG9iYWwubnVtX3NsaWNfY2FyZHMpOworCQlzbGljX2dsb2JhbC5udW1fc2xpY19jYXJkcy0tOworCQlzbGljX2NhcmRfY2xlYW51cChjYXJkKTsKKwl9CisJa2ZyZWUoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaWRldik7Cit9CisKK3N0YXRpYyBpbnQgc2xpY19lbnRyeV9oYWx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CisJX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2subG9jaywKKwkJCQlzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5mbGFncyk7CisJQVNTRVJUKGNhcmQpOworCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwlhZGFwdGVyLT5zdGF0ZSA9IEFEQVBUX0RPV047CisJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19ET1dOOworCWFkYXB0ZXItPnVwcl9saXN0ID0gTlVMTDsKKwlhZGFwdGVyLT51cHJfYnVzeSA9IDA7CisJYWRhcHRlci0+ZGV2ZmxhZ3NfcHJldiA9IDA7CisJQVNTRVJUKGNhcmQtPmFkYXB0ZXJbYWRhcHRlci0+Y2FyZGluZGV4XSA9PSBhZGFwdGVyKTsKKwlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09GRiwgRkxVU0gpOworCWFkYXB0ZXItPmFsbF9yZWdfd3JpdGVzKys7CisJYWRhcHRlci0+aWNyX3JlZ193cml0ZXMrKzsKKwlzbGljX2NvbmZpZ19jbGVhcihhZGFwdGVyKTsKKwlpZiAoYWRhcHRlci0+YWN0aXZhdGVkKSB7CisJCWNhcmQtPmFkYXB0ZXJzX2FjdGl2YXRlZC0tOworCQlzbGljX2dsb2JhbC5udW1fc2xpY19wb3J0c19hY3RpdmUtLTsKKwkJYWRhcHRlci0+YWN0aXZhdGVkID0gMDsKKwl9CisjaWZkZWYgQVVUT01BVElDX1JFU0VUCisJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jlc2V0X2lmYWNlLCAwLCBGTFVTSCk7CisjZW5kaWYKKwkvKgorCSAqICBSZXNldCB0aGUgYWRhcHRlcidzIGNtZCBxdWV1ZXMKKwkgKi8KKwlzbGljX2NtZHFfcmVzZXQoYWRhcHRlcik7CisKKyNpZmRlZiBBVVRPTUFUSUNfUkVTRVQKKwlpZiAoIWNhcmQtPmFkYXB0ZXJzX2FjdGl2YXRlZCkKKwkJc2xpY19jYXJkX2luaXQoY2FyZCwgYWRhcHRlcik7CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLmxvY2ssCisJCQkJc2xpY19nbG9iYWwuZHJpdmVyX2xvY2suZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNsaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVNTRVJUKGFkYXB0ZXIpOworCWRldi0+c3RhdHMuY29sbGlzaW9ucyA9IGFkYXB0ZXItPnNsaWNfc3RhdHMuaWZhY2UueG1pdF9jb2xsaXNpb25zOworCWRldi0+c3RhdHMucnhfZXJyb3JzID0gYWRhcHRlci0+c2xpY19zdGF0cy5pZmFjZS5yY3ZfZXJyb3JzOworCWRldi0+c3RhdHMudHhfZXJyb3JzID0gYWRhcHRlci0+c2xpY19zdGF0cy5pZmFjZS54bXRfZXJyb3JzOworCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGFkYXB0ZXItPnNsaWNfc3RhdHMuaWZhY2UucmN2X2Rpc2NhcmRzOworCWRldi0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7CisJZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7CisJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKKwlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKKwlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IDA7CisJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKworCXJldHVybiAmZGV2LT5zdGF0czsKK30KKworc3RhdGljIGludCBzbGljX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBldGh0b29sX2NtZCBlZGF0YTsKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgZWNtZDsKKwl1MzIgZGF0YVs3XTsKKwl1MzIgaW50YWdnOworCisJQVNTRVJUKHJxKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NMSUNTRVRJTlRBR0c6CisJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBycS0+aWZyX2RhdGEsIDI4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpbnRhZ2cgPSBkYXRhWzBdOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzOiBzZXQgaW50ZXJydXB0IGFnZ3JlZ2F0aW9uIHRvICVkXG4iLAorCQkJX19mdW5jX18sIGludGFnZyk7CisJCXNsaWNfaW50YWdnX3NldChhZGFwdGVyLCBpbnRhZ2cpOworCQlyZXR1cm4gMDsKKworI2lmZGVmIFNMSUNfVFJBQ0VfRFVNUF9FTkFCTEVECisJY2FzZSBTSU9DU0xJQ1RSQUNFRFVNUDoKKwkJeworCQkJdTMyIHZhbHVlOworCQkJREJHX0lPQ1RMKCJzbGljX2lvY3RsICBTSU9DU0xJQ19UUkFDRV9EVU1QXG4iKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHJxLT5pZnJfZGF0YSwgMjgpKSB7CisJCQkJUFJJTlRfRVJST1IKKwkJCQkgICAgKCJzbGljOiBjb3B5X2Zyb21fdXNlciBGQUlMRUQgZ2V0dGluZyBpbml0aWFsIHNpbWJhIHBhcmFtXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJdmFsdWUgPSBkYXRhWzBdOworCQkJaWYgKHRyYWNlbW9uX3JlcXVlc3QgPT0gU0xJQ19EVU1QX0RPTkUpIHsKKwkJCQlQUklOVF9FUlJPUgorCQkJCSAgICAoIkFUSyBEaWFnbm9zdGljIFRyYWNlIER1bXAgUmVxdWVzdGVkXG4iKTsKKwkJCQl0cmFjZW1vbl9yZXF1ZXN0ID0gU0xJQ19EVU1QX1JFUVVFU1RFRDsKKwkJCQl0cmFjZW1vbl9yZXF1ZXN0X3R5cGUgPSB2YWx1ZTsKKwkJCQl0cmFjZW1vbl90aW1lc3RhbXAgPSBqaWZmaWVzOworCQkJfSBlbHNlIGlmICgodHJhY2Vtb25fcmVxdWVzdCA9PSBTTElDX0RVTVBfUkVRVUVTVEVEKSB8fAorCQkJCSAgICh0cmFjZW1vbl9yZXF1ZXN0ID09CisJCQkJICAgIFNMSUNfRFVNUF9JTl9QUk9HUkVTUykpIHsKKwkJCQlQUklOVF9FUlJPUgorCQkJCSAgICAoIkFUSyBEaWFnbm9zdGljIFRyYWNlIER1bXAgUmVxdWVzdGVkIGJ1dCBhbHJlYWR5IGluIHByb2dyZXNzLi4uIGlnbm9yZVxuIik7CisJCQl9IGVsc2UgeworCQkJCVBSSU5UX0VSUk9SCisJCQkJICAgICgiQVRLIERpYWdub3N0aWMgVHJhY2UgRHVtcCBSZXF1ZXN0ZWRcbiIpOworCQkJCXRyYWNlbW9uX3JlcXVlc3QgPSBTTElDX0RVTVBfUkVRVUVTVEVEOworCQkJCXRyYWNlbW9uX3JlcXVlc3RfdHlwZSA9IHZhbHVlOworCQkJCXRyYWNlbW9uX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmCisJY2FzZSBTSU9DRVRIVE9PTDoKKwkJQVNTRVJUKGFkYXB0ZXIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmVjbWQsIHJxLT5pZnJfZGF0YSwgc2l6ZW9mKGVjbWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChlY21kLmNtZCA9PSBFVEhUT09MX0dTRVQpIHsKKwkJCWVkYXRhLnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJCSAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9NSUkpOworCQkJZWRhdGEucG9ydCA9IFBPUlRfTUlJOworCQkJZWRhdGEudHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCQkJZWRhdGEucGh5X2FkZHJlc3MgPSAwOworCQkJaWYgKGFkYXB0ZXItPmxpbmtzcGVlZCA9PSBMSU5LXzEwME1CKQorCQkJCWVkYXRhLnNwZWVkID0gU1BFRURfMTAwOworCQkJZWxzZSBpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTBNQikKKwkJCQllZGF0YS5zcGVlZCA9IFNQRUVEXzEwOworCQkJZWxzZQorCQkJCWVkYXRhLnNwZWVkID0gMDsKKworCQkJaWYgKGFkYXB0ZXItPmxpbmtkdXBsZXggPT0gTElOS19GVUxMRCkKKwkJCQllZGF0YS5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCWVsc2UKKwkJCQllZGF0YS5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCQkJZWRhdGEuYXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQkJZWRhdGEubWF4dHhwa3QgPSAxOworCQkJZWRhdGEubWF4cnhwa3QgPSAxOworCQkJaWYgKGNvcHlfdG9fdXNlcihycS0+aWZyX2RhdGEsICZlZGF0YSwgc2l6ZW9mKGVkYXRhKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJfSBlbHNlIGlmIChlY21kLmNtZCA9PSBFVEhUT09MX1NTRVQpIHsKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQlpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTAwTUIpCisJCQkJZWRhdGEuc3BlZWQgPSBTUEVFRF8xMDA7CisJCQllbHNlIGlmIChhZGFwdGVyLT5saW5rc3BlZWQgPT0gTElOS18xME1CKQorCQkJCWVkYXRhLnNwZWVkID0gU1BFRURfMTA7CisJCQllbHNlCisJCQkJZWRhdGEuc3BlZWQgPSAwOworCisJCQlpZiAoYWRhcHRlci0+bGlua2R1cGxleCA9PSBMSU5LX0ZVTExEKQorCQkJCWVkYXRhLmR1cGxleCA9IERVUExFWF9GVUxMOworCQkJZWxzZQorCQkJCWVkYXRhLmR1cGxleCA9IERVUExFWF9IQUxGOworCisJCQllZGF0YS5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCQllZGF0YS5tYXh0eHBrdCA9IDE7CisJCQllZGF0YS5tYXhyeHBrdCA9IDE7CisJCQlpZiAoKGVjbWQuc3BlZWQgIT0gZWRhdGEuc3BlZWQpIHx8CisJCQkgICAgKGVjbWQuZHVwbGV4ICE9IGVkYXRhLmR1cGxleCkpIHsKKwkJCQl1MzIgc3BlZWQ7CisJCQkJdTMyIGR1cGxleDsKKworCQkJCWlmIChlY21kLnNwZWVkID09IFNQRUVEXzEwKQorCQkJCQlzcGVlZCA9IDA7CisJCQkJZWxzZQorCQkJCQlzcGVlZCA9IFBDUl9TUEVFRF8xMDA7CisJCQkJaWYgKGVjbWQuZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCQlkdXBsZXggPSBQQ1JfRFVQTEVYX0ZVTEw7CisJCQkJZWxzZQorCQkJCQlkdXBsZXggPSAwOworCQkJCXNsaWNfbGlua19jb25maWcoYWRhcHRlciwgc3BlZWQsIGR1cGxleCk7CisJCQkJc2xpY19saW5rX2V2ZW50X2hhbmRsZXIoYWRhcHRlcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHZvaWQgc2xpY19jb25maWdfcGNpKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCXUxNiBuZXdfY29tbWFuZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaWRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisKKwluZXdfY29tbWFuZCA9IHBjaV9jb21tYW5kIHwgUENJX0NPTU1BTkRfTUFTVEVSCisJICAgIHwgUENJX0NPTU1BTkRfTUVNT1JZCisJICAgIHwgUENJX0NPTU1BTkRfSU5WQUxJREFURQorCSAgICB8IFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9GQVNUX0JBQ0s7CisJaWYgKHBjaV9jb21tYW5kICE9IG5ld19jb21tYW5kKQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpZGV2LCBQQ0lfQ09NTUFORCwgbmV3X2NvbW1hbmQpOworfQorCitzdGF0aWMgaW50IHNsaWNfY2FyZF9pbml0KHN0cnVjdCBzbGljY2FyZCAqY2FyZCwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CisJc3RydWN0IHNsaWNfZWVwcm9tICpwZWVwcm9tOworCXN0cnVjdCBvc2xpY19lZXByb20gKnBPZWVwcm9tOworCWRtYV9hZGRyX3QgcGh5c19jb25maWc7CisJdTMyIHBoeXNfY29uZmlnaDsKKwl1MzIgcGh5c19jb25maWdsOworCXUzMiBpID0gMDsKKwlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCWludCBzdGF0dXM7CisJdWludCBtYWNhZGRycyA9IGNhcmQtPmNhcmRfc2l6ZTsKKwl1c2hvcnQgZWVjb2Rlc2l6ZTsKKwl1c2hvcnQgZHJhbXNpemU7CisJdXNob3J0IGVlX2Noa3N1bTsKKwl1c2hvcnQgY2FsY19jaGtzdW07CisJc3RydWN0IHNsaWNfY29uZmlnX21hYyAqcG1hYzsKKwl1bnNpZ25lZCBjaGFyIGZydWZvcm1hdDsKKwl1bnNpZ25lZCBjaGFyIG9lbWZydWZvcm1hdDsKKwlzdHJ1Y3QgYXRrX2ZydSAqcGF0a2ZydTsKKwl1bmlvbiBvZW1mcnUgKnBvZW1mcnU7CisKKwkvKiBSZXNldCBldmVyeXRoaW5nIGV4Y2VwdCBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAqLworCXNsaWNfc29mdF9yZXNldChhZGFwdGVyKTsKKworCS8qIERvd25sb2FkIHRoZSBtaWNyb2NvZGUgKi8KKwlzdGF0dXMgPSBzbGljX2NhcmRfZG93bmxvYWQoYWRhcHRlcik7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCisJCQkiZG93bmxvYWQgZmFpbGVkIGJ1cyAlZCBzbG90ICVkXG4iLAorCQkJYWRhcHRlci0+YnVzbnVtYmVyLCBhZGFwdGVyLT5zbG90bnVtYmVyKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoIWNhcmQtPmNvbmZpZ19zZXQpIHsKKwkJcGVlcHJvbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19lZXByb20pLAorCQkJCQkgICAgICAgJnBoeXNfY29uZmlnKTsKKworCQlwaHlzX2NvbmZpZ2wgPSBTTElDX0dFVF9BRERSX0xPVyhwaHlzX2NvbmZpZyk7CisJCXBoeXNfY29uZmlnaCA9IFNMSUNfR0VUX0FERFJfSElHSChwaHlzX2NvbmZpZyk7CisKKwkJaWYgKCFwZWVwcm9tKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKKwkJCQkiZWVwcm9tIHJlYWQgZmFpbGVkIHRvIGdldCBtZW1vcnkgIgorCQkJCSJidXMgJWQgc2xvdCAlZFxuIiwgYWRhcHRlci0+YnVzbnVtYmVyLAorCQkJCWFkYXB0ZXItPnNsb3RudW1iZXIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQltZW1zZXQocGVlcHJvbSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX2VlcHJvbSkpOworCQl9CisJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pY3IsIElDUl9JTlRfT0ZGLCBGTFVTSCk7CisJCW1kZWxheSgxKTsKKwkJcHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopYWRhcHRlci0+cGh5c19zaG1lbTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLmxvY2ssCisJCQkJCWFkYXB0ZXItPmJpdDY0cmVnbG9jay5mbGFncyk7CisJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCAwLCBET05UX0ZMVVNIKTsKKwkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzcCwKKwkJCQkgU0xJQ19HRVRfQUREUl9MT1coJnBzaG1lbS0+aXNyKSwgRkxVU0gpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2subG9jaywKKwkJCQkJYWRhcHRlci0+Yml0NjRyZWdsb2NrLmZsYWdzKTsKKworCQlzbGljX2NvbmZpZ19nZXQoYWRhcHRlciwgcGh5c19jb25maWdsLCBwaHlzX2NvbmZpZ2gpOworCisJCWZvciAoOzspIHsKKwkJCWlmIChhZGFwdGVyLT5wc2htZW0tPmlzcikgeworCQkJCWlmIChhZGFwdGVyLT5wc2htZW0tPmlzciAmIElTUl9VUEMpIHsKKwkJCQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOworCQkJCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsCisJCQkJCQkmc2xpY19yZWdzLT5zbGljX2lzcCwgMCwKKwkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKKwkJCQkJCTAsIEZMVVNIKTsKKwkJCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwKKwkJCQkJCQkgMCwgRkxVU0gpOworCisJCQkJCXNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoYWRhcHRlciwgMCk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKKwkJCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwKKwkJCQkJCQkgMCwgRkxVU0gpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbWRlbGF5KDEpOworCQkJCWkrKzsKKwkJCQlpZiAoaSA+IDUwMDApIHsKKwkJCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCisJCQkJCQkiJWQgY29uZmlnIGRhdGEgZmV0Y2ggdGltZWQgb3V0IVxuIiwKKwkJCQkJCWFkYXB0ZXItPnBvcnQpOworCQkJCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsCisJCQkJCQkmc2xpY19yZWdzLT5zbGljX2lzcCwgMCwKKwkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKKwkJCQkJCTAsIEZMVVNIKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgeworCQkvKiBPYXNpcyBjYXJkICovCisJCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgorCQkJLyogZXh0cmFjdCBFRVBST00gZGF0YSBhbmQgcG9pbnRlcnMgdG8gRUVQUk9NIGRhdGEgKi8KKwkJCXBPZWVwcm9tID0gKHN0cnVjdCBvc2xpY19lZXByb20gKikgcGVlcHJvbTsKKwkJCWVlY29kZXNpemUgPSBwT2VlcHJvbS0+RWVjb2RlU2l6ZTsKKwkJCWRyYW1zaXplID0gcE9lZXByb20tPkRyYW1TaXplOworCQkJcG1hYyA9IHBPZWVwcm9tLT5NYWNJbmZvOworCQkJZnJ1Zm9ybWF0ID0gcE9lZXByb20tPkZydUZvcm1hdDsKKwkJCXBhdGtmcnUgPSAmcE9lZXByb20tPkF0a0ZydTsKKwkJCW9lbWZydWZvcm1hdCA9IHBPZWVwcm9tLT5PZW1GcnVGb3JtYXQ7CisJCQlwb2VtZnJ1ID0gJnBPZWVwcm9tLT5PZW1GcnU7CisJCQltYWNhZGRycyA9IDI7CisJCQkvKiBNaW5vciBrbHVkZ2UgZm9yIE9hc2lzIGNhcmQKKwkJCSAgICAgZ2V0IDIgTUFDIGFkZHJlc3NlcyBmcm9tIHRoZQorCQkJICAgICBFRVBST00gdG8gZW5zdXJlIHRoYXQgZnVuY3Rpb24gMQorCQkJICAgICBnZXRzIHRoZSBQb3J0IDEgTUFDIGFkZHJlc3MgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogZXh0cmFjdCBFRVBST00gZGF0YSBhbmQgcG9pbnRlcnMgdG8gRUVQUk9NIGRhdGEgKi8KKwkJCWVlY29kZXNpemUgPSBwZWVwcm9tLT5FZWNvZGVTaXplOworCQkJZHJhbXNpemUgPSBwZWVwcm9tLT5EcmFtU2l6ZTsKKwkJCXBtYWMgPSBwZWVwcm9tLT51Mi5tYWMuTWFjSW5mbzsKKwkJCWZydWZvcm1hdCA9IHBlZXByb20tPkZydUZvcm1hdDsKKwkJCXBhdGtmcnUgPSAmcGVlcHJvbS0+QXRrRnJ1OworCQkJb2VtZnJ1Zm9ybWF0ID0gcGVlcHJvbS0+T2VtRnJ1Rm9ybWF0OworCQkJcG9lbWZydSA9ICZwZWVwcm9tLT5PZW1GcnU7CisJCQlicmVhazsKKwkJfQorCisJCWNhcmQtPmNvbmZpZy5FZXByb21WYWxpZCA9IGZhbHNlOworCisJCS8qICBzZWUgaWYgdGhlIEVFUFJPTSBpcyB2YWxpZCBieSBjaGVja2luZyBpdCdzIGNoZWNrc3VtICovCisJCWlmICgoZWVjb2Rlc2l6ZSA8PSBNQVhfRUVDT0RFX1NJWkUpICYmCisJCSAgICAoZWVjb2Rlc2l6ZSA+PSBNSU5fRUVDT0RFX1NJWkUpKSB7CisKKwkJCWVlX2Noa3N1bSA9CisJCQkgICAgKih1MTYgKikgKChjaGFyICopIHBlZXByb20gKyAoZWVjb2Rlc2l6ZSAtIDIpKTsKKwkJCS8qCisJCQkgICAgY2FsY3VsYXRlIHRoZSBFRVBST00gY2hlY2tzdW0KKwkJCSovCisJCQljYWxjX2Noa3N1bSA9CisJCQkgICAgfnNsaWNfZWVwcm9tX2Nrc3VtKChjaGFyICopIHBlZXByb20sCisJCQkJCSAgICAgICAoZWVjb2Rlc2l6ZSAtIDIpKTsKKwkJCS8qCisJCQkgICAgaWYgdGhlIHVjZG9lIGNoa3N1bSBmbGFnIGJpdCB3b3JrZWQsCisJCQkgICAgd2Ugd291bGRuJ3QgbmVlZCB0aGlzIHNoaXQKKwkJCSovCisJCQlpZiAoZWVfY2hrc3VtID09IGNhbGNfY2hrc3VtKQorCQkJCWNhcmQtPmNvbmZpZy5FZXByb21WYWxpZCA9IHRydWU7CisJCX0KKwkJLyogIGNvcHkgaW4gdGhlIERSQU0gc2l6ZSAqLworCQljYXJkLT5jb25maWcuRHJhbVNpemUgPSBkcmFtc2l6ZTsKKworCQkvKiAgY29weSBpbiB0aGUgTUFDIGFkZHJlc3MoZXMpICovCisJCWZvciAoaSA9IDA7IGkgPCBtYWNhZGRyczsgaSsrKSB7CisJCQltZW1jcHkoJmNhcmQtPmNvbmZpZy5NYWNJbmZvW2ldLAorCQkJICAgICAgICZwbWFjW2ldLCBzaXplb2Yoc3RydWN0IHNsaWNfY29uZmlnX21hYykpOworCQl9CisKKwkJLyogIGNvcHkgdGhlIEFsYWNyaXRlY2ggRlJVIGluZm9ybWF0aW9uICovCisJCWNhcmQtPmNvbmZpZy5GcnVGb3JtYXQgPSBmcnVmb3JtYXQ7CisJCW1lbWNweSgmY2FyZC0+Y29uZmlnLkF0a0ZydSwgcGF0a2ZydSwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYXRrX2ZydSkpOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfZWVwcm9tKSwKKwkJCQkgICAgcGVlcHJvbSwgcGh5c19jb25maWcpOworCisJCWlmICgoIWNhcmQtPmNvbmZpZy5FZXByb21WYWxpZCkgJiYKKwkJICAgIChhZGFwdGVyLT5yZWdfcGFyYW1zLmZhaWxfb25fYmFkX2VlcHJvbSkpIHsKKwkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19pc3AsIDAsCisJCQkJCSAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCisJCQkJCSAwLCBGTFVTSCk7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKKwkJCQkidW5zdXBwb3J0ZWQgQ09ORklHVVJBVElPTiBFRVBST00gaW52YWxpZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNhcmQtPmNvbmZpZ19zZXQgPSAxOworCX0KKworCWlmIChzbGljX2NhcmRfZG93bmxvYWRfZ2JyY3YoYWRhcHRlcikpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIGRvd25sb2FkIEdCIHJlY2VpdmUgbWljcm9jb2RlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNsaWNfZ2xvYmFsLmR5bmFtaWNfaW50YWdnKQorCQlzbGljX2ludGFnZ19zZXQoYWRhcHRlciwgMCk7CisJZWxzZQorCQlzbGljX2ludGFnZ19zZXQoYWRhcHRlciwgaW50YWdnX2RlbGF5KTsKKworCS8qCisJICogIEluaXRpYWxpemUgcGluZyBzdGF0dXMgdG8gIm9rIgorCSAqLworCWNhcmQtPnBpbmdzdGF0dXMgPSBJU1JfUElOR01BU0s7CisKKwkvKgorCSAqIExhc3RseSwgbWFyayBvdXIgY2FyZCBzdGF0ZSBhcyB1cCBhbmQgcmV0dXJuIHN1Y2Nlc3MKKwkgKi8KKwljYXJkLT5zdGF0ZSA9IENBUkRfVVA7CisJY2FyZC0+cmVzZXRfaW5fcHJvZ3Jlc3MgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNsaWNfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlpZiAoc2xpY19maXJzdF9pbml0KSB7CisJCXNsaWNfZmlyc3RfaW5pdCA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jay5sb2NrKTsKKwkJc2xpY19kZWJ1Z19pbml0KCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbGljX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfdGJsX2VudHJ5LAorCQkJICAgICAgdm9pZCBfX2lvbWVtICptZW1hZGRyLCBpbnQgY2hpcF9pZHgpCit7CisJdXNob3J0IGluZGV4OworCXN0cnVjdCBzbGljX2hhbmRsZSAqcHNsaWNfaGFuZGxlOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworLyoJYWRhcHRlci0+cGNpZGV2ID0gcGNpZGV2OyovCisJYWRhcHRlci0+dmVuZGlkID0gcGNpX3RibF9lbnRyeS0+dmVuZG9yOworCWFkYXB0ZXItPmRldmlkID0gcGNpX3RibF9lbnRyeS0+ZGV2aWNlOworCWFkYXB0ZXItPnN1YnN5c2lkID0gcGNpX3RibF9lbnRyeS0+c3ViZGV2aWNlOworCWFkYXB0ZXItPmJ1c251bWJlciA9IHBjaWRldi0+YnVzLT5udW1iZXI7CisJYWRhcHRlci0+c2xvdG51bWJlciA9ICgocGNpZGV2LT5kZXZmbiA+PiAzKSAmIDB4MUYpOworCWFkYXB0ZXItPmZ1bmN0aW9ubnVtYmVyID0gKHBjaWRldi0+ZGV2Zm4gJiAweDcpOworCWFkYXB0ZXItPm1lbW9yeWxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LCAwKTsKKwlhZGFwdGVyLT5zbGljX3JlZ3MgPSAoX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICopbWVtYWRkcjsKKwlhZGFwdGVyLT5pcnEgPSBwY2lkZXYtPmlycTsKKy8qCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsqLworCWFkYXB0ZXItPm5leHRfbmV0ZGV2aWNlID0gaGVhZF9uZXRkZXZpY2U7CisJaGVhZF9uZXRkZXZpY2UgPSBuZXRkZXY7CisJYWRhcHRlci0+Y2hpcGlkID0gY2hpcF9pZHg7CisJYWRhcHRlci0+cG9ydCA9IDA7CS8qYWRhcHRlci0+ZnVuY3Rpb25udW1iZXI7Ki8KKwlhZGFwdGVyLT5jYXJkaW5kZXggPSBhZGFwdGVyLT5wb3J0OworCWFkYXB0ZXItPm1lbW9yeWJhc2UgPSBtZW1hZGRyOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT51cHJfbG9jay5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5hZGFwdGVyX2xvY2subG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnJlc2V0X2xvY2subG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmhhbmRsZV9sb2NrLmxvY2spOworCisJYWRhcHRlci0+Y2FyZF9zaXplID0gMTsKKwkvKgorCSAgSW5pdGlhbGl6ZSBzbGljX2hhbmRsZSBhcnJheQorCSovCisJQVNTRVJUKFNMSUNfQ01EUV9NQVhDTURTIDw9IDB4RkZGRik7CisJLyoKKwkgU3RhcnQgd2l0aCAxLiAgMCBpcyBhbiBpbnZhbGlkIGhvc3QgaGFuZGxlLgorCSovCisJZm9yIChpbmRleCA9IDEsIHBzbGljX2hhbmRsZSA9ICZhZGFwdGVyLT5zbGljX2hhbmRsZXNbMV07CisJICAgICBpbmRleCA8IFNMSUNfQ01EUV9NQVhDTURTOyBpbmRleCsrLCBwc2xpY19oYW5kbGUrKykgeworCisJCXBzbGljX2hhbmRsZS0+dG9rZW4uaGFuZGxlX2luZGV4ID0gaW5kZXg7CisJCXBzbGljX2hhbmRsZS0+dHlwZSA9IFNMSUNfSEFORExFX0ZSRUU7CisJCXBzbGljX2hhbmRsZS0+bmV4dCA9IGFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlczsKKwkJYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzID0gcHNsaWNfaGFuZGxlOworCX0KKwlhZGFwdGVyLT5wc2htZW0gPSAoc3RydWN0IHNsaWNfc2htZW0gKikKKwkJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAorCQkJCQlzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pLAorCQkJCQkmYWRhcHRlci0+CisJCQkJCXBoeXNfc2htZW0pOworCUFTU0VSVChhZGFwdGVyLT5wc2htZW0pOworCisJbWVtc2V0KGFkYXB0ZXItPnBzaG1lbSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc2xpY19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBzbGljX2VudHJ5X29wZW4sCisJLm5kb19zdG9wCQk9IHNsaWNfZW50cnlfaGFsdCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc2xpY194bWl0X3N0YXJ0LAorCS5uZG9fZG9faW9jdGwJCT0gc2xpY19pb2N0bCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHNsaWNfbWFjX3NldF9hZGRyZXNzLAorCS5uZG9fZ2V0X3N0YXRzCQk9IHNsaWNfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gc2xpY19tY2FzdF9zZXRfbGlzdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCit9OworCitzdGF0aWMgdTMyIHNsaWNfY2FyZF9sb2NhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOworCXN0cnVjdCBwaHlzY2FyZCAqcGh5c2NhcmQgPSBzbGljX2dsb2JhbC5waHlzX2NhcmQ7CisJdXNob3J0IGNhcmRfaG9zdGlkOworCXUxNiBfX2lvbWVtICpob3N0aWRfcmVnOworCXVpbnQgaTsKKwl1aW50IHJkaG9zdGlkX29mZnNldCA9IDA7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7CisJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6CisJCXJkaG9zdGlkX29mZnNldCA9IFNMSUNfUkRIT1NUSURfMkdCOworCQlicmVhazsKKwljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKKwkJcmRob3N0aWRfb2Zmc2V0ID0gU0xJQ19SREhPU1RJRF8xR0I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJaG9zdGlkX3JlZyA9CisJICAgICh1MTYgX19pb21lbSAqKSAoKCh1OCBfX2lvbWVtICopIChhZGFwdGVyLT5zbGljX3JlZ3MpKSArCisJICAgIHJkaG9zdGlkX29mZnNldCk7CisKKwkvKiByZWFkIHRoZSAxNiBiaXQgaG9zdGlkIGZyb20gU1JBTSAqLworCWNhcmRfaG9zdGlkID0gKHVzaG9ydCkgcmVhZHcoaG9zdGlkX3JlZyk7CisKKwkvKiBJbml0aWFsaXplIGEgbmV3IGNhcmQgc3RydWN0dXJlIGlmIG5lZWQgYmUgKi8KKwlpZiAoY2FyZF9ob3N0aWQgPT0gU0xJQ19IT1NUSURfREVGQVVMVCkgeworCQljYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNsaWNjYXJkKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChjYXJkID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljYXJkLT5uZXh0ID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOworCQlzbGljX2dsb2JhbC5zbGljX2NhcmQgPSBjYXJkOworCQljYXJkLT5idXNudW1iZXIgPSBhZGFwdGVyLT5idXNudW1iZXI7CisJCWNhcmQtPnNsb3RudW1iZXIgPSBhZGFwdGVyLT5zbG90bnVtYmVyOworCisJCS8qIEZpbmQgYW4gYXZhaWxhYmxlIGNhcmRudW0gKi8KKwkJZm9yIChpID0gMDsgaSA8IFNMSUNfTUFYX0NBUkRTOyBpKyspIHsKKwkJCWlmIChzbGljX2dsb2JhbC5jYXJkbnVtaW51c2VbaV0gPT0gMCkgeworCQkJCXNsaWNfZ2xvYmFsLmNhcmRudW1pbnVzZVtpXSA9IDE7CisJCQkJY2FyZC0+Y2FyZG51bSA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc2xpY19nbG9iYWwubnVtX3NsaWNfY2FyZHMrKzsKKworCQlzbGljX2RlYnVnX2NhcmRfY3JlYXRlKGNhcmQpOworCX0gZWxzZSB7CisJCS8qIENhcmQgZXhpc3RzLCBmaW5kIHRoZSBjYXJkIHRoaXMgYWRhcHRlciBiZWxvbmdzIHRvICovCisJCXdoaWxlIChjYXJkKSB7CisJCQlpZiAoY2FyZC0+Y2FyZG51bSA9PSBjYXJkX2hvc3RpZCkKKwkJCQlicmVhazsKKwkJCWNhcmQgPSBjYXJkLT5uZXh0OworCQl9CisJfQorCisJQVNTRVJUKGNhcmQpOworCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwkvKiBQdXQgdGhlIGFkYXB0ZXIgaW4gdGhlIGNhcmQncyBhZGFwdGVyIGxpc3QgKi8KKwlBU1NFUlQoY2FyZC0+YWRhcHRlclthZGFwdGVyLT5wb3J0XSA9PSBOVUxMKTsKKwlpZiAoIWNhcmQtPmFkYXB0ZXJbYWRhcHRlci0+cG9ydF0pIHsKKwkJY2FyZC0+YWRhcHRlclthZGFwdGVyLT5wb3J0XSA9IGFkYXB0ZXI7CisJCWFkYXB0ZXItPmNhcmQgPSBjYXJkOworCX0KKworCWNhcmQtPmNhcmRfc2l6ZSA9IDE7CS8qIG9uZSBwb3J0IHBlciAqbG9naWNhbCogY2FyZCAqLworCisJd2hpbGUgKHBoeXNjYXJkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTTElDX01BWF9QT1JUUzsgaSsrKSB7CisJCQlpZiAoIXBoeXNjYXJkLT5hZGFwdGVyW2ldKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJCUFTU0VSVChpICE9IFNMSUNfTUFYX1BPUlRTKTsKKwkJaWYgKHBoeXNjYXJkLT5hZGFwdGVyW2ldLT5zbG90bnVtYmVyID09IGFkYXB0ZXItPnNsb3RudW1iZXIpCisJCQlicmVhazsKKwkJcGh5c2NhcmQgPSBwaHlzY2FyZC0+bmV4dDsKKwl9CisJaWYgKCFwaHlzY2FyZCkgeworCQkvKiBubyBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciB0aGlzIHBoeXNpY2FsIGNhcmQgeWV0ICovCisJCXBoeXNjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBoeXNjYXJkKSwgR0ZQX0FUT01JQyk7CisJCUFTU0VSVChwaHlzY2FyZCk7CisKKwkJcGh5c2NhcmQtPm5leHQgPSBzbGljX2dsb2JhbC5waHlzX2NhcmQ7CisJCXNsaWNfZ2xvYmFsLnBoeXNfY2FyZCA9IHBoeXNjYXJkOworCQlwaHlzY2FyZC0+YWRhcHRlcnNfYWxsb2NkID0gMTsKKwl9IGVsc2UgeworCQlwaHlzY2FyZC0+YWRhcHRlcnNfYWxsb2NkKys7CisJfQorCS8qIE5vdGUgLSB0aGlzIGlzIFpFUk8gcmVsYXRpdmUgKi8KKwlhZGFwdGVyLT5waHlzcG9ydCA9IHBoeXNjYXJkLT5hZGFwdGVyc19hbGxvY2QgLSAxOworCisJQVNTRVJUKHBoeXNjYXJkLT5hZGFwdGVyW2FkYXB0ZXItPnBoeXNwb3J0XSA9PSBOVUxMKTsKKwlwaHlzY2FyZC0+YWRhcHRlclthZGFwdGVyLT5waHlzcG9ydF0gPSBhZGFwdGVyOworCWFkYXB0ZXItPnBoeXNjYXJkID0gcGh5c2NhcmQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc2xpY19lbnRyeV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfdGJsX2VudHJ5KQoreworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisJc3RhdGljIGludCBkaWRfdmVyc2lvbjsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOworCXZvaWQgX19pb21lbSAqbWVtbWFwcGVkX2lvYWRkciA9IE5VTEw7CisJdTMyIHN0YXR1cyA9IDA7CisJdWxvbmcgbW1pb19zdGFydCA9IDA7CisJdWxvbmcgbW1pb19sZW4gPSAwOworCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IE5VTEw7CisJaW50IHBjaV91c2luZ19kYWMgPSAwOworCisJc2xpY19nbG9iYWwuZHluYW1pY19pbnRhZ2cgPSBkeW5hbWljX2ludGFnZzsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldik7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHNsaWNfZGVidWcgPiAwICYmIGRpZF92ZXJzaW9uKysgPT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHNsaWNfYmFubmVyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBzbGljX3Byb2NfdmVyc2lvbik7CisJfQorCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soNjQpKSkgeworCQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJ1bmFibGUgdG8gb2J0YWluIDY0LWJpdCBETUEgZm9yICIKKwkJCQkJImNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOworCQkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGNpOworCQl9CisJfSBlbHNlIGlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDA7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSygzMikpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAibm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGNpOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImNhbid0IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGNpOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFkYXB0ZXIpKTsKKwlpZiAoIW5ldGRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZXhpdF9zbGljX3Byb2JlOworCX0KKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBjaWRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIG5ldGRldik7CisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCWFkYXB0ZXItPnBjaWRldiA9IHBjaWRldjsKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMCk7CisKKworLyoJbWVtbWFwcGVkX2lvYWRkciA9ICAodTMyKWlvcmVtYXBfbm9jYWNoZShtbWlvX3N0YXJ0LCBtbWlvX2xlbik7Ki8KKwltZW1tYXBwZWRfaW9hZGRyID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisJaWYgKCFtZW1tYXBwZWRfaW9hZGRyKSB7CisJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiY2Fubm90IHJlbWFwIE1NSU8gcmVnaW9uICVseCBAICVseFxuIiwKKwkJCW1taW9fbGVuLCBtbWlvX3N0YXJ0KTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCXNsaWNfY29uZmlnX3BjaShwY2lkZXYpOworCisJc2xpY19pbml0X2RyaXZlcigpOworCisJc2xpY19pbml0X2FkYXB0ZXIobmV0ZGV2LAorCQkJICBwY2lkZXYsIHBjaV90YmxfZW50cnksIG1lbW1hcHBlZF9pb2FkZHIsIGNhcmRzX2ZvdW5kKTsKKworCXN0YXR1cyA9IHNsaWNfY2FyZF9sb2NhdGUoYWRhcHRlcik7CisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImNhbm5vdCBsb2NhdGUgY2FyZFxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX21taW9fcmVnaW9uOworCX0KKworCWNhcmQgPSBhZGFwdGVyLT5jYXJkOworCisJaWYgKCFhZGFwdGVyLT5hbGxvY2F0ZWQpIHsKKwkJY2FyZC0+YWRhcHRlcnNfYWxsb2NhdGVkKys7CisJCWFkYXB0ZXItPmFsbG9jYXRlZCA9IDE7CisJfQorCisJc3RhdHVzID0gc2xpY19jYXJkX2luaXQoY2FyZCwgYWRhcHRlcik7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJY2FyZC0+c3RhdGUgPSBDQVJEX0ZBSUw7CisJCWFkYXB0ZXItPnN0YXRlID0gQURBUFRfRkFJTDsKKwkJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19ET1dOOworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgIkZBSUxFRCBzdGF0dXNbJXhdXG4iLCBzdGF0dXMpOworCX0gZWxzZSB7CisJCXNsaWNfYWRhcHRlcl9zZXRfaHdhZGRyKGFkYXB0ZXIpOworCX0KKworCW5ldGRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlci0+bWVtb3J5YmFzZTsKKwluZXRkZXYtPmlycSA9IGFkYXB0ZXItPmlycTsKKwluZXRkZXYtPm5ldGRldl9vcHMgPSAmc2xpY19uZXRkZXZfb3BzOworCisJc2xpY19kZWJ1Z19hZGFwdGVyX2NyZWF0ZShhZGFwdGVyKTsKKworCXN0cmNweShuZXRkZXYtPm5hbWUsICJldGglZCIpOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X3VubWFwOworCX0KKworCWNhcmRzX2ZvdW5kKys7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnJfb3V0X3VubWFwOgorCWlvdW5tYXAobWVtbWFwcGVkX2lvYWRkcik7CitlcnJfb3V0X2ZyZWVfbW1pb19yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKK2Vycl9vdXRfZXhpdF9zbGljX3Byb2JlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpZGV2KTsKK2Vycl9vdXRfZGlzYWJsZV9wY2k6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7CisJcmV0dXJuIGVycjsKK30KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNsaWNfZHJpdmVyID0gewogCS5uYW1lID0gRFJWX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMKaW5kZXggOWZmZWIzNi4uZjZiNDAxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9zbXRjZmIuYwpAQCAtODM1LDcgKzgzNSw3IEBACiAgKiBPcmlnaW5hbCBpbml0IGZ1bmN0aW9uIGNoYW5nZWQgdG8gcHJvYmUgbWV0aG9kIHRvIGJlIHVzZWQgYnkgcGNpX2RydgogICogcHJvY2VzcyB1c2VkIHRvIGRldGVjdCBjaGlwcyByZXBsYWNlZCB3aXRoIGtlcm5lbCBwcm9jZXNzIGluIHBjaV9kcnYKICAqLwotc3RhdGljIGludCBfX2luaXQgc210Y2ZiX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNtdGNmYl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2Mzk4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnCkBAIC0wLDAgKzEsNyBAQAorY29uZmlnIFNPTE82WDEwCisJdHJpc3RhdGUgIlNvZnRsb2dpYyA2eDEwIE1QRUcgY29kZWMgY2FyZHMiCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklERU9fREVWICYmIFNORAorCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFNvZnRsb2dpYyBiYXNlZCBNUEVHLTQgYW5kIGguMjY0IGNvZGVjCisJICBjb2RlYyBjYXJkcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTcwMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorc29sbzZ4MTAtb2Jqcwk6PSBzb2xvNjAxMC1jb3JlLm8gc29sbzYwMTAtaTJjLm8gc29sbzYwMTAtcDJtLm8gXAorCQkgICBzb2xvNjAxMC12NGwyLm8gc29sbzYwMTAtdHcyOC5vIHNvbG82MDEwLWdwaW8ubyBcCisJCSAgIHNvbG82MDEwLWRpc3AubyBzb2xvNjAxMC1lbmMubyBzb2xvNjAxMC12NGwyLWVuYy5vIFwKKwkJICAgc29sbzYwMTAtZzcyMy5vCisKK29iai0kKENPTkZJR19TT0xPNlgxMCkgOj0gc29sbzZ4MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmEyZWUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8KQEAgLTAsMCArMSwyOCBAQAorVE9ETyAoc3RhZ2luZyA9PiBtYWluKToKKworCSogY2hlY2twYXRjaC5wbCAoaGF2ZW4ndCBydW4gaXQgeWV0KQorCSogTGluZGVudCAoc2hvdWxkIGJlIGNsZWFuLCBidXQgY2hlY2spCisJKiBNb3Rpb24gZGV0ZWN0aW9uIGZsYWdzIG5lZWQgdG8gYmUgbW92ZWQgdG8gdjRsMgorCSogU29tZSBwcml2YXRlIENJRHMgbmVlZCB0byBiZSBtb3ZlZCB0byB2NGwyCisKK1RPRE8gKGdlbmVyYWwpOgorCisJKiBlbmNvZGVyIG9uL29mZiBjb250cm9scworCSogbXBlZyBjaWQgYml0cmF0ZSBtb2RlICh2YnIvY2JyKQorCSogbXBlZyBjaWQgYml0cmF0ZS9iaXRyYXRlLXBlYWsKKwkqIG1wZWcgZW5jb2RlIG9mIHVzZXIgZGF0YQorCSogbXBlZyBkZWNvZGUgb2YgdXNlciBkYXRhCisJKiBzd2l0Y2ggYmV0d2VlbiA0IGZyYW1lcy9pcnEgdG8gMSB3aGVuIHVzaW5nIG1qcGVnIChhbmQgdGhlbiBiYWNrCisJICB3aGVuIG5vdCkKKwkqIGltcGxlbWVudCBhIENJRCBjb250cm9sIGZvciBtb3Rpb24gYXJlYXMvdGhyZXNob2xkcworCSogaW1wbGVtZW50IENJRCBjb250cm9scyBmb3IgbW96YWljIGFyZWFzCisJKiBhbGxvdyBmb3IgaGlnaGVyIGxldmVsIG9mIGludGVydmFsIChmb3IgPCAxIGZwcykKKwkqIHNvdW5kOgorCSAgLSBpbXBsZW1lbnQgcGxheWJhY2sgdmlhIGV4dGVybmFsIHNvdW5kIGphY2sKKwkgIC0gaW1wbGVtZW50IGxvb3BiYWNrIG9mIGV4dGVybmFsIHNvdW5kIGphY2sgd2l0aCBpbmNvbWluZyBhdWRpbz8KKwkgIC0gaW1wbGVtZW50IHBhdXNlL3Jlc3VtZQorCSAgLSBjaGVjayBpbnRvIGphY2tpbmcgc291bmQgZnJvbSB0eDI4eHggY2hpcHMgZGlyZWN0bHkgKHRvIGF2b2lkCisJICAgIGcuNzIzLzhraHogbGltaXRhdGlvbnMpCisKK1BsYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2MgQmVuIENvbGxpbnMKKzxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzY3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtY29yZS5jCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEJsdWVjaGVycnksIExMQyB3d3cuYmx1ZWNoZXJyeWR2ci5jb20KKyAqIENvcHlyaWdodCAoQykgMjAxMCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAYmx1ZWNoZXJyeS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC5oIgorI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2Z0bG9naWMgNjAxMCBNUDQgRW5jb2Rlci9EZWNvZGVyIFY0TDIvQUxTQSBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4iKTsKK01PRFVMRV9WRVJTSU9OKFNPTE82MDEwX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCit2b2lkIHNvbG82MDEwX2lycV9vbihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTMyIG1hc2spCit7CisJc29sb19kZXYtPmlycV9tYXNrIHw9IG1hc2s7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX0VOQUJMRSwgc29sb19kZXYtPmlycV9tYXNrKTsKK30KKwordm9pZCBzb2xvNjAxMF9pcnFfb2ZmKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1MzIgbWFzaykKK3sKKwlzb2xvX2Rldi0+aXJxX21hc2sgJj0gfm1hc2s7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX0VOQUJMRSwgc29sb19kZXYtPmlycV9tYXNrKTsKK30KKworLyogWFhYIFdlIHNob3VsZCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzdWItZGV2aWNlIElTUidzICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc29sbzYwMTBfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBkYXRhOworCXUzMiBzdGF0dXM7CisJaW50IGk7CisKKwlzdGF0dXMgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LCBTT0xPX0lSUV9TVEFUKTsKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHN0YXR1cyAmIH5zb2xvX2Rldi0+aXJxX21hc2spIHsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsCisJCQkgICAgICAgc3RhdHVzICYgfnNvbG9fZGV2LT5pcnFfbWFzayk7CisJCXN0YXR1cyAmPSBzb2xvX2Rldi0+aXJxX21hc2s7CisJfQorCisJaWYgKHN0YXR1cyAmIFNPTE9fSVJRX1BDSV9FUlIpIHsKKwkJdTMyIGVyciA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fUENJX0VSUik7CisJCXNvbG9fcDJtX2Vycm9yX2lzcihzb2xvX2RldiwgZXJyKTsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsIFNPTE9fSVJRX1BDSV9FUlIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTT0xPX05SX1AyTTsgaSsrKQorCQlpZiAoc3RhdHVzICYgU09MT19JUlFfUDJNKGkpKQorCQkJc29sb19wMm1faXNyKHNvbG9fZGV2LCBpKTsKKworCWlmIChzdGF0dXMgJiBTT0xPX0lSUV9JSUMpCisJCXNvbG9faTJjX2lzcihzb2xvX2Rldik7CisKKwlpZiAoc3RhdHVzICYgU09MT19JUlFfVklERU9fSU4pCisJCXNvbG9fdmlkZW9faW5faXNyKHNvbG9fZGV2KTsKKworCS8qIENhbGwgdGhpcyBmaXJzdCBzbyBlbmMgZ2V0cyBkZXRlY3RlZCBmbGFnIHNldCAqLworCWlmIChzdGF0dXMgJiBTT0xPX0lSUV9NT1RJT04pCisJCXNvbG9fbW90aW9uX2lzcihzb2xvX2Rldik7CisKKwlpZiAoc3RhdHVzICYgU09MT19JUlFfRU5DT0RFUikKKwkJc29sb19lbmNfdjRsMl9pc3Ioc29sb19kZXYpOworCisJaWYgKHN0YXR1cyAmIFNPTE9fSVJRX0c3MjMpCisJCXNvbG9fZzcyM19pc3Ioc29sb19kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3NvbG9fZGV2KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJaWYgKCFzb2xvX2RldikKKwkJcmV0dXJuOworCisJcGRldiA9IHNvbG9fZGV2LT5wZGV2OworCisJLyogSWYgd2UgbmV2ZXIgaW5pdGlhbGl6ZWQgdGhlIFBDSSBkZXZpY2UsIHRoZW4gbm90aGluZyBlbHNlCisJICogYmVsb3cgaGVyZSBuZWVkcyBjbGVhbnVwICovCisJaWYgKCFwZGV2KSB7CisJCWtmcmVlKHNvbG9fZGV2KTsKKwkJcmV0dXJuOworCX0KKworCS8qIEJyaW5nIGRvd24gdGhlIHN1Yi1kZXZpY2VzIGZpcnN0ICovCisJc29sb19nNzIzX2V4aXQoc29sb19kZXYpOworCXNvbG9fZW5jX3Y0bDJfZXhpdChzb2xvX2Rldik7CisJc29sb19lbmNfZXhpdChzb2xvX2Rldik7CisJc29sb192NGwyX2V4aXQoc29sb19kZXYpOworCXNvbG9fZGlzcF9leGl0KHNvbG9fZGV2KTsKKwlzb2xvX2dwaW9fZXhpdChzb2xvX2Rldik7CisJc29sb19wMm1fZXhpdChzb2xvX2Rldik7CisJc29sb19pMmNfZXhpdChzb2xvX2Rldik7CisKKwkvKiBOb3cgY2xlYW51cCB0aGUgUENJIGRldmljZSAqLworCWlmIChzb2xvX2Rldi0+cmVnX2Jhc2UpIHsKKwkJc29sbzYwMTBfaXJxX29mZihzb2xvX2RldiwgfjApOworCQlwY2lfaW91bm1hcChwZGV2LCBzb2xvX2Rldi0+cmVnX2Jhc2UpOworCQlmcmVlX2lycShwZGV2LT5pcnEsIHNvbG9fZGV2KTsKKwl9CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlrZnJlZShzb2xvX2Rldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNvbG82MDEwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2OworCWludCByZXQ7CisJaW50IHNkcmFtOworCXU4IGNoaXBfaWQ7CisKKwlpZiAoKHNvbG9fZGV2ID0ga3phbGxvYyhzaXplb2YoKnNvbG9fZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc29sb19kZXYtPnBkZXYgPSBwZGV2OworCXNwaW5fbG9ja19pbml0KCZzb2xvX2Rldi0+cmVnX2lvX2xvY2spOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzb2xvX2Rldik7CisKKwlpZiAoKHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKKwkJZ290byBmYWlsX3Byb2JlOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAoKHJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgU09MTzYwMTBfTkFNRSkpKQorCQlnb3RvIGZhaWxfcHJvYmU7CisKKwlpZiAoKHNvbG9fZGV2LT5yZWdfYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKSkgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfcHJvYmU7CisJfQorCisJY2hpcF9pZCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fQ0hJUF9PUFRJT04pICYKKwkJCQkJU09MT19DSElQX0lEX01BU0s7CisJc3dpdGNoIChjaGlwX2lkKSB7CisJCWNhc2UgNzoKKwkJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDE2OworCQkJc29sb19kZXYtPm5yX2V4dCA9IDU7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJc29sb19kZXYtPm5yX2NoYW5zID0gODsKKwkJCXNvbG9fZGV2LT5ucl9leHQgPSAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiSW52YWxpZCBjaGlwX2lkIDB4JTAyeCwgIgorCQkJCSAiZGVmYXVsdGluZyB0byA0IGNoYW5uZWxzXG4iLAorCQkJCSBjaGlwX2lkKTsKKwkJY2FzZSA1OgorCQkJc29sb19kZXYtPm5yX2NoYW5zID0gNDsKKwkJCXNvbG9fZGV2LT5ucl9leHQgPSAxOworCX0KKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgdG8gc3RhcnQgKi8KKwlzb2xvNjAxMF9pcnFfb2ZmKHNvbG9fZGV2LCB+MCk7CisKKwkvKiBJbml0aWFsIGdsb2JhbCBzZXR0aW5ncyAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1NZU19DRkcsIFNPTE9fU1lTX0NGR19TRFJBTTY0QklUIHwKKwkJICAgICAgIFNPTE9fU1lTX0NGR19JTlBVVERJVigyNSkgfAorCQkgICAgICAgU09MT19TWVNfQ0ZHX0ZFRURCQUNLRElWKChTT0xPX0NMT0NLX01IWiAqIDIpIC0gMikgfAorCQkgICAgICAgU09MT19TWVNfQ0ZHX09VVERJVigzKSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVElNRVJfQ0xPQ0tfTlVNLCBTT0xPX0NMT0NLX01IWiAtIDEpOworCisJLyogUExMIGxvY2tpbmcgdGltZSBvZiAxbXMgKi8KKwltZGVsYXkoMSk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNvbG82MDEwX2lzciwgSVJRRl9TSEFSRUQsIFNPTE82MDEwX05BTUUsCisJCQkgIHNvbG9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfcHJvYmU7CisKKwkvKiBIYW5kbGUgdGhpcyBmcm9tIHRoZSBzdGFydCAqLworCXNvbG82MDEwX2lycV9vbihzb2xvX2RldiwgU09MT19JUlFfUENJX0VSUik7CisKKwlpZiAoKHJldCA9IHNvbG9faTJjX2luaXQoc29sb19kZXYpKSkKKwkJZ290byBmYWlsX3Byb2JlOworCisJLyogU2V0dXAgdGhlIERNQSBlbmdpbmUgKi8KKwlzZHJhbSA9IChzb2xvX2Rldi0+bnJfY2hhbnMgPj0gOCkgPyAyIDogMTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19ETUFfQ1RSTCwKKwkJICAgICAgIFNPTE9fRE1BX0NUUkxfUkVGUkVTSF9DWUNMRSgxKSB8CisJCSAgICAgICBTT0xPX0RNQV9DVFJMX1NEUkFNX1NJWkUoc2RyYW0pIHwKKwkJICAgICAgIFNPTE9fRE1BX0NUUkxfU0RSQU1fQ0xLX0lOVkVSVCB8CisJCSAgICAgICBTT0xPX0RNQV9DVFJMX1JFQURfQ0xLX1NFTEVDVCB8CisJCSAgICAgICBTT0xPX0RNQV9DVFJMX0xBVEVOQ1koMSkpOworCisJaWYgKChyZXQgPSBzb2xvX3AybV9pbml0KHNvbG9fZGV2KSkpCisJCWdvdG8gZmFpbF9wcm9iZTsKKworCWlmICgocmV0ID0gc29sb19kaXNwX2luaXQoc29sb19kZXYpKSkKKwkJZ290byBmYWlsX3Byb2JlOworCisJaWYgKChyZXQgPSBzb2xvX2dwaW9faW5pdChzb2xvX2RldikpKQorCQlnb3RvIGZhaWxfcHJvYmU7CisKKwlpZiAoKHJldCA9IHNvbG9fdHcyOF9pbml0KHNvbG9fZGV2KSkpCisJCWdvdG8gZmFpbF9wcm9iZTsKKworCWlmICgocmV0ID0gc29sb192NGwyX2luaXQoc29sb19kZXYpKSkKKwkJZ290byBmYWlsX3Byb2JlOworCisJaWYgKChyZXQgPSBzb2xvX2VuY19pbml0KHNvbG9fZGV2KSkpCisJCWdvdG8gZmFpbF9wcm9iZTsKKworCWlmICgocmV0ID0gc29sb19lbmNfdjRsMl9pbml0KHNvbG9fZGV2KSkpCisJCWdvdG8gZmFpbF9wcm9iZTsKKworCWlmICgocmV0ID0gc29sb19nNzIzX2luaXQoc29sb19kZXYpKSkKKwkJZ290byBmYWlsX3Byb2JlOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcHJvYmU6CisJZnJlZV9zb2xvX2Rldihzb2xvX2Rldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNvbG82MDEwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX3NvbG9fZGV2KHNvbG9fZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNvbG82MDEwX2lkX3RhYmxlW10gPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TT0ZUTE9HSUMsIFBDSV9ERVZJQ0VfSURfU09MTzYwMTApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfTkVVU09MT180KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX05FVVNPTE9fOSl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9ORVVTT0xPXzE2KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzQpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fOSl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9DT01NU09MT18xNil9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzb2xvNjAxMF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzb2xvNjAxMF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gU09MTzYwMTBfTkFNRSwKKwkuaWRfdGFibGUgPSBzb2xvNjAxMF9pZF90YWJsZSwKKwkucHJvYmUgPSBzb2xvNjAxMF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IHNvbG82MDEwX3BjaV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb2xvNjAxMF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzb2xvNjAxMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNvbG82MDEwX21vZHVsZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzb2xvNjAxMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc29sbzYwMTBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoc29sbzYwMTBfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWRpc3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1kaXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ZjAyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1kaXNwLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZWNoZXJyeSwgTExDIHd3dy5ibHVlY2hlcnJ5ZHZyLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC5oIgorCisjZGVmaW5lIFNPTE9fVkNMS19ERUxBWQkJCTMKKyNkZWZpbmUgU09MT19QUk9HUkVTU0lWRV9WU0laRQkJMTAyNAorCisjZGVmaW5lIFNPTE9fTU9UX1RIUkVTSF9XCQk2NAorI2RlZmluZSBTT0xPX01PVF9USFJFU0hfSAkJNjQKKyNkZWZpbmUgU09MT19NT1RfVEhSRVNIX1NJWkUJCTgxOTIKKyNkZWZpbmUgU09MT19NT1RfVEhSRVNIX1JFQUwJCShTT0xPX01PVF9USFJFU0hfVyAqIFNPTE9fTU9UX1RIUkVTSF9IKQorI2RlZmluZSBTT0xPX01PVF9GTEFHX1NJWkUJCTUxMgorI2RlZmluZSBTT0xPX01PVF9GTEFHX0FSRUEJCShTT0xPX01PVF9GTEFHX1NJWkUgKiAzMikKKworc3RhdGljIHVuc2lnbmVkIHZpZGVvX3R5cGU7Cittb2R1bGVfcGFyYW0odmlkZW9fdHlwZSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX3R5cGUsICJ2aWRlb190eXBlICgwID0gTlRTQy9EZWZhdWx0LCAxID0gUEFMKSIpOworCitzdGF0aWMgdm9pZCBzb2xvX3Zpbl9jb25maWcoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sb19kZXYtPnZpbl9oc3RhcnQgPSA4OworCXNvbG9fZGV2LT52aW5fdnN0YXJ0ID0gMjsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1NZU19WQ0xLLAorCQkgICAgICAgU09MT19WQ0xLX1NFTEVDVCgyKSB8CisJCSAgICAgICBTT0xPX1ZDTEtfVklOMTQxNV9ERUxBWShTT0xPX1ZDTEtfREVMQVkpIHwKKwkJICAgICAgIFNPTE9fVkNMS19WSU4xMjEzX0RFTEFZKFNPTE9fVkNMS19ERUxBWSkgfAorCQkgICAgICAgU09MT19WQ0xLX1ZJTjEwMTFfREVMQVkoU09MT19WQ0xLX0RFTEFZKSB8CisJCSAgICAgICBTT0xPX1ZDTEtfVklOMDgwOV9ERUxBWShTT0xPX1ZDTEtfREVMQVkpIHwKKwkJICAgICAgIFNPTE9fVkNMS19WSU4wNjA3X0RFTEFZKFNPTE9fVkNMS19ERUxBWSkgfAorCQkgICAgICAgU09MT19WQ0xLX1ZJTjA0MDVfREVMQVkoU09MT19WQ0xLX0RFTEFZKSB8CisJCSAgICAgICBTT0xPX1ZDTEtfVklOMDIwM19ERUxBWShTT0xPX1ZDTEtfREVMQVkpIHwKKwkJICAgICAgIFNPTE9fVkNMS19WSU4wMDAxX0RFTEFZKFNPTE9fVkNMS19ERUxBWSkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfQUNUX0lfUCwKKwkJICAgICAgIFNPTE9fVklfSF9TVEFSVChzb2xvX2Rldi0+dmluX2hzdGFydCkgfAorCQkgICAgICAgU09MT19WSV9WX1NUQVJUKHNvbG9fZGV2LT52aW5fdnN0YXJ0KSB8CisJCSAgICAgICBTT0xPX1ZJX1ZfU1RPUChzb2xvX2Rldi0+dmluX3ZzdGFydCArCisJCQkJICAgICAgc29sb19kZXYtPnZpZGVvX3ZzaXplKSk7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9BQ1RfSV9TLAorCQkgICAgICAgU09MT19WSV9IX1NUQVJUKHNvbG9fZGV2LT52b3V0X2hzdGFydCkgfAorCQkgICAgICAgU09MT19WSV9WX1NUQVJUKHNvbG9fZGV2LT52b3V0X3ZzdGFydCkgfAorCQkgICAgICAgU09MT19WSV9WX1NUT1Aoc29sb19kZXYtPnZvdXRfdnN0YXJ0ICsKKwkJCQkgICAgICBzb2xvX2Rldi0+dmlkZW9fdnNpemUpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX0FDVF9QLAorCQkgICAgICAgU09MT19WSV9IX1NUQVJUKDApIHwKKwkJICAgICAgIFNPTE9fVklfVl9TVEFSVCgxKSB8CisJCSAgICAgICBTT0xPX1ZJX1ZfU1RPUChTT0xPX1BST0dSRVNTSVZFX1ZTSVpFKSk7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9DSF9GT1JNQVQsCisJCSAgICAgICBTT0xPX1ZJX0ZEX1NFTF9NQVNLKDApIHwgU09MT19WSV9QUk9HX01BU0soMCkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfRk1UX0NGRywgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfUEFHRV9TVywgMik7CisKKwlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKSB7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1BCX0NPTkZJRywKKwkJCSAgICAgICBTT0xPX1ZJX1BCX1VTRVJfTU9ERSk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1BCX1JBTkdFX0hWLAorCQkJICAgICAgIFNPTE9fVklfUEJfSFNJWkUoODU4KSB8IFNPTE9fVklfUEJfVlNJWkUoMjQ2KSk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1BCX0FDVF9WLAorCQkJICAgICAgIFNPTE9fVklfUEJfVlNUQVJUKDQpIHwKKwkJCSAgICAgICBTT0xPX1ZJX1BCX1ZTVE9QKDQgKyAyNDApKTsKKwl9IGVsc2UgeworCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9QQl9DT05GSUcsCisJCQkgICAgICAgU09MT19WSV9QQl9VU0VSX01PREUgfCBTT0xPX1ZJX1BCX1BBTCk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1BCX1JBTkdFX0hWLAorCQkJICAgICAgIFNPTE9fVklfUEJfSFNJWkUoODY0KSB8IFNPTE9fVklfUEJfVlNJWkUoMjk0KSk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1BCX0FDVF9WLAorCQkJICAgICAgIFNPTE9fVklfUEJfVlNUQVJUKDQpIHwKKwkJCSAgICAgICBTT0xPX1ZJX1BCX1ZTVE9QKDQgKyAyODgpKTsKKwl9CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfUEJfQUNUX0gsIFNPTE9fVklfUEJfSFNUQVJUKDE2KSB8CisJCSAgICAgICBTT0xPX1ZJX1BCX0hTVE9QKDE2ICsgNzIwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fZGlzcF9jb25maWcoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sb19kZXYtPnZvdXRfaHN0YXJ0ID0gNjsKKwlzb2xvX2Rldi0+dm91dF92c3RhcnQgPSA4OworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQk9SREVSX0xJTkVfQ09MT1IsCisJCSAgICAgICAoMHhhMCA8PCAyNCkgfCAoMHg4OCA8PCAxNikgfCAoMHhhMCA8PCA4KSB8IDB4ODgpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZPX0JPUkRFUl9GSUxMX0NPTE9SLAorCQkgICAgICAgKDB4MTAgPDwgMjQpIHwgKDB4OGYgPDwgMTYpIHwgKDB4MTAgPDwgOCkgfCAweDhmKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19CS0dfQ09MT1IsCisJCSAgICAgICAoMTYgPDwgMjQpIHwgKDEyOCA8PCAxNikgfCAoMTYgPDwgOCkgfCAxMjgpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fRk1UX0VOQywKKwkJICAgICAgIHNvbG9fZGV2LT52aWRlb190eXBlIHwKKwkJICAgICAgIFNPTE9fVk9fVVNFUl9DT0xPUl9TRVRfTkFWIHwKKwkJICAgICAgIFNPTE9fVk9fTkFfQ09MT1JfWSgwKSB8CisJCSAgICAgICBTT0xPX1ZPX05BX0NPTE9SX0NCKDApIHwKKwkJICAgICAgIFNPTE9fVk9fTkFfQ09MT1JfQ1IoMCkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQUNUX0gsCisJCSAgICAgICBTT0xPX1ZPX0hfU1RBUlQoc29sb19kZXYtPnZvdXRfaHN0YXJ0KSB8CisJCSAgICAgICBTT0xPX1ZPX0hfU1RPUChzb2xvX2Rldi0+dm91dF9oc3RhcnQgKworCQkJCSAgICAgIHNvbG9fZGV2LT52aWRlb19oc2l6ZSkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQUNUX1YsCisJCSAgICAgICBTT0xPX1ZPX1ZfU1RBUlQoc29sb19kZXYtPnZvdXRfdnN0YXJ0KSB8CisJCSAgICAgICBTT0xPX1ZPX1ZfU1RPUChzb2xvX2Rldi0+dm91dF92c3RhcnQgKworCQkJCSAgICAgIHNvbG9fZGV2LT52aWRlb192c2l6ZSkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkFOR0VfSFYsCisJCSAgICAgICBTT0xPX1ZPX0hfTEVOKHNvbG9fZGV2LT52aWRlb19oc2l6ZSkgfAorCQkgICAgICAgU09MT19WT19WX0xFTihzb2xvX2Rldi0+dmlkZW9fdnNpemUpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1dJTl9TVywgNSk7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19ESVNQX0NUUkwsIFNPTE9fVk9fRElTUF9PTiB8CisJCSAgICAgICBTT0xPX1ZPX0RJU1BfRVJBU0VfQ09VTlQoOCkgfAorCQkgICAgICAgU09MT19WT19ESVNQX0JBU0UoU09MT19ESVNQX0VYVF9BRERSKHNvbG9fZGV2KSkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fRElTUF9FUkFTRSwgU09MT19WT19ESVNQX0VSQVNFX09OKTsKKworCS8qIEVuYWJsZSBjaGFubmVscyB3ZSBzdXBwb3J0ICovCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfQ0hfRU5BLCAoMSA8PCBzb2xvX2Rldi0+bnJfY2hhbnMpIC0gMSk7CisKKwkvKiBEaXNhYmxlIHRoZSB3YXRjaGRvZyAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1dBVENIRE9HLCAwKTsKK30KKworc3RhdGljIGludCBzb2xvX2RtYV92aW5fcmVnaW9uKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1MzIgb2ZmLAorCQkJICAgICAgIHUxNiB2YWwsIGludCByZWdfc2l6ZSkKK3sKKwl1MTYgYnVmWzY0XTsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKSA+PiAxOyBpKyspCisJCWJ1ZltpXSA9IHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCByZWdfc2l6ZTsgaSArPSBzaXplb2YoYnVmKSkKKwkJcmV0IHw9IHNvbG9fcDJtX2RtYShzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX1ZJTiwgMSwgYnVmLAorCQkJCSAgICBTT0xPX01PVElPTl9FWFRfQUREUihzb2xvX2RldikgKyBvZmYgKyBpLAorCQkJCSAgICBzaXplb2YoYnVmKSk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLCB1MTYgdmFsKQoreworCWlmIChjaCA+IHNvbG9fZGV2LT5ucl9jaGFucykKKwkJcmV0dXJuOworCisJc29sb19kbWFfdmluX3JlZ2lvbihzb2xvX2RldiwgU09MT19NT1RfRkxBR19BUkVBICsKKwkJCSAgICAoY2ggKiBTT0xPX01PVF9USFJFU0hfU0laRSAqIDIpLAorCQkJICAgIHZhbCwgU09MT19NT1RfVEhSRVNIX1JFQUwpOworfQorCisvKiBGaXJzdCA4ayBpcyBtb3Rpb24gZmxhZyAoNTEyIGJ5dGVzICogMTYpLiBGb2xsb3dpbmcgdGhhdCBpcyBhbiA4ays4aworICogdGhyZXNob2xkIGFuZCB3b3JraW5nIHRhYmxlIGZvciBlYWNoIGNoYW5uZWwuIEF0bGVhc3QgdGhhdCdzIHdoYXQgdGhlCisgKiBzcGVjIHNheXMuIEhvd2V2ZXIsIHRoaXMgY29kZSAodGFrZSBmcm9tIHJkaykgaGFzIHNvbWUgbXlzdGVyeSA4aworICogYmxvY2sgcmlnaHQgYWZ0ZXIgdGhlIGZsYWcgYXJlYSwgYmVmb3JlIHRoZSBmaXJzdCB0aHJlc2ggdGFibGUuICovCitzdGF0aWMgdm9pZCBzb2xvX21vdGlvbl9jb25maWcoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPm5yX2NoYW5zOyBpKyspIHsKKwkJLyogQ2xlYXIgbW90aW9uIGZsYWcgYXJlYSAqLworCQlzb2xvX2RtYV92aW5fcmVnaW9uKHNvbG9fZGV2LCBpICogU09MT19NT1RfRkxBR19TSVpFLCAweDAwMDAsCisJCQkJICAgIFNPTE9fTU9UX0ZMQUdfU0laRSk7CisKKwkJLyogQ2xlYXIgd29ya2luZyBjYWNoZSB0YWJsZSAqLworCQlzb2xvX2RtYV92aW5fcmVnaW9uKHNvbG9fZGV2LCBTT0xPX01PVF9GTEFHX0FSRUEgKworCQkJCSAgICBTT0xPX01PVF9USFJFU0hfU0laRSArCisJCQkJICAgIChpICogU09MT19NT1RfVEhSRVNIX1NJWkUgKiAyKSwKKwkJCQkgICAgMHgwMDAwLCBTT0xPX01PVF9USFJFU0hfUkVBTCk7CisKKwkJLyogU2V0IGRlZmF1bHQgdGhyZXNob2xkIHRhYmxlICovCisJCXNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc29sb19kZXYsIGksIFNPTE9fREVGX01PVF9USFJFU0gpOworCX0KKworCS8qIERlZmF1bHQgbW90aW9uIHNldHRpbmdzICovCisgICAgICAgIHNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVF9BRFIsIFNPTE9fVklfTU9USU9OX0VOKDApIHwKKwkJICAgICAgIChTT0xPX01PVElPTl9FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RfQ1RSTCwKKwkJICAgICAgIFNPTE9fVklfTU9USU9OX0ZSQU1FX0NPVU5UKDMpIHwKKwkJICAgICAgIFNPTE9fVklfTU9USU9OX1NBTVBMRV9MRU5HVEgoc29sb19kZXYtPnZpZGVvX2hzaXplIC8gMTYpCisJCSAgICAgICB8IC8vU09MT19WSV9NT1RJT05fSU5UUl9TVEFSVF9TVE9QIHwKKwkJICAgICAgIFNPTE9fVklfTU9USU9OX1NBTVBMRV9DT1VOVCgxMCkpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9USU9OX0JPUkRFUiwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9USU9OX0JBUiwgMCk7Cit9CisKK2ludCBzb2xvX2Rpc3BfaW5pdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwlpbnQgaTsKKworCXNvbG9fZGV2LT52aWRlb19oc2l6ZSA9IDcwNDsKKwlpZiAodmlkZW9fdHlwZSA9PSAwKSB7CisJCXNvbG9fZGV2LT52aWRlb190eXBlID0gU09MT19WT19GTVRfVFlQRV9OVFNDOworCQlzb2xvX2Rldi0+dmlkZW9fdnNpemUgPSAyNDA7CisJCXNvbG9fZGV2LT5mcHMgPSAzMDsKKwl9IGVsc2UgeworCQlzb2xvX2Rldi0+dmlkZW9fdHlwZSA9IFNPTE9fVk9fRk1UX1RZUEVfUEFMOworCQlzb2xvX2Rldi0+dmlkZW9fdnNpemUgPSAyODg7CisJCXNvbG9fZGV2LT5mcHMgPSAyNTsKKwl9CisKKwlzb2xvX3Zpbl9jb25maWcoc29sb19kZXYpOworCXNvbG9fbW90aW9uX2NvbmZpZyhzb2xvX2Rldik7CisJc29sb19kaXNwX2NvbmZpZyhzb2xvX2Rldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPm5yX2NoYW5zOyBpKyspCisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1dJTl9PTihpKSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzb2xvX2Rpc3BfZXhpdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwlpbnQgaTsKKworCXNvbG82MDEwX2lycV9vZmYoc29sb19kZXYsIFNPTE9fSVJRX01PVElPTik7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19ESVNQX0NUUkwsIDApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZPX1pPT01fQ1RSTCwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fRlJFRVpFX0NUUkwsIDApOworCisJZm9yIChpID0gMDsgaSA8IHNvbG9fZGV2LT5ucl9jaGFuczsgaSsrKSB7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1dJTl9DVFJMMChpKSwgMCk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1dJTl9DVFJMMShpKSwgMCk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1dJTl9PTihpKSwgMCk7CisJfQorCisJLyogU2V0IGRlZmF1bHQgYm9yZGVyICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQk9SREVSX1goaSksIDApOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQk9SREVSX1koaSksIDApOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQk9SREVSX0xJTkVfTUFTSywgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fQk9SREVSX0ZJTExfTUFTSywgMCk7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfQ1RSTCgwKSwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUQVJUKDApLCAwKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfU1RPUCgwKSwgMCk7CisJCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX0NUUkwoMSksIDApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZPX1JFQ1RBTkdMRV9TVEFSVCgxKSwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUT1AoMSksIDApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWVuYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Y2YwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZW5jLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZWNoZXJyeSwgTExDIHd3dy5ibHVlY2hlcnJ5ZHZyLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgInNvbG82MDEwLmgiCisjaW5jbHVkZSAic29sbzYwMTAtb3NkLWZvbnQuaCIKKworI2RlZmluZSBDQVBUVVJFX01BWF9CQU5EV0lEVEgJCTMyCS8vIEQxIDRjaGFubmVsIChEMSA9PSA0KQorI2RlZmluZSBPU0dfQlVGRkVSX1NJWkUJCQkxMDI0CisKKyNkZWZpbmUgVklfUFJPR19IU0laRQkJCSgxMjgwIC0gMTYpCisjZGVmaW5lIFZJX1BST0dfVlNJWkUJCQkoMTAyNCAtIDE2KQorCitzdGF0aWMgdm9pZCBzb2xvX2NhcHR1cmVfY29uZmlnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgaGVpZ2h0OworCXVuc2lnbmVkIGxvbmcgd2lkdGg7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0JBU0UsCisJCSAgICAgICBTT0xPX0NBUF9NQVhfUEFHRShTT0xPX0NBUF9FWFRfTUFYX1BBR0UgKgorCQkJCQkgc29sb19kZXYtPm5yX2NoYW5zKSB8CisJCSAgICAgICBTT0xPX0NBUF9CQVNFX0FERFIoU09MT19DQVBfRVhUX0FERFIoc29sb19kZXYpID4+IDE2KSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0JUVywKKwkJICAgICAgICgxIDw8IDE3KSB8IFNPTE9fQ0FQX1BST0dfQkFORFdJRFRIKDIpIHwKKwkJICAgICAgIFNPTE9fQ0FQX01BWF9CQU5EV0lEVEgoQ0FQVFVSRV9NQVhfQkFORFdJRFRIKSk7CisKKwkvKiBTZXQgc2NhbGUgMSwgOSBkaW1lbnNpb24gKi8KKwl3aWR0aCA9IHNvbG9fZGV2LT52aWRlb19oc2l6ZTsKKwloZWlnaHQgPSBzb2xvX2Rldi0+dmlkZW9fdnNpemU7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fRElNX1NDQUxFMSwKKwkJICAgICAgIFNPTE9fRElNX0hfTUJfTlVNKHdpZHRoIC8gMTYpIHwKKwkJICAgICAgIFNPTE9fRElNX1ZfTUJfTlVNX0ZSQU1FKGhlaWdodCAvIDgpIHwKKwkJICAgICAgIFNPTE9fRElNX1ZfTUJfTlVNX0ZJRUxEKGhlaWdodCAvIDE2KSk7CisKKwkvKiBTZXQgc2NhbGUgMiwgMTAgZGltZW5zaW9uICovCisJd2lkdGggPSBzb2xvX2Rldi0+dmlkZW9faHNpemUgLyAyOworCWhlaWdodCA9IHNvbG9fZGV2LT52aWRlb192c2l6ZTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19ESU1fU0NBTEUyLAorCQkgICAgICAgU09MT19ESU1fSF9NQl9OVU0od2lkdGggLyAxNikgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRlJBTUUoaGVpZ2h0IC8gOCkgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRklFTEQoaGVpZ2h0IC8gMTYpKTsKKworCS8qIFNldCBzY2FsZSAzLCAxMSBkaW1lbnNpb24gKi8KKwl3aWR0aCA9IHNvbG9fZGV2LT52aWRlb19oc2l6ZSAvIDI7CisJaGVpZ2h0ID0gc29sb19kZXYtPnZpZGVvX3ZzaXplIC8gMjsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19ESU1fU0NBTEUzLAorCQkgICAgICAgU09MT19ESU1fSF9NQl9OVU0od2lkdGggLyAxNikgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRlJBTUUoaGVpZ2h0IC8gOCkgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRklFTEQoaGVpZ2h0IC8gMTYpKTsKKworCS8qIFNldCBzY2FsZSA0LCAxMiBkaW1lbnNpb24gKi8KKwl3aWR0aCA9IHNvbG9fZGV2LT52aWRlb19oc2l6ZSAvIDM7CisJaGVpZ2h0ID0gc29sb19kZXYtPnZpZGVvX3ZzaXplIC8gMzsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19ESU1fU0NBTEU0LAorCQkgICAgICAgU09MT19ESU1fSF9NQl9OVU0od2lkdGggLyAxNikgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRlJBTUUoaGVpZ2h0IC8gOCkgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRklFTEQoaGVpZ2h0IC8gMTYpKTsKKworCS8qIFNldCBzY2FsZSA1LCAxMyBkaW1lbnNpb24gKi8KKwl3aWR0aCA9IHNvbG9fZGV2LT52aWRlb19oc2l6ZSAvIDQ7CisJaGVpZ2h0ID0gc29sb19kZXYtPnZpZGVvX3ZzaXplIC8gMjsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19ESU1fU0NBTEU1LAorCQkgICAgICAgU09MT19ESU1fSF9NQl9OVU0od2lkdGggLyAxNikgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRlJBTUUoaGVpZ2h0IC8gOCkgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRklFTEQoaGVpZ2h0IC8gMTYpKTsKKworCS8qIFByb2dyZXNzaXZlICovCisJd2lkdGggPSBWSV9QUk9HX0hTSVpFOworCWhlaWdodCA9IFZJX1BST0dfVlNJWkU7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fRElNX1BST0csCisJCSAgICAgICBTT0xPX0RJTV9IX01CX05VTSh3aWR0aCAvIDE2KSB8CisJCSAgICAgICBTT0xPX0RJTV9WX01CX05VTV9GUkFNRShoZWlnaHQgLyAxNikgfAorCQkgICAgICAgU09MT19ESU1fVl9NQl9OVU1fRklFTEQoaGVpZ2h0IC8gMTYpKTsKKworCS8qIENsZWFyIE9TRCAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX09TRF9DSCwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfT1NEX0JBU0UsCisJCSAgICAgICBTT0xPX0VPU0RfRVhUX0FERFIoc29sb19kZXYpID4+IDE2KTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9PU0RfQ0xSLAorCQkgICAgICAgMHhGMCA8PCAxNiB8IDB4ODAgPDwgOCB8IDB4ODApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX09TRF9PUFQsIDApOworCisJLyogQ2xlYXIgT1NHIGJ1ZmZlciAqLworCWJ1ZiA9IGt6YWxsb2MoT1NHX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHNvbG9fZGV2LT5ucl9jaGFuczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBTT0xPX0VPU0RfRVhUX1NJWkU7IGogKz0gT1NHX0JVRkZFUl9TSVpFKSB7CisJCQlzb2xvX3AybV9kbWEoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAxLCBidWYsCisJCQkJICAgICBTT0xPX0VPU0RfRVhUX0FERFIoc29sb19kZXYpICsKKwkJCQkgICAgIChpICogU09MT19FT1NEX0VYVF9TSVpFKSArIGosCisJCQkJICAgICBPU0dfQlVGRkVSX1NJWkUpOworCQl9CisJfQorCWtmcmVlKGJ1Zik7Cit9CisKK2ludCBzb2xvX29zZF9wcmludChzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYykKK3sKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fZW5jLT5zb2xvX2RldjsKKwljaGFyICpzdHIgPSBzb2xvX2VuYy0+b3NkX3RleHQ7CisJdTggKmJ1ZjsKKwl1MzIgcmVnID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19WRV9PU0RfQ0gpOworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwlpbnQgaSwgajsKKwlpbnQgeCA9IDEsIHkgPSAxOworCisJaWYgKGxlbiA9PSAwKSB7CisJCXJlZyAmPSB+KDEgPDwgc29sb19lbmMtPmNoKTsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfT1NEX0NILCByZWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlidWYgPSBremFsbG9jKFNPTE9fRU9TRF9FWFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlidWZbKGoqMikgKyAoaSUyKSArICgoeCArIChpLzIpKSAqIDMyKSArICh5ICogMjA0OCldID0KKwkJCQkoc29sb19vc2RfZm9udFsoc3RyW2ldICogNCkgKyAoaiAvIDQpXQorCQkJCQk+PiAoKDMgLSAoaiAlIDQpKSAqIDgpKSAmIDB4ZmY7CisJCX0KKwl9CisKKwlzb2xvX3AybV9kbWEoc29sb19kZXYsIDAsIDEsIGJ1ZiwgU09MT19FT1NEX0VYVF9BRERSKHNvbG9fZGV2KSArCisJCSAgICAgKHNvbG9fZW5jLT5jaCAqIFNPTE9fRU9TRF9FWFRfU0laRSksIFNPTE9fRU9TRF9FWFRfU0laRSk7CisgICAgICAgIHJlZyB8PSAoMSA8PCBzb2xvX2VuYy0+Y2gpOworICAgICAgICBzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9PU0RfQ0gsIHJlZyk7CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fanBlZ19jb25maWcoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfSlBFR19RUF9UQkwsCisJCSAgICAgICAoMiA8PCAyNCkgfCAoMiA8PCAxNikgfCAoMiA8PCA4KSB8ICgyIDw8IDApKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9KUEVHX1FQX0NIX0wsIDApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0pQRUdfUVBfQ0hfSCwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfSlBFR19DRkcsCisJCShTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpICYgMHhmZmZmMDAwMCkgfAorCQkoKFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgPj4gMTYpICYgMHgwMDAwZmZmZikpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0pQRUdfQ1RSTCwgMHhmZmZmZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fbXA0ZV9jb25maWcoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisKKwkvKiBXZSBjYW4gb25seSB1c2UgVkVfSU5UUl9DVFJMKDApIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBtanBlZyAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NGRzAsCisJCSAgICAgICBTT0xPX1ZFX0lOVFJfQ1RSTCgwKSB8CisJCSAgICAgICBTT0xPX1ZFX0JMT0NLX1NJWkUoU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSA+PiAxNikgfAorCQkgICAgICAgU09MT19WRV9CTE9DS19CQVNFKFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NGRzEsCisJCSAgICAgICBTT0xPX1ZFX0JZVEVfQUxJR04oMikgfAorCQkgICAgICAgU09MT19WRV9JTlNFUlRfSU5ERVggfCBTT0xPX1ZFX01PVElPTl9NT0RFKDApKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX1dNUktfUE9MWSwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfVk1SS19JTklUX0tFWSwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfV01SS19TVFJMLCAwKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9FTkNSWVBfUE9MWSwgMCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfRU5DUllQX0lOSVQsIDApOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfQVRUUiwKKwkJICAgICAgIFNPTE9fVkVfTElUVExFX0VORElBTiB8CisJCSAgICAgICBTT0xPX0NPTVBfQVRUUl9GQ09ERSgxKSB8CisJCSAgICAgICBTT0xPX0NPTVBfVElNRV9JTkMoMCkgfAorCQkgICAgICAgU09MT19DT01QX1RJTUVfV0lEVEgoMTUpIHwKKwkJICAgICAgIFNPTE9fRENUX0lOVEVSVkFMKDM2IC8gNCkpOworCisJZm9yIChpID0gMDsgaSA8IHNvbG9fZGV2LT5ucl9jaGFuczsgaSsrKQorCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9DSF9SRUZfQkFTRShpKSwKKwkJCSAgICAgICAoU09MT19FUkVGX0VYVF9BRERSKHNvbG9fZGV2KSArCisJCQkgICAgICAgKGkgKiBTT0xPX0VSRUZfRVhUX1NJWkUpKSA+PiAxNik7Cit9CisKK2ludCBzb2xvX2VuY19pbml0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCWludCBpOworCisJc29sb19jYXB0dXJlX2NvbmZpZyhzb2xvX2Rldik7CisJc29sb19tcDRlX2NvbmZpZyhzb2xvX2Rldik7CisJc29sb19qcGVnX2NvbmZpZyhzb2xvX2Rldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPm5yX2NoYW5zOyBpKyspIHsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX1NDQUxFKGkpLCAwKTsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX0NPTVBfRU5BX0UoaSksIDApOworCX0KKworCXNvbG82MDEwX2lycV9vbihzb2xvX2RldiwgU09MT19JUlFfRU5DT0RFUik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzb2xvX2VuY19leGl0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCWludCBpOworCisJc29sbzYwMTBfaXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRU5DT0RFUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPm5yX2NoYW5zOyBpKyspIHsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX1NDQUxFKGkpLCAwKTsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX0NPTVBfRU5BX0UoaSksIDApOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1nNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mjg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEJsdWVjaGVycnksIExMQyB3d3cuYmx1ZWNoZXJyeWR2ci5jb20KKyAqIENvcHlyaWdodCAoQykgMjAxMCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAYmx1ZWNoZXJyeS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC5oIgorI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKKworI2RlZmluZSBHNzIzX0lOVFJfT1JERVIJCTAKKyNkZWZpbmUgRzcyM19GRE1BX1BBR0VTCQkzMgorI2RlZmluZSBHNzIzX1BFUklPRF9CWVRFUwk0OAorI2RlZmluZSBHNzIzX1BFUklPRF9CTE9DSwkxMDI0CisjZGVmaW5lIEc3MjNfRlJBTUVTX1BFUl9QQUdFCTQ4CisKKy8qIFNldHMgdXAgY2hhbm5lbHMgMTYtMTkgZm9yIGRlY29kaW5nIGFuZCAwLTE1IGZvciBlbmNvZGluZyAqLworI2RlZmluZSBPVVRNT0RFX01BU0sJCTB4MzAwCisKKyNkZWZpbmUgU0FNUExFUkFURQkJODAwMAorI2RlZmluZSBCSVRSQVRFCQkJMjUKKworLyogVGhlIHNvbG8gd3JpdGVzIHRvIDFrIGJ5dGUgcGFnZXMsIDMyIHBhZ2VzLCBpbiB0aGUgZG1hLiBFYWNoIDFrIHBhZ2UKKyAqIGlzIGJyb2tlbiBkb3duIHRvIDIwICogNDggYnl0ZSByZWdpb25zIChvbmUgZm9yIGVhY2ggY2hhbm5lbCBwb3NzaWJsZSkKKyAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgYmVpbmcgZHVtbXkgZGF0YS4gKi8KKyNkZWZpbmUgTUFYX0JVRkZFUgkJKEc3MjNfUEVSSU9EX0JZVEVTICogUEVSSU9EU19NQVgpCisjZGVmaW5lIElSUV9QQUdFUwkJNCAvLyAwIC0gNAorI2RlZmluZSBQRVJJT0RTX01JTgkJKDEgPDwgSVJRX1BBR0VTKQorI2RlZmluZSBQRVJJT0RTX01BWAkJRzcyM19GRE1BX1BBR0VTCisKK3N0cnVjdCBzb2xvX3NuZF9wY20geworCWludAkJCQlvbjsKKwlzcGlubG9ja190CQkJbG9jazsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2CQkqc29sb19kZXY7CisJdW5zaWduZWQgY2hhcgkJCWc3MjNfYnVmW0c3MjNfUEVSSU9EX0JZVEVTXTsKK307CisKK3N0YXRpYyB2b2lkIHNvbG9fZzcyM19jb25maWcoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGNsa19kaXY7CisKKwljbGtfZGl2ID0gU09MT19DTE9DS19NSFogLyAoU0FNUExFUkFURSAqIChCSVRSQVRFICogMikgKiAyKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX1NBTVBMRSwKKwkJICAgICAgIFNPTE9fQVVESU9fQklUUkFURShCSVRSQVRFKSB8CisJCSAgICAgICBTT0xPX0FVRElPX0NMS19ESVYoY2xrX2RpdikpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQVVESU9fRkRNQV9JTlRSLAorCQkgICAgICBTT0xPX0FVRElPX0ZETUFfSU5URVJWQUwoSVJRX1BBR0VTKSB8CisJCSAgICAgIFNPTE9fQVVESU9fSU5UUl9PUkRFUihHNzIzX0lOVFJfT1JERVIpIHwKKwkJICAgICAgU09MT19BVURJT19GRE1BX0JBU0UoU09MT19HNzIzX0VYVF9BRERSKHNvbG9fZGV2KSA+PiAxNikpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQVVESU9fQ09OVFJPTCwKKwkJICAgICAgIFNPTE9fQVVESU9fRU5BQkxFIHwgU09MT19BVURJT19JMlNfTU9ERSB8CisJCSAgICAgICBTT0xPX0FVRElPX0kyU19NVUxUSSgzKSB8IFNPTE9fQVVESU9fTU9ERShPVVRNT0RFX01BU0spKTsKK30KKwordm9pZCBzb2xvX2c3MjNfaXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9CisJCSZzb2xvX2Rldi0+c25kX3BjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3M7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfRzcyMyk7CisKKwlmb3IgKHNzID0gcHN0ci0+c3Vic3RyZWFtOyBzcyAhPSBOVUxMOyBzcyA9IHNzLT5uZXh0KSB7CisJCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogVGhpcyBtZWFucyBvcGVuKCkgaGFzbid0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb25lICovCisJCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBzb2xvX2RldikKKwkJCWNvbnRpbnVlOworCisJCS8qIEhhdmVuJ3QgdHJpZ2dlcmVkIGEgc3RhcnQgeWV0ICovCisJCXNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJCWlmICghc29sb19wY20tPm9uKQorCQkJY29udGludWU7CisKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzcyk7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzcywgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfc29sb19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3MpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3NvbG9fcGNtX2h3ID0geworCS5pbmZvCQkJPSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1U4LAorCS5yYXRlcwkJCT0gU05EUlZfUENNX1JBVEVfODAwMCwKKwkucmF0ZV9taW4JCT0gODAwMCwKKwkucmF0ZV9tYXgJCT0gODAwMCwKKwkuY2hhbm5lbHNfbWluCQk9IDEsCisJLmNoYW5uZWxzX21heAkJPSAxLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gTUFYX0JVRkZFUiwKKwkucGVyaW9kX2J5dGVzX21pbgk9IEc3MjNfUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gRzcyM19QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluCQk9IFBFUklPRFNfTUlOLAorCS5wZXJpb2RzX21heAkJPSBQRVJJT0RTX01BWCwKK307CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKK3sKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3MpOworCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtOworCisJc29sb19wY20gPSBremFsbG9jKHNpemVvZigqc29sb19wY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoc29sb19wY20gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmc29sb19wY20tPmxvY2spOworCXNvbG9fcGNtLT5zb2xvX2RldiA9IHNvbG9fZGV2OworCXNzLT5ydW50aW1lLT5odyA9IHNuZF9zb2xvX3BjbV9odzsKKworCXNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3MpID0gc29sb19wY207CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29sb19wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKK3sKKwlzdHJ1Y3Qgc29sb19zbmRfcGNtICpzb2xvX3BjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3MpOworCisJc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcykgPSBzb2xvX3BjbS0+c29sb19kZXY7CisJa2ZyZWUoc29sb19wY20pOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MsIGludCBjbWQpCit7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fcGNtLT5zb2xvX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmc29sb19wY20tPmxvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZiAoc29sb19wY20tPm9uID09IDApIHsKKwkJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIsIHN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCisJCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNvbG9fZGV2LT5zbmRfdXNlcnMpID09IDEpCisJCQkJc29sbzYwMTBfaXJxX29uKHNvbG9fZGV2LCBTT0xPX0lSUV9HNzIzKTsKKwkJCXNvbG9fcGNtLT5vbiA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlpZiAoc29sb19wY20tPm9uKSB7CisJCQkvKiBJZiB0aGlzIHdhcyBvdXIgbGFzdCB1c2VyLCBzd2l0Y2ggdGhlbSBvZmYgKi8KKwkJCWlmIChhdG9taWNfZGVjX3JldHVybigmc29sb19kZXYtPnNuZF91c2VycykgPT0gMCkKKwkJCQlzb2xvNjAxMF9pcnFfb2ZmKHNvbG9fZGV2LCBTT0xPX0lSUV9HNzIzKTsKKwkJCXNvbG9fcGNtLT5vbiA9IDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlzcGluX3VubG9jaygmc29sb19wY20tPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzbmRfc29sb19wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQoreworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb2xvX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fcGNtLT5zb2xvX2RldjsKKwlzbmRfcGNtX3VmcmFtZXNfdCBpZHggPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LCBTT0xPX0FVRElPX1NUQSkgJiAweDFmOworCisJcmV0dXJuIGlkeCAqIEc3MjNfRlJBTUVTX1BFUl9QQUdFOworfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MsIGludCBjaGFubmVsLAorCQkJICAgICBzbmRfcGNtX3VmcmFtZXNfdCBwb3MsIHZvaWQgX191c2VyICpkc3QsCisJCQkgICAgIHNuZF9wY21fdWZyYW1lc190IGNvdW50KQoreworCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX3BjbS0+c29sb19kZXY7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCAoY291bnQgLyBHNzIzX0ZSQU1FU19QRVJfUEFHRSk7IGkrKykgeworCQlpbnQgcGFnZSA9IChwb3MgLyBHNzIzX0ZSQU1FU19QRVJfUEFHRSkgKyBpOworCisJCWVyciA9IHNvbG9fcDJtX2RtYShzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0c3MjNFLCAwLAorCQkJCSAgIHNvbG9fcGNtLT5nNzIzX2J1ZiwKKwkJCQkgICBTT0xPX0c3MjNfRVhUX0FERFIoc29sb19kZXYpICsKKwkJCQkgICAocGFnZSAqIEc3MjNfUEVSSU9EX0JMT0NLKSArCisJCQkJICAgKHNzLT5udW1iZXIgKiBHNzIzX1BFUklPRF9CWVRFUyksCisJCQkJICAgRzcyM19QRVJJT0RfQllURVMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSBjb3B5X3RvX3VzZXIoZHN0ICsgKGkgKiBHNzIzX1BFUklPRF9CWVRFUyksCisJCQkJICAgc29sb19wY20tPmc3MjNfYnVmLCBHNzIzX1BFUklPRF9CWVRFUyk7CisKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7IAorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9zb2xvX3BjbV9vcHMgPSB7CisJLm9wZW4gPSBzbmRfc29sb19wY21fb3BlbiwKKwkuY2xvc2UgPSBzbmRfc29sb19wY21fY2xvc2UsCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9IHNuZF9zb2xvX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF9zb2xvX2h3X2ZyZWUsCisJLnByZXBhcmUgPSBzbmRfc29sb19wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9IHNuZF9zb2xvX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0gc25kX3NvbG9fcGNtX3BvaW50ZXIsCisJLmNvcHkgPSBzbmRfc29sb19wY21fY29weSwKK307CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQoreworCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJaW5mby0+Y291bnQgPSAxOworCWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE1OworCWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKKworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggY2ggPSB2YWx1ZS0+aWQubnVtaWQgLSAxOworICAgICAgICB1OCBvbGRfdmFsOworCisgICAgICAgIG9sZF92YWwgPSB0dzI4X2dldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCk7CisJaWYgKG9sZF92YWwgPT0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJdHcyOF9zZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gsIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworICAgICAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkNhcHR1cmUgVm9sdW1lIiwKKwkuaW5mbyA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX2luZm8sCisJLmdldCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX2dldCwKKwkucHV0ID0gc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0LAorfTsKKworc3RhdGljIGludCBzb2xvX3NuZF9wY21faW5pdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBzb2xvX2Rldi0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzOworCWludCByZXQ7CisJaW50IGk7CisKKwlyZXQgPSBzbmRfcGNtX25ldyhjYXJkLCBjYXJkLT5kcml2ZXIsIDAsIDAsIHNvbG9fZGV2LT5ucl9jaGFucywKKwkJCSAgJnBjbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJCQkmc25kX3NvbG9fcGNtX29wcyk7CisKKwlzbmRfcGNtX2NoaXAocGNtKSA9IHNvbG9fZGV2OworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKKworCWZvciAoaSA9IDAsIHNzID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOworCSAgICAgc3M7IHNzID0gc3MtPm5leHQsIGkrKykKKwkJc3ByaW50Zihzcy0+bmFtZSwgIkNhbWVyYSAjJWQgQXVkaW8iLCBpKTsKKworCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJCQlTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAorCQkJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCQkJTUFYX0JVRkZFUiwgTUFYX0JVRkZFUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzb2xvX2Rldi0+c25kX3BjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorCitpbnQgc29sb19nNzIzX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7IE5VTEwgfTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcga2N0bDsKKwljaGFyIG5hbWVbMzJdOworCWludCByZXQ7CisKKwlhdG9taWNfc2V0KCZzb2xvX2Rldi0+c25kX3VzZXJzLCAwKTsKKworCS8qIEFsbG93cyBmb3IgZWFzaWVyIG1hcHBpbmcgYmV0d2VlbiB2aWRlbyBhbmQgYXVkaW8gKi8KKwlzcHJpbnRmKG5hbWUsICJTb2Z0bG9naWMlZCIsIHNvbG9fZGV2LT52ZmQtPm51bSk7CisKKwlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCBuYW1lLCBUSElTX01PRFVMRSwgMCwKKwkJCSAgICAgICZzb2xvX2Rldi0+c25kX2NhcmQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY2FyZCA9IHNvbG9fZGV2LT5zbmRfY2FyZDsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsIFNPTE82MDEwX05BTUUpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJTT0xPLTYwMTAgQXVkaW8iKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgb24gJXMgSVJRICVkIiwgY2FyZC0+c2hvcnRuYW1lLAorCQlwY2lfbmFtZShzb2xvX2Rldi0+cGRldiksIHNvbG9fZGV2LT5wZGV2LT5pcnEpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnNvbG9fZGV2LT5wZGV2LT5kZXYpOworCisJcmV0ID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBzb2xvX2RldiwgJm9wcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc25kX2Vycm9yOworCisJLyogTWl4ZXIgY29udHJvbHMgKi8KKwlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiU09MTy02MDEwIik7CisJa2N0bCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lOworCWtjdGwuY291bnQgPSBzb2xvX2Rldi0+bnJfY2hhbnM7CisgICAgICAgIHJldCA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgma2N0bCwgc29sb19kZXYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocmV0ID0gc29sb19zbmRfcGNtX2luaXQoc29sb19kZXYpKSA8IDApCisJCWdvdG8gc25kX2Vycm9yOworCisJaWYgKChyZXQgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQorCQlnb3RvIHNuZF9lcnJvcjsKKworCXNvbG9fZzcyM19jb25maWcoc29sb19kZXYpOworCisJZGV2X2luZm8oJnNvbG9fZGV2LT5wZGV2LT5kZXYsICJBbHNhIHNvdW5kIGNhcmQgYXMgJXNcbiIsIG5hbWUpOworCisJcmV0dXJuIDA7CisKK3NuZF9lcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc29sb19nNzIzX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQVVESU9fQ09OVFJPTCwgMCk7CisJc29sbzYwMTBfaXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7CisKKwlzbmRfY2FyZF9mcmVlKHNvbG9fZGV2LT5zbmRfY2FyZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWdwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY3YTcxZWRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWdwaW8uYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInNvbG82MDEwLmgiCisKK3N0YXRpYyB2b2lkIHNvbG9fZ3Bpb19tb2RlKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LAorCQkJICAgdW5zaWduZWQgaW50IHBvcnRfbWFzaywgdW5zaWduZWQgaW50IG1vZGUpCit7CisJaW50IHBvcnQ7CisJdW5zaWduZWQgaW50IHJldDsKKworCXJldCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fR1BJT19DT05GSUdfMCk7CisKKwkvKiBUbyBzZXQgZ3BpbyAqLworCWZvciAocG9ydCA9IDA7IHBvcnQgPCAxNjsgcG9ydCsrKSB7CisJCWlmICghKCgxIDw8IHBvcnQpICYgcG9ydF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCXJldCAmPSAofigzIDw8IChwb3J0IDw8IDEpKSk7CisJCXJldCB8PSAoKG1vZGUgJiAzKSA8PCAocG9ydCA8PCAxKSk7CisJfQorCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fR1BJT19DT05GSUdfMCwgcmV0KTsKKworCS8qIFRvIHNldCBleHRlbmRlZCBncGlvIC0gc2Vuc29yICovCisJcmV0ID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19HUElPX0NPTkZJR18xKTsKKworCWZvciAocG9ydCA9IDA7IHBvcnQgPCAxNjsgcG9ydCsrKSB7CisJCWlmICghKCgxIDw8IChwb3J0ICsgMTYpKSAmIHBvcnRfbWFzaykpCisJCQljb250aW51ZTsKKworCQlpZiAoIW1vZGUpCisJCQlyZXQgJj0gfigxIDw8IHBvcnQpOworCQllbHNlCisJCQlyZXQgfD0gMSA8PCBwb3J0OworCX0KKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0dQSU9fQ09ORklHXzEsIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fZ3Bpb19zZXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19HUElPX0RBVEFfT1VULAorCQkgICAgICAgc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19HUElPX0RBVEFfT1VUKSB8IHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgc29sb19ncGlvX2NsZWFyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fR1BJT19EQVRBX09VVCwKKwkJICAgICAgIHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fR1BJT19EQVRBX09VVCkgJiB+dmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBzb2xvX2dwaW9fY29uZmlnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCS8qIFZpZGVvIHJlc2V0ICovCisJc29sb19ncGlvX21vZGUoc29sb19kZXYsIDB4MzAsIDEpOworCXNvbG9fZ3Bpb19jbGVhcihzb2xvX2RldiwgMHgzMCk7CisJdWRlbGF5KDEwMCk7CisJc29sb19ncGlvX3NldChzb2xvX2RldiwgMHgzMCk7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBXYXJuaW5nOiBEb24ndCB0b3VjaCB0aGUgbmV4dCBsaW5lIHVubGVzcyB5b3UncmUgc3VyZSBvZiB3aGF0CisJICogeW91J3JlIGRvaW5nOiBmaXJzdCBmb3VyIGdwaW8gWzAtM10gYXJlIHVzZWQgZm9yIHZpZGVvLiAqLworCXNvbG9fZ3Bpb19tb2RlKHNvbG9fZGV2LCAweDBmLCAyKTsKKworCS8qIFdlIHVzZSBiaXQgOC0xNSBvZiBTT0xPX0dQSU9fQ09ORklHXzAgZm9yIHJlbGF5IHB1cnBvc2VzICovCisJc29sb19ncGlvX21vZGUoc29sb19kZXYsIDB4ZmYwMCwgMSk7CisKKwkvKiBJbml0aWFsbHkgc2V0IHJlbGF5IHN0YXR1cyB0byAwICovCisJc29sb19ncGlvX2NsZWFyKHNvbG9fZGV2LCAweGZmMDApOworfQorCitpbnQgc29sb19ncGlvX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisgICAgICAgIHNvbG9fZ3Bpb19jb25maWcoc29sb19kZXYpOworICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCBzb2xvX2dwaW9fZXhpdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwlzb2xvX2dwaW9fY2xlYXIoc29sb19kZXYsIDB4MzApOworCXNvbG9fZ3Bpb19jb25maWcoc29sb19kZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWkyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjg2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtaTJjLmMKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZWNoZXJyeSwgTExDIHd3dy5ibHVlY2hlcnJ5ZHZyLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qIFhYWDogVGhlIFNPTE82MDEwIGkyYyBkb2VzIG5vdCBoYXZlIHNlcGFyYXRlIGludGVycnVwdHMgZm9yIGVhY2ggaTJjCisgKiBjaGFubmVsLiBUaGUgYnVzIGNhbiBvbmx5IGhhbmRsZSBvbmUgaTJjIGV2ZW50IGF0IGEgdGltZS4gVGhlIGJlbG93IGhhbmRsZXMKKyAqIHRoaXMgYWxsIHdyb25nLiBXZSBzaG91bGQgYmUgdXNpbmcgdGhlIHN0YXR1cyByZWdpc3RlcnMgdG8gc2VlIGlmIHRoZSBidXMKKyAqIGlzIGluIHVzZSwgYW5kIGhhdmUgYSBnbG9iYWwgbG9jayB0byBjaGVjayB0aGUgc3RhdHVzIHJlZ2lzdGVyLiBBbHNvLAorICogdGhlIGJ1bGsgb2YgdGhlIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgb3V0LW9mLWludGVycnVwdC4gVGhlIHVnbHkgbG9vcHMKKyAqIHRoYXQgb2NjdXIgZHVyaW5nIGludGVycnVwdCBzY2FyZSBtZS4gVGhlIElTUiBzaG91bGQgbWVyZWx5IHNpZ25hbAorICogdGhyZWFkIGNvbnRleHQsIEFDSyB0aGUgaW50ZXJydXB0LCBhbmQgbW92ZSBvbi4gLS0gQmVuQyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC5oIgorCit1OCBzb2xvX2kyY19yZWFkYnl0ZShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IGlkLCB1OCBhZGRyLCB1OCBvZmYpCit7CisJc3RydWN0IGkyY19tc2cgbXNnc1syXTsKKwl1OCBkYXRhOworCisJbXNnc1swXS5mbGFncyA9IDA7CisJbXNnc1swXS5hZGRyID0gYWRkcjsKKwltc2dzWzBdLmxlbiA9IDE7CisJbXNnc1swXS5idWYgPSAmb2ZmOworCisJbXNnc1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ3NbMV0uYWRkciA9IGFkZHI7CisJbXNnc1sxXS5sZW4gPSAxOworCW1zZ3NbMV0uYnVmID0gJmRhdGE7CisKKwlpMmNfdHJhbnNmZXIoJnNvbG9fZGV2LT5pMmNfYWRhcFtpZF0sIG1zZ3MsIDIpOworCisgICAgICAgIHJldHVybiBkYXRhOworfQorCit2b2lkIHNvbG9faTJjX3dyaXRlYnl0ZShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IGlkLCB1OCBhZGRyLAorCQkJdTggb2ZmLCB1OCBkYXRhKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ3M7CisJdTggYnVmWzJdOworCisJYnVmWzBdID0gb2ZmOworCWJ1ZlsxXSA9IGRhdGE7CisJbXNncy5mbGFncyA9IDA7CisJbXNncy5hZGRyID0gYWRkcjsKKwltc2dzLmxlbiA9IDI7CisJbXNncy5idWYgPSBidWY7CisKKwlpMmNfdHJhbnNmZXIoJnNvbG9fZGV2LT5pMmNfYWRhcFtpZF0sICZtc2dzLCAxKTsKK30KKworc3RhdGljIHZvaWQgc29sb19pMmNfZmx1c2goc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGludCB3cikKK3sKKwl1MzIgY3RybDsKKworCWN0cmwgPSBTT0xPX0lJQ19DSF9TRVQoc29sb19kZXYtPmkyY19pZCk7CisKKwlpZiAoc29sb19kZXYtPmkyY19zdGF0ZSA9PSBJSUNfU1RBVEVfU1RBUlQpCisJCWN0cmwgfD0gU09MT19JSUNfU1RBUlQ7CisKKwlpZiAod3IpIHsKKwkJY3RybCB8PSBTT0xPX0lJQ19XUklURTsKKwl9IGVsc2UgeworCQljdHJsIHw9IFNPTE9fSUlDX1JFQUQ7CisJCWlmICghKHNvbG9fZGV2LT5pMmNfbXNnLT5mbGFncyAmIEkyQ19NX05PX1JEX0FDSykpCisJCQljdHJsIHw9IFNPTE9fSUlDX0FDS19FTjsKKwl9CisKKwlpZiAoc29sb19kZXYtPmkyY19tc2dfcHRyID09IHNvbG9fZGV2LT5pMmNfbXNnLT5sZW4pCisJCWN0cmwgfD0gU09MT19JSUNfU1RPUDsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0lJQ19DVFJMLCBjdHJsKTsKK30KKworc3RhdGljIHZvaWQgc29sb19pMmNfc3RhcnQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJdTMyIGFkZHIgPSBzb2xvX2Rldi0+aTJjX21zZy0+YWRkciA8PCAxOworCisJaWYgKHNvbG9fZGV2LT5pMmNfbXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQlhZGRyIHw9IDE7CisKKwlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX1NUQVJUOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0lJQ19UWEQsIGFkZHIpOworCXNvbG9faTJjX2ZsdXNoKHNvbG9fZGV2LCAxKTsKK30KKworc3RhdGljIHZvaWQgc29sb19pMmNfc3RvcChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwlzb2xvNjAxMF9pcnFfb2ZmKHNvbG9fZGV2LCBTT0xPX0lSUV9JSUMpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0lJQ19DVFJMLCAwKTsKKwlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX1NUT1A7CisJd2FrZV91cCgmc29sb19kZXYtPmkyY193YWl0KTsKK30KKworc3RhdGljIGludCBzb2xvX2kyY19oYW5kbGVfcmVhZChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKK3ByZXBhcmVfcmVhZDoKKwlpZiAoc29sb19kZXYtPmkyY19tc2dfcHRyICE9IHNvbG9fZGV2LT5pMmNfbXNnLT5sZW4pIHsKKwkJc29sb19pMmNfZmx1c2goc29sb19kZXYsIDApOworCQlyZXR1cm4gMDsKKwl9CisKKwlzb2xvX2Rldi0+aTJjX21zZ19wdHIgPSAwOworCXNvbG9fZGV2LT5pMmNfbXNnKys7CisJc29sb19kZXYtPmkyY19tc2dfbnVtLS07CisKKwlpZiAoc29sb19kZXYtPmkyY19tc2dfbnVtID09IDApIHsKKwkJc29sb19pMmNfc3RvcChzb2xvX2Rldik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHNvbG9fZGV2LT5pMmNfbXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpKSB7CisJCXNvbG9faTJjX3N0YXJ0KHNvbG9fZGV2KTsKKwl9IGVsc2UgeworCQlpZiAoc29sb19kZXYtPmkyY19tc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCQlnb3RvIHByZXBhcmVfcmVhZDsKKwkJZWxzZQorCQkJc29sb19pMmNfc3RvcChzb2xvX2Rldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19pMmNfaGFuZGxlX3dyaXRlKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworcmV0cnlfd3JpdGU6CisJaWYgKHNvbG9fZGV2LT5pMmNfbXNnX3B0ciAhPSBzb2xvX2Rldi0+aTJjX21zZy0+bGVuKSB7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0lJQ19UWEQsCisJCQkgICAgICAgc29sb19kZXYtPmkyY19tc2ctPmJ1Zltzb2xvX2Rldi0+aTJjX21zZ19wdHJdKTsKKwkJc29sb19kZXYtPmkyY19tc2dfcHRyKys7CisJCXNvbG9faTJjX2ZsdXNoKHNvbG9fZGV2LCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc29sb19kZXYtPmkyY19tc2dfcHRyID0gMDsKKwlzb2xvX2Rldi0+aTJjX21zZysrOworCXNvbG9fZGV2LT5pMmNfbXNnX251bS0tOworCisJaWYgKHNvbG9fZGV2LT5pMmNfbXNnX251bSA9PSAwKSB7CisJCXNvbG9faTJjX3N0b3Aoc29sb19kZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShzb2xvX2Rldi0+aTJjX21zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKSkgeworCQlzb2xvX2kyY19zdGFydChzb2xvX2Rldik7CisJfSBlbHNlIHsKKwkJaWYgKHNvbG9fZGV2LT5pMmNfbXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQkJc29sb19pMmNfc3RvcChzb2xvX2Rldik7CisJCWVsc2UKKwkJCWdvdG8gcmV0cnlfd3JpdGU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzb2xvX2kyY19pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJdTMyIHN0YXR1cyA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fSUlDX0NUUkwpOworCWludCByZXQgPSAtRUlOVkFMOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsIFNPTE9fSVJRX0lJQyk7CisKKwlpZiAoc3RhdHVzICYgKFNPTE9fSUlDX1NUQVRFX1RSTlMgJiBTT0xPX0lJQ19TVEFURV9TSUdfRVJSKSB8fAorCSAgICBzb2xvX2Rldi0+aTJjX2lkIDwgMCkgeworCQlzb2xvX2kyY19zdG9wKHNvbG9fZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzd2l0Y2ggKHNvbG9fZGV2LT5pMmNfc3RhdGUpIHsKKwljYXNlIElJQ19TVEFURV9TVEFSVDoKKwkJaWYgKHNvbG9fZGV2LT5pMmNfbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX1JFQUQ7CisJCQlyZXQgPSBzb2xvX2kyY19oYW5kbGVfcmVhZChzb2xvX2Rldik7CisJCQlicmVhazsKKwkJfQorCisJCXNvbG9fZGV2LT5pMmNfc3RhdGUgPSBJSUNfU1RBVEVfV1JJVEU7CisJY2FzZSBJSUNfU1RBVEVfV1JJVEU6CisJCXJldCA9IHNvbG9faTJjX2hhbmRsZV93cml0ZShzb2xvX2Rldik7CisJCWJyZWFrOworCisJY2FzZSBJSUNfU1RBVEVfUkVBRDoKKwkJc29sb19kZXYtPmkyY19tc2ctPmJ1Zltzb2xvX2Rldi0+aTJjX21zZ19wdHJdID0KKwkJCXNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fSUlDX1JYRCk7CisJCXNvbG9fZGV2LT5pMmNfbXNnX3B0cisrOworCisJCXJldCA9IHNvbG9faTJjX2hhbmRsZV9yZWFkKHNvbG9fZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzb2xvX2kyY19zdG9wKHNvbG9fZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNvbG9faTJjX21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKKwkJCQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBhZGFwLT5hbGdvX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisJaW50IGk7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09MT19JMkNfQURBUFRFUlM7IGkrKykgeworCQlpZiAoJnNvbG9fZGV2LT5pMmNfYWRhcFtpXSA9PSBhZGFwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gU09MT19JMkNfQURBUFRFUlMpCisJCXJldHVybiBudW07IC8vIFhYWCBSaWdodCByZXR1cm4gdmFsdWUgZm9yIGZhaWx1cmU/CisKKwlkb3duKCZzb2xvX2Rldi0+aTJjX3NlbSk7CisJc29sb19kZXYtPmkyY19pZCA9IGk7CisJc29sb19kZXYtPmkyY19tc2cgPSBtc2dzOworCXNvbG9fZGV2LT5pMmNfbXNnX251bSA9IG51bTsKKwlzb2xvX2Rldi0+aTJjX21zZ19wdHIgPSAwOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSUlDX0NUUkwsIDApOworCXNvbG82MDEwX2lycV9vbihzb2xvX2RldiwgU09MT19JUlFfSUlDKTsKKwlzb2xvX2kyY19zdGFydChzb2xvX2Rldik7CisKKwl0aW1lb3V0ID0gSFogLyAyOworCisJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoJnNvbG9fZGV2LT5pMmNfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKHNvbG9fZGV2LT5pMmNfc3RhdGUgPT0gSUlDX1NUQVRFX1NUT1ApCisJCQlicmVhazsKKworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJaWYgKCF0aW1lb3V0KQorCQkJYnJlYWs7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJfQorCisJZmluaXNoX3dhaXQoJnNvbG9fZGV2LT5pMmNfd2FpdCwgJndhaXQpOworCXJldCA9IG51bSAtIHNvbG9fZGV2LT5pMmNfbXNnX251bTsKKwlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX0lETEU7CisJc29sb19kZXYtPmkyY19pZCA9IC0xOworCisJdXAoJnNvbG9fZGV2LT5pMmNfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgc29sb19pMmNfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNvbG9faTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyCT0gc29sb19pMmNfbWFzdGVyX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBzb2xvX2kyY19mdW5jdGlvbmFsaXR5LAorfTsKKworaW50IHNvbG9faTJjX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0lJQ19DRkcsCisJCSAgICAgICBTT0xPX0lJQ19QUkVTQ0FMRSg4KSB8IFNPTE9fSUlDX0VOQUJMRSk7CisKKwlzb2xvX2Rldi0+aTJjX2lkID0gLTE7CisJc29sb19kZXYtPmkyY19zdGF0ZSA9IElJQ19TVEFURV9JRExFOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbG9fZGV2LT5pMmNfd2FpdCk7CisJaW5pdF9NVVRFWCgmc29sb19kZXYtPmkyY19zZW0pOworCisJZm9yIChpID0gMDsgaSA8IFNPTE9fSTJDX0FEQVBURVJTOyBpKyspIHsKKwkJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gJnNvbG9fZGV2LT5pMmNfYWRhcFtpXTsKKworCQlzbnByaW50ZihhZGFwLT5uYW1lLCBJMkNfTkFNRV9TSVpFLCAiJXMgSTJDICVkIiwKKwkJCSBTT0xPNjAxMF9OQU1FLCBpKTsKKwkJYWRhcC0+YWxnbyA9ICZzb2xvX2kyY19hbGdvOworCQlhZGFwLT5hbGdvX2RhdGEgPSBzb2xvX2RldjsKKwkJYWRhcC0+cmV0cmllcyA9IDE7CisJCWFkYXAtPmRldi5wYXJlbnQgPSAmc29sb19kZXYtPnBkZXYtPmRldjsKKworCQlpZiAoKHJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKSkpIHsKKwkJCWFkYXAtPmFsZ29fZGF0YSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IFNPTE9fSTJDX0FEQVBURVJTOyBpKyspIHsKKwkJCWlmICghc29sb19kZXYtPmkyY19hZGFwW2ldLmFsZ29fZGF0YSkKKwkJCQlicmVhazsKKwkJCWkyY19kZWxfYWRhcHRlcigmc29sb19kZXYtPmkyY19hZGFwW2ldKTsKKwkJCXNvbG9fZGV2LT5pMmNfYWRhcFtpXS5hbGdvX2RhdGEgPSBOVUxMOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2luZm8oJnNvbG9fZGV2LT5wZGV2LT5kZXYsICJFbmFibGVkICVkIGkyYyBhZGFwdGVyc1xuIiwKKwkJIFNPTE9fSTJDX0FEQVBURVJTKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHNvbG9faTJjX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09MT19JMkNfQURBUFRFUlM7IGkrKykgeworCQlpZiAoIXNvbG9fZGV2LT5pMmNfYWRhcFtpXS5hbGdvX2RhdGEpCisJCQljb250aW51ZTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZzb2xvX2Rldi0+aTJjX2FkYXBbaV0pOworCQlzb2xvX2Rldi0+aTJjX2FkYXBbaV0uYWxnb19kYXRhID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtanBlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWpwZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjA1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWpwZWcuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1NPTE82MDEwX0pQRUdfSAorI2RlZmluZSBfX1NPTE82MDEwX0pQRUdfSAorCitzdGF0aWMgdW5zaWduZWQgY2hhciBqcGVnX2hlYWRlcltdID0geworCTB4ZmYsIDB4ZDgsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MGQsIDB4NDIsIDB4NmMsCisJMHg3NSwgMHg2NSwgMHg2MywgMHg2OCwgMHg2NSwgMHg3MiwgMHg3MiwgMHg3OSwKKwkweDIwLCAweGZmLCAweGRiLCAweDAwLCAweDQzLCAweDAwLCAweDIwLCAweDE2LAorCTB4MTgsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MjAsIDB4MWMsIDB4MWEsIDB4MWMsCisJMHgyNCwgMHgyMiwgMHgyMCwgMHgyNiwgMHgzMCwgMHg1MCwgMHgzNCwgMHgzMCwKKwkweDJjLCAweDJjLCAweDMwLCAweDYyLCAweDQ2LCAweDRhLCAweDNhLCAweDUwLAorCTB4NzQsIDB4NjYsIDB4N2EsIDB4NzgsIDB4NzIsIDB4NjYsIDB4NzAsIDB4NmUsCisJMHg4MCwgMHg5MCwgMHhiOCwgMHg5YywgMHg4MCwgMHg4OCwgMHhhZSwgMHg4YSwKKwkweDZlLCAweDcwLCAweGEwLCAweGRhLCAweGEyLCAweGFlLCAweGJlLCAweGM0LAorCTB4Y2UsIDB4ZDAsIDB4Y2UsIDB4N2MsIDB4OWEsIDB4ZTIsIDB4ZjIsIDB4ZTAsCisJMHhjOCwgMHhmMCwgMHhiOCwgMHhjYSwgMHhjZSwgMHhjNiwgMHhmZiwgMHhkYiwKKwkweDAwLCAweDQzLCAweDAxLCAweDIyLCAweDI0LCAweDI0LCAweDMwLCAweDJhLAorCTB4MzAsIDB4NWUsIDB4MzQsIDB4MzQsIDB4NWUsIDB4YzYsIDB4ODQsIDB4NzAsCisJMHg4NCwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCTB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCisJMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCTB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCisJMHhjNiwgMHhjNiwgMHhjNiwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwKKwkweDAwLCAweDAxLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLAorCTB4MDMsIDB4MDMsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsCisJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwgMHgwMSwgMHgwMiwgMHgwMywKKwkweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLAorCTB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsCisJMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwKKwkweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLCAweDI0LCAweDMzLCAweDYyLAorCTB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisJMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwKKwkweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LAorCTB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsCisJMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwKKwkweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LAorCTB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4ODMsIDB4ODQsCisJMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywKKwkweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLAorCTB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsCisJMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwKKwkweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAorCTB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwKKwkweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLCAweGYyLCAweGYzLAorCTB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDEsCisJMHgwMCwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwKKwkweDAyLCAweDA0LCAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LCAweDA0LAorCTB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NzcsIDB4MDAsIDB4MDEsIDB4MDIsCisJMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwKKwkweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLAorCTB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsIDB4YTEsIDB4YjEsIDB4YzEsCisJMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwgMHg2MiwgMHg3MiwKKwkweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLAorCTB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksCisJMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywKKwkweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLAorCTB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NjMsCisJMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywKKwkweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLCAweDgyLAorCTB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsCisJMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwKKwkweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LAorCTB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwKKwkweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LAorCTB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTIsIDB4ZTMsIDB4ZTQsCisJMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwgMHhmMywKKwkweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLAorCTB4YzAsIDB4MDAsIDB4MTEsIDB4MDgsIDB4MDAsIDB4ZjAsIDB4MDIsIDB4YzAsCisJMHgwMywgMHgwMSwgMHgyMiwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMSwgMHgwMywKKwkweDExLCAweDAxLCAweGZmLCAweGRhLCAweDAwLCAweDBjLCAweDAzLCAweDAxLAorCTB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAKK307CisKKy8qIFRoaXMgaXMgdGhlIGJ5dGUgbWFya2VyIGZvciB0aGUgc3RhcnQgb2YgU09GMDogMHhmZmMwIG1hcmtlciAqLworI2RlZmluZSBTT0YwX1NUQVJUCTU3NQorCisjZW5kaWYgLyogX19TT0xPNjAxMF9KUEVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vZmZzZXRzLmggYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtb2Zmc2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzFkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtb2Zmc2V0cy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZWNoZXJyeSwgTExDIHd3dy5ibHVlY2hlcnJ5ZHZyLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19TT0xPNjAxMF9PRkZTRVRTX0gKKyNkZWZpbmUgX19TT0xPNjAxMF9PRkZTRVRTX0gKKworLyogT2Zmc2V0cyBhbmQgc2l6ZXMgb2YgdGhlIGV4dGVybmFsIGFkZHJlc3MgKi8KKyNkZWZpbmUgU09MT19ESVNQX0VYVF9BRERSKF9fc29sbykJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU09MT19ESVNQX0VYVF9TSVpFCQkJMHgwMDQ4MDAwMAorCisjZGVmaW5lIFNPTE9fREVDMkxJVkVfRVhUX0FERFIoX19zb2xvKSBcCisJCShTT0xPX0RJU1BfRVhUX0FERFIoX19zb2xvKSArIFNPTE9fRElTUF9FWFRfU0laRSkKKyNkZWZpbmUgU09MT19ERUMyTElWRV9FWFRfU0laRQkJCTB4MDAyNDAwMDAKKworI2RlZmluZSBTT0xPX09TR19FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fREVDMkxJVkVfRVhUX0FERFIoX19zb2xvKSArIFNPTE9fREVDMkxJVkVfRVhUX1NJWkUpCisjZGVmaW5lIFNPTE9fT1NHX0VYVF9TSVpFCQkJMHgwMDEyMDAwMAorCisjZGVmaW5lIFNPTE9fRU9TRF9FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fT1NHX0VYVF9BRERSKF9fc29sbykgKyBTT0xPX09TR19FWFRfU0laRSkKKyNkZWZpbmUgU09MT19FT1NEX0VYVF9TSVpFCQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIFNPTE9fTU9USU9OX0VYVF9BRERSKF9fc29sbykgXAorCQkoU09MT19FT1NEX0VYVF9BRERSKF9fc29sbykgKyBcCisJCSAoU09MT19FT1NEX0VYVF9TSVpFICogX19zb2xvLT5ucl9jaGFucykpCisjZGVmaW5lIFNPTE9fTU9USU9OX0VYVF9TSVpFCQkJMHgwMDA4MDAwMAorCisjZGVmaW5lIFNPTE9fRzcyM19FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fTU9USU9OX0VYVF9BRERSKF9fc29sbykgKyBTT0xPX01PVElPTl9FWFRfU0laRSkKKyNkZWZpbmUgU09MT19HNzIzX0VYVF9TSVpFCQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIFNPTE9fQ0FQX0VYVF9BRERSKF9fc29sbykgXAorCQkoU09MT19HNzIzX0VYVF9BRERSKF9fc29sbykgKyBTT0xPX0c3MjNfRVhUX1NJWkUpCisjZGVmaW5lIFNPTE9fQ0FQX0VYVF9NQVhfUEFHRQkJCSgxOCArIDE1KQorI2RlZmluZSBTT0xPX0NBUF9FWFRfU0laRQkJCShTT0xPX0NBUF9FWFRfTUFYX1BBR0UgKiA2NTUzNikKKworLyogVGhpcyArMSBpcyB2ZXJ5IGltcG9ydGFudCAtLSBXaHk/ISAtLSBCZW5DICovCisjZGVmaW5lIFNPTE9fRVJFRl9FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fQ0FQX0VYVF9BRERSKF9fc29sbykgKyBcCisJCSAoU09MT19DQVBfRVhUX1NJWkUgKiAoX19zb2xvLT5ucl9jaGFucyArIDEpKSkKKyNkZWZpbmUgU09MT19FUkVGX0VYVF9TSVpFCQkJMHgwMDE0MDAwMAorCisjZGVmaW5lIFNPTE9fTVA0RV9FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fRVJFRl9FWFRfQUREUihfX3NvbG8pICsgXAorCQkgKFNPTE9fRVJFRl9FWFRfU0laRSAqIF9fc29sby0+bnJfY2hhbnMpKQorI2RlZmluZSBTT0xPX01QNEVfRVhUX1NJWkUoX19zb2xvKQkJKDB4MDAwODAwMDAgKiBfX3NvbG8tPm5yX2NoYW5zKQorCisjZGVmaW5lIFNPTE9fRFJFRl9FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fTVA0RV9FWFRfQUREUihfX3NvbG8pICsgU09MT19NUDRFX0VYVF9TSVpFKF9fc29sbykpCisjZGVmaW5lIFNPTE9fRFJFRl9FWFRfU0laRQkJCTB4MDAxNDAwMDAKKworI2RlZmluZSBTT0xPX01QNERfRVhUX0FERFIoX19zb2xvKSBcCisJCShTT0xPX0RSRUZfRVhUX0FERFIoX19zb2xvKSArIFwKKwkJIChTT0xPX0RSRUZfRVhUX1NJWkUgKiBfX3NvbG8tPm5yX2NoYW5zKSkKKyNkZWZpbmUgU09MT19NUDREX0VYVF9TSVpFCQkJMHgwMDA4MDAwMAorCisjZGVmaW5lIFNPTE9fSlBFR19FWFRfQUREUihfX3NvbG8pIFwKKwkJKFNPTE9fTVA0RF9FWFRfQUREUihfX3NvbG8pICsgXAorCQkgKFNPTE9fTVA0RF9FWFRfU0laRSAqIF9fc29sby0+bnJfY2hhbnMpKQorI2RlZmluZSBTT0xPX0pQRUdfRVhUX1NJWkUoX19zb2xvKQkJKDB4MDAwODAwMDAgKiBfX3NvbG8tPm5yX2NoYW5zKQorCisjZW5kaWYgLyogX19TT0xPNjAxMF9PRkZTRVRTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmNTY1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEJsdWVjaGVycnksIExMQyB3d3cuYmx1ZWNoZXJyeWR2ci5jb20KKyAqIENvcHlyaWdodCAoQykgMjAxMCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAYmx1ZWNoZXJyeS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fU09MTzYwMTBfT1NEX0ZPTlRfSAorI2RlZmluZSBfX1NPTE82MDEwX09TRF9GT05UX0gKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzb2xvX29zZF9mb250W10gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwYzBjOCwgMHhjY2ZlZmUwYywgMHgwODAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDEwMTAzODM4LCAweDdjN2NmZWZlLCAweDAwMDAwMDAwLAkvLyAwCisJMHgwMDAwMDAwMCwgMHhmZWZlN2M3YywgMHgzODM4MTAxMCwgMHgxMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDdjODJmZWZlLCAweGZlZmVmZTdjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDEwMzgsIDB4MTAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDEwMzg3YywgMHhmZTdjMzgxMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMzg0NDQ0LCAweDQ0MzgwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4Mzg0NDgyODIsIDB4ODI0NDM4MDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDdjN2M3YywgMHg3YzdjMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDZjNmM2YzZjLCAweDZjNmM2YzZjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDYxZTdlZmUsIDB4ZmU3ZTFlMDYsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHhjMGYwZmNmZSwgMHhmZWZjZjBjMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweGM2Y2VkZWZlLCAweGZlZGVjZWM2LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4YzZlNmY2ZmUsIDB4ZmVmNmU2YzYsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgxMjM2N2VmZSwgMHhmZTdlMzYxMiwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDkwZDhmY2ZlLCAweGZlZmNkODkwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMzgsIDB4N2NjNjkyYmEsIDB4OTJjNjdjMzgsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAzOCwgMHg3Y2M2YWE5MiwgMHhhYWM2N2MzOCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDM4LCAweDc4MzAxMDdjLCAweGJhYTg2ODBjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMzgsIDB4M2MxODEyN2MsIDB4YjgzODJjNjAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDA0NCwgMHhhYTZjODI1NCwgMHgzOGVlYzY3YywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDgyLCAweDQ0Mjg4MjQ0LCAweDM4YzY4MjdjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMzgsIDB4NDQ0NDQ0ZmUsIDB4ZmVlZWM2ZmUsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAxOCwgMHg3ODE4NzgxOCwgMHgzYzdlN2UzYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDM4NTQ5MjlhLCAweDgyNDQzODAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDBjMGM4Y2MsIDB4ZmVmZTBjMDgsIDB4MDAwMDAwMDAsCisJMHgwMDAwZTBhMCwgMHhlMDQwZTAwZSwgMHg4YTBlYTQwZSwgMHgwMDAwMDAwMCwKKwkweDAwMDBlMGEwLCAweGUwNDBlMDBlLCAweDBhOGU0NDBlLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwN2MsIDB4ODI4MjkyOTIsIDB4OTI5MjgyZmUsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDBmOCwgMHhmYzA0NjQ5NCwgMHg5NDY0MDRmYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDNmLCAweDdmNDA0YzUyLCAweDUyNGM0MDdmLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwN2MsIDB4ODJiYTgyYmEsIDB4ODJiYTgyZmUsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDE4M2MzYzNjLCAweDE4MTgwMDE4LCAweDE4MDAwMDAwLAkvLyAzMiAgICEKKwkweDAwMDAwMDY2LCAweDY2MjQwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4NmM2Y2ZlNmMsIDB4NmM2Y2ZlNmMsIDB4NmMwMDAwMDAsCS8vIDM0ICIgIworCTB4MDAwMDEwMTAsIDB4N2NkNmQ2MTYsIDB4N2NkMGQ2ZDYsIDB4N2MxMDEwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDg2YzY2MCwgMHgzMDE4MGNjNiwgMHhjMjAwMDAwMCwJLy8gMzYgJCAlCisJMHgwMDAwMDAwMCwgMHgzODZjNmMzOCwgMHhkYzc2NjY2NiwgMHhkYzAwMDAwMCwKKwkweDAwMDAwMDBjLCAweDBjMGMwNjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAkvLyAzOCAmICcKKwkweDAwMDAwMDAwLCAweDMwMTgwYzBjLCAweDBjMGMwYzE4LCAweDMwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MGMxODMwMzAsIDB4MzAzMDMwMTgsIDB4MGMwMDAwMDAsCS8vIDQwICggKQorCTB4MDAwMDAwMDAsIDB4MDAwMDY2M2MsIDB4ZmYzYzY2MDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMTgxOCwgMHg3ZTE4MTgwMCwgMHgwMDAwMDAwMCwJLy8gNDIgKiArCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMGUwZSwgMHgwYzA2MDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDdlMDAwMDAwLCAweDAwMDAwMDAwLAkvLyA0NCAsIC0KKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDA2MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4ODBjMDYwMzAsIDB4MTgwYzA2MDIsIDB4MDAwMDAwMDAsCS8vIDQ2IC4gLworCTB4MDAwMDAwN2MsIDB4YzZlNmY2ZGUsIDB4Y2VjNmM2N2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAzMCwgMHgzODNjMzAzMCwgMHgzMDMwMzBmYywgMHgwMDAwMDAwMCwJLy8gNDggMCAxCisJMHgwMDAwMDA3YywgMHhjNmMwNjAzMCwgMHgxODBjYzZmZSwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDdjLCAweGM2YzBjMDdjLCAweGMwYzBjNjdjLCAweDAwMDAwMDAwLAkvLyA1MCAyIDMKKwkweDAwMDAwMDYwLCAweDcwNzg2YzY2LCAweGZlNjA2MGYwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwZmUsIDB4MDYwNjA2N2UsIDB4YzBjMGM2N2MsIDB4MDAwMDAwMDAsCS8vIDUyIDQgNQorCTB4MDAwMDAwMzgsIDB4MGMwNjA2N2UsIDB4YzZjNmM2N2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDBmZSwgMHhjNmMwNjAzMCwgMHgxODE4MTgxOCwgMHgwMDAwMDAwMCwJLy8gNTQgNiA3CisJMHgwMDAwMDA3YywgMHhjNmM2YzY3YywgMHhjNmM2YzY3YywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDdjLCAweGM2YzZjNmZjLCAweGMwYzA2MDM4LCAweDAwMDAwMDAwLAkvLyA1NiA4IDkKKwkweDAwMDAwMDAwLCAweDE4MTgwMDAwLCAweDAwMTgxODAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MTgxODAwMDAsIDB4MDAxODE4MGMsIDB4MDAwMDAwMDAsCS8vIDU4IDogOworCTB4MDAwMDAwNjAsIDB4MzAxODBjMDYsIDB4MGMxODMwNjAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDdlMDAwMCwgMHgwMDdlMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDA2LCAweDBjMTgzMDYwLCAweDMwMTgwYzA2LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwN2MsIDB4YzZjNjYwMzAsIDB4MzAwMDMwMzAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDA3YywgMHhjNmY2ZDZkNiwgMHg3NjA2MDY3YywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDEwLCAweDM4NmNjNmM2LCAweGZlYzZjNmM2LCAweDAwMDAwMDAwLAkvLyA2NCBAIEEKKwkweDAwMDAwMDdlLCAweGM2YzZjNjdlLCAweGM2YzZjNjdlLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwNzgsIDB4Y2MwNjA2MDYsIDB4MDYwNmNjNzgsIDB4MDAwMDAwMDAsCS8vIDY2CisJMHgwMDAwMDAzZSwgMHg2NmM2YzZjNiwgMHhjNmM2NjYzZSwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMGZlLCAweDA2MDYwNjNlLCAweDA2MDYwNmZlLCAweDAwMDAwMDAwLAkvLyA2OAorCTB4MDAwMDAwZmUsIDB4MDYwNjA2M2UsIDB4MDYwNjA2MDYsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDA3OCwgMHhjYzA2MDYwNiwgMHhmNmM2Y2NiOCwgMHgwMDAwMDAwMCwJLy8gNzAKKwkweDAwMDAwMGM2LCAweGM2YzZjNmZlLCAweGM2YzZjNmM2LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwM2MsIDB4MTgxODE4MTgsIDB4MTgxODE4M2MsIDB4MDAwMDAwMDAsCS8vIDcyCisJMHgwMDAwMDA2MCwgMHg2MDYwNjA2MCwgMHg2MDY2NjYzYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMGM2LCAweGM2NjYzNjFlLCAweDM2NjZjNmM2LCAweDAwMDAwMDAwLAkvLyA3NAorCTB4MDAwMDAwMDYsIDB4MDYwNjA2MDYsIDB4MDYwNjA2ZmUsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDBjNiwgMHhlZWZlZDZjNiwgMHhjNmM2YzZjNiwgMHgwMDAwMDAwMCwJLy8gNzYKKwkweDAwMDAwMGM2LCAweGNlZGVmZWY2LCAweGU2YzZjNmM2LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMzgsIDB4NmNjNmM2YzYsIDB4YzZjNjZjMzgsIDB4MDAwMDAwMDAsCS8vIDc4CisJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHgwNjA2MDYwNiwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2ZDY3YzM4LCAweDYwMDAwMDAwLAkvLyA4MAorCTB4MDAwMDAwN2UsIDB4YzZjNmM2N2UsIDB4NjZjNmM2YzYsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDA3YywgMHhjNmM2MGMzOCwgMHg2MGM2YzY3YywgMHgwMDAwMDAwMCwJLy8gODIKKwkweDAwMDAwMDdlLCAweDE4MTgxODE4LCAweDE4MTgxODE4LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwYzYsIDB4YzZjNmM2YzYsIDB4YzZjNmM2N2MsIDB4MDAwMDAwMDAsCS8vIDg0CisJMHgwMDAwMDBjNiwgMHhjNmM2YzZjNiwgMHhjNjZjMzgxMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGQ2ZDZmZTZjLCAweDAwMDAwMDAwLAkvLyA4NgorCTB4MDAwMDAwYzYsIDB4YzZjNjZjMzgsIDB4NmNjNmM2YzYsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDA2NiwgMHg2NjY2NjY2NiwgMHgzYzE4MTgxOCwgMHgwMDAwMDAwMCwJLy8gODgKKwkweDAwMDAwMGZlLCAweGMwNjAzMDE4LCAweDBjMDYwNmZlLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwM2MsIDB4MGMwYzBjMGMsIDB4MGMwYzBjM2MsIDB4MDAwMDAwMDAsCS8vIDkwCisJMHgwMDAwMDAwMiwgMHgwNjBjMTgzMCwgMHg2MGMwODAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDNjLCAweDMwMzAzMDMwLCAweDMwMzAzMDNjLCAweDAwMDAwMDAwLAkvLyA5MgorCTB4MDAwMDEwMzgsIDB4NmNjNjAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMGZlMDAwMCwKKwkweDAwMDAxODE4LCAweDMwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDNjNjAsIDB4N2M2NjY2N2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwYywgMHgwYzBjN2NjYywgMHhjY2NjY2M3YywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDA3Y2M2LCAweDA2MDZjNjdjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwNjAsIDB4NjA2MDdjNjYsIDB4NjY2NjY2N2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwN2NjNiwgMHhmZTA2YzY3YywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDc4LCAweDBjMGMwYzNlLCAweDBjMGMwYzBjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDdjNjYsIDB4NjY2NjY2N2MsIDB4NjA2MDNlMDAsCisJMHgwMDAwMDAwYywgMHgwYzBjN2NjYywgMHhjY2NjY2NjYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDMwLCAweDMwMDAzODMwLCAweDMwMzAzMDc4LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMzAsIDB4MzAwMDNjMzAsIDB4MzAzMDMwMzAsIDB4MzAzMDFmMDAsCisJMHgwMDAwMDAwYywgMHgwYzBjY2M2YywgMHgzYzZjY2NjYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDMwLCAweDMwMzAzMDMwLCAweDMwMzAzMDMwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDY2ZmUsIDB4ZDZkNmQ2ZDYsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwNzhjYywgMHhjY2NjY2NjYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDA3Y2M2LCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDdjY2MsIDB4Y2NjY2NjN2MsIDB4MGMwYzBjMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwN2M2NiwgMHg2NjY2NjY3YywgMHg2MDYwNjAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDA3NmRjLCAweDBjMGMwYzBjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDdjYzYsIDB4MWM3MGM2N2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgxODE4ZmUxOCwgMHgxODE4MTg3MCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDA2NjY2LCAweDY2NjY2NjNjLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMGM2YzYsIDB4YzY2YzM4MTAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwYzZkNiwgMHhkNmQ2ZmU2YywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDBjNjZjLCAweDM4Mzg2Y2M2LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDY2NjYsIDB4NjY2NjY2N2MsIDB4NjA2MDNlMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwZmU2MCwgMHgzMDE4MGNmZSwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDcwLCAweDE4MTgxODBlLCAweDE4MTgxODcwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMTgsIDB4MTgxODE4MDAsIDB4MTgxODE4MTgsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwZSwgMHgxODE4MTg3MCwgMHgxODE4MTgwZSwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMGRjLCAweDc2MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAxMDM4NmMsIDB4YzZjNmZlMDAsIDB4MDAwMDAwMDAKK307CisKKyNlbmRpZiAvKiBfX1NPTE82MDEwX09TRF9GT05UX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1wMm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1wMm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjgxZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXAybS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEJsdWVjaGVycnksIExMQyB3d3cuYmx1ZWNoZXJyeWR2ci5jb20KKyAqIENvcHlyaWdodCAoQykgMjAxMCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAYmx1ZWNoZXJyeS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC5oIgorCisvLyAjZGVmaW5lIFNPTE9fVEVTVF9QMk0KKworaW50IHNvbG9fcDJtX2RtYShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsIGludCB3ciwKKwkJIHZvaWQgKnN5c19hZGRyLCB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKQoreworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJaW50IHJldDsKKworCVdBUk5fT04oIXNpemUpOworCVdBUk5fT04oaWQgPj0gU09MT19OUl9QMk0pOworCWlmICghc2l6ZSB8fCBpZCA+PSBTT0xPX05SX1AyTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHNvbG9fZGV2LT5wZGV2LCBzeXNfYWRkciwgc2l6ZSwKKwkJCQkgIHdyID8gUENJX0RNQV9UT0RFVklDRSA6IFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlyZXQgPSBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgaWQsIHdyLCBkbWFfYWRkciwgZXh0X2FkZHIsIHNpemUpOworCisJcGNpX3VubWFwX3NpbmdsZShzb2xvX2Rldi0+cGRldiwgZG1hX2FkZHIsIHNpemUsCisJCQkgd3IgPyBQQ0lfRE1BX1RPREVWSUNFIDogUENJX0RNQV9GUk9NREVWSUNFKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzb2xvX3AybV9kbWFfdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsIGludCB3ciwKKwkJICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc29sb19wMm1fZGV2ICpwMm1fZGV2OworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMDsKKworCVdBUk5fT04oIXNpemUpOworCVdBUk5fT04oaWQgPj0gU09MT19OUl9QMk0pOworCWlmICghc2l6ZSB8fCBpZCA+PSBTT0xPX05SX1AyTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwMm1fZGV2ID0gJnNvbG9fZGV2LT5wMm1fZGV2W2lkXTsKKworCWRvd24oJnAybV9kZXYtPnNlbSk7CisKK3N0YXJ0X2RtYToKKwlJTklUX0NPTVBMRVRJT04ocDJtX2Rldi0+Y29tcGxldGlvbik7CisJcDJtX2Rldi0+ZXJyb3IgPSAwOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9UQVJfQURSKGlkKSwgZG1hX2FkZHIpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9FWFRfQURSKGlkKSwgZXh0X2FkZHIpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9FWFRfQ0ZHKGlkKSwKKwkJICAgICAgIFNPTE9fUDJNX0NPUFlfU0laRShzaXplID4+IDIpKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09OVFJPTChpZCksCisJCSAgICAgICBTT0xPX1AyTV9CVVJTVF9TSVpFKFNPTE9fUDJNX0JVUlNUXzI1NikgfAorCQkgICAgICAgKHdyID8gU09MT19QMk1fV1JJVEUgOiAwKSB8IFNPTE9fUDJNX1RSQU5TX09OKTsKKworCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnAybV9kZXYtPmNvbXBsZXRpb24sIEhaKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9DT05UUk9MKGlkKSwgMCk7CisKKwkvKiBYWFggUmVhbGx5IGxvb2tzIHRvIG1lIGxpa2Ugd2Ugd2lsbCBnZXQgc3R1Y2sgaGVyZSBpZiBhCisJICogcmVhbCBQQ0kgUDJNIGVycm9yIG9jY3VycyAqLworCWlmIChwMm1fZGV2LT5lcnJvcikKKwkJZ290byBzdGFydF9kbWE7CisKKwl1cCgmcDJtX2Rldi0+c2VtKTsKKworCXJldHVybiAodGltZW91dCA9PSAwKSA/IC1FQUdBSU4gOiAwOworfQorCisjaWZkZWYgU09MT19URVNUX1AyTQorCisjZGVmaW5lIFAyTV9URVNUX0NIQVIJCTB4YmUKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBwMm1fdGVzdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCQkJICAgdTMyIGJhc2UsIGludCBzaXplKQoreworCXU4ICp3cl9idWY7CisJdTggKnJkX2J1ZjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXJyX2NudCA9IDA7CisKKwl3cl9idWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghd3JfYnVmKSB7CisJCXByaW50ayhTT0xPNjAxMF9OQU1FICI6IEZhaWxlZCB0byBtYWxsb2MgZm9yIHAybV90ZXN0XG4iKTsKKwkJcmV0dXJuIHNpemU7CisJfQorCisJcmRfYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkX2J1ZikgeworCQlwcmludGsoU09MTzYwMTBfTkFNRSAiOiBGYWlsZWQgdG8gbWFsbG9jIGZvciBwMm1fdGVzdFxuIik7CisJCWtmcmVlKHdyX2J1Zik7CisJCXJldHVybiBzaXplOworCX0KKworCW1lbXNldCh3cl9idWYsIFAyTV9URVNUX0NIQVIsIHNpemUpOworCW1lbXNldChyZF9idWYsIFAyTV9URVNUX0NIQVIgKyAxLCBzaXplKTsKKworCXNvbG9fcDJtX2RtYShzb2xvX2RldiwgaWQsIDEsIHdyX2J1ZiwgYmFzZSwgc2l6ZSk7CisJc29sb19wMm1fZG1hKHNvbG9fZGV2LCBpZCwgMCwgcmRfYnVmLCBiYXNlLCBzaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWlmICh3cl9idWZbaV0gIT0gcmRfYnVmW2ldKQorCQkJZXJyX2NudCsrOworCisJa2ZyZWUod3JfYnVmKTsKKwlrZnJlZShyZF9idWYpOworCisJcmV0dXJuIGVycl9jbnQ7Cit9CisKKyNkZWZpbmUgVEVTVF9DSFVOS19TSVpFCQkoOCAqIDEwMjQpCisKK3N0YXRpYyB2b2lkIHJ1bl9wMm1fdGVzdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXJycyA9IDA7CisJdTMyIHNpemUgPSBTT0xPX0pQRUdfRVhUX0FERFIoc29sb19kZXYpICsgU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KTsKKwlpbnQgaSwgZDsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUZXN0aW5nICV1IGJ5dGVzIG9mIGV4dGVybmFsIHJhbVxuIiwKKwkgICAgICAgU09MTzYwMTBfTkFNRSwgc2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBURVNUX0NIVU5LX1NJWkUpCisJCWZvciAoZCA9IDA7IGQgPCA0OyBkKyspCisJCQllcnJzICs9IHAybV90ZXN0KHNvbG9fZGV2LCBkLCBpLCBURVNUX0NIVU5LX1NJWkUpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZvdW5kICVsbHUgZXJyb3JzIGR1cmluZyBwMm0gdGVzdFxuIiwKKwkgICAgICAgU09MTzYwMTBfTkFNRSwgZXJycyk7CisKKwlyZXR1cm47Cit9CisjZWxzZQorI2RlZmluZSBydW5fcDJtX3Rlc3QoX19zb2xvKQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCit2b2lkIHNvbG9fcDJtX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IGlkKQoreworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0lSUV9TVEFULCBTT0xPX0lSUV9QMk0oaWQpKTsKKwljb21wbGV0ZSgmc29sb19kZXYtPnAybV9kZXZbaWRdLmNvbXBsZXRpb24pOworfQorCit2b2lkIHNvbG9fcDJtX2Vycm9yX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTMyIHN0YXR1cykKK3sKKwlzdHJ1Y3Qgc29sb19wMm1fZGV2ICpwMm1fZGV2OworCWludCBpOworCisJaWYgKCEoc3RhdHVzICYgU09MT19QQ0lfRVJSX1AyTSkpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBTT0xPX05SX1AyTTsgaSsrKSB7CisJCXAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaV07CisJCXAybV9kZXYtPmVycm9yID0gMTsKKwkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaSksIDApOworCQljb21wbGV0ZSgmcDJtX2Rldi0+Y29tcGxldGlvbik7CisJfQorfQorCit2b2lkIHNvbG9fcDJtX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09MT19OUl9QMk07IGkrKykKKwkJc29sbzYwMTBfaXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfUDJNKGkpKTsKK30KKworaW50IHNvbG9fcDJtX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc3RydWN0IHNvbG9fcDJtX2RldiAqcDJtX2RldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTT0xPX05SX1AyTTsgaSsrKSB7CisJCXAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaV07CisKKwkJaW5pdF9NVVRFWCgmcDJtX2Rldi0+c2VtKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZwMm1fZGV2LT5jb21wbGV0aW9uKTsKKworCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fREVTX0FEUihpKSwKKwkJCSAgICAgICBfX3BhKHAybV9kZXYtPmRlc2MpKTsKKworCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09OVFJPTChpKSwgMCk7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9DT05GSUcoaSksCisJCQkgICAgICAgU09MT19QMk1fQ1NDXzE2QklUXzU2NSB8CisJCQkgICAgICAgU09MT19QMk1fRE1BX0lOVEVSVkFMKDApIHwKKwkJCSAgICAgICBTT0xPX1AyTV9QQ0lfTUFTVEVSX01PREUpOworCQlzb2xvNjAxMF9pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX1AyTShpKSk7CisJfQorCisJcnVuX3AybV90ZXN0KHNvbG9fZGV2KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXJlZ2lzdGVycy5oIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXJlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOWQzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtcmVnaXN0ZXJzLmgKQEAgLTAsMCArMSw2NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZWNoZXJyeSwgTExDIHd3dy5ibHVlY2hlcnJ5ZHZyLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19TT0xPNjAxMF9SRUdJU1RFUlNfSAorI2RlZmluZSBfX1NPTE82MDEwX1JFR0lTVEVSU19ICisKKyNpbmNsdWRlICJzb2xvNjAxMC1vZmZzZXRzLmgiCisKKy8qIEdsb2JhbCA2MDEwIHN5c3RlbSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNPTE9fU1lTX0NGRwkJCQkweDAwMDAKKyNkZWZpbmUgICBTT0xPX1NZU19DRkdfRk9VVF9FTgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgICBTT0xPX1NZU19DRkdfUExMX0JZUEFTUwkJMHgwMDAwMDAwMgorI2RlZmluZSAgIFNPTE9fU1lTX0NGR19QTExfUFdETgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgICBTT0xPX1NZU19DRkdfT1VURElWKF9fbikJCSgoKF9fbikgJiAweDAwMykgPDwgMykKKyNkZWZpbmUgICBTT0xPX1NZU19DRkdfRkVFREJBQ0tESVYoX19uKQkJKCgoX19uKSAmIDB4MWZmKSA8PCA1KQorI2RlZmluZSAgIFNPTE9fU1lTX0NGR19JTlBVVERJVihfX24pCQkoKChfX24pICYgMHgwMWYpIDw8IDE0KQorI2RlZmluZSAgIFNPTE9fU1lTX0NGR19DTE9DS19ESVYJCTB4MDAwODAwMDAKKyNkZWZpbmUgICBTT0xPX1NZU19DRkdfTkNMS19ERUxBWShfX24pCQkoKChfX24pICYgMHgwMDMpIDw8IDI0KQorI2RlZmluZSAgIFNPTE9fU1lTX0NGR19QQ0xLX0RFTEFZKF9fbikJCSgoKF9fbikgJiAweDAwZikgPDwgMjYpCisjZGVmaW5lICAgU09MT19TWVNfQ0ZHX1NEUkFNNjRCSVQJCTB4NDAwMDAwMDAKKyNkZWZpbmUgICBTT0xPX1NZU19DRkdfUkVTRVQJCQkweDgwMDAwMDAwCisKKyNkZWZpbmUJU09MT19ETUFfQ1RSTAkJCQkweDAwMDQKKyNkZWZpbmUJICBTT0xPX0RNQV9DVFJMX1JFRlJFU0hfQ1lDTEUobikJKChuKTw8OCkKKy8qIDA9MTYvMzJNQiwgMT0zMi82NE1CLCAyPTY0LzEyOE1CLCAzPTEyOC8yNTZNQiAqLworI2RlZmluZQkgIFNPTE9fRE1BX0NUUkxfU0RSQU1fU0laRShuKQkJKChuKTw8NikKKyNkZWZpbmUJICBTT0xPX0RNQV9DVFJMX1NEUkFNX0NMS19JTlZFUlQJKDE8PDUpCisjZGVmaW5lCSAgU09MT19ETUFfQ1RSTF9TVFJPQkVfU0VMRUNUCQkoMTw8NCkKKyNkZWZpbmUJICBTT0xPX0RNQV9DVFJMX1JFQURfREFUQV9TRUxFQ1QJKDE8PDMpCisjZGVmaW5lCSAgU09MT19ETUFfQ1RSTF9SRUFEX0NMS19TRUxFQ1QJCSgxPDwyKQorI2RlZmluZQkgIFNPTE9fRE1BX0NUUkxfTEFURU5DWShuKQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX1NZU19WQ0xLCQkJCTB4MDAwQworI2RlZmluZQkgIFNPTE9fVkNMS19JTlZFUlQJCQkoMTw8MjIpCisvKiAwPXN5c19jbGsvNCwgMT1zeXNfY2xrLzIsIDI9Y2xrX2luLzIgb2Ygc3lzdGVtIGlucHV0ICovCisjZGVmaW5lCSAgU09MT19WQ0xLX1NFTEVDVChuKQkJCSgobik8PDIwKQorI2RlZmluZQkgIFNPTE9fVkNMS19WSU4xNDE1X0RFTEFZKG4pCQkoKG4pPDwxNCkKKyNkZWZpbmUJICBTT0xPX1ZDTEtfVklOMTIxM19ERUxBWShuKQkJKChuKTw8MTIpCisjZGVmaW5lCSAgU09MT19WQ0xLX1ZJTjEwMTFfREVMQVkobikJCSgobik8PDEwKQorI2RlZmluZQkgIFNPTE9fVkNMS19WSU4wODA5X0RFTEFZKG4pCQkoKG4pPDw4KQorI2RlZmluZQkgIFNPTE9fVkNMS19WSU4wNjA3X0RFTEFZKG4pCQkoKG4pPDw2KQorI2RlZmluZQkgIFNPTE9fVkNMS19WSU4wNDA1X0RFTEFZKG4pCQkoKG4pPDw0KQorI2RlZmluZQkgIFNPTE9fVkNMS19WSU4wMjAzX0RFTEFZKG4pCQkoKG4pPDwyKQorI2RlZmluZQkgIFNPTE9fVkNMS19WSU4wMDAxX0RFTEFZKG4pCQkoKG4pPDwwKQorCisjZGVmaW5lIFNPTE9fSVJRX1NUQVQJCQkJMHgwMDEwCisjZGVmaW5lIFNPTE9fSVJRX0VOQUJMRQkJCQkweDAwMTQKKyNkZWZpbmUJICBTT0xPX0lSUV9QMk0obikJCQkoMTw8KChuKSsxNykpCisjZGVmaW5lCSAgU09MT19JUlFfR1BJTwkJCQkoMTw8MTYpCisjZGVmaW5lCSAgU09MT19JUlFfVklERU9fTE9TUwkJCSgxPDwxNSkKKyNkZWZpbmUJICBTT0xPX0lSUV9WSURFT19JTgkJCSgxPDwxNCkKKyNkZWZpbmUJICBTT0xPX0lSUV9NT1RJT04JCQkoMTw8MTMpCisjZGVmaW5lCSAgU09MT19JUlFfQVRBX0NNRAkJCSgxPDwxMikKKyNkZWZpbmUJICBTT0xPX0lSUV9BVEFfRElSCQkJKDE8PDExKQorI2RlZmluZQkgIFNPTE9fSVJRX1BDSV9FUlIJCQkoMTw8MTApCisjZGVmaW5lCSAgU09MT19JUlFfUFMyXzEJCQkoMTw8OSkKKyNkZWZpbmUJICBTT0xPX0lSUV9QUzJfMAkJCSgxPDw4KQorI2RlZmluZQkgIFNPTE9fSVJRX1NQSQkJCQkoMTw8NykKKyNkZWZpbmUJICBTT0xPX0lSUV9JSUMJCQkJKDE8PDYpCisjZGVmaW5lCSAgU09MT19JUlFfVUFSVChuKQkJCSgxPDwoKG4pICsgNCkpCisjZGVmaW5lCSAgU09MT19JUlFfRzcyMwkJCQkoMTw8MykKKyNkZWZpbmUJICBTT0xPX0lSUV9ERUNPREVSCQkJKDE8PDEpCisjZGVmaW5lCSAgU09MT19JUlFfRU5DT0RFUgkJCSgxPDwwKQorCisjZGVmaW5lIFNPTE9fQ0hJUF9PUFRJT04JCQkweDAwMUMKKyNkZWZpbmUgICBTT0xPX0NISVBfSURfTUFTSwkJCTB4MDAwMDAwMDcKKworI2RlZmluZSBTT0xPX0VFUFJPTV9DVFJMCQkJMHgwMDYwCisjZGVmaW5lCSAgU09MT19FRVBST01fQUNDRVNTX0VOCQkJKDE8PDcpCisjZGVmaW5lCSAgU09MT19FRVBST01fQ1MJCQkoMTw8MykKKyNkZWZpbmUJICBTT0xPX0VFUFJPTV9DTEsJCQkoMTw8MikKKyNkZWZpbmUJICBTT0xPX0VFUFJPTV9ETwkJCSgxPDwxKQorI2RlZmluZQkgIFNPTE9fRUVQUk9NX0RJCQkJKDE8PDApCisjZGVmaW5lCSAgU09MT19FRVBST01fRU5BQkxFCQkJKEVFUFJPTV9BQ0NFU1NfRU4gfCBFRVBST01fQ1MpCisKKyNkZWZpbmUgU09MT19QQ0lfRVJSCQkJCTB4MDA3MAorI2RlZmluZSAgIFNPTE9fUENJX0VSUl9GQVRBTAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgICBTT0xPX1BDSV9FUlJfUEFSSVRZCQkJMHgwMDAwMDAwMgorI2RlZmluZSAgIFNPTE9fUENJX0VSUl9UQVJHRVQJCQkweDAwMDAwMDA0CisjZGVmaW5lICAgU09MT19QQ0lfRVJSX1RJTUVPVVQJCQkweDAwMDAwMDA4CisjZGVmaW5lICAgU09MT19QQ0lfRVJSX1AyTQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgICBTT0xPX1BDSV9FUlJfQVRBCQkJMHgwMDAwMDAyMAorI2RlZmluZSAgIFNPTE9fUENJX0VSUl9QMk1fREVTQwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgICBTT0xPX1BDSV9FUlJfRlNNMChfX3MpCQkoKChfX3MpID4+IDE2KSAmIDB4MGYpCisjZGVmaW5lICAgU09MT19QQ0lfRVJSX0ZTTTEoX19zKQkJKCgoX19zKSA+PiAyMCkgJiAweDBmKQorI2RlZmluZSAgIFNPTE9fUENJX0VSUl9GU00yKF9fcykJCSgoKF9fcykgPj4gMjQpICYgMHgxZikKKworI2RlZmluZSBTT0xPX1AyTV9CQVNFCQkJCTB4MDA4MAorCisjZGVmaW5lIFNPTE9fUDJNX0NPTkZJRyhuKQkJCSgweDAwODAgKyAoKG4pKjB4MjApKQorI2RlZmluZQkgIFNPTE9fUDJNX0RNQV9JTlRFUlZBTChuKQkJKChuKTw8NikvKiBOKjMyIGNsb2NrcyAqLworI2RlZmluZQkgIFNPTE9fUDJNX0NTQ19CWVRFX1JFT1JERVIJCSgxPDw1KQkvKiBCR1IgLT4gUkdCICovCisvKiAwOnI9WzE0OjEwXSBnPVs5OjVdIGI9WzQ6MF0sIDE6cj1bMTU6MTFdIGc9WzEwOjVdIGI9WzQ6MF0gKi8KKyNkZWZpbmUJICBTT0xPX1AyTV9DU0NfMTZCSVRfNTY1CQkoMTw8NCkKKyNkZWZpbmUJICBTT0xPX1AyTV9VVl9TV0FQCQkJKDE8PDMpCisjZGVmaW5lCSAgU09MT19QMk1fUENJX01BU1RFUl9NT0RFCQkoMTw8MikKKyNkZWZpbmUJICBTT0xPX1AyTV9ERVNDX0lOVFJfT1BUCQkoMTw8MSkJLyogMTpFbXB0eSwgMDpFYWNoICovCisjZGVmaW5lCSAgU09MT19QMk1fREVTQ19NT0RFCQkJKDE8PDApCisKKyNkZWZpbmUgU09MT19QMk1fREVTX0FEUihuKQkJCSgweDAwODQgKyAoKG4pKjB4MjApKQorCisjZGVmaW5lIFNPTE9fUDJNX0RFU0NfSUQobikJCQkoMHgwMDg4ICsgKChuKSoweDIwKSkKKyNkZWZpbmUJICBTT0xPX1AyTV9VUERBVEVfSUQobikJCQkoKG4pPDwwKQorCisjZGVmaW5lIFNPTE9fUDJNX1NUQVRVUyhuKQkJCSgweDAwOEMgKyAoKG4pKjB4MjApKQorI2RlZmluZQkgIFNPTE9fUDJNX0NPTU1BTkRfRE9ORQkJCSgxPDw4KQorI2RlZmluZQkgIFNPTE9fUDJNX0NVUlJFTlRfSUQoc3RhdCkJCSgweGZmICYgKHN0YXQpKQorCisjZGVmaW5lIFNPTE9fUDJNX0NPTlRST0wobikJCQkoMHgwMDkwICsgKChuKSoweDIwKSkKKyNkZWZpbmUJICBTT0xPX1AyTV9QQ0lfSU5DKG4pCQkJKChuKTw8MjApCisjZGVmaW5lCSAgU09MT19QMk1fUkVQRUFUKG4pCQkJKChuKTw8MTApCisvKiAwOjUxMiwgMToyNTYsIDI6MTI4LCAzOjY0LCA0OjMyLCA1OjEyOCgycGFnZSkgKi8KKyNkZWZpbmUJICBTT0xPX1AyTV9CVVJTVF9TSVpFKG4pCQkoKG4pPDw3KQorI2RlZmluZQkgICAgU09MT19QMk1fQlVSU1RfNTEyCQkJMAorI2RlZmluZQkgICAgU09MT19QMk1fQlVSU1RfMjU2CQkJMQorI2RlZmluZQkgICAgU09MT19QMk1fQlVSU1RfMTI4CQkJMgorI2RlZmluZQkgICAgU09MT19QMk1fQlVSU1RfNjQJCQkzCisjZGVmaW5lCSAgICBTT0xPX1AyTV9CVVJTVF8zMgkJCTQKKyNkZWZpbmUJICBTT0xPX1AyTV9DU0NfMTZCSVQJCQkoMTw8NikJLyogMDoyNGJpdCwgMToxNmJpdCAqLworLyogMDpZWzBdPC0wKE9GRiksIDE6WVswXTwtMShPTiksIDI6WVswXTwtR1swXSwgMzpZWzBdPC1CaXRbMTVdICovCisjZGVmaW5lCSAgU09MT19QMk1fQUxQSEFfTU9ERShuKQkJKChuKTw8NCkKKyNkZWZpbmUJICBTT0xPX1AyTV9DU0NfT04JCQkoMTw8MykKKyNkZWZpbmUJICBTT0xPX1AyTV9JTlRFUlJVUFRfUkVRCQkoMTw8MikKKyNkZWZpbmUJICBTT0xPX1AyTV9XUklURQkJCSgxPDwxKQorI2RlZmluZQkgIFNPTE9fUDJNX1RSQU5TX09OCQkJKDE8PDApCisKKyNkZWZpbmUgU09MT19QMk1fRVhUX0NGRyhuKQkJCSgweDAwOTQgKyAoKG4pKjB4MjApKQorI2RlZmluZQkgIFNPTE9fUDJNX0VYVF9JTkMobikJCQkoKG4pPDwyMCkKKyNkZWZpbmUJICBTT0xPX1AyTV9DT1BZX1NJWkUobikJCQkoKG4pPDwwKQorCisjZGVmaW5lIFNPTE9fUDJNX1RBUl9BRFIobikJCQkoMHgwMDk4ICsgKChuKSoweDIwKSkKKworI2RlZmluZSBTT0xPX1AyTV9FWFRfQURSKG4pCQkJKDB4MDA5QyArICgobikqMHgyMCkpCisKKyNkZWZpbmUgU09MT19QMk1fQlVGRkVSKGkpCQkJKDB4MjAwMCArICgoaSkqNCkpCisKKyNkZWZpbmUgU09MT19WSV9DSF9TV0lUQ0hfMAkJCTB4MDEwMAorI2RlZmluZSBTT0xPX1ZJX0NIX1NXSVRDSF8xCQkJMHgwMTA0CisjZGVmaW5lIFNPTE9fVklfQ0hfU1dJVENIXzIJCQkweDAxMDgKKworI2RlZmluZQlTT0xPX1ZJX0NIX0VOQQkJCQkweDAxMEMKKyNkZWZpbmUJU09MT19WSV9DSF9GT1JNQVQJCQkweDAxMTAKKyNkZWZpbmUJICBTT0xPX1ZJX0ZEX1NFTF9NQVNLKG4pCQkoKG4pPDwxNikKKyNkZWZpbmUJICBTT0xPX1ZJX1BST0dfTUFTSyhuKQkJCSgobik8PDApCisKKyNkZWZpbmUgU09MT19WSV9GTVRfQ0ZHCQkJCTB4MDExNAorI2RlZmluZQkgIFNPTE9fVklfRk1UX0NIRUNLX1ZDT1VOVAkJKDE8PDMxKQorI2RlZmluZQkgIFNPTE9fVklfRk1UX0NIRUNLX0hDT1VOVAkJKDE8PDMwKQorI2RlZmluZSAgIFNPTE9fVklfRk1UX1RFU1RfU0lHTkFMCQkoMTw8MjgpCisKKyNkZWZpbmUJU09MT19WSV9QQUdFX1NXCQkJCTB4MDExOAorI2RlZmluZQkgIFNPTE9fRklfSU5WX0RJU1BfTElWRShuKQkJKChuKTw8OCkKKyNkZWZpbmUJICBTT0xPX0ZJX0lOVl9ESVNQX09VVChuKQkJKChuKTw8NykKKyNkZWZpbmUJICBTT0xPX0RJU1BfU1lOQ19GSShuKQkJCSgobik8PDYpCisjZGVmaW5lCSAgU09MT19QSVBfUEFHRV9BREQobikJCQkoKG4pPDwzKQorI2RlZmluZQkgIFNPTE9fTk9STUFMX1BBR0VfQUREKG4pCQkoKG4pPDwwKQorCisjZGVmaW5lCVNPTE9fVklfQUNUX0lfUAkJCQkweDAxMUMKKyNkZWZpbmUJU09MT19WSV9BQ1RfSV9TCQkJCTB4MDEyMAorI2RlZmluZQlTT0xPX1ZJX0FDVF9QCQkJCTB4MDEyNAorI2RlZmluZQkgIFNPTE9fVklfRklfSU5WRVJUCQkJKDE8PDMxKQorI2RlZmluZQkgIFNPTE9fVklfSF9TVEFSVChuKQkJCSgobik8PDIxKQorI2RlZmluZQkgIFNPTE9fVklfVl9TVEFSVChuKQkJCSgobik8PDExKQorI2RlZmluZQkgIFNPTE9fVklfVl9TVE9QKG4pCQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX1ZJX1NUQVRVUzAJCQkJMHgwMTI4CisjZGVmaW5lICAgU09MT19WSV9TVEFUVVMwX1BBR0UoX19uKQkJKChfX24pICYgMHgwNykKKyNkZWZpbmUgU09MT19WSV9TVEFUVVMxCQkJCTB4MDEyQworCisvKiBYWFg6IE1pZ2h0IGJlIGJldHRlciBvZmYgaW4ga2VybmVsIGxldmVsIGRpc3AuaCAqLworI2RlZmluZSBESVNQX1BBR0Uoc3RhdCkJCQkJKChzdGF0KSAmIDB4MDcpCisKKyNkZWZpbmUgU09MT19WSV9QQl9DT05GSUcJCQkweDAxMzAKKyNkZWZpbmUJICBTT0xPX1ZJX1BCX1VTRVJfTU9ERQkJCSgxPDwxKQorI2RlZmluZQkgIFNPTE9fVklfUEJfUEFMCQkJKDE8PDApCisjZGVmaW5lIFNPTE9fVklfUEJfUkFOR0VfSFYJCQkweDAxMzQKKyNkZWZpbmUJICBTT0xPX1ZJX1BCX0hTSVpFKGgpCQkJKChoKTw8MTIpCisjZGVmaW5lCSAgU09MT19WSV9QQl9WU0laRSh2KQkJCSgodik8PDApCisjZGVmaW5lIFNPTE9fVklfUEJfQUNUX0gJCQkweDAxMzgKKyNkZWZpbmUJICBTT0xPX1ZJX1BCX0hTVEFSVChuKQkJCSgobik8PDEyKQorI2RlZmluZQkgIFNPTE9fVklfUEJfSFNUT1AobikJCQkoKG4pPDwwKQorI2RlZmluZSBTT0xPX1ZJX1BCX0FDVF9WCQkJMHgwMTNDCisjZGVmaW5lCSAgU09MT19WSV9QQl9WU1RBUlQobikJCQkoKG4pPDwxMikKKyNkZWZpbmUJICBTT0xPX1ZJX1BCX1ZTVE9QKG4pCQkJKChuKTw8MCkKKworI2RlZmluZQlTT0xPX1ZJX01PU0FJQyhjaCkJCQkoMHgwMTQwICsgKChjaCkqNCkpCisjZGVmaW5lCSAgU09MT19WSV9NT1NBSUNfU1goeCkJCQkoKHgpPDwyNCkKKyNkZWZpbmUJICBTT0xPX1ZJX01PU0FJQ19FWCh4KQkJCSgoeCk8PDE2KQorI2RlZmluZQkgIFNPTE9fVklfTU9TQUlDX1NZKHgpCQkJKCh4KTw8OCkKKyNkZWZpbmUJICBTT0xPX1ZJX01PU0FJQ19FWSh4KQkJCSgoeCk8PDApCisKKyNkZWZpbmUJU09MT19WSV9XSU5fQ1RSTDAoY2gpCQkJKDB4MDE4MCArICgoY2gpKjQpKQorI2RlZmluZQlTT0xPX1ZJX1dJTl9DVFJMMShjaCkJCQkoMHgwMUMwICsgKChjaCkqNCkpCisKKyNkZWZpbmUJICBTT0xPX1ZJX1dJTl9DSEFOTkVMKG4pCQkoKG4pPDwyOCkKKworI2RlZmluZQkgIFNPTE9fVklfV0lOX1BJUChuKQkJCSgobik8PDI3KQorI2RlZmluZQkgIFNPTE9fVklfV0lOX1NDQUxFKG4pCQkJKChuKTw8MjQpCisKKyNkZWZpbmUJICBTT0xPX1ZJX1dJTl9TWCh4KQkJCSgoeCk8PDEyKQorI2RlZmluZQkgIFNPTE9fVklfV0lOX0VYKHgpCQkJKCh4KTw8MCkKKworI2RlZmluZQkgIFNPTE9fVklfV0lOX1NZKHgpCQkJKCh4KTw8MTIpCisjZGVmaW5lCSAgU09MT19WSV9XSU5fRVkoeCkJCQkoKHgpPDwwKQorCisjZGVmaW5lCVNPTE9fVklfV0lOX09OKGNoKQkJCSgweDAyMDAgKyAoKGNoKSo0KSkKKworI2RlZmluZSBTT0xPX1ZJX1dJTl9TVwkJCQkweDAyNDAKKyNkZWZpbmUgU09MT19WSV9XSU5fTElWRV9BVVRPX01VVEUJCTB4MDI0NAorCisjZGVmaW5lCVNPTE9fVklfTU9UX0FEUgkJCQkweDAyNjAKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9FTihtYXNrKQkJKChtYXNrKTw8MTYpCisjZGVmaW5lCVNPTE9fVklfTU9UX0NUUkwJCQkweDAyNjQKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9GUkFNRV9DT1VOVChuKQkJKChuKTw8MjQpCisjZGVmaW5lCSAgU09MT19WSV9NT1RJT05fU0FNUExFX0xFTkdUSChuKQkoKG4pPDwxNikKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9JTlRSX1NUQVJUX1NUT1AJKDE8PDE1KQorI2RlZmluZQkgIFNPTE9fVklfTU9USU9OX0ZSRUVaRV9EQVRBCQkoMTw8MTQpCisjZGVmaW5lCSAgU09MT19WSV9NT1RJT05fU0FNUExFX0NPVU5UKG4pCSgobik8PDApCisjZGVmaW5lIFNPTE9fVklfTU9UX0NMRUFSCQkJMHgwMjY4CisjZGVmaW5lIFNPTE9fVklfTU9UX1NUQVRVUwkJCTB4MDI2QworI2RlZmluZQkgIFNPTE9fVklfTU9USU9OX0NOVChuKQkJCSgobik8PDApCisjZGVmaW5lIFNPTE9fVklfTU9USU9OX0JPUkRFUgkJCTB4MDI3MAorI2RlZmluZSBTT0xPX1ZJX01PVElPTl9CQVIJCQkweDAyNzQKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9ZX1NFVAkJCSgxPDwyOSkKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9ZX0FERAkJCSgxPDwyOCkKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9DQl9TRVQJCQkoMTw8MjcpCisjZGVmaW5lCSAgU09MT19WSV9NT1RJT05fQ0JfQURECQkJKDE8PDI2KQorI2RlZmluZQkgIFNPTE9fVklfTU9USU9OX0NSX1NFVAkJCSgxPDwyNSkKKyNkZWZpbmUJICBTT0xPX1ZJX01PVElPTl9DUl9BREQJCQkoMTw8MjQpCisjZGVmaW5lCSAgU09MT19WSV9NT1RJT05fWV9WQUxVRSh2KQkJKCh2KTw8MTYpCisjZGVmaW5lCSAgU09MT19WSV9NT1RJT05fQ0JfVkFMVUUodikJCSgodik8PDgpCisjZGVmaW5lCSAgU09MT19WSV9NT1RJT05fQ1JfVkFMVUUodikJCSgodik8PDApCisKKyNkZWZpbmUJU09MT19WT19GTVRfRU5DCQkJCTB4MDMwMAorI2RlZmluZQkgIFNPTE9fVk9fU0NBTl9NT0RFX1BST0dSRVNTSVZFCQkoMTw8MzEpCisjZGVmaW5lCSAgU09MT19WT19GTVRfVFlQRV9QQUwJCQkoMTw8MzApCisjZGVmaW5lICAgU09MT19WT19GTVRfVFlQRV9OVFNDCQkJMAorI2RlZmluZQkgIFNPTE9fVk9fVVNFUl9TRVQJCQkoMTw8MjkpCisKKyNkZWZpbmUJICBTT0xPX1ZPX0ZJX0NIQU5HRQkJCSgxPDwyMCkKKyNkZWZpbmUJICBTT0xPX1ZPX1VTRVJfQ09MT1JfU0VUX1ZTWU5DCQkoMTw8MTkpCisjZGVmaW5lCSAgU09MT19WT19VU0VSX0NPTE9SX1NFVF9IU1lOQwkJKDE8PDE4KQorI2RlZmluZQkgIFNPTE9fVk9fVVNFUl9DT0xPUl9TRVRfTkFWCQkoMTw8MTcpCisjZGVmaW5lCSAgU09MT19WT19VU0VSX0NPTE9SX1NFVF9OQUgJCSgxPDwxNikKKyNkZWZpbmUJICBTT0xPX1ZPX05BX0NPTE9SX1koWSkJCQkoKFkpPDw4KQorI2RlZmluZQkgIFNPTE9fVk9fTkFfQ09MT1JfQ0IoQ0IpCQkoKChDQikvMTYpPDw0KQorI2RlZmluZQkgIFNPTE9fVk9fTkFfQ09MT1JfQ1IoQ1IpCQkoKChDUikvMTYpPDwwKQorCisjZGVmaW5lCVNPTE9fVk9fQUNUX0gJCQkJMHgwMzA0CisjZGVmaW5lCSAgU09MT19WT19IX0JMQU5LKG4pCQkJKChuKTw8MjIpCisjZGVmaW5lCSAgU09MT19WT19IX1NUQVJUKG4pCQkJKChuKTw8MTEpCisjZGVmaW5lCSAgU09MT19WT19IX1NUT1AobikJCQkoKG4pPDwwKQorCisjZGVmaW5lCVNPTE9fVk9fQUNUX1YJCQkJMHgwMzA4CisjZGVmaW5lCSAgU09MT19WT19WX0JMQU5LKG4pCQkJKChuKTw8MjIpCisjZGVmaW5lCSAgU09MT19WT19WX1NUQVJUKG4pCQkJKChuKTw8MTEpCisjZGVmaW5lCSAgU09MT19WT19WX1NUT1AobikJCQkoKG4pPDwwKQorCisjZGVmaW5lCVNPTE9fVk9fUkFOR0VfSFYJCQkweDAzMEMKKyNkZWZpbmUJICBTT0xPX1ZPX1NZTkNfSU5WRVJUCQkJKDE8PDI0KQorI2RlZmluZQkgIFNPTE9fVk9fSFNZTkNfSU5WRVJUCQkJKDE8PDIzKQorI2RlZmluZQkgIFNPTE9fVk9fVlNZTkNfSU5WRVJUCQkJKDE8PDIyKQorI2RlZmluZQkgIFNPTE9fVk9fSF9MRU4obikJCQkoKG4pPDwxMSkKKyNkZWZpbmUJICBTT0xPX1ZPX1ZfTEVOKG4pCQkJKChuKTw8MCkKKworI2RlZmluZQlTT0xPX1ZPX0RJU1BfQ1RSTAkJCTB4MDMxMAorI2RlZmluZQkgIFNPTE9fVk9fRElTUF9PTgkJCSgxPDwzMSkKKyNkZWZpbmUJICBTT0xPX1ZPX0RJU1BfRVJBU0VfQ09VTlQobikJCSgobiYweGYpPDwyNCkKKyNkZWZpbmUJICBTT0xPX1ZPX0RJU1BfRE9VQkxFX1NDQU4JCSgxPDwyMikKKyNkZWZpbmUJICBTT0xPX1ZPX0RJU1BfU0lOR0xFX1BBR0UJCSgxPDwyMSkKKyNkZWZpbmUJICBTT0xPX1ZPX0RJU1BfQkFTRShuKQkJCSgoKG4pPj4xNikgJiAweGZmZmYpCisKKyNkZWZpbmUgU09MT19WT19ESVNQX0VSQVNFCQkJMHgwMzE0CisjZGVmaW5lCSAgU09MT19WT19ESVNQX0VSQVNFX09OCQkJKDE8PDApCisKKyNkZWZpbmUJU09MT19WT19aT09NX0NUUkwJCQkweDAzMTgKKyNkZWZpbmUJICBTT0xPX1ZPX1pPT01fVkVSX09OCQkJKDE8PDI0KQorI2RlZmluZQkgIFNPTE9fVk9fWk9PTV9IT1JfT04JCQkoMTw8MjMpCisjZGVmaW5lCSAgU09MT19WT19aT09NX1ZfQ09NUAkJCSgxPDwyMikKKyNkZWZpbmUJICBTT0xPX1ZPX1pPT01fU1goaCkJCQkoKChoKS8yKTw8MTEpCisjZGVmaW5lCSAgU09MT19WT19aT09NX1NZKHYpCQkJKCgodikvMik8PDApCisKKyNkZWZpbmUgU09MT19WT19GUkVFWkVfQ1RSTAkJCTB4MDMxQworI2RlZmluZQkgIFNPTE9fVk9fRlJFRVpFX09OCQkJKDE8PDEpCisjZGVmaW5lCSAgU09MT19WT19GUkVFWkVfSU5URVJQT0xBVElPTgkJKDE8PDApCisKKyNkZWZpbmUJU09MT19WT19CS0dfQ09MT1IJCQkweDAzMjAKKyNkZWZpbmUJICBTT0xPX0JHX1koeSkJCQkJKCh5KTw8MTYpCisjZGVmaW5lCSAgU09MT19CR19VKHUpCQkJCSgodSk8PDgpCisjZGVmaW5lCSAgU09MT19CR19WKHYpCQkJCSgodik8PDApCisKKyNkZWZpbmUJU09MT19WT19ERUlOVEVSTEFDRQkJCTB4MDMyNAorI2RlZmluZQkgIFNPTE9fVk9fREVJTlRFUkxBQ0VfVEhSRVNIT0xEKG4pCSgobik8PDgpCisjZGVmaW5lCSAgU09MT19WT19ERUlOVEVSTEFDRV9FREdFX1ZBTFVFKG4pCSgobik8PDApCisKKyNkZWZpbmUgU09MT19WT19CT1JERVJfTElORV9DT0xPUgkJMHgwMzMwCisjZGVmaW5lIFNPTE9fVk9fQk9SREVSX0ZJTExfQ09MT1IJCTB4MDMzNAorI2RlZmluZSBTT0xPX1ZPX0JPUkRFUl9MSU5FX01BU0sJCTB4MDMzOAorI2RlZmluZSBTT0xPX1ZPX0JPUkRFUl9GSUxMX01BU0sJCTB4MDMzYworCisjZGVmaW5lIFNPTE9fVk9fQk9SREVSX1gobikJCQkoMHgwMzQwKygobikqNCkpCisjZGVmaW5lIFNPTE9fVk9fQk9SREVSX1kobikJCQkoMHgwMzU0KygobikqNCkpCisKKyNkZWZpbmUgU09MT19WT19DRUxMX0VYVF9TRVQJCQkweDAzNjgKKyNkZWZpbmUgU09MT19WT19DRUxMX0VYVF9TVEFSVAkJCTB4MDM2YworI2RlZmluZSBTT0xPX1ZPX0NFTExfRVhUX1NUT1AJCQkweDAzNzAKKworI2RlZmluZSBTT0xPX1ZPX0NFTExfRVhUX1NFVDIJCQkweDAzNzQKKyNkZWZpbmUgU09MT19WT19DRUxMX0VYVF9TVEFSVDIJCQkweDAzNzgKKyNkZWZpbmUgU09MT19WT19DRUxMX0VYVF9TVE9QMgkJCTB4MDM3YworCisjZGVmaW5lIFNPTE9fVk9fUkVDVEFOR0xFX0NUUkwobikJCSgweDAzNjgrKChuKSoxMikpCisjZGVmaW5lIFNPTE9fVk9fUkVDVEFOR0xFX1NUQVJUKG4pCQkoMHgwMzZjKygobikqMTIpKQorI2RlZmluZSBTT0xPX1ZPX1JFQ1RBTkdMRV9TVE9QKG4pCQkoMHgwMzcwKygobikqMTIpKQorCisjZGVmaW5lIFNPTE9fVk9fQ1VSU09SX1BPUwkJCSgweDAzODApCisjZGVmaW5lIFNPTE9fVk9fQ1VSU09SX0NMUgkJCSgweDAzODQpCisjZGVmaW5lIFNPTE9fVk9fQ1VSU09SX0NMUjIJCQkoMHgwMzg4KQorI2RlZmluZSBTT0xPX1ZPX0NVUlNPUl9NQVNLKGlkKQkJCSgweDAzOTArKChpZCkqNCkpCisKKyNkZWZpbmUgU09MT19WT19FWFBBTlNJT04oaWQpCQkJKDB4MDI1MCsoKGlkKSo0KSkKKworI2RlZmluZQlTT0xPX09TR19DT05GSUcJCQkJMHgwM0UwCisjZGVmaW5lCSAgU09MT19WT19PU0dfT04JCQkoMTw8MzEpCisjZGVmaW5lCSAgU09MT19WT19PU0dfQ09MT1JfTVVURQkJKDE8PDI4KQorI2RlZmluZQkgIFNPTE9fVk9fT1NHX0FMUEhBX1JBVEUobikJCSgobik8PDIyKQorI2RlZmluZQkgIFNPTE9fVk9fT1NHX0FMUEhBX0JHX1JBVEUobikJCSgobik8PDE2KQorI2RlZmluZQkgIFNPTE9fVk9fT1NHX0JBU0Uob2Zmc2V0KQkJKCgob2Zmc2V0KT4+MTYpJjB4ZmZmZikKKworI2RlZmluZSBTT0xPX09TR19FUkFTRQkJCQkweDAzRTQKKyNkZWZpbmUJICBTT0xPX09TR19FUkFTRV9PTgkJCSgweDgwKQorI2RlZmluZQkgIFNPTE9fT1NHX0VSQVNFX09GRgkJCSgweDAwKQorCisjZGVmaW5lIFNPTE9fVk9fT1NHX0JMSU5LCQkJMHgwM0U4CisjZGVmaW5lCSAgU09MT19WT19PU0dfQkxJTktfT04JCQkoMTw8MSkKKyNkZWZpbmUJICBTT0xPX1ZPX09TR19CTElOS19JTlRSRVZBTDE4CQkoMTw8MCkKKworI2RlZmluZSBTT0xPX0NBUF9CQVNFCQkJCTB4MDQwMAorI2RlZmluZQkgIFNPTE9fQ0FQX01BWF9QQUdFKG4pCQkJKChuKTw8MTYpCisjZGVmaW5lCSAgU09MT19DQVBfQkFTRV9BRERSKG4pCQkJKChuKTw8MCkKKyNkZWZpbmUgU09MT19DQVBfQlRXCQkJCTB4MDQwNAorI2RlZmluZQkgIFNPTE9fQ0FQX1BST0dfQkFORFdJRFRIKG4pCQkoKG4pPDw4KQorI2RlZmluZQkgIFNPTE9fQ0FQX01BWF9CQU5EV0lEVEgobikJCSgobik8PDApCisKKyNkZWZpbmUgU09MT19ESU1fU0NBTEUxCQkJCTB4MDQwOAorI2RlZmluZSBTT0xPX0RJTV9TQ0FMRTIJCQkJMHgwNDBDCisjZGVmaW5lIFNPTE9fRElNX1NDQUxFMwkJCQkweDA0MTAKKyNkZWZpbmUgU09MT19ESU1fU0NBTEU0CQkJCTB4MDQxNAorI2RlZmluZSBTT0xPX0RJTV9TQ0FMRTUJCQkJMHgwNDE4CisjZGVmaW5lCSAgU09MT19ESU1fVl9NQl9OVU1fRlJBTUUobikJCSgobik8PDE2KQorI2RlZmluZQkgIFNPTE9fRElNX1ZfTUJfTlVNX0ZJRUxEKG4pCQkoKG4pPDw4KQorI2RlZmluZQkgIFNPTE9fRElNX0hfTUJfTlVNKG4pCQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX0RJTV9QUk9HCQkJCTB4MDQxQworI2RlZmluZSBTT0xPX0NBUF9TVEFUVVMJCQkJMHgwNDIwCisKKyNkZWZpbmUgU09MT19DQVBfQ0hfU0NBTEUoY2gpCQkJKDB4MDQ0MCsoKGNoKSo0KSkKKyNkZWZpbmUgU09MT19DQVBfQ0hfQ09NUF9FTkFfRShjaCkJCSgweDA0ODArKChjaCkqNCkpCisjZGVmaW5lIFNPTE9fQ0FQX0NIX0lOVFYoY2gpCQkJKDB4MDRDMCsoKGNoKSo0KSkKKyNkZWZpbmUgU09MT19DQVBfQ0hfSU5UVl9FKGNoKQkJCSgweDA1MDArKChjaCkqNCkpCisKKworI2RlZmluZSBTT0xPX1ZFX0NGRzAJCQkJMHgwNjEwCisjZGVmaW5lCSAgU09MT19WRV9UV09fUEFHRV9NT0RFCQkJKDE8PDMxKQorI2RlZmluZQkgIFNPTE9fVkVfSU5UUl9DVFJMKG4pCQkJKChuKTw8MjQpCisjZGVmaW5lCSAgU09MT19WRV9CTE9DS19TSVpFKG4pCQkJKChuKTw8MTYpCisjZGVmaW5lCSAgU09MT19WRV9CTE9DS19CQVNFKG4pCQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX1ZFX0NGRzEJCQkJMHgwNjE0CisjZGVmaW5lCSAgU09MT19WRV9CWVRFX0FMSUdOKG4pCQkJKChuKTw8MjQpCisjZGVmaW5lCSAgU09MT19WRV9JTlNFUlRfSU5ERVgJCQkoMTw8MTgpCisjZGVmaW5lCSAgU09MT19WRV9NT1RJT05fTU9ERShuKQkJKChuKTw8MTYpCisjZGVmaW5lCSAgU09MT19WRV9NT1RJT05fQkFTRShuKQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX1ZFX1dNUktfUE9MWQkJCTB4MDYxQworI2RlZmluZSBTT0xPX1ZFX1ZNUktfSU5JVF9LRVkJCQkweDA2MjAKKyNkZWZpbmUgU09MT19WRV9XTVJLX1NUUkwJCQkweDA2MjQKKyNkZWZpbmUgU09MT19WRV9FTkNSWVBfUE9MWQkJCTB4MDYyOAorI2RlZmluZSBTT0xPX1ZFX0VOQ1JZUF9JTklUCQkJMHgwNjJDCisjZGVmaW5lIFNPTE9fVkVfQVRUUgkJCQkweDA2MzAKKyNkZWZpbmUJICBTT0xPX1ZFX0xJVFRMRV9FTkRJQU4JCQkoMTw8MzEpCisjZGVmaW5lCSAgU09MT19DT01QX0FUVFJfUk4JCQkoMTw8MzApCisjZGVmaW5lCSAgU09MT19DT01QX0FUVFJfRkNPREUobikJCSgobik8PDI3KQorI2RlZmluZQkgIFNPTE9fQ09NUF9USU1FX0lOQyhuKQkJCSgobik8PDI1KQorI2RlZmluZQkgIFNPTE9fQ09NUF9USU1FX1dJRFRIKG4pCQkoKG4pPDwyMSkKKyNkZWZpbmUJICBTT0xPX0RDVF9JTlRFUlZBTChuKQkJCSgobik8PDE2KQorCisjZGVmaW5lIFNPTE9fVkVfU1RBVEUobikJCQkoMHgwNjQwKygobikqNCkpCitzdHJ1Y3QgdmlkZW5jX3N0YXR1cyB7CisJdW5pb24geworCQl1MzIgc3RhdHVzMDsKKwkJc3RydWN0IHsKKwkJCXUzMiBtcDRfZW5jX2NvZGVfc2l6ZToyMCwgc2FkX21vdGlvbjoxLCB2aWRfbW90aW9uOjEsCisJCQkgICAgdm9wX3R5cGU6MiwgdmlkZW9fY2hhbm5lbDo1LCBzb3VyY2VfZmllbGRfaWR4OjEsCisJCQkgICAgaW50ZXJsYWNlOjEsIHByb2dyZXNzaXZlOjE7CisJCX0gc3RhdHVzMF9zdDsKKwl9OworCXVuaW9uIHsKKwkJdTMyIHN0YXR1czE7CisJCXN0cnVjdCB7CisJCQl1MzIgdnNpemU6OCwgaHNpemU6OCwgbGFzdF9xdWV1ZTo0LCBmb28xOjgsIHNjYWxlOjQ7CisJCX0gc3RhdHVzMV9zdDsKKwl9OworCXVuaW9uIHsKKwkJdTMyIHN0YXR1czQ7CisJCXN0cnVjdCB7CisJCQl1MzIganBlZ19jb2RlX3NpemU6MjAsIGludGVydmFsOjEwLCBmb28xOjI7CisJCX0gc3RhdHVzNF9zdDsKKwl9OworCXVuaW9uIHsKKwkJdTMyIHN0YXR1czk7CisJCXN0cnVjdCB7CisJCQl1MzIgY2hhbm5lbDo1LCBmb28xOjI3OworCQl9IHN0YXR1czlfc3Q7CisJfTsKKwl1bmlvbiB7CisJCXUzMiBzdGF0dXMxMDsKKwkJc3RydWN0IHsKKwkJCXUzMiBtcDRfY29kZV9zaXplOjIwLCBmb286MTI7CisJCX0gc3RhdHVzMTBfc3Q7CisJfTsKKwl1bmlvbiB7CisJCXUzMiBzdGF0dXMxMTsKKwkJc3RydWN0IHsKKwkJCXUzMiBsYXN0X3F1ZXVlOjgsIGZvbzE6MjQ7CisJCX0gc3RhdHVzMTFfc3Q7CisJfTsKK307CisKKyNkZWZpbmUgU09MT19WRV9KUEVHX1FQX1RCTAkJCTB4MDY3MAorI2RlZmluZSBTT0xPX1ZFX0pQRUdfUVBfQ0hfTAkJCTB4MDY3NAorI2RlZmluZSBTT0xPX1ZFX0pQRUdfUVBfQ0hfSAkJCTB4MDY3OAorI2RlZmluZSBTT0xPX1ZFX0pQRUdfQ0ZHCQkJMHgwNjdDCisjZGVmaW5lIFNPTE9fVkVfSlBFR19DVFJMCQkJMHgwNjgwCisKKyNkZWZpbmUgU09MT19WRV9PU0RfQ0gJCQkJMHgwNjkwCisjZGVmaW5lIFNPTE9fVkVfT1NEX0JBU0UJCQkweDA2OTQKKyNkZWZpbmUgU09MT19WRV9PU0RfQ0xSCQkJCTB4MDY5OAorI2RlZmluZSBTT0xPX1ZFX09TRF9PUFQJCQkJMHgwNjlDCisKKyNkZWZpbmUgU09MT19WRV9DSF9JTlRMKGNoKQkJCSgweDA3MDArKChjaCkqNCkpCisjZGVmaW5lIFNPTE9fVkVfQ0hfTU9UKGNoKQkJCSgweDA3NDArKChjaCkqNCkpCisjZGVmaW5lIFNPTE9fVkVfQ0hfUVAoY2gpCQkJKDB4MDc4MCsoKGNoKSo0KSkKKyNkZWZpbmUgU09MT19WRV9DSF9RUF9FKGNoKQkJCSgweDA3QzArKChjaCkqNCkpCisjZGVmaW5lIFNPTE9fVkVfQ0hfR09QKGNoKQkJCSgweDA4MDArKChjaCkqNCkpCisjZGVmaW5lIFNPTE9fVkVfQ0hfR09QX0UoY2gpCQkJKDB4MDg0MCsoKGNoKSo0KSkKKyNkZWZpbmUgU09MT19WRV9DSF9SRUZfQkFTRShjaCkJCQkoMHgwODgwKygoY2gpKjQpKQorI2RlZmluZSBTT0xPX1ZFX0NIX1JFRl9CQVNFX0UoY2gpCQkoMHgwOEMwKygoY2gpKjQpKQorCisjZGVmaW5lIFNPTE9fVkVfTVBFRzRfUVVFKG4pCQkJKDB4MEEwMCsoKG4pKjgpKQorI2RlZmluZSBTT0xPX1ZFX0pQRUdfUVVFKG4pCQkJKDB4MEEwNCsoKG4pKjgpKQorCisjZGVmaW5lIFNPTE9fVkRfQ0ZHMAkJCQkweDA5MDAKKyNkZWZpbmUJICBTT0xPX1ZEX0NGR19OT19XUklURV9OT19XSU5ET1cJKDE8PDI0KQorI2RlZmluZQkgIFNPTE9fVkRfQ0ZHX0JVU1lfV0lBVF9DT0RFCQkoMTw8MjMpCisjZGVmaW5lCSAgU09MT19WRF9DRkdfQlVTWV9XSUFUX1JFRgkJKDE8PDIyKQorI2RlZmluZQkgIFNPTE9fVkRfQ0ZHX0JVU1lfV0lBVF9SRVMJCSgxPDwyMSkKKyNkZWZpbmUJICBTT0xPX1ZEX0NGR19CVVNZX1dJQVRfTVMJCSgxPDwyMCkKKyNkZWZpbmUJICBTT0xPX1ZEX0NGR19TSU5HTEVfTU9ERQkJKDE8PDE4KQorI2RlZmluZQkgIFNPTE9fVkRfQ0ZHX1NDQUxfTUFOVUFMCQkoMTw8MTcpCisjZGVmaW5lCSAgU09MT19WRF9DRkdfVVNFUl9QQUdFX0NUUkwJCSgxPDwxNikKKyNkZWZpbmUJICBTT0xPX1ZEX0NGR19MSVRUTEVfRU5ESUFOCQkoMTw8MTUpCisjZGVmaW5lCSAgU09MT19WRF9DRkdfU1RBUlRfRkkJCQkoMTw8MTQpCisjZGVmaW5lCSAgU09MT19WRF9DRkdfRVJSX0xPQ0sJCQkoMTw8MTMpCisjZGVmaW5lCSAgU09MT19WRF9DRkdfRVJSX0lOVF9FTkEJCSgxPDwxMikKKyNkZWZpbmUJICBTT0xPX1ZEX0NGR19USU1FX1dJRFRIKG4pCQkoKG4pPDw4KQorI2RlZmluZQkgIFNPTE9fVkRfQ0ZHX0RDVF9JTlRFUlZBTChuKQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX1ZEX0NGRzEJCQkJMHgwOTA0CisKKyNkZWZpbmUJU09MT19WRF9ERUlOVEVSTEFDRQkJCTB4MDkwOAorI2RlZmluZQkgIFNPTE9fVkRfREVJTlRFUkxBQ0VfVEhSRVNIT0xEKG4pCSgobik8PDgpCisjZGVmaW5lCSAgU09MT19WRF9ERUlOVEVSTEFDRV9FREdFX1ZBTFVFKG4pCSgobik8PDApCisKKyNkZWZpbmUgU09MT19WRF9DT0RFX0FEUgkJCTB4MDkwQworCisjZGVmaW5lIFNPTE9fVkRfQ1RSTAkJCQkweDA5MTAKKyNkZWZpbmUJICBTT0xPX1ZEX09QRVJfT04JCQkoMTw8MzEpCisjZGVmaW5lCSAgU09MT19WRF9NQVhfSVRFTShuKQkJCSgobik8PDApCisKKyNkZWZpbmUgU09MT19WRF9TVEFUVVMwCQkJCTB4MDkyMAorI2RlZmluZQkgIFNPTE9fVkRfU1RBVFVTMF9JTlRSX0FDSwkJKDE8PDIyKQorI2RlZmluZQkgIFNPTE9fVkRfU1RBVFVTMF9JTlRSX0VNUFRZCQkoMTw8MjEpCisjZGVmaW5lCSAgU09MT19WRF9TVEFUVVMwX0lOVFJfRVJSCQkoMTw8MjApCisKKyNkZWZpbmUgU09MT19WRF9TVEFUVVMxCQkJCTB4MDkyNAorCisjZGVmaW5lIFNPTE9fVkRfSURYMAkJCQkweDA5MzAKKyNkZWZpbmUJICBTT0xPX1ZEX0lEWF9JTlRFUkxBQ0UJCQkoMTw8MzApCisjZGVmaW5lCSAgU09MT19WRF9JRFhfQ0hBTk5FTChuKQkJKChuKTw8MjQpCisjZGVmaW5lCSAgU09MT19WRF9JRFhfU0laRShuKQkJCSgobik8PDApCisKKyNkZWZpbmUgU09MT19WRF9JRFgxCQkJCTB4MDkzNAorI2RlZmluZQkgIFNPTE9fVkRfSURYX1NSQ19TQ0FMRShuKQkJKChuKTw8MjgpCisjZGVmaW5lCSAgU09MT19WRF9JRFhfV0lORE9XKG4pCQkJKChuKTw8MjQpCisjZGVmaW5lCSAgU09MT19WRF9JRFhfREVJTlRFUkxBQ0UJCSgxPDwxNikKKyNkZWZpbmUJICBTT0xPX1ZEX0lEWF9IX0JMT0NLKG4pCQkoKG4pPDw4KQorI2RlZmluZQkgIFNPTE9fVkRfSURYX1ZfQkxPQ0sobikJCSgobik8PDApCisKKyNkZWZpbmUgU09MT19WRF9JRFgyCQkJCTB4MDkzOAorI2RlZmluZQkgIFNPTE9fVkRfSURYX1JFRl9CQVNFX1NJREUJCSgxPDwzMSkKKyNkZWZpbmUJICBTT0xPX1ZEX0lEWF9SRUZfQkFTRShuKQkJKCgobik+PjE2KSYweGZmZmYpCisKKyNkZWZpbmUgU09MT19WRF9JRFgzCQkJCTB4MDkzQworI2RlZmluZQkgIFNPTE9fVkRfSURYX0RJU1BfU0NBTEUobikJCSgobik8PDI4KQorI2RlZmluZQkgIFNPTE9fVkRfSURYX0lOVEVSTEFDRV9XUgkJKDE8PDI3KQorI2RlZmluZQkgIFNPTE9fVkRfSURYX0lOVEVSUE9MCQkJKDE8PDI2KQorI2RlZmluZQkgIFNPTE9fVkRfSURYX0hPUjJYCQkJKDE8PDI1KQorI2RlZmluZQkgIFNPTE9fVkRfSURYX09GRlNFVF9YKG4pCQkoKG4pPDwxMikKKyNkZWZpbmUJICBTT0xPX1ZEX0lEWF9PRkZTRVRfWShuKQkJKChuKTw8MCkKKworI2RlZmluZSBTT0xPX1ZEX0lEWDQJCQkJMHgwOTQwCisjZGVmaW5lCSAgU09MT19WRF9JRFhfREVDX1dSX1BBR0UobikJCSgobik8PDgpCisjZGVmaW5lCSAgU09MT19WRF9JRFhfRElTUF9SRF9QQUdFKG4pCQkoKG4pPDwwKQorCisjZGVmaW5lIFNPTE9fVkRfV1JfUEFHRShuKQkJCSgweDAzRjAgKyAoKG4pICogNCkpCisKKworI2RlZmluZSBTT0xPX0dQSU9fQ09ORklHXzAJCQkweDBCMDAKKyNkZWZpbmUgU09MT19HUElPX0NPTkZJR18xCQkJMHgwQjA0CisjZGVmaW5lIFNPTE9fR1BJT19EQVRBX09VVAkJCTB4MEIwOAorI2RlZmluZSBTT0xPX0dQSU9fREFUQV9JTgkJCTB4MEIwQworI2RlZmluZSBTT0xPX0dQSU9fSU5UX0FDS19TVEEJCQkweDBCMTAKKyNkZWZpbmUgU09MT19HUElPX0lOVF9FTkEJCQkweDBCMTQKKyNkZWZpbmUgU09MT19HUElPX0lOVF9DRkdfMAkJCTB4MEIxOAorI2RlZmluZSBTT0xPX0dQSU9fSU5UX0NGR18xCQkJMHgwQjFDCisKKworI2RlZmluZSBTT0xPX0lJQ19DRkcJCQkJMHgwQjIwCisjZGVmaW5lCSAgU09MT19JSUNfRU5BQkxFCQkJKDE8PDgpCisjZGVmaW5lCSAgU09MT19JSUNfUFJFU0NBTEUobikJCQkoKG4pPDwwKQorCisjZGVmaW5lIFNPTE9fSUlDX0NUUkwJCQkJMHgwQjI0CisjZGVmaW5lCSAgU09MT19JSUNfQVVUT19DTEVBUgkJCSgxPDwyMCkKKyNkZWZpbmUJICBTT0xPX0lJQ19TVEFURV9SWF9BQ0sJCQkoMTw8MTkpCisjZGVmaW5lCSAgU09MT19JSUNfU1RBVEVfQlVTWQkJCSgxPDwxOCkKKyNkZWZpbmUJICBTT0xPX0lJQ19TVEFURV9TSUdfRVJSCQkoMTw8MTcpCisjZGVmaW5lCSAgU09MT19JSUNfU1RBVEVfVFJOUwkJCSgxPDwxNikKKyNkZWZpbmUJICBTT0xPX0lJQ19DSF9TRVQobikJCQkoKG4pPDw1KQorI2RlZmluZQkgIFNPTE9fSUlDX0FDS19FTgkJCSgxPDw0KQorI2RlZmluZQkgIFNPTE9fSUlDX1NUQVJUCQkJKDE8PDMpCisjZGVmaW5lCSAgU09MT19JSUNfU1RPUAkJCQkoMTw8MikKKyNkZWZpbmUJICBTT0xPX0lJQ19SRUFECQkJCSgxPDwxKQorI2RlZmluZQkgIFNPTE9fSUlDX1dSSVRFCQkJKDE8PDApCisKKyNkZWZpbmUgU09MT19JSUNfVFhECQkJCTB4MEIyOAorI2RlZmluZSBTT0xPX0lJQ19SWEQJCQkJMHgwQjJDCisKKy8qCisgKglVQVJUIFJFR0lTVEVSCisgKi8KKyNkZWZpbmUgU09MT19VQVJUX0NPTlRST0wobikJCQkoMHgwQkEwICsgKChuKSoweDIwKSkKKyNkZWZpbmUJICBTT0xPX1VBUlRfQ0xLX0RJVihuKQkJCSgobik8PDI0KQorI2RlZmluZQkgIFNPTE9fTU9ERU1fQ1RSTF9FTgkJCSgxPDwyMCkKKyNkZWZpbmUJICBTT0xPX1BBUklUWV9FUlJPUl9EUk9QCQkoMTw8MTgpCisjZGVmaW5lCSAgU09MT19JUlFfRVJSX0VOCQkJKDE8PDE3KQorI2RlZmluZQkgIFNPTE9fSVJRX1JYX0VOCQkJKDE8PDE2KQorI2RlZmluZQkgIFNPTE9fSVJRX1RYX0VOCQkJKDE8PDE1KQorI2RlZmluZQkgIFNPTE9fUlhfRU4JCQkJKDE8PDE0KQorI2RlZmluZQkgIFNPTE9fVFhfRU4JCQkJKDE8PDEzKQorI2RlZmluZQkgIFNPTE9fVUFSVF9IQUxGX0RVUExFWAkJCSgxPDwxMikKKyNkZWZpbmUJICBTT0xPX1VBUlRfTE9PUEJBQ0sJCQkoMTw8MTEpCisKKyNkZWZpbmUJICBTT0xPX0JBVURSQVRFXzIzMDQwMAkJCSgoMDw8OSl8KDA8PDYpKQorI2RlZmluZQkgIFNPTE9fQkFVRFJBVEVfMTE1MjAwCQkJKCgwPDw5KXwoMTw8NikpCisjZGVmaW5lCSAgU09MT19CQVVEUkFURV81NzYwMAkJCSgoMDw8OSl8KDI8PDYpKQorI2RlZmluZQkgIFNPTE9fQkFVRFJBVEVfMzg0MDAJCQkoKDA8PDkpfCgzPDw2KSkKKyNkZWZpbmUJICBTT0xPX0JBVURSQVRFXzE5MjAwCQkJKCgwPDw5KXwoNDw8NikpCisjZGVmaW5lCSAgU09MT19CQVVEUkFURV85NjAwCQkJKCgwPDw5KXwoNTw8NikpCisjZGVmaW5lCSAgU09MT19CQVVEUkFURV80ODAwCQkJKCgwPDw5KXwoNjw8NikpCisjZGVmaW5lCSAgU09MT19CQVVEUkFURV8yNDAwCQkJKCgxPDw5KXwoNjw8NikpCisjZGVmaW5lCSAgU09MT19CQVVEUkFURV8xMjAwCQkJKCgyPDw5KXwoNjw8NikpCisjZGVmaW5lCSAgU09MT19CQVVEUkFURV8zMDAJCQkoKDM8PDkpfCg2PDw2KSkKKworI2RlZmluZQkgIFNPTE9fVUFSVF9EQVRBX0JJVF84CQkJKDM8PDQpCisjZGVmaW5lCSAgU09MT19VQVJUX0RBVEFfQklUXzcJCQkoMjw8NCkKKyNkZWZpbmUJICBTT0xPX1VBUlRfREFUQV9CSVRfNgkJCSgxPDw0KQorI2RlZmluZQkgIFNPTE9fVUFSVF9EQVRBX0JJVF81CQkJKDA8PDQpCisKKyNkZWZpbmUJICBTT0xPX1VBUlRfU1RPUF9CSVRfMQkJCSgwPDwyKQorI2RlZmluZQkgIFNPTE9fVUFSVF9TVE9QX0JJVF8yCQkJKDE8PDIpCisKKyNkZWZpbmUJICBTT0xPX1VBUlRfUEFSSVRZX05PTkUJCQkoMDw8MCkKKyNkZWZpbmUJICBTT0xPX1VBUlRfUEFSSVRZX0VWRU4JCQkoMjw8MCkKKyNkZWZpbmUJICBTT0xPX1VBUlRfUEFSSVRZX09ERAkJCSgzPDwwKQorCisjZGVmaW5lIFNPTE9fVUFSVF9TVEFUVVMobikJCQkoMHgwQkE0ICsgKChuKSoweDIwKSkKKyNkZWZpbmUJICBTT0xPX1VBUlRfQ1RTCQkJCSgxPDwxNSkKKyNkZWZpbmUJICBTT0xPX1VBUlRfUlhfQlVTWQkJCSgxPDwxNCkKKyNkZWZpbmUJICBTT0xPX1VBUlRfT1ZFUlJVTgkJCSgxPDwxMykKKyNkZWZpbmUJICBTT0xPX1VBUlRfRlJBTUVfRVJSCQkJKDE8PDEyKQorI2RlZmluZQkgIFNPTE9fVUFSVF9QQVJJVFlfRVJSCQkJKDE8PDExKQorI2RlZmluZQkgIFNPTE9fVUFSVF9UWF9CVVNZCQkJKDE8PDUpCisKKyNkZWZpbmUJICBTT0xPX1VBUlRfUlhfQlVGRl9DTlQoc3RhdCkJCSgoKHN0YXQpPj42KSAmIDB4MWYpCisjZGVmaW5lCSAgU09MT19VQVJUX1JYX0JVRkZfU0laRQkJOAorI2RlZmluZQkgIFNPTE9fVUFSVF9UWF9CVUZGX0NOVChzdGF0KQkJKCgoc3RhdCk+PjApICYgMHgxZikKKyNkZWZpbmUJICBTT0xPX1VBUlRfVFhfQlVGRl9TSVpFCQk4CisKKyNkZWZpbmUgU09MT19VQVJUX1RYX0RBVEEobikJCQkoMHgwQkE4ICsgKChuKSoweDIwKSkKKyNkZWZpbmUJICBTT0xPX1VBUlRfVFhfREFUQV9QVVNICQkoMTw8OCkKKyNkZWZpbmUgU09MT19VQVJUX1JYX0RBVEEobikJCQkoMHgwQkFDICsgKChuKSoweDIwKSkKKyNkZWZpbmUJICBTT0xPX1VBUlRfUlhfREFUQV9QT1AJCQkoMTw8OCkKKworI2RlZmluZSBTT0xPX1RJTUVSX0NMT0NLX05VTQkJCTB4MGJlMAorI2RlZmluZSBTT0xPX1RJTUVSX1dBVENIRE9HCQkJMHgwYmU0CisjZGVmaW5lIFNPTE9fVElNRVJfVVNFQwkJCQkweDBiZTgKKyNkZWZpbmUgU09MT19USU1FUl9TRUMJCQkJMHgwYmVjCisKKyNkZWZpbmUgU09MT19BVURJT19DT05UUk9MCQkJMHgwRDAwCisjZGVmaW5lCSAgU09MT19BVURJT19FTkFCTEUJCQkoMTw8MzEpCisjZGVmaW5lCSAgU09MT19BVURJT19NQVNURVJfTU9ERQkJKDE8PDMwKQorI2RlZmluZQkgIFNPTE9fQVVESU9fSTJTX01PREUJCQkoMTw8MjkpCisjZGVmaW5lCSAgU09MT19BVURJT19JMlNfTFJfU1dBUAkJKDE8PDI3KQorI2RlZmluZQkgIFNPTE9fQVVESU9fSTJTXzhCSVQJCQkoMTw8MjYpCisjZGVmaW5lCSAgU09MT19BVURJT19JMlNfTVVMVEkobikJCSgobik8PDI0KQorI2RlZmluZQkgIFNPTE9fQVVESU9fTUlYXzlUTzAJCQkoMTw8MjMpCisjZGVmaW5lCSAgU09MT19BVURJT19ERUNfOVRPMF9WT0wobikJCSgobik8PDIwKQorI2RlZmluZQkgIFNPTE9fQVVESU9fTUlYXzE5VE8xMAkJCSgxPDwxOSkKKyNkZWZpbmUJICBTT0xPX0FVRElPX0RFQ18xOVRPMTBfVk9MKG4pCQkoKG4pPDwxNikKKyNkZWZpbmUJICBTT0xPX0FVRElPX01PREUobikJCQkoKG4pPDwwKQorI2RlZmluZSBTT0xPX0FVRElPX1NBTVBMRQkJCTB4MEQwNAorI2RlZmluZQkgIFNPTE9fQVVESU9fRUVfTU9ERV9PTgkJCSgxPDwzMCkKKyNkZWZpbmUJICBTT0xPX0FVRElPX0VFX0VOQ19DSChjaCkJCSgoY2gpPDwyNSkKKyNkZWZpbmUJICBTT0xPX0FVRElPX0JJVFJBVEUobikJCQkoKG4pPDwxNikKKyNkZWZpbmUJICBTT0xPX0FVRElPX0NMS19ESVYobikJCQkoKG4pPDwwKQorI2RlZmluZSBTT0xPX0FVRElPX0ZETUFfSU5UUgkJCTB4MEQwOAorI2RlZmluZQkgIFNPTE9fQVVESU9fRkRNQV9JTlRFUlZBTChuKQkJKChuKTw8MTkpCisjZGVmaW5lCSAgU09MT19BVURJT19JTlRSX09SREVSKG4pCQkoKG4pPDwxNikKKyNkZWZpbmUJICBTT0xPX0FVRElPX0ZETUFfQkFTRShuKQkJKChuKTw8MCkKKyNkZWZpbmUgU09MT19BVURJT19FVk9MXzAJCQkweDBEMEMKKyNkZWZpbmUgU09MT19BVURJT19FVk9MXzEJCQkweDBEMTAKKyNkZWZpbmUJICBTT0xPX0FVRElPX0VWT0woY2gsIHZhbHVlKQkJKCh2YWx1ZSk8PCgoY2gpJTEwKSkKKyNkZWZpbmUgU09MT19BVURJT19TVEEJCQkJMHgwRDE0CisKKworI2RlZmluZSBTT0xPX1dBVENIRE9HCQkJCTB4MEJFNAorI2RlZmluZSBXQVRDSERPR19TVEFUKHN0YXR1cykJCQkoc3RhdHVzPDw4KQorI2RlZmluZSBXQVRDSERPR19USU1FKHNlYykJCQkoc2VjJjB4ZmYpCisKKyNlbmRpZiAvKiBfX1NPTE82MDEwX1JFR0lTVEVSU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdHcyOC5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU5YzgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYwpAQCAtMCwwICsxLDgyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSAic29sbzYwMTAuaCIKKyNpbmNsdWRlICJzb2xvNjAxMC10dzI4LmgiCisKKy8qIFhYWDogU29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlIG1hc2tlZCBpbnRvIGFuIDgtYml0IHJlZ3MsIGFuZCBzaGlmdGVkCisgKiBhcm91bmQgZm9yIG90aGVyIDgtYml0IHJlZ3MuIFdoYXQgYXJlIHRoZSBtYWdpYyBiaXRzIGluIHRoZXNlIHZhbHVlcz8gKi8KKyNkZWZpbmUgREVGQVVMVF9IREVMQVlfTlRTQwkJKDMyIC0gNCkKKyNkZWZpbmUgREVGQVVMVF9IQUNUSVZFX05UU0MJCSg3MjAgKyAxNikKKyNkZWZpbmUgREVGQVVMVF9WREVMQVlfTlRTQwkJKDcgLSAyKQorI2RlZmluZSBERUZBVUxUX1ZBQ1RJVkVfTlRTQwkJKDI0MCArIDQpCisKKyNkZWZpbmUgREVGQVVMVF9IREVMQVlfUEFMCQkoMzIgKyA0KQorI2RlZmluZSBERUZBVUxUX0hBQ1RJVkVfUEFMCQkoODY0LURFRkFVTFRfSERFTEFZX1BBTCkKKyNkZWZpbmUgREVGQVVMVF9WREVMQVlfUEFMCQkoNikKKyNkZWZpbmUgREVGQVVMVF9WQUNUSVZFX1BBTAkJKDMxMi1ERUZBVUxUX1ZERUxBWV9QQUwpCisKK3N0YXRpYyB1OCB0YmxfdHcyODY0X3RlbXBsYXRlW10gPSB7CisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgwMAorCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgxMAorCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgyMAorCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgzMAorCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg0MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg1MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg3MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTMsIDB4MDAsCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhjYywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLy8gMHg4MAorCTB4MjIsIDB4MDEsIDB4ZDgsIDB4YmMsIDB4YjgsIDB4NDQsIDB4MzgsIDB4MDAsCisJMHgwMCwgMHg3OCwgMHg3MiwgMHgzZSwgMHgxNCwgMHhhNSwgMHhlNCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4MjgsIDB4NDQsIDB4NDQsIDB4YTAsIDB4ODgsIDB4NWEsIDB4MDEsCisJMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgxYSwgMHgxYSwgMHgxYSwgMHgxYSwgLy8gMHhhMAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4NDQsCisJMHg0NCwgMHgwYSwgMHgwMCwgMHhmZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgLy8gMHhiMAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4MDAsIDB4MDAsIDB4NTUsIDB4MDAsIDB4YjEsIDB4ZTQsIDB4NDAsIDB4MDAsCisJMHg3NywgMHg3NywgMHgwMSwgMHgxMywgMHg1NywgMHg5YiwgMHhkZiwgMHgyMCwgLy8gMHhkMAorCTB4NjQsIDB4YTgsIDB4ZWMsIDB4ZDEsIDB4MGYsIDB4MTEsIDB4MTEsIDB4ODEsCisJMHgxMCwgMHhlMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLy8gMHhlMAorCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCisJMHg4MywgMHhiNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4NjQsIDB4MTEsIDB4NDAsIDB4YWYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdTggdGJsX3R3Mjg2NV9udHNjX3RlbXBsYXRlW10gPSB7CisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgwMAorCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgxMAorCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgyMAorCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHhmMCwgMHg3MCwgMHg0OCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgzMAorCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg2OCwgMHgwMCwgMHgzOCwgMHg4MCwgMHg4MCwgLy8gMHg0MAorCTB4ODAsIDB4ODAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg1MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHg0NSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsIDB4NDMsCisJMHgwOCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmMSwgMHgwMywgMHhFRiwgMHgwMywgLy8gMHg3MAorCTB4RTksIDB4MDMsIDB4RDksIDB4MTUsIDB4MTUsIDB4RTQsIDB4QTMsIDB4ODAsCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLy8gMHg4MAorCTB4MjIsIDB4MDEsIDB4RDgsIDB4QkMsIDB4QjgsIDB4NDQsIDB4MzgsIDB4MDAsCisJMHgwMCwgMHg3OCwgMHg0NCwgMHgzRCwgMHgxNCwgMHhBNSwgMHhFMCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4MjgsIDB4NDQsIDB4NDQsIDB4QTAsIDB4OTAsIDB4NTIsIDB4MTMsCisJMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgxQSwgMHgxQSwgMHgxQiwgMHgxQSwgLy8gMHhhMAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4NDQsCisJMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLy8gMHhiMAorCTB4RkYsIDB4RTcsIDB4RTksIDB4RTksIDB4RUIsIDB4RkYsIDB4RDYsIDB4RDgsCisJMHhEOCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4MDAsIDB4MDAsIDB4NTUsIDB4MDAsIDB4RTQsIDB4MzksIDB4MDAsIDB4ODAsCisJMHg3NywgMHg3NywgMHgwMywgMHgyMCwgMHg1NywgMHg5YiwgMHhkZiwgMHgzMSwgLy8gMHhkMAorCTB4NjQsIDB4YTgsIDB4ZWMsIDB4ZDEsIDB4MGYsIDB4MTEsIDB4MTEsIDB4ODEsCisJMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLy8gMHhlMAorCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCisJMHg4MywgMHhCNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4NjQsIDB4NTEsIDB4NDAsIDB4YWYsIDB4RkYsIDB4RjAsIDB4MDAsIDB4QzAsCit9OworCitzdGF0aWMgdTggdGJsX3R3Mjg2NV9wYWxfdGVtcGxhdGVbXSA9IHsKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDAwCisJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDEwCisJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDIwCisJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDMwCisJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKKwkweDAwLCAweDk0LCAweDkwLCAweDQ4LCAweDAwLCAweDM4LCAweDdGLCAweDgwLCAvLyAweDQwCisJMHg4MCwgMHg4MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDUwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDQ1LCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDYwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHg0MywKKwkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvLyAweDcwCisJMHhFQSwgMHgwMywgMHhEOSwgMHgxNSwgMHgxNSwgMHhFNCwgMHhBMywgMHg4MCwKKwkweDAwLCAweDAyLCAweDAwLCAweENDLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvLyAweDgwCisJMHgyMiwgMHgwMSwgMHhEOCwgMHhCQywgMHhCOCwgMHg0NCwgMHgzOCwgMHgwMCwKKwkweDAwLCAweDc4LCAweDQ0LCAweDNELCAweDE0LCAweEE1LCAweEUwLCAweDA1LCAvLyAweDkwCisJMHgwMCwgMHgyOCwgMHg0NCwgMHg0NCwgMHhBMCwgMHg5MCwgMHg1MiwgMHgxMywKKwkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAvLyAweGEwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHg0NCwKKwkweDQ0LCAweDRBLCAweDAwLCAweEZGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAvLyAweGIwCisJMHhGRiwgMHhFNywgMHhFOSwgMHhFOSwgMHhFOSwgMHhGRiwgMHhENywgMHhEOCwKKwkweEQ5LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweGMwCisJMHgwMCwgMHgwMCwgMHg1NSwgMHgwMCwgMHhFNCwgMHgzOSwgMHgwMCwgMHg4MCwKKwkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvLyAweGQwCisJMHg2NCwgMHhhOCwgMHhlYywgMHhkMSwgMHgwZiwgMHgxMSwgMHgxMSwgMHg4MSwKKwkweDEwLCAweEMwLCAweEFBLCAweEFBLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvLyAweGUwCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKKwkweDgzLCAweEI1LCAweDA5LCAweDAwLCAweEEwLCAweDAwLCAweDAxLCAweDIwLCAvLyAweGYwCisJMHg2NCwgMHg1MSwgMHg0MCwgMHhhZiwgMHhGRiwgMHhGMCwgMHgwMCwgMHhDMCwKK307CisKKyNkZWZpbmUgaXNfdHcyODZ4KF9fc29sbywgX19pZCkgKCEoX19zb2xvLT50dzI4MTUgJiAoMSA8PCBfX2lkKSkpCisKK3N0YXRpYyB1OCB0d19yZWFkYnl0ZShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IGNoaXBfaWQsIHU4IHR3Nnhfb2ZmLAorCQkgICAgICB1OCB0d19vZmYpCit7CisJaWYgKGlzX3R3Mjg2eChzb2xvX2RldiwgY2hpcF9pZCkpCisJCXJldHVybiBzb2xvX2kyY19yZWFkYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsCisJCQkJCSBUV19DSElQX09GRlNFVF9BRERSKGNoaXBfaWQpLAorCQkJCQkgdHc2eF9vZmYpOworCWVsc2UKKwkJcmV0dXJuIHNvbG9faTJjX3JlYWRieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKKwkJCQkJIFRXX0NISVBfT0ZGU0VUX0FERFIoY2hpcF9pZCksCisJCQkJCSB0d19vZmYpOworfQorCitzdGF0aWMgdm9pZCB0d193cml0ZWJ5dGUoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGludCBjaGlwX2lkLAorCQkJIHU4IHR3Nnhfb2ZmLCB1OCB0d19vZmYsIHU4IHZhbCkKK3sKKwlpZiAoaXNfdHcyODZ4KHNvbG9fZGV2LCBjaGlwX2lkKSkKKwkJc29sb19pMmNfd3JpdGVieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKKwkJCQkgICBUV19DSElQX09GRlNFVF9BRERSKGNoaXBfaWQpLAorCQkJCSAgIHR3Nnhfb2ZmLCB2YWwpOworCWVsc2UKKwkJc29sb19pMmNfd3JpdGVieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKKwkJCQkgICBUV19DSElQX09GRlNFVF9BRERSKGNoaXBfaWQpLAorCQkJCSAgIHR3X29mZiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgdHdfd3JpdGVfYW5kX3ZlcmlmeShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggYWRkciwgdTggb2ZmLAorCQkJCXU4IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdTggcnZhbCA9IHNvbG9faTJjX3JlYWRieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywgYWRkciwgb2ZmKTsKKwkJaWYgKHJ2YWwgPT0gdmFsKQorCQkJcmV0dXJuOworCisJCXNvbG9faTJjX3dyaXRlYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsIGFkZHIsIG9mZiwgdmFsKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMSk7CisJfQorCisvLwlwcmludGsoInNvbG82MDEwL3R3Mjg6IEVycm9yIHdyaXRpbmcgcmVnaXN0ZXI6ICUwMngtPiUwMnggWyUwMnhdXG4iLAorLy8JCWFkZHIsIG9mZiwgdmFsKTsKK30KKworc3RhdGljIGludCB0dzI4NjVfc2V0dXAoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGRldl9hZGRyKQoreworCXU4IHRibF90dzI4NjVfY29tbW9uWzI1Nl07CisJaW50IGk7CisKKwlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9QQUwpCisJCW1lbWNweSh0YmxfdHcyODY1X2NvbW1vbiwgdGJsX3R3Mjg2NV9wYWxfdGVtcGxhdGUsCisJCSAgICAgICBzaXplb2YodGJsX3R3Mjg2NV9jb21tb24pKTsKKwllbHNlCisJCW1lbWNweSh0YmxfdHcyODY1X2NvbW1vbiwgdGJsX3R3Mjg2NV9udHNjX3RlbXBsYXRlLAorCQkgICAgICAgc2l6ZW9mKHRibF90dzI4NjVfY29tbW9uKSk7CisKKwkvKiBBTElOSyBNb2RlICovCisJaWYgKHNvbG9fZGV2LT5ucl9jaGFucyA9PSA0KSB7CisJCXRibF90dzI4NjVfY29tbW9uWzB4ZDJdID0gMHgwMTsKKwkJdGJsX3R3Mjg2NV9jb21tb25bMHhjZl0gPSAweDAwOworCX0gZWxzZSBpZiAoc29sb19kZXYtPm5yX2NoYW5zID09IDgpIHsKKwkJdGJsX3R3Mjg2NV9jb21tb25bMHhkMl0gPSAweDAyOworCQlpZiAoZGV2X2FkZHIgPT0gVFdfQ0hJUF9PRkZTRVRfQUREUigxKSkKKwkJCXRibF90dzI4NjVfY29tbW9uWzB4Y2ZdID0gMHg4MDsKKwl9IGVsc2UgaWYgKHNvbG9fZGV2LT5ucl9jaGFucyA9PSAxNikgeworCQl0YmxfdHcyODY1X2NvbW1vblsweGQyXSA9IDB4MDM7CisJCWlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDEpKQorCQkJdGJsX3R3Mjg2NV9jb21tb25bMHhjZl0gPSAweDgzOworCQllbHNlIGlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDIpKQorCQkJdGJsX3R3Mjg2NV9jb21tb25bMHhjZl0gPSAweDgzOworCQllbHNlIGlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDMpKQorCQkJdGJsX3R3Mjg2NV9jb21tb25bMHhjZl0gPSAweDgwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAweGZmOyBpKyspIHsKKwkJLyogU2tpcCByZWFkIG9ubHkgcmVnaXN0ZXJzICovCisJCWlmIChpID49IDB4YjggJiYgaSA8PSAweGMxICkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGkgJiB+MHgzMCkgPT0gMHgwMCB8fAorCQkgICAgKGkgJiB+MHgzMCkgPT0gMHgwYyB8fAorCQkgICAgKGkgJiB+MHgzMCkgPT0gMHgwZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaSA+PSAweGM0ICYmIGkgPD0gMHhjNykKKwkJCWNvbnRpbnVlOworCQlpZiAoaSA9PSAweGZkKQorCQkJY29udGludWU7CisKKwkJdHdfd3JpdGVfYW5kX3ZlcmlmeShzb2xvX2RldiwgZGV2X2FkZHIsIGksCisJCQkJICAgIHRibF90dzI4NjVfY29tbW9uW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dzI4NjRfc2V0dXAoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGRldl9hZGRyKQoreworCXU4IHRibF90dzI4NjRfY29tbW9uW3NpemVvZih0YmxfdHcyODY0X3RlbXBsYXRlKV07CisJaW50IGk7CisKKwltZW1jcHkodGJsX3R3Mjg2NF9jb21tb24sIHRibF90dzI4NjRfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZih0YmxfdHcyODY0X2NvbW1vbikpOworCisJaWYgKHNvbG9fZGV2LT50dzI4NjUgPT0gMCkgeworCQkvKiBJUlEgTW9kZSAqLworCQlpZiAoc29sb19kZXYtPm5yX2NoYW5zID09IDQpIHsKKwkJCXRibF90dzI4NjRfY29tbW9uWzB4ZDJdID0gMHgwMTsKKwkJCXRibF90dzI4NjRfY29tbW9uWzB4Y2ZdID0gMHgwMDsKKwkJfSBlbHNlIGlmIChzb2xvX2Rldi0+bnJfY2hhbnMgPT0gOCkgeworCQkJdGJsX3R3Mjg2NF9jb21tb25bMHhkMl0gPSAweDAyOworCQkJaWYgKGRldl9hZGRyID09IFRXX0NISVBfT0ZGU0VUX0FERFIoMCkpCisJCQkJdGJsX3R3Mjg2NF9jb21tb25bMHhjZl0gPSAweDQzOworCQkJZWxzZSBpZiAoZGV2X2FkZHIgPT0gVFdfQ0hJUF9PRkZTRVRfQUREUigxKSkKKwkJCQl0YmxfdHcyODY0X2NvbW1vblsweGNmXSA9IDB4NDA7CisJCX0gZWxzZSBpZiAoc29sb19kZXYtPm5yX2NoYW5zID09IDE2KSB7CisJCQl0YmxfdHcyODY0X2NvbW1vblsweGQyXSA9IDB4MDM7CisJCQlpZiAoZGV2X2FkZHIgPT0gVFdfQ0hJUF9PRkZTRVRfQUREUigwKSkKKwkJCQl0YmxfdHcyODY0X2NvbW1vblsweGNmXSA9IDB4NDM7CisJCQllbHNlIGlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDEpKQorCQkJCXRibF90dzI4NjRfY29tbW9uWzB4Y2ZdID0gMHg0MzsKKwkJCWVsc2UgaWYgKGRldl9hZGRyID09IFRXX0NISVBfT0ZGU0VUX0FERFIoMikpCisJCQkJdGJsX3R3Mjg2NF9jb21tb25bMHhjZl0gPSAweDQzOworCQkJZWxzZSBpZiAoZGV2X2FkZHIgPT0gVFdfQ0hJUF9PRkZTRVRfQUREUigzKSkKKwkJCQl0YmxfdHcyODY0X2NvbW1vblsweGNmXSA9IDB4NDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBBTElOSyBNb2RlLiBBc3N1bWVzIHRoYXQgdGhlIGZpcnN0IHR3Mjh4eCBpcyBhCisJCSAqIDI4NjUgYW5kIHRoZXNlIGFyZSBpbiBjYXNjYWRlLiAqLworCQlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykKKwkJCXRibF90dzI4NjRfY29tbW9uWzB4MDggfCBpIDw8IDRdID0gMHgxMjsKKworCQlpZiAoc29sb19kZXYtPm5yX2NoYW5zID09IDgpIHsKKwkJCXRibF90dzI4NjRfY29tbW9uWzB4ZDJdID0gMHgwMjsKKwkJCWlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDEpKQorCQkJCXRibF90dzI4NjRfY29tbW9uWzB4Y2ZdID0gMHg4MDsKKwkJfSBlbHNlIGlmIChzb2xvX2Rldi0+bnJfY2hhbnMgPT0gMTYpIHsKKwkJCXRibF90dzI4NjRfY29tbW9uWzB4ZDJdID0gMHgwMzsKKwkJCWlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDEpKQorCQkJCXRibF90dzI4NjRfY29tbW9uWzB4Y2ZdID0gMHg4MzsKKwkJCWVsc2UgaWYgKGRldl9hZGRyID09IFRXX0NISVBfT0ZGU0VUX0FERFIoMikpCisJCQkJdGJsX3R3Mjg2NF9jb21tb25bMHhjZl0gPSAweDgzOworCQkJZWxzZSBpZiAoZGV2X2FkZHIgPT0gVFdfQ0hJUF9PRkZTRVRfQUREUigzKSkKKwkJCQl0YmxfdHcyODY0X2NvbW1vblsweGNmXSA9IDB4ODA7CisJCX0KKwl9CisKKwkvKiBOVFNDIG9yIFBBTCAqLworCWlmIChzb2xvX2Rldi0+dmlkZW9fdHlwZSA9PSBTT0xPX1ZPX0ZNVF9UWVBFX1BBTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl0YmxfdHcyODY0X2NvbW1vblsweDA3IHwgKGkgPDwgNCldIHw9IDB4MTA7CisJCQl0YmxfdHcyODY0X2NvbW1vblsweDA4IHwgKGkgPDwgNCldIHw9IDB4MDY7CisJCQl0YmxfdHcyODY0X2NvbW1vblsweDBhIHwgKGkgPDwgNCldIHw9IDB4MDg7CisJCQl0YmxfdHcyODY0X2NvbW1vblsweDBiIHwgKGkgPDwgNCldIHw9IDB4MTM7CisJCQl0YmxfdHcyODY0X2NvbW1vblsweDBlIHwgKGkgPDwgNCldIHw9IDB4MDE7CisJCX0KKwkJdGJsX3R3Mjg2NF9jb21tb25bMHg5ZF0gPSAweDkwOworCQl0YmxfdHcyODY0X2NvbW1vblsweGYzXSA9IDB4MDA7CisJCXRibF90dzI4NjRfY29tbW9uWzB4ZjRdID0gMHhhMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMHhmZjsgaSsrKSB7CisJCS8qIFNraXAgcmVhZCBvbmx5IHJlZ2lzdGVycyAqLworCQlpZiAoaSA+PSAweGI4ICYmIGkgPD0gMHhjMSApCisJCQljb250aW51ZTsKKwkJaWYgKChpICYgfjB4MzApID09IDB4MDAgfHwKKwkJICAgIChpICYgfjB4MzApID09IDB4MGMgfHwKKwkJICAgIChpICYgfjB4MzApID09IDB4MGQpCisJCQljb250aW51ZTsKKwkJaWYgKGkgPT0gMHg3NCB8fCBpID09IDB4NzcgfHwgaSA9PSAweDc4IHx8CisJCSAgICBpID09IDB4NzkgfHwgaSA9PSAweDdhKQorCQkJY29udGludWU7CisJCWlmIChpID09IDB4ZmQpCisJCQljb250aW51ZTsKKworCQl0d193cml0ZV9hbmRfdmVyaWZ5KHNvbG9fZGV2LCBkZXZfYWRkciwgaSwKKwkJCQkgICAgdGJsX3R3Mjg2NF9jb21tb25baV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3MjgxNV9zZXR1cChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggZGV2X2FkZHIpCit7CisJdTggdGJsX250c2NfdHcyODE1X2NvbW1vbltdID0geworCQkweDAwLCAweGM4LCAweDIwLCAweGQwLCAweDA2LCAweGYwLCAweDA4LCAweDgwLAorCQkweDgwLCAweDgwLCAweDgwLCAweDAyLCAweDA2LCAweDAwLCAweDExLAorCX07CisKKwl1OCB0YmxfcGFsX3R3MjgxNV9jb21tb25bXSA9IHsKKwkJMHgwMCwgMHg4OCwgMHgyMCwgMHhkMCwgMHgwNSwgMHgyMCwgMHgyOCwgMHg4MCwKKwkJMHg4MCwgMHg4MCwgMHg4MCwgMHg4MiwgMHgwNiwgMHgwMCwgMHgxMSwKKwl9OworCisJdTggdGJsX3R3MjgxNV9zZnJbXSA9IHsKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHg0NSwgMHhhMCwgMHhkMCwgMHgyZiwgLy8gMHgwMAorCQkweDY0LCAweDgwLCAweDgwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDAwLAorCQkweDAwLCAweDBmLCAweDA1LCAweDAwLCAweDAwLCAweDgwLCAweDA2LCAweDAwLCAvLyAweDEwCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4ODgsIDB4ODgsIDB4YzAsIDB4MDAsIDB4MjAsIDB4NjQsIDB4YTgsIDB4ZWMsIC8vIDB4MjAKKwkJMHgzMSwgMHg3NSwgMHhiOSwgMHhmZCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwKKwkJMHg4OCwgMHgxMSwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwJCS8vIDB4MzAKKwl9OworCXU4ICp0YmxfdHcyODE1X2NvbW1vbjsKKwlpbnQgaTsKKwlpbnQgY2g7CisKKwl0YmxfbnRzY190dzI4MTVfY29tbW9uWzB4MDZdID0gMDsKKworCS8qIEhvcml6b250YWwgRGVsYXkgQ29udHJvbCAqLworCXRibF9udHNjX3R3MjgxNV9jb21tb25bMHgwMl0gPSBERUZBVUxUX0hERUxBWV9OVFNDICYgMHhmZjsKKwl0YmxfbnRzY190dzI4MTVfY29tbW9uWzB4MDZdIHw9IDB4MDMgJiAoREVGQVVMVF9IREVMQVlfTlRTQyA+PiA4KTsKKworCS8qIEhvcml6b250YWwgQWN0aXZlIENvbnRyb2wgKi8KKwl0YmxfbnRzY190dzI4MTVfY29tbW9uWzB4MDNdID0gREVGQVVMVF9IQUNUSVZFX05UU0MgJiAweGZmOworCXRibF9udHNjX3R3MjgxNV9jb21tb25bMHgwNl0gfD0KKwkJKCgweDAzICYgKERFRkFVTFRfSEFDVElWRV9OVFNDID4+IDgpKSA8PCAyKTsKKworCS8qIFZlcnRpY2FsIERlbGF5IENvbnRyb2wgKi8KKwl0YmxfbnRzY190dzI4MTVfY29tbW9uWzB4MDRdID0gREVGQVVMVF9WREVMQVlfTlRTQyAmIDB4ZmY7CisJdGJsX250c2NfdHcyODE1X2NvbW1vblsweDA2XSB8PQorCQkoKDB4MDEgJiAoREVGQVVMVF9WREVMQVlfTlRTQyA+PiA4KSkgPDwgNCk7CisKKwkvKiBWZXJ0aWNhbCBBY3RpdmUgQ29udHJvbCAqLworCXRibF9udHNjX3R3MjgxNV9jb21tb25bMHgwNV0gPSBERUZBVUxUX1ZBQ1RJVkVfTlRTQyAmIDB4ZmY7CisJdGJsX250c2NfdHcyODE1X2NvbW1vblsweDA2XSB8PQorCQkoKDB4MDEgJiAoREVGQVVMVF9WQUNUSVZFX05UU0MgPj4gOCkpIDw8IDUpOworCisJdGJsX3BhbF90dzI4MTVfY29tbW9uWzB4MDZdID0gMDsKKworCS8qIEhvcml6b250YWwgRGVsYXkgQ29udHJvbCAqLworCXRibF9wYWxfdHcyODE1X2NvbW1vblsweDAyXSA9IERFRkFVTFRfSERFTEFZX1BBTCAmIDB4ZmY7CisJdGJsX3BhbF90dzI4MTVfY29tbW9uWzB4MDZdIHw9IDB4MDMgJiAoREVGQVVMVF9IREVMQVlfUEFMID4+IDgpOworCisJLyogSG9yaXpvbnRhbCBBY3RpdmUgQ29udHJvbCAqLworCXRibF9wYWxfdHcyODE1X2NvbW1vblsweDAzXSA9IERFRkFVTFRfSEFDVElWRV9QQUwgJiAweGZmOworCXRibF9wYWxfdHcyODE1X2NvbW1vblsweDA2XSB8PQorCQkoKDB4MDMgJiAoREVGQVVMVF9IQUNUSVZFX1BBTCA+PiA4KSkgPDwgMik7CisKKwkvKiBWZXJ0aWNhbCBEZWxheSBDb250cm9sICovCisJdGJsX3BhbF90dzI4MTVfY29tbW9uWzB4MDRdID0gREVGQVVMVF9WREVMQVlfUEFMICYgMHhmZjsKKwl0YmxfcGFsX3R3MjgxNV9jb21tb25bMHgwNl0gfD0KKwkJKCgweDAxICYgKERFRkFVTFRfVkRFTEFZX1BBTCA+PiA4KSkgPDwgNCk7CisKKwkvKiBWZXJ0aWNhbCBBY3RpdmUgQ29udHJvbCAqLworCXRibF9wYWxfdHcyODE1X2NvbW1vblsweDA1XSA9IERFRkFVTFRfVkFDVElWRV9QQUwgJiAweGZmOworCXRibF9wYWxfdHcyODE1X2NvbW1vblsweDA2XSB8PQorCQkoKDB4MDEgJiAoREVGQVVMVF9WQUNUSVZFX1BBTCA+PiA4KSkgPDwgNSk7CisKKwl0YmxfdHcyODE1X2NvbW1vbiA9CisJICAgIChzb2xvX2Rldi0+dmlkZW9fdHlwZSA9PSBTT0xPX1ZPX0ZNVF9UWVBFX05UU0MpID8KKwkgICAgIHRibF9udHNjX3R3MjgxNV9jb21tb24gOiB0YmxfcGFsX3R3MjgxNV9jb21tb247CisKKwkvKiBEdWFsIElUVS1SIEJULjY1NiBmb3JtYXQgKi8KKwl0YmxfdHcyODE1X2NvbW1vblsweDBkXSB8PSAweDA0OworCisJLyogQXVkaW8gY29uZmlndXJhdGlvbiAqLworCXRibF90dzI4MTVfc2ZyWzB4NjIgLSAweDQwXSAmPSB+KDMgPDwgNik7CisKKwlpZiAoc29sb19kZXYtPm5yX2NoYW5zID09IDQpIHsKKwkJdGJsX3R3MjgxNV9zZnJbMHg2MyAtIDB4NDBdIHw9IDE7CisJCXRibF90dzI4MTVfc2ZyWzB4NjIgLSAweDQwXSB8PSAzIDw8IDY7CisJfSBlbHNlIGlmIChzb2xvX2Rldi0+bnJfY2hhbnMgPT0gOCkgeworCQl0YmxfdHcyODE1X3NmclsweDYzIC0gMHg0MF0gfD0gMjsKKwkJaWYgKGRldl9hZGRyID09IFRXX0NISVBfT0ZGU0VUX0FERFIoMCkpCisJCQl0YmxfdHcyODE1X3NmclsweDYyIC0gMHg0MF0gfD0gMSA8PCA2OworCQllbHNlIGlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDEpKQorCQkJdGJsX3R3MjgxNV9zZnJbMHg2MiAtIDB4NDBdIHw9IDIgPDwgNjsKKwl9IGVsc2UgaWYgKHNvbG9fZGV2LT5ucl9jaGFucyA9PSAxNikgeworCQl0YmxfdHcyODE1X3NmclsweDYzIC0gMHg0MF0gfD0gMzsKKwkJaWYgKGRldl9hZGRyID09IFRXX0NISVBfT0ZGU0VUX0FERFIoMCkpCisJCQl0YmxfdHcyODE1X3NmclsweDYyIC0gMHg0MF0gfD0gMSA8PCA2OworCQllbHNlIGlmIChkZXZfYWRkciA9PSBUV19DSElQX09GRlNFVF9BRERSKDEpKQorCQkJdGJsX3R3MjgxNV9zZnJbMHg2MiAtIDB4NDBdIHw9IDAgPDwgNjsKKwkJZWxzZSBpZiAoZGV2X2FkZHIgPT0gVFdfQ0hJUF9PRkZTRVRfQUREUigyKSkKKwkJCXRibF90dzI4MTVfc2ZyWzB4NjIgLSAweDQwXSB8PSAwIDw8IDY7CisJCWVsc2UgaWYgKGRldl9hZGRyID09IFRXX0NISVBfT0ZGU0VUX0FERFIoMykpCisJCQl0YmxfdHcyODE1X3NmclsweDYyIC0gMHg0MF0gfD0gMiA8PCA2OworCX0KKworCS8qIE91dHB1dCBtb2RlIG9mIFJfQURBVE0gcGluICgwIG1peGluZywgMSByZWNvcmQpICovCisJLyogdGJsX3R3MjgxNV9zZnJbMHg2MyAtIDB4NDBdIHw9IDAgPDwgMjsgKi8KKworCS8qIDhLSHosIHVzZWQgdG8gYmUgMTZLSHosIGJ1dCBjaGFuZ2VkIGZvciByZW1vdGUgY2xpZW50IGNvbXBhdCAqLworCXRibF90dzI4MTVfc2ZyWzB4NjIgLSAweDQwXSB8PSAwIDw8IDI7CisJdGJsX3R3MjgxNV9zZnJbMHg2YyAtIDB4NDBdIHw9IDAgPDwgMjsKKworCS8qIFBsYXliYWNrIG9mIHJpZ2h0IGNoYW5uZWwgKi8KKwl0YmxfdHcyODE1X3NmclsweDZjIC0gMHg0MF0gfD0gMSA8PCA1OworCisJLyogUmVzZXJ2ZWQgdmFsdWUgKFhYWCA/PykgKi8KKwl0YmxfdHcyODE1X3NmclsweDVjIC0gMHg0MF0gfD0gMSA8PCA1OworCisJLyogQW5hbG9nIG91dHB1dCBnYWluIGFuZCBtaXggcmF0aW8gcGxheWJhY2sgb24gZnVsbCAqLworCXRibF90dzI4MTVfc2ZyWzB4NzAgLSAweDQwXSB8PSAweGZmOworCS8qIFNlbGVjdCBwbGF5YmFjayBhdWRpbyBhbmQgbXV0ZSBhbGwgZXhjZXB0ICovCisJdGJsX3R3MjgxNV9zZnJbMHg3MSAtIDB4NDBdIHw9IDB4MTA7CisJdGJsX3R3MjgxNV9zZnJbMHg2ZCAtIDB4NDBdIHw9IDB4MGY7CisKKwkvKiBFbmQgb2YgYXVkaW8gY29uZmlndXJhdGlvbiAqLworCisJZm9yIChjaCA9IDA7IGNoIDwgNDsgY2grKykgeworCQl0YmxfdHcyODE1X2NvbW1vblsweDBkXSAmPSB+MzsKKwkJc3dpdGNoIChjaCkgeworCQljYXNlIDA6CisJCQl0YmxfdHcyODE1X2NvbW1vblsweDBkXSB8PSAweDIxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXRibF90dzI4MTVfY29tbW9uWzB4MGRdIHw9IDB4MjA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdGJsX3R3MjgxNV9jb21tb25bMHgwZF0gfD0gMHgyMzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl0YmxfdHcyODE1X2NvbW1vblsweDBkXSB8PSAweDIyOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMHgwZjsgaSsrKSB7CisJCQlpZiAoaSA9PSAweDAwKQorCQkJCWNvbnRpbnVlOwkvLyByZWFkLW9ubHkKKwkJCXNvbG9faTJjX3dyaXRlYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsCisJCQkJCSAgIGRldl9hZGRyLCAoY2ggKiAweDEwKSArIGksCisJCQkJCSAgIHRibF90dzI4MTVfY29tbW9uW2ldKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDB4NDA7IGkgPCAweDc2OyBpKyspIHsKKwkJLyogU2tpcCByZWFkLW9ubHkgYW5kIG5vcCByZWdpc3RlcnMgKi8KKwkJaWYgKGkgPT0gMHg0MCB8fCBpID09IDB4NTkgfHwgaSA9PSAweDVhIHx8CisJCSAgICBpID09IDB4NWQgfHwgaSA9PSAweDVlIHx8IGkgPT0gMHg1ZikKKwkJCWNvbnRpbnVlOworCisJCXNvbG9faTJjX3dyaXRlYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsIGRldl9hZGRyLCBpLAorCQkJCSAgICAgICB0YmxfdHcyODE1X3NmcltpIC0gMHg0MF0pOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEZJUlNUX0FDVElWRV9MSU5FCTB4MDAwOAorI2RlZmluZSBMQVNUX0FDVElWRV9MSU5FCTB4MDEwMgorCitzdGF0aWMgdm9pZCBzYWE3MTI4X3NldHVwKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgcmVnc1sxMjhdID0geworCQkweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkweDFDLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBkLCAweDAwLAorCQkweDU5LCAweDFkLCAweDc1LCAweDNmLCAweDA2LCAweDNmLCAweDAwLCAweDAwLAorCQkweDFjLCAweDMzLCAweDAwLCAweDNmLCAweDAwLCAweDAwLCAweDNmLCAweDAwLAorCQkweDFhLCAweDFhLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDAwLCAweDY4LCAweDEwLCAweDk3LCAweDRjLCAweDE4LAorCQkweDliLCAweDkzLCAweDlmLCAweGZmLCAweDdjLCAweDM0LCAweDNmLCAweDNmLAorCQkweDNmLCAweDgzLCAweDgzLCAweDgwLCAweDBkLCAweDBmLCAweGMzLCAweDA2LAorCQkweDAyLCAweDgwLCAweDcxLCAweDc3LCAweGE3LCAweDY3LCAweDY2LCAweDJlLAorCQkweDdiLCAweDExLCAweDRmLCAweDFmLCAweDdjLCAweGYwLCAweDIxLCAweDc3LAorCQkweDQxLCAweDg4LCAweDQxLCAweDEyLCAweGVkLCAweDEwLCAweDEwLCAweDAwLAorCQkweDQxLCAweGMzLCAweDAwLCAweDNlLCAweGI4LCAweDAyLCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDA4LCAweGZmLCAweDgwLCAweDAwLCAweGZmLCAweGZmLAorCX07CisKKwlyZWdzWzB4N0FdID0gRklSU1RfQUNUSVZFX0xJTkUgJiAweGZmOworCXJlZ3NbMHg3Ql0gPSBMQVNUX0FDVElWRV9MSU5FICYgMHhmZjsKKwlyZWdzWzB4N0NdID0gKCgxIDw8IDcpIHwKKwkJCSgoKExBU1RfQUNUSVZFX0xJTkUgPj4gOCkgJiAxKSA8PCA2KSB8CisJCQkoKChGSVJTVF9BQ1RJVkVfTElORSA+PiA4KSAmIDEpIDw8IDQpKTsKKworCS8qIFBBTDogWFhYOiBXZSBjb3VsZCBkbyBhIHNlY29uZCBzZXQgb2YgcmVncyB0byBhdm9pZCB0aGlzICovCisJaWYgKHNvbG9fZGV2LT52aWRlb190eXBlICE9IFNPTE9fVk9fRk1UX1RZUEVfTlRTQykgeworCQlyZWdzWzB4MjhdID0gMHhFMTsKKworCQlyZWdzWzB4NUFdID0gMHgwRjsKKwkJcmVnc1sweDYxXSA9IDB4MDI7CisJCXJlZ3NbMHg2Ml0gPSAweDM1OworCQlyZWdzWzB4NjNdID0gMHhDQjsKKwkJcmVnc1sweDY0XSA9IDB4OEE7CisJCXJlZ3NbMHg2NV0gPSAweDA5OworCQlyZWdzWzB4NjZdID0gMHgyQTsKKworCQlyZWdzWzB4NkNdID0gMHhmMTsKKwkJcmVnc1sweDZFXSA9IDB4MjA7CisKKwkJcmVnc1sweDdBXSA9IDB4MDYgKyAxMjsKKwkJcmVnc1sweDdiXSA9IDB4MjQgKyAxMjsKKwkJcmVnc1sweDdjXSB8PSAxIDw8IDY7CisJfQorCisJLyogRmlyc3QgMHgyNSBieXRlcyBhcmUgcmVhZC1vbmx5PyAqLworCWZvciAoaSA9IDB4MjY7IGkgPCAxMjg7IGkrKykgeworCQlpZiAoaSA9PSAweDYwIHx8IGkgPT0gMHg3RCkKKwkJCWNvbnRpbnVlOworCQlzb2xvX2kyY193cml0ZWJ5dGUoc29sb19kZXYsIFNPTE9fSTJDX1NBQSwgMHg0NiwgaSwgcmVnc1tpXSk7CisJfQorCisJcmV0dXJuOworfQorCitpbnQgc29sb190dzI4X2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisJdTggdmFsdWU7CisKKwkvKiBEZXRlY3QgdGVjaHdlbGwgY2hpcCB0eXBlICovCisJZm9yIChpID0gMDsgaSA8IFRXX05VTV9DSElQOyBpKyspIHsKKwkJdmFsdWUgPSBzb2xvX2kyY19yZWFkYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsCisJCQkJCSAgVFdfQ0hJUF9PRkZTRVRfQUREUihpKSwgMHhGRik7CisKKwkJc3dpdGNoICh2YWx1ZSA+PiAzKSB7CisJCWNhc2UgMHgxODoKKwkJCXNvbG9fZGV2LT50dzI4NjUgfD0gMSA8PCBpOworCQkJc29sb19kZXYtPnR3MjhfY250Kys7CisJCQlicmVhazsKKwkJY2FzZSAweDBjOgorCQkJc29sb19kZXYtPnR3Mjg2NCB8PSAxIDw8IGk7CisJCQlzb2xvX2Rldi0+dHcyOF9jbnQrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmFsdWUgPSBzb2xvX2kyY19yZWFkYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsCisJCQkJCQkgIFRXX0NISVBfT0ZGU0VUX0FERFIoaSksIDB4NTkpOworCQkJaWYgKCh2YWx1ZSA+PiAzKSA9PSAweDA0KSB7CisJCQkJc29sb19kZXYtPnR3MjgxNSB8PSAxIDw8IGk7CisJCQkJc29sb19kZXYtPnR3MjhfY250Kys7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXNvbG9fZGV2LT50dzI4X2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzYWE3MTI4X3NldHVwKHNvbG9fZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBzb2xvX2Rldi0+dHcyOF9jbnQ7IGkrKykgeworCQlpZiAoKHNvbG9fZGV2LT50dzI4NjUgJiAoMSA8PCBpKSkpCisJCQl0dzI4NjVfc2V0dXAoc29sb19kZXYsIFRXX0NISVBfT0ZGU0VUX0FERFIoaSkpOworCQllbHNlIGlmICgoc29sb19kZXYtPnR3Mjg2NCAmICgxIDw8IGkpKSkKKwkJCXR3Mjg2NF9zZXR1cChzb2xvX2RldiwgVFdfQ0hJUF9PRkZTRVRfQUREUihpKSk7CisJCWVsc2UKKwkJCXR3MjgxNV9zZXR1cChzb2xvX2RldiwgVFdfQ0hJUF9PRkZTRVRfQUREUihpKSk7CisJfQorCisJZGV2X2luZm8oJnNvbG9fZGV2LT5wZGV2LT5kZXYsICJJbml0aWFsaXplZCAlZCB0dzI4eHggY2hpcCVzOiIsCisJCSBzb2xvX2Rldi0+dHcyOF9jbnQsIHNvbG9fZGV2LT50dzI4X2NudCA9PSAxID8gIiIgOiAicyIpOworCisJaWYgKHNvbG9fZGV2LT50dzI4NjUpCisJCXByaW50aygiIHR3Mjg2NVslZF0iLCBod2VpZ2h0MzIoc29sb19kZXYtPnR3Mjg2NSkpOworCWlmIChzb2xvX2Rldi0+dHcyODY0KQorCQlwcmludGsoIiB0dzI4NjRbJWRdIiwgaHdlaWdodDMyKHNvbG9fZGV2LT50dzI4NjQpKTsKKwlpZiAoc29sb19kZXYtPnR3MjgxNSkKKwkJcHJpbnRrKCIgdHcyODE1WyVkXSIsIGh3ZWlnaHQzMihzb2xvX2Rldi0+dHcyODE1KSk7CisJcHJpbnRrKCJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogV2UgYWNjZXNzZWQgdGhlIHZpZGVvIHN0YXR1cyBzaWduYWwgaW4gdGhlIFRlY2h3ZWxsIGNoaXAgdGhyb3VnaAorICogaWljL2kyYyBiZWNhdXNlIHRoZSB2aWRlbyBzdGF0dXMgcmVwb3J0ZWQgYnkgcmVnaXN0ZXIgUkVHX1ZJX1NUQVRVUzEKKyAqIChhZGRyZXNzIDB4MDEyQykgb2YgdGhlIFNPTE82MDEwIGNoaXAgZG9lc24ndCBnaXZlIHRoZSBjb3JyZWN0IHZpZGVvCisgKiBzdGF0dXMgc2lnbmFsIHZhbHVlcy4KKyAqLworaW50IHR3MjhfZ2V0X3ZpZGVvX3N0YXR1cyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gpCit7CisJdTggdmFsLCBjaGlwX251bTsKKworCS8qIEdldCB0aGUgcmlnaHQgY2hpcCBhbmQgb24tY2hpcCBjaGFubmVsICovCisJY2hpcF9udW0gPSBjaCAvIDQ7CisJY2ggJT0gNDsKKworCXZhbCA9IHR3X3JlYWRieXRlKHNvbG9fZGV2LCBjaGlwX251bSwgVFcyODZYX0FWX1NUQVRfQUREUiwKKwkJCSAgVFdfQVZfU1RBVF9BRERSKSAmIDB4MGY7CisKKwlyZXR1cm4gdmFsICYgKDEgPDwgY2gpID8gMSA6IDA7Cit9CisKKyNpZiAwCisvKiBTdGF0dXMgb2YgYXVkaW8gZnJvbSB1cCB0byA0IHRlY2h3ZWxsIGNoaXBzIGFyZSBjb21iaW5lZCBpbnRvIDEgdmFyaWFibGUuCisgKiBTZWUgdGVjaHdlbGwgZGF0YXNoZWV0IGZvciBkZXRhaWxzLiAqLwordTE2IHR3MjhfZ2V0X2F1ZGlvX3N0YXR1cyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwl1OCB2YWw7CisJdTE2IHN0YXR1cyA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPnR3MjhfY250OyBpKyspIHsKKwkJdmFsID0gKHR3X3JlYWRieXRlKHNvbG9fZGV2LCBpLCBUVzI4NlhfQVZfU1RBVF9BRERSLAorCQkJCSAgIFRXX0FWX1NUQVRfQUREUikgJiAweGYwKSA+PiA0OworCQlzdGF0dXMgfD0gdmFsIDw8IChpICogNCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCitpbnQgdHcyOF9zZXRfY3RybF92YWwoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHUzMiBjdHJsLCB1OCBjaCwKKwkJICAgICAgczMyIHZhbCkKK3sKKwljaGFyIHN2YWw7CisJdTggY2hpcF9udW07CisKKwkvKiBHZXQgdGhlIHJpZ2h0IGNoaXAgYW5kIG9uLWNoaXAgY2hhbm5lbCAqLworCWNoaXBfbnVtID0gY2ggLyA0OworCWNoICU9IDQ7CisKKwlpZiAodmFsID4gMjU1IHx8IHZhbCA8IDApCisJCXJldHVybiAtRVJBTkdFOworCisJc3dpdGNoIChjdHJsKSB7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCS8qIE9ubHkgMjg2eCBoYXMgc2hhcnBuZXNzICovCisJCWlmICh2YWwgPiAweDBmIHx8IHZhbCA8IDApCisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJaWYgKGlzX3R3Mjg2eChzb2xvX2RldiwgY2hpcF9udW0pKSB7CisJCQl1OCB2ID0gc29sb19pMmNfcmVhZGJ5dGUoc29sb19kZXYsIFNPTE9fSTJDX1RXLAorCQkJCQkJIFRXX0NISVBfT0ZGU0VUX0FERFIoY2hpcF9udW0pLAorCQkJCQkJIFRXMjg2eF9TSEFSUE5FU1MoY2hpcF9udW0pKTsKKwkJCXYgJj0gMHhmMDsKKwkJCXYgfD0gdmFsOworCQkJc29sb19pMmNfd3JpdGVieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKKwkJCQkJICAgVFdfQ0hJUF9PRkZTRVRfQUREUihjaGlwX251bSksCisJCQkJCSAgIFRXMjg2eF9TSEFSUE5FU1MoY2hpcF9udW0pLCB2KTsKKwkJfSBlbHNlIGlmICh2YWwgIT0gMCkKKwkJCXJldHVybiAtRVJBTkdFOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlpZiAoaXNfdHcyODZ4KHNvbG9fZGV2LCBjaGlwX251bSkpCisJCQlzdmFsID0gdmFsIC0gMTI4OworCQllbHNlCisJCQlzdmFsID0gKGNoYXIpdmFsOworCQl0d193cml0ZWJ5dGUoc29sb19kZXYsIGNoaXBfbnVtLCBUVzI4NnhfSFVFX0FERFIoY2gpLAorCQkJICAgICBUV19IVUVfQUREUihjaCksIHN2YWwpOworCisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlpZiAoaXNfdHcyODZ4KHNvbG9fZGV2LCBjaGlwX251bSkpIHsKKwkJCXNvbG9faTJjX3dyaXRlYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsCisJCQkJCSAgIFRXX0NISVBfT0ZGU0VUX0FERFIoY2hpcF9udW0pLAorCQkJCQkgICBUVzI4NnhfU0FUVVJBVElPTlVfQUREUihjaCksIHZhbCk7CisJCX0KKwkJdHdfd3JpdGVieXRlKHNvbG9fZGV2LCBjaGlwX251bSwgVFcyODZ4X1NBVFVSQVRJT05WX0FERFIoY2gpLAorCQkJICAgICBUV19TQVRVUkFUSU9OX0FERFIoY2gpLCB2YWwpOworCisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJdHdfd3JpdGVieXRlKHNvbG9fZGV2LCBjaGlwX251bSwgVFcyODZ4X0NPTlRSQVNUX0FERFIoY2gpLAorCQkJICAgICBUV19DT05UUkFTVF9BRERSKGNoKSwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkKKwkJCXN2YWwgPSB2YWwgLSAxMjg7CisJCWVsc2UKKwkJCXN2YWwgPSAoY2hhcil2YWw7CisJCXR3X3dyaXRlYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sIFRXMjg2eF9CUklHSFRORVNTX0FERFIoY2gpLAorCQkJICAgICBUV19CUklHSFRORVNTX0FERFIoY2gpLCBzdmFsKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHR3MjhfZ2V0X2N0cmxfdmFsKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1MzIgY3RybCwgdTggY2gsCisJCSAgICAgIHMzMiAqdmFsKQoreworCXU4IHJ2YWwsIGNoaXBfbnVtOworCisJLyogR2V0IHRoZSByaWdodCBjaGlwIGFuZCBvbi1jaGlwIGNoYW5uZWwgKi8KKwljaGlwX251bSA9IGNoIC8gNDsKKwljaCAlPSA0OworCisJc3dpdGNoIChjdHJsKSB7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCS8qIE9ubHkgMjg2eCBoYXMgc2hhcnBuZXNzICovCisJCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkgeworCQkJcnZhbCA9IHNvbG9faTJjX3JlYWRieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKKwkJCQkJCSBUV19DSElQX09GRlNFVF9BRERSKGNoaXBfbnVtKSwKKwkJCQkJCSBUVzI4NnhfU0hBUlBORVNTKGNoaXBfbnVtKSk7CisJCQkqdmFsID0gcnZhbCAmIDB4MGY7CisJCX0gZWxzZQorCQkJKnZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlydmFsID0gdHdfcmVhZGJ5dGUoc29sb19kZXYsIGNoaXBfbnVtLCBUVzI4NnhfSFVFX0FERFIoY2gpLAorCQkJCSAgIFRXX0hVRV9BRERSKGNoKSk7CisJCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkKKwkJCSp2YWwgPSAoczMyKSgoY2hhcilydmFsKSArIDEyODsKKwkJZWxzZQorCQkJKnZhbCA9IHJ2YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJKnZhbCA9IHR3X3JlYWRieXRlKHNvbG9fZGV2LCBjaGlwX251bSwKKwkJCQkgICBUVzI4NnhfU0FUVVJBVElPTlVfQUREUihjaCksCisJCQkJICAgVFdfU0FUVVJBVElPTl9BRERSKGNoKSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCSp2YWwgPSB0d19yZWFkYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sCisJCQkJICAgVFcyODZ4X0NPTlRSQVNUX0FERFIoY2gpLAorCQkJCSAgIFRXX0NPTlRSQVNUX0FERFIoY2gpKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQlydmFsID0gdHdfcmVhZGJ5dGUoc29sb19kZXYsIGNoaXBfbnVtLAorCQkJCSAgIFRXMjg2eF9CUklHSFRORVNTX0FERFIoY2gpLAorCQkJCSAgIFRXX0JSSUdIVE5FU1NfQUREUihjaCkpOworCQlpZiAoaXNfdHcyODZ4KHNvbG9fZGV2LCBjaGlwX251bSkpIAorCQkJKnZhbCA9IChzMzIpKChjaGFyKXJ2YWwpICsgMTI4OworCQllbHNlCisJCQkqdmFsID0gcnZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisvKgorICogRm9yIGF1ZGlvIG91dHB1dCB2b2x1bWUsIHRoZSBvdXRwdXQgY2hhbm5lbCBpcyBvbmx5IDEuIEluIHRoaXMgY2FzZSB3ZQorICogZG9uJ3QgbmVlZCB0byBvZmZzZXQgVFdfQ0hJUF9PRkZTRVRfQUREUi4gVGhlIFRXX0NISVBfT0ZGU0VUX0FERFIgdXNlZAorICogaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGVjaHdlbGwgY2hpcC4KKyAqLwordm9pZCB0dzI4MTVfU2V0X0F1ZGlvT3V0Vm9sKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1bnNpZ25lZCBpbnQgdV92YWwpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgY2hpcF9udW07CisKKwljaGlwX251bSA9IChzb2xvX2Rldi0+bnJfY2hhbnMgLSAxKSAvIDQ7CisKKwl2YWwgPSB0d19yZWFkYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sIFRXMjg2eF9BVURJT19PVVRQVVRfVk9MX0FERFIsCisJCQkgIFRXX0FVRElPX09VVFBVVF9WT0xfQUREUik7CisKKwl1X3ZhbCA9ICh2YWwgJiAweDBmKSB8ICh1X3ZhbCA8PCA0KTsKKworCXR3X3dyaXRlYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sIFRXMjg2eF9BVURJT19PVVRQVVRfVk9MX0FERFIsCisJCSAgICAgVFdfQVVESU9fT1VUUFVUX1ZPTF9BRERSLCB1X3ZhbCk7Cit9CisjZW5kaWYKKwordTggdHcyOF9nZXRfYXVkaW9fZ2FpbihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gpCit7CisJdTggdmFsOworCXU4IGNoaXBfbnVtOworCisJLyogR2V0IHRoZSByaWdodCBjaGlwIGFuZCBvbi1jaGlwIGNoYW5uZWwgKi8KKwljaGlwX251bSA9IGNoIC8gNDsKKwljaCAlPSA0OworCisJdmFsID0gdHdfcmVhZGJ5dGUoc29sb19kZXYsIGNoaXBfbnVtLAorCQkJICBUVzI4NnhfQVVESU9fSU5QVVRfR0FJTl9BRERSKGNoKSwKKwkJCSAgVFdfQVVESU9fSU5QVVRfR0FJTl9BRERSKGNoKSk7CisKKwlyZXR1cm4gKGNoICUgMikgPyAodmFsID4+IDQpIDogKHZhbCAmIDB4MGYpOworfQorCit2b2lkIHR3Mjhfc2V0X2F1ZGlvX2dhaW4oc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLCB1OCB2YWwpCit7CisJdTggb2xkX3ZhbDsKKwl1OCBjaGlwX251bTsKKworCS8qIEdldCB0aGUgcmlnaHQgY2hpcCBhbmQgb24tY2hpcCBjaGFubmVsICovCisJY2hpcF9udW0gPSBjaCAvIDQ7CisJY2ggJT0gNDsKKworCW9sZF92YWwgPSB0d19yZWFkYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sCisJCQkgICAgICBUVzI4NnhfQVVESU9fSU5QVVRfR0FJTl9BRERSKGNoKSwKKwkJCSAgICAgIFRXX0FVRElPX0lOUFVUX0dBSU5fQUREUihjaCkpOworCisJdmFsID0gKG9sZF92YWwgJiAoKGNoICUgMikgPyAweDBmIDogMHhmMCkpIHwKKwkJKChjaCAlIDIpID8gKHZhbCA8PCA0KSA6IHZhbCk7CisKKwl0d193cml0ZWJ5dGUoc29sb19kZXYsIGNoaXBfbnVtLCBUVzI4NnhfQVVESU9fSU5QVVRfR0FJTl9BRERSKGNoKSwKKwkJICAgICBUV19BVURJT19JTlBVVF9HQUlOX0FERFIoY2gpLCB2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguaCBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC10dzI4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC10dzI4LmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1NPTE82MDEwX1RXMjhfSAorI2RlZmluZSBfX1NPTE82MDEwX1RXMjhfSAorCisjaW5jbHVkZSAic29sbzYwMTAuaCIKKworI2RlZmluZSBUV19OVU1fQ0hJUAkJCQk0CisjZGVmaW5lIFRXX0JBU0VfQUREUgkJCQkweDI4CisjZGVmaW5lIFRXX0NISVBfT0ZGU0VUX0FERFIobikJCQkoVFdfQkFTRV9BRERSICsgKG4pKQorCisvKiB0dzI4MTUgKi8KKyNkZWZpbmUgVFdfQVZfU1RBVF9BRERSCQkJCTB4NWEKKyNkZWZpbmUgVFdfSFVFX0FERFIobikJCQkJKDB4MDcgfCAoKG4pIDw8IDQpKQorI2RlZmluZSBUV19TQVRVUkFUSU9OX0FERFIobikJCQkoMHgwOCB8ICgobikgPDwgNCkpCisjZGVmaW5lIFRXX0NPTlRSQVNUX0FERFIobikJCQkoMHgwOSB8ICgobikgPDwgNCkpCisjZGVmaW5lIFRXX0JSSUdIVE5FU1NfQUREUihuKQkJCSgweDBhIHwgKChuKSA8PCA0KSkKKyNkZWZpbmUgVFdfQVVESU9fT1VUUFVUX1ZPTF9BRERSCQkweDcwCisjZGVmaW5lIFRXX0FVRElPX0lOUFVUX0dBSU5fQUREUihuKQkJKDB4NjAgKyAoKG4gPiAxKSA/IDEgOiAwKSkKKworLyogdHcyODZ4ICovCisjZGVmaW5lIFRXMjg2WF9BVl9TVEFUX0FERFIJCQkweGZkCisjZGVmaW5lIFRXMjg2eF9IVUVfQUREUihuKQkJCSgweDA2IHwgKChuKSA8PCA0KSkKKyNkZWZpbmUgVFcyODZ4X1NBVFVSQVRJT05VX0FERFIobikJCSgweDA0IHwgKChuKSA8PCA0KSkKKyNkZWZpbmUgVFcyODZ4X1NBVFVSQVRJT05WX0FERFIobikJCSgweDA1IHwgKChuKSA8PCA0KSkKKyNkZWZpbmUgVFcyODZ4X0NPTlRSQVNUX0FERFIobikJCQkoMHgwMiB8ICgobikgPDwgNCkpCisjZGVmaW5lIFRXMjg2eF9CUklHSFRORVNTX0FERFIobikJCSgweDAxIHwgKChuKSA8PCA0KSkKKyNkZWZpbmUgVFcyODZ4X1NIQVJQTkVTUyhuKQkJCSgweDAzIHwgKChuKSA8PCA0KSkKKyNkZWZpbmUgVFcyODZ4X0FVRElPX09VVFBVVF9WT0xfQUREUgkJMHhkZgorI2RlZmluZSBUVzI4NnhfQVVESU9fSU5QVVRfR0FJTl9BRERSKG4pCQkoMHhEMCArICgobiA+IDEpID8gMSA6IDApKQorCitpbnQgc29sb190dzI4X2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOworCitpbnQgdHcyOF9zZXRfY3RybF92YWwoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHUzMiBjdHJsLCB1OCBjaCwKKwkJICAgICAgczMyIHZhbCk7CitpbnQgdHcyOF9nZXRfY3RybF92YWwoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHUzMiBjdHJsLCB1OCBjaCwKKwkJICAgICAgczMyICp2YWwpOworCit1OCB0dzI4X2dldF9hdWRpb19nYWluKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBjaCk7Cit2b2lkIHR3Mjhfc2V0X2F1ZGlvX2dhaW4oc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLCB1OCB2YWwpOworaW50IHR3MjhfZ2V0X3ZpZGVvX3N0YXR1cyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gpOworCisjaWYgMAordW5zaWduZWQgaW50IHR3MjgxNV9nZXRfYXVkaW9fc3RhdHVzKHN0cnVjdCBTT0xPNjAxMCAqc29sbzYwMTApOwordm9pZCB0dzI4MTVfU2V0X0F1ZGlvT3V0Vm9sKHN0cnVjdCBTT0xPNjAxMCAqc29sbzYwMTAsIHVuc2lnbmVkIGludCB1X3ZhbCk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU09MTzYwMTBfVFcyOF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTRiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYwpAQCAtMCwwICsxLDE1NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmx1ZWNoZXJyeSwgTExDIHd3dy5ibHVlY2hlcnJ5ZHZyLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEJlbiBDb2xsaW5zIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgorCisjaW5jbHVkZSAic29sbzYwMTAuaCIKKyNpbmNsdWRlICJzb2xvNjAxMC10dzI4LmgiCisjaW5jbHVkZSAic29sbzYwMTAtanBlZy5oIgorCisjZGVmaW5lIE1JTl9WSURfQlVGRkVSUwkJNAorI2RlZmluZSBGUkFNRV9CVUZfU0laRQkJKDEyOCAqIDEwMjQpCisjZGVmaW5lIE1QNF9RUwkJCTE2CisKK3N0YXRpYyBpbnQgc29sb19lbmNfdGhyZWFkKHZvaWQgKmRhdGEpOworCitleHRlcm4gdW5zaWduZWQgdmlkZW9fbnI7CisKK3N0cnVjdCBzb2xvX2VuY19maCB7CisJc3RydWN0CQkJc29sb19lbmNfZGV2ICplbmM7CisJdTMyCQkJZm10OworCXUxNgkJCXJkX2lkeDsKKwl1OAkJCWVuY19vbjsKKwllbnVtIHNvbG9fZW5jX3R5cGVzCXR5cGU7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlCXZpZHE7CisJc3RydWN0IGxpc3RfaGVhZAl2aWRxX2FjdGl2ZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmt0aHJlYWQ7Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB2aWRfdm9wX2hlYWRlcltdID0geworCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MjAsCisJMHgwMiwgMHg0OCwgMHgwNSwgMHhjMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwKKwkweDAwLCAweDQwLCAweDAwLCAweDgwLCAweDAwLCAweDk3LCAweDUzLCAweDA0LAorCTB4MWYsIDB4NGMsIDB4NTgsIDB4MTAsIDB4NzgsIDB4NTEsIDB4MTgsIDB4M2UsCit9OworCisvKgorICogVGhpbmdzIHdlIGNhbiBjaGFuZ2UgYXJvdW5kOgorICoKKyAqIGJ5dGUgIDEwLCAgICAgICAgNC1iaXRzIDAxMTExMDAwICAgICAgICAgICAgICAgICAgIGFzcGVjdAorICogYnl0ZXMgMjEsMjIsMjMgIDE2LWJpdHMgMDAweDExMTEgMTExMTExMTEgMTExMXgwMDAgZnBzL3JlcworICogYnl0ZXMgMjMsMjQsMjUgIDE1LWJpdHMgMDAwMDBuMTEgMTExMTExMTEgMTExMTF4MDAgaW50ZXJ2YWwKKyAqIGJ5dGVzIDI1LDI2LDI3ICAxMy1iaXRzIDAwMDAweDExIDExMTExMTExIDExMXgwMDAwIHdpZHRoCisgKiBieXRlcyAyNywyOCwyOSAgMTMtYml0cyAwMDB4MTExMSAxMTExMTExMSAxeDAwMDAwMCBoZWlnaHQKKyAqIGJ5dGUgIDI5ICAgICAgICAgMS1iaXQgIDB4MTAwMDAwICAgICAgICAgICAgICAgICAgIGludGVybGFjZQorICovCisKKy8qIEZvciBhc3BlY3QgKi8KKyNkZWZpbmUgWFZJRF9QQVJfNDNfUEFMCQkyCisjZGVmaW5lIFhWSURfUEFSXzQzX05UU0MJMworCitzdGF0aWMgY29uc3QgdTMyIHNvbG9fdXNlcl9jdHJsc1tdID0geworCVY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJVjRMMl9DSURfQ09OVFJBU1QsCisJVjRMMl9DSURfU0FUVVJBVElPTiwKKwlWNEwyX0NJRF9IVUUsCisJVjRMMl9DSURfU0hBUlBORVNTLAorCTAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc29sb19tcGVnX2N0cmxzW10gPSB7CisJVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORywKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFLAorCTAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc29sb19wcml2YXRlX2N0cmxzW10gPSB7CisJVjRMMl9DSURfTU9USU9OX0VOQUJMRSwKKwlWNEwyX0NJRF9NT1RJT05fVEhSRVNIT0xELAorCTAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc29sb19mbXR4X2N0cmxzW10gPSB7CisJVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHUzMiAqc29sb19jdHJsX2NsYXNzZXNbXSA9IHsKKwlzb2xvX3VzZXJfY3RybHMsCisJc29sb19tcGVnX2N0cmxzLAorCXNvbG9fZm10eF9jdHJscywKKwlzb2xvX3ByaXZhdGVfY3RybHMsCisJTlVMTAorfTsKKworc3RydWN0IHZvcF9oZWFkZXIgeworCS8qIFZEX0lEWDAgKi8KKwl1MzIgc2l6ZToyMCwgc3luY19zdGFydDoxLCBwYWdlX3N0b3A6MSwgdm9wX3R5cGU6MiwgY2hhbm5lbDo0LAorCQlub3AwOjEsIHNvdXJjZV9mbDoxLCBpbnRlcmxhY2U6MSwgcHJvZ3Jlc3NpdmU6MTsKKworCS8qIFZEX0lEWDEgKi8KKwl1MzIgdnNpemU6OCwgaHNpemU6OCwgZnJhbWVfaW50ZXJvcDoxLCBub3AxOjcsIHdpbl9pZDo0LCBzY2FsZTo0OworCisJLyogVkRfSURYMiAqLworCXUzMiBiYXNlX2FkZHI6MTYsIG5vcDI6MTUsIGhvZmY6MTsKKworCS8qIFZEX0lEWDMgLSBVc2VyIHNldCBtYWNyb3MgKi8KKwl1MzIgc3k6MTIsIHN4OjEyLCBub3AzOjEsIGh6b29tOjEsIHJlYWRfaW50ZXJvcDoxLCB3cml0ZV9pbnRlcmxhY2U6MSwKKwkJc2NhbGVfbW9kZTo0OworCisJLyogVkRfSURYNCAtIFVzZXIgc2V0IG1hY3JvcyBjb250aW51ZWQgKi8KKwl1MzIgd3JpdGVfcGFnZTo4LCBub3A0OjI0OworCisJLyogVkRfSURYNSAqLworCXUzMiBuZXh0X2NvZGVfYWRkcjsKKworCXUzMiBlbmRfbm9wc1sxMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHNvbG9faXNfbW90aW9uX29uKHN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jKQoreworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCXU4IGNoID0gc29sb19lbmMtPmNoOworCisJaWYgKHNvbG9fZGV2LT5tb3Rpb25fbWFzayAmICgxIDw8IGNoKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fbW90aW9uX3RvZ2dsZShzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYywgaW50IG9uKQoreworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCXU4IGNoID0gc29sb19lbmMtPmNoOworCisJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisKKwlpZiAob24pCisJCXNvbG9fZGV2LT5tb3Rpb25fbWFzayB8PSAoMSA8PCBjaCk7CisJZWxzZQorCQlzb2xvX2Rldi0+bW90aW9uX21hc2sgJj0gfigxIDw8IGNoKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVF9BRFIsCisJCSAgICAgICBTT0xPX1ZJX01PVElPTl9FTihzb2xvX2Rldi0+bW90aW9uX21hc2spIHwKKwkJICAgICAgIChTT0xPX01PVElPTl9FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKKworCWlmIChzb2xvX2Rldi0+bW90aW9uX21hc2spCisJCXNvbG82MDEwX2lycV9vbihzb2xvX2RldiwgU09MT19JUlFfTU9USU9OKTsKKwllbHNlCisJCXNvbG82MDEwX2lycV9vZmYoc29sb19kZXYsIFNPTE9fSVJRX01PVElPTik7CisKKwlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworfQorCisvKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggc29sb19lbmMtPmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgc29sb191cGRhdGVfbW9kZShzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYykKK3sKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fZW5jLT5zb2xvX2RldjsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmc29sb19lbmMtPmxvY2spOworCisJc29sb19lbmMtPmludGVybGFjZWQgPSAoc29sb19lbmMtPm1vZGUgJiAweDA4KSA/IDEgOiAwOworCXNvbG9fZW5jLT5id193ZWlnaHQgPSBtYXgoc29sb19kZXYtPmZwcyAvIHNvbG9fZW5jLT5pbnRlcnZhbCwgMSk7CisKKwlzd2l0Y2ggKHNvbG9fZW5jLT5tb2RlKSB7CisJY2FzZSBTT0xPX0VOQ19NT0RFX0NJRjoKKwkJc29sb19lbmMtPndpZHRoID0gc29sb19kZXYtPnZpZGVvX2hzaXplID4+IDE7CisJCXNvbG9fZW5jLT5oZWlnaHQgPSBzb2xvX2Rldi0+dmlkZW9fdnNpemU7CisJCWJyZWFrOworCWNhc2UgU09MT19FTkNfTU9ERV9EMToKKwkJc29sb19lbmMtPndpZHRoID0gc29sb19kZXYtPnZpZGVvX2hzaXplOworCQlzb2xvX2VuYy0+aGVpZ2h0ID0gc29sb19kZXYtPnZpZGVvX3ZzaXplIDw8IDE7CisJCXNvbG9fZW5jLT5id193ZWlnaHQgPDw9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgIm1vZGUgaXMgdW5rbm93biIpOworCX0KK30KKworLyogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIHNvbG9fZW5jLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgc29sb19lbmNfb24oc3RydWN0IHNvbG9fZW5jX2ZoICpmaCkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJdTggY2ggPSBzb2xvX2VuYy0+Y2g7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisJdTggaW50ZXJ2YWw7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJnNvbG9fZW5jLT5sb2NrKTsKKworCWlmIChmaC0+ZW5jX29uKQorCQlyZXR1cm4gMDsKKworCXNvbG9fdXBkYXRlX21vZGUoc29sb19lbmMpOworCisJLyogTWFrZSBzdXJlIHRvIGJ3IGNoZWNrIG9uIGZpcnN0IHJlYWRlciAqLworCWlmICghYXRvbWljX3JlYWQoJnNvbG9fZW5jLT5yZWFkZXJzKSkgeworCQlpZiAoc29sb19lbmMtPmJ3X3dlaWdodCA+IHNvbG9fZGV2LT5lbmNfYndfcmVtYWluKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJZWxzZQorCQkJc29sb19kZXYtPmVuY19id19yZW1haW4gLT0gc29sb19lbmMtPmJ3X3dlaWdodDsKKwl9CisKKwlmaC0+a3RocmVhZCA9IGt0aHJlYWRfcnVuKHNvbG9fZW5jX3RocmVhZCwgZmgsIFNPTE82MDEwX05BTUUgIl9lbmMiKTsKKworCWlmIChJU19FUlIoZmgtPmt0aHJlYWQpKQorCQlyZXR1cm4gUFRSX0VSUihmaC0+a3RocmVhZCk7CisKKwlmaC0+ZW5jX29uID0gMTsKKwlmaC0+cmRfaWR4ID0gc29sb19lbmMtPnNvbG9fZGV2LT5lbmNfd3JfaWR4OworCisJaWYgKGZoLT50eXBlID09IFNPTE9fRU5DX1RZUEVfRVhUKQorCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19DQVBfQ0hfQ09NUF9FTkFfRShjaCksIDEpOworCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzb2xvX2VuYy0+cmVhZGVycykgPiAxKQorCQlyZXR1cm4gMDsKKworCS8qIERpc2FibGUgYWxsIGVuY29kaW5nIGZvciB0aGlzIGNoYW5uZWwgKi8KKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19DQVBfQ0hfU0NBTEUoY2gpLCAwKTsKKworCS8qIENvbW1vbiBmb3IgYm90aCBzdGQgYW5kIGV4dCBlbmNvZGluZyAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NIX0lOVEwoY2gpLAorCQkgICAgICAgc29sb19lbmMtPmludGVybGFjZWQgPyAxIDogMCk7CisKKwlpZiAoc29sb19lbmMtPmludGVybGFjZWQpCisJCWludGVydmFsID0gc29sb19lbmMtPmludGVydmFsIC0gMTsKKwllbHNlCisJCWludGVydmFsID0gc29sb19lbmMtPmludGVydmFsOworCisJLyogU3RhbmRhcmQgZW5jb2Rpbmcgb25seSAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NIX0dPUChjaCksIHNvbG9fZW5jLT5nb3ApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NIX1FQKGNoKSwgc29sb19lbmMtPnFwKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19DQVBfQ0hfSU5UVihjaCksIGludGVydmFsKTsKKworCS8qIEV4dGVuZGVkIGVuY29kaW5nIG9ubHkgKi8KKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9DSF9HT1BfRShjaCksIHNvbG9fZW5jLT5nb3ApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NIX1FQX0UoY2gpLCBzb2xvX2VuYy0+cXApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0NBUF9DSF9JTlRWX0UoY2gpLCBpbnRlcnZhbCk7CisKKwkvKiBFbmFibGVzIHRoZSBzdGFuZGFyZCBlbmNvZGVyICovCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX1NDQUxFKGNoKSwgc29sb19lbmMtPm1vZGUpOworCisJLyogU2V0dGxlIGRvd24gQmVhdmlzLi4uICovCisJbWRlbGF5KDEwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb2xvX2VuY19vZmYoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisKKwlpZiAoIWZoLT5lbmNfb24pCisJCXJldHVybjsKKworCWlmIChmaC0+a3RocmVhZCkgeworCQlrdGhyZWFkX3N0b3AoZmgtPmt0aHJlYWQpOworCQlmaC0+a3RocmVhZCA9IE5VTEw7CisJfQorCisJc29sb19kZXYtPmVuY19id19yZW1haW4gKz0gc29sb19lbmMtPmJ3X3dlaWdodDsKKwlmaC0+ZW5jX29uID0gMDsKKworCWlmIChhdG9taWNfZGVjX3JldHVybigmc29sb19lbmMtPnJlYWRlcnMpID4gMCkKKwkJcmV0dXJuOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX1NDQUxFKHNvbG9fZW5jLT5jaCksIDApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0NBUF9DSF9DT01QX0VOQV9FKHNvbG9fZW5jLT5jaCksIDApOworfQorCitzdGF0aWMgdm9pZCBlbmNfcmVzZXRfZ29wKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBjaCkKK3sKKwlCVUdfT04oY2ggPj0gc29sb19kZXYtPm5yX2NoYW5zKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9DSF9HT1AoY2gpLCAxKTsKKwlzb2xvX2Rldi0+djRsMl9lbmNbY2hdLT5yZXNldF9nb3AgPSAxOworfQorCitzdGF0aWMgaW50IGVuY19nb3BfcmVzZXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLCB1OCB2b3ApCit7CisJQlVHX09OKGNoID49IHNvbG9fZGV2LT5ucl9jaGFucyk7CisJaWYgKCFzb2xvX2Rldi0+djRsMl9lbmNbY2hdLT5yZXNldF9nb3ApCisJCXJldHVybiAwOworCWlmICh2b3ApCisJCXJldHVybiAxOworCXNvbG9fZGV2LT52NGwyX2VuY1tjaF0tPnJlc2V0X2dvcCA9IDA7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfQ0hfR09QKGNoKSwKKwkJICAgICAgIHNvbG9fZGV2LT52NGwyX2VuY1tjaF0tPmdvcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jX2dldF9tcGVnX2RtYV90KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBkbWFfYWRkcl90IGJ1ZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBzaXplKQoreworCWludCByZXQ7CisKKwlpZiAob2ZmID4gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob2ZmICsgc2l6ZSA8PSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKQorCQlyZXR1cm4gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAwLCBidWYsCisJCQkJICAgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwgc2l6ZSk7CisKKwkvKiBCdWZmZXIgd3JhcCAqLworCXJldCA9IHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwgMCwgYnVmLAorCQkJICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCisJCQkgICAgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CisKKwlyZXQgfD0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAwLAorCQkJICAgICAgYnVmICsgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZiwKKwkJCSAgICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldiksCisJCQkgICAgICBzaXplICsgb2ZmIC0gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuY19nZXRfbXBlZ19kbWEoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJZG1hX2FkZHJfdCBkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHNvbG9fZGV2LT5wZGV2LCBidWYsIHNpemUsCisJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hX3Qoc29sb19kZXYsIGRtYV9hZGRyLCBvZmYsIHNpemUpOworCXBjaV91bm1hcF9zaW5nbGUoc29sb19kZXYtPnBkZXYsIGRtYV9hZGRyLCBzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmNfZ2V0X2pwZWdfZG1hKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBkbWFfYWRkcl90IGJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKG9mZiA+IFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9mZiArIHNpemUgPD0gU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSkKKwkJcmV0dXJuIHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgMCwgYnVmLAorCQkJCSAgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgKyBvZmYsIHNpemUpOworCisJLyogQnVmZmVyIHdyYXAgKi8KKwlyZXQgPSBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsIDAsIGJ1ZiwKKwkJCSAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKKwkJCSAgICAgU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CisKKwlyZXQgfD0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9KUEVHLCAwLAorCQkJICAgICAgYnVmICsgU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZiwKKwkJCSAgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldiksCisJCQkgICAgICBzaXplICsgb2ZmIC0gU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNvbG9fZmlsbF9qcGVnKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsIHN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYsCisJCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLCBkbWFfYWRkcl90IHZidWYpCit7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCXU4ICpwID0gdmlkZW9idWZfcXVldWVfdG9fdmFkZHIoJmZoLT52aWRxLCB2Yik7CisKKwltZW1jcHkocCwganBlZ19oZWFkZXIsIHNpemVvZihqcGVnX2hlYWRlcikpOworCXBbU09GMF9TVEFSVCArIDVdID0gMHhmZiAmIChzb2xvX2VuYy0+aGVpZ2h0ID4+IDgpOworCXBbU09GMF9TVEFSVCArIDZdID0gMHhmZiAmIHNvbG9fZW5jLT5oZWlnaHQ7CisJcFtTT0YwX1NUQVJUICsgN10gPSAweGZmICYgKHNvbG9fZW5jLT53aWR0aCA+PiA4KTsKKwlwW1NPRjBfU1RBUlQgKyA4XSA9IDB4ZmYgJiBzb2xvX2VuYy0+d2lkdGg7CisKKwl2YnVmICs9IHNpemVvZihqcGVnX2hlYWRlcik7CisJdmItPnNpemUgPSBlbmNfYnVmLT5qcGVnX3NpemUgKyBzaXplb2YoanBlZ19oZWFkZXIpOworCisJcmV0dXJuIGVuY19nZXRfanBlZ19kbWEoc29sb19kZXYsIHZidWYsIGVuY19idWYtPmpwZWdfb2ZmLAorCQkJCWVuY19idWYtPmpwZWdfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19maWxsX21wZWcoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCwgc3RydWN0IHNvbG9fZW5jX2J1ZiAqZW5jX2J1ZiwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsIGRtYV9hZGRyX3QgdmJ1ZikKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisJc3RydWN0IHZvcF9oZWFkZXIgdmg7CisJaW50IHJldDsKKwlpbnQgZnJhbWVfc2l6ZSwgZnJhbWVfb2ZmOworCisJaWYgKFdBUk5fT05fT05DRShlbmNfYnVmLT5zaXplIDw9IHNpemVvZih2aCkpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaXJzdCBnZXQgdGhlIGhhcmR3YXJlIHZvcCBoZWFkZXIgKG5vdCByZWFsIG1wZWcpICovCisJcmV0ID0gZW5jX2dldF9tcGVnX2RtYShzb2xvX2RldiwgJnZoLCBlbmNfYnVmLT5vZmYsIHNpemVvZih2aCkpOworCWlmIChyZXQpCisJCXJldHVybiAtMTsKKworCWlmIChXQVJOX09OX09OQ0Uodmguc2l6ZSA+IGVuY19idWYtPnNpemUpKQorCQlyZXR1cm4gLTE7CisKKwl2Yi0+d2lkdGggPSB2aC5oc2l6ZSA8PCA0OworCXZiLT5oZWlnaHQgPSB2aC52c2l6ZSA8PCA0OworCXZiLT5zaXplID0gdmguc2l6ZTsKKworCS8qIElmIHRoaXMgaXMgYSBrZXkgZnJhbWUsIGFkZCBleHRyYSBtNHYgaGVhZGVyICovCisJaWYgKCFlbmNfYnVmLT52b3ApIHsKKwkJdTE2IGZwcyA9IHNvbG9fZGV2LT5mcHMgKiAxMDAwOworCQl1MTYgaW50ZXJ2YWwgPSBzb2xvX2VuYy0+aW50ZXJ2YWwgKiAxMDAwOworCQl1OCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOworCisJCW1lbWNweShwLCB2aWRfdm9wX2hlYWRlciwgc2l6ZW9mKHZpZF92b3BfaGVhZGVyKSk7CisKKwkJaWYgKHNvbG9fZGV2LT52aWRlb190eXBlID09IFNPTE9fVk9fRk1UX1RZUEVfTlRTQykKKwkJCXBbMTBdIHw9ICgoWFZJRF9QQVJfNDNfTlRTQyA8PCAzKSAmIDB4NzgpOworCQllbHNlCisJCQlwWzEwXSB8PSAoKFhWSURfUEFSXzQzX1BBTCA8PCAzKSAmIDB4NzgpOworCisJCS8qIEZyYW1lIHJhdGUgYW5kIGludGVydmFsICovCisJCXBbMjJdID0gZnBzID4+IDQ7CisJCXBbMjNdID0gKChmcHMgPDwgNCkgJiAweGYwKSB8IDB4MGMgfCAoKGludGVydmFsID4+IDEzKSAmIDB4Myk7CisJCXBbMjRdID0gKGludGVydmFsID4+IDUpICYgMHhmZjsKKwkJcFsyNV0gPSAoKGludGVydmFsIDw8IDMpICYgMHhmOCkgfCAweDA0OworCisJCS8qIFdpZHRoIGFuZCBoZWlnaHQgKi8KKwkJcFsyNl0gPSAodmItPndpZHRoID4+IDMpICYgMHhmZjsKKwkJcFsyN10gPSAoKHZiLT5oZWlnaHQgPj4gOSkgJiAweDBmKSB8IDB4MTA7CisJCXBbMjhdID0gKHZiLT5oZWlnaHQgPj4gMSkgJiAweGZmOworCisJCS8qIEludGVybGFjZSAqLworCQlpZiAodmguaW50ZXJsYWNlKQorCQkJcFsyOV0gfD0gMHgyMDsKKworCQkvKiBBZGp1c3QgdGhlIGRtYSBidWZmZXIgcGFzdCB0aGlzIGhlYWRlciAqLworCQl2Yi0+c2l6ZSArPSBzaXplb2YodmlkX3ZvcF9oZWFkZXIpOworCQl2YnVmICs9IHNpemVvZih2aWRfdm9wX2hlYWRlcik7CisJfQorCisJLyogTm93IGdldCB0aGUgYWN0dWFsIG1wZWcgcGF5bG9hZCAqLworCWZyYW1lX29mZiA9IChlbmNfYnVmLT5vZmYgKyBzaXplb2YodmgpKSAlIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2Rldik7CisJZnJhbWVfc2l6ZSA9IGVuY19idWYtPnNpemUgLSBzaXplb2YodmgpOworCXJldCA9IGVuY19nZXRfbXBlZ19kbWFfdChzb2xvX2RldiwgdmJ1ZiwgZnJhbWVfb2ZmLCBmcmFtZV9zaXplKTsKKwlpZiAoV0FSTl9PTl9PTkNFKHJldCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisvKiBPbiBzdWNjZXNzZnVsIHJldHVybiAoMCksIGxlYXZlcyBzb2xvX2VuYy0+bG9jayB1bmxvY2tlZCAqLworc3RhdGljIGludCBzb2xvX2VuY19maWxsYnVmKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsCisJCQkgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCXN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYgPSBOVUxMOworCWRtYV9hZGRyX3QgdmJ1ZjsKKwlpbnQgcmV0OworCXUxNiBpZHggPSBmaC0+cmRfaWR4OworCisJd2hpbGUgKGlkeCAhPSBzb2xvX2Rldi0+ZW5jX3dyX2lkeCkgeworCQlzdHJ1Y3Qgc29sb19lbmNfYnVmICplYnVmID0gJnNvbG9fZGV2LT5lbmNfYnVmW2lkeF07CisJCWlkeCA9IChpZHggKyAxKSAlIFNPTE9fTlJfUklOR19CVUZTOworCQlpZiAoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTVBFRykgeworCQkJaWYgKGZoLT50eXBlICE9IGVidWYtPnR5cGUpCisJCQkJY29udGludWU7CisJCQlpZiAoZWJ1Zi0+Y2ggPT0gc29sb19lbmMtPmNoKSB7CisJCQkJZW5jX2J1ZiA9IGVidWY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoZWJ1Zi0+Y2ggPT0gc29sb19lbmMtPmNoKSB7CisJCQkvKiBGb3IgbWpwZWcsIGtlZXAgcmVhZGluZyB0byB0aGUgbmV3ZXN0IGZyYW1lICovCisJCQllbmNfYnVmID0gZWJ1ZjsKKwkJfQorCX0KKworCWZoLT5yZF9pZHggPSBpZHg7CisKKwlpZiAoIWVuY19idWYpCisJCXJldHVybiAtMTsKKworCWlmICgoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTVBFRyAmJgorCSAgICAgdmItPmJzaXplIDwgZW5jX2J1Zi0+c2l6ZSkgfHwKKwkgICAgKGZoLT5mbXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHICYmCisJICAgICB2Yi0+YnNpemUgPCAoZW5jX2J1Zi0+anBlZ19zaXplICsgc2l6ZW9mKGpwZWdfaGVhZGVyKSkpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoISh2YnVmID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YikpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBJcyBpdCBvayB0aGF0IHdlIG1lc3Mgd2l0aCB0aGlzIGJ1ZmZlciBvdXQgb2YgbG9jaz8gKi8KKwlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCisJaWYgKGZoLT5mbXQgPT0gVjRMMl9QSVhfRk1UX01QRUcpCisJCXJldCA9IHNvbG9fZmlsbF9tcGVnKGZoLCBlbmNfYnVmLCB2YiwgdmJ1Zik7CisJZWxzZQorCQlyZXQgPSBzb2xvX2ZpbGxfanBlZyhmaCwgZW5jX2J1ZiwgdmIsIHZidWYpOworCisJaWYgKHJldCkgLy8gSWdub3JlIGZhaWx1cmVzCisJCXJldHVybiAwOworCisJbGlzdF9kZWwoJnZiLT5xdWV1ZSk7CisJdmItPmZpZWxkX2NvdW50Kys7CisJdmItPnRzID0gZW5jX2J1Zi0+dHM7CisJdmItPnN0YXRlID0gVklERU9CVUZfRE9ORTsKKworCXdha2VfdXAoJnZiLT5kb25lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb2xvX2VuY190aHJlYWRfdHJ5KHN0cnVjdCBzb2xvX2VuY19maCAqZmgpCit7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOworCisJZm9yICg7OykgeworCQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKKworCQlpZiAobGlzdF9lbXB0eSgmZmgtPnZpZHFfYWN0aXZlKSkKKwkJCWJyZWFrOworCisJCXZiID0gbGlzdF9maXJzdF9lbnRyeSgmZmgtPnZpZHFfYWN0aXZlLAorCQkJCSAgICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsIHF1ZXVlKTsKKworCQlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJnZiLT5kb25lKSkKKwkJCWJyZWFrOworCisJCS8qIE9uIHN1Y2Nlc3MsIHJldHVybnMgd2l0aCBzb2xvX2VuYy0+bG9jayB1bmxvY2tlZCAqLworCQlpZiAoc29sb19lbmNfZmlsbGJ1ZihmaCwgdmIpKQorCQkJYnJlYWs7CisJfQorCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZzb2xvX2VuYy0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKK30KKworc3RhdGljIGludCBzb2xvX2VuY190aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gZGF0YTsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlzZXRfZnJlZXphYmxlKCk7CisJYWRkX3dhaXRfcXVldWUoJnNvbG9fZW5jLT50aHJlYWRfd2FpdCwgJndhaXQpOworCisJZm9yICg7OykgeworCQlsb25nIHRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSFopOworCQlpZiAodGltZW91dCA9PSAtRVJFU1RBUlRTWVMgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisJCXNvbG9fZW5jX3RocmVhZF90cnkoZmgpOworCQl0cnlfdG9fZnJlZXplKCk7CisJfQorCisJcmVtb3ZlX3dhaXRfcXVldWUoJnNvbG9fZW5jLT50aHJlYWRfd2FpdCwgJndhaXQpOworCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHNvbG9fbW90aW9uX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKK3sKKwl1MzIgc3RhdHVzOworCWludCBpOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsIFNPTE9fSVJRX01PVElPTik7CisKKwlzdGF0dXMgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LCBTT0xPX1ZJX01PVF9TVEFUVVMpOworCisJZm9yIChpID0gMDsgaSA8IHNvbG9fZGV2LT5ucl9jaGFuczsgaSsrKSB7CisJCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gc29sb19kZXYtPnY0bDJfZW5jW2ldOworCisJCUJVR19PTihzb2xvX2VuYyA9PSBOVUxMKTsKKworCQlpZiAoc29sb19lbmMtPm1vdGlvbl9kZXRlY3RlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShzdGF0dXMgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKworCQlzb2xvX2VuYy0+bW90aW9uX2RldGVjdGVkID0gMTsKKwl9Cit9CisKK3ZvaWQgc29sb19lbmNfdjRsMl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc3RydWN0IHNvbG9fZW5jX2J1ZiAqZW5jX2J1ZjsKKwlzdHJ1Y3QgdmlkZW5jX3N0YXR1cyB2c3RhdHVzOworCXUzMiBtcGVnX2N1cnJlbnQsIG1wZWdfbmV4dCwgbXBlZ19zaXplOworCXUzMiBqcGVnX2N1cnJlbnQsIGpwZWdfbmV4dCwganBlZ19zaXplOworCXUzMiByZWdfbXBlZ19zaXplOworCXU4IGN1cl9xLCB2b3BfdHlwZTsKKwl1OCBjaDsKKwllbnVtIHNvbG9fZW5jX3R5cGVzIGVuY190eXBlOworCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsIFNPTE9fSVJRX0VOQ09ERVIpOworCisJdnN0YXR1cy5zdGF0dXMxMSA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fVkVfU1RBVEUoMTEpKTsKKwljdXJfcSA9ICh2c3RhdHVzLnN0YXR1czExX3N0Lmxhc3RfcXVldWUgKyAxKSAlIE1QNF9RUzsKKworCXZzdGF0dXMuc3RhdHVzMCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fVkVfU1RBVEUoMCkpOworCXJlZ19tcGVnX3NpemUgPSAodnN0YXR1cy5zdGF0dXMwX3N0Lm1wNF9lbmNfY29kZV9zaXplICsgNjQgKyAzMikgJgorCQkJKH4zMSk7CisKKwl3aGlsZSAoc29sb19kZXYtPmVuY19pZHggIT0gY3VyX3EpIHsKKwkJbXBlZ19jdXJyZW50ID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwKKwkJCQkJU09MT19WRV9NUEVHNF9RVUUoc29sb19kZXYtPmVuY19pZHgpKTsKKwkJanBlZ19jdXJyZW50ID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwKKwkJCQkJU09MT19WRV9KUEVHX1FVRShzb2xvX2Rldi0+ZW5jX2lkeCkpOworCQlzb2xvX2Rldi0+ZW5jX2lkeCA9IChzb2xvX2Rldi0+ZW5jX2lkeCArIDEpICUgTVA0X1FTOworCQltcGVnX25leHQgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LAorCQkJCQlTT0xPX1ZFX01QRUc0X1FVRShzb2xvX2Rldi0+ZW5jX2lkeCkpOworCQlqcGVnX25leHQgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LAorCQkJCQlTT0xPX1ZFX0pQRUdfUVVFKHNvbG9fZGV2LT5lbmNfaWR4KSk7CisKKwkJaWYgKChjaCA9IChtcGVnX2N1cnJlbnQgPj4gMjQpICYgMHgxZikgPj0gU09MT19NQVhfQ0hBTk5FTFMpIHsKKwkJCWNoIC09IFNPTE9fTUFYX0NIQU5ORUxTOworCQkJZW5jX3R5cGUgPSBTT0xPX0VOQ19UWVBFX0VYVDsKKwkJfSBlbHNlCisJCQllbmNfdHlwZSA9IFNPTE9fRU5DX1RZUEVfU1REOworCisJCXZvcF90eXBlID0gKG1wZWdfY3VycmVudCA+PiAyOSkgJiAzOworCisJCW1wZWdfY3VycmVudCAmPSAweDAwZmZmZmZmOworCQltcGVnX25leHQgICAgJj0gMHgwMGZmZmZmZjsKKwkJanBlZ19jdXJyZW50ICY9IDB4MDBmZmZmZmY7CisJCWpwZWdfbmV4dCAgICAmPSAweDAwZmZmZmZmOworCisJCW1wZWdfc2l6ZSA9IChTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpICsKKwkJCSAgICAgbXBlZ19uZXh0IC0gbXBlZ19jdXJyZW50KSAlCisJCQkgICAgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KTsKKworCQlqcGVnX3NpemUgPSAoU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSArCisJCQkgICAgIGpwZWdfbmV4dCAtIGpwZWdfY3VycmVudCkgJQorCQkJICAgIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2Rldik7CisKKwkJLyogWFhYIEkgdGhpbmsgdGhpcyBtZWFucyB3ZSBoYWQgYSByaW5nIG92ZXJmbG93PyAqLworCQlpZiAobXBlZ19jdXJyZW50ID4gbXBlZ19uZXh0ICYmIG1wZWdfc2l6ZSAhPSByZWdfbXBlZ19zaXplKSB7CisJCQllbmNfcmVzZXRfZ29wKHNvbG9fZGV2LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFdoZW4gcmVzZXR0aW5nIHRoZSBHT1AsIHNraXAgZnJhbWVzIHVudGlsIEktZnJhbWUgKi8KKwkJaWYgKGVuY19nb3BfcmVzZXQoc29sb19kZXYsIGNoLCB2b3BfdHlwZSkpCisJCQljb250aW51ZTsKKworCQllbmNfYnVmID0gJnNvbG9fZGV2LT5lbmNfYnVmW3NvbG9fZGV2LT5lbmNfd3JfaWR4XTsKKworCQllbmNfYnVmLT52b3AgPSB2b3BfdHlwZTsKKwkJZW5jX2J1Zi0+Y2ggPSBjaDsKKwkJZW5jX2J1Zi0+b2ZmID0gbXBlZ19jdXJyZW50OworCQllbmNfYnVmLT5zaXplID0gbXBlZ19zaXplOworCQllbmNfYnVmLT5qcGVnX29mZiA9IGpwZWdfY3VycmVudDsKKwkJZW5jX2J1Zi0+anBlZ19zaXplID0ganBlZ19zaXplOworCQllbmNfYnVmLT50eXBlID0gZW5jX3R5cGU7CisKKwkJZG9fZ2V0dGltZW9mZGF5KCZlbmNfYnVmLT50cyk7CisKKwkJc29sb19kZXYtPmVuY193cl9pZHggPSAoc29sb19kZXYtPmVuY193cl9pZHggKyAxKSAlCisJCQkJCVNPTE9fTlJfUklOR19CVUZTOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29sb19kZXYtPnY0bDJfZW5jW2NoXS0+dGhyZWFkX3dhaXQpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19idWZfc2V0dXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpjb3VudCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKyAgICAgICAgKnNpemUgPSBGUkFNRV9CVUZfU0laRTsKKworICAgICAgICBpZiAoKmNvdW50IDwgTUlOX1ZJRF9CVUZGRVJTKQorCQkqY291bnQgPSBNSU5fVklEX0JVRkZFUlM7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbmNfYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCQllbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCisJdmItPnNpemUgPSBGUkFNRV9CVUZfU0laRTsKKwlpZiAodmItPmJhZGRyICE9IDAgJiYgdmItPmJzaXplIDwgdmItPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlc2UgcHJvcGVydGllcyBvbmx5IGNoYW5nZSB3aGVuIHF1ZXVlIGlzIGlkbGUgKi8KKwl2Yi0+d2lkdGggPSBzb2xvX2VuYy0+d2lkdGg7CisJdmItPmhlaWdodCA9IHNvbG9fZW5jLT5oZWlnaHQ7CisJdmItPmZpZWxkICA9IGZpZWxkOworCisJaWYgKHZiLT5zdGF0ZSA9PSBWSURFT0JVRl9ORUVEU19JTklUKSB7CisJCWludCByYyA9IHZpZGVvYnVmX2lvbG9jayh2cSwgdmIsIE5VTEwpOworCQlpZiAocmMgPCAwKSB7CisJCQl2aWRlb2J1Zl9kbWFfY29udGlnX2ZyZWUodnEsIHZiKTsKKwkJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJdmItPnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29sb19lbmNfYnVmX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCisJCQkgICAgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7CisKKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CisJbGlzdF9hZGRfdGFpbCgmdmItPnF1ZXVlLCAmZmgtPnZpZHFfYWN0aXZlKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZoLT5lbmMtPnRocmVhZF93YWl0KTsKK30KKworc3RhdGljIHZvaWQgc29sb19lbmNfYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgc29sb19lbmNfdmlkZW9fcW9wcyA9IHsKKwkuYnVmX3NldHVwCT0gc29sb19lbmNfYnVmX3NldHVwLAorCS5idWZfcHJlcGFyZQk9IHNvbG9fZW5jX2J1Zl9wcmVwYXJlLAorCS5idWZfcXVldWUJPSBzb2xvX2VuY19idWZfcXVldWUsCisJLmJ1Zl9yZWxlYXNlCT0gc29sb19lbmNfYnVmX3JlbGVhc2UsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHNvbG9fZW5jX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZmgtPnZpZHEsIHdhaXQpOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIoJmZoLT52aWRxLCB2bWEpOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBzb2xvX2VuY19maCAqZmg7CisKKwlpZiAoKGZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisKKwlmaC0+ZW5jID0gc29sb19lbmM7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisJSU5JVF9MSVNUX0hFQUQoJmZoLT52aWRxX2FjdGl2ZSk7CisJZmgtPmZtdCA9IFY0TDJfUElYX0ZNVF9NUEVHOworCWZoLT50eXBlID0gU09MT19FTkNfVFlQRV9TVEQ7CisKKwl2aWRlb2J1Zl9xdWV1ZV9kbWFfY29udGlnX2luaXQoJmZoLT52aWRxLCAmc29sb19lbmNfdmlkZW9fcW9wcywKKwkJCQkgICAgJnNvbG9fZW5jLT5zb2xvX2Rldi0+cGRldi0+ZGV2LAorCQkJCSAgICAmc29sb19lbmMtPmxvY2ssCisJCQkJICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKwkJCQkgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciksIGZoKTsKKworCXNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc29sb19lbmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCisJLyogTWFrZSBzdXJlIHRoZSBlbmNvZGVyIGlzIG9uICovCisJaWYgKCFmaC0+ZW5jX29uKSB7CisJCWludCByZXQ7CisKKwkJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisJCXJldCA9IHNvbG9fZW5jX29uKGZoKTsKKwkgICAgICAgIHNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiB2aWRlb2J1Zl9yZWFkX3N0cmVhbSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLCAwLAorCQkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbmNfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJdmlkZW9idWZfc3RvcCgmZmgtPnZpZHEpOworCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOworCXNvbG9fZW5jX29mZihmaCk7CisJa2ZyZWUoZmgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbmNfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCisJc3RyY3B5KGNhcC0+ZHJpdmVyLCBTT0xPNjAxMF9OQU1FKTsKKwlzbnByaW50ZihjYXAtPmNhcmQsIHNpemVvZihjYXAtPmNhcmQpLCAiU29mdGxvZ2ljIDYwMTAgRW5jICVkIiwKKwkJIHNvbG9fZW5jLT5jaCk7CisJc25wcmludGYoY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pLCAiUENJICVzIiwKKwkJIHBjaV9uYW1lKHNvbG9fZGV2LT5wZGV2KSk7CisJY2FwLT52ZXJzaW9uID0gU09MTzYwMTBfVkVSX05VTTsKKwljYXAtPmNhcGFiaWxpdGllcyA9ICAgICBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCQlWNEwyX0NBUF9SRUFEV1JJVEUgfAorCQkJCVY0TDJfQ0FQX1NUUkVBTUlORzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisKKwlpZiAoaW5wdXQtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNucHJpbnRmKGlucHV0LT5uYW1lLCBzaXplb2YoaW5wdXQtPm5hbWUpLCAiRW5jb2RlciAlZCIsCisJCSBzb2xvX2VuYy0+Y2ggKyAxKTsKKwlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisKKwlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKQorCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOworCWVsc2UKKwkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOworCisJaWYgKCF0dzI4X2dldF92aWRlb19zdGF0dXMoc29sb19kZXYsIHNvbG9fZW5jLT5jaCkpCisJCWlucHV0LT5zdGF0dXMgPSBWNEwyX0lOX1NUX05PX1NJR05BTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX3NldF9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCWlmIChpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19nZXRfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKmluZGV4KQoreworCSppbmRleCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19lbnVtX2ZtdF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJc3dpdGNoIChmLT5pbmRleCkgeworCWNhc2UgMDoKKwkJZi0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJc3RyY3B5KGYtPmRlc2NyaXB0aW9uLCAiTVBFRy00IEFWQyIpOworCQlicmVhazsKKwljYXNlIDE6CisJCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX01KUEVHOworCQlzdHJjcHkoZi0+ZGVzY3JpcHRpb24sICJNSlBFRyIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmLT5mbGFncyA9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX3RyeV9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisKKwlpZiAocGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfTVBFRyAmJgorCSAgICBwaXgtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9NSlBFRykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBXZSBjYW5ub3QgY2hhbmdlIHdpZHRoL2hlaWdodCBpbiBtaWQgcmVhZCAqLworCWlmIChhdG9taWNfcmVhZCgmc29sb19lbmMtPnJlYWRlcnMpID4gMCkgeworCQlpZiAocGl4LT53aWR0aCAhPSBzb2xvX2VuYy0+d2lkdGggfHwKKwkJICAgIHBpeC0+aGVpZ2h0ICE9IHNvbG9fZW5jLT5oZWlnaHQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSBpZiAoIShwaXgtPndpZHRoID09IHNvbG9fZGV2LT52aWRlb19oc2l6ZSAmJgorCSAgICAgIHBpeC0+aGVpZ2h0ID09IHNvbG9fZGV2LT52aWRlb192c2l6ZSA8PCAxKSAmJgorCSAgICAhKHBpeC0+d2lkdGggPT0gc29sb19kZXYtPnZpZGVvX2hzaXplID4+IDEgJiYKKwkgICAgICBwaXgtPmhlaWdodCA9PSBzb2xvX2Rldi0+dmlkZW9fdnNpemUpKSB7CisJCS8qIERlZmF1bHQgdG8gQ0lGIDEvMiBzaXplICovCisJCXBpeC0+d2lkdGggPSBzb2xvX2Rldi0+dmlkZW9faHNpemUgPj4gMTsKKwkJcGl4LT5oZWlnaHQgPSBzb2xvX2Rldi0+dmlkZW9fdnNpemU7CisJfQorCisJaWYgKHBpeC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCisJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJZWxzZSBpZiAocGl4LT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpIHsKKwkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwl9CisKKwkvKiBKdXN0IHNldCB0aGVzZSAqLworCXBpeC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisJcGl4LT5zaXplaW1hZ2UgPSBGUkFNRV9CVUZfU0laRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX3NldF9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmc29sb19lbmMtPmxvY2spOworCisJaWYgKChyZXQgPSBzb2xvX2VuY190cnlfZm10X2NhcChmaWxlLCBwcml2LCBmKSkpIHsKKwkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocGl4LT53aWR0aCA9PSBzb2xvX2Rldi0+dmlkZW9faHNpemUpCisJCXNvbG9fZW5jLT5tb2RlID0gU09MT19FTkNfTU9ERV9EMTsKKwllbHNlCisJCXNvbG9fZW5jLT5tb2RlID0gU09MT19FTkNfTU9ERV9DSUY7CisKKwkvKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgZW5jb2RlciBhdCBhbGwgKi8KKwlmaC0+Zm10ID0gcGl4LT5waXhlbGZvcm1hdDsKKworCWlmIChwaXgtPnByaXYpCisJCWZoLT50eXBlID0gU09MT19FTkNfVFlQRV9FWFQ7CisJcmV0ID0gc29sb19lbmNfb24oZmgpOworCisJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbmNfZ2V0X2ZtdF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OworCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKworCXBpeC0+d2lkdGggPSBzb2xvX2VuYy0+d2lkdGg7CisJcGl4LT5oZWlnaHQgPSBzb2xvX2VuYy0+aGVpZ2h0OworCXBpeC0+cGl4ZWxmb3JtYXQgPSBmaC0+Zm10OworCXBpeC0+ZmllbGQgPSBzb2xvX2VuYy0+aW50ZXJsYWNlZCA/IFY0TDJfRklFTERfSU5URVJMQUNFRCA6CisJCSAgICAgVjRMMl9GSUVMRF9OT05FOworCXBpeC0+c2l6ZWltYWdlID0gRlJBTUVfQlVGX1NJWkU7CisJcGl4LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIAorCQkJICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZmgtPnZpZHEsIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbmNfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OworCisJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKCZmaC0+dmlkcSwgYnVmKTsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKworCXJldHVybiB2aWRlb2J1Zl9xYnVmKCZmaC0+dmlkcSwgYnVmKTsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCWludCByZXQ7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGVuY29kZXIgaXMgb24gKi8KKwlpZiAoIWZoLT5lbmNfb24pIHsKKwkJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisJCXJldCA9IHNvbG9fZW5jX29uKGZoKTsKKwkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdmlkZW9idWZfZHFidWYoJmZoLT52aWRxLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2lnbmFsIG1vdGlvbiBkZXRlY3Rpb24gKi8KKwlpZiAoc29sb19pc19tb3Rpb25fb24oc29sb19lbmMpKSB7CisJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NT1RJT05fT047CisJCWlmIChzb2xvX2VuYy0+bW90aW9uX2RldGVjdGVkKSB7CisJCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTU9USU9OX0RFVEVDVEVEOworCQkJc29sb19yZWdfd3JpdGUoc29sb19lbmMtPnNvbG9fZGV2LCBTT0xPX1ZJX01PVF9DTEVBUiwKKwkJCQkgICAgICAgMSA8PCBzb2xvX2VuYy0+Y2gpOworCQkJc29sb19lbmMtPm1vdGlvbl9kZXRlY3RlZCA9IDA7CisJCX0KKwl9CisKKwkvKiBDaGVjayBmb3Iga2V5IGZyYW1lIG9uIG1wZWcgZGF0YSAqLworCWlmIChmaC0+Zm10ID09IFY0TDJfUElYX0ZNVF9NUEVHKSB7CisJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiID0gZmgtPnZpZHEuYnVmc1tidWYtPmluZGV4XTsKKwkJdTggKnAgPSB2aWRlb2J1Zl9xdWV1ZV90b192YWRkcigmZmgtPnZpZHEsIHZiKTsKKwkJaWYgKHBbM10gPT0gMHgwMCkKKwkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKKwkJZWxzZQorCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1BGUkFNRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2VuY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisKKwlpZiAoaSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKCZmaC0+dmlkcSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbmNfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisKKwlpZiAoaSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZpZHEpOworfQorCitzdGF0aWMgaW50IHNvbG9fZW5jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSAqZnNpemUpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+ZW5jLT5zb2xvX2RldjsKKworCWlmIChmc2l6ZS0+cGl4ZWxfZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9NUEVHKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZnNpemUtPmluZGV4KSB7CisJY2FzZSAwOgorCQlmc2l6ZS0+ZGlzY3JldGUud2lkdGggPSBzb2xvX2Rldi0+dmlkZW9faHNpemUgPj4gMTsKKwkJZnNpemUtPmRpc2NyZXRlLmhlaWdodCA9IHNvbG9fZGV2LT52aWRlb192c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmc2l6ZS0+ZGlzY3JldGUud2lkdGggPSBzb2xvX2Rldi0+dmlkZW9faHNpemU7CisJCWZzaXplLT5kaXNjcmV0ZS5oZWlnaHQgPSBzb2xvX2Rldi0+dmlkZW9fdnNpemUgPDwgMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZnNpemUtPnR5cGUgPSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fZW51bV9mcmFtZWludGVydmFscyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICAgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmZpbnR2KQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gZmgtPmVuYy0+c29sb19kZXY7CisKKwlpZiAoZmludHYtPnBpeGVsX2Zvcm1hdCAhPSBWNEwyX1BJWF9GTVRfTVBFRyB8fCBmaW50di0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJZmludHYtPnR5cGUgPSBWNEwyX0ZSTUlWQUxfVFlQRV9TVEVQV0lTRTsKKworCWZpbnR2LT5zdGVwd2lzZS5taW4ubnVtZXJhdG9yID0gc29sb19kZXYtPmZwczsKKwlmaW50di0+c3RlcHdpc2UubWluLmRlbm9taW5hdG9yID0gMTsKKworCWZpbnR2LT5zdGVwd2lzZS5tYXgubnVtZXJhdG9yID0gc29sb19kZXYtPmZwczsKKwlmaW50di0+c3RlcHdpc2UubWF4LmRlbm9taW5hdG9yID0gMTU7CisKKwlmaW50di0+c3RlcHdpc2Uuc3RlcC5udW1lcmF0b3IgPSAxOworCWZpbnR2LT5zdGVwd2lzZS5zdGVwLmRlbm9taW5hdG9yID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fZ19wYXJtKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkgICAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqc3ApCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCXN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtICpjcCA9ICZzcC0+cGFybS5jYXB0dXJlOworCisJY3AtPmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJY3AtPnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBzb2xvX2VuYy0+aW50ZXJ2YWw7CisJY3AtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IHNvbG9fZGV2LT5mcHM7CisJY3AtPmNhcHR1cmVtb2RlID0gMDsKKwkvKiBYWFg6IFNob3VsZG4ndCB3ZSBiZSBhYmxlIHRvIGdldC9zZXQgdGhpcyBmcm9tIHZpZGVvYnVmPyAqLworCWNwLT5yZWFkYnVmZmVycyA9IDI7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpzcCkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gKmNwID0gJnNwLT5wYXJtLmNhcHR1cmU7CisKKwlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKKworCWlmIChhdG9taWNfcmVhZCgmc29sb19lbmMtPnJlYWRlcnMpID4gMCkgeworCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICgoY3AtPnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPT0gMCkgfHwKKwkgICAgKGNwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPT0gMCkpIHsKKwkJLyogcmVzZXQgZnJhbWVyYXRlICovCisJCWNwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gMTsKKwkJY3AtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IHNvbG9fZGV2LT5mcHM7CisJfQorCisJaWYgKGNwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgIT0gc29sb19kZXYtPmZwcykKKwkJY3AtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IHNvbG9fZGV2LT5mcHM7CisKKwlpZiAoY3AtPnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPiAxNSkKKwkJY3AtPnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxNTsKKworCXNvbG9fZW5jLT5pbnRlcnZhbCA9IGNwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yOworCisJY3AtPmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisKKwlzb2xvX2VuYy0+Z29wID0gbWF4KHNvbG9fZGV2LT5mcHMgLyBzb2xvX2VuYy0+aW50ZXJ2YWwsIDEpOworCXNvbG9fdXBkYXRlX21vZGUoc29sb19lbmMpOworCisJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CisKKwlxYy0+aWQgPSB2NGwyX2N0cmxfbmV4dChzb2xvX2N0cmxfY2xhc3NlcywgcWMtPmlkKTsKKwlpZiAoIXFjLT5pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHFjLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjLCAweDAwLCAweGZmLCAxLCAweDgwKTsKKwljYXNlIFY0TDJfQ0lEX1NIQVJQTkVTUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjLCAweDAwLCAweDBmLCAxLCAweDAwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbCgKKwkJCXFjLCBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAorCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNF9BVkMsIDEsCisJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180X0FWQyk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDEsIDI1NSwgMSwgc29sb19kZXYtPmZwcyk7CisjaWZkZWYgUFJJVkFURV9DSURTCisJY2FzZSBWNEwyX0NJRF9NT1RJT05fVEhSRVNIT0xEOgorCQlxYy0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSOworCQlxYy0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CisJCXFjLT5taW5pbXVtID0gMDsKKwkJcWMtPm1heGltdW0gPSAweGZmZmY7CisJCXFjLT5zdGVwID0gMTsKKwkJcWMtPmRlZmF1bHRfdmFsdWUgPSBTT0xPX0RFRl9NT1RfVEhSRVNIOworCQlzdHJsY3B5KHFjLT5uYW1lLCAiTW90aW9uIERldGVjdGlvbiBUaHJlc2hvbGQiLAorCQkJc2l6ZW9mKHFjLT5uYW1lKSk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfTU9USU9OX0VOQUJMRToKKwkJcWMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOOworCQlxYy0+bWluaW11bSA9IDA7CisJCXFjLT5tYXhpbXVtID0gcWMtPnN0ZXAgPSAxOworCQlxYy0+ZGVmYXVsdF92YWx1ZSA9IDA7CisJCXN0cmxjcHkocWMtPm5hbWUsICJNb3Rpb24gRGV0ZWN0aW9uIEVuYWJsZSIsIHNpemVvZihxYy0+bmFtZSkpOworCQlyZXR1cm4gMDsKKyNlbHNlCisJY2FzZSBWNEwyX0NJRF9NT1RJT05fVEhSRVNIT0xEOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDB4ZmZmZiwgMSwKKwkJCQkJICAgIFNPTE9fREVGX01PVF9USFJFU0gpOworCWNhc2UgVjRMMl9DSURfTU9USU9OX0VOQUJMRToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjLCAwLCAxLCAxLCAwKTsKKyNlbmRpZgorCWNhc2UgVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQ6CisJCXFjLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfU1RSSU5HOworCQlxYy0+bWluaW11bSA9IDA7CisJCXFjLT5tYXhpbXVtID0gT1NEX1RFWFRfTUFYOworCQlxYy0+c3RlcCA9IDE7CisJCXFjLT5kZWZhdWx0X3ZhbHVlID0gMDsKKwkJc3RybGNweShxYy0+bmFtZSwgIk9TRCBUZXh0Iiwgc2l6ZW9mKHFjLT5uYW1lKSk7CisJCXJldHVybiAwOworCX0KKworICAgICAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzb2xvX3F1ZXJ5bWVudShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgc3RydWN0IHY0bDJfcXVlcnltZW51ICpxbWVudSkKK3sKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcWN0cmw7CisJaW50IGVycjsKKworCXFjdHJsLmlkID0gcW1lbnUtPmlkOworCWlmICgoZXJyID0gc29sb19xdWVyeWN0cmwoZmlsZSwgcHJpdiwgJnFjdHJsKSkpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X21lbnUocW1lbnUsICZxY3RybCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCSAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OworCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fZW5jLT5zb2xvX2RldjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCXJldHVybiB0dzI4X2dldF9jdHJsX3ZhbChzb2xvX2RldiwgY3RybC0+aWQsIHNvbG9fZW5jLT5jaCwKKwkJCQkJICZjdHJsLT52YWx1ZSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzRfQVZDOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJCWN0cmwtPnZhbHVlID0gc29sb19lbmMtPmdvcDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NT1RJT05fVEhSRVNIT0xEOgorCQljdHJsLT52YWx1ZSA9IHNvbG9fZW5jLT5tb3Rpb25fdGhyZXNoOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01PVElPTl9FTkFCTEU6CisJCWN0cmwtPnZhbHVlID0gc29sb19pc19tb3Rpb25fb24oc29sb19lbmMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHNvbG9fZW5jX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwljYXNlIFY0TDJfQ0lEX1NIQVJQTkVTUzoKKwkJcmV0dXJuIHR3Mjhfc2V0X2N0cmxfdmFsKHNvbG9fZGV2LCBjdHJsLT5pZCwgc29sb19lbmMtPmNoLAorCQkJCQkgY3RybC0+dmFsdWUpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJaWYgKGN0cmwtPnZhbHVlICE9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzRfQVZDKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMSB8fCBjdHJsLT52YWx1ZSA+IDI1NSkKKwkJCXJldHVybiAtRVJBTkdFOworCQlzb2xvX2VuYy0+Z29wID0gY3RybC0+dmFsdWU7CisJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX0NIX0dPUChzb2xvX2VuYy0+Y2gpLAorCQkJICAgICAgIHNvbG9fZW5jLT5nb3ApOworCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9DSF9HT1BfRShzb2xvX2VuYy0+Y2gpLAorCQkJICAgICAgIHNvbG9fZW5jLT5nb3ApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01PVElPTl9USFJFU0hPTEQ6CisJCS8qIFRPRE8gYWNjZXB0IHZhbHVlIG9uIGxvd2VyIDE2LWJpdHMgYW5kIHVzZSBoaWdoCisJCSAqIDE2LWJpdHMgdG8gYXNzaWduIHRoZSB2YWx1ZSB0byBhIHNwZWNpZmljIGJsb2NrICovCisJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiAweGZmZmYpCisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJc29sb19lbmMtPm1vdGlvbl90aHJlc2ggPSBjdHJsLT52YWx1ZTsKKwkJc29sb19zZXRfbW90aW9uX3RocmVzaG9sZChzb2xvX2Rldiwgc29sb19lbmMtPmNoLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTU9USU9OX0VOQUJMRToKKwkJc29sb19tb3Rpb25fdG9nZ2xlKHNvbG9fZW5jLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fc19leHRfY3RybHMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscykKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3RybHMtPmNvdW50OyBpKyspIHsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwgPSAoY3RybHMtPmNvbnRyb2xzICsgaSk7CisJCWludCBlcnI7CisKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX1JEU19UWF9SQURJT19URVhUOgorCQkJaWYgKGN0cmwtPnNpemUgLSAxID4gT1NEX1RFWFRfTUFYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRVJBTkdFOworCQkJZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJZXJyID0gY29weV9mcm9tX3VzZXIoc29sb19lbmMtPm9zZF90ZXh0LAorCQkJCQkJICAgICBjdHJsLT5zdHJpbmcsCisJCQkJCQkgICAgIE9TRF9URVhUX01BWCk7CisJCQkJc29sb19lbmMtPm9zZF90ZXh0W09TRF9URVhUX01BWF0gPSAnXDAnOworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSBzb2xvX29zZF9wcmludChzb2xvX2VuYyk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKworCQlpZiAoZXJyIDwgMCkgeworCQkJY3RybHMtPmVycm9yX2lkeCA9IGk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19nX2V4dF9jdHJscyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmN0cmxzKQoreworCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OworCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJscy0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY3RybCA9IChjdHJscy0+Y29udHJvbHMgKyBpKTsKKwkJaW50IGVycjsKKworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQ6CisJCQlpZiAoY3RybC0+c2l6ZSA8IE9TRF9URVhUX01BWCkgeworCQkJCWN0cmwtPnNpemUgPSBPU0RfVEVYVF9NQVg7CisJCQkJZXJyID0gLUVOT1NQQzsKKwkJCX0gZWxzZSB7CisJCQkJZXJyID0gY29weV90b191c2VyKGN0cmwtPnN0cmluZywKKwkJCQkJCSAgIHNvbG9fZW5jLT5vc2RfdGV4dCwKKwkJCQkJCSAgIE9TRF9URVhUX01BWCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKworCQlpZiAoZXJyIDwgMCkgeworCQkJY3RybHMtPmVycm9yX2lkeCA9IGk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgc29sb19lbmNfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzb2xvX2VuY19vcGVuLAorCS5yZWxlYXNlCQk9IHNvbG9fZW5jX3JlbGVhc2UsCisJLnJlYWQJCQk9IHNvbG9fZW5jX3JlYWQsCisJLnBvbGwJCQk9IHNvbG9fZW5jX3BvbGwsCisJLm1tYXAJCQk9IHNvbG9fZW5jX21tYXAsCisJLmlvY3RsCQkJPSB2aWRlb19pb2N0bDIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHNvbG9fZW5jX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCQk9IHNvbG9fZW5jX3F1ZXJ5Y2FwLAorCS52aWRpb2Nfc19zdGQJCQk9IHNvbG9fZW5jX3Nfc3RkLAorCS8qIElucHV0IGNhbGxiYWNrcyAqLworCS52aWRpb2NfZW51bV9pbnB1dAkJPSBzb2xvX2VuY19lbnVtX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dAkJCT0gc29sb19lbmNfc2V0X2lucHV0LAorCS52aWRpb2NfZ19pbnB1dAkJCT0gc29sb19lbmNfZ2V0X2lucHV0LAorCS8qIFZpZGVvIGNhcHR1cmUgZm9ybWF0IGNhbGxiYWNrcyAqLworCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcAk9IHNvbG9fZW5jX2VudW1fZm10X2NhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcAkJPSBzb2xvX2VuY190cnlfZm10X2NhcCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXAJCT0gc29sb19lbmNfc2V0X2ZtdF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwCQk9IHNvbG9fZW5jX2dldF9mbXRfY2FwLAorCS8qIFN0cmVhbWluZyBJL08gKi8KKwkudmlkaW9jX3JlcWJ1ZnMJCQk9IHNvbG9fZW5jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZgkJPSBzb2xvX2VuY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYJCQk9IHNvbG9fZW5jX3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJCT0gc29sb19lbmNfZHFidWYsCisJLnZpZGlvY19zdHJlYW1vbgkJPSBzb2xvX2VuY19zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgkJPSBzb2xvX2VuY19zdHJlYW1vZmYsCisJLyogRnJhbWUgc2l6ZSBhbmQgaW50ZXJ2YWwgKi8KKwkudmlkaW9jX2VudW1fZnJhbWVzaXplcwkJPSBzb2xvX2VudW1fZnJhbWVzaXplcywKKwkudmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMJPSBzb2xvX2VudW1fZnJhbWVpbnRlcnZhbHMsCisJLyogVmlkZW8gY2FwdHVyZSBwYXJhbWV0ZXJzICovCisJLnZpZGlvY19zX3Bhcm0JCQk9IHNvbG9fc19wYXJtLAorCS52aWRpb2NfZ19wYXJtCQkJPSBzb2xvX2dfcGFybSwKKwkvKiBDb250cm9scyAqLworCS52aWRpb2NfcXVlcnljdHJsCQk9IHNvbG9fcXVlcnljdHJsLAorCS52aWRpb2NfcXVlcnltZW51CQk9IHNvbG9fcXVlcnltZW51LAorCS52aWRpb2NfZ19jdHJsCQkJPSBzb2xvX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybAkJCT0gc29sb19zX2N0cmwsCisJLnZpZGlvY19nX2V4dF9jdHJscwkJPSBzb2xvX2dfZXh0X2N0cmxzLAorCS52aWRpb2Nfc19leHRfY3RybHMJCT0gc29sb19zX2V4dF9jdHJscywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNvbG9fZW5jX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSBTT0xPNjAxMF9OQU1FLAorCS5mb3BzCQkJPSAmc29sb19lbmNfZm9wcywKKwkuaW9jdGxfb3BzCQk9ICZzb2xvX2VuY19pb2N0bF9vcHMsCisJLm1pbm9yCQkJPSAtMSwKKwkucmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKworCS50dm5vcm1zCQk9IFY0TDJfU1REX05UU0NfTSB8IFY0TDJfU1REX1BBTF9NLAorCS5jdXJyZW50X25vcm0JCT0gVjRMMl9TVERfTlRTQ19NLAorfTsKKworc3RhdGljIHN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jX2FsbG9jKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBjaCkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYzsKKwlpbnQgcmV0OworCisJc29sb19lbmMgPSBremFsbG9jKHNpemVvZigqc29sb19lbmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNvbG9fZW5jKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNvbG9fZW5jLT52ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIXNvbG9fZW5jLT52ZmQpIHsKKwkJa2ZyZWUoc29sb19lbmMpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlzb2xvX2VuYy0+c29sb19kZXYgPSBzb2xvX2RldjsKKwlzb2xvX2VuYy0+Y2ggPSBjaDsKKworCSpzb2xvX2VuYy0+dmZkID0gc29sb19lbmNfdGVtcGxhdGU7CisJc29sb19lbmMtPnZmZC0+cGFyZW50ID0gJnNvbG9fZGV2LT5wZGV2LT5kZXY7CisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHNvbG9fZW5jLT52ZmQsIFZGTF9UWVBFX0dSQUJCRVIsCisJCQkJICAgIHZpZGVvX25yKTsKKwlpZiAocmV0IDwgMCkgeworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShzb2xvX2VuYy0+dmZkKTsKKwkJa2ZyZWUoc29sb19lbmMpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXZpZGVvX3NldF9kcnZkYXRhKHNvbG9fZW5jLT52ZmQsIHNvbG9fZW5jKTsKKworCXNucHJpbnRmKHNvbG9fZW5jLT52ZmQtPm5hbWUsIHNpemVvZihzb2xvX2VuYy0+dmZkLT5uYW1lKSwKKwkJICIlcy1lbmMgKCVpLyVpKSIsIFNPTE82MDEwX05BTUUsIHNvbG9fZGV2LT52ZmQtPm51bSwKKwkJIHNvbG9fZW5jLT52ZmQtPm51bSk7CisKKwlpZiAodmlkZW9fbnIgPj0gMCkKKwkJdmlkZW9fbnIrKzsKKworCXNwaW5fbG9ja19pbml0KCZzb2xvX2VuYy0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc29sb19lbmMtPnRocmVhZF93YWl0KTsKKwlhdG9taWNfc2V0KCZzb2xvX2VuYy0+cmVhZGVycywgMCk7CisKKwlzb2xvX2VuYy0+cXAgPSBTT0xPX0RFRkFVTFRfUVA7CisgICAgICAgIHNvbG9fZW5jLT5nb3AgPSBzb2xvX2Rldi0+ZnBzOworCXNvbG9fZW5jLT5pbnRlcnZhbCA9IDE7CisJc29sb19lbmMtPm1vZGUgPSBTT0xPX0VOQ19NT0RFX0NJRjsKKwlzb2xvX2VuYy0+bW90aW9uX3RocmVzaCA9IFNPTE9fREVGX01PVF9USFJFU0g7CisKKwlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwlzb2xvX3VwZGF0ZV9tb2RlKHNvbG9fZW5jKTsKKwlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCisJcmV0dXJuIHNvbG9fZW5jOworfQorCitzdGF0aWMgdm9pZCBzb2xvX2VuY19mcmVlKHN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jKQoreworCWlmIChzb2xvX2VuYyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShzb2xvX2VuYy0+dmZkKTsKKwlrZnJlZShzb2xvX2VuYyk7Cit9CisKK2ludCBzb2xvX2VuY192NGwyX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPm5yX2NoYW5zOyBpKyspIHsKKwkJc29sb19kZXYtPnY0bDJfZW5jW2ldID0gc29sb19lbmNfYWxsb2Moc29sb19kZXYsIGkpOworCQlpZiAoSVNfRVJSKHNvbG9fZGV2LT52NGwyX2VuY1tpXSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSAhPSBzb2xvX2Rldi0+bnJfY2hhbnMpIHsKKwkJaW50IHJldCA9IFBUUl9FUlIoc29sb19kZXYtPnY0bDJfZW5jW2ldKTsKKwkJd2hpbGUgKGktLSkKKwkJCXNvbG9fZW5jX2ZyZWUoc29sb19kZXYtPnY0bDJfZW5jW2ldKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBEMUBNQVgtRlBTICogNCAqLworCXNvbG9fZGV2LT5lbmNfYndfcmVtYWluID0gc29sb19kZXYtPmZwcyAqIDQgKiA0OworCisJZGV2X2luZm8oJnNvbG9fZGV2LT5wZGV2LT5kZXYsICJFbmNvZGVycyBhcyAvZGV2L3ZpZGVvJWQtJWRcbiIsCisJCSBzb2xvX2Rldi0+djRsMl9lbmNbMF0tPnZmZC0+bnVtLAorCQkgc29sb19kZXYtPnY0bDJfZW5jW3NvbG9fZGV2LT5ucl9jaGFucyAtIDFdLT52ZmQtPm51bSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzb2xvX2VuY192NGwyX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IGk7CisKKwlzb2xvNjAxMF9pcnFfb2ZmKHNvbG9fZGV2LCBTT0xPX0lSUV9NT1RJT04pOworCisJZm9yIChpID0gMDsgaSA8IHNvbG9fZGV2LT5ucl9jaGFuczsgaSsrKQorCQlzb2xvX2VuY19mcmVlKHNvbG9fZGV2LT52NGwyX2VuY1tpXSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXY0bDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTM3Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXY0bDIuYwpAQCAtMCwwICsxLDg1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC5oIgorI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKKworI2RlZmluZSBTT0xPX0hXX0JQTAkJMjA0OAorI2RlZmluZSBTT0xPX0RJU1BfUElYX0ZJRUxECVY0TDJfRklFTERfSU5URVJMQUNFRAorI2RlZmluZSBTT0xPX0RJU1BfQlVGX1NJWkUJKDY0ICogMTAyNCkgLy8gNjRrCisKKy8qIEltYWdlIHNpemUgaXMgdHdvIGZpZWxkcywgU09MT19IV19CUEwgaXMgb25lIGhvcml6b250YWwgbGluZSAqLworI2RlZmluZSBzb2xvX3ZsaW5lcyhfX3NvbG8pCShfX3NvbG8tPnZpZGVvX3ZzaXplICogMikKKyNkZWZpbmUgc29sb19pbWFnZV9zaXplKF9fc29sbykgKHNvbG9fYnl0ZXNwZXJsaW5lKF9fc29sbykgKiBcCisJCQkJIHNvbG9fdmxpbmVzKF9fc29sbykpCisjZGVmaW5lIHNvbG9fYnl0ZXNwZXJsaW5lKF9fc29sbykgKF9fc29sby0+dmlkZW9faHNpemUgKiAyKQorCisjZGVmaW5lIE1JTl9WSURfQlVGRkVSUwkJNAorCisvKiBTaW1wbGUgZmlsZSBoYW5kbGUgKi8KK3N0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgeworCXN0cnVjdCBzb2xvNjAxMF9kZXYJKnNvbG9fZGV2OworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZQl2aWRxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAgICprdGhyZWFkOworCXNwaW5sb2NrX3QJCXNsb2NrOworCWludAkJCW9sZF93cml0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXZpZHFfYWN0aXZlOworfTsKKwordW5zaWduZWQgdmlkZW9fbnIgPSAtMTsKK21vZHVsZV9wYXJhbSh2aWRlb19uciwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW9YIHN0YXJ0IG51bWJlciwgLTEgaXMgYXV0b2RldGVjdCAoZGVmYXVsdCkiKTsKKworc3RhdGljIHZvaWQgZXJhc2Vfb24oc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fRElTUF9FUkFTRSwgU09MT19WT19ESVNQX0VSQVNFX09OKTsKKwlzb2xvX2Rldi0+ZXJhc2luZyA9IDE7CisJc29sb19kZXYtPmZyYW1lX2JsYW5rID0gMDsKK30KKworc3RhdGljIGludCBlcmFzZV9vZmYoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaWYgKCFzb2xvX2Rldi0+ZXJhc2luZykKKwkJcmV0dXJuIDA7CisKKwkvKiBGaXJzdCB0aW1lIGFyb3VuZCwgYXNzZXJ0IGVyYXNlIG9mZiAqLworCWlmICghc29sb19kZXYtPmZyYW1lX2JsYW5rKQorCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19ESVNQX0VSQVNFLCAwKTsKKwkvKiBLZWVwIHRoZSBlcmFzaW5nIGZsYWcgb24gZm9yIDggZnJhbWVzIG1pbmltdW0gKi8KKwlpZiAoc29sb19kZXYtPmZyYW1lX2JsYW5rKysgPj0gOCkKKwkJc29sb19kZXYtPmVyYXNpbmcgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgc29sb192aWRlb19pbl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsIFNPTE9fSVJRX1ZJREVPX0lOKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNvbG9fZGV2LT5kaXNwX3RocmVhZF93YWl0KTsKK30KKworc3RhdGljIHZvaWQgc29sb193aW5fc2V0dXAoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLAorCQkJICAgaW50IHN4LCBpbnQgc3ksIGludCBleCwgaW50IGV5LCBpbnQgc2NhbGUpCit7CisJaWYgKGNoID49IHNvbG9fZGV2LT5ucl9jaGFucykKKwkJcmV0dXJuOworCisJLyogSGVyZSwgd2UganVzdCBrZWVwIHdpbmRvdy9jaGFubmVsIHRoZSBzYW1lICovCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfV0lOX0NUUkwwKGNoKSwKKwkJICAgICAgIFNPTE9fVklfV0lOX0NIQU5ORUwoY2gpIHwKKwkJICAgICAgIFNPTE9fVklfV0lOX1NYKHN4KSB8CisJCSAgICAgICBTT0xPX1ZJX1dJTl9FWChleCkgfAorCQkgICAgICAgU09MT19WSV9XSU5fU0NBTEUoc2NhbGUpKTsKKworICAgICAgICBzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9XSU5fQ1RSTDEoY2gpLAorCQkgICAgICAgU09MT19WSV9XSU5fU1koc3kpIHwKKwkJICAgICAgIFNPTE9fVklfV0lOX0VZKGV5KSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb192NGwyX2NoX2V4dF80dXAoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGlkeCwgaW50IG9uKQoreworCXU4IGNoID0gaWR4ICogNDsKKworCWlmIChjaCA+PSBzb2xvX2Rldi0+bnJfY2hhbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFvbikgeworCQl1OCBpOworCQlmb3IgKGkgPSBjaDsgaSA8IGNoICsgNDsgaSsrKQorCQkJc29sb193aW5fc2V0dXAoc29sb19kZXYsIGksIHNvbG9fZGV2LT52aWRlb19oc2l6ZSwKKwkJCQkgICAgICAgc29sb192bGluZXMoc29sb19kZXYpLAorCQkJCSAgICAgICBzb2xvX2Rldi0+dmlkZW9faHNpemUsCisJCQkJICAgICAgIHNvbG9fdmxpbmVzKHNvbG9fZGV2KSwgMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFJvdyAxICovCisJc29sb193aW5fc2V0dXAoc29sb19kZXYsIGNoLCAwLCAwLCBzb2xvX2Rldi0+dmlkZW9faHNpemUgLyAyLAorCQkgICAgICAgc29sb192bGluZXMoc29sb19kZXYpIC8gMiwgMyk7CisJc29sb193aW5fc2V0dXAoc29sb19kZXYsIGNoICsgMSwgc29sb19kZXYtPnZpZGVvX2hzaXplIC8gMiwgMCwKKwkJICAgICAgIHNvbG9fZGV2LT52aWRlb19oc2l6ZSwgc29sb192bGluZXMoc29sb19kZXYpIC8gMiwgMyk7CisJLyogUm93IDIgKi8KKwlzb2xvX3dpbl9zZXR1cChzb2xvX2RldiwgY2ggKyAyLCAwLCBzb2xvX3ZsaW5lcyhzb2xvX2RldikgLyAyLAorCQkgICAgICAgc29sb19kZXYtPnZpZGVvX2hzaXplIC8gMiwgc29sb192bGluZXMoc29sb19kZXYpLCAzKTsKKwlzb2xvX3dpbl9zZXR1cChzb2xvX2RldiwgY2ggKyAzLCBzb2xvX2Rldi0+dmlkZW9faHNpemUgLyAyLAorCQkgICAgICAgc29sb192bGluZXMoc29sb19kZXYpIC8gMiwgc29sb19kZXYtPnZpZGVvX2hzaXplLAorCQkgICAgICAgc29sb192bGluZXMoc29sb19kZXYpLCAzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fdjRsMl9jaF9leHRfMTZ1cChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IG9uKQoreworCWludCBzeSwgeXNpemUsIGhzaXplLCBpOworCisJaWYgKCFvbikgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCXNvbG9fd2luX3NldHVwKHNvbG9fZGV2LCBpLCBzb2xvX2Rldi0+dmlkZW9faHNpemUsCisJCQkJICAgICAgIHNvbG9fdmxpbmVzKHNvbG9fZGV2KSwKKwkJCQkgICAgICAgc29sb19kZXYtPnZpZGVvX2hzaXplLAorCQkJCSAgICAgICBzb2xvX3ZsaW5lcyhzb2xvX2RldiksIDApOworCQlyZXR1cm4gMDsKKwl9CisKKwl5c2l6ZSA9IHNvbG9fdmxpbmVzKHNvbG9fZGV2KSAvIDQ7CisJaHNpemUgPSBzb2xvX2Rldi0+dmlkZW9faHNpemUgLyA0OworCisJZm9yIChzeSA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrLCBzeSArPSB5c2l6ZSkgeworCQlzb2xvX3dpbl9zZXR1cChzb2xvX2RldiwgaSAqIDQsIDAsIHN5LCBoc2l6ZSwKKwkJCSAgICAgICBzeSArIHlzaXplLCA1KTsKKwkJc29sb193aW5fc2V0dXAoc29sb19kZXYsIChpICogNCkgKyAxLCBoc2l6ZSwgc3ksCisJCQkgICAgICAgaHNpemUgKiAyLCBzeSArIHlzaXplLCA1KTsKKwkJc29sb193aW5fc2V0dXAoc29sb19kZXYsIChpICogNCkgKyAyLCBoc2l6ZSAqIDIsIHN5LAorCQkJICAgICAgIGhzaXplICogMywgc3kgKyB5c2l6ZSwgNSk7CisJCXNvbG9fd2luX3NldHVwKHNvbG9fZGV2LCAoaSAqIDQpICsgMywgaHNpemUgKiAzLCBzeSwKKwkJCSAgICAgICBzb2xvX2Rldi0+dmlkZW9faHNpemUsIHN5ICsgeXNpemUsIDUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG9fdjRsMl9jaChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gsIGludCBvbikKK3sKKwl1OCBleHRfY2g7CisKKwlpZiAoY2ggPCBzb2xvX2Rldi0+bnJfY2hhbnMpIHsKKwkJc29sb193aW5fc2V0dXAoc29sb19kZXYsIGNoLCBvbiA/IDAgOiBzb2xvX2Rldi0+dmlkZW9faHNpemUsCisJCQkgICAgICAgb24gPyAwIDogc29sb192bGluZXMoc29sb19kZXYpLAorCQkJICAgICAgIHNvbG9fZGV2LT52aWRlb19oc2l6ZSwgc29sb192bGluZXMoc29sb19kZXYpLAorCQkJICAgICAgIG9uID8gMSA6IDApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2ggPj0gc29sb19kZXYtPm5yX2NoYW5zICsgc29sb19kZXYtPm5yX2V4dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlleHRfY2ggPSBjaCAtIHNvbG9fZGV2LT5ucl9jaGFuczsKKworCS8qIDR1cCdzIGZpcnN0ICovCisJaWYgKGV4dF9jaCA8IDQpCisJCXJldHVybiBzb2xvX3Y0bDJfY2hfZXh0XzR1cChzb2xvX2RldiwgZXh0X2NoLCBvbik7CisKKwkvKiBSZW1haW5pbmcgY2FzZSBpcyAxNnVwIGZvciAxNi1wb3J0ICovCisJcmV0dXJuIHNvbG9fdjRsMl9jaF9leHRfMTZ1cChzb2xvX2Rldiwgb24pOworfQorCitzdGF0aWMgaW50IHNvbG9fdjRsMl9zZXRfY2goc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoKQoreworCWlmIChjaCA+PSBzb2xvX2Rldi0+bnJfY2hhbnMgKyBzb2xvX2Rldi0+bnJfZXh0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyYXNlX29uKHNvbG9fZGV2KTsKKworCXNvbG9fdjRsMl9jaChzb2xvX2Rldiwgc29sb19kZXYtPmN1cl9kaXNwX2NoLCAwKTsKKwlzb2xvX3Y0bDJfY2goc29sb19kZXYsIGNoLCAxKTsKKworCXNvbG9fZGV2LT5jdXJfZGlzcF9jaCA9IGNoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fZmlsbGJ1ZihzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCwKKwkJCSBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IGZoLT5zb2xvX2RldjsKKwlkbWFfYWRkcl90IHZidWY7CisJdW5zaWduZWQgaW50IGZkbWFfYWRkcjsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgZXJyb3IgPSAxOworCWludCBpOworCisJaWYgKCEodmJ1ZiA9IHZpZGVvYnVmX3RvX2RtYV9jb250aWcodmIpKSkKKwkJZ290byBmaW5pc2hfYnVmOworCisJaWYgKGVyYXNlX29mZihzb2xvX2RldikpIHsKKwkJdm9pZCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOworCQlpbnQgaW1hZ2Vfc2l6ZSA9IHNvbG9faW1hZ2Vfc2l6ZShzb2xvX2Rldik7CisJCWZvciAoaSA9IDA7IGkgPCBpbWFnZV9zaXplOyBpICs9IDIpIHsKKwkJCSgodTggKilwKVtpXSA9IDB4ODA7CisJCQkoKHU4ICopcClbaSArIDFdID0gMHgwMDsKKwkJfQorCQllcnJvciA9IDA7CisJCWdvdG8gZmluaXNoX2J1ZjsKKwl9CisKKwlmcmFtZV9zaXplID0gU09MT19IV19CUEwgKiBzb2xvX3ZsaW5lcyhzb2xvX2Rldik7CisJZmRtYV9hZGRyID0gU09MT19ESVNQX0VYVF9BRERSKHNvbG9fZGV2KSArIChmaC0+b2xkX3dyaXRlICogZnJhbWVfc2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnJhbWVfc2l6ZSAvIFNPTE9fRElTUF9CVUZfU0laRTsgaSsrKSB7CisJCWludCBqOworCQlmb3IgKGogPSAwOyBqIDwgKFNPTE9fRElTUF9CVUZfU0laRSAvIFNPTE9fSFdfQlBMKTsgaisrKSB7CisJCQlpZiAoc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9ESVNQLCAwLAorCQkJCQkgICB2YnVmLCBmZG1hX2FkZHIgKyAoaiAqIFNPTE9fSFdfQlBMKSwKKwkJCQkJICAgc29sb19ieXRlc3BlcmxpbmUoc29sb19kZXYpKSkKKwkJCQlnb3RvIGZpbmlzaF9idWY7CisJCQl2YnVmICs9IHNvbG9fYnl0ZXNwZXJsaW5lKHNvbG9fZGV2KTsKKwkJfQorCQlmZG1hX2FkZHIgKz0gU09MT19ESVNQX0JVRl9TSVpFOworCX0KKwllcnJvciA9IDA7CisKK2ZpbmlzaF9idWY6CisJaWYgKGVycm9yKSB7CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOworCX0gZWxzZSB7CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CisJCXZiLT5maWVsZF9jb3VudCsrOworCQlkb19nZXR0aW1lb2ZkYXkoJnZiLT50cyk7CisJfQorCisJd2FrZV91cCgmdmItPmRvbmUpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzb2xvX3RocmVhZF90cnkoc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmgpCit7CisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CisJdW5zaWduZWQgaW50IGN1cl93cml0ZTsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrKCZmaC0+c2xvY2spOworCisJCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcV9hY3RpdmUpKQorCQkJYnJlYWs7CisKKwkJdmIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZmaC0+dmlkcV9hY3RpdmUsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsCisJCQkJICAgICAgcXVldWUpOworCisJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmdmItPmRvbmUpKQorCQkJYnJlYWs7CisKKwkJY3VyX3dyaXRlID0gU09MT19WSV9TVEFUVVMwX1BBR0Uoc29sb19yZWdfcmVhZChmaC0+c29sb19kZXYsCisJCQkJCQkJU09MT19WSV9TVEFUVVMwKSk7CisJCWlmIChjdXJfd3JpdGUgPT0gZmgtPm9sZF93cml0ZSkKKwkJCWJyZWFrOworCisJCWZoLT5vbGRfd3JpdGUgPSBjdXJfd3JpdGU7CisJCWxpc3RfZGVsKCZ2Yi0+cXVldWUpOworCisJCXNwaW5fdW5sb2NrKCZmaC0+c2xvY2spOworCisJCXNvbG9fZmlsbGJ1ZihmaCwgdmIpOworCX0KKworCWFzc2VydF9zcGluX2xvY2tlZCgmZmgtPnNsb2NrKTsKKwlzcGluX3VubG9jaygmZmgtPnNsb2NrKTsKK30KKworc3RhdGljIGludCBzb2xvX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gZGF0YTsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IGZoLT5zb2xvX2RldjsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCXNldF9mcmVlemFibGUoKTsKKwlhZGRfd2FpdF9xdWV1ZSgmc29sb19kZXYtPmRpc3BfdGhyZWFkX3dhaXQsICZ3YWl0KTsKKworCWZvciAoOzspIHsKKwkJbG9uZyB0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKKwkJaWYgKHRpbWVvdXQgPT0gLUVSRVNUQVJUU1lTIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCQlzb2xvX3RocmVhZF90cnkoZmgpOworCQl0cnlfdG9fZnJlZXplKCk7CisJfQorCisJcmVtb3ZlX3dhaXRfcXVldWUoJnNvbG9fZGV2LT5kaXNwX3RocmVhZF93YWl0LCAmd2FpdCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19zdGFydF90aHJlYWQoc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmgpCit7CisJZmgtPmt0aHJlYWQgPSBrdGhyZWFkX3J1bihzb2xvX3RocmVhZCwgZmgsIFNPTE82MDEwX05BTUUgIl9kaXNwIik7CisKKwlpZiAoSVNfRVJSKGZoLT5rdGhyZWFkKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmgtPmt0aHJlYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvbG9fc3RvcF90aHJlYWQoc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmgpCit7CisJaWYgKGZoLT5rdGhyZWFkKSB7CisJCWt0aHJlYWRfc3RvcChmaC0+a3RocmVhZCk7CisJCWZoLT5rdGhyZWFkID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc29sb19idWZfc2V0dXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpjb3VudCwKKwkJCSAgdW5zaWduZWQgaW50ICpzaXplKQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiAgPSBmaC0+c29sb19kZXY7CisKKyAgICAgICAgKnNpemUgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOworCisgICAgICAgIGlmICgqY291bnQgPCBNSU5fVklEX0JVRkZFUlMpCisJCSpjb3VudCA9IE1JTl9WSURfQlVGRkVSUzsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2J1Zl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCisJCQkgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCAgPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gZmgtPnNvbG9fZGV2OworCisJdmItPnNpemUgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOworCWlmICh2Yi0+YmFkZHIgIT0gMCAmJiB2Yi0+YnNpemUgPCB2Yi0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBYWFg6IFRoZXNlIHByb3BlcnRpZXMgb25seSBjaGFuZ2Ugd2hlbiBxdWV1ZSBpcyBpZGxlICovCisJdmItPndpZHRoICA9IHNvbG9fZGV2LT52aWRlb19oc2l6ZTsKKwl2Yi0+aGVpZ2h0ID0gc29sb192bGluZXMoc29sb19kZXYpOworCXZiLT5ieXRlc3BlcmxpbmUgPSBzb2xvX2J5dGVzcGVybGluZShzb2xvX2Rldik7CisJdmItPmZpZWxkICA9IGZpZWxkOworCisJaWYgKHZiLT5zdGF0ZSA9PSBWSURFT0JVRl9ORUVEU19JTklUKSB7CisJCWludCByYyA9IHZpZGVvYnVmX2lvbG9jayh2cSwgdmIsIE5VTEwpOworCQlpZiAocmMgPCAwKSB7CisJCQl2aWRlb2J1Zl9kbWFfY29udGlnX2ZyZWUodnEsIHZiKTsKKwkJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJdmItPnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29sb19idWZfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKKwkJCSAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IGZoLT5zb2xvX2RldjsKKworCXZiLT5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKKwlsaXN0X2FkZF90YWlsKCZ2Yi0+cXVldWUsICZmaC0+dmlkcV9hY3RpdmUpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29sb19kZXYtPmRpc3BfdGhyZWFkX3dhaXQpOworfQorCitzdGF0aWMgdm9pZCBzb2xvX2J1Zl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCisJCQkgICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOworCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIHNvbG9fdmlkZW9fcW9wcyA9IHsKKwkuYnVmX3NldHVwCT0gc29sb19idWZfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlCT0gc29sb19idWZfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlCT0gc29sb19idWZfcXVldWUsCisJLmJ1Zl9yZWxlYXNlCT0gc29sb19idWZfcmVsZWFzZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29sb192NGwyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgICAgICAgIHJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZmgtPnZpZHEsIHdhaXQpOworfQorCitzdGF0aWMgaW50IHNvbG9fdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZpZHEsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb192NGwyX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoOworCWludCByZXQ7CisKKwlpZiAoKGZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJmZoLT5zbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmZoLT52aWRxX2FjdGl2ZSk7CisJZmgtPnNvbG9fZGV2ID0gc29sb19kZXY7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisKKwlpZiAoKHJldCA9IHNvbG9fc3RhcnRfdGhyZWFkKGZoKSkpIHsKKwkJa2ZyZWUoZmgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdCgmZmgtPnZpZHEsICZzb2xvX3ZpZGVvX3FvcHMsCisJCQkJICAgICZzb2xvX2Rldi0+cGRldi0+ZGV2LCAmZmgtPnNsb2NrLAorCQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQkJICAgIFNPTE9fRElTUF9QSVhfRklFTEQsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbG9fdjRsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsIDAsCisJCQkJICAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKK30KKworc3RhdGljIGludCBzb2xvX3Y0bDJfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXZpZGVvYnVmX3N0b3AoJmZoLT52aWRxKTsKKwl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKKwlzb2xvX3N0b3BfdGhyZWFkKGZoKTsKKwlrZnJlZShmaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAgKmZoICA9IHByaXY7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+c29sb19kZXY7CisKKwlzdHJjcHkoY2FwLT5kcml2ZXIsIFNPTE82MDEwX05BTUUpOworCXN0cmNweShjYXAtPmNhcmQsICJTb2Z0bG9naWMgNjAxMCIpOworCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwgIlBDSSAlcyIsCisJCSBwY2lfbmFtZShzb2xvX2Rldi0+cGRldikpOworCWNhcC0+dmVyc2lvbiA9IFNPTE82MDEwX1ZFUl9OVU07CisJY2FwLT5jYXBhYmlsaXRpZXMgPSAgICAgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkJVjRMMl9DQVBfUkVBRFdSSVRFIHwKKwkJCQlWNEwyX0NBUF9TVFJFQU1JTkc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbnVtX2V4dF9pbnB1dChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmRpc3BuYW1lc18xW10gPSB7ICI0VVAiIH07CisJc3RhdGljIGNvbnN0IGNoYXIgKmRpc3BuYW1lc18yW10gPSB7ICI0VVAtMSIsICI0VVAtMiIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqZGlzcG5hbWVzXzVbXSA9IHsKKwkJIjRVUC0xIiwgIjRVUC0yIiwgIjRVUC0zIiwgIjRVUC00IiwgIjE2VVAiCisJfTsKKwljb25zdCBjaGFyICoqZGlzcG5hbWVzOworCisJaWYgKGlucHV0LT5pbmRleCA+PSAoc29sb19kZXYtPm5yX2NoYW5zICsgc29sb19kZXYtPm5yX2V4dCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNvbG9fZGV2LT5ucl9leHQgPT0gNSkKKwkJZGlzcG5hbWVzID0gZGlzcG5hbWVzXzU7CisJZWxzZSBpZiAoc29sb19kZXYtPm5yX2V4dCA9PSAyKQorCQlkaXNwbmFtZXMgPSBkaXNwbmFtZXNfMjsKKwllbHNlCisJCWRpc3BuYW1lcyA9IGRpc3BuYW1lc18xOworCisJc25wcmludGYoaW5wdXQtPm5hbWUsIHNpemVvZihpbnB1dC0+bmFtZSksICJNdWx0aSAlcyIsCisJCSBkaXNwbmFtZXNbaW5wdXQtPmluZGV4IC0gc29sb19kZXYtPm5yX2NoYW5zXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggID0gcHJpdjsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IGZoLT5zb2xvX2RldjsKKworCWlmIChpbnB1dC0+aW5kZXggPj0gc29sb19kZXYtPm5yX2NoYW5zKSB7CisJCWludCByZXQgPSBzb2xvX2VudW1fZXh0X2lucHV0KHNvbG9fZGV2LCBpbnB1dCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlzbnByaW50ZihpbnB1dC0+bmFtZSwgc2l6ZW9mKGlucHV0LT5uYW1lKSwgIkNhbWVyYSAlZCIsCisJCQkgaW5wdXQtPmluZGV4ICsgMSk7CisKKwkJLyogV2UgY2FuIG9ubHkgY2hlY2sgdGhpcyBmb3Igbm9ybWFsIGlucHV0cyAqLworCQlpZiAoIXR3MjhfZ2V0X3ZpZGVvX3N0YXR1cyhzb2xvX2RldiwgaW5wdXQtPmluZGV4KSkKKwkJCWlucHV0LT5zdGF0dXMgPSBWNEwyX0lOX1NUX05PX1NJR05BTDsKKwl9CisKKwlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisKKwlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKQorCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOworCWVsc2UKKwkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19zZXRfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisKKwlyZXR1cm4gc29sb192NGwyX3NldF9jaChmaC0+c29sb19kZXYsIGluZGV4KTsKK30KKworc3RhdGljIGludCBzb2xvX2dldF9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppbmRleCkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisKKwkqaW5kZXggPSBmaC0+c29sb19kZXYtPmN1cl9kaXNwX2NoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sb19lbnVtX2ZtdF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJaWYgKGYtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1VZVlk7CisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgIlVZVVYgNDoyOjIgUGFja2VkIiwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX3RyeV9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+c29sb19kZXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJaW50IGltYWdlX3NpemUgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOworCisJLyogQ2hlY2sgc3VwcG9ydGVkIHNpemVzICovCisJaWYgKHBpeC0+d2lkdGggIT0gc29sb19kZXYtPnZpZGVvX2hzaXplKQorCQlwaXgtPndpZHRoID0gc29sb19kZXYtPnZpZGVvX2hzaXplOworCWlmIChwaXgtPmhlaWdodCAhPSBzb2xvX3ZsaW5lcyhzb2xvX2RldikpCisJCXBpeC0+aGVpZ2h0ID0gc29sb192bGluZXMoc29sb19kZXYpOworCWlmIChwaXgtPnNpemVpbWFnZSAhPSBpbWFnZV9zaXplKQorCQlwaXgtPnNpemVpbWFnZSA9IGltYWdlX3NpemU7CisKKwkvKiBDaGVjayBmb3JtYXRzICovCisJaWYgKHBpeC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCisJCXBpeC0+ZmllbGQgPSBTT0xPX0RJU1BfUElYX0ZJRUxEOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1VZVlkgfHwKKwkgICAgcGl4LT5maWVsZCAgICAgICAhPSBTT0xPX0RJU1BfUElYX0ZJRUxEIHx8CisJICAgIHBpeC0+Y29sb3JzcGFjZSAgIT0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX3NldF9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisKKwlpZiAodmlkZW9idWZfcXVldWVfaXNfYnVzeSgmZmgtPnZpZHEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogRm9yIHJpZ2h0IG5vdywgaWYgaXQgZG9lc24ndCBtYXRjaCBvdXIgcnVubmluZyBjb25maWcsCisJICogdGhlbiBmYWlsICovCisJcmV0dXJuIHNvbG9fdHJ5X2ZtdF9jYXAoZmlsZSwgcHJpdiwgZik7Cit9CisKK3N0YXRpYyBpbnQgc29sb19nZXRfZm10X2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSBwcml2OworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gZmgtPnNvbG9fZGV2OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCisJcGl4LT53aWR0aCA9IHNvbG9fZGV2LT52aWRlb19oc2l6ZTsKKwlwaXgtPmhlaWdodCA9IHNvbG9fdmxpbmVzKHNvbG9fZGV2KTsKKwlwaXgtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1VZVlk7CisJcGl4LT5maWVsZCA9IFNPTE9fRElTUF9QSVhfRklFTEQ7CisJcGl4LT5zaXplaW1hZ2UgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOworCXBpeC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisJcGl4LT5ieXRlc3BlcmxpbmUgPSBzb2xvX2J5dGVzcGVybGluZShzb2xvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIAorCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZmgtPnZpZHEsIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSBwcml2OworCisJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKCZmaC0+dmlkcSwgYnVmKTsKK30KKworc3RhdGljIGludCBzb2xvX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gcHJpdjsKKworCXJldHVybiB2aWRlb2J1Zl9xYnVmKCZmaC0+dmlkcSwgYnVmKTsKK30KKworc3RhdGljIGludCBzb2xvX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmZoLT52aWRxLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKK30KKworc3RhdGljIGludCBzb2xvX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisKKwlpZiAoaSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKCZmaC0+dmlkcSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gcHJpdjsKKworCWlmIChpICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmlkcSk7Cit9CisKK3N0YXRpYyBpbnQgc29sb19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmkpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1MzIgc29sb19tb3Rpb25fY3RybHNbXSA9IHsKKwlWNEwyX0NJRF9NT1RJT05fVFJBQ0UsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHUzMiAqc29sb19jdHJsX2NsYXNzZXNbXSA9IHsKKwlzb2xvX21vdGlvbl9jdHJscywKKwlOVUxMCit9OworCitzdGF0aWMgaW50IHNvbG9fZGlzcF9xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlxYy0+aWQgPSB2NGwyX2N0cmxfbmV4dChzb2xvX2N0cmxfY2xhc3NlcywgcWMtPmlkKTsKKwlpZiAoIXFjLT5pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHFjLT5pZCkgeworI2lmZGVmIFBSSVZBVEVfQ0lEUworCWNhc2UgVjRMMl9DSURfTU9USU9OX1RSQUNFOgorCQlxYy0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CisJCXFjLT5taW5pbXVtID0gMDsKKwkJcWMtPm1heGltdW0gPSBxYy0+c3RlcCA9IDE7CisJCXFjLT5kZWZhdWx0X3ZhbHVlID0gMDsKKwkJc3RybGNweShxYy0+bmFtZSwgIk1vdGlvbiBEZXRlY3Rpb24gVHJhY2UiLCBzaXplb2YocWMtPm5hbWUpKTsKKwkJcmV0dXJuIDA7CisjZWxzZQorCWNhc2UgVjRMMl9DSURfTU9USU9OX1RSQUNFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDEsIDEsIDApOworI2VuZGlmCisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNvbG9fZGlzcF9nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+c29sb19kZXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NT1RJT05fVFJBQ0U6CisJCWN0cmwtPnZhbHVlID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19WSV9NT1RJT05fQkFSKQorCQkJPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNvbG9fZGlzcF9zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IHByaXY7CisJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+c29sb19kZXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NT1RJT05fVFJBQ0U6CisJCWlmIChjdHJsLT52YWx1ZSkgeworCQkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9USU9OX0JPUkRFUiwKKwkJCQkJU09MT19WSV9NT1RJT05fWV9BREQgfAorCQkJCQlTT0xPX1ZJX01PVElPTl9ZX1ZBTFVFKDB4MjApIHwKKwkJCQkJU09MT19WSV9NT1RJT05fQ0JfVkFMVUUoMHgxMCkgfAorCQkJCQlTT0xPX1ZJX01PVElPTl9DUl9WQUxVRSgweDEwKSk7CisJCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RJT05fQkFSLAorCQkJCQlTT0xPX1ZJX01PVElPTl9DUl9BREQgfAorCQkJCQlTT0xPX1ZJX01PVElPTl9ZX1ZBTFVFKDB4MTApIHwKKwkJCQkJU09MT19WSV9NT1RJT05fQ0JfVkFMVUUoMHg4MCkgfAorCQkJCQlTT0xPX1ZJX01PVElPTl9DUl9WQUxVRSgweDEwKSk7CisJCX0gZWxzZSB7CisJCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RJT05fQk9SREVSLCAwKTsKKwkJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVElPTl9CQVIsIDApOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBzb2xvX3Y0bDJfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzb2xvX3Y0bDJfb3BlbiwKKwkucmVsZWFzZQkJPSBzb2xvX3Y0bDJfcmVsZWFzZSwKKwkucmVhZAkJCT0gc29sb192NGwyX3JlYWQsCisJLnBvbGwJCQk9IHNvbG9fdjRsMl9wb2xsLAorCS5tbWFwCQkJPSBzb2xvX3Y0bDJfbW1hcCwKKwkuaW9jdGwJCQk9IHZpZGVvX2lvY3RsMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgc29sb192NGwyX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCQk9IHNvbG9fcXVlcnljYXAsCisJLnZpZGlvY19zX3N0ZAkJCT0gc29sb19zX3N0ZCwKKwkvKiBJbnB1dCBjYWxsYmFja3MgKi8KKwkudmlkaW9jX2VudW1faW5wdXQJCT0gc29sb19lbnVtX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dAkJCT0gc29sb19zZXRfaW5wdXQsCisJLnZpZGlvY19nX2lucHV0CQkJPSBzb2xvX2dldF9pbnB1dCwKKwkvKiBWaWRlbyBjYXB0dXJlIGZvcm1hdCBjYWxsYmFja3MgKi8KKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAJPSBzb2xvX2VudW1fZm10X2NhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcAkJPSBzb2xvX3RyeV9mbXRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcAkJPSBzb2xvX3NldF9mbXRfY2FwLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcAkJPSBzb2xvX2dldF9mbXRfY2FwLAorCS8qIFN0cmVhbWluZyBJL08gKi8KKwkudmlkaW9jX3JlcWJ1ZnMJCQk9IHNvbG9fcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmCQk9IHNvbG9fcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQkJPSBzb2xvX3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJCT0gc29sb19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uCQk9IHNvbG9fc3RyZWFtb24sCisgICAgICAgIC52aWRpb2Nfc3RyZWFtb2ZmCQk9IHNvbG9fc3RyZWFtb2ZmLAorCS8qIENvbnRyb2xzICovCisJLnZpZGlvY19xdWVyeWN0cmwJCT0gc29sb19kaXNwX3F1ZXJ5Y3RybCwKKyAgICAgICAgLnZpZGlvY19nX2N0cmwJCQk9IHNvbG9fZGlzcF9nX2N0cmwsCisgICAgICAgIC52aWRpb2Nfc19jdHJsCQkJPSBzb2xvX2Rpc3Bfc19jdHJsLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc29sb192NGwyX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSBTT0xPNjAxMF9OQU1FLAorCS5mb3BzCQkJPSAmc29sb192NGwyX2ZvcHMsCisJLmlvY3RsX29wcwkJPSAmc29sb192NGwyX2lvY3RsX29wcywKKwkubWlub3IJCQk9IC0xLAorCS5yZWxlYXNlCQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCisJLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00sCisJLmN1cnJlbnRfbm9ybQkJPSBWNEwyX1NURF9OVFNDX00sCit9OworCitpbnQgc29sb192NGwyX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbG9fZGV2LT5kaXNwX3RocmVhZF93YWl0KTsKKworCXNvbG9fZGV2LT52ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIXNvbG9fZGV2LT52ZmQpCisJCXJldHVybiAtRU5PTUVNOworCisJKnNvbG9fZGV2LT52ZmQgPSBzb2xvX3Y0bDJfdGVtcGxhdGU7CisJc29sb19kZXYtPnZmZC0+cGFyZW50ID0gJnNvbG9fZGV2LT5wZGV2LT5kZXY7CisKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2Uoc29sb19kZXYtPnZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOworCWlmIChyZXQgPCAwKSB7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKHNvbG9fZGV2LT52ZmQpOworCQlzb2xvX2Rldi0+dmZkID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2aWRlb19zZXRfZHJ2ZGF0YShzb2xvX2Rldi0+dmZkLCBzb2xvX2Rldik7CisKKwlzbnByaW50Zihzb2xvX2Rldi0+dmZkLT5uYW1lLCBzaXplb2Yoc29sb19kZXYtPnZmZC0+bmFtZSksICIlcyAoJWkpIiwKKwkJIFNPTE82MDEwX05BTUUsIHNvbG9fZGV2LT52ZmQtPm51bSk7CisKKwlpZiAodmlkZW9fbnIgPj0gMCkKKwkJdmlkZW9fbnIrKzsKKworCWRldl9pbmZvKCZzb2xvX2Rldi0+cGRldi0+ZGV2LCAiRGlzcGxheSBhcyAvZGV2L3ZpZGVvJWQgd2l0aCAiCisJCSAiJWQgaW5wdXRzICglZCBleHRlbmRlZClcbiIsIHNvbG9fZGV2LT52ZmQtPm51bSwKKwkJIHNvbG9fZGV2LT5ucl9jaGFucywgc29sb19kZXYtPm5yX2V4dCk7CisKKwkvKiBDeWNsZSBhbGwgdGhlIGNoYW5uZWxzIGFuZCBjbGVhciAqLworCWZvciAoaSA9IDA7IGkgPCBzb2xvX2Rldi0+bnJfY2hhbnM7IGkrKykgeworCQlzb2xvX3Y0bDJfc2V0X2NoKHNvbG9fZGV2LCBpKTsKKwkJd2hpbGUgKGVyYXNlX29mZihzb2xvX2RldikpCisJCQk7Ly8gRG8gbm90aGluZworCX0KKworCS8qIFNldCB0aGUgZGVmYXVsdCBkaXNwbGF5IGNoYW5uZWwgKi8KKwlzb2xvX3Y0bDJfc2V0X2NoKHNvbG9fZGV2LCAwKTsKKwl3aGlsZSAoZXJhc2Vfb2ZmKHNvbG9fZGV2KSkKKwkJOy8vIERvIG5vdGhpbmcKKworCXNvbG82MDEwX2lycV9vbihzb2xvX2RldiwgU09MT19JUlFfVklERU9fSU4pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc29sb192NGwyX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCit7CisJc29sbzYwMTBfaXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfVklERU9fSU4pOworCWlmIChzb2xvX2Rldi0+dmZkKSB7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHNvbG9fZGV2LT52ZmQpOworCQlzb2xvX2Rldi0+dmZkID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYThlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaApAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1NPTE82MDEwX0gKKyNkZWZpbmUgX19TT0xPNjAxMF9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1jb3JlLmg+CisKKyNpbmNsdWRlICJzb2xvNjAxMC1yZWdpc3RlcnMuaCIKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1NPRlRMT0dJQworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NPRlRMT0dJQwkJMHg5NDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU09MTzYwMTAJCTB4NjAxMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWQkweDFCQjMKKy8qIE5ldWdlbnQgU29mdGxvZ2ljIDYwMTAgYmFzZWQgY2FyZHMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVVTT0xPXzQJCTB4NDMwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVVNPTE9fOQkJMHg0MzA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVVU09MT18xNgkweDQzMTAKKy8qIENvbW1lbGwgU29mdGxvZ2ljIDYwMTAgYmFzZWQgY2FyZHMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01NU09MT180CTB4NEUwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzkJMHg0RTA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fMTYJMHg0RTEwCisjZW5kaWYgLyogQmx1ZWNoZXJyeSAqLworCisjZGVmaW5lIFNPTE82MDEwX05BTUUJCQkic29sbzYwMTAiCisKKyNkZWZpbmUgU09MT19NQVhfQ0hBTk5FTFMJCTE2CisKKy8qIE1ha2Ugc3VyZSB0aGVzZSB0d28gbWF0Y2ggKi8KKyNkZWZpbmUgU09MTzYwMTBfVkVSU0lPTgkJIjIuMC4wIgorI2RlZmluZSBTT0xPNjAxMF9WRVJfTUFKT1IJCTIKKyNkZWZpbmUgU09MTzYwMTBfVkVSX01JTk9SCQkwCisjZGVmaW5lIFNPTE82MDEwX1ZFUl9TVUIJCTAKKyNkZWZpbmUgU09MTzYwMTBfVkVSX05VTSBcCisgICAgS0VSTkVMX1ZFUlNJT04oU09MTzYwMTBfVkVSX01BSk9SLCBTT0xPNjAxMF9WRVJfTUlOT1IsIFNPTE82MDEwX1ZFUl9TVUIpCisKKy8qCisgKiBUaGUgU09MTzYwMTAgYWN0dWFsbHkgaGFzIDggaTJjIGNoYW5uZWxzLCBidXQgd2Ugb25seSB1c2UgMi4KKyAqIDAgLSBUZWNod2VsbCBjaGlwKHMpCisgKiAxIC0gU0FBNzEyOAorICovCisjZGVmaW5lIFNPTE9fSTJDX0FEQVBURVJTCQkyCisjZGVmaW5lIFNPTE9fSTJDX1RXCQkJMAorI2RlZmluZSBTT0xPX0kyQ19TQUEJCQkxCisKKy8qIERNQSBFbmdpbmUgc2V0dXAgKi8KKyNkZWZpbmUgU09MT19OUl9QMk0JCQk0CisjZGVmaW5lIFNPTE9fTlJfUDJNX0RFU0MJCTI1NgorI2RlZmluZSBTT0xPX1AyTV9ERVNDX1NJWkUJCShTT0xPX05SX1AyTV9ERVNDICogMTYpCisvKiBNUEVHIGFuZCBKUEVHIHNoYXJlIHRoZSBzYW1lIGludGVycnVwdCBhbmQgbG9ja3Mgc28gdGhleSBtdXN0IGJlIHRvZ2V0aGVyCisgKiBpbiB0aGUgc2FtZSBkbWEgY2hhbm5lbC4gKi8KKyNkZWZpbmUgU09MT19QMk1fRE1BX0lEX01QNEUJCTAKKyNkZWZpbmUgU09MT19QMk1fRE1BX0lEX0pQRUcJCTAKKyNkZWZpbmUgU09MT19QMk1fRE1BX0lEX01QNEQJCTEKKyNkZWZpbmUgU09MT19QMk1fRE1BX0lEX0c3MjNECQkxCisjZGVmaW5lIFNPTE9fUDJNX0RNQV9JRF9ESVNQCQkyCisjZGVmaW5lIFNPTE9fUDJNX0RNQV9JRF9PU0cJCTIKKyNkZWZpbmUgU09MT19QMk1fRE1BX0lEX0c3MjNFCQkzCisjZGVmaW5lIFNPTE9fUDJNX0RNQV9JRF9WSU4JCTMKKworLyogRW5jb2RlciBzdGFuZGFyZCBtb2RlcyAqLworI2RlZmluZSBTT0xPX0VOQ19NT0RFX0NJRgkJMgorI2RlZmluZSBTT0xPX0VOQ19NT0RFX0hEMQkJMQorI2RlZmluZSBTT0xPX0VOQ19NT0RFX0QxCQk5CisKKyNkZWZpbmUgU09MT19ERUZBVUxUX0dPUAkJMzAKKyNkZWZpbmUgU09MT19ERUZBVUxUX1FQCQkJMworCisvKiBUaGVyZSBpcyA4TUIgbWVtb3J5IGF2YWlsYWJsZSBmb3Igc29sbyB0byBidWZmZXIgTVBFRzQgZnJhbWVzLgorICogVGhpcyBnaXZlcyB1cyA1MTIgKiAxNmtieXRlIHF1ZXVlcy4gKi8KKyNkZWZpbmUgU09MT19OUl9SSU5HX0JVRlMJCTUxMgorCisjZGVmaW5lIFNPTE9fQ0xPQ0tfTUhaCQkJMTA4CisKKyNpZm5kZWYgVjRMMl9CVUZfRkxBR19NT1RJT05fT04KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19NT1RJT05fT04JCTB4MDQwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX01PVElPTl9ERVRFQ1RFRAkweDA4MDAKKyNlbmRpZgorI2lmbmRlZiBWNEwyX0NJRF9NT1RJT05fRU5BQkxFCisjZGVmaW5lIFBSSVZBVEVfQ0lEUworI2RlZmluZSBWNEwyX0NJRF9NT1RJT05fRU5BQkxFCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFKzApCisjZGVmaW5lIFY0TDJfQ0lEX01PVElPTl9USFJFU0hPTEQJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NT1RJT05fVFJBQ0UJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UrMikKKyNlbmRpZgorCitlbnVtIFNPTE9fSTJDX1NUQVRFIHsKKwlJSUNfU1RBVEVfSURMRSwKKwlJSUNfU1RBVEVfU1RBUlQsCisJSUlDX1NUQVRFX1JFQUQsCisJSUlDX1NUQVRFX1dSSVRFLAorCUlJQ19TVEFURV9TVE9QCit9OworCitzdHJ1Y3Qgc29sb19wMm1fZGV2IHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0aW9uOworCWludAkJCWVycm9yOworCXU4CQkJZGVzY1tTT0xPX1AyTV9ERVNDX1NJWkVdOworfTsKKworI2RlZmluZSBPU0RfVEVYVF9NQVgJCTMwCisKK2VudW0gc29sb19lbmNfdHlwZXMgeworCVNPTE9fRU5DX1RZUEVfU1RELAorCVNPTE9fRU5DX1RZUEVfRVhULAorfTsKKworc3RydWN0IHNvbG9fZW5jX2RldiB7CisJc3RydWN0IHNvbG82MDEwX2Rldgkqc29sb19kZXY7CisJLyogVjRMMiBJdGVtcyAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UJKnZmZDsKKwkvKiBHZW5lcmFsIGFjY291bnRpbmcgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl0aHJlYWRfd2FpdDsKKwlzcGlubG9ja190CQlsb2NrOworCWF0b21pY190CQlyZWFkZXJzOworCXU4CQkJY2g7CisJdTgJCQltb2RlLCBnb3AsIHFwLCBpbnRlcmxhY2VkLCBpbnRlcnZhbDsKKwl1OAkJCXJlc2V0X2dvcDsKKwl1OAkJCWJ3X3dlaWdodDsKKwl1OAkJCW1vdGlvbl9kZXRlY3RlZDsKKwl1MTYJCQltb3Rpb25fdGhyZXNoOworCXUxNgkJCXdpZHRoOworCXUxNgkJCWhlaWdodDsKKwljaGFyCQkJb3NkX3RleHRbT1NEX1RFWFRfTUFYICsgMV07Cit9OworCitzdHJ1Y3Qgc29sb19lbmNfYnVmIHsKKwl1OAkJCXZvcDsKKwl1OAkJCWNoOworCWVudW0gc29sb19lbmNfdHlwZXMJdHlwZTsKKwl1MzIJCQlvZmY7CisJdTMyCQkJc2l6ZTsKKwl1MzIJCQlqcGVnX29mZjsKKwl1MzIJCQlqcGVnX3NpemU7CisJc3RydWN0IHRpbWV2YWwJCXRzOworfTsKKworLyogVGhlIFNPTE82MDEwIFBDSSBEZXZpY2UgKi8KK3N0cnVjdCBzb2xvNjAxMF9kZXYgeworCS8qIEdlbmVyYWwgc3R1ZmYgKi8KKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJdTggX19pb21lbQkJKnJlZ19iYXNlOworCWludAkJCW5yX2NoYW5zOworCWludAkJCW5yX2V4dDsKKwl1MzIJCQlpcnFfbWFzazsKKwl1MzIJCQltb3Rpb25fbWFzazsKKwlzcGlubG9ja190CQlyZWdfaW9fbG9jazsKKworCS8qIHR3Mjh4eCBhY2NvdW50aW5nICovCisJdTgJCQl0dzI4NjUsIHR3Mjg2NCwgdHcyODE1OworCXU4CQkJdHcyOF9jbnQ7CisKKwkvKiBpMmMgcmVsYXRlZCBpdGVtcyAqLworCXN0cnVjdCBpMmNfYWRhcHRlcglpMmNfYWRhcFtTT0xPX0kyQ19BREFQVEVSU107CisJZW51bSBTT0xPX0kyQ19TVEFURQlpMmNfc3RhdGU7CisJc3RydWN0IHNlbWFwaG9yZQlpMmNfc2VtOworCWludAkJCWkyY19pZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlpMmNfd2FpdDsKKwlzdHJ1Y3QgaTJjX21zZwkJKmkyY19tc2c7CisJdW5zaWduZWQgaW50CQlpMmNfbXNnX251bTsKKwl1bnNpZ25lZCBpbnQJCWkyY19tc2dfcHRyOworCisJLyogUDJNIERNQSBFbmdpbmUgKi8KKwlzdHJ1Y3Qgc29sb19wMm1fZGV2CXAybV9kZXZbU09MT19OUl9QMk1dOworCisJLyogVjRMMiBEaXNwbGF5IGl0ZW1zICovCisJc3RydWN0IHZpZGVvX2RldmljZQkqdmZkOworCXVuc2lnbmVkIGludAkJZXJhc2luZzsKKwl1bnNpZ25lZCBpbnQJCWZyYW1lX2JsYW5rOworCXU4CQkJY3VyX2Rpc3BfY2g7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZGlzcF90aHJlYWRfd2FpdDsKKworCS8qIFY0TDIgRW5jb2RlciBpdGVtcyAqLworCXN0cnVjdCBzb2xvX2VuY19kZXYJKnY0bDJfZW5jW1NPTE9fTUFYX0NIQU5ORUxTXTsKKwl1MTYJCQllbmNfYndfcmVtYWluOworCS8qIElEWCBpbnRvIGh3IG1wNCBlbmNvZGVyICovCisJdTgJCQllbmNfaWR4OworCS8qIE91ciBzb2Z0d2FyZSByaW5nIG9mIGVuYyBidWYgcmVmZXJlbmNlcyAqLworCXUxNgkJCWVuY193cl9pZHg7CisJc3RydWN0IHNvbG9fZW5jX2J1ZgllbmNfYnVmW1NPTE9fTlJfUklOR19CVUZTXTsKKworCS8qIEN1cnJlbnQgdmlkZW8gc2V0dGluZ3MgKi8KKwl1MzIgCQkJdmlkZW9fdHlwZTsKKwl1MTYJCQl2aWRlb19oc2l6ZSwgdmlkZW9fdnNpemU7CisJdTE2CQkJdm91dF9oc3RhcnQsIHZvdXRfdnN0YXJ0OworCXUxNgkJCXZpbl9oc3RhcnQsIHZpbl92c3RhcnQ7CisJdTgJCQlmcHM7CisKKwkvKiBBdWRpbyBjb21wb25lbnRzICovCisJc3RydWN0IHNuZF9jYXJkCQkqc25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20JCSpzbmRfcGNtOworCWF0b21pY190CQlzbmRfdXNlcnM7CisJaW50CQkJZzcyM19od19pZHg7Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBzb2xvX3JlZ19yZWFkKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJldDsKKwl1MTYgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvbG9fZGV2LT5yZWdfaW9fbG9jaywgZmxhZ3MpOworCisJcmV0ID0gcmVhZGwoc29sb19kZXYtPnJlZ19iYXNlICsgcmVnKTsKKwlybWIoKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChzb2xvX2Rldi0+cGRldiwgUENJX1NUQVRVUywgJnZhbCk7CisJcm1iKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2xvX2Rldi0+cmVnX2lvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2xvX3JlZ193cml0ZShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IHJlZywKKwkJCQkgICAgICB1MzIgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc29sb19kZXYtPnJlZ19pb19sb2NrLCBmbGFncyk7CisKKwl3cml0ZWwoZGF0YSwgc29sb19kZXYtPnJlZ19iYXNlICsgcmVnKTsKKwl3bWIoKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChzb2xvX2Rldi0+cGRldiwgUENJX1NUQVRVUywgJnZhbCk7CisJcm1iKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2xvX2Rldi0+cmVnX2lvX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzb2xvNjAxMF9pcnFfb24oc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHUzMiBtYXNrKTsKK3ZvaWQgc29sbzYwMTBfaXJxX29mZihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTMyIG1hc2spOworCisvKiBJbml0L2V4aXQgcm91dGVpbmVzIGZvciBzdWJzeXN0ZW1zICovCitpbnQgc29sb19kaXNwX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOwordm9pZCBzb2xvX2Rpc3BfZXhpdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2Rldik7CisKK2ludCBzb2xvX2dwaW9faW5pdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2Rldik7Cit2b2lkIHNvbG9fZ3Bpb19leGl0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKKworaW50IHNvbG9faTJjX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOwordm9pZCBzb2xvX2kyY19leGl0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKKworaW50IHNvbG9fcDJtX2luaXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOwordm9pZCBzb2xvX3AybV9leGl0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKKworaW50IHNvbG9fdjRsMl9pbml0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKK3ZvaWQgc29sb192NGwyX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOworCitpbnQgc29sb19lbmNfaW5pdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2Rldik7Cit2b2lkIHNvbG9fZW5jX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOworCitpbnQgc29sb19lbmNfdjRsMl9pbml0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKK3ZvaWQgc29sb19lbmNfdjRsMl9leGl0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKKworaW50IHNvbG9fZzcyM19pbml0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKK3ZvaWQgc29sb19nNzIzX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOworCisvKiBJU1IncyAqLworaW50IHNvbG9faTJjX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2Rldik7Cit2b2lkIHNvbG9fcDJtX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IGlkKTsKK3ZvaWQgc29sb19wMm1fZXJyb3JfaXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1MzIgc3RhdHVzKTsKK3ZvaWQgc29sb19lbmNfdjRsMl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOwordm9pZCBzb2xvX2c3MjNfaXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKK3ZvaWQgc29sb19tb3Rpb25faXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KTsKK3ZvaWQgc29sb192aWRlb19pbl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpOworCisvKiBpMmMgcmVhZC93cml0ZSAqLwordTggc29sb19pMmNfcmVhZGJ5dGUoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGludCBpZCwgdTggYWRkciwgdTggb2ZmKTsKK3ZvaWQgc29sb19pMmNfd3JpdGVieXRlKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBpbnQgaWQsIHU4IGFkZHIsIHU4IG9mZiwKKwkJCXU4IGRhdGEpOworCisvKiBQMk0gRE1BICovCitpbnQgc29sb19wMm1fZG1hX3Qoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGlkLCBpbnQgd3IsCisJCSAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHUzMiBleHRfYWRkciwgdTMyIHNpemUpOworaW50IHNvbG9fcDJtX2RtYShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsIGludCB3ciwKKwkJIHZvaWQgKnN5c19hZGRyLCB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKTsKKworLyogU2V0IHRoZSB0aHJlc2hvbGQgZm9yIG1vdGlvbiBkZXRlY3Rpb24gKi8KK3ZvaWQgc29sb19zZXRfbW90aW9uX3RocmVzaG9sZChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gsIHUxNiB2YWwpOworI2RlZmluZSBTT0xPX0RFRl9NT1RfVEhSRVNICQkweDAzMDAKKworLyogV3JpdGUgdGV4dCBvbiBPU0QgKi8KK2ludCBzb2xvX29zZF9wcmludChzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyk7CisKKyNlbmRpZiAvKiBfX1NPTE82MDEwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmZmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9LY29uZmlnCkBAIC0wLDAgKzEsNDAgQEAKKworbWVudWNvbmZpZyBTUEVDVFJBCisJdHJpc3RhdGUgIkRlbmFsaSBTcGVjdHJhIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyIgorCWRlcGVuZHMgb24gQkxPQ0sKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgdGhlIEZUTCBwc2V1ZG8tZmlsZXN5c3RlbSB1c2VkIHdpdGggdGhlIE5BTkQgRmxhc2gKKwkgIGNvbnRyb2xsZXIgb24gSW50ZWwgTW9vcmVzdG93biBQbGF0Zm9ybSB0byBwcmV0ZW5kIHRvIGJlIGEgZGlzaworCitjaG9pY2UKKwlwcm9tcHQgIkNvbXBpbGUgZm9yIgorCWRlcGVuZHMgb24gU1BFQ1RSQQorCWRlZmF1bHQgU1BFQ1RSQV9NUlNUX0hXCisKK2NvbmZpZyBTUEVDVFJBX01SU1RfSFcKKwlib29sICJNb29yZXN0b3duIGhhcmR3YXJlIG1vZGUiCisJaGVscAorCSAgRHJpdmVyIGNvbW11bmljYXRlcyB3aXRoIHRoZSBNb29yZXN0b3duIGhhcmR3YXJlJ3MgcmVnaXN0ZXIgaW50ZXJmYWNlLgorCSAgaW4gRE1BIG1vZGUuCisKK2NvbmZpZyBTUEVDVFJBX01URAorCWJvb2wgIkxpbnV4IE1URCBtb2RlIgorCWRlcGVuZHMgb24gTVRECisJaGVscAorCSAgRHJpdmVyIGNvbW11bmljYXRlcyB3aXRoIHRoZSBrZXJuZWwgTVREIHN1YnN5c3RlbSBpbnN0ZWFkIG9mIGl0cyBvd24KKwkgIGJ1aWx0LWluIGhhcmR3YXJlIGRyaXZlci4KKworY29uZmlnIFNQRUNUUkFfRU1VCisJYm9vbCAiUkFNIGVtdWxhdG9yIHRlc3RpbmciCisJaGVscAorCSAgRHJpdmVyIGVtdWxhdGVzIEZsYXNoIG9uIGEgUkFNIGJ1ZmZlciBhbmQgLyBvciBkaXNrIGZpbGUuICBVc2VmdWwgdG8gdGVzdCB0aGUgYmVoYXZpb3Igb2YgRlRMIGxheWVyLgorCitlbmRjaG9pY2UKKworY29uZmlnIFNQRUNUUkFfTVJTVF9IV19ETUEKKyAgICAgICBib29sCisgICAgICAgZGVmYXVsdCBuCisgICAgICAgZGVwZW5kcyBvbiBTUEVDVFJBX01SU1RfSFcKKyAgICAgICBoZWxwCisgICAgICAgICBVc2UgRE1BIGZvciBuYXRpdmUgaGFyZHdhcmUgaW50ZXJmYWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc3ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBvZiBJbnRlbCBNb29yZXN0b3duIE5BTkQgY29udHJvbGxlciBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX1NQRUNUUkEpICs9IHNwZWN0cmEubworc3BlY3RyYS15IDo9IGZmc3BvcnQubyBmbGFzaC5vIGxsZC5vCitzcGVjdHJhLSQoQ09ORklHX1NQRUNUUkFfTVJTVF9IVykgKz0gbGxkX25hbmQubyAKK3NwZWN0cmEtJChDT05GSUdfU1BFQ1RSQV9NUlNUX0hXX0RNQSkgKz0gbGxkX2NkbWEubworc3BlY3RyYS0kKENPTkZJR19TUEVDVFJBX0VNVSkgKz0gbGxkX2VtdS5vCitzcGVjdHJhLSQoQ09ORklHX1NQRUNUUkFfTVREKSArPSBsbGRfbXRkLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmE1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9SRUFETUUKQEAgLTAsMCArMSwyOSBAQAorVGhpcyBpcyBhIGRyaXZlciBmb3IgTkFORCBjb250cm9sbGVyIG9mIEludGVsIE1vb3Jlc3Rvd24gcGxhdGZvcm0uCisKK1RoaXMgZHJpdmVyIGlzIGEgc3RhbmRhbG9uZSBsaW51eCBibG9jayBkZXZpY2UgZHJpdmVyLCBpdCBhY3RzIGFzIGlmIGl0J3MgYSBub3JtYWwgaGFyZCBkaXNrLgorSXQgaW5jbHVkZXMgdGhyZWUgbGF5ZXI6CisJYmxvY2sgbGF5ZXIgaW50ZXJmYWNlIC0gZmlsZSBmZnNwb3J0LmMKKwlGbGFzaCBUcmFuc2xhdGlvbiBMYXllciAoRlRMKSAtIGZpbGUgZmxhc2guYyAoaW1wbGVtZW50IHRoZSBOQU5EIGZsYXNoIFRyYW5zbGF0aW9uIExheWVyLCBpbmNsdWRzIGFkZHJlc3MgbWFwcGluZywgZ2FyYmFnZSBjb2xsZWN0aW9uLCB3ZWFyLWxldmVsaW5nIGFuZCBzbyBvbikKKwlMb3cgbGV2ZWwgbGF5ZXIgLSBmaWxlIGxsZF9uYW5kLmMvbGxkX2NkbWEuYy9sbGRfZW11LmMgKHdoaWNoIGltcGxlbWVudHMgYWN0dWFsIGNvbnRyb2xsZXIgaGFyZHdhcmUgcmVnaXN0ZXJzIGFjY2VzcykKKworVGhpcyBkcml2ZXIgY2FuIGJlIGJ1aWxkIGFzIG1vZHVsZXMgb3IgYnVpbGQtaW4uCisKK0RlcGVuZGVuY3k6CitUaGlzIGRyaXZlciBoYXMgZGVwZW5kZW5jeSBvbiBJQSBGaXJtd2FyZSBvZiBJbnRlbCBNb29yZXN0b3duIHBsYXRmb3JtLgorSXQgbmVlZCB0aGUgSUEgRmlybXdhcmUgdG8gY3JlYXRlIHRoZSBibG9jayB0YWJsZSBmb3IgdGhlIGZpcnN0IHRpbWUuCitBbmQgdG8gdmFsaWRhdGUgdGhpcyBkcml2ZXIgY29kZSB3aXRob3V0IElBIEZpcm13YXJlLCB5b3UgY2FuIGNoYW5nZSB0aGUKK21hY3JvIEFVVE9fRk9STUFUX0ZMQVNIIGZyb20gMCB0byAxIGluIGZpbGUgc3BlY3RyYXN3Y29uZmlnLmguIFRodXMgdGhlCitkcml2ZXIgd2lsbCBlcmFzZSB0aGUgd2hvbGUgbmFuZCBmbGFzaCBhbmQgY3JlYXRlIGEgbmV3IGJsb2NrIHRhYmxlLgorCitUT0RPOgorCS0gRW5hYmxlIENvbW1hbmQgRE1BIGZlYXR1cmUgc3VwcG9ydAorCS0gbG93ZXIgdGhlIG1lbW9yeSBmb290cHJpbnQKKwktIFJlbW92ZSBtb3N0IG9mIHRoZSB1bm5lY2Vzc2FyeSBnbG9iYWwgdmFyaWFibGVzCisJLSBDaGFuZ2UgYWxsIHRoZSB1cGNhc2UgdmFyaWFibGUgLyBmdW5jdGlvbnMgbmFtZSB0byBsb3dlcmNhc2UKKwktIFNvbWUgb3RoZXIgbWlzYyBidWdzCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG86CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKworQW5kIENjIHRvOiBHYW8gWXVucGVuZyA8eXVucGVuZy5nYW9AaW50ZWwuY29tPgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllOWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc2RlZnMuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRkZTREVGU18KKyNkZWZpbmUgX0ZGU0RFRlNfCisKKyNkZWZpbmUgQ0xFQVIgMAkJCS8qdXNlIHRoaXMgdG8gY2xlYXIgYSBmaWVsZCBpbnN0ZWFkIG9mICJmYWlsIiovCisjZGVmaW5lIFNFVCAgIDEJCQkvKnVzZSB0aGlzIHRvIHNldCBhIGZpZWxkIGluc3RlYWQgb2YgInBhc3MiKi8KKyNkZWZpbmUgRkFJTCAxCQkJLypmYWlsZWQgZmxhZyovCisjZGVmaW5lIFBBU1MgMAkJCS8qc3VjY2VzcyBmbGFnKi8KKyNkZWZpbmUgRVJSIC0xCQkJLyplcnJvciBmbGFnKi8KKworI2RlZmluZSAgIEVSQVNFX0NNRCAgICAgICAgICAgICAxMAorI2RlZmluZSAgIFdSSVRFX01BSU5fQ01EICAgICAgICAxMQorI2RlZmluZSAgIFJFQURfTUFJTl9DTUQgICAgICAgICAxMgorI2RlZmluZSAgIFdSSVRFX1NQQVJFX0NNRCAgICAgICAxMworI2RlZmluZSAgIFJFQURfU1BBUkVfQ01EICAgICAgICAxNAorI2RlZmluZSAgIFdSSVRFX01BSU5fU1BBUkVfQ01EICAxNQorI2RlZmluZSAgIFJFQURfTUFJTl9TUEFSRV9DTUQgICAxNgorI2RlZmluZSAgIE1FTUNPUFlfQ01EICAgICAgICAgICAxNworI2RlZmluZSAgIERVTU1ZX0NNRCAgICAgICAgICAgICA5OQorCisjZGVmaW5lICAgICBFVkVOVF9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIEVWRU5UX0NPUlJFQ1RBQkxFX0RBVEFfRVJST1JfRklYRUQgICAgICAgICAweDAxCisjZGVmaW5lICAgICBFVkVOVF9VTkNPUlJFQ1RBQkxFX0RBVEFfRVJST1IgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgIEVWRU5UX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSAgICAgRVZFTlRfUFJPR1JBTV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICAgICBFVkVOVF9FUkFTRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgICAgIEVWRU5UX01FTUNPUFlfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgICAgRVZFTlRfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3CisKKyNkZWZpbmUgICAgIEVWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSAgICAgRVZFTlRfRE1BX0NNRF9DT01QICAgICAgICAgICAgICAgICAgICAgICAgICAweDc3CisjZGVmaW5lICAgICBFVkVOVF9FQ0NfVFJBTlNBQ1RJT05fRE9ORSAgICAgICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgICAgIEVWRU5UX0RNQV9DTURfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5OQorCisjZGVmaW5lIENNRF9QQVNTICAgICAgICAwCisjZGVmaW5lIENNRF9GQUlMICAgICAgICAxCisjZGVmaW5lIENNRF9BQk9SVCAgICAgICAyCisjZGVmaW5lIENNRF9OT1RfRE9ORSAgICAzCisKKyNlbmRpZiAvKiBfRkZTREVGU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM1Yzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5jCkBAIC0wLDAgKzEsODI3IEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImZmc3BvcnQuaCIKKyNpbmNsdWRlICJmbGFzaC5oIgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKy8qKioqIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgRGl2LCBSZW1haW5kZXIgb3BlcmF0aW9uIG9uIHU2NCAqKioqLworCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBHTE9CX0NhbGNfVXNlZF9CaXRzCisqIElucHV0czogICAgICAgUG93ZXIgb2YgMiBudW1iZXIKKyogT3V0cHV0czogICAgICBOdW1iZXIgb2YgVXNlZCBCaXRzCisqICAgICAgICAgICAgICAgMCwgaWYgdGhlIGFyZ3VtZW50IGlzIDAKKyogRGVzY3JpcHRpb246ICBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgYSBnaXZlbiBwb3dlciBvZiAyIG51bWJlcgorKiAgICAgICAgICAgICAgIE51bWJlciBjYW4gYmUgdXB0byAzMiBiaXQKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9DYWxjX1VzZWRfQml0cyh1MzIgbikKK3sKKwlpbnQgdG90X2JpdHMgPSAwOworCisJaWYgKG4gPj0gMSA8PCAxNikgeworCQluID4+PSAxNjsKKwkJdG90X2JpdHMgKz0gMTY7CisJfQorCisJaWYgKG4gPj0gMSA8PCA4KSB7CisJCW4gPj49ICA4OworCQl0b3RfYml0cyArPSAgODsKKwl9CisKKwlpZiAobiA+PSAxIDw8IDQpIHsKKwkJbiA+Pj0gIDQ7CisJCXRvdF9iaXRzICs9ICA0OworCX0KKworCWlmIChuID49IDEgPDwgMikgeworCQluID4+PSAgMjsKKwkJdG90X2JpdHMgKz0gIDI7CisJfQorCisJaWYgKG4gPj0gMSA8PCAxKQorCQl0b3RfYml0cyArPSAgMTsKKworCXJldHVybiAoKG4gPT0gMCkgPyAoMCkgOiB0b3RfYml0cyk7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfdTY0X0RpdgorKiBJbnB1dHM6ICAgICAgIE51bWJlciBvZiB1NjQKKyogICAgICAgICAgICAgICBBIHBvd2VyIG9mIDIgbnVtYmVyIGFzIERpdmlzaW9uCisqIE91dHB1dHM6ICAgICAgUXVvdGllbnQgb2YgdGhlIERpdmlzb3Igb3BlcmF0aW9uCisqIERlc2NyaXB0aW9uOiAgSXQgZGl2aWRlcyB0aGUgYWRkcmVzcyBieSBkaXZpc29yIGJ5IHVzaW5nIGJpdCBzaGlmdCBvcGVyYXRpb24KKyogICAgICAgICAgICAgICAoZXNzZW50aWFsbHkgd2l0aG91dCBleHBsaWNpdGVseSB1c2luZyAiLyIpLgorKiAgICAgICAgICAgICAgIERpdmlzb3IgaXMgYSBwb3dlciBvZiAyIG51bWJlciBhbmQgRGl2aWRlZCBpcyBvZiB1NjQKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1NjQgR0xPQl91NjRfRGl2KHU2NCBhZGRyLCB1MzIgZGl2aXNvcikKK3sKKwlyZXR1cm4gICh1NjQpKGFkZHIgPj4gR0xPQl9DYWxjX1VzZWRfQml0cyhkaXZpc29yKSk7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfdTY0X1JlbWFpbmRlcgorKiBJbnB1dHM6ICAgICAgIE51bWJlciBvZiB1NjQKKyogICAgICAgICAgICAgICBEaXZpc29yIFR5cGUgKDEgLVBhZ2VBZGRyZXNzLCAyLSBCbG9ja0FkZHJlc3MpCisqIE91dHB1dHM6ICAgICAgUmVtYWluZGVyIG9mIHRoZSBEaXZpc2lvbiBvcGVyYXRpb24KKyogRGVzY3JpcHRpb246ICBJdCBjYWxjdWxhdGVzIHRoZSByZW1haW5kZXIgb2YgYSBudW1iZXIgKG9mIHU2NCkgYnkKKyogICAgICAgICAgICAgICBkaXZpc29yKHBvd2VyIG9mIDIgbnVtYmVyICkgYnkgdXNpbmcgYml0IHNoaWZ0aW5nIGFuZCBtdWx0aXBseQorKiAgICAgICAgICAgICAgIG9wZXJhdGlvbihlc3NlbnRpYWxseSB3aXRob3V0IGV4cGxpY2l0ZWx5IHVzaW5nICIvIikuCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTY0IEdMT0JfdTY0X1JlbWFpbmRlcih1NjQgYWRkciwgdTMyIGRpdmlzb3JfdHlwZSkKK3sKKwl1NjQgcmVzdWx0ID0gMDsKKworCWlmIChkaXZpc29yX3R5cGUgPT0gMSkgeyAvKiBSZW1haW5kZXIgLS0gUGFnZSAqLworCQlyZXN1bHQgPSAoYWRkciA+PiBEZXZpY2VJbmZvLm5CaXRzSW5QYWdlRGF0YVNpemUpOworCQlyZXN1bHQgPSByZXN1bHQgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJfSBlbHNlIGlmIChkaXZpc29yX3R5cGUgPT0gMikgeyAvKiBSZW1haW5kZXIgLS0gQmxvY2sgKi8KKwkJcmVzdWx0ID0gKGFkZHIgPj4gRGV2aWNlSW5mby5uQml0c0luQmxvY2tEYXRhU2l6ZSk7CisJCXJlc3VsdCA9IHJlc3VsdCAqIERldmljZUluZm8ud0Jsb2NrRGF0YVNpemU7CisJfQorCisJcmVzdWx0ID0gYWRkciAtIHJlc3VsdDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgTlVNX0RFVklDRVMgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJUSVRJT05TICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgR0xPQl9TQkRfTkFNRSAgICAgICAgICAibmQiCisjZGVmaW5lIEdMT0JfU0JEX0lSUV9OVU0gICAgICAgKDI5KQorI2RlZmluZSBHTE9CX1ZFUlNJT04JCSJkcml2ZXIgdmVyc2lvbiAyMDA5MTExMCIKKworI2RlZmluZSBHTE9CX1NCRF9JT0NUTF9HQyAgICAgICAgICAgICAgICAgICAgICAgICgweDc3MDEpCisjZGVmaW5lIEdMT0JfU0JEX0lPQ1RMX1dMICAgICAgICAgICAgICAgICAgICAgICAgKDB4NzcwMikKKyNkZWZpbmUgR0xPQl9TQkRfSU9DVExfRk9STUFUICAgICAgICAgICAgICAgICAgICAoMHg3NzAzKQorI2RlZmluZSBHTE9CX1NCRF9JT0NUTF9FUkFTRV9GTEFTSCAgICAgICAgICAgICAgICgweDc3MDQpCisjZGVmaW5lIEdMT0JfU0JEX0lPQ1RMX0ZMVVNIX0NBQ0hFICAgICAgICAgICAgICAgKDB4NzcwNSkKKyNkZWZpbmUgR0xPQl9TQkRfSU9DVExfQ09QWV9CTEtfVEFCTEUgICAgICAgICAgICAoMHg3NzA2KQorI2RlZmluZSBHTE9CX1NCRF9JT0NUTF9DT1BZX1dFQVJfTEVWRUxJTkdfVEFCTEUgICgweDc3MDcpCisjZGVmaW5lIEdMT0JfU0JEX0lPQ1RMX0dFVF9OQU5EX0lORk8gICAgICAgICAgICAgKDB4NzcwOCkKKyNkZWZpbmUgR0xPQl9TQkRfSU9DVExfV1JJVEVfREFUQSAgICAgICAgICAgICAgICAoMHg3NzA5KQorI2RlZmluZSBHTE9CX1NCRF9JT0NUTF9SRUFEX0RBVEEgICAgICAgICAgICAgICAgICgweDc3MEEpCisKK3N0YXRpYyBpbnQgcmVzZXJ2ZWRfbWIgPSAwOworbW9kdWxlX3BhcmFtKHJlc2VydmVkX21iLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXNlcnZlZF9tYiwgIlJlc2VydmVkIHNwYWNlIGZvciBPUyBpbWFnZSwgaW4gTWlCIChkZWZhdWx0IDI1IE1pQikiKTsKKworaW50IG5hbmRfZGVidWdfbGV2ZWw7Cittb2R1bGVfcGFyYW0obmFuZF9kZWJ1Z19sZXZlbCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobmFuZF9kZWJ1Z19sZXZlbCwgImRlYnVnIGxldmVsIHZhbHVlOiAxLTMiKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3Qgc3BlY3RyYV9uYW5kX2RldiB7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwl1NjQgc2l6ZTsKKwl1MTYgdXNlcnM7CisJc3BpbmxvY2tfdCBxbG9jazsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsgIC8qIE1hcHBlZCBhZGRyZXNzICovCisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXN0cnVjdCBnZW5kaXNrICpnZDsKKwl1OCAqdG1wX2J1ZjsKK307CisKKworc3RhdGljIGludCBHTE9CX1NCRF9tYWpvcm51bTsKKworc3RhdGljIGNoYXIgKkdMT0JfdmVyc2lvbiA9IEdMT0JfVkVSU0lPTjsKKworc3RhdGljIHN0cnVjdCBzcGVjdHJhX25hbmRfZGV2IG5hbmRfZGV2aWNlW05VTV9ERVZJQ0VTXTsKKworc3RhdGljIHN0cnVjdCBtdXRleCBzcGVjdHJhX2xvY2s7CisKK3N0YXRpYyBpbnQgcmVzX2Jsa3Nfb3MgPSAxOworCitzdHJ1Y3Qgc3BlY3RyYV9pbmRlbnRmeV9kZXZfdGFnIElkZW50aWZ5RGV2aWNlRGF0YTsKKworc3RhdGljIGludCBmb3JjZV9mbHVzaF9jYWNoZSh2b2lkKQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoRVJSID09IEdMT0JfRlRMX0ZsdXNoX0NhY2hlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIEZsdXNoIEZUTCBDYWNoZSFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisjaWYgQ01EX0RNQQorCQlpZiAoZ2xvYl9mdGxfZXhlY3V0ZV9jbWRzKCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlvY3RsX3J3X3BhZ2VfaW5mbyB7CisJdTggKmRhdGE7CisJdW5zaWduZWQgaW50IHBhZ2U7Cit9OworCitzdGF0aWMgaW50IGlvY3RsX3JlYWRfcGFnZV9kYXRhKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXU4ICpidWY7CisJc3RydWN0IGlvY3RsX3J3X3BhZ2VfaW5mbyBpbmZvOworCWludCByZXN1bHQgPSBQQVNTOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJYnVmID0ga21hbGxvYyhJZGVudGlmeURldmljZURhdGEuUGFnZURhdGFTaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgImlvY3RsX3JlYWRfcGFnZV9kYXRhOiAiCisJCSAgICAgICAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW11dGV4X2xvY2soJnNwZWN0cmFfbG9jayk7CisJcmVzdWx0ID0gR0xPQl9GVExfUGFnZV9SZWFkKGJ1ZiwKKwkJKHU2NClpbmZvLnBhZ2UgKiBJZGVudGlmeURldmljZURhdGEuUGFnZURhdGFTaXplKTsKKwltdXRleF91bmxvY2soJnNwZWN0cmFfbG9jayk7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWluZm8uZGF0YSwgYnVmLAorCQkJICAgSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpb2N0bF9yZWFkX3BhZ2VfZGF0YTogIgorCQkgICAgICAgImZhaWxlZCB0byBjb3B5IHVzZXIgZGF0YVxuIik7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBpb2N0bF93cml0ZV9wYWdlX2RhdGEodW5zaWduZWQgbG9uZyBhcmcpCit7CisJdTggKmJ1ZjsKKwlzdHJ1Y3QgaW9jdGxfcndfcGFnZV9pbmZvIGluZm87CisJaW50IHJlc3VsdCA9IFBBU1M7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlidWYgPSBrbWFsbG9jKElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemUsIEdGUF9BVE9NSUMpOworCWlmICghYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW9jdGxfd3JpdGVfcGFnZV9kYXRhOiAiCisJCSAgICAgICAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsICh2b2lkIF9fdXNlciAqKWluZm8uZGF0YSwKKwkJCSAgIElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW9jdGxfd3JpdGVfcGFnZV9kYXRhOiAiCisJCSAgICAgICAiZmFpbGVkIHRvIGNvcHkgdXNlciBkYXRhXG4iKTsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbXV0ZXhfbG9jaygmc3BlY3RyYV9sb2NrKTsKKwlyZXN1bHQgPSBHTE9CX0ZUTF9QYWdlX1dyaXRlKGJ1ZiwKKwkJKHU2NClpbmZvLnBhZ2UgKiBJZGVudGlmeURldmljZURhdGEuUGFnZURhdGFTaXplKTsKKwltdXRleF91bmxvY2soJnNwZWN0cmFfbG9jayk7CisKKwlrZnJlZShidWYpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFJldHVybiBob3cgbWFueSBibG9ja3Mgc2hvdWxkIGJlIHJlc2VydmVkIGZvciBiYWQgYmxvY2sgcmVwbGFjZW1lbnQgKi8KK3N0YXRpYyBpbnQgZ2V0X3Jlc19ibGtfbnVtX2JhZF9ibGsodm9pZCkKK3sKKwlyZXR1cm4gSWRlbnRpZnlEZXZpY2VEYXRhLndEYXRhQmxvY2tOdW0gLyAxMDsKK30KKworLyogUmV0dXJuIGhvdyBtYW55IGJsb2NrcyBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIE9TIGltYWdlICovCitzdGF0aWMgaW50IGdldF9yZXNfYmxrX251bV9vcyh2b2lkKQoreworCXUzMiByZXNfYmxrcywgYmxrX3NpemU7CisKKwlibGtfc2l6ZSA9IElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemUgKgorCQlJZGVudGlmeURldmljZURhdGEuUGFnZXNQZXJCbG9jazsKKworCXJlc19ibGtzID0gKHJlc2VydmVkX21iICogMTAyNCAqIDEwMjQpIC8gYmxrX3NpemU7CisKKwlpZiAoKHJlc19ibGtzIDwgMSkgfHwgKHJlc19ibGtzID49IElkZW50aWZ5RGV2aWNlRGF0YS53RGF0YUJsb2NrTnVtKSkKKwkJcmVzX2Jsa3MgPSAxOyAvKiBSZXNlcnZlZCAxIGJsb2NrIGZvciBibG9jayB0YWJsZSAqLworCisJcmV0dXJuIHJlc19ibGtzOworfQorCitzdGF0aWMgdm9pZCBTQkRfcHJlcGFyZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0xJTlVYX0JMT0NLOworCS8qIHJxLT50aW1lb3V0ID0gNSAqIEhaOyAqLworCXJxLT5jbWRbMF0gPSBSRVFfTEJfT1BfRkxVU0g7Cit9CisKKy8qIFRyYW5zZmVyIGEgZnVsbCByZXF1ZXN0LiAqLworc3RhdGljIGludCBkb190cmFuc2ZlcihzdHJ1Y3Qgc3BlY3RyYV9uYW5kX2RldiAqdHIsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJdTY0IHN0YXJ0X2FkZHIsIGFkZHI7CisJdTMyIGxvZ2ljYWxfc3RhcnRfc2VjdCwgaGRfc3RhcnRfc2VjdDsKKwl1MzIgbnNlY3QsIGhkX3NlY3RzOworCXUzMiByc2VjdCwgdHNlY3QgPSAwOworCWNoYXIgKmJ1ZjsKKwl1MzIgcmF0aW8gPSBJZGVudGlmeURldmljZURhdGEuUGFnZURhdGFTaXplID4+IDk7CisKKwlzdGFydF9hZGRyID0gKHU2NCkoYmxrX3JxX3BvcyhyZXEpKSA8PCA5OworCS8qIEFkZCBhIGJpZyBlbm91Z2ggb2Zmc2V0IHRvIHByZXZlbnQgdGhlIE9TIEltYWdlIGZyb20KKwkqICBiZWluZyBhY2Nlc3NlZCBvciBkYW1hZ2VkIGJ5IGZpbGUgc3lzdGVtICovCisJc3RhcnRfYWRkciArPSBJZGVudGlmeURldmljZURhdGEuUGFnZURhdGFTaXplICoKKwkJCUlkZW50aWZ5RGV2aWNlRGF0YS5QYWdlc1BlckJsb2NrICoKKwkJCXJlc19ibGtzX29zOworCisJaWYgKHJlcS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfTElOVVhfQkxPQ0sgJiYKKwkJCXJlcS0+Y21kWzBdID09IFJFUV9MQl9PUF9GTFVTSCkgeworCQlpZiAoZm9yY2VfZmx1c2hfY2FjaGUoKSkgLyogRmFpbCB0byBmbHVzaCBjYWNoZSAqLworCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWlmIChyZXEtPmNtZF90eXBlICE9IFJFUV9UWVBFX0ZTKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChibGtfcnFfcG9zKHJlcSkgKyBibGtfcnFfY3VyX3NlY3RvcnMocmVxKSA+IGdldF9jYXBhY2l0eSh0ci0+Z2QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYSBlcnJvcjogcmVxdWVzdCBvdmVyIHRoZSBOQU5EICIKKwkJCSJjYXBhY2l0eSFzZWN0b3IgJWQsIGN1cnJlbnRfbnJfc2VjdG9ycyAlZCwgIgorCQkJIndoaWxlIGNhcGFjaXR5IGlzICVkXG4iLAorCQkJKGludClibGtfcnFfcG9zKHJlcSksCisJCQlibGtfcnFfY3VyX3NlY3RvcnMocmVxKSwKKwkJCShpbnQpZ2V0X2NhcGFjaXR5KHRyLT5nZCkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsb2dpY2FsX3N0YXJ0X3NlY3QgPSBzdGFydF9hZGRyID4+IDk7CisJaGRfc3RhcnRfc2VjdCA9IGxvZ2ljYWxfc3RhcnRfc2VjdCAvIHJhdGlvOworCXJzZWN0ID0gbG9naWNhbF9zdGFydF9zZWN0IC0gaGRfc3RhcnRfc2VjdCAqIHJhdGlvOworCisJYWRkciA9ICh1NjQpaGRfc3RhcnRfc2VjdCAqIHJhdGlvICogNTEyOworCWJ1ZiA9IHJlcS0+YnVmZmVyOworCW5zZWN0ID0gYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSk7CisKKwlpZiAocnNlY3QpCisJCXRzZWN0ID0gIChyYXRpbyAtIHJzZWN0KSA8IG5zZWN0ID8gKHJhdGlvIC0gcnNlY3QpIDogbnNlY3Q7CisKKwlzd2l0Y2ggKHJxX2RhdGFfZGlyKHJlcSkpIHsKKwljYXNlIFJFQUQ6CisJCS8qIFJlYWQgdGhlIGZpcnN0IE5BTkQgcGFnZSAqLworCQlpZiAocnNlY3QpIHsKKwkJCWlmIChHTE9CX0ZUTF9QYWdlX1JlYWQodHItPnRtcF9idWYsIGFkZHIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiAlcywgTGluZSAlZFxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCW1lbWNweShidWYsIHRyLT50bXBfYnVmICsgKHJzZWN0IDw8IDkpLCB0c2VjdCA8PCA5KTsKKwkJCWFkZHIgKz0gSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZTsKKwkJCWJ1ZiArPSB0c2VjdCA8PCA5OworCQkJbnNlY3QgLT0gdHNlY3Q7CisJCX0KKworCQkvKiBSZWFkIHRoZSBvdGhlciBOQU5EIHBhZ2VzICovCisJCWZvciAoaGRfc2VjdHMgPSBuc2VjdCAvIHJhdGlvOyBoZF9zZWN0cyA+IDA7IGhkX3NlY3RzLS0pIHsKKwkJCWlmIChHTE9CX0ZUTF9QYWdlX1JlYWQoYnVmLCBhZGRyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gJXMsIExpbmUgJWRcbiIsCisJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlhZGRyICs9IElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemU7CisJCQlidWYgKz0gSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZTsKKwkJfQorCisJCS8qIFJlYWQgdGhlIGxhc3QgTkFORCBwYWdlcyAqLworCQlpZiAobnNlY3QgJSByYXRpbykgeworCQkJaWYgKEdMT0JfRlRMX1BhZ2VfUmVhZCh0ci0+dG1wX2J1ZiwgYWRkcikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluICVzLCBMaW5lICVkXG4iLAorCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJbWVtY3B5KGJ1ZiwgdHItPnRtcF9idWYsIChuc2VjdCAlIHJhdGlvKSA8PCA5KTsKKwkJfQorI2lmIENNRF9ETUEKKwkJaWYgKGdsb2JfZnRsX2V4ZWN1dGVfY21kcygpKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCXJldHVybiAwOworI2VuZGlmCisJCXJldHVybiAwOworCisJY2FzZSBXUklURToKKwkJLyogV3JpdGUgdGhlIGZpcnN0IE5BTkQgcGFnZSAqLworCQlpZiAocnNlY3QpIHsKKwkJCWlmIChHTE9CX0ZUTF9QYWdlX1JlYWQodHItPnRtcF9idWYsIGFkZHIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiAlcywgTGluZSAlZFxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCW1lbWNweSh0ci0+dG1wX2J1ZiArIChyc2VjdCA8PCA5KSwgYnVmLCB0c2VjdCA8PCA5KTsKKwkJCWlmIChHTE9CX0ZUTF9QYWdlX1dyaXRlKHRyLT50bXBfYnVmLCBhZGRyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gJXMsIExpbmUgJWRcbiIsCisJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlhZGRyICs9IElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemU7CisJCQlidWYgKz0gdHNlY3QgPDwgOTsKKwkJCW5zZWN0IC09IHRzZWN0OworCQl9CisKKwkJLyogV3JpdGUgdGhlIG90aGVyIE5BTkQgcGFnZXMgKi8KKwkJZm9yIChoZF9zZWN0cyA9IG5zZWN0IC8gcmF0aW87IGhkX3NlY3RzID4gMDsgaGRfc2VjdHMtLSkgeworCQkJaWYgKEdMT0JfRlRMX1BhZ2VfV3JpdGUoYnVmLCBhZGRyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gJXMsIExpbmUgJWRcbiIsCisJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlhZGRyICs9IElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemU7CisJCQlidWYgKz0gSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZTsKKwkJfQorCisJCS8qIFdyaXRlIHRoZSBsYXN0IE5BTkQgcGFnZXMgKi8KKwkJaWYgKG5zZWN0ICUgcmF0aW8pIHsKKwkJCWlmIChHTE9CX0ZUTF9QYWdlX1JlYWQodHItPnRtcF9idWYsIGFkZHIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiAlcywgTGluZSAlZFxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCW1lbWNweSh0ci0+dG1wX2J1ZiwgYnVmLCAobnNlY3QgJSByYXRpbykgPDwgOSk7CisJCQlpZiAoR0xPQl9GVExfUGFnZV9Xcml0ZSh0ci0+dG1wX2J1ZiwgYWRkcikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluICVzLCBMaW5lICVkXG4iLAorCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisjaWYgQ01EX0RNQQorCQlpZiAoZ2xvYl9mdGxfZXhlY3V0ZV9jbWRzKCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVua25vd24gcmVxdWVzdCAldVxuIiwgcnFfZGF0YV9kaXIocmVxKSk7CisJCXJldHVybiAtRUlPOworCX0KK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjb3BpZWQgZnJvbSBkcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jICovCitzdGF0aWMgaW50IHNwZWN0cmFfdHJhbnNfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc3BlY3RyYV9uYW5kX2RldiAqdHIgPSBhcmc7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxID0gdHItPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBOVUxMOworCisJLyogd2UgbWlnaHQgZ2V0IGludm9sdmVkIHdoZW4gbWVtb3J5IGdldHMgbG93LCBzbyB1c2UgUEZfTUVNQUxMT0MgKi8KKwljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKKworCXNwaW5fbG9ja19pcnEocnEtPnF1ZXVlX2xvY2spOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWludCByZXM7CisKKwkJaWYgKCFyZXEpIHsKKwkJCXJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHJxKTsKKwkJCWlmICghcmVxKSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzcGluX3VubG9ja19pcnEocnEtPnF1ZXVlX2xvY2spOworCQkJCXNjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrX2lycShycS0+cXVldWVfbG9jayk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlzcGluX3VubG9ja19pcnEocnEtPnF1ZXVlX2xvY2spOworCisJCW11dGV4X2xvY2soJnNwZWN0cmFfbG9jayk7CisJCXJlcyA9IGRvX3RyYW5zZmVyKHRyLCByZXEpOworCQltdXRleF91bmxvY2soJnNwZWN0cmFfbG9jayk7CisKKwkJc3Bpbl9sb2NrX2lycShycS0+cXVldWVfbG9jayk7CisKKwkJaWYgKCFfX2Jsa19lbmRfcmVxdWVzdF9jdXIocmVxLCByZXMpKQorCQkJcmVxID0gTlVMTDsKKwl9CisKKwlpZiAocmVxKQorCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKKworCXNwaW5fdW5sb2NrX2lycShycS0+cXVldWVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBSZXF1ZXN0IGZ1bmN0aW9uIHRoYXQgImhhbmRsZXMgY2x1c3RlcmluZyIuICovCitzdGF0aWMgdm9pZCBHTE9CX1NCRF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSkKK3sKKwlzdHJ1Y3Qgc3BlY3RyYV9uYW5kX2RldiAqcGRldiA9IHJxLT5xdWV1ZWRhdGE7CisJd2FrZV91cF9wcm9jZXNzKHBkZXYtPnRocmVhZCk7Cit9CisKK3N0YXRpYyBpbnQgR0xPQl9TQkRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCisKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEdMT0JfU0JEX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGZtb2RlX3QgbW9kZSkKK3sKKwlpbnQgcmV0OworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnNwZWN0cmFfbG9jayk7CisJcmV0ID0gZm9yY2VfZmx1c2hfY2FjaGUoKTsKKwltdXRleF91bmxvY2soJnNwZWN0cmFfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBHTE9CX1NCRF9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJZ2VvLT5oZWFkcyA9IDQ7CisJZ2VvLT5zZWN0b3JzID0gMTY7CisJZ2VvLT5jeWxpbmRlcnMgPSBnZXRfY2FwYWNpdHkoYmRldi0+YmRfZGlzaykgLyAoNCAqIDE2KTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkiaGVhZHM6ICVkLCBzZWN0b3JzOiAlZCwgY3lsaW5kZXJzOiAlZFxuIiwKKwkJZ2VvLT5oZWFkcywgZ2VvLT5zZWN0b3JzLCBnZW8tPmN5bGluZGVycyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IEdMT0JfU0JEX2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEdMT0JfU0JEX0lPQ1RMX0dDOgorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSAgICAgICAiU3BlY3RyYSBJT0NUTDogR2FyYmFnZSBDb2xsZWN0aW9uICIKKwkJCSAgICAgICAiYmVpbmcgcGVyZm9ybWVkXG4iKTsKKwkJaWYgKFBBU1MgIT0gR0xPQl9GVExfR2FyYmFnZV9Db2xsZWN0aW9uKCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEdMT0JfU0JEX0lPQ1RMX1dMOgorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSAgICAgICAiU3BlY3RyYSBJT0NUTDogU3RhdGljIFdlYXIgTGV2ZWxpbmcgIgorCQkJICAgICAgICJiZWluZyBwZXJmb3JtZWRcbiIpOworCQlpZiAoUEFTUyAhPSBHTE9CX0ZUTF9XZWFyX0xldmVsaW5nKCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEdMT0JfU0JEX0lPQ1RMX0ZPUk1BVDoKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGVjdHJhIElPQ1RMOiBGbGFzaCBmb3JtYXQgIgorCQkJICAgICAgICJiZWluZyBwZXJmb3JtZWRcbiIpOworCQlpZiAoUEFTUyAhPSBHTE9CX0ZUTF9GbGFzaF9Gb3JtYXQoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgR0xPQl9TQkRfSU9DVExfRkxVU0hfQ0FDSEU6CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYSBJT0NUTDogQ2FjaGUgZmx1c2ggIgorCQkJICAgICAgICJiZWluZyBwZXJmb3JtZWRcbiIpOworCQltdXRleF9sb2NrKCZzcGVjdHJhX2xvY2spOworCQlyZXQgPSBmb3JjZV9mbHVzaF9jYWNoZSgpOworCQltdXRleF91bmxvY2soJnNwZWN0cmFfbG9jayk7CisJCXJldHVybiByZXQ7CisKKwljYXNlIEdMT0JfU0JEX0lPQ1RMX0NPUFlfQkxLX1RBQkxFOgorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmEgSU9DVEw6ICIKKwkJCSAgICAgICAiQ29weSBibG9jayB0YWJsZVxuIik7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJZ2V0X2Jsa190YWJsZV9zdGFydF9hZGRyKCksCisJCQlnZXRfYmxrX3RhYmxlX2xlbigpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgR0xPQl9TQkRfSU9DVExfQ09QWV9XRUFSX0xFVkVMSU5HX1RBQkxFOgorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmEgSU9DVEw6ICIKKwkJCSAgICAgICAiQ29weSB3ZWFyIGxldmVsaW5nIHRhYmxlXG4iKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQlnZXRfd2Vhcl9sZXZlbGluZ190YWJsZV9zdGFydF9hZGRyKCksCisJCQlnZXRfd2Vhcl9sZXZlbGluZ190YWJsZV9sZW4oKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEdMT0JfU0JEX0lPQ1RMX0dFVF9OQU5EX0lORk86CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYSBJT0NUTDogIgorCQkJICAgICAgICJHZXQgTkFORCBpbmZvXG4iKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZJZGVudGlmeURldmljZURhdGEsCisJCQlzaXplb2YoSWRlbnRpZnlEZXZpY2VEYXRhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEdMT0JfU0JEX0lPQ1RMX1dSSVRFX0RBVEE6CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYSBJT0NUTDogIgorCQkJICAgICAgICJXcml0ZSBvbmUgcGFnZSBkYXRhXG4iKTsKKwkJcmV0dXJuIGlvY3RsX3dyaXRlX3BhZ2VfZGF0YShhcmcpOworCisJY2FzZSBHTE9CX1NCRF9JT0NUTF9SRUFEX0RBVEE6CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYSBJT0NUTDogIgorCQkJICAgICAgICJSZWFkIG9uZSBwYWdlIGRhdGFcbiIpOworCQlyZXR1cm4gaW9jdGxfcmVhZF9wYWdlX2RhdGEoYXJnKTsKKwl9CisKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBHTE9CX1NCRF9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBHTE9CX1NCRF9vcGVuLAorCS5yZWxlYXNlID0gR0xPQl9TQkRfcmVsZWFzZSwKKwkubG9ja2VkX2lvY3RsID0gR0xPQl9TQkRfaW9jdGwsCisJLmdldGdlbyA9IEdMT0JfU0JEX2dldGdlbywKK307CisKK3N0YXRpYyBpbnQgU0JEX3NldHVwX2RldmljZShzdHJ1Y3Qgc3BlY3RyYV9uYW5kX2RldiAqZGV2LCBpbnQgd2hpY2gpCit7CisJaW50IHJlc19ibGtzOworCXUzMiBzZWN0czsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBzcGVjdHJhX25hbmRfZGV2KSk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiUmVzZXJ2ZWQgJWQgYmxvY2tzICIKKwkJImZvciBPUyBpbWFnZSwgJWQgYmxvY2tzIGZvciBiYWQgYmxvY2sgcmVwbGFjZW1lbnQuXG4iLAorCQlnZXRfcmVzX2Jsa19udW1fb3MoKSwKKwkJZ2V0X3Jlc19ibGtfbnVtX2JhZF9ibGsoKSk7CisKKwlyZXNfYmxrcyA9IGdldF9yZXNfYmxrX251bV9iYWRfYmxrKCkgKyBnZXRfcmVzX2Jsa19udW1fb3MoKTsKKworCWRldi0+c2l6ZSA9ICh1NjQpSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZSAqCisJCUlkZW50aWZ5RGV2aWNlRGF0YS5QYWdlc1BlckJsb2NrICoKKwkJKElkZW50aWZ5RGV2aWNlRGF0YS53RGF0YUJsb2NrTnVtIC0gcmVzX2Jsa3MpOworCisJcmVzX2Jsa3Nfb3MgPSBnZXRfcmVzX2Jsa19udW1fb3MoKTsKKworCXNwaW5fbG9ja19pbml0KCZkZXYtPnFsb2NrKTsKKworCWRldi0+dG1wX2J1ZiA9IGttYWxsb2MoSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkZXYtPnRtcF9idWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8ga21hbGxvYyBtZW1vcnkgaW4gJXMgTGluZSAlZCwgZXhpdC5cbiIsCisJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQlnb3RvIG91dF92ZnJlZTsKKwl9CisKKwlkZXYtPnF1ZXVlID0gYmxrX2luaXRfcXVldWUoR0xPQl9TQkRfcmVxdWVzdCwgJmRldi0+cWxvY2spOworCWlmIChkZXYtPnF1ZXVlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiU3BlY3RyYTogUmVxdWVzdCBxdWV1ZSBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuIgorCQkJIiBBYm9ydGluZ1xuICIpOworCQlnb3RvIG91dF92ZnJlZTsKKwl9CisJZGV2LT5xdWV1ZS0+cXVldWVkYXRhID0gZGV2OworCisJLyogQXMgTGludXggYmxvY2sgbGF5ZXIgZG9lbnMndCBzdXBwb3J0ID40S0IgaGFyZHdhcmUgc2VjdG9yLCAgKi8KKwkvKiBIZXJlIHdlIGZvcmNlIHJlcG9ydCA1MTIgYnl0ZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSB0byBLZXJuZWwgKi8KKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGRldi0+cXVldWUsIDUxMik7CisKKwlibGtfcXVldWVfb3JkZXJlZChkZXYtPnF1ZXVlLCBRVUVVRV9PUkRFUkVEX0RSQUlOX0ZMVVNILAorCQkJCQlTQkRfcHJlcGFyZV9mbHVzaCk7CisKKwlkZXYtPnRocmVhZCA9IGt0aHJlYWRfcnVuKHNwZWN0cmFfdHJhbnNfdGhyZWFkLCBkZXYsICJuYW5kX3RoZCIpOworCWlmIChJU19FUlIoZGV2LT50aHJlYWQpKSB7CisJCWJsa19jbGVhbnVwX3F1ZXVlKGRldi0+cXVldWUpOworCQl1bnJlZ2lzdGVyX2Jsa2RldihHTE9CX1NCRF9tYWpvcm51bSwgR0xPQl9TQkRfTkFNRSk7CisJCXJldHVybiBQVFJfRVJSKGRldi0+dGhyZWFkKTsKKwl9CisKKwlkZXYtPmdkID0gYWxsb2NfZGlzayhQQVJUSVRJT05TKTsKKwlpZiAoIWRldi0+Z2QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiU3BlY3RyYTogQ291bGQgbm90IGFsbG9jYXRlIGRpc2suIEFib3J0aW5nIFxuICIpOworCQlnb3RvIG91dF92ZnJlZTsKKwl9CisJZGV2LT5nZC0+bWFqb3IgPSBHTE9CX1NCRF9tYWpvcm51bTsKKwlkZXYtPmdkLT5maXJzdF9taW5vciA9IHdoaWNoICogUEFSVElUSU9OUzsKKwlkZXYtPmdkLT5mb3BzID0gJkdMT0JfU0JEX29wczsKKwlkZXYtPmdkLT5xdWV1ZSA9IGRldi0+cXVldWU7CisJZGV2LT5nZC0+cHJpdmF0ZV9kYXRhID0gZGV2OworCXNucHJpbnRmKGRldi0+Z2QtPmRpc2tfbmFtZSwgMzIsICIlcyVjIiwgR0xPQl9TQkRfTkFNRSwgd2hpY2ggKyAnYScpOworCisJc2VjdHMgPSBkZXYtPnNpemUgPj4gOTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiQ2FwYWNpdHkgc2VjdHM6ICVkXG4iLCBzZWN0cyk7CisJc2V0X2NhcGFjaXR5KGRldi0+Z2QsIHNlY3RzKTsKKworCWFkZF9kaXNrKGRldi0+Z2QpOworCisJcmV0dXJuIDA7CitvdXRfdmZyZWU6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCitzdGF0aWMgc3NpemVfdCBzaG93X25hbmRfYmxvY2tfbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkoaW50KUlkZW50aWZ5RGV2aWNlRGF0YS53RGF0YUJsb2NrTnVtKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19uYW5kX3BhZ2VzX3Blcl9ibG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJKGludClJZGVudGlmeURldmljZURhdGEuUGFnZXNQZXJCbG9jayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbmFuZF9wYWdlX3NpemUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCShpbnQpSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW5kX2Jsb2NrX251bSwgMDQ0NCwgc2hvd19uYW5kX2Jsb2NrX251bSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobmFuZF9wYWdlc19wZXJfYmxvY2ssIDA0NDQsIHNob3dfbmFuZF9wYWdlc19wZXJfYmxvY2ssIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG5hbmRfcGFnZV9zaXplLCAwNDQ0LCBzaG93X25hbmRfcGFnZV9zaXplLCBOVUxMKTsKKworc3RhdGljIHZvaWQgY3JlYXRlX3N5c2ZzX2VudHJ5KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX25hbmRfYmxvY2tfbnVtKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiAiCisJCQkiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBlbnRyeSBuYW5kX2Jsb2NrX251bS5cbiIpOworCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbmFuZF9wYWdlc19wZXJfYmxvY2spKQorCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6ICIKKwkJImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZW50cnkgbmFuZF9wYWdlc19wZXJfYmxvY2suXG4iKTsKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX25hbmRfcGFnZV9zaXplKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiAiCisJCSJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJ5IG5hbmRfcGFnZV9zaXplLlxuIik7Cit9CisqLworCitzdGF0aWMgaW50IEdMT0JfU0JEX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIFNldCBkZWJ1ZyBvdXRwdXQgbGV2ZWwgKDB+MykgaGVyZS4gMyBpcyBtb3N0IHZlcmJvc2UgKi8KKwlwcmludGsoS0VSTl9BTEVSVCAiU3BlY3RyYTogJXNcbiIsIEdMT0JfdmVyc2lvbik7CisKKwltdXRleF9pbml0KCZzcGVjdHJhX2xvY2spOworCisJR0xPQl9TQkRfbWFqb3JudW0gPSByZWdpc3Rlcl9ibGtkZXYoMCwgR0xPQl9TQkRfTkFNRSk7CisJaWYgKEdMT0JfU0JEX21ham9ybnVtIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IHRoZSBtYWpvciAlZCBmb3IgU3BlY3RyYSIsCisJCSAgICAgICBHTE9CX1NCRF9tYWpvcm51bSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKFBBU1MgIT0gR0xPQl9GVExfRmxhc2hfSW5pdCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIEluaXRpYWxpemUgRmxhc2ggRGV2aWNlLiAiCisJCSAgICAgICAiQWJvcnRpbmdcbiIpOworCQlnb3RvIG91dF9mbGFzaF9yZWdpc3RlcjsKKwl9CisKKwkvKiBjcmVhdGVfc3lzZnNfZW50cnkoJmRldi0+ZGV2KTsgKi8KKworCWlmIChQQVNTICE9IEdMT0JfRlRMX0lkZW50aWZ5RGV2aWNlKCZJZGVudGlmeURldmljZURhdGEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIFJlYWQgRmxhc2ggRGV2aWNlLiAiCisJCSAgICAgICAiQWJvcnRpbmdcbiIpOworCQlnb3RvIG91dF9mbGFzaF9yZWdpc3RlcjsKKwl9IGVsc2UgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiSW4gR0xPQl9TQkRfaW5pdDogIgorCQkJICAgICAgICJOdW0gYmxvY2tzPSVkLCBwYWdlc3BlcmJsb2NrPSVkLCAiCisJCQkgICAgICAgInBhZ2VkYXRhc2l6ZT0lZCwgRUNDQnl0ZXNQZXJTZWN0b3I9JWRcbiIsCisJCSAgICAgICAoaW50KUlkZW50aWZ5RGV2aWNlRGF0YS5OdW1CbG9ja3MsCisJCSAgICAgICAoaW50KUlkZW50aWZ5RGV2aWNlRGF0YS5QYWdlc1BlckJsb2NrLAorCQkgICAgICAgKGludClJZGVudGlmeURldmljZURhdGEuUGFnZURhdGFTaXplLAorCQkgICAgICAgKGludClJZGVudGlmeURldmljZURhdGEud0VDQ0J5dGVzUGVyU2VjdG9yKTsKKwl9CisKKwlwcmludGsoS0VSTl9BTEVSVCAiU3BlY3RyYTogc2VhcmNoaW5nIGJsb2NrIHRhYmxlLCBwbGVhc2Ugd2FpdCAuLi5cbiIpOworCWlmIChHTE9CX0ZUTF9Jbml0KCkgIT0gUEFTUykgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBJbml0aWFsaXplIEZUTCBMYXllci4gIgorCQkgICAgICAgIkFib3J0aW5nXG4iKTsKKwkJZ290byBvdXRfZnRsX2ZsYXNoX3JlZ2lzdGVyOworCX0KKwlwcmludGsoS0VSTl9BTEVSVCAiU3BlY3RyYTogYmxvY2sgdGFibGUgaGFzIGJlZW4gZm91bmQuXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fREVWSUNFUzsgaSsrKQorCQlpZiAoU0JEX3NldHVwX2RldmljZSgmbmFuZF9kZXZpY2VbaV0sIGkpID09IC1FTk9NRU0pCisJCQlnb3RvIG91dF9mdGxfZmxhc2hfcmVnaXN0ZXI7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJICAgICAgICJTcGVjdHJhOiBtb2R1bGUgbG9hZGVkIHdpdGggbWFqb3IgbnVtYmVyICVkXG4iLAorCQkgICAgICAgR0xPQl9TQkRfbWFqb3JudW0pOworCisJcmV0dXJuIDA7CisKK291dF9mdGxfZmxhc2hfcmVnaXN0ZXI6CisJR0xPQl9GVExfQ2FjaGVfUmVsZWFzZSgpOworb3V0X2ZsYXNoX3JlZ2lzdGVyOgorCUdMT0JfRlRMX0ZsYXNoX1JlbGVhc2UoKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihHTE9CX1NCRF9tYWpvcm51bSwgR0xPQl9TQkRfTkFNRSk7CisJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBNb2R1bGUgbG9hZCBmYWlsZWQuXG4iKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgR0xPQl9TQkRfZXhpdCh2b2lkKQoreworCWludCBpOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RFVklDRVM7IGkrKykgeworCQlzdHJ1Y3Qgc3BlY3RyYV9uYW5kX2RldiAqZGV2ID0gJm5hbmRfZGV2aWNlW2ldOworCQlpZiAoZGV2LT5nZCkgeworCQkJZGVsX2dlbmRpc2soZGV2LT5nZCk7CisJCQlwdXRfZGlzayhkZXYtPmdkKTsKKwkJfQorCQlpZiAoZGV2LT5xdWV1ZSkKKwkJCWJsa19jbGVhbnVwX3F1ZXVlKGRldi0+cXVldWUpOworCQlrZnJlZShkZXYtPnRtcF9idWYpOworCX0KKworCXVucmVnaXN0ZXJfYmxrZGV2KEdMT0JfU0JEX21ham9ybnVtLCBHTE9CX1NCRF9OQU1FKTsKKworCW11dGV4X2xvY2soJnNwZWN0cmFfbG9jayk7CisJZm9yY2VfZmx1c2hfY2FjaGUoKTsKKwltdXRleF91bmxvY2soJnNwZWN0cmFfbG9jayk7CisKKwlHTE9CX0ZUTF9DYWNoZV9SZWxlYXNlKCk7CisKKwlHTE9CX0ZUTF9GbGFzaF9SZWxlYXNlKCk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJICAgICAgICJTcGVjdHJhIEZUTCBtb2R1bGUgKG1ham9yIG51bWJlciAlZCkgdW5sb2FkZWQuXG4iLAorCQkgICAgICAgR0xPQl9TQkRfbWFqb3JudW0pOworfQorCittb2R1bGVfaW5pdChHTE9CX1NCRF9pbml0KTsKK21vZHVsZV9leGl0KEdMT0JfU0JEX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIE5BTkQgRmxhc2ggQ29udHJvbGxlciBEZXZpY2UgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uIGFuZCBpdHMgc3VwcGxpZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0ZGU1BPUlRfCisjZGVmaW5lIF9GRlNQT1JUXworCisjaW5jbHVkZSAiZmZzZGVmcy5oIgorCisjaWYgZGVmaW5lZCBfX0dOVUNfXworI2RlZmluZSBQQUNLRUQKKyNkZWZpbmUgUEFDS0VEX0dOVSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNkZWZpbmUgVU5BTElHTkVECisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBmb3Igc3RyY3B5KCksIHN0cmljbXAoKSwgZXRjICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIGZvciBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgkJLyogZXZlcnl0aGluZy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogc2l6ZV90ICovCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgImZsYXNoLmgiCisKKyNkZWZpbmUgVkVSQk9TRSAgICAxCisKKyNkZWZpbmUgTkFORF9EQkdfV0FSTiAgMQorI2RlZmluZSBOQU5EX0RCR19ERUJVRyAyCisjZGVmaW5lIE5BTkRfREJHX1RSQUNFIDMKKworZXh0ZXJuIGludCBuYW5kX2RlYnVnX2xldmVsOworCisjaWZkZWYgVkVSQk9TRQorI2RlZmluZSBuYW5kX2RiZ19wcmludChsZXZlbCwgYXJncy4uLikJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxldmVsIDw9IG5hbmRfZGVidWdfbGV2ZWwpCQlcCisJCQlwcmludGsoS0VSTl9BTEVSVCBhcmdzKTsJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBuYW5kX2RiZ19wcmludChsZXZlbCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9CSUdfRU5ESUFOCisjZGVmaW5lIElOVkVSVFVJTlQxNih3KSAgICgodTE2KSgoKHUxNikodykpIDw8IDgpIHwgXAorCQkJICAgKHUxNikoKHUxNikodykgPj4gOCkpCisKKyNkZWZpbmUgSU5WRVJUVUlOVDMyKGR3KSAgKCgodTMyKShkdykgPDwgMjQpIHwgXAorCQkJICAgKCgodTMyKShkdykgPDwgOCkgJiAweDAwZmYwMDAwKSB8IFwKKwkJCSAgICgoKHUzMikoZHcpID4+IDgpICYgMHgwMDAwZmYwMCkgfCBcCisJCQkgICAoKHUzMikoZHcpID4+IDI0KSkKKyNlbHNlCisjZGVmaW5lIElOVkVSVFVJTlQxNih3KSAgIHcKKyNkZWZpbmUgSU5WRVJUVUlOVDMyKGR3KSAgZHcKKyNlbmRpZgorCitleHRlcm4gaW50IEdMT0JfQ2FsY19Vc2VkX0JpdHModTMyIG4pOworZXh0ZXJuIHU2NCBHTE9CX3U2NF9EaXYodTY0IGFkZHIsIHUzMiBkaXZpc29yKTsKK2V4dGVybiB1NjQgR0xPQl91NjRfUmVtYWluZGVyKHU2NCBhZGRyLCB1MzIgZGl2aXNvcl90eXBlKTsKKworI2VuZGlmIC8qIF9GRlNQT1JUXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmxhc2guYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YWE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmMKQEAgLTAsMCArMSw0NzMxIEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZmxhc2guaCIKKyNpbmNsdWRlICJmZnNkZWZzLmgiCisjaW5jbHVkZSAibGxkLmgiCisjaW5jbHVkZSAibGxkX25hbmQuaCIKKyNpZiBDTURfRE1BCisjaW5jbHVkZSAibGxkX2NkbWEuaCIKKyNlbmRpZgorCisjZGVmaW5lIEJMS19GUk9NX0FERFIoYWRkcikgICgodTMyKShhZGRyID4+IERldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemUpKQorI2RlZmluZSBQQUdFX0ZST01fQUREUihhZGRyLCBCbG9jaykgICgodTE2KSgoYWRkciAtICh1NjQpQmxvY2sgKiBcCisJRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSkgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSkKKworI2RlZmluZSBJU19TUEFSRV9CTE9DSyhibGspICAgICAoQkFEX0JMT0NLICE9IChwYnRbYmxrXSAmXAorCUJBRF9CTE9DSykgJiYgU1BBUkVfQkxPQ0sgPT0gKHBidFtibGtdICYgU1BBUkVfQkxPQ0spKQorCisjZGVmaW5lIElTX0RBVEFfQkxPQ0soYmxrKSAgICAgICgwID09IChwYnRbYmxrXSAmIEJBRF9CTE9DSykpCisKKyNkZWZpbmUgSVNfRElTQ0FSREVEX0JMT0NLKGJsaykgKEJBRF9CTE9DSyAhPSAocGJ0W2Jsa10gJlwKKwlCQURfQkxPQ0spICYmIERJU0NBUkRfQkxPQ0sgPT0gKHBidFtibGtdICYgRElTQ0FSRF9CTE9DSykpCisKKyNkZWZpbmUgSVNfQkFEX0JMT0NLKGJsaykgICAgICAgKEJBRF9CTE9DSyA9PSAocGJ0W2Jsa10gJiBCQURfQkxPQ0spKQorCisjaWYgREVCVUdfQk5EUlkKK3ZvaWQgZGVidWdfYm91bmRhcnlfbGluZW5vX2Vycm9yKGludCBjaG5sLCBpbnQgbGltaXQsIGludCBubywKKwkJCQlpbnQgbGluZW5vLCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpZiAoY2hubCA+PSBsaW1pdCkKKwkJcHJpbnRrKEtFUk5fRVJSICJCb3VuZGFyeSBDaGVjayBGYWlsIHZhbHVlICVkID49IGxpbWl0ICVkLCAiCisJCSJhdCAgJXM6JWQuIE90aGVyIGluZm86JWQuIEFib3J0aW5nLi4uXG4iLAorCQljaG5sLCBsaW1pdCwgZmlsZW5hbWUsIGxpbmVubywgbm8pOworfQorLyogc3RhdGljIGludCBnbG9iYWxtZW1zaXplOyAqLworI2VuZGlmCisKK3N0YXRpYyB1MTYgRlRMX0NhY2hlX0lmX0hpdCh1NjQgZHdQYWdlQWRkcik7CitzdGF0aWMgaW50IEZUTF9DYWNoZV9SZWFkKHU2NCBkd1BhZ2VBZGRyKTsKK3N0YXRpYyB2b2lkIEZUTF9DYWNoZV9SZWFkX1BhZ2UodTggKnBEYXRhLCB1NjQgZHdQYWdlQWRkciwKKwkJCQl1MTYgY2FjaGVfYmxrKTsKK3N0YXRpYyB2b2lkIEZUTF9DYWNoZV9Xcml0ZV9QYWdlKHU4ICpwRGF0YSwgdTY0IGR3UGFnZUFkZHIsCisJCQkJIHU4IGNhY2hlX2JsaywgdTE2IGZsYWcpOworc3RhdGljIGludCBGVExfQ2FjaGVfV3JpdGUodm9pZCk7CitzdGF0aWMgaW50IEZUTF9DYWNoZV9Xcml0ZV9CYWNrKHU4ICpwRGF0YSwgdTY0IGJsa19hZGRyKTsKK3N0YXRpYyB2b2lkIEZUTF9DYWxjdWxhdGVfTFJVKHZvaWQpOworc3RhdGljIHUzMiBGVExfR2V0X0Jsb2NrX0luZGV4KHUzMiB3QmxvY2tOdW0pOworCitzdGF0aWMgaW50IEZUTF9TZWFyY2hfQmxvY2tfVGFibGVfSU5fQmxvY2sodTMyIEJUX0Jsb2NrLAorCQkJCQkgICB1OCBCVF9UYWcsIHUxNiAqUGFnZSk7CitzdGF0aWMgaW50IEZUTF9SZWFkX0Jsb2NrX1RhYmxlKHZvaWQpOworc3RhdGljIGludCBGVExfV3JpdGVfQmxvY2tfVGFibGUoaW50IHdGb3JjZSk7CitzdGF0aWMgaW50IEZUTF9Xcml0ZV9CbG9ja19UYWJsZV9EYXRhKHZvaWQpOworc3RhdGljIGludCBGVExfQ2hlY2tfQmxvY2tfVGFibGUoaW50IHdPbGRUYWJsZSk7CitzdGF0aWMgaW50IEZUTF9TdGF0aWNfV2Vhcl9MZXZlbGluZyh2b2lkKTsKK3N0YXRpYyB1MzIgRlRMX1JlcGxhY2VfQmxvY2tfVGFibGUodm9pZCk7CitzdGF0aWMgaW50IEZUTF9Xcml0ZV9JTl9Qcm9ncmVzc19CbG9ja19UYWJsZV9QYWdlKHZvaWQpOworCitzdGF0aWMgdTMyIEZUTF9HZXRfUGFnZV9OdW0odTY0IGxlbmd0aCk7CitzdGF0aWMgdTY0IEZUTF9HZXRfUGh5c2ljYWxfQmxvY2tfQWRkcih1NjQgYmxrX2FkZHIpOworCitzdGF0aWMgdTMyIEZUTF9SZXBsYWNlX09uZUJsb2NrKHUzMiB3QmxvY2tOdW0sCisJCQkJICAgICAgdTMyIHdSZXBsYWNlTnVtKTsKK3N0YXRpYyB1MzIgRlRMX1JlcGxhY2VfTFdCbG9jayh1MzIgd0Jsb2NrTnVtLAorCQkJCSAgICAgaW50ICpwR2FyYmFnZUNvbGxlY3QpOworc3RhdGljIHUzMiBGVExfUmVwbGFjZV9NV0Jsb2NrKHZvaWQpOworc3RhdGljIGludCBGVExfUmVwbGFjZV9CbG9jayh1NjQgYmxrX2FkZHIpOworc3RhdGljIGludCBGVExfQWRqdXN0X1JlbGF0aXZlX0VyYXNlX0NvdW50KHUzMiBJbmRleF9vZl9NQVgpOworCitzdGF0aWMgaW50IEZUTF9GbGFzaF9FcnJvcl9IYW5kbGUodTggKnBEYXRhLCB1NjQgb2xkX3BhZ2VfYWRkciwgdTY0IGJsa19hZGRyKTsKKworc3RydWN0IGRldmljZV9pbmZvX3RhZyBEZXZpY2VJbmZvOworc3RydWN0IGZsYXNoX2NhY2hlX3RhZyBDYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qgc3BlY3RyYV9sMl9jYWNoZV9pbmZvIGNhY2hlX2wyOworCitzdGF0aWMgdTggKmNhY2hlX2wyX3BhZ2VfYnVmOworc3RhdGljIHU4ICpjYWNoZV9sMl9ibGtfYnVmOworCit1OCAqZ19wQmxvY2tUYWJsZTsKK3U4ICpnX3BXZWFyQ291bnRlcjsKK3UxNiAqZ19wUmVhZENvdW50ZXI7Cit1MzIgKmdfcEJUQmxvY2tzOworc3RhdGljIHUxNiBnX3dCbG9ja1RhYmxlT2Zmc2V0Oworc3RhdGljIHUzMiBnX3dCbG9ja1RhYmxlSW5kZXg7CitzdGF0aWMgdTggZ19jQmxvY2tUYWJsZVN0YXR1czsKKworc3RhdGljIHU4ICpnX3BUZW1wQnVmOworc3RhdGljIHU4ICpmbGFnX2NoZWNrX2Jsa190YWJsZTsKK3N0YXRpYyB1OCAqdG1wX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2s7CitzdGF0aWMgdTggKnNwYXJlX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2s7CitzdGF0aWMgdTggKnNwYXJlX2J1Zl9idF9zZWFyY2hfYnRfaW5fYmxvY2s7CitzdGF0aWMgdTggKnRtcF9idWYxX3JlYWRfYmxrX3RhYmxlOworc3RhdGljIHU4ICp0bXBfYnVmMl9yZWFkX2Jsa190YWJsZTsKK3N0YXRpYyB1OCAqZmxhZ3Nfc3RhdGljX3dlYXJfbGV2ZWxpbmc7CitzdGF0aWMgdTggKnRtcF9idWZfd3JpdGVfYmxrX3RhYmxlX2RhdGE7CitzdGF0aWMgdTggKnRtcF9idWZfcmVhZF9kaXN0dXJiYW5jZTsKKwordTggKmJ1Zl9yZWFkX3BhZ2VfbWFpbl9zcGFyZTsKK3U4ICpidWZfd3JpdGVfcGFnZV9tYWluX3NwYXJlOwordTggKmJ1Zl9yZWFkX3BhZ2Vfc3BhcmU7Cit1OCAqYnVmX2dldF9iYWRfYmxvY2s7CisKKyNpZiAoUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUgJiYgQ01EX0RNQSkKK3N0cnVjdCBmbGFzaF9jYWNoZV9kZWx0YV9saXN0X3RhZyBpbnRfY2FjaGVbTUFYX0NIQU5TICsgTUFYX0RFU0NTXTsKK3N0cnVjdCBmbGFzaF9jYWNoZV90YWcgY2FjaGVfc3RhcnRfY29weTsKKyNlbmRpZgorCitpbnQgZ193TnVtRnJlZUJsb2NrczsKK3U4IGdfU0JEQ21kSW5kZXg7CisKK3N0YXRpYyB1OCAqZ19wSVBGOworc3RhdGljIHU4IGJ0X2ZsYWcgPSBGSVJTVF9CVF9JRDsKK3N0YXRpYyB1OCBidF9ibG9ja19jaGFuZ2VkOworCitzdGF0aWMgdTE2IGNhY2hlX2Jsb2NrX3RvX3dyaXRlOworc3RhdGljIHU4IGxhc3RfZXJhc2VkID0gRklSU1RfQlRfSUQ7CisKK3N0YXRpYyB1OCBHQ19DYWxsZWQ7CitzdGF0aWMgdTggQlRfR0NfQ2FsbGVkOworCisjaWYgQ01EX0RNQQorI2RlZmluZSBDT1BZX0JBQ0tfQlVGX05VTSAxMAorCitzdGF0aWMgdTggZnRsX2NtZF9jbnQ7ICAvKiBJbml0IHZhbHVlIGlzIDAgKi8KK3U4ICpnX3BCVERlbHRhOwordTggKmdfcEJURGVsdGFfRnJlZTsKK3U4ICpnX3BCVFN0YXJ0aW5nQ29weTsKK3U4ICpnX3BXZWFyQ291bnRlckNvcHk7Cit1MTYgKmdfcFJlYWRDb3VudGVyQ29weTsKK3U4ICpnX3BCbG9ja1RhYmxlQ29waWVzOwordTggKmdfcE5leHRCbG9ja1RhYmxlOworc3RhdGljIHU4ICpjcF9iYWNrX2J1Zl9jb3BpZXNbQ09QWV9CQUNLX0JVRl9OVU1dOworc3RhdGljIGludCBjcF9iYWNrX2J1Zl9pZHg7CisKK3N0YXRpYyB1OCAqZ190ZW1wX2J1ZjsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEgeworCXU4IGZ0bF9jbWRfY250OworCXU4IFZhbGlkRmllbGRzOworCXUxNiBnX3dCbG9ja1RhYmxlT2Zmc2V0OworCXUzMiBnX3dCbG9ja1RhYmxlSW5kZXg7CisJdTMyIEJUX0luZGV4OworCXUzMiBCVF9FbnRyeV9WYWx1ZTsKKwl1MzIgV0NfSW5kZXg7CisJdTggV0NfRW50cnlfVmFsdWU7CisJdTMyIFJDX0luZGV4OworCXUxNiBSQ19FbnRyeV9WYWx1ZTsKK307CisKKyNwcmFnbWEgcGFjayhwb3ApCisKK3N0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEgKnBfQlRhYmxlQ2hhbmdlc0RlbHRhOworI2VuZGlmCisKKworI2RlZmluZSBNQVJLX0JMT0NLX0FTX0JBRChibG9ja25vZGUpICAgICAgKGJsb2Nrbm9kZSB8PSBCQURfQkxPQ0spCisjZGVmaW5lIE1BUktfQkxLX0FTX0RJU0NBUkQoYmxrKSAgKGJsayA9IChibGsgJiB+U1BBUkVfQkxPQ0spIHwgRElTQ0FSRF9CTE9DSykKKworI2RlZmluZSBGVExfR2V0X0xCQVBCQV9UYWJsZV9NZW1fU2l6ZV9CeXRlcygpIChEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKlwKKwkJCQkJCXNpemVvZih1MzIpKQorI2RlZmluZSBGVExfR2V0X1dlYXJDb3VudGVyX1RhYmxlX01lbV9TaXplX0J5dGVzKCkgKERldmljZUluZm8ud0RhdGFCbG9ja051bSAqXAorCQkJCQkJc2l6ZW9mKHU4KSkKKyNkZWZpbmUgRlRMX0dldF9SZWFkQ291bnRlcl9UYWJsZV9NZW1fU2l6ZV9CeXRlcygpIChEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKlwKKwkJCQkJCXNpemVvZih1MTYpKQorI2lmIFNVUFBPUlRfTEFSR0VfQkxPQ0tOVU0KKyNkZWZpbmUgRlRMX0dldF9MQkFQQkFfVGFibGVfRmxhc2hfU2l6ZV9CeXRlcygpIChEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKlwKKwkJCQkJCXNpemVvZih1OCkgKiAzKQorI2Vsc2UKKyNkZWZpbmUgRlRMX0dldF9MQkFQQkFfVGFibGVfRmxhc2hfU2l6ZV9CeXRlcygpIChEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKlwKKwkJCQkJCXNpemVvZih1MTYpKQorI2VuZGlmCisjZGVmaW5lIEZUTF9HZXRfV2VhckNvdW50ZXJfVGFibGVfRmxhc2hfU2l6ZV9CeXRlcyBcCisJRlRMX0dldF9XZWFyQ291bnRlcl9UYWJsZV9NZW1fU2l6ZV9CeXRlcworI2RlZmluZSBGVExfR2V0X1JlYWRDb3VudGVyX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXMgXAorCUZUTF9HZXRfUmVhZENvdW50ZXJfVGFibGVfTWVtX1NpemVfQnl0ZXMKKworc3RhdGljIHUzMiBGVExfR2V0X0Jsb2NrX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXModm9pZCkKK3sKKwl1MzIgYnl0ZV9udW07CisKKwlpZiAoRGV2aWNlSW5mby5NTENEZXZpY2UpIHsKKwkJYnl0ZV9udW0gPSBGVExfR2V0X0xCQVBCQV9UYWJsZV9GbGFzaF9TaXplX0J5dGVzKCkgKworCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KSArCisJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTE2KTsKKwl9IGVsc2UgeworCQlieXRlX251bSA9IEZUTF9HZXRfTEJBUEJBX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXMoKSArCisJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTgpOworCX0KKworCWJ5dGVfbnVtICs9IDQgKiBzaXplb2YodTgpOworCisJcmV0dXJuIGJ5dGVfbnVtOworfQorCitzdGF0aWMgdTE2ICBGVExfR2V0X0Jsb2NrX1RhYmxlX0ZsYXNoX1NpemVfUGFnZXModm9pZCkKK3sKKwlyZXR1cm4gKHUxNilGVExfR2V0X1BhZ2VfTnVtKEZUTF9HZXRfQmxvY2tfVGFibGVfRmxhc2hfU2l6ZV9CeXRlcygpKTsKK30KKworc3RhdGljIGludCBGVExfQ29weV9CbG9ja19UYWJsZV9Ub19GbGFzaCh1OCAqZmxhc2hCdWYsIHUzMiBzaXplVG9UeCwKKwkJCQkJdTMyIHNpemVUeGVkKQoreworCXUzMiB3Qnl0ZXNDb3BpZWQsIGJsa190Ymxfc2l6ZSwgd0J5dGVzOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisKKwlibGtfdGJsX3NpemUgPSBGVExfR2V0X0xCQVBCQV9UYWJsZV9GbGFzaF9TaXplX0J5dGVzKCk7CisJZm9yICh3Qnl0ZXMgPSAwOworCSh3Qnl0ZXMgPCBzaXplVG9UeCkgJiYgKCh3Qnl0ZXMgKyBzaXplVHhlZCkgPCBibGtfdGJsX3NpemUpOworCXdCeXRlcysrKSB7CisjaWYgU1VQUE9SVF9MQVJHRV9CTE9DS05VTQorCQlmbGFzaEJ1Zlt3Qnl0ZXNdID0gKHU4KShwYnRbKHdCeXRlcyArIHNpemVUeGVkKSAvIDNdCisJCT4+ICgoKHdCeXRlcyArIHNpemVUeGVkKSAlIDMpID8KKwkJKCgoKHdCeXRlcyArIHNpemVUeGVkKSAlIDMpID09IDIpID8gMCA6IDgpIDogMTYpKSAmIDB4RkY7CisjZWxzZQorCQlmbGFzaEJ1Zlt3Qnl0ZXNdID0gKHU4KShwYnRbKHdCeXRlcyArIHNpemVUeGVkKSAvIDJdCisJCT4+ICgoKHdCeXRlcyArIHNpemVUeGVkKSAlIDIpID8gMCA6IDgpKSAmIDB4RkY7CisjZW5kaWYKKwl9CisKKwlzaXplVHhlZCA9IChzaXplVHhlZCA+IGJsa190Ymxfc2l6ZSkgPyAoc2l6ZVR4ZWQgLSBibGtfdGJsX3NpemUpIDogMDsKKwlibGtfdGJsX3NpemUgPSBGVExfR2V0X1dlYXJDb3VudGVyX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXMoKTsKKwl3Qnl0ZXNDb3BpZWQgPSB3Qnl0ZXM7CisJd0J5dGVzID0gKChibGtfdGJsX3NpemUgLSBzaXplVHhlZCkgPiAoc2l6ZVRvVHggLSB3Qnl0ZXNDb3BpZWQpKSA/CisJCShzaXplVG9UeCAtIHdCeXRlc0NvcGllZCkgOiAoYmxrX3RibF9zaXplIC0gc2l6ZVR4ZWQpOworCW1lbWNweShmbGFzaEJ1ZiArIHdCeXRlc0NvcGllZCwgZ19wV2VhckNvdW50ZXIgKyBzaXplVHhlZCwgd0J5dGVzKTsKKworCXNpemVUeGVkID0gKHNpemVUeGVkID4gYmxrX3RibF9zaXplKSA/IChzaXplVHhlZCAtIGJsa190Ymxfc2l6ZSkgOiAwOworCisJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKSB7CisJCWJsa190Ymxfc2l6ZSA9IEZUTF9HZXRfUmVhZENvdW50ZXJfVGFibGVfRmxhc2hfU2l6ZV9CeXRlcygpOworCQl3Qnl0ZXNDb3BpZWQgKz0gd0J5dGVzOworCQlmb3IgKHdCeXRlcyA9IDA7ICgod0J5dGVzICsgd0J5dGVzQ29waWVkKSA8IHNpemVUb1R4KSAmJgorCQkJKCh3Qnl0ZXMgKyBzaXplVHhlZCkgPCBibGtfdGJsX3NpemUpOyB3Qnl0ZXMrKykKKwkJCWZsYXNoQnVmW3dCeXRlcyArIHdCeXRlc0NvcGllZF0gPQorCQkJKGdfcFJlYWRDb3VudGVyWyh3Qnl0ZXMgKyBzaXplVHhlZCkgLyAyXSA+PgorCQkJKCgod0J5dGVzICsgc2l6ZVR4ZWQpICUgMikgPyAwIDogOCkpICYgMHhGRjsKKwl9CisKKwlyZXR1cm4gd0J5dGVzQ29waWVkICsgd0J5dGVzOworfQorCitzdGF0aWMgaW50IEZUTF9Db3B5X0Jsb2NrX1RhYmxlX0Zyb21fRmxhc2godTggKmZsYXNoQnVmLAorCQkJCXUzMiBzaXplVG9UeCwgdTMyIHNpemVUeGVkKQoreworCXUzMiB3Qnl0ZXNDb3BpZWQsIGJsa190Ymxfc2l6ZSwgd0J5dGVzOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisKKwlibGtfdGJsX3NpemUgPSBGVExfR2V0X0xCQVBCQV9UYWJsZV9GbGFzaF9TaXplX0J5dGVzKCk7CisJZm9yICh3Qnl0ZXMgPSAwOyAod0J5dGVzIDwgc2l6ZVRvVHgpICYmCisJCSgod0J5dGVzICsgc2l6ZVR4ZWQpIDwgYmxrX3RibF9zaXplKTsgd0J5dGVzKyspIHsKKyNpZiBTVVBQT1JUX0xBUkdFX0JMT0NLTlVNCisJCWlmICghKCh3Qnl0ZXMgKyBzaXplVHhlZCkgJSAzKSkKKwkJCXBidFsod0J5dGVzICsgc2l6ZVR4ZWQpIC8gM10gPSAwOworCQlwYnRbKHdCeXRlcyArIHNpemVUeGVkKSAvIDNdIHw9CisJCQkoZmxhc2hCdWZbd0J5dGVzXSA8PCAoKCh3Qnl0ZXMgKyBzaXplVHhlZCkgJSAzKSA/CisJCQkoKCgod0J5dGVzICsgc2l6ZVR4ZWQpICUgMykgPT0gMikgPyAwIDogOCkgOiAxNikpOworI2Vsc2UKKwkJaWYgKCEoKHdCeXRlcyArIHNpemVUeGVkKSAlIDIpKQorCQkJcGJ0Wyh3Qnl0ZXMgKyBzaXplVHhlZCkgLyAyXSA9IDA7CisJCXBidFsod0J5dGVzICsgc2l6ZVR4ZWQpIC8gMl0gfD0KKwkJCShmbGFzaEJ1Zlt3Qnl0ZXNdIDw8ICgoKHdCeXRlcyArIHNpemVUeGVkKSAlIDIpID8KKwkJCTAgOiA4KSk7CisjZW5kaWYKKwl9CisKKwlzaXplVHhlZCA9IChzaXplVHhlZCA+IGJsa190Ymxfc2l6ZSkgPyAoc2l6ZVR4ZWQgLSBibGtfdGJsX3NpemUpIDogMDsKKwlibGtfdGJsX3NpemUgPSBGVExfR2V0X1dlYXJDb3VudGVyX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXMoKTsKKwl3Qnl0ZXNDb3BpZWQgPSB3Qnl0ZXM7CisJd0J5dGVzID0gKChibGtfdGJsX3NpemUgLSBzaXplVHhlZCkgPiAoc2l6ZVRvVHggLSB3Qnl0ZXNDb3BpZWQpKSA/CisJCShzaXplVG9UeCAtIHdCeXRlc0NvcGllZCkgOiAoYmxrX3RibF9zaXplIC0gc2l6ZVR4ZWQpOworCW1lbWNweShnX3BXZWFyQ291bnRlciArIHNpemVUeGVkLCBmbGFzaEJ1ZiArIHdCeXRlc0NvcGllZCwgd0J5dGVzKTsKKwlzaXplVHhlZCA9IChzaXplVHhlZCA+IGJsa190Ymxfc2l6ZSkgPyAoc2l6ZVR4ZWQgLSBibGtfdGJsX3NpemUpIDogMDsKKworCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkgeworCQl3Qnl0ZXNDb3BpZWQgKz0gd0J5dGVzOworCQlibGtfdGJsX3NpemUgPSBGVExfR2V0X1JlYWRDb3VudGVyX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXMoKTsKKwkJZm9yICh3Qnl0ZXMgPSAwOyAoKHdCeXRlcyArIHdCeXRlc0NvcGllZCkgPCBzaXplVG9UeCkgJiYKKwkJCSgod0J5dGVzICsgc2l6ZVR4ZWQpIDwgYmxrX3RibF9zaXplKTsgd0J5dGVzKyspIHsKKwkJCWlmICgoKHdCeXRlcyArIHNpemVUeGVkKSAlIDIpKQorCQkJCWdfcFJlYWRDb3VudGVyWyh3Qnl0ZXMgKyBzaXplVHhlZCkgLyAyXSA9IDA7CisJCQlnX3BSZWFkQ291bnRlclsod0J5dGVzICsgc2l6ZVR4ZWQpIC8gMl0gfD0KKwkJCQkoZmxhc2hCdWZbd0J5dGVzXSA8PAorCQkJCSgoKHdCeXRlcyArIHNpemVUeGVkKSAlIDIpID8gMCA6IDgpKTsKKwkJfQorCX0KKworCXJldHVybiB3Qnl0ZXNDb3BpZWQrd0J5dGVzOworfQorCitzdGF0aWMgaW50IEZUTF9JbnNlcnRfQmxvY2tfVGFibGVfU2lnbmF0dXJlKHU4ICpidWYsIHU4IHRhZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVFNJR19CWVRFUzsgaSsrKQorCQlidWZbQlRTSUdfT0ZGU0VUICsgaV0gPQorCQkoKHRhZyArIChpICogQlRTSUdfREVMVEEpIC0gRklSU1RfQlRfSUQpICUKKwkJKDEgKyBMQVNUX0JUX0lELUZJUlNUX0JUX0lEKSkgKyBGSVJTVF9CVF9JRDsKKworCXJldHVybiBQQVNTOworfQorCitzdGF0aWMgaW50IEZUTF9FeHRyYWN0X0Jsb2NrX1RhYmxlX1RhZyh1OCAqYnVmLCB1OCAqKnRhZ2FycmF5KQoreworCXN0YXRpYyB1OCB0YWdbQlRTSUdfQllURVMgPj4gMV07CisJaW50IGksIGosIGssIHRhZ2ksIHRhZ3RlbXAsIHN0YXR1czsKKworCSp0YWdhcnJheSA9ICh1OCAqKXRhZzsKKwl0YWdpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAoQlRTSUdfQllURVMgLSAxKTsgaSsrKSB7CisJCWZvciAoaiA9IGkgKyAxOyAoaiA8IEJUU0lHX0JZVEVTKSAmJgorCQkJKHRhZ2kgPCAoQlRTSUdfQllURVMgPj4gMSkpOyBqKyspIHsKKwkJCXRhZ3RlbXAgPSBidWZbQlRTSUdfT0ZGU0VUICsgal0gLQorCQkJCWJ1ZltCVFNJR19PRkZTRVQgKyBpXTsKKwkJCWlmICh0YWd0ZW1wICYmICEodGFndGVtcCAlIEJUU0lHX0RFTFRBKSkgeworCQkJCXRhZ3RlbXAgPSAoYnVmW0JUU0lHX09GRlNFVCArIGldICsKKwkJCQkJKDEgKyBMQVNUX0JUX0lEIC0gRklSU1RfQlRfSUQpIC0KKwkJCQkJKGkgKiBCVFNJR19ERUxUQSkpICUKKwkJCQkJKDEgKyBMQVNUX0JUX0lEIC0gRklSU1RfQlRfSUQpOworCQkJCXN0YXR1cyA9IEZBSUw7CisJCQkJZm9yIChrID0gMDsgayA8IHRhZ2k7IGsrKykgeworCQkJCQlpZiAodGFndGVtcCA9PSB0YWdba10pCisJCQkJCQlzdGF0dXMgPSBQQVNTOworCQkJCX0KKworCQkJCWlmIChzdGF0dXMgPT0gRkFJTCkgeworCQkJCQl0YWdbdGFnaSsrXSA9IHRhZ3RlbXA7CisJCQkJCWkgPSAoaiA9PSAoaSArIDEpKSA/IGkgKyAxIDogaTsKKwkJCQkJaiA9IChqID09IChpICsgMSkpID8gaSArIDEgOiBpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0YWdpOworfQorCisKK3N0YXRpYyBpbnQgRlRMX0V4ZWN1dGVfU1BMX1JlY292ZXJ5KHZvaWQpCit7CisJdTMyIGosIGJsb2NrLCBibGtzOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJaW50IHJldDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWJsa3MgPSBEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2sgLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jazsKKwlmb3IgKGogPSAwOyBqIDw9IGJsa3M7IGorKykgeworCQlibG9jayA9IChwYnRbal0pOworCQlpZiAoKChibG9jayAmIEJBRF9CTE9DSykgIT0gQkFEX0JMT0NLKSAmJgorCQkJKChibG9jayAmIFNQQVJFX0JMT0NLKSA9PSBTUEFSRV9CTE9DSykpIHsKKwkJCXJldCA9ICBHTE9CX0xMRF9FcmFzZV9CbG9jayhibG9jayAmIH5CQURfQkxPQ0spOworCQkJaWYgKEZBSUwgPT0gcmV0KSB7CisJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkJIk5BTkQgUHJvZ3JhbSBmYWlsIGluICVzLCBMaW5lICVkLCAiCisJCQkJCSJGdW5jdGlvbjogJXMsIG5ldyBCYWQgQmxvY2sgJWQgIgorCQkJCQkiZ2VuZXJhdGVkIVxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywKKwkJCQkJKGludCkoYmxvY2sgJiB+QkFEX0JMT0NLKSk7CisJCQkJTUFSS19CTE9DS19BU19CQUQocGJ0W2pdKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBQQVNTOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX0lkZW50aWZ5RGV2aWNlCisqIElucHV0czogICAgICAgcG9pbnRlciB0byBpZGVudGlmeSBkYXRhIHN0cnVjdHVyZQorKiBPdXRwdXRzOiAgICAgIFBBU1MgLyBGQUlMCisqIERlc2NyaXB0aW9uOiAgdGhlIGlkZW50aWZ5IGRhdGEgc3RydWN0dXJlIGlzIGZpbGxlZCBpbiB3aXRoCisqICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB0aGUgYmxvY2sgZHJpdmVyLgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK2ludCBHTE9CX0ZUTF9JZGVudGlmeURldmljZShzdHJ1Y3Qgc3BlY3RyYV9pbmRlbnRmeV9kZXZfdGFnICpkZXZfZGF0YSkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlkZXZfZGF0YS0+TnVtQmxvY2tzID0gRGV2aWNlSW5mby53VG90YWxCbG9ja3M7CisJZGV2X2RhdGEtPlBhZ2VzUGVyQmxvY2sgPSBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOworCWRldl9kYXRhLT5QYWdlRGF0YVNpemUgPSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJZGV2X2RhdGEtPndFQ0NCeXRlc1BlclNlY3RvciA9IERldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yOworCWRldl9kYXRhLT53RGF0YUJsb2NrTnVtID0gRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtOworCisJcmV0dXJuIFBBU1M7Cit9CisKKy8qIC4uLi4uICovCitzdGF0aWMgaW50IGFsbG9jYXRlX21lbW9yeSh2b2lkKQoreworCXUzMiBibG9ja190YWJsZV9zaXplLCBwYWdlX3NpemUsIGJsb2NrX3NpemUsIG1lbV9zaXplOworCXUzMiB0b3RhbF9ieXRlcyA9IDA7CisJaW50IGk7CisjaWYgQ01EX0RNQQorCWludCBqOworI2VuZGlmCisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJcGFnZV9zaXplID0gRGV2aWNlSW5mby53UGFnZVNpemU7CisJYmxvY2tfc2l6ZSA9IERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2sgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisKKwlibG9ja190YWJsZV9zaXplID0gRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICoKKwkJKHNpemVvZih1MzIpICsgc2l6ZW9mKHU4KSArIHNpemVvZih1MTYpKTsKKwlibG9ja190YWJsZV9zaXplICs9IChEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgLQorCQkoYmxvY2tfdGFibGVfc2l6ZSAlIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSkpICUKKwkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJLyogTWFsbG9jIG1lbW9yeSBmb3IgYmxvY2sgdGFibGVzICovCisJZ19wQmxvY2tUYWJsZSA9IGttYWxsb2MoYmxvY2tfdGFibGVfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFnX3BCbG9ja1RhYmxlKQorCQlnb3RvIGJsb2NrX3RhYmxlX2ZhaWw7CisJbWVtc2V0KGdfcEJsb2NrVGFibGUsIDAsIGJsb2NrX3RhYmxlX3NpemUpOworCXRvdGFsX2J5dGVzICs9IGJsb2NrX3RhYmxlX3NpemU7CisKKwlnX3BXZWFyQ291bnRlciA9ICh1OCAqKShnX3BCbG9ja1RhYmxlICsKKwkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHUzMikpOworCisJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKQorCQlnX3BSZWFkQ291bnRlciA9ICh1MTYgKikoZ19wQmxvY2tUYWJsZSArCisJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKgorCQkJKHNpemVvZih1MzIpICsgc2l6ZW9mKHU4KSkpOworCisJLyogTWFsbG9jIG1lbW9yeSBhbmQgaW5pdCBmb3IgY2FjaGUgaXRlbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ0FDSEVfSVRFTV9OVU07IGkrKykgeworCQlDYWNoZS5hcnJheVtpXS5hZGRyZXNzID0gTkFORF9DQUNIRV9JTklUX0FERFI7CisJCUNhY2hlLmFycmF5W2ldLnVzZV9jbnQgPSAwOworCQlDYWNoZS5hcnJheVtpXS5jaGFuZ2VkID0gQ0xFQVI7CisJCUNhY2hlLmFycmF5W2ldLmJ1ZiA9IGttYWxsb2MoQ2FjaGUuY2FjaGVfaXRlbV9zaXplLAorCQkJR0ZQX0FUT01JQyk7CisJCWlmICghQ2FjaGUuYXJyYXlbaV0uYnVmKQorCQkJZ290byBjYWNoZV9pdGVtX2ZhaWw7CisJCW1lbXNldChDYWNoZS5hcnJheVtpXS5idWYsIDAsIENhY2hlLmNhY2hlX2l0ZW1fc2l6ZSk7CisJCXRvdGFsX2J5dGVzICs9IENhY2hlLmNhY2hlX2l0ZW1fc2l6ZTsKKwl9CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBJUEYgKi8KKwlnX3BJUEYgPSBrbWFsbG9jKHBhZ2Vfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFnX3BJUEYpCisJCWdvdG8gaXBmX2ZhaWw7CisJbWVtc2V0KGdfcElQRiwgMCwgcGFnZV9zaXplKTsKKwl0b3RhbF9ieXRlcyArPSBwYWdlX3NpemU7CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBkYXRhIG1lcmdpbmcgZHVyaW5nIExldmVsMiBDYWNoZSBmbHVzaCAqLworCWNhY2hlX2wyX3BhZ2VfYnVmID0ga21hbGxvYyhwYWdlX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghY2FjaGVfbDJfcGFnZV9idWYpCisJCWdvdG8gY2FjaGVfbDJfcGFnZV9idWZfZmFpbDsKKwltZW1zZXQoY2FjaGVfbDJfcGFnZV9idWYsIDB4ZmYsIHBhZ2Vfc2l6ZSk7CisJdG90YWxfYnl0ZXMgKz0gcGFnZV9zaXplOworCisJY2FjaGVfbDJfYmxrX2J1ZiA9IGttYWxsb2MoYmxvY2tfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjYWNoZV9sMl9ibGtfYnVmKQorCQlnb3RvIGNhY2hlX2wyX2Jsa19idWZfZmFpbDsKKwltZW1zZXQoY2FjaGVfbDJfYmxrX2J1ZiwgMHhmZiwgYmxvY2tfc2l6ZSk7CisJdG90YWxfYnl0ZXMgKz0gYmxvY2tfc2l6ZTsKKworCS8qIE1hbGxvYyBtZW1vcnkgZm9yIHRlbXAgYnVmZmVyICovCisJZ19wVGVtcEJ1ZiA9IGttYWxsb2MoQ2FjaGUuY2FjaGVfaXRlbV9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWdfcFRlbXBCdWYpCisJCWdvdG8gVGVtcF9idWZfZmFpbDsKKwltZW1zZXQoZ19wVGVtcEJ1ZiwgMCwgQ2FjaGUuY2FjaGVfaXRlbV9zaXplKTsKKwl0b3RhbF9ieXRlcyArPSBDYWNoZS5jYWNoZV9pdGVtX3NpemU7CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBibG9jayB0YWJsZSBibG9ja3MgKi8KKwltZW1fc2l6ZSA9ICgxICsgTEFTVF9CVF9JRCAtIEZJUlNUX0JUX0lEKSAqIHNpemVvZih1MzIpOworCWdfcEJUQmxvY2tzID0ga21hbGxvYyhtZW1fc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFnX3BCVEJsb2NrcykKKwkJZ290byBidF9ibG9ja3NfZmFpbDsKKwltZW1zZXQoZ19wQlRCbG9ja3MsIDB4ZmYsIG1lbV9zaXplKTsKKwl0b3RhbF9ieXRlcyArPSBtZW1fc2l6ZTsKKworCS8qIE1hbGxvYyBtZW1vcnkgZm9yIGZ1bmN0aW9uIEZUTF9DaGVja19CbG9ja19UYWJsZSAqLworCWZsYWdfY2hlY2tfYmxrX3RhYmxlID0ga21hbGxvYyhEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0sIEdGUF9BVE9NSUMpOworCWlmICghZmxhZ19jaGVja19ibGtfdGFibGUpCisJCWdvdG8gZmxhZ19jaGVja19ibGtfdGFibGVfZmFpbDsKKwl0b3RhbF9ieXRlcyArPSBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBmdW5jdGlvbiBGVExfU2VhcmNoX0Jsb2NrX1RhYmxlX0lOX0Jsb2NrICovCisJdG1wX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2sgPSBrbWFsbG9jKHBhZ2Vfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0bXBfYnVmX3NlYXJjaF9idF9pbl9ibG9jaykKKwkJZ290byB0bXBfYnVmX3NlYXJjaF9idF9pbl9ibG9ja19mYWlsOworCW1lbXNldCh0bXBfYnVmX3NlYXJjaF9idF9pbl9ibG9jaywgMHhmZiwgcGFnZV9zaXplKTsKKwl0b3RhbF9ieXRlcyArPSBwYWdlX3NpemU7CisKKwltZW1fc2l6ZSA9IERldmljZUluZm8ud1BhZ2VTaXplIC0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCXNwYXJlX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2sgPSBrbWFsbG9jKG1lbV9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNwYXJlX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2spCisJCWdvdG8gc3BhcmVfYnVmX3NlYXJjaF9idF9pbl9ibG9ja19mYWlsOworCW1lbXNldChzcGFyZV9idWZfc2VhcmNoX2J0X2luX2Jsb2NrLCAweGZmLCBtZW1fc2l6ZSk7CisJdG90YWxfYnl0ZXMgKz0gbWVtX3NpemU7CisKKwlzcGFyZV9idWZfYnRfc2VhcmNoX2J0X2luX2Jsb2NrID0ga21hbGxvYyhtZW1fc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzcGFyZV9idWZfYnRfc2VhcmNoX2J0X2luX2Jsb2NrKQorCQlnb3RvIHNwYXJlX2J1Zl9idF9zZWFyY2hfYnRfaW5fYmxvY2tfZmFpbDsKKwltZW1zZXQoc3BhcmVfYnVmX2J0X3NlYXJjaF9idF9pbl9ibG9jaywgMHhmZiwgbWVtX3NpemUpOworCXRvdGFsX2J5dGVzICs9IG1lbV9zaXplOworCisJLyogTWFsbG9jIG1lbW9yeSBmb3IgZnVuY3Rpb24gRlRMX1JlYWRfQmxvY2tfVGFibGUgKi8KKwl0bXBfYnVmMV9yZWFkX2Jsa190YWJsZSA9IGttYWxsb2MocGFnZV9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRtcF9idWYxX3JlYWRfYmxrX3RhYmxlKQorCQlnb3RvIHRtcF9idWYxX3JlYWRfYmxrX3RhYmxlX2ZhaWw7CisJbWVtc2V0KHRtcF9idWYxX3JlYWRfYmxrX3RhYmxlLCAweGZmLCBwYWdlX3NpemUpOworCXRvdGFsX2J5dGVzICs9IHBhZ2Vfc2l6ZTsKKworCXRtcF9idWYyX3JlYWRfYmxrX3RhYmxlID0ga21hbGxvYyhwYWdlX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghdG1wX2J1ZjJfcmVhZF9ibGtfdGFibGUpCisJCWdvdG8gdG1wX2J1ZjJfcmVhZF9ibGtfdGFibGVfZmFpbDsKKwltZW1zZXQodG1wX2J1ZjJfcmVhZF9ibGtfdGFibGUsIDB4ZmYsIHBhZ2Vfc2l6ZSk7CisJdG90YWxfYnl0ZXMgKz0gcGFnZV9zaXplOworCisJLyogTWFsbG9jIG1lbW9yeSBmb3IgZnVuY3Rpb24gRlRMX1N0YXRpY19XZWFyX0xldmVsaW5nICovCisJZmxhZ3Nfc3RhdGljX3dlYXJfbGV2ZWxpbmcgPSBrbWFsbG9jKERldmljZUluZm8ud0RhdGFCbG9ja051bSwKKwkJCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFmbGFnc19zdGF0aWNfd2Vhcl9sZXZlbGluZykKKwkJZ290byBmbGFnc19zdGF0aWNfd2Vhcl9sZXZlbGluZ19mYWlsOworCXRvdGFsX2J5dGVzICs9IERldmljZUluZm8ud0RhdGFCbG9ja051bTsKKworCS8qIE1hbGxvYyBtZW1vcnkgZm9yIGZ1bmN0aW9uIEZUTF9Xcml0ZV9CbG9ja19UYWJsZV9EYXRhICovCisJaWYgKEZUTF9HZXRfQmxvY2tfVGFibGVfRmxhc2hfU2l6ZV9QYWdlcygpID4gMykKKwkJbWVtX3NpemUgPSBGVExfR2V0X0Jsb2NrX1RhYmxlX0ZsYXNoX1NpemVfQnl0ZXMoKSAtCisJCQkJMiAqIERldmljZUluZm8ud1BhZ2VTaXplOworCWVsc2UKKwkJbWVtX3NpemUgPSBEZXZpY2VJbmZvLndQYWdlU2l6ZTsKKwl0bXBfYnVmX3dyaXRlX2Jsa190YWJsZV9kYXRhID0ga21hbGxvYyhtZW1fc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0bXBfYnVmX3dyaXRlX2Jsa190YWJsZV9kYXRhKQorCQlnb3RvIHRtcF9idWZfd3JpdGVfYmxrX3RhYmxlX2RhdGFfZmFpbDsKKwltZW1zZXQodG1wX2J1Zl93cml0ZV9ibGtfdGFibGVfZGF0YSwgMHhmZiwgbWVtX3NpemUpOworCXRvdGFsX2J5dGVzICs9IG1lbV9zaXplOworCisJLyogTWFsbG9jIG1lbW9yeSBmb3IgZnVuY3Rpb24gRlRMX1JlYWRfRGlzdHVyYmFuY2UgKi8KKwl0bXBfYnVmX3JlYWRfZGlzdHVyYmFuY2UgPSBrbWFsbG9jKGJsb2NrX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghdG1wX2J1Zl9yZWFkX2Rpc3R1cmJhbmNlKQorCQlnb3RvIHRtcF9idWZfcmVhZF9kaXN0dXJiYW5jZV9mYWlsOworCW1lbXNldCh0bXBfYnVmX3JlYWRfZGlzdHVyYmFuY2UsIDB4ZmYsIGJsb2NrX3NpemUpOworCXRvdGFsX2J5dGVzICs9IGJsb2NrX3NpemU7CisKKwkvKiBBbGxvYyBtZW0gZm9yIGZ1bmN0aW9uIE5BTkRfUmVhZF9QYWdlX01haW5fU3BhcmUgb2YgbGxkX25hbmQuYyAqLworCWJ1Zl9yZWFkX3BhZ2VfbWFpbl9zcGFyZSA9IGttYWxsb2MoRGV2aWNlSW5mby53UGFnZVNpemUsIEdGUF9BVE9NSUMpOworCWlmICghYnVmX3JlYWRfcGFnZV9tYWluX3NwYXJlKQorCQlnb3RvIGJ1Zl9yZWFkX3BhZ2VfbWFpbl9zcGFyZV9mYWlsOworCXRvdGFsX2J5dGVzICs9IERldmljZUluZm8ud1BhZ2VTaXplOworCisJLyogQWxsb2MgbWVtIGZvciBmdW5jdGlvbiBOQU5EX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSBvZiBsbGRfbmFuZC5jICovCisJYnVmX3dyaXRlX3BhZ2VfbWFpbl9zcGFyZSA9IGttYWxsb2MoRGV2aWNlSW5mby53UGFnZVNpemUsIEdGUF9BVE9NSUMpOworCWlmICghYnVmX3dyaXRlX3BhZ2VfbWFpbl9zcGFyZSkKKwkJZ290byBidWZfd3JpdGVfcGFnZV9tYWluX3NwYXJlX2ZhaWw7CisJdG90YWxfYnl0ZXMgKz0gRGV2aWNlSW5mby53UGFnZVNpemU7CisKKwkvKiBBbGxvYyBtZW0gZm9yIGZ1bmN0aW9uIE5BTkRfUmVhZF9QYWdlX1NwYXJlIG9mIGxsZF9uYW5kLmMgKi8KKwlidWZfcmVhZF9wYWdlX3NwYXJlID0ga21hbGxvYyhEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1Zl9yZWFkX3BhZ2Vfc3BhcmUpCisJCWdvdG8gYnVmX3JlYWRfcGFnZV9zcGFyZV9mYWlsOworCW1lbXNldChidWZfcmVhZF9wYWdlX3NwYXJlLCAweGZmLCBEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplKTsKKwl0b3RhbF9ieXRlcyArPSBEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplOworCisJLyogQWxsb2MgbWVtIGZvciBmdW5jdGlvbiBOQU5EX0dldF9CYWRfQmxvY2sgb2YgbGxkX25hbmQuYyAqLworCWJ1Zl9nZXRfYmFkX2Jsb2NrID0ga21hbGxvYyhEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1Zl9nZXRfYmFkX2Jsb2NrKQorCQlnb3RvIGJ1Zl9nZXRfYmFkX2Jsb2NrX2ZhaWw7CisJbWVtc2V0KGJ1Zl9nZXRfYmFkX2Jsb2NrLCAweGZmLCBEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplKTsKKwl0b3RhbF9ieXRlcyArPSBEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplOworCisjaWYgQ01EX0RNQQorCWdfdGVtcF9idWYgPSBrbWFsbG9jKGJsb2NrX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghZ190ZW1wX2J1ZikKKwkJZ290byB0ZW1wX2J1Zl9mYWlsOworCW1lbXNldChnX3RlbXBfYnVmLCAweGZmLCBibG9ja19zaXplKTsKKwl0b3RhbF9ieXRlcyArPSBibG9ja19zaXplOworCisJLyogTWFsbG9jIG1lbW9yeSBmb3IgY29weSBvZiBibG9jayB0YWJsZSB1c2VkIGluIENETUEgbW9kZSAqLworCWdfcEJUU3RhcnRpbmdDb3B5ID0ga21hbGxvYyhibG9ja190YWJsZV9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWdfcEJUU3RhcnRpbmdDb3B5KQorCQlnb3RvIGJ0X3N0YXJ0aW5nX2NvcHk7CisJbWVtc2V0KGdfcEJUU3RhcnRpbmdDb3B5LCAwLCBibG9ja190YWJsZV9zaXplKTsKKwl0b3RhbF9ieXRlcyArPSBibG9ja190YWJsZV9zaXplOworCisJZ19wV2VhckNvdW50ZXJDb3B5ID0gKHU4ICopKGdfcEJUU3RhcnRpbmdDb3B5ICsKKwkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHUzMikpOworCisJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKQorCQlnX3BSZWFkQ291bnRlckNvcHkgPSAodTE2ICopKGdfcEJUU3RhcnRpbmdDb3B5ICsKKwkJCURldmljZUluZm8ud0RhdGFCbG9ja051bSAqCisJCQkoc2l6ZW9mKHUzMikgKyBzaXplb2YodTgpKSk7CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBibG9jayB0YWJsZSBjb3BpZXMgKi8KKwltZW1fc2l6ZSA9IDUgKiBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTMyKSArCisJCQk1ICogRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KTsKKwlpZiAoRGV2aWNlSW5mby5NTENEZXZpY2UpCisJCW1lbV9zaXplICs9IDUgKiBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTE2KTsKKwlnX3BCbG9ja1RhYmxlQ29waWVzID0ga21hbGxvYyhtZW1fc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFnX3BCbG9ja1RhYmxlQ29waWVzKQorCQlnb3RvIGJsa190YWJsZV9jb3BpZXNfZmFpbDsKKwltZW1zZXQoZ19wQmxvY2tUYWJsZUNvcGllcywgMCwgbWVtX3NpemUpOworCXRvdGFsX2J5dGVzICs9IG1lbV9zaXplOworCWdfcE5leHRCbG9ja1RhYmxlID0gZ19wQmxvY2tUYWJsZUNvcGllczsKKworCS8qIE1hbGxvYyBtZW1vcnkgZm9yIEJsb2NrIFRhYmxlIERlbHRhICovCisJbWVtX3NpemUgPSBNQVhfREVTQ1MgKiBzaXplb2Yoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSk7CisJZ19wQlREZWx0YSA9IGttYWxsb2MobWVtX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghZ19wQlREZWx0YSkKKwkJZ290byBidF9kZWx0YV9mYWlsOworCW1lbXNldChnX3BCVERlbHRhLCAwLCBtZW1fc2l6ZSk7CisJdG90YWxfYnl0ZXMgKz0gbWVtX3NpemU7CisJZ19wQlREZWx0YV9GcmVlID0gZ19wQlREZWx0YTsKKworCS8qIE1hbGxvYyBtZW1vcnkgZm9yIENvcHkgQmFjayBCdWZmZXJzICovCisJZm9yIChqID0gMDsgaiA8IENPUFlfQkFDS19CVUZfTlVNOyBqKyspIHsKKwkJY3BfYmFja19idWZfY29waWVzW2pdID0ga21hbGxvYyhibG9ja19zaXplLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFjcF9iYWNrX2J1Zl9jb3BpZXNbal0pCisJCQlnb3RvIGNwX2JhY2tfYnVmX2NvcGllc19mYWlsOworCQltZW1zZXQoY3BfYmFja19idWZfY29waWVzW2pdLCAwLCBibG9ja19zaXplKTsKKwkJdG90YWxfYnl0ZXMgKz0gYmxvY2tfc2l6ZTsKKwl9CisJY3BfYmFja19idWZfaWR4ID0gMDsKKworCS8qIE1hbGxvYyBtZW1vcnkgZm9yIHBlbmRpbmcgY29tbWFuZHMgbGlzdCAqLworCW1lbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBwZW5kaW5nX2NtZCkgKiBNQVhfREVTQ1M7CisJaW5mby5wY21kcyA9IGt6YWxsb2MobWVtX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghaW5mby5wY21kcykKKwkJZ290byBwZW5kaW5nX2NtZHNfYnVmX2ZhaWw7CisJdG90YWxfYnl0ZXMgKz0gbWVtX3NpemU7CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBDRE1BIGRlc2NyaXB0ZXIgdGFibGUgKi8KKwltZW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yKSAqIE1BWF9ERVNDUzsKKwlpbmZvLmNkbWFfZGVzY19idWYgPSBremFsbG9jKG1lbV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8uY2RtYV9kZXNjX2J1ZikKKwkJZ290byBjZG1hX2Rlc2NfYnVmX2ZhaWw7CisJdG90YWxfYnl0ZXMgKz0gbWVtX3NpemU7CisKKwkvKiBNYWxsb2MgbWVtb3J5IGZvciBNZW1jcHkgZGVzY3JpcHRlciB0YWJsZSAqLworCW1lbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBtZW1jcHlfZGVzY3JpcHRvcikgKiBNQVhfREVTQ1M7CisJaW5mby5tZW1jcF9kZXNjX2J1ZiA9IGt6YWxsb2MobWVtX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghaW5mby5tZW1jcF9kZXNjX2J1ZikKKwkJZ290byBtZW1jcF9kZXNjX2J1Zl9mYWlsOworCXRvdGFsX2J5dGVzICs9IG1lbV9zaXplOworI2VuZGlmCisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkiVG90YWwgbWVtb3J5IGFsbG9jYXRlZCBpbiBGVEwgbGF5ZXI6ICVkXG4iLCB0b3RhbF9ieXRlcyk7CisKKwlyZXR1cm4gUEFTUzsKKworI2lmIENNRF9ETUEKK21lbWNwX2Rlc2NfYnVmX2ZhaWw6CisJa2ZyZWUoaW5mby5jZG1hX2Rlc2NfYnVmKTsKK2NkbWFfZGVzY19idWZfZmFpbDoKKwlrZnJlZShpbmZvLnBjbWRzKTsKK3BlbmRpbmdfY21kc19idWZfZmFpbDoKK2NwX2JhY2tfYnVmX2NvcGllc19mYWlsOgorCWotLTsKKwlmb3IgKDsgaiA+PSAwOyBqLS0pCisJCWtmcmVlKGNwX2JhY2tfYnVmX2NvcGllc1tqXSk7CisJa2ZyZWUoZ19wQlREZWx0YSk7CitidF9kZWx0YV9mYWlsOgorCWtmcmVlKGdfcEJsb2NrVGFibGVDb3BpZXMpOworYmxrX3RhYmxlX2NvcGllc19mYWlsOgorCWtmcmVlKGdfcEJUU3RhcnRpbmdDb3B5KTsKK2J0X3N0YXJ0aW5nX2NvcHk6CisJa2ZyZWUoZ190ZW1wX2J1Zik7Cit0ZW1wX2J1Zl9mYWlsOgorCWtmcmVlKGJ1Zl9nZXRfYmFkX2Jsb2NrKTsKKyNlbmRpZgorCitidWZfZ2V0X2JhZF9ibG9ja19mYWlsOgorCWtmcmVlKGJ1Zl9yZWFkX3BhZ2Vfc3BhcmUpOworYnVmX3JlYWRfcGFnZV9zcGFyZV9mYWlsOgorCWtmcmVlKGJ1Zl93cml0ZV9wYWdlX21haW5fc3BhcmUpOworYnVmX3dyaXRlX3BhZ2VfbWFpbl9zcGFyZV9mYWlsOgorCWtmcmVlKGJ1Zl9yZWFkX3BhZ2VfbWFpbl9zcGFyZSk7CitidWZfcmVhZF9wYWdlX21haW5fc3BhcmVfZmFpbDoKKwlrZnJlZSh0bXBfYnVmX3JlYWRfZGlzdHVyYmFuY2UpOwordG1wX2J1Zl9yZWFkX2Rpc3R1cmJhbmNlX2ZhaWw6CisJa2ZyZWUodG1wX2J1Zl93cml0ZV9ibGtfdGFibGVfZGF0YSk7Cit0bXBfYnVmX3dyaXRlX2Jsa190YWJsZV9kYXRhX2ZhaWw6CisJa2ZyZWUoZmxhZ3Nfc3RhdGljX3dlYXJfbGV2ZWxpbmcpOworZmxhZ3Nfc3RhdGljX3dlYXJfbGV2ZWxpbmdfZmFpbDoKKwlrZnJlZSh0bXBfYnVmMl9yZWFkX2Jsa190YWJsZSk7Cit0bXBfYnVmMl9yZWFkX2Jsa190YWJsZV9mYWlsOgorCWtmcmVlKHRtcF9idWYxX3JlYWRfYmxrX3RhYmxlKTsKK3RtcF9idWYxX3JlYWRfYmxrX3RhYmxlX2ZhaWw6CisJa2ZyZWUoc3BhcmVfYnVmX2J0X3NlYXJjaF9idF9pbl9ibG9jayk7CitzcGFyZV9idWZfYnRfc2VhcmNoX2J0X2luX2Jsb2NrX2ZhaWw6CisJa2ZyZWUoc3BhcmVfYnVmX3NlYXJjaF9idF9pbl9ibG9jayk7CitzcGFyZV9idWZfc2VhcmNoX2J0X2luX2Jsb2NrX2ZhaWw6CisJa2ZyZWUodG1wX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2spOwordG1wX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2tfZmFpbDoKKwlrZnJlZShmbGFnX2NoZWNrX2Jsa190YWJsZSk7CitmbGFnX2NoZWNrX2Jsa190YWJsZV9mYWlsOgorCWtmcmVlKGdfcEJUQmxvY2tzKTsKK2J0X2Jsb2Nrc19mYWlsOgorCWtmcmVlKGdfcFRlbXBCdWYpOworVGVtcF9idWZfZmFpbDoKKwlrZnJlZShjYWNoZV9sMl9ibGtfYnVmKTsKK2NhY2hlX2wyX2Jsa19idWZfZmFpbDoKKwlrZnJlZShjYWNoZV9sMl9wYWdlX2J1Zik7CitjYWNoZV9sMl9wYWdlX2J1Zl9mYWlsOgorCWtmcmVlKGdfcElQRik7CitpcGZfZmFpbDoKK2NhY2hlX2l0ZW1fZmFpbDoKKwlpLS07CisJZm9yICg7IGkgPj0gMDsgaS0tKQorCQlrZnJlZShDYWNoZS5hcnJheVtpXS5idWYpOworCWtmcmVlKGdfcEJsb2NrVGFibGUpOworYmxvY2tfdGFibGVfZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBrbWFsbG9jIG1lbW9yeSBpbiAlcyBMaW5lICVkLlxuIiwKKwkJX19GSUxFX18sIF9fTElORV9fKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCisvKiAuLi4uICovCitzdGF0aWMgaW50IGZyZWVfbWVtb3J5KHZvaWQpCit7CisJaW50IGk7CisKKyNpZiBDTURfRE1BCisJa2ZyZWUoaW5mby5tZW1jcF9kZXNjX2J1Zik7CisJa2ZyZWUoaW5mby5jZG1hX2Rlc2NfYnVmKTsKKwlrZnJlZShpbmZvLnBjbWRzKTsKKwlmb3IgKGkgPSBDT1BZX0JBQ0tfQlVGX05VTSAtIDE7IGkgPj0gMDsgaS0tKQorCQlrZnJlZShjcF9iYWNrX2J1Zl9jb3BpZXNbaV0pOworCWtmcmVlKGdfcEJURGVsdGEpOworCWtmcmVlKGdfcEJsb2NrVGFibGVDb3BpZXMpOworCWtmcmVlKGdfcEJUU3RhcnRpbmdDb3B5KTsKKwlrZnJlZShnX3RlbXBfYnVmKTsKKwlrZnJlZShidWZfZ2V0X2JhZF9ibG9jayk7CisjZW5kaWYKKwlrZnJlZShidWZfcmVhZF9wYWdlX3NwYXJlKTsKKwlrZnJlZShidWZfd3JpdGVfcGFnZV9tYWluX3NwYXJlKTsKKwlrZnJlZShidWZfcmVhZF9wYWdlX21haW5fc3BhcmUpOworCWtmcmVlKHRtcF9idWZfcmVhZF9kaXN0dXJiYW5jZSk7CisJa2ZyZWUodG1wX2J1Zl93cml0ZV9ibGtfdGFibGVfZGF0YSk7CisJa2ZyZWUoZmxhZ3Nfc3RhdGljX3dlYXJfbGV2ZWxpbmcpOworCWtmcmVlKHRtcF9idWYyX3JlYWRfYmxrX3RhYmxlKTsKKwlrZnJlZSh0bXBfYnVmMV9yZWFkX2Jsa190YWJsZSk7CisJa2ZyZWUoc3BhcmVfYnVmX2J0X3NlYXJjaF9idF9pbl9ibG9jayk7CisJa2ZyZWUoc3BhcmVfYnVmX3NlYXJjaF9idF9pbl9ibG9jayk7CisJa2ZyZWUodG1wX2J1Zl9zZWFyY2hfYnRfaW5fYmxvY2spOworCWtmcmVlKGZsYWdfY2hlY2tfYmxrX3RhYmxlKTsKKwlrZnJlZShnX3BCVEJsb2Nrcyk7CisJa2ZyZWUoZ19wVGVtcEJ1Zik7CisJa2ZyZWUoZ19wSVBGKTsKKwlmb3IgKGkgPSBDQUNIRV9JVEVNX05VTSAtIDE7IGkgPj0gMDsgaS0tKQorCQlrZnJlZShDYWNoZS5hcnJheVtpXS5idWYpOworCWtmcmVlKGdfcEJsb2NrVGFibGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY2FjaGVfbDJfdGFibGUodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBzcGVjdHJhX2wyX2NhY2hlX2xpc3QgKnBuZDsKKwlpbnQgbiwgaTsKKworCW4gPSAwOworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlX2wyLnRhYmxlLmxpc3QpIHsKKwkJcG5kID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc3BlY3RyYV9sMl9jYWNoZV9saXN0LCBsaXN0KTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgImR1bXBfY2FjaGVfbDJfdGFibGUgbm9kZTogJWQsIGxvZ2ljYWxfYmxrX251bTogJWRcbiIsIG4sIHBuZC0+bG9naWNhbF9ibGtfbnVtKTsKKy8qCisJCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOyBpKyspIHsKKwkJCWlmIChwbmQtPnBhZ2VzX2FycmF5W2ldICE9IE1BWF9VMzJfVkFMVUUpCisJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiAgICBwYWdlc19hcnJheVslZF06IDB4JXhcbiIsIGksIHBuZC0+cGFnZXNfYXJyYXlbaV0pOworCQl9CisqLworCQluKys7CisJfQorfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBHTE9CX0ZUTF9Jbml0CisqIElucHV0czogICAgICAgbm9uZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAvIEZBSUw9MQorKiBEZXNjcmlwdGlvbjogIGFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciBjYWNoZSBhcnJheSwKKyogICAgICAgICAgICAgICBpbXBvcnRhbnQgZGF0YSBzdHJ1Y3R1cmVzCisqICAgICAgICAgICAgICAgY2xlYXJzIHRoZSBjYWNoZSBhcnJheQorKiAgICAgICAgICAgICAgIHJlYWRzIHRoZSBibG9jayB0YWJsZSBmcm9tIGZsYXNoIGludG8gYXJyYXkKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworaW50IEdMT0JfRlRMX0luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlDYWNoZS5wYWdlc19wZXJfaXRlbSA9IDE7CisJQ2FjaGUuY2FjaGVfaXRlbV9zaXplID0gMSAqIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKworCWlmIChhbGxvY2F0ZV9tZW1vcnkoKSAhPSBQQVNTKQorCQlyZXR1cm4gRkFJTDsKKworI2lmIENNRF9ETUEKKyNpZiBSRVNUT1JFX0NBQ0hFX09OX0NETUFfQ0hBSU5fRkFJTFVSRQorCW1lbWNweSgodm9pZCAqKSZjYWNoZV9zdGFydF9jb3B5LCAodm9pZCAqKSZDYWNoZSwKKwkJc2l6ZW9mKHN0cnVjdCBmbGFzaF9jYWNoZV90YWcpKTsKKwltZW1zZXQoKHZvaWQgKikmaW50X2NhY2hlLCAtMSwKKwkJc2l6ZW9mKHN0cnVjdCBmbGFzaF9jYWNoZV9kZWx0YV9saXN0X3RhZykgKgorCQkoTUFYX0NIQU5TICsgTUFYX0RFU0NTKSk7CisjZW5kaWYKKwlmdGxfY21kX2NudCA9IDA7CisjZW5kaWYKKworCWlmIChGVExfUmVhZF9CbG9ja19UYWJsZSgpICE9IFBBU1MpCisJCXJldHVybiBGQUlMOworCisJLyogSW5pdCB0aGUgTGV2ZWwyIENhY2hlIGRhdGEgc3RydWN0dXJlICovCisJZm9yIChpID0gMDsgaSA8IEJMS19OVU1fRk9SX0wyX0NBQ0hFOyBpKyspCisJCWNhY2hlX2wyLmJsa19hcnJheVtpXSA9IE1BWF9VMzJfVkFMVUU7CisJY2FjaGVfbDIuY3VyX2Jsa19pZHggPSAwOworCWNhY2hlX2wyLmN1cl9wYWdlX251bSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlX2wyLnRhYmxlLmxpc3QpOworCWNhY2hlX2wyLnRhYmxlLmxvZ2ljYWxfYmxrX251bSA9IE1BWF9VMzJfVkFMVUU7CisKKwlkdW1wX2NhY2hlX2wyX3RhYmxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWYgQ01EX0RNQQorI2lmIDAKK3N0YXRpYyB2b2lkIHNhdmVfYmxrX3RhYmxlX2NoYW5nZXModTE2IGlkeCkKK3sKKwl1OCBmdGxfY21kOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJUU3RhcnRpbmdDb3B5OworCisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKKwl1MTYgaWQ7CisJdTggY2FjaGVfYmxrczsKKworCWlkID0gaWR4IC0gTUFYX0NIQU5TOworCWlmIChpbnRfY2FjaGVbaWRdLml0ZW0gIT0gLTEpIHsKKwkJY2FjaGVfYmxrcyA9IGludF9jYWNoZVtpZF0uaXRlbTsKKwkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5hZGRyZXNzID0KKwkJCWludF9jYWNoZVtpZF0uY2FjaGUuYWRkcmVzczsKKwkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5jaGFuZ2VkID0KKwkJCWludF9jYWNoZVtpZF0uY2FjaGUuY2hhbmdlZDsKKwl9CisjZW5kaWYKKworCWZ0bF9jbWQgPSBwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQ7CisKKwl3aGlsZSAoZnRsX2NtZCA8PSBQZW5kaW5nQ01EW2lkeF0uVGFnKSB7CisJCWlmIChwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPT0gMHgwMSkgeworCQkJZ193QmxvY2tUYWJsZU9mZnNldCA9CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmdfd0Jsb2NrVGFibGVPZmZzZXQ7CisJCX0gZWxzZSBpZiAocF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID09IDB4MEMpIHsKKwkJCXBidFtwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXhdID0KKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWU7CisJCQlkZWJ1Z19ib3VuZGFyeV9lcnJvcigoKAorCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9JbmRleCkpLAorCQkJCURldmljZUluZm8ud0RhdGFCbG9ja051bSwgMCk7CisJCX0gZWxzZSBpZiAocF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID09IDB4MDMpIHsKKwkJCWdfd0Jsb2NrVGFibGVPZmZzZXQgPQorCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5nX3dCbG9ja1RhYmxlT2Zmc2V0OworCQkJZ193QmxvY2tUYWJsZUluZGV4ID0KKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+Z193QmxvY2tUYWJsZUluZGV4OworCQl9IGVsc2UgaWYgKHBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9PSAweDMwKSB7CisJCQlnX3BXZWFyQ291bnRlckNvcHlbcF9CVGFibGVDaGFuZ2VzRGVsdGEtPldDX0luZGV4XSA9CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPldDX0VudHJ5X1ZhbHVlOworCQl9IGVsc2UgaWYgKChEZXZpY2VJbmZvLk1MQ0RldmljZSkgJiYKKwkJCShwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPT0gMHhDMCkpIHsKKwkJCWdfcFJlYWRDb3VudGVyQ29weVtwX0JUYWJsZUNoYW5nZXNEZWx0YS0+UkNfSW5kZXhdID0KKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+UkNfRW50cnlfVmFsdWU7CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiSW4gZXZlbnQgc3RhdHVzIHNldHRpbmcgcmVhZCBjb3VudGVyICIKKwkJCQkiR0xPQl9mdGxfY21kX2NudCAldSBDb3VudCAldSBJbmRleCAldVxuIiwKKwkJCQlmdGxfY21kLAorCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5SQ19FbnRyeV9WYWx1ZSwKKwkJCQkodW5zaWduZWQgaW50KXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5SQ19JbmRleCk7CisJCX0gZWxzZSB7CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIgXG4iKTsKKwkJfQorCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSArPSAxOworCQlmdGxfY21kID0gcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250OworCX0KK30KKworc3RhdGljIHZvaWQgZGlzY2FyZF9jbWRzKHUxNiBuKQoreworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJUU3RhcnRpbmdDb3B5OworCXU4IGZ0bF9jbWQ7CisJdW5zaWduZWQgbG9uZyBrOworI2lmIFJFU1RPUkVfQ0FDSEVfT05fQ0RNQV9DSEFJTl9GQUlMVVJFCisJdTggY2FjaGVfYmxrczsKKwl1MTYgaWQ7CisjZW5kaWYKKworCWlmICgoUGVuZGluZ0NNRFtuXS5DTUQgPT0gV1JJVEVfTUFJTl9DTUQpIHx8CisJCShQZW5kaW5nQ01EW25dLkNNRCA9PSBXUklURV9NQUlOX1NQQVJFX0NNRCkpIHsKKwkJZm9yIChrID0gMDsgayA8IERldmljZUluZm8ud0RhdGFCbG9ja051bTsgaysrKSB7CisJCQlpZiAoUGVuZGluZ0NNRFtuXS5CbG9jayA9PSAocGJ0W2tdICYgKH5CQURfQkxPQ0spKSkKKwkJCQlNQVJLX0JMS19BU19ESVNDQVJEKHBidFtrXSk7CisJCX0KKwl9CisKKwlmdGxfY21kID0gcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250OworCXdoaWxlIChmdGxfY21kIDw9IFBlbmRpbmdDTURbbl0uVGFnKSB7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhICs9IDE7CisJCWZ0bF9jbWQgPSBwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQ7CisJfQorCisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKKwlpZCA9IG4gLSBNQVhfQ0hBTlM7CisKKwlpZiAoaW50X2NhY2hlW2lkXS5pdGVtICE9IC0xKSB7CisJCWNhY2hlX2Jsa3MgPSBpbnRfY2FjaGVbaWRdLml0ZW07CisJCWlmIChQZW5kaW5nQ01EW25dLkNNRCA9PSBNRU1DT1BZX0NNRCkgeworCQkJaWYgKChjYWNoZV9zdGFydF9jb3B5LmFycmF5W2NhY2hlX2Jsa3NdLmJ1ZiA8PQorCQkJCVBlbmRpbmdDTURbbl0uRGF0YURlc3RBZGRyKSAmJgorCQkJCSgoY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5idWYgKworCQkJCUNhY2hlLmNhY2hlX2l0ZW1fc2l6ZSkgPgorCQkJCVBlbmRpbmdDTURbbl0uRGF0YURlc3RBZGRyKSkgeworCQkJCWNhY2hlX3N0YXJ0X2NvcHkuYXJyYXlbY2FjaGVfYmxrc10uYWRkcmVzcyA9CisJCQkJCQlOQU5EX0NBQ0hFX0lOSVRfQUREUjsKKwkJCQljYWNoZV9zdGFydF9jb3B5LmFycmF5W2NhY2hlX2Jsa3NdLnVzZV9jbnQgPQorCQkJCQkJCQkwOworCQkJCWNhY2hlX3N0YXJ0X2NvcHkuYXJyYXlbY2FjaGVfYmxrc10uY2hhbmdlZCA9CisJCQkJCQkJCUNMRUFSOworCQkJfQorCQl9IGVsc2UgeworCQkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5hZGRyZXNzID0KKwkJCQkJaW50X2NhY2hlW2lkXS5jYWNoZS5hZGRyZXNzOworCQkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5jaGFuZ2VkID0KKwkJCQkJaW50X2NhY2hlW2lkXS5jYWNoZS5jaGFuZ2VkOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY21kX3Bhc3MoaW50ICpmaXJzdF9mYWlsZWRfY21kLCB1MTYgaWR4KQoreworCWlmICgwID09ICpmaXJzdF9mYWlsZWRfY21kKQorCQlzYXZlX2Jsa190YWJsZV9jaGFuZ2VzKGlkeCk7CisJZWxzZQorCQlkaXNjYXJkX2NtZHMoaWR4KTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19jbWRfZmFpbF9hYm9ydChpbnQgKmZpcnN0X2ZhaWxlZF9jbWQsCisJCQkJdTE2IGlkeCwgaW50IGV2ZW50KQoreworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJUU3RhcnRpbmdDb3B5OworCXU4IGZ0bF9jbWQ7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBlcmFzZV9mYWlsLCBwcm9ncmFtX2ZhaWw7CisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKKwl1OCBjYWNoZV9ibGtzOworCXUxNiBpZDsKKyNlbmRpZgorCisJaWYgKDAgPT0gKmZpcnN0X2ZhaWxlZF9jbWQpCisJCSpmaXJzdF9mYWlsZWRfY21kID0gUGVuZGluZ0NNRFtpZHhdLlNCRENtZEluZGV4OworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJVbmNvcnJlY3RhYmxlIGVycm9yIGhhcyBvY2N1cmVkICIKKwkJIndoaWxlIGV4ZWN1dGluZyAldSBDb21tYW5kICV1IGFjY2VzaW5nIEJsb2NrICV1XG4iLAorCQkodW5zaWduZWQgaW50KXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudCwKKwkJUGVuZGluZ0NNRFtpZHhdLkNNRCwKKwkJKHVuc2lnbmVkIGludClQZW5kaW5nQ01EW2lkeF0uQmxvY2spOworCisJZnRsX2NtZCA9IHBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudDsKKwl3aGlsZSAoZnRsX2NtZCA8PSBQZW5kaW5nQ01EW2lkeF0uVGFnKSB7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhICs9IDE7CisJCWZ0bF9jbWQgPSBwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQ7CisJfQorCisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKKwlpZCA9IGlkeCAtIE1BWF9DSEFOUzsKKworCWlmIChpbnRfY2FjaGVbaWRdLml0ZW0gIT0gLTEpIHsKKwkJY2FjaGVfYmxrcyA9IGludF9jYWNoZVtpZF0uaXRlbTsKKwkJaWYgKChQZW5kaW5nQ01EW2lkeF0uQ01EID09IFdSSVRFX01BSU5fQ01EKSkgeworCQkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5hZGRyZXNzID0KKwkJCQkJaW50X2NhY2hlW2lkXS5jYWNoZS5hZGRyZXNzOworCQkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS5jaGFuZ2VkID0gU0VUOworCQl9IGVsc2UgaWYgKChQZW5kaW5nQ01EW2lkeF0uQ01EID09IFJFQURfTUFJTl9DTUQpKSB7CisJCQljYWNoZV9zdGFydF9jb3B5LmFycmF5W2NhY2hlX2Jsa3NdLmFkZHJlc3MgPQorCQkJCU5BTkRfQ0FDSEVfSU5JVF9BRERSOworCQkJY2FjaGVfc3RhcnRfY29weS5hcnJheVtjYWNoZV9ibGtzXS51c2VfY250ID0gMDsKKwkJCWNhY2hlX3N0YXJ0X2NvcHkuYXJyYXlbY2FjaGVfYmxrc10uY2hhbmdlZCA9CisJCQkJCQkJQ0xFQVI7CisJCX0gZWxzZSBpZiAoUGVuZGluZ0NNRFtpZHhdLkNNRCA9PSBFUkFTRV9DTUQpIHsKKwkJCS8qID8gKi8KKwkJfSBlbHNlIGlmIChQZW5kaW5nQ01EW2lkeF0uQ01EID09IE1FTUNPUFlfQ01EKSB7CisJCQkvKiA/ICovCisJCX0KKwl9CisjZW5kaWYKKworCWVyYXNlX2ZhaWwgPSAoZXZlbnQgPT0gRVZFTlRfRVJBU0VfRkFJTFVSRSkgJiYKKwkJCShQZW5kaW5nQ01EW2lkeF0uQ01EID09IEVSQVNFX0NNRCk7CisKKwlwcm9ncmFtX2ZhaWwgPSAoZXZlbnQgPT0gRVZFTlRfUFJPR1JBTV9GQUlMVVJFKSAmJgorCQkJKChQZW5kaW5nQ01EW2lkeF0uQ01EID09IFdSSVRFX01BSU5fQ01EKSB8fAorCQkJKFBlbmRpbmdDTURbaWR4XS5DTUQgPT0gV1JJVEVfTUFJTl9TUEFSRV9DTUQpKTsKKworCWlmIChlcmFzZV9mYWlsIHx8IHByb2dyYW1fZmFpbCkgeworCQlmb3IgKGkgPSAwOyBpIDwgRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtOyBpKyspIHsKKwkJCWlmIChQZW5kaW5nQ01EW2lkeF0uQmxvY2sgPT0KKwkJCQkocGJ0W2ldICYgKH5CQURfQkxPQ0spKSkKKwkJCQlNQVJLX0JMT0NLX0FTX0JBRChwYnRbaV0pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NtZChpbnQgKmZpcnN0X2ZhaWxlZF9jbWQsIHUxNiBpZHgsIGludCBldmVudCkKK3sKKwl1OCBmdGxfY21kOworCWludCBjbWRfbWF0Y2ggPSAwOworCisJaWYgKHBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudCA9PSBQZW5kaW5nQ01EW2lkeF0uVGFnKQorCQljbWRfbWF0Y2ggPSAxOworCisJaWYgKFBlbmRpbmdDTURbaWR4XS5TdGF0dXMgPT0gQ01EX1BBU1MpIHsKKwkJcHJvY2Vzc19jbWRfcGFzcyhmaXJzdF9mYWlsZWRfY21kLCBpZHgpOworCX0gZWxzZSBpZiAoKFBlbmRpbmdDTURbaWR4XS5TdGF0dXMgPT0gQ01EX0ZBSUwpIHx8CisJCQkoUGVuZGluZ0NNRFtpZHhdLlN0YXR1cyA9PSBDTURfQUJPUlQpKSB7CisJCXByb2Nlc3NfY21kX2ZhaWxfYWJvcnQoZmlyc3RfZmFpbGVkX2NtZCwgaWR4LCBldmVudCk7CisJfSBlbHNlIGlmICgoUGVuZGluZ0NNRFtpZHhdLlN0YXR1cyA9PSBDTURfTk9UX0RPTkUpICYmCisJCQkJCVBlbmRpbmdDTURbaWR4XS5UYWcpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiIENvbW1hbmQgbm8uICVodSBpcyBub3QgZXhlY3V0ZWRcbiIsCisJCQkodW5zaWduZWQgaW50KVBlbmRpbmdDTURbaWR4XS5UYWcpOworCQlmdGxfY21kID0gcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250OworCQl3aGlsZSAoZnRsX2NtZCA8PSBQZW5kaW5nQ01EW2lkeF0uVGFnKSB7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSArPSAxOworCQkJZnRsX2NtZCA9IHBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudDsKKwkJfQorCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NtZChpbnQgKmZpcnN0X2ZhaWxlZF9jbWQsIHUxNiBpZHgsIGludCBldmVudCkKK3sKKwlwcmludGsoS0VSTl9FUlIgInRlbXBvcmFyeSB3b3JrYXJvdW5kIGZ1bmN0aW9uLiAiCisJCSJTaG91bGQgbm90IGJlIGNhbGxlZCEgXG4iKTsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgIAlHTE9CX0ZUTF9FdmVudF9TdGF0dXMKKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgRXZlbnQgQ29kZQorKiBEZXNjcmlwdGlvbjoJSXQgaXMgY2FsbGVkIGJ5IFNCRCBhZnRlciBoYXJkd2FyZSBpbnRlcnJ1cHQgc2lnbmFsbGluZworKiAgICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgY29tbWFuZHMgY2hhaW4KKyogICAgICAgICAgICAgICBJdCBkb2VzIGZvbGxvd2luZyB0aGluZ3MKKyogICAgICAgICAgICAgICBnZXQgZXZlbnQgc3RhdHVzIGZyb20gTExECisqICAgICAgICAgICAgICAgYW5hbHl6ZSBjb21tYW5kIGNoYWluIHN0YXR1cworKiAgICAgICAgICAgICAgIGRldGVybWluZSBsYXN0IGNvbW1hbmQgZXhlY3V0ZWQKKyogICAgICAgICAgICAgICBhbmFseXplIHJlc3VsdHMKKyogICAgICAgICAgICAgICByZWJ1aWxkIHRoZSBibG9jayB0YWJsZSBpbiBjYXNlIG9mIHVuY29ycmVjdGFibGUgZXJyb3IKKyogICAgICAgICAgICAgICByZXR1cm4gZXZlbnQgY29kZQorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK2ludCBHTE9CX0ZUTF9FdmVudF9TdGF0dXMoaW50ICpmaXJzdF9mYWlsZWRfY21kKQoreworCWludCBldmVudF9jb2RlID0gUEFTUzsKKwl1MTYgaV9QOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCSpmaXJzdF9mYWlsZWRfY21kID0gMDsKKworCWV2ZW50X2NvZGUgPSBHTE9CX0xMRF9FdmVudF9TdGF0dXMoKTsKKworCXN3aXRjaCAoZXZlbnRfY29kZSkgeworCWNhc2UgRVZFTlRfUEFTUzoKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJIYW5kbGluZyBFVkVOVF9QQVNTXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9VTkNPUlJFQ1RBQkxFX0RBVEFfRVJST1I6CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiSGFuZGxpbmcgVW5jb3JyZWN0YWJsZSBFQ0MhXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9QUk9HUkFNX0ZBSUxVUkU6CisJY2FzZSBFVkVOVF9FUkFTRV9GQUlMVVJFOgorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiSGFuZGxpbmcgVWdseSBjYXNlLiAiCisJCQkiRXZlbnQgY29kZTogMHgleFxuIiwgZXZlbnRfY29kZSk7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YTsKKwkJZm9yIChpX1AgPSBNQVhfQ0hBTlM7IGlfUCA8IChmdGxfY21kX2NudCArIE1BWF9DSEFOUyk7CisJCQkJaV9QKyspCisJCQlwcm9jZXNzX2NtZChmaXJzdF9mYWlsZWRfY21kLCBpX1AsIGV2ZW50X2NvZGUpOworCQltZW1jcHkoZ19wQmxvY2tUYWJsZSwgZ19wQlRTdGFydGluZ0NvcHksCisJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTMyKSk7CisJCW1lbWNweShnX3BXZWFyQ291bnRlciwgZ19wV2VhckNvdW50ZXJDb3B5LAorCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KSk7CisJCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkKKwkJCW1lbWNweShnX3BSZWFkQ291bnRlciwgZ19wUmVhZENvdW50ZXJDb3B5LAorCQkJCURldmljZUluZm8ud0RhdGFCbG9ja051bSAqIHNpemVvZih1MTYpKTsKKworI2lmIFJFU1RPUkVfQ0FDSEVfT05fQ0RNQV9DSEFJTl9GQUlMVVJFCisJCW1lbWNweSgodm9pZCAqKSZDYWNoZSwgKHZvaWQgKikmY2FjaGVfc3RhcnRfY29weSwKKwkJCXNpemVvZihzdHJ1Y3QgZmxhc2hfY2FjaGVfdGFnKSk7CisJCW1lbXNldCgodm9pZCAqKSZpbnRfY2FjaGUsIC0xLAorCQkJc2l6ZW9mKHN0cnVjdCBmbGFzaF9jYWNoZV9kZWx0YV9saXN0X3RhZykgKgorCQkJKE1BWF9ERVNDUyArIE1BWF9DSEFOUykpOworI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkiSGFuZGxpbmcgdW5leHBlY3RlZCBldmVudCBjb2RlIC0gMHgleFxuIiwKKwkJCWV2ZW50X2NvZGUpOworCQlldmVudF9jb2RlID0gRVJSOworCQlicmVhazsKKwl9CisKKwltZW1jcHkoZ19wQlRTdGFydGluZ0NvcHksIGdfcEJsb2NrVGFibGUsCisJCURldmljZUluZm8ud0RhdGFCbG9ja051bSAqIHNpemVvZih1MzIpKTsKKwltZW1jcHkoZ19wV2VhckNvdW50ZXJDb3B5LCBnX3BXZWFyQ291bnRlciwKKwkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KSk7CisJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKQorCQltZW1jcHkoZ19wUmVhZENvdW50ZXJDb3B5LCBnX3BSZWFkQ291bnRlciwKKwkJCURldmljZUluZm8ud0RhdGFCbG9ja051bSAqIHNpemVvZih1MTYpKTsKKworCWdfcEJURGVsdGFfRnJlZSA9IGdfcEJURGVsdGE7CisJZnRsX2NtZF9jbnQgPSAwOworCWdfcE5leHRCbG9ja1RhYmxlID0gZ19wQmxvY2tUYWJsZUNvcGllczsKKwljcF9iYWNrX2J1Zl9pZHggPSAwOworCisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKKwltZW1jcHkoKHZvaWQgKikmY2FjaGVfc3RhcnRfY29weSwgKHZvaWQgKikmQ2FjaGUsCisJCXNpemVvZihzdHJ1Y3QgZmxhc2hfY2FjaGVfdGFnKSk7CisJbWVtc2V0KCh2b2lkICopJmludF9jYWNoZSwgLTEsCisJCXNpemVvZihzdHJ1Y3QgZmxhc2hfY2FjaGVfZGVsdGFfbGlzdF90YWcpICoKKwkJKE1BWF9ERVNDUyArIE1BWF9DSEFOUykpOworI2VuZGlmCisKKwlyZXR1cm4gZXZlbnRfY29kZTsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGdsb2JfZnRsX2V4ZWN1dGVfY21kcworKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBub25lCisqIERlc2NyaXB0aW9uOiAgcGFzcyB0aHJ1IHRvIExMRAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGdsb2JfZnRsX2V4ZWN1dGVfY21kcyh2b2lkKQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLAorCQkiZ2xvYl9mdGxfZXhlY3V0ZV9jbWRzOiBmdGxfY21kX2NudCAldVxuIiwKKwkJKHVuc2lnbmVkIGludClmdGxfY21kX2NudCk7CisJZ19TQkRDbWRJbmRleCA9IDA7CisJcmV0dXJuIGdsb2JfbGxkX2V4ZWN1dGVfY21kcygpOworfQorCisjZW5kaWYKKworI2lmICFDTURfRE1BCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX1JlYWQgSW1tZWRpYXRlCisqIElucHV0czogICAgICAgICBwb2ludGVyIHRvIGRhdGEKKyogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9mIGRhdGEKKyogT3V0cHV0czogICAgICBQQVNTIC8gRkFJTAorKiBEZXNjcmlwdGlvbjogIFJlYWRzIG9uZSBwYWdlIG9mIGRhdGEgaW50byBSQU0gZGlyZWN0bHkgZnJvbSBmbGFzaCB3aXRob3V0CisqICAgICAgIHVzaW5nIG9yIGRpc3R1cmJpbmcgY2FjaGUuSXQgaXMgYXNzdW1lZCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorKiAgICAgICB3aXRoIENNRC1ETUEgZGlzYWJsZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBHTE9CX0ZUTF9SZWFkX0ltbWVkaWF0ZSh1OCAqcmVhZF9kYXRhLCB1NjQgYWRkcikKK3sKKwlpbnQgd1Jlc3VsdCA9IEZBSUw7CisJdTMyIEJsb2NrOworCXUxNiBQYWdlOworCXUzMiBwaHlfYmxrOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJQmxvY2sgPSBCTEtfRlJPTV9BRERSKGFkZHIpOworCVBhZ2UgPSBQQUdFX0ZST01fQUREUihhZGRyLCBCbG9jayk7CisKKwlpZiAoIUlTX1NQQVJFX0JMT0NLKEJsb2NrKSkKKwkJcmV0dXJuIEZBSUw7CisKKwlwaHlfYmxrID0gcGJ0W0Jsb2NrXTsKKwl3UmVzdWx0ID0gR0xPQl9MTERfUmVhZF9QYWdlX01haW4ocmVhZF9kYXRhLCBwaHlfYmxrLCBQYWdlLCAxKTsKKworCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkgeworCQlnX3BSZWFkQ291bnRlcltwaHlfYmxrIC0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdKys7CisJCWlmIChnX3BSZWFkQ291bnRlcltwaHlfYmxrIC0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdCisJCQk+PSBNQVhfUkVBRF9DT1VOVEVSKQorCQkJRlRMX1JlYWRfRGlzdHVyYmFuY2UocGh5X2Jsayk7CisJCWlmIChnX2NCbG9ja1RhYmxlU3RhdHVzICE9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFKSB7CisJCQlnX2NCbG9ja1RhYmxlU3RhdHVzID0gSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEU7CisJCQlGVExfV3JpdGVfSU5fUHJvZ3Jlc3NfQmxvY2tfVGFibGVfUGFnZSgpOworCQl9CisJfQorCisJcmV0dXJuIHdSZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfQklHX0VORElBTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogICAgIEZUTF9JbnZlcnRfQmxvY2tfVGFibGUKKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgbm9uZQorKiBEZXNjcmlwdGlvbjogIFJlLWZvcm1hdCB0aGUgYmxvY2sgdGFibGUgaW4gcmFtIGJhc2VkIG9uIEJJR19FTkRJQU4gYW5kCisqICAgICAgICAgICAgICAgICAgICAgTEFSR0VfQkxPQ0tOVU0gaWYgbmVjZXNzYXJ5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgRlRMX0ludmVydF9CbG9ja19UYWJsZSh2b2lkKQoreworCXUzMiBpOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisjaWZkZWYgU1VQUE9SVF9MQVJHRV9CTE9DS05VTQorCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07IGkrKykgeworCQlwYnRbaV0gPSBJTlZFUlRVSU5UMzIocGJ0W2ldKTsKKwkJZ19wV2VhckNvdW50ZXJbaV0gPSBJTlZFUlRVSU5UMzIoZ19wV2VhckNvdW50ZXJbaV0pOworCX0KKyNlbHNlCisJZm9yIChpID0gMDsgaSA8IERldmljZUluZm8ud0RhdGFCbG9ja051bTsgaSsrKSB7CisJCXBidFtpXSA9IElOVkVSVFVJTlQxNihwYnRbaV0pOworCQlnX3BXZWFyQ291bnRlcltpXSA9IElOVkVSVFVJTlQxNihnX3BXZWFyQ291bnRlcltpXSk7CisJfQorI2VuZGlmCit9CisjZW5kaWYKKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBHTE9CX0ZUTF9GbGFzaF9Jbml0CisqIElucHV0czogICAgICAgbm9uZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAvIEZBSUw9MHgwMSAoYmFzZWQgb24gcmVhZCBJRCkKKyogRGVzY3JpcHRpb246ICBUaGUgZmxhc2ggY29udHJvbGxlciBpcyBpbml0aWFsaXplZAorKiAgICAgICAgICAgICAgIFRoZSBmbGFzaCBkZXZpY2UgaXMgcmVzZXQKKyogICAgICAgICAgICAgICBQZXJmb3JtIGEgZmxhc2ggUkVBRCBJRCBjb21tYW5kIHRvIGNvbmZpcm0gdGhhdCBhCisqICAgICAgICAgICAgICAgICAgIHZhbGlkIGRldmljZSBpcyBhdHRhY2hlZCBhbmQgYWN0aXZlLgorKiAgICAgICAgICAgICAgICAgICBUaGUgRGV2aWNlSW5mbyBzdHJ1Y3R1cmUgZ2V0cyBmaWxsZWQgaW4KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9GVExfRmxhc2hfSW5pdCh2b2lkKQoreworCWludCBzdGF0dXMgPSBGQUlMOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWdfU0JEQ21kSW5kZXggPSAwOworCisJR0xPQl9MTERfRmxhc2hfSW5pdCgpOworCisJc3RhdHVzID0gR0xPQl9MTERfUmVhZF9EZXZpY2VfSUQoKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTB4MDEgKGJhc2VkIG9uIHJlYWQgSUQpCisqIERlc2NyaXB0aW9uOiAgVGhlIGZsYXNoIGNvbnRyb2xsZXIgaXMgcmVsZWFzZWQKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9GVExfRmxhc2hfUmVsZWFzZSh2b2lkKQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gR0xPQl9MTERfRmxhc2hfUmVsZWFzZSgpOworfQorCisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgR0xPQl9GVExfQ2FjaGVfUmVsZWFzZQorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBub25lCisqIERlc2NyaXB0aW9uOiAgcmVsZWFzZSBhbGwgYWxsb2NhdGVkIG1lbW9yeSBpbiBHTE9CX0ZUTF9Jbml0CisqICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBpbiBHTE9CX0ZUTF9Jbml0KQorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3ZvaWQgR0xPQl9GVExfQ2FjaGVfUmVsZWFzZSh2b2lkKQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZyZWVfbWVtb3J5KCk7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX0NhY2hlX0lmX0hpdAorKiBJbnB1dHM6ICAgICAgIFBhZ2UgQWRkcmVzcworKiBPdXRwdXRzOiAgICAgIEJsb2NrIG51bWJlci9VTkhJVCBCTE9DSworKiBEZXNjcmlwdGlvbjogIERldGVybWluZXMgaWYgdGhlIGFkZHJlc3NlZCBwYWdlIGlzIGluIGNhY2hlCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHUxNiBGVExfQ2FjaGVfSWZfSGl0KHU2NCBwYWdlX2FkZHIpCit7CisJdTE2IGl0ZW07CisJdTY0IGFkZHI7CisJaW50IGk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaXRlbSA9IFVOSElUX0NBQ0hFX0lURU07CisJZm9yIChpID0gMDsgaSA8IENBQ0hFX0lURU1fTlVNOyBpKyspIHsKKwkJYWRkciA9IENhY2hlLmFycmF5W2ldLmFkZHJlc3M7CisJCWlmICgocGFnZV9hZGRyID49IGFkZHIpICYmCisJCQkocGFnZV9hZGRyIDwgKGFkZHIgKyBDYWNoZS5jYWNoZV9pdGVtX3NpemUpKSkgeworCQkJaXRlbSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBpdGVtOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9DYWxjdWxhdGVfTFJVCisqIElucHV0czogICAgICAgTm9uZQorKiBPdXRwdXRzOiAgICAgIE5vbmUKKyogRGVzY3JpcHRpb246ICBDYWxjdWxhdGUgdGhlIGxlYXN0IHJlY2VudGx5IGJsb2NrIGluIGEgY2FjaGUgYW5kIHJlY29yZCBpdHMKKyogICAgICAgICAgICAgICBpbmRleCBpbiBMUlUgZmllbGQuCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHZvaWQgRlRMX0NhbGN1bGF0ZV9MUlUodm9pZCkKK3sKKwl1MTYgaSwgYkN1cnJlbnRMUlUsIGJUZW1wQ291bnQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJYkN1cnJlbnRMUlUgPSAwOworCWJUZW1wQ291bnQgPSBNQVhfV09SRF9WQUxVRTsKKworCWZvciAoaSA9IDA7IGkgPCBDQUNIRV9JVEVNX05VTTsgaSsrKSB7CisJCWlmIChDYWNoZS5hcnJheVtpXS51c2VfY250IDwgYlRlbXBDb3VudCkgeworCQkJYkN1cnJlbnRMUlUgPSBpOworCQkJYlRlbXBDb3VudCA9IENhY2hlLmFycmF5W2ldLnVzZV9jbnQ7CisJCX0KKwl9CisKKwlDYWNoZS5MUlUgPSBiQ3VycmVudExSVTsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfQ2FjaGVfUmVhZF9QYWdlCisqIElucHV0czogICAgICAgcG9pbnRlciB0byByZWFkIGJ1ZmZlciwgbG9naWNhbCBhZGRyZXNzIGFuZCBjYWNoZSBpdGVtIG51bWJlcgorKiBPdXRwdXRzOiAgICAgIE5vbmUKKyogRGVzY3JpcHRpb246ICBSZWFkIHRoZSBwYWdlIGZyb20gdGhlIGNhY2hlZCBibG9jayBhZGRyZXNzZWQgYnkgYmxvY2tudW1iZXIKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgdm9pZCBGVExfQ2FjaGVfUmVhZF9QYWdlKHU4ICpkYXRhX2J1ZiwgdTY0IGxvZ2ljX2FkZHIsIHUxNiBjYWNoZV9pdGVtKQoreworCXU4ICpzdGFydF9hZGRyOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXN0YXJ0X2FkZHIgPSBDYWNoZS5hcnJheVtjYWNoZV9pdGVtXS5idWY7CisJc3RhcnRfYWRkciArPSAodTMyKSgoKGxvZ2ljX2FkZHIgLSBDYWNoZS5hcnJheVtjYWNoZV9pdGVtXS5hZGRyZXNzKSA+PgorCQlEZXZpY2VJbmZvLm5CaXRzSW5QYWdlRGF0YVNpemUpICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplKTsKKworI2lmIENNRF9ETUEKKwlHTE9CX0xMRF9NZW1Db3B5X0NNRChkYXRhX2J1Ziwgc3RhcnRfYWRkciwKKwkJCURldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSwgMCk7CisJZnRsX2NtZF9jbnQrKzsKKyNlbHNlCisJbWVtY3B5KGRhdGFfYnVmLCBzdGFydF9hZGRyLCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworI2VuZGlmCisKKwlpZiAoQ2FjaGUuYXJyYXlbY2FjaGVfaXRlbV0udXNlX2NudCA8IE1BWF9XT1JEX1ZBTFVFKQorCQlDYWNoZS5hcnJheVtjYWNoZV9pdGVtXS51c2VfY250Kys7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX0NhY2hlX1JlYWRfQWxsCisqIElucHV0czogICAgICAgcG9pbnRlciB0byByZWFkIGJ1ZmZlcixibG9jayBhZGRyZXNzCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTCA9MQorKiBEZXNjcmlwdGlvbjogIEl0IHJlYWRzIHBhZ2VzIGluIGNhY2hlCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIGludCBGVExfQ2FjaGVfUmVhZF9BbGwodTggKnBEYXRhLCB1NjQgcGh5X2FkZHIpCit7CisJaW50IHdSZXN1bHQgPSBQQVNTOworCXUzMiBCbG9jazsKKwl1MzIgbGJhOworCXUxNiBQYWdlOworCXUxNiBQYWdlQ291bnQ7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKwl1MzIgaTsKKworCUJsb2NrID0gQkxLX0ZST01fQUREUihwaHlfYWRkcik7CisJUGFnZSA9IFBBR0VfRlJPTV9BRERSKHBoeV9hZGRyLCBCbG9jayk7CisJUGFnZUNvdW50ID0gQ2FjaGUucGFnZXNfcGVyX2l0ZW07CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzLCBCbG9jazogMHgleFxuIiwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sIEJsb2NrKTsKKworCWxiYSA9IDB4ZmZmZmZmZmY7CisJZm9yIChpID0gMDsgaSA8IERldmljZUluZm8ud0RhdGFCbG9ja051bTsgaSsrKSB7CisJCWlmICgocGJ0W2ldICYgKH5CQURfQkxPQ0spKSA9PSBCbG9jaykgeworCQkJbGJhID0gaTsKKwkJCWlmIChJU19TUEFSRV9CTE9DSyhpKSB8fCBJU19CQURfQkxPQ0soaSkgfHwKKwkJCQlJU19ESVNDQVJERURfQkxPQ0soaSkpIHsKKwkJCQkvKiBBZGQgYnkgeXVucGVuZyAtMjAwOC4xMi4zICovCisjaWYgQ01EX0RNQQorCQkJCUdMT0JfTExEX01lbUNvcHlfQ01EKHBEYXRhLCBnX3RlbXBfYnVmLAorCQkJCVBhZ2VDb3VudCAqIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSwgMCk7CisJCQkJZnRsX2NtZF9jbnQrKzsKKyNlbHNlCisJCQkJbWVtc2V0KHBEYXRhLCAweEZGLAorCQkJCQlQYWdlQ291bnQgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworI2VuZGlmCisJCQkJcmV0dXJuIHdSZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlOyAvKiBicmVhayA/PyAqLworCQkJfQorCQl9CisJfQorCisJaWYgKDB4ZmZmZmZmZmYgPT0gbGJhKQorCQlwcmludGsoS0VSTl9FUlIgIkZUTF9DYWNoZV9SZWFkX0FsbDogQmxvY2sgaXMgbm90IGZvdW5kIGluIEJUXG4iKTsKKworI2lmIENNRF9ETUEKKwl3UmVzdWx0ID0gR0xPQl9MTERfUmVhZF9QYWdlX01haW5fY2RtYShwRGF0YSwgQmxvY2ssIFBhZ2UsCisJCQlQYWdlQ291bnQsIExMRF9DTURfRkxBR19NT0RFX0NETUEpOworCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkgeworCQlnX3BSZWFkQ291bnRlcltCbG9jayAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSsrOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSAgICAgICAiUmVhZCBDb3VudGVyIG1vZGlmaWVkIGluIGZ0bF9jbWRfY250ICV1IgorCQkJCSIgQmxvY2sgJXUgQ291bnRlciV1XG4iLAorCQkJICAgICAgIGZ0bF9jbWRfY250LCAodW5zaWduZWQgaW50KUJsb2NrLAorCQkJICAgICAgIGdfcFJlYWRDb3VudGVyW0Jsb2NrIC0KKwkJCSAgICAgICBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja10pOworCisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YV9GcmVlOworCQlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPSBmdGxfY21kX2NudDsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlJDX0luZGV4ID0KKwkJCUJsb2NrIC0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2s7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5SQ19FbnRyeV9WYWx1ZSA9CisJCQlnX3BSZWFkQ291bnRlcltCbG9jayAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXTsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHhDMDsKKworCQlmdGxfY21kX2NudCsrOworCisJCWlmIChnX3BSZWFkQ291bnRlcltCbG9jayAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSA+PQorCQkgICAgTUFYX1JFQURfQ09VTlRFUikKKwkJCUZUTF9SZWFkX0Rpc3R1cmJhbmNlKEJsb2NrKTsKKwkJaWYgKGdfY0Jsb2NrVGFibGVTdGF0dXMgIT0gSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEUpIHsKKwkJCWdfY0Jsb2NrVGFibGVTdGF0dXMgPSBJTl9QUk9HUkVTU19CTE9DS19UQUJMRTsKKwkJCUZUTF9Xcml0ZV9JTl9Qcm9ncmVzc19CbG9ja19UYWJsZV9QYWdlKCk7CisJCX0KKwl9IGVsc2UgeworCQlmdGxfY21kX2NudCsrOworCX0KKyNlbHNlCisJd1Jlc3VsdCA9IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluKHBEYXRhLCBCbG9jaywgUGFnZSwgUGFnZUNvdW50KTsKKwlpZiAod1Jlc3VsdCA9PSBGQUlMKQorCQlyZXR1cm4gd1Jlc3VsdDsKKworCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkgeworCQlnX3BSZWFkQ291bnRlcltCbG9jayAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSsrOworCQlpZiAoZ19wUmVhZENvdW50ZXJbQmxvY2sgLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja10gPj0KKwkJCQkJCU1BWF9SRUFEX0NPVU5URVIpCisJCQlGVExfUmVhZF9EaXN0dXJiYW5jZShCbG9jayk7CisJCWlmIChnX2NCbG9ja1RhYmxlU3RhdHVzICE9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFKSB7CisJCQlnX2NCbG9ja1RhYmxlU3RhdHVzID0gSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEU7CisJCQlGVExfV3JpdGVfSU5fUHJvZ3Jlc3NfQmxvY2tfVGFibGVfUGFnZSgpOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIHdSZXN1bHQ7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfQ2FjaGVfV3JpdGVfQWxsCisqIElucHV0czogICAgICAgcG9pbnRlciB0byBjYWNoZSBpbiBzeXMgbWVtb3J5CisqICAgICAgICAgICAgICAgYWRkcmVzcyBvZiBmcmVlIGJsb2NrIGluIGZsYXNoCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTD0xCisqIERlc2NyaXB0aW9uOiAgd3JpdGVzIGFsbCB0aGUgcGFnZXMgb2YgdGhlIGJsb2NrIGluIGNhY2hlIHRvIGZsYXNoCisqCisqICAgICAgICAgICAgICAgTk9URTpuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHdvcmtzIG9rIHdoZW4gY2FjaGUgaXMgbGltaXRlZAorKiAgICAgICAgICAgICAgIHRvIGEgcGFydGlhbCBibG9jay4gVGhpcyBpcyB3aGVyZSBjb3B5LWJhY2sgd291bGQgYmUKKyogICAgICAgICAgICAgICBhY3RpdmF0ZWQuICBUaGlzIHdvdWxkIHJlcXVpcmUga25vd2luZyB3aGljaCBwYWdlcyBpbiB0aGUKKyogICAgICAgICAgICAgICBjYWNoZWQgYmxvY2sgYXJlIGNsZWFuL2RpcnR5LlJpZ2h0IG5vdyB3ZSBvbmx5IGtub3cgaWYKKyogICAgICAgICAgICAgICB0aGUgd2hvbGUgYmxvY2sgaXMgY2xlYW4vZGlydHkuCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3N0YXRpYyBpbnQgRlRMX0NhY2hlX1dyaXRlX0FsbCh1OCAqcERhdGEsIHU2NCBibGtfYWRkcikKK3sKKwl1MTYgd1Jlc3VsdCA9IFBBU1M7CisJdTMyIEJsb2NrOworCXUxNiBQYWdlOworCXUxNiBQYWdlQ291bnQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlRoaXMgYmxvY2sgJWQgZ29pbmcgdG8gYmUgd3JpdHRlbiAiCisJCSJvbiAlZFxuIiwgY2FjaGVfYmxvY2tfdG9fd3JpdGUsCisJCSh1MzIpKGJsa19hZGRyID4+IERldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemUpKTsKKworCUJsb2NrID0gQkxLX0ZST01fQUREUihibGtfYWRkcik7CisJUGFnZSA9IFBBR0VfRlJPTV9BRERSKGJsa19hZGRyLCBCbG9jayk7CisJUGFnZUNvdW50ID0gQ2FjaGUucGFnZXNfcGVyX2l0ZW07CisKKyNpZiBDTURfRE1BCisJaWYgKEZBSUwgPT0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX2NkbWEocERhdGEsCisJCQkJCUJsb2NrLCBQYWdlLCBQYWdlQ291bnQpKSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkiTkFORCBQcm9ncmFtIGZhaWwgaW4gJXMsIExpbmUgJWQsICIKKwkJCSJGdW5jdGlvbjogJXMsIG5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkISAiCisJCQkiTmVlZCBCYWQgQmxvY2sgcmVwbGFjaW5nLlxuIiwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sIEJsb2NrKTsKKwkJd1Jlc3VsdCA9IEZBSUw7CisJfQorCWZ0bF9jbWRfY250Kys7CisjZWxzZQorCWlmIChGQUlMID09IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbihwRGF0YSwgQmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCkpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIk5BTkQgUHJvZ3JhbSBmYWlsIGluICVzLCIKKwkJCSIgTGluZSAlZCwgRnVuY3Rpb24gJXMsIG5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkISIKKwkJCSJOZWVkIEJhZCBCbG9jayByZXBsYWNpbmcuXG4iLAorCQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgQmxvY2spOworCQl3UmVzdWx0ID0gRkFJTDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gd1Jlc3VsdDsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfQ2FjaGVfVXBkYXRlX0Jsb2NrCisqIElucHV0czogICAgICAgcG9pbnRlciB0byBidWZmZXIscGFnZSBhZGRyZXNzLGJsb2NrIGFkZHJlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBJdCB1cGRhdGVzIHRoZSBjYWNoZQorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIGludCBGVExfQ2FjaGVfVXBkYXRlX0Jsb2NrKHU4ICpwRGF0YSwKKwkJCXU2NCBvbGRfcGFnZV9hZGRyLCB1NjQgYmxrX2FkZHIpCit7CisJaW50IGksIGo7CisJdTggKmJ1ZiA9IHBEYXRhOworCWludCB3UmVzdWx0ID0gUEFTUzsKKwlpbnQgd0ZvdW5kSW5DYWNoZTsKKwl1NjQgcGFnZV9hZGRyOworCXU2NCBhZGRyOworCXU2NCBvbGRfYmxrX2FkZHI7CisJdTE2IHBhZ2Vfb2Zmc2V0OworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJb2xkX2Jsa19hZGRyID0gKHU2NCkob2xkX3BhZ2VfYWRkciA+PgorCQlEZXZpY2VJbmZvLm5CaXRzSW5CbG9ja0RhdGFTaXplKSAqIERldmljZUluZm8ud0Jsb2NrRGF0YVNpemU7CisJcGFnZV9vZmZzZXQgPSAodTE2KShHTE9CX3U2NF9SZW1haW5kZXIob2xkX3BhZ2VfYWRkciwgMikgPj4KKwkJRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOyBpICs9IENhY2hlLnBhZ2VzX3Blcl9pdGVtKSB7CisJCXBhZ2VfYWRkciA9IG9sZF9ibGtfYWRkciArIGkgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJCWlmIChpICE9IHBhZ2Vfb2Zmc2V0KSB7CisJCQl3Rm91bmRJbkNhY2hlID0gRkFJTDsKKwkJCWZvciAoaiA9IDA7IGogPCBDQUNIRV9JVEVNX05VTTsgaisrKSB7CisJCQkJYWRkciA9IENhY2hlLmFycmF5W2pdLmFkZHJlc3M7CisJCQkJYWRkciA9IEZUTF9HZXRfUGh5c2ljYWxfQmxvY2tfQWRkcihhZGRyKSArCisJCQkJCUdMT0JfdTY0X1JlbWFpbmRlcihhZGRyLCAyKTsKKwkJCQlpZiAoKGFkZHIgPj0gcGFnZV9hZGRyKSAmJiBhZGRyIDwKKwkJCQkJKHBhZ2VfYWRkciArIENhY2hlLmNhY2hlX2l0ZW1fc2l6ZSkpIHsKKwkJCQkJd0ZvdW5kSW5DYWNoZSA9IFBBU1M7CisJCQkJCWJ1ZiA9IENhY2hlLmFycmF5W2pdLmJ1ZjsKKwkJCQkJQ2FjaGUuYXJyYXlbal0uY2hhbmdlZCA9IFNFVDsKKyNpZiBDTURfRE1BCisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKKwkJCQkJaW50X2NhY2hlW2Z0bF9jbWRfY250XS5pdGVtID0gajsKKwkJCQkJaW50X2NhY2hlW2Z0bF9jbWRfY250XS5jYWNoZS5hZGRyZXNzID0KKwkJCQkJCUNhY2hlLmFycmF5W2pdLmFkZHJlc3M7CisJCQkJCWludF9jYWNoZVtmdGxfY21kX2NudF0uY2FjaGUuY2hhbmdlZCA9CisJCQkJCQlDYWNoZS5hcnJheVtqXS5jaGFuZ2VkOworI2VuZGlmCisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKEZBSUwgPT0gd0ZvdW5kSW5DYWNoZSkgeworCQkJCWlmIChFUlIgPT0gRlRMX0NhY2hlX1JlYWRfQWxsKGdfcFRlbXBCdWYsCisJCQkJCXBhZ2VfYWRkcikpIHsKKwkJCQkJd1Jlc3VsdCA9IEZBSUw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlidWYgPSBnX3BUZW1wQnVmOworCQkJfQorCQl9IGVsc2UgeworCQkJYnVmID0gcERhdGE7CisJCX0KKworCQlpZiAoRkFJTCA9PSBGVExfQ2FjaGVfV3JpdGVfQWxsKGJ1ZiwKKwkJCWJsa19hZGRyICsgKHBhZ2VfYWRkciAtIG9sZF9ibGtfYWRkcikpKSB7CisJCQl3UmVzdWx0ID0gRkFJTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHdSZXN1bHQ7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX0NvcHlfQmxvY2sKKyogSW5wdXRzOiAgICAgICBzb3VyY2UgYmxvY2sgYWRkcmVzcworKiAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGJsb2NrIGFkZHJlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICB1c2VkIG9ubHkgZm9yIHN0YXRpYyB3ZWFyIGxldmVsaW5nIHRvIG1vdmUgdGhlIGJsb2NrCisqICAgICAgICAgICAgICAgY29udGFpbmluZyBzdGF0aWMgZGF0YSB0byBuZXcgYmxvY2tzKG1vcmUgd29ybikKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgRlRMX0NvcHlfQmxvY2sodTY0IG9sZF9ibGtfYWRkciwgdTY0IGJsa19hZGRyKQoreworCWludCBpLCByMSwgcjIsIHdSZXN1bHQgPSBQQVNTOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOyBpICs9IENhY2hlLnBhZ2VzX3Blcl9pdGVtKSB7CisJCXIxID0gRlRMX0NhY2hlX1JlYWRfQWxsKGdfcFRlbXBCdWYsIG9sZF9ibGtfYWRkciArCisJCQkJCWkgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCQlyMiA9IEZUTF9DYWNoZV9Xcml0ZV9BbGwoZ19wVGVtcEJ1ZiwgYmxrX2FkZHIgKworCQkJCQlpICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplKTsKKwkJaWYgKChFUlIgPT0gcjEpIHx8IChGQUlMID09IHIyKSkgeworCQkJd1Jlc3VsdCA9IEZBSUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiB3UmVzdWx0OworfQorCisvKiBTZWFyY2ggdGhlIGJsb2NrIHRhYmxlIHRvIGZpbmQgb3V0IHRoZSBsZWFzdCB3ZWFyIGJsb2NrIGFuZCB0aGVuIHJldHVybiBpdCAqLworc3RhdGljIHUzMiBmaW5kX2xlYXN0X3dvcm5fYmxrX2Zvcl9sMl9jYWNoZSh2b2lkKQoreworCWludCBpOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJdTggbGVhc3Rfd2Vhcl9jbnQgPSBNQVhfQllURV9WQUxVRTsKKwl1MzIgbGVhc3Rfd2Vhcl9ibGtfaWR4ID0gTUFYX1UzMl9WQUxVRTsKKwl1MzIgcGh5X2lkeDsKKworCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07IGkrKykgeworCQlpZiAoSVNfU1BBUkVfQkxPQ0soaSkpIHsKKwkJCXBoeV9pZHggPSAodTMyKSgofkJBRF9CTE9DSykgJiBwYnRbaV0pOworCQkJaWYgKHBoeV9pZHggPiBEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2spCisJCQkJcHJpbnRrKEtFUk5fRVJSICJmaW5kX2xlYXN0X3dvcm5fYmxrX2Zvcl9sMl9jYWNoZTogIgorCQkJCQkiVG9vIGJpZyBwaHkgYmxvY2sgbnVtICglZClcbiIsIHBoeV9pZHgpOworCQkJaWYgKGdfcFdlYXJDb3VudGVyW3BoeV9pZHggLURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSA8IGxlYXN0X3dlYXJfY250KSB7CisJCQkJbGVhc3Rfd2Vhcl9jbnQgPSBnX3BXZWFyQ291bnRlcltwaHlfaWR4IC0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdOworCQkJCWxlYXN0X3dlYXJfYmxrX2lkeCA9IGk7CisJCQl9CisJCX0KKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkiZmluZF9sZWFzdF93b3JuX2Jsa19mb3JfbDJfY2FjaGU6ICIKKwkJImZpbmQgYmxvY2sgJWQgd2l0aCBsZWFzdCB3b3JuIGNvdW50ZXIgKCVkKVxuIiwKKwkJbGVhc3Rfd2Vhcl9ibGtfaWR4LCBsZWFzdF93ZWFyX2NudCk7CisKKwlyZXR1cm4gbGVhc3Rfd2Vhcl9ibGtfaWR4OworfQorCisKKworLyogR2V0IGJsb2NrcyBmb3IgTGV2ZWwyIENhY2hlICovCitzdGF0aWMgaW50IGdldF9sMl9jYWNoZV9ibGtzKHZvaWQpCit7CisJaW50IG47CisJdTMyIGJsazsKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCisJZm9yIChuID0gMDsgbiA8IEJMS19OVU1fRk9SX0wyX0NBQ0hFOyBuKyspIHsKKwkJYmxrID0gZmluZF9sZWFzdF93b3JuX2Jsa19mb3JfbDJfY2FjaGUoKTsKKwkJaWYgKGJsayA+IERldmljZUluZm8ud0RhdGFCbG9ja051bSkgeworCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkiZmluZF9sZWFzdF93b3JuX2Jsa19mb3JfbDJfY2FjaGU6ICIKKwkJCQkiTm8gZW5vdWdoIGZyZWUgTkFORCBibG9ja3MgKG46ICVkKSBmb3IgTDIgQ2FjaGUhXG4iLCBuKTsKKwkJCXJldHVybiBGQUlMOworCQl9CisJCS8qIFRhZyB0aGUgZnJlZSBibG9jayBhcyBkaXNjYXJkIGluIGJsb2NrIHRhYmxlICovCisJCXBidFtibGtdID0gKHBidFtibGtdICYgKH5CQURfQkxPQ0spKSB8IERJU0NBUkRfQkxPQ0s7CisJCS8qIEFkZCB0aGUgZnJlZSBibG9jayB0byB0aGUgTDIgQ2FjaGUgYmxvY2sgYXJyYXkgKi8KKwkJY2FjaGVfbDIuYmxrX2FycmF5W25dID0gcGJ0W2Jsa10gJiAofkJBRF9CTE9DSyk7CisJfQorCisJcmV0dXJuIFBBU1M7Cit9CisKK3N0YXRpYyBpbnQgZXJhc2VfbDJfY2FjaGVfYmxvY2tzKHZvaWQpCit7CisJaW50IGksIHJldCA9IFBBU1M7CisJdTMyIHBibGssIGxibGs7CisJdTY0IGFkZHI7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IEJMS19OVU1fRk9SX0wyX0NBQ0hFOyBpKyspIHsKKwkJcGJsayA9IGNhY2hlX2wyLmJsa19hcnJheVtpXTsKKworCQkvKiBJZiB0aGUgTDIgY2FjaGUgYmxvY2sgaXMgaW52YWxpZCwgdGhlbiBqdXN0IHNraXAgaXQgKi8KKwkJaWYgKE1BWF9VMzJfVkFMVUUgPT0gcGJsaykKKwkJCWNvbnRpbnVlOworCisJCUJVR19PTihwYmxrID4gRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrKTsKKworCQlhZGRyID0gKHU2NClwYmxrIDw8IERldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemU7CisJCWlmIChQQVNTID09IEdMT0JfRlRMX0Jsb2NrX0VyYXNlKGFkZHIpKSB7CisJCQkvKiBHZXQgbG9naWNhbCBibG9jayBudW1iZXIgb2YgdGhlIGVyYXNlZCBibG9jayAqLworCQkJbGJsayA9IEZUTF9HZXRfQmxvY2tfSW5kZXgocGJsayk7CisJCQlCVUdfT04oQkFEX0JMT0NLID09IGxibGspOworCQkJLyogVGFnIGl0IGFzIGZyZWUgaW4gdGhlIGJsb2NrIHRhYmxlICovCisJCQlwYnRbbGJsa10gJj0gKHUzMikofkRJU0NBUkRfQkxPQ0spOworCQkJcGJ0W2xibGtdIHw9ICh1MzIpKFNQQVJFX0JMT0NLKTsKKwkJfSBlbHNlIHsKKwkJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFtsYmxrXSk7CisJCQlyZXQgPSBFUlI7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWVyZ2UgdGhlIHZhbGlkIGRhdGEgcGFnZSBpbiB0aGUgTDIgY2FjaGUgYmxvY2tzIGludG8gTkFORC4KKyovCitzdGF0aWMgaW50IGZsdXNoX2wyX2NhY2hlKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3Qgc3BlY3RyYV9sMl9jYWNoZV9saXN0ICpwbmQsICp0bXBfcG5kOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJdTMyIHBoeV9ibGssIGwyX2JsazsKKwl1NjQgYWRkcjsKKwl1MTYgbDJfcGFnZTsKKwlpbnQgaSwgcmV0ID0gUEFTUzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKGxpc3RfZW1wdHkoJmNhY2hlX2wyLnRhYmxlLmxpc3QpKSAvKiBObyBkYXRhIHRvIGZsdXNoICovCisJCXJldHVybiByZXQ7CisKKwkvL2R1bXBfY2FjaGVfbDJfdGFibGUoKTsKKworCWlmIChJTl9QUk9HUkVTU19CTE9DS19UQUJMRSAhPSBnX2NCbG9ja1RhYmxlU3RhdHVzKSB7CisJCWdfY0Jsb2NrVGFibGVTdGF0dXMgPSBJTl9QUk9HUkVTU19CTE9DS19UQUJMRTsKKwkJRlRMX1dyaXRlX0lOX1Byb2dyZXNzX0Jsb2NrX1RhYmxlX1BhZ2UoKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZV9sMi50YWJsZS5saXN0KSB7CisJCXBuZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNwZWN0cmFfbDJfY2FjaGVfbGlzdCwgbGlzdCk7CisJCWlmIChJU19TUEFSRV9CTE9DSyhwbmQtPmxvZ2ljYWxfYmxrX251bSkgfHwKKwkJCUlTX0JBRF9CTE9DSyhwbmQtPmxvZ2ljYWxfYmxrX251bSkgfHwKKwkJCUlTX0RJU0NBUkRFRF9CTE9DSyhwbmQtPmxvZ2ljYWxfYmxrX251bSkpIHsKKwkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCW1lbXNldChjYWNoZV9sMl9ibGtfYnVmLCAweGZmLCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplKTsJCQkKKwkJfSBlbHNlIHsKKwkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXBoeV9ibGsgPSBwYnRbcG5kLT5sb2dpY2FsX2Jsa19udW1dICYgKH5CQURfQkxPQ0spOworCQkJcmV0ID0gR0xPQl9MTERfUmVhZF9QYWdlX01haW4oY2FjaGVfbDJfYmxrX2J1ZiwKKwkJCQlwaHlfYmxrLCAwLCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKTsKKwkJCWlmIChyZXQgPT0gRkFJTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiUmVhZCBOQU5EIHBhZ2UgZmFpbCBpbiAlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOyBpKyspIHsKKwkJCWlmIChwbmQtPnBhZ2VzX2FycmF5W2ldICE9IE1BWF9VMzJfVkFMVUUpIHsKKwkJCQlsMl9ibGsgPSBjYWNoZV9sMi5ibGtfYXJyYXlbKHBuZC0+cGFnZXNfYXJyYXlbaV0gPj4gMTYpICYgMHhmZmZmXTsKKwkJCQlsMl9wYWdlID0gcG5kLT5wYWdlc19hcnJheVtpXSAmIDB4ZmZmZjsKKwkJCQlyZXQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbihjYWNoZV9sMl9wYWdlX2J1ZiwgbDJfYmxrLCBsMl9wYWdlLCAxKTsKKwkJCQlpZiAocmV0ID09IEZBSUwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJSZWFkIE5BTkQgcGFnZSBmYWlsIGluICVzLCBMaW5lICVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJCX0KKwkJCQltZW1jcHkoY2FjaGVfbDJfYmxrX2J1ZiArIGkgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUsIGNhY2hlX2wyX3BhZ2VfYnVmLCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCQkJfQorCQl9CisKKwkJLyogRmluZCBhIGZyZWUgYmxvY2sgYW5kIHRhZyB0aGUgb3JpZ2luYWwgYmxvY2sgYXMgZGlzY2FyZGVkICovCisJCWFkZHIgPSAodTY0KXBuZC0+bG9naWNhbF9ibGtfbnVtIDw8IERldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemU7CisJCXJldCA9IEZUTF9SZXBsYWNlX0Jsb2NrKGFkZHIpOworCQlpZiAocmV0ID09IEZBSUwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRlRMX1JlcGxhY2VfQmxvY2sgZmFpbCBpbiAlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJfQorCisJCS8qIFdyaXRlIGJhY2sgdGhlIHVwZGF0ZWQgZGF0YSBpbnRvIE5BTkQgKi8KKwkJcGh5X2JsayA9IHBidFtwbmQtPmxvZ2ljYWxfYmxrX251bV0gJiAofkJBRF9CTE9DSyk7CisJCWlmIChGQUlMID09IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbihjYWNoZV9sMl9ibGtfYnVmLCBwaHlfYmxrLCAwLCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSkgeworCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkiUHJvZ3JhbSBOQU5EIGJsb2NrICVkIGZhaWwgaW4gJXMsIExpbmUgJWRcbiIsCisJCQkJcGh5X2JsaywgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCS8qIFRoaXMgbWF5IG5vdCBiZSByZWFsbHkgYSBiYWQgYmxvY2suIFNvIGp1c3QgdGFnIGl0IGFzIGRpc2NhcmRlZC4gKi8KKwkJCS8qIFRoZW4gaXQgaGFzIGEgY2hhbmNlIHRvIGJlIGVyYXNlZCB3aGVuIGdhcmJhZ2UgY29sbGVjdGlvbi4gKi8KKwkJCS8qIElmIGl0IGlzIHJlYWxseSBiYWQsIHRoZW4gdGhlIGVyYXNlIHdpbGwgZmFpbCBhbmQgaXQgd2lsbCBiZSBtYXJrZWQgKi8KKwkJCS8qIGFzIGJhZCB0aGVuLiBPdGhlcndpc2UgaXQgd2lsbCBiZSBtYXJrZWQgYXMgZnJlZSBhbmQgY2FuIGJlIHVzZWQgYWdhaW4gKi8KKwkJCU1BUktfQkxLX0FTX0RJU0NBUkQocGJ0W3BuZC0+bG9naWNhbF9ibGtfbnVtXSk7CisJCQkvKiBGaW5kIGFub3RoZXIgZnJlZSBibG9jayBhbmQgd3JpdGUgaXQgYWdhaW4gKi8KKwkJCUZUTF9SZXBsYWNlX0Jsb2NrKGFkZHIpOworCQkJcGh5X2JsayA9IHBidFtwbmQtPmxvZ2ljYWxfYmxrX251bV0gJiAofkJBRF9CTE9DSyk7CisJCQlpZiAoRkFJTCA9PSBHTE9CX0xMRF9Xcml0ZV9QYWdlX01haW4oY2FjaGVfbDJfYmxrX2J1ZiwgcGh5X2JsaywgMCwgRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byB3cml0ZSBiYWNrIGJsb2NrICVkIHdoZW4gZmx1c2ggTDIgY2FjaGUuIgorCQkJCQkiU29tZSBkYXRhIHdpbGwgYmUgbG9zdCFcbiIsIHBoeV9ibGspOworCQkJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFtwbmQtPmxvZ2ljYWxfYmxrX251bV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogdGFnIHRoZSBuZXcgZnJlZSBibG9jayBhcyB1c2VkIGJsb2NrICovCisJCQlwYnRbcG5kLT5sb2dpY2FsX2Jsa19udW1dICY9ICh+U1BBUkVfQkxPQ0spOworCQl9CisJfQorCisJLyogRGVzdHJveSB0aGUgTDIgQ2FjaGUgdGFibGUgYW5kIGZyZWUgdGhlIG1lbW9yeSBvZiBhbGwgbm9kZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG5kLCB0bXBfcG5kLCAmY2FjaGVfbDIudGFibGUubGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmcG5kLT5saXN0KTsKKwkJa2ZyZWUocG5kKTsKKwl9CisKKwkvKiBFcmFzZSBkaXNjYXJkIEwyIGNhY2hlIGJsb2NrcyAqLworCWlmIChlcmFzZV9sMl9jYWNoZV9ibG9ja3MoKSAhPSBQQVNTKQorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJIiBFcmFzZSBMMiBjYWNoZSBibG9ja3MgZXJyb3IgaW4gJXMsIExpbmUgJWRcbiIsCisJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCisJLyogSW5pdCB0aGUgTGV2ZWwyIENhY2hlIGRhdGEgc3RydWN0dXJlICovCisJZm9yIChpID0gMDsgaSA8IEJMS19OVU1fRk9SX0wyX0NBQ0hFOyBpKyspCisJCWNhY2hlX2wyLmJsa19hcnJheVtpXSA9IE1BWF9VMzJfVkFMVUU7CisJY2FjaGVfbDIuY3VyX2Jsa19pZHggPSAwOworCWNhY2hlX2wyLmN1cl9wYWdlX251bSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlX2wyLnRhYmxlLmxpc3QpOworCWNhY2hlX2wyLnRhYmxlLmxvZ2ljYWxfYmxrX251bSA9IE1BWF9VMzJfVkFMVUU7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV3JpdGUgYmFjayBhIGNoYW5nZWQgdmljdGltIGNhY2hlIGl0ZW0gdG8gdGhlIExldmVsMiBDYWNoZQorICogYW5kIHVwZGF0ZSB0aGUgTDIgQ2FjaGUgdGFibGUgdG8gbWFwIHRoZSBjaGFuZ2UuCisgKiBJZiB0aGUgTDIgQ2FjaGUgaXMgZnVsbCwgdGhlbiBzdGFydCB0byBkbyB0aGUgTDIgQ2FjaGUgZmx1c2guCisqLworc3RhdGljIGludCB3cml0ZV9iYWNrX3RvX2wyX2NhY2hlKHU4ICpidWYsIHU2NCBsb2dpY2FsX2FkZHIpCit7CisJdTMyIGxvZ2ljYWxfYmxrX251bTsKKwl1MTYgbG9naWNhbF9wYWdlX251bTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBzcGVjdHJhX2wyX2NhY2hlX2xpc3QgKnBuZCwgKnBuZF9uZXc7CisJdTMyIG5vZGVfc2l6ZTsKKwlpbnQgaSwgZm91bmQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIElmIExldmVsMiBDYWNoZSB0YWJsZSBpcyBlbXB0eSwgdGhlbiBpdCBtZWFucyBlaXRoZXI6CisJICogMS4gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHRoZSBmdW5jdGlvbiBjYWxsZWQgYWZ0ZXIgRlRMX2luaXQKKwkgKiBvcgorCSAqIDIuIFRoZSBMZXZlbDIgQ2FjaGUgaGFzIGp1c3QgYmVlbiBmbHVzaGVkCisJICoKKwkgKiBTbywgJ3N0ZWFsJyBzb21lIGZyZWUgYmxvY2tzIGZyb20gTkFORCBmb3IgTDIgQ2FjaGUgdXNpbmcKKwkgKiBieSBqdXN0IG1hc2sgdGhlbSBhcyBkaXNjYXJkIGluIHRoZSBibG9jayB0YWJsZQorCSovCisJaWYgKGxpc3RfZW1wdHkoJmNhY2hlX2wyLnRhYmxlLmxpc3QpKSB7CisJCUJVR19PTihjYWNoZV9sMi5jdXJfYmxrX2lkeCAhPSAwKTsKKwkJQlVHX09OKGNhY2hlX2wyLmN1cl9wYWdlX251bSE9IDApOworCQlCVUdfT04oY2FjaGVfbDIudGFibGUubG9naWNhbF9ibGtfbnVtICE9IE1BWF9VMzJfVkFMVUUpOworCQlpZiAoRkFJTCA9PSBnZXRfbDJfY2FjaGVfYmxrcygpKSB7CisJCQlHTE9CX0ZUTF9HYXJiYWdlX0NvbGxlY3Rpb24oKTsKKwkJCWlmIChGQUlMID09IGdldF9sMl9jYWNoZV9ibGtzKCkpIHsKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiRmFpbCB0byBnZXQgTDIgY2FjaGUgYmxrcyFcbiIpOworCQkJCXJldHVybiBGQUlMOworCQkJfQorCQl9CisJfQorCisJbG9naWNhbF9ibGtfbnVtID0gQkxLX0ZST01fQUREUihsb2dpY2FsX2FkZHIpOworCWxvZ2ljYWxfcGFnZV9udW0gPSBQQUdFX0ZST01fQUREUihsb2dpY2FsX2FkZHIsIGxvZ2ljYWxfYmxrX251bSk7CisJQlVHX09OKGxvZ2ljYWxfYmxrX251bSA9PSBNQVhfVTMyX1ZBTFVFKTsKKworCS8qIFdyaXRlIHRoZSBjYWNoZSBpdGVtIGRhdGEgaW50byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBMMiBDYWNoZSAqLworI2lmIENNRF9ETUEKKwkvKgorCSAqIFRPRE8KKwkgKi8KKyNlbHNlCisJaWYgKEZBSUwgPT0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluKGJ1ZiwKKwkJY2FjaGVfbDIuYmxrX2FycmF5W2NhY2hlX2wyLmN1cl9ibGtfaWR4XSwKKwkJY2FjaGVfbDIuY3VyX3BhZ2VfbnVtLCAxKSkgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiTkFORCBQcm9ncmFtIGZhaWwgaW4gIgorCQkJIiVzLCBMaW5lICVkLCBuZXcgQmFkIEJsb2NrICVkIGdlbmVyYXRlZCFcbiIsCisJCQlfX0ZJTEVfXywgX19MSU5FX18sCisJCQljYWNoZV9sMi5ibGtfYXJyYXlbY2FjaGVfbDIuY3VyX2Jsa19pZHhdKTsKKworCQkvKiBUT0RPOiB0YWcgdGhlIGN1cnJlbnQgYmxvY2sgYXMgYmFkIGFuZCB0cnkgYWdhaW4gKi8KKworCQlyZXR1cm4gRkFJTDsKKwl9CisjZW5kaWYKKworCS8qIAorCSAqIFVwZGF0ZSB0aGUgTDIgQ2FjaGUgdGFibGUuCisJICoKKwkgKiBGaXJzdCBzZWFjaGluZyBpbiB0aGUgdGFibGUgdG8gc2VlIHdoZXRoZXIgdGhlIGxvZ2ljYWwgYmxvY2sKKwkgKiBoYXMgYmVlbiBtYXBwZWQuIElmIG5vdCwgdGhlbiBrbWFsbG9jIGEgbmV3IG5vZGUgZm9yIHRoZQorCSAqIGxvZ2ljYWwgYmxvY2ssIGZpbGwgZGF0YSwgYW5kIHRoZW4gaW5zZXJ0IGl0IHRvIHRoZSBsaXN0LgorCSAqIE90aGVyd2lzZSwganVzdCB1cGRhdGUgdGhlIG1hcHBlZCBub2RlIGRpcmVjdGx5LgorCSAqLworCWZvdW5kID0gMDsKKwlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZV9sMi50YWJsZS5saXN0KSB7CisJCXBuZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNwZWN0cmFfbDJfY2FjaGVfbGlzdCwgbGlzdCk7CisJCWlmIChwbmQtPmxvZ2ljYWxfYmxrX251bSA9PSBsb2dpY2FsX2Jsa19udW0pIHsKKwkJCXBuZC0+cGFnZXNfYXJyYXlbbG9naWNhbF9wYWdlX251bV0gPQorCQkJCShjYWNoZV9sMi5jdXJfYmxrX2lkeCA8PCAxNikgfAorCQkJCWNhY2hlX2wyLmN1cl9wYWdlX251bTsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpIHsgLyogQ3JlYXRlIG5ldyBub2RlIGZvciB0aGUgbG9naWNhbCBibG9jayBoZXJlICovCisKKwkJLyogVGhlIGxvZ2ljYWwgcGFnZXMgdG8gcGh5c2ljYWwgcGFnZXMgbWFwIGFycmF5IGlzCisJCSAqIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiBzdHJ1Y3Qgc3BlY3RyYV9sMl9jYWNoZV9saXN0LgorCQkgKi8gCisJCW5vZGVfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3BlY3RyYV9sMl9jYWNoZV9saXN0KSArCisJCQlzaXplb2YodTMyKSAqIERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2s7CisJCXBuZF9uZXcgPSBrbWFsbG9jKG5vZGVfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmICghcG5kX25ldykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8ga21hbGxvYyBpbiAlcyBMaW5lICVkXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkvKiAKKwkJCSAqIFRPRE86IE5lZWQgdG8gZmx1c2ggYWxsIHRoZSBMMiBjYWNoZSBpbnRvIE5BTkQgQVNBUAorCQkJICogc2luY2Ugbm8gbWVtb3J5IGF2YWlsYWJsZSBoZXJlCisJCQkgKi8KKwkJfQorCQlwbmRfbmV3LT5sb2dpY2FsX2Jsa19udW0gPSBsb2dpY2FsX2Jsa19udW07CisJCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOyBpKyspCisJCQlwbmRfbmV3LT5wYWdlc19hcnJheVtpXSA9IE1BWF9VMzJfVkFMVUU7CisJCXBuZF9uZXctPnBhZ2VzX2FycmF5W2xvZ2ljYWxfcGFnZV9udW1dID0KKwkJCShjYWNoZV9sMi5jdXJfYmxrX2lkeCA8PCAxNikgfCBjYWNoZV9sMi5jdXJfcGFnZV9udW07CisJCWxpc3RfYWRkKCZwbmRfbmV3LT5saXN0LCAmY2FjaGVfbDIudGFibGUubGlzdCk7CisJfQorCisJLyogSW5jcmVhc2luZyB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyIG9mIHRoZSBMMiBDYWNoZSAqLworCWNhY2hlX2wyLmN1cl9wYWdlX251bSsrOworCWlmIChjYWNoZV9sMi5jdXJfcGFnZV9udW0gPj0gRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykgeworCQljYWNoZV9sMi5jdXJfYmxrX2lkeCsrOworCQlpZiAoY2FjaGVfbDIuY3VyX2Jsa19pZHggPj0gQkxLX05VTV9GT1JfTDJfQ0FDSEUpIHsKKwkJCS8qIFRoZSBMMiBDYWNoZSBpcyBmdWxsLiBOZWVkIHRvIGZsdXNoIGl0IG5vdyAqLworCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkiTDIgQ2FjaGUgaXMgZnVsbCwgd2lsbCBzdGFydCB0byBmbHVzaCBpdFxuIik7CisJCQlmbHVzaF9sMl9jYWNoZSgpOworCQl9IGVsc2UgeworCQkJY2FjaGVfbDIuY3VyX3BhZ2VfbnVtID0gMDsKKwkJfQorCX0KKworCXJldHVybiBQQVNTOworfQorCisvKgorICogU2VhY2ggaW4gdGhlIExldmVsMiBDYWNoZSB0YWJsZSB0byBmaW5kIHRoZSBjYWNoZSBpdGVtLgorICogSWYgZmluZCwgcmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBOQU5EIHBhZ2Ugb2YgTDIgQ2FjaGUsCisgKiBPdGhlcndpc2UsIHJldHVybiBGQUlMLgorICovCitzdGF0aWMgaW50IHNlYXJjaF9sMl9jYWNoZSh1OCAqYnVmLCB1NjQgbG9naWNhbF9hZGRyKQoreworCXUzMiBsb2dpY2FsX2Jsa19udW07CisJdTE2IGxvZ2ljYWxfcGFnZV9udW07CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3Qgc3BlY3RyYV9sMl9jYWNoZV9saXN0ICpwbmQ7CisJdTMyIHRtcCA9IE1BWF9VMzJfVkFMVUU7CisJdTMyIHBoeV9ibGs7CisJdTE2IHBoeV9wYWdlOworCWludCByZXQgPSBGQUlMOworCisJbG9naWNhbF9ibGtfbnVtID0gQkxLX0ZST01fQUREUihsb2dpY2FsX2FkZHIpOworCWxvZ2ljYWxfcGFnZV9udW0gPSBQQUdFX0ZST01fQUREUihsb2dpY2FsX2FkZHIsIGxvZ2ljYWxfYmxrX251bSk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZV9sMi50YWJsZS5saXN0KSB7CisJCXBuZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNwZWN0cmFfbDJfY2FjaGVfbGlzdCwgbGlzdCk7CisJCWlmIChwbmQtPmxvZ2ljYWxfYmxrX251bSA9PSBsb2dpY2FsX2Jsa19udW0pIHsKKwkJCXRtcCA9IHBuZC0+cGFnZXNfYXJyYXlbbG9naWNhbF9wYWdlX251bV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0bXAgIT0gTUFYX1UzMl9WQUxVRSkgeyAvKiBGb3VuZCB2YWxpZCBtYXAgKi8KKwkJcGh5X2JsayA9IGNhY2hlX2wyLmJsa19hcnJheVsodG1wID4+IDE2KSAmIDB4RkZGRl07CisJCXBoeV9wYWdlID0gdG1wICYgMHhGRkZGOworI2lmIENNRF9ETUEKKwkJLyogVE9ETyAqLworI2Vsc2UKKwkJcmV0ID0gR0xPQl9MTERfUmVhZF9QYWdlX01haW4oYnVmLCBwaHlfYmxrLCBwaHlfcGFnZSwgMSk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9DYWNoZV9Xcml0ZV9CYWNrCisqIElucHV0czogICAgICAgcG9pbnRlciB0byBkYXRhIGNhY2hlZCBpbiBzeXMgbWVtb3J5CisqICAgICAgICAgICAgICAgYWRkcmVzcyBvZiBmcmVlIGJsb2NrIGluIGZsYXNoCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTD0xCisqIERlc2NyaXB0aW9uOiAgd3JpdGVzIGFsbCB0aGUgcGFnZXMgb2YgQ2FjaGUgQmxvY2sgdG8gZmxhc2gKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIGludCBGVExfQ2FjaGVfV3JpdGVfQmFjayh1OCAqcERhdGEsIHU2NCBibGtfYWRkcikKK3sKKwlpbnQgaSwgaiwgaUVyYXNlOworCXU2NCBvbGRfcGFnZV9hZGRyLCBhZGRyLCBwaHlfYWRkcjsKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXUzMiBsYmE7CisJCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJb2xkX3BhZ2VfYWRkciA9IEZUTF9HZXRfUGh5c2ljYWxfQmxvY2tfQWRkcihibGtfYWRkcikgKworCQlHTE9CX3U2NF9SZW1haW5kZXIoYmxrX2FkZHIsIDIpOworCisJaUVyYXNlID0gKEZBSUwgPT0gRlRMX1JlcGxhY2VfQmxvY2soYmxrX2FkZHIpKSA/IFBBU1MgOiBGQUlMOworCisJcGJ0W0JMS19GUk9NX0FERFIoYmxrX2FkZHIpXSAmPSAoflNQQVJFX0JMT0NLKTsKKworI2lmIENNRF9ETUEKKwlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9IChzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YV9GcmVlOworCWdfcEJURGVsdGFfRnJlZSArPSBzaXplb2Yoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSk7CisKKwlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPSBmdGxfY21kX2NudDsKKwlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPSAodTMyKShibGtfYWRkciA+PgorCQlEZXZpY2VJbmZvLm5CaXRzSW5CbG9ja0RhdGFTaXplKTsKKwlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPQorCQlwYnRbKHUzMikoYmxrX2FkZHIgPj4gRGV2aWNlSW5mby5uQml0c0luQmxvY2tEYXRhU2l6ZSldOworCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisjZW5kaWYKKworCWlmIChJTl9QUk9HUkVTU19CTE9DS19UQUJMRSAhPSBnX2NCbG9ja1RhYmxlU3RhdHVzKSB7CisJCWdfY0Jsb2NrVGFibGVTdGF0dXMgPSBJTl9QUk9HUkVTU19CTE9DS19UQUJMRTsKKwkJRlRMX1dyaXRlX0lOX1Byb2dyZXNzX0Jsb2NrX1RhYmxlX1BhZ2UoKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVUUllfVElNRVM7IGkrKykgeworCQlpZiAoUEFTUyA9PSBpRXJhc2UpIHsKKwkJCXBoeV9hZGRyID0gRlRMX0dldF9QaHlzaWNhbF9CbG9ja19BZGRyKGJsa19hZGRyKTsKKwkJCWlmIChGQUlMID09IEdMT0JfRlRMX0Jsb2NrX0VyYXNlKHBoeV9hZGRyKSkgeworCQkJCWxiYSA9IEJMS19GUk9NX0FERFIoYmxrX2FkZHIpOworCQkJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFtsYmFdKTsKKwkJCQlpID0gUkVUUllfVElNRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgQ0FDSEVfSVRFTV9OVU07IGorKykgeworCQkJYWRkciA9IENhY2hlLmFycmF5W2pdLmFkZHJlc3M7CisJCQlpZiAoKGFkZHIgPD0gYmxrX2FkZHIpICYmCisJCQkJKChhZGRyICsgQ2FjaGUuY2FjaGVfaXRlbV9zaXplKSA+IGJsa19hZGRyKSkKKwkJCQljYWNoZV9ibG9ja190b193cml0ZSA9IGo7CisJCX0KKworCQlwaHlfYWRkciA9IEZUTF9HZXRfUGh5c2ljYWxfQmxvY2tfQWRkcihibGtfYWRkcik7CisJCWlmIChQQVNTID09IEZUTF9DYWNoZV9VcGRhdGVfQmxvY2socERhdGEsCisJCQkJCW9sZF9wYWdlX2FkZHIsIHBoeV9hZGRyKSkgeworCQkJY2FjaGVfYmxvY2tfdG9fd3JpdGUgPSBVTkhJVF9DQUNIRV9JVEVNOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpRXJhc2UgPSBQQVNTOworCQl9CisJfQorCisJaWYgKGkgPj0gUkVUUllfVElNRVMpIHsKKwkJaWYgKEVSUiA9PSBGVExfRmxhc2hfRXJyb3JfSGFuZGxlKHBEYXRhLAorCQkJCQlvbGRfcGFnZV9hZGRyLCBibGtfYWRkcikpCisJCQlyZXR1cm4gRVJSOworCQllbHNlCisJCQlyZXR1cm4gRkFJTDsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfQ2FjaGVfV3JpdGVfUGFnZQorKiBJbnB1dHM6ICAgICAgIFBvaW50ZXIgdG8gYnVmZmVyLCBwYWdlIGFkZHJlc3MsIGNhY2hlIGJsb2NrIG51bWJlcgorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAvIEZBSUw9MQorKiBEZXNjcmlwdGlvbjogIEl0IHdyaXRlcyB0aGUgZGF0YSBpbiBDYWNoZSBCbG9jaworKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHZvaWQgRlRMX0NhY2hlX1dyaXRlX1BhZ2UodTggKnBEYXRhLCB1NjQgcGFnZV9hZGRyLAorCQkJCXU4IGNhY2hlX2JsaywgdTE2IGZsYWcpCit7CisJdTggKnBEZXN0OworCXU2NCBhZGRyOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWFkZHIgPSBDYWNoZS5hcnJheVtjYWNoZV9ibGtdLmFkZHJlc3M7CisJcERlc3QgPSBDYWNoZS5hcnJheVtjYWNoZV9ibGtdLmJ1ZjsKKworCXBEZXN0ICs9ICh1bnNpZ25lZCBsb25nKShwYWdlX2FkZHIgLSBhZGRyKTsKKwlDYWNoZS5hcnJheVtjYWNoZV9ibGtdLmNoYW5nZWQgPSBTRVQ7CisjaWYgQ01EX0RNQQorI2lmIFJFU1RPUkVfQ0FDSEVfT05fQ0RNQV9DSEFJTl9GQUlMVVJFCisJaW50X2NhY2hlW2Z0bF9jbWRfY250XS5pdGVtID0gY2FjaGVfYmxrOworCWludF9jYWNoZVtmdGxfY21kX2NudF0uY2FjaGUuYWRkcmVzcyA9CisJCQlDYWNoZS5hcnJheVtjYWNoZV9ibGtdLmFkZHJlc3M7CisJaW50X2NhY2hlW2Z0bF9jbWRfY250XS5jYWNoZS5jaGFuZ2VkID0KKwkJCUNhY2hlLmFycmF5W2NhY2hlX2Jsa10uY2hhbmdlZDsKKyNlbmRpZgorCUdMT0JfTExEX01lbUNvcHlfQ01EKHBEZXN0LCBwRGF0YSwgRGV2aWNlSW5mby53UGFnZURhdGFTaXplLCBmbGFnKTsKKwlmdGxfY21kX2NudCsrOworI2Vsc2UKKwltZW1jcHkocERlc3QsIHBEYXRhLCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworI2VuZGlmCisJaWYgKENhY2hlLmFycmF5W2NhY2hlX2Jsa10udXNlX2NudCA8IE1BWF9XT1JEX1ZBTFVFKQorCQlDYWNoZS5hcnJheVtjYWNoZV9ibGtdLnVzZV9jbnQrKzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9DYWNoZV9Xcml0ZQorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBJdCB3cml0ZXMgbGVhc3QgZnJlcXVlbnRseSB1c2VkIENhY2hlIGJsb2NrIHRvIGZsYXNoIGlmIGl0CisqICAgICAgICAgICAgICAgaGFzIGJlZW4gY2hhbmdlZAorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3N0YXRpYyBpbnQgRlRMX0NhY2hlX1dyaXRlKHZvaWQpCit7CisJaW50IGksIGJSZXN1bHQgPSBQQVNTOworCXUxNiBiTk8sIGxlYXN0X2NvdW50ID0gMHhGRkZGOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCUZUTF9DYWxjdWxhdGVfTFJVKCk7CisKKwliTk8gPSBDYWNoZS5MUlU7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJGVExfQ2FjaGVfV3JpdGU6ICIKKwkJIkxlYXN0IHVzZWQgY2FjaGUgYmxvY2sgaXMgJWRcbiIsIGJOTyk7CisKKwlpZiAoQ2FjaGUuYXJyYXlbYk5PXS5jaGFuZ2VkICE9IFNFVCkKKwkJcmV0dXJuIGJSZXN1bHQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkZUTF9DYWNoZV9Xcml0ZTogQ2FjaGUiCisJCSIgQmxvY2sgJWQgY29udGFpbmluZyBsb2dpY2FsIGJsb2NrICVkIGlzIGRpcnR5XG4iLAorCQliTk8sCisJCSh1MzIpKENhY2hlLmFycmF5W2JOT10uYWRkcmVzcyA+PgorCQlEZXZpY2VJbmZvLm5CaXRzSW5CbG9ja0RhdGFTaXplKSk7CisjaWYgQ01EX0RNQQorI2lmIFJFU1RPUkVfQ0FDSEVfT05fQ0RNQV9DSEFJTl9GQUlMVVJFCisJaW50X2NhY2hlW2Z0bF9jbWRfY250XS5pdGVtID0gYk5POworCWludF9jYWNoZVtmdGxfY21kX2NudF0uY2FjaGUuYWRkcmVzcyA9CisJCQkJQ2FjaGUuYXJyYXlbYk5PXS5hZGRyZXNzOworCWludF9jYWNoZVtmdGxfY21kX2NudF0uY2FjaGUuY2hhbmdlZCA9IENMRUFSOworI2VuZGlmCisjZW5kaWYKKwliUmVzdWx0ID0gd3JpdGVfYmFja190b19sMl9jYWNoZShDYWNoZS5hcnJheVtiTk9dLmJ1ZiwKKwkJCUNhY2hlLmFycmF5W2JOT10uYWRkcmVzcyk7CisJaWYgKGJSZXN1bHQgIT0gRVJSKQorCQlDYWNoZS5hcnJheVtiTk9dLmNoYW5nZWQgPSBDTEVBUjsKKworCWxlYXN0X2NvdW50ID0gQ2FjaGUuYXJyYXlbYk5PXS51c2VfY250OworCisJZm9yIChpID0gMDsgaSA8IENBQ0hFX0lURU1fTlVNOyBpKyspIHsKKwkJaWYgKGkgPT0gYk5PKQorCQkJY29udGludWU7CisJCWlmIChDYWNoZS5hcnJheVtpXS51c2VfY250ID4gMCkKKwkJCUNhY2hlLmFycmF5W2ldLnVzZV9jbnQgLT0gbGVhc3RfY291bnQ7CisJfQorCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX0NhY2hlX1JlYWQKKyogSW5wdXRzOiAgICAgICBQYWdlIGFkZHJlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBJdCByZWFkcyB0aGUgYmxvY2sgZnJvbSBkZXZpY2UgaW4gQ2FjaGUgQmxvY2sKKyogICAgICAgICAgICAgICBTZXQgdGhlIExSVSBjb3VudCB0byAxCisqICAgICAgICAgICAgICAgTWFyayB0aGUgQ2FjaGUgQmxvY2sgYXMgY2xlYW4KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgaW50IEZUTF9DYWNoZV9SZWFkKHU2NCBsb2dpY2FsX2FkZHIpCit7CisJdTY0IGl0ZW1fYWRkciwgcGh5X2FkZHI7CisJdTE2IG51bTsKKwlpbnQgcmV0OworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCW51bSA9IENhY2hlLkxSVTsgLyogVGhlIExSVSBjYWNoZSBpdGVtIHdpbGwgYmUgb3ZlcndyaXR0ZW4gKi8KKworCWl0ZW1fYWRkciA9ICh1NjQpR0xPQl91NjRfRGl2KGxvZ2ljYWxfYWRkciwgQ2FjaGUuY2FjaGVfaXRlbV9zaXplKSAqCisJCUNhY2hlLmNhY2hlX2l0ZW1fc2l6ZTsKKwlDYWNoZS5hcnJheVtudW1dLmFkZHJlc3MgPSBpdGVtX2FkZHI7CisJQ2FjaGUuYXJyYXlbbnVtXS51c2VfY250ID0gMTsKKwlDYWNoZS5hcnJheVtudW1dLmNoYW5nZWQgPSBDTEVBUjsKKworI2lmIENNRF9ETUEKKyNpZiBSRVNUT1JFX0NBQ0hFX09OX0NETUFfQ0hBSU5fRkFJTFVSRQorCWludF9jYWNoZVtmdGxfY21kX2NudF0uaXRlbSA9IG51bTsKKwlpbnRfY2FjaGVbZnRsX2NtZF9jbnRdLmNhY2hlLmFkZHJlc3MgPQorCQkJQ2FjaGUuYXJyYXlbbnVtXS5hZGRyZXNzOworCWludF9jYWNoZVtmdGxfY21kX2NudF0uY2FjaGUuY2hhbmdlZCA9CisJCQlDYWNoZS5hcnJheVtudW1dLmNoYW5nZWQ7CisjZW5kaWYKKyNlbmRpZgorCS8qCisJICogU2VhcmNoIGluIEwyIENhY2hlLiBJZiBoaXQsIGZpbGwgZGF0YSBpbnRvIEwxIENhY2hlIGl0ZW0gYnVmZmVyLAorCSAqIE90aGVyd2lzZSwgcmVhZCBpdCBmcm9tIE5BTkQKKwkgKi8KKwlyZXQgPSBzZWFyY2hfbDJfY2FjaGUoQ2FjaGUuYXJyYXlbbnVtXS5idWYsIGxvZ2ljYWxfYWRkcik7CisJaWYgKFBBU1MgPT0gcmV0KSAvKiBIaXQgaW4gTDIgQ2FjaGUgKi8KKwkJcmV0dXJuIHJldDsKKworCS8qIENvbXB1dGUgdGhlIHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3Mgb2YgTkFORCBkZXZpY2UgYWNjb3JkaW5nIHRvICovCisJLyogdGhlIGxvZ2ljYWwgc3RhcnQgYWRkcmVzcyBvZiB0aGUgY2FjaGUgaXRlbSAoTFJVIGNhY2hlIGl0ZW0pICovCisJcGh5X2FkZHIgPSBGVExfR2V0X1BoeXNpY2FsX0Jsb2NrX0FkZHIoaXRlbV9hZGRyKSArCisJCUdMT0JfdTY0X1JlbWFpbmRlcihpdGVtX2FkZHIsIDIpOworCisJcmV0dXJuIEZUTF9DYWNoZV9SZWFkX0FsbChDYWNoZS5hcnJheVtudW1dLmJ1ZiwgcGh5X2FkZHIpOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9DaGVja19CbG9ja19UYWJsZQorKiBJbnB1dHM6ICAgICAgID8KKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBJdCBjaGVja3MgdGhlIGNvcnJlY3RuZXNzIG9mIGVhY2ggYmxvY2sgdGFibGUgZW50cnkKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgaW50IEZUTF9DaGVja19CbG9ja19UYWJsZShpbnQgd09sZFRhYmxlKQoreworCXUzMiBpOworCWludCB3UmVzdWx0ID0gUEFTUzsKKwl1MzIgYmxrX2lkeDsKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXU4ICpwRmxhZyA9IGZsYWdfY2hlY2tfYmxrX3RhYmxlOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoTlVMTCAhPSBwRmxhZykgeworCQltZW1zZXQocEZsYWcsIEZBSUwsIERldmljZUluZm8ud0RhdGFCbG9ja051bSk7CisJCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07IGkrKykgeworCQkJYmxrX2lkeCA9ICh1MzIpKHBidFtpXSAmICh+QkFEX0JMT0NLKSk7CisKKwkJCS8qCisJCQkgKiAyMDA4MTAwNi9LQlYgLSBDaGFuZ2VkIHRvIHBGbGFnW2ldIHJlZmVyZW5jZQorCQkJICogdG8gYXZvaWQgYnVmZmVyIG92ZXJmbG93CisJCQkgKi8KKworCQkJLyoKKwkJCSAqIDIwMDgtMTAtMjAgWXVucGVuZyBOb3RlOiBUaGlzIGNoYW5nZSBhdm9pZAorCQkJICogYnVmZmVyIG92ZXJmbG93LCBidXQgY2hhbmdlZCBmdW5jdGlvbiBvZgorCQkJICogdGhlIGNvZGUsIHNvIGl0IHNob3VsZCBiZSByZS13cml0ZSBsYXRlcgorCQkJICovCisJCQlpZiAoKGJsa19pZHggPiBEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2spIHx8CisJCQkJUEFTUyA9PSBwRmxhZ1tpXSkgeworCQkJCXdSZXN1bHQgPSBGQUlMOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlwRmxhZ1tpXSA9IFBBU1M7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gd1Jlc3VsdDsKK30KKworCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX1dyaXRlX0Jsb2NrX1RhYmxlCisqIElucHV0czogICAgICAgZmxhc2cKKyogT3V0cHV0czogICAgICAwPUJsb2NrIFRhYmxlIHdhcyB1cGRhdGVkLiBObyB3cml0ZSBkb25lLiAxPUJsb2NrIHdyaXRlIG5lZWRzIHRvCisqIGhhcHBlbi4gLTEgRXJyb3IKKyogRGVzY3JpcHRpb246ICBJdCB3cml0ZXMgdGhlIGJsb2NrIHRhYmxlCisqICAgICAgICAgICAgICAgQmxvY2sgdGFibGUgYWx3YXlzIG1hcHBlZCB0byBMQkEgMCB3aGljaCBpbnR1cm4gbWFwcGVkCisqICAgICAgICAgICAgICAgdG8gYW55IHBoeXNpY2FsIGJsb2NrCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIGludCBGVExfV3JpdGVfQmxvY2tfVGFibGUoaW50IHdGb3JjZSkKK3sKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCWludCB3U3VjY2VzcyA9IFBBU1M7CisJdTMyIHdUZW1wQmxvY2tUYWJsZUluZGV4OworCXUxNiBidF9wYWdlcywgbmV3X2J0X29mZnNldDsKKwl1OCBibG9ja2NoYW5nZW9jY3VyZWQgPSAwOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJYnRfcGFnZXMgPSBGVExfR2V0X0Jsb2NrX1RhYmxlX0ZsYXNoX1NpemVfUGFnZXMoKTsKKworCWlmIChJTl9QUk9HUkVTU19CTE9DS19UQUJMRSAhPSBnX2NCbG9ja1RhYmxlU3RhdHVzKQorCQlyZXR1cm4gMDsKKworCWlmIChQQVNTID09IHdGb3JjZSkgeworCQlnX3dCbG9ja1RhYmxlT2Zmc2V0ID0KKwkJCSh1MTYpKERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2sgLSBidF9wYWdlcyk7CisjaWYgQ01EX0RNQQorCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPSBmdGxfY21kX2NudDsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmdfd0Jsb2NrVGFibGVPZmZzZXQgPQorCQkJZ193QmxvY2tUYWJsZU9mZnNldDsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgwMTsKKyNlbmRpZgorCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkiSW5zaWRlIEZUTF9Xcml0ZV9CbG9ja19UYWJsZTogYmxvY2sgJWQgUGFnZTolZFxuIiwKKwkJZ193QmxvY2tUYWJsZUluZGV4LCBnX3dCbG9ja1RhYmxlT2Zmc2V0KTsKKworCWRvIHsKKwkJbmV3X2J0X29mZnNldCA9IGdfd0Jsb2NrVGFibGVPZmZzZXQgKyBidF9wYWdlcyArIDE7CisJCWlmICgoMCA9PSAobmV3X2J0X29mZnNldCAlIERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spKSB8fAorCQkJKG5ld19idF9vZmZzZXQgPiBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSB8fAorCQkJKEZBSUwgPT0gd1N1Y2Nlc3MpKSB7CisJCQl3VGVtcEJsb2NrVGFibGVJbmRleCA9IEZUTF9SZXBsYWNlX0Jsb2NrX1RhYmxlKCk7CisJCQlpZiAoQkFEX0JMT0NLID09IHdUZW1wQmxvY2tUYWJsZUluZGV4KQorCQkJCXJldHVybiBFUlI7CisJCQlpZiAoIWJsb2NrY2hhbmdlb2NjdXJlZCkgeworCQkJCWJ0X2Jsb2NrX2NoYW5nZWQgPSAxOworCQkJCWJsb2NrY2hhbmdlb2NjdXJlZCA9IDE7CisJCQl9CisKKwkJCWdfd0Jsb2NrVGFibGVJbmRleCA9IHdUZW1wQmxvY2tUYWJsZUluZGV4OworCQkJZ193QmxvY2tUYWJsZU9mZnNldCA9IDA7CisJCQlwYnRbQkxPQ0tfVEFCTEVfSU5ERVhdID0gZ193QmxvY2tUYWJsZUluZGV4OworI2lmIENNRF9ETUEKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJCWdfcEJURGVsdGFfRnJlZSArPSBzaXplb2Yoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSk7CisKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudCA9CisJCQkJICAgIGZ0bF9jbWRfY250OworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmdfd0Jsb2NrVGFibGVPZmZzZXQgPQorCQkJCSAgICBnX3dCbG9ja1RhYmxlT2Zmc2V0OworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmdfd0Jsb2NrVGFibGVJbmRleCA9CisJCQkJICAgIGdfd0Jsb2NrVGFibGVJbmRleDsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MDM7CisKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJCWdfcEJURGVsdGFfRnJlZSArPQorCQkJCXNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkgICAgZnRsX2NtZF9jbnQ7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPQorCQkJCSAgICBCTE9DS19UQUJMRV9JTkRFWDsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9FbnRyeV9WYWx1ZSA9CisJCQkJICAgIHBidFtCTE9DS19UQUJMRV9JTkRFWF07CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweDBDOworI2VuZGlmCisJCX0KKworCQl3U3VjY2VzcyA9IEZUTF9Xcml0ZV9CbG9ja19UYWJsZV9EYXRhKCk7CisJCWlmIChGQUlMID09IHdTdWNjZXNzKQorCQkJTUFSS19CTE9DS19BU19CQUQocGJ0W0JMT0NLX1RBQkxFX0lOREVYXSk7CisJfSB3aGlsZSAoRkFJTCA9PSB3U3VjY2Vzcyk7CisKKwlnX2NCbG9ja1RhYmxlU3RhdHVzID0gQ1VSUkVOVF9CTE9DS19UQUJMRTsKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uOiAgICAgR0xPQl9GVExfRmxhc2hfRm9ybWF0CisqIElucHV0czogICAgICAgbm9uZQorKiBPdXRwdXRzOiAgICAgIFBBU1MKKyogRGVzY3JpcHRpb246ICBUaGUgYmxvY2sgdGFibGUgc3RvcmVzIGJhZCBibG9jayBpbmZvLCBpbmNsdWRpbmcgTURGKworKiAgICAgICAgICAgICAgIGJsb2NrcyBnb25lIGJhZCBvdmVyIHRoZSBhZ2VzLiBUaGVyZWZvcmUsIGlmIHdlIGhhdmUgYQorKiAgICAgICAgICAgICAgIGJsb2NrIHRhYmxlIGluIHBsYWNlLCB0aGVuIHVzZSBpdCB0byBzY2FuIGZvciBiYWQgYmxvY2tzCisqICAgICAgICAgICAgICAgSWYgbm90LCB0aGVuIHNjYW4gZm9yIE1ERi4KKyogICAgICAgICAgICAgICBOb3csIGEgYmxvY2sgdGFibGUgd2lsbCBvbmx5IGJlIGZvdW5kIGlmIHNwZWN0cmEgd2FzIGFscmVhZHkKKyogICAgICAgICAgICAgICBiZWluZyB1c2VkLiBGb3IgYSBmcmVzaCBmbGFzaCwgd2UnbGwgZ28gdGhydSBzY2FubmluZyBmb3IKKyogICAgICAgICAgICAgICBNREYuIElmIHNwZWN0cmEgd2FzIGJlaW5nIHVzZWQsIHRoZW4gdGhlcmUgaXMgYSBjaGFuY2UgdGhhdAorKiAgICAgICAgICAgICAgIHRoZSBNREYgaGFzIGJlZW4gY29ycnVwdGVkLiBTcGVjdHJhIGF2b2lkcyB3cml0aW5nIHRvIHRoZQorKiAgICAgICAgICAgICAgIGZpcnN0IDIgYnl0ZXMgb2YgdGhlIHNwYXJlIGFyZWEgdG8gYWxsIHBhZ2VzIGluIGEgYmxvY2suIFRoaXMKKyogICAgICAgICAgICAgICBjb3ZlcnMgYWxsIGtub3duIGZsYXNoIGRldmljZXMuIEhvd2V2ZXIsIHNpbmNlIGZsYXNoCisqICAgICAgICAgICAgICAgbWFudWZhY3R1cmVycyBoYXZlIG5vIHN0YW5kYXJkIG9mIHdoZXJlIHRoZSBNREYgaXMgc3RvcmVkLAorKiAgICAgICAgICAgICAgIHRoaXMgY2Fubm90IGd1YXJhbnRlZSB0aGF0IHRoZSBNREYgaXMgcHJvdGVjdGVkIGZvciBmdXR1cmUKKyogICAgICAgICAgICAgICBkZXZpY2VzIHRvby4gVGhlIGluaXRpYWwgc2Nhbm5pbmcgZm9yIHRoZSBibG9jayB0YWJsZSBhc3N1cmVzCisqICAgICAgICAgICAgICAgdGhpcy4gSXQgaXMgb2sgZXZlbiBpZiB0aGUgYmxvY2sgdGFibGUgaXMgb3V0ZGF0ZWQsIGFzIGFsbAorKiAgICAgICAgICAgICAgIHdlJ3JlIGxvb2tpbmcgZm9yIGFyZSBiYWQgYmxvY2sgbWFya2Vycy4KKyogICAgICAgICAgICAgICBVc2UgdGhpcyB3aGVuIG1vdW50aW5nIGEgZmlsZSBzeXN0ZW0gb3Igc3RhcnRpbmcgYQorKiAgICAgICAgICAgICAgIG5ldyBmbGFzaC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgIEZUTF9Gb3JtYXRfRmxhc2godTggdmFsaWRfYmxvY2tfdGFibGUpCit7CisJdTMyIGksIGo7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKwl1MzIgdGVtcE5vZGU7CisJaW50IHJldDsKKworI2lmIENNRF9ETUEKKwl1MzIgKnBidFN0YXJ0aW5nQ29weSA9ICh1MzIgKilnX3BCVFN0YXJ0aW5nQ29weTsKKwlpZiAoZnRsX2NtZF9jbnQpCisJCXJldHVybiBGQUlMOworI2VuZGlmCisKKwlpZiAoRkFJTCA9PSBGVExfQ2hlY2tfQmxvY2tfVGFibGUoRkFJTCkpCisJCXZhbGlkX2Jsb2NrX3RhYmxlID0gMDsKKworCWlmICh2YWxpZF9ibG9ja190YWJsZSkgeworCQl1OCBzd2l0Y2hlZCA9IDE7CisJCXUzMiBibG9jaywgazsKKworCQlrID0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2s7CisJCXdoaWxlIChzd2l0Y2hlZCAmJiAoayA8IERldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jaykpIHsKKwkJCXN3aXRjaGVkID0gMDsKKwkJCWsrKzsKKwkJCWZvciAoaiA9IERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrLCBpID0gMDsKKwkJCWogPD0gRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrOworCQkJaisrLCBpKyspIHsKKwkJCQlibG9jayA9IChwYnRbaV0gJiB+QkFEX0JMT0NLKSAtCisJCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrOworCQkJCWlmIChibG9jayAhPSBpKSB7CisJCQkJCXN3aXRjaGVkID0gMTsKKwkJCQkJdGVtcE5vZGUgPSBwYnRbaV07CisJCQkJCXBidFtpXSA9IHBidFtibG9ja107CisJCQkJCXBidFtibG9ja10gPSB0ZW1wTm9kZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKChrID09IERldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jaykgJiYgc3dpdGNoZWQpCisJCQl2YWxpZF9ibG9ja190YWJsZSA9IDA7CisJfQorCisJaWYgKCF2YWxpZF9ibG9ja190YWJsZSkgeworCQltZW1zZXQoZ19wQmxvY2tUYWJsZSwgMCwKKwkJCURldmljZUluZm8ud0RhdGFCbG9ja051bSAqIHNpemVvZih1MzIpKTsKKwkJbWVtc2V0KGdfcFdlYXJDb3VudGVyLCAwLAorCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KSk7CisJCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkKKwkJCW1lbXNldChnX3BSZWFkQ291bnRlciwgMCwKKwkJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTE2KSk7CisjaWYgQ01EX0RNQQorCQltZW1zZXQoZ19wQlRTdGFydGluZ0NvcHksIDAsCisJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTMyKSk7CisJCW1lbXNldChnX3BXZWFyQ291bnRlckNvcHksIDAsCisJCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KSk7CisJCWlmIChEZXZpY2VJbmZvLk1MQ0RldmljZSkKKwkJCW1lbXNldChnX3BSZWFkQ291bnRlckNvcHksIDAsCisJCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHUxNikpOworI2VuZGlmCisJCWZvciAoaiA9IERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrLCBpID0gMDsKKwkJCWogPD0gRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrOworCQkJaisrLCBpKyspIHsKKwkJCWlmIChHTE9CX0xMRF9HZXRfQmFkX0Jsb2NrKCh1MzIpaikpCisJCQkJcGJ0W2ldID0gKHUzMikoQkFEX0JMT0NLIHwgaik7CisJCX0KKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiRXJhc2luZyBhbGwgYmxvY2tzIGluIHRoZSBOQU5EXG4iKTsKKworCWZvciAoaiA9IERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrLCBpID0gMDsKKwkJaiA8PSBEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2s7CisJCWorKywgaSsrKSB7CisJCWlmICgocGJ0W2ldICYgQkFEX0JMT0NLKSAhPSBCQURfQkxPQ0spIHsKKwkJCXJldCA9IEdMT0JfTExEX0VyYXNlX0Jsb2NrKGopOworCQkJaWYgKEZBSUwgPT0gcmV0KSB7CisJCQkJcGJ0W2ldID0gKHUzMikoaik7CisJCQkJTUFSS19CTE9DS19BU19CQUQocGJ0W2ldKTsKKwkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJICAgICAgICJOQU5EIFByb2dyYW0gZmFpbCBpbiAlcywgTGluZSAlZCwgIgorCQkJICAgICAgICJGdW5jdGlvbjogJXMsIG5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkIVxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCAoaW50KWopOworCQkJfSBlbHNlIHsKKwkJCQlwYnRbaV0gPSAodTMyKShTUEFSRV9CTE9DSyB8IGopOworCQkJfQorCQl9CisjaWYgQ01EX0RNQQorCQlwYnRTdGFydGluZ0NvcHlbaV0gPSBwYnRbaV07CisjZW5kaWYKKwl9CisKKwlnX3dCbG9ja1RhYmxlT2Zmc2V0ID0gMDsKKwlmb3IgKGkgPSAwOyAoaSA8PSAoRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrIC0KKwkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrKSkKKwkJCSYmICgocGJ0W2ldICYgQkFEX0JMT0NLKSA9PSBCQURfQkxPQ0spOyBpKyspCisJCTsKKwlpZiAoaSA+IChEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2sgLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBbGwgYmxvY2tzIGJhZCFcbiIpOworCQlyZXR1cm4gRkFJTDsKKwl9IGVsc2UgeworCQlnX3dCbG9ja1RhYmxlSW5kZXggPSBwYnRbaV0gJiB+QkFEX0JMT0NLOworCQlpZiAoaSAhPSBCTE9DS19UQUJMRV9JTkRFWCkgeworCQkJdGVtcE5vZGUgPSBwYnRbaV07CisJCQlwYnRbaV0gPSBwYnRbQkxPQ0tfVEFCTEVfSU5ERVhdOworCQkJcGJ0W0JMT0NLX1RBQkxFX0lOREVYXSA9IHRlbXBOb2RlOworCQl9CisJfQorCXBidFtCTE9DS19UQUJMRV9JTkRFWF0gJj0gKH5TUEFSRV9CTE9DSyk7CisKKyNpZiBDTURfRE1BCisJcGJ0U3RhcnRpbmdDb3B5W0JMT0NLX1RBQkxFX0lOREVYXSAmPSAoflNQQVJFX0JMT0NLKTsKKyNlbmRpZgorCisJZ19jQmxvY2tUYWJsZVN0YXR1cyA9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFOworCW1lbXNldChnX3BCVEJsb2NrcywgMHhGRiwKKwkJCSgxICsgTEFTVF9CVF9JRCAtIEZJUlNUX0JUX0lEKSAqIHNpemVvZih1MzIpKTsKKwlnX3BCVEJsb2Nrc1tGSVJTVF9CVF9JRC1GSVJTVF9CVF9JRF0gPSBnX3dCbG9ja1RhYmxlSW5kZXg7CisJRlRMX1dyaXRlX0Jsb2NrX1RhYmxlKEZBSUwpOworCisJZm9yIChpID0gMDsgaSA8IENBQ0hFX0lURU1fTlVNOyBpKyspIHsKKwkJQ2FjaGUuYXJyYXlbaV0uYWRkcmVzcyA9IE5BTkRfQ0FDSEVfSU5JVF9BRERSOworCQlDYWNoZS5hcnJheVtpXS51c2VfY250ID0gMDsKKwkJQ2FjaGUuYXJyYXlbaV0uY2hhbmdlZCAgPSBDTEVBUjsKKwl9CisKKyNpZiAoUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUgJiYgQ01EX0RNQSkKKwltZW1jcHkoKHZvaWQgKikmY2FjaGVfc3RhcnRfY29weSwgKHZvaWQgKikmQ2FjaGUsCisJCQlzaXplb2Yoc3RydWN0IGZsYXNoX2NhY2hlX3RhZykpOworI2VuZGlmCisJcmV0dXJuIFBBU1M7Cit9CisKK3N0YXRpYyBpbnQgIGZvcmNlX2Zvcm1hdF9uYW5kKHZvaWQpCit7CisJdTMyIGk7CisKKwkvKiBGb3JjZSBlcmFzZSB0aGUgd2hvbGUgdW5wcm90ZWN0ZWQgcGh5c2ljYWwgcGFydGl0b24gb2YgTkFORCAqLworCXByaW50ayhLRVJOX0FMRVJUICJTdGFydCB0byBmb3JjZSBlcmFzZSB3aG9sZSBOQU5EIGRldmljZSAuLi5cbiIpOworCXByaW50ayhLRVJOX0FMRVJUICJGcm9tIHBoeWljYWwgYmxvY2sgJWQgdG8gJWRcbiIsCisJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrLCBEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2spOworCWZvciAoaSA9IERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrOyBpIDw9IERldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jazsgaSsrKSB7CisJCWlmIChHTE9CX0xMRF9FcmFzZV9CbG9jayhpKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGZvcmNlIGVyYXNlIE5BTkQgYmxvY2sgJWRcbiIsIGkpOworCX0KKwlwcmludGsoS0VSTl9BTEVSVCAiRm9yY2UgRXJhc2UgZW5kcy4gUGxlYXNlIHJlYm9vdCB0aGUgc3lzdGVtIC4uLlxuIik7CisJd2hpbGUoMSk7CisKKwlyZXR1cm4gUEFTUzsKK30KKworaW50IEdMT0JfRlRMX0ZsYXNoX0Zvcm1hdCh2b2lkKQoreworCS8vcmV0dXJuIEZUTF9Gb3JtYXRfRmxhc2goMSk7CisJcmV0dXJuIGZvcmNlX2Zvcm1hdF9uYW5kKCk7CisKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfU2VhcmNoX0Jsb2NrX1RhYmxlX0lOX0Jsb2NrCisqIElucHV0czogICAgICAgQmxvY2sgTnVtYmVyCisqICAgICAgICAgICAgICAgUG9pbnRlciB0byBwYWdlCisqIE91dHB1dHM6ICAgICAgUEFTUyAvIEZBSUwKKyogICAgICAgICAgICAgICBQYWdlIGNvbnRhdGluaW5nIHRoZSBibG9jayB0YWJsZQorKiBEZXNjcmlwdGlvbjogIEl0IHNlYXJjaGVzIHRoZSBibG9jayB0YWJsZSBpbiB0aGUgYmxvY2sKKyogICAgICAgICAgICAgICBwYXNzZWQgYXMgYW4gYXJndW1lbnQuCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIGludCBGVExfU2VhcmNoX0Jsb2NrX1RhYmxlX0lOX0Jsb2NrKHUzMiBCVF9CbG9jaywKKwkJCQkJCXU4IEJUX1RhZywgdTE2ICpQYWdlKQoreworCXUxNiBpLCBqLCBrOworCXUxNiBSZXN1bHQgPSBQQVNTOworCXUxNiBMYXN0X0lQRiA9IDA7CisJdTggIEJUX0ZvdW5kID0gMDsKKwl1OCAqdGFnYXJyYXk7CisJdTggKnRlbXBidWYgPSB0bXBfYnVmX3NlYXJjaF9idF9pbl9ibG9jazsKKwl1OCAqcFNwYXJlQnVmID0gc3BhcmVfYnVmX3NlYXJjaF9idF9pbl9ibG9jazsKKwl1OCAqcFNwYXJlQnVmQlRMYXN0UGFnZSA9IHNwYXJlX2J1Zl9idF9zZWFyY2hfYnRfaW5fYmxvY2s7CisJdTggYnRfZmxhZ19sYXN0X3BhZ2UgPSAweEZGOworCXU4IHNlYXJjaF9pbl9wcmV2aW91c19wYWdlcyA9IDA7CisJdTE2IGJ0X3BhZ2VzOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCSAgICAgICAiU2VhcmNoaW5nIGJsb2NrIHRhYmxlIGluICV1IGJsb2NrXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClCVF9CbG9jayk7CisKKwlidF9wYWdlcyA9IEZUTF9HZXRfQmxvY2tfVGFibGVfRmxhc2hfU2l6ZV9QYWdlcygpOworCisJZm9yIChpID0gYnRfcGFnZXM7IGkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOworCQkJCWkgKz0gKGJ0X3BhZ2VzICsgMSkpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkgICAgICAgIlNlYXJjaGluZyBsYXN0IElQRjogJWRcbiIsIGkpOworCQlSZXN1bHQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHRlbXBidWYsCisJCQkJCQkJQlRfQmxvY2ssIGksIDEpOworCisJCWlmICgwID09IG1lbWNtcCh0ZW1wYnVmLCBnX3BJUEYsIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSkpIHsKKwkJCWlmICgoaSArIGJ0X3BhZ2VzICsgMSkgPCBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSB7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXNlYXJjaF9pbl9wcmV2aW91c19wYWdlcyA9IDE7CisJCQkJTGFzdF9JUEYgPSBpOworCQkJfQorCQl9CisKKwkJaWYgKCFzZWFyY2hfaW5fcHJldmlvdXNfcGFnZXMpIHsKKwkJCWlmIChpICE9IGJ0X3BhZ2VzKSB7CisJCQkJaSAtPSAoYnRfcGFnZXMgKyAxKTsKKwkJCQlMYXN0X0lQRiA9IGk7CisJCQl9CisJCX0KKworCQlpZiAoMCA9PSBMYXN0X0lQRikKKwkJCWJyZWFrOworCisJCWlmICghc2VhcmNoX2luX3ByZXZpb3VzX3BhZ2VzKSB7CisJCQlpID0gaSArIDE7CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiUmVhZGluZyB0aGUgc3BhcmUgYXJlYSBvZiBCbG9jayAldSBQYWdlICV1IiwKKwkJCQkodW5zaWduZWQgaW50KUJUX0Jsb2NrLCBpKTsKKwkJCVJlc3VsdCA9IEdMT0JfTExEX1JlYWRfUGFnZV9TcGFyZShwU3BhcmVCdWYsCisJCQkJCQkJQlRfQmxvY2ssIGksIDEpOworCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJIlJlYWRpbmcgdGhlIHNwYXJlIGFyZWEgb2YgQmxvY2sgJXUgUGFnZSAldSIsCisJCQkJKHVuc2lnbmVkIGludClCVF9CbG9jaywgaSArIGJ0X3BhZ2VzIC0gMSk7CisJCQlSZXN1bHQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfU3BhcmUocFNwYXJlQnVmQlRMYXN0UGFnZSwKKwkJCQlCVF9CbG9jaywgaSArIGJ0X3BhZ2VzIC0gMSwgMSk7CisKKwkJCWsgPSAwOworCQkJaiA9IEZUTF9FeHRyYWN0X0Jsb2NrX1RhYmxlX1RhZyhwU3BhcmVCdWYsICZ0YWdhcnJheSk7CisJCQlpZiAoaikgeworCQkJCWZvciAoOyBrIDwgajsgaysrKSB7CisJCQkJCWlmICh0YWdhcnJheVtrXSA9PSBCVF9UYWcpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChrIDwgaikKKwkJCQlidF9mbGFnID0gdGFnYXJyYXlba107CisJCQllbHNlCisJCQkJUmVzdWx0ID0gRkFJTDsKKworCQkJaWYgKFJlc3VsdCA9PSBQQVNTKSB7CisJCQkJayA9IDA7CisJCQkJaiA9IEZUTF9FeHRyYWN0X0Jsb2NrX1RhYmxlX1RhZygKKwkJCQkJcFNwYXJlQnVmQlRMYXN0UGFnZSwgJnRhZ2FycmF5KTsKKwkJCQlpZiAoaikgeworCQkJCQlmb3IgKDsgayA8IGo7IGsrKykgeworCQkJCQkJaWYgKHRhZ2FycmF5W2tdID09IEJUX1RhZykKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChrIDwgaikKKwkJCQkJYnRfZmxhZ19sYXN0X3BhZ2UgPSB0YWdhcnJheVtrXTsKKwkJCQllbHNlCisJCQkJCVJlc3VsdCA9IEZBSUw7CisKKwkJCQlpZiAoUmVzdWx0ID09IFBBU1MpIHsKKwkJCQkJaWYgKGJ0X2ZsYWcgPT0gYnRfZmxhZ19sYXN0X3BhZ2UpIHsKKwkJCQkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJCQkJCSJCbG9jayB0YWJsZSBpcyBmb3VuZCIKKwkJCQkJCQkiIGluIHBhZ2UgYWZ0ZXIgSVBGICIKKwkJCQkJCQkiYXQgYmxvY2sgJWQgIgorCQkJCQkJCSJwYWdlICVkXG4iLAorCQkJCQkJCShpbnQpQlRfQmxvY2ssIGkpOworCQkJCQkJQlRfRm91bmQgPSAxOworCQkJCQkJKlBhZ2UgID0gaTsKKwkJCQkJCWdfY0Jsb2NrVGFibGVTdGF0dXMgPQorCQkJCQkJCUNVUlJFTlRfQkxPQ0tfVEFCTEU7CisJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVJlc3VsdCA9IEZBSUw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoc2VhcmNoX2luX3ByZXZpb3VzX3BhZ2VzKQorCQkJaSA9IGkgLSBidF9wYWdlczsKKwkJZWxzZQorCQkJaSA9IGkgLSAoYnRfcGFnZXMgKyAxKTsKKworCQlSZXN1bHQgPSBQQVNTOworCisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIlJlYWRpbmcgdGhlIHNwYXJlIGFyZWEgb2YgQmxvY2sgJWQgUGFnZSAlZCIsCisJCQkoaW50KUJUX0Jsb2NrLCBpKTsKKworCQlSZXN1bHQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfU3BhcmUocFNwYXJlQnVmLCBCVF9CbG9jaywgaSwgMSk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIlJlYWRpbmcgdGhlIHNwYXJlIGFyZWEgb2YgQmxvY2sgJXUgUGFnZSAldSIsCisJCQkodW5zaWduZWQgaW50KUJUX0Jsb2NrLCBpICsgYnRfcGFnZXMgLSAxKTsKKworCQlSZXN1bHQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfU3BhcmUocFNwYXJlQnVmQlRMYXN0UGFnZSwKKwkJCQkJQlRfQmxvY2ssIGkgKyBidF9wYWdlcyAtIDEsIDEpOworCisJCWsgPSAwOworCQlqID0gRlRMX0V4dHJhY3RfQmxvY2tfVGFibGVfVGFnKHBTcGFyZUJ1ZiwgJnRhZ2FycmF5KTsKKwkJaWYgKGopIHsKKwkJCWZvciAoOyBrIDwgajsgaysrKSB7CisJCQkJaWYgKHRhZ2FycmF5W2tdID09IEJUX1RhZykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoayA8IGopCisJCQlidF9mbGFnID0gdGFnYXJyYXlba107CisJCWVsc2UKKwkJCVJlc3VsdCA9IEZBSUw7CisKKwkJaWYgKFJlc3VsdCA9PSBQQVNTKSB7CisJCQlrID0gMDsKKwkJCWogPSBGVExfRXh0cmFjdF9CbG9ja19UYWJsZV9UYWcocFNwYXJlQnVmQlRMYXN0UGFnZSwKKwkJCQkJCSZ0YWdhcnJheSk7CisJCQlpZiAoaikgeworCQkJCWZvciAoOyBrIDwgajsgaysrKSB7CisJCQkJCWlmICh0YWdhcnJheVtrXSA9PSBCVF9UYWcpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChrIDwgaikgeworCQkJCWJ0X2ZsYWdfbGFzdF9wYWdlID0gdGFnYXJyYXlba107CisJCQl9IGVsc2UgeworCQkJCVJlc3VsdCA9IEZBSUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChSZXN1bHQgPT0gUEFTUykgeworCQkJCWlmIChidF9mbGFnID09IGJ0X2ZsYWdfbGFzdF9wYWdlKSB7CisJCQkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJCQkJIkJsb2NrIHRhYmxlIGlzIGZvdW5kICIKKwkJCQkJCSJpbiBwYWdlIHByaW9yIHRvIElQRiAiCisJCQkJCQkiYXQgYmxvY2sgJXUgcGFnZSAlZFxuIiwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpQlRfQmxvY2ssIGkpOworCQkJCQlCVF9Gb3VuZCA9IDE7CisJCQkJCSpQYWdlICA9IGk7CisJCQkJCWdfY0Jsb2NrVGFibGVTdGF0dXMgPQorCQkJCQkJSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEU7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCVJlc3VsdCA9IEZBSUw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChSZXN1bHQgPT0gRkFJTCkgeworCQlpZiAoKExhc3RfSVBGID4gYnRfcGFnZXMpICYmIChpIDwgTGFzdF9JUEYpICYmICghQlRfRm91bmQpKSB7CisJCQlCVF9Gb3VuZCA9IDE7CisJCQkqUGFnZSA9IGkgLSAoYnRfcGFnZXMgKyAxKTsKKwkJfQorCQlpZiAoKExhc3RfSVBGID09IGJ0X3BhZ2VzKSAmJiAoaSA8IExhc3RfSVBGKSAmJiAoIUJUX0ZvdW5kKSkKKwkJCWdvdG8gZnVuY19yZXR1cm47CisJfQorCisJaWYgKExhc3RfSVBGID09IDApIHsKKwkJaSA9IDA7CisJCVJlc3VsdCA9IFBBU1M7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiUmVhZGluZyB0aGUgc3BhcmUgYXJlYSBvZiAiCisJCQkiQmxvY2sgJXUgUGFnZSAldSIsICh1bnNpZ25lZCBpbnQpQlRfQmxvY2ssIGkpOworCisJCVJlc3VsdCA9IEdMT0JfTExEX1JlYWRfUGFnZV9TcGFyZShwU3BhcmVCdWYsIEJUX0Jsb2NrLCBpLCAxKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiUmVhZGluZyB0aGUgc3BhcmUgYXJlYSBvZiBCbG9jayAldSBQYWdlICV1IiwKKwkJCSh1bnNpZ25lZCBpbnQpQlRfQmxvY2ssIGkgKyBidF9wYWdlcyAtIDEpOworCQlSZXN1bHQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfU3BhcmUocFNwYXJlQnVmQlRMYXN0UGFnZSwKKwkJCQkJQlRfQmxvY2ssIGkgKyBidF9wYWdlcyAtIDEsIDEpOworCisJCWsgPSAwOworCQlqID0gRlRMX0V4dHJhY3RfQmxvY2tfVGFibGVfVGFnKHBTcGFyZUJ1ZiwgJnRhZ2FycmF5KTsKKwkJaWYgKGopIHsKKwkJCWZvciAoOyBrIDwgajsgaysrKSB7CisJCQkJaWYgKHRhZ2FycmF5W2tdID09IEJUX1RhZykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoayA8IGopCisJCQlidF9mbGFnID0gdGFnYXJyYXlba107CisJCWVsc2UKKwkJCVJlc3VsdCA9IEZBSUw7CisKKwkJaWYgKFJlc3VsdCA9PSBQQVNTKSB7CisJCQlrID0gMDsKKwkJCWogPSBGVExfRXh0cmFjdF9CbG9ja19UYWJsZV9UYWcocFNwYXJlQnVmQlRMYXN0UGFnZSwKKwkJCQkJCQkmdGFnYXJyYXkpOworCQkJaWYgKGopIHsKKwkJCQlmb3IgKDsgayA8IGo7IGsrKykgeworCQkJCQlpZiAodGFnYXJyYXlba10gPT0gQlRfVGFnKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoayA8IGopCisJCQkJYnRfZmxhZ19sYXN0X3BhZ2UgPSB0YWdhcnJheVtrXTsKKwkJCWVsc2UKKwkJCQlSZXN1bHQgPSBGQUlMOworCisJCQlpZiAoUmVzdWx0ID09IFBBU1MpIHsKKwkJCQlpZiAoYnRfZmxhZyA9PSBidF9mbGFnX2xhc3RfcGFnZSkgeworCQkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkJCSJCbG9jayB0YWJsZSBpcyBmb3VuZCAiCisJCQkJCQkiaW4gcGFnZSBhZnRlciBJUEYgYXQgIgorCQkJCQkJImJsb2NrICV1IHBhZ2UgJXVcbiIsCisJCQkJCQkodW5zaWduZWQgaW50KUJUX0Jsb2NrLAorCQkJCQkJKHVuc2lnbmVkIGludClpKTsKKwkJCQkJQlRfRm91bmQgPSAxOworCQkJCQkqUGFnZSAgPSBpOworCQkJCQlnX2NCbG9ja1RhYmxlU3RhdHVzID0KKwkJCQkJCUNVUlJFTlRfQkxPQ0tfVEFCTEU7CisJCQkJCWdvdG8gZnVuY19yZXR1cm47CisJCQkJfSBlbHNlIHsKKwkJCQkJUmVzdWx0ID0gRkFJTDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoUmVzdWx0ID09IEZBSUwpCisJCQlnb3RvIGZ1bmNfcmV0dXJuOworCX0KK2Z1bmNfcmV0dXJuOgorCXJldHVybiBSZXN1bHQ7Cit9CisKK3U4ICpnZXRfYmxrX3RhYmxlX3N0YXJ0X2FkZHIodm9pZCkKK3sKKwlyZXR1cm4gZ19wQmxvY2tUYWJsZTsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfYmxrX3RhYmxlX2xlbih2b2lkKQoreworCXJldHVybiBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTMyKTsKK30KKwordTggKmdldF93ZWFyX2xldmVsaW5nX3RhYmxlX3N0YXJ0X2FkZHIodm9pZCkKK3sKKwlyZXR1cm4gZ19wV2VhckNvdW50ZXI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3dlYXJfbGV2ZWxpbmdfdGFibGVfbGVuKHZvaWQpCit7CisJcmV0dXJuIERldmljZUluZm8ud0RhdGFCbG9ja051bSAqIHNpemVvZih1OCk7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX1JlYWRfQmxvY2tfVGFibGUKKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgUEFTUyAvIEZBSUwKKyogRGVzY3JpcHRpb246ICByZWFkIHRoZSBmbGFzaCBzcGFyZSBhcmVhIGFuZCBmaW5kIGEgYmxvY2sgY29udGFpbmluZyB0aGUKKyogICAgICAgICAgICAgICBtb3N0IHJlY2VudCBibG9jayB0YWJsZShoYXZpbmcgbGFyZ2VzdCBibG9ja190YWJsZV9jb3VudGVyKS4KKyogICAgICAgICAgICAgICBGaW5kIHRoZSBsYXN0IHdyaXR0ZW4gQmxvY2sgdGFibGUgaW4gdGhpcyBibG9jay4KKyogICAgICAgICAgICAgICBDaGVjayB0aGUgY29ycmVjdG5lc3Mgb2YgQmxvY2sgVGFibGUKKyogICAgICAgICAgICAgICBJZiBDRE1BIGlzIGVuYWJsZWQsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluCisqICAgICAgICAgICAgICAgcG9sbGluZyBtb2RlLgorKiAgICAgICAgICAgICAgIFdlIGRvbid0IG5lZWQgdG8gc3RvcmUgY2hhbmdlcyBpbiBCbG9jayB0YWJsZSBpbiB0aGlzCisqICAgICAgICAgICAgICAgZnVuY3Rpb24gYXMgaXQgaXMgY2FsbGVkIG9ubHkgYXQgaW5pdGlhbGl6YXRpb24KKyoKKyogICAgICAgICAgICAgICBOb3RlOiBDdXJyZW50bHkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgaW5pdGlhbGl6YXRpb24KKyogICAgICAgICAgICAgICBiZWZvcmUgYW55IHJlYWQvZXJhc2Uvd3JpdGUgY29tbWFuZCBpc3N1ZWQgdG8gZmxhc2ggc28sCisqICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGZvciBDRE1BIGxpc3QgdG8gY29tcGxldGUgYXMgb2Ygbm93CisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIGludCBGVExfUmVhZF9CbG9ja19UYWJsZSh2b2lkKQoreworCXUxNiBpID0gMDsKKwlpbnQgaywgajsKKwl1OCAqdGVtcEJ1ZiwgKnRhZ2FycmF5OworCWludCB3UmVzdWx0ID0gRkFJTDsKKwlpbnQgc3RhdHVzID0gRkFJTDsKKwl1OCBibG9ja190YWJsZV9mb3VuZCA9IDA7CisJaW50IHNlYXJjaF9yZXN1bHQ7CisJdTMyIEJsb2NrOworCXUxNiBQYWdlID0gMDsKKwl1MTYgUGFnZUNvdW50OworCXUxNiBidF9wYWdlczsKKwlpbnQgd0J5dGVzQ29waWVkID0gMCwgdGVtcHZhcjsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXRlbXBCdWYgPSB0bXBfYnVmMV9yZWFkX2Jsa190YWJsZTsKKwlidF9wYWdlcyA9IEZUTF9HZXRfQmxvY2tfVGFibGVfRmxhc2hfU2l6ZV9QYWdlcygpOworCisJZm9yIChqID0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2s7CisJCWogPD0gKGludClEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2s7CisJCQlqKyspIHsKKwkJc3RhdHVzID0gR0xPQl9MTERfUmVhZF9QYWdlX1NwYXJlKHRlbXBCdWYsIGosIDAsIDEpOworCQlrID0gMDsKKwkJaSA9IEZUTF9FeHRyYWN0X0Jsb2NrX1RhYmxlX1RhZyh0ZW1wQnVmLCAmdGFnYXJyYXkpOworCQlpZiAoaSkgeworCQkJc3RhdHVzICA9IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluX1BvbGxpbmcodGVtcEJ1ZiwKKwkJCQkJCQkJaiwgMCwgMSk7CisJCQlmb3IgKDsgayA8IGk7IGsrKykgeworCQkJCWlmICh0YWdhcnJheVtrXSA9PSB0ZW1wQnVmWzNdKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChrIDwgaSkKKwkJCWsgPSB0YWdhcnJheVtrXTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJIkJsb2NrIHRhYmxlIGlzIGNvbnRhaW5lZCBpbiBCbG9jayAlZCAlZFxuIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludClqLCAodW5zaWduZWQgaW50KWspOworCisJCWlmIChnX3BCVEJsb2Nrc1trLUZJUlNUX0JUX0lEXSA9PSBCVEJMT0NLX0lOVkFMKSB7CisJCQlnX3BCVEJsb2Nrc1trLUZJUlNUX0JUX0lEXSA9IGo7CisJCQlibG9ja190YWJsZV9mb3VuZCA9IDE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZUTF9SZWFkX0Jsb2NrX1RhYmxlIC0iCisJCQkJIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbnMuICIKKwkJCQkiVHdvIGJsb2NrIHRhYmxlIGhhdmUgc2FtZSBjb3VudGVyICV1IVxuIiwgayk7CisJCX0KKwl9CisKKwlpZiAoYmxvY2tfdGFibGVfZm91bmQpIHsKKwkJaWYgKGdfcEJUQmxvY2tzW0ZJUlNUX0JUX0lEIC0gRklSU1RfQlRfSURdICE9IEJUQkxPQ0tfSU5WQUwgJiYKKwkJZ19wQlRCbG9ja3NbTEFTVF9CVF9JRCAtIEZJUlNUX0JUX0lEXSAhPSBCVEJMT0NLX0lOVkFMKSB7CisJCQlqID0gTEFTVF9CVF9JRDsKKwkJCXdoaWxlICgoaiA+IEZJUlNUX0JUX0lEKSAmJgorCQkJKGdfcEJUQmxvY2tzW2ogLSBGSVJTVF9CVF9JRF0gIT0gQlRCTE9DS19JTlZBTCkpCisJCQkJai0tOworCQkJaWYgKGogPT0gRklSU1RfQlRfSUQpIHsKKwkJCQlqID0gTEFTVF9CVF9JRDsKKwkJCQlsYXN0X2VyYXNlZCA9IExBU1RfQlRfSUQ7CisJCQl9IGVsc2UgeworCQkJCWxhc3RfZXJhc2VkID0gKHU4KWogKyAxOworCQkJCXdoaWxlICgoaiA+IEZJUlNUX0JUX0lEKSAmJiAoQlRCTE9DS19JTlZBTCA9PQorCQkJCQlnX3BCVEJsb2Nrc1tqIC0gRklSU1RfQlRfSURdKSkKKwkJCQkJai0tOworCQkJfQorCQl9IGVsc2UgeworCQkJaiA9IEZJUlNUX0JUX0lEOworCQkJd2hpbGUgKGdfcEJUQmxvY2tzW2ogLSBGSVJTVF9CVF9JRF0gPT0gQlRCTE9DS19JTlZBTCkKKwkJCQlqKys7CisJCQlsYXN0X2VyYXNlZCA9ICh1OClqOworCQkJd2hpbGUgKChqIDwgTEFTVF9CVF9JRCkgJiYgKEJUQkxPQ0tfSU5WQUwgIT0KKwkJCQlnX3BCVEJsb2Nrc1tqIC0gRklSU1RfQlRfSURdKSkKKwkJCQlqKys7CisJCQlpZiAoZ19wQlRCbG9ja3Nbai1GSVJTVF9CVF9JRF0gPT0gQlRCTE9DS19JTlZBTCkKKwkJCQlqLS07CisJCX0KKworCQlpZiAobGFzdF9lcmFzZWQgPiBqKQorCQkJaiArPSAoMSArIExBU1RfQlRfSUQgLSBGSVJTVF9CVF9JRCk7CisKKwkJZm9yICg7IChqID49IGxhc3RfZXJhc2VkKSAmJiAoRkFJTCA9PSB3UmVzdWx0KTsgai0tKSB7CisJCQlpID0gKGogLSBGSVJTVF9CVF9JRCkgJQorCQkJCSgxICsgTEFTVF9CVF9JRCAtIEZJUlNUX0JUX0lEKTsKKwkJCXNlYXJjaF9yZXN1bHQgPQorCQkJRlRMX1NlYXJjaF9CbG9ja19UYWJsZV9JTl9CbG9jayhnX3BCVEJsb2Nrc1tpXSwKKwkJCQkJCWkgKyBGSVJTVF9CVF9JRCwgJlBhZ2UpOworCQkJaWYgKGdfY0Jsb2NrVGFibGVTdGF0dXMgPT0gSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEUpCisJCQkJYmxvY2tfdGFibGVfZm91bmQgPSAwOworCisJCQl3aGlsZSAoKHNlYXJjaF9yZXN1bHQgPT0gUEFTUykgJiYgKEZBSUwgPT0gd1Jlc3VsdCkpIHsKKwkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkJIkZUTF9SZWFkX0Jsb2NrX1RhYmxlOiIKKwkJCQkJIkJsb2NrOiAldSBQYWdlOiAldSAiCisJCQkJCSJjb250YWlucyBibG9jayB0YWJsZVxuIiwKKwkJCQkJKHVuc2lnbmVkIGludClnX3BCVEJsb2Nrc1tpXSwKKwkJCQkJKHVuc2lnbmVkIGludClQYWdlKTsKKworCQkJCXRlbXBCdWYgPSB0bXBfYnVmMl9yZWFkX2Jsa190YWJsZTsKKworCQkJCWZvciAoayA9IDA7IGsgPCBidF9wYWdlczsgaysrKSB7CisJCQkJCUJsb2NrID0gZ19wQlRCbG9ja3NbaV07CisJCQkJCVBhZ2VDb3VudCA9IDE7CisKKwkJCQkJc3RhdHVzICA9CisJCQkJCUdMT0JfTExEX1JlYWRfUGFnZV9NYWluX1BvbGxpbmcoCisJCQkJCXRlbXBCdWYsIEJsb2NrLCBQYWdlLCBQYWdlQ291bnQpOworCisJCQkJCXRlbXB2YXIgPSBrID8gMCA6IDQ7CisKKwkJCQkJd0J5dGVzQ29waWVkICs9CisJCQkJCUZUTF9Db3B5X0Jsb2NrX1RhYmxlX0Zyb21fRmxhc2goCisJCQkJCXRlbXBCdWYgKyB0ZW1wdmFyLAorCQkJCQlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgLSB0ZW1wdmFyLAorCQkJCQl3Qnl0ZXNDb3BpZWQpOworCisJCQkJCVBhZ2UrKzsKKwkJCQl9CisKKwkJCQl3UmVzdWx0ID0gRlRMX0NoZWNrX0Jsb2NrX1RhYmxlKEZBSUwpOworCQkJCWlmIChGQUlMID09IHdSZXN1bHQpIHsKKwkJCQkJYmxvY2tfdGFibGVfZm91bmQgPSAwOworCQkJCQlpZiAoUGFnZSA+IGJ0X3BhZ2VzKQorCQkJCQkJUGFnZSAtPSAoKGJ0X3BhZ2VzPDwxKSArIDEpOworCQkJCQllbHNlCisJCQkJCQlzZWFyY2hfcmVzdWx0ID0gRkFJTDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoUEFTUyA9PSB3UmVzdWx0KSB7CisJCWlmICghYmxvY2tfdGFibGVfZm91bmQpCisJCQlGVExfRXhlY3V0ZV9TUExfUmVjb3ZlcnkoKTsKKworCQlpZiAoZ19jQmxvY2tUYWJsZVN0YXR1cyA9PSBJTl9QUk9HUkVTU19CTE9DS19UQUJMRSkKKwkJCWdfd0Jsb2NrVGFibGVPZmZzZXQgPSAodTE2KVBhZ2UgKyAxOworCQllbHNlCisJCQlnX3dCbG9ja1RhYmxlT2Zmc2V0ID0gKHUxNilQYWdlIC0gYnRfcGFnZXM7CisKKwkJZ193QmxvY2tUYWJsZUluZGV4ID0gKHUzMilnX3BCVEJsb2Nrc1tpXTsKKworI2lmIENNRF9ETUEKKwkJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKQorCQkJbWVtY3B5KGdfcEJUU3RhcnRpbmdDb3B5LCBnX3BCbG9ja1RhYmxlLAorCQkJCURldmljZUluZm8ud0RhdGFCbG9ja051bSAqIHNpemVvZih1MzIpCisJCQkJKyBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTgpCisJCQkJKyBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTE2KSk7CisJCWVsc2UKKwkJCW1lbWNweShnX3BCVFN0YXJ0aW5nQ29weSwgZ19wQmxvY2tUYWJsZSwKKwkJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gKiBzaXplb2YodTMyKQorCQkJCSsgRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtICogc2l6ZW9mKHU4KSk7CisjZW5kaWYKKwl9CisKKwlpZiAoRkFJTCA9PSB3UmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgIll1bnBlbmcgLSAiCisJCSJDYW4gbm90IGZpbmQgdmFsaWQgc3BlY3RyYSBibG9jayB0YWJsZSFcbiIpOworCisjaWYgQVVUT19GT1JNQVRfRkxBU0gKKwlpZiAoRkFJTCA9PSB3UmVzdWx0KSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiZG9pbmcgYXV0by1mb3JtYXRcbiIpOworCQl3UmVzdWx0ID0gRlRMX0Zvcm1hdF9GbGFzaCgwKTsKKwl9CisjZW5kaWYKKworCXJldHVybiB3UmVzdWx0OworfQorCisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9GbGFzaF9FcnJvcl9IYW5kbGUKKyogSW5wdXRzOiAgICAgICBQb2ludGVyIHRvIGRhdGEKKyogICAgICAgICAgICAgICBQYWdlIGFkZHJlc3MKKyogICAgICAgICAgICAgICBCbG9jayBhZGRyZXNzCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTD0xCisqIERlc2NyaXB0aW9uOiAgSXQgaGFuZGxlcyBhbnkgZXJyb3Igb2NjdXJlZCBkdXJpbmcgU3BlY3RyYSBvcGVyYXRpb24KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgaW50IEZUTF9GbGFzaF9FcnJvcl9IYW5kbGUodTggKnBEYXRhLCB1NjQgb2xkX3BhZ2VfYWRkciwKKwkJCQl1NjQgYmxrX2FkZHIpCit7CisJdTMyIGk7CisJaW50IGo7CisJdTMyIHRtcF9ub2RlLCBibGtfbm9kZSA9IEJMS19GUk9NX0FERFIoYmxrX2FkZHIpOworCXU2NCBwaHlfYWRkcjsKKwlpbnQgd0VyYXNlID0gRkFJTDsKKwlpbnQgd1Jlc3VsdCA9IEZBSUw7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKEVSUiA9PSBHTE9CX0ZUTF9HYXJiYWdlX0NvbGxlY3Rpb24oKSkKKwkJcmV0dXJuIEVSUjsKKworCWRvIHsKKwkJZm9yIChpID0gRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrIC0KKwkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrOworCQkJCQlpID4gMDsgaS0tKSB7CisJCQlpZiAoSVNfU1BBUkVfQkxPQ0soaSkpIHsKKwkJCQl0bXBfbm9kZSA9ICh1MzIpKEJBRF9CTE9DSyB8CisJCQkJCXBidFtibGtfbm9kZV0pOworCQkJCXBidFtibGtfbm9kZV0gPSAodTMyKShwYnRbaV0gJgorCQkJCQkoflNQQVJFX0JMT0NLKSk7CisJCQkJcGJ0W2ldID0gdG1wX25vZGU7CisjaWYgQ01EX0RNQQorCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCQkgICAgKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEgKikKKwkJCQkgICAgZ19wQlREZWx0YV9GcmVlOworCQkJCWdfcEJURGVsdGFfRnJlZSArPQorCQkJCSAgICBzaXplb2Yoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSk7CisKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPQorCQkJCSAgICBmdGxfY21kX2NudDsKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPQorCQkJCSAgICBibGtfbm9kZTsKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPQorCQkJCSAgICBwYnRbYmxrX25vZGVdOworCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkJICAgIChzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopCisJCQkJICAgIGdfcEJURGVsdGFfRnJlZTsKKwkJCQlnX3BCVERlbHRhX0ZyZWUgKz0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkgICAgZnRsX2NtZF9jbnQ7CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPkJUX0luZGV4ID0gaTsKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPSBwYnRbaV07CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgwQzsKKyNlbmRpZgorCQkJCXdSZXN1bHQgPSBQQVNTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKEZBSUwgPT0gd1Jlc3VsdCkgeworCQkJaWYgKEZBSUwgPT0gR0xPQl9GVExfR2FyYmFnZV9Db2xsZWN0aW9uKCkpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEUgIT0gZ19jQmxvY2tUYWJsZVN0YXR1cykgeworCQkJZ19jQmxvY2tUYWJsZVN0YXR1cyA9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFOworCQkJRlRMX1dyaXRlX0lOX1Byb2dyZXNzX0Jsb2NrX1RhYmxlX1BhZ2UoKTsKKwkJfQorCisJCXBoeV9hZGRyID0gRlRMX0dldF9QaHlzaWNhbF9CbG9ja19BZGRyKGJsa19hZGRyKTsKKworCQlmb3IgKGogPSAwOyBqIDwgUkVUUllfVElNRVM7IGorKykgeworCQkJaWYgKFBBU1MgPT0gd0VyYXNlKSB7CisJCQkJaWYgKEZBSUwgPT0gR0xPQl9GVExfQmxvY2tfRXJhc2UocGh5X2FkZHIpKSB7CisJCQkJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFtibGtfbm9kZV0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoUEFTUyA9PSBGVExfQ2FjaGVfVXBkYXRlX0Jsb2NrKHBEYXRhLAorCQkJCQkJCSAgIG9sZF9wYWdlX2FkZHIsCisJCQkJCQkJICAgcGh5X2FkZHIpKSB7CisJCQkJd1Jlc3VsdCA9IFBBU1M7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXdSZXN1bHQgPSBGQUlMOworCQkJCXdFcmFzZSA9IFBBU1M7CisJCQl9CisJCX0KKwl9IHdoaWxlIChGQUlMID09IHdSZXN1bHQpOworCisJRlRMX1dyaXRlX0Jsb2NrX1RhYmxlKEZBSUwpOworCisJcmV0dXJuIHdSZXN1bHQ7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX0dldF9QYWdlX051bQorKiBJbnB1dHM6ICAgICAgIFNpemUgaW4gYnl0ZXMKKyogT3V0cHV0czogICAgICBTaXplIGluIHBhZ2VzCisqIERlc2NyaXB0aW9uOiAgSXQgY2FsY3VsYXRlcyB0aGUgcGFnZXMgcmVxdWlyZWQgZm9yIHRoZSBsZW5ndGggcGFzc2VkCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHUzMiBGVExfR2V0X1BhZ2VfTnVtKHU2NCBsZW5ndGgpCit7CisJcmV0dXJuICh1MzIpKChsZW5ndGggPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSArCisJCShHTE9CX3U2NF9SZW1haW5kZXIobGVuZ3RoICwgMSkgPiAwID8gMSA6IDApKTsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfR2V0X1BoeXNpY2FsX0Jsb2NrX0FkZHIKKyogSW5wdXRzOiAgICAgICBCbG9jayBBZGRyZXNzIChieXRlIGZvcm1hdCkKKyogT3V0cHV0czogICAgICBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBibG9jay4KKyogRGVzY3JpcHRpb246ICBJdCB0cmFuc2xhdGVzIExCQSB0byBQQkEgYnkgcmV0dXJuaW5nIGFkZHJlc3Mgc3RvcmVkCisqICAgICAgICAgICAgICAgYXQgdGhlIExCQSBsb2NhdGlvbiBpbiB0aGUgYmxvY2sgdGFibGUKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgdTY0IEZUTF9HZXRfUGh5c2ljYWxfQmxvY2tfQWRkcih1NjQgbG9naWNhbF9hZGRyKQoreworCXUzMiAqcGJ0OworCXU2NCBwaHlzaWNhbF9hZGRyOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXBoeXNpY2FsX2FkZHIgPSAodTY0KSBEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplICoKKwkJKHBidFtCTEtfRlJPTV9BRERSKGxvZ2ljYWxfYWRkcildICYgKH5CQURfQkxPQ0spKTsKKworCXJldHVybiBwaHlzaWNhbF9hZGRyOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfR2V0X0Jsb2NrX0luZGV4CisqIElucHV0czogICAgICAgUGh5c2ljYWwgQmxvY2sgbm8uCisqIE91dHB1dHM6ICAgICAgTG9naWNhbCBibG9jayBuby4gL0JBRF9CTE9DSworKiBEZXNjcmlwdGlvbjogIEl0IHJldHVybnMgdGhlIGxvZ2ljYWwgYmxvY2sgbm8uIGZvciB0aGUgUEJBIHBhc3NlZAorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHUzMiBGVExfR2V0X0Jsb2NrX0luZGV4KHUzMiB3QmxvY2tOdW0pCit7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKwl1MzIgaTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IERldmljZUluZm8ud0RhdGFCbG9ja051bTsgaSsrKQorCQlpZiAod0Jsb2NrTnVtID09IChwYnRbaV0gJiAofkJBRF9CTE9DSykpKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gQkFEX0JMT0NLOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX1dlYXJfTGV2ZWxpbmcKKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgUEFTUz0wCisqIERlc2NyaXB0aW9uOiAgVGhpcyBpcyBzdGF0aWMgd2VhciBsZXZlbGluZyAoZG9uZSBieSBleHBsaWNpdCBjYWxsKQorKiAgICAgICAgICAgICAgIGRvIGNvbXBsZXRlIHN0YXRpYyB3ZWFyIGxldmVsaW5nCisqICAgICAgICAgICAgICAgZG8gY29tcGxldGUgZ2FyYmFnZSBjb2xsZWN0aW9uCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworaW50IEdMT0JfRlRMX1dlYXJfTGV2ZWxpbmcodm9pZCkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlGVExfU3RhdGljX1dlYXJfTGV2ZWxpbmcoKTsKKwlHTE9CX0ZUTF9HYXJiYWdlX0NvbGxlY3Rpb24oKTsKKworCXJldHVybiBQQVNTOworfQorCitzdGF0aWMgdm9pZCBmaW5kX2xlYXN0X21vc3Rfd29ybih1OCAqY2hnLAorCXUzMiAqbGVhc3RfaWR4LCB1OCAqbGVhc3RfY250LAorCXUzMiAqbW9zdF9pZHgsIHU4ICptb3N0X2NudCkKK3sKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXUzMiBpZHg7CisJdTggY250OworCWludCBpOworCisJZm9yIChpID0gQkxPQ0tfVEFCTEVfSU5ERVggKyAxOyBpIDwgRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtOyBpKyspIHsKKwkJaWYgKElTX0JBRF9CTE9DSyhpKSB8fCBQQVNTID09IGNoZ1tpXSkKKwkJCWNvbnRpbnVlOworCisJCWlkeCA9ICh1MzIpICgofkJBRF9CTE9DSykgJiBwYnRbaV0pOworCQljbnQgPSBnX3BXZWFyQ291bnRlcltpZHggLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja107CisKKwkJaWYgKElTX1NQQVJFX0JMT0NLKGkpKSB7CisJCQlpZiAoY250ID4gKm1vc3RfY250KSB7CisJCQkJKm1vc3RfY250ID0gY250OworCQkJCSptb3N0X2lkeCA9IGlkeDsKKwkJCX0KKwkJfQorCisJCWlmIChJU19EQVRBX0JMT0NLKGkpKSB7CisJCQlpZiAoY250IDwgKmxlYXN0X2NudCkgeworCQkJCSpsZWFzdF9jbnQgPSBjbnQ7CisJCQkJKmxlYXN0X2lkeCA9IGlkeDsKKwkJCX0KKwkJfQorCisJCWlmIChQQVNTID09IGNoZ1sqbW9zdF9pZHhdIHx8IFBBU1MgPT0gY2hnWypsZWFzdF9pZHhdKSB7CisJCQlkZWJ1Z19ib3VuZGFyeV9lcnJvcigqbW9zdF9pZHgsCisJCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtLCAwKTsKKwkJCWRlYnVnX2JvdW5kYXJ5X2Vycm9yKCpsZWFzdF9pZHgsCisJCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1vdmVfYmxrc19mb3Jfd2Vhcl9sZXZlbGluZyh1OCAqY2hnLAorCXUzMiAqbGVhc3RfaWR4LCB1MzIgKnJlcF9ibGtfbnVtLCBpbnQgKnJlc3VsdCkKK3sKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXUzMiByZXBfYmxrOworCWludCBqLCByZXRfY3BfYmxrLCByZXRfZXJhc2U7CisJaW50IHJldCA9IFBBU1M7CisKKwljaGdbKmxlYXN0X2lkeF0gPSBQQVNTOworCWRlYnVnX2JvdW5kYXJ5X2Vycm9yKCpsZWFzdF9pZHgsIERldmljZUluZm8ud0RhdGFCbG9ja051bSwgMCk7CisKKwlyZXBfYmxrID0gRlRMX1JlcGxhY2VfTVdCbG9jaygpOworCWlmIChyZXBfYmxrICE9IEJBRF9CTE9DSykgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJNb3JlIHRoYW4gdHdvIHNwYXJlIGJsb2NrcyBleGlzdCBzbyBkbyBpdFxuIik7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiQmxvY2sgUmVwbGFjZWQgaXMgJWRcbiIsCisJCQkJcmVwX2Jsayk7CisKKwkJY2hnW3JlcF9ibGtdID0gUEFTUzsKKworCQlpZiAoSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEUgIT0gZ19jQmxvY2tUYWJsZVN0YXR1cykgeworCQkJZ19jQmxvY2tUYWJsZVN0YXR1cyA9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFOworCQkJRlRMX1dyaXRlX0lOX1Byb2dyZXNzX0Jsb2NrX1RhYmxlX1BhZ2UoKTsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBSRVRSWV9USU1FUzsgaisrKSB7CisJCQlyZXRfY3BfYmxrID0gRlRMX0NvcHlfQmxvY2soKHU2NCkoKmxlYXN0X2lkeCkgKgorCQkJCURldmljZUluZm8ud0Jsb2NrRGF0YVNpemUsCisJCQkJKHU2NClyZXBfYmxrICogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSk7CisJCQlpZiAoRkFJTCA9PSByZXRfY3BfYmxrKSB7CisJCQkJcmV0X2VyYXNlID0gR0xPQl9GVExfQmxvY2tfRXJhc2UoKHU2NClyZXBfYmxrCisJCQkJCSogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSk7CisJCQkJaWYgKEZBSUwgPT0gcmV0X2VyYXNlKQorCQkJCQlNQVJLX0JMT0NLX0FTX0JBRChwYnRbcmVwX2Jsa10pOworCQkJfSBlbHNlIHsKKwkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkJIkZUTF9Db3B5X0Jsb2NrID09IE9LXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChqIDwgUkVUUllfVElNRVMpIHsKKwkJCXUzMiB0bXA7CisJCQl1MzIgb2xkX2lkeCA9IEZUTF9HZXRfQmxvY2tfSW5kZXgoKmxlYXN0X2lkeCk7CisJCQl1MzIgcmVwX2lkeCA9IEZUTF9HZXRfQmxvY2tfSW5kZXgocmVwX2Jsayk7CisJCQl0bXAgPSAodTMyKShESVNDQVJEX0JMT0NLIHwgcGJ0W29sZF9pZHhdKTsKKwkJCXBidFtvbGRfaWR4XSA9ICh1MzIpKCh+U1BBUkVfQkxPQ0spICYKKwkJCQkJCQlwYnRbcmVwX2lkeF0pOworCQkJcGJ0W3JlcF9pZHhdID0gdG1wOworI2lmIENNRF9ETUEKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0gKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEgKikKKwkJCQkJCWdfcEJURGVsdGFfRnJlZTsKKwkJCWdfcEJURGVsdGFfRnJlZSArPSBzaXplb2Yoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSk7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPQorCQkJCQkJZnRsX2NtZF9jbnQ7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPSBvbGRfaWR4OworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPkJUX0VudHJ5X1ZhbHVlID0gcGJ0W29sZF9pZHhdOworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgwQzsKKworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEgPSAoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKQorCQkJCQkJZ19wQlREZWx0YV9GcmVlOworCQkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkJCWZ0bF9jbWRfY250OworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPkJUX0luZGV4ID0gcmVwX2lkeDsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9FbnRyeV9WYWx1ZSA9IHBidFtyZXBfaWR4XTsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXBidFtGVExfR2V0X0Jsb2NrX0luZGV4KHJlcF9ibGspXSB8PSBCQURfQkxPQ0s7CisjaWYgQ01EX0RNQQorCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEgPSAoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKQorCQkJCQkJZ19wQlREZWx0YV9GcmVlOworCQkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkJCWZ0bF9jbWRfY250OworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPkJUX0luZGV4ID0KKwkJCQkJRlRMX0dldF9CbG9ja19JbmRleChyZXBfYmxrKTsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9FbnRyeV9WYWx1ZSA9CisJCQkJCXBidFtGVExfR2V0X0Jsb2NrX0luZGV4KHJlcF9ibGspXTsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisjZW5kaWYKKwkJCSpyZXN1bHQgPSBGQUlMOworCQkJcmV0ID0gRkFJTDsKKwkJfQorCisJCWlmICgoKCpyZXBfYmxrX251bSkrKykgPiBXRUFSX0xFVkVMSU5HX0JMT0NLX05VTSkKKwkJCXJldCA9IEZBSUw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMZXNzIHRoYW4gMyBzcGFyZSBibG9ja3MgZXhpc3Qgc28gcXVpdFxuIik7CisJCXJldCA9IEZBSUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfU3RhdGljX1dlYXJfTGV2ZWxpbmcKKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTD0xCisqIERlc2NyaXB0aW9uOiAgVGhpcyBpcyBzdGF0aWMgd2VhciBsZXZlbGluZyAoZG9uZSBieSBleHBsaWNpdCBjYWxsKQorKiAgICAgICAgICAgICAgIHNlYXJjaCBmb3IgbW9zdCZsZWFzdCB1c2VkCisqICAgICAgICAgICAgICAgaWYgZGlmZmVyZW5jZSA8IEdBVEU6CisqICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0aGUgYmxvY2sgdGFibGUgd2l0aCBleGhhbmdlCisqICAgICAgICAgICAgICAgICAgIG1hcmsgYmxvY2sgdGFibGUgaW4gZmxhc2ggYXMgSU5fUFJPR1JFU1MKKyogICAgICAgICAgICAgICAgICAgY29weSBmbGFzaCBibG9jaworKiAgICAgICAgICAgICAgIHRoZSBjYWxsZXIgc2hvdWxkIGhhbmRsZSBHQyBjbGVhbiB1cCBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgRlRMX1N0YXRpY19XZWFyX0xldmVsaW5nKHZvaWQpCit7CisJdTggbW9zdF93b3JuX2NudDsKKwl1OCBsZWFzdF93b3JuX2NudDsKKwl1MzIgbW9zdF93b3JuX2lkeDsKKwl1MzIgbGVhc3Rfd29ybl9pZHg7CisJaW50IHJlc3VsdCA9IFBBU1M7CisJaW50IGdvX29uID0gUEFTUzsKKwl1MzIgcmVwbGFjZWRfYmxrcyA9IDA7CisJdTggKmNoYW5nX2ZsYWcgPSBmbGFnc19zdGF0aWNfd2Vhcl9sZXZlbGluZzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWNoYW5nX2ZsYWcpCisJCXJldHVybiBGQUlMOworCisJbWVtc2V0KGNoYW5nX2ZsYWcsIEZBSUwsIERldmljZUluZm8ud0RhdGFCbG9ja051bSk7CisJd2hpbGUgKGdvX29uID09IFBBU1MpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkic3RhcnRpbmcgc3RhdGljIHdlYXIgbGV2ZWxpbmdcbiIpOworCQltb3N0X3dvcm5fY250ID0gMDsKKwkJbGVhc3Rfd29ybl9jbnQgPSAweEZGOworCQlsZWFzdF93b3JuX2lkeCA9IEJMT0NLX1RBQkxFX0lOREVYOworCQltb3N0X3dvcm5faWR4ID0gQkxPQ0tfVEFCTEVfSU5ERVg7CisKKwkJZmluZF9sZWFzdF9tb3N0X3dvcm4oY2hhbmdfZmxhZywgJmxlYXN0X3dvcm5faWR4LAorCQkJJmxlYXN0X3dvcm5fY250LCAmbW9zdF93b3JuX2lkeCwgJm1vc3Rfd29ybl9jbnQpOworCisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIlVzZWQgYW5kIGxlYXN0IHdvcm4gaXMgYmxvY2sgJXUsIHdob3MgY291bnQgaXMgJXVcbiIsCisJCQkodW5zaWduZWQgaW50KWxlYXN0X3dvcm5faWR4LAorCQkJKHVuc2lnbmVkIGludClsZWFzdF93b3JuX2NudCk7CisKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiRnJlZSBhbmQgIG1vc3Qgd29ybiBpcyBibG9jayAldSwgd2hvcyBjb3VudCBpcyAldVxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpbW9zdF93b3JuX2lkeCwKKwkJCSh1bnNpZ25lZCBpbnQpbW9zdF93b3JuX2NudCk7CisKKwkJaWYgKChtb3N0X3dvcm5fY250ID4gbGVhc3Rfd29ybl9jbnQpICYmCisJCQkobW9zdF93b3JuX2NudCAtIGxlYXN0X3dvcm5fY250ID4gV0VBUl9MRVZFTElOR19HQVRFKSkKKwkJCWdvX29uID0gbW92ZV9ibGtzX2Zvcl93ZWFyX2xldmVsaW5nKGNoYW5nX2ZsYWcsCisJCQkJJmxlYXN0X3dvcm5faWR4LCAmcmVwbGFjZWRfYmxrcywgJnJlc3VsdCk7CisJCWVsc2UKKwkJCWdvX29uID0gRkFJTDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWYgQ01EX0RNQQorc3RhdGljIGludCBkb19nYXJiYWdlX2NvbGxlY3Rpb24odTMyIGRpc2NhcmRfY250KQoreworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJdTMyIHBiYTsKKwl1OCBidF9ibG9ja19lcmFzZWQgPSAwOworCWludCBpLCBjbnQsIHJldCA9IEZBSUw7CisJdTY0IGFkZHI7CisKKwlpID0gMDsKKwl3aGlsZSAoKGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0pICYmIChkaXNjYXJkX2NudCA+IDApICYmCisJCQkoKGZ0bF9jbWRfY250ICsgMjgpIDwgMjU2KSkgeworCQlpZiAoKChwYnRbaV0gJiBCQURfQkxPQ0spICE9IEJBRF9CTE9DSykgJiYKKwkJCQkocGJ0W2ldICYgRElTQ0FSRF9CTE9DSykpIHsKKwkJCWlmIChJTl9QUk9HUkVTU19CTE9DS19UQUJMRSAhPSBnX2NCbG9ja1RhYmxlU3RhdHVzKSB7CisJCQkJZ19jQmxvY2tUYWJsZVN0YXR1cyA9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFOworCQkJCUZUTF9Xcml0ZV9JTl9Qcm9ncmVzc19CbG9ja19UYWJsZV9QYWdlKCk7CisJCQl9CisKKwkJCWFkZHIgPSBGVExfR2V0X1BoeXNpY2FsX0Jsb2NrX0FkZHIoKHU2NClpICoKKwkJCQkJCURldmljZUluZm8ud0Jsb2NrRGF0YVNpemUpOworCQkJcGJhID0gQkxLX0ZST01fQUREUihhZGRyKTsKKworCQkJZm9yIChjbnQgPSBGSVJTVF9CVF9JRDsgY250IDw9IExBU1RfQlRfSUQ7IGNudCsrKSB7CisJCQkJaWYgKHBiYSA9PSBnX3BCVEJsb2Nrc1tjbnQgLSBGSVJTVF9CVF9JRF0pIHsKKwkJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJCQkiR0Mgd2lsbCBlcmFzZSBCVCBibG9jayAldVxuIiwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpcGJhKTsKKwkJCQkJZGlzY2FyZF9jbnQtLTsKKwkJCQkJaSsrOworCQkJCQlidF9ibG9ja19lcmFzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChidF9ibG9ja19lcmFzZWQpIHsKKwkJCQlidF9ibG9ja19lcmFzZWQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlhZGRyID0gRlRMX0dldF9QaHlzaWNhbF9CbG9ja19BZGRyKCh1NjQpaSAqCisJCQkJCQlEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplKTsKKworCQkJaWYgKFBBU1MgPT0gR0xPQl9GVExfQmxvY2tfRXJhc2UoYWRkcikpIHsKKwkJCQlwYnRbaV0gJj0gKHUzMikofkRJU0NBUkRfQkxPQ0spOworCQkJCXBidFtpXSB8PSAodTMyKShTUEFSRV9CTE9DSyk7CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEgPQorCQkJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKQorCQkJCQlnX3BCVERlbHRhX0ZyZWU7CisJCQkJZ19wQlREZWx0YV9GcmVlICs9CisJCQkJCXNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPQorCQkJCQlmdGxfY21kX2NudCAtIDE7CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPkJUX0luZGV4ID0gaTsKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPSBwYnRbaV07CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgwQzsKKwkJCQlkaXNjYXJkX2NudC0tOworCQkJCXJldCA9IFBBU1M7CisJCQl9IGVsc2UgeworCQkJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFtpXSk7CisJCQl9CisJCX0KKworCQlpKys7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbnQgZG9fZ2FyYmFnZV9jb2xsZWN0aW9uKHUzMiBkaXNjYXJkX2NudCkKK3sKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXUzMiBwYmE7CisJdTggYnRfYmxvY2tfZXJhc2VkID0gMDsKKwlpbnQgaSwgY250LCByZXQgPSBGQUlMOworCXU2NCBhZGRyOworCisJaSA9IDA7CisJd2hpbGUgKChpIDwgRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtKSAmJiAoZGlzY2FyZF9jbnQgPiAwKSkgeworCQlpZiAoKChwYnRbaV0gJiBCQURfQkxPQ0spICE9IEJBRF9CTE9DSykgJiYKKwkJCQkocGJ0W2ldICYgRElTQ0FSRF9CTE9DSykpIHsKKwkJCWlmIChJTl9QUk9HUkVTU19CTE9DS19UQUJMRSAhPSBnX2NCbG9ja1RhYmxlU3RhdHVzKSB7CisJCQkJZ19jQmxvY2tUYWJsZVN0YXR1cyA9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFOworCQkJCUZUTF9Xcml0ZV9JTl9Qcm9ncmVzc19CbG9ja19UYWJsZV9QYWdlKCk7CisJCQl9CisKKwkJCWFkZHIgPSBGVExfR2V0X1BoeXNpY2FsX0Jsb2NrX0FkZHIoKHU2NClpICoKKwkJCQkJCURldmljZUluZm8ud0Jsb2NrRGF0YVNpemUpOworCQkJcGJhID0gQkxLX0ZST01fQUREUihhZGRyKTsKKworCQkJZm9yIChjbnQgPSBGSVJTVF9CVF9JRDsgY250IDw9IExBU1RfQlRfSUQ7IGNudCsrKSB7CisJCQkJaWYgKHBiYSA9PSBnX3BCVEJsb2Nrc1tjbnQgLSBGSVJTVF9CVF9JRF0pIHsKKwkJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJCQkiR0Mgd2lsbCBlcmFzZSBCVCBibG9jayAlZFxuIiwKKwkJCQkJCXBiYSk7CisJCQkJCWRpc2NhcmRfY250LS07CisJCQkJCWkrKzsKKwkJCQkJYnRfYmxvY2tfZXJhc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoYnRfYmxvY2tfZXJhc2VkKSB7CisJCQkJYnRfYmxvY2tfZXJhc2VkID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogSWYgdGhlIGRpc2NhcmQgYmxvY2sgaXMgTDIgY2FjaGUgYmxvY2ssIHRoZW4ganVzdCBza2lwIGl0ICovCisJCQlmb3IgKGNudCA9IDA7IGNudCA8IEJMS19OVU1fRk9SX0wyX0NBQ0hFOyBjbnQrKykgeworCQkJCWlmIChjYWNoZV9sMi5ibGtfYXJyYXlbY250XSA9PSBwYmEpIHsKKwkJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJCQkiR0Mgd2lsbCBlcmFzZSBMMiBjYWNoZSBibGsgJWRcbiIsCisJCQkJCQlwYmEpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoY250IDwgQkxLX05VTV9GT1JfTDJfQ0FDSEUpIHsgLyogU2tpcCBpdCAqLworCQkJCWRpc2NhcmRfY250LS07CisJCQkJaSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlhZGRyID0gRlRMX0dldF9QaHlzaWNhbF9CbG9ja19BZGRyKCh1NjQpaSAqCisJCQkJCQlEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplKTsKKworCQkJaWYgKFBBU1MgPT0gR0xPQl9GVExfQmxvY2tfRXJhc2UoYWRkcikpIHsKKwkJCQlwYnRbaV0gJj0gKHUzMikofkRJU0NBUkRfQkxPQ0spOworCQkJCXBidFtpXSB8PSAodTMyKShTUEFSRV9CTE9DSyk7CisJCQkJZGlzY2FyZF9jbnQtLTsKKwkJCQlyZXQgPSBQQVNTOworCQkJfSBlbHNlIHsKKwkJCQlNQVJLX0JMT0NLX0FTX0JBRChwYnRbaV0pOworCQkJfQorCQl9CisKKwkJaSsrOworCX0KKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBHTE9CX0ZUTF9HYXJiYWdlX0NvbGxlY3Rpb24KKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgUEFTUyAvIEZBSUwgKHJldHVybnMgdGhlIG51bWJlciBvZiB1bi1lcmFzZWQgYmxvY2tzCisqIERlc2NyaXB0aW9uOiAgc2VhcmNoIHRoZSBibG9jayB0YWJsZSBmb3IgYWxsIGRpc2NhcmRlZCBibG9ja3MgdG8gZXJhc2UKKyogICAgICAgICAgICAgICBmb3IgZWFjaCBkaXNjYXJkZWQgYmxvY2s6CisqICAgICAgICAgICAgICAgICAgIHNldCB0aGUgZmxhc2ggYmxvY2sgdG8gSU5fUFJPR1JFU1MKKyogICAgICAgICAgICAgICAgICAgZXJhc2UgdGhlIGJsb2NrCisqICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0aGUgYmxvY2sgdGFibGUKKyogICAgICAgICAgICAgICAgICAgd3JpdGUgdGhlIGJsb2NrIHRhYmxlIHRvIGZsYXNoCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworaW50IEdMT0JfRlRMX0dhcmJhZ2VfQ29sbGVjdGlvbih2b2lkKQoreworCXUzMiBpOworCXUzMiB3RGlzY2FyZCA9IDA7CisJaW50IHdSZXN1bHQgPSBGQUlMOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChHQ19DYWxsZWQpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIkdMT0JfRlRMX0dhcmJhZ2VfQ29sbGVjdGlvbigpICIKKwkJCSJoYXMgYmVlbiByZS1lbnRlcmVkISBFeGl0LlxuIik7CisJCXJldHVybiBQQVNTOworCX0KKworCUdDX0NhbGxlZCA9IDE7CisKKwlHTE9CX0ZUTF9CVF9HYXJiYWdlX0NvbGxlY3Rpb24oKTsKKworCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07IGkrKykgeworCQlpZiAoSVNfRElTQ0FSREVEX0JMT0NLKGkpKQorCQkJd0Rpc2NhcmQrKzsKKwl9CisKKwlpZiAod0Rpc2NhcmQgPD0gMCkgeworCQlHQ19DYWxsZWQgPSAwOworCQlyZXR1cm4gd1Jlc3VsdDsKKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJIkZvdW5kICVkIGRpc2NhcmRlZCBibG9ja3NcbiIsIHdEaXNjYXJkKTsKKworCUZUTF9Xcml0ZV9CbG9ja19UYWJsZShGQUlMKTsKKworCXdSZXN1bHQgPSBkb19nYXJiYWdlX2NvbGxlY3Rpb24od0Rpc2NhcmQpOworCisJRlRMX1dyaXRlX0Jsb2NrX1RhYmxlKEZBSUwpOworCisJR0NfQ2FsbGVkID0gMDsKKworCXJldHVybiB3UmVzdWx0OworfQorCisKKyNpZiBDTURfRE1BCitzdGF0aWMgaW50IGRvX2J0X2dhcmJhZ2VfY29sbGVjdGlvbih2b2lkKQoreworCXUzMiBwYmEsIGxiYTsKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCXUzMiAqcEJUQmxvY2tzTm9kZSA9ICh1MzIgKilnX3BCVEJsb2NrczsKKwl1NjQgYWRkcjsKKwlpbnQgaSwgcmV0ID0gRkFJTDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCVF9HQ19DYWxsZWQpCisJCXJldHVybiBQQVNTOworCisJQlRfR0NfQ2FsbGVkID0gMTsKKworCWZvciAoaSA9IGxhc3RfZXJhc2VkOyAoaSA8PSBMQVNUX0JUX0lEKSAmJgorCQkoZ19wQlRCbG9ja3NbKChpICsgMikgJSAoMSArIExBU1RfQlRfSUQgLSBGSVJTVF9CVF9JRCkpICsKKwkJRklSU1RfQlRfSUQgLSBGSVJTVF9CVF9JRF0gIT0gQlRCTE9DS19JTlZBTCkgJiYKKwkJKChmdGxfY21kX2NudCArIDI4KSkgPCAyNTY7IGkrKykgeworCQlwYmEgPSBwQlRCbG9ja3NOb2RlW2kgLSBGSVJTVF9CVF9JRF07CisJCWxiYSA9IEZUTF9HZXRfQmxvY2tfSW5kZXgocGJhKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiZG9fYnRfZ2FyYmFnZV9jb2xsZWN0aW9uOiBwYmEgJWQsIGxiYSAlZFxuIiwKKwkJCXBiYSwgbGJhKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiQmxvY2sgVGFibGUgRW50cnk6ICVkIiwgcGJ0W2xiYV0pOworCisJCWlmICgoKHBidFtsYmFdICYgQkFEX0JMT0NLKSAhPSBCQURfQkxPQ0spICYmCisJCQkocGJ0W2xiYV0gJiBESVNDQVJEX0JMT0NLKSkgeworCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJImRvX2J0X2dhcmJhZ2VfY29sbGVjdGlvbl9jZG1hOiAiCisJCQkJIkVyYXNpbmcgQmxvY2sgdGFibGVzIHByZXNlbnQgaW4gYmxvY2sgJWRcbiIsCisJCQkJcGJhKTsKKwkJCWFkZHIgPSBGVExfR2V0X1BoeXNpY2FsX0Jsb2NrX0FkZHIoKHU2NClsYmEgKgorCQkJCQkJRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSk7CisJCQlpZiAoUEFTUyA9PSBHTE9CX0ZUTF9CbG9ja19FcmFzZShhZGRyKSkgeworCQkJCXBidFtsYmFdICY9ICh1MzIpKH5ESVNDQVJEX0JMT0NLKTsKKwkJCQlwYnRbbGJhXSB8PSAodTMyKShTUEFSRV9CTE9DSyk7CisKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopCisJCQkJCWdfcEJURGVsdGFfRnJlZTsKKwkJCQlnX3BCVERlbHRhX0ZyZWUgKz0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkJZnRsX2NtZF9jbnQgLSAxOworCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9JbmRleCA9IGxiYTsKKwkJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPQorCQkJCQkJCQlwYnRbbGJhXTsKKworCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisKKwkJCQlyZXQgPSBQQVNTOworCQkJCXBCVEJsb2Nrc05vZGVbbGFzdF9lcmFzZWQgLSBGSVJTVF9CVF9JRF0gPQorCQkJCQkJCUJUQkxPQ0tfSU5WQUw7CisJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJCSJyZXNldHRpbmcgYnQgZW50cnkgYXQgaW5kZXggJWQgIgorCQkJCQkidmFsdWUgJWRcbiIsIGksCisJCQkJCXBCVEJsb2Nrc05vZGVbaSAtIEZJUlNUX0JUX0lEXSk7CisJCQkJaWYgKGxhc3RfZXJhc2VkID09IExBU1RfQlRfSUQpCisJCQkJCWxhc3RfZXJhc2VkID0gRklSU1RfQlRfSUQ7CisJCQkJZWxzZQorCQkJCQlsYXN0X2VyYXNlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlNQVJLX0JMT0NLX0FTX0JBRChwYnRbbGJhXSk7CisJCQl9CisJCX0KKwl9CisKKwlCVF9HQ19DYWxsZWQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbnQgZG9fYnRfZ2FyYmFnZV9jb2xsZWN0aW9uKHZvaWQpCit7CisJdTMyIHBiYSwgbGJhOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJdTMyICpwQlRCbG9ja3NOb2RlID0gKHUzMiAqKWdfcEJUQmxvY2tzOworCXU2NCBhZGRyOworCWludCBpLCByZXQgPSBGQUlMOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKEJUX0dDX0NhbGxlZCkKKwkJcmV0dXJuIFBBU1M7CisKKwlCVF9HQ19DYWxsZWQgPSAxOworCisJZm9yIChpID0gbGFzdF9lcmFzZWQ7IChpIDw9IExBU1RfQlRfSUQpICYmCisJCShnX3BCVEJsb2Nrc1soKGkgKyAyKSAlICgxICsgTEFTVF9CVF9JRCAtIEZJUlNUX0JUX0lEKSkgKworCQlGSVJTVF9CVF9JRCAtIEZJUlNUX0JUX0lEXSAhPSBCVEJMT0NLX0lOVkFMKTsgaSsrKSB7CisJCXBiYSA9IHBCVEJsb2Nrc05vZGVbaSAtIEZJUlNUX0JUX0lEXTsKKwkJbGJhID0gRlRMX0dldF9CbG9ja19JbmRleChwYmEpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJkb19idF9nYXJiYWdlX2NvbGxlY3Rpb25fY2RtYTogcGJhICVkLCBsYmEgJWRcbiIsCisJCQlwYmEsIGxiYSk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIkJsb2NrIFRhYmxlIEVudHJ5OiAlZCIsIHBidFtsYmFdKTsKKworCQlpZiAoKChwYnRbbGJhXSAmIEJBRF9CTE9DSykgIT0gQkFEX0JMT0NLKSAmJgorCQkJKHBidFtsYmFdICYgRElTQ0FSRF9CTE9DSykpIHsKKwkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJCSJkb19idF9nYXJiYWdlX2NvbGxlY3Rpb246ICIKKwkJCQkiRXJhc2luZyBCbG9jayB0YWJsZXMgcHJlc2VudCBpbiBibG9jayAlZFxuIiwKKwkJCQlwYmEpOworCQkJYWRkciA9IEZUTF9HZXRfUGh5c2ljYWxfQmxvY2tfQWRkcigodTY0KWxiYSAqCisJCQkJCQlEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplKTsKKwkJCWlmIChQQVNTID09IEdMT0JfRlRMX0Jsb2NrX0VyYXNlKGFkZHIpKSB7CisJCQkJcGJ0W2xiYV0gJj0gKHUzMikofkRJU0NBUkRfQkxPQ0spOworCQkJCXBidFtsYmFdIHw9ICh1MzIpKFNQQVJFX0JMT0NLKTsKKwkJCQlyZXQgPSBQQVNTOworCQkJCXBCVEJsb2Nrc05vZGVbbGFzdF9lcmFzZWQgLSBGSVJTVF9CVF9JRF0gPQorCQkJCQkJCUJUQkxPQ0tfSU5WQUw7CisJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJCSJyZXNldHRpbmcgYnQgZW50cnkgYXQgaW5kZXggJWQgIgorCQkJCQkidmFsdWUgJWRcbiIsIGksCisJCQkJCXBCVEJsb2Nrc05vZGVbaSAtIEZJUlNUX0JUX0lEXSk7CisJCQkJaWYgKGxhc3RfZXJhc2VkID09IExBU1RfQlRfSUQpCisJCQkJCWxhc3RfZXJhc2VkID0gRklSU1RfQlRfSUQ7CisJCQkJZWxzZQorCQkJCQlsYXN0X2VyYXNlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlNQVJLX0JMT0NLX0FTX0JBRChwYnRbbGJhXSk7CisJCQl9CisJCX0KKwl9CisKKwlCVF9HQ19DYWxsZWQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX0JUX0dhcmJhZ2VfQ29sbGVjdGlvbgorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTIC8gRkFJTCAocmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuLWVyYXNlZCBibG9ja3MKKyogRGVzY3JpcHRpb246ICBFcmFzZXMgZGlzY2FyZGVkIGJsb2NrcyBjb250YWluaW5nIEJsb2NrIHRhYmxlCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9GVExfQlRfR2FyYmFnZV9Db2xsZWN0aW9uKHZvaWQpCit7CisJcmV0dXJuIGRvX2J0X2dhcmJhZ2VfY29sbGVjdGlvbigpOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9SZXBsYWNlX09uZUJsb2NrCisqIElucHV0czogICAgICAgQmxvY2sgbnVtYmVyIDEKKyogICAgICAgICAgICAgICBCbG9jayBudW1iZXIgMgorKiBPdXRwdXRzOiAgICAgIFJlcGxhY2VkIEJsb2NrIE51bWJlcgorKiBEZXNjcmlwdGlvbjogIEludGVyY2hhbmdlIGJsb2NrIHRhYmxlIGVudHJpZXMgYXQgd0Jsb2NrTnVtIGFuZCB3UmVwbGFjZU51bQorKgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHUzMiBGVExfUmVwbGFjZV9PbmVCbG9jayh1MzIgYmxrLCB1MzIgcmVwX2JsaykKK3sKKwl1MzIgdG1wX2JsazsKKwl1MzIgcmVwbGFjZV9ub2RlID0gQkFEX0JMT0NLOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKHJlcF9ibGsgIT0gQkFEX0JMT0NLKSB7CisJCWlmIChJU19CQURfQkxPQ0soYmxrKSkKKwkJCXRtcF9ibGsgPSBwYnRbYmxrXTsKKwkJZWxzZQorCQkJdG1wX2JsayA9IERJU0NBUkRfQkxPQ0sgfCAoflNQQVJFX0JMT0NLICYgcGJ0W2Jsa10pOworCisJCXJlcGxhY2Vfbm9kZSA9ICh1MzIpICgoflNQQVJFX0JMT0NLKSAmIHBidFtyZXBfYmxrXSk7CisJCXBidFtibGtdID0gcmVwbGFjZV9ub2RlOworCQlwYnRbcmVwX2Jsa10gPSB0bXBfYmxrOworCisjaWYgQ01EX0RNQQorCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPSBmdGxfY21kX2NudDsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPkJUX0luZGV4ID0gYmxrOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPSBwYnRbYmxrXTsKKworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweDBDOworCisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YV9GcmVlOworCQlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudCA9IGZ0bF9jbWRfY250OworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPSByZXBfYmxrOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPSBwYnRbcmVwX2Jsa107CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gcmVwbGFjZV9ub2RlOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9Xcml0ZV9CbG9ja19UYWJsZV9EYXRhCisqIElucHV0czogICAgICAgQmxvY2sgdGFibGUgc2l6ZSBpbiBwYWdlcworKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAvIEZBSUw9MQorKiBEZXNjcmlwdGlvbjogIFdyaXRlIGJsb2NrIHRhYmxlIGRhdGEgaW4gZmxhc2gKKyogICAgICAgICAgICAgICBJZiBmaXJzdCBwYWdlIGFuZCBsYXN0IHBhZ2UKKyogICAgICAgICAgICAgICAgICBXcml0ZSBkYXRhK0JUIGZsYWcKKyogICAgICAgICAgICAgICBlbHNlCisqICAgICAgICAgICAgICAgICAgV3JpdGUgZGF0YQorKiAgICAgICAgICAgICAgIEJUIGZsYWcgaXMgYSBjb3VudGVyLiBJdHMgdmFsdWUgaXMgaW5jcmVtZW50ZWQgZm9yIGJsb2NrIHRhYmxlCisqICAgICAgICAgICAgICAgd3JpdGUgaW4gYSBuZXcgQmxvY2sKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3N0YXRpYyBpbnQgRlRMX1dyaXRlX0Jsb2NrX1RhYmxlX0RhdGEodm9pZCkKK3sKKwl1NjQgZHdCbG9ja1RhYmxlQWRkciwgcFRlbXBBZGRyOworCXUzMiBCbG9jazsKKwl1MTYgUGFnZSwgUGFnZUNvdW50OworCXU4ICp0ZW1wQnVmID0gdG1wX2J1Zl93cml0ZV9ibGtfdGFibGVfZGF0YTsKKwlpbnQgd0J5dGVzQ29waWVkOworCXUxNiBidF9wYWdlczsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWR3QmxvY2tUYWJsZUFkZHIgPQorCQkodTY0KSgodTY0KWdfd0Jsb2NrVGFibGVJbmRleCAqIERldmljZUluZm8ud0Jsb2NrRGF0YVNpemUgKworCQkodTY0KWdfd0Jsb2NrVGFibGVPZmZzZXQgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCXBUZW1wQWRkciA9IGR3QmxvY2tUYWJsZUFkZHI7CisKKwlidF9wYWdlcyA9IEZUTF9HZXRfQmxvY2tfVGFibGVfRmxhc2hfU2l6ZV9QYWdlcygpOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJGVExfV3JpdGVfQmxvY2tfVGFibGVfRGF0YTogIgorCQkJICAgICAgICJwYWdlPSAlZCBCbG9ja1RhYmxlSW5kZXg9ICVkICIKKwkJCSAgICAgICAiQmxvY2tUYWJsZU9mZnNldD0lZFxuIiwgYnRfcGFnZXMsCisJCQkgICAgICAgZ193QmxvY2tUYWJsZUluZGV4LCBnX3dCbG9ja1RhYmxlT2Zmc2V0KTsKKworCUJsb2NrID0gQkxLX0ZST01fQUREUihwVGVtcEFkZHIpOworCVBhZ2UgPSBQQUdFX0ZST01fQUREUihwVGVtcEFkZHIsIEJsb2NrKTsKKwlQYWdlQ291bnQgPSAxOworCisJaWYgKGJ0X2Jsb2NrX2NoYW5nZWQpIHsKKwkJaWYgKGJ0X2ZsYWcgPT0gTEFTVF9CVF9JRCkgeworCQkJYnRfZmxhZyA9IEZJUlNUX0JUX0lEOworCQkJZ19wQlRCbG9ja3NbYnRfZmxhZyAtIEZJUlNUX0JUX0lEXSA9IEJsb2NrOworCQl9IGVsc2UgaWYgKGJ0X2ZsYWcgPCBMQVNUX0JUX0lEKSB7CisJCQlidF9mbGFnKys7CisJCQlnX3BCVEJsb2Nrc1tidF9mbGFnIC0gRklSU1RfQlRfSURdID0gQmxvY2s7CisJCX0KKworCQlpZiAoKGJ0X2ZsYWcgPiAoTEFTVF9CVF9JRC00KSkgJiYKKwkJCWdfcEJUQmxvY2tzW0ZJUlNUX0JUX0lEIC0gRklSU1RfQlRfSURdICE9CisJCQkJCQlCVEJMT0NLX0lOVkFMKSB7CisJCQlidF9ibG9ja19jaGFuZ2VkID0gMDsKKwkJCUdMT0JfRlRMX0JUX0dhcmJhZ2VfQ29sbGVjdGlvbigpOworCQl9CisKKwkJYnRfYmxvY2tfY2hhbmdlZCA9IDA7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIkJsb2NrIFRhYmxlIENvdW50ZXIgaXMgJXUgQmxvY2sgJXVcbiIsCisJCQlidF9mbGFnLCAodW5zaWduZWQgaW50KUJsb2NrKTsKKwl9CisKKwltZW1zZXQodGVtcEJ1ZiwgMCwgMyk7CisJdGVtcEJ1ZlszXSA9IGJ0X2ZsYWc7CisJd0J5dGVzQ29waWVkID0gRlRMX0NvcHlfQmxvY2tfVGFibGVfVG9fRmxhc2godGVtcEJ1ZiArIDQsCisJCQlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgLSA0LCAwKTsKKwltZW1zZXQoJnRlbXBCdWZbd0J5dGVzQ29waWVkICsgNF0sIDB4ZmYsCisJCURldmljZUluZm8ud1BhZ2VTaXplIC0gKHdCeXRlc0NvcGllZCArIDQpKTsKKwlGVExfSW5zZXJ0X0Jsb2NrX1RhYmxlX1NpZ25hdHVyZSgmdGVtcEJ1ZltEZXZpY2VJbmZvLndQYWdlRGF0YVNpemVdLAorCQkJCQlidF9mbGFnKTsKKworI2lmIENNRF9ETUEKKwltZW1jcHkoZ19wTmV4dEJsb2NrVGFibGUsIHRlbXBCdWYsCisJCURldmljZUluZm8ud1BhZ2VTaXplICogc2l6ZW9mKHU4KSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJXcml0aW5nIEZpcnN0IFBhZ2Ugb2YgQmxvY2sgVGFibGUgIgorCQkiQmxvY2sgJXUgUGFnZSAldVxuIiwgKHVuc2lnbmVkIGludClCbG9jaywgUGFnZSk7CisJaWYgKEZBSUwgPT0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX1NwYXJlX2NkbWEoZ19wTmV4dEJsb2NrVGFibGUsCisJCUJsb2NrLCBQYWdlLCAxLAorCQlMTERfQ01EX0ZMQUdfTU9ERV9DRE1BIHwgTExEX0NNRF9GTEFHX09SREVSX0JFRk9SRV9SRVNUKSkgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiTkFORCBQcm9ncmFtIGZhaWwgaW4gIgorCQkJIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXMsICIKKwkJCSJuZXcgQmFkIEJsb2NrICVkIGdlbmVyYXRlZCFcbiIsCisJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCBCbG9jayk7CisJCWdvdG8gZnVuY19yZXR1cm47CisJfQorCisJZnRsX2NtZF9jbnQrKzsKKwlnX3BOZXh0QmxvY2tUYWJsZSArPSAoKERldmljZUluZm8ud1BhZ2VTaXplICogc2l6ZW9mKHU4KSkpOworI2Vsc2UKKwlpZiAoRkFJTCA9PSBHTE9CX0xMRF9Xcml0ZV9QYWdlX01haW5fU3BhcmUodGVtcEJ1ZiwgQmxvY2ssIFBhZ2UsIDEpKSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkiTkFORCBQcm9ncmFtIGZhaWwgaW4gJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlcywgIgorCQkJIm5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkIVxuIiwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sIEJsb2NrKTsKKwkJZ290byBmdW5jX3JldHVybjsKKwl9CisjZW5kaWYKKworCWlmIChidF9wYWdlcyA+IDEpIHsKKwkJUGFnZUNvdW50ID0gYnRfcGFnZXMgLSAxOworCQlpZiAoUGFnZUNvdW50ID4gMSkgeworCQkJd0J5dGVzQ29waWVkICs9IEZUTF9Db3B5X0Jsb2NrX1RhYmxlX1RvX0ZsYXNoKHRlbXBCdWYsCisJCQkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplICogKFBhZ2VDb3VudCAtIDEpLAorCQkJCXdCeXRlc0NvcGllZCk7CisKKyNpZiBDTURfRE1BCisJCQltZW1jcHkoZ19wTmV4dEJsb2NrVGFibGUsIHRlbXBCdWYsCisJCQkJKFBhZ2VDb3VudCAtIDEpICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplKTsKKwkJCWlmIChGQUlMID09IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbl9jZG1hKAorCQkJCWdfcE5leHRCbG9ja1RhYmxlLCBCbG9jaywgUGFnZSArIDEsCisJCQkJUGFnZUNvdW50IC0gMSkpIHsKKwkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJCQkiTkFORCBQcm9ncmFtIGZhaWwgaW4gJXMsIExpbmUgJWQsICIKKwkJCQkJIkZ1bmN0aW9uOiAlcywgIgorCQkJCQkibmV3IEJhZCBCbG9jayAlZCBnZW5lcmF0ZWQhXG4iLAorCQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLAorCQkJCQkoaW50KUJsb2NrKTsKKwkJCQlnb3RvIGZ1bmNfcmV0dXJuOworCQkJfQorCisJCQlmdGxfY21kX2NudCsrOworCQkJZ19wTmV4dEJsb2NrVGFibGUgKz0gKFBhZ2VDb3VudCAtIDEpICoKKwkJCQlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgKiBzaXplb2YodTgpOworI2Vsc2UKKwkJCWlmIChGQUlMID09IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbih0ZW1wQnVmLAorCQkJCQlCbG9jaywgUGFnZSArIDEsIFBhZ2VDb3VudCAtIDEpKSB7CisJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkJIk5BTkQgUHJvZ3JhbSBmYWlsIGluICVzLCBMaW5lICVkLCAiCisJCQkJCSJGdW5jdGlvbjogJXMsICIKKwkJCQkJIm5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkIVxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywKKwkJCQkJKGludClCbG9jayk7CisJCQkJZ290byBmdW5jX3JldHVybjsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJd0J5dGVzQ29waWVkID0gRlRMX0NvcHlfQmxvY2tfVGFibGVfVG9fRmxhc2godGVtcEJ1ZiwKKwkJCQlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUsIHdCeXRlc0NvcGllZCk7CisJCW1lbXNldCgmdGVtcEJ1Zlt3Qnl0ZXNDb3BpZWRdLCAweGZmLAorCQkJRGV2aWNlSW5mby53UGFnZVNpemUtd0J5dGVzQ29waWVkKTsKKwkJRlRMX0luc2VydF9CbG9ja19UYWJsZV9TaWduYXR1cmUoCisJCQkmdGVtcEJ1ZltEZXZpY2VJbmZvLndQYWdlRGF0YVNpemVdLCBidF9mbGFnKTsKKyNpZiBDTURfRE1BCisJCW1lbWNweShnX3BOZXh0QmxvY2tUYWJsZSwgdGVtcEJ1ZiwKKwkJCQlEZXZpY2VJbmZvLndQYWdlU2l6ZSAqIHNpemVvZih1OCkpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJXcml0aW5nIHRoZSBsYXN0IFBhZ2Ugb2YgQmxvY2sgVGFibGUgIgorCQkJIkJsb2NrICV1IFBhZ2UgJXVcbiIsCisJCQkodW5zaWduZWQgaW50KUJsb2NrLCBQYWdlICsgYnRfcGFnZXMgLSAxKTsKKwkJaWYgKEZBSUwgPT0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX1NwYXJlX2NkbWEoCisJCQlnX3BOZXh0QmxvY2tUYWJsZSwgQmxvY2ssIFBhZ2UgKyBidF9wYWdlcyAtIDEsIDEsCisJCQlMTERfQ01EX0ZMQUdfTU9ERV9DRE1BIHwKKwkJCUxMRF9DTURfRkxBR19PUkRFUl9CRUZPUkVfUkVTVCkpIHsKKwkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkJIk5BTkQgUHJvZ3JhbSBmYWlsIGluICVzLCBMaW5lICVkLCAiCisJCQkJIkZ1bmN0aW9uOiAlcywgbmV3IEJhZCBCbG9jayAlZCBnZW5lcmF0ZWQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sIEJsb2NrKTsKKwkJCWdvdG8gZnVuY19yZXR1cm47CisJCX0KKwkJZnRsX2NtZF9jbnQrKzsKKyNlbHNlCisJCWlmIChGQUlMID09IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh0ZW1wQnVmLAorCQkJCQlCbG9jaywgUGFnZStidF9wYWdlcyAtIDEsIDEpKSB7CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJCSJOQU5EIFByb2dyYW0gZmFpbCBpbiAlcywgTGluZSAlZCwgIgorCQkJCSJGdW5jdGlvbjogJXMsICIKKwkJCQkibmV3IEJhZCBCbG9jayAlZCBnZW5lcmF0ZWQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sIEJsb2NrKTsKKwkJCWdvdG8gZnVuY19yZXR1cm47CisJCX0KKyNlbmRpZgorCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiRlRMX1dyaXRlX0Jsb2NrX1RhYmxlX0RhdGE6IGRvbmVcbiIpOworCitmdW5jX3JldHVybjoKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfUmVwbGFjZV9CbG9ja19UYWJsZQorKiBJbnB1dHM6ICAgICAgIE5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBHZXQgYSBuZXcgYmxvY2sgdG8gd3JpdGUgYmxvY2sgdGFibGUKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgdTMyIEZUTF9SZXBsYWNlX0Jsb2NrX1RhYmxlKHZvaWQpCit7CisJdTMyIGJsazsKKwlpbnQgZ2M7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJYmxrID0gRlRMX1JlcGxhY2VfTFdCbG9jayhCTE9DS19UQUJMRV9JTkRFWCwgJmdjKTsKKworCWlmICgoQkFEX0JMT0NLID09IGJsaykgJiYgKFBBU1MgPT0gZ2MpKSB7CisJCUdMT0JfRlRMX0dhcmJhZ2VfQ29sbGVjdGlvbigpOworCQlibGsgPSBGVExfUmVwbGFjZV9MV0Jsb2NrKEJMT0NLX1RBQkxFX0lOREVYLCAmZ2MpOworCX0KKwlpZiAoQkFEX0JMT0NLID09IGJsaykKKwkJcHJpbnRrKEtFUk5fRVJSICIlcywgJXM6IFRoZXJlIGlzIG5vIHNwYXJlIGJsb2NrLiAiCisJCQkiSXQgc2hvdWxkIG5ldmVyIGhhcHBlblxuIiwKKwkJCV9fRklMRV9fLCBfX2Z1bmNfXyk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIk5ldyBCbG9jayB0YWJsZSBCbG9jayBpcyAlZFxuIiwgYmxrKTsKKworCXJldHVybiBibGs7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgRlRMX1JlcGxhY2VfTFdCbG9jaworKiBJbnB1dHM6ICAgICAgIEJsb2NrIG51bWJlcgorKiAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gR2FyYmFnZSBDb2xsZWN0IGZsYWcKKyogT3V0cHV0czoKKyogRGVzY3JpcHRpb246ICBEZXRlcm1pbmUgdGhlIGxlYXN0IHdlYXJlZCBibG9jayBieSB0cmF2ZXJzaW5nCisqICAgICAgICAgICAgICAgYmxvY2sgdGFibGUKKyogICAgICAgICAgICAgICBTZXQgR2FyYmFnZSBjb2xsZWN0aW9uIHRvIGJlIGNhbGxlZCBpZiBudW1iZXIgb2Ygc3BhcmUKKyogICAgICAgICAgICAgICBibG9jayBpcyBsZXNzIHRoYW4gRnJlZSBCbG9jayBHYXRlIGNvdW50CisqICAgICAgICAgICAgICAgQ2hhbmdlIEJsb2NrIHRhYmxlIGVudHJ5IHRvIG1hcCBsZWFzdCB3b3JuIGJsb2NrIGZvciBjdXJyZW50CisqICAgICAgICAgICAgICAgb3BlcmF0aW9uCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHUzMiBGVExfUmVwbGFjZV9MV0Jsb2NrKHUzMiB3QmxvY2tOdW0sIGludCAqcEdhcmJhZ2VDb2xsZWN0KQoreworCXUzMiBpOworCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJdTggd0xlYXN0V29ybkNvdW50ZXIgPSAweEZGOworCXUzMiB3TGVhc3RXb3JuSW5kZXggPSBCQURfQkxPQ0s7CisJdTMyIHdTcGFyZUJsb2NrTnVtID0gMDsKKwl1MzIgd0Rpc2NhcmRCbG9ja051bSA9IDA7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKElTX1NQQVJFX0JMT0NLKHdCbG9ja051bSkpIHsKKwkJKnBHYXJiYWdlQ29sbGVjdCA9IEZBSUw7CisJCXBidFt3QmxvY2tOdW1dID0gKHUzMikocGJ0W3dCbG9ja051bV0gJiAoflNQQVJFX0JMT0NLKSk7CisjaWYgQ01EX0RNQQorCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkJCWZ0bF9jbWRfY250OworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPSAodTMyKSh3QmxvY2tOdW0pOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPSBwYnRbd0Jsb2NrTnVtXTsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgwQzsKKyNlbmRpZgorCQlyZXR1cm4gcGJ0W3dCbG9ja051bV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IERldmljZUluZm8ud0RhdGFCbG9ja051bTsgaSsrKSB7CisJCWlmIChJU19ESVNDQVJERURfQkxPQ0soaSkpCisJCQl3RGlzY2FyZEJsb2NrTnVtKys7CisKKwkJaWYgKElTX1NQQVJFX0JMT0NLKGkpKSB7CisJCQl1MzIgd1BoeXNpY2FsSW5kZXggPSAodTMyKSgofkJBRF9CTE9DSykgJiBwYnRbaV0pOworCQkJaWYgKHdQaHlzaWNhbEluZGV4ID4gRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrKQorCQkJCXByaW50ayhLRVJOX0VSUiAiRlRMX1JlcGxhY2VfTFdCbG9jazogIgorCQkJCQkiVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIhXG4iKTsKKwkJCWlmIChnX3BXZWFyQ291bnRlclt3UGh5c2ljYWxJbmRleCAtCisJCQkJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdIDwKKwkJCQl3TGVhc3RXb3JuQ291bnRlcikgeworCQkJCXdMZWFzdFdvcm5Db3VudGVyID0KKwkJCQkJZ19wV2VhckNvdW50ZXJbd1BoeXNpY2FsSW5kZXggLQorCQkJCQlEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja107CisJCQkJd0xlYXN0V29ybkluZGV4ID0gaTsKKwkJCX0KKwkJCXdTcGFyZUJsb2NrTnVtKys7CisJCX0KKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkiRlRMX1JlcGxhY2VfTFdCbG9jazogTGVhc3QgV29ybiBDb3VudGVyICVkXG4iLAorCQkoaW50KXdMZWFzdFdvcm5Db3VudGVyKTsKKworCWlmICgod0Rpc2NhcmRCbG9ja051bSA+PSBOVU1fRlJFRV9CTE9DS1NfR0FURSkgfHwKKwkJKHdTcGFyZUJsb2NrTnVtIDw9IE5VTV9GUkVFX0JMT0NLU19HQVRFKSkKKwkJKnBHYXJiYWdlQ29sbGVjdCA9IFBBU1M7CisJZWxzZQorCQkqcEdhcmJhZ2VDb2xsZWN0ID0gRkFJTDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkiRlRMX1JlcGxhY2VfTFdCbG9jazogRGlzY2FyZGVkIEJsb2NrcyAldSBTcGFyZSIKKwkJIiBCbG9ja3MgJXVcbiIsCisJCSh1bnNpZ25lZCBpbnQpd0Rpc2NhcmRCbG9ja051bSwKKwkJKHVuc2lnbmVkIGludCl3U3BhcmVCbG9ja051bSk7CisKKwlyZXR1cm4gRlRMX1JlcGxhY2VfT25lQmxvY2sod0Jsb2NrTnVtLCB3TGVhc3RXb3JuSW5kZXgpOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9SZXBsYWNlX01XQmxvY2sKKyogSW5wdXRzOiAgICAgICBOb25lCisqIE91dHB1dHM6ICAgICAgbW9zdCB3b3JuIHNwYXJlIGJsb2NrIG5vLi9CQURfQkxPQ0sKKyogRGVzY3JpcHRpb246ICBJdCBmaW5kcyBtb3N0IHdvcm4gc3BhcmUgYmxvY2suCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworc3RhdGljIHUzMiBGVExfUmVwbGFjZV9NV0Jsb2NrKHZvaWQpCit7CisJdTMyIGk7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKwl1OCB3TW9zdFdvcm5Db3VudGVyID0gMDsKKwl1MzIgd01vc3RXb3JuSW5kZXggPSBCQURfQkxPQ0s7CisJdTMyIHdTcGFyZUJsb2NrTnVtID0gMDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IERldmljZUluZm8ud0RhdGFCbG9ja051bTsgaSsrKSB7CisJCWlmIChJU19TUEFSRV9CTE9DSyhpKSkgeworCQkJdTMyIHdQaHlzaWNhbEluZGV4ID0gKHUzMikoKH5TUEFSRV9CTE9DSykgJiBwYnRbaV0pOworCQkJaWYgKGdfcFdlYXJDb3VudGVyW3dQaHlzaWNhbEluZGV4IC0KKwkJCSAgICBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja10gPgorCQkJICAgIHdNb3N0V29ybkNvdW50ZXIpIHsKKwkJCQl3TW9zdFdvcm5Db3VudGVyID0KKwkJCQkgICAgZ19wV2VhckNvdW50ZXJbd1BoeXNpY2FsSW5kZXggLQorCQkJCSAgICBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja107CisJCQkJd01vc3RXb3JuSW5kZXggPSB3UGh5c2ljYWxJbmRleDsKKwkJCX0KKwkJCXdTcGFyZUJsb2NrTnVtKys7CisJCX0KKwl9CisKKwlpZiAod1NwYXJlQmxvY2tOdW0gPD0gMikKKwkJcmV0dXJuIEJBRF9CTE9DSzsKKworCXJldHVybiB3TW9zdFdvcm5JbmRleDsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBGVExfUmVwbGFjZV9CbG9jaworKiBJbnB1dHM6ICAgICAgIEJsb2NrIEFkZHJlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBJZiBibG9jayBzcGVjaWZpZWQgYnkgYmxrX2FkZHIgcGFyYW1ldGVyIGlzIG5vdCBmcmVlLAorKiAgICAgICAgICAgICAgIHJlcGxhY2UgaXQgd2l0aCB0aGUgbGVhc3Qgd29ybiBibG9jay4KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgaW50IEZUTF9SZXBsYWNlX0Jsb2NrKHU2NCBibGtfYWRkcikKK3sKKwl1MzIgY3VycmVudF9ibGsgPSBCTEtfRlJPTV9BRERSKGJsa19hZGRyKTsKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCWludCB3UmVzdWx0ID0gUEFTUzsKKwlpbnQgR2FyYmFnZUNvbGxlY3QgPSBGQUlMOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChJU19TUEFSRV9CTE9DSyhjdXJyZW50X2JsaykpIHsKKwkJcGJ0W2N1cnJlbnRfYmxrXSA9ICh+U1BBUkVfQkxPQ0spICYgcGJ0W2N1cnJlbnRfYmxrXTsKKyNpZiBDTURfRE1BCisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YV9GcmVlOworCQlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPQorCQkJZnRsX2NtZF9jbnQ7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9JbmRleCA9IGN1cnJlbnRfYmxrOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPSBwYnRbY3VycmVudF9ibGtdOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweDBDIDsKKyNlbmRpZgorCQlyZXR1cm4gd1Jlc3VsdDsKKwl9CisKKwlGVExfUmVwbGFjZV9MV0Jsb2NrKGN1cnJlbnRfYmxrLCAmR2FyYmFnZUNvbGxlY3QpOworCisJaWYgKFBBU1MgPT0gR2FyYmFnZUNvbGxlY3QpCisJCXdSZXN1bHQgPSBHTE9CX0ZUTF9HYXJiYWdlX0NvbGxlY3Rpb24oKTsKKworCXJldHVybiB3UmVzdWx0OworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX0lzX0JhZEJsb2NrCisqIElucHV0czogICAgICAgYmxvY2sgbnVtYmVyIHRvIHRlc3QKKyogT3V0cHV0czogICAgICBQQVNTIChibG9jayBpcyBCQUQpIC8gRkFJTCAoYmxvY2sgaXMgbm90IGJhZCkKKyogRGVzY3JpcHRpb246ICB0ZXN0IGlmIHRoaXMgYmxvY2sgbnVtYmVyIGlzIGZsYWdnZWQgYXMgYmFkCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworaW50IEdMT0JfRlRMX0lzX0JhZEJsb2NrKHUzMiB3QmxvY2tOdW0pCit7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAod0Jsb2NrTnVtID49IERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrCisJCSYmIEJBRF9CTE9DSyA9PSAocGJ0W3dCbG9ja051bV0gJiBCQURfQkxPQ0spKQorCQlyZXR1cm4gUEFTUzsKKwllbHNlCisJCXJldHVybiBGQUlMOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX0ZsdXNoX0NhY2hlCisqIElucHV0czogICAgICAgbm9uZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAvIEZBSUw9MQorKiBEZXNjcmlwdGlvbjogIGZsdXNoIGFsbCB0aGUgY2FjaGUgYmxvY2tzIHRvIGZsYXNoCisqICAgICAgICAgICAgICAgaWYgYSBjYWNoZSBibG9jayBpcyBub3QgZGlydHksIGRvbid0IGRvIGFueXRoaW5nIHdpdGggaXQKKyogICAgICAgICAgICAgICBlbHNlLCB3cml0ZSB0aGUgYmxvY2sgYW5kIHVwZGF0ZSB0aGUgYmxvY2sgdGFibGUKKyogTm90ZTogICAgICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgc2h1dGRvd24vcG93ZXIgZG93bi4KKyogICAgICAgICAgICAgICB0byB3cml0ZSBpbXBvcnRhbnQgZGF0YSBpbnRvIGRldmljZQorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK2ludCBHTE9CX0ZUTF9GbHVzaF9DYWNoZSh2b2lkKQoreworCWludCBpLCByZXQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IENBQ0hFX0lURU1fTlVNOyBpKyspIHsKKwkJaWYgKFNFVCA9PSBDYWNoZS5hcnJheVtpXS5jaGFuZ2VkKSB7CisjaWYgQ01EX0RNQQorI2lmIFJFU1RPUkVfQ0FDSEVfT05fQ0RNQV9DSEFJTl9GQUlMVVJFCisJCQlpbnRfY2FjaGVbZnRsX2NtZF9jbnRdLml0ZW0gPSBpOworCQkJaW50X2NhY2hlW2Z0bF9jbWRfY250XS5jYWNoZS5hZGRyZXNzID0KKwkJCQkJQ2FjaGUuYXJyYXlbaV0uYWRkcmVzczsKKwkJCWludF9jYWNoZVtmdGxfY21kX2NudF0uY2FjaGUuY2hhbmdlZCA9IENMRUFSOworI2VuZGlmCisjZW5kaWYKKwkJCXJldCA9IHdyaXRlX2JhY2tfdG9fbDJfY2FjaGUoQ2FjaGUuYXJyYXlbaV0uYnVmLCBDYWNoZS5hcnJheVtpXS5hZGRyZXNzKTsKKwkJCWlmIChQQVNTID09IHJldCkgeworCQkJCUNhY2hlLmFycmF5W2ldLmNoYW5nZWQgPSBDTEVBUjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fQUxFUlQgIkZhaWxlZCB3aGVuIHdyaXRlIGJhY2sgdG8gTDIgY2FjaGUhXG4iKTsKKwkJCQkvKiBUT0RPIC0gSG93IHRvIGhhbmRsZSB0aGlzPyAqLworCQkJfQorCQl9CisJfQorCisJZmx1c2hfbDJfY2FjaGUoKTsKKworCXJldHVybiBGVExfV3JpdGVfQmxvY2tfVGFibGUoRkFJTCk7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgR0xPQl9GVExfUGFnZV9SZWFkCisqIElucHV0czogICAgICAgcG9pbnRlciB0byBkYXRhCisqICAgICAgICAgICAgICAgICAgIGxvZ2ljYWwgYWRkcmVzcyBvZiBkYXRhICh1NjQgaXMgTEJBICogQnl0ZXMvUGFnZSkKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICByZWFkcyBhIHBhZ2Ugb2YgZGF0YSBpbnRvIFJBTSBmcm9tIHRoZSBjYWNoZQorKiAgICAgICAgICAgICAgIGlmIHRoZSBkYXRhIGlzIG5vdCBhbHJlYWR5IGluIGNhY2hlLCByZWFkIGZyb20gZmxhc2ggdG8gY2FjaGUKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9GVExfUGFnZV9SZWFkKHU4ICpkYXRhLCB1NjQgbG9naWNhbF9hZGRyKQoreworCXUxNiBjYWNoZV9pdGVtOworCWludCByZXMgPSBQQVNTOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJHTE9CX0ZUTF9QYWdlX1JlYWQgLSAiCisJCSJwYWdlX2FkZHI6ICVsbHVcbiIsIGxvZ2ljYWxfYWRkcik7CisKKwljYWNoZV9pdGVtID0gRlRMX0NhY2hlX0lmX0hpdChsb2dpY2FsX2FkZHIpOworCisJaWYgKFVOSElUX0NBQ0hFX0lURU0gPT0gY2FjaGVfaXRlbSkgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSAgICAgICAiR0xPQl9GVExfUGFnZV9SZWFkOiBDYWNoZSBub3QgaGl0XG4iKTsKKwkJcmVzID0gRlRMX0NhY2hlX1dyaXRlKCk7CisJCWlmIChFUlIgPT0gRlRMX0NhY2hlX1JlYWQobG9naWNhbF9hZGRyKSkKKwkJCXJlcyA9IEVSUjsKKwkJY2FjaGVfaXRlbSA9IENhY2hlLkxSVTsKKwl9CisKKwlGVExfQ2FjaGVfUmVhZF9QYWdlKGRhdGEsIGxvZ2ljYWxfYWRkciwgY2FjaGVfaXRlbSk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX1BhZ2VfV3JpdGUKKyogSW5wdXRzOiAgICAgICBwb2ludGVyIHRvIGRhdGEKKyogICAgICAgICAgICAgICBhZGRyZXNzIG9mIGRhdGEgKEFERFJFU1NUWVBFIGlzIExCQSAqIEJ5dGVzL1BhZ2UpCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTD0xCisqIERlc2NyaXB0aW9uOiAgd3JpdGVzIGEgcGFnZSBvZiBkYXRhIGZyb20gUkFNIHRvIHRoZSBjYWNoZQorKiAgICAgICAgICAgICAgIGlmIHRoZSBkYXRhIGlzIG5vdCBhbHJlYWR5IGluIGNhY2hlLCB3cml0ZSBiYWNrIHRoZQorKiAgICAgICAgICAgICAgIGxlYXN0IHJlY2VudGx5IHVzZWQgYmxvY2sgYW5kIHJlYWQgdGhlIGFkZHJlc3NlZCBibG9jaworKiAgICAgICAgICAgICAgIGZyb20gZmxhc2ggdG8gY2FjaGUKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9GVExfUGFnZV9Xcml0ZSh1OCAqcERhdGEsIHU2NCBkd1BhZ2VBZGRyKQoreworCXUxNiBjYWNoZV9ibGs7CisJdTMyICpwYnQgPSAodTMyICopZ19wQmxvY2tUYWJsZTsKKwlpbnQgd1Jlc3VsdCA9IFBBU1M7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIkdMT0JfRlRMX1BhZ2VfV3JpdGUgLSAiCisJCSJkd1BhZ2VBZGRyOiAlbGx1XG4iLCBkd1BhZ2VBZGRyKTsKKworCWNhY2hlX2JsayA9IEZUTF9DYWNoZV9JZl9IaXQoZHdQYWdlQWRkcik7CisKKwlpZiAoVU5ISVRfQ0FDSEVfSVRFTSA9PSBjYWNoZV9ibGspIHsKKwkJd1Jlc3VsdCA9IEZUTF9DYWNoZV9Xcml0ZSgpOworCQlpZiAoSVNfQkFEX0JMT0NLKEJMS19GUk9NX0FERFIoZHdQYWdlQWRkcikpKSB7CisJCQl3UmVzdWx0ID0gRlRMX1JlcGxhY2VfQmxvY2soZHdQYWdlQWRkcik7CisJCQlwYnRbQkxLX0ZST01fQUREUihkd1BhZ2VBZGRyKV0gfD0gU1BBUkVfQkxPQ0s7CisJCQlpZiAod1Jlc3VsdCA9PSBGQUlMKQorCQkJCXJldHVybiBGQUlMOworCQl9CisJCWlmIChFUlIgPT0gRlRMX0NhY2hlX1JlYWQoZHdQYWdlQWRkcikpCisJCQl3UmVzdWx0ID0gRVJSOworCQljYWNoZV9ibGsgPSBDYWNoZS5MUlU7CisJCUZUTF9DYWNoZV9Xcml0ZV9QYWdlKHBEYXRhLCBkd1BhZ2VBZGRyLCBjYWNoZV9ibGssIDApOworCX0gZWxzZSB7CisjaWYgQ01EX0RNQQorCQlGVExfQ2FjaGVfV3JpdGVfUGFnZShwRGF0YSwgZHdQYWdlQWRkciwgY2FjaGVfYmxrLAorCQkJCUxMRF9DTURfRkxBR19PUkRFUl9CRUZPUkVfUkVTVCk7CisjZWxzZQorCQlGVExfQ2FjaGVfV3JpdGVfUGFnZShwRGF0YSwgZHdQYWdlQWRkciwgY2FjaGVfYmxrLCAwKTsKKyNlbmRpZgorCX0KKworCXJldHVybiB3UmVzdWx0OworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEdMT0JfRlRMX0Jsb2NrX0VyYXNlCisqIElucHV0czogICAgICAgYWRkcmVzcyBvZiBibG9jayB0byBlcmFzZSAobm93IGluIGJ5dGUgZm9ybWF0LCBzaG91bGQgY2hhbmdlIHRvCisqIGJsb2NrIGZvcm1hdCkKKyogT3V0cHV0czogICAgICBQQVNTPTAgLyBGQUlMPTEKKyogRGVzY3JpcHRpb246ICBlcmFzZXMgdGhlIHNwZWNpZmllZCBibG9jaworKiAgICAgICAgICAgICAgIGluY3JlbWVudHMgdGhlIGVyYXNlIGNvdW50CisqICAgICAgICAgICAgICAgSWYgZXJhc2UgY291bnQgcmVhY2hlcyBpdHMgdXBwZXIgbGltaXQsY2FsbCBmdW5jdGlvbiB0bworKiAgICAgICAgICAgICAgIGRvIHRoZSBhanVzdG1lbnQgYXMgcGVyIHRoZSByZWxhdGl2ZSBlcmFzZSBjb3VudCB2YWx1ZXMKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgR0xPQl9GVExfQmxvY2tfRXJhc2UodTY0IGJsa19hZGRyKQoreworCWludCBzdGF0dXM7CisJdTMyIEJsa0lkeDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCUJsa0lkeCA9ICh1MzIpKGJsa19hZGRyID4+IERldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemUpOworCisJaWYgKEJsa0lkeCA8IERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiR0xPQl9GVExfQmxvY2tfRXJhc2U6ICIKKwkJCSJUaGlzIHNob3VsZCBuZXZlciBvY2N1clxuIik7CisJCXJldHVybiBGQUlMOworCX0KKworI2lmIENNRF9ETUEKKwlzdGF0dXMgPSBHTE9CX0xMRF9FcmFzZV9CbG9ja19jZG1hKEJsa0lkeCwgTExEX0NNRF9GTEFHX01PREVfQ0RNQSk7CisJaWYgKHN0YXR1cyA9PSBGQUlMKQorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJICAgICAgICJOQU5EIFByb2dyYW0gZmFpbCBpbiAlcywgTGluZSAlZCwgIgorCQkJICAgICAgICJGdW5jdGlvbjogJXMsIG5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkIVxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCBCbGtJZHgpOworI2Vsc2UKKwlzdGF0dXMgPSBHTE9CX0xMRF9FcmFzZV9CbG9jayhCbGtJZHgpOworCWlmIChzdGF0dXMgPT0gRkFJTCkgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJICAgICAgICJOQU5EIFByb2dyYW0gZmFpbCBpbiAlcywgTGluZSAlZCwgIgorCQkJICAgICAgICJGdW5jdGlvbjogJXMsIG5ldyBCYWQgQmxvY2sgJWQgZ2VuZXJhdGVkIVxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCBCbGtJZHgpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKyNlbmRpZgorCisJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKSB7CisJCWdfcFJlYWRDb3VudGVyW0Jsa0lkeCAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSA9IDA7CisJCWlmIChnX2NCbG9ja1RhYmxlU3RhdHVzICE9IElOX1BST0dSRVNTX0JMT0NLX1RBQkxFKSB7CisJCQlnX2NCbG9ja1RhYmxlU3RhdHVzID0gSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEU7CisJCQlGVExfV3JpdGVfSU5fUHJvZ3Jlc3NfQmxvY2tfVGFibGVfUGFnZSgpOworCQl9CisJfQorCisJZ19wV2VhckNvdW50ZXJbQmxrSWR4IC0gRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdKys7CisKKyNpZiBDTURfRE1BCisJcF9CVGFibGVDaGFuZ2VzRGVsdGEgPQorCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudCA9IGZ0bF9jbWRfY250OworCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5XQ19JbmRleCA9CisJCUJsa0lkeCAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrOworCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5XQ19FbnRyeV9WYWx1ZSA9CisJCWdfcFdlYXJDb3VudGVyW0Jsa0lkeCAtIERldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXTsKKwlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweDMwOworCisJaWYgKERldmljZUluZm8uTUxDRGV2aWNlKSB7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YV9GcmVlOworCQlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPQorCQkJZnRsX2NtZF9jbnQ7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5SQ19JbmRleCA9CisJCQlCbGtJZHggLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jazsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlJDX0VudHJ5X1ZhbHVlID0KKwkJCWdfcFJlYWRDb3VudGVyW0Jsa0lkeCAtCisJCQkJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweEMwOworCX0KKworCWZ0bF9jbWRfY250Kys7CisjZW5kaWYKKworCWlmIChnX3BXZWFyQ291bnRlcltCbGtJZHggLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja10gPT0gMHhGRSkKKwkJRlRMX0FkanVzdF9SZWxhdGl2ZV9FcmFzZV9Db3VudChCbGtJZHgpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9BZGp1c3RfUmVsYXRpdmVfRXJhc2VfQ291bnQKKyogSW5wdXRzOiAgICAgICBpbmRleCB0byBibG9jayB0aGF0IHdhcyBqdXN0IGluY3JlbWVudGVkIGFuZCBpcyBhdCB0aGUgbWF4CisqIE91dHB1dHM6ICAgICAgUEFTUz0wIC8gRkFJTD0xCisqIERlc2NyaXB0aW9uOiAgSWYgYW55IGVyYXNlIGNvdW50cyBhdCBNQVgsIGFkanVzdHMgZXJhc2UgY291bnQgb2YgZXZlcnkKKyogICAgICAgICAgICAgICBibG9jayBieSBzdWJzdHJhY3RpbmcgbGVhc3Qgd29ybgorKiAgICAgICAgICAgICAgIGNvdW50ZXIgZnJvbSBjb3VudGVyIHZhbHVlIG9mIGV2ZXJ5IGVudHJ5IGluIHdlYXIgdGFibGUKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitzdGF0aWMgaW50IEZUTF9BZGp1c3RfUmVsYXRpdmVfRXJhc2VfQ291bnQodTMyIEluZGV4X29mX01BWCkKK3sKKwl1OCB3TGVhc3RXb3JuQ291bnRlciA9IE1BWF9CWVRFX1ZBTFVFOworCXU4IHdXZWFyQ291bnRlcjsKKwl1MzIgaSwgd1dlYXJJbmRleDsKKwl1MzIgKnBidCA9ICh1MzIgKilnX3BCbG9ja1RhYmxlOworCWludCB3UmVzdWx0ID0gUEFTUzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtOyBpKyspIHsKKwkJaWYgKElTX0JBRF9CTE9DSyhpKSkKKwkJCWNvbnRpbnVlOworCQl3V2VhckluZGV4ID0gKHUzMikocGJ0W2ldICYgKH5CQURfQkxPQ0spKTsKKworCQlpZiAoKHdXZWFySW5kZXggLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jaykgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJGVExfQWRqdXN0X1JlbGF0aXZlX0VyYXNlX0NvdW50OiIKKwkJCQkJIlRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4iKTsKKwkJd1dlYXJDb3VudGVyID0gZ19wV2VhckNvdW50ZXJbd1dlYXJJbmRleCAtCisJCQlEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja107CisJCWlmICh3V2VhckNvdW50ZXIgPCB3TGVhc3RXb3JuQ291bnRlcikKKwkJCXdMZWFzdFdvcm5Db3VudGVyID0gd1dlYXJDb3VudGVyOworCX0KKworCWlmICh3TGVhc3RXb3JuQ291bnRlciA9PSAwKSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkiQWRqdXN0aW5nIFdlYXIgTGV2ZWxsaW5nIENvdW50ZXJzOiBTcGVjaWFsIENhc2VcbiIpOworCQlnX3BXZWFyQ291bnRlcltJbmRleF9vZl9NQVggLQorCQkJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdLS07CisjaWYgQ01EX0RNQQorCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0gZnRsX2NtZF9jbnQ7CisJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5XQ19JbmRleCA9CisJCQlJbmRleF9vZl9NQVggLSBEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jazsKKwkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPldDX0VudHJ5X1ZhbHVlID0KKwkJCWdfcFdlYXJDb3VudGVyW0luZGV4X29mX01BWCAtCisJCQkJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2tdOworCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweDMwOworI2VuZGlmCisJCUZUTF9TdGF0aWNfV2Vhcl9MZXZlbGluZygpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07IGkrKykKKwkJCWlmICghSVNfQkFEX0JMT0NLKGkpKSB7CisJCQkJd1dlYXJJbmRleCA9ICh1MzIpKHBidFtpXSAmICh+QkFEX0JMT0NLKSk7CisJCQkJZ19wV2VhckNvdW50ZXJbd1dlYXJJbmRleCAtCisJCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSA9CisJCQkJCSh1OCkoZ19wV2VhckNvdW50ZXIKKwkJCQkJW3dXZWFySW5kZXggLQorCQkJCQlEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja10gLQorCQkJCQl3TGVhc3RXb3JuQ291bnRlcik7CisjaWYgQ01EX0RNQQorCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhID0KKwkJCQkoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwkJCQlnX3BCVERlbHRhX0ZyZWUgKz0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkJZnRsX2NtZF9jbnQ7CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPldDX0luZGV4ID0gd1dlYXJJbmRleCAtCisJCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrOworCQkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5XQ19FbnRyeV9WYWx1ZSA9CisJCQkJCWdfcFdlYXJDb3VudGVyW3dXZWFySW5kZXggLQorCQkJCQlEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9ja107CisJCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgzMDsKKyNlbmRpZgorCQkJfQorCX0KKworCXJldHVybiB3UmVzdWx0OworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9Xcml0ZV9JTl9Qcm9ncmVzc19CbG9ja19UYWJsZV9QYWdlCisqIElucHV0czogICAgICAgTm9uZQorKiBPdXRwdXRzOiAgICAgIE5vbmUKKyogRGVzY3JpcHRpb246ICBJdCB3cml0ZXMgaW4tcHJvZ3Jlc3MgZmxhZyBwYWdlIHRvIHRoZSBwYWdlIG5leHQgdG8KKyogICAgICAgICAgICAgICBibG9jayB0YWJsZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEZUTF9Xcml0ZV9JTl9Qcm9ncmVzc19CbG9ja19UYWJsZV9QYWdlKHZvaWQpCit7CisJaW50IHdSZXN1bHQgPSBQQVNTOworCXUxNiBidF9wYWdlczsKKwl1MTYgZHdJUEZQYWdlQWRkcjsKKyNpZiBDTURfRE1BCisjZWxzZQorCXUzMiAqcGJ0ID0gKHUzMiAqKWdfcEJsb2NrVGFibGU7CisJdTMyIHdUZW1wQmxvY2tUYWJsZUluZGV4OworI2VuZGlmCisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWJ0X3BhZ2VzID0gRlRMX0dldF9CbG9ja19UYWJsZV9GbGFzaF9TaXplX1BhZ2VzKCk7CisKKwlkd0lQRlBhZ2VBZGRyID0gZ193QmxvY2tUYWJsZU9mZnNldCArIGJ0X3BhZ2VzOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJXcml0aW5nIElQRiBhdCAiCisJCQkgICAgICAgIkJsb2NrICVkIFBhZ2UgJWRcbiIsCisJCQkgICAgICAgZ193QmxvY2tUYWJsZUluZGV4LCBkd0lQRlBhZ2VBZGRyKTsKKworI2lmIENNRF9ETUEKKwl3UmVzdWx0ID0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX1NwYXJlX2NkbWEoZ19wSVBGLAorCQlnX3dCbG9ja1RhYmxlSW5kZXgsIGR3SVBGUGFnZUFkZHIsIDEsCisJCUxMRF9DTURfRkxBR19NT0RFX0NETUEgfCBMTERfQ01EX0ZMQUdfT1JERVJfQkVGT1JFX1JFU1QpOworCWlmICh3UmVzdWx0ID09IEZBSUwpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCSAgICAgICAiTkFORCBQcm9ncmFtIGZhaWwgaW4gJXMsIExpbmUgJWQsICIKKwkJCSAgICAgICAiRnVuY3Rpb246ICVzLCBuZXcgQmFkIEJsb2NrICVkIGdlbmVyYXRlZCFcbiIsCisJCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywKKwkJCSAgICAgICBnX3dCbG9ja1RhYmxlSW5kZXgpOworCX0KKwlnX3dCbG9ja1RhYmxlT2Zmc2V0ID0gZHdJUEZQYWdlQWRkciArIDE7CisJcF9CVGFibGVDaGFuZ2VzRGVsdGEgPSAoc3RydWN0IEJUYWJsZUNoYW5nZXNEZWx0YSAqKWdfcEJURGVsdGFfRnJlZTsKKwlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5mdGxfY21kX2NudCA9IGZ0bF9jbWRfY250OworCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5nX3dCbG9ja1RhYmxlT2Zmc2V0ID0gZ193QmxvY2tUYWJsZU9mZnNldDsKKwlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+VmFsaWRGaWVsZHMgPSAweDAxOworCWZ0bF9jbWRfY250Kys7CisjZWxzZQorCXdSZXN1bHQgPSBHTE9CX0xMRF9Xcml0ZV9QYWdlX01haW5fU3BhcmUoZ19wSVBGLAorCQlnX3dCbG9ja1RhYmxlSW5kZXgsIGR3SVBGUGFnZUFkZHIsIDEpOworCWlmICh3UmVzdWx0ID09IEZBSUwpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCSAgICAgICAiTkFORCBQcm9ncmFtIGZhaWwgaW4gJXMsIExpbmUgJWQsICIKKwkJCSAgICAgICAiRnVuY3Rpb246ICVzLCBuZXcgQmFkIEJsb2NrICVkIGdlbmVyYXRlZCFcbiIsCisJCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywKKwkJCSAgICAgICAoaW50KWdfd0Jsb2NrVGFibGVJbmRleCk7CisJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFtCTE9DS19UQUJMRV9JTkRFWF0pOworCQl3VGVtcEJsb2NrVGFibGVJbmRleCA9IEZUTF9SZXBsYWNlX0Jsb2NrX1RhYmxlKCk7CisJCWJ0X2Jsb2NrX2NoYW5nZWQgPSAxOworCQlpZiAoQkFEX0JMT0NLID09IHdUZW1wQmxvY2tUYWJsZUluZGV4KQorCQkJcmV0dXJuIEVSUjsKKwkJZ193QmxvY2tUYWJsZUluZGV4ID0gd1RlbXBCbG9ja1RhYmxlSW5kZXg7CisJCWdfd0Jsb2NrVGFibGVPZmZzZXQgPSAwOworCQkvKiBCbG9jayB0YWJsZSB0YWcgaXMgJzAwJy4gTWVhbnMgaXQncyB1c2VkIG9uZSAqLworCQlwYnRbQkxPQ0tfVEFCTEVfSU5ERVhdID0gZ193QmxvY2tUYWJsZUluZGV4OworCQlyZXR1cm4gRkFJTDsKKwl9CisJZ193QmxvY2tUYWJsZU9mZnNldCA9IGR3SVBGUGFnZUFkZHIgKyAxOworI2VuZGlmCisJcmV0dXJuIHdSZXN1bHQ7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIEZUTF9SZWFkX0Rpc3R1cmJhbmNlCisqIElucHV0czogICAgICAgYmxvY2sgYWRkcmVzcworKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAvIEZBSUw9MQorKiBEZXNjcmlwdGlvbjogIHVzZWQgdG8gaGFuZGxlIHJlYWQgZGlzdHVyYmFuY2UuIERhdGEgaW4gYmxvY2sgdGhhdAorKiAgICAgICAgICAgICAgIHJlYWNoZXMgaXRzIHJlYWQgbGltaXQgaXMgbW92ZWQgdG8gbmV3IGJsb2NrCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgRlRMX1JlYWRfRGlzdHVyYmFuY2UodTMyIGJsa19hZGRyKQoreworCWludCB3UmVzdWx0ID0gRkFJTDsKKwl1MzIgKnBidCA9ICh1MzIgKikgZ19wQmxvY2tUYWJsZTsKKwl1MzIgZHdPbGRCbG9ja0FkZHIgPSBibGtfYWRkcjsKKwl1MzIgd0Jsb2NrTnVtOworCXUzMiBpOworCXUzMiB3TGVhc3RSZWFkQ291bnRlciA9IDB4RkZGRjsKKwl1MzIgd0xlYXN0UmVhZEluZGV4ID0gQkFEX0JMT0NLOworCXUzMiB3U3BhcmVCbG9ja051bSA9IDA7CisJdTMyIHdUZW1wTm9kZTsKKwl1MzIgd1JlcGxhY2VkTm9kZTsKKwl1OCAqZ19wVGVtcEJ1ZjsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworI2lmIENNRF9ETUEKKwlnX3BUZW1wQnVmID0gY3BfYmFja19idWZfY29waWVzW2NwX2JhY2tfYnVmX2lkeF07CisJY3BfYmFja19idWZfaWR4Kys7CisJaWYgKGNwX2JhY2tfYnVmX2lkeCA+IENPUFlfQkFDS19CVUZfTlVNKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BfYmFja19idWZfY29waWVzIG92ZXJmbG93ISBFeGl0LiIKKwkJIk1heWJlIHRvbyBtYW55IHBlbmRpbmcgY29tbWFuZHMgaW4geW91ciBDRE1BIGNoYWluLlxuIik7CisJCXJldHVybiBGQUlMOworCX0KKyNlbHNlCisJZ19wVGVtcEJ1ZiA9IHRtcF9idWZfcmVhZF9kaXN0dXJiYW5jZTsKKyNlbmRpZgorCisJd0Jsb2NrTnVtID0gRlRMX0dldF9CbG9ja19JbmRleChibGtfYWRkcik7CisKKwlkbyB7CisJCS8qIFRoaXMgaXMgYSBidWcuSGVyZSAnaScgc2hvdWxkIGJlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyCisJCSAqIGFuZCBzdGFydCBmcm9tIDEgKDAgaXMgcmVzZXJ2ZWQgZm9yIGJsb2NrIHRhYmxlKS4KKwkJICogSGF2ZSBmaXhlZCBpdC4gICAgICAgIC0gWXVucGVuZyAyMDA4LiAxMi4gMTkKKwkJICovCisJCWZvciAoaSA9IDE7IGkgPCBEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW07IGkrKykgeworCQkJaWYgKElTX1NQQVJFX0JMT0NLKGkpKSB7CisJCQkJdTMyIHdQaHlzaWNhbEluZGV4ID0KKwkJCQkJKHUzMikoKH5TUEFSRV9CTE9DSykgJiBwYnRbaV0pOworCQkJCWlmIChnX3BSZWFkQ291bnRlclt3UGh5c2ljYWxJbmRleCAtCisJCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXSA8CisJCQkJCXdMZWFzdFJlYWRDb3VudGVyKSB7CisJCQkJCXdMZWFzdFJlYWRDb3VudGVyID0KKwkJCQkJCWdfcFJlYWRDb3VudGVyW3dQaHlzaWNhbEluZGV4IC0KKwkJCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrXTsKKwkJCQkJd0xlYXN0UmVhZEluZGV4ID0gaTsKKwkJCQl9CisJCQkJd1NwYXJlQmxvY2tOdW0rKzsKKwkJCX0KKwkJfQorCisJCWlmICh3U3BhcmVCbG9ja051bSA8PSBOVU1fRlJFRV9CTE9DS1NfR0FURSkgeworCQkJd1Jlc3VsdCA9IEdMT0JfRlRMX0dhcmJhZ2VfQ29sbGVjdGlvbigpOworCQkJaWYgKFBBU1MgPT0gd1Jlc3VsdCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXdUZW1wTm9kZSA9ICh1MzIpKERJU0NBUkRfQkxPQ0sgfCBwYnRbd0Jsb2NrTnVtXSk7CisJCQl3UmVwbGFjZWROb2RlID0gKHUzMikoKH5TUEFSRV9CTE9DSykgJgorCQkJCQlwYnRbd0xlYXN0UmVhZEluZGV4XSk7CisjaWYgQ01EX0RNQQorCQkJcGJ0W3dCbG9ja051bV0gPSB3UmVwbGFjZWROb2RlOworCQkJcGJ0W3dMZWFzdFJlYWRJbmRleF0gPSB3VGVtcE5vZGU7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YSA9CisJCQkJKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEgKilnX3BCVERlbHRhX0ZyZWU7CisJCQlnX3BCVERlbHRhX0ZyZWUgKz0gc2l6ZW9mKHN0cnVjdCBCVGFibGVDaGFuZ2VzRGVsdGEpOworCisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+ZnRsX2NtZF9jbnQgPQorCQkJCQlmdGxfY21kX2NudDsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9JbmRleCA9IHdCbG9ja051bTsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5CVF9FbnRyeV9WYWx1ZSA9IHBidFt3QmxvY2tOdW1dOworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPlZhbGlkRmllbGRzID0gMHgwQzsKKworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEgPQorCQkJCShzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhICopZ19wQlREZWx0YV9GcmVlOworCQkJZ19wQlREZWx0YV9GcmVlICs9IHNpemVvZihzdHJ1Y3QgQlRhYmxlQ2hhbmdlc0RlbHRhKTsKKworCQkJcF9CVGFibGVDaGFuZ2VzRGVsdGEtPmZ0bF9jbWRfY250ID0KKwkJCQkJZnRsX2NtZF9jbnQ7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfSW5kZXggPSB3TGVhc3RSZWFkSW5kZXg7CisJCQlwX0JUYWJsZUNoYW5nZXNEZWx0YS0+QlRfRW50cnlfVmFsdWUgPQorCQkJCQlwYnRbd0xlYXN0UmVhZEluZGV4XTsKKwkJCXBfQlRhYmxlQ2hhbmdlc0RlbHRhLT5WYWxpZEZpZWxkcyA9IDB4MEM7CisKKwkJCXdSZXN1bHQgPSBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbl9jZG1hKGdfcFRlbXBCdWYsCisJCQkJZHdPbGRCbG9ja0FkZHIsIDAsIERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2ssCisJCQkJTExEX0NNRF9GTEFHX01PREVfQ0RNQSk7CisJCQlpZiAod1Jlc3VsdCA9PSBGQUlMKQorCQkJCXJldHVybiB3UmVzdWx0OworCisJCQlmdGxfY21kX2NudCsrOworCisJCQlpZiAod1Jlc3VsdCAhPSBGQUlMKSB7CisJCQkJaWYgKEZBSUwgPT0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX2NkbWEoCisJCQkJCWdfcFRlbXBCdWYsIHBidFt3QmxvY2tOdW1dLCAwLAorCQkJCQlEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSkgeworCQkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJCQkJIk5BTkQgUHJvZ3JhbSBmYWlsIGluICIKKwkJCQkJCSIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzLCAiCisJCQkJCQkibmV3IEJhZCBCbG9jayAlZCAiCisJCQkJCQkiZ2VuZXJhdGVkIVxuIiwKKwkJCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sCisJCQkJCQkoaW50KXBidFt3QmxvY2tOdW1dKTsKKwkJCQkJd1Jlc3VsdCA9IEZBSUw7CisJCQkJCU1BUktfQkxPQ0tfQVNfQkFEKHBidFt3QmxvY2tOdW1dKTsKKwkJCQl9CisJCQkJZnRsX2NtZF9jbnQrKzsKKwkJCX0KKyNlbHNlCisJCQl3UmVzdWx0ID0gR0xPQl9MTERfUmVhZF9QYWdlX01haW4oZ19wVGVtcEJ1ZiwKKwkJCQlkd09sZEJsb2NrQWRkciwgMCwgRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jayk7CisJCQlpZiAod1Jlc3VsdCA9PSBGQUlMKQorCQkJCXJldHVybiB3UmVzdWx0OworCisJCQlpZiAod1Jlc3VsdCAhPSBGQUlMKSB7CisJCQkJLyogVGhpcyBpcyBhIGJ1Zy4gQXQgdGhpcyB0aW1lLCBwYnRbd0Jsb2NrTnVtXQorCQkJCWlzIHN0aWxsIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mCisJCQkJZGlzY2FyZCBibG9jaywgYW5kIHNob3VsZCBub3QgYmUgd3JpdGUuCisJCQkJSGF2ZSBmaXhlZCBpdCBhcyBiZWxvdy4KKwkJCQkJLS0gWXVucGVuZyAyMDA4LjEyLjE5CisJCQkJKi8KKwkJCQl3UmVzdWx0ID0gR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluKGdfcFRlbXBCdWYsCisJCQkJCXdSZXBsYWNlZE5vZGUsIDAsCisJCQkJCURldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spOworCQkJCWlmICh3UmVzdWx0ID09IEZBSUwpIHsKKwkJCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkJCSJOQU5EIFByb2dyYW0gZmFpbCBpbiAiCisJCQkJCQkiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlcywgIgorCQkJCQkJIm5ldyBCYWQgQmxvY2sgJWQgIgorCQkJCQkJImdlbmVyYXRlZCFcbiIsCisJCQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLAorCQkJCQkJKGludCl3UmVwbGFjZWROb2RlKTsKKwkJCQkJTUFSS19CTE9DS19BU19CQUQod1JlcGxhY2VkTm9kZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGJ0W3dCbG9ja051bV0gPSB3UmVwbGFjZWROb2RlOworCQkJCQlwYnRbd0xlYXN0UmVhZEluZGV4XSA9IHdUZW1wTm9kZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgod1Jlc3VsdCA9PSBQQVNTKSAmJiAoZ19jQmxvY2tUYWJsZVN0YXR1cyAhPQorCQkJCUlOX1BST0dSRVNTX0JMT0NLX1RBQkxFKSkgeworCQkJCWdfY0Jsb2NrVGFibGVTdGF0dXMgPSBJTl9QUk9HUkVTU19CTE9DS19UQUJMRTsKKwkJCQlGVExfV3JpdGVfSU5fUHJvZ3Jlc3NfQmxvY2tfVGFibGVfUGFnZSgpOworCQkJfQorI2VuZGlmCisJCX0KKwl9IHdoaWxlICh3UmVzdWx0ICE9IFBBU1MpCisJOworCisjaWYgQ01EX0RNQQorCS8qIC4uLiAqLworI2VuZGlmCisKKwlyZXR1cm4gd1Jlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmxhc2guaCBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkMDU4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmgKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBOQU5EIEZsYXNoIENvbnRyb2xsZXIgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1cHBsaWVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9GTEFTSF9JTlRFUkZBQ0VfCisjZGVmaW5lIF9GTEFTSF9JTlRFUkZBQ0VfCisKKyNpbmNsdWRlICJmZnNwb3J0LmgiCisjaW5jbHVkZSAic3BlY3RyYXN3Y29uZmlnLmgiCisKKyNkZWZpbmUgTUFYX0JZVEVfVkFMVUUgICAgICAgIDB4RkYKKyNkZWZpbmUgTUFYX1dPUkRfVkFMVUUgICAgICAgIDB4RkZGRgorI2RlZmluZSBNQVhfVTMyX1ZBTFVFICAgICAgICAweEZGRkZGRkZGCisKKyNkZWZpbmUgTUFYX0JMT0NLTk9ERV9WQUxVRSAgICAgMHhGRkZGRkYKKyNkZWZpbmUgRElTQ0FSRF9CTE9DSyAgICAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUgU1BBUkVfQkxPQ0sgICAgICAgICAgICAgMHg0MDAwMDAKKyNkZWZpbmUgQkFEX0JMT0NLICAgICAgICAgICAgICAgMHhDMDAwMDAKKworI2RlZmluZSBVTkhJVF9DQUNIRV9JVEVNICAgICAgICAgMHhGRkZGCisKKyNkZWZpbmUgTkFORF9DQUNIRV9JTklUX0FERFIgICAgMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisKKyNkZWZpbmUgSU5fUFJPR1JFU1NfQkxPQ0tfVEFCTEUgICAweDAwCisjZGVmaW5lIENVUlJFTlRfQkxPQ0tfVEFCTEUgICAgICAgMHgwMQorCisjZGVmaW5lIEJUU0lHX09GRlNFVCAgICgwKQorI2RlZmluZSBCVFNJR19CWVRFUyAgICAoNSkKKyNkZWZpbmUgQlRTSUdfREVMVEEgICAgKDMpCisKKyNkZWZpbmUgTUFYX1JFQURfQ09VTlRFUiAgMHgyNzEwCisKKyNkZWZpbmUgRklSU1RfQlRfSUQJCSgxKQorI2RlZmluZSBMQVNUX0JUX0lEICAgICgyNTQpCisjZGVmaW5lIEJUQkxPQ0tfSU5WQUwgICh1MzIpKDB4RkZGRkZGRkYpCisKK3N0cnVjdCBkZXZpY2VfaW5mb190YWcgeworCXUxNiB3RGV2aWNlTWFrZXI7CisJdTE2IHdEZXZpY2VJRDsKKwl1MzIgd0RldmljZVR5cGU7CisJdTMyIHdTcGVjdHJhU3RhcnRCbG9jazsKKwl1MzIgd1NwZWN0cmFFbmRCbG9jazsKKwl1MzIgd1RvdGFsQmxvY2tzOworCXUxNiB3UGFnZXNQZXJCbG9jazsKKwl1MTYgd1BhZ2VTaXplOworCXUxNiB3UGFnZURhdGFTaXplOworCXUxNiB3UGFnZVNwYXJlU2l6ZTsKKwl1MTYgd051bVBhZ2VTcGFyZUZsYWc7CisJdTE2IHdFQ0NCeXRlc1BlclNlY3RvcjsKKwl1MzIgd0Jsb2NrU2l6ZTsKKwl1MzIgd0Jsb2NrRGF0YVNpemU7CisJdTMyIHdEYXRhQmxvY2tOdW07CisJdTggYlBsYW5lTnVtOworCXUxNiB3RGV2aWNlTWFpbkFyZWFTaXplOworCXUxNiB3RGV2aWNlU3BhcmVBcmVhU2l6ZTsKKwl1MTYgd0RldmljZXNDb25uZWN0ZWQ7CisJdTE2IHdEZXZpY2VXaWR0aDsKKwl1MTYgd0hXUmV2aXNpb247CisJdTE2IHdIV0ZlYXR1cmVzOworCisJdTE2IHdPTkZJRGV2RmVhdHVyZXM7CisJdTE2IHdPTkZJT3B0Q29tbWFuZHM7CisJdTE2IHdPTkZJVGltaW5nTW9kZTsKKwl1MTYgd09ORklQZ21DYWNoZVRpbWluZ01vZGU7CisKKwl1MTYgTUxDRGV2aWNlOworCXUxNiB3U3BhcmVTa2lwQnl0ZXM7CisKKwl1OCBuQml0c0luUGFnZU51bWJlcjsKKwl1OCBuQml0c0luUGFnZURhdGFTaXplOworCXU4IG5CaXRzSW5CbG9ja0RhdGFTaXplOworfTsKKworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfaW5mb190YWcgRGV2aWNlSW5mbzsKKworLyogQ2FjaGUgaXRlbSBmb3JtYXQgKi8KK3N0cnVjdCBmbGFzaF9jYWNoZV9pdGVtX3RhZyB7CisJdTY0IGFkZHJlc3M7CisJdTE2IHVzZV9jbnQ7CisJdTE2IGNoYW5nZWQ7CisJdTggKmJ1ZjsKK307CisKK3N0cnVjdCBmbGFzaF9jYWNoZV90YWcgeworCXUzMiBjYWNoZV9pdGVtX3NpemU7IC8qIFNpemUgaW4gYnl0ZXMgb2YgZWFjaCBjYWNoZSBpdGVtICovCisJdTE2IHBhZ2VzX3Blcl9pdGVtOyAvKiBIb3cgbWFueSBOQU5EIHBhZ2VzIGluIGVhY2ggY2FjaGUgaXRlbSAqLworCXUxNiBMUlU7IC8qIE5vLiBvZiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBjYWNoZSBpdGVtICovCisJc3RydWN0IGZsYXNoX2NhY2hlX2l0ZW1fdGFnIGFycmF5W0NBQ0hFX0lURU1fTlVNXTsKK307CisKKy8qCisgKkRhdGEgc3RydWN0dXJlIGZvciBlYWNoIGxpc3Qgbm9kZSBvZiB0aGUgbWFuYWdtZW50IHRhYmxlCisgKiB1c2VkIGZvciB0aGUgTGV2ZWwgMiBDYWNoZS4gRWFjaCBub2RlIG1hcHMgb25lIGxvZ2ljYWwgTkFORCBibG9jay4KKyAqLworc3RydWN0IHNwZWN0cmFfbDJfY2FjaGVfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBsb2dpY2FsX2Jsa19udW07IC8qIExvZ2ljYWwgYmxvY2sgbnVtYmVyICovCisJdTMyIHBhZ2VzX2FycmF5W107IC8qIFBhZ2UgbWFwIGFycmF5IG9mIHRoaXMgbG9naWNhbCBibG9jay4KKwkJCSAgICogQXJyYXkgaW5kZXggaXMgdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyLAorCQkJICAgKiBhbmQgZm9yIGV2ZXJ5IGl0ZW0gb2YgdGhpcyBhcnJ5OgorCQkJICAgKiBoaWdoIDE2IGJpdCBpcyBpbmRleCBvZiB0aGUgTDIgY2FjaGUgYmxvY2sgbnVtLAorCQkJICAgKiBsb3cgMTYgYml0IGlzIHRoZSBwaHkgcGFnZSBudW0KKwkJCSAgICogb2YgdGhlIGFib3ZlIEwyIGNhY2hlIGJsb2NrLgorCQkJICAgKiBUaGlzIGFycmF5IHdpbGwgYmUga21hbGxvYyBkdXJpbmcgcnVuIHRpbWUuCisJCQkgICAqLworfTsKKworc3RydWN0IHNwZWN0cmFfbDJfY2FjaGVfaW5mbyB7CisJdTMyIGJsa19hcnJheVtCTEtfTlVNX0ZPUl9MMl9DQUNIRV07CisJdTE2IGN1cl9ibGtfaWR4OyAvKiBpZHggdG8gdGhlIHBoeSBibG9jayBudW1iZXIgb2YgY3VycmVudCB1c2luZyAqLworCXUxNiBjdXJfcGFnZV9udW07IC8qIHBhZ2VzIG51bWJlciBvZiBjdXJyZW50IHVzaW5nICovCisJc3RydWN0IHNwZWN0cmFfbDJfY2FjaGVfbGlzdCB0YWJsZTsgLyogRmlyc3Qgbm9kZSBvZiB0aGUgdGFibGUgKi8KK307CisKKyNkZWZpbmUgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUgICAgMQorCisjaWYgUkVTVE9SRV9DQUNIRV9PTl9DRE1BX0NIQUlOX0ZBSUxVUkUKK3N0cnVjdCBmbGFzaF9jYWNoZV9tb2RfaXRlbV90YWcgeworCXU2NCBhZGRyZXNzOworCXU4IGNoYW5nZWQ7Cit9OworCitzdHJ1Y3QgZmxhc2hfY2FjaGVfZGVsdGFfbGlzdF90YWcgeworCXU4IGl0ZW07ICAvKiB1c2VkIGNhY2hlIGl0ZW0gKi8KKwlzdHJ1Y3QgZmxhc2hfY2FjaGVfbW9kX2l0ZW1fdGFnIGNhY2hlOworfTsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGZsYXNoX2NhY2hlX3RhZyBDYWNoZTsKKworZXh0ZXJuIHU4ICpidWZfcmVhZF9wYWdlX21haW5fc3BhcmU7CitleHRlcm4gdTggKmJ1Zl93cml0ZV9wYWdlX21haW5fc3BhcmU7CitleHRlcm4gdTggKmJ1Zl9yZWFkX3BhZ2Vfc3BhcmU7CitleHRlcm4gdTggKmJ1Zl9nZXRfYmFkX2Jsb2NrOworZXh0ZXJuIHU4ICpjZG1hX2Rlc2NfYnVmOworZXh0ZXJuIHU4ICptZW1jcF9kZXNjX2J1ZjsKKworLyogc3RydXR1cmUgdXNlZCBmb3IgSW5kZW50ZnlEZXZpY2UgZnVuY3Rpb24gKi8KK3N0cnVjdCBzcGVjdHJhX2luZGVudGZ5X2Rldl90YWcgeworCXUzMiBOdW1CbG9ja3M7CisJdTE2IFBhZ2VzUGVyQmxvY2s7CisJdTE2IFBhZ2VEYXRhU2l6ZTsKKwl1MTYgd0VDQ0J5dGVzUGVyU2VjdG9yOworCXUzMiB3RGF0YUJsb2NrTnVtOworfTsKKworaW50IEdMT0JfRlRMX0ZsYXNoX0luaXQodm9pZCk7CitpbnQgR0xPQl9GVExfRmxhc2hfUmVsZWFzZSh2b2lkKTsKKy8qdm9pZCBHTE9CX0ZUTF9FcmFzZV9GbGFzaCh2b2lkKTsqLworaW50IEdMT0JfRlRMX0Jsb2NrX0VyYXNlKHU2NCBibG9ja19hZGRyKTsKK2ludCBHTE9CX0ZUTF9Jc19CYWRCbG9jayh1MzIgYmxvY2tfbnVtKTsKK2ludCBHTE9CX0ZUTF9JZGVudGlmeURldmljZShzdHJ1Y3Qgc3BlY3RyYV9pbmRlbnRmeV9kZXZfdGFnICpkZXZfZGF0YSk7CitpbnQgR0xPQl9GVExfRXZlbnRfU3RhdHVzKGludCAqKTsKK3UxNiBnbG9iX2Z0bF9leGVjdXRlX2NtZHModm9pZCk7CisKKy8qaW50IEZUTF9SZWFkX0Rpc3R1cmJhbmNlKEFERFJFU1NUWVBFIGR3QmxvY2tBZGRyKTsqLworaW50IEZUTF9SZWFkX0Rpc3R1cmJhbmNlKHUzMiBkd0Jsb2NrQWRkcik7CisKKy8qRmxhc2ggci93IGJhc2VkIG9uIGNhY2hlKi8KK2ludCBHTE9CX0ZUTF9QYWdlX1JlYWQodTggKnJlYWRfZGF0YSwgdTY0IHBhZ2VfYWRkcik7CitpbnQgR0xPQl9GVExfUGFnZV9Xcml0ZSh1OCAqd3JpdGVfZGF0YSwgdTY0IHBhZ2VfYWRkcik7CitpbnQgR0xPQl9GVExfV2Vhcl9MZXZlbGluZyh2b2lkKTsKK2ludCBHTE9CX0ZUTF9GbGFzaF9Gb3JtYXQodm9pZCk7CitpbnQgR0xPQl9GVExfSW5pdCh2b2lkKTsKK2ludCBHTE9CX0ZUTF9GbHVzaF9DYWNoZSh2b2lkKTsKK2ludCBHTE9CX0ZUTF9HYXJiYWdlX0NvbGxlY3Rpb24odm9pZCk7CitpbnQgR0xPQl9GVExfQlRfR2FyYmFnZV9Db2xsZWN0aW9uKHZvaWQpOwordm9pZCBHTE9CX0ZUTF9DYWNoZV9SZWxlYXNlKHZvaWQpOwordTggKmdldF9ibGtfdGFibGVfc3RhcnRfYWRkcih2b2lkKTsKK3U4ICpnZXRfd2Vhcl9sZXZlbGluZ190YWJsZV9zdGFydF9hZGRyKHZvaWQpOwordW5zaWduZWQgbG9uZyBnZXRfYmxrX3RhYmxlX2xlbih2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgZ2V0X3dlYXJfbGV2ZWxpbmdfdGFibGVfbGVuKHZvaWQpOworCisjaWYgREVCVUdfQk5EUlkKK3ZvaWQgZGVidWdfYm91bmRhcnlfbGluZW5vX2Vycm9yKGludCBjaG5sLCBpbnQgbGltaXQsIGludCBubywgaW50IGxpbmVubywKKwkJCQljaGFyICpmaWxlbmFtZSk7CisjZGVmaW5lIGRlYnVnX2JvdW5kYXJ5X2Vycm9yKGNobmwsIGxpbWl0LCBubykgZGVidWdfYm91bmRhcnlfbGluZW5vX2Vycm9yKGNobmwsXAorCQkJCQkJbGltaXQsIG5vLCBfX0xJTkVfXywgX19GSUxFX18pCisjZWxzZQorI2RlZmluZSBkZWJ1Z19ib3VuZGFyeV9lcnJvcihjaG5sLCBsaW1pdCwgbm8pIDsKKyNlbmRpZgorCisjZW5kaWYgLypfRkxBU0hfSU5URVJGQUNFXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjM2I5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGQuYwpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIE5BTkQgRmxhc2ggQ29udHJvbGxlciBEZXZpY2UgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uIGFuZCBpdHMgc3VwcGxpZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJzcGVjdHJhc3djb25maWcuaCIKKyNpbmNsdWRlICJmZnNwb3J0LmgiCisjaW5jbHVkZSAiZmZzZGVmcy5oIgorI2luY2x1ZGUgImxsZC5oIgorI2luY2x1ZGUgImxsZF9uYW5kLmgiCisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworI2lmIEZMQVNIX0VNVQkJLyogdmVjdG9yIGFsbCB0aGUgTExEIGNhbGxzIHRvIHRoZSBMTERfRU1VIGNvZGUgKi8KKyNpbmNsdWRlICJsbGRfZW11LmgiCisjaW5jbHVkZSAibGxkX2NkbWEuaCIKKworLyogY29tbW9uIGZ1bmN0aW9uczogKi8KK3UxNiBHTE9CX0xMRF9GbGFzaF9SZXNldCh2b2lkKQoreworCXJldHVybiBlbXVfRmxhc2hfUmVzZXQoKTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfRGV2aWNlX0lEKHZvaWQpCit7CisJcmV0dXJuIGVtdV9SZWFkX0RldmljZV9JRCgpOworfQorCitpbnQgR0xPQl9MTERfRmxhc2hfUmVsZWFzZSh2b2lkKQoreworCXJldHVybiBlbXVfRmxhc2hfUmVsZWFzZSgpOworfQorCit1MTYgR0xPQl9MTERfRmxhc2hfSW5pdCh2b2lkKQoreworCXJldHVybiBlbXVfRmxhc2hfSW5pdCgpOworfQorCit1MTYgR0xPQl9MTERfRXJhc2VfQmxvY2sodTMyIGJsb2NrX2FkZCkKK3sKKwlyZXR1cm4gZW11X0VyYXNlX0Jsb2NrKGJsb2NrX2FkZCk7Cit9CisKK3UxNiBHTE9CX0xMRF9Xcml0ZV9QYWdlX01haW4odTggKndyaXRlX2RhdGEsIHUzMiBibG9jaywgdTE2IFBhZ2UsCisJCQkJdTE2IFBhZ2VDb3VudCkKK3sKKwlyZXR1cm4gZW11X1dyaXRlX1BhZ2VfTWFpbih3cml0ZV9kYXRhLCBibG9jaywgUGFnZSwgUGFnZUNvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluKHU4ICpyZWFkX2RhdGEsIHUzMiBibG9jaywgdTE2IFBhZ2UsCisJCQkgICAgICAgdTE2IFBhZ2VDb3VudCkKK3sKKwlyZXR1cm4gZW11X1JlYWRfUGFnZV9NYWluKHJlYWRfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHU4ICpyZWFkX2RhdGEsCisJCQl1MzIgYmxvY2ssIHUxNiBwYWdlLCB1MTYgcGFnZV9jb3VudCkKK3sKKwlyZXR1cm4gZW11X1JlYWRfUGFnZV9NYWluKHJlYWRfZGF0YSwgYmxvY2ssIHBhZ2UsIHBhZ2VfY291bnQpOworfQorCit1MTYgR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX1NwYXJlKHU4ICp3cml0ZV9kYXRhLCB1MzIgYmxvY2ssCisJCQkJICAgICAgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIGVtdV9Xcml0ZV9QYWdlX01haW5fU3BhcmUod3JpdGVfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbl9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssCisJCQkJICAgICB1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCkKK3sKKwlyZXR1cm4gZW11X1JlYWRfUGFnZV9NYWluX1NwYXJlKHJlYWRfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiBHTE9CX0xMRF9Xcml0ZV9QYWdlX1NwYXJlKHU4ICp3cml0ZV9kYXRhLCB1MzIgYmxvY2ssIHUxNiBQYWdlLAorCQkJCSB1MTYgUGFnZUNvdW50KQoreworCXJldHVybiBlbXVfV3JpdGVfUGFnZV9TcGFyZSh3cml0ZV9kYXRhLCBibG9jaywgUGFnZSwgUGFnZUNvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfUGFnZV9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBQYWdlLAorCQkJCXUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIGVtdV9SZWFkX1BhZ2VfU3BhcmUocmVhZF9kYXRhLCBibG9jaywgUGFnZSwgUGFnZUNvdW50KTsKK30KKwordTE2ICBHTE9CX0xMRF9HZXRfQmFkX0Jsb2NrKHUzMiBibG9jaykKK3sKKyAgICByZXR1cm4gIGVtdV9HZXRfQmFkX0Jsb2NrKGJsb2NrKTsKK30KKworI2VuZGlmIC8qIEZMQVNIX0VNVSAqLworCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyNpZiBGTEFTSF9NVEQJCS8qIHZlY3RvciBhbGwgdGhlIExMRCBjYWxscyB0byB0aGUgTExEX01URCBjb2RlICovCisjaW5jbHVkZSAibGxkX210ZC5oIgorI2luY2x1ZGUgImxsZF9jZG1hLmgiCisKKy8qIGNvbW1vbiBmdW5jdGlvbnM6ICovCit1MTYgR0xPQl9MTERfRmxhc2hfUmVzZXQodm9pZCkKK3sKKwlyZXR1cm4gbXRkX0ZsYXNoX1Jlc2V0KCk7Cit9CisKK3UxNiBHTE9CX0xMRF9SZWFkX0RldmljZV9JRCh2b2lkKQoreworCXJldHVybiBtdGRfUmVhZF9EZXZpY2VfSUQoKTsKK30KKworaW50IEdMT0JfTExEX0ZsYXNoX1JlbGVhc2Uodm9pZCkKK3sKKwlyZXR1cm4gbXRkX0ZsYXNoX1JlbGVhc2UoKTsKK30KKwordTE2IEdMT0JfTExEX0ZsYXNoX0luaXQodm9pZCkKK3sKKwlyZXR1cm4gbXRkX0ZsYXNoX0luaXQoKTsKK30KKwordTE2IEdMT0JfTExEX0VyYXNlX0Jsb2NrKHUzMiBibG9ja19hZGQpCit7CisJcmV0dXJuIG10ZF9FcmFzZV9CbG9jayhibG9ja19hZGQpOworfQorCit1MTYgR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluKHU4ICp3cml0ZV9kYXRhLCB1MzIgYmxvY2ssIHUxNiBQYWdlLAorCQkJCXUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIG10ZF9Xcml0ZV9QYWdlX01haW4od3JpdGVfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbih1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBQYWdlLAorCQkJICAgICAgIHUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIG10ZF9SZWFkX1BhZ2VfTWFpbihyZWFkX2RhdGEsIGJsb2NrLCBQYWdlLCBQYWdlQ291bnQpOworfQorCit1MTYgR0xPQl9MTERfUmVhZF9QYWdlX01haW5fUG9sbGluZyh1OCAqcmVhZF9kYXRhLAorCQkJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IHBhZ2VfY291bnQpCit7CisJcmV0dXJuIG10ZF9SZWFkX1BhZ2VfTWFpbihyZWFkX2RhdGEsIGJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLAorCQkJCSAgICAgIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KQoreworCXJldHVybiBtdGRfV3JpdGVfUGFnZV9NYWluX1NwYXJlKHdyaXRlX2RhdGEsIGJsb2NrLCBQYWdlLCBQYWdlQ291bnQpOworfQorCit1MTYgR0xPQl9MTERfUmVhZF9QYWdlX01haW5fU3BhcmUodTggKnJlYWRfZGF0YSwgdTMyIGJsb2NrLAorCQkJCSAgICAgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIG10ZF9SZWFkX1BhZ2VfTWFpbl9TcGFyZShyZWFkX2RhdGEsIGJsb2NrLCBQYWdlLCBQYWdlQ291bnQpOworfQorCit1MTYgR0xPQl9MTERfV3JpdGVfUGFnZV9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLCB1MTYgUGFnZSwKKwkJCQkgdTE2IFBhZ2VDb3VudCkKK3sKKwlyZXR1cm4gbXRkX1dyaXRlX1BhZ2VfU3BhcmUod3JpdGVfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfU3BhcmUodTggKnJlYWRfZGF0YSwgdTMyIGJsb2NrLCB1MTYgUGFnZSwKKwkJCQl1MTYgUGFnZUNvdW50KQoreworCXJldHVybiBtdGRfUmVhZF9QYWdlX1NwYXJlKHJlYWRfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiAgR0xPQl9MTERfR2V0X0JhZF9CbG9jayh1MzIgYmxvY2spCit7CisgICAgcmV0dXJuICBtdGRfR2V0X0JhZF9CbG9jayhibG9jayk7Cit9CisKKyNlbmRpZiAvKiBGTEFTSF9NVEQgKi8KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyNpZiBGTEFTSF9OQU5ECS8qIHZlY3RvciBhbGwgdGhlIExMRCBjYWxscyB0byB0aGUgTkFORCBjb250cm9sbGVyIGNvZGUgKi8KKyNpbmNsdWRlICJsbGRfbmFuZC5oIgorI2luY2x1ZGUgImxsZF9jZG1hLmgiCisjaW5jbHVkZSAiZmxhc2guaCIKKworLyogY29tbW9uIGZ1bmN0aW9ucyBmb3IgTExEX05BTkQgKi8KK3ZvaWQgR0xPQl9MTERfRUNDX0NvbnRyb2woaW50IGVuYWJsZSkKK3sKKwlOQU5EX0VDQ19DdHJsKGVuYWJsZSk7Cit9CisKKy8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIExMRF9OQU5EICovCit1MTYgR0xPQl9MTERfRmxhc2hfUmVzZXQodm9pZCkKK3sKKwlyZXR1cm4gTkFORF9GbGFzaF9SZXNldCgpOworfQorCit1MTYgR0xPQl9MTERfUmVhZF9EZXZpY2VfSUQodm9pZCkKK3sKKwlyZXR1cm4gTkFORF9SZWFkX0RldmljZV9JRCgpOworfQorCit1MTYgR0xPQl9MTERfVW5sb2NrQXJyYXlBbGwodm9pZCkKK3sKKwlyZXR1cm4gTkFORF9VbmxvY2tBcnJheUFsbCgpOworfQorCit1MTYgR0xPQl9MTERfRmxhc2hfSW5pdCh2b2lkKQoreworCXJldHVybiBOQU5EX0ZsYXNoX0luaXQoKTsKK30KKworaW50IEdMT0JfTExEX0ZsYXNoX1JlbGVhc2Uodm9pZCkKK3sKKwlyZXR1cm4gbmFuZF9yZWxlYXNlX3NwZWN0cmEoKTsKK30KKwordTE2IEdMT0JfTExEX0VyYXNlX0Jsb2NrKHUzMiBibG9ja19hZGQpCit7CisJcmV0dXJuIE5BTkRfRXJhc2VfQmxvY2soYmxvY2tfYWRkKTsKK30KKworCit1MTYgR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluKHU4ICp3cml0ZV9kYXRhLCB1MzIgYmxvY2ssIHUxNiBQYWdlLAorCQkJCXUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIE5BTkRfV3JpdGVfUGFnZV9NYWluKHdyaXRlX2RhdGEsIGJsb2NrLCBQYWdlLCBQYWdlQ291bnQpOworfQorCit1MTYgR0xPQl9MTERfUmVhZF9QYWdlX01haW4odTggKnJlYWRfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCSAgICAgICB1MTYgcGFnZV9jb3VudCkKK3sKKwlpZiAocGFnZV9jb3VudCA9PSAxKSAvKiBVc2luZyBwb2xsaW5nIHRvIGltcHJvdmUgcmVhZCBzcGVlZCAqLworCQlyZXR1cm4gTkFORF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHJlYWRfZGF0YSwgYmxvY2ssIHBhZ2UsIDEpOworCWVsc2UKKwkJcmV0dXJuIE5BTkRfUmVhZF9QYWdlX01haW4ocmVhZF9kYXRhLCBibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7Cit9CisKK3UxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHU4ICpyZWFkX2RhdGEsCisJCQl1MzIgYmxvY2ssIHUxNiBwYWdlLCB1MTYgcGFnZV9jb3VudCkKK3sKKwlyZXR1cm4gTkFORF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHJlYWRfZGF0YSwKKwkJCWJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLAorCQkJCSAgICAgIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KQoreworCXJldHVybiBOQU5EX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh3cml0ZV9kYXRhLCBibG9jaywgUGFnZSwgUGFnZUNvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1dyaXRlX1BhZ2VfU3BhcmUodTggKndyaXRlX2RhdGEsIHUzMiBibG9jaywgdTE2IFBhZ2UsCisJCQkJIHUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIE5BTkRfV3JpdGVfUGFnZV9TcGFyZSh3cml0ZV9kYXRhLCBibG9jaywgUGFnZSwgUGFnZUNvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluX1NwYXJlKHU4ICpyZWFkX2RhdGEsIHUzMiBibG9jaywKKwkJCQkgICAgIHUxNiBwYWdlLCB1MTYgcGFnZV9jb3VudCkKK3sKKwlyZXR1cm4gTkFORF9SZWFkX1BhZ2VfTWFpbl9TcGFyZShyZWFkX2RhdGEsIGJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfUGFnZV9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBQYWdlLAorCQkJCXUxNiBQYWdlQ291bnQpCit7CisJcmV0dXJuIE5BTkRfUmVhZF9QYWdlX1NwYXJlKHJlYWRfZGF0YSwgYmxvY2ssIFBhZ2UsIFBhZ2VDb3VudCk7Cit9CisKK3UxNiAgR0xPQl9MTERfR2V0X0JhZF9CbG9jayh1MzIgYmxvY2spCit7CisJcmV0dXJuICBOQU5EX0dldF9CYWRfQmxvY2soYmxvY2spOworfQorCisjaWYgQ01EX0RNQQordTE2IEdMT0JfTExEX0V2ZW50X1N0YXR1cyh2b2lkKQoreworCXJldHVybiBDRE1BX0V2ZW50X1N0YXR1cygpOworfQorCit1MTYgZ2xvYl9sbGRfZXhlY3V0ZV9jbWRzKHZvaWQpCit7CisJcmV0dXJuIENETUFfRXhlY3V0ZV9DTURzKCk7Cit9CisKK3UxNiBHTE9CX0xMRF9NZW1Db3B5X0NNRCh1OCAqZGVzdCwgdTggKnNyYywKKwkJCXUzMiBCeXRlQ291bnQsIHUxNiBmbGFnKQoreworCS8qIFJlcGxhY2UgdGhlIGhhcmR3YXJlIG1lbWNvcHkgd2l0aCBzb2Z0d2FyZSBtZW1jcHkgZnVuY3Rpb24gKi8KKwlpZiAoQ0RNQV9FeGVjdXRlX0NNRHMoKSkKKwkJcmV0dXJuIEZBSUw7CisJbWVtY3B5KGRlc3QsIHNyYywgQnl0ZUNvdW50KTsKKwlyZXR1cm4gUEFTUzsKKworCS8qIHJldHVybiBDRE1BX01lbUNvcHlfQ01EKGRlc3QsIHNyYywgQnl0ZUNvdW50LCBmbGFnKTsgKi8KK30KKwordTE2IEdMT0JfTExEX0VyYXNlX0Jsb2NrX2NkbWEodTMyIGJsb2NrLCB1MTYgZmxhZ3MpCit7CisJcmV0dXJuIENETUFfRGF0YV9DTUQoRVJBU0VfQ01ELCAwLCBibG9jaywgMCwgMCwgZmxhZ3MpOworfQorCit1MTYgR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX2NkbWEodTggKmRhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBjb3VudCkKK3sKKwlyZXR1cm4gQ0RNQV9EYXRhX0NNRChXUklURV9NQUlOX0NNRCwgZGF0YSwgYmxvY2ssIHBhZ2UsIGNvdW50LCAwKTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluX2NkbWEodTggKmRhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsCisJCQkJdTE2IGNvdW50LCB1MTYgZmxhZ3MpCit7CisJcmV0dXJuIENETUFfRGF0YV9DTUQoUkVBRF9NQUlOX0NNRCwgZGF0YSwgYmxvY2ssIHBhZ2UsIGNvdW50LCBmbGFncyk7Cit9CisKK3UxNiBHTE9CX0xMRF9Xcml0ZV9QYWdlX01haW5fU3BhcmVfY2RtYSh1OCAqZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCQkJdTE2IGNvdW50LCB1MTYgZmxhZ3MpCit7CisJcmV0dXJuIENETUFfRGF0YV9DTUQoV1JJVEVfTUFJTl9TUEFSRV9DTUQsCisJCQlkYXRhLCBibG9jaywgcGFnZSwgY291bnQsIGZsYWdzKTsKK30KKwordTE2IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluX1NwYXJlX2NkbWEodTggKmRhdGEsCisJCQkJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IGNvdW50KQoreworCXJldHVybiBDRE1BX0RhdGFfQ01EKFJFQURfTUFJTl9TUEFSRV9DTUQsIGRhdGEsIGJsb2NrLCBwYWdlLCBjb3VudCwKKwkJCUxMRF9DTURfRkxBR19NT0RFX0NETUEpOworfQorCisjZW5kaWYgLyogQ01EX0RNQSAqLworI2VuZGlmIC8qIEZMQVNIX05BTkQgKi8KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisKKy8qIGVuZCBvZiBMTEQuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzczOGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBOQU5EIEZsYXNoIENvbnRyb2xsZXIgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1cHBsaWVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKworI2lmbmRlZiBfTExEXworI2RlZmluZSBfTExEXworCisjaW5jbHVkZSAiZmZzcG9ydC5oIgorI2luY2x1ZGUgInNwZWN0cmFzd2NvbmZpZy5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisKKyNkZWZpbmUgR09PRF9CTE9DSyAwCisjZGVmaW5lIERFRkVDVElWRV9CTE9DSyAxCisjZGVmaW5lIFJFQURfRVJST1IgMgorCisjZGVmaW5lIENMS19YICA1CisjZGVmaW5lIENMS19NVUxUSSA0CisKKy8qIFR5cGVkZWZzICovCisKKy8qICBwcm90b3R5cGVzOiBBUEkgZm9yIExMRCAqLworLyogQ3VycmVudGx5LCBXcml0ZV9QYWdlX01haW4KKyAqIAkJCSAgTWVtQ29weQorICogCQkJICBSZWFkX1BhZ2VfTWFpbl9TcGFyZQorICogZG8gbm90IGhhdmUgZmxhZyBiZWNhdXNlIHRoZXkgd2VyZSBub3QgaW1wbGVtZW50ZWQgcHJpb3IgdG8gdGhpcworICogVGhleSBhcmUgbm90IGJlaW5nIGFkZGVkIHRvIGtlZXAgY2hhbmdlcyB0byBhIG1pbmltdW0gZm9yIG5vdy4KKyAqIEN1cnJlbnRseSwgdGhleSBhcmUgbm90IHJlcXVpcmVkIChvbmx5IHJlcWQgZm9yIFdyX1BfTV9TLikKKyAqIExhdGVyIG9uLCB0aGVzZSBORUVEIHRvIGJlIGNoYW5nZWQuCisgKi8KKworZXh0ZXJuIHZvaWQgR0xPQl9MTERfRUNDX0NvbnRyb2woaW50IGVuYWJsZSk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfRmxhc2hfUmVzZXQodm9pZCk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfUmVhZF9EZXZpY2VfSUQodm9pZCk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfVW5sb2NrQXJyYXlBbGwodm9pZCk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfRmxhc2hfSW5pdCh2b2lkKTsKKworZXh0ZXJuIGludCBHTE9CX0xMRF9GbGFzaF9SZWxlYXNlKHZvaWQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX0VyYXNlX0Jsb2NrKHUzMiBibG9ja19hZGQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbih1OCAqd3JpdGVfZGF0YSwKKwl1MzIgYmxvY2ssIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KTsKKworZXh0ZXJuIHUxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbih1OCAqcmVhZF9kYXRhLAorCXUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBwYWdlX2NvdW50KTsKKworZXh0ZXJuIHUxNiBHTE9CX0xMRF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHU4ICpyZWFkX2RhdGEsCisJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IHBhZ2VfY291bnQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh1OCAqd3JpdGVfZGF0YSwKKwl1MzIgYmxvY2ssIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KTsKKworZXh0ZXJuIHUxNiBHTE9CX0xMRF9Xcml0ZV9QYWdlX1NwYXJlKHU4ICp3cml0ZV9kYXRhLAorCXUzMiBibG9jaywgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluX1NwYXJlKHU4ICpyZWFkX2RhdGEsCisJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IHBhZ2VfY291bnQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX1JlYWRfUGFnZV9TcGFyZSh1OCAqcmVhZF9kYXRhLAorCXUzMiBibG9jaywgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpOworCitleHRlcm4gdTE2ICBHTE9CX0xMRF9HZXRfQmFkX0Jsb2NrKHUzMiBibG9jayk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfRXZlbnRfU3RhdHVzKHZvaWQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX01lbUNvcHlfQ01EKHU4ICpkZXN0LCB1OCAqc3JjLCB1MzIgQnl0ZUNvdW50LCB1MTYgZmxhZyk7CisKK2V4dGVybiB1MTYgZ2xvYl9sbGRfZXhlY3V0ZV9jbWRzKHZvaWQpOworCitleHRlcm4gdTE2IEdMT0JfTExEX0VyYXNlX0Jsb2NrX2NkbWEodTMyIGJsb2NrLCB1MTYgZmxhZ3MpOworCitleHRlcm4gdTE2IEdMT0JfTExEX1dyaXRlX1BhZ2VfTWFpbl9jZG1hKHU4ICpkYXRhLAorCXUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBjb3VudCk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfUmVhZF9QYWdlX01haW5fY2RtYSh1OCAqZGF0YSwKKwl1MzIgYmxvY2ssIHUxNiBwYWdlLCB1MTYgY291bnQsIHUxNiBmbGFncyk7CisKK2V4dGVybiB1MTYgR0xPQl9MTERfV3JpdGVfUGFnZV9NYWluX1NwYXJlX2NkbWEodTggKmRhdGEsCisJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IGNvdW50LCB1MTYgZmxhZ3MpOworCitleHRlcm4gdTE2IEdMT0JfTExEX1JlYWRfUGFnZV9NYWluX1NwYXJlX2NkbWEodTggKmRhdGEsCisJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IGNvdW50KTsKKworI2RlZmluZSBMTERfQ01EX0ZMQUdfT1JERVJfQkVGT1JFX1JFU1QJCSgweDEpCisjZGVmaW5lIExMRF9DTURfRkxBR19NT0RFX0NETUEJCQkoMHg4KQorCisKKyNlbmRpZiAvKl9MTERfICovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX2NkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9jZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNzYxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9jZG1hLmMKQEAgLTAsMCArMSw5MTAgQEAKKy8qCisgKiBOQU5EIEZsYXNoIENvbnRyb2xsZXIgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1cHBsaWVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJzcGVjdHJhc3djb25maWcuaCIKKyNpbmNsdWRlICJsbGQuaCIKKyNpbmNsdWRlICJsbGRfbmFuZC5oIgorI2luY2x1ZGUgImxsZF9jZG1hLmgiCisjaW5jbHVkZSAibGxkX2VtdS5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisjaW5jbHVkZSAibmFuZF9yZWdzLmgiCisKKyNkZWZpbmUgTUFYX1BFTkRJTkdfQ01EUyAgICA0CisjZGVmaW5lIE1PREVfMDIgICAgICAgICAgICAgKDB4MiA8PCAyNikKKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIENETUFfRGF0YV9DbWQKKyogSW5wdXRzOiAgIGNtZCBjb2RlIChhbGlnbmVkIGZvciBodykKKyogICAgICAgICAgICAgICBkYXRhOiBwb2ludGVyIHRvIHNvdXJjZSBvciBkZXN0aW5hdGlvbgorKiAgICAgICAgICAgICAgIGJsb2NrOiBibG9jayBhZGRyZXNzCisqICAgICAgICAgICAgICAgcGFnZTogcGFnZSBhZGRyZXNzCisqICAgICAgICAgICAgICAgbnVtOiBudW0gcGFnZXMgdG8gdHJhbnNmZXIKKyogT3V0cHV0czogICAgICBQQVNTCisqIERlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcGFyYW1ldGVycyBhbmQgcHV0cyB0aGVtCisqICAgICAgICAgICAgICAgICAgIGludG8gdGhlICJwZW5kaW5nIGNvbW1hbmRzIiBhcnJheS4KKyogICAgICAgICAgICAgICBJdCBkb2VzIG5vdCBwYXJzZSBvciB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycy4KKyogICAgICAgICAgICAgICBUaGUgYXJyYXkgaW5kZXggaXMgc2FtZSBhcyB0aGUgdGFnLgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBDRE1BX0RhdGFfQ01EKHU4IGNtZCwgdTggKmRhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBudW0sIHUxNiBmbGFncykKK3sKKwl1OCBiYW5rOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoMCA9PSBjbWQpCisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkiJXMsIExpbmUgJWQsIElsbGVnYWwgY21kICgwKVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKworCS8qIElmIGEgY29tbWFuZCBvZiBhbm90aGVyIGJhbmsgY29tZXMsIHRoZW4gZmlyc3QgZXhlY3V0ZSAqLworCS8qIHBlbmRpbmcgY29tbWFuZHMgb2YgdGhlIGN1cnJlbnQgYmFuaywgdGhlbiBzZXQgdGhlIG5ldyAqLworCS8qIGJhbmsgYXMgY3VycmVudCBiYW5rICovCisJYmFuayA9IGJsb2NrIC8gKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpOworCWlmIChiYW5rICE9IGluZm8uZmxhc2hfYmFuaykgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJIldpbGwgYWNjZXNzIG5ldyBiYW5rLiBvbGQgYmFuazogJWQsIG5ldyBiYW5rOiAlZFxuIiwKKwkJCWluZm8uZmxhc2hfYmFuaywgYmFuayk7CisJCWlmIChDRE1BX0V4ZWN1dGVfQ01EcygpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNETUFfRXhlY3V0ZV9DTURzIGZhaWwhXG4iKTsKKwkJCXJldHVybiBGQUlMOworCQl9CisJCWluZm8uZmxhc2hfYmFuayA9IGJhbms7CisJfQorCisJaW5mby5wY21kc1tpbmZvLnBjbWRzX251bV0uQ01EID0gY21kOworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLkRhdGFBZGRyID0gZGF0YTsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5CbG9jayA9IGJsb2NrOworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLlBhZ2UgPSBwYWdlOworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLlBhZ2VDb3VudCA9IG51bTsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5EYXRhRGVzdEFkZHIgPSAwOworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLkRhdGFTcmNBZGRyID0gMDsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5NZW1Db3B5Qnl0ZUNudCA9IDA7CisJaW5mby5wY21kc1tpbmZvLnBjbWRzX251bV0uRmxhZ3MgPSBmbGFnczsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5TdGF0dXMgPSAweEIwQjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXUklURV9NQUlOX1NQQVJFX0NNRDoKKwkJQ29udl9NYWluX1NwYXJlX0RhdGFfTG9nMlBoeV9Gb3JtYXQoZGF0YSwgbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9TUEFSRV9DTUQ6CisJCUNvbnZfU3BhcmVfRGF0YV9Mb2cyUGh5X0Zvcm1hdChkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaW5mby5wY21kc19udW0rKzsKKworCWlmIChpbmZvLnBjbWRzX251bSA+PSBNQVhfUEVORElOR19DTURTKSB7CisJCWlmIChDRE1BX0V4ZWN1dGVfQ01EcygpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNETUFfRXhlY3V0ZV9DTURzIGZhaWwhXG4iKTsKKwkJCXJldHVybiBGQUlMOworCQl9CisJfQorCisJcmV0dXJuIFBBU1M7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIENETUFfTWVtQ29weV9DTUQKKyogSW5wdXRzOiAgICAgICBkZXN0OiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uCisqICAgICAgICAgICAgICAgc3JjOiAgcG9pbnRlciB0byBzb3VyY2UKKyogICAgICAgICAgICAgICBjb3VudDogbnVtIGJ5dGVzIHRvIHRyYW5zZmVyCisqIE91dHB1dHM6ICAgICAgUEFTUworKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHBhcmFtZXRlcnMgYW5kIHB1dHMgdGhlbQorKiAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSAicGVuZGluZyBjb21tYW5kcyIgYXJyYXkuCisqICAgICAgICAgICAgICAgSXQgZG9lcyBub3QgcGFyc2Ugb3IgdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMuCisqICAgICAgICAgICAgICAgVGhlIGFycmF5IGluZGV4IGlzIHNhbWUgYXMgdGhlIHRhZy4KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgQ0RNQV9NZW1Db3B5X0NNRCh1OCAqZGVzdCwgdTggKnNyYywgdTMyIGJ5dGVfY250LCB1MTYgZmxhZ3MpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5DTUQgPSBNRU1DT1BZX0NNRDsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5EYXRhQWRkciA9IDA7CisJaW5mby5wY21kc1tpbmZvLnBjbWRzX251bV0uQmxvY2sgPSAwOworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLlBhZ2UgPSAwOworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLlBhZ2VDb3VudCA9IDA7CisJaW5mby5wY21kc1tpbmZvLnBjbWRzX251bV0uRGF0YURlc3RBZGRyID0gZGVzdDsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5EYXRhU3JjQWRkciA9IHNyYzsKKwlpbmZvLnBjbWRzW2luZm8ucGNtZHNfbnVtXS5NZW1Db3B5Qnl0ZUNudCA9IGJ5dGVfY250OworCWluZm8ucGNtZHNbaW5mby5wY21kc19udW1dLkZsYWdzID0gZmxhZ3M7CisJaW5mby5wY21kc1tpbmZvLnBjbWRzX251bV0uU3RhdHVzID0gMHhCMEI7CisKKwlpbmZvLnBjbWRzX251bSsrOworCisJaWYgKGluZm8ucGNtZHNfbnVtID49IE1BWF9QRU5ESU5HX0NNRFMpIHsKKwkJaWYgKENETUFfRXhlY3V0ZV9DTURzKCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ0RNQV9FeGVjdXRlX0NNRHMgZmFpbCFcbiIpOworCQkJcmV0dXJuIEZBSUw7CisJCX0KKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworI2lmIDAKKy8qIFByaW50cyB0aGUgUGVuZGluZ0NNRHMgYXJyYXkgKi8KK3ZvaWQgcHJpbnRfcGVuZGluZ19jbWRzKHZvaWQpCit7CisJdTE2IGk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLnBjbWRzX251bTsgaSsrKSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiXG5pOiAlZFxuIiwgaSk7CisJCXN3aXRjaCAoaW5mby5wY21kc1tpXS5DTUQpIHsKKwkJY2FzZSBFUkFTRV9DTUQ6CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiRXJhc2UgQ29tbWFuZCAoMHgleClcbiIsCisJCQkJaW5mby5wY21kc1tpXS5DTUQpOworCQkJYnJlYWs7CisJCWNhc2UgV1JJVEVfTUFJTl9DTUQ6CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiV3JpdGUgTWFpbiBDb21tYW5kICgweCV4KVxuIiwKKwkJCQlpbmZvLnBjbWRzW2ldLkNNRCk7CisJCQlicmVhazsKKwkJY2FzZSBXUklURV9NQUlOX1NQQVJFX0NNRDoKKwkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJCSJXcml0ZSBNYWluIFNwYXJlIENvbW1hbmQgKDB4JXgpXG4iLAorCQkJCWluZm8ucGNtZHNbaV0uQ01EKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURfTUFJTl9TUEFSRV9DTUQ6CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiUmVhZCBNYWluIFNwYXJlIENvbW1hbmQgKDB4JXgpXG4iLAorCQkJCWluZm8ucGNtZHNbaV0uQ01EKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURfTUFJTl9DTUQ6CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCQkiUmVhZCBNYWluIENvbW1hbmQgKDB4JXgpXG4iLAorCQkJCWluZm8ucGNtZHNbaV0uQ01EKTsKKwkJCWJyZWFrOworCQljYXNlIE1FTUNPUFlfQ01EOgorCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJIk1lbWNvcHkgQ29tbWFuZCAoMHgleClcbiIsCisJCQkJaW5mby5wY21kc1tpXS5DTUQpOworCQkJYnJlYWs7CisJCWNhc2UgRFVNTVlfQ01EOgorCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJIkR1bW15IENvbW1hbmQgKDB4JXgpXG4iLAorCQkJCWluZm8ucGNtZHNbaV0uQ01EKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkJIklsbGVnYWwgQ29tbWFuZCAoMHgleClcbiIsCisJCQkJaW5mby5wY21kc1tpXS5DTUQpOworCQkJYnJlYWs7CisJCX0KKworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkRhdGFBZGRyOiAweCV4XG4iLAorCQkJKHUzMilpbmZvLnBjbWRzW2ldLkRhdGFBZGRyKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJCbG9jazogJWRcbiIsCisJCQlpbmZvLnBjbWRzW2ldLkJsb2NrKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJQYWdlOiAlZFxuIiwKKwkJCWluZm8ucGNtZHNbaV0uUGFnZSk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiUGFnZUNvdW50OiAlZFxuIiwKKwkJCWluZm8ucGNtZHNbaV0uUGFnZUNvdW50KTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJEYXRhRGVzdEFkZHI6IDB4JXhcbiIsCisJCQkodTMyKWluZm8ucGNtZHNbaV0uRGF0YURlc3RBZGRyKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJEYXRhU3JjQWRkcjogMHgleFxuIiwKKwkJCSh1MzIpaW5mby5wY21kc1tpXS5EYXRhU3JjQWRkcik7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiTWVtQ29weUJ5dGVDbnQ6ICVkXG4iLAorCQkJaW5mby5wY21kc1tpXS5NZW1Db3B5Qnl0ZUNudCk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiRmxhZ3M6IDB4JXhcbiIsCisJCQlpbmZvLnBjbWRzW2ldLkZsYWdzKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTdGF0dXM6IDB4JXhcbiIsCisJCQlpbmZvLnBjbWRzW2ldLlN0YXR1cyk7CisJfQorfQorCisvKiBQcmludCB0aGUgQ0RNQSBkZXNjcmlwdG9ycyAqLwordm9pZCBwcmludF9jZG1hX2Rlc2NyaXB0b3JzKHZvaWQpCit7CisJc3RydWN0IGNkbWFfZGVzY3JpcHRvciAqcGM7CisJaW50IGk7CisKKwlwYyA9IChzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yICopaW5mby5jZG1hX2Rlc2NfYnVmOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJcbldpbGwgZHVtcCBjZG1hIGRlc2NyaXB0b3JzOlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby5jZG1hX251bTsgaSsrKSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiXG5pOiAlZFxuIiwgaSk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIk54dFBvaW50ZXJIaTogMHgleCwgTnh0UG9pbnRlckxvOiAweCV4XG4iLAorCQkJcGNbaV0uTnh0UG9pbnRlckhpLCBwY1tpXS5OeHRQb2ludGVyTG8pOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJGbGFzaFBvaW50ZXJIaTogMHgleCwgRmxhc2hQb2ludGVyTG86IDB4JXhcbiIsCisJCQlwY1tpXS5GbGFzaFBvaW50ZXJIaSwgcGNbaV0uRmxhc2hQb2ludGVyTG8pOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkNvbW1hbmRUeXBlOiAweCV4XG4iLAorCQkJcGNbaV0uQ29tbWFuZFR5cGUpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJNZW1BZGRySGk6IDB4JXgsIE1lbUFkZHJMbzogMHgleFxuIiwKKwkJCXBjW2ldLk1lbUFkZHJIaSwgcGNbaV0uTWVtQWRkckxvKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJDb21tYW5kRmxhZ3M6IDB4JXhcbiIsCisJCQlwY1tpXS5Db21tYW5kRmxhZ3MpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkNoYW5uZWw6ICVkLCBTdGF0dXM6IDB4JXhcbiIsCisJCQlwY1tpXS5DaGFubmVsLCBwY1tpXS5TdGF0dXMpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJNZW1Db3B5UG9pbnRlckhpOiAweCV4LCBNZW1Db3B5UG9pbnRlckxvOiAweCV4XG4iLAorCQkJcGNbaV0uTWVtQ29weVBvaW50ZXJIaSwgcGNbaV0uTWVtQ29weVBvaW50ZXJMbyk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIlJlc2VydmVkMTI6IDB4JXgsIFJlc2VydmVkMTM6IDB4JXgsICIKKwkJCSJSZXNlcnZlZDE0OiAweCV4LCBwY21kOiAlZFxuIiwKKwkJCXBjW2ldLlJlc2VydmVkMTIsIHBjW2ldLlJlc2VydmVkMTMsCisJCQlwY1tpXS5SZXNlcnZlZDE0LCBwY1tpXS5wY21kKTsKKwl9Cit9CisKKy8qIFByaW50IHRoZSBNZW1vcnkgY29weSBkZXNjcmlwdG9ycyAqLworc3RhdGljIHZvaWQgcHJpbnRfbWVtY3BfZGVzY3JpcHRvcnModm9pZCkKK3sKKwlzdHJ1Y3QgbWVtY3B5X2Rlc2NyaXB0b3IgKnBtOworCWludCBpOworCisJcG0gPSAoc3RydWN0IG1lbWNweV9kZXNjcmlwdG9yICopaW5mby5tZW1jcF9kZXNjX2J1ZjsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiXG5XaWxsIGR1bXAgbWVtX2NweSBkZXNjcmlwdG9yczpcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGluZm8uY2RtYV9udW07IGkrKykgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlxuaTogJWRcbiIsIGkpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKKwkJCSJOeHRQb2ludGVySGk6IDB4JXgsIE54dFBvaW50ZXJMbzogMHgleFxuIiwKKwkJCXBtW2ldLk54dFBvaW50ZXJIaSwgcG1baV0uTnh0UG9pbnRlckxvKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiU3JjQWRkckhpOiAweCV4LCBTcmNBZGRyTG86IDB4JXhcbiIsCisJCQlwbVtpXS5TcmNBZGRySGksIHBtW2ldLlNyY0FkZHJMbyk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIkRlc3RBZGRySGk6IDB4JXgsIERlc3RBZGRyTG86IDB4JXhcbiIsCisJCQlwbVtpXS5EZXN0QWRkckhpLCBwbVtpXS5EZXN0QWRkckxvKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJYZmVyU2l6ZTogJWRcbiIsCisJCQlwbVtpXS5YZmVyU2l6ZSk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiTWVtQ29weUZsYWdzOiAweCV4XG4iLAorCQkJcG1baV0uTWVtQ29weUZsYWdzKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJNZW1Db3B5U3RhdHVzOiAlZFxuIiwKKwkJCXBtW2ldLk1lbUNvcHlTdGF0dXMpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgInJlc2VydmVkOTogMHgleFxuIiwKKwkJCXBtW2ldLnJlc2VydmVkOSk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAicmVzZXJ2ZWQxMDogMHgleFxuIiwKKwkJCXBtW2ldLnJlc2VydmVkMTApOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgInJlc2VydmVkMTE6IDB4JXhcbiIsCisJCQlwbVtpXS5yZXNlcnZlZDExKTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJyZXNlcnZlZDEyOiAweCV4XG4iLAorCQkJcG1baV0ucmVzZXJ2ZWQxMik7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAicmVzZXJ2ZWQxMzogMHgleFxuIiwKKwkJCXBtW2ldLnJlc2VydmVkMTMpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgInJlc2VydmVkMTQ6IDB4JXhcbiIsCisJCQlwbVtpXS5yZXNlcnZlZDE0KTsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJyZXNlcnZlZDE1OiAweCV4XG4iLAorCQkJcG1baV0ucmVzZXJ2ZWQxNSk7CisJfQorfQorI2VuZGlmCisKKy8qIFJlc2V0IGNkbWFfZGVzY3JpcHRvciBjaGFpbiB0byAwICovCitzdGF0aWMgdm9pZCByZXNldF9jZG1hX2Rlc2MoaW50IGkpCit7CisJc3RydWN0IGNkbWFfZGVzY3JpcHRvciAqcHRyOworCisJQlVHX09OKGkgPj0gTUFYX0RFU0NTKTsKKworCXB0ciA9IChzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yICopaW5mby5jZG1hX2Rlc2NfYnVmOworCisJcHRyW2ldLk54dFBvaW50ZXJIaSA9IDA7CisJcHRyW2ldLk54dFBvaW50ZXJMbyA9IDA7CisJcHRyW2ldLkZsYXNoUG9pbnRlckhpID0gMDsKKwlwdHJbaV0uRmxhc2hQb2ludGVyTG8gPSAwOworCXB0cltpXS5Db21tYW5kVHlwZSA9IDA7CisJcHRyW2ldLk1lbUFkZHJIaSA9IDA7CisJcHRyW2ldLk1lbUFkZHJMbyA9IDA7CisJcHRyW2ldLkNvbW1hbmRGbGFncyA9IDA7CisJcHRyW2ldLkNoYW5uZWwgPSAwOworCXB0cltpXS5TdGF0dXMgPSAwOworCXB0cltpXS5NZW1Db3B5UG9pbnRlckhpID0gMDsKKwlwdHJbaV0uTWVtQ29weVBvaW50ZXJMbyA9IDA7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBDRE1BX1VwZGF0ZUV2ZW50U3RhdHVzCisqIElucHV0czogICAgICAgbm9uZQorKiBPdXRwdXRzOiAgICAgIG5vbmUKKyogRGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgZXZlbnQgc3RhdHVzIG9mIGFsbCB0aGUgY2hhbm5lbHMKKyogICAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIGNvbmRpdGlvbiBpcyByZXBvcnRlZC4KKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordm9pZCBDRE1BX1VwZGF0ZUV2ZW50U3RhdHVzKHZvaWQpCit7CisJaW50IGksIGosIGFjdGl2ZV9jaGFuOworCXN0cnVjdCBjZG1hX2Rlc2NyaXB0b3IgKnB0cjsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJcHRyID0gKHN0cnVjdCBjZG1hX2Rlc2NyaXB0b3IgKilpbmZvLmNkbWFfZGVzY19idWY7CisKKwlmb3IgKGogPSAwOyBqIDwgaW5mby5jZG1hX251bTsgaisrKSB7CisJCS8qIENoZWNrIGZvciB0aGUgZGVzY3JpcHRvciB3aXRoIGZhaWx1cmUgKi8KKwkJaWYgKChwdHJbal0uU3RhdHVzICYgQ01EX0RNQV9ERVNDX0ZBSUwpKQorCQkJYnJlYWs7CisKKwl9CisKKwkvKiBBbGwgdGhlIHByZXZpb3VzIGNtZCdzIHN0YXR1cyBmb3IgdGhpcyBjaGFubmVsIG11c3QgYmUgZ29vZCAqLworCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKwkJaWYgKHB0cltpXS5wY21kICE9IDB4ZmYpCisJCQlpbmZvLnBjbWRzW3B0cltpXS5wY21kXS5TdGF0dXMgPSBDTURfUEFTUzsKKwl9CisKKwkvKiBBYm9ydCB0aGUgY2hhbm5lbCB3aXRoIHR5cGUgMCByZXNldCBjb21tYW5kLiBJdCByZXNldHMgdGhlICovCisJLyogc2VsZWN0ZWQgY2hhbm5lbCBhZnRlciB0aGUgZGVzY3JpcHRvciBjb21wbGV0ZXMgdGhlIGZsYXNoICovCisJLyogb3BlcmF0aW9uIGFuZCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZCBmb3IgdGhlIGRlc2NyaXB0b3IuICovCisJLyogTWVtb3J5IENvcHkgYW5kIFN5bmMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVzY3JpcHRvciB3aWxsICovCisJLyogbm90IGJlIGV4ZWN1dGVkICovCisJYWN0aXZlX2NoYW4gPSBpb3JlYWQzMihGbGFzaFJlZyArIENITkxfQUNUSVZFKTsKKwlpZiAoKGFjdGl2ZV9jaGFuICYgKDEgPDwgaW5mby5mbGFzaF9iYW5rKSkgPT0gKDEgPDwgaW5mby5mbGFzaF9iYW5rKSkgeworCQlpb3dyaXRlMzIoTU9ERV8wMiB8ICgwIDw8IDQpLCBGbGFzaE1lbSk7IC8qIFR5cGUgMCByZXNldCAqLworCQlpb3dyaXRlMzIoKDB4RiA8PCA0KSB8IGluZm8uZmxhc2hfYmFuaywgRmxhc2hNZW0gKyAweDEwKTsKKwl9IGVsc2UgeyAvKiBTaG91bGQgbm90IHJlYWNoZWQgaGVyZSAqLworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yISBVc2VkIGJhbmsgaXMgbm90IHNldCBpbiIKKwkJCSIgcmVnIENITkxfQUNUSVZFXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNkbWFfdHJhbnModTE2IGNoYW4pCit7CisJdTMyIGFkZHI7CisKKwlhZGRyID0gaW5mby5jZG1hX2Rlc2M7CisKKwlpb3dyaXRlMzIoTU9ERV8xMCB8IChjaGFuIDw8IDI0KSwgRmxhc2hNZW0pOworCWlvd3JpdGUzMigoMSA8PCA3KSB8IGNoYW4sIEZsYXNoTWVtICsgMHgxMCk7CisKKwlpb3dyaXRlMzIoTU9ERV8xMCB8IChjaGFuIDw8IDI0KSB8ICgoMHgwRkZGRiAmIChhZGRyID4+IDE2KSkgPDwgOCksCisJCUZsYXNoTWVtKTsKKwlpb3dyaXRlMzIoKDEgPDwgNykgfCAoMSA8PCA0KSB8IDAsIEZsYXNoTWVtICsgMHgxMCk7CisKKwlpb3dyaXRlMzIoTU9ERV8xMCB8IChjaGFuIDw8IDI0KSB8ICgoMHgwRkZGRiAmIGFkZHIpIDw8IDgpLCBGbGFzaE1lbSk7CisJaW93cml0ZTMyKCgxIDw8IDcpIHwgKDEgPDwgNSkgfCAwLCBGbGFzaE1lbSArIDB4MTApOworCisJaW93cml0ZTMyKE1PREVfMTAgfCAoY2hhbiA8PCAyNCksIEZsYXNoTWVtKTsKKwlpb3dyaXRlMzIoKDEgPDwgNykgfCAoMSA8PCA1KSB8ICgxIDw8IDQpIHwgMCwgRmxhc2hNZW0gKyAweDEwKTsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIENETUFfRXhlY3V0ZV9DTURzIChmb3IgdXNlIHdpdGggQ01EX0RNQSkKKyogSW5wdXRzOiAgICAgICB0YWdfY291bnQ6ICB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgY21kcyB0byBkbworKiBPdXRwdXRzOiAgICAgIFBBU1MvRkFJTAorKiBEZXNjcmlwdGlvbjogIEJ1aWxkIHRoZSBTRE1BIGNoYWluKHMpIGJ5IG1ha2luZyBvbmUgQ01ELURNQSBkZXNjcmlwdG9yCisqICAgICAgICAgICAgICAgZm9yIGVhY2ggcGVuZGluZyBjb21tYW5kLCBzdGFydCB0aGUgQ0RNQSBlbmdpbmUsIGFuZCByZXR1cm4uCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IENETUFfRXhlY3V0ZV9DTURzKHZvaWQpCit7CisJaW50IGksIHJldDsKKwl1NjQgZmxhc2hfYWRkOworCXUzMiBwdHI7CisJZG1hX2FkZHJfdCBtYXBfYWRkciwgbmV4dF9wdHI7CisJdTE2IHN0YXR1cyA9IFBBU1M7CisJdTE2IHRtcF9jOworCXN0cnVjdCBjZG1hX2Rlc2NyaXB0b3IgKnBjOworCXN0cnVjdCBtZW1jcHlfZGVzY3JpcHRvciAqcG07CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCS8qIE5vIHBlbmRpbmcgY21kcyB0byBleGVjdXRlLCBqdXN0IGV4aXQgKi8KKwlpZiAoMCA9PSBpbmZvLnBjbWRzX251bSkgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwKKwkJCSJObyBwZW5kaW5nIGNtZHMgdG8gZXhlY3V0ZS4gSnVzdCBleGl0LlxuIik7CisJCXJldHVybiBQQVNTOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfREVTQ1M7IGkrKykKKwkJcmVzZXRfY2RtYV9kZXNjKGkpOworCisJcGMgPSAoc3RydWN0IGNkbWFfZGVzY3JpcHRvciAqKWluZm8uY2RtYV9kZXNjX2J1ZjsKKwlwbSA9IChzdHJ1Y3QgbWVtY3B5X2Rlc2NyaXB0b3IgKilpbmZvLm1lbWNwX2Rlc2NfYnVmOworCisJaW5mby5jZG1hX2Rlc2MgPSB2aXJ0X3RvX2J1cyhpbmZvLmNkbWFfZGVzY19idWYpOworCWluZm8ubWVtY3BfZGVzYyA9IHZpcnRfdG9fYnVzKGluZm8ubWVtY3BfZGVzY19idWYpOworCW5leHRfcHRyID0gaW5mby5jZG1hX2Rlc2M7CisJaW5mby5jZG1hX251bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby5wY21kc19udW07IGkrKykgeworCQlpZiAoaW5mby5wY21kc1tpXS5CbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQkJaW5mby5wY21kc1tpXS5TdGF0dXMgPSBDTURfTk9UX0RPTkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCW5leHRfcHRyICs9IHNpemVvZihzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yKTsKKwkJcGNbaW5mby5jZG1hX251bV0uTnh0UG9pbnRlckhpID0gbmV4dF9wdHIgPj4gMTY7CisJCXBjW2luZm8uY2RtYV9udW1dLk54dFBvaW50ZXJMbyA9IG5leHRfcHRyICYgMHhmZmZmOworCisJCS8qIFVzZSB0aGUgQmxvY2sgb2Zmc2V0IHdpdGhpbiBhIGJhbmsgKi8KKwkJdG1wX2MgPSBpbmZvLnBjbWRzW2ldLkJsb2NrIC8KKwkJCShEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKTsKKwkJZmxhc2hfYWRkID0gKHU2NCkoaW5mby5wY21kc1tpXS5CbG9jayAtIHRtcF9jICoKKwkJCShEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKSkgKgorCQkJRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSArCisJCQkodTY0KShpbmZvLnBjbWRzW2ldLlBhZ2UpICoKKwkJCURldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKworCQlwdHIgPSBNT0RFXzEwIHwgKGluZm8uZmxhc2hfYmFuayA8PCAyNCkgfAorCQkJKHUzMilHTE9CX3U2NF9EaXYoZmxhc2hfYWRkLAorCQkJCURldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSk7CisJCXBjW2luZm8uY2RtYV9udW1dLkZsYXNoUG9pbnRlckhpID0gcHRyID4+IDE2OworCQlwY1tpbmZvLmNkbWFfbnVtXS5GbGFzaFBvaW50ZXJMbyA9IHB0ciAmIDB4ZmZmZjsKKworCQlpZiAoKGluZm8ucGNtZHNbaV0uQ01EID09IFdSSVRFX01BSU5fU1BBUkVfQ01EKSB8fAorCQkJKGluZm8ucGNtZHNbaV0uQ01EID09IFJFQURfTUFJTl9TUEFSRV9DTUQpKSB7CisJCQkvKiBEZXNjcmlwdG9yIHRvIHNldCBNYWluK1NwYXJlIEFjY2VzcyBNb2RlICovCisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kVHlwZSA9IDB4NDM7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kRmxhZ3MgPQorCQkJCSgwIDw8IDEwKSB8ICgxIDw8IDkpIHwgKDAgPDwgOCkgfCAweDQwOworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckhpID0gMDsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUFkZHJMbyA9IDA7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5DaGFubmVsID0gMDsKKwkJCXBjW2luZm8uY2RtYV9udW1dLlN0YXR1cyA9IDA7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5wY21kID0gaTsKKworCQkJaW5mby5jZG1hX251bSsrOworCQkJQlVHX09OKGluZm8uY2RtYV9udW0gPj0gTUFYX0RFU0NTKTsKKworCQkJcmVzZXRfY2RtYV9kZXNjKGluZm8uY2RtYV9udW0pOworCQkJbmV4dF9wdHIgKz0gc2l6ZW9mKHN0cnVjdCBjZG1hX2Rlc2NyaXB0b3IpOworCQkJcGNbaW5mby5jZG1hX251bV0uTnh0UG9pbnRlckhpID0gbmV4dF9wdHIgPj4gMTY7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5OeHRQb2ludGVyTG8gPSBuZXh0X3B0ciAmIDB4ZmZmZjsKKwkJCXBjW2luZm8uY2RtYV9udW1dLkZsYXNoUG9pbnRlckhpID0gcHRyID4+IDE2OworCQkJcGNbaW5mby5jZG1hX251bV0uRmxhc2hQb2ludGVyTG8gPSBwdHIgJiAweGZmZmY7CisJCX0KKworCQlzd2l0Y2ggKGluZm8ucGNtZHNbaV0uQ01EKSB7CisJCWNhc2UgRVJBU0VfQ01EOgorCQkJcGNbaW5mby5jZG1hX251bV0uQ29tbWFuZFR5cGUgPSAxOworCQkJcGNbaW5mby5jZG1hX251bV0uQ29tbWFuZEZsYWdzID0KKwkJCQkoMCA8PCAxMCkgfCAoMSA8PCA5KSB8ICgwIDw8IDgpIHwgMHg0MDsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUFkZHJIaSA9IDA7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5NZW1BZGRyTG8gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBXUklURV9NQUlOX0NNRDoKKwkJCXBjW2luZm8uY2RtYV9udW1dLkNvbW1hbmRUeXBlID0KKwkJCQkweDIxMDAgfCBpbmZvLnBjbWRzW2ldLlBhZ2VDb3VudDsKKwkJCXBjW2luZm8uY2RtYV9udW1dLkNvbW1hbmRGbGFncyA9CisJCQkJKDAgPDwgMTApIHwgKDEgPDwgOSkgfCAoMCA8PCA4KSB8IDB4NDA7CisJCQltYXBfYWRkciA9IHZpcnRfdG9fYnVzKGluZm8ucGNtZHNbaV0uRGF0YUFkZHIpOworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckhpID0gbWFwX2FkZHIgPj4gMTY7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5NZW1BZGRyTG8gPSBtYXBfYWRkciAmIDB4ZmZmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVBRF9NQUlOX0NNRDoKKwkJCXBjW2luZm8uY2RtYV9udW1dLkNvbW1hbmRUeXBlID0KKwkJCQkweDIwMDAgfCBpbmZvLnBjbWRzW2ldLlBhZ2VDb3VudDsKKwkJCXBjW2luZm8uY2RtYV9udW1dLkNvbW1hbmRGbGFncyA9CisJCQkJKDAgPDwgMTApIHwgKDEgPDwgOSkgfCAoMCA8PCA4KSB8IDB4NDA7CisJCQltYXBfYWRkciA9IHZpcnRfdG9fYnVzKGluZm8ucGNtZHNbaV0uRGF0YUFkZHIpOworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckhpID0gbWFwX2FkZHIgPj4gMTY7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5NZW1BZGRyTG8gPSBtYXBfYWRkciAmIDB4ZmZmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgV1JJVEVfTUFJTl9TUEFSRV9DTUQ6CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kVHlwZSA9CisJCQkJMHgyMTAwIHwgaW5mby5wY21kc1tpXS5QYWdlQ291bnQ7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kRmxhZ3MgPQorCQkJCSgwIDw8IDEwKSB8ICgxIDw8IDkpIHwgKDAgPDwgOCkgfCAweDQwOworCQkJbWFwX2FkZHIgPSB2aXJ0X3RvX2J1cyhpbmZvLnBjbWRzW2ldLkRhdGFBZGRyKTsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUFkZHJIaSA9IG1hcF9hZGRyID4+IDE2OworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckxvID0gbWFwX2FkZHIgJiAweGZmZmY7CisJCQlicmVhazsKKworCQljYXNlIFJFQURfTUFJTl9TUEFSRV9DTUQ6CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kVHlwZSA9CisJCQkJMHgyMDAwIHwgaW5mby5wY21kc1tpXS5QYWdlQ291bnQ7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kRmxhZ3MgPQorCQkJCSgwIDw8IDEwKSB8ICgxIDw8IDkpIHwgKDAgPDwgOCkgfCAweDQwOworCQkJbWFwX2FkZHIgPSB2aXJ0X3RvX2J1cyhpbmZvLnBjbWRzW2ldLkRhdGFBZGRyKTsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUFkZHJIaSA9IG1hcF9hZGRyID4+IDE2OworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckxvID0gbWFwX2FkZHIgJiAweGZmZmY7CisJCQlicmVhazsKKworCQljYXNlIE1FTUNPUFlfQ01EOgorCQkJcGNbaW5mby5jZG1hX251bV0uQ29tbWFuZFR5cGUgPSAweEZGRkY7IC8qIE5PUCBjbWQgKi8KKwkJCS8qIFNldCBiaXQgMTEgdG8gbGV0IHRoZSBDRE1BIGVuZ2luZSBjb250aW51ZSB0byAqLworCQkJLyogZXhlY3V0ZSBvbmx5IGFmdGVyIGl0IGhhcyBmaW5pc2hlZCBwcm9jZXNzaW5nICAgKi8KKwkJCS8qIHRoZSBtZW1jb3B5IGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCS8qIEFsc28gc2V0IGJpdCAxMCBhbmQgYml0IDkgdG8gMSAgICAgICAgICAgICAgICAgICovCisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kRmxhZ3MgPSAweDBFNDA7CisJCQltYXBfYWRkciA9IGluZm8ubWVtY3BfZGVzYyArIGluZm8uY2RtYV9udW0gKgorCQkJCQlzaXplb2Yoc3RydWN0IG1lbWNweV9kZXNjcmlwdG9yKTsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUNvcHlQb2ludGVySGkgPSBtYXBfYWRkciA+PiAxNjsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUNvcHlQb2ludGVyTG8gPSBtYXBfYWRkciAmIDB4ZmZmZjsKKworCQkJcG1baW5mby5jZG1hX251bV0uTnh0UG9pbnRlckhpID0gMDsKKwkJCXBtW2luZm8uY2RtYV9udW1dLk54dFBvaW50ZXJMbyA9IDA7CisKKwkJCW1hcF9hZGRyID0gdmlydF90b19idXMoaW5mby5wY21kc1tpXS5EYXRhU3JjQWRkcik7CisJCQlwbVtpbmZvLmNkbWFfbnVtXS5TcmNBZGRySGkgPSBtYXBfYWRkciA+PiAxNjsKKwkJCXBtW2luZm8uY2RtYV9udW1dLlNyY0FkZHJMbyA9IG1hcF9hZGRyICYgMHhmZmZmOworCQkJbWFwX2FkZHIgPSB2aXJ0X3RvX2J1cyhpbmZvLnBjbWRzW2ldLkRhdGFEZXN0QWRkcik7CisJCQlwbVtpbmZvLmNkbWFfbnVtXS5EZXN0QWRkckhpID0gbWFwX2FkZHIgPj4gMTY7CisJCQlwbVtpbmZvLmNkbWFfbnVtXS5EZXN0QWRkckxvID0gbWFwX2FkZHIgJiAweGZmZmY7CisKKwkJCXBtW2luZm8uY2RtYV9udW1dLlhmZXJTaXplID0KKwkJCQlpbmZvLnBjbWRzW2ldLk1lbUNvcHlCeXRlQ250OworCQkJcG1baW5mby5jZG1hX251bV0uTWVtQ29weUZsYWdzID0KKwkJCQkoMCA8PCAxNSB8IDAgPDwgMTQgfCAyNyA8PCA4IHwgMHg0MCk7CisJCQlwbVtpbmZvLmNkbWFfbnVtXS5NZW1Db3B5U3RhdHVzID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRFVNTVlfQ01EOgorCQlkZWZhdWx0OgorCQkJcGNbaW5mby5jZG1hX251bV0uQ29tbWFuZFR5cGUgPSAwWEZGRkY7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kRmxhZ3MgPQorCQkJCSgwIDw8IDEwKSB8ICgxIDw8IDkpIHwgKDAgPDwgOCkgfCAweDQwOworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckhpID0gMDsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk1lbUFkZHJMbyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXBjW2luZm8uY2RtYV9udW1dLkNoYW5uZWwgPSAwOworCQlwY1tpbmZvLmNkbWFfbnVtXS5TdGF0dXMgPSAwOworCQlwY1tpbmZvLmNkbWFfbnVtXS5wY21kID0gaTsKKworCQlpbmZvLmNkbWFfbnVtKys7CisJCUJVR19PTihpbmZvLmNkbWFfbnVtID49IE1BWF9ERVNDUyk7CisKKwkJaWYgKChpbmZvLnBjbWRzW2ldLkNNRCA9PSBXUklURV9NQUlOX1NQQVJFX0NNRCkgfHwKKwkJCShpbmZvLnBjbWRzW2ldLkNNRCA9PSBSRUFEX01BSU5fU1BBUkVfQ01EKSkgeworCQkJLyogRGVzY3JpcHRvciB0byBzZXQgYmFjayBNYWluIEFyZWEgQWNjZXNzIE1vZGUgKi8KKwkJCXJlc2V0X2NkbWFfZGVzYyhpbmZvLmNkbWFfbnVtKTsKKwkJCW5leHRfcHRyICs9IHNpemVvZihzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yKTsKKwkJCXBjW2luZm8uY2RtYV9udW1dLk54dFBvaW50ZXJIaSA9IG5leHRfcHRyID4+IDE2OworCQkJcGNbaW5mby5jZG1hX251bV0uTnh0UG9pbnRlckxvID0gbmV4dF9wdHIgJiAweGZmZmY7CisKKwkJCXBjW2luZm8uY2RtYV9udW1dLkZsYXNoUG9pbnRlckhpID0gcHRyID4+IDE2OworCQkJcGNbaW5mby5jZG1hX251bV0uRmxhc2hQb2ludGVyTG8gPSBwdHIgJiAweGZmZmY7CisKKwkJCXBjW2luZm8uY2RtYV9udW1dLkNvbW1hbmRUeXBlID0gMHg0MjsKKwkJCXBjW2luZm8uY2RtYV9udW1dLkNvbW1hbmRGbGFncyA9CisJCQkJKDAgPDwgMTApIHwgKDEgPDwgOSkgfCAoMCA8PCA4KSB8IDB4NDA7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5NZW1BZGRySGkgPSAwOworCQkJcGNbaW5mby5jZG1hX251bV0uTWVtQWRkckxvID0gMDsKKworCQkJcGNbaW5mby5jZG1hX251bV0uQ2hhbm5lbCA9IDA7CisJCQlwY1tpbmZvLmNkbWFfbnVtXS5TdGF0dXMgPSAwOworCQkJcGNbaW5mby5jZG1hX251bV0ucGNtZCA9IGk7CisKKwkJCWluZm8uY2RtYV9udW0rKzsKKwkJCUJVR19PTihpbmZvLmNkbWFfbnVtID49IE1BWF9ERVNDUyk7CisJCX0KKwl9CisKKwkvKiBBZGQgYSBkdW1teSBkZXNjcmlwdG9yIGF0IGVuZCBvZiB0aGUgQ0RNQSBjaGFpbiAqLworCXJlc2V0X2NkbWFfZGVzYyhpbmZvLmNkbWFfbnVtKTsKKwlwdHIgPSBNT0RFXzEwIHwgKGluZm8uZmxhc2hfYmFuayA8PCAyNCk7CisJcGNbaW5mby5jZG1hX251bV0uRmxhc2hQb2ludGVySGkgPSBwdHIgPj4gMTY7CisJcGNbaW5mby5jZG1hX251bV0uRmxhc2hQb2ludGVyTG8gPSBwdHIgJiAweGZmZmY7CisJcGNbaW5mby5jZG1hX251bV0uQ29tbWFuZFR5cGUgPSAweEZGRkY7IC8qIE5PUCBjb21tYW5kICovCisJLyogU2V0IENvbW1hbmQgRmxhZ3MgZm9yIHRoZSBsYXN0IENETUEgZGVzY3JpcHRvcjogKi8KKwkvKiBzZXQgQ29udGludWUgYml0IChiaXQgOSkgdG8gMCBhbmQgSW50ZXJydXB0IGJpdCAoYml0IDgpIHRvIDEgKi8KKwlwY1tpbmZvLmNkbWFfbnVtXS5Db21tYW5kRmxhZ3MgPQorCQkoMCA8PCAxMCkgfCAoMCA8PCA5KSB8ICgxIDw8IDgpIHwgMHg0MDsKKwlwY1tpbmZvLmNkbWFfbnVtXS5wY21kID0gMHhmZjsgLyogU2V0IGl0IHRvIGFuIGlsbGVnYWwgdmFsdWUgKi8KKwlpbmZvLmNkbWFfbnVtKys7CisJQlVHX09OKGluZm8uY2RtYV9udW0gPj0gTUFYX0RFU0NTKTsKKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIEdMT0JBTF9JTlRfRU5BQkxFKTsgIC8qIEVuYWJsZSBJbnRlcnJ1cHQgKi8KKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCS8qIFdhaXQgZm9yIERNQSB0byBiZSBlbmFibGVkIGJlZm9yZSBpc3N1aW5nIHRoZSBuZXh0IGNvbW1hbmQgKi8KKwl3aGlsZSAoIShpb3JlYWQzMihGbGFzaFJlZyArIERNQV9FTkFCTEUpICYgRE1BX0VOQUJMRV9fRkxBRykpCisJCTsKKwljZG1hX3RyYW5zKGluZm8uZmxhc2hfYmFuayk7CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8uY29tcGxldGUsIDUwICogSFopOworCWlmICghcmV0KQorCQlwcmludGsoS0VSTl9FUlIgIldhaXQgZm9yIGNvbXBsZXRpb24gdGltZW91dCAiCisJCQkiaW4gJXMsIExpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJc3RhdHVzID0gaW5mby5yZXQ7CisKKwlpbmZvLnBjbWRzX251bSA9IDA7IC8qIENsZWFyIHRoZSBwZW5kaW5nIGNtZHMgbnVtYmVyIHRvIDAgKi8KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBpc19jZG1hX2ludGVycnVwdCh2b2lkKQoreworCXUzMiBpbnRzX2IwLCBpbnRzX2IxLCBpbnRzX2IyLCBpbnRzX2IzLCBpbnRzX2NkbWE7CisJdTMyIGludF9lbl9tYXNrOworCXUzMiBjZG1hX2ludF9lbl9tYXNrOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwkvKiBTZXQgdGhlIGdsb2JhbCBFbmFibGUgbWFza3MgZm9yIG9ubHkgdGhvc2UgaW50ZXJydXB0cworCSAqIHRoYXQgYXJlIHN1cHBvcnRlZCAqLworCWNkbWFfaW50X2VuX21hc2sgPSAoRE1BX0lOVFJfX0RFU0NfQ09NUF9DSEFOTkVMMCB8CisJCQlETUFfSU5UUl9fREVTQ19DT01QX0NIQU5ORUwxIHwKKwkJCURNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDIgfAorCQkJRE1BX0lOVFJfX0RFU0NfQ09NUF9DSEFOTkVMMyB8CisJCQlETUFfSU5UUl9fTUVNQ09QWV9ERVNDX0NPTVApOworCisJaW50X2VuX21hc2sgPSAoSU5UUl9TVEFUVVMwX19FQ0NfRVJSIHwKKwkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwgfAorCQlJTlRSX1NUQVRVUzBfX0VSQVNFX0ZBSUwpOworCisJaW50c19iMCA9IGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMwKSAmIGludF9lbl9tYXNrOworCWludHNfYjEgPSBpb3JlYWQzMihGbGFzaFJlZyArIElOVFJfU1RBVFVTMSkgJiBpbnRfZW5fbWFzazsKKwlpbnRzX2IyID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzIpICYgaW50X2VuX21hc2s7CisJaW50c19iMyA9IGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMzKSAmIGludF9lbl9tYXNrOworCWludHNfY2RtYSA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0lOVFIpICYgY2RtYV9pbnRfZW5fbWFzazsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICJpbnRzX2JhbmswIHRvIGludHNfYmFuazM6ICIKKwkJCSIweCV4LCAweCV4LCAweCV4LCAweCV4LCBpbnRzX2NkbWE6IDB4JXhcbiIsCisJCQlpbnRzX2IwLCBpbnRzX2IxLCBpbnRzX2IyLCBpbnRzX2IzLCBpbnRzX2NkbWEpOworCisJaWYgKGludHNfYjAgfHwgaW50c19iMSB8fCBpbnRzX2IyIHx8IGludHNfYjMgfHwgaW50c19jZG1hKSB7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWlvd3JpdGUzMihpbnRzX2IwLCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMCk7CisJCWlvd3JpdGUzMihpbnRzX2IxLCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMSk7CisJCWlvd3JpdGUzMihpbnRzX2IyLCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMik7CisJCWlvd3JpdGUzMihpbnRzX2IzLCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMyk7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkJIk5vdCBhIE5BTkQgY29udHJvbGxlciBpbnRlcnJ1cHQhIElnbm9yZSBpdC5cbiIpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9ldmVudF9zdGF0dXModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yICpwdHI7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXB0ciA9IChzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yICopaW5mby5jZG1hX2Rlc2NfYnVmOworCisJZm9yIChpID0gMDsgaSA8IGluZm8uY2RtYV9udW07IGkrKykgeworCQlpZiAocHRyW2ldLnBjbWQgIT0gMHhmZikKKwkJCWluZm8ucGNtZHNbcHRyW2ldLnBjbWRdLlN0YXR1cyA9IENNRF9QQVNTOworCQlpZiAoKHB0cltpXS5Db21tYW5kVHlwZSA9PSAweDQxKSB8fAorCQkJKHB0cltpXS5Db21tYW5kVHlwZSA9PSAweDQyKSB8fAorCQkJKHB0cltpXS5Db21tYW5kVHlwZSA9PSAweDQzKSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoaW5mby5wY21kc1twdHJbaV0ucGNtZF0uQ01EKSB7CisJCWNhc2UgUkVBRF9NQUlOX1NQQVJFX0NNRDoKKwkJCUNvbnZfTWFpbl9TcGFyZV9EYXRhX1BoeTJMb2dfRm9ybWF0KAorCQkJCWluZm8ucGNtZHNbcHRyW2ldLnBjbWRdLkRhdGFBZGRyLAorCQkJCWluZm8ucGNtZHNbcHRyW2ldLnBjbWRdLlBhZ2VDb3VudCk7CisJCQlicmVhazsKKwkJY2FzZSBSRUFEX1NQQVJFX0NNRDoKKwkJCUNvbnZfU3BhcmVfRGF0YV9QaHkyTG9nX0Zvcm1hdCgKKwkJCQlpbmZvLnBjbWRzW3B0cltpXS5wY21kXS5EYXRhQWRkcik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHUxNiBkb19lY2NfZm9yX2Rlc2ModTMyIGNoLCB1OCAqYnVmLCB1MTYgcGFnZSkKK3sKKwl1MTYgZXZlbnQgPSBFVkVOVF9OT05FOworCXUxNiBlcnJfYnl0ZTsKKwl1MTYgZXJyX3BhZ2UgPSAwOworCXU4IGVycl9zZWN0b3I7CisJdTggZXJyX2RldmljZTsKKwl1MTYgZWNjX2NvcnJlY3Rpb25faW5mbzsKKwl1MTYgZXJyX2FkZHJlc3M7CisJdTMyIGVjY1NlY3RvclNpemU7CisJdTggKmVycl9wb3M7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZWNjU2VjdG9yU2l6ZSA9IEVDQ19TRUNUT1JfU0laRSAqIChEZXZpY2VJbmZvLndEZXZpY2VzQ29ubmVjdGVkKTsKKworCWRvIHsKKwkJaWYgKDAgPT0gY2gpCisJCQllcnJfcGFnZSA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRVJSX1BBR0VfQUREUjApOworCQllbHNlIGlmICgxID09IGNoKQorCQkJZXJyX3BhZ2UgPSBpb3JlYWQzMihGbGFzaFJlZyArIEVSUl9QQUdFX0FERFIxKTsKKwkJZWxzZSBpZiAoMiA9PSBjaCkKKwkJCWVycl9wYWdlID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBFUlJfUEFHRV9BRERSMik7CisJCWVsc2UgaWYgKDMgPT0gY2gpCisJCQllcnJfcGFnZSA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRVJSX1BBR0VfQUREUjMpOworCisJCWVycl9hZGRyZXNzID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBFQ0NfRVJST1JfQUREUkVTUyk7CisJCWVycl9ieXRlID0gZXJyX2FkZHJlc3MgJiBFQ0NfRVJST1JfQUREUkVTU19fT0ZGU0VUOworCQllcnJfc2VjdG9yID0gKChlcnJfYWRkcmVzcyAmCisJCQlFQ0NfRVJST1JfQUREUkVTU19fU0VDVE9SX05SKSA+PiAxMik7CisKKwkJZWNjX2NvcnJlY3Rpb25faW5mbyA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRVJSX0NPUlJFQ1RJT05fSU5GTyk7CisJCWVycl9kZXZpY2UgPSAoKGVjY19jb3JyZWN0aW9uX2luZm8gJgorCQkJRVJSX0NPUlJFQ1RJT05fSU5GT19fREVWSUNFX05SKSA+PiA4KTsKKworCQlpZiAoZWNjX2NvcnJlY3Rpb25faW5mbyAmIEVSUl9DT1JSRUNUSU9OX0lORk9fX0VSUk9SX1RZUEUpIHsKKwkJCWV2ZW50ID0gRVZFTlRfVU5DT1JSRUNUQUJMRV9EQVRBX0VSUk9SOworCQl9IGVsc2UgeworCQkJZXZlbnQgPSBFVkVOVF9DT1JSRUNUQUJMRV9EQVRBX0VSUk9SX0ZJWEVEOworCQkJaWYgKGVycl9ieXRlIDwgRUNDX1NFQ1RPUl9TSVpFKSB7CisJCQkJZXJyX3BvcyA9IGJ1ZiArCisJCQkJCShlcnJfcGFnZSAtIHBhZ2UpICoKKwkJCQkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplICsKKwkJCQkJZXJyX3NlY3RvciAqIGVjY1NlY3RvclNpemUgKworCQkJCQllcnJfYnl0ZSAqCisJCQkJCURldmljZUluZm8ud0RldmljZXNDb25uZWN0ZWQgKworCQkJCQllcnJfZGV2aWNlOworCQkJCSplcnJfcG9zIF49IGVjY19jb3JyZWN0aW9uX2luZm8gJgorCQkJCQlFUlJfQ09SUkVDVElPTl9JTkZPX19CWVRFTUFTSzsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKCEoZWNjX2NvcnJlY3Rpb25faW5mbyAmIEVSUl9DT1JSRUNUSU9OX0lORk9fX0xBU1RfRVJSX0lORk8pKTsKKworCXJldHVybiBldmVudDsKK30KKworc3RhdGljIHUxNiBwcm9jZXNzX2VjY19pbnQodTMyIGMsIHUxNiAqcF9kZXNjX251bSkKK3sKKwlzdHJ1Y3QgY2RtYV9kZXNjcmlwdG9yICpwdHI7CisJdTE2IGo7CisJaW50IGV2ZW50ID0gRVZFTlRfUEFTUzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoYyAhPSBpbmZvLmZsYXNoX2JhbmspCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IhaW5mby5mbGFzaF9iYW5rIGlzICVkLCB3aGlsZSBjIGlzICVkXG4iLAorCQkJCWluZm8uZmxhc2hfYmFuaywgYyk7CisKKwlwdHIgPSAoc3RydWN0IGNkbWFfZGVzY3JpcHRvciAqKWluZm8uY2RtYV9kZXNjX2J1ZjsKKworCWZvciAoaiA9IDA7IGogPCBpbmZvLmNkbWFfbnVtOyBqKyspCisJCWlmICgocHRyW2pdLlN0YXR1cyAmIENNRF9ETUFfREVTQ19DT01QKSAhPSBDTURfRE1BX0RFU0NfQ09NUCkKKwkJCWJyZWFrOworCisJKnBfZGVzY19udW0gPSBqOyAvKiBQYXNzIHRoZSBkZXNjcmlwdGVyIG51bWJlciBmb3VuZCBoZXJlICovCisKKwlpZiAoaiA+PSBpbmZvLmNkbWFfbnVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuIG5vdCBmaW5kIHRoZSBjb3JyZWN0IGRlc2NyaXB0b3IgbnVtYmVyICIKKwkJCSJ3aGVuIGVjYyBpbnRlcnJ1cHQgdHJpZ2dlcmVkISIKKwkJCSJpbmZvLmNkbWFfbnVtOiAlZCwgajogJWRcbiIsIGluZm8uY2RtYV9udW0sIGopOworCQlyZXR1cm4gRVZFTlRfVU5DT1JSRUNUQUJMRV9EQVRBX0VSUk9SOworCX0KKworCWV2ZW50ID0gZG9fZWNjX2Zvcl9kZXNjKGMsIGluZm8ucGNtZHNbcHRyW2pdLnBjbWRdLkRhdGFBZGRyLAorCQlpbmZvLnBjbWRzW3B0cltqXS5wY21kXS5QYWdlKTsKKworCWlmIChFVkVOVF9VTkNPUlJFQ1RBQkxFX0RBVEFfRVJST1IgPT0gZXZlbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmNvcnJlY3RhYmxlIEVDQyBlcnJvciEiCisJCQkiaW5mby5jZG1hX251bTogJWQsIGo6ICVkLCAiCisJCQkicGVuZGluZyBjbWQgQ01EOiAweCV4LCAiCisJCQkiQmxvY2s6IDB4JXgsIFBhZ2U6IDB4JXgsIFBhZ2VDb3VudDogMHgleFxuIiwKKwkJCWluZm8uY2RtYV9udW0sIGosCisJCQlpbmZvLnBjbWRzW3B0cltqXS5wY21kXS5DTUQsCisJCQlpbmZvLnBjbWRzW3B0cltqXS5wY21kXS5CbG9jaywKKwkJCWluZm8ucGNtZHNbcHRyW2pdLnBjbWRdLlBhZ2UsCisJCQlpbmZvLnBjbWRzW3B0cltqXS5wY21kXS5QYWdlQ291bnQpOworCisJCWlmIChwdHJbal0ucGNtZCAhPSAweGZmKQorCQkJaW5mby5wY21kc1twdHJbal0ucGNtZF0uU3RhdHVzID0gQ01EX0ZBSUw7CisJCUNETUFfVXBkYXRlRXZlbnRTdGF0dXMoKTsKKwl9CisKKwlyZXR1cm4gZXZlbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcHJvZ19lcmFzZV9mYWlsX2ludCh1MTYgZGVzY19udW0pCit7CisJc3RydWN0IGNkbWFfZGVzY3JpcHRvciAqcHRyOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlwdHIgPSAoc3RydWN0IGNkbWFfZGVzY3JpcHRvciAqKWluZm8uY2RtYV9kZXNjX2J1ZjsKKworCWlmIChwdHJbZGVzY19udW1dLnBjbWQgIT0gMHhGRikKKwkJaW5mby5wY21kc1twdHJbZGVzY19udW1dLnBjbWRdLlN0YXR1cyA9IENNRF9GQUlMOworCisJQ0RNQV9VcGRhdGVFdmVudFN0YXR1cygpOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgQ0RNQV9FdmVudF9TdGF0dXMgKGZvciB1c2Ugd2l0aCBDTURfRE1BKQorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBFdmVudF9TdGF0dXMgY29kZQorKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGludGVycnVwdCBoYXMgaGFwcGVuZWQKKyogICAgICAgICAgICAgICBJdCByZWFkcyB0aGUgSFcgc3RhdHVzIHJlZ2lzdGVyIGFuZCAuLi50YmQKKyogICAgICAgICAgICAgICBJdCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBldmVudCBzdGF0dXMKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2ICBDRE1BX0V2ZW50X1N0YXR1cyh2b2lkKQoreworCXUzMiBpbnRzX2FkZHJbNF0gPSB7SU5UUl9TVEFUVVMwLCBJTlRSX1NUQVRVUzEsCisJCUlOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwl1MzIgZG1hX2ludHJfYml0WzRdID0ge0RNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDAsCisJCURNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDEsCisJCURNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDIsCisJCURNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDN9OworCXUzMiBjZG1hX2ludF9zdGF0dXMsIGludF9zdGF0dXM7CisJdTMyIGVjY19lbmFibGUgPSAwOworCXUxNiBldmVudCA9IEVWRU5UX1BBU1M7CisJdTE2IGN1cl9kZXNjID0gMDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZWNjX2VuYWJsZSA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRUNDX0VOQUJMRSk7CisKKwl3aGlsZSAoMSkgeworCQlpbnRfc3RhdHVzID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRzX2FkZHJbaW5mby5mbGFzaF9iYW5rXSk7CisJCWlmIChlY2NfZW5hYmxlICYmIChpbnRfc3RhdHVzICYgSU5UUl9TVEFUVVMwX19FQ0NfRVJSKSkgeworCQkJZXZlbnQgPSBwcm9jZXNzX2VjY19pbnQoaW5mby5mbGFzaF9iYW5rLCAmY3VyX2Rlc2MpOworCQkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRUNDX0VSUiwKKwkJCQlGbGFzaFJlZyArIGludHNfYWRkcltpbmZvLmZsYXNoX2JhbmtdKTsKKwkJCWlmIChFVkVOVF9VTkNPUlJFQ1RBQkxFX0RBVEFfRVJST1IgPT0gZXZlbnQpIHsKKwkJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJCQkiaW50c19iYW5rMCB0byBpbnRzX2JhbmszOiAiCisJCQkJCSIweCV4LCAweCV4LCAweCV4LCAweCV4LCAiCisJCQkJCSJpbnRzX2NkbWE6IDB4JXhcbiIsCisJCQkJCWlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMwKSwKKwkJCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzEpLAorCQkJCQlpb3JlYWQzMihGbGFzaFJlZyArIElOVFJfU1RBVFVTMiksCisJCQkJCWlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMzKSwKKwkJCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfSU5UUikpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGludF9zdGF0dXMgJiBJTlRSX1NUQVRVUzBfX1BST0dSQU1fRkFJTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJOQU5EIHByb2dyYW0gZmFpbCBpbnRlcnJ1cHQhXG4iKTsKKwkJCXByb2Nlc3NfcHJvZ19lcmFzZV9mYWlsX2ludChjdXJfZGVzYyk7CisJCQlldmVudCA9IEVWRU5UX1BST0dSQU1fRkFJTFVSRTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGludF9zdGF0dXMgJiBJTlRSX1NUQVRVUzBfX0VSQVNFX0ZBSUwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTkFORCBlcmFzZSBmYWlsIGludGVycnVwdCFcbiIpOworCQkJcHJvY2Vzc19wcm9nX2VyYXNlX2ZhaWxfaW50KGN1cl9kZXNjKTsKKwkJCWV2ZW50ID0gRVZFTlRfRVJBU0VfRkFJTFVSRTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJY2RtYV9pbnRfc3RhdHVzID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfSU5UUik7CisJCQlpZiAoY2RtYV9pbnRfc3RhdHVzICYgZG1hX2ludHJfYml0W2luZm8uZmxhc2hfYmFua10pIHsKKwkJCQlpb3dyaXRlMzIoZG1hX2ludHJfYml0W2luZm8uZmxhc2hfYmFua10sCisJCQkJCUZsYXNoUmVnICsgRE1BX0lOVFIpOworCQkJCXVwZGF0ZV9ldmVudF9zdGF0dXMoKTsKKwkJCQlldmVudCA9IEVWRU5UX1BBU1M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpbnRfc3RhdHVzID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRzX2FkZHJbaW5mby5mbGFzaF9iYW5rXSk7CisJaW93cml0ZTMyKGludF9zdGF0dXMsIEZsYXNoUmVnICsgaW50c19hZGRyW2luZm8uZmxhc2hfYmFua10pOworCWNkbWFfaW50X3N0YXR1cyA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0lOVFIpOworCWlvd3JpdGUzMihjZG1hX2ludF9zdGF0dXMsIEZsYXNoUmVnICsgRE1BX0lOVFIpOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJd2hpbGUgKChpb3JlYWQzMihGbGFzaFJlZyArIERNQV9FTkFCTEUpICYgRE1BX0VOQUJMRV9fRkxBRykpCisJCTsKKworCXJldHVybiBldmVudDsKK30KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9jZG1hLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfY2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGVhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfY2RtYS5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogaGVhZGVyIGZvciBMTERfQ0RNQS5jIG1vZHVsZSAqLworCisjaWZuZGVmIF9MTERfQ0RNQV8KKyNkZWZpbmUgX0xMRF9DRE1BXworCisjaW5jbHVkZSAiZmxhc2guaCIKKworI2RlZmluZSAgREVCVUdfU1lOQyAgICAxCisKKy8qLy8vLy8vLy8vLy8gICBDRE1BIHNwZWNpZmljIE1BQ1JPIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTUFYX0RFU0NTICAgICAgICAgKDI1NSkKKyNkZWZpbmUgTUFYX0NIQU5TICAoNCkKKyNkZWZpbmUgTUFYX1NZTkNfUE9JTlRTICAgICAgICAgKDE2KQorI2RlZmluZSBNQVhfREVTQ19QRVJfQ0hBTiAgICAgKE1BWF9ERVNDUyAqIDMgKyBNQVhfU1lOQ19QT0lOVFMgKyAyKQorCisjZGVmaW5lIENIQU5ORUxfU1lOQ19NQVNLICAgICAgICgweDAwMEYpCisjZGVmaW5lIENIQU5ORUxfRE1BX01BU0sgICAgICAgICgweDAwRjApCisjZGVmaW5lIENIQU5ORUxfSURfTUFTSyAgICAgICAgICgweDAzMDApCisjZGVmaW5lIENIQU5ORUxfQ09OVF9NQVNLICAgICAgICgweDQwMDApCisjZGVmaW5lIENIQU5ORUxfSU5UUl9NQVNLICAgICAgICgweDgwMDApCisKKyNkZWZpbmUgQ0hBTk5FTF9TWU5DX09GRlNFVCAgICAgKDApCisjZGVmaW5lIENIQU5ORUxfRE1BX09GRlNFVCAgICAgICg0KQorI2RlZmluZSBDSEFOTkVMX0lEX09GRlNFVCAgICAgICAoOCkKKyNkZWZpbmUgQ0hBTk5FTF9DT05UX09GRlNFVCAgICAgKDE0KQorI2RlZmluZSBDSEFOTkVMX0lOVFJfT0ZGU0VUICAgICAoMTUpCisKK3UxNiBDRE1BX0RhdGFfQ01EKHU4IGNtZCwgdTggKmRhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBudW0sIHUxNiBmbGFncyk7Cit1MTYgQ0RNQV9NZW1Db3B5X0NNRCh1OCAqZGVzdCwgdTggKnNyYywgdTMyIGJ5dGVfY250LCB1MTYgZmxhZ3MpOwordTE2IENETUFfRXhlY3V0ZV9DTURzKHZvaWQpOwordm9pZCBwcmludF9wZW5kaW5nX2NtZHModm9pZCk7Cit2b2lkIHByaW50X2NkbWFfZGVzY3JpcHRvcnModm9pZCk7CisKK2V4dGVybiB1OCBnX1NCRENtZEluZGV4OworZXh0ZXJuIHN0cnVjdCBtcnN0X25hbmRfaW5mbyBpbmZvOworCisKKy8qLy8vLy8vLy8vLy8gICBwcm90b3R5cGVzOiBBUElzIGZvciBMTERfQ0RNQSAqLworaW50IGlzX2NkbWFfaW50ZXJydXB0KHZvaWQpOwordTE2IENETUFfRXZlbnRfU3RhdHVzKHZvaWQpOworCisvKiBDTUQtRE1BIERlc2NyaXB0b3IgU3RydWN0LiAgVGhlc2UgYXJlIGRlZmluZWQgYnkgdGhlIENNRF9ETUEgSFcgKi8KK3N0cnVjdCBjZG1hX2Rlc2NyaXB0b3IgeworCXUzMiBOeHRQb2ludGVySGk7CisJdTMyIE54dFBvaW50ZXJMbzsKKwl1MzIgRmxhc2hQb2ludGVySGk7CisJdTMyIEZsYXNoUG9pbnRlckxvOworCXUzMiBDb21tYW5kVHlwZTsKKwl1MzIgTWVtQWRkckhpOworCXUzMiBNZW1BZGRyTG87CisJdTMyIENvbW1hbmRGbGFnczsKKwl1MzIgQ2hhbm5lbDsKKwl1MzIgU3RhdHVzOworCXUzMiBNZW1Db3B5UG9pbnRlckhpOworCXUzMiBNZW1Db3B5UG9pbnRlckxvOworCXUzMiBSZXNlcnZlZDEyOworCXUzMiBSZXNlcnZlZDEzOworCXUzMiBSZXNlcnZlZDE0OworCXUzMiBwY21kOyAvKiBwZW5kaW5nIGNtZCBudW0gcmVsYXRlZCB0byB0aGlzIGRlc2NyaXB0b3IgKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGhvbGRzIG9uZSBNZW1Db3B5IGRlc2NyaXB0b3IgYXMgZGVmaW5lZCBieSB0aGUgSFcgKi8KK3N0cnVjdCBtZW1jcHlfZGVzY3JpcHRvciB7CisJdTMyIE54dFBvaW50ZXJIaTsKKwl1MzIgTnh0UG9pbnRlckxvOworCXUzMiBTcmNBZGRySGk7CisJdTMyIFNyY0FkZHJMbzsKKwl1MzIgRGVzdEFkZHJIaTsKKwl1MzIgRGVzdEFkZHJMbzsKKwl1MzIgWGZlclNpemU7CisJdTMyIE1lbUNvcHlGbGFnczsKKwl1MzIgTWVtQ29weVN0YXR1czsKKwl1MzIgcmVzZXJ2ZWQ5OworCXUzMiByZXNlcnZlZDEwOworCXUzMiByZXNlcnZlZDExOworCXUzMiByZXNlcnZlZDEyOworCXUzMiByZXNlcnZlZDEzOworCXUzMiByZXNlcnZlZDE0OworCXUzMiByZXNlcnZlZDE1OworfTsKKworLyogUGVuZGluZyBDTUQgdGFibGUgZW50cmllcyAoaW5jbHVkZXMgTWVtQ29weSBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgcGVuZGluZ19jbWQgeworCXU4IENNRDsKKwl1OCAqRGF0YUFkZHI7CisJdTMyIEJsb2NrOworCXUxNiBQYWdlOworCXUxNiBQYWdlQ291bnQ7CisJdTggKkRhdGFEZXN0QWRkcjsKKwl1OCAqRGF0YVNyY0FkZHI7CisJdTMyIE1lbUNvcHlCeXRlQ250OworCXUxNiBGbGFnczsKKwl1MTYgU3RhdHVzOworfTsKKworI2lmIERFQlVHX1NZTkMKK2V4dGVybiB1MzIgZGVidWdfc3luY19jbnQ7CisjZW5kaWYKKworLyogRGVmaW5pdGlvbnMgZm9yIENNRCBETUEgZGVzY3JpcHRvciBjaGFpbiBmaWVsZHMgKi8KKyNkZWZpbmUgICAgIENNRF9ETUFfREVTQ19DT01QICAgMHg4MDAwCisjZGVmaW5lICAgICBDTURfRE1BX0RFU0NfRkFJTCAgIDB4NDAwMAorCisjZW5kaWYgLypfTExEX0NETUFfKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGViMGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYwpAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqIE5BTkQgRmxhc2ggQ29udHJvbGxlciBEZXZpY2UgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uIGFuZCBpdHMgc3VwcGxpZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJmbGFzaC5oIgorI2luY2x1ZGUgImZmc2RlZnMuaCIKKyNpbmNsdWRlICJsbGRfZW11LmgiCisjaW5jbHVkZSAibGxkLmgiCisjaWYgQ01EX0RNQQorI2luY2x1ZGUgImxsZF9jZG1hLmgiCisjZW5kaWYKKworI2RlZmluZSBHTE9CX0xMRF9QQUdFUyAgICAgICAgICAgNjQKKyNkZWZpbmUgR0xPQl9MTERfUEFHRV9TSVpFICAgICAgICg1MTIrMTYpCisjZGVmaW5lIEdMT0JfTExEX1BBR0VfREFUQV9TSVpFICA1MTIKKyNkZWZpbmUgR0xPQl9MTERfQkxPQ0tTICAgICAgICAgIDIwNDgKKworI2lmIChDTURfRE1BICAmJiBGTEFTSF9FTVUpCisjaW5jbHVkZSAibGxkX2NkbWEuaCIKK3UzMiB0b3RhbFVzZWRCYW5rczsKK3UzMiB2YWxpZF9iYW5rc1tNQVhfQ0hBTlNdOworI2VuZGlmCisKKyNpZiBGTEFTSF9FTVUJCQkvKiBUaGlzIGlzIGZvciBlbnRpcmUgbW9kdWxlICovCisKK3N0YXRpYyB1OCAqZmxhc2hfbWVtb3J5W0dMT0JfTExEX0JMT0NLUyAqIEdMT0JfTExEX1BBR0VTXTsKKworLyogUmVhZCBuYW5kIGVtdSBmaWxlIGFuZCB0aGVuIGZpbGwgaXQncyBjb250ZW50IHRvIGZsYXNoX21lbW9yeSAqLworaW50IGVtdV9sb2FkX2ZpbGVfdG9fbWVtKHZvaWQpCit7CisJbW1fc2VnbWVudF90IGZzOworCXN0cnVjdCBmaWxlICpuZWZfZmlscCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJbG9mZl90IG5lZl9zaXplID0gMDsKKwlsb2ZmX3QgdG1wX2ZpbGVfb2Zmc2V0LCBmaWxlX29mZnNldDsKKwlzc2l6ZV90IG5yZWFkOworCWludCBpLCByYyA9IC1FSU5WQUw7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKworCW5lZl9maWxwID0gZmlscF9vcGVuKCIvcm9vdC9uYW5kX2VtdV9maWxlIiwgT19SRFdSIHwgT19MQVJHRUZJTEUsIDApOworCWlmIChJU19FUlIobmVmX2ZpbHApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmlscF9vcGVuIGVycm9yOiAiCisJCSAgICAgICAiVW5hYmxlIHRvIG9wZW4gbmFuZCBlbXUgZmlsZSFcbiIpOworCQlyZXR1cm4gUFRSX0VSUihuZWZfZmlscCk7CisJfQorCisJaWYgKG5lZl9maWxwLT5mX3BhdGguZGVudHJ5KSB7CisJCWlub2RlID0gbmVmX2ZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4gbm90IGdldCB2YWxpZCBpbm9kZSFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwluZWZfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlLT5pX21hcHBpbmctPmhvc3QpOworCWlmIChuZWZfc2l6ZSA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBuYW5kIGVtdSBmaWxlIHNpemU6ICIKKwkJICAgICAgICIweCVsbHhcbiIsIG5lZl9zaXplKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJuYW5kIGVtdSBmaWxlIHNpemU6ICVsbGRcbiIsCisJCQkgICAgICAgbmVmX3NpemUpOworCX0KKworCWZpbGVfb2Zmc2V0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgR0xPQl9MTERfQkxPQ0tTICogR0xPQl9MTERfUEFHRVM7IGkrKykgeworCQl0bXBfZmlsZV9vZmZzZXQgPSBmaWxlX29mZnNldDsKKwkJbnJlYWQgPSB2ZnNfcmVhZChuZWZfZmlscCwKKwkJCQkgKGNoYXIgX191c2VyICopZmxhc2hfbWVtb3J5W2ldLAorCQkJCSBHTE9CX0xMRF9QQUdFX1NJWkUsICZ0bXBfZmlsZV9vZmZzZXQpOworCQlpZiAobnJlYWQgPCBHTE9CX0xMRF9QQUdFX1NJWkUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMsIExpbmUgJWQgLSAiCisJCQkgICAgICAgIm5hbmQgZW11IGZpbGUgcGFydGlhbCByZWFkOiAiCisJCQkgICAgICAgIiVkIGJ5dGVzXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIChpbnQpbnJlYWQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZV9vZmZzZXQgKz0gR0xPQl9MTERfUEFHRV9TSVpFOworCX0KKwlyYyA9IDA7CisKK291dDoKKwlmaWxwX2Nsb3NlKG5lZl9maWxwLCBjdXJyZW50LT5maWxlcyk7CisJc2V0X2ZzKGZzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFdyaXRlIGNvbnRlbnRzIG9mIGZsYXNoX21lbW9yeSB0byBuYW5kIGVtdSBmaWxlICovCitpbnQgZW11X3dyaXRlX21lbV90b19maWxlKHZvaWQpCit7CisJbW1fc2VnbWVudF90IGZzOworCXN0cnVjdCBmaWxlICpuZWZfZmlscCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJbG9mZl90IG5lZl9zaXplID0gMDsKKwlsb2ZmX3QgdG1wX2ZpbGVfb2Zmc2V0LCBmaWxlX29mZnNldDsKKwlzc2l6ZV90IG53cml0dGVuOworCWludCBpLCByYyA9IC1FSU5WQUw7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKworCW5lZl9maWxwID0gZmlscF9vcGVuKCIvcm9vdC9uYW5kX2VtdV9maWxlIiwgT19SRFdSIHwgT19MQVJHRUZJTEUsIDApOworCWlmIChJU19FUlIobmVmX2ZpbHApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmlscF9vcGVuIGVycm9yOiAiCisJCSAgICAgICAiVW5hYmxlIHRvIG9wZW4gbmFuZCBlbXUgZmlsZSFcbiIpOworCQlyZXR1cm4gUFRSX0VSUihuZWZfZmlscCk7CisJfQorCisJaWYgKG5lZl9maWxwLT5mX3BhdGguZGVudHJ5KSB7CisJCWlub2RlID0gbmVmX2ZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkICIgIm5lZl9maWxwLT5mX3BhdGguZGVudHJ5IHZhbHVlIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCW5lZl9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUtPmlfbWFwcGluZy0+aG9zdCk7CisJaWYgKG5lZl9zaXplIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkICIKKwkJICAgICAgICJuYW5kIGVtdSBmaWxlIHNpemU6IDB4JWxseFxuIiwgbmVmX3NpemUpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIm5hbmQgZW11IGZpbGUgc2l6ZTogIgorCQkJICAgICAgICIlbGxkXG4iLCBuZWZfc2l6ZSk7CisJfQorCisJZmlsZV9vZmZzZXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBHTE9CX0xMRF9CTE9DS1MgKiBHTE9CX0xMRF9QQUdFUzsgaSsrKSB7CisJCXRtcF9maWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0OworCQlud3JpdHRlbiA9IHZmc193cml0ZShuZWZfZmlscCwKKwkJCQkgICAgIChjaGFyIF9fdXNlciAqKWZsYXNoX21lbW9yeVtpXSwKKwkJCQkgICAgIEdMT0JfTExEX1BBR0VfU0laRSwgJnRtcF9maWxlX29mZnNldCk7CisJCWlmIChud3JpdHRlbiA8IEdMT0JfTExEX1BBR0VfU0laRSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcywgTGluZSAlZCAtICIKKwkJCSAgICAgICAibmFuZCBlbXUgZmlsZSBwYXJ0aWFsIHdyaXRlOiAiCisJCQkgICAgICAgIiVkIGJ5dGVzXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIChpbnQpbndyaXR0ZW4pOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZV9vZmZzZXQgKz0gR0xPQl9MTERfUEFHRV9TSVpFOworCX0KKwlyYyA9IDA7CisKK291dDoKKwlmaWxwX2Nsb3NlKG5lZl9maWxwLCBjdXJyZW50LT5maWxlcyk7CisJc2V0X2ZzKGZzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBlbXVfRmxhc2hfSW5pdAorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgQ3JlYXRlcyAmIGluaXRpYWxpemVzIHRoZSBmbGFzaCBSQU0gYXJyYXkuCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IGVtdV9GbGFzaF9Jbml0KHZvaWQpCit7CisJaW50IGk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZsYXNoX21lbW9yeVswXSA9ICh1OCAqKXZtYWxsb2MoR0xPQl9MTERfUEFHRV9TSVpFICoKKwkJCQkJCSAgIEdMT0JfTExEX0JMT0NLUyAqCisJCQkJCQkgICBHTE9CX0xMRF9QQUdFUyAqCisJCQkJCQkgICBzaXplb2YodTgpKTsKKwlpZiAoIWZsYXNoX21lbW9yeVswXSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJICAgICAgICJmb3IgbmFuZCBlbXVsYXRvciFcbiIpOworCQlyZXR1cm4gRVJSOworCX0KKworCW1lbXNldCgoY2hhciAqKShmbGFzaF9tZW1vcnlbMF0pLCAweEZGLAorCSAgICAgICBHTE9CX0xMRF9QQUdFX1NJWkUgKiBHTE9CX0xMRF9CTE9DS1MgKiBHTE9CX0xMRF9QQUdFUyAqCisJICAgICAgIHNpemVvZih1OCkpOworCisJZm9yIChpID0gMTsgaSA8IEdMT0JfTExEX0JMT0NLUyAqIEdMT0JfTExEX1BBR0VTOyBpKyspCisJCWZsYXNoX21lbW9yeVtpXSA9IGZsYXNoX21lbW9yeVtpIC0gMV0gKyBHTE9CX0xMRF9QQUdFX1NJWkU7CisKKwllbXVfbG9hZF9maWxlX3RvX21lbSgpOyAvKiBMb2FkIG5hbmQgZW11IGZpbGUgdG8gbWVtICovCisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGVtdV9GbGFzaF9SZWxlYXNlCisqIElucHV0czogICAgICAgbm9uZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICAgICAgICAgIFJlbGVhc2VzIHRoZSBmbGFzaC4KKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCitpbnQgZW11X0ZsYXNoX1JlbGVhc2Uodm9pZCkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWVtdV93cml0ZV9tZW1fdG9fZmlsZSgpOyAgLyogV3JpdGUgYmFjayBtZW0gdG8gbmFuZCBlbXUgZmlsZSAqLworCisJdmZyZWUoZmxhc2hfbWVtb3J5WzBdKTsKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGVtdV9SZWFkX0RldmljZV9JRAorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTEgRkFJTD0wCisqIERlc2NyaXB0aW9uOiAgUmVhZHMgdGhlIGluZm8gZnJvbSB0aGUgY29udHJvbGxlciByZWdpc3RlcnMuCisqICAgICAgICAgICAgICAgU2V0cyB1cCBEZXZpY2VJbmZvIHN0cnVjdHVyZSB3aXRoIGRldmljZSBwYXJhbWV0ZXJzCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworCit1MTYgZW11X1JlYWRfRGV2aWNlX0lEKHZvaWQpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlEZXZpY2VJbmZvLndEZXZpY2VNYWtlciA9IDA7CisJRGV2aWNlSW5mby53RGV2aWNlVHlwZSA9IDg7CisJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2sgPSAzNjsKKwlEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2sgPSBHTE9CX0xMRF9CTE9DS1MgLSAxOworCURldmljZUluZm8ud1RvdGFsQmxvY2tzID0gR0xPQl9MTERfQkxPQ0tTOworCURldmljZUluZm8ud1BhZ2VzUGVyQmxvY2sgPSBHTE9CX0xMRF9QQUdFUzsKKwlEZXZpY2VJbmZvLndQYWdlU2l6ZSA9IEdMT0JfTExEX1BBR0VfU0laRTsKKwlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgPSBHTE9CX0xMRF9QQUdFX0RBVEFfU0laRTsKKwlEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplID0gR0xPQl9MTERfUEFHRV9TSVpFIC0KKwkgICAgR0xPQl9MTERfUEFHRV9EQVRBX1NJWkU7CisJRGV2aWNlSW5mby53QmxvY2tTaXplID0gRGV2aWNlSW5mby53UGFnZVNpemUgKiBHTE9CX0xMRF9QQUdFUzsKKwlEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplICogR0xPQl9MTERfUEFHRVM7CisJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtID0gKHUzMikgKERldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jayAtCisJCQkJCQlEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jaworCQkJCQkJKyAxKTsKKwlEZXZpY2VJbmZvLk1MQ0RldmljZSA9IDE7IC8qIEVtdWxhdGUgTUxDIGRldmljZSAqLworCURldmljZUluZm8ubkJpdHNJblBhZ2VOdW1iZXIgPQorCQkodTgpR0xPQl9DYWxjX1VzZWRfQml0cyhEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKTsKKwlEZXZpY2VJbmZvLm5CaXRzSW5QYWdlRGF0YVNpemUgPQorCQkodTgpR0xPQl9DYWxjX1VzZWRfQml0cyhEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCURldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemUgPQorCQkodTgpR0xPQl9DYWxjX1VzZWRfQml0cyhEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplKTsKKworI2lmIENNRF9ETUEKKwl0b3RhbFVzZWRCYW5rcyA9IDQ7CisJdmFsaWRfYmFua3NbMF0gPSAxOworCXZhbGlkX2JhbmtzWzFdID0gMTsKKwl2YWxpZF9iYW5rc1syXSA9IDE7CisJdmFsaWRfYmFua3NbM10gPSAxOworI2VuZGlmCisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGVtdV9GbGFzaF9SZXNldAorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgICAgICAgICBSZXNldCB0aGUgZmxhc2gKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgZW11X0ZsYXNoX1Jlc2V0KHZvaWQpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGVtdV9FcmFzZV9CbG9jaworKiBJbnB1dHM6ICAgICAgIEFkZHJlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgICAgICAgICBFcmFzZSBhIGJsb2NrCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IGVtdV9FcmFzZV9CbG9jayh1MzIgYmxvY2tfYWRkKQoreworCWludCBpOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoYmxvY2tfYWRkID49IERldmljZUluZm8ud1RvdGFsQmxvY2tzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11X0VyYXNlX0Jsb2NrIGVycm9yISAiCisJCSAgICAgICAiVG9vIGJpZyBibG9jayBhZGRyZXNzOiAlZFxuIiwgYmxvY2tfYWRkKTsKKwkJcmV0dXJuIEZBSUw7CisJfQorCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJFcmFzaW5nIGJsb2NrICVkXG4iLAorCQkoaW50KWJsb2NrX2FkZCk7CisKKwlmb3IgKGkgPSBibG9ja19hZGQgKiBHTE9CX0xMRF9QQUdFUzsKKwkgICAgIGkgPCAoKGJsb2NrX2FkZCArIDEpICogR0xPQl9MTERfUEFHRVMpOyBpKyspIHsKKwkJaWYgKGZsYXNoX21lbW9yeVtpXSkgeworCQkJbWVtc2V0KCh1OCAqKShmbGFzaF9tZW1vcnlbaV0pLCAweEZGLAorCQkJICAgICAgIERldmljZUluZm8ud1BhZ2VTaXplICogc2l6ZW9mKHU4KSk7CisJCX0KKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGVtdV9Xcml0ZV9QYWdlX01haW4KKyogSW5wdXRzOiAgICAgICBXcml0ZSBidWZmZXIgYWRkcmVzcyBwb2ludGVyCisqICAgICAgICAgICAgICAgQmxvY2sgbnVtYmVyCisqICAgICAgICAgICAgICAgUGFnZSAgbnVtYmVyCisqICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBhZ2VzIHRvIHByb2Nlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgV3JpdGUgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciB0byBtYWluIGFyZWEgb2YgZmxhc2gKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgZW11X1dyaXRlX1BhZ2VfTWFpbih1OCAqd3JpdGVfZGF0YSwgdTMyIEJsb2NrLAorCQkJICAgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpCit7CisJaW50IGk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykKKwkJcmV0dXJuIEZBSUw7CisKKwlpZiAoUGFnZSArIFBhZ2VDb3VudCA+IERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spCisJCXJldHVybiBGQUlMOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJlbXVfV3JpdGVfUGFnZV9NYWluOiAiCisJCSAgICAgICAibGJhICV1IFBhZ2UgJXUgUGFnZUNvdW50ICV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpUGFnZSwgKHVuc2lnbmVkIGludClQYWdlQ291bnQpOworCisJZm9yIChpID0gMDsgaSA8IFBhZ2VDb3VudDsgaSsrKSB7CisJCWlmIChOVUxMID09IGZsYXNoX21lbW9yeVtCbG9jayAqIEdMT0JfTExEX1BBR0VTICsgUGFnZV0pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUnVuIG91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIEZBSUw7CisJCX0KKwkJbWVtY3B5KCh1OCAqKSAoZmxhc2hfbWVtb3J5W0Jsb2NrICogR0xPQl9MTERfUEFHRVMgKyBQYWdlXSksCisJCSAgICAgICB3cml0ZV9kYXRhLCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCQl3cml0ZV9kYXRhICs9IERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKwkJUGFnZSsrOworCX0KKworCXJldHVybiBQQVNTOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgZW11X1JlYWRfUGFnZV9NYWluCisqIElucHV0czogICAgICAgUmVhZCBidWZmZXIgYWRkcmVzcyBwb2ludGVyCisqICAgICAgICAgICAgICAgQmxvY2sgbnVtYmVyCisqICAgICAgICAgICAgICAgUGFnZSAgbnVtYmVyCisqICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBhZ2VzIHRvIHByb2Nlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBmbGFzaCBtYWluIGFyZWEgdG8gdGhlIGJ1ZmZlcgorKgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBlbXVfUmVhZF9QYWdlX01haW4odTggKnJlYWRfZGF0YSwgdTMyIEJsb2NrLAorCQkJICB1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCkKK3sKKwlpbnQgaTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKEJsb2NrID49IERldmljZUluZm8ud1RvdGFsQmxvY2tzKQorCQlyZXR1cm4gRkFJTDsKKworCWlmIChQYWdlICsgUGFnZUNvdW50ID4gRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykKKwkJcmV0dXJuIEZBSUw7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgImVtdV9SZWFkX1BhZ2VfTWFpbjogIgorCQkgICAgICAgImxiYSAldSBQYWdlICV1IFBhZ2VDb3VudCAldVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpQmxvY2ssCisJCSAgICAgICAodW5zaWduZWQgaW50KVBhZ2UsICh1bnNpZ25lZCBpbnQpUGFnZUNvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBQYWdlQ291bnQ7IGkrKykgeworCQlpZiAoTlVMTCA9PSBmbGFzaF9tZW1vcnlbQmxvY2sgKiBHTE9CX0xMRF9QQUdFUyArIFBhZ2VdKSB7CisJCQltZW1zZXQocmVhZF9kYXRhLCAweEZGLCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHJlYWRfZGF0YSwKKwkJCSAgICAgICAodTggKikgKGZsYXNoX21lbW9yeVtCbG9jayAqIEdMT0JfTExEX1BBR0VTCisJCQkJCQkgICAgICArIFBhZ2VdKSwKKwkJCSAgICAgICBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCQl9CisJCXJlYWRfZGF0YSArPSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJCVBhZ2UrKzsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworI2lmbmRlZiBFTERPUkEKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBlbXVfUmVhZF9QYWdlX01haW5fU3BhcmUKKyogSW5wdXRzOiAgICAgICBXcml0ZSBCdWZmZXIKKyogICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MKKyogICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBzaXplCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIChub3RpY2UgMD1vayBoZXJlKQorKiBEZXNjcmlwdGlvbjogICAgICAgICAgUmVhZCBmcm9tIGZsYXNoIG1haW4rc3BhcmUgYXJlYQorKgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBlbXVfUmVhZF9QYWdlX01haW5fU3BhcmUodTggKnJlYWRfZGF0YSwgdTMyIEJsb2NrLAorCQkJCXUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KQoreworCWludCBpOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoQmxvY2sgPj0gRGV2aWNlSW5mby53VG90YWxCbG9ja3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJSZWFkIFBhZ2UgTWFpbitTcGFyZSAiCisJCSAgICAgICAiRXJyb3I6IEJsb2NrIEFkZHJlc3MgdG9vIGJpZ1xuIik7CisJCXJldHVybiBGQUlMOworCX0KKworCWlmIChQYWdlICsgUGFnZUNvdW50ID4gRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgUGFnZSBNYWluK1NwYXJlICIKKwkJICAgICAgICJFcnJvcjogUGFnZSBudW1iZXIgdG9vIGJpZ1xuIik7CisJCXJldHVybiBGQUlMOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiUmVhZCBQYWdlIE1haW4gKyBTcGFyZSAtICIKKwkJICAgICAgICJOby4gb2YgcGFnZXMgJXUgYmxvY2sgJXUgc3RhcnQgcGFnZSAldVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpUGFnZUNvdW50LAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywgKHVuc2lnbmVkIGludClQYWdlKTsKKworCWZvciAoaSA9IDA7IGkgPCBQYWdlQ291bnQ7IGkrKykgeworCQlpZiAoTlVMTCA9PSBmbGFzaF9tZW1vcnlbQmxvY2sgKiBHTE9CX0xMRF9QQUdFUyArIFBhZ2VdKSB7CisJCQltZW1zZXQocmVhZF9kYXRhLCAweEZGLCBEZXZpY2VJbmZvLndQYWdlU2l6ZSk7CisJCX0gZWxzZSB7CisJCQltZW1jcHkocmVhZF9kYXRhLCAodTggKikgKGZsYXNoX21lbW9yeVtCbG9jayAqCisJCQkJCQkJCSBHTE9CX0xMRF9QQUdFUworCQkJCQkJCQkgKyBQYWdlXSksCisJCQkgICAgICAgRGV2aWNlSW5mby53UGFnZVNpemUpOworCQl9CisKKwkJcmVhZF9kYXRhICs9IERldmljZUluZm8ud1BhZ2VTaXplOworCQlQYWdlKys7CisJfQorCisJcmV0dXJuIFBBU1M7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBlbXVfV3JpdGVfUGFnZV9NYWluX1NwYXJlCisqIElucHV0czogICAgICAgV3JpdGUgYnVmZmVyCisqICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCisqICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoCisqIE91dHB1dHM6ICAgICAgUEFTUz0wIChub3RpY2UgMD1vayBoZXJlKQorKiBEZXNjcmlwdGlvbjogICAgICAgICAgV3JpdGUgdGhlIGJ1ZmZlciB0byBtYWluK3NwYXJlIGFyZWEgb2YgZmxhc2gKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgZW11X1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIEJsb2NrLAorCQkJCSB1MTYgUGFnZSwgdTE2IHBhZ2VfY291bnQpCit7CisJdTE2IGk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgIldyaXRlIFBhZ2UgTWFpbiArIFNwYXJlICIKKwkJICAgICAgICJFcnJvcjogQmxvY2sgQWRkcmVzcyB0b28gYmlnXG4iKTsKKwkJcmV0dXJuIEZBSUw7CisJfQorCisJaWYgKFBhZ2UgKyBwYWdlX2NvdW50ID4gRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgIldyaXRlIFBhZ2UgTWFpbiArIFNwYXJlICIKKwkJICAgICAgICJFcnJvcjogUGFnZSBudW1iZXIgdG9vIGJpZ1xuIik7CisJCXJldHVybiBGQUlMOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiV3JpdGUgUGFnZSBNYWluK1NwYXJlIC0gIgorCQkgICAgICAgIk5vLiBvZiBwYWdlcyAldSBibG9jayAldSBzdGFydCBwYWdlICV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClwYWdlX2NvdW50LAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywgKHVuc2lnbmVkIGludClQYWdlKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKKwkJaWYgKE5VTEwgPT0gZmxhc2hfbWVtb3J5W0Jsb2NrICogR0xPQl9MTERfUEFHRVMgKyBQYWdlXSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJSdW4gb3V0IG9mIG1lbW9yeSFcbiIpOworCQkJcmV0dXJuIEZBSUw7CisJCX0KKwkJbWVtY3B5KCh1OCAqKSAoZmxhc2hfbWVtb3J5W0Jsb2NrICogR0xPQl9MTERfUEFHRVMgKyBQYWdlXSksCisJCSAgICAgICB3cml0ZV9kYXRhLCBEZXZpY2VJbmZvLndQYWdlU2l6ZSk7CisJCXdyaXRlX2RhdGEgKz0gRGV2aWNlSW5mby53UGFnZVNpemU7CisJCVBhZ2UrKzsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIGVtdV9Xcml0ZV9QYWdlX1NwYXJlCisqIElucHV0czogICAgICAgV3JpdGUgYnVmZmVyCisqICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzCisqICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgc2l6ZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICAgICAgICAgIFdyaXRlIHRoZSBidWZmZXIgaW4gdGhlIHNwYXJlIGFyZWEKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgZW11X1dyaXRlX1BhZ2VfU3BhcmUodTggKndyaXRlX2RhdGEsIHUzMiBCbG9jaywKKwkJCSAgICB1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgUGFnZSBTcGFyZSBFcnJvcjogIgorCQkgICAgICAgIkJsb2NrIEFkZHJlc3MgdG9vIGJpZ1xuIik7CisJCXJldHVybiBGQUlMOworCX0KKworCWlmIChQYWdlICsgUGFnZUNvdW50ID4gRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgUGFnZSBTcGFyZSBFcnJvcjogIgorCQkgICAgICAgIlBhZ2UgbnVtYmVyIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIldyaXRlIFBhZ2UgU3BhcmUtICIKKwkJICAgICAgICJibG9jayAldSBwYWdlICV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywgKHVuc2lnbmVkIGludClQYWdlKTsKKworCWlmIChOVUxMID09IGZsYXNoX21lbW9yeVtCbG9jayAqIEdMT0JfTExEX1BBR0VTICsgUGFnZV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJSdW4gb3V0IG9mIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwltZW1jcHkoKHU4ICopIChmbGFzaF9tZW1vcnlbQmxvY2sgKiBHTE9CX0xMRF9QQUdFUyArIFBhZ2VdICsKKwkJCSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpLCB3cml0ZV9kYXRhLAorCSAgICAgICAoRGV2aWNlSW5mby53UGFnZVNpemUgLSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpKTsKKworCXJldHVybiBQQVNTOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgZW11X1JlYWRfUGFnZV9TcGFyZQorKiBJbnB1dHM6ICAgICAgIFdyaXRlIEJ1ZmZlcgorKiAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcworKiAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIHNpemUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgICAgICAgICBSZWFkIGRhdGEgZnJvbSB0aGUgc3BhcmUgYXJlYQorKgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBlbXVfUmVhZF9QYWdlX1NwYXJlKHU4ICp3cml0ZV9kYXRhLCB1MzIgQmxvY2ssCisJCQkgICB1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgUGFnZSBTcGFyZSAiCisJCSAgICAgICAiRXJyb3I6IEJsb2NrIEFkZHJlc3MgdG9vIGJpZ1xuIik7CisJCXJldHVybiBGQUlMOworCX0KKworCWlmIChQYWdlICsgUGFnZUNvdW50ID4gRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgUGFnZSBTcGFyZSAiCisJCSAgICAgICAiRXJyb3I6IFBhZ2UgbnVtYmVyIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlJlYWQgUGFnZSBTcGFyZS0gIgorCQkgICAgICAgImJsb2NrICV1IHBhZ2UgJXVcbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KUJsb2NrLCAodW5zaWduZWQgaW50KVBhZ2UpOworCisJaWYgKE5VTEwgPT0gZmxhc2hfbWVtb3J5W0Jsb2NrICogR0xPQl9MTERfUEFHRVMgKyBQYWdlXSkgeworCQltZW1zZXQod3JpdGVfZGF0YSwgMHhGRiwKKwkJICAgICAgIChEZXZpY2VJbmZvLndQYWdlU2l6ZSAtIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSkpOworCX0gZWxzZSB7CisJCW1lbWNweSh3cml0ZV9kYXRhLAorCQkgICAgICAgKHU4ICopIChmbGFzaF9tZW1vcnlbQmxvY2sgKiBHTE9CX0xMRF9QQUdFUyArIFBhZ2VdCisJCQkJICsgRGV2aWNlSW5mby53UGFnZURhdGFTaXplKSwKKwkJICAgICAgIChEZXZpY2VJbmZvLndQYWdlU2l6ZSAtIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSkpOworCX0KKworCXJldHVybiBQQVNTOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgZW11X0VuYWJsZV9EaXNhYmxlX0ludGVycnVwdHMKKyogSW5wdXRzOiAgICAgICBlbmFibGUgb3IgZGlzYWJsZQorKiBPdXRwdXRzOiAgICAgIG5vbmUKKyogRGVzY3JpcHRpb246ICBOT1AKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit2b2lkIGVtdV9FbmFibGVfRGlzYWJsZV9JbnRlcnJ1cHRzKHUxNiBJTlRfRU5BQkxFKQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworfQorCit1MTYgZW11X0dldF9CYWRfQmxvY2sodTMyIGJsb2NrKQoreworCXJldHVybiAwOworfQorCisjaWYgQ01EX0RNQQorLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBTdXBwb3J0IGZvciBDRE1BIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgIGVtdV9DRE1BX0ZsYXNoX0luaXQKKyogICAgICAgICAgIENETUFfcHJvY2Vzc19kYXRhIGNvbW1hbmQgICAodXNlIExMRF9DRE1BKQorKiAgICAgICAgICAgQ0RNQV9NZW1Db3B5X0NNRCAgICAgICAgICAgICh1c2UgTExEX0NETUEpCisqICAgICAgIGVtdV9DRE1BX2V4ZWN1dGUgYWxsIGNvbW1hbmRzCisqICAgICAgIGVtdV9DRE1BX0V2ZW50X1N0YXR1cworKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IGVtdV9DRE1BX0ZsYXNoX0luaXQodm9pZCkKK3sKKwl1MTYgaTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ERVNDUyArIE1BWF9DSEFOUzsgaSsrKSB7CisJCVBlbmRpbmdDTURbaV0uQ01EID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5UYWcgPSAwOworCQlQZW5kaW5nQ01EW2ldLkRhdGFBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5CbG9jayA9IDA7CisJCVBlbmRpbmdDTURbaV0uUGFnZSA9IDA7CisJCVBlbmRpbmdDTURbaV0uUGFnZUNvdW50ID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5EYXRhRGVzdEFkZHIgPSAwOworCQlQZW5kaW5nQ01EW2ldLkRhdGFTcmNBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5NZW1Db3B5Qnl0ZUNudCA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbMF0gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzFdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5DaGFuU3luY1syXSA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbM10gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzRdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSAzOworCX0KKworCXJldHVybiBQQVNTOworfQorCitzdGF0aWMgdm9pZCBlbXVfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwkvKiBUT0RPOiAgLi4uICovCit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBDRE1BX0V4ZWN1dGVfQ01EcworKiBJbnB1dHM6ICAgICAgIHRhZ19jb3VudDogIHRoZSBudW1iZXIgb2YgcGVuZGluZyBjbWRzIHRvIGRvCisqIE91dHB1dHM6ICAgICAgUEFTUy9GQUlMCisqIERlc2NyaXB0aW9uOiAgZXhlY3V0ZSBlYWNoIGNvbW1hbmQgaW4gdGhlIHBlbmRpbmcgQ01EIGFycmF5CisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IGVtdV9DRE1BX0V4ZWN1dGVfQ01Ecyh1MTYgdGFnX2NvdW50KQoreworCXUxNiBpLCBqOworCXU4IENNRDsJCS8qIGNtZCBwYXJhbWV0ZXIgKi8KKwl1OCAqZGF0YTsKKwl1MzIgYmxvY2s7CisJdTE2IHBhZ2U7CisJdTE2IGNvdW50OworCXUxNiBzdGF0dXMgPSBQQVNTOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIkF0IHN0YXJ0IG9mIEV4ZWN1dGUgQ01EczogIgorCQkgICAgICAgIlRhZyBDb3VudCAldVxuIiwgdGFnX2NvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCB0b3RhbFVzZWRCYW5rczsgaSsrKSB7CisJCVBlbmRpbmdDTURbaV0uQ01EID0gRFVNTVlfQ01EOworCQlQZW5kaW5nQ01EW2ldLlRhZyA9IDB4RkY7CisJCVBlbmRpbmdDTURbaV0uQmxvY2sgPQorCQkgICAgKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpICogaTsKKworCQlmb3IgKGogPSAwOyBqIDw9IE1BWF9DSEFOUzsgaisrKQorCQkJUGVuZGluZ0NNRFtpXS5DaGFuU3luY1tqXSA9IDA7CisJfQorCisJQ0RNQV9FeGVjdXRlX0NNRHModGFnX2NvdW50KTsKKworCXByaW50X3BlbmRpbmdfY21kcyh0YWdfY291bnQpOworCisjaWYgREVCVUdfU1lOQworCX0KKwlkZWJ1Z19zeW5jX2NudCsrOworI2VuZGlmCisKKwlmb3IgKGkgPSBNQVhfQ0hBTlM7CisJICAgICBpIDwgdGFnX2NvdW50ICsgTUFYX0NIQU5TOyBpKyspIHsKKwkJQ01EID0gUGVuZGluZ0NNRFtpXS5DTUQ7CisJCWRhdGEgPSBQZW5kaW5nQ01EW2ldLkRhdGFBZGRyOworCQlibG9jayA9IFBlbmRpbmdDTURbaV0uQmxvY2s7CisJCXBhZ2UgPSBQZW5kaW5nQ01EW2ldLlBhZ2U7CisJCWNvdW50ID0gUGVuZGluZ0NNRFtpXS5QYWdlQ291bnQ7CisKKwkJc3dpdGNoIChDTUQpIHsKKwkJY2FzZSBFUkFTRV9DTUQ6CisJCQllbXVfRXJhc2VfQmxvY2soYmxvY2spOworCQkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSBQQVNTOworCQkJYnJlYWs7CisJCWNhc2UgV1JJVEVfTUFJTl9DTUQ6CisJCQllbXVfV3JpdGVfUGFnZV9NYWluKGRhdGEsIGJsb2NrLCBwYWdlLCBjb3VudCk7CisJCQlQZW5kaW5nQ01EW2ldLlN0YXR1cyA9IFBBU1M7CisJCQlicmVhazsKKwkJY2FzZSBXUklURV9NQUlOX1NQQVJFX0NNRDoKKwkJCWVtdV9Xcml0ZV9QYWdlX01haW5fU3BhcmUoZGF0YSwgYmxvY2ssIHBhZ2UsIGNvdW50KTsKKwkJCVBlbmRpbmdDTURbaV0uU3RhdHVzID0gUEFTUzsKKwkJCWJyZWFrOworCQljYXNlIFJFQURfTUFJTl9DTUQ6CisJCQllbXVfUmVhZF9QYWdlX01haW4oZGF0YSwgYmxvY2ssIHBhZ2UsIGNvdW50KTsKKwkJCVBlbmRpbmdDTURbaV0uU3RhdHVzID0gUEFTUzsKKwkJCWJyZWFrOworCQljYXNlIE1FTUNPUFlfQ01EOgorCQkJbWVtY3B5KFBlbmRpbmdDTURbaV0uRGF0YURlc3RBZGRyLAorCQkJICAgICAgIFBlbmRpbmdDTURbaV0uRGF0YVNyY0FkZHIsCisJCQkgICAgICAgUGVuZGluZ0NNRFtpXS5NZW1Db3B5Qnl0ZUNudCk7CisJCWNhc2UgRFVNTVlfQ01EOgorCQkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSBQQVNTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQZW5kaW5nQ01EW2ldLlN0YXR1cyA9IEZBSUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogVGVtcGVyb3J5IGFkZGluZyBjb2RlIHRvIHJlc2V0IFBlbmRpbmdDTUQgYXJyYXkgZm9yIGJhc2ljIHRlc3RpbmcuCisJICogSXQgc2hvdWxkIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiAgZXZlbnQgc3RhdHVzIGZ1bmN0aW9uLgorCSAqLworCWZvciAoaSA9IHRhZ19jb3VudCArIE1BWF9DSEFOUzsgaSA8IE1BWF9ERVNDUzsgaSsrKSB7CisJCVBlbmRpbmdDTURbaV0uQ01EID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5UYWcgPSAwOworCQlQZW5kaW5nQ01EW2ldLkRhdGFBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5CbG9jayA9IDA7CisJCVBlbmRpbmdDTURbaV0uUGFnZSA9IDA7CisJCVBlbmRpbmdDTURbaV0uUGFnZUNvdW50ID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5EYXRhRGVzdEFkZHIgPSAwOworCQlQZW5kaW5nQ01EW2ldLkRhdGFTcmNBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5NZW1Db3B5Qnl0ZUNudCA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbMF0gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzFdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5DaGFuU3luY1syXSA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbM10gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzRdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSBDTURfTk9UX0RPTkU7CisJfQorCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICJBdCBlbmQgb2YgRXhlY3V0ZSBDTURzLlxuIik7CisKKwllbXVfaXNyKDAsIDApOyAvKiBUaGlzIGlzIGEgbnVsbCBpc3Igbm93LiBOZWVkIGZpbGwgaXQgaW4gZnV0dXJlICovCisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgZW11X0V2ZW50X1N0YXR1cworKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBFdmVudF9TdGF0dXMgY29kZQorKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCB0byBmb3JjZSBlcnJvcnMKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgZW11X0NETUFfRXZlbnRfU3RhdHVzKHZvaWQpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gRVZFTlRfUEFTUzsKK30KKworI2VuZGlmIC8qIENNRF9ETUEgKi8KKyNlbmRpZiAvKiAhRUxET1JBICovCisjZW5kaWYgLyogRkxBU0hfRU1VICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfZW11LmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfZW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmODRjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTExEX0VNVV8KKyNkZWZpbmUgX0xMRF9FTVVfCisKKyNpbmNsdWRlICJmZnNwb3J0LmgiCisjaW5jbHVkZSAiZmZzZGVmcy5oIgorCisvKiBwcm90b3R5cGVzOiBlbXVsYXRvciBBUEkgZnVuY3Rpb25zICovCitleHRlcm4gdTE2IGVtdV9GbGFzaF9SZXNldCh2b2lkKTsKK2V4dGVybiB1MTYgZW11X0ZsYXNoX0luaXQodm9pZCk7CitleHRlcm4gaW50IGVtdV9GbGFzaF9SZWxlYXNlKHZvaWQpOworZXh0ZXJuIHUxNiBlbXVfUmVhZF9EZXZpY2VfSUQodm9pZCk7CitleHRlcm4gdTE2IGVtdV9FcmFzZV9CbG9jayh1MzIgYmxvY2tfYWRkcik7CitleHRlcm4gdTE2IGVtdV9Xcml0ZV9QYWdlX01haW4odTggKndyaXRlX2RhdGEsIHUzMiBCbG9jaywKKwkJCQl1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCk7CitleHRlcm4gdTE2IGVtdV9SZWFkX1BhZ2VfTWFpbih1OCAqcmVhZF9kYXRhLCB1MzIgQmxvY2ssIHUxNiBQYWdlLAorCQkJCSB1MTYgUGFnZUNvdW50KTsKK2V4dGVybiB1MTYgZW11X0V2ZW50X1N0YXR1cyh2b2lkKTsKK2V4dGVybiB2b2lkIGVtdV9FbmFibGVfRGlzYWJsZV9JbnRlcnJ1cHRzKHUxNiBJTlRfRU5BQkxFKTsKK2V4dGVybiB1MTYgZW11X1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIEJsb2NrLAorCQkJCQl1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCk7CitleHRlcm4gdTE2IGVtdV9Xcml0ZV9QYWdlX1NwYXJlKHU4ICp3cml0ZV9kYXRhLCB1MzIgQmxvY2ssCisJCQkJCXUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KTsKK2V4dGVybiB1MTYgZW11X1JlYWRfUGFnZV9NYWluX1NwYXJlKHU4ICpyZWFkX2RhdGEsIHUzMiBCbG9jaywKKwkJCQkgICAgICAgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpOworZXh0ZXJuIHUxNiBlbXVfUmVhZF9QYWdlX1NwYXJlKHU4ICpyZWFkX2RhdGEsIHUzMiBCbG9jaywgdTE2IFBhZ2UsCisJCQkJICB1MTYgUGFnZUNvdW50KTsKK2V4dGVybiB1MTYgZW11X0dldF9CYWRfQmxvY2sodTMyIGJsb2NrKTsKKwordTE2IGVtdV9DRE1BX0ZsYXNoX0luaXQodm9pZCk7Cit1MTYgZW11X0NETUFfRXhlY3V0ZV9DTURzKHUxNiB0YWdfY291bnQpOwordTE2IGVtdV9DRE1BX0V2ZW50X1N0YXR1cyh2b2lkKTsKKyNlbmRpZiAvKl9MTERfRU1VXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlMDViMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9tdGQuYwpAQCAtMCwwICsxLDY4NyBAQAorLyoKKyAqIE5BTkQgRmxhc2ggQ29udHJvbGxlciBEZXZpY2UgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uIGFuZCBpdHMgc3VwcGxpZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSAiZmxhc2guaCIKKyNpbmNsdWRlICJmZnNkZWZzLmgiCisjaW5jbHVkZSAibGxkX2VtdS5oIgorI2luY2x1ZGUgImxsZC5oIgorI2lmIENNRF9ETUEKKyNpbmNsdWRlICJsbGRfY2RtYS5oIgorI2VuZGlmCisKKyNkZWZpbmUgR0xPQl9MTERfUEFHRVMgICAgICAgICAgIDY0CisjZGVmaW5lIEdMT0JfTExEX1BBR0VfU0laRSAgICAgICAoNTEyKzE2KQorI2RlZmluZSBHTE9CX0xMRF9QQUdFX0RBVEFfU0laRSAgNTEyCisjZGVmaW5lIEdMT0JfTExEX0JMT0NLUyAgICAgICAgICAyMDQ4CisKKyNpZiBDTURfRE1BCisjaW5jbHVkZSAibGxkX2NkbWEuaCIKK3UzMiB0b3RhbFVzZWRCYW5rczsKK3UzMiB2YWxpZF9iYW5rc1tNQVhfQ0hBTlNdOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnNwZWN0cmFfbXRkOworc3RhdGljIGludCBtdGRkZXYgPSAtMTsKK21vZHVsZV9wYXJhbShtdGRkZXYsIGludCwgMCk7CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBtdGRfRmxhc2hfSW5pdAorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgQ3JlYXRlcyAmIGluaXRpYWxpemVzIHRoZSBmbGFzaCBSQU0gYXJyYXkuCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IG10ZF9GbGFzaF9Jbml0KHZvaWQpCit7CisJaWYgKG10ZGRldiA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIE1URCBkZXZpY2Ugc3BlY2lmaWVkLiBHaXZlIG10ZGRldiBwYXJhbWV0ZXJcbiIpOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwlzcGVjdHJhX210ZCA9IGdldF9tdGRfZGV2aWNlKE5VTEwsIG10ZGRldik7CisJaWYgKCFzcGVjdHJhX210ZCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBvYnRhaW4gTVREIGRldmljZSAjJWRcbiIsIG10ZGRldik7CisJCXJldHVybiBGQUlMOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJcmV0dXJuIFBBU1M7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBtdGRfRmxhc2hfUmVsZWFzZQorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgICAgICAgICBSZWxlYXNlcyB0aGUgZmxhc2guCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworaW50IG10ZF9GbGFzaF9SZWxlYXNlKHZvaWQpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisJaWYgKCFzcGVjdHJhX210ZCkKKwkJcmV0dXJuIFBBU1M7CisKKwlwdXRfbXRkX2RldmljZShzcGVjdHJhX210ZCk7CisJc3BlY3RyYV9tdGQgPSBOVUxMOworCisJcmV0dXJuIFBBU1M7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBtdGRfUmVhZF9EZXZpY2VfSUQKKyogSW5wdXRzOiAgICAgICBub25lCisqIE91dHB1dHM6ICAgICAgUEFTUz0xIEZBSUw9MAorKiBEZXNjcmlwdGlvbjogIFJlYWRzIHRoZSBpbmZvIGZyb20gdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLgorKiAgICAgICAgICAgICAgIFNldHMgdXAgRGV2aWNlSW5mbyBzdHJ1Y3R1cmUgd2l0aCBkZXZpY2UgcGFyYW1ldGVycworKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwordTE2IG10ZF9SZWFkX0RldmljZV9JRCh2b2lkKQoreworCXVpbnQ2NF90IHRtcDsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmICghc3BlY3RyYV9tdGQpCisJCXJldHVybiBGQUlMOworCisJRGV2aWNlSW5mby53RGV2aWNlTWFrZXIgPSAwOworCURldmljZUluZm8ud0RldmljZVR5cGUgPSA4OworCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrID0gU1BFQ1RSQV9TVEFSVF9CTE9DSzsKKwl0bXAgPSBzcGVjdHJhX210ZC0+c2l6ZTsKKwlkb19kaXYodG1wLCBzcGVjdHJhX210ZC0+ZXJhc2VzaXplKTsKKwlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA9IHRtcDsKKwlEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2sgPSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAtIDE7CisJRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jayA9IHNwZWN0cmFfbXRkLT5lcmFzZXNpemUgLyBzcGVjdHJhX210ZC0+d3JpdGVzaXplOworCURldmljZUluZm8ud1BhZ2VTaXplID0gc3BlY3RyYV9tdGQtPndyaXRlc2l6ZSArIHNwZWN0cmFfbXRkLT5vb2JzaXplOworCURldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSA9IHNwZWN0cmFfbXRkLT53cml0ZXNpemU7CisJRGV2aWNlSW5mby53UGFnZVNwYXJlU2l6ZSA9IHNwZWN0cmFfbXRkLT5vb2JzaXplOworCURldmljZUluZm8ud0Jsb2NrU2l6ZSA9IERldmljZUluZm8ud1BhZ2VTaXplICogRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jazsKKwlEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplICogRGV2aWNlSW5mby53UGFnZXNQZXJCbG9jazsKKwlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gPSAodTMyKSAoRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrIC0KKwkJCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrCisJCQkJCQkrIDEpOworCURldmljZUluZm8uTUxDRGV2aWNlID0gMDsvL3NwZWN0cmFfbXRkLT5jZWxsdHlwZSAmIE5BTkRfQ0lfQ0VMTFRZUEVfTVNLOworCURldmljZUluZm8ubkJpdHNJblBhZ2VOdW1iZXIgPQorCQkodTgpR0xPQl9DYWxjX1VzZWRfQml0cyhEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKTsKKwlEZXZpY2VJbmZvLm5CaXRzSW5QYWdlRGF0YVNpemUgPQorCQkodTgpR0xPQl9DYWxjX1VzZWRfQml0cyhEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUpOworCURldmljZUluZm8ubkJpdHNJbkJsb2NrRGF0YVNpemUgPQorCQkodTgpR0xPQl9DYWxjX1VzZWRfQml0cyhEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplKTsKKworI2lmIENNRF9ETUEKKwl0b3RhbFVzZWRCYW5rcyA9IDQ7CisJdmFsaWRfYmFua3NbMF0gPSAxOworCXZhbGlkX2JhbmtzWzFdID0gMTsKKwl2YWxpZF9iYW5rc1syXSA9IDE7CisJdmFsaWRfYmFua3NbM10gPSAxOworI2VuZGlmCisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIG10ZF9GbGFzaF9SZXNldAorKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgICAgICAgICBSZXNldCB0aGUgZmxhc2gKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgbXRkX0ZsYXNoX1Jlc2V0KHZvaWQpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gUEFTUzsKK30KKwordm9pZCBlcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqZSkKK3sKKwljb21wbGV0ZSgodm9pZCAqKWUtPnByaXYpOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgbXRkX0VyYXNlX0Jsb2NrCisqIElucHV0czogICAgICAgQWRkcmVzcworKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICAgICAgICAgIEVyYXNlIGEgYmxvY2sKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgbXRkX0VyYXNlX0Jsb2NrKHUzMiBibG9ja19hZGQpCit7CisJc3RydWN0IGVyYXNlX2luZm8gZXJhc2U7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcCk7CisJaW50IHJldDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKGJsb2NrX2FkZCA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgIm10ZF9FcmFzZV9CbG9jayBlcnJvciEgIgorCQkgICAgICAgIlRvbyBiaWcgYmxvY2sgYWRkcmVzczogJWRcbiIsIGJsb2NrX2FkZCk7CisJCXJldHVybiBGQUlMOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiRXJhc2luZyBibG9jayAlZFxuIiwKKwkJKGludClibG9ja19hZGQpOworCisJZXJhc2UubXRkID0gc3BlY3RyYV9tdGQ7CisJZXJhc2UuY2FsbGJhY2sgPSBlcmFzZV9jYWxsYmFjazsKKwllcmFzZS5hZGRyID0gYmxvY2tfYWRkICogc3BlY3RyYV9tdGQtPmVyYXNlc2l6ZTsKKwllcmFzZS5sZW4gPSBzcGVjdHJhX210ZC0+ZXJhc2VzaXplOworCWVyYXNlLnByaXYgPSAodW5zaWduZWQgbG9uZykmY29tcDsKKworCXJldCA9IHNwZWN0cmFfbXRkLT5lcmFzZShzcGVjdHJhX210ZCwgJmVyYXNlKTsKKwlpZiAoIXJldCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wKTsKKwkJaWYgKGVyYXNlLnN0YXRlICE9IE1URF9FUkFTRV9ET05FKQorCQkJcmV0ID0gLUVJTzsKKwl9CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdGRfRXJhc2VfQmxvY2sgZXJyb3IhICIKKwkJICAgICAgICJlcmFzZSBvZiByZWdpb24gWzB4JWxseCwgMHglbGx4XSBmYWlsZWRcbiIsCisJCSAgICAgICBlcmFzZS5hZGRyLCBlcmFzZS5sZW4pOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIG10ZF9Xcml0ZV9QYWdlX01haW4KKyogSW5wdXRzOiAgICAgICBXcml0ZSBidWZmZXIgYWRkcmVzcyBwb2ludGVyCisqICAgICAgICAgICAgICAgQmxvY2sgbnVtYmVyCisqICAgICAgICAgICAgICAgUGFnZSAgbnVtYmVyCisqICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBhZ2VzIHRvIHByb2Nlc3MKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgV3JpdGUgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciB0byBtYWluIGFyZWEgb2YgZmxhc2gKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgbXRkX1dyaXRlX1BhZ2VfTWFpbih1OCAqd3JpdGVfZGF0YSwgdTMyIEJsb2NrLAorCQkJICAgdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpCit7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykKKwkJcmV0dXJuIEZBSUw7CisKKwlpZiAoUGFnZSArIFBhZ2VDb3VudCA+IERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spCisJCXJldHVybiBGQUlMOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJtdGRfV3JpdGVfUGFnZV9NYWluOiAiCisJCSAgICAgICAibGJhICV1IFBhZ2UgJXUgUGFnZUNvdW50ICV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpUGFnZSwgKHVuc2lnbmVkIGludClQYWdlQ291bnQpOworCisKKwl3aGlsZSAoUGFnZUNvdW50KSB7CisJCXJldCA9IHNwZWN0cmFfbXRkLT53cml0ZShzcGVjdHJhX210ZCwKKwkJCQkJIChCbG9jayAqIHNwZWN0cmFfbXRkLT5lcmFzZXNpemUpICsgKFBhZ2UgKiBzcGVjdHJhX210ZC0+d3JpdGVzaXplKSwKKwkJCQkJIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSwgJnJldGxlbiwgd3JpdGVfZGF0YSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiBGQUlMOworCQl9CisJCXdyaXRlX2RhdGEgKz0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCQlQYWdlKys7CisJCVBhZ2VDb3VudC0tOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJcmV0dXJuIFBBU1M7Cit9CisKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogRnVuY3Rpb246ICAgICBtdGRfUmVhZF9QYWdlX01haW4KKyogSW5wdXRzOiAgICAgICBSZWFkIGJ1ZmZlciBhZGRyZXNzIHBvaW50ZXIKKyogICAgICAgICAgICAgICBCbG9jayBudW1iZXIKKyogICAgICAgICAgICAgICBQYWdlICBudW1iZXIKKyogICAgICAgICAgICAgICBOdW1iZXIgb2YgcGFnZXMgdG8gcHJvY2VzcworKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICBSZWFkIHRoZSBkYXRhIGZyb20gdGhlIGZsYXNoIG1haW4gYXJlYSB0byB0aGUgYnVmZmVyCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IG10ZF9SZWFkX1BhZ2VfTWFpbih1OCAqcmVhZF9kYXRhLCB1MzIgQmxvY2ssCisJCQkgIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KQoreworCXNpemVfdCByZXRsZW47CisJaW50IHJldCA9IDA7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykKKwkJcmV0dXJuIEZBSUw7CisKKwlpZiAoUGFnZSArIFBhZ2VDb3VudCA+IERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spCisJCXJldHVybiBGQUlMOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJtdGRfUmVhZF9QYWdlX01haW46ICIKKwkJICAgICAgICJsYmEgJXUgUGFnZSAldSBQYWdlQ291bnQgJXVcbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KUJsb2NrLAorCQkgICAgICAgKHVuc2lnbmVkIGludClQYWdlLCAodW5zaWduZWQgaW50KVBhZ2VDb3VudCk7CisKKworCXdoaWxlIChQYWdlQ291bnQpIHsKKwkJcmV0ID0gc3BlY3RyYV9tdGQtPnJlYWQoc3BlY3RyYV9tdGQsCisJCQkJCShCbG9jayAqIHNwZWN0cmFfbXRkLT5lcmFzZXNpemUpICsgKFBhZ2UgKiBzcGVjdHJhX210ZC0+d3JpdGVzaXplKSwKKwkJCQkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplLCAmcmV0bGVuLCByZWFkX2RhdGEpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gRkFJTDsKKwkJfQorCQlyZWFkX2RhdGEgKz0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCQlQYWdlKys7CisJCVBhZ2VDb3VudC0tOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJcmV0dXJuIFBBU1M7Cit9CisKKyNpZm5kZWYgRUxET1JBCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgbXRkX1JlYWRfUGFnZV9NYWluX1NwYXJlCisqIElucHV0czogICAgICAgV3JpdGUgQnVmZmVyCisqICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzCisqICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgc2l6ZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICAgICAgICAgIFJlYWQgZnJvbSBmbGFzaCBtYWluK3NwYXJlIGFyZWEKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgbXRkX1JlYWRfUGFnZV9NYWluX1NwYXJlKHU4ICpyZWFkX2RhdGEsIHUzMiBCbG9jaywKKwkJCQl1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmIChCbG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgUGFnZSBNYWluK1NwYXJlICIKKwkJICAgICAgICJFcnJvcjogQmxvY2sgQWRkcmVzcyB0b28gYmlnXG4iKTsKKwkJcmV0dXJuIEZBSUw7CisJfQorCisJaWYgKFBhZ2UgKyBQYWdlQ291bnQgPiBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUmVhZCBQYWdlIE1haW4rU3BhcmUgIgorCQkgICAgICAgIkVycm9yOiBQYWdlIG51bWJlciAlZCslZCB0b28gYmlnIGluIGJsb2NrICVkXG4iLAorCQkgICAgICAgUGFnZSwgUGFnZUNvdW50LCBCbG9jayk7CisJCXJldHVybiBGQUlMOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiUmVhZCBQYWdlIE1haW4gKyBTcGFyZSAtICIKKwkJICAgICAgICJOby4gb2YgcGFnZXMgJXUgYmxvY2sgJXUgc3RhcnQgcGFnZSAldVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpUGFnZUNvdW50LAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywgKHVuc2lnbmVkIGludClQYWdlKTsKKworCisJd2hpbGUgKFBhZ2VDb3VudCkgeworCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOworCQlpbnQgcmV0OworCisJCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMuZGF0YnVmID0gcmVhZF9kYXRhOworCQlvcHMubGVuID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCQlvcHMub29iYnVmID0gcmVhZF9kYXRhICsgRGV2aWNlSW5mby53UGFnZURhdGFTaXplICsgQlRTSUdfT0ZGU0VUOworCQlvcHMub29ibGVuID0gQlRTSUdfQllURVM7CisJCW9wcy5vb2JvZmZzID0gMDsKKworCQlyZXQgPSBzcGVjdHJhX210ZC0+cmVhZF9vb2Ioc3BlY3RyYV9tdGQsCisJCQkJCSAgICAoQmxvY2sgKiBzcGVjdHJhX210ZC0+ZXJhc2VzaXplKSArIChQYWdlICogc3BlY3RyYV9tdGQtPndyaXRlc2l6ZSksCisJCQkJCSAgICAmb3BzKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIEZBSUw7CisJCX0KKwkJcmVhZF9kYXRhICs9IERldmljZUluZm8ud1BhZ2VTaXplOworCQlQYWdlKys7CisJCVBhZ2VDb3VudC0tOworCX0KKworCXJldHVybiBQQVNTOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgbXRkX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZQorKiBJbnB1dHM6ICAgICAgIFdyaXRlIGJ1ZmZlcgorKiAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcworKiAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGxlbmd0aAorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICAgICAgICAgIFdyaXRlIHRoZSBidWZmZXIgdG8gbWFpbitzcGFyZSBhcmVhIG9mIGZsYXNoCisqCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordTE2IG10ZF9Xcml0ZV9QYWdlX01haW5fU3BhcmUodTggKndyaXRlX2RhdGEsIHUzMiBCbG9jaywKKwkJCQkgdTE2IFBhZ2UsIHUxNiBwYWdlX2NvdW50KQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKEJsb2NrID49IERldmljZUluZm8ud1RvdGFsQmxvY2tzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV3JpdGUgUGFnZSBNYWluICsgU3BhcmUgIgorCQkgICAgICAgIkVycm9yOiBCbG9jayBBZGRyZXNzIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwlpZiAoUGFnZSArIHBhZ2VfY291bnQgPiBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV3JpdGUgUGFnZSBNYWluICsgU3BhcmUgIgorCQkgICAgICAgIkVycm9yOiBQYWdlIG51bWJlciAlZCslZCB0b28gYmlnIGluIGJsb2NrICVkXG4iLAorCQkgICAgICAgUGFnZSwgcGFnZV9jb3VudCwgQmxvY2spOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gRkFJTDsKKwl9CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIldyaXRlIFBhZ2UgTWFpbitTcGFyZSAtICIKKwkJICAgICAgICJOby4gb2YgcGFnZXMgJXUgYmxvY2sgJXUgc3RhcnQgcGFnZSAldVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpcGFnZV9jb3VudCwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpQmxvY2ssICh1bnNpZ25lZCBpbnQpUGFnZSk7CisKKwl3aGlsZSAocGFnZV9jb3VudCkgeworCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOworCQlpbnQgcmV0OworCisJCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMuZGF0YnVmID0gd3JpdGVfZGF0YTsKKwkJb3BzLmxlbiA9IERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKwkJb3BzLm9vYmJ1ZiA9IHdyaXRlX2RhdGEgKyBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgKyBCVFNJR19PRkZTRVQ7CisJCW9wcy5vb2JsZW4gPSBCVFNJR19CWVRFUzsKKwkJb3BzLm9vYm9mZnMgPSAwOworCisJCXJldCA9IHNwZWN0cmFfbXRkLT53cml0ZV9vb2Ioc3BlY3RyYV9tdGQsCisJCQkJCSAgICAgKEJsb2NrICogc3BlY3RyYV9tdGQtPmVyYXNlc2l6ZSkgKyAoUGFnZSAqIHNwZWN0cmFfbXRkLT53cml0ZXNpemUpLAorCQkJCQkgICAgICZvcHMpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gRkFJTDsKKwkJfQorCQl3cml0ZV9kYXRhICs9IERldmljZUluZm8ud1BhZ2VTaXplOworCQlQYWdlKys7CisJCXBhZ2VfY291bnQtLTsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIG10ZF9Xcml0ZV9QYWdlX1NwYXJlCisqIElucHV0czogICAgICAgV3JpdGUgYnVmZmVyCisqICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzCisqICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgc2l6ZQorKiBPdXRwdXRzOiAgICAgIFBBU1M9MCAobm90aWNlIDA9b2sgaGVyZSkKKyogRGVzY3JpcHRpb246ICAgICAgICAgIFdyaXRlIHRoZSBidWZmZXIgaW4gdGhlIHNwYXJlIGFyZWEKKyoKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgbXRkX1dyaXRlX1BhZ2VfU3BhcmUodTggKndyaXRlX2RhdGEsIHUzMiBCbG9jaywKKwkJCSAgICB1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCkKK3sKKwlXQVJOX09OKDEpOworCXJldHVybiBGQUlMOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgbXRkX1JlYWRfUGFnZV9TcGFyZQorKiBJbnB1dHM6ICAgICAgIFdyaXRlIEJ1ZmZlcgorKiAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcworKiAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIHNpemUKKyogT3V0cHV0czogICAgICBQQVNTPTAgKG5vdGljZSAwPW9rIGhlcmUpCisqIERlc2NyaXB0aW9uOiAgICAgICAgICBSZWFkIGRhdGEgZnJvbSB0aGUgc3BhcmUgYXJlYQorKgorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBtdGRfUmVhZF9QYWdlX1NwYXJlKHU4ICpyZWFkX2RhdGEsIHUzMiBCbG9jaywKKwkJCSAgIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KQoreworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJaWYgKEJsb2NrID49IERldmljZUluZm8ud1RvdGFsQmxvY2tzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUmVhZCBQYWdlIFNwYXJlICIKKwkJICAgICAgICJFcnJvcjogQmxvY2sgQWRkcmVzcyB0b28gYmlnXG4iKTsKKwkJcmV0dXJuIEZBSUw7CisJfQorCisJaWYgKFBhZ2UgKyBQYWdlQ291bnQgPiBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUmVhZCBQYWdlIFNwYXJlICIKKwkJICAgICAgICJFcnJvcjogUGFnZSBudW1iZXIgdG9vIGJpZ1xuIik7CisJCXJldHVybiBGQUlMOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiUmVhZCBQYWdlIFNwYXJlLSAiCisJCSAgICAgICAiYmxvY2sgJXUgcGFnZSAldSAoJXUgcGFnZXMpXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClCbG9jaywgKHVuc2lnbmVkIGludClQYWdlLCBQYWdlQ291bnQpOworCisJd2hpbGUgKFBhZ2VDb3VudCkgeworCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOworCQlpbnQgcmV0OworCisJCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMuZGF0YnVmID0gTlVMTDsKKwkJb3BzLmxlbiA9IDA7CisJCW9wcy5vb2JidWYgPSByZWFkX2RhdGE7CisJCW9wcy5vb2JsZW4gPSBCVFNJR19CWVRFUzsKKwkJb3BzLm9vYm9mZnMgPSAwOworCisJCXJldCA9IHNwZWN0cmFfbXRkLT5yZWFkX29vYihzcGVjdHJhX210ZCwKKwkJCQkJICAgIChCbG9jayAqIHNwZWN0cmFfbXRkLT5lcmFzZXNpemUpICsgKFBhZ2UgKiBzcGVjdHJhX210ZC0+d3JpdGVzaXplKSwKKwkJCQkJICAgICZvcHMpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gRkFJTDsKKwkJfQorCisJCXJlYWRfZGF0YSArPSBEZXZpY2VJbmZvLndQYWdlU2l6ZTsKKwkJUGFnZSsrOworCQlQYWdlQ291bnQtLTsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJgorKiBGdW5jdGlvbjogICAgIG10ZF9FbmFibGVfRGlzYWJsZV9JbnRlcnJ1cHRzCisqIElucHV0czogICAgICAgZW5hYmxlIG9yIGRpc2FibGUKKyogT3V0cHV0czogICAgICBub25lCisqIERlc2NyaXB0aW9uOiAgTk9QCisqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwordm9pZCBtdGRfRW5hYmxlX0Rpc2FibGVfSW50ZXJydXB0cyh1MTYgSU5UX0VOQUJMRSkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKK30KKwordTE2IG10ZF9HZXRfQmFkX0Jsb2NrKHUzMiBibG9jaykKK3sKKwlyZXR1cm4gMDsKK30KKworI2lmIENNRF9ETUEKKy8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYKKyogU3VwcG9ydCBmb3IgQ0RNQSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICBtdGRfQ0RNQV9GbGFzaF9Jbml0CisqICAgICAgICAgICBDRE1BX3Byb2Nlc3NfZGF0YSBjb21tYW5kICAgKHVzZSBMTERfQ0RNQSkKKyogICAgICAgICAgIENETUFfTWVtQ29weV9DTUQgICAgICAgICAgICAodXNlIExMRF9DRE1BKQorKiAgICAgICBtdGRfQ0RNQV9leGVjdXRlIGFsbCBjb21tYW5kcworKiAgICAgICBtdGRfQ0RNQV9FdmVudF9TdGF0dXMKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBtdGRfQ0RNQV9GbGFzaF9Jbml0KHZvaWQpCit7CisJdTE2IGk7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfREVTQ1MgKyBNQVhfQ0hBTlM7IGkrKykgeworCQlQZW5kaW5nQ01EW2ldLkNNRCA9IDA7CisJCVBlbmRpbmdDTURbaV0uVGFnID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5EYXRhQWRkciA9IDA7CisJCVBlbmRpbmdDTURbaV0uQmxvY2sgPSAwOworCQlQZW5kaW5nQ01EW2ldLlBhZ2UgPSAwOworCQlQZW5kaW5nQ01EW2ldLlBhZ2VDb3VudCA9IDA7CisJCVBlbmRpbmdDTURbaV0uRGF0YURlc3RBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5EYXRhU3JjQWRkciA9IDA7CisJCVBlbmRpbmdDTURbaV0uTWVtQ29weUJ5dGVDbnQgPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzBdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5DaGFuU3luY1sxXSA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbMl0gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzNdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5DaGFuU3luY1s0XSA9IDA7CisJCVBlbmRpbmdDTURbaV0uU3RhdHVzID0gMzsKKwl9CisKKwlyZXR1cm4gUEFTUzsKK30KKworc3RhdGljIHZvaWQgbXRkX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJLyogVE9ETzogIC4uLiAqLworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgQ0RNQV9FeGVjdXRlX0NNRHMKKyogSW5wdXRzOiAgICAgICB0YWdfY291bnQ6ICB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgY21kcyB0byBkbworKiBPdXRwdXRzOiAgICAgIFBBU1MvRkFJTAorKiBEZXNjcmlwdGlvbjogIGV4ZWN1dGUgZWFjaCBjb21tYW5kIGluIHRoZSBwZW5kaW5nIENNRCBhcnJheQorKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KK3UxNiBtdGRfQ0RNQV9FeGVjdXRlX0NNRHModTE2IHRhZ19jb3VudCkKK3sKKwl1MTYgaSwgajsKKwl1OCBDTUQ7CQkvKiBjbWQgcGFyYW1ldGVyICovCisJdTggKmRhdGE7CisJdTMyIGJsb2NrOworCXUxNiBwYWdlOworCXUxNiBjb3VudDsKKwl1MTYgc3RhdHVzID0gUEFTUzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICJBdCBzdGFydCBvZiBFeGVjdXRlIENNRHM6ICIKKwkJICAgICAgICJUYWcgQ291bnQgJXVcbiIsIHRhZ19jb3VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdG90YWxVc2VkQmFua3M7IGkrKykgeworCQlQZW5kaW5nQ01EW2ldLkNNRCA9IERVTU1ZX0NNRDsKKwkJUGVuZGluZ0NNRFtpXS5UYWcgPSAweEZGOworCQlQZW5kaW5nQ01EW2ldLkJsb2NrID0KKwkJICAgIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKSAqIGk7CisKKwkJZm9yIChqID0gMDsgaiA8PSBNQVhfQ0hBTlM7IGorKykKKwkJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbal0gPSAwOworCX0KKworCUNETUFfRXhlY3V0ZV9DTURzKHRhZ19jb3VudCk7CisKKyNpZmRlZiBWRVJCT1NFCisJCXByaW50X3BlbmRpbmdfY21kcyh0YWdfY291bnQpOworI2VuZGlmCisjaWYgREVCVUdfU1lOQworCX0KKwlkZWJ1Z19zeW5jX2NudCsrOworI2VuZGlmCisKKwlmb3IgKGkgPSBNQVhfQ0hBTlM7CisJICAgICBpIDwgdGFnX2NvdW50ICsgTUFYX0NIQU5TOyBpKyspIHsKKwkJQ01EID0gUGVuZGluZ0NNRFtpXS5DTUQ7CisJCWRhdGEgPSBQZW5kaW5nQ01EW2ldLkRhdGFBZGRyOworCQlibG9jayA9IFBlbmRpbmdDTURbaV0uQmxvY2s7CisJCXBhZ2UgPSBQZW5kaW5nQ01EW2ldLlBhZ2U7CisJCWNvdW50ID0gUGVuZGluZ0NNRFtpXS5QYWdlQ291bnQ7CisKKwkJc3dpdGNoIChDTUQpIHsKKwkJY2FzZSBFUkFTRV9DTUQ6CisJCQltdGRfRXJhc2VfQmxvY2soYmxvY2spOworCQkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSBQQVNTOworCQkJYnJlYWs7CisJCWNhc2UgV1JJVEVfTUFJTl9DTUQ6CisJCQltdGRfV3JpdGVfUGFnZV9NYWluKGRhdGEsIGJsb2NrLCBwYWdlLCBjb3VudCk7CisJCQlQZW5kaW5nQ01EW2ldLlN0YXR1cyA9IFBBU1M7CisJCQlicmVhazsKKwkJY2FzZSBXUklURV9NQUlOX1NQQVJFX0NNRDoKKwkJCW10ZF9Xcml0ZV9QYWdlX01haW5fU3BhcmUoZGF0YSwgYmxvY2ssIHBhZ2UsIGNvdW50KTsKKwkJCVBlbmRpbmdDTURbaV0uU3RhdHVzID0gUEFTUzsKKwkJCWJyZWFrOworCQljYXNlIFJFQURfTUFJTl9DTUQ6CisJCQltdGRfUmVhZF9QYWdlX01haW4oZGF0YSwgYmxvY2ssIHBhZ2UsIGNvdW50KTsKKwkJCVBlbmRpbmdDTURbaV0uU3RhdHVzID0gUEFTUzsKKwkJCWJyZWFrOworCQljYXNlIE1FTUNPUFlfQ01EOgorCQkJbWVtY3B5KFBlbmRpbmdDTURbaV0uRGF0YURlc3RBZGRyLAorCQkJICAgICAgIFBlbmRpbmdDTURbaV0uRGF0YVNyY0FkZHIsCisJCQkgICAgICAgUGVuZGluZ0NNRFtpXS5NZW1Db3B5Qnl0ZUNudCk7CisJCWNhc2UgRFVNTVlfQ01EOgorCQkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSBQQVNTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQZW5kaW5nQ01EW2ldLlN0YXR1cyA9IEZBSUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogVGVtcGVyb3J5IGFkZGluZyBjb2RlIHRvIHJlc2V0IFBlbmRpbmdDTUQgYXJyYXkgZm9yIGJhc2ljIHRlc3RpbmcuCisJICogSXQgc2hvdWxkIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiAgZXZlbnQgc3RhdHVzIGZ1bmN0aW9uLgorCSAqLworCWZvciAoaSA9IHRhZ19jb3VudCArIE1BWF9DSEFOUzsgaSA8IE1BWF9ERVNDUzsgaSsrKSB7CisJCVBlbmRpbmdDTURbaV0uQ01EID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5UYWcgPSAwOworCQlQZW5kaW5nQ01EW2ldLkRhdGFBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5CbG9jayA9IDA7CisJCVBlbmRpbmdDTURbaV0uUGFnZSA9IDA7CisJCVBlbmRpbmdDTURbaV0uUGFnZUNvdW50ID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5EYXRhRGVzdEFkZHIgPSAwOworCQlQZW5kaW5nQ01EW2ldLkRhdGFTcmNBZGRyID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5NZW1Db3B5Qnl0ZUNudCA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbMF0gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzFdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5DaGFuU3luY1syXSA9IDA7CisJCVBlbmRpbmdDTURbaV0uQ2hhblN5bmNbM10gPSAwOworCQlQZW5kaW5nQ01EW2ldLkNoYW5TeW5jWzRdID0gMDsKKwkJUGVuZGluZ0NNRFtpXS5TdGF0dXMgPSBDTURfTk9UX0RPTkU7CisJfQorCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICJBdCBlbmQgb2YgRXhlY3V0ZSBDTURzLlxuIik7CisKKwltdGRfaXNyKDAsIDApOyAvKiBUaGlzIGlzIGEgbnVsbCBpc3Igbm93LiBOZWVkIGZpbGwgaXQgaW4gZnV0dXJlICovCisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmCisqIEZ1bmN0aW9uOiAgICAgbXRkX0V2ZW50X1N0YXR1cworKiBJbnB1dHM6ICAgICAgIG5vbmUKKyogT3V0cHV0czogICAgICBFdmVudF9TdGF0dXMgY29kZQorKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCB0byBmb3JjZSBlcnJvcnMKKyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCit1MTYgbXRkX0NETUFfRXZlbnRfU3RhdHVzKHZvaWQpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gRVZFTlRfUEFTUzsKK30KKworI2VuZGlmIC8qIENNRF9ETUEgKi8KKyNlbmRpZiAvKiAhRUxET1JBICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4MWVlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9tdGQuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTExEX01URF8KKyNkZWZpbmUgX0xMRF9NVERfCisKKyNpbmNsdWRlICJmZnNwb3J0LmgiCisjaW5jbHVkZSAiZmZzZGVmcy5oIgorCisvKiBwcm90b3R5cGVzOiBNVEQgQVBJIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHUxNiBtdGRfRmxhc2hfUmVzZXQodm9pZCk7CitleHRlcm4gdTE2IG10ZF9GbGFzaF9Jbml0KHZvaWQpOworZXh0ZXJuIGludCBtdGRfRmxhc2hfUmVsZWFzZSh2b2lkKTsKK2V4dGVybiB1MTYgbXRkX1JlYWRfRGV2aWNlX0lEKHZvaWQpOworZXh0ZXJuIHUxNiBtdGRfRXJhc2VfQmxvY2sodTMyIGJsb2NrX2FkZHIpOworZXh0ZXJuIHUxNiBtdGRfV3JpdGVfUGFnZV9NYWluKHU4ICp3cml0ZV9kYXRhLCB1MzIgQmxvY2ssCisJCQkJdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpOworZXh0ZXJuIHUxNiBtdGRfUmVhZF9QYWdlX01haW4odTggKnJlYWRfZGF0YSwgdTMyIEJsb2NrLCB1MTYgUGFnZSwKKwkJCQkgdTE2IFBhZ2VDb3VudCk7CitleHRlcm4gdTE2IG10ZF9FdmVudF9TdGF0dXModm9pZCk7CitleHRlcm4gdm9pZCBtdGRfRW5hYmxlX0Rpc2FibGVfSW50ZXJydXB0cyh1MTYgSU5UX0VOQUJMRSk7CitleHRlcm4gdTE2IG10ZF9Xcml0ZV9QYWdlX01haW5fU3BhcmUodTggKndyaXRlX2RhdGEsIHUzMiBCbG9jaywKKwkJCQkJdTE2IFBhZ2UsIHUxNiBQYWdlQ291bnQpOworZXh0ZXJuIHUxNiBtdGRfV3JpdGVfUGFnZV9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIEJsb2NrLAorCQkJCQl1MTYgUGFnZSwgdTE2IFBhZ2VDb3VudCk7CitleHRlcm4gdTE2IG10ZF9SZWFkX1BhZ2VfTWFpbl9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgQmxvY2ssCisJCQkJICAgICAgIHUxNiBQYWdlLCB1MTYgUGFnZUNvdW50KTsKK2V4dGVybiB1MTYgbXRkX1JlYWRfUGFnZV9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgQmxvY2ssIHUxNiBQYWdlLAorCQkJCSAgdTE2IFBhZ2VDb3VudCk7CitleHRlcm4gdTE2IG10ZF9HZXRfQmFkX0Jsb2NrKHUzMiBibG9jayk7CisKK3UxNiBtdGRfQ0RNQV9GbGFzaF9Jbml0KHZvaWQpOwordTE2IG10ZF9DRE1BX0V4ZWN1dGVfQ01Ecyh1MTYgdGFnX2NvdW50KTsKK3UxNiBtdGRfQ0RNQV9FdmVudF9TdGF0dXModm9pZCk7CisjZW5kaWYgLypfTExEX01URF8qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX25hbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjM2FkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKQEAgLTAsMCArMSwyNjAxIEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImxsZC5oIgorI2luY2x1ZGUgImxsZF9uYW5kLmgiCisjaW5jbHVkZSAibGxkX2NkbWEuaCIKKworI2luY2x1ZGUgInNwZWN0cmFzd2NvbmZpZy5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisjaW5jbHVkZSAiZmZzZGVmcy5oIgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2luY2x1ZGUgIm5hbmRfcmVncy5oIgorCisjZGVmaW5lIFNQRUNUUkFfTkFORF9OQU1FICAgICJuZCIKKworI2RlZmluZSBDRUlMX0RJVihYLCBZKSAoKChYKSUoWSkpID8gKChYKS8oWSkrMSkgOiAoKFgpLyhZKSkpCisjZGVmaW5lIE1BWF9QQUdFU19QRVJfUlcgICAgICAgIDEyOAorCisjZGVmaW5lIElOVF9JRExFX1NUQVRFICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9SRUFEX1BBR0VfTUFJTiAgICAweDAxCisjZGVmaW5lIElOVF9XUklURV9QQUdFX01BSU4gICAgMHgwMgorI2RlZmluZSBJTlRfUElQRUxJTkVfUkVBRF9BSEVBRCAgICAweDA0CisjZGVmaW5lIElOVF9QSVBFTElORV9XUklURV9BSEVBRCAgICAweDA4CisjZGVmaW5lIElOVF9NVUxUSV9QTEFORV9SRUFEICAgIDB4MTAKKyNkZWZpbmUgSU5UX01VTFRJX1BMQU5FX1dSSVRFICAgIDB4MTEKKworc3RhdGljIHUzMiBlbmFibGVfZWNjOworCitzdHJ1Y3QgbXJzdF9uYW5kX2luZm8gaW5mbzsKKworaW50IHRvdGFsVXNlZEJhbmtzOwordTMyIEdMT0JfdmFsaWRfYmFua3NbTExEX01BWF9GTEFTSF9CQU5LU107CisKK3ZvaWQgX19pb21lbSAqRmxhc2hSZWc7Cit2b2lkIF9faW9tZW0gKkZsYXNoTWVtOworCit1MTYgY29uZl9wYXJhbWV0ZXJzW10gPSB7CisJMHgwMDAwLAorCTB4MDAwMCwKKwkweDAxRjQsCisJMHgwMUY0LAorCTB4MDFGNCwKKwkweDAxRjQsCisJMHgwMDAwLAorCTB4MDAwMCwKKwkweDAwMDEsCisJMHgwMDAwLAorCTB4MDAwMCwKKwkweDAwMDAsCisJMHgwMDAwLAorCTB4MDA0MCwKKwkweDAwMDEsCisJMHgwMDBBLAorCTB4MDAwQSwKKwkweDAwMEEsCisJMHgwMDAwLAorCTB4MDAwMCwKKwkweDAwMDUsCisJMHgwMDEyLAorCTB4MDAwQworfTsKKwordTE2ICAgTkFORF9HZXRfQmFkX0Jsb2NrKHUzMiBibG9jaykKK3sKKwl1MzIgc3RhdHVzID0gUEFTUzsKKwl1MzIgZmxhZ19ieXRlcyAgPSAwOworCXUzMiBza2lwX2J5dGVzICA9IERldmljZUluZm8ud1NwYXJlU2tpcEJ5dGVzOworCXUzMiBwYWdlLCBpOworCXU4ICpwUmVhZFNwYXJlQnVmID0gYnVmX2dldF9iYWRfYmxvY2s7CisKKwlpZiAoZW5hYmxlX2VjYykKKwkJZmxhZ19ieXRlcyA9IERldmljZUluZm8ud051bVBhZ2VTcGFyZUZsYWc7CisKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMjsgcGFnZSsrKSB7CisJCXN0YXR1cyA9IE5BTkRfUmVhZF9QYWdlX1NwYXJlKHBSZWFkU3BhcmVCdWYsIGJsb2NrLCBwYWdlLCAxKTsKKwkJaWYgKHN0YXR1cyAhPSBQQVNTKQorCQkJcmV0dXJuIFJFQURfRVJST1I7CisJCWZvciAoaSA9IGZsYWdfYnl0ZXM7IGkgPCAoZmxhZ19ieXRlcyArIHNraXBfYnl0ZXMpOyBpKyspCisJCQlpZiAocFJlYWRTcGFyZUJ1ZltpXSAhPSAweGZmKQorCQkJCXJldHVybiBERUZFQ1RJVkVfQkxPQ0s7CisJfQorCisJZm9yIChwYWdlID0gMTsgcGFnZSA8IDM7IHBhZ2UrKykgeworCQlzdGF0dXMgPSBOQU5EX1JlYWRfUGFnZV9TcGFyZShwUmVhZFNwYXJlQnVmLCBibG9jaywKKwkJCURldmljZUluZm8ud1BhZ2VzUGVyQmxvY2sgLSBwYWdlICwgMSk7CisJCWlmIChzdGF0dXMgIT0gUEFTUykKKwkJCXJldHVybiBSRUFEX0VSUk9SOworCQlmb3IgKGkgPSBmbGFnX2J5dGVzOyBpIDwgKGZsYWdfYnl0ZXMgKyBza2lwX2J5dGVzKTsgaSsrKQorCQkJaWYgKHBSZWFkU3BhcmVCdWZbaV0gIT0gMHhmZikKKwkJCQlyZXR1cm4gREVGRUNUSVZFX0JMT0NLOworCX0KKworCXJldHVybiBHT09EX0JMT0NLOworfQorCisKK3UxNiBOQU5EX0ZsYXNoX1Jlc2V0KHZvaWQpCit7CisJdTMyIGk7CisJdTMyIGludHJfc3RhdHVzX3JzdF9jb21wWzRdID0ge0lOVFJfU1RBVFVTMF9fUlNUX0NPTVAsCisJCUlOVFJfU1RBVFVTMV9fUlNUX0NPTVAsCisJCUlOVFJfU1RBVFVTMl9fUlNUX0NPTVAsCisJCUlOVFJfU1RBVFVTM19fUlNUX0NPTVB9OworCXUzMiBpbnRyX3N0YXR1c190aW1lX291dFs0XSA9IHtJTlRSX1NUQVRVUzBfX1RJTUVfT1VULAorCQlJTlRSX1NUQVRVUzFfX1RJTUVfT1VULAorCQlJTlRSX1NUQVRVUzJfX1RJTUVfT1VULAorCQlJTlRSX1NUQVRVUzNfX1RJTUVfT1VUfTsKKwl1MzIgaW50cl9zdGF0dXNbNF0gPSB7SU5UUl9TVEFUVVMwLCBJTlRSX1NUQVRVUzEsCisJCUlOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwl1MzIgZGV2aWNlX3Jlc2V0X2JhbmtzWzRdID0ge0RFVklDRV9SRVNFVF9fQkFOSzAsCisJCURFVklDRV9SRVNFVF9fQkFOSzEsCisJCURFVklDRV9SRVNFVF9fQkFOSzIsCisJCURFVklDRV9SRVNFVF9fQkFOSzN9OworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IExMRF9NQVhfRkxBU0hfQkFOS1M7IGkrKykKKwkJaW93cml0ZTMyKGludHJfc3RhdHVzX3JzdF9jb21wW2ldIHwgaW50cl9zdGF0dXNfdGltZV9vdXRbaV0sCisJCUZsYXNoUmVnICsgaW50cl9zdGF0dXNbaV0pOworCisJZm9yIChpID0gMCA7IGkgPCBMTERfTUFYX0ZMQVNIX0JBTktTOyBpKyspIHsKKwkJaW93cml0ZTMyKGRldmljZV9yZXNldF9iYW5rc1tpXSwgRmxhc2hSZWcgKyBERVZJQ0VfUkVTRVQpOworCQl3aGlsZSAoIShpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzW2ldKSAmCisJCQkoaW50cl9zdGF0dXNfcnN0X2NvbXBbaV0gfCBpbnRyX3N0YXR1c190aW1lX291dFtpXSkpKQorCQkJOworCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1c1tpXSkgJgorCQkJaW50cl9zdGF0dXNfdGltZV9vdXRbaV0pCisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJIk5BTkQgUmVzZXQgb3BlcmF0aW9uIHRpbWVkIG91dCBvbiBiYW5rICVkXG4iLCBpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTExEX01BWF9GTEFTSF9CQU5LUzsgaSsrKQorCQlpb3dyaXRlMzIoaW50cl9zdGF0dXNfcnN0X2NvbXBbaV0gfCBpbnRyX3N0YXR1c190aW1lX291dFtpXSwKKwkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXNbaV0pOworCisJcmV0dXJuIFBBU1M7Cit9CisKK3N0YXRpYyB2b2lkIE5BTkRfT05GaV9UaW1pbmdfTW9kZSh1MTYgbW9kZSkKK3sKKwl1MTYgVHJlYVs2XSA9IHs0MCwgMzAsIDI1LCAyMCwgMjAsIDE2fTsKKwl1MTYgVHJwWzZdID0gezUwLCAyNSwgMTcsIDE1LCAxMiwgMTB9OworCXUxNiBUcmVoWzZdID0gezMwLCAxNSwgMTUsIDEwLCAxMCwgN307CisJdTE2IFRyY1s2XSA9IHsxMDAsIDUwLCAzNSwgMzAsIDI1LCAyMH07CisJdTE2IFRyaG9oWzZdID0gezAsIDE1LCAxNSwgMTUsIDE1LCAxNX07CisJdTE2IFRybG9oWzZdID0gezAsIDAsIDAsIDAsIDUsIDV9OworCXUxNiBUY2VhWzZdID0gezEwMCwgNDUsIDMwLCAyNSwgMjUsIDI1fTsKKwl1MTYgVGFkbFs2XSA9IHsyMDAsIDEwMCwgMTAwLCAxMDAsIDcwLCA3MH07CisJdTE2IFRyaHdbNl0gPSB7MjAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMH07CisJdTE2IFRyaHpbNl0gPSB7MjAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMH07CisJdTE2IFR3aHJbNl0gPSB7MTIwLCA4MCwgODAsIDYwLCA2MCwgNjB9OworCXUxNiBUY3NbNl0gPSB7NzAsIDM1LCAyNSwgMjUsIDIwLCAxNX07CisKKwl1MTYgVGNsc1Jpc2luZyA9IDE7CisJdTE2IGRhdGFfaW52YWxpZF9yaG9oLCBkYXRhX2ludmFsaWRfcmxvaCwgZGF0YV9pbnZhbGlkOworCXUxNiBkdl93aW5kb3cgPSAwOworCXUxNiBlbl9sbywgZW5faGk7CisJdTE2IGFjY19jbGtzOworCXUxNiBhZGRyXzJfZGF0YSwgcmVfMl93ZSwgcmVfMl9yZSwgd2VfMl9yZSwgY3NfY250OworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwllbl9sbyA9IENFSUxfRElWKFRycFttb2RlXSwgQ0xLX1gpOworCWVuX2hpID0gQ0VJTF9ESVYoVHJlaFttb2RlXSwgQ0xLX1gpOworCisjaWYgT05GSV9CTE9PTV9USU1FCisJaWYgKChlbl9oaSAqIENMS19YKSA8IChUcmVoW21vZGVdICsgMikpCisJCWVuX2hpKys7CisjZW5kaWYKKworCWlmICgoZW5fbG8gKyBlbl9oaSkgKiBDTEtfWCA8IFRyY1ttb2RlXSkKKwkJZW5fbG8gKz0gQ0VJTF9ESVYoKFRyY1ttb2RlXSAtIChlbl9sbyArIGVuX2hpKSAqIENMS19YKSwgQ0xLX1gpOworCisJaWYgKChlbl9sbyArIGVuX2hpKSA8IENMS19NVUxUSSkKKwkJZW5fbG8gKz0gQ0xLX01VTFRJIC0gZW5fbG8gLSBlbl9oaTsKKworCXdoaWxlIChkdl93aW5kb3cgPCA4KSB7CisJCWRhdGFfaW52YWxpZF9yaG9oID0gZW5fbG8gKiBDTEtfWCArIFRyaG9oW21vZGVdOworCisJCWRhdGFfaW52YWxpZF9ybG9oID0gKGVuX2xvICsgZW5faGkpICogQ0xLX1ggKyBUcmxvaFttb2RlXTsKKworCQlkYXRhX2ludmFsaWQgPQorCQkgICAgZGF0YV9pbnZhbGlkX3Job2ggPAorCQkgICAgZGF0YV9pbnZhbGlkX3Jsb2ggPyBkYXRhX2ludmFsaWRfcmhvaCA6IGRhdGFfaW52YWxpZF9ybG9oOworCisJCWR2X3dpbmRvdyA9IGRhdGFfaW52YWxpZCAtIFRyZWFbbW9kZV07CisKKwkJaWYgKGR2X3dpbmRvdyA8IDgpCisJCQllbl9sbysrOworCX0KKworCWFjY19jbGtzID0gQ0VJTF9ESVYoVHJlYVttb2RlXSwgQ0xLX1gpOworCisJd2hpbGUgKCgoYWNjX2Nsa3MgKiBDTEtfWCkgLSBUcmVhW21vZGVdKSA8IDMpCisJCWFjY19jbGtzKys7CisKKwlpZiAoKGRhdGFfaW52YWxpZCAtIGFjY19jbGtzICogQ0xLX1gpIDwgMikKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkOiBXYXJuaW5nIVxuIiwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisKKwlhZGRyXzJfZGF0YSA9IENFSUxfRElWKFRhZGxbbW9kZV0sIENMS19YKTsKKwlyZV8yX3dlID0gQ0VJTF9ESVYoVHJod1ttb2RlXSwgQ0xLX1gpOworCXJlXzJfcmUgPSBDRUlMX0RJVihUcmh6W21vZGVdLCBDTEtfWCk7CisJd2VfMl9yZSA9IENFSUxfRElWKFR3aHJbbW9kZV0sIENMS19YKTsKKwljc19jbnQgPSBDRUlMX0RJVigoVGNzW21vZGVdIC0gVHJwW21vZGVdKSwgQ0xLX1gpOworCWlmICghVGNsc1Jpc2luZykKKwkJY3NfY250ID0gQ0VJTF9ESVYoVGNzW21vZGVdLCBDTEtfWCk7CisJaWYgKGNzX2NudCA9PSAwKQorCQljc19jbnQgPSAxOworCisJaWYgKFRjZWFbbW9kZV0pIHsKKwkJd2hpbGUgKCgoY3NfY250ICogQ0xLX1gpICsgVHJlYVttb2RlXSkgPCBUY2VhW21vZGVdKQorCQkJY3NfY250Kys7CisJfQorCisjaWYgTU9ERTVfV09SS0FST1VORAorCWlmIChtb2RlID09IDUpCisJCWFjY19jbGtzID0gNTsKKyNlbmRpZgorCisJLyogU2lnaHRpbmcgMzQ2MjQzMDogVGVtcG9yYXJ5IGhhY2sgZm9yIE1UMjlGMTI4RzA4Q0pBQkFXUDpCICovCisJaWYgKChpb3JlYWQzMihGbGFzaFJlZyArIE1BTlVGQUNUVVJFUl9JRCkgPT0gMCkgJiYKKwkJKGlvcmVhZDMyKEZsYXNoUmVnICsgREVWSUNFX0lEKSA9PSAweDg4KSkKKwkJYWNjX2Nsa3MgPSA2OworCisJaW93cml0ZTMyKGFjY19jbGtzLCBGbGFzaFJlZyArIEFDQ19DTEtTKTsKKwlpb3dyaXRlMzIocmVfMl93ZSwgRmxhc2hSZWcgKyBSRV8yX1dFKTsKKwlpb3dyaXRlMzIocmVfMl9yZSwgRmxhc2hSZWcgKyBSRV8yX1JFKTsKKwlpb3dyaXRlMzIod2VfMl9yZSwgRmxhc2hSZWcgKyBXRV8yX1JFKTsKKwlpb3dyaXRlMzIoYWRkcl8yX2RhdGEsIEZsYXNoUmVnICsgQUREUl8yX0RBVEEpOworCWlvd3JpdGUzMihlbl9sbywgRmxhc2hSZWcgKyBSRFdSX0VOX0xPX0NOVCk7CisJaW93cml0ZTMyKGVuX2hpLCBGbGFzaFJlZyArIFJEV1JfRU5fSElfQ05UKTsKKwlpb3dyaXRlMzIoY3NfY250LCBGbGFzaFJlZyArIENTX1NFVFVQX0NOVCk7Cit9CisKK3N0YXRpYyB2b2lkIGluZGV4X2FkZHIodTMyIGFkZHJlc3MsIHUzMiBkYXRhKQoreworCWlvd3JpdGUzMihhZGRyZXNzLCBGbGFzaE1lbSk7CisJaW93cml0ZTMyKGRhdGEsIEZsYXNoTWVtICsgMHgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGluZGV4X2FkZHJfcmVhZF9kYXRhKHUzMiBhZGRyZXNzLCB1MzIgKnBkYXRhKQoreworCWlvd3JpdGUzMihhZGRyZXNzLCBGbGFzaE1lbSk7CisJKnBkYXRhID0gaW9yZWFkMzIoRmxhc2hNZW0gKyAweDEwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2VjY19jb25maWcodm9pZCkKK3sKKyNpZiBTVVBQT1JUXzhCSVRFQ0MKKwlpZiAoKGlvcmVhZDMyKEZsYXNoUmVnICsgREVWSUNFX01BSU5fQVJFQV9TSVpFKSA8IDQwOTYpIHx8CisJCShpb3JlYWQzMihGbGFzaFJlZyArIERFVklDRV9TUEFSRV9BUkVBX1NJWkUpIDw9IDEyOCkpCisJCWlvd3JpdGUzMig4LCBGbGFzaFJlZyArIEVDQ19DT1JSRUNUSU9OKTsKKyNlbmRpZgorCisJaWYgKChpb3JlYWQzMihGbGFzaFJlZyArIEVDQ19DT1JSRUNUSU9OKSAmIEVDQ19DT1JSRUNUSU9OX19WQUxVRSkKKwkJPT0gMSkgeworCQlEZXZpY2VJbmZvLndFQ0NCeXRlc1BlclNlY3RvciA9IDQ7CisJCURldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yICo9IERldmljZUluZm8ud0RldmljZXNDb25uZWN0ZWQ7CisJCURldmljZUluZm8ud051bVBhZ2VTcGFyZUZsYWcgPQorCQkJRGV2aWNlSW5mby53UGFnZVNwYXJlU2l6ZSAtCisJCQlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgLworCQkJKEVDQ19TRUNUT1JfU0laRSAqIERldmljZUluZm8ud0RldmljZXNDb25uZWN0ZWQpICoKKwkJCURldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yCisJCQktIERldmljZUluZm8ud1NwYXJlU2tpcEJ5dGVzOworCX0gZWxzZSB7CisJCURldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yID0KKwkJCShpb3JlYWQzMihGbGFzaFJlZyArIEVDQ19DT1JSRUNUSU9OKSAmCisJCQlFQ0NfQ09SUkVDVElPTl9fVkFMVUUpICogMTMgLyA4OworCQlpZiAoKERldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yKSAlIDIgPT0gMCkKKwkJCURldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yICs9IDI7CisJCWVsc2UKKwkJCURldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yICs9IDE7CisKKwkJRGV2aWNlSW5mby53RUNDQnl0ZXNQZXJTZWN0b3IgKj0gRGV2aWNlSW5mby53RGV2aWNlc0Nvbm5lY3RlZDsKKwkJRGV2aWNlSW5mby53TnVtUGFnZVNwYXJlRmxhZyA9IERldmljZUluZm8ud1BhZ2VTcGFyZVNpemUgLQorCQkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplIC8KKwkJCShFQ0NfU0VDVE9SX1NJWkUgKiBEZXZpY2VJbmZvLndEZXZpY2VzQ29ubmVjdGVkKSAqCisJCQlEZXZpY2VJbmZvLndFQ0NCeXRlc1BlclNlY3RvcgorCQkJLSBEZXZpY2VJbmZvLndTcGFyZVNraXBCeXRlczsKKwl9Cit9CisKK3N0YXRpYyB1MTYgZ2V0X29uZmlfbmFuZF9wYXJhKHZvaWQpCit7CisJaW50IGk7CisJdTE2IGJsa3NfbHVuX2wsIGJsa3NfbHVuX2gsIG5fb2ZfbHVuczsKKwl1MzIgYmxvY2twZXJsdW4sIGlkOworCisJaW93cml0ZTMyKERFVklDRV9SRVNFVF9fQkFOSzAsIEZsYXNoUmVnICsgREVWSUNFX1JFU0VUKTsKKworCXdoaWxlICghKChpb3JlYWQzMihGbGFzaFJlZyArIElOVFJfU1RBVFVTMCkgJgorCQlJTlRSX1NUQVRVUzBfX1JTVF9DT01QKSB8CisJCShpb3JlYWQzMihGbGFzaFJlZyArIElOVFJfU1RBVFVTMCkgJgorCQlJTlRSX1NUQVRVUzBfX1RJTUVfT1VUKSkpCisJCTsKKworCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIElOVFJfU1RBVFVTMCkgJiBJTlRSX1NUQVRVUzBfX1JTVF9DT01QKSB7CisJCWlvd3JpdGUzMihERVZJQ0VfUkVTRVRfX0JBTksxLCBGbGFzaFJlZyArIERFVklDRV9SRVNFVCk7CisJCXdoaWxlICghKChpb3JlYWQzMihGbGFzaFJlZyArIElOVFJfU1RBVFVTMSkgJgorCQkJSU5UUl9TVEFUVVMxX19SU1RfQ09NUCkgfAorCQkJKGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMxKSAmCisJCQlJTlRSX1NUQVRVUzFfX1RJTUVfT1VUKSkpCisJCQk7CisKKwkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMxKSAmCisJCQlJTlRSX1NUQVRVUzFfX1JTVF9DT01QKSB7CisJCQlpb3dyaXRlMzIoREVWSUNFX1JFU0VUX19CQU5LMiwKKwkJCQlGbGFzaFJlZyArIERFVklDRV9SRVNFVCk7CisJCQl3aGlsZSAoISgoaW9yZWFkMzIoRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzIpICYKKwkJCQlJTlRSX1NUQVRVUzJfX1JTVF9DT01QKSB8CisJCQkJKGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMyKSAmCisJCQkJSU5UUl9TVEFUVVMyX19USU1FX09VVCkpKQorCQkJCTsKKworCQkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMyKSAmCisJCQkJSU5UUl9TVEFUVVMyX19SU1RfQ09NUCkgeworCQkJCWlvd3JpdGUzMihERVZJQ0VfUkVTRVRfX0JBTkszLAorCQkJCQlGbGFzaFJlZyArIERFVklDRV9SRVNFVCk7CisJCQkJd2hpbGUgKCEoKGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMzKSAmCisJCQkJCUlOVFJfU1RBVFVTM19fUlNUX0NPTVApIHwKKwkJCQkJKGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMzKSAmCisJCQkJCUlOVFJfU1RBVFVTM19fVElNRV9PVVQpKSkKKwkJCQkJOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkdldHRpbmcgYSB0aW1lIG91dCBmb3IgYmFuayAyIVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkdldHRpbmcgYSB0aW1lIG91dCBmb3IgYmFuayAxIVxuIik7CisJCX0KKwl9CisKKwlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19USU1FX09VVCwgRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzApOworCWlvd3JpdGUzMihJTlRSX1NUQVRVUzFfX1RJTUVfT1VULCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMSk7CisJaW93cml0ZTMyKElOVFJfU1RBVFVTMl9fVElNRV9PVVQsIEZsYXNoUmVnICsgSU5UUl9TVEFUVVMyKTsKKwlpb3dyaXRlMzIoSU5UUl9TVEFUVVMzX19USU1FX09VVCwgRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzMpOworCisJRGV2aWNlSW5mby53T05GSURldkZlYXR1cmVzID0KKwkJaW9yZWFkMzIoRmxhc2hSZWcgKyBPTkZJX0RFVklDRV9GRUFUVVJFUyk7CisJRGV2aWNlSW5mby53T05GSU9wdENvbW1hbmRzID0KKwkJaW9yZWFkMzIoRmxhc2hSZWcgKyBPTkZJX09QVElPTkFMX0NPTU1BTkRTKTsKKwlEZXZpY2VJbmZvLndPTkZJVGltaW5nTW9kZSA9CisJCWlvcmVhZDMyKEZsYXNoUmVnICsgT05GSV9USU1JTkdfTU9ERSk7CisJRGV2aWNlSW5mby53T05GSVBnbUNhY2hlVGltaW5nTW9kZSA9CisJCWlvcmVhZDMyKEZsYXNoUmVnICsgT05GSV9QR01fQ0FDSEVfVElNSU5HX01PREUpOworCisJbl9vZl9sdW5zID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBPTkZJX0RFVklDRV9OT19PRl9MVU5TKSAmCisJCU9ORklfREVWSUNFX05PX09GX0xVTlNfX05PX09GX0xVTlM7CisJYmxrc19sdW5fbCA9IGlvcmVhZDMyKEZsYXNoUmVnICsgT05GSV9ERVZJQ0VfTk9fT0ZfQkxPQ0tTX1BFUl9MVU5fTCk7CisJYmxrc19sdW5faCA9IGlvcmVhZDMyKEZsYXNoUmVnICsgT05GSV9ERVZJQ0VfTk9fT0ZfQkxPQ0tTX1BFUl9MVU5fVSk7CisKKwlibG9ja3Blcmx1biA9IChibGtzX2x1bl9oIDw8IDE2KSB8IGJsa3NfbHVuX2w7CisKKwlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA9IG5fb2ZfbHVucyAqIGJsb2NrcGVybHVuOworCisJaWYgKCEoaW9yZWFkMzIoRmxhc2hSZWcgKyBPTkZJX1RJTUlOR19NT0RFKSAmCisJCU9ORklfVElNSU5HX01PREVfX1ZBTFVFKSkKKwkJcmV0dXJuIEZBSUw7CisKKwlmb3IgKGkgPSA1OyBpID4gMDsgaS0tKSB7CisJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIE9ORklfVElNSU5HX01PREUpICYgKDB4MDEgPDwgaSkpCisJCQlicmVhazsKKwl9CisKKwlOQU5EX09ORmlfVGltaW5nX01vZGUoaSk7CisKKwlpbmRleF9hZGRyKE1PREVfMTEgfCAwLCAweDkwKTsKKwlpbmRleF9hZGRyKE1PREVfMTEgfCAxLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWluZGV4X2FkZHJfcmVhZF9kYXRhKE1PREVfMTEgfCAyLCAmaWQpOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIzcmQgSUQ6IDB4JXhcbiIsIGlkKTsKKworCURldmljZUluZm8uTUxDRGV2aWNlID0gaWQgJiAweDBDOworCisJLyogQnkgbm93LCBhbGwgdGhlIE9ORkkgZGV2aWNlcyB3ZSBrbm93IHN1cHBvcnQgdGhlIHBhZ2UgY2FjaGUgKi8KKwkvKiBydyBmZWF0dXJlLiBTbyBoZXJlIHdlIGVuYWJsZSB0aGUgcGlwZWxpbmVfcndfYWhlYWQgZmVhdHVyZSAqLworCS8qIGlvd3JpdGUzMigxLCBGbGFzaFJlZyArIENBQ0hFX1dSSVRFX0VOQUJMRSk7ICovCisJLyogaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgQ0FDSEVfUkVBRF9FTkFCTEUpOyAgKi8KKworCXJldHVybiBQQVNTOworfQorCitzdGF0aWMgdm9pZCBnZXRfc2Ftc3VuZ19uYW5kX3BhcmEodm9pZCkKK3sKKwl1OCBub19vZl9wbGFuZXM7CisJdTMyIGJsa19zaXplOworCXU2NCBwbGFuZV9zaXplLCBjYXBhY2l0eTsKKwl1MzIgaWRfYnl0ZXNbNV07CisJaW50IGk7CisKKwlpbmRleF9hZGRyKCh1MzIpKE1PREVfMTEgfCAwKSwgMHg5MCk7CisJaW5kZXhfYWRkcigodTMyKShNT0RFXzExIHwgMSksIDApOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWluZGV4X2FkZHJfcmVhZF9kYXRhKCh1MzIpKE1PREVfMTEgfCAyKSwgJmlkX2J5dGVzW2ldKTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLAorCQkiSUQgYnl0ZXM6IDB4JXgsIDB4JXgsIDB4JXgsIDB4JXgsIDB4JXhcbiIsCisJCWlkX2J5dGVzWzBdLCBpZF9ieXRlc1sxXSwgaWRfYnl0ZXNbMl0sCisJCWlkX2J5dGVzWzNdLCBpZF9ieXRlc1s0XSk7CisKKwlpZiAoKGlkX2J5dGVzWzFdICYgMHhmZikgPT0gMHhkMykgeyAvKiBTYW1zdW5nIEs5V0FHMDhVMUEgKi8KKwkJLyogU2V0IHRpbWluZyByZWdpc3RlciB2YWx1ZXMgYWNjb3JkaW5nIHRvIGRhdGFzaGVldCAqLworCQlpb3dyaXRlMzIoNSwgRmxhc2hSZWcgKyBBQ0NfQ0xLUyk7CisJCWlvd3JpdGUzMigyMCwgRmxhc2hSZWcgKyBSRV8yX1dFKTsKKwkJaW93cml0ZTMyKDEyLCBGbGFzaFJlZyArIFdFXzJfUkUpOworCQlpb3dyaXRlMzIoMTQsIEZsYXNoUmVnICsgQUREUl8yX0RBVEEpOworCQlpb3dyaXRlMzIoMywgRmxhc2hSZWcgKyBSRFdSX0VOX0xPX0NOVCk7CisJCWlvd3JpdGUzMigyLCBGbGFzaFJlZyArIFJEV1JfRU5fSElfQ05UKTsKKwkJaW93cml0ZTMyKDIsIEZsYXNoUmVnICsgQ1NfU0VUVVBfQ05UKTsKKwl9CisKKwlub19vZl9wbGFuZXMgPSAxIDw8ICgoaWRfYnl0ZXNbNF0gJiAweDBjKSA+PiAyKTsKKwlwbGFuZV9zaXplICA9ICh1NjQpNjQgPDwgKChpZF9ieXRlc1s0XSAmIDB4NzApID4+IDQpOworCWJsa19zaXplID0gNjQgPDwgKChpb3JlYWQzMihGbGFzaFJlZyArIERFVklDRV9QQVJBTV8xKSAmIDB4MzApID4+IDQpOworCWNhcGFjaXR5ID0gKHU2NCkxMjggKiBwbGFuZV9zaXplICogbm9fb2ZfcGxhbmVzOworCisJRGV2aWNlSW5mby53VG90YWxCbG9ja3MgPSAodTMyKUdMT0JfdTY0X0RpdihjYXBhY2l0eSwgYmxrX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBnZXRfdG9zaGliYV9uYW5kX3BhcmEodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjcmF0Y2hfcmVnOworCXUzMiB0bXA7CisKKwkvKiBXb3JrYXJvdW5kIHRvIGZpeCBhIGNvbnRyb2xsZXIgYnVnIHdoaWNoIHJlcG9ydHMgYSB3cm9uZyAqLworCS8qIHNwYXJlIGFyZWEgc2l6ZSBmb3Igc29tZSBraW5kIG9mIFRvc2hpYmEgTkFORCBkZXZpY2UgKi8KKwlpZiAoKGlvcmVhZDMyKEZsYXNoUmVnICsgREVWSUNFX01BSU5fQVJFQV9TSVpFKSA9PSA0MDk2KSAmJgorCQkoaW9yZWFkMzIoRmxhc2hSZWcgKyBERVZJQ0VfU1BBUkVfQVJFQV9TSVpFKSA9PSA2NCkpIHsKKwkJaW93cml0ZTMyKDIxNiwgRmxhc2hSZWcgKyBERVZJQ0VfU1BBUkVfQVJFQV9TSVpFKTsKKwkJdG1wID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBERVZJQ0VTX0NPTk5FQ1RFRCkgKgorCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBERVZJQ0VfU1BBUkVfQVJFQV9TSVpFKTsKKwkJaW93cml0ZTMyKHRtcCwgRmxhc2hSZWcgKyBMT0dJQ0FMX1BBR0VfU1BBUkVfU0laRSk7CisjaWYgU1VQUE9SVF8xNUJJVEVDQworCQlpb3dyaXRlMzIoMTUsIEZsYXNoUmVnICsgRUNDX0NPUlJFQ1RJT04pOworI2VsaWYgU1VQUE9SVF84QklURUNDCisJCWlvd3JpdGUzMig4LCBGbGFzaFJlZyArIEVDQ19DT1JSRUNUSU9OKTsKKyNlbmRpZgorCX0KKworCS8qIEFzIFRvc2hpYmEgTkFORCBjYW4gbm90IHByb3ZpZGUgaXQncyBibG9jayBudW1iZXIsICovCisJLyogc28gaGVyZSB3ZSBuZWVkIHVzZXIgdG8gcHJvdmlkZSB0aGUgY29ycmVjdCBibG9jayAqLworCS8qIG51bWJlciBpbiBhIHNjcmF0Y2ggcmVnaXN0ZXIgYmVmb3JlIHRoZSBMaW51eCBOQU5EICovCisJLyogZHJpdmVyIGlzIGxvYWRlZC4gSWYgbm8gdmFsaWQgdmFsdWUgZm91bmQgaW4gdGhlIHNjcmF0Y2ggKi8KKwkvKiByZWdpc3RlciwgdGhlbiB3ZSB1c2UgZGVmYXVsdCBibG9jayBudW1iZXIgdmFsdWUgKi8KKwlzY3JhdGNoX3JlZyA9IGlvcmVtYXBfbm9jYWNoZShTQ1JBVENIX1JFR19BRERSLCBTQ1JBVENIX1JFR19TSVpFKTsKKwlpZiAoIXNjcmF0Y2hfcmVnKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogaW9yZW1hcCBmYWlsZWQgaW4gJXMsIExpbmUgJWQiLAorCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJRGV2aWNlSW5mby53VG90YWxCbG9ja3MgPSBHTE9CX0hXQ1RMX0RFRkFVTFRfQkxLUzsKKwl9IGVsc2UgeworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJIlNwZWN0cmE6IGlvcmVtYXAgcmVnIGFkZHJlc3M6IDB4JXBcbiIsIHNjcmF0Y2hfcmVnKTsKKwkJRGV2aWNlSW5mby53VG90YWxCbG9ja3MgPSAxIDw8IGlvcmVhZDgoc2NyYXRjaF9yZWcpOworCQlpZiAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgPCA1MTIpCisJCQlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA9IEdMT0JfSFdDVExfREVGQVVMVF9CTEtTOworCQlpb3VubWFwKHNjcmF0Y2hfcmVnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9oeW5peF9uYW5kX3BhcmEodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjcmF0Y2hfcmVnOworCXUzMiBtYWluX3NpemUsIHNwYXJlX3NpemU7CisKKwlzd2l0Y2ggKERldmljZUluZm8ud0RldmljZUlEKSB7CisJY2FzZSAweEQ1OiAvKiBIeW5peCBIMjdVQUc4VDJBLCBIMjdVQkc4VTVBIG9yIEgyN1VDRzhWRkEgKi8KKwljYXNlIDB4RDc6IC8qIEh5bml4IEgyN1VERzhWRU0sIEgyN1VDRzhVRE0gb3IgSDI3VUNHOFY1QSAqLworCQlpb3dyaXRlMzIoMTI4LCBGbGFzaFJlZyArIFBBR0VTX1BFUl9CTE9DSyk7CisJCWlvd3JpdGUzMig0MDk2LCBGbGFzaFJlZyArIERFVklDRV9NQUlOX0FSRUFfU0laRSk7CisJCWlvd3JpdGUzMigyMjQsIEZsYXNoUmVnICsgREVWSUNFX1NQQVJFX0FSRUFfU0laRSk7CisJCW1haW5fc2l6ZSA9IDQwOTYgKiBpb3JlYWQzMihGbGFzaFJlZyArIERFVklDRVNfQ09OTkVDVEVEKTsKKwkJc3BhcmVfc2l6ZSA9IDIyNCAqIGlvcmVhZDMyKEZsYXNoUmVnICsgREVWSUNFU19DT05ORUNURUQpOworCQlpb3dyaXRlMzIobWFpbl9zaXplLCBGbGFzaFJlZyArIExPR0lDQUxfUEFHRV9EQVRBX1NJWkUpOworCQlpb3dyaXRlMzIoc3BhcmVfc2l6ZSwgRmxhc2hSZWcgKyBMT0dJQ0FMX1BBR0VfU1BBUkVfU0laRSk7CisJCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIERFVklDRV9XSURUSCk7CisjaWYgU1VQUE9SVF8xNUJJVEVDQworCQlpb3dyaXRlMzIoMTUsIEZsYXNoUmVnICsgRUNDX0NPUlJFQ1RJT04pOworI2VsaWYgU1VQUE9SVF84QklURUNDCisJCWlvd3JpdGUzMig4LCBGbGFzaFJlZyArIEVDQ19DT1JSRUNUSU9OKTsKKyNlbmRpZgorCQlEZXZpY2VJbmZvLk1MQ0RldmljZSAgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJIlNwZWN0cmE6IFVua25vd24gSHluaXggTkFORCAoRGV2aWNlIElEOiAweCV4KS4iCisJCQkiV2lsbCB1c2UgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGluc3RlYWQuXG4iLAorCQkJRGV2aWNlSW5mby53RGV2aWNlSUQpOworCX0KKworCXNjcmF0Y2hfcmVnID0gaW9yZW1hcF9ub2NhY2hlKFNDUkFUQ0hfUkVHX0FERFIsIFNDUkFUQ0hfUkVHX1NJWkUpOworCWlmICghc2NyYXRjaF9yZWcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBpb3JlbWFwIGZhaWxlZCBpbiAlcywgTGluZSAlZCIsCisJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA9IEdMT0JfSFdDVExfREVGQVVMVF9CTEtTOworCX0gZWxzZSB7CisJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkiU3BlY3RyYTogaW9yZW1hcCByZWcgYWRkcmVzczogMHglcFxuIiwgc2NyYXRjaF9yZWcpOworCQlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA9IDEgPDwgaW9yZWFkOChzY3JhdGNoX3JlZyk7CisJCWlmIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA8IDUxMikKKwkJCURldmljZUluZm8ud1RvdGFsQmxvY2tzID0gR0xPQl9IV0NUTF9ERUZBVUxUX0JMS1M7CisJCWlvdW5tYXAoc2NyYXRjaF9yZWcpOworCX0KK30KKworc3RhdGljIHZvaWQgZmluZF92YWxpZF9iYW5rcyh2b2lkKQoreworCXUzMiBpZFtMTERfTUFYX0ZMQVNIX0JBTktTXTsKKwlpbnQgaTsKKworCXRvdGFsVXNlZEJhbmtzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTExEX01BWF9GTEFTSF9CQU5LUzsgaSsrKSB7CisJCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMSB8IChpIDw8IDI0KSB8IDApLCAweDkwKTsKKwkJaW5kZXhfYWRkcigodTMyKShNT0RFXzExIHwgKGkgPDwgMjQpIHwgMSksIDApOworCQlpbmRleF9hZGRyX3JlYWRfZGF0YSgodTMyKShNT0RFXzExIHwgKGkgPDwgMjQpIHwgMiksICZpZFtpXSk7CisKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCQkiUmV0dXJuIDFzdCBJRCBmb3IgYmFua1slZF06ICV4XG4iLCBpLCBpZFtpXSk7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJaWYgKGlkW2ldICYgMHgwZmYpCisJCQkJR0xPQl92YWxpZF9iYW5rc1tpXSA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAoKGlkW2ldICYgMHgwZmYpID09IChpZFswXSAmIDB4MGZmKSkKKwkJCQlHTE9CX3ZhbGlkX2JhbmtzW2ldID0gMTsKKwkJfQorCisJCXRvdGFsVXNlZEJhbmtzICs9IEdMT0JfdmFsaWRfYmFua3NbaV07CisJfQorCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCSJ0b3RhbFVzZWRCYW5rczogJWRcbiIsIHRvdGFsVXNlZEJhbmtzKTsKK30KKworc3RhdGljIHZvaWQgZGV0ZWN0X3BhcnRpdGlvbl9mZWF0dXJlKHZvaWQpCit7CisJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgRkVBVFVSRVMpICYgRkVBVFVSRVNfX1BBUlRJVElPTikgeworCQlpZiAoKGlvcmVhZDMyKEZsYXNoUmVnICsgUEVSTV9TUkNfSURfMSkgJgorCQkJUEVSTV9TUkNfSURfMV9fU1JDSUQpID09IFNQRUNUUkFfUEFSVElUSU9OX0lEKSB7CisJCQlEZXZpY2VJbmZvLndTcGVjdHJhU3RhcnRCbG9jayA9CisJCQkgICAgKChpb3JlYWQzMihGbGFzaFJlZyArIE1JTl9NQVhfQkFOS18xKSAmCisJCQkgICAgICBNSU5fTUFYX0JBTktfMV9fTUlOX1ZBTFVFKSAqCisJCQkgICAgIERldmljZUluZm8ud1RvdGFsQmxvY2tzKQorCQkJICAgICsKKwkJCSAgICAoaW9yZWFkMzIoRmxhc2hSZWcgKyBNSU5fQkxLX0FERFJfMSkgJgorCQkJICAgIE1JTl9CTEtfQUREUl8xX19WQUxVRSk7CisKKwkJCURldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jayA9CisJCQkgICAgKCgoaW9yZWFkMzIoRmxhc2hSZWcgKyBNSU5fTUFYX0JBTktfMSkgJgorCQkJICAgICAgIE1JTl9NQVhfQkFOS18xX19NQVhfVkFMVUUpID4+IDIpICoKKwkJCSAgICAgRGV2aWNlSW5mby53VG90YWxCbG9ja3MpCisJCQkgICAgKworCQkJICAgIChpb3JlYWQzMihGbGFzaFJlZyArIE1BWF9CTEtfQUREUl8xKSAmCisJCQkgICAgTUFYX0JMS19BRERSXzFfX1ZBTFVFKTsKKworCQkJRGV2aWNlSW5mby53VG90YWxCbG9ja3MgKj0gdG90YWxVc2VkQmFua3M7CisKKwkJCWlmIChEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2sgPj0KKwkJCSAgICBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQkJCURldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jayA9CisJCQkJICAgIERldmljZUluZm8ud1RvdGFsQmxvY2tzIC0gMTsKKwkJCX0KKworCQkJRGV2aWNlSW5mby53RGF0YUJsb2NrTnVtID0KKwkJCQlEZXZpY2VJbmZvLndTcGVjdHJhRW5kQmxvY2sgLQorCQkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrICsgMTsKKwkJfSBlbHNlIHsKKwkJCURldmljZUluZm8ud1RvdGFsQmxvY2tzICo9IHRvdGFsVXNlZEJhbmtzOworCQkJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2sgPSBTUEVDVFJBX1NUQVJUX0JMT0NLOworCQkJRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrID0KKwkJCQlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAtIDE7CisJCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gPQorCQkJCURldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jayAtCisJCQkJRGV2aWNlSW5mby53U3BlY3RyYVN0YXJ0QmxvY2sgKyAxOworCQl9CisJfSBlbHNlIHsKKwkJRGV2aWNlSW5mby53VG90YWxCbG9ja3MgKj0gdG90YWxVc2VkQmFua3M7CisJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrID0gU1BFQ1RSQV9TVEFSVF9CTE9DSzsKKwkJRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrID0gRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLSAxOworCQlEZXZpY2VJbmZvLndEYXRhQmxvY2tOdW0gPQorCQkJRGV2aWNlSW5mby53U3BlY3RyYUVuZEJsb2NrIC0KKwkJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrICsgMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZGV2aWNlX2luZm8odm9pZCkKK3sKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkRldmljZUluZm86XG4iKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkRldmljZU1ha2VyOiAweCV4XG4iLAorCQlEZXZpY2VJbmZvLndEZXZpY2VNYWtlcik7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJEZXZpY2VJRDogMHgleFxuIiwKKwkJRGV2aWNlSW5mby53RGV2aWNlSUQpOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiRGV2aWNlVHlwZTogMHgleFxuIiwKKwkJRGV2aWNlSW5mby53RGV2aWNlVHlwZSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGVjdHJhU3RhcnRCbG9jazogJWRcbiIsCisJCURldmljZUluZm8ud1NwZWN0cmFTdGFydEJsb2NrKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmFFbmRCbG9jazogJWRcbiIsCisJCURldmljZUluZm8ud1NwZWN0cmFFbmRCbG9jayk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJUb3RhbEJsb2NrczogJWRcbiIsCisJCURldmljZUluZm8ud1RvdGFsQmxvY2tzKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlBhZ2VzUGVyQmxvY2s6ICVkXG4iLAorCQlEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlBhZ2VTaXplOiAlZFxuIiwKKwkJRGV2aWNlSW5mby53UGFnZVNpemUpOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiUGFnZURhdGFTaXplOiAlZFxuIiwKKwkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlBhZ2VTcGFyZVNpemU6ICVkXG4iLAorCQlEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIk51bVBhZ2VTcGFyZUZsYWc6ICVkXG4iLAorCQlEZXZpY2VJbmZvLndOdW1QYWdlU3BhcmVGbGFnKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkVDQ0J5dGVzUGVyU2VjdG9yOiAlZFxuIiwKKwkJRGV2aWNlSW5mby53RUNDQnl0ZXNQZXJTZWN0b3IpOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiQmxvY2tTaXplOiAlZFxuIiwKKwkJRGV2aWNlSW5mby53QmxvY2tTaXplKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkJsb2NrRGF0YVNpemU6ICVkXG4iLAorCQlEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkRhdGFCbG9ja051bTogJWRcbiIsCisJCURldmljZUluZm8ud0RhdGFCbG9ja051bSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJQbGFuZU51bTogJWRcbiIsCisJCURldmljZUluZm8uYlBsYW5lTnVtKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkRldmljZU1haW5BcmVhU2l6ZTogJWRcbiIsCisJCURldmljZUluZm8ud0RldmljZU1haW5BcmVhU2l6ZSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJEZXZpY2VTcGFyZUFyZWFTaXplOiAlZFxuIiwKKwkJRGV2aWNlSW5mby53RGV2aWNlU3BhcmVBcmVhU2l6ZSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJEZXZpY2VzQ29ubmVjdGVkOiAlZFxuIiwKKwkJRGV2aWNlSW5mby53RGV2aWNlc0Nvbm5lY3RlZCk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJEZXZpY2VXaWR0aDogJWRcbiIsCisJCURldmljZUluZm8ud0RldmljZVdpZHRoKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkhXUmV2aXNpb246IDB4JXhcbiIsCisJCURldmljZUluZm8ud0hXUmV2aXNpb24pOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiSFdGZWF0dXJlczogMHgleFxuIiwKKwkJRGV2aWNlSW5mby53SFdGZWF0dXJlcyk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJPTkZJRGV2RmVhdHVyZXM6IDB4JXhcbiIsCisJCURldmljZUluZm8ud09ORklEZXZGZWF0dXJlcyk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJPTkZJT3B0Q29tbWFuZHM6IDB4JXhcbiIsCisJCURldmljZUluZm8ud09ORklPcHRDb21tYW5kcyk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJPTkZJVGltaW5nTW9kZTogMHgleFxuIiwKKwkJRGV2aWNlSW5mby53T05GSVRpbWluZ01vZGUpOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiT05GSVBnbUNhY2hlVGltaW5nTW9kZTogMHgleFxuIiwKKwkJRGV2aWNlSW5mby53T05GSVBnbUNhY2hlVGltaW5nTW9kZSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJNTENEZXZpY2U6ICVzXG4iLAorCQlEZXZpY2VJbmZvLk1MQ0RldmljZSA/ICJZZXMiIDogIk5vIik7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGFyZVNraXBCeXRlczogJWRcbiIsCisJCURldmljZUluZm8ud1NwYXJlU2tpcEJ5dGVzKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkJpdHNJblBhZ2VOdW1iZXI6ICVkXG4iLAorCQlEZXZpY2VJbmZvLm5CaXRzSW5QYWdlTnVtYmVyKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIkJpdHNJblBhZ2VEYXRhU2l6ZTogJWRcbiIsCisJCURldmljZUluZm8ubkJpdHNJblBhZ2VEYXRhU2l6ZSk7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJCaXRzSW5CbG9ja0RhdGFTaXplOiAlZFxuIiwKKwkJRGV2aWNlSW5mby5uQml0c0luQmxvY2tEYXRhU2l6ZSk7Cit9CisKK3UxNiBOQU5EX1JlYWRfRGV2aWNlX0lEKHZvaWQpCit7CisJdTE2IHN0YXR1cyA9IFBBU1M7CisJdTggbm9fb2ZfcGxhbmVzOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpb3dyaXRlMzIoMHgwMiwgRmxhc2hSZWcgKyBTUEFSRV9BUkVBX1NLSVBfQllURVMpOworCWlvd3JpdGUzMigweGZmZmYsIEZsYXNoUmVnICsgU1BBUkVfQVJFQV9NQVJLRVIpOworCURldmljZUluZm8ud0RldmljZU1ha2VyID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBNQU5VRkFDVFVSRVJfSUQpOworCURldmljZUluZm8ud0RldmljZUlEID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBERVZJQ0VfSUQpOworCURldmljZUluZm8uTUxDRGV2aWNlID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBERVZJQ0VfUEFSQU1fMCkgJiAweDBjOworCisJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgT05GSV9ERVZJQ0VfTk9fT0ZfTFVOUykgJgorCQlPTkZJX0RFVklDRV9OT19PRl9MVU5TX19PTkZJX0RFVklDRSkgeyAvKiBPTkZJIDEuMCBOQU5EICovCisJCWlmIChGQUlMID09IGdldF9vbmZpX25hbmRfcGFyYSgpKQorCQkJcmV0dXJuIEZBSUw7CisJfSBlbHNlIGlmIChEZXZpY2VJbmZvLndEZXZpY2VNYWtlciA9PSAweEVDKSB7IC8qIFNhbXN1bmcgTkFORCAqLworCQlnZXRfc2Ftc3VuZ19uYW5kX3BhcmEoKTsKKwl9IGVsc2UgaWYgKERldmljZUluZm8ud0RldmljZU1ha2VyID09IDB4OTgpIHsgLyogVG9zaGliYSBOQU5EICovCisJCWdldF90b3NoaWJhX25hbmRfcGFyYSgpOworCX0gZWxzZSBpZiAoRGV2aWNlSW5mby53RGV2aWNlTWFrZXIgPT0gMHhBRCkgeyAvKiBIeW5peCBOQU5EICovCisJCWdldF9oeW5peF9uYW5kX3BhcmEoKTsKKwl9IGVsc2UgeworCQlEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyA9IEdMT0JfSFdDVExfREVGQVVMVF9CTEtTOworCX0KKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiRHVtcCB0aW1pbmcgcmVnaXN0ZXIgdmFsdWVzOiIKKwkJCSJhY2NfY2xrczogJWQsIHJlXzJfd2U6ICVkLCB3ZV8yX3JlOiAlZCwiCisJCQkiYWRkcl8yX2RhdGE6ICVkLCByZHdyX2VuX2xvX2NudDogJWQsICIKKwkJCSJyZHdyX2VuX2hpX2NudDogJWQsIGNzX3NldHVwX2NudDogJWRcbiIsCisJCQlpb3JlYWQzMihGbGFzaFJlZyArIEFDQ19DTEtTKSwKKwkJCWlvcmVhZDMyKEZsYXNoUmVnICsgUkVfMl9XRSksCisJCQlpb3JlYWQzMihGbGFzaFJlZyArIFdFXzJfUkUpLAorCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBBRERSXzJfREFUQSksCisJCQlpb3JlYWQzMihGbGFzaFJlZyArIFJEV1JfRU5fTE9fQ05UKSwKKwkJCWlvcmVhZDMyKEZsYXNoUmVnICsgUkRXUl9FTl9ISV9DTlQpLAorCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBDU19TRVRVUF9DTlQpKTsKKworCURldmljZUluZm8ud0hXUmV2aXNpb24gPSBpb3JlYWQzMihGbGFzaFJlZyArIFJFVklTSU9OKTsKKwlEZXZpY2VJbmZvLndIV0ZlYXR1cmVzID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBGRUFUVVJFUyk7CisKKwlEZXZpY2VJbmZvLndEZXZpY2VNYWluQXJlYVNpemUgPQorCQlpb3JlYWQzMihGbGFzaFJlZyArIERFVklDRV9NQUlOX0FSRUFfU0laRSk7CisJRGV2aWNlSW5mby53RGV2aWNlU3BhcmVBcmVhU2l6ZSA9CisJCWlvcmVhZDMyKEZsYXNoUmVnICsgREVWSUNFX1NQQVJFX0FSRUFfU0laRSk7CisKKwlEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgPQorCQlpb3JlYWQzMihGbGFzaFJlZyArIExPR0lDQUxfUEFHRV9EQVRBX1NJWkUpOworCisJLyogTm90ZTogV2hlbiB1c2luZyB0aGUgTWljb24gNEsgTkFORCBkZXZpY2UsIHRoZSBjb250cm9sbGVyIHdpbGwgcmVwb3J0CisJICogUGFnZSBTcGFyZSBTaXplIGFzIDIxNiBieXRlcy4gQnV0IE1pY3JvbidzIFNwZWMgc2F5IGl0J3MgMjE4IGJ5dGVzLgorCSAqIEFuZCBpZiBmb3JjZSBzZXQgaXQgdG8gMjE4IGJ5dGVzLCB0aGUgY29udHJvbGxlciBjYW4gbm90IHdvcmsKKwkgKiBjb3JyZWN0bHkuIFNvIGp1c3QgbGV0IGl0IGJlLiBCdXQga2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBidWcgbWF5CisJICogY2F1c2UKKwkgKiBvdGhlciBwcm9ibGVtcyBpbiBmdXR1cmUuICAgICAgIC0gWXVucGVuZyAgMjAwOC0xMC0xMAorCSAqLworCURldmljZUluZm8ud1BhZ2VTcGFyZVNpemUgPQorCQlpb3JlYWQzMihGbGFzaFJlZyArIExPR0lDQUxfUEFHRV9TUEFSRV9TSVpFKTsKKworCURldmljZUluZm8ud1BhZ2VzUGVyQmxvY2sgPSBpb3JlYWQzMihGbGFzaFJlZyArIFBBR0VTX1BFUl9CTE9DSyk7CisKKwlEZXZpY2VJbmZvLndQYWdlU2l6ZSA9CisJICAgIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSArIERldmljZUluZm8ud1BhZ2VTcGFyZVNpemU7CisJRGV2aWNlSW5mby53QmxvY2tTaXplID0KKwkgICAgRGV2aWNlSW5mby53UGFnZVNpemUgKiBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrOworCURldmljZUluZm8ud0Jsb2NrRGF0YVNpemUgPQorCSAgICBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJRGV2aWNlSW5mby53RGV2aWNlV2lkdGggPSBpb3JlYWQzMihGbGFzaFJlZyArIERFVklDRV9XSURUSCk7CisJRGV2aWNlSW5mby53RGV2aWNlVHlwZSA9CisJCSgoaW9yZWFkMzIoRmxhc2hSZWcgKyBERVZJQ0VfV0lEVEgpID4gMCkgPyAxNiA6IDgpOworCisJRGV2aWNlSW5mby53RGV2aWNlc0Nvbm5lY3RlZCA9IGlvcmVhZDMyKEZsYXNoUmVnICsgREVWSUNFU19DT05ORUNURUQpOworCisJRGV2aWNlSW5mby53U3BhcmVTa2lwQnl0ZXMgPQorCQlpb3JlYWQzMihGbGFzaFJlZyArIFNQQVJFX0FSRUFfU0tJUF9CWVRFUykgKgorCQlEZXZpY2VJbmZvLndEZXZpY2VzQ29ubmVjdGVkOworCisJRGV2aWNlSW5mby5uQml0c0luUGFnZU51bWJlciA9CisJCSh1OClHTE9CX0NhbGNfVXNlZF9CaXRzKERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spOworCURldmljZUluZm8ubkJpdHNJblBhZ2VEYXRhU2l6ZSA9CisJCSh1OClHTE9CX0NhbGNfVXNlZF9CaXRzKERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSk7CisJRGV2aWNlSW5mby5uQml0c0luQmxvY2tEYXRhU2l6ZSA9CisJCSh1OClHTE9CX0NhbGNfVXNlZF9CaXRzKERldmljZUluZm8ud0Jsb2NrRGF0YVNpemUpOworCisJc2V0X2VjY19jb25maWcoKTsKKworCW5vX29mX3BsYW5lcyA9IGlvcmVhZDMyKEZsYXNoUmVnICsgTlVNQkVSX09GX1BMQU5FUykgJgorCQlOVU1CRVJfT0ZfUExBTkVTX19WQUxVRTsKKworCXN3aXRjaCAobm9fb2ZfcGxhbmVzKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwljYXNlIDM6CisJY2FzZSA3OgorCQlEZXZpY2VJbmZvLmJQbGFuZU51bSA9IG5vX29mX3BsYW5lcyArIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IEZBSUw7CisJCWJyZWFrOworCX0KKworCWZpbmRfdmFsaWRfYmFua3MoKTsKKworCWRldGVjdF9wYXJ0aXRpb25fZmVhdHVyZSgpOworCisJZHVtcF9kZXZpY2VfaW5mbygpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordTE2IE5BTkRfVW5sb2NrQXJyYXlBbGwodm9pZCkKK3sKKwl1NjQgc3RhcnRfYWRkciwgZW5kX2FkZHI7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXN0YXJ0X2FkZHIgPSAwOworCWVuZF9hZGRyID0gKCh1NjQpRGV2aWNlSW5mby53QmxvY2tTaXplICoKKwkJKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC0gMSkpID4+CisJCURldmljZUluZm8ubkJpdHNJblBhZ2VEYXRhU2l6ZTsKKworCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8ICh1MzIpc3RhcnRfYWRkciksIDB4MTApOworCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8ICh1MzIpZW5kX2FkZHIpLCAweDExKTsKKworCXJldHVybiBQQVNTOworfQorCit2b2lkIE5BTkRfTExEX0VuYWJsZV9EaXNhYmxlX0ludGVycnVwdHModTE2IElOVF9FTkFCTEUpCit7CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlpZiAoSU5UX0VOQUJMRSkKKwkJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgR0xPQkFMX0lOVF9FTkFCTEUpOworCWVsc2UKKwkJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgR0xPQkFMX0lOVF9FTkFCTEUpOworfQorCit1MTYgTkFORF9FcmFzZV9CbG9jayh1MzIgYmxvY2spCit7CisJdTE2IHN0YXR1cyA9IFBBU1M7CisJdTY0IGZsYXNoX2FkZDsKKwl1MTYgZmxhc2hfYmFuazsKKwl1MzIgaW50cl9zdGF0dXMgPSAwOworCXUzMiBpbnRyX3N0YXR1c19hZGRyZXNzZXNbNF0gPSB7SU5UUl9TVEFUVVMwLAorCQlJTlRSX1NUQVRVUzEsIElOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZmxhc2hfYWRkID0gKHU2NCkoYmxvY2sgJSAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcykpCisJCSogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZTsKKworCWZsYXNoX2JhbmsgPSBibG9jayAvIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKTsKKworCWlmIChibG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykKKwkJc3RhdHVzID0gRkFJTDsKKworCWlmIChzdGF0dXMgPT0gUEFTUykgeworCQlpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzX2FkZHJlc3Nlc1tmbGFzaF9iYW5rXTsKKworCQlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19FUkFTRV9DT01QIHwgSU5UUl9TVEFUVVMwX19FUkFTRV9GQUlMLAorCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJaW5kZXhfYWRkcigodTMyKShNT0RFXzEwIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksIDEpOworCisJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCShJTlRSX1NUQVRVUzBfX0VSQVNFX0NPTVAgfCBJTlRSX1NUQVRVUzBfX0VSQVNFX0ZBSUwpKSkKKwkJCTsKKworCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJSU5UUl9TVEFUVVMwX19FUkFTRV9GQUlMKQorCQkJc3RhdHVzID0gRkFJTDsKKworCQlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19FUkFTRV9DT01QIHwgSU5UUl9TVEFUVVMwX19FUkFTRV9GQUlMLAorCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHUzMiBCb3VuZGFyeV9DaGVja19CbG9ja19QYWdlKHUzMiBibG9jaywgdTE2IHBhZ2UsCisJCQkJCQl1MTYgcGFnZV9jb3VudCkKK3sKKwl1MzIgc3RhdHVzID0gUEFTUzsKKworCWlmIChibG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykKKwkJc3RhdHVzID0gRkFJTDsKKworCWlmIChwYWdlICsgcGFnZV9jb3VudCA+IERldmljZUluZm8ud1BhZ2VzUGVyQmxvY2spCisJCXN0YXR1cyA9IEZBSUw7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit1MTYgTkFORF9SZWFkX1BhZ2VfU3BhcmUodTggKnJlYWRfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCSAgICB1MTYgcGFnZV9jb3VudCkKK3sKKwl1MzIgc3RhdHVzID0gUEFTUzsKKwl1MzIgaTsKKwl1NjQgZmxhc2hfYWRkOworCXUzMiBQYWdlU3BhcmVTaXplID0gRGV2aWNlSW5mby53UGFnZVNwYXJlU2l6ZTsKKwl1MzIgc3BhcmVGbGFnQnl0ZXMgPSBEZXZpY2VJbmZvLndOdW1QYWdlU3BhcmVGbGFnOworCXUzMiBmbGFzaF9iYW5rOworCXUzMiBpbnRyX3N0YXR1cyA9IDA7CisJdTMyIGludHJfc3RhdHVzX2FkZHJlc3Nlc1s0XSA9IHtJTlRSX1NUQVRVUzAsCisJCUlOVFJfU1RBVFVTMSwgSU5UUl9TVEFUVVMyLCBJTlRSX1NUQVRVUzN9OworCXU4ICpwYWdlX3NwYXJlID0gYnVmX3JlYWRfcGFnZV9zcGFyZTsKKworCWlmIChibG9jayA+PSBEZXZpY2VJbmZvLndUb3RhbEJsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgImJsb2NrIHRvbyBiaWc6ICVkXG4iLCAoaW50KWJsb2NrKTsKKwkJc3RhdHVzID0gRkFJTDsKKwl9CisKKwlpZiAocGFnZSA+PSBEZXZpY2VJbmZvLndQYWdlc1BlckJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGFnZSB0b28gYmlnOiAlZFxuIiwgcGFnZSk7CisJCXN0YXR1cyA9IEZBSUw7CisJfQorCisJaWYgKHBhZ2VfY291bnQgPiAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGFnZSBjb3VudCB0b28gYmlnOiAlZFxuIiwgcGFnZV9jb3VudCk7CisJCXN0YXR1cyA9IEZBSUw7CisJfQorCisJZmxhc2hfYWRkID0gKHU2NCkoYmxvY2sgJSAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcykpCisJCSogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSArCisJCSh1NjQpcGFnZSAqIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKworCWZsYXNoX2JhbmsgPSBibG9jayAvIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKTsKKworCWlmIChzdGF0dXMgPT0gUEFTUykgeworCQlpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzX2FkZHJlc3Nlc1tmbGFzaF9iYW5rXTsKKwkJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLAorCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJaW5kZXhfYWRkcigodTMyKShNT0RFXzEwIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCQkweDQxKTsKKwkJaW5kZXhfYWRkcigodTMyKShNT0RFXzEwIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCQkweDIwMDAgfCBwYWdlX2NvdW50KTsKKwkJd2hpbGUgKCEoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJSU5UUl9TVEFUVVMwX19MT0FEX0NPTVApKQorCQkJOworCisJCWlvd3JpdGUzMigodTMyKShNT0RFXzAxIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCQlGbGFzaE1lbSk7CisKKwkJZm9yIChpID0gMDsgaSA8IChQYWdlU3BhcmVTaXplIC8gNCk7IGkrKykKKwkJCSooKHUzMiAqKXBhZ2Vfc3BhcmUgKyBpKSA9CisJCQkJCWlvcmVhZDMyKEZsYXNoTWVtICsgMHgxMCk7CisKKwkJaWYgKGVuYWJsZV9lY2MpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzcGFyZUZsYWdCeXRlczsgaSsrKQorCQkJCXJlYWRfZGF0YVtpXSA9CisJCQkJCXBhZ2Vfc3BhcmVbUGFnZVNwYXJlU2l6ZSAtCisJCQkJCQlzcGFyZUZsYWdCeXRlcyArIGldOworCQkJZm9yIChpID0gMDsgaSA8IChQYWdlU3BhcmVTaXplIC0gc3BhcmVGbGFnQnl0ZXMpOyBpKyspCisJCQkJcmVhZF9kYXRhW3NwYXJlRmxhZ0J5dGVzICsgaV0gPQorCQkJCQkJCXBhZ2Vfc3BhcmVbaV07CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgUGFnZVNwYXJlU2l6ZTsgaSsrKQorCQkJCXJlYWRfZGF0YVtpXSA9IHBhZ2Vfc3BhcmVbaV07CisJCX0KKworCQlpbmRleF9hZGRyKCh1MzIpKE1PREVfMTAgfCAoZmxhc2hfYmFuayA8PCAyNCkgfAorCQkJKGZsYXNoX2FkZCA+PiBEZXZpY2VJbmZvLm5CaXRzSW5QYWdlRGF0YVNpemUpKSwgMHg0Mik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogTm8gdXNlIGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBsYXRlciAqLwordTE2IE5BTkRfV3JpdGVfUGFnZV9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCSAgICAgdTE2IHBhZ2VfY291bnQpCit7CisJcHJpbnRrKEtFUk5fRVJSCisJICAgICAgICJFcnJvciEgVGhpcyBmdW5jdGlvbiAoTkFORF9Xcml0ZV9QYWdlX1NwYXJlKSBzaG91bGQgbmV2ZXIiCisJCSIgYmUgY2FsbGVkIVxuIik7CisJcmV0dXJuIEVSUjsKK30KKworLyogb3AgdmFsdWU6ICAwIC0gRERNQSByZWFkOyAgMSAtIERETUEgd3JpdGUgKi8KK3N0YXRpYyB2b2lkIGRkbWFfdHJhbnModTggKmRhdGEsIHU2NCBmbGFzaF9hZGQsCisJCQl1MzIgZmxhc2hfYmFuaywgaW50IG9wLCB1MzIgbnVtUGFnZXMpCit7CisJdTMyIGRhdGFfYWRkcjsKKworCS8qIE1hcCB2aXJ0dWFsIGFkZHJlc3MgdG8gYnVzIGFkZHJlc3MgZm9yIERETUEgKi8KKwlkYXRhX2FkZHIgPSB2aXJ0X3RvX2J1cyhkYXRhKTsKKworCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8IChmbGFzaF9iYW5rIDw8IDI0KSB8CisJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCSh1MTYpKDIgPDwgMTIpIHwgKG9wIDw8IDgpIHwgbnVtUGFnZXMpOworCisJaW5kZXhfYWRkcigodTMyKShNT0RFXzEwIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJKCh1MTYpKDB4MEZGRkYgJiAoZGF0YV9hZGRyID4+IDE2KSkgPDwgOCkpLAorCQkodTE2KSgyIDw8IDEyKSB8ICgyIDw8IDgpIHwgMCk7CisKKwlpbmRleF9hZGRyKCh1MzIpKE1PREVfMTAgfCAoZmxhc2hfYmFuayA8PCAyNCkgfAorCQkoKHUxNikoMHgwRkZGRiAmIGRhdGFfYWRkcikgPDwgOCkpLAorCQkodTE2KSgyIDw8IDEyKSB8ICgzIDw8IDgpIHwgMCk7CisKKwlpbmRleF9hZGRyKCh1MzIpKE1PREVfMTAgfCAoZmxhc2hfYmFuayA8PCAyNCkgfAorCQkoMSA8PCAxNikgfCAoMHg0MCA8PCA4KSksCisJCSh1MTYpKDIgPDwgMTIpIHwgKDQgPDwgOCkgfCAwKTsKK30KKworLyogSWYgZGF0YSBpbiBidWYgYXJlIGFsbCAweGZmLCB0aGVuIHJldHVybiAxOyBvdGhlcndpc2UgcmV0dXJuIDAgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYWxsXzEodTggKmJ1ZikKK3sKKwlpbnQgaSwgaiwgY250OworCisJZm9yIChpID0gMDsgaSA8IERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsgaSsrKSB7CisJCWlmIChidWZbaV0gIT0gMHhmZikgeworCQkJY250ID0gMDsKKwkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sCisJCQkJInRoZSBmaXJzdCBub24tMHhmZiBkYXRhIGJ5dGUgaXM6ICVkXG4iLCBpKTsKKwkJCWZvciAoaiA9IGk7IGogPCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7IGorKykgeworCQkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIweCV4ICIsIGJ1ZltqXSk7CisJCQkJY250Kys7CisJCQkJaWYgKGNudCA+IDgpCisJCQkJCWJyZWFrOworCQkJfQorCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRvX2VjY19uZXcodW5zaWduZWQgbG9uZyBiYW5rLCB1OCAqYnVmLAorCQkJCXUzMiBibG9jaywgdTE2IHBhZ2UpCit7CisJaW50IHN0YXR1cyA9IFBBU1M7CisJdTE2IGVycl9wYWdlID0gMDsKKwl1MTYgZXJyX2J5dGU7CisJdTggZXJyX3NlY3Q7CisJdTggZXJyX2RldjsKKwl1MTYgZXJyX2ZpeF9pbmZvOworCXUxNiBlcnJfYWRkcjsKKwl1MzIgZWNjX3NlY3Rfc2l6ZTsKKwl1OCAqZXJyX3BvczsKKwl1MzIgZXJyX3BhZ2VfYWRkcls0XSA9IHtFUlJfUEFHRV9BRERSMCwKKwkJRVJSX1BBR0VfQUREUjEsIEVSUl9QQUdFX0FERFIyLCBFUlJfUEFHRV9BRERSM307CisKKwllY2Nfc2VjdF9zaXplID0gRUNDX1NFQ1RPUl9TSVpFICogKERldmljZUluZm8ud0RldmljZXNDb25uZWN0ZWQpOworCisJZG8geworCQllcnJfcGFnZSA9IGlvcmVhZDMyKEZsYXNoUmVnICsgZXJyX3BhZ2VfYWRkcltiYW5rXSk7CisJCWVycl9hZGRyID0gaW9yZWFkMzIoRmxhc2hSZWcgKyBFQ0NfRVJST1JfQUREUkVTUyk7CisJCWVycl9ieXRlID0gZXJyX2FkZHIgJiBFQ0NfRVJST1JfQUREUkVTU19fT0ZGU0VUOworCQllcnJfc2VjdCA9ICgoZXJyX2FkZHIgJiBFQ0NfRVJST1JfQUREUkVTU19fU0VDVE9SX05SKSA+PiAxMik7CisJCWVycl9maXhfaW5mbyA9IGlvcmVhZDMyKEZsYXNoUmVnICsgRVJSX0NPUlJFQ1RJT05fSU5GTyk7CisJCWVycl9kZXYgPSAoKGVycl9maXhfaW5mbyAmIEVSUl9DT1JSRUNUSU9OX0lORk9fX0RFVklDRV9OUikKKwkJCT4+IDgpOworCQlpZiAoZXJyX2ZpeF9pbmZvICYgRVJSX0NPUlJFQ1RJT05fSU5GT19fRVJST1JfVFlQRSkgeworCQkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCQkiJXMsIExpbmUgJWQgVW5jb3JyZWN0YWJsZSBFQ0MgZXJyb3IgIgorCQkJCSJ3aGVuIHJlYWQgYmxvY2sgJWQgcGFnZSAlZC4iCisJCQkJIlBUTl9JTlRSIHJlZ2lzdGVyOiAweCV4ICIKKwkJCQkiZXJyX3BhZ2U6ICVkLCBlcnJfc2VjdDogJWQsIGVycl9ieXRlOiAlZCwgIgorCQkJCSJlcnJfZGV2OiAlZCwgZWNjX3NlY3Rfc2l6ZTogJWQsICIKKwkJCQkiZXJyX2ZpeF9pbmZvOiAweCV4XG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgYmxvY2ssIHBhZ2UsCisJCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBQVE5fSU5UUiksCisJCQkJZXJyX3BhZ2UsIGVycl9zZWN0LCBlcnJfYnl0ZSwgZXJyX2RldiwKKwkJCQllY2Nfc2VjdF9zaXplLCAodTMyKWVycl9maXhfaW5mbyk7CisKKwkJCWlmIChjaGVja19hbGxfMShidWYpKQorCQkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCIKKwkJCQkJICAgICAgICJBbGwgMHhmZiFcbiIsCisJCQkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJZWxzZQorCQkJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCIKKwkJCQkJICAgICAgICJOb3QgYWxsIDB4ZmYhXG4iLAorCQkJCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXN0YXR1cyA9IEZBSUw7CisJCX0gZWxzZSB7CisJCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJCSIlcywgTGluZSAlZCBGb3VuZCBFQ0MgZXJyb3IgIgorCQkJCSJ3aGVuIHJlYWQgYmxvY2sgJWQgcGFnZSAlZC4iCisJCQkJImVycl9wYWdlOiAlZCwgZXJyX3NlY3Q6ICVkLCBlcnJfYnl0ZTogJWQsICIKKwkJCQkiZXJyX2RldjogJWQsIGVjY19zZWN0X3NpemU6ICVkLCAiCisJCQkJImVycl9maXhfaW5mbzogMHgleFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGJsb2NrLCBwYWdlLAorCQkJCWVycl9wYWdlLCBlcnJfc2VjdCwgZXJyX2J5dGUsIGVycl9kZXYsCisJCQkJZWNjX3NlY3Rfc2l6ZSwgKHUzMillcnJfZml4X2luZm8pOworCQkJaWYgKGVycl9ieXRlIDwgRUNDX1NFQ1RPUl9TSVpFKSB7CisJCQkJZXJyX3BvcyA9IGJ1ZiArCisJCQkJCShlcnJfcGFnZSAtIHBhZ2UpICoKKwkJCQkJRGV2aWNlSW5mby53UGFnZURhdGFTaXplICsKKwkJCQkJZXJyX3NlY3QgKiBlY2Nfc2VjdF9zaXplICsKKwkJCQkJZXJyX2J5dGUgKgorCQkJCQlEZXZpY2VJbmZvLndEZXZpY2VzQ29ubmVjdGVkICsKKwkJCQkJZXJyX2RldjsKKworCQkJCSplcnJfcG9zIF49IGVycl9maXhfaW5mbyAmCisJCQkJCUVSUl9DT1JSRUNUSU9OX0lORk9fX0JZVEVNQVNLOworCQkJfQorCQl9CisJfSB3aGlsZSAoIShlcnJfZml4X2luZm8gJiBFUlJfQ09SUkVDVElPTl9JTkZPX19MQVNUX0VSUl9JTkZPKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit1MTYgTkFORF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHU4ICpyZWFkX2RhdGEsCisJCXUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBwYWdlX2NvdW50KQoreworCXUzMiBzdGF0dXMgPSBQQVNTOworCXU2NCBmbGFzaF9hZGQ7CisJdTMyIGludHJfc3RhdHVzID0gMDsKKwl1MzIgZmxhc2hfYmFuazsKKwl1MzIgaW50cl9zdGF0dXNfYWRkcmVzc2VzWzRdID0ge0lOVFJfU1RBVFVTMCwKKwkJSU5UUl9TVEFUVVMxLCBJTlRSX1NUQVRVUzIsIElOVFJfU1RBVFVTM307CisJdTggKnJlYWRfZGF0YV9sOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXN0YXR1cyA9IEJvdW5kYXJ5X0NoZWNrX0Jsb2NrX1BhZ2UoYmxvY2ssIHBhZ2UsIHBhZ2VfY291bnQpOworCWlmIChzdGF0dXMgIT0gUEFTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCWZsYXNoX2FkZCA9ICh1NjQpKGJsb2NrICUgKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpKQorCQkqIERldmljZUluZm8ud0Jsb2NrRGF0YVNpemUgKworCQkodTY0KXBhZ2UgKiBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJZmxhc2hfYmFuayA9IGJsb2NrIC8gKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCWludHJfc3RhdHVzID0gaW50cl9zdGF0dXNfYWRkcmVzc2VzW2ZsYXNoX2JhbmtdOworCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwlpZiAocGFnZV9jb3VudCA+IDEpIHsKKwkJcmVhZF9kYXRhX2wgPSByZWFkX2RhdGE7CisJCXdoaWxlIChwYWdlX2NvdW50ID4gTUFYX1BBR0VTX1BFUl9SVykgeworCQkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgTVVMVElQTEFORV9PUEVSQVRJT04pKQorCQkJCXN0YXR1cyA9IE5BTkRfTXVsdGlwbGFuZV9SZWFkKHJlYWRfZGF0YV9sLAorCQkJCQlibG9jaywgcGFnZSwgTUFYX1BBR0VTX1BFUl9SVyk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gTkFORF9QaXBlbGluZV9SZWFkX0FoZWFkX1BvbGxpbmcoCisJCQkJCXJlYWRfZGF0YV9sLCBibG9jaywgcGFnZSwKKwkJCQkJTUFYX1BBR0VTX1BFUl9SVyk7CisKKwkJCWlmIChzdGF0dXMgPT0gRkFJTCkKKwkJCQlyZXR1cm4gc3RhdHVzOworCisJCQlyZWFkX2RhdGFfbCArPSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgKgorCQkJCQlNQVhfUEFHRVNfUEVSX1JXOworCQkJcGFnZV9jb3VudCAtPSBNQVhfUEFHRVNfUEVSX1JXOworCQkJcGFnZSArPSBNQVhfUEFHRVNfUEVSX1JXOworCQl9CisJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIE1VTFRJUExBTkVfT1BFUkFUSU9OKSkKKwkJCXN0YXR1cyA9IE5BTkRfTXVsdGlwbGFuZV9SZWFkKHJlYWRfZGF0YV9sLAorCQkJCQlibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IE5BTkRfUGlwZWxpbmVfUmVhZF9BaGVhZF9Qb2xsaW5nKAorCQkJCQlyZWFkX2RhdGFfbCwgYmxvY2ssIHBhZ2UsIHBhZ2VfY291bnQpOworCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJd2hpbGUgKCEoaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfRU5BQkxFKSAmIERNQV9FTkFCTEVfX0ZMQUcpKQorCQk7CisKKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwlkZG1hX3RyYW5zKHJlYWRfZGF0YSwgZmxhc2hfYWRkLCBmbGFzaF9iYW5rLCAwLCAxKTsKKworCWlmIChlbmFibGVfZWNjKSB7CisJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCShJTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FIHwKKwkJCUlOVFJfU1RBVFVTMF9fRUNDX0VSUikpKQorCQkJOworCisJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQlJTlRSX1NUQVRVUzBfX0VDQ19FUlIpIHsKKwkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0VDQ19FUlIsCisJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJCQlzdGF0dXMgPSBkb19lY2NfbmV3KGZsYXNoX2JhbmssIHJlYWRfZGF0YSwKKwkJCQkJYmxvY2ssIHBhZ2UpOworCQl9CisKKwkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCUlOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUgJgorCQkJSU5UUl9TVEFUVVMwX19FQ0NfRVJSKQorCQkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUgfAorCQkJCUlOVFJfU1RBVFVTMF9fRUNDX0VSUiwKKwkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJZWxzZSBpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJSU5UUl9TVEFUVVMwX19FQ0NfVFJBTlNBQ1RJT05fRE9ORSkKKwkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FLAorCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCQllbHNlIGlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQlJTlRSX1NUQVRVUzBfX0VDQ19FUlIpCisJCQlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19FQ0NfRVJSLAorCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCX0gZWxzZSB7CisJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCUlOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QKSkKKwkJCTsKKwkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwl9CisKKwlpb3dyaXRlMzIoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyksIEZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJd2hpbGUgKChpb3JlYWQzMihGbGFzaFJlZyArIERNQV9FTkFCTEUpICYgRE1BX0VOQUJMRV9fRkxBRykpCisJCTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3UxNiBOQU5EX1BpcGVsaW5lX1JlYWRfQWhlYWRfUG9sbGluZyh1OCAqcmVhZF9kYXRhLAorCQkJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IHBhZ2VfY291bnQpCit7CisJdTMyIHN0YXR1cyA9IFBBU1M7CisJdTMyIE51bVBhZ2VzID0gcGFnZV9jb3VudDsKKwl1NjQgZmxhc2hfYWRkOworCXUzMiBmbGFzaF9iYW5rOworCXUzMiBpbnRyX3N0YXR1cyA9IDA7CisJdTMyIGludHJfc3RhdHVzX2FkZHJlc3Nlc1s0XSA9IHtJTlRSX1NUQVRVUzAsCisJCUlOVFJfU1RBVFVTMSwgSU5UUl9TVEFUVVMyLCBJTlRSX1NUQVRVUzN9OworCXUzMiBlY2NfZG9uZV9PUl9kbWFfY29tcDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlzdGF0dXMgPSBCb3VuZGFyeV9DaGVja19CbG9ja19QYWdlKGJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKKworCWlmIChwYWdlX2NvdW50IDwgMikKKwkJc3RhdHVzID0gRkFJTDsKKworCWZsYXNoX2FkZCA9ICh1NjQpKGJsb2NrICUgKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpKQorCQkqRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSArCisJCSh1NjQpcGFnZSAqIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKworCWZsYXNoX2JhbmsgPSBibG9jayAvIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKTsKKworCWlmIChzdGF0dXMgPT0gUEFTUykgeworCQlpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzX2FkZHJlc3Nlc1tmbGFzaF9iYW5rXTsKKwkJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLAorCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJCTsKKworCQlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCisJCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8IChmbGFzaF9iYW5rIDw8IDI0KSB8CisJCQkoZmxhc2hfYWRkID4+IERldmljZUluZm8ubkJpdHNJblBhZ2VEYXRhU2l6ZSkpLCAweDQyKTsKKwkJZGRtYV90cmFucyhyZWFkX2RhdGEsIGZsYXNoX2FkZCwgZmxhc2hfYmFuaywgMCwgTnVtUGFnZXMpOworCisJCWVjY19kb25lX09SX2RtYV9jb21wID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChlbmFibGVfZWNjKSB7CisJCQkJd2hpbGUgKCFpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSkKKwkJCQkJOworCisJCQkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJSU5UUl9TVEFUVVMwX19FQ0NfRVJSKSB7CisJCQkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0VDQ19FUlIsCisJCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCQkJc3RhdHVzID0gZG9fZWNjX25ldyhmbGFzaF9iYW5rLAorCQkJCQkJcmVhZF9kYXRhLCBibG9jaywgcGFnZSk7CisJCQkJfSBlbHNlIGlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJCUlOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QKSB7CisJCQkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCwKKwkJCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCisJCQkJCWlmICgxID09IGVjY19kb25lX09SX2RtYV9jb21wKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZWNjX2RvbmVfT1JfZG1hX2NvbXAgPSAxOworCQkJCX0gZWxzZSBpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJCQlJTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FKSB7CisJCQkJCWlvd3JpdGUzMigKKwkJCQkJSU5UUl9TVEFUVVMwX19FQ0NfVFJBTlNBQ1RJT05fRE9ORSwKKwkJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJCQkJaWYgKDEgPT0gZWNjX2RvbmVfT1JfZG1hX2NvbXApCisJCQkJCQlicmVhazsKKworCQkJCQllY2NfZG9uZV9PUl9kbWFfY29tcCA9IDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoIShpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJCUlOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QKSkKKwkJCQkJOworCisJCQkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QLAorCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaW93cml0ZTMyKCh+SU5UUl9TVEFUVVMwX19FQ0NfRVJSKSAmCisJCQkJKH5JTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FKSAmCisJCQkJKH5JTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCksCisJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJfQorCisJCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwKKwkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCisJCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCisJCXdoaWxlICgoaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfRU5BQkxFKSAmIERNQV9FTkFCTEVfX0ZMQUcpKQorCQkJOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCit1MTYgTkFORF9SZWFkX1BhZ2VfTWFpbih1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBwYWdlLAorCQkJICAgdTE2IHBhZ2VfY291bnQpCit7CisJdTMyIHN0YXR1cyA9IFBBU1M7CisJdTY0IGZsYXNoX2FkZDsKKwl1MzIgaW50cl9zdGF0dXMgPSAwOworCXUzMiBmbGFzaF9iYW5rOworCXUzMiBpbnRyX3N0YXR1c19hZGRyZXNzZXNbNF0gPSB7SU5UUl9TVEFUVVMwLAorCQlJTlRSX1NUQVRVUzEsIElOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwlpbnQgcmV0OworCXU4ICpyZWFkX2RhdGFfbDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJc3RhdHVzID0gQm91bmRhcnlfQ2hlY2tfQmxvY2tfUGFnZShibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisJaWYgKHN0YXR1cyAhPSBQQVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJZmxhc2hfYWRkID0gKHU2NCkoYmxvY2sgJSAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcykpCisJCSogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSArCisJCSh1NjQpcGFnZSAqIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKwlmbGFzaF9iYW5rID0gYmxvY2sgLyAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcyk7CisKKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCisJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1c19hZGRyZXNzZXNbZmxhc2hfYmFua107CisJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCWlmIChwYWdlX2NvdW50ID4gMSkgeworCQlyZWFkX2RhdGFfbCA9IHJlYWRfZGF0YTsKKwkJd2hpbGUgKHBhZ2VfY291bnQgPiBNQVhfUEFHRVNfUEVSX1JXKSB7CisJCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBNVUxUSVBMQU5FX09QRVJBVElPTikpCisJCQkJc3RhdHVzID0gTkFORF9NdWx0aXBsYW5lX1JlYWQocmVhZF9kYXRhX2wsCisJCQkJCWJsb2NrLCBwYWdlLCBNQVhfUEFHRVNfUEVSX1JXKTsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSBOQU5EX1BpcGVsaW5lX1JlYWRfQWhlYWQoCisJCQkJCXJlYWRfZGF0YV9sLCBibG9jaywgcGFnZSwKKwkJCQkJTUFYX1BBR0VTX1BFUl9SVyk7CisKKwkJCWlmIChzdGF0dXMgPT0gRkFJTCkKKwkJCQlyZXR1cm4gc3RhdHVzOworCisJCQlyZWFkX2RhdGFfbCArPSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgKgorCQkJCQlNQVhfUEFHRVNfUEVSX1JXOworCQkJcGFnZV9jb3VudCAtPSBNQVhfUEFHRVNfUEVSX1JXOworCQkJcGFnZSArPSBNQVhfUEFHRVNfUEVSX1JXOworCQl9CisJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIE1VTFRJUExBTkVfT1BFUkFUSU9OKSkKKwkJCXN0YXR1cyA9IE5BTkRfTXVsdGlwbGFuZV9SZWFkKHJlYWRfZGF0YV9sLAorCQkJCQlibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IE5BTkRfUGlwZWxpbmVfUmVhZF9BaGVhZCgKKwkJCQkJcmVhZF9kYXRhX2wsIGJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKwlpb3dyaXRlMzIoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyksIEZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCisJLyogRmlsbCB0aGUgbXJzdF9uYW5kX2luZm8gc3RydWN0dXJlICovCisJaW5mby5zdGF0ZSA9IElOVF9SRUFEX1BBR0VfTUFJTjsKKwlpbmZvLnJlYWRfZGF0YSA9IHJlYWRfZGF0YTsKKwlpbmZvLmZsYXNoX2JhbmsgPSBmbGFzaF9iYW5rOworCWluZm8uYmxvY2sgPSBibG9jazsKKwlpbmZvLnBhZ2UgPSBwYWdlOworCWluZm8ucmV0ID0gUEFTUzsKKworCWRkbWFfdHJhbnMocmVhZF9kYXRhLCBmbGFzaF9hZGQsIGZsYXNoX2JhbmssIDAsIDEpOworCisJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgR0xPQkFMX0lOVF9FTkFCTEUpOyAvKiBFbmFibGUgSW50ZXJydXB0ICovCisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8uY29tcGxldGUsIDEwICogSFopOworCWlmICghcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiV2FpdCBmb3IgY29tcGxldGlvbiB0aW1lb3V0ICIKKwkJCSJpbiAlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJc3RhdHVzID0gRVJSOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGluZm8ucmV0OworCX0KKworCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBETUFfRU5BQkxFKTsKKwl3aGlsZSAoKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBDb252X1NwYXJlX0RhdGFfTG9nMlBoeV9Gb3JtYXQodTggKmRhdGEpCit7CisJaW50IGk7CisJY29uc3QgdTMyIHNwYXJlRmxhZ0J5dGVzID0gRGV2aWNlSW5mby53TnVtUGFnZVNwYXJlRmxhZzsKKwljb25zdCB1MzIgUGFnZVNwYXJlU2l6ZSAgPSBEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplOworCisJaWYgKGVuYWJsZV9lY2MpIHsKKwkJZm9yIChpID0gc3BhcmVGbGFnQnl0ZXMgLSAxOyBpID49IDA7IGkrKykKKwkJCWRhdGFbUGFnZVNwYXJlU2l6ZSAtIHNwYXJlRmxhZ0J5dGVzICsgaV0gPSBkYXRhW2ldOworCX0KK30KKwordm9pZCBDb252X1NwYXJlX0RhdGFfUGh5MkxvZ19Gb3JtYXQodTggKmRhdGEpCit7CisJaW50IGk7CisJY29uc3QgdTMyIHNwYXJlRmxhZ0J5dGVzID0gRGV2aWNlSW5mby53TnVtUGFnZVNwYXJlRmxhZzsKKwljb25zdCB1MzIgUGFnZVNwYXJlU2l6ZSA9IERldmljZUluZm8ud1BhZ2VTcGFyZVNpemU7CisKKwlpZiAoZW5hYmxlX2VjYykgeworCQlmb3IgKGkgPSAwOyBpIDwgc3BhcmVGbGFnQnl0ZXM7IGkrKykKKwkJCWRhdGFbaV0gPSBkYXRhW1BhZ2VTcGFyZVNpemUgLSBzcGFyZUZsYWdCeXRlcyArIGldOworCX0KK30KKworCit2b2lkIENvbnZfTWFpbl9TcGFyZV9EYXRhX0xvZzJQaHlfRm9ybWF0KHU4ICpkYXRhLCB1MTYgcGFnZV9jb3VudCkKK3sKKwljb25zdCB1MzIgUGFnZVNpemUgPSBEZXZpY2VJbmZvLndQYWdlU2l6ZTsKKwljb25zdCB1MzIgUGFnZURhdGFTaXplID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCWNvbnN0IHUzMiBlY2NCeXRlcyA9IERldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yOworCWNvbnN0IHUzMiBzcGFyZVNraXBCeXRlcyA9IERldmljZUluZm8ud1NwYXJlU2tpcEJ5dGVzOworCWNvbnN0IHUzMiBzcGFyZUZsYWdCeXRlcyA9IERldmljZUluZm8ud051bVBhZ2VTcGFyZUZsYWc7CisJdTMyIGVjY1NlY3RvclNpemU7CisJdTMyIHBhZ2Vfb2Zmc2V0OworCWludCBpLCBqOworCisJZWNjU2VjdG9yU2l6ZSA9IEVDQ19TRUNUT1JfU0laRSAqIChEZXZpY2VJbmZvLndEZXZpY2VzQ29ubmVjdGVkKTsKKwlpZiAoZW5hYmxlX2VjYykgeworCQl3aGlsZSAocGFnZV9jb3VudCA+IDApIHsKKwkJCXBhZ2Vfb2Zmc2V0ID0gKHBhZ2VfY291bnQgLSAxKSAqIFBhZ2VTaXplOworCQkJaiA9IChEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgLyBlY2NTZWN0b3JTaXplKTsKKwkJCWZvciAoaSA9IHNwYXJlRmxhZ0J5dGVzIC0gMTsgaSA+PSAwOyBpLS0pCisJCQkJZGF0YVtwYWdlX29mZnNldCArCisJCQkJCShlY2NTZWN0b3JTaXplICsgZWNjQnl0ZXMpICogaiArIGldID0KKwkJCQkJZGF0YVtwYWdlX29mZnNldCArIFBhZ2VEYXRhU2l6ZSArIGldOworCQkJZm9yIChqLS07IGogPj0gMTsgai0tKSB7CisJCQkJZm9yIChpID0gZWNjU2VjdG9yU2l6ZSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJCQlkYXRhW3BhZ2Vfb2Zmc2V0ICsKKwkJCQkJKGVjY1NlY3RvclNpemUgKyBlY2NCeXRlcykgKiBqICsgaV0gPQorCQkJCQkJZGF0YVtwYWdlX29mZnNldCArCisJCQkJCQllY2NTZWN0b3JTaXplICogaiArIGldOworCQkJfQorCQkJZm9yIChpID0gKFBhZ2VTaXplIC0gc3BhcmVTa2lwQnl0ZXMpIC0gMTsKKwkJCQlpID49IFBhZ2VEYXRhU2l6ZTsgaS0tKQorCQkJCWRhdGFbcGFnZV9vZmZzZXQgKyBpICsgc3BhcmVTa2lwQnl0ZXNdID0KKwkJCQkJZGF0YVtwYWdlX29mZnNldCArIGldOworCQkJcGFnZV9jb3VudC0tOworCQl9CisJfQorfQorCit2b2lkIENvbnZfTWFpbl9TcGFyZV9EYXRhX1BoeTJMb2dfRm9ybWF0KHU4ICpkYXRhLCB1MTYgcGFnZV9jb3VudCkKK3sKKwljb25zdCB1MzIgUGFnZVNpemUgPSBEZXZpY2VJbmZvLndQYWdlU2l6ZTsKKwljb25zdCB1MzIgUGFnZURhdGFTaXplID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCWNvbnN0IHUzMiBlY2NCeXRlcyA9IERldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yOworCWNvbnN0IHUzMiBzcGFyZVNraXBCeXRlcyA9IERldmljZUluZm8ud1NwYXJlU2tpcEJ5dGVzOworCWNvbnN0IHUzMiBzcGFyZUZsYWdCeXRlcyA9IERldmljZUluZm8ud051bVBhZ2VTcGFyZUZsYWc7CisJdTMyIGVjY1NlY3RvclNpemU7CisJdTMyIHBhZ2Vfb2Zmc2V0OworCWludCBpLCBqOworCisJZWNjU2VjdG9yU2l6ZSA9IEVDQ19TRUNUT1JfU0laRSAqIChEZXZpY2VJbmZvLndEZXZpY2VzQ29ubmVjdGVkKTsKKwlpZiAoZW5hYmxlX2VjYykgeworCQl3aGlsZSAocGFnZV9jb3VudCA+IDApIHsKKwkJCXBhZ2Vfb2Zmc2V0ID0gKHBhZ2VfY291bnQgLSAxKSAqIFBhZ2VTaXplOworCQkJZm9yIChpID0gUGFnZURhdGFTaXplOworCQkJCWkgPCBQYWdlU2l6ZSAtIHNwYXJlU2tpcEJ5dGVzOworCQkJCWkrKykKKwkJCQlkYXRhW3BhZ2Vfb2Zmc2V0ICsgaV0gPQorCQkJCQlkYXRhW3BhZ2Vfb2Zmc2V0ICsgaSArCisJCQkJCXNwYXJlU2tpcEJ5dGVzXTsKKwkJCWZvciAoaiA9IDE7CisJCQlqIDwgRGV2aWNlSW5mby53UGFnZURhdGFTaXplIC8gZWNjU2VjdG9yU2l6ZTsKKwkJCWorKykgeworCQkJCWZvciAoaSA9IDA7IGkgPCBlY2NTZWN0b3JTaXplOyBpKyspCisJCQkJCWRhdGFbcGFnZV9vZmZzZXQgKworCQkJCQllY2NTZWN0b3JTaXplICogaiArIGldID0KKwkJCQkJCWRhdGFbcGFnZV9vZmZzZXQgKworCQkJCQkJKGVjY1NlY3RvclNpemUgKyBlY2NCeXRlcykgKiBqCisJCQkJCQkrIGldOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IHNwYXJlRmxhZ0J5dGVzOyBpKyspCisJCQkJZGF0YVtwYWdlX29mZnNldCArIFBhZ2VEYXRhU2l6ZSArIGldID0KKwkJCQkJZGF0YVtwYWdlX29mZnNldCArCisJCQkJCShlY2NTZWN0b3JTaXplICsgZWNjQnl0ZXMpICogaiArIGldOworCQkJcGFnZV9jb3VudC0tOworCQl9CisJfQorfQorCisvKiBVbi10ZXN0ZWQgZnVuY3Rpb24gKi8KK3UxNiBOQU5EX011bHRpcGxhbmVfUmVhZCh1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBwYWdlLAorCQkJICAgIHUxNiBwYWdlX2NvdW50KQoreworCXUzMiBzdGF0dXMgPSBQQVNTOworCXUzMiBOdW1QYWdlcyA9IHBhZ2VfY291bnQ7CisJdTY0IGZsYXNoX2FkZDsKKwl1MzIgZmxhc2hfYmFuazsKKwl1MzIgaW50cl9zdGF0dXMgPSAwOworCXUzMiBpbnRyX3N0YXR1c19hZGRyZXNzZXNbNF0gPSB7SU5UUl9TVEFUVVMwLAorCQlJTlRSX1NUQVRVUzEsIElOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwl1MzIgZWNjX2RvbmVfT1JfZG1hX2NvbXA7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJc3RhdHVzID0gQm91bmRhcnlfQ2hlY2tfQmxvY2tfUGFnZShibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisKKwlmbGFzaF9hZGQgPSAodTY0KShibG9jayAlIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKSkKKwkJKiBEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplICsKKwkJKHU2NClwYWdlICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJZmxhc2hfYmFuayA9IGJsb2NrIC8gKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpOworCisJaWYgKHN0YXR1cyA9PSBQQVNTKSB7CisJCWludHJfc3RhdHVzID0gaW50cl9zdGF0dXNfYWRkcmVzc2VzW2ZsYXNoX2JhbmtdOworCQlpb3dyaXRlMzIoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyksCisJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCQlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCQlpb3dyaXRlMzIoMHgwMSwgRmxhc2hSZWcgKyBNVUxUSVBMQU5FX09QRVJBVElPTik7CisKKwkJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJCTsKKwkJaW5kZXhfYWRkcigodTMyKShNT0RFXzEwIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksIDB4NDIpOworCQlkZG1hX3RyYW5zKHJlYWRfZGF0YSwgZmxhc2hfYWRkLCBmbGFzaF9iYW5rLCAwLCBOdW1QYWdlcyk7CisKKwkJZWNjX2RvbmVfT1JfZG1hX2NvbXAgPSAwOworCQl3aGlsZSAoMSkgeworCQkJaWYgKGVuYWJsZV9lY2MpIHsKKwkJCQl3aGlsZSAoIWlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpKQorCQkJCQk7CisKKwkJCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJCQlJTlRSX1NUQVRVUzBfX0VDQ19FUlIpIHsKKwkJCQkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRUNDX0VSUiwKKwkJCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCQkJCQlzdGF0dXMgPSBkb19lY2NfbmV3KGZsYXNoX2JhbmssCisJCQkJCQlyZWFkX2RhdGEsIGJsb2NrLCBwYWdlKTsKKwkJCQl9IGVsc2UgaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApIHsKKwkJCQkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QLAorCQkJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJCQkJaWYgKDEgPT0gZWNjX2RvbmVfT1JfZG1hX2NvbXApCisJCQkJCQlicmVhazsKKworCQkJCQllY2NfZG9uZV9PUl9kbWFfY29tcCA9IDE7CisJCQkJfSBlbHNlIGlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJCUlOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUpIHsKKwkJCQkJaW93cml0ZTMyKAorCQkJCQlJTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FLAorCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCQkJCQlpZiAoMSA9PSBlY2NfZG9uZV9PUl9kbWFfY29tcCkKKwkJCQkJCWJyZWFrOworCisJCQkJCWVjY19kb25lX09SX2RtYV9jb21wID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApKQorCQkJCQk7CisJCQkJaW93cml0ZTMyKElOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QLAorCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaW93cml0ZTMyKCh+SU5UUl9TVEFUVVMwX19FQ0NfRVJSKSAmCisJCQkJKH5JTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FKSAmCisJCQkJKH5JTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCksCisJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJfQorCisJCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwKKwkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCisJCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCisJCXdoaWxlICgoaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfRU5BQkxFKSAmIERNQV9FTkFCTEVfX0ZMQUcpKQorCQkJOworCisJCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIE1VTFRJUExBTkVfT1BFUkFUSU9OKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit1MTYgTkFORF9QaXBlbGluZV9SZWFkX0FoZWFkKHU4ICpyZWFkX2RhdGEsIHUzMiBibG9jaywKKwkJCQl1MTYgcGFnZSwgdTE2IHBhZ2VfY291bnQpCit7CisJdTMyIHN0YXR1cyA9IFBBU1M7CisJdTMyIE51bVBhZ2VzID0gcGFnZV9jb3VudDsKKwl1NjQgZmxhc2hfYWRkOworCXUzMiBmbGFzaF9iYW5rOworCXUzMiBpbnRyX3N0YXR1cyA9IDA7CisJdTMyIGludHJfc3RhdHVzX2FkZHJlc3Nlc1s0XSA9IHtJTlRSX1NUQVRVUzAsCisJCUlOVFJfU1RBVFVTMSwgSU5UUl9TVEFUVVMyLCBJTlRSX1NUQVRVUzN9OworCWludCByZXQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCXN0YXR1cyA9IEJvdW5kYXJ5X0NoZWNrX0Jsb2NrX1BhZ2UoYmxvY2ssIHBhZ2UsIHBhZ2VfY291bnQpOworCisJaWYgKHBhZ2VfY291bnQgPCAyKQorCQlzdGF0dXMgPSBGQUlMOworCisJaWYgKHN0YXR1cyAhPSBQQVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJZmxhc2hfYWRkID0gKHU2NCkoYmxvY2sgJSAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcykpCisJCSpEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplICsKKwkJKHU2NClwYWdlICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJZmxhc2hfYmFuayA9IGJsb2NrIC8gKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpOworCisJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1c19hZGRyZXNzZXNbZmxhc2hfYmFua107CisJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCS8qIEZpbGwgdGhlIG1yc3RfbmFuZF9pbmZvIHN0cnVjdHVyZSAqLworCWluZm8uc3RhdGUgPSBJTlRfUElQRUxJTkVfUkVBRF9BSEVBRDsKKwlpbmZvLnJlYWRfZGF0YSA9IHJlYWRfZGF0YTsKKwlpbmZvLmZsYXNoX2JhbmsgPSBmbGFzaF9iYW5rOworCWluZm8uYmxvY2sgPSBibG9jazsKKwlpbmZvLnBhZ2UgPSBwYWdlOworCWluZm8ucmV0ID0gUEFTUzsKKworCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8IChmbGFzaF9iYW5rIDw8IDI0KSB8CisJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksIDB4NDIpOworCisJZGRtYV90cmFucyhyZWFkX2RhdGEsIGZsYXNoX2FkZCwgZmxhc2hfYmFuaywgMCwgTnVtUGFnZXMpOworCisJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgR0xPQkFMX0lOVF9FTkFCTEUpOyAvKiBFbmFibGUgSW50ZXJydXB0ICovCisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8uY29tcGxldGUsIDEwICogSFopOworCWlmICghcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiV2FpdCBmb3IgY29tcGxldGlvbiB0aW1lb3V0ICIKKwkJCSJpbiAlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJc3RhdHVzID0gRVJSOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGluZm8ucmV0OworCX0KKworCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBETUFfRU5BQkxFKTsKKworCXdoaWxlICgoaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfRU5BQkxFKSAmIERNQV9FTkFCTEVfX0ZMQUcpKQorCQk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3UxNiBOQU5EX1dyaXRlX1BhZ2VfTWFpbih1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCSAgICB1MTYgcGFnZV9jb3VudCkKK3sKKwl1MzIgc3RhdHVzID0gUEFTUzsKKwl1NjQgZmxhc2hfYWRkOworCXUzMiBpbnRyX3N0YXR1cyA9IDA7CisJdTMyIGZsYXNoX2Jhbms7CisJdTMyIGludHJfc3RhdHVzX2FkZHJlc3Nlc1s0XSA9IHtJTlRSX1NUQVRVUzAsCisJCUlOVFJfU1RBVFVTMSwgSU5UUl9TVEFUVVMyLCBJTlRSX1NUQVRVUzN9OworCWludCByZXQ7CisJdTggKndyaXRlX2RhdGFfbDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJc3RhdHVzID0gQm91bmRhcnlfQ2hlY2tfQmxvY2tfUGFnZShibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisJaWYgKHN0YXR1cyAhPSBQQVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJZmxhc2hfYWRkID0gKHU2NCkoYmxvY2sgJSAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcykpCisJCSogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSArCisJCSh1NjQpcGFnZSAqIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKKworCWZsYXNoX2JhbmsgPSBibG9jayAvIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKTsKKworCWludHJfc3RhdHVzID0gaW50cl9zdGF0dXNfYWRkcmVzc2VzW2ZsYXNoX2JhbmtdOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX1BST0dSQU1fQ09NUCB8CisJCUlOVFJfU1RBVFVTMF9fUFJPR1JBTV9GQUlMLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCWlmIChwYWdlX2NvdW50ID4gMSkgeworCQl3cml0ZV9kYXRhX2wgPSB3cml0ZV9kYXRhOworCQl3aGlsZSAocGFnZV9jb3VudCA+IE1BWF9QQUdFU19QRVJfUlcpIHsKKwkJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIE1VTFRJUExBTkVfT1BFUkFUSU9OKSkKKwkJCQlzdGF0dXMgPSBOQU5EX011bHRpcGxhbmVfV3JpdGUod3JpdGVfZGF0YV9sLAorCQkJCQlibG9jaywgcGFnZSwgTUFYX1BBR0VTX1BFUl9SVyk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gTkFORF9QaXBlbGluZV9Xcml0ZV9BaGVhZCgKKwkJCQkJd3JpdGVfZGF0YV9sLCBibG9jaywgcGFnZSwKKwkJCQkJTUFYX1BBR0VTX1BFUl9SVyk7CisJCQlpZiAoc3RhdHVzID09IEZBSUwpCisJCQkJcmV0dXJuIHN0YXR1czsKKworCQkJd3JpdGVfZGF0YV9sICs9IERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSAqCisJCQkJCU1BWF9QQUdFU19QRVJfUlc7CisJCQlwYWdlX2NvdW50IC09IE1BWF9QQUdFU19QRVJfUlc7CisJCQlwYWdlICs9IE1BWF9QQUdFU19QRVJfUlc7CisJCX0KKwkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgTVVMVElQTEFORV9PUEVSQVRJT04pKQorCQkJc3RhdHVzID0gTkFORF9NdWx0aXBsYW5lX1dyaXRlKHdyaXRlX2RhdGFfbCwKKwkJCQlibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IE5BTkRfUGlwZWxpbmVfV3JpdGVfQWhlYWQod3JpdGVfZGF0YV9sLAorCQkJCWJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkvKiBGaWxsIHRoZSBtcnN0X25hbmRfaW5mbyBzdHJ1Y3R1cmUgKi8KKwlpbmZvLnN0YXRlID0gSU5UX1dSSVRFX1BBR0VfTUFJTjsKKwlpbmZvLndyaXRlX2RhdGEgPSB3cml0ZV9kYXRhOworCWluZm8uZmxhc2hfYmFuayA9IGZsYXNoX2Jhbms7CisJaW5mby5ibG9jayA9IGJsb2NrOworCWluZm8ucGFnZSA9IHBhZ2U7CisJaW5mby5yZXQgPSBQQVNTOworCisJZGRtYV90cmFucyh3cml0ZV9kYXRhLCBmbGFzaF9hZGQsIGZsYXNoX2JhbmssIDEsIDEpOworCisJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgR0xPQkFMX0lOVF9FTkFCTEUpOyAvKiBFbmFibGUgaW50ZXJydXB0ICovCisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8uY29tcGxldGUsIDEwICogSFopOworCWlmICghcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiV2FpdCBmb3IgY29tcGxldGlvbiB0aW1lb3V0ICIKKwkJCSJpbiAlcywgTGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJc3RhdHVzID0gRVJSOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGluZm8ucmV0OworCX0KKworCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBETUFfRU5BQkxFKTsKKwl3aGlsZSAoaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfRU5BQkxFKSAmIERNQV9FTkFCTEVfX0ZMQUcpCisJCTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgTkFORF9FQ0NfQ3RybChpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCSJXaWxsIGVuYWJsZSBFQ0MgaW4gJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCQlpb3dyaXRlMzIoMSwgRmxhc2hSZWcgKyBFQ0NfRU5BQkxFKTsKKwkJZW5hYmxlX2VjYyA9IDE7CisJfSBlbHNlIHsKKwkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJCSJXaWxsIGRpc2FibGUgRUNDIGluICVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKwkJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgRUNDX0VOQUJMRSk7CisJCWVuYWJsZV9lY2MgPSAwOworCX0KK30KKwordTE2IE5BTkRfV3JpdGVfUGFnZV9NYWluX1NwYXJlKHU4ICp3cml0ZV9kYXRhLCB1MzIgYmxvY2ssCisJCQkJCXUxNiBwYWdlLCB1MTYgcGFnZV9jb3VudCkKK3sKKwl1MzIgc3RhdHVzID0gUEFTUzsKKwl1MzIgaSwgaiwgcGFnZV9udW0gPSAwOworCXUzMiBQYWdlU2l6ZSA9IERldmljZUluZm8ud1BhZ2VTaXplOworCXUzMiBQYWdlRGF0YVNpemUgPSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJdTMyIGVjY0J5dGVzID0gRGV2aWNlSW5mby53RUNDQnl0ZXNQZXJTZWN0b3I7CisJdTMyIHNwYXJlRmxhZ0J5dGVzID0gRGV2aWNlSW5mby53TnVtUGFnZVNwYXJlRmxhZzsKKwl1MzIgc3BhcmVTa2lwQnl0ZXMgID0gRGV2aWNlSW5mby53U3BhcmVTa2lwQnl0ZXM7CisJdTY0IGZsYXNoX2FkZDsKKwl1MzIgZWNjU2VjdG9yU2l6ZTsKKwl1MzIgZmxhc2hfYmFuazsKKwl1MzIgaW50cl9zdGF0dXMgPSAwOworCXUzMiBpbnRyX3N0YXR1c19hZGRyZXNzZXNbNF0gPSB7SU5UUl9TVEFUVVMwLAorCQlJTlRSX1NUQVRVUzEsIElOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwl1OCAqcGFnZV9tYWluX3NwYXJlID0gYnVmX3dyaXRlX3BhZ2VfbWFpbl9zcGFyZTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwllY2NTZWN0b3JTaXplID0gRUNDX1NFQ1RPUl9TSVpFICogKERldmljZUluZm8ud0RldmljZXNDb25uZWN0ZWQpOworCisJc3RhdHVzID0gQm91bmRhcnlfQ2hlY2tfQmxvY2tfUGFnZShibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisKKwlmbGFzaF9iYW5rID0gYmxvY2sgLyAoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcyk7CisKKwlpZiAoc3RhdHVzID09IFBBU1MpIHsKKwkJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1c19hZGRyZXNzZXNbZmxhc2hfYmFua107CisKKwkJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCQl3aGlsZSAoKHN0YXR1cyAhPSBGQUlMKSAmJiAocGFnZV9jb3VudCA+IDApKSB7CisJCQlmbGFzaF9hZGQgPSAodTY0KShibG9jayAlCisJCQkoRGV2aWNlSW5mby53VG90YWxCbG9ja3MgLyB0b3RhbFVzZWRCYW5rcykpICoKKwkJCURldmljZUluZm8ud0Jsb2NrRGF0YVNpemUgKworCQkJKHU2NClwYWdlICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJCQlpb3dyaXRlMzIoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyksCisJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisKKwkJCWlvd3JpdGUzMigodTMyKShNT0RFXzAxIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJCQkoZmxhc2hfYWRkID4+CisJCQkJRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCQkJRmxhc2hNZW0pOworCisJCQlpZiAoZW5hYmxlX2VjYykgeworCQkJCWZvciAoaiA9IDA7CisJCQkJICAgICBqIDwKKwkJCQkgICAgIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSAvIGVjY1NlY3RvclNpemU7CisJCQkJICAgICBqKyspIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IGVjY1NlY3RvclNpemU7IGkrKykKKwkJCQkJCXBhZ2VfbWFpbl9zcGFyZVsoZWNjU2VjdG9yU2l6ZSArCisJCQkJCQkJCSBlY2NCeXRlcykgKiBqICsKKwkJCQkJCQkJaV0gPQorCQkJCQkJICAgIHdyaXRlX2RhdGFbZWNjU2VjdG9yU2l6ZSAqCisJCQkJCQkJICAgICAgIGogKyBpXTsKKworCQkJCQlmb3IgKGkgPSAwOyBpIDwgZWNjQnl0ZXM7IGkrKykKKwkJCQkJCXBhZ2VfbWFpbl9zcGFyZVsoZWNjU2VjdG9yU2l6ZSArCisJCQkJCQkJCSBlY2NCeXRlcykgKiBqICsKKwkJCQkJCQkJZWNjU2VjdG9yU2l6ZSArCisJCQkJCQkJCWldID0KKwkJCQkJCSAgICB3cml0ZV9kYXRhW1BhZ2VEYXRhU2l6ZSArCisJCQkJCQkJICAgICAgIHNwYXJlRmxhZ0J5dGVzICsKKwkJCQkJCQkgICAgICAgZWNjQnl0ZXMgKiBqICsKKwkJCQkJCQkgICAgICAgaV07CisJCQkJfQorCisJCQkJZm9yIChpID0gMDsgaSA8IHNwYXJlRmxhZ0J5dGVzOyBpKyspCisJCQkJCXBhZ2VfbWFpbl9zcGFyZVsoZWNjU2VjdG9yU2l6ZSArCisJCQkJCQkJIGVjY0J5dGVzKSAqIGogKyBpXSA9CisJCQkJCSAgICB3cml0ZV9kYXRhW1BhZ2VEYXRhU2l6ZSArIGldOworCisJCQkJZm9yIChpID0gUGFnZVNpemUgLSAxOyBpID49IFBhZ2VEYXRhU2l6ZSArCisJCQkJCQkJc3BhcmVTa2lwQnl0ZXM7IGktLSkKKwkJCQkJcGFnZV9tYWluX3NwYXJlW2ldID0gcGFnZV9tYWluX3NwYXJlW2kgLQorCQkJCQkJCQlzcGFyZVNraXBCeXRlc107CisKKwkJCQlmb3IgKGkgPSBQYWdlRGF0YVNpemU7IGkgPCBQYWdlRGF0YVNpemUgKworCQkJCQkJCXNwYXJlU2tpcEJ5dGVzOyBpKyspCisJCQkJCXBhZ2VfbWFpbl9zcGFyZVtpXSA9IDB4ZmY7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgUGFnZVNpemUgLyA0OyBpKyspCisJCQkJCWlvd3JpdGUzMigKKwkJCQkJKigodTMyICopcGFnZV9tYWluX3NwYXJlICsgaSksCisJCQkJCUZsYXNoTWVtICsgMHgxMCk7CisJCQl9IGVsc2UgeworCisJCQkJZm9yIChpID0gMDsgaSA8IFBhZ2VTaXplIC8gNDsgaSsrKQorCQkJCQlpb3dyaXRlMzIoKigodTMyICopd3JpdGVfZGF0YSArIGkpLAorCQkJCQkJRmxhc2hNZW0gKyAweDEwKTsKKwkJCX0KKworCQkJd2hpbGUgKCEoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJCShJTlRSX1NUQVRVUzBfX1BST0dSQU1fQ09NUCB8CisJCQkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwpKSkKKwkJCQk7CisKKwkJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwpCisJCQkJc3RhdHVzID0gRkFJTDsKKworCQkJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLAorCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCQkJcGFnZV9udW0rKzsKKwkJCXBhZ2VfY291bnQtLTsKKwkJCXdyaXRlX2RhdGEgKz0gUGFnZVNpemU7CisJCX0KKworCQlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3UxNiBOQU5EX1JlYWRfUGFnZV9NYWluX1NwYXJlKHU4ICpyZWFkX2RhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsCisJCQkJIHUxNiBwYWdlX2NvdW50KQoreworCXUzMiBzdGF0dXMgPSBQQVNTOworCXUzMiBpLCBqOworCXU2NCBmbGFzaF9hZGQgPSAwOworCXUzMiBQYWdlU2l6ZSA9IERldmljZUluZm8ud1BhZ2VTaXplOworCXUzMiBQYWdlRGF0YVNpemUgPSBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemU7CisJdTMyIFBhZ2VTcGFyZVNpemUgPSBEZXZpY2VJbmZvLndQYWdlU3BhcmVTaXplOworCXUzMiBlY2NCeXRlcyA9IERldmljZUluZm8ud0VDQ0J5dGVzUGVyU2VjdG9yOworCXUzMiBzcGFyZUZsYWdCeXRlcyA9IERldmljZUluZm8ud051bVBhZ2VTcGFyZUZsYWc7CisJdTMyIHNwYXJlU2tpcEJ5dGVzICA9IERldmljZUluZm8ud1NwYXJlU2tpcEJ5dGVzOworCXUzMiBlY2NTZWN0b3JTaXplOworCXUzMiBmbGFzaF9iYW5rOworCXUzMiBpbnRyX3N0YXR1cyA9IDA7CisJdTggKnJlYWRfZGF0YV9sID0gcmVhZF9kYXRhOworCXUzMiBpbnRyX3N0YXR1c19hZGRyZXNzZXNbNF0gPSB7SU5UUl9TVEFUVVMwLAorCQlJTlRSX1NUQVRVUzEsIElOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwl1OCAqcGFnZV9tYWluX3NwYXJlID0gYnVmX3JlYWRfcGFnZV9tYWluX3NwYXJlOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWVjY1NlY3RvclNpemUgPSBFQ0NfU0VDVE9SX1NJWkUgKiAoRGV2aWNlSW5mby53RGV2aWNlc0Nvbm5lY3RlZCk7CisKKwlzdGF0dXMgPSBCb3VuZGFyeV9DaGVja19CbG9ja19QYWdlKGJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKKworCWZsYXNoX2JhbmsgPSBibG9jayAvIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKTsKKworCWlmIChzdGF0dXMgPT0gUEFTUykgeworCQlpbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzX2FkZHJlc3Nlc1tmbGFzaF9iYW5rXTsKKworCQlpb3dyaXRlMzIoMSwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCisJCWlvd3JpdGUzMihpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSwKKwkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCQl3aGlsZSAoKHN0YXR1cyAhPSBGQUlMKSAmJiAocGFnZV9jb3VudCA+IDApKSB7CisJCQlmbGFzaF9hZGQgPSAodTY0KShibG9jayAlCisJCQkJKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpKQorCQkJCSogRGV2aWNlSW5mby53QmxvY2tEYXRhU2l6ZSArCisJCQkJKHU2NClwYWdlICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJCQlpbmRleF9hZGRyKCh1MzIpKE1PREVfMTAgfCAoZmxhc2hfYmFuayA8PCAyNCkgfAorCQkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCQkJMHg0Myk7CisJCQlpbmRleF9hZGRyKCh1MzIpKE1PREVfMTAgfCAoZmxhc2hfYmFuayA8PCAyNCkgfAorCQkJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksCisJCQkJMHgyMDAwIHwgcGFnZV9jb3VudCk7CisKKwkJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQlJTlRSX1NUQVRVUzBfX0xPQURfQ09NUCkpCisJCQkJOworCisJCQlpb3dyaXRlMzIoKHUzMikoTU9ERV8wMSB8IChmbGFzaF9iYW5rIDw8IDI0KSB8CisJCQkJKGZsYXNoX2FkZCA+PgorCQkJCURldmljZUluZm8ubkJpdHNJblBhZ2VEYXRhU2l6ZSkpLAorCQkJCUZsYXNoTWVtKTsKKworCQkJZm9yIChpID0gMDsgaSA8IFBhZ2VTaXplIC8gNDsgaSsrKQorCQkJCSooKCh1MzIgKilwYWdlX21haW5fc3BhcmUpICsgaSkgPQorCQkJCQlpb3JlYWQzMihGbGFzaE1lbSArIDB4MTApOworCisJCQlpZiAoZW5hYmxlX2VjYykgeworCQkJCWZvciAoaSA9IFBhZ2VEYXRhU2l6ZTsgIGkgPCBQYWdlU2l6ZSAtCisJCQkJCQkJc3BhcmVTa2lwQnl0ZXM7IGkrKykKKwkJCQkJcGFnZV9tYWluX3NwYXJlW2ldID0gcGFnZV9tYWluX3NwYXJlW2kgKworCQkJCQkJCQlzcGFyZVNraXBCeXRlc107CisKKwkJCQlmb3IgKGogPSAwOworCQkJCWogPCBEZXZpY2VJbmZvLndQYWdlRGF0YVNpemUgLyBlY2NTZWN0b3JTaXplOworCQkJCWorKykgeworCisJCQkJCWZvciAoaSA9IDA7IGkgPCBlY2NTZWN0b3JTaXplOyBpKyspCisJCQkJCQlyZWFkX2RhdGFfbFtlY2NTZWN0b3JTaXplICogaiArCisJCQkJCQkJICAgIGldID0KKwkJCQkJCSAgICBwYWdlX21haW5fc3BhcmVbCisJCQkJCQkJKGVjY1NlY3RvclNpemUgKworCQkJCQkJCWVjY0J5dGVzKSAqIGogKyBpXTsKKworCQkJCQlmb3IgKGkgPSAwOyBpIDwgZWNjQnl0ZXM7IGkrKykKKwkJCQkJCXJlYWRfZGF0YV9sW1BhZ2VEYXRhU2l6ZSArCisJCQkJCQkJICAgIHNwYXJlRmxhZ0J5dGVzICsKKwkJCQkJCQkgICAgZWNjQnl0ZXMgKiBqICsgaV0gPQorCQkJCQkJICAgIHBhZ2VfbWFpbl9zcGFyZVsKKwkJCQkJCQkoZWNjU2VjdG9yU2l6ZSArCisJCQkJCQkJZWNjQnl0ZXMpICogaiArCisJCQkJCQkJZWNjU2VjdG9yU2l6ZSArIGldOworCQkJCX0KKworCQkJCWZvciAoaSA9IDA7IGkgPCBzcGFyZUZsYWdCeXRlczsgaSsrKQorCQkJCQlyZWFkX2RhdGFfbFtQYWdlRGF0YVNpemUgKyBpXSA9CisJCQkJCSAgICBwYWdlX21haW5fc3BhcmVbKGVjY1NlY3RvclNpemUgKworCQkJCQkJCSAgICAgZWNjQnl0ZXMpICogaiArIGldOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKFBhZ2VEYXRhU2l6ZSArIFBhZ2VTcGFyZVNpemUpOworCQkJCSAgICAgaSsrKQorCQkJCQlyZWFkX2RhdGFfbFtpXSA9IHBhZ2VfbWFpbl9zcGFyZVtpXTsKKworCQkJfQorCisJCQlpZiAoZW5hYmxlX2VjYykgeworCQkJCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJKElOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUgfAorCQkJCQlJTlRSX1NUQVRVUzBfX0VDQ19FUlIpKSkKKwkJCQkJOworCisJCQkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJSU5UUl9TVEFUVVMwX19FQ0NfRVJSKSB7CisJCQkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0VDQ19FUlIsCisJCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCQkJc3RhdHVzID0gZG9fZWNjX25ldyhmbGFzaF9iYW5rLAorCQkJCQkJcmVhZF9kYXRhLCBibG9jaywgcGFnZSk7CisJCQkJfQorCisJCQkJaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJSU5UUl9TVEFUVVMwX19FQ0NfVFJBTlNBQ1RJT05fRE9ORSAmCisJCQkJCUlOVFJfU1RBVFVTMF9fRUNDX0VSUikgeworCQkJCQlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19FQ0NfRVJSIHwKKwkJCQkJSU5UUl9TVEFUVVMwX19FQ0NfVFJBTlNBQ1RJT05fRE9ORSwKKwkJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJCQkJfSBlbHNlIGlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJCUlOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUpIHsKKwkJCQkJaW93cml0ZTMyKAorCQkJCQlJTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FLAorCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCQl9IGVsc2UgaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQkJSU5UUl9TVEFUVVMwX19FQ0NfRVJSKSB7CisJCQkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0VDQ19FUlIsCisJCQkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCQl9CisJCQl9CisKKwkJCXBhZ2UrKzsKKwkJCXBhZ2VfY291bnQtLTsKKwkJCXJlYWRfZGF0YV9sICs9IFBhZ2VTaXplOworCQl9CisJfQorCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8IChmbGFzaF9iYW5rIDw8IDI0KSB8CisJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksIDB4NDIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordTE2IE5BTkRfUGlwZWxpbmVfV3JpdGVfQWhlYWQodTggKndyaXRlX2RhdGEsIHUzMiBibG9jaywKKwkJCXUxNiBwYWdlLCB1MTYgcGFnZV9jb3VudCkKK3sKKwl1MTYgc3RhdHVzID0gUEFTUzsKKwl1MzIgTnVtUGFnZXMgPSBwYWdlX2NvdW50OworCXU2NCBmbGFzaF9hZGQ7CisJdTMyIGZsYXNoX2Jhbms7CisJdTMyIGludHJfc3RhdHVzID0gMDsKKwl1MzIgaW50cl9zdGF0dXNfYWRkcmVzc2VzWzRdID0ge0lOVFJfU1RBVFVTMCwKKwkJSU5UUl9TVEFUVVMxLCBJTlRSX1NUQVRVUzIsIElOVFJfU1RBVFVTM307CisJaW50IHJldDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJc3RhdHVzID0gQm91bmRhcnlfQ2hlY2tfQmxvY2tfUGFnZShibG9jaywgcGFnZSwgcGFnZV9jb3VudCk7CisKKwlpZiAocGFnZV9jb3VudCA8IDIpCisJCXN0YXR1cyA9IEZBSUw7CisKKwlpZiAoc3RhdHVzICE9IFBBU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlmbGFzaF9hZGQgPSAodTY0KShibG9jayAlIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKSkKKwkJKiBEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplICsKKwkJKHU2NClwYWdlICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJZmxhc2hfYmFuayA9IGJsb2NrIC8gKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpOworCisJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1c19hZGRyZXNzZXNbZmxhc2hfYmFua107CisJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCXdoaWxlICghKGlvcmVhZDMyKEZsYXNoUmVnICsgRE1BX0VOQUJMRSkgJiBETUFfRU5BQkxFX19GTEFHKSkKKwkJOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFJBTlNGRVJfU1BBUkVfUkVHKTsKKworCS8qIEZpbGwgdGhlIG1yc3RfbmFuZF9pbmZvIHN0cnVjdHVyZSAqLworCWluZm8uc3RhdGUgPSBJTlRfUElQRUxJTkVfV1JJVEVfQUhFQUQ7CisJaW5mby53cml0ZV9kYXRhID0gd3JpdGVfZGF0YTsKKwlpbmZvLmZsYXNoX2JhbmsgPSBmbGFzaF9iYW5rOworCWluZm8uYmxvY2sgPSBibG9jazsKKwlpbmZvLnBhZ2UgPSBwYWdlOworCWluZm8ucmV0ID0gUEFTUzsKKworCWluZGV4X2FkZHIoKHUzMikoTU9ERV8xMCB8IChmbGFzaF9iYW5rIDw8IDI0KSB8CisJCShmbGFzaF9hZGQgPj4gRGV2aWNlSW5mby5uQml0c0luUGFnZURhdGFTaXplKSksIDB4NDIpOworCisJZGRtYV90cmFucyh3cml0ZV9kYXRhLCBmbGFzaF9hZGQsIGZsYXNoX2JhbmssIDEsIE51bVBhZ2VzKTsKKworCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIEdMT0JBTF9JTlRfRU5BQkxFKTsgLyogRW5hYmxlIGludGVycnVwdCAqLworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLmNvbXBsZXRlLCAxMCAqIEhaKTsKKwlpZiAoIXJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIldhaXQgZm9yIGNvbXBsZXRpb24gdGltZW91dCAiCisJCQkiaW4gJXMsIExpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXN0YXR1cyA9IEVSUjsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBpbmZvLnJldDsKKwl9CisKKwlpb3dyaXRlMzIoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyksIEZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCisJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJd2hpbGUgKChpb3JlYWQzMihGbGFzaFJlZyArIERNQV9FTkFCTEUpICYgRE1BX0VOQUJMRV9fRkxBRykpCisJCTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFVuLXRlc3RlZCBmdW5jdGlvbiAqLwordTE2IE5BTkRfTXVsdGlwbGFuZV9Xcml0ZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCSAgICAgdTE2IHBhZ2VfY291bnQpCit7CisJdTE2IHN0YXR1cyA9IFBBU1M7CisJdTMyIE51bVBhZ2VzID0gcGFnZV9jb3VudDsKKwl1NjQgZmxhc2hfYWRkOworCXUzMiBmbGFzaF9iYW5rOworCXUzMiBpbnRyX3N0YXR1cyA9IDA7CisJdTMyIGludHJfc3RhdHVzX2FkZHJlc3Nlc1s0XSA9IHtJTlRSX1NUQVRVUzAsCisJCUlOVFJfU1RBVFVTMSwgSU5UUl9TVEFUVVMyLCBJTlRSX1NUQVRVUzN9OworCXUxNiBzdGF0dXMyID0gUEFTUzsKKwl1MzIgdDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlzdGF0dXMgPSBCb3VuZGFyeV9DaGVja19CbG9ja19QYWdlKGJsb2NrLCBwYWdlLCBwYWdlX2NvdW50KTsKKwlpZiAoc3RhdHVzICE9IFBBU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlmbGFzaF9hZGQgPSAodTY0KShibG9jayAlIChEZXZpY2VJbmZvLndUb3RhbEJsb2NrcyAvIHRvdGFsVXNlZEJhbmtzKSkKKwkJKiBEZXZpY2VJbmZvLndCbG9ja0RhdGFTaXplICsKKwkJKHU2NClwYWdlICogRGV2aWNlSW5mby53UGFnZURhdGFTaXplOworCisJZmxhc2hfYmFuayA9IGJsb2NrIC8gKERldmljZUluZm8ud1RvdGFsQmxvY2tzIC8gdG90YWxVc2VkQmFua3MpOworCisJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1c19hZGRyZXNzZXNbZmxhc2hfYmFua107CisJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIFRSQU5TRkVSX1NQQVJFX1JFRyk7CisJaW93cml0ZTMyKDB4MDEsIEZsYXNoUmVnICsgTVVMVElQTEFORV9PUEVSQVRJT04pOworCisJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgRE1BX0VOQUJMRSk7CisJd2hpbGUgKCEoaW9yZWFkMzIoRmxhc2hSZWcgKyBETUFfRU5BQkxFKSAmIERNQV9FTkFCTEVfX0ZMQUcpKQorCQk7CisKKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUUkFOU0ZFUl9TUEFSRV9SRUcpOworCisJaW5kZXhfYWRkcigodTMyKShNT0RFXzEwIHwgKGZsYXNoX2JhbmsgPDwgMjQpIHwKKwkJKGZsYXNoX2FkZCA+PiBEZXZpY2VJbmZvLm5CaXRzSW5QYWdlRGF0YVNpemUpKSwgMHg0Mik7CisKKwlkZG1hX3RyYW5zKHdyaXRlX2RhdGEsIGZsYXNoX2FkZCwgZmxhc2hfYmFuaywgMSwgTnVtUGFnZXMpOworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKCFpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSkKKwkJCTsKKworCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApIHsKKwkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCwKKwkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCXN0YXR1cyA9IFBBU1M7CisJCQlpZiAoc3RhdHVzMiA9PSBGQUlMKQorCQkJCXN0YXR1cyA9IEZBSUw7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwpIHsKKwkJCXN0YXR1czIgPSBGQUlMOworCQkJc3RhdHVzID0gRkFJTDsKKwkJCXQgPSBpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUw7CisJCQlpb3dyaXRlMzIodCwgRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlpb3dyaXRlMzIoKH5JTlRSX1NUQVRVUzBfX1BST0dSQU1fRkFJTCkgJgorCQkJCSh+SU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApLAorCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCQl9CisJfQorCisJaW93cml0ZTMyKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpLCBGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKworCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIERNQV9FTkFCTEUpOworCisJd2hpbGUgKChpb3JlYWQzMihGbGFzaFJlZyArIERNQV9FTkFCTEUpICYgRE1BX0VOQUJMRV9fRkxBRykpCisJCTsKKworCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIE1VTFRJUExBTkVfT1BFUkFUSU9OKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworI2lmIENNRF9ETUEKK3N0YXRpYyBpcnFyZXR1cm5fdCBjZG1hX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1yc3RfbmFuZF9pbmZvICpkZXYgPSBkZXZfaWQ7CisJaW50IGZpcnN0X2ZhaWxlZF9jbWQ7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworCWlmICghaXNfY2RtYV9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogRGlzYWJsZSBjb250cm9sbGVyIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBHTE9CQUxfSU5UX0VOQUJMRSk7CisJR0xPQl9GVExfRXZlbnRfU3RhdHVzKCZmaXJzdF9mYWlsZWRfY21kKTsKKwljb21wbGV0ZSgmZGV2LT5jb21wbGV0ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaGFuZGxlX25hbmRfaW50X3JlYWQoc3RydWN0IG1yc3RfbmFuZF9pbmZvICpkZXYpCit7CisJdTMyIGludHJfc3RhdHVzX2FkZHJlc3Nlc1s0XSA9IHtJTlRSX1NUQVRVUzAsCisJCUlOVFJfU1RBVFVTMSwgSU5UUl9TVEFUVVMyLCBJTlRSX1NUQVRVUzN9OworCXUzMiBpbnRyX3N0YXR1czsKKwl1MzIgZWNjX2RvbmVfT1JfZG1hX2NvbXAgPSAwOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlkZXYtPnJldCA9IFBBU1M7CisJaW50cl9zdGF0dXMgPSBpbnRyX3N0YXR1c19hZGRyZXNzZXNbZGV2LT5mbGFzaF9iYW5rXTsKKworCXdoaWxlICgxKSB7CisJCWlmIChlbmFibGVfZWNjKSB7CisJCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJCUlOVFJfU1RBVFVTMF9fRUNDX0VSUikgeworCQkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0VDQ19FUlIsCisJCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCQkJCWRldi0+cmV0ID0gZG9fZWNjX25ldyhkZXYtPmZsYXNoX2JhbmssCisJCQkJCQlkZXYtPnJlYWRfZGF0YSwKKwkJCQkJCWRldi0+YmxvY2ssIGRldi0+cGFnZSk7CisJCQl9IGVsc2UgaWYgKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50cl9zdGF0dXMpICYKKwkJCQlJTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCkgeworCQkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCwKKwkJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJCQkJaWYgKDEgPT0gZWNjX2RvbmVfT1JfZG1hX2NvbXApCisJCQkJCWJyZWFrOworCQkJCWVjY19kb25lX09SX2RtYV9jb21wID0gMTsKKwkJCX0gZWxzZSBpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJCUlOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUpIHsKKwkJCQlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19FQ0NfVFJBTlNBQ1RJT05fRE9ORSwKKwkJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJCQkJaWYgKDEgPT0gZWNjX2RvbmVfT1JfZG1hX2NvbXApCisJCQkJCWJyZWFrOworCQkJCWVjY19kb25lX09SX2RtYV9jb21wID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQkJSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApIHsKKwkJCQlpb3dyaXRlMzIoSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVAsCisJCQkJCUZsYXNoUmVnICsgaW50cl9zdGF0dXMpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklsbGVnYWwgSU5UUyAiCisJCQkJCSIob2Zmc2V0IGFkZHIgMHgleCkgdmFsdWU6IDB4JXhcbiIsCisJCQkJCWludHJfc3RhdHVzLAorCQkJCQlpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSk7CisJCQl9CisJCX0KKworCQlpb3dyaXRlMzIoKH5JTlRSX1NUQVRVUzBfX0VDQ19FUlIpICYKKwkJKH5JTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FKSAmCisJCSh+SU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApLAorCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9uYW5kX2ludF93cml0ZShzdHJ1Y3QgbXJzdF9uYW5kX2luZm8gKmRldikKK3sKKwl1MzIgaW50cl9zdGF0dXM7CisJdTMyIGludHJbNF0gPSB7SU5UUl9TVEFUVVMwLCBJTlRSX1NUQVRVUzEsCisJCUlOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKwlpbnQgc3RhdHVzID0gUEFTUzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJZGV2LT5yZXQgPSBQQVNTOworCWludHJfc3RhdHVzID0gaW50cltkZXYtPmZsYXNoX2JhbmtdOworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKCFpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSkKKwkJCTsKKworCQlpZiAoaW9yZWFkMzIoRmxhc2hSZWcgKyBpbnRyX3N0YXR1cykgJgorCQkJSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVApIHsKKwkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCwKKwkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJCWlmIChGQUlMID09IHN0YXR1cykKKwkJCQlkZXYtPnJldCA9IEZBSUw7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpb3JlYWQzMihGbGFzaFJlZyArIGludHJfc3RhdHVzKSAmCisJCQlJTlRSX1NUQVRVUzBfX1BST0dSQU1fRkFJTCkgeworCQkJc3RhdHVzID0gRkFJTDsKKwkJCWlvd3JpdGUzMihJTlRSX1NUQVRVUzBfX1BST0dSQU1fRkFJTCwKKwkJCQlGbGFzaFJlZyArIGludHJfc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCWlvd3JpdGUzMigofklOVFJfU1RBVFVTMF9fUFJPR1JBTV9GQUlMKSAmCisJCQkJKH5JTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUCksCisJCQkJRmxhc2hSZWcgKyBpbnRyX3N0YXR1cyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkZG1hX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1yc3RfbmFuZF9pbmZvICpkZXYgPSBkZXZfaWQ7CisJdTMyIGludF9tYXNrLCBpbnRzMCwgaW50czEsIGludHMyLCBpbnRzMywgaW50c19vZmZzZXQ7CisJdTMyIGludHJbNF0gPSB7SU5UUl9TVEFUVVMwLCBJTlRSX1NUQVRVUzEsCisJCUlOVFJfU1RBVFVTMiwgSU5UUl9TVEFUVVMzfTsKKworCWludF9tYXNrID0gSU5UUl9TVEFUVVMwX19ETUFfQ01EX0NPTVAgfAorCQlJTlRSX1NUQVRVUzBfX0VDQ19UUkFOU0FDVElPTl9ET05FIHwKKwkJSU5UUl9TVEFUVVMwX19FQ0NfRVJSIHwKKwkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwgfAorCQlJTlRSX1NUQVRVUzBfX0VSQVNFX0ZBSUw7CisKKwlpbnRzMCA9IGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMwKTsKKwlpbnRzMSA9IGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMxKTsKKwlpbnRzMiA9IGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMyKTsKKwlpbnRzMyA9IGlvcmVhZDMyKEZsYXNoUmVnICsgSU5UUl9TVEFUVVMzKTsKKworCWludHNfb2Zmc2V0ID0gaW50cltkZXYtPmZsYXNoX2JhbmtdOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCisJCSJJTlRSMDogMHgleCwgSU5UUjE6IDB4JXgsIElOVFIyOiAweCV4LCBJTlRSMzogMHgleCwgIgorCQkiRE1BX0lOVFI6IDB4JXgsICIKKwkJImRldi0+c3RhdGU6IDB4JXgsIGRldi0+Zmxhc2hfYmFuazogJWRcbiIsCisJCWludHMwLCBpbnRzMSwgaW50czIsIGludHMzLAorCQlpb3JlYWQzMihGbGFzaFJlZyArIERNQV9JTlRSKSwKKwkJZGV2LT5zdGF0ZSwgZGV2LT5mbGFzaF9iYW5rKTsKKworCWlmICghKGlvcmVhZDMyKEZsYXNoUmVnICsgaW50c19vZmZzZXQpICYgaW50X21hc2spKSB7CisJCWlvd3JpdGUzMihpbnRzMCwgRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzApOworCQlpb3dyaXRlMzIoaW50czEsIEZsYXNoUmVnICsgSU5UUl9TVEFUVVMxKTsKKwkJaW93cml0ZTMyKGludHMyLCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMik7CisJCWlvd3JpdGUzMihpbnRzMywgRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzMpOworCQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkJImRkbWFfaXNyOiBJbnZhbGlkIGludGVycnVwdCBmb3IgTkFORCBjb250cm9sbGVyLiAiCisJCQkiSWdub3JlIGl0XG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXN3aXRjaCAoZGV2LT5zdGF0ZSkgeworCWNhc2UgSU5UX1JFQURfUEFHRV9NQUlOOgorCWNhc2UgSU5UX1BJUEVMSU5FX1JFQURfQUhFQUQ6CisJCS8qIERpc2FibGUgY29udHJvbGxlciBpbnRlcnJ1cHRzICovCisJCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIEdMT0JBTF9JTlRfRU5BQkxFKTsKKwkJaGFuZGxlX25hbmRfaW50X3JlYWQoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBJTlRfV1JJVEVfUEFHRV9NQUlOOgorCWNhc2UgSU5UX1BJUEVMSU5FX1dSSVRFX0FIRUFEOgorCQlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBHTE9CQUxfSU5UX0VOQUJMRSk7CisJCWhhbmRsZV9uYW5kX2ludF93cml0ZShkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImRkbWFfaXNyIC0gSWxsZWdhbCBzdGF0ZTogMHgleFxuIiwKKwkJCWRldi0+c3RhdGUpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZGV2LT5zdGF0ZSA9IElOVF9JRExFX1NUQVRFOworCWNvbXBsZXRlKCZkZXYtPmNvbXBsZXRlKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5hbmRfcGNpX2lkc1tdID0geworCXsKKwkgLnZlbmRvciA9IDB4ODA4NiwKKwkgLmRldmljZSA9IDB4MDgwOSwKKwkgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCSB9LAorCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KK307CisKK3N0YXRpYyBpbnQgbmFuZF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQgPSAtRU5PREVWOworCXVuc2lnbmVkIGxvbmcgY3NyX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBjc3JfbGVuOworCXN0cnVjdCBtcnN0X25hbmRfaW5mbyAqcG5kZXYgPSAmaW5mbzsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihkZXYpOworCXBuZGV2LT5kZXYgPSBkZXY7CisKKwljc3JfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCWlmICghY3NyX2Jhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfcmVzb3VyY2Vfc3RhcnQgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNzcl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCk7CisJaWYgKCFjc3JfbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX2xlbiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhkZXYsIFNQRUNUUkFfTkFORF9OQU1FKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIHJlcXVlc3QgIgorCQkgICAgICAgIm1lbW9yeSByZWdpb25cbiIpOworCQlnb3RvIGZhaWxlZF9yZXFfY3NyOworCX0KKworCXBuZGV2LT5pb2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY3NyX2Jhc2UsIGNzcl9sZW4pOworCWlmICghcG5kZXYtPmlvYWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmE6IENTUiAweCUwOGx4IC0+IDB4JXAgKDB4JWx4KVxuIiwKKwkJICAgICAgIGNzcl9iYXNlLCBwbmRldi0+aW9hZGRyLCBjc3JfbGVuKTsKKworCWluaXRfY29tcGxldGlvbigmcG5kZXYtPmNvbXBsZXRlKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmE6IElSUSAlZFxuIiwgZGV2LT5pcnEpOworCisjaWYgQ01EX0RNQQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgY2RtYV9pc3IsIElSUUZfU0hBUkVELAorCQkJU1BFQ1RSQV9OQU5EX05BTUUsICZpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorI2Vsc2UKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRkbWFfaXNyLCBJUlFGX1NIQVJFRCwKKwkJCVNQRUNUUkFfTkFORF9OQU1FLCAmaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKyNlbmRpZgorCisJcGNpX3NldF9kcnZkYXRhKGRldiwgcG5kZXYpOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9yZW1hcF9jc3I6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworZmFpbGVkX3JlcV9jc3I6CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuYW5kX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbXJzdF9uYW5kX2luZm8gKnBuZGV2ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisjaWYgQ01EX0RNQQorCWZyZWVfaXJxKGRldi0+aXJxLCBwbmRldik7CisjZW5kaWYKKwlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5hbmRfcGNpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuYW5kX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBTUEVDVFJBX05BTkRfTkFNRSwKKwkuaWRfdGFibGUgPSBuYW5kX3BjaV9pZHMsCisJLnByb2JlID0gbmFuZF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IG5hbmRfcGNpX3JlbW92ZSwKK307CisKK2ludCBOQU5EX0ZsYXNoX0luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCXUzMiBpbnRfbWFzazsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisJRmxhc2hSZWcgPSBpb3JlbWFwX25vY2FjaGUoR0xPQl9IV0NUTF9SRUdfQkFTRSwKKwkJCUdMT0JfSFdDVExfUkVHX1NJWkUpOworCWlmICghRmxhc2hSZWcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBpb3JlbWFwX25vY2FjaGUgZmFpbGVkISIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwKKwkJIlNwZWN0cmE6IFJlbWFwcGVkIHJlZyBiYXNlIGFkZHJlc3M6ICIKKwkJIjB4JXAsIGxlbjogJWRcbiIsCisJCUZsYXNoUmVnLCBHTE9CX0hXQ1RMX1JFR19TSVpFKTsKKworCUZsYXNoTWVtID0gaW9yZW1hcF9ub2NhY2hlKEdMT0JfSFdDVExfTUVNX0JBU0UsCisJCQlHTE9CX0hXQ1RMX01FTV9TSVpFKTsKKwlpZiAoIUZsYXNoTWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogaW9yZW1hcF9ub2NhY2hlIGZhaWxlZCEiKTsKKwkJaW91bm1hcChGbGFzaFJlZyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLAorCQkiU3BlY3RyYTogUmVtYXBwZWQgZmxhc2ggYmFzZSBhZGRyZXNzOiAiCisJCSIweCVwLCBsZW46ICVkXG4iLAorCQkodm9pZCAqKUZsYXNoTWVtLCBHTE9CX0hXQ1RMX01FTV9TSVpFKTsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiRHVtcCB0aW1pbmcgcmVnaXN0ZXIgdmFsdWVzOiIKKwkJCSJhY2NfY2xrczogJWQsIHJlXzJfd2U6ICVkLCB3ZV8yX3JlOiAlZCwiCisJCQkiYWRkcl8yX2RhdGE6ICVkLCByZHdyX2VuX2xvX2NudDogJWQsICIKKwkJCSJyZHdyX2VuX2hpX2NudDogJWQsIGNzX3NldHVwX2NudDogJWRcbiIsCisJCQlpb3JlYWQzMihGbGFzaFJlZyArIEFDQ19DTEtTKSwKKwkJCWlvcmVhZDMyKEZsYXNoUmVnICsgUkVfMl9XRSksCisJCQlpb3JlYWQzMihGbGFzaFJlZyArIFdFXzJfUkUpLAorCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBBRERSXzJfREFUQSksCisJCQlpb3JlYWQzMihGbGFzaFJlZyArIFJEV1JfRU5fTE9fQ05UKSwKKwkJCWlvcmVhZDMyKEZsYXNoUmVnICsgUkRXUl9FTl9ISV9DTlQpLAorCQkJaW9yZWFkMzIoRmxhc2hSZWcgKyBDU19TRVRVUF9DTlQpKTsKKworCU5BTkRfRmxhc2hfUmVzZXQoKTsKKworCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIEdMT0JBTF9JTlRfRU5BQkxFKTsKKworI2lmIENNRF9ETUEKKwlpbmZvLnBjbWRzX251bSA9IDA7CisJaW5mby5mbGFzaF9iYW5rID0gMDsKKwlpbmZvLmNkbWFfbnVtID0gMDsKKwlpbnRfbWFzayA9IChETUFfSU5UUl9fREVTQ19DT01QX0NIQU5ORUwwIHwKKwkJRE1BX0lOVFJfX0RFU0NfQ09NUF9DSEFOTkVMMSB8CisJCURNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDIgfAorCQlETUFfSU5UUl9fREVTQ19DT01QX0NIQU5ORUwzIHwKKwkJRE1BX0lOVFJfX01FTUNPUFlfREVTQ19DT01QKTsKKwlpb3dyaXRlMzIoaW50X21hc2ssIEZsYXNoUmVnICsgRE1BX0lOVFJfRU4pOworCWlvd3JpdGUzMigweEZGRkYsIEZsYXNoUmVnICsgRE1BX0lOVFIpOworCisJaW50X21hc2sgPSAoSU5UUl9TVEFUVVMwX19FQ0NfRVJSIHwKKwkJSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwgfAorCQlJTlRSX1NUQVRVUzBfX0VSQVNFX0ZBSUwpOworI2Vsc2UKKwlpbnRfbWFzayA9IElOVFJfU1RBVFVTMF9fRE1BX0NNRF9DT01QIHwKKwkJSU5UUl9TVEFUVVMwX19FQ0NfVFJBTlNBQ1RJT05fRE9ORSB8CisJCUlOVFJfU1RBVFVTMF9fRUNDX0VSUiB8CisJCUlOVFJfU1RBVFVTMF9fUFJPR1JBTV9GQUlMIHwKKwkJSU5UUl9TVEFUVVMwX19FUkFTRV9GQUlMOworI2VuZGlmCisJaW93cml0ZTMyKGludF9tYXNrLCBGbGFzaFJlZyArIElOVFJfRU4wKTsKKwlpb3dyaXRlMzIoaW50X21hc2ssIEZsYXNoUmVnICsgSU5UUl9FTjEpOworCWlvd3JpdGUzMihpbnRfbWFzaywgRmxhc2hSZWcgKyBJTlRSX0VOMik7CisJaW93cml0ZTMyKGludF9tYXNrLCBGbGFzaFJlZyArIElOVFJfRU4zKTsKKworCS8qIENsZWFyIGFsbCBzdGF0dXMgYml0cyAqLworCWlvd3JpdGUzMigweEZGRkYsIEZsYXNoUmVnICsgSU5UUl9TVEFUVVMwKTsKKwlpb3dyaXRlMzIoMHhGRkZGLCBGbGFzaFJlZyArIElOVFJfU1RBVFVTMSk7CisJaW93cml0ZTMyKDB4RkZGRiwgRmxhc2hSZWcgKyBJTlRSX1NUQVRVUzIpOworCWlvd3JpdGUzMigweEZGRkYsIEZsYXNoUmVnICsgSU5UUl9TVEFUVVMzKTsKKworCWlvd3JpdGUzMigweDBGLCBGbGFzaFJlZyArIFJCX1BJTl9FTkFCTEVEKTsKKwlpb3dyaXRlMzIoQ0hJUF9FTl9ET05UX0NBUkVfX0ZMQUcsIEZsYXNoUmVnICsgQ0hJUF9FTkFCTEVfRE9OVF9DQVJFKTsKKworCS8qIFNob3VsZCBzZXQgdmFsdWUgZm9yIHRoZXNlIHJlZ2lzdGVycyB3aGVuIGluaXQgKi8KKwlpb3dyaXRlMzIoMCwgRmxhc2hSZWcgKyBUV09fUk9XX0FERFJfQ1lDTEVTKTsKKwlpb3dyaXRlMzIoMSwgRmxhc2hSZWcgKyBFQ0NfRU5BQkxFKTsKKwllbmFibGVfZWNjID0gMTsKKworCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5hbmRfcGNpX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gUEFTUzsKK30KKworLyogRnJlZSBtZW1vcnkgKi8KK2ludCBuYW5kX3JlbGVhc2Vfc3BlY3RyYSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbmFuZF9wY2lfZHJpdmVyKTsKKwlpb3VubWFwKEZsYXNoTWVtKTsKKwlpb3VubWFwKEZsYXNoUmVnKTsKKworCXJldHVybiAwOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX25hbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4Mzg4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBOQU5EIEZsYXNoIENvbnRyb2xsZXIgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1cHBsaWVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9MTERfTkFORF8KKyNkZWZpbmUgX0xMRF9OQU5EXworCisjaWZkZWYgRUxET1JBCisjaW5jbHVkZSAiZGVmcy5oIgorI2Vsc2UKKyNpbmNsdWRlICJmbGFzaC5oIgorI2luY2x1ZGUgImZmc3BvcnQuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1PREVfMDAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNT0RFXzAxICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgTU9ERV8xMCAgICAweDA4MDAwMDAwCisjZGVmaW5lIE1PREVfMTEgICAgMHgwQzAwMDAwMAorCisKKyNkZWZpbmUgREFUQV9UUkFOU0ZFUl9NT0RFICAgICAgICAgICAgICAwCisjZGVmaW5lIFBST1RFQ1RJT05fUEVSX0JMT0NLICAgICAgICAgICAgMQorI2RlZmluZSBMT0FEX1dBSVRfQ09VTlQgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUFJPR1JBTV9XQUlUX0NPVU5UICAgICAgICAgICAgICAzCisjZGVmaW5lIEVSQVNFX1dBSVRfQ09VTlQgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJTlRfTU9OSVRPUl9DWUNMRV9DT1VOVCAgICAgICAgIDUKKyNkZWZpbmUgUkVBRF9CVVNZX1BJTl9FTkFCTEVEICAgICAgICAgICA2CisjZGVmaW5lIE1VTFRJUExBTkVfT1BFUkFUSU9OX1NVUFBPUlQgICAgNworI2RlZmluZSBQUkVfRkVUQ0hfTU9ERSAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQ0VfRE9OVF9DQVJFX1NVUFBPUlQgICAgICAgICAgICA5CisjZGVmaW5lIENPUFlCQUNLX1NVUFBPUlQgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQ0FDSEVfV1JJVEVfU1VQUE9SVCAgICAgICAgICAgICAxMQorI2RlZmluZSBDQUNIRV9SRUFEX1NVUFBPUlQgICAgICAgICAgICAgIDEyCisjZGVmaW5lIE5VTV9QQUdFU19JTl9CTE9DSyAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgRUNDX0VOQUJMRV9TRUxFQ1QgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXUklURV9FTkFCTEVfMl9SRUFEX0VOQUJMRSAgICAgIDE1CisjZGVmaW5lIEFERFJFU1NfMl9EQVRBICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkVBRF9FTkFCTEVfMl9XUklURV9FTkFCTEUgICAgICAxNworI2RlZmluZSBUV09fUk9XX0FERFJFU1NfQ1lDTEVTICAgICAgICAgIDE4CisjZGVmaW5lIE1VTFRJUExBTkVfQUREUkVTU19SRVNUUklDVCAgICAgMTkKKyNkZWZpbmUgQUNDX0NMT0NLUyAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBSRUFEX1dSSVRFX0VOQUJMRV9MT1dfQ09VTlQgICAgIDIxCisjZGVmaW5lIFJFQURfV1JJVEVfRU5BQkxFX0hJR0hfQ09VTlQgICAgMjIKKworI2RlZmluZSBFQ0NfU0VDVE9SX1NJWkUgICAgIDUxMgorI2RlZmluZSBMTERfTUFYX0ZMQVNIX0JBTktTICAgICA0CisKK3N0cnVjdCBtcnN0X25hbmRfaW5mbyB7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwl1MzIgc3RhdGU7CisJdTMyIGZsYXNoX2Jhbms7CisJdTggKnJlYWRfZGF0YTsKKwl1OCAqd3JpdGVfZGF0YTsKKwl1MzIgYmxvY2s7CisJdTE2IHBhZ2U7CisJdTMyIHVzZV9kbWE7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7ICAvKiBNYXBwZWQgaW8gcmVnIGJhc2UgYWRkcmVzcyAqLworCWludCByZXQ7CisJdTMyIHBjbWRzX251bTsKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKnBjbWRzOworCWludCBjZG1hX251bTsgICAgICAgICAgIC8qIENETUEgZGVzY3JpcHRvciBudW1iZXIgaW4gdGhpcyBjaGFuICovCisJdTggKmNkbWFfZGVzY19idWY7CS8qIENETUEgZGVzY3JpcHRvciB0YWJsZSAqLworCXU4ICptZW1jcF9kZXNjX2J1ZjsJLyogTWVtb3J5IGNvcHkgZGVzY3JpcHRvciB0YWJsZSAqLworCWRtYV9hZGRyX3QgY2RtYV9kZXNjOwkvKiBNYXBwZWQgQ0RNQSBkZXNjcmlwdG9yIHRhYmxlICovCisJZG1hX2FkZHJfdCBtZW1jcF9kZXNjOwkvKiBNYXBwZWQgbWVtb3J5IGNvcHkgZGVzY3JpcHRvciB0YWJsZSAqLworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOworfTsKKworaW50IE5BTkRfRmxhc2hfSW5pdCh2b2lkKTsKK2ludCBuYW5kX3JlbGVhc2Vfc3BlY3RyYSh2b2lkKTsKK3UxNiAgTkFORF9GbGFzaF9SZXNldCh2b2lkKTsKK3UxNiAgTkFORF9SZWFkX0RldmljZV9JRCh2b2lkKTsKK3UxNiAgTkFORF9FcmFzZV9CbG9jayh1MzIgZmxhc2hfYWRkKTsKK3UxNiAgTkFORF9Xcml0ZV9QYWdlX01haW4odTggKndyaXRlX2RhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsCisJCQkJdTE2IHBhZ2VfY291bnQpOwordTE2ICBOQU5EX1JlYWRfUGFnZV9NYWluKHU4ICpyZWFkX2RhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsCisJCQkJdTE2IHBhZ2VfY291bnQpOwordTE2ICBOQU5EX1VubG9ja0FycmF5QWxsKHZvaWQpOwordTE2ICBOQU5EX1dyaXRlX1BhZ2VfTWFpbl9TcGFyZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLAorCQkJCXUxNiBwYWdlLCB1MTYgcGFnZV9jb3VudCk7Cit1MTYgIE5BTkRfV3JpdGVfUGFnZV9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBwYWdlLAorCQkJCXUxNiBwYWdlX2NvdW50KTsKK3UxNiAgTkFORF9SZWFkX1BhZ2VfTWFpbl9TcGFyZSh1OCAqcmVhZF9kYXRhLCB1MzIgYmxvY2ssIHUxNiBwYWdlLAorCQkJCXUxNiBwYWdlX2NvdW50KTsKK3UxNiAgTkFORF9SZWFkX1BhZ2VfU3BhcmUodTggKnJlYWRfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCQl1MTYgcGFnZV9jb3VudCk7Cit2b2lkIE5BTkRfTExEX0VuYWJsZV9EaXNhYmxlX0ludGVycnVwdHModTE2IElOVF9FTkFCTEUpOwordTE2ICBOQU5EX0dldF9CYWRfQmxvY2sodTMyIGJsb2NrKTsKK3UxNiAgTkFORF9QaXBlbGluZV9SZWFkX0FoZWFkKHU4ICpyZWFkX2RhdGEsIHUzMiBibG9jaywgdTE2IHBhZ2UsCisJCQkJdTE2IHBhZ2VfY291bnQpOwordTE2ICBOQU5EX1BpcGVsaW5lX1dyaXRlX0FoZWFkKHU4ICp3cml0ZV9kYXRhLCB1MzIgYmxvY2ssCisJCQkJdTE2IHBhZ2UsIHUxNiBwYWdlX2NvdW50KTsKK3UxNiAgTkFORF9NdWx0aXBsYW5lX1JlYWQodTggKnJlYWRfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCQl1MTYgcGFnZV9jb3VudCk7Cit1MTYgIE5BTkRfTXVsdGlwbGFuZV9Xcml0ZSh1OCAqd3JpdGVfZGF0YSwgdTMyIGJsb2NrLCB1MTYgcGFnZSwKKwkJCQl1MTYgcGFnZV9jb3VudCk7Cit2b2lkIE5BTkRfRUNDX0N0cmwoaW50IGVuYWJsZSk7Cit1MTYgTkFORF9SZWFkX1BhZ2VfTWFpbl9Qb2xsaW5nKHU4ICpyZWFkX2RhdGEsCisJCXUzMiBibG9jaywgdTE2IHBhZ2UsIHUxNiBwYWdlX2NvdW50KTsKK3UxNiBOQU5EX1BpcGVsaW5lX1JlYWRfQWhlYWRfUG9sbGluZyh1OCAqcmVhZF9kYXRhLAorCQkJdTMyIGJsb2NrLCB1MTYgcGFnZSwgdTE2IHBhZ2VfY291bnQpOwordm9pZCBDb252X1NwYXJlX0RhdGFfTG9nMlBoeV9Gb3JtYXQodTggKmRhdGEpOwordm9pZCBDb252X1NwYXJlX0RhdGFfUGh5MkxvZ19Gb3JtYXQodTggKmRhdGEpOwordm9pZCBDb252X01haW5fU3BhcmVfRGF0YV9Mb2cyUGh5X0Zvcm1hdCh1OCAqZGF0YSwgdTE2IHBhZ2VfY291bnQpOwordm9pZCBDb252X01haW5fU3BhcmVfRGF0YV9QaHkyTG9nX0Zvcm1hdCh1OCAqZGF0YSwgdTE2IHBhZ2VfY291bnQpOworCitleHRlcm4gdm9pZCBfX2lvbWVtICpGbGFzaFJlZzsKK2V4dGVybiB2b2lkIF9faW9tZW0gKkZsYXNoTWVtOworCitleHRlcm4gaW50IHRvdGFsVXNlZEJhbmtzOworZXh0ZXJuIHUzMiBHTE9CX3ZhbGlkX2JhbmtzW0xMRF9NQVhfRkxBU0hfQkFOS1NdOworCisjZW5kaWYgLypfTExEX05BTkRfKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL25hbmRfcmVncy5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbmFuZF9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5MmU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL25hbmRfcmVncy5oCkBAIC0wLDAgKzEsNjE5IEBACisvKgorICogTkFORCBGbGFzaCBDb250cm9sbGVyIERldmljZSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24gYW5kIGl0cyBzdXBwbGllcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2RlZmluZSBERVZJQ0VfUkVTRVQJCQkJMHgwCisjZGVmaW5lICAgICBERVZJQ0VfUkVTRVRfX0JBTkswCQkJCTB4MDAwMQorI2RlZmluZSAgICAgREVWSUNFX1JFU0VUX19CQU5LMQkJCQkweDAwMDIKKyNkZWZpbmUgICAgIERFVklDRV9SRVNFVF9fQkFOSzIJCQkJMHgwMDA0CisjZGVmaW5lICAgICBERVZJQ0VfUkVTRVRfX0JBTkszCQkJCTB4MDAwOAorCisjZGVmaW5lIFRSQU5TRkVSX1NQQVJFX1JFRwkJCTB4MTAKKyNkZWZpbmUgICAgIFRSQU5TRkVSX1NQQVJFX1JFR19fRkxBRwkJCTB4MDAwMQorCisjZGVmaW5lIExPQURfV0FJVF9DTlQJCQkJMHgyMAorI2RlZmluZSAgICAgTE9BRF9XQUlUX0NOVF9fVkFMVUUJCQkJMHhmZmZmCisKKyNkZWZpbmUgUFJPR1JBTV9XQUlUX0NOVAkJCTB4MzAKKyNkZWZpbmUgICAgIFBST0dSQU1fV0FJVF9DTlRfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgRVJBU0VfV0FJVF9DTlQJCQkJMHg0MAorI2RlZmluZSAgICAgRVJBU0VfV0FJVF9DTlRfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgSU5UX01PTl9DWUNDTlQJCQkJMHg1MAorI2RlZmluZSAgICAgSU5UX01PTl9DWUNDTlRfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgUkJfUElOX0VOQUJMRUQJCQkJMHg2MAorI2RlZmluZSAgICAgUkJfUElOX0VOQUJMRURfX0JBTkswCQkJMHgwMDAxCisjZGVmaW5lICAgICBSQl9QSU5fRU5BQkxFRF9fQkFOSzEJCQkweDAwMDIKKyNkZWZpbmUgICAgIFJCX1BJTl9FTkFCTEVEX19CQU5LMgkJCTB4MDAwNAorI2RlZmluZSAgICAgUkJfUElOX0VOQUJMRURfX0JBTkszCQkJMHgwMDA4CisKKyNkZWZpbmUgTVVMVElQTEFORV9PUEVSQVRJT04JCQkweDcwCisjZGVmaW5lICAgICBNVUxUSVBMQU5FX09QRVJBVElPTl9fRkxBRwkJCTB4MDAwMQorCisjZGVmaW5lIE1VTFRJUExBTkVfUkVBRF9FTkFCTEUJCQkweDgwCisjZGVmaW5lICAgICBNVUxUSVBMQU5FX1JFQURfRU5BQkxFX19GTEFHCQkweDAwMDEKKworI2RlZmluZSBDT1BZQkFDS19ESVNBQkxFCQkJMHg5MAorI2RlZmluZSAgICAgQ09QWUJBQ0tfRElTQUJMRV9fRkxBRwkJCTB4MDAwMQorCisjZGVmaW5lIENBQ0hFX1dSSVRFX0VOQUJMRQkJCTB4YTAKKyNkZWZpbmUgICAgIENBQ0hFX1dSSVRFX0VOQUJMRV9fRkxBRwkJCTB4MDAwMQorCisjZGVmaW5lIENBQ0hFX1JFQURfRU5BQkxFCQkJMHhiMAorI2RlZmluZSAgICAgQ0FDSEVfUkVBRF9FTkFCTEVfX0ZMQUcJCQkweDAwMDEKKworI2RlZmluZSBQUkVGRVRDSF9NT0RFCQkJCTB4YzAKKyNkZWZpbmUgICAgIFBSRUZFVENIX01PREVfX1BSRUZFVENIX0VOCQkJMHgwMDAxCisjZGVmaW5lICAgICBQUkVGRVRDSF9NT0RFX19QUkVGRVRDSF9CVVJTVF9MRU5HVEgJMHhmZmYwCisKKyNkZWZpbmUgQ0hJUF9FTkFCTEVfRE9OVF9DQVJFCQkJMHhkMAorI2RlZmluZSAgICAgQ0hJUF9FTl9ET05UX0NBUkVfX0ZMQUcJCQkweDAxCisKKyNkZWZpbmUgRUNDX0VOQUJMRQkJCQkweGUwCisjZGVmaW5lICAgICBFQ0NfRU5BQkxFX19GTEFHCQkJCTB4MDAwMQorCisjZGVmaW5lIEdMT0JBTF9JTlRfRU5BQkxFCQkJMHhmMAorI2RlZmluZSAgICAgR0xPQkFMX0lOVF9FTl9GTEFHCQkJCTB4MDEKKworI2RlZmluZSBXRV8yX1JFCQkJCQkweDEwMAorI2RlZmluZSAgICAgV0VfMl9SRV9fVkFMVUUJCQkJMHgwMDNmCisKKyNkZWZpbmUgQUREUl8yX0RBVEEJCQkJMHgxMTAKKyNkZWZpbmUgICAgIEFERFJfMl9EQVRBX19WQUxVRQkJCQkweDAwM2YKKworI2RlZmluZSBSRV8yX1dFCQkJCQkweDEyMAorI2RlZmluZSAgICAgUkVfMl9XRV9fVkFMVUUJCQkJMHgwMDNmCisKKyNkZWZpbmUgQUNDX0NMS1MgICAgCQkJCTB4MTMwCisjZGVmaW5lICAgICBBQ0NfQ0xLU19fVkFMVUUJCQkJMHgwMDBmCisKKyNkZWZpbmUgTlVNQkVSX09GX1BMQU5FUwkJCTB4MTQwCisjZGVmaW5lICAgICBOVU1CRVJfT0ZfUExBTkVTX19WQUxVRQkJCTB4MDAwNworCisjZGVmaW5lIFBBR0VTX1BFUl9CTE9DSwkJCQkweDE1MAorI2RlZmluZSAgICAgUEFHRVNfUEVSX0JMT0NLX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIERFVklDRV9XSURUSAkJCQkweDE2MAorI2RlZmluZSAgICAgREVWSUNFX1dJRFRIX19WQUxVRQkJCQkweDAwMDMKKworI2RlZmluZSBERVZJQ0VfTUFJTl9BUkVBX1NJWkUJCQkweDE3MAorI2RlZmluZSAgICAgREVWSUNFX01BSU5fQVJFQV9TSVpFX19WQUxVRQkJMHhmZmZmCisKKyNkZWZpbmUgREVWSUNFX1NQQVJFX0FSRUFfU0laRQkJCTB4MTgwCisjZGVmaW5lICAgICBERVZJQ0VfU1BBUkVfQVJFQV9TSVpFX19WQUxVRQkJMHhmZmZmCisKKyNkZWZpbmUgVFdPX1JPV19BRERSX0NZQ0xFUwkJCTB4MTkwCisjZGVmaW5lICAgICBUV09fUk9XX0FERFJfQ1lDTEVTX19GTEFHCQkJMHgwMDAxCisKKyNkZWZpbmUgTVVMVElQTEFORV9BRERSX1JFU1RSSUNUCQkweDFhMAorI2RlZmluZSAgICAgTVVMVElQTEFORV9BRERSX1JFU1RSSUNUX19GTEFHCQkweDAwMDEKKworI2RlZmluZSBFQ0NfQ09SUkVDVElPTgkJCQkweDFiMAorI2RlZmluZSAgICAgRUNDX0NPUlJFQ1RJT05fX1ZBTFVFCQkJMHgwMDFmCisKKyNkZWZpbmUgUkVBRF9NT0RFCQkJCTB4MWMwCisjZGVmaW5lICAgICBSRUFEX01PREVfX1ZBTFVFCQkJCTB4MDAwZgorCisjZGVmaW5lIFdSSVRFX01PREUJCQkJMHgxZDAKKyNkZWZpbmUgICAgIFdSSVRFX01PREVfX1ZBTFVFCQkJCTB4MDAwZgorCisjZGVmaW5lIENPUFlCQUNLX01PREUJCQkJMHgxZTAKKyNkZWZpbmUgICAgIENPUFlCQUNLX01PREVfX1ZBTFVFCQkJMHgwMDBmCisKKyNkZWZpbmUgUkRXUl9FTl9MT19DTlQJCQkJMHgxZjAKKyNkZWZpbmUgICAgIFJEV1JfRU5fTE9fQ05UX19WQUxVRQkJCTB4MDAxZgorCisjZGVmaW5lIFJEV1JfRU5fSElfQ05UCQkJCTB4MjAwCisjZGVmaW5lICAgICBSRFdSX0VOX0hJX0NOVF9fVkFMVUUJCQkweDAwMWYKKworI2RlZmluZSBNQVhfUkRfREVMQVkJCQkJMHgyMTAKKyNkZWZpbmUgICAgIE1BWF9SRF9ERUxBWV9fVkFMVUUJCQkJMHgwMDBmCisKKyNkZWZpbmUgQ1NfU0VUVVBfQ05UCQkJCTB4MjIwCisjZGVmaW5lICAgICBDU19TRVRVUF9DTlRfX1ZBTFVFCQkJCTB4MDAxZgorCisjZGVmaW5lIFNQQVJFX0FSRUFfU0tJUF9CWVRFUwkJCTB4MjMwCisjZGVmaW5lICAgICBTUEFSRV9BUkVBX1NLSVBfQllURVNfX1ZBTFVFCQkweDAwM2YKKworI2RlZmluZSBTUEFSRV9BUkVBX01BUktFUgkJCTB4MjQwCisjZGVmaW5lICAgICBTUEFSRV9BUkVBX01BUktFUl9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBERVZJQ0VTX0NPTk5FQ1RFRAkJCTB4MjUwCisjZGVmaW5lICAgICBERVZJQ0VTX0NPTk5FQ1RFRF9fVkFMVUUJCQkweDAwMDcKKworI2RlZmluZSBESUVfTUFTSwkJCQkJMHgyNjAKKyNkZWZpbmUgICAgIERJRV9NQVNLX19WQUxVRQkJCQkweDAwZmYKKworI2RlZmluZSBGSVJTVF9CTE9DS19PRl9ORVhUX1BMQU5FCQkweDI3MAorI2RlZmluZSAgICAgRklSU1RfQkxPQ0tfT0ZfTkVYVF9QTEFORV9fVkFMVUUJCTB4ZmZmZgorCisjZGVmaW5lIFdSSVRFX1BST1RFQ1QJCQkJMHgyODAKKyNkZWZpbmUgICAgIFdSSVRFX1BST1RFQ1RfX0ZMQUcJCQkJMHgwMDAxCisKKyNkZWZpbmUgUkVfMl9SRQkJCQkJMHgyOTAKKyNkZWZpbmUgICAgIFJFXzJfUkVfX1ZBTFVFCQkJCTB4MDAzZgorCisjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRAkJCTB4MzAwCisjZGVmaW5lICAgICBNQU5VRkFDVFVSRVJfSURfX1ZBTFVFCQkJMHgwMGZmCisKKyNkZWZpbmUgREVWSUNFX0lECQkJCTB4MzEwCisjZGVmaW5lICAgICBERVZJQ0VfSURfX1ZBTFVFCQkJCTB4MDBmZgorCisjZGVmaW5lIERFVklDRV9QQVJBTV8wCQkJCTB4MzIwCisjZGVmaW5lICAgICBERVZJQ0VfUEFSQU1fMF9fVkFMVUUJCQkweDAwZmYKKworI2RlZmluZSBERVZJQ0VfUEFSQU1fMQkJCQkweDMzMAorI2RlZmluZSAgICAgREVWSUNFX1BBUkFNXzFfX1ZBTFVFCQkJMHgwMGZmCisKKyNkZWZpbmUgREVWSUNFX1BBUkFNXzIJCQkJMHgzNDAKKyNkZWZpbmUgICAgIERFVklDRV9QQVJBTV8yX19WQUxVRQkJCTB4MDBmZgorCisjZGVmaW5lIExPR0lDQUxfUEFHRV9EQVRBX1NJWkUJCQkweDM1MAorI2RlZmluZSAgICAgTE9HSUNBTF9QQUdFX0RBVEFfU0laRV9fVkFMVUUJCTB4ZmZmZgorCisjZGVmaW5lIExPR0lDQUxfUEFHRV9TUEFSRV9TSVpFCQkJMHgzNjAKKyNkZWZpbmUgICAgIExPR0lDQUxfUEFHRV9TUEFSRV9TSVpFX19WQUxVRQkJMHhmZmZmCisKKyNkZWZpbmUgUkVWSVNJT04JCQkJCTB4MzcwCisjZGVmaW5lICAgICBSRVZJU0lPTl9fVkFMVUUJCQkJMHhmZmZmCisKKyNkZWZpbmUgT05GSV9ERVZJQ0VfRkVBVFVSRVMJCQkweDM4MAorI2RlZmluZSAgICAgT05GSV9ERVZJQ0VfRkVBVFVSRVNfX1ZBTFVFCQkJMHgwMDNmCisKKyNkZWZpbmUgT05GSV9PUFRJT05BTF9DT01NQU5EUwkJMHgzOTAKKyNkZWZpbmUgICAgIE9ORklfT1BUSU9OQUxfQ09NTUFORFNfX1ZBTFVFCQkweDAwM2YKKworI2RlZmluZSBPTkZJX1RJTUlOR19NT0RFCQkJMHgzYTAKKyNkZWZpbmUgICAgIE9ORklfVElNSU5HX01PREVfX1ZBTFVFCQkJMHgwMDNmCisKKyNkZWZpbmUgT05GSV9QR01fQ0FDSEVfVElNSU5HX01PREUJCTB4M2IwCisjZGVmaW5lICAgICBPTkZJX1BHTV9DQUNIRV9USU1JTkdfTU9ERV9fVkFMVUUJCTB4MDAzZgorCisjZGVmaW5lIE9ORklfREVWSUNFX05PX09GX0xVTlMJCQkweDNjMAorI2RlZmluZSAgICAgT05GSV9ERVZJQ0VfTk9fT0ZfTFVOU19fTk9fT0ZfTFVOUwkJMHgwMGZmCisjZGVmaW5lICAgICBPTkZJX0RFVklDRV9OT19PRl9MVU5TX19PTkZJX0RFVklDRQkJMHgwMTAwCisKKyNkZWZpbmUgT05GSV9ERVZJQ0VfTk9fT0ZfQkxPQ0tTX1BFUl9MVU5fTAkweDNkMAorI2RlZmluZSAgICAgT05GSV9ERVZJQ0VfTk9fT0ZfQkxPQ0tTX1BFUl9MVU5fTF9fVkFMVUUJMHhmZmZmCisKKyNkZWZpbmUgT05GSV9ERVZJQ0VfTk9fT0ZfQkxPQ0tTX1BFUl9MVU5fVQkweDNlMAorI2RlZmluZSAgICAgT05GSV9ERVZJQ0VfTk9fT0ZfQkxPQ0tTX1BFUl9MVU5fVV9fVkFMVUUJMHhmZmZmCisKKyNkZWZpbmUgRkVBVFVSRVMJCQkJCTB4M2YwCisjZGVmaW5lICAgICBGRUFUVVJFU19fTl9CQU5LUwkJCQkweDAwMDMKKyNkZWZpbmUgICAgIEZFQVRVUkVTX19FQ0NfTUFYX0VSUgkJCTB4MDAzYworI2RlZmluZSAgICAgRkVBVFVSRVNfX0RNQQkJCQkJMHgwMDQwCisjZGVmaW5lICAgICBGRUFUVVJFU19fQ01EX0RNQQkJCQkweDAwODAKKyNkZWZpbmUgICAgIEZFQVRVUkVTX19QQVJUSVRJT04JCQkJMHgwMTAwCisjZGVmaW5lICAgICBGRUFUVVJFU19fWERNQV9TSURFQkFORAkJCTB4MDIwMAorI2RlZmluZSAgICAgRkVBVFVSRVNfX0dQUkVHCQkJCTB4MDQwMAorI2RlZmluZSAgICAgRkVBVFVSRVNfX0lOREVYX0FERFIJCQkJMHgwODAwCisKKyNkZWZpbmUgVFJBTlNGRVJfTU9ERQkJCQkweDQwMAorI2RlZmluZSAgICAgVFJBTlNGRVJfTU9ERV9fVkFMVUUJCQkweDAwMDMKKworI2RlZmluZSBJTlRSX1NUQVRVUzAJCQkJMHg0MTAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUJCTB4MDAwMQorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19FQ0NfRVJSCQkJMHgwMDAyCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzBfX0RNQV9DTURfQ09NUAkJCTB4MDAwNAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19USU1FX09VVAkJCTB4MDAwOAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19QUk9HUkFNX0ZBSUwJCQkweDAwMTAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMF9fRVJBU0VfRkFJTAkJCTB4MDAyMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19MT0FEX0NPTVAJCQkweDAwNDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMF9fUFJPR1JBTV9DT01QCQkJMHgwMDgwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzBfX0VSQVNFX0NPTVAJCQkweDAxMDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMF9fUElQRV9DUFlCQ0tfQ01EX0NPTVAJCTB4MDIwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19MT0NLRURfQkxLCQkJMHgwNDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzBfX1VOU1VQX0NNRAkJCTB4MDgwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19JTlRfQUNUCQkJMHgxMDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzBfX1JTVF9DT01QCQkJMHgyMDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzBfX1BJUEVfQ01EX0VSUgkJCTB4NDAwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMwX19QQUdFX1hGRVJfSU5DCQkJMHg4MDAwCisKKyNkZWZpbmUgSU5UUl9FTjAJCQkJCTB4NDIwCisjZGVmaW5lICAgICBJTlRSX0VOMF9fRUNDX1RSQU5TQUNUSU9OX0RPTkUJCTB4MDAwMQorI2RlZmluZSAgICAgSU5UUl9FTjBfX0VDQ19FUlIJCQkJMHgwMDAyCisjZGVmaW5lICAgICBJTlRSX0VOMF9fRE1BX0NNRF9DT01QCQkJMHgwMDA0CisjZGVmaW5lICAgICBJTlRSX0VOMF9fVElNRV9PVVQJCQkJMHgwMDA4CisjZGVmaW5lICAgICBJTlRSX0VOMF9fUFJPR1JBTV9GQUlMCQkJMHgwMDEwCisjZGVmaW5lICAgICBJTlRSX0VOMF9fRVJBU0VfRkFJTAkJCQkweDAwMjAKKyNkZWZpbmUgICAgIElOVFJfRU4wX19MT0FEX0NPTVAJCQkJMHgwMDQwCisjZGVmaW5lICAgICBJTlRSX0VOMF9fUFJPR1JBTV9DT01QCQkJMHgwMDgwCisjZGVmaW5lICAgICBJTlRSX0VOMF9fRVJBU0VfQ09NUAkJCQkweDAxMDAKKyNkZWZpbmUgICAgIElOVFJfRU4wX19QSVBFX0NQWUJDS19DTURfQ09NUAkJMHgwMjAwCisjZGVmaW5lICAgICBJTlRSX0VOMF9fTE9DS0VEX0JMSwkJCQkweDA0MDAKKyNkZWZpbmUgICAgIElOVFJfRU4wX19VTlNVUF9DTUQJCQkJMHgwODAwCisjZGVmaW5lICAgICBJTlRSX0VOMF9fSU5UX0FDVAkJCQkweDEwMDAKKyNkZWZpbmUgICAgIElOVFJfRU4wX19SU1RfQ09NUAkJCQkweDIwMDAKKyNkZWZpbmUgICAgIElOVFJfRU4wX19QSVBFX0NNRF9FUlIJCQkweDQwMDAKKyNkZWZpbmUgICAgIElOVFJfRU4wX19QQUdFX1hGRVJfSU5DCQkJMHg4MDAwCisKKyNkZWZpbmUgUEFHRV9DTlQwCQkJCTB4NDMwCisjZGVmaW5lICAgICBQQUdFX0NOVDBfX1ZBTFVFCQkJCTB4MDBmZgorCisjZGVmaW5lIEVSUl9QQUdFX0FERFIwCQkJCTB4NDQwCisjZGVmaW5lICAgICBFUlJfUEFHRV9BRERSMF9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBFUlJfQkxPQ0tfQUREUjAJCQkweDQ1MAorI2RlZmluZSAgICAgRVJSX0JMT0NLX0FERFIwX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIElOVFJfU1RBVFVTMQkJCQkweDQ2MAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMxX19FQ0NfVFJBTlNBQ1RJT05fRE9ORQkJMHgwMDAxCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX0VDQ19FUlIJCQkweDAwMDIKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMV9fRE1BX0NNRF9DT01QCQkJMHgwMDA0CisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX1RJTUVfT1VUCQkJMHgwMDA4CisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX1BST0dSQU1fRkFJTAkJCTB4MDAxMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMxX19FUkFTRV9GQUlMCQkJMHgwMDIwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX0xPQURfQ09NUAkJCTB4MDA0MAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMxX19QUk9HUkFNX0NPTVAJCQkweDAwODAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMV9fRVJBU0VfQ09NUAkJCTB4MDEwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMxX19QSVBFX0NQWUJDS19DTURfQ09NUAkJMHgwMjAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX0xPQ0tFRF9CTEsJCQkweDA0MDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMV9fVU5TVVBfQ01ECQkJMHgwODAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX0lOVF9BQ1QJCQkweDEwMDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMV9fUlNUX0NPTVAJCQkweDIwMDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMV9fUElQRV9DTURfRVJSCQkJMHg0MDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzFfX1BBR0VfWEZFUl9JTkMJCQkweDgwMDAKKworI2RlZmluZSBJTlRSX0VOMQkJCQkJMHg0NzAKKyNkZWZpbmUgICAgIElOVFJfRU4xX19FQ0NfVFJBTlNBQ1RJT05fRE9ORQkJMHgwMDAxCisjZGVmaW5lICAgICBJTlRSX0VOMV9fRUNDX0VSUgkJCQkweDAwMDIKKyNkZWZpbmUgICAgIElOVFJfRU4xX19ETUFfQ01EX0NPTVAJCQkweDAwMDQKKyNkZWZpbmUgICAgIElOVFJfRU4xX19USU1FX09VVAkJCQkweDAwMDgKKyNkZWZpbmUgICAgIElOVFJfRU4xX19QUk9HUkFNX0ZBSUwJCQkweDAwMTAKKyNkZWZpbmUgICAgIElOVFJfRU4xX19FUkFTRV9GQUlMCQkJCTB4MDAyMAorI2RlZmluZSAgICAgSU5UUl9FTjFfX0xPQURfQ09NUAkJCQkweDAwNDAKKyNkZWZpbmUgICAgIElOVFJfRU4xX19QUk9HUkFNX0NPTVAJCQkweDAwODAKKyNkZWZpbmUgICAgIElOVFJfRU4xX19FUkFTRV9DT01QCQkJCTB4MDEwMAorI2RlZmluZSAgICAgSU5UUl9FTjFfX1BJUEVfQ1BZQkNLX0NNRF9DT01QCQkweDAyMDAKKyNkZWZpbmUgICAgIElOVFJfRU4xX19MT0NLRURfQkxLCQkJCTB4MDQwMAorI2RlZmluZSAgICAgSU5UUl9FTjFfX1VOU1VQX0NNRAkJCQkweDA4MDAKKyNkZWZpbmUgICAgIElOVFJfRU4xX19JTlRfQUNUCQkJCTB4MTAwMAorI2RlZmluZSAgICAgSU5UUl9FTjFfX1JTVF9DT01QCQkJCTB4MjAwMAorI2RlZmluZSAgICAgSU5UUl9FTjFfX1BJUEVfQ01EX0VSUgkJCTB4NDAwMAorI2RlZmluZSAgICAgSU5UUl9FTjFfX1BBR0VfWEZFUl9JTkMJCQkweDgwMDAKKworI2RlZmluZSBQQUdFX0NOVDEJCQkJMHg0ODAKKyNkZWZpbmUgICAgIFBBR0VfQ05UMV9fVkFMVUUJCQkJMHgwMGZmCisKKyNkZWZpbmUgRVJSX1BBR0VfQUREUjEJCQkJMHg0OTAKKyNkZWZpbmUgICAgIEVSUl9QQUdFX0FERFIxX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIEVSUl9CTE9DS19BRERSMQkJCTB4NGEwCisjZGVmaW5lICAgICBFUlJfQkxPQ0tfQUREUjFfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgSU5UUl9TVEFUVVMyCQkJCTB4NGIwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzJfX0VDQ19UUkFOU0FDVElPTl9ET05FCQkweDAwMDEKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fRUNDX0VSUgkJCTB4MDAwMgorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMyX19ETUFfQ01EX0NPTVAJCQkweDAwMDQKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fVElNRV9PVVQJCQkweDAwMDgKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fUFJPR1JBTV9GQUlMCQkJMHgwMDEwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzJfX0VSQVNFX0ZBSUwJCQkweDAwMjAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fTE9BRF9DT01QCQkJMHgwMDQwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzJfX1BST0dSQU1fQ09NUAkJCTB4MDA4MAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMyX19FUkFTRV9DT01QCQkJMHgwMTAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzJfX1BJUEVfQ1BZQkNLX0NNRF9DT01QCQkweDAyMDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fTE9DS0VEX0JMSwkJCTB4MDQwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMyX19VTlNVUF9DTUQJCQkweDA4MDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fSU5UX0FDVAkJCTB4MTAwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMyX19SU1RfQ09NUAkJCTB4MjAwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMyX19QSVBFX0NNRF9FUlIJCQkweDQwMDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTMl9fUEFHRV9YRkVSX0lOQwkJCTB4ODAwMAorCisjZGVmaW5lIElOVFJfRU4yCQkJCQkweDRjMAorI2RlZmluZSAgICAgSU5UUl9FTjJfX0VDQ19UUkFOU0FDVElPTl9ET05FCQkweDAwMDEKKyNkZWZpbmUgICAgIElOVFJfRU4yX19FQ0NfRVJSCQkJCTB4MDAwMgorI2RlZmluZSAgICAgSU5UUl9FTjJfX0RNQV9DTURfQ09NUAkJCTB4MDAwNAorI2RlZmluZSAgICAgSU5UUl9FTjJfX1RJTUVfT1VUCQkJCTB4MDAwOAorI2RlZmluZSAgICAgSU5UUl9FTjJfX1BST0dSQU1fRkFJTAkJCTB4MDAxMAorI2RlZmluZSAgICAgSU5UUl9FTjJfX0VSQVNFX0ZBSUwJCQkJMHgwMDIwCisjZGVmaW5lICAgICBJTlRSX0VOMl9fTE9BRF9DT01QCQkJCTB4MDA0MAorI2RlZmluZSAgICAgSU5UUl9FTjJfX1BST0dSQU1fQ09NUAkJCTB4MDA4MAorI2RlZmluZSAgICAgSU5UUl9FTjJfX0VSQVNFX0NPTVAJCQkJMHgwMTAwCisjZGVmaW5lICAgICBJTlRSX0VOMl9fUElQRV9DUFlCQ0tfQ01EX0NPTVAJCTB4MDIwMAorI2RlZmluZSAgICAgSU5UUl9FTjJfX0xPQ0tFRF9CTEsJCQkJMHgwNDAwCisjZGVmaW5lICAgICBJTlRSX0VOMl9fVU5TVVBfQ01ECQkJCTB4MDgwMAorI2RlZmluZSAgICAgSU5UUl9FTjJfX0lOVF9BQ1QJCQkJMHgxMDAwCisjZGVmaW5lICAgICBJTlRSX0VOMl9fUlNUX0NPTVAJCQkJMHgyMDAwCisjZGVmaW5lICAgICBJTlRSX0VOMl9fUElQRV9DTURfRVJSCQkJMHg0MDAwCisjZGVmaW5lICAgICBJTlRSX0VOMl9fUEFHRV9YRkVSX0lOQwkJCTB4ODAwMAorCisjZGVmaW5lIFBBR0VfQ05UMgkJCQkweDRkMAorI2RlZmluZSAgICAgUEFHRV9DTlQyX19WQUxVRQkJCQkweDAwZmYKKworI2RlZmluZSBFUlJfUEFHRV9BRERSMgkJCQkweDRlMAorI2RlZmluZSAgICAgRVJSX1BBR0VfQUREUjJfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgRVJSX0JMT0NLX0FERFIyCQkJMHg0ZjAKKyNkZWZpbmUgICAgIEVSUl9CTE9DS19BRERSMl9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBJTlRSX1NUQVRVUzMJCQkJMHg1MDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTM19fRUNDX1RSQU5TQUNUSU9OX0RPTkUJCTB4MDAwMQorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19FQ0NfRVJSCQkJMHgwMDAyCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzNfX0RNQV9DTURfQ09NUAkJCTB4MDAwNAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19USU1FX09VVAkJCTB4MDAwOAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19QUk9HUkFNX0ZBSUwJCQkweDAwMTAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTM19fRVJBU0VfRkFJTAkJCTB4MDAyMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19MT0FEX0NPTVAJCQkweDAwNDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTM19fUFJPR1JBTV9DT01QCQkJMHgwMDgwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzNfX0VSQVNFX0NPTVAJCQkweDAxMDAKKyNkZWZpbmUgICAgIElOVFJfU1RBVFVTM19fUElQRV9DUFlCQ0tfQ01EX0NPTVAJCTB4MDIwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19MT0NLRURfQkxLCQkJMHgwNDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzNfX1VOU1VQX0NNRAkJCTB4MDgwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19JTlRfQUNUCQkJMHgxMDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzNfX1JTVF9DT01QCQkJMHgyMDAwCisjZGVmaW5lICAgICBJTlRSX1NUQVRVUzNfX1BJUEVfQ01EX0VSUgkJCTB4NDAwMAorI2RlZmluZSAgICAgSU5UUl9TVEFUVVMzX19QQUdFX1hGRVJfSU5DCQkJMHg4MDAwCisKKyNkZWZpbmUgSU5UUl9FTjMJCQkJCTB4NTEwCisjZGVmaW5lICAgICBJTlRSX0VOM19fRUNDX1RSQU5TQUNUSU9OX0RPTkUJCTB4MDAwMQorI2RlZmluZSAgICAgSU5UUl9FTjNfX0VDQ19FUlIJCQkJMHgwMDAyCisjZGVmaW5lICAgICBJTlRSX0VOM19fRE1BX0NNRF9DT01QCQkJMHgwMDA0CisjZGVmaW5lICAgICBJTlRSX0VOM19fVElNRV9PVVQJCQkJMHgwMDA4CisjZGVmaW5lICAgICBJTlRSX0VOM19fUFJPR1JBTV9GQUlMCQkJMHgwMDEwCisjZGVmaW5lICAgICBJTlRSX0VOM19fRVJBU0VfRkFJTAkJCQkweDAwMjAKKyNkZWZpbmUgICAgIElOVFJfRU4zX19MT0FEX0NPTVAJCQkJMHgwMDQwCisjZGVmaW5lICAgICBJTlRSX0VOM19fUFJPR1JBTV9DT01QCQkJMHgwMDgwCisjZGVmaW5lICAgICBJTlRSX0VOM19fRVJBU0VfQ09NUAkJCQkweDAxMDAKKyNkZWZpbmUgICAgIElOVFJfRU4zX19QSVBFX0NQWUJDS19DTURfQ09NUAkJMHgwMjAwCisjZGVmaW5lICAgICBJTlRSX0VOM19fTE9DS0VEX0JMSwkJCQkweDA0MDAKKyNkZWZpbmUgICAgIElOVFJfRU4zX19VTlNVUF9DTUQJCQkJMHgwODAwCisjZGVmaW5lICAgICBJTlRSX0VOM19fSU5UX0FDVAkJCQkweDEwMDAKKyNkZWZpbmUgICAgIElOVFJfRU4zX19SU1RfQ09NUAkJCQkweDIwMDAKKyNkZWZpbmUgICAgIElOVFJfRU4zX19QSVBFX0NNRF9FUlIJCQkweDQwMDAKKyNkZWZpbmUgICAgIElOVFJfRU4zX19QQUdFX1hGRVJfSU5DCQkJMHg4MDAwCisKKyNkZWZpbmUgUEFHRV9DTlQzCQkJCTB4NTIwCisjZGVmaW5lICAgICBQQUdFX0NOVDNfX1ZBTFVFCQkJCTB4MDBmZgorCisjZGVmaW5lIEVSUl9QQUdFX0FERFIzCQkJCTB4NTMwCisjZGVmaW5lICAgICBFUlJfUEFHRV9BRERSM19fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBFUlJfQkxPQ0tfQUREUjMJCQkweDU0MAorI2RlZmluZSAgICAgRVJSX0JMT0NLX0FERFIzX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIERBVEFfSU5UUgkJCQkweDU1MAorI2RlZmluZSAgICAgREFUQV9JTlRSX19XUklURV9TUEFDRV9BVgkJCTB4MDAwMQorI2RlZmluZSAgICAgREFUQV9JTlRSX19SRUFEX0RBVEFfQVYJCQkweDAwMDIKKworI2RlZmluZSBEQVRBX0lOVFJfRU4JCQkJMHg1NjAKKyNkZWZpbmUgICAgIERBVEFfSU5UUl9FTl9fV1JJVEVfU1BBQ0VfQVYJCTB4MDAwMQorI2RlZmluZSAgICAgREFUQV9JTlRSX0VOX19SRUFEX0RBVEFfQVYJCQkweDAwMDIKKworI2RlZmluZSBHUFJFR18wCQkJCQkweDU3MAorI2RlZmluZSAgICAgR1BSRUdfMF9fVkFMVUUJCQkJMHhmZmZmCisKKyNkZWZpbmUgR1BSRUdfMQkJCQkJMHg1ODAKKyNkZWZpbmUgICAgIEdQUkVHXzFfX1ZBTFVFCQkJCTB4ZmZmZgorCisjZGVmaW5lIEdQUkVHXzIJCQkJCTB4NTkwCisjZGVmaW5lICAgICBHUFJFR18yX19WQUxVRQkJCQkweGZmZmYKKworI2RlZmluZSBHUFJFR18zCQkJCQkweDVhMAorI2RlZmluZSAgICAgR1BSRUdfM19fVkFMVUUJCQkJMHhmZmZmCisKKyNkZWZpbmUgRUNDX1RIUkVTSE9MRAkJCQkweDYwMAorI2RlZmluZSAgICAgRUNDX1RIUkVTSE9MRF9fVkFMVUUJCQkJMHgwM2ZmCisKKyNkZWZpbmUgRUNDX0VSUk9SX0JMT0NLX0FERFJFU1MJCTB4NjEwCisjZGVmaW5lICAgICBFQ0NfRVJST1JfQkxPQ0tfQUREUkVTU19fVkFMVUUJCTB4ZmZmZgorCisjZGVmaW5lIEVDQ19FUlJPUl9QQUdFX0FERFJFU1MJCQkweDYyMAorI2RlZmluZSAgICAgRUNDX0VSUk9SX1BBR0VfQUREUkVTU19fVkFMVUUJCTB4MGZmZgorI2RlZmluZSAgICAgRUNDX0VSUk9SX1BBR0VfQUREUkVTU19fQkFOSwkJMHhmMDAwCisKKyNkZWZpbmUgRUNDX0VSUk9SX0FERFJFU1MJCQkweDYzMAorI2RlZmluZSAgICAgRUNDX0VSUk9SX0FERFJFU1NfX09GRlNFVAkJCTB4MGZmZgorI2RlZmluZSAgICAgRUNDX0VSUk9SX0FERFJFU1NfX1NFQ1RPUl9OUgkJMHhmMDAwCisKKyNkZWZpbmUgRVJSX0NPUlJFQ1RJT05fSU5GTwkJCTB4NjQwCisjZGVmaW5lICAgICBFUlJfQ09SUkVDVElPTl9JTkZPX19CWVRFTUFTSwkJMHgwMGZmCisjZGVmaW5lICAgICBFUlJfQ09SUkVDVElPTl9JTkZPX19ERVZJQ0VfTlIJCTB4MGYwMAorI2RlZmluZSAgICAgRVJSX0NPUlJFQ1RJT05fSU5GT19fRVJST1JfVFlQRQkJMHg0MDAwCisjZGVmaW5lICAgICBFUlJfQ09SUkVDVElPTl9JTkZPX19MQVNUX0VSUl9JTkZPCQkweDgwMDAKKworI2RlZmluZSBETUFfRU5BQkxFCQkJCTB4NzAwCisjZGVmaW5lICAgICBETUFfRU5BQkxFX19GTEFHCQkJCTB4MDAwMQorCisjZGVmaW5lIElHTk9SRV9FQ0NfRE9ORQkJCQkweDcxMAorI2RlZmluZSAgICAgSUdOT1JFX0VDQ19ET05FX19GTEFHCQkJMHgwMDAxCisKKyNkZWZpbmUgRE1BX0lOVFIJCQkJMHg3MjAKKyNkZWZpbmUgICAgIERNQV9JTlRSX19UQVJHRVRfRVJST1IJCQkweDAwMDEKKyNkZWZpbmUgICAgIERNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDAJCTB4MDAwMgorI2RlZmluZSAgICAgRE1BX0lOVFJfX0RFU0NfQ09NUF9DSEFOTkVMMQkJMHgwMDA0CisjZGVmaW5lICAgICBETUFfSU5UUl9fREVTQ19DT01QX0NIQU5ORUwyCQkweDAwMDgKKyNkZWZpbmUgICAgIERNQV9JTlRSX19ERVNDX0NPTVBfQ0hBTk5FTDMJCTB4MDAxMAorI2RlZmluZSAgICAgRE1BX0lOVFJfX01FTUNPUFlfREVTQ19DT01QCQkweDAwMjAKKworI2RlZmluZSBETUFfSU5UUl9FTgkJCQkweDczMAorI2RlZmluZSAgICAgRE1BX0lOVFJfRU5fX1RBUkdFVF9FUlJPUgkJCTB4MDAwMQorI2RlZmluZSAgICAgRE1BX0lOVFJfRU5fX0RFU0NfQ09NUF9DSEFOTkVMMAkJMHgwMDAyCisjZGVmaW5lICAgICBETUFfSU5UUl9FTl9fREVTQ19DT01QX0NIQU5ORUwxCQkweDAwMDQKKyNkZWZpbmUgICAgIERNQV9JTlRSX0VOX19ERVNDX0NPTVBfQ0hBTk5FTDIJCTB4MDAwOAorI2RlZmluZSAgICAgRE1BX0lOVFJfRU5fX0RFU0NfQ09NUF9DSEFOTkVMMwkJMHgwMDEwCisjZGVmaW5lICAgICBETUFfSU5UUl9FTl9fTUVNQ09QWV9ERVNDX0NPTVAJCTB4MDAyMAorCisjZGVmaW5lIFRBUkdFVF9FUlJfQUREUl9MTwkJCTB4NzQwCisjZGVmaW5lICAgICBUQVJHRVRfRVJSX0FERFJfTE9fX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgVEFSR0VUX0VSUl9BRERSX0hJCQkJMHg3NTAKKyNkZWZpbmUgICAgIFRBUkdFVF9FUlJfQUREUl9ISV9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBDSE5MX0FDVElWRQkJCQkweDc2MAorI2RlZmluZSAgICAgQ0hOTF9BQ1RJVkVfX0NIQU5ORUwwCQkJMHgwMDAxCisjZGVmaW5lICAgICBDSE5MX0FDVElWRV9fQ0hBTk5FTDEJCQkweDAwMDIKKyNkZWZpbmUgICAgIENITkxfQUNUSVZFX19DSEFOTkVMMgkJCTB4MDAwNAorI2RlZmluZSAgICAgQ0hOTF9BQ1RJVkVfX0NIQU5ORUwzCQkJMHgwMDA4CisKKyNkZWZpbmUgQUNUSVZFX1NSQ19JRAkJCQkweDgwMAorI2RlZmluZSAgICAgQUNUSVZFX1NSQ19JRF9fVkFMVUUJCQkJMHgwMGZmCisKKyNkZWZpbmUgUFROX0lOVFIJCQkJCTB4ODEwCisjZGVmaW5lICAgICBQVE5fSU5UUl9fQ09ORklHX0VSUk9SCQkJMHgwMDAxCisjZGVmaW5lICAgICBQVE5fSU5UUl9fQUNDRVNTX0VSUk9SX0JBTkswCQkweDAwMDIKKyNkZWZpbmUgICAgIFBUTl9JTlRSX19BQ0NFU1NfRVJST1JfQkFOSzEJCTB4MDAwNAorI2RlZmluZSAgICAgUFROX0lOVFJfX0FDQ0VTU19FUlJPUl9CQU5LMgkJMHgwMDA4CisjZGVmaW5lICAgICBQVE5fSU5UUl9fQUNDRVNTX0VSUk9SX0JBTkszCQkweDAwMTAKKyNkZWZpbmUgICAgIFBUTl9JTlRSX19SRUdfQUNDRVNTX0VSUk9SCQkJMHgwMDIwCisKKyNkZWZpbmUgUFROX0lOVFJfRU4JCQkJMHg4MjAKKyNkZWZpbmUgICAgIFBUTl9JTlRSX0VOX19DT05GSUdfRVJST1IJCQkweDAwMDEKKyNkZWZpbmUgICAgIFBUTl9JTlRSX0VOX19BQ0NFU1NfRVJST1JfQkFOSzAJCTB4MDAwMgorI2RlZmluZSAgICAgUFROX0lOVFJfRU5fX0FDQ0VTU19FUlJPUl9CQU5LMQkJMHgwMDA0CisjZGVmaW5lICAgICBQVE5fSU5UUl9FTl9fQUNDRVNTX0VSUk9SX0JBTksyCQkweDAwMDgKKyNkZWZpbmUgICAgIFBUTl9JTlRSX0VOX19BQ0NFU1NfRVJST1JfQkFOSzMJCTB4MDAxMAorI2RlZmluZSAgICAgUFROX0lOVFJfRU5fX1JFR19BQ0NFU1NfRVJST1IJCTB4MDAyMAorCisjZGVmaW5lIFBFUk1fU1JDX0lEXzAJCQkJMHg4MzAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzBfX1NSQ0lECQkJCTB4MDBmZgorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfMF9fRElSRUNUX0FDQ0VTU19BQ1RJVkUJCTB4MDgwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfMF9fV1JJVEVfQUNUSVZFCQkJMHgyMDAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF8wX19SRUFEX0FDVElWRQkJCTB4NDAwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfMF9fUEFSVElUSU9OX1ZBTElECQkweDgwMDAKKworI2RlZmluZSBNSU5fQkxLX0FERFJfMAkJCQkweDg0MAorI2RlZmluZSAgICAgTUlOX0JMS19BRERSXzBfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgTUFYX0JMS19BRERSXzAJCQkJMHg4NTAKKyNkZWZpbmUgICAgIE1BWF9CTEtfQUREUl8wX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIE1JTl9NQVhfQkFOS18wCQkJCTB4ODYwCisjZGVmaW5lICAgICBNSU5fTUFYX0JBTktfMF9fTUlOX1ZBTFVFCQkJMHgwMDAzCisjZGVmaW5lICAgICBNSU5fTUFYX0JBTktfMF9fTUFYX1ZBTFVFCQkJMHgwMDBjCisKKyNkZWZpbmUgUEVSTV9TUkNfSURfMQkJCQkweDg3MAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfMV9fU1JDSUQJCQkJMHgwMGZmCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF8xX19ESVJFQ1RfQUNDRVNTX0FDVElWRQkJMHgwODAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF8xX19XUklURV9BQ1RJVkUJCQkweDIwMDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzFfX1JFQURfQUNUSVZFCQkJMHg0MDAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF8xX19QQVJUSVRJT05fVkFMSUQJCTB4ODAwMAorCisjZGVmaW5lIE1JTl9CTEtfQUREUl8xCQkJCTB4ODgwCisjZGVmaW5lICAgICBNSU5fQkxLX0FERFJfMV9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBNQVhfQkxLX0FERFJfMQkJCQkweDg5MAorI2RlZmluZSAgICAgTUFYX0JMS19BRERSXzFfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgTUlOX01BWF9CQU5LXzEJCQkJMHg4YTAKKyNkZWZpbmUgICAgIE1JTl9NQVhfQkFOS18xX19NSU5fVkFMVUUJCQkweDAwMDMKKyNkZWZpbmUgICAgIE1JTl9NQVhfQkFOS18xX19NQVhfVkFMVUUJCQkweDAwMGMKKworI2RlZmluZSBQRVJNX1NSQ19JRF8yCQkJCTB4OGIwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF8yX19TUkNJRAkJCQkweDAwZmYKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzJfX0RJUkVDVF9BQ0NFU1NfQUNUSVZFCQkweDA4MDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzJfX1dSSVRFX0FDVElWRQkJCTB4MjAwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfMl9fUkVBRF9BQ1RJVkUJCQkweDQwMDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzJfX1BBUlRJVElPTl9WQUxJRAkJMHg4MDAwCisKKyNkZWZpbmUgTUlOX0JMS19BRERSXzIJCQkJMHg4YzAKKyNkZWZpbmUgICAgIE1JTl9CTEtfQUREUl8yX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIE1BWF9CTEtfQUREUl8yCQkJCTB4OGQwCisjZGVmaW5lICAgICBNQVhfQkxLX0FERFJfMl9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBNSU5fTUFYX0JBTktfMgkJCQkweDhlMAorI2RlZmluZSAgICAgTUlOX01BWF9CQU5LXzJfX01JTl9WQUxVRQkJCTB4MDAwMworI2RlZmluZSAgICAgTUlOX01BWF9CQU5LXzJfX01BWF9WQUxVRQkJCTB4MDAwYworCisjZGVmaW5lIFBFUk1fU1JDX0lEXzMJCQkJMHg4ZjAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzNfX1NSQ0lECQkJCTB4MDBmZgorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfM19fRElSRUNUX0FDQ0VTU19BQ1RJVkUJCTB4MDgwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfM19fV1JJVEVfQUNUSVZFCQkJMHgyMDAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF8zX19SRUFEX0FDVElWRQkJCTB4NDAwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfM19fUEFSVElUSU9OX1ZBTElECQkweDgwMDAKKworI2RlZmluZSBNSU5fQkxLX0FERFJfMwkJCQkweDkwMAorI2RlZmluZSAgICAgTUlOX0JMS19BRERSXzNfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgTUFYX0JMS19BRERSXzMJCQkJMHg5MTAKKyNkZWZpbmUgICAgIE1BWF9CTEtfQUREUl8zX19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIE1JTl9NQVhfQkFOS18zCQkJCTB4OTIwCisjZGVmaW5lICAgICBNSU5fTUFYX0JBTktfM19fTUlOX1ZBTFVFCQkJMHgwMDAzCisjZGVmaW5lICAgICBNSU5fTUFYX0JBTktfM19fTUFYX1ZBTFVFCQkJMHgwMDBjCisKKyNkZWZpbmUgUEVSTV9TUkNfSURfNAkJCQkweDkzMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfNF9fU1JDSUQJCQkJMHgwMGZmCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF80X19ESVJFQ1RfQUNDRVNTX0FDVElWRQkJMHgwODAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF80X19XUklURV9BQ1RJVkUJCQkweDIwMDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzRfX1JFQURfQUNUSVZFCQkJMHg0MDAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF80X19QQVJUSVRJT05fVkFMSUQJCTB4ODAwMAorCisjZGVmaW5lIE1JTl9CTEtfQUREUl80CQkJCTB4OTQwCisjZGVmaW5lICAgICBNSU5fQkxLX0FERFJfNF9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBNQVhfQkxLX0FERFJfNAkJCQkweDk1MAorI2RlZmluZSAgICAgTUFYX0JMS19BRERSXzRfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgTUlOX01BWF9CQU5LXzQJCQkJMHg5NjAKKyNkZWZpbmUgICAgIE1JTl9NQVhfQkFOS180X19NSU5fVkFMVUUJCQkweDAwMDMKKyNkZWZpbmUgICAgIE1JTl9NQVhfQkFOS180X19NQVhfVkFMVUUJCQkweDAwMGMKKworI2RlZmluZSBQRVJNX1NSQ19JRF81CQkJCTB4OTcwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF81X19TUkNJRAkJCQkweDAwZmYKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzVfX0RJUkVDVF9BQ0NFU1NfQUNUSVZFCQkweDA4MDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzVfX1dSSVRFX0FDVElWRQkJCTB4MjAwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfNV9fUkVBRF9BQ1RJVkUJCQkweDQwMDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzVfX1BBUlRJVElPTl9WQUxJRAkJMHg4MDAwCisKKyNkZWZpbmUgTUlOX0JMS19BRERSXzUJCQkJMHg5ODAKKyNkZWZpbmUgICAgIE1JTl9CTEtfQUREUl81X19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIE1BWF9CTEtfQUREUl81CQkJCTB4OTkwCisjZGVmaW5lICAgICBNQVhfQkxLX0FERFJfNV9fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBNSU5fTUFYX0JBTktfNQkJCQkweDlhMAorI2RlZmluZSAgICAgTUlOX01BWF9CQU5LXzVfX01JTl9WQUxVRQkJCTB4MDAwMworI2RlZmluZSAgICAgTUlOX01BWF9CQU5LXzVfX01BWF9WQUxVRQkJCTB4MDAwYworCisjZGVmaW5lIFBFUk1fU1JDX0lEXzYJCQkJMHg5YjAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzZfX1NSQ0lECQkJCTB4MDBmZgorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfNl9fRElSRUNUX0FDQ0VTU19BQ1RJVkUJCTB4MDgwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfNl9fV1JJVEVfQUNUSVZFCQkJMHgyMDAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF82X19SRUFEX0FDVElWRQkJCTB4NDAwMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfNl9fUEFSVElUSU9OX1ZBTElECQkweDgwMDAKKworI2RlZmluZSBNSU5fQkxLX0FERFJfNgkJCQkweDljMAorI2RlZmluZSAgICAgTUlOX0JMS19BRERSXzZfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgTUFYX0JMS19BRERSXzYJCQkJMHg5ZDAKKyNkZWZpbmUgICAgIE1BWF9CTEtfQUREUl82X19WQUxVRQkJCTB4ZmZmZgorCisjZGVmaW5lIE1JTl9NQVhfQkFOS182CQkJCTB4OWUwCisjZGVmaW5lICAgICBNSU5fTUFYX0JBTktfNl9fTUlOX1ZBTFVFCQkJMHgwMDAzCisjZGVmaW5lICAgICBNSU5fTUFYX0JBTktfNl9fTUFYX1ZBTFVFCQkJMHgwMDBjCisKKyNkZWZpbmUgUEVSTV9TUkNfSURfNwkJCQkweDlmMAorI2RlZmluZSAgICAgUEVSTV9TUkNfSURfN19fU1JDSUQJCQkJMHgwMGZmCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF83X19ESVJFQ1RfQUNDRVNTX0FDVElWRQkJMHgwODAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF83X19XUklURV9BQ1RJVkUJCQkweDIwMDAKKyNkZWZpbmUgICAgIFBFUk1fU1JDX0lEXzdfX1JFQURfQUNUSVZFCQkJMHg0MDAwCisjZGVmaW5lICAgICBQRVJNX1NSQ19JRF83X19QQVJUSVRJT05fVkFMSUQJCTB4ODAwMAorCisjZGVmaW5lIE1JTl9CTEtfQUREUl83CQkJCTB4YTAwCisjZGVmaW5lICAgICBNSU5fQkxLX0FERFJfN19fVkFMVUUJCQkweGZmZmYKKworI2RlZmluZSBNQVhfQkxLX0FERFJfNwkJCQkweGExMAorI2RlZmluZSAgICAgTUFYX0JMS19BRERSXzdfX1ZBTFVFCQkJMHhmZmZmCisKKyNkZWZpbmUgTUlOX01BWF9CQU5LXzcJCQkJMHhhMjAKKyNkZWZpbmUgICAgIE1JTl9NQVhfQkFOS183X19NSU5fVkFMVUUJCQkweDAwMDMKKyNkZWZpbmUgICAgIE1JTl9NQVhfQkFOS183X19NQVhfVkFMVUUJCQkweDAwMGMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL3NwZWN0cmFzd2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvc3BlY3RyYXN3Y29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNTk0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL3NwZWN0cmFzd2NvbmZpZy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBOQU5EIEZsYXNoIENvbnRyb2xsZXIgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1cHBsaWVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9TUEVDVFJBU1dDT05GSUdfCisjZGVmaW5lIF9TUEVDVFJBU1dDT05GSUdfCisKKy8qIE5BTkQgZHJpdmVyIHZlcnNpb24gKi8KKyNkZWZpbmUgR0xPQl9WRVJTSU9OICAgICAgICAgICJkcml2ZXIgdmVyc2lvbiAyMDEwMDMxMSIKKworCisvKioqKiogQ29tbW9uIFBhcmFtZXRlcnMgKioqKiovCisjZGVmaW5lIFJFVFJZX1RJTUVTICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBSRUFEX0JBREJMT0NLX0lORk8gICAgICAgICAgICAxCisjZGVmaW5lIFJFQURCQUNLX1ZFUklGWSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUT19GT1JNQVRfRkxBU0ggICAgICAgICAgICAgMAorCisvKioqKiogQ2FjaGUgUGFyYW1ldGVycyAqKioqKi8KKyNkZWZpbmUgQ0FDSEVfSVRFTV9OVU0gICAgICAgICAgICAxMjgKKyNkZWZpbmUgQkxLX05VTV9GT1JfTDJfQ0FDSEUgICAgICAgIDE2CisKKy8qKioqKiBCbG9jayBUYWJsZSBQYXJhbWV0ZXJzICoqKioqLworI2RlZmluZSBCTE9DS19UQUJMRV9JTkRFWCAgICAgICAgICAgICAwCisKKy8qKioqKiBXZWFyIExldmVsaW5nIFBhcmFtZXRlcnMgKioqKiovCisjZGVmaW5lIFdFQVJfTEVWRUxJTkdfR0FURSAgICAgICAgIDB4MTAKKyNkZWZpbmUgV0VBUl9MRVZFTElOR19CTE9DS19OVU0gICAgICAxMAorCisjZGVmaW5lIERFQlVHX0JORFJZICAgICAgICAgICAgIDAKKworLyoqKioqIFByb2R1Y3QgRmVhdHVyZSBTdXBwb3J0ICoqKioqLworI2RlZmluZSBGTEFTSF9FTVUgICAgICAgICAgICAgICBkZWZpbmVkKENPTkZJR19TUEVDVFJBX0VNVSkKKyNkZWZpbmUgRkxBU0hfTkFORCAgICAgICAgICAgICAgZGVmaW5lZChDT05GSUdfU1BFQ1RSQV9NUlNUX0hXKQorI2RlZmluZSBGTEFTSF9NVEQgICAgICAgICAgICAgICBkZWZpbmVkKENPTkZJR19TUEVDVFJBX01URCkKKyNkZWZpbmUgQ01EX0RNQSAgICAgICAgICAgICAgICAgZGVmaW5lZChDT05GSUdfU1BFQ1RSQV9NUlNUX0hXX0RNQSkKKworI2RlZmluZSBTUEVDVFJBX1BBUlRJVElPTl9JRCAgICAwCisKKy8qIEVuYWJsZSB0aGlzIG1hY3JvIGlmIHRoZSBudW1iZXIgb2YgZmxhc2ggYmxvY2tzIGlzIGxhcmdlciB0aGFuIDE2Sy4gKi8KKyNkZWZpbmUgU1VQUE9SVF9MQVJHRV9CTE9DS05VTSAgMQorCisvKioqKiBCbG9jayBUYWJsZSBhbmQgUmVzZXJ2ZWQgQmxvY2sgUGFyYW1ldGVycyAqKioqKi8KKyNkZWZpbmUgU1BFQ1RSQV9TVEFSVF9CTE9DSyAgICAgMworLy8jZGVmaW5lIE5VTV9GUkVFX0JMT0NLU19HQVRFICAgIDMwCisjZGVmaW5lIE5VTV9GUkVFX0JMT0NLU19HQVRFICAgIDYwCisKKy8qKioqIEhhcmR3YXJlIFBhcmFtZXRlcnMgKioqKi8KKyNkZWZpbmUgR0xPQl9IV0NUTF9SRUdfQkFTRSAgICAgMHhGRkE0MDAwMAorI2RlZmluZSBHTE9CX0hXQ1RMX1JFR19TSVpFICAgICA0MDk2CisKKyNkZWZpbmUgR0xPQl9IV0NUTF9NRU1fQkFTRSAgICAgMHhGRkE0ODAwMAorI2RlZmluZSBHTE9CX0hXQ1RMX01FTV9TSVpFICAgICA0MDk2CisKKy8qIEtCViAtIFVwZGF0ZWQgdG8gTE5XIHNjcmF0Y2ggcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBTQ1JBVENIX1JFR19BRERSICAgIDB4RkYxMDgwMTgKKyNkZWZpbmUgU0NSQVRDSF9SRUdfU0laRSAgICA2NAorCisjZGVmaW5lIEdMT0JfSFdDVExfREVGQVVMVF9CTEtTICAgIDIwNDgKKworI2RlZmluZSBTVVBQT1JUXzE1QklURUNDICAgICAgICAxCisjZGVmaW5lIFNVUFBPUlRfOEJJVEVDQyAgICAgICAgIDEKKworI2RlZmluZSBPTkZJX0JMT09NX1RJTUUgICAgICAgICAwCisjZGVmaW5lIE1PREU1X1dPUktBUk9VTkQgICAgICAgIDEKKworI2VuZGlmIC8qX1NQRUNUUkFTV0NPTkZJR18qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3QvS2NvbmZpZwppbmRleCAzYWIyMDRkLi42OGFkM2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3QvS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKICMKIG1lbnUgIlRleGFzIEluc3RydW1lbnRzIHNoYXJlZCB0cmFuc3BvcnQgbGluZSBkaXNjaXBsaW5lIgogY29uZmlnIFRJX1NUCi0JdHJpc3RhdGUgInNoYXJlZCB0cmFuc3BvcnQgY29yZSBkcml2ZXIiCisJdHJpc3RhdGUgIlNoYXJlZCB0cmFuc3BvcnQgY29yZSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBSRktJTEwKIAlzZWxlY3QgRldfTE9BREVSCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvdGktc3QvVE9ETwppbmRleCAyYzRmZTU4Li5lYmZkNmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3QvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3QvVE9ETwpAQCAtMSwxNyArMSw2IEBACiBUT0RPOgogCi0xLiBBIHBlci1kZXZpY2UvdHR5IHBvcnQgY29udGV4dCByZXF1aXJlZCB0byBzdXBwb3J0IG11bHRpcGxlIGRldmljZXMKLW9uIHNhbWUgcGxhdGZvcm0uCi0KLTIuIFJFTU9WRSB0aGUgc3lzZnMgZW50cnkgUElEIHBhc3NpbmcgbWVjaGFuaXNtLCBzaW5jZSB0aGVyZSBzaG91bGQKLWJlIGEgYmV0dGVyIHdheSB0byByZXF1ZXN0IHVzZXItc3BhY2UgdG8gaW5zdGFsbCBsaW5lIGRpc2NpcGxpbmUuCi0KLTMuIFJlLXZpZXcvUmUtd29yayBvbiB0aGUgbG9ja2luZy4KLQotNC4gUmUtc3RydWN0dXJlIHRvIG1ha2UgdGhlIGxkaXNjIGRyaXZlciBtb3JlIGdlbmVyaWMgZm9yIGNoaXBzZXRzIHdoaWNoIG11eAotbXVsdGlwbGUgY29ubmVjdGl2aXR5IChCVCwgRk0sIEdQUykgdXBvbiAxIFRUWSBwb3J0LgotCi01LiBTdGVwIHVwIGFuZCBtYWludGFpbiB0aGlzIGRyaXZlciB0byBlbnN1cmUgdGhhdCBpdCBjb250aW51ZXMKKzEuIFN0ZXAgdXAgYW5kIG1haW50YWluIHRoaXMgZHJpdmVyIHRvIGVuc3VyZSB0aGF0IGl0IGNvbnRpbnVlcwogdG8gd29yay4gIEhhdmluZyB0aGUgaGFyZHdhcmUgZm9yIHRoaXMgaXMgcHJldHR5IG11Y2ggYQogcmVxdWlyZW1lbnQuICBJZiB0aGlzIGRvZXMgbm90IGhhcHBlbiwgdGhlIHdpbGwgYmUgcmVtb3ZlZCBpbgogdGhlIDIuNi4zNSBrZXJuZWwgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9idF9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9idF9kcnYuYwppbmRleCBkODQyMGI1Li42MWFlOTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3QvYnRfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpLXN0L2J0X2Rydi5jCkBAIC04MCwzMSArODAsMzMgQEAKICAqIHN0YXR1cy5oY2lfc3Rfb3BlbigpIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3Igc2lnbmFsIGZyb20gdGhpcwogICogQVBJIHdoZW4gc3RfcmVnaXN0ZXIoKSBmdW5jdGlvbiByZXR1cm5zIFNUX1BFTkRJTkcuCiAgKi8KLXN0YXRpYyB2b2lkIGhjaV9zdF9yZWdpc3RyYXRpb25fY29tcGxldGlvbl9jYihjaGFyIGRhdGEpCitzdGF0aWMgdm9pZCBoY2lfc3RfcmVnaXN0cmF0aW9uX2NvbXBsZXRpb25fY2Iodm9pZCAqcHJpdl9kYXRhLCBjaGFyIGRhdGEpCiB7CisJc3RydWN0IGhjaV9zdCAqbGhzdCA9IChzdHJ1Y3QgaGNpX3N0ICopcHJpdl9kYXRhOwogCUJURFJWX0FQSV9TVEFSVCgpOwogCiAJLyogaGNpX3N0X29wZW4oKSBmdW5jdGlvbiBuZWVkcyB2YWx1ZSBvZiAnZGF0YScgdG8ga25vdwogCSAqIHRoZSByZWdpc3RyYXRpb24gc3RhdHVzKHN1Y2Nlc3MvZmFpbCksU28gaGF2ZSBhIGJhY2sKIAkgKiB1cCBvZiBpdC4KIAkgKi8KLQloc3QtPnN0cmVnX2NiZGF0YSA9IGRhdGE7CisJbGhzdC0+c3RyZWdfY2JkYXRhID0gZGF0YTsKIAogCS8qIEdvdCBhIGZlZWRiYWNrIGZyb20gU1QgZm9yIEJUIGRyaXZlciByZWdpc3RyYXRpb24KIAkgKiByZXF1ZXN0LldhY2t1cCBoY2lfc3Rfb3BlbigpIGZ1bmN0aW9uIHRvIGNvbnRpbnVlCiAJICogaXQncyBvcGVuIG9wZXJhdGlvbi4KIAkgKi8KLQljb21wbGV0ZSgmaHN0LT53YWl0X2Zvcl9idGRydl9yZWdfY29tcGxldGlvbik7CisJY29tcGxldGUoJmxoc3QtPndhaXRfZm9yX2J0ZHJ2X3JlZ19jb21wbGV0aW9uKTsKIAogCUJURFJWX0FQSV9FWElUKDApOwogfQogCiAvKiBDYWxsZWQgYnkgU2hhcmVkIFRyYW5zcG9ydCBsYXllciB3aGVuIHJlY2VpdmUgZGF0YSBpcwogICogYXZhaWxhYmxlICovCi1zdGF0aWMgbG9uZyBoY2lfc3RfcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGxvbmcgaGNpX3N0X3JlY2VpdmUodm9pZCAqcHJpdl9kYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBlcnI7CiAJaW50IGxlbjsKKwlzdHJ1Y3QgaGNpX3N0ICpsaHN0ID0gKHN0cnVjdCBoY2lfc3QgKilwcml2X2RhdGE7CiAKIAlCVERSVl9BUElfU1RBUlQoKTsKIApAQCAtMTE2LDEzICsxMTgsMTMgQEAKIAkJQlREUlZfQVBJX0VYSVQoLUVGQVVMVCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlpZiAoIWhzdCkgeworCWlmICghbGhzdCkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJQlRfRFJWX0VSUigiSW52YWxpZCBoY2lfc3QgbWVtb3J5LGZyZWVpbmcgU0tCIik7CiAJCUJURFJWX0FQSV9FWElUKC1FRkFVTFQpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JaWYgKCF0ZXN0X2JpdChCVF9EUlZfUlVOTklORywgJmhzdC0+ZmxhZ3MpKSB7CisJaWYgKCF0ZXN0X2JpdChCVF9EUlZfUlVOTklORywgJmxoc3QtPmZsYWdzKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJQlRfRFJWX0VSUigiRGV2aWNlIGlzIG5vdCBydW5uaW5nLGZyZWVpbmcgU0tCIik7CiAJCUJURFJWX0FQSV9FWElUKC1FSU5WQUwpOwpAQCAtMTMwLDcgKzEzMiw3IEBACiAJfQogCiAJbGVuID0gc2tiLT5sZW47Ci0Jc2tiLT5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiloc3QtPmhkZXY7CisJc2tiLT5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilsaHN0LT5oZGV2OwogCiAJLyogRm9yd2FyZCBza2IgdG8gSENJIENPUkUgbGF5ZXIgKi8KIAllcnIgPSBoY2lfcmVjdl9mcmFtZShza2IpOwpAQCAtMTQxLDcgKzE0Myw3IEBACiAJCUJURFJWX0FQSV9FWElUKGVycik7CiAJCXJldHVybiBlcnI7CiAJfQotCWhzdC0+aGRldi0+c3RhdC5ieXRlX3J4ICs9IGxlbjsKKwlsaHN0LT5oZGV2LT5zdGF0LmJ5dGVfcnggKz0gbGVuOwogCiAJQlREUlZfQVBJX0VYSVQoMCk7CiAJcmV0dXJuIDA7CkBAIC0xODksOSArMTkxLDE0IEBACiAJICogbWFrZSBpdCBhcyBOVUxMICovCiAJaGNpX3N0X3Byb3RvLndyaXRlID0gTlVMTDsKIAorCS8qIHNlbmQgaW4gdGhlIGhzdCB0byBiZSByZWNlaXZlZCBhdCByZWdpc3RyYXRpb24gY29tcGxldGUgY2FsbGJhY2sKKwkgKiBhbmQgZHVyaW5nIHN0J3MgcmVjZWl2ZQorCSAqLworCWhjaV9zdF9wcm90by5wcml2X2RhdGEgPSBoc3Q7CisKIAkvKiBSZWdpc3RlciB3aXRoIFNUIGxheWVyICovCiAJZXJyID0gc3RfcmVnaXN0ZXIoJmhjaV9zdF9wcm90byk7Ci0JaWYgKGVyciA9PSBTVF9FUlJfUEVORElORykgeworCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKSB7CiAJCS8qIFByZXBhcmUgd2FpdC1mb3ItY29tcGxldGlvbiBoYW5kbGVyIGRhdGEgc3RydWN0dXJlcy4KIAkJICogTmVlZGVkIHRvIHN5bmNyb25pemUgdGhpcyBhbmQgc3RfcmVnaXN0cmF0aW9uX2NvbXBsZXRpb25fY2IoKQogCQkgKiBmdW5jdGlvbnMuCkBAIC0yMzIsNyArMjM5LDcgQEAKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJCWVyciA9IDA7Ci0JfSBlbHNlIGlmIChlcnIgPT0gU1RfRVJSX0ZBSUxVUkUpIHsKKwl9IGVsc2UgaWYgKGVyciA9PSAtMSkgewogCQlCVF9EUlZfRVJSKCJzdF9yZWdpc3RlciBmYWlsZWQgJWQiLCBlcnIpOwogCQlCVERSVl9BUElfRVhJVCgtRUFHQUlOKTsKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC0yODAsNyArMjg3LDcgQEAKIAkvKiBVbnJlZ2lzdGVyIGZyb20gU1QgbGF5ZXIgKi8KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJUX1NUX1JFR0lTVEVSRUQsICZoc3QtPmZsYWdzKSkgewogCQllcnIgPSBzdF91bnJlZ2lzdGVyKFNUX0JUKTsKLQkJaWYgKGVyciAhPSBTVF9TVUNDRVNTKSB7CisJCWlmIChlcnIgIT0gMCkgewogCQkJQlRfRFJWX0VSUigic3RfdW5yZWdpc3RlciBmYWlsZWQgJWQiLCBlcnIpOwogCQkJQlREUlZfQVBJX0VYSVQoLUVCVVNZKTsKIAkJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdC5oCmluZGV4IGU4ZmM5N2UuLjk5NTI1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdC5oCkBAIC0yNCwyNCArMjQsMjQgQEAKICNkZWZpbmUgU1RfSAogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0vKgotICogc3QuaAotICovCiAKIC8qIFRPRE86CiAgKiBNb3ZlIHRoZSBmb2xsb3dpbmcgdG8gdHR5LmggdXBvbiBhY2NlcHRhbmNlCiAgKi8KICNkZWZpbmUgTl9USV9XTAkyMAkvKiBMZGlzYyBmb3IgVEkncyBXTCBCVCwgRk0sIEdQUyBjb21ibyBjaGlwcyAqLwogCi0vKiBzb21lIGdwaW9zIGhhdmUgYWN0aXZlIGhpZ2gsIG90aGVycyBsaWtlIGZtIGhhdmUKLSAqIGFjdGl2ZSBsb3cKKy8qKgorICogZW51bSBraW1fZ3Bpb19zdGF0ZSAtIEZldyBwcm90b2NvbHMgc3VjaCBhcyBGTSBoYXZlIEFDVElWRSBMT1cKKyAqCWdwaW8gc3RhdGVzIGZvciB0aGVpciBjaGlwL2NvcmUgZW5hYmxlIGdwaW9zCiAgKi8KIGVudW0ga2ltX2dwaW9fc3RhdGUgewogCUtJTV9HUElPX0lOQUNUSVZFLAogCUtJTV9HUElPX0FDVElWRSwKIH07Ci0vKgotICogdGhlIGxpc3Qgb2YgcHJvdG9jb2xzIG9uIGNoaXAKKworLyoqCisgKiBlbnVtIHByb3RvLXR5cGUgLSBUaGUgcHJvdG9jb2wgb24gV2lMaW5rIGNoaXBzIHdoaWNoIHNoYXJlIGEKKyAqCWNvbW1vbiBwaHlzaWNhbCBpbnRlcmZhY2UgbGlrZSBVQVJULgogICovCiBlbnVtIHByb3RvX3R5cGUgewogCVNUX0JULApAQCAtNTAsNDEgKzUwLDM1IEBACiAJU1RfTUFYLAogfTsKIAotZW51bSB7Ci0JU1RfRVJSX0ZBSUxVUkUgPSAtMSwJLyogY2hlY2sgc3RydWN0ICovCi0JU1RfU1VDQ0VTUywKLQlTVF9FUlJfUEVORElORyA9IC01LAkvKiB0byBjYWxsIHJlZ19jb21wbGV0ZV9jYiAqLwotCVNUX0VSUl9BTFJFQURZLAkJLyogYWxyZWFkeSByZWdpc3RlcmVkICovCi0JU1RfRVJSX0lOUFJPR1JFU1MsCi0JU1RfRVJSX05PUFJPVE8sCQkvKiBwcm90b2NvbCBub3Qgc3VwcG9ydGVkICovCi19OwotCi0vKiBwZXIgcHJvdG9jb2wgc3RydWN0dXJlCi0gKiBmb3IgQlQvRk0gYW5kIEdQUworLyoqCisgKiBzdHJ1Y3Qgc3RfcHJvdG9fcyAtIFBlciBQcm90b2NvbCBzdHJ1Y3R1cmUgZnJvbSBCVC9GTS9HUFMgdG8gU1QKKyAqIEB0eXBlOiB0eXBlIG9mIHRoZSBwcm90b2NvbCBiZWluZyByZWdpc3RlcmVkIGFtb25nIHRoZQorICoJYXZhaWxhYmxlIHByb3RvX3R5cGUoQlQsIEZNLCBHUFMgdGhlIHByb3RvY29sIHdoaWNoIHNoYXJlIFRUWSkuCisgKiBAcmVjdjogdGhlIHJlY2VpdmVyIGNhbGxiYWNrIHBvaW50aW5nIHRvIGEgZnVuY3Rpb24gaW4gdGhlCisgKglwcm90b2NvbCBkcml2ZXJzIGNhbGxlZCBieSB0aGUgU1QgZHJpdmVyIHVwb24gcmVjZWl2aW5nCisgKglyZWxldmFudCBkYXRhLgorICogQG1hdGNoX3BhY2tldDogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UsIHRvIG1ha2UgU1QgbW9yZSBnZW5lcmljCisgKiBAcmVnX2NvbXBsZXRlX2NiOiBjYWxsYmFjayBoYW5kbGVyIHBvaW50aW5nIHRvIGEgZnVuY3Rpb24gaW4gcHJvdG9jb2wKKyAqCWhhbmRsZXIgY2FsbGVkIGJ5IFNUIHdoZW4gdGhlIHBlbmRpbmcgcmVnaXN0cmF0aW9ucyBhcmUgY29tcGxldGUuCisgKglUaGUgcmVnaXN0cmF0aW9ucyBhcmUgbWFya2VkIHBlbmRpbmcsIGluIHNpdHVhdGlvbnMgd2hlbiBmdworICoJZG93bmxvYWQgaXMgaW4gcHJvZ3Jlc3MuCisgKiBAd3JpdGU6IHBvaW50ZXIgdG8gZnVuY3Rpb24gaW4gU1QgcHJvdmlkZWQgdG8gcHJvdG9jb2wgZHJpdmVycyBmcm9tIFNULAorICoJdG8gYmUgbWFkZSB1c2Ugd2hlbiBwcm90b2NvbCBkcml2ZXJzIGhhdmUgZGF0YSB0byBzZW5kIHRvIFRUWS4KKyAqIEBwcml2X2RhdGE6IHByaXZkYXRlIGRhdGEgaG9sZGVyIGZvciB0aGUgcHJvdG9jb2wgZHJpdmVycywgc2VudAorICoJZnJvbSB0aGUgcHJvdG9jb2wgZHJpdmVycyBkdXJpbmcgcmVnaXN0cmF0aW9uLCBhbmQgc2VudCBiYWNrIG9uCisgKglyZWdfY29tcGxldGVfY2IgYW5kIHJlY3YuCiAgKi8KIHN0cnVjdCBzdF9wcm90b19zIHsKIAllbnVtIHByb3RvX3R5cGUgdHlwZTsKLS8qCi0gKiB0byBiZSBjYWxsZWQgYnkgU1Qgd2hlbiBkYXRhIGFycml2ZXMKLSAqLwotCWxvbmcgKCpyZWN2KSAoc3RydWN0IHNrX2J1ZmYgKik7Ci0vKgotICogZm9yIGZ1dHVyZSB1c2UsIGxvZ2ljIG5vdyB0byBiZSBpbiBTVAotICovCisJbG9uZyAoKnJlY3YpICh2b2lkICosIHN0cnVjdCBza19idWZmICopOwogCXVuc2lnbmVkIGNoYXIgKCptYXRjaF9wYWNrZXQpIChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKLS8qCi0gKiBzdWJzZXF1ZW50IHJlZ2lzdHJhdGlvbiByZXR1cm4gUEVORElORywKLSAqIHNpZ25hbGxlZCBjb21wbGV0ZSBieSB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKi8KLQl2b2lkICgqcmVnX2NvbXBsZXRlX2NiKSAoY2hhciBkYXRhKTsKLS8qCi0gKiB3cml0ZSBmdW5jdGlvbiwgc2VudCBpbiBhcyBOVUxMIGFuZCB0byBiZSByZXR1cm5lZCB0bwotICogcHJvdG9jb2wgZHJpdmVycwotICovCisJdm9pZCAoKnJlZ19jb21wbGV0ZV9jYikgKHZvaWQgKiwgY2hhciBkYXRhKTsKIAlsb25nICgqd3JpdGUpIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwl2b2lkICpwcml2X2RhdGE7CiB9OwogCi1leHRlcm4gbG9uZyBzdF9yZWdpc3RlcihzdHJ1Y3Qgc3RfcHJvdG9fcyAqbmV3X3Byb3RvKTsKLWV4dGVybiBsb25nIHN0X3VucmVnaXN0ZXIoZW51bSBwcm90b190eXBlIHR5cGUpOworZXh0ZXJuIGxvbmcgc3RfcmVnaXN0ZXIoc3RydWN0IHN0X3Byb3RvX3MgKik7CitleHRlcm4gbG9uZyBzdF91bnJlZ2lzdGVyKGVudW0gcHJvdG9fdHlwZSk7CiAKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzdF9nZXRfcGxhdF9kZXZpY2Uodm9pZCk7CiAjZW5kaWYgLyogU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdF9jb3JlLmMKaW5kZXggNGU5MzY5NC4uMDYzYzliMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfY29yZS5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAic3RfbGwuaCIKICNpbmNsdWRlICJzdC5oIgogCi0jaWZkZWYgREVCVUcKKyNkZWZpbmUgVkVSQk9TRQogLyogc3RyaW5ncyB0byBiZSB1c2VkIGZvciByZmtpbGwgZW50cmllcyBhbmQgYnkKICAqIFNUIENvcmUgdG8gYmUgdXNlZCBmb3Igc3lzZnMgZGVidWcgZW50cnkKICAqLwpAQCAtNDgsNyArNDgsNiBAQAogCVBST1RPX0VOVFJZKFNUX0ZNLCAiRk0iKSwKIAlQUk9UT19FTlRSWShTVF9HUFMsICJHUFMiKSwKIH07Ci0jZW5kaWYKIC8qIGZ1bmN0aW9uIHBvaW50ZXIgcG9pbnRpbmcgdG8gZWl0aGVyLAogICogc3Rfa2ltX3JlY3YgZHVyaW5nIHJlZ2lzdHJhdGlvbiB0byByZWNlaXZlIGZ3IGRvd25sb2FkIHJlc3BvbnNlcwogICogc3RfaW50X3JlY3YgYWZ0ZXIgcmVnaXN0cmF0aW9uIHRvIHJlY2VpdmUgcHJvdG8gc3RhY2sgcmVzcG9uc2VzCkBAIC02MSw3ICs2MCw3IEBACiBib29sIGlzX3Byb3RvY29sX2xpc3RfZW1wdHkodm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGkgPSAwOwotCXByX2luZm8oIiAlcyAiLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoIiAlcyAiLCBfX2Z1bmNfXyk7CiAJZm9yIChpID0gMDsgaSA8IFNUX01BWDsgaSsrKSB7CiAJCWlmIChzdF9nZGF0YS0+bGlzdFtpXSAhPSBOVUxMKQogCQkJcmV0dXJuIFNUX05PVEVNUFRZOwpAQCAtNzEsNiArNzAsNyBAQAogCXJldHVybiBTVF9FTVBUWTsKIH0KICNlbmRpZgorCiAvKiBjYW4gYmUgY2FsbGVkIGluIGZyb20KICAqIC0tIEtJTSAoZHVyaW5nIGZ3IGRvd25sb2FkKQogICogLS0gU1QgQ29yZSAoZHVyaW5nIHN0X3dyaXRlKQpAQCAtODEsMjAgKzgxLDE1IEBACiBpbnQgc3RfaW50X3dyaXRlKHN0cnVjdCBzdF9kYXRhX3MgKnN0X2dkYXRhLAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBjb3VudCkKIHsKLSNpZmRlZiBWRVJCT1NFCQkJLyogZm9yIGRlYnVnICovCi0JaW50IGk7Ci0jZW5kaWYKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWlmICh1bmxpa2VseShzdF9nZGF0YSA9PSBOVUxMIHx8IHN0X2dkYXRhLT50dHkgPT0gTlVMTCkpIHsKIAkJcHJfZXJyKCJ0dHkgdW5hdmFpbGFibGUgdG8gcGVyZm9ybSB3cml0ZSIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9CiAJdHR5ID0gc3RfZ2RhdGEtPnR0eTsKICNpZmRlZiBWRVJCT1NFCi0JcHJpbnRrKEtFUk5fRVJSICJzdGFydCBkYXRhLi5cbiIpOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQkvKiBubyBuZXdsaW5lcyBmb3IgZWFjaCBkYXR1bSAqLwotCQlwcmludGsoIiAleCIsIGRhdGFbaV0pOwotCXByaW50ayhLRVJOX0VSUiAiXG4gLi5lbmQgZGF0YVxuIik7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIjxvdXQ8IiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJMTYsIDEsIGRhdGEsIGNvdW50LCAwKTsKICNlbmRpZgogCXJldHVybiB0dHktPm9wcy0+d3JpdGUodHR5LCBkYXRhLCBjb3VudCk7CiAKQEAgLTEyMiw4ICsxMTcsMTAgQEAKIAkgKiAgIHByb3RvY29sIHN0YWNrIGRyaXZlcgogCSAqLwogCWlmIChsaWtlbHkoc3RfZ2RhdGEtPmxpc3RbcHJvdG9pZF0tPnJlY3YgIT0gTlVMTCkpIHsKLQkJaWYgKHVubGlrZWx5KHN0X2dkYXRhLT5saXN0W3Byb3RvaWRdLT5yZWN2KHN0X2dkYXRhLT5yeF9za2IpCi0JCQkgICAgICE9IFNUX1NVQ0NFU1MpKSB7CisJCWlmICh1bmxpa2VseQorCQkJKHN0X2dkYXRhLT5saXN0W3Byb3RvaWRdLT5yZWN2CisJCQkoc3RfZ2RhdGEtPmxpc3RbcHJvdG9pZF0tPnByaXZfZGF0YSwgc3RfZ2RhdGEtPnJ4X3NrYikKKwkJCSAgICAgIT0gMCkpIHsKIAkJCXByX2VycigiIHByb3RvIHN0YWNrICVkJ3MgLT5yZWN2IGZhaWxlZCIsIHByb3RvaWQpOwogCQkJa2ZyZWVfc2tiKHN0X2dkYXRhLT5yeF9za2IpOwogCQkJcmV0dXJuOwpAQCAtMTMyLDExICsxMjksMTEgQEAKIAkJcHJfZXJyKCIgcHJvdG8gc3RhY2sgJWQncyAtPnJlY3YgbnVsbCIsIHByb3RvaWQpOwogCQlrZnJlZV9za2Ioc3RfZ2RhdGEtPnJ4X3NrYik7CiAJfQotCXByX2luZm8oIiBkb25lICVzIiwgX19mdW5jX18pOwogCXJldHVybjsKIH0KIAotLyoKKy8qKgorICogc3RfcmVnX2NvbXBsZXRlIC0KICAqIHRvIGNhbGwgcmVnaXN0cmF0aW9uIGNvbXBsZXRlIGNhbGxiYWNrcwogICogb2YgYWxsIHByb3RvY29sIHN0YWNrIGRyaXZlcnMKICAqLwpAQCAtMTQ3LDcgKzE0NCw4IEBACiAJZm9yIChpID0gMDsgaSA8IFNUX01BWDsgaSsrKSB7CiAJCWlmIChsaWtlbHkoc3RfZ2RhdGEgIT0gTlVMTCAmJiBzdF9nZGF0YS0+bGlzdFtpXSAhPSBOVUxMICYmCiAJCQkgICBzdF9nZGF0YS0+bGlzdFtpXS0+cmVnX2NvbXBsZXRlX2NiICE9IE5VTEwpKQotCQkJc3RfZ2RhdGEtPmxpc3RbaV0tPnJlZ19jb21wbGV0ZV9jYihlcnIpOworCQkJc3RfZ2RhdGEtPmxpc3RbaV0tPnJlZ19jb21wbGV0ZV9jYgorCQkJCShzdF9nZGF0YS0+bGlzdFtpXS0+cHJpdl9kYXRhLCBlcnIpOwogCX0KIH0KIApAQCAtMTU2LDcgKzE1NCw3IEBACiB7CiAJcmVnaXN0ZXIgaW50IHJvb20gPSBza2JfdGFpbHJvb20oc3RfZ2RhdGEtPnJ4X3NrYik7CiAKLQlwcl9pbmZvKCJsZW4gJWQgcm9vbSAlZCIsIGxlbiwgcm9vbSk7CisJcHJfZGVidWcoImxlbiAlZCByb29tICVkIiwgbGVuLCByb29tKTsKIAogCWlmICghbGVuKSB7CiAJCS8qIFJlY2VpdmVkIHBhY2tldCBoYXMgb25seSBwYWNrZXQgaGVhZGVyIGFuZApAQCAtMTkwLDggKzE4OCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIGludGVybmFsIGZ1bmN0aW9uIGZvciBhY3Rpb24gd2hlbiB3YWtlLXVwIGFjawotICogcmVjZWl2ZWQKKy8qKgorICogc3Rfd2FrZXVwX2FjayAtIGludGVybmFsIGZ1bmN0aW9uIGZvciBhY3Rpb24gd2hlbiB3YWtlLXVwIGFjaworICoJcmVjZWl2ZWQKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHN0X3dha2V1cF9hY2soc3RydWN0IHN0X2RhdGFfcyAqc3RfZ2RhdGEsCiAJdW5zaWduZWQgY2hhciBjbWQpCkBAIC0yMTQsOSArMjEzLDEzIEBACiAJc3RfdHhfd2FrZXVwKHN0X2dkYXRhKTsKIH0KIAotLyogRGVjb2RlcyByZWNlaXZlZCBSQVcgZGF0YSBhbmQgZm9yd2FyZHMgdG8gY29ycmVzcG9uZGluZwotICogY2xpZW50IGRyaXZlcnMgKEJsdWV0b290aCxGTSxHUFMuLmV0YykuCi0gKgorLyoqCisgKiBzdF9pbnRfcmVjdiAtIFNUJ3MgaW50ZXJuYWwgcmVjZWl2ZSBmdW5jdGlvbi4KKyAqCURlY29kZXMgcmVjZWl2ZWQgUkFXIGRhdGEgYW5kIGZvcndhcmRzIHRvIGNvcnJlc3BvbmRpbmcKKyAqCWNsaWVudCBkcml2ZXJzIChCbHVldG9vdGgsRk0sR1BTLi5ldGMpLgorICoJVGhpcyBjYW4gcmVjZWl2ZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2tldHMsCisgKglIQ0ktRXZlbnRzLCBBQ0wsIFNDTywgNCB0eXBlcyBvZiBIQ0ktTEwgUE0gcGFja2V0cworICoJQ0gtOCBwYWNrZXRzIGZyb20gRk0sIENILTkgcGFja2V0cyBmcm9tIEdQUyBjb3Jlcy4KICAqLwogdm9pZCBzdF9pbnRfcmVjdih2b2lkICpkaXNjX2RhdGEsCiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgbG9uZyBjb3VudCkKQEAgLTI1OSw3ICsyNjIsNyBAQAogCiAJCQkJLyogV2FpdGluZyBmb3IgY29tcGxldGUgcGFja2V0ID8gKi8KIAkJCWNhc2UgU1RfQlRfVzRfREFUQToKLQkJCQlwcl9pbmZvKCJDb21wbGV0ZSBwa3QgcmVjZWl2ZWQiKTsKKwkJCQlwcl9kZWJ1ZygiQ29tcGxldGUgcGt0IHJlY2VpdmVkIik7CiAKIAkJCQkvKiBBc2sgU1QgQ09SRSB0byBmb3J3YXJkCiAJCQkJICogdGhlIHBhY2tldCB0byBwcm90b2NvbCBkcml2ZXIgKi8KQEAgLTI3NSw3ICsyNzgsNyBAQAogCQkJCWVoID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopc3RfZ2RhdGEtPnJ4X3NrYi0+CiAJCQkJICAgIGRhdGE7CiAKLQkJCQlwcl9pbmZvKCJFdmVudCBoZWFkZXI6IGV2dCAweCUyLjJ4IgorCQkJCXByX2RlYnVnKCJFdmVudCBoZWFkZXI6IGV2dCAweCUyLjJ4IgogCQkJCQkgICAicGxlbiAlZCIsIGVoLT5ldnQsIGVoLT5wbGVuKTsKIAogCQkJCXN0X2NoZWNrX2RhdGFfbGVuKHN0X2dkYXRhLCBwcm90b2lkLCBlaC0+cGxlbik7CkBAIC00MzksNDUgKzQ0Miw0MyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcHJfaW5mbygiZG9uZSAlcyIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZG9uZSAlcyIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiAKLS8qIGludGVybmFsIGRlLVEgZnVuY3Rpb24KLSAqIC0tIHJldHVybiBwcmV2aW91cyBpbi1jb21wbGV0ZWx5IHdyaXR0ZW4gc2tiCi0gKiAgb3IgcmV0dXJuIHRoZSBza2IgaW4gdGhlIHR4UQorLyoqCisgKiBzdF9pbnRfZGVxdWV1ZSAtIGludGVybmFsIGRlLVEgZnVuY3Rpb24uCisgKglJZiB0aGUgcHJldmlvdXMgZGF0YSBzZXQgd2FzIG5vdCB3cml0dGVuCisgKgljb21wbGV0ZWx5LCByZXR1cm4gdGhhdCBza2Igd2hpY2ggaGFzIHRoZSBwZW5kaW5nIGRhdGEuCisgKglJbiBub3JtYWwgY2FzZXMsIHJldHVybiB0b3Agb2YgdHhxLgogICovCiBzdHJ1Y3Qgc2tfYnVmZiAqc3RfaW50X2RlcXVldWUoc3RydWN0IHN0X2RhdGFfcyAqc3RfZ2RhdGEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnJldHVybmluZ19za2I7CiAKLQlwcl9pbmZvKCIlcyIsIF9fZnVuY19fKTsKLQkvKiBpZiB0aGUgcHJldmlvdXMgc2tiIHdhc24ndCB3cml0dGVuIGNvbXBsZXRlbHkKLQkgKi8KKwlwcl9kZWJ1ZygiJXMiLCBfX2Z1bmNfXyk7CiAJaWYgKHN0X2dkYXRhLT50eF9za2IgIT0gTlVMTCkgewogCQlyZXR1cm5pbmdfc2tiID0gc3RfZ2RhdGEtPnR4X3NrYjsKIAkJc3RfZ2RhdGEtPnR4X3NrYiA9IE5VTEw7CiAJCXJldHVybiByZXR1cm5pbmdfc2tiOwogCX0KLQotCS8qIGRlLVEgZnJvbSB0aGUgdHhRIGFsd2F5cyBpZiBwcmV2aW91cyB3cml0ZSBpcyBjb21wbGV0ZSAqLwogCXJldHVybiBza2JfZGVxdWV1ZSgmc3RfZ2RhdGEtPnR4cSk7CiB9CiAKLS8qIGludGVybmFsIFEtaW5nIGZ1bmN0aW9uCi0gKiB3aWxsIGVpdGhlciBRIHRoZSBza2IgdG8gdHhxIG9yIHRoZSB0eF93YWl0cQotICogZGVwZW5kaW5nIG9uIHRoZSBTVCBMTCBzdGF0ZQotICoKLSAqIGxvY2sgdGhlIHdob2xlIGZ1bmMgLSBzaW5jZSBsbF9nZXRzdGF0ZSBhbmQgUS1pbmcgc2hvdWxkIGhhcHBlbgotICogaW4gb25lLXNob3QKKy8qKgorICogc3RfaW50X2VucXVldWUgLSBpbnRlcm5hbCBRLWluZyBmdW5jdGlvbi4KKyAqCVdpbGwgZWl0aGVyIFEgdGhlIHNrYiB0byB0eHEgb3IgdGhlIHR4X3dhaXRxCisgKglkZXBlbmRpbmcgb24gdGhlIFNUIExMIHN0YXRlLgorICoJSWYgdGhlIGNoaXAgaXMgYXNsZWVwLCB0aGVuIFEgaXQgb250byB3YWl0cSBhbmQKKyAqCXdha2V1cCB0aGUgY2hpcC4KKyAqCXR4cSBhbmQgd2FpdHEgbmVlZHMgcHJvdGVjdGlvbiBzaW5jZSB0aGUgb3RoZXIgY29udGV4dHMKKyAqCW1heSBiZSBzZW5kaW5nIGRhdGEsIHdha2luZyB1cCBjaGlwLgogICovCiB2b2lkIHN0X2ludF9lbnF1ZXVlKHN0cnVjdCBzdF9kYXRhX3MgKnN0X2dkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCi0JcHJfaW5mbygiJXMiLCBfX2Z1bmNfXyk7Ci0JLyogdGhpcyBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCBpbiBtb3JlIHRoZW4gb25lIGNvbnRleHQuCi0JICogc28gaGF2ZSBhIGxvY2sgKi8KKwlwcl9kZWJ1ZygiJXMiLCBfX2Z1bmNfXyk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHN0X2xsX2dldHN0YXRlKHN0X2dkYXRhKSkgewpAQCAtNDg4LDE2ICs0ODksMTIgQEAKIAljYXNlIFNUX0xMX0FTTEVFUF9UT19BV0FLRToKIAkJc2tiX3F1ZXVlX3RhaWwoJnN0X2dkYXRhLT50eF93YWl0cSwgc2tiKTsKIAkJYnJlYWs7Ci0JY2FzZSBTVF9MTF9BV0FLRV9UT19BU0xFRVA6CS8qIGhvc3QgY2Fubm90IGJlIGluIHRoaXMgc3RhdGUgKi8KKwljYXNlIFNUX0xMX0FXQUtFX1RPX0FTTEVFUDoKIAkJcHJfZXJyKCJTVCBMTCBpcyBpbGxlZ2FsIHN0YXRlKCVsZCksIgogCQkJICAgInB1cmdpbmcgcmVjZWl2ZWQgc2tiLiIsIHN0X2xsX2dldHN0YXRlKHN0X2dkYXRhKSk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlicmVhazsKLQogCWNhc2UgU1RfTExfQVNMRUVQOgotCQkvKiBjYWxsIGEgZnVuY3Rpb24gb2YgU1QgTEwgdG8gcHV0IGRhdGEKLQkJICogaW4gdHhfd2FpdFEgYW5kIHdha2VfaW5kIGluIHR4UQotCQkgKi8KIAkJc2tiX3F1ZXVlX3RhaWwoJnN0X2dkYXRhLT50eF93YWl0cSwgc2tiKTsKIAkJc3RfbGxfd2FrZXVwKHN0X2dkYXRhKTsKIAkJYnJlYWs7CkBAIC01MDcsOCArNTA0LDkgQEAKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWJyZWFrOwogCX0KKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7Ci0JcHJfaW5mbygiZG9uZSAlcyIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZG9uZSAlcyIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiAKQEAgLTUyMiw3ICs1MjAsNyBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZm9yIGlycSBzYXZlIGZsYWdzICovCi0JcHJfaW5mbygiJXMiLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoIiVzIiwgX19mdW5jX18pOwogCS8qIGNoZWNrIGZvciBzZW5kaW5nICYgc2V0IGZsYWcgc2VuZGluZyBoZXJlICovCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoU1RfVFhfU0VORElORywgJnN0X2RhdGEtPnR4X3N0YXRlKSkgewogCQlwcl9pbmZvKCJTVCBhbHJlYWR5IHNlbmRpbmciKTsKQEAgLTU2MywzMyArNTYxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBmdW5jdGlvbnMgY2FsbGVkIGZyb20gU1QgS0lNCiAqLwotdm9pZCBraW1fc3RfbGlzdF9wcm90b2NvbHMoc3RydWN0IHN0X2RhdGFfcyAqc3RfZ2RhdGEsIGNoYXIgKmJ1ZikKK3ZvaWQga2ltX3N0X2xpc3RfcHJvdG9jb2xzKHN0cnVjdCBzdF9kYXRhX3MgKnN0X2dkYXRhLCB2b2lkICpidWYpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0jaWZkZWYgREVCVUcKLQl1bnNpZ25lZCBjaGFyIGkgPSBTVF9NQVg7Ci0jZW5kaWYKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RfZ2RhdGEtPmxvY2ssIGZsYWdzKTsKLSNpZmRlZiBERUJVRwkJCS8qIG1vcmUgZGV0YWlsZWQgbG9nICovCi0JZm9yIChpID0gMDsgaSA8IFNUX01BWDsgaSsrKSB7Ci0JCWlmIChpID09IDApIHsKLQkJCXNwcmludGYoYnVmLCAiJXMgaXMgJXMiLCBwcm90b2NvbF9zdHJuZ3NbaV0sCi0JCQkJc3RfZ2RhdGEtPmxpc3RbaV0gIT0KLQkJCQlOVUxMID8gIlJlZ2lzdGVyZWQiIDogIlVucmVnaXN0ZXJlZCIpOwotCQl9IGVsc2UgewotCQkJc3ByaW50ZihidWYsICIlc1xuJXMgaXMgJXMiLCBidWYsIHByb3RvY29sX3N0cm5nc1tpXSwKLQkJCQlzdF9nZGF0YS0+bGlzdFtpXSAhPQotCQkJCU5VTEwgPyAiUmVnaXN0ZXJlZCIgOiAiVW5yZWdpc3RlcmVkIik7Ci0JCX0KLQl9Ci0Jc3ByaW50ZihidWYsICIlc1xuIiwgYnVmKTsKLSNlbHNlIC8qIGxpbWl0ZWQgaW5mbyAqLwotCXNwcmludGYoYnVmLCAiQlQ9JWNcbkZNPSVjXG5HUFM9JWNcbiIsCi0JCXN0X2dkYXRhLT5saXN0W1NUX0JUXSAhPSBOVUxMID8gJ1InIDogJ1UnLAotCQlzdF9nZGF0YS0+bGlzdFtTVF9GTV0gIT0gTlVMTCA/ICdSJyA6ICdVJywKLQkJc3RfZ2RhdGEtPmxpc3RbU1RfR1BTXSAhPSBOVUxMID8gJ1InIDogJ1UnKTsKLSNlbmRpZgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7CisJc2VxX3ByaW50ZihidWYsICJbJWRdXG5CVD0lY1xuRk09JWNcbkdQUz0lY1xuIiwKKwkJCXN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZCwKKwkJCXN0X2dkYXRhLT5saXN0W1NUX0JUXSAhPSBOVUxMID8gJ1InIDogJ1UnLAorCQkJc3RfZ2RhdGEtPmxpc3RbU1RfRk1dICE9IE5VTEwgPyAnUicgOiAnVScsCisJCQlzdF9nZGF0YS0+bGlzdFtTVF9HUFNdICE9IE5VTEwgPyAnUicgOiAnVScpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MDAsNyArNTc4LDcgQEAKIGxvbmcgc3RfcmVnaXN0ZXIoc3RydWN0IHN0X3Byb3RvX3MgKm5ld19wcm90bykKIHsKIAlzdHJ1Y3Qgc3RfZGF0YV9zCSpzdF9nZGF0YTsKLQlsb25nIGVyciA9IFNUX1NVQ0NFU1M7CisJbG9uZyBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJc3Rfa2ltX3JlZigmc3RfZ2RhdGEpOwpAQCAtNjA4LDE3ICs1ODYsMTcgQEAKIAlpZiAoc3RfZ2RhdGEgPT0gTlVMTCB8fCBuZXdfcHJvdG8gPT0gTlVMTCB8fCBuZXdfcHJvdG8tPnJlY3YgPT0gTlVMTAogCSAgICB8fCBuZXdfcHJvdG8tPnJlZ19jb21wbGV0ZV9jYiA9PSBOVUxMKSB7CiAJCXByX2VycigiZ2RhdGEvbmV3X3Byb3RvL3JlY3Ygb3IgcmVnX2NvbXBsZXRlX2NiIG5vdCByZWFkeSIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAobmV3X3Byb3RvLT50eXBlIDwgU1RfQlQgfHwgbmV3X3Byb3RvLT50eXBlID49IFNUX01BWCkgewogCQlwcl9lcnIoInByb3RvY29sICVkIG5vdCBzdXBwb3J0ZWQiLCBuZXdfcHJvdG8tPnR5cGUpOwotCQlyZXR1cm4gU1RfRVJSX05PUFJPVE87CisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCX0KIAogCWlmIChzdF9nZGF0YS0+bGlzdFtuZXdfcHJvdG8tPnR5cGVdICE9IE5VTEwpIHsKIAkJcHJfZXJyKCJwcm90b2NvbCAlZCBhbHJlYWR5IHJlZ2lzdGVyZWQiLCBuZXdfcHJvdG8tPnR5cGUpOwotCQlyZXR1cm4gU1RfRVJSX0FMUkVBRFk7CisJCXJldHVybiAtRUFMUkVBRFk7CiAJfQogCiAJLyogY2FuIGJlIGZyb20gcHJvY2VzcyBjb250ZXh0IG9ubHkgKi8KQEAgLTYzMCwxMSArNjA4LDEyIEBACiAJCXN0X2tpbV9jaGlwX3RvZ2dsZShuZXdfcHJvdG8tPnR5cGUsIEtJTV9HUElPX0FDVElWRSk7CiAKIAkJc3RfZ2RhdGEtPmxpc3RbbmV3X3Byb3RvLT50eXBlXSA9IG5ld19wcm90bzsKKwkJc3RfZ2RhdGEtPnByb3Rvc19yZWdpc3RlcmVkKys7CiAJCW5ld19wcm90by0+d3JpdGUgPSBzdF93cml0ZTsKIAogCQlzZXRfYml0KFNUX1JFR19QRU5ESU5HLCAmc3RfZ2RhdGEtPnN0X3N0YXRlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RfZ2RhdGEtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIFNUX0VSUl9QRU5ESU5HOworCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCX0gZWxzZSBpZiAoc3RfZ2RhdGEtPnByb3Rvc19yZWdpc3RlcmVkID09IFNUX0VNUFRZKSB7CiAJCXByX2luZm8oIiBwcm90b2NvbCBsaXN0IGVtcHR5IDolZCAiLCBuZXdfcHJvdG8tPnR5cGUpOwogCQlzZXRfYml0KFNUX1JFR19JTl9QUk9HUkVTUywgJnN0X2dkYXRhLT5zdF9zdGF0ZSk7CkBAIC02NDgsMTYgKzYyNywxNiBAQAogCQkvKiB0aGlzIG1heSB0YWtlIGEgd2hpbGUgdG8gY29tcGxldGUKIAkJICogc2luY2UgaXQgaW52b2x2ZXMgQlQgZncgZG93bmxvYWQKIAkJICovCi0JCWVyciA9IHN0X2tpbV9zdGFydCgpOwotCQlpZiAoZXJyICE9IFNUX1NVQ0NFU1MpIHsKKwkJZXJyID0gc3Rfa2ltX3N0YXJ0KHN0X2dkYXRhLT5raW1fZGF0YSk7CisJCWlmIChlcnIgIT0gMCkgewogCQkJY2xlYXJfYml0KFNUX1JFR19JTl9QUk9HUkVTUywgJnN0X2dkYXRhLT5zdF9zdGF0ZSk7CiAJCQlpZiAoKHN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZCAhPSBTVF9FTVBUWSkgJiYKIAkJCSAgICAodGVzdF9iaXQoU1RfUkVHX1BFTkRJTkcsICZzdF9nZGF0YS0+c3Rfc3RhdGUpKSkgewogCQkJCXByX2VycigiIEtJTSBmYWlsdXJlIGNvbXBsZXRlIGNhbGxiYWNrICIpOwotCQkJCXN0X3JlZ19jb21wbGV0ZShzdF9nZGF0YSwgU1RfRVJSX0ZBSUxVUkUpOworCQkJCXN0X3JlZ19jb21wbGV0ZShzdF9nZGF0YSwgLTEpOwogCQkJfQogCi0JCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCQlyZXR1cm4gLTE7CiAJCX0KIAogCQkvKiB0aGUgcHJvdG9jb2wgbWlnaHQgcmVxdWlyZSBvdGhlciBncGlvcyB0byBiZSB0b2dnbGVkCkBAIC02NzIsOSArNjUxLDggQEAKIAkJICovCiAJCWlmICgoc3RfZ2RhdGEtPnByb3Rvc19yZWdpc3RlcmVkICE9IFNUX0VNUFRZKSAmJgogCQkgICAgKHRlc3RfYml0KFNUX1JFR19QRU5ESU5HLCAmc3RfZ2RhdGEtPnN0X3N0YXRlKSkpIHsKLQkJCXByX2luZm8oIiBjYWxsIHJlZyBjb21wbGV0ZSBjYWxsYmFjayAiKTsKLQkJCXN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZCsrOwotCQkJc3RfcmVnX2NvbXBsZXRlKHN0X2dkYXRhLCBTVF9TVUNDRVNTKTsKKwkJCXByX2RlYnVnKCIgY2FsbCByZWcgY29tcGxldGUgY2FsbGJhY2sgIik7CisJCQlzdF9yZWdfY29tcGxldGUoc3RfZ2RhdGEsIDApOwogCQl9CiAJCWNsZWFyX2JpdChTVF9SRUdfUEVORElORywgJnN0X2dkYXRhLT5zdF9zdGF0ZSk7CiAKQEAgLTY4NCwxMSArNjYyLDEyIEBACiAJCWlmIChzdF9nZGF0YS0+bGlzdFtuZXdfcHJvdG8tPnR5cGVdICE9IE5VTEwpIHsKIAkJCXByX2VycigiIHByb3RvICVkIGFscmVhZHkgcmVnaXN0ZXJlZCAiLAogCQkJCSAgIG5ld19wcm90by0+dHlwZSk7Ci0JCQlyZXR1cm4gU1RfRVJSX0FMUkVBRFk7CisJCQlyZXR1cm4gLUVBTFJFQURZOwogCQl9CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7CiAJCXN0X2dkYXRhLT5saXN0W25ld19wcm90by0+dHlwZV0gPSBuZXdfcHJvdG87CisJCXN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZCsrOwogCQluZXdfcHJvdG8tPndyaXRlID0gc3Rfd3JpdGU7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiBlcnI7CkBAIC03MDcsMTggKzY4NiwxOSBAQAogCQlkZWZhdWx0OgogCQkJcHJfZXJyKCIlZCBwcm90b2NvbCBub3Qgc3VwcG9ydGVkIiwKIAkJCQkgICBuZXdfcHJvdG8tPnR5cGUpOwotCQkJZXJyID0gU1RfRVJSX05PUFJPVE87CisJCQllcnIgPSAtRVBST1RPTk9TVVBQT1JUOwogCQkJLyogc29tZXRoaW5nIHdyb25nICovCiAJCQlicmVhazsKIAkJfQogCQlzdF9nZGF0YS0+bGlzdFtuZXdfcHJvdG8tPnR5cGVdID0gbmV3X3Byb3RvOworCQlzdF9nZGF0YS0+cHJvdG9zX3JlZ2lzdGVyZWQrKzsKIAkJbmV3X3Byb3RvLT53cml0ZSA9IHN0X3dyaXRlOwogCiAJCS8qIGxvY2sgYWxyZWFkeSBoZWxkIGJlZm9yZSBlbnRlcmluZyBlbHNlICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiBlcnI7CiAJfQotCXByX2luZm8oImRvbmUgJXMoJWQpICIsIF9fZnVuY19fLCBuZXdfcHJvdG8tPnR5cGUpOworCXByX2RlYnVnKCJkb25lICVzKCVkKSAiLCBfX2Z1bmNfXywgbmV3X3Byb3RvLT50eXBlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN0X3JlZ2lzdGVyKTsKIApAQCAtNzI3LDE2ICs3MDcsMTYgQEAKICAqLwogbG9uZyBzdF91bnJlZ2lzdGVyKGVudW0gcHJvdG9fdHlwZSB0eXBlKQogewotCWxvbmcgZXJyID0gU1RfU1VDQ0VTUzsKKwlsb25nIGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJc3RydWN0IHN0X2RhdGFfcwkqc3RfZ2RhdGE7CiAKLQlwcl9pbmZvKCIlczogJWQgIiwgX19mdW5jX18sIHR5cGUpOworCXByX2RlYnVnKCIlczogJWQgIiwgX19mdW5jX18sIHR5cGUpOwogCiAJc3Rfa2ltX3JlZigmc3RfZ2RhdGEpOwogCWlmICh0eXBlIDwgU1RfQlQgfHwgdHlwZSA+PSBTVF9NQVgpIHsKIAkJcHJfZXJyKCIgcHJvdG9jb2wgJWQgbm90IHN1cHBvcnRlZCIsIHR5cGUpOwotCQlyZXR1cm4gU1RfRVJSX05PUFJPVE87CisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzdF9nZGF0YS0+bG9jaywgZmxhZ3MpOwpAQCAtNzQ0LDcgKzcyNCw3IEBACiAJaWYgKHN0X2dkYXRhLT5saXN0W3R5cGVdID09IE5VTEwpIHsKIAkJcHJfZXJyKCIgcHJvdG9jb2wgJWQgbm90IHJlZ2lzdGVyZWQiLCB0eXBlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RfZ2RhdGEtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIFNUX0VSUl9OT1BST1RPOworCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIAl9CiAKIAlzdF9nZGF0YS0+cHJvdG9zX3JlZ2lzdGVyZWQtLTsKQEAgLTc2OCw3ICs3NDgsNyBAQAogCQl9CiAKIAkJLyogYWxsIHByb3RvY29scyBub3cgdW5yZWdpc3RlcmVkICovCi0JCXN0X2tpbV9zdG9wKCk7CisJCXN0X2tpbV9zdG9wKHN0X2dkYXRhLT5raW1fZGF0YSk7CiAJCS8qIGRpc2FibGUgU1QgTEwgKi8KIAkJc3RfbGxfZGlzYWJsZShzdF9nZGF0YSk7CiAJfQpAQCAtNzkxLDcgKzc3MSw3IEBACiAJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMIHx8IHN0X2dkYXRhID09IE5VTEwKIAkJfHwgc3RfZ2RhdGEtPnR0eSA9PSBOVUxMKSkgewogCQlwcl9lcnIoImRhdGEvdHR5IHVuYXZhaWxhYmxlIHRvIHBlcmZvcm0gd3JpdGUiKTsKLQkJcmV0dXJuIFNUX0VSUl9GQUlMVVJFOworCQlyZXR1cm4gLTE7CiAJfQogI2lmZGVmIERFQlVHCQkJLyogb3Blbi11cCBza2IgdG8gcmVhZCB0aGUgMXN0IGJ5dGUgKi8KIAlzd2l0Y2ggKHNrYi0+ZGF0YVswXSkgewpAQCAtODEwLDEwICs3OTAsMTAgQEAKIAlpZiAodW5saWtlbHkoc3RfZ2RhdGEtPmxpc3RbcHJvdG9pZF0gPT0gTlVMTCkpIHsKIAkJcHJfZXJyKCIgcHJvdG9jb2wgJWQgbm90IHJlZ2lzdGVyZWQsIGFuZCB3cml0aW5nPyAiLAogCQkJICAgcHJvdG9pZCk7Ci0JCXJldHVybiBTVF9FUlJfRkFJTFVSRTsKKwkJcmV0dXJuIC0xOwogCX0KICNlbmRpZgotCXByX2luZm8oIiVkIHRvIGJlIHdyaXR0ZW4iLCBza2ItPmxlbik7CisJcHJfZGVidWcoIiVkIHRvIGJlIHdyaXR0ZW4iLCBza2ItPmxlbik7CiAJbGVuID0gc2tiLT5sZW47CiAKIAkvKiBzdF9sbCB0byBkZWNpZGUgd2hlcmUgdG8gZW5xdWV1ZSB0aGUgc2tiICovCkBAIC04MzQsNyArODE0LDcgQEAKICAqLwogc3RhdGljIGludCBzdF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCWludCBlcnIgPSBTVF9TVUNDRVNTOworCWludCBlcnIgPSAwOwogCXN0cnVjdCBzdF9kYXRhX3MgKnN0X2dkYXRhOwogCXByX2luZm8oIiVzICIsIF9fZnVuY19fKTsKIApAQCAtODU1LDggKzgzNSw4IEBACiAJICogc2lnbmFsIHRvIFVJTSB2aWEgS0lNIHRoYXQgLQogCSAqIGluc3RhbGxhdGlvbiBvZiBOX1RJX1dMIGxkaXNjIGlzIGNvbXBsZXRlCiAJICovCi0Jc3Rfa2ltX2NvbXBsZXRlKCk7Ci0JcHJfaW5mbygiZG9uZSAlcyIsIF9fZnVuY19fKTsKKwlzdF9raW1fY29tcGxldGUoc3RfZ2RhdGEtPmtpbV9kYXRhKTsKKwlwcl9kZWJ1ZygiZG9uZSAlcyIsIF9fZnVuY19fKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04NzgsMTIgKzg1OCwxMyBAQAogCQkJcHJfZXJyKCIlZCBub3QgdW4tcmVnaXN0ZXJlZCIsIGkpOwogCQlzdF9nZGF0YS0+bGlzdFtpXSA9IE5VTEw7CiAJfQorCXN0X2dkYXRhLT5wcm90b3NfcmVnaXN0ZXJlZCA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RfZ2RhdGEtPmxvY2ssIGZsYWdzKTsKIAkvKgogCSAqIHNpZ25hbCB0byBVSU0gdmlhIEtJTSB0aGF0IC0KIAkgKiBOX1RJX1dMIGxkaXNjIGlzIHVuLWluc3RhbGxlZAogCSAqLwotCXN0X2tpbV9jb21wbGV0ZSgpOworCXN0X2tpbV9jb21wbGV0ZShzdF9nZGF0YS0+a2ltX2RhdGEpOwogCXN0X2dkYXRhLT50dHkgPSBOVUxMOwogCS8qIEZsdXNoIGFueSBwZW5kaW5nIGNoYXJhY3RlcnMgaW4gdGhlIGRyaXZlciBhbmQgZGlzY2lwbGluZS4gKi8KIAl0dHlfbGRpc2NfZmx1c2godHR5KTsKQEAgLTkwMCw3ICs4ODEsNyBAQAogCXN0X2dkYXRhLT5yeF9za2IgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0X2dkYXRhLT5sb2NrLCBmbGFncyk7CiAKLQlwcl9pbmZvKCIlczogZG9uZSAiLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoIiVzOiBkb25lICIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgc3RfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKQEAgLTkwOCwxMSArODg5LDggQEAKIHsKIAogI2lmZGVmIFZFUkJPU0UKLQlsb25nIGk7Ci0JcHJpbnRrKEtFUk5fRVJSICJpbmNvbWluZyBkYXRhLi4uXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJcHJpbnRrKCIgJXgiLCBkYXRhW2ldKTsKLQlwcmludGsoS0VSTl9FUlIgIlxuLi4gZGF0YSBlbmRcbiIpOworCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICI+aW4+IiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJMTYsIDEsIGRhdGEsIGNvdW50LCAwKTsKICNlbmRpZgogCiAJLyoKQEAgLTkyMCw3ICs4OTgsNyBAQAogCSAqIHRvIEtJTSBmb3IgdmFsaWRhdGlvbgogCSAqLwogCXN0X3JlY3YodHR5LT5kaXNjX2RhdGEsIGRhdGEsIGNvdW50KTsKLQlwcl9pbmZvKCJkb25lICVzIiwgX19mdW5jX18pOworCXByX2RlYnVnKCJkb25lICVzIiwgX19mdW5jX18pOwogfQogCiAvKiB3YWtlLXVwIGZ1bmN0aW9uIGNhbGxlZCBpbiBmcm9tIHRoZSBUVFkgbGF5ZXIKQEAgLTkyOSw3ICs5MDcsNyBAQAogc3RhdGljIHZvaWQgc3RfdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdAlzdF9kYXRhX3MgKnN0X2dkYXRhID0gdHR5LT5kaXNjX2RhdGE7Ci0JcHJfaW5mbygiJXMgIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlcyAiLCBfX2Z1bmNfXyk7CiAJLyogZG9uJ3QgZG8gYW4gd2FrZXVwIGZvciBub3cgKi8KIAljbGVhcl9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOwogCkBAIC05NDAsNyArOTE4LDcgQEAKIHN0YXRpYyB2b2lkIHN0X3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QJc3RfZGF0YV9zICpzdF9nZGF0YSA9IHR0eS0+ZGlzY19kYXRhOwotCXByX2luZm8oIiVzICIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiJXMgIiwgX19mdW5jX18pOwogCiAJa2ZyZWVfc2tiKHN0X2dkYXRhLT50eF9za2IpOwogCXN0X2dkYXRhLT50eF9za2IgPSBOVUxMOwpAQCAtOTc5LDcgKzk1Nyw3IEBACiAJCWtmcmVlKHN0X2xkaXNjX29wcyk7CiAJCXJldHVybiBlcnI7CiAJfQotCXByX2luZm8oInJlZ2lzdGVyZWQgbl9zaGFyZWQgbGluZSBkaXNjaXBsaW5lIik7CisJcHJfZGVidWcoInJlZ2lzdGVyZWQgbl9zaGFyZWQgbGluZSBkaXNjaXBsaW5lIik7CiAKIAlzdF9nZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdF9kYXRhX3MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0X2dkYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2NvcmUuaAppbmRleCBmMjcxYzg4Li5lMGMzMmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfY29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdF9jb3JlLmgKQEAgLTM2LDU3ICszNiw4NyBAQAogI2RlZmluZSBTVF9SRUdfUEVORElORwkJMwogI2RlZmluZSBTVF9XQUlUSU5HX0ZPUl9SRVNQCTQKIAotLyoKLSAqIGxvY2FsIGRhdGEgcmVxdWlyZWQgZm9yIFNUL0tJTS9TVC1IQ0ktTEwKKy8qKgorICogc3RydWN0IHN0X2RhdGFfcyAtIFNUIGNvcmUgaW50ZXJuYWwgc3RydWN0dXJlCisgKiBAc3Rfc3RhdGU6IGRpZmZlcmVudCBzdGF0ZXMgb2YgU1QgbGlrZSBpbml0aWFsaXppbmcsIHJlZ2lzdHJhdGlvbgorICoJaW4gcHJvZ3Jlc3MsIHRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gcmV0dXJuIHJlbGV2YW50IGVyciBjb2RlcworICoJd2hlbiBwcm90b2NvbCBkcml2ZXJzIGFyZSByZWdpc3RlcmluZy4gSXQgaXMgYWxzbyB1c2VkIHRvIHRyYWNrCisgKgl0aGUgcmVjdiBmdW5jdGlvbiwgYXMgaW4gZHVyaW5nIGZ3IGRvd25sb2FkIG9ubHkgSENJIGV2ZW50cworICoJY2FuIG9jY3VyICwgd2hlcmUgYXMgZHVyaW5nIG90aGVyIHRpbWVzIG90aGVyIGV2ZW50cyBDSDgsIENIOQorICoJY2FuIG9jY3VyLgorICogQHR0eTogdHR5IHByb3ZpZGVkIGJ5IHRoZSBUVFkgY29yZSBmb3IgbGluZSBkaXNjaXBsaW5lcy4KKyAqIEBsZGlzY19vcHM6IHRoZSBwcm9jZWR1cmVzIHRoYXQgdGhpcyBsaW5lIGRpc2NpcGxpbmUgcmVnaXN0ZXJzIHdpdGggVFRZLgorICogQHR4X3NrYjogSWYgZm9yIHNvbWUgcmVhc29uIHRoZSB0dHkncyB3cml0ZSByZXR1cm5zIGxlc3NlciBieXRlcyB3cml0dGVuCisgKgl0aGVuIHRvIG1haW50YWluIHRoZSByZXN0IG9mIGRhdGEgdG8gYmUgd3JpdHRlbiBvbiBuZXh0IGluc3RhbmNlLgorICoJVGhpcyBuZWVkcyB0byBiZSBwcm90ZWN0ZWQsIGhlbmNlIHRoZSBsb2NrIGluc2lkZSB3YWtldXAgZnVuYy4KKyAqIEB0eF9zdGF0ZTogaWYgdGhlIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiBvbnRvIHRoZSBUVFkgYW5kIHByb3RvY29sIGRyaXZlcgorICoJd2FudHMgdG8gc2VuZCBtb3JlLCBxdWV1ZSB1cCBkYXRhIGFuZCBtYXJrIHRoYXQgdGhlcmUgaXMKKyAqCW1vcmUgZGF0YSB0byBzZW5kLgorICogQGxpc3Q6IHRoZSBsaXN0IG9mIHByb3RvY29scyByZWdpc3RlcmVkLCBvbmx5IE1BWCBjYW4gZXhpc3QsIG9uZSBwcm90b2NvbAorICoJY2FuIHJlZ2lzdGVyIG9ubHkgb25jZS4KKyAqIEByeF9zdGF0ZTogc3RhdGVzIHRvIGJlIG1haW50YWluZWQgaW5zaWRlIHN0J3MgdHR5IHJlY2VpdmUKKyAqIEByeF9jb3VudDogY291bnQgdG8gYmUgbWFpbnRhaW5lZCBpbnNpZGUgc3QncyB0dHkgcmVjZWlldmUKKyAqIEByeF9za2I6IHRoZSBza2Igd2hlcmUgYWxsIGRhdGEgZm9yIGEgcHJvdG9jb2wgZ2V0cyBhY2N1bXVsYXRlZCwKKyAqCXNpbmNlIHR0eSBtaWdodCBub3QgY2FsbCByZWNlaXZlIHdoZW4gYSBjb21wbGV0ZSBldmVudCBwYWNrZXQKKyAqCWlzIHJlY2VpdmVkLCB0aGUgc3RhdGVzLCBjb3VudCBhbmQgdGhlIHNrYiBuZWVkcyB0byBiZSBtYWludGFpbmVkLgorICogQHR4cTogdGhlIGxpc3Qgb2Ygc2ticyB3aGljaCBuZWVkcyB0byBiZSBzZW50IG9udG8gdGhlIFRUWS4KKyAqIEB0eF93YWl0cTogaWYgdGhlIGNoaXAgaXMgbm90IGluIEFXQUtFIHN0YXRlLCB0aGUgc2ticyBuZWVkcyB0byBiZSBxdWV1ZWQKKyAqCXVwIGluIGhlcmUsIFBNKFdBS0VVUF9JTkQpIGRhdGEgbmVlZHMgdG8gYmUgc2VudCBhbmQgdGhlbiB0aGUgc2ticworICoJZnJvbSB3YWl0cSBjYW4gYmUgbW92ZWQgb250byB0aGUgdHhxLgorICoJTmVlZHMgbG9ja2luZyB0b28uCisgKiBAbG9jazogdGhlIGxvY2sgdG8gcHJvdGVjdCBza2JzLCBxdWV1ZXMsIGFuZCBTVCBzdGF0ZXMuCisgKiBAcHJvdG9zX3JlZ2lzdGVyZWQ6IGNvdW50IG9mIHRoZSBwcm90b2NvbHMgcmVnaXN0ZXJlZCwgYWxzbyB3aGVuIDAgdGhlCisgKgljaGlwIGVuYWJsZSBncGlvIGNhbiBiZSB0b2dnbGVkLCBhbmQgd2hlbiBpdCBjaGFuZ2VzIHRvIDEgdGhlIGZ3CisgKgluZWVkcyB0byBiZSBkb3dubG9hZGVkIHRvIGluaXRpYWxpemUgY2hpcCBzaWRlIFNULgorICogQGxsX3N0YXRlOiB0aGUgdmFyaW91cyBQTSBzdGF0ZXMgdGhlIGNoaXAgY2FuIGJlLCB0aGUgc3RhdGVzIGFyZSBub3RpZmllZAorICoJdG8gdXMsIHdoZW4gdGhlIGNoaXAgc2VuZHMgcmVsZXZhbnQgUE0gcGFja2V0cyhTTEVFUF9JTkQsIFdBS0VfSU5EKS4KKyAqIEBraW1fZGF0YTogcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgZW5jYXBzdWxhdGluZyBzdHJ1Y3R1cmUuCisgKgogICovCiBzdHJ1Y3Qgc3RfZGF0YV9zIHsKIAl1bnNpZ25lZCBsb25nIHN0X3N0YXRlOwotLyoKLSAqIGFuIGluc3RhbmNlIG9mIHR0eV9zdHJ1Y3QgJiBsZGlzYyBvcHMgdG8gbW92ZSBhcm91bmQKLSAqLwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IHR0eV9sZGlzY19vcHMgKmxkaXNjX29wczsKLS8qCi0gKiB0aGUgdHggc2tiIC0KLSAqIGlmIHRoZSBza2IgaXMgYWxyZWFkeSBkZXF1ZXVlZCBhbmQgdGhlIHR0eSBmYWlsZWQgdG8gd3JpdGUgdGhlIHNhbWUKLSAqIG1haW50YWluIHRoZSBza2IgdG8gd3JpdGUgaW4gdGhlIG5leHQgdHJhbnNhY3Rpb24KLSAqLwogCXN0cnVjdCBza19idWZmICp0eF9za2I7CiAjZGVmaW5lIFNUX1RYX1NFTkRJTkcJMQogI2RlZmluZSBTVF9UWF9XQUtFVVAJMgogCXVuc2lnbmVkIGxvbmcgdHhfc3RhdGU7Ci0vKgotICogbGlzdCBvZiBwcm90b2NvbCByZWdpc3RlcmVkCi0gKi8KIAlzdHJ1Y3Qgc3RfcHJvdG9fcyAqbGlzdFtTVF9NQVhdOwotLyoKLSAqIGxvY2sKLSAqLwogCXVuc2lnbmVkIGxvbmcgcnhfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyByeF9jb3VudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOwogCXN0cnVjdCBza19idWZmX2hlYWQgdHhxLCB0eF93YWl0cTsKLQlzcGlubG9ja190IGxvY2s7CS8qIFNUIExMIHN0YXRlIGxvY2sgICovCisJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGNoYXIJcHJvdG9zX3JlZ2lzdGVyZWQ7Ci0JdW5zaWduZWQgbG9uZyBsbF9zdGF0ZTsJLyogU1QgTEwgcG93ZXIgc3RhdGUgKi8KKwl1bnNpZ25lZCBsb25nIGxsX3N0YXRlOworCXZvaWQgKmtpbV9kYXRhOwogfTsKIAotLyogcG9pbnQgdGhpcyB0byB0dHktPmRyaXZlci0+d3JpdGUgb3IgdHR5LT5vcHMtPndyaXRlCisvKioKKyAqIHN0X2ludF93cml0ZSAtCisgKiBwb2ludCB0aGlzIHRvIHR0eS0+ZHJpdmVyLT53cml0ZSBvciB0dHktPm9wcy0+d3JpdGUKICAqIGRlcGVuZGluZyB1cG9uIHRoZSBrZXJuZWwgdmVyc2lvbgogICovCiBpbnQgc3RfaW50X3dyaXRlKHN0cnVjdCBzdF9kYXRhX3MqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgaW50KTsKLS8qIGludGVybmFsIHdyaXRlIGZ1bmN0aW9uLCBwYXNzZWQgb250byBwcm90b2NvbCBkcml2ZXJzCisKKy8qKgorICogc3Rfd3JpdGUgLQorICogaW50ZXJuYWwgd3JpdGUgZnVuY3Rpb24sIHBhc3NlZCBvbnRvIHByb3RvY29sIGRyaXZlcnMKICAqIHZpYSB0aGUgd3JpdGUgZnVuY3Rpb24gcHRyIG9mIHByb3RvY29sIHN0cnVjdAogICovCiBsb25nIHN0X3dyaXRlKHN0cnVjdCBza19idWZmICopOwotLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZyb20gU1QtTEwKLSAqLworCisvKiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZnJvbSBTVC1MTCAqLwogdm9pZCBzdF9sbF9zZW5kX2ZyYW1lKGVudW0gcHJvdG9fdHlwZSwgc3RydWN0IHNrX2J1ZmYgKik7CisKIC8qIGludGVybmFsIHdha2UgdXAgZnVuY3Rpb24gKi8KIHZvaWQgc3RfdHhfd2FrZXVwKHN0cnVjdCBzdF9kYXRhX3MgKnN0X2RhdGEpOwogCisvKiBpbml0LCBleGl0IGVudHJ5IGZ1bmNzIGNhbGxlZCBmcm9tIEtJTSAqLwogaW50IHN0X2NvcmVfaW5pdChzdHJ1Y3Qgc3RfZGF0YV9zICoqKTsKIHZvaWQgc3RfY29yZV9leGl0KHN0cnVjdCBzdF9kYXRhX3MgKik7CisKKy8qIGFzayBmb3IgcmVmZXJlbmNlIGZyb20gS0lNICovCiB2b2lkIHN0X2tpbV9yZWYoc3RydWN0IHN0X2RhdGFfcyAqKik7CiAKICNkZWZpbmUgR1BTX1NUVUJfVEVTVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2tpbS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2tpbS5jCmluZGV4IDk4Y2JhYmIuLmI0YTZjN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdF9raW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3Rfa2ltLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCkBAIC01NSwzNyArNTcsMTAgQEAKIAkJICAgfSwKIH07CiAKLSNpZm5kZWYgTEVHQUNZX1JGS0lMTF9TVVBQT1JUCi1zdGF0aWMgc3NpemVfdCBzaG93X3BpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCi0JCQkqYXR0ciwgY2hhciAqYnVmKTsKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3BpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCi0JCQkgKmRldmF0dHIsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBzc2l6ZV90IHNob3dfbGlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCi0JCQkgKmF0dHIsIGNoYXIgKmJ1Zik7Ci0KLS8qIHN0cnVjdHVyZXMgc3BlY2lmaWMgZm9yIHN5c2ZzIGVudHJpZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgcGlkX2F0dHIgPQotX19BVFRSKHBpZCwgMDY0NCwgKHZvaWQgKilzaG93X3BpZCwgKHZvaWQgKilzdG9yZV9waWQpOwotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGxpc3RfcHJvdG9jb2xzID0KLV9fQVRUUihwcm90b2NvbHMsIDA0NDQsICh2b2lkICopc2hvd19saXN0LCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnVpbV9hdHRyc1tdID0gewotCSZwaWRfYXR0ci5hdHRyLAotCS8qIGFkZCBtb3JlIGRlYnVnIHN5c2ZzIGVudHJpZXMgKi8KLQkmbGlzdF9wcm90b2NvbHMuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdWltX2F0dHJfZ3JwID0gewotCS5hdHRycyA9IHVpbV9hdHRycywKLX07Ci0jZWxzZQogc3RhdGljIGludCBraW1fdG9nZ2xlX3JhZGlvKHZvaWQqLCBib29sKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmZraWxsX29wcyBraW1fcmZraWxsX29wcyA9IHsKIAkuc2V0X2Jsb2NrID0ga2ltX3RvZ2dsZV9yYWRpbywKIH07Ci0jZW5kaWYJLyogTEVHQUNZX1JGS0lMTF9TVVBQT1JUICovCiAKIC8qIHN0cmluZ3MgdG8gYmUgdXNlZCBmb3IgcmZraWxsIGVudHJpZXMgYW5kIGJ5CiAgKiBTVCBDb3JlIHRvIGJlIHVzZWQgZm9yIHN5c2ZzIGRlYnVnIGVudHJ5CkBAIC05NywxOCArNzIsMTkgQEAKIAlQUk9UT19FTlRSWShTVF9HUFMsICJHUFMiKSwKIH07CiAKLXN0cnVjdCBraW1fZGF0YV9zCSpraW1fZ2RhdGE7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogaW50ZXJuYWwgZnVuY3Rpb25zICovCiAKLS8qCi0gKiBmdW5jdGlvbiB0byByZXR1cm4gd2hldGhlciB0aGUgZmlybXdhcmUgcmVzcG9uc2Ugd2FzIHByb3BlcgotICogaW4gY2FzZSBvZiBlcnJvciBkb24ndCBjb21wbGV0ZSBzbyB0aGF0IHdhaXRpbmcgZm9yIHByb3BlcgotICogcmVzcG9uc2UgdGltZXMgb3V0CisvKioKKyAqIHZhbGlkYXRlX2Zpcm13YXJlX3Jlc3BvbnNlIC0KKyAqCWZ1bmN0aW9uIHRvIHJldHVybiB3aGV0aGVyIHRoZSBmaXJtd2FyZSByZXNwb25zZSB3YXMgcHJvcGVyCisgKglpbiBjYXNlIG9mIGVycm9yIGRvbid0IGNvbXBsZXRlIHNvIHRoYXQgd2FpdGluZyBmb3IgcHJvcGVyCisgKglyZXNwb25zZSB0aW1lcyBvdXQKICAqLwotdm9pZCB2YWxpZGF0ZV9maXJtd2FyZV9yZXNwb25zZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordm9pZCB2YWxpZGF0ZV9maXJtd2FyZV9yZXNwb25zZShzdHJ1Y3Qga2ltX2RhdGFfcyAqa2ltX2dkYXRhKQogeworCXN0cnVjdCBza19idWZmICpza2IgPSBraW1fZ2RhdGEtPnJ4X3NrYjsKIAlpZiAodW5saWtlbHkoc2tiLT5kYXRhWzVdICE9IDApKSB7CiAJCXByX2Vycigibm8gcHJvcGVyIHJlc3BvbnNlIGR1cmluZyBmdyBkb3dubG9hZCIpOwogCQlwcl9lcnIoImRhdGE2ICV4Iiwgc2tiLT5kYXRhWzVdKTsKQEAgLTEyMiwxNCArOTgsMTQgQEAKIC8qIGNoZWNrIGZvciBkYXRhIGxlbiByZWNlaXZlZCBpbnNpZGUga2ltX2ludF9yZWN2CiAgKiBtb3N0IG9mdGVuIGhpdCB0aGUgbGFzdCBjYXNlIHRvIHVwZGF0ZSBzdGF0ZSB0byB3YWl0aW5nIGZvciBkYXRhCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGtpbV9jaGVja19kYXRhX2xlbihpbnQgbGVuKQorc3RhdGljIGlubGluZSBpbnQga2ltX2NoZWNrX2RhdGFfbGVuKHN0cnVjdCBraW1fZGF0YV9zICpraW1fZ2RhdGEsIGludCBsZW4pCiB7CiAJcmVnaXN0ZXIgaW50IHJvb20gPSBza2JfdGFpbHJvb20oa2ltX2dkYXRhLT5yeF9za2IpOwogCi0JcHJfaW5mbygibGVuICVkIHJvb20gJWQiLCBsZW4sIHJvb20pOworCXByX2RlYnVnKCJsZW4gJWQgcm9vbSAlZCIsIGxlbiwgcm9vbSk7CiAKIAlpZiAoIWxlbikgewotCQl2YWxpZGF0ZV9maXJtd2FyZV9yZXNwb25zZShraW1fZ2RhdGEtPnJ4X3NrYik7CisJCXZhbGlkYXRlX2Zpcm13YXJlX3Jlc3BvbnNlKGtpbV9nZGF0YSk7CiAJfSBlbHNlIGlmIChsZW4gPiByb29tKSB7CiAJCS8qIFJlY2VpdmVkIHBhY2tldCdzIHBheWxvYWQgbGVuZ3RoIGlzIGxhcmdlci4KIAkJICogV2UgY2FuJ3QgYWNjb21tb2RhdGUgaXQgaW4gY3JlYXRlZCBza2IuCkBAIC0xNTUsMTggKzEzMSwyMCBAQAogCXJldHVybiAwOwogfQogCi0vKiByZWNlaXZlIGZ1bmN0aW9uIGNhbGxlZCBkdXJpbmcgZmlybXdhcmUgZG93bmxvYWQKLSAqIC0gZmlybXdhcmUgZG93bmxvYWQgcmVzcG9uc2VzIG9uIGRpZmZlcmVudCBVQVJUIGRyaXZlcnMKLSAqICAgaGF2ZSBiZWVuIG9ic2VydmVkIHRvIGNvbWUgaW4gYnVyc3RzIG9mIGRpZmZlcmVudAotICogICB0dHlfcmVjZWl2ZSBhbmQgaGVuY2UgdGhlIGxvZ2ljCisvKioKKyAqIGtpbV9pbnRfcmVjdiAtIHJlY2VpdmUgZnVuY3Rpb24gY2FsbGVkIGR1cmluZyBmaXJtd2FyZSBkb3dubG9hZAorICoJZmlybXdhcmUgZG93bmxvYWQgcmVzcG9uc2VzIG9uIGRpZmZlcmVudCBVQVJUIGRyaXZlcnMKKyAqCWhhdmUgYmVlbiBvYnNlcnZlZCB0byBjb21lIGluIGJ1cnN0cyBvZiBkaWZmZXJlbnQKKyAqCXR0eV9yZWNlaXZlIGFuZCBoZW5jZSB0aGUgbG9naWMKICAqLwotdm9pZCBraW1faW50X3JlY3YoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgbG9uZyBjb3VudCkKK3ZvaWQga2ltX2ludF9yZWN2KHN0cnVjdCBraW1fZGF0YV9zICpraW1fZ2RhdGEsCisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgbG9uZyBjb3VudCkKIHsKIAlyZWdpc3RlciBjaGFyICpwdHI7CiAJc3RydWN0IGhjaV9ldmVudF9oZHIgKmVoOwogCXJlZ2lzdGVyIGludCBsZW4gPSAwLCB0eXBlID0gMDsKIAotCXByX2luZm8oIiVzIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlcyIsIF9fZnVuY19fKTsKIAkvKiBEZWNvZGUgcmVjZWl2ZWQgYnl0ZXMgaGVyZSAqLwogCXB0ciA9IChjaGFyICopZGF0YTsKIAlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSB7CkBAIC0xODgsOCArMTY2LDggQEAKIAkJCXN3aXRjaCAoa2ltX2dkYXRhLT5yeF9zdGF0ZSkgewogCQkJCS8qIFdhaXRpbmcgZm9yIGNvbXBsZXRlIHBhY2tldCA/ICovCiAJCQljYXNlIFNUX0JUX1c0X0RBVEE6Ci0JCQkJcHJfaW5mbygiQ29tcGxldGUgcGt0IHJlY2VpdmVkIik7Ci0JCQkJdmFsaWRhdGVfZmlybXdhcmVfcmVzcG9uc2Uoa2ltX2dkYXRhLT5yeF9za2IpOworCQkJCXByX2RlYnVnKCJDb21wbGV0ZSBwa3QgcmVjZWl2ZWQiKTsKKwkJCQl2YWxpZGF0ZV9maXJtd2FyZV9yZXNwb25zZShraW1fZ2RhdGEpOwogCQkJCWtpbV9nZGF0YS0+cnhfc3RhdGUgPSBTVF9XNF9QQUNLRVRfVFlQRTsKIAkJCQlraW1fZ2RhdGEtPnJ4X3NrYiA9IE5VTEw7CiAJCQkJY29udGludWU7CkBAIC0xOTcsOSArMTc1LDkgQEAKIAkJCWNhc2UgU1RfQlRfVzRfRVZFTlRfSERSOgogCQkJCWVoID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopa2ltX2dkYXRhLT4KIAkJCQkgICAgcnhfc2tiLT5kYXRhOwotCQkJCXByX2luZm8oIkV2ZW50IGhlYWRlcjogZXZ0IDB4JTIuMngiCisJCQkJcHJfZGVidWcoIkV2ZW50IGhlYWRlcjogZXZ0IDB4JTIuMngiCiAJCQkJCSAgICJwbGVuICVkIiwgZWgtPmV2dCwgZWgtPnBsZW4pOwotCQkJCWtpbV9jaGVja19kYXRhX2xlbihlaC0+cGxlbik7CisJCQkJa2ltX2NoZWNrX2RhdGFfbGVuKGtpbV9nZGF0YSwgZWgtPnBsZW4pOwogCQkJCWNvbnRpbnVlOwogCQkJfQkvKiBlbmQgb2Ygc3dpdGNoICovCiAJCX0JCS8qIGVuZCBvZiBpZiByeF9zdGF0ZSAqLwpAQCAtMjE2LDcgKzE5NCw3IEBACiAJCQlwdHIrKzsKIAkJCWNvdW50LS07CiAJCQljb250aW51ZTsKLQkJfQkJLyogZW5kIG9mIHN3aXRjaCAqcHRyICovCisJCX0KIAkJcHRyKys7CiAJCWNvdW50LS07CiAJCWtpbV9nZGF0YS0+cnhfc2tiID0KQEAgLTIyNiwzNCArMjA0LDM1IEBACiAJCQlraW1fZ2RhdGEtPnJ4X3N0YXRlID0gU1RfVzRfUEFDS0VUX1RZUEU7CiAJCQlraW1fZ2RhdGEtPnJ4X2NvdW50ID0gMDsKIAkJCXJldHVybjsKLQkJfSAvKiBub3QgbmVjZXNzYXJ5IGluIHRoaXMgY2FzZSAqLworCQl9CiAJCWJ0X2NiKGtpbV9nZGF0YS0+cnhfc2tiKS0+cGt0X3R5cGUgPSB0eXBlOwotCX0JCQkvKiBlbmQgb2Ygd2hpbGUgY291bnQgKi8KKwl9CiAJcHJfaW5mbygiZG9uZSAlcyIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBsb25nIHJlYWRfbG9jYWxfdmVyc2lvbihjaGFyICpidHNfc2NyX25hbWUpCitzdGF0aWMgbG9uZyByZWFkX2xvY2FsX3ZlcnNpb24oc3RydWN0IGtpbV9kYXRhX3MgKmtpbV9nZGF0YSwgY2hhciAqYnRzX3Njcl9uYW1lKQogewogCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAwLCBjaGlwID0gMCwgbWluX3ZlciA9IDAsIG1hal92ZXIgPSAwOwogCWNoYXIgcmVhZF92ZXJfY21kW10gPSB7IDB4MDEsIDB4MDEsIDB4MTAsIDB4MDAgfTsKIAotCXByX2luZm8oIiVzIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlcyIsIF9fZnVuY19fKTsKIAogCUlOSVRfQ09NUExFVElPTihraW1fZ2RhdGEtPmtpbV9yY3ZkKTsKIAlpZiAoNCAhPSBzdF9pbnRfd3JpdGUoa2ltX2dkYXRhLT5jb3JlX2RhdGEsIHJlYWRfdmVyX2NtZCwgNCkpIHsKIAkJcHJfZXJyKCJraW06IGNvdWxkbid0IHdyaXRlIDQgYnl0ZXMiKTsKLQkJcmV0dXJuIFNUX0VSUl9GQUlMVVJFOworCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKIAkgICAgKCZraW1fZ2RhdGEtPmtpbV9yY3ZkLCBtc2Vjc190b19qaWZmaWVzKENNRF9SRVNQX1RJTUUpKSkgewogCQlwcl9lcnIoIiB3YWl0aW5nIGZvciB2ZXIgaW5mby0gdGltZWQgb3V0ICIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9CiAKIAl2ZXJzaW9uID0KLQkgICAgTUFLRVdPUkQoa2ltX2dkYXRhLT5yZXNwX2J1ZmZlclsxM10sIGtpbV9nZGF0YS0+cmVzcF9idWZmZXJbMTRdKTsKKwkJTUFLRVdPUkQoa2ltX2dkYXRhLT5yZXNwX2J1ZmZlclsxM10sCisJCQkJa2ltX2dkYXRhLT5yZXNwX2J1ZmZlclsxNF0pOwogCWNoaXAgPSAodmVyc2lvbiAmIDB4N0MwMCkgPj4gMTA7CiAJbWluX3ZlciA9ICh2ZXJzaW9uICYgMHgwMDdGKTsKIAltYWpfdmVyID0gKHZlcnNpb24gJiAweDAzODApID4+IDc7CkBAIC0yNjIsMjUgKzI0MSwzMiBAQAogCQltYWpfdmVyIHw9IDB4MDAwODsKIAogCXNwcmludGYoYnRzX3Njcl9uYW1lLCAiVElJbml0XyVkLiVkLiVkLmJ0cyIsIGNoaXAsIG1hal92ZXIsIG1pbl92ZXIpOworCisJLyogdG8gYmUgYWNjZXNzZWQgbGF0ZXIgdmlhIHN5c2ZzIGVudHJ5ICovCisJa2ltX2dkYXRhLT52ZXJzaW9uLmZ1bGwgPSB2ZXJzaW9uOworCWtpbV9nZGF0YS0+dmVyc2lvbi5jaGlwID0gY2hpcDsKKwlraW1fZ2RhdGEtPnZlcnNpb24ubWFqX3ZlciA9IG1hal92ZXI7CisJa2ltX2dkYXRhLT52ZXJzaW9uLm1pbl92ZXIgPSBtaW5fdmVyOworCiAJcHJfaW5mbygiJXMiLCBidHNfc2NyX25hbWUpOwotCXJldHVybiBTVF9TVUNDRVNTOworCXJldHVybiAwOwogfQogCi0vKiBpbnRlcm5hbCBmdW5jdGlvbiB3aGljaCBwYXJzZXMgdGhyb3VnaCB0aGUgLmJ0cyBmaXJtd2FyZSBzY3JpcHQgZmlsZQotICogaW50cmVwcmV0cyBTRU5ELCBERUxBWSBhY3Rpb25zIG9ubHkgYXMgb2Ygbm93CisvKioKKyAqIGRvd25sb2FkX2Zpcm13YXJlIC0KKyAqCWludGVybmFsIGZ1bmN0aW9uIHdoaWNoIHBhcnNlcyB0aHJvdWdoIHRoZSAuYnRzIGZpcm13YXJlCisgKglzY3JpcHQgZmlsZSBpbnRyZXByZXRzIFNFTkQsIERFTEFZIGFjdGlvbnMgb25seSBhcyBvZiBub3cKICAqLwotc3RhdGljIGxvbmcgZG93bmxvYWRfZmlybXdhcmUodm9pZCkKK3N0YXRpYyBsb25nIGRvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBraW1fZGF0YV9zICpraW1fZ2RhdGEpCiB7Ci0JbG9uZyBlcnIgPSBTVF9TVUNDRVNTOworCWxvbmcgZXJyID0gMDsKIAlsb25nIGxlbiA9IDA7CiAJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcHRyID0gTlVMTDsKIAlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICphY3Rpb25fcHRyID0gTlVMTDsKIAl1bnNpZ25lZCBjaGFyIGJ0c19zY3JfbmFtZVszMF0gPSB7IDAgfTsJLyogMzAgY2hhciBsb25nIGJ0cyBzY3IgbmFtZT8gKi8KIAotCXByX2luZm8oIiVzIiwgX19mdW5jX18pOwotCi0JZXJyID0gcmVhZF9sb2NhbF92ZXJzaW9uKGJ0c19zY3JfbmFtZSk7Ci0JaWYgKGVyciAhPSBTVF9TVUNDRVNTKSB7CisJZXJyID0gcmVhZF9sb2NhbF92ZXJzaW9uKGtpbV9nZGF0YSwgYnRzX3Njcl9uYW1lKTsKKwlpZiAoZXJyICE9IDApIHsKIAkJcHJfZXJyKCJraW06IGZhaWxlZCB0byByZWFkIGxvY2FsIHZlciIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTI5MSw3ICsyNzcsNyBAQAogCQkgICAgIChraW1fZ2RhdGEtPmZ3X2VudHJ5LT5zaXplID09IDApKSkgewogCQlwcl9lcnIoIiByZXF1ZXN0X2Zpcm13YXJlIGZhaWxlZChlcnJubyAlbGQpIGZvciAlcyIsIGVyciwKIAkJCSAgIGJ0c19zY3JfbmFtZSk7Ci0JCXJldHVybiBTVF9FUlJfRkFJTFVSRTsKKwkJcmV0dXJuIC0xOwogCX0KIAlwdHIgPSAodm9pZCAqKWtpbV9nZGF0YS0+ZndfZW50cnktPmRhdGE7CiAJbGVuID0ga2ltX2dkYXRhLT5md19lbnRyeS0+c2l6ZTsKQEAgLTMwMiw3ICsyODgsNyBAQAogCWxlbiAtPSBzaXplb2Yoc3RydWN0IGJ0c19oZWFkZXIpOwogCiAJd2hpbGUgKGxlbiA+IDAgJiYgcHRyKSB7Ci0JCXByX2luZm8oIiBhY3Rpb24gc2l6ZSAlZCwgdHlwZSAlZCAiLAorCQlwcl9kZWJ1ZygiIGFjdGlvbiBzaXplICVkLCB0eXBlICVkICIsCiAJCQkgICAoKHN0cnVjdCBidHNfYWN0aW9uICopcHRyKS0+c2l6ZSwKIAkJCSAgICgoc3RydWN0IGJ0c19hY3Rpb24gKilwdHIpLT50eXBlKTsKIApAQCAtMzE1LDggKzMwMSw4IEBACiAJCQkJLyogaWdub3JlIHJlbW90ZSBjaGFuZ2UKIAkJCQkgKiBiYXVkIHJhdGUgSENJIFZTIGNvbW1hbmQgKi8KIAkJCQlwcl9lcnIKLQkJCQkgICAgKCIgY2hhbmdlIHJlbW90ZSBiYXVkXAotCQkJCSAgICByYXRlIGNvbW1hbmQgaW4gZmlybXdhcmUiKTsKKwkJCQkgICAgKCIgY2hhbmdlIHJlbW90ZSBiYXVkIgorCQkJCSAgICAiIHJhdGUgY29tbWFuZCBpbiBmaXJtd2FyZSIpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0zMjYsNyArMzEyLDcgQEAKIAkJCQkJICAgKChzdHJ1Y3QgYnRzX2FjdGlvbiAqKXB0ciktPnNpemUpOwogCQkJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CiAJCQkJcmVsZWFzZV9maXJtd2FyZShraW1fZ2RhdGEtPmZ3X2VudHJ5KTsKLQkJCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCQkJcmV0dXJuIC0xOwogCQkJfQogCQkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKIAkJCSAgICAoJmtpbV9nZGF0YS0+a2ltX3JjdmQsCkBAIC0zMzUsNyArMzIxLDcgQEAKIAkJCQkgICAgKCIgcmVzcG9uc2UgdGltZW91dCBkdXJpbmcgZncgZG93bmxvYWQgIik7CiAJCQkJLyogdGltZWQgb3V0ICovCiAJCQkJcmVsZWFzZV9maXJtd2FyZShraW1fZ2RhdGEtPmZ3X2VudHJ5KTsKLQkJCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCQkJcmV0dXJuIC0xOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQUNUSU9OX0RFTEFZOgkvKiBzbGVlcCAqLwpAQCAtMzUzLDE5ICszMzksMjMgQEAKIAl9CiAJLyogZncgZG93bmxvYWQgY29tcGxldGUgKi8KIAlyZWxlYXNlX2Zpcm13YXJlKGtpbV9nZGF0YS0+ZndfZW50cnkpOwotCXJldHVybiBTVF9TVUNDRVNTOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBTVCBjb3JlICovCi0KIC8qIGZ1bmN0aW9uIHRvIHRvZ2dsZSB0aGUgR1BJTwogICogbmVlZHMgdG8ga25vdyB3aGV0aGVyIHRoZSBHUElPIGlzIGFjdGl2ZSBoaWdoIG9yIGFjdGl2ZSBsb3cKICAqLwogdm9pZCBzdF9raW1fY2hpcF90b2dnbGUoZW51bSBwcm90b190eXBlIHR5cGUsIGVudW0ga2ltX2dwaW9fc3RhdGUgc3RhdGUpCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqa2ltX3BkZXY7CisJc3RydWN0IGtpbV9kYXRhX3MJKmtpbV9nZGF0YTsKIAlwcl9pbmZvKCIgJXMgIiwgX19mdW5jX18pOwogCisJa2ltX3BkZXYgPSBzdF9nZXRfcGxhdF9kZXZpY2UoKTsKKwlraW1fZ2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmtpbV9wZGV2LT5kZXYpOworCiAJaWYgKGtpbV9nZGF0YS0+Z3Bpb3NbdHlwZV0gPT0gLTEpIHsKIAkJcHJfaW5mbygiIGdwaW8gbm90IHJlcXVlc3RlZCBmb3IgcHJvdG9jb2wgJXMiLAogCQkJICAgcHJvdG9jb2xfbmFtZXNbdHlwZV0pOwpAQCAtNDA1LDYgKzM5NSw5IEBACiAgKi8KIHZvaWQgc3Rfa2ltX3JlY3Yodm9pZCAqZGlzY19kYXRhLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBsb25nIGNvdW50KQogeworCXN0cnVjdCBzdF9kYXRhX3MJKnN0X2dkYXRhID0gKHN0cnVjdCBzdF9kYXRhX3MgKilkaXNjX2RhdGE7CisJc3RydWN0IGtpbV9kYXRhX3MJKmtpbV9nZGF0YSA9IHN0X2dkYXRhLT5raW1fZGF0YTsKKwogCXByX2luZm8oIiAlcyAiLCBfX2Z1bmNfXyk7CiAJLyogY29weSB0byBsb2NhbCBidWZmZXIgKi8KIAlpZiAodW5saWtlbHkoZGF0YVs0XSA9PSAweDAxICYmIGRhdGFbNV0gPT0gMHgxMCAmJiBkYXRhWzBdID09IDB4MDQpKSB7CkBAIC00MTMsNyArNDA2LDcgQEAKIAkJY29tcGxldGVfYWxsKCZraW1fZ2RhdGEtPmtpbV9yY3ZkKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7Ci0JCWtpbV9pbnRfcmVjdihkYXRhLCBjb3VudCk7CisJCWtpbV9pbnRfcmVjdihraW1fZ2RhdGEsIGRhdGEsIGNvdW50KTsKIAkJLyogZWl0aGVyIGNvbXBsZXRlcyBvciB0aW1lcyBvdXQgKi8KIAl9CiAJcmV0dXJuOwpAQCAtNDIyLDI3ICs0MTUsMzMgQEAKIC8qIHRvIHNpZ25hbCBjb21wbGV0aW9uIG9mIGxpbmUgZGlzY2lwbGluZSBpbnN0YWxsYXRpb24KICAqIGNhbGxlZCBmcm9tIFNUIENvcmUsIHVwb24gdHR5X29wZW4KICAqLwotdm9pZCBzdF9raW1fY29tcGxldGUodm9pZCkKK3ZvaWQgc3Rfa2ltX2NvbXBsZXRlKHZvaWQgKmtpbV9kYXRhKQogeworCXN0cnVjdCBraW1fZGF0YV9zCSpraW1fZ2RhdGEgPSAoc3RydWN0IGtpbV9kYXRhX3MgKilraW1fZGF0YTsKIAljb21wbGV0ZSgma2ltX2dkYXRhLT5sZGlzY19pbnN0YWxsZWQpOwogfQogCi0vKiBjYWxsZWQgZnJvbSBTVCBDb3JlIHVwb24gMXN0IHJlZ2lzdHJhdGlvbgotKi8KLWxvbmcgc3Rfa2ltX3N0YXJ0KHZvaWQpCisvKioKKyAqIHN0X2tpbV9zdGFydCAtIGNhbGxlZCBmcm9tIFNUIENvcmUgdXBvbiAxc3QgcmVnaXN0cmF0aW9uCisgKglUaGlzIGludm9sdmVzIHRvZ2dsaW5nIHRoZSBjaGlwIGVuYWJsZSBncGlvLCByZWFkaW5nCisgKgl0aGUgZmlybXdhcmUgdmVyc2lvbiBmcm9tIGNoaXAsIGZvcm1pbmcgdGhlIGZ3IGZpbGUgbmFtZQorICoJYmFzZWQgb24gdGhlIGNoaXAgdmVyc2lvbiwgcmVxdWVzdGluZyB0aGUgZncsIHBhcnNpbmcgaXQKKyAqCWFuZCBwZXJmb3JtIGRvd25sb2FkKHNlbmQvcmVjdikuCisgKi8KK2xvbmcgc3Rfa2ltX3N0YXJ0KHZvaWQgKmtpbV9kYXRhKQogewotCWxvbmcgZXJyID0gU1RfU1VDQ0VTUzsKKwlsb25nIGVyciA9IDA7CiAJbG9uZyByZXRyeSA9IFBPUl9SRVRSWV9DT1VOVDsKKwlzdHJ1Y3Qga2ltX2RhdGFfcwkqa2ltX2dkYXRhID0gKHN0cnVjdCBraW1fZGF0YV9zICopa2ltX2RhdGE7CisKIAlwcl9pbmZvKCIgJXMiLCBfX2Z1bmNfXyk7CiAKIAlkbyB7Ci0jaWZkZWYgTEVHQUNZX1JGS0lMTF9TVVBQT1JUCiAJCS8qIFRPRE86IHRoaXMgaXMgb25seSBiZWNhdXNlIHJma2lsbCBzdWItc3lzdGVtCiAJCSAqIGRvZXNuJ3Qgc2VuZCBldmVudHMgdG8gdXNlci1zcGFjZSBpZiB0aGUgc3RhdGUKIAkJICogaXNuJ3QgY2hhbmdlZAogCQkgKi8KIAkJcmZraWxsX3NldF9od19zdGF0ZShraW1fZ2RhdGEtPnJma2lsbFtTVF9CVF0sIDEpOwotI2VuZGlmCiAJCS8qIENvbmZpZ3VyZSBCVCBuU2h1dGRvd24gdG8gSElHSCBzdGF0ZSAqLwogCQlncGlvX3NldF92YWx1ZShraW1fZ2RhdGEtPmdwaW9zW1NUX0JUXSwgR1BJT19MT1cpOwogCQltZGVsYXkoNSk7CS8qIEZJWE1FOiBhIHByb3BlciB0b2dnbGUgKi8KQEAgLTQ1MCwzMCArNDQ5LDI5IEBACiAJCW1kZWxheSgxMDApOwogCQkvKiByZS1pbml0aWFsaXplIHRoZSBjb21wbGV0aW9uICovCiAJCUlOSVRfQ09NUExFVElPTihraW1fZ2RhdGEtPmxkaXNjX2luc3RhbGxlZCk7Ci0jaWZuZGVmIExFR0FDWV9SRktJTExfU1VQUE9SVAorI2lmIDAgLyogb2xkZXIgd2F5IG9mIHNpZ25hbGxpbmcgdXNlci1zcGFjZSBVSU0gKi8KIAkJLyogc2VuZCBzaWduYWwgdG8gVUlNICovCiAJCWVyciA9IGtpbGxfcGlkKGZpbmRfZ2V0X3BpZChraW1fZ2RhdGEtPnVpbV9waWQpLCBTSUdVU1IyLCAwKTsKIAkJaWYgKGVyciAhPSAwKSB7CiAJCQlwcl9pbmZvKCIgc2VuZGluZyBTSUdVU1IyIHRvIHVpbSBmYWlsZWQgJWxkIiwgZXJyKTsKLQkJCWVyciA9IFNUX0VSUl9GQUlMVVJFOworCQkJZXJyID0gLTE7CiAJCQljb250aW51ZTsKIAkJfQotI2Vsc2UKKyNlbmRpZgogCQkvKiB1bmJsb2NrIGFuZCBzZW5kIGV2ZW50IHRvIFVJTSB2aWEgL2Rldi9yZmtpbGwgKi8KIAkJcmZraWxsX3NldF9od19zdGF0ZShraW1fZ2RhdGEtPnJma2lsbFtTVF9CVF0sIDApOwotI2VuZGlmCiAJCS8qIHdhaXQgZm9yIGxkaXNjIHRvIGJlIGluc3RhbGxlZCAqLwogCQllcnIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmtpbV9nZGF0YS0+bGRpc2NfaW5zdGFsbGVkLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoTERJU0NfVElNRSkpOwogCQlpZiAoIWVycikgewkvKiB0aW1lb3V0ICovCiAJCQlwcl9lcnIoImxpbmUgZGlzYyBpbnN0YWxsYXRpb24gdGltZWQgb3V0ICIpOwotCQkJZXJyID0gU1RfRVJSX0ZBSUxVUkU7CisJCQllcnIgPSAtMTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgewogCQkJLyogbGRpc2MgaW5zdGFsbGVkIG5vdyAqLwogCQkJcHJfaW5mbygiIGxpbmUgZGlzY2lwbGluZSBpbnN0YWxsZWQgIik7Ci0JCQllcnIgPSBkb3dubG9hZF9maXJtd2FyZSgpOwotCQkJaWYgKGVyciAhPSBTVF9TVUNDRVNTKSB7CisJCQllcnIgPSBkb3dubG9hZF9maXJtd2FyZShraW1fZ2RhdGEpOworCQkJaWYgKGVyciAhPSAwKSB7CiAJCQkJcHJfZXJyKCJkb3dubG9hZCBmaXJtd2FyZSBmYWlsZWQiKTsKIAkJCQljb250aW51ZTsKIAkJCX0gZWxzZSB7CS8qIG9uIHN1Y2Nlc3MgZG9uJ3QgcmV0cnkgKi8KQEAgLTQ4NCwzMSArNDgyLDMzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyogY2FsbGVkIGZyb20gU1QgQ29yZSwgb24gdGhlIGxhc3QgdW4tcmVnaXN0cmF0aW9uCi0qLwotbG9uZyBzdF9raW1fc3RvcCh2b2lkKQorLyoqCisgKiBzdF9raW1fc3RvcCAtIGNhbGxlZCBmcm9tIFNUIENvcmUsIG9uIHRoZSBsYXN0IHVuLXJlZ2lzdHJhdGlvbgorICoJdG9nZ2xlIGxvdyB0aGUgY2hpcCBlbmFibGUgZ3BpbworICovCitsb25nIHN0X2tpbV9zdG9wKHZvaWQgKmtpbV9kYXRhKQogewotCWxvbmcgZXJyID0gU1RfU1VDQ0VTUzsKKwlsb25nIGVyciA9IDA7CisJc3RydWN0IGtpbV9kYXRhX3MJKmtpbV9nZGF0YSA9IChzdHJ1Y3Qga2ltX2RhdGFfcyAqKWtpbV9kYXRhOwogCiAJSU5JVF9DT01QTEVUSU9OKGtpbV9nZGF0YS0+bGRpc2NfaW5zdGFsbGVkKTsKLSNpZm5kZWYgTEVHQUNZX1JGS0lMTF9TVVBQT1JUCisjaWYgMCAvKiBvbGRlciB3YXkgb2Ygc2lnbmFsbGluZyB1c2VyLXNwYWNlIFVJTSAqLwogCS8qIHNlbmQgc2lnbmFsIHRvIFVJTSAqLwogCWVyciA9IGtpbGxfcGlkKGZpbmRfZ2V0X3BpZChraW1fZ2RhdGEtPnVpbV9waWQpLCBTSUdVU1IyLCAxKTsKIAlpZiAoZXJyICE9IDApIHsKIAkJcHJfZXJyKCJzZW5kaW5nIFNJR1VTUjIgdG8gdWltIGZhaWxlZCAlbGQiLCBlcnIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9Ci0jZWxzZQorI2VuZGlmCiAJLyogc2V0IEJUIHJma2lsbCB0byBiZSBibG9ja2VkICovCiAJZXJyID0gcmZraWxsX3NldF9od19zdGF0ZShraW1fZ2RhdGEtPnJma2lsbFtTVF9CVF0sIDEpOwotI2VuZGlmCiAKIAkvKiB3YWl0IGZvciBsZGlzYyB0byBiZSB1bi1pbnN0YWxsZWQgKi8KIAllcnIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmtpbV9nZGF0YS0+bGRpc2NfaW5zdGFsbGVkLAogCQkJbXNlY3NfdG9famlmZmllcyhMRElTQ19USU1FKSk7CiAJaWYgKCFlcnIpIHsJCS8qIHRpbWVvdXQgKi8KIAkJcHJfZXJyKCIgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGxkaXNjIHRvIGJlIHVuLWluc3RhbGxlZCIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBCeSBkZWZhdWx0IGNvbmZpZ3VyZSBCVCBuU2h1dGRvd24gdG8gTE9XIHN0YXRlICovCkBAIC01MjIsMzcgKzUyMiwyNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBzdWJzeXN0ZW1zICovCisvKiBjYWxsZWQgd2hlbiBkZWJ1Z2ZzIGVudHJ5IGlzIHJlYWQgZnJvbSAqLwogCi0jaWZuZGVmIExFR0FDWV9SRktJTExfU1VQUE9SVAotLyogY2FsbGVkIHdoZW4gc3lzZnMgZW50cnkgaXMgd3JpdHRlbiB0byAqLwotc3RhdGljIHNzaXplX3Qgc3RvcmVfcGlkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKLQkJCSAqZGV2YXR0ciwgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHNob3dfdmVyc2lvbihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKIHsKLQlwcl9pbmZvKCIlczogcGlkICVzICIsIF9fZnVuY19fLCBidWYpOwotCXNzY2FuZihidWYsICIlbGQiLCAma2ltX2dkYXRhLT51aW1fcGlkKTsKLQkvKiB0byBiZSBtYWRlIHVzZSBieSBraW1fc3RhcnQgdG8gc2lnbmFsIFNJR1VTUjIKLQkgKi8KLQlyZXR1cm4gc3RybGVuKGJ1Zik7CisJc3RydWN0IGtpbV9kYXRhX3MgKmtpbV9nZGF0YSA9IChzdHJ1Y3Qga2ltX2RhdGFfcyAqKXMtPnByaXZhdGU7CisJc2VxX3ByaW50ZihzLCAiJTA0WCAlZC4lZC4lZFxuIiwga2ltX2dkYXRhLT52ZXJzaW9uLmZ1bGwsCisJCQlraW1fZ2RhdGEtPnZlcnNpb24uY2hpcCwga2ltX2dkYXRhLT52ZXJzaW9uLm1hal92ZXIsCisJCQlraW1fZ2RhdGEtPnZlcnNpb24ubWluX3Zlcik7CisJcmV0dXJuIDA7CiB9CiAKLS8qIGNhbGxlZCB3aGVuIHN5c2ZzIGVudHJ5IGlzIHJlYWQgZnJvbSAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19waWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQotCQkJKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgc2hvd19saXN0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQogewotCXNwcmludGYoYnVmLCAiJWxkIiwga2ltX2dkYXRhLT51aW1fcGlkKTsKLQlyZXR1cm4gc3RybGVuKGJ1Zik7CisJc3RydWN0IGtpbV9kYXRhX3MgKmtpbV9nZGF0YSA9IChzdHJ1Y3Qga2ltX2RhdGFfcyAqKXMtPnByaXZhdGU7CisJa2ltX3N0X2xpc3RfcHJvdG9jb2xzKGtpbV9nZGF0YS0+Y29yZV9kYXRhLCBzKTsKKwlyZXR1cm4gMDsKIH0KIAotLyogY2FsbGVkIHdoZW4gc3lzZnMgZW50cnkgaXMgcmVhZCBmcm9tICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2xpc3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQotCQkJICphdHRyLCBjaGFyICpidWYpCi17Ci0Ja2ltX3N0X2xpc3RfcHJvdG9jb2xzKGtpbV9nZGF0YS0+Y29yZV9kYXRhLCBidWYpOwotCXJldHVybiBzdHJsZW4oYnVmKTsKLX0KLQotI2Vsc2UgLyogTEVHQUNZX1JGS0lMTF9TVVBQT1JUICovCi0KIC8qIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHJma2lsbCBzdWJzeXN0ZW0sIHdoZW4gc29tZW9uZSBmcm9tCiAgKiB1c2VyIHNwYWNlIHdvdWxkIHdyaXRlIDAvMSBvbiB0aGUgc3lzZnMgZW50cnkKICAqIC9zeXMvY2xhc3MvcmZraWxsL3Jma2lsbDAsMSwzL3N0YXRlCkBAIC01NjAsNyArNTQ3LDcgQEAKIHN0YXRpYyBpbnQga2ltX3RvZ2dsZV9yYWRpbyh2b2lkICpkYXRhLCBib29sIGJsb2NrZWQpCiB7CiAJZW51bSBwcm90b190eXBlIHR5cGUgPSAqKChlbnVtIHByb3RvX3R5cGUgKilkYXRhKTsKLQlwcl9pbmZvKCIgJXM6ICVkICIsIF9fZnVuY19fLCB0eXBlKTsKKwlwcl9kZWJ1ZygiICVzOiAlZCAiLCBfX2Z1bmNfXywgdHlwZSk7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFNUX0JUOgpAQCAtNTc3LDMzICs1NjQsNzkgQEAKIAkJcHJfZXJyKCIgd3JvbmcgcHJvdG8gdHlwZSAiKTsKIAlicmVhazsKIAl9Ci0JcmV0dXJuIFNUX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgkvKiBMRUdBQ1lfUkZLSUxMX1NVUFBPUlQgKi8KLQorLyoqCisgKiBzdF9raW1fcmVmIC0gcmVmZXJlbmNlIHRoZSBjb3JlJ3MgZGF0YQorICoJVGhpcyByZWZlcmVuY2VzIHRoZSBwZXItU1QgcGxhdGZvcm0gZGV2aWNlIGluIHRoZSBhcmNoL3h4LworICoJYm9hcmQteHguYyBmaWxlLgorICoJVGhpcyB3b3VsZCBlbmFibGUgbXVsdGlwbGUgc3VjaCBwbGF0Zm9ybSBkZXZpY2VzIHRvIGV4aXN0CisgKglvbiBhIGdpdmVuIHBsYXRmb3JtCisgKi8KIHZvaWQgc3Rfa2ltX3JlZihzdHJ1Y3Qgc3RfZGF0YV9zICoqY29yZV9kYXRhKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IGtpbV9kYXRhX3MJKmtpbV9nZGF0YTsKKwkvKiBnZXQga2ltX2dkYXRhIHJlZmVyZW5jZSBmcm9tIHBsYXRmb3JtIGRldmljZSAqLworCXBkZXYgPSBzdF9nZXRfcGxhdF9kZXZpY2UoKTsKKwlraW1fZ2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAJKmNvcmVfZGF0YSA9IGtpbV9nZGF0YS0+Y29yZV9kYXRhOwogfQogCitzdGF0aWMgaW50IGtpbV92ZXJzaW9uX29wZW4oc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZiwgc2hvd192ZXJzaW9uLCBpLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGtpbV9saXN0X29wZW4oc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZiwgc2hvd19saXN0LCBpLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2ZXJzaW9uX2RlYnVnZnNfZm9wcyA9IHsKKwkvKiB2ZXJzaW9uIGluZm8gKi8KKwkub3BlbiA9IGtpbV92ZXJzaW9uX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGlzdF9kZWJ1Z2ZzX2ZvcHMgPSB7CisJLyogcHJvdG9jb2xzIGluZm8gKi8KKwkub3BlbiA9IGtpbV9saXN0X29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBwbGF0Zm9ybSBkZXZpY2UgZHJpdmVyIHN1YnN5c3RlbQogICogbmVlZCB0byBoYXZlIGEgcmVsZXZhbnQgcGxhdGZvcm0gZGV2aWNlIGVudHJ5IGluIHRoZSBwbGF0Zm9ybSdzCiAgKiBib2FyZC0qLmMgZmlsZQogICovCiAKK3N0cnVjdCBkZW50cnkgKmtpbV9kZWJ1Z2ZzX2RpcjsKIHN0YXRpYyBpbnQga2ltX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJbG9uZyBzdGF0dXM7CiAJbG9uZyBwcm90bzsKIAlsb25nICpncGlvcyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBraW1fZGF0YV9zCSpraW1fZ2RhdGE7CisKKwlraW1fZ2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga2ltX2RhdGFfcyksIEdGUF9BVE9NSUMpOworCWlmICgha2ltX2dkYXRhKSB7CisJCXByX2Vycigibm8gbWVtIHRvIGFsbG9jYXRlIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwga2ltX2dkYXRhKTsKIAogCXN0YXR1cyA9IHN0X2NvcmVfaW5pdCgma2ltX2dkYXRhLT5jb3JlX2RhdGEpOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQlwcl9lcnIoIiBTVCBjb3JlIGluaXQgZmFpbGVkIik7Ci0JCXJldHVybiBTVF9FUlJfRkFJTFVSRTsKKwkJcmV0dXJuIC0xOwogCX0KKwkvKiByZWZlciB0byBpdHNlbGYgKi8KKwlraW1fZ2RhdGEtPmNvcmVfZGF0YS0+a2ltX2RhdGEgPSBraW1fZ2RhdGE7CiAKIAlmb3IgKHByb3RvID0gMDsgcHJvdG8gPCBTVF9NQVg7IHByb3RvKyspIHsKIAkJa2ltX2dkYXRhLT5ncGlvc1twcm90b10gPSBncGlvc1twcm90b107CkBAIC02MzksMzAgKzY3MiwxMiBAQAogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCX0KLSNpZm5kZWYgTEVHQUNZX1JGS0lMTF9TVVBQT1JUCi0JLyogcGRldiB0byBjb250YWluIEJULCBGTSBhbmQgR1BTIGVuYWJsZS9OLVNodXRkb3duIEdQSU9zCi0JICogZXhlY3V0ZSByZXF1ZXN0X2dwaW8sIHNldCBvdXRwdXQgZGlyZWN0aW9uCi0JICovCi0Ja2ltX2dkYXRhLT5raW1fa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoInVpbSIsIE5VTEwpOwotCS8qIGNyZWF0ZSB0aGUgc3lzZnMgZW50cnkgZm9yIFVJTSB0byBwdXQgaW4gcGlkICovCi0JaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cChraW1fZ2RhdGEtPmtpbV9rb2JqLCAmdWltX2F0dHJfZ3JwKSkgewotCQlwcl9lcnIoIiBzeXNmcyBlbnRyeSBjcmVhdGlvbiBmYWlsZWQiKTsKLQkJa29iamVjdF9wdXQoa2ltX2dkYXRhLT5raW1fa29iaik7Ci0JCS8qIGZyZWUgcmVxdWVzdGVkIEdQSU9zIGFuZCBmYWlsIHByb2JlICovCi0JCWZvciAocHJvdG8gPSBTVF9CVDsgcHJvdG8gPCBTVF9NQVg7IHByb3RvKyspIHsKLQkJCWlmIChncGlvc1twcm90b10gIT0gLTEpCi0JCQkJZ3Bpb19mcmVlKGdwaW9zW3Byb3RvXSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwkvKiBmYWlsIGluc21vZCAqLwotCX0KLQlwcl9pbmZvKCIgc3lzZnMgZW50cnkgY3JlYXRlZCAiKTsKLSNlbmRpZgogCS8qIGdldCByZWZlcmVuY2Ugb2YgcGRldiBmb3IgcmVxdWVzdF9maXJtd2FyZQogCSAqLwogCWtpbV9nZGF0YS0+a2ltX3BkZXYgPSBwZGV2OwogCWluaXRfY29tcGxldGlvbigma2ltX2dkYXRhLT5raW1fcmN2ZCk7CiAJaW5pdF9jb21wbGV0aW9uKCZraW1fZ2RhdGEtPmxkaXNjX2luc3RhbGxlZCk7Ci0jaWZkZWYgTEVHQUNZX1JGS0lMTF9TVVBQT1JUCisKIAlmb3IgKHByb3RvID0gMDsgKHByb3RvIDwgU1RfTUFYKSAmJiAoZ3Bpb3NbcHJvdG9dICE9IC0xKTsgcHJvdG8rKykgewogCQkvKiBUT0RPOiBzaG91bGQgYWxsIHR5cGVzIGJlIHJma2lsbF90eXBlX2J0ID8gKi8KIAkJa2ltX2dkYXRhLT5yZl9wcm90b3NbcHJvdG9dID0gcHJvdG87CkBAIC02ODUsOCArNzAwLDIwIEBACiAJCX0KIAkJcHJfaW5mbygicmZraWxsIGVudHJ5IGNyZWF0ZWQgZm9yICVsZCIsIGdwaW9zW3Byb3RvXSk7CiAJfQotI2VuZGlmCi0JcmV0dXJuIFNUX1NVQ0NFU1M7CisKKwlraW1fZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInRpLXN0IiwgTlVMTCk7CisJaWYgKElTX0VSUihraW1fZGVidWdmc19kaXIpKSB7CisJCXByX2VycigiIGRlYnVnZnMgZW50cmllcyBjcmVhdGlvbiBmYWlsZWQgIik7CisJCWtpbV9kZWJ1Z2ZzX2RpciA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ2ZXJzaW9uIiwgU19JUlVHTywga2ltX2RlYnVnZnNfZGlyLAorCQkJCWtpbV9nZGF0YSwgJnZlcnNpb25fZGVidWdmc19mb3BzKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwcm90b2NvbHMiLCBTX0lSVUdPLCBraW1fZGVidWdmc19kaXIsCisJCQkJa2ltX2dkYXRhLCAmbGlzdF9kZWJ1Z2ZzX2ZvcHMpOworCXByX2luZm8oIiBkZWJ1Z2ZzIGVudHJpZXMgY3JlYXRlZCAiKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBraW1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC02OTUsMjcgKzcyMiwyNyBAQAogCSAqLwogCWxvbmcgKmdwaW9zID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJbG9uZyBwcm90bzsKKwlzdHJ1Y3Qga2ltX2RhdGFfcwkqa2ltX2dkYXRhOworCisJa2ltX2dkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwogCiAJZm9yIChwcm90byA9IDA7IChwcm90byA8IFNUX01BWCkgJiYgKGdwaW9zW3Byb3RvXSAhPSAtMSk7IHByb3RvKyspIHsKIAkJLyogQ2xhaW0gdGhlIEJsdWV0b290aC9GTS9HUElPCiAJCSAqIG5TaHV0ZG93biBncGlvIGZyb20gdGhlIHN5c3RlbQogCQkgKi8KIAkJZ3Bpb19mcmVlKGdwaW9zW3Byb3RvXSk7Ci0jaWZkZWYgTEVHQUNZX1JGS0lMTF9TVVBQT1JUCiAJCXJma2lsbF91bnJlZ2lzdGVyKGtpbV9nZGF0YS0+cmZraWxsW3Byb3RvXSk7CiAJCXJma2lsbF9kZXN0cm95KGtpbV9nZGF0YS0+cmZraWxsW3Byb3RvXSk7CiAJCWtpbV9nZGF0YS0+cmZraWxsW3Byb3RvXSA9IE5VTEw7Ci0jZW5kaWYKIAl9CiAJcHJfaW5mbygia2ltOiBHUElPIEZyZWVkIik7Ci0jaWZuZGVmIExFR0FDWV9SRktJTExfU1VQUE9SVAotCS8qIGRlbGV0ZSB0aGUgc3lzZnMgZW50cmllcyAqLwotCXN5c2ZzX3JlbW92ZV9ncm91cChraW1fZ2RhdGEtPmtpbV9rb2JqLCAmdWltX2F0dHJfZ3JwKTsKLQlrb2JqZWN0X3B1dChraW1fZ2RhdGEtPmtpbV9rb2JqKTsKLSNlbmRpZgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShraW1fZGVidWdmc19kaXIpOwogCWtpbV9nZGF0YS0+a2ltX3BkZXYgPSBOVUxMOwogCXN0X2NvcmVfZXhpdChraW1fZ2RhdGEtPmNvcmVfZGF0YSk7Ci0JcmV0dXJuIFNUX1NVQ0NFU1M7CisKKwlrZnJlZShraW1fZ2RhdGEpOworCWtpbV9nZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzIzLDI3ICs3NTAsMTkgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3Rfa2ltX2luaXQodm9pZCkKIHsKLQlsb25nIHJldCA9IFNUX1NVQ0NFU1M7Ci0Ja2ltX2dkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGtpbV9kYXRhX3MpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWtpbV9nZGF0YSkgewotCQlwcl9lcnIoIm5vIG1lbSB0byBhbGxvY2F0ZSIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KKwlsb25nIHJldCA9IDA7CiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZraW1fcGxhdGZvcm1fZHJpdmVyKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJfZXJyKCJwbGF0Zm9ybSBkcnYgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9Ci0JcmV0dXJuIFNUX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzdF9raW1fZGVpbml0KHZvaWQpCiB7CiAJLyogdGhlIGZvbGxvd2luZyByZXR1cm5zIHZvaWQgKi8KIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigma2ltX3BsYXRmb3JtX2RyaXZlcik7Ci0Ja2ZyZWUoa2ltX2dkYXRhKTsKLQlraW1fZ2RhdGEgPSBOVUxMOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdF9raW0uaCBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zdF9raW0uaAppbmRleCBmZjMyNzBlLi43ZGUyNTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3Rfa2ltLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2tpbS5oCkBAIC00Myw1MCArNDMsNzIgQEAKICAqIHNpbmNlIHRoZSBzZWxmLXRlc3QgZm9yIGNoaXAgdGFrZXMgYSB3aGlsZQogICovCiAjZGVmaW5lIFBPUl9SRVRSWV9DT1VOVCA1Ci0vKgotICogbGVnYWN5IHJma2lsbCBzdXBwb3J0IHdoZXJlLWluIDMgcmZraWxsCi0gKiBkZXZpY2VzIGFyZSBjcmVhdGVkIGZvciB0aGUgMyBncGlvcwotICogdGhhdCBTVCBoYXMgcmVxdWVzdGVkCisKKy8qKgorICogc3RydWN0IGNoaXBfdmVyc2lvbiAtIHNhdmUgdGhlIGNoaXAgdmVyc2lvbgogICovCi0jZGVmaW5lIExFR0FDWV9SRktJTExfU1VQUE9SVAotLyoKLSAqIGhlYWRlciBmaWxlIGZvciBTVCBwcm92aWRlZCBieSBLSU0KK3N0cnVjdCBjaGlwX3ZlcnNpb24geworCXVuc2lnbmVkIHNob3J0IGZ1bGw7CisJdW5zaWduZWQgc2hvcnQgY2hpcDsKKwl1bnNpZ25lZCBzaG9ydCBtaW5fdmVyOworCXVuc2lnbmVkIHNob3J0IG1hal92ZXI7Cit9OworCisvKioKKyAqIHN0cnVjdCBraW1fZGF0YV9zIC0gdGhlIEtJTSBpbnRlcm5hbCBkYXRhLCBlbWJlZGRlZCBhcyB0aGUKKyAqCXBsYXRmb3JtJ3MgZHJ2IGRhdGEuIE9uZSBmb3IgZWFjaCBTVCBkZXZpY2UgaW4gdGhlIHN5c3RlbS4KKyAqIEB1aW1fcGlkOiBLSU0gbmVlZHMgdG8gY29tbXVuaWNhdGUgd2l0aCBVSU0gdG8gcmVxdWVzdCB0byBpbnN0YWxsCisgKgl0aGUgbGRpc2MgYnkgb3BlbmluZyBVQVJUIHdoZW4gcHJvdG9jb2wgZHJpdmVycyByZWdpc3Rlci4KKyAqIEBraW1fcGRldjogdGhlIHBsYXRmb3JtIGRldmljZSBhZGRlZCBpbiBvbmUgb2YgdGhlIGJvYXJkLVhYLmMgZmlsZQorICoJaW4gYXJjaC9YWC8gZGlyZWN0b3J5LCAxIGZvciBlYWNoIFNUIGRldmljZS4KKyAqIEBraW1fcmN2ZDogY29tcGxldGlvbiBoYW5kbGVyIHRvIG5vdGlmeSB3aGVuIGRhdGEgd2FzIHJlY2VpdmVkLAorICoJbWFpbmx5IHVzZWQgZHVyaW5nIGZ3IGRvd25sb2FkLCB3aGljaCBpbnZvbHZlcyBtdWx0aXBsZSBzZW5kL3dhaXQKKyAqCWZvciBlYWNoIG9mIHRoZSBIQ0ktVlMgY29tbWFuZHMuCisgKiBAbGRpc2NfaW5zdGFsbGVkOiBjb21wbGV0aW9uIGhhbmRsZXIgdG8gbm90aWZ5IHRoYXQgdGhlIFVJTSBhY2NlcHRlZAorICoJdGhlIHJlcXVlc3QgdG8gaW5zdGFsbCBsZGlzYywgbm90aWZ5IGZyb20gdHR5X29wZW4gd2hpY2ggc3VnZ2VzdHMKKyAqCXRoZSBsZGlzYyB3YXMgcHJvcGVybHkgaW5zdGFsbGVkLgorICogQHJlc3BfYnVmZmVyOiBkYXRhIGJ1ZmZlciBmb3IgdGhlIC5idHMgZncgZmlsZSBuYW1lLgorICogQGZ3X2VudHJ5OiBmaXJtd2FyZSBjbGFzcyBzdHJ1Y3QgdG8gcmVxdWVzdC9yZWxlYXNlIHRoZSBmdy4KKyAqIEBncGlvczogdGhlIGxpc3Qgb2YgY29yZS9jaGlwIGVuYWJsZSBncGlvcyBmb3IgQlQsIEZNIGFuZCBHUFMgY29yZXMuCisgKiBAcnhfc3RhdGU6IHRoZSByeCBzdGF0ZSBmb3Iga2ltJ3MgcmVjZWl2ZSBmdW5jIGR1cmluZyBmdyBkb3dubG9hZC4KKyAqIEByeF9jb3VudDogdGhlIHJ4IGNvdW50IGZvciB0aGUga2ltJ3MgcmVjZWl2ZSBmdW5jIGR1cmluZyBmdyBkb3dubG9hZC4KKyAqIEByeF9za2I6IGFsbCBvZiBmdyBkYXRhIG1pZ2h0IG5vdCBjb21lIGF0IG9uY2UsIGFuZCBoZW5jZSBkYXRhIHN0b3JhZ2UgZm9yCisgKgl3aG9sZSBvZiB0aGUgZncgcmVzcG9uc2UsIG9ubHkgSENJX0VWRU5UcyBhbmQgaGVuY2UgZGlmZiBmcm9tIFNUJ3MKKyAqCXJlc3BvbnNlLgorICogQHJma2lsbDogcmZraWxsIGRhdGEgZm9yIGVhY2ggb2YgdGhlIGNvcmVzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCByZmtpbGwuCisgKiBAcmZfcHJvdG9zOiBwcm90byB0eXBlcyBvZiB0aGUgZGF0YSByZWdpc3RlcmVkIHdpdGggcmZraWxsIHN1Yi1zeXN0ZW0uCisgKiBAY29yZV9kYXRhOiBTVCBjb3JlJ3MgZGF0YSwgd2hpY2ggbWFpbmx5IGlzIHRoZSB0dHkncyBkaXNjX2RhdGEKKyAqIEB2ZXJzaW9uOiBjaGlwIHZlcnNpb24gYXZhaWxhYmxlIHZpYSBhIHN5c2ZzIGVudHJ5LgorICoKICAqLwogc3RydWN0IGtpbV9kYXRhX3MgewogCWxvbmcgdWltX3BpZDsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpraW1fcGRldjsKIAlzdHJ1Y3QgY29tcGxldGlvbiBraW1fcmN2ZCwgbGRpc2NfaW5zdGFsbGVkOwotCS8qIE1BWCBsZW4gb2YgdGhlIC5idHMgZmlybXdhcmUgc2NyaXB0IG5hbWUgKi8KIAljaGFyIHJlc3BfYnVmZmVyWzMwXTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OwogCWxvbmcgZ3Bpb3NbU1RfTUFYXTsKLQlzdHJ1Y3Qga29iamVjdCAqa2ltX2tvYmo7Ci0vKiB1c2VkIGJ5IGtpbV9pbnRfcmVjdiB0byB2YWxpZGF0ZSBmdyByZXNwb25zZSAqLwogCXVuc2lnbmVkIGxvbmcgcnhfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyByeF9jb3VudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOwotI2lmZGVmIExFR0FDWV9SRktJTExfU1VQUE9SVAogCXN0cnVjdCByZmtpbGwgKnJma2lsbFtTVF9NQVhdOwogCWVudW0gcHJvdG9fdHlwZSByZl9wcm90b3NbU1RfTUFYXTsKLSNlbmRpZgogCXN0cnVjdCBzdF9kYXRhX3MgKmNvcmVfZGF0YTsKKwlzdHJ1Y3QgY2hpcF92ZXJzaW9uIHZlcnNpb247CiB9OwogCi1sb25nIHN0X2tpbV9zdGFydCh2b2lkKTsKLWxvbmcgc3Rfa2ltX3N0b3Aodm9pZCk7Ci0vKgotICogY2FsbGVkIGZyb20gc3RfdHR5X3JlY2VpdmUgdG8gYXV0aGVudGljYXRlIGZ3X2Rvd25sb2FkCisvKioKKyAqIGZ1bmN0aW9ucyBjYWxsZWQgd2hlbiAxIG9mIHRoZSBwcm90b2NvbCBkcml2ZXJzIGdldHMKKyAqIHJlZ2lzdGVyZWQsIHRoZXNlIG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBVSU0gdG8gcmVxdWVzdAorICogbGRpc2MgaW5zdGFsbGVkLCByZWFkIGNoaXBfdmVyc2lvbiwgZG93bmxvYWQgcmVsZXZhbnQgZncKICAqLworbG9uZyBzdF9raW1fc3RhcnQodm9pZCAqKTsKK2xvbmcgc3Rfa2ltX3N0b3Aodm9pZCAqKTsKKwogdm9pZCBzdF9raW1fcmVjdih2b2lkICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgbG9uZyBjb3VudCk7Ci0KIHZvaWQgc3Rfa2ltX2NoaXBfdG9nZ2xlKGVudW0gcHJvdG9fdHlwZSwgZW51bSBraW1fZ3Bpb19zdGF0ZSk7Ci0KLXZvaWQgc3Rfa2ltX2NvbXBsZXRlKHZvaWQpOwotCi0vKiBmdW5jdGlvbiBjYWxsZWQgZnJvbSBTVCBLSU0gdG8gU1QgQ29yZSwgdG8KLSAqIGxpc3Qgb3V0IHRoZSBwcm90b2NvbHMgcmVnaXN0ZXJlZAotICovCi12b2lkIGtpbV9zdF9saXN0X3Byb3RvY29scyhzdHJ1Y3Qgc3RfZGF0YV9zICosIGNoYXIgKik7Cit2b2lkIHN0X2tpbV9jb21wbGV0ZSh2b2lkICopOwordm9pZCBraW1fc3RfbGlzdF9wcm90b2NvbHMoc3RydWN0IHN0X2RhdGFfcyAqLCB2b2lkICopOwogCiAvKgogICogQlRTIGhlYWRlcnMKQEAgLTk4LDkgKzEyMCwxMyBAQAogI2RlZmluZSBBQ1RJT05fUlVOX1NDUklQVCAgICAgICA1CiAjZGVmaW5lIEFDVElPTl9SRU1BUktTICAgICAgICAgIDYKIAotLyoKLSAqICAqIEJSRiBGaXJtd2FyZSBoZWFkZXIKLSAqICAgKi8KKy8qKgorICogc3RydWN0IGJ0c19oZWFkZXIgLSB0aGUgZncgZmlsZSBpcyBOT1QgYmluYXJ5IHdoaWNoIGNhbgorICoJYmUgc2VudCBvbnRvIFRUWSBhcyBpcy4gVGhlIC5idHMgaXMgbW9yZSBhIHNjcmlwdAorICoJZmlsZSB3aGljaCBoYXMgZGlmZmVyZW50IHR5cGVzIG9mIGFjdGlvbnMuCisgKglFYWNoIHN1Y2ggYWN0aW9uIG5lZWRzIHRvIGJlIHBhcnNlZCBieSB0aGUgS0lNIGFuZAorICoJcmVsZXZhbnQgcHJvY2VkdXJlIHRvIGJlIGNhbGxlZC4KKyAqLwogc3RydWN0IGJ0c19oZWFkZXIgewogCXVpbnQzMl90IG1hZ2ljOwogCXVpbnQzMl90IHZlcnNpb247CkBAIC0xMDgsOSArMTM0LDEwIEBACiAJdWludDhfdCBhY3Rpb25zWzBdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLS8qCi0gKiAgKiBCUkYgQWN0aW9ucyBzdHJ1Y3R1cmUKLSAqICAgKi8KKy8qKgorICogc3RydWN0IGJ0c19hY3Rpb24gLSBFYWNoIC5idHMgYWN0aW9uIGhhcyBpdHMgb3duIHR5cGUgb2YKKyAqCWRhdGEuCisgKi8KIHN0cnVjdCBidHNfYWN0aW9uIHsKIAl1aW50MTZfdCB0eXBlOwogCXVpbnQxNl90IHNpemU7CkBAIC0xMzYsOCArMTYzLDExIEBACiAJdWludDMyX3QgZmxvd19jb250cm9sOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLS8qIGZvciBpZGVudGlmeWluZyB0aGUgY2hhbmdlIHNwZWVkIEhDSSBWUwotICogY29tbWFuZAorLyoqCisgKiBzdHJ1Y3QgaGNpX2NvbW1hbmQgLSB0aGUgSENJLVZTIGZvciBpbnRyZXByZXRpbmcKKyAqCXRoZSBjaGFuZ2UgYmF1ZCByYXRlIG9mIGhvc3Qtc2lkZSBVQVJULCB3aGljaAorICoJbmVlZHMgdG8gYmUgaWdub3JlZCwgc2luY2UgVUlNIHdvdWxkIGRvIHRoYXQKKyAqCXdoZW4gaXQgcmVjZWl2ZXMgcmVxdWVzdCBmcm9tIEtJTSBmb3IgbGRpc2MgaW5zdGFsbGF0aW9uLgogICovCiBzdHJ1Y3QgaGNpX2NvbW1hbmQgewogCXVpbnQ4X3QgcHJlZml4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2xsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfbGwuYwppbmRleCAwNjg1YTEwLi43YTFmYjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfbGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfbGwuYwpAQCAtMzQsNyArMzQsNyBAQAogCiBzdGF0aWMgdm9pZCBsbF9kZXZpY2Vfd2FudF90b19zbGVlcChzdHJ1Y3Qgc3RfZGF0YV9zICpzdF9kYXRhKQogewotCXByX2luZm8oIiVzIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlcyIsIF9fZnVuY19fKTsKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoc3RfZGF0YS0+bGxfc3RhdGUgIT0gU1RfTExfQVdBS0UpCiAJCXByX2VycigiRVJSIGhjaWxsOiBTVF9MTF9HT19UT19TTEVFUF9JTkQiCkBAIC0xMDEsNyArMTAxLDcgQEAKIC8qIGNhbGxlZCB3aGVuIFNUIENvcmUgd2FudHMgdGhlIHN0YXRlICovCiB1bnNpZ25lZCBsb25nIHN0X2xsX2dldHN0YXRlKHN0cnVjdCBzdF9kYXRhX3MgKmxsKQogewotCXByX2luZm8oIiByZXR1cm5pbmcgc3RhdGUgJWxkIiwgbGwtPmxsX3N0YXRlKTsKKwlwcl9kZWJ1ZygiIHJldHVybmluZyBzdGF0ZSAlbGQiLCBsbC0+bGxfc3RhdGUpOwogCXJldHVybiBsbC0+bGxfc3RhdGU7CiB9CiAKQEAgLTEyNyw5ICsxMjcsOSBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIiB1bmtub3duIGlucHV0L3N0YXRlICIpOwotCQlyZXR1cm4gU1RfRVJSX0ZBSUxVUkU7CisJCXJldHVybiAtMTsKIAl9Ci0JcmV0dXJuIFNUX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIC8qIENhbGxlZCBmcm9tIFNUIENPUkUgdG8gaW5pdGlhbGl6ZSBTVCBMTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N0X2xsLmggYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfbGwuaAppbmRleCA3N2RmYmYwLi5lNGRmYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfbGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3RfbGwuaApAQCAtNDEsNiArNDEsNyBAQAogI2RlZmluZSBTVF9MTF9BV0FLRV9UT19BU0xFRVAgICAgICAzCiAjZGVmaW5lIFNUX0xMX0lOVkFMSUQJCSAgIDQKIAorLyogZGlmZmVyZW50IFBNIG5vdGlmaWNhdGlvbnMgY29taW5nIGZyb20gY2hpcCAqLwogI2RlZmluZSBMTF9TTEVFUF9JTkQJMHgzMAogI2RlZmluZSBMTF9TTEVFUF9BQ0sJMHgzMQogI2RlZmluZSBMTF9XQUtFX1VQX0lORAkweDMyCkBAIC01MCwxMyArNTEsMTkgQEAKIGxvbmcgc3RfbGxfaW5pdChzdHJ1Y3Qgc3RfZGF0YV9zICopOwogbG9uZyBzdF9sbF9kZWluaXQoc3RydWN0IHN0X2RhdGFfcyAqKTsKIAotLyogZW5hYmxlL2Rpc2FibGUgU1QgTEwgYWxvbmcgd2l0aCBLSU0gc3RhcnQvc3RvcAorLyoqCisgKiBlbmFibGUvZGlzYWJsZSBTVCBMTCBhbG9uZyB3aXRoIEtJTSBzdGFydC9zdG9wCiAgKiBjYWxsZWQgYnkgU1QgQ29yZQogICovCiB2b2lkIHN0X2xsX2VuYWJsZShzdHJ1Y3Qgc3RfZGF0YV9zICopOwogdm9pZCBzdF9sbF9kaXNhYmxlKHN0cnVjdCBzdF9kYXRhX3MgKik7CiAKKy8qKgorICogdmFyaW91cyBmdW5jcyB1c2VkIGJ5IFNUIGNvcmUgdG8gc2V0L2dldCB0aGUgdmFyaW91cyBQTSBzdGF0ZXMKKyAqIG9mIHRoZSBjaGlwLgorICovCiB1bnNpZ25lZCBsb25nIHN0X2xsX2dldHN0YXRlKHN0cnVjdCBzdF9kYXRhX3MgKik7CiB1bnNpZ25lZCBsb25nIHN0X2xsX3NsZWVwX3N0YXRlKHN0cnVjdCBzdF9kYXRhX3MgKiwgdW5zaWduZWQgY2hhcik7CiB2b2lkIHN0X2xsX3dha2V1cChzdHJ1Y3Qgc3RfZGF0YV9zICopOworCiAjZW5kaWYgLyogU1RfTExfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N5c2ZzLXVpbSBiL2RyaXZlcnMvc3RhZ2luZy90aS1zdC9zeXNmcy11aW0KaW5kZXggMTAzMTFhZi4uNjI2YmRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpLXN0L3N5c2ZzLXVpbQorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGktc3Qvc3lzZnMtdWltCkBAIC0xNCwzICsxNCwxNSBAQAogCQl1bmluc3RhbGxhdGlvbiB3b3VsZCBiZSBwcG9sbGluZyBvbiB0aGlzIGRldmljZSBhbmQgbGlzdGVuaW5nCiAJCW9uIGV2ZW50cyB3aGljaCB3b3VsZCBzdWdnZXN0IGVpdGhlciB0byBpbnN0YWxsIG9yIHVuLWluc3RhbGwKIAkJbGluZSBkaXNjaXBsaW5lCisKK1doYXQ6ICAgICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy90aS1zdC92ZXJzaW9uCitDb250YWN0OiAgICAgICAgUGF2YW4gU2F2b3kgPHBhdmFuX3Nhdm95QHRpLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlXaUxpbmsgY2hpcCdzIFJPTSB2ZXJzaW9uIGV4cG9zZWQgdG8gdXNlci1zcGFjZSBmb3Igc29tZQorCQlwcm9wcmlldGFyeSBwcm90b2NvbCBzdGFja3MgdG8gbWFrZSB1c2Ugb2YuCisKK1doYXQ6ICAgICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy90aS1zdC9wcm90b2NvbHMKK0NvbnRhY3Q6ICAgICAgICBQYXZhbiBTYXZveSA8cGF2YW5fc2F2b3lAdGkuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSByZWFzb24gZm9yIGNoaXAgYmVpbmcgT04sIHRoZSBsaXN0IG9mIHByb3RvY29scyByZWdpc3RlcmVkLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvRG9jdW1lbnRhdGlvbi9DT05UUklCVVRPUlMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvRG9jdW1lbnRhdGlvbi9DT05UUklCVVRPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmNTc4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9Eb2N1bWVudGF0aW9uL0NPTlRSSUJVVE9SUwpAQCAtMCwwICsxLDQ1IEBACitUSSBEU1AvQnJpZGdlIERyaXZlciAtIENvbnRyaWJ1dG9ycyBGaWxlCisKK1RoZSBEU1AvQnJpZGdlIHByb2plY3Qgd2lzaCB0byB0aGFuayBhbGwgb2YgaXRzIGNvbnRyaWJ1dG9ycywgY3VycmVudCBicmlkZ2UKK2RyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSB3b3JrIG9mIGFsbCBvZiB0aGVtLiBJZiBhbnkgbmFtZSBpcyBhY2NpZGVudGFsbHkKK29taXR0ZWQsIGxldCB1cyBrbm93IGJ5IHNlbmRpbmcgYSBtYWlsIHRvIG9tYXIucmFtaXJlekB0aS5jb20gb3IKK3gwOTU4NDBAdGkuY29tLgorCitQbGVhc2Uga2VlcCB0aGUgZm9sbG93aW5nIGxpc3QgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorCisJU3VtYW4gQW5uYQorCVNyaXBhbCBCYWdhZGlhCisJRmVsaXBlIEJhbGJpCisJT2hhZCBCZW4tQ29oZW4KKwlQaGlsIENhcm1vZHkKKwlEZWVwYWsgQ2hpdHJpa2kKKwlGZWxpcGUgQ29udHJlcmFzCisJSGlyb3NoaSBEb3l1CisJU2V0aCBGb3JzaGVlCisJSXZhbiBHb21leiBDYXN0ZWxsYW5vcworCU1hcmsgR3Jvc2VuCisJUmFtZXNoIEd1cHRhIEcKKwlGZXJuYW5kbyBHdXptYW4gTHVnbworCUF4ZWwgSGFzbGFtCisJSmFuZXQgSGVhZAorCVNoaXZhbmFuZGEgSGViYmFyCisJSGFyaSBLYW5pZ2VyaQorCVRvbnkgTGluZGdyZW4KKwlBbnRvbmlvIEx1bmEKKwlIYXJpIE5hZ2FsbGEKKwlOaXNoYW50aCBNZW5vbgorCUFtZXlhIFBhbGFuZGUKKwlWaWpheSBQYXNhbQorCUdpbGJlcnQgUGl0bmV5CisJT21hciBSYW1pcmV6IEx1bmEKKwlFcm5lc3RvIFJhbW9zCisJQ2hyaXMgUmluZworCUxhcnJ5IFNjaGllZmVyCisJUmViZWNjYSBTY2h1bHR6IFphdmluCisJQmhhdmluIFNoYWgKKwlBbmR5IFNoZXZjaGVua28KKwlKZWZmIFRheWxvcgorCVJvbWFuIFRlcmVzaG9ua292CisJQXJtYW5kbyBVcmliZSBkZSBMZW9uCisJTmlzY2hhbCBWYXJpZGUKKwlXZW5iaWFvIFdhbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9Eb2N1bWVudGF0aW9uL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9Eb2N1bWVudGF0aW9uL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZkMzcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0RvY3VtZW50YXRpb24vUkVBRE1FCkBAIC0wLDAgKzEsNzAgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbnV4IERTUC9CSU9TIEJyaWRnZSByZWxlYXNlCisKK0RTUC9CSU9TIEJyaWRnZSBvdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09CisKK0RTUC9CSU9TIEJyaWRnZSBpcyBkZXNpZ25lZCBmb3IgcGxhdGZvcm1zIHRoYXQgY29udGFpbiBhIEdQUCBhbmQgb25lIG9yIG1vcmUKK2F0dGFjaGVkIERTUHMuICBUaGUgR1BQIGlzIGNvbnNpZGVyZWQgdGhlIG1hc3RlciBvciAiaG9zdCIgcHJvY2Vzc29yLCBhbmQgdGhlCithdHRhY2hlZCBEU1BzIGFyZSBwcm9jZXNzaW5nIHJlc291cmNlcyB0aGF0IGNhbiBiZSB1dGlsaXplZCBieSBhcHBsaWNhdGlvbnMKK2FuZCBkcml2ZXJzIHJ1bm5pbmcgb24gdGhlIEdQUC4KKworVGhlIGFic3RyYWN0aW9uIHRoYXQgRFNQL0JJT1MgQnJpZGdlIHN1cHBsaWVzLCBpcyBhIGRpcmVjdCBsaW5rIGJldHdlZW4gYSBHUFAKK3Byb2dyYW0gYW5kIGEgRFNQIHRhc2suICBUaGlzIGNvbW11bmljYXRpb24gbGluayBpcyBwYXJ0aXRpb25lZCBpbnRvIHR3bwordHlwZXMgb2Ygc3ViLWxpbmtzOiAgbWVzc2FnaW5nIChzaG9ydCwgZml4ZWQtbGVuZ3RoIHBhY2tldHMpIGFuZCBkYXRhCitzdHJlYW1pbmcgKG11bHRpcGxlLCBsYXJnZSBidWZmZXJzKS4gIEVhY2ggc3ViLWxpbmsgb3BlcmF0ZXMgaW5kZXBlbmRlbnRseSwKK2FuZCBmZWF0dXJlcyBpbi1vcmRlciBkZWxpdmVyeSBvZiBkYXRhLCBtZWFuaW5nIHRoYXQgbWVzc2FnZXMgYXJlIGRlbGl2ZXJlZAoraW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzdWJtaXR0ZWQgdG8gdGhlIG1lc3NhZ2UgbGluaywgYW5kIHN0cmVhbSBidWZmZXJzIGFyZQorZGVsaXZlcmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc3VibWl0dGVkIHRvIHRoZSBzdHJlYW0gbGluay4KKworSW4gYWRkaXRpb24sIGEgR1BQIGNsaWVudCBjYW4gc3BlY2lmeSB3aGF0IGlucHV0cyBhbmQgb3V0cHV0cyBhIERTUCB0YXNrCit1c2VzLiBEU1AgdGFza3MgdHlwaWNhbGx5IHVzZSBtZXNzYWdlIG9iamVjdHMgZm9yIHBhc3NpbmcgY29udHJvbCBhbmQgc3RhdHVzCitpbmZvcm1hdGlvbiBhbmQgc3RyZWFtIG9iamVjdHMgZm9yIGVmZmljaWVudCBzdHJlYW1pbmcgb2YgcmVhbC10aW1lIGRhdGEuCisKK0dQUCBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworQSBHUFAgYXBwbGljYXRpb24gY29tbXVuaWNhdGVzIHdpdGggaXRzIGFzc29jaWF0ZWQgRFNQIHRhc2sgcnVubmluZyBvbiB0aGUKK0RTUCBzdWJzeXN0ZW0gdXNpbmcgdGhlIERTUC9CSU9TIEJyaWRnZSBBUEkuIEZvciBleGFtcGxlLCBhIEdQUCBhdWRpbworYXBwbGljYXRpb24gY2FuIHVzZSB0aGUgQVBJIHRvIHBhc3MgbWVzc2FnZXMgdG8gYSBEU1AgdGFzayB0aGF0IGlzIG1hbmFnaW5nCitkYXRhIGZsb3dpbmcgZnJvbSBhbmFsb2ctdG8tZGlnaXRhbCBjb252ZXJ0ZXJzIChBRENzKSB0byBkaWdpdGFsLXRvLWFuYWxvZworY29udmVydGVycyAoREFDcykuCisKK0Zyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBHUFAgT1MsIHRoZSBEU1AgaXMgdHJlYXRlZCBhcyBqdXN0IGFub3RoZXIKK3BlcmlwaGVyYWwgZGV2aWNlLiAgIE1vc3QgaGlnaCBsZXZlbCBHUFAgT1MgdHlwaWNhbGx5IHN1cHBvcnQgYSBkZXZpY2UgZHJpdmVyCittb2RlbCwgd2hlcmVieSBhcHBsaWNhdGlvbnMgY2FuIHNhZmVseSBhY2Nlc3MgYW5kIHNoYXJlIGEgaGFyZHdhcmUgcGVyaXBoZXJhbAordGhyb3VnaCBzdGFuZGFyZCBkcml2ZXIgaW50ZXJmYWNlcy4gIFRoZXJlZm9yZSwgdG8gYWxsb3cgbXVsdGlwbGUgR1BQCithcHBsaWNhdGlvbnMgdG8gc2hhcmUgYWNjZXNzIHRvIHRoZSBEU1AsIHRoZSBHUFAgc2lkZSBvZiBEU1AvQklPUyBCcmlkZ2UKK2ltcGxlbWVudHMgYSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgRFNQLgorCitTaW5jZSBkcml2ZXIgaW50ZXJmYWNlcyBhcmUgbm90IGFsd2F5cyBzdGFuZGFyZCBhY3Jvc3MgR1BQIE9TLCBhbmQgdG8gcHJvdmlkZQorc29tZSBsZXZlbCBvZiBpbnRlcm9wZXJhYmlsaXR5IG9mIGFwcGxpY2F0aW9uIGNvZGUgdXNpbmcgRFNQL0JJT1MgQnJpZGdlCitiZXR3ZWVuIEdQUCBPUywgRFNQL0JJT1MgQnJpZGdlIHByb3ZpZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBvZiBBUElzIHdoaWNoCit3cmFwIGNhbGxzIGludG8gdGhlIGRldmljZSBkcml2ZXIuICAgU28sIHJhdGhlciB0aGFuIGNhbGxpbmcgR1BQIE9TIHNwZWNpZmljCitkcml2ZXIgaW50ZXJmYWNlcywgYXBwbGljYXRpb25zIChhbmQgZXZlbiBvdGhlciBkZXZpY2UgZHJpdmVycykgY2FuIHVzZSB0aGUKK3N0YW5kYXJkIEFQSSBsaWJyYXJ5IGRpcmVjdGx5LgorCitEU1AgU29mdHdhcmUgQXJjaGl0ZWN0dXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZvciBEU1AvQklPUywgRFNQL0JJT1MgQnJpZGdlIGFkZHMgYSBkZXZpY2UtaW5kZXBlbmRlbnQgc3RyZWFtaW5nIEkvTyAoU1RSTSkKK2ludGVyZmFjZSwgYSBtZXNzYWdpbmcgaW50ZXJmYWNlIChOT0RFKSwgYW5kIGEgUmVzb3VyY2UgTWFuYWdlciAoUk0pIFNlcnZlci4KK1RoZSBSTSBTZXJ2ZXIgcnVucyBhcyBhIHRhc2sgb2YgRFNQL0JJT1MgYW5kIGlzIHN1YnNlcnZpZW50IHRvIGNvbW1hbmRzCithbmQgcXVlcmllcyBmcm9tIHRoZSBHUFAuICBJdCBleGVjdXRlcyBjb21tYW5kcyB0byBzdGFydCBhbmQgc3RvcCBEU1Agc2lnbmFsCitwcm9jZXNzaW5nIG5vZGVzIGluIHJlc3BvbnNlIHRvIEdQUCBwcm9ncmFtcyBtYWtpbmcgcmVxdWVzdHMgdGhyb3VnaCB0aGUKKyhHUFAtc2lkZSkgQVBJLgorCitEU1AgdGFza3Mgc3RhcnRlZCBieSB0aGUgUk0gU2VydmVyIGFyZSBzaW1pbGFyIHRvIGFueSBvdGhlciBEU1AgdGFzayB3aXRoIHR3bworaW1wb3J0YW50IGRpZmZlcmVuY2VzOiAgdGhleSBtdXN0IGZvbGxvdyBhIHNwZWNpZmljIHRhc2sgbW9kZWwgY29uc2lzdGluZyBvZgordGhyZWUgQy1jYWxsYWJsZSBmdW5jdGlvbnMgKG5vZGUgY3JlYXRlLCBleGVjdXRlLCBhbmQgZGVsZXRlKSwgd2l0aCBzcGVjaWZpYworc2V0cyBvZiBhcmd1bWVudHMsIGFuZCB0aGV5IGhhdmUgYSBwcmUtZGVmaW5lZCB0YXNrIGVudmlyb25tZW50IGVzdGFibGlzaGVkCitieSB0aGUgUk0gU2VydmVyLgorCitUYXNrcyBzdGFydGVkIGJ5IHRoZSBSTSBTZXJ2ZXIgY29tbXVuaWNhdGUgdXNpbmcgdGhlIFNUUk0gYW5kIE5PREUgaW50ZXJmYWNlcworYW5kIGFjdCBhcyBzZXJ2ZXJzIGZvciB0aGVpciBjb3JyZXNwb25kaW5nIEdQUCBjbGllbnRzLCBwZXJmb3JtaW5nIHNpZ25hbAorcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXMgcmVxdWVzdGVkIGJ5IG1lc3NhZ2VzIHNlbnQgYnkgdGhlaXIgR1BQIGNsaWVudC4KK1R5cGljYWxseSwgYSBEU1AgdGFzayBtb3ZlcyBkYXRhIGZyb20gc291cmNlIGRldmljZXMgdG8gc2luayBkZXZpY2VzIHVzaW5nCitkZXZpY2UgaW5kZXBlbmRlbnQgSS9PIHN0cmVhbXMsIHBlcmZvcm1pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgcHJvY2Vzc2luZworYW5kIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGUgZGF0YSB3aGlsZSBpdCBpcyBtb3ZlZC4gIEZvciBleGFtcGxlLCBhbiBhdWRpbwordGFzayBtaWdodCBwZXJmb3JtIGF1ZGlvIGRlY29tcHJlc3Npb24gKEFEUENNLCBNUEVHLCBDRUxQKSBvbiBkYXRhIHJlY2VpdmVkCitmcm9tIGEgR1BQIGF1ZGlvIGRyaXZlciBhbmQgdGhlbiBzZW5kIHRoZSBkZWNvbXByZXNzZWQgbGluZWFyIHNhbXBsZXMgdG8gYQorZGlnaXRhbC10by1hbmFsb2cgY29udmVydGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0RvY3VtZW50YXRpb24vZXJyb3ItY29kZXMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvRG9jdW1lbnRhdGlvbi9lcnJvci1jb2RlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjgyNmUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0RvY3VtZW50YXRpb24vZXJyb3ItY29kZXMKQEAgLTAsMCArMSwxNTcgQEAKKwkJCURTUC9CcmlkZ2UgRXJyb3IgQ29kZSBHdWlkZQorCisKK1N1Y2Nlc3MgY29kZSBpcyBhbHdheXMgdGFrZW4gYXMgMCwgZXhjZXB0IGZvciBvbmUgY2FzZSB3aGVyZSBhIHN1Y2Nlc3Mgc3RhdHVzCitkaWZmZXJlbnQgdGhhbiAwIGNhbiBiZSBwb3NzaWJsZSwgdGhpcyBpcyB3aGVuIGVudW1lcmF0aW5nIGEgc2VyaWVzIG9mIGRzcAorb2JqZWN0cywgaWYgdGhlIGVudW1lcmF0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSBvYmplY3RzIGl0IGlzIGNvbnNpZGVyZWQgYXMgYQorc3VjY2Vzc2Z1bCBjYXNlLiBJbiB0aGlzIGNhc2UgYSBwb3NpdGl2ZSBFTk9EQVRBIGlzIHJldHVybmVkIChUT0RPOiBDaGFuZ2UgdG8KK2F2b2lkIHRoaXMgY2FzZSkuCisKK0Vycm9yIGNvZGVzIGFyZSByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIDEsIGlmIGFuIHNwZWNpZmljIGNvZGUgaXMgZXhwZWN0ZWQsIGl0CitjYW4gYmUgcHJvcGFnYXRlZCB0byB1c2VyIHNwYWNlIGJ5IHJlYWRpbmcgZXJybm8gc3ltYm9sIGRlZmluZWQgaW4gZXJybm8uaCwgZm9yCitzcGVjaWZpYyBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBhIGNvcHkgb2YgdGhlIHN0YW5kYXJkIHVzZWQgc2hvdWxkIGJlCityZWFkIGZpcnN0LgorCitUaGUgZXJyb3IgY29kZXMgdXNlZCBieSB0aGlzIGRyaXZlciBhcmU6CisKK1tFUEVSTV0KKyAgICBHZW5lcmFsIGRyaXZlciBmYWlsdXJlLgorCisgICAgQWNjb3JkaW5nIHRvIHRoZSB1c2UgY2FzZSB0aGUgZm9sbG93aW5nIG1pZ2h0IGFwcGx5OgorICAgIC0gRGV2aWNlIGlzIGluICdzbGVlcC9zdXNwZW5kJyBtb2RlIGR1ZSB0byBEUE0uCisgICAgLSBVc2VyIGNhbm5vdCBtYXJrIGVuZCBvZiBzdHJlYW0gb24gYW4gaW5wdXQgY2hhbm5lbC4KKyAgICAtIFJlcXVlc3RlZCBvcGVyYXRpb24gaXMgaW52YWxpZCBmb3IgdGhlIG5vZGUgdHlwZS4KKyAgICAtIEludmFsaWQgYWxpZ25tZW50IGZvciB0aGUgbm9kZSBtZXNzYWdpbmcgYnVmZmVyLgorICAgIC0gVGhlIHNwZWNpZmllZCBkaXJlY3Rpb24gaXMgaW52YWxpZCBmb3IgdGhlIHN0cmVhbS4KKyAgICAtIEludmFsaWQgc3RyZWFtIG1vZGUuCisKK1tFTk9FTlRdCisgICAgVGhlIHNwZWNpZmllZCBvYmplY3Qgb3IgZmlsZSB3YXMgbm90IGZvdW5kLgorCitbRVNSQ0hdCisgICAgQSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBjb250YWluZWQgaW4gYSBtZXNzYWdlIG9yIHN0cmVhbSBjb3VsZCBub3QgYmUgbWFwcGVkCisgICAgdG8gdGhlIEdQUCBjbGllbnQgcHJvY2VzcydzIHZpcnR1YWwgc3BhY2UuCisKK1tFSU9dCisgICAgRHJpdmVyIGludGVyZmFjZSBJL08gZXJyb3IuCisKKyAgICBvcjoKKyAgICAtIFVuYWJsZSB0byBwbHVnIGNoYW5uZWwgSVNSIGZvciBjb25maWd1cmVkIElSUS4KKyAgICAtIE5vIGZyZWUgSS9PIHJlcXVlc3QgcGFja2V0cyBhcmUgYXZhaWxhYmxlLgorCitbRU5YSU9dCisgICAgVW5hYmxlIHRvIGZpbmQgYSBuYW1lZCBzZWN0aW9uIGluIERTUCBleGVjdXRhYmxlIG9yIGEgbm9uLWV4aXN0ZW50IG1lbW9yeQorICAgIHNlZ21lbnQgaWRlbnRpZmllciB3YXMgc3BlY2lmaWVkLgorCitbRUJBREZdCisgICAgR2VuZXJhbCBlcnJvciBmb3IgZmlsZSBoYW5kbGluZzoKKworICAgIC0gVW5hYmxlIHRvIG9wZW4gZmlsZS4KKyAgICAtIFVuYWJsZSB0byByZWFkIGZpbGUuCisgICAgLSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSBEU1AgZXhlY3V0YWJsZSBmaWxlLgorCitbRU5PTUVNXQorICAgIEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvY2N1cnJlZC4KKworW0VBQ0NFU10KKyAgICAtIFVuYWJsZSB0byByZWFkIGNvbnRlbnQgb2YgRENEIGRhdGEgc2VjdGlvbjsgdGhpcyBpcyB0eXBpY2FsbHkgY2F1c2VkIGJ5CisgICAgaW1wcm9wZXJseSBjb25maWd1cmVkIG5vZGVzLgorICAgIC0gVW5hYmxlIHRvIGRlY29kZSBEQ0QgZGF0YSBzZWN0aW9uIGNvbnRlbnQ7IHRoaXMgaXMgdHlwaWNhbGx5IGNhdXNlZCBieQorICAgIGNoYW5nZXMgdG8gRFNQL0JJT1MgQnJpZGdlIGRhdGEgc3RydWN0dXJlcy4KKyAgICAtIFVuYWJsZSB0byBnZXQgcG9pbnRlciB0byBEQ0QgZGF0YSBzZWN0aW9uOyB0aGlzIGlzIHR5cGljYWxseSBjYXVzZWQgYnkKKyAgICBpbXByb3Blcmx5IGNvbmZpZ3VyZWQgVVVJRHMuCisgICAgLSBVbmFibGUgdG8gbG9hZCBmaWxlIGNvbnRhaW5pbmcgRENEIGRhdGEgc2VjdGlvbjsgdGhpcyBpcyB0eXBpY2FsbHkKKyAgICBjYXVzZWQgYnkgYSBtaXNzaW5nIENPRkYgZmlsZS4KKyAgICAtIFRoZSBzcGVjaWZpZWQgQ09GRiBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBub2RlIHJlZ2lzdHJhdGlvbgorICAgIHNlY3Rpb24uCisKK1tFRkFVTFRdCisgICAgSW52YWxpZCBwb2ludGVyIG9yIGhhbmRsZXIuCisKK1tFRVhJU1RdCisgICAgQXR0ZW1wdGVkIHRvIGNyZWF0ZSBhIGNoYW5uZWwgbWFuYWdlciAgd2hlbiBvbmUgYWxyZWFkeSBleGlzdHMuCisKK1tFSU5WQUxdCisgICAgSW52YWxpZCBhcmd1bWVudC4KKworW0VTUElQRV0KKyAgICBTeW1ib2wgbm90IGZvdW5kIGluIHRoZSBDT0ZGIGZpbGUuICBEU1BOb2RlX0NyZWF0ZSB3aWxsIHJldHVybiB0aGlzIGlmCisgICAgdGhlIGlBbGcgZnVuY3Rpb24gdGFibGUgZm9yIGFuIHhEQUlTIHNvY2tldCBpcyBub3QgZm91bmQgaW4gdGhlIENPRkYgZmlsZS4KKyAgICBJbiB0aGlzIGNhc2UsIGZvcmNlIHRoZSBzeW1ib2wgdG8gYmUgbGlua2VkIGludG8gdGhlIENPRkYgZmlsZS4KKyAgICBEU1BOb2RlX0NyZWF0ZSwgRFNQTm9kZV9FeGVjdXRlLCBhbmQgRFNQTm9kZV9EZWxldGUgd2lsbCByZXR1cm4gdGhpcyBpZgorICAgIHRoZSBjcmVhdGUsIGV4ZWN1dGUsIG9yIGRlbGV0ZSBwaGFzZSBmdW5jdGlvbiwgcmVzcGVjdGl2ZWx5LCBjb3VsZCBub3QgYmUKKyAgICBmb3VuZCBpbiB0aGUgQ09GRiBmaWxlLgorCisgICAgLSBObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkL2ZvdW5kIGZvciB0aGlzIGJvYXJkLgorICAgIC0gVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIFpMIENPRkYgcGFyc2luZyBtb2R1bGUuCisKK1tFUElQRV0KKyAgICBJL08gaXMgY3VycmVudGx5IHBlbmRpbmcuCisKKyAgICAtIEVuZCBvZiBzdHJlYW0gd2FzIGFscmVhZHkgcmVxdWVzdGVkIG9uIHRoaXMgb3V0cHV0IGNoYW5uZWwuCisKK1tFRE9NXQorICAgIEEgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBvdXRzaWRlIGl0cyB2YWxpZCByYW5nZS4KKworW0VOT1NZU10KKyAgICBUaGUgaW5kaWNhdGVkIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgorCitbRUlEUk1dCisgICAgRHVyaW5nIGVudW1lcmF0aW9uIGEgY2hhbmdlIGluIHRoZSBudW1iZXIgb3IgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0cworICAgIGhhcyBvY2N1cnJlZC4KKworW0VDSFJOR10KKyAgICBBdHRlbXB0IHRvIGNyZWF0ZWQgY2hhbm5lbCBtYW5hZ2VyIHdpdGggdG9vIG1hbnkgY2hhbm5lbHMgb3IgY2hhbm5lbCBJRCBvdXQKKyAgICBvZiByYW5nZS4KKworW0VCQURSXQorICAgIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBpbmNvcnJlY3QgZm9yIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorCisgICAgLSBJbnZhbGlkIHNlZ21lbnQgSUQuCisKK1tFTk9EQVRBXQorICAgIFVuYWJsZSB0byByZXRyaWV2ZSByZXNvdXJjZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZWdpc3RyeS4KKworICAgIC0gTm8gbW9yZSByZWdpc3RyeSB2YWx1ZXMuCisKK1tFVElNRV0KKyAgICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNvdWxkIGNvbXBsZXRlLgorCitbRU5PU1JdCisgICAgQSBzdHJlYW0gaGFzIGJlZW4gaXNzdWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGFsbG93ZWQgaW4gdGhlCisgICAgc3RyZWFtIGF0IG9uY2U7IGJ1ZmZlcnMgbXVzdCBiZSByZWNsYWltZWQgZnJvbSB0aGUgc3RyZWFtIGJlZm9yZSBhbnkgbW9yZQorICAgIGNhbiBiZSBpc3N1ZWQuCisKKyAgICAtIE5vIGZyZWUgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS4KKworW0VJTFNFUV0KKyAgICBFcnJvciBvY2N1cnJlZCBpbiBhIGR5bmFtaWMgbG9hZGVyIGxpYnJhcnkgZnVuY3Rpb24uCisKK1tFSVNDT05OXQorICAgIFRoZSBTcGVjaWZpZWQgQ29ubmVjdGlvbiBhbHJlYWR5IGV4aXN0cy4KKworW0VOT1RDT05OXQorICAgIE5vZGVzIG5vdCBjb25uZWN0ZWQuCisKK1tFVElNRURPVVRdCisgICAgVGltZW91dCBvY2N1cnJlZCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIGhhcmR3YXJlLgorCisgICAgLSBXYWl0IGZvciBmbHVzaCBvcGVyYXRpb24gb24gYW4gb3V0cHV0IGNoYW5uZWwgdGltZWQgb3V0LgorCitbRUNPTk5SRUZVU0VEXQorICAgIE5vIG1vcmUgY29ubmVjdGlvbnMgY2FuIGJlIG1hZGUgZm9yIHRoaXMgbm9kZS4KKworW0VBTFJFQURZXQorICAgIENoYW5uZWwgaXMgYWxyZWFkeSBpbiB1c2UuCisKK1tFUkVNT1RFSU9dCisgICAgZHdUaW1lT3V0IHBhcmFtZXRlciB3YXMgQ0hOTF9JT0NOT1dBSVQsIHlldCBubyBJL08gY29tcGxldGlvbnMgd2VyZQorICAgIHF1ZXVlZC4KKworW0VDQU5DRUxFRF0KKyAgICBJL08gaGFzIGJlZW4gY2FuY2VsbGVkIG9uIHRoaXMgY2hhbm5lbC4KKworW0VOT0tFWV0KKyAgICBJbnZhbGlkIHN1YmtleSBwYXJhbWV0ZXIuCisKKyAgICAtIFVVSUQgbm90IGZvdW5kIGluIHJlZ2lzdHJ5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RlNGYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKQEAgLTAsMCArMSw5MCBAQAorIworIyBEU1AgQnJpZGdlIERyaXZlciBTdXBwb3J0CisjCisKK21lbnVjb25maWcgVElEU1BCUklER0UKKwl0cmlzdGF0ZSAiRFNQIEJyaWRnZSBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAzCisJc2VsZWN0IE9NQVBfTUJPWF9GV0sKKwloZWxwCisJICBEU1AvQklPUyBCcmlkZ2UgaXMgZGVzaWduZWQgZm9yIHBsYXRmb3JtcyB0aGF0IGNvbnRhaW4gYSBHUFAgYW5kCisJICBvbmUgb3IgbW9yZSBhdHRhY2hlZCBEU1BzLiAgVGhlIEdQUCBpcyBjb25zaWRlcmVkIHRoZSBtYXN0ZXIgb3IKKwkgICJob3N0IiBwcm9jZXNzb3IsIGFuZCB0aGUgYXR0YWNoZWQgRFNQcyBhcmUgcHJvY2Vzc2luZyByZXNvdXJjZXMKKwkgIHRoYXQgY2FuIGJlIHV0aWxpemVkIGJ5IGFwcGxpY2F0aW9ucyBhbmQgZHJpdmVycyBydW5uaW5nIG9uIHRoZSBHUFAuCisKKwkgIFRoaXMgZHJpdmVyIGRlcGVuZHMgb24gT01BUCBNYWlsYm94IChPTUFQX01CT1hfRldLKS4KKworY29uZmlnIFRJRFNQQlJJREdFX0RWRlMKKwlib29sICJFbmFibGUgQnJpZGdlIER5bmFtaWMgVm9sdGFnZSBhbmQgRnJlcXVlbmN5IFNjYWxpbmcgKERWRlMpIgorCWRlcGVuZHMgb24gVElEU1BCUklER0UgJiYgT01BUF9QTV9TUkYgJiYgQ1BVX0ZSRVEKKwloZWxwCisJICBEVkZTIGFsbG93cyBEU1AgQnJpZGdlIHRvIGluaXRpYXRlIHRoZSBvcGVyYXRpbmcgcG9pbnQgY2hhbmdlIHRvCisJICBzY2FsZSB0aGUgY2hpcCB2b2x0YWdlIGFuZCBmcmVxdWVuY3kgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlCisJICBwZXJmb3JtYW5jZSBhbmQgcG93ZXIgY29uc3VtcHRpb24gdG8gdGhlIGN1cnJlbnQgcHJvY2Vzc2luZworCSAgcmVxdWlyZW1lbnRzLgorCitjb25maWcgVElEU1BCUklER0VfTUVNUE9PTF9TSVpFCisJaGV4ICJQaHlzaWNhbCBtZW1vcnkgcG9vbCBzaXplIChCeXRlKSIKKwlkZXBlbmRzIG9uIFRJRFNQQlJJREdFCisJZGVmYXVsdCAweDYwMDAwMAorCWhlbHAKKwkgIEFsbG9jYXRlIHNwZWNpZmllZCBzaXplIG9mIG1lbW9yeSBhdCBib290aW5nIHRpbWUgdG8gYXZvaWQgYWxsb2NhdGlvbgorCSAgZmFpbHVyZSB1bmRlciBoZWF2eSBtZW1vcnkgZnJhZ21lbnRhdGlvbiBhZnRlciBzb21lIHVzZSB0aW1lLgorCitjb25maWcgVElEU1BCUklER0VfREVCVUcKKwlib29sICJEZWJ1ZyBTdXBwb3J0IgorCWRlcGVuZHMgb24gVElEU1BCUklER0UKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgQnJpZGdlIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMKKworY29uZmlnIFRJRFNQQlJJREdFX1JFQ09WRVJZCisJYm9vbCAiUmVjb3ZlcnkgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRJRFNQQlJJREdFCisJZGVmYXVsdCB5CisJaGVscAorCSAgSW4gY2FzZSBvZiBEU1AgZmF0YWwgZXJyb3IsIEJSSURHRSBkcml2ZXIgd2lsbCB0cnkgdG8KKwkgIHJlY292ZXIgaXRzZWxmLgorCitjb25maWcgVElEU1BCUklER0VfQ0FDSEVfTElORV9DSEVDSworCWJvb2wgIkNoZWNrIGJ1ZmZlcnMgdG8gYmUgMTI4IGJ5dGUgYWxpZ25lZCIKKwlkZXBlbmRzIG9uIFRJRFNQQlJJREdFCisJaGVscAorCSAgV2hlbiB0aGUgRFNQIHByb2Nlc3NlcyBkYXRhLCB0aGUgRFNQIGNhY2hlIGNvbnRyb2xsZXIgbG9hZHMgMTI4LUJ5dGUKKwkgIGNodW5rcyAobGluZXMpIGZyb20gU0RSQU0gYW5kIHdyaXRlcyB0aGUgZGF0YSBiYWNrIGluIDEyOC1CeXRlIGNodW5rcy4KKwkgIElmIGEgRE1NIGJ1ZmZlciBkb2VzIG5vdCBzdGFydCBhbmQgZW5kIG9uIGEgMTI4LUJ5dGUgYm91bmRhcnksIHRoZSBkYXRhCisJICBwcmVjZWRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MgKFNBKSBmcm9tIHRoZSAxMjgtQnl0ZSBib3VuZGFyeSB0byB0aGUgU0EKKwkgIGFuZCB0aGUgZGF0YSBhdCBhZGRyZXNzZXMgdHJhaWxpbmcgdGhlIGVuZCBhZGRyZXNzIChFQSkgZnJvbSB0aGUgRUEgdG8KKwkgIHRoZSBuZXh0IDEyOC1CeXRlIGJvdW5kYXJ5IHdpbGwgYmUgbG9hZGVkIGFuZCB3cml0dGVuIGJhY2sgYXMgd2VsbC4KKwkgIFRoaXMgY2FuIGxlYWQgdG8gaGVhcCBjb3JydXB0aW9uLiBTYXkgWSwgdG8gZW5mb3JjZSB0aGUgY2hlY2sgZm9yIDEyOAorCSAgYnl0ZSBhbGlnbm1lbnQsIGJ1ZmZlcnMgZmFpbGluZyB0aGlzIGNoZWNrIHdpbGwgYmUgcmVqZWN0ZWQuCisKK2NvbmZpZyBUSURTUEJSSURHRV9XRFQzCisJYm9vbCAiRW5hYmxlIHdhdGNoZG9nIHRpbWVyIgorCWRlcGVuZHMgb24gVElEU1BCUklER0UKKwloZWxwCisJICBXVEQzIGlzIG1hbmFnZWQgYnkgRFNQIGFuZCBvbmNlIGl0IGlzIGVuYWJsZWQsIERTUCBzaWRlIGJyaWRnZSBpcyBpbgorCSAgY2hhcmdlIG9mIHJlZnJlc2hpbmcgdGhlIHRpbWVyIGJlZm9yZSBvdmVyZmxvdywgaWYgdGhlIERTUCBoYW5ncyBNUFUKKwkgIHdpbGwgY2F1Z2h0IHRoZSBpbnRlcnJ1cHQgYW5kIHRyeSB0byByZWNvdmVyIERTUC4KKworY29uZmlnIFRJRFNQQlJJREdFX1dEVF9USU1FT1VUCisJaW50ICJXYXRjaGRvZyB0aW1lciB0aW1lb3V0IChpbiBzZWNzKSIKKwlkZXBlbmRzIG9uIFRJRFNQQlJJREdFICYmIFRJRFNQQlJJREdFX1dEVDMKKwlkZWZhdWx0IDUKKwloZWxwCisJICAgV2F0Y2hkb2cgdGltZXIgdGltZW91dCB2YWx1ZSwgYWZ0ZXIgdGhhdCB0aW1lIGlmIHRoZSB3YXRjaGRvZyB0aW1lcgorCSAgIGNvdW50ZXIgaXMgbm90IHJlc2V0IHRoZSB3ZHQgb3ZlcmZsb3cgaW50ZXJydXB0IHdpbGwgYmUgdHJpZ2dlcmVkCisKK2NvbmZpZyBUSURTUEJSSURHRV9OVEZZX1BXUkVSUgorCWJvb2wgIk5vdGlmeSBwb3dlciBlcnJvcnMiCisJZGVwZW5kcyBvbiBUSURTUEJSSURHRQorCWhlbHAKKwkgIEVuYWJsZSBub3RpZmljYXRpb25zIHRvIHJlZ2lzdGVyZWQgY2xpZW50cyBvbiB0aGUgZXZlbnQgb2YgcG93ZXIgZXJycm9yCisJICB0cnlpbmcgdG8gc3VzcGVuZCBicmlkZ2UgZHJpdmVyLiBTYXkgWSwgdG8gc2lnbmFsIHRoaXMgZXZlbnQgYXMgYSBmYXRhbAorCSAgZXJyb3IsIHRoaXMgd2lsbCByZXF1aXJlIGEgYnJpZGdlIHJlc3RhcnQgdG8gcmVjb3Zlci4KKworY29uZmlnIFRJRFNQQlJJREdFX0JBQ0tUUkFDRQorCWJvb2wgIkR1bXAgYmFja3RyYWNlcyBvbiBmYXRhbCBlcnJvcnMiCisJZGVwZW5kcyBvbiBUSURTUEJSSURHRQorCWhlbHAKKwkgIEVuYWJsZSB1c2VmdWwgaW5mb3JtYXRpb24gdG8gYmFja3RyYWNlIGZhdGFsIGVycm9ycy4gU2F5IFkgaWYgeW91CisJICB3YW50IHRvIGR1bXAgaW5mb3JtYXRpb24gZm9yIHRlc3RpbmcgcHVycG9zZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2NzE3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9NYWtlZmlsZQpAQCAtMCwwICsxLDM0IEBACitvYmotJChDT05GSUdfVElEU1BCUklER0UpCSs9IGJyaWRnZWRyaXZlci5vCisKK2xpYmdlbiA9IGdlbi9nYi5vIGdlbi9ncy5vIGdlbi9naC5vIGdlbi91dWlkdXRpbC5vCitsaWJzZXJ2aWNlcyA9IHNlcnZpY2VzL3N5bmMubyBzZXJ2aWNlcy9jZmcubyBcCisJCXNlcnZpY2VzL250ZnkubyBzZXJ2aWNlcy9zZXJ2aWNlcy5vCitsaWJjb3JlID0gY29yZS9jaG5sX3NtLm8gY29yZS9tc2dfc20ubyBjb3JlL2lvX3NtLm8gY29yZS90aW9tYXAzNDMwLm8gXAorCQljb3JlL3Rpb21hcDM0MzBfcHdyLm8gY29yZS90aW9tYXBfaW8ubyBcCisJCWNvcmUvdWVfZGVoLm8gY29yZS93ZHQubyBjb3JlL2RzcC1jbG9jay5vCitsaWJwbWdyID0gcG1nci9jaG5sLm8gcG1nci9pby5vIHBtZ3IvbXNnLm8gcG1nci9jb2QubyBwbWdyL2Rldi5vIHBtZ3IvZHNwYXBpLm8gXAorCQlwbWdyL2RtbS5vIHBtZ3IvY21tLm8gcG1nci9kYmxsLm8KK2xpYnJtZ3IgPSBybWdyL2RiZGNkLm8gcm1nci9kaXNwLm8gcm1nci9kcnYubyBybWdyL21nci5vIHJtZ3Ivbm9kZS5vIFwKKwkJcm1nci9wcm9jLm8gcm1nci9wd3IubyBybWdyL3JtbS5vIHJtZ3Ivc3RybS5vIHJtZ3IvZHNwZHJ2Lm8gXAorCQlybWdyL25sZHIubyBybWdyL2Rydl9pbnRlcmZhY2UubworbGliZGxvYWQgPSBkeW5sb2FkL2Nsb2FkLm8gZHlubG9hZC9nZXRzZWN0aW9uLm8gZHlubG9hZC9yZWxvYy5vIFwKKwkJIGR5bmxvYWQvdHJhbXAubworbGliaHcgPSBody9od19tbXUubworCiticmlkZ2Vkcml2ZXItb2JqcyA9ICQobGliZ2VuKSAkKGxpYnNlcnZpY2VzKSAkKGxpYmNvcmUpICQobGlicG1ncikgJChsaWJybWdyKSBcCisJCQkkKGxpYmRsb2FkKSAkKGxpYmh3KQorCisjTWFjaGluZSBkZXBlbmRlbnQKK2NjZmxhZ3MteSArPSAtRF9USV8gLURfREJfVElPTUFQIC1EVE1TMzIwNjAgXAorCQktRFRJQ0ZHX1BST0NfVkVSIC1EVElDRkdfRVZNX1RZUEUgLURDSE5MX1NNQ0xBU1MgXAorCQktRENITkxfTUVTU0FHRVMgLURVU0VfTEVWRUxfMV9NQUNST1MKKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9zZXJ2aWNlcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1ncgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9odworY2NmbGFncy15ICs9IC1JYXJjaC9hcm0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGY0YTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL1RPRE8KQEAgLTAsMCArMSwxOCBAQAorKiBNaWdyYXRlIHRvIChhbmQgaWYgbmVjZXNzYXJ5LCBleHRlbmQpIGV4aXN0aW5nIHVwc3RyZWFtIGNvZGUgc3VjaCBhcyAKKyAgaW9tbXUsIHdkdCwgbWNic3AsIGdwdGltZXJzCisqIERlY291cGxlIGhhcmR3YXJlLXNwZWNpZmljIGNvZGUgKGUuZy4gYnJpZGdlX2JyZF9zdGFydC9zdG9wL2RlbGV0ZS9tb25pdG9yKQorKiBET0ZGIGJpbmFyeSBsb2FkZXI6IGNvbnNpZGVyIHB1c2hpbmcgdG8gdXNlciBzcGFjZS4gYXQgdGhlIHZlcnkgbGVhc3QKKyAgZWxpbWluYXRlIHRoZSBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MKKyogRWxpbWluYXRlIGdlbmVyYWwgc2VydmljZXMgYW5kIGxpYnJhcmllcyAtIHVzZSBvciBleHRlbmQgZXhpc3Rpbmcga2VybmVsCisgIGxpYnJhcmllcyBpbnN0ZWFkIChlLmcuIGdjZi9sY20gaW4gbmxkci5jLCBnbG9iYWwgaGVscGVycyBpbiBnZW4vKQorKiBFbGltaW5hdGUgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiBPTUFQX1NZU0NfQkFTRQorKiBFbGltaW5hdGUgbGlzdC5oIDogc2VlbSBsaWtlIGEgcmVkdW5kYW50IHdyYXBwZXIgdG8gZXhpc3Rpbmcga2VybmVsIGxpc3RzCisqIEVsaW1pbmF0ZSBEU1BfU1VDQ0VFREVEIG1hY3JvcyBhbmQgdGhlaXIgaW1wb3NlZCByZWR1bmRhbnQgaW5kZW50YXRpb25zCisgIChhZG9wdCB0aGUga2VybmVsIHdheSBvZiBjaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlcykKKyogQXVkaXQgaW50ZXJmYWNlcyBleHBvc2VkIHRvIHVzZXIgc3BhY2UKKyogQXVkaXQgYW5kIGNsZWFuIHVwIGhlYWRlciBmaWxlcyBmb2xkZXIKKyogVXNlIGtlcm5lbCBjb2Rpbmcgc3R5bGUKKyogY2hlY2twYXRjaC5wbCBmaXhlcworCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorYW5kIE9tYXIgUmFtaXJleiBMdW5hIDxvbWFyLnJhbWlyZXpAdGkuY29tPi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL19jbW0uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL19jbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYwYmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvX2NtbS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBfY21tLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogUHJpdmF0ZSBoZWFkZXIgZmlsZSBkZWZpbmluZyBDTU0gbWFuYWdlciBvYmplY3RzIGFuZCBkZWZpbmVzIG5lZWRlZAorICogYnkgSU8gbWFuYWdlciB0byByZWdpc3RlciBzaGFyZWQgbWVtb3J5IHJlZ2lvbnMgd2hlbiBEU1AgYmFzZSBpbWFnZQorICogaXMgbG9hZGVkKGJyaWRnZV9pb19vbl9sb2FkZWQpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX0NNTV8KKyNkZWZpbmUgX0NNTV8KKworLyoKKyAqICBUaGVzZSB0YXJnZXQgc2lkZSBzeW1ib2xzIGRlZmluZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgYWRkcmVzc2VzCisgKiAgb2YgdGhlIHNlY3Rpb24gb2Ygc2hhcmVkIG1lbW9yeSB1c2VkIGZvciBzaGFyZWQgbWVtb3J5IG1hbmFnZXIgQ01NLgorICogIFRoZXkgYXJlIGRlZmluZWQgaW4gdGhlICpjZmcuY21kIGZpbGUgYnkgY2RiIGNvZGUuCisgKi8KKyNkZWZpbmUgU0hNMF9TSEFSRURfQkFTRV9TWU0gICAgICAgICAgICAgIl9TSE0wX0JFRyIKKyNkZWZpbmUgU0hNMF9TSEFSRURfRU5EX1NZTSAgICAgICAgICAgICAgIl9TSE0wX0VORCIKKyNkZWZpbmUgU0hNMF9TSEFSRURfUkVTRVJWRURfQkFTRV9TWU0gICAgIl9TSE0wX1JTVkRTVFJUIgorCisvKgorICogIFNoYXJlZCBNZW1vcnkgUmVnaW9uICMwKFNITVNFRzApIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgKgorICogIHwoX1NITTBfQkVHKSAgICAgICAgICAgICAgICAgIHwgKF9TSE0wX1JTVkRTVFJUKSAgICAgICAgICAgfCAoX1NITTBfRU5EKQorICogIFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHwgICAgIERTUC1zaWRlIGFsbG9jYXRpb25zICAgIHwgICAgR1BQLXNpZGUgYWxsb2NhdGlvbnMgICAgfAorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKi8KKworI2VuZGlmIC8qIF9DTU1fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9fZGVoLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9fZGVoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MjNjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL19kZWguaApAQCAtMCwwICsxLDM1IEBACisvKgorICogX2RlaC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFByaXZhdGUgaGVhZGVyIGZvciBERUggbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRmVsaXBlIENvbnRyZXJhcworICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9ERUhfCisjZGVmaW5lIF9ERUhfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvbnRmeS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkZWZzLmg+CisKKy8qIERFSCBNYW5hZ2VyOiBvbmx5IG9uZSBjcmVhdGVkIHBlciBib2FyZDogKi8KK3N0cnVjdCBkZWhfbWdyIHsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpoYnJpZGdlX2NvbnRleHQ7CS8qIEJyaWRnZSBjb250ZXh0LiAqLworCXN0cnVjdCBudGZ5X29iamVjdCAqbnRmeV9vYmo7CS8qIE5URlkgb2JqZWN0ICovCisKKwkvKiBNTVUgRmF1bHQgRFBDICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGRwY190YXNrbGV0OworfTsKKworI2VuZGlmIC8qIF9ERUhfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9fbXNnX3NtLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9fbXNnX3NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2ZGU1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL19tc2dfc20uaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIF9tc2dfc20uaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBQcml2YXRlIGhlYWRlciBmaWxlIGRlZmluaW5nIG1zZ19jdHJsIG1hbmFnZXIgb2JqZWN0cyBhbmQgZGVmaW5lcyBuZWVkZWQKKyAqIGJ5IElPIG1hbmFnZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfTVNHX1NNXworI2RlZmluZSBfTVNHX1NNXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2xpc3QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbXNnZGVmcy5oPgorCisvKgorICogIFRoZXNlIHRhcmdldCBzaWRlIHN5bWJvbHMgZGVmaW5lIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBhZGRyZXNzZXMKKyAqICBvZiB0aGUgc2VjdGlvbiBvZiBzaGFyZWQgbWVtb3J5IHVzZWQgZm9yIG1lc3NhZ2VzLiBUaGV5IGFyZQorICogIGRlZmluZWQgaW4gdGhlICpjZmcuY21kIGZpbGUgYnkgY2RiIGNvZGUuCisgKi8KKyNkZWZpbmUgTVNHX1NIQVJFRF9CVUZGRVJfQkFTRV9TWU0gICAgICAiX01TR19CRUciCisjZGVmaW5lIE1TR19TSEFSRURfQlVGRkVSX0xJTUlUX1NZTSAgICAgIl9NU0dfRU5EIgorCisjaWZuZGVmIF9DSE5MX1dPUkRTSVpFCisjZGVmaW5lIF9DSE5MX1dPUkRTSVpFIDQJLyogZGVmYXVsdCBfQ0hOTF9XT1JEU0laRSBpcyAyIGJ5dGVzL3dvcmQgKi8KKyNlbmRpZgorCisvKgorICogID09PT09PT09IG1zZ19jdHJsID09PT09PT09CisgKiAgVGhlcmUgaXMgYSBjb250cm9sIHN0cnVjdHVyZSBmb3IgbWVzc2FnZXMgdG8gdGhlIERTUCwgYW5kIGEgY29udHJvbAorICogIHN0cnVjdHVyZSBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgRFNQLiBUaGUgc2hhcmVkIG1lbW9yeSByZWdpb24gZm9yCisgKiAgdHJhbnNmZXJyaW5nIG1lc3NhZ2VzIGlzIHBhcnRpdGlvbmVkIGFzIGZvbGxvd3M6CisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB8Q29udHJvbCB8IE1lc3NhZ2VzIGZyb20gRFNQIHwgQ29udHJvbCB8IE1lc3NhZ2VzIHRvIERTUCB8CisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBtc2dfY3RybCBjb250cm9sIHN0cnVjdHVyZSBmb3IgbWVzc2FnZXMgdG8gdGhlIERTUCBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcKKyAqICB3YXk6CisgKgorICogIGJ1Zl9lbXB0eSAtICAgICAgVGhpcyBmbGFnIGlzIHNldCB0byBGQUxTRSBieSB0aGUgR1BQIGFmdGVyIGl0IGhhcyBvdXRwdXQKKyAqICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgZm9yIHRoZSBEU1AuIFRoZSBEU1AgaG9zdCBkcml2ZXIgc2V0cyBpdCB0bworICogICAgICAgICAgICAgICAgICBUUlVFIGFmdGVyIGl0IGhhcyBjb3BpZWQgdGhlIG1lc3NhZ2VzLgorICogIHBvc3Rfc3dpIC0gICAgICAgU2V0IHRvIDEgYnkgdGhlIEdQUCBhZnRlciBpdCBoYXMgd3JpdHRlbiB0aGUgbWVzc2FnZXMsCisgKiAgICAgICAgICAgICAgICAgIHNldCB0aGUgc2l6ZSwgYW5kIHNldCBidWZfZW1wdHkgdG8gRkFMU0UuCisgKiAgICAgICAgICAgICAgICAgIFRoZSBEU1AgSG9zdCBkcml2ZXIgdXNlcyBTV0lfYW5kbiBvZiB0aGUgcG9zdF9zd2kgZmllbGQKKyAqICAgICAgICAgICAgICAgICAgd2hlbiBhIGhvc3QgaW50ZXJydXB0IG9jY3Vycy4gVGhlIGhvc3QgZHJpdmVyIGNsZWFycworICogICAgICAgICAgICAgICAgICB0aGlzIGFmdGVyIHBvc3RpbmcgdGhlIFNXSS4KKyAqICBzaXplIC0gICAgICAgICAgTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGJlIHJlYWQgYnkgdGhlIERTUC4KKyAqCisgKiAgRm9yIG1lc3NhZ2VzIGZyb20gdGhlIERTUDoKKyAqICBidWZfZW1wdHkgLSAgICAgIFRoaXMgZmxhZyBpcyBzZXQgdG8gRkFMU0UgYnkgdGhlIERTUCBhZnRlciBpdCBoYXMgb3V0cHV0CisgKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzIGZvciB0aGUgR1BQLiBUaGUgRFBDIG9uIHRoZSBHUFAgc2V0cyBpdCB0bworICogICAgICAgICAgICAgICAgICBUUlVFIGFmdGVyIGl0IGhhcyBjb3BpZWQgdGhlIG1lc3NhZ2VzLgorICogIHBvc3Rfc3dpIC0gICAgICAgU2V0IHRvIDEgdGhlIERQQyBvbiB0aGUgR1BQIGFmdGVyIGNvcHlpbmcgdGhlIG1lc3NhZ2VzLgorICogIHNpemUgLSAgICAgICAgICBOdW1iZXIgb2YgbWVzc2FnZXMgdG8gYmUgcmVhZCBieSB0aGUgR1BQLgorICovCitzdHJ1Y3QgbXNnX2N0cmwgeworCXUzMiBidWZfZW1wdHk7CQkvKiB0by9mcm9tIERTUCBidWZmZXIgaXMgZW1wdHkgKi8KKwl1MzIgcG9zdF9zd2k7CQkvKiBTZXQgdG8gIjEiIHRvIHBvc3QgbXNnX2N0cmwgU1dJICovCisJdTMyIHNpemU7CQkvKiBOdW1iZXIgb2YgbWVzc2FnZXMgdG8vZnJvbSB0aGUgRFNQICovCisJdTMyIHJlc3ZkOworfTsKKworLyoKKyAqICA9PT09PT09PSBtc2dfbWdyID09PT09PT09CisgKiAgVGhlIG1zZ19tZ3IgbWFpbnRhaW5zIGEgbGlzdCBvZiBhbGwgTVNHX1FVRVVFcy4gRWFjaCBOT0RFIG9iamVjdCBjYW4KKyAqICBoYXZlIG1zZ19xdWV1ZSB0byBob2xkIGFsbCBtZXNzYWdlcyB0aGF0IGNvbWUgdXAgZnJvbSB0aGUgY29ycmVzcG9uZGluZworICogIG5vZGUgb24gdGhlIERTUC4gVGhlIG1zZ19tZ3IgYWxzbyBoYXMgYSBzaGFyZWQgcXVldWUgb2YgbWVzc2FnZXMKKyAqICByZWFkeSB0byBnbyB0byB0aGUgRFNQLgorICovCitzdHJ1Y3QgbXNnX21nciB7CisJLyogVGhlIGZpcnN0IGZpZWxkIG11c3QgbWF0Y2ggdGhhdCBpbiBtc2dvYmouaCAqLworCisJLyogRnVuY3Rpb24gaW50ZXJmYWNlIHRvIEJyaWRnZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKworCXN0cnVjdCBpb19tZ3IgKmhpb19tZ3I7CS8qIElPIG1hbmFnZXIgKi8KKwlzdHJ1Y3QgbHN0X2xpc3QgKnF1ZXVlX2xpc3Q7CS8qIExpc3Qgb2YgTVNHX1FVRVVFcyAqLworCXNwaW5sb2NrX3QgbXNnX21ncl9sb2NrOwkvKiBGb3IgY3JpdGljYWwgc2VjdGlvbnMgKi8KKwkvKiBTaWduYWxsZWQgd2hlbiBNc2dGcmFtZSBpcyBhdmFpbGFibGUgKi8KKwlzdHJ1Y3Qgc3luY19vYmplY3QgKnN5bmNfZXZlbnQ7CisJc3RydWN0IGxzdF9saXN0ICptc2dfZnJlZV9saXN0OwkvKiBGcmVlIE1zZ0ZyYW1lcyByZWFkeSB0byBiZSBmaWxsZWQgKi8KKwlzdHJ1Y3QgbHN0X2xpc3QgKm1zZ191c2VkX2xpc3Q7CS8qIE1zZ0ZyYW1lcyByZWFkeSB0byBnbyB0byBEU1AgKi8KKwl1MzIgbXNnc19wZW5kaW5nOwkvKiAjIG9mIHF1ZXVlZCBtZXNzYWdlcyB0byBnbyB0byBEU1AgKi8KKwl1MzIgbWF4X21zZ3M7CQkvKiBNYXggIyBvZiBtc2dzIHRoYXQgZml0IGluIGJ1ZmZlciAqLworCW1zZ19vbmV4aXQgb25fZXhpdDsJLyogY2FsbGVkIHdoZW4gUk1TX0VYSVQgaXMgcmVjZWl2ZWQgKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gbXNnX3F1ZXVlID09PT09PT09CisgKiAgRWFjaCBOT0RFIGhhcyBhIG1zZ19xdWV1ZSBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzIGZyb20gdGhlCisgKiAgY29ycmVzcG9uZGluZyBub2RlIG9uIHRoZSBEU1AuIFRoZSBtc2dfcXVldWUgb2JqZWN0IG1haW50YWlucyBhIGxpc3QKKyAqICBvZiBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBzZW50IHRvIHRoZSBob3N0LCBidXQgbm90IHlldCByZWFkIChNU0dfR2V0KSwKKyAqICBhbmQgYSBsaXN0IG9mIGZyZWUgZnJhbWVzIHRoYXQgY2FuIGJlIGZpbGxlZCB3aGVuIG5ldyBtZXNzYWdlcyBhcnJpdmUKKyAqICBmcm9tIHRoZSBEU1AuCisgKiAgVGhlIG1zZ19xdWV1ZSdzIGhTeW5FdmVudCBnZXRzIHBvc3RlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWFkeS4KKyAqLworc3RydWN0IG1zZ19xdWV1ZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VsZW07CisJc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyOworCXUzMiBtYXhfbXNnczsJCS8qIE5vZGUgbWVzc2FnZSBkZXB0aCAqLworCXUzMiBtc2dxX2lkOwkJLyogTm9kZSBlbnZpcm9ubWVudCBwb2ludGVyICovCisJc3RydWN0IGxzdF9saXN0ICptc2dfZnJlZV9saXN0OwkvKiBGcmVlIE1zZ0ZyYW1lcyByZWFkeSB0byBiZSBmaWxsZWQgKi8KKwkvKiBGaWxsZWQgTXNnRnJhbWVzcyB3YWl0aW5nIHRvIGJlIHJlYWQgKi8KKwlzdHJ1Y3QgbHN0X2xpc3QgKm1zZ191c2VkX2xpc3Q7CisJdm9pZCAqYXJnOwkJLyogSGFuZGxlIHBhc3NlZCB0byBtZ3Igb25fZXhpdCBjYWxsYmFjayAqLworCXN0cnVjdCBzeW5jX29iamVjdCAqc3luY19ldmVudDsJLyogU2lnbmFsbGVkIHdoZW4gbWVzc2FnZSBpcyByZWFkeSAqLworCXN0cnVjdCBzeW5jX29iamVjdCAqc3luY19kb25lOwkvKiBGb3Igc3luY2hyb25pemluZyBjbGVhbnVwICovCisJc3RydWN0IHN5bmNfb2JqZWN0ICpzeW5jX2RvbmVfYWNrOwkvKiBGb3Igc3luY2hyb25pemluZyBjbGVhbnVwICovCisJc3RydWN0IG50Znlfb2JqZWN0ICpudGZ5X29iajsJLyogRm9yIG5vdGlmaWNhdGlvbiBvZiBtZXNzYWdlIHJlYWR5ICovCisJYm9vbCBkb25lOwkJLyogVFJVRSA8PT0+IGRlbGV0aW5nIHRoZSBvYmplY3QgKi8KKwl1MzIgaW9fbXNnX3BlbmQ7CS8qIE51bWJlciBvZiBwZW5kaW5nIE1TR19nZXQvcHV0IGNhbGxzICovCit9OworCisvKgorICogID09PT09PT09IG1zZ19kc3Btc2cgPT09PT09PT0KKyAqLworc3RydWN0IG1zZ19kc3Btc2cgeworCXN0cnVjdCBkc3BfbXNnIG1zZzsKKwl1MzIgbXNncV9pZDsJCS8qIElkZW50aWZpZXMgdGhlIG5vZGUgdGhlIG1lc3NhZ2UgZ29lcyB0byAqLworfTsKKworLyoKKyAqICA9PT09PT09PSBtc2dfZnJhbWUgPT09PT09PT0KKyAqLworc3RydWN0IG1zZ19mcmFtZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VsZW07CisJc3RydWN0IG1zZ19kc3Btc2cgbXNnX2RhdGE7Cit9OworCisjZW5kaWYgLyogX01TR19TTV8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL190aW9tYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL190aW9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzFmMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvX3Rpb21hcC5oCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogX3Rpb21hcC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERlZmluaXRpb25zIGFuZCB0eXBlcyBwcml2YXRlIHRvIHRoaXMgQnJpZGdlIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9USU9NQVBfCisjZGVmaW5lIF9USU9NQVBfCisKKyNpbmNsdWRlIDxwbGF0L3Bvd2VyZG9tYWluLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9ja2RvbWFpbi5oPgorI2luY2x1ZGUgPG1hY2gtb21hcDIvcHJtLXJlZ2JpdHMtMzR4eC5oPgorI2luY2x1ZGUgPG1hY2gtb21hcDIvY20tcmVnYml0cy0zNHh4Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RldmRlZnMuaD4KKyNpbmNsdWRlIDxod19kZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGlvY3RsLmg+CS8qIGZvciBicmlkZ2VfaW9jdGxfZXh0cHJvYyBkZWZuICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3N5bmMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2xrLmg+CisKK3N0cnVjdCBtYXBfbDRfcGVyaXBoZXJhbCB7CisJdTMyIHBoeXNfYWRkcjsKKwl1MzIgZHNwX3ZpcnRfYWRkcjsKK307CisKKyNkZWZpbmUgQVJNX01BSUxCT1hfU1RBUlQgICAgICAgICAgICAgICAweGZmZmNmMDAwCisjZGVmaW5lIEFSTV9NQUlMQk9YX0xFTkdUSCAgICAgICAgICAgICAgMHg4MDAKKworLyogTmV3IFJlZ2lzdGVycyBpbiBPTUFQMy4xICovCisKKyNkZWZpbmUgVEVTVEJMT0NLX0lEX1NUQVJUICAgICAgICAgICAgICAweGZmZmVkNDAwCisjZGVmaW5lIFRFU1RCTE9DS19JRF9MRU5HVEggICAgICAgICAgICAgMHhmZgorCisvKiBJRCBSZXR1cm5lZCBieSBPTUFQMTUxMCAqLworI2RlZmluZSBUQkNfSURfVkFMVUUgICAgICAgICAgICAgICAgICAgIDB4QjQ3MDAyRgorCisjZGVmaW5lIFNQQUNFX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEFQSV9DTEtNX0RQTExfRE1BICAgICAgICAgICAgICAgMHhmZmZlYzAwMAorI2RlZmluZSBBUk1fSU5URVJSVVBUX09GRlNFVCAgICAgICAgICAgIDB4YjAwCisKKyNkZWZpbmUgQklPUzI0WFgKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX05VTEwgICAgICAgICAgMHgwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfTlVMTCAgICAgICAweDAKKworI2RlZmluZSBNQVhfTE9DS19UTEJfRU5UUklFUyAxNQorCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfUFJNICAgICAgICAweDQ4MzA2MDAwCS8qUFJNIEw0IFBlcmlwaGVyYWwgKi8KKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9QUk0gICAgIDB4MTE4MWUwMDAKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9TQ00gICAgICAgIDB4NDgwMDIwMDAJLypTQ00gTDQgUGVyaXBoZXJhbCAqLworI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX1NDTSAgICAgMHgxMTgxZjAwMAorI2RlZmluZSBMNF9QRVJJUEhFUkFMX01NVSAgICAgICAgMHg1RDAwMDAwMAkvKk1NVSBMNCBQZXJpcGhlcmFsICovCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfTU1VICAgICAweDExODIwMDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfQ00gICAgICAgIDB4NDgwMDQwMDAJLyogQ29yZSBMNCwgQ2xvY2sgTWFuYWdlbWVudCAqLworI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX0NNICAgICAweDExODFjMDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfUEVSICAgICAgICAweDQ4MDA1MDAwCS8qICBQRVIgKi8KKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9QRVIgICAgIDB4MTE4MWQwMDAKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX0dQSU8xICAgICAgIDB4NDgzMTAwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9HUElPMSAgICAweDExODA5MDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfR1BJTzIgICAgICAgMHg0OTA1MDAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX0dQSU8yICAgIDB4MTE4MGEwMDAKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9HUElPMyAgICAgICAweDQ5MDUyMDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfR1BJTzMgICAgMHgxMTgwYjAwMAorI2RlZmluZSBMNF9QRVJJUEhFUkFMX0dQSU80ICAgICAgIDB4NDkwNTQwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9HUElPNCAgICAweDExODBjMDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfR1BJTzUgICAgICAgMHg0OTA1NjAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX0dQSU81ICAgIDB4MTE4MGQwMDAKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX0lWQTJXRFQgICAgICAweDQ5MDMwMDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfSVZBMldEVCAgIDB4MTE4MGUwMDAKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX0RJU1BMQVkgICAgIDB4NDgwNTAwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9ESVNQTEFZICAweDExODBmMDAwCisKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9TU0kgICAgICAgICAweDQ4MDU4MDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfU1NJICAgICAgMHgxMTgwNDAwMAorI2RlZmluZSBMNF9QRVJJUEhFUkFMX0dERCAgICAgICAgIDB4NDgwNTkwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9HREQgICAgICAweDExODA1MDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfU1MxICAgICAgICAgMHg0ODA1YTAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX1NTMSAgICAgIDB4MTE4MDYwMDAKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9TUzIgICAgICAgICAweDQ4MDViMDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfU1MyICAgICAgMHgxMTgwNzAwMAorCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfQ0FNRVJBICAgICAgMHg0ODBCQzAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX0NBTUVSQSAgIDB4MTE4MTkwMDAKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX1NETUEgICAgICAgIDB4NDgwNTYwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9TRE1BICAgICAweDExODEwMDAwCS8qIDB4MTE4MWQwMDAgY29uZmxpY3Qgdy8gUEVSICovCisKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9VQVJUMSAgICAgICAgICAgICAweDQ4MDZhMDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfVUFSVDEgICAgICAgICAgMHgxMTgxMTAwMAorI2RlZmluZSBMNF9QRVJJUEhFUkFMX1VBUlQyICAgICAgICAgICAgIDB4NDgwNmMwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9VQVJUMiAgICAgICAgICAweDExODEyMDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfVUFSVDMgICAgICAgICAgICAgMHg0OTAyMDAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX1VBUlQzICAgIDB4MTE4MTMwMDAKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX01DQlNQMSAgICAgIDB4NDgwNzQwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9NQ0JTUDEgICAweDExODE0MDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfTUNCU1AyICAgICAgMHg0OTAyMjAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX01DQlNQMiAgIDB4MTE4MTUwMDAKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9NQ0JTUDMgICAgICAweDQ5MDI0MDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfTUNCU1AzICAgMHgxMTgxNjAwMAorI2RlZmluZSBMNF9QRVJJUEhFUkFMX01DQlNQNCAgICAgIDB4NDkwMjYwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9NQ0JTUDQgICAweDExODE3MDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfTUNCU1A1ICAgICAgMHg0ODA5NjAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX01DQlNQNSAgIDB4MTE4MTgwMDAKKworI2RlZmluZSBMNF9QRVJJUEhFUkFMX0dQVElNRVI1ICAgIDB4NDkwMzgwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9HUFRJTUVSNSAweDExODAwMDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfR1BUSU1FUjYgICAgMHg0OTAzYTAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX0dQVElNRVI2IDB4MTE4MDEwMDAKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9HUFRJTUVSNyAgICAweDQ5MDNjMDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfR1BUSU1FUjcgMHgxMTgwMjAwMAorI2RlZmluZSBMNF9QRVJJUEhFUkFMX0dQVElNRVI4ICAgIDB4NDkwM2UwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9HUFRJTUVSOCAweDExODAzMDAwCisKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9TUEkxICAgICAgMHg0ODA5ODAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX1NQSTEgICAweDExODFhMDAwCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfU1BJMiAgICAgIDB4NDgwOWEwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9TUEkyICAgMHgxMTgxYjAwMAorCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfTUJPWCAgICAgICAgMHg0ODA5NDAwMAorI2RlZmluZSBEU1BWQV9QRVJJUEhFUkFMX01CT1ggICAgIDB4MTE4MDgwMDAKKworI2RlZmluZSBQTV9HUlBTRUxfQkFTRSAJCQkweDQ4MzA3MDAwCisjZGVmaW5lIERTUFZBX0dSUFNFTF9CQVNFIAkJMHgxMTgyMTAwMAorCisjZGVmaW5lIEw0X1BFUklQSEVSQUxfU0lERVRPTkVfTUNCU1AyICAgICAgICAweDQ5MDI4MDAwCisjZGVmaW5lIERTUFZBX1BFUklQSEVSQUxfU0lERVRPTkVfTUNCU1AyIDB4MTE4MjQwMDAKKyNkZWZpbmUgTDRfUEVSSVBIRVJBTF9TSURFVE9ORV9NQ0JTUDMgICAgICAgIDB4NDkwMmEwMDAKKyNkZWZpbmUgRFNQVkFfUEVSSVBIRVJBTF9TSURFVE9ORV9NQ0JTUDMgMHgxMTgyNTAwMAorCisvKiBkZWZpbmUgYSBzdGF0aWMgYXJyYXkgd2l0aCBMNCBtYXBwaW5ncyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBfbDRfcGVyaXBoZXJhbCBsNF9wZXJpcGhlcmFsX3RhYmxlW10gPSB7CisJe0w0X1BFUklQSEVSQUxfTUJPWCwgRFNQVkFfUEVSSVBIRVJBTF9NQk9YfSwKKwl7TDRfUEVSSVBIRVJBTF9TQ00sIERTUFZBX1BFUklQSEVSQUxfU0NNfSwKKwl7TDRfUEVSSVBIRVJBTF9NTVUsIERTUFZBX1BFUklQSEVSQUxfTU1VfSwKKwl7TDRfUEVSSVBIRVJBTF9HUFRJTUVSNSwgRFNQVkFfUEVSSVBIRVJBTF9HUFRJTUVSNX0sCisJe0w0X1BFUklQSEVSQUxfR1BUSU1FUjYsIERTUFZBX1BFUklQSEVSQUxfR1BUSU1FUjZ9LAorCXtMNF9QRVJJUEhFUkFMX0dQVElNRVI3LCBEU1BWQV9QRVJJUEhFUkFMX0dQVElNRVI3fSwKKwl7TDRfUEVSSVBIRVJBTF9HUFRJTUVSOCwgRFNQVkFfUEVSSVBIRVJBTF9HUFRJTUVSOH0sCisJe0w0X1BFUklQSEVSQUxfR1BJTzEsIERTUFZBX1BFUklQSEVSQUxfR1BJTzF9LAorCXtMNF9QRVJJUEhFUkFMX0dQSU8yLCBEU1BWQV9QRVJJUEhFUkFMX0dQSU8yfSwKKwl7TDRfUEVSSVBIRVJBTF9HUElPMywgRFNQVkFfUEVSSVBIRVJBTF9HUElPM30sCisJe0w0X1BFUklQSEVSQUxfR1BJTzQsIERTUFZBX1BFUklQSEVSQUxfR1BJTzR9LAorCXtMNF9QRVJJUEhFUkFMX0dQSU81LCBEU1BWQV9QRVJJUEhFUkFMX0dQSU81fSwKKwl7TDRfUEVSSVBIRVJBTF9JVkEyV0RULCBEU1BWQV9QRVJJUEhFUkFMX0lWQTJXRFR9LAorCXtMNF9QRVJJUEhFUkFMX0RJU1BMQVksIERTUFZBX1BFUklQSEVSQUxfRElTUExBWX0sCisJe0w0X1BFUklQSEVSQUxfU1NJLCBEU1BWQV9QRVJJUEhFUkFMX1NTSX0sCisJe0w0X1BFUklQSEVSQUxfR0RELCBEU1BWQV9QRVJJUEhFUkFMX0dERH0sCisJe0w0X1BFUklQSEVSQUxfU1MxLCBEU1BWQV9QRVJJUEhFUkFMX1NTMX0sCisJe0w0X1BFUklQSEVSQUxfU1MyLCBEU1BWQV9QRVJJUEhFUkFMX1NTMn0sCisJe0w0X1BFUklQSEVSQUxfVUFSVDEsIERTUFZBX1BFUklQSEVSQUxfVUFSVDF9LAorCXtMNF9QRVJJUEhFUkFMX1VBUlQyLCBEU1BWQV9QRVJJUEhFUkFMX1VBUlQyfSwKKwl7TDRfUEVSSVBIRVJBTF9VQVJUMywgRFNQVkFfUEVSSVBIRVJBTF9VQVJUM30sCisJe0w0X1BFUklQSEVSQUxfTUNCU1AxLCBEU1BWQV9QRVJJUEhFUkFMX01DQlNQMX0sCisJe0w0X1BFUklQSEVSQUxfTUNCU1AyLCBEU1BWQV9QRVJJUEhFUkFMX01DQlNQMn0sCisJe0w0X1BFUklQSEVSQUxfTUNCU1AzLCBEU1BWQV9QRVJJUEhFUkFMX01DQlNQM30sCisJe0w0X1BFUklQSEVSQUxfTUNCU1A0LCBEU1BWQV9QRVJJUEhFUkFMX01DQlNQNH0sCisJe0w0X1BFUklQSEVSQUxfTUNCU1A1LCBEU1BWQV9QRVJJUEhFUkFMX01DQlNQNX0sCisJe0w0X1BFUklQSEVSQUxfQ0FNRVJBLCBEU1BWQV9QRVJJUEhFUkFMX0NBTUVSQX0sCisJe0w0X1BFUklQSEVSQUxfU1BJMSwgRFNQVkFfUEVSSVBIRVJBTF9TUEkxfSwKKwl7TDRfUEVSSVBIRVJBTF9TUEkyLCBEU1BWQV9QRVJJUEhFUkFMX1NQSTJ9LAorCXtMNF9QRVJJUEhFUkFMX1BSTSwgRFNQVkFfUEVSSVBIRVJBTF9QUk19LAorCXtMNF9QRVJJUEhFUkFMX0NNLCBEU1BWQV9QRVJJUEhFUkFMX0NNfSwKKwl7TDRfUEVSSVBIRVJBTF9QRVIsIERTUFZBX1BFUklQSEVSQUxfUEVSfSwKKwl7UE1fR1JQU0VMX0JBU0UsIERTUFZBX0dSUFNFTF9CQVNFfSwKKwl7TDRfUEVSSVBIRVJBTF9TSURFVE9ORV9NQ0JTUDIsIERTUFZBX1BFUklQSEVSQUxfU0lERVRPTkVfTUNCU1AyfSwKKwl7TDRfUEVSSVBIRVJBTF9TSURFVE9ORV9NQ0JTUDMsIERTUFZBX1BFUklQSEVSQUxfU0lERVRPTkVfTUNCU1AzfSwKKwl7TDRfUEVSSVBIRVJBTF9OVUxMLCBEU1BWQV9QRVJJUEhFUkFMX05VTEx9Cit9OworCisvKgorICogICAxNSAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgMAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB8MHwwfDF8MHwwfDB8Y3xjfGN8aXxpfGl8aXxpfGl8aXwKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB8ICAoY2xhc3MpICB8IChtb2R1bGUgc3BlY2lmaWMpIHwKKyAqCisgKiAgd2hlcmUgIGMgLT4gRXh0ZXJuZWwgQ2xvY2sgQ29tbWFuZDogQ2xrICYgQXV0b2lkbGUgRGlzYWJsZS9FbmFibGUKKyAqICBpIC0+IEV4dGVybmFsIENsb2NrIElEIFRpbWVycyA1LDYsNyw4LCBNY0JTUDEsMiBhbmQgV0RUMworICovCisKKy8qIE1CWF9QTV9DTEtfSURNQVNLOiBEU1AgRXh0ZXJuYWwgY2xvY2sgaWQgbWFzay4gKi8KKyNkZWZpbmUgTUJYX1BNX0NMS19JRE1BU0sgICAweDdGCisKKy8qIE1CWF9QTV9DTEtfQ01EU0hJRlQ6IERTUCBFeHRlcm5hbCBjbG9jayBjb21tYW5kIHNoaWZ0LiAqLworI2RlZmluZSBNQlhfUE1fQ0xLX0NNRFNISUZUIDcKKworLyogTUJYX1BNX0NMS19DTURNQVNLOiBEU1AgRXh0ZXJuYWwgY2xvY2sgY29tbWFuZCBtYXNrLiAqLworI2RlZmluZSBNQlhfUE1fQ0xLX0NNRE1BU0sgNworCisvKiBNQlhfUE1fTUFYX1JFU09VUkNFUzogQ09SRSAxIENsb2NrIHJlc291cmNlcy4gKi8KKyNkZWZpbmUgTUJYX0NPUkUxX1JFU09VUkNFUyA3CisKKy8qIE1CWF9QTV9NQVhfUkVTT1VSQ0VTOiBDT1JFIDIgQ2xvY2sgUmVzb3VyY2VzLiAqLworI2RlZmluZSBNQlhfQ09SRTJfUkVTT1VSQ0VTIDEKKworLyogTUJYX1BNX01BWF9SRVNPVVJDRVM6IFRPVEFMIENsb2NrIFJlb3N1cmNlcy4gKi8KKyNkZWZpbmUgTUJYX1BNX01BWF9SRVNPVVJDRVMgMTEKKworLyogIFBvd2VyIE1hbmFnZW1lbnQgQ29tbWFuZHMgKi8KKyNkZWZpbmUgQlBXUl9ESVNBQkxFX0NMT0NLCTAKKyNkZWZpbmUgQlBXUl9FTkFCTEVfQ0xPQ0sJMQorCisvKiBPTUFQMjQyeCBzcGVjaWZpYyByZXNvdXJjZXMgKi8KK2VudW0gYnB3cl9leHRfY2xvY2tfaWQgeworCUJQV1JfR1BfVElNRVI1ID0gMHgxMCwKKwlCUFdSX0dQX1RJTUVSNiwKKwlCUFdSX0dQX1RJTUVSNywKKwlCUFdSX0dQX1RJTUVSOCwKKwlCUFdSX1dEX1RJTUVSMywKKwlCUFdSX01DQlNQMSwKKwlCUFdSX01DQlNQMiwKKwlCUFdSX01DQlNQMywKKwlCUFdSX01DQlNQNCwKKwlCUFdSX01DQlNQNSwKKwlCUFdSX1NTSSA9IDB4MjAKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYnB3cl9jbGtpZFtdID0geworCSh1MzIpIEJQV1JfR1BfVElNRVI1LAorCSh1MzIpIEJQV1JfR1BfVElNRVI2LAorCSh1MzIpIEJQV1JfR1BfVElNRVI3LAorCSh1MzIpIEJQV1JfR1BfVElNRVI4LAorCSh1MzIpIEJQV1JfV0RfVElNRVIzLAorCSh1MzIpIEJQV1JfTUNCU1AxLAorCSh1MzIpIEJQV1JfTUNCU1AyLAorCSh1MzIpIEJQV1JfTUNCU1AzLAorCSh1MzIpIEJQV1JfTUNCU1A0LAorCSh1MzIpIEJQV1JfTUNCU1A1LAorCSh1MzIpIEJQV1JfU1NJCit9OworCitzdHJ1Y3QgYnB3cl9jbGtfdCB7CisJdTMyIGNsa19pZDsKKwllbnVtIGRzcF9jbGtfaWQgY2xrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBicHdyX2Nsa190IGJwd3JfY2xrc1tdID0geworCXsodTMyKSBCUFdSX0dQX1RJTUVSNSwgRFNQX0NMS19HUFQ1fSwKKwl7KHUzMikgQlBXUl9HUF9USU1FUjYsIERTUF9DTEtfR1BUNn0sCisJeyh1MzIpIEJQV1JfR1BfVElNRVI3LCBEU1BfQ0xLX0dQVDd9LAorCXsodTMyKSBCUFdSX0dQX1RJTUVSOCwgRFNQX0NMS19HUFQ4fSwKKwl7KHUzMikgQlBXUl9XRF9USU1FUjMsIERTUF9DTEtfV0RUM30sCisJeyh1MzIpIEJQV1JfTUNCU1AxLCBEU1BfQ0xLX01DQlNQMX0sCisJeyh1MzIpIEJQV1JfTUNCU1AyLCBEU1BfQ0xLX01DQlNQMn0sCisJeyh1MzIpIEJQV1JfTUNCU1AzLCBEU1BfQ0xLX01DQlNQM30sCisJeyh1MzIpIEJQV1JfTUNCU1A0LCBEU1BfQ0xLX01DQlNQNH0sCisJeyh1MzIpIEJQV1JfTUNCU1A1LCBEU1BfQ0xLX01DQlNQNX0sCisJeyh1MzIpIEJQV1JfU1NJLCBEU1BfQ0xLX1NTSX0KK307CisKKy8qIEludGVycnVwdCBSZWdpc3RlciBPZmZzZXRzICovCisjZGVmaW5lIElOVEhfSVRfUkVHX09GRlNFVCAgICAgICAgICAgICAgMHgwMAkvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgb2Zmc2V0ICovCisjZGVmaW5lIElOVEhfTUFTS19JVF9SRUdfT0ZGU0VUICAgICAgICAgMHgwNAkvKiBNYXNrIEludGVycnVwdCByZWcgb2Zmc2V0ICovCisKKyNkZWZpbmUgICBEU1BfTUFJTEJPWDFfSU5UICAgICAgICAgICAgICAxMAorLyoKKyAqICBCaXQgZGVmaW5pdGlvbiBvZiAgSW50ZXJydXB0ICBMZXZlbCAgUmVnaXN0ZXJzCisgKi8KKworLyogTWFpbCBCb3ggZGVmaW5lcyAqLworI2RlZmluZSBNQl9BUk0yRFNQMV9SRUdfT0ZGU0VUICAgICAgICAgIDB4MDAKKworI2RlZmluZSBNQl9BUk0yRFNQMUJfUkVHX09GRlNFVCAgICAgICAgIDB4MDQKKworI2RlZmluZSBNQl9EU1AyQVJNMUJfUkVHX09GRlNFVCAgICAgICAgIDB4MEMKKworI2RlZmluZSBNQl9BUk0yRFNQMV9GTEFHX1JFR19PRkZTRVQgICAgIDB4MTgKKworI2RlZmluZSBNQl9BUk0yRFNQX0ZMQUcgICAgICAgICAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIE1CT1hfQVJNMkRTUCBIV19NQk9YX0lEMAorI2RlZmluZSBNQk9YX0RTUDJBUk0gSFdfTUJPWF9JRDEKKyNkZWZpbmUgTUJPWF9BUk0gSFdfTUJPWF9VMF9BUk0KKyNkZWZpbmUgTUJPWF9EU1AgSFdfTUJPWF9VMV9EU1AxCisKKyNkZWZpbmUgRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCisjZGVmaW5lIERJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UKKworI2RlZmluZSBISUdIX0xFVkVMICAgICAgICAgICAgICAgICAgICAgIHRydWUKKyNkZWZpbmUgTE9XX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICBmYWxzZQorCisvKiBNYWNybydzICovCisjZGVmaW5lIENMRUFSX0JJVChyZWcsIG1hc2spICAgICAgICAgICAgIChyZWcgJj0gfm1hc2spCisjZGVmaW5lIFNFVF9CSVQocmVnLCBtYXNrKSAgICAgICAgICAgICAgIChyZWcgfD0gbWFzaykKKworI2RlZmluZSBTRVRfR1JPVVBfQklUUzE2KHJlZywgcG9zaXRpb24sIHdpZHRoLCB2YWx1ZSkgXAorCWRvIHtcCisJCXJlZyAmPSB+KCgweEZGRkYgPj4gKDE2IC0gKHdpZHRoKSkpIDw8IChwb3NpdGlvbikpIDsgXAorCQlyZWcgfD0gKCh2YWx1ZSAmICgweEZGRkYgPj4gKDE2IC0gKHdpZHRoKSkpKSA8PCAocG9zaXRpb24pKTsgXAorCX0gd2hpbGUgKDApOworCisjZGVmaW5lIENMRUFSX0JJVF9JTkRFWChyZWcsIGluZGV4KSAgIChyZWcgJj0gfigxIDw8IChpbmRleCkpKQorCisvKiBUaGlzIEJyaWRnZSBkcml2ZXIncyBkZXZpY2UgY29udGV4dDogKi8KK3N0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgeworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iajsJLyogSGFuZGxlIHRvIEJyaWRnZSBkZXZpY2Ugb2JqZWN0LiAqLworCXUzMiBkd19kc3BfYmFzZV9hZGRyOwkvKiBBcm0ncyBBUEkgdG8gRFNQIHZpcnQgYmFzZSBhZGRyICovCisJLyoKKwkgKiBEU1AgRXh0ZXJuYWwgbWVtb3J5IHByb2cgYWRkcmVzcyBhcyBzZWVuIHZpcnR1YWxseSBieSB0aGUgT1Mgb24KKwkgKiB0aGUgaG9zdCBzaWRlLgorCSAqLworCXUzMiBkd19kc3BfZXh0X2Jhc2VfYWRkcjsJLyogU2VlIHRoZSBjb21tZW50IGFib3ZlICovCisJdTMyIGR3X2FwaV9yZWdfYmFzZTsJLyogQVBJIG1lbSBtYXAnZCByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKmR3X2RzcF9tbXVfYmFzZTsJLyogRFNQIE1NVSBNYXBwZWQgcmVnaXN0ZXJzICovCisJdTMyIGR3X2FwaV9jbGtfYmFzZTsJLyogQ0xLIFJlZ2lzdGVycyAqLworCXUzMiBkd19kc3BfY2xrX20yX2Jhc2U7CS8qIERTUCBDbG9jayBNb2R1bGUgbTIgKi8KKwl1MzIgZHdfcHVibGljX3JoZWE7CS8qIFB1YiBSaGVhICovCisJdTMyIGR3X2ludF9hZGRyOwkvKiBNQiBJTlRSIHJlZyAqLworCXUzMiBkd190Y19lbmRpYW5pc207CS8qIFRDIEVuZGlhbmlzbSByZWdpc3RlciAqLworCXUzMiBkd190ZXN0X2Jhc2U7CS8qIERTUCBNTVUgTWFwcGVkIHJlZ2lzdGVycyAqLworCXUzMiBkd19zZWxmX2xvb3A7CS8qIFBvaW50ZXIgdG8gdGhlIHNlbGZsb29wICovCisJdTMyIGR3X2RzcF9zdGFydF9hZGQ7CS8qIEFQSSBCb290IHZlY3RvciAqLworCXUzMiBkd19pbnRlcm5hbF9zaXplOwkvKiBJbnRlcm5hbCBtZW1vcnkgc2l6ZSAqLworCisJc3RydWN0IG9tYXBfbWJveCAqbWJveDsJCS8qIE1haWwgYm94IGhhbmRsZSAqLworCisJc3RydWN0IGNmZ19ob3N0cmVzICpyZXNvdXJjZXM7CS8qIEhvc3QgUmVzb3VyY2VzICovCisKKwkvKgorCSAqIFByb2Nlc3NvciBzcGVjaWZpYyBpbmZvIGlzIHNldCB3aGVuIHByb2cgbG9hZGVkIGFuZCByZWFkIGZyb20gRENELgorCSAqIFtTZWUgYnJpZGdlX2Rldl9jdHJsKCldICBQUk9DIGluZm8gY29udGFpbnMgRFNQLU1NVSBUTEIgZW50cmllcy4KKwkgKi8KKwkvKiBETU1VIFRMQiBlbnRyaWVzICovCisJc3RydWN0IGJyaWRnZV9pb2N0bF9leHRwcm9jIGF0bGJfZW50cnlbQlJESU9DVExfTlVNT0ZNTVVUTEJdOworCXUzMiBkd19icmRfc3RhdGU7ICAgICAgIC8qIExhc3Qga25vd24gYm9hcmQgc3RhdGUuICovCisKKwkvKiBUQyBTZXR0aW5ncyAqLworCWJvb2wgdGNfd29yZF9zd2FwX29uOwkvKiBUcmFmZmljIENvbnRyb2xsZXIgV29yZCBTd2FwICovCisJc3RydWN0IHBnX3RhYmxlX2F0dHJzICpwdF9hdHRyczsKKwl1MzIgZHNwX3Blcl9jbGtzOworfTsKKworLyoKKyAqIElmIGRzcF9kZWJ1ZyBpcyB0cnVlLCBkbyBub3QgYnJhbmNoIHRvIHRoZSBEU1AgZW50cnkKKyAqIHBvaW50IGFuZCB3YWl0IGZvciBEU1AgdG8gYm9vdC4KKyAqLworZXh0ZXJuIHMzMiBkc3BfZGVidWc7CisKKy8qCisgKiAgPT09PT09PT0gc21faW50ZXJydXB0X2RzcCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNldCBpbnRlcnJ1cHQgdmFsdWUgJiBzZW5kIGFuIGludGVycnVwdCB0byB0aGUgRFNQIHByb2Nlc3NvcihzKS4KKyAqICAgICAgVGhpcyBpcyB0eXBpY2FseSB1c2VkIHdoZW4gbWFpbGJveCBpbnRlcnJ1cHQgbWVjaGFuaXNtcyBhbGxvdyBkYXRhCisgKiAgICAgIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBpbnRlcnJ1cHQgc3VjaCBhcyBmb3IgT01BUCdzIENNRC9EQVRBIHJlZ3MuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2X2NvbnRleHQ6ICAgIEhhbmRsZSB0byBCcmlkZ2UgZHJpdmVyIGRlZmluZWQgZGV2aWNlIGluZm8uCisgKiAgICAgIG1iX3ZhbDogICAgICAgICBWYWx1ZSBhc3NvY2lhdGVkIHdpdGggaW50ZXJydXB0KGUuZy4gbWFpbGJveCB2YWx1ZSkuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIEludGVycnVwdCBzZW50OworICogICAgICBlbHNlOiAgICAgICAgICAgVW5hYmxlIHRvIHNlbmQgaW50ZXJydXB0LgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK2ludCBzbV9pbnRlcnJ1cHRfZHNwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LCB1MTYgbWJfdmFsKTsKKworI2VuZGlmIC8qIF9USU9NQVBfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9fdGlvbWFwX3B3ci5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvX3Rpb21hcF9wd3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDAzNTRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvX3Rpb21hcF9wd3IuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogX3Rpb21hcF9wd3IuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEZWZpbml0aW9ucyBhbmQgdHlwZXMgZm9yIHRoZSBEU1Agd2FrZS9zbGVlcCByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9USU9NQVBfUFdSXworI2RlZmluZSBfVElPTUFQX1BXUl8KKworI2lmZGVmIENPTkZJR19QTQorZXh0ZXJuIHMzMiBkc3BfdGVzdF9zbGVlcHN0YXRlOworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgbWFpbGJveF9jb250ZXh0IG1ib3hzZXR0aW5nOworCisvKgorICogPT09PT09PT0gd2FrZV9kc3AgPT09PT09PT09CisgKiBXYWtlcyB1cCB0aGUgRFNQIGZyb20gRGVlcFNsZWVwCisgKi8KK2V4dGVybiBpbnQgd2FrZV9kc3Aoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJCQkJdm9pZCAqcGFyZ3MpOworCisvKgorICogPT09PT09PT0gc2xlZXBfZHNwID09PT09PT09PQorICogUGxhY2VzIHRoZSBEU1AgaW4gRGVlcFNsZWVwLgorICovCitleHRlcm4gaW50IHNsZWVwX2RzcChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCSAgICB1MzIgZHdfY21kLCB2b2lkICpwYXJncyk7CisvKgorICogID09PT09PT09aW50ZXJydXB0X2RzcD09PT09PT09CisgKiAgCSAgU2VuZHMgYW4gaW50ZXJydXB0IHRvIERTUCB1bmNvbmRpdGlvbmFsbHkuCisgKi8KK2V4dGVybiB2b2lkIGludGVycnVwdF9kc3Aoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJCQkJdTE2IG1iX3ZhbCk7CisKKy8qCisgKiA9PT09PT09PSB3YWtlX2RzcCA9PT09PT09PT0KKyAqIFdha2VzIHVwIHRoZSBEU1AgZnJvbSBEZWVwU2xlZXAKKyAqLworZXh0ZXJuIGludCBkc3BfcGVyaXBoZXJhbF9jbGtfY3RybChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0CisJCQkJCSpkZXZfY29udGV4dCwgdm9pZCAqcGFyZ3MpOworLyoKKyAqICA9PT09PT09PSBoYW5kbGVfaGliZXJuYXRpb25fZnJvbV9kc3AgPT09PT09PT0KKyAqICAJSGFuZGxlIEhpYmVybmF0aW9uIHJlcXVlc3RlZCBmcm9tIERTUAorICovCitpbnQgaGFuZGxlX2hpYmVybmF0aW9uX2Zyb21fZHNwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0KTsKKy8qCisgKiAgPT09PT09PT0gcG9zdF9zY2FsZV9kc3AgPT09PT09PT0KKyAqICAJSGFuZGxlIFBvc3QgU2NhbGUgbm90aWZpY2F0aW9uIHRvIERTUAorICovCitpbnQgcG9zdF9zY2FsZV9kc3Aoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJCQkJdm9pZCAqcGFyZ3MpOworLyoKKyAqICA9PT09PT09PSBwcmVfc2NhbGVfZHNwID09PT09PT09CisgKiAgCUhhbmRsZSBQcmUgU2NhbGUgbm90aWZpY2F0aW9uIHRvIERTUAorICovCitpbnQgcHJlX3NjYWxlX2RzcChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCQkJCQl2b2lkICpwYXJncyk7CisvKgorICogID09PT09PT09IGhhbmRsZV9jb25zdHJhaW50c19zZXQgPT09PT09PT0KKyAqICAJSGFuZGxlIGNvbnN0cmFpbnRzIHJlcXVlc3QgZnJvbSBEU1AKKyAqLworaW50IGhhbmRsZV9jb25zdHJhaW50c19zZXQoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJICB2b2lkICpwYXJncyk7CisKKy8qCisgKiAgPT09PT09PT0gZHNwX2Nsa193YWtldXBfZXZlbnRfY3RybCA9PT09PT09PQorICogICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZ3JvdXAgc2VsY3Rpb24gYml0cyBmb3Igd2hpbGUKKyAqICAgICBlbmFibGluZy9kaXNhYmxpbmcuCisgKi8KK3ZvaWQgZHNwX2Nsa193YWtldXBfZXZlbnRfY3RybCh1MzIgY2xvY2tfaWQsIGJvb2wgZW5hYmxlKTsKKworI2VuZGlmIC8qIF9USU9NQVBfUFdSXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvY2hubF9zbS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvY2hubF9zbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTJiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9jaG5sX3NtLmMKQEAgLTAsMCArMSwxMDE0IEBACisvKgorICogY2hubF9zbS5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEltcGxlbWVudHMgdXBwZXIgZWRnZSBmdW5jdGlvbnMgZm9yIEJyaWRnZSBkcml2ZXIgY2hhbm5lbCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyoKKyAqICAgICAgVGhlIGxvd2VyIGVkZ2UgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIEJyaWRnZSBkcml2ZXIKKyAqICAgICAgd3JpdGVyLCBhbmQgYXJlIGRlY2xhcmVkIGluIGNobmxfc20uaC4KKyAqCisgKiAgICAgIENhcmUgaXMgdGFrZW4gaW4gdGhpcyBjb2RlIHRvIHByZXZlbnQgc2ltdWxhdGFuZW91cyBhY2Nlc3MgdG8gY2hhbm5lbAorICogICAgICBxdWV1ZXMgZnJvbQorICogICAgICAxLiBUaHJlYWRzLgorICogICAgICAyLiBpb19kcGMoKSwgc2NoZWR1bGVkIGZyb20gdGhlIGlvX2lzcigpIGFzIGFuIGV2ZW50LgorICoKKyAqICAgICAgVGhpcyBpcyBkb25lIHByaW1hcmlseSBieToKKyAqICAgICAgLSBTZW1hcGhvcmVzLgorICogICAgICAtIHN0YXRlIGZsYWdzIGluIHRoZSBjaGFubmVsIG9iamVjdDsgYW5kCisgKiAgICAgIC0gZW5zdXJpbmcgdGhlIElPX0Rpc3BhdGNoKCkgcm91dGluZSwgd2hpY2ggaXMgY2FsbGVkIGZyb20gYm90aAorICogICAgICAgIENITkxfQWRkSU9SZXEoKSBhbmQgdGhlIERQQyhpZiBpbXBsZW1lbnRlZCksIGlzIG5vdCByZS1lbnRlcmVkLgorICoKKyAqICBDaGFubmVsIEludmFyaWFudDoKKyAqICAgICAgVGhlcmUgaXMgYW4gaW1wb3J0YW50IGludmFyaWFudCBjb25kaXRpb24gd2hpY2ggbXVzdCBiZSBtYWludGFpbmVkIHBlcgorICogICAgICBjaGFubmVsIG91dHNpZGUgb2YgYnJpZGdlX2NobmxfZ2V0X2lvYygpIGFuZCBJT19EaXNwYXRjaCgpLCB2aW9sYXRpb24gb2YKKyAqICAgICAgd2hpY2ggbWF5IGNhdXNlIHRpbWVvdXRzIGFuZC9vciBmYWlsdXJlIG9mZnVuY3Rpb24gc3luY193YWl0X29uX2V2ZW50LgorICogICAgICBUaGlzIGludmFyaWFudCBjb25kaXRpb24gaXM6CisgKgorICogICAgICAgICAgTFNUX0VtcHR5KHBjaG5sLT5waW9fY29tcGxldGlvbnMpID09PiBwY2hubC0+c3luY19ldmVudCBpcyByZXNldAorICogICAgICBhbmQKKyAqICAgICAgICAgICFMU1RfRW1wdHkocGNobmwtPnBpb19jb21wbGV0aW9ucykgPT0+IHBjaG5sLT5zeW5jX2V2ZW50IGlzIHNldC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCcmlkZ2UgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwY2hubC5oPgorI2luY2x1ZGUgIl90aW9tYXAuaCIKKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBsYXRmb3JtIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdGhlcnMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaW9fc20uaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZSBmb3IgVGhpcyAqLworI2RlZmluZSBVU0VSTU9ERV9BRERSICAgUEFHRV9PRkZTRVQKKworI2RlZmluZSBNQUlMQk9YX0lSUSBJTlRfTUFJTF9NUFVfSVJRCisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzICovCitzdGF0aWMgc3RydWN0IGxzdF9saXN0ICpjcmVhdGVfY2hpcnBfbGlzdCh1MzIgY2hpcnBzKTsKKworc3RhdGljIHZvaWQgZnJlZV9jaGlycF9saXN0KHN0cnVjdCBsc3RfbGlzdCAqY2hpcnBfbGlzdCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2hubF9pcnAgKm1ha2VfbmV3X2NoaXJwKHZvaWQpOworCitzdGF0aWMgaW50IHNlYXJjaF9mcmVlX2NoYW5uZWwoc3RydWN0IGNobmxfbWdyICpjaG5sX21ncl9vYmosCisJCQkJICAgICAgdTMyICpjaG5sKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9hZGRfaW9fcmVxID09PT09PT09CisgKiAgICAgIEVucXVldWUgYW4gSS9PIHJlcXVlc3QgZm9yIGRhdGEgdHJhbnNmZXIgb24gYSBjaGFubmVsIHRvIHRoZSBEU1AuCisgKiAgICAgIFRoZSBkaXJlY3Rpb24gKG1vZGUpIGlzIHNwZWNpZmllZCBpbiB0aGUgY2hhbm5lbCBvYmplY3QuIE5vdGUgdGhlIERTUAorICogICAgICBhZGRyZXNzIGlzIHNwZWNpZmllZCBmb3IgY2hhbm5lbHMgb3BlbmVkIGluIGRpcmVjdCBJL08gbW9kZS4KKyAqLworaW50IGJyaWRnZV9jaG5sX2FkZF9pb19yZXEoc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX29iaiwgdm9pZCAqaG9zdF9idWYsCisJCQkgICAgICAgdTMyIGJ5dGVfc2l6ZSwgdTMyIGJ1Zl9zaXplLAorCQkJICAgICAgIHUzMiBkd19kc3BfYWRkciwgdTMyIGR3X2FyZykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sID0gKHN0cnVjdCBjaG5sX29iamVjdCAqKWNobmxfb2JqOworCXN0cnVjdCBjaG5sX2lycCAqY2hubF9wYWNrZXRfb2JqID0gTlVMTDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iajsKKwl1OCBkd19zdGF0ZTsKKwlib29sIGlzX2VvczsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmNobmxfbWdyX29iaiA9IHBjaG5sLT5jaG5sX21ncl9vYmo7CisJdTggKmhvc3Rfc3lzX2J1ZiA9IE5VTEw7CisJYm9vbCBzY2hlZF9kcGMgPSBmYWxzZTsKKwl1MTYgbWJfdmFsID0gMDsKKworCWlzX2VvcyA9IChieXRlX3NpemUgPT0gMCk7CisKKwkvKiBWYWxpZGF0ZSBhcmdzICovCisJaWYgKCFob3N0X2J1ZiB8fCAhcGNobmwpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9IGVsc2UgaWYgKGlzX2VvcyAmJiBDSE5MX0lTX0lOUFVUKHBjaG5sLT5jaG5sX21vZGUpKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBDaGVjayB0aGUgY2hhbm5lbCBzdGF0ZTogb25seSBxdWV1ZSBjaGlycCBpZiBjaGFubmVsIHN0YXRlCisJCSAqIGFsbG93cyBpdC4KKwkJICovCisJCWR3X3N0YXRlID0gcGNobmwtPmR3X3N0YXRlOworCQlpZiAoZHdfc3RhdGUgIT0gQ0hOTF9TVEFURVJFQURZKSB7CisJCQlpZiAoZHdfc3RhdGUgJiBDSE5MX1NUQVRFQ0FOQ0VMKQorCQkJCXN0YXR1cyA9IC1FQ0FOQ0VMRUQ7CisJCQllbHNlIGlmICgoZHdfc3RhdGUgJiBDSE5MX1NUQVRFRU9TKSAmJgorCQkJCSBDSE5MX0lTX09VVFBVVChwY2hubC0+Y2hubF9tb2RlKSkKKwkJCQlzdGF0dXMgPSAtRVBJUEU7CisJCQllbHNlCisJCQkJLyogTm8gb3RoZXIgcG9zc2libGUgc3RhdGVzIGxlZnQgKi8KKwkJCQlEQkNfQVNTRVJUKDApOworCQl9CisJfQorCisJZGV2X29iaiA9IGRldl9nZXRfZmlyc3QoKTsKKwlkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGRldl9vYmosICZkZXZfY3R4dCk7CisJaWYgKCFkZXZfY3R4dCkKKwkJc3RhdHVzID0gLUVGQVVMVDsKKworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlpZiAocGNobmwtPmNobmxfdHlwZSA9PSBDSE5MX1BDUFkgJiYgcGNobmwtPmNobmxfaWQgPiAxICYmIGhvc3RfYnVmKSB7CisJCWlmICghKGhvc3RfYnVmIDwgKHZvaWQgKilVU0VSTU9ERV9BRERSKSkgeworCQkJaG9zdF9zeXNfYnVmID0gaG9zdF9idWY7CisJCQlnb3RvIGZ1bmNfY29udDsKKwkJfQorCQkvKiBpZiBhZGRyIGluIHVzZXIgbW9kZSwgdGhlbiBjb3B5IHRvIGtlcm5lbCBzcGFjZSAqLworCQlob3N0X3N5c19idWYgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGhvc3Rfc3lzX2J1ZiA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCQlpZiAoQ0hOTF9JU19PVVRQVVQocGNobmwtPmNobmxfbW9kZSkpIHsKKwkJCXN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGhvc3Rfc3lzX2J1ZiwgaG9zdF9idWYsCisJCQkJCQlidWZfc2l6ZSk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJa2ZyZWUoaG9zdF9zeXNfYnVmKTsKKwkJCQlob3N0X3N5c19idWYgPSBOVUxMOworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJZ290byBmdW5jX2VuZDsKKwkJCX0KKwkJfQorCX0KK2Z1bmNfY29udDoKKwkvKiBNYWlsYm94IElSUSBpcyBkaXNhYmxlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiB3aXRoIERNQS9aQ1BZCisJICogY2hhbm5lbHMuIERQQ0NTIGlzIGhlbGQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggUENQWSBjaGFubmVscy4KKwkgKiBJZiBEUEMgaXMgc2NoZWR1bGVkIGluIHByb2Nlc3MgY29udGV4dCAoaW9zbV9zY2hlZHVsZSkgYW5kIGFueQorCSAqIG5vbi1tYWlsYm94IGludGVycnVwdCBvY2N1cnMsIHRoYXQgRFBDIHdpbGwgcnVuIGFuZCBicmVhayBDUy4gSGVuY2UKKwkgKiB3ZSBkaXNhYmxlIEFMTCBEUENzLiBXZSB3aWxsIHRyeSB0byBkaXNhYmxlIE9OTFkgSU8gRFBDIGxhdGVyLiAqLworCXNwaW5fbG9ja19iaCgmY2hubF9tZ3Jfb2JqLT5jaG5sX21ncl9sb2NrKTsKKwlvbWFwX21ib3hfZGlzYWJsZV9pcnEoZGV2X2N0eHQtPm1ib3gsIElSUV9SWCk7CisJaWYgKHBjaG5sLT5jaG5sX3R5cGUgPT0gQ0hOTF9QQ1BZKSB7CisJCS8qIFRoaXMgaXMgYSBwcm9jZXNzb3ItY29weSBjaGFubmVsLiAqLworCQlpZiAoIXN0YXR1cyAmJiBDSE5MX0lTX09VVFBVVChwY2hubC0+Y2hubF9tb2RlKSkgeworCQkJLyogQ2hlY2sgYnVmZmVyIHNpemUgb24gb3V0cHV0IGNoYW5uZWxzIGZvciBmaXQuICovCisJCQlpZiAoYnl0ZV9zaXplID4KKwkJCSAgICBpb19idWZfc2l6ZShwY2hubC0+Y2hubF9tZ3Jfb2JqLT5oaW9fbWdyKSkKKwkJCQlzdGF0dXMgPSAtRUlOVkFMOworCisJCX0KKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogR2V0IGEgZnJlZSBjaGlycDogKi8KKwkJY2hubF9wYWNrZXRfb2JqID0KKwkJICAgIChzdHJ1Y3QgY2hubF9pcnAgKilsc3RfZ2V0X2hlYWQocGNobmwtPmZyZWVfcGFja2V0c19saXN0KTsKKwkJaWYgKGNobmxfcGFja2V0X29iaiA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVJTzsKKworCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBFbnF1ZXVlIHRoZSBjaGlycCBvbiB0aGUgY2hubCdzIElPUmVxdWVzdCBxdWV1ZTogKi8KKwkJY2hubF9wYWNrZXRfb2JqLT5ob3N0X3VzZXJfYnVmID0gY2hubF9wYWNrZXRfb2JqLT5ob3N0X3N5c19idWYgPQorCQkgICAgaG9zdF9idWY7CisJCWlmIChwY2hubC0+Y2hubF90eXBlID09IENITkxfUENQWSAmJiBwY2hubC0+Y2hubF9pZCA+IDEpCisJCQljaG5sX3BhY2tldF9vYmotPmhvc3Rfc3lzX2J1ZiA9IGhvc3Rfc3lzX2J1ZjsKKworCQkvKgorCQkgKiBOb3RlOiBmb3IgZG1hIGNoYW5zIGR3X2RzcF9hZGRyIGNvbnRhaW5zIGRzcCBhZGRyZXNzCisJCSAqIG9mIFNNIGJ1ZmZlci4KKwkJICovCisJCURCQ19BU1NFUlQoY2hubF9tZ3Jfb2JqLT53b3JkX3NpemUgIT0gMCk7CisJCS8qIERTUCBhZGRyZXNzICovCisJCWNobmxfcGFja2V0X29iai0+ZHNwX3R4X2FkZHIgPQorCQkgICAgZHdfZHNwX2FkZHIgLyBjaG5sX21ncl9vYmotPndvcmRfc2l6ZTsKKwkJY2hubF9wYWNrZXRfb2JqLT5ieXRlX3NpemUgPSBieXRlX3NpemU7CisJCWNobmxfcGFja2V0X29iai0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKwkJLyogT25seSB2YWxpZCBmb3Igb3V0cHV0IGNoYW5uZWwgKi8KKwkJY2hubF9wYWNrZXRfb2JqLT5kd19hcmcgPSBkd19hcmc7CisJCWNobmxfcGFja2V0X29iai0+c3RhdHVzID0gKGlzX2VvcyA/IENITkxfSU9DU1RBVEVPUyA6CisJCQkJCSAgIENITkxfSU9DU1RBVENPTVBMRVRFKTsKKwkJbHN0X3B1dF90YWlsKHBjaG5sLT5waW9fcmVxdWVzdHMsCisJCQkgICAgIChzdHJ1Y3QgbGlzdF9oZWFkICopY2hubF9wYWNrZXRfb2JqKTsKKwkJcGNobmwtPmNpb19yZXFzKys7CisJCURCQ19BU1NFUlQocGNobmwtPmNpb19yZXFzIDw9IHBjaG5sLT5jaG5sX3BhY2tldHMpOworCQkvKgorCQkgKiBJZiBlbmQgb2Ygc3RyZWFtLCB1cGRhdGUgdGhlIGNoYW5uZWwgc3RhdGUgdG8gcHJldmVudAorCQkgKiBtb3JlIElPUidzLgorCQkgKi8KKwkJaWYgKGlzX2VvcykKKwkJCXBjaG5sLT5kd19zdGF0ZSB8PSBDSE5MX1NUQVRFRU9TOworCisJCS8qIExlZ2FjeSBEU00gUHJvY2Vzc29yLUNvcHkgKi8KKwkJREJDX0FTU0VSVChwY2hubC0+Y2hubF90eXBlID09IENITkxfUENQWSk7CisJCS8qIFJlcXVlc3QgSU8gZnJvbSB0aGUgRFNQICovCisJCWlvX3JlcXVlc3RfY2hubChjaG5sX21ncl9vYmotPmhpb19tZ3IsIHBjaG5sLAorCQkJCShDSE5MX0lTX0lOUFVUKHBjaG5sLT5jaG5sX21vZGUpID8gSU9fSU5QVVQgOgorCQkJCSBJT19PVVRQVVQpLCAmbWJfdmFsKTsKKwkJc2NoZWRfZHBjID0gdHJ1ZTsKKworCX0KKwlvbWFwX21ib3hfZW5hYmxlX2lycShkZXZfY3R4dC0+bWJveCwgSVJRX1JYKTsKKwlzcGluX3VubG9ja19iaCgmY2hubF9tZ3Jfb2JqLT5jaG5sX21ncl9sb2NrKTsKKwlpZiAobWJfdmFsICE9IDApCisJCXNtX2ludGVycnVwdF9kc3AoZGV2X2N0eHQsIG1iX3ZhbCk7CisKKwkvKiBTY2hlZHVsZSBhIERQQywgdG8gZG8gdGhlIGFjdHVhbCBkYXRhIHRyYW5zZmVyICovCisJaWYgKHNjaGVkX2RwYykKKwkJaW9zbV9zY2hlZHVsZShjaG5sX21ncl9vYmotPmhpb19tZ3IpOworCitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2NhbmNlbF9pbyA9PT09PT09PQorICogICAgICBSZXR1cm4gYWxsIEkvTyByZXF1ZXN0cyB0byB0aGUgY2xpZW50IHdoaWNoIGhhdmUgbm90IHlldCBiZWVuCisgKiAgICAgIHRyYW5zZmVycmVkLiAgVGhlIGNoYW5uZWwncyBJL08gY29tcGxldGlvbiBvYmplY3QgaXMKKyAqICAgICAgc2lnbmFsbGVkLCBhbmQgYWxsIHRoZSBJL08gcmVxdWVzdHMgYXJlIHF1ZXVlZCBhcyBJT0Mncywgd2l0aCB0aGUKKyAqICAgICAgc3RhdHVzIGZpZWxkIHNldCB0byBDSE5MX0lPQ1NUQVRDQU5DRUwuCisgKiAgICAgIFRoaXMgY2FsbCBpcyB0eXBpY2FsbHkgdXNlZCBpbiBhYm9ydCBzaXR1YXRpb25zLCBhbmQgaXMgYSBwcmVsdWRlIHRvCisgKiAgICAgIGNobmxfY2xvc2UoKTsKKyAqLworaW50IGJyaWRnZV9jaG5sX2NhbmNlbF9pbyhzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjaG5sX29iamVjdCAqcGNobmwgPSAoc3RydWN0IGNobmxfb2JqZWN0ICopY2hubF9vYmo7CisJdTMyIGNobmxfaWQgPSAtMTsKKwlzOCBjaG5sX21vZGU7CisJc3RydWN0IGNobmxfaXJwICpjaG5sX3BhY2tldF9vYmo7CisJc3RydWN0IGNobmxfbWdyICpjaG5sX21ncl9vYmogPSBOVUxMOworCisJLyogQ2hlY2sgYXJnczogKi8KKwlpZiAocGNobmwgJiYgcGNobmwtPmNobmxfbWdyX29iaikgeworCQljaG5sX2lkID0gcGNobmwtPmNobmxfaWQ7CisJCWNobmxfbW9kZSA9IHBjaG5sLT5jaG5sX21vZGU7CisJCWNobmxfbWdyX29iaiA9IHBjaG5sLT5jaG5sX21ncl9vYmo7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCS8qICBNYXJrIHRoaXMgY2hhbm5lbCBhcyBjYW5jZWxsZWQsIHRvIHByZXZlbnQgZnVydGhlciBJT1JlcXVlc3RzIG9yCisJICogIElPUmVxdWVzdHMgb3IgZGlzcGF0Y2hpbmcuICovCisJc3Bpbl9sb2NrX2JoKCZjaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworCXBjaG5sLT5kd19zdGF0ZSB8PSBDSE5MX1NUQVRFQ0FOQ0VMOworCWlmIChMU1RfSVNfRU1QVFkocGNobmwtPnBpb19yZXF1ZXN0cykpCisJCWdvdG8gZnVuY19jb250OworCisJaWYgKHBjaG5sLT5jaG5sX3R5cGUgPT0gQ0hOTF9QQ1BZKSB7CisJCS8qIEluZGljYXRlIHdlIGhhdmUgbm8gbW9yZSBidWZmZXJzIGF2YWlsYWJsZSBmb3IgdHJhbnNmZXI6ICovCisJCWlmIChDSE5MX0lTX0lOUFVUKHBjaG5sLT5jaG5sX21vZGUpKSB7CisJCQlpb19jYW5jZWxfY2hubChjaG5sX21ncl9vYmotPmhpb19tZ3IsIGNobmxfaWQpOworCQl9IGVsc2UgeworCQkJLyogUmVjb3JkIHRoYXQgd2Ugbm8gbG9uZ2VyIGhhdmUgb3V0cHV0IGJ1ZmZlcnMKKwkJCSAqIGF2YWlsYWJsZTogKi8KKwkJCWNobmxfbWdyX29iai0+ZHdfb3V0cHV0X21hc2sgJj0gfigxIDw8IGNobmxfaWQpOworCQl9CisJfQorCS8qIE1vdmUgYWxsIElPUidzIHRvIElPQyBxdWV1ZTogKi8KKwl3aGlsZSAoIUxTVF9JU19FTVBUWShwY2hubC0+cGlvX3JlcXVlc3RzKSkgeworCQljaG5sX3BhY2tldF9vYmogPQorCQkgICAgKHN0cnVjdCBjaG5sX2lycCAqKWxzdF9nZXRfaGVhZChwY2hubC0+cGlvX3JlcXVlc3RzKTsKKwkJaWYgKGNobmxfcGFja2V0X29iaikgeworCQkJY2hubF9wYWNrZXRfb2JqLT5ieXRlX3NpemUgPSAwOworCQkJY2hubF9wYWNrZXRfb2JqLT5zdGF0dXMgfD0gQ0hOTF9JT0NTVEFUQ0FOQ0VMOworCQkJbHN0X3B1dF90YWlsKHBjaG5sLT5waW9fY29tcGxldGlvbnMsCisJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKWNobmxfcGFja2V0X29iaik7CisJCQlwY2hubC0+Y2lvX2NzKys7CisJCQlwY2hubC0+Y2lvX3JlcXMtLTsKKwkJCURCQ19BU1NFUlQocGNobmwtPmNpb19yZXFzID49IDApOworCQl9CisJfQorZnVuY19jb250OgorCXNwaW5fdW5sb2NrX2JoKCZjaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9jbG9zZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVuc3VyZXMgYWxsIHBlbmRpbmcgSS9PIG9uIHRoaXMgY2hhbm5lbCBpcyBjYW5jZWxsZWQsIGRpc2NhcmRzIGFsbAorICogICAgICBxdWV1ZWQgSS9PIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgdGhlbiBmcmVlcyB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZAorICogICAgICBmb3IgdGhpcyBjaGFubmVsLCBhbmQgbWFrZXMgdGhlIGNvcnJlc3BvbmRpbmcgbG9naWNhbCBjaGFubmVsIGlkCisgKiAgICAgIGF2YWlsYWJsZSBmb3Igc3Vic2VxdWVudCB1c2UuCisgKi8KK2ludCBicmlkZ2VfY2hubF9jbG9zZShzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGNobmxfb2JqZWN0ICpwY2hubCA9IChzdHJ1Y3QgY2hubF9vYmplY3QgKiljaG5sX29iajsKKworCS8qIENoZWNrIGFyZ3M6ICovCisJaWYgKCFwY2hubCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfY29udDsKKwl9CisJeworCQkvKiBDYW5jZWwgSU86IHRoaXMgZW5zdXJlcyBubyBmdXJ0aGVyIElPIHJlcXVlc3RzIG9yCisJCSAqIG5vdGlmaWNhdGlvbnMuICovCisJCXN0YXR1cyA9IGJyaWRnZV9jaG5sX2NhbmNlbF9pbyhjaG5sX29iaik7CisJfQorZnVuY19jb250OgorCWlmICghc3RhdHVzKSB7CisJCS8qIEFzc2VydCBJL08gb24gdGhpcyBjaGFubmVsIGlzIG5vdyBjYW5jZWxsZWQ6IFByb3RlY3RzCisJCSAqIGZyb20gaW9fZHBjLiAqLworCQlEQkNfQVNTRVJUKChwY2hubC0+ZHdfc3RhdGUgJiBDSE5MX1NUQVRFQ0FOQ0VMKSk7CisJCS8qIEludmFsaWRhdGUgY2hhbm5lbCBvYmplY3Q6IFByb3RlY3RzIGZyb20KKwkJICogQ0hOTF9HZXRJT0NvbXBsZXRpb24oKS4gKi8KKwkJLyogRnJlZSB0aGUgc2xvdCBpbiB0aGUgY2hhbm5lbCBtYW5hZ2VyOiAqLworCQlwY2hubC0+Y2hubF9tZ3Jfb2JqLT5hcF9jaGFubmVsW3BjaG5sLT5jaG5sX2lkXSA9IE5VTEw7CisJCXNwaW5fbG9ja19iaCgmcGNobmwtPmNobmxfbWdyX29iai0+Y2hubF9tZ3JfbG9jayk7CisJCXBjaG5sLT5jaG5sX21ncl9vYmotPm9wZW5fY2hhbm5lbHMgLT0gMTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBjaG5sLT5jaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworCQlpZiAocGNobmwtPm50Znlfb2JqKSB7CisJCQludGZ5X2RlbGV0ZShwY2hubC0+bnRmeV9vYmopOworCQkJa2ZyZWUocGNobmwtPm50Znlfb2JqKTsKKwkJCXBjaG5sLT5udGZ5X29iaiA9IE5VTEw7CisJCX0KKwkJLyogUmVzZXQgY2hhbm5lbCBldmVudDogKE5PVEU6IHVzZXJfZXZlbnQgZnJlZWQgaW4gdXNlcgorCQkgKiBjb250ZXh0LikuICovCisJCWlmIChwY2hubC0+c3luY19ldmVudCkgeworCQkJc3luY19yZXNldF9ldmVudChwY2hubC0+c3luY19ldmVudCk7CisJCQlrZnJlZShwY2hubC0+c3luY19ldmVudCk7CisJCQlwY2hubC0+c3luY19ldmVudCA9IE5VTEw7CisJCX0KKwkJLyogRnJlZSBJL08gcmVxdWVzdCBhbmQgSS9PIGNvbXBsZXRpb24gcXVldWVzOiAqLworCQlpZiAocGNobmwtPnBpb19jb21wbGV0aW9ucykgeworCQkJZnJlZV9jaGlycF9saXN0KHBjaG5sLT5waW9fY29tcGxldGlvbnMpOworCQkJcGNobmwtPnBpb19jb21wbGV0aW9ucyA9IE5VTEw7CisJCQlwY2hubC0+Y2lvX2NzID0gMDsKKwkJfQorCQlpZiAocGNobmwtPnBpb19yZXF1ZXN0cykgeworCQkJZnJlZV9jaGlycF9saXN0KHBjaG5sLT5waW9fcmVxdWVzdHMpOworCQkJcGNobmwtPnBpb19yZXF1ZXN0cyA9IE5VTEw7CisJCQlwY2hubC0+Y2lvX3JlcXMgPSAwOworCQl9CisJCWlmIChwY2hubC0+ZnJlZV9wYWNrZXRzX2xpc3QpIHsKKwkJCWZyZWVfY2hpcnBfbGlzdChwY2hubC0+ZnJlZV9wYWNrZXRzX2xpc3QpOworCQkJcGNobmwtPmZyZWVfcGFja2V0c19saXN0ID0gTlVMTDsKKwkJfQorCQkvKiBSZWxlYXNlIGNoYW5uZWwgb2JqZWN0LiAqLworCQlrZnJlZShwY2hubCk7CisJCXBjaG5sID0gTlVMTDsKKwl9CisJREJDX0VOU1VSRShzdGF0dXMgfHwgIXBjaG5sKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2NyZWF0ZSA9PT09PT09PQorICogICAgICBDcmVhdGUgYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0LCByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBuZXcgY2hhbm5lbHMKKyAqICAgICAgYW5kIGNsb3Npbmcgb2xkIG9uZXMgZm9yIGEgZ2l2ZW4gYm9hcmQuCisgKi8KK2ludCBicmlkZ2VfY2hubF9jcmVhdGUoc3RydWN0IGNobmxfbWdyICoqY2hhbm5lbF9tZ3IsCisJCQkgICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2hubF9tZ3JhdHRycyAqbWdyX2F0dHJ0cykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmNobmxfbWdyX29iaiA9IE5VTEw7CisJdTggbWF4X2NoYW5uZWxzOworCisJLyogQ2hlY2sgREJDIHJlcXVpcmVtZW50czogKi8KKwlEQkNfUkVRVUlSRShjaGFubmVsX21nciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShtZ3JfYXR0cnRzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKG1ncl9hdHRydHMtPm1heF9jaGFubmVscyA+IDApOworCURCQ19SRVFVSVJFKG1ncl9hdHRydHMtPm1heF9jaGFubmVscyA8PSBDSE5MX01BWENIQU5ORUxTKTsKKwlEQkNfUkVRVUlSRShtZ3JfYXR0cnRzLT53b3JkX3NpemUgIT0gMCk7CisKKwkvKiBBbGxvY2F0ZSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0ICovCisJY2hubF9tZ3Jfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNobmxfbWdyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNobmxfbWdyX29iaikgeworCQkvKgorCQkgKiBUaGUgbWF4X2NoYW5uZWxzIGF0dHIgbXVzdCBlcXVhbCB0aGUgIyBvZiBzdXBwb3J0ZWQgY2hubHMgZm9yCisJCSAqIGVhY2ggdHJhbnNwb3J0KCMgY2hubHMgZm9yIFBDUFkgPSBERE1BID0gWkNQWSk6IGkuZS4KKwkJICogICAgICBtZ3JfYXR0cnRzLT5tYXhfY2hhbm5lbHMgPSBDSE5MX01BWENIQU5ORUxTID0KKwkJICogICAgICAgICAgICAgICAgICAgICAgIERETUFfTUFYRERNQUNITkxTID0gRERNQV9NQVhaQ1BZQ0hOTFMuCisJCSAqLworCQlEQkNfQVNTRVJUKG1ncl9hdHRydHMtPm1heF9jaGFubmVscyA9PSBDSE5MX01BWENIQU5ORUxTKTsKKwkJbWF4X2NoYW5uZWxzID0gQ0hOTF9NQVhDSEFOTkVMUyArIENITkxfTUFYQ0hBTk5FTFMgKiBDSE5MX1BDUFk7CisJCS8qIENyZWF0ZSBhcnJheSBvZiBjaGFubmVscyAqLworCQljaG5sX21ncl9vYmotPmFwX2NoYW5uZWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hubF9vYmplY3QgKikKKwkJCQkJCSogbWF4X2NoYW5uZWxzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNobmxfbWdyX29iai0+YXBfY2hhbm5lbCkgeworCQkJLyogSW5pdGlhbGl6ZSBjaG5sX21nciBvYmplY3QgKi8KKwkJCWNobmxfbWdyX29iai0+ZHdfdHlwZSA9IENITkxfVFlQRVNNOworCQkJY2hubF9tZ3Jfb2JqLT53b3JkX3NpemUgPSBtZ3JfYXR0cnRzLT53b3JkX3NpemU7CisJCQkvKiBUb3RhbCAjIGNobmxzIHN1cHBvcnRlZCAqLworCQkJY2hubF9tZ3Jfb2JqLT5tYXhfY2hhbm5lbHMgPSBtYXhfY2hhbm5lbHM7CisJCQljaG5sX21ncl9vYmotPm9wZW5fY2hhbm5lbHMgPSAwOworCQkJY2hubF9tZ3Jfb2JqLT5kd19vdXRwdXRfbWFzayA9IDA7CisJCQljaG5sX21ncl9vYmotPmR3X2xhc3Rfb3V0cHV0ID0gMDsKKwkJCWNobmxfbWdyX29iai0+aGRldl9vYmogPSBoZGV2X29iajsKKwkJCXNwaW5fbG9ja19pbml0KCZjaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJaWYgKHN0YXR1cykgeworCQlicmlkZ2VfY2hubF9kZXN0cm95KGNobmxfbWdyX29iaik7CisJCSpjaGFubmVsX21nciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogUmV0dXJuIGNoYW5uZWwgbWFuYWdlciBvYmplY3QgdG8gY2FsbGVyLi4uICovCisJCSpjaGFubmVsX21nciA9IGNobmxfbWdyX29iajsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9kZXN0cm95ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2xvc2UgYWxsIG9wZW4gY2hhbm5lbHMsIGFuZCBkZXN0cm95IHRoZSBjaGFubmVsIG1hbmFnZXIuCisgKi8KK2ludCBicmlkZ2VfY2hubF9kZXN0cm95KHN0cnVjdCBjaG5sX21nciAqaGNobmxfbWdyKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjaG5sX21nciAqY2hubF9tZ3Jfb2JqID0gaGNobmxfbWdyOworCXUzMiBjaG5sX2lkOworCisJaWYgKGhjaG5sX21ncikgeworCQkvKiBDbG9zZSBhbGwgb3BlbiBjaGFubmVsczogKi8KKwkJZm9yIChjaG5sX2lkID0gMDsgY2hubF9pZCA8IGNobmxfbWdyX29iai0+bWF4X2NoYW5uZWxzOworCQkgICAgIGNobmxfaWQrKykgeworCQkJc3RhdHVzID0KKwkJCSAgICBicmlkZ2VfY2hubF9jbG9zZShjaG5sX21ncl9vYmotPmFwX2NoYW5uZWwKKwkJCQkJICAgICAgW2NobmxfaWRdKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZGV2X2RiZyhicmlkZ2UsICIlczogRXJyb3Igc3RhdHVzIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQl9CisKKwkJLyogRnJlZSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0OiAqLworCQlrZnJlZShjaG5sX21ncl9vYmotPmFwX2NoYW5uZWwpOworCisJCS8qIFNldCBoY2hubF9tZ3IgdG8gTlVMTCBpbiBkZXZpY2Ugb2JqZWN0LiAqLworCQlkZXZfc2V0X2NobmxfbWdyKGNobmxfbWdyX29iai0+aGRldl9vYmosIE5VTEwpOworCQkvKiBGcmVlIHRoaXMgQ2hubCBNZ3Igb2JqZWN0OiAqLworCQlrZnJlZShoY2hubF9tZ3IpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2NobmxfZmx1c2hfaW8gPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBGbHVzaGVzIGFsbCB0aGUgb3V0c3RhbmRpbmcgZGF0YSByZXF1ZXN0cyBvbiBhIGNoYW5uZWwuCisgKi8KK2ludCBicmlkZ2VfY2hubF9mbHVzaF9pbyhzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqLCB1MzIgdGltZW91dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sID0gKHN0cnVjdCBjaG5sX29iamVjdCAqKWNobmxfb2JqOworCXM4IGNobmxfbW9kZSA9IC0xOworCXN0cnVjdCBjaG5sX21nciAqY2hubF9tZ3Jfb2JqOworCXN0cnVjdCBjaG5sX2lvYyBjaG5sX2lvY19vYmo7CisJLyogQ2hlY2sgYXJnczogKi8KKwlpZiAocGNobmwpIHsKKwkJaWYgKCh0aW1lb3V0ID09IENITkxfSU9DTk9XQUlUKQorCQkgICAgJiYgQ0hOTF9JU19PVVRQVVQocGNobmwtPmNobmxfbW9kZSkpIHsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQljaG5sX21vZGUgPSBwY2hubC0+Y2hubF9tb2RlOworCQkJY2hubF9tZ3Jfb2JqID0gcGNobmwtPmNobmxfbWdyX29iajsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIE5vdGU6IEN1cnJlbnRseSwgaWYgYW5vdGhlciB0aHJlYWQgY29udGludWVzIHRvIGFkZCBJTworCQkgKiByZXF1ZXN0cyB0byB0aGlzIGNoYW5uZWwsIHRoaXMgZnVuY3Rpb24gd2lsbCBjb250aW51ZSB0bworCQkgKiBmbHVzaCBhbGwgc3VjaCBxdWV1ZWQgSU8gcmVxdWVzdHMuICovCisJCWlmIChDSE5MX0lTX09VVFBVVChjaG5sX21vZGUpCisJCSAgICAmJiAocGNobmwtPmNobmxfdHlwZSA9PSBDSE5MX1BDUFkpKSB7CisJCQkvKiBXYWl0IGZvciBJTyBjb21wbGV0aW9ucywgdXAgdG8gdGhlIHNwZWNpZmllZAorCQkJICogdGltZW91dDogKi8KKwkJCXdoaWxlICghTFNUX0lTX0VNUFRZKHBjaG5sLT5waW9fcmVxdWVzdHMpICYmICFzdGF0dXMpIHsKKwkJCQlzdGF0dXMgPSBicmlkZ2VfY2hubF9nZXRfaW9jKGNobmxfb2JqLAorCQkJCQkJdGltZW91dCwgJmNobmxfaW9jX29iaik7CisJCQkJaWYgKHN0YXR1cykKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoY2hubF9pb2Nfb2JqLnN0YXR1cyAmIENITkxfSU9DU1RBVFRJTUVPVVQpCisJCQkJCXN0YXR1cyA9IC1FVElNRURPVVQ7CisKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGJyaWRnZV9jaG5sX2NhbmNlbF9pbyhjaG5sX29iaik7CisJCQkvKiBOb3csIGxlYXZlIHRoZSBjaGFubmVsIGluIHRoZSByZWFkeSBzdGF0ZTogKi8KKwkJCXBjaG5sLT5kd19zdGF0ZSAmPSB+Q0hOTF9TVEFURUNBTkNFTDsKKwkJfQorCX0KKwlEQkNfRU5TVVJFKHN0YXR1cyB8fCBMU1RfSVNfRU1QVFkocGNobmwtPnBpb19yZXF1ZXN0cykpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2NobmxfZ2V0X2luZm8gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGEgY2hhbm5lbC4KKyAqLworaW50IGJyaWRnZV9jaG5sX2dldF9pbmZvKHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosCisJCQkgICAgIHN0cnVjdCBjaG5sX2luZm8gKmNoYW5uZWxfaW5mbykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sID0gKHN0cnVjdCBjaG5sX29iamVjdCAqKWNobmxfb2JqOworCWlmIChjaGFubmVsX2luZm8gIT0gTlVMTCkgeworCQlpZiAocGNobmwpIHsKKwkJCS8qIFJldHVybiB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uOiAqLworCQkJY2hhbm5lbF9pbmZvLT5oY2hubF9tZ3IgPSBwY2hubC0+Y2hubF9tZ3Jfb2JqOworCQkJY2hhbm5lbF9pbmZvLT5ldmVudF9vYmogPSBwY2hubC0+dXNlcl9ldmVudDsKKwkJCWNoYW5uZWxfaW5mby0+Y25obF9pZCA9IHBjaG5sLT5jaG5sX2lkOworCQkJY2hhbm5lbF9pbmZvLT5kd19tb2RlID0gcGNobmwtPmNobmxfbW9kZTsKKwkJCWNoYW5uZWxfaW5mby0+Ynl0ZXNfdHggPSBwY2hubC0+Ynl0ZXNfbW92ZWQ7CisJCQljaGFubmVsX2luZm8tPnByb2Nlc3MgPSBwY2hubC0+cHJvY2VzczsKKwkJCWNoYW5uZWxfaW5mby0+c3luY19ldmVudCA9IHBjaG5sLT5zeW5jX2V2ZW50OworCQkJY2hhbm5lbF9pbmZvLT5jaW9fY3MgPSBwY2hubC0+Y2lvX2NzOworCQkJY2hhbm5lbF9pbmZvLT5jaW9fcmVxcyA9IHBjaG5sLT5jaW9fcmVxczsKKwkJCWNoYW5uZWxfaW5mby0+ZHdfc3RhdGUgPSBwY2hubC0+ZHdfc3RhdGU7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9nZXRfaW9jID09PT09PT09CisgKiAgICAgIE9wdGlvbmFsbHkgd2FpdCBmb3IgSS9PIGNvbXBsZXRpb24gb24gYSBjaGFubmVsLiAgRGVxdWV1ZSBhbiBJL08KKyAqICAgICAgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wbGV0ZWQKKyAqICAgICAgSS9PIHJlcXVlc3QuCisgKiAgICAgIE5vdGU6IEVuc3VyZXMgQ2hhbm5lbCBJbnZhcmlhbnQgKHNlZSBub3RlcyBhYm92ZSkuCisgKi8KK2ludCBicmlkZ2VfY2hubF9nZXRfaW9jKHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosIHUzMiB0aW1lb3V0LAorCQkJICAgIHN0cnVjdCBjaG5sX2lvYyAqY2hhbl9pb2MpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGNobmxfb2JqZWN0ICpwY2hubCA9IChzdHJ1Y3QgY2hubF9vYmplY3QgKiljaG5sX29iajsKKwlzdHJ1Y3QgY2hubF9pcnAgKmNobmxfcGFja2V0X29iajsKKwlpbnQgc3RhdF9zeW5jOworCWJvb2wgZGVxdWV1ZV9pb2MgPSB0cnVlOworCXN0cnVjdCBjaG5sX2lvYyBpb2MgPSB7IE5VTEwsIDAsIDAsIDAsIDAgfTsKKwl1OCAqaG9zdF9zeXNfYnVmID0gTlVMTDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iajsKKworCS8qIENoZWNrIGFyZ3M6ICovCisJaWYgKCFjaGFuX2lvYyB8fCAhcGNobmwpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9IGVsc2UgaWYgKHRpbWVvdXQgPT0gQ0hOTF9JT0NOT1dBSVQpIHsKKwkJaWYgKExTVF9JU19FTVBUWShwY2hubC0+cGlvX2NvbXBsZXRpb25zKSkKKwkJCXN0YXR1cyA9IC1FUkVNT1RFSU87CisKKwl9CisKKwlkZXZfb2JqID0gZGV2X2dldF9maXJzdCgpOworCWRldl9nZXRfYnJpZGdlX2NvbnRleHQoZGV2X29iaiwgJmRldl9jdHh0KTsKKwlpZiAoIWRldl9jdHh0KQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCWlvYy5zdGF0dXMgPSBDSE5MX0lPQ1NUQVRDT01QTEVURTsKKwlpZiAodGltZW91dCAhPQorCSAgICBDSE5MX0lPQ05PV0FJVCAmJiBMU1RfSVNfRU1QVFkocGNobmwtPnBpb19jb21wbGV0aW9ucykpIHsKKwkJaWYgKHRpbWVvdXQgPT0gQ0hOTF9JT0NJTkZJTklURSkKKwkJCXRpbWVvdXQgPSBTWU5DX0lORklOSVRFOworCisJCXN0YXRfc3luYyA9IHN5bmNfd2FpdF9vbl9ldmVudChwY2hubC0+c3luY19ldmVudCwgdGltZW91dCk7CisJCWlmIChzdGF0X3N5bmMgPT0gLUVUSU1FKSB7CisJCQkvKiBObyByZXNwb25zZSBmcm9tIERTUCAqLworCQkJaW9jLnN0YXR1cyB8PSBDSE5MX0lPQ1NUQVRUSU1FT1VUOworCQkJZGVxdWV1ZV9pb2MgPSBmYWxzZTsKKwkJfSBlbHNlIGlmIChzdGF0X3N5bmMgPT0gLUVQRVJNKSB7CisJCQkvKiBUaGlzIGNhbiBvY2N1ciB3aGVuIHRoZSB1c2VyIG1vZGUgdGhyZWFkIGlzCisJCQkgKiBhYm9ydGVkICheQyksIG9yIHdoZW4gX1ZXSU4zMl9XYWl0U2luZ2xlT2JqZWN0KCkKKwkJCSAqIGZhaWxzIGR1ZSB0byB1bmtvd24gY2F1c2VzLiAqLworCQkJLyogRXZlbiB0aG91Z2ggV2FpdCBmYWlsZWQsIHRoZXJlIG1heSBiZSBzb21ldGhpbmcgaW4KKwkJCSAqIHRoZSBROiAqLworCQkJaWYgKExTVF9JU19FTVBUWShwY2hubC0+cGlvX2NvbXBsZXRpb25zKSkgeworCQkJCWlvYy5zdGF0dXMgfD0gQ0hOTF9JT0NTVEFUQ0FOQ0VMOworCQkJCWRlcXVldWVfaW9jID0gZmFsc2U7CisJCQl9CisJCX0KKwl9CisJLyogU2VlIGNvbW1lbnQgaW4gQWRkSU9SZXEgKi8KKwlzcGluX2xvY2tfYmgoJnBjaG5sLT5jaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworCW9tYXBfbWJveF9kaXNhYmxlX2lycShkZXZfY3R4dC0+bWJveCwgSVJRX1JYKTsKKwlpZiAoZGVxdWV1ZV9pb2MpIHsKKwkJLyogRGVxdWV1ZSBJT0MgYW5kIHNldCBjaGFuX2lvYzsgKi8KKwkJREJDX0FTU0VSVCghTFNUX0lTX0VNUFRZKHBjaG5sLT5waW9fY29tcGxldGlvbnMpKTsKKwkJY2hubF9wYWNrZXRfb2JqID0KKwkJICAgIChzdHJ1Y3QgY2hubF9pcnAgKilsc3RfZ2V0X2hlYWQocGNobmwtPnBpb19jb21wbGV0aW9ucyk7CisJCS8qIFVwZGF0ZSBjaGFuX2lvYyBmcm9tIGNoYW5uZWwgc3RhdGUgYW5kIGNoaXJwOiAqLworCQlpZiAoY2hubF9wYWNrZXRfb2JqKSB7CisJCQlwY2hubC0+Y2lvX2NzLS07CisJCQkvKiAgSWYgdGhpcyBpcyBhIHplcm8tY29weSBjaGFubmVsLCB0aGVuIHNldCBJT0MncyBwYnVmCisJCQkgKiAgdG8gdGhlIERTUCdzIGFkZHJlc3MuIFRoaXMgRFNQIGFkZHJlc3Mgd2lsbCBnZXQKKwkJCSAqICB0cmFuc2xhdGVkIHRvIHVzZXIncyB2aXJ0dWFsIGFkZHIgbGF0ZXIuICovCisJCQl7CisJCQkJaG9zdF9zeXNfYnVmID0gY2hubF9wYWNrZXRfb2JqLT5ob3N0X3N5c19idWY7CisJCQkJaW9jLnBidWYgPSBjaG5sX3BhY2tldF9vYmotPmhvc3RfdXNlcl9idWY7CisJCQl9CisJCQlpb2MuYnl0ZV9zaXplID0gY2hubF9wYWNrZXRfb2JqLT5ieXRlX3NpemU7CisJCQlpb2MuYnVmX3NpemUgPSBjaG5sX3BhY2tldF9vYmotPmJ1Zl9zaXplOworCQkJaW9jLmR3X2FyZyA9IGNobmxfcGFja2V0X29iai0+ZHdfYXJnOworCQkJaW9jLnN0YXR1cyB8PSBjaG5sX3BhY2tldF9vYmotPnN0YXR1czsKKwkJCS8qIFBsYWNlIHRoZSB1c2VkIGNoaXJwIG9uIHRoZSBmcmVlIGxpc3Q6ICovCisJCQlsc3RfcHV0X3RhaWwocGNobmwtPmZyZWVfcGFja2V0c19saXN0LAorCQkJCSAgICAgKHN0cnVjdCBsaXN0X2hlYWQgKiljaG5sX3BhY2tldF9vYmopOworCQl9IGVsc2UgeworCQkJaW9jLnBidWYgPSBOVUxMOworCQkJaW9jLmJ5dGVfc2l6ZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpb2MucGJ1ZiA9IE5VTEw7CisJCWlvYy5ieXRlX3NpemUgPSAwOworCQlpb2MuZHdfYXJnID0gMDsKKwkJaW9jLmJ1Zl9zaXplID0gMDsKKwl9CisJLyogRW5zdXJlIGludmFyaWFudDogSWYgYW55IElPQydzIGFyZSBxdWV1ZWQgZm9yIHRoaXMgY2hhbm5lbC4uLiAqLworCWlmICghTFNUX0lTX0VNUFRZKHBjaG5sLT5waW9fY29tcGxldGlvbnMpKSB7CisJCS8qICBTaW5jZSBEU1BTdHJlYW1fUmVjbGFpbSgpIGRvZXMgbm90IHRha2UgYSB0aW1lb3V0CisJCSAqICBwYXJhbWV0ZXIsIHdlIHBhc3MgdGhlIHN0cmVhbSdzIHRpbWVvdXQgdmFsdWUgdG8KKwkJICogIGJyaWRnZV9jaG5sX2dldF9pb2MuIFdlIGNhbm5vdCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QKKwkJICogIHdlIGhhdmUgd2FpdGVkIGluIFVzZXIgbW9kZS4gU2luY2UgdGhlIHN0cmVhbSdzIHRpbWVvdXQKKwkJICogIHZhbHVlIG1heSBiZSBub24temVybywgd2Ugc3RpbGwgaGF2ZSB0byBzZXQgdGhlIGV2ZW50LgorCQkgKiAgVGhlcmVmb3JlLCB0aGlzIG9wdGltaXphdGlvbiBpcyB0YWtlbiBvdXQuCisJCSAqCisJCSAqICBpZiAodGltZW91dCA9PSBDSE5MX0lPQ05PV0FJVCkgeworCQkgKiAgICAuLi4gZW5zdXJlIGV2ZW50IGlzIHNldC4uCisJCSAqICAgICAgc3luY19zZXRfZXZlbnQocGNobmwtPnN5bmNfZXZlbnQpOworCQkgKiAgfSAqLworCQlzeW5jX3NldF9ldmVudChwY2hubC0+c3luY19ldmVudCk7CisJfSBlbHNlIHsKKwkJLyogZWxzZSwgaWYgbGlzdCBpcyBlbXB0eSwgZW5zdXJlIGV2ZW50IGlzIHJlc2V0LiAqLworCQlzeW5jX3Jlc2V0X2V2ZW50KHBjaG5sLT5zeW5jX2V2ZW50KTsKKwl9CisJb21hcF9tYm94X2VuYWJsZV9pcnEoZGV2X2N0eHQtPm1ib3gsIElSUV9SWCk7CisJc3Bpbl91bmxvY2tfYmgoJnBjaG5sLT5jaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworCWlmIChkZXF1ZXVlX2lvYworCSAgICAmJiAocGNobmwtPmNobmxfdHlwZSA9PSBDSE5MX1BDUFkgJiYgcGNobmwtPmNobmxfaWQgPiAxKSkgeworCQlpZiAoIShpb2MucGJ1ZiA8ICh2b2lkICopVVNFUk1PREVfQUREUikpCisJCQlnb3RvIGZ1bmNfY29udDsKKworCQkvKiBJZiB0aGUgYWRkciBpcyBpbiB1c2VyIG1vZGUsIHRoZW4gY29weSBpdCAqLworCQlpZiAoIWhvc3Rfc3lzX2J1ZiB8fCAhaW9jLnBidWYpIHsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQlnb3RvIGZ1bmNfY29udDsKKwkJfQorCQlpZiAoIUNITkxfSVNfSU5QVVQocGNobmwtPmNobmxfbW9kZSkpCisJCQlnb3RvIGZ1bmNfY29udDE7CisKKwkJLypob3N0X3VzZXJfYnVmICovCisJCXN0YXR1cyA9IGNvcHlfdG9fdXNlcihpb2MucGJ1ZiwgaG9zdF9zeXNfYnVmLCBpb2MuYnl0ZV9zaXplKTsKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRVhJVElORykKKwkJCQlzdGF0dXMgPSAwOworCQl9CisJCWlmIChzdGF0dXMpCisJCQlzdGF0dXMgPSAtRUZBVUxUOworZnVuY19jb250MToKKwkJa2ZyZWUoaG9zdF9zeXNfYnVmKTsKKwl9CitmdW5jX2NvbnQ6CisJLyogVXBkYXRlIFVzZXIncyBJT0MgYmxvY2s6ICovCisJKmNoYW5faW9jID0gaW9jOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9nZXRfbWdyX2luZm8gPT09PT09PT0KKyAqICAgICAgUmV0cmlldmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgY2hhbm5lbCBtYW5hZ2VyLgorICovCitpbnQgYnJpZGdlX2NobmxfZ2V0X21ncl9pbmZvKHN0cnVjdCBjaG5sX21nciAqaGNobmxfbWdyLCB1MzIgY2hfaWQsCisJCQkJIHN0cnVjdCBjaG5sX21ncmluZm8gKm1ncl9pbmZvKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjaG5sX21nciAqY2hubF9tZ3Jfb2JqID0gKHN0cnVjdCBjaG5sX21nciAqKWhjaG5sX21ncjsKKworCWlmIChtZ3JfaW5mbyAhPSBOVUxMKSB7CisJCWlmIChjaF9pZCA8PSBDSE5MX01BWENIQU5ORUxTKSB7CisJCQlpZiAoaGNobmxfbWdyKSB7CisJCQkJLyogUmV0dXJuIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb246ICovCisJCQkJbWdyX2luZm8tPmNobmxfb2JqID0KKwkJCQkgICAgY2hubF9tZ3Jfb2JqLT5hcF9jaGFubmVsW2NoX2lkXTsKKwkJCQltZ3JfaW5mby0+b3Blbl9jaGFubmVscyA9CisJCQkJICAgIGNobmxfbWdyX29iai0+b3Blbl9jaGFubmVsczsKKwkJCQltZ3JfaW5mby0+ZHdfdHlwZSA9IGNobmxfbWdyX29iai0+ZHdfdHlwZTsKKwkJCQkvKiB0b3RhbCAjIG9mIGNobmxzICovCisJCQkJbWdyX2luZm8tPm1heF9jaGFubmVscyA9CisJCQkJICAgIGNobmxfbWdyX29iai0+bWF4X2NoYW5uZWxzOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVDSFJORzsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9pZGxlID09PT09PT09CisgKiAgICAgIElkbGVzIGEgcGFydGljdWxhciBjaGFubmVsLgorICovCitpbnQgYnJpZGdlX2NobmxfaWRsZShzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqLCB1MzIgdGltZW91dCwKKwkJCSAgICBib29sIGZsdXNoX2RhdGEpCit7CisJczggY2hubF9tb2RlOworCXN0cnVjdCBjaG5sX21nciAqY2hubF9tZ3Jfb2JqOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUoY2hubF9vYmopOworCisJY2hubF9tb2RlID0gY2hubF9vYmotPmNobmxfbW9kZTsKKwljaG5sX21ncl9vYmogPSBjaG5sX29iai0+Y2hubF9tZ3Jfb2JqOworCisJaWYgKENITkxfSVNfT1VUUFVUKGNobmxfbW9kZSkgJiYgIWZsdXNoX2RhdGEpIHsKKwkJLyogV2FpdCBmb3IgSU8gY29tcGxldGlvbnMsIHVwIHRvIHRoZSBzcGVjaWZpZWQgdGltZW91dDogKi8KKwkJc3RhdHVzID0gYnJpZGdlX2NobmxfZmx1c2hfaW8oY2hubF9vYmosIHRpbWVvdXQpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGJyaWRnZV9jaG5sX2NhbmNlbF9pbyhjaG5sX29iaik7CisKKwkJLyogUmVzZXQgdGhlIGJ5dGUgY291bnQgYW5kIHB1dCBjaGFubmVsIGJhY2sgaW4gcmVhZHkgc3RhdGUuICovCisJCWNobmxfb2JqLT5ieXRlc19tb3ZlZCA9IDA7CisJCWNobmxfb2JqLT5kd19zdGF0ZSAmPSB+Q0hOTF9TVEFURUNBTkNFTDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX29wZW4gPT09PT09PT0KKyAqICAgICAgT3BlbiBhIG5ldyBoYWxmLWR1cGxleCBjaGFubmVsIHRvIHRoZSBEU1AgYm9hcmQuCisgKi8KK2ludCBicmlkZ2VfY2hubF9vcGVuKHN0cnVjdCBjaG5sX29iamVjdCAqKmNobmwsCisJCQkgICAgc3RydWN0IGNobmxfbWdyICpoY2hubF9tZ3IsIHM4IGNobmxfbW9kZSwKKwkJCSAgICB1MzIgY2hfaWQsIGNvbnN0IHN0cnVjdCBjaG5sX2F0dHIgKnBhdHRycykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmNobmxfbWdyX29iaiA9IGhjaG5sX21ncjsKKwlzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sID0gTlVMTDsKKwlzdHJ1Y3Qgc3luY19vYmplY3QgKnN5bmNfZXZlbnQgPSBOVUxMOworCS8qIEVuc3VyZSBEQkMgcmVxdWlyZW1lbnRzOiAqLworCURCQ19SRVFVSVJFKGNobmwgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUocGF0dHJzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGhjaG5sX21nciAhPSBOVUxMKTsKKwkqY2hubCA9IE5VTEw7CisJLyogVmFsaWRhdGUgQXJnczogKi8KKwlpZiAocGF0dHJzLT51aW9fcmVxcyA9PSAwKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKCFoY2hubF9tZ3IpIHsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY2hfaWQgIT0gQ0hOTF9QSUNLRlJFRSkgeworCQkJCWlmIChjaF9pZCA+PSBjaG5sX21ncl9vYmotPm1heF9jaGFubmVscykKKwkJCQkJc3RhdHVzID0gLUVDSFJORzsKKwkJCQllbHNlIGlmIChjaG5sX21ncl9vYmotPmFwX2NoYW5uZWxbY2hfaWRdICE9CisJCQkJCSBOVUxMKQorCQkJCQlzdGF0dXMgPSAtRUFMUkVBRFk7CisJCQl9IGVsc2UgeworCQkJCS8qIENoZWNrIGZvciBmcmVlIGNoYW5uZWwgKi8KKwkJCQlzdGF0dXMgPQorCQkJCSAgICBzZWFyY2hfZnJlZV9jaGFubmVsKGNobmxfbWdyX29iaiwgJmNoX2lkKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJREJDX0FTU0VSVChjaF9pZCA8IGNobmxfbWdyX29iai0+bWF4X2NoYW5uZWxzKTsKKwkvKiBDcmVhdGUgY2hhbm5lbCBvYmplY3Q6ICovCisJcGNobmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hubF9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaG5sKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCS8qIFByb3RlY3QgcXVldWVzIGZyb20gaW9fZHBjOiAqLworCXBjaG5sLT5kd19zdGF0ZSA9IENITkxfU1RBVEVDQU5DRUw7CisJLyogQWxsb2NhdGUgaW5pdGlhbCBJT1IgYW5kIElPQyBxdWV1ZXM6ICovCisJcGNobmwtPmZyZWVfcGFja2V0c19saXN0ID0gY3JlYXRlX2NoaXJwX2xpc3QocGF0dHJzLT51aW9fcmVxcyk7CisJcGNobmwtPnBpb19yZXF1ZXN0cyA9IGNyZWF0ZV9jaGlycF9saXN0KDApOworCXBjaG5sLT5waW9fY29tcGxldGlvbnMgPSBjcmVhdGVfY2hpcnBfbGlzdCgwKTsKKwlwY2hubC0+Y2hubF9wYWNrZXRzID0gcGF0dHJzLT51aW9fcmVxczsKKwlwY2hubC0+Y2lvX2NzID0gMDsKKwlwY2hubC0+Y2lvX3JlcXMgPSAwOworCXN5bmNfZXZlbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3luY19vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3luY19ldmVudCkKKwkJc3luY19pbml0X2V2ZW50KHN5bmNfZXZlbnQpOworCWVsc2UKKwkJc3RhdHVzID0gLUVOT01FTTsKKworCWlmICghc3RhdHVzKSB7CisJCXBjaG5sLT5udGZ5X29iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBudGZ5X29iamVjdCksCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChwY2hubC0+bnRmeV9vYmopCisJCQludGZ5X2luaXQocGNobmwtPm50Znlfb2JqKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisKKwlpZiAoIXN0YXR1cykgeworCQlpZiAocGNobmwtPnBpb19jb21wbGV0aW9ucyAmJiBwY2hubC0+cGlvX3JlcXVlc3RzICYmCisJCSAgICBwY2hubC0+ZnJlZV9wYWNrZXRzX2xpc3QpIHsKKwkJCS8qIEluaXRpYWxpemUgQ0hOTCBvYmplY3QgZmllbGRzOiAqLworCQkJcGNobmwtPmNobmxfbWdyX29iaiA9IGNobmxfbWdyX29iajsKKwkJCXBjaG5sLT5jaG5sX2lkID0gY2hfaWQ7CisJCQlwY2hubC0+Y2hubF9tb2RlID0gY2hubF9tb2RlOworCQkJcGNobmwtPnVzZXJfZXZlbnQgPSBzeW5jX2V2ZW50OworCQkJcGNobmwtPnN5bmNfZXZlbnQgPSBzeW5jX2V2ZW50OworCQkJLyogR2V0IHRoZSBwcm9jZXNzIGhhbmRsZSAqLworCQkJcGNobmwtPnByb2Nlc3MgPSBjdXJyZW50LT50Z2lkOworCQkJcGNobmwtPnBjYl9hcmcgPSAwOworCQkJcGNobmwtPmJ5dGVzX21vdmVkID0gMDsKKwkJCS8qIERlZmF1bHQgdG8gcHJvYy1jb3B5ICovCisJCQlwY2hubC0+Y2hubF90eXBlID0gQ0hOTF9QQ1BZOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfQorCX0KKworCWlmIChzdGF0dXMpIHsKKwkJLyogRnJlZSBtZW1vcnkgKi8KKwkJaWYgKHBjaG5sLT5waW9fY29tcGxldGlvbnMpIHsKKwkJCWZyZWVfY2hpcnBfbGlzdChwY2hubC0+cGlvX2NvbXBsZXRpb25zKTsKKwkJCXBjaG5sLT5waW9fY29tcGxldGlvbnMgPSBOVUxMOworCQkJcGNobmwtPmNpb19jcyA9IDA7CisJCX0KKwkJaWYgKHBjaG5sLT5waW9fcmVxdWVzdHMpIHsKKwkJCWZyZWVfY2hpcnBfbGlzdChwY2hubC0+cGlvX3JlcXVlc3RzKTsKKwkJCXBjaG5sLT5waW9fcmVxdWVzdHMgPSBOVUxMOworCQl9CisJCWlmIChwY2hubC0+ZnJlZV9wYWNrZXRzX2xpc3QpIHsKKwkJCWZyZWVfY2hpcnBfbGlzdChwY2hubC0+ZnJlZV9wYWNrZXRzX2xpc3QpOworCQkJcGNobmwtPmZyZWVfcGFja2V0c19saXN0ID0gTlVMTDsKKwkJfQorCQlrZnJlZShzeW5jX2V2ZW50KTsKKwkJc3luY19ldmVudCA9IE5VTEw7CisKKwkJaWYgKHBjaG5sLT5udGZ5X29iaikgeworCQkJbnRmeV9kZWxldGUocGNobmwtPm50Znlfb2JqKTsKKwkJCWtmcmVlKHBjaG5sLT5udGZ5X29iaik7CisJCQlwY2hubC0+bnRmeV9vYmogPSBOVUxMOworCQl9CisJCWtmcmVlKHBjaG5sKTsKKwl9IGVsc2UgeworCQkvKiBJbnNlcnQgY2hhbm5lbCBvYmplY3QgaW4gY2hhbm5lbCBtYW5hZ2VyOiAqLworCQljaG5sX21ncl9vYmotPmFwX2NoYW5uZWxbcGNobmwtPmNobmxfaWRdID0gcGNobmw7CisJCXNwaW5fbG9ja19iaCgmY2hubF9tZ3Jfb2JqLT5jaG5sX21ncl9sb2NrKTsKKwkJY2hubF9tZ3Jfb2JqLT5vcGVuX2NoYW5uZWxzKys7CisJCXNwaW5fdW5sb2NrX2JoKCZjaG5sX21ncl9vYmotPmNobmxfbWdyX2xvY2spOworCQkvKiBSZXR1cm4gcmVzdWx0Li4uICovCisJCXBjaG5sLT5kd19zdGF0ZSA9IENITkxfU1RBVEVSRUFEWTsKKwkJKmNobmwgPSBwY2hubDsKKwl9CitmdW5jX2VuZDoKKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmIHBjaG5sKSB8fCAoKmNobmwgPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2NobmxfcmVnaXN0ZXJfbm90aWZ5ID09PT09PT09CisgKiAgICAgIFJlZ2lzdGVycyBmb3IgZXZlbnRzIG9uIGEgcGFydGljdWxhciBjaGFubmVsLgorICovCitpbnQgYnJpZGdlX2NobmxfcmVnaXN0ZXJfbm90aWZ5KHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosCisJCQkJICAgIHUzMiBldmVudF9tYXNrLCB1MzIgbm90aWZ5X3R5cGUsCisJCQkJICAgIHN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uICpobm90aWZpY2F0aW9uKQoreworCWludCBzdGF0dXMgPSAwOworCisJREJDX0FTU0VSVCghKGV2ZW50X21hc2sgJiB+KERTUF9TVFJFQU1ET05FIHwgRFNQX1NUUkVBTUlPQ09NUExFVElPTikpKTsKKworCWlmIChldmVudF9tYXNrKQorCQlzdGF0dXMgPSBudGZ5X3JlZ2lzdGVyKGNobmxfb2JqLT5udGZ5X29iaiwgaG5vdGlmaWNhdGlvbiwKKwkJCQkJCWV2ZW50X21hc2ssIG5vdGlmeV90eXBlKTsKKwllbHNlCisJCXN0YXR1cyA9IG50ZnlfdW5yZWdpc3RlcihjaG5sX29iai0+bnRmeV9vYmosIGhub3RpZmljYXRpb24pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjcmVhdGVfY2hpcnBfbGlzdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgYSBxdWV1ZSBvZiBjaGFubmVsIEkvTyBSZXF1ZXN0L0NvbXBsZXRpb24gcGFja2V0cy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBjaGlycHM6ICAgICBOdW1iZXIgb2YgQ2hpcnBzIHRvIGFsbG9jYXRlLgorICogIFJldHVybnM6CisgKiAgICAgIFBvaW50ZXIgdG8gcXVldWUgb2YgSVJQcywgb3IgTlVMTC4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitzdGF0aWMgc3RydWN0IGxzdF9saXN0ICpjcmVhdGVfY2hpcnBfbGlzdCh1MzIgY2hpcnBzKQoreworCXN0cnVjdCBsc3RfbGlzdCAqY2hpcnBfbGlzdDsKKwlzdHJ1Y3QgY2hubF9pcnAgKmNobmxfcGFja2V0X29iajsKKwl1MzIgaTsKKworCWNoaXJwX2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHN0X2xpc3QpLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlycF9saXN0KSB7CisJCUlOSVRfTElTVF9IRUFEKCZjaGlycF9saXN0LT5oZWFkKTsKKwkJLyogTWFrZSBOIGNoaXJwcyBhbmQgcGxhY2Ugb24gcXVldWUuICovCisJCWZvciAoaSA9IDA7IChpIDwgY2hpcnBzKQorCQkgICAgICYmICgoY2hubF9wYWNrZXRfb2JqID0gbWFrZV9uZXdfY2hpcnAoKSkgIT0gTlVMTCk7IGkrKykgeworCQkJbHN0X3B1dF90YWlsKGNoaXJwX2xpc3QsCisJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKWNobmxfcGFja2V0X29iaik7CisJCX0KKworCQkvKiBJZiB3ZSBjb3VsZG4ndCBhbGxvY2F0ZSBhbGwgY2hpcnBzLCBmcmVlIHRob3NlIGFsbG9jYXRlZDogKi8KKwkJaWYgKGkgIT0gY2hpcnBzKSB7CisJCQlmcmVlX2NoaXJwX2xpc3QoY2hpcnBfbGlzdCk7CisJCQljaGlycF9saXN0ID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBjaGlycF9saXN0OworfQorCisvKgorICogID09PT09PT09IGZyZWVfY2hpcnBfbGlzdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWUgdGhlIHF1ZXVlIG9mIENoaXJwcy4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9jaGlycF9saXN0KHN0cnVjdCBsc3RfbGlzdCAqY2hpcnBfbGlzdCkKK3sKKwlEQkNfUkVRVUlSRShjaGlycF9saXN0ICE9IE5VTEwpOworCisJd2hpbGUgKCFMU1RfSVNfRU1QVFkoY2hpcnBfbGlzdCkpCisJCWtmcmVlKGxzdF9nZXRfaGVhZChjaGlycF9saXN0KSk7CisKKwlrZnJlZShjaGlycF9saXN0KTsKK30KKworLyoKKyAqICA9PT09PT09PSBtYWtlX25ld19jaGlycCA9PT09PT09PQorICogICAgICBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBhIG5ldyBjaGFubmVsIElSUC4KKyAqLworc3RhdGljIHN0cnVjdCBjaG5sX2lycCAqbWFrZV9uZXdfY2hpcnAodm9pZCkKK3sKKwlzdHJ1Y3QgY2hubF9pcnAgKmNobmxfcGFja2V0X29iajsKKworCWNobmxfcGFja2V0X29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaG5sX2lycCksIEdGUF9LRVJORUwpOworCWlmIChjaG5sX3BhY2tldF9vYmogIT0gTlVMTCkgeworCQkvKiBsc3RfaW5pdF9lbGVtIG9ubHkgcmVzZXRzIHRoZSBsaXN0J3MgbWVtYmVyIHZhbHVlcy4gKi8KKwkJbHN0X2luaXRfZWxlbSgmY2hubF9wYWNrZXRfb2JqLT5saW5rKTsKKwl9CisKKwlyZXR1cm4gY2hubF9wYWNrZXRfb2JqOworfQorCisvKgorICogID09PT09PT09IHNlYXJjaF9mcmVlX2NoYW5uZWwgPT09PT09PT0KKyAqICAgICAgU2VhcmNoIGZvciBhIGZyZWUgY2hhbm5lbCBzbG90IGluIHRoZSBhcnJheSBvZiBjaGFubmVsIHBvaW50ZXJzLgorICovCitzdGF0aWMgaW50IHNlYXJjaF9mcmVlX2NoYW5uZWwoc3RydWN0IGNobmxfbWdyICpjaG5sX21ncl9vYmosCisJCQkJICAgICAgdTMyICpjaG5sKQoreworCWludCBzdGF0dXMgPSAtRU5PU1I7CisJdTMyIGk7CisKKwlEQkNfUkVRVUlSRShjaG5sX21ncl9vYmopOworCisJZm9yIChpID0gMDsgaSA8IGNobmxfbWdyX29iai0+bWF4X2NoYW5uZWxzOyBpKyspIHsKKwkJaWYgKGNobmxfbWdyX29iai0+YXBfY2hhbm5lbFtpXSA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAwOworCQkJKmNobmwgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvZHNwLWNsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9kc3AtY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFhMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvZHNwLWNsb2NrLmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBjbGsuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDbG9jayBhbmQgVGltZXIgc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKyNpbmNsdWRlIDxwbGF0L2RtdGltZXIuaD4KKyNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSAiX3Rpb21hcC5oIgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2xrLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZpbmVzLCBEYXRhIFN0cnVjdHVyZXMsIFR5cGVkZWZzICovCisKKyNkZWZpbmUgT01BUF9TU0lfT0ZGU0VUCQkJMHg1ODAwMAorI2RlZmluZSBPTUFQX1NTSV9TSVpFCQkJMHgxMDAwCisjZGVmaW5lIE9NQVBfU1NJX1NZU0NPTkZJR19PRkZTRVQJMHgxMAorCisjZGVmaW5lIFNTSV9BVVRPSURMRQkJCSgxIDw8IDApCisjZGVmaW5lIFNTSV9TSURMRV9TTUFSVElETEUJCSgyIDw8IDMpCisjZGVmaW5lIFNTSV9NSURMRV9OT0lETEUJCSgxIDw8IDEyKQorCisvKiBDbGsgdHlwZXMgcmVxdWVzdGVkIGJ5IHRoZSBkc3AgKi8KKyNkZWZpbmUgSVZBMl9DTEsJMAorI2RlZmluZSBHUFRfQ0xLCQkxCisjZGVmaW5lIFdEVF9DTEsJCTIKKyNkZWZpbmUgTUNCU1BfQ0xLCTMKKyNkZWZpbmUgU1NJX0NMSwkJNAorCisvKiBCcmlkZ2UgR1BUIGlkICgxIC0gNCksIERNIFRpbWVyIGlkICg1IC0gOCkgKi8KKyNkZWZpbmUgRE1UX0lEKGlkKSAoKGlkKSArIDQpCisKKy8qIEJyaWRnZSBNQ0JTUCBpZCAoNiAtIDEwKSwgT01BUCBNY2JzcCBpZCAoMCAtIDQpICovCisjZGVmaW5lIE1DQlNQX0lEKGlkKSAoKGlkKSAtIDYpCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXJbNF07CisKK3N0cnVjdCBjbGsgKml2YTJfY2xrOworCitzdHJ1Y3QgZHNwX3NzaSB7CisJc3RydWN0IGNsayAqc3N0X2ZjazsKKwlzdHJ1Y3QgY2xrICpzc3JfZmNrOworCXN0cnVjdCBjbGsgKmljazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHNwX3NzaSBzc2k7CisKK3N0YXRpYyB1MzIgZHNwX2Nsb2NrczsKKworc3RhdGljIGlubGluZSB1MzIgaXNfZHNwX2Nsa19hY3RpdmUodTMyIGNsaywgdTggaWQpCit7CisJcmV0dXJuIGNsayAmICgxIDw8IGlkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9kc3BfY2xrX2FjdGl2ZSh1MzIgKmNsaywgdTggaWQpCit7CisJKmNsayB8PSAoMSA8PCBpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZHNwX2Nsa19pbmFjdGl2ZSh1MzIgKmNsaywgdTggaWQpCit7CisJKmNsayAmPSB+KDEgPDwgaWQpOworfQorCitzdGF0aWMgczggZ2V0X2Nsa190eXBlKHU4IGlkKQoreworCXM4IHR5cGU7CisKKwlpZiAoaWQgPT0gRFNQX0NMS19JVkEyKQorCQl0eXBlID0gSVZBMl9DTEs7CisJZWxzZSBpZiAoaWQgPD0gRFNQX0NMS19HUFQ4KQorCQl0eXBlID0gR1BUX0NMSzsKKwllbHNlIGlmIChpZCA9PSBEU1BfQ0xLX1dEVDMpCisJCXR5cGUgPSBXRFRfQ0xLOworCWVsc2UgaWYgKGlkIDw9IERTUF9DTEtfTUNCU1A1KQorCQl0eXBlID0gTUNCU1BfQ0xLOworCWVsc2UgaWYgKGlkID09IERTUF9DTEtfU1NJKQorCQl0eXBlID0gU1NJX0NMSzsKKwllbHNlCisJCXR5cGUgPSAtMTsKKworCXJldHVybiB0eXBlOworfQorCisvKgorICogID09PT09PT09IGRzcF9jbGtfZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENsZWFudXAgQ0xLIG1vZHVsZS4KKyAqLwordm9pZCBkc3BfY2xrX2V4aXQodm9pZCkKK3sKKwlkc3BfY2xvY2tfZGlzYWJsZV9hbGwoZHNwX2Nsb2Nrcyk7CisKKwljbGtfcHV0KGl2YTJfY2xrKTsKKwljbGtfcHV0KHNzaS5zc3RfZmNrKTsKKwljbGtfcHV0KHNzaS5zc3JfZmNrKTsKKwljbGtfcHV0KHNzaS5pY2spOworfQorCisvKgorICogID09PT09PT09IGRzcF9jbGtfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgQ0xLIG1vZHVsZS4KKyAqLwordm9pZCBkc3BfY2xrX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkc3BicmlkZ2VfZGV2aWNlOworCisJZHNwYnJpZGdlX2RldmljZS5kZXYuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlOworCisJaXZhMl9jbGsgPSBjbGtfZ2V0KCZkc3BicmlkZ2VfZGV2aWNlLmRldiwgIml2YTJfY2siKTsKKwlpZiAoSVNfRVJSKGl2YTJfY2xrKSkKKwkJZGV2X2VycihicmlkZ2UsICJmYWlsZWQgdG8gZ2V0IGl2YTIgY2xvY2sgJXBcbiIsIGl2YTJfY2xrKTsKKworCXNzaS5zc3RfZmNrID0gY2xrX2dldCgmZHNwYnJpZGdlX2RldmljZS5kZXYsICJzc2lfc3N0X2ZjayIpOworCXNzaS5zc3JfZmNrID0gY2xrX2dldCgmZHNwYnJpZGdlX2RldmljZS5kZXYsICJzc2lfc3NyX2ZjayIpOworCXNzaS5pY2sgPSBjbGtfZ2V0KCZkc3BicmlkZ2VfZGV2aWNlLmRldiwgInNzaV9pY2siKTsKKworCWlmIChJU19FUlIoc3NpLnNzdF9mY2spIHx8IElTX0VSUihzc2kuc3NyX2ZjaykgfHwgSVNfRVJSKHNzaS5pY2spKQorCQlkZXZfZXJyKGJyaWRnZSwgImZhaWxlZCB0byBnZXQgc3NpOiBzc3QgJXAsIHNzciAlcCwgaWNrICVwXG4iLAorCQkJCQlzc2kuc3N0X2Zjaywgc3NpLnNzcl9mY2ssIHNzaS5pY2spOworfQorCisjaWZkZWYgQ09ORklHX09NQVBfTUNCU1AKK3N0YXRpYyB2b2lkIG1jYnNwX2Nsa19wcmVwYXJlKGJvb2wgZmxhZywgdTggaWQpCit7CisJc3RydWN0IGNmZ19ob3N0cmVzICpyZXNvdXJjZXM7CisJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqZWN0ID0gTlVMTDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpicmlkZ2VfY29udGV4dCA9IE5VTEw7CisJdTMyIHZhbDsKKworCWhkZXZfb2JqZWN0ID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopZHJ2X2dldF9maXJzdF9kZXZfb2JqZWN0KCk7CisJaWYgKCFoZGV2X29iamVjdCkKKwkJcmV0dXJuOworCisJZGV2X2dldF9icmlkZ2VfY29udGV4dChoZGV2X29iamVjdCwgJmJyaWRnZV9jb250ZXh0KTsKKwlpZiAoIWJyaWRnZV9jb250ZXh0KQorCQlyZXR1cm47CisKKwlyZXNvdXJjZXMgPSBicmlkZ2VfY29udGV4dC0+cmVzb3VyY2VzOworCWlmICghcmVzb3VyY2VzKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZykgeworCQlpZiAoaWQgPT0gRFNQX0NMS19NQ0JTUDEpIHsKKwkJCS8qIHNldCBNQ0JTUDFfQ0xLUywgb24gTWNCU1AxIE9OICovCisJCQl2YWwgPSBfX3Jhd19yZWFkbChyZXNvdXJjZXMtPmR3X3N5c19jdHJsX2Jhc2UgKyAweDI3NCk7CisJCQl2YWwgfD0gMSA8PCAyOworCQkJX19yYXdfd3JpdGVsKHZhbCwgcmVzb3VyY2VzLT5kd19zeXNfY3RybF9iYXNlICsgMHgyNzQpOworCQl9IGVsc2UgaWYgKGlkID09IERTUF9DTEtfTUNCU1AyKSB7CisJCQkvKiBzZXQgTUNCU1AyX0NMS1MsIG9uIE1jQlNQMiBPTiAqLworCQkJdmFsID0gX19yYXdfcmVhZGwocmVzb3VyY2VzLT5kd19zeXNfY3RybF9iYXNlICsgMHgyNzQpOworCQkJdmFsIHw9IDEgPDwgNjsKKwkJCV9fcmF3X3dyaXRlbCh2YWwsIHJlc291cmNlcy0+ZHdfc3lzX2N0cmxfYmFzZSArIDB4Mjc0KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpZCA9PSBEU1BfQ0xLX01DQlNQMSkgeworCQkJLyogY2xlYXIgTUNCU1AxX0NMS1MsIG9uIE1jQlNQMSBPRkYgKi8KKwkJCXZhbCA9IF9fcmF3X3JlYWRsKHJlc291cmNlcy0+ZHdfc3lzX2N0cmxfYmFzZSArIDB4Mjc0KTsKKwkJCXZhbCAmPSB+KDEgPDwgMik7CisJCQlfX3Jhd193cml0ZWwodmFsLCByZXNvdXJjZXMtPmR3X3N5c19jdHJsX2Jhc2UgKyAweDI3NCk7CisJCX0gZWxzZSBpZiAoaWQgPT0gRFNQX0NMS19NQ0JTUDIpIHsKKwkJCS8qIGNsZWFyIE1DQlNQMl9DTEtTLCBvbiBNY0JTUDIgT0ZGICovCisJCQl2YWwgPSBfX3Jhd19yZWFkbChyZXNvdXJjZXMtPmR3X3N5c19jdHJsX2Jhc2UgKyAweDI3NCk7CisJCQl2YWwgJj0gfigxIDw8IDYpOworCQkJX19yYXdfd3JpdGVsKHZhbCwgcmVzb3VyY2VzLT5kd19zeXNfY3RybF9iYXNlICsgMHgyNzQpOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qKgorICogZHNwX2dwdF93YWl0X292ZXJmbG93IC0gc2V0IGdwdCBvdmVyZmxvdyBhbmQgd2FpdCBmb3IgZml4ZWQgdGltZW91dAorICogQGNsa19pZDogICAgICBHUCBUaW1lciBjbG9jayBpZC4KKyAqIEBsb2FkOiAgICAgICAgT3ZlcmZsb3cgdmFsdWUuCisgKgorICogU2V0cyBhbiBvdmVyZmxvdyBpbnRlcnJ1cHQgZm9yIHRoZSBkZXNpcmVkIEdQVCB3YWl0aW5nIGZvciBhIHRpbWVvdXQKKyAqIG9mIDUgbXNlY3MgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gb2NjdXIuCisgKi8KK3ZvaWQgZHNwX2dwdF93YWl0X292ZXJmbG93KHNob3J0IGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBsb2FkKQoreworCXN0cnVjdCBvbWFwX2RtX3RpbWVyICpncHQgPSB0aW1lcltjbGtfaWQgLSAxXTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpZiAoIWdwdCkKKwkJcmV0dXJuOworCisJLyogRW5hYmxlIG92ZXJmbG93IGludGVycnVwdCAqLworCW9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoZ3B0LCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CisKKwkvKgorCSAqIFNldCBjb3VudGVyIHZhbHVlIHRvIG92ZXJmbG93IGNvdW50ZXIgYWZ0ZXIKKwkgKiBvbmUgdGljayBhbmQgc3RhcnQgdGltZXIuCisJICovCisJb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChncHQsIDAsIGxvYWQpOworCisJLyogV2FpdCA4MHVzIGZvciB0aW1lciB0byBvdmVyZmxvdyAqLworCXVkZWxheSg4MCk7CisKKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1KTsKKwkvKiBDaGVjayBpbnRlcnJ1cHQgc3RhdHVzIGFuZCB3YWl0IGZvciBpbnRlcnJ1cHQgKi8KKwl3aGlsZSAoIShvbWFwX2RtX3RpbWVyX3JlYWRfc3RhdHVzKGdwdCkgJiBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVykpIHsKKwkJaWYgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh0aW1lb3V0KSkgeworCQkJcHJfZXJyKCIlczogR1BUaW1lciBpbnRlcnJ1cHQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqICA9PT09PT09PSBkc3BfY2xrX2VuYWJsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVuYWJsZSBDbG9jayAuCisgKgorICovCitpbnQgZHNwX2Nsa19lbmFibGUoZW51bSBkc3BfY2xrX2lkIGNsa19pZCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChpc19kc3BfY2xrX2FjdGl2ZShkc3BfY2xvY2tzLCBjbGtfaWQpKSB7CisJCWRldl9lcnIoYnJpZGdlLCAiV0FSTjogY2xvY2sgaWQgJWQgYWxyZWFkeSBlbmFibGVkXG4iLCBjbGtfaWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGdldF9jbGtfdHlwZShjbGtfaWQpKSB7CisJY2FzZSBJVkEyX0NMSzoKKwkJY2xrX2VuYWJsZShpdmEyX2Nsayk7CisJCWJyZWFrOworCWNhc2UgR1BUX0NMSzoKKwkJdGltZXJbY2xrX2lkIC0gMV0gPQorCQkJCW9tYXBfZG1fdGltZXJfcmVxdWVzdF9zcGVjaWZpYyhETVRfSUQoY2xrX2lkKSk7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19PTUFQX01DQlNQCisJY2FzZSBNQ0JTUF9DTEs6CisJCW1jYnNwX2Nsa19wcmVwYXJlKHRydWUsIGNsa19pZCk7CisJCW9tYXBfbWNic3Bfc2V0X2lvX3R5cGUoTUNCU1BfSUQoY2xrX2lkKSwgT01BUF9NQ0JTUF9QT0xMX0lPKTsKKwkJb21hcF9tY2JzcF9yZXF1ZXN0KE1DQlNQX0lEKGNsa19pZCkpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgV0RUX0NMSzoKKwkJZGV2X2VycihicmlkZ2UsICJFUlJPUjogRFNQIHJlcXVlc3RlZCB0byBlbmFibGUgV0RUMyBjbGtcbiIpOworCQlicmVhazsKKwljYXNlIFNTSV9DTEs6CisJCWNsa19lbmFibGUoc3NpLnNzdF9mY2spOworCQljbGtfZW5hYmxlKHNzaS5zc3JfZmNrKTsKKwkJY2xrX2VuYWJsZShzc2kuaWNrKTsKKworCQkvKgorCQkgKiBUaGUgU1NJIG1vZHVsZSBuZWVkIHRvIGNvbmZpZ3VyZWQgbm90IHRvIGhhdmUgdGhlIEZvcmNlZAorCQkgKiBpZGxlIGZvciBtYXN0ZXIgaW50ZXJmYWNlLiBJZiBpdCBpcyBzZXQgdG8gZm9yY2VkIGlkbGUsCisJCSAqIHRoZSBTU0kgbW9kdWxlIGlzIHRyYW5zaXRpb25pbmcgdG8gc3RhbmRieSB0aGVyZWJ5IGNhdXNpbmcKKwkJICogdGhlIGNsaWVudCBpbiB0aGUgRFNQIGhhbmcgd2FpdGluZyBmb3IgdGhlIFNTSSBtb2R1bGUgdG8KKwkJICogYmUgYWN0aXZlIGFmdGVyIGVuYWJsaW5nIHRoZSBjbG9ja3MKKwkJICovCisJCXNzaV9jbGtfcHJlcGFyZSh0cnVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihicmlkZ2UsICJJbnZhbGlkIGNsb2NrIGlkIGZvciBlbmFibGVcbiIpOworCQlzdGF0dXMgPSAtRVBFUk07CisJfQorCisJaWYgKCFzdGF0dXMpCisJCXNldF9kc3BfY2xrX2FjdGl2ZSgmZHNwX2Nsb2NrcywgY2xrX2lkKTsKKworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogZHNwX2Nsb2NrX2VuYWJsZV9hbGwgLSBFbmFibGUgY2xvY2tzIHVzZWQgYnkgdGhlIERTUAorICogQGRldl9jb250ZXh0CQlEcml2ZXIncyBkZXZpY2UgY29udGV4dCBzdHJ1Y3VyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBhbGwgdGhlIHBlcmlwaGVyYWwgY2xvY2tzIHRoYXQgd2VyZSByZXF1ZXN0ZWQgYnkgRFNQLgorICovCit1MzIgZHNwX2Nsb2NrX2VuYWJsZV9hbGwodTMyIGRzcF9wZXJfY2xvY2tzKQoreworCXUzMiBjbGtfaWQ7CisJdTMyIHN0YXR1cyA9IC1FUEVSTTsKKworCWZvciAoY2xrX2lkID0gMDsgY2xrX2lkIDwgRFNQX0NMS19OT1RfREVGSU5FRDsgY2xrX2lkKyspIHsKKwkJaWYgKGlzX2RzcF9jbGtfYWN0aXZlKGRzcF9wZXJfY2xvY2tzLCBjbGtfaWQpKQorCQkJc3RhdHVzID0gZHNwX2Nsa19lbmFibGUoY2xrX2lkKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRzcF9jbGtfZGlzYWJsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2FibGUgdGhlIGNsb2NrLgorICoKKyAqLworaW50IGRzcF9jbGtfZGlzYWJsZShlbnVtIGRzcF9jbGtfaWQgY2xrX2lkKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCFpc19kc3BfY2xrX2FjdGl2ZShkc3BfY2xvY2tzLCBjbGtfaWQpKSB7CisJCWRldl9lcnIoYnJpZGdlLCAiRVJSOiBjbG9jayBpZCAlZCBhbHJlYWR5IGRpc2FibGVkXG4iLCBjbGtfaWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGdldF9jbGtfdHlwZShjbGtfaWQpKSB7CisJY2FzZSBJVkEyX0NMSzoKKwkJY2xrX2Rpc2FibGUoaXZhMl9jbGspOworCQlicmVhazsKKwljYXNlIEdQVF9DTEs6CisJCW9tYXBfZG1fdGltZXJfZnJlZSh0aW1lcltjbGtfaWQgLSAxXSk7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19PTUFQX01DQlNQCisJY2FzZSBNQ0JTUF9DTEs6CisJCW1jYnNwX2Nsa19wcmVwYXJlKGZhbHNlLCBjbGtfaWQpOworCQlvbWFwX21jYnNwX2ZyZWUoTUNCU1BfSUQoY2xrX2lkKSk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBXRFRfQ0xLOgorCQlkZXZfZXJyKGJyaWRnZSwgIkVSUk9SOiBEU1AgcmVxdWVzdGVkIHRvIGRpc2FibGUgV0RUMyBjbGtcbiIpOworCQlicmVhazsKKwljYXNlIFNTSV9DTEs6CisJCXNzaV9jbGtfcHJlcGFyZShmYWxzZSk7CisJCXNzaV9jbGtfcHJlcGFyZShmYWxzZSk7CisJCWNsa19kaXNhYmxlKHNzaS5zc3RfZmNrKTsKKwkJY2xrX2Rpc2FibGUoc3NpLnNzcl9mY2spOworCQljbGtfZGlzYWJsZShzc2kuaWNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihicmlkZ2UsICJJbnZhbGlkIGNsb2NrIGlkIGZvciBkaXNhYmxlXG4iKTsKKwkJc3RhdHVzID0gLUVQRVJNOworCX0KKworCWlmICghc3RhdHVzKQorCQlzZXRfZHNwX2Nsa19pbmFjdGl2ZSgmZHNwX2Nsb2NrcywgY2xrX2lkKTsKKworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogZHNwX2Nsb2NrX2Rpc2FibGVfYWxsIC0gRGlzYWJsZSBhbGwgYWN0aXZlIGNsb2NrcworICogQGRldl9jb250ZXh0CQlEcml2ZXIncyBkZXZpY2UgY29udGV4dCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIGFsbCB0aGUgcGVyaXBoZXJhbCBjbG9ja3MgdGhhdCB3ZXJlIGVuYWJsZWQgYnkgRFNQLgorICogSXQgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgd2hlbiBEU1AgaXMgZW50ZXJpbmcgaGliZXJuYXRpb24gb3Igd2hlbiBEU1AKKyAqIGlzIGluIGVycm9yIHN0YXRlLgorICovCit1MzIgZHNwX2Nsb2NrX2Rpc2FibGVfYWxsKHUzMiBkc3BfcGVyX2Nsb2NrcykKK3sKKwl1MzIgY2xrX2lkOworCXUzMiBzdGF0dXMgPSAtRVBFUk07CisKKwlmb3IgKGNsa19pZCA9IDA7IGNsa19pZCA8IERTUF9DTEtfTk9UX0RFRklORUQ7IGNsa19pZCsrKSB7CisJCWlmIChpc19kc3BfY2xrX2FjdGl2ZShkc3BfcGVyX2Nsb2NrcywgY2xrX2lkKSkKKwkJCXN0YXR1cyA9IGRzcF9jbGtfZGlzYWJsZShjbGtfaWQpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3UzMiBkc3BfY2xrX2dldF9pdmEyX3JhdGUodm9pZCkKK3sKKwl1MzIgY2xrX3NwZWVkX2toejsKKworCWNsa19zcGVlZF9raHogPSBjbGtfZ2V0X3JhdGUoaXZhMl9jbGspOworCWNsa19zcGVlZF9raHogLz0gMTAwMDsKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBjbGsgc3BlZWQgS2h6ID0gJWRcbiIsIF9fZnVuY19fLCBjbGtfc3BlZWRfa2h6KTsKKworCXJldHVybiBjbGtfc3BlZWRfa2h6OworfQorCit2b2lkIHNzaV9jbGtfcHJlcGFyZShib29sIEZMQUcpCit7CisJdm9pZCBfX2lvbWVtICpzc2lfYmFzZTsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwlzc2lfYmFzZSA9IGlvcmVtYXAoTDRfMzRYWF9CQVNFICsgT01BUF9TU0lfT0ZGU0VULCBPTUFQX1NTSV9TSVpFKTsKKwlpZiAoIXNzaV9iYXNlKSB7CisJCXByX2VycigiJXM6IGVycm9yLCBTU0kgbm90IGNvbmZpZ3VyZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChGTEFHKSB7CisJCS8qIFNldCBBdXRvaWRsZSwgU0lETEVNb2RlIHRvIHNtYXJ0IGlkbGUsIGFuZCBNSURMRW1vZGUgdG8KKwkJICogbm8gaWRsZQorCQkgKi8KKwkJdmFsdWUgPSBTU0lfQVVUT0lETEUgfCBTU0lfU0lETEVfU01BUlRJRExFIHwgU1NJX01JRExFX05PSURMRTsKKwl9IGVsc2UgeworCQkvKiBTZXQgQXV0b2lkbGUsIFNJRExFTW9kZSB0byBmb3JjZWQgaWRsZSwgYW5kIE1JRExFbW9kZSB0bworCQkgKiBmb3JjZWQgaWRsZQorCQkgKi8KKwkJdmFsdWUgPSBTU0lfQVVUT0lETEU7CisJfQorCisJX19yYXdfd3JpdGVsKHZhbHVlLCBzc2lfYmFzZSArIE9NQVBfU1NJX1NZU0NPTkZJR19PRkZTRVQpOworCWlvdW5tYXAoc3NpX2Jhc2UpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9pb19zbS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM2NjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYwpAQCAtMCwwICsxLDIzMzMgQEAKKy8qCisgKiBpb19zbS5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIElPIGRpc3BhdGNoZXIgZm9yIGEgc2hhcmVkIG1lbW9yeSBjaGFubmVsIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKgorICogQ2hhbm5lbCBJbnZhcmlhbnQ6CisgKiBUaGVyZSBpcyBhbiBpbXBvcnRhbnQgaW52YXJpYW50IGNvbmRpdGlvbiB3aGljaCBtdXN0IGJlIG1haW50YWluZWQgcGVyCisgKiBjaGFubmVsIG91dHNpZGUgb2YgYnJpZGdlX2NobmxfZ2V0X2lvYygpIGFuZCBJT19EaXNwYXRjaCgpLCB2aW9sYXRpb24gb2YKKyAqIHdoaWNoIG1heSBjYXVzZSB0aW1lb3V0cyBhbmQvb3IgZmFpbHVyZSBvZiB0aGUgc3luY193YWl0X29uX2V2ZW50CisgKiBmdW5jdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEhvc3QgT1MgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiBTZXJ2aWNlcyBMYXllciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmcuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbnRmeS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qIEhhcmR3YXJlIEFic3RyYWN0aW9uIExheWVyICovCisjaW5jbHVkZSA8aHdfZGVmcy5oPgorI2luY2x1ZGUgPGh3X21tdS5oPgorCisvKiBCcmlkZ2UgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlaC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3Bpby5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3Bpb2N0bC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS93ZHQuaD4KKyNpbmNsdWRlIDxfdGlvbWFwLmg+CisjaW5jbHVkZSA8dGlvbWFwX2lvLmg+CisjaW5jbHVkZSA8X3Rpb21hcF9wd3IuaD4KKworLyogUGxhdGZvcm0gTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jb2QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKworLyogT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Jtc19zaC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9tZ3IuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisjaW5jbHVkZSAiX2NtbS5oIgorI2luY2x1ZGUgIm1vZHVsZV9saXN0LmgiCisKKy8qIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaW9fc20uaD4KKyNpbmNsdWRlICJfbXNnX3NtLmgiCisKKy8qIERlZmluZXMsIERhdGEgU3RydWN0dXJlcywgVHlwZWRlZnMgKi8KKyNkZWZpbmUgT1VUUFVUTk9UUkVBRFkgIDB4ZmZmZgorI2RlZmluZSBOT1RFTkFCTEVEICAgICAgMHhmZmZmCS8qIENoYW5uZWwocykgbm90IGVuYWJsZWQgKi8KKworI2RlZmluZSBFWFRFTkQgICAgICAiX0VYVF9FTkQiCisKKyNkZWZpbmUgU1dBUF9XT1JEKHgpICAgICAoeCkKKyNkZWZpbmUgVUxfUEFHRV9BTElHTl9TSVpFIDB4MTAwMDAJLyogUGFnZSBBbGlnbiBTaXplICovCisKKyNkZWZpbmUgTUFYX1BNX1JFUVMgMzIKKworI2RlZmluZSBNTVVfRkFVTFRfSEVBRDEgMHhhNWE1YTVhNQorI2RlZmluZSBNTVVfRkFVTFRfSEVBRDIgMHg5Njk2OTY5NgorI2RlZmluZSBQT0xMX01BWCAxMDAwCisjZGVmaW5lIE1BWF9NTVVfREJHQlVGRiAxMDI0MAorCisvKiBJTyBNYW5hZ2VyOiBvbmx5IG9uZSBjcmVhdGVkIHBlciBib2FyZCAqLworc3RydWN0IGlvX21nciB7CisJLyogVGhlc2UgZm91ciBmaWVsZHMgbXVzdCBiZSB0aGUgZmlyc3QgZmllbGRzIGluIGEgaW9fbWdyXyBzdHJ1Y3QgKi8KKwkvKiBCcmlkZ2UgZGV2aWNlIGNvbnRleHQgKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpoYnJpZGdlX2NvbnRleHQ7CisJLyogRnVuY3Rpb24gaW50ZXJmYWNlIHRvIEJyaWRnZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmo7CS8qIERldmljZSB0aGlzIGJvYXJkIHJlcHJlc2VudHMgKi8KKworCS8qIFRoZXNlIGZpZWxkcyBpbml0aWFsaXplZCBpbiBicmlkZ2VfaW9fY3JlYXRlKCkgKi8KKwlzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncjsKKwlzdHJ1Y3Qgc2htICpzaGFyZWRfbWVtOwkvKiBTaGFyZWQgTWVtb3J5IGNvbnRyb2wgKi8KKwl1OCAqaW5wdXQ7CQkvKiBBZGRyZXNzIG9mIGlucHV0IGNoYW5uZWwgKi8KKwl1OCAqb3V0cHV0OwkJLyogQWRkcmVzcyBvZiBvdXRwdXQgY2hhbm5lbCAqLworCXN0cnVjdCBtc2dfbWdyICpobXNnX21ncjsJLyogTWVzc2FnZSBtYW5hZ2VyICovCisJLyogTXNnIGNvbnRyb2wgZm9yIGZyb20gRFNQIG1lc3NhZ2VzICovCisJc3RydWN0IG1zZ19jdHJsICptc2dfaW5wdXRfY3RybDsKKwkvKiBNc2cgY29udHJvbCBmb3IgdG8gRFNQIG1lc3NhZ2VzICovCisJc3RydWN0IG1zZ19jdHJsICptc2dfb3V0cHV0X2N0cmw7CisJdTggKm1zZ19pbnB1dDsJCS8qIEFkZHJlc3Mgb2YgaW5wdXQgbWVzc2FnZXMgKi8KKwl1OCAqbXNnX291dHB1dDsJCS8qIEFkZHJlc3Mgb2Ygb3V0cHV0IG1lc3NhZ2VzICovCisJdTMyIHVzbV9idWZfc2l6ZTsJLyogU2l6ZSBvZiBhIHNoYXJlZCBtZW1vcnkgSS9PIGNoYW5uZWwgKi8KKwlib29sIHNoYXJlZF9pcnE7CS8qIElzIHRoaXMgSVJRIHNoYXJlZD8gKi8KKwl1MzIgd29yZF9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyBvZiBEU1Agd29yZCAqLworCXUxNiBpbnRyX3ZhbDsJCS8qIEludGVycnVwdCB2YWx1ZSAqLworCS8qIFByaXZhdGUgZXh0bmQgcHJvYyBpbmZvOyBtbXUgc2V0dXAgKi8KKwlzdHJ1Y3QgbWdyX3Byb2Nlc3NvcmV4dGluZm8gZXh0X3Byb2NfaW5mbzsKKwlzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3I7CS8qIFNoYXJlZCBNZW0gTW5nciAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBpb193b3JrcTsJLyogd29ya3F1ZXVlICovCisjaWYgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9ERUJVRykKKwl1MzIgdWxfdHJhY2VfYnVmZmVyX2JlZ2luOwkvKiBUcmFjZSBtZXNzYWdlIHN0YXJ0IGFkZHJlc3MgKi8KKwl1MzIgdWxfdHJhY2VfYnVmZmVyX2VuZDsJLyogVHJhY2UgbWVzc2FnZSBlbmQgYWRkcmVzcyAqLworCXUzMiB1bF90cmFjZV9idWZmZXJfY3VycmVudDsJLyogVHJhY2UgbWVzc2FnZSBjdXJyZW50IGFkZHJlc3MgKi8KKwl1MzIgdWxfZ3BwX3JlYWRfcG9pbnRlcjsJLyogR1BQIFJlYWQgcG9pbnRlciB0byBUcmFjZSBidWZmZXIgKi8KKwl1OCAqcG1zZzsKKwl1MzIgdWxfZ3BwX3ZhOworCXUzMiB1bF9kc3BfdmE7CisjZW5kaWYKKwkvKiBJTyBEcGMgKi8KKwl1MzIgZHBjX3JlcTsJCS8qIE51bWJlciBvZiByZXF1ZXN0ZWQgRFBDJ3MuICovCisJdTMyIGRwY19zY2hlZDsJCS8qIE51bWJlciBvZiBleGVjdXRlZCBEUEMncy4gKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZHBjX3Rhc2tsZXQ7CisJc3BpbmxvY2tfdCBkcGNfbG9jazsKKworfTsKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaW9fZGlzcGF0Y2hfcG0oc3RydWN0IGlvX21nciAqcGlvX21ncik7CitzdGF0aWMgdm9pZCBub3RpZnlfY2hubF9jb21wbGV0ZShzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sLAorCQkJCSBzdHJ1Y3QgY2hubF9pcnAgKmNobmxfcGFja2V0X29iaik7CitzdGF0aWMgdm9pZCBpbnB1dF9jaG5sKHN0cnVjdCBpb19tZ3IgKnBpb19tZ3IsIHN0cnVjdCBjaG5sX29iamVjdCAqcGNobmwsCisJCQl1OCBpb19tb2RlKTsKK3N0YXRpYyB2b2lkIG91dHB1dF9jaG5sKHN0cnVjdCBpb19tZ3IgKnBpb19tZ3IsIHN0cnVjdCBjaG5sX29iamVjdCAqcGNobmwsCisJCQl1OCBpb19tb2RlKTsKK3N0YXRpYyB2b2lkIGlucHV0X21zZyhzdHJ1Y3QgaW9fbWdyICpwaW9fbWdyLCBzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3IpOworc3RhdGljIHZvaWQgb3V0cHV0X21zZyhzdHJ1Y3QgaW9fbWdyICpwaW9fbWdyLCBzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3IpOworc3RhdGljIHUzMiBmaW5kX3JlYWR5X291dHB1dChzdHJ1Y3QgY2hubF9tZ3IgKmNobmxfbWdyX29iaiwKKwkJCSAgICAgc3RydWN0IGNobmxfb2JqZWN0ICpwY2hubCwgdTMyIG1hc2spOworCisvKiBCdXMgQWRkciAoY2FjaGVkIGtlcm5lbCkgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJfc2htX3NlZ3Moc3RydWN0IGlvX21nciAqaGlvX21nciwKKwkJCQkgICAgc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWFuLAorCQkJCSAgICB1MzIgZHdfZ3BwX2Jhc2VfcGEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NobmxfZnJlZShzdHJ1Y3Qgc2htICpzbSwgdTMyIGNobmwpCit7CisJc20tPmhvc3RfZnJlZV9tYXNrICY9IH4oMSA8PCBjaG5sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jaG5sX2J1c3koc3RydWN0IHNobSAqc20sIHUzMiBjaG5sKQoreworCXNtLT5ob3N0X2ZyZWVfbWFzayB8PSAxIDw8IGNobmw7Cit9CisKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfaW9fY3JlYXRlID09PT09PT09CisgKiAgICAgIENyZWF0ZSBhbiBJTyBtYW5hZ2VyIG9iamVjdC4KKyAqLworaW50IGJyaWRnZV9pb19jcmVhdGUoc3RydWN0IGlvX21nciAqKmlvX21hbiwKKwkJCSAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkgICAgY29uc3Qgc3RydWN0IGlvX2F0dHJzICptZ3JfYXR0cnRzKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBpb19tZ3IgKnBpb19tZ3IgPSBOVUxMOworCXN0cnVjdCBzaG0gKnNoYXJlZF9tZW0gPSBOVUxMOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmhicmlkZ2VfY29udGV4dCA9IE5VTEw7CisJc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmo7CisJc3RydWN0IGNobmxfbWdyICpoY2hubF9tZ3I7CisJdTggZGV2X3R5cGU7CisKKwkvKiBDaGVjayByZXF1aXJlbWVudHMgKi8KKwlpZiAoIWlvX21hbiB8fCAhbWdyX2F0dHJ0cyB8fCBtZ3JfYXR0cnRzLT53b3JkX3NpemUgPT0gMCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlkZXZfZ2V0X2NobmxfbWdyKGhkZXZfb2JqLCAmaGNobmxfbWdyKTsKKwlpZiAoIWhjaG5sX21nciB8fCBoY2hubF9tZ3ItPmhpb19tZ3IpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJLyoKKwkgKiBNZXNzYWdlIG1hbmFnZXIgd2lsbCBiZSBjcmVhdGVkIHdoZW4gYSBmaWxlIGlzIGxvYWRlZCwgc2luY2UKKwkgKiBzaXplIG9mIG1lc3NhZ2UgYnVmZmVyIGluIHNoYXJlZCBtZW1vcnkgaXMgY29uZmlndXJhYmxlIGluCisJICogdGhlIGJhc2UgaW1hZ2UuCisJICovCisJZGV2X2dldF9icmlkZ2VfY29udGV4dChoZGV2X29iaiwgJmhicmlkZ2VfY29udGV4dCk7CisJaWYgKCFoYnJpZGdlX2NvbnRleHQpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJZGV2X2dldF9kZXZfdHlwZShoZGV2X29iaiwgJmRldl90eXBlKTsKKwkvKgorCSAqIERTUCBzaGFyZWQgbWVtb3J5IGFyZWEgd2lsbCBnZXQgc2V0IHByb3Blcmx5IHdoZW4KKwkgKiBhIHByb2dyYW0gaXMgbG9hZGVkLiBUaGV5IGFyZSB1bmtub3duIHVudGlsIGEgQ09GRiBmaWxlIGlzCisJICogbG9hZGVkLiBJIGNob3NlIHRoZSB2YWx1ZSAtMSBiZWNhdXNlIGl0IHdhcyBsZXNzIGxpa2VseSB0byBiZQorCSAqIGEgdmFsaWQgYWRkcmVzcyB0aGFuIDAuCisJICovCisJc2hhcmVkX21lbSA9IChzdHJ1Y3Qgc2htICopLTE7CisKKwkvKiBBbGxvY2F0ZSBJTyBtYW5hZ2VyIG9iamVjdCAqLworCXBpb19tZ3IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9fbWdyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBpb19tZ3IgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCS8qIEluaXRpYWxpemUgY2hubF9tZ3Igb2JqZWN0ICovCisjaWYgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9ERUJVRykKKwlwaW9fbWdyLT5wbXNnID0gTlVMTDsKKyNlbmRpZgorCXBpb19tZ3ItPmhjaG5sX21nciA9IGhjaG5sX21ncjsKKwlwaW9fbWdyLT53b3JkX3NpemUgPSBtZ3JfYXR0cnRzLT53b3JkX3NpemU7CisJcGlvX21nci0+c2hhcmVkX21lbSA9IHNoYXJlZF9tZW07CisKKwlpZiAoZGV2X3R5cGUgPT0gRFNQX1VOSVQpIHsKKwkJLyogQ3JlYXRlIGFuIElPIERQQyAqLworCQl0YXNrbGV0X2luaXQoJnBpb19tZ3ItPmRwY190YXNrbGV0LCBpb19kcGMsICh1MzIpIHBpb19tZ3IpOworCisJCS8qIEluaXRpYWxpemUgRFBDIGNvdW50ZXJzICovCisJCXBpb19tZ3ItPmRwY19yZXEgPSAwOworCQlwaW9fbWdyLT5kcGNfc2NoZWQgPSAwOworCisJCXNwaW5fbG9ja19pbml0KCZwaW9fbWdyLT5kcGNfbG9jayk7CisKKwkJc3RhdHVzID0gZGV2X2dldF9kZXZfbm9kZShoZGV2X29iaiwgJmRldl9ub2RlX29iaik7CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJcGlvX21nci0+aGJyaWRnZV9jb250ZXh0ID0gaGJyaWRnZV9jb250ZXh0OworCQlwaW9fbWdyLT5zaGFyZWRfaXJxID0gbWdyX2F0dHJ0cy0+aXJxX3NoYXJlZDsKKwkJaWYgKGRzcF93ZHRfaW5pdCgpKQorCQkJc3RhdHVzID0gLUVQRVJNOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FSU87CisJfQorZnVuY19lbmQ6CisJaWYgKHN0YXR1cykgeworCQkvKiBDbGVhbnVwICovCisJCWJyaWRnZV9pb19kZXN0cm95KHBpb19tZ3IpOworCQlpZiAoaW9fbWFuKQorCQkJKmlvX21hbiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogUmV0dXJuIElPIG1hbmFnZXIgb2JqZWN0IHRvIGNhbGxlci4uLiAqLworCQloY2hubF9tZ3ItPmhpb19tZ3IgPSBwaW9fbWdyOworCQkqaW9fbWFuID0gcGlvX21ncjsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfaW9fZGVzdHJveSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2FibGUgaW50ZXJydXB0cywgZGVzdHJveSB0aGUgSU8gbWFuYWdlci4KKyAqLworaW50IGJyaWRnZV9pb19kZXN0cm95KHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaWYgKGhpb19tZ3IpIHsKKwkJLyogRnJlZSBJTyBEUEMgb2JqZWN0ICovCisJCXRhc2tsZXRfa2lsbCgmaGlvX21nci0+ZHBjX3Rhc2tsZXQpOworCisjaWYgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9ERUJVRykKKwkJa2ZyZWUoaGlvX21nci0+cG1zZyk7CisjZW5kaWYKKwkJZHNwX3dkdF9leGl0KCk7CisJCS8qIEZyZWUgdGhpcyBJTyBtYW5hZ2VyIG9iamVjdCAqLworCQlrZnJlZShoaW9fbWdyKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2lvX29uX2xvYWRlZCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENhbGxlZCB3aGVuIGEgbmV3IHByb2dyYW0gaXMgbG9hZGVkIHRvIGdldCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcgorICogICAgICBwYXJhbWV0ZXJzIGZyb20gQ09GRiBmaWxlLiB1bFNoYXJlZEJ1ZmZlckJhc2UgYW5kIHVsU2hhcmVkQnVmZmVyTGltaXQKKyAqICAgICAgYXJlIGluIERTUCBhZGRyZXNzIHVuaXRzLgorICovCitpbnQgYnJpZGdlX2lvX29uX2xvYWRlZChzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyKQoreworCXN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21hbjsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncjsKKwlzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3I7CisJdTMyIHVsX3NobV9iYXNlOworCXUzMiB1bF9zaG1fYmFzZV9vZmZzZXQ7CisJdTMyIHVsX3NobV9saW1pdDsKKwl1MzIgdWxfc2htX2xlbmd0aCA9IC0xOworCXUzMiB1bF9tZW1fbGVuZ3RoID0gLTE7CisJdTMyIHVsX21zZ19iYXNlOworCXUzMiB1bF9tc2dfbGltaXQ7CisJdTMyIHVsX21zZ19sZW5ndGggPSAtMTsKKwl1MzIgdWxfZXh0X2VuZDsKKwl1MzIgdWxfZ3BwX3BhID0gMDsKKwl1MzIgdWxfZ3BwX3ZhID0gMDsKKwl1MzIgdWxfZHNwX3ZhID0gMDsKKwl1MzIgdWxfc2VnX3NpemUgPSAwOworCXUzMiB1bF9wYWRfc2l6ZSA9IDA7CisJdTMyIGk7CisJaW50IHN0YXR1cyA9IDA7CisJdTggbnVtX3Byb2NzID0gMDsKKwlzMzIgbmR4ID0gMDsKKwkvKiBEU1AgTU1VIHNldHVwIHRhYmxlICovCisJc3RydWN0IGJyaWRnZV9pb2N0bF9leHRwcm9jIGFlX3Byb2NbQlJESU9DVExfTlVNT0ZNTVVUTEJdOworCXN0cnVjdCBjZmdfaG9zdHJlcyAqaG9zdF9yZXM7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqcGJyaWRnZV9jb250ZXh0OworCXUzMiBtYXBfYXR0cnM7CisJdTMyIHNobTBfZW5kOworCXUzMiB1bF9keW5fZXh0X2Jhc2U7CisJdTMyIHVsX3NlZzFfc2l6ZSA9IDA7CisJdTMyIHBhX2N1cnIgPSAwOworCXUzMiB2YV9jdXJyID0gMDsKKwl1MzIgZ3BwX3ZhX2N1cnIgPSAwOworCXUzMiBudW1fYnl0ZXMgPSAwOworCXUzMiBhbGxfYml0cyA9IDA7CisJdTMyIHBhZ2Vfc2l6ZVtdID0geyBIV19QQUdFX1NJWkUxNk1CLCBIV19QQUdFX1NJWkUxTUIsCisJCUhXX1BBR0VfU0laRTY0S0IsIEhXX1BBR0VfU0laRTRLQgorCX07CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGhpb19tZ3ItPmhkZXZfb2JqLCAmcGJyaWRnZV9jb250ZXh0KTsKKwlpZiAoIXBicmlkZ2VfY29udGV4dCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCWhvc3RfcmVzID0gcGJyaWRnZV9jb250ZXh0LT5yZXNvdXJjZXM7CisJaWYgKCFob3N0X3JlcykgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlzdGF0dXMgPSBkZXZfZ2V0X2NvZF9tZ3IoaGlvX21nci0+aGRldl9vYmosICZjb2RfbWFuKTsKKwlpZiAoIWNvZF9tYW4pIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaGNobmxfbWdyID0gaGlvX21nci0+aGNobmxfbWdyOworCS8qIFRoZSBtZXNzYWdlIG1hbmFnZXIgaXMgZGVzdHJveWVkIHdoZW4gdGhlIGJvYXJkIGlzIHN0b3BwZWQuICovCisJZGV2X2dldF9tc2dfbWdyKGhpb19tZ3ItPmhkZXZfb2JqLCAmaGlvX21nci0+aG1zZ19tZ3IpOworCWhtc2dfbWdyID0gaGlvX21nci0+aG1zZ19tZ3I7CisJaWYgKCFoY2hubF9tZ3IgfHwgIWhtc2dfbWdyKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCWlmIChoaW9fbWdyLT5zaGFyZWRfbWVtKQorCQloaW9fbWdyLT5zaGFyZWRfbWVtID0gTlVMTDsKKworCS8qIEdldCBzdGFydCBhbmQgbGVuZ3RoIG9mIGNoYW5uZWwgcGFydCBvZiBzaGFyZWQgbWVtb3J5ICovCisJc3RhdHVzID0gY29kX2dldF9zeW1fdmFsdWUoY29kX21hbiwgQ0hOTF9TSEFSRURfQlVGRkVSX0JBU0VfU1lNLAorCQkJCSAgICZ1bF9zaG1fYmFzZSk7CisJaWYgKHN0YXR1cykgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlzdGF0dXMgPSBjb2RfZ2V0X3N5bV92YWx1ZShjb2RfbWFuLCBDSE5MX1NIQVJFRF9CVUZGRVJfTElNSVRfU1lNLAorCQkJCSAgICZ1bF9zaG1fbGltaXQpOworCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaWYgKHVsX3NobV9saW1pdCA8PSB1bF9zaG1fYmFzZSkgeworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkvKiBHZXQgdG90YWwgbGVuZ3RoIGluIGJ5dGVzICovCisJdWxfc2htX2xlbmd0aCA9ICh1bF9zaG1fbGltaXQgLSB1bF9zaG1fYmFzZSArIDEpICogaGlvX21nci0+d29yZF9zaXplOworCS8qIENhbGN1bGF0ZSBzaXplIG9mIGEgUFJPQ0NPUFkgc2hhcmVkIG1lbW9yeSByZWdpb24gKi8KKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiAocHJvYylwcm9jY29weSBzaG1tZW0gc2l6ZTogMHgleCBieXRlc1xuIiwKKwkJX19mdW5jX18sICh1bF9zaG1fbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBzaG0pKSk7CisKKwkvKiBHZXQgc3RhcnQgYW5kIGxlbmd0aCBvZiBtZXNzYWdlIHBhcnQgb2Ygc2hhcmVkIG1lbW9yeSAqLworCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIE1TR19TSEFSRURfQlVGRkVSX0JBU0VfU1lNLAorCQkJCQkgICAmdWxfbXNnX2Jhc2UpOworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIE1TR19TSEFSRURfQlVGRkVSX0xJTUlUX1NZTSwKKwkJCQkJICAgJnVsX21zZ19saW1pdCk7CisJCWlmICghc3RhdHVzKSB7CisJCQlpZiAodWxfbXNnX2xpbWl0IDw9IHVsX21zZ19iYXNlKSB7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBMZW5ndGggKGJ5dGVzKSBvZiBtZXNzYWdpbmcgcGFydCBvZiBzaGFyZWQKKwkJCQkgKiBtZW1vcnkuCisJCQkJICovCisJCQkJdWxfbXNnX2xlbmd0aCA9CisJCQkJICAgICh1bF9tc2dfbGltaXQgLSB1bF9tc2dfYmFzZSArCisJCQkJICAgICAxKSAqIGhpb19tZ3ItPndvcmRfc2l6ZTsKKwkJCQkvKgorCQkJCSAqIFRvdGFsIGxlbmd0aCAoYnl0ZXMpIG9mIHNoYXJlZCBtZW1vcnk6CisJCQkJICogY2hubCArIG1zZy4KKwkJCQkgKi8KKwkJCQl1bF9tZW1fbGVuZ3RoID0gdWxfc2htX2xlbmd0aCArIHVsX21zZ19sZW5ndGg7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisJaWYgKCFzdGF0dXMpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9CQUNLVFJBQ0UpIHx8IGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0RFQlVHKQorCQlzdGF0dXMgPQorCQkgICAgY29kX2dldF9zeW1fdmFsdWUoY29kX21hbiwgRFNQX1RSQUNFU0VDX0VORCwgJnNobTBfZW5kKTsKKyNlbHNlCisJCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIFNITTBfU0hBUkVEX0VORF9TWU0sCisJCQkJCSAgICZzaG0wX2VuZCk7CisjZW5kaWYKKwkJaWYgKHN0YXR1cykKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9CisJCSAgICBjb2RfZ2V0X3N5bV92YWx1ZShjb2RfbWFuLCBEWU5FWFRCQVNFLCAmdWxfZHluX2V4dF9iYXNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIEVYVEVORCwgJnVsX2V4dF9lbmQpOworCQlpZiAoc3RhdHVzKQorCQkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogR2V0IG1lbW9yeSByZXNlcnZlZCBpbiBob3N0IHJlc291cmNlcyAqLworCQkodm9pZCltZ3JfZW51bV9wcm9jZXNzb3JfaW5mbygwLCAoc3RydWN0IGRzcF9wcm9jZXNzb3JpbmZvICopCisJCQkJCSAgICAgICZoaW9fbWdyLT5leHRfcHJvY19pbmZvLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgIG1ncl9wcm9jZXNzb3JleHRpbmZvKSwKKwkJCQkJICAgICAgJm51bV9wcm9jcyk7CisKKwkJLyogVGhlIGZpcnN0IE1NVSBUTEIgZW50cnkoVExCXzApIGluIERDRCBpcyBTaG1CYXNlLiAqLworCQluZHggPSAwOworCQl1bF9ncHBfcGEgPSBob3N0X3Jlcy0+ZHdfbWVtX3BoeXNbMV07CisJCXVsX2dwcF92YSA9IGhvc3RfcmVzLT5kd19tZW1fYmFzZVsxXTsKKwkJLyogVGhpcyBpcyB0aGUgdmlydHVhbCB1bmNhY2hlZCBpb3JlbWFwcGVkIGFkZHJlc3MhISEgKi8KKwkJLyogV2h5IGNhbid0IHdlIGRpcmVjdGx5IHRha2UgdGhlIERTUFZBIGZyb20gdGhlIHN5bWJvbHM/ICovCisJCXVsX2RzcF92YSA9IGhpb19tZ3ItPmV4dF9wcm9jX2luZm8udHlfdGxiWzBdLnVsX2RzcF92aXJ0OworCQl1bF9zZWdfc2l6ZSA9IChzaG0wX2VuZCAtIHVsX2RzcF92YSkgKiBoaW9fbWdyLT53b3JkX3NpemU7CisJCXVsX3NlZzFfc2l6ZSA9CisJCSAgICAodWxfZXh0X2VuZCAtIHVsX2R5bl9leHRfYmFzZSkgKiBoaW9fbWdyLT53b3JkX3NpemU7CisJCS8qIDRLIGFsaWduICovCisJCXVsX3NlZzFfc2l6ZSA9ICh1bF9zZWcxX3NpemUgKyAweEZGRikgJiAofjB4RkZGVUwpOworCQkvKiA2NEsgYWxpZ24gKi8KKwkJdWxfc2VnX3NpemUgPSAodWxfc2VnX3NpemUgKyAweEZGRkYpICYgKH4weEZGRkZVTCk7CisJCXVsX3BhZF9zaXplID0gVUxfUEFHRV9BTElHTl9TSVpFIC0gKCh1bF9ncHBfcGEgKyB1bF9zZWcxX3NpemUpICUKKwkJCQkJCSAgICBVTF9QQUdFX0FMSUdOX1NJWkUpOworCQlpZiAodWxfcGFkX3NpemUgPT0gVUxfUEFHRV9BTElHTl9TSVpFKQorCQkJdWxfcGFkX3NpemUgPSAweDA7CisKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogdWxfZ3BwX3BhICV4LCB1bF9ncHBfdmEgJXgsIHVsX2RzcF92YSAleCwgIgorCQkJInNobTBfZW5kICV4LCB1bF9keW5fZXh0X2Jhc2UgJXgsIHVsX2V4dF9lbmQgJXgsICIKKwkJCSJ1bF9zZWdfc2l6ZSAleCB1bF9zZWcxX3NpemUgJXggXG4iLCBfX2Z1bmNfXywKKwkJCXVsX2dwcF9wYSwgdWxfZ3BwX3ZhLCB1bF9kc3BfdmEsIHNobTBfZW5kLAorCQkJdWxfZHluX2V4dF9iYXNlLCB1bF9leHRfZW5kLCB1bF9zZWdfc2l6ZSwgdWxfc2VnMV9zaXplKTsKKworCQlpZiAoKHVsX3NlZ19zaXplICsgdWxfc2VnMV9zaXplICsgdWxfcGFkX3NpemUpID4KKwkJICAgIGhvc3RfcmVzLT5kd19tZW1fbGVuZ3RoWzFdKSB7CisJCQlwcl9lcnIoIiVzOiBzaG0gRXJyb3IsIHJlc2VydmVkIDB4JXggcmVxdWlyZWQgMHgleFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgaG9zdF9yZXMtPmR3X21lbV9sZW5ndGhbMV0sCisJCQkgICAgICAgdWxfc2VnX3NpemUgKyB1bF9zZWcxX3NpemUgKyB1bF9wYWRfc2l6ZSk7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQl9CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlwYV9jdXJyID0gdWxfZ3BwX3BhOworCXZhX2N1cnIgPSB1bF9keW5fZXh0X2Jhc2UgKiBoaW9fbWdyLT53b3JkX3NpemU7CisJZ3BwX3ZhX2N1cnIgPSB1bF9ncHBfdmE7CisJbnVtX2J5dGVzID0gdWxfc2VnMV9zaXplOworCisJLyoKKwkgKiBUcnkgdG8gZml0IGludG8gVExCIGVudHJpZXMuIElmIG5vdCBwb3NzaWJsZSwgcHVzaCB0aGVtIHRvIHBhZ2UKKwkgKiB0YWJsZXMuIEl0IGlzIHF1aXRlIHBvc3NpYmxlIHRoYXQgaWYgc2VjdGlvbnMgYXJlIG5vdCBvbgorCSAqIGJpZ2dlciBwYWdlIGJvdW5kYXJ5LCB3ZSBtYXkgZW5kIHVwIG1ha2luZyBzZXZlcmFsIHNtYWxsIHBhZ2VzLgorCSAqIFNvLCBwdXNoIHRoZW0gb250byBwYWdlIHRhYmxlcywgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKwkgKi8KKwltYXBfYXR0cnMgPSAweDAwMDAwMDAwOworCW1hcF9hdHRycyA9IERTUF9NQVBMSVRUTEVFTkRJQU47CisJbWFwX2F0dHJzIHw9IERTUF9NQVBQSFlTSUNBTEFERFI7CisJbWFwX2F0dHJzIHw9IERTUF9NQVBFTEVNU0laRTMyOworCW1hcF9hdHRycyB8PSBEU1BfTUFQRE9OT1RMT0NLOworCisJd2hpbGUgKG51bV9ieXRlcykgeworCQkvKgorCQkgKiBUbyBmaW5kIHRoZSBtYXguIHBhZ2Ugc2l6ZSB3aXRoIHdoaWNoIGJvdGggUEEgJiBWQSBhcmUKKwkJICogYWxpZ25lZC4KKwkJICovCisJCWFsbF9iaXRzID0gcGFfY3VyciB8IHZhX2N1cnI7CisJCWRldl9kYmcoYnJpZGdlLCAiYWxsX2JpdHMgJXgsIHBhX2N1cnIgJXgsIHZhX2N1cnIgJXgsICIKKwkJCSJudW1fYnl0ZXMgJXhcbiIsIGFsbF9iaXRzLCBwYV9jdXJyLCB2YV9jdXJyLAorCQkJbnVtX2J5dGVzKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKChudW1fYnl0ZXMgPj0gcGFnZV9zaXplW2ldKSAmJiAoKGFsbF9iaXRzICYKKwkJCQkJCQkgICAgIChwYWdlX3NpemVbaV0gLQorCQkJCQkJCSAgICAgIDEpKSA9PSAwKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGhpb19tZ3ItPmludGZfZnhucy0+CisJCQkJICAgIHBmbl9icmRfbWVtX21hcChoaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsCisJCQkJCQkgICAgcGFfY3VyciwgdmFfY3VyciwKKwkJCQkJCSAgICBwYWdlX3NpemVbaV0sIG1hcF9hdHRycywKKwkJCQkJCSAgICBOVUxMKTsKKwkJCQlpZiAoc3RhdHVzKQorCQkJCQlnb3RvIGZ1bmNfZW5kOworCQkJCXBhX2N1cnIgKz0gcGFnZV9zaXplW2ldOworCQkJCXZhX2N1cnIgKz0gcGFnZV9zaXplW2ldOworCQkJCWdwcF92YV9jdXJyICs9IHBhZ2Vfc2l6ZVtpXTsKKwkJCQludW1fYnl0ZXMgLT0gcGFnZV9zaXplW2ldOworCQkJCS8qCisJCQkJICogRG9uJ3QgdHJ5IHNtYWxsZXIgc2l6ZXMuIEhvcGVmdWxseSB3ZSBoYXZlCisJCQkJICogcmVhY2hlZCBhbiBhZGRyZXNzIGFsaWduZWQgdG8gYSBiaWdnZXIgcGFnZQorCQkJCSAqIHNpemUuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcGFfY3VyciArPSB1bF9wYWRfc2l6ZTsKKwl2YV9jdXJyICs9IHVsX3BhZF9zaXplOworCWdwcF92YV9jdXJyICs9IHVsX3BhZF9zaXplOworCisJLyogQ29uZmlndXJlIHRoZSBUTEIgZW50cmllcyBmb3IgdGhlIG5leHQgY2FjaGVhYmxlIHNlZ21lbnQgKi8KKwludW1fYnl0ZXMgPSB1bF9zZWdfc2l6ZTsKKwl2YV9jdXJyID0gdWxfZHNwX3ZhICogaGlvX21nci0+d29yZF9zaXplOworCXdoaWxlIChudW1fYnl0ZXMpIHsKKwkJLyoKKwkJICogVG8gZmluZCB0aGUgbWF4LiBwYWdlIHNpemUgd2l0aCB3aGljaCBib3RoIFBBICYgVkEgYXJlCisJCSAqIGFsaWduZWQuCisJCSAqLworCQlhbGxfYml0cyA9IHBhX2N1cnIgfCB2YV9jdXJyOworCQlkZXZfZGJnKGJyaWRnZSwgImFsbF9iaXRzIGZvciBTZWcxICV4LCBwYV9jdXJyICV4LCAiCisJCQkidmFfY3VyciAleCwgbnVtX2J5dGVzICV4XG4iLCBhbGxfYml0cywgcGFfY3VyciwKKwkJCXZhX2N1cnIsIG51bV9ieXRlcyk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCWlmICghKG51bV9ieXRlcyA+PSBwYWdlX3NpemVbaV0pIHx8CisJCQkgICAgISgoYWxsX2JpdHMgJiAocGFnZV9zaXplW2ldIC0gMSkpID09IDApKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5keCA8IE1BWF9MT0NLX1RMQl9FTlRSSUVTKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdyaXR0ZW4gdG8KKwkJCQkgKiBEU1AgTU1VLgorCQkJCSAqLworCQkJCWFlX3Byb2NbbmR4XS51bF9ncHBfcGEgPSBwYV9jdXJyOworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgdmlydHVhbCB1bmNhY2hlZCBpb3JlbWFwcGVkCisJCQkJICogYWRkcmVzcyEhIQorCQkJCSAqLworCQkJCWFlX3Byb2NbbmR4XS51bF9ncHBfdmEgPSBncHBfdmFfY3VycjsKKwkJCQlhZV9wcm9jW25keF0udWxfZHNwX3ZhID0KKwkJCQkgICAgdmFfY3VyciAvIGhpb19tZ3ItPndvcmRfc2l6ZTsKKwkJCQlhZV9wcm9jW25keF0udWxfc2l6ZSA9IHBhZ2Vfc2l6ZVtpXTsKKwkJCQlhZV9wcm9jW25keF0uZW5kaWFuaXNtID0gSFdfTElUVExFX0VORElBTjsKKwkJCQlhZV9wcm9jW25keF0uZWxlbV9zaXplID0gSFdfRUxFTV9TSVpFMTZCSVQ7CisJCQkJYWVfcHJvY1tuZHhdLm1peGVkX21vZGUgPSBIV19NTVVfQ1BVRVM7CisJCQkJZGV2X2RiZyhicmlkZ2UsICJzaG0gTU1VIFRMQiBlbnRyeSBQQSAleCIKKwkJCQkJIiBWQSAleCBEU1BfVkEgJXggU2l6ZSAleFxuIiwKKwkJCQkJYWVfcHJvY1tuZHhdLnVsX2dwcF9wYSwKKwkJCQkJYWVfcHJvY1tuZHhdLnVsX2dwcF92YSwKKwkJCQkJYWVfcHJvY1tuZHhdLnVsX2RzcF92YSAqCisJCQkJCWhpb19tZ3ItPndvcmRfc2l6ZSwgcGFnZV9zaXplW2ldKTsKKwkJCQluZHgrKzsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgaGlvX21nci0+aW50Zl9meG5zLT4KKwkJCQkgICAgcGZuX2JyZF9tZW1fbWFwKGhpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwKKwkJCQkJCSAgICBwYV9jdXJyLCB2YV9jdXJyLAorCQkJCQkJICAgIHBhZ2Vfc2l6ZVtpXSwgbWFwX2F0dHJzLAorCQkJCQkJICAgIE5VTEwpOworCQkJCWRldl9kYmcoYnJpZGdlLAorCQkJCQkic2htIE1NVSBQVEUgZW50cnkgUEEgJXgiCisJCQkJCSIgVkEgJXggRFNQX1ZBICV4IFNpemUgJXhcbiIsCisJCQkJCWFlX3Byb2NbbmR4XS51bF9ncHBfcGEsCisJCQkJCWFlX3Byb2NbbmR4XS51bF9ncHBfdmEsCisJCQkJCWFlX3Byb2NbbmR4XS51bF9kc3BfdmEgKgorCQkJCQloaW9fbWdyLT53b3JkX3NpemUsIHBhZ2Vfc2l6ZVtpXSk7CisJCQkJaWYgKHN0YXR1cykKKwkJCQkJZ290byBmdW5jX2VuZDsKKwkJCX0KKwkJCXBhX2N1cnIgKz0gcGFnZV9zaXplW2ldOworCQkJdmFfY3VyciArPSBwYWdlX3NpemVbaV07CisJCQlncHBfdmFfY3VyciArPSBwYWdlX3NpemVbaV07CisJCQludW1fYnl0ZXMgLT0gcGFnZV9zaXplW2ldOworCQkJLyoKKwkJCSAqIERvbid0IHRyeSBzbWFsbGVyIHNpemVzLiBIb3BlZnVsbHkgd2UgaGF2ZSByZWFjaGVkCisJCQkgKiBhbiBhZGRyZXNzIGFsaWduZWQgdG8gYSBiaWdnZXIgcGFnZSBzaXplLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogQ29weSByZW1haW5pbmcgZW50cmllcyBmcm9tIENEQi4gQWxsIGVudHJpZXMgYXJlIDEgTUIgYW5kCisJICogc2hvdWxkIG5vdCBjb25mbGljdCB3aXRoIHNobSBlbnRyaWVzIG9uIE1QVSBvciBEU1Agc2lkZS4KKwkgKi8KKwlmb3IgKGkgPSAzOyBpIDwgNyAmJiBuZHggPCBCUkRJT0NUTF9OVU1PRk1NVVRMQjsgaSsrKSB7CisJCWlmIChoaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS51bF9ncHBfcGh5cyA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKChoaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS51bF9ncHBfcGh5cyA+CisJCSAgICAgdWxfZ3BwX3BhIC0gMHgxMDAwMDAKKwkJICAgICAmJiBoaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS51bF9ncHBfcGh5cyA8PQorCQkgICAgIHVsX2dwcF9wYSArIHVsX3NlZ19zaXplKQorCQkgICAgfHwgKGhpb19tZ3ItPmV4dF9wcm9jX2luZm8udHlfdGxiW2ldLnVsX2RzcF92aXJ0ID4KKwkJCXVsX2RzcF92YSAtIDB4MTAwMDAwIC8gaGlvX21nci0+d29yZF9zaXplCisJCQkmJiBoaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS51bF9kc3BfdmlydCA8PQorCQkJdWxfZHNwX3ZhICsgdWxfc2VnX3NpemUgLyBoaW9fbWdyLT53b3JkX3NpemUpKSB7CisJCQlkZXZfZGJnKGJyaWRnZSwKKwkJCQkiQ0RCIE1NVSBlbnRyeSAlZCBjb25mbGljdHMgd2l0aCAiCisJCQkJInNobS5cblx0Q0RCOiBHcHBQYSAleCwgRHNwVmEgJXguXG5cdFNITTogIgorCQkJCSJHcHBQYSAleCwgRHNwVmEgJXgsIEJ5dGVzICV4LlxuIiwgaSwKKwkJCQloaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS51bF9ncHBfcGh5cywKKwkJCQloaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS51bF9kc3BfdmlydCwKKwkJCQl1bF9ncHBfcGEsIHVsX2RzcF92YSwgdWxfc2VnX3NpemUpOworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9IGVsc2UgeworCQkJaWYgKG5keCA8IE1BWF9MT0NLX1RMQl9FTlRSSUVTKSB7CisJCQkJYWVfcHJvY1tuZHhdLnVsX2RzcF92YSA9CisJCQkJICAgIGhpb19tZ3ItPmV4dF9wcm9jX2luZm8udHlfdGxiW2ldLgorCQkJCSAgICB1bF9kc3BfdmlydDsKKwkJCQlhZV9wcm9jW25keF0udWxfZ3BwX3BhID0KKwkJCQkgICAgaGlvX21nci0+ZXh0X3Byb2NfaW5mby50eV90bGJbaV0uCisJCQkJICAgIHVsX2dwcF9waHlzOworCQkJCWFlX3Byb2NbbmR4XS51bF9ncHBfdmEgPSAwOworCQkJCS8qIDEgTUIgKi8KKwkJCQlhZV9wcm9jW25keF0udWxfc2l6ZSA9IDB4MTAwMDAwOworCQkJCWRldl9kYmcoYnJpZGdlLCAic2htIE1NVSBlbnRyeSBQQSAleCAiCisJCQkJCSJEU1BfVkEgMHgleFxuIiwgYWVfcHJvY1tuZHhdLnVsX2dwcF9wYSwKKwkJCQkJYWVfcHJvY1tuZHhdLnVsX2RzcF92YSk7CisJCQkJbmR4Kys7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IGhpb19tZ3ItPmludGZfZnhucy0+cGZuX2JyZF9tZW1fbWFwCisJCQkJICAgIChoaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsCisJCQkJICAgICBoaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYltpXS4KKwkJCQkgICAgIHVsX2dwcF9waHlzLAorCQkJCSAgICAgaGlvX21nci0+ZXh0X3Byb2NfaW5mby50eV90bGJbaV0uCisJCQkJICAgICB1bF9kc3BfdmlydCwgMHgxMDAwMDAsIG1hcF9hdHRycywKKwkJCQkgICAgIE5VTEwpOworCQkJfQorCQl9CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCW1hcF9hdHRycyA9IDB4MDAwMDAwMDA7CisJbWFwX2F0dHJzID0gRFNQX01BUExJVFRMRUVORElBTjsKKwltYXBfYXR0cnMgfD0gRFNQX01BUFBIWVNJQ0FMQUREUjsKKwltYXBfYXR0cnMgfD0gRFNQX01BUEVMRU1TSVpFMzI7CisJbWFwX2F0dHJzIHw9IERTUF9NQVBET05PVExPQ0s7CisKKwkvKiBNYXAgdGhlIEw0IHBlcmlwaGVyYWxzICovCisJaSA9IDA7CisJd2hpbGUgKGw0X3BlcmlwaGVyYWxfdGFibGVbaV0ucGh5c19hZGRyKSB7CisJCXN0YXR1cyA9IGhpb19tZ3ItPmludGZfZnhucy0+cGZuX2JyZF9tZW1fbWFwCisJCSAgICAoaGlvX21nci0+aGJyaWRnZV9jb250ZXh0LCBsNF9wZXJpcGhlcmFsX3RhYmxlW2ldLnBoeXNfYWRkciwKKwkJICAgICBsNF9wZXJpcGhlcmFsX3RhYmxlW2ldLmRzcF92aXJ0X2FkZHIsIEhXX1BBR0VfU0laRTRLQiwKKwkJICAgICBtYXBfYXR0cnMsIE5VTEwpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBmdW5jX2VuZDsKKwkJaSsrOworCX0KKworCWZvciAoaSA9IG5keDsgaSA8IEJSRElPQ1RMX05VTU9GTU1VVExCOyBpKyspIHsKKwkJYWVfcHJvY1tpXS51bF9kc3BfdmEgPSAwOworCQlhZV9wcm9jW2ldLnVsX2dwcF9wYSA9IDA7CisJCWFlX3Byb2NbaV0udWxfZ3BwX3ZhID0gMDsKKwkJYWVfcHJvY1tpXS51bF9zaXplID0gMDsKKwl9CisJLyoKKwkgKiBTZXQgdGhlIHNobSBwaHlzaWNhbCBhZGRyZXNzIGVudHJ5IChncmF5ZWQgb3V0IGluIENEQiBmaWxlKQorCSAqIHRvIHRoZSB2aXJ0dWFsIHVuY2FjaGVkIGlvcmVtYXBwZWQgYWRkcmVzcyBvZiBzaG0gcmVzZXJ2ZWQKKwkgKiBvbiBNUFUuCisJICovCisJaGlvX21nci0+ZXh0X3Byb2NfaW5mby50eV90bGJbMF0udWxfZ3BwX3BoeXMgPQorCSAgICAodWxfZ3BwX3ZhICsgdWxfc2VnMV9zaXplICsgdWxfcGFkX3NpemUpOworCisJLyoKKwkgKiBOZWVkIHNobSBQaHlzIGFkZHIuIElPIHN1cHBvcnRzIG9ubHkgb25lIERTUCBmb3Igbm93OgorCSAqIG51bV9wcm9jcyA9IDEuCisJICovCisJaWYgKCFoaW9fbWdyLT5leHRfcHJvY19pbmZvLnR5X3RsYlswXS51bF9ncHBfcGh5cyB8fCBudW1fcHJvY3MgIT0gMSkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0gZWxzZSB7CisJCWlmIChhZV9wcm9jWzBdLnVsX2RzcF92YSA+IHVsX3NobV9iYXNlKSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJCS8qIHVsX3NobV9iYXNlIG1heSBub3QgYmUgYXQgdWxfZHNwX3ZhIGFkZHJlc3MgKi8KKwkJdWxfc2htX2Jhc2Vfb2Zmc2V0ID0gKHVsX3NobV9iYXNlIC0gYWVfcHJvY1swXS51bF9kc3BfdmEpICoKKwkJICAgIGhpb19tZ3ItPndvcmRfc2l6ZTsKKwkJLyoKKwkJICogYnJpZGdlX2Rldl9jdHJsKCkgd2lsbCBzZXQgZGV2IGNvbnRleHQgZHNwLW1tdSBpbmZvLiBJbgorCQkgKiBicmlkZ2VfYnJkX3N0YXJ0KCkgdGhlIE1NVSB3aWxsIGJlIHJlLXByb2dyYW1lZCB3aXRoIE1NVQorCQkgKiBEU1BWYS1HUFBQYSBwYWlyIGluZm8gd2hpbGUgRFNQIGlzIGluIGEga25vd24KKwkJICogKHJlc2V0KSBzdGF0ZS4KKwkJICovCisKKwkJc3RhdHVzID0KKwkJICAgIGhpb19tZ3ItPmludGZfZnhucy0+cGZuX2Rldl9jbnRybChoaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsCisJCQkJCQkgICAgICBCUkRJT0NUTF9TRVRNTVVDT05GSUcsCisJCQkJCQkgICAgICBhZV9wcm9jKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZnVuY19lbmQ7CisJCXVsX3NobV9iYXNlID0gaGlvX21nci0+ZXh0X3Byb2NfaW5mby50eV90bGJbMF0udWxfZ3BwX3BoeXM7CisJCXVsX3NobV9iYXNlICs9IHVsX3NobV9iYXNlX29mZnNldDsKKwkJdWxfc2htX2Jhc2UgPSAodTMyKSBNRU1fTElORUFSX0FERFJFU1MoKHZvaWQgKil1bF9zaG1fYmFzZSwKKwkJCQkJCSAgICAgICB1bF9tZW1fbGVuZ3RoKTsKKwkJaWYgKHVsX3NobV9iYXNlID09IDApIHsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJCS8qIFJlZ2lzdGVyIFNNICovCisJCXN0YXR1cyA9CisJCSAgICByZWdpc3Rlcl9zaG1fc2VncyhoaW9fbWdyLCBjb2RfbWFuLCBhZV9wcm9jWzBdLnVsX2dwcF9wYSk7CisJfQorCisJaGlvX21nci0+c2hhcmVkX21lbSA9IChzdHJ1Y3Qgc2htICopdWxfc2htX2Jhc2U7CisJaGlvX21nci0+aW5wdXQgPSAodTggKikgaGlvX21nci0+c2hhcmVkX21lbSArIHNpemVvZihzdHJ1Y3Qgc2htKTsKKwloaW9fbWdyLT5vdXRwdXQgPSBoaW9fbWdyLT5pbnB1dCArICh1bF9zaG1fbGVuZ3RoIC0KKwkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2htKSkgLyAyOworCWhpb19tZ3ItPnVzbV9idWZfc2l6ZSA9IGhpb19tZ3ItPm91dHB1dCAtIGhpb19tZ3ItPmlucHV0OworCisJLyogIFNldCB1cCBTaGFyZWQgbWVtb3J5IGFkZHJlc3NlcyBmb3IgbWVzc2FnaW5nLiAqLworCWhpb19tZ3ItPm1zZ19pbnB1dF9jdHJsID0gKHN0cnVjdCBtc2dfY3RybCAqKSgodTggKikgaGlvX21nci0+c2hhcmVkX21lbQorCQkJCQkJICAgICAgKyB1bF9zaG1fbGVuZ3RoKTsKKwloaW9fbWdyLT5tc2dfaW5wdXQgPQorCSAgICAodTggKikgaGlvX21nci0+bXNnX2lucHV0X2N0cmwgKyBzaXplb2Yoc3RydWN0IG1zZ19jdHJsKTsKKwloaW9fbWdyLT5tc2dfb3V0cHV0X2N0cmwgPQorCSAgICAoc3RydWN0IG1zZ19jdHJsICopKCh1OCAqKSBoaW9fbWdyLT5tc2dfaW5wdXRfY3RybCArCisJCQkJdWxfbXNnX2xlbmd0aCAvIDIpOworCWhpb19tZ3ItPm1zZ19vdXRwdXQgPQorCSAgICAodTggKikgaGlvX21nci0+bXNnX291dHB1dF9jdHJsICsgc2l6ZW9mKHN0cnVjdCBtc2dfY3RybCk7CisJaG1zZ19tZ3ItPm1heF9tc2dzID0KKwkgICAgKCh1OCAqKSBoaW9fbWdyLT5tc2dfb3V0cHV0X2N0cmwgLSBoaW9fbWdyLT5tc2dfaW5wdXQpCisJICAgIC8gc2l6ZW9mKHN0cnVjdCBtc2dfZHNwbXNnKTsKKwlkZXZfZGJnKGJyaWRnZSwgIklPIE1HUiBzaG0gZGV0YWlsczogc2hhcmVkX21lbSAlcCwgaW5wdXQgJXAsICIKKwkJIm91dHB1dCAlcCwgbXNnX2lucHV0X2N0cmwgJXAsIG1zZ19pbnB1dCAlcCwgIgorCQkibXNnX291dHB1dF9jdHJsICVwLCBtc2dfb3V0cHV0ICVwXG4iLAorCQkodTggKikgaGlvX21nci0+c2hhcmVkX21lbSwgaGlvX21nci0+aW5wdXQsCisJCWhpb19tZ3ItPm91dHB1dCwgKHU4ICopIGhpb19tZ3ItPm1zZ19pbnB1dF9jdHJsLAorCQloaW9fbWdyLT5tc2dfaW5wdXQsICh1OCAqKSBoaW9fbWdyLT5tc2dfb3V0cHV0X2N0cmwsCisJCWhpb19tZ3ItPm1zZ19vdXRwdXQpOworCWRldl9kYmcoYnJpZGdlLCAiKHByb2MpIE1hcyBtc2dzIGluIHNoYXJlZCBtZW1vcnk6IDB4JXhcbiIsCisJCWhtc2dfbWdyLT5tYXhfbXNncyk7CisJbWVtc2V0KCh2b2lkICopaGlvX21nci0+c2hhcmVkX21lbSwgMCwgc2l6ZW9mKHN0cnVjdCBzaG0pKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0JBQ0tUUkFDRSkgfHwgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0VfREVCVUcpCisJLyogR2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRyYWNlIGJ1ZmZlciAqLworCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIFNZU19QVVRDQkVHLAorCQkJCSAgICZoaW9fbWdyLT51bF90cmFjZV9idWZmZXJfYmVnaW4pOworCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwloaW9fbWdyLT51bF9ncHBfcmVhZF9wb2ludGVyID0gaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2JlZ2luID0KKwkgICAgKHVsX2dwcF92YSArIHVsX3NlZzFfc2l6ZSArIHVsX3BhZF9zaXplKSArCisJICAgIChoaW9fbWdyLT51bF90cmFjZV9idWZmZXJfYmVnaW4gLSB1bF9kc3BfdmEpOworCS8qIEdldCB0aGUgZW5kIGFkZHJlc3Mgb2YgdHJhY2UgYnVmZmVyICovCisJc3RhdHVzID0gY29kX2dldF9zeW1fdmFsdWUoY29kX21hbiwgU1lTX1BVVENFTkQsCisJCQkJICAgJmhpb19tZ3ItPnVsX3RyYWNlX2J1ZmZlcl9lbmQpOworCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2VuZCA9CisJICAgICh1bF9ncHBfdmEgKyB1bF9zZWcxX3NpemUgKyB1bF9wYWRfc2l6ZSkgKworCSAgICAoaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2VuZCAtIHVsX2RzcF92YSk7CisJLyogR2V0IHRoZSBjdXJyZW50IGFkZHJlc3Mgb2YgRFNQIHdyaXRlIHBvaW50ZXIgKi8KKwlzdGF0dXMgPSBjb2RfZ2V0X3N5bV92YWx1ZShjb2RfbWFuLCBCUklER0VfU1lTX1BVVENfQ1VSUkVOVCwKKwkJCQkgICAmaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2N1cnJlbnQpOworCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2N1cnJlbnQgPQorCSAgICAodWxfZ3BwX3ZhICsgdWxfc2VnMV9zaXplICsgdWxfcGFkX3NpemUpICsKKwkgICAgKGhpb19tZ3ItPnVsX3RyYWNlX2J1ZmZlcl9jdXJyZW50IC0gdWxfZHNwX3ZhKTsKKwkvKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdHJhY2UgYnVmZmVyICovCisJa2ZyZWUoaGlvX21nci0+cG1zZyk7CisJaGlvX21nci0+cG1zZyA9IGttYWxsb2MoKChoaW9fbWdyLT51bF90cmFjZV9idWZmZXJfZW5kIC0KKwkJCQloaW9fbWdyLT51bF90cmFjZV9idWZmZXJfYmVnaW4pICoKKwkJCQloaW9fbWdyLT53b3JkX3NpemUpICsgMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoaW9fbWdyLT5wbXNnKQorCQlzdGF0dXMgPSAtRU5PTUVNOworCisJaGlvX21nci0+dWxfZHNwX3ZhID0gdWxfZHNwX3ZhOworCWhpb19tZ3ItPnVsX2dwcF92YSA9ICh1bF9ncHBfdmEgKyB1bF9zZWcxX3NpemUgKyB1bF9wYWRfc2l6ZSk7CisKKyNlbmRpZgorZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBpb19idWZfc2l6ZSA9PT09PT09PQorICogICAgICBTaXplIG9mIHNoYXJlZCBtZW1vcnkgSS9PIGNoYW5uZWwuCisgKi8KK3UzMiBpb19idWZfc2l6ZShzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyKQoreworCWlmIChoaW9fbWdyKQorCQlyZXR1cm4gaGlvX21nci0+dXNtX2J1Zl9zaXplOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgPT09PT09PT0gaW9fY2FuY2VsX2NobmwgPT09PT09PT0KKyAqICAgICAgQ2FuY2VsIElPIG9uIGEgZ2l2ZW4gUENQWSBjaGFubmVsLgorICovCit2b2lkIGlvX2NhbmNlbF9jaG5sKHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IsIHUzMiBjaG5sKQoreworCXN0cnVjdCBpb19tZ3IgKnBpb19tZ3IgPSAoc3RydWN0IGlvX21nciAqKWhpb19tZ3I7CisJc3RydWN0IHNobSAqc207CisKKwlpZiAoIWhpb19tZ3IpCisJCWdvdG8gZnVuY19lbmQ7CisJc20gPSBoaW9fbWdyLT5zaGFyZWRfbWVtOworCisJLyogSW5mb3JtIERTUCB0aGF0IHdlIGhhdmUgbm8gbW9yZSBidWZmZXJzIG9uIHRoaXMgY2hhbm5lbCAqLworCXNldF9jaG5sX2ZyZWUoc20sIGNobmwpOworCisJc21faW50ZXJydXB0X2RzcChwaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsIE1CWF9QQ1BZX0NMQVNTKTsKK2Z1bmNfZW5kOgorCXJldHVybjsKK30KKworCisvKgorICogID09PT09PT09IGlvX2Rpc3BhdGNoX3BtID09PT09PT09CisgKiAgICAgIFBlcmZvcm1zIEkvTyBkaXNwYXRjaCBvbiBQTSByZWxhdGVkIG1lc3NhZ2VzIGZyb20gRFNQCisgKi8KK3N0YXRpYyB2b2lkIGlvX2Rpc3BhdGNoX3BtKHN0cnVjdCBpb19tZ3IgKnBpb19tZ3IpCit7CisJaW50IHN0YXR1czsKKwl1MzIgcGFyZ1syXTsKKworCS8qIFBlcmZvcm0gUG93ZXIgbWVzc2FnZSBwcm9jZXNzaW5nIGhlcmUgKi8KKwlwYXJnWzBdID0gcGlvX21nci0+aW50cl92YWw7CisKKwkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBCcmlkZ2UgY2xrL3B3ciBtYW5hZ2VyIHRvIGhhbmRsZSAqLworCWlmIChwYXJnWzBdID09IE1CWF9QTV9ISUJFUk5BVEVfRU4pIHsKKwkJZGV2X2RiZyhicmlkZ2UsICJQTTogSGliZXJuYXRlIGNvbW1hbmRcbiIpOworCQlzdGF0dXMgPSBwaW9fbWdyLT5pbnRmX2Z4bnMtPgorCQkJCXBmbl9kZXZfY250cmwocGlvX21nci0+aGJyaWRnZV9jb250ZXh0LAorCQkJCQkgICAgICBCUkRJT0NUTF9QV1JfSElCRVJOQVRFLCBwYXJnKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2VycigiJXM6IGhpYmVybmF0ZSBjbWQgZmFpbGVkIDB4JXhcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCX0gZWxzZSBpZiAocGFyZ1swXSA9PSBNQlhfUE1fT1BQX1JFUSkgeworCQlwYXJnWzFdID0gcGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3JlcXVlc3QucnFzdF9vcHBfcHQ7CisJCWRldl9kYmcoYnJpZGdlLCAiUE06IFJlcXVlc3RlZCBPUFAgPSAweCV4XG4iLCBwYXJnWzFdKTsKKwkJc3RhdHVzID0gcGlvX21nci0+aW50Zl9meG5zLT4KKwkJCQlwZm5fZGV2X2NudHJsKHBpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwKKwkJCQkJQlJESU9DVExfQ09OU1RSQUlOVF9SRVFVRVNULCBwYXJnKTsKKwkJaWYgKHN0YXR1cykKKwkJCWRldl9kYmcoYnJpZGdlLCAiUE06IEZhaWxlZCB0byBzZXQgY29uc3RyYWludCAiCisJCQkJIj0gMHgleFxuIiwgcGFyZ1sxXSk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhicmlkZ2UsICJQTTogY2xrIGNvbnRyb2wgdmFsdWUgb2YgbXNnID0gMHgleFxuIiwKKwkJCXBhcmdbMF0pOworCQlzdGF0dXMgPSBwaW9fbWdyLT5pbnRmX2Z4bnMtPgorCQkJCXBmbl9kZXZfY250cmwocGlvX21nci0+aGJyaWRnZV9jb250ZXh0LAorCQkJCQkgICAgICBCUkRJT0NUTF9DTEtfQ1RSTCwgcGFyZyk7CisJCWlmIChzdGF0dXMpCisJCQlkZXZfZGJnKGJyaWRnZSwgIlBNOiBGYWlsZWQgdG8gY3RybCB0aGUgRFNQIGNsayIKKwkJCQkiPSAweCV4XG4iLCAqcGFyZyk7CisJfQorfQorCisvKgorICogID09PT09PT09IGlvX2RwYyA9PT09PT09PQorICogICAgICBEZWZlcnJlZCBwcm9jZWR1cmUgY2FsbCBmb3Igc2hhcmVkIG1lbW9yeSBjaGFubmVsIGRyaXZlciBJU1IuICBDYXJyaWVzCisgKiAgICAgIG91dCB0aGUgZGlzcGF0Y2ggb2YgSS9PIGFzIGEgbm9uLXByZWVtcHRpYmxlIGV2ZW50Lkl0IGNhbiBvbmx5IGJlCisgKiAgICAgIHByZS1lbXB0ZWQgICAgICBieSBhbiBJU1IuCisgKi8KK3ZvaWQgaW9fZHBjKHVuc2lnbmVkIGxvbmcgcmVmX2RhdGEpCit7CisJc3RydWN0IGlvX21nciAqcGlvX21nciA9IChzdHJ1Y3QgaW9fbWdyICopcmVmX2RhdGE7CisJc3RydWN0IGNobmxfbWdyICpjaG5sX21ncl9vYmo7CisJc3RydWN0IG1zZ19tZ3IgKm1zZ19tZ3Jfb2JqOworCXN0cnVjdCBkZWhfbWdyICpoZGVoX21ncjsKKwl1MzIgcmVxdWVzdGVkOworCXUzMiBzZXJ2aWNlZDsKKworCWlmICghcGlvX21ncikKKwkJZ290byBmdW5jX2VuZDsKKwljaG5sX21ncl9vYmogPSBwaW9fbWdyLT5oY2hubF9tZ3I7CisJZGV2X2dldF9tc2dfbWdyKHBpb19tZ3ItPmhkZXZfb2JqLCAmbXNnX21ncl9vYmopOworCWRldl9nZXRfZGVoX21ncihwaW9fbWdyLT5oZGV2X29iaiwgJmhkZWhfbWdyKTsKKwlpZiAoIWNobmxfbWdyX29iaikKKwkJZ290byBmdW5jX2VuZDsKKworCXJlcXVlc3RlZCA9IHBpb19tZ3ItPmRwY19yZXE7CisJc2VydmljZWQgPSBwaW9fbWdyLT5kcGNfc2NoZWQ7CisKKwlpZiAoc2VydmljZWQgPT0gcmVxdWVzdGVkKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyogUHJvY2VzcyBwZW5kaW5nIERQQydzICovCisJZG8geworCQkvKiBDaGVjayB2YWx1ZSBvZiBpbnRlcnJ1cHQgcmVnIHRvIGVuc3VyZSBpdCdzIGEgdmFsaWQgZXJyb3IgKi8KKwkJaWYgKChwaW9fbWdyLT5pbnRyX3ZhbCA+IERFSF9CQVNFKSAmJgorCQkgICAgKHBpb19tZ3ItPmludHJfdmFsIDwgREVIX0xJTUlUKSkgeworCQkJLyogTm90aWZ5IERTUC9CSU9TIGV4Y2VwdGlvbiAqLworCQkJaWYgKGhkZWhfbWdyKSB7CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0JBQ0tUUkFDRQorCQkJCXByaW50X2RzcF9kZWJ1Z190cmFjZShwaW9fbWdyKTsKKyNlbmRpZgorCQkJCWJyaWRnZV9kZWhfbm90aWZ5KGhkZWhfbWdyLCBEU1BfU1lTRVJST1IsCisJCQkJCQkgIHBpb19tZ3ItPmludHJfdmFsKTsKKwkJCX0KKwkJfQorCQkvKiBQcm9jLWNvcHkgY2hhbmVsIGRpc3BhdGNoICovCisJCWlucHV0X2NobmwocGlvX21nciwgTlVMTCwgSU9fU0VSVklDRSk7CisJCW91dHB1dF9jaG5sKHBpb19tZ3IsIE5VTEwsIElPX1NFUlZJQ0UpOworCisjaWZkZWYgQ0hOTF9NRVNTQUdFUworCQlpZiAobXNnX21ncl9vYmopIHsKKwkJCS8qIFBlcmZvcm0gSS9PIGRpc3BhdGNoIG9uIG1lc3NhZ2UgcXVldWVzICovCisJCQlpbnB1dF9tc2cocGlvX21nciwgbXNnX21ncl9vYmopOworCQkJb3V0cHV0X21zZyhwaW9fbWdyLCBtc2dfbWdyX29iaik7CisJCX0KKworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RFQlVHCisJCWlmIChwaW9fbWdyLT5pbnRyX3ZhbCAmIE1CWF9EQkdfU1lTUFJJTlRGKSB7CisJCQkvKiBOb3RpZnkgRFNQIFRyYWNlIG1lc3NhZ2UgKi8KKwkJCXByaW50X2RzcF9kZWJ1Z190cmFjZShwaW9fbWdyKTsKKwkJfQorI2VuZGlmCisJCXNlcnZpY2VkKys7CisJfSB3aGlsZSAoc2VydmljZWQgIT0gcmVxdWVzdGVkKTsKKwlwaW9fbWdyLT5kcGNfc2NoZWQgPSByZXF1ZXN0ZWQ7CitmdW5jX2VuZDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgPT09PT09PT0gaW9fbWJveF9tc2cgPT09PT09PT0KKyAqICAgICAgTWFpbiBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgSU8gbWFuYWdlci4KKyAqICAgICAgQ2FsbHMgdGhlIEJyaWRnZSdzIENITkxfSVNSIHRvIGRldGVybWluZSBpZiB0aGlzIGludGVycnVwdCBpcyBvdXJzLCB0aGVuCisgKiAgICAgIHNjaGVkdWxlcyBhIERQQyB0byBkaXNwYXRjaCBJL08uCisgKi8KK3ZvaWQgaW9fbWJveF9tc2codTMyIG1zZykKK3sKKwlzdHJ1Y3QgaW9fbWdyICpwaW9fbWdyOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfb2JqID0gZGV2X2dldF9maXJzdCgpOworCWRldl9nZXRfaW9fbWdyKGRldl9vYmosICZwaW9fbWdyKTsKKworCWlmICghcGlvX21ncikKKwkJcmV0dXJuOworCisJcGlvX21nci0+aW50cl92YWwgPSAodTE2KW1zZzsKKwlpZiAocGlvX21nci0+aW50cl92YWwgJiBNQlhfUE1fQ0xBU1MpCisJCWlvX2Rpc3BhdGNoX3BtKHBpb19tZ3IpOworCisJaWYgKHBpb19tZ3ItPmludHJfdmFsID09IE1CWF9ERUhfUkVTRVQpIHsKKwkJcGlvX21nci0+aW50cl92YWwgPSAwOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaW9fbWdyLT5kcGNfbG9jaywgZmxhZ3MpOworCQlwaW9fbWdyLT5kcGNfcmVxKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpb19tZ3ItPmRwY19sb2NrLCBmbGFncyk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnBpb19tZ3ItPmRwY190YXNrbGV0KTsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogID09PT09PT09IGlvX3JlcXVlc3RfY2hubCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlcXVlc3QgY2hhbmVuZWwgSS9PIGZyb20gdGhlIERTUC4gU2V0cyBmbGFncyBpbiBzaGFyZWQgbWVtb3J5LCB0aGVuCisgKiAgICAgIGludGVycnVwdHMgdGhlIERTUC4KKyAqLwordm9pZCBpb19yZXF1ZXN0X2Nobmwoc3RydWN0IGlvX21nciAqaW9fbWFuYWdlciwgc3RydWN0IGNobmxfb2JqZWN0ICpwY2hubCwKKwkJCXU4IGlvX21vZGUsIHUxNiAqbWJ4X3ZhbCkKK3sKKwlzdHJ1Y3QgY2hubF9tZ3IgKmNobmxfbWdyX29iajsKKwlzdHJ1Y3Qgc2htICpzbTsKKworCWlmICghcGNobmwgfHwgIW1ieF92YWwpCisJCWdvdG8gZnVuY19lbmQ7CisJY2hubF9tZ3Jfb2JqID0gaW9fbWFuYWdlci0+aGNobmxfbWdyOworCXNtID0gaW9fbWFuYWdlci0+c2hhcmVkX21lbTsKKwlpZiAoaW9fbW9kZSA9PSBJT19JTlBVVCkgeworCQkvKgorCQkgKiBBc3NlcnRpb24gZmlyZXMgaWYgQ0hOTF9BZGRJT1JlcSgpIGNhbGxlZCBvbiBhIHN0cmVhbQorCQkgKiB3aGljaCB3YXMgY2FuY2VsbGVkLCBvciBhdHRhY2hlZCB0byBhIGRlYWQgYm9hcmQuCisJCSAqLworCQlEQkNfQVNTRVJUKChwY2hubC0+ZHdfc3RhdGUgPT0gQ0hOTF9TVEFURVJFQURZKSB8fAorCQkJICAgKHBjaG5sLT5kd19zdGF0ZSA9PSBDSE5MX1NUQVRFRU9TKSk7CisJCS8qIEluZGljYXRlIHRvIHRoZSBEU1Agd2UgaGF2ZSBhIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGlucHV0ICovCisJCXNldF9jaG5sX2J1c3koc20sIHBjaG5sLT5jaG5sX2lkKTsKKwkJKm1ieF92YWwgPSBNQlhfUENQWV9DTEFTUzsKKwl9IGVsc2UgaWYgKGlvX21vZGUgPT0gSU9fT1VUUFVUKSB7CisJCS8qCisJCSAqIFRoaXMgYXNzZXJ0aW9uIGZhaWxzIGlmIENITkxfQWRkSU9SZXEoKSB3YXMgY2FsbGVkIG9uIGEKKwkJICogc3RyZWFtIHdoaWNoIHdhcyBjYW5jZWxsZWQsIG9yIGF0dGFjaGVkIHRvIGEgZGVhZCBib2FyZC4KKwkJICovCisJCURCQ19BU1NFUlQoKHBjaG5sLT5kd19zdGF0ZSAmIH5DSE5MX1NUQVRFRU9TKSA9PQorCQkJICAgQ0hOTF9TVEFURVJFQURZKTsKKwkJLyoKKwkJICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSBhIGJ1ZmZlciBhdmFpbGFibGUgZm9yCisJCSAqIG91dHB1dC4KKwkJICovCisJCWNobmxfbWdyX29iai0+ZHdfb3V0cHV0X21hc2sgfD0gKDEgPDwgcGNobmwtPmNobmxfaWQpOworCX0gZWxzZSB7CisJCURCQ19BU1NFUlQoaW9fbW9kZSk7CS8qIFNob3VsZG4ndCBnZXQgaGVyZS4gKi8KKwl9CitmdW5jX2VuZDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgPT09PT09PT0gaW9zbV9zY2hlZHVsZSA9PT09PT09PQorICogICAgICBTY2hlZHVsZSBEUEMgZm9yIElPLgorICovCit2b2lkIGlvc21fc2NoZWR1bGUoc3RydWN0IGlvX21nciAqaW9fbWFuYWdlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpb19tYW5hZ2VyKQorCQlyZXR1cm47CisKKwkvKiBJbmNyZW1lbnQgY291bnQgb2YgRFBDJ3MgcGVuZGluZy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9fbWFuYWdlci0+ZHBjX2xvY2ssIGZsYWdzKTsKKwlpb19tYW5hZ2VyLT5kcGNfcmVxKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9fbWFuYWdlci0+ZHBjX2xvY2ssIGZsYWdzKTsKKworCS8qIFNjaGVkdWxlIERQQyAqLworCXRhc2tsZXRfc2NoZWR1bGUoJmlvX21hbmFnZXItPmRwY190YXNrbGV0KTsKK30KKworLyoKKyAqICA9PT09PT09PSBmaW5kX3JlYWR5X291dHB1dCA9PT09PT09PQorICogICAgICBTZWFyY2ggZm9yIGEgaG9zdCBvdXRwdXQgY2hhbm5lbCB3aGljaCBpcyByZWFkeSB0byBzZW5kLiAgSWYgdGhpcyBpcworICogICAgICBjYWxsZWQgYXMgYSByZXN1bHQgb2Ygc2VydmljaW5nIHRoZSBEUEMsIHRoZW4gaW1wbGVtZW50IGEgcm91bmQKKyAqICAgICAgcm9iaW4gc2VhcmNoOyBvdGhlcndpc2UsIHRoaXMgd2FzIGNhbGxlZCBieSBhIGNsaWVudCB0aHJlYWQgKHZpYQorICogICAgICBJT19EaXNwYXRjaCgpKSwgc28ganVzdCBzdGFydCBzZWFyY2hpbmcgZnJvbSB0aGUgY3VycmVudCBjaGFubmVsIGlkLgorICovCitzdGF0aWMgdTMyIGZpbmRfcmVhZHlfb3V0cHV0KHN0cnVjdCBjaG5sX21nciAqY2hubF9tZ3Jfb2JqLAorCQkJICAgICBzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sLCB1MzIgbWFzaykKK3sKKwl1MzIgcmV0ID0gT1VUUFVUTk9UUkVBRFk7CisJdTMyIGlkLCBzdGFydF9pZDsKKwl1MzIgc2hpZnQ7CisKKwlpZCA9IChwY2hubCAhPQorCSAgICAgIE5VTEwgPyBwY2hubC0+Y2hubF9pZCA6IChjaG5sX21ncl9vYmotPmR3X2xhc3Rfb3V0cHV0ICsgMSkpOworCWlkID0gKChpZCA9PSBDSE5MX01BWENIQU5ORUxTKSA/IDAgOiBpZCk7CisJaWYgKGlkID49IENITkxfTUFYQ0hBTk5FTFMpCisJCWdvdG8gZnVuY19lbmQ7CisJaWYgKG1hc2spIHsKKwkJc2hpZnQgPSAoMSA8PCBpZCk7CisJCXN0YXJ0X2lkID0gaWQ7CisJCWRvIHsKKwkJCWlmIChtYXNrICYgc2hpZnQpIHsKKwkJCQlyZXQgPSBpZDsKKwkJCQlpZiAocGNobmwgPT0gTlVMTCkKKwkJCQkJY2hubF9tZ3Jfb2JqLT5kd19sYXN0X291dHB1dCA9IGlkOworCQkJCWJyZWFrOworCQkJfQorCQkJaWQgPSBpZCArIDE7CisJCQlpZCA9ICgoaWQgPT0gQ0hOTF9NQVhDSEFOTkVMUykgPyAwIDogaWQpOworCQkJc2hpZnQgPSAoMSA8PCBpZCk7CisJCX0gd2hpbGUgKGlkICE9IHN0YXJ0X2lkKTsKKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IGlucHV0X2NobmwgPT09PT09PT0KKyAqICAgICAgRGlzcGF0Y2ggYSBidWZmZXIgb24gYW4gaW5wdXQgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgaW5wdXRfY2hubChzdHJ1Y3QgaW9fbWdyICpwaW9fbWdyLCBzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sLAorCQkJdTggaW9fbW9kZSkKK3sKKwlzdHJ1Y3QgY2hubF9tZ3IgKmNobmxfbWdyX29iajsKKwlzdHJ1Y3Qgc2htICpzbTsKKwl1MzIgY2hubF9pZDsKKwl1MzIgYnl0ZXM7CisJc3RydWN0IGNobmxfaXJwICpjaG5sX3BhY2tldF9vYmogPSBOVUxMOworCXUzMiBkd19hcmc7CisJYm9vbCBjbGVhcl9jaG5sID0gZmFsc2U7CisJYm9vbCBub3RpZnlfY2xpZW50ID0gZmFsc2U7CisKKwlzbSA9IHBpb19tZ3ItPnNoYXJlZF9tZW07CisJY2hubF9tZ3Jfb2JqID0gcGlvX21nci0+aGNobmxfbWdyOworCisJLyogQXR0ZW1wdCB0byBwZXJmb3JtIGlucHV0ICovCisJaWYgKCFzbS0+aW5wdXRfZnVsbCkKKwkJZ290byBmdW5jX2VuZDsKKworCWJ5dGVzID0gc20tPmlucHV0X3NpemUgKiBjaG5sX21ncl9vYmotPndvcmRfc2l6ZTsKKwljaG5sX2lkID0gc20tPmlucHV0X2lkOworCWR3X2FyZyA9IHNtLT5hcmc7CisJaWYgKGNobmxfaWQgPj0gQ0hOTF9NQVhDSEFOTkVMUykgeworCQkvKiBTaG91bGRuJ3QgYmUgaGVyZTogd291bGQgaW5kaWNhdGUgY29ycnVwdGVkIHNobS4gKi8KKwkJREJDX0FTU0VSVChjaG5sX2lkKTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJcGNobmwgPSBjaG5sX21ncl9vYmotPmFwX2NoYW5uZWxbY2hubF9pZF07CisJaWYgKChwY2hubCAhPSBOVUxMKSAmJiBDSE5MX0lTX0lOUFVUKHBjaG5sLT5jaG5sX21vZGUpKSB7CisJCWlmICgocGNobmwtPmR3X3N0YXRlICYgfkNITkxfU1RBVEVFT1MpID09IENITkxfU1RBVEVSRUFEWSkgeworCQkJaWYgKCFwY2hubC0+cGlvX3JlcXVlc3RzKQorCQkJCWdvdG8gZnVuY19lbmQ7CisJCQkvKiBHZXQgdGhlIEkvTyByZXF1ZXN0LCBhbmQgYXR0ZW1wdCBhIHRyYW5zZmVyICovCisJCQljaG5sX3BhY2tldF9vYmogPSAoc3RydWN0IGNobmxfaXJwICopCisJCQkgICAgbHN0X2dldF9oZWFkKHBjaG5sLT5waW9fcmVxdWVzdHMpOworCQkJaWYgKGNobmxfcGFja2V0X29iaikgeworCQkJCXBjaG5sLT5jaW9fcmVxcy0tOworCQkJCWlmIChwY2hubC0+Y2lvX3JlcXMgPCAwKQorCQkJCQlnb3RvIGZ1bmNfZW5kOworCQkJCS8qCisJCQkJICogRW5zdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBjbGllbnQncworCQkJCSAqIGJ1ZmZlci4KKwkJCQkgKi8KKwkJCQlieXRlcyA9IG1pbihieXRlcywgY2hubF9wYWNrZXRfb2JqLT5ieXRlX3NpemUpOworCQkJCW1lbWNweShjaG5sX3BhY2tldF9vYmotPmhvc3Rfc3lzX2J1ZiwKKwkJCQkJCXBpb19tZ3ItPmlucHV0LCBieXRlcyk7CisJCQkJcGNobmwtPmJ5dGVzX21vdmVkICs9IGJ5dGVzOworCQkJCWNobmxfcGFja2V0X29iai0+Ynl0ZV9zaXplID0gYnl0ZXM7CisJCQkJY2hubF9wYWNrZXRfb2JqLT5kd19hcmcgPSBkd19hcmc7CisJCQkJY2hubF9wYWNrZXRfb2JqLT5zdGF0dXMgPSBDSE5MX0lPQ1NUQVRDT01QTEVURTsKKworCQkJCWlmIChieXRlcyA9PSAwKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoaXMgYXNzZXJ0aW9uIGZhaWxzIGlmIHRoZSBEU1AKKwkJCQkJICogc2VuZHMgRU9TIG1vcmUgdGhhbiBvbmNlIG9uIHRoaXMKKwkJCQkJICogY2hhbm5lbC4KKwkJCQkJICovCisJCQkJCWlmIChwY2hubC0+ZHdfc3RhdGUgJiBDSE5MX1NUQVRFRU9TKQorCQkJCQkJZ290byBmdW5jX2VuZDsKKwkJCQkJLyoKKwkJCQkJICogWmVybyBieXRlcyBpbmRpY2F0ZXMgRU9TLiBVcGRhdGUKKwkJCQkJICogSU9DIHN0YXR1cyBmb3IgdGhpcyBjaGlycCwgYW5kIGFsc28KKwkJCQkJICogdGhlIGNoYW5uZWwgc3RhdGUuCisJCQkJCSAqLworCQkJCQljaG5sX3BhY2tldF9vYmotPnN0YXR1cyB8PQorCQkJCQkgICAgQ0hOTF9JT0NTVEFURU9TOworCQkJCQlwY2hubC0+ZHdfc3RhdGUgfD0gQ0hOTF9TVEFURUVPUzsKKwkJCQkJLyoKKwkJCQkJICogTm90aWZ5IHRoYXQgZW5kIG9mIHN0cmVhbSBoYXMKKwkJCQkJICogb2NjdXJyZWQuCisJCQkJCSAqLworCQkJCQludGZ5X25vdGlmeShwY2hubC0+bnRmeV9vYmosCisJCQkJCQkgICAgRFNQX1NUUkVBTURPTkUpOworCQkJCX0KKwkJCQkvKiBUZWxsIERTUCBpZiBubyBtb3JlIEkvTyBidWZmZXJzIGF2YWlsYWJsZSAqLworCQkJCWlmICghcGNobmwtPnBpb19yZXF1ZXN0cykKKwkJCQkJZ290byBmdW5jX2VuZDsKKwkJCQlpZiAoTFNUX0lTX0VNUFRZKHBjaG5sLT5waW9fcmVxdWVzdHMpKSB7CisJCQkJCXNldF9jaG5sX2ZyZWUoc20sIHBjaG5sLT5jaG5sX2lkKTsKKwkJCQl9CisJCQkJY2xlYXJfY2hubCA9IHRydWU7CisJCQkJbm90aWZ5X2NsaWVudCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogSW5wdXQgZnVsbCBmb3IgdGhpcyBjaGFubmVsLCBidXQgd2UgaGF2ZSBubworCQkJCSAqIGJ1ZmZlcnMgYXZhaWxhYmxlLiAgVGhlIGNoYW5uZWwgbXVzdCBiZQorCQkJCSAqICJpZGxpbmciLiBDbGVhciBvdXQgdGhlIHBoeXNpY2FsIGlucHV0CisJCQkJICogY2hhbm5lbC4KKwkJCQkgKi8KKwkJCQljbGVhcl9jaG5sID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIElucHV0IGNoYW5uZWwgY2FuY2VsbGVkOiBjbGVhciBpbnB1dCBjaGFubmVsICovCisJCQljbGVhcl9jaG5sID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERQQyBmaXJlZCBhZnRlciBob3N0IGNsb3NlZCBjaGFubmVsOiBjbGVhciBpbnB1dCBjaGFubmVsICovCisJCWNsZWFyX2NobmwgPSB0cnVlOworCX0KKwlpZiAoY2xlYXJfY2hubCkgeworCQkvKiBJbmRpY2F0ZSB0byB0aGUgRFNQIHdlIGhhdmUgcmVhZCB0aGUgaW5wdXQgKi8KKwkJc20tPmlucHV0X2Z1bGwgPSAwOworCQlzbV9pbnRlcnJ1cHRfZHNwKHBpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwgTUJYX1BDUFlfQ0xBU1MpOworCX0KKwlpZiAobm90aWZ5X2NsaWVudCkgeworCQkvKiBOb3RpZnkgY2xpZW50IHdpdGggSU8gY29tcGxldGlvbiByZWNvcmQgKi8KKwkJbm90aWZ5X2NobmxfY29tcGxldGUocGNobmwsIGNobmxfcGFja2V0X29iaik7CisJfQorZnVuY19lbmQ6CisJcmV0dXJuOworfQorCisvKgorICogID09PT09PT09IGlucHV0X21zZyA9PT09PT09PQorICogICAgICBDb3BpZXMgbWVzc2FnZXMgZnJvbSBzaGFyZWQgbWVtb3J5IHRvIHRoZSBtZXNzYWdlIHF1ZXVlcy4KKyAqLworc3RhdGljIHZvaWQgaW5wdXRfbXNnKHN0cnVjdCBpb19tZ3IgKnBpb19tZ3IsIHN0cnVjdCBtc2dfbWdyICpobXNnX21ncikKK3sKKwl1MzIgbnVtX21zZ3M7CisJdTMyIGk7CisJdTggKm1zZ19pbnB1dDsKKwlzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqOworCXN0cnVjdCBtc2dfZnJhbWUgKnBtc2c7CisJc3RydWN0IG1zZ19kc3Btc2cgbXNnOworCXN0cnVjdCBtc2dfY3RybCAqbXNnX2N0cl9vYmo7CisJdTMyIGlucHV0X2VtcHR5OworCXUzMiBhZGRyOworCisJbXNnX2N0cl9vYmogPSBwaW9fbWdyLT5tc2dfaW5wdXRfY3RybDsKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBpbnB1dCBtZXNzYWdlcyB0byBiZSByZWFkICovCisJaW5wdXRfZW1wdHkgPSBtc2dfY3RyX29iai0+YnVmX2VtcHR5OworCW51bV9tc2dzID0gbXNnX2N0cl9vYmotPnNpemU7CisJaWYgKGlucHV0X2VtcHR5KQorCQlnb3RvIGZ1bmNfZW5kOworCisJbXNnX2lucHV0ID0gcGlvX21nci0+bXNnX2lucHV0OworCWZvciAoaSA9IDA7IGkgPCBudW1fbXNnczsgaSsrKSB7CisJCS8qIFJlYWQgdGhlIG5leHQgbWVzc2FnZSAqLworCQlhZGRyID0gKHUzMikgJigoKHN0cnVjdCBtc2dfZHNwbXNnICopbXNnX2lucHV0KS0+bXNnLmR3X2NtZCk7CisJCW1zZy5tc2cuZHdfY21kID0KKwkJICAgIHJlYWRfZXh0MzJfYml0X2RzcF9kYXRhKHBpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwgYWRkcik7CisJCWFkZHIgPSAodTMyKSAmKCgoc3RydWN0IG1zZ19kc3Btc2cgKiltc2dfaW5wdXQpLT5tc2cuZHdfYXJnMSk7CisJCW1zZy5tc2cuZHdfYXJnMSA9CisJCSAgICByZWFkX2V4dDMyX2JpdF9kc3BfZGF0YShwaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsIGFkZHIpOworCQlhZGRyID0gKHUzMikgJigoKHN0cnVjdCBtc2dfZHNwbXNnICopbXNnX2lucHV0KS0+bXNnLmR3X2FyZzIpOworCQltc2cubXNnLmR3X2FyZzIgPQorCQkgICAgcmVhZF9leHQzMl9iaXRfZHNwX2RhdGEocGlvX21nci0+aGJyaWRnZV9jb250ZXh0LCBhZGRyKTsKKwkJYWRkciA9ICh1MzIpICYoKChzdHJ1Y3QgbXNnX2RzcG1zZyAqKW1zZ19pbnB1dCktPm1zZ3FfaWQpOworCQltc2cubXNncV9pZCA9CisJCSAgICByZWFkX2V4dDMyX2JpdF9kc3BfZGF0YShwaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsIGFkZHIpOworCQltc2dfaW5wdXQgKz0gc2l6ZW9mKHN0cnVjdCBtc2dfZHNwbXNnKTsKKwkJaWYgKCFobXNnX21nci0+cXVldWVfbGlzdCkKKwkJCWdvdG8gZnVuY19lbmQ7CisKKwkJLyogRGV0ZXJtaW5lIHdoaWNoIHF1ZXVlIHRvIHB1dCB0aGUgbWVzc2FnZSBpbiAqLworCQltc2dfcXVldWVfb2JqID0KKwkJICAgIChzdHJ1Y3QgbXNnX3F1ZXVlICopbHN0X2ZpcnN0KGhtc2dfbWdyLT5xdWV1ZV9saXN0KTsKKwkJZGV2X2RiZyhicmlkZ2UsCSJpbnB1dCBtc2c6IGR3X2NtZD0weCV4IGR3X2FyZzE9MHgleCAiCisJCQkiZHdfYXJnMj0weCV4IG1zZ3FfaWQ9MHgleCBcbiIsIG1zZy5tc2cuZHdfY21kLAorCQkJbXNnLm1zZy5kd19hcmcxLCBtc2cubXNnLmR3X2FyZzIsIG1zZy5tc2dxX2lkKTsKKwkJLyoKKwkJICogSW50ZXJydXB0IG1heSBvY2N1ciBiZWZvcmUgc2hhcmVkIG1lbW9yeSBhbmQgbWVzc2FnZQorCQkgKiBpbnB1dCBsb2NhdGlvbnMgaGF2ZSBiZWVuIHNldCB1cC4gSWYgYWxsIG5vZGVzIHdlcmUKKwkJICogY2xlYW5lZCB1cCwgaG1zZ19tZ3ItPm1heF9tc2dzIHNob3VsZCBiZSAwLgorCQkgKi8KKwkJd2hpbGUgKG1zZ19xdWV1ZV9vYmogIT0gTlVMTCkgeworCQkJaWYgKG1zZy5tc2dxX2lkID09IG1zZ19xdWV1ZV9vYmotPm1zZ3FfaWQpIHsKKwkJCQkvKiBGb3VuZCBpdCAqLworCQkJCWlmIChtc2cubXNnLmR3X2NtZCA9PSBSTVNfRVhJVEFDSykgeworCQkJCQkvKgorCQkJCQkgKiBDYWxsIHRoZSBub2RlIGV4aXQgbm90aWZpY2F0aW9uLgorCQkJCQkgKiBUaGUgZXhpdCBtZXNzYWdlIGRvZXMgbm90IGdldAorCQkJCQkgKiBxdWV1ZWQuCisJCQkJCSAqLworCQkJCQkoKmhtc2dfbWdyLT5vbl9leGl0KSAoKHZvaWQgKikKKwkJCQkJCQkgICBtc2dfcXVldWVfb2JqLT5hcmcsCisJCQkJCQkJICAgbXNnLm1zZy5kd19hcmcxKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBOb3QgYW4gZXhpdCBhY2tub3dsZWRnZW1lbnQsIHF1ZXVlCisJCQkJCSAqIHRoZSBtZXNzYWdlLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFtc2dfcXVldWVfb2JqLT5tc2dfZnJlZV9saXN0KQorCQkJCQkJZ290byBmdW5jX2VuZDsKKwkJCQkJcG1zZyA9IChzdHJ1Y3QgbXNnX2ZyYW1lICopbHN0X2dldF9oZWFkCisJCQkJCSAgICAobXNnX3F1ZXVlX29iai0+bXNnX2ZyZWVfbGlzdCk7CisJCQkJCWlmIChtc2dfcXVldWVfb2JqLT5tc2dfdXNlZF9saXN0CisJCQkJCSAgICAmJiBwbXNnKSB7CisJCQkJCQlwbXNnLT5tc2dfZGF0YSA9IG1zZzsKKwkJCQkJCWxzdF9wdXRfdGFpbAorCQkJCQkJIChtc2dfcXVldWVfb2JqLT5tc2dfdXNlZF9saXN0LAorCQkJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKXBtc2cpOworCQkJCQkJbnRmeV9ub3RpZnkKKwkJCQkJCSAgICAobXNnX3F1ZXVlX29iai0+bnRmeV9vYmosCisJCQkJCQkgICAgIERTUF9OT0RFTUVTU0FHRVJFQURZKTsKKwkJCQkJCXN5bmNfc2V0X2V2ZW50CisJCQkJCQkgICAgKG1zZ19xdWV1ZV9vYmotPnN5bmNfZXZlbnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoKKwkJCQkJCSAqIE5vIGZyZWUgZnJhbWUgdG8gY29weSB0aGUKKwkJCQkJCSAqIG1lc3NhZ2UgaW50by4KKwkJCQkJCSAqLworCQkJCQkJcHJfZXJyKCIlczogbm8gZnJlZSBtc2cgZnJhbWVzLCIKKwkJCQkJCSAgICAgICAiIGRpc2NhcmRpbmcgbXNnXG4iLAorCQkJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFobXNnX21nci0+cXVldWVfbGlzdCB8fCAhbXNnX3F1ZXVlX29iaikKKwkJCQlnb3RvIGZ1bmNfZW5kOworCQkJbXNnX3F1ZXVlX29iaiA9CisJCQkgICAgKHN0cnVjdCBtc2dfcXVldWUgKilsc3RfbmV4dChobXNnX21nci0+cXVldWVfbGlzdCwKKwkJCQkJCQkgKHN0cnVjdCBsaXN0X2hlYWQgKikKKwkJCQkJCQkgbXNnX3F1ZXVlX29iaik7CisJCX0KKwl9CisJLyogU2V0IHRoZSBwb3N0IFNXSSBmbGFnICovCisJaWYgKG51bV9tc2dzID4gMCkgeworCQkvKiBUZWxsIHRoZSBEU1Agd2UndmUgcmVhZCB0aGUgbWVzc2FnZXMgKi8KKwkJbXNnX2N0cl9vYmotPmJ1Zl9lbXB0eSA9IHRydWU7CisJCW1zZ19jdHJfb2JqLT5wb3N0X3N3aSA9IHRydWU7CisJCXNtX2ludGVycnVwdF9kc3AocGlvX21nci0+aGJyaWRnZV9jb250ZXh0LCBNQlhfUENQWV9DTEFTUyk7CisJfQorZnVuY19lbmQ6CisJcmV0dXJuOworfQorCisvKgorICogID09PT09PT09IG5vdGlmeV9jaG5sX2NvbXBsZXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU2lnbmFsIHRoZSBjaGFubmVsIGV2ZW50LCBub3RpZnlpbmcgdGhlIGNsaWVudCB0aGF0IEkvTyBoYXMgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCBub3RpZnlfY2hubF9jb21wbGV0ZShzdHJ1Y3QgY2hubF9vYmplY3QgKnBjaG5sLAorCQkJCSBzdHJ1Y3QgY2hubF9pcnAgKmNobmxfcGFja2V0X29iaikKK3sKKwlib29sIHNpZ25hbF9ldmVudDsKKworCWlmICghcGNobmwgfHwgIXBjaG5sLT5zeW5jX2V2ZW50IHx8CisJICAgICFwY2hubC0+cGlvX2NvbXBsZXRpb25zIHx8ICFjaG5sX3BhY2tldF9vYmopCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKgorCSAqIE5vdGU6IHdlIHNpZ25hbCB0aGUgY2hhbm5lbCBldmVudCBvbmx5IGlmIHRoZSBxdWV1ZSBvZiBJTworCSAqIGNvbXBsZXRpb25zIGlzIGVtcHR5LiAgSWYgaXQgaXMgbm90IGVtcHR5LCB0aGUgZXZlbnQgaXMgc3VyZSB0byBiZQorCSAqIHNpZ25hbGxlZCBieSB0aGUgb25seSBJTyBjb21wbGV0aW9uIGxpc3QgY29uc3VtZXI6CisJICogYnJpZGdlX2NobmxfZ2V0X2lvYygpLgorCSAqLworCXNpZ25hbF9ldmVudCA9IExTVF9JU19FTVBUWShwY2hubC0+cGlvX2NvbXBsZXRpb25zKTsKKwkvKiBFbnF1ZXVlIHRoZSBJTyBjb21wbGV0aW9uIGluZm8gZm9yIHRoZSBjbGllbnQgKi8KKwlsc3RfcHV0X3RhaWwocGNobmwtPnBpb19jb21wbGV0aW9ucywKKwkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKWNobmxfcGFja2V0X29iaik7CisJcGNobmwtPmNpb19jcysrOworCisJaWYgKHBjaG5sLT5jaW9fY3MgPiBwY2hubC0+Y2hubF9wYWNrZXRzKQorCQlnb3RvIGZ1bmNfZW5kOworCS8qIFNpZ25hbCB0aGUgY2hhbm5lbCBldmVudCAoaWYgbm90IGFscmVhZHkgc2V0KSB0aGF0IElPIGlzIGNvbXBsZXRlICovCisJaWYgKHNpZ25hbF9ldmVudCkKKwkJc3luY19zZXRfZXZlbnQocGNobmwtPnN5bmNfZXZlbnQpOworCisJLyogTm90aWZ5IHRoYXQgSU8gaXMgY29tcGxldGUgKi8KKwludGZ5X25vdGlmeShwY2hubC0+bnRmeV9vYmosIERTUF9TVFJFQU1JT0NPTVBMRVRJT04pOworZnVuY19lbmQ6CisJcmV0dXJuOworfQorCisvKgorICogID09PT09PT09IG91dHB1dF9jaG5sID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzcGF0Y2ggYSBidWZmZXIgb24gYW4gb3V0cHV0IGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkIG91dHB1dF9jaG5sKHN0cnVjdCBpb19tZ3IgKnBpb19tZ3IsIHN0cnVjdCBjaG5sX29iamVjdCAqcGNobmwsCisJCQl1OCBpb19tb2RlKQoreworCXN0cnVjdCBjaG5sX21nciAqY2hubF9tZ3Jfb2JqOworCXN0cnVjdCBzaG0gKnNtOworCXUzMiBjaG5sX2lkOworCXN0cnVjdCBjaG5sX2lycCAqY2hubF9wYWNrZXRfb2JqOworCXUzMiBkd19kc3BfZl9tYXNrOworCisJY2hubF9tZ3Jfb2JqID0gcGlvX21nci0+aGNobmxfbWdyOworCXNtID0gcGlvX21nci0+c2hhcmVkX21lbTsKKwkvKiBBdHRlbXB0IHRvIHBlcmZvcm0gb3V0cHV0ICovCisJaWYgKHNtLT5vdXRwdXRfZnVsbCkKKwkJZ290byBmdW5jX2VuZDsKKworCWlmIChwY2hubCAmJiAhKChwY2hubC0+ZHdfc3RhdGUgJiB+Q0hOTF9TVEFURUVPUykgPT0gQ0hOTF9TVEFURVJFQURZKSkKKwkJZ290byBmdW5jX2VuZDsKKworCS8qIExvb2sgdG8gc2VlIGlmIGJvdGggYSBQQyBhbmQgRFNQIG91dHB1dCBjaGFubmVsIGFyZSByZWFkeSAqLworCWR3X2RzcF9mX21hc2sgPSBzbS0+ZHNwX2ZyZWVfbWFzazsKKwljaG5sX2lkID0KKwkgICAgZmluZF9yZWFkeV9vdXRwdXQoY2hubF9tZ3Jfb2JqLCBwY2hubCwKKwkJCSAgICAgIChjaG5sX21ncl9vYmotPmR3X291dHB1dF9tYXNrICYgZHdfZHNwX2ZfbWFzaykpOworCWlmIChjaG5sX2lkID09IE9VVFBVVE5PVFJFQURZKQorCQlnb3RvIGZ1bmNfZW5kOworCisJcGNobmwgPSBjaG5sX21ncl9vYmotPmFwX2NoYW5uZWxbY2hubF9pZF07CisJaWYgKCFwY2hubCB8fCAhcGNobmwtPnBpb19yZXF1ZXN0cykgeworCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KKwkJZ290byBmdW5jX2VuZDsKKwl9CisJLyogR2V0IHRoZSBJL08gcmVxdWVzdCwgYW5kIGF0dGVtcHQgYSB0cmFuc2ZlciAqLworCWNobmxfcGFja2V0X29iaiA9IChzdHJ1Y3QgY2hubF9pcnAgKilsc3RfZ2V0X2hlYWQocGNobmwtPnBpb19yZXF1ZXN0cyk7CisJaWYgKCFjaG5sX3BhY2tldF9vYmopCisJCWdvdG8gZnVuY19lbmQ7CisKKwlwY2hubC0+Y2lvX3JlcXMtLTsKKwlpZiAocGNobmwtPmNpb19yZXFzIDwgMCB8fCAhcGNobmwtPnBpb19yZXF1ZXN0cykKKwkJZ290byBmdW5jX2VuZDsKKworCS8qIFJlY29yZCBmYWN0IHRoYXQgbm8gbW9yZSBJL08gYnVmZmVycyBhdmFpbGFibGUgKi8KKwlpZiAoTFNUX0lTX0VNUFRZKHBjaG5sLT5waW9fcmVxdWVzdHMpKQorCQljaG5sX21ncl9vYmotPmR3X291dHB1dF9tYXNrICY9IH4oMSA8PCBjaG5sX2lkKTsKKworCS8qIFRyYW5zZmVyIGJ1ZmZlciB0byBEU1Agc2lkZSAqLworCWNobmxfcGFja2V0X29iai0+Ynl0ZV9zaXplID0gbWluKHBpb19tZ3ItPnVzbV9idWZfc2l6ZSwKKwkJCQkJY2hubF9wYWNrZXRfb2JqLT5ieXRlX3NpemUpOworCW1lbWNweShwaW9fbWdyLT5vdXRwdXQsCWNobmxfcGFja2V0X29iai0+aG9zdF9zeXNfYnVmLAorCQkJCQljaG5sX3BhY2tldF9vYmotPmJ5dGVfc2l6ZSk7CisJcGNobmwtPmJ5dGVzX21vdmVkICs9IGNobmxfcGFja2V0X29iai0+Ynl0ZV9zaXplOworCS8qIFdyaXRlIGFsbCAzMiBiaXRzIG9mIGFyZyAqLworCXNtLT5hcmcgPSBjaG5sX3BhY2tldF9vYmotPmR3X2FyZzsKKyNpZiBfQ0hOTF9XT1JEU0laRSA9PSAyCisJLyogQWNjZXNzIGNhbiBiZSBkaWZmZXJlbnQgU00gYWNjZXNzIHdvcmQgc2l6ZSAoZS5nLiAxNi8zMiBiaXQgd29yZHMpICovCisJc20tPm91dHB1dF9pZCA9ICh1MTYpIGNobmxfaWQ7CisJc20tPm91dHB1dF9zaXplID0gKHUxNikgKGNobmxfcGFja2V0X29iai0+Ynl0ZV9zaXplICsKKwkJCQljaG5sX21ncl9vYmotPndvcmRfc2l6ZSAtIDEpIC8KKwkJCQkodTE2KSBjaG5sX21ncl9vYmotPndvcmRfc2l6ZTsKKyNlbHNlCisJc20tPm91dHB1dF9pZCA9IGNobmxfaWQ7CisJc20tPm91dHB1dF9zaXplID0gKGNobmxfcGFja2V0X29iai0+Ynl0ZV9zaXplICsKKwkJCWNobmxfbWdyX29iai0+d29yZF9zaXplIC0gMSkgLyBjaG5sX21ncl9vYmotPndvcmRfc2l6ZTsKKyNlbmRpZgorCXNtLT5vdXRwdXRfZnVsbCA9ICAxOworCS8qIEluZGljYXRlIHRvIHRoZSBEU1Agd2UgaGF2ZSB3cml0dGVuIHRoZSBvdXRwdXQgKi8KKwlzbV9pbnRlcnJ1cHRfZHNwKHBpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwgTUJYX1BDUFlfQ0xBU1MpOworCS8qIE5vdGlmeSBjbGllbnQgd2l0aCBJTyBjb21wbGV0aW9uIHJlY29yZCAoa2VlcCBFT1MpICovCisJY2hubF9wYWNrZXRfb2JqLT5zdGF0dXMgJj0gQ0hOTF9JT0NTVEFURU9TOworCW5vdGlmeV9jaG5sX2NvbXBsZXRlKHBjaG5sLCBjaG5sX3BhY2tldF9vYmopOworCS8qIE5vdGlmeSBpZiBzdHJlYW0gaXMgZG9uZS4gKi8KKwlpZiAoY2hubF9wYWNrZXRfb2JqLT5zdGF0dXMgJiBDSE5MX0lPQ1NUQVRFT1MpCisJCW50Znlfbm90aWZ5KHBjaG5sLT5udGZ5X29iaiwgRFNQX1NUUkVBTURPTkUpOworCitmdW5jX2VuZDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgPT09PT09PT0gb3V0cHV0X21zZyA9PT09PT09PQorICogICAgICBDb3BpZXMgbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBxdWV1ZXMgdG8gdGhlIHNoYXJlZCBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIG91dHB1dF9tc2coc3RydWN0IGlvX21nciAqcGlvX21nciwgc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyKQoreworCXUzMiBudW1fbXNncyA9IDA7CisJdTMyIGk7CisJdTggKm1zZ19vdXRwdXQ7CisJc3RydWN0IG1zZ19mcmFtZSAqcG1zZzsKKwlzdHJ1Y3QgbXNnX2N0cmwgKm1zZ19jdHJfb2JqOworCXUzMiBvdXRwdXRfZW1wdHk7CisJdTMyIHZhbDsKKwl1MzIgYWRkcjsKKworCW1zZ19jdHJfb2JqID0gcGlvX21nci0+bXNnX291dHB1dF9jdHJsOworCisJLyogQ2hlY2sgaWYgb3V0cHV0IGhhcyBiZWVuIGNsZWFyZWQgKi8KKwlvdXRwdXRfZW1wdHkgPSBtc2dfY3RyX29iai0+YnVmX2VtcHR5OworCWlmIChvdXRwdXRfZW1wdHkpIHsKKwkJbnVtX21zZ3MgPSAoaG1zZ19tZ3ItPm1zZ3NfcGVuZGluZyA+IGhtc2dfbWdyLT5tYXhfbXNncykgPworCQkgICAgaG1zZ19tZ3ItPm1heF9tc2dzIDogaG1zZ19tZ3ItPm1zZ3NfcGVuZGluZzsKKwkJbXNnX291dHB1dCA9IHBpb19tZ3ItPm1zZ19vdXRwdXQ7CisJCS8qIENvcHkgbnVtX21zZ3MgbWVzc2FnZXMgaW50byBzaGFyZWQgbWVtb3J5ICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fbXNnczsgaSsrKSB7CisJCQlpZiAoIWhtc2dfbWdyLT5tc2dfdXNlZF9saXN0KSB7CisJCQkJcG1zZyA9IE5VTEw7CisJCQkJZ290byBmdW5jX2VuZDsKKwkJCX0gZWxzZSB7CisJCQkJcG1zZyA9IChzdHJ1Y3QgbXNnX2ZyYW1lICopCisJCQkJICAgIGxzdF9nZXRfaGVhZChobXNnX21nci0+bXNnX3VzZWRfbGlzdCk7CisJCQl9CisJCQlpZiAocG1zZyAhPSBOVUxMKSB7CisJCQkJdmFsID0gKHBtc2ctPm1zZ19kYXRhKS5tc2dxX2lkOworCQkJCWFkZHIgPSAodTMyKSAmKCgoc3RydWN0IG1zZ19kc3Btc2cgKikKKwkJCQkJCSBtc2dfb3V0cHV0KS0+bXNncV9pZCk7CisJCQkJd3JpdGVfZXh0MzJfYml0X2RzcF9kYXRhKAorCQkJCQlwaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsIGFkZHIsIHZhbCk7CisJCQkJdmFsID0gKHBtc2ctPm1zZ19kYXRhKS5tc2cuZHdfY21kOworCQkJCWFkZHIgPSAodTMyKSAmKCgoKHN0cnVjdCBtc2dfZHNwbXNnICopCisJCQkJCQkgIG1zZ19vdXRwdXQpLT5tc2cpLmR3X2NtZCk7CisJCQkJd3JpdGVfZXh0MzJfYml0X2RzcF9kYXRhKAorCQkJCQlwaW9fbWdyLT5oYnJpZGdlX2NvbnRleHQsIGFkZHIsIHZhbCk7CisJCQkJdmFsID0gKHBtc2ctPm1zZ19kYXRhKS5tc2cuZHdfYXJnMTsKKwkJCQlhZGRyID0gKHUzMikgJigoKChzdHJ1Y3QgbXNnX2RzcG1zZyAqKQorCQkJCQkJICBtc2dfb3V0cHV0KS0+bXNnKS5kd19hcmcxKTsKKwkJCQl3cml0ZV9leHQzMl9iaXRfZHNwX2RhdGEoCisJCQkJCXBpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwgYWRkciwgdmFsKTsKKwkJCQl2YWwgPSAocG1zZy0+bXNnX2RhdGEpLm1zZy5kd19hcmcyOworCQkJCWFkZHIgPSAodTMyKSAmKCgoKHN0cnVjdCBtc2dfZHNwbXNnICopCisJCQkJCQkgIG1zZ19vdXRwdXQpLT5tc2cpLmR3X2FyZzIpOworCQkJCXdyaXRlX2V4dDMyX2JpdF9kc3BfZGF0YSgKKwkJCQkJcGlvX21nci0+aGJyaWRnZV9jb250ZXh0LCBhZGRyLCB2YWwpOworCQkJCW1zZ19vdXRwdXQgKz0gc2l6ZW9mKHN0cnVjdCBtc2dfZHNwbXNnKTsKKwkJCQlpZiAoIWhtc2dfbWdyLT5tc2dfZnJlZV9saXN0KQorCQkJCQlnb3RvIGZ1bmNfZW5kOworCQkJCWxzdF9wdXRfdGFpbChobXNnX21nci0+bXNnX2ZyZWVfbGlzdCwKKwkJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKXBtc2cpOworCQkJCXN5bmNfc2V0X2V2ZW50KGhtc2dfbWdyLT5zeW5jX2V2ZW50KTsKKwkJCX0KKwkJfQorCisJCWlmIChudW1fbXNncyA+IDApIHsKKwkJCWhtc2dfbWdyLT5tc2dzX3BlbmRpbmcgLT0gbnVtX21zZ3M7CisjaWYgX0NITkxfV09SRFNJWkUgPT0gMgorCQkJLyoKKwkJCSAqIEFjY2VzcyBjYW4gYmUgZGlmZmVyZW50IFNNIGFjY2VzcyB3b3JkIHNpemUKKwkJCSAqIChlLmcuIDE2LzMyIGJpdCB3b3JkcykKKwkJCSAqLworCQkJbXNnX2N0cl9vYmotPnNpemUgPSAodTE2KSBudW1fbXNnczsKKyNlbHNlCisJCQltc2dfY3RyX29iai0+c2l6ZSA9IG51bV9tc2dzOworI2VuZGlmCisJCQltc2dfY3RyX29iai0+YnVmX2VtcHR5ID0gZmFsc2U7CisJCQkvKiBTZXQgdGhlIHBvc3QgU1dJIGZsYWcgKi8KKwkJCW1zZ19jdHJfb2JqLT5wb3N0X3N3aSA9IHRydWU7CisJCQkvKiBUZWxsIHRoZSBEU1Agd2UgaGF2ZSB3cml0dGVuIHRoZSBvdXRwdXQuICovCisJCQlzbV9pbnRlcnJ1cHRfZHNwKHBpb19tZ3ItPmhicmlkZ2VfY29udGV4dCwKKwkJCQkJCU1CWF9QQ1BZX0NMQVNTKTsKKwkJfQorCX0KK2Z1bmNfZW5kOgorCXJldHVybjsKK30KKworLyoKKyAqICA9PT09PT09PSByZWdpc3Rlcl9zaG1fc2VncyA9PT09PT09PQorICogIHB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVycyBHUFAgU00gc2VnbWVudCB3aXRoIENNTS4KKyAqLworc3RhdGljIGludCByZWdpc3Rlcl9zaG1fc2VncyhzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyLAorCQkJCSAgICBzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tYW4sCisJCQkJICAgIHUzMiBkd19ncHBfYmFzZV9wYSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgdWxfc2htMF9iYXNlID0gMDsKKwl1MzIgc2htMF9lbmQgPSAwOworCXUzMiB1bF9zaG0wX3JzcnZkX3N0YXJ0ID0gMDsKKwl1MzIgdWxfcnNydmRfc2l6ZSA9IDA7CisJdTMyIHVsX2dwcF9waHlzOworCXUzMiB1bF9kc3BfdmlydDsKKwl1MzIgdWxfc2htX3NlZ19pZDAgPSAwOworCXUzMiBkd19vZmZzZXQsIGR3X2dwcF9iYXNlX3ZhLCB1bF9kc3Bfc2l6ZTsKKworCS8qCisJICogUmVhZCBhZGRyZXNzIGFuZCBzaXplIGluZm8gZm9yIGZpcnN0IFNNIHJlZ2lvbi4KKwkgKiBHZXQgc3RhcnQgb2YgMXN0IFNNIEhlYXAgcmVnaW9uLgorCSAqLworCXN0YXR1cyA9CisJICAgIGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIFNITTBfU0hBUkVEX0JBU0VfU1lNLCAmdWxfc2htMF9iYXNlKTsKKwlpZiAodWxfc2htMF9iYXNlID09IDApIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkvKiBHZXQgZW5kIG9mIDFzdCBTTSBIZWFwIHJlZ2lvbiAqLworCWlmICghc3RhdHVzKSB7CisJCS8qIEdldCBzdGFydCBhbmQgbGVuZ3RoIG9mIG1lc3NhZ2UgcGFydCBvZiBzaGFyZWQgbWVtb3J5ICovCisJCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tYW4sIFNITTBfU0hBUkVEX0VORF9TWU0sCisJCQkJCSAgICZzaG0wX2VuZCk7CisJCWlmIChzaG0wX2VuZCA9PSAwKSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJfQorCS8qIFN0YXJ0IG9mIEdwcCByZXNlcnZlZCByZWdpb24gKi8KKwlpZiAoIXN0YXR1cykgeworCQkvKiBHZXQgc3RhcnQgYW5kIGxlbmd0aCBvZiBtZXNzYWdlIHBhcnQgb2Ygc2hhcmVkIG1lbW9yeSAqLworCQlzdGF0dXMgPQorCQkgICAgY29kX2dldF9zeW1fdmFsdWUoY29kX21hbiwgU0hNMF9TSEFSRURfUkVTRVJWRURfQkFTRV9TWU0sCisJCQkJICAgICAgJnVsX3NobTBfcnNydmRfc3RhcnQpOworCQlpZiAodWxfc2htMF9yc3J2ZF9zdGFydCA9PSAwKSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJfQorCS8qIFJlZ2lzdGVyIHdpdGggQ01NICovCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0gZGV2X2dldF9jbW1fbWdyKGhpb19tZ3ItPmhkZXZfb2JqLCAmaGlvX21nci0+aGNtbV9tZ3IpOworCQlpZiAoIXN0YXR1cykgeworCQkJc3RhdHVzID0gY21tX3VuX3JlZ2lzdGVyX2dwcHNtX3NlZyhoaW9fbWdyLT5oY21tX21nciwKKwkJCQkJCQkgICBDTU1fQUxMU0VHTUVOVFMpOworCQl9CisJfQorCS8qIFJlZ2lzdGVyIG5ldyBTTSByZWdpb24ocykgKi8KKwlpZiAoIXN0YXR1cyAmJiAoc2htMF9lbmQgLSB1bF9zaG0wX2Jhc2UpID4gMCkgeworCQkvKiBDYWxjIHNpemUgKGJ5dGVzKSBvZiBTTSB0aGUgR1BQIGNhbiBhbGxvYyBmcm9tICovCisJCXVsX3JzcnZkX3NpemUgPQorCQkgICAgKHNobTBfZW5kIC0gdWxfc2htMF9yc3J2ZF9zdGFydCArIDEpICogaGlvX21nci0+d29yZF9zaXplOworCQlpZiAodWxfcnNydmRfc2l6ZSA8PSAwKSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJCS8qIENhbGMgc2l6ZSBvZiBTTSBEU1AgY2FuIGFsbG9jIGZyb20gKi8KKwkJdWxfZHNwX3NpemUgPQorCQkgICAgKHVsX3NobTBfcnNydmRfc3RhcnQgLSB1bF9zaG0wX2Jhc2UpICogaGlvX21nci0+d29yZF9zaXplOworCQlpZiAodWxfZHNwX3NpemUgPD0gMCkgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCQkvKiBGaXJzdCBUTEIgZW50cnkgcmVzZXJ2ZWQgZm9yIEJyaWRnZSBTTSB1c2UuICovCisJCXVsX2dwcF9waHlzID0gaGlvX21nci0+ZXh0X3Byb2NfaW5mby50eV90bGJbMF0udWxfZ3BwX3BoeXM7CisJCS8qIEdldCBzaXplIGluIGJ5dGVzICovCisJCXVsX2RzcF92aXJ0ID0KKwkJICAgIGhpb19tZ3ItPmV4dF9wcm9jX2luZm8udHlfdGxiWzBdLnVsX2RzcF92aXJ0ICoKKwkJICAgIGhpb19tZ3ItPndvcmRfc2l6ZTsKKwkJLyoKKwkJICogQ2FsYyBieXRlIG9mZnNldCB1c2VkIHRvIGNvbnZlcnQgR1BQIHBoeXMgPC0+IERTUCBieXRlCisJCSAqIGFkZHJlc3MuCisJCSAqLworCQlpZiAoZHdfZ3BwX2Jhc2VfcGEgPiB1bF9kc3BfdmlydCkKKwkJCWR3X29mZnNldCA9IGR3X2dwcF9iYXNlX3BhIC0gdWxfZHNwX3ZpcnQ7CisJCWVsc2UKKwkJCWR3X29mZnNldCA9IHVsX2RzcF92aXJ0IC0gZHdfZ3BwX2Jhc2VfcGE7CisKKwkJaWYgKHVsX3NobTBfcnNydmRfc3RhcnQgKiBoaW9fbWdyLT53b3JkX3NpemUgPCB1bF9kc3BfdmlydCkgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCQkvKgorCQkgKiBDYWxjIEdwcCBwaHlzIGJhc2Ugb2YgU00gcmVnaW9uLgorCQkgKiBUaGlzIGlzIGFjdHVhbGx5IHVuY2FjaGVkIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MuCisJCSAqLworCQlkd19ncHBfYmFzZV92YSA9CisJCSAgICB1bF9ncHBfcGh5cyArIHVsX3NobTBfcnNydmRfc3RhcnQgKiBoaW9fbWdyLT53b3JkX3NpemUgLQorCQkgICAgdWxfZHNwX3ZpcnQ7CisJCS8qCisJCSAqIENhbGMgR3BwIHBoeXMgYmFzZSBvZiBTTSByZWdpb24uCisJCSAqIFRoaXMgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MuCisJCSAqLworCQlkd19ncHBfYmFzZV9wYSA9CisJCSAgICBkd19ncHBfYmFzZV9wYSArIHVsX3NobTBfcnNydmRfc3RhcnQgKiBoaW9fbWdyLT53b3JkX3NpemUgLQorCQkgICAgdWxfZHNwX3ZpcnQ7CisJCS8qIFJlZ2lzdGVyIFNNIFNlZ21lbnQgMC4gKi8KKwkJc3RhdHVzID0KKwkJICAgIGNtbV9yZWdpc3Rlcl9ncHBzbV9zZWcoaGlvX21nci0+aGNtbV9tZ3IsIGR3X2dwcF9iYXNlX3BhLAorCQkJCQkgICB1bF9yc3J2ZF9zaXplLCBkd19vZmZzZXQsCisJCQkJCSAgIChkd19ncHBfYmFzZV9wYSA+CisJCQkJCSAgICB1bF9kc3BfdmlydCkgPyBDTU1fQUREVE9EU1BQQSA6CisJCQkJCSAgIENNTV9TVUJGUk9NRFNQUEEsCisJCQkJCSAgICh1MzIpICh1bF9zaG0wX2Jhc2UgKgorCQkJCQkJICBoaW9fbWdyLT53b3JkX3NpemUpLAorCQkJCQkgICB1bF9kc3Bfc2l6ZSwgJnVsX3NobV9zZWdfaWQwLAorCQkJCQkgICBkd19ncHBfYmFzZV92YSk7CisJCS8qIEZpcnN0IFNNIHJlZ2lvbiBpcyBzZWdfaWQgPSAxICovCisJCWlmICh1bF9zaG1fc2VnX2lkMCAhPSAxKQorCQkJc3RhdHVzID0gLUVQRVJNOworCX0KK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFpDUFkgSU8gcm91dGluZXMuICovCisvKgorICogID09PT09PT09IElPX1NITWNvbnRyb2wgPT09PT09PT0KKyAqICAgICAgU2V0cyB0aGUgcmVxdWVzdGVkIHNobSBzZXR0aW5nLgorICovCitpbnQgaW9fc2hfbXNldHRpbmcoc3RydWN0IGlvX21nciAqaGlvX21nciwgdTggZGVzYywgdm9pZCAqcGFyZ3MpCit7CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKwl1MzIgaTsKKwlzdHJ1Y3QgZHNwYnJpZGdlX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkgICAgb21hcF9kc3BicmlkZ2VfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXN3aXRjaCAoZGVzYykgeworCWNhc2UgU0hNX0NVUlJPUFA6CisJCS8qIFVwZGF0ZSB0aGUgc2hhcmVkIG1lbW9yeSB3aXRoIHJlcXVlc3RlZCBPUFAgaW5mb3JtYXRpb24gKi8KKwkJaWYgKHBhcmdzICE9IE5VTEwpCisJCQloaW9fbWdyLT5zaGFyZWRfbWVtLT5vcHBfdGFibGVfc3RydWN0LmN1cnJfb3BwX3B0ID0KKwkJCSAgICAqKHUzMiAqKSBwYXJnczsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJYnJlYWs7CisJY2FzZSBTSE1fT1BQSU5GTzoKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBzaGFyZWQgbWVtb3J5IHdpdGggdGhlIHZvbHRhZ2UsIGZyZXF1ZW5jeSwKKwkJICogbWluIGFuZCBtYXggZnJlcXVlbmN5IHZhbHVlcyBmb3IgYW4gT1BQLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8PSBkc3BfbWF4X29wcHM7IGkrKykgeworCQkJaGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3RhYmxlX3N0cnVjdC5vcHBfcG9pbnRbaV0uCisJCQkgICAgdm9sdGFnZSA9IHZkZDFfZHNwX2ZyZXFbaV1bMF07CisJCQlkZXZfZGJnKGJyaWRnZSwgIk9QUC1zaG06IHZvbHRhZ2U6ICVkXG4iLAorCQkJCXZkZDFfZHNwX2ZyZXFbaV1bMF0pOworCQkJaGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3RhYmxlX3N0cnVjdC4KKwkJCSAgICBvcHBfcG9pbnRbaV0uZnJlcXVlbmN5ID0gdmRkMV9kc3BfZnJlcVtpXVsxXTsKKwkJCWRldl9kYmcoYnJpZGdlLCAiT1BQLXNobTogZnJlcXVlbmN5OiAlZFxuIiwKKwkJCQl2ZGQxX2RzcF9mcmVxW2ldWzFdKTsKKwkJCWhpb19tZ3ItPnNoYXJlZF9tZW0tPm9wcF90YWJsZV9zdHJ1Y3Qub3BwX3BvaW50W2ldLgorCQkJICAgIG1pbl9mcmVxID0gdmRkMV9kc3BfZnJlcVtpXVsyXTsKKwkJCWRldl9kYmcoYnJpZGdlLCAiT1BQLXNobTogbWluIGZyZXE6ICVkXG4iLAorCQkJCXZkZDFfZHNwX2ZyZXFbaV1bMl0pOworCQkJaGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3RhYmxlX3N0cnVjdC5vcHBfcG9pbnRbaV0uCisJCQkgICAgbWF4X2ZyZXEgPSB2ZGQxX2RzcF9mcmVxW2ldWzNdOworCQkJZGV2X2RiZyhicmlkZ2UsICJPUFAtc2htOiBtYXggZnJlcTogJWRcbiIsCisJCQkJdmRkMV9kc3BfZnJlcVtpXVszXSk7CisJCX0KKwkJaGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3RhYmxlX3N0cnVjdC5udW1fb3BwX3B0cyA9CisJCSAgICBkc3BfbWF4X29wcHM7CisJCWRldl9kYmcoYnJpZGdlLCAiT1BQLXNobTogbWF4IE9QUCBudW1iZXI6ICVkXG4iLCBkc3BfbWF4X29wcHMpOworCQkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgT1BQIG51bWJlciAqLworCQlpZiAocGRhdGEtPmRzcF9nZXRfb3BwKQorCQkJaSA9ICgqcGRhdGEtPmRzcF9nZXRfb3BwKSAoKTsKKwkJaGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3RhYmxlX3N0cnVjdC5jdXJyX29wcF9wdCA9IGk7CisJCWRldl9kYmcoYnJpZGdlLCAiT1BQLXNobTogdmFsdWUgcHJvZ3JhbW1lZCA9ICVkXG4iLCBpKTsKKwkJYnJlYWs7CisJY2FzZSBTSE1fR0VUT1BQOgorCQkvKiBHZXQgdGhlIE9QUCB0aGF0IERTUCBoYXMgcmVxdWVzdGVkICovCisJCSoodTMyICopIHBhcmdzID0gaGlvX21nci0+c2hhcmVkX21lbS0+b3BwX3JlcXVlc3QucnFzdF9vcHBfcHQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9pb19nZXRfcHJvY19sb2FkID09PT09PT09CisgKiAgICAgIEdldHMgdGhlIFByb2Nlc3NvcidzIExvYWQgaW5mb3JtYXRpb24KKyAqLworaW50IGJyaWRnZV9pb19nZXRfcHJvY19sb2FkKHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IsCisJCQkJc3RydWN0IGRzcF9wcm9jbG9hZHN0YXQgKnByb2NfbHN0YXQpCit7CisJcHJvY19sc3RhdC0+Y3Vycl9sb2FkID0KKwkJCWhpb19tZ3ItPnNoYXJlZF9tZW0tPmxvYWRfbW9uX2luZm8uY3Vycl9kc3BfbG9hZDsKKwlwcm9jX2xzdGF0LT5wcmVkaWN0ZWRfbG9hZCA9CisJICAgIGhpb19tZ3ItPnNoYXJlZF9tZW0tPmxvYWRfbW9uX2luZm8ucHJlZF9kc3BfbG9hZDsKKwlwcm9jX2xzdGF0LT5jdXJyX2RzcF9mcmVxID0KKwkgICAgaGlvX21nci0+c2hhcmVkX21lbS0+bG9hZF9tb25faW5mby5jdXJyX2RzcF9mcmVxOworCXByb2NfbHN0YXQtPnByZWRpY3RlZF9mcmVxID0KKwkgICAgaGlvX21nci0+c2hhcmVkX21lbS0+bG9hZF9tb25faW5mby5wcmVkX2RzcF9mcmVxOworCisJZGV2X2RiZyhicmlkZ2UsICJDdXJyIExvYWQgPSAlZCwgUHJlZCBMb2FkID0gJWQsIEN1cnIgRnJlcSA9ICVkLCAiCisJCSJQcmVkIEZyZXEgPSAlZFxuIiwgcHJvY19sc3RhdC0+Y3Vycl9sb2FkLAorCQlwcm9jX2xzdGF0LT5wcmVkaWN0ZWRfbG9hZCwgcHJvY19sc3RhdC0+Y3Vycl9kc3BfZnJlcSwKKwkJcHJvY19sc3RhdC0+cHJlZGljdGVkX2ZyZXEpOworCXJldHVybiAwOworfQorCit2b2lkIGlvX3NtX2luaXQodm9pZCkKK3sKKwkvKiBEbyBub3RoaW5nICovCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9CQUNLVFJBQ0UpIHx8IGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0RFQlVHKQordm9pZCBwcmludF9kc3BfZGVidWdfdHJhY2Uoc3RydWN0IGlvX21nciAqaGlvX21ncikKK3sKKwl1MzIgdWxfbmV3X21lc3NhZ2VfbGVuZ3RoID0gMCwgdWxfZ3BwX2N1cl9wb2ludGVyOworCisJd2hpbGUgKHRydWUpIHsKKwkJLyogR2V0IHRoZSBEU1AgY3VycmVudCBwb2ludGVyICovCisJCXVsX2dwcF9jdXJfcG9pbnRlciA9CisJCSAgICAqKHUzMiAqKSAoaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2N1cnJlbnQpOworCQl1bF9ncHBfY3VyX3BvaW50ZXIgPQorCQkgICAgaGlvX21nci0+dWxfZ3BwX3ZhICsgKHVsX2dwcF9jdXJfcG9pbnRlciAtCisJCQkJCSAgaGlvX21nci0+dWxfZHNwX3ZhKTsKKworCQkvKiBObyBuZXcgZGVidWcgbWVzc2FnZXMgYXZhaWxhYmxlIHlldCAqLworCQlpZiAodWxfZ3BwX2N1cl9wb2ludGVyID09IGhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHVsX2dwcF9jdXJfcG9pbnRlciA+IGhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIpIHsKKwkJCS8qIENvbnRpbnVvdXMgZGF0YSAqLworCQkJdWxfbmV3X21lc3NhZ2VfbGVuZ3RoID0KKwkJCSAgICB1bF9ncHBfY3VyX3BvaW50ZXIgLSBoaW9fbWdyLT51bF9ncHBfcmVhZF9wb2ludGVyOworCisJCQltZW1jcHkoaGlvX21nci0+cG1zZywKKwkJCSAgICAgICAoY2hhciAqKWhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIsCisJCQkgICAgICAgdWxfbmV3X21lc3NhZ2VfbGVuZ3RoKTsKKwkJCWhpb19tZ3ItPnBtc2dbdWxfbmV3X21lc3NhZ2VfbGVuZ3RoXSA9ICdcMCc7CisJCQkvKgorCQkJICogQWR2YW5jZSB0aGUgR1BQIHRyYWNlIHBvaW50ZXIgdG8gRFNQIGN1cnJlbnQKKwkJCSAqIHBvaW50ZXIuCisJCQkgKi8KKwkJCWhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIgKz0gdWxfbmV3X21lc3NhZ2VfbGVuZ3RoOworCQkJLyogUHJpbnQgdGhlIHRyYWNlIG1lc3NhZ2VzICovCisJCQlwcl9pbmZvKCJEU1BUcmFjZTogJXNcbiIsIGhpb19tZ3ItPnBtc2cpOworCQl9IGVsc2UgaWYgKHVsX2dwcF9jdXJfcG9pbnRlciA8IGhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIpIHsKKwkJCS8qIEhhbmRsZSB0cmFjZSBidWZmZXIgd3JhcGFyb3VuZCAqLworCQkJbWVtY3B5KGhpb19tZ3ItPnBtc2csCisJCQkgICAgICAgKGNoYXIgKiloaW9fbWdyLT51bF9ncHBfcmVhZF9wb2ludGVyLAorCQkJICAgICAgIGhpb19tZ3ItPnVsX3RyYWNlX2J1ZmZlcl9lbmQgLQorCQkJICAgICAgIGhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIpOworCQkJdWxfbmV3X21lc3NhZ2VfbGVuZ3RoID0KKwkJCSAgICB1bF9ncHBfY3VyX3BvaW50ZXIgLSBoaW9fbWdyLT51bF90cmFjZV9idWZmZXJfYmVnaW47CisJCQltZW1jcHkoJmhpb19tZ3ItPnBtc2dbaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2VuZCAtCisJCQkJCSAgICAgIGhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXJdLAorCQkJICAgICAgIChjaGFyICopaGlvX21nci0+dWxfdHJhY2VfYnVmZmVyX2JlZ2luLAorCQkJICAgICAgIHVsX25ld19tZXNzYWdlX2xlbmd0aCk7CisJCQloaW9fbWdyLT5wbXNnW2hpb19tZ3ItPnVsX3RyYWNlX2J1ZmZlcl9lbmQgLQorCQkJCSAgICAgIGhpb19tZ3ItPnVsX2dwcF9yZWFkX3BvaW50ZXIgKworCQkJCSAgICAgIHVsX25ld19tZXNzYWdlX2xlbmd0aF0gPSAnXDAnOworCQkJLyoKKwkJCSAqIEFkdmFuY2UgdGhlIEdQUCB0cmFjZSBwb2ludGVyIHRvIERTUCBjdXJyZW50CisJCQkgKiBwb2ludGVyLgorCQkJICovCisJCQloaW9fbWdyLT51bF9ncHBfcmVhZF9wb2ludGVyID0KKwkJCSAgICBoaW9fbWdyLT51bF90cmFjZV9idWZmZXJfYmVnaW4gKworCQkJICAgIHVsX25ld19tZXNzYWdlX2xlbmd0aDsKKwkJCS8qIFByaW50IHRoZSB0cmFjZSBtZXNzYWdlcyAqLworCQkJcHJfaW5mbygiRFNQVHJhY2U6ICVzXG4iLCBoaW9fbWdyLT5wbXNnKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0JBQ0tUUkFDRQorLyoKKyAqICA9PT09PT09PSBwcmludF9kc3BfdHJhY2VfYnVmZmVyID09PT09PT09CisgKiAgICAgIFByaW50cyB0aGUgdHJhY2UgYnVmZmVyIHJldHVybmVkIGZyb20gdGhlIERTUCAoaWYgREJHX1RyYWNlIGlzIGVuYWJsZWQpLgorICogIFBhcmFtZXRlcnM6CisgKiAgICBoZGVoX21ncjogICAgICAgICAgSGFuZGxlIHRvIERFSCBtYW5hZ2VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGV4dHJhIGNhcnJpYWdlIHJldHVybnMgdG8gZ2VuZXJhdGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FTk9NRU06ICAgIFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGhkZWhfbWdyIG11c2UgYmUgdmFsaWQuIENoZWNrZWQgaW4gYnJpZGdlX2RlaF9ub3RpZnkuCisgKi8KK2ludCBwcmludF9kc3BfdHJhY2VfYnVmZmVyKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmhicmlkZ2VfY29udGV4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3I7CisJdTMyIHVsX3RyYWNlX2VuZDsKKwl1MzIgdWxfdHJhY2VfYmVnaW47CisJdTMyIHRyYWNlX2N1cl9wb3M7CisJdTMyIHVsX251bV9ieXRlcyA9IDA7CisJdTMyIHVsX251bV93b3JkcyA9IDA7CisJdTMyIHVsX3dvcmRfc2l6ZSA9IDI7CisJY2hhciAqcHN6X2J1ZjsKKwljaGFyICpzdHJfYmVnOworCWNoYXIgKnRyYWNlX2VuZDsKKwljaGFyICpidWZfZW5kOworCWNoYXIgKm5ld19saW5lOworCisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqcGJyaWRnZV9jb250ZXh0ID0gaGJyaWRnZV9jb250ZXh0OworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopCisJICAgIHBicmlkZ2VfY29udGV4dC0+aGRldl9vYmo7CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2NvZF9tZ3IoZGV2X29iaiwgJmNvZF9tZ3IpOworCisJaWYgKGNvZF9tZ3IpIHsKKwkJLyogTG9vayBmb3IgU1lTX1BVVENCRUcvU1lTX1BVVENFTkQgKi8KKwkJc3RhdHVzID0KKwkJICAgIGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tZ3IsIENPRF9UUkFDRUJFRywgJnVsX3RyYWNlX2JlZ2luKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0KKwkJICAgIGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tZ3IsIENPRF9UUkFDRUVORCwgJnVsX3RyYWNlX2VuZCk7CisKKwlpZiAoIXN0YXR1cykKKwkJLyogdHJhY2VfY3VyX3BvcyB3aWxsIGhvbGQgdGhlIGFkZHJlc3Mgb2YgYSBEU1AgcG9pbnRlciAqLworCQlzdGF0dXMgPSBjb2RfZ2V0X3N5bV92YWx1ZShjb2RfbWdyLCBDT0RfVFJBQ0VDVVJQT1MsCisJCQkJCQkJJnRyYWNlX2N1cl9wb3MpOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCXVsX251bV9ieXRlcyA9ICh1bF90cmFjZV9lbmQgLSB1bF90cmFjZV9iZWdpbik7CisKKwl1bF9udW1fd29yZHMgPSB1bF9udW1fYnl0ZXMgKiB1bF93b3JkX3NpemU7CisJc3RhdHVzID0gZGV2X2dldF9pbnRmX2Z4bnMoZGV2X29iaiwgJmludGZfZnhucyk7CisKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJcHN6X2J1ZiA9IGt6YWxsb2ModWxfbnVtX2J5dGVzICsgMiwgR0ZQX0FUT01JQyk7CisJaWYgKHBzel9idWYgIT0gTlVMTCkgeworCQkvKiBSZWFkIHRyYWNlIGJ1ZmZlciBkYXRhICovCisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fYnJkX3JlYWQpKHBicmlkZ2VfY29udGV4dCwKKwkJCSh1OCAqKXBzel9idWYsICh1MzIpdWxfdHJhY2VfYmVnaW4sCisJCQl1bF9udW1fYnl0ZXMsIDApOworCisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGZ1bmNfZW5kOworCisJCS8qIFBhY2sgYW5kIGRvIG5ld2xpbmUgY29udmVyc2lvbiAqLworCQlwcl9kZWJ1ZygiUHJpbnREc3BUcmFjZUJ1ZmZlcjogIgorCQkJImJlZm9yZSBwYWNrIGFuZCB1bnBhY2suXG4iKTsKKwkJcHJfZGVidWcoIiVzOiBEU1AgVHJhY2UgQnVmZmVyIEJlZ2luOlxuIgorCQkJIj09PT09PT09PT09PT09PT09PT09PT09XG4lc1xuIiwKKwkJCV9fZnVuY19fLCBwc3pfYnVmKTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBhdCB0aGUgRFNQIGFkZHJlc3MgaW4gdHJhY2VfY3VyX3Bvcy4gKi8KKwkJc3RhdHVzID0gKCppbnRmX2Z4bnMtPnBmbl9icmRfcmVhZCkocGJyaWRnZV9jb250ZXh0LAorCQkJCSh1OCAqKSZ0cmFjZV9jdXJfcG9zLCAodTMyKXRyYWNlX2N1cl9wb3MsCisJCQkJNCwgMCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGZ1bmNfZW5kOworCQkvKiBQYWNrIGFuZCBkbyBuZXdsaW5lIGNvbnZlcnNpb24gKi8KKwkJcHJfaW5mbygiRFNQIFRyYWNlIEJ1ZmZlciBCZWdpbjpcbiIKKwkJCSI9PT09PT09PT09PT09PT09PT09PT09PVxuJXNcbiIsCisJCQlwc3pfYnVmKTsKKworCisJCS8qIGNvbnZlcnQgdG8gb2Zmc2V0ICovCisJCXRyYWNlX2N1cl9wb3MgPSB0cmFjZV9jdXJfcG9zIC0gdWxfdHJhY2VfYmVnaW47CisKKwkJaWYgKHVsX251bV9ieXRlcykgeworCQkJLyoKKwkJCSAqIFRoZSBidWZmZXIgaXMgbm90IGZ1bGwsIGZpbmQgdGhlIGVuZCBvZiB0aGUKKwkJCSAqIGRhdGEgLS0gYnVmX2VuZCB3aWxsIGJlID49IHBzekJ1ZiBhZnRlcgorCQkJICogd2hpbGUuCisJCQkgKi8KKwkJCWJ1Zl9lbmQgPSAmcHN6X2J1Zlt1bF9udW1fYnl0ZXMrMV07CisJCQkvKiBEU1AgcHJpbnQgcG9zaXRpb24gKi8KKwkJCXRyYWNlX2VuZCA9ICZwc3pfYnVmW3RyYWNlX2N1cl9wb3NdOworCisJCQkvKgorCQkJICogU2VhcmNoIGJ1ZmZlciBmb3IgYSBuZXdfbGluZSBhbmQgcmVwbGFjZSBpdAorCQkJICogd2l0aCAnXDAnLCB0aGVuIHByaW50IGFzIHN0cmluZy4KKwkJCSAqIENvbnRpbnVlIHVudGlsIGVuZCBvZiBidWZmZXIgaXMgcmVhY2hlZC4KKwkJCSAqLworCQkJc3RyX2JlZyA9IHRyYWNlX2VuZDsKKwkJCXVsX251bV9ieXRlcyA9IGJ1Zl9lbmQgLSBzdHJfYmVnOworCisJCQl3aGlsZSAoc3RyX2JlZyA8IGJ1Zl9lbmQpIHsKKwkJCQluZXdfbGluZSA9IHN0cm5jaHIoc3RyX2JlZywgdWxfbnVtX2J5dGVzLAorCQkJCQkJCQknXG4nKTsKKwkJCQlpZiAobmV3X2xpbmUgJiYgbmV3X2xpbmUgPCBidWZfZW5kKSB7CisJCQkJCSpuZXdfbGluZSA9IDA7CisJCQkJCXByX2RlYnVnKCIlc1xuIiwgc3RyX2JlZyk7CisJCQkJCXN0cl9iZWcgPSArK25ld19saW5lOworCQkJCQl1bF9udW1fYnl0ZXMgPSBidWZfZW5kIC0gc3RyX2JlZzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBBc3N1bWUgYnVmZmVyIGVtcHR5IGlmIGl0IGNvbnRhaW5zCisJCQkJCSAqIGEgemVybworCQkJCQkgKi8KKwkJCQkJaWYgKCpzdHJfYmVnICE9ICdcMCcpIHsKKwkJCQkJCXN0cl9iZWdbdWxfbnVtX2J5dGVzXSA9IDA7CisJCQkJCQlwcl9kZWJ1ZygiJXNcbiIsIHN0cl9iZWcpOworCQkJCQl9CisJCQkJCXN0cl9iZWcgPSBidWZfZW5kOworCQkJCQl1bF9udW1fYnl0ZXMgPSAwOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBTZWFyY2ggYnVmZmVyIGZvciBhIG5OZXdMaW5lIGFuZCByZXBsYWNlIGl0CisJCQkgKiB3aXRoICdcMCcsIHRoZW4gcHJpbnQgYXMgc3RyaW5nLgorCQkJICogQ29udGludWUgdW50aWwgYnVmZmVyIGlzIGV4aGF1c3RlZC4KKwkJCSAqLworCQkJc3RyX2JlZyA9IHBzel9idWY7CisJCQl1bF9udW1fYnl0ZXMgPSB0cmFjZV9lbmQgLSBzdHJfYmVnOworCisJCQl3aGlsZSAoc3RyX2JlZyA8IHRyYWNlX2VuZCkgeworCQkJCW5ld19saW5lID0gc3RybmNocihzdHJfYmVnLCB1bF9udW1fYnl0ZXMsICdcbicpOworCQkJCWlmIChuZXdfbGluZSAhPSBOVUxMICYmIG5ld19saW5lIDwgdHJhY2VfZW5kKSB7CisJCQkJCSpuZXdfbGluZSA9IDA7CisJCQkJCXByX2RlYnVnKCIlc1xuIiwgc3RyX2JlZyk7CisJCQkJCXN0cl9iZWcgPSArK25ld19saW5lOworCQkJCQl1bF9udW1fYnl0ZXMgPSB0cmFjZV9lbmQgLSBzdHJfYmVnOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIEFzc3VtZSBidWZmZXIgZW1wdHkgaWYgaXQgY29udGFpbnMKKwkJCQkJICogYSB6ZXJvCisJCQkJCSAqLworCQkJCQlpZiAoKnN0cl9iZWcgIT0gJ1wwJykgeworCQkJCQkJc3RyX2JlZ1t1bF9udW1fYnl0ZXNdID0gMDsKKwkJCQkJCXByX2RlYnVnKCIlc1xuIiwgc3RyX2JlZyk7CisJCQkJCX0KKwkJCQkJc3RyX2JlZyA9IHRyYWNlX2VuZDsKKwkJCQkJdWxfbnVtX2J5dGVzID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJfaW5mbygiXG49PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkJIkRTUCBUcmFjZSBCdWZmZXIgRW5kOlxuIik7CisJCWtmcmVlKHBzel9idWYpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorZnVuY19lbmQ6CisJaWYgKHN0YXR1cykKKwkJZGV2X2RiZyhicmlkZ2UsICIlcyBGYWlsZWQsIHN0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGR1bXBfZHNwX3N0YWNrKCkgLSBUaGlzIGZ1bmN0aW9uIGR1bXBzIHRoZSBkYXRhIG9uIHRoZSBEU1Agc3RhY2suCisgKiBAYnJpZGdlX2NvbnRleHQ6CUJyaWRnZSBkcml2ZXIncyBkZXZpY2UgY29udGV4dCBwb2ludGVyLgorICoKKyAqLworaW50IGR1bXBfZHNwX3N0YWNrKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmJyaWRnZV9jb250ZXh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjb2RfbWFuYWdlciAqY29kZV9tZ3I7CisJc3RydWN0IG5vZGVfbWdyICpub2RlX21ncjsKKwl1MzIgdHJhY2VfYmVnaW47CisJY2hhciBuYW1lWzI1Nl07CisJc3RydWN0IHsKKwkJdTMyIGhlYWRbMl07CisJCXUzMiBzaXplOworCX0gbW11X2ZhdWx0X2RiZ19pbmZvOworCXUzMiAqYnVmZmVyOworCXUzMiAqYnVmZmVyX2JlZzsKKwl1MzIgKmJ1ZmZlcl9lbmQ7CisJdTMyIGV4Y190eXBlOworCXUzMiBkeW5fZXh0X2Jhc2U7CisJdTMyIGk7CisJdTMyIG9mZnNldF9vdXRwdXQ7CisJdTMyIHRvdGFsX3NpemU7CisJdTMyIHBvbGxfY250OworCWNvbnN0IGNoYXIgKmRzcF9yZWdzW10gPSB7IkVGUiIsICJJRVJSIiwgIklUU1IiLCAiTlRTUiIsCisJCQkJIklSUCIsICJOUlAiLCAiQU1SIiwgIlNTUiIsCisJCQkJIklMQyIsICJSSUxDIiwgIklFUiIsICJDU1IifTsKKwljb25zdCBjaGFyICpleGVjX2N0eHRbXSA9IHsiVGFzayIsICJTV0kiLCAiSFdJIiwgIlVua25vd24ifTsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iamVjdCA9IGJyaWRnZV9jb250ZXh0LT5oZGV2X29iajsKKworCXN0YXR1cyA9IGRldl9nZXRfY29kX21ncihkZXZfb2JqZWN0LCAmY29kZV9tZ3IpOworCWlmICghY29kZV9tZ3IpIHsKKwkJcHJfZGVidWcoIiVzOiBGYWlsZWQgb24gZGV2X2dldF9jb2RfbWdyLlxuIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGRldl9nZXRfbm9kZV9tYW5hZ2VyKGRldl9vYmplY3QsICZub2RlX21ncik7CisJCWlmICghbm9kZV9tZ3IpIHsKKwkJCXByX2RlYnVnKCIlczogRmFpbGVkIG9uIGRldl9nZXRfbm9kZV9tYW5hZ2VyLlxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJfQorCX0KKworCWlmICghc3RhdHVzKSB7CisJCS8qIExvb2sgZm9yIFNZU19QVVRDQkVHL1NZU19QVVRDRU5EOiAqLworCQlzdGF0dXMgPQorCQkJY29kX2dldF9zeW1fdmFsdWUoY29kZV9tZ3IsIENPRF9UUkFDRUJFRywgJnRyYWNlX2JlZ2luKTsKKwkJcHJfZGVidWcoIiVzOiB0cmFjZV9iZWdpbiBWYWx1ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHRyYWNlX2JlZ2luKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2RlYnVnKCIlczogRmFpbGVkIG9uIGNvZF9nZXRfc3ltX3ZhbHVlLlxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCX0KKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGV2X2dldF9pbnRmX2Z4bnMoZGV2X29iamVjdCwgJmludGZfZnhucyk7CisJLyoKKwkgKiBDaGVjayBmb3IgdGhlICJtYWdpYyBudW1iZXIiIGluIHRoZSB0cmFjZSBidWZmZXIuICBJZiBpdCBoYXMKKwkgKiB5ZXQgdG8gYXBwZWFyIHRoZW4gcG9sbCB0aGUgdHJhY2UgYnVmZmVyIHRvIHdhaXQgZm9yIGl0LiAgSXRzCisJICogYXBwZWFyYW5jZSBzaWduYWxzIHRoYXQgdGhlIERTUCBoYXMgZmluaXNoZWQgZHVtcGluZyBpdHMgc3RhdGUuCisJICovCisJbW11X2ZhdWx0X2RiZ19pbmZvLmhlYWRbMF0gPSAwOworCW1tdV9mYXVsdF9kYmdfaW5mby5oZWFkWzFdID0gMDsKKwlpZiAoIXN0YXR1cykgeworCQlwb2xsX2NudCA9IDA7CisJCXdoaWxlICgobW11X2ZhdWx0X2RiZ19pbmZvLmhlYWRbMF0gIT0gTU1VX0ZBVUxUX0hFQUQxIHx8CisJCQltbXVfZmF1bHRfZGJnX2luZm8uaGVhZFsxXSAhPSBNTVVfRkFVTFRfSEVBRDIpICYmCisJCQlwb2xsX2NudCA8IFBPTExfTUFYKSB7CisKKwkJCS8qIFJlYWQgRFNQIGR1bXAgc2l6ZSBmcm9tIHRoZSBEU1AgdHJhY2UgYnVmZmVyLi4uICovCisJCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2JyZF9yZWFkKShicmlkZ2VfY29udGV4dCwKKwkJCQkodTggKikmbW11X2ZhdWx0X2RiZ19pbmZvLCAodTMyKXRyYWNlX2JlZ2luLAorCQkJCXNpemVvZihtbXVfZmF1bHRfZGJnX2luZm8pLCAwKTsKKworCQkJaWYgKHN0YXR1cykKKwkJCQlicmVhazsKKworCQkJcG9sbF9jbnQrKzsKKwkJfQorCisJCWlmIChtbXVfZmF1bHRfZGJnX2luZm8uaGVhZFswXSAhPSBNTVVfRkFVTFRfSEVBRDEgJiYKKwkJCW1tdV9mYXVsdF9kYmdfaW5mby5oZWFkWzFdICE9IE1NVV9GQVVMVF9IRUFEMikgeworCQkJc3RhdHVzID0gLUVUSU1FOworCQkJcHJfZXJyKCIlczpObyBEU1AgTU1VLUZhdWx0IGluZm9ybWF0aW9uIGF2YWlsYWJsZS5cbiIsCisJCQkJCQkJX19mdW5jX18pOworCQl9CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJdG90YWxfc2l6ZSA9IG1tdV9mYXVsdF9kYmdfaW5mby5zaXplOworCQkvKiBMaW1pdCB0aGUgc2l6ZSBpbiBjYXNlIERTUCB3ZW50IGNyYXp5ICovCisJCWlmICh0b3RhbF9zaXplID4gTUFYX01NVV9EQkdCVUZGKQorCQkJdG90YWxfc2l6ZSA9IE1BWF9NTVVfREJHQlVGRjsKKworCQlidWZmZXIgPSBremFsbG9jKHRvdGFsX3NpemUsIEdGUF9BVE9NSUMpOworCQlpZiAoIWJ1ZmZlcikgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCXByX2RlYnVnKCIlczogRmFpbGVkIHRvICIKKwkJCQkiYWxsb2NhdGUgc3RhY2sgZHVtcCBidWZmZXIuXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisKKwkJYnVmZmVyX2JlZyA9IGJ1ZmZlcjsKKwkJYnVmZmVyX2VuZCA9ICBidWZmZXIgKyB0b3RhbF9zaXplIC8gNDsKKworCQkvKiBSZWFkIGJ5dGVzIGZyb20gdGhlIERTUCB0cmFjZSBidWZmZXIuLi4gKi8KKwkJc3RhdHVzID0gKCppbnRmX2Z4bnMtPnBmbl9icmRfcmVhZCkoYnJpZGdlX2NvbnRleHQsCisJCQkJKHU4ICopYnVmZmVyLCAodTMyKXRyYWNlX2JlZ2luLAorCQkJCXRvdGFsX3NpemUsIDApOworCQlpZiAoc3RhdHVzKSB7CisJCQlwcl9kZWJ1ZygiJXM6IEZhaWxlZCB0byBSZWFkIFRyYWNlIEJ1ZmZlci5cbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZnVuY19lbmQ7CisJCX0KKworCQlwcl9lcnIoIlxuQXByb3hpbWF0ZSBDcmFzaCBQb3NpdGlvbjpcbiIKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwkJZXhjX3R5cGUgPSBidWZmZXJbM107CisJCWlmICghZXhjX3R5cGUpCisJCQlpID0gYnVmZmVyWzc5XTsgICAgICAgICAvKiBJUlAgKi8KKwkJZWxzZQorCQkJaSA9IGJ1ZmZlcls4MF07ICAgICAgICAgLyogTlJQICovCisKKwkJc3RhdHVzID0KKwkJICAgIGNvZF9nZXRfc3ltX3ZhbHVlKGNvZGVfbWdyLCBEWU5FWFRCQVNFLCAmZHluX2V4dF9iYXNlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCWdvdG8gZnVuY19lbmQ7CisJCX0KKworCQlpZiAoKGkgPiBkeW5fZXh0X2Jhc2UpICYmIChub2RlX2ZpbmRfYWRkcihub2RlX21nciwgaSwKKwkJCTB4MTAwMCwgJm9mZnNldF9vdXRwdXQsIG5hbWUpID09IDApKQorCQkJcHJfZXJyKCIweCUtOHggW1wiJXNcIiArIDB4JXhdXG4iLCBpLCBuYW1lLAorCQkJCQkJCWkgLSBvZmZzZXRfb3V0cHV0KTsKKwkJZWxzZQorCQkJcHJfZXJyKCIweCUtOHggW1VuYWJsZSB0byBtYXRjaCB0byBhIHN5bWJvbC5dXG4iLCBpKTsKKworCQlidWZmZXIgKz0gNDsKKworCQlwcl9lcnIoIlxuRXhlY3V0aW9uIEluZm86XG4iCisJCQkiLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCQlpZiAoKmJ1ZmZlciA8IEFSUkFZX1NJWkUoZXhlY19jdHh0KSkgeworCQkJcHJfZXJyKCJFeGVjdXRpb24gY29udGV4dCBcdCVzXG4iLAorCQkJCWV4ZWNfY3R4dFsqYnVmZmVyKytdKTsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiRXhlY3V0aW9uIGNvbnRleHQgY29ycnVwdFxuIik7CisJCQlrZnJlZShidWZmZXJfYmVnKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXByX2VycigiVGFzayBIYW5kbGVcdFx0MHgleFxuIiwgKmJ1ZmZlcisrKTsKKwkJcHJfZXJyKCJTdGFjayBQb2ludGVyXHRcdDB4JXhcbiIsICpidWZmZXIrKyk7CisJCXByX2VycigiU3RhY2sgVG9wXHRcdDB4JXhcbiIsICpidWZmZXIrKyk7CisJCXByX2VycigiU3RhY2sgQm90dG9tXHRcdDB4JXhcbiIsICpidWZmZXIrKyk7CisJCXByX2VycigiU3RhY2sgU2l6ZVx0XHQweCV4XG4iLCAqYnVmZmVyKyspOworCQlwcl9lcnIoIlN0YWNrIFNpemUgSW4gVXNlXHQweCV4XG4iLCAqYnVmZmVyKyspOworCisJCXByX2VycigiXG5DUFUgUmVnaXN0ZXJzXG4iCisJCQkiLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJaWYgKGkgPT0gNCB8fCBpID09IDYgfHwgaSA9PSA4KQorCQkJCXByX2VycigiQSVkIDB4JS04eCBbRnVuY3Rpb24gQXJndW1lbnQgJWRdXG4iLAorCQkJCQkJCWksICpidWZmZXIrKywgaS0zKTsKKwkJCWVsc2UgaWYgKGkgPT0gMTUpCisJCQkJcHJfZXJyKCJBMTUgMHglLTh4IFtGcmFtZSBQb2ludGVyXVxuIiwKKwkJCQkJCQkJKmJ1ZmZlcisrKTsKKwkJCWVsc2UKKwkJCQlwcl9lcnIoIkElZCAweCV4XG4iLCBpLCAqYnVmZmVyKyspOworCQl9CisKKwkJcHJfZXJyKCJcbkIwIDB4JXhcbiIsICpidWZmZXIrKyk7CisJCXByX2VycigiQjEgMHgleFxuIiwgKmJ1ZmZlcisrKTsKKwkJcHJfZXJyKCJCMiAweCV4XG4iLCAqYnVmZmVyKyspOworCisJCWlmICgoKmJ1ZmZlciA+IGR5bl9leHRfYmFzZSkgJiYgKG5vZGVfZmluZF9hZGRyKG5vZGVfbWdyLAorCQkJKmJ1ZmZlciwgMHgxMDAwLCAmb2Zmc2V0X291dHB1dCwgbmFtZSkgPT0gMCkpCisKKwkJCXByX2VycigiQjMgMHglLTh4IFtGdW5jdGlvbiBSZXR1cm4gUG9pbnRlcjoiCisJCQkJIiBcIiVzXCIgKyAweCV4XVxuIiwgKmJ1ZmZlciwgbmFtZSwKKwkJCQkqYnVmZmVyIC0gb2Zmc2V0X291dHB1dCk7CisJCWVsc2UKKwkJCXByX2VycigiQjMgMHglLTh4IFtGdW5jdGlvbiBSZXR1cm4gUG9pbnRlcjoiCisJCQkJIlVuYWJsZSB0byBtYXRjaCB0byBhIHN5bWJvbC5dXG4iLCAqYnVmZmVyKTsKKworCQlidWZmZXIrKzsKKworCQlmb3IgKGkgPSA0OyBpIDwgMzI7IGkrKykgeworCQkJaWYgKGkgPT0gNCB8fCBpID09IDYgfHwgaSA9PSA4KQorCQkJCXByX2VycigiQiVkIDB4JS04eCBbRnVuY3Rpb24gQXJndW1lbnQgJWRdXG4iLAorCQkJCQkJCWksICpidWZmZXIrKywgaS0yKTsKKwkJCWVsc2UgaWYgKGkgPT0gMTQpCisJCQkJcHJfZXJyKCJCMTQgMHglLTh4IFtEYXRhIFBhZ2UgUG9pbnRlcl1cbiIsCisJCQkJCQkJCSpidWZmZXIrKyk7CisJCQllbHNlCisJCQkJcHJfZXJyKCJCJWQgMHgleFxuIiwgaSwgKmJ1ZmZlcisrKTsKKwkJfQorCisJCXByX2VycigiXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc3BfcmVncyk7IGkrKykKKwkJCXByX2VycigiJXMgMHgleFxuIiwgZHNwX3JlZ3NbaV0sICpidWZmZXIrKyk7CisKKwkJcHJfZXJyKCJcblN0YWNrOlxuIgorCQkJIi0tLS0tLVxuIik7CisKKwkJZm9yIChpID0gMDsgYnVmZmVyIDwgYnVmZmVyX2VuZDsgaSsrLCBidWZmZXIrKykgeworCQkJaWYgKCgqYnVmZmVyID4gZHluX2V4dF9iYXNlKSAmJiAoCisJCQkJbm9kZV9maW5kX2FkZHIobm9kZV9tZ3IsICpidWZmZXIgLCAweDYwMCwKKwkJCQkmb2Zmc2V0X291dHB1dCwgbmFtZSkgPT0gMCkpCisJCQkJcHJfZXJyKCJbJWRdIDB4JS04eCBbXCIlc1wiICsgMHgleF1cbiIsCisJCQkJCWksICpidWZmZXIsIG5hbWUsCisJCQkJCSpidWZmZXIgLSBvZmZzZXRfb3V0cHV0KTsKKwkJCWVsc2UKKwkJCQlwcl9lcnIoIlslZF0gMHgleFxuIiwgaSwgKmJ1ZmZlcik7CisJCX0KKwkJa2ZyZWUoYnVmZmVyX2JlZyk7CisJfQorZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBkdW1wX2RsX21vZHVsZXMoKSAtIFRoaXMgZnVuY3Rpb25zIGR1bXBzIHRoZSBfRExNb2R1bGVzIGxvYWRlZCBpbiBEU1Agc2lkZQorICogQGJyaWRnZV9jb250ZXh0OgkJQnJpZGdlIGRyaXZlcidzIGRldmljZSBjb250ZXh0IHBvaW50ZXIuCisgKgorICovCit2b2lkIGR1bXBfZGxfbW9kdWxlcyhzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpicmlkZ2VfY29udGV4dCkKK3sKKwlzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZGVfbWdyOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmJyaWRnZV9jdHh0ID0gYnJpZGdlX2NvbnRleHQ7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmplY3QgPSBicmlkZ2VfY3R4dC0+aGRldl9vYmo7CisJc3RydWN0IG1vZHVsZXNfaGVhZGVyIG1vZHVsZXNfaGRyOworCXN0cnVjdCBkbGxfbW9kdWxlICptb2R1bGVfc3RydWN0ID0gTlVMTDsKKwl1MzIgbW9kdWxlX2RzcF9hZGRyOworCXUzMiBtb2R1bGVfc2l6ZTsKKwl1MzIgbW9kdWxlX3N0cnVjdF9zaXplID0gMDsKKwl1MzIgc2VjdF9uZHg7CisJY2hhciAqc2VjdF9zdHIgOworCWludCBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gZGV2X2dldF9pbnRmX2Z4bnMoZGV2X29iamVjdCwgJmludGZfZnhucyk7CisJaWYgKHN0YXR1cykgeworCQlwcl9kZWJ1ZygiJXM6IEZhaWxlZCBvbiBkZXZfZ2V0X2ludGZfZnhucy5cbiIsIF9fZnVuY19fKTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2NvZF9tZ3IoZGV2X29iamVjdCwgJmNvZGVfbWdyKTsKKwlpZiAoIWNvZGVfbWdyKSB7CisJCXByX2RlYnVnKCIlczogRmFpbGVkIG9uIGRldl9nZXRfY29kX21nci5cbiIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwkvKiBMb29rdXAgIHRoZSBhZGRyZXNzIG9mIHRoZSBtb2R1bGVzX2hlYWRlciBzdHJ1Y3R1cmUgKi8KKwlzdGF0dXMgPSBjb2RfZ2V0X3N5bV92YWx1ZShjb2RlX21nciwgIl9ETE1vZHVsZXMiLCAmbW9kdWxlX2RzcF9hZGRyKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByX2RlYnVnKCIlczogRmFpbGVkIG9uIGNvZF9nZXRfc3ltX3ZhbHVlIGZvciBfRExNb2R1bGVzLlxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IF9ETE1vZHVsZXMgYXQgMHgleFxuIiwgX19mdW5jX18sIG1vZHVsZV9kc3BfYWRkcik7CisKKwkvKiBDb3B5IHRoZSBtb2R1bGVzX2hlYWRlciBzdHJ1Y3R1cmUgZnJvbSBEU1AgbWVtb3J5LiAqLworCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fYnJkX3JlYWQpKGJyaWRnZV9jb250ZXh0LCAodTggKikgJm1vZHVsZXNfaGRyLAorCQkJCSh1MzIpIG1vZHVsZV9kc3BfYWRkciwgc2l6ZW9mKG1vZHVsZXNfaGRyKSwgMCk7CisKKwlpZiAoc3RhdHVzKSB7CisJCXByX2RlYnVnKCIlczogRmFpbGVkIGZhaWxlZCB0byByZWFkIG1vZHVsZXMgaGVhZGVyLlxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCW1vZHVsZV9kc3BfYWRkciA9IG1vZHVsZXNfaGRyLmZpcnN0X21vZHVsZTsKKwltb2R1bGVfc2l6ZSA9IG1vZHVsZXNfaGRyLmZpcnN0X21vZHVsZV9zaXplOworCisJcHJfZGVidWcoIiVzOiBkbGxfbW9kdWxlX2hlYWRlciAweCV4ICVkXG4iLCBfX2Z1bmNfXywgbW9kdWxlX2RzcF9hZGRyLAorCQkJCQkJCQltb2R1bGVfc2l6ZSk7CisKKwlwcl9lcnIoIlxuRHluYW1pY2FsbHkgTG9hZGVkIE1vZHVsZXM6XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJLyogRm9yIGVhY2ggZGxsX21vZHVsZSBzdHJ1Y3R1cmUgaW4gdGhlIGxpc3QuLi4gKi8KKwl3aGlsZSAobW9kdWxlX3NpemUpIHsKKwkJLyoKKwkJICogQWxsb2NhdGUvcmUtYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIGRsbF9tb2R1bGUKKwkJICogc3RydWN0dXJlLiBUaGUgbWVtb3J5IGlzIHJlLWFsbG9jYXRlZCBvbmx5IGlmIHRoZSBleGlzdGluZworCQkgKiBhbGxvY2F0aW9uIGlzIHRvbyBzbWFsbC4KKwkJICovCisJCWlmIChtb2R1bGVfc2l6ZSA+IG1vZHVsZV9zdHJ1Y3Rfc2l6ZSkgeworCQkJa2ZyZWUobW9kdWxlX3N0cnVjdCk7CisJCQltb2R1bGVfc3RydWN0ID0ga3phbGxvYyhtb2R1bGVfc2l6ZSsxMjgsIEdGUF9BVE9NSUMpOworCQkJbW9kdWxlX3N0cnVjdF9zaXplID0gbW9kdWxlX3NpemUrMTI4OworCQkJcHJfZGVidWcoIiVzOiBhbGxvY2F0ZWQgbW9kdWxlIHN0cnVjdCAlcCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbW9kdWxlX3N0cnVjdCwgbW9kdWxlX3N0cnVjdF9zaXplKTsKKwkJCWlmICghbW9kdWxlX3N0cnVjdCkKKwkJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJCS8qIENvcHkgdGhlIGRsbF9tb2R1bGUgc3RydWN0dXJlIGZyb20gRFNQIG1lbW9yeSAqLworCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2JyZF9yZWFkKShicmlkZ2VfY29udGV4dCwKKwkJCSh1OCAqKW1vZHVsZV9zdHJ1Y3QsIG1vZHVsZV9kc3BfYWRkciwgbW9kdWxlX3NpemUsIDApOworCisJCWlmIChzdGF0dXMpIHsKKwkJCXByX2RlYnVnKAorCQkJIiVzOiBGYWlsZWQgdG8gcmVhZCBkbGxfbW9kdWxlIHN0dWN0IGZvciAweCV4LlxuIiwKKwkJCV9fZnVuY19fLCBtb2R1bGVfZHNwX2FkZHIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBVcGRhdGUgaW5mbyByZWdhcmRpbmcgdGhlIF9uZXh0XyBtb2R1bGUgaW4gdGhlIGxpc3QuICovCisJCW1vZHVsZV9kc3BfYWRkciA9IG1vZHVsZV9zdHJ1Y3QtPm5leHRfbW9kdWxlOworCQltb2R1bGVfc2l6ZSA9IG1vZHVsZV9zdHJ1Y3QtPm5leHRfbW9kdWxlX3NpemU7CisKKwkJcHJfZGVidWcoIiVzOiBuZXh0IG1vZHVsZSAweCV4ICVkLCB0aGlzIG1vZHVsZSBudW0gc2VjdHMgJWRcbiIsCisJCQlfX2Z1bmNfXywgbW9kdWxlX2RzcF9hZGRyLCBtb2R1bGVfc2l6ZSwKKwkJCW1vZHVsZV9zdHJ1Y3QtPm51bV9zZWN0cyk7CisKKwkJLyoKKwkJICogVGhlIHNlY3Rpb24gbmFtZSBzdHJpbmdzIHN0YXJ0IGltbWVkaWFsdHkgZm9sbG93aW5nCisJCSAqIHRoZSBhcnJheSBvZiBkbGxfc2VjdCBzdHJ1Y3R1cmVzLgorCQkgKi8KKwkJc2VjdF9zdHIgPSAoY2hhciAqKSAmbW9kdWxlX3N0cnVjdC0+CisJCQkJCXNlY3RzW21vZHVsZV9zdHJ1Y3QtPm51bV9zZWN0c107CisJCXByX2VycigiJXNcbiIsIHNlY3Rfc3RyKTsKKworCQkvKgorCQkgKiBBZHZhbmNlIHRvIHRoZSBmaXJzdCBzZWN0aW9uIG5hbWUgc3RyaW5nLgorCQkgKiBFYWNoIHN0cmluZyBmb2xsb3dzIHRoZSBvbmUgYmVmb3JlLgorCQkgKi8KKwkJc2VjdF9zdHIgKz0gc3RybGVuKHNlY3Rfc3RyKSArIDE7CisKKwkJLyogQWNjZXNzIGVhY2ggZGxsX3NlY3Qgc3RydWN0dXJlIGFuZCBpdHMgbmFtZSBzdHJpbmcuICovCisJCWZvciAoc2VjdF9uZHggPSAwOworCQkJc2VjdF9uZHggPCBtb2R1bGVfc3RydWN0LT5udW1fc2VjdHM7IHNlY3RfbmR4KyspIHsKKwkJCXByX2VycigiICAgIFNlY3Rpb246IDB4JXggIiwKKwkJCQltb2R1bGVfc3RydWN0LT5zZWN0c1tzZWN0X25keF0uc2VjdF9sb2FkX2Fkcik7CisKKwkJCWlmICgoKHUzMikgc2VjdF9zdHIgLSAodTMyKSBtb2R1bGVfc3RydWN0KSA8CisJCQkJbW9kdWxlX3N0cnVjdF9zaXplKSB7CisJCQkJcHJfZXJyKCIlc1xuIiwgc2VjdF9zdHIpOworCQkJCS8qIEVhY2ggc3RyaW5nIGZvbGxvd3MgdGhlIG9uZSBiZWZvcmUuICovCisJCQkJc2VjdF9zdHIgKz0gc3RybGVuKHNlY3Rfc3RyKSsxOworCQkJfSBlbHNlIHsKKwkJCQlwcl9lcnIoIjxzdHJpbmcgZXJyb3I+XG4iKTsKKwkJCQlwcl9kZWJ1ZygiJXM6IHNlY3Rpb24gbmFtZSBzdGluZyBhZGRyZXNzICIKKwkJCQkJImlzIGludmFsaWQgJXBcbiIsIF9fZnVuY19fLCBzZWN0X3N0cik7CisJCQl9CisJCX0KKwl9CitmdW5jX2VuZDoKKwlrZnJlZShtb2R1bGVfc3RydWN0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvbXNnX3NtLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9tc2dfc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzcxMmUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvbXNnX3NtLmMKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiBtc2dfc20uYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBJbXBsZW1lbnRzIHVwcGVyIGVkZ2UgZnVuY3Rpb25zIGZvciBCcmlkZ2UgbWVzc2FnZSBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbGlzdC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2lvX3NtLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8X21zZ19zbS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3Btc2cuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgYWRkX25ld19tc2coc3RydWN0IGxzdF9saXN0ICptc2dfbGlzdCk7CitzdGF0aWMgdm9pZCBkZWxldGVfbXNnX21ncihzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3IpOworc3RhdGljIHZvaWQgZGVsZXRlX21zZ19xdWV1ZShzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqLCB1MzIgbnVtX3RvX2RzcCk7CitzdGF0aWMgdm9pZCBmcmVlX21zZ19saXN0KHN0cnVjdCBsc3RfbGlzdCAqbXNnX2xpc3QpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfY3JlYXRlID09PT09PT09CisgKiAgICAgIENyZWF0ZSBhbiBvYmplY3QgdG8gbWFuYWdlIG1lc3NhZ2UgcXVldWVzLiBPbmx5IG9uZSBvZiB0aGVzZSBvYmplY3RzCisgKiAgICAgIGNhbiBleGlzdCBwZXIgZGV2aWNlIG9iamVjdC4KKyAqLworaW50IGJyaWRnZV9tc2dfY3JlYXRlKHN0cnVjdCBtc2dfbWdyICoqbXNnX21hbiwKKwkJCSAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgICBtc2dfb25leGl0IG1zZ19jYWxsYmFjaykKK3sKKwlzdHJ1Y3QgbXNnX21nciAqbXNnX21ncl9vYmo7CisJc3RydWN0IGlvX21nciAqaGlvX21ncjsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghbXNnX21hbiB8fCAhbXNnX2NhbGxiYWNrIHx8ICFoZGV2X29iaikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlkZXZfZ2V0X2lvX21ncihoZGV2X29iaiwgJmhpb19tZ3IpOworCWlmICghaGlvX21ncikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkqbXNnX21hbiA9IE5VTEw7CisJLyogQWxsb2NhdGUgbXNnX2N0cmwgbWFuYWdlciBvYmplY3QgKi8KKwltc2dfbWdyX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2dfbWdyKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobXNnX21ncl9vYmopIHsKKwkJbXNnX21ncl9vYmotPm9uX2V4aXQgPSBtc2dfY2FsbGJhY2s7CisJCW1zZ19tZ3Jfb2JqLT5oaW9fbWdyID0gaGlvX21ncjsKKwkJLyogTGlzdCBvZiBNU0dfUVVFVUVzICovCisJCW1zZ19tZ3Jfb2JqLT5xdWV1ZV9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxzdF9saXN0KSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJLyogIFF1ZXVlcyBvZiBtZXNzYWdlIGZyYW1lcyBmb3IgbWVzc2FnZXMgdG8gdGhlIERTUC4gTWVzc2FnZQorCQkgKiBmcmFtZXMgd2lsbCBvbmx5IGJlIGFkZGVkIHRvIHRoZSBmcmVlIHF1ZXVlIHdoZW4gYQorCQkgKiBtc2dfcXVldWUgb2JqZWN0IGlzIGNyZWF0ZWQuICovCisJCW1zZ19tZ3Jfb2JqLT5tc2dfZnJlZV9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxzdF9saXN0KSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJbXNnX21ncl9vYmotPm1zZ191c2VkX2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHN0X2xpc3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAobXNnX21ncl9vYmotPnF1ZXVlX2xpc3QgPT0gTlVMTCB8fAorCQkgICAgbXNnX21ncl9vYmotPm1zZ19mcmVlX2xpc3QgPT0gTlVMTCB8fAorCQkgICAgbXNnX21ncl9vYmotPm1zZ191c2VkX2xpc3QgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCUlOSVRfTElTVF9IRUFEKCZtc2dfbWdyX29iai0+cXVldWVfbGlzdC0+aGVhZCk7CisJCQlJTklUX0xJU1RfSEVBRCgmbXNnX21ncl9vYmotPm1zZ19mcmVlX2xpc3QtPmhlYWQpOworCQkJSU5JVF9MSVNUX0hFQUQoJm1zZ19tZ3Jfb2JqLT5tc2dfdXNlZF9saXN0LT5oZWFkKTsKKwkJCXNwaW5fbG9ja19pbml0KCZtc2dfbWdyX29iai0+bXNnX21ncl9sb2NrKTsKKwkJfQorCisJCS8qICBDcmVhdGUgYW4gZXZlbnQgdG8gYmUgdXNlZCBieSBicmlkZ2VfbXNnX3B1dCgpIGluIHdhaXRpbmcKKwkJICogIGZvciBhbiBhdmFpbGFibGUgZnJlZSBmcmFtZSBmcm9tIHRoZSBtZXNzYWdlIG1hbmFnZXIuICovCisJCW1zZ19tZ3Jfb2JqLT5zeW5jX2V2ZW50ID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3luY19vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtc2dfbWdyX29iai0+c3luY19ldmVudCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCXN5bmNfaW5pdF9ldmVudChtc2dfbWdyX29iai0+c3luY19ldmVudCk7CisKKwkJaWYgKCFzdGF0dXMpCisJCQkqbXNnX21hbiA9IG1zZ19tZ3Jfb2JqOworCQllbHNlCisJCQlkZWxldGVfbXNnX21ncihtc2dfbWdyX29iaik7CisKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX21zZ19jcmVhdGVfcXVldWUgPT09PT09PT0KKyAqICAgICAgQ3JlYXRlIGEgbXNnX3F1ZXVlIGZvciBzZW5kaW5nL3JlY2VpdmluZyBtZXNzYWdlcyB0by9mcm9tIGEgbm9kZQorICogICAgICBvbiB0aGUgRFNQLgorICovCitpbnQgYnJpZGdlX21zZ19jcmVhdGVfcXVldWUoc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyLAorCQkJCXN0cnVjdCBtc2dfcXVldWUgKiptc2dxLAorCQkJCXUzMiBtc2dxX2lkLCB1MzIgbWF4X21zZ3MsIHZvaWQgKmFyZykKK3sKKwl1MzIgaTsKKwl1MzIgbnVtX2FsbG9jYXRlZCA9IDA7CisJc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3E7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoIWhtc2dfbWdyIHx8IG1zZ3EgPT0gTlVMTCB8fCAhaG1zZ19tZ3ItPm1zZ19mcmVlX2xpc3QpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwkqbXNncSA9IE5VTEw7CisJLyogQWxsb2NhdGUgbXNnX3F1ZXVlIG9iamVjdCAqLworCW1zZ19xID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zZ19xdWV1ZSksIEdGUF9LRVJORUwpOworCWlmICghbXNnX3EpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJbHN0X2luaXRfZWxlbSgoc3RydWN0IGxpc3RfaGVhZCAqKW1zZ19xKTsKKwltc2dfcS0+bWF4X21zZ3MgPSBtYXhfbXNnczsKKwltc2dfcS0+aG1zZ19tZ3IgPSBobXNnX21ncjsKKwltc2dfcS0+YXJnID0gYXJnOwkvKiBOb2RlIGhhbmRsZSAqLworCW1zZ19xLT5tc2dxX2lkID0gbXNncV9pZDsJLyogTm9kZSBlbnYgKG5vdCB2YWxpZCB5ZXQpICovCisJLyogUXVldWVzIG9mIE1lc3NhZ2UgZnJhbWVzIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBEU1AgKi8KKwltc2dfcS0+bXNnX2ZyZWVfbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsc3RfbGlzdCksIEdGUF9LRVJORUwpOworCW1zZ19xLT5tc2dfdXNlZF9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxzdF9saXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1zZ19xLT5tc2dfZnJlZV9saXN0ID09IE5VTEwgfHwgbXNnX3EtPm1zZ191c2VkX2xpc3QgPT0gTlVMTCkKKwkJc3RhdHVzID0gLUVOT01FTTsKKwllbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJm1zZ19xLT5tc2dfZnJlZV9saXN0LT5oZWFkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJm1zZ19xLT5tc2dfdXNlZF9saXN0LT5oZWFkKTsKKwl9CisKKwkvKiAgQ3JlYXRlIGV2ZW50IHRoYXQgd2lsbCBiZSBzaWduYWxsZWQgd2hlbiBhIG1lc3NhZ2UgZnJvbQorCSAqICB0aGUgRFNQIGlzIGF2YWlsYWJsZS4gKi8KKwlpZiAoIXN0YXR1cykgeworCQltc2dfcS0+c3luY19ldmVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW5jX29iamVjdCksCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChtc2dfcS0+c3luY19ldmVudCkKKwkJCXN5bmNfaW5pdF9ldmVudChtc2dfcS0+c3luY19ldmVudCk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJLyogQ3JlYXRlIGEgbm90aWZpY2F0aW9uIGxpc3QgZm9yIG1lc3NhZ2UgcmVhZHkgbm90aWZpY2F0aW9uLiAqLworCWlmICghc3RhdHVzKSB7CisJCW1zZ19xLT5udGZ5X29iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBudGZ5X29iamVjdCksCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChtc2dfcS0+bnRmeV9vYmopCisJCQludGZ5X2luaXQobXNnX3EtPm50Znlfb2JqKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisKKwkvKiAgQ3JlYXRlIGV2ZW50cyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBjbGVhbnVwCisJICogIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkLiBzeW5jX2RvbmUgd2lsbCBiZSBzZXQgdG8KKwkgKiAgdW5ibG9jayB0aHJlYWRzIGluIE1TR19QdXQoKSBvciBNU0dfR2V0KCkuIHN5bmNfZG9uZV9hY2sKKwkgKiAgd2lsbCBiZSBzZXQgYnkgdGhlIHVuYmxvY2tlZCB0aHJlYWQgdG8gc2lnbmFsIHRoYXQgaXQKKwkgKiAgaXMgdW5ibG9ja2VkIGFuZCB3aWxsIG5vIGxvbmdlciByZWZlcmVuY2UgdGhlIG9iamVjdC4gKi8KKwlpZiAoIXN0YXR1cykgeworCQltc2dfcS0+c3luY19kb25lID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN5bmNfb2JqZWN0KSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG1zZ19xLT5zeW5jX2RvbmUpCisJCQlzeW5jX2luaXRfZXZlbnQobXNnX3EtPnN5bmNfZG9uZSk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJbXNnX3EtPnN5bmNfZG9uZV9hY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3luY19vYmplY3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAobXNnX3EtPnN5bmNfZG9uZV9hY2spCisJCQlzeW5jX2luaXRfZXZlbnQobXNnX3EtPnN5bmNfZG9uZV9hY2spOworCQllbHNlCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KKworCWlmICghc3RhdHVzKSB7CisJCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwkJc3Bpbl9sb2NrX2JoKCZobXNnX21nci0+bXNnX21ncl9sb2NrKTsKKwkJLyogSW5pdGlhbGl6ZSBtZXNzYWdlIGZyYW1lcyBhbmQgcHV0IGluIGFwcHJvcHJpYXRlIHF1ZXVlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X21zZ3MgJiYgIXN0YXR1czsgaSsrKSB7CisJCQlzdGF0dXMgPSBhZGRfbmV3X21zZyhobXNnX21nci0+bXNnX2ZyZWVfbGlzdCk7CisJCQlpZiAoIXN0YXR1cykgeworCQkJCW51bV9hbGxvY2F0ZWQrKzsKKwkJCQlzdGF0dXMgPSBhZGRfbmV3X21zZyhtc2dfcS0+bXNnX2ZyZWVfbGlzdCk7CisJCQl9CisJCX0KKwkJaWYgKHN0YXR1cykgeworCQkJLyogIFN0YXkgaW5zaWRlIENTIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gdGFraW5nIGFueQorCQkJICogIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWVzc2FnZSBmcmFtZXMuICovCisJCQlkZWxldGVfbXNnX3F1ZXVlKG1zZ19xLCBudW1fYWxsb2NhdGVkKTsKKwkJfSBlbHNlIHsKKwkJCWxzdF9wdXRfdGFpbChobXNnX21nci0+cXVldWVfbGlzdCwKKwkJCQkgICAgIChzdHJ1Y3QgbGlzdF9oZWFkICopbXNnX3EpOworCQkJKm1zZ3EgPSBtc2dfcTsKKwkJCS8qIFNpZ25hbCB0aGF0IGZyZWUgZnJhbWVzIGFyZSBub3cgYXZhaWxhYmxlICovCisJCQlpZiAoIUxTVF9JU19FTVBUWShobXNnX21nci0+bXNnX2ZyZWVfbGlzdCkpCisJCQkJc3luY19zZXRfZXZlbnQoaG1zZ19tZ3ItPnN5bmNfZXZlbnQpOworCisJCX0KKwkJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJCXNwaW5fdW5sb2NrX2JoKCZobXNnX21nci0+bXNnX21ncl9sb2NrKTsKKwl9IGVsc2UgeworCQlkZWxldGVfbXNnX3F1ZXVlKG1zZ19xLCAwKTsKKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfZGVsZXRlID09PT09PT09CisgKiAgICAgIERlbGV0ZSBhIG1zZ19jdHJsIG1hbmFnZXIgYWxsb2NhdGVkIGluIGJyaWRnZV9tc2dfY3JlYXRlKCkuCisgKi8KK3ZvaWQgYnJpZGdlX21zZ19kZWxldGUoc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyKQoreworCWlmIChobXNnX21ncikKKwkJZGVsZXRlX21zZ19tZ3IoaG1zZ19tZ3IpOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfZGVsZXRlX3F1ZXVlID09PT09PT09CisgKiAgICAgIERlbGV0ZSBhIG1zZ19jdHJsIHF1ZXVlIGFsbG9jYXRlZCBpbiBicmlkZ2VfbXNnX2NyZWF0ZV9xdWV1ZS4KKyAqLwordm9pZCBicmlkZ2VfbXNnX2RlbGV0ZV9xdWV1ZShzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqKQoreworCXN0cnVjdCBtc2dfbWdyICpobXNnX21ncjsKKwl1MzIgaW9fbXNnX3BlbmQ7CisKKwlpZiAoIW1zZ19xdWV1ZV9vYmogfHwgIW1zZ19xdWV1ZV9vYmotPmhtc2dfbWdyKQorCQlnb3RvIGZ1bmNfZW5kOworCisJaG1zZ19tZ3IgPSBtc2dfcXVldWVfb2JqLT5obXNnX21ncjsKKwltc2dfcXVldWVfb2JqLT5kb25lID0gdHJ1ZTsKKwkvKiAgVW5ibG9jayBhbGwgdGhyZWFkcyBibG9ja2VkIGluIE1TR19HZXQoKSBvciBNU0dfUHV0KCkuICovCisJaW9fbXNnX3BlbmQgPSBtc2dfcXVldWVfb2JqLT5pb19tc2dfcGVuZDsKKwl3aGlsZSAoaW9fbXNnX3BlbmQpIHsKKwkJLyogVW5ibG9jayB0aHJlYWQgKi8KKwkJc3luY19zZXRfZXZlbnQobXNnX3F1ZXVlX29iai0+c3luY19kb25lKTsKKwkJLyogV2FpdCBmb3IgYWNrbm93bGVkZ2VtZW50ICovCisJCXN5bmNfd2FpdF9vbl9ldmVudChtc2dfcXVldWVfb2JqLT5zeW5jX2RvbmVfYWNrLCBTWU5DX0lORklOSVRFKTsKKwkJaW9fbXNnX3BlbmQgPSBtc2dfcXVldWVfb2JqLT5pb19tc2dfcGVuZDsKKwl9CisJLyogUmVtb3ZlIG1lc3NhZ2UgcXVldWUgZnJvbSBobXNnX21nci0+cXVldWVfbGlzdCAqLworCXNwaW5fbG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJbHN0X3JlbW92ZV9lbGVtKGhtc2dfbWdyLT5xdWV1ZV9saXN0LAorCQkJKHN0cnVjdCBsaXN0X2hlYWQgKiltc2dfcXVldWVfb2JqKTsKKwkvKiBGcmVlIHRoZSBtZXNzYWdlIHF1ZXVlIG9iamVjdCAqLworCWRlbGV0ZV9tc2dfcXVldWUobXNnX3F1ZXVlX29iaiwgbXNnX3F1ZXVlX29iai0+bWF4X21zZ3MpOworCWlmICghaG1zZ19tZ3ItPm1zZ19mcmVlX2xpc3QpCisJCWdvdG8gZnVuY19jb250OworCWlmIChMU1RfSVNfRU1QVFkoaG1zZ19tZ3ItPm1zZ19mcmVlX2xpc3QpKQorCQlzeW5jX3Jlc2V0X2V2ZW50KGhtc2dfbWdyLT5zeW5jX2V2ZW50KTsKK2Z1bmNfY29udDoKKwlzcGluX3VubG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CitmdW5jX2VuZDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX21zZ19nZXQgPT09PT09PT0KKyAqICAgICAgR2V0IGEgbWVzc2FnZSBmcm9tIGEgbXNnX2N0cmwgcXVldWUuCisgKi8KK2ludCBicmlkZ2VfbXNnX2dldChzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqLAorCQkJICBzdHJ1Y3QgZHNwX21zZyAqcG1zZywgdTMyIHV0aW1lb3V0KQoreworCXN0cnVjdCBtc2dfZnJhbWUgKm1zZ19mcmFtZV9vYmo7CisJc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyOworCWJvb2wgZ290X21zZyA9IGZhbHNlOworCXN0cnVjdCBzeW5jX29iamVjdCAqc3luY3NbMl07CisJdTMyIGluZGV4OworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCFtc2dfcXVldWVfb2JqIHx8IHBtc2cgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCWhtc2dfbWdyID0gbXNnX3F1ZXVlX29iai0+aG1zZ19tZ3I7CisJaWYgKCFtc2dfcXVldWVfb2JqLT5tc2dfdXNlZF9saXN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworCXNwaW5fbG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJLyogSWYgYSBtZXNzYWdlIGlzIGFscmVhZHkgdGhlcmUsIGdldCBpdCAqLworCWlmICghTFNUX0lTX0VNUFRZKG1zZ19xdWV1ZV9vYmotPm1zZ191c2VkX2xpc3QpKSB7CisJCW1zZ19mcmFtZV9vYmogPSAoc3RydWN0IG1zZ19mcmFtZSAqKQorCQkgICAgbHN0X2dldF9oZWFkKG1zZ19xdWV1ZV9vYmotPm1zZ191c2VkX2xpc3QpOworCQlpZiAobXNnX2ZyYW1lX29iaiAhPSBOVUxMKSB7CisJCQkqcG1zZyA9IG1zZ19mcmFtZV9vYmotPm1zZ19kYXRhLm1zZzsKKwkJCWxzdF9wdXRfdGFpbChtc2dfcXVldWVfb2JqLT5tc2dfZnJlZV9saXN0LAorCQkJCSAgICAgKHN0cnVjdCBsaXN0X2hlYWQgKiltc2dfZnJhbWVfb2JqKTsKKwkJCWlmIChMU1RfSVNfRU1QVFkobXNnX3F1ZXVlX29iai0+bXNnX3VzZWRfbGlzdCkpCisJCQkJc3luY19yZXNldF9ldmVudChtc2dfcXVldWVfb2JqLT5zeW5jX2V2ZW50KTsKKworCQkJZ290X21zZyA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobXNnX3F1ZXVlX29iai0+ZG9uZSkKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZWxzZQorCQkJbXNnX3F1ZXVlX29iai0+aW9fbXNnX3BlbmQrKzsKKworCX0KKwkvKiBFeGl0IGNyaXRpY2FsIHNlY3Rpb24gKi8KKwlzcGluX3VubG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJaWYgKCFzdGF0dXMgJiYgIWdvdF9tc2cpIHsKKwkJLyogIFdhaXQgdGlsIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCB0aW1lb3V0LCBvciBkb25lLiBXZSBkb24ndAorCQkgKiAgaGF2ZSB0byBzY2hlZHVsZSB0aGUgRFBDLCBzaW5jZSB0aGUgRFNQIHdpbGwgc2VuZCBtZXNzYWdlcworCQkgKiAgd2hlbiB0aGV5IGFyZSBhdmFpbGFibGUuICovCisJCXN5bmNzWzBdID0gbXNnX3F1ZXVlX29iai0+c3luY19ldmVudDsKKwkJc3luY3NbMV0gPSBtc2dfcXVldWVfb2JqLT5zeW5jX2RvbmU7CisJCXN0YXR1cyA9IHN5bmNfd2FpdF9vbl9tdWx0aXBsZV9ldmVudHMoc3luY3MsIDIsIHV0aW1lb3V0LAorCQkJCQkJICAgICAgJmluZGV4KTsKKwkJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworCQlzcGluX2xvY2tfYmgoJmhtc2dfbWdyLT5tc2dfbWdyX2xvY2spOworCQlpZiAobXNnX3F1ZXVlX29iai0+ZG9uZSkgeworCQkJbXNnX3F1ZXVlX29iai0+aW9fbXNnX3BlbmQtLTsKKwkJCS8qIEV4aXQgY3JpdGljYWwgc2VjdGlvbiAqLworCQkJc3Bpbl91bmxvY2tfYmgoJmhtc2dfbWdyLT5tc2dfbWdyX2xvY2spOworCQkJLyogIFNpZ25hbCB0aGF0IHdlJ3JlIG5vdCBnb2luZyB0byBhY2Nlc3MgbXNnX3F1ZXVlX29iagorCQkJICogIGFueW1vcmUsIHNvIGl0IGNhbiBiZSBkZWxldGVkLiAqLworCQkJKHZvaWQpc3luY19zZXRfZXZlbnQobXNnX3F1ZXVlX29iai0+c3luY19kb25lX2Fjayk7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0gZWxzZSB7CisJCQlpZiAoIXN0YXR1cykgeworCQkJCURCQ19BU1NFUlQoIUxTVF9JU19FTVBUWQorCQkJCQkgICAobXNnX3F1ZXVlX29iai0+bXNnX3VzZWRfbGlzdCkpOworCQkJCS8qIEdldCBtc2cgZnJvbSB1c2VkIGxpc3QgKi8KKwkJCQltc2dfZnJhbWVfb2JqID0gKHN0cnVjdCBtc2dfZnJhbWUgKikKKwkJCQkgICAgbHN0X2dldF9oZWFkKG1zZ19xdWV1ZV9vYmotPm1zZ191c2VkX2xpc3QpOworCQkJCS8qIENvcHkgbWVzc2FnZSBpbnRvIHBtc2cgYW5kIHB1dCBmcmFtZSBvbiB0aGUKKwkJCQkgKiBmcmVlIGxpc3QgKi8KKwkJCQlpZiAobXNnX2ZyYW1lX29iaiAhPSBOVUxMKSB7CisJCQkJCSpwbXNnID0gbXNnX2ZyYW1lX29iai0+bXNnX2RhdGEubXNnOworCQkJCQlsc3RfcHV0X3RhaWwKKwkJCQkJICAgIChtc2dfcXVldWVfb2JqLT5tc2dfZnJlZV9saXN0LAorCQkJCQkgICAgIChzdHJ1Y3QgbGlzdF9oZWFkICopCisJCQkJCSAgICAgbXNnX2ZyYW1lX29iaik7CisJCQkJfQorCQkJfQorCQkJbXNnX3F1ZXVlX29iai0+aW9fbXNnX3BlbmQtLTsKKwkJCS8qIFJlc2V0IHRoZSBldmVudCBpZiB0aGVyZSBhcmUgc3RpbGwgcXVldWVkIG1lc3NhZ2VzICovCisJCQlpZiAoIUxTVF9JU19FTVBUWShtc2dfcXVldWVfb2JqLT5tc2dfdXNlZF9saXN0KSkKKwkJCQlzeW5jX3NldF9ldmVudChtc2dfcXVldWVfb2JqLT5zeW5jX2V2ZW50KTsKKworCQkJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJCQlzcGluX3VubG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJCX0KKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfcHV0ID09PT09PT09CisgKiAgICAgIFB1dCBhIG1lc3NhZ2Ugb250byBhIG1zZ19jdHJsIHF1ZXVlLgorICovCitpbnQgYnJpZGdlX21zZ19wdXQoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaiwKKwkJCSAgY29uc3Qgc3RydWN0IGRzcF9tc2cgKnBtc2csIHUzMiB1dGltZW91dCkKK3sKKwlzdHJ1Y3QgbXNnX2ZyYW1lICptc2dfZnJhbWVfb2JqOworCXN0cnVjdCBtc2dfbWdyICpobXNnX21ncjsKKwlib29sIHB1dF9tc2cgPSBmYWxzZTsKKwlzdHJ1Y3Qgc3luY19vYmplY3QgKnN5bmNzWzJdOworCXUzMiBpbmRleDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghbXNnX3F1ZXVlX29iaiB8fCAhcG1zZyB8fCAhbXNnX3F1ZXVlX29iai0+aG1zZ19tZ3IpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaG1zZ19tZ3IgPSBtc2dfcXVldWVfb2JqLT5obXNnX21ncjsKKwlpZiAoIWhtc2dfbWdyLT5tc2dfZnJlZV9saXN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZobXNnX21nci0+bXNnX21ncl9sb2NrKTsKKworCS8qIElmIGEgbWVzc2FnZSBmcmFtZSBpcyBhdmFpbGFibGUsIHVzZSBpdCAqLworCWlmICghTFNUX0lTX0VNUFRZKGhtc2dfbWdyLT5tc2dfZnJlZV9saXN0KSkgeworCQltc2dfZnJhbWVfb2JqID0KKwkJICAgIChzdHJ1Y3QgbXNnX2ZyYW1lICopbHN0X2dldF9oZWFkKGhtc2dfbWdyLT5tc2dfZnJlZV9saXN0KTsKKwkJaWYgKG1zZ19mcmFtZV9vYmogIT0gTlVMTCkgeworCQkJbXNnX2ZyYW1lX29iai0+bXNnX2RhdGEubXNnID0gKnBtc2c7CisJCQltc2dfZnJhbWVfb2JqLT5tc2dfZGF0YS5tc2dxX2lkID0KKwkJCSAgICBtc2dfcXVldWVfb2JqLT5tc2dxX2lkOworCQkJbHN0X3B1dF90YWlsKGhtc2dfbWdyLT5tc2dfdXNlZF9saXN0LAorCQkJCSAgICAgKHN0cnVjdCBsaXN0X2hlYWQgKiltc2dfZnJhbWVfb2JqKTsKKwkJCWhtc2dfbWdyLT5tc2dzX3BlbmRpbmcrKzsKKwkJCXB1dF9tc2cgPSB0cnVlOworCQl9CisJCWlmIChMU1RfSVNfRU1QVFkoaG1zZ19tZ3ItPm1zZ19mcmVlX2xpc3QpKQorCQkJc3luY19yZXNldF9ldmVudChobXNnX21nci0+c3luY19ldmVudCk7CisKKwkJLyogUmVsZWFzZSBjcml0aWNhbCBzZWN0aW9uIGJlZm9yZSBzY2hlZHVsaW5nIERQQyAqLworCQlzcGluX3VubG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJCS8qIFNjaGVkdWxlIGEgRFBDLCB0byBkbyB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXI6ICovCisJCWlvc21fc2NoZWR1bGUoaG1zZ19tZ3ItPmhpb19tZ3IpOworCX0gZWxzZSB7CisJCWlmIChtc2dfcXVldWVfb2JqLT5kb25lKQorCQkJc3RhdHVzID0gLUVQRVJNOworCQllbHNlCisJCQltc2dfcXVldWVfb2JqLT5pb19tc2dfcGVuZCsrOworCisJCXNwaW5fdW5sb2NrX2JoKCZobXNnX21nci0+bXNnX21ncl9sb2NrKTsKKwl9CisJaWYgKCFzdGF0dXMgJiYgIXB1dF9tc2cpIHsKKwkJLyogV2FpdCB0aWwgYSBmcmVlIG1lc3NhZ2UgZnJhbWUgaXMgYXZhaWxhYmxlLCB0aW1lb3V0LAorCQkgKiBvciBkb25lICovCisJCXN5bmNzWzBdID0gaG1zZ19tZ3ItPnN5bmNfZXZlbnQ7CisJCXN5bmNzWzFdID0gbXNnX3F1ZXVlX29iai0+c3luY19kb25lOworCQlzdGF0dXMgPSBzeW5jX3dhaXRfb25fbXVsdGlwbGVfZXZlbnRzKHN5bmNzLCAyLCB1dGltZW91dCwKKwkJCQkJCSAgICAgICZpbmRleCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGZ1bmNfZW5kOworCQkvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisJCXNwaW5fbG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJCWlmIChtc2dfcXVldWVfb2JqLT5kb25lKSB7CisJCQltc2dfcXVldWVfb2JqLT5pb19tc2dfcGVuZC0tOworCQkJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJCQlzcGluX3VubG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJCQkvKiAgU2lnbmFsIHRoYXQgd2UncmUgbm90IGdvaW5nIHRvIGFjY2VzcyBtc2dfcXVldWVfb2JqCisJCQkgKiAgYW55bW9yZSwgc28gaXQgY2FuIGJlIGRlbGV0ZWQuICovCisJCQkodm9pZClzeW5jX3NldF9ldmVudChtc2dfcXVldWVfb2JqLT5zeW5jX2RvbmVfYWNrKTsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfSBlbHNlIHsKKwkJCWlmIChMU1RfSVNfRU1QVFkoaG1zZ19tZ3ItPm1zZ19mcmVlX2xpc3QpKSB7CisJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCQlnb3RvIGZ1bmNfY29udDsKKwkJCX0KKwkJCS8qIEdldCBtc2cgZnJvbSBmcmVlIGxpc3QgKi8KKwkJCW1zZ19mcmFtZV9vYmogPSAoc3RydWN0IG1zZ19mcmFtZSAqKQorCQkJICAgIGxzdF9nZXRfaGVhZChobXNnX21nci0+bXNnX2ZyZWVfbGlzdCk7CisJCQkvKgorCQkJICogQ29weSBtZXNzYWdlIGludG8gcG1zZyBhbmQgcHV0IGZyYW1lIG9uIHRoZQorCQkJICogdXNlZCBsaXN0LgorCQkJICovCisJCQlpZiAobXNnX2ZyYW1lX29iaikgeworCQkJCW1zZ19mcmFtZV9vYmotPm1zZ19kYXRhLm1zZyA9ICpwbXNnOworCQkJCW1zZ19mcmFtZV9vYmotPm1zZ19kYXRhLm1zZ3FfaWQgPQorCQkJCSAgICBtc2dfcXVldWVfb2JqLT5tc2dxX2lkOworCQkJCWxzdF9wdXRfdGFpbChobXNnX21nci0+bXNnX3VzZWRfbGlzdCwKKwkJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKW1zZ19mcmFtZV9vYmopOworCQkJCWhtc2dfbWdyLT5tc2dzX3BlbmRpbmcrKzsKKwkJCQkvKgorCQkJCSAqIFNjaGVkdWxlIGEgRFBDLCB0byBkbyB0aGUgYWN0dWFsCisJCQkJICogZGF0YSB0cmFuc2Zlci4KKwkJCQkgKi8KKwkJCQlpb3NtX3NjaGVkdWxlKGhtc2dfbWdyLT5oaW9fbWdyKTsKKwkJCX0KKworCQkJbXNnX3F1ZXVlX29iai0+aW9fbXNnX3BlbmQtLTsKKwkJCS8qIFJlc2V0IGV2ZW50IGlmIHRoZXJlIGFyZSBzdGlsbCBmcmFtZXMgYXZhaWxhYmxlICovCisJCQlpZiAoIUxTVF9JU19FTVBUWShobXNnX21nci0+bXNnX2ZyZWVfbGlzdCkpCisJCQkJc3luY19zZXRfZXZlbnQoaG1zZ19tZ3ItPnN5bmNfZXZlbnQpOworZnVuY19jb250OgorCQkJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJCQlzcGluX3VubG9ja19iaCgmaG1zZ19tZ3ItPm1zZ19tZ3JfbG9jayk7CisJCX0KKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfcmVnaXN0ZXJfbm90aWZ5ID09PT09PT09CisgKi8KK2ludCBicmlkZ2VfbXNnX3JlZ2lzdGVyX25vdGlmeShzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqLAorCQkJCSAgIHUzMiBldmVudF9tYXNrLCB1MzIgbm90aWZ5X3R5cGUsCisJCQkJICAgc3RydWN0IGRzcF9ub3RpZmljYXRpb24gKmhub3RpZmljYXRpb24pCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoIW1zZ19xdWV1ZV9vYmogfHwgIWhub3RpZmljYXRpb24pIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwlpZiAoIShldmVudF9tYXNrID09IERTUF9OT0RFTUVTU0FHRVJFQURZIHx8IGV2ZW50X21hc2sgPT0gMCkpIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCWlmIChub3RpZnlfdHlwZSAhPSBEU1BfU0lHTkFMRVZFTlQpIHsKKwkJc3RhdHVzID0gLUVCQURSOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCWlmIChldmVudF9tYXNrKQorCQlzdGF0dXMgPSBudGZ5X3JlZ2lzdGVyKG1zZ19xdWV1ZV9vYmotPm50Znlfb2JqLCBobm90aWZpY2F0aW9uLAorCQkJCQkJZXZlbnRfbWFzaywgbm90aWZ5X3R5cGUpOworCWVsc2UKKwkJc3RhdHVzID0gbnRmeV91bnJlZ2lzdGVyKG1zZ19xdWV1ZV9vYmotPm50Znlfb2JqLAorCQkJCQkJCWhub3RpZmljYXRpb24pOworCisJaWYgKHN0YXR1cyA9PSAtRUlOVkFMKSB7CisJCS8qICBOb3QgcmVnaXN0ZXJlZC4gT2ssIHNpbmNlIHdlIGNvdWxkbid0IGhhdmUga25vd24uIE5vZGUKKwkJICogIG5vdGlmaWNhdGlvbnMgYXJlIHNwbGl0IGJldHdlZW4gbm9kZSBzdGF0ZSBjaGFuZ2UgaGFuZGxlZAorCQkgKiAgYnkgTk9ERSwgYW5kIG1lc3NhZ2UgcmVhZHkgaGFuZGxlZCBieSBtc2dfY3RybC4gKi8KKwkJc3RhdHVzID0gMDsKKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfc2V0X3F1ZXVlX2lkID09PT09PT09CisgKi8KK3ZvaWQgYnJpZGdlX21zZ19zZXRfcXVldWVfaWQoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaiwgdTMyIG1zZ3FfaWQpCit7CisJLyoKKwkgKiAgQSBtZXNzYWdlIHF1ZXVlIG11c3QgYmUgY3JlYXRlZCB3aGVuIGEgbm9kZSBpcyBhbGxvY2F0ZWQsCisJICogIHNvIHRoYXQgbm9kZV9yZWdpc3Rlcl9ub3RpZnkoKSBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgbm9kZQorCSAqICBpcyBjcmVhdGVkLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBub2RlIGVudmlyb25tZW50IHVudGlsIHRoZQorCSAqICBub2RlIGlzIGNyZWF0ZWQsIHdlIG5lZWQgdGhpcyBmdW5jdGlvbiB0byBzZXQgbXNnX3F1ZXVlX29iai0+bXNncV9pZAorCSAqICB0byB0aGUgbm9kZSBlbnZpcm9ubWVudCwgYWZ0ZXIgdGhlIG5vZGUgaXMgY3JlYXRlZC4KKwkgKi8KKwlpZiAobXNnX3F1ZXVlX29iaikKKwkJbXNnX3F1ZXVlX29iai0+bXNncV9pZCA9IG1zZ3FfaWQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYWRkX25ld19tc2cgPT09PT09PT0KKyAqICAgICAgTXVzdCBiZSBjYWxsZWQgaW4gbWVzc2FnZSBtYW5hZ2VyIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgYWRkX25ld19tc2coc3RydWN0IGxzdF9saXN0ICptc2dfbGlzdCkKK3sKKwlzdHJ1Y3QgbXNnX2ZyYW1lICpwbXNnOworCWludCBzdGF0dXMgPSAwOworCisJcG1zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2dfZnJhbWUpLCBHRlBfQVRPTUlDKTsKKwlpZiAocG1zZyAhPSBOVUxMKSB7CisJCWxzdF9pbml0X2VsZW0oKHN0cnVjdCBsaXN0X2hlYWQgKilwbXNnKTsKKwkJbHN0X3B1dF90YWlsKG1zZ19saXN0LCAoc3RydWN0IGxpc3RfaGVhZCAqKXBtc2cpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkZWxldGVfbXNnX21nciA9PT09PT09PQorICovCitzdGF0aWMgdm9pZCBkZWxldGVfbXNnX21ncihzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3IpCit7CisJaWYgKCFobXNnX21ncikKKwkJZ290byBmdW5jX2VuZDsKKworCWlmIChobXNnX21nci0+cXVldWVfbGlzdCkgeworCQlpZiAoTFNUX0lTX0VNUFRZKGhtc2dfbWdyLT5xdWV1ZV9saXN0KSkgeworCQkJa2ZyZWUoaG1zZ19tZ3ItPnF1ZXVlX2xpc3QpOworCQkJaG1zZ19tZ3ItPnF1ZXVlX2xpc3QgPSBOVUxMOworCQl9CisJfQorCisJaWYgKGhtc2dfbWdyLT5tc2dfZnJlZV9saXN0KSB7CisJCWZyZWVfbXNnX2xpc3QoaG1zZ19tZ3ItPm1zZ19mcmVlX2xpc3QpOworCQlobXNnX21nci0+bXNnX2ZyZWVfbGlzdCA9IE5VTEw7CisJfQorCisJaWYgKGhtc2dfbWdyLT5tc2dfdXNlZF9saXN0KSB7CisJCWZyZWVfbXNnX2xpc3QoaG1zZ19tZ3ItPm1zZ191c2VkX2xpc3QpOworCQlobXNnX21nci0+bXNnX3VzZWRfbGlzdCA9IE5VTEw7CisJfQorCisJa2ZyZWUoaG1zZ19tZ3ItPnN5bmNfZXZlbnQpOworCisJa2ZyZWUoaG1zZ19tZ3IpOworZnVuY19lbmQ6CisJcmV0dXJuOworfQorCisvKgorICogID09PT09PT09IGRlbGV0ZV9tc2dfcXVldWUgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX21zZ19xdWV1ZShzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqLCB1MzIgbnVtX3RvX2RzcCkKK3sKKwlzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3I7CisJc3RydWN0IG1zZ19mcmFtZSAqcG1zZzsKKwl1MzIgaTsKKworCWlmICghbXNnX3F1ZXVlX29iaiB8fAorCSAgICAhbXNnX3F1ZXVlX29iai0+aG1zZ19tZ3IgfHwgIW1zZ19xdWV1ZV9vYmotPmhtc2dfbWdyLT5tc2dfZnJlZV9saXN0KQorCQlnb3RvIGZ1bmNfZW5kOworCisJaG1zZ19tZ3IgPSBtc2dfcXVldWVfb2JqLT5obXNnX21ncjsKKworCS8qIFB1bGwgb2ZmIG51bV90b19kc3AgbWVzc2FnZSBmcmFtZXMgZnJvbSBNc2cgbWFuYWdlciBhbmQgZnJlZSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fdG9fZHNwOyBpKyspIHsKKworCQlpZiAoIUxTVF9JU19FTVBUWShobXNnX21nci0+bXNnX2ZyZWVfbGlzdCkpIHsKKwkJCXBtc2cgPSAoc3RydWN0IG1zZ19mcmFtZSAqKQorCQkJICAgIGxzdF9nZXRfaGVhZChobXNnX21nci0+bXNnX2ZyZWVfbGlzdCk7CisJCQlrZnJlZShwbXNnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENhbm5vdCBmcmVlIGFsbCBvZiB0aGUgbWVzc2FnZSBmcmFtZXMgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG1zZ19xdWV1ZV9vYmotPm1zZ19mcmVlX2xpc3QpIHsKKwkJZnJlZV9tc2dfbGlzdChtc2dfcXVldWVfb2JqLT5tc2dfZnJlZV9saXN0KTsKKwkJbXNnX3F1ZXVlX29iai0+bXNnX2ZyZWVfbGlzdCA9IE5VTEw7CisJfQorCisJaWYgKG1zZ19xdWV1ZV9vYmotPm1zZ191c2VkX2xpc3QpIHsKKwkJZnJlZV9tc2dfbGlzdChtc2dfcXVldWVfb2JqLT5tc2dfdXNlZF9saXN0KTsKKwkJbXNnX3F1ZXVlX29iai0+bXNnX3VzZWRfbGlzdCA9IE5VTEw7CisJfQorCisJaWYgKG1zZ19xdWV1ZV9vYmotPm50Znlfb2JqKSB7CisJCW50ZnlfZGVsZXRlKG1zZ19xdWV1ZV9vYmotPm50Znlfb2JqKTsKKwkJa2ZyZWUobXNnX3F1ZXVlX29iai0+bnRmeV9vYmopOworCX0KKworCWtmcmVlKG1zZ19xdWV1ZV9vYmotPnN5bmNfZXZlbnQpOworCWtmcmVlKG1zZ19xdWV1ZV9vYmotPnN5bmNfZG9uZSk7CisJa2ZyZWUobXNnX3F1ZXVlX29iai0+c3luY19kb25lX2Fjayk7CisKKwlrZnJlZShtc2dfcXVldWVfb2JqKTsKK2Z1bmNfZW5kOgorCXJldHVybjsKKworfQorCisvKgorICogID09PT09PT09IGZyZWVfbXNnX2xpc3QgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgZnJlZV9tc2dfbGlzdChzdHJ1Y3QgbHN0X2xpc3QgKm1zZ19saXN0KQoreworCXN0cnVjdCBtc2dfZnJhbWUgKnBtc2c7CisKKwlpZiAoIW1zZ19saXN0KQorCQlnb3RvIGZ1bmNfZW5kOworCisJd2hpbGUgKChwbXNnID0gKHN0cnVjdCBtc2dfZnJhbWUgKilsc3RfZ2V0X2hlYWQobXNnX2xpc3QpKSAhPSBOVUxMKQorCQlrZnJlZShwbXNnKTsKKworCURCQ19BU1NFUlQoTFNUX0lTX0VNUFRZKG1zZ19saXN0KSk7CisKKwlrZnJlZShtc2dfbGlzdCk7CitmdW5jX2VuZDoKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxNDgyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYwpAQCAtMCwwICsxLDE4MDIgQEAKKy8qCisgKiB0aW9tYXAuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBQcm9jZXNzb3IgTWFuYWdlciBEcml2ZXIgZm9yIFRJIE9NQVAzNDMwIEVWTS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPHBsYXQvY29udHJvbC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rydi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIYXJkd2FyZSBBYnN0cmFjdGlvbiBMYXllciAqLworI2luY2x1ZGUgPGh3X2RlZnMuaD4KKyNpbmNsdWRlIDxod19tbXUuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpbmsgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwY2hubC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkZWguaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwaW8uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwbXNnLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3B3ci5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9pb19zbS5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhdGZvcm0gTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwYXBpLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RtbS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS93ZHQuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2FsICovCisjaW5jbHVkZSAiX3Rpb21hcC5oIgorI2luY2x1ZGUgIl90aW9tYXBfcHdyLmgiCisjaW5jbHVkZSAidGlvbWFwX2lvLmgiCisKKy8qIE9mZnNldCBpbiBzaGFyZWQgbWVtIHRvIHdyaXRlIHRvIGluIG9yZGVyIHRvIHN5bmNocm9uaXplIHN0YXJ0IHdpdGggRFNQICovCisjZGVmaW5lIFNITVNZTkNPRkZTRVQgNAkJLyogR1BQIGJ5dGUgb2Zmc2V0ICovCisKKyNkZWZpbmUgQlVGRkVSU0laRSAxMDI0CisKKyNkZWZpbmUgVElIRUxFTl9BQ0tUSU1FT1VUICAxMDAwMAorCisjZGVmaW5lIE1NVV9TRUNUSU9OX0FERFJfTUFTSyAgICAweEZGRjAwMDAwCisjZGVmaW5lIE1NVV9TU0VDVElPTl9BRERSX01BU0sgICAweEZGMDAwMDAwCisjZGVmaW5lIE1NVV9MQVJHRV9QQUdFX01BU0sgICAgICAweEZGRkYwMDAwCisjZGVmaW5lIE1NVV9TTUFMTF9QQUdFX01BU0sgICAgICAweEZGRkZGMDAwCisjZGVmaW5lIE9NQVAzX0lWQTJfQk9PVEFERFJfTUFTSyAweEZGRkZGQzAwCisjZGVmaW5lIFBBR0VTX0lJX0xWTF9UQUJMRSAgIDUxMgorI2RlZmluZSBQSFlTX1RPX1BBR0UocGh5cykgICAgICBwZm5fdG9fcGFnZSgocGh5cykgPj4gUEFHRV9TSElGVCkKKworLyogRm9yd2FyZCBEZWNsYXJhdGlvbnM6ICovCitzdGF0aWMgaW50IGJyaWRnZV9icmRfbW9uaXRvcihzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCk7CitzdGF0aWMgaW50IGJyaWRnZV9icmRfcmVhZChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgIHU4ICpob3N0X2J1ZmYsCisJCQkJICB1MzIgZHNwX2FkZHIsIHUzMiB1bF9udW1fYnl0ZXMsCisJCQkJICB1MzIgbWVtX3R5cGUpOworc3RhdGljIGludCBicmlkZ2VfYnJkX3N0YXJ0KHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCSAgIHUzMiBkc3BfYWRkcik7CitzdGF0aWMgaW50IGJyaWRnZV9icmRfc3RhdHVzKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCSAgICBpbnQgKmJvYXJkX3N0YXRlKTsKK3N0YXRpYyBpbnQgYnJpZGdlX2JyZF9zdG9wKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0KTsKK3N0YXRpYyBpbnQgYnJpZGdlX2JyZF93cml0ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgICB1OCAqaG9zdF9idWZmLAorCQkJCSAgIHUzMiBkc3BfYWRkciwgdTMyIHVsX251bV9ieXRlcywKKwkJCQkgICB1MzIgbWVtX3R5cGUpOworc3RhdGljIGludCBicmlkZ2VfYnJkX3NldF9zdGF0ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgICAgdTMyIGJyZF9zdGF0ZSk7CitzdGF0aWMgaW50IGJyaWRnZV9icmRfbWVtX2NvcHkoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgdTMyIGRzcF9kZXN0X2FkZHIsIHUzMiBkc3Bfc3JjX2FkZHIsCisJCQkJICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlKTsKK3N0YXRpYyBpbnQgYnJpZGdlX2JyZF9tZW1fd3JpdGUoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgIHU4ICpob3N0X2J1ZmYsIHUzMiBkc3BfYWRkciwKKwkJCQkgICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlKTsKK3N0YXRpYyBpbnQgYnJpZGdlX2JyZF9tZW1fbWFwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCSAgdTMyIHVsX21wdV9hZGRyLCB1MzIgdmlydF9hZGRyLAorCQkJCSAgdTMyIHVsX251bV9ieXRlcywgdTMyIHVsX21hcF9hdHRyLAorCQkJCSAgc3RydWN0IHBhZ2UgKiptYXBwZWRfcGFnZXMpOworc3RhdGljIGludCBicmlkZ2VfYnJkX21lbV91bl9tYXAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgICB1MzIgdmlydF9hZGRyLCB1MzIgdWxfbnVtX2J5dGVzKTsKK3N0YXRpYyBpbnQgYnJpZGdlX2Rldl9jcmVhdGUoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCQkqKmRldl9jbnR4dCwKKwkJCQkJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCQlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmNvbmZpZ19wYXJhbSk7CitzdGF0aWMgaW50IGJyaWRnZV9kZXZfY3RybChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCQkgIHUzMiBkd19jbWQsIHZvaWQgKnBhcmdzKTsKK3N0YXRpYyBpbnQgYnJpZGdlX2Rldl9kZXN0cm95KHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0KTsKK3N0YXRpYyB1MzIgdXNlcl92YTJfcGEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBhZGRyZXNzKTsKK3N0YXRpYyBpbnQgcHRlX3VwZGF0ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwgdTMyIHBhLAorCQkJICAgICB1MzIgdmEsIHUzMiBzaXplLAorCQkJICAgICBzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190ICptYXBfYXR0cnMpOworc3RhdGljIGludCBwdGVfc2V0KHN0cnVjdCBwZ190YWJsZV9hdHRycyAqcHQsIHUzMiBwYSwgdTMyIHZhLAorCQkJICB1MzIgc2l6ZSwgc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCAqYXR0cnMpOworc3RhdGljIGludCBtZW1fbWFwX3ZtYWxsb2Moc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJICB1MzIgdWxfbXB1X2FkZHIsIHUzMiB2aXJ0X2FkZHIsCisJCQkJICB1MzIgdWxfbnVtX2J5dGVzLAorCQkJCSAgc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCAqaHdfYXR0cnMpOworCitib29sIHdhaXRfZm9yX3N0YXJ0KHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LCB1MzIgZHdfc3luY19hZGRyKTsKKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbHMgKi8KKworLyogQXR0cmlidXRlcyBvZiBMMiBwYWdlIHRhYmxlcyBmb3IgRFNQIE1NVSAqLworc3RydWN0IHBhZ2VfaW5mbyB7CisJdTMyIG51bV9lbnRyaWVzOwkvKiBOdW1iZXIgb2YgdmFsaWQgUFRFcyBpbiB0aGUgTDIgUFQgKi8KK307CisKKy8qIEF0dHJpYnV0ZXMgdXNlZCB0byBtYW5hZ2UgdGhlIERTUCBNTVUgcGFnZSB0YWJsZXMgKi8KK3N0cnVjdCBwZ190YWJsZV9hdHRycyB7CisJc3BpbmxvY2tfdCBwZ19sb2NrOwkvKiBDcml0aWNhbCBzZWN0aW9uIG9iamVjdCBoYW5kbGUgKi8KKworCXUzMiBsMV9iYXNlX3BhOwkJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTDEgUFQgKi8KKwl1MzIgbDFfYmFzZV92YTsJCS8qIFZpcnR1YWwgIGFkZHJlc3Mgb2YgdGhlIEwxIFBUICovCisJdTMyIGwxX3NpemU7CQkvKiBTaXplIG9mIHRoZSBMMSBQVCAqLworCXUzMiBsMV90YmxfYWxsb2NfcGE7CisJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBBbGxvY2F0ZWQgbWVtIGZvciBMMSB0YWJsZS4gTWF5IG5vdCBiZSBhbGlnbmVkICovCisJdTMyIGwxX3RibF9hbGxvY192YTsKKwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgQWxsb2NhdGVkIG1lbSBmb3IgTDEgdGFibGUuIE1heSBub3QgYmUgYWxpZ25lZCAqLworCXUzMiBsMV90YmxfYWxsb2Nfc3o7CisJLyogU2l6ZSBvZiBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEwxIHRhYmxlLgorCSAqIE1heSBub3QgYmUgYWxpZ25lZCAqLworCisJdTMyIGwyX2Jhc2VfcGE7CQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBMMiBQVCAqLworCXUzMiBsMl9iYXNlX3ZhOwkJLyogVmlydHVhbCAgYWRkcmVzcyBvZiB0aGUgTDIgUFQgKi8KKwl1MzIgbDJfc2l6ZTsJCS8qIFNpemUgb2YgdGhlIEwyIFBUICovCisJdTMyIGwyX3RibF9hbGxvY19wYTsKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIEFsbG9jYXRlZCBtZW0gZm9yIEwyIHRhYmxlLiBNYXkgbm90IGJlIGFsaWduZWQgKi8KKwl1MzIgbDJfdGJsX2FsbG9jX3ZhOworCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBBbGxvY2F0ZWQgbWVtIGZvciBMMiB0YWJsZS4gTWF5IG5vdCBiZSBhbGlnbmVkICovCisJdTMyIGwyX3RibF9hbGxvY19zejsKKwkvKiBTaXplIG9mIGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgTDIgdGFibGUuCisJICogTWF5IG5vdCBiZSBhbGlnbmVkICovCisKKwl1MzIgbDJfbnVtX3BhZ2VzOwkvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIEwyIFBUICovCisJLyogQXJyYXkgW2wyX251bV9wYWdlc10gb2YgTDIgUFQgaW5mbyBzdHJ1Y3RzICovCisJc3RydWN0IHBhZ2VfaW5mbyAqcGdfaW5mbzsKK307CisKKy8qCisgKiAgVGhpcyBCcmlkZ2UgZHJpdmVyJ3MgZnVuY3Rpb24gaW50ZXJmYWNlIHRhYmxlLgorICovCitzdGF0aWMgc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlIGRydl9pbnRlcmZhY2VfZnhucyA9IHsKKwkvKiBCcmlkZ2UgQVBJIHZlci4gZm9yIHdoaWNoIHRoaXMgYnJpZGdlIGRyaXZlciBpcyBidWlsdC4gKi8KKwlCUkRfQVBJX01BSk9SX1ZFUlNJT04sCisJQlJEX0FQSV9NSU5PUl9WRVJTSU9OLAorCWJyaWRnZV9kZXZfY3JlYXRlLAorCWJyaWRnZV9kZXZfZGVzdHJveSwKKwlicmlkZ2VfZGV2X2N0cmwsCisJYnJpZGdlX2JyZF9tb25pdG9yLAorCWJyaWRnZV9icmRfc3RhcnQsCisJYnJpZGdlX2JyZF9zdG9wLAorCWJyaWRnZV9icmRfc3RhdHVzLAorCWJyaWRnZV9icmRfcmVhZCwKKwlicmlkZ2VfYnJkX3dyaXRlLAorCWJyaWRnZV9icmRfc2V0X3N0YXRlLAorCWJyaWRnZV9icmRfbWVtX2NvcHksCisJYnJpZGdlX2JyZF9tZW1fd3JpdGUsCisJYnJpZGdlX2JyZF9tZW1fbWFwLAorCWJyaWRnZV9icmRfbWVtX3VuX21hcCwKKwkvKiBUaGUgZm9sbG93aW5nIENITkwgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBieSBjaG5sX2lvLmxpYjogKi8KKwlicmlkZ2VfY2hubF9jcmVhdGUsCisJYnJpZGdlX2NobmxfZGVzdHJveSwKKwlicmlkZ2VfY2hubF9vcGVuLAorCWJyaWRnZV9jaG5sX2Nsb3NlLAorCWJyaWRnZV9jaG5sX2FkZF9pb19yZXEsCisJYnJpZGdlX2NobmxfZ2V0X2lvYywKKwlicmlkZ2VfY2hubF9jYW5jZWxfaW8sCisJYnJpZGdlX2NobmxfZmx1c2hfaW8sCisJYnJpZGdlX2NobmxfZ2V0X2luZm8sCisJYnJpZGdlX2NobmxfZ2V0X21ncl9pbmZvLAorCWJyaWRnZV9jaG5sX2lkbGUsCisJYnJpZGdlX2NobmxfcmVnaXN0ZXJfbm90aWZ5LAorCS8qIFRoZSBmb2xsb3dpbmcgSU8gZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBieSBjaG5sX2lvLmxpYjogKi8KKwlicmlkZ2VfaW9fY3JlYXRlLAorCWJyaWRnZV9pb19kZXN0cm95LAorCWJyaWRnZV9pb19vbl9sb2FkZWQsCisJYnJpZGdlX2lvX2dldF9wcm9jX2xvYWQsCisJLyogVGhlIGZvbGxvd2luZyBtc2dfY3RybCBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGJ5IGNobmxfaW8ubGliOiAqLworCWJyaWRnZV9tc2dfY3JlYXRlLAorCWJyaWRnZV9tc2dfY3JlYXRlX3F1ZXVlLAorCWJyaWRnZV9tc2dfZGVsZXRlLAorCWJyaWRnZV9tc2dfZGVsZXRlX3F1ZXVlLAorCWJyaWRnZV9tc2dfZ2V0LAorCWJyaWRnZV9tc2dfcHV0LAorCWJyaWRnZV9tc2dfcmVnaXN0ZXJfbm90aWZ5LAorCWJyaWRnZV9tc2dfc2V0X3F1ZXVlX2lkLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2FsbChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCkKK3sKKwlpZiAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfRFNQX0hJQkVSTkFUSU9OIHx8CisJICAgIGRldl9jb250ZXh0LT5kd19icmRfc3RhdGUgPT0gQlJEX0hJQkVSTkFUSU9OKQorCQl3YWtlX2RzcChkZXZfY29udGV4dCwgTlVMTCk7CisKKwlod19tbXVfdGxiX2ZsdXNoX2FsbChkZXZfY29udGV4dC0+ZHdfZHNwX21tdV9iYXNlKTsKK30KKworc3RhdGljIHZvaWQgYmFkX3BhZ2VfZHVtcCh1MzIgcGEsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlwcl9lbWVyZygiRFNQQlJJREdFOiBNQVAgZnVuY3Rpb246IENPVU5UIDAgRk9SIFBBIDB4JXhcbiIsIHBhKTsKKwlwcl9lbWVyZygiQmFkIHBhZ2Ugc3RhdGUgaW4gcHJvY2VzcyAnJXMnXG4iCisJCSAicGFnZTolcCBmbGFnczoweCUwKmx4IG1hcHBpbmc6JXAgbWFwY291bnQ6JWQgY291bnQ6JWRcbiIKKwkJICJCYWNrdHJhY2U6XG4iLAorCQkgY3VycmVudC0+Y29tbSwgcGcsIChpbnQpKDIgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLAorCQkgKHVuc2lnbmVkIGxvbmcpcGctPmZsYWdzLCBwZy0+bWFwcGluZywKKwkJIHBhZ2VfbWFwY291bnQocGcpLCBwYWdlX2NvdW50KHBnKSk7CisJZHVtcF9zdGFjaygpOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9kcnZfZW50cnkgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBCcmlkZ2UgRHJpdmVyIGVudHJ5IHBvaW50LgorICovCit2b2lkIGJyaWRnZV9kcnZfZW50cnkoc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICoqZHJ2X2ludGYsCisJCSAgIGNvbnN0IGNoYXIgKmRyaXZlcl9maWxlX25hbWUpCit7CisKKwlEQkNfUkVRVUlSRShkcml2ZXJfZmlsZV9uYW1lICE9IE5VTEwpOworCisJaW9fc21faW5pdCgpOwkJLyogSW5pdGlhbGl6YXRpb24gb2YgaW9fc20gbW9kdWxlICovCisKKwlpZiAoc3RyY21wKGRyaXZlcl9maWxlX25hbWUsICJVTUEiKSA9PSAwKQorCQkqZHJ2X2ludGYgPSAmZHJ2X2ludGVyZmFjZV9meG5zOworCWVsc2UKKwkJZGV2X2RiZyhicmlkZ2UsICIlcyBVbmtub3duIEJyaWRnZSBmaWxlIG5hbWUiLCBfX2Z1bmNfXyk7CisKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX21vbml0b3IgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBUaGlzIGJyaWRnZV9icmRfbW9uaXRvciBwdXRzIERTUCBpbnRvIGEgTG9hZGFibGUgc3RhdGUuCisgKiAgICAgIGkuZSBBcHBsaWNhdGlvbiBjYW4gbG9hZCBhbmQgc3RhcnQgdGhlIGRldmljZS4KKyAqCisgKiAgUHJlY29uZGl0aW9uczoKKyAqICAgICAgRGV2aWNlIGluICdPRkYnIHN0YXRlLgorICovCitzdGF0aWMgaW50IGJyaWRnZV9icmRfbW9uaXRvcihzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCkKK3sKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCA9IGRldl9jdHh0OworCXUzMiB0ZW1wOworCXN0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCSAgICBvbWFwX2RzcGJyaWRnZV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJdGVtcCA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1BNX1BXU1RTVCkgJgorCQkJCQlPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOworCWlmICghKHRlbXAgJiAweDAyKSkgeworCQkvKiBJVkEyIGlzIG5vdCBpbiBPTiBzdGF0ZSAqLworCQkvKiBSZWFkIGFuZCBzZXQgUE1fUFdTVENUUkxfSVZBMiAgdG8gT04gKi8KKwkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUF9QT1dFUlNUQVRFU1RfTUFTSywKKwkJCVBXUkRNX1BPV0VSX09OLCBPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVENUUkwpOworCQkvKiBTZXQgdGhlIFNXIHN1cGVydmlzZWQgc3RhdGUgdHJhbnNpdGlvbiAqLworCQkoKnBkYXRhLT5kc3BfY21fd3JpdGUpKE9NQVAzNFhYX0NMS1NUQ1RSTF9GT1JDRV9XQUtFVVAsCisJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9DTV9DTEtTVENUUkwpOworCisJCS8qIFdhaXQgdW50aWwgdGhlIHN0YXRlIGhhcyBtb3ZlZCB0byBPTiAqLworCQl3aGlsZSAoKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSAmCisJCQkJCQlPTUFQX0lOVFJBTlNJVElPTl9NQVNLKQorCQkJOworCQkvKiBEaXNhYmxlIEF1dG9tYXRpYyB0cmFuc2l0aW9uICovCisJCSgqcGRhdGEtPmRzcF9jbV93cml0ZSkoT01BUDM0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTywKKwkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX0NNX0NMS1NUQ1RSTCk7CisJfQorCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCAwLAorCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CisJZHNwX2Nsa19lbmFibGUoRFNQX0NMS19JVkEyKTsKKworCS8qIHNldCB0aGUgZGV2aWNlIHN0YXRlIHRvIElETEUgKi8KKwlkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID0gQlJEX0lETEU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX3JlYWQgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBSZWFkcyBidWZmZXJzIGZvciBEU1AgbWVtb3J5LgorICovCitzdGF0aWMgaW50IGJyaWRnZV9icmRfcmVhZChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgIHU4ICpob3N0X2J1ZmYsIHUzMiBkc3BfYWRkciwKKwkJCQkgIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fdHlwZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCA9IGRldl9jdHh0OworCXUzMiBvZmZzZXQ7CisJdTMyIGRzcF9iYXNlX2FkZHIgPSBkZXZfY3R4dC0+ZHdfZHNwX2Jhc2VfYWRkcjsKKworCWlmIChkc3BfYWRkciA8IGRldl9jb250ZXh0LT5kd19kc3Bfc3RhcnRfYWRkKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogY2hhbmdlIGhlcmUgdG8gYWNjb3VudCBmb3IgdGhlIDMgYmFuZHMgb2YgdGhlIERTUCBpbnRlcm5hbCBtZW1vcnkgKi8KKwlpZiAoKGRzcF9hZGRyIC0gZGV2X2NvbnRleHQtPmR3X2RzcF9zdGFydF9hZGQpIDwKKwkgICAgZGV2X2NvbnRleHQtPmR3X2ludGVybmFsX3NpemUpIHsKKwkJb2Zmc2V0ID0gZHNwX2FkZHIgLSBkZXZfY29udGV4dC0+ZHdfZHNwX3N0YXJ0X2FkZDsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSByZWFkX2V4dF9kc3BfZGF0YShkZXZfY29udGV4dCwgaG9zdF9idWZmLCBkc3BfYWRkciwKKwkJCQkJICAgdWxfbnVtX2J5dGVzLCBtZW1fdHlwZSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIGNvcHkgdGhlIGRhdGEgZnJvbSAgRFNQIG1lbW9yeSwgKi8KKwltZW1jcHkoaG9zdF9idWZmLCAodm9pZCAqKShkc3BfYmFzZV9hZGRyICsgb2Zmc2V0KSwgdWxfbnVtX2J5dGVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9icmRfc2V0X3N0YXRlID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgVGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIEJvYXJkIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBicmlkZ2VfYnJkX3NldF9zdGF0ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgICAgdTMyIGJyZF9zdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCA9IGRldl9jdHh0OworCisJZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9IGJyZF9zdGF0ZTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9icmRfc3RhcnQgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBJbml0aWFsaXplcyBEU1AgTU1VIGFuZCBTdGFydHMgRFNQLgorICoKKyAqICBQcmVjb25kaXRpb25zOgorICogIGEpIERTUCBkb21haW4gaXMgJ0FDVElWRScuCisgKiAgYikgRFNQX1JTVDEgaXMgYXNzZXJ0ZWQuCisgKiAgYikgRFNQX1JTVDIgaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBpbnQgYnJpZGdlX2JyZF9zdGFydChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgICB1MzIgZHNwX2FkZHIpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQgPSBkZXZfY3R4dDsKKwl1MzIgZHdfc3luY19hZGRyID0gMDsKKwl1MzIgdWxfc2htX2Jhc2U7CS8qIEdwcCBQaHlzIFNNIGJhc2UgYWRkcihieXRlKSAqLworCXUzMiB1bF9zaG1fYmFzZV92aXJ0OwkvKiBEc3AgVmlydCBTTSBiYXNlIGFkZHIgKi8KKwl1MzIgdWxfdGxiX2Jhc2VfdmlydDsJLyogQmFzZSBvZiBNTVUgVExCIGVudHJ5ICovCisJLyogT2Zmc2V0IG9mIHNobV9iYXNlX3ZpcnQgZnJvbSB0bGJfYmFzZV92aXJ0ICovCisJdTMyIHVsX3NobV9vZmZzZXRfdmlydDsKKwlzMzIgZW50cnlfbmR4OworCXMzMiBpdG1wX2VudHJ5X25keCA9IDA7CS8qIERTUC1NTVUgVExCIGVudHJ5IGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBjZmdfaG9zdHJlcyAqcmVzb3VyY2VzID0gTlVMTDsKKwl1MzIgdGVtcDsKKwl1MzIgdWxfZHNwX2Nsa19yYXRlOworCXUzMiB1bF9kc3BfY2xrX2FkZHI7CisJdTMyIHVsX2Jpb3NfZ3BfdGltZXI7CisJdTMyIGNsa19jbWQ7CisJc3RydWN0IGlvX21nciAqaGlvX21ncjsKKwl1MzIgdWxfbG9hZF9tb25pdG9yX3RpbWVyOworCXN0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCW9tYXBfZHNwYnJpZGdlX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwkvKiBUaGUgZGV2aWNlIGNvbnRleHQgY29udGFpbnMgYWxsIHRoZSBtbXUgc2V0dXAgaW5mbyBmcm9tIHdoZW4gdGhlCisJICogbGFzdCBkc3AgYmFzZSBpbWFnZSB3YXMgbG9hZGVkLiBUaGUgZmlyc3QgZW50cnkgaXMgYWx3YXlzCisJICogU0hNTUVNIGJhc2UuICovCisJLyogR2V0IFNITV9CRUcgLSBjb252ZXJ0IHRvIGJ5dGUgYWRkcmVzcyAqLworCSh2b2lkKWRldl9nZXRfc3ltYm9sKGRldl9jb250ZXh0LT5oZGV2X29iaiwgU0hNQkFTRU5BTUUsCisJCQkgICAgICZ1bF9zaG1fYmFzZV92aXJ0KTsKKwl1bF9zaG1fYmFzZV92aXJ0ICo9IERTUFdPUkRTSVpFOworCURCQ19BU1NFUlQodWxfc2htX2Jhc2VfdmlydCAhPSAwKTsKKwkvKiBEU1AgVmlydHVhbCBhZGRyZXNzICovCisJdWxfdGxiX2Jhc2VfdmlydCA9IGRldl9jb250ZXh0LT5hdGxiX2VudHJ5WzBdLnVsX2RzcF92YTsKKwlEQkNfQVNTRVJUKHVsX3RsYl9iYXNlX3ZpcnQgPD0gdWxfc2htX2Jhc2VfdmlydCk7CisJdWxfc2htX29mZnNldF92aXJ0ID0KKwkgICAgdWxfc2htX2Jhc2VfdmlydCAtICh1bF90bGJfYmFzZV92aXJ0ICogRFNQV09SRFNJWkUpOworCS8qIEtlcm5lbCBsb2dpY2FsIGFkZHJlc3MgKi8KKwl1bF9zaG1fYmFzZSA9IGRldl9jb250ZXh0LT5hdGxiX2VudHJ5WzBdLnVsX2dwcF92YSArIHVsX3NobV9vZmZzZXRfdmlydDsKKworCURCQ19BU1NFUlQodWxfc2htX2Jhc2UgIT0gMCk7CisJLyogMm5kIHdkIGlzIHVzZWQgYXMgc3luYyBmaWVsZCAqLworCWR3X3N5bmNfYWRkciA9IHVsX3NobV9iYXNlICsgU0hNU1lOQ09GRlNFVDsKKwkvKiBXcml0ZSBhIHNpZ25hdHVyZSBpbnRvIHRoZSBzaG0gYmFzZSArIG9mZnNldDsgdGhpcyB3aWxsCisJICogZ2V0IGNsZWFyZWQgd2hlbiB0aGUgRFNQIHByb2dyYW0gc3RhcnRzLiAqLworCWlmICgodWxfc2htX2Jhc2VfdmlydCA9PSAwKSB8fCAodWxfc2htX2Jhc2UgPT0gMCkpIHsKKwkJcHJfZXJyKCIlczogSWxsZWdhbCBTTSBiYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9IGVsc2UKKwkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGR3X3N5bmNfYWRkcik7CisKKwlpZiAoIXN0YXR1cykgeworCQlyZXNvdXJjZXMgPSBkZXZfY29udGV4dC0+cmVzb3VyY2VzOworCQlpZiAoIXJlc291cmNlcykKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKworCQkvKiBBc3NlcnQgUlNUMSBpLmUgb25seSB0aGUgUlNUIG9ubHkgZm9yIERTUCBtZWdhY2VsbCAqLworCQlpZiAoIXN0YXR1cykgeworCQkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUDM0MzBfUlNUMV9JVkEyX01BU0ssCisJCQkJCU9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwKKwkJCQkJT01BUDJfUk1fUlNUQ1RSTCk7CisJCQkvKiBNYXNrIGFkZHJlc3Mgd2l0aCAxSyBmb3IgY29tcGF0aWJpbGl0eSAqLworCQkJX19yYXdfd3JpdGVsKGRzcF9hZGRyICYgT01BUDNfSVZBMl9CT09UQUREUl9NQVNLLAorCQkJCQlPTUFQMzQzWF9DVFJMX1JFR0FERFIoCisJCQkJCU9NQVAzNDNYX0NPTlRST0xfSVZBMl9CT09UQUREUikpOworCQkJLyoKKwkJCSAqIFNldCBib290bW9kZSB0byBzZWxmIGxvb3AgaWYgZHNwX2RlYnVnIGZsYWcgaXMgdHJ1ZQorCQkJICovCisJCQlfX3Jhd193cml0ZWwoKGRzcF9kZWJ1ZykgPyBPTUFQM19JVkEyX0JPT1RNT0RfSURMRSA6IDAsCisJCQkJCU9NQVAzNDNYX0NUUkxfUkVHQUREUigKKwkJCQkJT01BUDM0M1hfQ09OVFJPTF9JVkEyX0JPT1RNT0QpKTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBSZXNldCBhbmQgVW5yZXNldCB0aGUgUlNUMiwgc28gdGhhdCBCT09UQUREUiBpcyBjb3BpZWQgdG8KKwkJICogSVZBMiBTWVNDIHJlZ2lzdGVyICovCisJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLAorCQkJT01BUDM0MzBfUlNUMl9JVkEyX01BU0ssIE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKKwkJdWRlbGF5KDEwMCk7CisJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCAwLAorCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CisJCXVkZWxheSgxMDApOworCisJCS8qIERpc2JhbGUgdGhlIERTUCBNTVUgKi8KKwkJaHdfbW11X2Rpc2FibGUocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UpOworCQkvKiBEaXNhYmxlIFRXTCAqLworCQlod19tbXVfdHdsX2Rpc2FibGUocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UpOworCisJCS8qIE9ubHkgbWFrZSBUTEIgZW50cnkgaWYgYm90aCBhZGRyZXNzZXMgYXJlIG5vbi16ZXJvICovCisJCWZvciAoZW50cnlfbmR4ID0gMDsgZW50cnlfbmR4IDwgQlJESU9DVExfTlVNT0ZNTVVUTEI7CisJCSAgICAgZW50cnlfbmR4KyspIHsKKwkJCXN0cnVjdCBicmlkZ2VfaW9jdGxfZXh0cHJvYyAqZSA9ICZkZXZfY29udGV4dC0+YXRsYl9lbnRyeVtlbnRyeV9uZHhdOworCQkJc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCBtYXBfYXR0cnMgPSB7CisJCQkJLmVuZGlhbmlzbSA9IGUtPmVuZGlhbmlzbSwKKwkJCQkuZWxlbWVudF9zaXplID0gZS0+ZWxlbV9zaXplLAorCQkJCS5taXhlZF9zaXplID0gZS0+bWl4ZWRfbW9kZSwKKwkJCX07CisKKwkJCWlmICghZS0+dWxfZ3BwX3BhIHx8ICFlLT51bF9kc3BfdmEpCisJCQkJY29udGludWU7CisKKwkJCWRldl9kYmcoYnJpZGdlLAorCQkJCQkiTU1VICVkLCBwYTogMHgleCwgdmE6IDB4JXgsIHNpemU6IDB4JXgiLAorCQkJCQlpdG1wX2VudHJ5X25keCwKKwkJCQkJZS0+dWxfZ3BwX3BhLAorCQkJCQllLT51bF9kc3BfdmEsCisJCQkJCWUtPnVsX3NpemUpOworCisJCQlod19tbXVfdGxiX2FkZChkZXZfY29udGV4dC0+ZHdfZHNwX21tdV9iYXNlLAorCQkJCQllLT51bF9ncHBfcGEsCisJCQkJCWUtPnVsX2RzcF92YSwKKwkJCQkJZS0+dWxfc2l6ZSwKKwkJCQkJaXRtcF9lbnRyeV9uZHgsCisJCQkJCSZtYXBfYXR0cnMsIDEsIDEpOworCisJCQlpdG1wX2VudHJ5X25keCsrOworCQl9CisJfQorCisJLyogTG9jayB0aGUgYWJvdmUgVExCIGVudHJpZXMgYW5kIGdldCB0aGUgQklPUyBhbmQgbG9hZCBtb25pdG9yIHRpbWVyCisJICogaW5mb3JtYXRpb24gKi8KKwlpZiAoIXN0YXR1cykgeworCQlod19tbXVfbnVtX2xvY2tlZF9zZXQocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UsIGl0bXBfZW50cnlfbmR4KTsKKwkJaHdfbW11X3ZpY3RpbV9udW1fc2V0KHJlc291cmNlcy0+ZHdfZG1tdV9iYXNlLCBpdG1wX2VudHJ5X25keCk7CisJCWh3X21tdV90dGJfc2V0KHJlc291cmNlcy0+ZHdfZG1tdV9iYXNlLAorCQkJICAgICAgIGRldl9jb250ZXh0LT5wdF9hdHRycy0+bDFfYmFzZV9wYSk7CisJCWh3X21tdV90d2xfZW5hYmxlKHJlc291cmNlcy0+ZHdfZG1tdV9iYXNlKTsKKwkJLyogRW5hYmxlIHRoZSBTbWFydElkbGUgYW5kIEF1dG9JZGxlIGJpdCBmb3IgTU1VX1NZU0NPTkZJRyAqLworCisJCXRlbXAgPSBfX3Jhd19yZWFkbCgocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UpICsgMHgxMCk7CisJCXRlbXAgPSAodGVtcCAmIDB4RkZGRkZGRUYpIHwgMHgxMTsKKwkJX19yYXdfd3JpdGVsKHRlbXAsIChyZXNvdXJjZXMtPmR3X2RtbXVfYmFzZSkgKyAweDEwKTsKKworCQkvKiBMZXQgdGhlIERTUCBNTVUgcnVuICovCisJCWh3X21tdV9lbmFibGUocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UpOworCisJCS8qIEVuYWJsZSB0aGUgQklPUyBjbG9jayAqLworCQkodm9pZClkZXZfZ2V0X3N5bWJvbChkZXZfY29udGV4dC0+aGRldl9vYmosCisJCQkJICAgICBCUklER0VJTklUX0JJT1NHUFRJTUVSLCAmdWxfYmlvc19ncF90aW1lcik7CisJCSh2b2lkKWRldl9nZXRfc3ltYm9sKGRldl9jb250ZXh0LT5oZGV2X29iaiwKKwkJCQkgICAgIEJSSURHRUlOSVRfTE9BRE1PTl9HUFRJTUVSLAorCQkJCSAgICAgJnVsX2xvYWRfbW9uaXRvcl90aW1lcik7CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJaWYgKHVsX2xvYWRfbW9uaXRvcl90aW1lciAhPSAweEZGRkYpIHsKKwkJCWNsa19jbWQgPSAoQlBXUl9FTkFCTEVfQ0xPQ0sgPDwgTUJYX1BNX0NMS19DTURTSElGVCkgfAorCQkJICAgIHVsX2xvYWRfbW9uaXRvcl90aW1lcjsKKwkJCWRzcF9wZXJpcGhlcmFsX2Nsa19jdHJsKGRldl9jb250ZXh0LCAmY2xrX2NtZCk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGJyaWRnZSwgIk5vdCBhYmxlIHRvIGdldCB0aGUgc3ltYm9sIGZvciBMb2FkICIKKwkJCQkiTW9uaXRvciBUaW1lclxuIik7CisJCX0KKwl9CisKKwlpZiAoIXN0YXR1cykgeworCQlpZiAodWxfYmlvc19ncF90aW1lciAhPSAweEZGRkYpIHsKKwkJCWNsa19jbWQgPSAoQlBXUl9FTkFCTEVfQ0xPQ0sgPDwgTUJYX1BNX0NMS19DTURTSElGVCkgfAorCQkJICAgIHVsX2Jpb3NfZ3BfdGltZXI7CisJCQlkc3BfcGVyaXBoZXJhbF9jbGtfY3RybChkZXZfY29udGV4dCwgJmNsa19jbWQpOworCQl9IGVsc2UgeworCQkJZGV2X2RiZyhicmlkZ2UsCisJCQkJIk5vdCBhYmxlIHRvIGdldCB0aGUgc3ltYm9sIGZvciBCSU9TIFRpbWVyXG4iKTsKKwkJfQorCX0KKworCWlmICghc3RhdHVzKSB7CisJCS8qIFNldCB0aGUgRFNQIGNsb2NrIHJhdGUgKi8KKwkJKHZvaWQpZGV2X2dldF9zeW1ib2woZGV2X2NvbnRleHQtPmhkZXZfb2JqLAorCQkJCSAgICAgIl9CUklER0VJTklUX0RTUF9GUkVRIiwgJnVsX2RzcF9jbGtfYWRkcik7CisJCS8qU2V0IEF1dG9pZGxlIE1vZGUgZm9yIElWQTIgUExMICovCisJCSgqcGRhdGEtPmRzcF9jbV93cml0ZSkoMSA8PCBPTUFQMzQzMF9BVVRPX0lWQTJfRFBMTF9TSElGVCwKKwkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDM0MzBfQ01fQVVUT0lETEVfUExMKTsKKworCQlpZiAoKHVuc2lnbmVkIGludCAqKXVsX2RzcF9jbGtfYWRkciAhPSBOVUxMKSB7CisJCQkvKiBHZXQgdGhlIGNsb2NrIHJhdGUgKi8KKwkJCXVsX2RzcF9jbGtfcmF0ZSA9IGRzcF9jbGtfZ2V0X2l2YTJfcmF0ZSgpOworCQkJZGV2X2RiZyhicmlkZ2UsICIlczogRFNQIGNsb2NrIHJhdGUgKEtIWik6IDB4JXggXG4iLAorCQkJCV9fZnVuY19fLCB1bF9kc3BfY2xrX3JhdGUpOworCQkJKHZvaWQpYnJpZGdlX2JyZF93cml0ZShkZXZfY29udGV4dCwKKwkJCQkJICAgICAgICh1OCAqKSAmdWxfZHNwX2Nsa19yYXRlLAorCQkJCQkgICAgICAgdWxfZHNwX2Nsa19hZGRyLCBzaXplb2YodTMyKSwgMCk7CisJCX0KKwkJLyoKKwkJICogRW5hYmxlIE1haWxib3ggZXZlbnRzIGFuZCBhbHNvIGRyYWluIGFueSBwZW5kaW5nCisJCSAqIHN0YWxlIG1lc3NhZ2VzLgorCQkgKi8KKwkJZGV2X2NvbnRleHQtPm1ib3ggPSBvbWFwX21ib3hfZ2V0KCJkc3AiKTsKKwkJaWYgKElTX0VSUihkZXZfY29udGV4dC0+bWJveCkpIHsKKwkJCWRldl9jb250ZXh0LT5tYm94ID0gTlVMTDsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBnZXQgZHNwIG1haWxib3ggaGFuZGxlXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCX0KKwlpZiAoIXN0YXR1cykgeworCQlkZXZfY29udGV4dC0+bWJveC0+cnhxLT5jYWxsYmFjayA9IChpbnQgKCopKHZvaWQgKikpaW9fbWJveF9tc2c7CisKKy8qUE1fSVZBMkdSUFNFTF9QRVIgPSAweEMwOyovCisJCXRlbXAgPSByZWFkbChyZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCXRlbXAgPSAodGVtcCAmIDB4RkZGRkZGMzApIHwgMHhDMDsKKwkJd3JpdGVsKHRlbXAsIHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE4KTsKKworLypQTV9NUFVHUlBTRUxfUEVSICY9IDB4RkZGRkZGM0Y7ICovCisJCXRlbXAgPSByZWFkbChyZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCXRlbXAgPSAodGVtcCAmIDB4RkZGRkZGM0YpOworCQl3cml0ZWwodGVtcCwgcmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworLypDTV9TTEVFUERFUF9QRVIgfD0gMHgwNDsgKi8KKwkJdGVtcCA9IHJlYWRsKHJlc291cmNlcy0+ZHdfcGVyX2Jhc2UgKyAweDQ0KTsKKwkJdGVtcCA9ICh0ZW1wICYgMHhGRkZGRkZGQikgfCAweDA0OworCQl3cml0ZWwodGVtcCwgcmVzb3VyY2VzLT5kd19wZXJfYmFzZSArIDB4NDQpOworCisvKkNNX0NMS1NUQ1RSTF9JVkEyID0gMHgwMDAwMDAwMyAtVG8gQWxsb3cgYXV0b21hdGljIHRyYW5zaXRpb25zICovCisJCSgqcGRhdGEtPmRzcF9jbV93cml0ZSkoT01BUDM0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPLAorCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfQ01fQ0xLU1RDVFJMKTsKKworCQkvKiBMZXQgRFNQIGdvICovCisJCWRldl9kYmcoYnJpZGdlLCAiJXMgVW5yZXNldFxuIiwgX19mdW5jX18pOworCQkvKiBFbmFibGUgRFNQIE1NVSBJbnRlcnJ1cHRzICovCisJCWh3X21tdV9ldmVudF9lbmFibGUocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UsCisJCQkJICAgIEhXX01NVV9BTExfSU5URVJSVVBUUyk7CisJCS8qIHJlbGVhc2UgdGhlIFJTVDEsIERTUCBzdGFydHMgZXhlY3V0aW5nIG5vdyAuLiAqLworCQkoKnBkYXRhLT5kc3BfcHJtX3Jtd19iaXRzKShPTUFQMzQzMF9SU1QxX0lWQTJfTUFTSywgMCwKKwkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1JNX1JTVENUUkwpOworCisJCWRldl9kYmcoYnJpZGdlLCAiV2FpdGluZyBmb3IgU3luYyBAIDB4JXhcbiIsIGR3X3N5bmNfYWRkcik7CisJCWRldl9kYmcoYnJpZGdlLCAiRFNQIGNfaW50MDAgQWRkcmVzcyA9ICAweCV4XG4iLCBkc3BfYWRkcik7CisJCWlmIChkc3BfZGVidWcpCisJCQl3aGlsZSAoX19yYXdfcmVhZHcoZHdfc3luY19hZGRyKSkKKwkJCQk7OworCisJCS8qIFdhaXQgZm9yIERTUCB0byBjbGVhciB3b3JkIGluIHNoYXJlZCBtZW1vcnkgKi8KKwkJLyogUmVhZCB0aGUgTG9jYXRpb24gKi8KKwkJaWYgKCF3YWl0X2Zvcl9zdGFydChkZXZfY29udGV4dCwgZHdfc3luY19hZGRyKSkKKwkJCXN0YXR1cyA9IC1FVElNRURPVVQ7CisKKwkJLyogU3RhcnQgd2R0ICovCisJCWRzcF93ZHRfc21fc2V0KCh2b2lkICopdWxfc2htX2Jhc2UpOworCQlkc3Bfd2R0X2VuYWJsZSh0cnVlKTsKKworCQlzdGF0dXMgPSBkZXZfZ2V0X2lvX21ncihkZXZfY29udGV4dC0+aGRldl9vYmosICZoaW9fbWdyKTsKKwkJaWYgKGhpb19tZ3IpIHsKKwkJCWlvX3NoX21zZXR0aW5nKGhpb19tZ3IsIFNITV9PUFBJTkZPLCBOVUxMKTsKKwkJCS8qIFdyaXRlIHRoZSBzeW5jaHJvbml6YXRpb24gYml0IHRvIGluZGljYXRlIHRoZQorCQkJICogY29tcGxldGlvbiBvZiBPUFAgdGFibGUgdXBkYXRlIHRvIERTUAorCQkJICovCisJCQlfX3Jhd193cml0ZWwoMFhDQUZFQ0FGRSwgZHdfc3luY19hZGRyKTsKKworCQkJLyogdXBkYXRlIGJvYXJkIHN0YXRlICovCisJCQlkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID0gQlJEX1JVTk5JTkc7CisJCQkvKiAodm9pZCljaG5sc21fZW5hYmxlX2ludGVycnVwdChkZXZfY29udGV4dCk7ICovCisJCX0gZWxzZSB7CisJCQlkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID0gQlJEX1VOS05PV047CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX3N0b3AgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBQdXRzIERTUCBpbiBzZWxmIGxvb3AuCisgKgorICogIFByZWNvbmRpdGlvbnMgOgorICogIGEpIE5vbmUKKyAqLworc3RhdGljIGludCBicmlkZ2VfYnJkX3N0b3Aoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQgPSBkZXZfY3R4dDsKKwlzdHJ1Y3QgcGdfdGFibGVfYXR0cnMgKnB0X2F0dHJzOworCXUzMiBkc3BfcHdyX3N0YXRlOworCWludCBjbGtfc3RhdHVzOworCXN0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCW9tYXBfZHNwYnJpZGdlX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfU1RPUFBFRCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIGFzIHBlciBUUk0sIGl0IGlzIGFkdmlzZWQgdG8gZmlyc3QgZHJpdmUgdGhlIElWQTIgdG8gJ1N0YW5kYnknIG1vZGUsCisJICogYmVmb3JlIHR1cm5pbmcgb2ZmIHRoZSBjbG9ja3MuLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBubworCSAqIHBlbmRpbmcgTDMgb3Igb3RoZXIgdHJhbnNhY3RvbnMgZnJvbSBJVkEyICovCisJZHNwX3B3cl9zdGF0ZSA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1BNX1BXU1RTVCkgJgorCQkJCQlPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOworCWlmIChkc3BfcHdyX3N0YXRlICE9IFBXUkRNX1BPV0VSX09GRikgeworCQkoKnBkYXRhLT5kc3BfcHJtX3Jtd19iaXRzKShPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSywgMCwKKwkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1JNX1JTVENUUkwpOworCQlzbV9pbnRlcnJ1cHRfZHNwKGRldl9jb250ZXh0LCBNQlhfUE1fRFNQSURMRSk7CisJCW1kZWxheSgxMCk7CisKKwkJLyogSVZBMiBpcyBub3QgaW4gT0ZGIHN0YXRlICovCisJCS8qIFNldCBQTV9QV1NUQ1RSTF9JVkEyICB0byBPRkYgKi8KKwkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUF9QT1dFUlNUQVRFU1RfTUFTSywKKwkJCVBXUkRNX1BPV0VSX09GRiwgT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1BNX1BXU1RDVFJMKTsKKwkJLyogU2V0IHRoZSBTVyBzdXBlcnZpc2VkIHN0YXRlIHRyYW5zaXRpb24gZm9yIFNsZWVwICovCisJCSgqcGRhdGEtPmRzcF9jbV93cml0ZSkoT01BUDM0WFhfQ0xLU1RDVFJMX0ZPUkNFX1NMRUVQLAorCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfQ01fQ0xLU1RDVFJMKTsKKwl9CisJdWRlbGF5KDEwKTsKKwkvKiBSZWxlYXNlIHRoZSBFeHQgQmFzZSB2aXJ0dWFsIEFkZHJlc3MgYXMgdGhlIG5leHQgRFNQIFByb2dyYW0KKwkgKiBtYXkgaGF2ZSBhIGRpZmZlcmVudCBsb2FkIGFkZHJlc3MgKi8KKwlpZiAoZGV2X2NvbnRleHQtPmR3X2RzcF9leHRfYmFzZV9hZGRyKQorCQlkZXZfY29udGV4dC0+ZHdfZHNwX2V4dF9iYXNlX2FkZHIgPSAwOworCisJZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9IEJSRF9TVE9QUEVEOwkvKiB1cGRhdGUgYm9hcmQgc3RhdGUgKi8KKworCWRzcF93ZHRfZW5hYmxlKGZhbHNlKTsKKworCS8qIFRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIGNsZWFyIHRoZSBNTVUgcGFnZSB0YWJsZXMgYXMgd2VsbCAqLworCWlmIChkZXZfY29udGV4dC0+cHRfYXR0cnMpIHsKKwkJcHRfYXR0cnMgPSBkZXZfY29udGV4dC0+cHRfYXR0cnM7CisJCW1lbXNldCgodTggKikgcHRfYXR0cnMtPmwxX2Jhc2VfdmEsIDB4MDAsIHB0X2F0dHJzLT5sMV9zaXplKTsKKwkJbWVtc2V0KCh1OCAqKSBwdF9hdHRycy0+bDJfYmFzZV92YSwgMHgwMCwgcHRfYXR0cnMtPmwyX3NpemUpOworCQltZW1zZXQoKHU4ICopIHB0X2F0dHJzLT5wZ19pbmZvLCAweDAwLAorCQkgICAgICAgKHB0X2F0dHJzLT5sMl9udW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2VfaW5mbykpKTsKKwl9CisJLyogRGlzYWJsZSB0aGUgbWFpbGJveCBpbnRlcnJ1cHRzICovCisJaWYgKGRldl9jb250ZXh0LT5tYm94KSB7CisJCW9tYXBfbWJveF9kaXNhYmxlX2lycShkZXZfY29udGV4dC0+bWJveCwgSVJRX1JYKTsKKwkJb21hcF9tYm94X3B1dChkZXZfY29udGV4dC0+bWJveCk7CisJCWRldl9jb250ZXh0LT5tYm94ID0gTlVMTDsKKwl9CisJLyogUmVzZXQgSVZBMiBjbG9ja3MqLworCSgqcGRhdGEtPmRzcF9wcm1fd3JpdGUpKE9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLIHwgT01BUDM0MzBfUlNUMl9JVkEyX01BU0sgfAorCQkJT01BUDM0MzBfUlNUM19JVkEyX01BU0ssIE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKKworCWNsa19zdGF0dXMgPSBkc3BfY2xrX2Rpc2FibGUoRFNQX0NMS19JVkEyKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2JyZF9zdGF0dXMgPT09PT09PT0KKyAqICAgICAgUmV0dXJucyB0aGUgYm9hcmQgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGJyaWRnZV9icmRfc3RhdHVzKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCSAgICBpbnQgKmJvYXJkX3N0YXRlKQoreworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0ID0gZGV2X2N0eHQ7CisJKmJvYXJkX3N0YXRlID0gZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX3dyaXRlID09PT09PT09CisgKiAgICAgIENvcGllcyB0aGUgYnVmZmVycyB0byBEU1AgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgbWVtb3J5LgorICovCitzdGF0aWMgaW50IGJyaWRnZV9icmRfd3JpdGUoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgdTggKmhvc3RfYnVmZiwgdTMyIGRzcF9hZGRyLAorCQkJCSAgIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fdHlwZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCA9IGRldl9jdHh0OworCisJaWYgKGRzcF9hZGRyIDwgZGV2X2NvbnRleHQtPmR3X2RzcF9zdGFydF9hZGQpIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAoKGRzcF9hZGRyIC0gZGV2X2NvbnRleHQtPmR3X2RzcF9zdGFydF9hZGQpIDwKKwkgICAgZGV2X2NvbnRleHQtPmR3X2ludGVybmFsX3NpemUpIHsKKwkJc3RhdHVzID0gd3JpdGVfZHNwX2RhdGEoZGV2X2N0eHQsIGhvc3RfYnVmZiwgZHNwX2FkZHIsCisJCQkJCXVsX251bV9ieXRlcywgbWVtX3R5cGUpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHdyaXRlX2V4dF9kc3BfZGF0YShkZXZfY29udGV4dCwgaG9zdF9idWZmLCBkc3BfYWRkciwKKwkJCQkJICAgIHVsX251bV9ieXRlcywgbWVtX3R5cGUsIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGJyaWRnZV9kZXZfY3JlYXRlID09PT09PT09CisgKiAgICAgIENyZWF0ZXMgYSBkcml2ZXIgb2JqZWN0LiBQdXRzIERTUCBpbiBzZWxmIGxvb3AuCisgKi8KK3N0YXRpYyBpbnQgYnJpZGdlX2Rldl9jcmVhdGUoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCQkqKmRldl9jbnR4dCwKKwkJCQkJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCQlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmNvbmZpZ19wYXJhbSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCA9IE5VTEw7CisJczMyIGVudHJ5X25keDsKKwlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKnJlc291cmNlcyA9IGNvbmZpZ19wYXJhbTsKKwlzdHJ1Y3QgcGdfdGFibGVfYXR0cnMgKnB0X2F0dHJzOworCXUzMiBwZ190YmxfcGE7CisJdTMyIHBnX3RibF92YTsKKwl1MzIgYWxpZ25fc2l6ZTsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBkYXRhIHN0cnVjdHVyZSB0byBjb250YWluIHRoZSBicmlkZ2UgZHJpdmVyCisJICogIHN0YXRlLCB3aGljaCBiZWNvbWVzIHRoZSBjb250ZXh0IGZvciBsYXRlciBjYWxscyBpbnRvIHRoaXMgZHJpdmVyICovCisJZGV2X2NvbnRleHQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZfY29udGV4dCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCWRldl9jb250ZXh0LT5kd19kc3Bfc3RhcnRfYWRkID0gKHUzMikgT01BUF9HRU1fQkFTRTsKKwlkZXZfY29udGV4dC0+ZHdfc2VsZl9sb29wID0gKHUzMikgTlVMTDsKKwlkZXZfY29udGV4dC0+ZHNwX3Blcl9jbGtzID0gMDsKKwlkZXZfY29udGV4dC0+ZHdfaW50ZXJuYWxfc2l6ZSA9IE9NQVBfRFNQX1NJWkU7CisJLyogIENsZWFyIGRldiBjb250ZXh0IE1NVSB0YWJsZSBlbnRyaWVzLgorCSAqICBUaGVzZSBnZXQgc2V0IG9uIGJyaWRnZV9pb19vbl9sb2FkZWQoKSBjYWxsIGFmdGVyIHByb2dyYW0gbG9hZGVkLiAqLworCWZvciAoZW50cnlfbmR4ID0gMDsgZW50cnlfbmR4IDwgQlJESU9DVExfTlVNT0ZNTVVUTEI7IGVudHJ5X25keCsrKSB7CisJCWRldl9jb250ZXh0LT5hdGxiX2VudHJ5W2VudHJ5X25keF0udWxfZ3BwX3BhID0KKwkJICAgIGRldl9jb250ZXh0LT5hdGxiX2VudHJ5W2VudHJ5X25keF0udWxfZHNwX3ZhID0gMDsKKwl9CisJZGV2X2NvbnRleHQtPmR3X2RzcF9iYXNlX2FkZHIgPSAodTMyKSBNRU1fTElORUFSX0FERFJFU1MoKHZvaWQgKikKKwkJCQkJCQkJIChjb25maWdfcGFyYW0tPgorCQkJCQkJCQkgIGR3X21lbV9iYXNlCisJCQkJCQkJCSAgWzNdKSwKKwkJCQkJCQkJIGNvbmZpZ19wYXJhbS0+CisJCQkJCQkJCSBkd19tZW1fbGVuZ3RoCisJCQkJCQkJCSBbM10pOworCWlmICghZGV2X2NvbnRleHQtPmR3X2RzcF9iYXNlX2FkZHIpCisJCXN0YXR1cyA9IC1FUEVSTTsKKworCXB0X2F0dHJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBnX3RhYmxlX2F0dHJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHB0X2F0dHJzICE9IE5VTEwpIHsKKwkJLyogQXNzdW1pbmcgdGhhdCB3ZSB1c2Ugb25seSBEU1AncyBtZW1vcnkgbWFwCisJCSAqIHVudGlsIDB4NDAwMDowMDAwICwgd2Ugd291bGQgbmVlZCBvbmx5IDEwMjQKKwkJICogTDEgZW50aWVzIGkuZSBMMSBzaXplID0gNEsgKi8KKwkJcHRfYXR0cnMtPmwxX3NpemUgPSAweDEwMDA7CisJCWFsaWduX3NpemUgPSBwdF9hdHRycy0+bDFfc2l6ZTsKKwkJLyogQWxpZ24gc2l6ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIHBvd2VyIG9mIDIgKi8KKwkJLyogd2UgbGlrZSB0byBnZXQgYWxpZ25lZCBvbiBMMSB0YWJsZSBzaXplICovCisJCXBnX3RibF92YSA9ICh1MzIpIG1lbV9hbGxvY19waHlzX21lbShwdF9hdHRycy0+bDFfc2l6ZSwKKwkJCQkJCSAgICAgYWxpZ25fc2l6ZSwgJnBnX3RibF9wYSk7CisKKwkJLyogQ2hlY2sgaWYgdGhlIFBBIGlzIGFsaWduZWQgZm9yIHVzICovCisJCWlmICgocGdfdGJsX3BhKSAmIChhbGlnbl9zaXplIC0gMSkpIHsKKwkJCS8qIFBBIG5vdCBhbGlnbmVkIHRvIHBhZ2UgdGFibGUgc2l6ZSAsCisJCQkgKiB0cnkgd2l0aCBtb3JlIGFsbG9jYXRpb24gYW5kIGFsaWduICovCisJCQltZW1fZnJlZV9waHlzX21lbSgodm9pZCAqKXBnX3RibF92YSwgcGdfdGJsX3BhLAorCQkJCQkgIHB0X2F0dHJzLT5sMV9zaXplKTsKKwkJCS8qIHdlIGxpa2UgdG8gZ2V0IGFsaWduZWQgb24gTDEgdGFibGUgc2l6ZSAqLworCQkJcGdfdGJsX3ZhID0KKwkJCSAgICAodTMyKSBtZW1fYWxsb2NfcGh5c19tZW0oKHB0X2F0dHJzLT5sMV9zaXplKSAqIDIsCisJCQkJCQkgICAgIGFsaWduX3NpemUsICZwZ190YmxfcGEpOworCQkJLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsaWduZWQgdGFibGUgbm93ICovCisJCQlwdF9hdHRycy0+bDFfdGJsX2FsbG9jX3BhID0gcGdfdGJsX3BhOworCQkJcHRfYXR0cnMtPmwxX3RibF9hbGxvY192YSA9IHBnX3RibF92YTsKKwkJCXB0X2F0dHJzLT5sMV90YmxfYWxsb2Nfc3ogPSBwdF9hdHRycy0+bDFfc2l6ZSAqIDI7CisJCQkvKiBBbGlnbiB0aGUgUEEgdG8gdGhlIG5leHQgJ2FsaWduJyAgYm91bmRhcnkgKi8KKwkJCXB0X2F0dHJzLT5sMV9iYXNlX3BhID0KKwkJCSAgICAoKHBnX3RibF9wYSkgKworCQkJICAgICAoYWxpZ25fc2l6ZSAtIDEpKSAmICh+KGFsaWduX3NpemUgLSAxKSk7CisJCQlwdF9hdHRycy0+bDFfYmFzZV92YSA9CisJCQkgICAgcGdfdGJsX3ZhICsgKHB0X2F0dHJzLT5sMV9iYXNlX3BhIC0gcGdfdGJsX3BhKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGdvdCBhbGlnbmVkIFBBLCBjb29sICovCisJCQlwdF9hdHRycy0+bDFfdGJsX2FsbG9jX3BhID0gcGdfdGJsX3BhOworCQkJcHRfYXR0cnMtPmwxX3RibF9hbGxvY192YSA9IHBnX3RibF92YTsKKwkJCXB0X2F0dHJzLT5sMV90YmxfYWxsb2Nfc3ogPSBwdF9hdHRycy0+bDFfc2l6ZTsKKwkJCXB0X2F0dHJzLT5sMV9iYXNlX3BhID0gcGdfdGJsX3BhOworCQkJcHRfYXR0cnMtPmwxX2Jhc2VfdmEgPSBwZ190YmxfdmE7CisJCX0KKwkJaWYgKHB0X2F0dHJzLT5sMV9iYXNlX3ZhKQorCQkJbWVtc2V0KCh1OCAqKSBwdF9hdHRycy0+bDFfYmFzZV92YSwgMHgwMCwKKwkJCSAgICAgICBwdF9hdHRycy0+bDFfc2l6ZSk7CisKKwkJLyogbnVtYmVyIG9mIEwyIHBhZ2UgdGFibGVzID0gRE1NIHBvb2wgdXNlZCArIFNITU1FTSArRVhUTUVNICsKKwkJICogTDQgcGFnZXMgKi8KKwkJcHRfYXR0cnMtPmwyX251bV9wYWdlcyA9ICgoRE1NUE9PTFNJWkUgPj4gMjApICsgNik7CisJCXB0X2F0dHJzLT5sMl9zaXplID0gSFdfTU1VX0NPQVJTRV9QQUdFX1NJWkUgKgorCQkgICAgcHRfYXR0cnMtPmwyX251bV9wYWdlczsKKwkJYWxpZ25fc2l6ZSA9IDQ7CS8qIE1ha2UgaXQgdTMyIGFsaWduZWQgKi8KKwkJLyogd2UgbGlrZSB0byBnZXQgYWxpZ25lZCBvbiBMMSB0YWJsZSBzaXplICovCisJCXBnX3RibF92YSA9ICh1MzIpIG1lbV9hbGxvY19waHlzX21lbShwdF9hdHRycy0+bDJfc2l6ZSwKKwkJCQkJCSAgICAgYWxpZ25fc2l6ZSwgJnBnX3RibF9wYSk7CisJCXB0X2F0dHJzLT5sMl90YmxfYWxsb2NfcGEgPSBwZ190YmxfcGE7CisJCXB0X2F0dHJzLT5sMl90YmxfYWxsb2NfdmEgPSBwZ190YmxfdmE7CisJCXB0X2F0dHJzLT5sMl90YmxfYWxsb2Nfc3ogPSBwdF9hdHRycy0+bDJfc2l6ZTsKKwkJcHRfYXR0cnMtPmwyX2Jhc2VfcGEgPSBwZ190YmxfcGE7CisJCXB0X2F0dHJzLT5sMl9iYXNlX3ZhID0gcGdfdGJsX3ZhOworCisJCWlmIChwdF9hdHRycy0+bDJfYmFzZV92YSkKKwkJCW1lbXNldCgodTggKikgcHRfYXR0cnMtPmwyX2Jhc2VfdmEsIDB4MDAsCisJCQkgICAgICAgcHRfYXR0cnMtPmwyX3NpemUpOworCisJCXB0X2F0dHJzLT5wZ19pbmZvID0ga3phbGxvYyhwdF9hdHRycy0+bDJfbnVtX3BhZ2VzICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBwYWdlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwkJZGV2X2RiZyhicmlkZ2UsCisJCQkiTDEgcGEgJXgsIHZhICV4LCBzaXplICV4XG4gTDIgcGEgJXgsIHZhICIKKwkJCSIleCwgc2l6ZSAleFxuIiwgcHRfYXR0cnMtPmwxX2Jhc2VfcGEsCisJCQlwdF9hdHRycy0+bDFfYmFzZV92YSwgcHRfYXR0cnMtPmwxX3NpemUsCisJCQlwdF9hdHRycy0+bDJfYmFzZV9wYSwgcHRfYXR0cnMtPmwyX2Jhc2VfdmEsCisJCQlwdF9hdHRycy0+bDJfc2l6ZSk7CisJCWRldl9kYmcoYnJpZGdlLCAicHRfYXR0cnMgJXAgTDIgTnVtUGFnZXMgJXggcGdfaW5mbyAlcFxuIiwKKwkJCXB0X2F0dHJzLCBwdF9hdHRycy0+bDJfbnVtX3BhZ2VzLCBwdF9hdHRycy0+cGdfaW5mbyk7CisJfQorCWlmICgocHRfYXR0cnMgIT0gTlVMTCkgJiYgKHB0X2F0dHJzLT5sMV9iYXNlX3ZhICE9IDApICYmCisJICAgIChwdF9hdHRycy0+bDJfYmFzZV92YSAhPSAwKSAmJiAocHRfYXR0cnMtPnBnX2luZm8gIT0gTlVMTCkpCisJCWRldl9jb250ZXh0LT5wdF9hdHRycyA9IHB0X2F0dHJzOworCWVsc2UKKwkJc3RhdHVzID0gLUVOT01FTTsKKworCWlmICghc3RhdHVzKSB7CisJCXNwaW5fbG9ja19pbml0KCZwdF9hdHRycy0+cGdfbG9jayk7CisJCWRldl9jb250ZXh0LT50Y193b3JkX3N3YXBfb24gPSBkcnZfZGF0YXAtPnRjX3dvcmRzd2Fwb247CisKKwkJLyogU2V0IHRoZSBDbG9jayBEaXZpc29yIGZvciB0aGUgRFNQIG1vZHVsZSAqLworCQl1ZGVsYXkoNSk7CisJCS8qIE1NVSBhZGRyZXNzIGlzIG9idGFpbmVkIGZyb20gdGhlIGhvc3QKKwkJICogcmVzb3VyY2VzIHN0cnVjdCAqLworCQlkZXZfY29udGV4dC0+ZHdfZHNwX21tdV9iYXNlID0gcmVzb3VyY2VzLT5kd19kbW11X2Jhc2U7CisJfQorCWlmICghc3RhdHVzKSB7CisJCWRldl9jb250ZXh0LT5oZGV2X29iaiA9IGhkZXZfb2JqOworCQkvKiBTdG9yZSBjdXJyZW50IGJvYXJkIHN0YXRlLiAqLworCQlkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID0gQlJEX1VOS05PV047CisJCWRldl9jb250ZXh0LT5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisJCWRzcF9jbGtfZW5hYmxlKERTUF9DTEtfSVZBMik7CisJCWJyaWRnZV9icmRfc3RvcChkZXZfY29udGV4dCk7CisJCS8qIFJldHVybiBwdHIgdG8gb3VyIGRldmljZSBzdGF0ZSB0byB0aGUgRFNQIEFQSSBmb3Igc3RvcmFnZSAqLworCQkqZGV2X2NudHh0ID0gZGV2X2NvbnRleHQ7CisJfSBlbHNlIHsKKwkJaWYgKHB0X2F0dHJzICE9IE5VTEwpIHsKKwkJCWtmcmVlKHB0X2F0dHJzLT5wZ19pbmZvKTsKKworCQkJaWYgKHB0X2F0dHJzLT5sMl90YmxfYWxsb2NfdmEpIHsKKwkJCQltZW1fZnJlZV9waHlzX21lbSgodm9pZCAqKQorCQkJCQkJICBwdF9hdHRycy0+bDJfdGJsX2FsbG9jX3ZhLAorCQkJCQkJICBwdF9hdHRycy0+bDJfdGJsX2FsbG9jX3BhLAorCQkJCQkJICBwdF9hdHRycy0+bDJfdGJsX2FsbG9jX3N6KTsKKwkJCX0KKwkJCWlmIChwdF9hdHRycy0+bDFfdGJsX2FsbG9jX3ZhKSB7CisJCQkJbWVtX2ZyZWVfcGh5c19tZW0oKHZvaWQgKikKKwkJCQkJCSAgcHRfYXR0cnMtPmwxX3RibF9hbGxvY192YSwKKwkJCQkJCSAgcHRfYXR0cnMtPmwxX3RibF9hbGxvY19wYSwKKwkJCQkJCSAgcHRfYXR0cnMtPmwxX3RibF9hbGxvY19zeik7CisJCQl9CisJCX0KKwkJa2ZyZWUocHRfYXR0cnMpOworCQlrZnJlZShkZXZfY29udGV4dCk7CisJfQorZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfZGV2X2N0cmwgPT09PT09PT0KKyAqICAgICAgUmVjZWl2ZXMgZGV2aWNlIHNwZWNpZmljIGNvbW1hbmRzLgorICovCitzdGF0aWMgaW50IGJyaWRnZV9kZXZfY3RybChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCQkgIHUzMiBkd19jbWQsIHZvaWQgKnBhcmdzKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBicmlkZ2VfaW9jdGxfZXh0cHJvYyAqcGFfZXh0X3Byb2MgPQorCQkJCQkoc3RydWN0IGJyaWRnZV9pb2N0bF9leHRwcm9jICopcGFyZ3M7CisJczMyIG5keDsKKworCXN3aXRjaCAoZHdfY21kKSB7CisJY2FzZSBCUkRJT0NUTF9DSE5MUkVBRDoKKwkJYnJlYWs7CisJY2FzZSBCUkRJT0NUTF9DSE5MV1JJVEU6CisJCWJyZWFrOworCWNhc2UgQlJESU9DVExfU0VUTU1VQ09ORklHOgorCQkvKiBzdG9yZSBhd2F5IGRzcC1tbXUgc2V0dXAgdmFsdWVzIGZvciBsYXRlciB1c2UgKi8KKwkJZm9yIChuZHggPSAwOyBuZHggPCBCUkRJT0NUTF9OVU1PRk1NVVRMQjsgbmR4KyssIHBhX2V4dF9wcm9jKyspCisJCQlkZXZfY29udGV4dC0+YXRsYl9lbnRyeVtuZHhdID0gKnBhX2V4dF9wcm9jOworCQlicmVhazsKKwljYXNlIEJSRElPQ1RMX0RFRVBTTEVFUDoKKwljYXNlIEJSRElPQ1RMX0VNRVJHRU5DWVNMRUVQOgorCQkvKiBDdXJyZW50bHkgb25seSBEU1AgSWRsZSBpcyBzdXBwb3J0ZWQgTmVlZCB0byB1cGRhdGUgZm9yCisJCSAqIGxhdGVyIHJlbGVhc2VzICovCisJCXN0YXR1cyA9IHNsZWVwX2RzcChkZXZfY29udGV4dCwgUFdSX0RFRVBTTEVFUCwgcGFyZ3MpOworCQlicmVhazsKKwljYXNlIEJSRElPQ1RMX1dBS0VVUDoKKwkJc3RhdHVzID0gd2FrZV9kc3AoZGV2X2NvbnRleHQsIHBhcmdzKTsKKwkJYnJlYWs7CisJY2FzZSBCUkRJT0NUTF9DTEtfQ1RSTDoKKwkJc3RhdHVzID0gMDsKKwkJLyogTG9va2luZyBGb3IgQmFzZXBvcnQgRml4IGZvciBDbG9ja3MgKi8KKwkJc3RhdHVzID0gZHNwX3BlcmlwaGVyYWxfY2xrX2N0cmwoZGV2X2NvbnRleHQsIHBhcmdzKTsKKwkJYnJlYWs7CisJY2FzZSBCUkRJT0NUTF9QV1JfSElCRVJOQVRFOgorCQlzdGF0dXMgPSBoYW5kbGVfaGliZXJuYXRpb25fZnJvbV9kc3AoZGV2X2NvbnRleHQpOworCQlicmVhazsKKwljYXNlIEJSRElPQ1RMX1BSRVNDQUxFX05PVElGWToKKwkJc3RhdHVzID0gcHJlX3NjYWxlX2RzcChkZXZfY29udGV4dCwgcGFyZ3MpOworCQlicmVhazsKKwljYXNlIEJSRElPQ1RMX1BPU1RTQ0FMRV9OT1RJRlk6CisJCXN0YXR1cyA9IHBvc3Rfc2NhbGVfZHNwKGRldl9jb250ZXh0LCBwYXJncyk7CisJCWJyZWFrOworCWNhc2UgQlJESU9DVExfQ09OU1RSQUlOVF9SRVFVRVNUOgorCQlzdGF0dXMgPSBoYW5kbGVfY29uc3RyYWludHNfc2V0KGRldl9jb250ZXh0LCBwYXJncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2Rldl9kZXN0cm95ID09PT09PT09CisgKiAgICAgIERlc3Ryb3lzIHRoZSBkcml2ZXIgb2JqZWN0LgorICovCitzdGF0aWMgaW50IGJyaWRnZV9kZXZfZGVzdHJveShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCkKK3sKKwlzdHJ1Y3QgcGdfdGFibGVfYXR0cnMgKnB0X2F0dHJzOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0ID0gKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKikKKwkgICAgZGV2X2N0eHQ7CisJc3RydWN0IGNmZ19ob3N0cmVzICpob3N0X3JlczsKKwl1MzIgc2htX3NpemU7CisJc3RydWN0IGRydl9kYXRhICpkcnZfZGF0YXAgPSBkZXZfZ2V0X2RydmRhdGEoYnJpZGdlKTsKKworCS8qIEl0IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlpZiAoIWRldl9jdHh0KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIGZpcnN0IHB1dCB0aGUgZGV2aWNlIHRvIHN0b3Agc3RhdGUgKi8KKwlicmlkZ2VfYnJkX3N0b3AoZGV2X2NvbnRleHQpOworCWlmIChkZXZfY29udGV4dC0+cHRfYXR0cnMpIHsKKwkJcHRfYXR0cnMgPSBkZXZfY29udGV4dC0+cHRfYXR0cnM7CisJCWtmcmVlKHB0X2F0dHJzLT5wZ19pbmZvKTsKKworCQlpZiAocHRfYXR0cnMtPmwyX3RibF9hbGxvY192YSkgeworCQkJbWVtX2ZyZWVfcGh5c19tZW0oKHZvaWQgKilwdF9hdHRycy0+bDJfdGJsX2FsbG9jX3ZhLAorCQkJCQkgIHB0X2F0dHJzLT5sMl90YmxfYWxsb2NfcGEsCisJCQkJCSAgcHRfYXR0cnMtPmwyX3RibF9hbGxvY19zeik7CisJCX0KKwkJaWYgKHB0X2F0dHJzLT5sMV90YmxfYWxsb2NfdmEpIHsKKwkJCW1lbV9mcmVlX3BoeXNfbWVtKCh2b2lkICopcHRfYXR0cnMtPmwxX3RibF9hbGxvY192YSwKKwkJCQkJICBwdF9hdHRycy0+bDFfdGJsX2FsbG9jX3BhLAorCQkJCQkgIHB0X2F0dHJzLT5sMV90YmxfYWxsb2Nfc3opOworCQl9CisJCWtmcmVlKHB0X2F0dHJzKTsKKworCX0KKworCWlmIChkZXZfY29udGV4dC0+cmVzb3VyY2VzKSB7CisJCWhvc3RfcmVzID0gZGV2X2NvbnRleHQtPnJlc291cmNlczsKKwkJc2htX3NpemUgPSBkcnZfZGF0YXAtPnNobV9zaXplOworCQlpZiAoc2htX3NpemUgPj0gMHgxMDAwMCkgeworCQkJaWYgKChob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbMV0pICYmCisJCQkgICAgKGhvc3RfcmVzLT5kd19tZW1fcGh5c1sxXSkpIHsKKwkJCQltZW1fZnJlZV9waHlzX21lbSgodm9pZCAqKQorCQkJCQkJICBob3N0X3Jlcy0+ZHdfbWVtX2Jhc2UKKwkJCQkJCSAgWzFdLAorCQkJCQkJICBob3N0X3Jlcy0+ZHdfbWVtX3BoeXMKKwkJCQkJCSAgWzFdLCBzaG1fc2l6ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBFcnJvciBnZXR0aW5nIHNobSBzaXplICIKKwkJCQkiZnJvbSByZWdpc3RyeTogJXguIE5vdCBjYWxsaW5nICIKKwkJCQkibWVtX2ZyZWVfcGh5c19tZW1cbiIsIF9fZnVuY19fLAorCQkJCXN0YXR1cyk7CisJCX0KKwkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzFdID0gMDsKKwkJaG9zdF9yZXMtPmR3X21lbV9waHlzWzFdID0gMDsKKworCQlpZiAoaG9zdF9yZXMtPmR3X21lbV9iYXNlWzBdKQorCQkJaW91bm1hcCgodm9pZCAqKWhvc3RfcmVzLT5kd19tZW1fYmFzZVswXSk7CisJCWlmIChob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbMl0pCisJCQlpb3VubWFwKCh2b2lkICopaG9zdF9yZXMtPmR3X21lbV9iYXNlWzJdKTsKKwkJaWYgKGhvc3RfcmVzLT5kd19tZW1fYmFzZVszXSkKKwkJCWlvdW5tYXAoKHZvaWQgKilob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbM10pOworCQlpZiAoaG9zdF9yZXMtPmR3X21lbV9iYXNlWzRdKQorCQkJaW91bm1hcCgodm9pZCAqKWhvc3RfcmVzLT5kd19tZW1fYmFzZVs0XSk7CisJCWlmIChob3N0X3Jlcy0+ZHdfZG1tdV9iYXNlKQorCQkJaW91bm1hcChob3N0X3Jlcy0+ZHdfZG1tdV9iYXNlKTsKKwkJaWYgKGhvc3RfcmVzLT5kd19wZXJfYmFzZSkKKwkJCWlvdW5tYXAoaG9zdF9yZXMtPmR3X3Blcl9iYXNlKTsKKwkJaWYgKGhvc3RfcmVzLT5kd19wZXJfcG1fYmFzZSkKKwkJCWlvdW5tYXAoKHZvaWQgKilob3N0X3Jlcy0+ZHdfcGVyX3BtX2Jhc2UpOworCQlpZiAoaG9zdF9yZXMtPmR3X2NvcmVfcG1fYmFzZSkKKwkJCWlvdW5tYXAoKHZvaWQgKilob3N0X3Jlcy0+ZHdfY29yZV9wbV9iYXNlKTsKKwkJaWYgKGhvc3RfcmVzLT5kd19zeXNfY3RybF9iYXNlKQorCQkJaW91bm1hcChob3N0X3Jlcy0+ZHdfc3lzX2N0cmxfYmFzZSk7CisKKwkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzBdID0gKHUzMikgTlVMTDsKKwkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzJdID0gKHUzMikgTlVMTDsKKwkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzNdID0gKHUzMikgTlVMTDsKKwkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzRdID0gKHUzMikgTlVMTDsKKwkJaG9zdF9yZXMtPmR3X2RtbXVfYmFzZSA9IE5VTEw7CisJCWhvc3RfcmVzLT5kd19zeXNfY3RybF9iYXNlID0gTlVMTDsKKworCQlrZnJlZShob3N0X3Jlcyk7CisJfQorCisJLyogRnJlZSB0aGUgZHJpdmVyJ3MgZGV2aWNlIGNvbnRleHQ6ICovCisJa2ZyZWUoZHJ2X2RhdGFwLT5iYXNlX2ltZyk7CisJa2ZyZWUoZHJ2X2RhdGFwKTsKKwlkZXZfc2V0X2RydmRhdGEoYnJpZGdlLCBOVUxMKTsKKwlrZnJlZSgodm9pZCAqKWRldl9jdHh0KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJyaWRnZV9icmRfbWVtX2NvcHkoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgdTMyIGRzcF9kZXN0X2FkZHIsIHUzMiBkc3Bfc3JjX2FkZHIsCisJCQkJICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBzcmNfYWRkciA9IGRzcF9zcmNfYWRkcjsKKwl1MzIgZGVzdF9hZGRyID0gZHNwX2Rlc3RfYWRkcjsKKwl1MzIgY29weV9ieXRlcyA9IDA7CisJdTMyIHRvdGFsX2J5dGVzID0gdWxfbnVtX2J5dGVzOworCXU4IGhvc3RfYnVmW0JVRkZFUlNJWkVdOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0ID0gZGV2X2N0eHQ7CisJd2hpbGUgKHRvdGFsX2J5dGVzID4gMCAmJiAhc3RhdHVzKSB7CisJCWNvcHlfYnl0ZXMgPQorCQkgICAgdG90YWxfYnl0ZXMgPiBCVUZGRVJTSVpFID8gQlVGRkVSU0laRSA6IHRvdGFsX2J5dGVzOworCQkvKiBSZWFkIGZyb20gRXh0ZXJuYWwgbWVtb3J5ICovCisJCXN0YXR1cyA9IHJlYWRfZXh0X2RzcF9kYXRhKGRldl9jdHh0LCBob3N0X2J1Ziwgc3JjX2FkZHIsCisJCQkJCSAgIGNvcHlfYnl0ZXMsIG1lbV90eXBlKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWlmIChkZXN0X2FkZHIgPCAoZGV2X2NvbnRleHQtPmR3X2RzcF9zdGFydF9hZGQgKworCQkJCQkgZGV2X2NvbnRleHQtPmR3X2ludGVybmFsX3NpemUpKSB7CisJCQkJLyogV3JpdGUgdG8gSW50ZXJuYWwgbWVtb3J5ICovCisJCQkJc3RhdHVzID0gd3JpdGVfZHNwX2RhdGEoZGV2X2N0eHQsIGhvc3RfYnVmLAorCQkJCQkJCWRlc3RfYWRkciwgY29weV9ieXRlcywKKwkJCQkJCQltZW1fdHlwZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFdyaXRlIHRvIEV4dGVybmFsIG1lbW9yeSAqLworCQkJCXN0YXR1cyA9CisJCQkJICAgIHdyaXRlX2V4dF9kc3BfZGF0YShkZXZfY3R4dCwgaG9zdF9idWYsCisJCQkJCQkgICAgICAgZGVzdF9hZGRyLCBjb3B5X2J5dGVzLAorCQkJCQkJICAgICAgIG1lbV90eXBlLCBmYWxzZSk7CisJCQl9CisJCX0KKwkJdG90YWxfYnl0ZXMgLT0gY29weV9ieXRlczsKKwkJc3JjX2FkZHIgKz0gY29weV9ieXRlczsKKwkJZGVzdF9hZGRyICs9IGNvcHlfYnl0ZXM7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIE1lbSBXcml0ZSBkb2VzIG5vdCBoYWx0IHRoZSBEU1AgdG8gd3JpdGUgdW5saWtlIGJyaWRnZV9icmRfd3JpdGUgKi8KK3N0YXRpYyBpbnQgYnJpZGdlX2JyZF9tZW1fd3JpdGUoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgIHU4ICpob3N0X2J1ZmYsIHUzMiBkc3BfYWRkciwKKwkJCQkgICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0ID0gZGV2X2N0eHQ7CisJdTMyIHVsX3JlbWFpbl9ieXRlcyA9IDA7CisJdTMyIHVsX2J5dGVzID0gMDsKKwl1bF9yZW1haW5fYnl0ZXMgPSB1bF9udW1fYnl0ZXM7CisJd2hpbGUgKHVsX3JlbWFpbl9ieXRlcyA+IDAgJiYgIXN0YXR1cykgeworCQl1bF9ieXRlcyA9CisJCSAgICB1bF9yZW1haW5fYnl0ZXMgPiBCVUZGRVJTSVpFID8gQlVGRkVSU0laRSA6IHVsX3JlbWFpbl9ieXRlczsKKwkJaWYgKGRzcF9hZGRyIDwgKGRldl9jb250ZXh0LT5kd19kc3Bfc3RhcnRfYWRkICsKKwkJCQkgZGV2X2NvbnRleHQtPmR3X2ludGVybmFsX3NpemUpKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIHdyaXRlX2RzcF9kYXRhKGRldl9jdHh0LCBob3N0X2J1ZmYsIGRzcF9hZGRyLAorCQkJCQkgICB1bF9ieXRlcywgbWVtX3R5cGUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gd3JpdGVfZXh0X2RzcF9kYXRhKGRldl9jdHh0LCBob3N0X2J1ZmYsCisJCQkJCQkgICAgZHNwX2FkZHIsIHVsX2J5dGVzLAorCQkJCQkJICAgIG1lbV90eXBlLCB0cnVlKTsKKwkJfQorCQl1bF9yZW1haW5fYnl0ZXMgLT0gdWxfYnl0ZXM7CisJCWRzcF9hZGRyICs9IHVsX2J5dGVzOworCQlob3N0X2J1ZmYgPSBob3N0X2J1ZmYgKyB1bF9ieXRlczsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX21lbV9tYXAgPT09PT09PT0KKyAqICAgICAgVGhpcyBmdW5jdGlvbiBtYXBzIE1QVSBidWZmZXIgdG8gdGhlIERTUCBhZGRyZXNzIHNwYWNlLiBJdCBwZXJmb3JtcworICogIGxpbmVhciB0byBwaHlzaWNhbCBhZGRyZXNzIHRyYW5zbGF0aW9uIGlmIHJlcXVpcmVkLiBJdCB0cmFuc2xhdGVzIGVhY2gKKyAqICBwYWdlIHNpbmNlIGxpbmVhciBhZGRyZXNzZXMgY2FuIGJlIHBoeXNpY2FsbHkgbm9uLWNvbnRpZ3VvdXMKKyAqICBBbGwgYWRkcmVzcyAmIHNpemUgYXJndW1lbnRzIGFyZSBhc3N1bWVkIHRvIGJlIHBhZ2UgYWxpZ25lZCAoaW4gcHJvYy5jKQorICoKKyAqICBUT0RPOiBEaXNhYmxlIE1NVSB3aGlsZSB1cGRhdGluZyB0aGUgcGFnZSB0YWJsZXMgKGJ1dCB0aGF0J2xsIHN0YWxsIERTUCkKKyAqLworc3RhdGljIGludCBicmlkZ2VfYnJkX21lbV9tYXAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICB1MzIgdWxfbXB1X2FkZHIsIHUzMiB2aXJ0X2FkZHIsCisJCQkJICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgdWxfbWFwX2F0dHIsCisJCQkJICBzdHJ1Y3QgcGFnZSAqKm1hcHBlZF9wYWdlcykKK3sKKwl1MzIgYXR0cnM7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQgPSBkZXZfY3R4dDsKKwlzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190IGh3X2F0dHJzOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJdTMyIHdyaXRlID0gMDsKKwl1MzIgbnVtX3Vzcl9wZ3MgPSAwOworCXN0cnVjdCBwYWdlICptYXBwZWRfcGFnZSwgKnBnOworCXMzMiBwZ19udW07CisJdTMyIHZhID0gdmlydF9hZGRyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycl90YXNrID0gY3VycmVudDsKKwl1MzIgcGdfaSA9IDA7CisJdTMyIG1wdV9hZGRyLCBwYTsKKworCWRldl9kYmcoYnJpZGdlLAorCQkiJXMgaERldkN0eHQgJXAsIHBhICV4LCB2YSAleCwgc2l6ZSAleCwgdWxfbWFwX2F0dHIgJXhcbiIsCisJCV9fZnVuY19fLCBkZXZfY3R4dCwgdWxfbXB1X2FkZHIsIHZpcnRfYWRkciwgdWxfbnVtX2J5dGVzLAorCQl1bF9tYXBfYXR0cik7CisJaWYgKHVsX251bV9ieXRlcyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bF9tYXBfYXR0ciAmIERTUF9NQVBfRElSX01BU0spIHsKKwkJYXR0cnMgPSB1bF9tYXBfYXR0cjsKKwl9IGVsc2UgeworCQkvKiBBc3NpZ24gZGVmYXVsdCBhdHRyaWJ1dGVzICovCisJCWF0dHJzID0gdWxfbWFwX2F0dHIgfCAoRFNQX01BUFZJUlRVQUxBRERSIHwgRFNQX01BUEVMRU1TSVpFMTYpOworCX0KKwkvKiBUYWtlIG1hcHBpbmcgcHJvcGVydGllcyAqLworCWlmIChhdHRycyAmIERTUF9NQVBCSUdFTkRJQU4pCisJCWh3X2F0dHJzLmVuZGlhbmlzbSA9IEhXX0JJR19FTkRJQU47CisJZWxzZQorCQlod19hdHRycy5lbmRpYW5pc20gPSBIV19MSVRUTEVfRU5ESUFOOworCisJaHdfYXR0cnMubWl4ZWRfc2l6ZSA9IChlbnVtIGh3X21tdV9taXhlZF9zaXplX3QpCisJICAgICgoYXR0cnMgJiBEU1BfTUFQTUlYRURFTEVNU0laRSkgPj4gMik7CisJLyogSWdub3JlIGVsZW1lbnRfc2l6ZSBpZiBtaXhlZF9zaXplIGlzIGVuYWJsZWQgKi8KKwlpZiAoaHdfYXR0cnMubWl4ZWRfc2l6ZSA9PSAwKSB7CisJCWlmIChhdHRycyAmIERTUF9NQVBFTEVNU0laRTgpIHsKKwkJCS8qIFNpemUgaXMgOCBiaXQgKi8KKwkJCWh3X2F0dHJzLmVsZW1lbnRfc2l6ZSA9IEhXX0VMRU1fU0laRThCSVQ7CisJCX0gZWxzZSBpZiAoYXR0cnMgJiBEU1BfTUFQRUxFTVNJWkUxNikgeworCQkJLyogU2l6ZSBpcyAxNiBiaXQgKi8KKwkJCWh3X2F0dHJzLmVsZW1lbnRfc2l6ZSA9IEhXX0VMRU1fU0laRTE2QklUOworCQl9IGVsc2UgaWYgKGF0dHJzICYgRFNQX01BUEVMRU1TSVpFMzIpIHsKKwkJCS8qIFNpemUgaXMgMzIgYml0ICovCisJCQlod19hdHRycy5lbGVtZW50X3NpemUgPSBIV19FTEVNX1NJWkUzMkJJVDsKKwkJfSBlbHNlIGlmIChhdHRycyAmIERTUF9NQVBFTEVNU0laRTY0KSB7CisJCQkvKiBTaXplIGlzIDY0IGJpdCAqLworCQkJaHdfYXR0cnMuZWxlbWVudF9zaXplID0gSFdfRUxFTV9TSVpFNjRCSVQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTWl4ZWRzaXplIGlzbid0IGVuYWJsZWQsIHNvIHNpemUgY2FuJ3QgYmUKKwkJCSAqIHplcm8gaGVyZQorCQkJICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAoYXR0cnMgJiBEU1BfTUFQRE9OT1RMT0NLKQorCQlod19hdHRycy5kb25vdGxvY2ttcHVwYWdlID0gMTsKKwllbHNlCisJCWh3X2F0dHJzLmRvbm90bG9ja21wdXBhZ2UgPSAwOworCisJaWYgKGF0dHJzICYgRFNQX01BUFZNQUxMT0NBRERSKSB7CisJCXJldHVybiBtZW1fbWFwX3ZtYWxsb2MoZGV2X2N0eHQsIHVsX21wdV9hZGRyLCB2aXJ0X2FkZHIsCisJCQkJICAgICAgIHVsX251bV9ieXRlcywgJmh3X2F0dHJzKTsKKwl9CisJLyoKKwkgKiBEbyBPUy1zcGVjaWZpYyB1c2VyLXZhIHRvIHBhIHRyYW5zbGF0aW9uLgorCSAqIENvbWJpbmUgcGh5c2ljYWxseSBjb250aWd1b3VzIHJlZ2lvbnMgdG8gcmVkdWNlIFRMQnMuCisJICogUGFzcyB0aGUgdHJhbnNsYXRlZCBwYSB0byBwdGVfdXBkYXRlLgorCSAqLworCWlmICgoYXR0cnMgJiBEU1BfTUFQUEhZU0lDQUxBRERSKSkgeworCQlzdGF0dXMgPSBwdGVfdXBkYXRlKGRldl9jb250ZXh0LCB1bF9tcHVfYWRkciwgdmlydF9hZGRyLAorCQkJCSAgICB1bF9udW1fYnl0ZXMsICZod19hdHRycyk7CisJCWdvdG8gZnVuY19jb250OworCX0KKworCS8qCisJICogSW1wb3J0YW50IE5vdGU6IHVsX21wdV9hZGRyIGlzIG1hcHBlZCBmcm9tIHVzZXIgYXBwbGljYXRpb24gcHJvY2VzcworCSAqIHRvIGN1cnJlbnQgcHJvY2VzcyAtIGl0IG11c3QgbGllIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBjdXJyZW50CisJICogdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBzcGFjZSBpbiBvcmRlciB0byBiZSBvZiB1c2UgdG8gdXMgaGVyZSEKKwkgKi8KKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIHVsX21wdV9hZGRyKTsKKwlpZiAodm1hKQorCQlkZXZfZGJnKGJyaWRnZSwKKwkJCSJWTUFmb3IgVXNlckJ1ZjogdWxfbXB1X2FkZHI9JXgsIHVsX251bV9ieXRlcz0leCwgIgorCQkJInZtX3N0YXJ0PSVseCwgdm1fZW5kPSVseCwgdm1fZmxhZ3M9JWx4XG4iLCB1bF9tcHVfYWRkciwKKwkJCXVsX251bV9ieXRlcywgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsCisJCQl2bWEtPnZtX2ZsYWdzKTsKKworCS8qCisJICogSXQgaXMgb2JzZXJ2ZWQgdGhhdCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMsIHRoZSB1c2VyIGJ1ZmZlciBpcworCSAqIHNwcmVhZCBhY3Jvc3Mgc2V2ZXJhbCBWTUFzLiBTbyBsb29wIHRocm91Z2ggYW5kIGNoZWNrIGlmIHRoZSBlbnRpcmUKKwkgKiB1c2VyIGJ1ZmZlciBpcyBjb3ZlcmVkCisJICovCisJd2hpbGUgKCh2bWEpICYmICh1bF9tcHVfYWRkciArIHVsX251bV9ieXRlcyA+IHZtYS0+dm1fZW5kKSkgeworCQkvKiBqdW1wIHRvIHRoZSBuZXh0IFZNQSByZWdpb24gKi8KKwkJdm1hID0gZmluZF92bWEobW0sIHZtYS0+dm1fZW5kICsgMSk7CisJCWRldl9kYmcoYnJpZGdlLAorCQkJIlZNQSBmb3IgVXNlckJ1ZiB1bF9tcHVfYWRkcj0leCB1bF9udW1fYnl0ZXM9JXgsICIKKwkJCSJ2bV9zdGFydD0lbHgsIHZtX2VuZD0lbHgsIHZtX2ZsYWdzPSVseFxuIiwgdWxfbXB1X2FkZHIsCisJCQl1bF9udW1fYnl0ZXMsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAorCQkJdm1hLT52bV9mbGFncyk7CisJfQorCWlmICghdm1hKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBnZXQgVk1BIHJlZ2lvbiBmb3IgMHgleCAoJWQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIHVsX21wdV9hZGRyLCB1bF9udW1fYnl0ZXMpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCQlnb3RvIGZ1bmNfY29udDsKKwl9CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX0lPKSB7CisJCW51bV91c3JfcGdzID0gdWxfbnVtX2J5dGVzIC8gUEdfU0laRTRLOworCQltcHVfYWRkciA9IHVsX21wdV9hZGRyOworCisJCS8qIEdldCB0aGUgcGh5c2ljYWwgYWRkcmVzc2VzIGZvciB1c2VyIGJ1ZmZlciAqLworCQlmb3IgKHBnX2kgPSAwOyBwZ19pIDwgbnVtX3Vzcl9wZ3M7IHBnX2krKykgeworCQkJcGEgPSB1c2VyX3ZhMl9wYShtbSwgbXB1X2FkZHIpOworCQkJaWYgKCFwYSkgeworCQkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJCQlwcl9lcnIoIkRTUEJSSURHRTogVk1fSU8gbWFwcGluZyBwaHlzaWNhbCIKKwkJCQkgICAgICAgImFkZHJlc3MgaXMgaW52YWxpZFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocGZuX3ZhbGlkKF9fcGh5c190b19wZm4ocGEpKSkgeworCQkJCXBnID0gUEhZU19UT19QQUdFKHBhKTsKKwkJCQlnZXRfcGFnZShwZyk7CisJCQkJaWYgKHBhZ2VfY291bnQocGcpIDwgMSkgeworCQkJCQlwcl9lcnIoIkJhZCBwYWdlIGluIFZNX0lPIGJ1ZmZlclxuIik7CisJCQkJCWJhZF9wYWdlX2R1bXAocGEsIHBnKTsKKwkJCQl9CisJCQl9CisJCQlzdGF0dXMgPSBwdGVfc2V0KGRldl9jb250ZXh0LT5wdF9hdHRycywgcGEsCisJCQkJCSB2YSwgSFdfUEFHRV9TSVpFNEtCLCAmaHdfYXR0cnMpOworCQkJaWYgKHN0YXR1cykKKwkJCQlicmVhazsKKworCQkJdmEgKz0gSFdfUEFHRV9TSVpFNEtCOworCQkJbXB1X2FkZHIgKz0gSFdfUEFHRV9TSVpFNEtCOworCQkJcGEgKz0gSFdfUEFHRV9TSVpFNEtCOworCQl9CisJfSBlbHNlIHsKKwkJbnVtX3Vzcl9wZ3MgPSB1bF9udW1fYnl0ZXMgLyBQR19TSVpFNEs7CisJCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFIHwgVk1fTUFZV1JJVEUpKQorCQkJd3JpdGUgPSAxOworCisJCWZvciAocGdfaSA9IDA7IHBnX2kgPCBudW1fdXNyX3BnczsgcGdfaSsrKSB7CisJCQlwZ19udW0gPSBnZXRfdXNlcl9wYWdlcyhjdXJyX3Rhc2ssIG1tLCB1bF9tcHVfYWRkciwgMSwKKwkJCQkJCXdyaXRlLCAxLCAmbWFwcGVkX3BhZ2UsIE5VTEwpOworCQkJaWYgKHBnX251bSA+IDApIHsKKwkJCQlpZiAocGFnZV9jb3VudChtYXBwZWRfcGFnZSkgPCAxKSB7CisJCQkJCXByX2VycigiQmFkIHBhZ2UgY291bnQgYWZ0ZXIgZG9pbmciCisJCQkJCSAgICAgICAiZ2V0X3VzZXJfcGFnZXMgb24iCisJCQkJCSAgICAgICAidXNlciBidWZmZXJcbiIpOworCQkJCQliYWRfcGFnZV9kdW1wKHBhZ2VfdG9fcGh5cyhtYXBwZWRfcGFnZSksCisJCQkJCQkgICAgICBtYXBwZWRfcGFnZSk7CisJCQkJfQorCQkJCXN0YXR1cyA9IHB0ZV9zZXQoZGV2X2NvbnRleHQtPnB0X2F0dHJzLAorCQkJCQkJIHBhZ2VfdG9fcGh5cyhtYXBwZWRfcGFnZSksIHZhLAorCQkJCQkJIEhXX1BBR0VfU0laRTRLQiwgJmh3X2F0dHJzKTsKKwkJCQlpZiAoc3RhdHVzKQorCQkJCQlicmVhazsKKworCQkJCWlmIChtYXBwZWRfcGFnZXMpCisJCQkJCW1hcHBlZF9wYWdlc1twZ19pXSA9IG1hcHBlZF9wYWdlOworCisJCQkJdmEgKz0gSFdfUEFHRV9TSVpFNEtCOworCQkJCXVsX21wdV9hZGRyICs9IEhXX1BBR0VfU0laRTRLQjsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCJEU1BCUklER0U6IGdldF91c2VyX3BhZ2VzIEZBSUxFRCwiCisJCQkJICAgICAgICJNUFUgYWRkciA9IDB4JXgsIgorCQkJCSAgICAgICAidm1hLT52bV9mbGFncyA9IDB4JWx4LCIKKwkJCQkgICAgICAgImdldF91c2VyX3BhZ2VzIEVyciIKKwkJCQkgICAgICAgIlZhbHVlID0gJWQsIEJ1ZmZlciIKKwkJCQkgICAgICAgInNpemU9MHgleFxuIiwgdWxfbXB1X2FkZHIsCisJCQkJICAgICAgIHZtYS0+dm1fZmxhZ3MsIHBnX251bSwgdWxfbnVtX2J5dGVzKTsKKwkJCQlzdGF0dXMgPSAtRVBFUk07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKK2Z1bmNfY29udDoKKwlpZiAoc3RhdHVzKSB7CisJCS8qCisJCSAqIFJvbGwgb3V0IHRoZSBtYXBwZWQgcGFnZXMgaW5jYXNlIGl0IGZhaWxlZCBpbiBtaWRkbGUgb2YKKwkJICogbWFwcGluZworCQkgKi8KKwkJaWYgKHBnX2kpIHsKKwkJCWJyaWRnZV9icmRfbWVtX3VuX21hcChkZXZfY29udGV4dCwgdmlydF9hZGRyLAorCQkJCQkgICAocGdfaSAqIFBHX1NJWkU0SykpOworCQl9CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9CisJLyoKKwkgKiBJbiBhbnkgY2FzZSwgZmx1c2ggdGhlIFRMQgorCSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gaGVyZSBpbnN0ZWFkIGZyb20gcHRlX3VwZGF0ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeQorCSAqIHJlcGV0aXRpb24gd2hpbGUgbWFwcGluZyBub24tY29udGlndW91cyBwaHlzaWNhbCByZWdpb25zIG9mIGEgdmlydHVhbAorCSAqIHJlZ2lvbgorCSAqLworCWZsdXNoX2FsbChkZXZfY29udGV4dCk7CisJZGV2X2RiZyhicmlkZ2UsICIlcyBzdGF0dXMgJXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2JyZF9tZW1fdW5fbWFwID09PT09PT09CisgKiAgICAgIEludmFsaWRhdGUgdGhlIFBURXMgZm9yIHRoZSBEU1AgVkEgYmxvY2sgdG8gYmUgdW5tYXBwZWQuCisgKgorICogICAgICBQVEVzIG9mIGEgbWFwcGVkIG1lbW9yeSBibG9jayBhcmUgY29udGlndW91cyBpbiBhbnkgcGFnZSB0YWJsZQorICogICAgICBTbywgaW5zdGVhZCBvZiBsb29raW5nIHVwIHRoZSBQVEUgYWRkcmVzcyBmb3IgZXZlcnkgNEsgYmxvY2ssCisgKiAgICAgIHdlIGNsZWFyIGNvbnNlY3V0aXZlIFBURXMgdW50aWwgd2UgdW5tYXAgYWxsIHRoZSBieXRlcworICovCitzdGF0aWMgaW50IGJyaWRnZV9icmRfbWVtX3VuX21hcChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCQkgICAgIHUzMiB2aXJ0X2FkZHIsIHUzMiB1bF9udW1fYnl0ZXMpCit7CisJdTMyIGwxX2Jhc2VfdmE7CisJdTMyIGwyX2Jhc2VfdmE7CisJdTMyIGwyX2Jhc2VfcGE7CisJdTMyIGwyX3BhZ2VfbnVtOworCXUzMiBwdGVfdmFsOworCXUzMiBwdGVfc2l6ZTsKKwl1MzIgcHRlX2NvdW50OworCXUzMiBwdGVfYWRkcl9sMTsKKwl1MzIgcHRlX2FkZHJfbDIgPSAwOworCXUzMiByZW1fYnl0ZXM7CisJdTMyIHJlbV9ieXRlc19sMjsKKwl1MzIgdmFfY3VycjsKKwlzdHJ1Y3QgcGFnZSAqcGcgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0ID0gZGV2X2N0eHQ7CisJc3RydWN0IHBnX3RhYmxlX2F0dHJzICpwdCA9IGRldl9jb250ZXh0LT5wdF9hdHRyczsKKwl1MzIgdGVtcDsKKwl1MzIgcGFkZHI7CisJdTMyIG51bW9mNGtfcGFnZXMgPSAwOworCisJdmFfY3VyciA9IHZpcnRfYWRkcjsKKwlyZW1fYnl0ZXMgPSB1bF9udW1fYnl0ZXM7CisJcmVtX2J5dGVzX2wyID0gMDsKKwlsMV9iYXNlX3ZhID0gcHQtPmwxX2Jhc2VfdmE7CisJcHRlX2FkZHJfbDEgPSBod19tbXVfcHRlX2FkZHJfbDEobDFfYmFzZV92YSwgdmFfY3Vycik7CisJZGV2X2RiZyhicmlkZ2UsICIlcyBkZXZfY3R4dCAlcCwgdmEgJXgsIE51bUJ5dGVzICV4IGwxX2Jhc2VfdmEgJXgsICIKKwkJInB0ZV9hZGRyX2wxICV4XG4iLCBfX2Z1bmNfXywgZGV2X2N0eHQsIHZpcnRfYWRkciwKKwkJdWxfbnVtX2J5dGVzLCBsMV9iYXNlX3ZhLCBwdGVfYWRkcl9sMSk7CisKKwl3aGlsZSAocmVtX2J5dGVzICYmICFzdGF0dXMpIHsKKwkJdTMyIHZhX2N1cnJfb3JpZyA9IHZhX2N1cnI7CisJCS8qIEZpbmQgd2hldGhlciB0aGUgTDEgUFRFIHBvaW50cyB0byBhIHZhbGlkIEwyIFBUICovCisJCXB0ZV9hZGRyX2wxID0gaHdfbW11X3B0ZV9hZGRyX2wxKGwxX2Jhc2VfdmEsIHZhX2N1cnIpOworCQlwdGVfdmFsID0gKih1MzIgKikgcHRlX2FkZHJfbDE7CisJCXB0ZV9zaXplID0gaHdfbW11X3B0ZV9zaXplX2wxKHB0ZV92YWwpOworCisJCWlmIChwdGVfc2l6ZSAhPSBIV19NTVVfQ09BUlNFX1BBR0VfU0laRSkKKwkJCWdvdG8gc2tpcF9jb2Fyc2VfcGFnZTsKKworCQkvKgorCQkgKiBHZXQgdGhlIEwyIFBBIGZyb20gdGhlIEwxIFBURSwgYW5kIGZpbmQKKwkJICogY29ycmVzcG9uZGluZyBMMiBWQQorCQkgKi8KKwkJbDJfYmFzZV9wYSA9IGh3X21tdV9wdGVfY29hcnNlX2wxKHB0ZV92YWwpOworCQlsMl9iYXNlX3ZhID0gbDJfYmFzZV9wYSAtIHB0LT5sMl9iYXNlX3BhICsgcHQtPmwyX2Jhc2VfdmE7CisJCWwyX3BhZ2VfbnVtID0KKwkJICAgIChsMl9iYXNlX3BhIC0gcHQtPmwyX2Jhc2VfcGEpIC8gSFdfTU1VX0NPQVJTRV9QQUdFX1NJWkU7CisJCS8qCisJCSAqIEZpbmQgdGhlIEwyIFBURSBhZGRyZXNzIGZyb20gd2hpY2ggd2Ugd2lsbCBzdGFydAorCQkgKiBjbGVhcmluZywgdGhlIG51bWJlciBvZiBQVEVzIHRvIGJlIGNsZWFyZWQgb24gdGhpcworCQkgKiBwYWdlLCBhbmQgdGhlIHNpemUgb2YgVkEgc3BhY2UgdGhhdCBuZWVkcyB0byBiZQorCQkgKiBjbGVhcmVkIG9uIHRoaXMgTDIgcGFnZQorCQkgKi8KKwkJcHRlX2FkZHJfbDIgPSBod19tbXVfcHRlX2FkZHJfbDIobDJfYmFzZV92YSwgdmFfY3Vycik7CisJCXB0ZV9jb3VudCA9IHB0ZV9hZGRyX2wyICYgKEhXX01NVV9DT0FSU0VfUEFHRV9TSVpFIC0gMSk7CisJCXB0ZV9jb3VudCA9IChIV19NTVVfQ09BUlNFX1BBR0VfU0laRSAtIHB0ZV9jb3VudCkgLyBzaXplb2YodTMyKTsKKwkJaWYgKHJlbV9ieXRlcyA8IChwdGVfY291bnQgKiBQR19TSVpFNEspKQorCQkJcHRlX2NvdW50ID0gcmVtX2J5dGVzIC8gUEdfU0laRTRLOworCQlyZW1fYnl0ZXNfbDIgPSBwdGVfY291bnQgKiBQR19TSVpFNEs7CisKKwkJLyoKKwkJICogVW5tYXAgdGhlIFZBIHNwYWNlIG9uIHRoaXMgTDIgUFQuIEEgcXVpY2tlciB3YXkKKwkJICogd291bGQgYmUgdG8gY2xlYXIgcHRlX2NvdW50IGVudHJpZXMgc3RhcnRpbmcgZnJvbQorCQkgKiBwdGVfYWRkcl9sMi4gSG93ZXZlciwgYmVsb3cgY29kZSBjaGVja3MgdGhhdCB3ZSBkb24ndAorCQkgKiBjbGVhciBpbnZhbGlkIGVudHJpZXMgb3IgbGVzcyB0aGFuIDY0S0IgZm9yIGEgNjRLQgorCQkgKiBlbnRyeS4gU2ltaWxhciBjaGVja2luZyBpcyBkb25lIGZvciBMMSBQVEVzIHRvbworCQkgKiBiZWxvdworCQkgKi8KKwkJd2hpbGUgKHJlbV9ieXRlc19sMiAmJiAhc3RhdHVzKSB7CisJCQlwdGVfdmFsID0gKih1MzIgKikgcHRlX2FkZHJfbDI7CisJCQlwdGVfc2l6ZSA9IGh3X21tdV9wdGVfc2l6ZV9sMihwdGVfdmFsKTsKKwkJCS8qIHZhX2N1cnIgYWxpZ25lZCB0byBwdGVfc2l6ZT8gKi8KKwkJCWlmIChwdGVfc2l6ZSA9PSAwIHx8IHJlbV9ieXRlc19sMiA8IHB0ZV9zaXplIHx8CisJCQkgICAgdmFfY3VyciAmIChwdGVfc2l6ZSAtIDEpKSB7CisJCQkJc3RhdHVzID0gLUVQRVJNOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDb2xsZWN0IFBoeXNpY2FsIGFkZHJlc3NlcyBmcm9tIFZBICovCisJCQlwYWRkciA9IChwdGVfdmFsICYgfihwdGVfc2l6ZSAtIDEpKTsKKwkJCWlmIChwdGVfc2l6ZSA9PSBIV19QQUdFX1NJWkU2NEtCKQorCQkJCW51bW9mNGtfcGFnZXMgPSAxNjsKKwkJCWVsc2UKKwkJCQludW1vZjRrX3BhZ2VzID0gMTsKKwkJCXRlbXAgPSAwOworCQkJd2hpbGUgKHRlbXArKyA8IG51bW9mNGtfcGFnZXMpIHsKKwkJCQlpZiAoIXBmbl92YWxpZChfX3BoeXNfdG9fcGZuKHBhZGRyKSkpIHsKKwkJCQkJcGFkZHIgKz0gSFdfUEFHRV9TSVpFNEtCOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcGcgPSBQSFlTX1RPX1BBR0UocGFkZHIpOworCQkJCWlmIChwYWdlX2NvdW50KHBnKSA8IDEpIHsKKwkJCQkJcHJfaW5mbygiRFNQQlJJREdFOiBVTk1BUCBmdW5jdGlvbjogIgorCQkJCQkJIkNPVU5UIDAgRk9SIFBBIDB4JXgsIHNpemUgPSAiCisJCQkJCQkiMHgleFxuIiwgcGFkZHIsIHVsX251bV9ieXRlcyk7CisJCQkJCWJhZF9wYWdlX2R1bXAocGFkZHIsIHBnKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZXRfcGFnZV9kaXJ0eShwZyk7CisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwZyk7CisJCQkJfQorCQkJCXBhZGRyICs9IEhXX1BBR0VfU0laRTRLQjsKKwkJCX0KKwkJCWlmIChod19tbXVfcHRlX2NsZWFyKHB0ZV9hZGRyX2wyLCB2YV9jdXJyLCBwdGVfc2l6ZSkpIHsKKwkJCQlzdGF0dXMgPSAtRVBFUk07CisJCQkJZ290byBFWElUX0xPT1A7CisJCQl9CisKKwkJCXN0YXR1cyA9IDA7CisJCQlyZW1fYnl0ZXNfbDIgLT0gcHRlX3NpemU7CisJCQl2YV9jdXJyICs9IHB0ZV9zaXplOworCQkJcHRlX2FkZHJfbDIgKz0gKHB0ZV9zaXplID4+IDEyKSAqIHNpemVvZih1MzIpOworCQl9CisJCXNwaW5fbG9jaygmcHQtPnBnX2xvY2spOworCQlpZiAocmVtX2J5dGVzX2wyID09IDApIHsKKwkJCXB0LT5wZ19pbmZvW2wyX3BhZ2VfbnVtXS5udW1fZW50cmllcyAtPSBwdGVfY291bnQ7CisJCQlpZiAocHQtPnBnX2luZm9bbDJfcGFnZV9udW1dLm51bV9lbnRyaWVzID09IDApIHsKKwkJCQkvKgorCQkJCSAqIENsZWFyIHRoZSBMMSBQVEUgcG9pbnRpbmcgdG8gdGhlIEwyIFBUCisJCQkJICovCisJCQkJaWYgKCFod19tbXVfcHRlX2NsZWFyKGwxX2Jhc2VfdmEsIHZhX2N1cnJfb3JpZywKKwkJCQkJCSAgICAgSFdfTU1VX0NPQVJTRV9QQUdFX1NJWkUpKQorCQkJCQlzdGF0dXMgPSAwOworCQkJCWVsc2UgeworCQkJCQlzdGF0dXMgPSAtRVBFUk07CisJCQkJCXNwaW5fdW5sb2NrKCZwdC0+cGdfbG9jayk7CisJCQkJCWdvdG8gRVhJVF9MT09QOworCQkJCX0KKwkJCX0KKwkJCXJlbV9ieXRlcyAtPSBwdGVfY291bnQgKiBQR19TSVpFNEs7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gLUVQRVJNOworCisJCXNwaW5fdW5sb2NrKCZwdC0+cGdfbG9jayk7CisJCWNvbnRpbnVlOworc2tpcF9jb2Fyc2VfcGFnZToKKwkJLyogdmFfY3VyciBhbGlnbmVkIHRvIHB0ZV9zaXplPyAqLworCQkvKiBwdGVfc2l6ZSA9IDEgTUIgb3IgMTYgTUIgKi8KKwkJaWYgKHB0ZV9zaXplID09IDAgfHwgcmVtX2J5dGVzIDwgcHRlX3NpemUgfHwKKwkJICAgIHZhX2N1cnIgJiAocHRlX3NpemUgLSAxKSkgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHRlX3NpemUgPT0gSFdfUEFHRV9TSVpFMU1CKQorCQkJbnVtb2Y0a19wYWdlcyA9IDI1NjsKKwkJZWxzZQorCQkJbnVtb2Y0a19wYWdlcyA9IDQwOTY7CisJCXRlbXAgPSAwOworCQkvKiBDb2xsZWN0IFBoeXNpY2FsIGFkZHJlc3NlcyBmcm9tIFZBICovCisJCXBhZGRyID0gKHB0ZV92YWwgJiB+KHB0ZV9zaXplIC0gMSkpOworCQl3aGlsZSAodGVtcCsrIDwgbnVtb2Y0a19wYWdlcykgeworCQkJaWYgKHBmbl92YWxpZChfX3BoeXNfdG9fcGZuKHBhZGRyKSkpIHsKKwkJCQlwZyA9IFBIWVNfVE9fUEFHRShwYWRkcik7CisJCQkJaWYgKHBhZ2VfY291bnQocGcpIDwgMSkgeworCQkJCQlwcl9pbmZvKCJEU1BCUklER0U6IFVOTUFQIGZ1bmN0aW9uOiAiCisJCQkJCQkiQ09VTlQgMCBGT1IgUEEgMHgleCwgc2l6ZSA9ICIKKwkJCQkJCSIweCV4XG4iLCBwYWRkciwgdWxfbnVtX2J5dGVzKTsKKwkJCQkJYmFkX3BhZ2VfZHVtcChwYWRkciwgcGcpOworCQkJCX0gZWxzZSB7CisJCQkJCXNldF9wYWdlX2RpcnR5KHBnKTsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBnKTsKKwkJCQl9CisJCQl9CisJCQlwYWRkciArPSBIV19QQUdFX1NJWkU0S0I7CisJCX0KKwkJaWYgKCFod19tbXVfcHRlX2NsZWFyKGwxX2Jhc2VfdmEsIHZhX2N1cnIsIHB0ZV9zaXplKSkgeworCQkJc3RhdHVzID0gMDsKKwkJCXJlbV9ieXRlcyAtPSBwdGVfc2l6ZTsKKwkJCXZhX2N1cnIgKz0gcHRlX3NpemU7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlnb3RvIEVYSVRfTE9PUDsKKwkJfQorCX0KKwkvKgorCSAqIEl0IGlzIGJldHRlciB0byBmbHVzaCB0aGUgVExCIGhlcmUsIHNvIHRoYXQgYW55IHN0YWxlIG9sZCBlbnRyaWVzCisJICogZ2V0IGZsdXNoZWQKKwkgKi8KK0VYSVRfTE9PUDoKKwlmbHVzaF9hbGwoZGV2X2NvbnRleHQpOworCWRldl9kYmcoYnJpZGdlLAorCQkiJXM6IHZhX2N1cnIgJXgsIHB0ZV9hZGRyX2wxICV4IHB0ZV9hZGRyX2wyICV4IHJlbV9ieXRlcyAleCwiCisJCSIgcmVtX2J5dGVzX2wyICV4IHN0YXR1cyAleFxuIiwgX19mdW5jX18sIHZhX2N1cnIsIHB0ZV9hZGRyX2wxLAorCQlwdGVfYWRkcl9sMiwgcmVtX2J5dGVzLCByZW1fYnl0ZXNfbDIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSB1c2VyX3ZhMl9wYSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhyb3VnaCB0aGUgcGFnZSB0YWJsZXMgdG8gY29udmVydCBhIHVzZXJsYW5kCisgKiAgICAgIHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK3N0YXRpYyB1MzIgdXNlcl92YTJfcGEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBhZGRyZXNzKQoreworCXBnZF90ICpwZ2Q7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlcCwgcHRlOworCisJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7CisJaWYgKCEocGdkX25vbmUoKnBnZCkgfHwgcGdkX2JhZCgqcGdkKSkpIHsKKwkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlpZiAoIShwbWRfbm9uZSgqcG1kKSB8fCBwbWRfYmFkKCpwbWQpKSkgeworCQkJcHRlcCA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcmVzcyk7CisJCQlpZiAocHRlcCkgeworCQkJCXB0ZSA9ICpwdGVwOworCQkJCWlmIChwdGVfcHJlc2VudChwdGUpKQorCQkJCQlyZXR1cm4gcHRlICYgUEFHRV9NQVNLOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHRlX3VwZGF0ZSA9PT09PT09PQorICogICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG9wdGltdW0gcGFnZS1hbGlnbmVkIGFkZHJlc3NlcyBhbmQgc2l6ZXMKKyAqICAgICAgQ2FsbGVyIG11c3QgcGFzcyBwYWdlLWFsaWduZWQgdmFsdWVzCisgKi8KK3N0YXRpYyBpbnQgcHRlX3VwZGF0ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwgdTMyIHBhLAorCQkJICAgICB1MzIgdmEsIHUzMiBzaXplLAorCQkJICAgICBzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190ICptYXBfYXR0cnMpCit7CisJdTMyIGk7CisJdTMyIGFsbF9iaXRzOworCXUzMiBwYV9jdXJyID0gcGE7CisJdTMyIHZhX2N1cnIgPSB2YTsKKwl1MzIgbnVtX2J5dGVzID0gc2l6ZTsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCA9IGRldl9jdHh0OworCWludCBzdGF0dXMgPSAwOworCXUzMiBwYWdlX3NpemVbXSA9IHsgSFdfUEFHRV9TSVpFMTZNQiwgSFdfUEFHRV9TSVpFMU1CLAorCQlIV19QQUdFX1NJWkU2NEtCLCBIV19QQUdFX1NJWkU0S0IKKwl9OworCisJd2hpbGUgKG51bV9ieXRlcyAmJiAhc3RhdHVzKSB7CisJCS8qIFRvIGZpbmQgdGhlIG1heC4gcGFnZSBzaXplIHdpdGggd2hpY2ggYm90aCBQQSAmIFZBIGFyZQorCQkgKiBhbGlnbmVkICovCisJCWFsbF9iaXRzID0gcGFfY3VyciB8IHZhX2N1cnI7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKChudW1fYnl0ZXMgPj0gcGFnZV9zaXplW2ldKSAmJiAoKGFsbF9iaXRzICYKKwkJCQkJCQkgICAgIChwYWdlX3NpemVbaV0gLQorCQkJCQkJCSAgICAgIDEpKSA9PSAwKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIHB0ZV9zZXQoZGV2X2NvbnRleHQtPnB0X2F0dHJzLCBwYV9jdXJyLAorCQkJCQkgICAgdmFfY3VyciwgcGFnZV9zaXplW2ldLCBtYXBfYXR0cnMpOworCQkJCXBhX2N1cnIgKz0gcGFnZV9zaXplW2ldOworCQkJCXZhX2N1cnIgKz0gcGFnZV9zaXplW2ldOworCQkJCW51bV9ieXRlcyAtPSBwYWdlX3NpemVbaV07CisJCQkJLyogRG9uJ3QgdHJ5IHNtYWxsZXIgc2l6ZXMuIEhvcGVmdWxseSB3ZSBoYXZlCisJCQkJICogcmVhY2hlZCBhbiBhZGRyZXNzIGFsaWduZWQgdG8gYSBiaWdnZXIgcGFnZQorCQkJCSAqIHNpemUgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHRlX3NldCA9PT09PT09PQorICogICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgUFRFIGFkZHJlc3MgKE1QVSB2aXJ0dWFsKSB0byBiZSB1cGRhdGVkCisgKiAgICAgIEl0IGFsc28gbWFuYWdlcyB0aGUgTDIgcGFnZSB0YWJsZXMKKyAqLworc3RhdGljIGludCBwdGVfc2V0KHN0cnVjdCBwZ190YWJsZV9hdHRycyAqcHQsIHUzMiBwYSwgdTMyIHZhLAorCQkJICB1MzIgc2l6ZSwgc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCAqYXR0cnMpCit7CisJdTMyIGk7CisJdTMyIHB0ZV92YWw7CisJdTMyIHB0ZV9hZGRyX2wxOworCXUzMiBwdGVfc2l6ZTsKKwkvKiBCYXNlIGFkZHJlc3Mgb2YgdGhlIFBUIHRoYXQgd2lsbCBiZSB1cGRhdGVkICovCisJdTMyIHBnX3RibF92YTsKKwl1MzIgbDFfYmFzZV92YTsKKwkvKiBDb21waWxlciB3YXJucyB0aGF0IHRoZSBuZXh0IHRocmVlIHZhcmlhYmxlcyBtaWdodCBiZSB1c2VkCisJICogdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uLiBEb2Vzbid0IHNlZW0gc28uIFdvcmtpbmcgYXJvdW5kLAorCSAqIGFueXdheXMuICovCisJdTMyIGwyX2Jhc2VfdmEgPSAwOworCXUzMiBsMl9iYXNlX3BhID0gMDsKKwl1MzIgbDJfcGFnZV9udW0gPSAwOworCWludCBzdGF0dXMgPSAwOworCisJbDFfYmFzZV92YSA9IHB0LT5sMV9iYXNlX3ZhOworCXBnX3RibF92YSA9IGwxX2Jhc2VfdmE7CisJaWYgKChzaXplID09IEhXX1BBR0VfU0laRTY0S0IpIHx8IChzaXplID09IEhXX1BBR0VfU0laRTRLQikpIHsKKwkJLyogRmluZCB3aGV0aGVyIHRoZSBMMSBQVEUgcG9pbnRzIHRvIGEgdmFsaWQgTDIgUFQgKi8KKwkJcHRlX2FkZHJfbDEgPSBod19tbXVfcHRlX2FkZHJfbDEobDFfYmFzZV92YSwgdmEpOworCQlpZiAocHRlX2FkZHJfbDEgPD0gKHB0LT5sMV9iYXNlX3ZhICsgcHQtPmwxX3NpemUpKSB7CisJCQlwdGVfdmFsID0gKih1MzIgKikgcHRlX2FkZHJfbDE7CisJCQlwdGVfc2l6ZSA9IGh3X21tdV9wdGVfc2l6ZV9sMShwdGVfdmFsKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJc3Bpbl9sb2NrKCZwdC0+cGdfbG9jayk7CisJCWlmIChwdGVfc2l6ZSA9PSBIV19NTVVfQ09BUlNFX1BBR0VfU0laRSkgeworCQkJLyogR2V0IHRoZSBMMiBQQSBmcm9tIHRoZSBMMSBQVEUsIGFuZCBmaW5kCisJCQkgKiBjb3JyZXNwb25kaW5nIEwyIFZBICovCisJCQlsMl9iYXNlX3BhID0gaHdfbW11X3B0ZV9jb2Fyc2VfbDEocHRlX3ZhbCk7CisJCQlsMl9iYXNlX3ZhID0KKwkJCSAgICBsMl9iYXNlX3BhIC0gcHQtPmwyX2Jhc2VfcGEgKyBwdC0+bDJfYmFzZV92YTsKKwkJCWwyX3BhZ2VfbnVtID0KKwkJCSAgICAobDJfYmFzZV9wYSAtCisJCQkgICAgIHB0LT5sMl9iYXNlX3BhKSAvIEhXX01NVV9DT0FSU0VfUEFHRV9TSVpFOworCQl9IGVsc2UgaWYgKHB0ZV9zaXplID09IDApIHsKKwkJCS8qIEwxIFBURSBpcyBpbnZhbGlkLiBBbGxvY2F0ZSBhIEwyIFBUIGFuZAorCQkJICogcG9pbnQgdGhlIEwxIFBURSB0byBpdCAqLworCQkJLyogRmluZCBhIGZyZWUgTDIgUFQuICovCisJCQlmb3IgKGkgPSAwOyAoaSA8IHB0LT5sMl9udW1fcGFnZXMpICYmCisJCQkgICAgIChwdC0+cGdfaW5mb1tpXS5udW1fZW50cmllcyAhPSAwKTsgaSsrKQorCQkJCTs7CisJCQlpZiAoaSA8IHB0LT5sMl9udW1fcGFnZXMpIHsKKwkJCQlsMl9wYWdlX251bSA9IGk7CisJCQkJbDJfYmFzZV9wYSA9IHB0LT5sMl9iYXNlX3BhICsgKGwyX3BhZ2VfbnVtICoKKwkJCQkJCUhXX01NVV9DT0FSU0VfUEFHRV9TSVpFKTsKKwkJCQlsMl9iYXNlX3ZhID0gcHQtPmwyX2Jhc2VfdmEgKyAobDJfcGFnZV9udW0gKgorCQkJCQkJSFdfTU1VX0NPQVJTRV9QQUdFX1NJWkUpOworCQkJCS8qIEVuZGlhbm5lc3MgYXR0cmlidXRlcyBhcmUgaWdub3JlZCBmb3IKKwkJCQkgKiBIV19NTVVfQ09BUlNFX1BBR0VfU0laRSAqLworCQkJCXN0YXR1cyA9CisJCQkJICAgIGh3X21tdV9wdGVfc2V0KGwxX2Jhc2VfdmEsIGwyX2Jhc2VfcGEsIHZhLAorCQkJCQkJICAgSFdfTU1VX0NPQVJTRV9QQUdFX1NJWkUsCisJCQkJCQkgICBhdHRycyk7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBGb3VuZCB2YWxpZCBMMSBQVEUgb2YgYW5vdGhlciBzaXplLgorCQkJICogU2hvdWxkIG5vdCBvdmVyd3JpdGUgaXQuICovCisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXBnX3RibF92YSA9IGwyX2Jhc2VfdmE7CisJCQlpZiAoc2l6ZSA9PSBIV19QQUdFX1NJWkU2NEtCKQorCQkJCXB0LT5wZ19pbmZvW2wyX3BhZ2VfbnVtXS5udW1fZW50cmllcyArPSAxNjsKKwkJCWVsc2UKKwkJCQlwdC0+cGdfaW5mb1tsMl9wYWdlX251bV0ubnVtX2VudHJpZXMrKzsKKwkJCWRldl9kYmcoYnJpZGdlLCAiUFRFOiBMMiBCYXNlVmEgJXgsIEJhc2VQYSAleCwgUGFnZU51bSAiCisJCQkJIiV4LCBudW1fZW50cmllcyAleFxuIiwgbDJfYmFzZV92YSwKKwkJCQlsMl9iYXNlX3BhLCBsMl9wYWdlX251bSwKKwkJCQlwdC0+cGdfaW5mb1tsMl9wYWdlX251bV0ubnVtX2VudHJpZXMpOworCQl9CisJCXNwaW5fdW5sb2NrKCZwdC0+cGdfbG9jayk7CisJfQorCWlmICghc3RhdHVzKSB7CisJCWRldl9kYmcoYnJpZGdlLCAiUFRFOiBwZ190YmxfdmEgJXgsIHBhICV4LCB2YSAleCwgc2l6ZSAleFxuIiwKKwkJCXBnX3RibF92YSwgcGEsIHZhLCBzaXplKTsKKwkJZGV2X2RiZyhicmlkZ2UsICJQVEU6IGVuZGlhbmlzbSAleCwgZWxlbWVudF9zaXplICV4LCAiCisJCQkibWl4ZWRfc2l6ZSAleFxuIiwgYXR0cnMtPmVuZGlhbmlzbSwKKwkJCWF0dHJzLT5lbGVtZW50X3NpemUsIGF0dHJzLT5taXhlZF9zaXplKTsKKwkJc3RhdHVzID0gaHdfbW11X3B0ZV9zZXQocGdfdGJsX3ZhLCBwYSwgdmEsIHNpemUsIGF0dHJzKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBNZW1vcnkgbWFwIGtlcm5lbCBWQSAtLSBtZW1vcnkgYWxsb2NhdGVkIHdpdGggdm1hbGxvYyAqLworc3RhdGljIGludCBtZW1fbWFwX3ZtYWxsb2Moc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJICB1MzIgdWxfbXB1X2FkZHIsIHUzMiB2aXJ0X2FkZHIsCisJCQkJICB1MzIgdWxfbnVtX2J5dGVzLAorCQkJCSAgc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCAqaHdfYXR0cnMpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2VbMV07CisJdTMyIGk7CisJdTMyIHBhX2N1cnI7CisJdTMyIHBhX25leHQ7CisJdTMyIHZhX2N1cnI7CisJdTMyIHNpemVfY3VycjsKKwl1MzIgbnVtX3BhZ2VzOworCXUzMiBwYTsKKwl1MzIgbnVtX29mNGtfcGFnZXM7CisJdTMyIHRlbXAgPSAwOworCisJLyoKKwkgKiBEbyBLZXJuZWwgdmEgdG8gcGEgdHJhbnNsYXRpb24uCisJICogQ29tYmluZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgcmVnaW9ucyB0byByZWR1Y2UgVExCcy4KKwkgKiBQYXNzIHRoZSB0cmFuc2xhdGVkIHBhIHRvIHB0ZV91cGRhdGUuCisJICovCisJbnVtX3BhZ2VzID0gdWxfbnVtX2J5dGVzIC8gUEFHRV9TSVpFOwkvKiBQQUdFX1NJWkUgPSBPUyBwYWdlIHNpemUgKi8KKwlpID0gMDsKKwl2YV9jdXJyID0gdWxfbXB1X2FkZHI7CisJcGFnZVswXSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKXZhX2N1cnIpOworCXBhX25leHQgPSBwYWdlX3RvX3BoeXMocGFnZVswXSk7CisJd2hpbGUgKCFzdGF0dXMgJiYgKGkgPCBudW1fcGFnZXMpKSB7CisJCS8qCisJCSAqIFJldXNlIHBhX25leHQgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmFpb24gdG8gYXZvaWQKKwkJICogYW4gZXh0cmEgdmEycGEgY2FsbAorCQkgKi8KKwkJcGFfY3VyciA9IHBhX25leHQ7CisJCXNpemVfY3VyciA9IFBBR0VfU0laRTsKKwkJLyoKKwkJICogSWYgdGhlIG5leHQgcGFnZSBpcyBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsCisJCSAqIG1hcCBpdCB3aXRoIHRoZSBjdXJyZW50IG9uZSBieSBpbmNyZWFzaW5nCisJCSAqIHRoZSBzaXplIG9mIHRoZSByZWdpb24gdG8gYmUgbWFwcGVkCisJCSAqLworCQl3aGlsZSAoKytpIDwgbnVtX3BhZ2VzKSB7CisJCQlwYWdlWzBdID0KKwkJCSAgICB2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKikodmFfY3VyciArIHNpemVfY3VycikpOworCQkJcGFfbmV4dCA9IHBhZ2VfdG9fcGh5cyhwYWdlWzBdKTsKKworCQkJaWYgKHBhX25leHQgPT0gKHBhX2N1cnIgKyBzaXplX2N1cnIpKQorCQkJCXNpemVfY3VyciArPSBQQUdFX1NJWkU7CisJCQllbHNlCisJCQkJYnJlYWs7CisKKwkJfQorCQlpZiAocGFfbmV4dCA9PSAwKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJcGEgPSBwYV9jdXJyOworCQludW1fb2Y0a19wYWdlcyA9IHNpemVfY3VyciAvIEhXX1BBR0VfU0laRTRLQjsKKwkJd2hpbGUgKHRlbXArKyA8IG51bV9vZjRrX3BhZ2VzKSB7CisJCQlnZXRfcGFnZShQSFlTX1RPX1BBR0UocGEpKTsKKwkJCXBhICs9IEhXX1BBR0VfU0laRTRLQjsKKwkJfQorCQlzdGF0dXMgPSBwdGVfdXBkYXRlKGRldl9jb250ZXh0LCBwYV9jdXJyLCB2aXJ0X2FkZHIgKworCQkJCSAgICAodmFfY3VyciAtIHVsX21wdV9hZGRyKSwgc2l6ZV9jdXJyLAorCQkJCSAgICBod19hdHRycyk7CisJCXZhX2N1cnIgKz0gc2l6ZV9jdXJyOworCX0KKwkvKgorCSAqIEluIGFueSBjYXNlLCBmbHVzaCB0aGUgVExCCisJICogVGhpcyBpcyBjYWxsZWQgZnJvbSBoZXJlIGluc3RlYWQgZnJvbSBwdGVfdXBkYXRlIHRvIGF2b2lkIHVubmVjZXNzYXJ5CisJICogcmVwZXRpdGlvbiB3aGlsZSBtYXBwaW5nIG5vbi1jb250aWd1b3VzIHBoeXNpY2FsIHJlZ2lvbnMgb2YgYSB2aXJ0dWFsCisJICogcmVnaW9uCisJICovCisJZmx1c2hfYWxsKGRldl9jb250ZXh0KTsKKwlkZXZfZGJnKGJyaWRnZSwgIiVzIHN0YXR1cyAleFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSB3YWl0X2Zvcl9zdGFydCA9PT09PT09PQorICogICAgICBXYWl0IGZvciB0aGUgc2luZ2FsIGZyb20gRFNQIHRoYXQgaXQgaGFzIHN0YXJ0ZWQsIG9yIHRpbWUgb3V0LgorICovCitib29sIHdhaXRfZm9yX3N0YXJ0KHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LCB1MzIgZHdfc3luY19hZGRyKQoreworCXUxNiB0aW1lb3V0ID0gVElIRUxFTl9BQ0tUSU1FT1VUOworCisJLyogIFdhaXQgZm9yIHJlc3BvbnNlIGZyb20gYm9hcmQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZHcoZHdfc3luY19hZGRyKSAmJiAtLXRpbWVvdXQpCisJCXVkZWxheSgxMCk7CisKKwkvKiAgSWYgdGltZWQgb3V0OiByZXR1cm4gZmFsc2UgKi8KKwlpZiAoIXRpbWVvdXQpIHsKKwkJcHJfZXJyKCIlczogVGltZWQgb3V0IHdhaXRpbmcgRFNQIHRvIFN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwX3B3ci5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMF9wd3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg5ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMF9wd3IuYwpAQCAtMCwwICsxLDU1MCBAQAorLyoKKyAqIHRpb21hcF9wd3IuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBEU1Agd2FrZS9zbGVlcCByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmcuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2lvX3NtLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2JyZGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2lvZGVmcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgQWJzdHJhY3Rpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxod19kZWZzLmg+CisjaW5jbHVkZSA8aHdfbW11Lmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvcHdyX3NoLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCcmlkZ2UgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlaC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS93ZHQuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNwZWNpZmljIHRvIHRoaXMgZmlsZSAqLworI2luY2x1ZGUgIl90aW9tYXAuaCIKKyNpbmNsdWRlICJfdGlvbWFwX3B3ci5oIgorI2luY2x1ZGUgPG1hY2gtb21hcDIvcHJtLXJlZ2JpdHMtMzR4eC5oPgorI2luY2x1ZGUgPG1hY2gtb21hcDIvY20tcmVnYml0cy0zNHh4Lmg+CisKKyNkZWZpbmUgUFdSU1RTVF9USU1FT1VUICAgICAgICAgIDIwMAorCisvKgorICogID09PT09PT09IGhhbmRsZV9jb25zdHJhaW50c19zZXQgPT09PT09PT0KKyAqICAJU2V0cyBuZXcgRFNQIGNvbnN0cmFpbnQKKyAqLworaW50IGhhbmRsZV9jb25zdHJhaW50c19zZXQoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJICB2b2lkICpwYXJncykKK3sKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworCXUzMiAqY29uc3RyYWludF92YWw7CisJc3RydWN0IGRzcGJyaWRnZV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJICAgIG9tYXBfZHNwYnJpZGdlX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwljb25zdHJhaW50X3ZhbCA9ICh1MzIgKikgKHBhcmdzKTsKKwkvKiBSZWFkIHRoZSB0YXJnZXQgdmFsdWUgcmVxdWVzdGVkIGJ5IERTUCAqLworCWRldl9kYmcoYnJpZGdlLCAiT1BQOiAlcyBvcHAgcmVxdWVzdGVkID0gMHgleFxuIiwgX19mdW5jX18sCisJCSh1MzIpICooY29uc3RyYWludF92YWwgKyAxKSk7CisKKwkvKiBTZXQgdGhlIG5ldyBvcHAgdmFsdWUgKi8KKwlpZiAocGRhdGEtPmRzcF9zZXRfbWluX29wcCkKKwkJKCpwZGF0YS0+ZHNwX3NldF9taW5fb3BwKSAoKHUzMikgKihjb25zdHJhaW50X3ZhbCArIDEpKTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICA9PT09PT09PSBoYW5kbGVfaGliZXJuYXRpb25fZnJvbV9kc3AgPT09PT09PT0KKyAqICAJSGFuZGxlIEhpYmVybmF0aW9uIHJlcXVlc3RlZCBmcm9tIERTUAorICovCitpbnQgaGFuZGxlX2hpYmVybmF0aW9uX2Zyb21fZHNwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0KQoreworCWludCBzdGF0dXMgPSAwOworI2lmZGVmIENPTkZJR19QTQorCXUxNiB0aW1lb3V0ID0gUFdSU1RTVF9USU1FT1VUIC8gMTA7CisJdTMyIHB3cl9zdGF0ZTsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworCXUzMiBvcHBsZXZlbDsKKwlzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyOworI2VuZGlmCisJc3RydWN0IGRzcGJyaWRnZV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJICAgIG9tYXBfZHNwYnJpZGdlX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlwd3Jfc3RhdGUgPSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQpKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9QTV9QV1NUU1QpICYKKwkJCQkJCU9NQVBfUE9XRVJTVEFURVNUX01BU0s7CisJLyogV2FpdCBmb3IgRFNQIHRvIG1vdmUgaW50byBPRkYgc3RhdGUgKi8KKwl3aGlsZSAoKHB3cl9zdGF0ZSAhPSBQV1JETV9QT1dFUl9PRkYpICYmIC0tdGltZW91dCkgeworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTApKSB7CisJCQlwcl9lcnIoIldhaXRpbmcgZm9yIERTUCBPRkYgbW9kZSBpbnRlcnJ1cHRlZFxuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCXB3cl9zdGF0ZSA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkoT01BUDM0MzBfSVZBMl9NT0QsCisJCQkJCU9NQVAyX1BNX1BXU1RTVCkgJiBPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOworCX0KKwlpZiAodGltZW91dCA9PSAwKSB7CisJCXByX2VycigiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBEU1Agb2ZmIG1vZGVcbiIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gLUVUSU1FRE9VVDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9IGVsc2UgeworCisJCS8qIFNhdmUgbWFpbGJveCBzZXR0aW5ncyAqLworCQlvbWFwX21ib3hfc2F2ZV9jdHgoZGV2X2NvbnRleHQtPm1ib3gpOworCisJCS8qIFR1cm4gb2ZmIERTUCBQZXJpcGhlcmFsIGNsb2NrcyBhbmQgRFNQIExvYWQgbW9uaXRvciB0aW1lciAqLworCQlzdGF0dXMgPSBkc3BfY2xvY2tfZGlzYWJsZV9hbGwoZGV2X2NvbnRleHQtPmRzcF9wZXJfY2xrcyk7CisKKwkJLyogRGlzYWJsZSB3ZHQgb24gaGliZXJuYXRpb24uICovCisJCWRzcF93ZHRfZW5hYmxlKGZhbHNlKTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJLyogVXBkYXRlIHRoZSBCcmlkZ2VyIERyaXZlciBzdGF0ZSAqLworCQkJZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9IEJSRF9EU1BfSElCRVJOQVRJT047CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKwkJCXN0YXR1cyA9CisJCQkgICAgZGV2X2dldF9pb19tZ3IoZGV2X2NvbnRleHQtPmhkZXZfb2JqLCAmaGlvX21ncik7CisJCQlpZiAoIWhpb19tZ3IpIHsKKwkJCQlzdGF0dXMgPSBEU1BfRUhBTkRMRTsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQkJaW9fc2hfbXNldHRpbmcoaGlvX21nciwgU0hNX0dFVE9QUCwgJm9wcGxldmVsKTsKKworCQkJLyoKKwkJCSAqIFNldCB0aGUgT1BQIHRvIGxvdyBsZXZlbCBiZWZvcmUgbW92aW5nIHRvIE9GRgorCQkJICogbW9kZQorCQkJICovCisJCQlpZiAocGRhdGEtPmRzcF9zZXRfbWluX29wcCkKKwkJCQkoKnBkYXRhLT5kc3Bfc2V0X21pbl9vcHApIChWREQxX09QUDEpOworCQkJc3RhdHVzID0gMDsKKyNlbmRpZiAvKiBDT05GSUdfVElEU1BCUklER0VfRFZGUyAqLworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBzbGVlcF9kc3AgPT09PT09PT0KKyAqICAJUHV0IERTUCBpbiBsb3cgcG93ZXIgY29uc3VtaW5nIHN0YXRlLgorICovCitpbnQgc2xlZXBfZHNwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LCB1MzIgZHdfY21kLAorCQkgICAgIHZvaWQgKnBhcmdzKQoreworCWludCBzdGF0dXMgPSAwOworI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9OVEZZX1BXUkVSUgorCXN0cnVjdCBkZWhfbWdyICpoZGVoX21ncjsKKyNlbmRpZiAvKiBDT05GSUdfVElEU1BCUklER0VfTlRGWV9QV1JFUlIgKi8KKwl1MTYgdGltZW91dCA9IFBXUlNUU1RfVElNRU9VVCAvIDEwOworCXUzMiBwd3Jfc3RhdGUsIHRhcmdldF9wd3Jfc3RhdGU7CisJc3RydWN0IGRzcGJyaWRnZV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCQkJb21hcF9kc3BicmlkZ2VfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCS8qIENoZWNrIGlmIHNsZWVwIGNvZGUgaXMgdmFsaWQgKi8KKwlpZiAoKGR3X2NtZCAhPSBQV1JfREVFUFNMRUVQKSAmJiAoZHdfY21kICE9IFBXUl9FTUVSR0VOQ1lERUVQU0xFRVApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSkgeworCWNhc2UgQlJEX1JVTk5JTkc6CisJCW9tYXBfbWJveF9zYXZlX2N0eChkZXZfY29udGV4dC0+bWJveCk7CisJCWlmIChkc3BfdGVzdF9zbGVlcHN0YXRlID09IFBXUkRNX1BPV0VSX09GRikgeworCQkJc21faW50ZXJydXB0X2RzcChkZXZfY29udGV4dCwgTUJYX1BNX0RTUEhJQkVSTkFURSk7CisJCQlkZXZfZGJnKGJyaWRnZSwgIlBNOiAlcyAtIHNlbnQgaGliZXJuYXRlIGNtZCB0byBEU1BcbiIsCisJCQkJX19mdW5jX18pOworCQkJdGFyZ2V0X3B3cl9zdGF0ZSA9IFBXUkRNX1BPV0VSX09GRjsKKwkJfSBlbHNlIHsKKwkJCXNtX2ludGVycnVwdF9kc3AoZGV2X2NvbnRleHQsIE1CWF9QTV9EU1BSRVRFTlRJT04pOworCQkJdGFyZ2V0X3B3cl9zdGF0ZSA9IFBXUkRNX1BPV0VSX1JFVDsKKwkJfQorCQlicmVhazsKKwljYXNlIEJSRF9SRVRFTlRJT046CisJCW9tYXBfbWJveF9zYXZlX2N0eChkZXZfY29udGV4dC0+bWJveCk7CisJCWlmIChkc3BfdGVzdF9zbGVlcHN0YXRlID09IFBXUkRNX1BPV0VSX09GRikgeworCQkJc21faW50ZXJydXB0X2RzcChkZXZfY29udGV4dCwgTUJYX1BNX0RTUEhJQkVSTkFURSk7CisJCQl0YXJnZXRfcHdyX3N0YXRlID0gUFdSRE1fUE9XRVJfT0ZGOworCQl9IGVsc2UKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEJSRF9ISUJFUk5BVElPTjoKKwljYXNlIEJSRF9EU1BfSElCRVJOQVRJT046CisJCS8qIEFscmVhZHkgaW4gSGliZXJuYXRpb24sIHNvIGp1c3QgcmV0dXJuICovCisJCWRldl9kYmcoYnJpZGdlLCAiUE06ICVzIC0gRFNQIGFscmVhZHkgaW4gaGliZXJuYXRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCWNhc2UgQlJEX1NUT1BQRUQ6CisJCWRldl9kYmcoYnJpZGdlLCAiUE06ICVzIC0gQm9hcmQgaW4gU1RPUCBzdGF0ZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKGJyaWRnZSwgIlBNOiAlcyAtIEJyaWRnZSBpbiBJbGxlZ2FsIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogR2V0IHRoZSBQUkNNIERTUCBwb3dlciBkb21haW4gc3RhdHVzICovCisJcHdyX3N0YXRlID0gKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSAmCisJCQkJCQlPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOworCisJLyogV2FpdCBmb3IgRFNQIHRvIG1vdmUgaW50byB0YXJnZXQgcG93ZXIgc3RhdGUgKi8KKwl3aGlsZSAoKHB3cl9zdGF0ZSAhPSB0YXJnZXRfcHdyX3N0YXRlKSAmJiAtLXRpbWVvdXQpIHsKKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKSkgeworCQkJcHJfZXJyKCJXYWl0aW5nIGZvciBEU1AgdG8gU3VzcGVuZCBpbnRlcnJ1cHRlZFxuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCXB3cl9zdGF0ZSA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkoT01BUDM0MzBfSVZBMl9NT0QsCisJCQkJCU9NQVAyX1BNX1BXU1RTVCkgJiBPTUFQX1BPV0VSU1RBVEVTVF9NQVNLOworCX0KKworCWlmICghdGltZW91dCkgeworCQlwcl9lcnIoIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgRFNQIG9mZiBtb2RlLCBzdGF0ZSAleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBwd3Jfc3RhdGUpOworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9OVEZZX1BXUkVSUgorCQlkZXZfZ2V0X2RlaF9tZ3IoZGV2X2NvbnRleHQtPmhkZXZfb2JqLCAmaGRlaF9tZ3IpOworCQlicmlkZ2VfZGVoX25vdGlmeShoZGVoX21nciwgRFNQX1BXUkVSUk9SLCAwKTsKKyNlbmRpZiAvKiBDT05GSUdfVElEU1BCUklER0VfTlRGWV9QV1JFUlIgKi8KKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKwkJLyogVXBkYXRlIHRoZSBCcmlkZ2VyIERyaXZlciBzdGF0ZSAqLworCQlpZiAoZHNwX3Rlc3Rfc2xlZXBzdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpCisJCQlkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID0gQlJEX0hJQkVSTkFUSU9OOworCQllbHNlCisJCQlkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID0gQlJEX1JFVEVOVElPTjsKKworCQkvKiBEaXNhYmxlIHdkdCBvbiBoaWJlcm5hdGlvbi4gKi8KKwkJZHNwX3dkdF9lbmFibGUoZmFsc2UpOworCisJCS8qIFR1cm4gb2ZmIERTUCBQZXJpcGhlcmFsIGNsb2NrcyAqLworCQlzdGF0dXMgPSBkc3BfY2xvY2tfZGlzYWJsZV9hbGwoZGV2X2NvbnRleHQtPmRzcF9wZXJfY2xrcyk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9EVkZTCisJCWVsc2UgaWYgKHRhcmdldF9wd3Jfc3RhdGUgPT0gUFdSRE1fUE9XRVJfT0ZGKSB7CisJCQkvKgorCQkJICogU2V0IHRoZSBPUFAgdG8gbG93IGxldmVsIGJlZm9yZSBtb3ZpbmcgdG8gT0ZGIG1vZGUKKwkJCSAqLworCQkJaWYgKHBkYXRhLT5kc3Bfc2V0X21pbl9vcHApCisJCQkJKCpwZGF0YS0+ZHNwX3NldF9taW5fb3BwKSAoVkREMV9PUFAxKTsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19USURTUEJSSURHRV9EVkZTICovCisJfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gd2FrZV9kc3AgPT09PT09PT0KKyAqICAJV2FrZSB1cCBEU1AgZnJvbSBzbGVlcC4KKyAqLworaW50IHdha2VfZHNwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LCB2b2lkICpwYXJncykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKyNpZmRlZiBDT05GSUdfUE0KKworCS8qIENoZWNrIHRoZSBib2FyZCBzdGF0ZSwgaWYgaXQgaXMgbm90ICdTTEVFUCcgdGhlbiByZXR1cm4gKi8KKwlpZiAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfUlVOTklORyB8fAorCSAgICBkZXZfY29udGV4dC0+ZHdfYnJkX3N0YXRlID09IEJSRF9TVE9QUEVEKSB7CisJCS8qIFRoZSBEZXZpY2UgaXMgaW4gJ1JFVCcgb3IgJ09GRicgc3RhdGUgYW5kIEJyaWRnZSBzdGF0ZSBpcyBub3QKKwkJICogJ1NMRUVQJywgdGhpcyBtZWFucyBzdGF0ZSBpbmNvbnNpc3RlbmN5LCBzbyByZXR1cm4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2VuZCBhIHdha2V1cCBtZXNzYWdlIHRvIERTUCAqLworCXNtX2ludGVycnVwdF9kc3AoZGV2X2NvbnRleHQsIE1CWF9QTV9EU1BXQUtFVVApOworCisJLyogU2V0IHRoZSBkZXZpY2Ugc3RhdGUgdG8gUlVOTklHICovCisJZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9IEJSRF9SVU5OSU5HOworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZHNwX3BlcmlwaGVyYWxfY2xrX2N0cmwgPT09PT09PT0KKyAqICAJRW5hYmxlL0Rpc2FibGUgdGhlIERTUCBwZXJpcGhlcmFsIGNsb2NrcyBhcyBuZWVkZWQuLgorICovCitpbnQgZHNwX3BlcmlwaGVyYWxfY2xrX2N0cmwoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQsCisJCQkJICAgdm9pZCAqcGFyZ3MpCit7CisJdTMyIGV4dF9jbGsgPSAwOworCXUzMiBleHRfY2xrX2lkID0gMDsKKwl1MzIgZXh0X2Nsa19jbWQgPSAwOworCXUzMiBjbGtfaWRfaW5kZXggPSBNQlhfUE1fTUFYX1JFU09VUkNFUzsKKwl1MzIgdG1wX2luZGV4OworCXUzMiBkc3BfcGVyX2Nsa3NfYmVmb3JlOworCWludCBzdGF0dXMgPSAwOworCisJZHNwX3Blcl9jbGtzX2JlZm9yZSA9IGRldl9jb250ZXh0LT5kc3BfcGVyX2Nsa3M7CisKKwlleHRfY2xrID0gKHUzMikgKigodTMyICopIHBhcmdzKTsKKwlleHRfY2xrX2lkID0gZXh0X2NsayAmIE1CWF9QTV9DTEtfSURNQVNLOworCisJLyogcHJvY2VzcyB0aGUgcG93ZXIgbWVzc2FnZSAtLSBUT0RPLCBrZWVwIGl0IGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gKi8KKwlmb3IgKHRtcF9pbmRleCA9IDA7IHRtcF9pbmRleCA8IE1CWF9QTV9NQVhfUkVTT1VSQ0VTOyB0bXBfaW5kZXgrKykgeworCQlpZiAoZXh0X2Nsa19pZCA9PSBicHdyX2Nsa2lkW3RtcF9pbmRleF0pIHsKKwkJCWNsa19pZF9pbmRleCA9IHRtcF9pbmRleDsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIFRPRE8gLS0gQXNzZXJ0IG1heSBiZSBhIHRvbyBoYXJkIHJlc3RyaWN0aW9uIGhlcmUuLiBNYXkgYmUgd2Ugc2hvdWxkCisJICoganVzdCByZXR1cm4gd2l0aCBmYWlsdXJlIHdoZW4gdGhlIENMSyBJRCBkb2VzIG5vdCBtYXRjaCAqLworCS8qIERCQ19BU1NFUlQoY2xrX2lkX2luZGV4IDwgTUJYX1BNX01BWF9SRVNPVVJDRVMpOyAqLworCWlmIChjbGtfaWRfaW5kZXggPT0gTUJYX1BNX01BWF9SRVNPVVJDRVMpIHsKKwkJLyogcmV0dXJuIHdpdGggYSBtb3JlIG1lYW5pbmdmdWxsIGVycm9yIGNvZGUgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJZXh0X2Nsa19jbWQgPSAoZXh0X2NsayA+PiBNQlhfUE1fQ0xLX0NNRFNISUZUKSAmIE1CWF9QTV9DTEtfQ01ETUFTSzsKKwlzd2l0Y2ggKGV4dF9jbGtfY21kKSB7CisJY2FzZSBCUFdSX0RJU0FCTEVfQ0xPQ0s6CisJCXN0YXR1cyA9IGRzcF9jbGtfZGlzYWJsZShicHdyX2Nsa3NbY2xrX2lkX2luZGV4XS5jbGspOworCQlkc3BfY2xrX3dha2V1cF9ldmVudF9jdHJsKGJwd3JfY2xrc1tjbGtfaWRfaW5kZXhdLmNsa19pZCwKKwkJCQkJICBmYWxzZSk7CisJCWlmICghc3RhdHVzKSB7CisJCQkoZGV2X2NvbnRleHQtPmRzcF9wZXJfY2xrcykgJj0KKwkJCQkofigodTMyKSAoMSA8PCBicHdyX2Nsa3NbY2xrX2lkX2luZGV4XS5jbGspKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUFdSX0VOQUJMRV9DTE9DSzoKKwkJc3RhdHVzID0gZHNwX2Nsa19lbmFibGUoYnB3cl9jbGtzW2Nsa19pZF9pbmRleF0uY2xrKTsKKwkJZHNwX2Nsa193YWtldXBfZXZlbnRfY3RybChicHdyX2Nsa3NbY2xrX2lkX2luZGV4XS5jbGtfaWQsIHRydWUpOworCQlpZiAoIXN0YXR1cykKKwkJCShkZXZfY29udGV4dC0+ZHNwX3Blcl9jbGtzKSB8PQorCQkJCSgxIDw8IGJwd3JfY2xrc1tjbGtfaWRfaW5kZXhdLmNsayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IFVuc3VwcG9ydGVkIENNRFxuIiwgX19mdW5jX18pOworCQkvKiB1bnN1cHBvcnRlZCBjbWQgKi8KKwkJLyogVE9ETyAtLSBwcm92aWRlIHN1cHBvcnQgZm9yIEFVVE9JRExFIEVuYWJsZS9EaXNhYmxlCisJCSAqIGNvbW1hbmRzICovCisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT1wcmVfc2NhbGVfZHNwPT09PT09PT0KKyAqICBTZW5kcyBwcmVzY2FsZSBub3RpZmljYXRpb24gdG8gRFNQCisgKgorICovCitpbnQgcHJlX3NjYWxlX2RzcChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwgdm9pZCAqcGFyZ3MpCit7CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKwl1MzIgbGV2ZWw7CisJdTMyIHZvbHRhZ2VfZG9tYWluOworCisJdm9sdGFnZV9kb21haW4gPSAqKCh1MzIgKikgcGFyZ3MpOworCWxldmVsID0gKigodTMyICopIHBhcmdzICsgMSk7CisKKwlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgdm9sdGFnZV9kb21haW4gPSAleCwgbGV2ZWwgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgdm9sdGFnZV9kb21haW4sIGxldmVsKTsKKwlpZiAoKGRldl9jb250ZXh0LT5kd19icmRfc3RhdGUgPT0gQlJEX0hJQkVSTkFUSU9OKSB8fAorCSAgICAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfUkVURU5USU9OKSB8fAorCSAgICAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfRFNQX0hJQkVSTkFUSU9OKSkgeworCQlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgSVZBIGluIHNsZWVwLiBObyBtZXNzYWdlIHRvIERTUFxuIik7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoKGRldl9jb250ZXh0LT5kd19icmRfc3RhdGUgPT0gQlJEX1JVTk5JTkcpKSB7CisJCS8qIFNlbmQgYSBwcmVub3RpZmljYXRpbyB0byBEU1AgKi8KKwkJZGV2X2RiZyhicmlkZ2UsICJPUFA6ICVzIHNlbnQgbm90aWZpY2F0aW9uIHRvIERTUFxuIiwgX19mdW5jX18pOworCQlzbV9pbnRlcnJ1cHRfZHNwKGRldl9jb250ZXh0LCBNQlhfUE1fU0VUUE9JTlRfUFJFTk9USUZZKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9EVkZTICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgPT09PT09PT1wb3N0X3NjYWxlX2RzcD09PT09PT09CisgKiAgU2VuZHMgcG9zdHNjYWxlIG5vdGlmaWNhdGlvbiB0byBEU1AKKyAqCisgKi8KK2ludCBwb3N0X3NjYWxlX2RzcChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCQkJCQl2b2lkICpwYXJncykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworCXUzMiBsZXZlbDsKKwl1MzIgdm9sdGFnZV9kb21haW47CisJc3RydWN0IGlvX21nciAqaGlvX21ncjsKKworCXN0YXR1cyA9IGRldl9nZXRfaW9fbWdyKGRldl9jb250ZXh0LT5oZGV2X29iaiwgJmhpb19tZ3IpOworCWlmICghaGlvX21ncikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl2b2x0YWdlX2RvbWFpbiA9ICooKHUzMiAqKSBwYXJncyk7CisJbGV2ZWwgPSAqKCh1MzIgKikgcGFyZ3MgKyAxKTsKKwlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgdm9sdGFnZV9kb21haW4gPSAleCwgbGV2ZWwgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgdm9sdGFnZV9kb21haW4sIGxldmVsKTsKKwlpZiAoKGRldl9jb250ZXh0LT5kd19icmRfc3RhdGUgPT0gQlJEX0hJQkVSTkFUSU9OKSB8fAorCSAgICAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfUkVURU5USU9OKSB8fAorCSAgICAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfRFNQX0hJQkVSTkFUSU9OKSkgeworCQkvKiBVcGRhdGUgdGhlIE9QUCB2YWx1ZSBpbiBzaGFyZWQgbWVtb3J5ICovCisJCWlvX3NoX21zZXR0aW5nKGhpb19tZ3IsIFNITV9DVVJST1BQLCAmbGV2ZWwpOworCQlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgSVZBIGluIHNsZWVwLiBXcm90ZSB0byBzaG1cbiIsCisJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIGlmICgoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfUlVOTklORykpIHsKKwkJLyogVXBkYXRlIHRoZSBPUFAgdmFsdWUgaW4gc2hhcmVkIG1lbW9yeSAqLworCQlpb19zaF9tc2V0dGluZyhoaW9fbWdyLCBTSE1fQ1VSUk9QUCwgJmxldmVsKTsKKwkJLyogU2VuZCBhIHBvc3Qgbm90aWZpY2F0aW9uIHRvIERTUCAqLworCQlzbV9pbnRlcnJ1cHRfZHNwKGRldl9jb250ZXh0LCBNQlhfUE1fU0VUUE9JTlRfUE9TVE5PVElGWSk7CisJCWRldl9kYmcoYnJpZGdlLCAiT1BQOiAlcyB3cm90ZSB0byBzaG0uIFNlbnQgcG9zdCBub3RpZmljYXRpb24gIgorCQkJInRvIERTUFxuIiwgX19mdW5jX18pOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9EVkZTICovCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBkc3BfY2xrX3dha2V1cF9ldmVudF9jdHJsKHUzMiBjbG9ja19pZCwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGNmZ19ob3N0cmVzICpyZXNvdXJjZXM7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGl2YTJfZ3Jwc2VsOworCXUzMiBtcHVfZ3Jwc2VsOworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iamVjdCA9IE5VTEw7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqYnJpZGdlX2NvbnRleHQgPSBOVUxMOworCisJaGRldl9vYmplY3QgPSAoc3RydWN0IGRldl9vYmplY3QgKilkcnZfZ2V0X2ZpcnN0X2Rldl9vYmplY3QoKTsKKwlpZiAoIWhkZXZfb2JqZWN0KQorCQlyZXR1cm47CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGhkZXZfb2JqZWN0LCAmYnJpZGdlX2NvbnRleHQpOworCWlmICghYnJpZGdlX2NvbnRleHQpCisJCXJldHVybjsKKworCXJlc291cmNlcyA9IGJyaWRnZV9jb250ZXh0LT5yZXNvdXJjZXM7CisJaWYgKCFyZXNvdXJjZXMpCisJCXJldHVybjsKKworCXN3aXRjaCAoY2xvY2tfaWQpIHsKKwljYXNlIEJQV1JfR1BfVElNRVI1OgorCQlpdmEyX2dycHNlbCA9IHJlYWRsKHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE4KTsKKwkJbXB1X2dycHNlbCA9IHJlYWRsKHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE0KTsKKwkJaWYgKGVuYWJsZSkgeworCQkJaXZhMl9ncnBzZWwgfD0gT01BUDM0MzBfR1JQU0VMX0dQVDVfTUFTSzsKKwkJCW1wdV9ncnBzZWwgJj0gfk9NQVAzNDMwX0dSUFNFTF9HUFQ1X01BU0s7CisJCX0gZWxzZSB7CisJCQltcHVfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9HUFQ1X01BU0s7CisJCQlpdmEyX2dycHNlbCAmPSB+T01BUDM0MzBfR1JQU0VMX0dQVDVfTUFTSzsKKwkJfQorCQl3cml0ZWwoaXZhMl9ncnBzZWwsIHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE4KTsKKwkJd3JpdGVsKG1wdV9ncnBzZWwsIHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE0KTsKKwkJYnJlYWs7CisJY2FzZSBCUFdSX0dQX1RJTUVSNjoKKwkJaXZhMl9ncnBzZWwgPSByZWFkbChyZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCW1wdV9ncnBzZWwgPSByZWFkbChyZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCWlmIChlbmFibGUpIHsKKwkJCWl2YTJfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9HUFQ2X01BU0s7CisJCQltcHVfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfR1BUNl9NQVNLOworCQl9IGVsc2UgeworCQkJbXB1X2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfR1BUNl9NQVNLOworCQkJaXZhMl9ncnBzZWwgJj0gfk9NQVAzNDMwX0dSUFNFTF9HUFQ2X01BU0s7CisJCX0KKwkJd3JpdGVsKGl2YTJfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCXdyaXRlbChtcHVfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCWJyZWFrOworCWNhc2UgQlBXUl9HUF9USU1FUjc6CisJCWl2YTJfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTgpOworCQltcHVfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworCQlpZiAoZW5hYmxlKSB7CisJCQlpdmEyX2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfR1BUN19NQVNLOworCQkJbXB1X2dycHNlbCAmPSB+T01BUDM0MzBfR1JQU0VMX0dQVDdfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCW1wdV9ncnBzZWwgfD0gT01BUDM0MzBfR1JQU0VMX0dQVDdfTUFTSzsKKwkJCWl2YTJfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfR1BUN19NQVNLOworCQl9CisJCXdyaXRlbChpdmEyX2dycHNlbCwgcmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTgpOworCQl3cml0ZWwobXB1X2dycHNlbCwgcmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworCQlicmVhazsKKwljYXNlIEJQV1JfR1BfVElNRVI4OgorCQlpdmEyX2dycHNlbCA9IHJlYWRsKHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE4KTsKKwkJbXB1X2dycHNlbCA9IHJlYWRsKHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE0KTsKKwkJaWYgKGVuYWJsZSkgeworCQkJaXZhMl9ncnBzZWwgfD0gT01BUDM0MzBfR1JQU0VMX0dQVDhfTUFTSzsKKwkJCW1wdV9ncnBzZWwgJj0gfk9NQVAzNDMwX0dSUFNFTF9HUFQ4X01BU0s7CisJCX0gZWxzZSB7CisJCQltcHVfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9HUFQ4X01BU0s7CisJCQlpdmEyX2dycHNlbCAmPSB+T01BUDM0MzBfR1JQU0VMX0dQVDhfTUFTSzsKKwkJfQorCQl3cml0ZWwoaXZhMl9ncnBzZWwsIHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE4KTsKKwkJd3JpdGVsKG1wdV9ncnBzZWwsIHJlc291cmNlcy0+ZHdfcGVyX3BtX2Jhc2UgKyAweEE0KTsKKwkJYnJlYWs7CisJY2FzZSBCUFdSX01DQlNQMToKKwkJaXZhMl9ncnBzZWwgPSByZWFkbChyZXNvdXJjZXMtPmR3X2NvcmVfcG1fYmFzZSArIDB4QTgpOworCQltcHVfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19jb3JlX3BtX2Jhc2UgKyAweEE0KTsKKwkJaWYgKGVuYWJsZSkgeworCQkJaXZhMl9ncnBzZWwgfD0gT01BUDM0MzBfR1JQU0VMX01DQlNQMV9NQVNLOworCQkJbXB1X2dycHNlbCAmPSB+T01BUDM0MzBfR1JQU0VMX01DQlNQMV9NQVNLOworCQl9IGVsc2UgeworCQkJbXB1X2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfTUNCU1AxX01BU0s7CisJCQlpdmEyX2dycHNlbCAmPSB+T01BUDM0MzBfR1JQU0VMX01DQlNQMV9NQVNLOworCQl9CisJCXdyaXRlbChpdmEyX2dycHNlbCwgcmVzb3VyY2VzLT5kd19jb3JlX3BtX2Jhc2UgKyAweEE4KTsKKwkJd3JpdGVsKG1wdV9ncnBzZWwsIHJlc291cmNlcy0+ZHdfY29yZV9wbV9iYXNlICsgMHhBNCk7CisJCWJyZWFrOworCWNhc2UgQlBXUl9NQ0JTUDI6CisJCWl2YTJfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTgpOworCQltcHVfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworCQlpZiAoZW5hYmxlKSB7CisJCQlpdmEyX2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfTUNCU1AyX01BU0s7CisJCQltcHVfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1AyX01BU0s7CisJCX0gZWxzZSB7CisJCQltcHVfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9NQ0JTUDJfTUFTSzsKKwkJCWl2YTJfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1AyX01BU0s7CisJCX0KKwkJd3JpdGVsKGl2YTJfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCXdyaXRlbChtcHVfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCWJyZWFrOworCWNhc2UgQlBXUl9NQ0JTUDM6CisJCWl2YTJfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTgpOworCQltcHVfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworCQlpZiAoZW5hYmxlKSB7CisJCQlpdmEyX2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfTUNCU1AzX01BU0s7CisJCQltcHVfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1AzX01BU0s7CisJCX0gZWxzZSB7CisJCQltcHVfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9NQ0JTUDNfTUFTSzsKKwkJCWl2YTJfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1AzX01BU0s7CisJCX0KKwkJd3JpdGVsKGl2YTJfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCXdyaXRlbChtcHVfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCWJyZWFrOworCWNhc2UgQlBXUl9NQ0JTUDQ6CisJCWl2YTJfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTgpOworCQltcHVfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworCQlpZiAoZW5hYmxlKSB7CisJCQlpdmEyX2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfTUNCU1A0X01BU0s7CisJCQltcHVfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1A0X01BU0s7CisJCX0gZWxzZSB7CisJCQltcHVfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9NQ0JTUDRfTUFTSzsKKwkJCWl2YTJfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1A0X01BU0s7CisJCX0KKwkJd3JpdGVsKGl2YTJfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCXdyaXRlbChtcHVfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCWJyZWFrOworCWNhc2UgQlBXUl9NQ0JTUDU6CisJCWl2YTJfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTgpOworCQltcHVfZ3Jwc2VsID0gcmVhZGwocmVzb3VyY2VzLT5kd19wZXJfcG1fYmFzZSArIDB4QTQpOworCQlpZiAoZW5hYmxlKSB7CisJCQlpdmEyX2dycHNlbCB8PSBPTUFQMzQzMF9HUlBTRUxfTUNCU1A1X01BU0s7CisJCQltcHVfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1A1X01BU0s7CisJCX0gZWxzZSB7CisJCQltcHVfZ3Jwc2VsIHw9IE9NQVAzNDMwX0dSUFNFTF9NQ0JTUDVfTUFTSzsKKwkJCWl2YTJfZ3Jwc2VsICY9IH5PTUFQMzQzMF9HUlBTRUxfTUNCU1A1X01BU0s7CisJCX0KKwkJd3JpdGVsKGl2YTJfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBOCk7CisJCXdyaXRlbChtcHVfZ3Jwc2VsLCByZXNvdXJjZXMtPmR3X3Blcl9wbV9iYXNlICsgMHhBNCk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcF9pby5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwYzAyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcF9pby5jCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogdGlvbWFwX2lvLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogSW1wbGVtZW50YXRpb24gZm9yIHRoZSBpbyByZWFkL3dyaXRlIHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhdGZvcm0gTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS93ZHQuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNwZWNpZmljIHRvIHRoaXMgZmlsZSAqLworI2luY2x1ZGUgIl90aW9tYXAuaCIKKyNpbmNsdWRlICJfdGlvbWFwX3B3ci5oIgorI2luY2x1ZGUgInRpb21hcF9pby5oIgorCitzdGF0aWMgdTMyIHVsX2V4dF9iYXNlOworc3RhdGljIHUzMiB1bF9leHRfZW5kOworCitzdGF0aWMgdTMyIHNobTBfZW5kOworc3RhdGljIHUzMiB1bF9keW5fZXh0X2Jhc2U7CitzdGF0aWMgdTMyIHVsX3RyYWNlX3NlY19iZWc7CitzdGF0aWMgdTMyIHVsX3RyYWNlX3NlY19lbmQ7CitzdGF0aWMgdTMyIHVsX3NobV9iYXNlX3ZpcnQ7CisKK2Jvb2wgc3ltYm9sc19yZWxvYWRlZCA9IHRydWU7CisKKy8qCisgKiAgPT09PT09PT0gcmVhZF9leHRfZHNwX2RhdGEgPT09PT09PT0KKyAqICAgICAgQ29waWVzIERTUCBleHRlcm5hbCBtZW1vcnkgYnVmZmVycyB0byB0aGUgaG9zdCBzaWRlIGJ1ZmZlcnMuCisgKi8KK2ludCByZWFkX2V4dF9kc3BfZGF0YShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCSAgICAgdTggKmhvc3RfYnVmZiwgdTMyIGRzcF9hZGRyLAorCQkJICAgICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgbWVtX3R5cGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQgPSBkZXZfY3R4dDsKKwl1MzIgb2Zmc2V0OworCXUzMiB1bF90bGJfYmFzZV92aXJ0ID0gMDsKKwl1MzIgdWxfc2htX29mZnNldF92aXJ0ID0gMDsKKwl1MzIgZHdfZXh0X3Byb2dfdmlydF9tZW07CisJdTMyIGR3X2Jhc2VfYWRkciA9IGRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkcjsKKwlib29sIHRyYWNlX3JlYWQgPSBmYWxzZTsKKworCWlmICghdWxfc2htX2Jhc2VfdmlydCkgeworCQlzdGF0dXMgPSBkZXZfZ2V0X3N5bWJvbChkZXZfY29udGV4dC0+aGRldl9vYmosCisJCQkJCVNITUJBU0VOQU1FLCAmdWxfc2htX2Jhc2VfdmlydCk7CisJfQorCURCQ19BU1NFUlQodWxfc2htX2Jhc2VfdmlydCAhPSAwKTsKKworCS8qIENoZWNrIGlmIGl0IGlzIGEgcmVhZCBvZiBUcmFjZSBzZWN0aW9uICovCisJaWYgKCFzdGF0dXMgJiYgIXVsX3RyYWNlX3NlY19iZWcpIHsKKwkJc3RhdHVzID0gZGV2X2dldF9zeW1ib2woZGV2X2NvbnRleHQtPmhkZXZfb2JqLAorCQkJCQlEU1BfVFJBQ0VTRUNfQkVHLCAmdWxfdHJhY2Vfc2VjX2JlZyk7CisJfQorCURCQ19BU1NFUlQodWxfdHJhY2Vfc2VjX2JlZyAhPSAwKTsKKworCWlmICghc3RhdHVzICYmICF1bF90cmFjZV9zZWNfZW5kKSB7CisJCXN0YXR1cyA9IGRldl9nZXRfc3ltYm9sKGRldl9jb250ZXh0LT5oZGV2X29iaiwKKwkJCQkJRFNQX1RSQUNFU0VDX0VORCwgJnVsX3RyYWNlX3NlY19lbmQpOworCX0KKwlEQkNfQVNTRVJUKHVsX3RyYWNlX3NlY19lbmQgIT0gMCk7CisKKwlpZiAoIXN0YXR1cykgeworCQlpZiAoKGRzcF9hZGRyIDw9IHVsX3RyYWNlX3NlY19lbmQpICYmCisJCSAgICAoZHNwX2FkZHIgPj0gdWxfdHJhY2Vfc2VjX2JlZykpCisJCQl0cmFjZV9yZWFkID0gdHJ1ZTsKKwl9CisKKwkvKiBJZiByZWFkaW5nIGZyb20gVFJBQ0UsIGZvcmNlIHJlbWFwL3VubWFwICovCisJaWYgKHRyYWNlX3JlYWQgJiYgZHdfYmFzZV9hZGRyKSB7CisJCWR3X2Jhc2VfYWRkciA9IDA7CisJCWRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkciA9IDA7CisJfQorCisJaWYgKCFkd19iYXNlX2FkZHIpIHsKKwkJLyogSW5pdGlhbGl6ZSB1bF9leHRfYmFzZSBhbmQgdWxfZXh0X2VuZCAqLworCQl1bF9leHRfYmFzZSA9IDA7CisJCXVsX2V4dF9lbmQgPSAwOworCisJCS8qIEdldCBEWU5FWFRfQkVHLCBFWFRfQkVHIGFuZCBFWFRfRU5ELiAqLworCQlpZiAoIXN0YXR1cyAmJiAhdWxfZHluX2V4dF9iYXNlKSB7CisJCQlzdGF0dXMgPSBkZXZfZ2V0X3N5bWJvbChkZXZfY29udGV4dC0+aGRldl9vYmosCisJCQkJCQlEWU5FWFRCQVNFLCAmdWxfZHluX2V4dF9iYXNlKTsKKwkJfQorCQlEQkNfQVNTRVJUKHVsX2R5bl9leHRfYmFzZSAhPSAwKTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJc3RhdHVzID0gZGV2X2dldF9zeW1ib2woZGV2X2NvbnRleHQtPmhkZXZfb2JqLAorCQkJCQkJRVhUQkFTRSwgJnVsX2V4dF9iYXNlKTsKKwkJfQorCQlEQkNfQVNTRVJUKHVsX2V4dF9iYXNlICE9IDApOworCisJCWlmICghc3RhdHVzKSB7CisJCQlzdGF0dXMgPSBkZXZfZ2V0X3N5bWJvbChkZXZfY29udGV4dC0+aGRldl9vYmosCisJCQkJCQlFWFRFTkQsICZ1bF9leHRfZW5kKTsKKwkJfQorCQlEQkNfQVNTRVJUKHVsX2V4dF9lbmQgIT0gMCk7CisKKwkJLyogVHJhY2UgYnVmZmVyIGlzIHJpZ2h0IGFmdGVyIHRoZSBzaG0gU0VHMCwKKwkJICogIHNvIHNldCB0aGUgYmFzZSBhZGRyZXNzIHRvIFNITUJBU0UgKi8KKwkJaWYgKHRyYWNlX3JlYWQpIHsKKwkJCXVsX2V4dF9iYXNlID0gdWxfc2htX2Jhc2VfdmlydDsKKwkJCXVsX2V4dF9lbmQgPSB1bF90cmFjZV9zZWNfZW5kOworCQl9CisKKwkJREJDX0FTU0VSVCh1bF9leHRfZW5kICE9IDApOworCQlEQkNfQVNTRVJUKHVsX2V4dF9lbmQgPiB1bF9leHRfYmFzZSk7CisKKwkJaWYgKHVsX2V4dF9lbmQgPCB1bF9leHRfYmFzZSkKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJdWxfdGxiX2Jhc2VfdmlydCA9CisJCQkgICAgZGV2X2NvbnRleHQtPmF0bGJfZW50cnlbMF0udWxfZHNwX3ZhICogRFNQV09SRFNJWkU7CisJCQlEQkNfQVNTRVJUKHVsX3RsYl9iYXNlX3ZpcnQgPD0gdWxfc2htX2Jhc2VfdmlydCk7CisJCQlkd19leHRfcHJvZ192aXJ0X21lbSA9CisJCQkgICAgZGV2X2NvbnRleHQtPmF0bGJfZW50cnlbMF0udWxfZ3BwX3ZhOworCisJCQlpZiAoIXRyYWNlX3JlYWQpIHsKKwkJCQl1bF9zaG1fb2Zmc2V0X3ZpcnQgPQorCQkJCSAgICB1bF9zaG1fYmFzZV92aXJ0IC0gdWxfdGxiX2Jhc2VfdmlydDsKKwkJCQl1bF9zaG1fb2Zmc2V0X3ZpcnQgKz0KKwkJCQkgICAgUEdfQUxJR05fSElHSCh1bF9leHRfZW5kIC0gdWxfZHluX2V4dF9iYXNlICsKKwkJCQkJCSAgMSwgSFdfUEFHRV9TSVpFNjRLQik7CisJCQkJZHdfZXh0X3Byb2dfdmlydF9tZW0gLT0gdWxfc2htX29mZnNldF92aXJ0OworCQkJCWR3X2V4dF9wcm9nX3ZpcnRfbWVtICs9CisJCQkJICAgICh1bF9leHRfYmFzZSAtIHVsX2R5bl9leHRfYmFzZSk7CisJCQkJZGV2X2NvbnRleHQtPmR3X2RzcF9leHRfYmFzZV9hZGRyID0KKwkJCQkgICAgZHdfZXh0X3Byb2dfdmlydF9tZW07CisKKwkJCQkvKgorCQkJCSAqIFRoaXMgZHdfZHNwX2V4dF9iYXNlX2FkZHIgd2lsbCBnZXQgY2xlYXJlZAorCQkJCSAqIG9ubHkgd2hlbiB0aGUgYm9hcmQgaXMgc3RvcHBlZC4KKwkJCQkqLworCQkJCWlmICghZGV2X2NvbnRleHQtPmR3X2RzcF9leHRfYmFzZV9hZGRyKQorCQkJCQlzdGF0dXMgPSAtRVBFUk07CisJCQl9CisKKwkJCWR3X2Jhc2VfYWRkciA9IGR3X2V4dF9wcm9nX3ZpcnRfbWVtOworCQl9CisJfQorCisJaWYgKCFkd19iYXNlX2FkZHIgfHwgIXVsX2V4dF9iYXNlIHx8ICF1bF9leHRfZW5kKQorCQlzdGF0dXMgPSAtRVBFUk07CisKKwlvZmZzZXQgPSBkc3BfYWRkciAtIHVsX2V4dF9iYXNlOworCisJaWYgKCFzdGF0dXMpCisJCW1lbWNweShob3N0X2J1ZmYsICh1OCAqKSBkd19iYXNlX2FkZHIgKyBvZmZzZXQsIHVsX251bV9ieXRlcyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHdyaXRlX2RzcF9kYXRhID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgQ29waWVzIGJ1ZmZlcnMgdG8gdGhlIERTUCBpbnRlcm5hbC9leHRlcm5hbCBtZW1vcnkuCisgKi8KK2ludCB3cml0ZV9kc3BfZGF0YShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCSAgdTggKmhvc3RfYnVmZiwgdTMyIGRzcF9hZGRyLCB1MzIgdWxfbnVtX2J5dGVzLAorCQkJICB1MzIgbWVtX3R5cGUpCit7CisJdTMyIG9mZnNldDsKKwl1MzIgZHdfYmFzZV9hZGRyID0gZGV2X2NvbnRleHQtPmR3X2RzcF9iYXNlX2FkZHI7CisJc3RydWN0IGNmZ19ob3N0cmVzICpyZXNvdXJjZXMgPSBkZXZfY29udGV4dC0+cmVzb3VyY2VzOworCWludCBzdGF0dXMgPSAwOworCXUzMiBiYXNlMSwgYmFzZTIsIGJhc2UzOworCWJhc2UxID0gT01BUF9EU1BfTUVNMV9TSVpFOworCWJhc2UyID0gT01BUF9EU1BfTUVNMl9CQVNFIC0gT01BUF9EU1BfTUVNMV9CQVNFOworCWJhc2UzID0gT01BUF9EU1BfTUVNM19CQVNFIC0gT01BUF9EU1BfTUVNMV9CQVNFOworCisJaWYgKCFyZXNvdXJjZXMpCisJCXJldHVybiAtRVBFUk07CisKKwlvZmZzZXQgPSBkc3BfYWRkciAtIGRldl9jb250ZXh0LT5kd19kc3Bfc3RhcnRfYWRkOworCWlmIChvZmZzZXQgPCBiYXNlMSkgeworCQlkd19iYXNlX2FkZHIgPSBNRU1fTElORUFSX0FERFJFU1MocmVzb3VyY2VzLT5kd19tZW1fYmFzZVsyXSwKKwkJCQkJCSAgcmVzb3VyY2VzLT5kd19tZW1fbGVuZ3RoWzJdKTsKKwl9IGVsc2UgaWYgKG9mZnNldCA+IGJhc2UxICYmIG9mZnNldCA8IGJhc2UyICsgT01BUF9EU1BfTUVNMl9TSVpFKSB7CisJCWR3X2Jhc2VfYWRkciA9IE1FTV9MSU5FQVJfQUREUkVTUyhyZXNvdXJjZXMtPmR3X21lbV9iYXNlWzNdLAorCQkJCQkJICByZXNvdXJjZXMtPmR3X21lbV9sZW5ndGhbM10pOworCQlvZmZzZXQgPSBvZmZzZXQgLSBiYXNlMjsKKwl9IGVsc2UgaWYgKG9mZnNldCA+PSBiYXNlMiArIE9NQVBfRFNQX01FTTJfU0laRSAmJgorCQkgICBvZmZzZXQgPCBiYXNlMyArIE9NQVBfRFNQX01FTTNfU0laRSkgeworCQlkd19iYXNlX2FkZHIgPSBNRU1fTElORUFSX0FERFJFU1MocmVzb3VyY2VzLT5kd19tZW1fYmFzZVs0XSwKKwkJCQkJCSAgcmVzb3VyY2VzLT5kd19tZW1fbGVuZ3RoWzRdKTsKKwkJb2Zmc2V0ID0gb2Zmc2V0IC0gYmFzZTM7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKHVsX251bV9ieXRlcykKKwkJbWVtY3B5KCh1OCAqKSAoZHdfYmFzZV9hZGRyICsgb2Zmc2V0KSwgaG9zdF9idWZmLCB1bF9udW1fYnl0ZXMpOworCWVsc2UKKwkJKigodTMyICopIGhvc3RfYnVmZikgPSBkd19iYXNlX2FkZHIgKyBvZmZzZXQ7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHdyaXRlX2V4dF9kc3BfZGF0YSA9PT09PT09PQorICogIHB1cnBvc2U6CisgKiAgICAgIENvcGllcyBidWZmZXJzIHRvIHRoZSBleHRlcm5hbCBtZW1vcnkuCisgKgorICovCitpbnQgd3JpdGVfZXh0X2RzcF9kYXRhKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LAorCQkJICAgICAgdTggKmhvc3RfYnVmZiwgdTMyIGRzcF9hZGRyLAorCQkJICAgICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlLAorCQkJICAgICAgYm9vbCBkeW5hbWljX2xvYWQpCit7CisJdTMyIGR3X2Jhc2VfYWRkciA9IGRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkcjsKKwl1MzIgZHdfb2Zmc2V0ID0gMDsKKwl1OCB0ZW1wX2J5dGUxLCB0ZW1wX2J5dGUyOworCXU4IHJlbWFpbl9ieXRlWzRdOworCXMzMiBpOworCWludCByZXQgPSAwOworCXUzMiBkd19leHRfcHJvZ192aXJ0X21lbTsKKwl1MzIgdWxfdGxiX2Jhc2VfdmlydCA9IDA7CisJdTMyIHVsX3NobV9vZmZzZXRfdmlydCA9IDA7CisJc3RydWN0IGNmZ19ob3N0cmVzICpob3N0X3JlcyA9IGRldl9jb250ZXh0LT5yZXNvdXJjZXM7CisJYm9vbCB0cmFjZV9sb2FkID0gZmFsc2U7CisJdGVtcF9ieXRlMSA9IDB4MDsKKwl0ZW1wX2J5dGUyID0gMHgwOworCisJaWYgKHN5bWJvbHNfcmVsb2FkZWQpIHsKKwkJLyogQ2hlY2sgaWYgaXQgaXMgYSBsb2FkIHRvIFRyYWNlIHNlY3Rpb24gKi8KKwkJcmV0ID0gZGV2X2dldF9zeW1ib2woZGV2X2NvbnRleHQtPmhkZXZfb2JqLAorCQkJCSAgICAgRFNQX1RSQUNFU0VDX0JFRywgJnVsX3RyYWNlX3NlY19iZWcpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGRldl9nZXRfc3ltYm9sKGRldl9jb250ZXh0LT5oZGV2X29iaiwKKwkJCQkJICAgICBEU1BfVFJBQ0VTRUNfRU5ELAorCQkJCQkgICAgICZ1bF90cmFjZV9zZWNfZW5kKTsKKwl9CisJaWYgKCFyZXQpIHsKKwkJaWYgKChkc3BfYWRkciA8PSB1bF90cmFjZV9zZWNfZW5kKSAmJgorCQkgICAgKGRzcF9hZGRyID49IHVsX3RyYWNlX3NlY19iZWcpKQorCQkJdHJhY2VfbG9hZCA9IHRydWU7CisJfQorCisJLyogSWYgZHluYW1pYywgZm9yY2UgcmVtYXAvdW5tYXAgKi8KKwlpZiAoKGR5bmFtaWNfbG9hZCB8fCB0cmFjZV9sb2FkKSAmJiBkd19iYXNlX2FkZHIpIHsKKwkJZHdfYmFzZV9hZGRyID0gMDsKKwkJTUVNX1VOTUFQX0xJTkVBUl9BRERSRVNTKCh2b2lkICopCisJCQkJCSBkZXZfY29udGV4dC0+ZHdfZHNwX2V4dF9iYXNlX2FkZHIpOworCQlkZXZfY29udGV4dC0+ZHdfZHNwX2V4dF9iYXNlX2FkZHIgPSAweDA7CisJfQorCWlmICghZHdfYmFzZV9hZGRyKSB7CisJCWlmIChzeW1ib2xzX3JlbG9hZGVkKQorCQkJLyogR2V0IFNITV9CRUcgIEVYVF9CRUcgYW5kIEVYVF9FTkQuICovCisJCQlyZXQgPSBkZXZfZ2V0X3N5bWJvbChkZXZfY29udGV4dC0+aGRldl9vYmosCisJCQkJCSAgICAgU0hNQkFTRU5BTUUsICZ1bF9zaG1fYmFzZV92aXJ0KTsKKwkJREJDX0FTU0VSVCh1bF9zaG1fYmFzZV92aXJ0ICE9IDApOworCQlpZiAoZHluYW1pY19sb2FkKSB7CisJCQlpZiAoIXJldCkgeworCQkJCWlmIChzeW1ib2xzX3JlbG9hZGVkKQorCQkJCQlyZXQgPQorCQkJCQkgICAgZGV2X2dldF9zeW1ib2wKKwkJCQkJICAgIChkZXZfY29udGV4dC0+aGRldl9vYmosIERZTkVYVEJBU0UsCisJCQkJCSAgICAgJnVsX2V4dF9iYXNlKTsKKwkJCX0KKwkJCURCQ19BU1NFUlQodWxfZXh0X2Jhc2UgIT0gMCk7CisJCQlpZiAoIXJldCkgeworCQkJCS8qIERSICBPTUFQUzAwMDEzMjM1IDogRExNb2R1bGVzIGFycmF5IG1heSBiZQorCQkJCSAqIGluIEVYVE1FTS4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBEWU5FWFRNRU0gYW5kCisJCQkJICogRVhUTUVNIGFyZSBjb250aWd1b3VzLCBzbyBjaGVja2luZyBmb3IgdGhlCisJCQkJICogdXBwZXIgYm91bmQgYXQgRVhURU5EIHNob3VsZCBiZSBPay4gKi8KKwkJCQlpZiAoc3ltYm9sc19yZWxvYWRlZCkKKwkJCQkJcmV0ID0KKwkJCQkJICAgIGRldl9nZXRfc3ltYm9sCisJCQkJCSAgICAoZGV2X2NvbnRleHQtPmhkZXZfb2JqLCBFWFRFTkQsCisJCQkJCSAgICAgJnVsX2V4dF9lbmQpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN5bWJvbHNfcmVsb2FkZWQpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0KKwkJCQkJICAgIGRldl9nZXRfc3ltYm9sCisJCQkJCSAgICAoZGV2X2NvbnRleHQtPmhkZXZfb2JqLCBFWFRCQVNFLAorCQkJCQkgICAgICZ1bF9leHRfYmFzZSk7CisJCQkJREJDX0FTU0VSVCh1bF9leHRfYmFzZSAhPSAwKTsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0KKwkJCQkJICAgIGRldl9nZXRfc3ltYm9sCisJCQkJCSAgICAoZGV2X2NvbnRleHQtPmhkZXZfb2JqLCBFWFRFTkQsCisJCQkJCSAgICAgJnVsX2V4dF9lbmQpOworCQkJfQorCQl9CisJCS8qIFRyYWNlIGJ1ZmZlciBpdCByaWdodCBhZnRlciB0aGUgc2htIFNFRzAsIHNvIHNldCB0aGUKKwkJICogICAgICBiYXNlIGFkZHJlc3MgdG8gU0hNQkFTRSAqLworCQlpZiAodHJhY2VfbG9hZCkKKwkJCXVsX2V4dF9iYXNlID0gdWxfc2htX2Jhc2VfdmlydDsKKworCQlEQkNfQVNTRVJUKHVsX2V4dF9lbmQgIT0gMCk7CisJCURCQ19BU1NFUlQodWxfZXh0X2VuZCA+IHVsX2V4dF9iYXNlKTsKKwkJaWYgKHVsX2V4dF9lbmQgPCB1bF9leHRfYmFzZSkKKwkJCXJldCA9IC1FUEVSTTsKKworCQlpZiAoIXJldCkgeworCQkJdWxfdGxiX2Jhc2VfdmlydCA9CisJCQkgICAgZGV2X2NvbnRleHQtPmF0bGJfZW50cnlbMF0udWxfZHNwX3ZhICogRFNQV09SRFNJWkU7CisJCQlEQkNfQVNTRVJUKHVsX3RsYl9iYXNlX3ZpcnQgPD0gdWxfc2htX2Jhc2VfdmlydCk7CisKKwkJCWlmIChzeW1ib2xzX3JlbG9hZGVkKSB7CisJCQkJcmV0ID0gZGV2X2dldF9zeW1ib2wKKwkJCQkJICAgIChkZXZfY29udGV4dC0+aGRldl9vYmosCisJCQkJCSAgICAgRFNQX1RSQUNFU0VDX0VORCwgJnNobTBfZW5kKTsKKwkJCQlpZiAoIXJldCkgeworCQkJCQlyZXQgPQorCQkJCQkgICAgZGV2X2dldF9zeW1ib2wKKwkJCQkJICAgIChkZXZfY29udGV4dC0+aGRldl9vYmosIERZTkVYVEJBU0UsCisJCQkJCSAgICAgJnVsX2R5bl9leHRfYmFzZSk7CisJCQkJfQorCQkJfQorCQkJdWxfc2htX29mZnNldF92aXJ0ID0KKwkJCSAgICB1bF9zaG1fYmFzZV92aXJ0IC0gdWxfdGxiX2Jhc2VfdmlydDsKKwkJCWlmICh0cmFjZV9sb2FkKSB7CisJCQkJZHdfZXh0X3Byb2dfdmlydF9tZW0gPQorCQkJCSAgICBkZXZfY29udGV4dC0+YXRsYl9lbnRyeVswXS51bF9ncHBfdmE7CisJCQl9IGVsc2UgeworCQkJCWR3X2V4dF9wcm9nX3ZpcnRfbWVtID0gaG9zdF9yZXMtPmR3X21lbV9iYXNlWzFdOworCQkJCWR3X2V4dF9wcm9nX3ZpcnRfbWVtICs9CisJCQkJICAgICh1bF9leHRfYmFzZSAtIHVsX2R5bl9leHRfYmFzZSk7CisJCQl9CisKKwkJCWRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkciA9CisJCQkgICAgKHUzMikgTUVNX0xJTkVBUl9BRERSRVNTKCh2b2lkICopCisJCQkJCQkgICAgIGR3X2V4dF9wcm9nX3ZpcnRfbWVtLAorCQkJCQkJICAgICB1bF9leHRfZW5kIC0gdWxfZXh0X2Jhc2UpOworCQkJZHdfYmFzZV9hZGRyICs9IGRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkcjsKKwkJCS8qIFRoaXMgZHdfZHNwX2V4dF9iYXNlX2FkZHIgd2lsbCBnZXQgY2xlYXJlZCBvbmx5IHdoZW4KKwkJCSAqIHRoZSBib2FyZCBpcyBzdG9wcGVkLiAqLworCQkJaWYgKCFkZXZfY29udGV4dC0+ZHdfZHNwX2V4dF9iYXNlX2FkZHIpCisJCQkJcmV0ID0gLUVQRVJNOworCQl9CisJfQorCWlmICghZHdfYmFzZV9hZGRyIHx8ICF1bF9leHRfYmFzZSB8fCAhdWxfZXh0X2VuZCkKKwkJcmV0ID0gLUVQRVJNOworCisJaWYgKCFyZXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXJlbWFpbl9ieXRlW2ldID0gMHgwOworCisJCWR3X29mZnNldCA9IGRzcF9hZGRyIC0gdWxfZXh0X2Jhc2U7CisJCS8qIEFsc28gbWFrZSBzdXJlIHRoZSBkc3BfYWRkciBpcyA8IHVsX2V4dF9lbmQgKi8KKwkJaWYgKGRzcF9hZGRyID4gdWxfZXh0X2VuZCB8fCBkd19vZmZzZXQgPiBkc3BfYWRkcikKKwkJCXJldCA9IC1FUEVSTTsKKwl9CisJaWYgKCFyZXQpIHsKKwkJaWYgKHVsX251bV9ieXRlcykKKwkJCW1lbWNweSgodTggKikgZHdfYmFzZV9hZGRyICsgZHdfb2Zmc2V0LCBob3N0X2J1ZmYsCisJCQkgICAgICAgdWxfbnVtX2J5dGVzKTsKKwkJZWxzZQorCQkJKigodTMyICopIGhvc3RfYnVmZikgPSBkd19iYXNlX2FkZHIgKyBkd19vZmZzZXQ7CisJfQorCS8qIFVubWFwIGhlcmUgdG8gZm9yY2UgcmVtYXAgZm9yIG90aGVyIEV4dCBsb2FkcyAqLworCWlmICgoZHluYW1pY19sb2FkIHx8IHRyYWNlX2xvYWQpICYmIGRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkcikgeworCQlNRU1fVU5NQVBfTElORUFSX0FERFJFU1MoKHZvaWQgKikKKwkJCQkJIGRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkcik7CisJCWRldl9jb250ZXh0LT5kd19kc3BfZXh0X2Jhc2VfYWRkciA9IDB4MDsKKwl9CisJc3ltYm9sc19yZWxvYWRlZCA9IGZhbHNlOworCXJldHVybiByZXQ7Cit9CisKK2ludCBzbV9pbnRlcnJ1cHRfZHNwKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LCB1MTYgbWJfdmFsKQoreworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9EVkZTCisJdTMyIG9wcGxldmVsID0gMDsKKyNlbmRpZgorCXN0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQlvbWFwX2RzcGJyaWRnZV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjZmdfaG9zdHJlcyAqcmVzb3VyY2VzID0gZGV2X2NvbnRleHQtPnJlc291cmNlczsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgdGVtcDsKKworCWlmICghZGV2X2NvbnRleHQtPm1ib3gpCisJCXJldHVybiAwOworCisJaWYgKCFyZXNvdXJjZXMpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfRFNQX0hJQkVSTkFUSU9OIHx8CisJICAgIGRldl9jb250ZXh0LT5kd19icmRfc3RhdGUgPT0gQlJEX0hJQkVSTkFUSU9OKSB7CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKwkJaWYgKHBkYXRhLT5kc3BfZ2V0X29wcCkKKwkJCW9wcGxldmVsID0gKCpwZGF0YS0+ZHNwX2dldF9vcHApICgpOworCQlpZiAob3BwbGV2ZWwgPT0gVkREMV9PUFAxKSB7CisJCQlpZiAocGRhdGEtPmRzcF9zZXRfbWluX29wcCkKKwkJCQkoKnBkYXRhLT5kc3Bfc2V0X21pbl9vcHApIChWREQxX09QUDIpOworCQl9CisjZW5kaWYKKwkJLyogUmVzdGFydCB0aGUgcGVyaXBoZXJhbCBjbG9ja3MgKi8KKwkJZHNwX2Nsb2NrX2VuYWJsZV9hbGwoZGV2X2NvbnRleHQtPmRzcF9wZXJfY2xrcyk7CisJCWRzcF93ZHRfZW5hYmxlKHRydWUpOworCisJCS8qCisJCSAqIDI6MCBBVVRPX0lWQTJfRFBMTCAtIEVuYWJsaW5nIElWQTIgRFBMTCBhdXRvIGNvbnRyb2wKKwkJICogICAgIGluIENNX0FVVE9JRExFX1BMTF9JVkEyIHJlZ2lzdGVyCisJCSAqLworCQkoKnBkYXRhLT5kc3BfY21fd3JpdGUpKDEgPDwgT01BUDM0MzBfQVVUT19JVkEyX0RQTExfU0hJRlQsCisJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAzNDMwX0NNX0FVVE9JRExFX1BMTCk7CisKKwkJLyoKKwkJICogNzo0IElWQTJfRFBMTF9GUkVRU0VMIC0gSVZBMiBpbnRlcm5hbCBmcnEgc2V0IHRvCisJCSAqICAgICAwLjc1IE1IeiAtIDEuMCBNSHoKKwkJICogMjowIEVOX0lWQTJfRFBMTCAtIEVuYWJsZSBJVkEyIERQTEwgaW4gbG9jayBtb2RlCisJCSAqLworCQkoKnBkYXRhLT5kc3BfY21fcm13X2JpdHMpKE9NQVAzNDMwX0lWQTJfRFBMTF9GUkVRU0VMX01BU0sgfAorCQkJCU9NQVAzNDMwX0VOX0lWQTJfRFBMTF9NQVNLLAorCQkJCTB4MyA8PCBPTUFQMzQzMF9JVkEyX0RQTExfRlJFUVNFTF9TSElGVCB8CisJCQkJMHg3IDw8IE9NQVAzNDMwX0VOX0lWQTJfRFBMTF9TSElGVCwKKwkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDM0MzBfQ01fQ0xLRU5fUExMKTsKKworCQkvKiBSZXN0b3JlIG1haWxib3ggc2V0dGluZ3MgKi8KKwkJb21hcF9tYm94X3Jlc3RvcmVfY3R4KGRldl9jb250ZXh0LT5tYm94KTsKKworCQkvKiBBY2Nlc3MgTU1VIFNZUyBDT05GSUcgcmVnaXN0ZXIgdG8gZ2VuZXJhdGUgYSBzaG9ydCB3YWtldXAgKi8KKwkJdGVtcCA9IHJlYWRsKHJlc291cmNlcy0+ZHdfZG1tdV9iYXNlICsgMHgxMCk7CisKKwkJZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9IEJSRF9SVU5OSU5HOworCX0gZWxzZSBpZiAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSA9PSBCUkRfUkVURU5USU9OKSB7CisJCS8qIFJlc3RhcnQgdGhlIHBlcmlwaGVyYWwgY2xvY2tzICovCisJCWRzcF9jbG9ja19lbmFibGVfYWxsKGRldl9jb250ZXh0LT5kc3BfcGVyX2Nsa3MpOworCX0KKworCXN0YXR1cyA9IG9tYXBfbWJveF9tc2dfc2VuZChkZXZfY29udGV4dC0+bWJveCwgbWJfdmFsKTsKKworCWlmIChzdGF0dXMpIHsKKwkJcHJfZXJyKCJvbWFwX21ib3hfbXNnX3NlbmQgRmFpbCBhbmQgc3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcF9pby5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmMTljNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcF9pby5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogdGlvbWFwX2lvLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRGVmaW5pdGlvbnMsIHR5cGVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUgaW8gKHIvdyBleHRlcm5hbCBtZW0pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX1RJT01BUF9JT18KKyNkZWZpbmUgX1RJT01BUF9JT18KKworLyoKKyAqIFN5bWJvbCB0aGF0IGRlZmluZXMgYmVnaW5uaW5nIG9mIHNoYXJlZCBtZW1vcnkuCisgKiBGb3IgT01BUCAoSGVsZW4pIHRoaXMgaXMgdGhlIERTUCBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiBTRFJBTS4KKyAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHByb2dyYW0gRFNQIE1NVSB0byBtYXAgRFNQIFZpcnQgdG8gR1BQIHBoeXMuCisgKiAoc2VlIGRzcE1tdVRsYkVudHJ5KCkpLgorICovCisjZGVmaW5lIFNITUJBU0VOQU1FICJTSE1fQkVHIgorI2RlZmluZSBFWFRCQVNFICAgICAiRVhUX0JFRyIKKyNkZWZpbmUgRVhURU5EICAgICAgIl9FWFRfRU5EIgorI2RlZmluZSBEWU5FWFRCQVNFICAiX0RZTkVYVF9CRUciCisjZGVmaW5lIERZTkVYVEVORCAgICJfRFlORVhUX0VORCIKKyNkZWZpbmUgSVZBRVhUTUVNQkFTRSAgICJfSVZBRVhUTUVNX0JFRyIKKyNkZWZpbmUgSVZBRVhUTUVNRU5EICAgIl9JVkFFWFRNRU1fRU5EIgorCisjZGVmaW5lIERTUF9UUkFDRVNFQ19CRUcgICJfQlJJREdFX1RSQUNFX0JFRyIKKyNkZWZpbmUgRFNQX1RSQUNFU0VDX0VORCAgIl9CUklER0VfVFJBQ0VfRU5EIgorCisjZGVmaW5lIFNZU19QVVRDQkVHICAgICAgICAgICAgICAgIl9TWVNfUFVUQ0JFRyIKKyNkZWZpbmUgU1lTX1BVVENFTkQgICAgICAgICAgICAgICAiX1NZU19QVVRDRU5EIgorI2RlZmluZSBCUklER0VfU1lTX1BVVENfQ1VSUkVOVCAgICJfQlJJREdFX1NZU19QVVRDX2N1cnJlbnQiCisKKyNkZWZpbmUgV09SRFNXQVBfRU5BQkxFIDB4MwkvKiBFbmFibGUgd29yZCBzd2FwICovCisKKy8qCisgKiAgPT09PT09PT0gcmVhZF9leHRfZHNwX2RhdGEgPT09PT09PT0KKyAqICBSZWFkcyBpdCBmcm9tIERTUCBFeHRlcm5hbCBtZW1vcnkuIFRoZSBleHRlcm5hbCBtZW1vcnkgZm9yIHRoZSBEU1AKKyAqIGlzIGNvbmZpZ3VyZWQgYnkgdGhlIGNvbWJpbmF0aW9uIG9mIERTUCBNTVUgYW5kIHNobSBNZW1vcnkgbWFuYWdlciBpbiB0aGUgQ0RCCisgKi8KK2V4dGVybiBpbnQgcmVhZF9leHRfZHNwX2RhdGEoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgIHU4ICpob3N0X2J1ZmYsIHUzMiBkc3BfYWRkciwKKwkJCQkgICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlKTsKKworLyoKKyAqICA9PT09PT09PSB3cml0ZV9kc3BfZGF0YSA9PT09PT09PQorICovCitleHRlcm4gaW50IHdyaXRlX2RzcF9kYXRhKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jb250ZXh0LAorCQkJCSB1OCAqaG9zdF9idWZmLCB1MzIgZHNwX2FkZHIsCisJCQkJIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fdHlwZSk7CisKKy8qCisgKiAgPT09PT09PT0gd3JpdGVfZXh0X2RzcF9kYXRhID09PT09PT09CisgKiAgV3JpdGVzIHRvIHRoZSBEU1AgRXh0ZXJuYWwgbWVtb3J5IGZvciBleHRlcm5hbCBwcm9ncmFtLgorICogIFRoZSBleHQgbWVtIGZvciBwcm9ncmEgaXMgY29uZmlndXJlZCBieSB0aGUgY29tYmluYXRpb24gb2YgRFNQIE1NVSBhbmQKKyAqICBzaG0gTWVtb3J5IG1hbmFnZXIgaW4gdGhlIENEQgorICovCitleHRlcm4gaW50IHdyaXRlX2V4dF9kc3BfZGF0YShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCQkgICAgIHU4ICpob3N0X2J1ZmYsIHUzMiBkc3BfYWRkciwKKwkJCQkgICAgIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fdHlwZSwKKwkJCQkgICAgIGJvb2wgZHluYW1pY19sb2FkKTsKKworLyoKKyAqID09PT09PT09IHdyaXRlX2V4dDMyX2JpdF9kc3BfZGF0YSA9PT09PT09PQorICogV3JpdGVzIDMyIGJpdCBkYXRhIHRvIHRoZSBleHRlcm5hbCBtZW1vcnkKKyAqLworZXh0ZXJuIGlubGluZSB2b2lkIHdyaXRlX2V4dDMyX2JpdF9kc3BfZGF0YShjb25zdAorCQkJCQlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY29udGV4dCwKKwkJCQkJdTMyIGRzcF9hZGRyLCB1MzIgdmFsKQoreworCSoodTMyICopIGRzcF9hZGRyID0gKChkZXZfY29udGV4dC0+dGNfd29yZF9zd2FwX29uKSA/ICgoKHZhbCA8PCAxNikgJgorCQkJCQkJCQkgMHhGRkZGMDAwMCkgfAorCQkJCQkJCQkoKHZhbCA+PiAxNikgJgorCQkJCQkJCQkgMHgwMDAwRkZGRikpIDoKKwkJCSAgICAgIHZhbCk7Cit9CisKKy8qCisgKiA9PT09PT09PSByZWFkX2V4dDMyX2JpdF9kc3BfZGF0YSA9PT09PT09PQorICogUmVhZHMgMzIgYml0IGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgbWVtb3J5CisgKi8KK2V4dGVybiBpbmxpbmUgdTMyIHJlYWRfZXh0MzJfYml0X2RzcF9kYXRhKGNvbnN0IHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQKKwkJCQkJICAqZGV2X2NvbnRleHQsIHUzMiBkc3BfYWRkcikKK3sKKwl1MzIgcmV0OworCXJldCA9ICoodTMyICopIGRzcF9hZGRyOworCisJcmV0ID0gKChkZXZfY29udGV4dC0+dGNfd29yZF9zd2FwX29uKSA/ICgoKHJldCA8PCAxNikKKwkJCQkJCSAgJiAweEZGRkYwMDAwKSB8ICgocmV0ID4+IDE2KSAmCisJCQkJCQkJCSAgIDB4MDAwMEZGRkYpKQorCSAgICAgICA6IHJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIF9USU9NQVBfSU9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS91ZV9kZWguYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3VlX2RlaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzA0MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS91ZV9kZWguYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIHVlX2RlaC5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEltcGxlbWVudHMgdXBwZXIgZWRnZSBEU1AgZXhjZXB0aW9uIGhhbmRsaW5nIChERUgpIGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEZlbGlwZSBDb250cmVyYXMKKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHBsYXQvZG10aW1lci5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkZWguaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSAiX3Rpb21hcC5oIgorI2luY2x1ZGUgIl9kZWguaCIKKworI2luY2x1ZGUgPGRzcGJyaWRnZS9pb19zbS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvd2R0Lmg+CisKK3N0YXRpYyB1MzIgZmF1bHRfYWRkcjsKKworc3RhdGljIHZvaWQgbW11X2ZhdWx0X2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGRlaF9tZ3IgKmRlaCA9ICh2b2lkICopZGF0YTsKKworCWlmICghZGVoKQorCQlyZXR1cm47CisKKwlicmlkZ2VfZGVoX25vdGlmeShkZWgsIERTUF9NTVVGQVVMVCwgMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtbXVfZmF1bHRfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRlaF9tZ3IgKmRlaCA9IGRhdGE7CisJc3RydWN0IGNmZ19ob3N0cmVzICpyZXNvdXJjZXM7CisJdTMyIGV2ZW50OworCisJaWYgKCFkZWgpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXJlc291cmNlcyA9IGRlaC0+aGJyaWRnZV9jb250ZXh0LT5yZXNvdXJjZXM7CisJaWYgKCFyZXNvdXJjZXMpIHsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogRmFpbGVkIHRvIGdldCBIb3N0IFJlc291cmNlc1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlod19tbXVfZXZlbnRfc3RhdHVzKHJlc291cmNlcy0+ZHdfZG1tdV9iYXNlLCAmZXZlbnQpOworCWlmIChldmVudCA9PSBIV19NTVVfVFJBTlNMQVRJT05fRkFVTFQpIHsKKwkJaHdfbW11X2ZhdWx0X2FkZHJfcmVhZChyZXNvdXJjZXMtPmR3X2RtbXVfYmFzZSwgJmZhdWx0X2FkZHIpOworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBldmVudD0weCV4LCBmYXVsdF9hZGRyPTB4JXhcbiIsIF9fZnVuY19fLAorCQkJCWV2ZW50LCBmYXVsdF9hZGRyKTsKKwkJLyoKKwkJICogU2NoZWR1bGUgYSBEUEMgZGlyZWN0bHkuIEluIHRoZSBmdXR1cmUsIGl0IG1heSBiZQorCQkgKiBuZWNlc3NhcnkgdG8gY2hlY2sgaWYgRFNQIE1NVSBmYXVsdCBpcyBpbnRlbmRlZCBmb3IKKwkJICogQnJpZGdlLgorCQkgKi8KKwkJdGFza2xldF9zY2hlZHVsZSgmZGVoLT5kcGNfdGFza2xldCk7CisKKwkJLyogRGlzYWJsZSB0aGUgTU1VIGV2ZW50cywgZWxzZSBvbmNlIHdlIGNsZWFyIGl0IHdpbGwKKwkJICogc3RhcnQgdG8gcmFpc2UgSU5UcyBhZ2FpbiAqLworCQlod19tbXVfZXZlbnRfZGlzYWJsZShyZXNvdXJjZXMtPmR3X2RtbXVfYmFzZSwKKwkJCQlIV19NTVVfVFJBTlNMQVRJT05fRkFVTFQpOworCX0gZWxzZSB7CisJCWh3X21tdV9ldmVudF9kaXNhYmxlKHJlc291cmNlcy0+ZHdfZG1tdV9iYXNlLAorCQkJCUhXX01NVV9BTExfSU5URVJSVVBUUyk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IGJyaWRnZV9kZWhfY3JlYXRlKHN0cnVjdCBkZWhfbWdyICoqcmV0X2RlaCwKKwkJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGRlaF9tZ3IgKmRlaDsKKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpoYnJpZGdlX2NvbnRleHQgPSBOVUxMOworCisJLyogIE1lc3NhZ2UgbWFuYWdlciB3aWxsIGJlIGNyZWF0ZWQgd2hlbiBhIGZpbGUgaXMgbG9hZGVkLCBzaW5jZQorCSAqICBzaXplIG9mIG1lc3NhZ2UgYnVmZmVyIGluIHNoYXJlZCBtZW1vcnkgaXMgY29uZmlndXJhYmxlIGluCisJICogIHRoZSBiYXNlIGltYWdlLiAqLworCS8qIEdldCBCcmlkZ2UgY29udGV4dCBpbmZvLiAqLworCWRldl9nZXRfYnJpZGdlX2NvbnRleHQoaGRldl9vYmosICZoYnJpZGdlX2NvbnRleHQpOworCS8qIEFsbG9jYXRlIElPIG1hbmFnZXIgb2JqZWN0OiAqLworCWRlaCA9IGt6YWxsb2Moc2l6ZW9mKCpkZWgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlaCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDcmVhdGUgYW4gTlRGWSBvYmplY3QgdG8gbWFuYWdlIG5vdGlmaWNhdGlvbnMgKi8KKwlkZWgtPm50Znlfb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG50Znlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWgtPm50Znlfb2JqKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwludGZ5X2luaXQoZGVoLT5udGZ5X29iaik7CisKKwkvKiBDcmVhdGUgYSBNTVVmYXVsdCBEUEMgKi8KKwl0YXNrbGV0X2luaXQoJmRlaC0+ZHBjX3Rhc2tsZXQsIG1tdV9mYXVsdF9kcGMsICh1MzIpIGRlaCk7CisKKwkvKiBGaWxsIGluIGNvbnRleHQgc3RydWN0dXJlICovCisJZGVoLT5oYnJpZGdlX2NvbnRleHQgPSBoYnJpZGdlX2NvbnRleHQ7CisKKwkvKiBJbnN0YWxsIElTUiBmdW5jdGlvbiBmb3IgRFNQIE1NVSBmYXVsdCAqLworCXN0YXR1cyA9IHJlcXVlc3RfaXJxKElOVF9EU1BfTU1VX0lSUSwgbW11X2ZhdWx0X2lzciwgMCwKKwkJCSJEc3BCcmlkZ2VcdGlvbW11IGZhdWx0IiwgZGVoKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnI7CisKKwkqcmV0X2RlaCA9IGRlaDsKKwlyZXR1cm4gMDsKKworZXJyOgorCWJyaWRnZV9kZWhfZGVzdHJveShkZWgpOworCSpyZXRfZGVoID0gTlVMTDsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYnJpZGdlX2RlaF9kZXN0cm95KHN0cnVjdCBkZWhfbWdyICpkZWgpCit7CisJaWYgKCFkZWgpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSWYgbm90aWZpY2F0aW9uIG9iamVjdCBleGlzdHMsIGRlbGV0ZSBpdCAqLworCWlmIChkZWgtPm50Znlfb2JqKSB7CisJCW50ZnlfZGVsZXRlKGRlaC0+bnRmeV9vYmopOworCQlrZnJlZShkZWgtPm50Znlfb2JqKTsKKwl9CisJLyogRGlzYWJsZSBEU1AgTU1VIGZhdWx0ICovCisJZnJlZV9pcnEoSU5UX0RTUF9NTVVfSVJRLCBkZWgpOworCisJLyogRnJlZSBEUEMgb2JqZWN0ICovCisJdGFza2xldF9raWxsKCZkZWgtPmRwY190YXNrbGV0KTsKKworCS8qIERlYWxsb2NhdGUgdGhlIERFSCBtYW5hZ2VyIG9iamVjdCAqLworCWtmcmVlKGRlaCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJyaWRnZV9kZWhfcmVnaXN0ZXJfbm90aWZ5KHN0cnVjdCBkZWhfbWdyICpkZWgsIHUzMiBldmVudF9tYXNrLAorCQl1MzIgbm90aWZ5X3R5cGUsCisJCXN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uICpobm90aWZpY2F0aW9uKQoreworCWlmICghZGVoKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChldmVudF9tYXNrKQorCQlyZXR1cm4gbnRmeV9yZWdpc3RlcihkZWgtPm50Znlfb2JqLCBobm90aWZpY2F0aW9uLAorCQkJCWV2ZW50X21hc2ssIG5vdGlmeV90eXBlKTsKKwllbHNlCisJCXJldHVybiBudGZ5X3VucmVnaXN0ZXIoZGVoLT5udGZ5X29iaiwgaG5vdGlmaWNhdGlvbik7Cit9CisKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCitzdGF0aWMgdm9pZCBtbXVfZmF1bHRfcHJpbnRfc3RhY2soc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQpCit7CisJc3RydWN0IGNmZ19ob3N0cmVzICpyZXNvdXJjZXM7CisJc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCBtYXBfYXR0cnMgPSB7CisJCS5lbmRpYW5pc20gPSBIV19MSVRUTEVfRU5ESUFOLAorCQkuZWxlbWVudF9zaXplID0gSFdfRUxFTV9TSVpFMTZCSVQsCisJCS5taXhlZF9zaXplID0gSFdfTU1VX0NQVUVTLAorCX07CisJdm9pZCAqZHVtbXlfdmFfYWRkcjsKKworCXJlc291cmNlcyA9IGRldl9jb250ZXh0LT5yZXNvdXJjZXM7CisJZHVtbXlfdmFfYWRkciA9ICh2b2lkKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CisKKwkvKgorCSAqIEJlZm9yZSBhY2tpbmcgdGhlIE1NVSBmYXVsdCwgbGV0J3MgbWFrZSBzdXJlIE1NVSBjYW4gb25seQorCSAqIGFjY2VzcyBlbnRyeSAjMC4gVGhlbiBhZGQgYSBuZXcgZW50cnkgc28gdGhhdCB0aGUgRFNQIE9TCisJICogY2FuIGNvbnRpbnVlIGluIG9yZGVyIHRvIGR1bXAgdGhlIHN0YWNrLgorCSAqLworCWh3X21tdV90d2xfZGlzYWJsZShyZXNvdXJjZXMtPmR3X2RtbXVfYmFzZSk7CisJaHdfbW11X3RsYl9mbHVzaF9hbGwocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UpOworCisJaHdfbW11X3RsYl9hZGQocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UsCisJCQl2aXJ0X3RvX3BoeXMoZHVtbXlfdmFfYWRkciksIGZhdWx0X2FkZHIsCisJCQlIV19QQUdFX1NJWkU0S0IsIDEsCisJCQkmbWFwX2F0dHJzLCBIV19TRVQsIEhXX1NFVCk7CisKKwlkc3BfY2xrX2VuYWJsZShEU1BfQ0xLX0dQVDgpOworCisJZHNwX2dwdF93YWl0X292ZXJmbG93KERTUF9DTEtfR1BUOCwgMHhmZmZmZmZmZSk7CisKKwkvKiBDbGVhciBNTVUgaW50ZXJydXB0ICovCisJaHdfbW11X2V2ZW50X2FjayhyZXNvdXJjZXMtPmR3X2RtbXVfYmFzZSwKKwkJCUhXX01NVV9UUkFOU0xBVElPTl9GQVVMVCk7CisJZHVtcF9kc3Bfc3RhY2soZGV2X2NvbnRleHQpOworCWRzcF9jbGtfZGlzYWJsZShEU1BfQ0xLX0dQVDgpOworCisJaHdfbW11X2Rpc2FibGUocmVzb3VyY2VzLT5kd19kbW11X2Jhc2UpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkdW1teV92YV9hZGRyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmV2ZW50X3RvX3N0cmluZyhpbnQgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRFNQX1NZU0VSUk9SOiByZXR1cm4gIkRTUF9TWVNFUlJPUiI7IGJyZWFrOworCWNhc2UgRFNQX01NVUZBVUxUOiByZXR1cm4gIkRTUF9NTVVGQVVMVCI7IGJyZWFrOworCWNhc2UgRFNQX1BXUkVSUk9SOiByZXR1cm4gIkRTUF9QV1JFUlJPUiI7IGJyZWFrOworCWNhc2UgRFNQX1dEVE9WRVJGTE9XOiByZXR1cm4gIkRTUF9XRFRPVkVSRkxPVyI7IGJyZWFrOworCWRlZmF1bHQ6IHJldHVybiAidW5rb3duIGV2ZW50IjsgYnJlYWs7CisJfQorfQorCit2b2lkIGJyaWRnZV9kZWhfbm90aWZ5KHN0cnVjdCBkZWhfbWdyICpkZWgsIGludCBldmVudCwgaW50IGluZm8pCit7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2NvbnRleHQ7CisJY29uc3QgY2hhciAqc3RyID0gZXZlbnRfdG9fc3RyaW5nKGV2ZW50KTsKKworCWlmICghZGVoKQorCQlyZXR1cm47CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBkZXZpY2UgZXhjZXB0aW9uIiwgX19mdW5jX18pOworCWRldl9jb250ZXh0ID0gZGVoLT5oYnJpZGdlX2NvbnRleHQ7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBEU1BfU1lTRVJST1I6CisJCWRldl9lcnIoYnJpZGdlLCAiJXM6ICVzLCBpbmZvPTB4JXgiLCBfX2Z1bmNfXywKKwkJCQlzdHIsIGluZm8pOworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9CQUNLVFJBQ0UKKwkJZHVtcF9kbF9tb2R1bGVzKGRldl9jb250ZXh0KTsKKwkJZHVtcF9kc3Bfc3RhY2soZGV2X2NvbnRleHQpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgRFNQX01NVUZBVUxUOgorCQlkZXZfZXJyKGJyaWRnZSwgIiVzOiAlcywgYWRkcj0weCV4IiwgX19mdW5jX18sCisJCQkJc3RyLCBmYXVsdF9hZGRyKTsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCisJCXByaW50X2RzcF90cmFjZV9idWZmZXIoZGV2X2NvbnRleHQpOworCQlkdW1wX2RsX21vZHVsZXMoZGV2X2NvbnRleHQpOworCQltbXVfZmF1bHRfcHJpbnRfc3RhY2soZGV2X2NvbnRleHQpOworI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoYnJpZGdlLCAiJXM6ICVzIiwgX19mdW5jX18sIHN0cik7CisJCWJyZWFrOworCX0KKworCS8qIEZpbHRlciBzdWJzZXF1ZW50IG5vdGlmaWNhdGlvbnMgd2hlbiBhbiBlcnJvciBvY2N1cnMgKi8KKwlpZiAoZGV2X2NvbnRleHQtPmR3X2JyZF9zdGF0ZSAhPSBCUkRfRVJST1IpIHsKKwkJbnRmeV9ub3RpZnkoZGVoLT5udGZ5X29iaiwgZXZlbnQpOworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9SRUNPVkVSWQorCQlicmlkZ2VfcmVjb3Zlcl9zY2hlZHVsZSgpOworI2VuZGlmCisJfQorCisJLyogU2V0IHRoZSBCb2FyZCBzdGF0ZSBhcyBFUlJPUiAqLworCWRldl9jb250ZXh0LT5kd19icmRfc3RhdGUgPSBCUkRfRVJST1I7CisJLyogRGlzYWJsZSBhbGwgdGhlIGNsb2NrcyB0aGF0IHdlcmUgZW5hYmxlZCBieSBEU1AgKi8KKwlkc3BfY2xvY2tfZGlzYWJsZV9hbGwoZGV2X2NvbnRleHQtPmRzcF9wZXJfY2xrcyk7CisJLyoKKwkgKiBBdm9pZCB0aGUgc3Vic2VxdWVudCBXRFQgaWYgaXQgaGFwcGVucyBvbmNlLAorCSAqIGFsc28gaWYgZmF0YWwgZXJyb3Igb2NjdXJzLgorCSAqLworCWRzcF93ZHRfZW5hYmxlKGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3dkdC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyNmY1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3dkdC5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogd2R0LmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogSU8gZGlzcGF0Y2hlciBmb3IgYSBzaGFyZWQgbWVtb3J5IGNoYW5uZWwgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlaC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvX2Nobmxfc20uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvd2R0Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX1dEVDMKKworI2RlZmluZSBPTUFQMzRYWF9XRFQzX0JBU0UgCQkoTDRfUEVSXzM0WFhfQkFTRSArIDB4MzAwMDApCisKK3N0YXRpYyBzdHJ1Y3QgZHNwX3dkdF9zZXR0aW5nIGRzcF93ZHQ7CisKK3ZvaWQgZHNwX3dkdF9kcGModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkZWhfbWdyICpkZWhfbWdyOworCWRldl9nZXRfZGVoX21ncihkZXZfZ2V0X2ZpcnN0KCksICZkZWhfbWdyKTsKKwlpZiAoZGVoX21ncikKKwkJYnJpZGdlX2RlaF9ub3RpZnkoZGVoX21nciwgRFNQX1dEVE9WRVJGTE9XLCAwKTsKK30KKworaXJxcmV0dXJuX3QgZHNwX3dkdF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1MzIgdmFsdWU7CisJLyogYWNrIHdkdDMgaW50ZXJydXB0ICovCisJdmFsdWUgPSBfX3Jhd19yZWFkbChkc3Bfd2R0LnJlZ19iYXNlICsgT01BUDNfV0RUM19JU1JfT0ZGU0VUKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIGRzcF93ZHQucmVnX2Jhc2UgKyBPTUFQM19XRFQzX0lTUl9PRkZTRVQpOworCisJdGFza2xldF9zY2hlZHVsZSgmZHNwX3dkdC53ZHQzX3Rhc2tsZXQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IGRzcF93ZHRfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJZHNwX3dkdC5zbV93ZHQgPSBOVUxMOworCWRzcF93ZHQucmVnX2Jhc2UgPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAzNFhYX1dEVDNfQkFTRSk7CisJdGFza2xldF9pbml0KCZkc3Bfd2R0LndkdDNfdGFza2xldCwgZHNwX3dkdF9kcGMsIDApOworCisJZHNwX3dkdC5mY2xrID0gY2xrX2dldChOVUxMLCAid2R0M19mY2siKTsKKworCWlmIChkc3Bfd2R0LmZjbGspIHsKKwkJZHNwX3dkdC5pY2xrID0gY2xrX2dldChOVUxMLCAid2R0M19pY2siKTsKKwkJaWYgKCFkc3Bfd2R0LmljbGspIHsKKwkJCWNsa19wdXQoZHNwX3dkdC5mY2xrKTsKKwkJCWRzcF93ZHQuZmNsayA9IE5VTEw7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlCisJCXJldCA9IC1FRkFVTFQ7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVxdWVzdF9pcnEoSU5UXzM0WFhfV0RUM19JUlEsIGRzcF93ZHRfaXNyLCAwLAorCQkJCQkJCSJkc3Bfd2R0IiwgJmRzcF93ZHQpOworCisJLyogRGlzYWJsZSBhdCB0aGlzIG1vbWVudCwgaXQgd2lsbCBiZSBlbmFibGVkIHdoZW4gRFNQIHN0YXJ0cyAqLworCWlmICghcmV0KQorCQlkaXNhYmxlX2lycShJTlRfMzRYWF9XRFQzX0lSUSk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGRzcF93ZHRfc21fc2V0KHZvaWQgKmRhdGEpCit7CisJZHNwX3dkdC5zbV93ZHQgPSBkYXRhOworCWRzcF93ZHQuc21fd2R0LT53ZHRfb3ZlcmZsb3cgPSBDT05GSUdfVElEU1BCUklER0VfV0RUX1RJTUVPVVQ7Cit9CisKKwordm9pZCBkc3Bfd2R0X2V4aXQodm9pZCkKK3sKKwlmcmVlX2lycShJTlRfMzRYWF9XRFQzX0lSUSwgJmRzcF93ZHQpOworCXRhc2tsZXRfa2lsbCgmZHNwX3dkdC53ZHQzX3Rhc2tsZXQpOworCisJaWYgKGRzcF93ZHQuZmNsaykKKwkJY2xrX3B1dChkc3Bfd2R0LmZjbGspOworCWlmIChkc3Bfd2R0LmljbGspCisJCWNsa19wdXQoZHNwX3dkdC5pY2xrKTsKKworCWRzcF93ZHQuZmNsayA9IE5VTEw7CisJZHNwX3dkdC5pY2xrID0gTlVMTDsKKwlkc3Bfd2R0LnNtX3dkdCA9IE5VTEw7CisJZHNwX3dkdC5yZWdfYmFzZSA9IE5VTEw7Cit9CisKK3ZvaWQgZHNwX3dkdF9lbmFibGUoYm9vbCBlbmFibGUpCit7CisJdTMyIHRtcDsKKwlzdGF0aWMgYm9vbCB3ZHRfZW5hYmxlOworCisJaWYgKHdkdF9lbmFibGUgPT0gZW5hYmxlIHx8ICFkc3Bfd2R0LmZjbGsgfHwgIWRzcF93ZHQuaWNsaykKKwkJcmV0dXJuOworCisJd2R0X2VuYWJsZSA9IGVuYWJsZTsKKworCWlmIChlbmFibGUpIHsKKwkJY2xrX2VuYWJsZShkc3Bfd2R0LmZjbGspOworCQljbGtfZW5hYmxlKGRzcF93ZHQuaWNsayk7CisJCWRzcF93ZHQuc21fd2R0LT53ZHRfc2V0Y2xvY2tzID0gMTsKKwkJdG1wID0gX19yYXdfcmVhZGwoZHNwX3dkdC5yZWdfYmFzZSArIE9NQVAzX1dEVDNfSVNSX09GRlNFVCk7CisJCV9fcmF3X3dyaXRlbCh0bXAsIGRzcF93ZHQucmVnX2Jhc2UgKyBPTUFQM19XRFQzX0lTUl9PRkZTRVQpOworCQllbmFibGVfaXJxKElOVF8zNFhYX1dEVDNfSVJRKTsKKwl9IGVsc2UgeworCQlkaXNhYmxlX2lycShJTlRfMzRYWF9XRFQzX0lSUSk7CisJCWRzcF93ZHQuc21fd2R0LT53ZHRfc2V0Y2xvY2tzID0gMDsKKwkJY2xrX2Rpc2FibGUoZHNwX3dkdC5pY2xrKTsKKwkJY2xrX2Rpc2FibGUoZHNwX3dkdC5mY2xrKTsKKwl9Cit9CisKKyNlbHNlCit2b2lkIGRzcF93ZHRfZW5hYmxlKGJvb2wgZW5hYmxlKQoreworfQorCit2b2lkIGRzcF93ZHRfc21fc2V0KHZvaWQgKmRhdGEpCit7Cit9CisKK2ludCBkc3Bfd2R0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkc3Bfd2R0X2V4aXQodm9pZCkKK3sKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9jbG9hZC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvY2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVhNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvY2xvYWQuYwpAQCAtMCwwICsxLDE5NTMgQEAKKy8qCisgKiBjbG9hZC5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlICJoZWFkZXIuaCIKKworI2luY2x1ZGUgIm1vZHVsZV9saXN0LmgiCisjZGVmaW5lIExJTktFUl9NT0RVTEVTX0hFQURFUiAoIl8iIE1PRFVMRVNfSEVBREVSKQorCisvKgorICogZm9yd2FyZCByZWZlcmVuY2VzCisgKi8KK3N0YXRpYyB2b2lkIGRsb2FkX3N5bWJvbHMoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpOworc3RhdGljIHZvaWQgZGxvYWRfZGF0YShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcyk7CitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9zZWN0aW9ucyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcyk7CitzdGF0aWMgdm9pZCBzdHJpbmdfdGFibGVfZnJlZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcyk7CitzdGF0aWMgdm9pZCBzeW1ib2xfdGFibGVfZnJlZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcyk7CitzdGF0aWMgdm9pZCBzZWN0aW9uX3RhYmxlX2ZyZWUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpOworc3RhdGljIHZvaWQgaW5pdF9tb2R1bGVfaGFuZGxlKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKTsKKyNpZiBCSVRTX1BFUl9BVSA+IEJJVFNfUEVSX0JZVEUKK3N0YXRpYyBjaGFyICp1bnBhY2tfbmFtZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdTMyIHNvZmZzZXQpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIGNpbml0bmFtZVtdID0geyAiLmNpbml0IiB9Oworc3RhdGljIGNvbnN0IGNoYXIgbG9hZGVyX2RsbHZpZXdfcm9vdFtdID0geyAiP0RMTW9kdWxlcz8iIH07CisKKy8qCisgKiBFcnJvciBzdHJpbmdzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHJlYWRzdHJtW10gPSB7ICJFcnJvciByZWFkaW5nICVzIGZyb20gaW5wdXQgc3RyZWFtIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgZXJyX2FsbG9jW10gPSB7ICJTeW1zLT5kbG9hZF9hbGxvY2F0ZSggJWQgKSBmYWlsZWQiIH07CitzdGF0aWMgY29uc3QgY2hhciB0Z3RhbGxvY1tdID0geworCSJUYXJnZXQgbWVtb3J5IGFsbG9jYXRlIGZhaWxlZCwgc2VjdGlvbiAlcyBzaXplICIgRk1UX1VJMzIgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGluaXRmYWlsW10gPSB7ICIlcyB0byB0YXJnZXQgYWRkcmVzcyAiIEZNVF9VSTMyICIgZmFpbGVkIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgZGx2d3JpdGVbXSA9IHsgIldyaXRlIHRvIERMTHZpZXcgbGlzdCBmYWlsZWQiIH07CitzdGF0aWMgY29uc3QgY2hhciBpY29ubmVjdFtdID0geyAiQ29ubmVjdCBjYWxsIHRvIGluaXQgaW50ZXJmYWNlIGZhaWxlZCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGVycl9jaGVja3N1bVtdID0geyAiQ2hlY2tzdW0gZmFpbGVkIG9uICVzIiB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGRsb2FkX2Vycm9yCisgKgorICogUGFyYW1ldGVyczoKKyAqCWVycnR4dAlkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IsIHByaW50ZiBzdHlsZQorICoJLi4uCQlhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKgorICogRWZmZWN0OgorICoJUmVwb3J0cyBvciByZWNvcmRzIHRoZSBlcnJvciBhcyBhcHByb3ByaWF0ZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZCBkbG9hZF9lcnJvcihzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgY29uc3QgY2hhciAqZXJydHh0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZXJydHh0KTsKKwlkbHRoaXMtPm15c3ltLT5lcnJvcl9yZXBvcnQoZGx0aGlzLT5teXN5bSwgZXJydHh0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJZGx0aGlzLT5kbG9hZF9lcnJjb3VudCArPSAxOworCit9CQkJCS8qIGRsb2FkX2Vycm9yICovCisKKyNkZWZpbmUgRExfRVJST1IoenphLCB6emIpIGRsb2FkX2Vycm9yKGRsdGhpcywgenphLCB6emIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfc3ltc19lcnJvcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgllcnJ0eHQJZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLCBwcmludGYgc3R5bGUKKyAqCS4uLgkJYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICoKKyAqIEVmZmVjdDoKKyAqCVJlcG9ydHMgb3IgcmVjb3JkcyB0aGUgZXJyb3IgYXMgYXBwcm9wcmlhdGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgZGxvYWRfc3ltc19lcnJvcihzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICpzeW1zLCBjb25zdCBjaGFyICplcnJ0eHQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBlcnJ0eHQpOworCXN5bXMtPmVycm9yX3JlcG9ydChzeW1zLCBlcnJ0eHQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkeW5hbWljX2xvYWRfbW9kdWxlCisgKgorICogUGFyYW1ldGVyczoKKyAqCW1vZHVsZQlUaGUgaW5wdXQgc3RyZWFtIHRoYXQgc3VwcGxpZXMgdGhlIG1vZHVsZSBpbWFnZQorICoJc3ltcwlIb3N0LXNpZGUgc3ltYm9sIHRhYmxlIGFuZCBtYWxsb2MvZnJlZSBmdW5jdGlvbnMKKyAqCWFsbG9jCVRhcmdldC1zaWRlIG1lbW9yeSBhbGxvY2F0aW9uCisgKglpbml0CVRhcmdldC1zaWRlIG1lbW9yeSBpbml0aWFsaXphdGlvbgorICoJb3B0aW9ucwlPcHRpb24gZmxhZ3MgRExPQURfKgorICoJbWhhbmRsZQlBIG1vZHVsZSBoYW5kbGUgZm9yIHVzZSB3aXRoIER5bmFtaWNfVW5sb2FkCisgKgorICogRWZmZWN0OgorICoJVGhlIG1vZHVsZSBpbWFnZSBpcyByZWFkIHVzaW5nICptb2R1bGUuICBUYXJnZXQgc3RvcmFnZSBmb3IgdGhlIG5ldworICoJaW1hZ2UgaXMKKyAqIG9idGFpbmVkIGZyb20gKmFsbG9jLiAgU3ltYm9scyBkZWZpbmVkIGFuZCByZWZlcmVuY2VkIGJ5IHRoZSBtb2R1bGUgYXJlCisgKiBtYW5hZ2VkIHVzaW5nICpzeW1zLiAgVGhlIGltYWdlIGlzIHRoZW4gcmVsb2NhdGVkIGFuZCByZWZlcmVuY2VzCisgKglyZXNvbHZlZCBhcyBuZWNlc3NhcnksIGFuZCB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgYml0cyBhcmUgcGxhY2VkCisgKglpbnRvIHRhcmdldCBtZW1vcnkgdXNpbmcgKmluaXQuCisgKgorICogUmV0dXJuczoKKyAqCU9uIGEgc3VjY2Vzc2Z1bCBsb2FkLCBhIG1vZHVsZSBoYW5kbGUgaXMgcGxhY2VkIGluICptaGFuZGxlLAorICoJYW5kIHplcm8gaXMgcmV0dXJuZWQuICBPbiBlcnJvciwgdGhlIG51bWJlciBvZiBlcnJvcnMgZGV0ZWN0ZWQgaXMKKyAqCXJldHVybmVkLiAgSW5kaXZpZHVhbCBlcnJvcnMgYXJlIHJlcG9ydGVkIGR1cmluZyB0aGUgbG9hZCBwcm9jZXNzCisgKgl1c2luZyBzeW1zLT5lcnJvcl9yZXBvcnQoKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitpbnQgZHluYW1pY19sb2FkX21vZHVsZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3RyZWFtICptb2R1bGUsCisJCQlzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICpzeW1zLAorCQkJc3RydWN0IGR5bmFtaWNfbG9hZGVyX2FsbG9jYXRlICphbGxvYywKKwkJCXN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICppbml0LAorCQkJdW5zaWduZWQgb3B0aW9ucywgdm9pZCAqKm1oYW5kbGUpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgKmRwLCBzejsKKwlzdHJ1Y3QgZGxvYWRfc3RhdGUgZGxfc3RhdGU7CS8qIGludGVybmFsIHN0YXRlIGZvciB0aGlzIGNhbGwgKi8KKworCS8qIGJsYXN0IG91ciBpbnRlcm5hbCBzdGF0ZSAqLworCWRwID0gKHVuc2lnbmVkICopJmRsX3N0YXRlOworCWZvciAoc3ogPSBzaXplb2YoZGxfc3RhdGUpIC8gc2l6ZW9mKHVuc2lnbmVkKTsgc3ogPiAwOyBzeiAtPSAxKQorCQkqZHArKyA9IDA7CisKKwkvKiBFbmFibGUgX29ubHlfIEJTUyBpbml0aWFsaXphdGlvbiBpZiBlbmFibGVkIGJ5IHVzZXIgKi8KKwlpZiAoKG9wdGlvbnMgJiBETE9BRF9JTklUQlNTKSA9PSBETE9BRF9JTklUQlNTKQorCQlkbF9zdGF0ZS5teW9wdGlvbnMgPSBETE9BRF9JTklUQlNTOworCisJLyogQ2hlY2sgdGhhdCBtYW5kYXRvcnkgYXJndW1lbnRzIGFyZSBwcmVzZW50ICovCisJaWYgKCFtb2R1bGUgfHwgIXN5bXMpIHsKKwkJZGxvYWRfZXJyb3IoJmRsX3N0YXRlLCAiUmVxdWlyZWQgcGFyYW1ldGVyIGlzIE5VTEwiKTsKKwl9IGVsc2UgeworCQlkbF9zdGF0ZS5zdHJtID0gbW9kdWxlOworCQlkbF9zdGF0ZS5teXN5bSA9IHN5bXM7CisJCWRsb2FkX2hlYWRlcnMoJmRsX3N0YXRlKTsKKwkJaWYgKCFkbF9zdGF0ZS5kbG9hZF9lcnJjb3VudCkKKwkJCWRsb2FkX3N0cmluZ3MoJmRsX3N0YXRlLCBmYWxzZSk7CisJCWlmICghZGxfc3RhdGUuZGxvYWRfZXJyY291bnQpCisJCQlkbG9hZF9zZWN0aW9ucygmZGxfc3RhdGUpOworCisJCWlmIChpbml0ICYmICFkbF9zdGF0ZS5kbG9hZF9lcnJjb3VudCkgeworCQkJaWYgKGluaXQtPmNvbm5lY3QoaW5pdCkpIHsKKwkJCQlkbF9zdGF0ZS5teWlvID0gaW5pdDsKKwkJCQlkbF9zdGF0ZS5teWFsbG9jID0gYWxsb2M7CisJCQkJLyogZG8gbm93LCBiZWZvcmUgcmVkdWNpbmcgc3ltYm9scyAqLworCQkJCWFsbG9jYXRlX3NlY3Rpb25zKCZkbF9zdGF0ZSk7CisJCQl9IGVsc2UKKwkJCQlkbG9hZF9lcnJvcigmZGxfc3RhdGUsIGljb25uZWN0KTsKKwkJfQorCisJCWlmICghZGxfc3RhdGUuZGxvYWRfZXJyY291bnQpIHsKKwkJCS8qIGZpeCB1cCBlbnRyeSBwb2ludCBhZGRyZXNzICovCisJCQl1bnNpZ25lZCBzcmVmID0gZGxfc3RhdGUuZGZpbGVfaGRyLmRmX2VudHJ5X3NlY24gLSAxOworCQkJaWYgKHNyZWYgPCBkbF9zdGF0ZS5hbGxvY2F0ZWRfc2Vjbl9jb3VudCkKKwkJCQlkbF9zdGF0ZS5kZmlsZV9oZHIuZGZfZW50cnlwdCArPQorCQkJCSAgICBkbF9zdGF0ZS5sZHJfc2VjdGlvbnNbc3JlZl0ucnVuX2FkZHI7CisKKwkJCWRsb2FkX3N5bWJvbHMoJmRsX3N0YXRlKTsKKwkJfQorCisJCWlmIChpbml0ICYmICFkbF9zdGF0ZS5kbG9hZF9lcnJjb3VudCkKKwkJCWRsb2FkX2RhdGEoJmRsX3N0YXRlKTsKKworCQlpbml0X21vZHVsZV9oYW5kbGUoJmRsX3N0YXRlKTsKKworCQkvKiBkbF9zdGF0ZS5teWlvIGlzIGluaXQgb3IgMCBhdCB0aGlzIHBvaW50LiAqLworCQlpZiAoZGxfc3RhdGUubXlpbykgeworCQkJaWYgKCghZGxfc3RhdGUuZGxvYWRfZXJyY291bnQpICYmCisJCQkgICAgKGRsX3N0YXRlLmRmaWxlX2hkci5kZl9lbnRyeV9zZWNuICE9IEROX1VOREVGKSAmJgorCQkJICAgICghaW5pdC0+ZXhlY3V0ZShpbml0LAorCQkJCQkgICAgZGxfc3RhdGUuZGZpbGVfaGRyLmRmX2VudHJ5cHQpKSkKKwkJCQlkbG9hZF9lcnJvcigmZGxfc3RhdGUsICJJbml0LT5FeGVjdXRlIEZhaWxlZCIpOworCQkJaW5pdC0+cmVsZWFzZShpbml0KTsKKwkJfQorCisJCXN5bWJvbF90YWJsZV9mcmVlKCZkbF9zdGF0ZSk7CisJCXNlY3Rpb25fdGFibGVfZnJlZSgmZGxfc3RhdGUpOworCQlzdHJpbmdfdGFibGVfZnJlZSgmZGxfc3RhdGUpOworCQlkbG9hZF90cmFtcF9jbGVhbnVwKCZkbF9zdGF0ZSk7CisKKwkJaWYgKGRsX3N0YXRlLmRsb2FkX2VycmNvdW50KSB7CisJCQlkeW5hbWljX3VubG9hZF9tb2R1bGUoZGxfc3RhdGUubXloYW5kbGUsIHN5bXMsIGFsbG9jLAorCQkJCQkgICAgICBpbml0KTsKKwkJCWRsX3N0YXRlLm15aGFuZGxlID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChtaGFuZGxlKQorCQkqbWhhbmRsZSA9IGRsX3N0YXRlLm15aGFuZGxlOwkvKiBnaXZlIGJhY2sgdGhlIGhhbmRsZSAqLworCisJcmV0dXJuIGRsX3N0YXRlLmRsb2FkX2VycmNvdW50OworfQkJCQkvKiBETE9BRF9GaWxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZHluYW1pY19vcGVuX21vZHVsZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgIG1vZHVsZSAgVGhlIGlucHV0IHN0cmVhbSB0aGF0IHN1cHBsaWVzIHRoZSBtb2R1bGUgaW1hZ2UKKyAqICAgICAgc3ltcyAgICBIb3N0LXNpZGUgc3ltYm9sIHRhYmxlIGFuZCBtYWxsb2MvZnJlZSBmdW5jdGlvbnMKKyAqICAgICAgYWxsb2MgICBUYXJnZXQtc2lkZSBtZW1vcnkgYWxsb2NhdGlvbgorICogICAgICBpbml0ICAgIFRhcmdldC1zaWRlIG1lbW9yeSBpbml0aWFsaXphdGlvbgorICogICAgICBvcHRpb25zIE9wdGlvbiBmbGFncyBETE9BRF8qCisgKiAgICAgIG1oYW5kbGUgQSBtb2R1bGUgaGFuZGxlIGZvciB1c2Ugd2l0aCBEeW5hbWljX1VubG9hZAorICoKKyAqIEVmZmVjdDoKKyAqICAgICAgVGhlIG1vZHVsZSBpbWFnZSBpcyByZWFkIHVzaW5nICptb2R1bGUuICBUYXJnZXQgc3RvcmFnZSBmb3IgdGhlIG5ldworICogICAgICBpbWFnZSBpcworICogCW9idGFpbmVkIGZyb20gKmFsbG9jLiAgU3ltYm9scyBkZWZpbmVkIGFuZCByZWZlcmVuY2VkIGJ5IHRoZSBtb2R1bGUgYXJlCisgKiAJbWFuYWdlZCB1c2luZyAqc3ltcy4gIFRoZSBpbWFnZSBpcyB0aGVuIHJlbG9jYXRlZCBhbmQgcmVmZXJlbmNlcworICogICAgICByZXNvbHZlZCBhcyBuZWNlc3NhcnksIGFuZCB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgYml0cyBhcmUgcGxhY2VkCisgKiAgICAgIGludG8gdGFyZ2V0IG1lbW9yeSB1c2luZyAqaW5pdC4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICBPbiBhIHN1Y2Nlc3NmdWwgbG9hZCwgYSBtb2R1bGUgaGFuZGxlIGlzIHBsYWNlZCBpbiAqbWhhbmRsZSwKKyAqICAgICAgYW5kIHplcm8gaXMgcmV0dXJuZWQuICBPbiBlcnJvciwgdGhlIG51bWJlciBvZiBlcnJvcnMgZGV0ZWN0ZWQgaXMKKyAqICAgICAgcmV0dXJuZWQuICBJbmRpdmlkdWFsIGVycm9ycyBhcmUgcmVwb3J0ZWQgZHVyaW5nIHRoZSBsb2FkIHByb2Nlc3MKKyAqICAgICAgdXNpbmcgc3ltcy0+ZXJyb3JfcmVwb3J0KCkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworaW50CitkeW5hbWljX29wZW5fbW9kdWxlKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zdHJlYW0gKm1vZHVsZSwKKwkJICAgIHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0gKnN5bXMsCisJCSAgICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKmFsbG9jLAorCQkgICAgc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKmluaXQsCisJCSAgICB1bnNpZ25lZCBvcHRpb25zLCB2b2lkICoqbWhhbmRsZSkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCAqZHAsIHN6OworCXN0cnVjdCBkbG9hZF9zdGF0ZSBkbF9zdGF0ZTsJLyogaW50ZXJuYWwgc3RhdGUgZm9yIHRoaXMgY2FsbCAqLworCisJLyogYmxhc3Qgb3VyIGludGVybmFsIHN0YXRlICovCisJZHAgPSAodW5zaWduZWQgKikmZGxfc3RhdGU7CisJZm9yIChzeiA9IHNpemVvZihkbF9zdGF0ZSkgLyBzaXplb2YodW5zaWduZWQpOyBzeiA+IDA7IHN6IC09IDEpCisJCSpkcCsrID0gMDsKKworCS8qIEVuYWJsZSBfb25seV8gQlNTIGluaXRpYWxpemF0aW9uIGlmIGVuYWJsZWQgYnkgdXNlciAqLworCWlmICgob3B0aW9ucyAmIERMT0FEX0lOSVRCU1MpID09IERMT0FEX0lOSVRCU1MpCisJCWRsX3N0YXRlLm15b3B0aW9ucyA9IERMT0FEX0lOSVRCU1M7CisKKwkvKiBDaGVjayB0aGF0IG1hbmRhdG9yeSBhcmd1bWVudHMgYXJlIHByZXNlbnQgKi8KKwlpZiAoIW1vZHVsZSB8fCAhc3ltcykgeworCQlkbG9hZF9lcnJvcigmZGxfc3RhdGUsICJSZXF1aXJlZCBwYXJhbWV0ZXIgaXMgTlVMTCIpOworCX0gZWxzZSB7CisJCWRsX3N0YXRlLnN0cm0gPSBtb2R1bGU7CisJCWRsX3N0YXRlLm15c3ltID0gc3ltczsKKwkJZGxvYWRfaGVhZGVycygmZGxfc3RhdGUpOworCQlpZiAoIWRsX3N0YXRlLmRsb2FkX2VycmNvdW50KQorCQkJZGxvYWRfc3RyaW5ncygmZGxfc3RhdGUsIGZhbHNlKTsKKwkJaWYgKCFkbF9zdGF0ZS5kbG9hZF9lcnJjb3VudCkKKwkJCWRsb2FkX3NlY3Rpb25zKCZkbF9zdGF0ZSk7CisKKwkJaWYgKGluaXQgJiYgIWRsX3N0YXRlLmRsb2FkX2VycmNvdW50KSB7CisJCQlpZiAoaW5pdC0+Y29ubmVjdChpbml0KSkgeworCQkJCWRsX3N0YXRlLm15aW8gPSBpbml0OworCQkJCWRsX3N0YXRlLm15YWxsb2MgPSBhbGxvYzsKKwkJCQkvKiBkbyBub3csIGJlZm9yZSByZWR1Y2luZyBzeW1ib2xzICovCisJCQkJYWxsb2NhdGVfc2VjdGlvbnMoJmRsX3N0YXRlKTsKKwkJCX0gZWxzZQorCQkJCWRsb2FkX2Vycm9yKCZkbF9zdGF0ZSwgaWNvbm5lY3QpOworCQl9CisKKwkJaWYgKCFkbF9zdGF0ZS5kbG9hZF9lcnJjb3VudCkgeworCQkJLyogZml4IHVwIGVudHJ5IHBvaW50IGFkZHJlc3MgKi8KKwkJCXVuc2lnbmVkIHNyZWYgPSBkbF9zdGF0ZS5kZmlsZV9oZHIuZGZfZW50cnlfc2VjbiAtIDE7CisJCQlpZiAoc3JlZiA8IGRsX3N0YXRlLmFsbG9jYXRlZF9zZWNuX2NvdW50KQorCQkJCWRsX3N0YXRlLmRmaWxlX2hkci5kZl9lbnRyeXB0ICs9CisJCQkJICAgIGRsX3N0YXRlLmxkcl9zZWN0aW9uc1tzcmVmXS5ydW5fYWRkcjsKKworCQkJZGxvYWRfc3ltYm9scygmZGxfc3RhdGUpOworCQl9CisKKwkJaW5pdF9tb2R1bGVfaGFuZGxlKCZkbF9zdGF0ZSk7CisKKwkJLyogZGxfc3RhdGUubXlpbyBpcyBlaXRoZXIgMCBvciBpbml0IGF0IHRoaXMgcG9pbnQuICovCisJCWlmIChkbF9zdGF0ZS5teWlvKSB7CisJCQlpZiAoKCFkbF9zdGF0ZS5kbG9hZF9lcnJjb3VudCkgJiYKKwkJCSAgICAoZGxfc3RhdGUuZGZpbGVfaGRyLmRmX2VudHJ5X3NlY24gIT0gRE5fVU5ERUYpICYmCisJCQkgICAgKCFpbml0LT5leGVjdXRlKGluaXQsCisJCQkJCSAgICBkbF9zdGF0ZS5kZmlsZV9oZHIuZGZfZW50cnlwdCkpKQorCQkJCWRsb2FkX2Vycm9yKCZkbF9zdGF0ZSwgIkluaXQtPkV4ZWN1dGUgRmFpbGVkIik7CisJCQlpbml0LT5yZWxlYXNlKGluaXQpOworCQl9CisKKwkJc3ltYm9sX3RhYmxlX2ZyZWUoJmRsX3N0YXRlKTsKKwkJc2VjdGlvbl90YWJsZV9mcmVlKCZkbF9zdGF0ZSk7CisJCXN0cmluZ190YWJsZV9mcmVlKCZkbF9zdGF0ZSk7CisKKwkJaWYgKGRsX3N0YXRlLmRsb2FkX2VycmNvdW50KSB7CisJCQlkeW5hbWljX3VubG9hZF9tb2R1bGUoZGxfc3RhdGUubXloYW5kbGUsIHN5bXMsIGFsbG9jLAorCQkJCQkgICAgICBpbml0KTsKKwkJCWRsX3N0YXRlLm15aGFuZGxlID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChtaGFuZGxlKQorCQkqbWhhbmRsZSA9IGRsX3N0YXRlLm15aGFuZGxlOwkvKiBnaXZlIGJhY2sgdGhlIGhhbmRsZSAqLworCisJcmV0dXJuIGRsX3N0YXRlLmRsb2FkX2VycmNvdW50OworfQkJCQkvKiBETE9BRF9GaWxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfaGVhZGVycworICoKKyAqIFBhcmFtZXRlcnM6CisgKglub25lCisgKgorICogRWZmZWN0OgorICoJTG9hZHMgdGhlIERPRkYgaGVhZGVyIGFuZCB2ZXJpZnkgcmVjb3JkLiAgRGVhbHMgd2l0aCBhbnkgYnl0ZS1vcmRlcgorICogaXNzdWVzIGFuZCBjaGVja3MgdGhlbSBmb3IgdmFsaWRpdHkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgQ09NQklORURfSEVBREVSX1NJWkUgKHNpemVvZihzdHJ1Y3QgZG9mZl9maWxlaGRyX3QpKyBcCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgZG9mZl92ZXJpZnlfcmVjX3QpKQorCit2b2lkIGRsb2FkX2hlYWRlcnMoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJdTMyIG1hcDsKKworCS8qIFJlYWQgdGhlIGhlYWRlciBhbmQgdGhlIHZlcmlmeSByZWNvcmQgYXMgb25lLiAgSWYgd2UgZG9uJ3QgZ2V0IGl0CisJICAgYWxsLCB3ZSdyZSBkb25lICovCisJaWYgKGRsdGhpcy0+c3RybS0+cmVhZF9idWZmZXIoZGx0aGlzLT5zdHJtLCAmZGx0aGlzLT5kZmlsZV9oZHIsCisJCQkJICAgICAgQ09NQklORURfSEVBREVSX1NJWkUpICE9CisJICAgIENPTUJJTkVEX0hFQURFUl9TSVpFKSB7CisJCURMX0VSUk9SKHJlYWRzdHJtLCAiRmlsZSBIZWFkZXJzIik7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBmaWxlIGNvcnJlY3QuCisJICogSWYgbm90LCBtdXN0IGZpeCBpdCBiZWZvcmUgd2UgY2FuIGNvbnRpbnVlCisJICovCisJbWFwID0gUkVPUkRFUl9NQVAoZGx0aGlzLT5kZmlsZV9oZHIuZGZfYnl0ZV9yZXNodWZmbGUpOworCWlmIChtYXAgIT0gUkVPUkRFUl9NQVAoQllURV9SRVNIVUZGTEVfVkFMVUUpKSB7CisJCS8qIGlucHV0IGlzIGVpdGhlciBieXRlLXNodWZmbGVkIG9yIGJhZCAqLworCQlpZiAoKG1hcCAmIDB4RkNGQ0ZDRkMpID09IDApIHsJLyogbm8gb2J2aW91c2x5IGJvZ3VzIGJpdHMgKi8KKwkJCWRsb2FkX3Jlb3JkZXIoJmRsdGhpcy0+ZGZpbGVfaGRyLCBDT01CSU5FRF9IRUFERVJfU0laRSwKKwkJCQkgICAgICBtYXApOworCQl9CisJCWlmIChkbHRoaXMtPmRmaWxlX2hkci5kZl9ieXRlX3Jlc2h1ZmZsZSAhPQorCQkgICAgQllURV9SRVNIVUZGTEVfVkFMVUUpIHsKKwkJCS8qIGRpZG4ndCBmaXggdGhlIHByb2JsZW0sIHRoZSBieXRlIHN3YXAgbWFwIGlzIGJhZCAqLworCQkJZGxvYWRfZXJyb3IoZGx0aGlzLAorCQkJCSAgICAiQmFkIGJ5dGUgc3dhcCBtYXAgIiBGTVRfVUkzMiAiIGluIGhlYWRlciIsCisJCQkJICAgIGRsdGhpcy0+ZGZpbGVfaGRyLmRmX2J5dGVfcmVzaHVmZmxlKTsKKwkJCXJldHVybjsKKwkJfQorCQlkbHRoaXMtPnJlb3JkZXJfbWFwID0gbWFwOwkvKiBrZWVwIG1hcCBmb3IgZnV0dXJlIHVzZSAqLworCX0KKworCS8qCisJICogVmVyaWZ5IGNoZWNrc3VtIG9mIGhlYWRlciBhbmQgdmVyaWZ5IHJlY29yZAorCSAqLworCWlmICh+ZGxvYWRfY2hlY2tzdW0oJmRsdGhpcy0+ZGZpbGVfaGRyLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgZG9mZl9maWxlaGRyX3QpKSB8fAorCSAgICB+ZGxvYWRfY2hlY2tzdW0oJmRsdGhpcy0+dmVyaWZ5LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgZG9mZl92ZXJpZnlfcmVjX3QpKSkgeworCQlETF9FUlJPUihlcnJfY2hlY2tzdW0sICJoZWFkZXIgb3IgdmVyaWZ5IHJlY29yZCIpOworCQlyZXR1cm47CisJfQorI2lmIEhPU1RfRU5ESUFOTkVTUworCWRsdGhpcy0+ZGZpbGVfaGRyLmRmX2J5dGVfcmVzaHVmZmxlID0gbWFwOwkvKiBwdXQgYmFjayBmb3IgbGF0ZXIgKi8KKyNlbmRpZgorCisJLyogQ2hlY2sgZm9yIHZhbGlkIHRhcmdldCBJRCAqLworCWlmICgoZGx0aGlzLT5kZmlsZV9oZHIuZGZfdGFyZ2V0X2lkICE9IFRBUkdFVF9JRCkgJiYKKwkgICAgLShkbHRoaXMtPmRmaWxlX2hkci5kZl90YXJnZXRfaWQgIT0gVE1TNDcwX0lEKSkgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsICJCYWQgdGFyZ2V0IElEIDB4JXggYW5kIFRBUkdFVF9JRCAweCV4IiwKKwkJCSAgICBkbHRoaXMtPmRmaWxlX2hkci5kZl90YXJnZXRfaWQsIFRBUkdFVF9JRCk7CisJCXJldHVybjsKKwl9CisJLyogQ2hlY2sgZm9yIHZhbGlkIGZpbGUgZm9ybWF0ICovCisJaWYgKChkbHRoaXMtPmRmaWxlX2hkci5kZl9kb2ZmX3ZlcnNpb24gIT0gRE9GRjApKSB7CisJCWRsb2FkX2Vycm9yKGRsdGhpcywgIkJhZCBET0ZGIHZlcnNpb24gMHgleCIsCisJCQkgICAgZGx0aGlzLT5kZmlsZV9oZHIuZGZfZG9mZl92ZXJzaW9uKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQXBwbHkgcmVhc29uYWJsZW5lc3MgY2hlY2tzIHRvIGNvdW50IGZpZWxkcworCSAqLworCWlmIChkbHRoaXMtPmRmaWxlX2hkci5kZl9zdHJ0YWJfc2l6ZSA+IE1BWF9SRUFTT05BQkxFX1NUUklOR1RBQikgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsICJFeGNlc3NpdmUgc3RyaW5nIHRhYmxlIHNpemUgIiBGTVRfVUkzMiwKKwkJCSAgICBkbHRoaXMtPmRmaWxlX2hkci5kZl9zdHJ0YWJfc2l6ZSk7CisJCXJldHVybjsKKwl9CisJaWYgKGRsdGhpcy0+ZGZpbGVfaGRyLmRmX25vX3NjbnMgPiBNQVhfUkVBU09OQUJMRV9TRUNUSU9OUykgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsICJFeGNlc3NpdmUgc2VjdGlvbiBjb3VudCAweCV4IiwKKwkJCSAgICBkbHRoaXMtPmRmaWxlX2hkci5kZl9ub19zY25zKTsKKwkJcmV0dXJuOworCX0KKyNpZm5kZWYgVEFSR0VUX0VORElBTk5FU1MKKwkvKgorCSAqIENoZWNrIHRoYXQgZW5kaWFubmVzcyBkb2VzIG5vdCBkaXNhZ3JlZSB3aXRoIGV4cGxpY2l0IHNwZWNpZmljYXRpb24KKwkgKi8KKwlpZiAoKGRsdGhpcy0+ZGZpbGVfaGRyLmRmX2ZsYWdzID4+IEFMSUdOX0NPRkZfRU5ESUFOTkVTUykgJgorCSAgICBkbHRoaXMtPm15b3B0aW9ucyAmIEVORElBTk5FU1NfTUFTSykgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsCisJCQkgICAgIklucHV0IGVuZGlhbm5lc3MgZGlzYWdyZWVzIHdpdGggc3BlY2lmaWVkIG9wdGlvbiIpOworCQlyZXR1cm47CisJfQorCWRsdGhpcy0+YmlnX2VfdGFyZ2V0ID0gZGx0aGlzLT5kZmlsZV9oZHIuZGZfZmxhZ3MgJiBERl9CSUc7CisjZW5kaWYKKworfQkJCQkvKiBkbG9hZF9oZWFkZXJzICovCisKKy8qCUNPRkYgU2VjdGlvbiBQcm9jZXNzaW5nCisgKgorICoJQ09GRiBzZWN0aW9ucyBhcmUgcmVhZCBpbiBhbmQgcmV0YWluZWQgaW50YWN0LiAgRWFjaCByZWNvcmQgaXMgZW1iZWRkZWQKKyAqIAlpbiBhIG5ldyBzdHJ1Y3R1cmUgdGhhdCByZWNvcmRzIHRoZSB1cGRhdGVkIGxvYWQgYW5kCisgKiAJcnVuIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbiAqLworCitzdGF0aWMgY29uc3QgY2hhciBzZWNuX2VycmlkW10gPSB7ICJzZWN0aW9uIiB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGRsb2FkX3NlY3Rpb25zCisgKgorICogUGFyYW1ldGVyczoKKyAqCW5vbmUKKyAqCisgKiBFZmZlY3Q6CisgKglMb2FkcyB0aGUgc2VjdGlvbiByZWNvcmRzIGludG8gYW4gaW50ZXJuYWwgdGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgZGxvYWRfc2VjdGlvbnMoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJczE2IHNpejsKKwlzdHJ1Y3QgZG9mZl9zY25oZHJfdCAqc2hwOworCXVuc2lnbmVkIG5zZWNzID0gZGx0aGlzLT5kZmlsZV9oZHIuZGZfbm9fc2NuczsKKworCS8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgRE9GRiBzZWN0aW9uIHJlY29yZHMgKi8KKwlzaXogPSBuc2VjcyAqIHNpemVvZihzdHJ1Y3QgZG9mZl9zY25oZHJfdCk7CisJc2hwID0KKwkgICAgKHN0cnVjdCBkb2ZmX3Njbmhkcl90ICopZGx0aGlzLT5teXN5bS0+ZGxvYWRfYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJCQkJICBzaXopOworCWlmICghc2hwKSB7CQkvKiBub3QgZW5vdWdoIHN0b3JhZ2UgKi8KKwkJRExfRVJST1IoZXJyX2FsbG9jLCBzaXopOworCQlyZXR1cm47CisJfQorCWRsdGhpcy0+c2VjdF9oZHJzID0gc2hwOworCisJLyogcmVhZCBpbiB0aGUgc2VjdGlvbiByZWNvcmRzICovCisJaWYgKGRsdGhpcy0+c3RybS0+cmVhZF9idWZmZXIoZGx0aGlzLT5zdHJtLCBzaHAsIHNpeikgIT0gc2l6KSB7CisJCURMX0VSUk9SKHJlYWRzdHJtLCBzZWNuX2VycmlkKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIHdlIG5lZWQgdG8gZml4IHVwIGJ5dGUgb3JkZXIsIGRvIGl0IG5vdyAqLworCWlmIChkbHRoaXMtPnJlb3JkZXJfbWFwKQorCQlkbG9hZF9yZW9yZGVyKHNocCwgc2l6LCBkbHRoaXMtPnJlb3JkZXJfbWFwKTsKKworCS8qIGNoZWNrIGZvciB2YWxpZGl0eSAqLworCWlmICh+ZGxvYWRfY2hlY2tzdW0oZGx0aGlzLT5zZWN0X2hkcnMsIHNpeikgIT0KKwkgICAgZGx0aGlzLT52ZXJpZnkuZHZfc2NuX3JlY19jaGVja3N1bSkgeworCQlETF9FUlJPUihlcnJfY2hlY2tzdW0sIHNlY25fZXJyaWQpOworCQlyZXR1cm47CisJfQorCit9CQkJCS8qIGRsb2FkX3NlY3Rpb25zICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGFsbG9jYXRlX3NlY3Rpb25zCisgKgorICogUGFyYW1ldGVyczoKKyAqCWFsbG9jCXRhcmdldCBtZW1vcnkgYWxsb2NhdG9yIGNsYXNzCisgKgorICogRWZmZWN0OgorICoJQXNzaWducyBuZXcgKHRhcmdldCkgYWRkcmVzc2VzIGZvciBzZWN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkIGFsbG9jYXRlX3NlY3Rpb25zKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKQoreworCXUxNiBjdXJyX3NlY3QsIG5zZWNzLCBzaXo7CisJc3RydWN0IGRvZmZfc2NuaGRyX3QgKnNocDsKKwlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqYXNlY3M7CisJc3RydWN0IG15X2hhbmRsZSAqaG5kbDsKKwluc2VjcyA9IGRsdGhpcy0+ZGZpbGVfaGRyLmRmX25vX3NjbnM7CisJaWYgKCFuc2VjcykKKwkJcmV0dXJuOworCWlmICgoZGx0aGlzLT5teWFsbG9jID09IE5VTEwpICYmCisJICAgIChkbHRoaXMtPmRmaWxlX2hkci5kZl90YXJnZXRfc2NucyA+IDApKSB7CisJCURMX0VSUk9SKCJBcmcgMyAoYWxsb2MpIHJlcXVpcmVkIGJ1dCBOVUxMIiwgMCk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG1vZHVsZSBoYW5kbGUsIHdoaWNoIHdlIHdpbGwga2VlcCBmb3IgdW5sb2FkCisJICogcHVycG9zZXMgaW5jbHVkZSBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gc3RvcmUgZm9yIGFuIGF1dG8tZ2VuZXJhdGVkCisJICogdHJhbXBvbGluZSBzZWN0aW9uIGluIGNhc2Ugd2UgbmVlZCBpdC4KKwkgKi8KKwlzaXogPSAoZGx0aGlzLT5kZmlsZV9oZHIuZGZfdGFyZ2V0X3NjbnMgKyAxKSAqCisJICAgIHNpemVvZihzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbykgKyBNWV9IQU5ETEVfU0laRTsKKworCWhuZGwgPQorCSAgICAoc3RydWN0IG15X2hhbmRsZSAqKWRsdGhpcy0+bXlzeW0tPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQkJICAgICAgc2l6KTsKKwlpZiAoIWhuZGwpIHsJCS8qIG5vdCBlbm91Z2ggc3RvcmFnZSAqLworCQlETF9FUlJPUihlcnJfYWxsb2MsIHNpeik7CisJCXJldHVybjsKKwl9CisJLyogaW5pdGlhbGl6ZSB0aGUgaGFuZGxlIGhlYWRlciAqLworCWhuZGwtPmRtLmhuZXh0ID0gaG5kbC0+ZG0uaHByZXYgPSBobmRsOwkvKiBjaXJjdWxhciBsaXN0ICovCisJaG5kbC0+ZG0uaHJvb3QgPSBOVUxMOworCWhuZGwtPmRtLmRidGhpcyA9IDA7CisJZGx0aGlzLT5teWhhbmRsZSA9IGhuZGw7CS8qIHNhdmUgYXdheSBmb3IgcmV0dXJuICovCisJLyogcG9pbnRlciB0byB0aGUgc2VjdGlvbiBsaXN0IG9mIGFsbG9jYXRlZCBzZWN0aW9ucyAqLworCWRsdGhpcy0+bGRyX3NlY3Rpb25zID0gYXNlY3MgPSBobmRsLT5zZWNuczsKKwkvKiAqIEluc2VydCBuYW1lcyBpbnRvIGFsbCBzZWN0aW9ucywgbWFrZSBjb3BpZXMgb2YKKwkgICB0aGUgc2VjdGlvbnMgd2UgYWxsb2NhdGUgKi8KKwlzaHAgPSBkbHRoaXMtPnNlY3RfaGRyczsKKwlmb3IgKGN1cnJfc2VjdCA9IDA7IGN1cnJfc2VjdCA8IG5zZWNzOyBjdXJyX3NlY3QrKykgeworCQl1MzIgc29mZnNldCA9IHNocC0+ZHNfb2Zmc2V0OworI2lmIEJJVFNfUEVSX0FVIDw9IEJJVFNfUEVSX0JZVEUKKwkJLyogYXR0ZW1wdCB0byBpbnNlcnQgdGhlIG5hbWUgb2YgdGhpcyBzZWN0aW9uICovCisJCWlmIChzb2Zmc2V0IDwgZGx0aGlzLT5kZmlsZV9oZHIuZGZfc3RydGFiX3NpemUpCisJCQkoKHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICopc2hwKS0+bmFtZSA9CisJCQkJZGx0aGlzLT5zdHJfaGVhZCArIHNvZmZzZXQ7CisJCWVsc2UgeworCQkJZGxvYWRfZXJyb3IoZGx0aGlzLCAiQmFkIG5hbWUgb2Zmc2V0IGluIHNlY3Rpb24gJWQiLAorCQkJCSAgICBjdXJyX3NlY3QpOworCQkJKChzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqKXNocCktPm5hbWUgPSBOVUxMOworCQl9CisjZW5kaWYKKwkJLyogYWxsb2NhdGUgdGFyZ2V0IHN0b3JhZ2UgZm9yIHNlY3Rpb25zIHRoYXQgcmVxdWlyZSBpdCAqLworCQlpZiAoZHNfbmVlZHNfYWxsb2NhdGlvbihzaHApKSB7CisJCQkqYXNlY3MgPSAqKHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICopc2hwOworCQkJYXNlY3MtPmNvbnRleHQgPSAwOwkvKiB6ZXJvIHRoZSBjb250ZXh0IGZpZWxkICovCisjaWYgQklUU19QRVJfQVUgPiBCSVRTX1BFUl9CWVRFCisJCQlhc2Vjcy0+bmFtZSA9IHVucGFja19uYW1lKGRsdGhpcywgc29mZnNldCk7CisJCQlkbHRoaXMtPmRlYnVnX3N0cmluZ19zaXplID0gc29mZnNldCArIGRsdGhpcy0+dGVtcF9sZW47CisjZWxzZQorCQkJZGx0aGlzLT5kZWJ1Z19zdHJpbmdfc2l6ZSA9IHNvZmZzZXQ7CisjZW5kaWYKKwkJCWlmIChkbHRoaXMtPm15YWxsb2MgIT0gTlVMTCkgeworCQkJCWlmICghZGx0aGlzLT5teWFsbG9jLT4KKwkJCQkgICAgZGxvYWRfYWxsb2NhdGUoZGx0aGlzLT5teWFsbG9jLCBhc2VjcywKKwkJCQkJCSAgIGRzX2FsaWdubWVudChhc2Vjcy0+dHlwZSkpKSB7CisJCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywgdGd0YWxsb2MsCisJCQkJCQkgICAgYXNlY3MtPm5hbWUsIGFzZWNzLT5zaXplKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCS8qIGtlZXAgYWRkcmVzcyBkZWx0YXMgaW4gb3JpZ2luYWwgc2VjdGlvbiB0YWJsZSAqLworCQkJc2hwLT5kc192YWRkciA9IGFzZWNzLT5sb2FkX2FkZHIgLSBzaHAtPmRzX3ZhZGRyOworCQkJc2hwLT5kc19wYWRkciA9IGFzZWNzLT5ydW5fYWRkciAtIHNocC0+ZHNfcGFkZHI7CisJCQlkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50ICs9IDE7CisJCX0JCS8qIGFsbG9jYXRlIHRhcmdldCBzdG9yYWdlICovCisJCXNocCArPSAxOworCQlhc2VjcyArPSAxOworCX0KKyNpZiBCSVRTX1BFUl9BVSA8PSBCSVRTX1BFUl9CWVRFCisJZGx0aGlzLT5kZWJ1Z19zdHJpbmdfc2l6ZSArPQorCSAgICBzdHJsZW4oZGx0aGlzLT5zdHJfaGVhZCArIGRsdGhpcy0+ZGVidWdfc3RyaW5nX3NpemUpICsgMTsKKyNlbmRpZgorfQkJCQkvKiBhbGxvY2F0ZSBzZWN0aW9ucyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIHNlY3Rpb25fdGFibGVfZnJlZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKglub25lCisgKgorICogRWZmZWN0OgorICoJRnJlZXMgYW55IHN0YXRlIHVzZWQgYnkgdGhlIHN5bWJvbCB0YWJsZS4KKyAqCisgKiBXQVJOSU5HOgorICoJVGhpcyByb3V0aW5lIGlzIG5vdCBhbGxvd2VkIHRvIGRlY2xhcmUgZXJyb3JzIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgdm9pZCBzZWN0aW9uX3RhYmxlX2ZyZWUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJc3RydWN0IGRvZmZfc2NuaGRyX3QgKnNocDsKKworCXNocCA9IGRsdGhpcy0+c2VjdF9oZHJzOworCWlmIChzaHApCisJCWRsdGhpcy0+bXlzeW0tPmRsb2FkX2RlYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwgc2hwKTsKKworfQkJCQkvKiBzZWN0aW9uX3RhYmxlX2ZyZWUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkbG9hZF9zdHJpbmdzCisgKgorICogUGFyYW1ldGVyczoKKyAqICBzZWNfbmFtZXNfb25seSAgIElmIHRydWUgb25seSByZWFkIGluIHRoZSAic2VjdGlvbiBuYW1lcyIKKyAqCQkgICAgIHBvcnRpb24gb2YgdGhlIHN0cmluZyB0YWJsZQorICoKKyAqIEVmZmVjdDoKKyAqCUxvYWRzIHRoZSBET0ZGIHN0cmluZyB0YWJsZSBpbnRvIG1lbW9yeS4gRE9GRiBrZWVwcyBhbGwgc3RyaW5ncyBpbiBhCisgKiBiaWcgdW5zb3J0ZWQgYXJyYXkuICBXZSBqdXN0IHJlYWQgdGhhdCBhcnJheSBpbnRvIG1lbW9yeSBpbiBidWxrLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgY29uc3QgY2hhciBzdHJpbmd0YmxbXSA9IHsgInN0cmluZyB0YWJsZSIgfTsKKwordm9pZCBkbG9hZF9zdHJpbmdzKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLCBib29sIHNlY19uYW1lc19vbmx5KQoreworCXUzMiBzc2l6OworCWNoYXIgKnN0cmJ1ZjsKKworCWlmIChzZWNfbmFtZXNfb25seSkgeworCQlzc2l6ID0gQllURV9UT19IT1NUKERPRkZfQUxJR04KKwkJCQkgICAgKGRsdGhpcy0+ZGZpbGVfaGRyLmRmX3Njbl9uYW1lX3NpemUpKTsKKwl9IGVsc2UgeworCQlzc2l6ID0gQllURV9UT19IT1NUKERPRkZfQUxJR04KKwkJCQkgICAgKGRsdGhpcy0+ZGZpbGVfaGRyLmRmX3N0cnRhYl9zaXplKSk7CisJfQorCWlmIChzc2l6ID09IDApCisJCXJldHVybjsKKworCS8qIGdldCBzb21lIG1lbW9yeSBmb3IgdGhlIHN0cmluZyB0YWJsZSAqLworI2lmIEJJVFNfUEVSX0FVID4gQklUU19QRVJfQllURQorCXN0cmJ1ZiA9IChjaGFyICopZGx0aGlzLT5teXN5bS0+ZGxvYWRfYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwgc3NpeiArCisJCQkJCQkgICAgICAgZGx0aGlzLT5kZmlsZV9oZHIuCisJCQkJCQkgICAgICAgZGZfbWF4X3N0cl9sZW4pOworI2Vsc2UKKwlzdHJidWYgPSAoY2hhciAqKWRsdGhpcy0+bXlzeW0tPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlzeW0sIHNzaXopOworI2VuZGlmCisJaWYgKHN0cmJ1ZiA9PSBOVUxMKSB7CisJCURMX0VSUk9SKGVycl9hbGxvYywgc3Npeik7CisJCXJldHVybjsKKwl9CisJZGx0aGlzLT5zdHJfaGVhZCA9IHN0cmJ1ZjsKKyNpZiBCSVRTX1BFUl9BVSA+IEJJVFNfUEVSX0JZVEUKKwlkbHRoaXMtPnN0cl90ZW1wID0gc3RyYnVmICsgc3NpejsKKyNlbmRpZgorCS8qIHJlYWQgaW4gdGhlIHN0cmluZ3MgYW5kIHZlcmlmeSB0aGVtICovCisJaWYgKCh1bnNpZ25lZCkoZGx0aGlzLT5zdHJtLT5yZWFkX2J1ZmZlcihkbHRoaXMtPnN0cm0sIHN0cmJ1ZiwKKwkJCQkJCSBzc2l6KSkgIT0gc3NpeikgeworCQlETF9FUlJPUihyZWFkc3RybSwgc3RyaW5ndGJsKTsKKwl9CisJLyogaWYgd2UgbmVlZCB0byBmaXggdXAgYnl0ZSBvcmRlciwgZG8gaXQgbm93ICovCisjaWZuZGVmIF9CSUdfRU5ESUFOCisJaWYgKGRsdGhpcy0+cmVvcmRlcl9tYXApCisJCWRsb2FkX3Jlb3JkZXIoc3RyYnVmLCBzc2l6LCBkbHRoaXMtPnJlb3JkZXJfbWFwKTsKKworCWlmICgoIXNlY19uYW1lc19vbmx5KSAmJiAofmRsb2FkX2NoZWNrc3VtKHN0cmJ1Ziwgc3NpeikgIT0KKwkJCQkgIGRsdGhpcy0+dmVyaWZ5LmR2X3N0cl90YWJfY2hlY2tzdW0pKSB7CisJCURMX0VSUk9SKGVycl9jaGVja3N1bSwgc3RyaW5ndGJsKTsKKwl9CisjZWxzZQorCWlmIChkbHRoaXMtPmRmaWxlX2hkci5kZl9ieXRlX3Jlc2h1ZmZsZSAhPQorCSAgICBIT1NUX0JZVEVfT1JERVIoUkVPUkRFUl9NQVAoQllURV9SRVNIVUZGTEVfVkFMVUUpKSkgeworCQkvKiBwdXQgc3RyaW5ncyBpbiBiaWctZW5kaWFuIG9yZGVyLCBub3QgaW4gUEMgb3JkZXIgKi8KKwkJZGxvYWRfcmVvcmRlcihzdHJidWYsIHNzaXosCisJCQkgICAgICBIT1NUX0JZVEVfT1JERVIoZGx0aGlzLT4KKwkJCQkJICAgICAgZGZpbGVfaGRyLmRmX2J5dGVfcmVzaHVmZmxlKSk7CisJfQorCWlmICgoIXNlY19uYW1lc19vbmx5KSAmJiAofmRsb2FkX3JldmVyc2VfY2hlY2tzdW0oc3RyYnVmLCBzc2l6KSAhPQorCQkJCSAgZGx0aGlzLT52ZXJpZnkuZHZfc3RyX3RhYl9jaGVja3N1bSkpIHsKKwkJRExfRVJST1IoZXJyX2NoZWNrc3VtLCBzdHJpbmd0YmwpOworCX0KKyNlbmRpZgorfQkJCQkvKiBkbG9hZF9zdHJpbmdzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgc3RyaW5nX3RhYmxlX2ZyZWUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJbm9uZQorICoKKyAqIEVmZmVjdDoKKyAqCUZyZWVzIGFueSBzdGF0ZSB1c2VkIGJ5IHRoZSBzdHJpbmcgdGFibGUuCisgKgorICogV0FSTklORzoKKyAqCVRoaXMgcm91dGluZSBpcyBub3QgYWxsb3dlZCB0byBkZWNsYXJlIGVycm9ycyEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkIHN0cmluZ190YWJsZV9mcmVlKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKQoreworCWlmIChkbHRoaXMtPnN0cl9oZWFkKQorCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQlkbHRoaXMtPnN0cl9oZWFkKTsKKworfQkJCQkvKiBzdHJpbmdfdGFibGVfZnJlZSAqLworCisvKgorICogU3ltYm9sIFRhYmxlIE1haW50ZW5hbmNlIEZ1bmN0aW9ucworICoKKyAqIENPRkYgc3ltYm9scyBhcmUgcmVhZCBieSBkbG9hZF9zeW1ib2xzKCksIHdoaWNoIGlzIGNhbGxlZCBhZnRlcgorICogc2VjdGlvbnMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4gIFN5bWJvbHMgd2hpY2ggbWlnaHQgYmUgdXNlZCBpbgorICogcmVsb2NhdGlvbiAoaWUsIG5vdCBkZWJ1ZyBpbmZvKSBhcmUgcmV0YWluZWQgaW4gYW4gaW50ZXJuYWwgdGVtcG9yYXJ5CisgKiBjb21wcmVzc2VkIHRhYmxlICh0eXBlIGxvY2FsX3N5bWJvbCkuIEEgcGFydGljdWxhciBzeW1ib2wgaXMgcmVjb3ZlcmVkCisgKiBieSBpbmRleCBieSBjYWxsaW5nIGRsb2FkX2ZpbmRfc3ltYm9sKCkuICBkbG9hZF9maW5kX3N5bWJvbAorICogcmVjb25zdHJ1Y3RzIGEgbW9yZSBleHBsaWNpdCByZXByZXNlbnRhdGlvbiAodHlwZSBTTE9UVkVDKSB3aGljaCBpcworICogdXNlZCBieSByZWxvYy5jCisgKi8KKy8qIHJlYWwgc2l6ZSBvZiBkZWJ1ZyBoZWFkZXIgKi8KKyNkZWZpbmUgREJHX0hEUl9TSVpFIChzaXplb2Yoc3RydWN0IGRsbF9tb2R1bGUpIC0gc2l6ZW9mKHN0cnVjdCBkbGxfc2VjdCkpCisKK3N0YXRpYyBjb25zdCBjaGFyIHN5bV9lcnJpZFtdID0geyAic3ltYm9sIiB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkbG9hZF9zeW1ib2xzCisgKgorICogUGFyYW1ldGVyczoKKyAqCW5vbmUKKyAqCisgKiBFZmZlY3Q6CisgKglSZWFkcyBpbiBzeW1ib2xzIGFuZCByZXRhaW5zIG9uZXMgdGhhdCBtaWdodCBiZSBuZWVkZWQgZm9yIHJlbG9jYXRpb24KKyAqIHB1cnBvc2VzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBzaXplIG9mIHN5bWJvbCBidWZmZXIgbm8gYmlnZ2VyIHRoYW4gdGFyZ2V0IGRhdGEgYnVmZmVyLCB0byBsaW1pdCBzdGFjaworICogdXNhZ2UgKi8KKyNkZWZpbmUgTVlfU1lNX0JVRl9TSVogKEJZVEVfVE9fSE9TVChJTUFHRV9QQUNLRVRfU0laRSkvXAorCQkJc2l6ZW9mKHN0cnVjdCBkb2ZmX3N5bWVudF90KSkKKworc3RhdGljIHZvaWQgZGxvYWRfc3ltYm9scyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcykKK3sKKwl1MzIgc3ltX2NvdW50LCBzaXosIGRzaXosIHN5bWJvbHNfbGVmdDsKKwl1MzIgY2hlY2tzOworCXN0cnVjdCBsb2NhbF9zeW1ib2wgKnNwOworCXN0cnVjdCBkeW5sb2FkX3N5bWJvbCAqc3ltcDsKKwlzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKm5ld3N5bTsKKworCXN5bV9jb3VudCA9IGRsdGhpcy0+ZGZpbGVfaGRyLmRmX25vX3N5bXM7CisJaWYgKHN5bV9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGtlZXAgYSBsb2NhbCBzeW1ib2wgdGFibGUgZm9yIGFsbCBvZiB0aGUgc3ltYm9scyBpbiB0aGUgaW5wdXQuCisJICogVGhpcyB0YWJsZSBjb250YWlucyBvbmx5IHNlY3Rpb24gJiB2YWx1ZSBpbmZvLCBhcyB3ZSBkbyBub3QgaGF2ZQorCSAqIHRvIGRvIGFueSBuYW1lIHByb2Nlc3NpbmcgZm9yIGxvY2Fscy4gIFdlIHJldXNlIHRoaXMgc3RvcmFnZQorCSAqIGFzIGEgdGVtcG9yYXJ5IGZvciAuZGxsdmlldyByZWNvcmQgY29uc3RydWN0aW9uLgorCSAqIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSB3aG9sZSB0YWJsZS4gIEFkZCAxIHRvIHRoZSBzZWN0aW9uIGNvdW50CisJICogaW4gY2FzZSBhIHRyYW1wb2xpbmUgc2VjdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBhcyB3ZWxsIGFzIHRoZQorCSAqIHNpemUgb2YgdGhlIHRyYW1wb2xpbmUgc2VjdGlvbiBuYW1lIHNvIERMTFZpZXcgZG9lbnMndCBnZXQgbG9zdC4KKwkgKi8KKworCXNpeiA9IHN5bV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgbG9jYWxfc3ltYm9sKTsKKwlkc2l6ID0gREJHX0hEUl9TSVpFICsKKwkgICAgKHNpemVvZihzdHJ1Y3QgZGxsX3NlY3QpICogZGx0aGlzLT5hbGxvY2F0ZWRfc2Vjbl9jb3VudCkgKworCSAgICBCWVRFX1RPX0hPU1RfUk9VTkQoZGx0aGlzLT5kZWJ1Z19zdHJpbmdfc2l6ZSArIDEpOworCWlmIChkc2l6ID4gc2l6KQorCQlzaXogPSBkc2l6OwkvKiBsYXJnZXIgb2Ygc3ltYm9scyBhbmQgLmRsbHZpZXcgdGVtcCAqLworCXNwID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKilkbHRoaXMtPm15c3ltLT5kbG9hZF9hbGxvY2F0ZShkbHRoaXMtPm15c3ltLAorCQkJCQkJCQkgIHNpeik7CisJaWYgKCFzcCkgeworCQlETF9FUlJPUihlcnJfYWxsb2MsIHNpeik7CisJCXJldHVybjsKKwl9CisJZGx0aGlzLT5sb2NhbF9zeW10YWIgPSBzcDsKKwkvKiBSZWFkIHRoZSBzeW1ib2xzIGluIHRoZSBpbnB1dCwgc3RvcmUgdGhlbSBpbiB0aGUgdGFibGUsIGFuZCBwb3N0IGFueQorCSAqIGdsb2JhbHMgdG8gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUuICBJbiB0aGUgcHJvY2VzcywgZXh0ZXJuYWxzCisJIGJlY29tZSBkZWZpbmVkIGZyb20gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgKi8KKwljaGVja3MgPSBkbHRoaXMtPnZlcmlmeS5kdl9zeW1fdGFiX2NoZWNrc3VtOworCXN5bWJvbHNfbGVmdCA9IHN5bV9jb3VudDsKKwlkbyB7CQkJLyogcmVhZCBhbGwgc3ltYm9scyAqLworCQljaGFyICpzbmFtZTsKKwkJdTMyIHZhbDsKKwkJczMyIGRlbHRhOworCQlzdHJ1Y3QgZG9mZl9zeW1lbnRfdCAqaW5wdXRfc3ltOworCQl1bnNpZ25lZCBzeW1zX2luX2J1ZjsKKwkJc3RydWN0IGRvZmZfc3ltZW50X3QgbXlfc3ltX2J1ZltNWV9TWU1fQlVGX1NJWl07CisJCWlucHV0X3N5bSA9IG15X3N5bV9idWY7CisJCXN5bXNfaW5fYnVmID0gc3ltYm9sc19sZWZ0ID4gTVlfU1lNX0JVRl9TSVogPworCQkgICAgTVlfU1lNX0JVRl9TSVogOiBzeW1ib2xzX2xlZnQ7CisJCXNpeiA9IHN5bXNfaW5fYnVmICogc2l6ZW9mKHN0cnVjdCBkb2ZmX3N5bWVudF90KTsKKwkJaWYgKGRsdGhpcy0+c3RybS0+cmVhZF9idWZmZXIoZGx0aGlzLT5zdHJtLCBpbnB1dF9zeW0sIHNpeikgIT0KKwkJICAgIHNpeikgeworCQkJRExfRVJST1IocmVhZHN0cm0sIHN5bV9lcnJpZCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGRsdGhpcy0+cmVvcmRlcl9tYXApCisJCQlkbG9hZF9yZW9yZGVyKGlucHV0X3N5bSwgc2l6LCBkbHRoaXMtPnJlb3JkZXJfbWFwKTsKKworCQljaGVja3MgKz0gZGxvYWRfY2hlY2tzdW0oaW5wdXRfc3ltLCBzaXopOworCQlkbyB7CQkvKiBwcm9jZXNzIHN5bWJvbHMgaW4gYnVmZmVyICovCisJCQlzeW1ib2xzX2xlZnQgLT0gMTsKKwkJCS8qIGF0dGVtcHQgdG8gZGVyaXZlIHRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sICovCisJCQlzbmFtZSA9IE5VTEw7CisJCQlpZiAoaW5wdXRfc3ltLT5kbl9vZmZzZXQgPiAwKSB7CisjaWYgQklUU19QRVJfQVUgPD0gQklUU19QRVJfQllURQorCQkJCWlmICgodTMyKSBpbnB1dF9zeW0tPmRuX29mZnNldCA8CisJCQkJICAgIGRsdGhpcy0+ZGZpbGVfaGRyLmRmX3N0cnRhYl9zaXplKQorCQkJCQlzbmFtZSA9IGRsdGhpcy0+c3RyX2hlYWQgKworCQkJCQkgICAgQllURV9UT19IT1NUKGlucHV0X3N5bS0+ZG5fb2Zmc2V0KTsKKwkJCQllbHNlCisJCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywKKwkJCQkJCSAgICAiQmFkIG5hbWUgb2Zmc2V0IGluIHN5bWJvbCAiCisJCQkJCQkgICAgIiAlZCIsIHN5bWJvbHNfbGVmdCk7CisjZWxzZQorCQkJCXNuYW1lID0gdW5wYWNrX25hbWUoZGx0aGlzLAorCQkJCQkJICAgIGlucHV0X3N5bS0+ZG5fb2Zmc2V0KTsKKyNlbmRpZgorCQkJfQorCQkJdmFsID0gaW5wdXRfc3ltLT5kbl92YWx1ZTsKKwkJCWRlbHRhID0gMDsKKwkJCXNwLT5zY2xhc3MgPSBpbnB1dF9zeW0tPmRuX3NjbGFzczsKKwkJCXNwLT5zZWNubiA9IGlucHV0X3N5bS0+ZG5fc2NudW07CisJCQkvKiBpZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsCisJCQkgKiBkZWZpbmUgaXQgKG9yIGZhaWwpIG5vdyAqLworCQkJaWYgKHNwLT5zZWNubiA9PSBETl9VTkRFRikgeworCQkJCS8qIHBvaW50bGVzcyBmb3Igc3RhdGljIHVuZGVmaW5lZCAqLworCQkJCWlmIChpbnB1dF9zeW0tPmRuX3NjbGFzcyAhPSBETl9FWFQpCisJCQkJCWdvdG8gbG9vcF9jb250OworCisJCQkJLyogdHJ5IHRvIGRlZmluZSBzeW1ib2wgZnJvbSBwcmV2aW91c2x5CisJCQkJICogbG9hZGVkIGltYWdlcyAqLworCQkJCXN5bXAgPSBkbHRoaXMtPm15c3ltLT5maW5kX21hdGNoaW5nX3N5bWJvbAorCQkJCSAgICAoZGx0aGlzLT5teXN5bSwgc25hbWUpOworCQkJCWlmICghc3ltcCkgeworCQkJCQlETF9FUlJPUgorCQkJCQkgICAgKCJVbmRlZmluZWQgZXh0ZXJuYWwgc3ltYm9sICVzIiwKKwkJCQkJICAgICBzbmFtZSk7CisJCQkJCWdvdG8gbG9vcF9jb250OworCQkJCX0KKwkJCQl2YWwgPSBkZWx0YSA9IHN5bXAtPnZhbHVlOworI2lmZGVmIEVOQUJMRV9UUkFNUF9ERUJVRworCQkJCWRsb2FkX3N5bXNfZXJyb3IoZGx0aGlzLT5teXN5bSwKKwkJCQkJCSAiPT09PiBleHQgc3ltIFslc10gYXQgJXgiLAorCQkJCQkJIHNuYW1lLCB2YWwpOworI2VuZGlmCisKKwkJCQlnb3RvIGxvb3BfY29udDsKKwkJCX0KKwkJCS8qIHN5bWJvbCBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlICovCisJCQlpZiAoc3AtPnNlY25uID4gMCkgeworCQkJCS8qIHN5bWJvbCByZWZlcmVuY2VzIGEgc2VjdGlvbiAqLworCQkJCWlmICgodW5zaWduZWQpc3AtPnNlY25uIDw9CisJCQkJICAgIGRsdGhpcy0+YWxsb2NhdGVkX3NlY25fY291bnQpIHsKKwkJCQkJLyogc2VjdGlvbiB3YXMgYWxsb2NhdGVkICovCisJCQkJCXN0cnVjdCBkb2ZmX3Njbmhkcl90ICpzcmVmcCA9CisJCQkJCSAgICAmZGx0aGlzLT5zZWN0X2hkcnNbc3AtPnNlY25uIC0gMV07CisKKwkJCQkJaWYgKGlucHV0X3N5bS0+ZG5fc2NsYXNzID09CisJCQkJCSAgICBETl9TVEFUTEFCIHx8CisJCQkJCSAgICBpbnB1dF9zeW0tPmRuX3NjbGFzcyA9PSBETl9FWFRMQUIpIHsKKwkJCQkJCS8qIGxvYWQgKi8KKwkJCQkJCWRlbHRhID0gc3JlZnAtPmRzX3ZhZGRyOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogcnVuICovCisJCQkJCQlkZWx0YSA9IHNyZWZwLT5kc19wYWRkcjsKKwkJCQkJfQorCQkJCQl2YWwgKz0gZGVsdGE7CisJCQkJfQorCQkJCWdvdG8gbG9vcF9pdHI7CisJCQl9CisJCQkvKiBUaGlzIHN5bWJvbCBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wgKi8KKwkJCWlmIChzcC0+c2Vjbm4gPT0gRE5fQUJTICYmICgoc3AtPnNjbGFzcyA9PSBETl9FWFQpIHx8CisJCQkJCQkgICAgKHNwLT5zY2xhc3MgPT0KKwkJCQkJCSAgICAgRE5fRVhUTEFCKSkpIHsKKwkJCQlzeW1wID0KKwkJCQkgICAgZGx0aGlzLT5teXN5bS0+ZmluZF9tYXRjaGluZ19zeW1ib2woZGx0aGlzLT4KKwkJCQkJCQkJCW15c3ltLAorCQkJCQkJCQkJc25hbWUpOworCQkJCWlmICghc3ltcCkKKwkJCQkJZ290byBsb29wX2l0cjsKKwkJCQkvKiBUaGlzIGFic29sdXRlIHN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuICovCisJCQkJaWYgKHN5bXAtPnZhbHVlID09IGlucHV0X3N5bS0+ZG5fdmFsdWUpIHsKKwkJCQkJLyogSWYgc3ltYm9sIHZhbHVlcyBhcmUgZXF1YWwsIGNvbnRpbnVlCisJCQkJCSAqIGJ1dCBkb24ndCBhZGQgdG8gdGhlIGdsb2JhbCBzeW1ib2wKKwkJCQkJICogdGFibGUgKi8KKwkJCQkJc3AtPnZhbHVlID0gdmFsOworCQkJCQlzcC0+ZGVsdGEgPSBkZWx0YTsKKwkJCQkJc3AgKz0gMTsKKwkJCQkJaW5wdXRfc3ltICs9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIElmIHN5bWJvbCB2YWx1ZXMgYXJlIG5vdCBlcXVhbCwKKwkJCQkJICogcmV0dXJuIHdpdGggcmVkZWZpbml0aW9uIGVycm9yICovCisJCQkJCURMX0VSUk9SKCJBYnNvbHV0ZSBzeW1ib2wgJXMgaXMgIgorCQkJCQkJICJkZWZpbmVkIG11bHRpcGxlIHRpbWVzIHdpdGggIgorCQkJCQkJICJkaWZmZXJlbnQgdmFsdWVzIiwgc25hbWUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorbG9vcF9pdHI6CisJCQkvKiBpZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCwgcG9zdCBpdCB0byB0aGUKKwkJCSAqIGdsb2JhbCB0YWJsZSAqLworCQkJaWYgKGlucHV0X3N5bS0+ZG5fc2NsYXNzID09IEROX0VYVCB8fAorCQkJICAgIGlucHV0X3N5bS0+ZG5fc2NsYXNzID09IEROX0VYVExBQikgeworCQkJCS8qIEtlZXAgdGhpcyBnbG9iYWwgc3ltYm9sIGZvciBzdWJzZXF1ZW50CisJCQkJICogbW9kdWxlcy4gRG9uJ3QgY29tcGxhaW4gb24gZXJyb3IsIHRvIGFsbG93CisJCQkJICogc3ltYm9sIEFQSSB0byBzdXBwcmVzcyBnbG9iYWwgc3ltYm9scyAqLworCQkJCWlmICghc25hbWUpCisJCQkJCWdvdG8gbG9vcF9jb250OworCisJCQkJbmV3c3ltID0gZGx0aGlzLT5teXN5bS0+YWRkX3RvX3N5bWJvbF90YWJsZQorCQkJCSAgICAoZGx0aGlzLT5teXN5bSwgc25hbWUsCisJCQkJICAgICAodW5zaWduZWQpZGx0aGlzLT5teWhhbmRsZSk7CisJCQkJaWYgKG5ld3N5bSkKKwkJCQkJbmV3c3ltLT52YWx1ZSA9IHZhbDsKKworCQkJfQkvKiBnbG9iYWwgKi8KK2xvb3BfY29udDoKKwkJCXNwLT52YWx1ZSA9IHZhbDsKKwkJCXNwLT5kZWx0YSA9IGRlbHRhOworCQkJc3AgKz0gMTsKKwkJCWlucHV0X3N5bSArPSAxOworCQl9IHdoaWxlICgoc3ltc19pbl9idWYgLT0gMSkgPiAwKTsJLyogcHJvY2VzcyBzeW0gaW4gYnVmICovCisJfSB3aGlsZSAoc3ltYm9sc19sZWZ0ID4gMCk7CS8qIHJlYWQgYWxsIHN5bWJvbHMgKi8KKwlpZiAofmNoZWNrcykKKwkJZGxvYWRfZXJyb3IoZGx0aGlzLCAiQ2hlY2tzdW0gb2Ygc3ltYm9scyBmYWlsZWQiKTsKKworfQkJCQkvKiBkbG9hZF9zeW1ib2xzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIHN5bWJvbF90YWJsZV9mcmVlCisgKgorICogUGFyYW1ldGVyczoKKyAqCW5vbmUKKyAqCisgKiBFZmZlY3Q6CisgKglGcmVlcyBhbnkgc3RhdGUgdXNlZCBieSB0aGUgc3ltYm9sIHRhYmxlLgorICoKKyAqIFdBUk5JTkc6CisgKglUaGlzIHJvdXRpbmUgaXMgbm90IGFsbG93ZWQgdG8gZGVjbGFyZSBlcnJvcnMhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQgc3ltYm9sX3RhYmxlX2ZyZWUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJaWYgKGRsdGhpcy0+bG9jYWxfc3ltdGFiKSB7CisJCWlmIChkbHRoaXMtPmRsb2FkX2VycmNvdW50KSB7CS8qIGJsb3cgb2ZmIG91ciBzeW1ib2xzICovCisJCQlkbHRoaXMtPm15c3ltLT5wdXJnZV9zeW1ib2xfdGFibGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJCQkgICh1bnNpZ25lZCkKKwkJCQkJCQkgIGRsdGhpcy0+bXloYW5kbGUpOworCQl9CisJCWRsdGhpcy0+bXlzeW0tPmRsb2FkX2RlYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJCWRsdGhpcy0+bG9jYWxfc3ltdGFiKTsKKwl9Cit9CQkJCS8qIHN5bWJvbF90YWJsZV9mcmVlICovCisKKy8qIC5jaW5pdCBQcm9jZXNzaW5nCisgKgorICogVGhlIGR5bmFtaWMgbG9hZGVyIGRvZXMgLmNpbml0IGludGVycHJldGF0aW9uLiAgY2xvYWRfY2luaXQoKQorICogYWN0cyBhcyBhIHNwZWNpYWwgd3JpdGUtdG8tdGFyZ2V0IGZ1bmN0aW9uLCBpbiB0aGF0IGl0IHRha2VzIHJlbG9jYXRlZAorICogZGF0YSBmcm9tIHRoZSBub3JtYWwgZGF0YSBmbG93LCBhbmQgaW50ZXJwcmV0cyBpdCBhcyAuY2luaXQgYWN0aW9ucy4KKyAqIEJlY2F1c2UgdGhlIG5vcm1hbCBkYXRhIGZsb3cgZG9lcyBub3QgIG5lY2Vzc2FyaWx5IHByb2Nlc3MgdGhlIHdob2xlCisgKiAuY2luaXQgc2VjdGlvbiBpbiBvbmUgYnVmZmVyLCBjbG9hZF9jaW5pdCgpIG11c3QgYmUgcHJlcGFyZWQgdG8KKyAqIGludGVycHJldCB0aGUgZGF0YSBwaWVjZW1lYWwuICBBIHN0YXRlIG1hY2hpbmUgaXMgdXNlZCBmb3IgdGhpcworICogcHVycG9zZS4KKyAqLworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IGZvciB1c2UgYnkgcmVsb2MuYyBhbmQgdGhpbmdzIGl0IGNhbGxzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gY2luaXRfaW5mb19pbml0ID0geyBjaW5pdG5hbWUsIDAsIDAsCisJKGxkcl9hZGRyKS0xLCAwLCBETE9BRF9CU1MsIDAKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgY2xvYWRfY2luaXQKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJaXBhY2tldAkJUG9pbnRlciB0byBkYXRhIHBhY2tldCB0byBiZSBsb2FkZWQKKyAqCisgKiBFZmZlY3Q6CisgKglJbnRlcnByZXRzIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgYXMgLmNpbml0IGRhdGEsIGFuZCBwZXJmb3JtcyB0aGUKKyAqIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9ucy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQgY2xvYWRfY2luaXQoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsCisJCQlzdHJ1Y3QgaW1hZ2VfcGFja2V0X3QgKmlwYWNrZXQpCit7CisjaWYgVERBVEFfVE9fSE9TVChDSU5JVF9DT1VOVCkqQklUU19QRVJfQVUgPiAxNgorCXMzMiBpbml0X2NvdW50LCBsZWZ0OworI2Vsc2UKKwlzMTYgaW5pdF9jb3VudCwgbGVmdDsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgKnBrdHAgPSBpcGFja2V0LT5pbWdfZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpwa3RlbmQgPSBwa3RwICsgQllURV9UT19IT1NUX1JPVU5EKGlwYWNrZXQtPnBhY2tldF9zaXplKTsKKwlpbnQgdGVtcDsKKwlsZHJfYWRkciBhdG1wOworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvIGNpbml0X2luZm87CisKKwkvKiAgUFJPQ0VTUyBBTEwgVEhFIElOSVRJQUxJWkFUSU9OIFJFQ09SRFMgVEhFIEJVRkZFUi4gKi8KKwl3aGlsZSAodHJ1ZSkgeworCQlsZWZ0ID0gcGt0ZW5kIC0gcGt0cDsKKwkJc3dpdGNoIChkbHRoaXMtPmNpbml0X3N0YXRlKSB7CisJCWNhc2UgQ0lfQ09VTlQ6CS8qIGNvdW50IGZpZWxkICovCisJCQlpZiAobGVmdCA8IFREQVRBX1RPX0hPU1QoQ0lOSVRfQ09VTlQpKQorCQkJCWdvdG8gbG9vcGV4aXQ7CisJCQl0ZW1wID0gZGxvYWRfdW5wYWNrKGRsdGhpcywgKHRndF9hdV90ICopIHBrdHAsCisJCQkJCSAgICBDSU5JVF9DT1VOVCAqIFREQVRBX0FVX0JJVFMsIDAsCisJCQkJCSAgICBST1BfU0dOKTsKKwkJCXBrdHAgKz0gVERBVEFfVE9fSE9TVChDSU5JVF9DT1VOVCk7CisJCQkvKiBuZWdhdGl2ZSBzaWduaWZpZXMgQlNTIHRhYmxlLCB6ZXJvIG1lYW5zIGRvbmUgKi8KKwkJCWlmICh0ZW1wIDw9IDApIHsKKwkJCQlkbHRoaXMtPmNpbml0X3N0YXRlID0gQ0lfRE9ORTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRsdGhpcy0+Y2luaXRfY291bnQgPSB0ZW1wOworCQkJZGx0aGlzLT5jaW5pdF9zdGF0ZSA9IENJX0FERFJFU1M7CisJCQlicmVhazsKKyNpZiBDSU5JVF9BTElHTiA8IENJTklUX0FERFJFU1MKKwkJY2FzZSBDSV9QQVJUQUREUkVTUzoKKwkJCXBrdHAgLT0gVERBVEFfVE9fSE9TVChDSU5JVF9BTElHTik7CisJCQkvKiBiYWNrIHVwIHBvaW50ZXIgaW50byBzcGFjZSBjb3VydGVzeSBvZiBjYWxsZXIgKi8KKwkJCSoodWludDE2X3QgKikgcGt0cCA9IGRsdGhpcy0+Y2luaXRfYWRkcjsKKwkJCS8qIHN0dWZmIGluIHNhdmVkIGJpdHMgICEhIEZBTEwgVEhSVSAhISAqLworI2VuZGlmCisJCWNhc2UgQ0lfQUREUkVTUzoJLyogQWRkcmVzcyBmaWVsZCBmb3IgYSBjb3B5IHBhY2tldCAqLworCQkJaWYgKGxlZnQgPCBUREFUQV9UT19IT1NUKENJTklUX0FERFJFU1MpKSB7CisjaWYgQ0lOSVRfQUxJR04gPCBDSU5JVF9BRERSRVNTCisJCQkJaWYgKGxlZnQgPT0gVERBVEFfVE9fSE9TVChDSU5JVF9BTElHTikpIHsKKwkJCQkJLyogYWRkcmVzcyBicm9rZW4gaW50byBoYWx2ZXMgKi8KKwkJCQkJZGx0aGlzLT5jaW5pdF9hZGRyID0gKih1aW50MTZfdCAqKSBwa3RwOworCQkJCQkvKiByZW1lbWJlciAxc3QgaGFsZiAqLworCQkJCQlkbHRoaXMtPmNpbml0X3N0YXRlID0gQ0lfUEFSVEFERFJFU1M7CisJCQkJCWxlZnQgPSAwOworCQkJCX0KKyNlbmRpZgorCQkJCWdvdG8gbG9vcGV4aXQ7CisJCQl9CisJCQlhdG1wID0gZGxvYWRfdW5wYWNrKGRsdGhpcywgKHRndF9hdV90ICopIHBrdHAsCisJCQkJCSAgICBDSU5JVF9BRERSRVNTICogVERBVEFfQVVfQklUUywgMCwKKwkJCQkJICAgIFJPUF9VTlMpOworCQkJcGt0cCArPSBUREFUQV9UT19IT1NUKENJTklUX0FERFJFU1MpOworI2lmIENJTklUX1BBR0VfQklUUyA+IDAKKwkJCWRsdGhpcy0+Y2luaXRfcGFnZSA9IGF0bXAgJgorCQkJICAgICgoMSA8PCBDSU5JVF9QQUdFX0JJVFMpIC0gMSk7CisJCQlhdG1wID4+PSBDSU5JVF9QQUdFX0JJVFM7CisjZWxzZQorCQkJZGx0aGlzLT5jaW5pdF9wYWdlID0gQ0lOSVRfREVGQVVMVF9QQUdFOworI2VuZGlmCisJCQlkbHRoaXMtPmNpbml0X2FkZHIgPSBhdG1wOworCQkJZGx0aGlzLT5jaW5pdF9zdGF0ZSA9IENJX0NPUFk7CisJCQlicmVhazsKKwkJY2FzZSBDSV9DT1BZOgkvKiBjb3B5IGJpdHMgdG8gdGhlIHRhcmdldCAqLworCQkJaW5pdF9jb3VudCA9IEhPU1RfVE9fVERBVEEobGVmdCk7CisJCQlpZiAoaW5pdF9jb3VudCA+IGRsdGhpcy0+Y2luaXRfY291bnQpCisJCQkJaW5pdF9jb3VudCA9IGRsdGhpcy0+Y2luaXRfY291bnQ7CisJCQlpZiAoaW5pdF9jb3VudCA9PSAwKQorCQkJCWdvdG8gbG9vcGV4aXQ7CS8qIGdldCBtb3JlIGJpdHMgKi8KKwkJCWNpbml0X2luZm8gPSBjaW5pdF9pbmZvX2luaXQ7CisJCQljaW5pdF9pbmZvLnBhZ2UgPSBkbHRoaXMtPmNpbml0X3BhZ2U7CisJCQlpZiAoIWRsdGhpcy0+bXlpby0+d3JpdGVtZW0oZGx0aGlzLT5teWlvLCBwa3RwLAorCQkJCQkJICAgVERBVEFfVE9fVEFERFIKKwkJCQkJCSAgIChkbHRoaXMtPmNpbml0X2FkZHIpLAorCQkJCQkJICAgJmNpbml0X2luZm8sCisJCQkJCQkgICBUREFUQV9UT19IT1NUKGluaXRfY291bnQpKSkgeworCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywgaW5pdGZhaWwsICJ3cml0ZSIsCisJCQkJCSAgICBkbHRoaXMtPmNpbml0X2FkZHIpOworCQkJfQorCQkJZGx0aGlzLT5jaW5pdF9jb3VudCAtPSBpbml0X2NvdW50OworCQkJaWYgKGRsdGhpcy0+Y2luaXRfY291bnQgPD0gMCkgeworCQkJCWRsdGhpcy0+Y2luaXRfc3RhdGUgPSBDSV9DT1VOVDsKKwkJCQlpbml0X2NvdW50ID0gKGluaXRfY291bnQgKyBDSU5JVF9BTElHTiAtIDEpICYKKwkJCQkgICAgLUNJTklUX0FMSUdOOworCQkJCS8qIGFsaWduIHRvIG5leHQgaW5pdCAqLworCQkJfQorCQkJcGt0cCArPSBUREFUQV9UT19IT1NUKGluaXRfY291bnQpOworCQkJZGx0aGlzLT5jaW5pdF9hZGRyICs9IGluaXRfY291bnQ7CisJCQlicmVhazsKKwkJY2FzZSBDSV9ET05FOgkvKiBubyBtb3JlIC5jaW5pdCB0byBkbyAqLworCQkJcmV0dXJuOworCQl9CQkvKiBzd2l0Y2ggKGNpbml0X3N0YXRlKSAqLworCX0JCQkvKiB3aGlsZSAqLworCitsb29wZXhpdDoKKwlpZiAobGVmdCA+IDApIHsKKwkJZGxvYWRfZXJyb3IoZGx0aGlzLCAiJWQgYnl0ZXMgbGVmdCBvdmVyIGluIGNpbml0IHBhY2tldCIsIGxlZnQpOworCQlkbHRoaXMtPmNpbml0X3N0YXRlID0gQ0lfRE9ORTsJLyogbGVmdCBvdmVyIGJ5dGVzIGFyZSBiYWQgKi8KKwl9Cit9CQkJCS8qIGNsb2FkX2Npbml0ICovCisKKy8qCUZ1bmN0aW9ucyB0byBpbnRlcmZhY2UgdG8gcmVsb2MuYworICoKKyAqIHJlbG9jLmMgaXMgdGhlIHJlbG9jYXRpb24gbW9kdWxlIGJvcnJvd2VkIGZyb20gdGhlIGxpbmtlciwgd2l0aAorICogbWluaW1hbCAod2UgaG9wZSkgY2hhbmdlcyBmb3Igb3VyIHB1cnBvc2VzLiAgY2xvYWRfc2VjdF9kYXRhKCkgaW52b2tlcworICogdGhpcyBtb2R1bGUgb24gYSBzZWN0aW9uIHRvIHJlbG9jYXRlIGFuZCBsb2FkIHRoZSBpbWFnZSBkYXRhIGZvciB0aGF0CisgKiBzZWN0aW9uLiAgVGhlIGFjdHVhbCByZWFkIGFuZCB3cml0ZSBhY3Rpb25zIGFyZSBzdXBwbGllZCBieSB0aGUgZ2xvYmFsCisgKiByb3V0aW5lcyBiZWxvdy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgcmVsb2NhdGVfcGFja2V0CisgKgorICogUGFyYW1ldGVyczoKKyAqCWlwYWNrZXQJCVBvaW50ZXIgdG8gYW4gaW1hZ2UgcGFja2V0IHRvIHJlbG9jYXRlCisgKgorICogRWZmZWN0OgorICoJUGVyZm9ybXMgdGhlIHJlcXVpcmVkIHJlbG9jYXRpb25zIG9uIHRoZSBwYWNrZXQuICBSZXR1cm5zIGEgY2hlY2tzdW0KKyAqIG9mIHRoZSByZWxvY2F0aW9uIG9wZXJhdGlvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgTVlfUkVMT0NfQlVGX1NJWiA4CisvKiBjYXJlZnVsISBleGlzdHMgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgaW1hZ2UgYnVmZmVyICovCitzdGF0aWMgaW50IHJlbG9jYXRlX3BhY2tldChzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywKKwkJCSAgIHN0cnVjdCBpbWFnZV9wYWNrZXRfdCAqaXBhY2tldCwKKwkJCSAgIHUzMiAqY2hlY2tzLCBib29sICp0cmFtcHNfZ2VuZXJhdGVkKQoreworCXUzMiBybnVtOworCSp0cmFtcHNfZ2VuZXJhdGVkID0gZmFsc2U7CisKKwlybnVtID0gaXBhY2tldC0+bnVtX3JlbG9jczsKKwlkbyB7CQkJLyogYWxsIHJlbG9jcyAqLworCQl1bnNpZ25lZCByaW5idWY7CisJCWludCBzaXo7CisJCXN0cnVjdCByZWxvY19yZWNvcmRfdCAqcnAsIHJyZWNbTVlfUkVMT0NfQlVGX1NJWl07CisJCXJwID0gcnJlYzsKKwkJcmluYnVmID0gcm51bSA+IE1ZX1JFTE9DX0JVRl9TSVogPyBNWV9SRUxPQ19CVUZfU0laIDogcm51bTsKKwkJc2l6ID0gcmluYnVmICogc2l6ZW9mKHN0cnVjdCByZWxvY19yZWNvcmRfdCk7CisJCWlmIChkbHRoaXMtPnN0cm0tPnJlYWRfYnVmZmVyKGRsdGhpcy0+c3RybSwgcnAsIHNpeikgIT0gc2l6KSB7CisJCQlETF9FUlJPUihyZWFkc3RybSwgInJlbG9jYXRpb24iKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIHJlb3JkZXIgdGhlIGJ5dGVzIGlmIG5lZWQgYmUgKi8KKwkJaWYgKGRsdGhpcy0+cmVvcmRlcl9tYXApCisJCQlkbG9hZF9yZW9yZGVyKHJwLCBzaXosIGRsdGhpcy0+cmVvcmRlcl9tYXApOworCisJCSpjaGVja3MgKz0gZGxvYWRfY2hlY2tzdW0ocnAsIHNpeik7CisJCWRvIHsKKwkJCS8qIHBlcmZvcm0gdGhlIHJlbG9jYXRpb24gb3BlcmF0aW9uICovCisJCQlkbG9hZF9yZWxvY2F0ZShkbHRoaXMsICh0Z3RfYXVfdCAqKSBpcGFja2V0LT5pbWdfZGF0YSwKKwkJCQkgICAgICAgcnAsIHRyYW1wc19nZW5lcmF0ZWQsIGZhbHNlKTsKKwkJCXJwICs9IDE7CisJCQlybnVtIC09IDE7CisJCX0gd2hpbGUgKChyaW5idWYgLT0gMSkgPiAwKTsKKwl9IHdoaWxlIChybnVtID4gMCk7CS8qIGFsbCByZWxvY3MgKi8KKwkvKiBJZiB0cmFtcG9saW5lKHMpIHdlcmUgZ2VuZXJhdGVkLCB3ZSBuZWVkIHRvIGRvIGFuIHVwZGF0ZSBvZiB0aGUKKwkgKiB0cmFtcG9saW5lIGNvcHkgb2YgdGhlIHBhY2tldCBzaW5jZSBhIDJuZCBwaGFzZSByZWxvIHdpbGwgYmUgZG9uZQorCSAqIGxhdGVyLiAqLworCWlmICgqdHJhbXBzX2dlbmVyYXRlZCA9PSB0cnVlKSB7CisJCWRsb2FkX3RyYW1wX3BrdF91ZHBhdGUoZGx0aGlzLAorCQkJCSAgICAgICAoZGx0aGlzLT5pbWFnZV9zZWNuIC0KKwkJCQkJZGx0aGlzLT5sZHJfc2VjdGlvbnMpLAorCQkJCSAgICAgICBkbHRoaXMtPmltYWdlX29mZnNldCwgaXBhY2tldCk7CisJfQorCisJcmV0dXJuIDE7Cit9CQkJCS8qIGRsb2FkX3JlYWRfcmVsb2MgKi8KKworI2RlZmluZSBJUEhfU0laRSAoc2l6ZW9mKHN0cnVjdCBpbWFnZV9wYWNrZXRfdCkgLSBzaXplb2YodTMyKSkKKworLyogVkVSWSBkYW5nZXJvdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGltYWdlcGFrW10gPSB7ICJpbWFnZSBwYWNrZXQiIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfZGF0YQorICoKKyAqIFBhcmFtZXRlcnM6CisgKglub25lCisgKgorICogRWZmZWN0OgorICoJUmVhZCBpbWFnZSBkYXRhIGZyb20gaW5wdXQgZmlsZSwgcmVsb2NhdGUgaXQsIGFuZCBkb3dubG9hZCBpdCB0byB0aGUKKyAqCXRhcmdldC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQgZGxvYWRfZGF0YShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcykKK3sKKwl1MTYgY3Vycl9zZWN0OworCXN0cnVjdCBkb2ZmX3Njbmhkcl90ICpzcHRyID0gZGx0aGlzLT5zZWN0X2hkcnM7CisJc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmxwdHIgPSBkbHRoaXMtPmxkcl9zZWN0aW9uczsKKyNpZmRlZiBPUFRfWkVST19DT1BZX0xPQURFUgorCWJvb2wgemVyb19jb3B5ID0gZmFsc2U7CisjZW5kaWYKKwl1OCAqZGVzdDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBpbWFnZV9wYWNrZXRfdCBpcGFja2V0OworCQl1OCBidWZyW0JZVEVfVE9fSE9TVChJTUFHRV9QQUNLRVRfU0laRSldOworCX0gaWJ1ZjsKKworCS8qIEluZGljYXRlcyB3aGV0aGVyIENJTklUIHByb2Nlc3NpbmcgaGFzIG9jY3VycmVkICovCisJYm9vbCBjaW5pdF9wcm9jZXNzZWQgPSBmYWxzZTsKKworCS8qIExvb3AgdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGxvYWQgdGhlbSBvbmUgYXQgYSB0aW1lLgorCSAqLworCWZvciAoY3Vycl9zZWN0ID0gMDsgY3Vycl9zZWN0IDwgZGx0aGlzLT5kZmlsZV9oZHIuZGZfbm9fc2NuczsKKwkgICAgIGN1cnJfc2VjdCArPSAxKSB7CisJCWlmIChkc19uZWVkc19kb3dubG9hZChzcHRyKSkgeworCQkJczMyIG5pcDsKKwkJCWxkcl9hZGRyIGltYWdlX29mZnNldCA9IDA7CisJCQkvKiBzZXQgcmVsb2NhdGlvbiBpbmZvIGZvciB0aGlzIHNlY3Rpb24gKi8KKwkJCWlmIChjdXJyX3NlY3QgPCBkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50KQorCQkJCWRsdGhpcy0+ZGVsdGFfcnVuYWRkciA9IHNwdHItPmRzX3BhZGRyOworCQkJZWxzZSB7CisJCQkJbHB0ciA9IChzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqKXNwdHI7CisJCQkJZGx0aGlzLT5kZWx0YV9ydW5hZGRyID0gMDsKKwkJCX0KKwkJCWRsdGhpcy0+aW1hZ2Vfc2VjbiA9IGxwdHI7CisjaWYgQklUU19QRVJfQVUgPiBCSVRTX1BFUl9CWVRFCisJCQlscHRyLT5uYW1lID0gdW5wYWNrX25hbWUoZGx0aGlzLCBzcHRyLT5kc19vZmZzZXQpOworI2VuZGlmCisJCQluaXAgPSBzcHRyLT5kc19uaXBhY2tzOworCQkJd2hpbGUgKChuaXAgLT0gMSkgPj0gMCkgewkvKiBwcm9jZXNzIHBhY2tldHMgKi8KKworCQkJCXMzMiBpcHNpemU7CisJCQkJdTMyIGNoZWNrczsKKwkJCQlib29sIHRyYW1wX2dlbmVyYXRlZCA9IGZhbHNlOworCisJCQkJLyogZ2V0IHRoZSBmaXhlZCBoZWFkZXIgYml0cyAqLworCQkJCWlmIChkbHRoaXMtPnN0cm0tPnJlYWRfYnVmZmVyKGRsdGhpcy0+c3RybSwKKwkJCQkJCQkgICAgICAmaWJ1Zi5pcGFja2V0LAorCQkJCQkJCSAgICAgIElQSF9TSVpFKSAhPQorCQkJCSAgICBJUEhfU0laRSkgeworCQkJCQlETF9FUlJPUihyZWFkc3RybSwgaW1hZ2VwYWspOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCS8qIHJlb3JkZXIgdGhlIGhlYWRlciBpZiBuZWVkIGJlICovCisJCQkJaWYgKGRsdGhpcy0+cmVvcmRlcl9tYXApIHsKKwkJCQkJZGxvYWRfcmVvcmRlcigmaWJ1Zi5pcGFja2V0LCBJUEhfU0laRSwKKwkJCQkJCSAgICAgIGRsdGhpcy0+cmVvcmRlcl9tYXApOworCQkJCX0KKwkJCQkvKiBub3cgcmVhZCB0aGUgcmVzdCBvZiB0aGUgcGFja2V0ICovCisJCQkJaXBzaXplID0KKwkJCQkgICAgQllURV9UT19IT1NUKERPRkZfQUxJR04KKwkJCQkJCSAoaWJ1Zi5pcGFja2V0LnBhY2tldF9zaXplKSk7CisJCQkJaWYgKGlwc2l6ZSA+IEJZVEVfVE9fSE9TVChJTUFHRV9QQUNLRVRfU0laRSkpIHsKKwkJCQkJRExfRVJST1IoIkJhZCBpbWFnZSBwYWNrZXQgc2l6ZSAlZCIsCisJCQkJCQkgaXBzaXplKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlkZXN0ID0gaWJ1Zi5idWZyOworI2lmZGVmIE9QVF9aRVJPX0NPUFlfTE9BREVSCisJCQkJemVyb19jb3B5ID0gZmFsc2U7CisJCQkJaWYgKCFkbG9hZF9jaGVja190eXBlKHNwdHIsIERMT0FEX0NJTklUKSB7CisJCQkJCWRsdGhpcy0+bXlpby0+d3JpdGVtZW0oZGx0aGlzLT5teWlvLAorCQkJCQkJCSAgICAgICAmZGVzdCwKKwkJCQkJCQkgICAgICAgbHB0ci0+bG9hZF9hZGRyICsKKwkJCQkJCQkgICAgICAgaW1hZ2Vfb2Zmc2V0LAorCQkJCQkJCSAgICAgICBscHRyLCAwKTsKKwkJCQkJemVyb19jb3B5ID0gKGRlc3QgIT0gaWJ1Zi5idWZyKTsKKwkJCQl9CisjZW5kaWYKKwkJCQkvKiBFbmQgb2YgZGV0ZXJtaW5hdGlvbiAqLworCisJCQkJaWYgKGRsdGhpcy0+c3RybS0+cmVhZF9idWZmZXIoZGx0aGlzLT5zdHJtLAorCQkJCQkJCSAgICAgIGlidWYuYnVmciwKKwkJCQkJCQkgICAgICBpcHNpemUpICE9CisJCQkJICAgIGlwc2l6ZSkgeworCQkJCQlETF9FUlJPUihyZWFkc3RybSwgaW1hZ2VwYWspOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWlidWYuaXBhY2tldC5pbWdfZGF0YSA9IGRlc3Q7CisKKwkJCQkvKiByZW9yZGVyIHRoZSBieXRlcyBpZiBuZWVkIGJlICovCisjaWYgIWRlZmluZWQoX0JJR19FTkRJQU4pIHx8IChUQVJHRVRfQVVfQklUUyA+IDE2KQorCQkJCWlmIChkbHRoaXMtPnJlb3JkZXJfbWFwKSB7CisJCQkJCWRsb2FkX3Jlb3JkZXIoZGVzdCwgaXBzaXplLAorCQkJCQkJICAgICAgZGx0aGlzLT5yZW9yZGVyX21hcCk7CisJCQkJfQorCQkJCWNoZWNrcyA9IGRsb2FkX2NoZWNrc3VtKGRlc3QsIGlwc2l6ZSk7CisjZWxzZQorCQkJCWlmIChkbHRoaXMtPmRmaWxlX2hkci5kZl9ieXRlX3Jlc2h1ZmZsZSAhPQorCQkJCSAgICBUQVJHRVRfT1JERVIoUkVPUkRFUl9NQVAKKwkJCQkJCSAoQllURV9SRVNIVUZGTEVfVkFMVUUpKSkgeworCQkJCQkvKiBwdXQgaW1hZ2UgYnl0ZXMgaW4gYmlnLWVuZGlhbiBvcmRlciwKKwkJCQkJICogbm90IFBDIG9yZGVyICovCisJCQkJCWRsb2FkX3Jlb3JkZXIoZGVzdCwgaXBzaXplLAorCQkJCQkJICAgICAgVEFSR0VUX09SREVSCisJCQkJCQkgICAgICAoZGx0aGlzLT5kZmlsZV9oZHIuCisJCQkJCQkgICAgICAgZGZfYnl0ZV9yZXNodWZmbGUpKTsKKwkJCQl9CisjaWYgVEFSR0VUX0FVX0JJVFMgPiA4CisJCQkJY2hlY2tzID0gZGxvYWRfcmV2ZXJzZV9jaGVja3N1bTE2KGRlc3QsIGlwc2l6ZSk7CisjZWxzZQorCQkJCWNoZWNrcyA9IGRsb2FkX3JldmVyc2VfY2hlY2tzdW0oZGVzdCwgaXBzaXplKTsKKyNlbmRpZgorI2VuZGlmCisKKwkJCQljaGVja3MgKz0gZGxvYWRfY2hlY2tzdW0oJmlidWYuaXBhY2tldCwKKwkJCQkJCQkgSVBIX1NJWkUpOworCQkJCS8qIHJlbG9jYXRlIHRoZSBpbWFnZSBiaXRzIGFzIG5lZWRlZCAqLworCQkJCWlmIChpYnVmLmlwYWNrZXQubnVtX3JlbG9jcykgeworCQkJCQlkbHRoaXMtPmltYWdlX29mZnNldCA9IGltYWdlX29mZnNldDsKKwkJCQkJaWYgKCFyZWxvY2F0ZV9wYWNrZXQoZGx0aGlzLAorCQkJCQkJCSAgICAgJmlidWYuaXBhY2tldCwKKwkJCQkJCQkgICAgICZjaGVja3MsCisJCQkJCQkJICAgICAmdHJhbXBfZ2VuZXJhdGVkKSkKKwkJCQkJCXJldHVybjsJLyogc2VyaW91cyBlcnJvciAqLworCQkJCX0KKwkJCQlpZiAofmNoZWNrcykKKwkJCQkJRExfRVJST1IoZXJyX2NoZWNrc3VtLCBpbWFnZXBhayk7CisJCQkJLyogT25seSB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSB0YXJnZXQgaWYgbm8KKwkJCQkgKiB0cmFtcG9saW5lIHdhcyBnZW5lcmF0ZWQuICBPdGhlcndpc2UgaXQKKwkJCQkgKndpbGwgYmUgZG9uZSBkdXJpbmcgdHJhbXBvbGluZSBmaW5hbGl6ZS4gKi8KKworCQkJCWlmICh0cmFtcF9nZW5lcmF0ZWQgPT0gZmFsc2UpIHsKKworCQkJCQkvKiBzdHVmZiB0aGUgcmVzdWx0IGludG8gdGFyZ2V0CisJCQkJCSAqIG1lbW9yeSAqLworCQkJCQlpZiAoZGxvYWRfY2hlY2tfdHlwZShzcHRyLAorCQkJCQkJRExPQURfQ0lOSVQpKSB7CisJCQkJCQljbG9hZF9jaW5pdChkbHRoaXMsCisJCQkJCQkJICAgICZpYnVmLmlwYWNrZXQpOworCQkJCQkJY2luaXRfcHJvY2Vzc2VkID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIHsKKyNpZmRlZiBPUFRfWkVST19DT1BZX0xPQURFUgorCQkJCQkJaWYgKCF6ZXJvX2NvcHkpIHsKKyNlbmRpZgorCQkJCQkJCS8qIEZJWE1FICovCisJCQkJCQkJaWYgKCFkbHRoaXMtPm15aW8tPgorCQkJCQkJCSAgICB3cml0ZW1lbShkbHRoaXMtPgorCQkJCQkJCQlteWlvLAorCQkJCQkJCQlpYnVmLmJ1ZnIsCisJCQkJCQkJCWxwdHItPgorCQkJCQkJCQlsb2FkX2FkZHIgKworCQkJCQkJCQlpbWFnZV9vZmZzZXQsCisJCQkJCQkJCWxwdHIsCisJCQkJCQkJCUJZVEVfVE9fSE9TVAorCQkJCQkJCQkoaWJ1Zi4KKwkJCQkJCQkJaXBhY2tldC4KKwkJCQkJCQkJcGFja2V0X3NpemUpKSkgeworCQkJCQkJCQlETF9FUlJPUgorCQkJCQkJCQkgICgiV3JpdGUgdG8gIgorCQkJCQkJCQkgIEZNVF9VSTMyCisJCQkJCQkJCSAgIiBmYWlsZWQiLAorCQkJCQkJCQkgIGxwdHItPgorCQkJCQkJCQkgIGxvYWRfYWRkciArCisJCQkJCQkJCSAgaW1hZ2Vfb2Zmc2V0KTsKKwkJCQkJCQl9CisjaWZkZWYgT1BUX1pFUk9fQ09QWV9MT0FERVIKKwkJCQkJCX0KKyNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJCWltYWdlX29mZnNldCArPQorCQkJCSAgICBCWVRFX1RPX1RBRERSKGlidWYuaXBhY2tldC5wYWNrZXRfc2l6ZSk7CisJCQl9CS8qIHByb2Nlc3MgcGFja2V0cyAqLworCQkJLyogaWYgdGhpcyBpcyBhIEJTUyBzZWN0aW9uLCB3ZSBtYXkgd2FudCB0byBmaWxsIGl0ICovCisJCQlpZiAoIWRsb2FkX2NoZWNrX3R5cGUoc3B0ciwgRExPQURfQlNTKSkKKwkJCQlnb3RvIGxvb3BfY29udDsKKworCQkJaWYgKCEoZGx0aGlzLT5teW9wdGlvbnMgJiBETE9BRF9JTklUQlNTKSkKKwkJCQlnb3RvIGxvb3BfY29udDsKKworCQkJaWYgKGNpbml0X3Byb2Nlc3NlZCkgeworCQkJCS8qIERvbid0IGNsZWFyIEJTUyBhZnRlciBsb2FkLXRpbWUKKwkJCQkgKiBpbml0aWFsaXphdGlvbiAqLworCQkJCURMX0VSUk9SCisJCQkJICAgICgiWmVyby1pbml0aWFsaXphdGlvbiBhdCAiIEZNVF9VSTMyCisJCQkJICAgICAiIGFmdGVyICIgImxvYWQtdGltZSBpbml0aWFsaXphdGlvbiEiLAorCQkJCSAgICAgbHB0ci0+bG9hZF9hZGRyKTsKKwkJCQlnb3RvIGxvb3BfY29udDsKKwkJCX0KKwkJCS8qIGZpbGwgdGhlIC5ic3MgYXJlYSAqLworCQkJZGx0aGlzLT5teWlvLT5maWxsbWVtKGRsdGhpcy0+bXlpbywKKwkJCQkJICAgICAgVEFERFJfVE9fSE9TVChscHRyLT5sb2FkX2FkZHIpLAorCQkJCQkgICAgICBscHRyLCBUQUREUl9UT19IT1NUKGxwdHItPnNpemUpLAorCQkJCQkgICAgICBETE9BRF9GSUxMX0JTUyk7CisJCQlnb3RvIGxvb3BfY29udDsKKwkJfQorCQkvKiBpZiBEU19ET1dOTE9BRF9NQVNLICovCisJCS8qIElmIG5vdCBsb2FkaW5nLCBidXQgQlNTLCB6ZXJvIGluaXRpYWxpemUgKi8KKwkJaWYgKCFkbG9hZF9jaGVja190eXBlKHNwdHIsIERMT0FEX0JTUykpCisJCQlnb3RvIGxvb3BfY29udDsKKworCQlpZiAoIShkbHRoaXMtPm15b3B0aW9ucyAmIERMT0FEX0lOSVRCU1MpKQorCQkJZ290byBsb29wX2NvbnQ7CisKKwkJaWYgKGN1cnJfc2VjdCA+PSBkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50KQorCQkJbHB0ciA9IChzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqKXNwdHI7CisKKwkJaWYgKGNpbml0X3Byb2Nlc3NlZCkgeworCQkJLypEb24ndCBjbGVhciBCU1MgYWZ0ZXIgbG9hZC10aW1lIGluaXRpYWxpemF0aW9uICovCisJCQlETF9FUlJPUigiWmVyby1pbml0aWFsaXphdGlvbiBhdCAiIEZNVF9VSTMyCisJCQkJICIgYXR0ZW1wdGVkIGFmdGVyICIKKwkJCQkgImxvYWQtdGltZSBpbml0aWFsaXphdGlvbiEiLCBscHRyLT5sb2FkX2FkZHIpOworCQkJZ290byBsb29wX2NvbnQ7CisJCX0KKwkJLyogZmlsbCB0aGUgLmJzcyBhcmVhICovCisJCWRsdGhpcy0+bXlpby0+ZmlsbG1lbShkbHRoaXMtPm15aW8sCisJCQkJICAgICAgVEFERFJfVE9fSE9TVChscHRyLT5sb2FkX2FkZHIpLCBscHRyLAorCQkJCSAgICAgIFRBRERSX1RPX0hPU1QobHB0ci0+c2l6ZSksCisJCQkJICAgICAgRExPQURfRklMTF9CU1MpOworbG9vcF9jb250OgorCQlzcHRyICs9IDE7CisJCWxwdHIgKz0gMTsKKwl9CQkJLyogbG9hZCBzZWN0aW9ucyAqLworCisJLyogIEZpbmFsaXplIGFueSB0cmFtcG9saW5lcyB0aGF0IHdlcmUgY3JlYXRlZCBkdXJpbmcgdGhlIGxvYWQgKi8KKwlpZiAoZGxvYWRfdHJhbXBfZmluYWxpemUoZGx0aGlzKSA9PSAwKSB7CisJCURMX0VSUk9SKCJGaW5hbGl6YXRpb24gb2YgYXV0by10cmFtcG9saW5lcyAoc2l6ZSA9ICIgRk1UX1VJMzIKKwkJCSAiKSBmYWlsZWQiLCBkbHRoaXMtPnRyYW1wLnRyYW1wX3NlY3RfbmV4dF9hZGRyKTsKKwl9Cit9CQkJCS8qIGRsb2FkX2RhdGEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkbG9hZF9yZW9yZGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqCWRhdGEJMzItYml0IGFsaWduZWQgcG9pbnRlciB0byBkYXRhIHRvIGJlIGJ5dGUtc3dhcHBlZAorICoJZHNpeglzaXplIG9mIHRoZSBkYXRhIHRvIGJlIHJlb3JkZXJlZCBpbiBzaXplb2YoKSB1bml0cy4KKyAqCW1hcAkJMzItYml0IG1hcCBkZWZpbmluZyBob3cgdG8gcmVvcmRlciB0aGUgZGF0YS4gIFZhbHVlCisgKgkJCW11c3QgYmUgUkVPUkRFUl9NQVAoKSBvZiBzb21lIHBlcm11dGF0aW9uCisgKgkJCW9mIDB4MDAgMDEgMDIgMDMKKyAqCisgKiBFZmZlY3Q6CisgKglSZS1hcnJhbmdlcyB0aGUgYnl0ZXMgaW4gZWFjaCB3b3JkIGFjY29yZGluZyB0byB0aGUgbWFwIHNwZWNpZmllZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIG1hc2sgZm9yIGJ5dGUgc2hpZnQgY291bnQgKi8KKyNkZWZpbmUgU0hJRlRfQ09VTlRfTUFTSyAoMyA8PCBMT0dfQklUU19QRVJfQllURSkKKwordm9pZCBkbG9hZF9yZW9yZGVyKHZvaWQgKmRhdGEsIGludCBkc2l6LCB1bnNpZ25lZCBpbnQgbWFwKQoreworCXJlZ2lzdGVyIHUzMiB0bXAsIHRtYXAsIGRhdHY7CisJdTMyICpkcCA9ICh1MzIgKikgZGF0YTsKKworCW1hcCA8PD0gTE9HX0JJVFNfUEVSX0JZVEU7CS8qIGFsaWduIG1hcCB3aXRoIFNISUZUX0NPVU5UX01BU0sgKi8KKwlkbyB7CisJCXRtcCA9IDA7CisJCWRhdHYgPSAqZHA7CisJCXRtYXAgPSBtYXA7CisJCWRvIHsKKwkJCXRtcCB8PSAoZGF0diAmIEJZVEVfTUFTSykgPDwgKHRtYXAgJiBTSElGVF9DT1VOVF9NQVNLKTsKKwkJCXRtYXAgPj49IEJJVFNfUEVSX0JZVEU7CisJCX0gd2hpbGUgKGRhdHYgPj49IEJJVFNfUEVSX0JZVEUpOworCQkqZHArKyA9IHRtcDsKKwl9IHdoaWxlICgoZHNpeiAtPSBzaXplb2YodTMyKSkgPiAwKTsKK30JCQkJLyogZGxvYWRfcmVvcmRlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGRsb2FkX2NoZWNrc3VtCisgKgorICogUGFyYW1ldGVyczoKKyAqCWRhdGEJMzItYml0IGFsaWduZWQgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNoZWNrc3VtbWVkCisgKglzaXoJCXNpemUgb2YgdGhlIGRhdGEgdG8gYmUgY2hlY2tzdW1tZWQgaW4gc2l6ZW9mKCkgdW5pdHMuCisgKgorICogRWZmZWN0OgorICoJUmV0dXJucyBhIGNoZWNrc3VtIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3UzMiBkbG9hZF9jaGVja3N1bSh2b2lkICpkYXRhLCB1bnNpZ25lZCBzaXopCit7CisJdTMyIHN1bTsKKwl1MzIgKmRwOworCWludCBsZWZ0OworCisJc3VtID0gMDsKKwlkcCA9ICh1MzIgKikgZGF0YTsKKwlmb3IgKGxlZnQgPSBzaXo7IGxlZnQgPiAwOyBsZWZ0IC09IHNpemVvZih1MzIpKQorCQlzdW0gKz0gKmRwKys7CisJcmV0dXJuIHN1bTsKK30JCQkJLyogZGxvYWRfY2hlY2tzdW0gKi8KKworI2lmIEhPU1RfRU5ESUFOTkVTUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtCisgKgorICogUGFyYW1ldGVyczoKKyAqCWRhdGEJMzItYml0IGFsaWduZWQgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNoZWNrc3VtbWVkCisgKglzaXoJCXNpemUgb2YgdGhlIGRhdGEgdG8gYmUgY2hlY2tzdW1tZWQgaW4gc2l6ZW9mKCkgdW5pdHMuCisgKgorICogRWZmZWN0OgorICoJUmV0dXJucyBhIGNoZWNrc3VtIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2ssIHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgYnl0ZXMKKyAqIGluIGJpZy1lbmRpYW4gb3JkZXIuCisgKgorICogTm90ZXM6CisgKglJbiBhIGJpZy1lbmRpYW4gaG9zdCwgdGhpbmdzIGxpa2UgdGhlIHN0cmluZyB0YWJsZSBhcmUgc3RvcmVkIGFzIGJ5dGVzCisgKiBpbiBob3N0IG9yZGVyLiBCdXQgZGxsY3JlYXRlIGFsd2F5cyBjaGVja3N1bXMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KKyAqIEl0IGlzIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgaGFuZGxlIHRoZSBkaWZmZXJlbmNlIGEgd29yZCBhdCBhIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3UzMiBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtKHZvaWQgKmRhdGEsIHVuc2lnbmVkIHNpeikKK3sKKwl1MzIgc3VtLCB0ZW1wOworCXUzMiAqZHA7CisJaW50IGxlZnQ7CisKKwlzdW0gPSAwOworCWRwID0gKHUzMiAqKSBkYXRhOworCisJZm9yIChsZWZ0ID0gc2l6OyBsZWZ0ID4gMDsgbGVmdCAtPSBzaXplb2YodTMyKSkgeworCQl0ZW1wID0gKmRwKys7CisJCXN1bSArPSB0ZW1wIDw8IEJJVFNfUEVSX0JZVEUgKiAzOworCQlzdW0gKz0gdGVtcCA+PiBCSVRTX1BFUl9CWVRFICogMzsKKwkJc3VtICs9ICh0ZW1wID4+IEJJVFNfUEVSX0JZVEUpICYgKEJZVEVfTUFTSyA8PCBCSVRTX1BFUl9CWVRFKTsKKwkJc3VtICs9ICh0ZW1wICYgKEJZVEVfTUFTSyA8PCBCSVRTX1BFUl9CWVRFKSkgPDwgQklUU19QRVJfQllURTsKKwl9CisKKwlyZXR1cm4gc3VtOworfQkJCQkvKiBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtICovCisKKyNpZiAoVEFSR0VUX0FVX0JJVFMgPiA4KSAmJiAoVEFSR0VUX0FVX0JJVFMgPCAzMikKK3UzMiBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtMTYodm9pZCAqZGF0YSwgdW5zaWduZWQgc2l6KQoreworCXVpbnRfZmFzdDMyX3Qgc3VtLCB0ZW1wOworCXUzMiAqZHA7CisJaW50IGxlZnQ7CisKKwlzdW0gPSAwOworCWRwID0gKHUzMiAqKSBkYXRhOworCisJZm9yIChsZWZ0ID0gc2l6OyBsZWZ0ID4gMDsgbGVmdCAtPSBzaXplb2YodTMyKSkgeworCQl0ZW1wID0gKmRwKys7CisJCXN1bSArPSB0ZW1wIDw8IEJJVFNfUEVSX0JZVEUgKiAyOworCQlzdW0gKz0gdGVtcCA+PiBCSVRTX1BFUl9CWVRFICogMjsKKwl9CisKKwlyZXR1cm4gc3VtOworfQkJCQkvKiBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtMTYgKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgc3dhcF93b3JkcworICoKKyAqIFBhcmFtZXRlcnM6CisgKglkYXRhCTMyLWJpdCBhbGlnbmVkIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBzd2FwcGVkCisgKglzaXoJc2l6ZSBvZiB0aGUgZGF0YSB0byBiZSBzd2FwcGVkLgorICoJYml0bWFwCUJpdCBtYXAgb2YgaG93IHRvIHN3YXAgZWFjaCAzMi1iaXQgd29yZDsgMSA9PiAyIHNob3J0cywKKyAqCQkwID0+IDEgbG9uZworICoKKyAqIEVmZmVjdDoKKyAqCVN3YXBzIHRoZSBzcGVjaWZpZWQgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkIHN3YXBfd29yZHModm9pZCAqZGF0YSwgdW5zaWduZWQgc2l6LCB1bnNpZ25lZCBiaXRtYXApCit7CisJcmVnaXN0ZXIgaW50IGk7CisjaWYgVEFSR0VUX0FVX0JJVFMgPCAxNgorCXJlZ2lzdGVyIHUxNiAqc3A7CisjZW5kaWYKKwlyZWdpc3RlciB1MzIgKmxwOworCisJc2l6IC89IHNpemVvZih1MTYpOworCisjaWYgVEFSR0VUX0FVX0JJVFMgPCAxNgorCS8qIHBhc3MgMTogZG8gYWxsIHRoZSBieXRlcyAqLworCWkgPSBzaXo7CisJc3AgPSAodTE2ICopIGRhdGE7CisJZG8geworCQlyZWdpc3RlciB1MTYgdG1wOworCQl0bXAgPSAqc3A7CisJCSpzcCsrID0gU1dBUDE2Qlk4KHRtcCk7CisJfSB3aGlsZSAoKGkgLT0gMSkgPiAwKTsKKyNlbmRpZgorCisjaWYgVEFSR0VUX0FVX0JJVFMgPCAzMgorCS8qIHBhc3MgMjogZml4dXAgdGhlIDMyLWJpdCB3b3JkcyAqLworCWkgPSBzaXogPj4gMTsKKwlscCA9ICh1MzIgKikgZGF0YTsKKwlkbyB7CisJCWlmICgoYml0bWFwICYgMSkgPT0gMCkgeworCQkJcmVnaXN0ZXIgdTMyIHRtcDsKKwkJCXRtcCA9ICpscDsKKwkJCSpscCA9IFNXQVAzMkJZMTYodG1wKTsKKwkJfQorCQlscCArPSAxOworCQliaXRtYXAgPj49IDE7CisJfSB3aGlsZSAoKGkgLT0gMSkgPiAwKTsKKyNlbmRpZgorfQkJCQkvKiBzd2FwX3dvcmRzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgY29weV90Z3Rfc3RyaW5ncworICoKKyAqIFBhcmFtZXRlcnM6CisgKglkc3RwCQlEZXN0aW5hdGlvbiBhZGRyZXNzLiAgQXNzdW1lZCB0byBiZSAzMi1iaXQgYWxpZ25lZAorICoJc3JjcAkJU291cmNlIGFkZHJlc3MuICBBc3N1bWVkIHRvIGJlIDMyLWJpdCBhbGlnbmVkCisgKgljaGFyY291bnQJTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weS4KKyAqCisgKiBFZmZlY3Q6CisgKglDb3BpZXMgc3RyaW5ncyBmcm9tIHRoZSBzb3VyY2UgKHdoaWNoIGlzIGluIHVzdWFsIC5kb2YgZmlsZSBvcmRlciBvbgorICogdGhlIGxvYWRpbmcgcHJvY2Vzc29yKSB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyICh3aGljaCBzaG91bGQgYmUgaW4gcHJvcGVyCisgKiB0YXJnZXQgYWRkcmVzc2FibGUgdW5pdCBvcmRlcikuICBNYWtlcyBzdXJlIHRoZSBsYXN0IHN0cmluZyBpbiB0aGUKKyAqIGJ1ZmZlciBpcyBOVUxMIHRlcm1pbmF0ZWQgKGZvciBzYWZldHkpLgorICogUmV0dXJucyB0aGUgZmlyc3QgdW51c2VkIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBjaGFyICpjb3B5X3RndF9zdHJpbmdzKHZvaWQgKmRzdHAsIHZvaWQgKnNyY3AsIHVuc2lnbmVkIGNoYXJjb3VudCkKK3sKKwlyZWdpc3RlciB0Z3RfYXVfdCAqc3JjID0gKHRndF9hdV90ICopIHNyY3A7CisJcmVnaXN0ZXIgdGd0X2F1X3QgKmRzdCA9ICh0Z3RfYXVfdCAqKSBkc3RwOworCXJlZ2lzdGVyIGludCBjbnQgPSBjaGFyY291bnQ7CisJZG8geworI2lmIFRBUkdFVF9BVV9CSVRTIDw9IEJJVFNfUEVSX0FVCisJCS8qIGJ5dGUtc3dhcHBpbmcgaXNzdWVzIG1heSBleGlzdCBmb3Igc3RyaW5ncyBvbiB0YXJnZXQgKi8KKwkJKmRzdCsrID0gKnNyYysrOworI2Vsc2UKKwkJKmRzdCsrID0gKnNyYysrOworI2VuZGlmCisJfSB3aGlsZSAoKGNudCAtPSAoc2l6ZW9mKHRndF9hdV90KSAqIEJJVFNfUEVSX0FVIC8gQklUU19QRVJfQllURSkpID4gMCk7CisJLyphcHBseSBmb3JjZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RyaW5nIHRhYmxlIGhhcyBudWxsIHRlcm1pbmF0b3IgKi8KKyNpZiAoQklUU19QRVJfQVUgPT0gQklUU19QRVJfQllURSkgJiYgKFRBUkdFVF9BVV9CSVRTID09IEJJVFNfUEVSX0JZVEUpCisJZHN0Wy0xXSA9IDA7CisjZWxzZQorCS8qIGxpdHRsZSBlbmRpYW4gKi8KKwlkc3RbLTFdICY9ICgxIDw8IChCSVRTX1BFUl9BVSAtIEJJVFNfUEVSX0JZVEUpKSAtIDE7CisjZW5kaWYKKwlyZXR1cm4gKGNoYXIgKilkc3Q7Cit9CQkJCS8qIGNvcHlfdGd0X3N0cmluZ3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBpbml0X21vZHVsZV9oYW5kbGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJbm9uZQorICoKKyAqIEVmZmVjdDoKKyAqCUluaXRpYWxpemVzIHRoZSBtb2R1bGUgaGFuZGxlIHdlIHVzZSB0byBlbmFibGUgdW5sb2FkaW5nLCBhbmQgaW5zdGFsbHMKKyAqIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0LgorICoKKyAqIE5vdGVzOgorICogVGhlIGhhbmRsZSByZXR1cm5lZCBmcm9tIGR5bmFtaWNfbG9hZF9tb2R1bGUgbmVlZHMgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZQorICogYWxsb2NhdGlvbnMgZG9uZSBmb3IgdGhlIG1vZHVsZSwgYW5kIGVuYWJsZSB0aGVtIHBsdXMgdGhlIG1vZHVsZXMgc3ltYm9scyB0bworICogYmUgZGVhbGxvY2F0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjaWZuZGVmIF9CSUdfRU5ESUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gZGxsdmlld19pbmZvX2luaXQgPSB7ICIuZGxsdmlldyIsIDAsIDAsCisJKGxkcl9hZGRyKS0xLCBEQkdfTElTVF9QQUdFLCBETE9BRF9EQVRBLCAwCit9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyBkbGx2aWV3X2luZm9faW5pdCA9IHsgIi5kbGx2aWV3IiwgMCwgMCwKKwkobGRyX2FkZHIpLTEsIERMT0FEX0RBVEEsIERCR19MSVNUX1BBR0UsIDAKK307CisjZW5kaWYKK3N0YXRpYyB2b2lkIGluaXRfbW9kdWxlX2hhbmRsZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcykKK3sKKwlzdHJ1Y3QgbXlfaGFuZGxlICpobmRsOworCXUxNiBjdXJyX3NlY3Q7CisJc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmFzZWNzOworCXN0cnVjdCBkbGxfbW9kdWxlICpkYm1vZDsKKwlzdHJ1Y3QgZGxsX3NlY3QgKmRic2VjOworCXN0cnVjdCBkYmdfbWlycm9yX3Jvb3QgKm1saXN0OworCXJlZ2lzdGVyIGNoYXIgKmNwOworCXN0cnVjdCBtb2R1bGVzX2hlYWRlciBtaGRyOworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvIGRsbHZpZXdfaW5mbzsKKwlzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKmRlYnVnX21pcnJvcl9zeW07CisJaG5kbCA9IGRsdGhpcy0+bXloYW5kbGU7CisJaWYgKCFobmRsKQorCQlyZXR1cm47CQkvKiBtdXN0IGJlIGVycm9ycyBkZXRlY3RlZCwgc28gZm9yZ2V0IGl0ICovCisKKwkvKiAgU3RvcmUgdGhlIHNlY3Rpb24gY291bnQgKi8KKwlobmRsLT5zZWNuX2NvdW50ID0gZGx0aGlzLT5hbGxvY2F0ZWRfc2Vjbl9jb3VudDsKKworCS8qICBJZiBhIHRyYW1wb2xpbmUgc2VjdGlvbiB3YXMgY3JlYXRlZCwgYWRkIGl0IGluICovCisJaWYgKGRsdGhpcy0+dHJhbXAudHJhbXBfc2VjdF9uZXh0X2FkZHIgIT0gMCkKKwkJaG5kbC0+c2Vjbl9jb3VudCArPSAxOworCisJaG5kbC0+c2Vjbl9jb3VudCA9IGhuZGwtPnNlY25fY291bnQgPDwgMTsKKworCWhuZGwtPnNlY25fY291bnQgPSBkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50IDw8IDE7CisjaWZuZGVmIFRBUkdFVF9FTkRJQU5ORVNTCisJaWYgKGRsdGhpcy0+YmlnX2VfdGFyZ2V0KQorCQlobmRsLT5zZWNuX2NvdW50ICs9IDE7CS8qIGZsYWcgZm9yIGJpZy1lbmRpYW4gKi8KKyNlbmRpZgorCWlmIChkbHRoaXMtPmRsb2FkX2VycmNvdW50KQorCQlyZXR1cm47CQkvKiBhYmFuZG9uIGlmIGVycm9ycyBkZXRlY3RlZCAqLworCS8qIExvY2F0ZSB0aGUgc3ltYm9sIHRoYXQgbmFtZXMgdGhlIGhlYWRlciBmb3IgdGhlIENDUyBkZWJ1ZyBsaXN0CisJICAgb2YgbW9kdWxlcy4gSWYgbm90IGZvdW5kLCB3ZSBqdXN0IGRvbid0IGdlbmVyYXRlIHRoZSBkZWJ1ZyByZWNvcmQuCisJICAgSWYgZm91bmQsIHdlIGNyZWF0ZSBvdXIgbW9kdWxlcyBsaXN0LiAgV2UgbWFrZSBzdXJlIHRvIGNyZWF0ZSB0aGUKKwkgICBsb2FkZXJfZGxsdmlld19yb290IGV2ZW4gaWYgdGhlcmUgaXMgbm8gcmVsb2NhdGlvbiBpbmZvIHRvIHJlY29yZCwKKwkgICBqdXN0IHRvIHRyeSB0byBwdXQgYm90aCBzeW1ib2xzIGluIHRoZSBzYW1lIHN5bWJvbCB0YWJsZSBhbmQKKwkgICBtb2R1bGUuICovCisJZGVidWdfbWlycm9yX3N5bSA9IGRsdGhpcy0+bXlzeW0tPmZpbmRfbWF0Y2hpbmdfc3ltYm9sKGRsdGhpcy0+bXlzeW0sCisJCQkJCQkJbG9hZGVyX2RsbHZpZXdfcm9vdCk7CisJaWYgKCFkZWJ1Z19taXJyb3Jfc3ltKSB7CisJCXN0cnVjdCBkeW5sb2FkX3N5bWJvbCAqZGxtb2RzeW07CisJCXN0cnVjdCBkYmdfbWlycm9yX3Jvb3QgKm1sc3Q7CisKKwkJLyogb3VyIHJvb3Qgc3ltYm9sIGlzIG5vdCB5ZXQgcHJlc2VudDsKKwkJICAgY2hlY2sgaWYgd2UgaGF2ZSBETE1vZHVsZXMgZGVmaW5lZCAqLworCQlkbG1vZHN5bSA9IGRsdGhpcy0+bXlzeW0tPmZpbmRfbWF0Y2hpbmdfc3ltYm9sKGRsdGhpcy0+bXlzeW0sCisJCQkJCQkJTElOS0VSX01PRFVMRVNfSEVBREVSKTsKKwkJaWYgKCFkbG1vZHN5bSkKKwkJCXJldHVybjsJLyogbm8gRExNb2R1bGVzIGxpc3Qgc28gbm8gZGVidWcgaW5mbyAqLworCQkvKiBpZiB3ZSBoYXZlIERMTW9kdWxlcyBkZWZpbmVkLCBjb25zdHJ1Y3Qgb3VyIGhlYWRlciAqLworCQltbHN0ID0gKHN0cnVjdCBkYmdfbWlycm9yX3Jvb3QgKikKKwkJICAgIGRsdGhpcy0+bXlzeW0tPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQkgIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgZGJnX21pcnJvcl9yb290KSk7CisJCWlmICghbWxzdCkgeworCQkJRExfRVJST1IoZXJyX2FsbG9jLCBzaXplb2Yoc3RydWN0IGRiZ19taXJyb3Jfcm9vdCkpOworCQkJcmV0dXJuOworCQl9CisJCW1sc3QtPmhuZXh0ID0gTlVMTDsKKwkJbWxzdC0+Y2hhbmdlcyA9IDA7CisJCW1sc3QtPnJlZmNvdW50ID0gMDsKKwkJbWxzdC0+ZGJ0aGlzID0gVERBVEFfVE9fVEFERFIoZGxtb2RzeW0tPnZhbHVlKTsKKwkJLyogYWRkIG91ciByb290IHN5bWJvbCAqLworCQlkZWJ1Z19taXJyb3Jfc3ltID0gZGx0aGlzLT5teXN5bS0+YWRkX3RvX3N5bWJvbF90YWJsZQorCQkgICAgKGRsdGhpcy0+bXlzeW0sIGxvYWRlcl9kbGx2aWV3X3Jvb3QsCisJCSAgICAgKHVuc2lnbmVkKWRsdGhpcy0+bXloYW5kbGUpOworCQlpZiAoIWRlYnVnX21pcnJvcl9zeW0pIHsKKwkJCS8qIGZhaWxlZCwgcmVjb3ZlciBtZW1vcnkgKi8KKwkJCWRsdGhpcy0+bXlzeW0tPmRsb2FkX2RlYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwgbWxzdCk7CisJCQlyZXR1cm47CisJCX0KKwkJZGVidWdfbWlycm9yX3N5bS0+dmFsdWUgPSAodTMyKSBtbHN0OworCX0KKwkvKiBGaXJzdCBjcmVhdGUgdGhlIERMTHZpZXcgcmVjb3JkIGFuZCBzdHVmZiBpdCBpbnRvIHRoZSBidWZmZXIuCisJICAgVGhlbiB3cml0ZSBpdCB0byB0aGUgRFNQLiAgUmVjb3JkIHBlcnRpbmVudCBsb2NhdGlvbnMgaW4gb3VyIGhuZGwsCisJICAgYW5kIGFkZCBpdCB0byB0aGUgcGVyLXByb2Nlc3NvciBsaXN0IG9mIGhhbmRsZXMgd2l0aCBkZWJ1ZyBpbmZvLiAqLworI2lmbmRlZiBERUJVR19IRUFERVJfSU5fTE9BREVSCisJbWxpc3QgPSAoc3RydWN0IGRiZ19taXJyb3Jfcm9vdCAqKWRlYnVnX21pcnJvcl9zeW0tPnZhbHVlOworCWlmICghbWxpc3QpCisJCXJldHVybjsKKyNlbHNlCisJbWxpc3QgPSAoc3RydWN0IGRiZ19taXJyb3Jfcm9vdCAqKSZkZWJ1Z19saXN0X2hlYWRlcjsKKyNlbmRpZgorCWhuZGwtPmRtLmhyb290ID0gbWxpc3Q7CS8qIHNldCBwb2ludGVyIHRvIHJvb3QgaW50byBvdXIgaGFuZGxlICovCisJaWYgKCFkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50KQorCQlyZXR1cm47CQkvKiBubyBsb2FkIGFkZHJlc3NlcyB0byBiZSByZWNvcmRlZCAqLworCS8qIHJldXNlIHRlbXBvcmFyeSBzeW1ib2wgc3RvcmFnZSAqLworCWRibW9kID0gKHN0cnVjdCBkbGxfbW9kdWxlICopZGx0aGlzLT5sb2NhbF9zeW10YWI7CisJLyogQ3JlYXRlIHRoZSBETEx2aWV3IHJlY29yZCBpbiB0aGUgbWVtb3J5IHdlIHJldGFpbiBmb3Igb3VyIGhhbmRsZSAqLworCWRibW9kLT5udW1fc2VjdHMgPSBkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50OworCWRibW9kLT50aW1lc3RhbXAgPSBkbHRoaXMtPnZlcmlmeS5kdl90aW1kYXQ7CisJZGJtb2QtPnZlcnNpb24gPSBJTklUX1ZFUlNJT047CisJZGJtb2QtPnZlcmlmaWNhdGlvbiA9IFZFUklGSUNBVElPTjsKKwlhc2VjcyA9IGRsdGhpcy0+bGRyX3NlY3Rpb25zOworCWRic2VjID0gZGJtb2QtPnNlY3RzOworCWZvciAoY3Vycl9zZWN0ID0gZGx0aGlzLT5hbGxvY2F0ZWRfc2Vjbl9jb3VudDsKKwkgICAgIGN1cnJfc2VjdCA+IDA7IGN1cnJfc2VjdCAtPSAxKSB7CisJCWRic2VjLT5zZWN0X2xvYWRfYWRyID0gYXNlY3MtPmxvYWRfYWRkcjsKKwkJZGJzZWMtPnNlY3RfcnVuX2FkciA9IGFzZWNzLT5ydW5fYWRkcjsKKwkJZGJzZWMgKz0gMTsKKwkJYXNlY3MgKz0gMTsKKwl9CisKKwkvKiAgSWYgYSB0cmFtcG9saW5lIHNlY3Rpb24gd2FzIGNyZWF0ZWQgZ28gYWhlYWQgYW5kIGFkZCBpdHMgaW5mbyAqLworCWlmIChkbHRoaXMtPnRyYW1wLnRyYW1wX3NlY3RfbmV4dF9hZGRyICE9IDApIHsKKwkJZGJtb2QtPm51bV9zZWN0cysrOworCQlkYnNlYy0+c2VjdF9sb2FkX2FkciA9IGFzZWNzLT5sb2FkX2FkZHI7CisJCWRic2VjLT5zZWN0X3J1bl9hZHIgPSBhc2Vjcy0+cnVuX2FkZHI7CisJCWRic2VjKys7CisJCWFzZWNzKys7CisJfQorCisJLyogbm93IGNyYW0gaW4gdGhlIG5hbWVzICovCisJY3AgPSBjb3B5X3RndF9zdHJpbmdzKGRic2VjLCBkbHRoaXMtPnN0cl9oZWFkLAorCQkJICAgICAgZGx0aGlzLT5kZWJ1Z19zdHJpbmdfc2l6ZSk7CisKKwkvKiBJZiBhIHRyYW1wb2xpbmUgc2VjdGlvbiB3YXMgY3JlYXRlZCwgYWRkIGl0cyBuYW1lIHNvIERMTFZpZXcKKwkgKiBjYW4gc2hvdyB0aGUgdXNlciB0aGUgc2VjdGlvbiBpbmZvLiAqLworCWlmIChkbHRoaXMtPnRyYW1wLnRyYW1wX3NlY3RfbmV4dF9hZGRyICE9IDApIHsKKwkJY3AgPSBjb3B5X3RndF9zdHJpbmdzKGNwLAorCQkJCSAgICAgIGRsdGhpcy0+dHJhbXAuZmluYWxfc3RyaW5nX3RhYmxlLAorCQkJCSAgICAgIHN0cmxlbihkbHRoaXMtPnRyYW1wLmZpbmFsX3N0cmluZ190YWJsZSkgKworCQkJCSAgICAgIDEpOworCX0KKworCS8qIHJvdW5kIG9mZiB0aGUgc2l6ZSBvZiB0aGUgZGVidWcgcmVjb3JkLCBhbmQgcmVtZW1iZXIgc2FtZSAqLworCWhuZGwtPmRtLmRic2l6ID0gSE9TVF9UT19UREFUQV9ST1VORChjcCAtIChjaGFyICopZGJtb2QpOworCSpjcCA9IDA7CQkvKiBzdHJpY3RseSB0byBtYWtlIG91ciB0ZXN0IGhhcm5lc3MgaGFwcHkgKi8KKwlkbGx2aWV3X2luZm8gPSBkbGx2aWV3X2luZm9faW5pdDsKKwlkbGx2aWV3X2luZm8uc2l6ZSA9IFREQVRBX1RPX1RBRERSKGhuZGwtPmRtLmRic2l6KTsKKwkvKiBJbml0aWFsaXplIG1lbW9yeSBjb250ZXh0IHRvIGRlZmF1bHQgaGVhcCAqLworCWRsbHZpZXdfaW5mby5jb250ZXh0ID0gMDsKKwlobmRsLT5kbS5jb250ZXh0ID0gMDsKKwkvKiBmaWxsIGluIG5leHQgcG9pbnRlciBhbmQgc2l6ZSAqLworCWlmIChtbGlzdC0+aG5leHQpIHsKKwkJZGJtb2QtPm5leHRfbW9kdWxlID0gVEFERFJfVE9fVERBVEEobWxpc3QtPmhuZXh0LT5kbS5kYnRoaXMpOworCQlkYm1vZC0+bmV4dF9tb2R1bGVfc2l6ZSA9IG1saXN0LT5obmV4dC0+ZG0uZGJzaXo7CisJfSBlbHNlIHsKKwkJZGJtb2QtPm5leHRfbW9kdWxlX3NpemUgPSAwOworCQlkYm1vZC0+bmV4dF9tb2R1bGUgPSAwOworCX0KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9uLURTUCBETEx2aWV3IGRlYnVnIHJlY29yZCAqLworCWlmICghZGx0aGlzLT5teWFsbG9jKQorCQlyZXR1cm47CisJaWYgKCFkbHRoaXMtPm15YWxsb2MtPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlhbGxvYywgJmRsbHZpZXdfaW5mbywKKwkJCQkJICAgICBIT1NUX1RPX1RBRERSKHNpemVvZih1MzIpKSkpIHsKKwkJcmV0dXJuOworCX0KKwkvKiBTdG9yZSBsb2FkIGFkZHJlc3Mgb2YgLmRsbHZpZXcgc2VjdGlvbiAqLworCWhuZGwtPmRtLmRidGhpcyA9IGRsbHZpZXdfaW5mby5sb2FkX2FkZHI7CisJLyogU3RvcmUgbWVtb3J5IGNvbnRleHQgKHNlZ2lkKSBpbiB3aGljaCAuZGxsdmlldyBzZWN0aW9uCisJICogd2FzICBhbGxvY2F0ZWQgKi8KKwlobmRsLT5kbS5jb250ZXh0ID0gZGxsdmlld19pbmZvLmNvbnRleHQ7CisJbWxpc3QtPnJlZmNvdW50ICs9IDE7CisJLyogc3dhcCBieXRlcyBpbiB0aGUgZW50aXJlIGRlYnVnIHJlY29yZCwgYnV0IG5vdCB0aGUgc3RyaW5nIHRhYmxlICovCisJaWYgKFRBUkdFVF9FTkRJQU5ORVNTX0RJRkZFUlMoVEFSR0VUX0JJR19FTkRJQU4pKSB7CisJCXN3YXBfd29yZHMoZGJtb2QsIChjaGFyICopZGJzZWMgLSAoY2hhciAqKWRibW9kLAorCQkJICAgRExMX01PRFVMRV9CSVRNQVApOworCX0KKwkvKiBVcGRhdGUgdGhlIERMTHZpZXcgbGlzdCBvbiB0aGUgRFNQIHdyaXRlIG5ldyByZWNvcmQgKi8KKwlpZiAoIWRsdGhpcy0+bXlpby0+d3JpdGVtZW0oZGx0aGlzLT5teWlvLCBkYm1vZCwKKwkJCQkgICAgZGxsdmlld19pbmZvLmxvYWRfYWRkciwgJmRsbHZpZXdfaW5mbywKKwkJCQkgICAgVEFERFJfVE9fSE9TVChkbGx2aWV3X2luZm8uc2l6ZSkpKSB7CisJCXJldHVybjsKKwl9CisJLyogd3JpdGUgbmV3IGhlYWRlciAqLworCW1oZHIuZmlyc3RfbW9kdWxlX3NpemUgPSBobmRsLT5kbS5kYnNpejsKKwltaGRyLmZpcnN0X21vZHVsZSA9IFRBRERSX1RPX1REQVRBKGRsbHZpZXdfaW5mby5sb2FkX2FkZHIpOworCS8qIHN3YXAgYnl0ZXMgaW4gdGhlIG1vZHVsZSBoZWFkZXIsIGlmIG5lZWRlZCAqLworCWlmIChUQVJHRVRfRU5ESUFOTkVTU19ESUZGRVJTKFRBUkdFVF9CSUdfRU5ESUFOKSkgeworCQlzd2FwX3dvcmRzKCZtaGRyLCBzaXplb2Yoc3RydWN0IG1vZHVsZXNfaGVhZGVyKSAtIHNpemVvZih1MTYpLAorCQkJICAgTU9EVUxFU19IRUFERVJfQklUTUFQKTsKKwl9CisJZGxsdmlld19pbmZvID0gZGxsdmlld19pbmZvX2luaXQ7CisJaWYgKCFkbHRoaXMtPm15aW8tPndyaXRlbWVtKGRsdGhpcy0+bXlpbywgJm1oZHIsIG1saXN0LT5kYnRoaXMsCisJCQkJICAgICZkbGx2aWV3X2luZm8sCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgbW9kdWxlc19oZWFkZXIpIC0KKwkJCQkgICAgc2l6ZW9mKHUxNikpKSB7CisJCXJldHVybjsKKwl9CisJLyogQWRkIHRoZSBtb2R1bGUgaGFuZGxlIHRvIHRoaXMgcHJvY2Vzc29yJ3MgbGlzdAorCSAgIG9mIGhhbmRsZXMgd2l0aCBkZWJ1ZyBpbmZvICovCisJaG5kbC0+ZG0uaG5leHQgPSBtbGlzdC0+aG5leHQ7CisJaWYgKGhuZGwtPmRtLmhuZXh0KQorCQlobmRsLT5kbS5obmV4dC0+ZG0uaHByZXYgPSBobmRsOworCWhuZGwtPmRtLmhwcmV2ID0gKHN0cnVjdCBteV9oYW5kbGUgKiltbGlzdDsKKwltbGlzdC0+aG5leHQgPSBobmRsOwkvKiBpbnNlcnQgYWZ0ZXIgcm9vdCAqLworfQkJCQkvKiBpbml0X21vZHVsZV9oYW5kbGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkeW5hbWljX3VubG9hZF9tb2R1bGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJbWhhbmRsZQlBIG1vZHVsZSBoYW5kbGUgZnJvbSBkeW5hbWljX2xvYWRfbW9kdWxlCisgKglzeW1zCUhvc3Qtc2lkZSBzeW1ib2wgdGFibGUgYW5kIG1hbGxvYy9mcmVlIGZ1bmN0aW9ucworICoJYWxsb2MJVGFyZ2V0LXNpZGUgbWVtb3J5IGFsbG9jYXRpb24KKyAqCisgKiBFZmZlY3Q6CisgKglUaGUgbW9kdWxlIHNwZWNpZmllZCBieSBtaGFuZGxlIGlzIHVubG9hZGVkLiAgVW5sb2FkaW5nIGNhdXNlcyBhbGwKKyAqIHRhcmdldCBtZW1vcnkgdG8gYmUgZGVhbGxvY2F0ZWQsIGFsbCBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIG1vZHVsZSB0bworICogYmUgcHVyZ2VkLCBhbmQgYW55IGhvc3Qtc2lkZSBzdG9yYWdlIHVzZWQgYnkgdGhlIGR5bmFtaWMgbG9hZGVyIGZvcgorICogdGhpcyBtb2R1bGUgdG8gYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCVplcm8gZm9yIHN1Y2Nlc3MuIE9uIGVycm9yLCB0aGUgbnVtYmVyIG9mIGVycm9ycyBkZXRlY3RlZCBpcyByZXR1cm5lZC4KKyAqIEluZGl2aWR1YWwgZXJyb3JzIGFyZSByZXBvcnRlZCB1c2luZyBzeW1zLT5lcnJvcl9yZXBvcnQoKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworaW50IGR5bmFtaWNfdW5sb2FkX21vZHVsZSh2b2lkICptaGFuZGxlLAorCQkJICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICpzeW1zLAorCQkJICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKmFsbG9jLAorCQkJICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqaW5pdCkKK3sKKwlzMTYgY3Vycl9zZWN0OworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICphc2VjczsKKwlzdHJ1Y3QgbXlfaGFuZGxlICpobmRsOworCXN0cnVjdCBkYmdfbWlycm9yX3Jvb3QgKnJvb3Q7CisJdW5zaWduZWQgZXJyY291bnQgPSAwOworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvIGRsbHZpZXdfaW5mbyA9IGRsbHZpZXdfaW5mb19pbml0OworCXN0cnVjdCBtb2R1bGVzX2hlYWRlciBtaGRyOworCisJaG5kbCA9IChzdHJ1Y3QgbXlfaGFuZGxlICopbWhhbmRsZTsKKwlpZiAoIWhuZGwpCisJCXJldHVybiAwOwkvKiBpZiBoYW5kbGUgaXMgbnVsbCwgbm90aGluZyB0byBkbyAqLworCS8qIENsZWFyIG91dCB0aGUgbW9kdWxlIHN5bWJvbHMKKwkgKiBOb3RlIHRoYXQgaWYgdGhpcyBpcyB0aGUgbW9kdWxlIHRoYXQgZGVmaW5lZCBNT0RVTEVTX0hFQURFUgorCSAodGhlIGhlYWQgb2YgdGhlIHRhcmdldCBkZWJ1ZyBsaXN0KQorCSAqIHRoZW4gdGhpcyBvcGVyYXRpb24gd2lsbCBibG93IGF3YXkgdGhhdCBzeW1ib2wuCisJIEl0IHdpbGwgdGhlcmVmb3JlIGJlIGltcG9zc2libGUgZm9yIHN1YnNlcXVlbnQKKwkgKiBvcGVyYXRpb25zIHRvIGFkZCBlbnRyaWVzIHRvIHRoaXMgdW4tcmVmZXJlbmNlYWJsZSBsaXN0LiAqLworCWlmICghc3ltcykKKwkJcmV0dXJuIDE7CisJc3ltcy0+cHVyZ2Vfc3ltYm9sX3RhYmxlKHN5bXMsICh1bnNpZ25lZClobmRsKTsKKwkvKiBEZWFsbG9jYXRlIHRhcmdldCBtZW1vcnkgZm9yIHNlY3Rpb25zCisJICogTk9URTogVGhlIHRyYW1wb2xpbmUgc2VjdGlvbiwgaWYgY3JlYXRlZCwgZ2V0cyBkZWxldGVkIGhlcmUsIHRvbyAqLworCisJYXNlY3MgPSBobmRsLT5zZWNuczsKKwlpZiAoYWxsb2MpCisJCWZvciAoY3Vycl9zZWN0ID0gKGhuZGwtPnNlY25fY291bnQgPj4gMSk7IGN1cnJfc2VjdCA+IDA7CisJCSAgICAgY3Vycl9zZWN0IC09IDEpIHsKKwkJCWFzZWNzLT5uYW1lID0gTlVMTDsKKwkJCWFsbG9jLT5kbG9hZF9kZWFsbG9jYXRlKGFsbG9jLCBhc2VjcysrKTsKKwkJfQorCXJvb3QgPSBobmRsLT5kbS5ocm9vdDsKKwlpZiAoIXJvb3QpIHsKKwkJLyogdGhlcmUgaXMgYSBkZWJ1ZyBsaXN0IGNvbnRhaW5pbmcgdGhpcyBtb2R1bGUgKi8KKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaWYgKCFobmRsLT5kbS5kYnRoaXMpIHsJLyogdGFyZ2V0LXNpZGUgZGxsdmlldyByZWNvcmQgZXhpc3RzICovCisJCWdvdG8gbG9vcF9lbmQ7CisJfQorCS8qIFJldHJpZXZlIG1lbW9yeSBjb250ZXh0IGluIHdoaWNoIC5kbGx2aWV3IHdhcyBhbGxvY2F0ZWQgKi8KKwlkbGx2aWV3X2luZm8uY29udGV4dCA9IGhuZGwtPmRtLmNvbnRleHQ7CisJaWYgKGhuZGwtPmRtLmhwcmV2ID09IGhuZGwpCisJCWdvdG8gZXhpdHVubHRndDsKKworCS8qIHRhcmdldC1zaWRlIGRsbHZpZXcgcmVjb3JkIGlzIGluIGxpc3QgKi8KKwkvKiBkZXF1ZXVlIHRoaXMgcmVjb3JkIGZyb20gb3VyIEdQUC1zaWRlIG1pcnJvciBsaXN0ICovCisJaG5kbC0+ZG0uaHByZXYtPmRtLmhuZXh0ID0gaG5kbC0+ZG0uaG5leHQ7CisJaWYgKGhuZGwtPmRtLmhuZXh0KQorCQlobmRsLT5kbS5obmV4dC0+ZG0uaHByZXYgPSBobmRsLT5kbS5ocHJldjsKKwkvKiBVcGRhdGUgbmV4dF9tb2R1bGUgb2YgcHJldmlvdXMgZW50cnkgaW4gdGFyZ2V0IGxpc3QKKwkgKiBXZSBhcmUgdXNpbmcgbWhkciBoZXJlIGFzIGEgc3Vycm9nYXRlIGZvciBlaXRoZXIgYQorCSBzdHJ1Y3QgbW9kdWxlc19oZWFkZXIgb3IgYSBkbGxfbW9kdWxlICovCisJaWYgKGhuZGwtPmRtLmhuZXh0KSB7CisJCW1oZHIuZmlyc3RfbW9kdWxlID0gVEFERFJfVE9fVERBVEEoaG5kbC0+ZG0uaG5leHQtPmRtLmRidGhpcyk7CisJCW1oZHIuZmlyc3RfbW9kdWxlX3NpemUgPSBobmRsLT5kbS5obmV4dC0+ZG0uZGJzaXo7CisJfSBlbHNlIHsKKwkJbWhkci5maXJzdF9tb2R1bGUgPSAwOworCQltaGRyLmZpcnN0X21vZHVsZV9zaXplID0gMDsKKwl9CisJaWYgKCFpbml0KQorCQlnb3RvIGV4aXR1bmx0Z3Q7CisKKwlpZiAoIWluaXQtPmNvbm5lY3QoaW5pdCkpIHsKKwkJZGxvYWRfc3ltc19lcnJvcihzeW1zLCBpY29ubmVjdCk7CisJCWVycmNvdW50ICs9IDE7CisJCWdvdG8gZXhpdHVubHRndDsKKwl9CisJLyogc3dhcCBieXRlcyBpbiB0aGUgbW9kdWxlIGhlYWRlciwgaWYgbmVlZGVkICovCisJaWYgKFRBUkdFVF9FTkRJQU5ORVNTX0RJRkZFUlMoaG5kbC0+c2Vjbl9jb3VudCAmIDB4MSkpIHsKKwkJc3dhcF93b3JkcygmbWhkciwgc2l6ZW9mKHN0cnVjdCBtb2R1bGVzX2hlYWRlcikgLSBzaXplb2YodTE2KSwKKwkJCSAgIE1PRFVMRVNfSEVBREVSX0JJVE1BUCk7CisJfQorCWlmICghaW5pdC0+d3JpdGVtZW0oaW5pdCwgJm1oZHIsIGhuZGwtPmRtLmhwcmV2LT5kbS5kYnRoaXMsCisJCQkgICAgJmRsbHZpZXdfaW5mbywgc2l6ZW9mKHN0cnVjdCBtb2R1bGVzX2hlYWRlcikgLQorCQkJICAgIHNpemVvZihtaGRyLnVwZGF0ZV9mbGFnKSkpIHsKKwkJZGxvYWRfc3ltc19lcnJvcihzeW1zLCBkbHZ3cml0ZSk7CisJCWVycmNvdW50ICs9IDE7CisJfQorCS8qIHVwZGF0ZSBjaGFuZ2UgY291bnRlciAqLworCXJvb3QtPmNoYW5nZXMgKz0gMTsKKwlpZiAoIWluaXQtPndyaXRlbWVtKGluaXQsICYocm9vdC0+Y2hhbmdlcyksCisJCQkgICAgcm9vdC0+ZGJ0aGlzICsgSE9TVF9UT19UQUREUgorCQkJICAgIChzaXplb2YobWhkci5maXJzdF9tb2R1bGUpICsKKwkJCSAgICAgc2l6ZW9mKG1oZHIuZmlyc3RfbW9kdWxlX3NpemUpKSwKKwkJCSAgICAmZGxsdmlld19pbmZvLCBzaXplb2YobWhkci51cGRhdGVfZmxhZykpKSB7CisJCWRsb2FkX3N5bXNfZXJyb3Ioc3ltcywgZGx2d3JpdGUpOworCQllcnJjb3VudCArPSAxOworCX0KKwlpbml0LT5yZWxlYXNlKGluaXQpOworZXhpdHVubHRndDoKKwkvKiByZWxlYXNlIHRhcmdldCBzdG9yYWdlICovCisJZGxsdmlld19pbmZvLnNpemUgPSBUREFUQV9UT19UQUREUihobmRsLT5kbS5kYnNpeik7CisJZGxsdmlld19pbmZvLmxvYWRfYWRkciA9IGhuZGwtPmRtLmRidGhpczsKKwlpZiAoYWxsb2MpCisJCWFsbG9jLT5kbG9hZF9kZWFsbG9jYXRlKGFsbG9jLCAmZGxsdmlld19pbmZvKTsKKwlyb290LT5yZWZjb3VudCAtPSAxOworCS8qIHRhcmdldC1zaWRlIGRsbHZpZXcgcmVjb3JkIGV4aXN0cyAqLworbG9vcF9lbmQ6CisjaWZuZGVmIERFQlVHX0hFQURFUl9JTl9MT0FERVIKKwlpZiAocm9vdC0+cmVmY291bnQgPD0gMCkgeworCQkvKiBpZiBhbGwgcmVmZXJlbmNlcyBnb25lLCBibG93IG9mZiB0aGUgaGVhZGVyICovCisJCS8qIG91ciByb290IHN5bWJvbCBtYXkgYmUgZ29uZSBkdWUgdG8gdGhlIFB1cmdlIGFib3ZlLAorCQkgICBidXQgaWYgbm90LCBkbyBub3QgZGVzdHJveSB0aGUgcm9vdCAqLworCQlpZiAoc3ltcy0+ZmluZF9tYXRjaGluZ19zeW1ib2wKKwkJICAgIChzeW1zLCBsb2FkZXJfZGxsdmlld19yb290KSA9PSBOVUxMKQorCQkJc3ltcy0+ZGxvYWRfZGVhbGxvY2F0ZShzeW1zLCByb290KTsKKwl9CisjZW5kaWYKK2Z1bmNfZW5kOgorCS8qIHRoZXJlIGlzIGEgZGVidWcgbGlzdCBjb250YWluaW5nIHRoaXMgbW9kdWxlICovCisJc3ltcy0+ZGxvYWRfZGVhbGxvY2F0ZShzeW1zLCBtaGFuZGxlKTsJLyogcmVsZWFzZSBvdXIgc3RvcmFnZSAqLworCXJldHVybiBlcnJjb3VudDsKK30JCQkJLyogZHluYW1pY191bmxvYWRfbW9kdWxlICovCisKKyNpZiBCSVRTX1BFUl9BVSA+IEJJVFNfUEVSX0JZVEUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgdW5wYWNrX25hbWUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJc29mZnNldAlCeXRlIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcgdGFibGUKKyAqCisgKiBFZmZlY3Q6CisgKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgb2Zmc2V0IHN1cHBsaWVkLCBvcgorICogTlVMTCBmb3IgZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgY2hhciAqdW5wYWNrX25hbWUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIHUzMiBzb2Zmc2V0KQoreworCXU4IHRtcCwgKnNyYzsKKwljaGFyICpkc3Q7CisKKwlpZiAoc29mZnNldCA+PSBkbHRoaXMtPmRmaWxlX2hkci5kZl9zdHJ0YWJfc2l6ZSkgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsICJCYWQgc3RyaW5nIHRhYmxlIG9mZnNldCAiIEZNVF9VSTMyLAorCQkJICAgIHNvZmZzZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3JjID0gKHVpbnRfbGVhc3Q4X3QgKikgZGx0aGlzLT5zdHJfaGVhZCArCisJICAgIChzb2Zmc2V0ID4+IChMT0dfQklUU19QRVJfQVUgLSBMT0dfQklUU19QRVJfQllURSkpOworCWRzdCA9IGRsdGhpcy0+c3RyX3RlbXA7CisJaWYgKHNvZmZzZXQgJiAxKQorCQkqZHN0KysgPSAqc3JjKys7CS8qIG9ubHkgMSBjaGFyYWN0ZXIgaW4gZmlyc3Qgd29yZCAqLworCWRvIHsKKwkJdG1wID0gKnNyYysrOworCQkqZHN0ID0gKHRtcCA+PiBCSVRTX1BFUl9CWVRFKTsKKwkJaWYgKCEoKmRzdCsrKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCgqZHN0KysgPSB0bXAgJiBCWVRFX01BU0spKTsKKwlkbHRoaXMtPnRlbXBfbGVuID0gZHN0IC0gZGx0aGlzLT5zdHJfdGVtcDsKKwkvKiBzcXVpcnJlbCBhd2F5IGxlbmd0aCBpbmNsdWRpbmcgdGVybWluYXRpbmcgbnVsbCAqLworCXJldHVybiBkbHRoaXMtPnN0cl90ZW1wOworfQkJCQkvKiB1bnBhY2tfbmFtZSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9kbG9hZF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvZGxvYWRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDJhN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvZGxvYWRfaW50ZXJuYWwuaApAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIGRsb2FkX2ludGVybmFsLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfRExPQURfSU5URVJOQUxfCisjZGVmaW5lIF9ETE9BRF9JTlRFUk5BTF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJbnRlcm5hbCBzdGF0ZSBkZWZpbml0aW9ucyBmb3IgdGhlIGR5bmFtaWMgbG9hZGVyCisgKi8KKworLyogdHlwZSB1c2VkIGZvciByZWxvY2F0aW9uIGludGVybWVkaWF0ZSByZXN1bHRzICovCit0eXBlZGVmIHMzMiBydmFsdWU7CisKKy8qIHVuc2lnbmVkIHZlcnNpb24gb2Ygc2FtZTsgbXVzdCBoYXZlIGF0IGxlYXN0IGFzIG1hbnkgYml0cyAqLwordHlwZWRlZiB1MzIgdXJ2YWx1ZTsKKworLyoKKyAqIER5bmFtaWMgbG9hZGVyIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzCisgKi8KKy8qIGVycm9yIGlzc3VlZCBpZiBpbnB1dCBoYXMgbW9yZSBzZWN0aW9ucyB0aGFuIHRoaXMgbGltaXQgKi8KKyNkZWZpbmUgUkVBU09OQUJMRV9TRUNUSU9OX0xJTUlUIDEwMAorCisvKiAoQWRkcmVzc2FibGUgdW5pdCkgdmFsdWUgdXNlZCB0byBjbGVhciBCU1Mgc2VjdGlvbiAqLworI2RlZmluZSBETE9BRF9GSUxMX0JTUyAwCisKKy8qCisgKiBSZW9yZGVyIG1hcHMgZXhwbGFpbmVkICg/KQorICoKKyAqIFRoZSBkb2ZmIGZpbGUgZm9ybWF0IGRlZmluZXMgYSAzMi1iaXQgcGF0dGVybiB1c2VkIHRvIGRldGVybWluZSB0aGUKKyAqIGJ5dGUgb3JkZXIgb2YgYW4gaW1hZ2UgYmVpbmcgcmVhZC4gIFRoYXQgdmFsdWUgaXMKKyAqIEJZVEVfUkVTSFVGRkxFX1ZBTFVFID09IDB4MDAwMTAyMDMKKyAqIEZvciBwdXJwb3NlcyBvZiB0aGUgcmVvcmRlciByb3V0aW5lLCB3ZSB3b3VsZCByYXRoZXIgaGF2ZSB0aGUgYWxsLWlzLU9LCisgKiBmb3IgMzItYml0cyBwYXR0ZXJuIGJlIDB4MDMwMjAxMDAuICBUaGlzIGZpcnN0IG1hY3JvIG1ha2VzIHRoZQorICogdHJhbnNsYXRpb24gZnJvbSBkb2ZmIGZpbGUgaGVhZGVyIHZhbHVlIHRvIE1BUCB2YWx1ZTogKi8KKyNkZWZpbmUgUkVPUkRFUl9NQVAocmF3bWFwKSAoKHJhd21hcCkgXiAweDMwMzAzMDMpCisvKiBUaGlzIHRyYW5zbGF0aW9uIGlzIG1hZGUgaW4gZGxvYWRfaGVhZGVycy4gIFRoZXJlYWZ0ZXIsIHRoZSBhbGwtaXMtT0sKKyAqIHZhbHVlIGZvciB0aGUgbWFwcyBzdG9yZWQgaW4gZGx0aGlzIGlzIFJFT1JERVJfTUFQKEJZVEVfUkVTSFVGRkxFX1ZBTFVFKS4KKyAqIEJ1dCBzYWRseSwgbm90IGFsbCBiaXRzIG9mIHRoZSBkb2ZmIGZpbGUgYXJlIDMyLWJpdCBpbnRlZ2Vycy4KKyAqIFRoZSBub3RhYmxlIGV4Y2VwdGlvbnMgYXJlIHN0cmluZ3MgYW5kIGltYWdlIGJpdHMuCisgKiBTdHJpbmdzIG9iZXkgaG9zdCBieXRlIG9yZGVyOiAqLworI2lmIGRlZmluZWQoX0JJR19FTkRJQU4pCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUihjb29rZWRtYXApICgoY29va2VkbWFwKSBeIDB4MzAzMDMwMykKKyNlbHNlCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUihjb29rZWRtYXApIChjb29rZWRtYXApCisjZW5kaWYKKy8qIFRhcmdldCBiaXRzIGNvbnNpc3Qgb2YgdGFyZ2V0IEFVcyAoY291bGQgYmUgYnl0ZXMsIG9yIDE2LWJpdHMsCisgKiBvciAzMi1iaXRzKSBzdG9yZWQgYXMgYW4gYXJyYXkgaW4gaG9zdCBvcmRlci4gIEEgdGFyZ2V0IG9yZGVyCisgKiBtYXAgaXMgZGVmaW5lZCBieTogKi8KKyNpZiAhZGVmaW5lZChfQklHX0VORElBTikgfHwgVEFSR0VUX0FVX0JJVFMgPiAxNgorI2RlZmluZSBUQVJHRVRfT1JERVIoY29va2VkbWFwKSAoY29va2VkbWFwKQorI2VsaWYgVEFSR0VUX0FVX0JJVFMgPiA4CisjZGVmaW5lIFRBUkdFVF9PUkRFUihjb29rZWRtYXApICgoY29va2VkbWFwKSBeIDB4MjAyMDIwMikKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9PUkRFUihjb29rZWRtYXApICgoY29va2VkbWFwKSBeIDB4MzAzMDMwMykKKyNlbmRpZgorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBoYW5kbGUgcmV0dXJuZWQgYnkgZHluYW1pYyBsb2FkZXIgKi8KK3N0cnVjdCBteV9oYW5kbGU7CisKKy8qCisgKiBhIGxpc3Qgb2YgbW9kdWxlIGhhbmRsZXMsIHdoaWNoIG1pcnJvcnMgdGhlIGRlYnVnIGxpc3Qgb24gdGhlIHRhcmdldAorICovCitzdHJ1Y3QgZGJnX21pcnJvcl9yb290IHsKKwkvKiBtdXN0IGJlIHNhbWUgYXMgZGJnX21pcnJvcl9saXN0OyBfX0RMTW9kdWxlcyBhZGRyZXNzIG9uIHRhcmdldCAqLworCXUzMiBkYnRoaXM7CisJc3RydWN0IG15X2hhbmRsZSAqaG5leHQ7CS8qIG11c3QgYmUgc2FtZSBhcyBkYmdfbWlycm9yX2xpc3QgKi8KKwl1MTYgY2hhbmdlczsJCS8qIGNoYW5nZSBjb3VudGVyICovCisJdTE2IHJlZmNvdW50OwkJLyogbnVtYmVyIG9mIG1vZHVsZXMgcmVmZXJlbmNpbmcgdGhpcyByb290ICovCit9OworCitzdHJ1Y3QgZGJnX21pcnJvcl9saXN0IHsKKwl1MzIgZGJ0aGlzOworCXN0cnVjdCBteV9oYW5kbGUgKmhuZXh0LCAqaHByZXY7CisJc3RydWN0IGRiZ19taXJyb3Jfcm9vdCAqaHJvb3Q7CisJdTE2IGRic2l6OworCXUzMiBjb250ZXh0OwkvKiBTYXZlIGNvbnRleHQgZm9yIC5kbGx2aWV3IG1lbW9yeSBhbGxvY2F0aW9uICovCit9OworCisjZGVmaW5lIFZBUklBQkxFX1NJWkUgMQorLyoKKyAqIHRoZSBzdHJ1Y3R1cmUgd2UgYWN0dWFsbHkgcmV0dXJuIGFzIGFuIG9wYXF1ZSBtb2R1bGUgaGFuZGxlCisgKi8KK3N0cnVjdCBteV9oYW5kbGUgeworCXN0cnVjdCBkYmdfbWlycm9yX2xpc3QgZG07CS8qICEhISBtdXN0IGJlIGZpcnN0ICEhISAqLworCS8qIHNlY3Rpb25zIGZvbGxvd2luZyA8PCAxLCBMU0IgaXMgc2V0IGZvciBiaWctZW5kaWFuIHRhcmdldCAqLworCXUxNiBzZWNuX2NvdW50OworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvIHNlY25zW1ZBUklBQkxFX1NJWkVdOworfTsKKyNkZWZpbmUgTVlfSEFORExFX1NJWkUgKHNpemVvZihzdHJ1Y3QgbXlfaGFuZGxlKSAtXAorCQkJc2l6ZW9mKHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvKSkKKy8qIHJlYWwgc2l6ZSBvZiBteV9oYW5kbGUgKi8KKworLyoKKyAqIHJlZHVjZWQgc3ltYm9sIHN0cnVjdHVyZSB1c2VkIGZvciBzeW1ib2xzIGR1cmluZyByZWxvY2F0aW9uCisgKi8KK3N0cnVjdCBsb2NhbF9zeW1ib2wgeworCXMzMiB2YWx1ZTsJCS8qIFJlbG9jYXRlZCBzeW1ib2wgdmFsdWUgKi8KKwlzMzIgZGVsdGE7CQkvKiBPcmlnaW5hbCB2YWx1ZSBpbiBpbnB1dCBmaWxlICovCisJczE2IHNlY25uOwkJLyogc2VjdGlvbiBudW1iZXIgKi8KKwlzMTYgc2NsYXNzOwkJLyogc3ltYm9sIGNsYXNzICovCit9OworCisvKgorICogVHJhbXBvbGluZSBkYXRhIHN0cnVjdHVyZXMKKyAqLworI2RlZmluZSBUUkFNUF9OT19HRU5fQVZBSUwgICAgICAgICAgICAgIDY1NTM1CisjZGVmaW5lIFRSQU1QX1NZTV9QUkVGSVggICAgICAgICAgICAgICAgIl9fJGRiVFJfXyIKKyNkZWZpbmUgVFJBTVBfU0VDVF9OQU1FICAgICAgICAgICAgICAgICAiLmRiVFIiCisvKiBNVVNUIE1BVENIIFRIRSBMRU5HVEggQUJPVkUhISAqLworI2RlZmluZSBUUkFNUF9TWU1fUFJFRklYX0xFTiAgICAgICAgICAgIDkKKy8qIEluY2x1ZGVzIE5VTEwgdGVybWluYXRpb24gKi8KKyNkZWZpbmUgVFJBTVBfU1lNX0hFWF9BU0NJSV9MRU4gICAgICAgICA5CisKKyNkZWZpbmUgR0VUX0NPTlRBSU5FUihwdHIsIHR5cGUsIGZpZWxkKSAoKHR5cGUgKikoKHVuc2lnbmVkIGxvbmcpcHRyIC1cCisJCQkJKHVuc2lnbmVkIGxvbmcpKCYoKHR5cGUgKikwKS0+ZmllbGQpKSkKKyNpZm5kZWYgRklFTERfT0ZGU0VUCisjZGVmaW5lIEZJRUxEX09GRlNFVCh0eXBlLCBmaWVsZCkgICAgICAgKCh1bnNpZ25lZCBsb25nKSgmKCh0eXBlICopMCktPmZpZWxkKSkKKyNlbmRpZgorCisvKgorICAgIFRoZSB0cmFtcG9saW5lIGNvZGUgZm9yIHRoZSB0YXJnZXQgaXMgbG9jYXRlZCBpbiBhIHRhYmxlIGNhbGxlZAorICAgICJ0cmFtcF9nZW5faW5mbyIgd2l0aCBpcyBpbmRleGVkIGJ5IGxvb2tpbmcgdXAgdGhlIGluZGV4IGluIHRoZSB0YWJsZQorICAgICJ0cmFtcF9tYXAiLiAgVGhlIHRyYW1wX21hcCBpbmRleCBpcyBhY3F1aXJlZCB1c2luZyB0aGUgdGFyZ2V0CisgICAgSEFTSF9GVU5DIG9uIHRoZSByZWxvY2F0aW9uIHR5cGUgdGhhdCBjYXVzZWQgdGhlIHRyYW1wb2xpbmUuICBFYWNoCisgICAgdHJhbXBvbGluZSBjb2RlIHRhYmxlIGVudHJ5IE1VU1QgZm9sbG93IHRoaXMgZm9ybWF0OgorCisgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgdHJhbXBfZ2VuX2NvZGVfaGRyICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgVHJhbXBvbGluZSBpbWFnZSBjb2RlICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgKHRoZSByYXcgaW5zdHJ1Y3Rpb24gY29kZSBmb3IgdGhlIHRhcmdldCkgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgUmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGUgaW1hZ2UgY29kZSAgICAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKKyAgICBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byBob3cgaW1hZ2UgZGF0YSBpcyBsYWlkIG91dCBpbiB0aGUgRE9GRiBmaWxlCisgICAgaXRzZWxmLgorICovCitzdHJ1Y3QgdHJhbXBfZ2VuX2NvZGVfaGRyIHsKKwl1MzIgdHJhbXBfY29kZV9zaXplOwkvKiAgaW4gQllURVMgKi8KKwl1MzIgbnVtX3JlbG9zOworCXUzMiByZWxvX29mZnNldDsJLyogIGluIEJZVEVTICovCit9OworCitzdHJ1Y3QgdHJhbXBfaW1nX3BrdCB7CisJc3RydWN0IHRyYW1wX2ltZ19wa3QgKm5leHQ7CS8qICBNVVNUIEJFIEZJUlNUICovCisJdTMyIGJhc2U7CisJc3RydWN0IHRyYW1wX2dlbl9jb2RlX2hkciBoZHI7CisJdTggcGF5bG9hZFtWQVJJQUJMRV9TSVpFXTsKK307CisKK3N0cnVjdCB0cmFtcF9pbWdfZHVwX3JlbG8geworCXN0cnVjdCB0cmFtcF9pbWdfZHVwX3JlbG8gKm5leHQ7CisJc3RydWN0IHJlbG9jX3JlY29yZF90IHJlbG87Cit9OworCitzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9wa3QgeworCXN0cnVjdCB0cmFtcF9pbWdfZHVwX3BrdCAqbmV4dDsJLyogIE1VU1QgQkUgRklSU1QgKi8KKwlzMTYgc2Vjbm47CisJdTMyIG9mZnNldDsKKwlzdHJ1Y3QgaW1hZ2VfcGFja2V0X3QgaW1nX3BrdDsKKwlzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9yZWxvICpyZWxvX2NoYWluOworCisJLyogIFBBWUxPQUQgT0YgSU1HIFBLVCBGT0xMT1dTICovCit9OworCitzdHJ1Y3QgdHJhbXBfc3ltIHsKKwlzdHJ1Y3QgdHJhbXBfc3ltICpuZXh0OwkvKiAgTVVTVCBCRSBGSVJTVCAqLworCXUzMiBpbmRleDsKKwl1MzIgc3RyX2luZGV4OworCXN0cnVjdCBsb2NhbF9zeW1ib2wgc3ltX2luZm87Cit9OworCitzdHJ1Y3QgdHJhbXBfc3RyaW5nIHsKKwlzdHJ1Y3QgdHJhbXBfc3RyaW5nICpuZXh0OwkvKiAgTVVTVCBCRSBGSVJTVCAqLworCXUzMiBpbmRleDsKKwljaGFyIHN0cltWQVJJQUJMRV9TSVpFXTsJLyogIE5VTEwgdGVybWluYXRlZCAqLworfTsKKworc3RydWN0IHRyYW1wX2luZm8geworCXUzMiB0cmFtcF9zZWN0X25leHRfYWRkcjsKKwlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyBzZWN0X2luZm87CisKKwlzdHJ1Y3QgdHJhbXBfc3ltICpzeW1ib2xfaGVhZDsKKwlzdHJ1Y3QgdHJhbXBfc3ltICpzeW1ib2xfdGFpbDsKKwl1MzIgdHJhbXBfc3ltX25leHRfaW5kZXg7CisJc3RydWN0IGxvY2FsX3N5bWJvbCAqZmluYWxfc3ltX3RhYmxlOworCisJc3RydWN0IHRyYW1wX3N0cmluZyAqc3RyaW5nX2hlYWQ7CisJc3RydWN0IHRyYW1wX3N0cmluZyAqc3RyaW5nX3RhaWw7CisJdTMyIHRyYW1wX3N0cmluZ19uZXh0X2luZGV4OworCXUzMiB0cmFtcF9zdHJpbmdfc2l6ZTsKKwljaGFyICpmaW5hbF9zdHJpbmdfdGFibGU7CisKKwlzdHJ1Y3QgdHJhbXBfaW1nX3BrdCAqdHJhbXBfcGt0czsKKwlzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9wa3QgKmR1cF9wa3RzOworfTsKKworLyoKKyAqIFN0YXRlcyBvZiB0aGUgLmNpbml0IHN0YXRlIG1hY2hpbmUKKyAqLworZW51bSBjaW5pdF9tb2RlIHsKKwlDSV9DT1VOVCA9IDAsCQkvKiBleHBlY3RpbmcgYSBjb3VudCAqLworCUNJX0FERFJFU1MsCQkvKiBleHBlY3RpbmcgYW4gYWRkcmVzcyAqLworI2lmIENJTklUX0FMSUdOIDwgQ0lOSVRfQUREUkVTUwkvKiBoYW5kbGUgY2FzZSBvZiBwYXJ0aWFsIGFkZHJlc3MgZmllbGQgKi8KKwlDSV9QQVJUQUREUkVTUywJCS8qIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBhZGRyZXNzICovCisjZW5kaWYKKwlDSV9DT1BZLAkJLyogaW4gdGhlIG1pZGRsZSBvZiBjb3B5aW5nIGRhdGEgKi8KKwlDSV9ET05FCQkJLyogZW5kIG9mIC5jaW5pdCB0YWJsZSAqLworfTsKKworLyoKKyAqIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZHluYW1pYyBsb2FkZXIsIHdoaWNoIGlzIHBhc3NlZCBhcm91bmQgYXMKKyAqIGFuIG9iamVjdAorICovCitzdHJ1Y3QgZGxvYWRfc3RhdGUgeworCXN0cnVjdCBkeW5hbWljX2xvYWRlcl9zdHJlYW0gKnN0cm07CS8qIFRoZSBtb2R1bGUgaW5wdXQgc3RyZWFtICovCisJc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqbXlzeW07CS8qIFN5bWJvbHMgZm9yIHRoaXMgc2Vzc2lvbiAqLworCS8qIHRhcmdldCBtZW1vcnkgYWxsb2NhdG9yICovCisJc3RydWN0IGR5bmFtaWNfbG9hZGVyX2FsbG9jYXRlICpteWFsbG9jOworCXN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICpteWlvOwkvKiB0YXJnZXQgbWVtb3J5IGluaXRpYWxpemVyICovCisJdW5zaWduZWQgbXlvcHRpb25zOwkvKiBPcHRpb25zIHBhcmFtZXRlciBkeW5hbWljX2xvYWRfbW9kdWxlICovCisKKwljaGFyICpzdHJfaGVhZDsJCS8qIFBvaW50ZXIgdG8gc3RyaW5nIHRhYmxlICovCisjaWYgQklUU19QRVJfQVUgPiBCSVRTX1BFUl9CWVRFCisJY2hhciAqc3RyX3RlbXA7CQkvKiBQb2ludGVyIHRvIHRlbXBvcmFyeSBidWZmZXIgZm9yIHN0cmluZ3MgKi8KKwkvKiBiaWcgZW5vdWdoIHRvIGhvbGQgbG9uZ2VzdCBzdHJpbmcgKi8KKwl1bnNpZ25lZCB0ZW1wX2xlbjsJLyogbGVuZ3RoIG9mIGxhc3QgdGVtcG9yYXJ5IHN0cmluZyAqLworCWNoYXIgKnhzdHJpbmdzOwkJLyogUG9pbnRlciB0byBidWZmZXIgZm9yIGV4cGFuZGVkICovCisJLyogc3RyaW5ncyBmb3Igc2VjIG5hbWVzICovCisjZW5kaWYKKwkvKiBUb3RhbCBzaXplIG9mIHN0cmluZ3MgZm9yIERMTFZpZXcgc2VjdGlvbiBuYW1lcyAqLworCXVuc2lnbmVkIGRlYnVnX3N0cmluZ19zaXplOworCS8qIFBvaW50ZXIgdG8gcGFyYWxsZWwgc2VjdGlvbiBpbmZvIGZvciBhbGxvY2F0ZWQgc2VjdGlvbnMgb25seSAqLworCXN0cnVjdCBkb2ZmX3Njbmhkcl90ICpzZWN0X2hkcnM7CS8qIFBvaW50ZXIgdG8gc2VjdGlvbiB0YWJsZSAqLworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICpsZHJfc2VjdGlvbnM7CisjaWYgVE1TMzIwNjAKKwkvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiAqLworCWxkcl9hZGRyIGJzc19ydW5fYmFzZTsKKyNlbmRpZgorCXN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY2FsX3N5bXRhYjsJLyogUmVsb2NhdGlvbiBzeW1ib2wgdGFibGUgKi8KKworCS8qIHBvaW50ZXIgdG8gREwgc2VjdGlvbiBpbmZvIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZWxvY2F0ZWQgKi8KKwlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW1hZ2Vfc2VjbjsKKwkvKiBjaGFuZ2UgaW4gcnVuIGFkZHJlc3MgZm9yIGN1cnJlbnQgc2VjdGlvbiBkdXJpbmcgcmVsb2NhdGlvbiAqLworCWxkcl9hZGRyIGRlbHRhX3J1bmFkZHI7CisJbGRyX2FkZHIgaW1hZ2Vfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgY3VycmVudCBwYWNrZXQgaW4gc2VjdGlvbiAqLworCWVudW0gY2luaXRfbW9kZSBjaW5pdF9zdGF0ZTsJLyogY3VycmVudCBzdGF0ZSBvZiBjbG9hZF9jaW5pdCgpICovCisJaW50IGNpbml0X2NvdW50OwkvKiB0aGUgY3VycmVudCBjb3VudCAqLworCWxkcl9hZGRyIGNpbml0X2FkZHI7CS8qIHRoZSBjdXJyZW50IGFkZHJlc3MgKi8KKwlzMTYgY2luaXRfcGFnZTsJCS8qIHRoZSBjdXJyZW50IHBhZ2UgKi8KKwkvKiBIYW5kbGUgdG8gYmUgcmV0dXJuZWQgYnkgZHluYW1pY19sb2FkX21vZHVsZSAqLworCXN0cnVjdCBteV9oYW5kbGUgKm15aGFuZGxlOworCXVuc2lnbmVkIGRsb2FkX2VycmNvdW50OwkvKiBUb3RhbCAjIG9mIGVycm9ycyByZXBvcnRlZCBzbyBmYXIgKi8KKwkvKiBOdW1iZXIgb2YgdGFyZ2V0IHNlY3Rpb25zIHRoYXQgcmVxdWlyZSBhbGxvY2F0aW9uIGFuZCByZWxvY2F0aW9uICovCisJdW5zaWduZWQgYWxsb2NhdGVkX3NlY25fY291bnQ7CisjaWZuZGVmIFRBUkdFVF9FTkRJQU5ORVNTCisJaW50IGJpZ19lX3RhcmdldDsJLyogVGFyZ2V0IGRhdGEgaW4gYmlnLWVuZGlhbiBmb3JtYXQgKi8KKyNlbmRpZgorCS8qIG1hcCBmb3IgcmVvcmRlcmluZyBieXRlcywgMCBpZiBub3QgbmVlZGVkICovCisJdTMyIHJlb3JkZXJfbWFwOworCXN0cnVjdCBkb2ZmX2ZpbGVoZHJfdCBkZmlsZV9oZHI7CS8qIERPRkYgZmlsZSBoZWFkZXIgc3RydWN0dXJlICovCisJc3RydWN0IGRvZmZfdmVyaWZ5X3JlY190IHZlcmlmeTsJLyogVmVyaWZ5IHJlY29yZCAqLworCisJc3RydWN0IHRyYW1wX2luZm8gdHJhbXA7CS8qIFRyYW1wb2xpbmUgZGF0YSwgaWYgbmVlZGVkICovCisKKwlpbnQgcmVsc3RraWR4OwkJLyogaW5kZXggaW50byByZWxvY2F0aW9uIHZhbHVlIHN0YWNrICovCisJLyogcmVsb2NhdGlvbiB2YWx1ZSBzdGFjayB1c2VkIGluIHJlbGV4cC5jICovCisJcnZhbHVlIHJlbHN0a1tTVEFUSUNfRVhQUl9TVEtfU0laRV07CisKK307CisKKyNpZmRlZiBUQVJHRVRfRU5ESUFOTkVTUworI2RlZmluZSBUQVJHRVRfQklHX0VORElBTiBUQVJHRVRfRU5ESUFOTkVTUworI2Vsc2UKKyNkZWZpbmUgVEFSR0VUX0JJR19FTkRJQU4gKGRsdGhpcy0+YmlnX2VfdGFyZ2V0KQorI2VuZGlmCisKKy8qCisgKiBFeHBvcnRzIGZyb20gY2xvYWQuYyB0byByZXN0IG9mIHRoZSB3b3JsZAorICovCitleHRlcm4gdm9pZCBkbG9hZF9lcnJvcihzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgY29uc3QgY2hhciAqZXJydHh0LCAuLi4pOworZXh0ZXJuIHZvaWQgZGxvYWRfc3ltc19lcnJvcihzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICpzeW1zLAorCQkJICAgICBjb25zdCBjaGFyICplcnJ0eHQsIC4uLik7CitleHRlcm4gdm9pZCBkbG9hZF9oZWFkZXJzKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKTsKK2V4dGVybiB2b2lkIGRsb2FkX3N0cmluZ3Moc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIGJvb2wgc2VjX25hbWVzX29ubHkpOworZXh0ZXJuIHZvaWQgZGxvYWRfc2VjdGlvbnMoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpOworZXh0ZXJuIHZvaWQgZGxvYWRfcmVvcmRlcih2b2lkICpkYXRhLCBpbnQgZHNpeiwgdTMyIG1hcCk7CitleHRlcm4gdTMyIGRsb2FkX2NoZWNrc3VtKHZvaWQgKmRhdGEsIHVuc2lnbmVkIHNpeik7CisKKyNpZiBIT1NUX0VORElBTk5FU1MKK2V4dGVybiB1aW50MzJfdCBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtKHZvaWQgKmRhdGEsIHVuc2lnbmVkIHNpeik7CisjaWYgKFRBUkdFVF9BVV9CSVRTID4gOCkgJiYgKFRBUkdFVF9BVV9CSVRTIDwgMzIpCitleHRlcm4gdWludDMyX3QgZGxvYWRfcmV2ZXJzZV9jaGVja3N1bTE2KHZvaWQgKmRhdGEsIHVuc2lnbmVkIHNpeik7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogZXhwb3J0ZWQgYnkgcmVsb2MuYworICovCitleHRlcm4gdm9pZCBkbG9hZF9yZWxvY2F0ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdGd0X2F1X3QgKiBkYXRhLAorCQkJICAgc3RydWN0IHJlbG9jX3JlY29yZF90ICpycCwgYm9vbCAqIHRyYW1wc19nZW5lcmF0ZWQsCisJCQkgICBib29sIHNlY29uZF9wYXNzKTsKKworZXh0ZXJuIHJ2YWx1ZSBkbG9hZF91bnBhY2soc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIHRndF9hdV90ICogZGF0YSwKKwkJCSAgIGludCBmaWVsZHN6LCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBzZ24pOworCitleHRlcm4gaW50IGRsb2FkX3JlcGFjayhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgcnZhbHVlIHZhbCwgdGd0X2F1X3QgKiBkYXRhLAorCQkJaW50IGZpZWxkc3osIGludCBvZmZzZXQsIHVuc2lnbmVkIHNnbik7CisKKy8qCisgKiBleHBvcnRlZCBieSB0cmFtcC5jCisgKi8KK2V4dGVybiBib29sIGRsb2FkX3RyYW1wX2F2YWlsKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLAorCQkJICAgICAgc3RydWN0IHJlbG9jX3JlY29yZF90ICpycCk7CisKK2ludCBkbG9hZF90cmFtcF9nZW5lcmF0ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgczE2IHNlY25uLAorCQkJIHUzMiBpbWFnZV9vZmZzZXQsIHN0cnVjdCBpbWFnZV9wYWNrZXRfdCAqaXBhY2tldCwKKwkJCSBzdHJ1Y3QgcmVsb2NfcmVjb3JkX3QgKnJwKTsKKworZXh0ZXJuIGludCBkbG9hZF90cmFtcF9wa3RfdWRwYXRlKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLAorCQkJCSAgczE2IHNlY25uLCB1MzIgaW1hZ2Vfb2Zmc2V0LAorCQkJCSAgc3RydWN0IGltYWdlX3BhY2tldF90ICppcGFja2V0KTsKKworZXh0ZXJuIGludCBkbG9hZF90cmFtcF9maW5hbGl6ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcyk7CisKK2V4dGVybiB2b2lkIGRsb2FkX3RyYW1wX2NsZWFudXAoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpOworCisjZW5kaWYgLyogX0RMT0FEX0lOVEVSTkFMXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvZG9mZi5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvZG9mZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzMxNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvZG9mZi5oCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogZG9mZi5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFN0cnVjdHVyZXMgJiBkZWZpbml0aW9ucyB1c2VkIGZvciBkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlcyBmaWxlIGZvcm1hdC4KKyAqIFRoaXMgZm9ybWF0IGlzIGEgcmVmb3JtYXR0ZWQgdmVyc2lvbiBvZiBDT0ZGLiBJdCBvcHRpbWl6ZXMgdGhlIGxheW91dCBmb3IKKyAqIHRoZSBkeW5hbWljIGxvYWRlci4KKyAqCisgKiAuZG9mIGZpbGVzLCB3aGVuIHZpZXdlZCBhcyBhIHNlcXVlbmNlIG9mIDMyLWJpdCBpbnRlZ2VycywgbG9vayB0aGUgc2FtZQorICogb24gYmlnLWVuZGlhbiBhbmQgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9ET0ZGX0gKKyNkZWZpbmUgX0RPRkZfSAorCisKKyNkZWZpbmUgQllURV9SRVNIVUZGTEVfVkFMVUUgMHgwMDAxMDIwMworCisvKiBET0ZGIGZpbGUgaGVhZGVyIGNvbnRhaW5pbmcgZmllbGRzIGNhdGVnb3JpemluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlICovCitzdHJ1Y3QgZG9mZl9maWxlaGRyX3QgeworCisJLyogc3RyaW5nIHRhYmxlIHNpemUsIGluY2x1ZGluZyBmaWxlbmFtZSwgaW4gYnl0ZXMgKi8KKwl1MzIgZGZfc3RydGFiX3NpemU7CisKKwkvKiBlbnRyeSBwb2ludCBpZiBvbmUgZXhpc3RzICovCisJdTMyIGRmX2VudHJ5cHQ7CisKKwkvKiBpZGVudGlmaWVzIGJ5dGUgb3JkZXJpbmcgb2YgZmlsZTsKKwkgKiBhbHdheXMgc2V0IHRvIEJZVEVfUkVTSFVGRkxFX1ZBTFVFICovCisJdTMyIGRmX2J5dGVfcmVzaHVmZmxlOworCisJLyogU2l6ZSBvZiB0aGUgc3RyaW5nIHRhYmxlIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGxhc3Qgc2VjdGlvbiBuYW1lICovCisJLyogU2l6ZSBpbmNsdWRlcyB0aGUgbmFtZSBvZiB0aGUgQ09GRiBmaWxlIGFsc28gKi8KKwl1MzIgZGZfc2NuX25hbWVfc2l6ZTsKKworI2lmbmRlZiBfQklHX0VORElBTgorCS8qIG51bWJlciBvZiBzeW1ib2xzICovCisJdTE2IGRmX25vX3N5bXM7CisKKwkvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGxvbmdlc3Qgc3RyaW5nLCBpbmNsdWRpbmcgdGVybWluYXRpbmcgTlVMTCAqLworCS8qIGV4Y2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlICovCisJdTE2IGRmX21heF9zdHJfbGVuOworCisJLyogdG90YWwgbnVtYmVyIG9mIHNlY3Rpb25zIGluY2x1ZGluZyBuby1sb2FkIG9uZXMgKi8KKwl1MTYgZGZfbm9fc2NuczsKKworCS8qIG51bWJlciBvZiBzZWN0aW9ucyBjb250YWluaW5nIHRhcmdldCBjb2RlIGFsbG9jYXRlZCBvciBkb3dubG9hZGVkICovCisJdTE2IGRmX3RhcmdldF9zY25zOworCisJLyogdW5pcXVlIGlkIGZvciBkbGwgZmlsZSBmb3JtYXQgJiB2ZXJzaW9uICovCisJdTE2IGRmX2RvZmZfdmVyc2lvbjsKKworCS8qIGlkZW50aWZpZXMgSVNBICovCisJdTE2IGRmX3RhcmdldF9pZDsKKworCS8qIHVzZWZ1bCBmaWxlIGZsYWdzICovCisJdTE2IGRmX2ZsYWdzOworCisJLyogc2VjdGlvbiByZWZlcmVuY2UgZm9yIGVudHJ5IHBvaW50LCBOX1VOREVGIGZvciBub25lLCAqLworCS8qIE5fQUJTIGZvciBhYnNvbHV0ZSBhZGRyZXNzICovCisJczE2IGRmX2VudHJ5X3NlY247CisjZWxzZQorCS8qIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcsIGluY2x1ZGluZyB0ZXJtaW5hdGluZyBOVUxMICovCisJdTE2IGRmX21heF9zdHJfbGVuOworCisJLyogbnVtYmVyIG9mIHN5bWJvbHMgKi8KKwl1MTYgZGZfbm9fc3ltczsKKworCS8qIG51bWJlciBvZiBzZWN0aW9ucyBjb250YWluaW5nIHRhcmdldCBjb2RlIGFsbG9jYXRlZCBvciBkb3dubG9hZGVkICovCisJdTE2IGRmX3RhcmdldF9zY25zOworCisJLyogdG90YWwgbnVtYmVyIG9mIHNlY3Rpb25zIGluY2x1ZGluZyBuby1sb2FkIG9uZXMgKi8KKwl1MTYgZGZfbm9fc2NuczsKKworCS8qIGlkZW50aWZpZXMgSVNBICovCisJdTE2IGRmX3RhcmdldF9pZDsKKworCS8qIHVuaXF1ZSBpZCBmb3IgZGxsIGZpbGUgZm9ybWF0ICYgdmVyc2lvbiAqLworCXUxNiBkZl9kb2ZmX3ZlcnNpb247CisKKwkvKiBzZWN0aW9uIHJlZmVyZW5jZSBmb3IgZW50cnkgcG9pbnQsIE5fVU5ERUYgZm9yIG5vbmUsICovCisJLyogTl9BQlMgZm9yIGFic29sdXRlIGFkZHJlc3MgKi8KKwlzMTYgZGZfZW50cnlfc2VjbjsKKworCS8qIHVzZWZ1bCBmaWxlIGZsYWdzICovCisJdTE2IGRmX2ZsYWdzOworI2VuZGlmCisJLyogY2hlY2tzdW0gZm9yIGZpbGUgaGVhZGVyIHJlY29yZCAqLworCXUzMiBkZl9jaGVja3N1bTsKKworfTsKKworLyogZmxhZ3MgaW4gdGhlIGRmX2ZsYWdzIGZpZWxkICovCisjZGVmaW5lICBERl9MSVRUTEUgICAweDEwMAorI2RlZmluZSAgREZfQklHICAgICAgMHgyMDAKKyNkZWZpbmUgIERGX0JZVEVfT1JERVIgKERGX0xJVFRMRSB8IERGX0JJRykKKworLyogU3VwcG9ydGVkIHByb2Nlc3NvcnMgKi8KKyNkZWZpbmUgVE1TNDcwX0lEICAgMHg5NworI2RlZmluZSBMRUFEX0lEICAgICAweDk4CisjZGVmaW5lIFRNUzMyMDYwX0lEIDB4OTkKKyNkZWZpbmUgTEVBRDNfSUQgICAgMHg5YworCisvKiBQcmltYXJ5IHByb2Nlc3NvciBmb3IgbG9hZGluZyAqLworI2lmIFRNUzMyMDYwCisjZGVmaW5lIFRBUkdFVF9JRCAgIFRNUzMyMDYwX0lECisjZW5kaWYKKworLyogVmVyaWZpY2F0aW9uIHJlY29yZCBjb250YWluaW5nIHZhbHVlcyB1c2VkIHRvIHRlc3QgaW50ZWdyaXR5IG9mIHRoZSBiaXRzICovCitzdHJ1Y3QgZG9mZl92ZXJpZnlfcmVjX3QgeworCisJLyogdGltZSBhbmQgZGF0ZSBzdGFtcCAqLworCXUzMiBkdl90aW1kYXQ7CisKKwkvKiBjaGVja3N1bSBmb3IgYWxsIHNlY3Rpb24gcmVjb3JkcyAqLworCXUzMiBkdl9zY25fcmVjX2NoZWNrc3VtOworCisJLyogY2hlY2tzdW0gZm9yIHN0cmluZyB0YWJsZSAqLworCXUzMiBkdl9zdHJfdGFiX2NoZWNrc3VtOworCisJLyogY2hlY2tzdW0gZm9yIHN5bWJvbCB0YWJsZSAqLworCXUzMiBkdl9zeW1fdGFiX2NoZWNrc3VtOworCisJLyogY2hlY2tzdW0gZm9yIHZlcmlmaWNhdGlvbiByZWNvcmQgKi8KKwl1MzIgZHZfdmVyaWZ5X3JlY19jaGVja3N1bTsKKworfTsKKworLyogU3RyaW5nIHRhYmxlIGlzIGFuIGFycmF5IG9mIG51bGwtdGVybWluYXRlZCBzdHJpbmdzLiAgVGhlIGZpcnN0IGVudHJ5IGlzCisgKiB0aGUgZmlsZW5hbWUsIHdoaWNoIGlzIGFkZGVkIGJ5IERMTGNyZWF0ZS4gIE5vIG5ldyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKyAqIGFyZSByZXF1aXJlZC4KKyAqLworCisvKiBTZWN0aW9uIFJlY29yZHMgaW5jbHVkaW5nIGluZm9ybWF0aW9uIG9uIHRoZSBjb3JyZXNwb25kaW5nIGltYWdlIHBhY2tldHMgKi8KKy8qCisgKiAgICAgICEhV0FSTklORyEhCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggaW4gZm9ybSBsZHJfc2VjdGlvbl9pbmZvIGluCisgKiBkeW5hbWljX2xvYWRlci5oCisgKi8KKworc3RydWN0IGRvZmZfc2NuaGRyX3QgeworCisJczMyIGRzX29mZnNldDsJCS8qIG9mZnNldCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCisJczMyIGRzX3BhZGRyOwkJLyogUlVOIGFkZHJlc3MsIGluIHRhcmdldCBBVSAqLworCXMzMiBkc192YWRkcjsJCS8qIExPQUQgYWRkcmVzcywgaW4gdGFyZ2V0IEFVICovCisJczMyIGRzX3NpemU7CQkvKiBzZWN0aW9uIHNpemUsIGluIHRhcmdldCBBVSAqLworI2lmbmRlZiBfQklHX0VORElBTgorCXUxNiBkc19wYWdlOwkJLyogbWVtb3J5IHBhZ2UgaWQgKi8KKwl1MTYgZHNfZmxhZ3M7CQkvKiBzZWN0aW9uIGZsYWdzICovCisjZWxzZQorCXUxNiBkc19mbGFnczsJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKwl1MTYgZHNfcGFnZTsJCS8qIG1lbW9yeSBwYWdlIGlkICovCisjZW5kaWYKKwl1MzIgZHNfZmlyc3RfcGt0X29mZnNldDsKKwkvKiBBYnNvbHV0ZSBieXRlIG9mZnNldCBpbnRvIHRoZSBmaWxlICovCisJLyogd2hlcmUgdGhlIGZpcnN0IGltYWdlIHJlY29yZCByZXNpZGVzICovCisKKwlzMzIgZHNfbmlwYWNrczsJCS8qIG51bWJlciBvZiBpbWFnZSBwYWNrZXRzICovCisKK307CisKKy8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLworc3RydWN0IGRvZmZfc3ltZW50X3QgeworCisJczMyIGRuX29mZnNldDsJCS8qIG9mZnNldCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCisJczMyIGRuX3ZhbHVlOwkJLyogdmFsdWUgb2Ygc3ltYm9sICovCisjaWZuZGVmIF9CSUdfRU5ESUFOCisJczE2IGRuX3NjbnVtOwkJLyogc2VjdGlvbiBudW1iZXIgKi8KKwlzMTYgZG5fc2NsYXNzOwkJLyogc3RvcmFnZSBjbGFzcyAqLworI2Vsc2UKKwlzMTYgZG5fc2NsYXNzOwkJLyogc3RvcmFnZSBjbGFzcyAqLworCXMxNiBkbl9zY251bTsJCS8qIHNlY3Rpb24gbnVtYmVyLCAxLWJhc2VkICovCisjZW5kaWYKKworfTsKKworLyogc3BlY2lhbCB2YWx1ZXMgZm9yIGRuX3NjbnVtICovCisjZGVmaW5lICBETl9VTkRFRiAgMAkJLyogdW5kZWZpbmVkIHN5bWJvbCAqLworI2RlZmluZSAgRE5fQUJTICAgICgtMSkJCS8qIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLworLyogc3BlY2lhbCB2YWx1ZXMgZm9yIGRuX3NjbGFzcyAqLworI2RlZmluZSBETl9FWFQgICAgIDIKKyNkZWZpbmUgRE5fU1RBVExBQiAyMAorI2RlZmluZSBETl9FWFRMQUIgIDIxCisKKy8qIERlZmF1bHQgdmFsdWUgb2YgaW1hZ2UgYml0cyBpbiBwYWNrZXQgKi8KKy8qIENvbmZpZ3VyYWJsZSBieSB1c2VyIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKyNkZWZpbmUgSU1BR0VfUEFDS0VUX1NJWkUgMTAyNAorCisvKiBBbiBpbWFnZSBwYWNrZXQgY29udGFpbnMgYSBjaHVuayBvZiBkYXRhIGZyb20gYSBzZWN0aW9uIGFsb25nIHdpdGggKi8KKy8qIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgaXRzIHByb2Nlc3NpbmcuICovCitzdHJ1Y3QgaW1hZ2VfcGFja2V0X3QgeworCisJczMyIG51bV9yZWxvY3M7CQkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbnMgZm9yICovCisJLyogdGhpcyBwYWNrZXQgKi8KKworCXMzMiBwYWNrZXRfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGFycmF5ICovCisJLyogImJpdHMiIG9jY3VwaWVkICBieSAqLworCS8qIHZhbGlkIGRhdGEuICBDb3VsZCBiZSAqLworCS8qIDwgSU1BR0VfUEFDS0VUX1NJWkUgdG8gKi8KKwkvKiBwcmV2ZW50IHNwbGl0dGluZyBhICovCisJLyogcmVsb2NhdGlvbiBhY3Jvc3MgcGFja2V0cy4gKi8KKwkvKiBMYXN0IHBhY2tldCBvZiBhIHNlY3Rpb24gKi8KKwkvKiB3aWxsIG1vc3QgbGlrZWx5IGNvbnRhaW4gKi8KKwkvKiA8IElNQUdFX1BBQ0tFVF9TSVpFIGJ5dGVzICovCisJLyogb2YgdmFsaWQgZGF0YSAqLworCisJczMyIGltZ19jaGtzdW07CQkvKiBDaGVja3N1bSBmb3IgaW1hZ2UgcGFja2V0ICovCisJLyogYW5kIHRoZSBjb3JyZXNwb25kaW5nICovCisJLyogcmVsb2NhdGlvbiByZWNvcmRzICovCisKKwl1OCAqaW1nX2RhdGE7CQkvKiBBY3R1YWwgZGF0YSBpbiBzZWN0aW9uICovCisKK307CisKKy8qIFRoZSByZWxvY2F0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uIG1hdGNoZXMgdGhlIENPRkYgdmVyc2lvbi4gIE9mZnNldHMgKi8KKy8qIGhvd2V2ZXIgYXJlIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBwYWNrZXQgYmFzZSBub3QgdGhlIHNlY3Rpb24gYmFzZS4gKi8KK3N0cnVjdCByZWxvY19yZWNvcmRfdCB7CisKKwlzMzIgdmFkZHI7CisKKwkvKiBleHByZXNzZWQgaW4gdGFyZ2V0IEFVcyAqLworCisJdW5pb24geworCQlzdHJ1Y3QgeworI2lmbmRlZiBfQklHX0VORElBTgorCQkJdTggX29mZnNldDsJLyogYml0IG9mZnNldCBvZiByZWwgZmxkICovCisJCQl1OCBfZmllbGRzejsJLyogc2l6ZSBvZiByZWwgZmxkICovCisJCQl1OCBfd29yZHN6OwkvKiAjIGJ5dGVzIGNvbnRhaW5pbmcgcmVsIGZsZCAqLworCQkJdTggX2R1bTE7CisJCQl1MTYgX2R1bTI7CisJCQl1MTYgX3R5cGU7CisjZWxzZQorCQkJdW5zaWduZWQgX2R1bTE6ODsKKwkJCXVuc2lnbmVkIF93b3Jkc3o6ODsJLyogIyBieXRlcyBjb250YWluaW5nIHJlbCBmbGQgKi8KKwkJCXVuc2lnbmVkIF9maWVsZHN6Ojg7CS8qIHNpemUgb2YgcmVsIGZsZCAqLworCQkJdW5zaWduZWQgX29mZnNldDo4OwkvKiBiaXQgb2Zmc2V0IG9mIHJlbCBmbGQgKi8KKwkJCXUxNiBfdHlwZTsKKwkJCXUxNiBfZHVtMjsKKyNlbmRpZgorCQl9IF9yX2ZpZWxkOworCisJCXN0cnVjdCB7CisJCQl1MzIgX3NwYzsJLyogaW1hZ2UgcGFja2V0IHJlbGF0aXZlIFBDICovCisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCQl1MTYgX2R1bTsKKwkJCXUxNiBfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlICovCisjZWxzZQorCQkJdTE2IF90eXBlOwkvKiByZWxvY2F0aW9uIHR5cGUgKi8KKwkJCXUxNiBfZHVtOworI2VuZGlmCisJCX0gX3Jfc3BjOworCisJCXN0cnVjdCB7CisJCQl1MzIgX3V2YWw7CS8qIGNvbnN0YW50IHZhbHVlICovCisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCQl1MTYgX2R1bTsKKwkJCXUxNiBfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlICovCisjZWxzZQorCQkJdTE2IF90eXBlOwkvKiByZWxvY2F0aW9uIHR5cGUgKi8KKwkJCXUxNiBfZHVtOworI2VuZGlmCisJCX0gX3JfdXZhbDsKKworCQlzdHJ1Y3QgeworCQkJczMyIF9zeW1uZHg7CS8qIDMyLWJpdCBzeW0gdGJsIGluZGV4ICovCisjaWZuZGVmIF9CSUdfRU5ESUFOCisJCQl1MTYgX2Rpc3A7CS8qIGV4dHJhIGFkZHIgZW5jb2RlIGRhdGEgKi8KKwkJCXUxNiBfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlICovCisjZWxzZQorCQkJdTE2IF90eXBlOwkvKiByZWxvY2F0aW9uIHR5cGUgKi8KKwkJCXUxNiBfZGlzcDsJLyogZXh0cmEgYWRkciBlbmNvZGUgZGF0YSAqLworI2VuZGlmCisJCX0gX3Jfc3ltOworCX0gX3VfcmVsb2M7CisKK307CisKKy8qIGFiYnJldmlhdGlvbnMgZm9yIGNvbnZlbmllbmNlICovCisjaWZuZGVmIFRZUEUKKyNkZWZpbmUgVFlQRSAgICAgIF91X3JlbG9jLl9yX3N5bS5fdHlwZQorI2RlZmluZSBVVkFMICAgICAgX3VfcmVsb2MuX3JfdXZhbC5fdXZhbAorI2RlZmluZSBTWU1ORFggICAgX3VfcmVsb2MuX3Jfc3ltLl9zeW1uZHgKKyNkZWZpbmUgT0ZGU0VUICAgIF91X3JlbG9jLl9yX2ZpZWxkLl9vZmZzZXQKKyNkZWZpbmUgRklFTERTWiAgIF91X3JlbG9jLl9yX2ZpZWxkLl9maWVsZHN6CisjZGVmaW5lIFdPUkRTWiAgICBfdV9yZWxvYy5fcl9maWVsZC5fd29yZHN6CisjZGVmaW5lIFJfRElTUCAgICAgIF91X3JlbG9jLl9yX3N5bS5fZGlzcAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqLworLyogSW1wb3J0YW50IERPRkYgbWFjcm9zIHVzZWQgZm9yIGZpbGUgcHJvY2Vzc2luZyAqLworLyogKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIERPRkYgVmVyc2lvbnMgKi8KKyNkZWZpbmUgICAgICAgICBET0ZGMCAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3Mvc2l6ZSA+PSB0byBhZGRyIHRoYXQgaXMgYXQgYSAzMi1iaXQgYm91bmRhcnkgKi8KKy8qIFRoaXMgYXNzdW1lcyB0aGF0IGEgYnl0ZSBpcyA4IGJpdHMgKi8KKyNkZWZpbmUgICAgICAgICBET0ZGX0FMSUdOKGFkZHIpICAgICAgICAgICAgKCgoYWRkcikgKyAzKSAmIH4zVUwpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqLworLyogVGhlIERPRkYgc2VjdGlvbiBoZWFkZXIgZmxhZ3MgZmllbGQgaXMgbGFpZCBvdXQgYXMgZm9sbG93czogKi8KKy8qICovCisvKiAgQml0cyAwLTMgOiBTZWN0aW9uIFR5cGUgKi8KKy8qICBCaXQgICAgNCA6IFNldCB3aGVuIHNlY3Rpb24gcmVxdWlyZXMgdGFyZ2V0IG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgYnkgREwgKi8KKy8qICBCaXQgICAgNSA6IFNldCB3aGVuIHNlY3Rpb24gcmVxdWlyZXMgZG93bmxvYWRpbmcgKi8KKy8qICBCaXRzIDgtMTE6IEFsaWdubWVudCwgc2FtZSBhcyBDT0ZGICovCisvKiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogRW51bSBmb3IgRE9GRiBzZWN0aW9uIHR5cGVzIChiaXRzIDAtMyBvZiBmbGFnKTogU2VlIGR5bmFtaWNfbG9hZGVyLmggKi8KKyNkZWZpbmUgRFNfU0VDVElPTl9UWVBFX01BU0sJMHhGCisvKiBEU19BTExPQ0FURSBpbmRpY2F0ZXMgd2hldGhlciBhIHNlY3Rpb24gbmVlZHMgc3BhY2Ugb24gdGhlIHRhcmdldCAqLworI2RlZmluZSBEU19BTExPQ0FURV9NQVNLICAgICAgICAgICAgMHgxMAorLyogRFNfRE9XTkxPQUQgaW5kaWNhdGVzIHRoYXQgdGhlIGxvYWRlciBuZWVkcyB0byBjb3B5IGJpdHMgKi8KKyNkZWZpbmUgRFNfRE9XTkxPQURfTUFTSyAgICAgICAgICAgIDB4MjAKKy8qIFNlY3Rpb24gYWxpZ25tZW50IHJlcXVpcmVtZW50IGluIEFVcyAqLworI2RlZmluZSBEU19BTElHTk1FTlRfU0hJRlQJOAorCitzdGF0aWMgaW5saW5lIGJvb2wgZGxvYWRfY2hlY2tfdHlwZShzdHJ1Y3QgZG9mZl9zY25oZHJfdCAqc3B0ciwgdTMyIGZsYWcpCit7CisJcmV0dXJuIChzcHRyLT5kc19mbGFncyAmIERTX1NFQ1RJT05fVFlQRV9NQVNLKSA9PSBmbGFnOworfQorc3RhdGljIGlubGluZSBib29sIGRzX25lZWRzX2FsbG9jYXRpb24oc3RydWN0IGRvZmZfc2NuaGRyX3QgKnNwdHIpCit7CisJcmV0dXJuIHNwdHItPmRzX2ZsYWdzICYgRFNfQUxMT0NBVEVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBib29sIGRzX25lZWRzX2Rvd25sb2FkKHN0cnVjdCBkb2ZmX3Njbmhkcl90ICpzcHRyKQoreworCXJldHVybiBzcHRyLT5kc19mbGFncyAmIERTX0RPV05MT0FEX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzX2FsaWdubWVudCh1MTYgZHNfZmxhZ3MpCit7CisJcmV0dXJuIDEgPDwgKChkc19mbGFncyA+PiBEU19BTElHTk1FTlRfU0hJRlQpICYgRFNfU0VDVElPTl9UWVBFX01BU0spOworfQorCisKKyNlbmRpZiAvKiBfRE9GRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9nZXRzZWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9nZXRzZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMzc3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL2dldHNlY3Rpb24uYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIGdldHNlY3Rpb24uYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2dldHNlY3Rpb24uaD4KKyNpbmNsdWRlICJoZWFkZXIuaCIKKworLyoKKyAqIEVycm9yIHN0cmluZ3MKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgcmVhZHN0cm1bXSA9IHsgIkVycm9yIHJlYWRpbmcgJXMgZnJvbSBpbnB1dCBzdHJlYW0iIH07CitzdGF0aWMgY29uc3QgY2hhciBzZWVrW10gPSB7ICJTZXQgZmlsZSBwb3NpdGlvbiB0byAlZCBmYWlsZWQiIH07CitzdGF0aWMgY29uc3QgY2hhciBpc2l6W10gPSB7ICJCYWQgaW1hZ2UgcGFja2V0IHNpemUgJWQiIH07CitzdGF0aWMgY29uc3QgY2hhciBlcnJfY2hlY2tzdW1bXSA9IHsgIkNoZWNrc3VtIGZhaWxlZCBvbiAlcyIgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZXJyX3JlbG9jW10gPSB7ICJkbG9hZF9nZXRfc2VjdGlvbiB1bmFibGUgdG8gcmVhZCIKKwkgICAgInNlY3Rpb25zIGNvbnRhaW5pbmcgcmVsb2NhdGlvbiBlbnRyaWVzIgorfTsKKworI2lmIEJJVFNfUEVSX0FVID4gQklUU19QRVJfQllURQorc3RhdGljIGNvbnN0IGNoYXIgZXJyX2FsbG9jW10gPSB7ICJTeW1zLT5kbG9hZF9hbGxvY2F0ZSggJWQgKSBmYWlsZWQiIH07CitzdGF0aWMgY29uc3QgY2hhciBzdGJsW10gPSB7ICJCYWQgc3RyaW5nIHRhYmxlIG9mZnNldCAiIEZNVF9VSTMyIH07CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKioqKioqKioqKioqKioqKioqKioqIFNVUFBPUlQgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWYgQklUU19QRVJfQVUgPiBCSVRTX1BFUl9CWVRFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSB1bnBhY2tfc2VjX25hbWUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIGRsdGhpcwkJSGFuZGxlIGZyb20gZGxvYWRfbW9kdWxlX29wZW4gZm9yIHRoaXMgbW9kdWxlCisgKglzb2Zmc2V0CSAgICBCeXRlIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcgdGFibGUKKyAqICBkc3QgICAgICAgICBQbGFjZSB0byBzdG9yZSB0aGUgZXhwYW5kZWQgc3RyaW5nCisgKgorICogRWZmZWN0OgorICoJU3RvcmVzIGEgc3RyaW5nIGZyb20gdGhlIHN0cmluZyB0YWJsZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiwgZXhwYW5kaW5nCisgKiBpdCBpbiB0aGUgcHJvY2Vzcy4gIFJldHVybnMgYSBwb2ludGVyIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdG9yZWQKKyAqIHN0cmluZyBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGNoYXIgKnVucGFja19zZWNfbmFtZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdTMyIHNvZmZzZXQsIGNoYXIgKmRzdCkKK3sKKwl1OCB0bXAsICpzcmM7CisKKwlpZiAoc29mZnNldCA+PSBkbHRoaXMtPmRmaWxlX2hkci5kZl9zY25fbmFtZV9zaXplKSB7CisJCWRsb2FkX2Vycm9yKGRsdGhpcywgc3RibCwgc29mZnNldCk7CisJCXJldHVybiBOVUxMOworCX0KKwlzcmMgPSAodTggKikgZGx0aGlzLT5zdHJfaGVhZCArCisJICAgIChzb2Zmc2V0ID4+IChMT0dfQklUU19QRVJfQVUgLSBMT0dfQklUU19QRVJfQllURSkpOworCWlmIChzb2Zmc2V0ICYgMSkKKwkJKmRzdCsrID0gKnNyYysrOwkvKiBvbmx5IDEgY2hhcmFjdGVyIGluIGZpcnN0IHdvcmQgKi8KKwlkbyB7CisJCXRtcCA9ICpzcmMrKzsKKwkJKmRzdCA9ICh0bXAgPj4gQklUU19QRVJfQllURSkKKwkJICAgIGlmICghKCpkc3QrKykpCisJCQlicmVhazsKKwl9IHdoaWxlICgoKmRzdCsrID0gdG1wICYgQllURV9NQVNLKSk7CisKKwlyZXR1cm4gZHN0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBleHBhbmRfc2VjX25hbWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqICBkbHRoaXMJCUhhbmRsZSBmcm9tIGRsb2FkX21vZHVsZV9vcGVuIGZvciB0aGlzIG1vZHVsZQorICoKKyAqIEVmZmVjdDoKKyAqICAgIEFsbG9jYXRlcyBhIGJ1ZmZlciwgdW5wYWNrcyBhbmQgY29waWVzIHN0cmluZ3MgZnJvbSBzdHJpbmcgdGFibGUgaW50byBpdC4KKyAqIFN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbnRvIGEgc3RhdGUgdmFyaWFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQgZXhwYW5kX3NlY19uYW1lcyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcykKK3sKKwljaGFyICp4c3RyaW5ncywgKmN1cnIsICpuZXh0OworCXUzMiB4c2l6ZTsKKwl1MTYgc2VjOworCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICpzaHA7CisJLyogYXNzdW1lIHdvcnN0LWNhc2Ugc2l6ZSByZXF1aXJlbWVudCAqLworCXhzaXplID0gZGx0aGlzLT5kZmlsZV9oZHIuZGZfbWF4X3N0cl9sZW4gKiBkbHRoaXMtPmRmaWxlX2hkci5kZl9ub19zY25zOworCXhzdHJpbmdzID0gKGNoYXIgKilkbHRoaXMtPm15c3ltLT5kbG9hZF9hbGxvY2F0ZShkbHRoaXMtPm15c3ltLCB4c2l6ZSk7CisJaWYgKHhzdHJpbmdzID09IE5VTEwpIHsKKwkJZGxvYWRfZXJyb3IoZGx0aGlzLCBlcnJfYWxsb2MsIHhzaXplKTsKKwkJcmV0dXJuOworCX0KKwlkbHRoaXMtPnhzdHJpbmdzID0geHN0cmluZ3M7CisJLyogRm9yIGVhY2ggc2VjLCBjb3B5IGFuZCBleHBhbmQgaXRzIG5hbWUgKi8KKwljdXJyID0geHN0cmluZ3M7CisJZm9yIChzZWMgPSAwOyBzZWMgPCBkbHRoaXMtPmRmaWxlX2hkci5kZl9ub19zY25zOyBzZWMrKykgeworCQlzaHAgPSAoc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKikmZGx0aGlzLT5zZWN0X2hkcnNbc2VjXTsKKwkJbmV4dCA9IHVucGFja19zZWNfbmFtZShkbHRoaXMsICoodTMyICopICZzaHAtPm5hbWUsIGN1cnIpOworCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJYnJlYWs7CS8qIGVycm9yICovCisJCXNocC0+bmFtZSA9IGN1cnI7CisJCWN1cnIgPSBuZXh0OworCX0KK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyoqKioqKioqKioqKioqKioqKioqKiBFWFBPUlRFRCBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfbW9kdWxlX29wZW4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJbW9kdWxlCVRoZSBpbnB1dCBzdHJlYW0gdGhhdCBzdXBwbGllcyB0aGUgbW9kdWxlIGltYWdlCisgKglzeW1zCUhvc3Qtc2lkZSBtYWxsb2MvZnJlZSBhbmQgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9ucy4KKyAqCQkJT3RoZXIgbWV0aG9kcyBhcmUgdW51c2VkLgorICoKKyAqIEVmZmVjdDoKKyAqCVJlYWRzIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIGEgZHluYW1pYyBsb2FkZXIgbW9kdWxlIHVzaW5nIHRoZQorICAgIHNwZWNpZmllZAorICogc3RyZWFtIG9iamVjdCwgYW5kIHJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBtb2R1bGUgaW5mb3JtYXRpb24uICBUaGlzCisgKiBoYW5kbGUgbWF5IGJlIHVzZWQgaW4gc3Vic2VxdWVudCBxdWVyeSBjYWxscyB0byBvYnRhaW4gaW5mb3JtYXRpb24KKyAqIGNvbnRhaW5lZCBpbiB0aGUgbW9kdWxlLgorICoKKyAqIFJldHVybnM6CisgKglOVUxMIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLCBvdGhlcndpc2UgYSBtb2R1bGUgaGFuZGxlIGZvciB1c2UKKyAqIGluIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCit2b2lkICpkbG9hZF9tb2R1bGVfb3BlbihzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3RyZWFtICptb2R1bGUsCisJCQkJICAgIHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0gKnN5bXMpCit7CisJc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXM7CS8qIGludGVybmFsIHN0YXRlIGZvciB0aGlzIGNhbGwgKi8KKwl1bnNpZ25lZCAqZHAsIHN6OworCXUzMiBzZWNfc3RhcnQ7CisjaWYgQklUU19QRVJfQVUgPD0gQklUU19QRVJfQllURQorCXUxNiBzZWM7CisjZW5kaWYKKworCS8qIENoZWNrIHRoYXQgbWFuZGF0b3J5IGFyZ3VtZW50cyBhcmUgcHJlc2VudCAqLworCWlmICghbW9kdWxlIHx8ICFzeW1zKSB7CisJCWlmIChzeW1zICE9IE5VTEwpCisJCQlkbG9hZF9zeW1zX2Vycm9yKHN5bXMsICJSZXF1aXJlZCBwYXJhbWV0ZXIgaXMgTlVMTCIpOworCisJCXJldHVybiBOVUxMOworCX0KKworCWRsdGhpcyA9IChzdHJ1Y3QgZGxvYWRfc3RhdGUgKikKKwkgICAgc3ltcy0+ZGxvYWRfYWxsb2NhdGUoc3ltcywgc2l6ZW9mKHN0cnVjdCBkbG9hZF9zdGF0ZSkpOworCWlmICghZGx0aGlzKSB7CisJCS8qIG5vdCBlbm91Z2ggc3RvcmFnZSAqLworCQlkbG9hZF9zeW1zX2Vycm9yKHN5bXMsICJDYW4ndCBhbGxvY2F0ZSBtb2R1bGUgaW5mbyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjbGVhciBvdXIgaW50ZXJuYWwgc3RhdGUgKi8KKwlkcCA9ICh1bnNpZ25lZCAqKWRsdGhpczsKKwlmb3IgKHN6ID0gc2l6ZW9mKHN0cnVjdCBkbG9hZF9zdGF0ZSkgLyBzaXplb2YodW5zaWduZWQpOworCSAgICAgc3ogPiAwOyBzeiAtPSAxKQorCQkqZHArKyA9IDA7CisKKwlkbHRoaXMtPnN0cm0gPSBtb2R1bGU7CisJZGx0aGlzLT5teXN5bSA9IHN5bXM7CisKKwkvKiByZWFkIGluIHRoZSBkb2ZmIGltYWdlIGFuZCBzdG9yZSBpbiBvdXIgc3RhdGUgdmFyaWFibGUgKi8KKwlkbG9hZF9oZWFkZXJzKGRsdGhpcyk7CisKKwlpZiAoIWRsdGhpcy0+ZGxvYWRfZXJyY291bnQpCisJCWRsb2FkX3N0cmluZ3MoZGx0aGlzLCB0cnVlKTsKKworCS8qIHNraXAgYWhlYWQgcGFzdCB0aGUgdW5yZWFkIHBvcnRpb24gb2YgdGhlIHN0cmluZyB0YWJsZSAqLworCXNlY19zdGFydCA9IHNpemVvZihzdHJ1Y3QgZG9mZl9maWxlaGRyX3QpICsKKwkgICAgc2l6ZW9mKHN0cnVjdCBkb2ZmX3ZlcmlmeV9yZWNfdCkgKworCSAgICBCWVRFX1RPX0hPU1QoRE9GRl9BTElHTihkbHRoaXMtPmRmaWxlX2hkci5kZl9zdHJ0YWJfc2l6ZSkpOworCisJaWYgKGRsdGhpcy0+c3RybS0+c2V0X2ZpbGVfcG9zbihkbHRoaXMtPnN0cm0sIHNlY19zdGFydCkgIT0gMCkgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsIHNlZWssIHNlY19zdGFydCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghZGx0aGlzLT5kbG9hZF9lcnJjb3VudCkKKwkJZGxvYWRfc2VjdGlvbnMoZGx0aGlzKTsKKworCWlmIChkbHRoaXMtPmRsb2FkX2VycmNvdW50KSB7CisJCWRsb2FkX21vZHVsZV9jbG9zZShkbHRoaXMpOwkvKiBlcnJvcnMsIGJsb3cgb2ZmIG91ciBzdGF0ZSAqLworCQlkbHRoaXMgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWYgQklUU19QRVJfQVUgPiBCSVRTX1BFUl9CWVRFCisJLyogRXhwYW5kIGFsbCBzZWN0aW9uIG5hbWVzIGZyb20gdGhlIHN0cmluZyB0YWJsZSBpbnRvIHRoZSAqLworCS8qIHN0YXRlIHZhcmlhYmxlLCBhbmQgY29udmVydCBzZWN0aW9uIG5hbWVzIGZyb20gYSByZWxhdGl2ZSAqLworCS8qIHN0cmluZyB0YWJsZSBvZmZzZXQgdG8gYSBwb2ludGVycyB0byB0aGUgZXhwYW5kZWQgc3RyaW5nLiAqLworCWV4cGFuZF9zZWNfbmFtZXMoZGx0aGlzKTsKKyNlbHNlCisJLyogQ29udmVydCBzZWN0aW9uIG5hbWVzIGZyb20gYSByZWxhdGl2ZSBzdHJpbmcgdGFibGUgb2Zmc2V0ICovCisJLyogdG8gYSBwb2ludGVyIGludG8gdGhlIHN0cmluZyB0YWJsZS4gKi8KKwlmb3IgKHNlYyA9IDA7IHNlYyA8IGRsdGhpcy0+ZGZpbGVfaGRyLmRmX25vX3NjbnM7IHNlYysrKSB7CisJCXN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICpzaHAgPQorCQkgICAgKHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICopJmRsdGhpcy0+c2VjdF9oZHJzW3NlY107CisJCXNocC0+bmFtZSA9IGRsdGhpcy0+c3RyX2hlYWQgKyAqKHUzMiAqKSAmc2hwLT5uYW1lOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRsdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGRsb2FkX2dldF9zZWN0aW9uX2luZm8KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIG1pbmZvCQlIYW5kbGUgZnJvbSBkbG9hZF9tb2R1bGVfb3BlbiBmb3IgdGhpcyBtb2R1bGUKKyAqCXNlY3Rpb25fbmFtZQlQb2ludGVyIHRvIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgc2VjdGlvbiBkZXNpcmVkCisgKglzZWN0aW9uX2luZm8JQWRkcmVzcyBvZiBhIHNlY3Rpb24gaW5mbyBzdHJ1Y3R1cmUgcG9pbnRlciB0byBiZQorICoJCQlpbml0aWFsaXplZAorICoKKyAqIEVmZmVjdDoKKyAqCUZpbmRzIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiBpbiB0aGUgbW9kdWxlIGluZm9ybWF0aW9uLCBhbmQgaW5pdGlhbGl6ZXMKKyAqIHRoZSBwcm92aWRlZCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKgl0cnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3Igc2VjdGlvbiBub3QgZm91bmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitpbnQgZGxvYWRfZ2V0X3NlY3Rpb25faW5mbyh2b2lkICptaW5mbywgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLAorCQkJICAgY29uc3Qgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKipjb25zdCBzZWN0aW9uX2luZm8pCit7CisJc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXM7CisJc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKnNocDsKKwl1MTYgc2VjOworCisJZGx0aGlzID0gKHN0cnVjdCBkbG9hZF9zdGF0ZSAqKW1pbmZvOworCWlmICghZGx0aGlzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKHNlYyA9IDA7IHNlYyA8IGRsdGhpcy0+ZGZpbGVfaGRyLmRmX25vX3NjbnM7IHNlYysrKSB7CisJCXNocCA9IChzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqKSZkbHRoaXMtPnNlY3RfaGRyc1tzZWNdOworCQlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgc2hwLT5uYW1lKSA9PSAwKSB7CisJCQkqc2VjdGlvbl9pbmZvID0gc2hwOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNkZWZpbmUgSVBIX1NJWkUgKHNpemVvZihzdHJ1Y3QgaW1hZ2VfcGFja2V0X3QpIC0gc2l6ZW9mKHUzMikpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGRsb2FkX2dldF9zZWN0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtaW5mbwkJSGFuZGxlIGZyb20gZGxvYWRfbW9kdWxlX29wZW4gZm9yIHRoaXMgbW9kdWxlCisgKglzZWN0aW9uX2luZm8JUG9pbnRlciB0byBhIHNlY3Rpb24gaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXNpcmVkCisgKgkJCXNlY3Rpb24KKyAqCXNlY3Rpb25fZGF0YQlCdWZmZXIgdG8gY29udGFpbiB0aGUgc2VjdGlvbiBpbml0aWFsaXplZCBkYXRhCisgKgorICogRWZmZWN0OgorICoJQ29waWVzIHRoZSBpbml0aWFsaXplZCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHNlY3Rpb24gaW50byB0aGUKKyAqIHN1cHBsaWVkIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICoJdHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2UgZm9yIHNlY3Rpb24gbm90IGZvdW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworaW50IGRsb2FkX2dldF9zZWN0aW9uKHZvaWQgKm1pbmZvLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvLAorCQkgICAgICB2b2lkICpzZWN0aW9uX2RhdGEpCit7CisJc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXM7CisJdTMyIHBvczsKKwlzdHJ1Y3QgZG9mZl9zY25oZHJfdCAqc3B0ciA9IE5VTEw7CisJczMyIG5pcDsKKwlzdHJ1Y3QgaW1hZ2VfcGFja2V0X3QgaXBhY2tldDsKKwlzMzIgaXBzaXplOworCXUzMiBjaGVja3M7CisJczggKmRlc3QgPSAoczggKikgc2VjdGlvbl9kYXRhOworCisJZGx0aGlzID0gKHN0cnVjdCBkbG9hZF9zdGF0ZSAqKW1pbmZvOworCWlmICghZGx0aGlzKQorCQlyZXR1cm4gZmFsc2U7CisJc3B0ciA9IChzdHJ1Y3QgZG9mZl9zY25oZHJfdCAqKXNlY3Rpb25faW5mbzsKKwlpZiAoc3B0ciA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBza2lwIGFoZWFkIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgcGFja2V0ICovCisJcG9zID0gQllURV9UT19IT1NUKERPRkZfQUxJR04oKHUzMikgc3B0ci0+ZHNfZmlyc3RfcGt0X29mZnNldCkpOworCWlmIChkbHRoaXMtPnN0cm0tPnNldF9maWxlX3Bvc24oZGx0aGlzLT5zdHJtLCBwb3MpICE9IDApIHsKKwkJZGxvYWRfZXJyb3IoZGx0aGlzLCBzZWVrLCBwb3MpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbmlwID0gc3B0ci0+ZHNfbmlwYWNrczsKKwl3aGlsZSAoKG5pcCAtPSAxKSA+PSAwKSB7CS8qIGZvciBlYWNoIHBhY2tldCAqLworCQkvKiBnZXQgdGhlIGZpeGVkIGhlYWRlciBiaXRzICovCisJCWlmIChkbHRoaXMtPnN0cm0tPnJlYWRfYnVmZmVyKGRsdGhpcy0+c3RybSwgJmlwYWNrZXQsCisJCQkJCSAgICAgIElQSF9TSVpFKSAhPSBJUEhfU0laRSkgeworCQkJZGxvYWRfZXJyb3IoZGx0aGlzLCByZWFkc3RybSwgImltYWdlIHBhY2tldCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCS8qIHJlb3JkZXIgdGhlIGhlYWRlciBpZiBuZWVkIGJlICovCisJCWlmIChkbHRoaXMtPnJlb3JkZXJfbWFwKQorCQkJZGxvYWRfcmVvcmRlcigmaXBhY2tldCwgSVBIX1NJWkUsIGRsdGhpcy0+cmVvcmRlcl9tYXApOworCisJCS8qIE5vdyByZWFkIHRoZSBwYWNrZXQgaW1hZ2UgYml0cy4gTm90ZTogcm91bmQgdGhlIHNpemUgdXAgdG8KKwkJICogdGhlIG5leHQgbXVsdGlwbGUgb2YgNCBieXRlczsgdGhpcyBpcyB3aGF0IGNoZWNrc3VtCisJCSAqIHJvdXRpbmVzIHdhbnQuICovCisJCWlwc2l6ZSA9IEJZVEVfVE9fSE9TVChET0ZGX0FMSUdOKGlwYWNrZXQucGFja2V0X3NpemUpKTsKKwkJaWYgKGlwc2l6ZSA+IEJZVEVfVE9fSE9TVChJTUFHRV9QQUNLRVRfU0laRSkpIHsKKwkJCWRsb2FkX2Vycm9yKGRsdGhpcywgaXNpeiwgaXBzaXplKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZGx0aGlzLT5zdHJtLT5yZWFkX2J1ZmZlcgorCQkgICAgKGRsdGhpcy0+c3RybSwgZGVzdCwgaXBzaXplKSAhPSBpcHNpemUpIHsKKwkJCWRsb2FkX2Vycm9yKGRsdGhpcywgcmVhZHN0cm0sICJpbWFnZSBwYWNrZXQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvKiByZW9yZGVyIHRoZSBieXRlcyBpZiBuZWVkIGJlICovCisjaWYgIWRlZmluZWQoX0JJR19FTkRJQU4pIHx8IChUQVJHRVRfQVVfQklUUyA+IDE2KQorCQlpZiAoZGx0aGlzLT5yZW9yZGVyX21hcCkKKwkJCWRsb2FkX3Jlb3JkZXIoZGVzdCwgaXBzaXplLCBkbHRoaXMtPnJlb3JkZXJfbWFwKTsKKworCQljaGVja3MgPSBkbG9hZF9jaGVja3N1bShkZXN0LCBpcHNpemUpOworI2Vsc2UKKwkJaWYgKGRsdGhpcy0+ZGZpbGVfaGRyLmRmX2J5dGVfcmVzaHVmZmxlICE9CisJCSAgICBUQVJHRVRfT1JERVIoUkVPUkRFUl9NQVAoQllURV9SRVNIVUZGTEVfVkFMVUUpKSkgeworCQkJLyogcHV0IGltYWdlIGJ5dGVzIGluIGJpZy1lbmRpYW4gb3JkZXIsIG5vdCBQQyBvcmRlciAqLworCQkJZGxvYWRfcmVvcmRlcihkZXN0LCBpcHNpemUsCisJCQkJICAgICAgVEFSR0VUX09SREVSKGRsdGhpcy0+CisJCQkJCQlkZmlsZV9oZHIuZGZfYnl0ZV9yZXNodWZmbGUpKTsKKwkJfQorI2lmIFRBUkdFVF9BVV9CSVRTID4gOAorCQljaGVja3MgPSBkbG9hZF9yZXZlcnNlX2NoZWNrc3VtMTYoZGVzdCwgaXBzaXplKTsKKyNlbHNlCisJCWNoZWNrcyA9IGRsb2FkX3JldmVyc2VfY2hlY2tzdW0oZGVzdCwgaXBzaXplKTsKKyNlbmRpZgorI2VuZGlmCisJCWNoZWNrcyArPSBkbG9hZF9jaGVja3N1bSgmaXBhY2tldCwgSVBIX1NJWkUpOworCisJCS8qIE5ZSTogdW5hYmxlIHRvIGhhbmRsZSByZWxvY2F0aW9uIGVudHJpZXMgaGVyZS4gIFJlbG9jCisJCSAqIGVudHJpZXMgcmVmZXJyaW5nIHRvIGZpZWxkcyB0aGF0IHNwYW4gdGhlIHBhY2tldCBib3VuZGFyaWVzCisJCSAqIG1heSByZXN1bHQgaW4gcGFja2V0cyBvZiBzaXplcyB0aGF0IGFyZSBub3QgbXVsdGlwbGUgb2YKKwkJICogNCBieXRlcy4gT3VyIGNoZWNrc3VtIGltcGxlbWVudGF0aW9uIHdvcmtzIG9uIDMyLWJpdCB3b3JkcworCQkgKiBvbmx5LiAqLworCQlpZiAoaXBhY2tldC5udW1fcmVsb2NzICE9IDApIHsKKwkJCWRsb2FkX2Vycm9yKGRsdGhpcywgZXJyX3JlbG9jLCBpcHNpemUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKH5jaGVja3MpIHsKKwkJCWRsb2FkX2Vycm9yKGRsdGhpcywgZXJyX2NoZWNrc3VtLCAiaW1hZ2UgcGFja2V0Iik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvKkFkdmFuY2UgZGVzdGluYXRpb24gcHRyIGJ5IHRoZSBzaXplIG9mIHRoZSBqdXN0LXJlYWQgcGFja2V0ICovCisJCWRlc3QgKz0gaXBzaXplOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfbW9kdWxlX2Nsb3NlCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtaW5mbwkJSGFuZGxlIGZyb20gZGxvYWRfbW9kdWxlX29wZW4gZm9yIHRoaXMgbW9kdWxlCisgKgorICogRWZmZWN0OgorICoJUmVsZWFzZXMgYW55IHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUgaGFuZGxlLiAgT24gcmV0dXJuLAorICogdGhlIG1vZHVsZSBoYW5kbGUgaXMgaW52YWxpZC4KKyAqCisgKiBSZXR1cm5zOgorICoJWmVybyBmb3Igc3VjY2Vzcy4gT24gZXJyb3IsIHRoZSBudW1iZXIgb2YgZXJyb3JzIGRldGVjdGVkIGlzIHJldHVybmVkLgorICogSW5kaXZpZHVhbCBlcnJvcnMgYXJlIHJlcG9ydGVkIHVzaW5nIHN5bXMtPmVycm9yX3JlcG9ydCgpLCB3aGVyZSBzeW1zIHdhcworICogYW4gYXJndW1lbnQgdG8gZGxvYWRfbW9kdWxlX29wZW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCit2b2lkIGRsb2FkX21vZHVsZV9jbG9zZSh2b2lkICptaW5mbykKK3sKKwlzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpczsKKworCWRsdGhpcyA9IChzdHJ1Y3QgZGxvYWRfc3RhdGUgKiltaW5mbzsKKwlpZiAoIWRsdGhpcykKKwkJcmV0dXJuOworCisJaWYgKGRsdGhpcy0+c3RyX2hlYWQpCisJCWRsdGhpcy0+bXlzeW0tPmRsb2FkX2RlYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJCWRsdGhpcy0+c3RyX2hlYWQpOworCisJaWYgKGRsdGhpcy0+c2VjdF9oZHJzKQorCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQlkbHRoaXMtPnNlY3RfaGRycyk7CisKKyNpZiBCSVRTX1BFUl9BVSA+IEJJVFNfUEVSX0JZVEUKKwlpZiAoZGx0aGlzLT54c3RyaW5ncykKKwkJZGx0aGlzLT5teXN5bS0+ZGxvYWRfZGVhbGxvY2F0ZShkbHRoaXMtPm15c3ltLAorCQkJCQkJZGx0aGlzLT54c3RyaW5ncyk7CisKKyNlbmRpZgorCisJZGx0aGlzLT5teXN5bS0+ZGxvYWRfZGVhbGxvY2F0ZShkbHRoaXMtPm15c3ltLCBkbHRoaXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvaGVhZGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUwYTE1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL2hlYWRlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBoZWFkZXIuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjZGVmaW5lIERMX1NUUkNNUCAgc3RyY21wCisKKy8qIG1heGltdW0gcGFyZW50aGVzaXMgbmVzdGluZyBpbiByZWxvY2F0aW9uIHN0YWNrIGV4cHJlc3Npb25zICovCisjZGVmaW5lIFNUQVRJQ19FWFBSX1NUS19TSVpFIDEwCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiZG9mZi5oIgorI2luY2x1ZGUgPGRzcGJyaWRnZS9keW5hbWljX2xvYWRlci5oPgorI2luY2x1ZGUgInBhcmFtcy5oIgorI2luY2x1ZGUgImRsb2FkX2ludGVybmFsLmgiCisjaW5jbHVkZSAicmVsb2NfdGFibGUuaCIKKworLyoKKyAqIFBsYXVzaWJpbGl0eSBsaW1pdHMKKyAqCisgKiBUaGVzZSBsaW1pdHMgYXJlIGltcG9zZWQgdXBvbiB0aGUgaW5wdXQgRE9GRiBmaWxlIGFzIGEgY2hlY2sgZm9yIHZhbGlkaXR5LgorICogVGhleSBhcmUgaGFyZCBsaW1pdHMsIGluIHRoYXQgdGhlIGxvYWQgd2lsbCBmYWlsIGlmIHRoZXkgYXJlIGV4Y2VlZGVkLgorICogVGhlIG51bWJlcnMgc2VsZWN0ZWQgYXJlIGFyYml0cmFyeSwgaW4gdGhhdCB0aGUgbG9hZGVyIGltcGxlbWVudGF0aW9uIGRvZXMKKyAqIG5vdCByZXF1aXJlIHRoZXNlIGxpbWl0cy4KKyAqLworCisvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgTUFYX1JFQVNPTkFCTEVfU1RSSU5HVEFCICgweDEwMDAwMCkKKy8qIG1heGltdW0gbnVtYmVyIG9mIGNvZGUsZGF0YSxldGMuIHNlY3Rpb25zICovCisjZGVmaW5lIE1BWF9SRUFTT05BQkxFX1NFQ1RJT05TICgyMDApCisvKiBtYXhpbXVtIG51bWJlciBvZiBsaW5rZXIgc3ltYm9scyAqLworI2RlZmluZSBNQVhfUkVBU09OQUJMRV9TWU1CT0xTICgxMDAwMDApCisKKy8qIHNoaWZ0IGNvdW50IHRvIGFsaWduIEZfQklHIHdpdGggRExPQURfTElUVExFICovCisjZGVmaW5lIEFMSUdOX0NPRkZfRU5ESUFOTkVTUyA3CisjZGVmaW5lIEVORElBTk5FU1NfTUFTSyAoREZfQllURV9PUkRFUiA+PiBBTElHTl9DT0ZGX0VORElBTk5FU1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9tb2R1bGVfbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvbW9kdWxlX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE2YmIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvbW9kdWxlX2xpc3QuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIGRzcGJyaWRnZS9tcHVfZHJpdmVyL3NyYy9keW5sb2FkL21vZHVsZV9saXN0LmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qCisgKiBUaGlzIEMgaGVhZGVyIGZpbGUgZ2l2ZXMgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgY3JlYXRlZCBieSB0aGUKKyAqIGR5bmFtaWMgbG9hZGVyIHRvIGRlc2NyaWJlIHRoZSBzZXQgb2YgbW9kdWxlcyBsb2FkZWQgaW50byB0aGUgRFNQLgorICoKKyAqIExpbmtlZCBMaXN0IFN0cnVjdHVyZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIGhlcmUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3QuICBUaGUgbGlzdAorICogcmVwcmVzZW50cyB0aGUgc2V0IG9mIG1vZHVsZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBsb2FkZWQgaW4gdGhlIERTUCBtZW1vcnkuCisgKiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3QgaXMgYSBoZWFkZXIgcmVjb3JkIHdoaWNoIGNvbnRhaW5zIGEgZmxhZworICogcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdC4gIFRoZSByZXN0IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0CisgKiBhcmUgbW9kdWxlIHJlY29yZHMuCisgKgorICogR2xvYmFsIHN5bWJvbCAgX0RMTW9kdWxlcyBkZXNpZ25hdGVzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGxpc3QgKGkuZS4gdGhlCisgKiBoZWFkZXIgcmVjb3JkKS4gIFRoaXMgc3ltYm9sIG11c3QgYmUgZGVmaW5lZCBpbiBhbnkgcHJvZ3JhbSB0aGF0IHdpc2hlcyB0bworICogdXNlIERMTHZpZXcgcGx1Zy1pbi4KKyAqCisgKiBTdHJpbmcgUmVwcmVzZW50YXRpb246CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgc3RyaW5nIG5hbWVzIG9mIHRoZSBtb2R1bGUgYW5kIGl0cyBzZWN0aW9ucyBhcmUgc3RvcmVkIGluIGEgYmxvY2sgb2YKKyAqIG1lbW9yeSB3aGljaCBmb2xsb3dzIHRoZSBtb2R1bGUgcmVjb3JkIGl0c2VsZi4gIFRoZSBzdHJpbmdzIGFyZSBvcmRlcmVkOgorICogbW9kdWxlIG5hbWUgZmlyc3QsIGZvbGxvd2VkIGJ5IHNlY3Rpb24gbmFtZXMgaW4gb3JkZXIgZnJvbSB0aGUgZmlyc3QKKyAqIHNlY3Rpb24gdG8gdGhlIGxhc3QuICBTdHJpbmcgbmFtZXMgYXJlIHRpZ2h0bHkgcGFja2VkIGFycmF5cyBvZiA4LWJpdAorICogY2hhcmFjdGVycyAodHdvIGNoYXJhY3RlcnMgcGVyIDE2LWJpdCB3b3JkIG9uIHRoZSBDNTV4KS4gIFN0cmluZ3MgYXJlCisgKiB6ZXJvLWJ5dGUtdGVybWluYXRlZC4KKyAqCisgKiBDcmVhdGluZyBhbmQgdXBkYXRpbmcgdGhlIGxpc3Q6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBVcG9uIGxvYWRpbmcgYSBuZXcgbW9kdWxlIGludG8gdGhlIERTUCBtZW1vcnkgdGhlIGR5bmFtaWMgbG9hZGVyIGluc2VydHMgYQorICogbmV3IG1vZHVsZSByZWNvcmQgYXMgdGhlIGZpcnN0IG1vZHVsZSByZWNvcmQgaW4gdGhlIGxpc3QuICBUaGUgZmllbGRzIG9mCisgKiB0aGlzIG1vZHVsZSByZWNvcmQgYXJlIGluaXRpYWxpemVkIHRvIHJlZmxlY3QgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1vZHVsZS4KKyAqIFRoZSBkeW5hbWljIGxvYWRlciBkb2VzIE5PVCBpbmNyZW1lbnQgdGhlIGZsYWcvY291bnRlciBpbiB0aGUgbGlzdCdzIGhlYWRlcgorICogcmVjb3JkLgorICoKKyAqIFVwb24gdW5sb2FkaW5nIGEgbW9kdWxlIGZyb20gdGhlIERTUCBtZW1vcnkgdGhlIGR5bmFtaWMgbG9hZGVyIHJlbW92ZXMgdGhlCisgKiBtb2R1bGUncyByZWNvcmQgZnJvbSB0aGlzIGxpc3QuICBUaGUgZHluYW1pYyBsb2FkZXIgYWxzbyBpbmNyZW1lbnRzIHRoZQorICogZmxhZy9jb3VudGVyIGluIHRoZSBsaXN0J3MgaGVhZGVyIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuCisgKiBjaGFuZ2VkLgorICovCisKKyNpZm5kZWYgX01PRFVMRV9MSVNUX0hfCisjZGVmaW5lIF9NT0RVTEVfTElTVF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogR2xvYmFsIHBvaW50ZXIgdG8gdGhlIG1vZHVsZXNfaGVhZGVyIHN0cnVjdHVyZSAqLworI2RlZmluZSBNT0RVTEVTX0hFQURFUiAiX0RMTW9kdWxlcyIKKyNkZWZpbmUgTU9EVUxFU19IRUFERVJfTk9fVU5ERVJTQ09SRSAiRExNb2R1bGVzIgorCisvKiBJbml0aWFsIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIElOSVRfVkVSU0lPTiAxCisKKy8qIFZlcmlmaWNhdGlvbiBudW1iZXIgLS0gdG8gYmUgcmVjb3JkZWQgaW4gZWFjaCBtb2R1bGUgcmVjb3JkICovCisjZGVmaW5lIFZFUklGSUNBVElPTiAweDc5CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJ1Y3QgZGxsX21vZHVsZTsKK3N0cnVjdCBkbGxfc2VjdDsKKworLyogdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIHRoZSBtb2R1bGVzX2hlYWRlciByZWNvcmQ7CisgKiBpdHMgYWRkcmVzcyBpcyBjb250YWluZWQgaW4gdGhlIGdsb2JhbCBfRExNb2R1bGVzIHBvaW50ZXIgKi8KK3N0cnVjdCBtb2R1bGVzX2hlYWRlciB7CisKKwkvKgorCSAqIEFkZHJlc3Mgb2YgdGhlIGZpcnN0IGRsbF9tb2R1bGUgcmVjb3JkIGluIHRoZSBsaXN0IG9yIE5VTEwuCisJICogTm90ZTogZm9yIEM1NXggdGhpcyBpcyBhIHdvcmQgYWRkcmVzcyAoQzU1eCBkYXRhIGlzCisJICogd29yZC1hZGRyZXNzYWJsZSkKKwkgKi8KKwl1MzIgZmlyc3RfbW9kdWxlOworCisJLyogQ29tYmluZWQgc3RvcmFnZSBzaXplIChpbiB0YXJnZXQgYWRkcmVzc2FibGUgdW5pdHMpIG9mIHRoZQorCSAqIGRsbF9tb2R1bGUgcmVjb3JkIHdoaWNoIGZvbGxvd3MgdGhpcyBoZWFkZXIgcmVjb3JkLCBvciB6ZXJvCisJICogaWYgdGhlIGxpc3QgaXMgZW1wdHkuICBUaGlzIHNpemUgaW5jbHVkZXMgdGhlIG1vZHVsZSdzIHN0cmluZyB0YWJsZS4KKwkgKiBOb3RlOiBmb3IgQzU1eCB0aGUgdW5pdCBpcyBhIDE2LWJpdCB3b3JkICovCisJdTE2IGZpcnN0X21vZHVsZV9zaXplOworCisJLyogQ291bnRlciBpcyBpbmNyZW1lbnRlZCB3aGVuZXZlciBhIG1vZHVsZSByZWNvcmQgaXMgcmVtb3ZlZCBmcm9tCisJICogdGhlIGxpc3QgKi8KKwl1MTYgdXBkYXRlX2ZsYWc7CisKK307CisKKy8qIGZvciBlYWNoIDMyLWJpdHMgaW4gYWJvdmUgc3RydWN0dXJlLCBhIGJpdG1hcCwgTFNCIGZpcnN0LCB3aG9zZSBiaXRzIGFyZToKKyAqIDAgPT4gYSAzMi1iaXQgdmFsdWUsIDEgPT4gMiAxNi1iaXQgdmFsdWVzICovCisvKiBzd2FwcGluZyBiaXRtYXAgZm9yIHR5cGUgbW9kdWxlc19oZWFkZXIgKi8KKyNkZWZpbmUgTU9EVUxFU19IRUFERVJfQklUTUFQIDB4MgorCisvKiBpbmZvcm1hdGlvbiByZWNvcmRlZCBhYm91dCBlYWNoIHNlY3Rpb24gaW4gYSBtb2R1bGUgKi8KK3N0cnVjdCBkbGxfc2VjdCB7CisKKwkvKiBMb2FkLXRpbWUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbi4KKwkgKiBOb3RlOiBmb3IgQzU1eCB0aGlzIGlzIGEgYnl0ZSBhZGRyZXNzIGZvciBwcm9ncmFtIHNlY3Rpb25zLCBhbmQKKwkgKiBhIHdvcmQgYWRkcmVzcyBmb3IgZGF0YSBzZWN0aW9ucy4gIEM1NXggcHJvZ3JhbSBtZW1vcnkgaXMKKwkgKiBieXRlLWFkZHJlc3NhYmxlLCB3aGlsZSBkYXRhIG1lbW9yeSBpcyB3b3JkLWFkZHJlc3NhYmxlLiAqLworCXUzMiBzZWN0X2xvYWRfYWRyOworCisJLyogUnVuLXRpbWUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbi4KKwkgKiBOb3RlIDE6IGZvciBDNTV4IHRoaXMgaXMgYSBieXRlIGFkZHJlc3MgZm9yIHByb2dyYW0gc2VjdGlvbnMsIGFuZAorCSAqIGEgd29yZCBhZGRyZXNzIGZvciBkYXRhIHNlY3Rpb25zLgorCSAqIE5vdGUgMjogZm9yIEM1NXggdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGlzIGZpZWxkIGluZGljYXRlCisJICogdGhlIHNlY3Rpb24gdHlwZTogJzAwJyBmb3IgYSBjb2RlIHNlY3Rpb24sICcxMScgZm9yIGEgZGF0YSBzZWN0aW9uCisJICogKEM1NSBhZGRyZXNzZXMgYXJlIHJlYWxseSBvbmx5IDI0LWJpdHMgd2lkZSkuICovCisJdTMyIHNlY3RfcnVuX2FkcjsKKworfTsKKworLyogdGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXJlIG1vZHVsZSByZWNvcmRzICovCitzdHJ1Y3QgZGxsX21vZHVsZSB7CisKKwkvKiBBZGRyZXNzIG9mIHRoZSBuZXh0IGRsbF9tb2R1bGUgcmVjb3JkIGluIHRoZSBsaXN0LCBvciAwIGlmIHRoaXMgaXMKKwkgKiB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIGxpc3QuCisJICogTm90ZTogZm9yIEM1NXggdGhpcyBpcyBhIHdvcmQgYWRkcmVzcyAoQzU1eCBkYXRhIGlzCisJICogd29yZC1hZGRyZXNzYWJsZSkgKi8KKwl1MzIgbmV4dF9tb2R1bGU7CisKKwkvKiBDb21iaW5lZCBzdG9yYWdlIHNpemUgKGluIHRhcmdldCBhZGRyZXNzYWJsZSB1bml0cykgb2YgdGhlCisJICogZGxsX21vZHVsZSByZWNvcmQgd2hpY2ggZm9sbG93cyB0aGlzIG9uZSwgb3IgemVybyBpZiB0aGlzIGlzIHRoZQorCSAqIGxhc3QgcmVjb3JkIGluIHRoZSBsaXN0LiAgVGhpcyBzaXplIGluY2x1ZGVzIHRoZSBtb2R1bGUncyBzdHJpbmcKKwkgKiB0YWJsZS4KKwkgKiBOb3RlOiBmb3IgQzU1eCB0aGUgdW5pdCBpcyBhIDE2LWJpdCB3b3JkLiAqLworCXUxNiBuZXh0X21vZHVsZV9zaXplOworCisJLyogdmVyc2lvbiBudW1iZXIgb2YgdGhlIHRvb2xpbmc7IHNldCB0byBJTklUX1ZFUlNJT04gZm9yIFBoYXNlIDEgKi8KKwl1MTYgdmVyc2lvbjsKKworCS8qIHRoZSB2ZXJpZmljYXRpb24gd29yZDsgc2V0IHRvIFZFUklGSUNBVElPTiAqLworCXUxNiB2ZXJpZmljYXRpb247CisKKwkvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIHNlY3RzIGFycmF5ICovCisJdTE2IG51bV9zZWN0czsKKworCS8qIE1vZHVsZSdzICJ1bmlxdWUiIGlkOyBjb3B5IG9mIHRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgaG9zdAorCSAqIENPRkYgZmlsZSAqLworCXUzMiB0aW1lc3RhbXA7CisKKwkvKiBBcnJheSBvZiBudW1fc2VjdHMgZWxlbWVudHMgb2YgdGhlIG1vZHVsZSdzIHNlY3Rpb24gcmVjb3JkcyAqLworCXN0cnVjdCBkbGxfc2VjdCBzZWN0c1sxXTsKK307CisKKy8qIGZvciBlYWNoIDMyIGJpdHMgaW4gYWJvdmUgc3RydWN0dXJlLCBhIGJpdG1hcCwgTFNCIGZpcnN0LCB3aG9zZSBiaXRzIGFyZToKKyAqIDAgPT4gYSAzMi1iaXQgdmFsdWUsIDEgPT4gMiAxNi1iaXQgdmFsdWVzICovCisjZGVmaW5lIERMTF9NT0RVTEVfQklUTUFQIDB4NgkvKiBzd2FwcGluZyBiaXRtYXAgZm9yIHR5cGUgZGxsX21vZHVsZSAqLworCisjZW5kaWYgLyogX01PRFVMRV9MSVNUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9wYXJhbXMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3BhcmFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTdmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9wYXJhbXMuaApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIHBhcmFtcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGhvc3QgYW5kIHRhcmdldCBwcm9wZXJ0aWVzIGZvciBhbGwgbWFjaGluZXMKKyAqIHN1cHBvcnRlZCBieSB0aGUgZHluYW1pYyBsb2FkZXIuICBUbyBiZSB0ZWRpb3VzLi4uCisgKgorICogaG9zdDogdGhlIG1hY2hpbmUgb24gd2hpY2ggdGhlIGR5bmFtaWMgbG9hZGVyIHJ1bnMKKyAqIHRhcmdldDogdGhlIG1hY2hpbmUgdGhhdCB0aGUgZHluYW1pYyBsb2FkZXIgaXMgbG9hZGluZworICoKKyAqIEhvc3QgYW5kIHRhcmdldCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSwgZGVwZW5kaW5nIHVwb24gdGhlIHBhcnRpY3VsYXIKKyAqIHVzZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCQkJCQkJSG9zdCBQcm9wZXJ0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBCSVRTX1BFUl9CWVRFIDgJCS8qIGJpdHMgaW4gdGhlIHN0YW5kYXJkIFBDL1NVTiBieXRlICovCisjZGVmaW5lIExPR19CSVRTX1BFUl9CWVRFIDMJLyogbG9nIGJhc2UgMiBvZiBzYW1lICovCisjZGVmaW5lIEJZVEVfTUFTSyAoKDFVPDxCSVRTX1BFUl9CWVRFKS0xKQorCisjaWYgZGVmaW5lZChfX1RNUzMyMEM1NVhfXykgfHwgZGVmaW5lZChfVE1TMzIwQzVYWCkKKyNkZWZpbmUgQklUU19QRVJfQVUgMTYKKyNkZWZpbmUgTE9HX0JJVFNfUEVSX0FVIDQKKyAvKiB1c2UgdGhpcyBwcmludCBzdHJpbmcgaW4gZXJyb3IgbWVzc2FnZXMgZm9yIHVpbnQzMl90ICovCisjZGVmaW5lIEZNVF9VSTMyICIweCVseCIKKyNkZWZpbmUgRk1UOF9VSTMyICIlMDhseCIJLyogc2FtZSBidXQgbm8gMHgsIGZpeGVkIHdpZHRoIGZpZWxkICovCisjZWxzZQorLyogYml0cyBpbiB0aGUgc21hbGxlc3QgYWRkcmVzc2FibGUgZGF0YSBzdG9yYWdlIHVuaXQgKi8KKyNkZWZpbmUgQklUU19QRVJfQVUgOAorLyogbG9nIGJhc2UgMiBvZiB0aGUgc2FtZTsgdXNlZnVsIGZvciBzaGlmdCBjb3VudHMgKi8KKyNkZWZpbmUgTE9HX0JJVFNfUEVSX0FVIDMKKyNkZWZpbmUgRk1UX1VJMzIgIjB4JXgiCisjZGVmaW5lIEZNVDhfVUkzMiAiJTA4eCIKKyNlbmRpZgorCisvKiBnZW5lcmljIGZhc3Rlc3QgbWV0aG9kIGZvciBzd2FwcGluZyBieXRlcyBhbmQgc2hvcnRzICovCisjZGVmaW5lIFNXQVAzMkJZMTYoenopICgoKHp6KSA8PCAxNikgfCAoKHp6KSA+PiAxNikpCisjZGVmaW5lIFNXQVAxNkJZOCh6eikgKCgoenopIDw8IDgpIHwgKCh6eikgPj4gOCkpCisKKy8qICEhIGRvbid0IGJlIHRlbXB0ZWQgdG8gaW5zZXJ0IHR5cGUgZGVmaW5pdGlvbnMgaGVyZTsgdXNlIDxzdGRpbnQuaD4gISEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQkJCQkJCVRhcmdldCBQcm9wZXJ0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVE1TMzIwQzZ4IFRhcmdldCBTcGVjaWZpYyBQYXJhbWV0ZXJzIChieXRlLWFkZHJlc3NhYmxlKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIFRNUzMyMDYwCisjZGVmaW5lIE1FTU9SRyAgICAgICAgICAweDBMCS8qIFNpemUgb2YgY29uZmlndXJlZCBtZW1vcnkgKi8KKyNkZWZpbmUgTUVNU0laRSAgICAgICAgIDB4MEwJLyogKGZ1bGwgYWRkcmVzcyBzcGFjZSkgKi8KKworI2RlZmluZSBDSU5JVF9BTElHTiAgICAgOAkvKiBhbGlnbm1lbnQgb2YgY2luaXQgcmVjb3JkIGluIFREQVRBIEFVcyAqLworI2RlZmluZSBDSU5JVF9DT1VOVAk0CS8qIHdpZHRoIG9mIGNvdW50IGZpZWxkIGluIFREQVRBIEFVcyAqLworI2RlZmluZSBDSU5JVF9BRERSRVNTCTQJLyogd2lkdGggb2YgYWRkcmVzcyBmaWVsZCBpbiBUREFUQSBBVXMgKi8KKyNkZWZpbmUgQ0lOSVRfUEFHRV9CSVRTCTAJLyogTnVtYmVyIG9mIExTQnMgb2YgYWRkcmVzcyB0aGF0CisJCQkJICogYXJlIHBhZ2UgbnVtYmVyICovCisKKyNkZWZpbmUgTEVOSUVOVF9TSUdORURfUkVMRVhQUyAwCS8qIERPRVMgU0lHTkVEIEFMTE9XIE1BWCBVTlNJR05FRCAqLworCisjdW5kZWYgVEFSR0VUX0VORElBTk5FU1MJLyogbWF5IGJlIGJpZyBvciBsaXR0bGUgZW5kaWFuICovCisKKy8qIGFsaWduIGEgdGFyZ2V0IGFkZHJlc3MgdG8gYSB3b3JkIGJvdW5kYXJ5ICovCisjZGVmaW5lIFRBUkdFVF9XT1JEX0FMSUdOKHp6KSAoKCh6eikgKyAweDMpICYgLTB4NCkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJCQlERUZBVUxUIFNFVFRJTkdTIGFuZCBERVJJVkVEIFBST1BFUlRJRVMKKyAqCisgKiBUaGlzIHNlY3Rpb24gZXN0YWJsaXNoZXMgZGVmYXVsdHMgZm9yIHZhbHVlcyBub3Qgc3BlY2lmaWVkIGFib3ZlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmIFRBUkdFVF9BVV9CSVRTCisjZGVmaW5lIFRBUkdFVF9BVV9CSVRTIDgJLyogd2lkdGggb2YgdGhlIHRhcmdldCBhZGRyZXNzYWJsZSB1bml0ICovCisjZGVmaW5lIExPR19UQVJHRVRfQVVfQklUUyAzCS8qIGxvZzIgb2Ygc2FtZSAqLworI2VuZGlmCisKKyNpZm5kZWYgQ0lOSVRfREVGQVVMVF9QQUdFCisjZGVmaW5lIENJTklUX0RFRkFVTFRfUEFHRSAwCS8qIGRlZmF1bHQgLmNpbml0IHBhZ2UgbnVtYmVyICovCisjZW5kaWYKKworI2lmbmRlZiBEQVRBX1JVTjJMT0FECisjZGVmaW5lIERBVEFfUlVOMkxPQUQoenopICh6eikJLyogdHJhbnNsYXRlIGRhdGEgcnVuIGFkZHJlc3MgdG8gbG9hZCBhZGRyZXNzICovCisjZW5kaWYKKworI2lmbmRlZiBEQkdfTElTVF9QQUdFCisjZGVmaW5lIERCR19MSVNUX1BBR0UgMAkJLyogcGFnZSBudW1iZXIgZm9yIC5kbGx2aWV3IHNlY3Rpb24gKi8KKyNlbmRpZgorCisjaWZuZGVmIFRBUkdFVF9XT1JEX0FMSUdOCisvKiBhbGlnbiBhIHRhcmdldCBhZGRyZXNzIHRvIGEgd29yZCBib3VuZGFyeSAqLworI2RlZmluZSBUQVJHRVRfV09SRF9BTElHTih6eikgKHp6KQorI2VuZGlmCisKKyNpZm5kZWYgVERBVEFfVE9fVEFERFIKKyNkZWZpbmUgVERBVEFfVE9fVEFERFIoenopICh6eikJLyogdGFyZ2V0IGRhdGEgYWRkcmVzcyB0byB0YXJnZXQgQVUgYWRkcmVzcyAqLworI2RlZmluZSBUQUREUl9UT19UREFUQSh6eikgKHp6KQkvKiB0YXJnZXQgQVUgYWRkcmVzcyB0byB0YXJnZXQgZGF0YSBhZGRyZXNzICovCisjZGVmaW5lIFREQVRBX0FVX0JJVFMJVEFSR0VUX0FVX0JJVFMJLyogYml0cyBwZXIgZGF0YSBBVSAqLworI2RlZmluZSBMT0dfVERBVEFfQVVfQklUUwlMT0dfVEFSR0VUX0FVX0JJVFMKKyNlbmRpZgorCisvKgorICoKKyAqIFVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBjb252ZXJzaW9ucyBkZXJpdmVkIGZyb20gdGhlIGFib3ZlCisgKgorICovCisKKy8qCisgKiBDb252ZXJzaW9ucyBiZXR3ZWVuIGhvc3QgYW5kIHRhcmdldCBhZGRyZXNzZXMKKyAqLworI2lmIExPR19CSVRTX1BFUl9BVSA9PSBMT0dfVEFSR0VUX0FVX0JJVFMKKy8qIHRyYW5zbGF0ZSB0YXJnZXQgYWRkcmVzc2FibGUgdW5pdCB0byBob3N0IGFkZHJlc3MgKi8KKyNkZWZpbmUgVEFERFJfVE9fSE9TVCh4KSAoeCkKKy8qIHRyYW5zbGF0ZSBob3N0IGFkZHJlc3MgdG8gdGFyZ2V0IGFkZHJlc3NhYmxlIHVuaXQgKi8KKyNkZWZpbmUgSE9TVF9UT19UQUREUih4KSAoeCkKKyNlbGlmIExPR19CSVRTX1BFUl9BVSA+IExPR19UQVJHRVRfQVVfQklUUworI2RlZmluZSBUQUREUl9UT19IT1NUKHgpICgoeCkgPj4gKExPR19CSVRTX1BFUl9BVS1MT0dfVEFSR0VUX0FVX0JJVFMpKQorI2RlZmluZSBIT1NUX1RPX1RBRERSKHgpICgoeCkgPDwgKExPR19CSVRTX1BFUl9BVS1MT0dfVEFSR0VUX0FVX0JJVFMpKQorI2Vsc2UKKyNkZWZpbmUgVEFERFJfVE9fSE9TVCh4KSAoKHgpIDw8IChMT0dfVEFSR0VUX0FVX0JJVFMtTE9HX0JJVFNfUEVSX0FVKSkKKyNkZWZpbmUgSE9TVF9UT19UQUREUih4KSAoKHgpID4+IChMT0dfVEFSR0VUX0FVX0JJVFMtTE9HX0JJVFNfUEVSX0FVKSkKKyNlbmRpZgorCisjaWYgTE9HX0JJVFNfUEVSX0FVID09IExPR19UREFUQV9BVV9CSVRTCisvKiB0cmFuc2xhdGUgdGFyZ2V0IGFkZHJlc3NhYmxlIHVuaXQgdG8gaG9zdCBhZGRyZXNzICovCisjZGVmaW5lIFREQVRBX1RPX0hPU1QoeCkgKHgpCisvKiB0cmFuc2xhdGUgaG9zdCBhZGRyZXNzIHRvIHRhcmdldCBhZGRyZXNzYWJsZSB1bml0ICovCisjZGVmaW5lIEhPU1RfVE9fVERBVEEoeCkgKHgpCisvKiB0cmFuc2xhdGUgaG9zdCBhZGRyZXNzIHRvIHRhcmdldCBhZGRyZXNzYWJsZSB1bml0LCByb3VuZCB1cCAqLworI2RlZmluZSBIT1NUX1RPX1REQVRBX1JPVU5EKHgpICh4KQorLyogYnl0ZSBvZmZzZXQgdG8gaG9zdCBvZmZzZXQsIHJvdW5kZWQgdXAgZm9yIFREQVRBIHNpemUgKi8KKyNkZWZpbmUgQllURV9UT19IT1NUX1REQVRBX1JPVU5EKHgpIEJZVEVfVE9fSE9TVF9ST1VORCh4KQorI2VsaWYgTE9HX0JJVFNfUEVSX0FVID4gTE9HX1REQVRBX0FVX0JJVFMKKyNkZWZpbmUgVERBVEFfVE9fSE9TVCh4KSAoKHgpID4+IChMT0dfQklUU19QRVJfQVUtTE9HX1REQVRBX0FVX0JJVFMpKQorI2RlZmluZSBIT1NUX1RPX1REQVRBKHgpICgoeCkgPDwgKExPR19CSVRTX1BFUl9BVS1MT0dfVERBVEFfQVVfQklUUykpCisjZGVmaW5lIEhPU1RfVE9fVERBVEFfUk9VTkQoeCkgKCh4KSA8PCAoTE9HX0JJVFNfUEVSX0FVLUxPR19UREFUQV9BVV9CSVRTKSkKKyNkZWZpbmUgQllURV9UT19IT1NUX1REQVRBX1JPVU5EKHgpIEJZVEVfVE9fSE9TVF9ST1VORCh4KQorI2Vsc2UKKyNkZWZpbmUgVERBVEFfVE9fSE9TVCh4KSAoKHgpIDw8IChMT0dfVERBVEFfQVVfQklUUy1MT0dfQklUU19QRVJfQVUpKQorI2RlZmluZSBIT1NUX1RPX1REQVRBKHgpICgoeCkgPj4gKExPR19UREFUQV9BVV9CSVRTLUxPR19CSVRTX1BFUl9BVSkpCisjZGVmaW5lIEhPU1RfVE9fVERBVEFfUk9VTkQoeCkgKCgoeCkgK1wKKwkJCQkoMTw8KExPR19UREFUQV9BVV9CSVRTLUxPR19CSVRTX1BFUl9BVSkpLTEpID4+XAorCQkJCShMT0dfVERBVEFfQVVfQklUUy1MT0dfQklUU19QRVJfQVUpKQorI2RlZmluZSBCWVRFX1RPX0hPU1RfVERBVEFfUk9VTkQoeCkgKEJZVEVfVE9fSE9TVCgoeCkgK1wKKwkoMTw8KExPR19UREFUQV9BVV9CSVRTLUxPR19CSVRTX1BFUl9CWVRFKSktMSkgJlwKKwktKFREQVRBX0FVX0JJVFMvQklUU19QRVJfQVUpKQorI2VuZGlmCisKKy8qCisgKiBJbnB1dCBpbiBET0ZGIGZvcm1hdCBpcyBhbHdheXMgZXhwcmVzZWQgaW4gYnl0ZXMsIHJlZ2FyZGxlc3Mgb2YgbG9hZGluZyBob3N0CisgKiBzbyB3ZSB3aW5kIHVwIGNvbnZlcnRpbmcgZnJvbSBieXRlcyB0byB0YXJnZXQgYW5kIGhvc3QgdW5pdHMgZXZlbiB3aGVuIHRoZQorICogaG9zdCBpcyBub3QgYSBieXRlIG1hY2hpbmUuCisgKi8KKyNpZiBMT0dfQklUU19QRVJfQVUgPT0gTE9HX0JJVFNfUEVSX0JZVEUKKyNkZWZpbmUgQllURV9UT19IT1NUKHgpICh4KQorI2RlZmluZSBCWVRFX1RPX0hPU1RfUk9VTkQoeCkgKHgpCisjZGVmaW5lIEhPU1RfVE9fQllURSh4KSAoeCkKKyNlbGlmIExPR19CSVRTX1BFUl9BVSA+PSBMT0dfQklUU19QRVJfQllURQorI2RlZmluZSBCWVRFX1RPX0hPU1QoeCkgKCh4KSA+PiAoTE9HX0JJVFNfUEVSX0FVIC0gTE9HX0JJVFNfUEVSX0JZVEUpKQorI2RlZmluZSBCWVRFX1RPX0hPU1RfUk9VTkQoeCkgKCh4ICsgKEJJVFNfUEVSX0FVL0JJVFNfUEVSX0JZVEUtMSkpID4+XAorCQkJICAgICAgKExPR19CSVRTX1BFUl9BVSAtIExPR19CSVRTX1BFUl9CWVRFKSkKKyNkZWZpbmUgSE9TVF9UT19CWVRFKHgpICgoeCkgPDwgKExPR19CSVRTX1BFUl9BVSAtIExPR19CSVRTX1BFUl9CWVRFKSkKKyNlbHNlCisvKiBsZXRzIG5vdCB0cnkgdG8gZGVhbCB3aXRoIHN1Yi04LWJpdCBieXRlIG1hY2hpbmVzICovCisjZW5kaWYKKworI2lmIExPR19UQVJHRVRfQVVfQklUUyA9PSBMT0dfQklUU19QRVJfQllURQorLyogdHJhbnNsYXRlIHRhcmdldCBhZGRyZXNzYWJsZSB1bml0IHRvIGJ5dGUgYWRkcmVzcyAqLworI2RlZmluZSBUQUREUl9UT19CWVRFKHgpICh4KQorLyogdHJhbnNsYXRlIGJ5dGUgYWRkcmVzcyB0byB0YXJnZXQgYWRkcmVzc2FibGUgdW5pdCAqLworI2RlZmluZSBCWVRFX1RPX1RBRERSKHgpICh4KQorI2VsaWYgTE9HX1RBUkdFVF9BVV9CSVRTID4gTE9HX0JJVFNfUEVSX0JZVEUKKyNkZWZpbmUgVEFERFJfVE9fQllURSh4KSAoKHgpIDw8IChMT0dfVEFSR0VUX0FVX0JJVFMtTE9HX0JJVFNfUEVSX0JZVEUpKQorI2RlZmluZSBCWVRFX1RPX1RBRERSKHgpICgoeCkgPj4gKExPR19UQVJHRVRfQVVfQklUUy1MT0dfQklUU19QRVJfQllURSkpCisjZWxzZQorLyogbGV0cyBub3QgdHJ5IHRvIGRlYWwgd2l0aCBzdWItOC1iaXQgYnl0ZSBtYWNoaW5lcyAqLworI2VuZGlmCisKKyNpZmRlZiBfQklHX0VORElBTgorI2RlZmluZSBIT1NUX0VORElBTk5FU1MgMQorI2Vsc2UKKyNkZWZpbmUgSE9TVF9FTkRJQU5ORVNTIDAKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX0VORElBTk5FU1MKKyNkZWZpbmUgVEFSR0VUX0VORElBTk5FU1NfRElGRkVSUyhydGVuZCkgKEhPU1RfRU5ESUFOTkVTU15UQVJHRVRfRU5ESUFOTkVTUykKKyNlbGlmIEhPU1RfRU5ESUFOTkVTUworI2RlZmluZSBUQVJHRVRfRU5ESUFOTkVTU19ESUZGRVJTKHJ0ZW5kKSAoIShydGVuZCkpCisjZWxzZQorI2RlZmluZSBUQVJHRVRfRU5ESUFOTkVTU19ESUZGRVJTKHJ0ZW5kKSAocnRlbmQpCisjZW5kaWYKKworLyogdGhlIHVuaXQgaW4gd2hpY2ggd2UgcHJvY2VzcyB0YXJnZXQgaW1hZ2UgZGF0YSAqLworI2lmIFRBUkdFVF9BVV9CSVRTIDw9IDgKK3R5cGVkZWYgdTggdGd0X2F1X3Q7CisjZWxpZiBUQVJHRVRfQVVfQklUUyA8PSAxNgordHlwZWRlZiB1MTYgdGd0X2F1X3Q7CisjZWxzZQordHlwZWRlZiB1MzIgdGd0X2F1X3Q7CisjZW5kaWYKKworLyogc2l6ZSBvZiB0aGF0IHVuaXQgKi8KKyNpZiBUQVJHRVRfQVVfQklUUyA8IEJJVFNfUEVSX0FVCisjZGVmaW5lIFRHVEFVX0JJVFMgQklUU19QRVJfQVUKKyNkZWZpbmUgTE9HX1RHVEFVX0JJVFMgTE9HX0JJVFNfUEVSX0FVCisjZWxzZQorI2RlZmluZSBUR1RBVV9CSVRTIFRBUkdFVF9BVV9CSVRTCisjZGVmaW5lIExPR19UR1RBVV9CSVRTIExPR19UQVJHRVRfQVVfQklUUworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9yZWxvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvcmVsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI4YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvcmVsb2MuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIHJlbG9jLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgImhlYWRlci5oIgorCisjaWYgVE1TMzIwNjAKKy8qIHRoZSBtYWdpYyBzeW1ib2wgZm9yIHRoZSBzdGFydCBvZiBCU1MgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGJzc3N5bWJvbFtdID0geyAiLmJzcyIgfTsKKyNlbmRpZgorCisjaWYgVE1TMzIwNjAKKyNpbmNsdWRlICJyZWxvY190YWJsZV9jNjAwMC5jIgorI2VuZGlmCisKKyNpZiBUTVMzMjA2MAorLyogRnJvbSBjb2ZmLmggLSBpZ25vcmUgdGhlc2UgcmVsb2NhdGlvbiBvcGVyYXRpb25zICovCisjZGVmaW5lIFJfQzYwQUxJR04gICAgIDB4NzYJLyogQzYwOiBBbGlnbm1lbnQgaW5mbyBmb3IgY29tcHJlc3NvciAqLworI2RlZmluZSBSX0M2MEZQSEVBRCAgICAweDc3CS8qIEM2MDogRXhwbGljaXQgYXNzZW1ibHkgZGlyZWN0aXZlICovCisjZGVmaW5lIFJfQzYwTk9DTVAgICAgMHgxMDAJLyogQzYwOiBEb24ndCBjb21wcmVzcyB0aGlzIGNvZGUgc2NuICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfdW5wYWNrCisgKgorICogUGFyYW1ldGVyczoKKyAqCWRhdGEJcG9pbnRlciB0byBzdG9yYWdlIHVuaXQgY29udGFpbmluZyBsb3dlc3QgaG9zdCBhZGRyZXNzIG9mCisgKgkJaW1hZ2UgZGF0YQorICoJZmllbGRzeglTaXplIG9mIGJpdCBmaWVsZCwgMCA8IGZpZWxkc3ogPD0gc2l6ZW9mKHJ2YWx1ZSkqQklUU19QRVJfQVUKKyAqCW9mZnNldAlPZmZzZXQgZnJvbSBMU0IsIDAgPD0gb2Zmc2V0IDwgQklUU19QRVJfQVUKKyAqCXNnbglTaWduZWRuZXNzIG9mIHRoZSBmaWVsZCAoUk9QX1NHTiwgUk9QX1VOUywgUk9QX01BWCwgUk9QX0FOWSkKKyAqCisgKiBFZmZlY3Q6CisgKglFeHRyYWN0cyB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zIGl0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3J2YWx1ZSBkbG9hZF91bnBhY2soc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIHRndF9hdV90ICogZGF0YSwgaW50IGZpZWxkc3osCisJCSAgICBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBzZ24pCit7CisJcmVnaXN0ZXIgcnZhbHVlIG9ianZhbDsKKwlyZWdpc3RlciBpbnQgc2hpZnQsIGRpcmVjdGlvbjsKKwlyZWdpc3RlciB0Z3RfYXVfdCAqZHAgPSBkYXRhOworCisJZmllbGRzeiAtPSAxOwkvKiBhdm9pZCBuYXN0aW5lc3Mgd2l0aCAzMi1iaXQgc2hpZnQgb2YgMzItYml0IHZhbHVlICovCisJLyogKiBjb2xsZWN0IHVwIGVub3VnaCBiaXRzIHRvIGNvbnRhaW4gdGhlIGRlc2lyZWQgZmllbGQgKi8KKwlpZiAoVEFSR0VUX0JJR19FTkRJQU4pIHsKKwkJZHAgKz0gKGZpZWxkc3ogKyBvZmZzZXQpID4+IExPR19UR1RBVV9CSVRTOworCQlkaXJlY3Rpb24gPSAtMTsKKwl9IGVsc2UKKwkJZGlyZWN0aW9uID0gMTsKKwlvYmp2YWwgPSAqZHAgPj4gb2Zmc2V0OworCXNoaWZ0ID0gVEdUQVVfQklUUyAtIG9mZnNldDsKKwl3aGlsZSAoc2hpZnQgPD0gZmllbGRzeikgeworCQlkcCArPSBkaXJlY3Rpb247CisJCW9ianZhbCArPSAocnZhbHVlKSAqZHAgPDwgc2hpZnQ7CisJCXNoaWZ0ICs9IFRHVEFVX0JJVFM7CisJfQorCisJLyogKiBzaWduIG9yIHplcm8gZXh0ZW5kIHRoZSB2YWx1ZSBhcHByb3ByaWF0ZWx5ICovCisJaWYgKHNnbiA9PSBST1BfVU5TKQorCQlvYmp2YWwgJj0gKDIgPDwgZmllbGRzeikgLSAxOworCWVsc2UgeworCQlzaGlmdCA9IHNpemVvZihydmFsdWUpICogQklUU19QRVJfQVUgLSAxIC0gZmllbGRzejsKKwkJb2JqdmFsID0gKG9ianZhbCA8PCBzaGlmdCkgPj4gc2hpZnQ7CisJfQorCisJcmV0dXJuIG9ianZhbDsKKworfQkJCQkvKiBkbG9hZF91bnBhY2sgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfcmVwYWNrCisgKgorICogUGFyYW1ldGVyczoKKyAqCXZhbAkJVmFsdWUgdG8gaW5zZXJ0CisgKglkYXRhCVBvaW50ZXIgdG8gc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgbG93ZXN0IGhvc3QgYWRkcmVzcyBvZgorICogCQlpbWFnZSBkYXRhCisgKglmaWVsZHN6CVNpemUgb2YgYml0IGZpZWxkLCAwIDwgZmllbGRzeiA8PSBzaXplb2YocnZhbHVlKSpCSVRTX1BFUl9BVQorICoJb2Zmc2V0CU9mZnNldCBmcm9tIExTQiwgMCA8PSBvZmZzZXQgPCBCSVRTX1BFUl9BVQorICoJc2duCVNpZ25lZG5lc3Mgb2YgdGhlIGZpZWxkIChST1BfU0dOLCBST1BfVU5TLCBST1BfTUFYLCBST1BfQU5ZKQorICoKKyAqIEVmZmVjdDoKKyAqCVN0dWZmcyB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgZmllbGQuICBSZXR1cm5zIDAgZm9yCisgKglzdWNjZXNzCisgKiBvciAxIGlmIHRoZSB2YWx1ZSB3aWxsIG5vdCBmaXQgaW4gdGhlIHNwZWNpZmllZCBmaWVsZCBhY2NvcmRpbmcgdG8gdGhlCisgKiBzcGVjaWZpZWQgc2lnbmVkbmVzcyBydWxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG92Zl9saW1pdFtdID0geyAxLCAyLCAyIH07CisKK2ludCBkbG9hZF9yZXBhY2soc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIHJ2YWx1ZSB2YWwsIHRndF9hdV90ICogZGF0YSwKKwkJIGludCBmaWVsZHN6LCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBzZ24pCit7CisJcmVnaXN0ZXIgdXJ2YWx1ZSBvYmp2YWwsIG1hc2s7CisJcmVnaXN0ZXIgaW50IHNoaWZ0LCBkaXJlY3Rpb247CisJcmVnaXN0ZXIgdGd0X2F1X3QgKmRwID0gZGF0YTsKKworCWZpZWxkc3ogLT0gMTsJLyogYXZvaWQgbmFzdGluZXNzIHdpdGggMzItYml0IHNoaWZ0IG9mIDMyLWJpdCB2YWx1ZSAqLworCS8qIGNsaXAgdGhlIGJpdHMgKi8KKwltYXNrID0gKDJVTCA8PCBmaWVsZHN6KSAtIDE7CisJb2JqdmFsID0gKHZhbCAmIG1hc2spOworCS8qICogc3RvcmUgdGhlIGJpdHMgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIG1hc2sgKi8KKwlpZiAoVEFSR0VUX0JJR19FTkRJQU4pIHsKKwkJZHAgKz0gKGZpZWxkc3ogKyBvZmZzZXQpID4+IExPR19UR1RBVV9CSVRTOworCQlkaXJlY3Rpb24gPSAtMTsKKwl9IGVsc2UKKwkJZGlyZWN0aW9uID0gMTsKKworCS8qIGluc2VydCBMU0JzICovCisJKmRwID0gKCpkcCAmIH4obWFzayA8PCBvZmZzZXQpKSArIChvYmp2YWwgPDwgb2Zmc2V0KTsKKwlzaGlmdCA9IFRHVEFVX0JJVFMgLSBvZmZzZXQ7CisJLyogYWxpZ24gbWFzayBhbmQgb2JqdmFsIHdpdGggQVUgYm91bmRhcnkgKi8KKwlvYmp2YWwgPj49IHNoaWZ0OworCW1hc2sgPj49IHNoaWZ0OworCisJd2hpbGUgKG1hc2spIHsKKwkJZHAgKz0gZGlyZWN0aW9uOworCQkqZHAgPSAoKmRwICYgfm1hc2spICsgb2JqdmFsOworCQlvYmp2YWwgPj49IFRHVEFVX0JJVFM7CisJCW1hc2sgPj49IFRHVEFVX0JJVFM7CisJfQorCisJLyoKKwkgKiBjaGVjayBmb3Igb3ZlcmZsb3cKKwkgKi8KKwlpZiAoc2duKSB7CisJCXVuc2lnbmVkIHRtcCA9ICh2YWwgPj4gZmllbGRzeikgKyAoc2duICYgMHgxKTsKKwkJaWYgKHRtcCA+IG92Zl9saW1pdFtzZ24gLSAxXSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworfQkJCQkvKiBkbG9hZF9yZXBhY2sgKi8KKworLyogbG9va3VwIHRhYmxlIGZvciB0aGUgc2NhbGluZyBhbW91bnQgaW4gYSBDNnggaW5zdHJ1Y3Rpb24gKi8KKyNpZiBUTVMzMjA2MAorI2RlZmluZSBTQ0FMRV9CSVRTIDQJCS8qIHRoZXJlIGFyZSA0IGJpdHMgaW4gdGhlIHNjYWxlIGZpZWxkICovCisjZGVmaW5lIFNDQUxFX01BU0sgMHg3CQkvKiB3ZSByZWFsbHkgb25seSB1c2UgdGhlIGJvdHRvbSAzIGJpdHMgKi8KK3N0YXRpYyBjb25zdCB1OCBjNjBfc2NhbGVbU0NBTEVfTUFTSyArIDFdID0geworCTEsIDAsIDAsIDAsIDEsIDEsIDIsIDIKK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZGxvYWRfcmVsb2NhdGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJZGF0YQlQb2ludGVyIHRvIGJhc2Ugb2YgaW1hZ2UgZGF0YQorICoJcnAJCVBvaW50ZXIgdG8gcmVsb2NhdGlvbiBvcGVyYXRpb24KKyAqCisgKiBFZmZlY3Q6CisgKglQZXJmb3JtcyB0aGUgc3BlY2lmaWVkIHJlbG9jYXRpb24gb3BlcmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZCBkbG9hZF9yZWxvY2F0ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdGd0X2F1X3QgKiBkYXRhLAorCQkgICAgc3RydWN0IHJlbG9jX3JlY29yZF90ICpycCwgYm9vbCAqdHJhbXBzX2dlbmVyYXRlZCwKKwkJICAgIGJvb2wgc2Vjb25kX3Bhc3MpCit7CisJcnZhbHVlIHZhbCwgcmVsb2NfYW10LCBvcmlnX3ZhbCA9IDA7CisJdW5zaWduZWQgaW50IGZpZWxkc3ogPSAwOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCByZWxvY19pbmZvID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVsb2NfYWN0aW9uID0gMDsKKwlyZWdpc3RlciBpbnQgcnggPSAwOworCXJ2YWx1ZSAqc3RhY2twID0gTlVMTDsKKwlpbnQgdG9wOworCXN0cnVjdCBsb2NhbF9zeW1ib2wgKnN2cCA9IE5VTEw7CisjaWZkZWYgUkZWX1NDQUxFCisJdW5zaWduZWQgaW50IHNjYWxlID0gMDsKKyNlbmRpZgorCXN0cnVjdCBpbWFnZV9wYWNrZXRfdCAqaW1nX3BrdCA9IE5VTEw7CisKKwkvKiBUaGUgaW1hZ2UgcGFja2V0IGRhdGEgc3RydWN0IGlzIG9ubHkgdXNlZCBkdXJpbmcgZmlyc3QgcGFzcworCSAqIHJlbG9jYXRpb24gaW4gdGhlIGV2ZW50IHRoYXQgYSB0cmFtcG9saW5lIGlzIG5lZWRlZC4gIDJuZCBwYXNzCisJICogcmVsb2NhdGlvbiBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGRhdGEgaXMgY29taW5nIGZyb20gYW4KKwkgKiBpbWFnZV9wYWNrZXRfdCBzdHJ1Y3R1cmUuIFNlZSBjbG9hZC5jLCBkbG9hZF9kYXRhIGZvciBob3cgaW1nX2RhdGEgaXMKKwkgKiBzZXQuIElmIHRoYXQgY2hhbmdlcyB0aGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQhISEgKi8KKwlpZiAoc2Vjb25kX3Bhc3MgPT0gZmFsc2UpCisJCWltZ19wa3QgPSAoc3RydWN0IGltYWdlX3BhY2tldF90ICopKCh1OCAqKSBkYXRhIC0KKwkJCQkJCSAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJICAgaW1hZ2VfcGFja2V0X3QpKTsKKworCXJ4ID0gSEFTSF9GVU5DKHJwLT5UWVBFKTsKKwl3aGlsZSAocm9wX21hcDFbcnhdICE9IHJwLT5UWVBFKSB7CisJCXJ4ID0gSEFTSF9MKHJvcF9tYXAyW3J4XSk7CisJCWlmIChyeCA8IDApIHsKKyNpZiBUTVMzMjA2MAorCQkJc3dpdGNoIChycC0+VFlQRSkgeworCQkJY2FzZSBSX0M2MEFMSUdOOgorCQkJY2FzZSBSX0M2ME5PQ01QOgorCQkJY2FzZSBSX0M2MEZQSEVBRDoKKwkJCQkvKiBJZ25vcmUgdGhlc2UgcmVsb2MgdHlwZXMgYW5kIHJldHVybiAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBVbmtub3duIHJlbG9jIHR5cGUsIHByaW50IGVycm9yIGFuZCByZXR1cm4gKi8KKwkJCQlkbG9hZF9lcnJvcihkbHRoaXMsICJCYWQgY29mZiBvcGVyYXRvciAweCV4IiwKKwkJCQkJICAgIHJwLT5UWVBFKTsKKwkJCX0KKyNlbHNlCisJCQlkbG9hZF9lcnJvcihkbHRoaXMsICJCYWQgY29mZiBvcGVyYXRvciAweCV4IiwgcnAtPlRZUEUpOworI2VuZGlmCisJCQlyZXR1cm47CisJCX0KKwl9CisJcnggPSBIQVNIX0kocm9wX21hcDJbcnhdKTsKKwlpZiAoKHJ4IDwgKHNpemVvZihyb3BfYWN0aW9uKSAvIHNpemVvZih1MTYpKSkKKwkgICAgJiYgKHJ4IDwgKHNpemVvZihyb3BfaW5mbykgLyBzaXplb2YodTE2KSkpICYmIChyeCA+IDApKSB7CisJCXJlbG9jX2FjdGlvbiA9IHJvcF9hY3Rpb25bcnhdOworCQlyZWxvY19pbmZvID0gcm9wX2luZm9bcnhdOworCX0gZWxzZSB7CisJCWRsb2FkX2Vycm9yKGRsdGhpcywgIkJ1ZmZlciBPdmVyZmxvdyAtIEFycmF5IEluZGV4IE91dCAiCisJCQkgICAgIm9mIEJvdW5kcyIpOworCX0KKworCS8qIENvbXB1dGUgdGhlIHJlbG9jYXRpb24gYW1vdW50IGZvciB0aGUgcmVmZXJlbmNlZCBzeW1ib2wsIGlmIGFueSAqLworCXJlbG9jX2FtdCA9IHJwLT5VVkFMOworCWlmIChSRlZfU1lNKHJlbG9jX2luZm8pKSB7CS8qIHJlbG9jYXRpb24gdXNlcyBhIHN5bWJvbCByZWZlcmVuY2UgKi8KKwkJLyogSWYgdGhpcyBpcyBmaXJzdCBwYXNzLCB1c2UgdGhlIG1vZHVsZSBsb2NhbCBzeW1ib2wgdGFibGUsCisJCSAqIGVsc2UgdXNlIHRoZSB0cmFtcG9saW5lIHN5bWJvbCB0YWJsZS4gKi8KKwkJaWYgKHNlY29uZF9wYXNzID09IGZhbHNlKSB7CisJCQlpZiAoKHUzMikgcnAtPlNZTU5EWCA8IGRsdGhpcy0+ZGZpbGVfaGRyLmRmX25vX3N5bXMpIHsKKwkJCQkvKiByZWFsIHN5bWJvbCByZWZlcmVuY2UgKi8KKwkJCQlzdnAgPSAmZGx0aGlzLT5sb2NhbF9zeW10YWJbcnAtPlNZTU5EWF07CisJCQkJcmVsb2NfYW10ID0gKFJGVl9TWU0ocmVsb2NfaW5mbykgPT0gUk9QX1NZTUQpID8KKwkJCQkgICAgc3ZwLT5kZWx0YSA6IHN2cC0+dmFsdWU7CisJCQl9CisJCQkvKiByZWxvYyByZWZlcmVuY2VzIGN1cnJlbnQgc2VjdGlvbiAqLworCQkJZWxzZSBpZiAocnAtPlNZTU5EWCA9PSAtMSkgeworCQkJCXJlbG9jX2FtdCA9IChSRlZfU1lNKHJlbG9jX2luZm8pID09IFJPUF9TWU1EKSA/CisJCQkJICAgIGRsdGhpcy0+ZGVsdGFfcnVuYWRkciA6CisJCQkJICAgIGRsdGhpcy0+aW1hZ2Vfc2Vjbi0+cnVuX2FkZHI7CisJCQl9CisJCX0KKwl9CisJLyogcmVsb2NhdGlvbiB1c2VzIGEgc3ltYm9sIHJlZmVyZW5jZSAqLworCS8qIEhhbmRsZSBzdGFjayBhZGp1c3RtZW50ICovCisJdmFsID0gMDsKKwl0b3AgPSBSRlZfU1RLKHJlbG9jX2luZm8pOworCWlmICh0b3ApIHsKKwkJdG9wICs9IGRsdGhpcy0+cmVsc3RraWR4IC0gUlNUS19VT1A7CisJCWlmICh0b3AgPj0gU1RBVElDX0VYUFJfU1RLX1NJWkUpIHsKKwkJCWRsb2FkX2Vycm9yKGRsdGhpcywKKwkJCQkgICAgIkV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3cgaW4gJXMgYXQgb2Zmc2V0ICIKKwkJCQkgICAgRk1UX1VJMzIsIGRsdGhpcy0+aW1hZ2Vfc2Vjbi0+bmFtZSwKKwkJCQkgICAgcnAtPnZhZGRyICsgZGx0aGlzLT5pbWFnZV9vZmZzZXQpOworCQkJcmV0dXJuOworCQl9CisJCXZhbCA9IGRsdGhpcy0+cmVsc3RrW2RsdGhpcy0+cmVsc3RraWR4XTsKKwkJZGx0aGlzLT5yZWxzdGtpZHggPSB0b3A7CisJCXN0YWNrcCA9ICZkbHRoaXMtPnJlbHN0a1t0b3BdOworCX0KKwkvKiBEZXJpdmUgZmllbGQgcG9zaXRpb24gYW5kIHNpemUsIGlmIHdlIG5lZWQgdGhlbSAqLworCWlmIChyZWxvY19pbmZvICYgUk9QX1JXKSB7CS8qIHJlYWQgb3Igd3JpdGUgYWN0aW9uIGluIG91ciBmdXR1cmUgKi8KKwkJZmllbGRzeiA9IFJGVl9XSURUSChyZWxvY19hY3Rpb24pOworCQlpZiAoZmllbGRzeikgewkvKiBmaWVsZCBpbmZvIGZyb20gdGFibGUgKi8KKwkJCW9mZnNldCA9IFJGVl9QT1NOKHJlbG9jX2FjdGlvbik7CisJCQlpZiAoVEFSR0VUX0JJR19FTkRJQU4pCisJCQkJLyogbWFrZSBzdXJlIHZhZGRyIGlzIHRoZSBsb3dlc3QgdGFyZ2V0CisJCQkJICogYWRkcmVzcyBjb250YWluaW5nIGJpdHMgKi8KKwkJCQlycC0+dmFkZHIgKz0gUkZWX0JJR09GRihyZWxvY19pbmZvKTsKKwkJfSBlbHNlIHsJLyogZmllbGQgaW5mbyBmcm9tIHJlbG9jYXRpb24gb3AgKi8KKwkJCWZpZWxkc3ogPSBycC0+RklFTERTWjsKKwkJCW9mZnNldCA9IHJwLT5PRkZTRVQ7CisJCQlpZiAoVEFSR0VUX0JJR19FTkRJQU4pCisJCQkJLyogbWFrZSBzdXJlIHZhZGRyIGlzIHRoZSBsb3dlc3QgdGFyZ2V0CisJCQkJICAgYWRkcmVzcyBjb250YWluaW5nIGJpdHMgKi8KKwkJCQlycC0+dmFkZHIgKz0gKHJwLT5XT1JEU1ogLSBvZmZzZXQgLSBmaWVsZHN6KQorCQkJCSAgICA+PiBMT0dfVEFSR0VUX0FVX0JJVFM7CisJCX0KKwkJZGF0YSA9ICh0Z3RfYXVfdCAqKSAoKGNoYXIgKilkYXRhICsgVEFERFJfVE9fSE9TVChycC0+dmFkZHIpKTsKKwkJLyogY29tcHV0ZSBsb3dlc3QgaG9zdCBsb2NhdGlvbiBvZiByZWZlcmVuY2VkIGRhdGEgKi8KKyNpZiBCSVRTX1BFUl9BVSA+IFRBUkdFVF9BVV9CSVRTCisJCS8qIGNvbnZlcnNpb24gZnJvbSB0YXJnZXQgYWRkcmVzcyB0byBob3N0IGFkZHJlc3MgbWF5IGxvc2UKKwkJICAgYWRkcmVzcyBiaXRzOyBhZGQgbG9zcyB0byBvZmZzZXQgKi8KKwkJaWYgKFRBUkdFVF9CSUdfRU5ESUFOKSB7CisJCQlvZmZzZXQgKz0gLSgocnAtPnZhZGRyIDw8IExPR19UQVJHRVRfQVVfQklUUykgKworCQkJCSAgICBvZmZzZXQgKyBmaWVsZHN6KSAmCisJCQkgICAgKEJJVFNfUEVSX0FVIC0gVEFSR0VUX0FVX0JJVFMpOworCQl9IGVsc2UgeworCQkJb2Zmc2V0ICs9IChycC0+dmFkZHIgPDwgTE9HX1RBUkdFVF9BVV9CSVRTKSAmCisJCQkgICAgKEJJVFNfUEVSX0FVIC0gMSk7CisJCX0KKyNlbmRpZgorI2lmZGVmIFJGVl9TQ0FMRQorCQlzY2FsZSA9IFJGVl9TQ0FMRShyZWxvY19pbmZvKTsKKyNlbmRpZgorCX0KKwkvKiByZWFkIHRoZSBvYmplY3QgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBpbWFnZSwgaWYgc28gb3JkZXJlZCAqLworCWlmIChyZWxvY19pbmZvICYgUk9QX1IpIHsKKwkJLyogcmVsb2NhdGlvbiByZWFkcyBjdXJyZW50IGltYWdlIHZhbHVlICovCisJCXZhbCA9IGRsb2FkX3VucGFjayhkbHRoaXMsIGRhdGEsIGZpZWxkc3osIG9mZnNldCwKKwkJCQkgICBSRlZfU0lHTihyZWxvY19pbmZvKSk7CisJCS8qIFNhdmUgb2ZmIHRoZSBvcmlnaW5hbCB2YWx1ZSBpbiBjYXNlIHRoZSByZWxvIG92ZXJmbG93cyBhbmQKKwkJICogd2UgY2FuIHRyYW1wb2xpbmUgaXQuICovCisJCW9yaWdfdmFsID0gdmFsOworCisjaWZkZWYgUkZWX1NDQUxFCisJCXZhbCA8PD0gc2NhbGU7CisjZW5kaWYKKwl9CisJLyogcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGFyaXRobWV0aWMgKi8KKwlzd2l0Y2ggKFJGVl9BQ1RJT04ocmVsb2NfYWN0aW9uKSkgewkvKiByZWxvY2F0aW9uIGFjdGlvbnMgKi8KKwljYXNlIFJBQ1RfVkFMOgorCQlicmVhazsKKwljYXNlIFJBQ1RfQVNHTjoKKwkJdmFsID0gcmVsb2NfYW10OworCQlicmVhazsKKwljYXNlIFJBQ1RfQUREOgorCQl2YWwgKz0gcmVsb2NfYW10OworCQlicmVhazsKKwljYXNlIFJBQ1RfUENSOgorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqIEhhbmRsZSBzcGVjaWFsIGNhc2VzIG9mIGp1bXBpbmcgZnJvbSBhYnNvbHV0ZSBzZWN0aW9ucworCQkgKiAoc3BlY2lhbCByZWxvYyB0eXBlKSBvciB0byBhYnNvbHV0ZSBkZXN0aW5hdGlvbgorCQkgKiAoc3ltbmR4ID09IC0xKS4gIEluIGVpdGhlciBjYXNlLCBzZXQgdGhlIGFwcHJvcHJpYXRlCisJCSAqIHJlbG9jYXRpb24gYW1vdW50IHRvIDAuCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkJaWYgKHJwLT5TWU1ORFggPT0gLTEpCisJCQlyZWxvY19hbXQgPSAwOworCQl2YWwgKz0gcmVsb2NfYW10IC0gZGx0aGlzLT5kZWx0YV9ydW5hZGRyOworCQlicmVhazsKKwljYXNlIFJBQ1RfQURESVNQOgorCQl2YWwgKz0gcnAtPlJfRElTUCArIHJlbG9jX2FtdDsKKwkJYnJlYWs7CisJY2FzZSBSQUNUX0FTR1BDOgorCQl2YWwgPSBkbHRoaXMtPmltYWdlX3NlY24tPnJ1bl9hZGRyICsgcmVsb2NfYW10OworCQlicmVhazsKKwljYXNlIFJBQ1RfUExVUzoKKwkJaWYgKHN0YWNrcCAhPSBOVUxMKQorCQkJdmFsICs9ICpzdGFja3A7CisJCWJyZWFrOworCWNhc2UgUkFDVF9TVUI6CisJCWlmIChzdGFja3AgIT0gTlVMTCkKKwkJCXZhbCA9ICpzdGFja3AgLSB2YWw7CisJCWJyZWFrOworCWNhc2UgUkFDVF9ORUc6CisJCXZhbCA9IC12YWw7CisJCWJyZWFrOworCWNhc2UgUkFDVF9NUFk6CisJCWlmIChzdGFja3AgIT0gTlVMTCkKKwkJCXZhbCAqPSAqc3RhY2twOworCQlicmVhazsKKwljYXNlIFJBQ1RfRElWOgorCQlpZiAoc3RhY2twICE9IE5VTEwpCisJCQl2YWwgPSAqc3RhY2twIC8gdmFsOworCQlicmVhazsKKwljYXNlIFJBQ1RfTU9EOgorCQlpZiAoc3RhY2twICE9IE5VTEwpCisJCQl2YWwgPSAqc3RhY2twICUgdmFsOworCQlicmVhazsKKwljYXNlIFJBQ1RfU1I6CisJCWlmICh2YWwgPj0gc2l6ZW9mKHJ2YWx1ZSkgKiBCSVRTX1BFUl9BVSkKKwkJCXZhbCA9IDA7CisJCWVsc2UgaWYgKHN0YWNrcCAhPSBOVUxMKQorCQkJdmFsID0gKHVydmFsdWUpICpzdGFja3AgPj4gdmFsOworCQlicmVhazsKKwljYXNlIFJBQ1RfQVNSOgorCQlpZiAodmFsID49IHNpemVvZihydmFsdWUpICogQklUU19QRVJfQVUpCisJCQl2YWwgPSBzaXplb2YocnZhbHVlKSAqIEJJVFNfUEVSX0FVIC0gMTsKKwkJZWxzZSBpZiAoc3RhY2twICE9IE5VTEwpCisJCQl2YWwgPSAqc3RhY2twID4+IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBSQUNUX1NMOgorCQlpZiAodmFsID49IHNpemVvZihydmFsdWUpICogQklUU19QRVJfQVUpCisJCQl2YWwgPSAwOworCQllbHNlIGlmIChzdGFja3AgIT0gTlVMTCkKKwkJCXZhbCA9ICpzdGFja3AgPDwgdmFsOworCQlicmVhazsKKwljYXNlIFJBQ1RfQU5EOgorCQlpZiAoc3RhY2twICE9IE5VTEwpCisJCQl2YWwgJj0gKnN0YWNrcDsKKwkJYnJlYWs7CisJY2FzZSBSQUNUX09SOgorCQlpZiAoc3RhY2twICE9IE5VTEwpCisJCQl2YWwgfD0gKnN0YWNrcDsKKwkJYnJlYWs7CisJY2FzZSBSQUNUX1hPUjoKKwkJaWYgKHN0YWNrcCAhPSBOVUxMKQorCQkJdmFsIF49ICpzdGFja3A7CisJCWJyZWFrOworCWNhc2UgUkFDVF9OT1Q6CisJCXZhbCA9IH52YWw7CisJCWJyZWFrOworI2lmIFRNUzMyMDYwCisJY2FzZSBSQUNUX0M2U0VDVDoKKwkJLyogYWN0dWFsbHkgbmVlZGVkIGFkZHJlc3Mgb2Ygc2VjbiBjb250YWluaW5nIHN5bWJvbCAqLworCQlpZiAoc3ZwICE9IE5VTEwpIHsKKwkJCWlmIChycC0+U1lNTkRYID49IDApCisJCQkJaWYgKHN2cC0+c2Vjbm4gPiAwKQorCQkJCQlyZWxvY19hbXQgPSBkbHRoaXMtPmxkcl9zZWN0aW9ucworCQkJCQkgICAgW3N2cC0+c2Vjbm4gLSAxXS5ydW5fYWRkcjsKKwkJfQorCQkvKiAhISEgRkFMTCBUSFJVICEhISAqLworCWNhc2UgUkFDVF9DNkJBU0U6CisJCWlmIChkbHRoaXMtPmJzc19ydW5fYmFzZSA9PSAwKSB7CisJCQlzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKnN5bXA7CisJCQlzeW1wID0gZGx0aGlzLT5teXN5bS0+ZmluZF9tYXRjaGluZ19zeW1ib2wKKwkJCSAgICAoZGx0aGlzLT5teXN5bSwgYnNzc3ltYm9sKTsKKwkJCS8qIGxvb2t1cCB2YWx1ZSBvZiBnbG9iYWwgQlNTIGJhc2UgKi8KKwkJCWlmIChzeW1wKQorCQkJCWRsdGhpcy0+YnNzX3J1bl9iYXNlID0gc3ltcC0+dmFsdWU7CisJCQllbHNlCisJCQkJZGxvYWRfZXJyb3IoZGx0aGlzLAorCQkJCQkgICAgIkdsb2JhbCBCU1MgYmFzZSByZWZlcmVuY2VkIGluICVzICIKKwkJCQkJICAgICJvZmZzZXQiIEZNVF9VSTMyICIgYnV0IG5vdCAiCisJCQkJCSAgICAiZGVmaW5lZCIsCisJCQkJCSAgICBkbHRoaXMtPmltYWdlX3NlY24tPm5hbWUsCisJCQkJCSAgICBycC0+dmFkZHIgKyBkbHRoaXMtPmltYWdlX29mZnNldCk7CisJCX0KKwkJcmVsb2NfYW10IC09IGRsdGhpcy0+YnNzX3J1bl9iYXNlOworCQkvKiAhISEgRkFMTCBUSFJVICEhISAqLworCWNhc2UgUkFDVF9DNkRTUEw6CisJCS8qIHNjYWxlIGZhY3RvciBkZXRlcm1pbmVkIGJ5IDMgTFNCcyBvZiBmaWVsZCAqLworCQlzY2FsZSA9IGM2MF9zY2FsZVt2YWwgJiBTQ0FMRV9NQVNLXTsKKwkJb2Zmc2V0ICs9IFNDQUxFX0JJVFM7CisJCWZpZWxkc3ogLT0gU0NBTEVfQklUUzsKKwkJdmFsID4+PSBTQ0FMRV9CSVRTOwkvKiBpZ25vcmUgdGhlIHNjYWxlIGZpZWxkIGhlcmVhZnRlciAqLworCQl2YWwgPDw9IHNjYWxlOworCQl2YWwgKz0gcmVsb2NfYW10OwkvKiBkbyB0aGUgdXN1YWwgcmVsb2NhdGlvbiAqLworCQlpZiAoKCgxIDw8IHNjYWxlKSAtIDEpICYgdmFsKQorCQkJZGxvYWRfZXJyb3IoZGx0aGlzLAorCQkJCSAgICAiVW5hbGlnbmVkIHJlZmVyZW5jZSBpbiAlcyBvZmZzZXQgIgorCQkJCSAgICBGTVRfVUkzMiwgZGx0aGlzLT5pbWFnZV9zZWNuLT5uYW1lLAorCQkJCSAgICBycC0+dmFkZHIgKyBkbHRoaXMtPmltYWdlX29mZnNldCk7CisJCWJyZWFrOworI2VuZGlmCisJfQkJCS8qIHJlbG9jYXRpb24gYWN0aW9ucyAqLworCS8qICogUHV0IGJhY2sgcmVzdWx0IGFzIHJlcXVpcmVkICovCisJaWYgKHJlbG9jX2luZm8gJiBST1BfVykgewkvKiByZWxvY2F0aW9uIHdyaXRlcyBpbWFnZSB2YWx1ZSAqLworI2lmZGVmIFJGVl9TQ0FMRQorCQl2YWwgPj49IHNjYWxlOworI2VuZGlmCisJCWlmIChkbG9hZF9yZXBhY2soZGx0aGlzLCB2YWwsIGRhdGEsIGZpZWxkc3osIG9mZnNldCwKKwkJCQkgUkZWX1NJR04ocmVsb2NfaW5mbykpKSB7CisJCQkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyByZWxvIGNhbiBiZSB0cmFtcG9saW5lZCwKKwkJCSAqIGJ1dCBvbmx5IGluIGZpcnN0IHBoYXNlIHJlbG9jYXRpb24uICAybmQgcGhhc2UKKwkJCSAqIHJlbG9jYXRpb24gY2Fubm90IHRyYW1wb2xpbmUuICovCisJCQlpZiAoKHNlY29uZF9wYXNzID09IGZhbHNlKSAmJgorCQkJICAgIChkbG9hZF90cmFtcF9hdmFpbChkbHRoaXMsIHJwKSA9PSB0cnVlKSkgeworCisJCQkJLyogQmVmb3JlIGdlbmVyYXRpbmcgdGhlIHRyYW1wb2xpbmUsIHJlc3RvcmUKKwkJCQkgKiB0aGUgdmFsdWUgdG8gaXRzIG9yaWdpbmFsIHNvIHRoZSAybmQgcGFzcworCQkJCSAqICByZWxvIHdpbGwgd29yay4gKi8KKwkJCQlkbG9hZF9yZXBhY2soZGx0aGlzLCBvcmlnX3ZhbCwgZGF0YSwgZmllbGRzeiwKKwkJCQkJICAgICBvZmZzZXQsIFJGVl9TSUdOKHJlbG9jX2luZm8pKTsKKwkJCQlpZiAoIWRsb2FkX3RyYW1wX2dlbmVyYXRlKGRsdGhpcywKKwkJCQkJCQkoZGx0aGlzLT5pbWFnZV9zZWNuIC0KKwkJCQkJCQkgZGx0aGlzLT5sZHJfc2VjdGlvbnMpLAorCQkJCQkJCSBkbHRoaXMtPmltYWdlX29mZnNldCwKKwkJCQkJCQkgaW1nX3BrdCwgcnApKSB7CisJCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywKKwkJCQkJCSAgICAiRmFpbGVkIHRvICIKKwkJCQkJCSAgICAiZ2VuZXJhdGUgdHJhbXBvbGluZSBmb3IgIgorCQkJCQkJICAgICJiaXQgb3ZlcmZsb3ciKTsKKwkJCQkJZGxvYWRfZXJyb3IoZGx0aGlzLAorCQkJCQkJICAgICJSZWxvY2F0aW9uIHZhbCAiIEZNVF9VSTMyCisJCQkJCQkgICAgIiBvdmVyZmxvd3MgJWQgYml0cyBpbiAlcyAiCisJCQkJCQkgICAgIm9mZnNldCAiIEZNVF9VSTMyLCB2YWwsCisJCQkJCQkgICAgZmllbGRzeiwKKwkJCQkJCSAgICBkbHRoaXMtPmltYWdlX3NlY24tPm5hbWUsCisJCQkJCQkgICAgZGx0aGlzLT5pbWFnZV9vZmZzZXQgKworCQkJCQkJICAgIHJwLT52YWRkcik7CisJCQkJfSBlbHNlCisJCQkJCSp0cmFtcHNfZ2VuZXJhdGVkID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJZGxvYWRfZXJyb3IoZGx0aGlzLCAiUmVsb2NhdGlvbiB2YWx1ZSAiCisJCQkJCSAgICBGTVRfVUkzMiAiIG92ZXJmbG93cyAlZCBiaXRzIGluICVzIgorCQkJCQkgICAgIiBvZmZzZXQgIiBGTVRfVUkzMiwgdmFsLCBmaWVsZHN6LAorCQkJCQkgICAgZGx0aGlzLT5pbWFnZV9zZWNuLT5uYW1lLAorCQkJCQkgICAgZGx0aGlzLT5pbWFnZV9vZmZzZXQgKyBycC0+dmFkZHIpOworCQkJfQorCQl9CisJfSBlbHNlIGlmICh0b3ApCisJCSpzdGFja3AgPSB2YWw7Cit9CQkJCS8qIHJlbG9jX3ZhbHVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9yZWxvY190YWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvcmVsb2NfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWFiMDNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvcmVsb2NfdGFibGUuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIHJlbG9jX3RhYmxlLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfUkVMT0NfVEFCTEVfSF8KKyNkZWZpbmUgX1JFTE9DX1RBQkxFX0hfCisvKgorICogVGFibGUgb2YgcmVsb2NhdGlvbiBvcGVyYXRvciBwcm9wZXJ0aWVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBIb3cgZG9lcyB0aGlzIHJlbG9jYXRpb24gb3BlcmF0aW9uIGFjY2VzcyB0aGUgcHJvZ3JhbSBpbWFnZT8gKi8KKyNkZWZpbmUgUk9QX04JMAkJLyogZG9lcyBub3QgYWNjZXNzIGltYWdlICovCisjZGVmaW5lIFJPUF9SCTEJCS8qIHJlYWQgZnJvbSBpbWFnZSAqLworI2RlZmluZSBST1BfVwkyCQkvKiB3cml0ZSB0byBpbWFnZSAqLworI2RlZmluZSBST1BfUlcJMwkJLyogcmVhZCBmcm9tIGFuZCB3cml0ZSB0byBpbWFnZSAqLworCisvKiBGb3IgcHJvZ3JhbSBpbWFnZSBhY2Nlc3MsIHdoYXQgYXJlIHRoZSBvdmVyZmxvdyBydWxlcyBmb3IgdGhlIGJpdCBmaWVsZD8gKi8KKy8qIEJld2FyZSEgUHJvY2VkdXJlIHJlcGFjayBkZXBlbmRzIG9uIHRoaXMgZW5jb2RpbmcgKi8KKyNkZWZpbmUgUk9QX0FOWQkwCQkvKiBubyBvdmVyZmxvdyBldmVyLCBqdXN0IHRydW5jYXRlIHRoZSB2YWx1ZSAqLworI2RlZmluZSBST1BfU0dOCTEJCS8qIHNpZ25lZCBmaWVsZCAqLworI2RlZmluZSBST1BfVU5TCTIJCS8qIHVuc2lnbmVkIGZpZWxkICovCisjZGVmaW5lIFJPUF9NQVggMwkvKiBhbGxvdyBtYXhpbXVtIHJhbmdlIG9mIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQgKi8KKworLyogSG93IGRvZXMgdGhlIHJlbG9jYXRpb24gb3BlcmF0aW9uIHVzZSB0aGUgc3ltYm9sIHJlZmVyZW5jZSAqLworI2RlZmluZSBST1BfSUdOCTAJCS8qIG5vIHN5bWJvbCBpcyByZWZlcmVuY2VkICovCisjZGVmaW5lIFJPUF9MSVQgMAkJLyogdXNlIHJwLT5VVkFMIGxpdGVyYWwgZmllbGQgKi8KKyNkZWZpbmUgUk9QX1NZTQkxCQkvKiBzeW1ib2wgdmFsdWUgaXMgdXNlZCBpbiByZWxvY2F0aW9uICovCisjZGVmaW5lIFJPUF9TWU1EIDIJCS8qIGRlbHRhIHZhbHVlIHZzIGxhc3QgbGluayBpcyB1c2VkICovCisKKy8qIEhvdyBkb2VzIHRoZSByZWxvYyBvcCB1c2UgdGhlIHN0YWNrPyAqLworI2RlZmluZSBSU1RLX04gMAkJLyogRG9lcyBub3QgdXNlICovCisjZGVmaW5lIFJTVEtfUE9QIDEJCS8qIERvZXMgYSBQT1AgKi8KKyNkZWZpbmUgUlNUS19VT1AgMgkJLyogVW5hcnkgb3AsIHN0YWNrIHBvc2l0aW9uIHVuYWZmZWN0ZWQgKi8KKyNkZWZpbmUgUlNUS19QU0ggMwkJLyogRG9lcyBhIHB1c2ggKi8KKworLyoKKyAqIENvbXB1dGF0aW9uYWwgYWN0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIGR5bmFtaWMgbG9hZGVyCisgKi8KK2VudW0gZGxvYWRfYWN0aW9ucyB7CisJLyogZG9uJ3QgYWx0ZXIgdGhlIGN1cnJlbnQgdmFsIChmcm9tIHN0YWNrIG9yIG1lbSBmZXRjaCkgKi8KKwlSQUNUX1ZBTCwKKwkvKiBzZXQgdmFsdWUgdG8gcmVmZXJlbmNlIGFtb3VudCAoZnJvbSBzeW1ib2wgcmVmZXJlbmNlKSAqLworCVJBQ1RfQVNHTiwKKwlSQUNUX0FERCwJCS8qIGFkZCByZWZlcmVuY2UgdG8gdmFsdWUgKi8KKwlSQUNUX1BDUiwJCS8qIGFkZCByZWZlcmVuY2UgbWludXMgUEMgZGVsdGEgdG8gdmFsdWUgKi8KKwlSQUNUX0FERElTUCwJCS8qIGFkZCByZWZlcmVuY2UgcGx1cyBSX0RJU1AgKi8KKwlSQUNUX0FTR1BDLAkJLyogc2V0IHZhbHVlIHRvIHNlY3Rpb24gYWRkciBwbHVzIHJlZmVyZW5jZSAqLworCisJUkFDVF9QTFVTLAkJLyogc3RhY2sgKyAqLworCVJBQ1RfU1VCLAkJLyogc3RhY2sgLSAqLworCVJBQ1RfTkVHLAkJLyogc3RhY2sgdW5hcnkgLSAqLworCisJUkFDVF9NUFksCQkvKiBzdGFjayAqICovCisJUkFDVF9ESVYsCQkvKiBzdGFjayAvICovCisJUkFDVF9NT0QsCQkvKiBzdGFjayAlICovCisKKwlSQUNUX1NSLAkJLyogc3RhY2sgdW5zaWduZWQgPj4gKi8KKwlSQUNUX0FTUiwJCS8qIHN0YWNrIHNpZ25lZCA+PiAqLworCVJBQ1RfU0wsCQkvKiBzdGFjayA8PCAqLworCVJBQ1RfQU5ELAkJLyogc3RhY2sgJiAqLworCVJBQ1RfT1IsCQkvKiBzdGFjayB8ICovCisJUkFDVF9YT1IsCQkvKiBzdGFjayBeICovCisJUkFDVF9OT1QsCQkvKiBzdGFjayB+ICovCisJUkFDVF9DNlNFQ1QsCQkvKiBmb3IgQzYwIFJfU0VDVCBvcCAqLworCVJBQ1RfQzZCQVNFLAkJLyogZm9yIEM2MCBSX0JBU0Ugb3AgKi8KKwlSQUNUX0M2RFNQTCwJCS8qIGZvciBDNjAgc2NhbGVkIDE1LWJpdCBkaXNwbGFjZW1lbnQgKi8KKwlSQUNUX1BDUjIzVAkJLyogZm9yIEFSTSBUaHVtYiBsb25nIGJyYW5jaCAqLworfTsKKworLyoKKyAqIG1hY3JvcyB1c2VkIHRvIGV4dHJhY3QgdmFsdWVzCisgKi8KKyNkZWZpbmUgUkZWX1BPU04oYWFhKSAoKGFhYSkgJiAweEYpCisjZGVmaW5lIFJGVl9XSURUSChhYWEpICgoKGFhYSkgPj4gNCkgJiAweDNGKQorI2RlZmluZSBSRlZfQUNUSU9OKGFhYSkgKChhYWEpID4+IDEwKQorCisjZGVmaW5lIFJGVl9TSUdOKGlpaSkgKCgoaWlpKSA+PiAyKSAmIDB4MykKKyNkZWZpbmUgUkZWX1NZTShpaWkpICgoKGlpaSkgPj4gNCkgJiAweDMpCisjZGVmaW5lIFJGVl9TVEsoaWlpKSAoKChpaWkpID4+IDYpICYgMHgzKQorI2RlZmluZSBSRlZfQUNDUyhpaWkpICgoaWlpKSAmIDB4MykKKworI2lmIChUTVMzMjA2MCkKKyNkZWZpbmUgUkZWX1NDQUxFKGlpaSkgKChpaWkpID4+IDExKQorI2RlZmluZSBSRlZfQklHT0ZGKGlpaSkgKCgoaWlpKSA+PiA4KSAmIDB4NykKKyNlbHNlCisjZGVmaW5lIFJGVl9CSUdPRkYoaWlpKSAoKGlpaSkgPj4gOCkKKyNlbmRpZgorCisjZW5kaWYgLyogX1JFTE9DX1RBQkxFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC9yZWxvY190YWJsZV9jNjAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvcmVsb2NfdGFibGVfYzYwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhiYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvcmVsb2NfdGFibGVfYzYwMDAuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIHJlbG9jX3RhYmxlX2M2MDAwLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyogVGFibGVzIGdlbmVyYXRlZCBmb3IgYzYwMDAgKi8KKworI2RlZmluZSBIQVNIX0ZVTkMoenopICgoKCgoenopICsgMSkgKiAxODQ1VUwpID4+IDExKSAmIDYzKQorI2RlZmluZSBIQVNIX0woenopICgoenopID4+IDgpCisjZGVmaW5lIEhBU0hfSSh6eikgKCh6eikgJiAweEZGKQorCitzdGF0aWMgY29uc3QgdTE2IHJvcF9tYXAxW10gPSB7CisJMCwKKwkxLAorCTIsCisJMjAsCisJNCwKKwk1LAorCTYsCisJMTUsCisJODAsCisJODEsCisJODIsCisJODMsCisJODQsCisJODUsCisJODYsCisJODcsCisJMTcsCisJMTgsCisJMTksCisJMjEsCisJMTYsCisJMTYzOTQsCisJMTY0MDQsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJMzIsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNDAsCisJMTEyLAorCTExMywKKwk2NTUzNSwKKwkxNjM4NCwKKwkxNjM4NSwKKwkxNjM4NiwKKwkxNjM4NywKKwkxNjM4OCwKKwkxNjM4OSwKKwkxNjM5MCwKKwkxNjM5MSwKKwkxNjM5MiwKKwkxNjM5MywKKwkxNjM5NSwKKwkxNjM5NiwKKwkxNjM5NywKKwkxNjM5OCwKKwkxNjM5OSwKKwkxNjQwMCwKKwkxNjQwMSwKKwkxNjQwMiwKKwkxNjQwMywKKwkxNjQwNSwKKwkxNjQwNiwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNQorfTsKKworc3RhdGljIGNvbnN0IHMxNiByb3BfbWFwMltdID0geworCS0yNTYsCisJLTI1NSwKKwktMjU0LAorCS0yNDUsCisJLTI1MywKKwktMjUyLAorCS0yNTEsCisJLTI1MCwKKwktMjQxLAorCS0yNDAsCisJLTIzOSwKKwktMjM4LAorCS0yMzcsCisJLTIzNiwKKwkxODEzLAorCTUxNDIsCisJLTI0OCwKKwktMjQ3LAorCTc3OCwKKwktMjQ0LAorCS0yNDksCisJLTIyMSwKKwktMjExLAorCS0xLAorCS0xLAorCS0xLAorCS0xLAorCS0xLAorCS0xLAorCS0yNDMsCisJLTEsCisJLTEsCisJLTEsCisJLTEsCisJLTEsCisJLTEsCisJLTI0MiwKKwktMjMzLAorCS0yMzIsCisJLTEsCisJLTIzMSwKKwktMjMwLAorCS0yMjksCisJLTIyOCwKKwktMjI3LAorCS0yMjYsCisJLTIyNSwKKwktMjI0LAorCS0yMjMsCisJNTQxMCwKKwktMjIwLAorCS0yMTksCisJLTIxOCwKKwktMjE3LAorCS0yMTYsCisJLTIxNSwKKwktMjE0LAorCS0yMTMsCisJNTY3NiwKKwktMjEwLAorCS0yMDksCisJLTEsCisJLTEsCisJLTEKK307CisKK3N0YXRpYyBjb25zdCB1MTYgcm9wX2FjdGlvbltdID0geworCTI1NjAsCisJMjMwNCwKKwkyMzA0LAorCTI0MzIsCisJMjQzMiwKKwkyNTYwLAorCTIxNzYsCisJMjMwNCwKKwkyNTYwLAorCTMyMDAsCisJMzMyOCwKKwkzNTg0LAorCTM0NTYsCisJMjMwNCwKKwk0MjA4LAorCTIwNzg4LAorCTIxODEyLAorCTM0MTUsCisJMzI0NSwKKwkyMzExLAorCTQzNTksCisJMTk3NjQsCisJMjMxMSwKKwkzMTkxLAorCTMyODAsCisJNjY1NiwKKwk3NjgwLAorCTg3MDQsCisJOTcyOCwKKwkxMDc1MiwKKwkxMTc3NiwKKwkxMjgwMCwKKwkxMzgyNCwKKwkxNDg0OCwKKwkxNTg3MiwKKwkxNjg5NiwKKwkxNzkyMCwKKwkxODk0NCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTE1MzYsCisJMTUzNiwKKwkxNTM2LAorCTU2MzIsCisJNTEyLAorCTAKK307CisKK3N0YXRpYyBjb25zdCB1MTYgcm9wX2luZm9bXSA9IHsKKwkwLAorCTM1LAorCTM1LAorCTM1LAorCTM1LAorCTM1LAorCTM1LAorCTM1LAorCTM1LAorCTM5LAorCTM5LAorCTM5LAorCTM5LAorCTM1LAorCTM0LAorCTI4MywKKwkyOTksCisJNDEzNSwKKwk0MzkxLAorCTI5MSwKKwkzMzA1OSwKKwkyODMsCisJMjk1LAorCTQ2NDcsCisJNDEzNSwKKwk2NCwKKwk2NCwKKwkxMjgsCisJNjQsCisJNjQsCisJNjQsCisJNjQsCisJNjQsCisJNjQsCisJNjQsCisJNjQsCisJNjQsCisJMTI4LAorCTIwMSwKKwkxOTcsCisJNzQsCisJNzAsCisJMjA4LAorCTE5NiwKKwkyMDAsCisJMTkyLAorCTE5MiwKKwk2NgorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC90cmFtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDIyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC90cmFtcC5jCkBAIC0wLDAgKzEsMTE0MyBAQAorLyoKKyAqIHRyYW1wLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlICJoZWFkZXIuaCIKKworI2lmIFRNUzMyMDYwCisjaW5jbHVkZSAidHJhbXBfdGFibGVfYzYwMDAuYyIKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9SRUxPU19QRVJfUEFTUwk0CisKKy8qCisgKiBGdW5jdGlvbjoJcHJpdl90cmFtcF9zZWN0X3RndF9hbGxvYworICogRGVzY3JpcHRpb246IEFsbG9jYXRlIHRhcmdldCBtZW1vcnkgZm9yIHRoZSB0cmFtcG9saW5lIHNlY3Rpb24uICBUaGUKKyAqCSAgdGFyZ2V0IG1lbSBzaXplIGlzIGVhc2lseSBvYnRhaW5lZCBhcyB0aGUgbmV4dCBhdmFpbGFibGUgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBwcml2X3RyYW1wX3NlY3RfdGd0X2FsbG9jKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKQoreworCWludCByZXRfdmFsID0gMDsKKwlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqc2VjdF9pbmZvOworCisJLyogIFBvcHVsYXRlIHRoZSB0cmFtcG9saW5lIGxvYWRlciBzZWN0aW9uIGFuZCBhbGxvY2F0ZSBpdCBvbiB0aGUKKwkgKiB0YXJnZXQuICBUaGUgc2VjdGlvbiBuYW1lIGlzIEFMV0FZUyB0aGUgZmlyc3Qgc3RyaW5nIGluIHRoZSBmaW5hbAorCSAqIHN0cmluZyB0YWJsZSBmb3IgdHJhbXBvbGluZXMuICBUaGUgdHJhbXBvbGluZSBzZWN0aW9uIGlzIGFsd2F5cworCSAqIDEgYmV5b25kIHRoZSB0b3RhbCBudW1iZXIgb2YgYWxsb2NhdGVkIHNlY3Rpb25zLiAqLworCXNlY3RfaW5mbyA9ICZkbHRoaXMtPmxkcl9zZWN0aW9uc1tkbHRoaXMtPmFsbG9jYXRlZF9zZWNuX2NvdW50XTsKKworCXNlY3RfaW5mby0+bmFtZSA9IGRsdGhpcy0+dHJhbXAuZmluYWxfc3RyaW5nX3RhYmxlOworCXNlY3RfaW5mby0+c2l6ZSA9IGRsdGhpcy0+dHJhbXAudHJhbXBfc2VjdF9uZXh0X2FkZHI7CisJc2VjdF9pbmZvLT5jb250ZXh0ID0gMDsKKwlzZWN0X2luZm8tPnR5cGUgPQorCSAgICAoNCA8PCA4KSB8IERMT0FEX1RFWFQgfCBEU19BTExPQ0FURV9NQVNLIHwgRFNfRE9XTkxPQURfTUFTSzsKKwlzZWN0X2luZm8tPnBhZ2UgPSAwOworCXNlY3RfaW5mby0+cnVuX2FkZHIgPSAwOworCXNlY3RfaW5mby0+bG9hZF9hZGRyID0gMDsKKwlyZXRfdmFsID0gZGx0aGlzLT5teWFsbG9jLT5kbG9hZF9hbGxvY2F0ZShkbHRoaXMtPm15YWxsb2MsCisJCQkJCQkgIHNlY3RfaW5mbywKKwkJCQkJCSAgZHNfYWxpZ25tZW50CisJCQkJCQkgIChzZWN0X2luZm8tPnR5cGUpKTsKKworCWlmIChyZXRfdmFsID09IDApCisJCWRsb2FkX2Vycm9yKGRsdGhpcywgIkZhaWxlZCB0byBhbGxvY2F0ZSB0YXJnZXQgbWVtb3J5IGZvciIKKwkJCSAgICAiIHRyYW1wb2xpbmUiKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfaDJhCisgKiBEZXNjcmlwdGlvbjogSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBoZXggdmFsdWUgdG8gaXRzIEFTQ0lJCisgKgkgIHJlcHJlc2VudGF0aW9uLiAgVXNlZCBmb3IgdHJhbXBvbGluZSBzeW1ib2wgbmFtZSBnZW5lcmF0aW9uLgorICovCitzdGF0aWMgdTggcHJpdl9oMmEodTggdmFsdWUpCit7CisJaWYgKHZhbHVlID4gMHhGKQorCQlyZXR1cm4gMHhGRjsKKworCWlmICh2YWx1ZSA8PSA5KQorCQl2YWx1ZSArPSAweDMwOworCWVsc2UKKwkJdmFsdWUgKz0gMHgzNzsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOglwcml2X3RyYW1wX3N5bV9nZW5fbmFtZQorICogRGVzY3JpcHRpb246IEdlbmVyYXRlIGEgdHJhbXBvbGluZSBzeW1ib2wgbmFtZSAoQVNDSUkpIHVzaW5nIHRoZSB2YWx1ZQorICoJICBvZiB0aGUgc3ltYm9sLiAgVGhpcyBwbGFjZXMgdGhlIG5ldyBuYW1lIGludG8gdGhlIHVzZXIgYnVmZmVyLgorICoJICBUaGUgbmFtZSBpcyBmaXhlZCBpbiBsZW5ndGggYW5kIG9mIHRoZSBmb3JtOiBfXyRkYlRSX194eHh4eHh4eAorICoJICAod2hlcmUgInh4eHh4eHh4IiBpcyB0aGUgaGV4IHZhbHVlLgorICovCitzdGF0aWMgdm9pZCBwcml2X3RyYW1wX3N5bV9nZW5fbmFtZSh1MzIgdmFsdWUsIGNoYXIgKmRzdCkKK3sKKwl1MzIgaTsKKwljaGFyICpwcmVmaXggPSBUUkFNUF9TWU1fUFJFRklYOworCWNoYXIgKmRzdF9sb2NhbCA9IGRzdDsKKwl1OCB0bXA7CisKKwkvKiAgQ2xlYXIgb3V0IHRoZSBkZXN0aW5hdGlvbiwgaW5jbHVkaW5nIHRoZSBlbmRpbmcgTlVMTCAqLworCWZvciAoaSA9IDA7IGkgPCAoVFJBTVBfU1lNX1BSRUZJWF9MRU4gKyBUUkFNUF9TWU1fSEVYX0FTQ0lJX0xFTik7IGkrKykKKwkJKihkc3RfbG9jYWwgKyBpKSA9IDA7CisKKwkvKiAgQ29weSB0aGUgcHJlZml4IHRvIHN0YXJ0ICovCisJZm9yIChpID0gMDsgaSA8IHN0cmxlbihUUkFNUF9TWU1fUFJFRklYKTsgaSsrKSB7CisJCSpkc3RfbG9jYWwgPSAqKHByZWZpeCArIGkpOworCQlkc3RfbG9jYWwrKzsKKwl9CisKKwkvKiAgTm93IGNvbnZlcnQgdGhlIHZhbHVlIHBhc3NlZCBpbiB0byBhIHN0cmluZyBlcXVpdiBvZiB0aGUgaGV4ICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih2YWx1ZSk7IGkrKykgeworI2lmbmRlZiBfQklHX0VORElBTgorCQl0bXAgPSAqKCgodTggKikgJnZhbHVlKSArIChzaXplb2YodmFsdWUpIC0gMSkgLSBpKTsKKwkJKmRzdF9sb2NhbCA9IHByaXZfaDJhKCh0bXAgJiAweEYwKSA+PiA0KTsKKwkJZHN0X2xvY2FsKys7CisJCSpkc3RfbG9jYWwgPSBwcml2X2gyYSh0bXAgJiAweDBGKTsKKwkJZHN0X2xvY2FsKys7CisjZWxzZQorCQl0bXAgPSAqKCgodTggKikgJnZhbHVlKSArIGkpOworCQkqZHN0X2xvY2FsID0gcHJpdl9oMmEoKHRtcCAmIDB4RjApID4+IDQpOworCQlkc3RfbG9jYWwrKzsKKwkJKmRzdF9sb2NhbCA9IHByaXZfaDJhKHRtcCAmIDB4MEYpOworCQlkc3RfbG9jYWwrKzsKKyNlbmRpZgorCX0KKworCS8qICBOVUxMIHRlcm1pbmF0ZSAqLworCSpkc3RfbG9jYWwgPSAwOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfdHJhbXBfc3RyaW5nX2NyZWF0ZQorICogRGVzY3JpcHRpb246IENyZWF0ZSBhIG5ldyBzdHJpbmcgc3BlY2lmaWMgdG8gdGhlIHRyYW1wb2xpbmUgbG9hZGluZyBhbmQgYWRkCisgKgkgIGl0IHRvIHRoZSB0cmFtcG9saW5lIHN0cmluZyBsaXN0LiAgVGhpcyBsaXN0IGNvbnRhaW5zIHRoZQorICoJICB0cmFtcG9saW5lIHNlY3Rpb24gbmFtZSBhbmQgdHJhbXBvbGluZSBwb2ludCBzeW1ib2xzLgorICovCitzdGF0aWMgc3RydWN0IHRyYW1wX3N0cmluZyAqcHJpdl90cmFtcF9zdHJpbmdfY3JlYXRlKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLAorCQkJCQkJICAgICB1MzIgc3RyX2xlbiwgY2hhciAqc3RyKQoreworCXN0cnVjdCB0cmFtcF9zdHJpbmcgKm5ld19zdHJpbmcgPSBOVUxMOworCXUzMiBpOworCisJLyogIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBzaXplLiAqLworCW5ld19zdHJpbmcgPQorCSAgICAoc3RydWN0IHRyYW1wX3N0cmluZyAqKWRsdGhpcy0+bXlzeW0tPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQkJCSAoc2l6ZW9mCisJCQkJCQkJCSAgKHN0cnVjdAorCQkJCQkJCQkgICB0cmFtcF9zdHJpbmcpCisJCQkJCQkJCSAgKyBzdHJfbGVuICsKKwkJCQkJCQkJICAxKSk7CisJaWYgKG5ld19zdHJpbmcgIT0gTlVMTCkgeworCQkvKiAgQ2xlYXIgdGhlIHN0cmluZyBmaXJzdC4gIFRoaXMgZW5zdXJlcyB0aGUgZW5kaW5nIE5VTEwgaXMKKwkJICogcHJlc2VudCBhbmQgdGhlIG9wdGltaXplciB3b24ndCB0b3VjaCBpdC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2Yoc3RydWN0IHRyYW1wX3N0cmluZykgKyBzdHJfbGVuICsgMSk7CisJCSAgICAgaSsrKQorCQkJKigodTggKikgbmV3X3N0cmluZyArIGkpID0gMDsKKworCQkvKiAgQWRkIHRoaXMgc3RyaW5nIHRvIG91ciB2aXJ0dWFsIHRhYmxlIGJ5IGFzc2lnbmluZyBpdCB0aGUKKwkJICogbmV4dCBpbmRleCBhbmQgcHVzaGluZyBpdCB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gKi8KKwkJbmV3X3N0cmluZy0+aW5kZXggPSBkbHRoaXMtPnRyYW1wLnRyYW1wX3N0cmluZ19uZXh0X2luZGV4OworCQlkbHRoaXMtPnRyYW1wLnRyYW1wX3N0cmluZ19uZXh0X2luZGV4Kys7CisJCWRsdGhpcy0+dHJhbXAudHJhbXBfc3RyaW5nX3NpemUgKz0gc3RyX2xlbiArIDE7CisKKwkJbmV3X3N0cmluZy0+bmV4dCA9IE5VTEw7CisJCWlmIChkbHRoaXMtPnRyYW1wLnN0cmluZ19oZWFkID09IE5VTEwpCisJCQlkbHRoaXMtPnRyYW1wLnN0cmluZ19oZWFkID0gbmV3X3N0cmluZzsKKwkJZWxzZQorCQkJZGx0aGlzLT50cmFtcC5zdHJpbmdfdGFpbC0+bmV4dCA9IG5ld19zdHJpbmc7CisKKwkJZGx0aGlzLT50cmFtcC5zdHJpbmdfdGFpbCA9IG5ld19zdHJpbmc7CisKKwkJLyogIENvcHkgdGhlIHN0cmluZyBvdmVyIHRvIHRoZSBuZXcgb2JqZWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBzdHJfbGVuOyBpKyspCisJCQluZXdfc3RyaW5nLT5zdHJbaV0gPSBzdHJbaV07CisJfQorCisJcmV0dXJuIG5ld19zdHJpbmc7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJcHJpdl90cmFtcF9zdHJpbmdfZmluZAorICogRGVzY3JpcHRpb246IFdhbGsgdGhlIHRyYW1wb2xpbmUgc3RyaW5nIGxpc3QgYW5kIGZpbmQgYSBtYXRjaCBmb3IgdGhlCisgKgkgIHByb3ZpZGVkIHN0cmluZy4gIElmIG5vdCBtYXRjaCBpcyBmb3VuZCwgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIHN0cnVjdCB0cmFtcF9zdHJpbmcgKnByaXZfdHJhbXBfc3RyaW5nX2ZpbmQoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsCisJCQkJCQkgICBjaGFyICpzdHIpCit7CisJc3RydWN0IHRyYW1wX3N0cmluZyAqY3VyX3N0ciA9IE5VTEw7CisJc3RydWN0IHRyYW1wX3N0cmluZyAqcmV0X3ZhbCA9IE5VTEw7CisJdTMyIGk7CisJdTMyIHN0cl9sZW4gPSBzdHJsZW4oc3RyKTsKKworCWZvciAoY3VyX3N0ciA9IGRsdGhpcy0+dHJhbXAuc3RyaW5nX2hlYWQ7CisJICAgICAocmV0X3ZhbCA9PSBOVUxMKSAmJiAoY3VyX3N0ciAhPSBOVUxMKTsgY3VyX3N0ciA9IGN1cl9zdHItPm5leHQpIHsKKwkJLyogIElmIHRoZSBzdHJpbmcgbGVuZ3RocyBhcmVuJ3QgZXF1YWwsIGRvbid0IGJvdGhlcgorCQkgKiBjb21wYXJpbmcgKi8KKwkJaWYgKHN0cl9sZW4gIT0gc3RybGVuKGN1cl9zdHItPnN0cikpCisJCQljb250aW51ZTsKKworCQkvKiAgV2FsayB0aGUgc3RyaW5ncyB1bnRpbCBvbmUgb2YgdGhlbSBlbmRzICovCisJCWZvciAoaSA9IDA7IGkgPCBzdHJfbGVuOyBpKyspIHsKKwkJCS8qICBJZiB0aGV5IGRvbid0IG1hdGNoIGluIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRoZW4KKwkJCSAqIGJyZWFrIG91dCBub3csIG5vIHNlbnNlIGluIGNvbnRpbnVpbmcgdG8gbG9vayBhdAorCQkJICogdGhpcyBzdHJpbmcuICovCisJCQlpZiAoc3RyW2ldICE9IGN1cl9zdHItPnN0cltpXSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IHN0cl9sZW4pCisJCQlyZXRfdmFsID0gY3VyX3N0cjsKKwl9CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOglwcml2X3N0cmluZ190YmxfZmluYWxpemUKKyAqIERlc2NyaXB0aW9uOiBGbGF0dGVuIHRoZSB0cmFtcG9saW5lIHN0cmluZyBsaXN0IGludG8gYSB0YWJsZSBvZiBOVUxMCisgKgkgIHRlcm1pbmF0ZWQgc3RyaW5ncy4gIFRoaXMgaXMgdGhlIHNhbWUgZm9ybWF0IG9mIHN0cmluZyB0YWJsZQorICoJICBhcyB1c2VkIGJ5IHRoZSBDT0ZGL0RPRkYgZmlsZS4KKyAqLworc3RhdGljIGludCBwcml2X3N0cmluZ190YmxfZmluYWxpemUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCB0cmFtcF9zdHJpbmcgKmN1cl9zdHJpbmc7CisJY2hhciAqY3VyX2xvYzsKKwljaGFyICp0bXA7CisKKwkvKiAgQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhbGwgc3RyaW5ncyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAgVGhlCisJICogdGFibGUgaXMgc2ltcGx5IGFsbCBzdHJpbmdzIGNvbmNhdGVuYXRlZCB0b2dldGhlciB3aWxsIE5VTEwKKwkgKiBlbmRpbmdzLiAqLworCWRsdGhpcy0+dHJhbXAuZmluYWxfc3RyaW5nX3RhYmxlID0KKwkgICAgKGNoYXIgKilkbHRoaXMtPm15c3ltLT5kbG9hZF9hbGxvY2F0ZShkbHRoaXMtPm15c3ltLAorCQkJCQkJICBkbHRoaXMtPnRyYW1wLgorCQkJCQkJICB0cmFtcF9zdHJpbmdfc2l6ZSk7CisJaWYgKGRsdGhpcy0+dHJhbXAuZmluYWxfc3RyaW5nX3RhYmxlICE9IE5VTEwpIHsKKwkJLyogIFdlIGdvdCBvdXIgYnVmZmVyLCB3YWxrIHRoZSBsaXN0IGFuZCByZWxlYXNlIHRoZSBub2RlcyBhcyoKKwkJICogd2UgZ28gKi8KKwkJY3VyX2xvYyA9IGRsdGhpcy0+dHJhbXAuZmluYWxfc3RyaW5nX3RhYmxlOworCQljdXJfc3RyaW5nID0gZGx0aGlzLT50cmFtcC5zdHJpbmdfaGVhZDsKKwkJd2hpbGUgKGN1cl9zdHJpbmcgIT0gTlVMTCkgeworCQkJLyogIE1vdmUgdGhlIGhlYWQvdGFpbCBwb2ludGVycyAqLworCQkJZGx0aGlzLT50cmFtcC5zdHJpbmdfaGVhZCA9IGN1cl9zdHJpbmctPm5leHQ7CisJCQlpZiAoZGx0aGlzLT50cmFtcC5zdHJpbmdfdGFpbCA9PSBjdXJfc3RyaW5nKQorCQkJCWRsdGhpcy0+dHJhbXAuc3RyaW5nX3RhaWwgPSBOVUxMOworCisJCQkvKiAgQ29weSB0aGUgc3RyaW5nIGNvbnRlbnRzICovCisJCQlmb3IgKHRtcCA9IGN1cl9zdHJpbmctPnN0cjsKKwkJCSAgICAgKnRtcCAhPSAnXDAnOyB0bXArKywgY3VyX2xvYysrKQorCQkJCSpjdXJfbG9jID0gKnRtcDsKKworCQkJLyogIFBpY2sgdXAgdGhlIE5VTEwgdGVybWluYXRpb24gc2luY2UgaXQgd2FzIG1pc3NlZCBieQorCQkJICogYnJlYWtpbmcgdXNpbmcgaXQgdG8gZW5kIHRoZSBhYm92ZSBsb29wLiAqLworCQkJKmN1cl9sb2MgPSAnXDAnOworCQkJY3VyX2xvYysrOworCisJCQkvKiAgRnJlZSB0aGUgc3RyaW5nIG5vZGUsIHdlIGRvbid0IG5lZWQgaXQgYW55IG1vcmUuICovCisJCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQkJY3VyX3N0cmluZyk7CisKKwkJCS8qICBNb3ZlIG91ciBwb2ludGVyIHRvIHRoZSBuZXh0IG9uZSAqLworCQkJY3VyX3N0cmluZyA9IGRsdGhpcy0+dHJhbXAuc3RyaW5nX2hlYWQ7CisJCX0KKworCQkvKiAgVXBkYXRlIG91ciByZXR1cm4gdmFsdWUgdG8gc3VjY2VzcyAqLworCQlyZXRfdmFsID0gMTsKKwl9IGVsc2UKKwkJZGxvYWRfZXJyb3IoZGx0aGlzLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRyYW1wb2xpbmUgIgorCQkJICAgICJzdHJpbmcgdGFibGUiKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfdHJhbXBfc2VjdF9hbGxvYworICogRGVzY3JpcHRpb246IFZpcnR1YWxseSBhbGxvY2F0ZSBzcGFjZSBmcm9tIHRoZSB0cmFtcG9saW5lIHNlY3Rpb24uICBUaGlzCisgKgkgIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5leHQgb2Zmc2V0IHdpdGhpbiB0aGUgdHJhbXBvbGluZSBzZWN0aW9uCisgKgkgIHRoYXQgaXMgYXZhaWxhYmxlIGFuZCBtb3ZlZCB0aGUgbmV4dCBhdmFpbGFibGUgb2Zmc2V0IGJ5IHRoZQorICoJICByZXF1ZXN0ZWQgc2l6ZS4gIE5PIFRBUkdFVCBBTExPQ0FUSU9OIElTIERPTkUgQVQgVEhJUyBUSU1FLgorICovCitzdGF0aWMgdTMyIHByaXZfdHJhbXBfc2VjdF9hbGxvYyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdTMyIHRyYW1wX3NpemUpCit7CisJdTMyIHJldF92YWw7CisKKwkvKiAgSWYgdGhlIG5leHQgYXZhaWxhYmxlIGFkZHJlc3MgaXMgMCwgdGhpcyBpcyBvdXIgZmlyc3QgYWxsb2NhdGlvbi4KKwkgKiBDcmVhdGUgYSBzZWN0aW9uIG5hbWUgc3RyaW5nIHRvIGdvIGludG8gdGhlIHN0cmluZyB0YWJsZSAuICovCisJaWYgKGRsdGhpcy0+dHJhbXAudHJhbXBfc2VjdF9uZXh0X2FkZHIgPT0gMCkgeworCQlkbG9hZF9zeW1zX2Vycm9yKGRsdGhpcy0+bXlzeW0sICIqKiogV0FSTklORyAqKiogIGNyZWF0ZWQgIgorCQkJCSAiZHluYW1pYyBUUkFNUE9MSU5FIHNlY3Rpb24gZm9yIG1vZHVsZSAlcyIsCisJCQkJIGRsdGhpcy0+c3RyX2hlYWQpOworCX0KKworCS8qICBSZXNlcnZlIHNwYWNlIGZvciB0aGUgbmV3IHRyYW1wb2xpbmUgKi8KKwlyZXRfdmFsID0gZGx0aGlzLT50cmFtcC50cmFtcF9zZWN0X25leHRfYWRkcjsKKwlkbHRoaXMtPnRyYW1wLnRyYW1wX3NlY3RfbmV4dF9hZGRyICs9IHRyYW1wX3NpemU7CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJcHJpdl90cmFtcF9zeW1fY3JlYXRlCisgKiBEZXNjcmlwdGlvbjogQWxsb2NhdGUgYW5kIGNyZWF0ZSBhIG5ldyB0cmFtcG9saW5lIHNwZWNpZmljIHN5bWJvbCBhbmQgYWRkCisgKgkgIGl0IHRvIHRoZSB0cmFtcG9saW5lIHN5bWJvbCBsaXN0LiAgVGhlc2Ugc3ltYm9scyB3aWxsIGluY2x1ZGUKKyAqCSAgdHJhbXBvbGluZSBwb2ludHMgYXMgd2VsbCBhcyB0aGUgZXh0ZXJuYWwgc3ltYm9scyB0aGV5CisgKgkgIHJlZmVyZW5jZS4KKyAqLworc3RhdGljIHN0cnVjdCB0cmFtcF9zeW0gKnByaXZfdHJhbXBfc3ltX2NyZWF0ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywKKwkJCQkJICAgICAgIHUzMiBzdHJfaW5kZXgsCisJCQkJCSAgICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICp0bXBfc3ltKQoreworCXN0cnVjdCB0cmFtcF9zeW0gKm5ld19zeW0gPSBOVUxMOworCXUzMiBpOworCisJLyogIEFsbG9jYXRlIG5ldyBzcGFjZSBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAqLworCW5ld19zeW0gPQorCSAgICAoc3RydWN0IHRyYW1wX3N5bSAqKWRsdGhpcy0+bXlzeW0tPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdHJhbXBfc3ltKSk7CisJaWYgKG5ld19zeW0gIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpICE9IHNpemVvZihzdHJ1Y3QgdHJhbXBfc3ltKTsgaSsrKQorCQkJKigoY2hhciAqKW5ld19zeW0gKyBpKSA9IDA7CisKKwkJLyogIEFzc2lnbiB0aGlzIHN5bWJvbCB0aGUgbmV4dCBzeW1ib2wgaW5kZXggZm9yIGVhc2llcgorCQkgKiByZWZlcmVuY2UgbGF0ZXIgZHVyaW5nIHJlbG9jYXRpb24uICovCisJCW5ld19zeW0tPmluZGV4ID0gZGx0aGlzLT50cmFtcC50cmFtcF9zeW1fbmV4dF9pbmRleDsKKwkJZGx0aGlzLT50cmFtcC50cmFtcF9zeW1fbmV4dF9pbmRleCsrOworCisJCS8qICBQb3B1bGF0ZSB0aGUgc3ltYm9sIGluZm9ybWF0aW9uLiAgQXQgdGhpcyBwb2ludCBhbnkKKwkJICogdHJhbXBvbGluZSBzeW1ib2xzIHdpbGwgYmUgdGhlIG9mZnNldCBsb2NhdGlvbiwgbm90IHRoZQorCQkgKiBmaW5hbC4gIENvcHkgb3ZlciB0aGUgc3ltYm9sIGluZm8gdG8gc3RhcnQsIHRoZW4gYmUgc3VyZSB0bworCQkgKiBnZXQgdGhlIHN0cmluZyBpbmRleCBmcm9tIHRoZSB0cmFtcG9saW5lIHN0cmluZyB0YWJsZS4gKi8KKwkJbmV3X3N5bS0+c3ltX2luZm8gPSAqdG1wX3N5bTsKKwkJbmV3X3N5bS0+c3RyX2luZGV4ID0gc3RyX2luZGV4OworCisJCS8qICBQdXNoIHRoZSBuZXcgc3ltYm9sIHRvIHRoZSB0YWlsIG9mIHRoZSBzeW1ib2wgdGFibGUgbGlzdCAqLworCQluZXdfc3ltLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGRsdGhpcy0+dHJhbXAuc3ltYm9sX2hlYWQgPT0gTlVMTCkKKwkJCWRsdGhpcy0+dHJhbXAuc3ltYm9sX2hlYWQgPSBuZXdfc3ltOworCQllbHNlCisJCQlkbHRoaXMtPnRyYW1wLnN5bWJvbF90YWlsLT5uZXh0ID0gbmV3X3N5bTsKKworCQlkbHRoaXMtPnRyYW1wLnN5bWJvbF90YWlsID0gbmV3X3N5bTsKKwl9CisKKwlyZXR1cm4gbmV3X3N5bTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOglwcml2X3RyYW1wX3N5bV9nZXQKKyAqIERlc2NyaXB0aW9uOiBTZWFyY2ggZm9yIHRoZSBzeW1ib2wgd2l0aCB0aGUgbWF0Y2hpbmcgc3RyaW5nIGluZGV4IChmcm9tCisgKgkgIHRoZSB0cmFtcG9saW5lIHN0cmluZyB0YWJsZSkgYW5kIHJldHVybiB0aGUgdHJhbXBvbGluZQorICoJICBzeW1ib2wgb2JqZWN0LCBpZiBmb3VuZC4gIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCB0cmFtcF9zeW0gKnByaXZfdHJhbXBfc3ltX2dldChzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywKKwkJCQkJICAgIHUzMiBzdHJpbmdfaW5kZXgpCit7CisJc3RydWN0IHRyYW1wX3N5bSAqc3ltX2ZvdW5kID0gTlVMTDsKKworCS8qICBXYWxrIHRoZSBzeW1ib2wgdGFibGUgbGlzdCBhbmQgc2VhcmNoIHZzLiB0aGUgc3RyaW5nIGluZGV4ICovCisJZm9yIChzeW1fZm91bmQgPSBkbHRoaXMtPnRyYW1wLnN5bWJvbF9oZWFkOworCSAgICAgc3ltX2ZvdW5kICE9IE5VTEw7IHN5bV9mb3VuZCA9IHN5bV9mb3VuZC0+bmV4dCkgeworCQlpZiAoc3ltX2ZvdW5kLT5zdHJfaW5kZXggPT0gc3RyaW5nX2luZGV4KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN5bV9mb3VuZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOglwcml2X3RyYW1wX3N5bV9maW5kCisgKiBEZXNjcmlwdGlvbjogU2VhcmNoIGZvciBhIHRyYW1wb2xpbmUgc3ltYm9sIGJhc2VkIG9uIHRoZSBzdHJpbmcgbmFtZSBvZgorICoJICB0aGUgc3ltYm9sLiAgUmV0dXJuIHRoZSBzeW1ib2wgb2JqZWN0LCBpZiBmb3VuZCwgb3RoZXJ3aXNlCisgKgkgIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IHRyYW1wX3N5bSAqcHJpdl90cmFtcF9zeW1fZmluZChzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywKKwkJCQkJICAgICBjaGFyICpzdHJpbmcpCit7CisJc3RydWN0IHRyYW1wX3N5bSAqc3ltX2ZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgdHJhbXBfc3RyaW5nICpzdHJfZm91bmQgPSBOVUxMOworCisJLyogIEZpcnN0LCBzZWFyY2ggZm9yIHRoZSBzdHJpbmcsIHRoZW4gc2VhcmNoIGZvciB0aGUgc3ltIGJhc2VkIG9uIHRoZQorCSAgIHN0cmluZyBpbmRleC4gKi8KKwlzdHJfZm91bmQgPSBwcml2X3RyYW1wX3N0cmluZ19maW5kKGRsdGhpcywgc3RyaW5nKTsKKwlpZiAoc3RyX2ZvdW5kICE9IE5VTEwpCisJCXN5bV9mb3VuZCA9IHByaXZfdHJhbXBfc3ltX2dldChkbHRoaXMsIHN0cl9mb3VuZC0+aW5kZXgpOworCisJcmV0dXJuIHN5bV9mb3VuZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOglwcml2X3RyYW1wX3N5bV9maW5hbGl6ZQorICogRGVzY3JpcHRpb246IEFsbG9jYXRlIGEgZmxhdCBzeW1ib2wgdGFibGUgZm9yIHRoZSB0cmFtcG9saW5lIHNlY3Rpb24sCisgKgkgIHB1dCBlYWNoIHRyYW1wb2xpbmUgc3ltYm9sIGludG8gdGhlIHRhYmxlLCBhZGp1c3QgdGhlCisgKgkgIHN5bWJvbCB2YWx1ZSBiYXNlZCBvbiB0aGUgc2VjdGlvbiBhZGRyZXNzIG9uIHRoZSB0YXJnZXQgYW5kCisgKgkgIGZyZWUgdGhlIHRyYW1wb2xpbmUgc3ltYm9sIGxpc3Qgbm9kZXMuCisgKi8KK3N0YXRpYyBpbnQgcHJpdl90cmFtcF9zeW1fZmluYWxpemUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCB0cmFtcF9zeW0gKmN1cl9zeW07CisJc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKnRyYW1wX3NlY3QgPQorCSAgICAmZGx0aGlzLT5sZHJfc2VjdGlvbnNbZGx0aGlzLT5hbGxvY2F0ZWRfc2Vjbl9jb3VudF07CisJc3RydWN0IGxvY2FsX3N5bWJvbCAqbmV3X3N5bTsKKworCS8qICBBbGxvY2F0ZSBhIHRhYmxlIHRvIGhvbGQgYSBmbGF0dGVuZWQgdmVyc2lvbiBvZiBhbGwgc3ltYm9scworCSAqIGNyZWF0ZWQuICovCisJZGx0aGlzLT50cmFtcC5maW5hbF9zeW1fdGFibGUgPQorCSAgICAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKWRsdGhpcy0+bXlzeW0tPmRsb2FkX2FsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJIChzaXplb2Yoc3RydWN0IGxvY2FsX3N5bWJvbCkgKiBkbHRoaXMtPnRyYW1wLgorCQkJCQkJICB0cmFtcF9zeW1fbmV4dF9pbmRleCkpOworCWlmIChkbHRoaXMtPnRyYW1wLmZpbmFsX3N5bV90YWJsZSAhPSBOVUxMKSB7CisJCS8qICBXYWxrIHRoZSBsaXN0IG9mIGFsbCBzeW1ib2xzLCBjb3B5IGl0IG92ZXIgdG8gdGhlIGZsYXR0ZW5lZAorCQkgKiB0YWJsZS4gQWZ0ZXIgaXQgaGFzIGJlZW4gY29waWVkLCB0aGUgbm9kZSBjYW4gYmUgZnJlZWQgYXMKKwkJICogaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gKi8KKwkJbmV3X3N5bSA9IGRsdGhpcy0+dHJhbXAuZmluYWxfc3ltX3RhYmxlOworCQljdXJfc3ltID0gZGx0aGlzLT50cmFtcC5zeW1ib2xfaGVhZDsKKwkJd2hpbGUgKGN1cl9zeW0gIT0gTlVMTCkgeworCQkJLyogIFBvcCBpdCBvZmYgdGhlIGxpc3QgKi8KKwkJCWRsdGhpcy0+dHJhbXAuc3ltYm9sX2hlYWQgPSBjdXJfc3ltLT5uZXh0OworCQkJaWYgKGN1cl9zeW0gPT0gZGx0aGlzLT50cmFtcC5zeW1ib2xfdGFpbCkKKwkJCQlkbHRoaXMtPnRyYW1wLnN5bWJvbF90YWlsID0gTlVMTDsKKworCQkJLyogIENvcHkgdGhlIHN5bWJvbCBjb250ZW50cyBpbnRvIHRoZSBmbGF0IHRhYmxlICovCisJCQkqbmV3X3N5bSA9IGN1cl9zeW0tPnN5bV9pbmZvOworCisJCQkvKiAgTm93IGZpbmFpemUgdGhlIHN5bWJvbC4gIElmIGl0IGlzIGluIHRoZSB0cmFtcAorCQkJICogc2VjdGlvbiwgd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoZSBzZWN0aW9uIHN0YXJ0LgorCQkJICogSWYgaXQgaXMgZXh0ZXJuYWwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBhdAorCQkJICogYWxsLgorCQkJICogTk9URTogVEhJUyBDT0RFIEFTU1VNRVMgVEhBVCBUSEUgVFJBTVBPTElORSBJUworCQkJICogUkVGRVJFTkNFRCBMSUtFIEEgQ0FMTCBUTyBBTiBFWFRFUk5BTCBTTyBWQUxVRSBBTkQKKwkJCSAqIERFTFRBIEFSRSBUSEUgU0FNRS4gIFNFRSBUSEUgRlVOQ1RJT04gZGxvYWRfc3ltYm9scworCQkJICogV0hFUkUgRE5fVU5ERUYgSVMgSEFORExFRCBGT1IgTU9SRSBSRUZFUkVOQ0UuICovCisJCQlpZiAobmV3X3N5bS0+c2Vjbm4gPCAwKSB7CisJCQkJbmV3X3N5bS0+dmFsdWUgKz0gdHJhbXBfc2VjdC0+bG9hZF9hZGRyOworCQkJCW5ld19zeW0tPmRlbHRhID0gbmV3X3N5bS0+dmFsdWU7CisJCQl9CisKKwkJCS8qICBMZXQgZ28gb2YgdGhlIHN5bWJvbCBub2RlICovCisJCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sIGN1cl9zeW0pOworCisJCQkvKiAgTW92ZSB0byB0aGUgbmV4dCBub2RlICovCisJCQljdXJfc3ltID0gZGx0aGlzLT50cmFtcC5zeW1ib2xfaGVhZDsKKwkJCW5ld19zeW0rKzsKKwkJfQorCisJCXJldF92YWwgPSAxOworCX0gZWxzZQorCQlkbG9hZF9lcnJvcihkbHRoaXMsICJGYWlsZWQgdG8gYWxsb2MgdHJhbXBvbGluZSBzeW0gdGFibGUiKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfdGd0X2ltZ19nZW4KKyAqIERlc2NyaXB0aW9uOiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBhbmQgY29weSB0aGUgdGFyZ2V0IHNwZWNpZmljIGltYWdlIGRhdGEKKyAqCWFuZCBmaXggdXAgaXRzIHJlbG9jYXRpb25zIGZvciB0aGUgbmV3IGV4dGVybmFsIHN5bWJvbC4gIElmCisgKglhIHRyYW1wb2xpbmUgaW1hZ2UgcGFja2V0IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBpdCBpcyBhZGRlZAorICoJdG8gdGhlIHRyYW1wb2xpbmUgbGlzdC4KKyAqLworc3RhdGljIGludCBwcml2X3RndF9pbWdfZ2VuKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLCB1MzIgYmFzZSwKKwkJCSAgICB1MzIgZ2VuX2luZGV4LCBzdHJ1Y3QgdHJhbXBfc3ltICpuZXdfZXh0X3N5bSkKK3sKKwlzdHJ1Y3QgdHJhbXBfaW1nX3BrdCAqbmV3X2ltZ19wa3QgPSBOVUxMOworCXUzMiBpOworCXUzMiBwa3Rfc2l6ZSA9IHRyYW1wX2ltZ19wa3Rfc2l6ZV9nZXQoKTsKKwl1OCAqZ2VuX3RibF9lbnRyeTsKKwl1OCAqcGt0X2RhdGE7CisJc3RydWN0IHJlbG9jX3JlY29yZF90ICpjdXJfcmVsbzsKKwlpbnQgcmV0X3ZhbCA9IDA7CisKKwkvKiAgQWxsb2NhdGUgYSBuZXcgaW1hZ2UgcGFja2V0IGFuZCBzZXQgaXQgdXAuICovCisJbmV3X2ltZ19wa3QgPQorCSAgICAoc3RydWN0IHRyYW1wX2ltZ19wa3QgKilkbHRoaXMtPm15c3ltLT5kbG9hZF9hbGxvY2F0ZShkbHRoaXMtPm15c3ltLAorCQkJCQkJCQkgIHBrdF9zaXplKTsKKwlpZiAobmV3X2ltZ19wa3QgIT0gTlVMTCkgeworCQkvKiAgU2F2ZSB0aGUgYmFzZSwgdGhpcyBpcyB3aGVyZSBpdCBnb2VzIGluIHRoZSBzZWN0aW9uICovCisJCW5ld19pbWdfcGt0LT5iYXNlID0gYmFzZTsKKworCQkvKiAgQ29weSBvdmVyIHRoZSBpbWFnZSBkYXRhIGFuZCByZWxvcyBmcm9tIHRoZSB0YXJnZXQgdGFibGUgKi8KKwkJcGt0X2RhdGEgPSAodTggKikgJm5ld19pbWdfcGt0LT5oZHI7CisJCWdlbl90YmxfZW50cnkgPSAodTggKikgJnRyYW1wX2dlbl9pbmZvW2dlbl9pbmRleF07CisJCWZvciAoaSA9IDA7IGkgPCBwa3Rfc2l6ZTsgaSsrKSB7CisJCQkqcGt0X2RhdGEgPSAqZ2VuX3RibF9lbnRyeTsKKwkJCXBrdF9kYXRhKys7CisJCQlnZW5fdGJsX2VudHJ5Kys7CisJCX0KKworCQkvKiAgVXBkYXRlIHRoZSByZWxvY2F0aW9ucyB0byBwb2ludCB0byB0aGUgZXh0ZXJuYWwgc3ltYm9sICovCisJCWN1cl9yZWxvID0KKwkJICAgIChzdHJ1Y3QgcmVsb2NfcmVjb3JkX3QgKikoKHU4ICopICZuZXdfaW1nX3BrdC0+aGRyICsKKwkJCQkJICAgICAgbmV3X2ltZ19wa3QtPmhkci5yZWxvX29mZnNldCk7CisJCWZvciAoaSA9IDA7IGkgPCBuZXdfaW1nX3BrdC0+aGRyLm51bV9yZWxvczsgaSsrKQorCQkJY3VyX3JlbG9baV0uU1lNTkRYID0gbmV3X2V4dF9zeW0tPmluZGV4OworCisJCS8qICBBZGQgaXQgdG8gdGhlIHRyYW1wb2xpbmUgbGlzdC4gKi8KKwkJbmV3X2ltZ19wa3QtPm5leHQgPSBkbHRoaXMtPnRyYW1wLnRyYW1wX3BrdHM7CisJCWRsdGhpcy0+dHJhbXAudHJhbXBfcGt0cyA9IG5ld19pbWdfcGt0OworCisJCXJldF92YWwgPSAxOworCX0KKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfcGt0X3JlbG8KKyAqIERlc2NyaXB0aW9uOiBUYWtlIHRoZSBwcm92aWRlZCBpbWFnZSBkYXRhIGFuZCB0aGUgY29sbGVjdGlvbiBvZiByZWxvY2F0aW9ucworICoJICBmb3IgaXQgYW5kIHBlcmZvcm0gdGhlIHJlbG9jYXRpb25zLiAgTm90ZSB0aGF0IGFsbCByZWxvY2F0aW9ucworICoJICBhdCB0aGlzIHN0YWdlIGFyZSBjb25zaWRlcmVkIFNFQ09ORCBQQVNTIHNpbmNlIHRoZSBvcmlnaW5hbAorICoJICBpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBpbiB0aGUgZmlyc3QgcGFzcy4gIFRoaXMgbWVhbnMKKyAqCSAgVFJBTVBPTElORVMgQVJFIFRSRUFURUQgQVMgMk5EIFBBU1MgZXZlbiB0aG91Z2ggdGhpcyBpcyByZWFsbHkKKyAqCSAgdGhlIGZpcnN0IChhbmQgb25seSkgcmVsb2NhdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgcHJpdl9wa3RfcmVsbyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdGd0X2F1X3QgKiBkYXRhLAorCQkJIHN0cnVjdCByZWxvY19yZWNvcmRfdCAqcnBbXSwgdTMyIHJlbG9fY291bnQpCit7CisJaW50IHJldF92YWwgPSAxOworCXUzMiBpOworCWJvb2wgdG1wOworCisJLyogIFdhbGsgdGhyb3VnaCBhbGwgb2YgdGhlIHJlbG9zIGFuZCBwcm9jZXNzIHRoZW0uICBUaGlzIGZ1bmN0aW9uIGlzCisJICogdGhlIGVxdWl2YWxlbnQgb2YgcmVsb2NhdGVfcGFja2V0KCkgZnJvbSBjbG9hZC5jLCBidXQgc3BlY2lhbGl6ZWQKKwkgKiBmb3IgdHJhbXBvbGluZXMgYW5kIDJuZCBwaGFzZSByZWxvY2F0aW9ucy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVsb19jb3VudDsgaSsrKQorCQlkbG9hZF9yZWxvY2F0ZShkbHRoaXMsIGRhdGEsIHJwW2ldLCAmdG1wLCB0cnVlKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfdHJhbXBfcGt0X2ZpbmFsaXplCisgKiBEZXNjcmlwdGlvbjogV2FsayB0aGUgbGlzdCBvZiBhbGwgdHJhbXBvbGluZSBwYWNrZXRzIGFuZCBmaW5hbGl6ZSB0aGVtLgorICoJICBFYWNoIHRyYW1wb2xpbmUgaW1hZ2UgcGFja2V0IHdpbGwgYmUgcmVsb2NhdGVkIG5vdyB0aGF0IHRoZQorICoJICB0cmFtcG9saW5lIHNlY3Rpb24gaGFzIGJlZW4gYWxsb2NhdGVkIG9uIHRoZSB0YXJnZXQuICBPbmNlCisgKgkgIGFsbCBvZiB0aGUgcmVsb2NhdGlvbnMgYXJlIGRvbmUgdGhlIHRyYW1wb2xpbmUgaW1hZ2UgZGF0YQorICoJICBpcyB3cml0dGVuIGludG8gdGFyZ2V0IG1lbW9yeSBhbmQgdGhlIHRyYW1wb2xpbmUgcGFja2V0CisgKgkgIGlzIGZyZWVkOiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGFmdGVyIHRoaXMgcG9pbnQuCisgKi8KK3N0YXRpYyBpbnQgcHJpdl90cmFtcF9wa3RfZmluYWxpemUoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMpCit7CisJaW50IHJldF92YWwgPSAxOworCXN0cnVjdCB0cmFtcF9pbWdfcGt0ICpjdXJfcGt0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVsb2NfcmVjb3JkX3QgKnJlbG9zW01BWF9SRUxPU19QRVJfUEFTU107CisJdTMyIHJlbG9zX2RvbmU7CisJdTMyIGk7CisJc3RydWN0IHJlbG9jX3JlY29yZF90ICpjdXJfcmVsbzsKKwlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqc2VjdF9pbmZvID0KKwkgICAgJmRsdGhpcy0+bGRyX3NlY3Rpb25zW2RsdGhpcy0+YWxsb2NhdGVkX3NlY25fY291bnRdOworCisJLyogIFdhbGsgdGhlIGxpc3Qgb2YgdHJhbXBvbGluZSBwYWNrZXRzIGFuZCByZWxvY2F0ZSBlYWNoIHBhY2tldC4gIFRoaXMKKwkgKiBmdW5jdGlvbiBpcyB0aGUgdHJhbXBvbGluZSBlcXVpdmFsZW50IG9mIGRsb2FkX2RhdGEoKSBmcm9tCisJICogY2xvYWQuYy4gKi8KKwljdXJfcGt0ID0gZGx0aGlzLT50cmFtcC50cmFtcF9wa3RzOworCXdoaWxlICgocmV0X3ZhbCAhPSAwKSAmJiAoY3VyX3BrdCAhPSBOVUxMKSkgeworCQkvKiAgUmVtb3ZlIHRoZSBwa3QgZnJvbSB0aGUgbGlzdCAqLworCQlkbHRoaXMtPnRyYW1wLnRyYW1wX3BrdHMgPSBjdXJfcGt0LT5uZXh0OworCisJCS8qICBTZXR1cCBzZWN0aW9uIGFuZCBpbWFnZSBvZmZzZXQgaW5mb3JtYXRpb24gZm9yIHRoZSByZWxvICovCisJCWRsdGhpcy0+aW1hZ2Vfc2VjbiA9IHNlY3RfaW5mbzsKKwkJZGx0aGlzLT5pbWFnZV9vZmZzZXQgPSBjdXJfcGt0LT5iYXNlOworCQlkbHRoaXMtPmRlbHRhX3J1bmFkZHIgPSBzZWN0X2luZm8tPnJ1bl9hZGRyOworCisJCS8qICBXYWxrIHRocm91Z2ggYWxsIHJlbG9zIGZvciB0aGUgcGFja2V0ICovCisJCXJlbG9zX2RvbmUgPSAwOworCQljdXJfcmVsbyA9IChzdHJ1Y3QgcmVsb2NfcmVjb3JkX3QgKikoKHU4ICopICZjdXJfcGt0LT5oZHIgKworCQkJCQkJICAgICBjdXJfcGt0LT5oZHIucmVsb19vZmZzZXQpOworCQl3aGlsZSAocmVsb3NfZG9uZSA8IGN1cl9wa3QtPmhkci5udW1fcmVsb3MpIHsKKyNpZmRlZiBFTkFCTEVfVFJBTVBfREVCVUcKKwkJCWRsb2FkX3N5bXNfZXJyb3IoZGx0aGlzLT5teXN5bSwKKwkJCQkJICI9PT0+IFRyYW1wb2xpbmUgJXggYnJhbmNoZXMgdG8gJXgiLAorCQkJCQkgc2VjdF9pbmZvLT5ydW5fYWRkciArCisJCQkJCSBkbHRoaXMtPmltYWdlX29mZnNldCwKKwkJCQkJIGRsdGhpcy0+CisJCQkJCSB0cmFtcC5maW5hbF9zeW1fdGFibGVbY3VyX3JlbG8tPgorCQkJCQkJCSAgICAgICBTWU1ORFhdLnZhbHVlKTsKKyNlbmRpZgorCisJCQlmb3IgKGkgPSAwOworCQkJICAgICAoKGkgPCBNQVhfUkVMT1NfUEVSX1BBU1MpICYmCisJCQkgICAgICAoKGkgKyByZWxvc19kb25lKSA8IGN1cl9wa3QtPmhkci5udW1fcmVsb3MpKTsgaSsrKQorCQkJCXJlbG9zW2ldID0gY3VyX3JlbG8gKyBpOworCisJCQkvKiAgRG8gdGhlIGFjdHVhbCByZWxvICovCisJCQlyZXRfdmFsID0gcHJpdl9wa3RfcmVsbyhkbHRoaXMsCisJCQkJCQkodGd0X2F1X3QgKikgJmN1cl9wa3QtPnBheWxvYWQsCisJCQkJCQlyZWxvcywgaSk7CisJCQlpZiAocmV0X3ZhbCA9PSAwKSB7CisJCQkJZGxvYWRfZXJyb3IoZGx0aGlzLAorCQkJCQkgICAgIlJlbG9jYXRpb24gb2YgdHJhbXBvbGluZSBwa3QgYXQgJXgiCisJCQkJCSAgICAiIGZhaWxlZCIsIGN1cl9wa3QtPmJhc2UgKworCQkJCQkgICAgc2VjdF9pbmZvLT5ydW5fYWRkcik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJlbG9zX2RvbmUgKz0gaTsKKwkJCWN1cl9yZWxvICs9IGk7CisJCX0KKworCQkvKiAgTWFrZSBzdXJlIHdlIGRpZG4ndCBoaXQgYSBwcm9ibGVtICovCisJCWlmIChyZXRfdmFsICE9IDApIHsKKwkJCS8qICBSZWxvcyBhcmUgZG9uZSBmb3IgdGhlIHBhY2tldCwgd3JpdGUgaXQgdG8gdGhlCisJCQkgKiB0YXJnZXQgKi8KKwkJCXJldF92YWwgPSBkbHRoaXMtPm15aW8tPndyaXRlbWVtKGRsdGhpcy0+bXlpbywKKwkJCQkJCQkgJmN1cl9wa3QtPnBheWxvYWQsCisJCQkJCQkJIHNlY3RfaW5mby0+bG9hZF9hZGRyICsKKwkJCQkJCQkgY3VyX3BrdC0+YmFzZSwKKwkJCQkJCQkgc2VjdF9pbmZvLAorCQkJCQkJCSBCWVRFX1RPX0hPU1QKKwkJCQkJCQkgKGN1cl9wa3QtPmhkci4KKwkJCQkJCQkgIHRyYW1wX2NvZGVfc2l6ZSkpOworCQkJaWYgKHJldF92YWwgPT0gMCkgeworCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywKKwkJCQkJICAgICJXcml0ZSB0byAiIEZNVF9VSTMyICIgZmFpbGVkIiwKKwkJCQkJICAgIHNlY3RfaW5mby0+bG9hZF9hZGRyICsKKwkJCQkJICAgIGN1cl9wa3QtPmJhc2UpOworCQkJfQorCisJCQkvKiAgRG9uZSB3aXRoIHRoZSBwa3QsIGxldCBpdCBnbyAqLworCQkJZGx0aGlzLT5teXN5bS0+ZGxvYWRfZGVhbGxvY2F0ZShkbHRoaXMtPm15c3ltLCBjdXJfcGt0KTsKKworCQkJLyogIEdldCB0aGUgbmV4dCBwYWNrZXQgdG8gcHJvY2VzcyAqLworCQkJY3VyX3BrdCA9IGRsdGhpcy0+dHJhbXAudHJhbXBfcGt0czsKKwkJfQorCX0KKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CXByaXZfZHVwX3BrdF9maW5hbGl6ZQorICogRGVzY3JpcHRpb246IFdhbGsgdGhlIGxpc3Qgb2YgZHVwbGljYXRlIGltYWdlIHBhY2tldHMgYW5kIGZpbmFsaXplIHRoZW0uCisgKgkgIEVhY2ggZHVwbGljYXRlIHBhY2tldCB3aWxsIGJlIHJlbG9jYXRlZCBhZ2FpbiBmb3IgdGhlCisgKgkgIHJlbG9jYXRpb25zIHRoYXQgcHJldmlvdXNseSBmYWlsZWQgYW5kIGhhdmUgYmVlbiBhZGp1c3RlZAorICoJICB0byBwb2ludCBhdCBhIHRyYW1wb2xpbmUuICBPbmNlIGFsbCByZWxvY2F0aW9ucyBmb3IgYSBwYWNrZXQKKyAqCSAgaGF2ZSBiZWVuIGRvbmUsIHdyaXRlIHRoZSBwYWNrZXQgaW50byB0YXJnZXQgbWVtb3J5LiAgVGhlCisgKgkgIGR1cGxpY2F0ZSBwYWNrZXQgYW5kIGl0cyByZWxvY2F0aW9uIGNoYWluIGFyZSBhbGwgZnJlZWQKKyAqCSAgYWZ0ZXIgdXNlIGhlcmUgYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBhZnRlciB0aGlzLgorICovCitzdGF0aWMgaW50IHByaXZfZHVwX3BrdF9maW5hbGl6ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcykKK3sKKwlpbnQgcmV0X3ZhbCA9IDE7CisJc3RydWN0IHRyYW1wX2ltZ19kdXBfcGt0ICpjdXJfcGt0OworCXN0cnVjdCB0cmFtcF9pbWdfZHVwX3JlbG8gKmN1cl9yZWxvOworCXN0cnVjdCByZWxvY19yZWNvcmRfdCAqcmVsb3NbTUFYX1JFTE9TX1BFUl9QQVNTXTsKKwlzdHJ1Y3QgZG9mZl9zY25oZHJfdCAqc2VjdF9oZHIgPSBOVUxMOworCXMzMiBpOworCisJLyogU2ltaWxhciB0byB0aGUgdHJhbXBvbGluZSBwa3QgZmluYWxpemUsIHRoaXMgZnVuY3Rpb24gd2Fsa3MgZWFjaCBkdXAKKwkgKiBwa3QgdGhhdCB3YXMgZ2VuZXJhdGVkIGFuZCBwZXJmb3JtcyBhbGwgcmVsb2NhdGlvbnMgdGhhdCB3ZXJlCisJICogZGVmZXJyZWQgdG8gYSAybmQgcGFzcy4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgZGxvYWRfZGF0YSgpIGZyb20KKwkgKiBjbG9hZC5jLCBidXQgZG9lcyBub3QgbmVlZCB0aGUgYWRkaXRpb25hbCByZW9yZGVyIGFuZCBjaGVja3N1bQorCSAqIHByb2Nlc3NpbmcgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLiAqLworCWN1cl9wa3QgPSBkbHRoaXMtPnRyYW1wLmR1cF9wa3RzOworCXdoaWxlICgocmV0X3ZhbCAhPSAwKSAmJiAoY3VyX3BrdCAhPSBOVUxMKSkgeworCQkvKiAgUmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIGxpc3QsIHdlJ2xsIGJlIGZyZWVpbmcgaXQKKwkJICogc2hvcnRseSAqLworCQlkbHRoaXMtPnRyYW1wLmR1cF9wa3RzID0gY3VyX3BrdC0+bmV4dDsKKworCQkvKiAgU2V0dXAgdGhlIHNlY3Rpb24gYW5kIGltYWdlIG9mZnNldCBmb3IgcmVsb2NhdGlvbiAqLworCQlkbHRoaXMtPmltYWdlX3NlY24gPSAmZGx0aGlzLT5sZHJfc2VjdGlvbnNbY3VyX3BrdC0+c2Vjbm5dOworCQlkbHRoaXMtPmltYWdlX29mZnNldCA9IGN1cl9wa3QtPm9mZnNldDsKKworCQkvKiAgSW4gb3JkZXIgdG8gZ2V0IHRoZSBkZWx0YSBydW4gYWRkcmVzcywgd2UgbmVlZCB0byByZWZlcmVuY2UKKwkJICogdGhlIG9yaWdpbmFsIHNlY3Rpb24gaGVhZGVyLiAgSXQncyBhIGJpdCB1Z2x5LCBidXQgbmVlZGVkCisJCSAqIGZvciByZWxvLiAqLworCQlpID0gKHMzMikgKGRsdGhpcy0+aW1hZ2Vfc2VjbiAtIGRsdGhpcy0+bGRyX3NlY3Rpb25zKTsKKwkJc2VjdF9oZHIgPSBkbHRoaXMtPnNlY3RfaGRycyArIGk7CisJCWRsdGhpcy0+ZGVsdGFfcnVuYWRkciA9IHNlY3RfaGRyLT5kc19wYWRkcjsKKworCQkvKiAgV2FsayBhbGwgcmVsb3MgaW4gdGhlIGNoYWluIGFuZCBwcm9jZXNzIGVhY2guICovCisJCWN1cl9yZWxvID0gY3VyX3BrdC0+cmVsb19jaGFpbjsKKwkJd2hpbGUgKGN1cl9yZWxvICE9IE5VTEwpIHsKKwkJCS8qICBQcm9jZXNzIHRoZW0gYSBjaHVuayBhdCBhIHRpbWUgdG8gYmUgZWZmaWNpZW50ICovCisJCQlmb3IgKGkgPSAwOyAoaSA8IE1BWF9SRUxPU19QRVJfUEFTUykKKwkJCSAgICAgJiYgKGN1cl9yZWxvICE9IE5VTEwpOworCQkJICAgICBpKyssIGN1cl9yZWxvID0gY3VyX3JlbG8tPm5leHQpIHsKKwkJCQlyZWxvc1tpXSA9ICZjdXJfcmVsby0+cmVsbzsKKwkJCQljdXJfcGt0LT5yZWxvX2NoYWluID0gY3VyX3JlbG8tPm5leHQ7CisJCQl9CisKKwkJCS8qICBEbyB0aGUgYWN0dWFsIHJlbG8gKi8KKwkJCXJldF92YWwgPSBwcml2X3BrdF9yZWxvKGRsdGhpcywKKwkJCQkJCWN1cl9wa3QtPmltZ19wa3QuaW1nX2RhdGEsCisJCQkJCQlyZWxvcywgaSk7CisJCQlpZiAocmV0X3ZhbCA9PSAwKSB7CisJCQkJZGxvYWRfZXJyb3IoZGx0aGlzLAorCQkJCQkgICAgIlJlbG9jYXRpb24gb2YgZHVwIHBrdCBhdCAleCIKKwkJCQkJICAgICIgZmFpbGVkIiwgY3VyX3BrdC0+b2Zmc2V0ICsKKwkJCQkJICAgIGRsdGhpcy0+aW1hZ2Vfc2Vjbi0+cnVuX2FkZHIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiAgUmVsZWFzZSBhbGwgb2YgdGhlc2UgcmVsb3MsIHdlJ3JlIGRvbmUgd2l0aCB0aGVtICovCisJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQlHRVRfQ09OVEFJTkVSCisJCQkJCQkocmVsb3NbaSAtIDFdLAorCQkJCQkJIHN0cnVjdCB0cmFtcF9pbWdfZHVwX3JlbG8sCisJCQkJCQkgcmVsbykpOworCQkJCWktLTsKKwkJCX0KKworCQkJLyogIERPIE5PVCBBRFZBTkNFIGN1cl9yZWxvLCBJVCBJUyBBTFJFQURZIFJFQURZIFRPCisJCQkgKiBHTyEgKi8KKwkJfQorCisJCS8qIERvbmUgd2l0aCBhbGwgcmVsb3MuICBNYWtlIHN1cmUgd2UgZGlkbid0IGhhdmUgYSBwcm9ibGVtIGFuZAorCQkgKiB3cml0ZSBpdCBvdXQgdG8gdGhlIHRhcmdldCAqLworCQlpZiAocmV0X3ZhbCAhPSAwKSB7CisJCQlyZXRfdmFsID0gZGx0aGlzLT5teWlvLT53cml0ZW1lbShkbHRoaXMtPm15aW8sCisJCQkJCQkJIGN1cl9wa3QtPmltZ19wa3QuCisJCQkJCQkJIGltZ19kYXRhLAorCQkJCQkJCSBkbHRoaXMtPmltYWdlX3NlY24tPgorCQkJCQkJCSBsb2FkX2FkZHIgKworCQkJCQkJCSBjdXJfcGt0LT5vZmZzZXQsCisJCQkJCQkJIGRsdGhpcy0+aW1hZ2Vfc2VjbiwKKwkJCQkJCQkgQllURV9UT19IT1NUCisJCQkJCQkJIChjdXJfcGt0LT5pbWdfcGt0LgorCQkJCQkJCSAgcGFja2V0X3NpemUpKTsKKwkJCWlmIChyZXRfdmFsID09IDApIHsKKwkJCQlkbG9hZF9lcnJvcihkbHRoaXMsCisJCQkJCSAgICAiV3JpdGUgdG8gIiBGTVRfVUkzMiAiIGZhaWxlZCIsCisJCQkJCSAgICBkbHRoaXMtPmltYWdlX3NlY24tPmxvYWRfYWRkciArCisJCQkJCSAgICBjdXJfcGt0LT5vZmZzZXQpOworCQkJfQorCisJCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sIGN1cl9wa3QpOworCisJCQkvKiAgQWR2YW5jZSB0byB0aGUgbmV4dCBwYWNrZXQgKi8KKwkJCWN1cl9wa3QgPSBkbHRoaXMtPnRyYW1wLmR1cF9wa3RzOworCQl9CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJcHJpdl9kdXBfZmluZAorICogRGVzY3JpcHRpb246IFdhbGsgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgZHVwbGljYXRlIHBhY2tldHMgYW5kIGZpbmQgYQorICoJICBtYXRjaCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBudW1iZXIgYW5kIGltYWdlIG9mZnNldC4gIFJldHVybgorICoJICB0aGUgZHVwbGljYXRlIHBhY2tldCBpZiBmb3VuZCwgb3RoZXJ3aXNlIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9wa3QgKnByaXZfZHVwX2ZpbmQoc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsCisJCQkJCSAgICAgICBzMTYgc2Vjbm4sIHUzMiBpbWFnZV9vZmZzZXQpCit7CisJc3RydWN0IHRyYW1wX2ltZ19kdXBfcGt0ICpjdXJfcGt0ID0gTlVMTDsKKworCWZvciAoY3VyX3BrdCA9IGRsdGhpcy0+dHJhbXAuZHVwX3BrdHM7CisJICAgICBjdXJfcGt0ICE9IE5VTEw7IGN1cl9wa3QgPSBjdXJfcGt0LT5uZXh0KSB7CisJCWlmICgoY3VyX3BrdC0+c2Vjbm4gPT0gc2Vjbm4pICYmCisJCSAgICAoY3VyX3BrdC0+b2Zmc2V0ID09IGltYWdlX29mZnNldCkpIHsKKwkJCS8qICBGb3VuZCBhIG1hdGNoLCBicmVhayBvdXQgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGN1cl9wa3Q7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJcHJpdl9pbWdfcGt0X2R1cAorICogRGVzY3JpcHRpb246IER1cGxpY2F0ZSB0aGUgb3JpZ2luYWwgaW1hZ2UgcGFja2V0LiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QKKyAqCSAgdGltZSB0aGlzIGltYWdlIHBhY2tldCBoYXMgYmVlbiBzZWVuIChiYXNlZCBvbiBzZWN0aW9uIG51bWJlcgorICoJICBhbmQgaW1hZ2Ugb2Zmc2V0KSwgY3JlYXRlIGEgbmV3IGR1cGxpY2F0ZSBwYWNrZXQgYW5kIGFkZCBpdAorICoJICB0byB0aGUgZHVwIHBhY2tldCBsaXN0LiAgSWYgbm90LCBqdXN0IGdldCB0aGUgZXhpc3Rpbmcgb25lIGFuZAorICoJICB1cGRhdGUgaXQgd2l0aCB0aGUgY3VycmVudCBwYWNrZXQgY29udGVudHMgKHNpbmNlIHJlbG9jYXRpb24KKyAqCSAgb24gdGhlIHBhY2tldCBpcyBzdGlsbCBvbmdvaW5nIGluIGZpcnN0IHBhc3MuKSAgQ3JlYXRlIGEKKyAqCSAgZHVwbGljYXRlIG9mIHRoZSBwcm92aWRlZCByZWxvY2F0aW9uLCBidXQgdXBkYXRlIGl0IHRvIHBvaW50CisgKgkgIHRvIHRoZSBuZXcgdHJhbXBvbGluZSBzeW1ib2wuICBBZGQgdGhlIG5ldyByZWxvY2F0aW9uIGR1cCB0bworICoJICB0aGUgZHVwIHBhY2tldCdzIHJlbG8gY2hhaW4gZm9yIDJuZCBwYXNzIHJlbG9jYXRpb24gbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgcHJpdl9pbWdfcGt0X2R1cChzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywKKwkJCSAgICBzMTYgc2Vjbm4sIHUzMiBpbWFnZV9vZmZzZXQsCisJCQkgICAgc3RydWN0IGltYWdlX3BhY2tldF90ICppcGFja2V0LAorCQkJICAgIHN0cnVjdCByZWxvY19yZWNvcmRfdCAqcnAsCisJCQkgICAgc3RydWN0IHRyYW1wX3N5bSAqbmV3X3RyYW1wX3N5bSkKK3sKKwlzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9wa3QgKmR1cF9wa3QgPSBOVUxMOworCXUzMiBuZXdfZHVwX3NpemU7CisJczMyIGk7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCB0cmFtcF9pbWdfZHVwX3JlbG8gKmR1cF9yZWxvID0gTlVMTDsKKworCS8qICBEZXRlcm1pbm5lIGlmIHRoaXMgaW1hZ2UgcGFja2V0IGlzIGFscmVhZHkgYmVpbmcgdHJhY2tlZCBpbiB0aGUKKwkgICBkdXAgbGlzdCBmb3Igb3RoZXIgdHJhbXBvbGluZXMuICovCisJZHVwX3BrdCA9IHByaXZfZHVwX2ZpbmQoZGx0aGlzLCBzZWNubiwgaW1hZ2Vfb2Zmc2V0KTsKKworCWlmIChkdXBfcGt0ID09IE5VTEwpIHsKKwkJLyogIFRoaXMgaW1hZ2UgcGFja2V0IGRvZXMgbm90IGV4aXN0IGluIG91ciB0cmFja2luZywgc28gY3JlYXRlCisJCSAqIGEgbmV3IG9uZSBhbmQgYWRkIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAqLworCQluZXdfZHVwX3NpemUgPSBzaXplb2Yoc3RydWN0IHRyYW1wX2ltZ19kdXBfcGt0KSArCisJCSAgICBpcGFja2V0LT5wYWNrZXRfc2l6ZTsKKworCQlkdXBfcGt0ID0gKHN0cnVjdCB0cmFtcF9pbWdfZHVwX3BrdCAqKQorCQkgICAgZGx0aGlzLT5teXN5bS0+ZGxvYWRfYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwgbmV3X2R1cF9zaXplKTsKKwkJaWYgKGR1cF9wa3QgIT0gTlVMTCkgeworCQkJLyogIFNhdmUgb2ZmIHRoZSBzZWN0aW9uIGFuZCBvZmZzZXQgaW5mb3JtYXRpb24gKi8KKwkJCWR1cF9wa3QtPnNlY25uID0gc2Vjbm47CisJCQlkdXBfcGt0LT5vZmZzZXQgPSBpbWFnZV9vZmZzZXQ7CisJCQlkdXBfcGt0LT5yZWxvX2NoYWluID0gTlVMTDsKKworCQkJLyogIENvcHkgdGhlIG9yaWdpbmFsIHBhY2tldCBjb250ZW50ICovCisJCQlkdXBfcGt0LT5pbWdfcGt0ID0gKmlwYWNrZXQ7CisJCQlkdXBfcGt0LT5pbWdfcGt0LmltZ19kYXRhID0gKHU4ICopIChkdXBfcGt0ICsgMSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgaXBhY2tldC0+cGFja2V0X3NpemU7IGkrKykKKwkJCQkqKGR1cF9wa3QtPmltZ19wa3QuaW1nX2RhdGEgKyBpKSA9CisJCQkJICAgICooaXBhY2tldC0+aW1nX2RhdGEgKyBpKTsKKworCQkJLyogIEFkZCB0aGUgcGFja2V0IHRvIHRoZSBkdXAgbGlzdCAqLworCQkJZHVwX3BrdC0+bmV4dCA9IGRsdGhpcy0+dHJhbXAuZHVwX3BrdHM7CisJCQlkbHRoaXMtPnRyYW1wLmR1cF9wa3RzID0gZHVwX3BrdDsKKwkJfSBlbHNlCisJCQlkbG9hZF9lcnJvcihkbHRoaXMsICJGYWlsZWQgdG8gY3JlYXRlIGR1cCBwYWNrZXQhIik7CisJfSBlbHNlIHsKKwkJLyogIFRoZSBpbWFnZSBwYWNrZXQgY29udGVudHMgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlCisJCSAqIHRyYW1wb2xpbmUgZGV0ZWN0aW9uIGhhcHBlbnMgZHVyaW5nIHJlbG9jYXRpb24gb2YgdGhlIGltYWdlCisJCSAqIHBhY2tldHMuICBTbywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGltYWdlIHBhY2tldCBjb250ZW50cworCQkgKiBiZWZvcmUgYWRkaW5nIHJlbG8gaW5mb3JtYXRpb24uICovCisJCWZvciAoaSA9IDA7IGkgPCBkdXBfcGt0LT5pbWdfcGt0LnBhY2tldF9zaXplOyBpKyspCisJCQkqKGR1cF9wa3QtPmltZ19wa3QuaW1nX2RhdGEgKyBpKSA9CisJCQkgICAgKihpcGFja2V0LT5pbWdfZGF0YSArIGkpOworCX0KKworCS8qICBTaW5jZSB0aGUgcHJldmlvdXMgY29kZSBtYXkgaGF2ZSBhbGxvY2F0ZWQgYSBuZXcgZHVwIHBhY2tldCBmb3IgdXMsCisJICAgZG91YmxlIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBvbmUuICovCisJaWYgKGR1cF9wa3QgIT0gTlVMTCkgeworCQkvKiAgQWxsb2NhdGUgYSBuZXcgbm9kZSBmb3IgdGhlIHJlbG8gY2hhaW4uICBFYWNoIGltYWdlIHBhY2tldAorCQkgKiBjYW4gcG90ZW50aWFsbHkgaGF2ZSBtdWx0aXBsZSByZWxvY2F0aW9ucyB0aGF0IGNhdXNlIGEKKwkJICogdHJhbXBvbGluZSB0byBiZSBnZW5lcmF0ZWQuICBTbywgd2Uga2VlcCB0aGVtIGluIGEgY2hhaW4sCisJCSAqIG9yZGVyIGlzIG5vdCBpbXBvcnRhbnQuICovCisJCWR1cF9yZWxvID0gZGx0aGlzLT5teXN5bS0+ZGxvYWRfYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9yZWxvKSk7CisJCWlmIChkdXBfcmVsbyAhPSBOVUxMKSB7CisJCQkvKiAgQ29weSB0aGUgcmVsbyBjb250ZW50cywgYWRqdXN0IGZvciB0aGUgbmV3CisJCQkgKiB0cmFtcG9saW5lIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3QuICovCisJCQlkdXBfcmVsby0+cmVsbyA9ICpycDsKKwkJCWR1cF9yZWxvLT5yZWxvLlNZTU5EWCA9IG5ld190cmFtcF9zeW0tPmluZGV4OworCisJCQlkdXBfcmVsby0+bmV4dCA9IGR1cF9wa3QtPnJlbG9fY2hhaW47CisJCQlkdXBfcGt0LT5yZWxvX2NoYWluID0gZHVwX3JlbG87CisKKwkJCS8qICBUaGF0J3MgaXQsIHdlJ3JlIGRvbmUuICBNYWtlIHN1cmUgd2UgdXBkYXRlIG91cgorCQkJICogcmV0dXJuIHZhbHVlIHRvIGJlIHN1Y2Nlc3Mgc2luY2UgZXZlcnl0aGluZyBmaW5pc2hlZAorCQkJICogb2sgKi8KKwkJCXJldF92YWwgPSAxOworCQl9IGVsc2UKKwkJCWRsb2FkX2Vycm9yKGRsdGhpcywgIlVuYWJsZSB0byBhbGxvYyBkdXAgcmVsbyIpOworCX0KKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CWRsb2FkX3RyYW1wX2F2YWlsCisgKiBEZXNjcmlwdGlvbjogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgYSB0cmFtcG9saW5lIGZvciB0aGlzIHR5cGUKKyAqCSAgb2YgcmVsb2NhdGlvbi4gIFJldHVybiB0cnVlIGlmIGl0IGRvZXMsIG90aGVyd2lzZSBmYWxzZS4KKyAqLworYm9vbCBkbG9hZF90cmFtcF9hdmFpbChzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgc3RydWN0IHJlbG9jX3JlY29yZF90ICpycCkKK3sKKwlib29sIHJldF92YWwgPSBmYWxzZTsKKwl1MTYgbWFwX2luZGV4OworCXUxNiBnZW5faW5kZXg7CisKKwkvKiAgQ2hlY2sgdHlwZSBoYXNoIHZzLiB0YXJnZXQgdHJhbXAgdGFibGUgKi8KKwltYXBfaW5kZXggPSBIQVNIX0ZVTkMocnAtPlRZUEUpOworCWdlbl9pbmRleCA9IHRyYW1wX21hcFttYXBfaW5kZXhdOworCWlmIChnZW5faW5kZXggIT0gVFJBTVBfTk9fR0VOX0FWQUlMKQorCQlyZXRfdmFsID0gdHJ1ZTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CWRsb2FkX3RyYW1wX2dlbmVyYXRlCisgKiBEZXNjcmlwdGlvbjogQ3JlYXRlIGEgbmV3IHRyYW1wb2xpbmUgZm9yIHRoZSBwcm92aWRlZCBpbWFnZSBwYWNrZXQgYW5kCisgKgkgIHJlbG9jYXRpb24gY2F1c2luZyBwcm9ibGVtcy4gIFRoaXMgd2lsbCBjcmVhdGUgdGhlIHRyYW1wb2xpbmUKKyAqCSAgYXMgd2VsbCBhcyBkdXBsaWNhdGUvdXBkYXRlIHRoZSBpbWFnZSBwYWNrZXQgYW5kIHJlbG9jYXRpb24KKyAqCSAgY2F1c2luZyB0aGUgcHJvYmxlbSwgd2hpY2ggd2lsbCBiZSByZWxvJ2QgYWdhaW4gZHVyaW5nCisgKgkgIGZpbmFsaXphdGlvbi4KKyAqLworaW50IGRsb2FkX3RyYW1wX2dlbmVyYXRlKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzLCBzMTYgc2Vjbm4sCisJCQkgdTMyIGltYWdlX29mZnNldCwgc3RydWN0IGltYWdlX3BhY2tldF90ICppcGFja2V0LAorCQkJIHN0cnVjdCByZWxvY19yZWNvcmRfdCAqcnApCit7CisJdTE2IG1hcF9pbmRleDsKKwl1MTYgZ2VuX2luZGV4OworCWludCByZXRfdmFsID0gMTsKKwljaGFyIHRyYW1wX3N5bV9zdHJbVFJBTVBfU1lNX1BSRUZJWF9MRU4gKyBUUkFNUF9TWU1fSEVYX0FTQ0lJX0xFTl07CisJc3RydWN0IGxvY2FsX3N5bWJvbCAqcmVmX3N5bTsKKwlzdHJ1Y3QgdHJhbXBfc3ltICpuZXdfdHJhbXBfc3ltOworCXN0cnVjdCB0cmFtcF9zeW0gKm5ld19leHRfc3ltOworCXN0cnVjdCB0cmFtcF9zdHJpbmcgKm5ld190cmFtcF9zdHI7CisJdTMyIG5ld190cmFtcF9iYXNlOworCXN0cnVjdCBsb2NhbF9zeW1ib2wgdG1wX3N5bTsKKwlzdHJ1Y3QgbG9jYWxfc3ltYm9sIGV4dF90bXBfc3ltOworCisJLyogIEhhc2ggdGhlIHJlbG8gdHlwZSB0byBnZXQgb3VyIGdlbmVyYXRvciBpbmZvcm1hdGlvbiAqLworCW1hcF9pbmRleCA9IEhBU0hfRlVOQyhycC0+VFlQRSk7CisJZ2VuX2luZGV4ID0gdHJhbXBfbWFwW21hcF9pbmRleF07CisJaWYgKGdlbl9pbmRleCAhPSBUUkFNUF9OT19HRU5fQVZBSUwpIHsKKwkJLyogIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRyYW1wb2xpbmUsIGNyZWF0ZSB0aGUgc2VjdGlvbiBuYW1lIGluCisJCSAqIG91ciBzdHJpbmcgdGFibGUgZm9yIGRlYnVnIGhlbHAgbGF0ZXIuICovCisJCWlmIChkbHRoaXMtPnRyYW1wLnN0cmluZ19oZWFkID09IE5VTEwpIHsKKwkJCXByaXZfdHJhbXBfc3RyaW5nX2NyZWF0ZShkbHRoaXMsCisJCQkJCQkgc3RybGVuKFRSQU1QX1NFQ1RfTkFNRSksCisJCQkJCQkgVFJBTVBfU0VDVF9OQU1FKTsKKwkJfQorI2lmZGVmIEVOQUJMRV9UUkFNUF9ERUJVRworCQlkbG9hZF9zeW1zX2Vycm9yKGRsdGhpcy0+bXlzeW0sCisJCQkJICJUcmFtcG9saW5lIGF0IGltZyBsb2MgJXgsIHJlZmVyZW5jZXMgJXgiLAorCQkJCSBkbHRoaXMtPmxkcl9zZWN0aW9uc1tzZWNubl0ucnVuX2FkZHIgKworCQkJCSBpbWFnZV9vZmZzZXQgKyBycC0+dmFkZHIsCisJCQkJIGRsdGhpcy0+bG9jYWxfc3ltdGFiW3JwLT5TWU1ORFhdLnZhbHVlKTsKKyNlbmRpZgorCisJCS8qICBHZW5lcmF0ZSB0aGUgdHJhbXBvbGluZSBzdHJpbmcsIGNoZWNrIGlmIGFscmVhZHkgZGVmaW5lZC4KKwkJICogSWYgdGhlIHJlbG8gc3ltYm9sIGluZGV4IGlzIC0xLCBpdCBtZWFucyB3ZSBuZWVkIHRoZSBzZWN0aW9uCisJCSAqIGluZm8gZm9yIHJlbG8gbGF0ZXIuICBUbyBkbyB0aGlzIHdlJ2xsIGR1bW15IHVwIGEgc3ltYm9sCisJCSAqIHdpdGggdGhlIHNlY3Rpb24gZGVsdGEgYW5kIHJ1biBhZGRyZXNzZXMuICovCisJCWlmIChycC0+U1lNTkRYID09IC0xKSB7CisJCQlleHRfdG1wX3N5bS52YWx1ZSA9CisJCQkgICAgZGx0aGlzLT5sZHJfc2VjdGlvbnNbc2Vjbm5dLnJ1bl9hZGRyOworCQkJZXh0X3RtcF9zeW0uZGVsdGEgPSBkbHRoaXMtPnNlY3RfaGRyc1tzZWNubl0uZHNfcGFkZHI7CisJCQlyZWZfc3ltID0gJmV4dF90bXBfc3ltOworCQl9IGVsc2UKKwkJCXJlZl9zeW0gPSAmKGRsdGhpcy0+bG9jYWxfc3ltdGFiW3JwLT5TWU1ORFhdKTsKKworCQlwcml2X3RyYW1wX3N5bV9nZW5fbmFtZShyZWZfc3ltLT52YWx1ZSwgdHJhbXBfc3ltX3N0cik7CisJCW5ld190cmFtcF9zeW0gPSBwcml2X3RyYW1wX3N5bV9maW5kKGRsdGhpcywgdHJhbXBfc3ltX3N0cik7CisJCWlmIChuZXdfdHJhbXBfc3ltID09IE5VTEwpIHsKKwkJCS8qICBJZiB0cmFtcCBzdHJpbmcgbm90IGRlZmluZWQsIGNyZWF0ZSBpdCBhbmQgYSBuZXcKKwkJCSAqIHN0cmluZywgYW5kIHN5bWJvbCBmb3IgaXQgYXMgd2VsbCBhcyB0aGUgb3JpZ2luYWwKKwkJCSAqIHN5bWJvbCB3aGljaCBjYXVzZWQgdGhlIHRyYW1wb2xpbmUuICovCisJCQluZXdfdHJhbXBfc3RyID0gcHJpdl90cmFtcF9zdHJpbmdfY3JlYXRlKGRsdGhpcywKKwkJCQkJCQkJc3RybGVuCisJCQkJCQkJCSh0cmFtcF9zeW1fc3RyKSwKKwkJCQkJCQkJIHRyYW1wX3N5bV9zdHIpOworCQkJaWYgKG5ld190cmFtcF9zdHIgPT0gTlVMTCkgeworCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywgIkZhaWxlZCB0byBjcmVhdGUgbmV3ICIKKwkJCQkJICAgICJ0cmFtcG9saW5lIHN0cmluZ1xuIik7CisJCQkJcmV0X3ZhbCA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qICBBbGxvY2F0ZSB0cmFtcCBzZWN0aW9uIHNwYWNlIGZvciB0aGUgbmV3CisJCQkJICogdHJhbXAgZnJvbSB0aGUgdGFyZ2V0ICovCisJCQkJbmV3X3RyYW1wX2Jhc2UgPSBwcml2X3RyYW1wX3NlY3RfYWxsb2MoZGx0aGlzLAorCQkJCQkJICAgICAgIHRyYW1wX3NpemVfZ2V0KCkpOworCisJCQkJLyogIFdlIGhhdmUgYSBzdHJpbmcsIGNyZWF0ZSB0aGUgbmV3IHN5bWJvbCBhbmQKKwkJCQkgKiBkdXBsaWNhdGUgdGhlIGV4dGVybmFsLiAqLworCQkJCXRtcF9zeW0udmFsdWUgPSBuZXdfdHJhbXBfYmFzZTsKKwkJCQl0bXBfc3ltLmRlbHRhID0gMDsKKwkJCQl0bXBfc3ltLnNlY25uID0gLTE7CisJCQkJdG1wX3N5bS5zY2xhc3MgPSAwOworCQkJCW5ld190cmFtcF9zeW0gPSBwcml2X3RyYW1wX3N5bV9jcmVhdGUoZGx0aGlzLAorCQkJCQkJCSAgICAgIG5ld190cmFtcF9zdHItPgorCQkJCQkJCSAgICAgIGluZGV4LAorCQkJCQkJCSAgICAgICZ0bXBfc3ltKTsKKworCQkJCW5ld19leHRfc3ltID0gcHJpdl90cmFtcF9zeW1fY3JlYXRlKGRsdGhpcywgLTEsCisJCQkJCQkJCSAgICByZWZfc3ltKTsKKworCQkJCWlmICgobmV3X3RyYW1wX3N5bSAhPSBOVUxMKSAmJgorCQkJCSAgICAobmV3X2V4dF9zeW0gIT0gTlVMTCkpIHsKKwkJCQkJLyogIENhbGwgdGhlIGltYWdlIGdlbmVyYXRvciB0byBnZXQgdGhlCisJCQkJCSAqIG5ldyBpbWFnZSBkYXRhIGFuZCBmaXggdXAgaXRzCisJCQkJCSAqIHJlbG9jYXRpb25zIGZvciB0aGUgZXh0ZXJuYWwKKwkJCQkJICogc3ltYm9sLiAqLworCQkJCQlyZXRfdmFsID0gcHJpdl90Z3RfaW1nX2dlbihkbHRoaXMsCisJCQkJCQkJCSBuZXdfdHJhbXBfYmFzZSwKKwkJCQkJCQkJIGdlbl9pbmRleCwKKwkJCQkJCQkJIG5ld19leHRfc3ltKTsKKworCQkJCQkvKiAgQWRkIGdlbmVyYXRlZCBpbWFnZSBkYXRhIHRvIHRyYW1wCisJCQkJCSAqIGltYWdlIGxpc3QgKi8KKwkJCQkJaWYgKHJldF92YWwgIT0gMSkgeworCQkJCQkJZGxvYWRfZXJyb3IoZGx0aGlzLCAiRmFpbGVkIHRvICIKKwkJCQkJCQkgICAgImNyZWF0ZSBpbWcgcGt0IGZvciIKKwkJCQkJCQkgICAgIiB0cmFtcG9saW5lXG4iKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywgIkZhaWxlZCB0byBjcmVhdGUgIgorCQkJCQkJICAgICJuZXcgdHJhbXAgc3ltcyAiCisJCQkJCQkgICAgIiglOC44WCwgJTguOFgpXG4iLAorCQkJCQkJICAgIG5ld190cmFtcF9zeW0sIG5ld19leHRfc3ltKTsKKwkJCQkJcmV0X3ZhbCA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogIER1cGxpY2F0ZSB0aGUgaW1hZ2UgZGF0YSBhbmQgcmVsbyByZWNvcmQgdGhhdCBjYXVzZWQgdGhlCisJCSAqIHRyYW1wLCBpbmNsdWRpbmcgdXBkYXRlIHRoZSByZWxvIGRhdGEgdG8gcG9pbnQgdG8gdGhlIHRyYW1wCisJCSAqIHN5bWJvbC4gKi8KKwkJaWYgKHJldF92YWwgPT0gMSkgeworCQkJcmV0X3ZhbCA9IHByaXZfaW1nX3BrdF9kdXAoZGx0aGlzLCBzZWNubiwgaW1hZ2Vfb2Zmc2V0LAorCQkJCQkJICAgaXBhY2tldCwgcnAsIG5ld190cmFtcF9zeW0pOworCQkJaWYgKHJldF92YWwgIT0gMSkgeworCQkJCWRsb2FkX2Vycm9yKGRsdGhpcywgIkZhaWxlZCB0byBjcmVhdGUgZHVwIG9mICIKKwkJCQkJICAgICJvcmlnaW5hbCBpbWcgcGt0XG4iKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRnVuY3Rpb246CWRsb2FkX3RyYW1wX3BrdF91cGRhdGUKKyAqIERlc2NyaXB0aW9uOiBVcGRhdGUgdGhlIGR1cGxpY2F0ZSBjb3B5IG9mIHRoaXMgaW1hZ2UgcGFja2V0LCB3aGljaCB0aGUKKyAqCSAgdHJhbXBvbGluZSBsYXllciBpcyBhbHJlYWR5IHRyYWNraW5nLiAgVGhpcyBpcyBjYWxsIGlzIGNyaXRpY2FsCisgKgkgIHRvIG1ha2UgaWYgdHJhbXBvbGluZXMgd2VyZSBnZW5lcmF0ZWQgYW55d2hlcmUgd2l0aGluIHRoZQorICoJICBwYWNrZXQgYW5kIGZpcnN0IHBhc3MgcmVsbyBjb250aW51ZWQgb24gdGhlIHJlbWFpbmRlci4gIFRoZQorICoJICB0cmFtcG9saW5lIGxheWVyIG5lZWRzIHRoZSB1cGRhdGVzIGltYWdlIGRhdGEgc28gd2hlbiAybmQKKyAqCSAgcGFzcyByZWxvIGlzIGRvbmUgZHVyaW5nIGZpbmFsaXplIHRoZSBpbWFnZSBwYWNrZXQgY2FuIGJlCisgKgkgIHdyaXR0ZW4gdG8gdGhlIHRhcmdldCBzaW5jZSBhbGwgcmVsbyBpcyBkb25lLgorICovCitpbnQgZGxvYWRfdHJhbXBfcGt0X3VkcGF0ZShzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgczE2IHNlY25uLAorCQkJICAgdTMyIGltYWdlX29mZnNldCwgc3RydWN0IGltYWdlX3BhY2tldF90ICppcGFja2V0KQoreworCXN0cnVjdCB0cmFtcF9pbWdfZHVwX3BrdCAqZHVwX3BrdCA9IE5VTEw7CisJczMyIGk7CisJaW50IHJldF92YWwgPSAwOworCisJLyogIEZpbmQgdGhlIGltYWdlIHBhY2tldCBpbiBxdWVzdGlvbiwgdGhlIGNhbGxlciBuZWVkcyB1cyB0byB1cGRhdGUgaXQKKwkgICBzaW5jZSBhIHRyYW1wb2xpbmUgd2FzIHByZXZpb3VzbHkgZ2VuZXJhdGVkLiAqLworCWR1cF9wa3QgPSBwcml2X2R1cF9maW5kKGRsdGhpcywgc2Vjbm4sIGltYWdlX29mZnNldCk7CisJaWYgKGR1cF9wa3QgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZHVwX3BrdC0+aW1nX3BrdC5wYWNrZXRfc2l6ZTsgaSsrKQorCQkJKihkdXBfcGt0LT5pbWdfcGt0LmltZ19kYXRhICsgaSkgPQorCQkJICAgICooaXBhY2tldC0+aW1nX2RhdGEgKyBpKTsKKworCQlyZXRfdmFsID0gMTsKKwl9IGVsc2UgeworCQlkbG9hZF9lcnJvcihkbHRoaXMsCisJCQkgICAgIlVuYWJsZSB0byBmaW5kIGV4aXN0aW5nIERVUCBwa3QgZm9yICV4LCBvZmZzZXQgJXgiLAorCQkJICAgIHNlY25uLCBpbWFnZV9vZmZzZXQpOworCisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJZGxvYWRfdHJhbXBfZmluYWxpemUKKyAqIERlc2NyaXB0aW9uOiBJZiBhbnkgdHJhbXBvbGluZXMgd2VyZSBjcmVhdGVkLCBmaW5hbGl6ZSBldmVyeXRoaW5nIG9uIHRoZQorICoJICB0YXJnZXQgYnkgYWxsb2NhdGluZyB0aGUgdHJhbXBvbGluZSBzZWN0aW9uIG9uIHRoZSB0YXJnZXQsCisgKgkgIGZpbmFsaXppbmcgdGhlIHRyYW1wb2xpbmUgc3ltYm9scywgZmluYWxpemluZyB0aGUgdHJhbXBvbGluZQorICoJICBwYWNrZXRzICh3cml0ZSB0aGUgbmV3IHNlY3Rpb24gdG8gdGFyZ2V0IG1lbW9yeSkgYW5kIGZpbmFsaXplCisgKgkgIHRoZSBkdXBsaWNhdGUgcGFja2V0cyBieSBkb2luZyAybmQgcGFzcyByZWxvIG92ZXIgdGhlbS4KKyAqLworaW50IGRsb2FkX3RyYW1wX2ZpbmFsaXplKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKQoreworCWludCByZXRfdmFsID0gMTsKKworCWlmIChkbHRoaXMtPnRyYW1wLnRyYW1wX3NlY3RfbmV4dF9hZGRyICE9IDApIHsKKwkJLyogIEZpbmFsaXplIHN0cmluZ3MgaW50byBhIGZsYXQgdGFibGUuICBUaGlzIGlzIG5lZWRlZCBzbyBpdAorCQkgKiBjYW4gYmUgYWRkZWQgdG8gdGhlIGRlYnVnIHN0cmluZyB0YWJsZSBsYXRlci4gKi8KKwkJcmV0X3ZhbCA9IHByaXZfc3RyaW5nX3RibF9maW5hbGl6ZShkbHRoaXMpOworCisJCS8qICBEbyB0YXJnZXQgYWxsb2NhdGlvbiBmb3Igc2VjdGlvbiBCRUZPUkUgZmluYWxpemluZworCQkgKiBzeW1ib2xzLiAqLworCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJcmV0X3ZhbCA9IHByaXZfdHJhbXBfc2VjdF90Z3RfYWxsb2MoZGx0aGlzKTsKKworCQkvKiAgRmluYWxpemUgc3ltYm9scyB3aXRoIHRoZWlyIGNvcnJlY3QgdGFyZ2V0IGluZm9ybWF0aW9uIGFuZAorCQkgKiBmbGF0dGVuICovCisJCWlmIChyZXRfdmFsICE9IDApCisJCQlyZXRfdmFsID0gcHJpdl90cmFtcF9zeW1fZmluYWxpemUoZGx0aGlzKTsKKworCQkvKiAgRmluYWxpemUgYWxsIHRyYW1wb2xpbmUgcGFja2V0cy4gIFRoaXMgcGVyZm9ybXMgdGhlCisJCSAqIHJlbG9jYXRpb24gb24gdGhlIHBhY2tldHMgYXMgd2VsbCBhcyB3cml0aW5nIHRoZW0gdG8gdGFyZ2V0CisJCSAqIG1lbW9yeS4gKi8KKwkJaWYgKHJldF92YWwgIT0gMCkKKwkJCXJldF92YWwgPSBwcml2X3RyYW1wX3BrdF9maW5hbGl6ZShkbHRoaXMpOworCisJCS8qICBQZXJmb3JtIGEgMm5kIHBhc3MgcmVsb2NhdGlvbiBvbiB0aGUgZHVwIGxpc3QuICovCisJCWlmIChyZXRfdmFsICE9IDApCisJCQlyZXRfdmFsID0gcHJpdl9kdXBfcGt0X2ZpbmFsaXplKGRsdGhpcyk7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJZGxvYWRfdHJhbXBfY2xlYW51cAorICogRGVzY3JpcHRpb246IFJlbGVhc2UgYWxsIHRlbXBvcmFyeSByZXNvdXJjZXMgdXNlZCBpbiB0aGUgdHJhbXBvbGluZSBsYXllci4KKyAqCSAgTm90ZSB0aGF0IHRoZSB0YXJnZXQgbWVtb3J5IHdoaWNoIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZAorICoJICB3cml0dGVuIHRvIHN0b3JlIHRoZSB0cmFtcG9saW5lcyBpcyBOT1QgUkVMRUFTRUQgSEVSRSBzaW5jZSBpdAorICoJICBpcyBwb3RlbnRpYWxseSBzdGlsbCBpbiB1c2UuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHJlbGVhc2VkCisgKgkgIHdoZW4gdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4KKyAqLwordm9pZCBkbG9hZF90cmFtcF9jbGVhbnVwKHN0cnVjdCBkbG9hZF9zdGF0ZSAqZGx0aGlzKQoreworCXN0cnVjdCB0cmFtcF9pbmZvICp0cmFtcCA9ICZkbHRoaXMtPnRyYW1wOworCXN0cnVjdCB0cmFtcF9zeW0gKmN1cl9zeW07CisJc3RydWN0IHRyYW1wX3N0cmluZyAqY3VyX3N0cmluZzsKKwlzdHJ1Y3QgdHJhbXBfaW1nX3BrdCAqY3VyX3RyYW1wX3BrdDsKKwlzdHJ1Y3QgdHJhbXBfaW1nX2R1cF9wa3QgKmN1cl9kdXBfcGt0OworCXN0cnVjdCB0cmFtcF9pbWdfZHVwX3JlbG8gKmN1cl9kdXBfcmVsbzsKKworCS8qICBJZiB0aGVyZSB3ZXJlIG5vIHRyYW1wcyBnZW5lcmF0ZWQsIGp1c3QgcmV0dXJuICovCisJaWYgKHRyYW1wLT50cmFtcF9zZWN0X25leHRfYWRkciA9PSAwKQorCQlyZXR1cm47CisKKwkvKiAgRGVzdHJveSBhbGwgdHJhbXAgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGN1cl9zeW0gPSB0cmFtcC0+c3ltYm9sX2hlYWQ7CisJICAgICBjdXJfc3ltICE9IE5VTEw7IGN1cl9zeW0gPSB0cmFtcC0+c3ltYm9sX2hlYWQpIHsKKwkJdHJhbXAtPnN5bWJvbF9oZWFkID0gY3VyX3N5bS0+bmV4dDsKKwkJaWYgKHRyYW1wLT5zeW1ib2xfdGFpbCA9PSBjdXJfc3ltKQorCQkJdHJhbXAtPnN5bWJvbF90YWlsID0gTlVMTDsKKworCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sIGN1cl9zeW0pOworCX0KKworCWlmICh0cmFtcC0+ZmluYWxfc3ltX3RhYmxlICE9IE5VTEwpCisJCWRsdGhpcy0+bXlzeW0tPmRsb2FkX2RlYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJCXRyYW1wLT5maW5hbF9zeW1fdGFibGUpOworCisJZm9yIChjdXJfc3RyaW5nID0gdHJhbXAtPnN0cmluZ19oZWFkOworCSAgICAgY3VyX3N0cmluZyAhPSBOVUxMOyBjdXJfc3RyaW5nID0gdHJhbXAtPnN0cmluZ19oZWFkKSB7CisJCXRyYW1wLT5zdHJpbmdfaGVhZCA9IGN1cl9zdHJpbmctPm5leHQ7CisJCWlmICh0cmFtcC0+c3RyaW5nX3RhaWwgPT0gY3VyX3N0cmluZykKKwkJCXRyYW1wLT5zdHJpbmdfdGFpbCA9IE5VTEw7CisKKwkJZGx0aGlzLT5teXN5bS0+ZGxvYWRfZGVhbGxvY2F0ZShkbHRoaXMtPm15c3ltLCBjdXJfc3RyaW5nKTsKKwl9CisKKwlpZiAodHJhbXAtPmZpbmFsX3N0cmluZ190YWJsZSAhPSBOVUxMKQorCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sCisJCQkJCQl0cmFtcC0+ZmluYWxfc3RyaW5nX3RhYmxlKTsKKworCWZvciAoY3VyX3RyYW1wX3BrdCA9IHRyYW1wLT50cmFtcF9wa3RzOworCSAgICAgY3VyX3RyYW1wX3BrdCAhPSBOVUxMOyBjdXJfdHJhbXBfcGt0ID0gdHJhbXAtPnRyYW1wX3BrdHMpIHsKKwkJdHJhbXAtPnRyYW1wX3BrdHMgPSBjdXJfdHJhbXBfcGt0LT5uZXh0OworCQlkbHRoaXMtPm15c3ltLT5kbG9hZF9kZWFsbG9jYXRlKGRsdGhpcy0+bXlzeW0sIGN1cl90cmFtcF9wa3QpOworCX0KKworCWZvciAoY3VyX2R1cF9wa3QgPSB0cmFtcC0+ZHVwX3BrdHM7CisJICAgICBjdXJfZHVwX3BrdCAhPSBOVUxMOyBjdXJfZHVwX3BrdCA9IHRyYW1wLT5kdXBfcGt0cykgeworCQl0cmFtcC0+ZHVwX3BrdHMgPSBjdXJfZHVwX3BrdC0+bmV4dDsKKworCQlmb3IgKGN1cl9kdXBfcmVsbyA9IGN1cl9kdXBfcGt0LT5yZWxvX2NoYWluOworCQkgICAgIGN1cl9kdXBfcmVsbyAhPSBOVUxMOworCQkgICAgIGN1cl9kdXBfcmVsbyA9IGN1cl9kdXBfcGt0LT5yZWxvX2NoYWluKSB7CisJCQljdXJfZHVwX3BrdC0+cmVsb19jaGFpbiA9IGN1cl9kdXBfcmVsby0+bmV4dDsKKwkJCWRsdGhpcy0+bXlzeW0tPmRsb2FkX2RlYWxsb2NhdGUoZGx0aGlzLT5teXN5bSwKKwkJCQkJCQljdXJfZHVwX3JlbG8pOworCQl9CisKKwkJZGx0aGlzLT5teXN5bS0+ZGxvYWRfZGVhbGxvY2F0ZShkbHRoaXMtPm15c3ltLCBjdXJfZHVwX3BrdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvdHJhbXBfdGFibGVfYzYwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wX3RhYmxlX2M2MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljYzY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wX3RhYmxlX2M2MDAwLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiB0cmFtcF90YWJsZV9jNjAwMC5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlICJkbG9hZF9pbnRlcm5hbC5oIgorCisvKiAgVGhlc2UgYXJlIGRlZmluZWQgaW4gY29mZi5oLCBidXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcworCXNvIHdlJ2xsIGdvIGFoZWFkIGFuZCBkZWZpbmUgdGhlbSBoZXJlLiAqLworI2lmbmRlZiBSX0M2MExPMTYKKyNkZWZpbmUgUl9DNjBMTzE2CSAgMHg1NAkvKiBDNjA6IE1WSyBMb3cgSGFsZiBSZWdpc3RlciAqLworI2RlZmluZSBSX0M2MEhJMTYJICAweDU1CS8qIEM2MDogTVZLSC9NVktMSCBIaWdoIEhhbGYgUmVnaXN0ZXIgKi8KKyNlbmRpZgorCisjZGVmaW5lIEM2WF9UUkFNUF9XT1JEX0NPVU5UCQkJOAorI2RlZmluZSBDNlhfVFJBTVBfTUFYX1JFTE9TCQkJIDgKKworLyogIFRISVMgSEFTSCBGVU5DVElPTiBNVVNUIE1BVENIIFRIRSBPTkUgcmVsb2NfdGFibGVfYzYwMDAuYyAqLworI2RlZmluZSBIQVNIX0ZVTkMoenopICgoKCgoenopICsgMSkgKiAxODQ1VUwpID4+IDExKSAmIDYzKQorCisvKiAgVEhJUyBNVVNUIE1BVENIIHJlbG9jX3JlY29yZF90IEZPUiBBIFNZTUJPTCBCQVNFRCBSRUxPICovCitzdHJ1Y3QgYzYwMDBfcmVsb19yZWNvcmQgeworCXMzMiB2YWRkcjsKKwlzMzIgc3ltbmR4OworI2lmbmRlZiBfQklHX0VORElBTgorCXUxNiBkaXNwOworCXUxNiB0eXBlOworI2Vsc2UKKwl1MTYgdHlwZTsKKwl1MTYgZGlzcDsKKyNlbmRpZgorfTsKKworc3RydWN0IGM2MDAwX2dlbl9jb2RlIHsKKwlzdHJ1Y3QgdHJhbXBfZ2VuX2NvZGVfaGRyIGhkcjsKKwl1MzIgdHJhbXBfaW5zdHJzW0M2WF9UUkFNUF9XT1JEX0NPVU5UXTsKKwlzdHJ1Y3QgYzYwMDBfcmVsb19yZWNvcmQgcmVsb3NbQzZYX1RSQU1QX01BWF9SRUxPU107Cit9OworCisvKiAgSGFzaCBtYXBwaW5nIGZvciByZWxvcyB0aGF0IGNhbiBjYXVzZSB0cmFtcG9saW5lcy4gKi8KK3N0YXRpYyBjb25zdCB1MTYgdHJhbXBfbWFwW10gPSB7CisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJNjU1MzUsCisJMCwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNSwKKwk2NTUzNQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjNjAwMF9nZW5fY29kZSB0cmFtcF9nZW5faW5mb1tdID0geworCS8qICBUcmFtcCBjYXVzZWQgYnkgUl9DNjBQQ1IyMSAqLworCXsKKwkgLyogIEhlYWRlciAtIDggaW5zdHJ1Y3Rpb25zLCAyIHJlbG9zICovCisJIHsKKwkgIHNpemVvZih1MzIpICogQzZYX1RSQU1QX1dPUkRfQ09VTlQsCisJICAyLAorCSAgRklFTERfT0ZGU0VUKHN0cnVjdCBjNjAwMF9nZW5fY29kZSwgcmVsb3MpCisJICB9LAorCisJIC8qICBUcmFtcG9saW5lIGluc3RydWN0aW9ucyAqLworCSB7CisJICAweDA1M0M1NEY3LAkJLyogICAgICAgU1RXLkQyVDIgIEIxMCwgKnNwLS1bMl0gKi8KKwkgIDB4MDUwMDAwMkEsCQkvKiAgfHwgTVZLLlMyICAgPGJsYW5rPiwgQjEwICovCisJICAweDA1MDAwMDZBLAkJLyogICAgICAgTVZLSC5TMiAgIDxibGFuaz4sIEIxMCAqLworCSAgMHgwMDI4MDM2MiwJCS8qICAgICAgIEIuUzIgICAgIEIxMCAqLworCSAgMHgwNTNDNTJFNiwJCS8qICAgICAgIExEVy5EMlQyICAqKytzcFsyXSwgQjEwICovCisJICAweDAwMDA2MDAwLAkJLyogICAgICAgTk9QICAgICAgIDQgKi8KKwkgIDB4MDAwMDAwMDAsCQkvKiAgICAgICBOT1AgKi8KKwkgIDB4MDAwMDAwMDAJCS8qICAgICAgIE5PUCAqLworCSAgfSwKKworCSAvKiAgUmVsb2NhdGlvbnMgKi8KKwkgeworCSAgezQsIDAsIDAsIFJfQzYwTE8xNn0sCisJICB7OCwgMCwgMCwgUl9DNjBISTE2fSwKKwkgIHswLCAwLCAwLCAweDAwMDB9LAorCSAgezAsIDAsIDAsIDB4MDAwMH0sCisJICB7MCwgMCwgMCwgMHgwMDAwfSwKKwkgIHswLCAwLCAwLCAweDAwMDB9LAorCSAgezAsIDAsIDAsIDB4MDAwMH0sCisJICB7MCwgMCwgMCwgMHgwMDAwfQorCSAgfQorCSB9Cit9OworCisvKiAgVEFSR0VUIFNQRUNJRklDIEZVTkNUSU9OUyBUSEFUIE1VU1QgQkUgREVGSU5FRCAqLworc3RhdGljIHUzMiB0cmFtcF9zaXplX2dldCh2b2lkKQoreworCXJldHVybiBzaXplb2YodTMyKSAqIEM2WF9UUkFNUF9XT1JEX0NPVU5UOworfQorCitzdGF0aWMgdTMyIHRyYW1wX2ltZ19wa3Rfc2l6ZV9nZXQodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBjNjAwMF9nZW5fY29kZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZ2VuL2diLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZ2VuL2diLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlYjNkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9nZW4vZ2IuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIGdiLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogR2VuZXJpYyBiaXRtYXAgb3BlcmF0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZ3MuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZ2IuaD4KKworc3RydWN0IGdiX3RfbWFwIHsKKwl1MzIgbGVuOworCXUzMiB3Y250OworCXUzMiAqd29yZHM7Cit9OworCisvKgorICogID09PT09PT09IGdiX2NsZWFyID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgQ2xlYXJzIGEgYml0IGluIHRoZSBiaXQgbWFwLgorICovCisKK3ZvaWQgZ2JfY2xlYXIoc3RydWN0IGdiX3RfbWFwICptYXAsIHUzMiBiaXRuKQoreworCXUzMiBtYXNrOworCisJbWFzayA9IDFMIDw8IChiaXRuICUgQklUU19QRVJfTE9ORyk7CisJbWFwLT53b3Jkc1tiaXRuIC8gQklUU19QRVJfTE9OR10gJj0gfm1hc2s7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2JfY3JlYXRlID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgQ3JlYXRlcyBhIGJpdCBtYXAuCisgKi8KKworc3RydWN0IGdiX3RfbWFwICpnYl9jcmVhdGUodTMyIGxlbikKK3sKKwlzdHJ1Y3QgZ2JfdF9tYXAgKm1hcDsKKwl1MzIgaTsKKwltYXAgPSAoc3RydWN0IGdiX3RfbWFwICopZ3NfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnYl90X21hcCkpOworCWlmIChtYXAgIT0gTlVMTCkgeworCQltYXAtPmxlbiA9IGxlbjsKKwkJbWFwLT53Y250ID0gbGVuIC8gQklUU19QRVJfTE9ORyArIDE7CisJCW1hcC0+d29yZHMgPSAodTMyICopIGdzX2FsbG9jKG1hcC0+d2NudCAqIHNpemVvZih1MzIpKTsKKwkJaWYgKG1hcC0+d29yZHMgIT0gTlVMTCkgeworCQkJZm9yIChpID0gMDsgaSA8IG1hcC0+d2NudDsgaSsrKQorCQkJCW1hcC0+d29yZHNbaV0gPSAwTDsKKworCQl9IGVsc2UgeworCQkJZ3NfZnJlZXMobWFwLCBzaXplb2Yoc3RydWN0IGdiX3RfbWFwKSk7CisJCQltYXAgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIG1hcDsKK30KKworLyoKKyAqICA9PT09PT09PSBnYl9kZWxldGUgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBGcmVlcyBhIGJpdCBtYXAuCisgKi8KKwordm9pZCBnYl9kZWxldGUoc3RydWN0IGdiX3RfbWFwICptYXApCit7CisJZ3NfZnJlZXMobWFwLT53b3JkcywgbWFwLT53Y250ICogc2l6ZW9mKHUzMikpOworCWdzX2ZyZWVzKG1hcCwgc2l6ZW9mKHN0cnVjdCBnYl90X21hcCkpOworfQorCisvKgorICogID09PT09PT09IGdiX2ZpbmRhbmRzZXQgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBGaW5kcyBhIGZyZWUgYml0IGFuZCBzZXRzIGl0LgorICovCit1MzIgZ2JfZmluZGFuZHNldChzdHJ1Y3QgZ2JfdF9tYXAgKm1hcCkKK3sKKwl1MzIgYml0bjsKKworCWJpdG4gPSBnYl9taW5jbGVhcihtYXApOworCisJaWYgKGJpdG4gIT0gR0JfTk9CSVRTKQorCQlnYl9zZXQobWFwLCBiaXRuKTsKKworCXJldHVybiBiaXRuOworfQorCisvKgorICogID09PT09PT09IGdiX21pbmNsZWFyID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgcmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHVuc2V0IGJpdCBpbiB0aGUgYml0IG1hcC4KKyAqLwordTMyIGdiX21pbmNsZWFyKHN0cnVjdCBnYl90X21hcCAqbWFwKQoreworCXUzMiBiaXRfbG9jYXRpb24gPSAwOworCXUzMiBiaXRfYWNjID0gMDsKKwl1MzIgaTsKKwl1MzIgYml0OworCXUzMiAqd29yZDsKKworCWZvciAod29yZCA9IG1hcC0+d29yZHMsIGkgPSAwOyBpIDwgbWFwLT53Y250OyB3b3JkKyssIGkrKykgeworCQlpZiAofip3b3JkKSB7CisJCQlmb3IgKGJpdCA9IDA7IGJpdCA8IEJJVFNfUEVSX0xPTkc7IGJpdCsrLCBiaXRfYWNjKyspIHsKKwkJCQlpZiAoYml0X2FjYyA9PSBtYXAtPmxlbikKKwkJCQkJcmV0dXJuIEdCX05PQklUUzsKKworCQkJCWlmICh+KndvcmQgJiAoMUwgPDwgYml0KSkgeworCQkJCQliaXRfbG9jYXRpb24gPSBpICogQklUU19QRVJfTE9ORyArIGJpdDsKKwkJCQkJcmV0dXJuIGJpdF9sb2NhdGlvbjsKKwkJCQl9CisKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJpdF9hY2MgKz0gQklUU19QRVJfTE9ORzsKKwkJfQorCX0KKworCXJldHVybiBHQl9OT0JJVFM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2Jfc2V0ID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgU2V0cyBhIGJpdCBpbiB0aGUgYml0IG1hcC4KKyAqLworCit2b2lkIGdiX3NldChzdHJ1Y3QgZ2JfdF9tYXAgKm1hcCwgdTMyIGJpdG4pCit7CisJdTMyIG1hc2s7CisKKwltYXNrID0gMUwgPDwgKGJpdG4gJSBCSVRTX1BFUl9MT05HKTsKKwltYXAtPndvcmRzW2JpdG4gLyBCSVRTX1BFUl9MT05HXSB8PSBtYXNrOworfQorCisvKgorICogID09PT09PT09IGdiX3Rlc3QgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGJpdCBpcyBzZXQgaW4gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAqLworCitib29sIGdiX3Rlc3Qoc3RydWN0IGdiX3RfbWFwICptYXAsIHUzMiBiaXRuKQoreworCWJvb2wgc3RhdGU7CisJdTMyIG1hc2s7CisJdTMyIHdvcmQ7CisKKwltYXNrID0gMUwgPDwgKGJpdG4gJSBCSVRTX1BFUl9MT05HKTsKKwl3b3JkID0gbWFwLT53b3Jkc1tiaXRuIC8gQklUU19QRVJfTE9OR107CisJc3RhdGUgPSB3b3JkICYgbWFzayA/IHRydWUgOiBmYWxzZTsKKworCXJldHVybiBzdGF0ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9nZW4vZ2guYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9nZW4vZ2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJkOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2dlbi9naC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogZ2guYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZ3MuaD4KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9naC5oPgorCitzdHJ1Y3QgZWxlbWVudCB7CisJc3RydWN0IGVsZW1lbnQgKm5leHQ7CisJdTggZGF0YVsxXTsKK307CisKK3N0cnVjdCBnaF90X2hhc2hfdGFiIHsKKwl1MTYgbWF4X2J1Y2tldDsKKwl1MTYgdmFsX3NpemU7CisJc3RydWN0IGVsZW1lbnQgKipidWNrZXRzOworCSB1MTYoKmhhc2gpICh2b2lkICosIHUxNik7CisJIGJvb2woKm1hdGNoKSAodm9pZCAqLCB2b2lkICopOworCXZvaWQgKCpkZWxldGUpICh2b2lkICopOworfTsKKworc3RhdGljIHZvaWQgbm9vcCh2b2lkICpwKTsKK3N0YXRpYyBzMzIgY3VyX2luaXQ7CitzdGF0aWMgdm9pZCBteWZyZWUodm9pZCAqcHRyLCBzMzIgc2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gZ2hfY3JlYXRlID09PT09PT09CisgKi8KKworc3RydWN0IGdoX3RfaGFzaF90YWIgKmdoX2NyZWF0ZSh1MTYgbWF4X2J1Y2tldCwgdTE2IHZhbF9zaXplLAorCQkJCXUxNigqaGFzaCkgKHZvaWQgKiwgdTE2KSwgYm9vbCgqbWF0Y2gpICh2b2lkICosCisJCQkJCQkJCQl2b2lkICopLAorCQkJCXZvaWQgKCpkZWxldGUpICh2b2lkICopKQoreworCXN0cnVjdCBnaF90X2hhc2hfdGFiICpoYXNoX3RhYjsKKwl1MTYgaTsKKwloYXNoX3RhYiA9CisJICAgIChzdHJ1Y3QgZ2hfdF9oYXNoX3RhYiAqKWdzX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ2hfdF9oYXNoX3RhYikpOworCWlmIChoYXNoX3RhYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwloYXNoX3RhYi0+bWF4X2J1Y2tldCA9IG1heF9idWNrZXQ7CisJaGFzaF90YWItPnZhbF9zaXplID0gdmFsX3NpemU7CisJaGFzaF90YWItPmhhc2ggPSBoYXNoOworCWhhc2hfdGFiLT5tYXRjaCA9IG1hdGNoOworCWhhc2hfdGFiLT5kZWxldGUgPSBkZWxldGUgPT0gTlVMTCA/IG5vb3AgOiBkZWxldGU7CisKKwloYXNoX3RhYi0+YnVja2V0cyA9IChzdHJ1Y3QgZWxlbWVudCAqKikKKwkgICAgZ3NfYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGVtZW50ICopICogbWF4X2J1Y2tldCk7CisJaWYgKGhhc2hfdGFiLT5idWNrZXRzID09IE5VTEwpIHsKKwkJZ2hfZGVsZXRlKGhhc2hfdGFiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1heF9idWNrZXQ7IGkrKykKKwkJaGFzaF90YWItPmJ1Y2tldHNbaV0gPSBOVUxMOworCisJcmV0dXJuIGhhc2hfdGFiOworfQorCisvKgorICogID09PT09PT09IGdoX2RlbGV0ZSA9PT09PT09PQorICovCit2b2lkIGdoX2RlbGV0ZShzdHJ1Y3QgZ2hfdF9oYXNoX3RhYiAqaGFzaF90YWIpCit7CisJc3RydWN0IGVsZW1lbnQgKmVsZW0sICpuZXh0OworCXUxNiBpOworCisJaWYgKGhhc2hfdGFiICE9IE5VTEwpIHsKKwkJaWYgKGhhc2hfdGFiLT5idWNrZXRzICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBoYXNoX3RhYi0+bWF4X2J1Y2tldDsgaSsrKSB7CisJCQkJZm9yIChlbGVtID0gaGFzaF90YWItPmJ1Y2tldHNbaV07IGVsZW0gIT0gTlVMTDsKKwkJCQkgICAgIGVsZW0gPSBuZXh0KSB7CisJCQkJCW5leHQgPSBlbGVtLT5uZXh0OworCQkJCQkoKmhhc2hfdGFiLT5kZWxldGUpIChlbGVtLT5kYXRhKTsKKwkJCQkJbXlmcmVlKGVsZW0sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGVsZW1lbnQpIC0gMSArCisJCQkJCSAgICAgICBoYXNoX3RhYi0+dmFsX3NpemUpOworCQkJCX0KKwkJCX0KKworCQkJbXlmcmVlKGhhc2hfdGFiLT5idWNrZXRzLCBzaXplb2Yoc3RydWN0IGVsZW1lbnQgKikKKwkJCSAgICAgICAqIGhhc2hfdGFiLT5tYXhfYnVja2V0KTsKKwkJfQorCisJCW15ZnJlZShoYXNoX3RhYiwgc2l6ZW9mKHN0cnVjdCBnaF90X2hhc2hfdGFiKSk7CisJfQorfQorCisvKgorICogID09PT09PT09IGdoX2V4aXQgPT09PT09PT0KKyAqLworCit2b2lkIGdoX2V4aXQodm9pZCkKK3sKKwlpZiAoY3VyX2luaXQtLSA9PSAxKQorCQlnc19leGl0KCk7CisKK30KKworLyoKKyAqICA9PT09PT09PSBnaF9maW5kID09PT09PT09CisgKi8KKwordm9pZCAqZ2hfZmluZChzdHJ1Y3QgZ2hfdF9oYXNoX3RhYiAqaGFzaF90YWIsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3QgZWxlbWVudCAqZWxlbTsKKworCWVsZW0gPSBoYXNoX3RhYi0+YnVja2V0c1soKmhhc2hfdGFiLT5oYXNoKSAoa2V5LCBoYXNoX3RhYi0+bWF4X2J1Y2tldCldOworCisJZm9yICg7IGVsZW07IGVsZW0gPSBlbGVtLT5uZXh0KSB7CisJCWlmICgoKmhhc2hfdGFiLT5tYXRjaCkgKGtleSwgZWxlbS0+ZGF0YSkpCisJCQlyZXR1cm4gZWxlbS0+ZGF0YTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqICA9PT09PT09PSBnaF9pbml0ID09PT09PT09CisgKi8KKwordm9pZCBnaF9pbml0KHZvaWQpCit7CisJaWYgKGN1cl9pbml0KysgPT0gMCkKKwkJZ3NfaW5pdCgpOworfQorCisvKgorICogID09PT09PT09IGdoX2luc2VydCA9PT09PT09PQorICovCisKK3ZvaWQgKmdoX2luc2VydChzdHJ1Y3QgZ2hfdF9oYXNoX3RhYiAqaGFzaF90YWIsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUpCit7CisJc3RydWN0IGVsZW1lbnQgKmVsZW07CisJdTE2IGk7CisJY2hhciAqc3JjLCAqZHN0OworCisJZWxlbSA9IChzdHJ1Y3QgZWxlbWVudCAqKWdzX2FsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudCkgLSAxICsKKwkJCQkJICBoYXNoX3RhYi0+dmFsX3NpemUpOworCWlmIChlbGVtICE9IE5VTEwpIHsKKworCQlkc3QgPSAoY2hhciAqKWVsZW0tPmRhdGE7CisJCXNyYyA9IChjaGFyICopdmFsdWU7CisJCWZvciAoaSA9IDA7IGkgPCBoYXNoX3RhYi0+dmFsX3NpemU7IGkrKykKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKworCQlpID0gKCpoYXNoX3RhYi0+aGFzaCkgKGtleSwgaGFzaF90YWItPm1heF9idWNrZXQpOworCQllbGVtLT5uZXh0ID0gaGFzaF90YWItPmJ1Y2tldHNbaV07CisJCWhhc2hfdGFiLT5idWNrZXRzW2ldID0gZWxlbTsKKworCQlyZXR1cm4gZWxlbS0+ZGF0YTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqICA9PT09PT09PSBub29wID09PT09PT09CisgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBub29wKHZvaWQgKnApCit7CisJcCA9IHA7CQkJLyogc3RpZmxlIGNvbXBpbGVyIHdhcm5pbmcgKi8KK30KKworLyoKKyAqICA9PT09PT09PSBteWZyZWUgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgbXlmcmVlKHZvaWQgKnB0ciwgczMyIHNpemUpCit7CisJZ3NfZnJlZShwdHIpOworfQorCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0JBQ0tUUkFDRQorLyoqCisgKiBnaF9pdGVyYXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBoYXNoIHRhYmxlCisgKgkJbG9va2luZyBmb3IgdGhlIGRzcCBzeW1ib2xzLgorICogQGhhc2hfdGFiOglIYXNoIHRhYmxlCisgKiBAY2FsbGJhY2s6CXBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEB1c2VyX2RhdGE6CVVzZXIgZGF0YSwgY29udGFpbnMgdGhlIGZpbmRfc3ltYm9sX2NvbnRleHQgcG9pbnRlcgorICoKKyAqLwordm9pZCBnaF9pdGVyYXRlKHN0cnVjdCBnaF90X2hhc2hfdGFiICpoYXNoX3RhYiwKKwkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICosIHZvaWQgKiksIHZvaWQgKnVzZXJfZGF0YSkKK3sKKwlzdHJ1Y3QgZWxlbWVudCAqZWxlbTsKKwl1MzIgaTsKKworCWlmIChoYXNoX3RhYiAmJiBoYXNoX3RhYi0+YnVja2V0cykKKwkJZm9yIChpID0gMDsgaSA8IGhhc2hfdGFiLT5tYXhfYnVja2V0OyBpKyspIHsKKwkJCWVsZW0gPSBoYXNoX3RhYi0+YnVja2V0c1tpXTsKKwkJCXdoaWxlIChlbGVtKSB7CisJCQkJY2FsbGJhY2soJmVsZW0tPmRhdGEsIHVzZXJfZGF0YSk7CisJCQkJZWxlbSA9IGVsZW0tPm5leHQ7CisJCQl9CisJCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2dlbi9ncy5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2dlbi9ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzYxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZ2VuL2dzLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIGdzLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogR2VuZXJhbCBzdG9yYWdlIG1lbW9yeSBhbGxvY2F0b3Igc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2dzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWxzICovCitzdGF0aWMgdTMyIGN1bXNpemU7CisKKy8qCisgKiAgPT09PT09PT0gZ3NfYWxsb2MgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBBbGxvY2F0ZXMgbWVtb3J5IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZS4KKyAqLwordm9pZCAqZ3NfYWxsb2ModTMyIHNpemUpCit7CisJdm9pZCAqcDsKKworCXAgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWN1bXNpemUgKz0gc2l6ZTsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqICA9PT09PT09PSBnc19leGl0ID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdGhlIHVzYWdlIG9mIHRoZSBHUyBtb2R1bGUuCisgKi8KK3ZvaWQgZ3NfZXhpdCh2b2lkKQoreworCS8qIERvIG5vdGhpbmcgKi8KK30KKworLyoKKyAqICA9PT09PT09PSBnc19mcmVlID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgRnJlZXMgdGhlIG1lbW9yeS4KKyAqLwordm9pZCBnc19mcmVlKHZvaWQgKnB0cikKK3sKKwlrZnJlZShwdHIpOworCS8qIGFjayEgbm8gc2l6ZSBpbmZvICovCisJLyogY3Vtc2l6ZSAtPSBzaXplOyAqLworfQorCisvKgorICogID09PT09PT09IGdzX2ZyZWVzID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgRnJlZXMgdGhlIG1lbW9yeS4KKyAqLwordm9pZCBnc19mcmVlcyh2b2lkICpwdHIsIHUzMiBzaXplKQoreworCWtmcmVlKHB0cik7CisJY3Vtc2l6ZSAtPSBzaXplOworfQorCisvKgorICogID09PT09PT09IGdzX2luaXQgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBJbml0aWFsaXplcyB0aGUgR1MgbW9kdWxlLgorICovCit2b2lkIGdzX2luaXQodm9pZCkKK3sKKwkvKiBEbyBub3RoaW5nICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZ2VuL3V1aWR1dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZ2VuL3V1aWR1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzOWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9nZW4vdXVpZHV0aWwuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHV1aWR1dGlsLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBVVUlEIGhlbHBlciBmdW5jdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9zdCBPUyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS91dWlkdXRpbC5oPgorCisvKgorICogID09PT09PT09IHV1aWRfdXVpZF90b19zdHJpbmcgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDb252ZXJ0cyBhIHN0cnVjdCBkc3BfdXVpZCB0byBhIHN0cmluZy4KKyAqICAgICAgTm90ZTogc25wcmludGYgZm9ybWF0IHNwZWNpZmllciBpczoKKyAqICAgICAgJVtmbGFnc10gW3dpZHRoXSBbLnByZWNpc2lvbl0gW3toIHwgbCB8IEk2NCB8IEx9XXR5cGUKKyAqLwordm9pZCB1dWlkX3V1aWRfdG9fc3RyaW5nKHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosIGNoYXIgKnN6X3V1aWQsCisJCQkgczMyIHNpemUpCit7CisJczMyIGk7CQkJLyogcmV0dXJuIHJlc3VsdCBmcm9tIHNucHJpbnRmLiAqLworCisJREJDX1JFUVVJUkUodXVpZF9vYmogJiYgc3pfdXVpZCk7CisKKwlpID0gc25wcmludGYoc3pfdXVpZCwgc2l6ZSwKKwkJICAgICAiJS44WF8lLjRYXyUuNFhfJS4yWCUuMlhfJS4yWCUuMlglLjJYJS4yWCUuMlglLjJYIiwKKwkJICAgICB1dWlkX29iai0+dWxfZGF0YTEsIHV1aWRfb2JqLT51c19kYXRhMiwgdXVpZF9vYmotPnVzX2RhdGEzLAorCQkgICAgIHV1aWRfb2JqLT51Y19kYXRhNCwgdXVpZF9vYmotPnVjX2RhdGE1LAorCQkgICAgIHV1aWRfb2JqLT51Y19kYXRhNlswXSwgdXVpZF9vYmotPnVjX2RhdGE2WzFdLAorCQkgICAgIHV1aWRfb2JqLT51Y19kYXRhNlsyXSwgdXVpZF9vYmotPnVjX2RhdGE2WzNdLAorCQkgICAgIHV1aWRfb2JqLT51Y19kYXRhNls0XSwgdXVpZF9vYmotPnVjX2RhdGE2WzVdKTsKKworCURCQ19FTlNVUkUoaSAhPSAtMSk7Cit9CisKK3N0YXRpYyBzMzIgdXVpZF9oZXhfdG9fYmluKGNoYXIgKmJ1ZiwgczMyIGxlbikKK3sKKwlzMzIgaTsKKwlzMzIgcmVzdWx0ID0gMDsKKwlpbnQgdmFsdWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdmFsdWUgPSBoZXhfdG9fYmluKCpidWYrKyk7CisJCXJlc3VsdCAqPSAxNjsKKwkJaWYgKHZhbHVlID4gMCkKKwkJCXJlc3VsdCArPSB2YWx1ZTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogID09PT09PT09IHV1aWRfdXVpZF9mcm9tX3N0cmluZyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgc3RydWN0IGRzcF91dWlkLgorICovCit2b2lkIHV1aWRfdXVpZF9mcm9tX3N0cmluZyhjaGFyICpzel91dWlkLCBzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqKQoreworCXMzMiBqOworCisJdXVpZF9vYmotPnVsX2RhdGExID0gdXVpZF9oZXhfdG9fYmluKHN6X3V1aWQsIDgpOworCXN6X3V1aWQgKz0gODsKKworCS8qIFN0ZXAgb3ZlciB1bmRlcnNjb3JlICovCisJc3pfdXVpZCsrOworCisJdXVpZF9vYmotPnVzX2RhdGEyID0gKHUxNikgdXVpZF9oZXhfdG9fYmluKHN6X3V1aWQsIDQpOworCXN6X3V1aWQgKz0gNDsKKworCS8qIFN0ZXAgb3ZlciB1bmRlcnNjb3JlICovCisJc3pfdXVpZCsrOworCisJdXVpZF9vYmotPnVzX2RhdGEzID0gKHUxNikgdXVpZF9oZXhfdG9fYmluKHN6X3V1aWQsIDQpOworCXN6X3V1aWQgKz0gNDsKKworCS8qIFN0ZXAgb3ZlciB1bmRlcnNjb3JlICovCisJc3pfdXVpZCsrOworCisJdXVpZF9vYmotPnVjX2RhdGE0ID0gKHU4KSB1dWlkX2hleF90b19iaW4oc3pfdXVpZCwgMik7CisJc3pfdXVpZCArPSAyOworCisJdXVpZF9vYmotPnVjX2RhdGE1ID0gKHU4KSB1dWlkX2hleF90b19iaW4oc3pfdXVpZCwgMik7CisJc3pfdXVpZCArPSAyOworCisJLyogU3RlcCBvdmVyIHVuZGVyc2NvcmUgKi8KKwlzel91dWlkKys7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCXV1aWRfb2JqLT51Y19kYXRhNltqXSA9ICh1OCkgdXVpZF9oZXhfdG9fYmluKHN6X3V1aWQsIDIpOworCQlzel91dWlkICs9IDI7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2h3L0Vhc2lHbG9iYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9FYXNpR2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZDdmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9FYXNpR2xvYmFsLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIEVhc2lHbG9iYWwuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfRUFTSUdMT0JBTF9ICisjZGVmaW5lIF9FQVNJR0xPQkFMX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogREVGSU5FOiAgICAgICAgUkVBRF9PTkxZLCBXUklURV9PTkxZICYgIFJFQURfV1JJVEUKKyAqCisgKiBERVNDUklQVElPTjogRGVmaW5lcyB1c2VkIHRvIGRlc2NyaWJlIHJlZ2lzdGVyIHR5cGVzIGZvciBFQVNJLWNoZWNrZXIgdGVzdHMuCisgKi8KKworI2RlZmluZSBSRUFEX09OTFkgICAgMQorI2RlZmluZSBXUklURV9PTkxZICAgMgorI2RlZmluZSBSRUFEX1dSSVRFICAgMworCisvKgorICogTUFDUk86ICAgICAgICBfREVCVUdfTEVWRUwxX0VBU0kKKyAqCisgKiBERVNDUklQVElPTjogIEEgTUFDUk8gd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHBhcnRpY3VsYXIgYmVhY2gKKyAqICAgICAgICAgICAgICAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCisgKgorICogTk9URTogICAgICAgICBXZSBjdXJyZW50bHkgZG9udCB1c2UgdGhpcyBmdW5jdGlvbmFsaXR5LgorICovCisjZGVmaW5lIF9ERUJVR19MRVZFTDFfRUFTSShlYXNpX251bSkgICAgICgodm9pZCkwKQorCisjZW5kaWYgLyogX0VBU0lHTE9CQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2h3L01NVUFjY0ludC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2h3L01NVUFjY0ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWZjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvTU1VQWNjSW50LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIE1NVUFjY0ludC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9NTVVfQUNDX0lOVF9ICisjZGVmaW5lIF9NTVVfQUNDX0lOVF9ICisKKy8qIE1hcHBpbmdzIG9mIGxldmVsIDEgRUFTSSBmdW5jdGlvbiBudW1iZXJzIHRvIGZ1bmN0aW9uIG5hbWVzICovCisKKyNkZWZpbmUgRUFTSUwxX01NVU1NVV9TWVNDT05GSUdfUkVBRF9SRUdJU1RFUjMyIChNTVVfQkFTRV9FQVNJTDEgKyAzKQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX1NZU0NPTkZJR19JRExFX01PREVfV1JJVEUzMiAgKE1NVV9CQVNFX0VBU0lMMSArIDE3KQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX1NZU0NPTkZJR19BVVRPX0lETEVfV1JJVEUzMiAgICAoTU1VX0JBU0VfRUFTSUwxICsgMzkpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfSVJRU1RBVFVTX1dSSVRFX1JFR0lTVEVSMzIgICAoTU1VX0JBU0VfRUFTSUwxICsgNTEpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfSVJRRU5BQkxFX1JFQURfUkVHSVNURVIzMiAoTU1VX0JBU0VfRUFTSUwxICsgMTAyKQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX0lSUUVOQUJMRV9XUklURV9SRUdJU1RFUjMyIChNTVVfQkFTRV9FQVNJTDEgKyAxMDMpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfV0FMS0lOR19TVFRXTF9SVU5OSU5HX1JFQUQzMiAoTU1VX0JBU0VfRUFTSUwxICsgMTU2KQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX0NOVExUV0xfRU5BQkxFX1JFQUQzMiAoTU1VX0JBU0VfRUFTSUwxICsgMTc0KQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX0NOVExUV0xfRU5BQkxFX1dSSVRFMzIgICAoTU1VX0JBU0VfRUFTSUwxICsgMTgwKQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX0NOVExNTVVfRU5BQkxFX1dSSVRFMzIgICAgIChNTVVfQkFTRV9FQVNJTDEgKyAxOTApCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfRkFVTFRfQURfUkVBRF9SRUdJU1RFUjMyICAgKE1NVV9CQVNFX0VBU0lMMSArIDE5NCkKKyNkZWZpbmUgRUFTSUwxX01NVU1NVV9UVEJfV1JJVEVfUkVHSVNURVIzMiAgKE1NVV9CQVNFX0VBU0lMMSArIDE5OCkKKyNkZWZpbmUgRUFTSUwxX01NVU1NVV9MT0NLX1JFQURfUkVHSVNURVIzMiAgIChNTVVfQkFTRV9FQVNJTDEgKyAyMDMpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfTE9DS19XUklURV9SRUdJU1RFUjMyICAoTU1VX0JBU0VfRUFTSUwxICsgMjA0KQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX0xPQ0tfQkFTRV9WQUxVRV9SRUFEMzIgIChNTVVfQkFTRV9FQVNJTDEgKyAyMDUpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfTE9DS19DVVJSRU5UX1ZJQ1RJTV9SRUFEMzIgKE1NVV9CQVNFX0VBU0lMMSArIDIwOSkKKyNkZWZpbmUgRUFTSUwxX01NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1dSSVRFMzIgKE1NVV9CQVNFX0VBU0lMMSArIDIxMSkKKyNkZWZpbmUgRUFTSUwxX01NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1NFVDMyICAoTU1VX0JBU0VfRUFTSUwxICsgMjEyKQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX0xEX1RMQl9SRUFEX1JFR0lTVEVSMzIgICAgKE1NVV9CQVNFX0VBU0lMMSArIDIxMykKKyNkZWZpbmUgRUFTSUwxX01NVU1NVV9MRF9UTEJfV1JJVEVfUkVHSVNURVIzMiAgIChNTVVfQkFTRV9FQVNJTDEgKyAyMTQpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfQ0FNX1dSSVRFX1JFR0lTVEVSMzIgICAoTU1VX0JBU0VfRUFTSUwxICsgMjI2KQorI2RlZmluZSBFQVNJTDFfTU1VTU1VX1JBTV9XUklURV9SRUdJU1RFUjMyIChNTVVfQkFTRV9FQVNJTDEgKyAyNjgpCisjZGVmaW5lIEVBU0lMMV9NTVVNTVVfRkxVU0hfRU5UUllfV1JJVEVfUkVHSVNURVIzMiAgKE1NVV9CQVNFX0VBU0lMMSArIDMyMikKKworLyogUmVnaXN0ZXIgb2Zmc2V0IGFkZHJlc3MgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTU1VX01NVV9TWVNDT05GSUdfT0ZGU0VUICAgMHgxMAorI2RlZmluZSBNTVVfTU1VX0lSUVNUQVRVU19PRkZTRVQgIDB4MTgKKyNkZWZpbmUgTU1VX01NVV9JUlFFTkFCTEVfT0ZGU0VUICAgIDB4MWMKKyNkZWZpbmUgTU1VX01NVV9XQUxLSU5HX1NUX09GRlNFVCAweDQwCisjZGVmaW5lIE1NVV9NTVVfQ05UTF9PRkZTRVQgICAweDQ0CisjZGVmaW5lIE1NVV9NTVVfRkFVTFRfQURfT0ZGU0VUICAweDQ4CisjZGVmaW5lIE1NVV9NTVVfVFRCX09GRlNFVCAgMHg0YworI2RlZmluZSBNTVVfTU1VX0xPQ0tfT0ZGU0VUICAgMHg1MAorI2RlZmluZSBNTVVfTU1VX0xEX1RMQl9PRkZTRVQgIDB4NTQKKyNkZWZpbmUgTU1VX01NVV9DQU1fT0ZGU0VUICAgMHg1OAorI2RlZmluZSBNTVVfTU1VX1JBTV9PRkZTRVQgICAweDVjCisjZGVmaW5lIE1NVV9NTVVfR0ZMVVNIX09GRlNFVCAgMHg2MAorI2RlZmluZSBNTVVfTU1VX0ZMVVNIX0VOVFJZX09GRlNFVCAgMHg2NAorLyogQml0ZmllbGQgbWFzayBhbmQgb2Zmc2V0IGRlY2xhcmF0aW9ucyAqLworI2RlZmluZSBNTVVfTU1VX1NZU0NPTkZJR19JRExFX01PREVfTUFTSyAgMHgxOAorI2RlZmluZSBNTVVfTU1VX1NZU0NPTkZJR19JRExFX01PREVfT0ZGU0VUICAzCisjZGVmaW5lIE1NVV9NTVVfU1lTQ09ORklHX0FVVE9fSURMRV9NQVNLICAweDEKKyNkZWZpbmUgTU1VX01NVV9TWVNDT05GSUdfQVVUT19JRExFX09GRlNFVCAgIDAKKyNkZWZpbmUgTU1VX01NVV9XQUxLSU5HX1NUX1RXTF9SVU5OSU5HX01BU0sgMHgxCisjZGVmaW5lIE1NVV9NTVVfV0FMS0lOR19TVF9UV0xfUlVOTklOR19PRkZTRVQgIDAKKyNkZWZpbmUgTU1VX01NVV9DTlRMX1RXTF9FTkFCTEVfTUFTSyAweDQKKyNkZWZpbmUgTU1VX01NVV9DTlRMX1RXTF9FTkFCTEVfT0ZGU0VUIDIKKyNkZWZpbmUgTU1VX01NVV9DTlRMX01NVV9FTkFCTEVfTUFTSyAgICAweDIKKyNkZWZpbmUgTU1VX01NVV9DTlRMX01NVV9FTkFCTEVfT0ZGU0VUICAgMQorI2RlZmluZSBNTVVfTU1VX0xPQ0tfQkFTRV9WQUxVRV9NQVNLIDB4ZmMwMAorI2RlZmluZSBNTVVfTU1VX0xPQ0tfQkFTRV9WQUxVRV9PRkZTRVQgICAxMAorI2RlZmluZSBNTVVfTU1VX0xPQ0tfQ1VSUkVOVF9WSUNUSU1fTUFTSyAgIDB4M2YwCisjZGVmaW5lIE1NVV9NTVVfTE9DS19DVVJSRU5UX1ZJQ1RJTV9PRkZTRVQgICAgNAorCisjZW5kaWYgLyogX01NVV9BQ0NfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9NTVVSZWdBY00uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9NTVVSZWdBY00uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjFhMTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2h3L01NVVJlZ0FjTS5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTU1VUmVnQWNNLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX01NVV9SRUdfQUNNX0gKKyNkZWZpbmUgX01NVV9SRUdfQUNNX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8RWFzaUdsb2JhbC5oPgorCisjaW5jbHVkZSAiTU1VQWNjSW50LmgiCisKKyNpZiBkZWZpbmVkKFVTRV9MRVZFTF8xX01BQ1JPUykKKworI2RlZmluZSBNTVVNTVVfU1lTQ09ORklHX1JFQURfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MpXAorICAgIChfREVCVUdfTEVWRUwxX0VBU0koRUFTSUwxX01NVU1NVV9TWVNDT05GSUdfUkVBRF9SRUdJU1RFUjMyKSxcCisgICAgICBfX3Jhd19yZWFkbCgoYmFzZV9hZGRyZXNzKStNTVVfTU1VX1NZU0NPTkZJR19PRkZTRVQpKQorCisjZGVmaW5lIE1NVU1NVV9TWVNDT05GSUdfSURMRV9NT0RFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCB2YWx1ZSlcCit7XAorICAgIGNvbnN0IHUzMiBvZmZzZXQgPSBNTVVfTU1VX1NZU0NPTkZJR19PRkZTRVQ7XAorICAgIHJlZ2lzdGVyIHUzMiBkYXRhID0gX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX1NZU0NPTkZJR19JRExFX01PREVfV1JJVEUzMik7XAorICAgIGRhdGEgJj0gfihNTVVfTU1VX1NZU0NPTkZJR19JRExFX01PREVfTUFTSyk7XAorICAgIG5ld192YWx1ZSA8PD0gTU1VX01NVV9TWVNDT05GSUdfSURMRV9NT0RFX09GRlNFVDtcCisgICAgbmV3X3ZhbHVlICY9IE1NVV9NTVVfU1lTQ09ORklHX0lETEVfTU9ERV9NQVNLO1wKKyAgICBuZXdfdmFsdWUgfD0gZGF0YTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgYmFzZV9hZGRyZXNzK29mZnNldCk7XAorfQorCisjZGVmaW5lIE1NVU1NVV9TWVNDT05GSUdfQVVUT19JRExFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCB2YWx1ZSlcCit7XAorICAgIGNvbnN0IHUzMiBvZmZzZXQgPSBNTVVfTU1VX1NZU0NPTkZJR19PRkZTRVQ7XAorICAgIHJlZ2lzdGVyIHUzMiBkYXRhID0gX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX1NZU0NPTkZJR19BVVRPX0lETEVfV1JJVEUzMik7XAorICAgIGRhdGEgJj0gfihNTVVfTU1VX1NZU0NPTkZJR19BVVRPX0lETEVfTUFTSyk7XAorICAgIG5ld192YWx1ZSA8PD0gTU1VX01NVV9TWVNDT05GSUdfQVVUT19JRExFX09GRlNFVDtcCisgICAgbmV3X3ZhbHVlICY9IE1NVV9NTVVfU1lTQ09ORklHX0FVVE9fSURMRV9NQVNLO1wKKyAgICBuZXdfdmFsdWUgfD0gZGF0YTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgYmFzZV9hZGRyZXNzK29mZnNldCk7XAorfQorCisjZGVmaW5lIE1NVU1NVV9JUlFTVEFUVVNfUkVBRF9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcylcCisgICAgKF9ERUJVR19MRVZFTDFfRUFTSShlYXNpbDFfbW11bW11X2lycXN0YXR1c19yZWFkX3JlZ2lzdGVyMzIpLFwKKyAgICAgIF9fcmF3X3JlYWRsKChiYXNlX2FkZHJlc3MpK01NVV9NTVVfSVJRU1RBVFVTX09GRlNFVCkpCisKKyNkZWZpbmUgTU1VTU1VX0lSUVNUQVRVU19XUklURV9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcywgdmFsdWUpXAore1wKKyAgICBjb25zdCB1MzIgb2Zmc2V0ID0gTU1VX01NVV9JUlFTVEFUVVNfT0ZGU0VUO1wKKyAgICByZWdpc3RlciB1MzIgbmV3X3ZhbHVlID0gKHZhbHVlKTtcCisgICAgX0RFQlVHX0xFVkVMMV9FQVNJKEVBU0lMMV9NTVVNTVVfSVJRU1RBVFVTX1dSSVRFX1JFR0lTVEVSMzIpO1wKKyAgICBfX3Jhd193cml0ZWwobmV3X3ZhbHVlLCAoYmFzZV9hZGRyZXNzKStvZmZzZXQpO1wKK30KKworI2RlZmluZSBNTVVNTVVfSVJRRU5BQkxFX1JFQURfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MpXAorICAgIChfREVCVUdfTEVWRUwxX0VBU0koRUFTSUwxX01NVU1NVV9JUlFFTkFCTEVfUkVBRF9SRUdJU1RFUjMyKSxcCisgICAgICBfX3Jhd19yZWFkbCgoYmFzZV9hZGRyZXNzKStNTVVfTU1VX0lSUUVOQUJMRV9PRkZTRVQpKQorCisjZGVmaW5lIE1NVU1NVV9JUlFFTkFCTEVfV1JJVEVfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfSVJRRU5BQkxFX09GRlNFVDtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0lSUUVOQUJMRV9XUklURV9SRUdJU1RFUjMyKTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCit9CisKKyNkZWZpbmUgTU1VTU1VX1dBTEtJTkdfU1RUV0xfUlVOTklOR19SRUFEMzIoYmFzZV9hZGRyZXNzKVwKKyAgICAoX0RFQlVHX0xFVkVMMV9FQVNJKEVBU0lMMV9NTVVNTVVfV0FMS0lOR19TVFRXTF9SVU5OSU5HX1JFQUQzMiksXAorICAgICAgKCgoX19yYXdfcmVhZGwoKChiYXNlX2FkZHJlc3MpKyhNTVVfTU1VX1dBTEtJTkdfU1RfT0ZGU0VUKSkpKVwKKyAgICAgICYgTU1VX01NVV9XQUxLSU5HX1NUX1RXTF9SVU5OSU5HX01BU0spID4+XAorICAgICAgTU1VX01NVV9XQUxLSU5HX1NUX1RXTF9SVU5OSU5HX09GRlNFVCkpCisKKyNkZWZpbmUgTU1VTU1VX0NOVExUV0xfRU5BQkxFX1JFQUQzMihiYXNlX2FkZHJlc3MpXAorICAgIChfREVCVUdfTEVWRUwxX0VBU0koRUFTSUwxX01NVU1NVV9DTlRMVFdMX0VOQUJMRV9SRUFEMzIpLFwKKyAgICAgICgoKF9fcmF3X3JlYWRsKCgoYmFzZV9hZGRyZXNzKSsoTU1VX01NVV9DTlRMX09GRlNFVCkpKSkgJlwKKyAgICAgIE1NVV9NTVVfQ05UTF9UV0xfRU5BQkxFX01BU0spID4+XAorICAgICAgTU1VX01NVV9DTlRMX1RXTF9FTkFCTEVfT0ZGU0VUKSkKKworI2RlZmluZSBNTVVNTVVfQ05UTFRXTF9FTkFCTEVfV1JJVEUzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfQ05UTF9PRkZTRVQ7XAorICAgIHJlZ2lzdGVyIHUzMiBkYXRhID0gX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0NOVExUV0xfRU5BQkxFX1dSSVRFMzIpO1wKKyAgICBkYXRhICY9IH4oTU1VX01NVV9DTlRMX1RXTF9FTkFCTEVfTUFTSyk7XAorICAgIG5ld192YWx1ZSA8PD0gTU1VX01NVV9DTlRMX1RXTF9FTkFCTEVfT0ZGU0VUO1wKKyAgICBuZXdfdmFsdWUgJj0gTU1VX01NVV9DTlRMX1RXTF9FTkFCTEVfTUFTSztcCisgICAgbmV3X3ZhbHVlIHw9IGRhdGE7XAorICAgIF9fcmF3X3dyaXRlbChuZXdfdmFsdWUsIGJhc2VfYWRkcmVzcytvZmZzZXQpO1wKK30KKworI2RlZmluZSBNTVVNTVVfQ05UTE1NVV9FTkFCTEVfV1JJVEUzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfQ05UTF9PRkZTRVQ7XAorICAgIHJlZ2lzdGVyIHUzMiBkYXRhID0gX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0NOVExNTVVfRU5BQkxFX1dSSVRFMzIpO1wKKyAgICBkYXRhICY9IH4oTU1VX01NVV9DTlRMX01NVV9FTkFCTEVfTUFTSyk7XAorICAgIG5ld192YWx1ZSA8PD0gTU1VX01NVV9DTlRMX01NVV9FTkFCTEVfT0ZGU0VUO1wKKyAgICBuZXdfdmFsdWUgJj0gTU1VX01NVV9DTlRMX01NVV9FTkFCTEVfTUFTSztcCisgICAgbmV3X3ZhbHVlIHw9IGRhdGE7XAorICAgIF9fcmF3X3dyaXRlbChuZXdfdmFsdWUsIGJhc2VfYWRkcmVzcytvZmZzZXQpO1wKK30KKworI2RlZmluZSBNTVVNTVVfRkFVTFRfQURfUkVBRF9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcylcCisgICAgKF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0ZBVUxUX0FEX1JFQURfUkVHSVNURVIzMiksXAorICAgICAgX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrTU1VX01NVV9GQVVMVF9BRF9PRkZTRVQpKQorCisjZGVmaW5lIE1NVU1NVV9UVEJfV1JJVEVfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfVFRCX09GRlNFVDtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX1RUQl9XUklURV9SRUdJU1RFUjMyKTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCit9CisKKyNkZWZpbmUgTU1VTU1VX0xPQ0tfUkVBRF9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcylcCisgICAgKF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0xPQ0tfUkVBRF9SRUdJU1RFUjMyKSxcCisgICAgICBfX3Jhd19yZWFkbCgoYmFzZV9hZGRyZXNzKStNTVVfTU1VX0xPQ0tfT0ZGU0VUKSkKKworI2RlZmluZSBNTVVNTVVfTE9DS19XUklURV9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcywgdmFsdWUpXAore1wKKyAgICBjb25zdCB1MzIgb2Zmc2V0ID0gTU1VX01NVV9MT0NLX09GRlNFVDtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0xPQ0tfV1JJVEVfUkVHSVNURVIzMik7XAorICAgIF9fcmF3X3dyaXRlbChuZXdfdmFsdWUsIChiYXNlX2FkZHJlc3MpK29mZnNldCk7XAorfQorCisjZGVmaW5lIE1NVU1NVV9MT0NLX0JBU0VfVkFMVUVfUkVBRDMyKGJhc2VfYWRkcmVzcylcCisgICAgKF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0xPQ0tfQkFTRV9WQUxVRV9SRUFEMzIpLFwKKyAgICAgICgoKF9fcmF3X3JlYWRsKCgoYmFzZV9hZGRyZXNzKSsoTU1VX01NVV9MT0NLX09GRlNFVCkpKSkgJlwKKyAgICAgIE1NVV9NTVVfTE9DS19CQVNFX1ZBTFVFX01BU0spID4+XAorICAgICAgTU1VX01NVV9MT0NLX0JBU0VfVkFMVUVfT0ZGU0VUKSkKKworI2RlZmluZSBNTVVNTVVfTE9DS19CQVNFX1ZBTFVFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCB2YWx1ZSlcCit7XAorICAgIGNvbnN0IHUzMiBvZmZzZXQgPSBNTVVfTU1VX0xPQ0tfT0ZGU0VUO1wKKyAgICByZWdpc3RlciB1MzIgZGF0YSA9IF9fcmF3X3JlYWRsKChiYXNlX2FkZHJlc3MpK29mZnNldCk7XAorICAgIHJlZ2lzdGVyIHUzMiBuZXdfdmFsdWUgPSAodmFsdWUpO1wKKyAgICBfREVCVUdfTEVWRUwxX0VBU0koZWFzaWwxX21tdW1tdV9sb2NrX2Jhc2VfdmFsdWVfd3JpdGUzMik7XAorICAgIGRhdGEgJj0gfihNTVVfTU1VX0xPQ0tfQkFTRV9WQUxVRV9NQVNLKTtcCisgICAgbmV3X3ZhbHVlIDw8PSBNTVVfTU1VX0xPQ0tfQkFTRV9WQUxVRV9PRkZTRVQ7XAorICAgIG5ld192YWx1ZSAmPSBNTVVfTU1VX0xPQ0tfQkFTRV9WQUxVRV9NQVNLO1wKKyAgICBuZXdfdmFsdWUgfD0gZGF0YTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgYmFzZV9hZGRyZXNzK29mZnNldCk7XAorfQorCisjZGVmaW5lIE1NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1JFQUQzMihiYXNlX2FkZHJlc3MpXAorICAgIChfREVCVUdfTEVWRUwxX0VBU0koRUFTSUwxX01NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1JFQUQzMiksXAorICAgICAgKCgoX19yYXdfcmVhZGwoKChiYXNlX2FkZHJlc3MpKyhNTVVfTU1VX0xPQ0tfT0ZGU0VUKSkpKSAmXAorICAgICAgTU1VX01NVV9MT0NLX0NVUlJFTlRfVklDVElNX01BU0spID4+XAorICAgICAgTU1VX01NVV9MT0NLX0NVUlJFTlRfVklDVElNX09GRlNFVCkpCisKKyNkZWZpbmUgTU1VTU1VX0xPQ0tfQ1VSUkVOVF9WSUNUSU1fV1JJVEUzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfTE9DS19PRkZTRVQ7XAorICAgIHJlZ2lzdGVyIHUzMiBkYXRhID0gX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0xPQ0tfQ1VSUkVOVF9WSUNUSU1fV1JJVEUzMik7XAorICAgIGRhdGEgJj0gfihNTVVfTU1VX0xPQ0tfQ1VSUkVOVF9WSUNUSU1fTUFTSyk7XAorICAgIG5ld192YWx1ZSA8PD0gTU1VX01NVV9MT0NLX0NVUlJFTlRfVklDVElNX09GRlNFVDtcCisgICAgbmV3X3ZhbHVlICY9IE1NVV9NTVVfTE9DS19DVVJSRU5UX1ZJQ1RJTV9NQVNLO1wKKyAgICBuZXdfdmFsdWUgfD0gZGF0YTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgYmFzZV9hZGRyZXNzK29mZnNldCk7XAorfQorCisjZGVmaW5lIE1NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1NFVDMyKHZhciwgdmFsdWUpXAorICAgIChfREVCVUdfTEVWRUwxX0VBU0koRUFTSUwxX01NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1NFVDMyKSxcCisgICAgICAoKCh2YXIpICYgfihNTVVfTU1VX0xPQ0tfQ1VSUkVOVF9WSUNUSU1fTUFTSykpIHxcCisgICAgICAoKCh2YWx1ZSkgPDwgTU1VX01NVV9MT0NLX0NVUlJFTlRfVklDVElNX09GRlNFVCkgJlwKKyAgICAgIE1NVV9NTVVfTE9DS19DVVJSRU5UX1ZJQ1RJTV9NQVNLKSkpCisKKyNkZWZpbmUgTU1VTU1VX0xEX1RMQl9SRUFEX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzKVwKKyAgICAoX0RFQlVHX0xFVkVMMV9FQVNJKEVBU0lMMV9NTVVNTVVfTERfVExCX1JFQURfUkVHSVNURVIzMiksXAorICAgICAgX19yYXdfcmVhZGwoKGJhc2VfYWRkcmVzcykrTU1VX01NVV9MRF9UTEJfT0ZGU0VUKSkKKworI2RlZmluZSBNTVVNTVVfTERfVExCX1dSSVRFX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzLCB2YWx1ZSlcCit7XAorICAgIGNvbnN0IHUzMiBvZmZzZXQgPSBNTVVfTU1VX0xEX1RMQl9PRkZTRVQ7XAorICAgIHJlZ2lzdGVyIHUzMiBuZXdfdmFsdWUgPSAodmFsdWUpO1wKKyAgICBfREVCVUdfTEVWRUwxX0VBU0koRUFTSUwxX01NVU1NVV9MRF9UTEJfV1JJVEVfUkVHSVNURVIzMik7XAorICAgIF9fcmF3X3dyaXRlbChuZXdfdmFsdWUsIChiYXNlX2FkZHJlc3MpK29mZnNldCk7XAorfQorCisjZGVmaW5lIE1NVU1NVV9DQU1fV1JJVEVfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfQ0FNX09GRlNFVDtcCisgICAgcmVnaXN0ZXIgdTMyIG5ld192YWx1ZSA9ICh2YWx1ZSk7XAorICAgIF9ERUJVR19MRVZFTDFfRUFTSShFQVNJTDFfTU1VTU1VX0NBTV9XUklURV9SRUdJU1RFUjMyKTtcCisgICAgX19yYXdfd3JpdGVsKG5ld192YWx1ZSwgKGJhc2VfYWRkcmVzcykrb2Zmc2V0KTtcCit9CisKKyNkZWZpbmUgTU1VTU1VX1JBTV9XUklURV9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcywgdmFsdWUpXAore1wKKyAgICBjb25zdCB1MzIgb2Zmc2V0ID0gTU1VX01NVV9SQU1fT0ZGU0VUO1wKKyAgICByZWdpc3RlciB1MzIgbmV3X3ZhbHVlID0gKHZhbHVlKTtcCisgICAgX0RFQlVHX0xFVkVMMV9FQVNJKEVBU0lMMV9NTVVNTVVfUkFNX1dSSVRFX1JFR0lTVEVSMzIpO1wKKyAgICBfX3Jhd193cml0ZWwobmV3X3ZhbHVlLCAoYmFzZV9hZGRyZXNzKStvZmZzZXQpO1wKK30KKworI2RlZmluZSBNTVVNTVVfRkxVU0hfRU5UUllfV1JJVEVfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MsIHZhbHVlKVwKK3tcCisgICAgY29uc3QgdTMyIG9mZnNldCA9IE1NVV9NTVVfRkxVU0hfRU5UUllfT0ZGU0VUO1wKKyAgICByZWdpc3RlciB1MzIgbmV3X3ZhbHVlID0gKHZhbHVlKTtcCisgICAgX0RFQlVHX0xFVkVMMV9FQVNJKEVBU0lMMV9NTVVNTVVfRkxVU0hfRU5UUllfV1JJVEVfUkVHSVNURVIzMik7XAorICAgIF9fcmF3X3dyaXRlbChuZXdfdmFsdWUsIChiYXNlX2FkZHJlc3MpK29mZnNldCk7XAorfQorCisjZW5kaWYgLyogVVNFX0xFVkVMXzFfTUFDUk9TICovCisKKyNlbmRpZiAvKiBfTU1VX1JFR19BQ01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2h3L2h3X2RlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9od19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyNjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9od19kZWZzLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIGh3X2RlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgSFcgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfSFdfREVGU19ICisjZGVmaW5lIF9IV19ERUZTX0gKKworLyogUGFnZSBzaXplICovCisjZGVmaW5lIEhXX1BBR0VfU0laRTRLQiAgIDB4MTAwMAorI2RlZmluZSBIV19QQUdFX1NJWkU2NEtCICAweDEwMDAwCisjZGVmaW5lIEhXX1BBR0VfU0laRTFNQiAgIDB4MTAwMDAwCisjZGVmaW5lIEhXX1BBR0VfU0laRTE2TUIgIDB4MTAwMDAwMAorCisvKiBod19zdGF0dXM6ICByZXR1cm4gdHlwZSBmb3IgSFcgQVBJICovCit0eXBlZGVmIGxvbmcgaHdfc3RhdHVzOworCisvKiAgTWFjcm8gdXNlZCB0byBzZXQgYW5kIGNsZWFyIGFueSBiaXQgKi8KKyNkZWZpbmUgSFdfQ0xFQVIJMAorI2RlZmluZSBIV19TRVQJCTEKKworLyogaHdfZW5kaWFuaXNtX3Q6ICBFbnVtZXJhdGVkIFR5cGUgdXNlZCB0byBzcGVjaWZ5IHRoZSBlbmRpYW5pc20KKyAqCQlEbyBOT1QgY2hhbmdlIHRoZXNlIHZhbHVlcy4gVGhleSBhcmUgdXNlZCBhcyBiaXQgZmllbGRzLiAqLworZW51bSBod19lbmRpYW5pc21fdCB7CisJSFdfTElUVExFX0VORElBTiwKKwlIV19CSUdfRU5ESUFOCit9OworCisvKiBod19lbGVtZW50X3NpemVfdDogIEVudW1lcmF0ZWQgVHlwZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgc2l6ZQorICoJCURvIE5PVCBjaGFuZ2UgdGhlc2UgdmFsdWVzLiBUaGV5IGFyZSB1c2VkIGFzIGJpdCBmaWVsZHMuICovCitlbnVtIGh3X2VsZW1lbnRfc2l6ZV90IHsKKwlIV19FTEVNX1NJWkU4QklULAorCUhXX0VMRU1fU0laRTE2QklULAorCUhXX0VMRU1fU0laRTMyQklULAorCUhXX0VMRU1fU0laRTY0QklUCit9OworCisvKiBod19pZGxlX21vZGVfdDogIEVudW1lcmF0ZWQgVHlwZSB1c2VkIHRvIHNwZWNpZnkgSWRsZSBtb2RlcyAqLworZW51bSBod19pZGxlX21vZGVfdCB7CisJSFdfRk9SQ0VfSURMRSwKKwlIV19OT19JRExFLAorCUhXX1NNQVJUX0lETEUKK307CisKKyNlbmRpZiAvKiBfSFdfREVGU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvaHdfbW11LmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvaHdfbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZjVkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9od19tbXUuYwpAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqIGh3X21tdS5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEFQSSBkZWZpbml0aW9ucyB0byBzZXR1cCBNTVUgVExCIGFuZCBQVEUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAiTU1VUmVnQWNNLmgiCisjaW5jbHVkZSA8aHdfZGVmcy5oPgorI2luY2x1ZGUgPGh3X21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNkZWZpbmUgTU1VX0JBU0VfVkFMX01BU0sJMHhGQzAwCisjZGVmaW5lIE1NVV9QQUdFX01BWAkgICAgIDMKKyNkZWZpbmUgTU1VX0VMRU1FTlRTSVpFX01BWCAgICAgIDMKKyNkZWZpbmUgTU1VX0FERFJfTUFTSwkgICAgMHhGRkZGRjAwMAorI2RlZmluZSBNTVVfVFRCX01BU0sJICAgICAweEZGRkZDMDAwCisjZGVmaW5lIE1NVV9TRUNUSU9OX0FERFJfTUFTSyAgICAweEZGRjAwMDAwCisjZGVmaW5lIE1NVV9TU0VDVElPTl9BRERSX01BU0sgICAweEZGMDAwMDAwCisjZGVmaW5lIE1NVV9QQUdFX1RBQkxFX01BU0sgICAgICAweEZGRkZGQzAwCisjZGVmaW5lIE1NVV9MQVJHRV9QQUdFX01BU0sgICAgICAweEZGRkYwMDAwCisjZGVmaW5lIE1NVV9TTUFMTF9QQUdFX01BU0sgICAgICAweEZGRkZGMDAwCisKKyNkZWZpbmUgTU1VX0xPQURfVExCCTB4MDAwMDAwMDEKKyNkZWZpbmUgTU1VX0dGTFVTSAkweDYwCisKKy8qCisgKiBod19tbXVfcGFnZV9zaXplX3Q6IEVudW1lcmF0ZWQgVHlwZSB1c2VkIHRvIHNwZWNpZnkgdGhlIE1NVSBQYWdlIFNpemUoU0xTUykKKyAqLworZW51bSBod19tbXVfcGFnZV9zaXplX3QgeworCUhXX01NVV9TRUNUSU9OLAorCUhXX01NVV9MQVJHRV9QQUdFLAorCUhXX01NVV9TTUFMTF9QQUdFLAorCUhXX01NVV9TVVBFUlNFQ1RJT04KK307CisKKy8qCisgKiBGVU5DVElPTgkgICAgICA6IG1tdV9mbHVzaF9lbnRyeQorICoKKyAqIElOUFVUUzoKKyAqCisgKiAgICAgICBJZGVudGlmaWVyICAgICAgOiBiYXNlX2FkZHJlc3MKKyAqICAgICAgIFR5cGUJCTogY29uc3QgdTMyCisgKiAgICAgICBEZXNjcmlwdGlvbiAgICAgOiBCYXNlIEFkZHJlc3Mgb2YgaW5zdGFuY2Ugb2YgTU1VIG1vZHVsZQorICoKKyAqIFJFVFVSTlM6CisgKgorICogICAgICAgVHlwZQkJOiBod19zdGF0dXMKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IDAJCSAtLSBObyBlcnJvcnMgb2NjdXJlZAorICoJCQkgUkVUX0JBRF9OVUxMX1BBUkFNICAgICAtLSBBIFBvaW50ZXIKKyAqCQkJCQkJUGFyYW1hdGVyIHdhcyBzZXQgdG8gTlVMTAorICoKKyAqIFBVUlBPU0U6CSAgICAgIDogRmx1c2ggdGhlIFRMQiBlbnRyeSBwb2ludGVkIGJ5IHRoZQorICoJCQlsb2NrIGNvdW50ZXIgcmVnaXN0ZXIKKyAqCQkJZXZlbiBpZiB0aGlzIGVudHJ5IGlzIHNldCBwcm90ZWN0ZWQKKyAqCisgKiBNRVRIT0Q6CSAgICAgICA6IENoZWNrIHRoZSBJbnB1dCBwYXJhbWV0ZXIgYW5kIEZsdXNoIGEKKyAqCQkJIHNpbmdsZSBlbnRyeSBpbiB0aGUgVExCLgorICovCitzdGF0aWMgaHdfc3RhdHVzIG1tdV9mbHVzaF9lbnRyeShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcyk7CisKKy8qCisgKiBGVU5DVElPTgkgICAgICA6IG1tdV9zZXRfY2FtX2VudHJ5CisgKgorICogSU5QVVRTOgorICoKKyAqICAgICAgIElkZW50aWZpZXIgICAgICA6IGJhc2VfYWRkcmVzcworICogICAgICAgVHlwRQkJOiBjb25zdCB1MzIKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IEJhc2UgQWRkcmVzcyBvZiBpbnN0YW5jZSBvZiBNTVUgbW9kdWxlCisgKgorICogICAgICAgSWRlbnRpZmllciAgICAgIDogcGFnZV9zegorICogICAgICAgVHlwRQkJOiBjb25zdCB1MzIKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IEl0IGluZGljYXRlcyB0aGUgcGFnZSBzaXplCisgKgorICogICAgICAgSWRlbnRpZmllciAgICAgIDogcHJlc2VydmVkX2JpdAorICogICAgICAgVHlwZQkJOiBjb25zdCB1MzIKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IEl0IGluZGljYXRlcyB0aGUgVExCIGVudHJ5IGlzIHByZXNlcnZlZCBlbnRyeQorICoJCQkJCQkJb3Igbm90CisgKgorICogICAgICAgSWRlbnRpZmllciAgICAgIDogdmFsaWRfYml0CisgKiAgICAgICBUeXBlCQk6IGNvbnN0IHUzMgorICogICAgICAgRGVzY3JpcHRpb24gICAgIDogSXQgaW5kaWNhdGVzIHRoZSBUTEIgZW50cnkgaXMgdmFsaWQgZW50cnkgb3Igbm90CisgKgorICoKKyAqICAgICAgIElkZW50aWZpZXIgICAgICA6IHZpcnR1YWxfYWRkcl90YWcKKyAqICAgICAgIFR5cGUJICAgIAk6IGNvbnN0IHUzMgorICogICAgICAgRGVzY3JpcHRpb24gICAgIDogdmlydHVhbCBBZGRyZXNzCisgKgorICogUkVUVVJOUzoKKyAqCisgKiAgICAgICBUeXBlCSAgICAJOiBod19zdGF0dXMKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IDAJCSAtLSBObyBlcnJvcnMgb2NjdXJlZAorICoJCQkgUkVUX0JBRF9OVUxMX1BBUkFNICAgICAtLSBBIFBvaW50ZXIgUGFyYW1hdGVyCisgKgkJCQkJCSAgIHdhcyBzZXQgdG8gTlVMTAorICoJCQkgUkVUX1BBUkFNX09VVF9PRl9SQU5HRSAtLSBJbnB1dCBQYXJhbWV0ZXIgb3V0CisgKgkJCQkJCSAgIG9mIFJhbmdlCisgKgorICogUFVSUE9TRToJICAgICAgCTogU2V0IE1NVV9DQU0gcmVnCisgKgorICogTUVUSE9EOgkgICAgICAgCTogQ2hlY2sgdGhlIElucHV0IHBhcmFtZXRlcnMgYW5kIHNldCB0aGUgQ0FNIGVudHJ5LgorICovCitzdGF0aWMgaHdfc3RhdHVzIG1tdV9zZXRfY2FtX2VudHJ5KGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAorCQkJCSAgIGNvbnN0IHUzMiBwYWdlX3N6LAorCQkJCSAgIGNvbnN0IHUzMiBwcmVzZXJ2ZWRfYml0LAorCQkJCSAgIGNvbnN0IHUzMiB2YWxpZF9iaXQsCisJCQkJICAgY29uc3QgdTMyIHZpcnR1YWxfYWRkcl90YWcpOworCisvKgorICogRlVOQ1RJT04JICAgICAgOiBtbXVfc2V0X3JhbV9lbnRyeQorICoKKyAqIElOUFVUUzoKKyAqCisgKiAgICAgICBJZGVudGlmaWVyICAgICAgOiBiYXNlX2FkZHJlc3MKKyAqICAgICAgIFR5cGUJICAgIAk6IGNvbnN0IHUzMgorICogICAgICAgRGVzY3JpcHRpb24gICAgIDogQmFzZSBBZGRyZXNzIG9mIGluc3RhbmNlIG9mIE1NVSBtb2R1bGUKKyAqCisgKiAgICAgICBJZGVudGlmaWVyICAgICAgOiBwaHlzaWNhbF9hZGRyCisgKiAgICAgICBUeXBlCSAgICAJOiBjb25zdCB1MzIKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IFBoeXNpY2FsIEFkZHJlc3MgdG8gd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcKKyAqCQkJIHZpcnR1YWwgICBBZGRyZXNzIHNob3VsZHBvaW50CisgKgorICogICAgICAgSWRlbnRpZmllciAgICAgIDogZW5kaWFuaXNtCisgKiAgICAgICBUeXBlCSAgICAJOiBod19lbmRpYW5pc21fdAorICogICAgICAgRGVzY3JpcHRpb24gICAgIDogZW5kaWFuaXNtIGZvciB0aGUgZ2l2ZW4gcGFnZQorICoKKyAqICAgICAgIElkZW50aWZpZXIgICAgICA6IGVsZW1lbnRfc2l6ZQorICogICAgICAgVHlwZQkgICAgCTogaHdfZWxlbWVudF9zaXplX3QKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IFRoZSBlbGVtZW50IHNpemUgKCA4LDE2LCAzMiBvciA2NCBiaXQpCisgKgorICogICAgICAgSWRlbnRpZmllciAgICAgIDogbWl4ZWRfc2l6ZQorICogICAgICAgVHlwZQkgICAgCTogaHdfbW11X21peGVkX3NpemVfdAorICogICAgICAgRGVzY3JpcHRpb24gICAgIDogRWxlbWVudCBTaXplIHRvIGZvbGxvdyBDUFUgb3IgVExCCisgKgorICogUkVUVVJOUzoKKyAqCisgKiAgICAgICBUeXBlCSAgICAJOiBod19zdGF0dXMKKyAqICAgICAgIERlc2NyaXB0aW9uICAgICA6IDAJCSAtLSBObyBlcnJvcnMgb2NjdXJlZAorICoJCQkgUkVUX0JBRF9OVUxMX1BBUkFNICAgICAtLSBBIFBvaW50ZXIgUGFyYW1hdGVyCisgKgkJCQkJCQl3YXMgc2V0IHRvIE5VTEwKKyAqCQkJIFJFVF9QQVJBTV9PVVRfT0ZfUkFOR0UgLS0gSW5wdXQgUGFyYW1ldGVyCisgKgkJCQkJCQlvdXQgb2YgUmFuZ2UKKyAqCisgKiBQVVJQT1NFOgkgICAgICA6IFNldCBNTVVfQ0FNIHJlZworICoKKyAqIE1FVEhPRDoJICAgICAgIDogQ2hlY2sgdGhlIElucHV0IHBhcmFtZXRlcnMgYW5kIHNldCB0aGUgUkFNIGVudHJ5LgorICovCitzdGF0aWMgaHdfc3RhdHVzIG1tdV9zZXRfcmFtX2VudHJ5KGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAorCQkJCSAgIGNvbnN0IHUzMiBwaHlzaWNhbF9hZGRyLAorCQkJCSAgIGVudW0gaHdfZW5kaWFuaXNtX3QgZW5kaWFuaXNtLAorCQkJCSAgIGVudW0gaHdfZWxlbWVudF9zaXplX3QgZWxlbWVudF9zaXplLAorCQkJCSAgIGVudW0gaHdfbW11X21peGVkX3NpemVfdCBtaXhlZF9zaXplKTsKKworLyogSFcgRlVOQ1RJT05TICovCisKK2h3X3N0YXR1cyBod19tbXVfZW5hYmxlKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCisJTU1VTU1VX0NOVExNTVVfRU5BQkxFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCBIV19TRVQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaHdfc3RhdHVzIGh3X21tdV9kaXNhYmxlKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCisJTU1VTU1VX0NOVExNTVVfRU5BQkxFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCBIV19DTEVBUik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X251bV9sb2NrZWRfc2V0KGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAorCQkJCXUzMiBudW1fbG9ja2VkX2VudHJpZXMpCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisKKwlNTVVNTVVfTE9DS19CQVNFX1ZBTFVFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCBudW1fbG9ja2VkX2VudHJpZXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaHdfc3RhdHVzIGh3X21tdV92aWN0aW1fbnVtX3NldChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQl1MzIgdmljdGltX2VudHJ5X251bSkKK3sKKwlod19zdGF0dXMgc3RhdHVzID0gMDsKKworCU1NVU1NVV9MT0NLX0NVUlJFTlRfVklDVElNX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCB2aWN0aW1fZW50cnlfbnVtKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2h3X3N0YXR1cyBod19tbXVfZXZlbnRfYWNrKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLCB1MzIgaXJxX21hc2spCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisKKwlNTVVNTVVfSVJRU1RBVFVTX1dSSVRFX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzLCBpcnFfbWFzayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X2V2ZW50X2Rpc2FibGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsIHUzMiBpcnFfbWFzaykKK3sKKwlod19zdGF0dXMgc3RhdHVzID0gMDsKKwl1MzIgaXJxX3JlZzsKKworCWlycV9yZWcgPSBNTVVNTVVfSVJRRU5BQkxFX1JFQURfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MpOworCisJTU1VTU1VX0lSUUVOQUJMRV9XUklURV9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcywgaXJxX3JlZyAmIH5pcnFfbWFzayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X2V2ZW50X2VuYWJsZShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdTMyIGlycV9tYXNrKQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCXUzMiBpcnFfcmVnOworCisJaXJxX3JlZyA9IE1NVU1NVV9JUlFFTkFCTEVfUkVBRF9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcyk7CisKKwlNTVVNTVVfSVJRRU5BQkxFX1dSSVRFX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzLCBpcnFfcmVnIHwgaXJxX21hc2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaHdfc3RhdHVzIGh3X21tdV9ldmVudF9zdGF0dXMoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsIHUzMiAqaXJxX21hc2spCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisKKwkqaXJxX21hc2sgPSBNTVVNTVVfSVJRU1RBVFVTX1JFQURfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaHdfc3RhdHVzIGh3X21tdV9mYXVsdF9hZGRyX3JlYWQoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsIHUzMiAqYWRkcikKK3sKKwlod19zdGF0dXMgc3RhdHVzID0gMDsKKworCS8qIHJlYWQgdmFsdWVzIGZyb20gcmVnaXN0ZXIgKi8KKwkqYWRkciA9IE1NVU1NVV9GQVVMVF9BRF9SRUFEX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2h3X3N0YXR1cyBod19tbXVfdHRiX3NldChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdTMyIHR0Yl9waHlzX2FkZHIpCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisJdTMyIGxvYWRfdHRiOworCisJbG9hZF90dGIgPSB0dGJfcGh5c19hZGRyICYgfjB4N0ZVTDsKKwkvKiB3cml0ZSB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KKwlNTVVNTVVfVFRCX1dSSVRFX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzLCBsb2FkX3R0Yik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X3R3bF9lbmFibGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisKKwlNTVVNTVVfQ05UTFRXTF9FTkFCTEVfV1JJVEUzMihiYXNlX2FkZHJlc3MsIEhXX1NFVCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X3R3bF9kaXNhYmxlKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCisJTU1VTU1VX0NOVExUV0xfRU5BQkxFX1dSSVRFMzIoYmFzZV9hZGRyZXNzLCBIV19DTEVBUik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X3RsYl9mbHVzaChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdTMyIHZpcnR1YWxfYWRkciwKKwkJCSAgIHUzMiBwYWdlX3N6KQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCXUzMiB2aXJ0dWFsX2FkZHJfdGFnOworCWVudW0gaHdfbW11X3BhZ2Vfc2l6ZV90IHBnX3NpemVfYml0czsKKworCXN3aXRjaCAocGFnZV9zeikgeworCWNhc2UgSFdfUEFHRV9TSVpFNEtCOgorCQlwZ19zaXplX2JpdHMgPSBIV19NTVVfU01BTExfUEFHRTsKKwkJYnJlYWs7CisKKwljYXNlIEhXX1BBR0VfU0laRTY0S0I6CisJCXBnX3NpemVfYml0cyA9IEhXX01NVV9MQVJHRV9QQUdFOworCQlicmVhazsKKworCWNhc2UgSFdfUEFHRV9TSVpFMU1COgorCQlwZ19zaXplX2JpdHMgPSBIV19NTVVfU0VDVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEhXX1BBR0VfU0laRTE2TUI6CisJCXBnX3NpemVfYml0cyA9IEhXX01NVV9TVVBFUlNFQ1RJT047CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2VuZXJhdGUgdGhlIDIwLWJpdCB0YWcgZnJvbSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl2aXJ0dWFsX2FkZHJfdGFnID0gKCh2aXJ0dWFsX2FkZHIgJiBNTVVfQUREUl9NQVNLKSA+PiAxMik7CisKKwltbXVfc2V0X2NhbV9lbnRyeShiYXNlX2FkZHJlc3MsIHBnX3NpemVfYml0cywgMCwgMCwgdmlydHVhbF9hZGRyX3RhZyk7CisKKwltbXVfZmx1c2hfZW50cnkoYmFzZV9hZGRyZXNzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2h3X3N0YXR1cyBod19tbXVfdGxiX2FkZChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCSB1MzIgcGh5c2ljYWxfYWRkciwKKwkJCSB1MzIgdmlydHVhbF9hZGRyLAorCQkJIHUzMiBwYWdlX3N6LAorCQkJIHUzMiBlbnRyeV9udW0sCisJCQkgc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCAqbWFwX2F0dHJzLAorCQkJIHM4IHByZXNlcnZlZF9iaXQsIHM4IHZhbGlkX2JpdCkKK3sKKwlod19zdGF0dXMgc3RhdHVzID0gMDsKKwl1MzIgbG9ja19yZWc7CisJdTMyIHZpcnR1YWxfYWRkcl90YWc7CisJZW51bSBod19tbXVfcGFnZV9zaXplX3QgbW11X3BnX3NpemU7CisKKwkvKkNoZWNrIHRoZSBpbnB1dCBQYXJhbWV0ZXJzICovCisJc3dpdGNoIChwYWdlX3N6KSB7CisJY2FzZSBIV19QQUdFX1NJWkU0S0I6CisJCW1tdV9wZ19zaXplID0gSFdfTU1VX1NNQUxMX1BBR0U7CisJCWJyZWFrOworCisJY2FzZSBIV19QQUdFX1NJWkU2NEtCOgorCQltbXVfcGdfc2l6ZSA9IEhXX01NVV9MQVJHRV9QQUdFOworCQlicmVhazsKKworCWNhc2UgSFdfUEFHRV9TSVpFMU1COgorCQltbXVfcGdfc2l6ZSA9IEhXX01NVV9TRUNUSU9OOworCQlicmVhazsKKworCWNhc2UgSFdfUEFHRV9TSVpFMTZNQjoKKwkJbW11X3BnX3NpemUgPSBIV19NTVVfU1VQRVJTRUNUSU9OOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2tfcmVnID0gTU1VTU1VX0xPQ0tfUkVBRF9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcyk7CisKKwkvKiBHZW5lcmF0ZSB0aGUgMjAtYml0IHRhZyBmcm9tIHZpcnR1YWwgYWRkcmVzcyAqLworCXZpcnR1YWxfYWRkcl90YWcgPSAoKHZpcnR1YWxfYWRkciAmIE1NVV9BRERSX01BU0spID4+IDEyKTsKKworCS8qIFdyaXRlIHRoZSBmaWVsZHMgaW4gdGhlIENBTSBFbnRyeSBSZWdpc3RlciAqLworCW1tdV9zZXRfY2FtX2VudHJ5KGJhc2VfYWRkcmVzcywgbW11X3BnX3NpemUsIHByZXNlcnZlZF9iaXQsIHZhbGlkX2JpdCwKKwkJCSAgdmlydHVhbF9hZGRyX3RhZyk7CisKKwkvKiBXcml0ZSB0aGUgZGlmZmVyZW50IGZpZWxkcyBvZiB0aGUgUkFNIEVudHJ5IFJlZ2lzdGVyICovCisJLyogZW5kaWFuaXNtIG9mIHRoZSBwYWdlLEVsZW1lbnQgU2l6ZSBvZiB0aGUgcGFnZSAoOCwgMTYsIDMyLCA2NCBiaXQpICovCisJbW11X3NldF9yYW1fZW50cnkoYmFzZV9hZGRyZXNzLCBwaHlzaWNhbF9hZGRyLCBtYXBfYXR0cnMtPmVuZGlhbmlzbSwKKwkJCSAgbWFwX2F0dHJzLT5lbGVtZW50X3NpemUsIG1hcF9hdHRycy0+bWl4ZWRfc2l6ZSk7CisKKwkvKiBVcGRhdGUgdGhlIE1NVSBMb2NrIFJlZ2lzdGVyICovCisJLyogY3VycmVudFZpY3RpbSBiZXR3ZWVuIGxvY2tlZEJhc2VWYWx1ZSBhbmQgKE1NVV9FbnRyaWVzX051bWJlciAtIDEpICovCisJTU1VTU1VX0xPQ0tfQ1VSUkVOVF9WSUNUSU1fV1JJVEUzMihiYXNlX2FkZHJlc3MsIGVudHJ5X251bSk7CisKKwkvKiBFbmFibGUgbG9hZGluZyBvZiBhbiBlbnRyeSBpbiBUTEIgYnkgd3JpdGluZyAxCisJICAgaW50byBMRF9UTEJfUkVHIHJlZ2lzdGVyICovCisJTU1VTU1VX0xEX1RMQl9XUklURV9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcywgTU1VX0xPQURfVExCKTsKKworCU1NVU1NVV9MT0NLX1dSSVRFX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzLCBsb2NrX3JlZyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitod19zdGF0dXMgaHdfbW11X3B0ZV9zZXQoY29uc3QgdTMyIHBnX3RibF92YSwKKwkJCSB1MzIgcGh5c2ljYWxfYWRkciwKKwkJCSB1MzIgdmlydHVhbF9hZGRyLAorCQkJIHUzMiBwYWdlX3N6LCBzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190ICptYXBfYXR0cnMpCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisJdTMyIHB0ZV9hZGRyLCBwdGVfdmFsOworCXMzMiBudW1fZW50cmllcyA9IDE7CisKKwlzd2l0Y2ggKHBhZ2Vfc3opIHsKKwljYXNlIEhXX1BBR0VfU0laRTRLQjoKKwkJcHRlX2FkZHIgPSBod19tbXVfcHRlX2FkZHJfbDIocGdfdGJsX3ZhLAorCQkJCQkgICAgICB2aXJ0dWFsX2FkZHIgJgorCQkJCQkgICAgICBNTVVfU01BTExfUEFHRV9NQVNLKTsKKwkJcHRlX3ZhbCA9CisJCSAgICAoKHBoeXNpY2FsX2FkZHIgJiBNTVVfU01BTExfUEFHRV9NQVNLKSB8CisJCSAgICAgKG1hcF9hdHRycy0+ZW5kaWFuaXNtIDw8IDkpIHwgKG1hcF9hdHRycy0+CisJCQkJCQkgICAgZWxlbWVudF9zaXplIDw8IDQpIHwKKwkJICAgICAobWFwX2F0dHJzLT5taXhlZF9zaXplIDw8IDExKSB8IDIpOworCQlicmVhazsKKworCWNhc2UgSFdfUEFHRV9TSVpFNjRLQjoKKwkJbnVtX2VudHJpZXMgPSAxNjsKKwkJcHRlX2FkZHIgPSBod19tbXVfcHRlX2FkZHJfbDIocGdfdGJsX3ZhLAorCQkJCQkgICAgICB2aXJ0dWFsX2FkZHIgJgorCQkJCQkgICAgICBNTVVfTEFSR0VfUEFHRV9NQVNLKTsKKwkJcHRlX3ZhbCA9CisJCSAgICAoKHBoeXNpY2FsX2FkZHIgJiBNTVVfTEFSR0VfUEFHRV9NQVNLKSB8CisJCSAgICAgKG1hcF9hdHRycy0+ZW5kaWFuaXNtIDw8IDkpIHwgKG1hcF9hdHRycy0+CisJCQkJCQkgICAgZWxlbWVudF9zaXplIDw8IDQpIHwKKwkJICAgICAobWFwX2F0dHJzLT5taXhlZF9zaXplIDw8IDExKSB8IDEpOworCQlicmVhazsKKworCWNhc2UgSFdfUEFHRV9TSVpFMU1COgorCQlwdGVfYWRkciA9IGh3X21tdV9wdGVfYWRkcl9sMShwZ190YmxfdmEsCisJCQkJCSAgICAgIHZpcnR1YWxfYWRkciAmCisJCQkJCSAgICAgIE1NVV9TRUNUSU9OX0FERFJfTUFTSyk7CisJCXB0ZV92YWwgPQorCQkgICAgKCgoKHBoeXNpY2FsX2FkZHIgJiBNTVVfU0VDVElPTl9BRERSX01BU0spIHwKKwkJICAgICAgIChtYXBfYXR0cnMtPmVuZGlhbmlzbSA8PCAxNSkgfCAobWFwX2F0dHJzLT4KKwkJCQkJCSAgICAgICBlbGVtZW50X3NpemUgPDwgMTApIHwKKwkJICAgICAgIChtYXBfYXR0cnMtPm1peGVkX3NpemUgPDwgMTcpKSAmIH4weDQwMDAwKSB8IDB4Mik7CisJCWJyZWFrOworCisJY2FzZSBIV19QQUdFX1NJWkUxNk1COgorCQludW1fZW50cmllcyA9IDE2OworCQlwdGVfYWRkciA9IGh3X21tdV9wdGVfYWRkcl9sMShwZ190YmxfdmEsCisJCQkJCSAgICAgIHZpcnR1YWxfYWRkciAmCisJCQkJCSAgICAgIE1NVV9TU0VDVElPTl9BRERSX01BU0spOworCQlwdGVfdmFsID0KKwkJICAgICgoKHBoeXNpY2FsX2FkZHIgJiBNTVVfU1NFQ1RJT05fQUREUl9NQVNLKSB8CisJCSAgICAgIChtYXBfYXR0cnMtPmVuZGlhbmlzbSA8PCAxNSkgfCAobWFwX2F0dHJzLT4KKwkJCQkJCSAgICAgIGVsZW1lbnRfc2l6ZSA8PCAxMCkgfAorCQkgICAgICAobWFwX2F0dHJzLT5taXhlZF9zaXplIDw8IDE3KQorCQkgICAgICkgfCAweDQwMDAwIHwgMHgyKTsKKwkJYnJlYWs7CisKKwljYXNlIEhXX01NVV9DT0FSU0VfUEFHRV9TSVpFOgorCQlwdGVfYWRkciA9IGh3X21tdV9wdGVfYWRkcl9sMShwZ190YmxfdmEsCisJCQkJCSAgICAgIHZpcnR1YWxfYWRkciAmCisJCQkJCSAgICAgIE1NVV9TRUNUSU9OX0FERFJfTUFTSyk7CisJCXB0ZV92YWwgPSAocGh5c2ljYWxfYWRkciAmIE1NVV9QQUdFX1RBQkxFX01BU0spIHwgMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3aGlsZSAoLS1udW1fZW50cmllcyA+PSAwKQorCQkoKHUzMiAqKSBwdGVfYWRkcilbbnVtX2VudHJpZXNdID0gcHRlX3ZhbDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2h3X3N0YXR1cyBod19tbXVfcHRlX2NsZWFyKGNvbnN0IHUzMiBwZ190YmxfdmEsIHUzMiB2aXJ0dWFsX2FkZHIsIHUzMiBwYWdlX3NpemUpCit7CisJaHdfc3RhdHVzIHN0YXR1cyA9IDA7CisJdTMyIHB0ZV9hZGRyOworCXMzMiBudW1fZW50cmllcyA9IDE7CisKKwlzd2l0Y2ggKHBhZ2Vfc2l6ZSkgeworCWNhc2UgSFdfUEFHRV9TSVpFNEtCOgorCQlwdGVfYWRkciA9IGh3X21tdV9wdGVfYWRkcl9sMihwZ190YmxfdmEsCisJCQkJCSAgICAgIHZpcnR1YWxfYWRkciAmCisJCQkJCSAgICAgIE1NVV9TTUFMTF9QQUdFX01BU0spOworCQlicmVhazsKKworCWNhc2UgSFdfUEFHRV9TSVpFNjRLQjoKKwkJbnVtX2VudHJpZXMgPSAxNjsKKwkJcHRlX2FkZHIgPSBod19tbXVfcHRlX2FkZHJfbDIocGdfdGJsX3ZhLAorCQkJCQkgICAgICB2aXJ0dWFsX2FkZHIgJgorCQkJCQkgICAgICBNTVVfTEFSR0VfUEFHRV9NQVNLKTsKKwkJYnJlYWs7CisKKwljYXNlIEhXX1BBR0VfU0laRTFNQjoKKwljYXNlIEhXX01NVV9DT0FSU0VfUEFHRV9TSVpFOgorCQlwdGVfYWRkciA9IGh3X21tdV9wdGVfYWRkcl9sMShwZ190YmxfdmEsCisJCQkJCSAgICAgIHZpcnR1YWxfYWRkciAmCisJCQkJCSAgICAgIE1NVV9TRUNUSU9OX0FERFJfTUFTSyk7CisJCWJyZWFrOworCisJY2FzZSBIV19QQUdFX1NJWkUxNk1COgorCQludW1fZW50cmllcyA9IDE2OworCQlwdGVfYWRkciA9IGh3X21tdV9wdGVfYWRkcl9sMShwZ190YmxfdmEsCisJCQkJCSAgICAgIHZpcnR1YWxfYWRkciAmCisJCQkJCSAgICAgIE1NVV9TU0VDVElPTl9BRERSX01BU0spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdoaWxlICgtLW51bV9lbnRyaWVzID49IDApCisJCSgodTMyICopIHB0ZV9hZGRyKVtudW1fZW50cmllc10gPSAwOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogbW11X2ZsdXNoX2VudHJ5ICovCitzdGF0aWMgaHdfc3RhdHVzIG1tdV9mbHVzaF9lbnRyeShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcykKK3sKKwlod19zdGF0dXMgc3RhdHVzID0gMDsKKwl1MzIgZmx1c2hfZW50cnlfZGF0YSA9IDB4MTsKKworCS8qIHdyaXRlIHZhbHVlcyB0byByZWdpc3RlciAqLworCU1NVU1NVV9GTFVTSF9FTlRSWV9XUklURV9SRUdJU1RFUjMyKGJhc2VfYWRkcmVzcywgZmx1c2hfZW50cnlfZGF0YSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBtbXVfc2V0X2NhbV9lbnRyeSAqLworc3RhdGljIGh3X3N0YXR1cyBtbXVfc2V0X2NhbV9lbnRyeShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQkgICBjb25zdCB1MzIgcGFnZV9zeiwKKwkJCQkgICBjb25zdCB1MzIgcHJlc2VydmVkX2JpdCwKKwkJCQkgICBjb25zdCB1MzIgdmFsaWRfYml0LAorCQkJCSAgIGNvbnN0IHUzMiB2aXJ0dWFsX2FkZHJfdGFnKQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCXUzMiBtbXVfY2FtX3JlZzsKKworCW1tdV9jYW1fcmVnID0gKHZpcnR1YWxfYWRkcl90YWcgPDwgMTIpOworCW1tdV9jYW1fcmVnID0gKG1tdV9jYW1fcmVnKSB8IChwYWdlX3N6KSB8ICh2YWxpZF9iaXQgPDwgMikgfAorCSAgICAocHJlc2VydmVkX2JpdCA8PCAzKTsKKworCS8qIHdyaXRlIHZhbHVlcyB0byByZWdpc3RlciAqLworCU1NVU1NVV9DQU1fV1JJVEVfUkVHSVNURVIzMihiYXNlX2FkZHJlc3MsIG1tdV9jYW1fcmVnKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIG1tdV9zZXRfcmFtX2VudHJ5ICovCitzdGF0aWMgaHdfc3RhdHVzIG1tdV9zZXRfcmFtX2VudHJ5KGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAorCQkJCSAgIGNvbnN0IHUzMiBwaHlzaWNhbF9hZGRyLAorCQkJCSAgIGVudW0gaHdfZW5kaWFuaXNtX3QgZW5kaWFuaXNtLAorCQkJCSAgIGVudW0gaHdfZWxlbWVudF9zaXplX3QgZWxlbWVudF9zaXplLAorCQkJCSAgIGVudW0gaHdfbW11X21peGVkX3NpemVfdCBtaXhlZF9zaXplKQoreworCWh3X3N0YXR1cyBzdGF0dXMgPSAwOworCXUzMiBtbXVfcmFtX3JlZzsKKworCW1tdV9yYW1fcmVnID0gKHBoeXNpY2FsX2FkZHIgJiBNTVVfQUREUl9NQVNLKTsKKwltbXVfcmFtX3JlZyA9IChtbXVfcmFtX3JlZykgfCAoKGVuZGlhbmlzbSA8PCA5KSB8IChlbGVtZW50X3NpemUgPDwgNykgfAorCQkJCSAgICAgICAobWl4ZWRfc2l6ZSA8PCA2KSk7CisKKwkvKiB3cml0ZSB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KKwlNTVVNTVVfUkFNX1dSSVRFX1JFR0lTVEVSMzIoYmFzZV9hZGRyZXNzLCBtbXVfcmFtX3JlZyk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKK3ZvaWQgaHdfbW11X3RsYl9mbHVzaF9hbGwoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlKQoreworCV9fcmF3X3dyaXRlYigxLCBiYXNlICsgTU1VX0dGTFVTSCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvaHdfbW11LmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvaHdfbW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1OGEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9od19tbXUuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIGh3X21tdS5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIE1NVSB0eXBlcyBhbmQgQVBJIGRlY2xhcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9IV19NTVVfSAorI2RlZmluZSBfSFdfTU1VX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEJpdG1hc2tzIGZvciBpbnRlcnJ1cHQgc291cmNlcyAqLworI2RlZmluZSBIV19NTVVfVFJBTlNMQVRJT05fRkFVTFQgICAweDIKKyNkZWZpbmUgSFdfTU1VX0FMTF9JTlRFUlJVUFRTICAgICAgMHgxRgorCisjZGVmaW5lIEhXX01NVV9DT0FSU0VfUEFHRV9TSVpFIDB4NDAwCisKKy8qIGh3X21tdV9taXhlZF9zaXplX3Q6ICBFbnVtZXJhdGVkIFR5cGUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gZm9sbG93CisJCQlDUFUvVExCIEVsZW1lbnQgc2l6ZSAqLworZW51bSBod19tbXVfbWl4ZWRfc2l6ZV90IHsKKwlIV19NTVVfVExCRVMsCisJSFdfTU1VX0NQVUVTCit9OworCisvKiBod19tbXVfbWFwX2F0dHJzX3Q6ICBTdHJ1Y3QgY29udGFpbmluZyBNTVUgbWFwcGluZyBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190IHsKKwllbnVtIGh3X2VuZGlhbmlzbV90IGVuZGlhbmlzbTsKKwllbnVtIGh3X2VsZW1lbnRfc2l6ZV90IGVsZW1lbnRfc2l6ZTsKKwllbnVtIGh3X21tdV9taXhlZF9zaXplX3QgbWl4ZWRfc2l6ZTsKKwlib29sIGRvbm90bG9ja21wdXBhZ2U7Cit9OworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV9lbmFibGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpOworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV9kaXNhYmxlKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKTsKKworZXh0ZXJuIGh3X3N0YXR1cyBod19tbXVfbnVtX2xvY2tlZF9zZXQoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCisJCQkJICAgICAgIHUzMiBudW1fbG9ja2VkX2VudHJpZXMpOworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV92aWN0aW1fbnVtX3NldChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQkgICAgICAgdTMyIHZpY3RpbV9lbnRyeV9udW0pOworCisvKiBGb3IgTU1VIGZhdWx0cyAqLworZXh0ZXJuIGh3X3N0YXR1cyBod19tbXVfZXZlbnRfYWNrKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAorCQkJCSAgdTMyIGlycV9tYXNrKTsKKworZXh0ZXJuIGh3X3N0YXR1cyBod19tbXVfZXZlbnRfZGlzYWJsZShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQkgICAgICB1MzIgaXJxX21hc2spOworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV9ldmVudF9lbmFibGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCisJCQkJICAgICB1MzIgaXJxX21hc2spOworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV9ldmVudF9zdGF0dXMoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCisJCQkJICAgICB1MzIgKmlycV9tYXNrKTsKKworZXh0ZXJuIGh3X3N0YXR1cyBod19tbXVfZmF1bHRfYWRkcl9yZWFkKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAorCQkJCQl1MzIgKmFkZHIpOworCisvKiBTZXQgdGhlIFRUIGJhc2UgYWRkcmVzcyAqLworZXh0ZXJuIGh3X3N0YXR1cyBod19tbXVfdHRiX3NldChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQl1MzIgdHRiX3BoeXNfYWRkcik7CisKK2V4dGVybiBod19zdGF0dXMgaHdfbW11X3R3bF9lbmFibGUoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpOworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV90d2xfZGlzYWJsZShjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcyk7CisKK2V4dGVybiBod19zdGF0dXMgaHdfbW11X3RsYl9mbHVzaChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQkgIHUzMiB2aXJ0dWFsX2FkZHIsIHUzMiBwYWdlX3N6KTsKKworZXh0ZXJuIGh3X3N0YXR1cyBod19tbXVfdGxiX2FkZChjb25zdCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJCQl1MzIgcGh5c2ljYWxfYWRkciwKKwkJCQl1MzIgdmlydHVhbF9hZGRyLAorCQkJCXUzMiBwYWdlX3N6LAorCQkJCXUzMiBlbnRyeV9udW0sCisJCQkJc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCAqbWFwX2F0dHJzLAorCQkJCXM4IHByZXNlcnZlZF9iaXQsIHM4IHZhbGlkX2JpdCk7CisKKy8qIEZvciBQVEVzICovCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV9wdGVfc2V0KGNvbnN0IHUzMiBwZ190YmxfdmEsCisJCQkJdTMyIHBoeXNpY2FsX2FkZHIsCisJCQkJdTMyIHZpcnR1YWxfYWRkciwKKwkJCQl1MzIgcGFnZV9zeiwKKwkJCQlzdHJ1Y3QgaHdfbW11X21hcF9hdHRyc190ICptYXBfYXR0cnMpOworCitleHRlcm4gaHdfc3RhdHVzIGh3X21tdV9wdGVfY2xlYXIoY29uc3QgdTMyIHBnX3RibF92YSwKKwkJCQkgIHUzMiB2aXJ0dWFsX2FkZHIsIHUzMiBwYWdlX3NpemUpOworCit2b2lkIGh3X21tdV90bGJfZmx1c2hfYWxsKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZSk7CisKK3N0YXRpYyBpbmxpbmUgdTMyIGh3X21tdV9wdGVfYWRkcl9sMSh1MzIgbDFfYmFzZSwgdTMyIHZhKQoreworCXUzMiBwdGVfYWRkcjsKKwl1MzIgdmEzMV90bzIwOworCisJdmEzMV90bzIwID0gdmEgPj4gKDIwIC0gMik7CS8qIExlZnQtc2hpZnQgYnkgMiBoZXJlIGl0c2VsZiAqLworCXZhMzFfdG8yMCAmPSAweEZGRkZGRkZDVUw7CisJcHRlX2FkZHIgPSBsMV9iYXNlICsgdmEzMV90bzIwOworCisJcmV0dXJuIHB0ZV9hZGRyOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBod19tbXVfcHRlX2FkZHJfbDIodTMyIGwyX2Jhc2UsIHUzMiB2YSkKK3sKKwl1MzIgcHRlX2FkZHI7CisKKwlwdGVfYWRkciA9IChsMl9iYXNlICYgMHhGRkZGRkMwMCkgfCAoKHZhID4+IDEwKSAmIDB4M0ZDKTsKKworCXJldHVybiBwdGVfYWRkcjsKK30KKworc3RhdGljIGlubGluZSB1MzIgaHdfbW11X3B0ZV9jb2Fyc2VfbDEodTMyIHB0ZV92YWwpCit7CisJdTMyIHB0ZV9jb2Fyc2U7CisKKwlwdGVfY29hcnNlID0gcHRlX3ZhbCAmIDB4RkZGRkZDMDA7CisKKwlyZXR1cm4gcHRlX2NvYXJzZTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaHdfbW11X3B0ZV9zaXplX2wxKHUzMiBwdGVfdmFsKQoreworCXUzMiBwdGVfc2l6ZSA9IDA7CisKKwlpZiAoKHB0ZV92YWwgJiAweDMpID09IDB4MSkgeworCQkvKiBQb2ludHMgdG8gTDIgUFQgKi8KKwkJcHRlX3NpemUgPSBIV19NTVVfQ09BUlNFX1BBR0VfU0laRTsKKwl9CisKKwlpZiAoKHB0ZV92YWwgJiAweDMpID09IDB4MikgeworCQlpZiAocHRlX3ZhbCAmICgxIDw8IDE4KSkKKwkJCXB0ZV9zaXplID0gSFdfUEFHRV9TSVpFMTZNQjsKKwkJZWxzZQorCQkJcHRlX3NpemUgPSBIV19QQUdFX1NJWkUxTUI7CisJfQorCisJcmV0dXJuIHB0ZV9zaXplOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBod19tbXVfcHRlX3NpemVfbDIodTMyIHB0ZV92YWwpCit7CisJdTMyIHB0ZV9zaXplID0gMDsKKworCWlmIChwdGVfdmFsICYgMHgyKQorCQlwdGVfc2l6ZSA9IEhXX1BBR0VfU0laRTRLQjsKKwllbHNlIGlmIChwdGVfdmFsICYgMHgxKQorCQlwdGVfc2l6ZSA9IEhXX1BBR0VfU0laRTY0S0I7CisKKwlyZXR1cm4gcHRlX3NpemU7Cit9CisKKyNlbmRpZiAvKiBfSFdfTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9fY2hubF9zbS5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL19jaG5sX3NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmZDFmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9fY2hubF9zbS5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogX2Nobmxfc20uaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBQcml2YXRlIGhlYWRlciBmaWxlIGRlZmluaW5nIGNoYW5uZWwgbWFuYWdlciBhbmQgY2hhbm5lbCBvYmplY3RzIGZvcgorICogYSBzaGFyZWQgbWVtb3J5IGNoYW5uZWwgZHJpdmVyLgorICoKKyAqIFNoYXJlZCBiZXR3ZWVuIHRoZSBtb2R1bGVzIGltcGxlbWVudGluZyB0aGUgc2hhcmVkIG1lbW9yeSBjaGFubmVsIGNsYXNzCisgKiBsaWJyYXJ5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX0NITkxfU01fCisjZGVmaW5lIF9DSE5MX1NNXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGFwaS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkZWZzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvbGlzdC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9udGZ5Lmg+CisKKy8qCisgKiAgVGhlc2UgdGFyZ2V0IHNpZGUgc3ltYm9scyBkZWZpbmUgdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcworICogIG9mIHNoYXJlZCBtZW1vcnkgYnVmZmVyLiBUaGV5IGFyZSBkZWZpbmVkIGluIHRoZSAqY2ZnLmNtZCBmaWxlIGJ5CisgKiAgY2RiIGNvZGUuCisgKi8KKyNkZWZpbmUgQ0hOTF9TSEFSRURfQlVGRkVSX0JBU0VfU1lNICJfU0hNX0JFRyIKKyNkZWZpbmUgQ0hOTF9TSEFSRURfQlVGRkVSX0xJTUlUX1NZTSAiX1NITV9FTkQiCisjZGVmaW5lIEJSSURHRUlOSVRfQklPU0dQVElNRVIgIl9CUklER0VJTklUX0JJT1NHUFRJTUVSIgorI2RlZmluZSBCUklER0VJTklUX0xPQURNT05fR1BUSU1FUiAiX0JSSURHRUlOSVRfTE9BRE1PTl9HUFRJTUVSIgorCisjaWZuZGVmIF9DSE5MX1dPUkRTSVpFCisjZGVmaW5lIF9DSE5MX1dPUkRTSVpFIDQJLyogZGVmYXVsdCBfQ0hOTF9XT1JEU0laRSBpcyAyIGJ5dGVzL3dvcmQgKi8KKyNlbmRpZgorCisjZGVmaW5lIE1BWE9QUFMgMTYKKworLyogU2hhcmVkIG1lbW9yeSBjb25maWcgb3B0aW9ucyAqLworI2RlZmluZSBTSE1fQ1VSUk9QUAkwCS8qIFNldCBjdXJyZW50IE9QUCBpbiBzaG0gKi8KKyNkZWZpbmUgU0hNX09QUElORk8JMQkvKiBTZXQgZHNwIHZvbHRhZ2UgYW5kIGZyZXEgdGFibGUgdmFsdWVzICovCisjZGVmaW5lIFNITV9HRVRPUFAJMgkvKiBHZXQgb3BwIHJlcXVlc3RlZCBieSBEU1AgKi8KKworc3RydWN0IG9wcF90YWJsZV9lbnRyeSB7CisJdTMyIHZvbHRhZ2U7CisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgbWluX2ZyZXE7CisJdTMyIG1heF9mcmVxOworfTsKKworc3RydWN0IG9wcF9zdHJ1Y3QgeworCXUzMiBjdXJyX29wcF9wdDsKKwl1MzIgbnVtX29wcF9wdHM7CisJc3RydWN0IG9wcF90YWJsZV9lbnRyeSBvcHBfcG9pbnRbTUFYT1BQU107Cit9OworCisvKiBSZXF1ZXN0IHRvIE1QVSAqLworc3RydWN0IG9wcF9ycXN0X3N0cnVjdCB7CisJdTMyIHJxc3RfZHNwX2ZyZXE7CisJdTMyIHJxc3Rfb3BwX3B0OworfTsKKworLyogSW5mbyB0byBNUFUgKi8KK3N0cnVjdCBsb2FkX21vbl9zdHJ1Y3QgeworCXUzMiBjdXJyX2RzcF9sb2FkOworCXUzMiBjdXJyX2RzcF9mcmVxOworCXUzMiBwcmVkX2RzcF9sb2FkOworCXUzMiBwcmVkX2RzcF9mcmVxOworfTsKKworLyogU3RydWN0dXJlIGluIHNoYXJlZCBiZXR3ZWVuIERTUCBhbmQgUEMgZm9yIGNvbW11bmljYXRpb24uICovCitzdHJ1Y3Qgc2htIHsKKwl1MzIgZHNwX2ZyZWVfbWFzazsJLyogV3JpdHRlbiBieSBEU1AsIHJlYWQgYnkgUEMuICovCisJdTMyIGhvc3RfZnJlZV9tYXNrOwkvKiBXcml0dGVuIGJ5IFBDLCByZWFkIGJ5IERTUCAqLworCisJdTMyIGlucHV0X2Z1bGw7CQkvKiBJbnB1dCBjaGFubmVsIGhhcyB1bnJlYWQgZGF0YS4gKi8KKwl1MzIgaW5wdXRfaWQ7CQkvKiBDaGFubmVsIGZvciB3aGljaCBpbnB1dCBpcyBhdmFpbGFibGUuICovCisJdTMyIGlucHV0X3NpemU7CQkvKiBTaXplIG9mIGRhdGEgYmxvY2sgKGluIERTUCB3b3JkcykuICovCisKKwl1MzIgb3V0cHV0X2Z1bGw7CS8qIE91dHB1dCBjaGFubmVsIGhhcyB1bnJlYWQgZGF0YS4gKi8KKwl1MzIgb3V0cHV0X2lkOwkJLyogQ2hhbm5lbCBmb3Igd2hpY2ggb3V0cHV0IGlzIGF2YWlsYWJsZS4gKi8KKwl1MzIgb3V0cHV0X3NpemU7CS8qIFNpemUgb2YgZGF0YSBibG9jayAoaW4gRFNQIHdvcmRzKS4gKi8KKworCXUzMiBhcmc7CQkvKiBBcmcgZm9yIElzc3VlL1JlY2xhaW0gKDIzIGJpdHMgZm9yIDU1eCkuICovCisJdTMyIHJlc3ZkOwkJLyogS2VlcCBzdHJ1Y3R1cmUgc2l6ZSBldmVuIGZvciAzMi1iaXQgRFNQcyAqLworCisJLyogT3BlcmF0aW5nIFBvaW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCBvcHBfc3RydWN0IG9wcF90YWJsZV9zdHJ1Y3Q7CisJLyogT3BlcmF0aW5nIFBvaW50IFJlcXVlc3Qgc3RydWN0dXJlICovCisJc3RydWN0IG9wcF9ycXN0X3N0cnVjdCBvcHBfcmVxdWVzdDsKKwkvKiBsb2FkIG1vbml0b3IgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCisJc3RydWN0IGxvYWRfbW9uX3N0cnVjdCBsb2FkX21vbl9pbmZvOworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9XRFQzCisJLyogRmxhZyBmb3IgV0RUIGVuYWJsZS9kaXNhYmxlIEYvSSBjbG9ja3MgKi8KKwl1MzIgd2R0X3NldGNsb2NrczsKKwl1MzIgd2R0X292ZXJmbG93OwkvKiBXRFQgb3ZlcmZsb3cgdGltZSAqLworCWNoYXIgZHVtbXlbMTc2XTsJLyogcGFkZGluZyB0byAyNTYgYnl0ZSBib3VuZGFyeSAqLworI2Vsc2UKKwljaGFyIGR1bW15WzE4NF07CS8qIHBhZGRpbmcgdG8gMjU2IGJ5dGUgYm91bmRhcnkgKi8KKyNlbmRpZgorCXUzMiBzaG1fZGJnX3Zhcls2NF07CS8qIHNoYXJlZCBtZW1vcnkgZGVidWcgdmFyaWFibGVzICovCit9OworCisJLyogQ2hhbm5lbCBNYW5hZ2VyOiBvbmx5IG9uZSBjcmVhdGVkIHBlciBib2FyZDogKi8KK3N0cnVjdCBjaG5sX21nciB7CisJLyogRnVuY3Rpb24gaW50ZXJmYWNlIHRvIEJyaWRnZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyOwkvKiBJTyBtYW5hZ2VyICovCisJLyogRGV2aWNlIHRoaXMgYm9hcmQgcmVwcmVzZW50cyAqLworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iajsKKworCS8qIFRoZXNlIGZpZWxkcyBpbml0aWFsaXplZCBpbiBicmlkZ2VfY2hubF9jcmVhdGUoKTogKi8KKwl1MzIgZHdfb3V0cHV0X21hc2s7CS8qIEhvc3Qgb3V0cHV0IGNoYW5uZWxzIHcvIGZ1bGwgYnVmZmVycyAqLworCXUzMiBkd19sYXN0X291dHB1dDsJLyogTGFzdCBvdXRwdXQgY2hhbm5lbCBmaXJlZCBmcm9tIERQQyAqLworCS8qIENyaXRpY2FsIHNlY3Rpb24gb2JqZWN0IGhhbmRsZSAqLworCXNwaW5sb2NrX3QgY2hubF9tZ3JfbG9jazsKKwl1MzIgd29yZF9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyBvZiBEU1Agd29yZCAqLworCXU4IG1heF9jaGFubmVsczsJLyogVG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovCisJdTggb3Blbl9jaGFubmVsczsJLyogVG90YWwgbnVtYmVyIG9mIG9wZW4gY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgY2hubF9vYmplY3QgKiphcF9jaGFubmVsOwkvKiBBcnJheSBvZiBjaGFubmVscyAqLworCXU4IGR3X3R5cGU7CQkvKiBUeXBlIG9mIGNoYW5uZWwgY2xhc3MgbGlicmFyeSAqLworCS8qIElmIG5vIHNobSBzeW1zLCByZXR1cm4gZm9yIENITkxfT3BlbiAqLworCWludCBjaG5sX29wZW5fc3RhdHVzOworfTsKKworLyoKKyAqICBDaGFubmVsOiB1cCB0byBDSE5MX01BWENIQU5ORUxTIHBlciBib2FyZCBvciBpZiBEU1AtRE1BIHN1cHBvcnRlZCB0aGVuCisgKiAgICAgdXAgdG8gQ0hOTF9NQVhDSEFOTkVMUyArIENITkxfTUFYRERNQUNITkxTIHBlciBib2FyZC4KKyAqLworc3RydWN0IGNobmxfb2JqZWN0IHsKKwkvKiBQb2ludGVyIGJhY2sgdG8gY2hhbm5lbCBtYW5hZ2VyICovCisJc3RydWN0IGNobmxfbWdyICpjaG5sX21ncl9vYmo7CisJdTMyIGNobmxfaWQ7CQkvKiBDaGFubmVsIGlkICovCisJdTggZHdfc3RhdGU7CQkvKiBDdXJyZW50IGNoYW5uZWwgc3RhdGUgKi8KKwlzOCBjaG5sX21vZGU7CQkvKiBDaG5sIG1vZGUgYW5kIGF0dHJpYnV0ZXMgKi8KKwkvKiBDaG5sIEkvTyBjb21wbGV0aW9uIGV2ZW50ICh1c2VyIG1vZGUpICovCisJdm9pZCAqdXNlcl9ldmVudDsKKwkvKiBBYnN0cmFjdCBzeW5jcm9uaXphdGlvbiBvYmplY3QgKi8KKwlzdHJ1Y3Qgc3luY19vYmplY3QgKnN5bmNfZXZlbnQ7CisJdTMyIHByb2Nlc3M7CQkvKiBQcm9jZXNzIHdoaWNoIGNyZWF0ZWQgdGhpcyBjaGFubmVsICovCisJdTMyIHBjYl9hcmc7CQkvKiBBcmd1bWVudCB0byB1c2Ugd2l0aCBjYWxsYmFjayAqLworCXN0cnVjdCBsc3RfbGlzdCAqcGlvX3JlcXVlc3RzOwkvKiBMaXN0IG9mIElPUidzIHRvIGRyaXZlciAqLworCXMzMiBjaW9fY3M7CQkvKiBOdW1iZXIgb2YgSU9DJ3MgaW4gcXVldWUgKi8KKwlzMzIgY2lvX3JlcXM7CQkvKiBOdW1iZXIgb2YgSU9SZXF1ZXN0cyBpbiBxdWV1ZSAqLworCXMzMiBjaG5sX3BhY2tldHM7CS8qIEluaXRpYWwgbnVtYmVyIG9mIGZyZWUgSXJwcyAqLworCS8qIExpc3Qgb2YgSU9DJ3MgZnJvbSBkcml2ZXIgKi8KKwlzdHJ1Y3QgbHN0X2xpc3QgKnBpb19jb21wbGV0aW9uczsKKwlzdHJ1Y3QgbHN0X2xpc3QgKmZyZWVfcGFja2V0c19saXN0OwkvKiBMaXN0IG9mIGZyZWUgSXJwcyAqLworCXN0cnVjdCBudGZ5X29iamVjdCAqbnRmeV9vYmo7CisJdTMyIGJ5dGVzX21vdmVkOwkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCAqLworCisJLyogRm9yIERTUC1ETUEgKi8KKworCS8qIFR5cGUgb2YgY2hubCB0cmFuc3BvcnQ6Q0hOTF9bUENQWV1bRERNQV0gKi8KKwl1MzIgY2hubF90eXBlOworfTsKKworLyogSS9PIFJlcXVlc3QvY29tcGxldGlvbiBwYWNrZXQ6ICovCitzdHJ1Y3QgY2hubF9pcnAgeworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogTGluayB0byBuZXh0IENISVJQIGluIHF1ZXVlLiAqLworCS8qIEJ1ZmZlciB0byBiZSBmaWxsZWQvZW1wdGllZC4gKFVzZXIpICovCisJdTggKmhvc3RfdXNlcl9idWY7CisJLyogQnVmZmVyIHRvIGJlIGZpbGxlZC9lbXB0aWVkLiAoU3lzdGVtKSAqLworCXU4ICpob3N0X3N5c19idWY7CisJdTMyIGR3X2FyZzsJCS8qIElzc3VlL1JlY2xhaW0gYXJndW1lbnQuICovCisJdTMyIGRzcF90eF9hZGRyOwkvKiBUcmFuc2ZlciBhZGRyZXNzIG9uIERTUCBzaWRlLiAqLworCXUzMiBieXRlX3NpemU7CQkvKiBCeXRlcyB0cmFuc2ZlcnJlZC4gKi8KKwl1MzIgYnVmX3NpemU7CQkvKiBBY3R1YWwgYnVmZmVyIHNpemUgd2hlbiBhbGxvY2F0ZWQuICovCisJdTMyIHN0YXR1czsJCS8qIFN0YXR1cyBvZiBJTyBjb21wbGV0aW9uLiAqLworfTsKKworI2VuZGlmIC8qIF9DSE5MX1NNXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2JyZGRlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9icmRkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwZDlhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9icmRkZWZzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIGJyZGRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgQlJEIGNvbnN0YW50cyBhbmQgdHlwZXMsIHNoYXJlZCBiZXR3ZWVuIERTUCBBUEkgYW5kIEJyaWRnZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBCUkRERUZTXworI2RlZmluZSBCUkRERUZTXworCisvKiBwbGF0Zm9ybSBzdGF0dXMgdmFsdWVzICovCisjZGVmaW5lIEJSRF9TVE9QUEVEICAgICAweDAJLyogTm8gTW9uaXRvciBMb2FkZWQsIE5vdCBydW5uaW5nLiAqLworI2RlZmluZSBCUkRfSURMRSAgICAgICAgMHgxCS8qIE1vbml0b3IgTG9hZGVkLCBidXQgc3VzcGVuZGVkLiAqLworI2RlZmluZSBCUkRfUlVOTklORyAgICAgMHgyCS8qIE1vbml0b3IgbG9hZGVkLCBhbmQgZXhlY3V0aW5nLiAqLworI2RlZmluZSBCUkRfVU5LTk9XTiAgICAgMHgzCS8qIEJvYXJkIHN0YXRlIGlzIGluZGV0ZXJtaW5hdGUuICovCisjZGVmaW5lIEJSRF9TWU5DSU5JVCAgICAweDQKKyNkZWZpbmUgQlJEX0xPQURFRCAgICAgIDB4NQorI2RlZmluZSBCUkRfTEFTVFNUQVRFICAgQlJEX0xPQURFRAkvKiBTZXQgdG8gaGlnaGVzdCBsZWdhbCBib2FyZCBzdGF0ZS4gKi8KKyNkZWZpbmUgQlJEX1NMRUVQX1RSQU5TSVRJT04gMHg2CS8qIFNsZWVwIHRyYW5zaXRpb24gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgQlJEX0hJQkVSTkFUSU9OIDB4NwkvKiBNUFUgaW5pdGlhdGVkIGhpYmVybmF0aW9uICovCisjZGVmaW5lIEJSRF9SRVRFTlRJT04gICAgIDB4OAkvKiBSZXRlbnRpb24gbW9kZSAqLworI2RlZmluZSBCUkRfRFNQX0hJQkVSTkFUSU9OICAgICAweDkJLyogRFNQIGluaXRpYXRlZCBoaWJlcm5hdGlvbiAqLworI2RlZmluZSBCUkRfRVJST1IJCTB4QQkvKiBCb2FyZCBzdGF0ZSBpcyBFcnJvciAqLworCisvKiBCUkQgT2JqZWN0ICovCitzdHJ1Y3QgYnJkX29iamVjdDsKKworI2VuZGlmIC8qIEJSRERFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhODk5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jZmcuaApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIGNmZy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFBNIENvbmZpZ3VyYXRpb24gbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgQ0ZHXworI2RlZmluZSBDRkdfCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnZGVmcy5oPgorCisvKgorICogID09PT09PT09IGNmZ19leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgdGhlIENGRyBtb2R1bGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBjZmdfaW5pdCh2b2lkKSB3YXMgcHJldmlvdXNseSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgUmVzb3VyY2VzIGFjcXVpcmVkIGluIGNmZ19pbml0KHZvaWQpIGFyZSBmcmVlZC4KKyAqLworZXh0ZXJuIHZvaWQgY2ZnX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF9hdXRvX3N0YXJ0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmVpdmUgdGhlIGF1dG9zdGFydCBtYXNrLCBpZiBhbnksIGZvciB0aGlzIGJvYXJkLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9ub2RlX29iajogIEhhbmRsZSB0byB0aGUgZGV2X25vZGUgd2hvJ3MgZHJpdmVyIHdlIGFyZSBxdWVyeWluZy4KKyAqICAgICAgYXV0b19zdGFydDogICBQdHIgdG8gbG9jYXRpb24gZm9yIDMyIGJpdCBhdXRvc3RhcnQgbWFzay4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgZGV2X25vZGVfb2JqIGlzIGludmFsaWQuCisgKiAgICAgIC1FTk9EQVRBOiBVbmFibGUgdG8gcmV0cmVpdmUgcmVzb3VyY2UuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIENGRyBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKmF1dG9fc3RhcnQgY29udGFpbnMgYXV0b3N0YXJ0IG1hc2sgZm9yIHRoaXMgZGV2bm9kZS4KKyAqLworZXh0ZXJuIGludCBjZmdfZ2V0X2F1dG9fc3RhcnQoc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmosCisJCQkJICAgICB1MzIgKmF1dG9fc3RhcnQpOworCisvKgorICogID09PT09PT09IGNmZ19nZXRfY2RfdmVyc2lvbiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlcyB0aGUgdmVyc2lvbiBvZiB0aGUgUE0gQ2xhc3MgRHJpdmVyLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHZlcnNpb246ICAgIFB0ciB0byB1MzIgdG8gY29udGFpbiB2ZXJzaW9uIG51bWJlciB1cG9uIHJldHVybi4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICBTdWNjZXNzLiAgdmVyc2lvbiBjb250YWlucyBDbGFzcyBEcml2ZXIgdmVyc2lvbiBpbgorICogICAgICAgICAgICAgICAgICB0aGUgZm9ybTogMHhBQUJCQ0NERCB3aGVyZSBBQUJCIGlzIE1ham9yIHZlcnNpb24gYW5kCisgKiAgICAgICAgICAgICAgICAgIENDREQgaXMgTWlub3IuCisgKiAgICAgIC1FUEVSTTogIEZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIENGRyBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICBTdWNjZXNzLgorICogICAgICBlbHNlOiAgICAgICAqdmVyc2lvbiBpcyBOVUxMLgorICovCitleHRlcm4gaW50IGNmZ19nZXRfY2RfdmVyc2lvbih1MzIgKnZlcnNpb24pOworCisvKgorICogID09PT09PT09IGNmZ19nZXRfZGV2X29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBEZXZpY2UgT2JqZWN0IGhhbmRsZSBmb3IgYSBnaXZlbiBkZXZub2RlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9ub2RlX29iajoJUGxhdGZvcm0ncyBkZXZfbm9kZSBoYW5kbGUgZnJvbSB3aGljaCB0byByZXRyaWV2ZQorICogICAgICAJCXZhbHVlLgorICogICAgICB2YWx1ZTogICAgICAgICAgUHRyIHRvIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSB2YWx1ZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiBkZXZfbm9kZV9vYmogaXMgaW52YWxpZCBvciBkZXZpY2Vfb2JqIGlzIGludmFsaWQuCisgKiAgICAgIC1FTk9EQVRBOiBUaGUgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ0ZHIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICp2YWx1ZSBpcyBzZXQgdG8gdGhlIHJldHJpZXZlZCB1MzIuCisgKiAgICAgIGVsc2U6ICAgICAgICp2YWx1ZSBpcyBzZXQgdG8gMEwuCisgKi8KK2V4dGVybiBpbnQgY2ZnX2dldF9kZXZfb2JqZWN0KHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqLAorCQkJCSAgICAgdTMyICp2YWx1ZSk7CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF9leGVjX2ZpbGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyZWl2ZSB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBpZiBhbnksIGZvciB0aGlzIGJvYXJkLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9ub2RlX29iajogSGFuZGxlIHRvIHRoZSBkZXZfbm9kZSB3aG8ncyBkcml2ZXIgd2UgYXJlIHF1ZXJ5aW5nLgorICogICAgICBidWZfc2l6ZTogICAgICAgU2l6ZSBvZiBidWZmZXIuCisgKiAgICAgIHN0cl9leGVjX2ZpbGU6ICBQdHIgdG8gY2hhcmFjdGVyIGJ1ZiB0byBob2xkIEV4ZWNGaWxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICBkZXZfbm9kZV9vYmogaXMgaW52YWxpZCBvciBzdHJfZXhlY19maWxlIGlzIGludmFsaWQuCisgKiAgICAgIC1FTk9EQVRBOiBUaGUgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ0ZHIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgIE5vdCBtb3JlIHRoYW4gYnVmX3NpemUgYnl0ZXMgd2VyZSBjb3BpZWQgaW50byBzdHJfZXhlY19maWxlLAorICogICAgICAgICAgICAgICAgICBhbmQgKnN0cl9leGVjX2ZpbGUgY29udGFpbnMgZGVmYXVsdCBleGVjdXRhYmxlIGZvciB0aGlzCisgKiAgICAgICAgICAgICAgICAgIGRldm5vZGUuCisgKi8KK2V4dGVybiBpbnQgY2ZnX2dldF9leGVjX2ZpbGUoc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmosCisJCQkJICAgIHUzMiBidWZfc2l6ZSwgY2hhciAqc3RyX2V4ZWNfZmlsZSk7CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgRHJpdmVyIE9iamVjdCBoYW5kbGUgRnJvbSB0aGUgUmVnaXN0cnkKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB2YWx1ZTogICAgICBQdHIgdG8gbG9jYXRpb24gdG8gc3RvcmUgdGhlIHZhbHVlLgorICogICAgICBkd190eXBlICAgICAgVHlwZSBvZiBPYmplY3QgdG8gR2V0CisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzcy4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ0ZHIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICp2YWx1ZSBpcyBzZXQgdG8gdGhlIHJldHJpZXZlZCB1MzIobm9uLVplcm8pLgorICogICAgICBlbHNlOiAgICAgICAqdmFsdWUgaXMgc2V0IHRvIDBMLgorICovCitleHRlcm4gaW50IGNmZ19nZXRfb2JqZWN0KHUzMiAqdmFsdWUsIHU4IGR3X3R5cGUpOworCisvKgorICogID09PT09PT09IGNmZ19nZXRfcGVyZl92YWx1ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgUEVSRiBzaG91bGQgbG9nIHN0YXRpc3RpY3MgZm9yIHRoZQorICogICAgICBQTSBjbGFzcyBkcml2ZXIuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZW5hYmxlX3BlcmY6ICAgIExvY2F0aW9uIHRvIHN0b3JlIGZsYWcuICAwIGluZGljYXRlcyB0aGUga2V5IHdhcworICogICAgICAgICAgICAgICAgICAgICAgbm90IGZvdW5kLCBvciBoYWQgYSB6ZXJvIHZhbHVlLiAgQSBub256ZXJvIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICBtZWFucyB0aGUga2V5IHdhcyBmb3VuZCBhbmQgaGFkIGEgbm9uemVybyB2YWx1ZS4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBlbmFibGVfcGVyZiAhPSBOVUxMOworICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB2b2lkIGNmZ19nZXRfcGVyZl92YWx1ZShib29sICplbmFibGVfcGVyZik7CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF96bF9maWxlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmVpdmUgdGhlIFpMRmlsZSwgaWYgYW55LCBmb3IgdGhpcyBib2FyZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfbm9kZV9vYmo6IEhhbmRsZSB0byB0aGUgZGV2X25vZGUgd2hvJ3MgZHJpdmVyIHdlIGFyZSBxdWVyeWluZy4KKyAqICAgICAgYnVmX3NpemU6ICAgICAgIFNpemUgb2YgYnVmZmVyLgorICogICAgICBzdHJfemxfZmlsZV9uYW1lOiBQdHIgdG8gY2hhcmFjdGVyIGJ1ZiB0byBob2xkIFpMRmlsZU5hbWUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogc3RyX3psX2ZpbGVfbmFtZSBpcyBpbnZhbGlkIG9yIGRldl9ub2RlX29iaiBpcyBpbnZhbGlkLgorICogICAgICAtRU5PREFUQTogY291bGRuJ3QgZmluZCB0aGUgWkxGaWxlTmFtZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ0ZHIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgIE5vdCBtb3JlIHRoYW4gYnVmX3NpemUgYnl0ZXMgd2VyZSBjb3BpZWQgaW50bworICogICAgICAgICAgICAgICAgICBzdHJfemxfZmlsZV9uYW1lLCBhbmQgKnN0cl96bF9maWxlX25hbWUgY29udGFpbnMgWkxGaWxlTmFtZQorICogICAgICAgICAgICAgICAgICBmb3IgdGhpcyBkZXZub2RlLgorICovCitleHRlcm4gaW50IGNmZ19nZXRfemxfZmlsZShzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlX29iaiwKKwkJCQkgIHUzMiBidWZfc2l6ZSwgY2hhciAqc3RyX3psX2ZpbGVfbmFtZSk7CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIHRoZSBDRkcgbW9kdWxlJ3MgcHJpdmF0ZSBzdGF0ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgaW5pdGlhbGl6ZWQ7IEZBTFNFIGlmIGVycm9yIG9jY3VyZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgQSByZXF1aXJlbWVudCBmb3IgZWFjaCBvZiB0aGUgb3RoZXIgcHVibGljIENGRyBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiBib29sIGNmZ19pbml0KHZvaWQpOworCisvKgorICogID09PT09PT09IGNmZ19zZXRfZGV2X29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFN0b3JlIHRoZSBEZXZpY2UgT2JqZWN0IGhhbmRsZSBmb3IgYSBnaXZlbiBkZXZub2RlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9ub2RlX29iajogICBQbGF0Zm9ybSdzIGRldl9ub2RlIGhhbmRsZSB3ZSBhcmUgc3RvcmluZyB2YWx1ZSB3aXRoLgorICogICAgICB2YWx1ZTogICAgQXJiaXRyYXJ5IHZhbHVlIHRvIHN0b3JlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICBkZXZfbm9kZV9vYmogaXMgaW52YWxpZC4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICAgICAgSW50ZXJuYWwgRXJyb3IuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIENGRyBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICBUaGUgUHJpdmF0ZSB1MzIgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgKi8KK2V4dGVybiBpbnQgY2ZnX3NldF9kZXZfb2JqZWN0KHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqLAorCQkJCSAgICAgdTMyIHZhbHVlKTsKKworLyoKKyAqICA9PT09PT09PSBDRkdfU2V0RHJ2T2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU3RvcmUgdGhlIERyaXZlciBPYmplY3QgaGFuZGxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHZhbHVlOiAgICAgICAgICBBcmJpdHJhcnkgdmFsdWUgdG8gc3RvcmUuCisgKiAgICAgIGR3X3R5cGUgICAgICAgICAgVHlwZSBvZiBPYmplY3QgdG8gU3RvcmUKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVQRVJNOiAgICAgIEludGVybmFsIEVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBDRkcgaW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgIFRoZSBQcml2YXRlIHUzMiB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAqLworZXh0ZXJuIGludCBjZmdfc2V0X29iamVjdCh1MzIgdmFsdWUsIHU4IGR3X3R5cGUpOworCisjZW5kaWYgLyogQ0ZHXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NmZ2RlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jZmdkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxMjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jZmdkZWZzLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGNmZ2RlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgQ0ZHIGNvbnN0YW50cyBhbmQgdHlwZXMsIHNoYXJlZCBiZXR3ZWVuIERTUCBBUEkgYW5kIEJyaWRnZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBDRkdERUZTXworI2RlZmluZSBDRkdERUZTXworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBtb2R1bGUgc2VhcmNoIHBhdGguICovCisjZGVmaW5lIENGR19NQVhTRUFSQ0hQQVRITEVOICAgIDI1NQorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBnZW5lcmFsIHBhdGhzLiAqLworI2RlZmluZSBDRkdfTUFYUEFUSCAgICAgICAgICAgICAyNTUKKworLyogSG9zdCBSZXNvdXJjZXM6ICovCisjZGVmaW5lIENGR19NQVhNRU1SRUdJU1RFUlMgICAgIDkKKyNkZWZpbmUgQ0ZHX01BWElPUE9SVFMgICAgICAgICAgMjAKKyNkZWZpbmUgQ0ZHX01BWElSUVMgICAgICAgICAgICAgNworI2RlZmluZSBDRkdfTUFYRE1BQ0hBTk5FTFMgICAgICA3CisKKy8qIElSUSBmbGFnICovCisjZGVmaW5lIENGR19JUlFTSEFSRUQgICAgICAgICAgIDB4MDEJLyogSVJRIGNhbiBiZSBzaGFyZWQgKi8KKworLyogRFNQIFJlc291cmNlczogKi8KKyNkZWZpbmUgQ0ZHX0RTUE1BWE1FTVRZUEVTICAgICAgMTAKKyNkZWZpbmUgQ0ZHX0RFRkFVTFRfTlVNX1dJTkRPV1MgMQkvKiBXZSBzdXBwb3J0IG9ubHkgb25lIHdpbmRvdy4gKi8KKworLyogQSBwbGF0Zm9ybS1yZWxhdGVkIGRldmljZSBoYW5kbGU6ICovCitzdHJ1Y3QgY2ZnX2Rldm5vZGU7CisKKy8qCisgKiAgSG9zdCByZXNvdXJjZSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBjZmdfaG9zdHJlcyB7CisJdTMyIG51bV9tZW1fd2luZG93czsJLyogU2V0IHRvIGRlZmF1bHQgKi8KKwkvKiBUaGlzIGlzIHRoZSBiYXNlLm1lbW9yeSAqLworCXUzMiBkd19tZW1fYmFzZVtDRkdfTUFYTUVNUkVHSVNURVJTXTsJLyogc2htIHZpcnR1YWwgYWRkcmVzcyAqLworCXUzMiBkd19tZW1fbGVuZ3RoW0NGR19NQVhNRU1SRUdJU1RFUlNdOwkvKiBMZW5ndGggb2YgdGhlIEJhc2UgKi8KKwl1MzIgZHdfbWVtX3BoeXNbQ0ZHX01BWE1FTVJFR0lTVEVSU107CS8qIHNobSBQaHlzaWNhbCBhZGRyZXNzICovCisJdTggYmlycV9yZWdpc3RlcnM7CS8qIElSUSBOdW1iZXIgKi8KKwl1OCBiaXJxX2F0dHJpYjsJCS8qIElSUSBBdHRyaWJ1dGUgKi8KKwl1MzIgZHdfb2Zmc2V0X2Zvcl9tb25pdG9yOwkvKiBUaGUgU2hhcmVkIG1lbW9yeSBzdGFydHMgZnJvbQorCQkJCQkgKiBkd19tZW1fYmFzZSArIHRoaXMgb2Zmc2V0ICovCisJLyoKKwkgKiAgSW5mbyBuZWVkZWQgYnkgTk9ERSBmb3IgYWxsb2NhdGluZyBjaGFubmVscyB0byBjb21tdW5pY2F0ZSB3aXRoIFJNUzoKKwkgKiAgICAgIGR3X2Nobmxfb2Zmc2V0OiAgICAgICBPZmZzZXQgb2YgUk1TIGNoYW5uZWxzLiBMb3dlciBjaGFubmVscyBhcmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCisJICogICAgICBkd19jaG5sX2J1Zl9zaXplOiAgICAgIFNpemUgb2YgY2hhbm5lbCBidWZmZXIgdG8gc2VuZCB0byBSTVMKKwkgKiAgICAgIGR3X251bV9jaG5sczoJCVRvdGFsIG51bWJlciBvZiBjaGFubmVscworCSAqICAgICAgCQkJKGluY2x1ZGluZyByZXNlcnZlZCkuCisJICovCisJdTMyIGR3X2Nobmxfb2Zmc2V0OworCXUzMiBkd19jaG5sX2J1Zl9zaXplOworCXUzMiBkd19udW1fY2hubHM7CisJdm9pZCBfX2lvbWVtICpkd19wZXJfYmFzZTsKKwl1MzIgZHdfcGVyX3BtX2Jhc2U7CisJdTMyIGR3X2NvcmVfcG1fYmFzZTsKKwl2b2lkIF9faW9tZW0gKmR3X2RtbXVfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmR3X3N5c19jdHJsX2Jhc2U7Cit9OworCitzdHJ1Y3QgY2ZnX2RzcG1lbWRlc2MgeworCXUzMiBtZW1fdHlwZTsJCS8qIFR5cGUgb2YgbWVtb3J5LiAqLworCXUzMiB1bF9taW47CQkvKiBNaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkgb2YgdGhpcyB0eXBlLiAqLworCXUzMiB1bF9tYXg7CQkvKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgb2YgdGhpcyB0eXBlLiAqLworfTsKKworI2VuZGlmIC8qIENGR0RFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY2hubC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NobmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMzYjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NobmwuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIGNobmwuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AgQVBJIGNoYW5uZWwgaW50ZXJmYWNlOiBtdWx0aXBsZXhlcyBkYXRhIHN0cmVhbXMgdGhyb3VnaCB0aGUgc2luZ2xlCisgKiBwaHlzaWNhbCBsaW5rIG1hbmFnZWQgYnkgYSBCcmlkZ2UgZHJpdmVyLgorICoKKyAqIFNlZSBEU1AgQVBJIGNobmwuaCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgQ0hOTF8KKyNkZWZpbmUgQ0hOTF8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9jaG5scHJpdi5oPgorCisvKgorICogID09PT09PT09IGNobmxfY2xvc2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBFbnN1cmVzIGFsbCBwZW5kaW5nIEkvTyBvbiB0aGlzIGNoYW5uZWwgaXMgY2FuY2VsbGVkLCBkaXNjYXJkcyBhbGwKKyAqICAgICAgcXVldWVkIEkvTyBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMsIHRoZW4gZnJlZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQKKyAqICAgICAgZm9yIHRoaXMgY2hhbm5lbCwgYW5kIG1ha2VzIHRoZSBjb3JyZXNwb25kaW5nIGxvZ2ljYWwgY2hhbm5lbCBpZAorICogICAgICBhdmFpbGFibGUgZm9yIHN1YnNlcXVlbnQgdXNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNobmxfb2JqOiAgICAgICAgICBDaGFubmVsIG9iamVjdCBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3M7CisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgY2hubF9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGNobmxfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIE5vIHRocmVhZCBtdXN0IGJlIGJsb2NrZWQgb24gdGhpcyBjaGFubmVsJ3MgSS9PIGNvbXBsZXRpb24gZXZlbnQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgIFRoZSBJL08gY29tcGxldGlvbiBldmVudCBmb3IgdGhpcyBjaGFubmVsIGlzIGZyZWVkLgorICogICAgICAgICAgICAgICAgICAgICAgY2hubF9vYmogaXMgbm8gbG9uZ2VyIHZhbGlkLgorICovCitleHRlcm4gaW50IGNobmxfY2xvc2Uoc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX29iaik7CisKKy8qCisgKiAgPT09PT09PT0gY2hubF9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0LCByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBuZXcgY2hhbm5lbHMKKyAqICAgICAgYW5kIGNsb3Npbmcgb2xkIG9uZXMgZm9yIGEgZ2l2ZW4gYm9hcmQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY2hhbm5lbF9tZ3I6ICAgIExvY2F0aW9uIHRvIHN0b3JlIGEgY2hhbm5lbCBtYW5hZ2VyIG9iamVjdCBvbiBvdXRwdXQuCisgKiAgICAgIGhkZXZfb2JqOiAgICAgSGFuZGxlIHRvIGEgZGV2aWNlIG9iamVjdC4KKyAqICAgICAgbWdyX2F0dHJ0czogICAgICBDaGFubmVsIG1hbmFnZXIgYXR0cmlidXRlcy4KKyAqICAgICAgbWdyX2F0dHJ0cy0+bWF4X2NoYW5uZWxzOiAgIE1heCBjaGFubmVscworICogICAgICBtZ3JfYXR0cnRzLT5iaXJxOiAgICAgICAgQ2hhbm5lbCdzIEkvTyBJUlEgbnVtYmVyLgorICogICAgICBtZ3JfYXR0cnRzLT5pcnFfc2hhcmVkOiAgICAgVFJVRSBpZiB0aGUgSVJRIGlzIHNoYXJlYWJsZS4KKyAqICAgICAgbWdyX2F0dHJ0cy0+d29yZF9zaXplOiAgIERTUCBXb3JkIHNpemUgaW4gZXF1aXZhbGVudCBQQyBieXRlcy4uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3VjY2VzczsKKyAqICAgICAgLUVGQVVMVDogICAgICAgICAgICBoZGV2X29iaiBpcyBpbnZhbGlkLgorICogICAgICAtRUlOVkFMOiBtYXhfY2hhbm5lbHMgaXMgMC4KKyAqICAgICAgICAgICAgICAgSW52YWxpZCBEU1Agd29yZCBzaXplIChtdXN0IGJlID4gMCkuCisgKiAgICAgICAgICAgICAgIEludmFsaWQgYmFzZSBhZGRyZXNzIGZvciBEU1AgY29tbXVuaWNhdGlvbnMuCisgKiAgICAgIC1FTk9NRU06ICAgICAgICAgICAgSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcmVxdWVzdGVkIHJlc291cmNlcy4KKyAqICAgICAgLUVJTzogICAgICAgICAgICAgVW5hYmxlIHRvIHBsdWcgY2hhbm5lbCBJU1IgZm9yIGNvbmZpZ3VyZWQgSVJRLgorICogICAgICAtRUNIUk5HOiAgICAgVGhpcyBtYW5hZ2VyIGNhbm5vdCBoYW5kbGUgdGhpcyBtYW55IGNoYW5uZWxzLgorICogICAgICAtRUVYSVNUOiAgICAgICBDaGFubmVsIG1hbmFnZXIgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZGV2aWNlLgorICogIFJlcXVpcmVzOgorICogICAgICBjaG5sX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBjaGFubmVsX21nciAhPSBOVUxMLgorICogICAgICBtZ3JfYXR0cnRzICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3Vic2VxdWVudCBjYWxscyB0byBjaG5sX2NyZWF0ZSgpIGZvciB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2FyZCB3aXRob3V0IGFuIGludGVydmVuaW5nIGNhbGwgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hubF9kZXN0cm95KCkgd2lsbCBmYWlsLgorICovCitleHRlcm4gaW50IGNobmxfY3JlYXRlKHN0cnVjdCBjaG5sX21nciAqKmNoYW5uZWxfbWdyLAorCQkJICAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNobmxfbWdyYXR0cnMgKm1ncl9hdHRydHMpOworCisvKgorICogID09PT09PT09IGNobmxfZGVzdHJveSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENsb3NlIGFsbCBvcGVuIGNoYW5uZWxzLCBhbmQgZGVzdHJveSB0aGUgY2hhbm5lbCBtYW5hZ2VyLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhjaG5sX21ncjogICAgICAgICAgIENoYW5uZWwgbWFuYWdlciBvYmplY3QuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICAgICAgaGNobmxfbWdyIHdhcyBpbnZhbGlkLgorICogIFJlcXVpcmVzOgorICogICAgICBjaG5sX2luaXQodm9pZCkgY2FsbGVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAgICAgQ2FuY2VscyBJL08gb24gZWFjaCBvcGVuIGNoYW5uZWwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc2VzIGVhY2ggb3BlbiBjaGFubmVsLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNobmxfY3JlYXRlIG1heSBzdWJzZXF1ZW50bHkgYmUgY2FsbGVkIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIGJvYXJkLgorICovCitleHRlcm4gaW50IGNobmxfZGVzdHJveShzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncik7CisKKy8qCisgKiAgPT09PT09PT0gY2hubF9leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgdGhlIENITkwgbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgY2hubF9pbml0KHZvaWQpIHByZXZpb3VzbHkgY2FsbGVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIFJlc291cmNlcywgaWYgYW55IGFjcXVpcmVkIGluIGNobmxfaW5pdCh2b2lkKSwgYXJlIGZyZWVkIHdoZW4gdGhlIGxhc3QKKyAqICAgICAgY2xpZW50IG9mIENITkwgY2FsbHMgY2hubF9leGl0KHZvaWQpLgorICovCitleHRlcm4gdm9pZCBjaG5sX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gY2hubF9pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgQ0hOTCBtb2R1bGUncyBwcml2YXRlIHN0YXRlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRSBpZiBpbml0aWFsaXplZDsgRkFMU0UgaWYgZXJyb3Igb2NjdXJyZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgQSByZXF1aXJlbWVudCBmb3IgZWFjaCBvZiB0aGUgb3RoZXIgcHVibGljIENITkwgZnVuY3Rpb25zLgorICovCitleHRlcm4gYm9vbCBjaG5sX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBDSE5MXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NobmxkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY2hubGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmY1ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NobmxkZWZzLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIGNobmxkZWZzLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogU3lzdGVtLXdpZGUgY2hhbm5lbCBvYmplY3RzIGFuZCBjb25zdGFudHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBDSE5MREVGU18KKyNkZWZpbmUgQ0hOTERFRlNfCisKKy8qIENoYW5uZWwgaWQgb3B0aW9uLiAqLworI2RlZmluZSBDSE5MX1BJQ0tGUkVFICAgICAgICh+MFVMKQkvKiBMZXQgbWFuYWdlciBwaWNrIGEgZnJlZSBjaGFubmVsLiAqLworCisvKiBDaGFubmVsIG1hbmFnZXIgbGltaXRzOiAqLworI2RlZmluZSBDSE5MX0lOSVRJT1JFUVMgICAgICA0CS8qIERlZmF1bHQgIyBvZiBJL08gcmVxdWVzdHMuICovCisKKy8qIENoYW5uZWwgbW9kZXMgKi8KKyNkZWZpbmUgQ0hOTF9NT0RFVE9EU1AJCTAJLyogRGF0YSBzdHJlYW1pbmcgdG8gdGhlIERTUC4gKi8KKyNkZWZpbmUgQ0hOTF9NT0RFRlJPTURTUAkxCS8qIERhdGEgc3RyZWFtaW5nIGZyb20gdGhlIERTUC4gKi8KKworLyogR2V0SU9Db21wbGV0aW9uIGZsYWdzICovCisjZGVmaW5lIENITkxfSU9DSU5GSU5JVEUgICAgIDB4ZmZmZmZmZmYJLyogV2FpdCBmb3JldmVyIGZvciBJTyBjb21wbGV0aW9uLiAqLworI2RlZmluZSBDSE5MX0lPQ05PV0FJVCAgICAgICAweDAJLyogRGVxdWV1ZSBhbiBJT0MsIGlmIGF2YWlsYWJsZS4gKi8KKworLyogSU8gQ29tcGxldGlvbiBSZWNvcmQgc3RhdHVzOiAqLworI2RlZmluZSBDSE5MX0lPQ1NUQVRDT01QTEVURSAweDAwMDAJLyogSU8gQ29tcGxldGVkLiAqLworI2RlZmluZSBDSE5MX0lPQ1NUQVRDQU5DRUwgICAweDAwMDIJLyogSU8gd2FzIGNhbmNlbGxlZCAqLworI2RlZmluZSBDSE5MX0lPQ1NUQVRUSU1FT1VUICAweDAwMDgJLyogV2FpdCBmb3IgSU9DIHRpbWVkIG91dC4gKi8KKyNkZWZpbmUgQ0hOTF9JT0NTVEFURU9TICAgICAgMHg4MDAwCS8qIEVuZCBPZiBTdHJlYW0gcmVhY2hlZC4gKi8KKworLyogTWFjcm9zIGZvciBjaGVja2luZyBJL08gQ29tcGxldGlvbiBzdGF0dXM6ICovCisjZGVmaW5lIENITkxfSVNfSU9fQ09NUExFVEUoaW9jKSAgKCEoaW9jLnN0YXR1cyAmIH5DSE5MX0lPQ1NUQVRFT1MpKQorI2RlZmluZSBDSE5MX0lTX0lPX0NBTkNFTExFRChpb2MpIChpb2Muc3RhdHVzICYgQ0hOTF9JT0NTVEFUQ0FOQ0VMKQorI2RlZmluZSBDSE5MX0lTX1RJTUVEX09VVChpb2MpICAgIChpb2Muc3RhdHVzICYgQ0hOTF9JT0NTVEFUVElNRU9VVCkKKworLyogQ2hhbm5lbCBhdHRyaWJ1dGVzOiAqLworc3RydWN0IGNobmxfYXR0ciB7CisJdTMyIHVpb19yZXFzOwkJLyogTWF4ICMgb2YgcHJlYWxsb2NhdGVkIEkvTyByZXF1ZXN0cy4gKi8KKwl2b2lkICpldmVudF9vYmo7CS8qIFVzZXIgc3VwcGxpZWQgYXV0by1yZXNldCBldmVudCBvYmplY3QuICovCisJY2hhciAqcHN0cl9ldmVudF9uYW1lOwkvKiBQdHIgdG8gbmFtZSBvZiB1c2VyIGV2ZW50IG9iamVjdC4gKi8KKwl2b2lkICpyZXNlcnZlZDE7CS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworCXUzMiByZXNlcnZlZDI7CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKworfTsKKworLyogSS9PIGNvbXBsZXRpb24gcmVjb3JkOiAqLworc3RydWN0IGNobmxfaW9jIHsKKwl2b2lkICpwYnVmOwkJLyogQnVmZmVyIHRvIGJlIGZpbGxlZC9lbXB0aWVkLiAqLworCXUzMiBieXRlX3NpemU7CQkvKiBCeXRlcyB0cmFuc2ZlcnJlZC4gKi8KKwl1MzIgYnVmX3NpemU7CQkvKiBBY3R1YWwgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KKwl1MzIgc3RhdHVzOwkJLyogU3RhdHVzIG9mIElPIGNvbXBsZXRpb24uICovCisJdTMyIGR3X2FyZzsJCS8qIFVzZXIgYXJndW1lbnQgYXNzb2NpYXRlZCB3aXRoIHBidWYuICovCit9OworCisjZW5kaWYgLyogQ0hOTERFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY2hubHByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jaG5scHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTIxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY2hubHByaXYuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogY2hubHByaXYuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBQcml2YXRlIGNoYW5uZWwgaGVhZGVyIHNoYXJlZCBiZXR3ZWVuIERTUFNZUywgRFNQQVBJIGFuZAorICogQnJpZGdlIGRyaXZlciBtb2R1bGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgQ0hOTFBSSVZfCisjZGVmaW5lIENITkxQUklWXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NobmxkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RldmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3luYy5oPgorCisvKiBDaGFubmVsIG1hbmFnZXIgbGltaXRzOiAqLworI2RlZmluZSBDSE5MX01BWENIQU5ORUxTICAgIDMyCS8qIE1heCBjaGFubmVscyBhdmFpbGFibGUgcGVyIHRyYW5zcG9ydCAqLworCisvKgorICogIFRyYW5zIHBvcnQgY2hhbm5lbCBJZCBkZWZpbml0aW9uczoobXVzdCBtYXRjaCBkc3Atc2lkZSkuCisgKgorICogIEZvciBDSE5MX01BWENIQU5ORUxTID0gMTY6CisgKgorICogIENobmxJZHM6CisgKiAgICAgIDAtMTUgIChQQ1BZKSAtIHRyYW5zcG9ydCAwKQorICogICAgICAxNi0zMSAoRERNQSkgLSB0cmFuc3BvcnQgMSkKKyAqICAgICAgMzItNDcgKFpDUFkpIC0gdHJhbnNwb3J0IDIpCisgKi8KKyNkZWZpbmUgQ0hOTF9QQ1BZICAgICAgIDAJLyogUHJvYy1jb3B5IHRyYW5zcG9ydCAwICovCisKKyNkZWZpbmUgQ0hOTF9NQVhJUlEgICAgIDB4ZmYJLyogQXJiaXRyYXJpbHkgbGFyZ2UgbnVtYmVyLiAqLworCisvKiBUaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBwcml2YXRlOiAqLworI2RlZmluZSBDSE5MX01PREVVU0VSRVZFTlQgIDB4MTAwMAkvKiBVc2VyIHByb3ZpZGVkIHRoZSBjaGFubmVsIGV2ZW50LiAqLworI2RlZmluZSBDSE5MX01PREVNQVNLICAgICAgIDB4MTAwMQorCisvKiBIaWdoZXIgbGV2ZWwgY2hhbm5lbCBzdGF0ZXM6ICovCisjZGVmaW5lIENITkxfU1RBVEVSRUFEWQkJMAkvKiBDaGFubmVsIHJlYWR5IGZvciBJL08uICovCisjZGVmaW5lIENITkxfU1RBVEVDQU5DRUwJMQkvKiBJL08gd2FzIGNhbmNlbGxlZC4gKi8KKyNkZWZpbmUgQ0hOTF9TVEFURUVPUwkJMgkvKiBFbmQgT2YgU3RyZWFtIHJlYWNoZWQuICovCisKKy8qIE1hY3JvcyBmb3IgY2hlY2tpbmcgbW9kZTogKi8KKyNkZWZpbmUgQ0hOTF9JU19JTlBVVChtb2RlKSAgICAgIChtb2RlICYgQ0hOTF9NT0RFRlJPTURTUCkKKyNkZWZpbmUgQ0hOTF9JU19PVVRQVVQobW9kZSkgICAgICghQ0hOTF9JU19JTlBVVChtb2RlKSkKKworLyogVHlwZXMgb2YgY2hhbm5lbCBjbGFzcyBsaWJyYXJpZXM6ICovCisjZGVmaW5lIENITkxfVFlQRVNNICAgICAgICAgMQkvKiBTaGFyZWQgbWVtb3J5IGRyaXZlci4gKi8KKyNkZWZpbmUgQ0hOTF9UWVBFQk0gICAgICAgICAyCS8qIEJ1cyBNYXN0ZXJpbmcgZHJpdmVyLiAqLworCisvKiBNYXggc3RyaW5nIGxlbmd0aCBvZiBjaGFubmVsIEkvTyBjb21wbGV0aW9uIGV2ZW50IG5hbWUgLSBjaGFuZ2UgaWYgbmVlZGVkICovCisjZGVmaW5lIENITkxfTUFYRVZUTkFNRUxFTiAgMzIKKworLyogTWF4IG1lbW9yeSBwYWdlcyBsb2NrYWJsZSBpbiBDSE5MX1ByZXBhcmVCdWZmZXIoKSAtIGNoYW5nZSBpZiBuZWVkZWQgKi8KKyNkZWZpbmUgQ0hOTF9NQVhMT0NLUEFHRVMgICA2NAorCisvKiBDaGFubmVsIGluZm8uICovCitzdHJ1Y3QgY2hubF9pbmZvIHsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncjsJLyogT3duaW5nIGNoYW5uZWwgbWFuYWdlci4gKi8KKwl1MzIgY25obF9pZDsJCS8qIENoYW5uZWwgSUQuICovCisJdm9pZCAqZXZlbnRfb2JqOwkvKiBDaGFubmVsIEkvTyBjb21wbGV0aW9uIGV2ZW50LiAqLworCS8qQWJzdHJhY3Rpb24gb2YgSS9PIGNvbXBsZXRpb24gZXZlbnQuICovCisJc3RydWN0IHN5bmNfb2JqZWN0ICpzeW5jX2V2ZW50OworCXM4IGR3X21vZGU7CQkvKiBDaGFubmVsIG1vZGUuICovCisJdTggZHdfc3RhdGU7CQkvKiBDdXJyZW50IGNoYW5uZWwgc3RhdGUuICovCisJdTMyIGJ5dGVzX3R4OwkJLyogVG90YWwgYnl0ZXMgdHJhbnNmZXJyZWQuICovCisJdTMyIGNpb19jczsJCS8qIE51bWJlciBvZiBJT0NzIGluIHF1ZXVlLiAqLworCXUzMiBjaW9fcmVxczsJCS8qIE51bWJlciBvZiBJTyBSZXF1ZXN0cyBpbiBxdWV1ZS4gKi8KKwl1MzIgcHJvY2VzczsJCS8qIFByb2Nlc3Mgb3duaW5nIHRoaXMgY2hhbm5lbC4gKi8KK307CisKKy8qIENoYW5uZWwgbWFuYWdlciBpbmZvOiAqLworc3RydWN0IGNobmxfbWdyaW5mbyB7CisJdTggZHdfdHlwZTsJCS8qIFR5cGUgb2YgY2hhbm5lbCBjbGFzcyBsaWJyYXJ5LiAqLworCS8qIENoYW5uZWwgaGFuZGxlLCBnaXZlbiB0aGUgY2hhbm5lbCBpZC4gKi8KKwlzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqOworCXU4IG9wZW5fY2hhbm5lbHM7CS8qIE51bWJlciBvZiBvcGVuIGNoYW5uZWxzLiAqLworCXU4IG1heF9jaGFubmVsczsJLyogdG90YWwgIyBvZiBjaG5scyBzdXBwb3J0ZWQgKi8KK307CisKKy8qIENoYW5uZWwgTWFuYWdlciBBdHRyczogKi8KK3N0cnVjdCBjaG5sX21ncmF0dHJzIHsKKwkvKiBNYXggbnVtYmVyIG9mIGNoYW5uZWxzIHRoaXMgbWFuYWdlciBjYW4gdXNlLiAqLworCXU4IG1heF9jaGFubmVsczsKKwl1MzIgd29yZF9zaXplOwkJLyogRFNQIFdvcmQgc2l6ZS4gKi8KK307CisKKyNlbmRpZiAvKiBDSE5MUFJJVl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jbGsuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM5NTAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Nsay5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogY2xrLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogUHJvdmlkZXMgQ2xvY2sgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX0NMS19ICisjZGVmaW5lIF9DTEtfSAorCitlbnVtIGRzcF9jbGtfaWQgeworCURTUF9DTEtfSVZBMiA9IDAsCisJRFNQX0NMS19HUFQ1LAorCURTUF9DTEtfR1BUNiwKKwlEU1BfQ0xLX0dQVDcsCisJRFNQX0NMS19HUFQ4LAorCURTUF9DTEtfV0RUMywKKwlEU1BfQ0xLX01DQlNQMSwKKwlEU1BfQ0xLX01DQlNQMiwKKwlEU1BfQ0xLX01DQlNQMywKKwlEU1BfQ0xLX01DQlNQNCwKKwlEU1BfQ0xLX01DQlNQNSwKKwlEU1BfQ0xLX1NTSSwKKwlEU1BfQ0xLX05PVF9ERUZJTkVECit9OworCisvKgorICogID09PT09PT09IGRzcF9jbGtfZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2NvbnRpbnVlIHVzYWdlIG9mIG1vZHVsZTsgZnJlZSByZXNvdXJjZXMgd2hlbiByZWZlcmVuY2UgY291bnQKKyAqICAgICAgcmVhY2hlcyAwLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ0xLIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIFJlc291cmNlcyB1c2VkIGJ5IG1vZHVsZSBhcmUgZnJlZWQgd2hlbiBjUmVmIHJlYWNoZXMgemVyby4KKyAqLworZXh0ZXJuIHZvaWQgZHNwX2Nsa19leGl0KHZvaWQpOworCisvKgorICogID09PT09PT09IGRzcF9jbGtfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemVzIHByaXZhdGUgc3RhdGUgb2YgQ0xLIG1vZHVsZS4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgaW5pdGlhbGl6ZWQ7IEZBTFNFIGlmIGVycm9yIG9jY3VyZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgQ0xLIGluaXRpYWxpemVkLgorICovCitleHRlcm4gdm9pZCBkc3BfY2xrX2luaXQodm9pZCk7CisKK3ZvaWQgZHNwX2dwdF93YWl0X292ZXJmbG93KHNob3J0IGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBsb2FkKTsKKworLyoKKyAqICA9PT09PT09PSBkc3BfY2xrX2VuYWJsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVuYWJsZXMgdGhlIGNsb2NrIHJlcXVlc3RlZC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIDA6CVN1Y2Nlc3MuCisgKgktRVBFUk06CUVycm9yIG9jY3VyZWQgd2hpbGUgZW5hYmxpbmcgdGhlIGNsb2NrLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgZHNwX2Nsa19lbmFibGUoZW51bSBkc3BfY2xrX2lkIGNsa19pZCk7CisKK3UzMiBkc3BfY2xvY2tfZW5hYmxlX2FsbCh1MzIgZHNwX3Blcl9jbG9ja3MpOworCisvKgorICogID09PT09PT09IGRzcF9jbGtfZGlzYWJsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2FibGVzIHRoZSBjbG9jayByZXF1ZXN0ZWQuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVQRVJNOiAgICAgIEVycm9yIG9jY3VyZWQgd2hpbGUgZGlzYWJsaW5nIHRoZSBjbG9jay4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRzcF9jbGtfZGlzYWJsZShlbnVtIGRzcF9jbGtfaWQgY2xrX2lkKTsKKworZXh0ZXJuIHUzMiBkc3BfY2xrX2dldF9pdmEyX3JhdGUodm9pZCk7CisKK3UzMiBkc3BfY2xvY2tfZGlzYWJsZV9hbGwodTMyIGRzcF9wZXJfY2xvY2tzKTsKKworZXh0ZXJuIHZvaWQgc3NpX2Nsa19wcmVwYXJlKGJvb2wgRkxBRyk7CisKKyNlbmRpZiAvKiBfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY21tLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY21tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyMWYxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9jbW0uaApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIGNtbS5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFRoZSBDb21tdW5pY2F0aW9uIE1lbW9yeSBNYW5hZ2VtZW50KENNTSkgbW9kdWxlIHByb3ZpZGVzIHNoYXJlZCBtZW1vcnkKKyAqIG1hbmFnZW1lbnQgc2VydmljZXMgZm9yIERTUC9CSU9TIEJyaWRnZSBkYXRhIHN0cmVhbWluZyBhbmQgbWVzc2FnaW5nLgorICogTXVsdGlwbGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50cyBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIENNTS4gTWVtb3J5IGlzCisgKiBjb2VsZXNjZWQgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgcG9vbCB3aGVuIGEgYnVmZmVyIGlzIGZyZWVkLgorICoKKyAqIFRoZSBDTU1fWGxhdG9yW3h4eF0gZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBub2RlIG1lc3NhZ2luZyBhbmQgZGF0YQorICogc3RyZWFtaW5nIGFkZHJlc3MgdHJhbnNsYXRpb24gdG8gcGVyZm9ybSB6ZXJvLWNvcHkgaW50ZXItcHJvY2Vzc29yCisgKiBkYXRhIHRyYW5zZmVyKEdQUDwtPkRTUCkuIEEgInRyYW5zbGF0b3IiIG9iamVjdCBpcyBjcmVhdGVkIGZvciBhIG5vZGUgb3IKKyAqIHN0cmVhbSBvYmplY3QgdGhhdCBjb250YWlucyBwZXIgdGhyZWFkIHZpcnR1YWwgYWRkcmVzcyBpbmZvcm1hdGlvbi4gVGhpcworICogdHJhbnNsYXRvciBpbmZvIGlzIHVzZWQgYXQgcnVudGltZSB0byBwZXJmb3JtIFNNIGFkZHJlc3MgdHJhbnNsYXRpb24KKyAqIHRvL2Zyb20gdGhlIERTUCBhZGRyZXNzIHNwYWNlLgorICoKKyAqIE5vdGVzOgorICogICBjbW1feGxhdG9yX2FsbG9jX2J1ZiAtIFVzZWQgYnkgTm9kZSBhbmQgU3RyZWFtIG1vZHVsZXMgZm9yIFNNIGFkZHJlc3MKKyAqCQkJICB0cmFuc2xhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBDTU1fCisjZGVmaW5lIENNTV8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvY21tZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qCisgKiAgPT09PT09PT0gY21tX2NhbGxvY19idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBbGxvY2F0ZSBtZW1vcnkgYnVmZmVycyB0aGF0IGNhbiBiZSB1c2VkIGZvciBkYXRhIHN0cmVhbWluZyBvcgorICogICAgICBtZXNzYWdpbmcuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGNtbV9tZ3I6ICAgQ21tIE1nciBoYW5kbGUuCisgKiAgICAgIHVzaXplOiAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLgorICogICAgICBwYXR0cjogICAgIEF0dHJpYnV0ZXMgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgorICogICAgICBwcF9idWZfdmE6ICAgQWRkcmVzcyBvZiB3aGVyZSB0byBwbGFjZSBWQS4KKyAqICBSZXR1cm5zOgorICogICAgICBQb2ludGVyIHRvIGEgemVybydkIGJsb2NrIG9mIFNNIG1lbW9yeTsKKyAqICAgICAgTlVMTCBpZiBtZW1vcnkgY291bGRuJ3QgYmUgYWxsb2NhdGVkLAorICogICAgICBvciBpZiBieXRlX3NpemUgPT0gMCwKKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgaGNtbV9tZ3IuCisgKiAgICAgIENNTSBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICBUaGUgcmV0dXJuZWQgcG9pbnRlciwgaWYgbm90IE5VTEwsIHBvaW50cyB0byBhIHZhbGlkIG1lbW9yeSBibG9jayBvZgorICogICAgICB0aGUgc2l6ZSByZXF1ZXN0ZWQuCisgKgorICovCitleHRlcm4gdm9pZCAqY21tX2NhbGxvY19idWYoc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJICAgIHUzMiB1c2l6ZSwgc3RydWN0IGNtbV9hdHRycyAqcGF0dHJzLAorCQkJICAgIHZvaWQgKipwcF9idWZfdmEpOworCisvKgorICogID09PT09PT09IGNtbV9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBjb21tdW5pY2F0aW9uIG1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBwaF9jbW1fbWdyOglMb2NhdGlvbiB0byBzdG9yZSBhIGNvbW11bmljYXRpb24gbWFuYWdlciBoYW5kbGUgb24KKyAqICAgICAgCQlvdXRwdXQuCisgKiAgICAgIGhkZXZfb2JqOiBIYW5kbGUgdG8gYSBkZXZpY2Ugb2JqZWN0LgorICogICAgICBtZ3JfYXR0cnRzOiBDb21tIG1lbSBtYW5hZ2VyIGF0dHJpYnV0ZXMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3M7CisgKiAgICAgIC1FTk9NRU06ICAgIEluc3VmZmljaWVudCBtZW1vcnkgZm9yIHJlcXVlc3RlZCByZXNvdXJjZXMuCisgKiAgICAgIC1FUEVSTTogICAgICBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjcml0aWNhbCBzZWN0IHN5bmMgb2JqZWN0LgorICoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgY21tX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBwaF9jbW1fbWdyICE9IE5VTEwuCisgKiAgICAgIG1ncl9hdHRydHMtPnVsX21pbl9ibG9ja19zaXplID49IDQgYnl0ZXMuCisgKiAgRW5zdXJlczoKKyAqCisgKi8KK2V4dGVybiBpbnQgY21tX2NyZWF0ZShzdHJ1Y3QgY21tX29iamVjdCAqKnBoX2NtbV9tZ3IsCisJCQkgICAgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGNtbV9tZ3JhdHRycyAqbWdyX2F0dHJ0cyk7CisKKy8qCisgKiAgPT09PT09PT0gY21tX2Rlc3Ryb3kgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZXN0cm95IHRoZSBjb21tdW5pY2F0aW9uIG1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoY21tX21ncjogICBDbW0gTWdyIGhhbmRsZS4KKyAqICAgICAgZm9yY2U6ICAgICBGb3JjZSBkZWFsbG9jYXRpb24gb2YgYWxsIGNtbSBtZW1vcnkgaW1tZWRpYXRlbHkgaWYgc2V0IFRSVUUuCisgKiAgICAgICAgICAgICAgICAgSWYgRkFMU0UsIGFuZCBvdXRzdGFuZGluZyBhbGxvY2F0aW9ucyB3aWxsIHJldHVybiAtRVBFUk0KKyAqICAgICAgICAgICAgICAgICBzdGF0dXMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIENNTSBvYmplY3QgJiByZXNvdXJjZXMgZGVsZXRlZC4KKyAqICAgICAgLUVQRVJNOiAgICAgIFVuYWJsZSB0byBmcmVlIENNTSBvYmplY3QgZHVlIHRvIG91dHN0YW5kaW5nIGFsbG9jYXRpb24uCisgKiAgICAgIC1FRkFVTFQ6ICAgIFVuYWJsZSB0byBmcmVlIENNTSBkdWUgdG8gYmFkIGhhbmRsZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ01NIGlzIGluaXRpYWxpemVkLgorICogICAgICBoY21tX21nciAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIE1lbW9yeSByZXNvdXJjZXMgdXNlZCBieSBDbW0gTWdyIGFyZSBmcmVlZC4KKyAqLworZXh0ZXJuIGludCBjbW1fZGVzdHJveShzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3IsIGJvb2wgZm9yY2UpOworCisvKgorICogID09PT09PT09IGNtbV9leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiBtb2R1bGUuIENsZWFudXAgQ01NIG1vZHVsZSBpZiBDTU0gY1JlZiByZWFjaGVzIHplcm8uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICBuL2EKKyAqICBSZXR1cm5zOgorICogICAgIG4vYQorICogIFJlcXVpcmVzOgorICogICAgIENNTSBpcyBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBjbW1fZXhpdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBjbW1fZnJlZV9idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGcmVlIHRoZSBnaXZlbiBidWZmZXIuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGNtbV9tZ3I6ICAgIENtbSBNZ3IgaGFuZGxlLgorICogICAgICBwYnVmOiAgICAgICBQb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgYnkgY21tX2NhbGxvY19idWYoKS4KKyAqICAgICAgdWxfc2VnX2lkOiAgICBTTSBzZWdtZW50IElkIHVzZWQgaW4gQ01NX0NhbGxvYygpIGF0dHJzLgorICogICAgICAgICAgICAgICAgICBTZXQgdG8gMCB0byB1c2UgZGVmYXVsdCBzZWdtZW50LgorICogIFJldHVybnM6CisgKiAgICAgIDAKKyAqICAgICAgLUVQRVJNCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIENNTSBpbml0aWFsaXplZC4KKyAqICAgICAgYnVmX3BhICE9IE5VTEwKKyAqICBFbnN1cmVzOgorICoKKyAqLworZXh0ZXJuIGludCBjbW1fZnJlZV9idWYoc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJICAgICAgIHZvaWQgKmJ1Zl9wYSwgdTMyIHVsX3NlZ19pZCk7CisKKy8qCisgKiAgPT09PT09PT0gY21tX2dldF9oYW5kbGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm4gdGhlIGhhbmRsZSB0byB0aGUgY21tIG1nciBmb3IgdGhlIGdpdmVuIGRldmljZSBvYmouCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaHByb2Nlc3NvcjogICBIYW5kbGUgdG8gYSBQcm9jZXNzb3IuCisgKiAgICAgIHBoX2NtbV9tZ3I6CUxvY2F0aW9uIHRvIHN0b3JlIHRoZSBzaGFyZWQgbWVtb3J5IG1nciBoYW5kbGUgb24KKyAqICAgICAgCQlvdXRwdXQuCisgKgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBDbW0gTWdyIG9wYXF1ZSBoYW5kbGUgcmV0dXJuZWQuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGFuZGxlLgorICogIFJlcXVpcmVzOgorICogICAgICBwaF9jbW1fbWdyICE9IE5VTEwKKyAqICAgICAgaGRldl9vYmogIT0gTlVMTAorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgY21tX2dldF9oYW5kbGUodm9pZCAqaHByb2Nlc3NvciwKKwkJCQkgc3RydWN0IGNtbV9vYmplY3QgKipwaF9jbW1fbWdyKTsKKworLyoKKyAqICA9PT09PT09PSBjbW1fZ2V0X2luZm8gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgU00gYW5kIFZNIHV0aWxpemF0aW9uIGluZm9ybWF0aW9uLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhjbW1fbWdyOiAgICAgSGFuZGxlIHRvIGEgQ21tIE1nci4KKyAqICAgICAgY21tX2luZm9fb2JqOiAgICBMb2NhdGlvbiB0byBzdG9yZSB0aGUgQ21tIGluZm9ybWF0aW9uIG9uIG91dHB1dC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGFuZGxlLgorICogICAgICAtRUlOVkFMIEludmFsaWQgaW5wdXQgYXJndW1lbnQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqCisgKi8KK2V4dGVybiBpbnQgY21tX2dldF9pbmZvKHN0cnVjdCBjbW1fb2JqZWN0ICpoY21tX21nciwKKwkJCSAgICAgICBzdHJ1Y3QgY21tX2luZm8gKmNtbV9pbmZvX29iaik7CisKKy8qCisgKiAgPT09PT09PT0gY21tX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplcyBwcml2YXRlIHN0YXRlIG9mIENNTSBtb2R1bGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIGluaXRpYWxpemVkOyBGQUxTRSBpZiBlcnJvciBvY2N1cmVkLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKiAgICAgIENNTSBpbml0aWFsaXplZC4KKyAqLworZXh0ZXJuIGJvb2wgY21tX2luaXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gY21tX3JlZ2lzdGVyX2dwcHNtX3NlZyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVyIGEgYmxvY2sgb2YgU00gd2l0aCB0aGUgQ01NLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhjbW1fbWdyOiAgICAgICAgIEhhbmRsZSB0byBhIENtbSBNZ3IuCisgKiAgICAgIGxwR1BQQmFzZVBBOiAgICAgR1BQIEJhc2UgUGh5c2ljYWwgYWRkcmVzcy4KKyAqICAgICAgdWxfc2l6ZTogICAgICAgICAgU2l6ZSBpbiBHUFAgYnl0ZXMuCisgKiAgICAgIGRzcF9hZGRyX29mZnNldCAgR1BQIFBBIHRvIERTUCBQQSBPZmZzZXQuCisgKiAgICAgIGNfZmFjdG9yOiAgICAgICAgIEFkZCBvZmZzZXQgaWYgQ01NX0FERFRPRFNQUEEsIHN1YiBpZiBDTU1fU1VCRlJPTURTUFBBLgorICogICAgICBkd19kc3BfYmFzZTogICAgICAgRFNQIHZpcnR1YWwgYmFzZSBieXRlIGFkZHJlc3MuCisgKiAgICAgIHVsX2RzcF9zaXplOiAgICAgICBTaXplIG9mIERTUCBzZWdtZW50IGluIGJ5dGVzLgorICogICAgICBzZ210X2lkOiAgICAgICAgIEFkZHJlc3MgdG8gc3RvcmUgc2VnbWVudCBJZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICAgSW52YWxpZCBoY21tX21nciBoYW5kbGUuCisgKiAgICAgIC1FSU5WQUw6IEludmFsaWQgaW5wdXQgYXJndW1lbnQuCisgKiAgICAgIC1FUEVSTTogICAgICAgVW5hYmxlIHRvIHJlZ2lzdGVyLgorICogICAgICAtIE9uIHN1Y2Nlc3MgKnNnbXRfaWQgaXMgYSB2YWxpZCBTTSBzZWdtZW50IElELgorICogIFJlcXVpcmVzOgorICogICAgICB1bF9zaXplID4gMAorICogICAgICBzZ210X2lkICE9IE5VTEwKKyAqICAgICAgZHdfZ3BwX2Jhc2VfcGEgIT0gMAorICogICAgICBjX2ZhY3RvciA9IENNTV9BRERUT0RTUFBBIHx8IGNfZmFjdG9yID0gQ01NX1NVQkZST01EU1BQQQorICogIEVuc3VyZXM6CisgKgorICovCitleHRlcm4gaW50IGNtbV9yZWdpc3Rlcl9ncHBzbV9zZWcoc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJCQkgdW5zaWduZWQgaW50IGR3X2dwcF9iYXNlX3BhLAorCQkJCQkgdTMyIHVsX3NpemUsCisJCQkJCSB1MzIgZHNwX2FkZHJfb2Zmc2V0LAorCQkJCQkgczggY19mYWN0b3IsCisJCQkJCSB1bnNpZ25lZCBpbnQgZHdfZHNwX2Jhc2UsCisJCQkJCSB1MzIgdWxfZHNwX3NpemUsCisJCQkJCSB1MzIgKnNnbXRfaWQsIHUzMiBncHBfYmFzZV92YSk7CisKKy8qCisgKiAgPT09PT09PT0gY21tX3VuX3JlZ2lzdGVyX2dwcHNtX3NlZyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFVucmVnaXN0ZXIgdGhlIGdpdmVuIG1lbW9yeSBzZWdtZW50IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAorICogICAgICBieSBjbW1fcmVnaXN0ZXJfZ3Bwc21fc2VnLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhjbW1fbWdyOiAgICBIYW5kbGUgdG8gYSBDbW0gTWdyLgorICogICAgICB1bF9zZWdfaWQgICAgIFNlZ21lbnQgaWRlbnRpZmllciByZXR1cm5lZCBieSBjbW1fcmVnaXN0ZXJfZ3Bwc21fc2VnLgorICogIFJldHVybnM6CisgKiAgICAgICAwOiAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgICAtRUZBVUxUOiAgICAgSW52YWxpZCBoYW5kbGUuCisgKiAgICAgICAtRUlOVkFMOiBJbnZhbGlkIHVsX3NlZ19pZC4KKyAqICAgICAgIC1FUEVSTTogICAgICAgVW5hYmxlIHRvIHVucmVnaXN0ZXIgZm9yIHVua25vd24gcmVhc29uLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKgorICovCitleHRlcm4gaW50IGNtbV91bl9yZWdpc3Rlcl9ncHBzbV9zZWcoc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJCQkgICAgdTMyIHVsX3NlZ19pZCk7CisKKy8qCisgKiAgPT09PT09PT0gY21tX3hsYXRvcl9hbGxvY19idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIFNNIGJ1ZmZlciBhbmQgY3JlYXRlIGEgbG9jYWwgbWVtb3J5IGRlc2NyaXB0b3IuCisgKiAgICAgIFBsYWNlIG9uIHRoZSBkZXNjcmlwdG9yIG9uIHRoZSB0cmFuc2xhdG9yJ3MgSGFRIChIb3N0IEFsbG9jJ2QgUXVldWUpLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHhsYXRvcjogICAgSGFuZGxlIHRvIGEgWGxhdG9yIG9iamVjdC4KKyAqICAgICAgdmFfYnVmOiAgICAgVmlydHVhbCBhZGRyZXNzIHB0cihjbGllbnQgY29udGV4dCkKKyAqICAgICAgcGFfc2l6ZTogICAgU2l6ZSBvZiBTTSBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgUHRyIHRvIHZhbGlkIHBoeXNpY2FsIGFkZHJlc3MoUGEpIG9mIHBhX3NpemUgYnl0ZXMsIE5VTEwgaWYgZmFpbGVkLgorICogIFJlcXVpcmVzOgorICogICAgICB2YV9idWYgIT0gMC4KKyAqICAgICAgcGFfc2l6ZSAhPSAwLgorICogIEVuc3VyZXM6CisgKgorICovCitleHRlcm4gdm9pZCAqY21tX3hsYXRvcl9hbGxvY19idWYoc3RydWN0IGNtbV94bGF0b3JvYmplY3QgKnhsYXRvciwKKwkJCQkgIHZvaWQgKnZhX2J1ZiwgdTMyIHBhX3NpemUpOworCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICBDcmVhdGUgYSB0cmFuc2xhdG9yKHhsYXRvcikgb2JqZWN0IHVzZWQgZm9yIHByb2Nlc3Mgc3BlY2lmaWMgVmE8LT5QYQorICogICAgIGFkZHJlc3MgdHJhbnNsYXRpb24uIE5vZGUgbWVzc2FnaW5nIGFuZCBzdHJlYW1zIHVzZSB0aGlzIHRvIHBlcmZvcm0KKyAqICAgICBpbnRlci1wcm9jZXNzb3IoR1BQPC0+RFNQKSB6ZXJvLWNvcHkgZGF0YSB0cmFuc2Zlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgIHhsYXRvcjogICAgICAgICBBZGRyZXNzIHRvIHBsYWNlIGhhbmRsZSB0byBhIG5ldyBYbGF0b3IgaGFuZGxlLgorICogICAgIGhjbW1fbWdyOiAgICAgICAgSGFuZGxlIHRvIENtbSBNZ3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNsYXRvci4KKyAqICAgICB4bGF0b3JfYXR0cnM6ICAgVHJhbnNsYXRvciBhdHRyaWJ1dGVzIHVzZWQgZm9yIHRoZSBjbGllbnQgTk9ERSBvciBTVFJFQU0uCisgKiAgUmV0dXJuczoKKyAqICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgLUVJTlZBTDogICAgQmFkIGlucHV0IEF0dHJzLgorICogICAgIC1FTk9NRU06ICAgSW5zdWZmaWNpZW50IG1lbW9yeShsb2NhbCkgZm9yIHJlcXVlc3RlZCByZXNvdXJjZXMuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgeGxhdG9yICE9IE5VTEwKKyAqICAgICBoY21tX21nciAhPSBOVUxMCisgKiAgICAgeGxhdG9yX2F0dHJzICE9IE5VTEwKKyAqICBFbnN1cmVzOgorICoKKyAqLworZXh0ZXJuIGludCBjbW1feGxhdG9yX2NyZWF0ZShzdHJ1Y3QgY21tX3hsYXRvcm9iamVjdCAqKnhsYXRvciwKKwkJCQkgICAgc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJCSAgICBzdHJ1Y3QgY21tX3hsYXRvcmF0dHJzICp4bGF0b3JfYXR0cnMpOworCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfZGVsZXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVsZXRlIHRyYW5zbGF0b3IgcmVzb3VyY2VzCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgeGxhdG9yOiAgICBoYW5kbGUgdG8gdHJhbnNsYXRvci4KKyAqICAgICAgZm9yY2U6ICAgICBmb3JjZSA9IFRSVUUgd2lsbCBmcmVlIFhMYXRvcnMgU00gYnVmZmVycy9kc2NyaXB0cnMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEJhZCB0cmFuc2xhdG9yIGhhbmRsZS4KKyAqICAgICAgLUVQRVJNOiAgICAgIFVuYWJsZSB0byBmcmVlIHRyYW5zbGF0b3IgcmVzb3VyY2VzLgorICogIFJlcXVpcmVzOgorICogICAgICByZWZzID4gMAorICogIEVuc3VyZXM6CisgKgorICovCitleHRlcm4gaW50IGNtbV94bGF0b3JfZGVsZXRlKHN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICp4bGF0b3IsCisJCQkJICAgIGJvb2wgZm9yY2UpOworCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfZnJlZV9idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGcmVlIFNNIGJ1ZmZlciBhbmQgZGVzY3JpcHRvci4KKyAqICAgICAgRG9lcyBub3QgZnJlZSBjbGllbnQgcHJvY2VzcyBWTS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB4bGF0b3I6ICAgIGhhbmRsZSB0byB0cmFuc2xhdG9yLgorICogICAgICBidWZfdmEgICAgICBWaXJ0dWFsIGFkZHJlc3Mgb2YgUEEgdG8gZnJlZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgQmFkIHRyYW5zbGF0b3IgaGFuZGxlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKgorICovCitleHRlcm4gaW50IGNtbV94bGF0b3JfZnJlZV9idWYoc3RydWN0IGNtbV94bGF0b3JvYmplY3QgKnhsYXRvciwKKwkJCQkgICAgICB2b2lkICpidWZfdmEpOworCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNldC9HZXQgcHJvY2VzcyBzcGVjaWZpYyAidHJhbnNsYXRvciIgYWRkcmVzcyBpbmZvLgorICogICAgICBUaGlzIGlzIHVzZWQgdG8gcGVyZm9ybSBmYXN0IHZpcnRhdWwgYWRkcmVzcyB0cmFuc2xhdGlvbgorICogICAgICBmb3Igc2hhcmVkIG1lbW9yeSBidWZmZXJzIGJldHdlZW4gdGhlIEdQUCBhbmQgRFNQLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgeGxhdG9yOiAgICAgaGFuZGxlIHRvIHRyYW5zbGF0b3IuCisgKiAgICAgcGFkZHI6ICAgICAgIFZpcnR1YWwgYmFzZSBhZGRyZXNzIG9mIHNlZ21lbnQuCisgKiAgICAgdWxfc2l6ZTogICAgICBTaXplIGluIGJ5dGVzLgorICogICAgIHNlZ21faWQ6ICAgICBTZWdtZW50IGlkZW50aWZpZXIgb2YgU00gc2VnbWVudChzKQorICogICAgIHNldF9pbmZvICAgICBTZXQgeGxhdG9yIGZpZWxkcyBpZiBUUlVFLCBlbHNlIHJldHVybiBiYXNlIGFkZHIKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgQmFkIHRyYW5zbGF0b3IgaGFuZGxlLgorICogIFJlcXVpcmVzOgorICogICAgICAocmVmcyA+IDApCisgKiAgICAgIChwYWRkciAhPSBOVUxMKQorICogICAgICAodWxfc2l6ZSA+IDApCisgKiAgRW5zdXJlczoKKyAqCisgKi8KK2V4dGVybiBpbnQgY21tX3hsYXRvcl9pbmZvKHN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICp4bGF0b3IsCisJCQkJICB1OCAqKnBhZGRyLAorCQkJCSAgdTMyIHVsX3NpemUsIHUzMiBzZWdtX2lkLCBib29sIHNldF9pbmZvKTsKKworLyoKKyAqICA9PT09PT09PSBjbW1feGxhdG9yX3RyYW5zbGF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFBlcmZvcm0gYWRkcmVzcyB0cmFuc2xhdGlvbiBWQTwtPlBBIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbSBvcgorICogICAgICBtZXNzYWdlIHNoYXJlZCBtZW1vcnkgYnVmZmVyLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgeGxhdG9yOiBoYW5kbGUgdG8gdHJhbnNsYXRvci4KKyAqICAgICBwYWRkciAgICBhZGRyZXNzIG9mIGJ1ZmZlciB0byB0cmFuc2xhdGUuCisgKiAgICAgeHR5cGUgICAgVHlwZSBvZiBhZGRyZXNzIHhsYXRpb24uIENNTV9QQTJWQSBvciBDTU1fVkEyUEEuCisgKiAgUmV0dXJuczoKKyAqICAgICBWYWxpZCBhZGRyZXNzIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgcmVmcyA+IDAKKyAqICAgICAgcGFkZHIgIT0gTlVMTAorICogICAgICB4dHlwZSA+PSBDTU1fVkEyUEEpICYmICh4dHlwZSA8PSBDTU1fRFNQUEEyUEEpCisgKiAgRW5zdXJlczoKKyAqCisgKi8KK2V4dGVybiB2b2lkICpjbW1feGxhdG9yX3RyYW5zbGF0ZShzdHJ1Y3QgY21tX3hsYXRvcm9iamVjdCAqeGxhdG9yLAorCQkJCSAgdm9pZCAqcGFkZHIsIGVudW0gY21tX3hsYXRldHlwZSB4dHlwZSk7CisKKyNlbmRpZiAvKiBDTU1fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY21tZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NtbWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZmMzcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NtbWRlZnMuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIGNtbWRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgTUVNIGNvbnN0YW50cyBhbmQgdHlwZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgQ01NREVGU18KKyNkZWZpbmUgQ01NREVGU18KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9saXN0Lmg+CisKKy8qIENtbSBhdHRyaWJ1dGVzIHVzZWQgaW4gY21tX2NyZWF0ZSgpICovCitzdHJ1Y3QgY21tX21ncmF0dHJzIHsKKwkvKiBNaW5pbXVtIFNNIGFsbG9jYXRpb247IGRlZmF1bHQgMzIgYnl0ZXMuICovCisJdTMyIHVsX21pbl9ibG9ja19zaXplOworfTsKKworLyogQXR0cmlidXRlcyBmb3IgQ01NX0FsbG9jQnVmKCkgJiBDTU1fQWxsb2NEZXNjKCkgKi8KK3N0cnVjdCBjbW1fYXR0cnMgeworCXUzMiB1bF9zZWdfaWQ7CQkvKiAgMSwyLi4uIGFyZSBTTSBzZWdtZW50cy4gMCBpcyBub3QuICovCisJdTMyIHVsX2FsaWdubWVudDsJLyogIDAsMSwyLDQuLi4udWxfbWluX2Jsb2NrX3NpemUgKi8KK307CisKKy8qCisgKiAgRFNQUGEgdG8gR1BQUGEgQ29udmVyc2lvbiBGYWN0b3IuCisgKgorICogIEZvciB0eXBpY2FsIHBsYXRmb3JtczoKKyAqICAgICAgY29udmVydGVkIEFkZHJlc3MgPSBQYURTUCArICggY19mYWN0b3IgKiBhZGRyZXNzVG9Db252ZXJ0KS4KKyAqLworI2RlZmluZSBDTU1fU1VCRlJPTURTUFBBCS0xCisjZGVmaW5lIENNTV9BRERUT0RTUFBBCQkxCisKKyNkZWZpbmUgQ01NX0FMTFNFR01FTlRTICAgICAgICAgMHhGRkZGRkYJLyogQWxsIFNlZ0lkcyAqLworI2RlZmluZSBDTU1fTUFYR1BQU0VHUyAgICAgICAgICAxCS8qIE1heGltdW0gIyBvZiBTTSBzZWdzICovCisKKy8qCisgKiAgU01TRUdzIGFyZSBTTSBzZWdtZW50cyB0aGUgRFNQIGFsbG9jYXRlcyBmcm9tLgorICoKKyAqICBUaGlzIGluZm8gaXMgdXNlZCBieSB0aGUgR1BQIHRvIHhsYXRlIERTUCBhbGxvY2F0ZWQgUEFzLgorICovCisKK3N0cnVjdCBjbW1fc2VnaW5mbyB7CisJdTMyIGR3X3NlZ19iYXNlX3BhOwkvKiBTdGFydCBQaHlzIGFkZHJlc3Mgb2YgU00gc2VnbWVudCAqLworCS8qIFRvdGFsIHNpemUgaW4gYnl0ZXMgb2Ygc2VnbWVudDogRFNQK0dQUCAqLworCXUzMiB1bF90b3RhbF9zZWdfc2l6ZTsKKwl1MzIgZHdfZ3BwX2Jhc2VfcGE7CS8qIFN0YXJ0IFBoeXMgYWRkciBvZiBHcHAgU00gc2VnICovCisJdTMyIHVsX2dwcF9zaXplOwkvKiBTaXplIG9mIEdwcCBTTSBzZWcgaW4gYnl0ZXMgKi8KKwl1MzIgZHdfZHNwX2Jhc2VfdmE7CS8qIERTUCB2aXJ0IGJhc2UgYnl0ZSBhZGRyZXNzICovCisJdTMyIHVsX2RzcF9zaXplOwkvKiBEU1Agc2VnIHNpemUgaW4gYnl0ZXMgKi8KKwkvKiAjIG9mIGN1cnJlbnQgR1BQIGFsbG9jYXRpb25zIGZyb20gdGhpcyBzZWdtZW50ICovCisJdTMyIHVsX2luX3VzZV9jbnQ7CisJdTMyIGR3X3NlZ19iYXNlX3ZhOwkvKiBTdGFydCBWaXJ0IGFkZHJlc3Mgb2YgU00gc2VnICovCisKK307CisKKy8qIENNTSB1c2VmdWwgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBjbW1faW5mbyB7CisJLyogIyBvZiBTTSBzZWdtZW50cyByZWdpc3RlcmVkIHdpdGggdGhpcyBDbW0uICovCisJdTMyIHVsX251bV9ncHBzbV9zZWdzOworCS8qIFRvdGFsICMgb2YgYWxsb2NhdGlvbnMgb3V0c3RhbmRpbmcgZm9yIENNTSAqLworCXUzMiB1bF90b3RhbF9pbl91c2VfY250OworCS8qIE1pbiBTTSBibG9jayBzaXplIGFsbG9jYXRpb24gZnJvbSBjbW1fY3JlYXRlKCkgKi8KKwl1MzIgdWxfbWluX2Jsb2NrX3NpemU7CisJLyogSW5mbyBwZXIgcmVnaXN0ZXJlZCBTTSBzZWdtZW50LiAqLworCXN0cnVjdCBjbW1fc2VnaW5mbyBzZWdfaW5mb1tDTU1fTUFYR1BQU0VHU107Cit9OworCisvKiBYbGF0b3JDcmVhdGUgYXR0cmlidXRlcyAqLworc3RydWN0IGNtbV94bGF0b3JhdHRycyB7CisJdTMyIHVsX3NlZ19pZDsJCS8qIHNlZ21lbnQgSWQgdXNlZCBmb3IgU00gYWxsb2NhdGlvbnMgKi8KKwl1MzIgZHdfZHNwX2J1ZnM7CS8qICMgb2YgRFNQLXNpZGUgYnVmcyAqLworCXUzMiBkd19kc3BfYnVmX3NpemU7CS8qIHNpemUgb2YgRFNQLXNpZGUgYnVmcyBpbiBHUFAgYnl0ZXMgKi8KKwkvKiBWbSBiYXNlIGFkZHJlc3MgYWxsb2MnZCBpbiBjbGllbnQgcHJvY2VzcyBjb250ZXh0ICovCisJdm9pZCAqdm1fYmFzZTsKKwkvKiBkd192bV9zaXplIG11c3QgYmUgPj0gKGR3TWF4TnVtQnVmcyAqIGR3TWF4U2l6ZSkgKi8KKwl1MzIgZHdfdm1fc2l6ZTsKK307CisKKy8qCisgKiBDbW0gdHJhbnNsYXRpb24gdHlwZXMuIFVzZSB0byBtYXAgU00gYWRkcmVzc2VzIHRvIHByb2Nlc3MgY29udGV4dC4KKyAqLworZW51bSBjbW1feGxhdGV0eXBlIHsKKwlDTU1fVkEyUEEgPSAwLAkJLyogVmlydHVhbCB0byBHUFAgcGh5c2ljYWwgYWRkcmVzcyB4bGF0aW9uICovCisJQ01NX1BBMlZBID0gMSwJCS8qIEdQUCBQaHlzaWNhbCB0byB2aXJ0dWFsICovCisJQ01NX1ZBMkRTUFBBID0gMiwJLyogVmEgdG8gRFNQIFBhICovCisJQ01NX1BBMkRTUFBBID0gMywJLyogR1BQIFBhIHRvIERTUCBQYSAqLworCUNNTV9EU1BQQTJQQSA9IDQsCS8qIERTUCBQYSB0byBHUFAgUGEgKi8KK307CisKK3N0cnVjdCBjbW1fb2JqZWN0Oworc3RydWN0IGNtbV94bGF0b3JvYmplY3Q7CisKKyNlbmRpZiAvKiBDTU1ERUZTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NvZC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2NvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmNlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvY29kLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBjb2QuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb2RlIG1hbmFnZW1lbnQgbW9kdWxlIGZvciBEU1BzLiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UKKyAqIGludGVyZmFjZSBmb3IgbG9hZGluZyBib3RoIHN0YXRpYyBhbmQgZHluYW1pYyBjb2RlIG9iamVjdHMgb250byBEU1AKKyAqIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBDT0RfCisjZGVmaW5lIENPRF8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmxsZGVmcy5oPgorCisjZGVmaW5lIENPRF9NQVhQQVRITEVOR1RIICAgICAgIDI1NQorI2RlZmluZSBDT0RfVFJBQ0VCRUcgICAgICAgICAgICAiU1lTX1BVVENCRUciCisjZGVmaW5lIENPRF9UUkFDRUVORCAgICAgICAgICAgICJTWVNfUFVUQ0VORCIKKyNkZWZpbmUgQ09EX1RSQUNFQ1VSUE9TCSJCUklER0VfU1lTX1BVVENfY3VycmVudCIKKyNkZWZpbmUgQ09EX1RSQUNFU0VDVCAgICAgICAgICAgInRyYWNlIgorI2RlZmluZSBDT0RfVFJBQ0VCRUdPTEQgICAgICAgICAiUFVUQ0JFRyIKKyNkZWZpbmUgQ09EX1RSQUNFRU5ET0xEICAgICAgICAgIlBVVENFTkQiCisKKyNkZWZpbmUgQ09EX05PTE9BRCAgICAgICAgICAgICAgREJMTF9OT0xPQUQKKyNkZWZpbmUgQ09EX1NZTUIgICAgICAgICAgICAgICAgREJMTF9TWU1CCisKKy8qIENPRCBjb2RlIG1hbmFnZXIgaGFuZGxlICovCitzdHJ1Y3QgY29kX21hbmFnZXI7CisKKy8qIENPRCBsaWJyYXJ5IGhhbmRsZSAqLworc3RydWN0IGNvZF9saWJyYXJ5b2JqOworCisvKiBDT0QgYXR0cmlidXRlcyAqLworc3RydWN0IGNvZF9hdHRycyB7CisJdTMyIHVsX3Jlc2VydmVkOworfTsKKworLyoKKyAqICBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB3cml0aW5nIG1lbW9yeSB0byBhIERTUCBzeXN0ZW0sIGFsbG9jYXRpbmcKKyAqICBhbmQgZnJlZWluZyBEU1AgbWVtb3J5LgorICovCit0eXBlZGVmIHUzMigqY29kX3dyaXRlZnhuKSAodm9pZCAqcHJpdl9yZWYsIHUzMiBkc3BfYWRkLAorCQkJICAgIHZvaWQgKnBidWYsIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fc3BhY2UpOworCisvKgorICogID09PT09PT09IGNvZF9jbG9zZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENsb3NlIGEgbGlicmFyeSBvcGVuZWQgd2l0aCBjb2Rfb3BlbigpLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGxpYiAgICAgICAgICAgICAtIExpYnJhcnkgaGFuZGxlIHJldHVybmVkIGJ5IGNvZF9vcGVuKCkuCisgKiAgUmV0dXJuczoKKyAqICAgICAgTm9uZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ09EIG1vZHVsZSBpbml0aWFsaXplZC4KKyAqICAgICAgdmFsaWQgbGliLgorICogIEVuc3VyZXM6CisgKgorICovCitleHRlcm4gdm9pZCBjb2RfY2xvc2Uoc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIpOworCisvKgorICogID09PT09PT09IGNvZF9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYW4gb2JqZWN0IHRvIG1hbmFnZSBjb2RlIG9uIGEgRFNQIHN5c3RlbS4gVGhpcyBvYmplY3QgY2FuIGJlCisgKiAgICAgIHVzZWQgdG8gbG9hZCBhbiBpbml0aWFsIHByb2dyYW0gaW1hZ2Ugd2l0aCBhcmd1bWVudHMgdGhhdCBjYW4gbGF0ZXIKKyAqICAgICAgYmUgZXhwYW5kZWQgd2l0aCBkeW5hbWljYWxseSBsb2FkZWQgb2JqZWN0IGZpbGVzLgorICogICAgICBTeW1ib2wgdGFibGUgaW5mb3JtYXRpb24gaXMgbWFuYWdlZCBieSB0aGlzIG9iamVjdCBhbmQgY2FuIGJlIHJldHJpZXZlZAorICogICAgICB1c2luZyB0aGUgY29kX2dldF9zeW1fdmFsdWUoKSBmdW5jdGlvbi4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBtYW5hZ2VyOiAgICAgICAgY3JlYXRlZCBtYW5hZ2VyIG9iamVjdAorICogICAgICBzdHJfemxfZmlsZTogICAgWkwgRExMIGZpbGVuYW1lLCBvZiBsZW5ndGggPCBDT0RfTUFYUEFUSExFTkdUSC4KKyAqICAgICAgYXR0cnM6ICAgICAgICAgIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBieSB0aGlzIG9iamVjdC4gQSBOVUxMIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGNhdXNlIGRlZmF1bHQgYXR0cnMgdG8gYmUgdXNlZC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVNQSVBFOiAgIFpMX0NyZWF0ZSBmYWlsZWQuCisgKiAgICAgIC1FTk9TWVM6ICAgICAgICAgICBhdHRycyB3YXMgbm90IE5VTEwuICBXZSBkb24ndCB5ZXQgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24gZGVmYXVsdCB2YWx1ZXMgb2YgYXR0cnMuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIENPRCBtb2R1bGUgaW5pdGlhbGl6ZWQuCisgKiAgICAgIHN0cl96bF9maWxlICE9IE5VTEwKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGNvZF9jcmVhdGUoc3RydWN0IGNvZF9tYW5hZ2VyICoqbWdyLAorCQkJICAgICBjaGFyICpzdHJfemxfZmlsZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGNvZF9hdHRycyAqYXR0cnMpOworCisvKgorICogID09PT09PT09IGNvZF9kZWxldGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWxldGUgYSBjb2RlIG1hbmFnZXIgb2JqZWN0LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNvZF9tZ3Jfb2JqOiAgIGhhbmRsZSBvZiBtYW5hZ2VyIHRvIGJlIGRlbGV0ZWQKKyAqICBSZXR1cm5zOgorICogICAgICBOb25lLgorICogIFJlcXVpcmVzOgorICogICAgICBDT0QgbW9kdWxlIGluaXRpYWxpemVkLgorICogICAgICB2YWxpZCBjb2RfbWdyX29iai4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBjb2RfZGVsZXRlKHN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncl9vYmopOworCisvKgorICogID09PT09PT09IGNvZF9leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgdGhlIENPRCBtb2R1bGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgTm9uZS4KKyAqICBSZXR1cm5zOgorICogICAgICBOb25lLgorICogIFJlcXVpcmVzOgorICogICAgICBDT0QgaW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgUmVzb3VyY2VzIGFjcXVpcmVkIGluIGNvZF9pbml0KHZvaWQpIGFyZSBmcmVlZC4KKyAqLworZXh0ZXJuIHZvaWQgY29kX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gY29kX2dldF9iYXNlX2xpYiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldCBoYW5kbGUgdG8gdGhlIGJhc2UgaW1hZ2UgREJMIGxpYnJhcnkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY29kX21ncl9vYmo6ICAgaGFuZGxlIG9mIG1hbmFnZXIgdG8gYmUgZGVsZXRlZAorICogICAgICBwbGliOiAgICAgICBsb2NhdGlvbiB0byBzdG9yZSBsaWJyYXJ5IGhhbmRsZSBvbiBvdXRwdXQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzcy4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ09EIG1vZHVsZSBpbml0aWFsaXplZC4KKyAqICAgICAgdmFsaWQgY29kX21ncl9vYmouCisgKiAgICAgIHBsaWIgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGNvZF9nZXRfYmFzZV9saWIoc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyX29iaiwKKwkJCQkgICBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKnBsaWIpOworCisvKgorICogID09PT09PT09IGNvZF9nZXRfYmFzZV9uYW1lID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IHRoZSBuYW1lIG9mIHRoZSBiYXNlIGltYWdlIERCTCBsaWJyYXJ5LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNvZF9tZ3Jfb2JqOiAgIGhhbmRsZSBvZiBtYW5hZ2VyIHRvIGJlIGRlbGV0ZWQKKyAqICAgICAgc3pfbmFtZTogICAgbG9jYXRpb24gdG8gc3RvcmUgbGlicmFyeSBuYW1lIG9uIG91dHB1dC4KKyAqICAgICAgdXNpemU6ICAgICAgIHNpemUgb2YgbmFtZSBidWZmZXIuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzcy4KKyAqICAgICAgLUVQRVJNOiAgQnVmZmVyIHRvbyBzbWFsbC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ09EIG1vZHVsZSBpbml0aWFsaXplZC4KKyAqICAgICAgdmFsaWQgY29kX21ncl9vYmouCisgKiAgICAgIHN6X25hbWUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGNvZF9nZXRfYmFzZV9uYW1lKHN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncl9vYmosCisJCQkJICAgIGNoYXIgKnN6X25hbWUsIHUzMiB1c2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gY29kX2dldF9lbnRyeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBlbnRyeSBwb2ludCBvZiBhIGxvYWRlZCBEU1AgcHJvZ3JhbSBpbWFnZQorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNvZF9tZ3Jfb2JqOiAgIGhhbmRsZSBvZiBtYW5hZ2VyIHRvIGJlIGRlbGV0ZWQKKyAqICAgICAgZW50cnlfcHQ6ICAgcG9pbnRlciB0byBsb2NhdGlvbiBmb3IgZW50cnkgcG9pbnQKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICBTdWNjZXNzLgorICogIFJlcXVpcmVzOgorICogICAgICBDT0QgbW9kdWxlIGluaXRpYWxpemVkLgorICogICAgICB2YWxpZCBjb2RfbWdyX29iai4KKyAqICAgICAgZW50cnlfcHQgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGNvZF9nZXRfZW50cnkoc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyX29iaiwKKwkJCQl1MzIgKmVudHJ5X3B0KTsKKworLyoKKyAqICA9PT09PT09PSBjb2RfZ2V0X2xvYWRlciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldCBoYW5kbGUgdG8gdGhlIERCTCBsb2FkZXIuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY29kX21ncl9vYmo6ICAgaGFuZGxlIG9mIG1hbmFnZXIgdG8gYmUgZGVsZXRlZAorICogICAgICBsb2FkZXI6ICAgICBsb2NhdGlvbiB0byBzdG9yZSBsb2FkZXIgaGFuZGxlIG9uIG91dHB1dC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICBTdWNjZXNzLgorICogIFJlcXVpcmVzOgorICogICAgICBDT0QgbW9kdWxlIGluaXRpYWxpemVkLgorICogICAgICB2YWxpZCBjb2RfbWdyX29iai4KKyAqICAgICAgbG9hZGVyICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBjb2RfZ2V0X2xvYWRlcihzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3Jfb2JqLAorCQkJCSBzdHJ1Y3QgZGJsbF90YXJfb2JqICoqbG9hZGVyKTsKKworLyoKKyAqICA9PT09PT09PSBjb2RfZ2V0X3NlY3Rpb24gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIGEgc2VjdGlvbiBpbiB0aGUgQ09GRiBmaWxlCisgKiAgICAgIGdpdmVuIHRoZSBzZWN0aW9uIG5hbWUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbGliICAgICAgICAgTGlicmFyeSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBjb2Rfb3BlbigpLgorICogICAgICBzdHJfc2VjdDogICBuYW1lIG9mIHRoZSBzZWN0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbGVhZGluZyAiLiIKKyAqICAgICAgYWRkcjogICAgICAgTG9jYXRpb24gdG8gc3RvcmUgYWRkcmVzcy4KKyAqICAgICAgbGVuOiAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgbGVuZ3RoLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAqICAgICAgLUVTUElQRTogIFN5bWJvbHMgY291bGQgbm90IGJlIGZvdW5kIG9yIGhhdmUgbm90IGJlZW4gbG9hZGVkIG9udG8KKyAqICAgICAgICAgICAgICAgIHRoZSBib2FyZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ09EIG1vZHVsZSBpbml0aWFsaXplZC4KKyAqICAgICAgdmFsaWQgY29kX21ncl9vYmouCisgKiAgICAgIHN0cl9zZWN0ICE9IE5VTEw7CisgKiAgICAgIGFkZHIgIT0gTlVMTDsKKyAqICAgICAgbGVuICE9IE5VTEw7CisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICphZGRyIGFuZCAqbGVuIGNvbnRhaW4gdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICBzZWN0aW9uLgorICogICAgICBlbHNlOiAgKmFkZHIgPT0gMCBhbmQgKmxlbiA9PSAwOworICoKKyAqLworZXh0ZXJuIGludCBjb2RfZ2V0X3NlY3Rpb24oc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIsCisJCQkJICBjaGFyICpzdHJfc2VjdCwKKwkJCQkgIHUzMiAqYWRkciwgdTMyICpsZW4pOworCisvKgorICogID09PT09PT09IGNvZF9nZXRfc3ltX3ZhbHVlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHN5bWJvbC4gVGhlIHN5bWJvbCBpcyBmaXJzdAorICogICAgICBzZWFyY2hlZCBmb3IgbGl0ZXJhbGx5IGFuZCB0aGVuLCBpZiBub3QgZm91bmQsIHNlYXJjaGVkIGZvciBhcyBhCisgKiAgICAgIEMgc3ltYm9sLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGxpYjogICAgICAgIGxpYnJhcnkgaGFuZGxlIHJldHVybmVkIGZyb20gY29kX29wZW4oKS4KKyAqICAgICAgcHN0clN5bWJvbDogbmFtZSBvZiB0aGUgc3ltYm9sCisgKiAgICAgIHZhbHVlOiAgICAgIHZhbHVlIG9mIHRoZSBzeW1ib2wKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVNQSVBFOiAgU3ltYm9scyBjb3VsZCBub3QgYmUgZm91bmQgb3IgaGF2ZSBub3QgYmVlbiBsb2FkZWQgb250bworICogICAgICAgICAgICAgICAgdGhlIGJvYXJkLgorICogIFJlcXVpcmVzOgorICogICAgICBDT0QgbW9kdWxlIGluaXRpYWxpemVkLgorICogICAgICBWYWxpZCBjb2RfbWdyX29iai4KKyAqICAgICAgc3RyX3N5bSAhPSBOVUxMLgorICogICAgICBwdWxfdmFsdWUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGNvZF9nZXRfc3ltX3ZhbHVlKHN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncl9vYmosCisJCQkJICAgIGNoYXIgKnN0cl9zeW0sIHUzMiAqIHB1bF92YWx1ZSk7CisKKy8qCisgKiAgPT09PT09PT0gY29kX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIHRoZSBDT0QgbW9kdWxlJ3MgcHJpdmF0ZSBzdGF0ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBOb25lLgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgaW5pdGlhbGl6ZWQ7IEZBTFNFIGlmIGVycm9yIG9jY3VyZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgQSByZXF1aXJlbWVudCBmb3IgZWFjaCBvZiB0aGUgb3RoZXIgcHVibGljIENPRCBmdW5jdGlvbnMuCisgKi8KK2V4dGVybiBib29sIGNvZF9pbml0KHZvaWQpOworCisvKgorICogID09PT09PT09IGNvZF9sb2FkX2Jhc2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBMb2FkIHRoZSBpbml0aWFsIHByb2dyYW0gaW1hZ2UsIG9wdGlvbmFsbHkgd2l0aCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLAorICogICAgICBvbiB0aGUgRFNQIHN5c3RlbSBtYW5hZ2VkIGJ5IHRoZSBzdXBwbGllZCBoYW5kbGUuIFRoZSBwcm9ncmFtIHRvIGJlCisgKiAgICAgIGxvYWRlZCBtdXN0IGJlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcmdzIGFycmF5IGFuZCBtdXN0IGJlIGEgZnVsbHkKKyAqICAgICAgcXVhbGlmaWVkIHBhdGhuYW1lLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhtZ3I6ICAgICAgIG1hbmFnZXIgdG8gbG9hZCB0aGUgY29kZSB3aXRoCisgKiAgICAgIG51bV9hcmdjOiAgIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGFyZ3MgYXJyYXkKKyAqICAgICAgYXJnczogICAgICAgYXJyYXkgb2Ygc3RyaW5ncyBmb3IgYXJndW1lbnRzIHRvIERTUCBwcm9ncmFtCisgKiAgICAgIHdyaXRlX2Z4bjogICBib2FyZC1zcGVjaWZpYyBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIHRvIERTUCBzeXN0ZW0KKyAqICAgICAgYXJiOiAgICAgICBhcmJpdHJhcnkgcG9pbnRlciB0byBiZSBwYXNzZWQgYXMgZmlyc3QgYXJnIHRvIHdyaXRlX2Z4bgorICogICAgICBlbnZwOiAgICAgICBhcnJheSBvZiBlbnZpcm9ubWVudCBzdHJpbmdzIGZvciBEU1AgZXhlYy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUJBREY6ICAgICAgIEZhaWxlZCB0byBvcGVuIHRhcmdldCBjb2RlLgorICogIFJlcXVpcmVzOgorICogICAgICBDT0QgbW9kdWxlIGluaXRpYWxpemVkLgorICogICAgICBobWdyIGlzIHZhbGlkLgorICogICAgICBudW1fYXJnYyA+IDAuCisgKiAgICAgIGFyZ3MgIT0gTlVMTC4KKyAqICAgICAgYXJnc1swXSAhPSBOVUxMLgorICogICAgICBwZm5fd3JpdGUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGNvZF9sb2FkX2Jhc2Uoc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyX29iaiwKKwkJCQl1MzIgbnVtX2FyZ2MsIGNoYXIgKmFyZ3NbXSwKKwkJCQljb2Rfd3JpdGVmeG4gcGZuX3dyaXRlLCB2b2lkICphcmIsCisJCQkJY2hhciAqZW52cFtdKTsKKworLyoKKyAqICA9PT09PT09PSBjb2Rfb3BlbiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIE9wZW4gYSBsaWJyYXJ5IGZvciByZWFkaW5nIHNlY3Rpb25zLiBEb2VzIG5vdCBsb2FkIG9yIHNldCB0aGUgYmFzZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobWdyOiAgICAgICAgICAgbWFuYWdlciB0byBsb2FkIHRoZSBjb2RlIHdpdGgKKyAqICAgICAgc3pfY29mZl9wYXRoOiAgIENvZmYgZmlsZSB0byBvcGVuLgorICogICAgICBmbGFnczogICAgICAgICAgQ09EX05PTE9BRCAoZG9uJ3QgbG9hZCBzeW1ib2xzKSBvciBDT0RfU1lNQiAobG9hZAorICogICAgICAgICAgICAgICAgICAgICAgc3ltYm9scykuCisgKiAgICAgIGxpYl9vYmo6ICAgICAgICBIYW5kbGUgcmV0dXJuZWQgdGhhdCBjYW4gYmUgdXNlZCBpbiBjYWxscyB0byBjb2RfY2xvc2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBjb2RfZ2V0X3NlY3Rpb24uCisgKiAgUmV0dXJuczoKKyAqICAgICAgU19PSzogICAgICAgICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVCQURGOiAgICAgICBGYWlsZWQgdG8gb3BlbiB0YXJnZXQgY29kZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ09EIG1vZHVsZSBpbml0aWFsaXplZC4KKyAqICAgICAgaG1nciBpcyB2YWxpZC4KKyAqICAgICAgZmxhZ3MgPT0gQ09EX05PTE9BRCB8fCBmbGFncyA9PSBDT0RfU1lNQi4KKyAqICAgICAgc3pfY29mZl9wYXRoICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBjb2Rfb3BlbihzdHJ1Y3QgY29kX21hbmFnZXIgKmhtZ3IsCisJCQkgICBjaGFyICpzel9jb2ZmX3BhdGgsCisJCQkgICB1MzIgZmxhZ3MsIHN0cnVjdCBjb2RfbGlicmFyeW9iaiAqKmxpYl9vYmopOworCisvKgorICogID09PT09PT09IGNvZF9vcGVuX2Jhc2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBPcGVuIGJhc2UgaW1hZ2UgZm9yIHJlYWRpbmcgc2VjdGlvbnMuIERvZXMgbm90IGxvYWQgdGhlIGJhc2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG1ncjogICAgICAgICAgIG1hbmFnZXIgdG8gbG9hZCB0aGUgY29kZSB3aXRoCisgKiAgICAgIHN6X2NvZmZfcGF0aDogICBDb2ZmIGZpbGUgdG8gb3Blbi4KKyAqICAgICAgZmxhZ3M6ICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIGxvYWQgc3ltYm9scy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FQkFERjogICBGYWlsZWQgdG8gb3BlbiB0YXJnZXQgY29kZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQ09EIG1vZHVsZSBpbml0aWFsaXplZC4KKyAqICAgICAgaG1nciBpcyB2YWxpZC4KKyAqICAgICAgc3pfY29mZl9wYXRoICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBjb2Rfb3Blbl9iYXNlKHN0cnVjdCBjb2RfbWFuYWdlciAqaG1nciwgY2hhciAqc3pfY29mZl9wYXRoLAorCQkJCWRibGxfZmxhZ3MgZmxhZ3MpOworCisvKgorICogID09PT09PT09IGNvZF9yZWFkX3NlY3Rpb24gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgY29udGVudCBvZiBhIGNvZGUgc2VjdGlvbiBnaXZlbiB0aGUgc2VjdGlvbiBuYW1lLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNvZF9tZ3Jfb2JqICAgIC0gbWFuYWdlciBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBzeW1ib2wKKyAqICAgICAgc3RyX3NlY3QgICAgLSBuYW1lIG9mIHRoZSBzZWN0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbGVhZGluZyAiLiIKKyAqICAgICAgc3RyX2NvbnRlbnQgLSBidWZmZXIgdG8gc3RvcmUgY29udGVudCBvZiB0aGUgc2VjdGlvbi4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqICAgICAgLUVTUElQRTogIFN5bWJvbHMgaGF2ZSBub3QgYmVlbiBsb2FkZWQgb250byB0aGUgYm9hcmQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIENPRCBtb2R1bGUgaW5pdGlhbGl6ZWQuCisgKiAgICAgIHZhbGlkIGNvZF9tZ3Jfb2JqLgorICogICAgICBzdHJfc2VjdCAhPSBOVUxMOworICogICAgICBzdHJfY29udGVudCAhPSBOVUxMOworICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAqc3RyX2NvbnRlbnQgc3RvcmVzIHRoZSBjb250ZW50IG9mIHRoZSBuYW1lZCBzZWN0aW9uLgorICovCitleHRlcm4gaW50IGNvZF9yZWFkX3NlY3Rpb24oc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIsCisJCQkJICAgY2hhciAqc3RyX3NlY3QsCisJCQkJICAgY2hhciAqc3RyX2NvbnRlbnQsIHUzMiBjb250ZW50X3NpemUpOworCisjZW5kaWYgLyogQ09EXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RiYy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RiYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Mzc2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGJjLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGRiYy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqICJEZXNpZ24gYnkgQ29udHJhY3QiIHByb2dyYW1taW5nIG1hY3Jvcy4KKyAqCisgKiBOb3RlczoKKyAqICAgUmVxdWlyZXMgdGhhdCB0aGUgR1QtPkVSUk9SIGZ1bmN0aW9uIGhhcyBiZWVuIGRlZmF1bHRlZCB0byBhIHZhbGlkCisgKiAgIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgKgorICogICBEb2VzIG5vdCByZXF1aXJlIHRoYXQgR1RfaW5pdCgpIGJlIGNhbGxlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBEQkNfCisjZGVmaW5lIERCQ18KKworLyogQXNzZXJ0aW9uIE1hY3JvczogKi8KKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfREVCVUcKKworI2RlZmluZSBEQkNfQVNTRVJUKGV4cCkgXAorICAgIGlmICghKGV4cCkpIFwKKwlwcl9lcnIoIiVzLCBsaW5lICVkOiBBc3NlcnRpb24gKCIgI2V4cCAiKSBmYWlsZWQuXG4iLCBcCisJX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBEQkNfUkVRVUlSRSBEQkNfQVNTRVJUCS8qIEZ1bmN0aW9uIFByZWNvbmRpdGlvbi4gKi8KKyNkZWZpbmUgREJDX0VOU1VSRSAgREJDX0FTU0VSVAkvKiBGdW5jdGlvbiBQb3N0Y29uZGl0aW9uLiAqLworCisjZWxzZQorCisjZGVmaW5lIERCQ19BU1NFUlQoZXhwKSB7fQorI2RlZmluZSBEQkNfUkVRVUlSRShleHApIHt9CisjZGVmaW5lIERCQ19FTlNVUkUoZXhwKSB7fQorCisjZW5kaWYgLyogREVCVUcgKi8KKworI2VuZGlmIC8qIERCQ18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kYmRjZC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RiZGNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjM2UxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kYmRjZC5oCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogZGJkY2QuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEZWZpbmVzIHRoZSBEU1AvQklPUyBCcmlkZ2UgQ29uZmlndXJhdGlvbiBEYXRhYmFzZSAoRENEKSBBUEkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgREJEQ0RfCisjZGVmaW5lIERCRENEXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGNkZGVmLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbmxkcmRlZnMuaD4KKworLyoKKyAqICA9PT09PT09PSBkY2RfYXV0b19yZWdpc3RlciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSByZWdpc3RlcnMgRENEIG9iamVjdHMgc3BlY2lmaWVkIGluIGEKKyAqICAgICAgc3BlY2lhbCBDT0ZGIHNlY3Rpb24gY2FsbGVkICIuZGNkX3JlZ2lzdGVyIgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkY2RfbWdyOiAgICAgICAgICAgICAgICBBIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgc3pfY29mZl9wYXRoOiAgICAgICAgICAgUG9pbnRlciB0byBuYW1lIG9mIENPRkYgZmlsZSBjb250YWluaW5nIERDRAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzIHRvIGJlIHJlZ2lzdGVyZWQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVBQ0NFUzogVW5hYmxlIHRvIGZpbmQgYXV0by1yZWdpc3RyYXRpb24vcmVhZC9sb2FkIHNlY3Rpb24uCisgKiAgICAgIC1FRkFVTFQ6ICAgICAgICAgICAgSW52YWxpZCBEQ0RfSE1BTkFHRVIgaGFuZGxlLi4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgRENEIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgTm90ZToKKyAqICAgICAgRHVlIHRvIHRoZSBEQ0QgZGF0YWJhc2UgY29uc3RydWN0aW9uLCBpdCBpcyBlc3NlbnRpYWwgZm9yIGEgRENELWVuYWJsZWQKKyAqICAgICAgQ09GRiBmaWxlIHRvIGNvbnRhaW4gdGhlIHJpZ2h0IENPRkYgc2VjdGlvbnMsIGVzcGVjaWFsbHkKKyAqICAgICAgIi5kY2RfcmVnaXN0ZXIiLCB3aGljaCBpcyB1c2VkIGZvciBhdXRvIHJlZ2lzdHJhdGlvbi4KKyAqLworZXh0ZXJuIGludCBkY2RfYXV0b19yZWdpc3RlcihzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyLAorCQkJCSAgICBjaGFyICpzel9jb2ZmX3BhdGgpOworCisvKgorICogID09PT09PT09IGRjZF9hdXRvX3VucmVnaXN0ZXIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlcnMgRENEIG9iamVjdHMgc3BlY2lmaWVkIGluIGEKKyAqICAgICAgc3BlY2lhbCBDT0ZGIHNlY3Rpb24gY2FsbGVkICIuZGNkX3JlZ2lzdGVyIgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkY2RfbWdyOiAgICAgICAgICAgICAgICBBIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgc3pfY29mZl9wYXRoOiAgICAgICAgICAgUG9pbnRlciB0byBuYW1lIG9mIENPRkYgZmlsZSBjb250YWluaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDRCBvYmplY3RzIHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUFDQ0VTOiBVbmFibGUgdG8gZmluZCBhdXRvLXJlZ2lzdHJhdGlvbi9yZWFkL2xvYWQgc2VjdGlvbi4KKyAqICAgICAgLUVGQVVMVDogICAgICAgICAgICBJbnZhbGlkIERDRF9ITUFOQUdFUiBoYW5kbGUuLgorICogIFJlcXVpcmVzOgorICogICAgICBEQ0QgaW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICBOb3RlOgorICogICAgICBEdWUgdG8gdGhlIERDRCBkYXRhYmFzZSBjb25zdHJ1Y3Rpb24sIGl0IGlzIGVzc2VudGlhbCBmb3IgYSBEQ0QtZW5hYmxlZAorICogICAgICBDT0ZGIGZpbGUgdG8gY29udGFpbiB0aGUgcmlnaHQgQ09GRiBzZWN0aW9ucywgZXNwZWNpYWxseQorICogICAgICAiLmRjZF9yZWdpc3RlciIsIHdoaWNoIGlzIHVzZWQgZm9yIGF1dG8gdW5yZWdpc3RyYXRpb24uCisgKi8KK2V4dGVybiBpbnQgZGNkX2F1dG9fdW5yZWdpc3RlcihzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyLAorCQkJCSAgICAgIGNoYXIgKnN6X2NvZmZfcGF0aCk7CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2NyZWF0ZV9tYW5hZ2VyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgRENEIG1vZHVsZSBtYW5hZ2VyLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHN6X3psX2RsbF9uYW1lOiBQb2ludGVyIHRvIGEgRExMIG5hbWUgc3RyaW5nLgorICogICAgICBkY2RfbWdyOiAgICAgICAgQSBwb2ludGVyIHRvIGEgRENEIG1hbmFnZXIgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBEQ0QgbWFuYWdlciBoYW5kbGUuCisgKiAgICAgIC1FUEVSTTogICAgICBHZW5lcmFsIGZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERDRCBpbml0aWFsaXplZC4KKyAqICAgICAgc3pfemxfZGxsX25hbWUgaXMgbm9uLU5VTEwuCisgKiAgICAgIGRjZF9tZ3IgaXMgbm9uLU5VTEwuCisgKiAgRW5zdXJlczoKKyAqICAgICAgQSBEQ0QgbWFuYWdlciBoYW5kbGUgaXMgY3JlYXRlZC4KKyAqLworZXh0ZXJuIGludCBkY2RfY3JlYXRlX21hbmFnZXIoY2hhciAqc3pfemxfZGxsX25hbWUsCisJCQkJICAgICBzdHJ1Y3QgZGNkX21hbmFnZXIgKipkY2RfbWdyKTsKKworLyoKKyAqICA9PT09PT09PSBkY2RfZGVzdHJveV9tYW5hZ2VyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhIERDRCBtb2R1bGUgbWFuYWdlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGNkX21ncjogICAgICAgIEEgRENEIG1hbmFnZXIgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgRENEIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgZGNkX2Rlc3Ryb3lfbWFuYWdlcihzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyKTsKKworLyoKKyAqICA9PT09PT09PSBkY2RfZW51bWVyYXRlX29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZW51bWVyYXRlcyBjdXJyZW50bHkgdmlzaWJsZSBEU1AvQklPUyBCcmlkZ2Ugb2JqZWN0cworICogICAgICBhbmQgcmV0dXJucyB0aGUgVVVJRCBhbmQgdHlwZSBvZiBlYWNoIGVudW1lcmF0ZWQgb2JqZWN0LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGluZGV4OiAgICAgICAgICAgICAgVGhlIG9iamVjdCBlbnVtZXJhdGlvbiBpbmRleC4KKyAqICAgICAgb2JqX3R5cGU6ICAgICAgICAgICAgVHlwZSBvZiBvYmplY3QgdG8gZW51bWVyYXRlLgorICogICAgICB1dWlkX29iajogICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBkc3BfdXVpZCBvYmplY3QuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgICAgIFVuYWJsZSB0byBlbnVtZXJhdGUgdGhyb3VnaCB0aGUgRENEIGRhdGFiYXNlLgorICogICAgICBFTk9EQVRBOiAgRW51bWVyYXRpb24gY29tcGxldGVkLiBUaGlzIGlzIG5vdCBhbiBlcnJvciBjb2RlLgorICogIFJlcXVpcmVzOgorICogICAgICBEQ0QgaW5pdGlhbGl6ZWQuCisgKiAgICAgIHV1aWRfb2JqIGlzIGEgdmFsaWQgcG9pbnRlci4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBkY2RfZ2V0X29iamVjdF9kZWYgdG8KKyAqICAgICAgcmV0cmlldmUgb2JqZWN0IHByb3BlcnRpZXMuCisgKi8KK2V4dGVybiBpbnQgZGNkX2VudW1lcmF0ZV9vYmplY3QoczMyIGluZGV4LAorCQkJCSAgICAgICBlbnVtIGRzcF9kY2RvYmp0eXBlIG9ial90eXBlLAorCQkJCSAgICAgICBzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBkY2RfZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSBEQ0QgbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgRENEIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB2b2lkIGRjZF9leGl0KHZvaWQpOworCisvKgorICogID09PT09PT09IGRjZF9nZXRfZGVwX2xpYnMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHaXZlbiB0aGUgdXVpZCBvZiBhIGxpYnJhcnkgYW5kIHNpemUgb2YgYXJyYXkgb2YgdXVpZHMsIHRoaXMgZnVuY3Rpb24KKyAqICAgICAgZmlsbHMgdGhlIGFycmF5IHdpdGggdGhlIHV1aWRzIG9mIGFsbCBkZXBlbmRlbnQgbGlicmFyaWVzIG9mIHRoZSBpbnB1dAorICogICAgICBsaWJyYXJ5LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkY2RfbWdyOiBBIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgdXVpZF9vYmo6IFBvaW50ZXIgdG8gYSBkc3BfdXVpZCBmb3IgYSBsaWJyYXJ5LgorICogICAgICBudW1fbGliczogU2l6ZSBvZiB1dWlkIGFycmF5IChudW1iZXIgb2YgbGlicmFyeSB1dWlkcykuCisgKiAgICAgIGRlcF9saWJfdXVpZHM6IEFycmF5IG9mIGRlcGVuZGVudCBsaWJyYXJ5IHV1aWRzIHRvIGJlIGZpbGxlZCBpbi4KKyAqICAgICAgcHJzdG50X2RlcF9saWJzOiAgICBBcnJheSBpbmRpY2F0aW5nIGlmIGNvcnJlc3BvbmRpbmcgbGliIGlzIHBlcnNpc3RlbnQuCisgKiAgICAgIHBoYXNlOiBwaGFzZSB0byBvYnRhaW4gY29ycmVjdCBpbnB1dCBsaWJyYXJ5CisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KKyAqICAgICAgLUVBQ0NFUzogRmFpbHVyZSB0byByZWFkIHNlY3Rpb24gY29udGFpbmluZyBsaWJyYXJ5IGluZm8uCisgKiAgICAgIC1FUEVSTTogR2VuZXJhbCBmYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogICAgICBEQ0QgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGhkY2RfbWdyLgorICogICAgICB1dWlkX29iaiAhPSBOVUxMCisgKiAgICAgIGRlcF9saWJfdXVpZHMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRjZF9nZXRfZGVwX2xpYnMoc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21nciwKKwkJCQkgICBzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJCSAgIHUxNiBudW1fbGlicywKKwkJCQkgICBzdHJ1Y3QgZHNwX3V1aWQgKmRlcF9saWJfdXVpZHMsCisJCQkJICAgYm9vbCAqcHJzdG50X2RlcF9saWJzLAorCQkJCSAgIGVudW0gbmxkcl9waGFzZSBwaGFzZSk7CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2dldF9udW1fZGVwX2xpYnMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHaXZlbiB0aGUgdXVpZCBvZiBhIGxpYnJhcnksIGRldGVybWluZSBpdHMgbnVtYmVyIG9mIGRlcGVuZGVudAorICogICAgICBsaWJyYXJpZXMuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRjZF9tZ3I6ICAgICAgICBBIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgdXVpZF9vYmo6ICAgICAgICAgIFBvaW50ZXIgdG8gYSBkc3BfdXVpZCBmb3IgYSBsaWJyYXJ5LgorICogICAgICBudW1fbGliczogICAgICAgU2l6ZSBvZiB1dWlkIGFycmF5IChudW1iZXIgb2YgbGlicmFyeSB1dWlkcykuCisgKiAgICAgIG51bV9wZXJzX2xpYnM6ICBudW1iZXIgb2YgcGVyc2lzdGVudCBkZXBlbmRlbnQgbGlicmFyeS4KKyAqICAgICAgcGhhc2U6ICAgICAgICAgIFBoYXNlIHRvIG9idGFpbiBjb3JyZWN0IGlucHV0IGxpYnJhcnkKKyAqICBSZXR1cm5zOgorICogICAgICAwOiBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgorICogICAgICAtRUFDQ0VTOiBGYWlsdXJlIHRvIHJlYWQgc2VjdGlvbiBjb250YWluaW5nIGxpYnJhcnkgaW5mby4KKyAqICAgICAgLUVQRVJNOiBHZW5lcmFsIGZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERDRCBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgaGRjZF9tZ3IuCisgKiAgICAgIHV1aWRfb2JqICE9IE5VTEwKKyAqICAgICAgbnVtX2xpYnMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRjZF9nZXRfbnVtX2RlcF9saWJzKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkJICAgICAgIHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJICAgICAgIHUxNiAqbnVtX2xpYnMsCisJCQkJICAgICAgIHUxNiAqbnVtX3BlcnNfbGlicywKKwkJCQkgICAgICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKTsKKworLyoKKyAqICA9PT09PT09PSBkY2RfZ2V0X2xpYnJhcnlfbmFtZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBvZiBhIChkeW5hbWljKSBsaWJyYXJ5IGZvciBhIGdpdmVuCisgKiAgICAgIFVVSUQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRjZF9tZ3I6IEEgRENEIG1hbmFnZXIgaGFuZGxlLgorICogICAgICB1dWlkX29iajoJUG9pbnRlciB0byBhIGRzcF91dWlkIHRoYXQgcmVwcmVzZW50cyBhIHVuaXF1ZSBEU1AvQklPUworICogICAgICAgICAgICAgICAgICAgICAgQnJpZGdlIG9iamVjdC4KKyAqICAgICAgc3RyX2xpYl9uYW1lOiBCdWZmZXIgdG8gaG9sZCBsaWJyYXJ5IG5hbWUuCisgKiAgICAgIGJ1ZmZfc2l6ZTogQ29udGFpbnMgYnVmZmVyIHNpemUuIFNldCB0byBzdHJpbmcgc2l6ZSBvbiBvdXRwdXQuCisgKiAgICAgIHBoYXNlOiAgICAgICAgICBXaGljaCBwaGFzZSB0byBsb2FkCisgKiAgICAgIHBoYXNlX3NwbGl0OiAgICBBcmUgcGhhc2VzIGluIG11bHRpcGxlIGxpYnJhcmllcworICogIFJldHVybnM6CisgKiAgICAgIDA6IFN1Y2Nlc3MuCisgKiAgICAgIC1FUEVSTTogR2VuZXJhbCBmYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogICAgICBEQ0QgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGhkY2RfbWdyLgorICogICAgICBzdHJfbGliX25hbWUgIT0gTlVMTC4KKyAqICAgICAgdXVpZF9vYmogIT0gTlVMTAorICogICAgICBidWZmX3NpemUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRjZF9nZXRfbGlicmFyeV9uYW1lKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkJICAgICAgIHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJICAgICAgIGNoYXIgKnN0cl9saWJfbmFtZSwKKwkJCQkgICAgICAgdTMyICpidWZmX3NpemUsCisJCQkJICAgICAgIGVudW0gbmxkcl9waGFzZSBwaGFzZSwKKwkJCQkgICAgICAgYm9vbCAqcGhhc2Vfc3BsaXQpOworCisvKgorICogID09PT09PT09IGRjZF9nZXRfb2JqZWN0X2RlZiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJvcGVydGllcy9hdHRyaWJ1dGVzIG9mIGEgRFNQL0JJT1MgQnJpZGdlCisgKiAgICAgIG9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGNkX21ncjogICAgICAgICAgICBBIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgdXVpZF9vYmo6ICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgZHNwX3V1aWQgdGhhdCByZXByZXNlbnRzIGEgdW5pcXVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRFNQL0JJT1MgQnJpZGdlIG9iamVjdC4KKyAqICAgICAgb2JqX3R5cGU6ICAgICAgICAgICAgVGhlIHR5cGUgb2YgRFNQL0JJT1MgQnJpZGdlIG9iamVjdCB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgKG5vZGUsIHByb2Nlc3NvciwgZXRjKS4KKyAqICAgICAgb2JqX2RlZjogICAgICAgICAgICBQb2ludGVyIHRvIGFuIG9iamVjdCBkZWZpbml0aW9uIHN0cnVjdHVyZS4gQQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIG9mIHZhcmlvdXMgcG9zc2libGUgRENEIG9iamVjdCB0eXBlcy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiBTdWNjZXNzLgorICogICAgICAtRUFDQ0VTOiBVbmFibGUgdG8gYWNjZXNzL3JlYWQvcGFyc2UvbG9hZCBjb250ZW50IG9mIG9iamVjdCBjb2RlCisgKiAgICAgICAgICAgICAgIHNlY3Rpb24uCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgR2VuZXJhbCBmYWlsdXJlLgorICogICAgICAtRUZBVUxUOiAgICAgICAgSW52YWxpZCBEQ0RfSE1BTkFHRVIgaGFuZGxlLgorICogIFJlcXVpcmVzOgorICogICAgICBEQ0QgaW5pdGlhbGl6ZWQuCisgKiAgICAgIG9ial91dWlkIGlzIG5vbi1OVUxMLgorICogICAgICBvYmpfZGVmIGlzIG5vbi1OVUxMLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgZGNkX2dldF9vYmplY3RfZGVmKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkJICAgICBzdHJ1Y3QgZHNwX3V1aWQgKm9ial91dWlkLAorCQkJCSAgICAgZW51bSBkc3BfZGNkb2JqdHlwZSBvYmpfdHlwZSwKKwkJCQkgICAgIHN0cnVjdCBkY2RfZ2VuZXJpY29iaiAqb2JqX2RlZik7CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2dldF9vYmplY3RzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhbGwgRENEIG9iamVjdHMgc3BlY2lmaWVkIGluIGEgc3BlY2lhbAorICogICAgICBDT0ZGIHNlY3Rpb24gY2FsbGVkICIuZGNkX3JlZ2lzdGVyIiwgYW5kIGZvciBlYWNoIG9iamVjdCwKKyAqICAgICAgY2FsbCBhICJyZWdpc3RlciIgZnVuY3Rpb24uICBUaGUgInJlZ2lzdGVyIiBmdW5jdGlvbiBtYXkgcGVyZm9ybQorICogICAgICB2YXJpb3VzIGFjdGlvbnMsIHN1Y2ggYXMgMSkgcmVnaXN0ZXIgbm9kZXMgaW4gdGhlIG5vZGUgZGF0YWJhc2UsIDIpCisgKiAgICAgIHVucmVnaXN0ZXIgbm9kZXMgZnJvbSB0aGUgbm9kZSBkYXRhYmFzZSwgYW5kIDMpIGFkZCBvdmVybGF5IG5vZGVzLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkY2RfbWdyOiAgICAgICAgICAgICAgICBBIERDRCBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgc3pfY29mZl9wYXRoOiAgICAgICAgICAgUG9pbnRlciB0byBuYW1lIG9mIENPRkYgZmlsZSBjb250YWluaW5nIERDRAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLgorICogICAgICByZWdpc3Rlcl9meG46ICAgICAgICAgICBDYWxsYmFjayBmeG4gdG8gYmUgYXBwbGllZCBvbiBlYWNoIGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENEIG9iamVjdC4KKyAqICAgICAgaGFuZGxlOiAgICAgICAgICAgICAgICAgSGFuZGxlIHRvIHBhc3MgdG8gY2FsbGJhY2suCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVBQ0NFUzogVW5hYmxlIHRvIGFjY2Vzcy9yZWFkL3BhcnNlL2xvYWQgY29udGVudCBvZiBvYmplY3QgY29kZQorICogICAgICAgICAgICAgICBzZWN0aW9uLgorICogICAgICAtRUZBVUxUOiAgICAgICAgICAgIEludmFsaWQgRENEX0hNQU5BR0VSIGhhbmRsZS4uCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERDRCBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIE5vdGU6CisgKiAgICAgIER1ZSB0byB0aGUgRENEIGRhdGFiYXNlIGNvbnN0cnVjdGlvbiwgaXQgaXMgZXNzZW50aWFsIGZvciBhIERDRC1lbmFibGVkCisgKiAgICAgIENPRkYgZmlsZSB0byBjb250YWluIHRoZSByaWdodCBDT0ZGIHNlY3Rpb25zLCBlc3BlY2lhbGx5CisgKiAgICAgICIuZGNkX3JlZ2lzdGVyIiwgd2hpY2ggaXMgdXNlZCBmb3IgYXV0byByZWdpc3RyYXRpb24uCisgKi8KK2V4dGVybiBpbnQgZGNkX2dldF9vYmplY3RzKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkJICBjaGFyICpzel9jb2ZmX3BhdGgsCisJCQkJICBkY2RfcmVnaXN0ZXJmeG4gcmVnaXN0ZXJfZnhuLCB2b2lkICpoYW5kbGUpOworCisvKgorICogID09PT09PT09IGRjZF9pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBEQ0QuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBGQUxTRTogIEluaXRpYWxpemF0aW9uIGZhaWxlZC4KKyAqICAgICAgVFJVRTogICBJbml0aWFsaXphdGlvbiBzdWNjZWVkZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgRENEIGluaXRpYWxpemVkLgorICovCitleHRlcm4gYm9vbCBkY2RfaW5pdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBkY2RfcmVnaXN0ZXJfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBEU1AvQklPUyBCcmlkZ2Ugb2JqZWN0IGluIHRoZSBEQ0QgZGF0YWJhc2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdXVpZF9vYmo6ICAgICAgICAgIFBvaW50ZXIgdG8gYSBkc3BfdXVpZCB0aGF0IGlkZW50aWZpZXMgYSBEU1AvQklPUworICogICAgICAgICAgICAgICAgICAgICAgQnJpZGdlIG9iamVjdC4KKyAqICAgICAgb2JqX3R5cGU6ICAgICAgICBUeXBlIG9mIG9iamVjdC4KKyAqICAgICAgcHN6X3BhdGhfbmFtZTogICAgUGF0aCB0byB0aGUgb2JqZWN0J3MgQ09GRiBmaWxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgRmFpbGVkIHRvIHJlZ2lzdGVyIG9iamVjdC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgRENEIGluaXRpYWxpemVkLgorICogICAgICB1dWlkX29iaiBhbmQgc3pQYXRoTmFtZSBhcmUgbm9uLU5VTEwgdmFsdWVzLgorICogICAgICBvYmpfdHlwZSBpcyBhIHZhbGlkIHR5cGUgdmFsdWUuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBkY2RfcmVnaXN0ZXJfb2JqZWN0KHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJICAgICAgZW51bSBkc3BfZGNkb2JqdHlwZSBvYmpfdHlwZSwKKwkJCQkgICAgICBjaGFyICpwc3pfcGF0aF9uYW1lKTsKKworLyoKKyAqICA9PT09PT09PSBkY2RfdW5yZWdpc3Rlcl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGRlLXJlZ2lzdGVycyBhIHZhbGlkIERTUC9CSU9TIEJyaWRnZSBvYmplY3QgZnJvbSB0aGUgRENECisgKiAgICAgIGRhdGFiYXNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHV1aWRfb2JqOiAgICAgIFBvaW50ZXIgdG8gYSBkc3BfdXVpZCB0aGF0IGlkZW50aWZpZXMgYSBEU1AvQklPUyBCcmlkZ2UKKyAqICAgICAgICAgICAgICAgICAgb2JqZWN0LgorICogICAgICBvYmpfdHlwZTogICAgVHlwZSBvZiBvYmplY3QuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzcy4KKyAqICAgICAgLUVQRVJNOiAgVW5hYmxlIHRvIGRlLXJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICogIFJlcXVpcmVzOgorICogICAgICBEQ0QgaW5pdGlhbGl6ZWQuCisgKiAgICAgIHV1aWRfb2JqIGlzIGEgbm9uLU5VTEwgdmFsdWUuCisgKiAgICAgIG9ial90eXBlIGlzIGEgdmFsaWQgdHlwZSB2YWx1ZS4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRjZF91bnJlZ2lzdGVyX29iamVjdChzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJCQllbnVtIGRzcF9kY2RvYmp0eXBlIG9ial90eXBlKTsKKworI2VuZGlmIC8qIF9EQkRDRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGJkY2RkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kYmRjZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWE0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGJkY2RkZWYuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogZGJkY2RkZWYuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEQ0QgKERTUC9CSU9TIEJyaWRnZSBDb25maWd1cmF0aW9uIERhdGFiYXNlKSBjb25zdGFudHMgYW5kIHR5cGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIERCRENEREVGXworI2RlZmluZSBEQkRDRERFRl8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbWdycHJpdi5oPgkvKiBmb3IgbWdyX3Byb2Nlc3NvcmV4dGluZm8gKi8KKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGNyaXRpY2FsIGVsZW1lbnRzIGZvciB0aGUgRENEIG1vZHVsZToKKyAqCisgKiAtIERDRF9SRUdLRVkgZW5hYmxlcyBEQ0QgZnVuY3Rpb25zIHRvIGxvY2F0ZSByZWdpc3RlcmVkIERDRCBvYmplY3RzLgorICogLSBEQ0RfUkVHSVNURVJfU0VDVElPTiBpZGVudGlmaWVzIHRoZSBDT0ZGIHNlY3Rpb24gd2hlcmUgdGhlIFVVSUQgb2YKKyAqICAgcmVnaXN0ZXJlZCBEQ0Qgb2JqZWN0cyBhcmUgc3RvcmVkLgorICovCisjZGVmaW5lIERDRF9SRUdLRVkgICAgICAgICAgICAgICJTb2Z0d2FyZVxcVGV4YXNJbnN0cnVtZW50c1xcRHNwQnJpZGdlXFxEQ0QiCisjZGVmaW5lIERDRF9SRUdJU1RFUl9TRUNUSU9OICAgICIuZGNkX3JlZ2lzdGVyIgorCisjZGVmaW5lIERDRF9NQVhQQVRITEVOR1RIICAgIDI1NQorCisvKiBEQ0QgTWFuYWdlciBPYmplY3QgKi8KK3N0cnVjdCBkY2RfbWFuYWdlcjsKKworc3RydWN0IGRjZF9rZXlfZWxlbSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwkvKiBNYWtlIGl0IGxpbmtlZCB0byBhIGxpc3QgKi8KKwljaGFyIG5hbWVbRENEX01BWFBBVEhMRU5HVEhdOwkvKiAgTmFtZSBvZiBhIGdpdmVuIHZhbHVlIGVudHJ5ICovCisJY2hhciAqcGF0aDsJCS8qICBQb2ludGVyIHRvIHRoZSBhY3R1YWwgZGF0YSAqLworfTsKKworLyogRENEIE5vZGUgUHJvcGVydGllcyAqLworc3RydWN0IGRjZF9ub2RlcHJvcHMgeworCXN0cnVjdCBkc3BfbmRicHJvcHMgbmRiX3Byb3BzOworCXUzMiBtc2dfc2VnaWQ7CisJdTMyIG1zZ19ub3RpZnlfdHlwZTsKKwljaGFyICpwc3RyX2NyZWF0ZV9waGFzZV9meG47CisJY2hhciAqcHN0cl9kZWxldGVfcGhhc2VfZnhuOworCWNoYXIgKnBzdHJfZXhlY3V0ZV9waGFzZV9meG47CisJY2hhciAqcHN0cl9pX2FsZ19uYW1lOworCisJLyogRHluYW1pYyBsb2FkIHByb3BlcnRpZXMgKi8KKwl1MTYgdXNfbG9hZF90eXBlOwkvKiBTdGF0aWMsIGR5bmFtaWMsIG92ZXJsYXkgKi8KKwl1MzIgdWxfZGF0YV9tZW1fc2VnX21hc2s7CS8qIERhdGEgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworCXUzMiB1bF9jb2RlX21lbV9zZWdfbWFzazsJLyogQ29kZSBtZW1vcnkgcmVxdWlyZW1lbnRzICovCit9OworCisvKiBEQ0QgR2VuZXJpYyBPYmplY3QgVHlwZSAqLworc3RydWN0IGRjZF9nZW5lcmljb2JqIHsKKwl1bmlvbiBkY2Rfb2JqIHsKKwkJc3RydWN0IGRjZF9ub2RlcHJvcHMgbm9kZV9vYmo7CS8qIG5vZGUgb2JqZWN0LiAqLworCQkvKiBwcm9jZXNzb3Igb2JqZWN0LiAqLworCQlzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmluZm8gcHJvY19pbmZvOworCQkvKiBleHRlbmRlZCBwcm9jIG9iamVjdCAocHJpdmF0ZSkgKi8KKwkJc3RydWN0IG1ncl9wcm9jZXNzb3JleHRpbmZvIGV4dF9wcm9jX29iajsKKwl9IG9ial9kYXRhOworfTsKKworLyogRENEIEludGVybmFsIENhbGxiYWNrIFR5cGUgKi8KK3R5cGVkZWYgaW50KCpkY2RfcmVnaXN0ZXJmeG4pIChzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJCSAgICAgIGVudW0gZHNwX2RjZG9ianR5cGUgb2JqX3R5cGUsCisJCQkJICAgICAgdm9pZCAqaGFuZGxlKTsKKworI2VuZGlmIC8qIERCRENEREVGXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RiZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RiZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjA3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGJkZWZzLmgKQEAgLTAsMCArMSw1MTQgQEAKKy8qCisgKiBkYmRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyBmb3IgRFNQL0JJT1MgQnJpZGdlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgREJERUZTXworI2RlZmluZSBEQkRFRlNfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Jtc19zaC5oPgkvKiBUeXBlcyBzaGFyZWQgYmV0d2VlbiBHUFAgYW5kIERTUCAqLworCisjZGVmaW5lIFBHX1NJWkU0SyA0MDk2CisjZGVmaW5lIFBHX01BU0socGdfc2l6ZSkgKH4oKHBnX3NpemUpLTEpKQorI2RlZmluZSBQR19BTElHTl9MT1coYWRkciwgcGdfc2l6ZSkgKChhZGRyKSAmIFBHX01BU0socGdfc2l6ZSkpCisjZGVmaW5lIFBHX0FMSUdOX0hJR0goYWRkciwgcGdfc2l6ZSkgKCgoYWRkcikrKHBnX3NpemUpLTEpICYgUEdfTUFTSyhwZ19zaXplKSkKKworLyogQVBJIHJldHVybiB2YWx1ZSBhbmQgY2FsbGluZyBjb252ZW50aW9uICovCisjZGVmaW5lIERCQVBJICAgICAgICAgICAgICAgICAgICAgICBpbnQKKworLyogSW5maW5pdGUgdGltZSB2YWx1ZSBmb3IgdGhlIHV0aW1lb3V0IHBhcmFtZXRlciB0byBEU1BTdHJlYW1fU2VsZWN0KCkgKi8KKyNkZWZpbmUgRFNQX0ZPUkVWRVIgICAgICAgICAgICAgICAgICgtMSkKKworLyogTWF4aW11bSBsZW5ndGggb2Ygbm9kZSBuYW1lLCB1c2VkIGluIGRzcF9uZGJwcm9wcyAqLworI2RlZmluZSBEU1BfTUFYTkFNRUxFTiAgICAgICAgICAgICAgMzIKKworLyogbm90aWZ5X3R5cGUgdmFsdWVzIGZvciB0aGUgUmVnaXN0ZXJOb3RpZnkoKSBmdW5jdGlvbnMuICovCisjZGVmaW5lIERTUF9TSUdOQUxFVkVOVCAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIFR5cGVzIG9mIGV2ZW50cyBmb3IgcHJvY2Vzc29ycyAqLworI2RlZmluZSBEU1BfUFJPQ0VTU09SU1RBVEVDSEFOR0UgICAgMHgwMDAwMDAwMQorI2RlZmluZSBEU1BfUFJPQ0VTU09SQVRUQUNIICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBEU1BfUFJPQ0VTU09SREVUQUNIICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBEU1BfUFJPQ0VTU09SUkVTVEFSVCAgICAgICAgMHgwMDAwMDAwOAorCisvKiBEU1AgZXhjZXB0aW9uIGV2ZW50cyAoRFNQL0JJT1MgYW5kIERTUCBNTVUgZmF1bHQpICovCisjZGVmaW5lIERTUF9NTVVGQVVMVCAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIERTUF9TWVNFUlJPUiAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERTUF9FWENFUFRJT05BQk9SVCAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIERTUF9QV1JFUlJPUiAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIERTUF9XRFRPVkVSRkxPVwkweDAwMDAwMDQwCisKKy8qIElWQSBleGNlcHRpb24gZXZlbnRzIChJVkEgTU1VIGZhdWx0KSAqLworI2RlZmluZSBJVkFfTU1VRkFVTFQgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorLyogVHlwZXMgb2YgZXZlbnRzIGZvciBub2RlcyAqLworI2RlZmluZSBEU1BfTk9ERVNUQVRFQ0hBTkdFICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBEU1BfTk9ERU1FU1NBR0VSRUFEWSAgICAgICAgMHgwMDAwMDIwMAorCisvKiBUeXBlcyBvZiBldmVudHMgZm9yIHN0cmVhbXMgKi8KKyNkZWZpbmUgRFNQX1NUUkVBTURPTkUgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRFNQX1NUUkVBTUlPQ09NUExFVElPTiAgICAgIDB4MDAwMDIwMDAKKworLyogSGFuZGxlIGRlZmluaXRpb24gcmVwcmVzZW50aW5nIHRoZSBHUFAgbm9kZSBpbiBEU1BOb2RlX0Nvbm5lY3QoKSBjYWxscyAqLworI2RlZmluZSBEU1BfSEdQUE5PREUgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorCisvKiBOb2RlIGRpcmVjdGlvbnMgdXNlZCBpbiBEU1BOb2RlX0Nvbm5lY3QoKSAqLworI2RlZmluZSBEU1BfVE9OT0RFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBEU1BfRlJPTU5PREUgICAgICAgICAgICAgICAgMgorCisvKiBEZWZpbmUgTm9kZSBNaW5pbXVtIGFuZCBNYXhpbXVtIFByaW9yaXRpZXMgKi8KKyNkZWZpbmUgRFNQX05PREVfTUlOX1BSSU9SSVRZICAgICAgIDEKKyNkZWZpbmUgRFNQX05PREVfTUFYX1BSSU9SSVRZICAgICAgIDE1CisKKy8qIFByZS1EZWZpbmVkIE1lc3NhZ2UgQ29tbWFuZCBDb2RlcyBhdmFpbGFibGUgdG8gdXNlcjogKi8KKyNkZWZpbmUgRFNQX1JNU1VTRVJDT0RFU1RBUlQgUk1TX1VTRVIJLyogU3RhcnQgb2YgUk1TIHVzZXIgY21kIGNvZGVzICovCisvKiBlbmQgb2YgdXNlciBjb2RlcyAqLworI2RlZmluZSBEU1BfUk1TVVNFUkNPREVFTkQgKFJNU19VU0VSICsgUk1TX01BWFVTRVJDT0RFUyk7CisvKiBtc2dfY3RybCBjb250YWlucyBTTSBidWZmZXIgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgRFNQX1JNU0JVRkRFU0MgUk1TX0JVRkRFU0MKKworLyogU2hhcmVkIG1lbW9yeSBpZGVudGlmaWVyIGZvciBNRU0gc2VnbWVudCBuYW1lZCAiU0hNU0VHMCIgKi8KKyNkZWZpbmUgRFNQX1NITVNFRzAgICAgICh1MzIpKC0xKQorCisvKiBQcm9jZXNzb3IgSUQgbnVtYmVycyAqLworI2RlZmluZSBEU1BfVU5JVCAgICAwCisjZGVmaW5lIElWQV9VTklUICAgIDEKKworI2RlZmluZSBEU1BXT1JEICAgICAgIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgRFNQV09SRFNJWkUgICAgIHNpemVvZihEU1BXT1JEKQorCisvKiBQb3dlciBjb250cm9sIGVudW1lcmF0aW9ucyAqLworI2RlZmluZSBQUk9DX1BXUkNPTlRST0wgICAgICAgICAgICAgMHg4MDcwCisKKyNkZWZpbmUgUFJPQ19QV1JNR1RfRU5BQkxFICAgICAgICAgIChQUk9DX1BXUkNPTlRST0wgKyAweDMpCisjZGVmaW5lIFBST0NfUFdSTUdUX0RJU0FCTEUgICAgICAgICAoUFJPQ19QV1JDT05UUk9MICsgMHg0KQorCisvKiBCcmlkZ2UgQ29kZSBWZXJzaW9uICovCisjZGVmaW5lIEJSSURHRV9WRVJTSU9OX0NPREUgICAgICAgICAzMzMKKworI2RlZmluZSAgICBNQVhfUFJPRklMRVMgICAgIDE2CisKKy8qIERTUCBjaGlwIHR5cGUgKi8KKyNkZWZpbmUgRFNQVFlQRTY0CTB4OTkKKworLyogSGFuZHkgTWFjcm9zICovCisjZGVmaW5lIFZBTElEX1BST0NfRVZFTlQgKERTUF9QUk9DRVNTT1JTVEFURUNIQU5HRSB8IERTUF9QUk9DRVNTT1JBVFRBQ0ggfCBcCisJRFNQX1BST0NFU1NPUkRFVEFDSCB8IERTUF9QUk9DRVNTT1JSRVNUQVJUIHwgRFNQX05PREVTVEFURUNIQU5HRSB8IFwKKwlEU1BfU1RSRUFNRE9ORSB8IERTUF9TVFJFQU1JT0NPTVBMRVRJT04gfCBEU1BfTU1VRkFVTFQgfCBcCisJRFNQX1NZU0VSUk9SIHwgRFNQX1dEVE9WRVJGTE9XIHwgRFNQX1BXUkVSUk9SKQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfdmFsaWRfcHJvY19ldmVudCh1MzIgeCkKK3sKKwlyZXR1cm4gKHggPT0gMCB8fCAoeCAmIFZBTElEX1BST0NfRVZFTlQgJiYgISh4ICYgflZBTElEX1BST0NfRVZFTlQpKSk7Cit9CisKKy8qIFRoZSBOb2RlIFVVSUQgc3RydWN0dXJlICovCitzdHJ1Y3QgZHNwX3V1aWQgeworCXUzMiB1bF9kYXRhMTsKKwl1MTYgdXNfZGF0YTI7CisJdTE2IHVzX2RhdGEzOworCXU4IHVjX2RhdGE0OworCXU4IHVjX2RhdGE1OworCXU4IHVjX2RhdGE2WzZdOworfTsKKworLyogRENEIHR5cGVzICovCitlbnVtIGRzcF9kY2RvYmp0eXBlIHsKKwlEU1BfRENETk9ERVRZUEUsCisJRFNQX0RDRFBST0NFU1NPUlRZUEUsCisJRFNQX0RDRExJQlJBUllUWVBFLAorCURTUF9EQ0RDUkVBVEVMSUJUWVBFLAorCURTUF9EQ0RFWEVDVVRFTElCVFlQRSwKKwlEU1BfRENEREVMRVRFTElCVFlQRSwKKwkvKiBEU1BfRENETUFYT0JKVFlQRSBpcyBtZWFudCB0byBiZSB0aGUgbGFzdCBEQ0Qgb2JqZWN0IHR5cGUgKi8KKwlEU1BfRENETUFYT0JKVFlQRQorfTsKKworLyogUHJvY2Vzc29yIHN0YXRlcyAqLworZW51bSBkc3BfcHJvY3N0YXRlIHsKKwlQUk9DX1NUT1BQRUQsCisJUFJPQ19MT0FERUQsCisJUFJPQ19SVU5OSU5HLAorCVBST0NfRVJST1IKK307CisKKy8qCisgKiAgTm9kZSB0eXBlczogTWVzc2FnZSBub2RlLCB0YXNrIG5vZGUsIHhEQUlTIHNvY2tldCBub2RlLCBhbmQKKyAqICBkZXZpY2Ugbm9kZS4gX05PREVfR1BQIGlzIHVzZWQgd2hlbiBkZWZpbmluZyBhIHN0cmVhbSBjb25uZWN0aW9uCisgKiAgYmV0d2VlbiBhIHRhc2sgb3Igc29ja2V0IG5vZGUgYW5kIHRoZSBHUFAuCisgKgorICovCitlbnVtIG5vZGVfdHlwZSB7CisJTk9ERV9ERVZJQ0UsCisJTk9ERV9UQVNLLAorCU5PREVfREFJU1NPQ0tFVCwKKwlOT0RFX01FU1NBR0UsCisJTk9ERV9HUFAKK307CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9zdGF0ZSA9PT09PT09PQorICogIEludGVybmFsIG5vZGUgc3RhdGVzLgorICovCitlbnVtIG5vZGVfc3RhdGUgeworCU5PREVfQUxMT0NBVEVELAorCU5PREVfQ1JFQVRFRCwKKwlOT0RFX1JVTk5JTkcsCisJTk9ERV9QQVVTRUQsCisJTk9ERV9ET05FLAorCU5PREVfQ1JFQVRJTkcsCisJTk9ERV9TVEFSVElORywKKwlOT0RFX1BBVVNJTkcsCisJTk9ERV9URVJNSU5BVElORywKKwlOT0RFX0RFTEVUSU5HLAorfTsKKworLyogU3RyZWFtIHN0YXRlcyAqLworZW51bSBkc3Bfc3RyZWFtc3RhdGUgeworCVNUUkVBTV9JRExFLAorCVNUUkVBTV9SRUFEWSwKKwlTVFJFQU1fUEVORElORywKKwlTVFJFQU1fRE9ORQorfTsKKworLyogU3RyZWFtIGNvbm5lY3QgdHlwZXMgKi8KK2VudW0gZHNwX2Nvbm5lY3R0eXBlIHsKKwlDT05ORUNUVFlQRV9OT0RFT1VUUFVULAorCUNPTk5FQ1RUWVBFX0dQUE9VVFBVVCwKKwlDT05ORUNUVFlQRV9OT0RFSU5QVVQsCisJQ09OTkVDVFRZUEVfR1BQSU5QVVQKK307CisKKy8qIFN0cmVhbSBtb2RlIHR5cGVzICovCitlbnVtIGRzcF9zdHJtbW9kZSB7CisJU1RSTU1PREVfUFJPQ0NPUFksCS8qIFByb2Nlc3NvcihzKSBjb3B5IHN0cmVhbSBkYXRhIHBheWxvYWRzICovCisJU1RSTU1PREVfWkVST0NPUFksCS8qIFN0cm0gYnVmZmVyIHB0cnMgc3dhcHBlZCBubyBkYXRhIGNvcGllZCAqLworCVNUUk1NT0RFX0xETUEsCQkvKiBMb2NhbCBETUEgOiBPTUFQJ3MgU3lzdGVtLURNQSBkZXZpY2UgKi8KKwlTVFJNTU9ERV9SRE1BCQkvKiBSZW1vdGUgRE1BOiBPTUFQJ3MgRFNQLURNQSBkZXZpY2UgKi8KK307CisKKy8qIFJlc291cmNlIFR5cGVzICovCitlbnVtIGRzcF9yZXNvdXJjZWluZm90eXBlIHsKKwlEU1BfUkVTT1VSQ0VfRFlOREFSQU0gPSAwLAorCURTUF9SRVNPVVJDRV9EWU5TQVJBTSwKKwlEU1BfUkVTT1VSQ0VfRFlORVhURVJOQUwsCisJRFNQX1JFU09VUkNFX0RZTlNSQU0sCisJRFNQX1JFU09VUkNFX1BST0NMT0FECit9OworCisvKiBNZW1vcnkgU2VnbWVudCBUeXBlcyAqLworZW51bSBkc3BfbWVtdHlwZSB7CisJRFNQX0RZTkRBUkFNID0gMCwKKwlEU1BfRFlOU0FSQU0sCisJRFNQX0RZTkVYVEVSTkFMLAorCURTUF9EWU5TUkFNCit9OworCisvKiBNZW1vcnkgRmx1c2ggVHlwZXMgKi8KK2VudW0gZHNwX2ZsdXNodHlwZSB7CisJUFJPQ19JTlZBTElEQVRFX01FTSA9IDAsCisJUFJPQ19XUklURUJBQ0tfTUVNLAorCVBST0NfV1JJVEVCQUNLX0lOVkFMSURBVEVfTUVNLAorfTsKKworLyogTWVtb3J5IFNlZ21lbnQgU3RhdHVzIFZhbHVlcyAqLworc3RydWN0IGRzcF9tZW1zdGF0IHsKKwl1MzIgdWxfc2l6ZTsKKwl1MzIgdWxfdG90YWxfZnJlZV9zaXplOworCXUzMiB1bF9sZW5fbWF4X2ZyZWVfYmxvY2s7CisJdTMyIHVsX251bV9mcmVlX2Jsb2NrczsKKwl1MzIgdWxfbnVtX2FsbG9jX2Jsb2NrczsKK307CisKKy8qIFByb2Nlc3NvciBMb2FkIGluZm9ybWF0aW9uIFZhbHVlcyAqLworc3RydWN0IGRzcF9wcm9jbG9hZHN0YXQgeworCXUzMiBjdXJyX2xvYWQ7CisJdTMyIHByZWRpY3RlZF9sb2FkOworCXUzMiBjdXJyX2RzcF9mcmVxOworCXUzMiBwcmVkaWN0ZWRfZnJlcTsKK307CisKKy8qIEF0dHJpYnV0ZXMgZm9yIFNUUk0gY29ubmVjdGlvbnMgYmV0d2VlbiBub2RlcyAqLworc3RydWN0IGRzcF9zdHJtYXR0ciB7CisJdTMyIHNlZ19pZDsJCS8qIE1lbW9yeSBzZWdtZW50IG9uIERTUCB0byBhbGxvY2F0ZSBidWZmZXJzICovCisJdTMyIGJ1Zl9zaXplOwkJLyogQnVmZmVyIHNpemUgKERTUCB3b3JkcykgKi8KKwl1MzIgbnVtX2J1ZnM7CQkvKiBOdW1iZXIgb2YgYnVmZmVycyAqLworCXUzMiBidWZfYWxpZ25tZW50OwkvKiBCdWZmZXIgYWxpZ25tZW50ICovCisJdTMyIHV0aW1lb3V0OwkJLyogVGltZW91dCBmb3IgYmxvY2tpbmcgU1RSTSBjYWxscyAqLworCWVudW0gZHNwX3N0cm1tb2RlIHN0cm1fbW9kZTsJLyogbW9kZSBvZiBzdHJlYW0gd2hlbiBvcGVuZWQgKi8KKwkvKiBETUEgY2hubCBpZCBpZiBkc3Bfc3RybW1vZGUgaXMgTERNQSBvciBSRE1BICovCisJdTMyIHVkbWFfY2hubF9pZDsKKwl1MzIgdWRtYV9wcmlvcml0eTsJLyogRE1BIGNoYW5uZWwgcHJpb3JpdHkgMD1sb3dlc3QsID4wPWhpZ2ggKi8KK307CisKKy8qIFRoZSBkc3BfY2JkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGRzcF9jYmRhdGEgeworCXUzMiBjYl9kYXRhOworCXU4IG5vZGVfZGF0YVsxXTsKK307CisKKy8qIFRoZSBkc3BfbXNnIHN0cnVjdHVyZSAqLworc3RydWN0IGRzcF9tc2cgeworCXUzMiBkd19jbWQ7CisJdTMyIGR3X2FyZzE7CisJdTMyIGR3X2FyZzI7Cit9OworCisvKiBUaGUgZHNwX3Jlc291cmNlcmVxbXRzIHN0cnVjdHVyZSBmb3Igbm9kZSdzIHJlc291cmNlIHJlcXVpcmVtZW50cyAqLworc3RydWN0IGRzcF9yZXNvdXJjZXJlcW10cyB7CisJdTMyIGNiX3N0cnVjdDsKKwl1MzIgc3RhdGljX2RhdGFfc2l6ZTsKKwl1MzIgZ2xvYmFsX2RhdGFfc2l6ZTsKKwl1MzIgcHJvZ3JhbV9tZW1fc2l6ZTsKKwl1MzIgdXdjX2V4ZWN1dGlvbl90aW1lOworCXUzMiB1d2NfcGVyaW9kOworCXUzMiB1d2NfZGVhZGxpbmU7CisJdTMyIGF2Z19leGVjdGlvbl90aW1lOworCXUzMiBtaW5pbXVtX3BlcmlvZDsKK307CisKKy8qCisgKiBUaGUgZHNwX3N0cmVhbWNvbm5lY3Qgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHN0cmVhbSBjb25uZWN0aW9uCisgKiBiZXR3ZWVuIHR3byBub2Rlcywgb3IgYmV0d2VlbiBhIG5vZGUgYW5kIHRoZSBHUFAKKyAqLworc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0IHsKKwl1MzIgY2Jfc3RydWN0OworCWVudW0gZHNwX2Nvbm5lY3R0eXBlIGNvbm5lY3RfdHlwZTsKKwl1MzIgdGhpc19ub2RlX3N0cmVhbV9pbmRleDsKKwl2b2lkICpjb25uZWN0ZWRfbm9kZTsKKwlzdHJ1Y3QgZHNwX3V1aWQgdWlfY29ubmVjdGVkX25vZGVfaWQ7CisJdTMyIGNvbm5lY3RlZF9ub2RlX3N0cmVhbV9pbmRleDsKK307CisKK3N0cnVjdCBkc3Bfbm9kZXByb2ZzIHsKKwl1MzIgdWxfaGVhcF9zaXplOworfTsKKworLyogVGhlIGRzcF9uZGJwcm9wcyBzdHJ1Y3R1cmUgcmVwb3J0cyB0aGUgYXR0cmlidXRlcyBvZiBhIG5vZGUgKi8KK3N0cnVjdCBkc3BfbmRicHJvcHMgeworCXUzMiBjYl9zdHJ1Y3Q7CisJc3RydWN0IGRzcF91dWlkIHVpX25vZGVfaWQ7CisJY2hhciBhY19uYW1lW0RTUF9NQVhOQU1FTEVOXTsKKwllbnVtIG5vZGVfdHlwZSBudHlwZTsKKwl1MzIgY2FjaGVfb25fZ3BwOworCXN0cnVjdCBkc3BfcmVzb3VyY2VyZXFtdHMgZHNwX3Jlc291cmNlX3JlcW10czsKKwlzMzIgcHJpbzsKKwl1MzIgc3RhY2tfc2l6ZTsKKwl1MzIgc3lzX3N0YWNrX3NpemU7CisJdTMyIHN0YWNrX3NlZzsKKwl1MzIgbWVzc2FnZV9kZXB0aDsKKwl1MzIgbnVtX2lucHV0X3N0cmVhbXM7CisJdTMyIG51bV9vdXRwdXRfc3RyZWFtczsKKwl1MzIgdXRpbWVvdXQ7CisJdTMyIGNvdW50X3Byb2ZpbGVzOwkvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHByb2ZpbGVzICovCisJLyogQXJyYXkgb2YgcHJvZmlsZXMgKi8KKwlzdHJ1Y3QgZHNwX25vZGVwcm9mcyBub2RlX3Byb2ZpbGVzW01BWF9QUk9GSUxFU107CisJdTMyIHN0YWNrX3NlZ19uYW1lOwkvKiBTdGFjayBTZWdtZW50IE5hbWUgKi8KK307CisKKwkvKiBUaGUgZHNwX25vZGVhdHRyaW4gc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlcyBvZiBhCisJICogbm9kZSBjbGllbnQgKi8KK3N0cnVjdCBkc3Bfbm9kZWF0dHJpbiB7CisJdTMyIGNiX3N0cnVjdDsKKwlzMzIgcHJpbzsKKwl1MzIgdXRpbWVvdXQ7CisJdTMyIHByb2ZpbGVfaWQ7CisJLyogUmVzZXJ2ZWQsIGZvciBCcmlkZ2UgSW50ZXJuYWwgdXNlIG9ubHkgKi8KKwl1MzIgaGVhcF9zaXplOworCXZvaWQgKnBncHBfdmlydF9hZGRyOwkvKiBSZXNlcnZlZCwgZm9yIEJyaWRnZSBJbnRlcm5hbCB1c2Ugb25seSAqLworfTsKKworCS8qIFRoZSBkc3Bfbm9kZWluZm8gc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24KKwkgKiBhYm91dCBhIG5vZGUgKi8KK3N0cnVjdCBkc3Bfbm9kZWluZm8geworCXUzMiBjYl9zdHJ1Y3Q7CisJc3RydWN0IGRzcF9uZGJwcm9wcyBuYl9ub2RlX2RhdGFiYXNlX3Byb3BzOworCXUzMiBleGVjdXRpb25fcHJpb3JpdHk7CisJZW51bSBub2RlX3N0YXRlIG5zX2V4ZWN1dGlvbl9zdGF0ZTsKKwl2b2lkICpkZXZpY2Vfb3duZXI7CisJdTMyIG51bWJlcl9zdHJlYW1zOworCXN0cnVjdCBkc3Bfc3RyZWFtY29ubmVjdCBzY19zdHJlYW1fY29ubmVjdGlvblsxNl07CisJdTMyIG5vZGVfZW52OworfTsKKworCS8qIFRoZSBkc3Bfbm9kZWF0dHIgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlcyBvZiBhIG5vZGUgKi8KK3N0cnVjdCBkc3Bfbm9kZWF0dHIgeworCXUzMiBjYl9zdHJ1Y3Q7CisJc3RydWN0IGRzcF9ub2RlYXR0cmluIGluX25vZGVfYXR0cl9pbjsKKwl1MzIgbm9kZV9hdHRyX2lucHV0czsKKwl1MzIgbm9kZV9hdHRyX291dHB1dHM7CisJc3RydWN0IGRzcF9ub2RlaW5mbyBub2RlX2luZm87Cit9OworCisvKgorICogIE5vdGlmaWNhdGlvbiB0eXBlOiBlaXRoZXIgdGhlIG5hbWUgb2YgYW4gb3BlbmVkIGV2ZW50LCBvciBhbiBldmVudCBvcgorICogIHdpbmRvdyBoYW5kbGUuCisgKi8KK3N0cnVjdCBkc3Bfbm90aWZpY2F0aW9uIHsKKwljaGFyICpwc19uYW1lOworCXZvaWQgKmhhbmRsZTsKK307CisKKy8qIFRoZSBkc3BfcHJvY2Vzc29yYXR0cmluIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBwcm9jZXNzb3IgKi8KK3N0cnVjdCBkc3BfcHJvY2Vzc29yYXR0cmluIHsKKwl1MzIgY2Jfc3RydWN0OworCXUzMiB1dGltZW91dDsKK307CisvKgorICogVGhlIGRzcF9wcm9jZXNzb3JpbmZvIHN0cnVjdHVyZSBkZXNjcmliZXMgYmFzaWMgY2FwYWJpbGl0aWVzIG9mIGEKKyAqIERTUCBwcm9jZXNzb3IKKyAqLworc3RydWN0IGRzcF9wcm9jZXNzb3JpbmZvIHsKKwl1MzIgY2Jfc3RydWN0OworCWludCBwcm9jZXNzb3JfZmFtaWx5OworCWludCBwcm9jZXNzb3JfdHlwZTsKKwl1MzIgY2xvY2tfcmF0ZTsKKwl1MzIgdWxfaW50ZXJuYWxfbWVtX3NpemU7CisJdTMyIHVsX2V4dGVybmFsX21lbV9zaXplOworCXUzMiBwcm9jZXNzb3JfaWQ7CisJaW50IHR5X3J1bm5pbmdfcnRvczsKKwlzMzIgbm9kZV9taW5fcHJpb3JpdHk7CisJczMyIG5vZGVfbWF4X3ByaW9yaXR5OworfTsKKworLyogRXJyb3IgaW5mb3JtYXRpb24gb2YgbGFzdCBEU1AgZXhjZXB0aW9uIHNpZ25hbGxlZCB0byB0aGUgR1BQICovCitzdHJ1Y3QgZHNwX2Vycm9yaW5mbyB7CisJdTMyIGR3X2Vycl9tYXNrOworCXUzMiBkd192YWwxOworCXUzMiBkd192YWwyOworCXUzMiBkd192YWwzOworfTsKKworLyogVGhlIGRzcF9wcm9jZXNzb3JzdGF0ZSBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiBhIERTUCBwcm9jZXNzb3IgKi8KK3N0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgeworCXUzMiBjYl9zdHJ1Y3Q7CisJZW51bSBkc3BfcHJvY3N0YXRlIHByb2Nfc3RhdGU7Cit9OworCisvKgorICogVGhlIGRzcF9yZXNvdXJjZWluZm8gc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYQorICogcHJvY2Vzc29yJ3MgcmVzb3VyY2VzCisgKi8KK3N0cnVjdCBkc3BfcmVzb3VyY2VpbmZvIHsKKwl1MzIgY2Jfc3RydWN0OworCWVudW0gZHNwX3Jlc291cmNlaW5mb3R5cGUgcmVzb3VyY2VfdHlwZTsKKwl1bmlvbiB7CisJCXUzMiB1bF9yZXNvdXJjZTsKKwkJc3RydWN0IGRzcF9tZW1zdGF0IG1lbV9zdGF0OworCQlzdHJ1Y3QgZHNwX3Byb2Nsb2Fkc3RhdCBwcm9jX2xvYWRfc3RhdDsKKwl9IHJlc3VsdDsKK307CisKKy8qCisgKiBUaGUgZHNwX3N0cmVhbWF0dHJpbiBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgc3RyZWFtLAorICogaW5jbHVkaW5nIHNlZ21lbnQgYW5kIGFsaWdubWVudCBvZiBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkIHdpdGgKKyAqIERTUFN0cmVhbV9BbGxvY2F0ZUJ1ZmZlcnMoKSwgaWYgYXBwbGljYWJsZQorICovCitzdHJ1Y3QgZHNwX3N0cmVhbWF0dHJpbiB7CisJdTMyIGNiX3N0cnVjdDsKKwl1MzIgdXRpbWVvdXQ7CisJdTMyIHNlZ21lbnRfaWQ7CisJdTMyIGJ1Zl9hbGlnbm1lbnQ7CisJdTMyIG51bV9idWZzOworCWVudW0gZHNwX3N0cm1tb2RlIHN0cm1fbW9kZTsKKwl1MzIgdWRtYV9jaG5sX2lkOworCXUzMiB1ZG1hX3ByaW9yaXR5OworfTsKKworLyogVGhlIGRzcF9idWZmZXJhdHRyIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBkYXRhIGJ1ZmZlciAqLworc3RydWN0IGRzcF9idWZmZXJhdHRyIHsKKwl1MzIgY2Jfc3RydWN0OworCXUzMiBzZWdtZW50X2lkOworCXUzMiBidWZfYWxpZ25tZW50OworfTsKKworLyoKKyAqICBUaGUgZHNwX3N0cmVhbWluZm8gc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24KKyAqICBhYm91dCBhIHN0cmVhbS4KKyAqLworc3RydWN0IGRzcF9zdHJlYW1pbmZvIHsKKwl1MzIgY2Jfc3RydWN0OworCXUzMiBudW1iZXJfYnVmc19hbGxvd2VkOworCXUzMiBudW1iZXJfYnVmc19pbl9zdHJlYW07CisJdTMyIHVsX251bWJlcl9ieXRlczsKKwl2b2lkICpzeW5jX29iamVjdF9oYW5kbGU7CisJZW51bSBkc3Bfc3RyZWFtc3RhdGUgc3Nfc3RyZWFtX3N0YXRlOworfTsKKworLyogRE1NIE1BUCBhdHRyaWJ1dGVzCitJdCBpcyBhIGJpdCBtYXNrIHdpdGggZWFjaCBiaXQgdmFsdWUgaW5kaWNhdGluZyBhIHNwZWNpZmljIGF0dHJpYnV0ZQorYml0IDAgLSBHUFAgYWRkcmVzcyB0eXBlICh1c2VyIHZpcnR1YWw9MCwgcGh5c2ljYWw9MSkKK2JpdCAxIC0gTU1VIEVuZGlhbmlzbSAoQmlnIEVuZGlhbj0xLCBMaXR0bGUgRW5kaWFuPTApCitiaXQgMiAtIE1NVSBtaXhlZCBwYWdlIGF0dHJpYnV0ZSAoTWl4ZWQvIENQVUVTPTEsIFRMQkVTID0wKQorYml0IDMgLSBNTVUgZWxlbWVudCBzaXplID0gOGJpdCAodmFsaWQgb25seSBmb3Igbm9uIG1peGVkIHBhZ2UgZW50cmllcykKK2JpdCA0IC0gTU1VIGVsZW1lbnQgc2l6ZSA9IDE2Yml0ICh2YWxpZCBvbmx5IGZvciBub24gbWl4ZWQgcGFnZSBlbnRyaWVzKQorYml0IDUgLSBNTVUgZWxlbWVudCBzaXplID0gMzJiaXQgKHZhbGlkIG9ubHkgZm9yIG5vbiBtaXhlZCBwYWdlIGVudHJpZXMpCitiaXQgNiAtIE1NVSBlbGVtZW50IHNpemUgPSA2NGJpdCAodmFsaWQgb25seSBmb3Igbm9uIG1peGVkIHBhZ2UgZW50cmllcykKKworYml0IDE0IC0gSW5wdXQgKHJlYWQgb25seSkgYnVmZmVyCitiaXQgMTUgLSBPdXRwdXQgKHdyaXRlYWJsZSkgYnVmZmVyCisqLworCisvKiBUeXBlcyBvZiBtYXBwaW5nIGF0dHJpYnV0ZXMgKi8KKworLyogTVBVIGFkZHJlc3MgaXMgdmlydHVhbCBhbmQgbmVlZHMgdG8gYmUgdHJhbnNsYXRlZCB0byBwaHlzaWNhbCBhZGRyICovCisjZGVmaW5lIERTUF9NQVBWSVJUVUFMQUREUiAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERTUF9NQVBQSFlTSUNBTEFERFIgICAgICAgICAweDAwMDAwMDAxCisKKy8qIE1hcHBlZCBkYXRhIGlzIGJpZyBlbmRpYW4gKi8KKyNkZWZpbmUgRFNQX01BUEJJR0VORElBTiAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRFNQX01BUExJVFRMRUVORElBTiAgICAgICAgIDB4MDAwMDAwMDAKKworLyogRWxlbWVudCBzaXplIGlzIGJhc2VkIG9uIERTUCByL3cgYWNjZXNzIHNpemUgKi8KKyNkZWZpbmUgRFNQX01BUE1JWEVERUxFTVNJWkUgICAgICAgIDB4MDAwMDAwMDQKKworLyoKKyAqIEVsZW1lbnQgc2l6ZSBmb3IgTU1VIG1hcHBpbmcgKDgsIDE2LCAzMiwgb3IgNjQgYml0KQorICogSWdub3JlZCBpZiBEU1BfTUFQTUlYRURFTEVNU0laRSBlbmFibGVkCisgKi8KKyNkZWZpbmUgRFNQX01BUEVMRU1TSVpFOCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRFNQX01BUEVMRU1TSVpFMTYgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRFNQX01BUEVMRU1TSVpFMzIgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRFNQX01BUEVMRU1TSVpFNjQgICAgICAgICAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBEU1BfTUFQVk1BTExPQ0FERFIgICAgICAgICAweDAwMDAwMDgwCisKKyNkZWZpbmUgRFNQX01BUERPTk9UTE9DSwkgICAweDAwMDAwMTAwCisKKyNkZWZpbmUgRFNQX01BUF9ESVJfTUFTSwkJMHgzRkZGCisKKyNkZWZpbmUgR0VNX0NBQ0hFX0xJTkVfU0laRSAgICAgMTI4CisjZGVmaW5lIEdFTV9MMVBfUFJFRkVUQ0hfU0laRSAgIDEyOAorCisvKgorICogRGVmaW5pdGlvbnMgZnJvbSBkYnJlZy5oCisgKi8KKworI2RlZmluZSBEU1BQUk9DVFlQRV9DNjQJCTY0MTAKKyNkZWZpbmUgSVZBUFJPQ1RZUEVfQVJNNwk0NzAKKworI2RlZmluZSBSRUdfTUdSX09CSkVDVAkxCisjZGVmaW5lIFJFR19EUlZfT0JKRUNUCTIKKworLyogcmVnaXN0cnkgKi8KKyNkZWZpbmUgRFJWT0JKRUNUCSJEcnZPYmplY3QiCisjZGVmaW5lIE1HUk9CSkVDVAkiTWdyT2JqZWN0IgorCisvKiBNYXggcmVnaXN0cnkgcGF0aCBsZW5ndGguIEFsc28gdGhlIG1heCByZWdpc3RyeSB2YWx1ZSBsZW5ndGguICovCisjZGVmaW5lIE1BWFJFR1BBVEhMRU5HVEgJMjU1CisKKyNlbmRpZiAvKiBEQkRFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGJsZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RibGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRmYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RibGRlZnMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIGRibGRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIERCTERFRlNfCisjZGVmaW5lIERCTERFRlNfCisKKy8qCisgKiAgQml0IG1hc2tzIGZvciBkYmxfZmxhZ3MuCisgKi8KKyNkZWZpbmUgREJMX05PTE9BRCAgIDB4MAkvKiBEb24ndCBsb2FkIHN5bWJvbHMsIGNvZGUsIG9yIGRhdGEgKi8KKyNkZWZpbmUgREJMX1NZTUIgICAgIDB4MQkvKiBsb2FkIHN5bWJvbHMgKi8KKyNkZWZpbmUgREJMX0NPREUgICAgIDB4MgkvKiBsb2FkIGNvZGUgKi8KKyNkZWZpbmUgREJMX0RBVEEgICAgIDB4NAkvKiBsb2FkIGRhdGEgKi8KKyNkZWZpbmUgREJMX0RZTkFNSUMgIDB4OAkvKiBkeW5hbWljIGxvYWQgKi8KKyNkZWZpbmUgREJMX0JTUyAgICAgIDB4MjAJLyogVW5pdGlhbGl6ZWQgc2VjdGlvbiAqLworCisjZGVmaW5lIERCTF9NQVhQQVRITEVOR1RIICAgICAgIDI1NQorCisvKgorICogID09PT09PT09IGRibF9mbGFncyA9PT09PT09PQorICogIFNwZWNpZmllcyB3aGV0aGVyIHRvIGxvYWQgY29kZSwgZGF0YSwgb3Igc3ltYm9scworICovCit0eXBlZGVmIHMzMiBkYmxfZmxhZ3M7CisKKy8qCisgKiAgPT09PT09PT0gZGJsX3NlY3RfaW5mbyA9PT09PT09PQorICogIEZvciBjb2xsZWN0aW5nIGluZm8gb24gb3ZlcmxheSBzZWN0aW9ucworICovCitzdHJ1Y3QgZGJsX3NlY3RfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogbmFtZSBvZiBzZWN0aW9uICovCisJdTMyIHNlY3RfcnVuX2FkZHI7CS8qIHJ1biBhZGRyZXNzIG9mIHNlY3Rpb24gKi8KKwl1MzIgc2VjdF9sb2FkX2FkZHI7CS8qIGxvYWQgYWRkcmVzcyBvZiBzZWN0aW9uICovCisJdTMyIHNpemU7CQkvKiBzaXplIG9mIHNlY3Rpb24gKHRhcmdldCBNQVVzKSAqLworCWRibF9mbGFncyB0eXBlOwkJLyogQ29kZSwgZGF0YSwgb3IgQlNTICovCit9OworCisvKgorICogID09PT09PT09IGRibF9zeW1ib2wgPT09PT09PT0KKyAqICAoTmVlZGVkIGZvciBkeW5hbWljIGxvYWQgbGlicmFyeSkKKyAqLworc3RydWN0IGRibF9zeW1ib2wgeworCXUzMiB2YWx1ZTsKK307CisKKy8qCisgKiAgPT09PT09PT0gZGJsX2FsbG9jX2Z4biA9PT09PT09PQorICogIEFsbG9jYXRlIG1lbW9yeSBmdW5jdGlvbi4gIEFsbG9jYXRlIG9yIHJlc2VydmUgKGlmIHJlc2VydmVkID09IFRSVUUpCisgKiAgInNpemUiIGJ5dGVzIG9mIG1lbW9yeSBmcm9tIHNlZ21lbnQgInNwYWNlIiBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIGluCisgKiAgKmRzcF9hZGRyZXNzIChvciBzdGFydGluZyBhdCAqZHNwX2FkZHJlc3MgaWYgcmVzZXJ2ZSA9PSBUUlVFKS4gUmV0dXJucyAwIG9uCisgKiAgc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCit0eXBlZGVmIHMzMigqZGJsX2FsbG9jX2Z4bikgKHZvaWQgKmhkbCwgczMyIHNwYWNlLCB1MzIgc2l6ZSwgdTMyIGFsaWduLAorCQkJICAgICB1MzIgKmRzcF9hZGRyZXNzLCBzMzIgc2VnX2lkLCBzMzIgcmVxLAorCQkJICAgICBib29sIHJlc2VydmVkKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxfZnJlZV9meG4gPT09PT09PT0KKyAqICBGcmVlIG1lbW9yeSBmdW5jdGlvbi4gIEZyZWUsIG9yIHVucmVzZXJ2ZSAoaWYgcmVzZXJ2ZWQgPT0gVFJVRSkgInNpemUiCisgKiAgYnl0ZXMgb2YgbWVtb3J5IGZyb20gc2VnbWVudCAic3BhY2UiCisgKi8KK3R5cGVkZWYgYm9vbCgqZGJsX2ZyZWVfZnhuKSAodm9pZCAqaGRsLCB1MzIgYWRkciwgczMyIHNwYWNlLCB1MzIgc2l6ZSwKKwkJCSAgICAgYm9vbCByZXNlcnZlZCk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsX2xvZ193cml0ZV9meG4gPT09PT09PT0KKyAqICBGdW5jdGlvbiB0byBjYWxsIHdoZW4gd3JpdGluZyBkYXRhIGZyb20gYSBzZWN0aW9uLCB0byBsb2cgdGhlIGluZm8uCisgKiAgQ2FuIGJlIE5VTEwgaWYgbm8gbG9nZ2luZyBpcyByZXF1aXJlZC4KKyAqLwordHlwZWRlZiBpbnQoKmRibF9sb2dfd3JpdGVfZnhuKSAodm9pZCAqaGFuZGxlLAorCQkJCQlzdHJ1Y3QgZGJsX3NlY3RfaW5mbyAqc2VjdCwgdTMyIGFkZHIsCisJCQkJCXUzMiBieXRlcyk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsX3N5bV9sb29rdXAgPT09PT09PT0KKyAqICBTeW1ib2wgbG9va3VwIGZ1bmN0aW9uIC0gRmluZCB0aGUgc3ltYm9sIG5hbWUgYW5kIHJldHVybiBpdHMgdmFsdWUuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhhbmRsZSAgICAgICAgICAtIE9wYXF1ZSBoYW5kbGUKKyAqICAgICAgcGFyZyAgICAgICAgICAgIC0gT3BhcXVlIGFyZ3VtZW50LgorICogICAgICBuYW1lICAgICAgICAgICAgLSBOYW1lIG9mIHN5bWJvbCB0byBsb29rdXAuCisgKiAgICAgIHN5bSAgICAgICAgICAgICAtIExvY2F0aW9uIHRvIHN0b3JlIGFkZHJlc3Mgb2Ygc3ltYm9sIHN0cnVjdHVyZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRTogICAgICAgICAgIFN1Y2Nlc3MgKHN5bWJvbCB3YXMgZm91bmQpLgorICogICAgICBGQUxTRTogICAgICAgICAgRmFpbGVkIHRvIGZpbmQgc3ltYm9sLgorICovCit0eXBlZGVmIGJvb2woKmRibF9zeW1fbG9va3VwKSAodm9pZCAqaGFuZGxlLCB2b2lkICpwYXJnLCB2b2lkICpybW1faGFuZGxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkYmxfc3ltYm9sICoqIHN5bSk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsX3dyaXRlX2Z4biA9PT09PT09PQorICogIFdyaXRlIG1lbW9yeSBmdW5jdGlvbi4gIFdyaXRlICJuIiBIT1NUIGJ5dGVzIG9mIG1lbW9yeSB0byBzZWdtZW50ICJtdHlwZSIKKyAqICBzdGFydGluZyBhdCBhZGRyZXNzICJkc3BfYWRkcmVzcyIgZnJvbSB0aGUgYnVmZmVyICJidWYiLiAgVGhlIGJ1ZmZlciBpcworICogIGZvcm1hdHRlZCBhcyBhbiBhcnJheSBvZiB3b3JkcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERTUC4KKyAqLwordHlwZWRlZiBzMzIoKmRibF93cml0ZV9meG4pICh2b2lkICpoZGwsIHUzMiBkc3BfYWRkcmVzcywgdm9pZCAqYnVmLAorCQkJICAgICB1MzIgbiwgczMyIG10eXBlKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxfYXR0cnMgPT09PT09PT0KKyAqLworc3RydWN0IGRibF9hdHRycyB7CisJZGJsX2FsbG9jX2Z4biBhbGxvYzsKKwlkYmxfZnJlZV9meG4gZnJlZTsKKwl2b2lkICpybW1faGFuZGxlOwkvKiBIYW5kbGUgdG8gcGFzcyB0byBhbGxvYywgZnJlZSBmdW5jdGlvbnMgKi8KKwlkYmxfd3JpdGVfZnhuIHdyaXRlOworCXZvaWQgKmlucHV0X3BhcmFtczsJLyogSGFuZGxlIHRvIHBhc3MgdG8gd3JpdGUsIGNpbml0IGZ1bmN0aW9uICovCisKKwlkYmxfbG9nX3dyaXRlX2Z4biBsb2dfd3JpdGU7CisJdm9pZCAqbG9nX3dyaXRlX2hhbmRsZTsKKworCS8qIFN5bWJvbCBtYXRjaGluZyBmdW5jdGlvbiBhbmQgaGFuZGxlIHRvIHBhc3MgdG8gaXQgKi8KKwlkYmxfc3ltX2xvb2t1cCBzeW1fbG9va3VwOworCXZvaWQgKnN5bV9oYW5kbGU7CisJdm9pZCAqc3ltX2FyZzsKKworCS8qCisJICogIFRoZXNlIGZpbGUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIHRoZQorCSAqICAiQyIgcnVuIHRpbWUgbGlicmFyeSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZS4KKwkgKi8KKwkgczMyKCpmcmVhZCkgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIHZvaWQgKik7CisJIHMzMigqZnNlZWspICh2b2lkICosIGxvbmcsIGludCk7CisJIHMzMigqZnRlbGwpICh2b2lkICopOworCSBzMzIoKmZjbG9zZSkgKHZvaWQgKik7CisJdm9pZCAqKCpmb3BlbikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK307CisKKyNlbmRpZiAvKiBEQkxERUZTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RibGwuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kYmxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxODY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kYmxsLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIGRibGwuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiAgRFNQL0JJT1MgQnJpZGdlIER5bmFtaWMgbG9hZCBsaWJyYXJ5IG1vZHVsZSBpbnRlcmZhY2UuIEZ1bmN0aW9uIGhlYWRlcgorICogIGNvbW1lbnRzIGFyZSBpbiB0aGUgZmlsZSBkYmxsZGVmcy5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgREJMTF8KKyNkZWZpbmUgREJMTF8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJsbGRlZnMuaD4KKworZXh0ZXJuIGJvb2wgc3ltYm9sc19yZWxvYWRlZDsKKworZXh0ZXJuIHZvaWQgZGJsbF9jbG9zZShzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqemxfbGliKTsKK2V4dGVybiBpbnQgZGJsbF9jcmVhdGUoc3RydWN0IGRibGxfdGFyX29iaiAqKnRhcmdldF9vYmosCisJCQkgICAgICBzdHJ1Y3QgZGJsbF9hdHRycyAqcGF0dHJzKTsKK2V4dGVybiB2b2lkIGRibGxfZGVsZXRlKHN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldCk7CitleHRlcm4gdm9pZCBkYmxsX2V4aXQodm9pZCk7CitleHRlcm4gYm9vbCBkYmxsX2dldF9hZGRyKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIsIGNoYXIgKm5hbWUsCisJCQkgIHN0cnVjdCBkYmxsX3N5bV92YWwgKipzeW1fdmFsKTsKK2V4dGVybiB2b2lkIGRibGxfZ2V0X2F0dHJzKHN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldCwKKwkJCSAgIHN0cnVjdCBkYmxsX2F0dHJzICpwYXR0cnMpOworZXh0ZXJuIGJvb2wgZGJsbF9nZXRfY19hZGRyKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIsIGNoYXIgKm5hbWUsCisJCQkgICAgc3RydWN0IGRibGxfc3ltX3ZhbCAqKnN5bV92YWwpOworZXh0ZXJuIGludCBkYmxsX2dldF9zZWN0KHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWIsIGNoYXIgKm5hbWUsCisJCQkJdTMyICpwYWRkciwgdTMyICpwc2l6ZSk7CitleHRlcm4gYm9vbCBkYmxsX2luaXQodm9pZCk7CitleHRlcm4gaW50IGRibGxfbG9hZChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliLAorCQkJICAgIGRibGxfZmxhZ3MgZmxhZ3MsCisJCQkgICAgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzLCB1MzIgKiBlbnRyeSk7CitleHRlcm4gaW50IGRibGxfbG9hZF9zZWN0KHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIsCisJCQkJIGNoYXIgKnNlY19uYW1lLCBzdHJ1Y3QgZGJsbF9hdHRycyAqYXR0cnMpOworZXh0ZXJuIGludCBkYmxsX29wZW4oc3RydWN0IGRibGxfdGFyX29iaiAqdGFyZ2V0LCBjaGFyICpmaWxlLAorCQkJICAgIGRibGxfZmxhZ3MgZmxhZ3MsCisJCSAgICAgICBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKmxpYl9vYmopOworZXh0ZXJuIGludCBkYmxsX3JlYWRfc2VjdChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliLAorCQkJCSBjaGFyICpuYW1lLCBjaGFyICpidWYsIHUzMiBzaXplKTsKK2V4dGVybiB2b2lkIGRibGxfc2V0X2F0dHJzKHN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldCwKKwkJCSAgIHN0cnVjdCBkYmxsX2F0dHJzICpwYXR0cnMpOworZXh0ZXJuIHZvaWQgZGJsbF91bmxvYWQoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzKTsKK2V4dGVybiBpbnQgZGJsbF91bmxvYWRfc2VjdChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliLAorCQkJCSAgIGNoYXIgKnNlY3RfbmFtZSwgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzKTsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCitib29sIGRibGxfZmluZF9kc3Bfc3ltYm9sKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIsIHUzMiBhZGRyZXNzLAorCQl1MzIgb2Zmc2V0X3JhbmdlLCB1MzIgKnN5bV9hZGRyX291dHB1dCwgY2hhciAqbmFtZV9vdXRwdXQpOworI2VuZGlmCisKKyNlbmRpZiAvKiBEQkxMXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RibGxkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGJsbGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI0ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RibGxkZWZzLmgKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBkYmxsZGVmcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgREJMTERFRlNfCisjZGVmaW5lIERCTExERUZTXworCisvKgorICogIEJpdCBtYXNrcyBmb3IgZGJsX2ZsYWdzLgorICovCisjZGVmaW5lIERCTExfTk9MT0FEICAgMHgwCS8qIERvbid0IGxvYWQgc3ltYm9scywgY29kZSwgb3IgZGF0YSAqLworI2RlZmluZSBEQkxMX1NZTUIgICAgIDB4MQkvKiBsb2FkIHN5bWJvbHMgKi8KKyNkZWZpbmUgREJMTF9DT0RFICAgICAweDIJLyogbG9hZCBjb2RlICovCisjZGVmaW5lIERCTExfREFUQSAgICAgMHg0CS8qIGxvYWQgZGF0YSAqLworI2RlZmluZSBEQkxMX0RZTkFNSUMgIDB4OAkvKiBkeW5hbWljIGxvYWQgKi8KKyNkZWZpbmUgREJMTF9CU1MgICAgICAweDIwCS8qIFVuaXRpYWxpemVkIHNlY3Rpb24gKi8KKworI2RlZmluZSBEQkxMX01BWFBBVEhMRU5HVEggICAgICAgMjU1CisKKy8qCisgKiAgPT09PT09PT0gREJMTF9UYXJnZXQgPT09PT09PT0KKyAqCisgKi8KK3N0cnVjdCBkYmxsX3Rhcl9vYmo7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9mbGFncyA9PT09PT09PQorICogIFNwZWNpZmllcyB3aGV0aGVyIHRvIGxvYWQgY29kZSwgZGF0YSwgb3Igc3ltYm9scworICovCit0eXBlZGVmIHMzMiBkYmxsX2ZsYWdzOworCisvKgorICogID09PT09PT09IERCTExfTGlicmFyeSA9PT09PT09PQorICoKKyAqLworc3RydWN0IGRibGxfbGlicmFyeV9vYmo7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9zZWN0X2luZm8gPT09PT09PT0KKyAqICBGb3IgY29sbGVjdGluZyBpbmZvIG9uIG92ZXJsYXkgc2VjdGlvbnMKKyAqLworc3RydWN0IGRibGxfc2VjdF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBuYW1lIG9mIHNlY3Rpb24gKi8KKwl1MzIgc2VjdF9ydW5fYWRkcjsJLyogcnVuIGFkZHJlc3Mgb2Ygc2VjdGlvbiAqLworCXUzMiBzZWN0X2xvYWRfYWRkcjsJLyogbG9hZCBhZGRyZXNzIG9mIHNlY3Rpb24gKi8KKwl1MzIgc2l6ZTsJCS8qIHNpemUgb2Ygc2VjdGlvbiAodGFyZ2V0IE1BVXMpICovCisJZGJsbF9mbGFncyB0eXBlOwkvKiBDb2RlLCBkYXRhLCBvciBCU1MgKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9zeW1fdmFsID09PT09PT09CisgKiAgKE5lZWRlZCBmb3IgZHluYW1pYyBsb2FkIGxpYnJhcnkpCisgKi8KK3N0cnVjdCBkYmxsX3N5bV92YWwgeworCXUzMiB2YWx1ZTsKK307CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9hbGxvY19meG4gPT09PT09PT0KKyAqICBBbGxvY2F0ZSBtZW1vcnkgZnVuY3Rpb24uICBBbGxvY2F0ZSBvciByZXNlcnZlIChpZiByZXNlcnZlZCA9PSBUUlVFKQorICogICJzaXplIiBieXRlcyBvZiBtZW1vcnkgZnJvbSBzZWdtZW50ICJzcGFjZSIgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBpbgorICogICpkc3BfYWRkcmVzcyAob3Igc3RhcnRpbmcgYXQgKmRzcF9hZGRyZXNzIGlmIHJlc2VydmUgPT0gVFJVRSkuIFJldHVybnMgMCBvbgorICogIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLwordHlwZWRlZiBzMzIoKmRibGxfYWxsb2NfZnhuKSAodm9pZCAqaGRsLCBzMzIgc3BhY2UsIHUzMiBzaXplLCB1MzIgYWxpZ24sCisJCQkgICAgICB1MzIgKmRzcF9hZGRyZXNzLCBzMzIgc2VnX2lkLCBzMzIgcmVxLAorCQkJICAgICAgYm9vbCByZXNlcnZlZCk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9jbG9zZV9meG4gPT09PT09PT0KKyAqLwordHlwZWRlZiBzMzIoKmRibGxfZl9jbG9zZV9meG4pICh2b2lkICopOworCisvKgorICogID09PT09PT09IGRibGxfZnJlZV9meG4gPT09PT09PT0KKyAqICBGcmVlIG1lbW9yeSBmdW5jdGlvbi4gIEZyZWUsIG9yIHVucmVzZXJ2ZSAoaWYgcmVzZXJ2ZWQgPT0gVFJVRSkgInNpemUiCisgKiAgYnl0ZXMgb2YgbWVtb3J5IGZyb20gc2VnbWVudCAic3BhY2UiCisgKi8KK3R5cGVkZWYgYm9vbCgqZGJsbF9mcmVlX2Z4bikgKHZvaWQgKmhkbCwgdTMyIGFkZHIsIHMzMiBzcGFjZSwgdTMyIHNpemUsCisJCQkgICAgICBib29sIHJlc2VydmVkKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX2Zfb3Blbl9meG4gPT09PT09PT0KKyAqLwordHlwZWRlZiB2b2lkICooKmRibGxfZl9vcGVuX2Z4bikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX2xvZ193cml0ZV9meG4gPT09PT09PT0KKyAqICBGdW5jdGlvbiB0byBjYWxsIHdoZW4gd3JpdGluZyBkYXRhIGZyb20gYSBzZWN0aW9uLCB0byBsb2cgdGhlIGluZm8uCisgKiAgQ2FuIGJlIE5VTEwgaWYgbm8gbG9nZ2luZyBpcyByZXF1aXJlZC4KKyAqLwordHlwZWRlZiBpbnQoKmRibGxfbG9nX3dyaXRlX2Z4bikgKHZvaWQgKmhhbmRsZSwKKwkJCQkJIHN0cnVjdCBkYmxsX3NlY3RfaW5mbyAqc2VjdCwgdTMyIGFkZHIsCisJCQkJCSB1MzIgYnl0ZXMpOworCisvKgorICogID09PT09PT09IGRibGxfcmVhZF9meG4gPT09PT09PT0KKyAqLwordHlwZWRlZiBzMzIoKmRibGxfcmVhZF9meG4pICh2b2lkICosIHNpemVfdCwgc2l6ZV90LCB2b2lkICopOworCisvKgorICogID09PT09PT09IGRibGxfc2Vla19meG4gPT09PT09PT0KKyAqLwordHlwZWRlZiBzMzIoKmRibGxfc2Vla19meG4pICh2b2lkICosIGxvbmcsIGludCk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9zeW1fbG9va3VwID09PT09PT09CisgKiAgU3ltYm9sIGxvb2t1cCBmdW5jdGlvbiAtIEZpbmQgdGhlIHN5bWJvbCBuYW1lIGFuZCByZXR1cm4gaXRzIHZhbHVlLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoYW5kbGUgICAgICAgICAgLSBPcGFxdWUgaGFuZGxlCisgKiAgICAgIHBhcmcgICAgICAgICAgICAtIE9wYXF1ZSBhcmd1bWVudC4KKyAqICAgICAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiBzeW1ib2wgdG8gbG9va3VwLgorICogICAgICBzeW0gICAgICAgICAgICAgLSBMb2NhdGlvbiB0byBzdG9yZSBhZGRyZXNzIG9mIHN5bWJvbCBzdHJ1Y3R1cmUuCisgKgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUU6ICAgICAgICAgICBTdWNjZXNzIChzeW1ib2wgd2FzIGZvdW5kKS4KKyAqICAgICAgRkFMU0U6ICAgICAgICAgIEZhaWxlZCB0byBmaW5kIHN5bWJvbC4KKyAqLwordHlwZWRlZiBib29sKCpkYmxsX3N5bV9sb29rdXApICh2b2lkICpoYW5kbGUsIHZvaWQgKnBhcmcsIHZvaWQgKnJtbV9oYW5kbGUsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRibGxfc3ltX3ZhbCAqKiBzeW0pOworCisvKgorICogID09PT09PT09IGRibGxfdGVsbF9meG4gPT09PT09PT0KKyAqLwordHlwZWRlZiBzMzIoKmRibGxfdGVsbF9meG4pICh2b2lkICopOworCisvKgorICogID09PT09PT09IGRibGxfd3JpdGVfZnhuID09PT09PT09CisgKiAgV3JpdGUgbWVtb3J5IGZ1bmN0aW9uLiAgV3JpdGUgIm4iIEhPU1QgYnl0ZXMgb2YgbWVtb3J5IHRvIHNlZ21lbnQgIm10eXBlIgorICogIHN0YXJ0aW5nIGF0IGFkZHJlc3MgImRzcF9hZGRyZXNzIiBmcm9tIHRoZSBidWZmZXIgImJ1ZiIuICBUaGUgYnVmZmVyIGlzCisgKiAgZm9ybWF0dGVkIGFzIGFuIGFycmF5IG9mIHdvcmRzIGFwcHJvcHJpYXRlIGZvciB0aGUgRFNQLgorICovCit0eXBlZGVmIHMzMigqZGJsbF93cml0ZV9meG4pICh2b2lkICpoZGwsIHUzMiBkc3BfYWRkcmVzcywgdm9pZCAqYnVmLAorCQkJICAgICAgdTMyIG4sIHMzMiBtdHlwZSk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9hdHRycyA9PT09PT09PQorICovCitzdHJ1Y3QgZGJsbF9hdHRycyB7CisJZGJsbF9hbGxvY19meG4gYWxsb2M7CisJZGJsbF9mcmVlX2Z4biBmcmVlOworCXZvaWQgKnJtbV9oYW5kbGU7CS8qIEhhbmRsZSB0byBwYXNzIHRvIGFsbG9jLCBmcmVlIGZ1bmN0aW9ucyAqLworCWRibGxfd3JpdGVfZnhuIHdyaXRlOworCXZvaWQgKmlucHV0X3BhcmFtczsJLyogSGFuZGxlIHRvIHBhc3MgdG8gd3JpdGUsIGNpbml0IGZ1bmN0aW9uICovCisJYm9vbCBiYXNlX2ltYWdlOworCWRibGxfbG9nX3dyaXRlX2Z4biBsb2dfd3JpdGU7CisJdm9pZCAqbG9nX3dyaXRlX2hhbmRsZTsKKworCS8qIFN5bWJvbCBtYXRjaGluZyBmdW5jdGlvbiBhbmQgaGFuZGxlIHRvIHBhc3MgdG8gaXQgKi8KKwlkYmxsX3N5bV9sb29rdXAgc3ltX2xvb2t1cDsKKwl2b2lkICpzeW1faGFuZGxlOworCXZvaWQgKnN5bV9hcmc7CisKKwkvKgorCSAqICBUaGVzZSBmaWxlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKKwkgKiAgIkMiIHJ1biB0aW1lIGxpYnJhcnkgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUuCisJICovCisJIHMzMigqZnJlYWQpICh2b2lkICosIHNpemVfdCwgc2l6ZV90LCB2b2lkICopOworCSBzMzIoKmZzZWVrKSAodm9pZCAqLCBsb25nLCBpbnQpOworCSBzMzIoKmZ0ZWxsKSAodm9pZCAqKTsKKwkgczMyKCpmY2xvc2UpICh2b2lkICopOworCXZvaWQgKigqZm9wZW4pIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cit9OworCisvKgorICogID09PT09PT09IGRibGxfY2xvc2UgPT09PT09PT0KKyAqICBDbG9zZSBsaWJyYXJ5IG9wZW5lZCB3aXRoIGRibGxfb3Blbi4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBsaWIgICAgICAgICAgICAgLSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBkYmxsX29wZW4oKS4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBEQkwgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGxpYi4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIHZvaWQgKCpkYmxsX2Nsb3NlX2Z4bikgKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWJyYXJ5KTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX2NyZWF0ZSA9PT09PT09PQorICogIENyZWF0ZSBhIHRhcmdldCBvYmplY3QsIHNwZWNpZnlpbmcgdGhlIGFsbG9jLCBmcmVlLCBhbmQgd3JpdGUgZnVuY3Rpb25zLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHRhcmdldF9vYmogICAgICAgICAtIExvY2F0aW9uIHRvIHN0b3JlIHRhcmdldCBoYW5kbGUgb24gb3V0cHV0LgorICogICAgICBwYXR0cnMgICAgICAgICAgLSBBdHRyaWJ1dGVzLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERCTCBpbml0aWFsaXplZC4KKyAqICAgICAgcGF0dHJzICE9IE5VTEwuCisgKiAgICAgIHRhcmdldF9vYmogIT0gTlVMTDsKKyAqICBFbnN1cmVzOgorICogICAgICBTdWNjZXNzOiAgICAgICAgKnRhcmdldF9vYmogIT0gTlVMTC4KKyAqICAgICAgRmFpbHVyZTogICAgICAgICp0YXJnZXRfb2JqID09IE5VTEwuCisgKi8KK3R5cGVkZWYgaW50KCpkYmxsX2NyZWF0ZV9meG4pIChzdHJ1Y3QgZGJsbF90YXJfb2JqICoqdGFyZ2V0X29iaiwKKwkJCQkgICAgICBzdHJ1Y3QgZGJsbF9hdHRycyAqYXR0cnMpOworCisvKgorICogID09PT09PT09IGRibGxfZGVsZXRlID09PT09PT09CisgKiAgRGVsZXRlIHRhcmdldCBvYmplY3QgYW5kIGZyZWUgcmVzb3VyY2VzIGZvciBhbnkgbG9hZGVkIGxpYnJhcmllcy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB0YXJnZXQgICAgICAgICAgLSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBEQkxMX0NyZWF0ZSgpLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERCTCBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgdGFyZ2V0LgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgdm9pZCAoKmRibGxfZGVsZXRlX2Z4bikgKHN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldCk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9leGl0ID09PT09PT09CisgKiAgRGlzY29udGludWUgdXNlIG9mIERCTCBtb2R1bGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICByZWZzID4gMC4KKyAqICBFbnN1cmVzOgorICogICAgICByZWZzID49IDAuCisgKi8KK3R5cGVkZWYgdm9pZCAoKmRibGxfZXhpdF9meG4pICh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX2dldF9hZGRyID09PT09PT09CisgKiAgR2V0IGFkZHJlc3Mgb2YgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIGxpYnJhcnkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbGliICAgICAgICAgICAgIC0gSGFuZGxlIHJldHVybmVkIGZyb20gZGJsbF9vcGVuKCkuCisgKiAgICAgIG5hbWUgICAgICAgICAgICAtIE5hbWUgb2Ygc3ltYm9sCisgKiAgICAgIHN5bV92YWwgICAgICAgICAtIExvY2F0aW9uIHRvIHN0b3JlIHN5bWJvbCBhZGRyZXNzIG9uIG91dHB1dC4KKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFOiAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgRkFMU0U6ICAgICAgICAgIFN5bWJvbCBub3QgZm91bmQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERCTCBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgbGlicmFyeS4KKyAqICAgICAgbmFtZSAhPSBOVUxMLgorICogICAgICBzeW1fdmFsICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBib29sKCpkYmxsX2dldF9hZGRyX2Z4bikgKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWIsIGNoYXIgKm5hbWUsCisJCQkJICBzdHJ1Y3QgZGJsbF9zeW1fdmFsICoqc3ltX3ZhbCk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9nZXRfYXR0cnMgPT09PT09PT0KKyAqICBSZXRyaWV2ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdGFyZ2V0LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHRhcmdldCAgICAgICAgICAtIEhhbmRsZSByZXR1cm5lZCBmcm9tIERCTExfQ3JlYXRlKCkuCisgKiAgICAgIHBhdHRycyAgICAgICAgICAtIExvY2F0aW9uIHRvIHN0b3JlIGF0dHJpYnV0ZXMgb24gb3V0cHV0LgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERCTCBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgdGFyZ2V0LgorICogICAgICBwYXR0cnMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIHZvaWQgKCpkYmxsX2dldF9hdHRyc19meG4pIChzdHJ1Y3QgZGJsbF90YXJfb2JqICp0YXJnZXQsCisJCQkJICAgIHN0cnVjdCBkYmxsX2F0dHJzICphdHRycyk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9nZXRfY19hZGRyID09PT09PT09CisgKiAgR2V0IGFkZHJlc3Mgb2YgIkMiIG5hbWUgb24gdGhlIHNwZWNpZmllZCBsaWJyYXJ5LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGxpYiAgICAgICAgICAgICAtIEhhbmRsZSByZXR1cm5lZCBmcm9tIGRibGxfb3BlbigpLgorICogICAgICBuYW1lICAgICAgICAgICAgLSBOYW1lIG9mIHN5bWJvbAorICogICAgICBzeW1fdmFsICAgICAgICAgLSBMb2NhdGlvbiB0byBzdG9yZSBzeW1ib2wgYWRkcmVzcyBvbiBvdXRwdXQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRTogICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIEZBTFNFOiAgICAgICAgICBTeW1ib2wgbm90IGZvdW5kLgorICogIFJlcXVpcmVzOgorICogICAgICBEQkwgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIHRhcmdldC4KKyAqICAgICAgbmFtZSAhPSBOVUxMLgorICogICAgICBzeW1fdmFsICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBib29sKCpkYmxsX2dldF9jX2FkZHJfZnhuKSAoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwgY2hhciAqbmFtZSwKKwkJCQkgICAgc3RydWN0IGRibGxfc3ltX3ZhbCAqKnN5bV92YWwpOworCisvKgorICogID09PT09PT09IGRibGxfZ2V0X3NlY3QgPT09PT09PT0KKyAqICBHZXQgYWRkcmVzcyBhbmQgc2l6ZSBvZiBhIG5hbWVkIHNlY3Rpb24uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbGliICAgICAgICAgICAgIC0gTGlicmFyeSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBkYmxsX29wZW4oKS4KKyAqICAgICAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiBzZWN0aW9uLgorICogICAgICBwYWRkciAgICAgICAgICAgLSBMb2NhdGlvbiB0byBzdG9yZSBzZWN0aW9uIGFkZHJlc3Mgb24gb3V0cHV0LgorICogICAgICBwc2l6ZSAgICAgICAgICAgLSBMb2NhdGlvbiB0byBzdG9yZSBzZWN0aW9uIHNpemUgb24gb3V0cHV0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5YSU86ICAgIFNlY3Rpb24gbm90IGZvdW5kLgorICogIFJlcXVpcmVzOgorICogICAgICBEQkwgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGxpYi4KKyAqICAgICAgbmFtZSAhPSBOVUxMLgorICogICAgICBwYWRkciAhPSBOVUxMOworICogICAgICBwc2l6ZSAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpkYmxsX2dldF9zZWN0X2Z4bikgKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWIsCisJCQkJCWNoYXIgKm5hbWUsIHUzMiAqIGFkZHIsIHUzMiAqIHNpemUpOworCisvKgorICogID09PT09PT09IGRibGxfaW5pdCA9PT09PT09PQorICogIEluaXRpYWxpemUgREJMIG1vZHVsZS4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUU6ICAgICAgICAgICBTdWNjZXNzLgorICogICAgICBGQUxTRTogICAgICAgICAgRmFpbHVyZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgcmVmcyA+PSAwLgorICogIEVuc3VyZXM6CisgKiAgICAgIFN1Y2Nlc3M6ICAgICAgICByZWZzID4gMC4KKyAqICAgICAgRmFpbHVyZTogICAgICAgIHJlZnMgPj0gMC4KKyAqLwordHlwZWRlZiBib29sKCpkYmxsX2luaXRfZnhuKSAodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9sb2FkID09PT09PT09CisgKiAgTG9hZCBsaWJyYXJ5IG9udG8gdGhlIHRhcmdldC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbGliICAgICAgICAgICAgIC0gTGlicmFyeSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBkYmxsX29wZW4oKS4KKyAqICAgICAgZmxhZ3MgICAgICAgICAgIC0gTG9hZCBjb2RlLCBkYXRhIGFuZC9vciBzeW1ib2xzLgorICogICAgICBhdHRycyAgICAgICAgICAgLSBNYXkgY29udGFpbiBhbGxvYywgZnJlZSwgYW5kIHdyaXRlIGZ1bmN0aW9uLgorICogICAgICBlbnRyeV9wdCAgICAgICAgLSBMb2NhdGlvbiB0byBzdG9yZSBwcm9ncmFtIGVudHJ5IG9uIG91dHB1dC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVCQURGOiAgICAgRmlsZSByZWFkIGZhaWxlZC4KKyAqICAgICAgLUVJTFNFUTogICBGYWlsdXJlIGluIGR5bmFtaWMgbG9hZGVyIGxpYnJhcnkuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERCTCBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgbGliLgorICogICAgICBlbnRyeSAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpkYmxsX2xvYWRfZnhuKSAoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwKKwkJCQkgICAgZGJsbF9mbGFncyBmbGFncywKKwkJCQkgICAgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzLCB1MzIgKmVudHJ5KTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX2xvYWRfc2VjdCA9PT09PT09PQorICogIExvYWQgYSBuYW1lZCBzZWN0aW9uIGZyb20gYW4gbGlicmFyeSAoZm9yIG92ZXJsYXkgc3VwcG9ydCkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbGliICAgICAgICAgICAgIC0gSGFuZGxlIHJldHVybmVkIGZyb20gZGJsbF9vcGVuKCkuCisgKiAgICAgIHNlY19uYW1lICAgICAgICAtIE5hbWUgb2Ygc2VjdGlvbiB0byBsb2FkLgorICogICAgICBhdHRycyAgICAgICAgICAgLSBDb250YWlucyB3cml0ZSBmdW5jdGlvbiBhbmQgaGFuZGxlIHRvIHBhc3MgdG8gaXQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FTlhJTzogICAgU2VjdGlvbiBub3QgZm91bmQuCisgKiAgICAgIC1FTk9TWVM6ICAgRnVuY3Rpb24gbm90IGltcGxlbWVudGVkLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBsaWIuCisgKiAgICAgIHNlY19uYW1lICE9IE5VTEwuCisgKiAgICAgIGF0dHJzICE9IE5VTEwuCisgKiAgICAgIGF0dHJzLT53cml0ZSAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpkYmxsX2xvYWRfc2VjdF9meG4pIChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliLAorCQkJCQkgY2hhciAqc3pfc2VjdF9uYW1lLAorCQkJCQkgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX29wZW4gPT09PT09PT0KKyAqICBkYmxsX29wZW4oKSByZXR1cm5zIGEgbGlicmFyeSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2FkL3VubG9hZAorICogIHRoZSBzeW1ib2xzL2NvZGUvZGF0YSB2aWEgZGJsbF9sb2FkKCkvZGJsbF91bmxvYWQoKS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB0YXJnZXQgICAgICAgICAgLSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBkYmxsX2NyZWF0ZSgpLgorICogICAgICBmaWxlICAgICAgICAgICAgLSBOYW1lIG9mIGZpbGUgdG8gb3Blbi4KKyAqICAgICAgZmxhZ3MgICAgICAgICAgIC0gSWYgZmxhZ3MgJiBEQkxMX1NZTUIsIGxvYWQgc3ltYm9scy4KKyAqICAgICAgbGliX29iaiAgICAgICAgIC0gTG9jYXRpb24gdG8gc3RvcmUgbGlicmFyeSBoYW5kbGUgb24gb3V0cHV0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuCisgKiAgICAgIC1FQkFERjogICAgICAgICBGaWxlIG9wZW4vcmVhZCBmYWlsdXJlLgorICogICAgICAgICAgICAgICAgICAgICAgVW5hYmxlIHRvIGRldGVybWluZSB0YXJnZXQgdHlwZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgREJMIGluaXRpYWxpemVkLgorICogICAgICBWYWxpZCB0YXJnZXQuCisgKiAgICAgIGZpbGUgIT0gTlVMTC4KKyAqICAgICAgbGliX29iaiAhPSBOVUxMLgorICogICAgICBkYmxsX2F0dHJzIGZvcGVuIGZ1bmN0aW9uIG5vbi1OVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIFN1Y2Nlc3M6ICAgICAgICBWYWxpZCAqbGliX29iai4KKyAqICAgICAgRmFpbHVyZTogICAgICAgICpsaWJfb2JqID09IE5VTEwuCisgKi8KK3R5cGVkZWYgaW50KCpkYmxsX29wZW5fZnhuKSAoc3RydWN0IGRibGxfdGFyX29iaiAqdGFyZ2V0LCBjaGFyICpmaWxlLAorCQkJCSAgICBkYmxsX2ZsYWdzIGZsYWdzLAorCQkJCSAgICBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKmxpYl9vYmopOworCisvKgorICogID09PT09PT09IGRibGxfcmVhZF9zZWN0ID09PT09PT09CisgKiAgUmVhZCBDT0ZGIHNlY3Rpb24gaW50byBhIGNoYXJhY3RlciBidWZmZXIuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbGliICAgICAgICAgICAgIC0gTGlicmFyeSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBkYmxsX29wZW4oKS4KKyAqICAgICAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiBzZWN0aW9uLgorICogICAgICBwYnVmICAgICAgICAgICAgLSBCdWZmZXIgdG8gd3JpdGUgc2VjdGlvbiBjb250ZW50cyBpbnRvLgorICogICAgICBzaXplICAgICAgICAgICAgLSBCdWZmZXIgc2l6ZQorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5YSU86ICAgIE5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3RzLgorICogIFJlcXVpcmVzOgorICogICAgICBEQkwgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGxpYi4KKyAqICAgICAgbmFtZSAhPSBOVUxMLgorICogICAgICBwYnVmICE9IE5VTEwuCisgKiAgICAgIHNpemUgIT0gMC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqZGJsbF9yZWFkX3NlY3RfZnhuKSAoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwKKwkJCQkJIGNoYXIgKm5hbWUsIGNoYXIgKmNvbnRlbnQsCisJCQkJCSB1MzIgY29udF9zaXplKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX3NldF9hdHRycyA9PT09PT09PQorICogIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdGFyZ2V0LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHRhcmdldCAgICAgICAgICAtIEhhbmRsZSByZXR1cm5lZCBmcm9tIGRibGxfY3JlYXRlKCkuCisgKiAgICAgIHBhdHRycyAgICAgICAgICAtIE5ldyBhdHRyaWJ1dGVzLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERCTCBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgdGFyZ2V0LgorICogICAgICBwYXR0cnMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIHZvaWQgKCpkYmxsX3NldF9hdHRyc19meG4pIChzdHJ1Y3QgZGJsbF90YXJfb2JqICp0YXJnZXQsCisJCQkJICAgIHN0cnVjdCBkYmxsX2F0dHJzICphdHRycyk7CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF91bmxvYWQgPT09PT09PT0KKyAqICBVbmxvYWQgbGlicmFyeSBsb2FkZWQgd2l0aCBkYmxsX2xvYWQoKS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBsaWIgICAgICAgICAgICAgLSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBkYmxsX29wZW4oKS4KKyAqICAgICAgYXR0cnMgICAgICAgICAgIC0gQ29udGFpbnMgZnJlZSgpIGZ1bmN0aW9uIGFuZCBoYW5kbGUgdG8gcGFzcyB0byBpdC4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBEQkwgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGxpYi4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIHZvaWQgKCpkYmxsX3VubG9hZF9meG4pIChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGlicmFyeSwKKwkJCQkgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzKTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX3VubG9hZF9zZWN0ID09PT09PT09CisgKiAgVW5sb2FkIGEgbmFtZWQgc2VjdGlvbiBmcm9tIGFuIGxpYnJhcnkgKGZvciBvdmVybGF5IHN1cHBvcnQpLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGxpYiAgICAgICAgICAgICAtIEhhbmRsZSByZXR1cm5lZCBmcm9tIGRibGxfb3BlbigpLgorICogICAgICBzZWNfbmFtZSAgICAgICAgLSBOYW1lIG9mIHNlY3Rpb24gdG8gbG9hZC4KKyAqICAgICAgYXR0cnMgICAgICAgICAgIC0gQ29udGFpbnMgZnJlZSgpIGZ1bmN0aW9uIGFuZCBoYW5kbGUgdG8gcGFzcyB0byBpdC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOWElPOiAgICBOYW1lZCBzZWN0aW9uIG5vdCBmb3VuZC4KKyAqICAgICAgLUVOT1NZUworICogIFJlcXVpcmVzOgorICogICAgICBEQkwgaW5pdGlhbGl6ZWQuCisgKiAgICAgIFZhbGlkIGxpYi4KKyAqICAgICAgc2VjX25hbWUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqZGJsbF91bmxvYWRfc2VjdF9meG4pIChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliLAorCQkJCQkgICBjaGFyICpzel9zZWN0X25hbWUsCisJCQkJCSAgIHN0cnVjdCBkYmxsX2F0dHJzICphdHRycyk7CisKK3N0cnVjdCBkYmxsX2Z4bnMgeworCWRibGxfY2xvc2VfZnhuIGNsb3NlX2Z4bjsKKwlkYmxsX2NyZWF0ZV9meG4gY3JlYXRlX2Z4bjsKKwlkYmxsX2RlbGV0ZV9meG4gZGVsZXRlX2Z4bjsKKwlkYmxsX2V4aXRfZnhuIGV4aXRfZnhuOworCWRibGxfZ2V0X2F0dHJzX2Z4biBnZXRfYXR0cnNfZnhuOworCWRibGxfZ2V0X2FkZHJfZnhuIGdldF9hZGRyX2Z4bjsKKwlkYmxsX2dldF9jX2FkZHJfZnhuIGdldF9jX2FkZHJfZnhuOworCWRibGxfZ2V0X3NlY3RfZnhuIGdldF9zZWN0X2Z4bjsKKwlkYmxsX2luaXRfZnhuIGluaXRfZnhuOworCWRibGxfbG9hZF9meG4gbG9hZF9meG47CisJZGJsbF9sb2FkX3NlY3RfZnhuIGxvYWRfc2VjdF9meG47CisJZGJsbF9vcGVuX2Z4biBvcGVuX2Z4bjsKKwlkYmxsX3JlYWRfc2VjdF9meG4gcmVhZF9zZWN0X2Z4bjsKKwlkYmxsX3NldF9hdHRyc19meG4gc2V0X2F0dHJzX2Z4bjsKKwlkYmxsX3VubG9hZF9meG4gdW5sb2FkX2Z4bjsKKwlkYmxsX3VubG9hZF9zZWN0X2Z4biB1bmxvYWRfc2VjdF9meG47Cit9OworCisjZW5kaWYgLyogREJMREVGU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kZWhkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGVoZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjhiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGVoZGVmcy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBkZWhkZWZzLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRGVmaW5pdGlvbiBmb3IgQnJpZGdlIGRyaXZlciBtb2R1bGUgREVILgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgREVIREVGU18KKyNkZWZpbmUgREVIREVGU18KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9tYnhfc2guaD4JLyogc2hhcmVkIG1haWxib3ggY29kZXMgKi8KKworLyogREVIIG9iamVjdCBtYW5hZ2VyICovCitzdHJ1Y3QgZGVoX21ncjsKKworLyogTWFnaWMgY29kZSB1c2VkIHRvIGRldGVybWluZSBpZiBEU1Agc2lnbmFsZWQgZXhjZXB0aW9uLiAqLworI2RlZmluZSBERUhfQkFTRSAgICAgICAgTUJYX0RFSF9CQVNFCisjZGVmaW5lIERFSF9VU0VSU19CQVNFICBNQlhfREVIX1VTRVJTX0JBU0UKKyNkZWZpbmUgREVIX0xJTUlUICAgICAgIE1CWF9ERUhfTElNSVQKKworI2VuZGlmIC8qIF9ERUhERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc0NThmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Rldi5oCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogZGV2LmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQnJpZGdlIEJyaWRnZSBkcml2ZXIgZGV2aWNlIG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBERVZfCisjZGVmaW5lIERFVl8KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZHVsZSBEZXBlbmRlbnQgSGVhZGVycyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jaG5sZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9jbW0uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY29kLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RlaGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZWRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGlzcGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kbW0uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2JyZF93cml0ZV9meG4gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBFeHBvcnRlZCBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIHRoZSBDT0Qgd3JpdGUgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uCisgKiAgICAgIGlzIHBhc3NlZCBhIGhhbmRsZSB0byBhIERFVl9oT2JqZWN0IGJ5IFpMIGluIGFyYiwgdGhlbiBjYWxscyB0aGUKKyAqICAgICAgZGV2aWNlJ3MgYnJpZGdlX2JyZF93cml0ZSgpIGZ1bmN0aW9uLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGFyYjogICAgICAgICAgIEhhbmRsZSB0byBhIERldmljZSBPYmplY3QuCisgKiAgICAgIGRldl9jdHh0OiAgICBIYW5kbGUgdG8gQnJpZGdlIGRyaXZlciBkZWZpbmVkIGRldmljZSBpbmZvLgorICogICAgICBkc3BfYWRkcjogICAgICAgQWRkcmVzcyBvbiBEU1AgYm9hcmQgKERlc3RpbmF0aW9uKS4KKyAqICAgICAgaG9zdF9idWY6ICAgICAgIFBvaW50ZXIgdG8gaG9zdCBidWZmZXIgKFNvdXJjZSkuCisgKiAgICAgIHVsX251bV9ieXRlczogICAgIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KKyAqICAgICAgbWVtX3R5cGU6ICAgICAgIE1lbW9yeSBzcGFjZSBvbiBEU1AgdG8gd2hpY2ggdG8gdHJhbnNmZXIuCisgKiAgUmV0dXJuczoKKyAqICAgICAgTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uICBSZXR1cm5zIDAgaWYgdGhlIERFVl9oT2JqZWN0IHBhc3NlZCBpbiB2aWEKKyAqICAgICAgYXJiIGlzIGludmFsaWQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICAgICAgaG9zdF9idWYgIT0gTlVMTAorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB1MzIgZGV2X2JyZF93cml0ZV9meG4odm9pZCAqYXJiLAorCQkJICAgICB1MzIgZHNwX2FkZCwKKwkJCSAgICAgdm9pZCAqaG9zdF9idWYsIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fc3BhY2UpOworCisvKgorICogID09PT09PT09IGRldl9jcmVhdGVfZGV2aWNlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2FsbGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGxvYWQgdGhlIEJyaWRnZSBEcml2ZXIgZm9yIGEKKyAqICAgICAgJ0JyaWRnZSBkZXZpY2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlX29iajogICAgIFB0ciB0byBsb2NhdGlvbiB0byByZWNlaXZlIHRoZSBkZXZpY2Ugb2JqZWN0IGhhbmRsZS4KKyAqICAgICAgZHJpdmVyX2ZpbGVfbmFtZTogTmFtZSBvZiBCcmlkZ2UgZHJpdmVyIFBFIERMTCBmaWxlIHRvIGxvYWQuICBJZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlIHBhdGggaXMgbm90IHByb3ZpZGVkLCB0aGUgZmlsZSBpcyBsb2FkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggJ0JyaWRnZSdzIG1vZHVsZSBzZWFyY2ggcGF0aC4KKyAqICAgICAgaG9zdF9jb25maWc6ICAgIEhvc3QgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiwgdG8gYmUgcGFzc2VkIGRvd24KKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBCcmlkZ2UgZHJpdmVyIHdoZW4gYnJpZGdlX2Rldl9jcmVhdGUoKSBpcyBjYWxsZWQuCisgKiAgICAgIHBEc3BDb25maWc6ICAgICBEU1AgcmVzb3VyY2VzLCB0byBiZSBwYXNzZWQgZG93biB0byB0aGUgQnJpZGdlIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBicmlkZ2VfZGV2X2NyZWF0ZSgpIGlzIGNhbGxlZC4KKyAqICAgICAgZGV2X25vZGVfb2JqOiAgICAgICBQbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2Ugbm9kZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIE1vZHVsZSBpcyBsb2FkZWQsIGRldmljZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICogICAgICAtRU5PTUVNOiAgICAgICAgSW5zdWZmaWNpZW50IG1lbW9yeSB0byBjcmVhdGUgbmVlZGVkIHJlc291cmNlcy4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICAgICAgVW5hYmxlIHRvIGZpbmQgQnJpZGdlIGRyaXZlciBlbnRyeSBwb2ludCBmdW5jdGlvbi4KKyAqICAgICAgLUVTUElQRTogICBVbmFibGUgdG8gbG9hZCBaTCBETEwuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICAgICAgZGV2aWNlX29iaiAhPSBOVUxMLgorICogICAgICBkcml2ZXJfZmlsZV9uYW1lICE9IE5VTEwuCisgKiAgICAgIGhvc3RfY29uZmlnICE9IE5VTEwuCisgKiAgICAgIHBEc3BDb25maWcgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgKmRldmljZV9vYmogd2lsbCBjb250YWluIGhhbmRsZSB0byB0aGUgbmV3IGRldmljZSBvYmplY3QuCisgKiAgICAgIE90aGVyd2lzZSwgZG9lcyBub3QgY3JlYXRlIHRoZSBkZXZpY2Ugb2JqZWN0LCBlbnN1cmVzIHRoZSBCcmlkZ2UgZHJpdmVyCisgKiAgICAgIG1vZHVsZSBpcyB1bmxvYWRlZCwgYW5kIHNldHMgKmRldmljZV9vYmogdG8gTlVMTC4KKyAqLworZXh0ZXJuIGludCBkZXZfY3JlYXRlX2RldmljZShzdHJ1Y3QgZGV2X29iamVjdAorCQkJCSAgICAqKmRldmljZV9vYmosCisJCQkJICAgIGNvbnN0IGNoYXIgKmRyaXZlcl9maWxlX25hbWUsCisJCQkJICAgIHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBkZXZfY3JlYXRlX2l2YV9kZXZpY2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDYWxsZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gbG9hZCB0aGUgQnJpZGdlIERyaXZlciBmb3IgSVZBLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldmljZV9vYmo6ICAgICBQdHIgdG8gbG9jYXRpb24gdG8gcmVjZWl2ZSB0aGUgZGV2aWNlIG9iamVjdCBoYW5kbGUuCisgKiAgICAgIGRyaXZlcl9maWxlX25hbWU6IE5hbWUgb2YgQnJpZGdlIGRyaXZlciBQRSBETEwgZmlsZSB0byBsb2FkLiAgSWYgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSBwYXRoIGlzIG5vdCBwcm92aWRlZCwgdGhlIGZpbGUgaXMgbG9hZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoICdCcmlkZ2UncyBtb2R1bGUgc2VhcmNoIHBhdGguCisgKiAgICAgIGhvc3RfY29uZmlnOiAgICBIb3N0IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIHRvIGJlIHBhc3NlZCBkb3duCisgKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgQnJpZGdlIGRyaXZlciB3aGVuIGJyaWRnZV9kZXZfY3JlYXRlKCkgaXMgY2FsbGVkLgorICogICAgICBwRHNwQ29uZmlnOiAgICAgRFNQIHJlc291cmNlcywgdG8gYmUgcGFzc2VkIGRvd24gdG8gdGhlIEJyaWRnZSBkcml2ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYnJpZGdlX2Rldl9jcmVhdGUoKSBpcyBjYWxsZWQuCisgKiAgICAgIGRldl9ub2RlX29iajogICAgICAgUGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIG5vZGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBNb2R1bGUgaXMgbG9hZGVkLCBkZXZpY2Ugb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKKyAqICAgICAgLUVOT01FTTogICAgICAgIEluc3VmZmljaWVudCBtZW1vcnkgdG8gY3JlYXRlIG5lZWRlZCByZXNvdXJjZXMuCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgICAgIFVuYWJsZSB0byBmaW5kIEJyaWRnZSBkcml2ZXIgZW50cnkgcG9pbnQgZnVuY3Rpb24uCisgKiAgICAgIC1FU1BJUEU6ICAgVW5hYmxlIHRvIGxvYWQgWkwgRExMLgorICogIFJlcXVpcmVzOgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgICAgIGRldmljZV9vYmogIT0gTlVMTC4KKyAqICAgICAgZHJpdmVyX2ZpbGVfbmFtZSAhPSBOVUxMLgorICogICAgICBob3N0X2NvbmZpZyAhPSBOVUxMLgorICogICAgICBwRHNwQ29uZmlnICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICpkZXZpY2Vfb2JqIHdpbGwgY29udGFpbiBoYW5kbGUgdG8gdGhlIG5ldyBkZXZpY2Ugb2JqZWN0LgorICogICAgICBPdGhlcndpc2UsIGRvZXMgbm90IGNyZWF0ZSB0aGUgZGV2aWNlIG9iamVjdCwgZW5zdXJlcyB0aGUgQnJpZGdlIGRyaXZlcgorICogICAgICBtb2R1bGUgaXMgdW5sb2FkZWQsIGFuZCBzZXRzICpkZXZpY2Vfb2JqIHRvIE5VTEwuCisgKi8KK2V4dGVybiBpbnQgZGV2X2NyZWF0ZV9pdmFfZGV2aWNlKHN0cnVjdCBkZXZfb2JqZWN0CisJCQkJCSoqZGV2aWNlX29iaiwKKwkJCQkJY29uc3QgY2hhciAqZHJpdmVyX2ZpbGVfbmFtZSwKKwkJCQkJY29uc3Qgc3RydWN0IGNmZ19ob3N0cmVzCisJCQkJCSpob3N0X2NvbmZpZywKKwkJCQkJc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmopOworCisvKgorICogID09PT09PT09IGRldl9jcmVhdGUyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQWZ0ZXIgc3VjY2Vzc2Z1bCBsb2FkaW5nIG9mIHRoZSBpbWFnZSBmcm9tIGFwaV9pbml0X2NvbXBsZXRlMgorICogICAgICAoUFJPQyBBdXRvX1N0YXJ0KSBvciBwcm9jX2xvYWQgdGhpcyBmeG4gaXMgY2FsbGVkLiBUaGlzIGNyZWF0ZXMKKyAqICAgICAgdGhlIE5vZGUgTWFuYWdlciBhbmQgdXBkYXRlcyB0aGUgREVWIE9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzc2Z1bCBDcmVhdGlvbiBvZiBOb2RlIE1hbmFnZXIKKyAqICAgICAgLUVQRVJNOiAgU29tZSBFcnJvciBPY2N1cnJlZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgREVWIEluaXRpYWxpemVkCisgKiAgICAgIFZhbGlkIGhkZXZfb2JqCisgKiAgRW5zdXJlczoKKyAqICAgICAgMCBhbmQgaGRldl9vYmotPmhub2RlX21nciAhPSBOVUxMCisgKiAgICAgIGVsc2UgICAgaGRldl9vYmotPmhub2RlX21nciA9PSBOVUxMCisgKi8KK2V4dGVybiBpbnQgZGV2X2NyZWF0ZTIoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBkZXZfZGVzdHJveTIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZXN0cm95cyB0aGUgTm9kZSBtYW5hZ2VyIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzc2Z1bCBDcmVhdGlvbiBvZiBOb2RlIE1hbmFnZXIKKyAqICAgICAgLUVQRVJNOiAgU29tZSBFcnJvciBPY2N1cnJlZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgREVWIEluaXRpYWxpemVkCisgKiAgICAgIFZhbGlkIGhkZXZfb2JqCisgKiAgRW5zdXJlczoKKyAqICAgICAgMCBhbmQgaGRldl9vYmotPmhub2RlX21nciA9PSBOVUxMCisgKiAgICAgIGVsc2UgICAgLUVQRVJNLgorICovCitleHRlcm4gaW50IGRldl9kZXN0cm95MihzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmopOworCisvKgorICogID09PT09PT09IGRldl9kZXN0cm95X2RldmljZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlc3Ryb3lzIHRoZSBjaGFubmVsIG1hbmFnZXIgZm9yIHRoaXMgZGV2aWNlLCBpZiBhbnksIGNhbGxzCisgKiAgICAgIGJyaWRnZV9kZXZfZGVzdHJveSgpLCBhbmQgdGhlbiBhdHRlbXB0cyB0byB1bmxvYWQgdGhlIEJyaWRnZSBtb2R1bGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gZGV2aWNlIG9iamVjdCBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgICAgIC1FUEVSTTogICAgIFRoZSBCcmlkZ2UgZHJpdmVyIGZhaWxlZCBpdCdzIGJyaWRnZV9kZXZfZGVzdHJveSgpIGZ1bmN0aW9uLgorICogIFJlcXVpcmVzOgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBkZXZfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGRldl9vYmplY3QKKwkJCQkgICAgICpoZGV2X29iaik7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9jaG5sX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBoYW5kbGUgdG8gdGhlIGNoYW5uZWwgbWFuYWdlciBjcmVhdGVkIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBkZXZpY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgZGV2X2NyZWF0ZV9kZXZpY2UoKS4KKyAqICAgICAgKm1ncjogICAgICAgICAgIFB0ciB0byBsb2NhdGlvbiB0byBzdG9yZSBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG1nciAhPSBOVUxMLgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgICptZ3IgY29udGFpbnMgYSBoYW5kbGUgdG8gYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0LAorICogICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTC4KKyAqICAgICAgZWxzZTogICAgICAgICAgICptZ3IgaXMgTlVMTC4KKyAqLworZXh0ZXJuIGludCBkZXZfZ2V0X2NobmxfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQkgICBzdHJ1Y3QgY2hubF9tZ3IgKiptZ3IpOworCisvKgorICogID09PT09PT09IGRldl9nZXRfY21tX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBoYW5kbGUgdG8gdGhlIHNoYXJlZCBtZW1vcnkgbWFuYWdlciBjcmVhdGVkIGZvciB0aGlzCisgKiAgICAgIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBkZXZpY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgZGV2X2NyZWF0ZV9kZXZpY2UoKS4KKyAqICAgICAgKm1ncjogICAgICAgICAgIFB0ciB0byBsb2NhdGlvbiB0byBzdG9yZSBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG1nciAhPSBOVUxMLgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgICptZ3IgY29udGFpbnMgYSBoYW5kbGUgdG8gYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0LAorICogICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTC4KKyAqICAgICAgZWxzZTogICAgICAgICAgICptZ3IgaXMgTlVMTC4KKyAqLworZXh0ZXJuIGludCBkZXZfZ2V0X2NtbV9tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSAgc3RydWN0IGNtbV9vYmplY3QgKiptZ3IpOworCisvKgorICogID09PT09PT09IGRldl9nZXRfZG1tX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBoYW5kbGUgdG8gdGhlIGR5bmFtaWMgbWVtb3J5IG1hbmFnZXIgY3JlYXRlZCBmb3IgdGhpcworICogICAgICBkZXZpY2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gZGV2aWNlIG9iamVjdCBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgICAgICptZ3I6ICAgICAgICAgICBQdHIgdG8gbG9jYXRpb24gdG8gc3RvcmUgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGhkZXZfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBtZ3IgIT0gTlVMTC4KKyAqICAgICAgREVWIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqbWdyIGNvbnRhaW5zIGEgaGFuZGxlIHRvIGEgY2hhbm5lbCBtYW5hZ2VyIG9iamVjdCwKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwuCisgKiAgICAgIGVsc2U6ICAgICAgICAgICAqbWdyIGlzIE5VTEwuCisgKi8KK2V4dGVybiBpbnQgZGV2X2dldF9kbW1fbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQkgIHN0cnVjdCBkbW1fb2JqZWN0ICoqbWdyKTsKKworLyoKKyAqICA9PT09PT09PSBkZXZfZ2V0X2NvZF9tZ3IgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgQ09EIG1hbmFnZXIgY3JlYXRlIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBkZXZpY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgZGV2X2NyZWF0ZV9kZXZpY2UoKS4KKyAqICAgICAgKmNvZF9tZ3I6ICAgICAgIFB0ciB0byBsb2NhdGlvbiB0byBzdG9yZSBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGNvZF9tZ3IgIT0gTlVMTC4KKyAqICAgICAgREVWIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqY29kX21nciBjb250YWlucyBhIGhhbmRsZSB0byBhIENPRCBtYW5hZ2VyIG9iamVjdC4KKyAqICAgICAgZWxzZTogICAgICAgICAgICpjb2RfbWdyIGlzIE5VTEwuCisgKi8KK2V4dGVybiBpbnQgZGV2X2dldF9jb2RfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQkgIHN0cnVjdCBjb2RfbWFuYWdlciAqKmNvZF9tZ3IpOworCisvKgorICogID09PT09PT09IGRldl9nZXRfZGVoX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBERUggbWFuYWdlciBjcmVhdGVkIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgICAgICpkZWhfbWFuYWdlcjogIFB0ciB0byBsb2NhdGlvbiB0byBzdG9yZSBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICBJbnZhbGlkIGhkZXZfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBkZWhfbWFuYWdlciAhPSBOVUxMLgorICogICAgICBERUggSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgKmRlaF9tYW5hZ2VyIGNvbnRhaW5zIGEgaGFuZGxlIHRvIGEgREVIIG1hbmFnZXIgb2JqZWN0LgorICogICAgICBlbHNlOiAgICAgICAqZGVoX21hbmFnZXIgaXMgTlVMTC4KKyAqLworZXh0ZXJuIGludCBkZXZfZ2V0X2RlaF9tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSAgc3RydWN0IGRlaF9tZ3IgKipkZWhfbWFuYWdlcik7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9kZXZfbm9kZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgSUQgZm9yIHRoaXMgZGV2aWNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZXZfb2JqOiAgICAgSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICBkZXZfY3JlYXRlX2RldmljZSgpLgorICogICAgICBkZXZfbmRlOiAgICAgICAgUHRyIHRvIGxvY2F0aW9uIHRvIGdldCB0aGUgZGV2aWNlIG5vZGUgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBSZXR1cm5zIGEgREVWTk9ERSBpbiAqZGV2X25vZGVfb2JqLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGhkZXZfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfbmRlICE9IE5VTEwuCisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKmRldl9uZGUgY29udGFpbnMgYSBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgSUQ7CisgKiAgICAgIGVsc2U6ICAgICAgICAgICAqZGV2X25kZSBpcyBOVUxMLgorICovCitleHRlcm4gaW50IGRldl9nZXRfZGV2X25vZGUoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSAgIHN0cnVjdCBjZmdfZGV2bm9kZSAqKmRldl9uZGUpOworCisvKgorICogID09PT09PT09IGRldl9nZXRfZGV2X3R5cGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIElEIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBkZXZpY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgZGV2X2NyZWF0ZV9kZXZpY2UoKS4KKyAqICAgICAgZGV2X25kZTogICAgICAgIFB0ciB0byBsb2NhdGlvbiB0byBnZXQgdGhlIGRldmljZSBub2RlIGhhbmRsZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2VzcworICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGhkZXZfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfbmRlICE9IE5VTEwuCisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKmRldl9uZGUgY29udGFpbnMgYSBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgSUQ7CisgKiAgICAgIGVsc2U6ICAgICAgICAgICAqZGV2X25kZSBpcyBOVUxMLgorICovCitleHRlcm4gaW50IGRldl9nZXRfZGV2X3R5cGUoc3RydWN0IGRldl9vYmplY3QgKmRldmljZV9vYmosCisJCQkJCXU4ICpkZXZfdHlwZSk7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9maXJzdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBmaXJzdCBEZXZpY2UgT2JqZWN0IGhhbmRsZSBmcm9tIGFuIGludGVybmFsIGxpbmtlZCBsaXN0IG9mCisgKiAgICAgIG9mIERFVl9PQkpFQ1RzIG1haW50YWluZWQgYnkgREVWLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICAgICAgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZGV2aWNlIG9iamVjdHMgc3RvcmVkOyBlbHNlCisgKiAgICAgIGEgdmFsaWQgREVWX0hPQkpFQ1QuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIE5vIGNhbGxzIHRvIGRldl9jcmVhdGVfZGV2aWNlIG9yIGRldl9kZXN0cm95X2RldmljZSAod2hpY2ggbXkgbW9kaWZ5IHRoZQorICogICAgICBpbnRlcm5hbCBkZXZpY2Ugb2JqZWN0IGxpc3QpIG1heSBvY2N1ciBiZXR3ZWVuIGNhbGxzIHRvIGRldl9nZXRfZmlyc3QKKyAqICAgICAgYW5kIGRldl9nZXRfbmV4dC4KKyAqICBFbnN1cmVzOgorICogICAgICBUaGUgREVWX0hPQkpFQ1QgcmV0dXJuZWQgaXMgdmFsaWQuCisgKiAgICAgIEEgc3Vic2VxdWVudCBjYWxsIHRvIGRldl9nZXRfbmV4dCB3aWxsIHJldHVybiB0aGUgbmV4dCBkZXZpY2Ugb2JqZWN0IGluCisgKiAgICAgIHRoZSBsaXN0LgorICovCitleHRlcm4gc3RydWN0IGRldl9vYmplY3QgKmRldl9nZXRfZmlyc3Qodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9pbnRmX2Z4bnMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgQnJpZGdlIGRyaXZlciBpbnRlcmZhY2UgZnVuY3Rpb24gc3RydWN0dXJlIGZvciB0aGUKKyAqICAgICAgbG9hZGVkIEJyaWRnZSBkcml2ZXIuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gZGV2aWNlIG9iamVjdCBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgICAgICppZl9meG5zOiAgICAgICBQdHIgdG8gbG9jYXRpb24gdG8gc3RvcmUgZnhuIGludGVyZmFjZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgSW52YWxpZCBoZGV2X29iai4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgaWZfZnhucyAhPSBOVUxMLgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgICppZl9meG5zIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgQnJpZGdlCisgKiAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgaW50ZXJmYWNlOworICogICAgICBlbHNlOiAgICAgICAgICAgKmlmX2Z4bnMgaXMgTlVMTC4KKyAqLworZXh0ZXJuIGludCBkZXZfZ2V0X2ludGZfZnhucyhzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkgICAgc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICoqaWZfZnhucyk7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9pb19tZ3IgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgaGFuZGxlIHRvIHRoZSBJTyBtYW5hZ2VyIGNyZWF0ZWQgZm9yIHRoaXMgZGV2aWNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZXZfb2JqOiAgICAgSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICBkZXZfY3JlYXRlX2RldmljZSgpLgorICogICAgICAqbWdyOiAgICAgICAgICAgUHRyIHRvIGxvY2F0aW9uIHRvIHN0b3JlIGhhbmRsZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgSW52YWxpZCBoZGV2X29iai4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgbWdyICE9IE5VTEwuCisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKm1nciBjb250YWlucyBhIGhhbmRsZSB0byBhbiBJTyBtYW5hZ2VyIG9iamVjdC4KKyAqICAgICAgZWxzZTogICAgICAgICAgICptZ3IgaXMgTlVMTC4KKyAqLworZXh0ZXJuIGludCBkZXZfZ2V0X2lvX21ncihzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkJIHN0cnVjdCBpb19tZ3IgKiptZ3IpOworCisvKgorICogID09PT09PT09IGRldl9nZXRfbmV4dCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBuZXh0IERldmljZSBPYmplY3QgaGFuZGxlIGZyb20gYW4gaW50ZXJuYWwgbGlua2VkIGxpc3Qgb2YKKyAqICAgICAgb2YgREVWX09CSkVDVHMgbWFpbnRhaW5lZCBieSBERVYsIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IGNhbGxlZAorICogICAgICBkZXZfZ2V0X2ZpcnN0KCkgYW5kIHplcm8gb3IgbW9yZSBkZXZfZ2V0X25leHQKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogSGFuZGxlIHRvIHRoZSBkZXZpY2Ugb2JqZWN0IHJldHVybmVkIGZyb20gYSBwcmV2aW91cworICogICAgICAgICAgICAgICAgICBjYWxsIHRvIGRldl9nZXRfZmlyc3QoKSBvciBkZXZfZ2V0X25leHQoKS4KKyAqICBSZXR1cm5zOgorICogICAgICBOVUxMIGlmIHRoZXJlIGFyZSBubyBmdXJ0aGVyIGRldmljZSBvYmplY3RzIG9uIHRoZSBsaXN0IG9yIGhkZXZfb2JqCisgKiAgICAgIHdhcyBpbnZhbGlkOworICogICAgICBlbHNlIHRoZSBuZXh0IHZhbGlkIERFVl9IT0JKRUNUIGluIHRoZSBsaXN0LgorICogIFJlcXVpcmVzOgorICogICAgICBObyBjYWxscyB0byBkZXZfY3JlYXRlX2RldmljZSBvciBkZXZfZGVzdHJveV9kZXZpY2UgKHdoaWNoIG15IG1vZGlmeSB0aGUKKyAqICAgICAgaW50ZXJuYWwgZGV2aWNlIG9iamVjdCBsaXN0KSBtYXkgb2NjdXIgYmV0d2VlbiBjYWxscyB0byBkZXZfZ2V0X2ZpcnN0CisgKiAgICAgIGFuZCBkZXZfZ2V0X25leHQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgVGhlIERFVl9IT0JKRUNUIHJldHVybmVkIGlzIHZhbGlkLgorICogICAgICBBIHN1YnNlcXVlbnQgY2FsbCB0byBkZXZfZ2V0X25leHQgd2lsbCByZXR1cm4gdGhlIG5leHQgZGV2aWNlIG9iamVjdCBpbgorICogICAgICB0aGUgbGlzdC4KKyAqLworZXh0ZXJuIHN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfZ2V0X25leHQoc3RydWN0IGRldl9vYmplY3QKKwkJCQkgICAgICAgKmhkZXZfb2JqKTsKKworLyoKKyAqICA9PT09PT09PT0gZGV2X2dldF9tc2dfbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIG1zZ19jdHJsIE1hbmFnZXIgSGFuZGxlIGZyb20gdGhlIERldk9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogSGFuZGxlIHRvIHRoZSBEZXYgT2JqZWN0CisgKiAgICAgIG1zZ19tYW46ICAgIExvY2F0aW9uIHdoZXJlIG1zZ19jdHJsIE1hbmFnZXIgaGFuZGxlIHdpbGwgYmUgcmV0dXJuZWQuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgREVWIEluaXRpYWxpemVkLgorICogICAgICBWYWxpZCBoZGV2X29iai4KKyAqICAgICAgbm9kZV9tYW4gIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBkZXZfZ2V0X21zZ19tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgIHN0cnVjdCBtc2dfbWdyICoqbXNnX21hbik7CisKKy8qCisgKiAgPT09PT09PT09IGRldl9nZXRfbm9kZV9tYW5hZ2VyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIE5vZGUgTWFuYWdlciBIYW5kbGUgZnJvbSB0aGUgRGV2T2JqZWN0LiBJdCBpcyBhbgorICogICAgICBhY2Nlc3NvciBmdW5jdGlvbgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZXZfb2JqOiAgICAgSGFuZGxlIHRvIHRoZSBEZXYgT2JqZWN0CisgKiAgICAgIG5vZGVfbWFuOiAgICAgICBMb2NhdGlvbiB3aGVyZSBIYW5kbGUgdG8gdGhlIE5vZGUgTWFuYWdlciB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZC4uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MKKyAqICAgICAgLUVGQVVMVDogICAgSW52YWxpZCBEZXYgT2JqZWN0IGhhbmRsZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgREVWIEluaXRpYWxpemVkLgorICogICAgICBub2RlX21hbiBpcyBub3QgbnVsbAorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqbm9kZV9tYW4gY29udGFpbnMgYSBoYW5kbGUgdG8gYSBOb2RlIG1hbmFnZXIgb2JqZWN0LgorICogICAgICBlbHNlOiAgICAgICAgICAgKm5vZGVfbWFuIGlzIE5VTEwuCisgKi8KK2V4dGVybiBpbnQgZGV2X2dldF9ub2RlX21hbmFnZXIoc3RydWN0IGRldl9vYmplY3QKKwkJCQkgICAgICAgKmhkZXZfb2JqLAorCQkJCSAgICAgICBzdHJ1Y3Qgbm9kZV9tZ3IgKipub2RlX21hbik7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9zeW1ib2wgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGluIHRoZSBjdXJyZW50bHkgbG9hZGVkIHByb2dyYW0uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gZGV2aWNlIG9iamVjdCBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgICAgIHN0cl9zeW06ICAgICAgICBOYW1lIG9mIHN5bWJvbCB0byBsb29rIHVwLgorICogICAgICBwdWxfdmFsdWU6ICAgICAgIFB0ciB0byBzeW1ib2wgdmFsdWUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgICAgIC1FU1BJUEU6IFN5bWJvbHMgY291bGRuIG5vdCBiZSBmb3VuZCBvciBoYXZlIG5vdCBiZWVuIGxvYWRlZCBvbnRvCisgKiAgICAgICAgICAgICAgIHRoZSBib2FyZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgc3RyX3N5bSAhPSBOVUxMLgorICogICAgICBwdWxfdmFsdWUgIT0gTlVMTC4KKyAqICAgICAgREVWIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqcHVsX3ZhbHVlIGNvbnRhaW5zIHRoZSBzeW1ib2wgdmFsdWU7CisgKi8KK2V4dGVybiBpbnQgZGV2X2dldF9zeW1ib2woc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSBjb25zdCBjaGFyICpzdHJfc3ltLCB1MzIgKiBwdWxfdmFsdWUpOworCisvKgorICogID09PT09PT09IGRldl9nZXRfYnJpZGdlX2NvbnRleHQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgQnJpZGdlIENvbnRleHQgaGFuZGxlLCBhcyByZXR1cm5lZCBieSB0aGUKKyAqICAgICAgYnJpZGdlX2Rldl9jcmVhdGUgZnhuLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZXZfb2JqOiAgICAgSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoIGRldl9jcmVhdGVfZGV2aWNlKCkKKyAqICAgICAgKnBoYnJpZGdlX2NvbnRleHQ6ICBQdHIgdG8gbG9jYXRpb24gdG8gc3RvcmUgY29udGV4dCBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHBoYnJpZGdlX2NvbnRleHQgIT0gTlVMTC4KKyAqICAgICAgREVWIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqcGhicmlkZ2VfY29udGV4dCBjb250YWlucyBjb250ZXh0IGhhbmRsZTsKKyAqICAgICAgZWxzZTogICAgICAgICAgICpwaGJyaWRnZV9jb250ZXh0IGlzIE5VTEw7CisgKi8KK2V4dGVybiBpbnQgZGV2X2dldF9icmlkZ2VfY29udGV4dChzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkJICAgICAgc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCSAgICAgICoqcGhicmlkZ2VfY29udGV4dCk7CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50LCBhbmQgZnJlZSByZXNvdXJjZXMgd2hlbiByZWZlcmVuY2UgY291bnQgaXMKKyAqICAgICAgMC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERFViBpcyBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICBXaGVuIHJlZmVyZW5jZSBjb3VudCA9PSAwLCBERVYncyBwcml2YXRlIHJlc291cmNlcyBhcmUgZnJlZWQuCisgKi8KK2V4dGVybiB2b2lkIGRldl9leGl0KHZvaWQpOworCisvKgorICogID09PT09PT09IGRldl9pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSBERVYncyBwcml2YXRlIHN0YXRlLCBrZWVwaW5nIGEgcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggY2FsbC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgaW5pdGlhbGl6ZWQ7IEZBTFNFIGlmIGVycm9yIG9jY3VyZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgVFJVRTogQSByZXF1aXJlbWVudCBmb3IgdGhlIG90aGVyIHB1YmxpYyBERVYgZnVuY3Rpb25zLgorICovCitleHRlcm4gYm9vbCBkZXZfaW5pdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBkZXZfaXNfbG9ja2VkID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUHJlZGljYXRlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuCisgKiAgICAgIGxvY2tlZCBieSBhIGNsaWVudCBmb3IgZXhjbHVzaXZlIGFjY2Vzcy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBkZXZpY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgZGV2X2NyZWF0ZV9kZXZpY2UoKS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgVFJVRTogZGV2aWNlIGhhcyBiZWVuIGxvY2tlZC4KKyAqICAgICAgMDogICAgIEZBTFNFOiBkZXZpY2Ugbm90IGxvY2tlZC4KKyAqICAgICAgLUVGQVVMVDogICAgaGRldl9vYmogd2FzIGludmFsaWQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRldl9pc19sb2NrZWQoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBkZXZfaW5zZXJ0X3Byb2Nfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5zZXJ0cyB0aGUgUHJvY2Vzc29yIE9iamVjdCBpbnRvIHRoZSBMaXN0IG9mIFBST0MgT2JqZWN0cworICogICAgICBrZXB0IGluIHRoZSBERVYgT2JqZWN0CisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgcHJvY19vYmo6ICAgIEhhbmRsZSB0byB0aGUgUHJvYyBPYmplY3QKKyAqICAgICAgaGRldl9vYmogICAgICBIYW5kbGUgdG8gdGhlIERldiBPYmplY3QKKyAqICAgICAgYkF0dGFjaGVkTmV3ICAgIFNwZWNpZmllcyBpZiB0aGVyZSBhcmUgYWxyZWFkeSBwcm9jZXNzb3JzIGF0dGFjaGVkCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3NmdWxseSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHByb2Nfb2JqIGlzIG5vdCBOVUxMCisgKiAgICAgIGhkZXZfb2JqIGlzIGEgdmFsaWQgaGFuZGxlIHRvIHRoZSBERVYuCisgKiAgICAgIERFViBJbml0aWFsaXplZC4KKyAqICAgICAgTGlzdChvZiBQcm9jIG9iamVjdCBpbiBEZXYpIEV4aXN0cy4KKyAqICBFbnN1cmVzOgorICogICAgICAwICYgdGhlIFBST0MgT2JqZWN0IGlzIGluc2VydGVkIGFuZCB0aGUgbGlzdCBpcyBub3QgZW1wdHkKKyAqICBEZXRhaWxzOgorICogICAgICBJZiB0aGUgTGlzdCBvZiBQcm9jIE9iamVjdCBpcyBlbXB0eSBiQXR0YWNoZWROZXcgaXMgVFJVRSwgaXQgaW5kaWNhdGVkCisgKiAgICAgIHRoaXMgaXMgdGhlIGZpcnN0IFByb2Nlc3NvciBhdHRhY2hpbmcuCisgKiAgICAgIElmIGl0IGlzIEZhbHNlLCB0aGVyZSBhcmUgYWxyZWFkeSBwcm9jZXNzb3JzIGF0dGFjaGVkLgorICovCitleHRlcm4gaW50IGRldl9pbnNlcnRfcHJvY19vYmplY3Qoc3RydWN0IGRldl9vYmplY3QKKwkJCQkJICpoZGV2X29iaiwKKwkJCQkJIHUzMiBwcm9jX29iaiwKKwkJCQkJIGJvb2wgKmFscmVhZHlfYXR0YWNoZWQpOworCisvKgorICogID09PT09PT09IGRldl9yZW1vdmVfcHJvY19vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZWFyY2ggZm9yIGFuZCByZW1vdmUgYSBQcm9jIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBsaXN0IG1haW50YWluZWQKKyAqICAgICAgYnkgdGhlIERFVgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHBfcHJvY19vYmplY3Q6ICAgICAgICBQdHIgdG8gUHJvY09iamVjdCB0byBpbnNlcnQuCisgKiAgICAgIGRldl9vYmo6ICAgICAgICAgUHRyIHRvIERldiBPYmplY3Qgd2hlcmUgdGhlIGxpc3QgaXMuCisgKiAgICAgIGFscmVhZHlfYXR0YWNoZWQ6ICBQdHIgdG8gcmV0dXJuIHRoZSBib29sCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBJZiBzdWNjZXNzZnVsLgorICogICAgICAtRVBFUk0gICAgICAgICAgIEZhaWx1cmUgdG8gUmVtb3ZlIHRoZSBQUk9DIE9iamVjdCBmcm9tIHRoZSBsaXN0CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERldk9iamVjdCBpcyBWYWxpZAorICogICAgICBwcm9jX29iaiAhPSAwCisgKiAgICAgIGRldl9vYmotPnByb2NfbGlzdCAhPSBOVUxMCisgKiAgICAgICFMU1RfSVNfRU1QVFkoZGV2X29iai0+cHJvY19saXN0KQorICogICAgICBhbHJlYWR5X2F0dGFjaGVkICE9TlVMTAorICogIEVuc3VyZXM6CisgKiAgRGV0YWlsczoKKyAqICAgICAgTGlzdCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgREVWIGlzIGRlc3Ryb3llZC4KKyAqCisgKi8KK2V4dGVybiBpbnQgZGV2X3JlbW92ZV9wcm9jX29iamVjdChzdHJ1Y3QgZGV2X29iamVjdAorCQkJCQkgKmhkZXZfb2JqLCB1MzIgcHJvY19vYmopOworCisvKgorICogID09PT09PT09IGRldl9ub3RpZnlfY2xpZW50cyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIE5vdGlmeSBhbGwgY2xpZW50cyBvZiB0aGlzIGRldmljZSBvZiBhIGNoYW5nZSBpbiBkZXZpY2Ugc3RhdHVzLgorICogICAgICBDbGllbnRzIG1heSBpbmNsdWRlIG11bHRpcGxlIHVzZXJzIG9mIEJSRCwgYXMgd2VsbCBhcyBDSE5MLgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGFzeWNocm9ub3VzLCBhbmQgbWF5IGJlIGNhbGxlZCBieSBhIHRpbWVyIGV2ZW50CisgKiAgICAgIHNldCB1cCBieSBhIHdhdGNoZG9nIHRpbWVyLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZXZfb2JqOiAgSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgICAgIHJldDogICAgICAgICBBIHN0YXR1cyB3b3JkLCBtb3N0IGxpa2VseSBhIEJSRF9TVEFUVVMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgIEFsbCByZWdpc3RlcmVkIGNsaWVudHMgd2VyZSBhc3luY2hyb25vdXNseSBub3RpZmllZC4KKyAqICAgICAgLUVJTlZBTDogICBJbnZhbGlkIGhkZXZfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogTm90aWZpY2F0aW9ucyBhcmUgcXVldWVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGJlCisgKiAgICAgIGRlbGl2ZXJlZCB0byBjbGllbnRzLiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBlbnN1cmUgdGhhdAorICogICAgICB0aGUgbm90aWZpY2F0aW9ucyB3aWxsIGV2ZXIgYmUgZGVsaXZlcmVkLgorICovCitleHRlcm4gaW50IGRldl9ub3RpZnlfY2xpZW50cyhzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosIHUzMiByZXQpOworCisvKgorICogID09PT09PT09IGRldl9yZW1vdmVfZGV2aWNlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVzdHJveXMgdGhlIERldmljZSBPYmplY3QgY3JlYXRlZCBieSBkZXZfc3RhcnRfZGV2aWNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9ub2RlX29iajogICAgICAgRGV2aWNlIG5vZGUgYXMgaXQgaXMga25vdyB0byBPUy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgSWYgc3VjY2VzczsKKyAqICAgICAgPGVycm9yIGNvZGU+ICAgIE90aGVyd2lzZS4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRldl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBkZXZfc2V0X2NobmxfbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU2V0IHRoZSBjaGFubmVsIG1hbmFnZXIgZm9yIHRoaXMgZGV2aWNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZXZfb2JqOiAgICAgSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICBkZXZfY3JlYXRlX2RldmljZSgpLgorICogICAgICBobWdyOiAgICAgICAgICAgSGFuZGxlIHRvIGEgY2hhbm5lbCBtYW5hZ2VyLCBvciBOVUxMLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGhkZXZfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBkZXZfc2V0X2NobmxfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQkgICBzdHJ1Y3QgY2hubF9tZ3IgKmhtZ3IpOworCisvKgorICogID09PT09PT09IGRldl9zZXRfbXNnX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNldCB0aGUgTWVzc2FnZSBtYW5hZ2VyIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoZGV2X29iajogSGFuZGxlIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoIGRldl9jcmVhdGVfZGV2aWNlKCkuCisgKiAgICAgIGhtZ3I6ICAgICAgIEhhbmRsZSB0byBhIG1lc3NhZ2UgbWFuYWdlciwgb3IgTlVMTC4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBERVYgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgZGV2X3NldF9tc2dfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwgc3RydWN0IG1zZ19tZ3IgKmhtZ3IpOworCisvKgorICogID09PT09PT09IGRldl9zdGFydF9kZXZpY2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplcyB0aGUgbmV3IGRldmljZSB3aXRoIGJyaWRnZSBlbnZpcm9ubWVudC4gIFRoaXMgaW52b2x2ZXMKKyAqICAgICAgcXVlcnlpbmcgQ00gZm9yIGFsbG9jYXRlZCByZXNvdXJjZXMsIHF1ZXJ5aW5nIHRoZSByZWdpc3RyeSBmb3IKKyAqICAgICAgbmVjZXNzYXJ5IGRzcCByZXNvdXJjZXMgKHJlcXVlc3RlZCBpbiB0aGUgSU5GIGZpbGUpLCBhbmQgdXNpbmcgdGhpcworICogICAgICBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYSBicmlkZ2UgZGV2aWNlIG9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfbm9kZV9vYmo6ICAgICAgIERldmljZSBub2RlIGFzIGl0IGlzIGtub3cgdG8gT1MuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIElmIHN1Y2Nlc3M7CisgKiAgICAgIDxlcnJvciBjb2RlPiAgICBPdGhlcndpc2UuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERFViBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRldl9zdGFydF9kZXZpY2Uoc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmopOworCisjZW5kaWYgLyogREVWXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RldmRlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kZXZkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmOTI0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kZXZkZWZzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGRldmRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEZWZpbml0aW9uIG9mIGNvbW1vbiBpbmNsdWRlIHR5cGVkZWYgYmV0d2VlbiBkc3BkZWZzLmggYW5kIGRldi5oLiBSZXF1aXJlZAorICogdG8gYnJlYWsgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIEJyaWRnZSBkcml2ZXIgYW5kIERFViBpbmNsdWRlIGZpbGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIERFVkRFRlNfCisjZGVmaW5lIERFVkRFRlNfCisKKy8qIEJyaWRnZSBEZXZpY2UgT2JqZWN0ICovCitzdHJ1Y3QgZGV2X29iamVjdDsKKworI2VuZGlmIC8qIERFVkRFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGlzcC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Rpc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJmNzIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Rpc3AuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIGRpc3AuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgTm9kZSBEaXNwYXRjaGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRElTUF8KKyNkZWZpbmUgRElTUF8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZWRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZXByaXYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGlzcGRlZnMuaD4KKworLyoKKyAqICA9PT09PT09PSBkaXNwX2NyZWF0ZSA9PT09PT09PQorICogIENyZWF0ZSBhIE5PREUgRGlzcGF0Y2hlciBvYmplY3QuIFRoaXMgb2JqZWN0IGhhbmRsZXMgdGhlIGNyZWF0aW9uLAorICogIGRlbGV0aW9uLCBhbmQgZXhlY3V0aW9uIG9mIG5vZGVzIG9uIHRoZSBEU1AgdGFyZ2V0LCB0aHJvdWdoIGNvbW11bmljYXRpb24KKyAqICB3aXRoIHRoZSBSZXNvdXJjZSBNYW5hZ2VyIFNlcnZlciBydW5uaW5nIG9uIHRoZSB0YXJnZXQuIEVhY2ggTk9ERQorICogIE1hbmFnZXIgb2JqZWN0IHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIE5PREUgRGlzcGF0Y2hlci4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGlzcGF0Y2hfb2JqOiAgIExvY2F0aW9uIHRvIHN0b3JlIG5vZGUgZGlzcGF0Y2hlciBvYmplY3Qgb24gb3V0cHV0LgorICogICAgICBoZGV2X29iajogICAgIERldmljZSBmb3IgdGhpcyBwcm9jZXNzb3IuCisgKiAgICAgIGRpc3BfYXR0cnM6ICAgICBOb2RlIGRpc3BhdGNoZXIgYXR0cmlidXRlcy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzOworICogICAgICAtRU5PTUVNOiAgICAgICAgICAgIEluc3VmZmljaWVudCBtZW1vcnkgZm9yIHJlcXVlc3RlZCByZXNvdXJjZXMuCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgICAgIFVuYWJsZSB0byBjcmVhdGUgZGlzcGF0Y2hlci4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgZGlzcF9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgZGlzcF9hdHRycyAhPSBOVUxMLgorICogICAgICBoZGV2X29iaiAhPSBOVUxMLgorICogICAgICBkaXNwYXRjaF9vYmogIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgSVNfVkFMSUQoKmRpc3BhdGNoX29iaikuCisgKiAgICAgIGVycm9yOiAgICAgICAgICAqZGlzcGF0Y2hfb2JqID09IE5VTEwuCisgKi8KK2V4dGVybiBpbnQgZGlzcF9jcmVhdGUoc3RydWN0IGRpc3Bfb2JqZWN0ICoqZGlzcGF0Y2hfb2JqLAorCQkJICAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGRpc3BfYXR0ciAqZGlzcF9hdHRycyk7CisKKy8qCisgKiAgPT09PT09PT0gZGlzcF9kZWxldGUgPT09PT09PT0KKyAqICBEZWxldGUgdGhlIE5PREUgRGlzcGF0Y2hlci4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGlzcF9vYmo6ICBOb2RlIERpc3BhdGNoZXIgb2JqZWN0LgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGRpc3BfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIFZhbGlkIGRpc3Bfb2JqLgorICogIEVuc3VyZXM6CisgKiAgICAgIGRpc3Bfb2JqIGlzIGludmFsaWQuCisgKi8KK2V4dGVybiB2b2lkIGRpc3BfZGVsZXRlKHN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmopOworCisvKgorICogID09PT09PT09IGRpc3BfZXhpdCA9PT09PT09PQorICogIERpc2NvbnRpbnVlIHVzYWdlIG9mIERJU1AgbW9kdWxlLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGRpc3BfaW5pdCh2b2lkKSBwcmV2aW91c2x5IGNhbGxlZC4KKyAqICBFbnN1cmVzOgorICogICAgICBBbnkgcmVzb3VyY2VzIGFjcXVpcmVkIGluIGRpc3BfaW5pdCh2b2lkKSB3aWxsIGJlIGZyZWVkIHdoZW4gbGFzdCBESVNQCisgKiAgICAgIGNsaWVudCBjYWxscyBkaXNwX2V4aXQodm9pZCkuCisgKi8KK2V4dGVybiB2b2lkIGRpc3BfZXhpdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBkaXNwX2luaXQgPT09PT09PT0KKyAqICBJbml0aWFsaXplIHRoZSBESVNQIG1vZHVsZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgRkFMU0Ugb3RoZXJ3aXNlLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBib29sIGRpc3BfaW5pdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBkaXNwX25vZGVfY2hhbmdlX3ByaW9yaXR5ID09PT09PT09CisgKiAgQ2hhbmdlIHRoZSBwcmlvcml0eSBvZiBhIG5vZGUgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIHRhcmdldC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGlzcF9vYmo6ICAgICAgICAgICAgTm9kZSBEaXNwYXRjaGVyIG9iamVjdC4KKyAqICAgICAgaG5vZGU6ICAgICAgICAgICAgICAgICAgTm9kZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbm9kZSBjdXJyZW50bHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIG9yIHJ1bm5pbmcgb24gdGhlIERTUC4KKyAqICAgICAgdWxGeG5BZGRyZXNzOiAgICAgICAgICAgQWRkcmVzcyBvZiBSTVMgZnVuY3Rpb24gZm9yIGNoYW5naW5nIHByaW9yaXR5LgorICogICAgICBub2RlX2VudjogICAgICAgICAgICAgICAgQWRkcmVzcyBvZiBub2RlJ3MgZW52aXJvbm1lbnQgc3RydWN0dXJlLgorICogICAgICBwcmlvOiAgICAgICAgICAgICAgTmV3IHByaW9yaXR5IGxldmVsIHRvIHNldCBub2RlJ3MgcHJpb3JpdHkgdG8uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVUSU1FOiAgICAgICAgICAgQSB0aW1lb3V0IG9jY3VycmVkIGJlZm9yZSB0aGUgRFNQIHJlc3BvbmRlZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgZGlzcF9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgVmFsaWQgZGlzcF9vYmouCisgKiAgICAgIGhub2RlICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBkaXNwX25vZGVfY2hhbmdlX3ByaW9yaXR5KHN0cnVjdCBkaXNwX29iamVjdAorCQkJCQkgICAgKmRpc3Bfb2JqLAorCQkJCQkgICAgc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQkJICAgIHUzMiBybXNfZnhuLAorCQkJCQkgICAgbm9kZWVudiBub2RlX2VudiwgczMyIHByaW8pOworCisvKgorICogID09PT09PT09IGRpc3Bfbm9kZV9jcmVhdGUgPT09PT09PT0KKyAqICBDcmVhdGUgYSBub2RlIG9uIHRoZSBEU1AgYnkgcmVtb3RlbHkgY2FsbGluZyB0aGUgbm9kZSdzIGNyZWF0ZSBmdW5jdGlvbi4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGlzcF9vYmo6ICAgIE5vZGUgRGlzcGF0Y2hlciBvYmplY3QuCisgKiAgICAgIGhub2RlOiAgICAgICAgICBOb2RlIGhhbmRsZSBvYnRhaW5lZCBmcm9tIG5vZGVfYWxsb2NhdGUoKS4KKyAqICAgICAgdWxfZnhuX2FkZHI6ICAgICAgQWRkcmVzcyBvciBSTVMgY3JlYXRlIG5vZGUgZnVuY3Rpb24uCisgKiAgICAgIHVsX2NyZWF0ZV9meG46ICAgIEFkZHJlc3Mgb2Ygbm9kZSdzIGNyZWF0ZSBmdW5jdGlvbi4KKyAqICAgICAgcGFyZ3M6ICAgICAgICAgIEFyZ3VtZW50cyB0byBwYXNzIHRvIFJNUyBub2RlIGNyZWF0ZSBmdW5jdGlvbi4KKyAqICAgICAgbm9kZV9lbnY6ICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIG5vZGUgZW52aXJvbm1lbnQgcG9pbnRlciBvbgorICogICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVRJTUU6ICAgQSB0aW1lb3V0IG9jY3VycmVkIGJlZm9yZSB0aGUgRFNQIHJlc3BvbmRlZC4KKyAqICAgICAgLUVQRVJNOiAgICAgIEEgZmFpbHVyZSBvY2N1cnJlZCwgdW5hYmxlIHRvIGNyZWF0ZSBub2RlLgorICogIFJlcXVpcmVzOgorICogICAgICBkaXNwX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBWYWxpZCBkaXNwX29iai4KKyAqICAgICAgcGFyZ3MgIT0gTlVMTC4KKyAqICAgICAgaG5vZGUgIT0gTlVMTC4KKyAqICAgICAgbm9kZV9lbnYgIT0gTlVMTC4KKyAqICAgICAgbm9kZV9nZXRfdHlwZShobm9kZSkgIT0gTk9ERV9ERVZJQ0UuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBkaXNwX25vZGVfY3JlYXRlKHN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmosCisJCQkJICAgc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQkgICB1MzIgcm1zX2Z4biwKKwkJCQkgICB1MzIgdWxfY3JlYXRlX2Z4biwKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgbm9kZV9jcmVhdGVhcmdzCisJCQkJICAgKnBhcmdzLCBub2RlZW52ICpub2RlX2Vudik7CisKKy8qCisgKiAgPT09PT09PT0gZGlzcF9ub2RlX2RlbGV0ZSA9PT09PT09PQorICogIERlbGV0ZSBhIG5vZGUgb24gdGhlIERTUCBieSByZW1vdGVseSBjYWxsaW5nIHRoZSBub2RlJ3MgZGVsZXRlIGZ1bmN0aW9uLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkaXNwX29iajogICAgTm9kZSBEaXNwYXRjaGVyIG9iamVjdC4KKyAqICAgICAgaG5vZGU6ICAgICAgICAgIE5vZGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIG5vZGUgY3VycmVudGx5CisgKiAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgb24gdGhlIERTUC4KKyAqICAgICAgdWxfZnhuX2FkZHI6ICAgICAgQWRkcmVzcyBvciBSTVMgZGVsZXRlIG5vZGUgZnVuY3Rpb24uCisgKiAgICAgIHVsX2RlbGV0ZV9meG46ICAgIEFkZHJlc3Mgb2Ygbm9kZSdzIGRlbGV0ZSBmdW5jdGlvbi4KKyAqICAgICAgbm9kZV9lbnY6ICAgICAgICBBZGRyZXNzIG9mIG5vZGUncyBlbnZpcm9ubWVudCBzdHJ1Y3R1cmUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FVElNRTogICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBEU1AgcmVzcG9uZGVkLgorICogIFJlcXVpcmVzOgorICogICAgICBkaXNwX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBWYWxpZCBkaXNwX29iai4KKyAqICAgICAgaG5vZGUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRpc3Bfbm9kZV9kZWxldGUoc3RydWN0IGRpc3Bfb2JqZWN0ICpkaXNwX29iaiwKKwkJCQkgICBzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLAorCQkJCSAgIHUzMiBybXNfZnhuLAorCQkJCSAgIHUzMiB1bF9kZWxldGVfZnhuLCBub2RlZW52IG5vZGVfZW52KTsKKworLyoKKyAqICA9PT09PT09PSBkaXNwX25vZGVfcnVuID09PT09PT09CisgKiAgU3RhcnQgZXhlY3V0aW9uIG9mIGEgbm9kZSdzIGV4ZWN1dGUgcGhhc2UsIG9yIHJlc3VtZSBleGVjdXRpb24gb2YgYSBub2RlCisgKiAgdGhhdCBoYXMgYmVlbiBzdXNwZW5kZWQgKHZpYSBESVNQX05vZGVQYXVzZSgpKSBvbiB0aGUgRFNQLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkaXNwX29iajogICAgTm9kZSBEaXNwYXRjaGVyIG9iamVjdC4KKyAqICAgICAgaG5vZGU6ICAgICAgICAgIE5vZGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIG5vZGUgdG8gYmUgZXhlY3V0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBEU1AuCisgKiAgICAgIHVsX2Z4bl9hZGRyOiAgICAgIEFkZHJlc3Mgb3IgUk1TIG5vZGUgZXhlY3V0ZSBmdW5jdGlvbi4KKyAqICAgICAgdWxfZXhlY3V0ZV9meG46ICAgQWRkcmVzcyBvZiBub2RlJ3MgZXhlY3V0ZSBmdW5jdGlvbi4KKyAqICAgICAgbm9kZV9lbnY6ICAgICAgICBBZGRyZXNzIG9mIG5vZGUncyBlbnZpcm9ubWVudCBzdHJ1Y3R1cmUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FVElNRTogICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBEU1AgcmVzcG9uZGVkLgorICogIFJlcXVpcmVzOgorICogICAgICBkaXNwX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBWYWxpZCBkaXNwX29iai4KKyAqICAgICAgaG5vZGUgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGRpc3Bfbm9kZV9ydW4oc3RydWN0IGRpc3Bfb2JqZWN0ICpkaXNwX29iaiwKKwkJCQlzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLAorCQkJCXUzMiBybXNfZnhuLAorCQkJCXUzMiB1bF9leGVjdXRlX2Z4biwgbm9kZWVudiBub2RlX2Vudik7CisKKyNlbmRpZiAvKiBESVNQXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Rpc3BkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZGlzcGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDY1NTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Rpc3BkZWZzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGRpc3BkZWZzLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogR2xvYmFsIERJU1AgY29uc3RhbnRzIGFuZCB0eXBlcywgc2hhcmVkIGJ5IFBST0NFU1NPUiwgTk9ERSwgYW5kIERJU1AuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBESVNQREVGU18KKyNkZWZpbmUgRElTUERFRlNfCisKK3N0cnVjdCBkaXNwX29iamVjdDsKKworLyogTm9kZSBEaXNwYXRjaGVyIGF0dHJpYnV0ZXMgKi8KK3N0cnVjdCBkaXNwX2F0dHIgeworCXUzMiB1bF9jaG5sX29mZnNldDsJLyogT2Zmc2V0IG9mIGNoYW5uZWwgaWRzIHJlc2VydmVkIGZvciBSTVMgKi8KKwkvKiBTaXplIG9mIGJ1ZmZlciBmb3Igc2VuZGluZyBkYXRhIHRvIFJNUyAqLworCXUzMiB1bF9jaG5sX2J1Zl9zaXplOworCWludCBwcm9jX2ZhbWlseTsJLyogZWcsIDUwMDAgKi8KKwlpbnQgcHJvY190eXBlOwkJLyogZWcsIDU1MTAgKi8KKwl2b2lkICpyZXNlcnZlZDE7CS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworCXUzMiByZXNlcnZlZDI7CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKKyNlbmRpZiAvKiBESVNQREVGU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kbW0uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU4MzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RtbS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBkbW0uaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBUaGUgRHluYW1pYyBNZW1vcnkgTWFwcGluZyhETU0pIG1vZHVsZSBtYW5hZ2VzIHRoZSBEU1AgVmlydHVhbCBhZGRyZXNzCisgKiBzcGFjZSB0aGF0IGNhbiBiZSBkaXJlY3RseSBtYXBwZWQgdG8gYW55IE1QVSBidWZmZXIgb3IgbWVtb3J5IHJlZ2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIERNTV8KKyNkZWZpbmUgRE1NXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCitzdHJ1Y3QgZG1tX29iamVjdDsKKworLyogRE1NIGF0dHJpYnV0ZXMgdXNlZCBpbiBkbW1fY3JlYXRlKCkgKi8KK3N0cnVjdCBkbW1fbWdyYXR0cnMgeworCXUzMiByZXNlcnZlZDsKK307CisKKyNkZWZpbmUgRE1NUE9PTFNJWkUgICAgICAweDQwMDAwMDAKKworLyoKKyAqICA9PT09PT09PSBkbW1fZ2V0X2hhbmRsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybiB0aGUgZHluYW1pYyBtZW1vcnkgbWFuYWdlciBvYmplY3QgZm9yIHRoaXMgZGV2aWNlLgorICogICAgICBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgZnJvbSB0aGUgY2xpZW50IHByb2Nlc3MuCisgKi8KKworZXh0ZXJuIGludCBkbW1fZ2V0X2hhbmRsZSh2b2lkICpocHJvY2Vzc29yLAorCQkJCSBzdHJ1Y3QgZG1tX29iamVjdCAqKmRtbV9tYW5hZ2VyKTsKKworZXh0ZXJuIGludCBkbW1fcmVzZXJ2ZV9tZW1vcnkoc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3IsCisJCQkJICAgICB1MzIgc2l6ZSwgdTMyICpwcnN2X2FkZHIpOworCitleHRlcm4gaW50IGRtbV91bl9yZXNlcnZlX21lbW9yeShzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21nciwKKwkJCQkJdTMyIHJzdl9hZGRyKTsKKworZXh0ZXJuIGludCBkbW1fbWFwX21lbW9yeShzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21nciwgdTMyIGFkZHIsCisJCQkJIHUzMiBzaXplKTsKKworZXh0ZXJuIGludCBkbW1fdW5fbWFwX21lbW9yeShzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21nciwKKwkJCQkgICAgdTMyIGFkZHIsIHUzMiAqcHNpemUpOworCitleHRlcm4gaW50IGRtbV9kZXN0cm95KHN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fbWdyKTsKKworZXh0ZXJuIGludCBkbW1fZGVsZXRlX3RhYmxlcyhzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21ncik7CisKK2V4dGVybiBpbnQgZG1tX2NyZWF0ZShzdHJ1Y3QgZG1tX29iamVjdCAqKmRtbV9tYW5hZ2VyLAorCQkJICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkgICAgIGNvbnN0IHN0cnVjdCBkbW1fbWdyYXR0cnMgKm1ncl9hdHRydHMpOworCitleHRlcm4gYm9vbCBkbW1faW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgZG1tX2V4aXQodm9pZCk7CisKK2V4dGVybiBpbnQgZG1tX2NyZWF0ZV90YWJsZXMoc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3IsCisJCQkJICAgIHUzMiBhZGRyLCB1MzIgc2l6ZSk7CisKKyNpZmRlZiBEU1BfRE1NX0RFQlVHCit1MzIgZG1tX21lbV9tYXBfZHVtcChzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21ncik7CisjZW5kaWYKKworI2VuZGlmIC8qIERNTV8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY1MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2Rydi5oCkBAIC0wLDAgKzEsNTIxIEBACisvKgorICogZHJ2LmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRFJWIFJlc291cmNlIGFsbG9jYXRpb24gbW9kdWxlLiBEcml2ZXIgT2JqZWN0IGdldHMgQ3JlYXRlZAorICogYXQgdGhlIHRpbWUgb2YgTG9hZGluZy4gSXQgaG9sZHMgdGhlIExpc3Qgb2YgRGV2aWNlIE9iamVjdHMKKyAqIGluIHRoZSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBEUlZfCisjZGVmaW5lIERSVl8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2ZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjZGVmaW5lIERSVl9BU1NJR04gICAgIDEKKyNkZWZpbmUgRFJWX1JFTEVBU0UgICAgMAorCisvKiBQcm92aWRlIHRoZSBEU1AgSW50ZXJuYWwgbWVtb3J5IHdpbmRvd3MgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSBMMyBhZGRyZXNzCisgKiBzcGFjZSAqLworCisjZGVmaW5lIE9NQVBfR0VNX0JBU0UgICAweDEwN0Y4MDAwCisjZGVmaW5lIE9NQVBfRFNQX1NJWkUgICAweDAwNzIwMDAwCisKKy8qIE1FTTEgaXMgTDIgUkFNICsgTDIgQ2FjaGUgc3BhY2UgKi8KKyNkZWZpbmUgT01BUF9EU1BfTUVNMV9CQVNFIDB4NUM3RjgwMDAKKyNkZWZpbmUgT01BUF9EU1BfTUVNMV9TSVpFIDB4MTgwMDAKKyNkZWZpbmUgT01BUF9EU1BfR0VNMV9CQVNFIDB4MTA3RjgwMDAKKworLyogTUVNMiBpcyBMMVAgUkFNL0NBQ0hFIHNwYWNlICovCisjZGVmaW5lIE9NQVBfRFNQX01FTTJfQkFTRSAweDVDRTAwMDAwCisjZGVmaW5lIE9NQVBfRFNQX01FTTJfU0laRSAweDgwMDAKKyNkZWZpbmUgT01BUF9EU1BfR0VNMl9CQVNFIDB4MTBFMDAwMDAKKworLyogTUVNMyBpcyBMMUQgUkFNL0NBQ0hFIHNwYWNlICovCisjZGVmaW5lIE9NQVBfRFNQX01FTTNfQkFTRSAweDVDRjA0MDAwCisjZGVmaW5lIE9NQVBfRFNQX01FTTNfU0laRSAweDE0MDAwCisjZGVmaW5lIE9NQVBfRFNQX0dFTTNfQkFTRSAweDEwRjA0MDAwCisKKyNkZWZpbmUgT01BUF9JVkEyX1BSTV9CQVNFIDB4NDgzMDYwMDAKKyNkZWZpbmUgT01BUF9JVkEyX1BSTV9TSVpFIDB4MTAwMAorCisjZGVmaW5lIE9NQVBfSVZBMl9DTV9CQVNFIDB4NDgwMDQwMDAKKyNkZWZpbmUgT01BUF9JVkEyX0NNX1NJWkUgMHgxMDAwCisKKyNkZWZpbmUgT01BUF9QRVJfQ01fQkFTRSAweDQ4MDA1MDAwCisjZGVmaW5lIE9NQVBfUEVSX0NNX1NJWkUgMHgxMDAwCisKKyNkZWZpbmUgT01BUF9QRVJfUFJNX0JBU0UgMHg0ODMwNzAwMAorI2RlZmluZSBPTUFQX1BFUl9QUk1fU0laRSAweDEwMDAKKworI2RlZmluZSBPTUFQX0NPUkVfUFJNX0JBU0UgMHg0ODMwNkEwMAorI2RlZmluZSBPTUFQX0NPUkVfUFJNX1NJWkUgMHgxMDAwCisKKyNkZWZpbmUgT01BUF9TWVNDX0JBU0UgMHg0ODAwMjAwMAorI2RlZmluZSBPTUFQX1NZU0NfU0laRSAweDEwMDAKKworI2RlZmluZSBPTUFQX0RNTVVfQkFTRSAweDVEMDAwMDAwCisjZGVmaW5lIE9NQVBfRE1NVV9TSVpFIDB4MTAwMAorCisjZGVmaW5lIE9NQVBfUFJDTV9WREQxX0RPTUFJTiAxCisjZGVmaW5lIE9NQVBfUFJDTV9WREQyX0RPTUFJTiAyCisKKy8qIEdQUCBQUk9DRVNTIENMRUFOVVAgRGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qIE5ldyBzdHJ1Y3R1cmUgKG1lbWJlciBvZiBwcm9jZXNzIGNvbnRleHQpIGFic3RyYWN0cyBOT0RFIHJlc291cmNlIGluZm8gKi8KK3N0cnVjdCBub2RlX3Jlc19vYmplY3QgeworCXZvaWQgKmhub2RlOworCXMzMiBub2RlX2FsbG9jYXRlZDsJLyogTm9kZSBzdGF0dXMgKi8KKwlzMzIgaGVhcF9hbGxvY2F0ZWQ7CS8qIEhlYXAgc3RhdHVzICovCisJczMyIHN0cmVhbXNfYWxsb2NhdGVkOwkvKiBTdHJlYW1zIHN0YXR1cyAqLworCWludCBpZDsKK307CisKKy8qIHVzZWQgdG8gY2FjaGUgZG1hIG1hcHBpbmcgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBicmlkZ2VfZG1hX21hcF9pbmZvIHsKKwkvKiBkaXJlY3Rpb24gb2YgRE1BIGluIGFjdGlvbiwgb3IgRE1BX05PTkUgKi8KKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisJLyogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBieSB1cyAqLworCWludCBudW1fcGFnZXM7CisJLyogbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGZyb20gZG1hX21hcF9zZyAqLworCWludCBzZ19udW07CisJLyogbGlzdCBvZiBidWZmZXJzIHVzZWQgaW4gdGhpcyBETUEgYWN0aW9uICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKK307CisKKy8qIFVzZWQgZm9yIERNTSBtYXBwZWQgbWVtb3J5IGFjY291bnRpbmcgKi8KK3N0cnVjdCBkbW1fbWFwX29iamVjdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXUzMiBkc3BfYWRkcjsKKwl1MzIgbXB1X2FkZHI7CisJdTMyIHNpemU7CisJdTMyIG51bV91c3JfcGdzOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJc3RydWN0IGJyaWRnZV9kbWFfbWFwX2luZm8gZG1hX2luZm87Cit9OworCisvKiBVc2VkIGZvciBETU0gcmVzZXJ2ZWQgbWVtb3J5IGFjY291bnRpbmcgKi8KK3N0cnVjdCBkbW1fcnN2X29iamVjdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXUzMiBkc3BfcmVzZXJ2ZWRfYWRkcjsKK307CisKKy8qIE5ldyBzdHJ1Y3R1cmUgKG1lbWJlciBvZiBwcm9jZXNzIGNvbnRleHQpIGFic3RyYWN0cyBETU0gcmVzb3VyY2UgaW5mbyAqLworc3RydWN0IGRzcGhlYXBfcmVzX29iamVjdCB7CisJczMyIGhlYXBfYWxsb2NhdGVkOwkvKiBETU0gc3RhdHVzICovCisJdTMyIHVsX21wdV9hZGRyOworCXUzMiB1bF9kc3BfYWRkcjsKKwl1MzIgdWxfZHNwX3Jlc19hZGRyOworCXUzMiBoZWFwX3NpemU7CisJdm9pZCAqaHByb2Nlc3NvcjsKKwlzdHJ1Y3QgZHNwaGVhcF9yZXNfb2JqZWN0ICpuZXh0OworfTsKKworLyogTmV3IHN0cnVjdHVyZSAobWVtYmVyIG9mIHByb2Nlc3MgY29udGV4dCkgYWJzdHJhY3RzIHN0cmVhbSByZXNvdXJjZSBpbmZvICovCitzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0IHsKKwlzMzIgc3RyZWFtX2FsbG9jYXRlZDsJLyogU3RyZWFtIHN0YXR1cyAqLworCXZvaWQgKmhzdHJlYW07CisJdTMyIG51bV9idWZzOworCXUzMiBkaXI7CisJaW50IGlkOworfTsKKworLyogT3ZlcmFsbCBCcmlkZ2UgcHJvY2VzcyByZXNvdXJjZSB1c2FnZSBzdGF0ZSAqLworZW51bSBncHBfcHJvY19yZXNfc3RhdGUgeworCVBST0NfUkVTX0FMTE9DQVRFRCwKKwlQUk9DX1JFU19GUkVFRAorfTsKKworLyogQnJpZGdlIERhdGEgKi8KK3N0cnVjdCBkcnZfZGF0YSB7CisJY2hhciAqYmFzZV9pbWc7CisJczMyIHNobV9zaXplOworCWludCB0Y193b3Jkc3dhcG9uOworCXZvaWQgKmRydl9vYmplY3Q7CisJdm9pZCAqZGV2X29iamVjdDsKKwl2b2lkICptZ3Jfb2JqZWN0OworfTsKKworLyogUHJvY2VzcyBDb250ZXh0ICovCitzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0IHsKKwkvKiBQcm9jZXNzIFN0YXRlICovCisJZW51bSBncHBfcHJvY19yZXNfc3RhdGUgcmVzX3N0YXRlOworCisJLyogSGFuZGxlIHRvIFByb2Nlc3NvciAqLworCXZvaWQgKmhwcm9jZXNzb3I7CisKKwkvKiBEU1AgTm9kZSByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaWRyICpub2RlX2lkOworCisJLyogRE1NIG1hcHBlZCBtZW1vcnkgcmVzb3VyY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBkbW1fbWFwX2xpc3Q7CisJc3BpbmxvY2tfdCBkbW1fbWFwX2xvY2s7CisKKwkvKiBETU0gcmVzZXJ2ZWQgbWVtb3J5IHJlc291cmNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZG1tX3Jzdl9saXN0OworCXNwaW5sb2NrX3QgZG1tX3Jzdl9sb2NrOworCisJLyogRFNQIEhlYXAgcmVzb3VyY2VzICovCisJc3RydWN0IGRzcGhlYXBfcmVzX29iamVjdCAqcGRzcGhlYXBfbGlzdDsKKworCS8qIFN0cmVhbSByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaWRyICpzdHJlYW1faWQ7Cit9OworCisvKgorICogID09PT09PT09IGRydl9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGVzIHRoZSBEcml2ZXIgT2JqZWN0LiBUaGlzIGlzIGRvbmUgZHVyaW5nIHRoZSBkcml2ZXIgbG9hZGluZy4KKyAqICAgICAgVGhlcmUgaXMgb25seSBvbmUgRHJpdmVyIE9iamVjdCBpbiB0aGUgRFNQL0JJT1MgQnJpZGdlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRydl9vYmo6ICAgICAgICBMb2NhdGlvbiB0byBzdG9yZSBjcmVhdGVkIERSViBPYmplY3QgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNlc3MKKyAqICAgICAgLUVOT01FTTogICAgRmFpbGVkIGluIE1lbW9yeSBhbGxvY2F0aW9uCisgKiAgICAgIC1FUEVSTTogICAgICBHZW5lcmFsIEZhaWx1cmUKKyAqICBSZXF1aXJlczoKKyAqICAgICAgRFJWIEluaXRpYWxpemVkIChyZWZzID4gMCApCisgKiAgICAgIGRydl9vYmogIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgLSAqZHJ2X29iaiBpcyBhIHZhbGlkIERSViBpbnRlcmZhY2UgdG8gdGhlIGRldmljZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gTGlzdCBvZiBEZXZPYmplY3QgQ3JlYXRlZCBhbmQgSW5pdGlhbGl6ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAtIExpc3Qgb2YgZGV2X25vZGUgU3RyaW5nIGNyZWF0ZWQgYW5kIGludGlhbGl6ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFJlZ2lzdHJ5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgRFJWIE9iamVjdC4KKyAqICAgICAgITA6ICAgICAgIERSViBPYmplY3Qgbm90IGNyZWF0ZWQKKyAqICBEZXRhaWxzOgorICogICAgICBUaGVyZSBpcyBvbmUgRHJpdmVyIE9iamVjdCBmb3IgdGhlIERyaXZlciByZXByZXNlbnRpbmcKKyAqICAgICAgdGhlIGRyaXZlciBpdHNlbGYuIEl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIGRldmljZQorICogICAgICBPYmplY3RzIGFuZCB0aGUgbGlzdCBvZiBEZXZpY2UgRXh0ZW5zaW9ucyBpbiB0aGUgc3lzdGVtLgorICogICAgICBBbHNvIGl0IGNhbiBob2xkIG90aGVyIG5lY2Nlc3NhcnkKKyAqICAgICAgaW5mb3JtYXRpb24gaW4gaXRzIHN0b3JhZ2UgYXJlYS4KKyAqLworZXh0ZXJuIGludCBkcnZfY3JlYXRlKHN0cnVjdCBkcnZfb2JqZWN0ICoqZHJ2X29iaik7CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X2Rlc3Ryb3kgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBkZXN0cm95cyB0aGUgRGV2IE9iamVjdCBsaXN0LCBEcnZFeHQgbGlzdAorICogICAgICBhbmQgZGVzdHJveSB0aGUgRFJWIG9iamVjdAorICogICAgICBDYWxsZWQgdXBvbiBkcml2ZXIgdW5Mb2FkaW5nLm9yIHVuc3VjY2VzZnVsIGxvYWRpbmcgb2YgdGhlIGRyaXZlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkcml2ZXJfb2JqOiAgICAgSGFuZGxlIHRvIERyaXZlciBvYmplY3QgLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgRmFpbGVkIHRvIGRlc3Ryb3kgRFJWIE9iamVjdAorICogIFJlcXVpcmVzOgorICogICAgICBEUlYgSW5pdGlhbGl6ZWQgKGNSZWdzID4gMCApCisgKiAgICAgIGhkcnZfb2JqIGlzIG5vdCBOVUxMIGFuZCBhIHZhbGlkIERSViBoYW5kbGUgLgorICogICAgICBMaXN0IG9mIERldk9iamVjdCBpcyBFbXB0eS4KKyAqICAgICAgTGlzdCBvZiBEcnZFeHQgaXMgRW1wdHkKKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgLSBEUlYgT2JqZWN0IGRlc3Ryb3llZCBhbmQgaGRydl9vYmogaXMgbm90IGEgdmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRFJWIGhhbmRsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gUmVnaXN0cnkgaXMgdXBkYXRlZCB3aXRoICIwIiBhcyB0aGUgRFJWIE9iamVjdC4KKyAqLworZXh0ZXJuIGludCBkcnZfZGVzdHJveShzdHJ1Y3QgZHJ2X29iamVjdCAqZHJpdmVyX29iaik7CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBFeGl0IHRoZSBEUlYgbW9kdWxlLCBmcmVlaW5nIGFueSBtb2R1bGVzIGluaXRpYWxpemVkIGluIGRydl9pbml0LgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBkcnZfZXhpdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBkcnZfZ2V0X2ZpcnN0X2Rldl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm5zIHRoZSBQdHIgdG8gdGhlIEZpcnN0RGV2IE9iamVjdCBpbiB0aGUgTGlzdAorICogIFBhcmFtZXRlcnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERSViBJbml0aWFsaXplZAorICogIFJldHVybnM6CisgKiAgICAgIGR3X2Rldl9vYmplY3Q6ICBQdHIgdG8gdGhlIEZpcnN0IERldiBPYmplY3QgYXMgYSB1MzIKKyAqICAgICAgMCBpZiBpdCBmYWlscyB0byByZXRyaWV2ZSB0aGUgRmlyc3QgRGV2IE9iamVjdAorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB1MzIgZHJ2X2dldF9maXJzdF9kZXZfb2JqZWN0KHZvaWQpOworCisvKgorICogID09PT09PT09IGRydl9nZXRfZmlyc3RfZGV2X2V4dGVuc2lvbiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybnMgdGhlIFB0ciB0byB0aGUgRmlyc3QgRGV2aWNlIEV4dGVuc2lvbiBpbiB0aGUgTGlzdAorICogIFBhcmFtZXRlcnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERSViBJbml0aWFsaXplZAorICogIFJldHVybnM6CisgKiAgICAgIGR3X2Rldl9leHRlbnNpb246ICAgICBQdHIgdG8gdGhlIEZpcnN0IERldmljZSBFeHRlbnNpb24gYXMgYSB1MzIKKyAqICAgICAgMDogICAgICAgICAgICAgICAgICBGYWlsZWQgdG8gR2V0IHRoZSBEZXZpY2UgRXh0ZW5zaW9uCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHUzMiBkcnZfZ2V0X2ZpcnN0X2Rldl9leHRlbnNpb24odm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X2dldF9kZXZfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2l2ZW4gYSBpbmRleCwgcmV0dXJucyBhIGhhbmRsZSB0byBEZXZPYmplY3QgZnJvbSB0aGUgbGlzdAorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkcnZfb2JqOiAgICAgSGFuZGxlIHRvIHRoZSBNYW5hZ2VyCisgKiAgICAgIGRldmljZV9vYmo6ICAgICBMb2NhdGlvbiB0byBzdG9yZSB0aGUgRGV2IEhhbmRsZQorICogIFJlcXVpcmVzOgorICogICAgICBEUlYgSW5pdGlhbGl6ZWQKKyAqICAgICAgaW5kZXggPj0gMAorICogICAgICBoZHJ2X29iaiBpcyBub3QgTlVMTCBhbmQgVmFsaWQgRFJWIE9iamVjdAorICogICAgICBkZXZpY2Vfb2JqIGlzIG5vdCBOVUxMCisgKiAgICAgIERldmljZSBPYmplY3QgTGlzdCBub3QgRW1wdHkKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2VzcworICogICAgICAtRVBFUk06ICAgICAgRmFpbGVkIHRvIEdldCB0aGUgRGV2IE9iamVjdAorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqZGV2aWNlX29iaiAhPSBOVUxMCisgKiAgICAgIC1FUEVSTTogICAgICAqZGV2aWNlX29iaiA9IE5VTEwKKyAqLworZXh0ZXJuIGludCBkcnZfZ2V0X2Rldl9vYmplY3QodTMyIGluZGV4LAorCQkJCSAgICAgc3RydWN0IGRydl9vYmplY3QgKmhkcnZfb2JqLAorCQkJCSAgICAgc3RydWN0IGRldl9vYmplY3QgKipkZXZpY2Vfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBkcnZfZ2V0X25leHRfZGV2X29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybnMgdGhlIFB0ciB0byB0aGUgTmV4dCBEZXZpY2UgT2JqZWN0IGZyb20gdGhlIHRoZSBMaXN0CisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gdGhlIERldmljZSBPYmplY3QKKyAqICBSZXF1aXJlczoKKyAqICAgICAgRFJWIEluaXRpYWxpemVkCisgKiAgICAgIGhkZXZfb2JqICE9IDAKKyAqICBSZXR1cm5zOgorICogICAgICBkd19kZXZfb2JqZWN0OiAgICBQdHIgdG8gdGhlIE5leHQgRGV2IE9iamVjdCBhcyBhIHUzMgorICogICAgICAwOiAgICAgICAgICAgICAgSWYgaXQgZmFpbCB0byBnZXQgdGhlIG5leHQgRGV2IE9iamVjdC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdTMyIGRydl9nZXRfbmV4dF9kZXZfb2JqZWN0KHUzMiBoZGV2X29iaik7CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X2dldF9uZXh0X2Rldl9leHRlbnNpb24gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm5zIHRoZSBQdHIgdG8gdGhlIE5leHQgRGV2aWNlIEV4dGVuc2lvbiBmcm9tIHRoZSB0aGUgTGlzdAorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9leHRlbnNpb246ICAgICAgSGFuZGxlIHRvIHRoZSBEZXZpY2UgRXh0ZW5zaW9uCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIERSViBJbml0aWFsaXplZAorICogICAgICBkZXZfZXh0ZW5zaW9uICE9IDAuCisgKiAgUmV0dXJuczoKKyAqICAgICAgZHdfZGV2X2V4dGVuc2lvbjogICAgIFB0ciB0byB0aGUgTmV4dCBEZXYgRXh0ZW5zaW9uCisgKiAgICAgIDA6ICAgICAgICAgICAgICAgICAgSWYgaXQgZmFpbCB0byBHZXQgdGhlIG5leHQgRGV2IEV4dGVuc2lvbgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB1MzIgZHJ2X2dldF9uZXh0X2Rldl9leHRlbnNpb24odTMyIGRldl9leHRlbnNpb24pOworCisvKgorICogID09PT09PT09IGRydl9pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgRFJWIG1vZHVsZS4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgc3VjY2VzczsgRkFMU0Ugb3RoZXJ3aXNlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgZHJ2X2luaXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X2luc2VydF9kZXZfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5zZXJ0IGEgRGV2aWNlT2JqZWN0IGludG8gdGhlIGxpc3Qgb2YgRHJpdmVyIG9iamVjdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkcml2ZXJfb2JqOiAgICAgSGFuZGxlIHRvIERydk9iamVjdAorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBEZXZpY2VPYmplY3QgdG8gaW5zZXJ0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBJZiBzdWNjZXNzZnVsLgorICogICAgICAtRVBFUk06ICAgICAgR2VuZXJhbCBGYWlsdXJlOgorICogIFJlcXVpcmVzOgorICogICAgICBoZHJ2X29iaiAhPSBOVUxMIGFuZCBWYWxpZCBEUlYgSGFuZGxlLgorICogICAgICBoZGV2X29iaiAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICBEZXZpY2UgT2JqZWN0IGlzIGluc2VydGVkIGFuZCB0aGUgTGlzdCBpcyBub3QgZW1wdHkuCisgKi8KK2V4dGVybiBpbnQgZHJ2X2luc2VydF9kZXZfb2JqZWN0KHN0cnVjdCBkcnZfb2JqZWN0ICpkcml2ZXJfb2JqLAorCQkJCQlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmopOworCisvKgorICogID09PT09PT09IGRydl9yZW1vdmVfZGV2X29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNlYXJjaCBmb3IgYW5kIHJlbW92ZSBhIERldmljZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gbGlzdCBvZiBEZXZpY2UgT2JqCisgKiAgICAgIG9iamVjdHMuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZHJpdmVyX29iajogICAgIEhhbmRsZSB0byBEcnZPYmplY3QKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gRGV2T2JqZWN0IHRvIFJlbW92ZQorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgVW5hYmxlIHRvIGZpbmQgZGV2X29iai4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgaGRydl9vYmogIT0gTlVMTCBhbmQgYSBWYWxpZCBEUlYgSGFuZGxlLgorICogICAgICBoZGV2X29iaiAhPSBOVUxMLgorICogICAgICBMaXN0IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5LgorICogIEVuc3VyZXM6CisgKiAgICAgIExpc3QgZWl0aGVyIGRvZXMgbm90IGV4aXN0IChOVUxMKSwgb3IgaXMgbm90IGVtcHR5IGlmIGl0IGRvZXMgZXhpc3QuCisgKi8KK2V4dGVybiBpbnQgZHJ2X3JlbW92ZV9kZXZfb2JqZWN0KHN0cnVjdCBkcnZfb2JqZWN0ICpkcml2ZXJfb2JqLAorCQkJCQlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmopOworCisvKgorICogID09PT09PT09IGRydl9yZXF1ZXN0X3Jlc291cmNlcyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEFzc2lnbnMgdGhlIFJlc291cmNlcyBvciBSZWxlYXNlcyB0aGVtLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGR3X2NvbnRleHQ6ICAgICAgICAgIFBhdGggdG8gdGhlIGRyaXZlciBSZWdpc3RyeSBLZXkuCisgKiAgICAgIGRldl9ub2RlX3N0cmc6ICAgICBQdHIgdG8gZGV2X25vZGUgU3RyaW5nIHN0b3JlZCBpbiB0aGUgRGV2aWNlIEV4dC4KKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIHN1Y2Nlc3M7IEZBTFNFIG90aGVyd2lzZS4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICogICAgICBUaGUgUmVzb3VyY2VzIGFyZSBhc3NpZ25lZCBiYXNlZCBvbiBCdXMgdHlwZS4KKyAqICAgICAgVGhlIGhhcmR3YXJlIGlzIGluaXRpYWxpemVkLiBSZXNvdXJjZSBpbmZvcm1hdGlvbiBpcworICogICAgICBnYXRoZXJlZCBmcm9tIHRoZSBSZWdpc3RyeShJU0EsIFBDTUNJQSlvciBzY2FubmVkKFBDSSkKKyAqICAgICAgUmVzb3VyY2Ugc3RydWN0dXJlIGlzIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkgd2hpY2ggd2lsbCBiZQorICogICAgICBsYXRlciB1c2VkIGJ5IHRoZSBDRkcgbW9kdWxlLgorICovCitleHRlcm4gaW50IGRydl9yZXF1ZXN0X3Jlc291cmNlcyh1MzIgZHdfY29udGV4dCwKKwkJCQkJdTMyICpkZXZfbm9kZV9zdHJnKTsKKworLyoKKyAqICA9PT09PT09PSBkcnZfcmVsZWFzZV9yZXNvdXJjZXMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBc3NpZ25zIHRoZSBSZXNvdXJjZXMgb3IgUmVsZWFzZXMgdGhlbS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkd19jb250ZXh0OiAgICAgIFBhdGggdG8gdGhlIGRyaXZlciBSZWdpc3RyeSBLZXkuCisgKiAgICAgIGhkcnZfb2JqOiAgICAgSGFuZGxlIHRvIHRoZSBEcml2ZXIgT2JqZWN0LgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgc3VjY2VzczsgRkFMU0Ugb3RoZXJ3aXNlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKiAgICAgIFRoZSBSZXNvdXJjZXMgYXJlIHJlbGVhc2VkIGJhc2VkIG9uIEJ1cyB0eXBlLgorICogICAgICBSZXNvdXJjZSBzdHJ1Y3R1cmUgaXMgZGVsZXRlZCBmcm9tIHRoZSByZWdpc3RyeQorICovCitleHRlcm4gaW50IGRydl9yZWxlYXNlX3Jlc291cmNlcyh1MzIgZHdfY29udGV4dCwKKwkJCQkJc3RydWN0IGRydl9vYmplY3QgKmhkcnZfb2JqKTsKKworLyoqCisgKiBkcnZfcmVxdWVzdF9icmlkZ2VfcmVzX2RzcCgpIC0gUmVzZXJ2ZXMgc2hhcmVkIG1lbW9yeSBmb3IgYnJpZGdlLgorICogQHBob3N0X3Jlc291cmNlczogIHBvaW50ZXIgdG8gaG9zdCByZXNvdXJjZXMuCisgKi8KK2ludCBkcnZfcmVxdWVzdF9icmlkZ2VfcmVzX2RzcCh2b2lkICoqcGhvc3RfcmVzb3VyY2VzKTsKKworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9SRUNPVkVSWQordm9pZCBicmlkZ2VfcmVjb3Zlcl9zY2hlZHVsZSh2b2lkKTsKKyNlbmRpZgorCisvKgorICogID09PT09PT09IG1lbV9leHRfcGh5c19wb29sX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBVc2VzIHRoZSBwaHlzaWNhbCBtZW1vcnkgY2h1bmsgcGFzc2VkIGZvciBpbnRlcm5hbCBjb25zaXRlbnQgbWVtb3J5CisgKiAgICAgIGFsbG9jYXRpb25zLgorICogICAgICBwaHlzaWNhbCBhZGRyZXNzIGJhc2VkIG9uIHRoZSBwYWdlIGZyYW1lIGFkZHJlc3MuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgcG9vbF9waHlzX2Jhc2UgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIG1lbW9yeSBwb29sLgorICogICAgICBwb29sX3NpemUgICAgICBzaXplIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgcG9vbC4KKyAqICBSZXR1cm5zOgorICogICAgICBub25lLgorICogIFJlcXVpcmVzOgorICogICAgICAtIE1FTSBpbml0aWFsaXplZC4KKyAqICAgICAgLSB2YWxpZCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgYmFzZSBhbmQgc2l6ZSA+IDAKKyAqLworZXh0ZXJuIHZvaWQgbWVtX2V4dF9waHlzX3Bvb2xfaW5pdCh1MzIgcG9vbF9waHlzX2Jhc2UsIHUzMiBwb29sX3NpemUpOworCisvKgorICogID09PT09PT09IG1lbV9leHRfcGh5c19wb29sX3JlbGVhc2UgPT09PT09PT0KKyAqLworZXh0ZXJuIHZvaWQgbWVtX2V4dF9waHlzX3Bvb2xfcmVsZWFzZSh2b2lkKTsKKworLyogID09PT09PT09IG1lbV9hbGxvY19waHlzX21lbSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEFsbG9jYXRlIHBoeXNpY2FsbHkgY29udGlndW91cywgdW5jYWNoZWQgbWVtb3J5CisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgYnl0ZV9zaXplOiAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLgorICogICAgICBhbGlnbl9tYXNrOiAgICBBbGlnbm1lbnQgTWFzay4KKyAqICAgICAgcGh5c2ljYWxfYWRkcmVzczogUGh5c2ljYWwgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5LgorICogIFJldHVybnM6CisgKiAgICAgIFBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnk7CisgKiAgICAgIE5VTEwgaWYgbWVtb3J5IGNvdWxkbid0IGJlIGFsbG9jYXRlZCwgb3IgaWYgYnl0ZV9zaXplID09IDAuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIE1FTSBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICBUaGUgcmV0dXJuZWQgcG9pbnRlciwgaWYgbm90IE5VTEwsIHBvaW50cyB0byBhIHZhbGlkIG1lbW9yeSBibG9jayBvZgorICogICAgICB0aGUgc2l6ZSByZXF1ZXN0ZWQuICBSZXR1cm5lZCBwaHlzaWNhbCBhZGRyZXNzIHJlZmVycyB0byBwaHlzaWNhbAorICogICAgICBsb2NhdGlvbiBvZiBtZW1vcnkuCisgKi8KK2V4dGVybiB2b2lkICptZW1fYWxsb2NfcGh5c19tZW0odTMyIGJ5dGVfc2l6ZSwKKwkJCQl1MzIgYWxpZ25fbWFzaywgdTMyICpwaHlzaWNhbF9hZGRyZXNzKTsKKworLyoKKyAqICA9PT09PT09PSBtZW1fZnJlZV9waHlzX21lbSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWUgdGhlIGdpdmVuIGJsb2NrIG9mIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdmlydHVhbF9hZGRyZXNzOiAgUG9pbnRlciB0byB2aXJ0dWFsIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkCisgKiAgICAgIGJ5IG1lbV9hbGxvY19waHlzX21lbSgpLgorICogICAgICBwaHlzaWNhbF9hZGRyZXNzOiAgUG9pbnRlciB0byBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uICBhbGxvY2F0ZWQKKyAqICAgICAgYnkgbWVtX2FsbG9jX3BoeXNfbWVtKCkuCisgKiAgICAgIGJ5dGVfc2l6ZTogIFNpemUgb2YgdGhlIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGJ5IG1lbV9hbGxvY19waHlzX21lbSgpLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIE1FTSBpbml0aWFsaXplZC4KKyAqICAgICAgdmlydHVhbF9hZGRyZXNzIGlzIGEgdmFsaWQgbWVtb3J5IGFkZHJlc3MgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgIG1lbV9hbGxvY19waHlzX21lbSgpCisgKiAgRW5zdXJlczoKKyAqICAgICAgdmlydHVhbF9hZGRyZXNzIGlzIG5vIGxvbmdlciBhIHZhbGlkIHBvaW50ZXIgdG8gbWVtb3J5LgorICovCitleHRlcm4gdm9pZCBtZW1fZnJlZV9waHlzX21lbSh2b2lkICp2aXJ0dWFsX2FkZHJlc3MsCisJCQkgICAgICB1MzIgcGh5c2ljYWxfYWRkcmVzcywgdTMyIGJ5dGVfc2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gTUVNX0xJTkVBUl9BRERSRVNTID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IHRoZSBsaW5lYXIgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwaHlzaWNhbCBhZGRyZXNzLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHBoeXNfYWRkcjogIFBoeXNpY2FsIGFkZHJlc3MgdG8gYmUgbWFwcGVkLgorICogICAgICBieXRlX3NpemU6ICAgICBOdW1iZXIgb2YgYnl0ZXMgaW4gcGh5c2ljYWwgcmFuZ2UgdG8gbWFwLgorICogIFJldHVybnM6CisgKiAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGxpbmVhciBhZGRyZXNzLCBvciBOVUxMIGlmIHVuc3VjY2Vzc2Z1bC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgTUVNIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgTm90ZXM6CisgKiAgICAgIElmIHZhbGlkIGxpbmVhciBhZGRyZXNzIGlzIHJldHVybmVkLCBiZSBzdXJlIHRvIGNhbGwKKyAqICAgICAgTUVNX1VOTUFQX0xJTkVBUl9BRERSRVNTKCkuCisgKi8KKyNkZWZpbmUgTUVNX0xJTkVBUl9BRERSRVNTKHBoeV9hZGRyLCBieXRlX3NpemUpIHBoeV9hZGRyCisKKy8qCisgKiAgPT09PT09PT0gTUVNX1VOTUFQX0xJTkVBUl9BRERSRVNTID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVW5tYXAgdGhlIGxpbmVhciBhZGRyZXNzIG1hcHBlZCBpbiBNRU1fTElORUFSX0FERFJFU1MuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgYmFzZV9hZGRyOiBQdHIgdG8gbWFwcGVkIG1lbW9yeSAoYXMgcmV0dXJuZWQgYnkgTUVNX0xJTkVBUl9BRERSRVNTKCkpLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIC0gTUVNIGluaXRpYWxpemVkLgorICogICAgICAtIGJhc2VfYWRkciBpcyBhIHZhbGlkIGxpbmVhciBhZGRyZXNzIG1hcHBlZCBpbiBNRU1fTElORUFSX0FERFJFU1MuCisgKiAgRW5zdXJlczoKKyAqICAgICAgLSBiYXNlX2FkZHIgbm8gbG9uZ2VyIHBvaW50cyB0byBhIHZhbGlkIGxpbmVhciBhZGRyZXNzLgorICovCisjZGVmaW5lIE1FTV9VTk1BUF9MSU5FQVJfQUREUkVTUyhiYXNlX2FkZHIpIHt9CisKKyNlbmRpZiAvKiBEUlZfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHJ2ZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RydmRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIwOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RydmRlZnMuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogZHJ2ZGVmcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERlZmluaXRpb24gb2YgY29tbW9uIHN0cnVjdCBiZXR3ZWVuIGRzcGRlZnMuaCBhbmQgZHJ2LmguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBEUlZERUZTXworI2RlZmluZSBEUlZERUZTXworCisvKiBCcmlkZ2UgRHJpdmVyIE9iamVjdCAqLworc3RydWN0IGRydl9vYmplY3Q7CisKKyNlbmRpZiAvKiBEUlZERUZTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGFwaS1pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGFwaS1pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTViZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwYXBpLWlvY3RsLmgKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBkc3BhcGktaW9jdGwuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBjb21tYW5kcyB0aGF0IGFyZSB1c2VkIGZvciBpbnRlcmFjdGlvbgorICogYmV0d2VlbiB0aGUgRERTUCBBUEkgYW5kIEJyaWRnZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRFNQQVBJSU9DVExfCisjZGVmaW5lIERTUEFQSUlPQ1RMXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NtbS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zdHJtZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRjZC5oPgorCit1bmlvbiB0cmFwcGVkX2FyZ3MgeworCisJLyogTUdSIE1vZHVsZSAqLworCXN0cnVjdCB7CisJCXUzMiBub2RlX2lkOworCQlzdHJ1Y3QgZHNwX25kYnByb3BzIF9fdXNlciAqcG5kYl9wcm9wczsKKwkJdTMyIHVuZGJfcHJvcHNfc2l6ZTsKKwkJdTMyIF9fdXNlciAqcHVfbnVtX25vZGVzOworCX0gYXJnc19tZ3JfZW51bW5vZGVfaW5mbzsKKworCXN0cnVjdCB7CisJCXUzMiBwcm9jZXNzb3JfaWQ7CisJCXN0cnVjdCBkc3BfcHJvY2Vzc29yaW5mbyBfX3VzZXIgKnByb2Nlc3Nvcl9pbmZvOworCQl1MzIgcHJvY2Vzc29yX2luZm9fc2l6ZTsKKwkJdTMyIF9fdXNlciAqcHVfbnVtX3Byb2NzOworCX0gYXJnc19tZ3JfZW51bXByb2NfaW5mbzsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmo7CisJCWVudW0gZHNwX2RjZG9ianR5cGUgb2JqX3R5cGU7CisJCWNoYXIgKnBzel9wYXRoX25hbWU7CisJfSBhcmdzX21ncl9yZWdpc3Rlcm9iamVjdDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmo7CisJCWVudW0gZHNwX2RjZG9ianR5cGUgb2JqX3R5cGU7CisJfSBhcmdzX21ncl91bnJlZ2lzdGVyb2JqZWN0OworCisJc3RydWN0IHsKKwkJc3RydWN0IGRzcF9ub3RpZmljYXRpb24gX191c2VyICpfX3VzZXIgKmFub3RpZmljYXRpb25zOworCQl1MzIgY291bnQ7CisJCXUzMiBfX3VzZXIgKnB1X2luZGV4OworCQl1MzIgdXRpbWVvdXQ7CisJfSBhcmdzX21ncl93YWl0OworCisJLyogUFJPQyBNb2R1bGUgKi8KKwlzdHJ1Y3QgeworCQl1MzIgcHJvY2Vzc29yX2lkOworCQlzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmF0dHJpbiBfX3VzZXIgKmF0dHJfaW47CisJCXZvaWQgKl9fdXNlciAqcGhfcHJvY2Vzc29yOworCX0gYXJnc19wcm9jX2F0dGFjaDsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJCXUzMiBkd19jbWQ7CisJCXN0cnVjdCBkc3BfY2JkYXRhIF9fdXNlciAqcGFyZ3M7CisJfSBhcmdzX3Byb2NfY3RybDsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJfSBhcmdzX3Byb2NfZGV0YWNoOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHByb2Nlc3NvcjsKKwkJdm9pZCAqX191c2VyICpub2RlX3RhYjsKKwkJdTMyIG5vZGVfdGFiX3NpemU7CisJCXUzMiBfX3VzZXIgKnB1X251bV9ub2RlczsKKwkJdTMyIF9fdXNlciAqcHVfYWxsb2NhdGVkOworCX0gYXJnc19wcm9jX2VudW1ub2RlX2luZm87CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCQl1MzIgcmVzb3VyY2VfdHlwZTsKKwkJc3RydWN0IGRzcF9yZXNvdXJjZWluZm8gKnJlc291cmNlX2luZm87CisJCXUzMiByZXNvdXJjZV9pbmZvX3NpemU7CisJfSBhcmdzX3Byb2NfZW51bXJlc291cmNlczsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJCXN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgX191c2VyICpwcm9jX3N0YXRlX29iajsKKwkJdTMyIHN0YXRlX2luZm9fc2l6ZTsKKwl9IGFyZ3NfcHJvY19nZXRzdGF0ZTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJCXU4IF9fdXNlciAqcGJ1ZjsKKwkJdTggX191c2VyICpwc2l6ZTsKKwkJdTMyIG1heF9zaXplOworCX0gYXJnc19wcm9jX2dldHRyYWNlOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHByb2Nlc3NvcjsKKwkJczMyIGFyZ2NfaW5kZXg7CisJCWNoYXIgX191c2VyICpfX3VzZXIgKnVzZXJfYXJnczsKKwkJY2hhciAqX191c2VyICp1c2VyX2VudnA7CisJfSBhcmdzX3Byb2NfbG9hZDsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJCXUzMiBldmVudF9tYXNrOworCQl1MzIgbm90aWZ5X3R5cGU7CisJCXN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uIF9fdXNlciAqaG5vdGlmaWNhdGlvbjsKKwl9IGFyZ3NfcHJvY19yZWdpc3Rlcl9ub3RpZnk7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCX0gYXJnc19wcm9jX3N0YXJ0OworCisJc3RydWN0IHsKKwkJdm9pZCAqaHByb2Nlc3NvcjsKKwkJdTMyIHVsX3NpemU7CisJCXZvaWQgKl9fdXNlciAqcHBfcnN2X2FkZHI7CisJfSBhcmdzX3Byb2NfcnN2bWVtOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHByb2Nlc3NvcjsKKwkJdTMyIHVsX3NpemU7CisJCXZvaWQgKnByc3ZfYWRkcjsKKwl9IGFyZ3NfcHJvY191bnJzdm1lbTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJCXZvaWQgKnBtcHVfYWRkcjsKKwkJdTMyIHVsX3NpemU7CisJCXZvaWQgKnJlcV9hZGRyOworCQl2b2lkICpfX3VzZXIgKnBwX21hcF9hZGRyOworCQl1MzIgdWxfbWFwX2F0dHI7CisJfSBhcmdzX3Byb2NfbWFwbWVtOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHByb2Nlc3NvcjsKKwkJdTMyIHVsX3NpemU7CisJCXZvaWQgKm1hcF9hZGRyOworCX0gYXJnc19wcm9jX3VubWFwbWVtOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHByb2Nlc3NvcjsKKwkJdm9pZCAqcG1wdV9hZGRyOworCQl1MzIgdWxfc2l6ZTsKKwkJdTMyIGRpcjsKKwl9IGFyZ3NfcHJvY19kbWE7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCQl2b2lkICpwbXB1X2FkZHI7CisJCXUzMiB1bF9zaXplOworCQl1MzIgdWxfZmxhZ3M7CisJfSBhcmdzX3Byb2NfZmx1c2htZW1vcnk7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCX0gYXJnc19wcm9jX3N0b3A7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCQl2b2lkICpwbXB1X2FkZHI7CisJCXUzMiB1bF9zaXplOworCX0gYXJnc19wcm9jX2ludmFsaWRhdGVtZW1vcnk7CisKKwkvKiBOT0RFIE1vZHVsZSAqLworCXN0cnVjdCB7CisJCXZvaWQgKmhwcm9jZXNzb3I7CisJCXN0cnVjdCBkc3BfdXVpZCBfX3VzZXIgKm5vZGVfaWRfcHRyOworCQlzdHJ1Y3QgZHNwX2NiZGF0YSBfX3VzZXIgKnBhcmdzOworCQlzdHJ1Y3QgZHNwX25vZGVhdHRyaW4gX191c2VyICphdHRyX2luOworCQl2b2lkICpfX3VzZXIgKnBoX25vZGU7CisJfSBhcmdzX25vZGVfYWxsb2NhdGU7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpobm9kZTsKKwkJdTMyIHVzaXplOworCQlzdHJ1Y3QgZHNwX2J1ZmZlcmF0dHIgX191c2VyICpwYXR0cjsKKwkJdTggKl9fdXNlciAqcGJ1ZmZlcjsKKwl9IGFyZ3Nfbm9kZV9hbGxvY21zZ2J1ZjsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCQlzMzIgcHJpbzsKKwl9IGFyZ3Nfbm9kZV9jaGFuZ2Vwcmlvcml0eTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCQl1MzIgc3RyZWFtX2lkOworCQl2b2lkICpvdGhlcl9ub2RlOworCQl1MzIgb3RoZXJfc3RyZWFtOworCQlzdHJ1Y3QgZHNwX3N0cm1hdHRyIF9fdXNlciAqcGF0dHJzOworCQlzdHJ1Y3QgZHNwX2NiZGF0YSBfX3VzZXIgKmNvbm5fcGFyYW07CisJfSBhcmdzX25vZGVfY29ubmVjdDsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCX0gYXJnc19ub2RlX2NyZWF0ZTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCX0gYXJnc19ub2RlX2RlbGV0ZTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCQlzdHJ1Y3QgZHNwX2J1ZmZlcmF0dHIgX191c2VyICpwYXR0cjsKKwkJdTggKnBidWZmZXI7CisJfSBhcmdzX25vZGVfZnJlZW1zZ2J1ZjsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCQlzdHJ1Y3QgZHNwX25vZGVhdHRyIF9fdXNlciAqcGF0dHI7CisJCXUzMiBhdHRyX3NpemU7CisJfSBhcmdzX25vZGVfZ2V0YXR0cjsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCQlzdHJ1Y3QgZHNwX21zZyBfX3VzZXIgKm1lc3NhZ2U7CisJCXUzMiB1dGltZW91dDsKKwl9IGFyZ3Nfbm9kZV9nZXRtZXNzYWdlOworCisJc3RydWN0IHsKKwkJdm9pZCAqaG5vZGU7CisJfSBhcmdzX25vZGVfcGF1c2U7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpobm9kZTsKKwkJc3RydWN0IGRzcF9tc2cgX191c2VyICptZXNzYWdlOworCQl1MzIgdXRpbWVvdXQ7CisJfSBhcmdzX25vZGVfcHV0bWVzc2FnZTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhub2RlOworCQl1MzIgZXZlbnRfbWFzazsKKwkJdTMyIG5vdGlmeV90eXBlOworCQlzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbiBfX3VzZXIgKmhub3RpZmljYXRpb247CisJfSBhcmdzX25vZGVfcmVnaXN0ZXJub3RpZnk7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpobm9kZTsKKwl9IGFyZ3Nfbm9kZV9ydW47CisKKwlzdHJ1Y3QgeworCQl2b2lkICpobm9kZTsKKwkJaW50IF9fdXNlciAqcHN0YXR1czsKKwl9IGFyZ3Nfbm9kZV90ZXJtaW5hdGU7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCQlzdHJ1Y3QgZHNwX3V1aWQgX191c2VyICpub2RlX2lkX3B0cjsKKwkJc3RydWN0IGRzcF9uZGJwcm9wcyBfX3VzZXIgKm5vZGVfcHJvcHM7CisJfSBhcmdzX25vZGVfZ2V0dXVpZHByb3BzOworCisJLyogU1RSTSBtb2R1bGUgKi8KKworCXN0cnVjdCB7CisJCXZvaWQgKmhzdHJlYW07CisJCXUzMiB1c2l6ZTsKKwkJdTggKl9fdXNlciAqYXBfYnVmZmVyOworCQl1MzIgbnVtX2J1ZnM7CisJfSBhcmdzX3N0cm1fYWxsb2NhdGVidWZmZXI7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpoc3RyZWFtOworCX0gYXJnc19zdHJtX2Nsb3NlOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHN0cmVhbTsKKwkJdTggKl9fdXNlciAqYXBfYnVmZmVyOworCQl1MzIgbnVtX2J1ZnM7CisJfSBhcmdzX3N0cm1fZnJlZWJ1ZmZlcjsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhzdHJlYW07CisJCXZvaWQgKipwaF9ldmVudDsKKwl9IGFyZ3Nfc3RybV9nZXRldmVudGhhbmRsZTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhzdHJlYW07CisJCXN0cnVjdCBzdHJlYW1faW5mbyBfX3VzZXIgKnN0cmVhbV9pbmZvOworCQl1MzIgc3RyZWFtX2luZm9fc2l6ZTsKKwl9IGFyZ3Nfc3RybV9nZXRpbmZvOworCisJc3RydWN0IHsKKwkJdm9pZCAqaHN0cmVhbTsKKwkJYm9vbCBmbHVzaF9mbGFnOworCX0gYXJnc19zdHJtX2lkbGU7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpoc3RyZWFtOworCQl1OCAqcGJ1ZmZlcjsKKwkJdTMyIGR3X2J5dGVzOworCQl1MzIgZHdfYnVmX3NpemU7CisJCXUzMiBkd19hcmc7CisJfSBhcmdzX3N0cm1faXNzdWU7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpobm9kZTsKKwkJdTMyIGRpcmVjdGlvbjsKKwkJdTMyIGluZGV4OworCQlzdHJ1Y3Qgc3RybV9hdHRyIF9fdXNlciAqYXR0cl9pbjsKKwkJdm9pZCAqX191c2VyICpwaF9zdHJlYW07CisJfSBhcmdzX3N0cm1fb3BlbjsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhzdHJlYW07CisJCXU4ICpfX3VzZXIgKmJ1Zl9wdHI7CisJCXUzMiBfX3VzZXIgKmJ5dGVzOworCQl1MzIgX191c2VyICpidWZfc2l6ZV9wdHI7CisJCXUzMiBfX3VzZXIgKnBkd19hcmc7CisJfSBhcmdzX3N0cm1fcmVjbGFpbTsKKworCXN0cnVjdCB7CisJCXZvaWQgKmhzdHJlYW07CisJCXUzMiBldmVudF9tYXNrOworCQl1MzIgbm90aWZ5X3R5cGU7CisJCXN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uIF9fdXNlciAqaG5vdGlmaWNhdGlvbjsKKwl9IGFyZ3Nfc3RybV9yZWdpc3Rlcm5vdGlmeTsKKworCXN0cnVjdCB7CisJCXZvaWQgKl9fdXNlciAqc3RyZWFtX3RhYjsKKwkJdTMyIHN0cm1fbnVtOworCQl1MzIgX191c2VyICpwbWFzazsKKwkJdTMyIHV0aW1lb3V0OworCX0gYXJnc19zdHJtX3NlbGVjdDsKKworCS8qIENNTSBNb2R1bGUgKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3I7CisJCXUzMiB1c2l6ZTsKKwkJc3RydWN0IGNtbV9hdHRycyAqcGF0dHJzOworCQl2b2lkICoqcHBfYnVmX3ZhOworCX0gYXJnc19jbW1fYWxsb2NidWY7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3I7CisJCXZvaWQgKmJ1Zl9wYTsKKwkJdTMyIHVsX3NlZ19pZDsKKwl9IGFyZ3NfY21tX2ZyZWVidWY7CisKKwlzdHJ1Y3QgeworCQl2b2lkICpocHJvY2Vzc29yOworCQlzdHJ1Y3QgY21tX29iamVjdCAqX191c2VyICpwaF9jbW1fbWdyOworCX0gYXJnc19jbW1fZ2V0aGFuZGxlOworCisJc3RydWN0IHsKKwkJc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyOworCQlzdHJ1Y3QgY21tX2luZm8gX191c2VyICpjbW1faW5mb19vYmo7CisJfSBhcmdzX2NtbV9nZXRpbmZvOworCisJLyogVVRJTCBtb2R1bGUgKi8KKwlzdHJ1Y3QgeworCQlzMzIgdXRpbF9hcmdjOworCQljaGFyICoqcHBfYXJndjsKKwl9IGFyZ3NfdXRpbF90ZXN0ZGxsOworfTsKKworLyoKKyAqIERzcGJyaWRnZSBJb2N0bCBudW1iZXJpbmcgc2NoZW1lCisgKgorICogICAgNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB8ICBNb2R1bGUgICB8ICAgSW9jdGwgTnVtYmVyICAgIHwKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB8IHggfCB4IHwgeCB8IDAgfCAwIHwgMCB8IDAgfCAwIHwKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBJb2N0bCBkcml2ZXIgaWRlbnRpZmllciAqLworI2RlZmluZSBEQgkJMHhEQgorCisvKgorICogRm9sbG93aW5nIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbW9kdWxlIGlvY3RscywgdGhpcyBpcyBuZWVkZWQKKyAqIGluIGNhc2UgbmV3IGlvY3RscyBhcmUgaW50cm9kdWNlZC4KKyAqLworI2RlZmluZSBEQl9NT0RVTEVfTUFTSwkJMHhFMAorI2RlZmluZSBEQl9JT0NfTUFTSwkJMHgxRgorCisvKiBJb2N0bCBtb2R1bGUgbWFza3MgKi8KKyNkZWZpbmUgREJfTUdSCQkweDAKKyNkZWZpbmUgREJfUFJPQwkJMHgyMAorI2RlZmluZSBEQl9OT0RFCQkweDQwCisjZGVmaW5lIERCX1NUUk0JCTB4NjAKKyNkZWZpbmUgREJfQ01NCQkweDgwCisKKyNkZWZpbmUgREJfTU9EVUxFX1NISUZUCQk1CisKKy8qIFVzZWQgdG8gY2FsY3VsYXRlIHRoZSBpb2N0bCBwZXIgZHNwYnJpZGdlIG1vZHVsZSAqLworI2RlZmluZSBEQl9JT0MobW9kdWxlLCBudW0pIFwKKwkJCSgoKG1vZHVsZSkgJiBEQl9NT0RVTEVfTUFTSykgfCAoKG51bSkgJiBEQl9JT0NfTUFTSykpCisvKiBVc2VkIHRvIGdldCBkc3BicmlkZ2UgaW9jdGwgbW9kdWxlICovCisjZGVmaW5lIERCX0dFVF9NT0RVTEUoY21kKQkoKGNtZCkgJiBEQl9NT0RVTEVfTUFTSykKKy8qIFVzZWQgdG8gZ2V0IGRzcGJyaWRnZSBpb2N0bCBudW1iZXIgKi8KKyNkZWZpbmUgREJfR0VUX0lPQyhjbWQpCQkoKGNtZCkgJiBEQl9JT0NfTUFTSykKKworLyogVE9ETzogUmVtb3ZlIGRlcHJlY2F0ZWQgYW5kIG5vdCBpbXBsZW1lbnRlZCAqLworCisvKiBNR1IgTW9kdWxlICovCisjZGVmaW5lIE1HUl9FTlVNTk9ERV9JTkZPCV9JT1dSKERCLCBEQl9JT0MoREJfTUdSLCAwKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTUdSX0VOVU1QUk9DX0lORk8JX0lPV1IoREIsIERCX0lPQyhEQl9NR1IsIDEpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBNR1JfUkVHSVNURVJPQkpFQ1QJX0lPV1IoREIsIERCX0lPQyhEQl9NR1IsIDIpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBNR1JfVU5SRUdJU1RFUk9CSkVDVAlfSU9XUihEQiwgREJfSU9DKERCX01HUiwgMyksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE1HUl9XQUlUCQlfSU9XUihEQiwgREJfSU9DKERCX01HUiwgNCksIHVuc2lnbmVkIGxvbmcpCisvKiBNR1JfR0VUX1BST0NfUkVTIERlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgTUdSX0dFVF9QUk9DX1JFUwlfSU9SKERCLCBEQl9JT0MoREJfTUdSLCA1KSwgdW5zaWduZWQgbG9uZykKKworLyogUFJPQyBNb2R1bGUgKi8KKyNkZWZpbmUgUFJPQ19BVFRBQ0gJCV9JT1dSKERCLCBEQl9JT0MoREJfUFJPQywgMCksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFBST0NfQ1RSTAkJX0lPUihEQiwgREJfSU9DKERCX1BST0MsIDEpLCB1bnNpZ25lZCBsb25nKQorLyogUFJPQ19ERVRBQ0ggRGVwcmVjYXRlZCAqLworI2RlZmluZSBQUk9DX0RFVEFDSAkJX0lPUihEQiwgREJfSU9DKERCX1BST0MsIDIpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX0VOVU1OT0RFCQlfSU9XUihEQiwgREJfSU9DKERCX1BST0MsIDMpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX0VOVU1SRVNPVVJDRVMJX0lPV1IoREIsIERCX0lPQyhEQl9QUk9DLCA0KSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgUFJPQ19HRVRfU1RBVEUJCV9JT1dSKERCLCBEQl9JT0MoREJfUFJPQywgNSksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFBST0NfR0VUX1RSQUNFCQlfSU9XUihEQiwgREJfSU9DKERCX1BST0MsIDYpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX0xPQUQJCV9JT1coREIsIERCX0lPQyhEQl9QUk9DLCA3KSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgUFJPQ19SRUdJU1RFUk5PVElGWQlfSU9XUihEQiwgREJfSU9DKERCX1BST0MsIDgpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX1NUQVJUCQlfSU9XKERCLCBEQl9JT0MoREJfUFJPQywgOSksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFBST0NfUlNWTUVNCQlfSU9XUihEQiwgREJfSU9DKERCX1BST0MsIDEwKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgUFJPQ19VTlJTVk1FTQkJX0lPVyhEQiwgREJfSU9DKERCX1BST0MsIDExKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgUFJPQ19NQVBNRU0JCV9JT1dSKERCLCBEQl9JT0MoREJfUFJPQywgMTIpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX1VOTUFQTUVNCQlfSU9SKERCLCBEQl9JT0MoREJfUFJPQywgMTMpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX0ZMVVNITUVNT1JZCV9JT1coREIsIERCX0lPQyhEQl9QUk9DLCAxNCksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFBST0NfU1RPUAkJX0lPV1IoREIsIERCX0lPQyhEQl9QUk9DLCAxNSksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFBST0NfSU5WQUxJREFURU1FTU9SWQlfSU9XKERCLCBEQl9JT0MoREJfUFJPQywgMTYpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX0JFR0lORE1BCQlfSU9XKERCLCBEQl9JT0MoREJfUFJPQywgMTcpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBQUk9DX0VORERNQQkJX0lPVyhEQiwgREJfSU9DKERCX1BST0MsIDE4KSwgdW5zaWduZWQgbG9uZykKKworLyogTk9ERSBNb2R1bGUgKi8KKyNkZWZpbmUgTk9ERV9BTExPQ0FURQkJX0lPV1IoREIsIERCX0lPQyhEQl9OT0RFLCAwKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTk9ERV9BTExPQ01TR0JVRglfSU9XUihEQiwgREJfSU9DKERCX05PREUsIDEpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBOT0RFX0NIQU5HRVBSSU9SSVRZCV9JT1coREIsIERCX0lPQyhEQl9OT0RFLCAyKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTk9ERV9DT05ORUNUCQlfSU9XKERCLCBEQl9JT0MoREJfTk9ERSwgMyksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfQ1JFQVRFCQlfSU9XKERCLCBEQl9JT0MoREJfTk9ERSwgNCksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfREVMRVRFCQlfSU9XKERCLCBEQl9JT0MoREJfTk9ERSwgNSksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfRlJFRU1TR0JVRgkJX0lPVyhEQiwgREJfSU9DKERCX05PREUsIDYpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBOT0RFX0dFVEFUVFIJCV9JT1dSKERCLCBEQl9JT0MoREJfTk9ERSwgNyksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfR0VUTUVTU0FHRQkJX0lPV1IoREIsIERCX0lPQyhEQl9OT0RFLCA4KSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTk9ERV9QQVVTRQkJX0lPVyhEQiwgREJfSU9DKERCX05PREUsIDkpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBOT0RFX1BVVE1FU1NBR0UJCV9JT1coREIsIERCX0lPQyhEQl9OT0RFLCAxMCksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfUkVHSVNURVJOT1RJRlkJX0lPV1IoREIsIERCX0lPQyhEQl9OT0RFLCAxMSksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfUlVOCQlfSU9XKERCLCBEQl9JT0MoREJfTk9ERSwgMTIpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBOT0RFX1RFUk1JTkFURQkJX0lPV1IoREIsIERCX0lPQyhEQl9OT0RFLCAxMyksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE5PREVfR0VUVVVJRFBST1BTCV9JT1dSKERCLCBEQl9JT0MoREJfTk9ERSwgMTQpLCB1bnNpZ25lZCBsb25nKQorCisvKiBTVFJNIE1vZHVsZSAqLworI2RlZmluZSBTVFJNX0FMTE9DQVRFQlVGRkVSCV9JT1dSKERCLCBEQl9JT0MoREJfU1RSTSwgMCksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFNUUk1fQ0xPU0UJCV9JT1coREIsIERCX0lPQyhEQl9TVFJNLCAxKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgU1RSTV9GUkVFQlVGRkVSCQlfSU9XUihEQiwgREJfSU9DKERCX1NUUk0sIDIpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBTVFJNX0dFVEVWRU5USEFORExFCV9JTyhEQiwgREJfSU9DKERCX1NUUk0sIDMpKQkvKiBOb3QgSW1wbCdkICovCisjZGVmaW5lIFNUUk1fR0VUSU5GTwkJX0lPV1IoREIsIERCX0lPQyhEQl9TVFJNLCA0KSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgU1RSTV9JRExFCQlfSU9XKERCLCBEQl9JT0MoREJfU1RSTSwgNSksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFNUUk1fSVNTVUUJCV9JT1coREIsIERCX0lPQyhEQl9TVFJNLCA2KSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgU1RSTV9PUEVOCQlfSU9XUihEQiwgREJfSU9DKERCX1NUUk0sIDcpLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBTVFJNX1JFQ0xBSU0JCV9JT1dSKERCLCBEQl9JT0MoREJfU1RSTSwgOCksIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIFNUUk1fUkVHSVNURVJOT1RJRlkJX0lPV1IoREIsIERCX0lPQyhEQl9TVFJNLCA5KSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgU1RSTV9TRUxFQ1QJCV9JT1dSKERCLCBEQl9JT0MoREJfU1RSTSwgMTApLCB1bnNpZ25lZCBsb25nKQorCisvKiBDTU0gTW9kdWxlICovCisjZGVmaW5lIENNTV9BTExPQ0JVRgkJX0lPKERCLCBEQl9JT0MoREJfQ01NLCAwKSkJLyogTm90IEltcGwnZCAqLworI2RlZmluZSBDTU1fRlJFRUJVRgkJX0lPKERCLCBEQl9JT0MoREJfQ01NLCAxKSkJLyogTm90IEltcGwnZCAqLworI2RlZmluZSBDTU1fR0VUSEFORExFCQlfSU9SKERCLCBEQl9JT0MoREJfQ01NLCAyKSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgQ01NX0dFVElORk8JCV9JT1IoREIsIERCX0lPQyhEQl9DTU0sIDMpLCB1bnNpZ25lZCBsb25nKQorCisjZW5kaWYgLyogRFNQQVBJSU9DVExfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5YzY4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kc3BhcGkuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIGRzcGFwaS5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEluY2x1ZGVzIHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlCisgKiBEZXZpY2VJT0NvbnRyb2wgaW50ZXJmYWNlLgorICoKKyAqIE5vdGVzOgorICogICBCcmlkZ2Ugc2VydmljZXMgZXhwb3J0ZWQgdG8gQnJpZGdlIGRyaXZlciBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIERTUEFQSSBvbgorICogICBiZWhhbGYgb2YgdGhlIEJyaWRnZSBkcml2ZXIuIEJyaWRnZSBkcml2ZXIgbXVzdCBub3QgY2FsbCBtb2R1bGUgSW5pdC9FeGl0CisgKiAgIGZ1bmN0aW9ucy4KKyAqCisgKiAgIFRvIGVuc3VyZSBCcmlkZ2UgZHJpdmVyIGJpbmFyeSBjb21wYXRpYmlsaXR5IGFjcm9zcyBkaWZmZXJlbnQgcGxhdGZvcm1zLAorICogICBmb3IgdGhlIHNhbWUgcHJvY2Vzc29yLCBhIEJyaWRnZSBkcml2ZXIgbXVzdCByZXN0cmljdCBpdHMgdXNhZ2Ugb2Ygc3lzdGVtCisgKiAgIHNlcnZpY2VzIHRvIHRob3NlIGV4cG9ydGVkIGJ5IHRoZSBEU1BBUEkgbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIERTUEFQSV8KKyNkZWZpbmUgRFNQQVBJXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGFwaS1pb2N0bC5oPgorCisvKiBUaGlzIEJSRCBBUEkgTGlicmFyeSBWZXJzaW9uOiAqLworI2RlZmluZSBCUkRfQVBJX01BSk9SX1ZFUlNJT04gICAodTMyKTgJLyogLjh4IC0gQWxwaGEsIC45eCAtIEJldGEsIDEueCBGQ1MgKi8KKyNkZWZpbmUgQlJEX0FQSV9NSU5PUl9WRVJTSU9OICAgKHUzMikwCisKKy8qCisgKiAgPT09PT09PT0gYXBpX2NhbGxfZGV2X2lvY3RsID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2FsbCB0aGUgKHdyYXBwZXIpIGZ1bmN0aW9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBBUEkgSU9DVEwuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY21kOiAgICAgICAgSU9DVEwgaWQsIGJhc2UgMC4KKyAqICAgICAgYXJnczogICAgICAgQXJndW1lbnQgc3RydWN0dXJlLgorICogICAgICByZXN1bHQ6CisgKiAgUmV0dXJuczoKKyAqICAgICAgMCBpZiBjb21tYW5kIGNhbGxlZDsgLUVJTlZBTCBpZiBjb21tYW5kIG5vdCBpbiBJT0NUTAorICogICAgICB0YWJsZS4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGFwaV9jYWxsX2Rldl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICAgIHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywKKwkJCQkgICAgICB1MzIgKnJlc3VsdCwgdm9pZCAqcHJfY3R4dCk7CisKKy8qCisgKiAgPT09PT09PT0gYXBpX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIG1vZHVsZXMgdXNlZCBieSBCcmlkZ2UgQVBJLgorICogICAgICBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzIGxvYWRlZC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgc3VjY2VzczsgRkFMU0Ugb3RoZXJ3aXNlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBib29sIGFwaV9pbml0KHZvaWQpOworCisvKgorICogID09PT09PT09IGFwaV9pbml0X2NvbXBsZXRlMiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFBlcmZvcm0gYW55IHJlcXVpcmVkIGJyaWRnZSBpbml0aWFsaXphdGlvbiB3aGljaCBjYW5ub3QKKyAqICAgICAgYmUgcGVyZm9ybWVkIGluIGFwaV9pbml0KCkgb3IgZGV2X3N0YXJ0X2RldmljZSgpIGR1ZQorICogICAgICB0byB0aGUgZmFjdCB0aGF0IHNvbWUgc2VydmljZXMgYXJlIG5vdCB5ZXQKKyAqICAgICAgY29tcGxldGVseSBpbml0aWFsaXplZC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBBbGxvdyB0aGlzIGRldmljZSB0byBsb2FkCisgKiAgICAgIC1FUEVSTTogICAgICBGYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogICAgICBCcmlkZ2UgQVBJIGluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgYXBpX2luaXRfY29tcGxldGUyKHZvaWQpOworCisvKgorICogID09PT09PT09IGFwaV9leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRXhpdCBhbGwgbW9kdWxlcyBpbml0aWFsaXplZCBpbiBhcGlfaW5pdCh2b2lkKS4KKyAqICAgICAgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcyB1bmxvYWRlZC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGFwaV9pbml0KHZvaWQpIHdhcyBwcmV2aW91c2x5IGNhbGxlZC4KKyAqICBFbnN1cmVzOgorICogICAgICBSZXNvdXJjZXMgYWNxdWlyZWQgaW4gYXBpX2luaXQodm9pZCkgYXJlIGZyZWVkLgorICovCitleHRlcm4gdm9pZCBhcGlfZXhpdCh2b2lkKTsKKworLyogTUdSIHdyYXBwZXIgZnVuY3Rpb25zICovCitleHRlcm4gdTMyIG1ncndyYXBfZW51bV9ub2RlX2luZm8odW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgbWdyd3JhcF9lbnVtX3Byb2NfaW5mbyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBtZ3J3cmFwX3JlZ2lzdGVyX29iamVjdCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBtZ3J3cmFwX3VucmVnaXN0ZXJfb2JqZWN0KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG1ncndyYXBfd2FpdF9mb3JfYnJpZGdlX2V2ZW50cyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsCisJCQkJCSAgdm9pZCAqcHJfY3R4dCk7CisKK2V4dGVybiB1MzIgbWdyd3JhcF9nZXRfcHJvY2Vzc19yZXNvdXJjZXNfaW5mbyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsCisJCQkJCSAgICAgIHZvaWQgKnByX2N0eHQpOworCisvKiBDUFJDIChQcm9jZXNzb3IpIHdyYXBwZXIgRnVuY3Rpb25zICovCitleHRlcm4gdTMyIHByb2N3cmFwX2F0dGFjaCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBwcm9jd3JhcF9jdHJsKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX2RldGFjaCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBwcm9jd3JhcF9lbnVtX25vZGVfaW5mbyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBwcm9jd3JhcF9lbnVtX3Jlc291cmNlcyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBwcm9jd3JhcF9nZXRfc3RhdGUodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgcHJvY3dyYXBfZ2V0X3RyYWNlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX2xvYWQodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgcHJvY3dyYXBfcmVnaXN0ZXJfbm90aWZ5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX3N0YXJ0KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX3Jlc2VydmVfbWVtb3J5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX3VuX3Jlc2VydmVfbWVtb3J5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX21hcCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBwcm9jd3JhcF91bl9tYXAodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgcHJvY3dyYXBfZmx1c2hfbWVtb3J5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX3N0b3AodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgcHJvY3dyYXBfaW52YWxpZGF0ZV9tZW1vcnkodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgcHJvY3dyYXBfYmVnaW5fZG1hKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHByb2N3cmFwX2VuZF9kbWEodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKKworLyogTk9ERSB3cmFwcGVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHUzMiBub2Rld3JhcF9hbGxvY2F0ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBub2Rld3JhcF9hbGxvY19tc2dfYnVmKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX2NoYW5nZV9wcmlvcml0eSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBub2Rld3JhcF9jb25uZWN0KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX2NyZWF0ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBub2Rld3JhcF9kZWxldGUodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgbm9kZXdyYXBfZnJlZV9tc2dfYnVmKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX2dldF9hdHRyKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX2dldF9tZXNzYWdlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX3BhdXNlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX3B1dF9tZXNzYWdlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX3JlZ2lzdGVyX25vdGlmeSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBub2Rld3JhcF9ydW4odW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgbm9kZXdyYXBfdGVybWluYXRlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIG5vZGV3cmFwX2dldF91dWlkX3Byb3BzKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CisKKy8qIFNUUk0gd3JhcHBlciBmdW5jdGlvbnMgKi8KK2V4dGVybiB1MzIgc3RybXdyYXBfYWxsb2NhdGVfYnVmZmVyKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHN0cm13cmFwX2Nsb3NlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHN0cm13cmFwX2ZyZWVfYnVmZmVyKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHN0cm13cmFwX2dldF9ldmVudF9oYW5kbGUodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgc3RybXdyYXBfZ2V0X2luZm8odW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgc3RybXdyYXBfaWRsZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBzdHJtd3JhcF9pc3N1ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBzdHJtd3JhcF9vcGVuKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHN0cm13cmFwX3JlY2xhaW0odW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KTsKK2V4dGVybiB1MzIgc3RybXdyYXBfcmVnaXN0ZXJfbm90aWZ5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIHN0cm13cmFwX3NlbGVjdCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworCitleHRlcm4gdTMyIGNtbXdyYXBfY2FsbG9jX2J1Zih1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBjbW13cmFwX2ZyZWVfYnVmKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CitleHRlcm4gdTMyIGNtbXdyYXBfZ2V0X2hhbmRsZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpOworZXh0ZXJuIHUzMiBjbW13cmFwX2dldF9pbmZvKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CisKKyNlbmRpZiAvKiBEU1BBUElfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwY2hubC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGNobmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQ2YTUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGNobmwuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogZHNwY2hubC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERlY2xhcmVzIHRoZSB1cHBlciBlZGdlIGNoYW5uZWwgY2xhc3MgbGlicmFyeSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkKKyAqIGFsbCBCcmlkZ2UgZHJpdmVyIC8gRFNQIEFQSSBkcml2ZXIgaW50ZXJmYWNlIHRhYmxlcy4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogaW1wbGVtZW50ZWQgYnkgZXZlcnkgY2xhc3Mgb2YgQnJpZGdlIGNoYW5uZWwgbGlicmFyeS4KKyAqCisgKiBOb3RlczoKKyAqICAgVGhlIGZ1bmN0aW9uIGNvbW1lbnQgaGVhZGVycyByZXNpZGUgaW4gZHNwZGVmcy5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRFNQQ0hOTF8KKyNkZWZpbmUgRFNQQ0hOTF8KKworZXh0ZXJuIGludCBicmlkZ2VfY2hubF9jcmVhdGUoc3RydWN0IGNobmxfbWdyICoqY2hhbm5lbF9tZ3IsCisJCQkJICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgY2hubF9tZ3JhdHRycworCQkJCSAgICAgKm1ncl9hdHRydHMpOworCitleHRlcm4gaW50IGJyaWRnZV9jaG5sX2Rlc3Ryb3koc3RydWN0IGNobmxfbWdyICpoY2hubF9tZ3IpOworCitleHRlcm4gaW50IGJyaWRnZV9jaG5sX29wZW4oc3RydWN0IGNobmxfb2JqZWN0ICoqY2hubCwKKwkJCQkgICBzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21nciwKKwkJCQkgICBzOCBjaG5sX21vZGUsCisJCQkJICAgdTMyIGNoX2lkLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjaG5sX2F0dHIKKwkJCQkgICAqcGF0dHJzKTsKKworZXh0ZXJuIGludCBicmlkZ2VfY2hubF9jbG9zZShzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqKTsKKworZXh0ZXJuIGludCBicmlkZ2VfY2hubF9hZGRfaW9fcmVxKHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosCisJCQkJICAgICAgdm9pZCAqaG9zdF9idWYsCisJCQkJICAgICAgdTMyIGJ5dGVfc2l6ZSwgdTMyIGJ1Zl9zaXplLAorCQkJCSAgICAgIHUzMiBkd19kc3BfYWRkciwgdTMyIGR3X2FyZyk7CisKK2V4dGVybiBpbnQgYnJpZGdlX2NobmxfZ2V0X2lvYyhzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqLAorCQkJCSAgIHUzMiB0aW1lb3V0LCBzdHJ1Y3QgY2hubF9pb2MgKmNoYW5faW9jKTsKKworZXh0ZXJuIGludCBicmlkZ2VfY2hubF9jYW5jZWxfaW8oc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX29iaik7CisKK2V4dGVybiBpbnQgYnJpZGdlX2NobmxfZmx1c2hfaW8oc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX29iaiwKKwkJCQkgICAgdTMyIHRpbWVvdXQpOworCitleHRlcm4gaW50IGJyaWRnZV9jaG5sX2dldF9pbmZvKHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosCisJCQkJICAgIHN0cnVjdCBjaG5sX2luZm8gKmNoYW5uZWxfaW5mbyk7CisKK2V4dGVybiBpbnQgYnJpZGdlX2NobmxfZ2V0X21ncl9pbmZvKHN0cnVjdCBjaG5sX21nciAqaGNobmxfbWdyLAorCQkJCQl1MzIgY2hfaWQsIHN0cnVjdCBjaG5sX21ncmluZm8KKwkJCQkJKm1ncl9pbmZvKTsKKworZXh0ZXJuIGludCBicmlkZ2VfY2hubF9pZGxlKHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosCisJCQkJICAgdTMyIHRpbWVvdXQsIGJvb2wgZmx1c2hfZGF0YSk7CisKK2V4dGVybiBpbnQgYnJpZGdlX2NobmxfcmVnaXN0ZXJfbm90aWZ5KHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmosCisJCQkJCSAgIHUzMiBldmVudF9tYXNrLAorCQkJCQkgICB1MzIgbm90aWZ5X3R5cGUsCisJCQkJCSAgIHN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uCisJCQkJCSAgICpobm90aWZpY2F0aW9uKTsKKworI2VuZGlmIC8qIERTUENITkxfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGRlZnMuaApAQCAtMCwwICsxLDEwNTQgQEAKKy8qCisgKiBkc3BkZWZzLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQnJpZGdlIGRyaXZlciBlbnRyeSBwb2ludCBhbmQgaW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBOb3RlczoKKyAqICAgVGhlIERTUCBBUEkgb2J0YWlucyBpdCdzIGZ1bmN0aW9uIGludGVyZmFjZSB0bworICogICB0aGUgQnJpZGdlIGRyaXZlciB2aWEgYSBjYWxsIHRvIGJyaWRnZV9kcnZfZW50cnkoKS4KKyAqCisgKiAgIEJyaWRnZSBzZXJ2aWNlcyBleHBvcnRlZCB0byBCcmlkZ2UgZHJpdmVycyBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlCisgKiAgIERTUCBBUEkgb24gYmVoYWxmIG9mIHRoZSBCcmlkZ2UgZHJpdmVyLgorICoKKyAqICAgQnJpZGdlIGZ1bmN0aW9uIERCQyBSZXF1aXJlcyBhbmQgRW5zdXJlcyBhcmUgYWxzbyBtYWRlIGJ5IHRoZSBEU1AgQVBJIG9uCisgKiAgIGJlaGFsZiBvZiB0aGUgQnJpZGdlIGRyaXZlciwgdG8gc2ltcGxpZnkgdGhlIEJyaWRnZSBkcml2ZXIgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIERTUERFRlNfCisjZGVmaW5lIERTUERFRlNfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvYnJkZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmdkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Nobmxwcml2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RlaGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2ZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9pb2RlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbXNnZGVmcy5oPgorCisvKgorICogIEFueSBJT0NUTFMgYXQgb3IgYWJvdmUgdGhpcyB2YWx1ZSBhcmUgcmVzZXJ2ZWQgZm9yIHN0YW5kYXJkIEJyaWRnZSBkcml2ZXIKKyAqICBpbnRlcmZhY2VzLgorICovCisjZGVmaW5lIEJSRF9SRVNFUlZFRElPQ1RMQkFTRSAgIDB4ODAwMAorCisvKiBIYW5kbGUgdG8gQnJpZGdlIGRyaXZlcidzIHByaXZhdGUgZGV2aWNlIGNvbnRleHQuICovCitzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQlJJREdFIERSSVZFUiBGVU5DVElPTiBUWVBFUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX21vbml0b3IgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBCcmluZyB0aGUgYm9hcmQgdG8gdGhlIEJSRF9JRExFIChtb25pdG9yKSBzdGF0ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfY3R4dDogICAgSGFuZGxlIHRvIEJyaWRnZSBkcml2ZXIgZGVmaW5lZCBkZXZpY2UgY29udGV4dC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVUSU1FRE9VVDogIFRpbWVvdXQgb2NjdXJlZCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gaGFyZHdhcmUuCisgKiAgICAgIC1FUEVSTTogICAgICBPdGhlciwgdW5zcGVjaWZpZWQgZXJyb3IuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGRldl9jdHh0ICE9IE5VTEwKKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgQm9hcmQgaXMgaW4gQlJEX0lETEUgc3RhdGU7CisgKiAgICAgIGVsc2U6ICAgICAgICAgICBCb2FyZCBzdGF0ZSBpcyBpbmRldGVybWluYXRlLgorICovCit0eXBlZGVmIGludCgqZnhuX2JyZF9tb25pdG9yKSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQpOworCisvKgorICogID09PT09PT09IGZ4bl9icmRfc2V0c3RhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZXRzIHRoZSBCcmlkZ2UgZHJpdmVyIHN0YXRlCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2X2N0eHQ6ICAgIEhhbmRsZSB0byBCcmlkZ2UgZHJpdmVyIGRlZmluZWQgZGV2aWNlIGluZm8uCisgKiAgICAgIGJyZF9zdGF0ZTogICAgICBCb2FyZCBzdGF0ZQorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgT3RoZXIsIHVuc3BlY2lmaWVkIGVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfY3R4dCAhPSBOVUxMOworICogICAgICBicmRfc3RhdGUgIDw9IEJSRF9MQVNUU1RBVEUuCisgKiAgRW5zdXJlczoKKyAqICAgICAgYnJkX3N0YXRlICA8PSBCUkRfTEFTVFNUQVRFLgorICogIFVwZGF0ZSB0aGUgQm9hcmQgc3RhdGUgdG8gdGhlIHNwZWNpZmllZCBzdGF0ZS4KKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9icmRfc2V0c3RhdGUpIChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0CisJCQkJICAgICAgICogZGV2X2N0eHQsIHUzMiBicmRfc3RhdGUpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9icmRfc3RhcnQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBCcmluZyBib2FyZCB0byB0aGUgQlJEX1JVTk5JTkcgKHN0YXJ0KSBzdGF0ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfY3R4dDogICAgSGFuZGxlIHRvIEJyaWRnZSBkcml2ZXIgZGVmaW5lZCBkZXZpY2UgY29udGV4dC4KKyAqICAgICAgZHNwX2FkZHI6ICAgICAgIERTUCBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0YXJ0IGV4ZWN1dGlvbi4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVUSU1FRE9VVDogIFRpbWVvdXQgb2NjdXJlZCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZyb20gaGFyZHdhcmUuCisgKiAgICAgIC1FUEVSTTogICAgICBPdGhlciwgdW5zcGVjaWZpZWQgZXJyb3IuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGRldl9jdHh0ICE9IE5VTEwKKyAqICAgICAgQm9hcmQgaXMgaW4gbW9uaXRvciAoQlJEX0lETEUpIHN0YXRlLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICBCb2FyZCBpcyBpbiBCUkRfUlVOTklORyBzdGF0ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdHMgdG8gdGhlIFBDIGFyZSBlbmFibGVkLgorICogICAgICBlbHNlOiAgICAgICAgICAgQm9hcmQgc3RhdGUgaXMgaW5kZXRlcm1pbmF0ZS4KKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9icmRfc3RhcnQpIChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0CisJCQkJICAgICogZGV2X2N0eHQsIHUzMiBkc3BfYWRkcik7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2JyZF9tZW1fY29weSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgQ29weSBtZW1vcnkgZnJvbSBvbmUgRFNQIGFkZHJlc3MgdG8gYW5vdGhlcgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9jb250ZXh0OiAgICBQb2ludGVyIHRvIGNvbnRleHQgaGFuZGxlCisgKiAgZHNwX2Rlc3RfYWRkcjogIERTUCBhZGRyZXNzIHRvIGNvcHkgdG8KKyAqICBkc3Bfc3JjX2FkZHI6ICAgRFNQIGFkZHJlc3MgdG8gY29weSBmcm9tCisgKiAgdWxfbnVtX2J5dGVzOiBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogIG1lbV90eXBlOiAgIFdoYXQgc2VjdGlvbiBvZiBtZW1vcnkgdG8gY29weSB0bworICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgT3RoZXIsIHVuc3BlY2lmaWVkIGVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfY29udGV4dCAhPSBOVUxMCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgIEJvYXJkIGlzIGluIEJSRF9SVU5OSU5HIHN0YXRlLgorICogICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0cyB0byB0aGUgUEMgYXJlIGVuYWJsZWQuCisgKiAgICAgIGVsc2U6ICAgICAgICAgICBCb2FyZCBzdGF0ZSBpcyBpbmRldGVybWluYXRlLgorICovCit0eXBlZGVmIGludCgqZnhuX2JyZF9tZW1jb3B5KSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCSAgICAgICogZGV2X2N0eHQsCisJCQkJICAgICAgdTMyIGRzcF9kZXN0X2FkZHIsCisJCQkJICAgICAgdTMyIGRzcF9zcmNfYWRkciwKKwkJCQkgICAgICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgbWVtX3R5cGUpOworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX21lbV93cml0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFdyaXRlIGEgYmxvY2sgb2YgaG9zdCBtZW1vcnkgaW50byBhIERTUCBhZGRyZXNzLCBpbnRvIGEgZ2l2ZW4gbWVtb3J5CisgKiAgICAgIHNwYWNlLiAgVW5saWtlIGJyaWRnZV9icmRfd3JpdGUsIHRoaXMgQVBJIGRvZXMgcmVzZXQgdGhlIERTUAorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9jdHh0OiAgICBIYW5kbGUgdG8gQnJpZGdlIGRyaXZlciBkZWZpbmVkIGRldmljZSBpbmZvLgorICogICAgICBkc3BfYWRkcjogICAgICAgQWRkcmVzcyBvbiBEU1AgYm9hcmQgKERlc3RpbmF0aW9uKS4KKyAqICAgICAgaG9zdF9idWY6ICAgICAgIFBvaW50ZXIgdG8gaG9zdCBidWZmZXIgKFNvdXJjZSkuCisgKiAgICAgIHVsX251bV9ieXRlczogICAgIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KKyAqICAgICAgbWVtX3R5cGU6ICAgICAgIE1lbW9yeSBzcGFjZSBvbiBEU1AgdG8gd2hpY2ggdG8gdHJhbnNmZXIuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FVElNRURPVVQ6ICBUaW1lb3V0IG9jY3VyZWQgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIGhhcmR3YXJlLgorICogICAgICAtRVBFUk06ICAgICAgT3RoZXIsIHVuc3BlY2lmaWVkIGVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfY3R4dCAhPSBOVUxMOworICogICAgICBob3N0X2J1ZiAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpmeG5fYnJkX21lbXdyaXRlKSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCSAgICAgICAqIGRldl9jdHh0LAorCQkJCSAgICAgICB1OCAqaG9zdF9idWYsCisJCQkJICAgICAgIHUzMiBkc3BfYWRkciwgdTMyIHVsX251bV9ieXRlcywKKwkJCQkgICAgICAgdTMyIG1lbV90eXBlKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX21lbV9tYXAgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBNYXAgYSBNUFUgbWVtb3J5IHJlZ2lvbiB0byBhIERTUC9JVkEgbWVtb3J5IHNwYWNlCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2X2N0eHQ6ICAgIEhhbmRsZSB0byBCcmlkZ2UgZHJpdmVyIGRlZmluZWQgZGV2aWNlIGluZm8uCisgKiAgICAgIHVsX21wdV9hZGRyOiAgICAgIE1QVSBtZW1vcnkgcmVnaW9uIHN0YXJ0IGFkZHJlc3MuCisgKiAgICAgIHZpcnRfYWRkcjogICAgICBEU1AvSVZBIG1lbW9yeSByZWdpb24gdTggYWRkcmVzcy4KKyAqICAgICAgdWxfbnVtX2J5dGVzOiAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIG1hcC4KKyAqICAgICAgbWFwX2F0dHJzOiAgICAgICBNYXBwaW5nIGF0dHJpYnV0ZXMgKGUuZy4gZW5kaWFubmVzcykuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FUEVSTTogICAgICBPdGhlciwgdW5zcGVjaWZpZWQgZXJyb3IuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGRldl9jdHh0ICE9IE5VTEw7CisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9icmRfbWVtbWFwKSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCSAgICAgKiBkZXZfY3R4dCwgdTMyIHVsX21wdV9hZGRyLAorCQkJCSAgICAgdTMyIHZpcnRfYWRkciwgdTMyIHVsX251bV9ieXRlcywKKwkJCQkgICAgIHUzMiBtYXBfYXR0ciwKKwkJCQkgICAgIHN0cnVjdCBwYWdlICoqbWFwcGVkX3BhZ2VzKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX21lbV91bl9tYXAgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBVbk1hcCBhbiBNUFUgbWVtb3J5IHJlZ2lvbiBmcm9tIERTUC9JVkEgbWVtb3J5IHNwYWNlCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2X2N0eHQ6ICAgIEhhbmRsZSB0byBCcmlkZ2UgZHJpdmVyIGRlZmluZWQgZGV2aWNlIGluZm8uCisgKiAgICAgIHZpcnRfYWRkcjogICAgICBEU1AvSVZBIG1lbW9yeSByZWdpb24gdTggYWRkcmVzcy4KKyAqICAgICAgdWxfbnVtX2J5dGVzOiAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHVubWFwLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICAgICAgT3RoZXIsIHVuc3BlY2lmaWVkIGVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfY3R4dCAhPSBOVUxMOworICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpmeG5fYnJkX21lbXVubWFwKSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCSAgICAgICAqIGRldl9jdHh0LAorCQkJCSAgICAgICB1MzIgdmlydF9hZGRyLCB1MzIgdWxfbnVtX2J5dGVzKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfYnJkX3N0b3AgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBCcmluZyBib2FyZCB0byB0aGUgQlJEX1NUT1BQRUQgc3RhdGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2X2N0eHQ6ICAgIEhhbmRsZSB0byBCcmlkZ2UgZHJpdmVyIGRlZmluZWQgZGV2aWNlIGNvbnRleHQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FVElNRURPVVQ6ICBUaW1lb3V0IG9jY3VyZWQgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIGhhcmR3YXJlLgorICogICAgICAtRVBFUk06ICAgICAgT3RoZXIsIHVuc3BlY2lmaWVkIGVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfY3R4dCAhPSBOVUxMCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgIEJvYXJkIGlzIGluIEJSRF9TVE9QUEVEIChzdG9wKSBzdGF0ZTsKKyAqICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdHMgdG8gdGhlIFBDIGFyZSBkaXNhYmxlZC4KKyAqICAgICAgZWxzZTogICAgICAgICAgIEJvYXJkIHN0YXRlIGlzIGluZGV0ZXJtaW5hdGUuCisgKi8KK3R5cGVkZWYgaW50KCpmeG5fYnJkX3N0b3ApIChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCk7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2JyZF9zdGF0dXMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXBvcnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGJvYXJkLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9jdHh0OiAgICBIYW5kbGUgdG8gQnJpZGdlIGRyaXZlciBkZWZpbmVkIGRldmljZSBjb250ZXh0LgorICogICAgICBib2FyZF9zdGF0ZTogICAgUHRyIHRvIEJSRCBzdGF0dXMgdmFyaWFibGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgYm9hcmRfc3RhdGUgIT0gTlVMTDsKKyAqICAgICAgZGV2X2N0eHQgIT0gTlVMTAorICogIEVuc3VyZXM6CisgKiAgICAgICpib2FyZF9zdGF0ZSBpcyBvbmUgb2YKKyAqICAgICAgIHtCUkRfU1RPUFBFRCwgQlJEX0lETEUsIEJSRF9SVU5OSU5HLCBCUkRfVU5LTk9XTn07CisgKi8KK3R5cGVkZWYgaW50KCpmeG5fYnJkX3N0YXR1cykgKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCSAgICAgaW50ICpib2FyZF9zdGF0ZSk7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2JyZF9yZWFkID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVhZCBhIGJsb2NrIG9mIERTUCBtZW1vcnksIGZyb20gYSBnaXZlbiBtZW1vcnkgc3BhY2UsIGludG8gYSBob3N0CisgKiAgICAgIGJ1ZmZlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfY3R4dDogICAgSGFuZGxlIHRvIEJyaWRnZSBkcml2ZXIgZGVmaW5lZCBkZXZpY2UgaW5mby4KKyAqICAgICAgaG9zdF9idWY6ICAgICAgIFBvaW50ZXIgdG8gaG9zdCBidWZmZXIgKERlc3RpbmF0aW9uKS4KKyAqICAgICAgZHNwX2FkZHI6ICAgICAgIEFkZHJlc3Mgb24gRFNQIGJvYXJkIChTb3VyY2UpLgorICogICAgICB1bF9udW1fYnl0ZXM6ICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCisgKiAgICAgIG1lbV90eXBlOiAgICAgICBNZW1vcnkgc3BhY2Ugb24gRFNQIGZyb20gd2hpY2ggdG8gdHJhbnNmZXIuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FVElNRURPVVQ6ICBUaW1lb3V0IG9jY3VyZWQgd2FpdGluZyBmb3IgYSByZXNwb25zZSBmcm9tIGhhcmR3YXJlLgorICogICAgICAtRVBFUk06ICAgICAgT3RoZXIsIHVuc3BlY2lmaWVkIGVycm9yLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZfY3R4dCAhPSBOVUxMOworICogICAgICBob3N0X2J1ZiAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgV2lsbCBub3Qgd3JpdGUgbW9yZSB0aGFuIHVsX251bV9ieXRlcyBieXRlcyBpbnRvIGhvc3RfYnVmLgorICovCit0eXBlZGVmIGludCgqZnhuX2JyZF9yZWFkKSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgdTggKmhvc3RfYnVmLAorCQkJCSAgIHUzMiBkc3BfYWRkciwKKwkJCQkgICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgbWVtX3R5cGUpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9icmRfd3JpdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBXcml0ZSBhIGJsb2NrIG9mIGhvc3QgbWVtb3J5IGludG8gYSBEU1AgYWRkcmVzcywgaW50byBhIGdpdmVuIG1lbW9yeQorICogICAgICBzcGFjZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfY3R4dDogICAgSGFuZGxlIHRvIEJyaWRnZSBkcml2ZXIgZGVmaW5lZCBkZXZpY2UgaW5mby4KKyAqICAgICAgZHNwX2FkZHI6ICAgICAgIEFkZHJlc3Mgb24gRFNQIGJvYXJkIChEZXN0aW5hdGlvbikuCisgKiAgICAgIGhvc3RfYnVmOiAgICAgICBQb2ludGVyIHRvIGhvc3QgYnVmZmVyIChTb3VyY2UpLgorICogICAgICB1bF9udW1fYnl0ZXM6ICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCisgKiAgICAgIG1lbV90eXBlOiAgICAgICBNZW1vcnkgc3BhY2Ugb24gRFNQIHRvIHdoaWNoIHRvIHRyYW5zZmVyLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRVRJTUVET1VUOiAgVGltZW91dCBvY2N1cmVkIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSBoYXJkd2FyZS4KKyAqICAgICAgLUVQRVJNOiAgICAgIE90aGVyLCB1bnNwZWNpZmllZCBlcnJvci4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgZGV2X2N0eHQgIT0gTlVMTDsKKyAqICAgICAgaG9zdF9idWYgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqZnhuX2JyZF93cml0ZSkgKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCSAgICB1OCAqaG9zdF9idWYsCisJCQkJICAgIHUzMiBkc3BfYWRkciwKKwkJCQkgICAgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV90eXBlKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0LCByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBuZXcgY2hhbm5lbHMKKyAqICAgICAgYW5kIGNsb3Npbmcgb2xkIG9uZXMgZm9yIGEgZ2l2ZW4gJ0JyaWRnZSBib2FyZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBjaGFubmVsX21ncjogICAgTG9jYXRpb24gdG8gc3RvcmUgYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0IG9uIG91dHB1dC4KKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gYSBkZXZpY2Ugb2JqZWN0LgorICogICAgICBtZ3JfYXR0cnRzOiAgICAgIENoYW5uZWwgbWFuYWdlciBhdHRyaWJ1dGVzLgorICogICAgICBtZ3JfYXR0cnRzLT5tYXhfY2hhbm5lbHM6IE1heCBjaGFubmVscworICogICAgICBtZ3JfYXR0cnRzLT5iaXJxOiAgICAgIENoYW5uZWwncyBJL08gSVJRIG51bWJlci4KKyAqICAgICAgbWdyX2F0dHJ0cy0+aXJxX3NoYXJlZDogICBUUlVFIGlmIHRoZSBJUlEgaXMgc2hhcmVhYmxlLgorICogICAgICBtZ3JfYXR0cnRzLT53b3JkX3NpemU6IERTUCBXb3JkIHNpemUgaW4gZXF1aXZhbGVudCBQQyBieXRlcy4uCisgKiAgICAgIG1ncl9hdHRydHMtPnNobV9iYXNlOiAgQmFzZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHNoYXJlZCBtZW1vcnksIGlmIGFueS4KKyAqICAgICAgbWdyX2F0dHJ0cy0+dXNtX2xlbmd0aDogQnl0ZXMgb2Ygc2hhcmVkIG1lbW9yeSBibG9jay4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3M7CisgKiAgICAgIC1FTk9NRU06ICAgICAgICBJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciByZXF1ZXN0ZWQgcmVzb3VyY2VzLgorICogICAgICAtRUlPOiAgICAgICAgIFVuYWJsZSB0byBwbHVnIElTUiBmb3IgZ2l2ZW4gSVJRLgorICogICAgICAtRUZBVUxUOiAgICBDb3VsZG4ndCBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byBhIHZpcnR1YWwgb25lLgorICogIFJlcXVpcmVzOgorICogICAgICBjaGFubmVsX21nciAhPSBOVUxMLgorICogICAgICBtZ3JfYXR0cnRzICE9IE5VTEwKKyAqICAgICAgbWdyX2F0dHJ0cyBmaWVsZCBhcmUgYWxsIHZhbGlkOgorICogICAgICAgICAgMCA8IG1heF9jaGFubmVscyA8PSBDSE5MX01BWENIQU5ORUxTLgorICogICAgICAgICAgYmlycSA8PSAxNS4KKyAqICAgICAgICAgIHdvcmRfc2l6ZSA+IDAuCisgKiAgICAgIGhkZXZfb2JqICE9IE5VTEwKKyAqICAgICAgTm8gY2hhbm5lbCBtYW5hZ2VyIGV4aXN0cyBmb3IgdGhpcyBib2FyZC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqZnhuX2NobmxfY3JlYXRlKSAoc3RydWN0IGNobmxfbWdyCisJCQkJICAgICAgKipjaGFubmVsX21nciwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2X29iamVjdAorCQkJCSAgICAgICogaGRldl9vYmosCisJCQkJICAgICAgY29uc3Qgc3RydWN0CisJCQkJICAgICAgY2hubF9tZ3JhdHRycyAqIG1ncl9hdHRydHMpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2Rlc3Ryb3kgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDbG9zZSBhbGwgb3BlbiBjaGFubmVscywgYW5kIGRlc3Ryb3kgdGhlIGNoYW5uZWwgbWFuYWdlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoY2hubF9tZ3I6ICAgICAgIENoYW5uZWwgbWFuYWdlciBvYmplY3QuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIGhjaG5sX21nciB3YXMgaW52YWxpZC4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICogICAgICAwOiBDYW5jZWxzIEkvTyBvbiBlYWNoIG9wZW4gY2hhbm5lbC4gQ2xvc2VzIGVhY2ggb3BlbiBjaGFubmVsLgorICogICAgICAgICAgY2hubF9jcmVhdGUgbWF5IHN1YnNlcXVlbnRseSBiZSBjYWxsZWQgZm9yIHRoZSBzYW1lIGRldmljZS4KKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9jaG5sX2Rlc3Ryb3kpIChzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncik7CisvKgorICogID09PT09PT09IGJyaWRnZV9kZWhfbm90aWZ5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgV2hlbiBub3RpZmllZCBvZiBEU1AgZXJyb3IsIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhkZWhfbWdyOiAgICAgICAgSGFuZGxlIHRvIERFSCBtYW5hZ2VyIG9iamVjdC4KKyAqICAgICAgZXZudF9tYXNrOiAgICBJbmRpY2F0ZSB0aGUgdHlwZSBvZiBleGNlcHRpb24KKyAqICAgICAgZXJyb3JfaW5mbzogICAgRXJyb3IgaW5mb3JtYXRpb24KKyAqICBSZXR1cm5zOgorICoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgaGRlaF9tZ3IgIT0gTlVMTDsKKyAqICAgICBldm50X21hc2sgd2l0aCBhIHZhbGlkIGV4Y2VwdGlvbgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgdm9pZCAoKmZ4bl9kZWhfbm90aWZ5KSAoc3RydWN0IGRlaF9tZ3IgKmhkZWhfbWdyLAorCQkJCXUzMiBldm50X21hc2ssIHUzMiBlcnJvcl9pbmZvKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9vcGVuID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgT3BlbiBhIG5ldyBoYWxmLWR1cGxleCBjaGFubmVsIHRvIHRoZSBEU1AgYm9hcmQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY2hubDogICAgICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIGEgY2hhbm5lbCBvYmplY3QgaGFuZGxlLgorICogICAgICBoY2hubF9tZ3I6CUhhbmRsZSB0byBjaGFubmVsIG1hbmFnZXIsIGFzIHJldHVybmVkIGJ5CisgKiAgICAgIAkJQ0hOTF9HZXRNZ3IoKS4KKyAqICAgICAgY2hubF9tb2RlOiAgICAgICAgICBPbmUgb2Yge0NITkxfTU9ERVRPRFNQLCBDSE5MX01PREVGUk9NRFNQfSBzcGVjaWZpZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiBvZiBkYXRhIHRyYW5zZmVyLgorICogICAgICBjaF9pZDogICAgICAgIElmIENITkxfUElDS0ZSRUUgaXMgc3BlY2lmaWVkLCB0aGUgY2hhbm5lbCBtYW5hZ2VyIHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBhIGZyZWUgY2hhbm5lbCBpZCAoZGVmYXVsdCk7CisgKiAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIGlkIG9mIHRoZSBjaGFubmVsLgorICogICAgICBwYXR0cnM6ICAgICAgICAgQ2hhbm5lbCBhdHRyaWJ1dGVzLiAgQXR0cmlidXRlIGZpZWxkcyBhcmUgYXMgZm9sbG93czoKKyAqICAgICAgcGF0dHJzLT51aW9fcmVxczogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBJL08gcmVxdWVzdHMgd2hpY2ggY2FuCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwZW5kaW5nIGF0IGFueSBnaXZlbiB0aW1lLiBBbGwgcmVxdWVzdCBwYWNrZXRzIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkIHdoZW4gdGhlIGNoYW5uZWwgaXMgb3BlbmVkLgorICogICAgICBwYXR0cnMtPmV2ZW50X29iajogVGhpcyBmaWVsZCBhbGxvd3MgdGhlIHVzZXIgdG8gc3VwcGx5IGFuIGF1dG8gcmVzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IG9iamVjdCBmb3IgY2hhbm5lbCBJL08gY29tcGxldGlvbiBub3RpZmljYXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGRlc3Ryb3kgdGhpcworICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IEFGVEVSIGNsb3NpbmcgdGhlIGNoYW5uZWwuCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNoYW5uZWwgZXZlbnQgb2JqZWN0IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgIENITkxfR2V0RXZlbnRIYW5kbGUoKS4KKyAqICAgICAgcGF0dHJzLT5oUmVzZXJ2ZWQ6IFRoZSBrZXJuZWwgbW9kZSBoYW5kbGUgb2YgdGhpcyBldmVudCBvYmplY3QuCisgKgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgICAgICAgICAgaGNobmxfbWdyIGlzIGludmFsaWQuCisgKiAgICAgIC1FTk9NRU06ICAgICAgICAgICAgSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcmVxdWVzdGVkIHJlc291cmNlcy4KKyAqICAgICAgLUVJTlZBTDogICAgICAgIEludmFsaWQgbnVtYmVyIG9mIElPUmVxcy4KKyAqICAgICAgLUVOT1NSOiAgICBObyBmcmVlIGNoYW5uZWxzIGF2YWlsYWJsZS4KKyAqICAgICAgLUVDSFJORzogICAgICAgQ2hhbm5lbCBJRCBpcyBvdXQgb2YgcmFuZ2UuCisgKiAgICAgIC1FQUxSRUFEWTogICAgICAgIENoYW5uZWwgaXMgaW4gdXNlLgorICogICAgICAtRUlPOiAgICAgICAgIE5vIGZyZWUgSU8gcmVxdWVzdCBwYWNrZXRzIGF2YWlsYWJsZSBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWluZy4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgY2hubCAhPSBOVUxMLgorICogICAgICBwYXR0cnMgIT0gTlVMTC4KKyAqICAgICAgcGF0dHJzLT5ldmVudF9vYmogaXMgYSB2YWxpZCBldmVudCBoYW5kbGUuCisgKiAgICAgIHBhdHRycy0+aFJlc2VydmVkIGlzIHRoZSBrZXJuZWwgbW9kZSBoYW5kbGUgZm9yIHBhdHRycy0+ZXZlbnRfb2JqLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAgICAgICAgICpjaG5sIGlzIGEgdmFsaWQgY2hhbm5lbC4KKyAqICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgKmNobmwgaXMgc2V0IHRvIE5VTEwgaWYgKGNobmwgIT0gTlVMTCk7CisgKi8KK3R5cGVkZWYgaW50KCpmeG5fY2hubF9vcGVuKSAoc3RydWN0IGNobmxfb2JqZWN0CisJCQkJICAgICoqY2hubCwKKwkJCQkgICAgc3RydWN0IGNobmxfbWdyICpoY2hubF9tZ3IsCisJCQkJICAgIHM4IGNobmxfbW9kZSwKKwkJCQkgICAgdTMyIGNoX2lkLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QKKwkJCQkgICAgY2hubF9hdHRyICogcGF0dHJzKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9jbG9zZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVuc3VyZXMgYWxsIHBlbmRpbmcgSS9PIG9uIHRoaXMgY2hhbm5lbCBpcyBjYW5jZWxsZWQsIGRpc2NhcmRzIGFsbAorICogICAgICBxdWV1ZWQgSS9PIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgdGhlbiBmcmVlcyB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZAorICogICAgICBmb3IgdGhpcyBjaGFubmVsLCBhbmQgbWFrZXMgdGhlIGNvcnJlc3BvbmRpbmcgbG9naWNhbCBjaGFubmVsIGlkCisgKiAgICAgIGF2YWlsYWJsZSBmb3Igc3Vic2VxdWVudCB1c2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY2hubF9vYmo6ICAgICAgICAgIEhhbmRsZSB0byBhIGNoYW5uZWwgb2JqZWN0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzOworICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGNobmxfb2JqLgorICogIFJlcXVpcmVzOgorICogICAgICBObyB0aHJlYWQgbXVzdCBiZSBibG9ja2VkIG9uIHRoaXMgY2hhbm5lbCdzIEkvTyBjb21wbGV0aW9uIGV2ZW50LgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICBjaG5sX29iaiBpcyBubyBsb25nZXIgdmFsaWQuCisgKi8KK3R5cGVkZWYgaW50KCpmeG5fY2hubF9jbG9zZSkgKHN0cnVjdCBjaG5sX29iamVjdCAqY2hubF9vYmopOworCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2FkZF9pb19yZXEgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBFbnF1ZXVlIGFuIEkvTyByZXF1ZXN0IGZvciBkYXRhIHRyYW5zZmVyIG9uIGEgY2hhbm5lbCB0byB0aGUgRFNQLgorICogICAgICBUaGUgZGlyZWN0aW9uIChtb2RlKSBpcyBzcGVjaWZpZWQgaW4gdGhlIGNoYW5uZWwgb2JqZWN0LiBOb3RlIHRoZSBEU1AKKyAqICAgICAgYWRkcmVzcyBpcyBzcGVjaWZpZWQgZm9yIGNoYW5uZWxzIG9wZW5lZCBpbiBkaXJlY3QgSS9PIG1vZGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY2hubF9vYmo6ICAgICAgICAgIENoYW5uZWwgb2JqZWN0IGhhbmRsZS4KKyAqICAgICAgaG9zdF9idWY6ICAgICAgIEhvc3QgYnVmZmVyIGFkZHJlc3Mgc291cmNlLgorICogICAgICBieXRlX3NpemU6CU51bWJlciBvZiBQQyBieXRlcyB0byB0cmFuc2Zlci4gQSB6ZXJvIHZhbHVlIGluZGljYXRlcworICogICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGlzIGJ1ZmZlciBpcyB0aGUgbGFzdCBpbiB0aGUgb3V0cHV0IGNoYW5uZWwuCisgKiAgICAgICAgICAgICAgICAgICAgICBBIHplcm8gdmFsdWUgaXMgaW52YWxpZCBmb3IgYW4gaW5wdXQgY2hhbm5lbC4KKyAqISAgICAgYnVmX3NpemU6ICAgICAgIEFjdHVhbCBidWZmZXIgc2l6ZSBpbiBob3N0IGJ5dGVzLgorICogICAgICBkd19kc3BfYWRkcjogICAgICBEU1AgYWRkcmVzcyBmb3IgdHJhbnNmZXIuICAoQ3VycmVudGx5IGlnbm9yZWQpLgorICogICAgICBkd19hcmc6ICAgICAgICAgIEEgdXNlciBhcmd1bWVudCB0aGF0IHRyYXZlbHMgd2l0aCB0aGUgYnVmZmVyLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzOworICogICAgICAtRUZBVUxUOiBJbnZhbGlkIGNobmxfb2JqIG9yIGhvc3RfYnVmLgorICogICAgICAtRVBFUk06ICAgVXNlciBjYW5ub3QgbWFyayBFT1Mgb24gYW4gaW5wdXQgY2hhbm5lbC4KKyAqICAgICAgLUVDQU5DRUxFRDogSS9PIGhhcyBiZWVuIGNhbmNlbGxlZCBvbiB0aGlzIGNoYW5uZWwuICBObyBmdXJ0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICBJL08gaXMgYWxsb3dlZC4KKyAqICAgICAgLUVQSVBFOiAgICAgRW5kIG9mIHN0cmVhbSB3YXMgYWxyZWFkeSBtYXJrZWQgb24gYSBwcmV2aW91cworICogICAgICAgICAgICAgICAgICAgICAgSU9SZXF1ZXN0IG9uIHRoaXMgY2hhbm5lbC4gIE5vIGZ1cnRoZXIgSS9PIGlzIGV4cGVjdGVkLgorICogICAgICAtRUlOVkFMOiBCdWZmZXIgc3VibWl0dGVkIHRvIHRoaXMgb3V0cHV0IGNoYW5uZWwgaXMgbGFyZ2VyIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBwaHlzaWNhbCBzaGFyZWQgbWVtb3J5IG91dHB1dCB3aW5kb3cuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogVGhlIGJ1ZmZlciB3aWxsIGJlIHRyYW5zZmVycmVkIGlmIHRoZSBjaGFubmVsIGlzIHJlYWR5OworICogICAgICAgICAgb3RoZXJ3aXNlLCB3aWxsIGJlIHF1ZXVlZCBmb3IgdHJhbnNmZXIgd2hlbiB0aGUgY2hhbm5lbCBiZWNvbWVzCisgKiAgICAgICAgICByZWFkeS4gIEluIGFueSBjYXNlLCBub3RpZmljYXRpb25zIG9mIEkvTyBjb21wbGV0aW9uIGFyZQorICogICAgICAgICAgYXN5bmNocm9ub3VzLgorICogICAgICAgICAgSWYgYnl0ZV9zaXplIGlzIDAgZm9yIGFuIG91dHB1dCBjaGFubmVsLCBzdWJzZXF1ZW50IENITkxfQWRkSU9SZXEncworICogICAgICAgICAgb24gdGhpcyBjaGFubmVsIHdpbGwgZmFpbCB3aXRoIGVycm9yIGNvZGUgLUVQSVBFLiAgVGhlCisgKiAgICAgICAgICBjb3JyZXNwb25kaW5nIElPQyBmb3IgdGhpcyBJL08gcmVxdWVzdCB3aWxsIGhhdmUgaXRzIHN0YXR1cyBmbGFnCisgKiAgICAgICAgICBzZXQgdG8gQ0hOTF9JT0NTVEFURU9TLgorICovCit0eXBlZGVmIGludCgqZnhuX2NobmxfYWRkaW9yZXEpIChzdHJ1Y3QgY2hubF9vYmplY3QKKwkJCQkJKiBjaG5sX29iaiwKKwkJCQkJdm9pZCAqaG9zdF9idWYsCisJCQkJCXUzMiBieXRlX3NpemUsCisJCQkJCXUzMiBidWZfc2l6ZSwKKwkJCQkJdTMyIGR3X2RzcF9hZGRyLCB1MzIgZHdfYXJnKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9nZXRfaW9jID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVxdWV1ZSBhbiBJL08gY29tcGxldGlvbiByZWNvcmQsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogICAgICBjb21wbGV0ZWQgSS9PIHJlcXVlc3QuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY2hubF9vYmo6ICAgICAgICAgIENoYW5uZWwgb2JqZWN0IGhhbmRsZS4KKyAqICAgICAgdGltZW91dDogICAgICAgIEEgdmFsdWUgb2YgQ0hOTF9JT0NOT1dBSVQgd2lsbCBzaW1wbHkgZGVxdWV1ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGF2YWlsYWJsZSBJT0MuCisgKiAgICAgIGNoYW5faW9jOiAgICAgICBPbiBvdXRwdXQsIGNvbnRhaW5zIGhvc3QgYnVmZmVyIGFkZHJlc3MsIGJ5dGVzCisgKiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCwgYW5kIHN0YXR1cyBvZiBJL08gY29tcGxldGlvbi4KKyAqICAgICAgY2hhbl9pb2MtPnN0YXR1czogICBTZWUgY2hubGRlZnMuaC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogSW52YWxpZCBjaG5sX29iaiBvciBjaGFuX2lvYy4KKyAqICAgICAgLUVSRU1PVEVJTzogICBDSE5MX0lPQ05PV0FJVCB3YXMgc3BlY2lmaWVkIGFzIHRoZSB0aW1lb3V0IHBhcmFtZXRlcgorICogICAgICAgICAgICAgICAgICAgICAgeWV0IG5vIEkvTyBjb21wbGV0aW9ucyB3ZXJlIHF1ZXVlZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgdGltZW91dCA9PSBDSE5MX0lPQ05PV0FJVC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiBpZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBJT0MncyBxdWV1ZWQgYmVmb3JlIHRoaXMgY2FsbAorICogICAgICAgICAgcmV0dXJucywgdGhlIGNoYW5uZWwgZXZlbnQgb2JqZWN0IHdpbGwgYmUgbGVmdCBpbiBhIHNpZ25hbGxlZAorICogICAgICAgICAgc3RhdGUuCisgKi8KK3R5cGVkZWYgaW50KCpmeG5fY2hubF9nZXRpb2MpIChzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqLAorCQkJCSAgICAgIHUzMiB0aW1lb3V0LAorCQkJCSAgICAgIHN0cnVjdCBjaG5sX2lvYyAqY2hhbl9pb2MpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2NhbmNlbF9pbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybiBhbGwgSS9PIHJlcXVlc3RzIHRvIHRoZSBjbGllbnQgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KKyAqICAgICAgdHJhbnNmZXJyZWQuICBUaGUgY2hhbm5lbCdzIEkvTyBjb21wbGV0aW9uIG9iamVjdCBpcworICogICAgICBzaWduYWxsZWQsIGFuZCBhbGwgdGhlIEkvTyByZXF1ZXN0cyBhcmUgcXVldWVkIGFzIElPQydzLCB3aXRoIHRoZQorICogICAgICBzdGF0dXMgZmllbGQgc2V0IHRvIENITkxfSU9DU1RBVENBTkNFTC4KKyAqICAgICAgVGhpcyBjYWxsIGlzIHR5cGljYWxseSB1c2VkIGluIGFib3J0IHNpdHVhdGlvbnMsIGFuZCBpcyBhIHByZWx1ZGUgdG8KKyAqICAgICAgY2hubF9jbG9zZSgpOworICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNobmxfb2JqOiAgICAgICAgICBDaGFubmVsIG9iamVjdCBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3M7CisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgY2hubF9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgU3Vic2VxdWVudCBJL08gcmVxdWVzdHMgdG8gdGhpcyBjaGFubmVsIHdpbGwgbm90IGJlIGFjY2VwdGVkLgorICovCit0eXBlZGVmIGludCgqZnhuX2NobmxfY2FuY2VsaW8pIChzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9mbHVzaF9pbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZvciBhbiBvdXRwdXQgc3RyZWFtICh0byB0aGUgRFNQKSwgaW5kaWNhdGVzIGlmIGFueSBJTyByZXF1ZXN0cyBhcmUgaW4KKyAqICAgICAgdGhlIG91dHB1dCByZXF1ZXN0IHF1ZXVlLiAgRm9yIGlucHV0IHN0cmVhbXMgKGZyb20gdGhlIERTUCksIHdpbGwKKyAqICAgICAgY2FuY2VsIGFsbCBwZW5kaW5nIElPIHJlcXVlc3RzLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNobmxfb2JqOiAgICAgICAgICAgICAgQ2hhbm5lbCBvYmplY3QgaGFuZGxlLgorICogICAgICB0aW1lb3V0OiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgZm9yIGZsdXNoIG9wZXJhdGlvbi4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3M7CisgKiAgICAgIFNfQ0hOTElPUkVRVUVTVDogICAgUmV0dXJuZWQgaWYgYW55IElPUmVxdWVzdHMgYXJlIGluIHRoZSBvdXRwdXQgcXVldWUuCisgKiAgICAgIC1FRkFVTFQ6ICAgICAgICBJbnZhbGlkIGNobmxfb2JqLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAgICAgTm8gSS9PIHJlcXVlc3RzIHdpbGwgYmUgcGVuZGluZyBvbiB0aGlzIGNoYW5uZWwuCisgKi8KK3R5cGVkZWYgaW50KCpmeG5fY2hubF9mbHVzaGlvKSAoc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX29iaiwKKwkJCQkgICAgICAgdTMyIHRpbWVvdXQpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2dldF9pbmZvID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIGNoYW5uZWwuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgY2hubF9vYmo6ICAgICAgICAgIEhhbmRsZSB0byBhIHZhbGlkIGNoYW5uZWwgb2JqZWN0LCBvciBOVUxMLgorICogICAgICBjaGFubmVsX2luZm86ICAgTG9jYXRpb24gdG8gc3RvcmUgY2hhbm5lbCBpbmZvLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzOworICogICAgICAtRUZBVUxUOiBJbnZhbGlkIGNobmxfb2JqIG9yIGNoYW5uZWxfaW5mby4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgY2hhbm5lbF9pbmZvIHBvaW50cyB0byBhIGZpbGxlZCBpbiBjaG5sX2luZm8gc3RydWN0LAorICogICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxfaW5mbyAhPSBOVUxMKS4KKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9jaG5sX2dldGluZm8pIChzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqLAorCQkJCSAgICAgICBzdHJ1Y3QgY2hubF9pbmZvICpjaGFubmVsX2luZm8pOworCisvKgorICogID09PT09PT09IGJyaWRnZV9jaG5sX2dldF9tZ3JfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGNoYW5uZWwgbWFuYWdlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoY2hubF9tZ3I6ICAgICAgICAgICBIYW5kbGUgdG8gYSB2YWxpZCBjaGFubmVsIG1hbmFnZXIsIG9yIE5VTEwuCisgKiAgICAgIGNoX2lkOiAgICAgICAgICAgIENoYW5uZWwgSUQuCisgKiAgICAgIG1ncl9pbmZvOiAgICAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgY2hhbm5lbCBtYW5hZ2VyIGluZm8uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzOworICogICAgICAtRUZBVUxUOiBJbnZhbGlkIGhjaG5sX21nciBvciBtZ3JfaW5mby4KKyAqICAgICAgLUVDSFJORzogICBJbnZhbGlkIGNoYW5uZWwgSUQuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgICAgICBtZ3JfaW5mbyBwb2ludHMgdG8gYSBmaWxsZWQgaW4gY2hubF9tZ3JpbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LCBpZiAobWdyX2luZm8gIT0gTlVMTCkuCisgKi8KK3R5cGVkZWYgaW50KCpmeG5fY2hubF9nZXRtZ3JpbmZvKSAoc3RydWN0IGNobmxfbWdyCisJCQkJCSAgKiBoY2hubF9tZ3IsCisJCQkJCSAgdTMyIGNoX2lkLAorCQkJCQkgIHN0cnVjdCBjaG5sX21ncmluZm8gKm1ncl9pbmZvKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfY2hubF9pZGxlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSWRsZSBhIGNoYW5uZWwuIElmIHRoaXMgaXMgYW4gaW5wdXQgY2hhbm5lbCwgb3IgaWYgdGhpcyBpcyBhbiBvdXRwdXQKKyAqICAgICAgY2hhbm5lbCBhbmQgZmx1c2hfZGF0YSBpcyBUUlVFLCBhbGwgY3VycmVudGx5IGVucXVldWVkIGJ1ZmZlcnMgd2lsbCBiZQorICogICAgICBkZXF1ZXVlZCAoZGF0YSBkaXNjYXJkZWQgZm9yIG91dHB1dCBjaGFubmVsKS4KKyAqICAgICAgSWYgdGhpcyBpcyBhbiBvdXRwdXQgY2hhbm5lbCBhbmQgZmx1c2hfZGF0YSBpcyBGQUxTRSwgdGhpcyBmdW5jdGlvbgorICogICAgICB3aWxsIGJsb2NrIHVudGlsIGFsbCBjdXJyZW50bHkgYnVmZmVyZWQgZGF0YSBpcyBvdXRwdXQsIG9yIHRoZSB0aW1lb3V0CisgKiAgICAgIHNwZWNpZmllZCBoYXMgYmVlbiByZWFjaGVkLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBjaG5sX29iajogICAgICAgICAgQ2hhbm5lbCBvYmplY3QgaGFuZGxlLgorICogICAgICB0aW1lb3V0OiAgICAgICAgSWYgb3V0cHV0IGNoYW5uZWwgYW5kIGZsdXNoX2RhdGEgaXMgRkFMU0UsIHRpbWVvdXQgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHdhaXQgZm9yIGJ1ZmZlcnMgdG8gYmUgb3V0cHV0LiAoTm90IHVzZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBjaGFubmVsKS4KKyAqICAgICAgZmx1c2hfZGF0YTogICAgIElmIG91dHB1dCBjaGFubmVsIGFuZCBmbHVzaF9kYXRhIGlzIFRSVUUsIGRpc2NhcmQgYW55CisgKiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgYnVmZmVyZWQgZGF0YS4gSWYgRkFMU0UsIHdhaXQgZm9yIGN1cnJlbnRseQorICogICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgZGF0YSB0byBiZSBvdXRwdXQsIG9yIHRpbWVvdXQsIHdoaWNoZXZlcgorICogICAgICAgICAgICAgICAgICAgICAgb2NjdXJzIGZpcnN0LiBmbHVzaF9kYXRhIGlzIGlnbm9yZWQgZm9yIGlucHV0IGNoYW5uZWwuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzOworICogICAgICAtRUZBVUxUOiAgICAgICAgSW52YWxpZCBjaG5sX29iai4KKyAqICAgICAgLUVUSU1FRE9VVDogVGltZW91dCBvY2N1cmVkIGJlZm9yZSBjaGFubmVsIGNvdWxkIGJlIGlkbGVkLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpmeG5fY2hubF9pZGxlKSAoc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX29iaiwKKwkJCQkgICAgdTMyIHRpbWVvdXQsIGJvb2wgZmx1c2hfZGF0YSk7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2NobmxfcmVnaXN0ZXJfbm90aWZ5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBldmVudHMgb24gYSBjaGFubmVsLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGNobmxfb2JqOiAgICAgICAgICBDaGFubmVsIG9iamVjdCBoYW5kbGUuCisgKiAgICAgIGV2ZW50X21hc2s6ICAgICBUeXBlIG9mIGV2ZW50cyB0byBiZSBub3RpZmllZCBhYm91dDogSU8gY29tcGxldGlvbgorICogICAgICAgICAgICAgICAgICAgICAgKERTUF9TVFJFQU1JT0NPTVBMRVRJT04pIG9yIGVuZCBvZiBzdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgICAgIChEU1BfU1RSRUFNRE9ORSkuCisgKiAgICAgIG5vdGlmeV90eXBlOiAgICBEU1BfU0lHTkFMRVZFTlQuCisgKiAgICAgIGhub3RpZmljYXRpb246ICBIYW5kbGUgb2YgYSBkc3Bfbm90aWZpY2F0aW9uIG9iamVjdC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgSW5zdWZmaWNpZW50IG1lbW9yeS4KKyAqICAgICAgLUVJTlZBTDogICAgIGV2ZW50X21hc2sgaXMgMCBhbmQgaG5vdGlmaWNhdGlvbiB3YXMgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHJlZ2lzdGVyZWQuCisgKiAgICAgIC1FRkFVTFQ6ICAgIE5VTEwgaG5vdGlmaWNhdGlvbiwgaG5vdGlmaWNhdGlvbiBldmVudCBuYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICB0b28gbG9uZywgb3IgaG5vdGlmaWNhdGlvbiBldmVudCBuYW1lIE5VTEwuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFZhbGlkIGNobmxfb2JqLgorICogICAgICBobm90aWZpY2F0aW9uICE9IE5VTEwuCisgKiAgICAgIChldmVudF9tYXNrICYgfihEU1BfU1RSRUFNSU9DT01QTEVUSU9OIHwgRFNQX1NUUkVBTURPTkUpKSA9PSAwLgorICogICAgICBub3RpZnlfdHlwZSA9PSBEU1BfU0lHTkFMRVZFTlQuCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9jaG5sX3JlZ2lzdGVybm90aWZ5KQorIChzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqLAorICB1MzIgZXZlbnRfbWFzaywgdTMyIG5vdGlmeV90eXBlLCBzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbiAqaG5vdGlmaWNhdGlvbik7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2Rldl9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDb21wbGV0ZSBjcmVhdGlvbiBvZiB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhpcyBib2FyZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VfY3R4OiAgICAgUHRyIHRvIGxvY2F0aW9uIHRvIHN0b3JlIGEgQnJpZGdlIGRldmljZSBjb250ZXh0LgorICogICAgICBoZGV2X29iajogICAgIEhhbmRsZSB0byBhIERldmljZSBPYmplY3QsIGNyZWF0ZWQgYW5kIG1hbmFnZWQgYnkgRFNQIEFQSS4KKyAqICAgICAgY29uZmlnX3BhcmFtOiAgICAgICAgUHRyIHRvIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gTWFuYWdlciBkdXJpbmcgZGV2aWNlIGxvYWRpbmcuCisgKiAgICAgIHBEc3BDb25maWc6ICAgICBEU1AgcmVzb3VyY2VzLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHJlZ2lzdHJ5IGtleSBmb3IgdGhpcworICogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgICAgIFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBjb250ZXh0LgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZpY2VfY3R4ICE9IE5VTEw7CisgKiAgICAgIGhkZXZfb2JqICE9IE5VTEw7CisgKiAgICAgIGNvbmZpZ19wYXJhbSAhPSBOVUxMOworICogICAgICBwRHNwQ29uZmlnICE9IE5VTEw7CisgKiAgICAgIEZpZWxkcyBpbiBjb25maWdfcGFyYW0gYW5kIHBEc3BDb25maWcgY29udGFpbiB2YWxpZCB2YWx1ZXMuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgIEFsbCBCcmlkZ2UgZHJpdmVyIHNwZWNpZmljIERTUCByZXNvdXJjZSBhbmQgb3RoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIGJvYXJkIGNvbnRleHQgaGFzIGJlZW4gYWxsb2NhdGVkLgorICogICAgICAtRU5PTUVNOiAgICBCcmlkZ2UgZmFpbGVkIHRvIGFsbG9jYXRlIHJlc291cmNlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFueSBhY3F1aXJlZCByZXNvdXJjZXMgaGF2ZSBiZWVuIGZyZWVkLiAgVGhlIERTUCBBUEkKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgbm90IGNhbGwgYnJpZGdlX2Rldl9kZXN0cm95KCkgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZV9kZXZfY3JlYXRlKCkgZmFpbHMuCisgKiAgRGV0YWlsczoKKyAqICAgICAgQ2FsbGVkIGR1cmluZyB0aGUgQ09ORklHTUcncyBEZXZpY2VfSW5pdCBwaGFzZS4gQmFzZWQgb24gaG9zdCBhbmQKKyAqICAgICAgRFNQIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIGNyZWF0ZSBhIGJvYXJkIGNvbnRleHQsIGEgaGFuZGxlIHRvCisgKiAgICAgIHdoaWNoIGlzIHBhc3NlZCBpbnRvIG90aGVyIEJyaWRnZSBCUkQgYW5kIENITkwgZnVuY3Rpb25zLiAgVGhlCisgKiAgICAgIGJvYXJkIGNvbnRleHQgY29udGFpbnMgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBkZXZpY2UuIFNpbmNlIHRoZQorICogICAgICBhZGRyZXNzZXMgb2YgYWxsIHBvaW50ZXIgcGFyYW1ldGVycyBtYXkgYmUgaW52YWxpZCB3aGVuIHRoaXMKKyAqICAgICAgZnVuY3Rpb24gcmV0dXJucywgdGhleSBtdXN0IG5vdCBiZSBzdG9yZWQgaW50byB0aGUgZGV2aWNlIGNvbnRleHQKKyAqICAgICAgc3RydWN0dXJlLgorICovCit0eXBlZGVmIGludCgqZnhuX2Rldl9jcmVhdGUpIChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0CisJCQkJICAgICAqKmRldmljZV9jdHgsCisJCQkJICAgICBzdHJ1Y3QgZGV2X29iamVjdAorCQkJCSAgICAgKiBoZGV2X29iaiwKKwkJCQkgICAgIHN0cnVjdCBjZmdfaG9zdHJlcworCQkJCSAgICAgKiBjb25maWdfcGFyYW0pOworCisvKgorICogID09PT09PT09IGJyaWRnZV9kZXZfY3RybCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEJyaWRnZSBkcml2ZXIgc3BlY2lmaWMgaW50ZXJmYWNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9jdHh0OiAgICBIYW5kbGUgdG8gQnJpZGdlIGRyaXZlciBkZWZpbmVkIGRldmljZSBpbmZvLgorICogICAgICBkd19jbWQ6ICAgICAgICAgIEJyaWRnZSBkcml2ZXIgZGVmaW5lZCBjb21tYW5kIGNvZGUuCisgKiAgICAgIHBhcmdzOiAgICAgICAgICBQb2ludGVyIHRvIGFuIGFyYml0cmFyeSBhcmd1bWVudCBzdHJ1Y3R1cmUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCBvciAtRVBFUk0uIEFjdHVhbCBjb21tYW5kIGVycm9yIGNvZGVzIHNob3VsZCBiZSBwYXNzZWQgYmFjayBpbgorICogICAgICB0aGUgcGFyZ3Mgc3RydWN0dXJlLCBhbmQgYXJlIGRlZmluZWQgYnkgdGhlIEJyaWRnZSBkcml2ZXIgaW1wbGVtZW50b3IuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIEFsbCBjYWxscyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYmUgc3luY2hyb25vdXMuICBUaGVyZSBhcmUgbm8KKyAqICAgICAgSU9DVEwgY29tcGxldGlvbiByb3V0aW5lcyBwcm92aWRlZC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqZnhuX2Rldl9jdHJsKSAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkJICAgdTMyIGR3X2NtZCwgdm9pZCAqcGFyZ3MpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9kZXZfZGVzdHJveSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlYWxsb2NhdGUgQnJpZGdlIGRldmljZSBleHRlbnNpb24gc3RydWN0dXJlcyBhbmQgYWxsIG90aGVyIHJlc291cmNlcworICogICAgICBhY3F1aXJlZCBieSB0aGUgQnJpZGdlIGRyaXZlci4KKyAqICAgICAgTm8gY2FsbHMgdG8gb3RoZXIgQnJpZGdlIGRyaXZlciBmdW5jdGlvbnMgbWF5IHN1YnNlcXVlbnRseQorICogICAgICBvY2N1ciwgZXhjZXB0IGZvciBicmlkZ2VfZGV2X2NyZWF0ZSgpLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldl9jdHh0OiAgICBIYW5kbGUgdG8gQnJpZGdlIGRyaXZlciBkZWZpbmVkIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWxlZCB0byByZWxlYXNlIGEgcmVzb3VyY2UgcHJldmlvdXNseSBhY3F1aXJlZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgZGV2X2N0eHQgIT0gTlVMTDsKKyAqICBFbnN1cmVzOgorICogICAgICAwOiBEZXZpY2UgY29udGV4dCBpcyBmcmVlZC4KKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9kZXZfZGVzdHJveSkgKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfaW9fY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hbmFnZXMgSS9PIGJldHdlZW4gQ0hOTCBhbmQgbXNnX2N0cmwuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaW9fbWFuOiAgICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIElPIG1hbmFnZXIgb24gb3V0cHV0LgorICogICAgICBoY2hubF9tZ3I6ICAgICAgIEhhbmRsZSB0byBjaGFubmVsIG1hbmFnZXIuCisgKiAgICAgIGhtc2dfbWdyOiAgICAgICAgSGFuZGxlIHRvIG1lc3NhZ2UgbWFuYWdlci4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KKyAqICAgICAgLUVQRVJNOiAgICAgIENyZWF0aW9uIGZhaWxlZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgaGRldl9vYmogIT0gTlVMTDsKKyAqICAgICAgQ2hhbm5lbCBtYW5hZ2VyIGFscmVhZHkgY3JlYXRlZDsKKyAqICAgICAgTWVzc2FnZSBtYW5hZ2VyIGFscmVhZHkgY3JlYXRlZDsKKyAqICAgICAgbWdyX2F0dHJ0cyAhPSBOVUxMOworICogICAgICBpb19tYW4gIT0gTlVMTDsKKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqZnhuX2lvX2NyZWF0ZSkgKHN0cnVjdCBpb19tZ3IgKippb19tYW4sCisJCQkJICAgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGlvX2F0dHJzICptZ3JfYXR0cnRzKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfaW9fZGVzdHJveSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlc3Ryb3kgb2JqZWN0IGNyZWF0ZWQgaW4gYnJpZGdlX2lvX2NyZWF0ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgICAgIElPIE1hbmFnZXIuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FTk9NRU06ICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuCisgKiAgICAgIC1FUEVSTTogICAgICBDcmVhdGlvbiBmYWlsZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFZhbGlkIGhpb19tZ3I7CisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9pb19kZXN0cm95KSAoc3RydWN0IGlvX21nciAqaGlvX21ncik7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2lvX29uX2xvYWRlZCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENhbGxlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbG9hZGVkIHRvIHVwZGF0ZSBpbnRlcm5hbCBkYXRhLiBGb3IKKyAqICAgICAgZXhhbXBsZSwgaWYgc2hhcmVkIG1lbW9yeSBpcyB1c2VkLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHVwZGF0ZSB0aGUKKyAqICAgICAgc2hhcmVkIG1lbW9yeSBsb2NhdGlvbiBhbmQgYWRkcmVzcy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgSU8gTWFuYWdlci4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICBJbnRlcm5hbCBmYWlsdXJlIG9jY3VycmVkLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBoaW9fbWdyOworICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpmeG5faW9fb25sb2FkZWQpIChzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyKTsKKworLyoKKyAqICA9PT09PT09PSBmeG5faW9fZ2V0cHJvY2xvYWQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDYWxsZWQgdG8gZ2V0IHRoZSBQcm9jZXNzb3IncyBjdXJyZW50IGFuZCBwcmVkaWN0ZWQgbG9hZAorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhpb19tZ3I6ICAgICBJTyBNYW5hZ2VyLgorICogICAgICBwcm9jX2xvYWRfc3RhdCAgIFByb2Nlc3NvciBMb2FkIHN0YXRpc3RpY3MKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICBTdWNjZXNzLgorICogICAgICAtRVBFUk06ICBJbnRlcm5hbCBmYWlsdXJlIG9jY3VycmVkLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBoaW9fbWdyOworICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpmeG5faW9fZ2V0cHJvY2xvYWQpIChzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyLAorCQkJCQkgc3RydWN0IGRzcF9wcm9jbG9hZHN0YXQgKgorCQkJCQkgcHJvY19sb2FkX3N0YXQpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGFuIG9iamVjdCB0byBtYW5hZ2UgbWVzc2FnZSBxdWV1ZXMuIE9ubHkgb25lIG9mIHRoZXNlIG9iamVjdHMKKyAqICAgICAgY2FuIGV4aXN0IHBlciBkZXZpY2Ugb2JqZWN0LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1zZ19tYW46ICAgICAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgbXNnX2N0cmwgbWFuYWdlciBvbiBvdXRwdXQuCisgKiAgICAgIGhkZXZfb2JqOiAgICAgICAgIEhhbmRsZSB0byBhIGRldmljZSBvYmplY3QuCisgKiAgICAgIG1zZ19jYWxsYmFjazogICAgICAgIENhbGxlZCB3aGVuZXZlciBhbiBSTVNfRVhJVCBtZXNzYWdlIGlzIHJlY2VpdmVkLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgICAgIEluc3VmZmljaWVudCBtZW1vcnkuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG1zZ19tYW4gIT0gTlVMTC4KKyAqICAgICAgbXNnX2NhbGxiYWNrICE9IE5VTEwuCisgKiAgICAgIGhkZXZfb2JqICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9tc2dfY3JlYXRlKQorIChzdHJ1Y3QgbXNnX21nciAqKm1zZ19tYW4sCisgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwgbXNnX29uZXhpdCBtc2dfY2FsbGJhY2spOworCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfY3JlYXRlX3F1ZXVlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGEgbXNnX2N0cmwgcXVldWUgZm9yIHNlbmRpbmcgb3IgcmVjZWl2aW5nIG1lc3NhZ2VzIGZyb20gYSBNZXNzYWdlCisgKiAgICAgIG5vZGUgb24gdGhlIERTUC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobXNnX21ncjogICAgICAgICAgICBtc2dfY3RybCBxdWV1ZSBtYW5hZ2VyIGhhbmRsZSByZXR1cm5lZCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlX21zZ19jcmVhdGUuCisgKiAgICAgIG1zZ3E6ICAgICAgICAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgbXNnX2N0cmwgcXVldWUgb24gb3V0cHV0LgorICogICAgICBtc2dxX2lkOgkgICAgSWRlbnRpZmllciBmb3IgbWVzc2FnZXMgKG5vZGUgZW52aXJvbm1lbnQgcG9pbnRlcikuCisgKiAgICAgIG1heF9tc2dzOiAgICAgICAgICAgTWF4IG51bWJlciBvZiBzaW11bHRhbmVvdXMgbWVzc2FnZXMgZm9yIHRoZSBub2RlLgorICogICAgICBoOiAgICAgICAgICAgICAgICAgIEhhbmRsZSBwYXNzZWQgdG8gaG1zZ19tZ3ItPm1zZ19jYWxsYmFjaygpLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgICAgIEluc3VmZmljaWVudCBtZW1vcnkuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG1zZ3EgIT0gTlVMTC4KKyAqICAgICAgaCAhPSBOVUxMLgorICogICAgICBtYXhfbXNncyA+IDAuCisgKiAgRW5zdXJlczoKKyAqICAgICAgbXNncSAhPU5VTEwgPD09PiAwLgorICovCit0eXBlZGVmIGludCgqZnhuX21zZ19jcmVhdGVxdWV1ZSkKKyAoc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyLAorICBzdHJ1Y3QgbXNnX3F1ZXVlICoqbXNncSwgdTMyIG1zZ3FfaWQsIHUzMiBtYXhfbXNncywgdm9pZCAqaCk7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX21zZ19kZWxldGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWxldGUgYSBtc2dfY3RybCBtYW5hZ2VyIGFsbG9jYXRlZCBpbiBicmlkZ2VfbXNnX2NyZWF0ZSgpLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhtc2dfbWdyOiAgICBIYW5kbGUgcmV0dXJuZWQgZnJvbSBicmlkZ2VfbXNnX2NyZWF0ZSgpLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFZhbGlkIGhtc2dfbWdyLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgdm9pZCAoKmZ4bl9tc2dfZGVsZXRlKSAoc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfbXNnX2RlbGV0ZV9xdWV1ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlbGV0ZSBhIG1zZ19jdHJsIHF1ZXVlIGFsbG9jYXRlZCBpbiBicmlkZ2VfbXNnX2NyZWF0ZV9xdWV1ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBtc2dfcXVldWVfb2JqOiAgSGFuZGxlIHRvIG1zZ19jdHJsIHF1ZXVlIHJldHVybmVkIGZyb20KKyAqICAgICAgICAgICAgICAgICAgYnJpZGdlX21zZ19jcmVhdGVfcXVldWUuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgbXNnX3F1ZXVlX29iai4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIHZvaWQgKCpmeG5fbXNnX2RlbGV0ZXF1ZXVlKSAoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaik7CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX21zZ19nZXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHZXQgYSBtZXNzYWdlIGZyb20gYSBtc2dfY3RybCBxdWV1ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBtc2dfcXVldWVfb2JqOiAgICAgSGFuZGxlIHRvIG1zZ19jdHJsIHF1ZXVlIHJldHVybmVkIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgYnJpZGdlX21zZ19jcmVhdGVfcXVldWUuCisgKiAgICAgIHBtc2c6ICAgICAgICAgIExvY2F0aW9uIHRvIGNvcHkgbWVzc2FnZSBpbnRvLgorICogICAgICB1dGltZW91dDogICAgICBUaW1lb3V0IHRvIHdhaXQgZm9yIGEgbWVzc2FnZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICBTdWNjZXNzLgorICogICAgICAtRVRJTUU6ICBUaW1lb3V0IG9jY3VycmVkLgorICogICAgICAtRVBFUk06ICAgICBObyBmcmFtZXMgYXZhaWxhYmxlIGZvciBtZXNzYWdlIChtYXhfbXNncyB0b28KKyAqICAgICAgICAgICAgICAgICAgICAgc21hbGwpLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBtc2dfcXVldWVfb2JqLgorICogICAgICBwbXNnICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9tc2dfZ2V0KSAoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaiwKKwkJCQkgIHN0cnVjdCBkc3BfbXNnICpwbXNnLCB1MzIgdXRpbWVvdXQpOworCisvKgorICogID09PT09PT09IGJyaWRnZV9tc2dfcHV0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUHV0IGEgbWVzc2FnZSBvbnRvIGEgbXNnX2N0cmwgcXVldWUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbXNnX3F1ZXVlX29iajogICAgICBIYW5kbGUgdG8gbXNnX2N0cmwgcXVldWUgcmV0dXJuZWQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgYnJpZGdlX21zZ19jcmVhdGVfcXVldWUuCisgKiAgICAgIHBtc2c6ICAgICAgICAgICBQb2ludGVyIHRvIG1lc3NhZ2UuCisgKiAgICAgIHV0aW1lb3V0OiAgICAgICBUaW1lb3V0IHRvIHdhaXQgZm9yIGEgbWVzc2FnZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVUSU1FOiAgIFRpbWVvdXQgb2NjdXJyZWQuCisgKiAgICAgIC1FUEVSTTogICAgICBObyBmcmFtZXMgYXZhaWxhYmxlIGZvciBtZXNzYWdlIChtYXhfbXNncyB0b28KKyAqICAgICAgICAgICAgICAgICAgICAgIHNtYWxsKS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgbXNnX3F1ZXVlX29iai4KKyAqICAgICAgcG1zZyAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpmeG5fbXNnX3B1dCkgKHN0cnVjdCBtc2dfcXVldWUgKm1zZ19xdWV1ZV9vYmosCisJCQkJICBjb25zdCBzdHJ1Y3QgZHNwX21zZyAqcG1zZywgdTMyIHV0aW1lb3V0KTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfbXNnX3JlZ2lzdGVyX25vdGlmeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVyIG5vdGlmaWNhdGlvbiBmb3Igd2hlbiBhIG1lc3NhZ2UgaXMgcmVhZHkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbXNnX3F1ZXVlX29iajogICAgICBIYW5kbGUgdG8gbXNnX2N0cmwgcXVldWUgcmV0dXJuZWQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgYnJpZGdlX21zZ19jcmVhdGVfcXVldWUuCisgKiAgICAgIGV2ZW50X21hc2s6ICAgICBUeXBlIG9mIGV2ZW50cyB0byBiZSBub3RpZmllZCBhYm91dDogTXVzdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgRFNQX05PREVNRVNTQUdFUkVBRFksIG9yIDAgdG8gdW5yZWdpc3Rlci4KKyAqICAgICAgbm90aWZ5X3R5cGU6ICAgIERTUF9TSUdOQUxFVkVOVC4KKyAqICAgICAgaG5vdGlmaWNhdGlvbjogIEhhbmRsZSBvZiBub3RpZmljYXRpb24gb2JqZWN0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICBJbnN1ZmZpY2llbnQgbWVtb3J5LgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBtc2dfcXVldWVfb2JqLgorICogICAgICBobm90aWZpY2F0aW9uICE9IE5VTEwuCisgKiAgICAgIG5vdGlmeV90eXBlID09IERTUF9TSUdOQUxFVkVOVC4KKyAqICAgICAgZXZlbnRfbWFzayA9PSBEU1BfTk9ERU1FU1NBR0VSRUFEWSB8fCBldmVudF9tYXNrID09IDAuCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKmZ4bl9tc2dfcmVnaXN0ZXJub3RpZnkpCisgKHN0cnVjdCBtc2dfcXVldWUgKm1zZ19xdWV1ZV9vYmosCisgIHUzMiBldmVudF9tYXNrLCB1MzIgbm90aWZ5X3R5cGUsIHN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uICpobm90aWZpY2F0aW9uKTsKKworLyoKKyAqICA9PT09PT09PSBicmlkZ2VfbXNnX3NldF9xdWV1ZV9pZCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNldCBtZXNzYWdlIHF1ZXVlIGlkIHRvIG5vZGUgZW52aXJvbm1lbnQuIEFsbG93cyBicmlkZ2VfbXNnX2NyZWF0ZV9xdWV1ZQorICogICAgICB0byBiZSBjYWxsZWQgaW4gbm9kZV9hbGxvY2F0ZSwgYmVmb3JlIHRoZSBub2RlIGVudmlyb25tZW50IGlzIGtub3duLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG1zZ19xdWV1ZV9vYmo6ICBIYW5kbGUgdG8gbXNnX2N0cmwgcXVldWUgcmV0dXJuZWQgZnJvbQorICogICAgICAgICAgICAgICAgICBicmlkZ2VfbXNnX2NyZWF0ZV9xdWV1ZS4KKyAqICAgICAgbXNncV9pZDogICAgICAgTm9kZSBlbnZpcm9ubWVudCBwb2ludGVyLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFZhbGlkIG1zZ19xdWV1ZV9vYmouCisgKiAgICAgIG1zZ3FfaWQgIT0gMC4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIHZvaWQgKCpmeG5fbXNnX3NldHF1ZXVlaWQpIChzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqLAorCQkJCSAgICB1MzIgbXNncV9pZCk7CisKKy8qCisgKiAgQnJpZGdlIERyaXZlciBpbnRlcmZhY2UgZnVuY3Rpb24gdGFibGUuCisgKgorICogIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlIGlzIGZpbGxlZCBpbiBieSB0aGUgc3BlY2lmaWMgQnJpZGdlIGRyaXZlciwKKyAqICBhbmQgY29waWVkIGludG8gdGhlIERTUCBBUEkncyBvd24gc3BhY2UuICBJZiBhbnkgaW50ZXJmYWNlCisgKiAgZnVuY3Rpb24gZmllbGQgaXMgc2V0IHRvIGEgdmFsdWUgb2YgTlVMTCwgdGhlbiB0aGUgRFNQIEFQSSB3aWxsCisgKiAgY29uc2lkZXIgdGhhdCBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQsIGFuZCByZXR1cm4gdGhlIGVycm9yIGNvZGUKKyAqICAtRU5PU1lTIHdoZW4gYSBCcmlkZ2UgZHJpdmVyIGNsaWVudCBhdHRlbXB0cyB0byBjYWxsIHRoYXQgZnVuY3Rpb24uCisgKgorICogIFRoaXMgZnVuY3Rpb24gdGFibGUgY29udGFpbnMgRFNQIEFQSSB2ZXJzaW9uIG51bWJlcnMsIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZQorICogIEJyaWRnZSBkcml2ZXIgbG9hZGVyIHRvIGhlbHAgZW5zdXJlIGJhY2t3YXJkcyBjb21wYXRpbGl0eSBiZXR3ZWVuIG9sZGVyCisgKiAgQnJpZGdlIGRyaXZlcnMgYW5kIG5ld2VyIERTUCBBUEkuICBUaGVzZSBtdXN0IGJlIHNldCB0bworICogIEJSRF9BUElfTUFKT1JfVkVSU0lPTiBhbmQgQlJEX0FQSV9NSU5PUl9WRVJTSU9OLCByZXNwZWN0aXZlbHkuCisgKgorICogIEEgQnJpZGdlIGRyaXZlciBuZWVkIG5vdCBleHBvcnQgYSBDSE5MIGludGVyZmFjZS4gIEluIHRoaXMgY2FzZSwgKmFsbCogb2YKKyAqICB0aGUgYnJpZGdlX2NobmxfKiBlbnRyaWVzIG11c3QgYmUgc2V0IHRvIE5VTEwuCisgKi8KK3N0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSB7CisJdTMyIGJyZF9hcGlfbWFqb3JfdmVyc2lvbjsJLyogU2V0IHRvIEJSRF9BUElfTUFKT1JfVkVSU0lPTi4gKi8KKwl1MzIgYnJkX2FwaV9taW5vcl92ZXJzaW9uOwkvKiBTZXQgdG8gQlJEX0FQSV9NSU5PUl9WRVJTSU9OLiAqLworCWZ4bl9kZXZfY3JlYXRlIHBmbl9kZXZfY3JlYXRlOwkvKiBDcmVhdGUgZGV2aWNlIGNvbnRleHQgKi8KKwlmeG5fZGV2X2Rlc3Ryb3kgcGZuX2Rldl9kZXN0cm95OwkvKiBEZXN0cm95IGRldmljZSBjb250ZXh0ICovCisJZnhuX2Rldl9jdHJsIHBmbl9kZXZfY250cmw7CS8qIE9wdGlvbmFsIHZlbmRvciBpbnRlcmZhY2UgKi8KKwlmeG5fYnJkX21vbml0b3IgcGZuX2JyZF9tb25pdG9yOwkvKiBMb2FkIGFuZC9vciBzdGFydCBtb25pdG9yICovCisJZnhuX2JyZF9zdGFydCBwZm5fYnJkX3N0YXJ0OwkvKiBTdGFydCBEU1AgcHJvZ3JhbS4gKi8KKwlmeG5fYnJkX3N0b3AgcGZuX2JyZF9zdG9wOwkvKiBTdG9wL3Jlc2V0IGJvYXJkLiAqLworCWZ4bl9icmRfc3RhdHVzIHBmbl9icmRfc3RhdHVzOwkvKiBHZXQgY3VycmVudCBib2FyZCBzdGF0dXMuICovCisJZnhuX2JyZF9yZWFkIHBmbl9icmRfcmVhZDsJLyogUmVhZCBib2FyZCBtZW1vcnkgKi8KKwlmeG5fYnJkX3dyaXRlIHBmbl9icmRfd3JpdGU7CS8qIFdyaXRlIGJvYXJkIG1lbW9yeS4gKi8KKwlmeG5fYnJkX3NldHN0YXRlIHBmbl9icmRfc2V0X3N0YXRlOwkvKiBTZXRzIHRoZSBCb2FyZCBTdGF0ZSAqLworCWZ4bl9icmRfbWVtY29weSBwZm5fYnJkX21lbV9jb3B5OwkvKiBDb3BpZXMgRFNQIE1lbW9yeSAqLworCWZ4bl9icmRfbWVtd3JpdGUgcGZuX2JyZF9tZW1fd3JpdGU7CS8qIFdyaXRlIERTUCBNZW1vcnkgdy9vIGhhbHQgKi8KKwlmeG5fYnJkX21lbW1hcCBwZm5fYnJkX21lbV9tYXA7CS8qIE1hcHMgTVBVIG1lbSB0byBEU1AgbWVtICovCisJZnhuX2JyZF9tZW11bm1hcCBwZm5fYnJkX21lbV91bl9tYXA7CS8qIFVubWFwcyBNUFUgbWVtIHRvIERTUCBtZW0gKi8KKwlmeG5fY2hubF9jcmVhdGUgcGZuX2NobmxfY3JlYXRlOwkvKiBDcmVhdGUgY2hhbm5lbCBtYW5hZ2VyLiAqLworCWZ4bl9jaG5sX2Rlc3Ryb3kgcGZuX2NobmxfZGVzdHJveTsJLyogRGVzdHJveSBjaGFubmVsIG1hbmFnZXIuICovCisJZnhuX2Nobmxfb3BlbiBwZm5fY2hubF9vcGVuOwkvKiBDcmVhdGUgYSBuZXcgY2hhbm5lbC4gKi8KKwlmeG5fY2hubF9jbG9zZSBwZm5fY2hubF9jbG9zZTsJLyogQ2xvc2UgYSBjaGFubmVsLiAqLworCWZ4bl9jaG5sX2FkZGlvcmVxIHBmbl9jaG5sX2FkZF9pb19yZXE7CS8qIFJlcSBJL08gb24gYSBjaGFubmVsLiAqLworCWZ4bl9jaG5sX2dldGlvYyBwZm5fY2hubF9nZXRfaW9jOwkvKiBXYWl0IGZvciBJL08gY29tcGxldGlvbi4gKi8KKwlmeG5fY2hubF9jYW5jZWxpbyBwZm5fY2hubF9jYW5jZWxfaW87CS8qIENhbmNsIEkvTyBvbiBhIGNoYW5uZWwuICovCisJZnhuX2NobmxfZmx1c2hpbyBwZm5fY2hubF9mbHVzaF9pbzsJLyogRmx1c2ggSS9PLiAqLworCWZ4bl9jaG5sX2dldGluZm8gcGZuX2NobmxfZ2V0X2luZm87CS8qIEdldCBjaGFubmVsIHNwZWNpZmljIGluZm8gKi8KKwkvKiBHZXQgY2hhbm5lbCBtYW5hZ2VyIGluZm8uICovCisJZnhuX2NobmxfZ2V0bWdyaW5mbyBwZm5fY2hubF9nZXRfbWdyX2luZm87CisJZnhuX2NobmxfaWRsZSBwZm5fY2hubF9pZGxlOwkvKiBJZGxlIHRoZSBjaGFubmVsICovCisJLyogUmVnaXN0ZXIgZm9yIG5vdGlmLiAqLworCWZ4bl9jaG5sX3JlZ2lzdGVybm90aWZ5IHBmbl9jaG5sX3JlZ2lzdGVyX25vdGlmeTsKKwlmeG5faW9fY3JlYXRlIHBmbl9pb19jcmVhdGU7CS8qIENyZWF0ZSBJTyBtYW5hZ2VyICovCisJZnhuX2lvX2Rlc3Ryb3kgcGZuX2lvX2Rlc3Ryb3k7CS8qIERlc3Ryb3kgSU8gbWFuYWdlciAqLworCWZ4bl9pb19vbmxvYWRlZCBwZm5faW9fb25fbG9hZGVkOwkvKiBOb3RpZnkgb2YgcHJvZ3JhbSBsb2FkZWQgKi8KKwkvKiBHZXQgUHJvY2Vzc29yJ3MgY3VycmVudCBhbmQgcHJlZGljdGVkIGxvYWQgKi8KKwlmeG5faW9fZ2V0cHJvY2xvYWQgcGZuX2lvX2dldF9wcm9jX2xvYWQ7CisJZnhuX21zZ19jcmVhdGUgcGZuX21zZ19jcmVhdGU7CS8qIENyZWF0ZSBtZXNzYWdlIG1hbmFnZXIgKi8KKwkvKiBDcmVhdGUgbWVzc2FnZSBxdWV1ZSAqLworCWZ4bl9tc2dfY3JlYXRlcXVldWUgcGZuX21zZ19jcmVhdGVfcXVldWU7CisJZnhuX21zZ19kZWxldGUgcGZuX21zZ19kZWxldGU7CS8qIERlbGV0ZSBtZXNzYWdlIG1hbmFnZXIgKi8KKwkvKiBEZWxldGUgbWVzc2FnZSBxdWV1ZSAqLworCWZ4bl9tc2dfZGVsZXRlcXVldWUgcGZuX21zZ19kZWxldGVfcXVldWU7CisJZnhuX21zZ19nZXQgcGZuX21zZ19nZXQ7CS8qIEdldCBhIG1lc3NhZ2UgKi8KKwlmeG5fbXNnX3B1dCBwZm5fbXNnX3B1dDsJLyogU2VuZCBhIG1lc3NhZ2UgKi8KKwkvKiBSZWdpc3RlciBmb3Igbm90aWYuICovCisJZnhuX21zZ19yZWdpc3Rlcm5vdGlmeSBwZm5fbXNnX3JlZ2lzdGVyX25vdGlmeTsKKwkvKiBTZXQgbWVzc2FnZSBxdWV1ZSBpZCAqLworCWZ4bl9tc2dfc2V0cXVldWVpZCBwZm5fbXNnX3NldF9xdWV1ZV9pZDsKK307CisKKy8qCisgKiAgPT09PT09PT0gYnJpZGdlX2Rydl9lbnRyeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVycyBCcmlkZ2UgZHJpdmVyIGZ1bmN0aW9ucyB3aXRoIHRoZSBEU1AgQVBJLiBDYWxsZWQgb25seSBvbmNlCisgKiAgICAgIGJ5IHRoZSBEU1AgQVBJLiAgVGhlIGNhbGxlciB3aWxsIGZpcnN0IGNoZWNrIERTUCBBUEkgdmVyc2lvbgorICogICAgICBjb21wYXRpYmlsaXR5LCBhbmQgdGhlbiBjb3B5IHRoZSBpbnRlcmZhY2UgZnVuY3Rpb25zIGludG8gaXRzIG93bgorICogICAgICBtZW1vcnkgc3BhY2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZHJ2X2ludGYgIFBvaW50ZXIgdG8gYSBsb2NhdGlvbiB0byByZWNlaXZlIGEgcG9pbnRlciB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIEJyaWRnZSBkcml2ZXIgaW50ZXJmYWNlLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFRoZSBjb2RlIHNlZ21lbnQgdGhpcyBmdW5jdGlvbiByZXNpZGVzIGluIG11c3QgZXhwZWN0IHRvIGJlIGRpc2NhcmRlZAorICogICAgICBhZnRlciBjb21wbGV0aW9uLgorICogIEVuc3VyZXM6CisgKiAgICAgIGRydl9pbnRmIHBvaW50ZXIgaW5pdGlhbGl6ZWQgdG8gQnJpZGdlIGRyaXZlcidzIGZ1bmN0aW9uCisgKiAgICAgIGludGVyZmFjZS4gTm8gc3lzdGVtIHJlc291cmNlcyBhcmUgYWNxdWlyZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqICBEZXRhaWxzOgorICogICAgICBDYWxsZWQgZHVyaW5nIHRoZSBEZXZpY2VfSW5pdCBwaGFzZS4KKyAqLwordm9pZCBicmlkZ2VfZHJ2X2VudHJ5KHN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqKmRydl9pbnRmLAorCQkgICBjb25zdCBjaGFyICpkcml2ZXJfZmlsZV9uYW1lKTsKKworI2VuZGlmIC8qIERTUERFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwZGVoLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwZGVoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1OGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kc3BkZWguaApAQCAtMCwwICsxLDQzIEBACisvKgorICogZHNwZGVoLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRGVmaW5lcyB1cHBlciBlZGdlIERFSCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgYWxsIEJyaWRnZSBkcml2ZXIvRFNQIEFQSQorICogaW50ZXJmYWNlIHRhYmxlcy4KKyAqCisgKiBOb3RlczoKKyAqICAgRnVuY3Rpb24gY29tbWVudCBoZWFkZXJzIHJlc2lkZSB3aXRoIHRoZSBmdW5jdGlvbiB0eXBlZGVmcyBpbiBkc3BkZWZzLmguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBGZWxpcGUgQ29udHJlcmFzCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRFNQREVIXworI2RlZmluZSBEU1BERUhfCisKK3N0cnVjdCBkZWhfbWdyOworc3RydWN0IGRldl9vYmplY3Q7CitzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbjsKKworaW50IGJyaWRnZV9kZWhfY3JlYXRlKHN0cnVjdCBkZWhfbWdyICoqcmV0X2RlaCwKKwkJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKTsKKworaW50IGJyaWRnZV9kZWhfZGVzdHJveShzdHJ1Y3QgZGVoX21nciAqZGVoKTsKKworaW50IGJyaWRnZV9kZWhfcmVnaXN0ZXJfbm90aWZ5KHN0cnVjdCBkZWhfbWdyICpkZWgsCisJCXUzMiBldmVudF9tYXNrLAorCQl1MzIgbm90aWZ5X3R5cGUsCisJCXN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uICpobm90aWZpY2F0aW9uKTsKKwordm9pZCBicmlkZ2VfZGVoX25vdGlmeShzdHJ1Y3QgZGVoX21nciAqZGVoLCBpbnQgZXZlbnQsIGludCBpbmZvKTsKKworI2VuZGlmIC8qIERTUERFSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kc3BkcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kc3BkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmIyNTBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcGRydi5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBkc3BkcnYuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBUaGlzIGlzIHRoZSBTdHJlYW0gSW50ZXJmYWNlIGZvciB0aGUgRFNwIEFQSS4KKyAqIEFsbCBEZXZpY2Ugb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHZpYSBEZXZpY2VJT0NvbnRyb2wuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmICFkZWZpbmVkIF9EU1BEUlZfSF8KKyNkZWZpbmUgX0RTUERSVl9IXworCisjZGVmaW5lIE1BWF9ERVYgICAgIDEwCQkvKiBNYXggc3VwcG9ydCBvZiAxMCBkZXZpY2VzICovCisKKy8qCisgKiAgPT09PT09PT0gZHNwX2RlaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERldmljZSBNYW5hZ2VyIHRvIGRlLWluaXRpYWxpemUgYSBkZXZpY2UuCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBieSBhcHBsaWNhdGlvbnMuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlX2NvbnRleHQ6SGFuZGxlIHRvIHRoZSBkZXZpY2UgY29udGV4dC4gVGhlIFhYWF9Jbml0IGZ1bmN0aW9uCisgKiAgICAgIGNyZWF0ZXMgYW5kIHJldHVybnMgdGhpcyBpZGVudGlmaWVyLgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaW5kaWNhdGVzIHRoZSBkZXZpY2Ugc3VjY2Vzc2Z1bGx5IGRlLWluaXRpYWxpemVkLiBPdGhlcndpc2UgaXQKKyAqICAgICAgcmV0dXJucyBGQUxTRS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgZGV2aWNlX2NvbnRleHQhPSBOVUxMLiBGb3IgYSBidWlsdCBpbiBkZXZpY2UgdGhpcyBzaG91bGQgbmV2ZXIKKyAqICAgICAgZ2V0IGNhbGxlZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gYm9vbCBkc3BfZGVpbml0KHUzMiBkZXZpY2VfY29udGV4dCk7CisKKy8qCisgKiAgPT09PT09PT0gZHNwX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBEZXZpY2UgTWFuYWdlciB0byBpbml0aWFsaXplIGEgZGV2aWNlLgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgYnkgYXBwbGljYXRpb25zCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZHdfY29udGV4dDogIFNwZWNpZmllcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVnaXN0cnkKKyAqICAgICAgICAgICAgICAgICAgcGF0aCB0byB0aGUgYWN0aXZlIGtleSBmb3IgdGhlIHN0cmVhbSBpbnRlcmZhY2UgZHJpdmVyLgorICogICAgICAgICAgICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkVcRHJpdmVyc1xBY3RpdmUKKyAqICBSZXR1cm5zOgorICogICAgICBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBkZXZpY2UgY29udGV4dCBjcmVhdGVkLiBUaGlzIGlzIHRoZSBvdXIgYWN0dWFsCisgKiAgICAgIERldmljZSBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBEU1AgRGV2aWNlIGluc3RhbmNlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKiAgICAgIFN1Y2NlZWRlZDogIGRldmljZSBjb250ZXh0ID4gMAorICogICAgICBGYWlsZWQ6ICAgICBkZXZpY2UgQ29udGV4dCA9IDAKKyAqLworZXh0ZXJuIHUzMiBkc3BfaW5pdCh1MzIgKmluaXRfc3RhdHVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kc3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjVmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwaW8uaApAQCAtMCwwICsxLDQxIEBACisvKgorICogZHNwaW8uaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEZWNsYXJlcyB0aGUgdXBwZXIgZWRnZSBJTyBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgYWxsIEJyaWRnZSBkcml2ZXIgL0RTUCBBUEkKKyAqIGludGVyZmFjZSB0YWJsZXMuCisgKgorICogTm90ZXM6CisgKiAgIEZ1bmN0aW9uIGNvbW1lbnQgaGVhZGVycyByZXNpZGUgaW4gZHNwZGVmcy5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRFNQSU9fCisjZGVmaW5lIERTUElPXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RldmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaW9kZWZzLmg+CisKK2V4dGVybiBpbnQgYnJpZGdlX2lvX2NyZWF0ZShzdHJ1Y3QgaW9fbWdyICoqaW9fbWFuLAorCQkJCSAgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaW9fYXR0cnMgKm1ncl9hdHRydHMpOworCitleHRlcm4gaW50IGJyaWRnZV9pb19kZXN0cm95KHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IpOworCitleHRlcm4gaW50IGJyaWRnZV9pb19vbl9sb2FkZWQoc3RydWN0IGlvX21nciAqaGlvX21ncik7CisKK2V4dGVybiBpbnQgaXZhX2lvX29uX2xvYWRlZChzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyKTsKK2V4dGVybiBpbnQgYnJpZGdlX2lvX2dldF9wcm9jX2xvYWQoc3RydWN0IGlvX21nciAqaGlvX21nciwKKwkJCQkgICAgICAgc3RydWN0IGRzcF9wcm9jbG9hZHN0YXQgKnByb2NfbHN0YXQpOworCisjZW5kaWYgLyogRFNQSU9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9kc3Bpb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTA1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwaW9jdGwuaApAQCAtMCwwICsxLDczIEBACisvKgorICogZHNwaW9jdGwuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBCcmlkZ2UgZHJpdmVyIEJSRF9JT0N0bCByZXNlcnZlZCBjb21tYW5kIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRFNQSU9DVExfCisjZGVmaW5lIERTUElPQ1RMXworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgQWJzdHJhY3Rpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxod19kZWZzLmg+CisjaW5jbHVkZSA8aHdfbW11Lmg+CisKKy8qCisgKiBBbnkgSU9DVExTIGF0IG9yIGFib3ZlIHRoaXMgdmFsdWUgYXJlIHJlc2VydmVkIGZvciBzdGFuZGFyZCBCcmlkZ2UgZHJpdmVyCisgKiBpbnRlcmZhY2VzLgorICovCisjZGVmaW5lIEJSRElPQ1RMX1JFU0VSVkVEQkFTRSAgICAgICAweDgwMDAKKworI2RlZmluZSBCUkRJT0NUTF9DSE5MUkVBRCAgICAgICAgICAgKEJSRElPQ1RMX1JFU0VSVkVEQkFTRSArIDB4MTApCisjZGVmaW5lIEJSRElPQ1RMX0NITkxXUklURSAgICAgICAgICAoQlJESU9DVExfUkVTRVJWRURCQVNFICsgMHgyMCkKKyNkZWZpbmUgQlJESU9DVExfR0VUSU5UUkNPVU5UICAgICAgIChCUkRJT0NUTF9SRVNFUlZFREJBU0UgKyAweDMwKQorI2RlZmluZSBCUkRJT0NUTF9SRVNFVElOVFJDT1VOVCAgICAgKEJSRElPQ1RMX1JFU0VSVkVEQkFTRSArIDB4NDApCisjZGVmaW5lIEJSRElPQ1RMX0lOVEVSUlVQVERTUCAgICAgICAoQlJESU9DVExfUkVTRVJWRURCQVNFICsgMHg1MCkKKy8qIERNTVUgKi8KKyNkZWZpbmUgQlJESU9DVExfU0VUTU1VQ09ORklHICAgICAgIChCUkRJT0NUTF9SRVNFUlZFREJBU0UgKyAweDYwKQorLyogUFdSICovCisjZGVmaW5lIEJSRElPQ1RMX1BXUkNPTlRST0wgICAgICAgICAoQlJESU9DVExfUkVTRVJWRURCQVNFICsgMHg3MCkKKworLyogYXR0ZW50aW9uLCBtb2RpZmllcnM6CisgKiBTb21lIG9mIHRoZXNlIGNvbnRyb2wgZW51bWVyYXRpb25zIGFyZSBtYWRlIHZpc2libGUgdG8gdXNlciBmb3IgcG93ZXIKKyAqIGNvbnRyb2wsIHNvIGFueSBjaGFuZ2VzIHRvIHRoaXMgbGlzdCwgc2hvdWxkIGFsc28gYmUgdXBkYXRlZCBpbiB0aGUgdXNlcgorICogaGVhZGVyIGZpbGUgJ2RiZGVmcy5oJyAqKiovCisvKiBUaGVzZSBpb2N0bHMgYXJlIHJlc2VydmVkIGZvciBQV1IgcG93ZXIgY29tbWFuZHMgZm9yIHRoZSBEU1AgKi8KKyNkZWZpbmUgQlJESU9DVExfREVFUFNMRUVQICAgICAgICAgIChCUkRJT0NUTF9QV1JDT05UUk9MICsgMHgwKQorI2RlZmluZSBCUkRJT0NUTF9FTUVSR0VOQ1lTTEVFUCAgICAgKEJSRElPQ1RMX1BXUkNPTlRST0wgKyAweDEpCisjZGVmaW5lIEJSRElPQ1RMX1dBS0VVUCAgICAgICAgICAgICAoQlJESU9DVExfUFdSQ09OVFJPTCArIDB4MikKKyNkZWZpbmUgQlJESU9DVExfUFdSRU5BQkxFICAgICAgICAgIChCUkRJT0NUTF9QV1JDT05UUk9MICsgMHgzKQorI2RlZmluZSBCUkRJT0NUTF9QV1JESVNBQkxFICAgICAgICAgKEJSRElPQ1RMX1BXUkNPTlRST0wgKyAweDQpCisjZGVmaW5lIEJSRElPQ1RMX0NMS19DVFJMCQkgICAgKEJSRElPQ1RMX1BXUkNPTlRST0wgKyAweDcpCisvKiBEU1AgSW5pdGlhdGVkIEhpYmVybmF0ZSAqLworI2RlZmluZSBCUkRJT0NUTF9QV1JfSElCRVJOQVRFCShCUkRJT0NUTF9QV1JDT05UUk9MICsgMHg4KQorI2RlZmluZSBCUkRJT0NUTF9QUkVTQ0FMRV9OT1RJRlkgKEJSRElPQ1RMX1BXUkNPTlRST0wgKyAweDkpCisjZGVmaW5lIEJSRElPQ1RMX1BPU1RTQ0FMRV9OT1RJRlkgKEJSRElPQ1RMX1BXUkNPTlRST0wgKyAweEEpCisjZGVmaW5lIEJSRElPQ1RMX0NPTlNUUkFJTlRfUkVRVUVTVCAoQlJESU9DVExfUFdSQ09OVFJPTCArIDB4QikKKworLyogTnVtYmVyIG9mIGFjdHVhbCBEU1AtTU1VIFRMQiBlbnRycmllcyAqLworI2RlZmluZSBCUkRJT0NUTF9OVU1PRk1NVVRMQiAgICAgICAgMzIKKworc3RydWN0IGJyaWRnZV9pb2N0bF9leHRwcm9jIHsKKwl1MzIgdWxfZHNwX3ZhOwkJLyogRFNQIHZpcnR1YWwgYWRkcmVzcyAqLworCXUzMiB1bF9ncHBfcGE7CQkvKiBHUFAgcGh5c2ljYWwgYWRkcmVzcyAqLworCS8qIEdQUCB2aXJ0dWFsIGFkZHJlc3MuIF9fdmEgZG9lcyBub3Qgd29yayBmb3IgaW9yZW1hcHBlZCBhZGRyZXNzZXMgKi8KKwl1MzIgdWxfZ3BwX3ZhOworCXUzMiB1bF9zaXplOwkJLyogU2l6ZSBvZiB0aGUgbWFwcGVkIG1lbW9yeSBpbiBieXRlcyAqLworCWVudW0gaHdfZW5kaWFuaXNtX3QgZW5kaWFuaXNtOworCWVudW0gaHdfbW11X21peGVkX3NpemVfdCBtaXhlZF9tb2RlOworCWVudW0gaHdfZWxlbWVudF9zaXplX3QgZWxlbV9zaXplOworfTsKKworI2VuZGlmIC8qIERTUElPQ1RMXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcG1zZy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2RzcG1zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmQ0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZHNwbXNnLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIGRzcG1zZy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERlY2xhcmVzIHRoZSB1cHBlciBlZGdlIG1lc3NhZ2UgY2xhc3MgbGlicmFyeSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkKKyAqIGFsbCBCcmlkZ2UgZHJpdmVyIC8gRFNQIEFQSSBpbnRlcmZhY2UgdGFibGVzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZQorICogaW1wbGVtZW50ZWQgYnkgZXZlcnkgY2xhc3Mgb2YgQnJpZGdlIGRyaXZlciBjaGFubmVsIGxpYnJhcnkuCisgKgorICogTm90ZXM6CisgKiAgIEZ1bmN0aW9uIGNvbW1lbnQgaGVhZGVycyByZXNpZGUgaW4gZHNwZGVmcy5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgRFNQTVNHXworI2RlZmluZSBEU1BNU0dfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvbXNnZGVmcy5oPgorCitleHRlcm4gaW50IGJyaWRnZV9tc2dfY3JlYXRlKHN0cnVjdCBtc2dfbWdyICoqbXNnX21hbiwKKwkJCQkgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSAgICBtc2dfb25leGl0IG1zZ19jYWxsYmFjayk7CisKK2V4dGVybiBpbnQgYnJpZGdlX21zZ19jcmVhdGVfcXVldWUoc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyLAorCQkJCSAgICAgICBzdHJ1Y3QgbXNnX3F1ZXVlICoqbXNncSwKKwkJCQkgICAgICAgdTMyIG1zZ3FfaWQsIHUzMiBtYXhfbXNncywgdm9pZCAqYXJnKTsKKworZXh0ZXJuIHZvaWQgYnJpZGdlX21zZ19kZWxldGUoc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyKTsKKworZXh0ZXJuIHZvaWQgYnJpZGdlX21zZ19kZWxldGVfcXVldWUoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaik7CisKK2V4dGVybiBpbnQgYnJpZGdlX21zZ19nZXQoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaiwKKwkJCQkgc3RydWN0IGRzcF9tc2cgKnBtc2csIHUzMiB1dGltZW91dCk7CisKK2V4dGVybiBpbnQgYnJpZGdlX21zZ19wdXQoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaiwKKwkJCQkgY29uc3Qgc3RydWN0IGRzcF9tc2cgKnBtc2csIHUzMiB1dGltZW91dCk7CisKK2V4dGVybiBpbnQgYnJpZGdlX21zZ19yZWdpc3Rlcl9ub3RpZnkoc3RydWN0IG1zZ19xdWV1ZSAqbXNnX3F1ZXVlX29iaiwKKwkJCQkJICB1MzIgZXZlbnRfbWFzaywKKwkJCQkJICB1MzIgbm90aWZ5X3R5cGUsCisJCQkJCSAgc3RydWN0IGRzcF9ub3RpZmljYXRpb24KKwkJCQkJICAqaG5vdGlmaWNhdGlvbik7CisKK2V4dGVybiB2b2lkIGJyaWRnZV9tc2dfc2V0X3F1ZXVlX2lkKHN0cnVjdCBtc2dfcXVldWUgKm1zZ19xdWV1ZV9vYmosCisJCQkJCXUzMiBtc2dxX2lkKTsKKworI2VuZGlmIC8qIERTUE1TR18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9keW5hbWljX2xvYWRlci5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2R5bmFtaWNfbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxMDlkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9keW5hbWljX2xvYWRlci5oCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogZHluYW1pY19sb2FkZXIuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfRFlOQU1JQ19MT0FERVJfSF8KKyNkZWZpbmUgX0RZTkFNSUNfTE9BREVSX0hfCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIER5bmFtaWMgTG9hZGVyCisgKgorICogVGhlIGZ1bmN0aW9uIG9mIHRoZSBkeW5hbWljIGxvYWRlciBpcyB0byBsb2FkIGEgIm1vZHVsZSIgY29udGFpbmluZworICogaW5zdHJ1Y3Rpb25zIGZvciBhICJ0YXJnZXQiIHByb2Nlc3NvciBpbnRvIHRoYXQgcHJvY2Vzc29yLiAgSW4gdGhlIHByb2Nlc3MKKyAqIGl0IGFzc2lnbnMgbWVtb3J5IGZvciB0aGUgbW9kdWxlLCByZXNvbHZlcyBzeW1ib2wgcmVmZXJlbmNlcyBtYWRlIGJ5IHRoZQorICogbW9kdWxlLCBhbmQgcmVtZW1iZXJzIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgbW9kdWxlLgorICoKKyAqIFRoZSBkeW5hbWljIGxvYWRlciBpcyBwYXJhbWV0ZXJpemVkIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGJ5IDQgY2xhc3NlcworICogdGhhdCBzdXBwbHkgdGhlIG1vZHVsZSBhbmQgc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucyBpdCByZXF1aXJlcworICovCisJLyogVGhlIHJlYWQgZnVuY3Rpb25zIGZvciB0aGUgbW9kdWxlIGltYWdlIHRvIGJlIGxvYWRlZCAqLworc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N0cmVhbTsKKworCS8qIFRoaXMgY2xhc3MgZGVmaW5lcyAiaG9zdCIgc3ltYm9sIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bTsKKworCS8qIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYWxsb2NhdG9yIGZvciAidGFyZ2V0IiBtZW1vcnkgKi8KK3N0cnVjdCBkeW5hbWljX2xvYWRlcl9hbGxvY2F0ZTsKKworCS8qIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgY29weS1pbnRvLXRhcmdldC1tZW1vcnkgZnVuY3Rpb25zICovCitzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZTsKKworLyoKKyAqIE9wdGlvbiBmbGFncyB0byBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIG1vZHVsZSBsb2FkaW5nCisgKi8KKyNkZWZpbmUgRExPQURfSU5JVEJTUyAweDEJLyogaW5pdGlhbGl6ZSBCU1Mgc2VjdGlvbnMgdG8gemVybyAqLworI2RlZmluZSBETE9BRF9CSUdFTkQgMHgyCS8qIHJlcXVpcmUgYmlnLWVuZGlhbiBsb2FkIG1vZHVsZSAqLworI2RlZmluZSBETE9BRF9MSVRUTEUgMHg0CS8qIHJlcXVpcmUgbGl0dGxlLWVuZGlhbiBsb2FkIG1vZHVsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZSBkeW5hbWljX2xvYWRfbW9kdWxlCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtb2R1bGUgIFRoZSBpbnB1dCBzdHJlYW0gdGhhdCBzdXBwbGllcyB0aGUgbW9kdWxlIGltYWdlCisgKiAgc3ltcyAgICBIb3N0LXNpZGUgc3ltYm9sIHRhYmxlIGFuZCBtYWxsb2MvZnJlZSBmdW5jdGlvbnMKKyAqICBhbGxvYyAgIFRhcmdldC1zaWRlIG1lbW9yeSBhbGxvY2F0aW9uCisgKiAgaW5pdCAgICBUYXJnZXQtc2lkZSBtZW1vcnkgaW5pdGlhbGl6YXRpb24sIG9yIE5VTEwgZm9yIHN5bWJvbCByZWFkIG9ubHkKKyAqICBvcHRpb25zIE9wdGlvbiBmbGFncyBETE9BRF8qCisgKiAgbWhhbmRsZSBBIG1vZHVsZSBoYW5kbGUgZm9yIHVzZSB3aXRoIER5bmFtaWNfVW5sb2FkCisgKgorICogRWZmZWN0OgorICogIFRoZSBtb2R1bGUgaW1hZ2UgaXMgcmVhZCB1c2luZyAqbW9kdWxlLiAgVGFyZ2V0IHN0b3JhZ2UgZm9yIHRoZSBuZXcgaW1hZ2UgaXMKKyAqIG9idGFpbmVkIGZyb20gKmFsbG9jLiAgU3ltYm9scyBkZWZpbmVkIGFuZCByZWZlcmVuY2VkIGJ5IHRoZSBtb2R1bGUgYXJlCisgKiBtYW5hZ2VkIHVzaW5nICpzeW1zLiAgVGhlIGltYWdlIGlzIHRoZW4gcmVsb2NhdGVkIGFuZCByZWZlcmVuY2VzIHJlc29sdmVkCisgKiBhcyBuZWNlc3NhcnksIGFuZCB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgYml0cyBhcmUgcGxhY2VkIGludG8gdGFyZ2V0IG1lbW9yeQorICogdXNpbmcgKmluaXQuCisgKgorICogUmV0dXJuczoKKyAqICBPbiBhIHN1Y2Nlc3NmdWwgbG9hZCwgYSBtb2R1bGUgaGFuZGxlIGlzIHBsYWNlZCBpbiAqbWhhbmRsZSwgYW5kIHplcm8gaXMKKyAqIHJldHVybmVkLiAgT24gZXJyb3IsIHRoZSBudW1iZXIgb2YgZXJyb3JzIGRldGVjdGVkIGlzIHJldHVybmVkLiAgSW5kaXZpZHVhbAorICogZXJyb3JzIGFyZSByZXBvcnRlZCBkdXJpbmcgdGhlIGxvYWQgcHJvY2VzcyB1c2luZyBzeW1zLT5lcnJvcl9yZXBvcnQoKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitleHRlcm4gaW50IGR5bmFtaWNfbG9hZF9tb2R1bGUoCisJCQkJICAgICAgLyogdGhlIHNvdXJjZSBmb3IgdGhlIG1vZHVsZSBpbWFnZSAqLworCQkJCSAgICAgIHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zdHJlYW0gKm1vZHVsZSwKKwkJCQkgICAgICAvKiBob3N0IHN1cHBvcnQgZm9yIHN5bWJvbHMgYW5kIHN0b3JhZ2UgKi8KKwkJCQkgICAgICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICpzeW1zLAorCQkJCSAgICAgIC8qIHRoZSB0YXJnZXQgbWVtb3J5IGFsbG9jYXRvciAqLworCQkJCSAgICAgIHN0cnVjdCBkeW5hbWljX2xvYWRlcl9hbGxvY2F0ZSAqYWxsb2MsCisJCQkJICAgICAgLyogdGhlIHRhcmdldCBtZW1vcnkgaW5pdGlhbGl6ZXIgKi8KKwkJCQkgICAgICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqaW5pdCwKKwkJCQkgICAgICB1bnNpZ25lZCBvcHRpb25zLAkvKiBvcHRpb24gZmxhZ3MgKi8KKwkJCQkgICAgICAvKiB0aGUgcmV0dXJuZWQgbW9kdWxlIGhhbmRsZSAqLworCQkJCSAgICAgIHZvaWQgKiptaGFuZGxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmUgZHluYW1pY19vcGVuX21vZHVsZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgbW9kdWxlICBUaGUgaW5wdXQgc3RyZWFtIHRoYXQgc3VwcGxpZXMgdGhlIG1vZHVsZSBpbWFnZQorICogIHN5bXMgICAgSG9zdC1zaWRlIHN5bWJvbCB0YWJsZSBhbmQgbWFsbG9jL2ZyZWUgZnVuY3Rpb25zCisgKiAgYWxsb2MgICBUYXJnZXQtc2lkZSBtZW1vcnkgYWxsb2NhdGlvbgorICogIGluaXQgICAgVGFyZ2V0LXNpZGUgbWVtb3J5IGluaXRpYWxpemF0aW9uLCBvciBOVUxMIGZvciBzeW1ib2wgcmVhZCBvbmx5CisgKiAgb3B0aW9ucyBPcHRpb24gZmxhZ3MgRExPQURfKgorICogIG1oYW5kbGUgQSBtb2R1bGUgaGFuZGxlIGZvciB1c2Ugd2l0aCBEeW5hbWljX1VubG9hZAorICoKKyAqIEVmZmVjdDoKKyAqICBUaGUgbW9kdWxlIGltYWdlIGlzIHJlYWQgdXNpbmcgKm1vZHVsZS4gIFRhcmdldCBzdG9yYWdlIGZvciB0aGUgbmV3IGltYWdlIGlzCisgKiBvYnRhaW5lZCBmcm9tICphbGxvYy4gIFN5bWJvbHMgZGVmaW5lZCBhbmQgcmVmZXJlbmNlZCBieSB0aGUgbW9kdWxlIGFyZQorICogbWFuYWdlZCB1c2luZyAqc3ltcy4gIFRoZSBpbWFnZSBpcyB0aGVuIHJlbG9jYXRlZCBhbmQgcmVmZXJlbmNlcyByZXNvbHZlZAorICogYXMgbmVjZXNzYXJ5LCBhbmQgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIGJpdHMgYXJlIHBsYWNlZCBpbnRvIHRhcmdldCBtZW1vcnkKKyAqIHVzaW5nICppbml0LgorICoKKyAqIFJldHVybnM6CisgKiAgT24gYSBzdWNjZXNzZnVsIGxvYWQsIGEgbW9kdWxlIGhhbmRsZSBpcyBwbGFjZWQgaW4gKm1oYW5kbGUsIGFuZCB6ZXJvIGlzCisgKiByZXR1cm5lZC4gIE9uIGVycm9yLCB0aGUgbnVtYmVyIG9mIGVycm9ycyBkZXRlY3RlZCBpcyByZXR1cm5lZC4gIEluZGl2aWR1YWwKKyAqIGVycm9ycyBhcmUgcmVwb3J0ZWQgZHVyaW5nIHRoZSBsb2FkIHByb2Nlc3MgdXNpbmcgc3ltcy0+ZXJyb3JfcmVwb3J0KCkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworZXh0ZXJuIGludCBkeW5hbWljX29wZW5fbW9kdWxlKAorCQkJCSAgICAgIC8qIHRoZSBzb3VyY2UgZm9yIHRoZSBtb2R1bGUgaW1hZ2UgKi8KKwkJCQkgICAgICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3RyZWFtICptb2R1bGUsCisJCQkJICAgICAgLyogaG9zdCBzdXBwb3J0IGZvciBzeW1ib2xzIGFuZCBzdG9yYWdlICovCisJCQkJICAgICAgc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqc3ltcywKKwkJCQkgICAgICAvKiB0aGUgdGFyZ2V0IG1lbW9yeSBhbGxvY2F0b3IgKi8KKwkJCQkgICAgICBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKmFsbG9jLAorCQkJCSAgICAgIC8qIHRoZSB0YXJnZXQgbWVtb3J5IGluaXRpYWxpemVyICovCisJCQkJICAgICAgc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKmluaXQsCisJCQkJICAgICAgdW5zaWduZWQgb3B0aW9ucywJLyogb3B0aW9uIGZsYWdzICovCisJCQkJICAgICAgLyogdGhlIHJldHVybmVkIG1vZHVsZSBoYW5kbGUgKi8KKwkJCQkgICAgICB2b2lkICoqbWhhbmRsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJvY2VkdXJlIGR5bmFtaWNfdW5sb2FkX21vZHVsZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgbWhhbmRsZSBBIG1vZHVsZSBoYW5kbGUgZnJvbSBkeW5hbWljX2xvYWRfbW9kdWxlCisgKiAgc3ltcyAgICBIb3N0LXNpZGUgc3ltYm9sIHRhYmxlIGFuZCBtYWxsb2MvZnJlZSBmdW5jdGlvbnMKKyAqICBhbGxvYyAgIFRhcmdldC1zaWRlIG1lbW9yeSBhbGxvY2F0aW9uCisgKgorICogRWZmZWN0OgorICogIFRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5IG1oYW5kbGUgaXMgdW5sb2FkZWQuICBVbmxvYWRpbmcgY2F1c2VzIGFsbAorICogdGFyZ2V0IG1lbW9yeSB0byBiZSBkZWFsbG9jYXRlZCwgYWxsIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgbW9kdWxlIHRvCisgKiBiZSBwdXJnZWQsIGFuZCBhbnkgaG9zdC1zaWRlIHN0b3JhZ2UgdXNlZCBieSB0aGUgZHluYW1pYyBsb2FkZXIgZm9yCisgKiB0aGlzIG1vZHVsZSB0byBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICogIFplcm8gZm9yIHN1Y2Nlc3MuIE9uIGVycm9yLCB0aGUgbnVtYmVyIG9mIGVycm9ycyBkZXRlY3RlZCBpcyByZXR1cm5lZC4KKyAqIEluZGl2aWR1YWwgZXJyb3JzIGFyZSByZXBvcnRlZCB1c2luZyBzeW1zLT5lcnJvcl9yZXBvcnQoKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitleHRlcm4gaW50IGR5bmFtaWNfdW5sb2FkX21vZHVsZSh2b2lkICptaGFuZGxlLAkvKiB0aGUgbW9kdWxlCisJCQkJCQkJICogaGFuZGxlICovCisJCQkJIC8qIGhvc3Qgc3VwcG9ydCBmb3Igc3ltYm9scyBhbmQKKwkJCQkgICogc3RvcmFnZSAqLworCQkJCSBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICpzeW1zLAorCQkJCSAvKiB0aGUgdGFyZ2V0IG1lbW9yeSBhbGxvY2F0b3IgKi8KKwkJCQkgc3RydWN0IGR5bmFtaWNfbG9hZGVyX2FsbG9jYXRlICphbGxvYywKKwkJCQkgLyogdGhlIHRhcmdldCBtZW1vcnkgaW5pdGlhbGl6ZXIgKi8KKwkJCQkgc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKmluaXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSBjbGFzcyB1c2VkIGJ5IHRoZSBkeW5hbWljIGxvYWRlciBmb3IgaW5wdXQgb2YgdGhlIG1vZHVsZSBpbWFnZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N0cmVhbSB7CisvKiBwdWJsaWM6ICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiByZWFkX2J1ZmZlcgorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogIGJ1ZmZlciAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZpbGwKKyAgICAgKiAgYnVmc2l6ICBBbW91bnQgb2YgZGF0YSBkZXNpcmVkIGluIHNpemVvZigpIHVuaXRzCisgICAgICoKKyAgICAgKiBFRkZFQ1QgOgorICAgICAqICBSZWFkcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBkYXRhIGZyb20gdGhlIG1vZHVsZSBpbnB1dCBzdHJlYW0KKyAgICAgKiBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgUmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgcmVhZCBpbiBzaXplb2YoKQorICAgICAqIHVuaXRzICh3aGljaCBpZiBsZXNzIHRoYW4gdGhlIHNwZWNpZmljYXRpb24sIHJlcHJlc2VudHMgYW4gZXJyb3IpLgorICAgICAqCisgICAgICogTk9URVM6CisgICAgICogIEluIHJlbGVhc2UgMSBpbmNyZW1lbnRzIHRoZSBmaWxlIHBvc2l0aW9uIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCWludCAoKnJlYWRfYnVmZmVyKSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N0cmVhbSAqdGhpc3B0ciwKKwkJCSAgICB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZnNpeik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIHNldF9maWxlX3Bvc24gKHJlbGVhc2UgMSBvbmx5KQorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogIHBvc24gIERlc2lyZWQgZmlsZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBzdGFydCBvZiBmaWxlIGluIHNpemVvZigpIHVuaXRzLgorICAgICAqCisgICAgICogRUZGRUNUIDoKKyAgICAgKiAgQWRqdXN0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHN0cmVhbSBvYmplY3Qgc28gdGhhdCB0aGUgbmV4dAorICAgICAqIHJlYWRfYnVmZmVyIGNhbGwgd2lsbCBiZWdpbiB0byByZWFkIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGZyb20KKyAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBtb2R1bGUuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvCisgICAgICogZm9yIGZhaWx1cmUuCisgICAgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJaW50ICgqc2V0X2ZpbGVfcG9zbikgKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zdHJlYW0gKnRoaXNwdHIsCisJCQkgICAgICAvKiB0byBiZSBlbGltaW5hdGVkIGluIHJlbGVhc2UgMiAqLworCQkJICAgICAgdW5zaWduZWQgaW50IHBvc24pOworCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSBjbGFzcyB1c2VkIGJ5IHRoZSBkeW5hbWljIGxvYWRlciBmb3Igc3ltYm9sIHRhYmxlIHN1cHBvcnQgYW5kCisgKiBtaXNjZWxsYW5lb3VzIGhvc3Qtc2lkZSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiB1MzIgbGRyX2FkZHI7CisKKy8qCisgKiB0aGUgc3RydWN0dXJlIG9mIGEgc3ltYm9sIGtub3duIHRvIHRoZSBkeW5hbWljIGxvYWRlcgorICovCitzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgeworCWxkcl9hZGRyIHZhbHVlOworfTsKKworc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSB7CisvKiBwdWJsaWM6ICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBmaW5kX21hdGNoaW5nX3N5bWJvbAorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogIG5hbWUgICAgVGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgc3ltYm9sCisgICAgICoKKyAgICAgKiBFRkZFQ1QgOgorICAgICAqICBMb2NhdGVzIGEgc3ltYm9sIG1hdGNoaW5nIHRoZSBuYW1lIHNwZWNpZmllZC4gIEEgcG9pbnRlciB0byB0aGUKKyAgICAgKiBzeW1ib2wgaXMgcmV0dXJuZWQgaWYgaXQgZXhpc3RzOyAwIGlzIHJldHVybmVkIGlmIG5vIHN1Y2ggc3ltYm9sIGlzCisgICAgICogZm91bmQuCisgICAgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJc3RydWN0IGR5bmxvYWRfc3ltYm9sICooKmZpbmRfbWF0Y2hpbmdfc3ltYm9sKQorCSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqdGhpc3B0ciwgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIGFkZF90b19zeW1ib2xfdGFibGUKKyAgICAgKgorICAgICAqIFBBUkFNRVRFUlMgOgorICAgICAqICBubmFtZSAgICAgICBQb2ludGVyIHRvIHRoZSBuYW1lIG9mIHRoZSBuZXcgc3ltYm9sCisgICAgICogIG1vZHVsZWlkICAgIEFuIG9wYXF1ZSBtb2R1bGUgaWQgYXNzaWduZWQgYnkgdGhlIGR5bmFtaWMgbG9hZGVyCisgICAgICoKKyAgICAgKiBFRkZFQ1QgOgorICAgICAqICBUaGUgbmV3IHN5bWJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuICBBIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCBpcworICAgICAqIHJldHVybmVkLCBvciBOVUxMIGlzIHJldHVybmVkIGZvciBmYWlsdXJlLgorICAgICAqCisgICAgICogTk9URVM6CisgICAgICogIEl0IGlzIHBlcm1pc3NpYmxlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHJldHVybiBOVUxMOyB0aGUgZWZmZWN0IGlzIHRoYXQKKyAgICAgKiB0aGUgbmFtZWQgc3ltYm9sIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0byByZXNvbHZlIHJlZmVyZW5jZXMgaW4KKyAgICAgKiBzdWJzZXF1ZW50IGxvYWRzLiAgUmV0dXJuaW5nIE5VTEwgd2lsbCBub3QgY2F1c2UgdGhlIGN1cnJlbnQgbG9hZAorICAgICAqIHRvIGZhaWwuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXN0cnVjdCBkeW5sb2FkX3N5bWJvbCAqKCphZGRfdG9fc3ltYm9sX3RhYmxlKQorCSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqCisJICB0aGlzcHRyLCBjb25zdCBjaGFyICpubmFtZSwgdW5zaWduZWQgbW9kdWxlaWQpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBwdXJnZV9zeW1ib2xfdGFibGUKKyAgICAgKgorICAgICAqIFBBUkFNRVRFUlMgOgorICAgICAqICBtb2R1bGVpZCAgICBBbiBvcGFxdWUgbW9kdWxlIGlkIGFzc2lnbmVkIGJ5IHRoZSBkeW5hbWljIGxvYWRlcgorICAgICAqCisgICAgICogRUZGRUNUIDoKKyAgICAgKiAgRWFjaCBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aG9zZSBtb2R1bGVpZCBtYXRjaGVzIHRoZSBhcmd1bWVudAorICAgICAqIGlzIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXZvaWQgKCpwdXJnZV9zeW1ib2xfdGFibGUpIChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICp0aGlzcHRyLAorCQkJCSAgICB1bnNpZ25lZCBtb2R1bGVpZCk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIGRsb2FkX2FsbG9jYXRlCisgICAgICoKKyAgICAgKiBQQVJBTUVURVJTIDoKKyAgICAgKiAgbWVtc2l6ICBzaXplIG9mIGRlc2lyZWQgbWVtb3J5IGluIHNpemVvZigpIHVuaXRzCisgICAgICoKKyAgICAgKiBFRkZFQ1QgOgorICAgICAqICBSZXR1cm5zIGEgcG9pbnRlciB0byBzb21lICJob3N0IiBtZW1vcnkgZm9yIHVzZSBieSB0aGUgZHluYW1pYworICAgICAqIGxvYWRlciwgb3IgTlVMTCBmb3IgZmFpbHVyZS4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNlcnZlcyBhcyBhIHJlcGxhY2VhYmxlIGZvcm0gb2YgIm1hbGxvYyIgdG8KKyAgICAgKiBhbGxvdyB0aGUgdXNlciB0byBjb25maWd1cmUgdGhlIG1lbW9yeSB1c2FnZSBvZiB0aGUgZHluYW1pYyBsb2FkZXIuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXZvaWQgKigqZGxvYWRfYWxsb2NhdGUpIChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICp0aGlzcHRyLAorCQkJCSB1bnNpZ25lZCBtZW1zaXopOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBkbG9hZF9kZWFsbG9jYXRlCisgICAgICoKKyAgICAgKiBQQVJBTUVURVJTIDoKKyAgICAgKiAgbWVtcHRyICBwb2ludGVyIHRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeQorICAgICAqCisgICAgICogRUZGRUNUIDoKKyAgICAgKiAgUmVsZWFzZXMgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkICJob3N0IiBtZW1vcnkuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXZvaWQgKCpkbG9hZF9kZWFsbG9jYXRlKSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqdGhpc3B0ciwKKwkJCQkgIHZvaWQgKm1lbXB0cik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIGVycm9yX3JlcG9ydAorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogIGVycnN0ciAgcG9pbnRlciB0byBhbiBlcnJvciBzdHJpbmcKKyAgICAgKiAgYXJncyAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cworICAgICAqCisgICAgICogRUZGRUNUIDoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhbiBlcnJvciByZXBvcnRpbmcgaW50ZXJmYWNlIGZvciB0aGUgZHluYW1pYworICAgICAqIGxvYWRlci4gIFRoZSBlcnJvciBzdHJpbmcgYW5kIGFyZ3VtZW50cyBhcmUgZGVzaWduZWQgYXMgZm9yIHRoZQorICAgICAqIGxpYnJhcnkgZnVuY3Rpb24gdnByaW50Zi4KKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJdm9pZCAoKmVycm9yX3JlcG9ydCkgKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0gKnRoaXNwdHIsCisJCQkgICAgICBjb25zdCBjaGFyICplcnJzdHIsIHZhX2xpc3QgYXJncyk7CisKK307CQkJCS8qIGNsYXNzIGR5bmFtaWNfbG9hZGVyX3N5bSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSBjbGFzcyB1c2VkIGJ5IHRoZSBkeW5hbWljIGxvYWRlciB0byBhbGxvY2F0ZSBhbmQgZGVhbGxvY2F0ZSB0YXJnZXQgbWVtb3J5LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyB7CisJLyogTmFtZSBvZiB0aGUgbWVtb3J5IHNlY3Rpb24gYXNzaWduZWQgYXQgYnVpbGQgdGltZSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJbGRyX2FkZHIgcnVuX2FkZHI7CS8qIGV4ZWN1dGlvbiBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uICovCisJbGRyX2FkZHIgbG9hZF9hZGRyOwkvKiBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gKi8KKwlsZHJfYWRkciBzaXplOwkJLyogc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBhZGRyZXNzYWJsZSB1bml0cyAqLworI2lmbmRlZiBfQklHX0VORElBTgorCXUxNiBwYWdlOwkJLyogbWVtb3J5IHBhZ2Ugb3IgdmlldyAqLworCXUxNiB0eXBlOwkJLyogb25lIG9mIHRoZSBzZWN0aW9uIHR5cGVzIGJlbG93ICovCisjZWxzZQorCXUxNiB0eXBlOwkJLyogb25lIG9mIHRoZSBzZWN0aW9uIHR5cGVzIGJlbG93ICovCisJdTE2IHBhZ2U7CQkvKiBtZW1vcnkgcGFnZSBvciB2aWV3ICovCisjZW5kaWYKKwkvKiBhIGNvbnRleHQgZmllbGQgZm9yIHVzZSBieSBkeW5hbWljX2xvYWRlcl9hbGxvY2F0ZTsKKwkgKiAgIGlnbm9yZWQgYnV0IG1haW50YWluZWQgYnkgdGhlIGR5bmFtaWMgbG9hZGVyICovCisJdTMyIGNvbnRleHQ7Cit9OworCisvKiB1c2UgdGhpcyBtYWNybyB0byBleHRyYWN0IHR5cGUgb2Ygc2VjdGlvbiBmcm9tIGxkcl9zZWN0aW9uX2luZm8udHlwZSBmaWVsZCAqLworI2RlZmluZSBETE9BRF9TRUNUSU9OX1RZUEUodHlwZWluZm8pICh0eXBlaW5mbyAmIDB4RikKKworLyogdHlwZSBvZiBzZWN0aW9uIHRvIGJlIGFsbG9jYXRlZCAqLworI2RlZmluZSBETE9BRF9URVhUIDAKKyNkZWZpbmUgRExPQURfREFUQSAxCisjZGVmaW5lIERMT0FEX0JTUyAyCisJLyogaW50ZXJuYWwgdXNlIG9ubHksIHJ1bi10aW1lIGNpbml0IHdpbGwgYmUgb2YgdHlwZSBETE9BRF9EQVRBICovCisjZGVmaW5lIERMT0FEX0NJTklUIDMKKworc3RydWN0IGR5bmFtaWNfbG9hZGVyX2FsbG9jYXRlIHsKKy8qIHB1YmxpYzogKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBGdW5jdGlvbiBhbGxvY2F0ZQorICAgICoKKyAgICAqIFBhcmFtZXRlcnM6CisgICAgKiAgIGluZm8gICAgICAgIEEgcG9pbnRlciB0byBhbiBpbmZvcm1hdGlvbiBibG9jayBmb3IgdGhlIHNlY3Rpb24KKyAgICAqICAgYWxpZ24gICAgICAgVGhlIGFsaWdubWVudCBvZiB0aGUgc3RvcmFnZSBpbiB0YXJnZXQgQVVzCisgICAgKgorICAgICogRWZmZWN0OgorICAgICogICBBbGxvY2F0ZXMgdGFyZ2V0IG1lbW9yeSBmb3IgdGhlIHNwZWNpZmllZCBzZWN0aW9uIGFuZCBmaWxscyBpbiB0aGUKKyAgICAqIGxvYWRfYWRkciBhbmQgcnVuX2FkZHIgZmllbGRzIG9mIHRoZSBzZWN0aW9uIGluZm8gc3RydWN0dXJlLiBSZXR1cm5zIFRSVUUKKyAgICAqIGZvciBzdWNjZXNzLCBGQUxTRSBmb3IgZmFpbHVyZS4KKyAgICAqCisgICAgKiBOb3RlczoKKyAgICAqICAgRnJlcXVlbnRseSBsb2FkX2FkZHIgYW5kIHJ1bl9hZGRyIGFyZSB0aGUgc2FtZSwgYnV0IGlmIHRoZXkgYXJlIG5vdAorICAgICogbG9hZF9hZGRyIGlzIHVzZWQgd2l0aCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplLCBhbmQgcnVuX2FkZHIgaXMKKyAgICAqIHVzZWQgZm9yIGFsbW9zdCBhbGwgcmVsb2NhdGlvbnMuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHdheXMgaW5pdGlhbGl6ZQorICAgICogYm90aCBmaWVsZHMuCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJaW50ICgqZGxvYWRfYWxsb2NhdGUpIChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKnRoaXNwdHIsCisJCQkgICAgICAgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmluZm8sIHVuc2lnbmVkIGFsaWduKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBGdW5jdGlvbiBkZWFsbG9jYXRlCisgICAgKgorICAgICogUGFyYW1ldGVyczoKKyAgICAqICAgaW5mbyAgICAgICAgQSBwb2ludGVyIHRvIGFuIGluZm9ybWF0aW9uIGJsb2NrIGZvciB0aGUgc2VjdGlvbgorICAgICoKKyAgICAqIEVmZmVjdDoKKyAgICAqICAgUmVsZWFzZXMgdGhlIHRhcmdldCBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQuCisgICAgKgorICAgICogTm90ZXM6CisgICAgKiBUaGUgY29udGVudCBvZiB0aGUgaW5mby0+bmFtZSBmaWVsZCBpcyB1bmRlZmluZWQgb24gY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXZvaWQgKCpkbG9hZF9kZWFsbG9jYXRlKSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX2FsbG9jYXRlICp0aGlzcHRyLAorCQkJCSAgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmluZm8pOworCit9OwkJCQkvKiBjbGFzcyBkeW5hbWljX2xvYWRlcl9hbGxvY2F0ZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSBjbGFzcyB1c2VkIGJ5IHRoZSBkeW5hbWljIGxvYWRlciB0byBsb2FkIGRhdGEgaW50byBhIHRhcmdldC4gIFRoaXMgY2xhc3MKKyAqIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2Utc3BlY2lmaWMgZnVuY3Rpb25zIG5lZWRlZCB0byBsb2FkIGRhdGEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplIHsKKy8qIHB1YmxpYzogKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogRnVuY3Rpb24gY29ubmVjdAorICAgICoKKyAgICAqIFBhcmFtZXRlcnM6CisgICAgKiAgIG5vbmUKKyAgICAqCisgICAgKiBFZmZlY3Q6CisgICAgKiAgIENvbm5lY3QgdG8gdGhlIGluaXRpYWxpemF0aW9uIGludGVyZmFjZS4gUmV0dXJucyBUUlVFIGZvciBzdWNjZXNzLAorICAgICogRkFMU0UgZm9yIGZhaWx1cmUuCisgICAgKgorICAgICogTm90ZXM6CisgICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHByaW9yIHRvIHVzZSBvZiBhbnkgb3RoZXIgZnVuY3Rpb25zIGluCisgICAgKiB0aGlzIGludGVyZmFjZS4KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwlpbnQgKCpjb25uZWN0KSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKnRoaXNwdHIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEZ1bmN0aW9uIHJlYWRtZW0KKyAgICAqCisgICAgKiBQYXJhbWV0ZXJzOgorICAgICogICBidWZyICAgICAgICBQb2ludGVyIHRvIGEgd29yZC1hbGlnbmVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdAorICAgICogICBsb2NuICAgICAgICBUYXJnZXQgYWRkcmVzcyBvZiBmaXJzdCBkYXRhIGVsZW1lbnQKKyAgICAqICAgaW5mbyAgICAgICAgU2VjdGlvbiBpbmZvIGZvciB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGUgYWRkcmVzcyByZXNpZGVzCisgICAgKiAgIGJ5dHNpeiAgICAgIFNpemUgb2YgdGhlIGRhdGEgdG8gYmUgcmVhZCBpbiBzaXplb2YoKSB1bml0cworICAgICoKKyAgICAqIEVmZmVjdDoKKyAgICAqICAgRmlsbHMgdGhlIHNwZWNpZmllZCBidWZmZXIgd2l0aCBkYXRhIGZyb20gdGhlIHRhcmdldC4gIFJldHVybnMgVFJVRSBmb3IKKyAgICAqIHN1Y2Nlc3MsIEZBTFNFIGZvciBmYWlsdXJlLgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCWludCAoKnJlYWRtZW0pIChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpc3B0ciwKKwkJCXZvaWQgKmJ1ZnIsCisJCQlsZHJfYWRkciBsb2NuLAorCQkJc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmluZm8sIHVuc2lnbmVkIGJ5dHNpeik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogRnVuY3Rpb24gd3JpdGVtZW0KKyAgICAqCisgICAgKiBQYXJhbWV0ZXJzOgorICAgICogICBidWZyICAgICAgICBQb2ludGVyIHRvIGEgd29yZC1hbGlnbmVkIGJ1ZmZlciBvZiBkYXRhCisgICAgKiAgIGxvY24gICAgICAgIFRhcmdldCBhZGRyZXNzIG9mIGZpcnN0IGRhdGEgZWxlbWVudCB0byBiZSB3cml0dGVuCisgICAgKiAgIGluZm8gICAgICAgIFNlY3Rpb24gaW5mbyBmb3IgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIGFkZHJlc3MgcmVzaWRlcworICAgICogICBieXRzaXogICAgICBTaXplIG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gaW4gc2l6ZW9mKCkgdW5pdHMKKyAgICAqCisgICAgKiBFZmZlY3Q6CisgICAgKiAgIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgdGFyZ2V0LiAgUmV0dXJucyBUUlVFIGZvciBzdWNjZXNzLAorICAgICogRkFMU0UgZm9yIGZhaWx1cmUuCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJaW50ICgqd3JpdGVtZW0pIChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpc3B0ciwKKwkJCSB2b2lkICpidWZyLAorCQkJIGxkcl9hZGRyIGxvY24sCisJCQkgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmluZm8sIHVuc2lnbmVkIGJ5dHNpeik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogRnVuY3Rpb24gZmlsbG1lbQorICAgICoKKyAgICAqIFBhcmFtZXRlcnM6CisgICAgKiAgIGxvY24gICAgICAgIFRhcmdldCBhZGRyZXNzIG9mIGZpcnN0IGRhdGEgZWxlbWVudCB0byBiZSB3cml0dGVuCisgICAgKiAgIGluZm8gICAgICAgIFNlY3Rpb24gaW5mbyBmb3IgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIGFkZHJlc3MgcmVzaWRlcworICAgICogICBieXRzaXogICAgICBTaXplIG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gaW4gc2l6ZW9mKCkgdW5pdHMKKyAgICAqICAgdmFsICAgICAgICAgVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiBlYWNoIGJ5dGUKKyAgICAqIEVmZmVjdDoKKyAgICAqICAgRmlsbHMgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRhcmdldCBtZW1vcnkuICBSZXR1cm5zIFRSVUUgZm9yIHN1Y2Nlc3MsCisgICAgKiBGQUxTRSBmb3IgZmFpbHVyZS4KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwlpbnQgKCpmaWxsbWVtKSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKnRoaXNwdHIsCisJCQlsZHJfYWRkciBsb2NuLCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbywKKwkJCXVuc2lnbmVkIGJ5dHNpeiwgdW5zaWduZWQgdmFsKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBGdW5jdGlvbiBleGVjdXRlCisgICAgKgorICAgICogUGFyYW1ldGVyczoKKyAgICAqICAgc3RhcnQgICAgICAgU3RhcnRpbmcgYWRkcmVzcworICAgICoKKyAgICAqIEVmZmVjdDoKKyAgICAqICAgVGhlIHRhcmdldCBjb2RlIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgYWRkcmVzcyBpcyBleGVjdXRlZC4KKyAgICAqCisgICAgKiBOb3RlczoKKyAgICAqICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZHluYW1pYyBsb2FkIHByb2Nlc3MKKyAgICAqIGlmIHRoZSBpbnB1dCBtb2R1bGUgaGFzIHNwZWNpZmllZCBhIHN0YXJ0aW5nIGFkZHJlc3MuCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJaW50ICgqZXhlY3V0ZSkgKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzcHRyLAorCQkJbGRyX2FkZHIgc3RhcnQpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIEZ1bmN0aW9uIHJlbGVhc2UKKyAgICAqCisgICAgKiBQYXJhbWV0ZXJzOgorICAgICogICBub25lCisgICAgKgorICAgICogRWZmZWN0OgorICAgICogICBSZWxlYXNlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgbG9hZCBpbnRlcmZhY2UuCisgICAgKgorICAgICogTm90ZXM6CisgICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGR5bmFtaWMgbG9hZCBwcm9jZXNzLgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCXZvaWQgKCpyZWxlYXNlKSAoc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKnRoaXNwdHIpOworCit9OwkJCQkvKiBjbGFzcyBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICovCisKKyNlbmRpZiAvKiBfRFlOQU1JQ19MT0FERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9nYi5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2diLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhNzgzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9nYi5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBnYi5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEdlbmVyaWMgYml0bWFwIG1hbmFnZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBHQl8KKyNkZWZpbmUgR0JfCisKKyNkZWZpbmUgR0JfTk9CSVRTICh+MCkKKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCitzdHJ1Y3QgZ2JfdF9tYXA7CisKKy8qCisgKiAgPT09PT09PT0gZ2JfY2xlYXIgPT09PT09PT0KKyAqICBDbGVhciB0aGUgYml0IGluIHBvc2l0aW9uIGJpdG4gaW4gdGhlIGJpdG1hcCBtYXAuICBCaXQgcG9zaXRpb25zIGFyZQorICogIHplcm8gYmFzZWQuCisgKi8KKworZXh0ZXJuIHZvaWQgZ2JfY2xlYXIoc3RydWN0IGdiX3RfbWFwICptYXAsIHUzMiBiaXRuKTsKKworLyoKKyAqICA9PT09PT09PSBnYl9jcmVhdGUgPT09PT09PT0KKyAqICBDcmVhdGUgYSBiaXQgbWFwIHdpdGggbGVuIGJpdHMuICBJbml0aWFsbHkgYWxsIGJpdHMgYXJlIGNsZWFyZWQuCisgKi8KKworZXh0ZXJuIHN0cnVjdCBnYl90X21hcCAqZ2JfY3JlYXRlKHUzMiBsZW4pOworCisvKgorICogID09PT09PT09IGdiX2RlbGV0ZSA9PT09PT09PQorICogIERlbGV0ZSBwcmV2aW91c2x5IGNyZWF0ZWQgYml0IG1hcAorICovCisKK2V4dGVybiB2b2lkIGdiX2RlbGV0ZShzdHJ1Y3QgZ2JfdF9tYXAgKm1hcCk7CisKKy8qCisgKiAgPT09PT09PT0gZ2JfZmluZGFuZHNldCA9PT09PT09PQorICogIEZpbmRzIGEgY2xlYXIgYml0LCBzZXRzIGl0LCBhbmQgcmV0dXJucyB0aGUgcG9zaXRpb24KKyAqLworCitleHRlcm4gdTMyIGdiX2ZpbmRhbmRzZXQoc3RydWN0IGdiX3RfbWFwICptYXApOworCisvKgorICogID09PT09PT09IGdiX21pbmNsZWFyID09PT09PT09CisgKiAgZ2JfbWluY2xlYXIgcmV0dXJucyB0aGUgbWluaW11bSBjbGVhciBiaXQgcG9zaXRpb24uICBJZiBubyBiaXQgaXMKKyAqICBjbGVhciwgZ2JfbWluY2xlYXIgcmV0dXJucyAtMS4KKyAqLworZXh0ZXJuIHUzMiBnYl9taW5jbGVhcihzdHJ1Y3QgZ2JfdF9tYXAgKm1hcCk7CisKKy8qCisgKiAgPT09PT09PT0gZ2Jfc2V0ID09PT09PT09CisgKiAgU2V0IHRoZSBiaXQgaW4gcG9zaXRpb24gYml0biBpbiB0aGUgYml0bWFwIG1hcC4gIEJpdCBwb3NpdGlvbnMgYXJlCisgKiAgemVybyBiYXNlZC4KKyAqLworCitleHRlcm4gdm9pZCBnYl9zZXQoc3RydWN0IGdiX3RfbWFwICptYXAsIHUzMiBiaXRuKTsKKworLyoKKyAqICA9PT09PT09PSBnYl90ZXN0ID09PT09PT09CisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBiaXQgaW4gcG9zaXRpb24gYml0biBpcyBzZXQgaW4gbWFwOyBvdGhlcndpc2UKKyAqICBnYl90ZXN0IHJldHVybnMgRkFMU0UuICBCaXQgcG9zaXRpb25zIGFyZSB6ZXJvIGJhc2VkLgorICovCisKK2V4dGVybiBib29sIGdiX3Rlc3Qoc3RydWN0IGdiX3RfbWFwICptYXAsIHUzMiBiaXRuKTsKKworI2VuZGlmIC8qR0JfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZ2V0c2VjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2dldHNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjYwNjNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2dldHNlY3Rpb24uaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIGdldHNlY3Rpb24uaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gQVBJIGFkZC1vbiB0byB0aGUgZHluYW1pYyBsb2FkZXIgdGhhdCBhbGxvd3MgdGhlIHVzZXIKKyAqIHRvIHF1ZXJ5IHNlY3Rpb24gaW5mb3JtYXRpb24gYW5kIGV4dHJhY3Qgc2VjdGlvbiBkYXRhIGZyb20gZHluYW1pYyBsb2FkCisgKiBtb2R1bGVzLgorICoKKyAqIE5vdGVzOgorICogICBGdW5jdGlvbnMgaW4gdGhpcyBBUEkgYXNzdW1lIHRoYXQgdGhlIHN1cHBsaWVkIGR5bmFtaWNfbG9hZGVyX3N0cmVhbQorICogICBvYmplY3Qgc3VwcG9ydHMgdGhlIHNldF9maWxlX3Bvc24gbWV0aG9kLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9HRVRTRUNUSU9OX0hfCisjZGVmaW5lIF9HRVRTRUNUSU9OX0hfCisKKyNpbmNsdWRlICJkeW5hbWljX2xvYWRlci5oIgorCisvKgorICogUHJvY2VkdXJlIGRsb2FkX21vZHVsZV9vcGVuCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtb2R1bGUgIFRoZSBpbnB1dCBzdHJlYW0gdGhhdCBzdXBwbGllcyB0aGUgbW9kdWxlIGltYWdlCisgKiAgc3ltcyAgICBIb3N0LXNpZGUgbWFsbG9jL2ZyZWUgYW5kIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnMuCisgKiAgICAgICAgICBPdGhlciBtZXRob2RzIGFyZSB1bnVzZWQuCisgKgorICogRWZmZWN0OgorICogIFJlYWRzIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIGEgZHluYW1pYyBsb2FkZXIgbW9kdWxlIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqIHN0cmVhbSBvYmplY3QsIGFuZCByZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgbW9kdWxlIGluZm9ybWF0aW9uLiAgVGhpcworICogaGFuZGxlIG1heSBiZSB1c2VkIGluIHN1YnNlcXVlbnQgcXVlcnkgY2FsbHMgdG8gb2J0YWluIGluZm9ybWF0aW9uCisgKiBjb250YWluZWQgaW4gdGhlIG1vZHVsZS4KKyAqCisgKiBSZXR1cm5zOgorICogIE5VTEwgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQsIG90aGVyd2lzZSBhIG1vZHVsZSBoYW5kbGUgZm9yIHVzZQorICogaW4gc3Vic2VxdWVudCBvcGVyYXRpb25zLgorICovCitleHRlcm4gdm9pZCAqZGxvYWRfbW9kdWxlX29wZW4oc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N0cmVhbQorCQkJCQkgICAqbW9kdWxlLCBzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltCisJCQkJCSAgICpzeW1zKTsKKworLyoKKyAqIFByb2NlZHVyZSBkbG9hZF9nZXRfc2VjdGlvbl9pbmZvCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtaW5mbyAgICAgICBIYW5kbGUgZnJvbSBkbG9hZF9tb2R1bGVfb3BlbiBmb3IgdGhpcyBtb2R1bGUKKyAqICBzZWN0aW9uX25hbWUgUG9pbnRlciB0byB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIHNlY3Rpb24gZGVzaXJlZAorICogIHNlY3Rpb25faW5mbyBBZGRyZXNzIG9mIGEgc2VjdGlvbiBpbmZvIHN0cnVjdHVyZSBwb2ludGVyIHRvIGJlIGluaXRpYWxpemVkCisgKgorICogRWZmZWN0OgorICogIEZpbmRzIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiBpbiB0aGUgbW9kdWxlIGluZm9ybWF0aW9uLCBhbmQgZmlsbHMgaW4KKyAqIHRoZSBwcm92aWRlZCBsZHJfc2VjdGlvbl9pbmZvIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICogIFRSVUUgZm9yIHN1Y2Nlc3MsIEZBTFNFIGZvciBzZWN0aW9uIG5vdCBmb3VuZAorICovCitleHRlcm4gaW50IGRsb2FkX2dldF9zZWN0aW9uX2luZm8odm9pZCAqbWluZm8sCisJCQkJICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWUsCisJCQkJICBjb25zdCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbworCQkJCSAgKipjb25zdCBzZWN0aW9uX2luZm8pOworCisvKgorICogUHJvY2VkdXJlIGRsb2FkX2dldF9zZWN0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtaW5mbyAgICAgICBIYW5kbGUgZnJvbSBkbG9hZF9tb2R1bGVfb3BlbiBmb3IgdGhpcyBtb2R1bGUKKyAqICBzZWN0aW9uX2luZm8gUG9pbnRlciB0byBhIHNlY3Rpb24gaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXNpcmVkIHNlY3Rpb24KKyAqICBzZWN0aW9uX2RhdGEgQnVmZmVyIHRvIGNvbnRhaW4gdGhlIHNlY3Rpb24gaW5pdGlhbGl6ZWQgZGF0YQorICoKKyAqIEVmZmVjdDoKKyAqICBDb3BpZXMgdGhlIGluaXRpYWxpemVkIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiBpbnRvIHRoZQorICogc3VwcGxpZWQgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgVFJVRSBmb3Igc3VjY2VzcywgRkFMU0UgZm9yIHNlY3Rpb24gbm90IGZvdW5kCisgKi8KK2V4dGVybiBpbnQgZGxvYWRfZ2V0X3NlY3Rpb24odm9pZCAqbWluZm8sCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm8sCisJCQkgICAgIHZvaWQgKnNlY3Rpb25fZGF0YSk7CisKKy8qCisgKiBQcm9jZWR1cmUgZGxvYWRfbW9kdWxlX2Nsb3NlCisgKgorICogUGFyYW1ldGVyczoKKyAqICBtaW5mbyAgICAgICBIYW5kbGUgZnJvbSBkbG9hZF9tb2R1bGVfb3BlbiBmb3IgdGhpcyBtb2R1bGUKKyAqCisgKiBFZmZlY3Q6CisgKiAgUmVsZWFzZXMgYW55IHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUgaGFuZGxlLiAgT24gcmV0dXJuLAorICogdGhlIG1vZHVsZSBoYW5kbGUgaXMgaW52YWxpZC4KKyAqCisgKiBSZXR1cm5zOgorICogIFplcm8gZm9yIHN1Y2Nlc3MuIE9uIGVycm9yLCB0aGUgbnVtYmVyIG9mIGVycm9ycyBkZXRlY3RlZCBpcyByZXR1cm5lZC4KKyAqIEluZGl2aWR1YWwgZXJyb3JzIGFyZSByZXBvcnRlZCB1c2luZyBzeW1zLT5lcnJvcl9yZXBvcnQoKSwgd2hlcmUgc3ltcyB3YXMKKyAqIGFuIGFyZ3VtZW50IHRvIGRsb2FkX21vZHVsZV9vcGVuCisgKi8KK2V4dGVybiB2b2lkIGRsb2FkX21vZHVsZV9jbG9zZSh2b2lkICptaW5mbyk7CisKKyNlbmRpZiAvKiBfR0VUU0VDVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2doLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZ2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGUyOTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2doLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGdoLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBHSF8KKyNkZWZpbmUgR0hfCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworZXh0ZXJuIHN0cnVjdCBnaF90X2hhc2hfdGFiICpnaF9jcmVhdGUodTE2IG1heF9idWNrZXQsIHUxNiB2YWxfc2l6ZSwKKwkJCQkgICAgICAgdTE2KCpoYXNoKSAodm9pZCAqLCB1MTYpLAorCQkJCSAgICAgICBib29sKCptYXRjaCkgKHZvaWQgKiwgdm9pZCAqKSwKKwkJCQkgICAgICAgdm9pZCAoKmRlbGV0ZSkgKHZvaWQgKikpOworZXh0ZXJuIHZvaWQgZ2hfZGVsZXRlKHN0cnVjdCBnaF90X2hhc2hfdGFiICpoYXNoX3RhYik7CitleHRlcm4gdm9pZCBnaF9leGl0KHZvaWQpOworZXh0ZXJuIHZvaWQgKmdoX2ZpbmQoc3RydWN0IGdoX3RfaGFzaF90YWIgKmhhc2hfdGFiLCB2b2lkICprZXkpOworZXh0ZXJuIHZvaWQgZ2hfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkICpnaF9pbnNlcnQoc3RydWN0IGdoX3RfaGFzaF90YWIgKmhhc2hfdGFiLCB2b2lkICprZXksIHZvaWQgKnZhbHVlKTsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCit2b2lkIGdoX2l0ZXJhdGUoc3RydWN0IGdoX3RfaGFzaF90YWIgKmhhc2hfdGFiLAorCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqLCB2b2lkICopLCB2b2lkICp1c2VyX2RhdGEpOworI2VuZGlmCisjZW5kaWYgLyogR0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmQ4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvZ3MuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogZ3MuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBNZW1vcnkgYWxsb2NhdGlvbi9yZWxlYXNlIHdyYXBwZXJzLiAgVGhpcyBtb2R1bGUgYWxsb3dzIGNsaWVudHMgdG8KKyAqIGF2b2lkIE9TIHNwYWNpZmljIGlzc3VlcyByZWxhdGVkIHRvIG1lbW9yeSBhbGxvY2F0aW9uLiAgSXQgYWxzbyBwcm92aWRlcworICogc2ltcGxlIGRpYWdub3N0aWMgY2FwYWJpbGl0aWVzIHRvIGFzc2lzdCBpbiB0aGUgZGV0ZWN0aW9uIG9mIG1lbW9yeQorICogbGVha3MuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBHU18KKyNkZWZpbmUgR1NfCisKKy8qCisgKiAgPT09PT09PT0gZ3NfYWxsb2MgPT09PT09PT0KKyAqICBBbGxvYyBzaXplIGJ5dGVzIG9mIHNwYWNlLiAgUmV0dXJucyBwb2ludGVyIHRvIHNwYWNlCisgKiAgYWxsb2NhdGVkLCBvdGhlcndpc2UgTlVMTC4KKyAqLworZXh0ZXJuIHZvaWQgKmdzX2FsbG9jKHUzMiBzaXplKTsKKworLyoKKyAqICA9PT09PT09PSBnc19leGl0ID09PT09PT09CisgKiAgTW9kdWxlIGV4aXQuICBEbyBub3QgY2hhbmdlIHRvICIjZGVmaW5lIGdzX2luaXQoKSI7IGluCisgKiAgc29tZSBlbnZpcm9ubWVudHMgdGhpcyBvcGVyYXRpb24gbXVzdCBhY3R1YWxseSBkbyBzb21lIHdvcmshCisgKi8KK2V4dGVybiB2b2lkIGdzX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gZ3NfZnJlZSA9PT09PT09PQorICogIEZyZWUgc3BhY2UgYWxsb2NhdGVkIGJ5IGdzX2FsbG9jKCkgb3IgR1NfY2FsbG9jKCkuCisgKi8KK2V4dGVybiB2b2lkIGdzX2ZyZWUodm9pZCAqcHRyKTsKKworLyoKKyAqICA9PT09PT09PSBnc19mcmVlcyA9PT09PT09PQorICogIEZyZWUgc3BhY2UgYWxsb2NhdGVkIGJ5IGdzX2FsbG9jKCkgb3IgR1NfY2FsbG9jKCkgYW5kIGFzc2VydCB0aGF0CisgKiAgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gaXMgc2l6ZSBieXRlcy4KKyAqLworZXh0ZXJuIHZvaWQgZ3NfZnJlZXModm9pZCAqcHRyLCB1MzIgc2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gZ3NfaW5pdCA9PT09PT09PQorICogIE1vZHVsZSBpbml0aWFsaXphdGlvbi4gIERvIG5vdCBjaGFuZ2UgdG8gIiNkZWZpbmUgZ3NfaW5pdCgpIjsgaW4KKyAqICBzb21lIGVudmlyb25tZW50cyB0aGlzIG9wZXJhdGlvbiBtdXN0IGFjdHVhbGx5IGRvIHNvbWUgd29yayEKKyAqLworZXh0ZXJuIHZvaWQgZ3NfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qR1NfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvaG9zdF9vcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2hvc3Rfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRmZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2hvc3Rfb3MuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogaG9zdF9vcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9IT1NUX09TX0hfCisjZGVmaW5lIF9IT1NUX09TX0hfCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPHBsYXQvbWFpbGJveC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKy8qIFRPRE8gLS0gUmVtb3ZlLCBvbmNlIEJQIGRlZmluZXMgdGhlbSAqLworI2RlZmluZSBJTlRfRFNQX01NVV9JUlEgICAgICAgIDI4CisKK3N0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSB7CisJdm9pZCAoKmRzcF9zZXRfbWluX29wcCkgKHU4IG9wcF9pZCk7CisJIHU4KCpkc3BfZ2V0X29wcCkgKHZvaWQpOworCXZvaWQgKCpjcHVfc2V0X2ZyZXEpICh1bnNpZ25lZCBsb25nIGYpOworCXVuc2lnbmVkIGxvbmcgKCpjcHVfZ2V0X2ZyZXEpICh2b2lkKTsKKwl1bnNpZ25lZCBsb25nIG1wdV9zcGVlZFs2XTsKKworCS8qIGZ1bmN0aW9ucyB0byB3cml0ZSBhbmQgcmVhZCBQUkNNIHJlZ2lzdGVycyAqLworCXZvaWQgKCpkc3BfcHJtX3dyaXRlKSh1MzIsIHMxNiAsIHUxNik7CisJdTMyICgqZHNwX3BybV9yZWFkKShzMTYgLCB1MTYpOworCXUzMiAoKmRzcF9wcm1fcm13X2JpdHMpKHUzMiwgdTMyLCBzMTYsIHMxNik7CisJdm9pZCAoKmRzcF9jbV93cml0ZSkodTMyLCBzMTYgLCB1MTYpOworCXUzMiAoKmRzcF9jbV9yZWFkKShzMTYgLCB1MTYpOworCXUzMiAoKmRzcF9jbV9ybXdfYml0cykodTMyLCB1MzIsIHMxNiwgczE2KTsKKworCXUzMiBwaHlzX21lbXBvb2xfYmFzZTsKKwl1MzIgcGh5c19tZW1wb29sX3NpemU7Cit9OworCisjZGVmaW5lIFBSQ01fVkREMSAxCisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwX2RzcGJyaWRnZV9kZXY7CitleHRlcm4gc3RydWN0IGRldmljZSAqYnJpZGdlOworCisjaWYgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0UpIHx8IGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX01PRFVMRSkKK2V4dGVybiB2b2lkIGRzcGJyaWRnZV9yZXNlcnZlX3NkcmFtKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc3BicmlkZ2VfcmVzZXJ2ZV9zZHJhbSh2b2lkKQoreworfQorI2VuZGlmCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRzcGJyaWRnZV9nZXRfbWVtcG9vbF9iYXNlKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzQ2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvaW8uaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIGlvLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogVGhlIGlvIG1vZHVsZSBtYW5hZ2VzIElPIGJldHdlZW4gQ0hOTCBhbmQgbXNnX2N0cmwuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBJT18KKyNkZWZpbmUgSU9fCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvaW9kZWZzLmg+CisKKy8qCisgKiAgPT09PT09PT0gaW9fY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGFuIElPIG1hbmFnZXIgb2JqZWN0LCByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgSU8gYmV0d2VlbgorICogICAgICBDSE5MIGFuZCBtc2dfY3RybC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBjaGFubmVsX21ncjogICAgICAgICAgICBMb2NhdGlvbiB0byBzdG9yZSBhIGNoYW5uZWwgbWFuYWdlciBvYmplY3Qgb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LgorICogICAgICBoZGV2X29iajogICAgICAgICAgICAgSGFuZGxlIHRvIGEgZGV2aWNlIG9iamVjdC4KKyAqICAgICAgbWdyX2F0dHJ0czogICAgICAgICAgICAgIElPIG1hbmFnZXIgYXR0cmlidXRlcy4KKyAqICAgICAgbWdyX2F0dHJ0cy0+YmlycTogICAgICAgIEkvTyBJUlEgbnVtYmVyLgorICogICAgICBtZ3JfYXR0cnRzLT5pcnFfc2hhcmVkOiAgICAgVFJVRSBpZiB0aGUgSVJRIGlzIHNoYXJlYWJsZS4KKyAqICAgICAgbWdyX2F0dHJ0cy0+d29yZF9zaXplOiAgIERTUCBXb3JkIHNpemUgaW4gZXF1aXZhbGVudCBQQyBieXRlcy4uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICAgICAgU3VjY2VzczsKKyAqICAgICAgLUVOT01FTTogICAgICAgICAgICBJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciByZXF1ZXN0ZWQgcmVzb3VyY2VzLgorICogICAgICAtRUlPOiAgICAgICAgICAgICBVbmFibGUgdG8gcGx1ZyBjaGFubmVsIElTUiBmb3IgY29uZmlndXJlZCBJUlEuCisgKiAgICAgIC1FSU5WQUw6IEludmFsaWQgRFNQIHdvcmQgc2l6ZSAobXVzdCBiZSA+IDApLgorICogICAgICAgICAgICAgICBJbnZhbGlkIGJhc2UgYWRkcmVzcyBmb3IgRFNQIGNvbW11bmljYXRpb25zLgorICogIFJlcXVpcmVzOgorICogICAgICBpb19pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgaW9fbWFuICE9IE5VTEwuCisgKiAgICAgIG1ncl9hdHRydHMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGlvX2NyZWF0ZShzdHJ1Y3QgaW9fbWdyICoqaW9fbWFuLAorCQkJICAgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaW9fYXR0cnMgKm1ncl9hdHRydHMpOworCisvKgorICogID09PT09PT09IGlvX2Rlc3Ryb3kgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZXN0cm95IHRoZSBJTyBtYW5hZ2VyLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhpb19tZ3I6ICAgICAgICAgSU9tYW5hZ2VyIG9iamVjdC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgaGlvX21nciB3YXMgaW52YWxpZC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgaW9faW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBpb19kZXN0cm95KHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IpOworCisvKgorICogID09PT09PT09IGlvX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiB0aGUgSU8gbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgaW9faW5pdCh2b2lkKSBwcmV2aW91c2x5IGNhbGxlZC4KKyAqICBFbnN1cmVzOgorICogICAgICBSZXNvdXJjZXMsIGlmIGFueSBhY3F1aXJlZCBpbiBpb19pbml0KHZvaWQpLCBhcmUgZnJlZWQgd2hlbiB0aGUgbGFzdAorICogICAgICBjbGllbnQgb2YgSU8gY2FsbHMgaW9fZXhpdCh2b2lkKS4KKyAqLworZXh0ZXJuIHZvaWQgaW9fZXhpdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBpb19pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgSU8gbW9kdWxlJ3MgcHJpdmF0ZSBzdGF0ZS4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgaW5pdGlhbGl6ZWQ7IEZBTFNFIGlmIGVycm9yIG9jY3VycmVkLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKiAgICAgIEEgcmVxdWlyZW1lbnQgZm9yIGVhY2ggb2YgdGhlIG90aGVyIHB1YmxpYyBDSE5MIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGJvb2wgaW9faW5pdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBpb19vbl9sb2FkZWQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDYWxsZWQgd2hlbiBhIHByb2dyYW0gaXMgbG9hZGVkIHNvIElPIG1hbmFnZXIgY2FuIHVwZGF0ZSBpdHMKKyAqICAgICAgaW50ZXJuYWwgc3RhdGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGlvX21ncjogICAgICAgICBJT21hbmFnZXIgb2JqZWN0LgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBoaW9fbWdyIHdhcyBpbnZhbGlkLgorICogIFJlcXVpcmVzOgorICogICAgICBpb19pbml0KHZvaWQpIGNhbGxlZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IGlvX29uX2xvYWRlZChzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyKTsKKworI2VuZGlmIC8qIENITkxfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvaW9fc20uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9pb19zbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWVjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvaW9fc20uaApAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIGlvX3NtLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogSU8gZGlzcGF0Y2hlciBmb3IgYSBzaGFyZWQgbWVtb3J5IGNoYW5uZWwgZHJpdmVyLgorICogQWxzbywgaW5jbHVkZXMgbWFjcm9zIHRvIHNpbXVsYXRlIHNobSB2aWEgcG9ydCBpbyBjYWxscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIElPU01fCisjZGVmaW5lIElPU01fCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvX2Nobmxfc20uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2lvZGVmcy5oPgorCisjZGVmaW5lIElPX0lOUFVUICAgICAgICAgICAgMAorI2RlZmluZSBJT19PVVRQVVQgICAgICAgICAgIDEKKyNkZWZpbmUgSU9fU0VSVklDRSAgICAgICAgICAyCisjZGVmaW5lIElPX01BWFNFUlZJQ0UgICAgICAgSU9fU0VSVklDRQorCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBPUFBzIHRoYXQgYXJlIHN1cHBvcnRlZCAqLworZXh0ZXJuIHMzMiBkc3BfbWF4X29wcHM7CisvKiBUaGUgVmRkMSBvcHAgdGFibGUgaW5mb3JtYXRpb24gKi8KK2V4dGVybiB1MzIgdmRkMV9kc3BfZnJlcVs2XVs0XTsKKyNlbmRpZgorCisvKgorICogID09PT09PT09IGlvX2NhbmNlbF9jaG5sID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2FuY2VsIElPIG9uIGEgZ2l2ZW4gY2hhbm5lbC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgSU8gTWFuYWdlci4KKyAqICAgICAgY2hubDogICAgICAgSW5kZXggb2YgY2hhbm5lbCB0byBjYW5jZWwgSU8gb24uCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgaGlvX21nci4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBpb19jYW5jZWxfY2hubChzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyLCB1MzIgY2hubCk7CisKKy8qCisgKiAgPT09PT09PT0gaW9fZHBjID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVmZXJyZWQgcHJvY2VkdXJlIGNhbGwgZm9yIHNoYXJlZCBtZW1vcnkgY2hhbm5lbCBkcml2ZXIgSVNSLiAgQ2FycmllcworICogICAgICBvdXQgdGhlIGRpc3BhdGNoIG9mIEkvTy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICByZWZfZGF0YTogICBQb2ludGVyIHRvIHJlZmVyZW5jZSBkYXRhIHJlZ2lzdGVyZWQgdmlhIGEgY2FsbCB0bworICogICAgICAgICAgICAgICAgICBEUENfQ3JlYXRlKCkuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgTXVzdCBub3QgYmxvY2suCisgKiAgICAgIE11c3Qgbm90IGFjcXVpcmUgcmVzb3VyY2VzLgorICogICAgICBBbGwgZGF0YSB0b3VjaGVkIG11c3QgYmUgbG9ja2VkIGluIG1lbW9yeSBpZiBydW5uaW5nIGluIGtlcm5lbCBtb2RlLgorICogIEVuc3VyZXM6CisgKiAgICAgIE5vbi1wcmVlbXB0aWJsZSAoYnV0IGludGVycnVwdGlibGUpLgorICovCitleHRlcm4gdm9pZCBpb19kcGModW5zaWduZWQgbG9uZyByZWZfZGF0YSk7CisKKy8qCisgKiAgPT09PT09PT0gaW9fbWJveF9tc2cgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBNYWluIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBCcmlkZ2UgY2hhbm5lbCBtYW5hZ2VyLgorICogICAgICBDYWxscyB0aGUgQnJpZGdlJ3MgY2hubHNtX2lzciB0byBkZXRlcm1pbmUgaWYgdGhpcyBpbnRlcnJ1cHQgaXMgb3VycywKKyAqICAgICAgdGhlbiBzY2hlZHVsZXMgYSBEUEMgdG8gZGlzcGF0Y2ggSS9PLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHJlZl9kYXRhOiAgIFBvaW50ZXIgdG8gdGhlIGNoYW5uZWwgbWFuYWdlciBvYmplY3QgZm9yIHRoaXMgYm9hcmQuCisgKiAgICAgICAgICAgICAgICAgIFNldCBpbiBhbiBpbml0aWFsIGNhbGwgdG8gSVNSX0luc3RhbGwoKS4KKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIGludGVycnVwdCBoYW5kbGVkOyBGQUxTRSBvdGhlcndpc2UuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIE11c3QgYmUgaW4gbG9ja2VkIG1lbW9yeSBpZiBleGVjdXRpbmcgaW4ga2VybmVsIG1vZGUuCisgKiAgICAgIE11c3Qgb25seSBjYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgaW4gbG9ja2VkIG1lbW9yeSBpZiBLZXJuZWwgbW9kZS4KKyAqICAgICAgTXVzdCBvbmx5IGNhbGwgYXN5bmNocm9ub3VzIHNlcnZpY2VzLgorICogICAgICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgRU9JIGZvciB0aGlzIGludGVycnVwdCBoYXMgYmVlbiBzZW50LgorICogIEVuc3VyZXM6CisgKi8KK3ZvaWQgaW9fbWJveF9tc2codTMyIG1zZyk7CisKKy8qCisgKiAgPT09PT09PT0gaW9fcmVxdWVzdF9jaG5sID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVxdWVzdCBJL08gZnJvbSB0aGUgRFNQLiBTZXRzIGZsYWdzIGluIHNoYXJlZCBtZW1vcnksIHRoZW4gaW50ZXJydXB0cworICogICAgICB0aGUgRFNQLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhpb19tZ3I6ICAgICBJTyBtYW5hZ2VyIGhhbmRsZS4KKyAqICAgICAgcGNobmw6ICAgICAgUHRyIHRvIHRoZSBjaGFubmVsIHJlcXVlc3RpbmcgSS9PLgorICogICAgICBpb19tb2RlOiAgICAgIE1vZGUgb2YgY2hhbm5lbDoge0lPX0lOUFVUIHwgSU9fT1VUUFVUfS4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBwY2hubCAhPSBOVUxMCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgaW9fcmVxdWVzdF9jaG5sKHN0cnVjdCBpb19tZ3IgKmlvX21hbmFnZXIsCisJCQkgICAgc3RydWN0IGNobmxfb2JqZWN0ICpwY2hubCwKKwkJCSAgICB1OCBpb19tb2RlLCB1MTYgKm1ieF92YWwpOworCisvKgorICogID09PT09PT09IGlvc21fc2NoZWR1bGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTY2hlZHVsZSBEUEMgZm9yIElPLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHBpb19tZ3I6ICAgICBQdHIgdG8gYSBJL08gbWFuYWdlci4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBwY2hubCAhPSBOVUxMCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgaW9zbV9zY2hlZHVsZShzdHJ1Y3QgaW9fbWdyICppb19tYW5hZ2VyKTsKKworLyoKKyAqIERTUC1ETUEgSU8gZnVuY3Rpb25zCisgKi8KKworLyoKKyAqICA9PT09PT09PSBpb19kZG1hX2luaXRfY2hubF9kZXNjID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSBEU1AgRE1BIGNoYW5uZWwgZGVzY3JpcHRvci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgICAgIEhhbmRsZSB0byBhIEkvTyBtYW5hZ2VyLgorICogICAgICBkZG1hX2NobmxfaWQ6ICAgIERETUEgY2hhbm5lbCBpZGVudGlmaWVyLgorICogICAgICBudW1fZGVzYzogICAgICAgTnVtYmVyIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycyhlcXVhbHMgIyBvZiBJT1JlcXMgJgorICogICAgICAgICAgICAgICAgICAgICAgQ2hpcnBzKQorICogICAgICBkc3A6ICAgICAgICAgICBEc3AgYWRkcmVzczsKKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgIGRkbWFfY2hubF9pZCA8IERETUFfTUFYRERNQUNITkxTCisgKiAgICAgbnVtX2Rlc2MgPiAwCisgKiAgICAgcFZhICE9IE5VTEwKKyAqICAgICBwRHNwUGEgIT0gTlVMTAorICoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBpb19kZG1hX2luaXRfY2hubF9kZXNjKHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IsIHUzMiBkZG1hX2NobmxfaWQsCisJCQkJICAgdTMyIG51bV9kZXNjLCB2b2lkICpkc3ApOworCisvKgorICogID09PT09PT09IGlvX2RkbWFfY2xlYXJfY2hubF9kZXNjID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2xlYXIgRFNQIERNQSBjaGFubmVsIGRlc2NyaXB0b3IuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGlvX21ncjogICAgICAgICBIYW5kbGUgdG8gYSBJL08gbWFuYWdlci4KKyAqICAgICAgZGRtYV9jaG5sX2lkOiAgICBERE1BIGNoYW5uZWwgaWRlbnRpZmllci4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgIGRkbWFfY2hubF9pZCA8IERETUFfTUFYRERNQUNITkxTCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgaW9fZGRtYV9jbGVhcl9jaG5sX2Rlc2Moc3RydWN0IGlvX21nciAqaGlvX21nciwgdTMyIGRkbWFfY2hubF9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gaW9fZGRtYV9yZXF1ZXN0X2NobmwgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXF1ZXN0IGNoYW5uZWwgRFNQLURNQSBmcm9tIHRoZSBEU1AuIFNldHMgdXAgU00gZGVzY3JpcHRvcnMgYW5kCisgKiAgICAgIGNvbnRyb2wgZmllbGRzIGluIHNoYXJlZCBtZW1vcnkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGlvX21ncjogICAgIEhhbmRsZSB0byBhIEkvTyBtYW5hZ2VyLgorICogICAgICBwY2hubDogICAgICBQdHIgdG8gY2hhbm5lbCBvYmplY3QKKyAqICAgICAgY2hubF9wYWNrZXRfb2JqOiAgICAgUHRyIHRvIGNoYW5uZWwgaS9vIHJlcXVlc3QgcGFja2V0LgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHBjaG5sICE9IE5VTEwKKyAqICAgICAgcGNobmwtPmNpb19yZXFzID4gMAorICogICAgICBjaG5sX3BhY2tldF9vYmogIT0gTlVMTAorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB2b2lkIGlvX2RkbWFfcmVxdWVzdF9jaG5sKHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IsCisJCQkJIHN0cnVjdCBjaG5sX29iamVjdCAqcGNobmwsCisJCQkJIHN0cnVjdCBjaG5sX2lycCAqY2hubF9wYWNrZXRfb2JqLAorCQkJCSB1MTYgKm1ieF92YWwpOworCisvKgorICogWmVyby1jb3B5IElPIGZ1bmN0aW9ucworICovCisKKy8qCisgKiAgPT09PT09PT0gaW9fZGR6Y19pbml0X2NobmxfZGVzYyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgWkNQWSBjaGFubmVsIGRlc2NyaXB0b3IuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGlvX21ncjogICAgIEhhbmRsZSB0byBhIEkvTyBtYW5hZ2VyLgorICogICAgICB6aWQ6ICAgICAgICB6ZXJvLWNvcHkgY2hhbm5lbCBpZGVudGlmaWVyLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgZGRtYV9jaG5sX2lkIDwgRERNQV9NQVhaQ1BZQ0hOTFMKKyAqICAgICBoaW9fbWdyICE9IE51bGwKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBpb19kZHpjX2luaXRfY2hubF9kZXNjKHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IsIHUzMiB6aWQpOworCisvKgorICogID09PT09PT09IGlvX2RkemNfY2xlYXJfY2hubF9kZXNjID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2xlYXIgRFNQIFpDIGNoYW5uZWwgZGVzY3JpcHRvci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgICAgIEhhbmRsZSB0byBhIEkvTyBtYW5hZ2VyLgorICogICAgICBjaF9pZDogICAgICAgIFpDIGNoYW5uZWwgaWRlbnRpZmllci4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBoaW9fbWdyIGlzIHZhbGlkCisgKiAgICAgIGNoX2lkIDwgRERNQV9NQVhaQ1BZQ0hOTFMKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdm9pZCBpb19kZHpjX2NsZWFyX2NobmxfZGVzYyhzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyLCB1MzIgY2hfaWQpOworCisvKgorICogID09PT09PT09IGlvX2RkemNfcmVxdWVzdF9jaG5sID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVxdWVzdCB6ZXJvLWNvcHkgY2hhbm5lbCB0cmFuc2Zlci4gU2V0cyB1cCBTTSBkZXNjcmlwdG9ycyBhbmQKKyAqICAgICAgY29udHJvbCBmaWVsZHMgaW4gc2hhcmVkIG1lbW9yeS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgICAgIEhhbmRsZSB0byBhIEkvTyBtYW5hZ2VyLgorICogICAgICBwY2hubDogICAgICAgICAgUHRyIHRvIGNoYW5uZWwgb2JqZWN0CisgKiAgICAgIGNobmxfcGFja2V0X29iajogICAgICAgICBQdHIgdG8gY2hhbm5lbCBpL28gcmVxdWVzdCBwYWNrZXQuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgcGNobmwgIT0gTlVMTAorICogICAgICBwY2hubC0+Y2lvX3JlcXMgPiAwCisgKiAgICAgIGNobmxfcGFja2V0X29iaiAhPSBOVUxMCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgaW9fZGR6Y19yZXF1ZXN0X2Nobmwoc3RydWN0IGlvX21nciAqaGlvX21nciwKKwkJCQkgc3RydWN0IGNobmxfb2JqZWN0ICpwY2hubCwKKwkJCQkgc3RydWN0IGNobmxfaXJwICpjaG5sX3BhY2tldF9vYmosCisJCQkJIHUxNiAqbWJ4X3ZhbCk7CisKKy8qCisgKiAgPT09PT09PT0gaW9fc2hfbXNldHRpbmcgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZXRzIHRoZSBzaGFyZWQgbWVtb3J5IHNldHRpbmcKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBoaW9fbWdyOiAgICAgICAgIEhhbmRsZSB0byBhIEkvTyBtYW5hZ2VyLgorICogICAgICBkZXNjOiAgICAgICAgICAgICBTaGFyZWQgbWVtb3J5IHR5cGUKKyAqICAgICAgcGFyZ3M6ICAgICAgICAgIFB0ciB0byBzaG0gc2V0dGluZworICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGhpb19tZ3IgIT0gTlVMTAorICogICAgICBwYXJncyAhPSBOVUxMCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBpb19zaF9tc2V0dGluZyhzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyLCB1OCBkZXNjLCB2b2lkICpwYXJncyk7CisKKy8qCisgKiAgTWlzYyBmdW5jdGlvbnMgZm9yIHRoZSBDSE5MX0lPIHNoYXJlZCBtZW1vcnkgbGlicmFyeToKKyAqLworCisvKiBNYXhpbXVtIGNoYW5uZWwgYnVmc2l6ZSB0aGF0IGNhbiBiZSB1c2VkLiAqLworZXh0ZXJuIHUzMiBpb19idWZfc2l6ZShzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyKTsKKworZXh0ZXJuIHUzMiBpb19yZWFkX3ZhbHVlKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LCB1MzIgZHNwX2FkZHIpOworCitleHRlcm4gdm9pZCBpb193cml0ZV92YWx1ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCSAgIHUzMiBkc3BfYWRkciwgdTMyIHZhbHVlKTsKKworZXh0ZXJuIHUzMiBpb19yZWFkX3ZhbHVlX2xvbmcoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZGV2X2N0eHQsCisJCQkgICAgICB1MzIgZHNwX2FkZHIpOworCitleHRlcm4gdm9pZCBpb193cml0ZV92YWx1ZV9sb25nKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJCXUzMiBkc3BfYWRkciwgdTMyIHZhbHVlKTsKKworZXh0ZXJuIHZvaWQgaW9fb3Jfc2V0X3ZhbHVlKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmRldl9jdHh0LAorCQkJICAgIHUzMiBkc3BfYWRkciwgdTMyIHZhbHVlKTsKKworZXh0ZXJuIHZvaWQgaW9fYW5kX3NldF92YWx1ZShzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpkZXZfY3R4dCwKKwkJCSAgICAgdTMyIGRzcF9hZGRyLCB1MzIgdmFsdWUpOworCitleHRlcm4gdm9pZCBpb19zbV9pbml0KHZvaWQpOworCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0JBQ0tUUkFDRQorLyoKKyAqICA9PT09PT09PXByaW50X2RzcF90cmFjZV9idWZmZXIgPT09PT09PT0KKyAqICAgICAgUHJpbnQgRFNQIHRyYWNlYnVmZmVyLgorICovCitleHRlcm4gaW50IHByaW50X2RzcF90cmFjZV9idWZmZXIoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCQkgKmhicmlkZ2VfY29udGV4dCk7CisKK2ludCBkdW1wX2RzcF9zdGFjayhzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpicmlkZ2VfY29udGV4dCk7CisKK3ZvaWQgZHVtcF9kbF9tb2R1bGVzKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmJyaWRnZV9jb250ZXh0KTsKKworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9ERUJVRykKK3ZvaWQgcHJpbnRfZHNwX2RlYnVnX3RyYWNlKHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IpOworI2VuZGlmCisKKyNlbmRpZiAvKiBJT1NNXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2lvZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2lvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDEwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvaW9kZWZzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGlvZGVmcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFN5c3RlbS13aWRlIGNoYW5uZWwgb2JqZWN0cyBhbmQgY29uc3RhbnRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgSU9ERUZTXworI2RlZmluZSBJT0RFRlNfCisKKyNkZWZpbmUgSU9fTUFYSVJRICAgMHhmZgkvKiBBcmJpdHJhcmlseSBsYXJnZSBudW1iZXIuICovCisKKy8qIElPIE9iamVjdHM6ICovCitzdHJ1Y3QgaW9fbWdyOworCisvKiBJTyBtYW5hZ2VyIGF0dHJpYnV0ZXM6ICovCitzdHJ1Y3QgaW9fYXR0cnMgeworCXU4IGJpcnE7CQkvKiBDaGFubmVsJ3MgSS9PIElSUSBudW1iZXIuICovCisJYm9vbCBpcnFfc2hhcmVkOwkvKiBUUlVFIGlmIHRoZSBJUlEgaXMgc2hhcmVhYmxlLiAqLworCXUzMiB3b3JkX3NpemU7CQkvKiBEU1AgV29yZCBzaXplLiAqLworCXUzMiBzaG1fYmFzZTsJCS8qIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBzaGFyZWQgbWVtb3J5LiAqLworCXUzMiB1c21fbGVuZ3RoOwkJLyogU2l6ZSAoaW4gYnl0ZXMpIG9mIHNoYXJlZCBtZW1vcnkuICovCit9OworCisjZW5kaWYgLyogSU9ERUZTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2xkci5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL2xkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDI2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbGRyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGxkci5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFByb3ZpZGUgbW9kdWxlIGxvYWRpbmcgc2VydmljZXMgYW5kIHN5bWJvbCBleHBvcnQgc2VydmljZXMuCisgKgorICogTm90ZXM6CisgKiAgIFRoaXMgc2VydmljZSBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IG1vZHVsZXMgb2YgdGhlIERTUC9CSU9TIEJyaWRnZQorICogICBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBMRFJfCisjZGVmaW5lIExEUl8KKworLyogTG9hZGVyIG9iamVjdHM6ICovCitzdHJ1Y3QgbGRyX21vZHVsZTsKKworI2VuZGlmIC8qIExEUl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9saXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzdiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbGlzdC5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogbGlzdC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERlY2xhcmF0aW9ucyBvZiBsaXN0IG1hbmFnZW1lbnQgY29udHJvbCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucworICogb2YgaW5saW5lIGxpc3QgbWFuYWdlbWVudCBmdW5jdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTElTVF8KKyNkZWZpbmUgTElTVF8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjZGVmaW5lIExTVF9JU19FTVBUWShsKSAgICAgIGxpc3RfZW1wdHkoJihsKS0+aGVhZCkKKworc3RydWN0IGxzdF9saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Cit9OworCisvKgorICogID09PT09PT09IGxzdF9maXJzdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoZSBsaXN0CisgKiAgICAgIGlzIGVtcHR5LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGxzdDogIFBvaW50ZXIgdG8gbGlzdCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICBSZXR1cm5zOgorICogICAgICBQb2ludGVyIHRvIGZpcnN0IGxpc3QgZWxlbWVudCwgb3IgTlVMTC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgLSBMU1QgaW5pdGlhbGl6ZWQuCisgKiAgICAgIC0gbHN0ICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpsc3RfZmlyc3Qoc3RydWN0IGxzdF9saXN0ICpsc3QpCit7CisJaWYgKGxzdCAmJiAhbGlzdF9lbXB0eSgmbHN0LT5oZWFkKSkKKwkJcmV0dXJuIGxzdC0+aGVhZC5uZXh0OworCXJldHVybiBOVUxMOworfQorCisvKgorICogID09PT09PT09IGxzdF9nZXRfaGVhZCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFBvcHMgdGhlIGhlYWQgb2ZmIHRoZSBsaXN0IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdC4KKyAqICBEZXRhaWxzOgorICogICAgICBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcmV0dXJucyBOVUxMLgorICogICAgICBFbHNlLCByZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBtYWtpbmcgdGhlIG5leHQKKyAqICAgICAgZWxlbWVudCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqICAgICAgVGhlIGhlYWQgaXMgcmVtb3ZlZCBieSBtYWtpbmcgdGhlIHRhaWwgZWxlbWVudCBvZiB0aGUgbGlzdCBwb2ludCBpdHMKKyAqICAgICAgIm5leHQiIHBvaW50ZXIgYXQgdGhlIG5leHQgZWxlbWVudCBhZnRlciB0aGUgaGVhZCwgYW5kIGJ5IG1ha2luZyB0aGUKKyAqICAgICAgInByZXYiIHBvaW50ZXIgb2YgdGhlIG5leHQgZWxlbWVudCBhZnRlciB0aGUgaGVhZCBwb2ludCBhdCB0aGUgdGFpbAorICogICAgICBlbGVtZW50LiAgU28gdGhlIG5leHQgZWxlbWVudCBhZnRlciB0aGUgaGVhZCBiZWNvbWVzIHRoZSBuZXcgaGVhZCBvZgorICogICAgICB0aGUgbGlzdC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBsc3Q6ICAgIFBvaW50ZXIgdG8gbGlzdCBjb250cm9sIHN0cnVjdHVyZSBvZiBsaXN0IHdob3NlIGhlYWQKKyAqICAgICAgICAgICAgICBlbGVtZW50IGlzIHRvIGJlIHJlbW92ZWQKKyAqICBSZXR1cm5zOgorICogICAgICBQb2ludGVyIHRvIGVsZW1lbnQgdGhhdCB3YXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKHN1Y2Nlc3MpCisgKiAgICAgIE5VTEwgICAgICAgICAgTm8gZWxlbWVudHMgaW4gbGlzdAorICogIFJlcXVpcmVzOgorICogICAgICAtIExTVCBpbml0aWFsaXplZC4KKyAqICAgICAgLSBsc3QgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogIE5vdGVzOgorICogICAgICBCZWNhdXNlIHRoZSB0YWlsIG9mIHRoZSBsaXN0IHBvaW50cyBmb3J3YXJkIChpdHMgIm5leHQiIHBvaW50ZXIpIHRvCisgKiAgICAgIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBhbmQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgcG9pbnRzIGJhY2t3YXJkIChpdHMKKyAqICAgICAgInByZXYiIHBvaW50ZXIpIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCB0aGlzIGxpc3QgaXMgY2lyY3VsYXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqbHN0X2dldF9oZWFkKHN0cnVjdCBsc3RfbGlzdCAqbHN0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1fbGlzdDsKKworCWlmICghbHN0IHx8IGxpc3RfZW1wdHkoJmxzdC0+aGVhZCkpCisJCXJldHVybiBOVUxMOworCisJZWxlbV9saXN0ID0gbHN0LT5oZWFkLm5leHQ7CisJbHN0LT5oZWFkLm5leHQgPSBlbGVtX2xpc3QtPm5leHQ7CisJZWxlbV9saXN0LT5uZXh0LT5wcmV2ID0gJmxzdC0+aGVhZDsKKworCXJldHVybiBlbGVtX2xpc3Q7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbHN0X2luaXRfZWxlbSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemVzIGEgbGlzdCBlbGVtZW50IHRvIGRlZmF1bHQgKGNsZWFyZWQpIHZhbHVlcworICogIERldGFpbHM6CisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZWxlbV9saXN0OiAgUG9pbnRlciB0byBsaXN0IGVsZW1lbnQgdG8gYmUgcmVzZXQKKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBMU1QgaW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICBOb3RlczoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgdG8gInJlc2V0IiBhbiBlbGVtZW50IGluIHRoZSBtaWRkbGUKKyAqICAgICAgb2YgYSBsaXN0IGNoYWluIC0tIHRoYXQgd291bGQgYnJlYWsgdGhlIGNoYWluLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxzdF9pbml0X2VsZW0oc3RydWN0IGxpc3RfaGVhZCAqZWxlbV9saXN0KQoreworCWlmIChlbGVtX2xpc3QpIHsKKwkJZWxlbV9saXN0LT5uZXh0ID0gTlVMTDsKKwkJZWxlbV9saXN0LT5wcmV2ID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiAgPT09PT09PT0gbHN0X2luc2VydF9iZWZvcmUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgIEluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIGV4aXN0aW5nIGVsZW1lbnQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbHN0OiAgICAgICAgICAgIFBvaW50ZXIgdG8gbGlzdCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICAgICAgZWxlbV9saXN0OiAgICAgICAgICBQb2ludGVyIHRvIGVsZW1lbnQgaW4gbGlzdCB0byBpbnNlcnQuCisgKiAgICAgIGVsZW1fZXhpc3Rpbmc6ICBQb2ludGVyIHRvIGV4aXN0aW5nIGxpc3QgZWxlbWVudC4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICAtIExTVCBpbml0aWFsaXplZC4KKyAqICAgICAgLSBsc3QgIT0gTlVMTC4KKyAqICAgICAgLSBlbGVtX2xpc3QgIT0gTlVMTC4KKyAqICAgICAgLSBlbGVtX2V4aXN0aW5nICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxzdF9pbnNlcnRfYmVmb3JlKHN0cnVjdCBsc3RfbGlzdCAqbHN0LAorCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZWxlbV9saXN0LAorCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZWxlbV9leGlzdGluZykKK3sKKwlpZiAobHN0ICYmIGVsZW1fbGlzdCAmJiBlbGVtX2V4aXN0aW5nKQorCQlsaXN0X2FkZF90YWlsKGVsZW1fbGlzdCwgZWxlbV9leGlzdGluZyk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbHN0X25leHQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoZSBuZXh0CisgKiAgICAgIGVsZW1lbnQgaXMgdGhlIGhlYWQgb2YgdGhlIGxpc3Qgb3IgdGhlIGxpc3QgaXMgZW1wdHkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbHN0OiAgICAgICAgUG9pbnRlciB0byBsaXN0IGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBjdXJfZWxlbTogICBQb2ludGVyIHRvIGVsZW1lbnQgaW4gbGlzdCB0byByZW1vdmUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgUG9pbnRlciB0byBsaXN0IGVsZW1lbnQsIG9yIE5VTEwuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIC0gTFNUIGluaXRpYWxpemVkLgorICogICAgICAtIGxzdCAhPSBOVUxMLgorICogICAgICAtIGN1cl9lbGVtICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpsc3RfbmV4dChzdHJ1Y3QgbHN0X2xpc3QgKmxzdCwKKwkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmN1cl9lbGVtKQoreworCWlmIChsc3QgJiYgIWxpc3RfZW1wdHkoJmxzdC0+aGVhZCkgJiYgY3VyX2VsZW0gJiYKKwkgICAgKGN1cl9lbGVtLT5uZXh0ICE9ICZsc3QtPmhlYWQpKQorCQlyZXR1cm4gY3VyX2VsZW0tPm5leHQ7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbHN0X3B1dF90YWlsID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQWRkcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QKKyAqICBEZXRhaWxzOgorICogICAgICBTZXRzIG5ldyBlbGVtZW50J3MgInByZXYiIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3MgcHJldmlvdXNseSBoZWxkIGJ5CisgKiAgICAgIHRoZSBoZWFkIGVsZW1lbnQncyBwcmV2IHBvaW50ZXIuICBUaGlzIGlzIHRoZSBwcmV2aW91cyB0YWlsIG1lbWJlciBvZgorICogICAgICB0aGUgbGlzdC4KKyAqICAgICAgU2V0cyB0aGUgbmV3IGhlYWQncyBwcmV2IHBvaW50ZXIgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGVsZW1lbnQuCisgKiAgICAgIFNldHMgbmV4dCBwb2ludGVyIG9mIHRoZSBwcmV2aW91cyB0YWlsIG1lbWJlciBvZiB0aGUgbGlzdCB0byBwb2ludCB0bworICogICAgICB0aGUgbmV3IGVsZW1lbnQgKHJhdGhlciB0aGFuIHRoZSBoZWFkLCB3aGljaCBpdCBoYWQgYmVlbiBwb2ludGluZyBhdCkuCisgKiAgICAgIFNldHMgbmV3IGVsZW1lbnQncyBuZXh0IHBvaW50ZXIgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGhlYWQgZWxlbWVudC4KKyAqICAgICAgU2V0cyBoZWFkJ3MgcHJldiBwb2ludGVyIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgZWxlbWVudC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBsc3Q6ICAgIFBvaW50ZXIgdG8gbGlzdCBjb250cm9sIHN0cnVjdHVyZSB0byB3aGljaCAqZWxlbV9saXN0IHdpbGwgYmUKKyAqICAgICAgICAgICAgICBhZGRlZAorICogICAgICBlbGVtX2xpc3Q6ICBQb2ludGVyIHRvIGxpc3QgZWxlbWVudCB0byBiZSBhZGRlZAorICogIFJldHVybnM6CisgKiAgICAgIFZvaWQKKyAqICBSZXF1aXJlczoKKyAqICAgICAgKmVsZW1fbGlzdCBhbmQgKmxzdCBtdXN0IGJvdGggZXhpc3QuCisgKiAgICAgIExTVCBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIE5vdGVzOgorICogICAgICBCZWNhdXNlIHRoZSB0YWlsIGlzIGFsd2F5cyAianVzdCBiZWZvcmUiIHRoZSBoZWFkIG9mIHRoZSBsaXN0ICh0aGUKKyAqICAgICAgdGFpbCdzICJuZXh0IiBwb2ludGVyIHBvaW50cyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgYW5kIHRoZSBoZWFkJ3MKKyAqICAgICAgInByZXYiIHBvaW50ZXIgcG9pbnRzIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0KSwgdGhlIGxpc3QgaXMgY2lyY3VsYXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsc3RfcHV0X3RhaWwoc3RydWN0IGxzdF9saXN0ICpsc3QsCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqZWxlbV9saXN0KQoreworCWlmIChsc3QgJiYgZWxlbV9saXN0KQorCQlsaXN0X2FkZF90YWlsKGVsZW1fbGlzdCwgJmxzdC0+aGVhZCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbHN0X3JlbW92ZV9lbGVtID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVtb3ZlcyAodW5saW5rcykgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCwgaWYgdGhlIGxpc3QgaXMgbm90CisgKiAgICAgIGVtcHR5LiAgRG9lcyBub3QgZnJlZSB0aGUgbGlzdCBlbGVtZW50LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGxzdDogICAgICAgIFBvaW50ZXIgdG8gbGlzdCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICAgICAgY3VyX2VsZW06ICAgUG9pbnRlciB0byBlbGVtZW50IGluIGxpc3QgdG8gcmVtb3ZlLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIC0gTFNUIGluaXRpYWxpemVkLgorICogICAgICAtIGxzdCAhPSBOVUxMLgorICogICAgICAtIGN1cl9lbGVtICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxzdF9yZW1vdmVfZWxlbShzdHJ1Y3QgbHN0X2xpc3QgKmxzdCwKKwkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpjdXJfZWxlbSkKK3sKKwlpZiAobHN0ICYmICFsaXN0X2VtcHR5KCZsc3QtPmhlYWQpICYmIGN1cl9lbGVtKQorCQlsaXN0X2RlbF9pbml0KGN1cl9lbGVtKTsKK30KKworI2VuZGlmIC8qIExJU1RfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbWJ4X3NoLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbWJ4X3NoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNjVjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9tYnhfc2guaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIG1ieF9zaC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERlZmluaXRpb25zIGZvciBzaGFyZWQgbWFpbGJveCBjbWQvZGF0YSB2YWx1ZXMuKHVzZWQgb24gYm90aAorICogdGhlIEdQUCBhbmQgRFNQIHNpZGVzKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyoKKyAqICBCcmlkZ2UgdXNhZ2Ugb2YgT01BUCBtYWlsYm94IDEgaXMgZGV0ZXJtaW5lZCBieSB0aGUgImNsYXNzIiBvZiB0aGUKKyAqICBtYWlsYm94IGludGVycnVwdCdzIGNtZCB2YWx1ZSByZWNlaXZlZC4gVGhlIGNsYXNzIHZhbHVlIGFyZSBkZWZpbmVkCisgKiAgYXMgYSBiaXQgKDEwIHRocnUgMTUpIGJlaW5nIHNldC4KKyAqCisgKiAgTm90ZTogT25seSAxNiBiaXRzIG9mIGVhY2ggIGlzIHVzZWQuIE90aGVyIDE2IGJpdCBkYXRhIHJlZyBhdmFpbGFibGUuCisgKgorICogICAxNiBiaXQgTWJ4IGJpdCBkZWZuczoKKyAqCisgKiBBKS4gRXhjZXB0aW9uL0Vycm9yIGhhbmRsaW5nIChNb2R1bGUgREVIKSA6IGNsYXNzID0gMC4KKyAqCisgKiAgICAxNSAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgMAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgfDB8MHwwfDB8MHwwfHh8eHx4fHh8eHx4fHh8eHx4fHh8CisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICB8ICAoY2xhc3MpICB8IChtb2R1bGUgc3BlY2lmaWMpIHwKKyAqCisgKgorICogQjogRFNQLURNQSBsaW5rIGRyaXZlciBjaGFubmVscyAoRERNQSkgOiBjbGFzcyA9IDEuCisgKgorICogICAgMTUgICAgICAgICAxMCAgICAgICAgICAgICAgICAgIDAKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIHwwfDB8MHwwfDB8MXxifGJ8YnxifGJ8Y3xjfGN8Y3xjfAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgfCAgKGNsYXNzKSAgfCAobW9kdWxlIHNwZWNpZmljKSB8CisgKgorICogICB3aGVyZSBiIC0+IGJ1ZmZlciBpbmRleCAgKDMyIERETUEgYnVmZmVycy9jaG5sIG1heCkKKyAqICAgICAgICAgYyAtPiBjaGFubmVsIElkICAgICgzMiBERE1BIGNobmxzIG1heCkKKyAqCisgKgorICogQzogUHJvYy1jb3B5IGxpbmsgZHJpdmVyIGNoYW5uZWxzIChQQ1BZKSA6IGNsYXNzID0gMi4KKyAqCisgKiAgICAxNSAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgMAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgfDB8MHwwfDB8MXwwfHh8eHx4fHh8eHx4fHh8eHx4fHh8CisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICB8ICAoY2xhc3MpICB8IChtb2R1bGUgc3BlY2lmaWMpIHwKKyAqCisgKgorICogRDogWmVyby1jb3B5IGxpbmsgZHJpdmVyIGNoYW5uZWxzIChERFpDKSA6IGNsYXNzID0gNC4KKyAqCisgKiAgICAxNSAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgMAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgfDB8MHwwfDF8MHwwfHh8eHx4fHh8eHxjfGN8Y3xjfGN8CisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICB8ICAoY2xhc3MpICB8IChtb2R1bGUgc3BlY2lmaWMpIHwKKyAqCisgKiAgIHdoZXJlIHggLT4gbm90IHVzZWQKKyAqICAgICAgICAgYyAtPiBjaGFubmVsIElkICAgICgzMiBaQ1BZIGNobmxzIG1heCkKKyAqCisgKgorICogRTogUG93ZXIgbWFuYWdlbWVudCA6IGNsYXNzID0gOC4KKyAqCisgKiAgICAxNSAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgMAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgfDB8MHwxfDB8MHwwfHh8eHx4fHh8eHxjfGN8Y3xjfGN8CisKKyAqIAkwMDEwIDAweHggeHh4YyBjY2NjCisgKgkwMDEwIDAwbm4gcHBwcCBxcXFxCisgKglubjoKKyAqCTAwID0gcmVzZXJ2ZWQKKyAqCTAxID0gcHdyIHN0YXRlIGNoYW5nZQorICoJMTAgPSBvcHAgcHJlLWNoYW5nZQorICoJMTEgPSBvcHAgcG9zdC1jaGFuZ2UKKyAqCisgKglpZiBubiA9IHB3ciBzdGF0ZSBjaGFuZ2U6CisgKglwcHBwID0gZG9uJ3QgY2FyZQorICoJcXFxcToKKyAqCTAwMTAgPSBoaWJlcm5hdGUKKyAqCTAwMTAgMDAwMSAwMDAwIDAwMTAKKyAqCTAxMTAgPSByZXRlbnRpb24KKyAqCTAwMTAgMDAwMSAwMDAwIDAxMTAKKyAqCW90aGVycyByZXNlcnZlZAorICoKKyAqCWlmIG5uID0gb3BwIHByZS1jaGFuZ2U6CisgKglwcHBwID0gY3VycmVudCBvcHAKKyAqCXFxcXEgPSBuZXh0IG9wcAorICoKKyAqCWlmIG5uID0gb3BwIHBvc3QtY2hhbmdlOgorICoJcHBwcCA9IHByZXYgb3BwCisgKglxcXFxID0gY3VycmVudCBvcHAKKyAqCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICB8ICAoY2xhc3MpICB8IChtb2R1bGUgc3BlY2lmaWMpIHwKKyAqCisgKiAgIHdoZXJlIHggLT4gbm90IHVzZWQKKyAqICAgICAgICAgYyAtPiBQb3dlciBtYW5hZ2VtZW50IGNvbW1hbmQKKyAqCisgKi8KKworI2lmbmRlZiBfTUJYX1NIX0gKKyNkZWZpbmUgX01CWF9TSF9ICisKKyNkZWZpbmUgTUJYX0NMQVNTX01TSyAgICAgIDB4RkMwMAkvKiBDbGFzcyBiaXRzIGFyZSAxMCB0aHJ1IDE1ICovCisjZGVmaW5lIE1CWF9WQUxVRV9NU0sgICAgICAweDAzRkYJLyogVmFsdWUgaXMgMCB0aHJ1IDkgKi8KKworI2RlZmluZSBNQlhfREVIX0NMQVNTICAgICAgMHgwMDAwCS8qIERFSCBvd25zIE1ieCBJTlRSICovCisjZGVmaW5lIE1CWF9ERE1BX0NMQVNTICAgICAweDA0MDAJLyogRFNQLURNQSBsaW5rIGRydnIgY2hubHMgb3ducyBJTlRSICovCisjZGVmaW5lIE1CWF9QQ1BZX0NMQVNTICAgICAweDA4MDAJLyogUFJPQy1DT1BZICAiICovCisjZGVmaW5lIE1CWF9aQ1BZX0NMQVNTICAgICAweDEwMDAJLyogWkVSTy1DT1BZICAiICovCisjZGVmaW5lIE1CWF9QTV9DTEFTUyAgICAgICAweDIwMDAJLyogUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSBNQlhfREJHX0NMQVNTICAgICAgMHg0MDAwCS8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZSAqLworCisvKgorICogRXhjZXB0aW9uIEhhbmRsZXIgY29kZXMKKyAqIE1hZ2ljIGNvZGUgdXNlZCB0byBkZXRlcm1pbmUgaWYgRFNQIHNpZ25hbGVkIGV4Y2VwdGlvbi4KKyAqLworI2RlZmluZSBNQlhfREVIX0JBU0UgICAgICAgIDB4MAorI2RlZmluZSBNQlhfREVIX1VTRVJTX0JBU0UgIDB4MTAwCS8qIDI1NiAqLworI2RlZmluZSBNQlhfREVIX0xJTUlUICAgICAgIDB4M0ZGCS8qIDEwMjMgKi8KKyNkZWZpbmUgTUJYX0RFSF9SRVNFVCAgICAgICAweDEwMQkvKiBEU1AgUkVTRVQgKERFSCkgKi8KKyNkZWZpbmUgTUJYX0RFSF9FTU1VICAgICAgICAwWDEwMwkvKkRTUCBNTVUgRkFVTFQgUkVDT1ZFUlkgKi8KKworLyoKKyAqICBMaW5rIGRyaXZlciBjb21tYW5kL3N0YXR1cyBjb2Rlcy4KKyAqLworLyogRFNQLURNQSAqLworI2RlZmluZSBNQlhfRERNQV9OVU1DSE5MQklUUyA1CS8qICMgY2hubCBJZDogIyBiaXRzIGF2YWlsYWJsZSAqLworI2RlZmluZSBNQlhfRERNQV9DSE5MU0hJRlQgICAwCS8qICMgb2YgYml0cyB0byBzaGlmdCAqLworI2RlZmluZSBNQlhfRERNQV9DSE5MTVNLICAgICAweDAxRgkvKiBiaXRzIDAgdGhydSA0ICovCisKKyNkZWZpbmUgTUJYX0RETUFfTlVNQlVGQklUUyAgNQkvKiBidWZmZXIgaW5kZXg6ICMgb2YgYml0cyBhdmFpbCAqLworI2RlZmluZSBNQlhfRERNQV9CVUZTSElGVCAgICAoTUJYX0RETUFfTlVNQ0hOTEJJVFMgKyBNQlhfRERNQV9DSE5MU0hJRlQpCisjZGVmaW5lIE1CWF9ERE1BX0JVRk1TSyAgICAgIDB4M0UwCS8qIGJpdHMgNSB0aHJ1IDkgKi8KKworLyogWmVyby1Db3B5ICovCisjZGVmaW5lIE1CWF9aQ1BZX05VTUNITkxCSVRTIDUJLyogIyBjaG5sIElkOiAjIGJpdHMgYXZhaWxhYmxlICovCisjZGVmaW5lIE1CWF9aQ1BZX0NITkxTSElGVCAgIDAJLyogIyBvZiBiaXRzIHRvIHNoaWZ0ICovCisjZGVmaW5lIE1CWF9aQ1BZX0NITkxNU0sgICAgIDB4MDFGCS8qIGJpdHMgMCB0aHJ1IDQgKi8KKworLyogIFBvd2VyIE1hbmFnZW1lbnQgQ29tbWFuZHMgKi8KKyNkZWZpbmUgTUJYX1BNX0RTUElETEUgICAgICAgICAgICAgICAgICAoTUJYX1BNX0NMQVNTICsgMHgwKQorI2RlZmluZSBNQlhfUE1fRFNQV0FLRVVQICAgICAgICAgICAgICAgIChNQlhfUE1fQ0xBU1MgKyAweDEpCisjZGVmaW5lIE1CWF9QTV9FTUVSR0VOQ1lTTEVFUCAgICAgICAgICAgKE1CWF9QTV9DTEFTUyArIDB4MikKKyNkZWZpbmUgTUJYX1BNX1NMRUVQVU5USUxSRVNUQVJUICAgICAgICAoTUJYX1BNX0NMQVNTICsgMHgzKQorI2RlZmluZSBNQlhfUE1fRFNQR0xPQkFMSURMRV9PRkYgICAgICAgIChNQlhfUE1fQ0xBU1MgKyAweDQpCisjZGVmaW5lIE1CWF9QTV9EU1BHTE9CQUxJRExFX09OICAgICAgICAgKE1CWF9QTV9DTEFTUyArIDB4NSkKKyNkZWZpbmUgTUJYX1BNX1NFVFBPSU5UX1BSRU5PVElGWSAgICAgICAoTUJYX1BNX0NMQVNTICsgMHg2KQorI2RlZmluZSBNQlhfUE1fU0VUUE9JTlRfUE9TVE5PVElGWSAgICAgIChNQlhfUE1fQ0xBU1MgKyAweDcpCisjZGVmaW5lIE1CWF9QTV9EU1BSRVROICAgICAgICAgICAgICAgICAgKE1CWF9QTV9DTEFTUyArIDB4OCkKKyNkZWZpbmUgTUJYX1BNX0RTUFJFVEVOVElPTiAgICAgICAgKE1CWF9QTV9DTEFTUyArIDB4OCkKKyNkZWZpbmUgTUJYX1BNX0RTUEhJQkVSTkFURSAgICAgICAgKE1CWF9QTV9DTEFTUyArIDB4OSkKKyNkZWZpbmUgTUJYX1BNX0hJQkVSTkFURV9FTiAgICAgICAgKE1CWF9QTV9DTEFTUyArIDB4QSkKKyNkZWZpbmUgTUJYX1BNX09QUF9SRVEgICAgICAgICAgICAgICAgICAoTUJYX1BNX0NMQVNTICsgMHhCKQorI2RlZmluZSBNQlhfUE1fT1BQX0NIRyAgICAgICAgICAgICAgICAgIChNQlhfUE1fQ0xBU1MgKyAweEMpCisKKyNkZWZpbmUgTUJYX1BNX1RZUEVfTUFTSyAweDAzMDAKKyNkZWZpbmUgTUJYX1BNX1RZUEVfUFdSX0NITkcgMHgwMTAwCisjZGVmaW5lIE1CWF9QTV9UWVBFX09QUF9QUkVDSE5HIDB4MDIwMAorI2RlZmluZSBNQlhfUE1fVFlQRV9PUFBfUE9TVENITkcgMHgwMzAwCisjZGVmaW5lIE1CWF9QTV9UWVBFX09QUF9NQVNLIDB4MDMwMAorI2RlZmluZSBNQlhfUE1fT1BQX1BSRUNITkcgKE1CWF9QTV9DTEFTUyB8IE1CWF9QTV9UWVBFX09QUF9QUkVDSE5HKQorLyogRFNQIHRvIE1QVSAqLworI2RlZmluZSBNQlhfUE1fT1BQX0NITkcoT1BQKSAoTUJYX1BNX0NMQVNTIHwgTUJYX1BNX1RZUEVfT1BQX1BSRUNITkcgfCAoT1BQKSkKKyNkZWZpbmUgTUJYX1BNX1JFVCAoTUJYX1BNX0NMQVNTIHwgTUJYX1BNX1RZUEVfUFdSX0NITkcgfCAweDAwMDYpCisjZGVmaW5lIE1CWF9QTV9ISUIgKE1CWF9QTV9DTEFTUyB8IE1CWF9QTV9UWVBFX1BXUl9DSE5HIHwgMHgwMDAyKQorI2RlZmluZSBNQlhfUE1fT1BQMSAwCisjZGVmaW5lIE1CWF9QTV9PUFAyIDEKKyNkZWZpbmUgTUJYX1BNX09QUDMgMgorI2RlZmluZSBNQlhfUE1fT1BQNCAzCisKKy8qIEJyaWRnZSBEZWJ1ZyBDb21tYW5kcyAqLworI2RlZmluZSBNQlhfREJHX1NZU1BSSU5URiAgICAgICAoTUJYX0RCR19DTEFTUyArIDB4MCkKKworI2VuZGlmIC8qIF9NQlhfU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL21lbWRlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9tZW1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkMmM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9tZW1kZWZzLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIG1lbWRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgTUVNIGNvbnN0YW50cyBhbmQgdHlwZXMsIHNoYXJlZCBiZXR3ZWVuIEJyaWRnZSBkcml2ZXIgYW5kIERTUCBBUEkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTUVNREVGU18KKyNkZWZpbmUgTUVNREVGU18KKworLyoKKyAqICBNRU1fVklSVFVBTFNFR0lEIGlzIHVzZWQgYnkgTm9kZSAmIFN0cm0gdG8gYWNjZXNzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBpbgorICogIHRoZSBjb3JyZWN0IGNsaWVudCBwcm9jZXNzIGNvbnRleHQuCisgKi8KKyNkZWZpbmUgTUVNX1NFVFZJUlRVQUxTRUdJRCAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBNRU1fR0VUVklSVFVBTFNFR0lEICAgICAweDIwMDAwMDAwCisjZGVmaW5lIE1FTV9NQVNLVklSVFVBTFNFR0lEICAgIChNRU1fU0VUVklSVFVBTFNFR0lEIHwgTUVNX0dFVFZJUlRVQUxTRUdJRCkKKworI2VuZGlmIC8qIE1FTURFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbWdyLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmN2RjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9tZ3IuaApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIG1nci5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFRoaXMgaXMgdGhlIERTUCBBUEkgUk0gbW9kdWxlIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIE1HUl8KKyNkZWZpbmUgTUdSXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL21ncnByaXYuaD4KKworI2RlZmluZSBNQVhfRVZFTlRTIDMyCisKKy8qCisgKiAgPT09PT09PT0gbWdyX3dhaXRfZm9yX2JyaWRnZV9ldmVudHMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBCbG9jayBvbiBhbnkgQnJpZGdlIGV2ZW50KHMpCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgYW5vdGlmaWNhdGlvbnMgIDogYXJyYXkgb2YgcG9pbnRlcnMgdG8gbm90aWZpY2F0aW9uIG9iamVjdHMuCisgKiAgICAgIGNvdW50ICAgICAgICAgIDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFib3ZlIGFycmF5CisgKiAgICAgIHB1X2luZGV4ICAgICAgICAgOiBpbmRleCBvZiBzaWduYWxlZCBldmVudCBvYmplY3QKKyAqICAgICAgdXRpbWVvdXQgICAgICAgIDogdGltZW91dCBpbnRlcnZhbCBpbiBtaWxsaXNlb2NuZHMKKyAqICBSZXR1cm5zOgorICogICAgICAwICAgICAgICAgOiBTdWNjZXNzLgorICogICAgICAtRVRJTUUgICAgOiBXYWl0IHRpbWVkIG91dC4gKnB1X2luZGV4IGlzIHVuZGV0ZXJtaW5lZC4KKyAqICBEZXRhaWxzOgorICovCisKK2ludCBtZ3Jfd2FpdF9mb3JfYnJpZGdlX2V2ZW50cyhzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbgorCQkJCSAgICAgICoqYW5vdGlmaWNhdGlvbnMsCisJCQkJICAgICAgdTMyIGNvdW50LCB1MzIgKnB1X2luZGV4LAorCQkJCSAgICAgIHUzMiB1dGltZW91dCk7CisKKy8qCisgKiAgPT09PT09PT0gbWdyX2NyZWF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZXMgdGhlIE1hbmFnZXIgT2JqZWN0LiBUaGlzIGlzIGRvbmUgZHVyaW5nIHRoZSBkcml2ZXIgbG9hZGluZy4KKyAqICAgICAgVGhlcmUgaXMgb25seSBvbmUgTWFuYWdlciBPYmplY3QgaW4gdGhlIERTUC9CSU9TIEJyaWRnZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBtZ3Jfb2JqOiAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgY3JlYXRlZCBNR1IgT2JqZWN0IGhhbmRsZS4KKyAqICAgICAgZGV2X25vZGVfb2JqOiAgICAgICBEZXZpY2Ugb2JqZWN0IGFzIGtub3duIHRvIHRoZSBzeXN0ZW0uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MKKyAqICAgICAgLUVOT01FTTogICAgRmFpbGVkIHRvIENyZWF0ZSB0aGUgT2JqZWN0CisgKiAgICAgIC1FUEVSTTogICAgICBHZW5lcmFsIEZhaWx1cmUKKyAqICBSZXF1aXJlczoKKyAqICAgICAgTUdSIEluaXRpYWxpemVkIChyZWZzID4gMCApCisgKiAgICAgIG1ncl9vYmogIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKm1ncl9vYmogaXMgYSB2YWxpZCBNR1IgaW50ZXJmYWNlIHRvIHRoZSBkZXZpY2UuCisgKiAgICAgICAgICAgICAgICAgICAgICBNR1IgT2JqZWN0IHN0b3JlcyB0aGUgRENEIE1hbmFnZXIgSGFuZGxlLgorICogICAgICAgICAgICAgICAgICAgICAgTUdSIE9iamVjdCBzdG9yZWQgaW4gdGhlIFJlZ3NpdHJ5LgorICogICAgICAhMDogICAgICAgTUdSIE9iamVjdCBub3QgY3JlYXRlZAorICogIERldGFpbHM6CisgKiAgICAgIERDRCBEbGwgaXMgbG9hZGVkIGFuZCBNR1IgT2JqZWN0IHN0b3JlcyB0aGUgaGFuZGxlIG9mIHRoZSBETEwuCisgKi8KK2V4dGVybiBpbnQgbWdyX2NyZWF0ZShzdHJ1Y3QgbWdyX29iamVjdCAqKm1ncl9vYmosCisJCQkgICAgIHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBtZ3JfZGVzdHJveSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlc3Ryb3lzIHRoZSBNR1Igb2JqZWN0LiBDYWxsZWQgdXBvbiBkcml2ZXIgdW5sb2FkaW5nLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhtZ3Jfb2JqOiAgICAgSGFuZGxlIHRvIE1hbmFnZXIgb2JqZWN0IC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIERDRCBNYW5hZ2VyIGZyZWVkOyBNR1IgT2JqZWN0IGRlc3Ryb3llZDsKKyAqICAgICAgICAgICAgICAgICAgICAgIE1HUiBPYmplY3QgZGVsZXRlZCBmcm9tIHRoZSBSZWdpc3RyeS4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWxlZCB0byBkZXN0cm95IE1HUiBPYmplY3QKKyAqICBSZXF1aXJlczoKKyAqICAgICAgTUdSIEluaXRpYWxpemVkIChyZWZzID4gMCApCisgKiAgICAgIGhtZ3Jfb2JqIGlzIGEgdmFsaWQgTUdSIGhhbmRsZSAuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgIE1HUiBPYmplY3QgZGVzdHJveWVkIGFuZCBobWdyX29iaiBpcyBJbnZhbGlkIE1HUgorICogICAgICAgICAgICAgICAgICAgICAgSGFuZGxlLgorICovCitleHRlcm4gaW50IG1ncl9kZXN0cm95KHN0cnVjdCBtZ3Jfb2JqZWN0ICpobWdyX29iaik7CisKKy8qCisgKiAgPT09PT09PT0gbWdyX2VudW1fbm9kZV9pbmZvID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRW51bWVyYXRlIGFuZCBnZXQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBub2RlcyBjb25maWd1cmVkCisgKiAgICAgIGluIHRoZSBub2RlIGRhdGFiYXNlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG5vZGVfaWQ6ICAgICAgICAgICAgICBUaGUgbm9kZSBpbmRleCAoYmFzZSAwKS4KKyAqICAgICAgcG5kYl9wcm9wczogICAgICAgICAgUHRyIHRvIHRoZSBkc3BfbmRicHJvcHMgc3RydWN0dXJlIGZvciBvdXRwdXQuCisgKiAgICAgIHVuZGJfcHJvcHNfc2l6ZTogICAgICBTaXplIG9mIHRoZSBkc3BfbmRicHJvcHMgc3RydWN0dXJlLgorICogICAgICBwdV9udW1fbm9kZXM6ICAgICAgICAgTG9jYXRpb24gd2hlcmUgdGhlIG51bWJlciBvZiBub2RlcyBjb25maWd1cmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGRhdGFiYXNlIHdpbGwgYmUgcmV0dXJuZWQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUlOVkFMOiAgICBQYXJhbWV0ZXIgbm9kZV9pZCBpcyA+IHRoYW4gdGhlIG51bWJlciBvZiBub2Rlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1dHJlZCBpbiB0aGUgc3lzdGVtCisgKiAgICAgIC1FSURSTTogIER1cmluZyBFbnVtZXJhdGlvbiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIG5vZGVzIGNvbmZpZ3VyZWQgb3IgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbnVtZXJhdGVkIG5vZGVzLgorICogICAgICAtRVBFUk06ICAgICAgICAgIEZhaWxlZCB0byBxdWVycnkgdGhlIE5vZGUgRGF0YSBCYXNlCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHBOREJQUk9QUyBpcyBub3QgbnVsbAorICogICAgICB1bmRiX3Byb3BzX3NpemUgPj0gc2l6ZW9mKGRzcF9uZGJwcm9wcykKKyAqICAgICAgcHVfbnVtX25vZGVzIGlzIG5vdCBudWxsCisgKiAgICAgIE1HUiBJbml0aWFsaXplZCAocmVmcyA+IDAgKQorICogIEVuc3VyZXM6CisgKiAgICAgIFNVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCByZXRyZWl2YWwgb2YgZGF0YSBhbmQgKnB1X251bV9ub2RlcyA+IDAgT1IKKyAqICAgICAgRFNQX0ZBSUxFRCAgJiYgKnB1X251bV9ub2RlcyA9PSAwLgorICogIERldGFpbHM6CisgKi8KK2V4dGVybiBpbnQgbWdyX2VudW1fbm9kZV9pbmZvKHUzMiBub2RlX2lkLAorCQkJCSAgICAgc3RydWN0IGRzcF9uZGJwcm9wcyAqcG5kYl9wcm9wcywKKwkJCQkgICAgIHUzMiB1bmRiX3Byb3BzX3NpemUsCisJCQkJICAgICB1MzIgKnB1X251bV9ub2Rlcyk7CisKKy8qCisgKiAgPT09PT09PT0gbWdyX2VudW1fcHJvY2Vzc29yX2luZm8gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBFbnVtZXJhdGUgYW5kIGdldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBEU1AKKyAqICAgICAgcHJvY2Vzc29ycworICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHByb2Nlc3Nvcl9pZDogICAgICAgICBUaGUgcHJvY2Vzc29yIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAqICAgICAgcHJvY2Vzc29yX2luZm86ICAgICBQdHIgdG8gdGhlIGRzcF9wcm9jZXNzb3JpbmZvIHN0cnVjdHVyZSAuCisgKiAgICAgIHByb2Nlc3Nvcl9pbmZvX3NpemU6IFNpemUgb2YgZHNwX3Byb2Nlc3NvcmluZm8gc3RydWN0dXJlLgorICogICAgICBwdV9udW1fcHJvY3M6ICAgICAgICAgTG9jYXRpb24gd2hlcmUgdGhlIG51bWJlciBvZiBEU1BzIGNvbmZpZ3VyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZGF0YWJhc2Ugd2lsbCBiZSByZXR1cm5lZAorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVJTlZBTDogICAgUGFyYW1ldGVyIHByb2Nlc3Nvcl9pZCBpcyA+IHRoYW4gdGhlIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIERTUCBQcm9jZXNzb3JzIGluIHRoZSBzeXN0ZW0uCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgRmFpbGVkIHRvIHF1ZXJyeSB0aGUgTm9kZSBEYXRhIEJhc2UKKyAqICBSZXF1aXJlczoKKyAqICAgICAgcHJvY2Vzc29yX2luZm8gaXMgbm90IG51bGwKKyAqICAgICAgcHVfbnVtX3Byb2NzIGlzIG5vdCBudWxsCisgKiAgICAgIHByb2Nlc3Nvcl9pbmZvX3NpemUgPj0gc2l6ZW9mKGRzcF9wcm9jZXNzb3JpbmZvKQorICogICAgICBNR1IgSW5pdGlhbGl6ZWQgKHJlZnMgPiAwICkKKyAqICBFbnN1cmVzOgorICogICAgICBTVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgcmV0cmVpdmFsIG9mIGRhdGEgYW5kICpwdV9udW1fcHJvY3MgPiAwIE9SCisgKiAgICAgIERTUF9GQUlMRUQgJiYgKnB1X251bV9wcm9jcyA9PSAwLgorICogIERldGFpbHM6CisgKi8KK2V4dGVybiBpbnQgbWdyX2VudW1fcHJvY2Vzc29yX2luZm8odTMyIHByb2Nlc3Nvcl9pZCwKKwkJCQkJICBzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmluZm8KKwkJCQkJICAqcHJvY2Vzc29yX2luZm8sCisJCQkJCSAgdTMyIHByb2Nlc3Nvcl9pbmZvX3NpemUsCisJCQkJCSAgdTggKnB1X251bV9wcm9jcyk7CisvKgorICogID09PT09PT09IG1ncl9leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCwgYW5kIGZyZWUgcmVzb3VyY2VzIHdoZW4gcmVmZXJlbmNlIGNvdW50IGlzCisgKiAgICAgIDAuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBNR1IgaXMgaW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgV2hlbiByZWZlcmVuY2UgY291bnQgPT0gMCwgTUdSJ3MgcHJpdmF0ZSByZXNvdXJjZXMgYXJlIGZyZWVkLgorICovCitleHRlcm4gdm9pZCBtZ3JfZXhpdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBtZ3JfZ2V0X2RjZF9oYW5kbGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZXMgdGhlIE1HUiBoYW5kbGUuIEFjY2Vzc29yIEZ1bmN0aW9uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbWdyX2hhbmRsZTogICAgIEhhbmRsZSB0byB0aGUgTWFuYWdlciBPYmplY3QKKyAqICAgICAgZGNkX2hhbmRsZTogICAgIFB0ciB0byByZWNlaXZlIHRoZSBEQ0QgSGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNlc3MKKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgdG8gZ2V0IHRoZSBIYW5kbGUKKyAqICBSZXF1aXJlczoKKyAqICAgICAgTUdSIGlzIGluaXRpYWxpemVkLgorICogICAgICBkY2RfaGFuZGxlICE9IE5VTEwKKyAqICBFbnN1cmVzOgorICogICAgICAwIGFuZCAqZGNkX2hhbmRsZSAhPSBOVUxMIHx8CisgKiAgICAgIC1FUEVSTSBhbmQgKmRjZF9oYW5kbGUgPT0gTlVMTAorICovCitleHRlcm4gaW50IG1ncl9nZXRfZGNkX2hhbmRsZShzdHJ1Y3QgbWdyX29iamVjdAorCQkJCSAgICAgKm1ncl9oYW5kbGUsIHUzMiAqZGNkX2hhbmRsZSk7CisKKy8qCisgKiAgPT09PT09PT0gbWdyX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIE1HUidzIHByaXZhdGUgc3RhdGUsIGtlZXBpbmcgYSByZWZlcmVuY2UgY291bnQgb24gZWFjaAorICogICAgICBjYWxsLiBJbnRpYWxpemVzIHRoZSBEQ0QuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIGluaXRpYWxpemVkOyBGQUxTRSBpZiBlcnJvciBvY2N1cmVkLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKiAgICAgIFRSVUU6IEEgcmVxdWlyZW1lbnQgZm9yIHRoZSBvdGhlciBwdWJsaWMgTUdSIGZ1bmN0aW9ucy4KKyAqLworZXh0ZXJuIGJvb2wgbWdyX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBNR1JfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbWdycHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL21ncnByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E0ZTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL21ncnByaXYuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogbWdycHJpdi5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEdsb2JhbCBNR1IgY29uc3RhbnRzIGFuZCB0eXBlcywgc2hhcmVkIGJ5IFBST0MsIE1HUiwgYW5kIERTUCBBUEkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTUdSUFJJVl8KKyNkZWZpbmUgTUdSUFJJVl8KKworLyoKKyAqIE9NQVAxNTEwIHNwZWNpZmljCisgKi8KKyNkZWZpbmUgTUdSX01BWFRMQkVOVFJJRVMgIDMyCisKKy8qIFJNIE1HUiBPYmplY3QgKi8KK3N0cnVjdCBtZ3Jfb2JqZWN0OworCitzdHJ1Y3QgbWdyX3RsYmVudHJ5IHsKKwl1MzIgdWxfZHNwX3ZpcnQ7CS8qIERTUCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1MzIgdWxfZ3BwX3BoeXM7CS8qIEdQUCBwaHlzaWNhbCBhZGRyZXNzICovCit9OworCisvKgorICogIFRoZSBEU1BfUFJPQ0VTU09SRVhUSU5GTyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGFkZGl0aW9uYWwgZXh0ZW5kZWQKKyAqICBjYXBhYmlsaXRpZXMgb2YgYSBEU1AgcHJvY2Vzc29yIG5vdCBleHBvc2VkIHRvIHVzZXIuCisgKi8KK3N0cnVjdCBtZ3JfcHJvY2Vzc29yZXh0aW5mbyB7CisJc3RydWN0IGRzcF9wcm9jZXNzb3JpbmZvIHR5X2Jhc2ljOwkvKiB1c2VyIHByb2Nlc3NvciBpbmZvICovCisJLyogcHJpdmF0ZSBkc3AgbW11IGVudHJpZXMgKi8KKwlzdHJ1Y3QgbWdyX3RsYmVudHJ5IHR5X3RsYltNR1JfTUFYVExCRU5UUklFU107Cit9OworCisjZW5kaWYgLyogTUdSUFJJVl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9tc2cuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTc3OGJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL21zZy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBtc2cuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgbXNnX2N0cmwgTW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTVNHXworI2RlZmluZSBNU0dfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2ZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9tc2dkZWZzLmg+CisKKy8qCisgKiAgPT09PT09PT0gbXNnX2NyZWF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZSBhbiBvYmplY3QgdG8gbWFuYWdlIG1lc3NhZ2UgcXVldWVzLiBPbmx5IG9uZSBvZiB0aGVzZSBvYmplY3RzCisgKiAgICAgIGNhbiBleGlzdCBwZXIgZGV2aWNlIG9iamVjdC4gVGhlIG1zZ19jdHJsIG1hbmFnZXIgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZQorICogICAgICB0aGUgSU8gTWFuYWdlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBtc2dfbWFuOiAgICAgICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIG1zZ19jdHJsIG1hbmFnZXIgaGFuZGxlIG9uIG91dHB1dC4KKyAqICAgICAgaGRldl9vYmo6ICAgICAgICAgVGhlIGRldmljZSBvYmplY3QuCisgKiAgICAgIG1zZ19jYWxsYmFjazogICAgICAgIENhbGxlZCB3aGVuZXZlciBhbiBSTVNfRVhJVCBtZXNzYWdlIGlzIHJlY2VpdmVkLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG1zZ19tb2RfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIG1zZ19tYW4gIT0gTlVMTC4KKyAqICAgICAgaGRldl9vYmogIT0gTlVMTC4KKyAqICAgICAgbXNnX2NhbGxiYWNrICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBtc2dfY3JlYXRlKHN0cnVjdCBtc2dfbWdyICoqbXNnX21hbiwKKwkJCSAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgICBtc2dfb25leGl0IG1zZ19jYWxsYmFjayk7CisKKy8qCisgKiAgPT09PT09PT0gbXNnX2RlbGV0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlbGV0ZSBhIG1zZ19jdHJsIG1hbmFnZXIgYWxsb2NhdGVkIGluIG1zZ19jcmVhdGUoKS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobXNnX21ncjogICAgICAgICAgICBIYW5kbGUgcmV0dXJuZWQgZnJvbSBtc2dfY3JlYXRlKCkuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgbXNnX21vZF9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgVmFsaWQgaG1zZ19tZ3IuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgbXNnX2RlbGV0ZShzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3IpOworCisvKgorICogID09PT09PT09IG1zZ19leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgbXNnX2N0cmwgbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgbXNnX21vZF9pbml0KHZvaWQpIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYmVmb3JlLgorICogIEVuc3VyZXM6CisgKiAgICAgIEFueSByZXNvdXJjZXMgYWNxdWlyZWQgaW4gbXNnX21vZF9pbml0KHZvaWQpIHdpbGwgYmUgZnJlZWQgd2hlbiBsYXN0CisgKiAgICAgIG1zZ19jdHJsIGNsaWVudCBjYWxscyBtc2dfZXhpdCh2b2lkKS4KKyAqLworZXh0ZXJuIHZvaWQgbXNnX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gbXNnX21vZF9pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgbXNnX2N0cmwgbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRSBpZiBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQsIEZBTFNFIG90aGVyd2lzZS4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gYm9vbCBtc2dfbW9kX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBNU0dfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbXNnZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL21zZ2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGEzZmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL21zZ2RlZnMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogbXNnZGVmcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEdsb2JhbCBtc2dfY3RybCBjb25zdGFudHMgYW5kIHR5cGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTVNHREVGU18KKyNkZWZpbmUgTVNHREVGU18KKworLyogbXNnX2N0cmwgT2JqZWN0czogKi8KK3N0cnVjdCBtc2dfbWdyOworc3RydWN0IG1zZ19xdWV1ZTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlIGZvciBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gUk1TX0VYSVQgbWVzc2FnZSByZWNlaXZlZCAqLwordHlwZWRlZiB2b2lkICgqbXNnX29uZXhpdCkgKHZvaWQgKmgsIHMzMiBub2RlX3N0YXR1cyk7CisKKyNlbmRpZiAvKiBNU0dERUZTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL25sZHIuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ubGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2NTNlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ubGRyLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIG5sZHIuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgZHluYW1pYyBsb2FkZXIgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGNkZGVmLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ybW0uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbmxkcmRlZnMuaD4KKworI2lmbmRlZiBOTERSXworI2RlZmluZSBOTERSXworCitleHRlcm4gaW50IG5sZHJfYWxsb2NhdGUoc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiwKKwkJCQl2b2lkICpwcml2X3JlZiwgY29uc3Qgc3RydWN0IGRjZF9ub2RlcHJvcHMKKwkJCQkqbm9kZV9wcm9wcywKKwkJCQlzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICoqbmxkcl9ub2Rlb2JqLAorCQkJCWJvb2wgKnBmX3BoYXNlX3NwbGl0KTsKKworZXh0ZXJuIGludCBubGRyX2NyZWF0ZShzdHJ1Y3Qgbmxkcl9vYmplY3QgKipubGRyLAorCQkJICAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sZHJfYXR0cnMgKnBhdHRycyk7CisKK2V4dGVybiB2b2lkIG5sZHJfZGVsZXRlKHN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmopOworZXh0ZXJuIHZvaWQgbmxkcl9leGl0KHZvaWQpOworCitleHRlcm4gaW50IG5sZHJfZ2V0X2Z4bl9hZGRyKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCQkJICAgIGNoYXIgKnN0cl9meG4sIHUzMiAqIGFkZHIpOworCitleHRlcm4gaW50IG5sZHJfZ2V0X3JtbV9tYW5hZ2VyKHN0cnVjdCBubGRyX29iamVjdCAqbmxkciwKKwkJCQkgICAgICAgc3RydWN0IHJtbV90YXJnZXRfb2JqICoqcm1tX21ncik7CisKK2V4dGVybiBib29sIG5sZHJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgbmxkcl9sb2FkKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCQkgICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKTsKK2V4dGVybiBpbnQgbmxkcl91bmxvYWQoc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiwKKwkJCSAgICAgIGVudW0gbmxkcl9waGFzZSBwaGFzZSk7CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0JBQ0tUUkFDRQoraW50IG5sZHJfZmluZF9hZGRyKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZSwgdTMyIHN5bV9hZGRyLAorCXUzMiBvZmZzZXRfcmFuZ2UsIHZvaWQgKm9mZnNldF9vdXRwdXQsIGNoYXIgKnN5bV9uYW1lKTsKKyNlbmRpZgorCisjZW5kaWYgLyogTkxEUl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ubGRyZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL25sZHJkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1ZDNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ubGRyZGVmcy5oCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogbmxkcmRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgRHluYW1pYyArIHN0YXRpYy9vdmVybGF5IE5vZGUgbG9hZGVyIChOTERSKSBjb25zdGFudHMgYW5kIHR5cGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIE5MRFJERUZTXworI2RlZmluZSBOTERSREVGU18KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRjZGRlZi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisKKyNkZWZpbmUgTkxEUl9NQVhQQVRITEVOR1RIICAgICAgIDI1NQorLyogTkxEUiBPYmplY3RzOiAqLworc3RydWN0IG5sZHJfb2JqZWN0Oworc3RydWN0IG5sZHJfbm9kZW9iamVjdDsKKworLyoKKyAqICA9PT09PT09PSBubGRyX2xvYWR0eXBlID09PT09PT09CisgKiAgTG9hZCB0eXBlcyBmb3IgYSBub2RlLiBNdXN0IG1hdGNoIHZhbHVlcyBpbiBub2RlLmg1NS4KKyAqLworZW51bSBubGRyX2xvYWR0eXBlIHsKKwlOTERSX1NUQVRJQ0xPQUQsCS8qIExpbmtlZCBpbiBiYXNlIGltYWdlLCBub3Qgb3ZlcmxheSAqLworCU5MRFJfRFlOQU1JQ0xPQUQsCS8qIER5bmFtaWNhbGx5IGxvYWRlZCBub2RlICovCisJTkxEUl9PVkxZTE9BRAkJLyogTGlua2VkIGluIGJhc2UgaW1hZ2UsIG92ZXJsYXkgbm9kZSAqLworfTsKKworLyoKKyAqICA9PT09PT09PSBubGRyX292bHlmeG4gPT09PT09PT0KKyAqICBDYXVzZXMgY29kZSBvciBkYXRhIHRvIGJlIGNvcGllZCBmcm9tIGxvYWQgYWRkcmVzcyB0byBydW4gYWRkcmVzcy4gVGhpcworICogIGlzIHRoZSAiY29kX3dyaXRlZnhuIiB0aGF0IGdldHMgcGFzc2VkIHRvIHRoZSBEQkxMX0xpYnJhcnkgYW5kIGlzIHVzZWQgYXMKKyAqICB0aGUgWkwgd3JpdGUgZnVuY3Rpb24uCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHByaXZfcmVmOiAgICAgICBIYW5kbGUgdG8gaWRlbnRpZnkgdGhlIG5vZGUuCisgKiAgICAgIGRzcF9ydW5fYWRkcjogICBSdW4gYWRkcmVzcyBvZiBjb2RlIG9yIGRhdGEuCisgKiAgICAgIGRzcF9sb2FkX2FkZHI6ICBMb2FkIGFkZHJlc3Mgb2YgY29kZSBvciBkYXRhLgorICogICAgICB1bF9udW1fYnl0ZXM6ICAgICBOdW1iZXIgb2YgKEdQUCkgYnl0ZXMgdG8gY29weS4KKyAqICAgICAgbWVtX3NwYWNlOiAgICAgIFJNU19DT0RFIG9yIFJNU19EQVRBLgorICogIFJldHVybnM6CisgKiAgICAgIHVsX251bV9ieXRlczogICAgIFN1Y2Nlc3MuCisgKiAgICAgIDA6ICAgICAgICAgICAgICBGYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgdTMyKCpubGRyX292bHlmeG4pICh2b2lkICpwcml2X3JlZiwgdTMyIGRzcF9ydW5fYWRkciwKKwkJCSAgICB1MzIgZHNwX2xvYWRfYWRkciwgdTMyIHVsX251bV9ieXRlcywgdTMyIG1lbV9zcGFjZSk7CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl93cml0ZWZ4biA9PT09PT09PQorICogIFdyaXRlIG1lbW9yeSBmdW5jdGlvbi4gVXNlZCBmb3IgZHluYW1pYyBsb2FkIHdyaXRlcy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBwcml2X3JlZjogICAgICAgSGFuZGxlIHRvIGlkZW50aWZ5IHRoZSBub2RlLgorICogICAgICBkc3BfYWRkOiAgICAgICAgQWRkcmVzcyBvZiBjb2RlIG9yIGRhdGEuCisgKiAgICAgIHBidWY6ICAgICAgICAgICBDb2RlIG9yIGRhdGEgdG8gYmUgd3JpdHRlbgorICogICAgICB1bF9udW1fYnl0ZXM6ICAgICBOdW1iZXIgb2YgKEdQUCkgYnl0ZXMgdG8gd3JpdGUuCisgKiAgICAgIG1lbV9zcGFjZTogICAgICBEQkxMX0RBVEEgb3IgREJMTF9DT0RFLgorICogIFJldHVybnM6CisgKiAgICAgIHVsX251bV9ieXRlczogICAgIFN1Y2Nlc3MuCisgKiAgICAgIDA6ICAgICAgICAgICAgICBGYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgdTMyKCpubGRyX3dyaXRlZnhuKSAodm9pZCAqcHJpdl9yZWYsCisJCQkgICAgIHUzMiBkc3BfYWRkLCB2b2lkICpwYnVmLAorCQkJICAgICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgbWVtX3NwYWNlKTsKKworLyoKKyAqICA9PT09PT09PSBubGRyX2F0dHJzID09PT09PT09CisgKiAgQXR0cmlidXRlcyBwYXNzZWQgdG8gbmxkcl9jcmVhdGUgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBubGRyX2F0dHJzIHsKKwlubGRyX292bHlmeG4gcGZuX292bHk7CisJbmxkcl93cml0ZWZ4biBwZm5fd3JpdGU7CisJdTE2IHVzX2RzcF93b3JkX3NpemU7CisJdTE2IHVzX2RzcF9tYXVfc2l6ZTsKK307CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9waGFzZSA9PT09PT09PQorICogIEluZGljYXRlcyBub2RlIGNyZWF0ZSwgZGVsZXRlLCBvciBleGVjdXRlIHBoYXNlIGZ1bmN0aW9uLgorICovCitlbnVtIG5sZHJfcGhhc2UgeworCU5MRFJfQ1JFQVRFLAorCU5MRFJfREVMRVRFLAorCU5MRFJfRVhFQ1VURSwKKwlOTERSX05PUEhBU0UKK307CisKKy8qCisgKiAgVHlwZWRlZnMgb2YgbG9hZGVyIGZ1bmN0aW9ucyBpbXBvcnRlZCBmcm9tIGEgRExMLCBvciBkZWZpbmVkIGluIGEKKyAqICBmdW5jdGlvbiB0YWJsZS4KKyAqLworCisvKgorICogID09PT09PT09IG5sZHJfYWxsb2NhdGUgPT09PT09PT0KKyAqICBBbGxvY2F0ZSByZXNvdXJjZXMgdG8gbWFuYWdlIHRoZSBsb2FkaW5nIG9mIGEgbm9kZSBvbiB0aGUgRFNQLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBubGRyX29iajogICAgICAgICAgSGFuZGxlIG9mIGxvYWRlciB0aGF0IHdpbGwgbG9hZCB0aGUgbm9kZS4KKyAqICAgICAgcHJpdl9yZWY6ICAgICAgIEhhbmRsZSB0byBpZGVudGlmeSB0aGUgbm9kZS4KKyAqICAgICAgbm9kZV9wcm9wczogICAgIFBvaW50ZXIgdG8gYSBkY2Rfbm9kZXByb3BzIGZvciB0aGUgbm9kZS4KKyAqICAgICAgbmxkcl9ub2Rlb2JqOiAgIExvY2F0aW9uIHRvIHN0b3JlIG5vZGUgaGFuZGxlIG9uIG91dHB1dC4gVGhpcyBoYW5kbGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcGFzc2VkIHRvIG5sZHJfbG9hZC9ubGRyX3VubG9hZC4KKyAqICAgICAgcGZfcGhhc2Vfc3BsaXQ6ICAgcG9pbnRlciB0byBpbnQgdmFyaWFibGUgcmVmZXJlbmNlZCBpbiBub2RlLmMKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgSW5zdWZmaWNpZW50IG1lbW9yeSBvbiBHUFAuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5sZHJfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIFZhbGlkIG5sZHJfb2JqLgorICogICAgICBub2RlX3Byb3BzICE9IE5VTEwuCisgKiAgICAgIG5sZHJfbm9kZW9iaiAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICBJc1ZhbGlkTm9kZSgqbmxkcl9ub2Rlb2JqKS4KKyAqICAgICAgZXJyb3I6ICAgICAgICAgICpubGRyX25vZGVvYmogPT0gTlVMTC4KKyAqLwordHlwZWRlZiBpbnQoKm5sZHJfYWxsb2NhdGVmeG4pIChzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHJfb2JqLAorCQkJCSAgICAgICB2b2lkICpwcml2X3JlZiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGRjZF9ub2RlcHJvcHMKKwkJCQkgICAgICAgKiBub2RlX3Byb3BzLAorCQkJCSAgICAgICBzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0CisJCQkJICAgICAgICoqbmxkcl9ub2Rlb2JqLAorCQkJCSAgICAgICBib29sICpwZl9waGFzZV9zcGxpdCk7CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9jcmVhdGUgPT09PT09PT0KKyAqICBDcmVhdGUgYSBsb2FkZXIgb2JqZWN0LiBUaGlzIG9iamVjdCBoYW5kbGVzIHRoZSBsb2FkaW5nIGFuZCB1bmxvYWRpbmcgb2YKKyAqICBjcmVhdGUsIGRlbGV0ZSwgYW5kIGV4ZWN1dGUgcGhhc2UgZnVuY3Rpb25zIG9mIG5vZGVzIG9uIHRoZSBEU1AgdGFyZ2V0LgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBubGRyOiAgICAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgbG9hZGVyIGhhbmRsZSBvbiBvdXRwdXQuCisgKiAgICAgIGhkZXZfb2JqOiAgICAgRGV2aWNlIGZvciB0aGlzIHByb2Nlc3Nvci4KKyAqICAgICAgcGF0dHJzOiAgICAgICAgIExvYWRlciBhdHRyaWJ1dGVzLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzOworICogICAgICAtRU5PTUVNOiAgICBJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciByZXF1ZXN0ZWQgcmVzb3VyY2VzLgorICogIFJlcXVpcmVzOgorICogICAgICBubGRyX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBubGRyICE9IE5VTEwuCisgKiAgICAgIGhkZXZfb2JqICE9IE5VTEwuCisgKglwYXR0cnMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgVmFsaWQgKm5sZHIuCisgKiAgICAgIGVycm9yOiAgICAgICAgICAqbmxkciA9PSBOVUxMLgorICovCit0eXBlZGVmIGludCgqbmxkcl9jcmVhdGVmeG4pIChzdHJ1Y3Qgbmxkcl9vYmplY3QgKipubGRyLAorCQkJCSAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5sZHJfYXR0cnMgKnBhdHRycyk7CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9kZWxldGUgPT09PT09PT0KKyAqICBEZWxldGUgdGhlIE5MRFIgbG9hZGVyLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBubGRyX29iajogICAgICAgICAgTm9kZSBtYW5hZ2VyIG9iamVjdC4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBubGRyX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBWYWxpZCBubGRyX29iai4KKyAqICBFbnN1cmVzOgorICoJbmxkcl9vYmogaW52YWxpZAorICovCit0eXBlZGVmIHZvaWQgKCpubGRyX2RlbGV0ZWZ4bikgKHN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmopOworCisvKgorICogID09PT09PT09IG5sZHJfZXhpdCA9PT09PT09PQorICogIERpc2NvbnRpbnVlIHVzYWdlIG9mIE5MRFIgbW9kdWxlLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5sZHJfaW5pdCh2b2lkKSBzdWNjZXNzZnVsbHkgY2FsbGVkIGJlZm9yZS4KKyAqICBFbnN1cmVzOgorICogICAgICBBbnkgcmVzb3VyY2VzIGFjcXVpcmVkIGluIG5sZHJfaW5pdCh2b2lkKSB3aWxsIGJlIGZyZWVkIHdoZW4gbGFzdCBOTERSCisgKiAgICAgIGNsaWVudCBjYWxscyBubGRyX2V4aXQodm9pZCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKm5sZHJfZXhpdGZ4bikgKHZvaWQpOworCisvKgorICogID09PT09PT09IE5MRFJfRnJlZSA9PT09PT09PQorICogIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBpbiBubGRyX2FsbG9jYXRlLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBubGRyX25vZGVfb2JqOiAgICAgIEhhbmRsZSByZXR1cm5lZCBmcm9tIG5sZHJfYWxsb2NhdGUoKS4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBubGRyX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBWYWxpZCBubGRyX25vZGVfb2JqLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgdm9pZCAoKm5sZHJfZnJlZWZ4bikgKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmopOworCisvKgorICogID09PT09PT09IG5sZHJfZ2V0X2Z4bl9hZGRyID09PT09PT09CisgKiAgR2V0IGFkZHJlc3Mgb2YgY3JlYXRlLCBkZWxldGUsIG9yIGV4ZWN1dGUgcGhhc2UgZnVuY3Rpb24gb2YgYSBub2RlIG9uCisgKiAgdGhlIERTUC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbmxkcl9ub2RlX29iajogICAgICBIYW5kbGUgcmV0dXJuZWQgZnJvbSBubGRyX2FsbG9jYXRlKCkuCisgKiAgICAgIHN0cl9meG46ICAgICAgICBOYW1lIG9mIGZ1bmN0aW9uLgorICogICAgICBhZGRyOiAgICAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgZnVuY3Rpb24gYWRkcmVzcy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVTUElQRTogICAgQWRkcmVzcyBvZiBmdW5jdGlvbiBub3QgZm91bmQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5sZHJfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIFZhbGlkIG5sZHJfbm9kZV9vYmouCisgKiAgICAgIGFkZHIgIT0gTlVMTDsKKyAqICAgICAgc3RyX2Z4biAhPSBOVUxMOworICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgaW50KCpubGRyX2dldGZ4bmFkZHJmeG4pIChzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0CisJCQkJCSAqIG5sZHJfbm9kZV9vYmosCisJCQkJCSBjaGFyICpzdHJfZnhuLCB1MzIgKiBhZGRyKTsKKworLyoKKyAqICA9PT09PT09PSBubGRyX2luaXQgPT09PT09PT0KKyAqICBJbml0aWFsaXplIHRoZSBOTERSIG1vZHVsZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgRkFMU0Ugb3RoZXJ3aXNlLgorICogIEVuc3VyZXM6CisgKi8KK3R5cGVkZWYgYm9vbCgqbmxkcl9pbml0ZnhuKSAodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9sb2FkID09PT09PT09CisgKiAgTG9hZCBjcmVhdGUsIGRlbGV0ZSwgb3IgZXhlY3V0ZSBwaGFzZSBmdW5jdGlvbiBvZiBhIG5vZGUgb24gdGhlIERTUC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbmxkcl9ub2RlX29iajogICAgICBIYW5kbGUgcmV0dXJuZWQgZnJvbSBubGRyX2FsbG9jYXRlKCkuCisgKiAgICAgIHBoYXNlOiAgICAgICAgICBUeXBlIG9mIGZ1bmN0aW9uIHRvIGxvYWQgKGNyZWF0ZSwgZGVsZXRlLCBvciBleGVjdXRlKS4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICAgICAgICAgIEluc3VmZmljaWVudCBtZW1vcnkgb24gR1BQLgorICogICAgICAtRU5YSU86ICAgICBDYW4ndCBvdmVybGF5IHBoYXNlIGJlY2F1c2Ugb3ZlcmxheSBtZW1vcnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbiB1c2UuCisgKiAgICAgIC1FSUxTRVE6ICAgICAgICAgICBGYWlsdXJlIGluIGR5bmFtaWMgbG9hZGVyIGxpYnJhcnkuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5sZHJfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIFZhbGlkIG5sZHJfbm9kZV9vYmouCisgKiAgRW5zdXJlczoKKyAqLwordHlwZWRlZiBpbnQoKm5sZHJfbG9hZGZ4bikgKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCQkJICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKTsKKworLyoKKyAqICA9PT09PT09PSBubGRyX3VubG9hZCA9PT09PT09PQorICogIFVubG9hZCBjcmVhdGUsIGRlbGV0ZSwgb3IgZXhlY3V0ZSBwaGFzZSBmdW5jdGlvbiBvZiBhIG5vZGUgb24gdGhlIERTUC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbmxkcl9ub2RlX29iajogICAgICBIYW5kbGUgcmV0dXJuZWQgZnJvbSBubGRyX2FsbG9jYXRlKCkuCisgKiAgICAgIHBoYXNlOiAgICAgICAgICBOb2RlIGZ1bmN0aW9uIHRvIHVubG9hZCAoY3JlYXRlLCBkZWxldGUsIG9yIGV4ZWN1dGUpLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICBJbnN1ZmZpY2llbnQgbWVtb3J5IG9uIEdQUC4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgbmxkcl9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgVmFsaWQgbmxkcl9ub2RlX29iai4KKyAqICBFbnN1cmVzOgorICovCit0eXBlZGVmIGludCgqbmxkcl91bmxvYWRmeG4pIChzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpubGRyX25vZGVfb2JqLAorCQkJCSAgICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2xkcl9meG5zID09PT09PT09CisgKi8KK3N0cnVjdCBub2RlX2xkcl9meG5zIHsKKwlubGRyX2FsbG9jYXRlZnhuIHBmbl9hbGxvY2F0ZTsKKwlubGRyX2NyZWF0ZWZ4biBwZm5fY3JlYXRlOworCW5sZHJfZGVsZXRlZnhuIHBmbl9kZWxldGU7CisJbmxkcl9leGl0ZnhuIHBmbl9leGl0OworCW5sZHJfZ2V0ZnhuYWRkcmZ4biBwZm5fZ2V0X2Z4bl9hZGRyOworCW5sZHJfaW5pdGZ4biBwZm5faW5pdDsKKwlubGRyX2xvYWRmeG4gcGZuX2xvYWQ7CisJbmxkcl91bmxvYWRmeG4gcGZuX3VubG9hZDsKK307CisKKyNlbmRpZiAvKiBOTERSREVGU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ub2RlLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWQ1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvbm9kZS5oCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogbm9kZS5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERTUC9CSU9TIEJyaWRnZSBOb2RlIE1hbmFnZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBOT0RFXworI2RlZmluZSBOT0RFXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Byb2Nwcml2Lmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZWRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGlzcGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbmxkcmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9hbGxvY2F0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEFsbG9jYXRlIEdQUCByZXNvdXJjZXMgdG8gbWFuYWdlIGEgbm9kZSBvbiB0aGUgRFNQLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhwcm9jZXNzb3I6ICAgICAgICAgSGFuZGxlIG9mIHByb2Nlc3NvciB0aGF0IGlzIGFsbG9jYXRpbmcgdGhlIG5vZGUuCisgKiAgICAgIG5vZGVfdXVpZDogICAgICAgICAgUG9pbnRlciB0byBhIGRzcF91dWlkIGZvciB0aGUgbm9kZS4KKyAqICAgICAgcGFyZ3M6ICAgICAgICAgICAgICBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBub2RlLgorICogICAgICBhdHRyX2luOiAgICAgICAgICAgIE9wdGlvbmFsIHBvaW50ZXIgdG8gbm9kZSBhdHRyaWJ1dGVzIChwcmlvcml0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0Li4uKQorICogICAgICBub2RlcmVzOiAgICAgICAgICAgICBMb2NhdGlvbiB0byBzdG9yZSBub2RlIHJlc291cmNlIGluZm8uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICAgICAgSW5zdWZmaWNpZW50IG1lbW9yeSBvbiBHUFAuCisgKiAgICAgIC1FTk9LRVk6ICAgICAgICAgIE5vZGUgVVVJRCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KKyAqICAgICAgLUVTUElQRTogICAgICAgIGlBbGcgZnVuY3Rpb25zIG5vdCBmb3VuZCBmb3IgYSBEQUlTIG5vZGUuCisgKiAgICAgIC1FRE9NOiAgICAgICAgIGF0dHJfaW4gIT0gTlVMTCBhbmQgYXR0cl9pbi0+cHJpbyBvdXQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICBBIGZhaWx1cmUgb2NjdXJlZCwgdW5hYmxlIHRvIGFsbG9jYXRlIG5vZGUuCisgKiAgICAgIC1FQkFEUjogICAgUHJvY2Nlc3NvciBpcyBub3QgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIGhwcm9jZXNzb3IgIT0gTlVMTC4KKyAqICAgICAgbm9kZV91dWlkICE9IE5VTEwuCisgKiAgICAgIG5vZGVyZXMgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgICAgIElzVmFsaWROb2RlKCpwaF9ub2RlKS4KKyAqICAgICAgZXJyb3I6ICAgICAgICAgICAgICAqbm9kZXJlcyA9PSBOVUxMLgorICovCitleHRlcm4gaW50IG5vZGVfYWxsb2NhdGUoc3RydWN0IHByb2Nfb2JqZWN0ICpocHJvY2Vzc29yLAorCQkJCWNvbnN0IHN0cnVjdCBkc3BfdXVpZCAqbm9kZV91dWlkLAorCQkJCWNvbnN0IHN0cnVjdCBkc3BfY2JkYXRhCisJCQkJKnBhcmdzLCBjb25zdCBzdHJ1Y3QgZHNwX25vZGVhdHRyaW4KKwkJCQkqYXR0cl9pbiwKKwkJCQlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICoqbm9kZXJlcywKKwkJCQlzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2FsbG9jX21zZ19idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBbGxvY2F0ZSBhbmQgUHJlcGFyZSBhIGJ1ZmZlciB3aG9zZSBkZXNjcmlwdG9yIHdpbGwgYmUgcGFzc2VkIHRvIGEKKyAqICAgICAgTm9kZSB3aXRoaW4gYSAoZHNwX21zZyltZXNzYWdlCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgICAgIFRoZSBub2RlIGhhbmRsZS4KKyAqICAgICAgdXNpemU6ICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYmUgYWxsb2NhdGVkLgorICogICAgICBwYXR0cjogICAgICAgICAgUG9pbnRlciB0byBhIGRzcF9idWZmZXJhdHRyIHN0cnVjdHVyZS4KKyAqICAgICAgcGJ1ZmZlcjogICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBvbiBvdXRwdXQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgbm9kZSBoYW5kbGUuCisgKiAgICAgIC1FTk9NRU06ICAgIEluc3VmZmljZW50IG1lbW9yeS4KKyAqICAgICAgLUVQRVJNOiAgICAgIEdlbmVyYWwgRmFpbHVyZS4KKyAqICAgICAgLUVJTlZBTDogICAgICBJbnZhbGlkIFNpemUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIHBidWZmZXIgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IG5vZGVfYWxsb2NfbXNnX2J1ZihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLAorCQkJCSAgICAgdTMyIHVzaXplLCBzdHJ1Y3QgZHNwX2J1ZmZlcmF0dHIKKwkJCQkgICAgICpwYXR0ciwgdTggKipwYnVmZmVyKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2NoYW5nZV9wcmlvcml0eSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENoYW5nZSB0aGUgcHJpb3JpdHkgb2YgYW4gYWxsb2NhdGVkIG5vZGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgICAgICAgICBOb2RlIGhhbmRsZSByZXR1cm5lZCBmcm9tIG5vZGVfYWxsb2NhdGUuCisgKiAgICAgIHByaW86ICAgICAgICAgIE5ldyBwcmlvcml0eSBsZXZlbCB0byBzZXQgbm9kZSdzIHByaW9yaXR5IHRvLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FRE9NOiAgICAgICAgIHByaW8gaXMgb3V0IG9mIHJhbmdlLgorICogICAgICAtRVBFUk06IFRoZSBzcGVjaWZpZWQgbm9kZSBpcyBub3QgYSB0YXNrIG5vZGUuCisgKiAgICAgICAgICAgICAgVW5hYmxlIHRvIGNoYW5nZSBub2RlJ3MgcnVudGltZSBwcmlvcml0eSBsZXZlbC4KKyAqICAgICAgLUVCQURSOiAgICBOb2RlIGlzIG5vdCBpbiB0aGUgTk9ERV9BTExPQ0FURUQsIE5PREVfUEFVU0VELAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE5PREVfUlVOTklORyBzdGF0ZS4KKyAqICAgICAgLUVUSU1FOiAgICAgICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBEU1AgcmVzcG9uZGVkLgorICogIFJlcXVpcmVzOgorICogICAgICBub2RlX2luaXQodm9pZCkgY2FsbGVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIDAgJiYgKE5vZGUncyBjdXJyZW50IHByaW9yaXR5ID09IHByaW8pCisgKi8KK2V4dGVybiBpbnQgbm9kZV9jaGFuZ2VfcHJpb3JpdHkoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgczMyIHByaW8pOworCisvKgorICogID09PT09PT09IG5vZGVfY2xvc2Vfb3JwaGFucyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlbGV0ZSBhbGwgbm9kZXMgd2hvc2Ugb3duaW5nIHByb2Nlc3NvciBpcyBiZWluZyBkZXN0cm95ZWQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGVfbWdyOiAgICAgICBOb2RlIG1hbmFnZXIgb2JqZWN0LgorICogICAgICBwcm9jOiAgICAgICAgICBIYW5kbGUgdG8gcHJvY2Vzc29yIG9iamVjdCBiZWluZyBkZXN0cm95ZWQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FUEVSTTogICAgICBVbmFibGUgdG8gZGVsZXRlIGFsbCBub2RlcyBiZWxvbmdpbmcgdG8gcHJvYy4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgaG5vZGVfbWdyLgorICogICAgICBwcm9jICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBub2RlX2Nsb3NlX29ycGhhbnMoc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IsCisJCQkJICAgICBzdHJ1Y3QgcHJvY19vYmplY3QgKnByb2MpOworCisvKgorICogID09PT09PT09IG5vZGVfY29ubmVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENvbm5lY3QgdHdvIG5vZGVzIG9uIHRoZSBEU1AsIG9yIGEgbm9kZSBvbiB0aGUgRFNQIHRvIHRoZSBHUFAuIEluIHRoZQorICogICAgICBjYXNlIHRoYXQgdGhlIGNvbm5uZWN0aW9uIGlzIGJlaW5nIG1hZGUgYmV0d2VlbiBhIG5vZGUgb24gdGhlIERTUCBhbmQKKyAqICAgICAgdGhlIEdQUCwgb25lIG9mIHRoZSBub2RlIGhhbmRsZXMgKGVpdGhlciBub2RlMSBvciBub2RlMikgbXVzdCBiZQorICogICAgICB0aGUgY29uc3RhbnQgTk9ERV9IR1BQTk9ERS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBub2RlMTogICAgICAgICBIYW5kbGUgb2YgZmlyc3Qgbm9kZSB0byBjb25uZWN0IHRvIHNlY29uZCBub2RlLiBJZgorICogICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgR1BQIHRvIG5vZGUyLCBub2RlMQorICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0aGUgY29uc3RhbnQgTk9ERV9IR1BQTk9ERS4gT3RoZXJ3aXNlLCBub2RlMQorICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG5vZGUgaGFuZGxlIHJldHVybmVkIGZyb20gYSBzdWNjZXNzZnVsIGNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIE5vZGVfQWxsb2NhdGUoKS4KKyAqICAgICAgbm9kZTI6ICAgICAgICAgSGFuZGxlIG9mIHNlY29uZCBub2RlLiBNdXN0IGJlIGVpdGhlciBOT0RFX0hHUFBOT0RFCisgKiAgICAgICAgICAgICAgICAgICAgICBpZiB0aGlzIGlzIGEgY29ubmVjdGlvbiBmcm9tIERTUCBub2RlIHRvIEdQUCwgb3IgYQorICogICAgICAgICAgICAgICAgICAgICAgbm9kZSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBhIHN1Y2Nlc3NmdWwgY2FsbCB0bworICogICAgICAgICAgICAgICAgICAgICAgbm9kZV9hbGxvY2F0ZSgpLgorICogICAgICBzdHJlYW0xOiAgICAgICAgT3V0cHV0IHN0cmVhbSBpbmRleCBvbiBmaXJzdCBub2RlLCB0byBiZSBjb25uZWN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHNlY29uZCBub2RlJ3MgaW5wdXQgc3RyZWFtLiBWYWx1ZSBtdXN0IHJhbmdlIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgIDAgPD0gc3RyZWFtMSA8IG51bWJlciBvZiBvdXRwdXQgc3RyZWFtcy4KKyAqICAgICAgc3RyZWFtMjogICAgICAgIElucHV0IHN0cmVhbSBpbmRleCBvbiBzZWNvbmQgbm9kZS4gVmFsdWUgbXVzdCByYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgZnJvbSAwIDw9IHN0cmVhbTIgPCBudW1iZXIgb2YgaW5wdXQgc3RyZWFtcy4KKyAqICAgICAgcGF0dHJzOiAgICAgICAgIFN0cmVhbSBhdHRyaWJ1dGVzIChOVUxMID09PiB1c2UgZGVmYXVsdHMpLgorICogICAgICBjb25uX3BhcmFtOiAgICAgQSBwb2ludGVyIHRvIGEgZHNwX2NiZGF0YSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzCisgKiAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHBhcmFtZXRlciBmb3IgZGV2aWNlIG5vZGVzIHRvIHBhc3MgdG8gRFNQCisgKiAgICAgICAgICAgICAgICAgICAgICBzaWRlLgorICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdGhpcyBBUEkKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlaGF2ZXMgbGlrZSBEU1BOb2RlX0Nvbm5lY3QuIFRoaXMgcGFyYW1ldGVyIHdpbGwgaGF2ZQorICogICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYW5kIHRoZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGluCisgKiAgICAgICAgICAgICAgICAgICAgICBkc3BfY2JkYXRhIHN0cnVjdC4gVGhpcyBjYW4gYmUgZXh0ZW5kZWQgaW4gZnV0dXJlIHRwCisgKiAgICAgICAgICAgICAgICAgICAgICBwYXNzIGJpbmFyeSBkYXRhLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgICAgICAgICAgSW52YWxpZCBub2RlMSBvciBub2RlMi4KKyAqICAgICAgLUVOT01FTTogICAgICAgICAgICBJbnN1ZmZpY2llbnQgaG9zdCBtZW1vcnkuCisgKiAgICAgIC1FSU5WQUw6ICAgICAgICAgICAgIEEgc3RyZWFtIGluZGV4IHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogICAgICAtRUlTQ09OTjogIEEgY29ubmVjdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3Igb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzIHN0cmVhbTEgb3Igc3RyZWFtMi4KKyAqICAgICAgLUVCQURSOiAgICAgICAgRWl0aGVyIG5vZGUxIG9yIG5vZGUyIGlzIG5vdCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9ERV9BTExPQ0FURUQgc3RhdGUuCisgKiAgICAgIC1FQ09OTlJFRlVTRUQ6IE5vIG1vcmUgY29ubmVjdGlvbnMgYXZhaWxhYmxlLgorICogICAgICAtRVBFUk06ICAgICAgICAgICAgICBBdHRlbXB0IHRvIG1ha2UgYW4gaWxsZWdhbCBjb25uZWN0aW9uIChlZywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlIG5vZGUgdG8gZGV2aWNlIG5vZGUsIG9yIGRldmljZSBub2RlIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUCksIHRoZSB0d28gbm9kZXMgYXJlIG9uIGRpZmZlcmVudCBEU1BzLgorICogIFJlcXVpcmVzOgorICogICAgICBub2RlX2luaXQodm9pZCkgY2FsbGVkLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgbm9kZV9jb25uZWN0KHN0cnVjdCBub2RlX29iamVjdCAqbm9kZTEsCisJCQkgICAgICAgdTMyIHN0cmVhbTEsCisJCQkgICAgICAgc3RydWN0IG5vZGVfb2JqZWN0ICpub2RlMiwKKwkJCSAgICAgICB1MzIgc3RyZWFtMiwKKwkJCSAgICAgICBzdHJ1Y3QgZHNwX3N0cm1hdHRyICpwYXR0cnMsCisJCQkgICAgICAgc3RydWN0IGRzcF9jYmRhdGEKKwkJCSAgICAgICAqY29ubl9wYXJhbSk7CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBub2RlIG9uIHRoZSBEU1AgYnkgcmVtb3RlbHkgY2FsbGluZyB0aGUgbm9kZSdzIGNyZWF0ZQorICogICAgICBmdW5jdGlvbi4gSWYgbmVjZXNzYXJ5LCBsb2FkIGNvZGUgdGhhdCBjb250YWlucyB0aGUgbm9kZSdzIGNyZWF0ZQorICogICAgICBmdW5jdGlvbi4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICAgICAgICAgIE5vZGUgaGFuZGxlIHJldHVybmVkIGZyb20gbm9kZV9hbGxvY2F0ZSgpLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FU1BJUEU6ICAgICAgICBDcmVhdGUgZnVuY3Rpb24gbm90IGZvdW5kIGluIHRoZSBDT0ZGIGZpbGUuCisgKiAgICAgIC1FQkFEUjogICAgTm9kZSBpcyBub3QgaW4gdGhlIE5PREVfQUxMT0NBVEVEIHN0YXRlLgorICogICAgICAtRU5PTUVNOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvbiB0aGUgRFNQLgorICogICAgICAtRVRJTUU6ICAgICAgIEEgdGltZW91dCBvY2N1cnJlZCBiZWZvcmUgdGhlIERTUCByZXNwb25kZWQuCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgQSBmYWlsdXJlIG9jY3VycmVkLCB1bmFibGUgdG8gY3JlYXRlIG5vZGUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBub2RlX2NyZWF0ZShzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2NyZWF0ZV9tZ3IgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBOT0RFIE1hbmFnZXIgb2JqZWN0LiBUaGlzIG9iamVjdCBoYW5kbGVzIHRoZSBjcmVhdGlvbiwKKyAqICAgICAgZGVsZXRpb24sIGFuZCBleGVjdXRpb24gb2Ygbm9kZXMgb24gdGhlIERTUCB0YXJnZXQuIFRoZSBOT0RFIE1hbmFnZXIKKyAqICAgICAgYWxzbyBtYWludGFpbnMgYSBwaXBlIG1hcCBvZiB1c2VkIGFuZCBhdmFpbGFibGUgbm9kZSBjb25uZWN0aW9ucy4KKyAqICAgICAgRWFjaCBERVYgb2JqZWN0IHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIE5PREUgTWFuYWdlciBvYmplY3QuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIG5vZGVfbWFuOiAgICAgICBMb2NhdGlvbiB0byBzdG9yZSBub2RlIG1hbmFnZXIgaGFuZGxlIG9uIG91dHB1dC4KKyAqICAgICAgaGRldl9vYmo6ICAgICBEZXZpY2UgZm9yIHRoaXMgcHJvY2Vzc29yLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzOworICogICAgICAtRU5PTUVNOiAgICBJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciByZXF1ZXN0ZWQgcmVzb3VyY2VzLgorICogICAgICAtRVBFUk06ICAgICAgR2VuZXJhbCBmYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogICAgICBub2RlX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBub2RlX21hbiAhPSBOVUxMLgorICogICAgICBoZGV2X29iaiAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICBWYWxpZGUgKm5vZGVfbWFuLgorICogICAgICBlcnJvcjogICAgICAgICAgKm5vZGVfbWFuID09IE5VTEwuCisgKi8KK2V4dGVybiBpbnQgbm9kZV9jcmVhdGVfbWdyKHN0cnVjdCBub2RlX21nciAqKm5vZGVfbWFuLAorCQkJCSAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2RlbGV0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlbGV0ZSByZXNvdXJjZXMgYWxsb2NhdGVkIGluIG5vZGVfYWxsb2NhdGUoKS4gSWYgdGhlIG5vZGUgd2FzCisgKiAgICAgIGNyZWF0ZWQsIGRlbGV0ZSB0aGUgbm9kZSBvbiB0aGUgRFNQIGJ5IHJlbW90ZWx5IGNhbGxpbmcgdGhlIG5vZGUncworICogICAgICBkZWxldGUgZnVuY3Rpb24uIExvYWRzIHRoZSBub2RlJ3MgZGVsZXRlIGZ1bmN0aW9uIGlmIG5lY2Vzc2FyeS4KKyAqICAgICAgR1BQIHNpZGUgcmVzb3VyY2VzIGFyZSBmcmVlZCBhZnRlciBub2RlJ3MgZGVsZXRlIGZ1bmN0aW9uIHJldHVybnMuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgbm9kZXJlczogICAgICAgICAgICAgIE5vZGUgcmVzb3VyY2UgaW5mbyBoYW5kbGUgcmV0dXJuZWQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIHByX2N0eHQ6ICAgICAgICAgICAgICAgIFBvbmludGVyIHRvIHByb2Nlc3MgY29udGV4dCBkYXRhLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FVElNRTogICAgICAgQSB0aW1lb3V0IG9jY3VycmVkIGJlZm9yZSB0aGUgRFNQIHJlc3BvbmRlZC4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICBBIGZhaWx1cmUgb2NjdXJyZWQgaW4gZGVsZXRpbmcgdGhlIG5vZGUuCisgKiAgICAgIC1FU1BJUEU6ICAgICAgICBEZWxldGUgZnVuY3Rpb24gbm90IGZvdW5kIGluIHRoZSBDT0ZGIGZpbGUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMDogICAgICAgICAgICBobm9kZSBpcyBpbnZhbGlkLgorICovCitleHRlcm4gaW50IG5vZGVfZGVsZXRlKHN0cnVjdCBub2RlX3Jlc19vYmplY3QgKm5vZGVyZXMsCisJCQkgICAgICBzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2RlbGV0ZV9tZ3IgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWxldGUgdGhlIE5PREUgTWFuYWdlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZV9tZ3I6ICAgICAgIE5vZGUgbWFuYWdlciBvYmplY3QuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIFZhbGlkIGhub2RlX21nci4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IG5vZGVfZGVsZXRlX21ncihzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21ncik7CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9lbnVtX25vZGVzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRW51bWVyYXRlIHRoZSBub2RlcyBjdXJyZW50bHkgYWxsb2NhdGVkIGZvciB0aGUgRFNQLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhub2RlX21ncjogICAgICAgTm9kZSBtYW5hZ2VyIHJldHVybmVkIGZyb20gbm9kZV9jcmVhdGVfbWdyKCkuCisgKiAgICAgIG5vZGVfdGFiOiAgICAgICBBcnJheSB0byBjb3B5IG5vZGUgaGFuZGxlcyBpbnRvLgorICogICAgICBub2RlX3RhYl9zaXplOiAgIE51bWJlciBvZiBoYW5kbGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gbm9kZV90YWIuCisgKiAgICAgIHB1X251bV9ub2RlczogICAgIExvY2F0aW9uIHdoZXJlIG51bWJlciBvZiBub2RlIGhhbmRsZXMgd3JpdHRlbiB0bworICogICAgICAgICAgICAgICAgICAgICAgbm9kZV90YWIgd2lsbCBiZSB3cml0dGVuLgorICogICAgICBwdV9hbGxvY2F0ZWQ6ICAgIExvY2F0aW9uIHRvIHdyaXRlIHRvdGFsIG51bWJlciBvZiBhbGxvY2F0ZWQgbm9kZXMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FSU5WQUw6ICAgICAgbm9kZV90YWIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgYWxsIG5vZGUgaGFuZGxlcy4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgaG5vZGVfbWdyLgorICogICAgICBub2RlX3RhYiAhPSBOVUxMIHx8IG5vZGVfdGFiX3NpemUgPT0gMC4KKyAqICAgICAgcHVfbnVtX25vZGVzICE9IE5VTEwuCisgKiAgICAgIHB1X2FsbG9jYXRlZCAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIC0gKC1FSU5WQUwgJiYgKnB1X251bV9ub2RlcyA9PSAwKQorICogICAgICAtIHx8ICgwICYmICpwdV9udW1fbm9kZXMgPD0gbm9kZV90YWJfc2l6ZSkgICYmCisgKiAgICAgICAgKCpwdV9hbGxvY2F0ZWQgPT0gKnB1X251bV9ub2RlcykKKyAqLworZXh0ZXJuIGludCBub2RlX2VudW1fbm9kZXMoc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IsCisJCQkJICB2b2lkICoqbm9kZV90YWIsCisJCQkJICB1MzIgbm9kZV90YWJfc2l6ZSwKKwkJCQkgIHUzMiAqcHVfbnVtX25vZGVzLAorCQkJCSAgdTMyICpwdV9hbGxvY2F0ZWQpOworCisvKgorICogID09PT09PT09IG5vZGVfZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2NvbnRpbnVlIHVzYWdlIG9mIE5PREUgbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgbm9kZV9pbml0KHZvaWQpIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYmVmb3JlLgorICogIEVuc3VyZXM6CisgKiAgICAgIEFueSByZXNvdXJjZXMgYWNxdWlyZWQgaW4gbm9kZV9pbml0KHZvaWQpIHdpbGwgYmUgZnJlZWQgd2hlbiBsYXN0IE5PREUKKyAqICAgICAgY2xpZW50IGNhbGxzIG5vZGVfZXhpdCh2b2lkKS4KKyAqLworZXh0ZXJuIHZvaWQgbm9kZV9leGl0KHZvaWQpOworCisvKgorICogID09PT09PT09IG5vZGVfZnJlZV9tc2dfYnVmID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRnJlZSBhIG1lc3NhZ2UgYnVmZmVyIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggbm9kZV9hbGxvY19tc2dfYnVmLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhub2RlOiAgICAgICAgICBUaGUgbm9kZSBoYW5kbGUuCisgKiAgICAgIHBidWZmZXI6ICAgICAgICAoQWRkcmVzcykgQnVmZmVyIGFsbG9jYXRlZCBieSBub2RlX2FsbG9jX21zZ19idWYuCisgKiAgICAgIHBhdHRyOiAgICAgICAgICBTYW1lIGJ1ZmZlciBhdHRyaWJ1dGVzIHBhc3NlZCB0byBub2RlX2FsbG9jX21zZ19idWYuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgbm9kZSBoYW5kbGUuCisgKiAgICAgIC1FUEVSTTogICAgICBGYWlsdXJlIHRvIGZyZWUgdGhlIGJ1ZmZlci4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgbm9kZV9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgcGJ1ZmZlciAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgbm9kZV9mcmVlX21zZ19idWYoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQkgICAgdTggKnBidWZmZXIsCisJCQkJICAgIHN0cnVjdCBkc3BfYnVmZmVyYXR0cgorCQkJCSAgICAqcGF0dHIpOworCisvKgorICogID09PT09PT09IG5vZGVfZ2V0X2F0dHIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDb3B5IHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlIGludG8gYSBkc3Bfbm9kZWF0dHIKKyAqICAgICAgc3RydWN0dXJlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhub2RlOiAgICAgICAgICBOb2RlIG9iamVjdCBhbGxvY2F0ZWQgZnJvbSBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIHBhdHRyOiAgICAgICAgICBQb2ludGVyIHRvIGRzcF9ub2RlYXR0ciBzdHJ1Y3R1cmUgdG8gY29weSBub2RlJ3MKKyAqICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuCisgKiAgICAgIGF0dHJfc2l6ZTogICAgICBTaXplIG9mIHBhdHRyLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGhub2RlLgorICogIFJlcXVpcmVzOgorICogICAgICBub2RlX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBwYXR0ciAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKiAgICAgIDA6ICAgICAgICAqcGF0dHJzIGNvbnRhaW5zIHRoZSBub2RlJ3MgY3VycmVudCBhdHRyaWJ1dGVzLgorICovCitleHRlcm4gaW50IG5vZGVfZ2V0X2F0dHIoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQlzdHJ1Y3QgZHNwX25vZGVhdHRyICpwYXR0ciwgdTMyIGF0dHJfc2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9nZXRfbWVzc2FnZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIGEgbWVzc2FnZSBmcm9tIGEgbm9kZSBvbiB0aGUgRFNQLiBUaGUgbm9kZSBtdXN0IGJlIGVpdGhlciBhCisgKiAgICAgIG1lc3NhZ2Ugbm9kZSwgdGFzayBub2RlLCBvciBYREFJUyBzb2NrZXQgbm9kZS4KKyAqICAgICAgSWYgYSBtZXNzYWdlIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBhCisgKiAgICAgIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBvciB0aGUgbm9kZSdzIHRpbWVvdXQgdmFsdWUgaXMgcmVhY2hlZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICAgICAgTm9kZSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIG1lc3NhZ2U6ICAgICAgIFBvaW50ZXIgdG8gZHNwX21zZyBzdHJ1Y3R1cmUgdG8gY29weSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaW50by4KKyAqICAgICAgdXRpbWVvdXQ6ICAgICAgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIG1lc3NhZ2UuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FUEVSTTogQ2Fubm90IHJldHJpZXZlIG1lc3NhZ2VzIGZyb20gdGhpcyB0eXBlIG9mIG5vZGUuCisgKiAgICAgICAgICAgICAgRXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJldHJpZXZlIGEgbWVzc2FnZS4KKyAqICAgICAgLUVUSU1FOiAgIFRpbWVvdXQgb2NjdXJyZWQgYW5kIG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLgorICogIFJlcXVpcmVzOgorICogICAgICBub2RlX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBtZXNzYWdlICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBub2RlX2dldF9tZXNzYWdlKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkJICAgc3RydWN0IGRzcF9tc2cgKm1lc3NhZ2UsIHUzMiB1dGltZW91dCk7CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9nZXRfbmxkcl9vYmogPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgTmxkciBtYW5hZ2VyCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGVfbWdyOiAgICAgICBOb2RlIE1hbmFnZXIKKyAqICAgICAgbmxkcl9vdmx5b2JqOiAgIFBvaW50ZXIgdG8gYSBObGRyIG1hbmFnZXIgaGFuZGxlCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaG5vZGUuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBub2RlX2dldF9ubGRyX29iaihzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21nciwKKwkJCQkgICAgc3RydWN0IG5sZHJfb2JqZWN0ICoqbmxkcl9vdmx5b2JqKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIHRoZSBOT0RFIG1vZHVsZS4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgICAgIFRSVUUgaWYgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLCBGQUxTRSBvdGhlcndpc2UuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGJvb2wgbm9kZV9pbml0KHZvaWQpOworCisvKgorICogID09PT09PT09IG5vZGVfb25fZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldHMgY2FsbGVkIHdoZW4gUk1TX0VYSVQgaXMgcmVjZWl2ZWQgZm9yIGEgbm9kZS4gUFJPQyBuZWVkcyB0byBwYXNzCisgKiAgICAgIHRoaXMgZnVuY3Rpb24gYXMgYSBwYXJhbWV0ZXIgdG8gbXNnX2NyZWF0ZSgpLiBUaGlzIGZ1bmN0aW9uIHRoZW4gZ2V0cworICogICAgICBjYWxsZWQgYnkgdGhlIEJyaWRnZSBkcml2ZXIgd2hlbiBhbiBleGl0IG1lc3NhZ2UgZm9yIGEgbm9kZSBpcyByZWNlaXZlZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICBIYW5kbGUgb2YgdGhlIG5vZGUgdGhhdCB0aGUgZXhpdCBtZXNzYWdlIGlzIGZvci4KKyAqICAgICAgbm9kZV9zdGF0dXM6ICAgIFJldHVybiBzdGF0dXMgb2YgdGhlIG5vZGUncyBleGVjdXRlIHBoYXNlLgorICogIFJldHVybnM6CisgKiAgRW5zdXJlczoKKyAqLwordm9pZCBub2RlX29uX2V4aXQoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgczMyIG5vZGVfc3RhdHVzKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX3BhdXNlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU3VzcGVuZCBleGVjdXRpb24gb2YgYSBub2RlIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoZSBEU1AuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgICAgICAgICBOb2RlIG9iamVjdCByZXByZXNlbnRpbmcgYSBub2RlIGN1cnJlbnRseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgb24gdGhlIERTUC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgICAgICBJbnZhbGlkIGhub2RlLgorICogICAgICAtRVBFUk06IE5vZGUgaXMgbm90IGEgdGFzayBvciBzb2NrZXQgbm9kZS4KKyAqICAgICAgICAgICAgICBGYWlsZWQgdG8gcGF1c2Ugbm9kZS4KKyAqICAgICAgLUVUSU1FOiAgICAgICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBEU1AgcmVzcG9uZGVkLgorICogICAgICBEU1BfRVdST05HU1RTQVRFOiAgIE5vZGUgaXMgbm90IGluIE5PREVfUlVOTklORyBzdGF0ZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgbm9kZV9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IG5vZGVfcGF1c2Uoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSk7CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9wdXRfbWVzc2FnZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNlbmQgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBub2RlLCB0YXNrIG5vZGUsIG9yIFhEQUlTIHNvY2tldCBub2RlLgorICogICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgdGhlIG1lc3NhZ2Ugc3RyZWFtIGNhbiBhY2NvbW1vZGF0ZQorICogICAgICB0aGUgbWVzc2FnZSwgb3IgYSB0aW1lb3V0IG9jY3Vycy4gVGhlIG1lc3NhZ2Ugd2lsbCBiZSBjb3BpZWQsIHNvIE1zZworICogICAgICBjYW4gYmUgcmUtdXNlZCBpbW1lZGlhdGVseSBhZnRlciByZXR1cm4uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgICAgICAgICBOb2RlIGhhbmRsZSByZXR1cm5lZCBieSBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIHBtc2c6ICAgICAgICAgICAgICAgTG9jYXRpb24gb2YgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoZSBub2RlLgorICogICAgICB1dGltZW91dDogICAgICAgICAgIFRpbWVvdXQgaW4gbXNlY3MgdG8gd2FpdC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgICAgICBJbnZhbGlkIGhub2RlLgorICogICAgICAtRVBFUk06IE1lc3NhZ2VzIGNhbid0IGJlIHNlbnQgdG8gdGhpcyB0eXBlIG9mIG5vZGUuCisgKiAgICAgICAgICAgICAgVW5hYmxlIHRvIHNlbmQgbWVzc2FnZS4KKyAqICAgICAgLUVUSU1FOiAgICAgICBUaW1lb3V0IG9jY3VycmVkIGJlZm9yZSBtZXNzYWdlIGNvdWxkIGJlIHNldC4KKyAqICAgICAgLUVCQURSOiAgICBOb2RlIGlzIGluIGludmFsaWQgc3RhdGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIHBtc2cgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IG5vZGVfcHV0X21lc3NhZ2Uoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZHNwX21zZyAqcG1zZywgdTMyIHV0aW1lb3V0KTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX3JlZ2lzdGVyX25vdGlmeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIG9uIHNwZWNpZmljIGV2ZW50cyBmb3IgdGhpcyBub2RlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhub2RlOiAgICAgICAgICBOb2RlIGhhbmRsZSByZXR1cm5lZCBieSBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIGV2ZW50X21hc2s6ICAgICBNYXNrIG9mIHR5cGVzIG9mIGV2ZW50cyB0byBiZSBub3RpZmllZCBhYm91dC4KKyAqICAgICAgbm90aWZ5X3R5cGU6ICAgIFR5cGUgb2Ygbm90aWZpY2F0aW9uIHRvIGJlIHNlbnQuCisgKiAgICAgIGhub3RpZmljYXRpb246ICBIYW5kbGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIGhub2RlLgorICogICAgICAtRU5PTUVNOiAgICBJbnN1ZmZpY2llbnQgbWVtb3J5IG9uIEdQUC4KKyAqICAgICAgLUVJTlZBTDogICAgIGV2ZW50X21hc2sgaXMgaW52YWxpZC4KKyAqICAgICAgLUVOT1NZUzogICBOb3RpZmljYXRpb24gdHlwZSBzcGVjaWZpZWQgYnkgbm90aWZ5X3R5cGUgaXMgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIGhub3RpZmljYXRpb24gIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IG5vZGVfcmVnaXN0ZXJfbm90aWZ5KHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkJICAgICAgIHUzMiBldmVudF9tYXNrLCB1MzIgbm90aWZ5X3R5cGUsCisJCQkJICAgICAgIHN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uCisJCQkJICAgICAgICpobm90aWZpY2F0aW9uKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX3J1biA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhIG5vZGUncyBleGVjdXRlIHBoYXNlLCBvciByZXN1bWUgZXhlY3V0aW9uIG9mCisgKiAgICAgIGEgbm9kZSB0aGF0IGhhcyBiZWVuIHN1c3BlbmRlZCAodmlhIG5vZGVfcGF1c2UoKSkgb24gdGhlIERTUC4gTG9hZAorICogICAgICB0aGUgbm9kZSdzIGV4ZWN1dGUgZnVuY3Rpb24gaWYgbmVjZXNzYXJ5LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhub2RlOiAgICAgICAgICAgICAgTm9kZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbm9kZSBjdXJyZW50bHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIG9uIHRoZSBEU1AuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICAgICAgSW52YWxpZCBobm9kZS4KKyAqICAgICAgLUVQRVJNOiBobm9kZSBkb2Vzbid0IHJlcHJlc2VudCBhIG1lc3NhZ2UsIHRhc2sgb3IgZGFpcyBzb2NrZXQgbm9kZS4KKyAqICAgICAgICAgICAgICBVbmFibGUgdG8gc3RhcnQgb3IgcmVzdW1lIGV4ZWN1dGlvbi4KKyAqICAgICAgLUVUSU1FOiAgICAgICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBEU1AgcmVzcG9uZGVkLgorICogICAgICBEU1BfRVdST05HU1RTQVRFOiAgIE5vZGUgaXMgbm90IGluIE5PREVfUEFVU0VEIG9yIE5PREVfQ1JFQVRFRCBzdGF0ZS4KKyAqICAgICAgLUVTUElQRTogICAgICAgIEV4ZWN1dGUgZnVuY3Rpb24gbm90IGZvdW5kIGluIHRoZSBDT0ZGIGZpbGUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBub2RlX3J1bihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX3Rlcm1pbmF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNpZ25hbCBhIG5vZGUgcnVubmluZyBvbiB0aGUgRFNQIHRoYXQgaXQgc2hvdWxkIGV4aXQgaXRzIGV4ZWN1dGUKKyAqICAgICAgcGhhc2UgZnVuY3Rpb24uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgICAgICAgICBOb2RlIG9iamVjdCByZXByZXNlbnRpbmcgYSBub2RlIGN1cnJlbnRseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgb24gdGhlIERTUC4KKyAqICAgICAgcHN0YXR1czogICAgICAgICAgICBMb2NhdGlvbiB0byBzdG9yZSBleGVjdXRlLXBoYXNlIGZ1bmN0aW9uIHJldHVybgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FVElNRTogICAgICAgQSB0aW1lb3V0IG9jY3VycmVkIGJlZm9yZSB0aGUgRFNQIHJlc3BvbmRlZC4KKyAqICAgICAgLUVQRVJNOiBUeXBlIG9mIG5vZGUgc3BlY2lmaWVkIGNhbm5vdCBiZSB0ZXJtaW5hdGVkLgorICogICAgICAgICAgICAgIFVuYWJsZSB0byB0ZXJtaW5hdGUgdGhlIG5vZGUuCisgKiAgICAgIC1FQkFEUjogICAgT3BlcmF0aW9uIG5vdCB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgbm9kZSBzdGF0ZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgbm9kZV9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgcHN0YXR1cyAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgbm9kZV90ZXJtaW5hdGUoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQkgaW50ICpwc3RhdHVzKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF91dWlkX3Byb3BzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRmV0Y2ggTm9kZSBwcm9wZXJ0aWVzIGdpdmVuIHRoZSBVVUlECisgKiAgUGFyYW1ldGVyczoKKyAqCisgKi8KK2V4dGVybiBpbnQgbm9kZV9nZXRfdXVpZF9wcm9wcyh2b2lkICpocHJvY2Vzc29yLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBkc3BfdXVpZCAqbm9kZV91dWlkLAorCQkJCSAgICAgIHN0cnVjdCBkc3BfbmRicHJvcHMKKwkJCQkgICAgICAqbm9kZV9wcm9wcyk7CisKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCisvKioKKyAqIG5vZGVfZmluZF9hZGRyKCkgLSBGaW5kIHRoZSBjbG9zZXN0IHN5bWJvbCB0byB0aGUgZ2l2ZW4gYWRkcmVzcy4KKyAqCisgKiBAbm9kZV9tZ3I6CQlOb2RlIG1hbmFnZXIgaGFuZGxlCisgKiBAc3ltX2FkZHI6CQlHaXZlbiBhZGRyZXNzIHRvIGZpbmQgdGhlIGNsb3Nlc3Qgc3ltYm9sCisgKiBAb2Zmc2V0X3JhbmdlOgkJb2Zmc2V0IHJhbmdlIHRvIGxvb2sgZm8gdGhlIGNsb3Nlc3Qgc3ltYm9sCisgKiBAc3ltX2FkZHJfb3V0cHV0OglTeW1ib2wgT3V0cHV0IGFkZHJlc3MKKyAqIEBzeW1fbmFtZToJCVN0cmluZyB3aXRoIHRoZSBzeW1ib2wgbmFtZSBvZiB0aGUgY2xvc2VzdCBzeW1ib2wKKyAqCisgKiAJVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgY2xvc2VzdCBzeW1ib2wgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYSBNTVUKKyAqCUZhdWx0IG9jY3VycmVkIG9uIHRoZSBEU1Agc2lkZS4KKyAqLworaW50IG5vZGVfZmluZF9hZGRyKHN0cnVjdCBub2RlX21nciAqbm9kZV9tZ3IsIHUzMiBzeW1fYWRkciwKKwkJCQl1MzIgb2Zmc2V0X3JhbmdlLCB2b2lkICpzeW1fYWRkcl9vdXRwdXQsCisJCQkJY2hhciAqc3ltX25hbWUpOworCitlbnVtIG5vZGVfc3RhdGUgbm9kZV9nZXRfc3RhdGUodm9pZCAqaG5vZGUpOworI2VuZGlmCisKKyNlbmRpZiAvKiBOT0RFXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL25vZGVkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvbm9kZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk2MjNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL25vZGVkZWZzLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIG5vZGVkZWZzLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogR2xvYmFsIE5PREUgY29uc3RhbnRzIGFuZCB0eXBlcywgc2hhcmVkIGJ5IFBST0NFU1NPUiwgTk9ERSwgYW5kIERJU1AuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBOT0RFREVGU18KKyNkZWZpbmUgTk9ERURFRlNfCisKKyNkZWZpbmUgTk9ERV9TVVNQRU5ERURQUkkgLTEKKworLyogTk9ERSBPYmplY3RzOiAqLworc3RydWN0IG5vZGVfbWdyOworc3RydWN0IG5vZGVfb2JqZWN0OworCisjZW5kaWYgLyogTk9ERURFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvbm9kZXByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ub2RlcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjAyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvbm9kZXByaXYuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIG5vZGVwcml2LmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogUHJpdmF0ZSBub2RlIGhlYWRlciBzaGFyZWQgYnkgTk9ERSBhbmQgRElTUC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIE5PREVQUklWXworI2RlZmluZSBOT0RFUFJJVl8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9zdHJtZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ub2RlZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ubGRyZGVmcy5oPgorCisvKiBEU1AgYWRkcmVzcyBvZiBub2RlIGVudmlyb25tZW50IHN0cnVjdHVyZSAqLwordHlwZWRlZiB1MzIgbm9kZWVudjsKKworLyoKKyAqICBOb2RlIGNyZWF0ZSBzdHJ1Y3R1cmVzCisgKi8KKworLyogTWVzc2FnZSBub2RlICovCitzdHJ1Y3Qgbm9kZV9tc2dhcmdzIHsKKwl1MzIgbWF4X21zZ3M7CQkvKiBNYXggIyBvZiBzaW11bHRhbmVvdXMgbWVzc2FnZXMgZm9yIG5vZGUgKi8KKwl1MzIgc2VnX2lkOwkJLyogU2VnbWVudCBmb3IgYWxsb2NhdGluZyBtZXNzYWdlIGJ1ZmZlcnMgKi8KKwl1MzIgbm90aWZ5X3R5cGU7CS8qIE5vdGlmeSB0eXBlIChTRU1fcG9zdCwgU1dJX3Bvc3QsIGV0Yy4pICovCisJdTMyIGFyZ19sZW5ndGg7CQkvKiBMZW5ndGggaW4gMzItYml0IHdvcmRzIG9mIGFyZyBkYXRhIGJsb2NrICovCisJdTggKnBkYXRhOwkJLyogQXJndW1lbnQgZGF0YSBmb3Igbm9kZSAqLworfTsKKworc3RydWN0IG5vZGVfc3RybWRlZiB7CisJdTMyIGJ1Zl9zaXplOwkJLyogU2l6ZSBvZiBidWZmZXJzIGZvciBTSU8gc3RyZWFtICovCisJdTMyIG51bV9idWZzOwkJLyogbWF4ICMgb2YgYnVmZmVycyBpbiBTSU8gc3RyZWFtIGF0IG9uY2UgKi8KKwl1MzIgc2VnX2lkOwkJLyogTWVtb3J5IHNlZ21lbnQgaWQgdG8gYWxsb2NhdGUgYnVmZmVycyAqLworCXUzMiB1dGltZW91dDsJCS8qIFRpbWVvdXQgZm9yIGJsb2NraW5nIFNJTyBjYWxscyAqLworCXUzMiBidWZfYWxpZ25tZW50OwkvKiBCdWZmZXIgYWxpZ25tZW50ICovCisJY2hhciAqc3pfZGV2aWNlOwkvKiBEZXZpY2UgbmFtZSBmb3Igc3RyZWFtICovCit9OworCisvKiBUYXNrIG5vZGUgKi8KK3N0cnVjdCBub2RlX3Rhc2thcmdzIHsKKwlzdHJ1Y3Qgbm9kZV9tc2dhcmdzIG5vZGVfbXNnX2FyZ3M7CisJczMyIHByaW87CisJdTMyIHN0YWNrX3NpemU7CisJdTMyIHN5c19zdGFja19zaXplOworCXUzMiBzdGFja19zZWc7CisJdTMyIHVkc3BfaGVhcF9yZXNfYWRkcjsJLyogRFNQIHZpcnR1YWwgaGVhcCBhZGRyZXNzICovCisJdTMyIHVkc3BfaGVhcF9hZGRyOwkvKiBEU1AgdmlydHVhbCBoZWFwIGFkZHJlc3MgKi8KKwl1MzIgaGVhcF9zaXplOwkJLyogSGVhcCBzaXplICovCisJdTMyIHVncHBfaGVhcF9hZGRyOwkvKiBHUFAgdmlydHVhbCBoZWFwIGFkZHJlc3MgKi8KKwl1MzIgcHJvZmlsZV9pZDsJCS8qIFByb2ZpbGUgSUQgKi8KKwl1MzIgbnVtX2lucHV0czsKKwl1MzIgbnVtX291dHB1dHM7CisJdTMyIHVsX2RhaXNfYXJnOwkvKiBBZGRyZXNzIG9mIGlBbGcgb2JqZWN0ICovCisJc3RydWN0IG5vZGVfc3RybWRlZiAqc3RybV9pbl9kZWY7CisJc3RydWN0IG5vZGVfc3RybWRlZiAqc3RybV9vdXRfZGVmOworfTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2NyZWF0ZWFyZ3MgPT09PT09PT0KKyAqLworc3RydWN0IG5vZGVfY3JlYXRlYXJncyB7CisJdW5pb24geworCQlzdHJ1Y3Qgbm9kZV9tc2dhcmdzIG5vZGVfbXNnX2FyZ3M7CisJCXN0cnVjdCBub2RlX3Rhc2thcmdzIHRhc2tfYXJnX29iajsKKwl9IGFzYTsKK307CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9nZXRfY2hhbm5lbF9pZCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldCB0aGUgY2hhbm5lbCBpbmRleCByZXNlcnZlZCBmb3IgYSBzdHJlYW0gY29ubmVjdGlvbiBiZXR3ZWVuIHRoZQorICogICAgICBob3N0IGFuZCBhIG5vZGUuIFRoaXMgaW5kZXggaXMgcmVzZXJ2ZWQgd2hlbiBub2RlX2Nvbm5lY3QoKSBpcyBjYWxsZWQKKyAqICAgICAgdG8gY29ubmVjdCB0aGUgbm9kZSB3aXRoIHRoZSBob3N0LiBUaGlzIGluZGV4IHNob3VsZCBiZSBwYXNzZWQgdG8KKyAqICAgICAgdGhlIENITkxfT3BlbiBmdW5jdGlvbiB3aGVuIHRoZSBzdHJlYW0gaXMgYWN0dWFsbHkgb3BlbmVkLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhub2RlOiAgICAgICAgICBOb2RlIG9iamVjdCBhbGxvY2F0ZWQgZnJvbSBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIGRpcjogICAgICAgICAgIElucHV0IChEU1BfVE9OT0RFKSBvciBvdXRwdXQgKERTUF9GUk9NTk9ERSkuCisgKiAgICAgIGluZGV4OiAgICAgICAgIFN0cmVhbSBpbmRleC4KKyAqICAgICAgY2hhbl9pZDogICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIGNoYW5uZWwgaW5kZXguCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FUEVSTTogIE5vdCBhIHRhc2sgb3IgREFJUyBzb2NrZXQgbm9kZS4KKyAqICAgICAgLUVJTlZBTDogICAgIFRoZSBub2RlJ3Mgc3RyZWFtIGNvcnJlc3BvbmRpbmcgdG8gaW5kZXggYW5kIGRpcgorICogICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGEgc3RyZWFtIHRvIG9yIGZyb20gdGhlIGhvc3QuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIG5vZGVfaW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIFZhbGlkIGRpci4KKyAqICAgICAgY2hhbl9pZCAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgbm9kZV9nZXRfY2hhbm5lbF9pZChzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLAorCQkJCSAgICAgIHUzMiBkaXIsIHUzMiBpbmRleCwgdTMyICpjaGFuX2lkKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9zdHJtX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldCB0aGUgU1RSTSBtYW5hZ2VyIGZvciBhIG5vZGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgICAgIE5vZGUgYWxsb2NhdGVkIHdpdGggbm9kZV9hbGxvY2F0ZSgpLgorICogICAgICBzdHJtX21hbjogICAgICAgTG9jYXRpb24gdG8gc3RvcmUgU1RSTSBtYW5hZ2VyIG9uIG91dHB1dC4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgSW52YWxpZCBobm9kZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgc3RybV9tYW4gIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IG5vZGVfZ2V0X3N0cm1fbWdyKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkJICAgIHN0cnVjdCBzdHJtX21nciAqKnN0cm1fbWFuKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF90aW1lb3V0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IHRoZSB0aW1lb3V0IHZhbHVlIG9mIGEgbm9kZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICBOb2RlIGFsbG9jYXRlZCB3aXRoIG5vZGVfYWxsb2NhdGUoKSwgb3IgRFNQX0hHUFBOT0RFLgorICogIFJldHVybnM6CisgKiAgICAgIE5vZGUncyB0aW1lb3V0IHZhbHVlLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBobm9kZS4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gdTMyIG5vZGVfZ2V0X3RpbWVvdXQoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSk7CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9nZXRfdHlwZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldCB0aGUgdHlwZSAoZGV2aWNlLCBtZXNzYWdlLCB0YXNrLCBvciBYREFJUyBzb2NrZXQpIG9mIGEgbm9kZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICBOb2RlIGFsbG9jYXRlZCB3aXRoIG5vZGVfYWxsb2NhdGUoKSwgb3IgRFNQX0hHUFBOT0RFLgorICogIFJldHVybnM6CisgKiAgICAgIE5vZGUgdHlwZTogIE5PREVfREVWSUNFLCBOT0RFX1RBU0ssIE5PREVfWERBSVMsIG9yIE5PREVfR1BQLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBobm9kZS4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gZW51bSBub2RlX3R5cGUgbm9kZV9nZXRfdHlwZShzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlKTsKKworLyoKKyAqICA9PT09PT09PSBnZXRfbm9kZV9pbmZvID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IG5vZGUgaW5mb3JtYXRpb24gd2l0aG91dCBob2xkaW5nIHNlbWFwaG9yZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICBOb2RlIGFsbG9jYXRlZCB3aXRoIG5vZGVfYWxsb2NhdGUoKSwgb3IgRFNQX0hHUFBOT0RFLgorICogIFJldHVybnM6CisgKiAgICAgIE5vZGUgaW5mbzogIHByaW9yaXR5LCBkZXZpY2Ugb3duZXIsIG5vLiBvZiBzdHJlYW1zLCBleGVjdXRpb24gc3RhdGUKKyAqICAgICAgICAgICAgICAgICAgTkRCIHByb3BlcnRpZXMuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFZhbGlkIGhub2RlLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB2b2lkIGdldF9ub2RlX2luZm8oc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCSAgc3RydWN0IGRzcF9ub2RlaW5mbyAqbm9kZV9pbmZvKTsKKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9sb2FkX3R5cGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHZXQgdGhlIGxvYWQgdHlwZSAoZHluYW1pYywgb3ZlcmxheSwgc3RhdGljKSBvZiBhIG5vZGUuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaG5vZGU6ICAgICAgTm9kZSBhbGxvY2F0ZWQgd2l0aCBub2RlX2FsbG9jYXRlKCksIG9yIERTUF9IR1BQTk9ERS4KKyAqICBSZXR1cm5zOgorICogICAgICBOb2RlIHR5cGU6ICBOTERSX0RZTkFNSUNMT0FELCBOTERSX09WTFlMT0FELCBOTERSX1NUQVRJQ0xPQUQKKyAqICBSZXF1aXJlczoKKyAqICAgICAgVmFsaWQgaG5vZGUuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGVudW0gbmxkcl9sb2FkdHlwZSBub2RlX2dldF9sb2FkX3R5cGUoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSk7CisKKyNlbmRpZiAvKiBOT0RFUFJJVl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9udGZ5LmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbnRmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzg4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvbnRmeS5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogbnRmeS5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIE1hbmFnZSBsaXN0cyBvZiBub3RpZmljYXRpb24gZXZlbnRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTlRGWV8KKyNkZWZpbmUgTlRGWV8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qKgorICogbnRmeV9vYmplY3QgLSBoZWFkIHN0cnVjdHVyZSB0byBub2ZpZnkgZHNwYnJpZGdlIGV2ZW50cworICogQGhlYWQ6CUxpc3Qgb2Ygbm90aWZ5IG9iamVjdHMKKyAqIEBudGZ5X2xvY2s6CWxvY2sgZm9yIGxpc3QgYWNjZXNzLgorICoKKyAqLworc3RydWN0IG50Znlfb2JqZWN0IHsKKwlzdHJ1Y3QgcmF3X25vdGlmaWVyX2hlYWQgaGVhZDsvKiBMaXN0IG9mIG5vdGlmaWVyIG9iamVjdHMgKi8KKwlzcGlubG9ja190IG50ZnlfbG9jazsJLyogRm9yIGNyaXRpY2FsIHNlY3Rpb25zICovCit9OworCisvKioKKyAqIG50ZnlfZXZlbnQgLSBzdHJ1Y3R1cmUgc3RvcmUgc3BlY2lmeSBldmVudCB0byBiZSBub3RpZmllZAorICogQG5vdGlfYmxvY2s6CUxpc3Qgb2Ygbm90aWZ5IG9iamVjdHMKKyAqIEBldmVudDoJZXZlbnQgdGhhdCBpdCByZXNwb25kCisgKiBAdHlwZTogCWV2ZW50IHR5cGUgKG9ubHkgRFNQX1NJR05BTEVWRU5UIHN1cHBvcnRlZCkKKyAqIEBzeW5jX29iajoJc3luY19ldmVudCB1c2VkIHRvIHNldCB0aGUgZXZlbnQKKyAqCisgKi8KK3N0cnVjdCBudGZ5X2V2ZW50IHsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aV9ibG9jazsKKwl1MzIgZXZlbnQ7CS8qIEV2ZW50cyB0byBiZSBub3RpZmllZCBhYm91dCAqLworCXUzMiB0eXBlOwkvKiBUeXBlIG9mIG5vdGlmaWNhdGlvbiB0byBiZSBzZW50ICovCisJc3RydWN0IHN5bmNfb2JqZWN0IHN5bmNfb2JqOworfTsKKworCisvKioKKyAqIGRzcF9ub3RpZmllcl9ldmVudCgpIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gbm9maXR5IGV2ZW50cworICogQHRoaXM6CQlwb2ludGVyIHRvIGl0c2VsZiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sKKyAqIEBldmVudDoJZXZlbnQgdG8gYmUgbm90aWZpZWQuCisgKiBAZGF0YToJCUN1cnJlbnRseSBub3QgdXNlZC4KKyAqCisgKi8KK2ludCBkc3Bfbm90aWZpZXJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJICAgdm9pZCAqZGF0YSk7CisKKy8qKgorICogbnRmeV9pbml0KCkgLSBTZXQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIG50Znlfb2JqZWN0IHN0cnVjdHVyZS4KKyAqIEBubzoJCXBvaW50ZXIgdG8gbnRmeV9vYmplY3Qgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgbnRmeV9vYmplY3QgaW4gb3JkZXIgaXQKKyAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBvdGhlciBudGZ5IGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmeV9pbml0KHN0cnVjdCBudGZ5X29iamVjdCAqbm8pCit7CisJc3Bpbl9sb2NrX2luaXQoJm5vLT5udGZ5X2xvY2spOworCVJBV19JTklUX05PVElGSUVSX0hFQUQoJm5vLT5oZWFkKTsKK30KKworLyoqCisgKiBudGZ5X2RlbGV0ZSgpIC0gZGVsZXRlIGxpc3Qgb2Ygbm9meSBldmVudHMgcmVnaXN0ZXJlZC4KKyAqIEBudGZ5X29iajoJUG9pbnRlciB0byB0aGUgbnRmeSBvYmplY3Qgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYWxsIHRoZSBub3RpZnkgZXZlbnRzICByZWdpc3RlcmVkLgorICogdW5yZWdpc3RlciBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGluIHRoaXMgZnVuY3Rpb24sIHRvIHVucmVnaXN0ZXIKKyAqIGEgbnRmeV9ldmVudCBwbGVhc2UgbG9vayBhdCBudGZ5X3JlZ2lzdGVyIGZ1bmN0aW9uLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnlfZGVsZXRlKHN0cnVjdCBudGZ5X29iamVjdCAqbnRmeV9vYmopCit7CisJc3RydWN0IG50ZnlfZXZlbnQgKm5lOworCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmI7CisKKwlzcGluX2xvY2tfYmgoJm50Znlfb2JqLT5udGZ5X2xvY2spOworCW5iID0gbnRmeV9vYmotPmhlYWQuaGVhZDsKKwl3aGlsZSAobmIpIHsKKwkJbmUgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBudGZ5X2V2ZW50LCBub3RpX2Jsb2NrKTsKKwkJbmIgPSBuYi0+bmV4dDsKKwkJa2ZyZWUobmUpOworCX0KKwlzcGluX3VubG9ja19iaCgmbnRmeV9vYmotPm50ZnlfbG9jayk7Cit9CisKKy8qKgorICogbnRmeV9ub3RpZnkoKSAtIG5vZml0eSBhbGwgZXZlbnQgcmVnaXN0ZXIgZm9yIGFuIHNwZWNpZmljIGV2ZW50LgorICogQG50Znlfb2JqOglQb2ludGVyIHRvIHRoZSBudGZ5X29iamVjdCBzdHJ1Y3R1cmUuCisgKiBAZXZlbnQ6CWV2ZW50IHRvIGJlIG5vdGlmaWVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIGFsbCB0aGUgbnRmeSBldmVudHMgcmVnaXN0ZXJzIGFuZAorICogc2V0IHRoZSBldmVudCB3aXRoIG1hY2ggd2l0aCBAZXZlbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZ5X25vdGlmeShzdHJ1Y3QgbnRmeV9vYmplY3QgKm50Znlfb2JqLCB1MzIgZXZlbnQpCit7CisJc3Bpbl9sb2NrX2JoKCZudGZ5X29iai0+bnRmeV9sb2NrKTsKKwlyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmbnRmeV9vYmotPmhlYWQsIGV2ZW50LCBOVUxMKTsKKwlzcGluX3VubG9ja19iaCgmbnRmeV9vYmotPm50ZnlfbG9jayk7Cit9CisKKworCisvKioKKyAqIG50ZnlfaW5pdCgpIC0gQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbnRmeV9ldmVudCBzdHJ1Y3R1cmUuCisgKiBAZXZlbnQ6CWV2ZW50IHRoYXQgdGhlIG50ZnkgZXZlbnQgd2lsbCByZXNwb25kCisgKiBAdHlwZQkJZXZlbnQgdHlwZSAob25seSBEU1BfU0lHTkFMRVZFTlQgc3VwcG9ydGVkKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlIGEgbnRmeV9ldmVudCBlbGVtZW50IGFuZCBzZXRzIHRoZSBldmVudCBpdCB3aWxsCisgKiByZXNwb25kIHRoZSBudGZ5X2V2ZW50IGluIG9yZGVyIGl0IGNhbiBiZSB1c2VkIGJ5IHRoZSBvdGhlciBudGZ5IGZ1bmN0aW9ucy4KKyAqIEluIGNhc2Ugb2Ygc3VjY2VzcyBpdCB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG50ZnlfZXZlbnQgc3RydWN0CisgKiBjcmVhdGVkLiBPdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gTlVMTDsKKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBudGZ5X2V2ZW50ICpudGZ5X2V2ZW50X2NyZWF0ZSh1MzIgZXZlbnQsIHUzMiB0eXBlKQoreworCXN0cnVjdCBudGZ5X2V2ZW50ICpuZTsKKwluZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBudGZ5X2V2ZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5lKSB7CisJCXN5bmNfaW5pdF9ldmVudCgmbmUtPnN5bmNfb2JqKTsKKwkJbmUtPm5vdGlfYmxvY2subm90aWZpZXJfY2FsbCA9IGRzcF9ub3RpZmllcl9ldmVudDsKKwkJbmUtPmV2ZW50ID0gZXZlbnQ7CisJCW5lLT50eXBlID0gdHlwZTsKKwl9CisJcmV0dXJuIG5lOworfQorCisvKioKKyAqIG50ZnlfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIG5ldyBudGZ5X2V2ZW50IGludG8gYSBnaXZlbiBudGZ5X29iamVjdAorICogQG50Znlfb2JqOglQb2ludGVyIHRvIHRoZSBudGZ5X29iamVjdCBzdHJ1Y3R1cmUuCisgKiBAbm90aToJCVBvaW50ZXIgdG8gdGhlIGhhbmRsZSB0byBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBzcGFjZS4KKyAqIEBldmVudAlldmVudCB0aGF0IHRoZSBudGZ5IGV2ZW50IHdpbGwgcmVzcG9uZAorICogQHR5cGUJCWV2ZW50IHR5cGUgKG9ubHkgRFNQX1NJR05BTEVWRU5UIHN1cHBvcnRlZCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVyIGEgbmV3IG50ZnlfZXZlbnQgaW50byB0aGUgbnRmeV9vYmplY3QgbGlzdCwKKyAqIHdoaWNoIHdpbGwgcmVzcG9uZCB0byB0aGUgQGV2ZW50IHBhc3NlZC4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMCBpbiBjYXNlIG9mIGVycm9yLgorICogLUVGQVVMVCBpbiBjYXNlIG9mIGJhZCBwb2ludGVycyBhbmQKKyAqIERTUF9FTWVtb3J5IGluIGNhc2Ugb2Ygbm8gbWVtb3J5IHRvIGNyZWF0ZSBudGZ5X2V2ZW50LgorICovCitzdGF0aWMgIGlubGluZSBpbnQgbnRmeV9yZWdpc3RlcihzdHJ1Y3QgbnRmeV9vYmplY3QgKm50Znlfb2JqLAorCQkJIHN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uICpub3RpLAorCQkJIHUzMiBldmVudCwgdTMyIHR5cGUpCit7CisJc3RydWN0IG50ZnlfZXZlbnQgKm5lOworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCFub3RpIHx8ICFudGZ5X29iaikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlpZiAoIWV2ZW50KSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCW5lID0gbnRmeV9ldmVudF9jcmVhdGUoZXZlbnQsIHR5cGUpOworCWlmICghbmUpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJbm90aS0+aGFuZGxlID0gJm5lLT5zeW5jX29iajsKKworCXNwaW5fbG9ja19iaCgmbnRmeV9vYmotPm50ZnlfbG9jayk7CisJcmF3X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZudGZ5X29iai0+aGVhZCwgJm5lLT5ub3RpX2Jsb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbnRmeV9vYmotPm50ZnlfbG9jayk7CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIG50ZnlfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciBhIG50ZnlfZXZlbnQgZnJvbSBhIGdpdmVuIG50Znlfb2JqZWN0CisgKiBAbnRmeV9vYmo6CVBvaW50ZXIgdG8gdGhlIG50Znlfb2JqZWN0IHN0cnVjdHVyZS4KKyAqIEBub3RpOgkJUG9pbnRlciB0byB0aGUgZXZlbnQgdGhhdCB3aWxsIGJlIHJlbW92ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVyIGEgbnRmeV9ldmVudCBmcm9tIHRoZSBudGZ5X29iamVjdCBsaXN0LAorICogQG5vdGkgY29udGFpbnMgdGhlIGV2ZW50IHdoaWNoIGlzIHdhbnRlZCB0byBiZSByZW1vdmVkLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwIGluIGNhc2Ugb2YgZXJyb3IuCisgKiAtRUZBVUxUIGluIGNhc2Ugb2YgYmFkIHBvaW50ZXJzIGFuZAorICogRFNQX0VNZW1vcnkgaW4gY2FzZSBvZiBubyBtZW1vcnkgdG8gY3JlYXRlIG50ZnlfZXZlbnQuCisgKi8KK3N0YXRpYyAgaW5saW5lIGludCBudGZ5X3VucmVnaXN0ZXIoc3RydWN0IG50Znlfb2JqZWN0ICpudGZ5X29iaiwKKwkJCSBzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbiAqbm90aSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbnRmeV9ldmVudCAqbmU7CisKKwlpZiAoIW5vdGkgfHwgIW50Znlfb2JqKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJbmUgPSBjb250YWluZXJfb2YoKHN0cnVjdCBzeW5jX29iamVjdCAqKW5vdGksIHN0cnVjdCBudGZ5X2V2ZW50LAorCQkJCQkJCQlzeW5jX29iaik7CisJc3Bpbl9sb2NrX2JoKCZudGZ5X29iai0+bnRmeV9sb2NrKTsKKwlyYXdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbnRmeV9vYmotPmhlYWQsCisJCQkJCQkmbmUtPm5vdGlfYmxvY2spOworCWtmcmVlKG5lKTsKKwlzcGluX3VubG9ja19iaCgmbnRmeV9vYmotPm50ZnlfbG9jayk7CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYJCQkJLyogTlRGWV8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9wcm9jLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDlmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHJvYy5oCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogcHJvYy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFRoaXMgaXMgdGhlIERTUCBBUEkgUk0gbW9kdWxlIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIFBST0NfCisjZGVmaW5lIFBST0NfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rydi5oPgorCitleHRlcm4gY2hhciAqaXZhX2ltZzsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX2F0dGFjaCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFByZXBhcmUgZm9yIGNvbW11bmljYXRpb24gd2l0aCBhIHBhcnRpY3VsYXIgRFNQIHByb2Nlc3NvciwgYW5kIHJldHVybgorICogICAgICBhIGhhbmRsZSB0byB0aGUgcHJvY2Vzc29yIG9iamVjdC4gVGhlIFBST0MgT2JqZWN0IGdldHMgY3JlYXRlZAorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHByb2Nlc3Nvcl9pZCAgOgkgICBUaGUgcHJvY2Vzc29yIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAqICAgICAgaG1ncl9vYmogIDoJICAgSGFuZGxlIHRvIHRoZSBNYW5hZ2VyIE9iamVjdAorICogICAgICBhdHRyX2luICAgICA6CSAgIFB0ciB0byB0aGUgZHNwX3Byb2Nlc3NvcmF0dHJpbiBzdHJ1Y3R1cmUuCisgKgkJCSAgICAgIEEgTlVMTCB2YWx1ZSBtZWFucyB1c2UgZGVmYXVsdCB2YWx1ZXMuCisgKiAgICAgIHBoX3Byb2Nlc3NvciA6CSAgIFB0ciB0byBsb2NhdGlvbiB0byBzdG9yZSBwcm9jZXNzb3IgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDoJICAgU3VjY2Vzcy4KKyAqICAgICAgLUVQRVJNICAgOgkgICBHZW5lcmFsIGZhaWx1cmUuCisgKiAgICAgIC1FRkFVTFQgOgkgICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIDA6ICAgU3VjY2VzczsgUHJvY2Vzc29yIGFscmVhZHkgYXR0YWNoZWQuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHBoX3Byb2Nlc3NvciAhPSBOVUxMLgorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIC1FUEVSTSwgYW5kICpwaF9wcm9jZXNzb3IgPT0gTlVMTCwgT1IKKyAqICAgICAgU3VjY2VzcyBhbmQgKnBoX3Byb2Nlc3NvciBpcyBhIFZhbGlkIFByb2Nlc3NvciBoYW5kbGUgT1IKKyAqICAgICAgMCBhbmQgKnBoX3Byb2Nlc3NvciBpcyBhIFZhbGlkIFByb2Nlc3Nvci4KKyAqICBEZXRhaWxzOgorICogICAgICBXaGVuIGF0dHJfaW4gaXMgTlVMTCwgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZSBpcyAxMCBzZWNvbmRzLgorICovCitleHRlcm4gaW50IHByb2NfYXR0YWNoKHUzMiBwcm9jZXNzb3JfaWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmF0dHJpbgorCQkJICAgICAgKmF0dHJfaW4sIHZvaWQgKipwaF9wcm9jZXNzb3IsCisJCQkgICAgICBzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX2F1dG9fc3RhcnQgPT09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQSBQYXJ0aWN1bGFyIGRldmljZSBnZXRzIGxvYWRlZCB3aXRoIHRoZSBkZWZhdWx0IGltYWdlCisgKiAgICAgIGlmIHRoZSBBdXRvU3RhcnQgZmxhZyBpcyBzZXQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmogIDogICBIYW5kbGUgdG8gdGhlIERldmljZQorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDogICBPbiBTdWNjZXNzZnVsIExvYWRpbmcKKyAqICAgICAgLUVOT0VOVCAgIDogICBObyBEU1AgZXhlYyBmaWxlIGZvdW5kLgorICogICAgICAtRVBFUk0gICA6ICAgR2VuZXJhbCBGYWlsdXJlCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGhkZXZfb2JqICE9IE5VTEwuCisgKiAgICAgIGRldl9ub2RlX29iaiAhPSBOVUxMLgorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgcHJvY19hdXRvX3N0YXJ0KHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqLAorCQkJCSAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKTsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX2N0cmwgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBQYXNzIGNvbnRyb2wgaW5mb3JtYXRpb24gdG8gdGhlIEdQUCBkZXZpY2UgZHJpdmVyIG1hbmFnaW5nIHRoZSBEU1AKKyAqICAgICAgcHJvY2Vzc29yLiBUaGlzIHdpbGwgYmUgYW4gT0VNLW9ubHkgZnVuY3Rpb24sIGFuZCBub3QgcGFydCBvZiB0aGUKKyAqICAgICAgJ0JyaWRnZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIncyBBUEkuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaHByb2Nlc3NvciAgOiAgICAgICBUaGUgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgZHdfY21kICAgICAgIDogICAgICAgUHJpdmF0ZSBkcml2ZXIgSU9DVEwgY21kIElELgorICogICAgICBwYXJncyAgICAgICA6ICAgICAgIFB0ciB0byBhbiBkcml2ZXIgZGVmaW5lZCBhcmd1bWVudCBzdHJ1Y3R1cmUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCAgICAgOiAgICAgICBTVUNDRVNTCisgKiAgICAgIC1FRkFVTFQgOiAgICAgICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIC1FVElNRTogICAgICAgQSBUaW1lb3V0IE9jY3VyZWQgYmVmb3JlIHRoZSBDb250cm9sIGluZm9ybWF0aW9uCisgKgkJCSAgY291bGQgYmUgc2VudC4KKyAqICAgICAgLUVQRVJNICAgOiAgICAgICBHZW5lcmFsIEZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFBST0MgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlcworICogIERldGFpbHM6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gQ2FsbHMgYnJpZGdlX2Rldl9jdHJsLgorICovCitleHRlcm4gaW50IHByb2NfY3RybCh2b2lkICpocHJvY2Vzc29yLAorCQkJICAgIHUzMiBkd19jbWQsIHN0cnVjdCBkc3BfY2JkYXRhICphcmcpOworCisvKgorICogID09PT09PT09IHByb2NfZGV0YWNoID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2xvc2UgYSBEU1AgcHJvY2Vzc29yIGFuZCBkZS1hbGxvY2F0ZSBhbGwgKEdQUCkgcmVzb3VyY2VzIHJlc2VydmVkCisgKiAgICAgIGZvciBpdC4gVGhlIFByb2Nlc3NvciBPYmplY3QgaXMgZGVsZXRlZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBwcl9jdHh0ICAgICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCAgICAgOiAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQgOiAgIEluVmFsaWQgSGFuZGxlLgorICogICAgICAtRVBFUk0gICA6ICAgR2VuZXJhbCBmYWlsdXJlLgorICogIFJlcXVpcmVzOgorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIFBST0MgT2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAqLworZXh0ZXJuIGludCBwcm9jX2RldGFjaChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX2VudW1fbm9kZXMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBFbnVtZXJhdGUgdGhlIG5vZGVzIGN1cnJlbnRseSBhbGxvY2F0ZWQgb24gYSBwcm9jZXNzb3IuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaHByb2Nlc3NvciAgOiAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBub2RlX3RhYiAgICA6ICAgVGhlIGZpcnN0IExvY2F0aW9uIG9mIGFuIGFycmF5IGFsbG9jYXRlZCBmb3Igbm9kZQorICoJCSAgICAgIGhhbmRsZXMuCisgKiAgICAgIG5vZGVfdGFiX3NpemU6ICAgVGhlIG51bWJlciBvZiAoRFNQX0hOT0RFKSBoYW5kbGVzIHRoYXQgY2FuIGJlIGhlbGQKKyAqCQkgICAgICB0byB0aGUgbWVtb3J5IHRoZSBjbGllbnQgaGFzIGFsbG9jYXRlZCBmb3Igbm9kZV90YWIKKyAqICAgICAgcHVfbnVtX25vZGVzICA6ICAgTG9jYXRpb24gd2hlcmUgRFNQUHJvY2Vzc29yX0VudW1Ob2RlcyB3aWxsIHJldHVybgorICoJCSAgICAgIHRoZSBudW1iZXIgb2YgdmFsaWQgaGFuZGxlcyB3cml0dGVuIHRvIG5vZGVfdGFiCisgKiAgICAgIHB1X2FsbG9jYXRlZCA6ICAgTG9jYXRpb24gd2hlcmUgRFNQUHJvY2Vzc29yX0VudW1Ob2RlcyB3aWxsIHJldHVybgorICoJCSAgICAgIHRoZSBudW1iZXIgb2Ygbm9kZXMgdGhhdCBhcmUgYWxsb2NhdGVkIG9uIHRoZSBEU1AuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCAgICAgOiAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQgOiAgIEludmFsaWQgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgLUVJTlZBTCAgIDogICBUaGUgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG5vZGVfdGFiIGlzCisgKgkJICAgICAgaW5zdWZmaWNlbnQuIFRoYXQgaXMgdGhlIG51bWJlciBvZiBub2RlcyBhY3R1YWxseQorICoJCSAgICAgIGFsbG9jYXRlZCBvbiB0aGUgRFNQIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUKKyAqCQkgICAgICBzcGVjaWZpZWQgZm9yIG5vZGVfdGFiX3NpemUuCisgKiAgICAgIC1FUEVSTSAgIDogICBVbmFibGUgdG8gZ2V0IFJlc291cmNlIEluZm9ybWF0aW9uLgorICogIERldGFpbHM6CisgKiAgUmVxdWlyZXMKKyAqICAgICAgcHVfbnVtX25vZGVzIGlzIG5vdCBOVUxMLgorICogICAgICBwdV9hbGxvY2F0ZWQgaXMgbm90IE5VTEwuCisgKiAgICAgIG5vZGVfdGFiIGlzIG5vdCBOVUxMLgorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgRGV0YWlsczoKKyAqLworZXh0ZXJuIGludCBwcm9jX2VudW1fbm9kZXModm9pZCAqaHByb2Nlc3NvciwKKwkJCQkgIHZvaWQgKipub2RlX3RhYiwKKwkJCQkgIHUzMiBub2RlX3RhYl9zaXplLAorCQkJCSAgdTMyICpwdV9udW1fbm9kZXMsCisJCQkJICB1MzIgKnB1X2FsbG9jYXRlZCk7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19nZXRfcmVzb3VyY2VfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVudW1lcmF0ZSB0aGUgcmVzb3VyY2VzIGN1cnJlbnRseSBhdmFpbGFibGUgb24gYSBwcm9jZXNzb3IuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaHByb2Nlc3NvciAgOiAgICAgICBUaGUgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgcmVzb3VyY2VfdHlwZTogICAgICBUeXBlIG9mIHJlc291cmNlIC4KKyAqICAgICAgcmVzb3VyY2VfaW5mbzogICAgICBQdHIgdG8gdGhlIGRzcF9yZXNvdXJjZWluZm8gc3RydWN0dXJlLgorICogICAgICByZXNvdXJjZV9pbmZvX3NpemU6ICBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCAgICAgOiAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUIDogICAgICAgSW52YWxpZCBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICAtRUJBRFI6ICAgIFRoZSBwcm9jZXNzb3IgaXMgbm90IGluIHRoZSBQUk9DX1JVTk5JTkcgc3RhdGUuCisgKiAgICAgIC1FVElNRTogICAgICAgQSB0aW1lb3V0IG9jY3VyZWQgYmVmb3JlIHRoZSBEU1AgcmVzcG9uZGVkIHRvIHRoZQorICoJCQkgIHF1ZXJyeS4KKyAqICAgICAgLUVQRVJNICAgOiAgICAgICBVbmFibGUgdG8gZ2V0IFJlc291cmNlIEluZm9ybWF0aW9uCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHJlc291cmNlX2luZm8gaXMgbm90IE5VTEwuCisgKiAgICAgIFBhcmFtZXRlciByZXNvdXJjZV90eXBlIGlzIFZhbGlkLltUQkRdCisgKiAgICAgIHJlc291cmNlX2luZm9fc2l6ZSBpcyA+PSBzaXplb2YgZHNwX3Jlc291cmNlaW5mbyBzdHJ1Y3QuCisgKiAgICAgIFBST0MgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICBEZXRhaWxzOgorICogICAgICBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSByZXR1cm5zCisgKiAgICAgIC1FTk9TWVMsIGFuZCBkb2VzIG5vdCB3cml0ZSBhbnkgZGF0YSB0byB0aGUgcmVzb3VyY2VfaW5mbyBzdHJ1Y3QuCisgKi8KK2V4dGVybiBpbnQgcHJvY19nZXRfcmVzb3VyY2VfaW5mbyh2b2lkICpocHJvY2Vzc29yLAorCQkJCQkgdTMyIHJlc291cmNlX3R5cGUsCisJCQkJCSBzdHJ1Y3QgZHNwX3Jlc291cmNlaW5mbworCQkJCQkgKnJlc291cmNlX2luZm8sCisJCQkJCSB1MzIgcmVzb3VyY2VfaW5mb19zaXplKTsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50LCBhbmQgZnJlZSByZXNvdXJjZXMgd2hlbiByZWZlcmVuY2UgY291bnQgaXMKKyAqICAgICAgMC4KKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFBST0MgaXMgaW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgV2hlbiByZWZlcmVuY2UgY291bnQgPT0gMCwgUFJPQydzIHByaXZhdGUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworZXh0ZXJuIHZvaWQgcHJvY19leGl0KHZvaWQpOworCisvKgorICogPT09PT09PT0gcHJvY19nZXRfZGV2X29iamVjdCA9PT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm5zIHRoZSBERVYgSGFubGRlIGZvciBhIGdpdmVuIFByb2Nlc3NvciBoYW5kbGUKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICA6ICAgUHJvY2Vzc29yIEhhbmRsZQorICogICAgICBkZXZpY2Vfb2JqIDogICAgTG9jYXRpb24gdG8gc3RvcmUgdGhlIERFViBIYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCAgICAgOiAgIFN1Y2Nlc3M7ICpkZXZpY2Vfb2JqIGhhcyBEZXYgaGFuZGxlCisgKiAgICAgIC1FUEVSTSAgIDogICBGYWlsdXJlOyAqZGV2aWNlX29iaiBpcyB6ZXJvLgorICogIFJlcXVpcmVzOgorICogICAgICBkZXZpY2Vfb2JqIGlzIG5vdCBOVUxMCisgKiAgICAgIFBST0MgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgMCAgICAgOiAgICpkZXZpY2Vfb2JqIGlzIG5vdCBOVUxMCisgKiAgICAgIC1FUEVSTSAgIDogICAqZGV2aWNlX29iaiBpcyBOVUxMLgorICovCitleHRlcm4gaW50IHByb2NfZ2V0X2Rldl9vYmplY3Qodm9pZCAqaHByb2Nlc3NvciwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqKmRldmljZV9vYmopOworCisvKgorICogID09PT09PT09IHByb2NfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgUFJPQydzIHByaXZhdGUgc3RhdGUsIGtlZXBpbmcgYSByZWZlcmVuY2UgY291bnQgb24gZWFjaAorICogICAgICBjYWxsLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRSBpZiBpbml0aWFsaXplZDsgRkFMU0UgaWYgZXJyb3Igb2NjdXJlZC4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICogICAgICBUUlVFOiBBIHJlcXVpcmVtZW50IGZvciB0aGUgb3RoZXIgcHVibGljIFBST0MgZnVuY3Rpb25zLgorICovCitleHRlcm4gYm9vbCBwcm9jX2luaXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19nZXRfc3RhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXBvcnQgdGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgRFNQIHByb2Nlc3Nvci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIHByb2Nfc3RhdGVfb2JqIDogICBQdHIgdG8gbG9jYXRpb24gdG8gc3RvcmUgdGhlIGRzcF9wcm9jZXNzb3JzdGF0ZQorICoJCSAgICAgIHN0cnVjdHVyZS4KKyAqICAgICAgc3RhdGVfaW5mb19zaXplOiBTaXplIG9mIGRzcF9wcm9jZXNzb3JzdGF0ZS4KKyAqICBSZXR1cm5zOgorICogICAgICAwICAgICA6ICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVCA6ICAgSW52YWxpZCBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICAtRVBFUk0gICA6ICAgR2VuZXJhbCBmYWlsdXJlIHdoaWxlIHF1ZXJ5aW5nIHByb2Nlc3NvciBzdGF0ZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgcHJvY19zdGF0ZV9vYmogaXMgbm90IE5VTEwKKyAqICAgICAgc3RhdGVfaW5mb19zaXplIGlzID49IHRoYW4gdGhlIHNpemUgb2YgZHNwX3Byb2Nlc3NvcnN0YXRlIHN0cnVjdHVyZS4KKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKi8KK2V4dGVybiBpbnQgcHJvY19nZXRfc3RhdGUodm9pZCAqaHByb2Nlc3Nvciwgc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZQorCQkJCSAqcHJvY19zdGF0ZV9vYmosIHUzMiBzdGF0ZV9pbmZvX3NpemUpOworCisvKgorICogID09PT09PT09IFBST0NfR2V0UHJvY2Vzc29ySUQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXBvcnQgdGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgRFNQIHByb2Nlc3Nvci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIHByb2NfaWQgICAgICA6ICAgUHJvY2Vzc29yIElECisgKgorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDogICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUIDogICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIC1FUEVSTSAgIDogICBHZW5lcmFsIGZhaWx1cmUgd2hpbGUgcXVlcnlpbmcgcHJvY2Vzc29yIHN0YXRlLgorICogIFJlcXVpcmVzOgorICogICAgICBwcm9jX3N0YXRlX29iaiBpcyBub3QgTlVMTAorICogICAgICBzdGF0ZV9pbmZvX3NpemUgaXMgPj0gdGhhbiB0aGUgc2l6ZSBvZiBkc3BfcHJvY2Vzc29yc3RhdGUgc3RydWN0dXJlLgorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgRGV0YWlsczoKKyAqLworZXh0ZXJuIGludCBwcm9jX2dldF9wcm9jZXNzb3JfaWQodm9pZCAqcHJvYywgdTMyICogcHJvY19pZCk7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19nZXRfdHJhY2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgdHJhY2UgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBEU1AgcHJvY2Vzc29yLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhwcm9jZXNzb3IgIDogICBUaGUgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgcGJ1Zgk6ICAgUHRyIHRvIGJ1ZmZlciB0byBob2xkIHRyYWNlIG91dHB1dC4KKyAqICAgICAgbWF4X3NpemUgICAgOiAgIE1heGltdW0gc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqICBSZXR1cm5zOgorICogICAgICAwICAgICA6ICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVCA6ICAgSW52YWxpZCBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICAtRVBFUk0gICA6ICAgR2VuZXJhbCBmYWlsdXJlIHdoaWxlIHJldGlyZXZpbmcgcHJvY2Vzc29yIHRyYWNlCisgKgkJICAgICAgQnVmZmVyLgorICogIFJlcXVpcmVzOgorICogICAgICBwYnVmIGlzIG5vdCBOVUxMCisgKiAgICAgIG1heF9zaXplIGlzID4gMC4KKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKi8KK2V4dGVybiBpbnQgcHJvY19nZXRfdHJhY2Uodm9pZCAqaHByb2Nlc3NvciwgdTggKiBwYnVmLCB1MzIgbWF4X3NpemUpOworCisvKgorICogID09PT09PT09IHByb2NfbG9hZCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlc2V0IGEgcHJvY2Vzc29yIGFuZCBsb2FkIGEgbmV3IGJhc2UgcHJvZ3JhbSBpbWFnZS4KKyAqICAgICAgVGhpcyB3aWxsIGJlIGFuIE9FTS1vbmx5IGZ1bmN0aW9uLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhwcm9jZXNzb3I6ICAgICAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBhcmdjX2luZGV4OiAgICAgICBUaGUgbnVtYmVyIG9mIEFyZ3VtZW50cyhzdHJpbmdzKWluIHRoZSBhQXJnVltdCisgKiAgICAgIHVzZXJfYXJnczogICAgICAgQW4gQXJyYXkgb2YgQXJndW1lbnRzKFVuaWNvZGUgU3RyaW5ncykKKyAqICAgICAgdXNlcl9lbnZwOiAgICAgICBBbiBBcnJheSBvZiBFbnZpcm9ubWVudCBzZXR0aW5ncyhVbmljb2RlIFN0cmluZ3MpCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT0VOVDogICAgICAgVGhlIERTUCBFeGVjdWV0YWJsZSB3YXMgbm90IGZvdW5kLgorICogICAgICAtRUZBVUxUOiAgICAgICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIC1FUEVSTSAgIDogICAgICAgVW5hYmxlIHRvIExvYWQgdGhlIFByb2Nlc3NvcgorICogIFJlcXVpcmVzOgorICogICAgICB1c2VyX2FyZ3MgaXMgbm90IE5VTEwKKyAqICAgICAgYXJnY19pbmRleCBpcyA+IDAKKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICBTdWNjZXNzIGFuZCBQcm9jU3RhdGUgPT0gUFJPQ19MT0FERUQKKyAqICAgICAgb3IgRFNQX0ZBSUxFRCBzdGF0dXMuCisgKiAgRGV0YWlsczoKKyAqICAgICAgRG9lcyBub3QgaW1wbGVtZW50IGFjY2VzcyByaWdodHMgdG8gY29udHJvbCB3aGljaCBHUFAgYXBwbGljYXRpb24KKyAqICAgICAgY2FuIGxvYWQgdGhlIHByb2Nlc3Nvci4KKyAqLworZXh0ZXJuIGludCBwcm9jX2xvYWQodm9pZCAqaHByb2Nlc3NvciwKKwkJCSAgICBjb25zdCBzMzIgYXJnY19pbmRleCwgY29uc3QgY2hhciAqKnVzZXJfYXJncywKKwkJCSAgICBjb25zdCBjaGFyICoqdXNlcl9lbnZwKTsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX3JlZ2lzdGVyX25vdGlmeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpZmljIHByb2Nlc3NvciBldmVudHMKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIGV2ZW50X21hc2sgIDogICBNYXNrIG9mIHR5cGVzIG9mIGV2ZW50cyB0byBiZSBub3RpZmllZCBhYm91dC4KKyAqICAgICAgbm90aWZ5X3R5cGUgOiAgIFR5cGUgb2Ygbm90aWZpY2F0aW9uIHRvIGJlIHNlbnQuCisgKiAgICAgIGhub3RpZmljYXRpb246ICBIYW5kbGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uLgorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDogICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUIDogICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUgb3IgaG5vdGlmaWNhdGlvbi4KKyAqICAgICAgLUVJTlZBTCAgOiAgIFBhcmFtZXRlciBldmVudF9tYXNrIGlzIEludmFsaWQKKyAqICAgICAgRFNQX0VOT1RJTVAgOiAgIFRoZSBub3RpZmljYXRpb24gdHlwZSBzcGVjaWZpZWQgaW4gdU5vdGlmeU1hc2sKKyAqCQkgICAgICBpcyBub3Qgc3VwcG9ydGVkLgorICogICAgICAtRVBFUk0gICA6ICAgVW5hYmxlIHRvIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24uCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGhub3RpZmljYXRpb24gaXMgbm90IE5VTEwKKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKi8KK2V4dGVybiBpbnQgcHJvY19yZWdpc3Rlcl9ub3RpZnkodm9pZCAqaHByb2Nlc3NvciwKKwkJCQkgICAgICAgdTMyIGV2ZW50X21hc2ssIHUzMiBub3RpZnlfdHlwZSwKKwkJCQkgICAgICAgc3RydWN0IGRzcF9ub3RpZmljYXRpb24KKwkJCQkgICAgICAgKmhub3RpZmljYXRpb24pOworCisvKgorICogID09PT09PT09IHByb2Nfbm90aWZ5X2NsaWVudHMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBOb3RpZnkgdGhlIFByb2Nlc3NvciBDbGllbnRzCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgcHJvYyAgICAgICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIGV2ZW50cyAgICAgOiAgIEV2ZW50IHRvIGJlIG5vdGlmaWVkIGFib3V0LgorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDogICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUIDogICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIC1FUEVSTSAgIDogICBGYWlsdXJlIHRvIFNldCBvciBSZXNldCB0aGUgRXZlbnQKKyAqICBSZXF1aXJlczoKKyAqICAgICAgZXZlbnRzIGlzIFN1cHBvcnRlZCBvciBWYWxpZCB0eXBlIG9mIEV2ZW50CisgKiAgICAgIHByb2MgaXMgYSB2YWxpZCBoYW5kbGUKKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IHByb2Nfbm90aWZ5X2NsaWVudHModm9pZCAqcHJvYywgdTMyIGV2ZW50cyk7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19ub3RpZnlfYWxsX2NsaWVudHMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBOb3RpZnkgdGhlIFByb2Nlc3NvciBDbGllbnRzCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgcHJvYyAgICAgICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIGV2ZW50cyAgICAgOiAgIEV2ZW50IHRvIGJlIG5vdGlmaWVkIGFib3V0LgorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDogICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUIDogICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIC1FUEVSTSAgIDogICBGYWlsdXJlIHRvIFNldCBvciBSZXNldCB0aGUgRXZlbnQKKyAqICBSZXF1aXJlczoKKyAqICAgICAgZXZlbnRzIGlzIFN1cHBvcnRlZCBvciBWYWxpZCB0eXBlIG9mIEV2ZW50CisgKiAgICAgIHByb2MgaXMgYSB2YWxpZCBoYW5kbGUKKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKiAgICAgIE5PREUgQW5kIFNUUk0gd291bGQgdXNlIHRoaXMgZnVuY3Rpb24gdG8gbm90aWZ5IHRoZWlyIGNsaWVudHMKKyAqICAgICAgYWJvdXQgdGhlIHN0YXRlIGNoYW5nZXMgaW4gTk9ERSBvciBTVFJNLgorICovCitleHRlcm4gaW50IHByb2Nfbm90aWZ5X2FsbF9jbGllbnRzKHZvaWQgKnByb2MsIHUzMiBldmVudHMpOworCisvKgorICogID09PT09PT09IHByb2Nfc3RhcnQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTdGFydCBhIHByb2Nlc3NvciBydW5uaW5nLgorICogICAgICBQcm9jZXNzb3IgbXVzdCBiZSBpbiBQUk9DX0xPQURFRCBzdGF0ZS4KKyAqICAgICAgVGhpcyB3aWxsIGJlIGFuIE9FTS1vbmx5IGZ1bmN0aW9uLCBhbmQgbm90IHBhcnQgb2YgdGhlICdCcmlkZ2UKKyAqICAgICAgYXBwbGljYXRpb24gZGV2ZWxvcGVyJ3MgQVBJLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhwcm9jZXNzb3IgIDogICAgICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMCAgICAgOiAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUIDogICAgICAgSW52YWxpZCBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICAtRUJBRFI6ICAgIFByb2Nlc3NvciBpcyBub3QgaW4gUFJPQ19MT0FERUQgc3RhdGUuCisgKiAgICAgIC1FUEVSTSAgIDogICAgICAgVW5hYmxlIHRvIHN0YXJ0IHRoZSBwcm9jZXNzb3IuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFBST0MgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICAgICAgU3VjY2VzcyBhbmQgUHJvY1N0YXRlID09IFBST0NfUlVOTklORyBvciBEU1BfRkFJTEVEIHN0YXR1cy4KKyAqICBEZXRhaWxzOgorICovCitleHRlcm4gaW50IHByb2Nfc3RhcnQodm9pZCAqaHByb2Nlc3Nvcik7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19zdG9wID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU3RhcnQgYSBwcm9jZXNzb3IgcnVubmluZy4KKyAqICAgICAgUHJvY2Vzc29yIG11c3QgYmUgaW4gUFJPQ19MT0FERUQgc3RhdGUuCisgKiAgICAgIFRoaXMgd2lsbCBiZSBhbiBPRU0tb25seSBmdW5jdGlvbiwgYW5kIG5vdCBwYXJ0IG9mIHRoZSAnQnJpZGdlCisgKiAgICAgIGFwcGxpY2F0aW9uIGRldmVsb3BlcidzIEFQSS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICA6ICAgICAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogIFJldHVybnM6CisgKiAgICAgIDAgICAgIDogICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVCA6ICAgICAgIEludmFsaWQgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgLUVCQURSOiAgICBQcm9jZXNzb3IgaXMgbm90IGluIFBST0NfTE9BREVEIHN0YXRlLgorICogICAgICAtRVBFUk0gICA6ICAgICAgIFVuYWJsZSB0byBzdGFydCB0aGUgcHJvY2Vzc29yLgorICogIFJlcXVpcmVzOgorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgICAgIFN1Y2Nlc3MgYW5kIFByb2NTdGF0ZSA9PSBQUk9DX1JVTk5JTkcgb3IgRFNQX0ZBSUxFRCBzdGF0dXMuCisgKiAgRGV0YWlsczoKKyAqLworZXh0ZXJuIGludCBwcm9jX3N0b3Aodm9pZCAqaHByb2Nlc3Nvcik7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19lbmRfZG1hID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQmVnaW4gYSBETUEgdHJhbnNmZXIKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICAgICAgOiAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBwbXB1X2FkZHIJOiAgIEJ1ZmZlciBzdGFydCBhZGRyZXNzCisgKiAgICAgIHVsX3NpemUJCTogICBCdWZmZXIgc2l6ZQorICogICAgICBkaXIJCTogICBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcgorICogIFJlcXVpcmVzOgorICogICAgICBNZW1vcnkgd2FzIHByZXZpb3VzbHkgbWFwcGVkLgorICovCitleHRlcm4gaW50IHByb2NfZW5kX2RtYSh2b2lkICpocHJvY2Vzc29yLCB2b2lkICpwbXB1X2FkZHIsIHUzMiB1bF9zaXplLAorCQkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKKy8qCisgKiAgPT09PT09PT0gcHJvY19iZWdpbl9kbWEgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBCZWdpbiBhIERNQSB0cmFuc2ZlcgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhwcm9jZXNzb3IgICAgICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIHBtcHVfYWRkcgk6ICAgQnVmZmVyIHN0YXJ0IGFkZHJlc3MKKyAqICAgICAgdWxfc2l6ZQkJOiAgIEJ1ZmZlciBzaXplCisgKiAgICAgIGRpcgkJOiAgIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIE1lbW9yeSB3YXMgcHJldmlvdXNseSBtYXBwZWQuCisgKi8KK2V4dGVybiBpbnQgcHJvY19iZWdpbl9kbWEodm9pZCAqaHByb2Nlc3Nvciwgdm9pZCAqcG1wdV9hZGRyLCB1MzIgdWxfc2l6ZSwKKwkJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19mbHVzaF9tZW1vcnkgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGbHVzaGVzIGEgYnVmZmVyIGZyb20gdGhlIE1QVSBkYXRhIGNhY2hlLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGhwcm9jZXNzb3IgICAgICA6ICAgVGhlIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIHBtcHVfYWRkcgk6ICAgQnVmZmVyIHN0YXJ0IGFkZHJlc3MKKyAqICAgICAgdWxfc2l6ZQkgIDogICBCdWZmZXIgc2l6ZQorICogICAgICB1bF9mbGFncwkgOiAgIFJlc2VydmVkLgorICogIFJldHVybnM6CisgKiAgICAgIDAJIDogICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUICAgICA6ICAgSW52YWxpZCBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICAtRVBFUk0gICAgICAgOiAgIEdlbmVyYWwgZmFpbHVyZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKiAgICAgIEFsbCB0aGUgYXJndW1lbnRzIGFyZSBjdXJyZW50bHkgaWdub3JlZC4KKyAqLworZXh0ZXJuIGludCBwcm9jX2ZsdXNoX21lbW9yeSh2b2lkICpocHJvY2Vzc29yLAorCQkJCSAgICB2b2lkICpwbXB1X2FkZHIsIHUzMiB1bF9zaXplLCB1MzIgdWxfZmxhZ3MpOworCisvKgorICogID09PT09PT09IHByb2NfaW52YWxpZGF0ZV9tZW1vcnkgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbnZhbGlkYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBNUFUgZGF0YSBjYWNoZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICAgICAgOiAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBwbXB1X2FkZHIJOiAgIEJ1ZmZlciBzdGFydCBhZGRyZXNzCisgKiAgICAgIHVsX3NpemUJICA6ICAgQnVmZmVyIHNpemUKKyAqICBSZXR1cm5zOgorICogICAgICAwCSA6ICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVCAgICAgOiAgIEludmFsaWQgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgLUVQRVJNICAgICAgIDogICBHZW5lcmFsIGZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFBST0MgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICBEZXRhaWxzOgorICogICAgICBBbGwgdGhlIGFyZ3VtZW50cyBhcmUgY3VycmVudGx5IGlnbm9yZWQuCisgKi8KK2V4dGVybiBpbnQgcHJvY19pbnZhbGlkYXRlX21lbW9yeSh2b2lkICpocHJvY2Vzc29yLAorCQkJCQkgdm9pZCAqcG1wdV9hZGRyLCB1MzIgdWxfc2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19tYXAgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBNYXBzIGEgTVBVIGJ1ZmZlciB0byBEU1AgYWRkcmVzcyBzcGFjZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICAgICAgOiAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBwbXB1X2FkZHIJOiAgIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByZWdpb24gdG8gbWFwLgorICogICAgICB1bF9zaXplCSAgOiAgIFNpemUgb2YgdGhlIG1lbW9yeSByZWdpb24gdG8gbWFwLgorICogICAgICByZXFfYWRkcgk6ICAgUmVxdWVzdGVkIERTUCBzdGFydCBhZGRyZXNzLiBPZmZzZXQtYWRqdXN0ZWQgYWN0dWFsCisgKgkJCSAgbWFwcGVkIGFkZHJlc3MgaXMgaW4gdGhlIGxhc3QgYXJndW1lbnQuCisgKiAgICAgIHBwX21hcF9hZGRyICAgICAgIDogICBQdHIgdG8gRFNQIHNpZGUgbWFwcGVkIHU4IGFkZHJlc3MuCisgKiAgICAgIHVsX21hcF9hdHRyICAgICAgIDogICBPcHRpb25hbCBlbmRpYW5uZXNzIGF0dHJpYnV0ZXMsIHZpcnQgdG8gcGh5cyBmbGFnLgorICogIFJldHVybnM6CisgKiAgICAgIDAJIDogICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUICAgICA6ICAgSW52YWxpZCBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICAtRVBFUk0gICAgICAgOiAgIEdlbmVyYWwgZmFpbHVyZS4KKyAqICAgICAgLUVOT01FTSAgICAgOiAgIE1QVSBzaWRlIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICogICAgICAtRU5PRU5UICAgOiAgIENhbm5vdCBmaW5kIGEgcmVzZXJ2ZWQgcmVnaW9uIHN0YXJ0aW5nIHdpdGggdGhpcworICoJCSAgICAgIDogICBhZGRyZXNzLgorICogIFJlcXVpcmVzOgorICogICAgICBwbXB1X2FkZHIgaXMgbm90IE5VTEwKKyAqICAgICAgdWxfc2l6ZSBpcyBub3QgemVybworICogICAgICBwcF9tYXBfYWRkciBpcyBub3QgTlVMTAorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgRGV0YWlsczoKKyAqLworZXh0ZXJuIGludCBwcm9jX21hcCh2b2lkICpocHJvY2Vzc29yLAorCQkJICAgdm9pZCAqcG1wdV9hZGRyLAorCQkJICAgdTMyIHVsX3NpemUsCisJCQkgICB2b2lkICpyZXFfYWRkciwKKwkJCSAgIHZvaWQgKipwcF9tYXBfYWRkciwgdTMyIHVsX21hcF9hdHRyLAorCQkJICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCk7CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19yZXNlcnZlX21lbW9yeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlc2VydmUgYSB2aXJ0dWFsbHkgY29udGlndW91cyByZWdpb24gb2YgRFNQIGFkZHJlc3Mgc3BhY2UuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaHByb2Nlc3NvciAgICAgIDogICBUaGUgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgdWxfc2l6ZQkgIDogICBTaXplIG9mIHRoZSBhZGRyZXNzIHNwYWNlIHRvIHJlc2VydmUuCisgKiAgICAgIHBwX3Jzdl9hZGRyICAgICAgIDogICBQdHIgdG8gRFNQIHNpZGUgcmVzZXJ2ZWQgdTggYWRkcmVzcy4KKyAqICBSZXR1cm5zOgorICogICAgICAwCSA6ICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVCAgICAgOiAgIEludmFsaWQgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgLUVQRVJNICAgICAgIDogICBHZW5lcmFsIGZhaWx1cmUuCisgKiAgICAgIC1FTk9NRU0gICAgIDogICBDYW5ub3QgcmVzZXJ2ZSBjaHVuayBvZiB0aGlzIHNpemUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHBwX3Jzdl9hZGRyIGlzIG5vdCBOVUxMCisgKiAgICAgIFBST0MgSW5pdGlhbGl6ZWQuCisgKiAgRW5zdXJlczoKKyAqICBEZXRhaWxzOgorICovCitleHRlcm4gaW50IHByb2NfcmVzZXJ2ZV9tZW1vcnkodm9pZCAqaHByb2Nlc3NvciwKKwkJCQkgICAgICB1MzIgdWxfc2l6ZSwgdm9pZCAqKnBwX3Jzdl9hZGRyLAorCQkJCSAgICAgIHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpOworCisvKgorICogID09PT09PT09IHByb2NfdW5fbWFwID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVtb3ZlcyBhIE1QVSBidWZmZXIgbWFwcGluZyBmcm9tIHRoZSBEU1AgYWRkcmVzcyBzcGFjZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICAgICAgOiAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBtYXBfYWRkcgk6ICAgU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIG1lbW9yeSByZWdpb24uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMAkgOiAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQgICAgIDogICBJbnZhbGlkIHByb2Nlc3NvciBoYW5kbGUuCisgKiAgICAgIC1FUEVSTSAgICAgICA6ICAgR2VuZXJhbCBmYWlsdXJlLgorICogICAgICAtRU5PRU5UICAgOiAgIENhbm5vdCBmaW5kIGEgbWFwcGVkIHJlZ2lvbiBzdGFydGluZyB3aXRoIHRoaXMKKyAqCQkgICAgICA6ICAgYWRkcmVzcy4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgbWFwX2FkZHIgaXMgbm90IE5VTEwKKyAqICAgICAgUFJPQyBJbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKi8KK2V4dGVybiBpbnQgcHJvY191bl9tYXAodm9pZCAqaHByb2Nlc3Nvciwgdm9pZCAqbWFwX2FkZHIsCisJCQkgICAgICBzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBwcm9jX3VuX3Jlc2VydmVfbWVtb3J5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRnJlZXMgYSBwcmV2aW91c2x5IHJlc2VydmVkIHJlZ2lvbiBvZiBEU1AgYWRkcmVzcyBzcGFjZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBocHJvY2Vzc29yICAgICAgOiAgIFRoZSBwcm9jZXNzb3IgaGFuZGxlLgorICogICAgICBwcnN2X2FkZHIJOiAgIFB0ciB0byBEU1Agc2lkZSByZXNlcnZlZEJZVEUgYWRkcmVzcy4KKyAqICBSZXR1cm5zOgorICogICAgICAwCSA6ICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVCAgICAgOiAgIEludmFsaWQgcHJvY2Vzc29yIGhhbmRsZS4KKyAqICAgICAgLUVQRVJNICAgICAgIDogICBHZW5lcmFsIGZhaWx1cmUuCisgKiAgICAgIC1FTk9FTlQgICA6ICAgQ2Fubm90IGZpbmQgYSByZXNlcnZlZCByZWdpb24gc3RhcnRpbmcgd2l0aCB0aGlzCisgKgkJICAgICAgOiAgIGFkZHJlc3MuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHByc3ZfYWRkciBpcyBub3QgTlVMTAorICogICAgICBQUk9DIEluaXRpYWxpemVkLgorICogIEVuc3VyZXM6CisgKiAgRGV0YWlsczoKKyAqLworZXh0ZXJuIGludCBwcm9jX3VuX3Jlc2VydmVfbWVtb3J5KHZvaWQgKmhwcm9jZXNzb3IsCisJCQkJCSB2b2lkICpwcnN2X2FkZHIsCisJCQkJCSBzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworI2VuZGlmIC8qIFBST0NfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHJvY3ByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9wcm9jcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDFmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHJvY3ByaXYuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogcHJvY3ByaXYuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgUFJPQyBjb25zdGFudHMgYW5kIHR5cGVzLCBzaGFyZWQgYnkgUFJPQywgTUdSIGFuZCBEU1AgQVBJLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgUFJPQ1BSSVZfCisjZGVmaW5lIFBST0NQUklWXworCisvKiBSTSBQUk9DIE9iamVjdCAqLworc3RydWN0IHByb2Nfb2JqZWN0OworCisjZW5kaWYgLyogUFJPQ1BSSVZfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHdyLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkYzc4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9wd3IuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIHB3ci5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgUFdSXworI2RlZmluZSBQV1JfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3B3cl9zaC5oPgorCisvKgorICogID09PT09PT09IHB3cl9zbGVlcF9kc3AgPT09PT09PT0KKyAqICAgICAgU2lnbmFsIHRoZSBEU1AgdG8gZ28gdG8gc2xlZXAuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHNsZWVwX2NvZGU6ICAgICAgICAgIE5ldyBzbGVlcCBzdGF0ZSBmb3IgRFNQLiAgKEluaXRpYWxseSwgdmFsaWQgY29kZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgUFdSX0RFRVBTTEVFUCBvciBQV1JfRU1FUkdFTkNZREVFUFNMRUVQOyBib3RoIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlc2UgY29kZXMgd2lsbCBzaW1wbHkgcHV0IHRoZSBEU1AgaW4gZGVlcCBzbGVlcC4pCisgKgorICoJdGltZW91dDogICAgICAgICAgICBNYXhpbXVtIHRpbWUgKG1zZWMpIHRoYXQgUFdSIHNob3VsZCB3YWl0IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbiB0aGF0IHRoZSBEU1Agc2xlZXAgc3RhdGUgaGFzIGJlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVkLiAgSWYgUFdSIHNob3VsZCBzaW1wbHkgc2VuZCB0aGUgY29tbWFuZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEU1AgdG8gZ28gdG8gc2xlZXAgYW5kIHRoZW4gcmV0dXJuIChpLmUuLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jaHJvdW5vdXMgc2xlZXApLCB0aGUgdGltZW91dCBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXMgemVyby4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAwOiBTdWNjZXNzLCBidXQgdGhlIERTUCB3YXMgYWxyZWFkeSBhc2xlZXAuCisgKiAgICAgIC1FSU5WQUw6ICAgIFRoZSBzcGVjaWZpZWQgc2xlZXBfY29kZSBpcyBub3Qgc3VwcG9ydGVkLgorICogICAgICAtRVRJTUU6ICAgICAgIEEgdGltZW91dCBvY2N1cmVkIHdoaWxlIHdhaXRpbmcgZm9yIERTUCBzbGVlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbi4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICBHZW5lcmFsIGZhaWx1cmUsIHVuYWJsZSB0byBzZW5kIHNsZWVwIGNvbW1hbmQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRFNQLgorICovCitleHRlcm4gaW50IHB3cl9zbGVlcF9kc3AoY29uc3QgdTMyIHNsZWVwX2NvZGUsIGNvbnN0IHUzMiB0aW1lb3V0KTsKKworLyoKKyAqICA9PT09PT09PSBwd3Jfd2FrZV9kc3AgPT09PT09PT0KKyAqICAgIFNpZ25hbCB0aGUgRFNQIHRvIHdha2UgZnJvbSBzbGVlcC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCXRpbWVvdXQ6ICAgICAgICAgICAgTWF4aW11bSB0aW1lIChtc2VjKSB0aGF0IFBXUiBzaG91bGQgd2FpdCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb24gdGhhdCB0aGUgRFNQIGlzIGF3YWtlLiAgSWYgUFdSIHNob3VsZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBseSBzZW5kIGEgY29tbWFuZCB0byB0aGUgRFNQIHRvIHdha2UgYW5kIHRoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkuZS4sIGFzeW5jaHJvdW5vdXMgd2FrZSksIHRpbWVvdXQgc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3BlY2lmaWVkIGFzIHplcm8uCisgKgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgMDogIFN1Y2Nlc3MsIGJ1dCB0aGUgRFNQIHdhcyBhbHJlYWR5IGF3YWtlLgorICogICAgICAtRVRJTUU6ICAgICAgIEEgdGltZW91dCBvY2N1cmVkIHdoaWxlIHdhaXRpbmcgZm9yIHdha2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb24uCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgR2VuZXJhbCBmYWlsdXJlLCB1bmFibGUgdG8gc2VuZCB3YWtlIGNvbW1hbmQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRFNQLgorICovCitleHRlcm4gaW50IHB3cl93YWtlX2RzcChjb25zdCB1MzIgdGltZW91dCk7CisKKy8qCisgKiAgPT09PT09PT0gcHdyX3BtX3ByZV9zY2FsZSA9PT09PT09PQorICogICAgUHJlc2NhbGUgbm90aWZpY2F0aW9uIHRvIERTUC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCXZvbHRhZ2VfZG9tYWluOiAgIFRoZSB2b2x0YWdlIGRvbWFpbiBmb3Igd2hpY2ggbm90aWZpY2F0aW9uIGlzIHNlbnQKKyAqICAgIGxldmVsOgkJCVRoZSBsZXZlbCBvZiB2b2x0YWdlIGRvbWFpbgorICoKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIDA6ICBTdWNjZXNzLCBidXQgdGhlIERTUCB3YXMgYWxyZWFkeSBhd2FrZS4KKyAqICAgICAgLUVUSU1FOiAgICAgICBBIHRpbWVvdXQgb2NjdXJlZCB3aGlsZSB3YWl0aW5nIGZvciB3YWtlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uLgorICogICAgICAtRVBFUk06ICAgICAgICAgIEdlbmVyYWwgZmFpbHVyZSwgdW5hYmxlIHRvIHNlbmQgd2FrZSBjb21tYW5kIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERTUC4KKyAqLworZXh0ZXJuIGludCBwd3JfcG1fcHJlX3NjYWxlKHUxNiB2b2x0YWdlX2RvbWFpbiwgdTMyIGxldmVsKTsKKworLyoKKyAqICA9PT09PT09PSBwd3JfcG1fcG9zdF9zY2FsZSA9PT09PT09PQorICogICAgUG9zdFNjYWxlIG5vdGlmaWNhdGlvbiB0byBEU1AuCisgKgorICogIFBhcmFtZXRlcnM6CisgKgl2b2x0YWdlX2RvbWFpbjogICBUaGUgdm9sdGFnZSBkb21haW4gZm9yIHdoaWNoIG5vdGlmaWNhdGlvbiBpcyBzZW50CisgKiAgICBsZXZlbDoJCQlUaGUgbGV2ZWwgb2Ygdm9sdGFnZSBkb21haW4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAwOiAgU3VjY2VzcywgYnV0IHRoZSBEU1Agd2FzIGFscmVhZHkgYXdha2UuCisgKiAgICAgIC1FVElNRTogICAgICAgQSB0aW1lb3V0IG9jY3VyZWQgd2hpbGUgd2FpdGluZyBmb3Igd2FrZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbi4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICBHZW5lcmFsIGZhaWx1cmUsIHVuYWJsZSB0byBzZW5kIHdha2UgY29tbWFuZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEU1AuCisgKi8KK2V4dGVybiBpbnQgcHdyX3BtX3Bvc3Rfc2NhbGUodTE2IHZvbHRhZ2VfZG9tYWluLCB1MzIgbGV2ZWwpOworCisjZW5kaWYgLyogUFdSXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3B3cl9zaC5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3B3cl9zaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNGEwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcHdyX3NoLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIHB3cl9zaC5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFBvd2VyIE1hbmFnZXIgc2hhcmVkIGRlZmluaXRpb25zICh1c2VkIG9uIGJvdGggR1BQIGFuZCBEU1Agc2lkZXMpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIFBXUl9TSF8KKyNkZWZpbmUgUFdSX1NIXworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL21ieF9zaC5oPgorCisvKiB2YWxpZCBzbGVlcCBjb21tYW5kIGNvZGVzIHRoYXQgY2FuIGJlIHNlbnQgYnkgR1BQIHZpYSBtYWlsYm94OiAqLworI2RlZmluZSBQV1JfREVFUFNMRUVQICAgICAgICAgICBNQlhfUE1fRFNQSURMRQorI2RlZmluZSBQV1JfRU1FUkdFTkNZREVFUFNMRUVQICBNQlhfUE1fRU1FUkdFTkNZU0xFRVAKKyNkZWZpbmUgUFdSX1NMRUVQVU5USUxSRVNUQVJUICAgTUJYX1BNX1NMRUVQVU5USUxSRVNUQVJUCisjZGVmaW5lIFBXUl9XQUtFVVAgICAgICAgICAgICAgIE1CWF9QTV9EU1BXQUtFVVAKKyNkZWZpbmUgUFdSX0FVVE9FTkFCTEUgICAgICAgICAgTUJYX1BNX1BXUkVOQUJMRQorI2RlZmluZSBQV1JfQVVUT0RJU0FCTEUgICAgICAgICBNQlhfUE1fUFdSRElTQUJMRQorI2RlZmluZSBQV1JfUkVURU5USU9OICAgICAgICAgICAgIE1CWF9QTV9EU1BSRVROCisKKyNlbmRpZiAvKiBQV1JfU0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcmVzb3VyY2VjbGVhbnVwLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvcmVzb3VyY2VjbGVhbnVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhZjBjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9yZXNvdXJjZWNsZWFudXAuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogcmVzb3VyY2VjbGVhbnVwLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9ub2RlcHJpdi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnYuaD4KKworZXh0ZXJuIGludCBkcnZfZ2V0X3Byb2NfY3R4dF9saXN0KHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKipwY3R4dCwKKwkJCQkJIHN0cnVjdCBkcnZfb2JqZWN0ICpoZHJ2X29iaik7CisKK2V4dGVybiBpbnQgZHJ2X2luc2VydF9wcm9jX2NvbnRleHQoc3RydWN0IGRydl9vYmplY3QgKmRyaXZlcl9vYmosCisJCQkJCSAgdm9pZCAqcHJvY2Vzc19jdHh0KTsKKworZXh0ZXJuIGludCBkcnZfcmVtb3ZlX2FsbF9kbW1fcmVzX2VsZW1lbnRzKHZvaWQgKnByb2Nlc3NfY3R4dCk7CisKK2V4dGVybiBpbnQgZHJ2X3JlbW92ZV9hbGxfbm9kZV9yZXNfZWxlbWVudHModm9pZCAqcHJvY2Vzc19jdHh0KTsKKworZXh0ZXJuIGludCBkcnZfcHJvY19zZXRfcGlkKHZvaWQgKmN0eHQsIHMzMiBwcm9jZXNzKTsKKworZXh0ZXJuIGludCBkcnZfcmVtb3ZlX2FsbF9yZXNvdXJjZXModm9pZCAqcHJvY2Vzc19jdHh0KTsKKworZXh0ZXJuIGludCBkcnZfcmVtb3ZlX3Byb2NfY29udGV4dChzdHJ1Y3QgZHJ2X29iamVjdCAqZHJpdmVyX29iaiwKKwkJCQkJICB2b2lkICpwcl9jdHh0KTsKKworZXh0ZXJuIGludCBkcnZfaW5zZXJ0X25vZGVfcmVzX2VsZW1lbnQodm9pZCAqaG5vZGUsIHZvaWQgKm5vZGVfcmVzb3VyY2UsCisJCQkJCSAgICAgIHZvaWQgKnByb2Nlc3NfY3R4dCk7CisKK2V4dGVybiB2b2lkIGRydl9wcm9jX25vZGVfdXBkYXRlX2hlYXBfc3RhdHVzKHZvaWQgKm5vZGVfcmVzb3VyY2UsIHMzMiBzdGF0dXMpOworCitleHRlcm4gdm9pZCBkcnZfcHJvY19ub2RlX3VwZGF0ZV9zdGF0dXModm9pZCAqbm9kZV9yZXNvdXJjZSwgczMyIHN0YXR1cyk7CisKK2V4dGVybiBpbnQgZHJ2X3Byb2NfdXBkYXRlX3N0cm1fcmVzKHUzMiBudW1fYnVmcywgdm9pZCAqc3RybV9yZXNvdXJjZXMpOworCitleHRlcm4gaW50IGRydl9wcm9jX2luc2VydF9zdHJtX3Jlc19lbGVtZW50KHZvaWQgKnN0cmVhbV9vYmosCisJCQkJCQkgICB2b2lkICpzdHJtX3JlcywKKwkJCQkJCSAgIHZvaWQgKnByb2Nlc3NfY3R4dCk7CisKK2V4dGVybiBpbnQgZHJ2X3JlbW92ZV9hbGxfc3RybV9yZXNfZWxlbWVudHModm9pZCAqcHJvY2Vzc19jdHh0KTsKKworZXh0ZXJuIGVudW0gbm9kZV9zdGF0ZSBub2RlX2dldF9zdGF0ZSh2b2lkICpobm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvcm1tLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvcm1tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlYTUzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ybW0uaApAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIHJtbS5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFRoaXMgbWVtb3J5IG1hbmFnZXIgcHJvdmlkZXMgZ2VuZXJhbCBoZWFwIG1hbmFnZW1lbnQgYW5kIGFyYml0cmFyeQorICogYWxpZ25tZW50IGZvciBhbnkgbnVtYmVyIG9mIG1lbW9yeSBzZWdtZW50cywgYW5kIG1hbmFnZW1lbnQgb2Ygb3ZlcmxheQorICogbWVtb3J5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgUk1NXworI2RlZmluZSBSTU1fCisKKy8qCisgKiAgPT09PT09PT0gcm1tX2FkZHIgPT09PT09PT0KKyAqICBEU1AgYWRkcmVzcyArIHNlZ2lkCisgKi8KK3N0cnVjdCBybW1fYWRkciB7CisJdTMyIGFkZHI7CisJczMyIHNlZ2lkOworfTsKKworLyoKKyAqICA9PT09PT09PSBybW1fc2VnbWVudCA9PT09PT09PQorICogIE1lbW9yeSBzZWdtZW50IG9uIHRoZSBEU1AgYXZhaWxhYmxlIGZvciByZW1vdGUgYWxsb2NhdGlvbnMuCisgKi8KK3N0cnVjdCBybW1fc2VnbWVudCB7CisJdTMyIGJhc2U7CQkvKiBCYXNlIG9mIHRoZSBzZWdtZW50ICovCisJdTMyIGxlbmd0aDsJCS8qIFNpemUgb2YgdGhlIHNlZ21lbnQgKHRhcmdldCBNQVVzKSAqLworCXMzMiBzcGFjZTsJCS8qIENvZGUgb3IgZGF0YSAqLworCXUzMiBudW1iZXI7CQkvKiBOdW1iZXIgb2YgQWxsb2NhdGVkIEJsb2NrcyAqLworfTsKKworLyoKKyAqICA9PT09PT09PSBSTU1fVGFyZ2V0ID09PT09PT09CisgKi8KK3N0cnVjdCBybW1fdGFyZ2V0X29iajsKKworLyoKKyAqICA9PT09PT09PSBybW1fYWxsb2MgPT09PT09PT0KKyAqCisgKiAgcm1tX2FsbG9jIGlzIHVzZWQgdG8gcmVtb3RlbHkgYWxsb2NhdGUgb3IgcmVzZXJ2ZSBtZW1vcnkgb24gdGhlIERTUC4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdGFyZ2V0ICAgICAgICAgIC0gVGFyZ2V0IHJldHVybmVkIGZyb20gcm1tX2NyZWF0ZSgpLgorICogICAgICBzZWdpZCAgICAgICAgICAgLSBNZW1vcnkgc2VnbWVudCB0byBhbGxvY2F0ZSBmcm9tLgorICogICAgICBzaXplICAgICAgICAgICAgLSBTaXplICh0YXJnZXQgTUFVUykgdG8gYWxsb2NhdGUuCisgKiAgICAgIGFsaWduICAgICAgICAgICAtIGFsaWdubWVudC4KKyAqICAgICAgZHNwX2FkZHJlc3MgICAgIC0gSWYgcmVzZXJ2ZSBpcyBGQUxTRSwgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIGFsbG9jYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9uIG91dHB1dCwgb3RoZXJ3aXNlLCB0aGUgRFNQIGFkZHJlc3MgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZS4KKyAqICAgICAgcmVzZXJ2ZSAgICAgICAgIC0gSWYgVFJVRSwgcmVzZXJ2ZSB0aGUgbWVtb3J5IHNwZWNpZmllZCBieSBkc3BfYWRkcmVzcy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRU5PTUVNOiAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIG9uIEdQUCBmYWlsZWQuCisgKiAgICAgIC1FTlhJTzogICAgIENhbm5vdCAiYWxsb2NhdGUiIG92ZXJsYXkgbWVtb3J5IGJlY2F1c2UgaXQncworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGluIHVzZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgUk1NIGluaXRpYWxpemVkLgorICogICAgICBWYWxpZCB0YXJnZXQuCisgKiAgICAgIGRzcF9hZGRyZXNzICE9IE5VTEwuCisgKiAgICAgIHNpemUgPiAwCisgKiAgICAgIHJlc2VydmUgfHwgdGFyZ2V0LT5udW1fc2VncyA+IDAuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBybW1fYWxsb2Moc3RydWN0IHJtbV90YXJnZXRfb2JqICp0YXJnZXQsIHUzMiBzZWdpZCwgdTMyIHNpemUsCisJCQl1MzIgYWxpZ24sIHUzMiAqZHNwX2FkZHJlc3MsIGJvb2wgcmVzZXJ2ZSk7CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2NyZWF0ZSA9PT09PT09PQorICogIENyZWF0ZSBhIHRhcmdldCBvYmplY3Qgd2l0aCBtZW1vcnkgc2VnbWVudHMgZm9yIHJlbW90ZSBhbGxvY2F0aW9uLiBJZgorICogIHNlZ190YWIgPT0gTlVMTCBvciBudW1fc2VncyA9PSAwLCBtZW1vcnkgY2FuIG9ubHkgYmUgcmVzZXJ2ZWQgdGhyb3VnaAorICogIHJtbV9hbGxvYygpLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB0YXJnZXRfb2JqOiAgICAgICAgLSBMb2NhdGlvbiB0byBzdG9yZSB0YXJnZXQgb24gb3V0cHV0LgorICogICAgICBzZWdfdGFiOiAgICAgICAgIC0gVGFibGUgb2YgbWVtb3J5IHNlZ21lbnRzLgorICogICAgICBudW1fc2VnczogICAgICAgIC0gTnVtYmVyIG9mIG1lbW9yeSBzZWdtZW50cy4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVOT01FTTogICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLgorICogIFJlcXVpcmVzOgorICogICAgICBSTU0gaW5pdGlhbGl6ZWQuCisgKiAgICAgIHRhcmdldF9vYmogIT0gTlVMTC4KKyAqICAgICAgbnVtX3NlZ3MgPT0gMCB8fCBzZWdfdGFiICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqICAgICAgU3VjY2VzczogICAgICAgIFZhbGlkICp0YXJnZXRfb2JqLgorICogICAgICBGYWlsdXJlOiAgICAgICAgKnRhcmdldF9vYmogPT0gTlVMTC4KKyAqLworZXh0ZXJuIGludCBybW1fY3JlYXRlKHN0cnVjdCBybW1fdGFyZ2V0X29iaiAqKnRhcmdldF9vYmosCisJCQkgICAgIHN0cnVjdCBybW1fc2VnbWVudCBzZWdfdGFiW10sIHUzMiBudW1fc2Vncyk7CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2RlbGV0ZSA9PT09PT09PQorICogIERlbGV0ZSB0YXJnZXQgYWxsb2NhdGVkIGluIHJtbV9jcmVhdGUoKS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdGFyZ2V0ICAgICAgICAgIC0gVGFyZ2V0IHJldHVybmVkIGZyb20gcm1tX2NyZWF0ZSgpLgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFJNTSBpbml0aWFsaXplZC4KKyAqICAgICAgVmFsaWQgdGFyZ2V0LgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB2b2lkIHJtbV9kZWxldGUoc3RydWN0IHJtbV90YXJnZXRfb2JqICp0YXJnZXQpOworCisvKgorICogID09PT09PT09IHJtbV9leGl0ID09PT09PT09CisgKiAgRXhpdCB0aGUgUk1NIG1vZHVsZQorICoKKyAqICBQYXJhbWV0ZXJzOgorICogIFJldHVybnM6CisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHJtbV9pbml0IHN1Y2Nlc3NmdWxseSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIHZvaWQgcm1tX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2ZyZWUgPT09PT09PT0KKyAqICBGcmVlIG9yIHVucmVzZXJ2ZSBtZW1vcnkgYWxsb2NhdGVkIHRocm91Z2ggcm1tX2FsbG9jKCkuCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHRhcmdldDogICAgICAgICAtIFRhcmdldCByZXR1cm5lZCBmcm9tIHJtbV9jcmVhdGUoKS4KKyAqICAgICAgc2VnaWQ6ICAgICAgICAgIC0gU2VnbWVudCBvZiBtZW1vcnkgdG8gZnJlZS4KKyAqICAgICAgZHNwX2FkZHJlc3M6ICAgIC0gQWRkcmVzcyB0byBmcmVlIG9yIHVucmVzZXJ2ZS4KKyAqICAgICAgc2l6ZTogICAgICAgICAgIC0gU2l6ZSBvZiBtZW1vcnkgdG8gZnJlZSBvciB1bnJlc2VydmUuCisgKiAgICAgIHJlc2VydmVkOiAgICAgICAtIFRSVUUgaWYgbWVtb3J5IHdhcyByZXNlcnZlZCBvbmx5LCBvdGhlcndpc2UgRkFMU0UuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgUk1NIGluaXRpYWxpemVkLgorICogICAgICBWYWxpZCB0YXJnZXQuCisgKiAgICAgIHJlc2VydmVkIHx8IHNlZ2lkIDwgdGFyZ2V0LT5udW1fc2Vncy4KKyAqICAgICAgcmVzZXJ2ZSB8fCBbZHNwX2FkZHJlc3MsIGRzcF9hZGRyZXNzICsgc2l6ZV0gaXMgYSB2YWxpZCBtZW1vcnkgcmFuZ2UuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGJvb2wgcm1tX2ZyZWUoc3RydWN0IHJtbV90YXJnZXRfb2JqICp0YXJnZXQsIHUzMiBzZWdpZCwgdTMyIGRzcF9hZGRyLAorCQkgICAgIHUzMiBzaXplLCBib29sIHJlc2VydmVkKTsKKworLyoKKyAqICA9PT09PT09PSBybW1faW5pdCA9PT09PT09PQorICogIEluaXRpYWxpemUgdGhlIFJNTSBtb2R1bGUKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFOiAgIFN1Y2Nlc3MuCisgKiAgICAgIEZBTFNFOiAgRmFpbHVyZS4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gYm9vbCBybW1faW5pdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBybW1fc3RhdCA9PT09PT09PQorICogIE9idGFpbiAgbWVtb3J5IHNlZ21lbnQgc3RhdHVzCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHNlZ2lkOiAgICAgICBTZWdtZW50IElEIG9mIHRoZSBkeW5hbWljIGxvYWRpbmcgc2VnbWVudC4KKyAqICAgICAgbWVtX3N0YXRfYnVmOiBQb2ludGVyIHRvIGFsbG9jYXRlZCBidWZmZXIgaW50byB3aGljaCBtZW1vcnkgc3RhdHMgYXJlCisgKiAgICAgICAgICAgICAgICAgICBwbGFjZWQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRTogICBTdWNjZXNzLgorICogICAgICBGQUxTRTogIEZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHNlZ2lkIDwgdGFyZ2V0LT5udW1fc2VncworICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBib29sIHJtbV9zdGF0KHN0cnVjdCBybW1fdGFyZ2V0X29iaiAqdGFyZ2V0LCBlbnVtIGRzcF9tZW10eXBlIHNlZ2lkLAorCQkgICAgIHN0cnVjdCBkc3BfbWVtc3RhdCAqbWVtX3N0YXRfYnVmKTsKKworI2VuZGlmIC8qIFJNTV8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ybXNfc2guaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ybXNfc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM1NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3Jtc19zaC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBybXNfc2guaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgUmVzb3VyY2UgTWFuYWdlciBTZXJ2ZXIgc2hhcmVkIGRlZmluaXRpb25zICh1c2VkIG9uIGJvdGgKKyAqIEdQUCBhbmQgRFNQIHNpZGVzKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBSTVNfU0hfCisjZGVmaW5lIFJNU19TSF8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9ybXN0eXBlcy5oPgorCisvKiBOb2RlIFR5cGVzOiAqLworI2RlZmluZSBSTVNfVEFTSyAgICAgICAgICAgICAgICAxCS8qIFRhc2sgbm9kZSAqLworI2RlZmluZSBSTVNfREFJUyAgICAgICAgICAgICAgICAyCS8qIHhEQUlTIHNvY2tldCBub2RlICovCisjZGVmaW5lIFJNU19NU0cgICAgICAgICAgICAgICAgIDMJLyogTWVzc2FnZSBub2RlICovCisKKy8qIE1lbW9yeSBUeXBlczogKi8KKyNkZWZpbmUgUk1TX0NPREUgICAgICAgICAgICAgICAgMAkvKiBQcm9ncmFtIHNwYWNlICovCisjZGVmaW5lIFJNU19EQVRBICAgICAgICAgICAgICAgIDEJLyogRGF0YSBzcGFjZSAqLworI2RlZmluZSBSTVNfSU8gICAgICAgICAgICAgICAgCTIJLyogSS9PIHNwYWNlICovCisKKy8qIFJNIFNlcnZlciBDb21tYW5kIGFuZCBSZXNwb25zZSBCdWZmZXIgU2l6ZXM6ICovCisjZGVmaW5lIFJNU19DT01NQU5EQlVGU0laRSAgICAgMjU2CS8qIFNpemUgb2YgY29tbWFuZCBidWZmZXIgKi8KKyNkZWZpbmUgUk1TX1JFU1BPTlNFQlVGU0laRSAgICAxNgkvKiBTaXplIG9mIHJlc3BvbnNlIGJ1ZmZlciAqLworCisvKiBQcmUtRGVmaW5lZCBDb21tYW5kL1Jlc3BvbnNlIENvZGVzOiAqLworI2RlZmluZSBSTVNfRVhJVCAgICAgICAgICAgICAgICAweDgwMDAwMDAwCS8qIEdQUC0+Tm9kZTogc2h1dGRvd24gKi8KKyNkZWZpbmUgUk1TX0VYSVRBQ0sgICAgICAgICAgICAgMHg0MDAwMDAwMAkvKiBOb2RlLT5HUFA6IGFjayBzaHV0ZG93biAqLworI2RlZmluZSBSTVNfQlVGREVTQyAgICAgICAgICAgICAweDIwMDAwMDAwCS8qIEFyZzEgU00gYnVmLCBBcmcyIFNNIHNpemUgKi8KKyNkZWZpbmUgUk1TX0tJTExUQVNLICAgICAgICAgICAgMHgxMDAwMDAwMAkvKiBHUFAtPk5vZGU6IEtpbGwgVGFzayAqLworI2RlZmluZSBSTVNfVVNFUiAgICAgICAgICAgICAgICAweDAJLyogU3RhcnQgb2YgdXNlci1kZWZpbmVkIG1zZyBjb2RlcyAqLworI2RlZmluZSBSTVNfTUFYVVNFUkNPREVTICAgICAgICAweGZmZgkvKiBNYXhpbXVtIHVzZXIgZGVmaW5lZCBDL1IgQ29kZXMgKi8KKworLyogUk0gU2VydmVyIFJQQyBDb21tYW5kIFN0cnVjdHVyZTogKi8KK3N0cnVjdCBybXNfY29tbWFuZCB7CisJcm1zX3dvcmQgZnhuOwkJLyogU2VydmVyIGZ1bmN0aW9uIGFkZHJlc3MgKi8KKwlybXNfd29yZCBhcmcxOwkJLyogRmlyc3QgYXJndW1lbnQgKi8KKwlybXNfd29yZCBhcmcyOwkJLyogU2Vjb25kIGFyZ3VtZW50ICovCisJcm1zX3dvcmQgZGF0YTsJCS8qIEZ1bmN0aW9uLXNwZWNpZmljIGRhdGEgYXJyYXkgKi8KK307CisKKy8qCisgKiAgVGhlIHJtc19zdHJtX2RlZiBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcGFyYW1ldGVycyBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0CisgKiAgc3RyZWFtcywgYW5kIGlzIHBhc3NlZCB0byBhIG5vZGUncyBjcmVhdGUgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBybXNfc3RybV9kZWYgeworCXJtc193b3JkIGJ1ZnNpemU7CS8qIEJ1ZmZlciBzaXplIChpbiBEU1Agd29yZHMpICovCisJcm1zX3dvcmQgbmJ1ZnM7CQkvKiBNYXggbnVtYmVyIG9mIGJ1ZnMgaW4gc3RyZWFtICovCisJcm1zX3dvcmQgc2VnaWQ7CQkvKiBTZWdtZW50IHRvIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKwlybXNfd29yZCBhbGlnbjsJCS8qIEFsaWdubWVudCBmb3IgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKwlybXNfd29yZCB0aW1lb3V0OwkvKiBUaW1lb3V0IChtc2VjKSBmb3IgYmxvY2tpbmcgY2FsbHMgKi8KKwljaGFyIG5hbWVbMV07CS8qIERldmljZSBOYW1lICh0ZXJtaW5hdGVkIGJ5ICdcMCcpICovCit9OworCisvKiBNZXNzYWdlIG5vZGUgY3JlYXRlIGFyZ3Mgc3RydWN0dXJlOiAqLworc3RydWN0IHJtc19tc2dfYXJncyB7CisJcm1zX3dvcmQgbWF4X21zZ3M7CS8qIE1heCAjIHNpbXVsdGFuZW91cyBtc2dzIHRvIG5vZGUgKi8KKwlybXNfd29yZCBzZWdpZDsJCS8qIE1lbSBzZWdtZW50IGZvciBOT0RFX2FsbG9jTXNnQnVmICovCisJcm1zX3dvcmQgbm90aWZ5X3R5cGU7CS8qIFR5cGUgb2YgbWVzc2FnZSBub3RpZmljYXRpb24gKi8KKwlybXNfd29yZCBhcmdfbGVuZ3RoOwkvKiBMZW5ndGggKGluIERTUCBjaGFycykgb2YgYXJnIGRhdGEgKi8KKwlybXNfd29yZCBhcmdfZGF0YTsJLyogQXJnIGRhdGEgZm9yIG5vZGUgKi8KK307CisKKy8qIFBhcnRpYWwgdGFzayBjcmVhdGUgYXJncyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBybXNfbW9yZV90YXNrX2FyZ3MgeworCXJtc193b3JkIHByaW9yaXR5OwkvKiBUYXNrJ3MgcnVudGltZSBwcmlvcml0eSBsZXZlbCAqLworCXJtc193b3JkIHN0YWNrX3NpemU7CS8qIFRhc2sncyBzdGFjayBzaXplICovCisJcm1zX3dvcmQgc3lzc3RhY2tfc2l6ZTsJLyogVGFzaydzIHN5c3RlbSBzdGFjayBzaXplICg1NXgpICovCisJcm1zX3dvcmQgc3RhY2tfc2VnOwkvKiBNZW1vcnkgc2VnbWVudCBmb3IgdGFzaydzIHN0YWNrICovCisJcm1zX3dvcmQgaGVhcF9hZGRyOwkvKiBiYXNlIGFkZHJlc3Mgb2YgdGhlIG5vZGUgbWVtb3J5IGhlYXAgaW4KKwkJCQkgKiBleHRlcm5hbCBtZW1vcnkgKERTUCB2aXJ0dWFsIGFkZHJlc3MpICovCisJcm1zX3dvcmQgaGVhcF9zaXplOwkvKiBzaXplIGluIE1BVXMgb2YgdGhlIG5vZGUgbWVtb3J5IGhlYXAgaW4KKwkJCQkgKiBleHRlcm5hbCBtZW1vcnkgKi8KKwlybXNfd29yZCBtaXNjOwkJLyogTWlzYyBmaWVsZC4gIE5vdCB1c2VkIGZvciAnbm9ybWFsJworCQkJCSAqIHRhc2sgbm9kZXM7IGZvciB4REFJUyBzb2NrZXQgbm9kZXMKKwkJCQkgKiBzcGVjaWZpZXMgdGhlIElBTEdfRnhuIHBvaW50ZXIuCisJCQkJICovCisJLyogIyBpbnB1dCBTVFJNIGRlZmluaXRpb24gc3RydWN0dXJlcyAqLworCXJtc193b3JkIG51bV9pbnB1dF9zdHJlYW1zOworfTsKKworI2VuZGlmIC8qIFJNU19TSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ybXN0eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3Jtc3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMGYxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9ybXN0eXBlcy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBybXN0eXBlcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERTUC9CSU9TIEJyaWRnZSBSZXNvdXJjZSBNYW5hZ2VyIFNlcnZlciBzaGFyZWQgZGF0YSB0eXBlIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIFJNU1RZUEVTXworI2RlZmluZSBSTVNUWVBFU18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgordHlwZWRlZiB1MzIgcm1zX3dvcmQ7CisKKyNlbmRpZiAvKiBSTVNUWVBFU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zZXJ2aWNlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3NlcnZpY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNmM4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zZXJ2aWNlcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBzZXJ2aWNlcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFByb3ZpZGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIG9mIFNFUlZJQ0VTIG1vZHVsZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBTRVJWSUNFU18KKyNkZWZpbmUgU0VSVklDRVNfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorLyoKKyAqICA9PT09PT09PSBzZXJ2aWNlc19leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgbW9kdWxlOyBmcmVlIHJlc291cmNlcyB3aGVuIHJlZmVyZW5jZSBjb3VudAorICogICAgICByZWFjaGVzIDAuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBTRVJWSUNFUyBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICogICAgICBSZXNvdXJjZXMgdXNlZCBieSBtb2R1bGUgYXJlIGZyZWVkIHdoZW4gY1JlZiByZWFjaGVzIHplcm8uCisgKi8KK2V4dGVybiB2b2lkIHNlcnZpY2VzX2V4aXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gc2VydmljZXNfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemVzIFNFUlZJQ0VTIG1vZHVsZXMuCisgKiAgUGFyYW1ldGVyczoKKyAqICBSZXR1cm5zOgorICogICAgICBUUlVFIGlmIGFsbCBtb2R1bGVzIGluaXRpYWxpemVkOyBvdGhlcndpc2UgRkFMU0UuCisgKiAgUmVxdWlyZXM6CisgKiAgRW5zdXJlczoKKyAqICAgICAgU0VSVklDRVMgbW9kdWxlcyBpbml0aWFsaXplZC4KKyAqLworZXh0ZXJuIGJvb2wgc2VydmljZXNfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIFNFUlZJQ0VTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3N0cm0uaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zdHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0NjcxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zdHJtLmgKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBzdHJtLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRFNQQnJpZGdlIFN0cmVhbSBNYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgU1RSTV8KKyNkZWZpbmUgU1RSTV8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9zdHJtZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9wcm9jLmg+CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9hbGxvY2F0ZV9idWZmZXIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBbGxvY2F0ZSBkYXRhIGJ1ZmZlcihzKSBmb3IgdXNlIHdpdGggYSBzdHJlYW0uCisgKiAgUGFyYW1ldGVyOgorICogICAgICBzdHJtcmVzOiAgICAgU3RyZWFtIHJlc291cmNlIGluZm8gaGFuZGxlIHJldHVybmVkIGZyb20gc3RybV9vcGVuKCkuCisgKiAgICAgIHVzaXplOiAgICAgICAgICBTaXplIChHUFAgYnl0ZXMpIG9mIHRoZSBidWZmZXIocykuCisgKiAgICAgIG51bV9idWZzOiAgICAgICBOdW1iZXIgb2YgYnVmZmVycyB0byBhbGxvY2F0ZS4KKyAqICAgICAgYXBfYnVmZmVyOiAgICAgICBBcnJheSB0byBob2xkIGJ1ZmZlciBhZGRyZXNzZXMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICAgICAgLUVOT01FTTogICAgSW5zdWZmaWNpZW50IG1lbW9yeS4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgb2NjdXJyZWQsIHVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJzLgorICogICAgICAtRUlOVkFMOiAgICAgIHVzaXplIG11c3QgYmUgPiAwIGJ5dGVzLgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBhcF9idWZmZXIgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IHN0cm1fYWxsb2NhdGVfYnVmZmVyKHN0cnVjdCBzdHJtX3Jlc19vYmplY3QgKnN0cm1yZXMsCisJCQkJICAgICAgIHUzMiB1c2l6ZSwKKwkJCQkgICAgICAgdTggKiphcF9idWZmZXIsCisJCQkJICAgICAgIHUzMiBudW1fYnVmcywKKwkJCQkgICAgICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCk7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9jbG9zZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENsb3NlIGEgc3RyZWFtIG9wZW5lZCB3aXRoIHN0cm1fb3BlbigpLgorICogIFBhcmFtZXRlcjoKKyAqICAgICAgc3RybXJlczogICAgICAgICAgU3RyZWFtIHJlc291cmNlIGluZm8gaGFuZGxlIHJldHVybmVkIGZyb20gc3RybV9vcGVuKCkuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICAgICAgLUVQSVBFOiAgIFNvbWUgZGF0YSBidWZmZXJzIGlzc3VlZCB0byB0aGUgc3RyZWFtIGhhdmUgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICBiZWVuIHJlY2xhaW1lZC4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgdG8gY2xvc2Ugc3RyZWFtLgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgc3RybV9jbG9zZShzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICpzdHJtcmVzLAorCQkJICAgICBzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KTsKKworLyoKKyAqICA9PT09PT09PSBzdHJtX2NyZWF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZSBhIFNUUk0gbWFuYWdlciBvYmplY3QuIFRoaXMgb2JqZWN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogICAgICBkZXZpY2UgbmVlZGVkIHRvIG9wZW4gc3RyZWFtcy4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBzdHJtX21hbjogICAgICAgTG9jYXRpb24gdG8gc3RvcmUgaGFuZGxlIHRvIFNUUk0gbWFuYWdlciBvYmplY3Qgb24KKyAqICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC4KKyAqICAgICAgZGV2X29iajogICAgICAgICAgIERldmljZSBmb3IgdGhpcyBwcm9jZXNzb3IuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3M7CisgKiAgICAgIC1FTk9NRU06ICAgIEluc3VmZmljaWVudCBtZW1vcnkgZm9yIHJlcXVlc3RlZCByZXNvdXJjZXMuCisgKiAgICAgIC1FUEVSTTogICAgICBHZW5lcmFsIGZhaWx1cmUuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHN0cm1faW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIHN0cm1fbWFuICE9IE5VTEwuCisgKiAgICAgIGRldl9vYmogIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgVmFsaWQgKnN0cm1fbWFuLgorICogICAgICBlcnJvcjogICAgICAgICAgKnN0cm1fbWFuID09IE5VTEwuCisgKi8KK2V4dGVybiBpbnQgc3RybV9jcmVhdGUoc3RydWN0IHN0cm1fbWdyICoqc3RybV9tYW4sCisJCQkgICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaik7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9kZWxldGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWxldGUgdGhlIFNUUk0gT2JqZWN0LgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHN0cm1fbWdyX29iajogICAgICAgSGFuZGxlIHRvIFNUUk0gbWFuYWdlciBvYmplY3QgZnJvbSBzdHJtX2NyZWF0ZS4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBWYWxpZCBzdHJtX21ncl9vYmouCisgKiAgRW5zdXJlczoKKyAqICAgICAgc3RybV9tZ3Jfb2JqIGlzIG5vdCB2YWxpZC4KKyAqLworZXh0ZXJuIHZvaWQgc3RybV9kZWxldGUoc3RydWN0IHN0cm1fbWdyICpzdHJtX21ncl9vYmopOworCisvKgorICogID09PT09PT09IHN0cm1fZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2NvbnRpbnVlIHVzYWdlIG9mIFNUUk0gbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgc3RybV9pbml0KHZvaWQpIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYmVmb3JlLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiB2b2lkIHN0cm1fZXhpdCh2b2lkKTsKKworLyoKKyAqICA9PT09PT09PSBzdHJtX2ZyZWVfYnVmZmVyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRnJlZSBidWZmZXIocykgYWxsb2NhdGVkIHdpdGggc3RybV9hbGxvY2F0ZV9idWZmZXIuCisgKiAgUGFyYW1ldGVyOgorICogICAgICBzdHJtcmVzOiAgICAgU3RyZWFtIHJlc291cmNlIGluZm8gaGFuZGxlIHJldHVybmVkIGZyb20gc3RybV9vcGVuKCkuCisgKiAgICAgIGFwX2J1ZmZlcjogICAgICAgQXJyYXkgY29udGFpbmluZyBidWZmZXIgYWRkcmVzc2VzLgorICogICAgICBudW1fYnVmczogICAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgZnJlZWQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtIGhhbmRsZS4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgb2NjdXJyZWQsIHVuYWJsZSB0byBmcmVlIGJ1ZmZlcnMuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHN0cm1faW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIGFwX2J1ZmZlciAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgc3RybV9mcmVlX2J1ZmZlcihzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICpzdHJtcmVzLAorCQkJCSAgIHU4ICoqYXBfYnVmZmVyLCB1MzIgbnVtX2J1ZnMsCisJCQkJICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCk7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9nZXRfZXZlbnRfaGFuZGxlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IHN0cmVhbSdzIHVzZXIgZXZlbnQgaGFuZGxlLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBjbG9zaW5nCisgKiAgICAgIGEgc3RyZWFtLCBzbyB0aGUgZXZlbnQgY2FuIGJlIGNsb3NlZC4KKyAqICBQYXJhbWV0ZXI6CisgKiAgICAgIHN0cmVhbV9vYmo6ICAgICAgU3RyZWFtIGhhbmRsZSByZXR1cm5lZCBmcm9tIHN0cm1fb3BlbigpLgorICogICAgICBwaF9ldmVudDogICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIGV2ZW50IGhhbmRsZSBvbiBvdXRwdXQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgc3RybV9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgcGhfZXZlbnQgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IHN0cm1fZ2V0X2V2ZW50X2hhbmRsZShzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmosCisJCQkJCXZvaWQgKipwaF9ldmVudCk7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9nZXRfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN0cmVhbS4gVXNlcidzIGRzcF9zdHJlYW1pbmZvIGlzIGNvbnRhaW5lZAorICogICAgICBpbiBzdHJlYW1faW5mbyBzdHJ1Y3QuIHN0cmVhbV9pbmZvIGFsc28gY29udGFpbnMgQnJpZGdlIHByaXZhdGUgaW5mby4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBzdHJlYW1fb2JqOiAgICAgICAgIFN0cmVhbSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBzdHJtX29wZW4oKS4KKyAqICAgICAgc3RyZWFtX2luZm86ICAgICAgICBMb2NhdGlvbiB0byBzdG9yZSBzdHJlYW0gaW5mbyBvbiBvdXRwdXQuCisgKiAgICAgIHVTdGVhbUluZm9TaXplOiAgICAgU2l6ZSBvZiB1c2VyJ3MgZHNwX3N0cmVhbWluZm8gc3RydWN0dXJlLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICAgICAgLUVJTlZBTDogICAgICAgICAgc3RyZWFtX2luZm9fc2l6ZSA8IHNpemVvZihkc3Bfc3RyZWFtaW5mbykuCisgKiAgICAgIC1FUEVSTTogICAgICAgICAgVW5hYmxlIHRvIGdldCBzdHJlYW0gaW5mby4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgc3RybV9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgc3RyZWFtX2luZm8gIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gaW50IHN0cm1fZ2V0X2luZm8oc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLAorCQkJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtX2luZm8sCisJCQkJdTMyIHN0cmVhbV9pbmZvX3NpemUpOworCisvKgorICogID09PT09PT09IHN0cm1faWRsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIElkbGUgYSBzdHJlYW0gYW5kIG9wdGlvbmFsbHkgZmx1c2ggb3V0cHV0IGRhdGEgYnVmZmVycy4KKyAqICAgICAgSWYgdGhpcyBpcyBhbiBvdXRwdXQgc3RyZWFtIGFuZCBmbHVzaF9kYXRhIGlzIFRSVUUsIGFsbCBkYXRhIGN1cnJlbnRseQorICogICAgICBlbnF1ZXVlZCB3aWxsIGJlIGRpc2NhcmRlZC4KKyAqICAgICAgSWYgdGhpcyBpcyBhbiBvdXRwdXQgc3RyZWFtIGFuZCBmbHVzaF9kYXRhIGlzIEZBTFNFLCB0aGlzIGZ1bmN0aW9uCisgKiAgICAgIHdpbGwgYmxvY2sgdW50aWwgYWxsIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIGlzIG91dHB1dCwgb3IgdGhlIHRpbWVvdXQKKyAqICAgICAgc3BlY2lmaWVkIGhhcyBiZWVuIHJlYWNoZWQuCisgKiAgICAgIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHN0cm1faWRsZSgpLCBhbGwgYnVmZmVycyBjYW4gaW1tZWRpYXRlbHkKKyAqICAgICAgYmUgcmVjbGFpbWVkLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHN0cmVhbV9vYmo6ICAgICBTdHJlYW0gaGFuZGxlIHJldHVybmVkIGZyb20gc3RybV9vcGVuKCkuCisgKiAgICAgIGZsdXNoX2RhdGE6ICAgICBJZiBUUlVFLCBkaXNjYXJkIG91dHB1dCBidWZmZXJzLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIHN0cmVhbV9vYmouCisgKiAgICAgIC1FVElNRTogICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBzdHJlYW0gY291bGQgYmUgaWRsZWQuCisgKiAgICAgIC1FUEVSTTogICAgICBVbmFibGUgdG8gaWRsZSBzdHJlYW0uCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHN0cm1faW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBzdHJtX2lkbGUoc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLCBib29sIGZsdXNoX2RhdGEpOworCisvKgorICogID09PT09PT09IHN0cm1faW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgdGhlIFNUUk0gbW9kdWxlLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICAgICAgVFJVRSBpZiBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQsIEZBTFNFIG90aGVyd2lzZS4KKyAqICBSZXF1aXJlczoKKyAqICBFbnN1cmVzOgorICovCitleHRlcm4gYm9vbCBzdHJtX2luaXQodm9pZCk7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9pc3N1ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNlbmQgYSBidWZmZXIgb2YgZGF0YSB0byBhIHN0cmVhbS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBzdHJlYW1fb2JqOiAgICAgICAgIFN0cmVhbSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBzdHJtX29wZW4oKS4KKyAqICAgICAgcGJ1ZjogICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1ZmZlciBvZiBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHN0cmVhbS4KKyAqICAgICAgdWxfYnl0ZXM6ICAgICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAqICAgICAgdWxfYnVmX3NpemU6ICAgICAgICAgIEFjdHVhbCBidWZmZXIgc2l6ZSBpbiBieXRlcy4KKyAqICAgICAgZHdfYXJnOiAgICAgICAgICAgICAgQSB1c2VyIGFyZ3VtZW50IHRoYXQgdHJhdmVscyB3aXRoIHRoZSBidWZmZXIuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICAgICAgSW52YWxpZCBzdHJlYW1fb2JqLgorICogICAgICAtRU5PU1I6ICAgIFRoZSBzdHJlYW0gaXMgZnVsbC4KKyAqICAgICAgLUVQRVJNOiAgICAgICAgICBGYWlsdXJlIG9jY3VycmVkLCB1bmFibGUgdG8gaXNzdWUgYnVmZmVyLgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBwYnVmICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBzdHJtX2lzc3VlKHN0cnVjdCBzdHJtX29iamVjdCAqc3RyZWFtX29iaiwgdTggKiBwYnVmLAorCQkJICAgICB1MzIgdWxfYnl0ZXMsIHUzMiB1bF9idWZfc2l6ZSwgdTMyIGR3X2FyZyk7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9vcGVuID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgT3BlbiBhIHN0cmVhbSBmb3Igc2VuZGluZy9yZWNlaXZpbmcgZGF0YSBidWZmZXJzIHRvL2Zyb20gYSB0YXNrIG9mCisgKiAgICAgIERBSVMgc29ja2V0IG5vZGUgb24gdGhlIERTUC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBobm9kZTogICAgICAgICAgTm9kZSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBub2RlX2FsbG9jYXRlKCkuCisgKiAgICAgIGRpcjogICAgICAgICAgIERTUF9UT05PREUgb3IgRFNQX0ZST01OT0RFLgorICogICAgICBpbmRleDogICAgICAgICBTdHJlYW0gaW5kZXguCisgKiAgICAgIHBhdHRyOiAgICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIGF0dHJpYnV0ZXMgdG8gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgdG8gc3RyZWFtLiBDYW5ub3QgYmUgTlVMTC4KKyAqICAgICAgc3RybXJlczogICAgIExvY2F0aW9uIHRvIHN0b3JlIHN0cmVhbSByZXN1b3JjZSBpbmZvIGhhbmRsZSBvbiBvdXRwdXQuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgaG5vZGUuCisgKiAgICAgIC1FUEVSTTogSW52YWxpZCBkaXJlY3Rpb24uCisgKiAgICAgICAgICAgICAgaG5vZGUgaXMgbm90IGEgdGFzayBvciBEQUlTIHNvY2tldCBub2RlLgorICogICAgICAgICAgICAgIFVuYWJsZSB0byBvcGVuIHN0cmVhbS4KKyAqICAgICAgLUVJTlZBTDogICAgIEludmFsaWQgaW5kZXguCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHN0cm1faW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIHN0cm1yZXMgIT0gTlVMTC4KKyAqICAgICAgcGF0dHIgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKnN0cm1yZXMgaXMgdmFsaWQuCisgKiAgICAgIGVycm9yOiAgICAgICAgICAqc3RybXJlcyA9PSBOVUxMLgorICovCitleHRlcm4gaW50IHN0cm1fb3BlbihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgZGlyLAorCQkJICAgIHUzMiBpbmRleCwgc3RydWN0IHN0cm1fYXR0ciAqcGF0dHIsCisJCQkgICAgc3RydWN0IHN0cm1fcmVzX29iamVjdCAqKnN0cm1yZXMsCisJCQkgICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCk7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9wcmVwYXJlX2J1ZmZlciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFByZXBhcmUgYSBkYXRhIGJ1ZmZlciBub3QgYWxsb2NhdGVkIGJ5IERTUFN0cmVhbV9BbGxvY2F0ZUJ1ZmZlcnMoKQorICogICAgICBmb3IgdXNlIHdpdGggYSBzdHJlYW0uCisgKiAgUGFyYW1ldGVyOgorICogICAgICBzdHJlYW1fb2JqOiAgICAgU3RyZWFtIGhhbmRsZSByZXR1cm5lZCBmcm9tIHN0cm1fb3BlbigpLgorICogICAgICB1c2l6ZTogICAgICAgICAgU2l6ZSAoR1BQIGJ5dGVzKSBvZiB0aGUgYnVmZmVyLgorICogICAgICBwYnVmZmVyOiAgICAgICAgQnVmZmVyIGFkZHJlc3MuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgb2NjdXJyZWQsIHVuYWJsZSB0byBwcmVwYXJlIGJ1ZmZlci4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgc3RybV9pbml0KHZvaWQpIGNhbGxlZC4KKyAqICAgICAgcGJ1ZmZlciAhPSBOVUxMLgorICogIEVuc3VyZXM6CisgKi8KK2V4dGVybiBpbnQgc3RybV9wcmVwYXJlX2J1ZmZlcihzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmosCisJCQkJICAgICAgdTMyIHVzaXplLCB1OCAqcGJ1ZmZlcik7CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9yZWNsYWltID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVxdWVzdCBhIGJ1ZmZlciBiYWNrIGZyb20gYSBzdHJlYW0uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgc3RyZWFtX29iajogICAgICAgICAgU3RyZWFtIGhhbmRsZSByZXR1cm5lZCBmcm9tIHN0cm1fb3BlbigpLgorICogICAgICBidWZfcHRyOiAgICAgICAgTG9jYXRpb24gdG8gc3RvcmUgcG9pbnRlciB0byByZWNsYWltZWQgYnVmZmVyLgorICogICAgICBuYnl0ZXM6ICAgICAgICAgTG9jYXRpb24gd2hlcmUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgd2lsbCBiZSB3cml0dGVuLgorICogICAgICBidWZmX3NpemU6ICAgICAgTG9jYXRpb24gd2hlcmUgYWN0dWFsIGJ1ZmZlciBzaXplIHdpbGwgYmUgd3JpdHRlbi4KKyAqICAgICAgcGR3X2FyZzogICAgICAgICBMb2NhdGlvbiB3aGVyZSB1c2VyIGFyZ3VtZW50IHRoYXQgdHJhdmVscyB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbi4KKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgU3VjY2Vzcy4KKyAqICAgICAgLUVGQVVMVDogICAgSW52YWxpZCBzdHJlYW1fb2JqLgorICogICAgICAtRVRJTUU6ICAgQSB0aW1lb3V0IG9jY3VycmVkIGJlZm9yZSBhIGJ1ZmZlciBjb3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkLgorICogICAgICAtRVBFUk06ICAgICAgRmFpbHVyZSBvY2N1cnJlZCwgdW5hYmxlIHRvIHJlY2xhaW0gYnVmZmVyLgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBidWZfcHRyICE9IE5VTEwuCisgKiAgICAgIG5ieXRlcyAhPSBOVUxMLgorICogICAgICBwZHdfYXJnICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBzdHJtX3JlY2xhaW0oc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLAorCQkJICAgICAgIHU4ICoqYnVmX3B0ciwgdTMyICogbmJ5dGVzLAorCQkJICAgICAgIHUzMiAqYnVmZl9zaXplLCB1MzIgKnBkd19hcmcpOworCisvKgorICogID09PT09PT09IHN0cm1fcmVnaXN0ZXJfbm90aWZ5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVnaXN0ZXIgdG8gYmUgbm90aWZpZWQgb24gc3BlY2lmaWMgZXZlbnRzIGZvciB0aGlzIHN0cmVhbS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBzdHJlYW1fb2JqOiAgICAgU3RyZWFtIGhhbmRsZSByZXR1cm5lZCBieSBzdHJtX29wZW4oKS4KKyAqICAgICAgZXZlbnRfbWFzazogICAgIE1hc2sgb2YgdHlwZXMgb2YgZXZlbnRzIHRvIGJlIG5vdGlmaWVkIGFib3V0LgorICogICAgICBub3RpZnlfdHlwZTogICAgVHlwZSBvZiBub3RpZmljYXRpb24gdG8gYmUgc2VudC4KKyAqICAgICAgaG5vdGlmaWNhdGlvbjogIEhhbmRsZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24uCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICAgICAgLUVOT01FTTogICAgSW5zdWZmaWNpZW50IG1lbW9yeSBvbiBHUFAuCisgKiAgICAgIC1FSU5WQUw6ICAgICBldmVudF9tYXNrIGlzIGludmFsaWQuCisgKiAgICAgIC1FTk9TWVM6ICAgTm90aWZpY2F0aW9uIHR5cGUgc3BlY2lmaWVkIGJ5IG5vdGlmeV90eXBlIGlzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBobm90aWZpY2F0aW9uICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBzdHJtX3JlZ2lzdGVyX25vdGlmeShzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmosCisJCQkJICAgICAgIHUzMiBldmVudF9tYXNrLCB1MzIgbm90aWZ5X3R5cGUsCisJCQkJICAgICAgIHN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uCisJCQkJICAgICAgICpobm90aWZpY2F0aW9uKTsKKworLyoKKyAqICA9PT09PT09PSBzdHJtX3NlbGVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNlbGVjdCBhIHJlYWR5IHN0cmVhbS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBzdHJtX3RhYjogICAgICAgQXJyYXkgb2Ygc3RyZWFtIGhhbmRsZXMgcmV0dXJuZWQgZnJvbSBzdHJtX29wZW4oKS4KKyAqICAgICAgc3RybXM6ICAgICAgICAgIE51bWJlciBvZiBzdHJlYW0gaGFuZGxlcyBpbiBhcnJheS4KKyAqICAgICAgcG1hc2s6ICAgICAgICAgIExvY2F0aW9uIHRvIHN0b3JlIG1hc2sgb2YgcmVhZHkgc3RyZWFtcyBvbiBvdXRwdXQuCisgKiAgICAgIHV0aW1lb3V0OiAgICAgICBUaW1lb3V0IHZhbHVlIChtaWxsaXNlY29uZHMpLgorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgICAgICBTdWNjZXNzLgorICogICAgICAtRURPTTogICAgIHN0cm1zIG91dCBvZiByYW5nZS4KKworICogICAgICAtRUZBVUxUOiAgICBJbnZhbGlkIHN0cmVhbSBoYW5kbGUgaW4gYXJyYXkuCisgKiAgICAgIC1FVElNRTogICBBIHRpbWVvdXQgb2NjdXJyZWQgYmVmb3JlIGEgc3RyZWFtIGJlY2FtZSByZWFkeS4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgb2NjdXJyZWQsIHVuYWJsZSB0byBzZWxlY3QgYSBzdHJlYW0uCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIHN0cm1faW5pdCh2b2lkKSBjYWxsZWQuCisgKiAgICAgIHN0cm1fdGFiICE9IE5VTEwuCisgKiAgICAgIHN0cm1zID4gMC4KKyAqICAgICAgcG1hc2sgIT0gTlVMTC4KKyAqICBFbnN1cmVzOgorICogICAgICAwOiAgICAgICAgKnBtYXNrICE9IDAgfHwgdXRpbWVvdXQgPT0gMC4KKyAqICAgICAgRXJyb3I6ICAgICAgICAgICpwbWFzayA9PSAwLgorICovCitleHRlcm4gaW50IHN0cm1fc2VsZWN0KHN0cnVjdCBzdHJtX29iamVjdCAqKnN0cm1fdGFiLAorCQkJICAgICAgdTMyIHN0cm1zLCB1MzIgKnBtYXNrLCB1MzIgdXRpbWVvdXQpOworCisvKgorICogID09PT09PT09IHN0cm1fdW5wcmVwYXJlX2J1ZmZlciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFVucHJlcGFyZSBhIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgcHJlcGFyZWQgZm9yIGEgc3RyZWFtCisgKiAgICAgIHdpdGggRFNQU3RyZWFtX1ByZXBhcmVCdWZmZXIoKSwgYW5kIHRoYXQgd2lsbCBubyBsb25nZXIgYmUgdXNlZCB3aXRoCisgKiAgICAgIHRoZSBzdHJlYW0uCisgKiAgUGFyYW1ldGVyOgorICogICAgICBzdHJlYW1fb2JqOiAgICAgU3RyZWFtIGhhbmRsZSByZXR1cm5lZCBmcm9tIHN0cm1fb3BlbigpLgorICogICAgICB1c2l6ZTogICAgICAgICAgU2l6ZSAoR1BQIGJ5dGVzKSBvZiB0aGUgYnVmZmVyLgorICogICAgICBwYnVmZmVyOiAgICAgICAgQnVmZmVyIGFkZHJlc3MuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgIFN1Y2Nlc3MuCisgKiAgICAgIC1FRkFVTFQ6ICAgIEludmFsaWQgc3RyZWFtX29iai4KKyAqICAgICAgLUVQRVJNOiAgICAgIEZhaWx1cmUgb2NjdXJyZWQsIHVuYWJsZSB0byB1bnByZXBhcmUgYnVmZmVyLgorICogIFJlcXVpcmVzOgorICogICAgICBzdHJtX2luaXQodm9pZCkgY2FsbGVkLgorICogICAgICBwYnVmZmVyICE9IE5VTEwuCisgKiAgRW5zdXJlczoKKyAqLworZXh0ZXJuIGludCBzdHJtX3VucHJlcGFyZV9idWZmZXIoc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLAorCQkJCQl1MzIgdXNpemUsIHU4ICpwYnVmZmVyKTsKKworI2VuZGlmIC8qIFNUUk1fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvc3RybWRlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zdHJtZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjNmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvc3RybWRlZnMuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogc3RybWRlZnMuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBHbG9iYWwgU1RSTSBjb25zdGFudHMgYW5kIHR5cGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgU1RSTURFRlNfCisjZGVmaW5lIFNUUk1ERUZTXworCisjZGVmaW5lIFNUUk1fTUFYRVZUTkFNRUxFTiAgICAgIDMyCisKK3N0cnVjdCBzdHJtX21ncjsKKworc3RydWN0IHN0cm1fb2JqZWN0OworCitzdHJ1Y3Qgc3RybV9hdHRyIHsKKwl2b2lkICp1c2VyX2V2ZW50OworCWNoYXIgKnBzdHJfZXZlbnRfbmFtZTsKKwl2b2lkICp2aXJ0X2Jhc2U7CS8qIFByb2Nlc3MgdmlydHVhbCBiYXNlIGFkZHJlc3Mgb2YKKwkJCQkgKiBtYXBwZWQgU00gKi8KKwl1MzIgdWxfdmlydF9zaXplOwkvKiBTaXplIG9mIHZpcnR1YWwgc3BhY2UgaW4gYnl0ZXMgKi8KKwlzdHJ1Y3QgZHNwX3N0cmVhbWF0dHJpbiAqc3RyZWFtX2F0dHJfaW47Cit9OworCitzdHJ1Y3Qgc3RyZWFtX2luZm8geworCWVudW0gZHNwX3N0cm1tb2RlIHN0cm1fbW9kZTsJLyogdHJhbnNwb3J0IG1vZGUgb2YKKwkJCQkJICogc3RyZWFtKERNQSwgWkVST0NPUFkuLikgKi8KKwl1MzIgc2VnbWVudF9pZDsJCS8qIFNlZ21lbnQgc3RybSBhbGxvY3MgZnJvbS4gMCBpcyBsb2NhbCBtZW0gKi8KKwl2b2lkICp2aXJ0X2Jhc2U7CS8qICIgICAgICAiIFN0cmVhbSdwcm9jZXNzIHZpcnQgYmFzZSAqLworCXN0cnVjdCBkc3Bfc3RyZWFtaW5mbyAqdXNlcl9zdHJtOwkvKiBVc2VyJ3Mgc3RyZWFtIGluZm9ybWF0aW9uCisJCQkJCQkgKiByZXR1cm5lZCAqLworfTsKKworI2VuZGlmIC8qIFNUUk1ERUZTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3N5bmMuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2NTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS9zeW5jLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBzeW5jLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogUHJvdmlkZSBzeW5jaHJvbml6YXRpb24gc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfU1lOQ19ICisjZGVmaW5lIF9TWU5DX0gKKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworCisvKiBTcGVjaWFsIHRpbWVvdXQgdmFsdWUgaW5kaWNhdGluZyBhbiBpbmZpbml0ZSB3YWl0OiAqLworI2RlZmluZSBTWU5DX0lORklOSVRFICAweGZmZmZmZmZmCisKKy8qKgorICogc3RydWN0IHN5bmNfb2JqZWN0IC0gdGhlIGJhc2ljIHN5bmNfb2JqZWN0IHN0cnVjdHVyZQorICogQGNvbXA6CXVzZSB0byBzaWduYWwgZXZlbnRzCisgKiBAbXVsdGlfY29tcDoJdXNlIHRvIHNpZ25hbCBtdWx0aXBsZSBldmVudHMuCisgKgorICovCitzdHJ1Y3Qgc3luY19vYmplY3R7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqbXVsdGlfY29tcDsKK307CisKKy8qKgorICogc3luY19pbml0X2V2ZW50KCkgLSBzZXQgaW5pdGlhbCBzdGF0ZSBmb3IgYSBzeW5jX2V2ZW50IGVsZW1lbnQKKyAqIEBldmVudDoJZXZlbnQgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKgorICogU2V0IHRoZSBpbml0aWFsIHN0YXRlIGZvciBhIHN5bmNfZXZlbnQgZWxlbWVudC4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3luY19pbml0X2V2ZW50KHN0cnVjdCBzeW5jX29iamVjdCAqZXZlbnQpCit7CisJaW5pdF9jb21wbGV0aW9uKCZldmVudC0+Y29tcCk7CisJZXZlbnQtPm11bHRpX2NvbXAgPSBOVUxMOworfQorCisvKioKKyAqIHN5bmNfcmVzZXRfZXZlbnQoKSAtIHJlc2V0IGEgc3luY19ldmVudCBlbGVtZW50CisgKiBAZXZlbnQ6CWV2ZW50IHRvIGJlIHJlc2V0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXQgdG8gdGhlIGluaXRpYWwgc3RhdGUgdG8gQGV2ZW50LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeW5jX3Jlc2V0X2V2ZW50KHN0cnVjdCBzeW5jX29iamVjdCAqZXZlbnQpCit7CisJSU5JVF9DT01QTEVUSU9OKGV2ZW50LT5jb21wKTsKKwlldmVudC0+bXVsdGlfY29tcCA9IE5VTEw7Cit9CisKKy8qKgorICogc3luY19zZXRfZXZlbnQoKSAtIHNldCBvciBzaWduYWwgYW5kIHNwZWNpZmllZCBldmVudAorICogQGV2ZW50OglFdmVudCB0byBiZSBzZXQuLgorICoKKyAqIHNldCB0aGUgQGV2ZW50LCBpZiB0aGVyZSBpcyBhbiB0aHJlYWQgd2FpdGluZyBmb3IgdGhlIGV2ZW50CisgKiBpdCB3aWxsIGJlIHdha2VuIHVwLCB0aGlzIGZ1bmN0aW9uIG9ubHkgd2FrZXMgb25lIHRocmVhZC4KKyAqLworCit2b2lkIHN5bmNfc2V0X2V2ZW50KHN0cnVjdCBzeW5jX29iamVjdCAqZXZlbnQpOworCisvKioKKyAqIHN5bmNfd2FpdF9vbl9ldmVudCgpIC0gd2FpdHMgZm9yIGEgZXZlbnQgdG8gYmUgc2V0LgorICogQGV2ZW50OglldmVudHMgdG8gd2FpdCBmb3IgaXQuCisgKiBAdGltZW91dAl0aW1lb3V0IG9uIHdhaXRpbmcgZm9yIHRoZSBldmV0bi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9zIHdpbGwgd2FpdCB1bnRpbCBAZXZlbnQgaXMgc2V0IG9yIHVudGlsIHRpbWVvdXQuIEluIGNhc2Ugb2YKKyAqIHN1Y2Nlc3MgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAgYW5kCisgKiBpbiBjYXNlIG9mIHRpbWVvdXQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC1FVElNRQorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHN5bmNfd2FpdF9vbl9ldmVudChzdHJ1Y3Qgc3luY19vYmplY3QgKmV2ZW50LAorCQkJCQkJCXVuc2lnbmVkIHRpbWVvdXQpCit7CisJcmV0dXJuIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZXZlbnQtPmNvbXAsCisJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpID8gMCA6IC1FVElNRTsKK30KKworLyoqCisgKiBzeW5jX3dhaXRfb25fbXVsdGlwbGVfZXZlbnRzKCkgLSB3YWl0cyBmb3IgbXVsdGlwbGUgZXZlbnRzIHRvIGJlIHNldC4KKyAqIEBldmVudHM6CUFycmF5IG9mIGV2ZW50cyB0byB3YWl0IGZvciB0aGVtLgorICogQGNvdW50OgludW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGFycmF5LgorICogQHRpbWVvdXQJdGltZW91dCBvbiB3YWl0aW5nIGZvciB0aGUgZXZldG5zLgorICogQHB1X2luZGV4CWluZGV4IG9mIHRoZSBldmVudCBzZXQuCisgKgorICogVGhpcyBmdW5jdGlvcyB3aWxsIHdhaXQgdW50aWwgYW55IG9mIHRoZSBhcnJheSBlbGVtZW50IGlzIHNldCBvciB1bnRpbAorICogdGltZW91dC4gSW4gY2FzZSBvZiBzdWNjZXNzIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAwIGFuZAorICogQHB1X2luZGV4IHdpbGwgc3RvcmUgdGhlIGluZGV4IG9mIHRoZSBhcnJheSBlbGVtZW50IHNldCBhbmQgaW4gY2FzZQorICogb2YgdGltZW91dCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gLUVUSU1FLgorICovCisKK2ludCBzeW5jX3dhaXRfb25fbXVsdGlwbGVfZXZlbnRzKHN0cnVjdCBzeW5jX29iamVjdCAqKmV2ZW50cywKKwkJCQkgICAgIHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCB0aW1lb3V0LAorCQkJCSAgICAgdW5zaWduZWQgKmluZGV4KTsKKworI2VuZGlmIC8qIF9TWU5DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS91dGlsZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2luY2x1ZGUvZHNwYnJpZGdlL3V0aWxkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlNTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS91dGlsZGVmcy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiB1dGlsZGVmcy5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEdsb2JhbCBVVElMIGNvbnN0YW50cyBhbmQgdHlwZXMsIHNoYXJlZCBiZXR3ZWVuIERTUCBBUEkgYW5kIERTUFNZUy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIFVUSUxERUZTXworI2RlZmluZSBVVElMREVGU18KKworLyogY29uc3RhbnRzIHRha2VuIGZyb20gY29uZmlnbWcuaCAqLworI2RlZmluZSBVVElMX01BWE1FTVJFR1MgICAgIDkKKyNkZWZpbmUgVVRJTF9NQVhJT1BPUlRTICAgICAyMAorI2RlZmluZSBVVElMX01BWElSUVMgICAgICAgIDcKKyNkZWZpbmUgVVRJTF9NQVhETUFDSE5MUyAgICA3CisKKy8qIG1pc2MuIGNvbnN0YW50cyAqLworI2RlZmluZSBVVElMX01BWEFSR1ZTICAgICAgIDEwCisKKy8qIFBsYXRmb3JtIHNwZWNpZmljIGltcG9ydGFudCBpbmZvICovCitzdHJ1Y3QgdXRpbF9zeXNpbmZvIHsKKwkvKiBHcmFudWxhcml0eSBvZiBwYWdlIHByb3RlY3Rpb247IHVzdWFsbHkgMWsgb3IgNGsgKi8KKwl1MzIgZHdfcGFnZV9zaXplOworCXUzMiBkd19hbGxvY2F0aW9uX2dyYW51bGFyaXR5OwkvKiBWTSBncmFudWxhcml0eSwgdXN1YWxseSA2NEsgKi8KKwl1MzIgZHdfbnVtYmVyX29mX3Byb2Nlc3NvcnM7CS8qIFVzZWQgYXMgc2FuaXR5IGNoZWNrICovCit9OworCisjZW5kaWYgLyogVVRJTERFRlNfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvdXVpZHV0aWwuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS91dWlkdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTk0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2UvdXVpZHV0aWwuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogdXVpZHV0aWwuaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNwZWNpZmljYXRpb24gb2YgVVVJRCBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgVVVJRFVUSUxfCisjZGVmaW5lIFVVSURVVElMXworCisjZGVmaW5lIE1BWFVVSURMRU4gIDM3CisKKy8qCisgKiAgPT09PT09PT0gdXVpZF91dWlkX3RvX3N0cmluZyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENvbnZlcnRzIGEgZHNwX3V1aWQgdG8gYW4gQU5TSSBzdHJpbmcuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdXVpZF9vYmo6ICAgICAgUG9pbnRlciB0byBhIGRzcF91dWlkIG9iamVjdC4KKyAqICAgICAgc3pfdXVpZDogICAgUG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIGEgTlVMTC10ZXJtaW5hdGVkIFVVSUQKKyAqICAgICAgICAgICAgICAgICAgc3RyaW5nLgorICogICAgICBzaXplOgkgICAgTWF4aW11bSBzaXplIG9mIHRoZSBzel91dWlkIHN0cmluZy4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICB1dWlkX29iaiAmIHN6X3V1aWQgYXJlIG5vbi1OVUxMIHZhbHVlcy4KKyAqICBFbnN1cmVzOgorICogICAgICBMZW5naHRoIG9mIHN6X3V1aWQgaXMgbGVzcyB0aGFuIE1BWFVVSURMRU4uCisgKiAgRGV0YWlsczoKKyAqICAgICAgVVVJRCBzdHJpbmcgbGltaXQgY3VycmVudGx5IHNldCBhdCBNQVhVVUlETEVOLgorICovCit2b2lkIHV1aWRfdXVpZF90b19zdHJpbmcoc3RydWN0IGRzcF91dWlkICp1dWlkX29iaiwgY2hhciAqc3pfdXVpZCwKKwkJCSBzMzIgc2l6ZSk7CisKKy8qCisgKiAgPT09PT09PT0gdXVpZF91dWlkX2Zyb21fc3RyaW5nID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ29udmVydHMgYW4gQU5TSSBzdHJpbmcgdG8gYSBkc3BfdXVpZC4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBzel91dWlkOiAgICBQb2ludGVyIHRvIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIGRzcF91dWlkIG9iamVjdC4KKyAqICAgICAgdXVpZF9vYmo6ICAgICAgUG9pbnRlciB0byBhIGRzcF91dWlkIG9iamVjdC4KKyAqICBSZXR1cm5zOgorICogIFJlcXVpcmVzOgorICogICAgICB1dWlkX29iaiAmIHN6X3V1aWQgYXJlIG5vbi1OVUxMIHZhbHVlcy4KKyAqICBFbnN1cmVzOgorICogIERldGFpbHM6CisgKiAgICAgIFdlIGFzc3VtZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgVVVJRCBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKiAgICAgICIxMjM0NTY3OF8xMjM0XzEyMzRfMTIzNF8xMjM0NTY3ODlhYmMiLgorICovCitleHRlcm4gdm9pZCB1dWlkX3V1aWRfZnJvbV9zdHJpbmcoY2hhciAqc3pfdXVpZCwKKwkJCQkgIHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmopOworCisjZW5kaWYgLyogVVVJRFVUSUxfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvd2R0LmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaW5jbHVkZS9kc3BicmlkZ2Uvd2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMGJhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9pbmNsdWRlL2RzcGJyaWRnZS93ZHQuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogd2R0LmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogSU8gZGlzcGF0Y2hlciBmb3IgYSBzaGFyZWQgbWVtb3J5IGNoYW5uZWwgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBfX0RTUF9XRFQzX0hfCisjZGVmaW5lIF9fRFNQX1dEVDNfSF8KKworLyogV0RUIGRlZmluZXMgKi8KKyNkZWZpbmUgT01BUDNfV0RUM19JU1JfT0ZGU0VUCTB4MDAxOAorCisKKy8qKgorICogc3RydWN0IGRzcF93ZHRfc2V0dGluZyAtIHRoZSBiYXNpYyBkc3Bfd2R0X3NldHRpbmcgc3RydWN0dXJlCisgKiBAcmVnX2Jhc2U6CXBvaW50ZXIgdG8gdGhlIGJhc2Ugb2YgdGhlIHdkdCByZWdpc3RlcnMKKyAqIEBzbV93ZHQ6CXBvaW50ZXIgdG8gZmxhZ3MgaW4gc2hhcmVkIG1lbW9yeQorICogQHdkdDNfdGFza2xldAl0YXNrbGV0IHRvIG1hbmFnZSB3ZHQgZXZlbnQKKyAqIEBmY2xrCQloYW5kbGUgdG8gd2R0MyBmdW5jdGlvbmFsIGNsb2NrCisgKiBAaWNsawkJaGFuZGxlIHRvIHdkdDMgaW50ZXJmYWNlIGNsb2NrCisgKgorICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24gdG8gbWFuYWdlIHdkdDMuCisgKi8KKworc3RydWN0IGRzcF93ZHRfc2V0dGluZyB7CisJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKKwlzdHJ1Y3Qgc2htICpzbV93ZHQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHdkdDNfdGFza2xldDsKKwlzdHJ1Y3QgY2xrICpmY2xrOworCXN0cnVjdCBjbGsgKmljbGs7Cit9OworCisvKioKKyAqIGRzcF93ZHRfaW5pdCgpIC0gaW5pdGlhbGl6ZSB3ZHQzIG1vZHVsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpbGl6ZSB0byB3ZHQzIG1vZHVsZSwgc28gdGhhdAorICogb3RoZXIgd2R0MyBmdW5jdGlvbiBjYW4gYmUgdXNlZC4KKyAqLworaW50IGRzcF93ZHRfaW5pdCh2b2lkKTsKKworLyoqCisgKiBkc3Bfd2R0X2V4aXQoKSAtIGluaXRpYWxpemUgd2R0MyBtb2R1bGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3Igd2R0MyBtb2R1bGUuCisgKi8KK3ZvaWQgZHNwX3dkdF9leGl0KHZvaWQpOworCisvKioKKyAqIGRzcF93ZHRfZW5hYmxlKCkgLSBlbmFibGUvZGlzYWJsZSB3ZHQzCisgKiBAZW5hYmxlOglib29sIHZhbHVlIHRvIGVuYWJsZS9kaXNhYmxlIHdkdDMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgb3IgZGlzYWJsZXMgd2R0MyBiYXNlIG9uIEBlbmFibGUgdmFsdWUuCisgKgorICovCit2b2lkIGRzcF93ZHRfZW5hYmxlKGJvb2wgZW5hYmxlKTsKKworLyoqCisgKiBkc3Bfd2R0X3NtX3NldCgpIC0gc3RvcmUgcG9pbnRlciB0byB0aGUgc2hhcmUgbWVtb3J5CisgKiBAZGF0YToJCXBvaW50ZXIgdG8gZHNwYnJpZGdlIHNoYXJlIG1lbW9yeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzIGEgdmFsaWQgcG9pbnRlciB0byBzaGFyZSBtZW1vcnksCisgKiBzbyB0aGF0IHRoZSBmbGFncyBjYW4gYmUgc2V0IGluIG9yZGVyIERTUCBzaWRlIGNhbiByZWFkIHRoZW0uCisgKgorICovCit2b2lkIGRzcF93ZHRfc21fc2V0KHZvaWQgKmRhdGEpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvY2hubC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvY2hubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzE3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9jaG5sLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBjaG5sLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRFNQIEFQSSBjaGFubmVsIGludGVyZmFjZTogbXVsdGlwbGV4ZXMgZGF0YSBzdHJlYW1zIHRocm91Z2ggdGhlIHNpbmdsZQorICogcGh5c2ljYWwgbGluayBtYW5hZ2VkIGJ5IGEgQnJpZGdlIEJyaWRnZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9zdCBPUyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1MgQWRhcHRhdGlvbiBMYXllciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmcuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3luYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhdGZvcm0gTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9wcm9jLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Nobmxwcml2Lmg+CisjaW5jbHVkZSA8Y2hubG9iai5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jaG5sLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWxzICovCitzdGF0aWMgdTMyIHJlZnM7CisKKy8qCisgKiAgPT09PT09PT0gY2hubF9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBjaGFubmVsIG1hbmFnZXIgb2JqZWN0LCByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBuZXcgY2hhbm5lbHMKKyAqICAgICAgYW5kIGNsb3Npbmcgb2xkIG9uZXMgZm9yIGEgZ2l2ZW4gJ0JyaWRnZSBib2FyZC4KKyAqLworaW50IGNobmxfY3JlYXRlKHN0cnVjdCBjaG5sX21nciAqKmNoYW5uZWxfbWdyLAorCQkgICAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGNobmxfbWdyYXR0cnMgKm1ncl9hdHRydHMpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncjsKKwlzdHJ1Y3QgY2hubF9tZ3JfICpjaG5sX21ncl9vYmogPSBOVUxMOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGNoYW5uZWxfbWdyICE9IE5VTEwpOworCURCQ19SRVFVSVJFKG1ncl9hdHRydHMgIT0gTlVMTCk7CisKKwkqY2hhbm5lbF9tZ3IgPSBOVUxMOworCisJLyogVmFsaWRhdGUgYXJnczogKi8KKwlpZiAoKDAgPCBtZ3JfYXR0cnRzLT5tYXhfY2hhbm5lbHMpICYmCisJICAgIChtZ3JfYXR0cnRzLT5tYXhfY2hhbm5lbHMgPD0gQ0hOTF9NQVhDSEFOTkVMUykpCisJCXN0YXR1cyA9IDA7CisJZWxzZSBpZiAobWdyX2F0dHJ0cy0+bWF4X2NoYW5uZWxzID09IDApCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJZWxzZQorCQlzdGF0dXMgPSAtRUNIUk5HOworCisJaWYgKG1ncl9hdHRydHMtPndvcmRfc2l6ZSA9PSAwKQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0gZGV2X2dldF9jaG5sX21ncihoZGV2X29iaiwgJmhjaG5sX21ncik7CisJCWlmICghc3RhdHVzICYmIGhjaG5sX21nciAhPSBOVUxMKQorCQkJc3RhdHVzID0gLUVFWElTVDsKKworCX0KKworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCQlkZXZfZ2V0X2ludGZfZnhucyhoZGV2X29iaiwgJmludGZfZnhucyk7CisJCS8qIExldCBCcmlkZ2UgY2hhbm5lbCBtb2R1bGUgZmluaXNoIHRoZSBjcmVhdGU6ICovCisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fY2hubF9jcmVhdGUpICgmaGNobmxfbWdyLCBoZGV2X29iaiwKKwkJCQkJCQltZ3JfYXR0cnRzKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCS8qIEZpbGwgaW4gRFNQIEFQSSBjaGFubmVsIG1vZHVsZSdzIGZpZWxkcyBvZiB0aGUKKwkJCSAqIGNobmxfbWdyIHN0cnVjdHVyZSAqLworCQkJY2hubF9tZ3Jfb2JqID0gKHN0cnVjdCBjaG5sX21ncl8gKiloY2hubF9tZ3I7CisJCQljaG5sX21ncl9vYmotPmludGZfZnhucyA9IGludGZfZnhuczsKKwkJCS8qIEZpbmFsbHksIHJldHVybiB0aGUgbmV3IGNoYW5uZWwgbWFuYWdlciBoYW5kbGU6ICovCisJCQkqY2hhbm5lbF9tZ3IgPSBoY2hubF9tZ3I7CisJCX0KKwl9CisKKwlEQkNfRU5TVVJFKHN0YXR1cyB8fCBjaG5sX21ncl9vYmopOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjaG5sX2Rlc3Ryb3kgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDbG9zZSBhbGwgb3BlbiBjaGFubmVscywgYW5kIGRlc3Ryb3kgdGhlIGNoYW5uZWwgbWFuYWdlci4KKyAqLworaW50IGNobmxfZGVzdHJveShzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncikKK3sKKwlzdHJ1Y3QgY2hubF9tZ3JfICpjaG5sX21ncl9vYmogPSAoc3RydWN0IGNobmxfbWdyXyAqKWhjaG5sX21ncjsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlpbnQgc3RhdHVzOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJaWYgKGNobmxfbWdyX29iaikgeworCQlpbnRmX2Z4bnMgPSBjaG5sX21ncl9vYmotPmludGZfZnhuczsKKwkJLyogTGV0IEJyaWRnZSBjaGFubmVsIG1vZHVsZSBkZXN0cm95IHRoZSBjaG5sX21ncjogKi8KKwkJc3RhdHVzID0gKCppbnRmX2Z4bnMtPnBmbl9jaG5sX2Rlc3Ryb3kpIChoY2hubF9tZ3IpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjaG5sX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiB0aGUgQ0hOTCBtb2R1bGUuCisgKi8KK3ZvaWQgY2hubF9leGl0KHZvaWQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJcmVmcy0tOworCisJREJDX0VOU1VSRShyZWZzID49IDApOworfQorCisvKgorICogID09PT09PT09IGNobmxfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgdGhlIENITkwgbW9kdWxlJ3MgcHJpdmF0ZSBzdGF0ZS4KKyAqLworYm9vbCBjaG5sX2luaXQodm9pZCkKK3sKKwlib29sIHJldCA9IHRydWU7CisKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCisJaWYgKHJldCkKKwkJcmVmcysrOworCisJREJDX0VOU1VSRSgocmV0ICYmIChyZWZzID4gMCkpIHx8ICghcmV0ICYmIChyZWZzID49IDApKSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvY2hubG9iai5oIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvY2hubG9iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9jaG5sb2JqLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGNobmxvYmouaAorICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBTdHJ1Y3R1cmUgc3ViY29tcG9uZW50cyBvZiBjaGFubmVsIGNsYXNzIGxpYnJhcnkgY2hhbm5lbCBvYmplY3RzIHdoaWNoCisgKiBhcmUgZXhwb3NlZCB0byBEU1AgQVBJIGZyb20gQnJpZGdlIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIENITkxPQkpfCisjZGVmaW5lIENITkxPQkpfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2hubGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwZGVmcy5oPgorCisvKgorICogIFRoaXMgc3RydWN0IGlzIHRoZSBmaXJzdCBmaWVsZCBpbiBhIGNobmxfbWdyIHN0cnVjdC4gT3RoZXIuIGltcGxlbWVudGF0aW9uCisgKiAgc3BlY2lmaWMgZmllbGRzIGZvbGxvdyB0aGlzIHN0cnVjdHVyZSBpbiBtZW1vcnkuCisgKi8KK3N0cnVjdCBjaG5sX21ncl8geworCS8qIFRoZXNlIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkcyBpbiBhIGNobmxfbWdyIHN0cnVjdDogKi8KKworCS8qIEZ1bmN0aW9uIGludGVyZmFjZSB0byBCcmlkZ2UgZHJpdmVyLiAqLworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworfTsKKworLyoKKyAqICBUaGlzIHN0cnVjdCBpcyB0aGUgZmlyc3QgZmllbGQgaW4gYSBjaG5sX29iamVjdCBzdHJ1Y3QuIE90aGVyLAorICogIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGZpZWxkcyBmb2xsb3cgdGhpcyBzdHJ1Y3R1cmUgaW4gbWVtb3J5LgorICovCitzdHJ1Y3QgY2hubF9vYmplY3RfIHsKKwkvKiBUaGVzZSBtdXN0IGJlIHRoZSBmaXJzdCBmaWVsZHMgaW4gYSBjaG5sX29iamVjdCBzdHJ1Y3Q6ICovCisJc3RydWN0IGNobmxfbWdyXyAqY2hubF9tZ3Jfb2JqOwkvKiBQb2ludGVyIGJhY2sgdG8gY2hhbm5lbCBtYW5hZ2VyLiAqLworfTsKKworI2VuZGlmIC8qIENITkxPQkpfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2NtbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2RjODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9jbW0uYwpAQCAtMCwwICsxLDExNTQgQEAKKy8qCisgKiBjbW0uYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBUaGUgQ29tbXVuaWNhdGlvbihTaGFyZWQpIE1lbW9yeSBNYW5hZ2VtZW50KENNTSkgbW9kdWxlIHByb3ZpZGVzCisgKiBzaGFyZWQgbWVtb3J5IG1hbmFnZW1lbnQgc2VydmljZXMgZm9yIERTUC9CSU9TIEJyaWRnZSBkYXRhIHN0cmVhbWluZworICogYW5kIG1lc3NhZ2luZy4KKyAqCisgKiBNdWx0aXBsZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggQ01NLgorICogRWFjaCByZWdpc3RlcmVkIFNNIHNlZ21lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSBTTSAiYWxsb2NhdG9yIiB0aGF0CisgKiBkZXNjcmliZXMgYSBibG9jayBvZiBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgc2hhcmVkIG1lbW9yeSB1c2VkIGZvcgorICogZnV0dXJlIGFsbG9jYXRpb25zIGJ5IENNTS4KKyAqCisgKiBNZW1vcnkgaXMgY29lbGVzY2VkIGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIGhlYXAgd2hlbiBhIGJ1ZmZlciBpcworICogZnJlZWQuCisgKgorICogTm90ZXM6CisgKiAgIFZhOiBWaXJ0dWFsIGFkZHJlc3MuCisgKiAgIFBhOiBQaHlzaWNhbCBvciBrZXJuZWwgc3lzdGVtIGFkZHJlc3MuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2xpc3QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3luYy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS91dGlsZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhdGZvcm0gTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvcHJvYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jbW0uaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZXMsIERhdGEgU3RydWN0dXJlcywgVHlwZWRlZnMgKi8KKyNkZWZpbmUgTkVYVF9QQShwbm9kZSkgICAocG5vZGUtPmR3X3BhICsgcG5vZGUtPnVsX3NpemUpCisKKy8qIE90aGVyIGJ1cy9wbGF0Zm9ybSB0cmFuc2xhdGlvbnMgKi8KKyNkZWZpbmUgRFNQUEEyR1BQUEEoYmFzZSwgeCwgeSkgICgoeCkrKHkpKQorI2RlZmluZSBHUFBQQTJEU1BQQShiYXNlLCB4LCB5KSAgKCh4KS0oeSkpCisKKy8qCisgKiAgQWxsb2NhdG9ycyBkZWZpbmUgYSBibG9jayBvZiBjb250aWd1b3VzIG1lbW9yeSB1c2VkIGZvciBmdXR1cmUgYWxsb2NhdGlvbnMuCisgKgorICogICAgICBzbWEgLSBzaGFyZWQgbWVtb3J5IGFsbG9jYXRvci4KKyAqICAgICAgdm1hIC0gdmlydHVhbCBtZW1vcnkgYWxsb2NhdG9yLihub3QgdXNlZCkuCisgKi8KK3N0cnVjdCBjbW1fYWxsb2NhdG9yIHsJCS8qIHNtYSAqLworCXVuc2lnbmVkIGludCBzaG1fYmFzZTsJLyogU3RhcnQgb2YgcGh5c2ljYWwgU00gYmxvY2sgKi8KKwl1MzIgdWxfc21fc2l6ZTsJCS8qIFNpemUgb2YgU00gYmxvY2sgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgZHdfdm1fYmFzZTsJLyogU3RhcnQgb2YgVk0gYmxvY2suIChEZXYgZHJpdmVyCisJCQkJCSAqIGNvbnRleHQgZm9yICdzbWEnKSAqLworCXUzMiBkd19kc3BfcGh5c19hZGRyX29mZnNldDsJLyogRFNQIFBBIHRvIEdQUCBQQSBvZmZzZXQgZm9yIHRoaXMKKwkJCQkJICogU00gc3BhY2UgKi8KKwlzOCBjX2ZhY3RvcjsJCS8qIERTUFBhIHRvIEdQUFBhIENvbnZlcnNpb24gRmFjdG9yICovCisJdW5zaWduZWQgaW50IGR3X2RzcF9iYXNlOwkvKiBEU1AgdmlydCBiYXNlIGJ5dGUgYWRkcmVzcyAqLworCXUzMiB1bF9kc3Bfc2l6ZTsJLyogRFNQIHNlZyBzaXplIGluIGJ5dGVzICovCisJc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyOwkvKiBiYWNrIHJlZiB0byBwYXJlbnQgbWdyICovCisJLyogbm9kZSBsaXN0IG9mIGF2YWlsYWJsZSBtZW1vcnkgKi8KKwlzdHJ1Y3QgbHN0X2xpc3QgKmZyZWVfbGlzdF9oZWFkOworCS8qIG5vZGUgbGlzdCBvZiBtZW1vcnkgaW4gdXNlICovCisJc3RydWN0IGxzdF9saXN0ICppbl91c2VfbGlzdF9oZWFkOworfTsKKworc3RydWN0IGNtbV94bGF0b3IgewkJLyogUGE8LT5WYSB0cmFuc2xhdG9yIG9iamVjdCAqLworCS8qIENNTSBvYmplY3QgdGhpcyB0cmFuc2xhdG9yIGFzc29jaWF0ZWQgKi8KKwlzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3I7CisJLyoKKwkgKiAgQ2xpZW50IHByb2Nlc3MgdmlydHVhbCBiYXNlIGFkZHJlc3MgdGhhdCBjb3JyZXNwb25kcyB0byBwaHlzIFNNCisJICogIGJhc2UgYWRkcmVzcyBmb3IgdHJhbnNsYXRvcidzIHVsX3NlZ19pZC4KKwkgKiAgT25seSAxIHNlZ21lbnQgSUQgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgZHdfdmlydF9iYXNlOwkvKiB2aXJ0dWFsIGJhc2UgYWRkcmVzcyAqLworCXUzMiB1bF92aXJ0X3NpemU7CS8qIHNpemUgb2YgdmlydCBzcGFjZSBpbiBieXRlcyAqLworCXUzMiB1bF9zZWdfaWQ7CQkvKiBTZWdtZW50IElkICovCit9OworCisvKiBDTU0gTWdyICovCitzdHJ1Y3QgY21tX29iamVjdCB7CisJLyoKKwkgKiBDbW0gTG9jayBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgbWVtIG1hbmFnZXIgZm9yIG11bHRpLXRocmVhZHMuCisJICovCisJc3RydWN0IG11dGV4IGNtbV9sb2NrOwkvKiBMb2NrIHRvIGFjY2VzcyBjbW0gbWdyICovCisJc3RydWN0IGxzdF9saXN0ICpub2RlX2ZyZWVfbGlzdF9oZWFkOwkvKiBGcmVlIGxpc3Qgb2YgbWVtb3J5IG5vZGVzICovCisJdTMyIHVsX21pbl9ibG9ja19zaXplOwkvKiBNaW4gU00gYmxvY2s7IGRlZmF1bHQgMTYgYnl0ZXMgKi8KKwl1MzIgZHdfcGFnZV9zaXplOwkvKiBNZW1vcnkgUGFnZSBzaXplICgxay80aykgKi8KKwkvKiBHUFAgU00gc2VnbWVudCBwdHJzICovCisJc3RydWN0IGNtbV9hbGxvY2F0b3IgKnBhX2dwcHNtX3NlZ190YWJbQ01NX01BWEdQUFNFR1NdOworfTsKKworLyogRGVmYXVsdCBDTU0gTWdyIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgY21tX21ncmF0dHJzIGNtbV9kZmx0bWdyYXR0cnMgPSB7CisJLyogdWxfbWluX2Jsb2NrX3NpemUsIG1pbiBibG9jayBzaXplKGJ5dGVzKSBhbGxvY2F0ZWQgYnkgY21tIG1nciAqLworCTE2Cit9OworCisvKiBEZWZhdWx0IGFsbG9jYXRpb24gYXR0cmlidXRlcyAqLworc3RhdGljIHN0cnVjdCBjbW1fYXR0cnMgY21tX2RmbHRhbGN0YXR0cnMgPSB7CisJMQkJLyogdWxfc2VnX2lkLCBkZWZhdWx0IHNlZ21lbnQgSWQgZm9yIGFsbG9jYXRvciAqLworfTsKKworLyogQWRkcmVzcyB0cmFuc2xhdG9yIGRlZmF1bHQgYXR0cnMgKi8KK3N0YXRpYyBzdHJ1Y3QgY21tX3hsYXRvcmF0dHJzIGNtbV9kZmx0eGxhdG9yYXR0cnMgPSB7CisJLyogdWxfc2VnX2lkLCBkb2VzIG5vdCBoYXZlIHRvIG1hdGNoIGNtbV9kZmx0YWxjdGF0dHJzIHVsX3NlZ19pZCAqLworCTEsCisJMCwJCQkvKiBkd19kc3BfYnVmcyAqLworCTAsCQkJLyogZHdfZHNwX2J1Zl9zaXplICovCisJTlVMTCwJCQkvKiB2bV9iYXNlICovCisJMCwJCQkvKiBkd192bV9zaXplICovCit9OworCisvKiBTTSBub2RlIHJlcHJlc2VudGluZyBhIGJsb2NrIG9mIG1lbW9yeS4gKi8KK3N0cnVjdCBjbW1fbW5vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogbXVzdCBiZSAxc3QgZWxlbWVudCAqLworCXUzMiBkd19wYTsJCS8qIFBoeXMgYWRkciAqLworCXUzMiBkd192YTsJCS8qIFZpcnR1YWwgYWRkcmVzcyBpbiBkZXZpY2UgcHJvY2VzcyBjb250ZXh0ICovCisJdTMyIHVsX3NpemU7CQkvKiBTTSBibG9jayBzaXplIGluIGJ5dGVzICovCisJdTMyIGNsaWVudF9wcm9jOwkvKiBQcm9jZXNzIHRoYXQgYWxsb2NhdGVkIHRoaXMgbWVtIGJsb2NrICovCit9OworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFscyAqLworc3RhdGljIHUzMiByZWZzOwkJLyogbW9kdWxlIHJlZmVyZW5jZSBjb3VudCAqLworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgYWRkX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgY21tX2FsbG9jYXRvciAqYWxsb2NhdG9yLAorCQkJICAgICBzdHJ1Y3QgY21tX21ub2RlICpwbm9kZSk7CitzdGF0aWMgc3RydWN0IGNtbV9hbGxvY2F0b3IgKmdldF9hbGxvY2F0b3Ioc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqLAorCQkJCQkgICB1MzIgdWxfc2VnX2lkKTsKK3N0YXRpYyBzdHJ1Y3QgY21tX21ub2RlICpnZXRfZnJlZV9ibG9jayhzdHJ1Y3QgY21tX2FsbG9jYXRvciAqYWxsb2NhdG9yLAorCQkJCQl1MzIgdXNpemUpOworc3RhdGljIHN0cnVjdCBjbW1fbW5vZGUgKmdldF9ub2RlKHN0cnVjdCBjbW1fb2JqZWN0ICpjbW1fbWdyX29iaiwgdTMyIGR3X3BhLAorCQkJCSAgdTMyIGR3X3ZhLCB1MzIgdWxfc2l6ZSk7CisvKiBnZXQgYXZhaWxhYmxlIHNsb3QgZm9yIG5ldyBhbGxvY2F0b3IgKi8KK3N0YXRpYyBzMzIgZ2V0X3Nsb3Qoc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqKTsKK3N0YXRpYyB2b2lkIHVuX3JlZ2lzdGVyX2dwcHNtX3NlZyhzdHJ1Y3QgY21tX2FsbG9jYXRvciAqcHNtYSk7CisKKy8qCisgKiAgPT09PT09PT0gY21tX2NhbGxvY19idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBbGxvY2F0ZSBhIFNNIGJ1ZmZlciwgemVybyBjb250ZW50cywgYW5kIHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcworICogICAgICBhbmQgb3B0aW9uYWwgZHJpdmVyIGNvbnRleHQgdmlydHVhbCBhZGRyZXNzKHBwX2J1Zl92YSkuCisgKgorICogICAgICBUaGUgZnJlZWxpc3QgaXMgc29ydGVkIGluIGluY3JlYXNpbmcgc2l6ZSBvcmRlci4gR2V0IHRoZSBmaXJzdAorICogICAgICBibG9jayB0aGF0IHNhdGlmaWVzIHRoZSByZXF1ZXN0IGFuZCBzb3J0IHRoZSByZW1haW5pbmcgYmFjayBvbgorICogICAgICB0aGUgZnJlZWxpc3Q7IGlmIGxhcmdlIGVub3VnaC4gVGhlIGtlcHQgYmxvY2sgaXMgcGxhY2VkIG9uIHRoZQorICogICAgICBpblVzZUxpc3QuCisgKi8KK3ZvaWQgKmNtbV9jYWxsb2NfYnVmKHN0cnVjdCBjbW1fb2JqZWN0ICpoY21tX21nciwgdTMyIHVzaXplLAorCQkgICAgIHN0cnVjdCBjbW1fYXR0cnMgKnBhdHRycywgdm9pZCAqKnBwX2J1Zl92YSkKK3sKKwlzdHJ1Y3QgY21tX29iamVjdCAqY21tX21ncl9vYmogPSAoc3RydWN0IGNtbV9vYmplY3QgKiloY21tX21ncjsKKwl2b2lkICpidWZfcGEgPSBOVUxMOworCXN0cnVjdCBjbW1fbW5vZGUgKnBub2RlID0gTlVMTDsKKwlzdHJ1Y3QgY21tX21ub2RlICpuZXdfbm9kZSA9IE5VTEw7CisJc3RydWN0IGNtbV9hbGxvY2F0b3IgKmFsbG9jYXRvciA9IE5VTEw7CisJdTMyIGRlbHRhX3NpemU7CisJdTggKnBieXRlID0gTlVMTDsKKwlzMzIgY250OworCisJaWYgKHBhdHRycyA9PSBOVUxMKQorCQlwYXR0cnMgPSAmY21tX2RmbHRhbGN0YXR0cnM7CisKKwlpZiAocHBfYnVmX3ZhICE9IE5VTEwpCisJCSpwcF9idWZfdmEgPSBOVUxMOworCisJaWYgKGNtbV9tZ3Jfb2JqICYmICh1c2l6ZSAhPSAwKSkgeworCQlpZiAocGF0dHJzLT51bF9zZWdfaWQgPiAwKSB7CisJCQkvKiBTZWdJZCA+IDAgaXMgU00gKi8KKwkJCS8qIGdldCB0aGUgYWxsb2NhdG9yIG9iamVjdCBmb3IgdGhpcyBzZWdtZW50IGlkICovCisJCQlhbGxvY2F0b3IgPQorCQkJICAgIGdldF9hbGxvY2F0b3IoY21tX21ncl9vYmosIHBhdHRycy0+dWxfc2VnX2lkKTsKKwkJCS8qIGtlZXAgYmxvY2sgc2l6ZSBhIG11bHRpcGxlIG9mIHVsX21pbl9ibG9ja19zaXplICovCisJCQl1c2l6ZSA9CisJCQkgICAgKCh1c2l6ZSAtIDEpICYgfihjbW1fbWdyX29iai0+dWxfbWluX2Jsb2NrX3NpemUgLQorCQkJCQkgICAgIDEpKQorCQkJICAgICsgY21tX21ncl9vYmotPnVsX21pbl9ibG9ja19zaXplOworCQkJbXV0ZXhfbG9jaygmY21tX21ncl9vYmotPmNtbV9sb2NrKTsKKwkJCXBub2RlID0gZ2V0X2ZyZWVfYmxvY2soYWxsb2NhdG9yLCB1c2l6ZSk7CisJCX0KKwkJaWYgKHBub2RlKSB7CisJCQlkZWx0YV9zaXplID0gKHBub2RlLT51bF9zaXplIC0gdXNpemUpOworCQkJaWYgKGRlbHRhX3NpemUgPj0gY21tX21ncl9vYmotPnVsX21pbl9ibG9ja19zaXplKSB7CisJCQkJLyogY3JlYXRlIGEgbmV3IGJsb2NrIHdpdGggdGhlIGxlZnRvdmVycyBhbmQKKwkJCQkgKiBhZGQgdG8gZnJlZWxpc3QgKi8KKwkJCQluZXdfbm9kZSA9CisJCQkJICAgIGdldF9ub2RlKGNtbV9tZ3Jfb2JqLCBwbm9kZS0+ZHdfcGEgKyB1c2l6ZSwKKwkJCQkJICAgICBwbm9kZS0+ZHdfdmEgKyB1c2l6ZSwKKwkJCQkJICAgICAodTMyKSBkZWx0YV9zaXplKTsKKwkJCQkvKiBsZWZ0b3ZlcnMgZ28gZnJlZSAqLworCQkJCWFkZF90b19mcmVlX2xpc3QoYWxsb2NhdG9yLCBuZXdfbm9kZSk7CisJCQkJLyogYWRqdXN0IG91ciBub2RlJ3Mgc2l6ZSAqLworCQkJCXBub2RlLT51bF9zaXplID0gdXNpemU7CisJCQl9CisJCQkvKiBUYWcgbm9kZSB3aXRoIGNsaWVudCBwcm9jZXNzIHJlcXVlc3RpbmcgYWxsb2NhdGlvbgorCQkJICogV2UnbGwgbmVlZCB0byBmcmVlIHVwIGEgcHJvY2VzcydzIGFsbG9jJ2QgU00gaWYgdGhlCisJCQkgKiBjbGllbnQgcHJvY2VzcyBnb2VzIGF3YXkuCisJCQkgKi8KKwkJCS8qIFJldHVybiBUR0lEIGluc3RlYWQgb2YgcHJvY2VzcyBoYW5kbGUgKi8KKwkJCXBub2RlLT5jbGllbnRfcHJvYyA9IGN1cnJlbnQtPnRnaWQ7CisKKwkJCS8qIHB1dCBvdXIgbm9kZSBvbiBJblVzZSBsaXN0ICovCisJCQlsc3RfcHV0X3RhaWwoYWxsb2NhdG9yLT5pbl91c2VfbGlzdF9oZWFkLAorCQkJCSAgICAgKHN0cnVjdCBsaXN0X2hlYWQgKilwbm9kZSk7CisJCQlidWZfcGEgPSAodm9pZCAqKXBub2RlLT5kd19wYTsJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCQkJLyogY2xlYXIgbWVtICovCisJCQlwYnl0ZSA9ICh1OCAqKSBwbm9kZS0+ZHdfdmE7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IChzMzIpIHVzaXplOyBjbnQrKywgcGJ5dGUrKykKKwkJCQkqcGJ5dGUgPSAwOworCisJCQlpZiAocHBfYnVmX3ZhICE9IE5VTEwpIHsKKwkJCQkvKiBWaXJ0dWFsIGFkZHJlc3MgKi8KKwkJCQkqcHBfYnVmX3ZhID0gKHZvaWQgKilwbm9kZS0+ZHdfdmE7CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjbW1fbWdyX29iai0+Y21tX2xvY2spOworCX0KKwlyZXR1cm4gYnVmX3BhOworfQorCisvKgorICogID09PT09PT09IGNtbV9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBjb21tdW5pY2F0aW9uIG1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KKyAqLworaW50IGNtbV9jcmVhdGUoc3RydWN0IGNtbV9vYmplY3QgKipwaF9jbW1fbWdyLAorCQkgICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjbW1fbWdyYXR0cnMgKm1ncl9hdHRydHMpCit7CisJc3RydWN0IGNtbV9vYmplY3QgKmNtbV9vYmogPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCB1dGlsX3N5c2luZm8gc3lzX2luZm87CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGhfY21tX21nciAhPSBOVUxMKTsKKworCSpwaF9jbW1fbWdyID0gTlVMTDsKKwkvKiBjcmVhdGUsIHplcm8sIGFuZCB0YWcgYSBjbW0gbWdyIG9iamVjdCAqLworCWNtbV9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21tX29iamVjdCksIEdGUF9LRVJORUwpOworCWlmIChjbW1fb2JqICE9IE5VTEwpIHsKKwkJaWYgKG1ncl9hdHRydHMgPT0gTlVMTCkKKwkJCW1ncl9hdHRydHMgPSAmY21tX2RmbHRtZ3JhdHRyczsJLyogc2V0IGRlZmF1bHRzICovCisKKwkJLyogNCBieXRlcyBtaW5pbXVtICovCisJCURCQ19BU1NFUlQobWdyX2F0dHJ0cy0+dWxfbWluX2Jsb2NrX3NpemUgPj0gNCk7CisJCS8qIHNhdmUgYXdheSBzbWFsbGVzdCBibG9jayBhbGxvY2F0aW9uIGZvciB0aGlzIGNtbSBtZ3IgKi8KKwkJY21tX29iai0+dWxfbWluX2Jsb2NrX3NpemUgPSBtZ3JfYXR0cnRzLT51bF9taW5fYmxvY2tfc2l6ZTsKKwkJLyogc2F2ZSBhd2F5IHRoZSBzeXN0ZW1zIG1lbW9yeSBwYWdlIHNpemUgKi8KKwkJc3lzX2luZm8uZHdfcGFnZV9zaXplID0gUEFHRV9TSVpFOworCQlzeXNfaW5mby5kd19hbGxvY2F0aW9uX2dyYW51bGFyaXR5ID0gUEFHRV9TSVpFOworCQlzeXNfaW5mby5kd19udW1iZXJfb2ZfcHJvY2Vzc29ycyA9IDE7CisKKwkJY21tX29iai0+ZHdfcGFnZV9zaXplID0gc3lzX2luZm8uZHdfcGFnZV9zaXplOworCisJCS8qIE5vdGU6IERTUCBTTSBzZWcgdGFibGUoYURTUFNNU2VnVGFiW10pIHplcm8nZCBieQorCQkgKiBNRU1fQUxMT0NfT0JKRUNUICovCisKKwkJLyogY3JlYXRlIG5vZGUgZnJlZSBsaXN0ICovCisJCWNtbV9vYmotPm5vZGVfZnJlZV9saXN0X2hlYWQgPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsc3RfbGlzdCksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKGNtbV9vYmotPm5vZGVfZnJlZV9saXN0X2hlYWQgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWNtbV9kZXN0cm95KGNtbV9vYmosIHRydWUpOworCQl9IGVsc2UgeworCQkJSU5JVF9MSVNUX0hFQUQoJmNtbV9vYmotPgorCQkJCSAgICAgICBub2RlX2ZyZWVfbGlzdF9oZWFkLT5oZWFkKTsKKwkJCW11dGV4X2luaXQoJmNtbV9vYmotPmNtbV9sb2NrKTsKKwkJCSpwaF9jbW1fbWdyID0gY21tX29iajsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY21tX2Rlc3Ryb3kgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZWxlYXNlIHRoZSBjb21tdW5pY2F0aW9uIG1lbW9yeSBtYW5hZ2VyIHJlc291cmNlcy4KKyAqLworaW50IGNtbV9kZXN0cm95KHN0cnVjdCBjbW1fb2JqZWN0ICpoY21tX21nciwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3QgY21tX29iamVjdCAqY21tX21ncl9vYmogPSAoc3RydWN0IGNtbV9vYmplY3QgKiloY21tX21ncjsKKwlzdHJ1Y3QgY21tX2luZm8gdGVtcF9pbmZvOworCWludCBzdGF0dXMgPSAwOworCXMzMiBzbG90X3NlZzsKKwlzdHJ1Y3QgY21tX21ub2RlICpwbm9kZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlpZiAoIWhjbW1fbWdyKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCXJldHVybiBzdGF0dXM7CisJfQorCW11dGV4X2xvY2soJmNtbV9tZ3Jfb2JqLT5jbW1fbG9jayk7CisJLyogSWYgbm90IGZvcmNlIHRoZW4gZmFpbCBpZiBvdXRzdGFuZGluZyBhbGxvY2F0aW9ucyBleGlzdCAqLworCWlmICghZm9yY2UpIHsKKwkJLyogQ2hlY2sgZm9yIG91dHN0YW5kaW5nIG1lbW9yeSBhbGxvY2F0aW9ucyAqLworCQlzdGF0dXMgPSBjbW1fZ2V0X2luZm8oaGNtbV9tZ3IsICZ0ZW1wX2luZm8pOworCQlpZiAoIXN0YXR1cykgeworCQkJaWYgKHRlbXBfaW5mby51bF90b3RhbF9pbl91c2VfY250ID4gMCkgeworCQkJCS8qIG91dHN0YW5kaW5nIGFsbG9jYXRpb25zICovCisJCQkJc3RhdHVzID0gLUVQRVJNOworCQkJfQorCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIFVuUmVnaXN0ZXIgU00gYWxsb2NhdG9yICovCisJCWZvciAoc2xvdF9zZWcgPSAwOyBzbG90X3NlZyA8IENNTV9NQVhHUFBTRUdTOyBzbG90X3NlZysrKSB7CisJCQlpZiAoY21tX21ncl9vYmotPnBhX2dwcHNtX3NlZ190YWJbc2xvdF9zZWddICE9IE5VTEwpIHsKKwkJCQl1bl9yZWdpc3Rlcl9ncHBzbV9zZWcKKwkJCQkgICAgKGNtbV9tZ3Jfb2JqLT5wYV9ncHBzbV9zZWdfdGFiW3Nsb3Rfc2VnXSk7CisJCQkJLyogU2V0IHNsb3QgdG8gTlVMTCBmb3IgZnV0dXJlIHJldXNlICovCisJCQkJY21tX21ncl9vYmotPnBhX2dwcHNtX3NlZ190YWJbc2xvdF9zZWddID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY21tX21ncl9vYmotPm5vZGVfZnJlZV9saXN0X2hlYWQgIT0gTlVMTCkgeworCQkvKiBGcmVlIHRoZSBmcmVlIG5vZGVzICovCisJCXdoaWxlICghTFNUX0lTX0VNUFRZKGNtbV9tZ3Jfb2JqLT5ub2RlX2ZyZWVfbGlzdF9oZWFkKSkgeworCQkJcG5vZGUgPSAoc3RydWN0IGNtbV9tbm9kZSAqKQorCQkJICAgIGxzdF9nZXRfaGVhZChjbW1fbWdyX29iai0+bm9kZV9mcmVlX2xpc3RfaGVhZCk7CisJCQlrZnJlZShwbm9kZSk7CisJCX0KKwkJLyogZGVsZXRlIE5vZGVGcmVlTGlzdCBsaXN0ICovCisJCWtmcmVlKGNtbV9tZ3Jfb2JqLT5ub2RlX2ZyZWVfbGlzdF9oZWFkKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjbW1fbWdyX29iai0+Y21tX2xvY2spOworCWlmICghc3RhdHVzKSB7CisJCS8qIGRlbGV0ZSBDUyAmIGNtbSBtZ3Igb2JqZWN0ICovCisJCW11dGV4X2Rlc3Ryb3koJmNtbV9tZ3Jfb2JqLT5jbW1fbG9jayk7CisJCWtmcmVlKGNtbV9tZ3Jfb2JqKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjbW1fZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2NvbnRpbnVlIHVzYWdlIG9mIG1vZHVsZTsgZnJlZSByZXNvdXJjZXMgd2hlbiByZWZlcmVuY2UgY291bnQKKyAqICAgICAgcmVhY2hlcyAwLgorICovCit2b2lkIGNtbV9leGl0KHZvaWQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJcmVmcy0tOworfQorCisvKgorICogID09PT09PT09IGNtbV9mcmVlX2J1ZiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWUgdGhlIGdpdmVuIGJ1ZmZlci4KKyAqLworaW50IGNtbV9mcmVlX2J1ZihzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3IsIHZvaWQgKmJ1Zl9wYSwKKwkJCXUzMiB1bF9zZWdfaWQpCit7CisJc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqID0gKHN0cnVjdCBjbW1fb2JqZWN0ICopaGNtbV9tZ3I7CisJaW50IHN0YXR1cyA9IC1FRkFVTFQ7CisJc3RydWN0IGNtbV9tbm9kZSAqbW5vZGVfb2JqID0gTlVMTDsKKwlzdHJ1Y3QgY21tX2FsbG9jYXRvciAqYWxsb2NhdG9yID0gTlVMTDsKKwlzdHJ1Y3QgY21tX2F0dHJzICpwYXR0cnM7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoYnVmX3BhICE9IE5VTEwpOworCisJaWYgKHVsX3NlZ19pZCA9PSAwKSB7CisJCXBhdHRycyA9ICZjbW1fZGZsdGFsY3RhdHRyczsKKwkJdWxfc2VnX2lkID0gcGF0dHJzLT51bF9zZWdfaWQ7CisJfQorCWlmICghaGNtbV9tZ3IgfHwgISh1bF9zZWdfaWQgPiAwKSkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwkvKiBnZXQgdGhlIGFsbG9jYXRvciBmb3IgdGhpcyBzZWdtZW50IGlkICovCisJYWxsb2NhdG9yID0gZ2V0X2FsbG9jYXRvcihjbW1fbWdyX29iaiwgdWxfc2VnX2lkKTsKKwlpZiAoYWxsb2NhdG9yICE9IE5VTEwpIHsKKwkJbXV0ZXhfbG9jaygmY21tX21ncl9vYmotPmNtbV9sb2NrKTsKKwkJbW5vZGVfb2JqID0KKwkJICAgIChzdHJ1Y3QgY21tX21ub2RlICopbHN0X2ZpcnN0KGFsbG9jYXRvci0+aW5fdXNlX2xpc3RfaGVhZCk7CisJCXdoaWxlIChtbm9kZV9vYmopIHsKKwkJCWlmICgodTMyKSBidWZfcGEgPT0gbW5vZGVfb2JqLT5kd19wYSkgeworCQkJCS8qIEZvdW5kIGl0ICovCisJCQkJbHN0X3JlbW92ZV9lbGVtKGFsbG9jYXRvci0+aW5fdXNlX2xpc3RfaGVhZCwKKwkJCQkJCShzdHJ1Y3QgbGlzdF9oZWFkICopbW5vZGVfb2JqKTsKKwkJCQkvKiBiYWNrIHRvIGZyZWVsaXN0ICovCisJCQkJYWRkX3RvX2ZyZWVfbGlzdChhbGxvY2F0b3IsIG1ub2RlX29iaik7CisJCQkJc3RhdHVzID0gMDsJLyogYWxsIHJpZ2h0ISAqLworCQkJCWJyZWFrOworCQkJfQorCQkJLyogbmV4dCBub2RlLiAqLworCQkJbW5vZGVfb2JqID0gKHN0cnVjdCBjbW1fbW5vZGUgKikKKwkJCSAgICBsc3RfbmV4dChhbGxvY2F0b3ItPmluX3VzZV9saXN0X2hlYWQsCisJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKW1ub2RlX29iaik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjbW1fbWdyX29iai0+Y21tX2xvY2spOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGNtbV9nZXRfaGFuZGxlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0dXJuIHRoZSBjb21tdW5pY2F0aW9uIG1lbW9yeSBtYW5hZ2VyIG9iamVjdCBmb3IgdGhpcyBkZXZpY2UuCisgKiAgICAgIFRoaXMgaXMgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBjbGllbnQgcHJvY2Vzcy4KKyAqLworaW50IGNtbV9nZXRfaGFuZGxlKHZvaWQgKmhwcm9jZXNzb3IsIHN0cnVjdCBjbW1fb2JqZWN0ICoqIHBoX2NtbV9tZ3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHBoX2NtbV9tZ3IgIT0gTlVMTCk7CisJaWYgKGhwcm9jZXNzb3IgIT0gTlVMTCkKKwkJc3RhdHVzID0gcHJvY19nZXRfZGV2X29iamVjdChocHJvY2Vzc29yLCAmaGRldl9vYmopOworCWVsc2UKKwkJaGRldl9vYmogPSBkZXZfZ2V0X2ZpcnN0KCk7CS8qIGRlZmF1bHQgKi8KKworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZXZfZ2V0X2NtbV9tZ3IoaGRldl9vYmosIHBoX2NtbV9tZ3IpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjbW1fZ2V0X2luZm8gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgbWVtb3J5IHV0aWxpemF0aW9uIGluZm9ybWF0aW9uLgorICovCitpbnQgY21tX2dldF9pbmZvKHN0cnVjdCBjbW1fb2JqZWN0ICpoY21tX21nciwKKwkJCXN0cnVjdCBjbW1faW5mbyAqY21tX2luZm9fb2JqKQoreworCXN0cnVjdCBjbW1fb2JqZWN0ICpjbW1fbWdyX29iaiA9IChzdHJ1Y3QgY21tX29iamVjdCAqKWhjbW1fbWdyOworCXUzMiB1bF9zZWc7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGNtbV9hbGxvY2F0b3IgKmFsdHI7CisJc3RydWN0IGNtbV9tbm9kZSAqbW5vZGVfb2JqID0gTlVMTDsKKworCURCQ19SRVFVSVJFKGNtbV9pbmZvX29iaiAhPSBOVUxMKTsKKworCWlmICghaGNtbV9tZ3IpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJbXV0ZXhfbG9jaygmY21tX21ncl9vYmotPmNtbV9sb2NrKTsKKwljbW1faW5mb19vYmotPnVsX251bV9ncHBzbV9zZWdzID0gMDsJLyogIyBvZiBTTSBzZWdtZW50cyAqLworCS8qIFRvdGFsICMgb2Ygb3V0c3RhbmRpbmcgYWxsb2MgKi8KKwljbW1faW5mb19vYmotPnVsX3RvdGFsX2luX3VzZV9jbnQgPSAwOworCS8qIG1pbiBibG9jayBzaXplICovCisJY21tX2luZm9fb2JqLT51bF9taW5fYmxvY2tfc2l6ZSA9IGNtbV9tZ3Jfb2JqLT51bF9taW5fYmxvY2tfc2l6ZTsKKwkvKiBjaGVjayBTTSBtZW1vcnkgc2VnbWVudHMgKi8KKwlmb3IgKHVsX3NlZyA9IDE7IHVsX3NlZyA8PSBDTU1fTUFYR1BQU0VHUzsgdWxfc2VnKyspIHsKKwkJLyogZ2V0IHRoZSBhbGxvY2F0b3Igb2JqZWN0IGZvciB0aGlzIHNlZ21lbnQgaWQgKi8KKwkJYWx0ciA9IGdldF9hbGxvY2F0b3IoY21tX21ncl9vYmosIHVsX3NlZyk7CisJCWlmIChhbHRyICE9IE5VTEwpIHsKKwkJCWNtbV9pbmZvX29iai0+dWxfbnVtX2dwcHNtX3NlZ3MrKzsKKwkJCWNtbV9pbmZvX29iai0+c2VnX2luZm9bdWxfc2VnIC0gMV0uZHdfc2VnX2Jhc2VfcGEgPQorCQkJICAgIGFsdHItPnNobV9iYXNlIC0gYWx0ci0+dWxfZHNwX3NpemU7CisJCQljbW1faW5mb19vYmotPnNlZ19pbmZvW3VsX3NlZyAtIDFdLnVsX3RvdGFsX3NlZ19zaXplID0KKwkJCSAgICBhbHRyLT51bF9kc3Bfc2l6ZSArIGFsdHItPnVsX3NtX3NpemU7CisJCQljbW1faW5mb19vYmotPnNlZ19pbmZvW3VsX3NlZyAtIDFdLmR3X2dwcF9iYXNlX3BhID0KKwkJCSAgICBhbHRyLT5zaG1fYmFzZTsKKwkJCWNtbV9pbmZvX29iai0+c2VnX2luZm9bdWxfc2VnIC0gMV0udWxfZ3BwX3NpemUgPQorCQkJICAgIGFsdHItPnVsX3NtX3NpemU7CisJCQljbW1faW5mb19vYmotPnNlZ19pbmZvW3VsX3NlZyAtIDFdLmR3X2RzcF9iYXNlX3ZhID0KKwkJCSAgICBhbHRyLT5kd19kc3BfYmFzZTsKKwkJCWNtbV9pbmZvX29iai0+c2VnX2luZm9bdWxfc2VnIC0gMV0udWxfZHNwX3NpemUgPQorCQkJICAgIGFsdHItPnVsX2RzcF9zaXplOworCQkJY21tX2luZm9fb2JqLT5zZWdfaW5mb1t1bF9zZWcgLSAxXS5kd19zZWdfYmFzZV92YSA9CisJCQkgICAgYWx0ci0+ZHdfdm1fYmFzZSAtIGFsdHItPnVsX2RzcF9zaXplOworCQkJY21tX2luZm9fb2JqLT5zZWdfaW5mb1t1bF9zZWcgLSAxXS51bF9pbl91c2VfY250ID0gMDsKKwkJCW1ub2RlX29iaiA9IChzdHJ1Y3QgY21tX21ub2RlICopCisJCQkgICAgbHN0X2ZpcnN0KGFsdHItPmluX3VzZV9saXN0X2hlYWQpOworCQkJLyogQ291bnQgaW5Vc2UgYmxvY2tzICovCisJCQl3aGlsZSAobW5vZGVfb2JqKSB7CisJCQkJY21tX2luZm9fb2JqLT51bF90b3RhbF9pbl91c2VfY250Kys7CisJCQkJY21tX2luZm9fb2JqLT5zZWdfaW5mb1t1bF9zZWcgLQorCQkJCQkJICAgICAgIDFdLnVsX2luX3VzZV9jbnQrKzsKKwkJCQkvKiBuZXh0IG5vZGUuICovCisJCQkJbW5vZGVfb2JqID0gKHN0cnVjdCBjbW1fbW5vZGUgKikKKwkJCQkgICAgbHN0X25leHQoYWx0ci0+aW5fdXNlX2xpc3RfaGVhZCwKKwkJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKW1ub2RlX29iaik7CisJCQl9CisJCX0KKwl9CQkJLyogZW5kIGZvciAqLworCW11dGV4X3VubG9jaygmY21tX21ncl9vYmotPmNtbV9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGNtbV9pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZXMgcHJpdmF0ZSBzdGF0ZSBvZiBDTU0gbW9kdWxlLgorICovCitib29sIGNtbV9pbml0KHZvaWQpCit7CisJYm9vbCByZXQgPSB0cnVlOworCisJREJDX1JFUVVJUkUocmVmcyA+PSAwKTsKKwlpZiAocmV0KQorCQlyZWZzKys7CisKKwlEQkNfRU5TVVJFKChyZXQgJiYgKHJlZnMgPiAwKSkgfHwgKCFyZXQgJiYgKHJlZnMgPj0gMCkpKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY21tX3JlZ2lzdGVyX2dwcHNtX3NlZyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVyIGEgYmxvY2sgb2YgU00gd2l0aCB0aGUgQ01NIHRvIGJlIHVzZWQgZm9yIGxhdGVyIEdQUCBTTQorICogICAgICBhbGxvY2F0aW9ucy4KKyAqLworaW50IGNtbV9yZWdpc3Rlcl9ncHBzbV9zZWcoc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJCSAgdTMyIGR3X2dwcF9iYXNlX3BhLCB1MzIgdWxfc2l6ZSwKKwkJCQkgIHUzMiBkc3BfYWRkcl9vZmZzZXQsIHM4IGNfZmFjdG9yLAorCQkJCSAgdTMyIGR3X2RzcF9iYXNlLCB1MzIgdWxfZHNwX3NpemUsCisJCQkJICB1MzIgKnNnbXRfaWQsIHUzMiBncHBfYmFzZV92YSkKK3sKKwlzdHJ1Y3QgY21tX29iamVjdCAqY21tX21ncl9vYmogPSAoc3RydWN0IGNtbV9vYmplY3QgKiloY21tX21ncjsKKwlzdHJ1Y3QgY21tX2FsbG9jYXRvciAqcHNtYSA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGNtbV9tbm9kZSAqbmV3X25vZGU7CisJczMyIHNsb3Rfc2VnOworCisJREJDX1JFUVVJUkUodWxfc2l6ZSA+IDApOworCURCQ19SRVFVSVJFKHNnbXRfaWQgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoZHdfZ3BwX2Jhc2VfcGEgIT0gMCk7CisJREJDX1JFUVVJUkUoZ3BwX2Jhc2VfdmEgIT0gMCk7CisJREJDX1JFUVVJUkUoKGNfZmFjdG9yIDw9IENNTV9BRERUT0RTUFBBKSAmJgorCQkgICAgKGNfZmFjdG9yID49IENNTV9TVUJGUk9NRFNQUEEpKTsKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBkd19ncHBfYmFzZV9wYSAleCB1bF9zaXplICV4IGRzcF9hZGRyX29mZnNldCAleCAiCisJCSJkd19kc3BfYmFzZSAleCB1bF9kc3Bfc2l6ZSAleCBncHBfYmFzZV92YSAleFxuIiwgX19mdW5jX18sCisJCWR3X2dwcF9iYXNlX3BhLCB1bF9zaXplLCBkc3BfYWRkcl9vZmZzZXQsIGR3X2RzcF9iYXNlLAorCQl1bF9kc3Bfc2l6ZSwgZ3BwX2Jhc2VfdmEpOworCWlmICghaGNtbV9tZ3IpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogbWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgYW5vdGhlciBhbGxvY2F0b3IgKi8KKwltdXRleF9sb2NrKCZjbW1fbWdyX29iai0+Y21tX2xvY2spOworCXNsb3Rfc2VnID0gZ2V0X3Nsb3QoY21tX21ncl9vYmopOworCWlmIChzbG90X3NlZyA8IDApIHsKKwkJLyogZ2V0IGEgc2xvdCBudW1iZXIgKi8KKwkJc3RhdHVzID0gLUVQRVJNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkvKiBDaGVjayBpZiBpbnB1dCB1bF9zaXplIGlzIGJpZyBlbm91Z2ggdG8gYWxsb2MgYXQgbGVhc3Qgb25lIGJsb2NrICovCisJaWYgKHVsX3NpemUgPCBjbW1fbWdyX29iai0+dWxfbWluX2Jsb2NrX3NpemUpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwkvKiBjcmVhdGUsIHplcm8sIGFuZCB0YWcgYW4gU00gYWxsb2NhdG9yIG9iamVjdCAqLworCXBzbWEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21tX2FsbG9jYXRvciksIEdGUF9LRVJORUwpOworCWlmIChwc21hICE9IE5VTEwpIHsKKwkJcHNtYS0+aGNtbV9tZ3IgPSBoY21tX21ncjsJLyogcmVmIHRvIHBhcmVudCAqLworCQlwc21hLT5zaG1fYmFzZSA9IGR3X2dwcF9iYXNlX3BhOwkvKiBTTSBCYXNlIHBoeXMgKi8KKwkJcHNtYS0+dWxfc21fc2l6ZSA9IHVsX3NpemU7CS8qIFNNIHNlZ21lbnQgc2l6ZSBpbiBieXRlcyAqLworCQlwc21hLT5kd192bV9iYXNlID0gZ3BwX2Jhc2VfdmE7CisJCXBzbWEtPmR3X2RzcF9waHlzX2FkZHJfb2Zmc2V0ID0gZHNwX2FkZHJfb2Zmc2V0OworCQlwc21hLT5jX2ZhY3RvciA9IGNfZmFjdG9yOworCQlwc21hLT5kd19kc3BfYmFzZSA9IGR3X2RzcF9iYXNlOworCQlwc21hLT51bF9kc3Bfc2l6ZSA9IHVsX2RzcF9zaXplOworCQlpZiAocHNtYS0+ZHdfdm1fYmFzZSA9PSAwKSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJCS8qIHJldHVybiB0aGUgYWN0dWFsIHNlZ21lbnQgaWRlbnRpZmllciAqLworCQkqc2dtdF9pZCA9ICh1MzIpIHNsb3Rfc2VnICsgMTsKKwkJLyogY3JlYXRlIG1lbW9yeSBmcmVlIGxpc3QgKi8KKwkJcHNtYS0+ZnJlZV9saXN0X2hlYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHN0X2xpc3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAocHNtYS0+ZnJlZV9saXN0X2hlYWQgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZnVuY19lbmQ7CisJCX0KKwkJSU5JVF9MSVNUX0hFQUQoJnBzbWEtPmZyZWVfbGlzdF9oZWFkLT5oZWFkKTsKKworCQkvKiBjcmVhdGUgbWVtb3J5IGluLXVzZSBsaXN0ICovCisJCXBzbWEtPmluX3VzZV9saXN0X2hlYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QKKwkJCQkJCWxzdF9saXN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwc21hLT5pbl91c2VfbGlzdF9oZWFkID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJCUlOSVRfTElTVF9IRUFEKCZwc21hLT5pbl91c2VfbGlzdF9oZWFkLT5oZWFkKTsKKworCQkvKiBHZXQgYSBtZW0gbm9kZSBmb3IgdGhpcyBodW5rLW8tbWVtb3J5ICovCisJCW5ld19ub2RlID0gZ2V0X25vZGUoY21tX21ncl9vYmosIGR3X2dwcF9iYXNlX3BhLAorCQkJCSAgICBwc21hLT5kd192bV9iYXNlLCB1bF9zaXplKTsKKwkJLyogUGxhY2Ugbm9kZSBvbiB0aGUgU00gYWxsb2NhdG9yJ3MgZnJlZSBsaXN0ICovCisJCWlmIChuZXdfbm9kZSkgeworCQkJbHN0X3B1dF90YWlsKHBzbWEtPmZyZWVfbGlzdF9oZWFkLAorCQkJCSAgICAgKHN0cnVjdCBsaXN0X2hlYWQgKiluZXdfbm9kZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCS8qIG1ha2UgZW50cnkgKi8KKwljbW1fbWdyX29iai0+cGFfZ3Bwc21fc2VnX3RhYltzbG90X3NlZ10gPSBwc21hOworCitmdW5jX2VuZDoKKwlpZiAoc3RhdHVzICYmIHBzbWEpIHsKKwkJLyogQ2xlYW51cCBhbGxvY2F0b3IgKi8KKwkJdW5fcmVnaXN0ZXJfZ3Bwc21fc2VnKHBzbWEpOworCX0KKworCW11dGV4X3VubG9jaygmY21tX21ncl9vYmotPmNtbV9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGNtbV91bl9yZWdpc3Rlcl9ncHBzbV9zZWcgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBVblJlZ2lzdGVyIEdQUCBTTSBzZWdtZW50cyB3aXRoIHRoZSBDTU0uCisgKi8KK2ludCBjbW1fdW5fcmVnaXN0ZXJfZ3Bwc21fc2VnKHN0cnVjdCBjbW1fb2JqZWN0ICpoY21tX21nciwKKwkJCQkgICAgIHUzMiB1bF9zZWdfaWQpCit7CisJc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqID0gKHN0cnVjdCBjbW1fb2JqZWN0ICopaGNtbV9tZ3I7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGNtbV9hbGxvY2F0b3IgKnBzbWE7CisJdTMyIHVsX2lkID0gdWxfc2VnX2lkOworCisJREJDX1JFUVVJUkUodWxfc2VnX2lkID4gMCk7CisJaWYgKGhjbW1fbWdyKSB7CisJCWlmICh1bF9zZWdfaWQgPT0gQ01NX0FMTFNFR01FTlRTKQorCQkJdWxfaWQgPSAxOworCisJCWlmICgodWxfaWQgPiAwKSAmJiAodWxfaWQgPD0gQ01NX01BWEdQUFNFR1MpKSB7CisJCQl3aGlsZSAodWxfaWQgPD0gQ01NX01BWEdQUFNFR1MpIHsKKwkJCQltdXRleF9sb2NrKCZjbW1fbWdyX29iai0+Y21tX2xvY2spOworCQkJCS8qIHNsb3QgPSBzZWdfaWQtMSAqLworCQkJCXBzbWEgPSBjbW1fbWdyX29iai0+cGFfZ3Bwc21fc2VnX3RhYlt1bF9pZCAtIDFdOworCQkJCWlmIChwc21hICE9IE5VTEwpIHsKKwkJCQkJdW5fcmVnaXN0ZXJfZ3Bwc21fc2VnKHBzbWEpOworCQkJCQkvKiBTZXQgYWxjdHIgcHRyIHRvIE5VTEwgZm9yIGZ1dHVyZQorCQkJCQkgKiByZXVzZSAqLworCQkJCQljbW1fbWdyX29iai0+cGFfZ3Bwc21fc2VnX3RhYlt1bF9pZCAtCisJCQkJCQkJCSAgICAgIDFdID0gTlVMTDsKKwkJCQl9IGVsc2UgaWYgKHVsX3NlZ19pZCAhPSBDTU1fQUxMU0VHTUVOVFMpIHsKKwkJCQkJc3RhdHVzID0gLUVQRVJNOworCQkJCX0KKwkJCQltdXRleF91bmxvY2soJmNtbV9tZ3Jfb2JqLT5jbW1fbG9jayk7CisJCQkJaWYgKHVsX3NlZ19pZCAhPSBDTU1fQUxMU0VHTUVOVFMpCisJCQkJCWJyZWFrOworCisJCQkJdWxfaWQrKzsKKwkJCX0JLyogZW5kIHdoaWxlICovCisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSB1bl9yZWdpc3Rlcl9ncHBzbV9zZWcgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBVblJlZ2lzdGVyIHRoZSBTTSBhbGxvY2F0b3IgYnkgZnJlZWluZyBhbGwgaXRzIHJlc291cmNlcyBhbmQKKyAqICAgICAgbnVsbGluZyBjbW0gbWdyIHRhYmxlIGVudHJ5LgorICogIE5vdGU6CisgKiAgICAgIFRoaXMgcm91dGluZSBpcyBhbHdheXMgY2FsbGVkIHdpdGhpbiBjbW0gbG9jayBjcml0IHNlY3QuCisgKi8KK3N0YXRpYyB2b2lkIHVuX3JlZ2lzdGVyX2dwcHNtX3NlZyhzdHJ1Y3QgY21tX2FsbG9jYXRvciAqcHNtYSkKK3sKKwlzdHJ1Y3QgY21tX21ub2RlICptbm9kZV9vYmogPSBOVUxMOworCXN0cnVjdCBjbW1fbW5vZGUgKm5leHRfbm9kZSA9IE5VTEw7CisKKwlEQkNfUkVRVUlSRShwc21hICE9IE5VTEwpOworCWlmIChwc21hLT5mcmVlX2xpc3RfaGVhZCAhPSBOVUxMKSB7CisJCS8qIGZyZWUgbm9kZXMgb24gZnJlZSBsaXN0ICovCisJCW1ub2RlX29iaiA9IChzdHJ1Y3QgY21tX21ub2RlICopbHN0X2ZpcnN0KHBzbWEtPmZyZWVfbGlzdF9oZWFkKTsKKwkJd2hpbGUgKG1ub2RlX29iaikgeworCQkJbmV4dF9ub2RlID0KKwkJCSAgICAoc3RydWN0IGNtbV9tbm9kZSAqKWxzdF9uZXh0KHBzbWEtPmZyZWVfbGlzdF9oZWFkLAorCQkJCQkJCSAoc3RydWN0IGxpc3RfaGVhZCAqKQorCQkJCQkJCSBtbm9kZV9vYmopOworCQkJbHN0X3JlbW92ZV9lbGVtKHBzbWEtPmZyZWVfbGlzdF9oZWFkLAorCQkJCQkoc3RydWN0IGxpc3RfaGVhZCAqKW1ub2RlX29iaik7CisJCQlrZnJlZSgodm9pZCAqKW1ub2RlX29iaik7CisJCQkvKiBuZXh0IG5vZGUuICovCisJCQltbm9kZV9vYmogPSBuZXh0X25vZGU7CisJCX0KKwkJa2ZyZWUocHNtYS0+ZnJlZV9saXN0X2hlYWQpOwkvKiBkZWxldGUgZnJlZWxpc3QgKi8KKwkJLyogZnJlZSBub2RlcyBvbiBJblVzZSBsaXN0ICovCisJCW1ub2RlX29iaiA9CisJCSAgICAoc3RydWN0IGNtbV9tbm9kZSAqKWxzdF9maXJzdChwc21hLT5pbl91c2VfbGlzdF9oZWFkKTsKKwkJd2hpbGUgKG1ub2RlX29iaikgeworCQkJbmV4dF9ub2RlID0KKwkJCSAgICAoc3RydWN0IGNtbV9tbm9kZSAqKWxzdF9uZXh0KHBzbWEtPmluX3VzZV9saXN0X2hlYWQsCisJCQkJCQkJIChzdHJ1Y3QgbGlzdF9oZWFkICopCisJCQkJCQkJIG1ub2RlX29iaik7CisJCQlsc3RfcmVtb3ZlX2VsZW0ocHNtYS0+aW5fdXNlX2xpc3RfaGVhZCwKKwkJCQkJKHN0cnVjdCBsaXN0X2hlYWQgKiltbm9kZV9vYmopOworCQkJa2ZyZWUoKHZvaWQgKiltbm9kZV9vYmopOworCQkJLyogbmV4dCBub2RlLiAqLworCQkJbW5vZGVfb2JqID0gbmV4dF9ub2RlOworCQl9CisJCWtmcmVlKHBzbWEtPmluX3VzZV9saXN0X2hlYWQpOwkvKiBkZWxldGUgSW5Vc2UgbGlzdCAqLworCX0KKwlpZiAoKHZvaWQgKilwc21hLT5kd192bV9iYXNlICE9IE5VTEwpCisJCU1FTV9VTk1BUF9MSU5FQVJfQUREUkVTUygodm9pZCAqKXBzbWEtPmR3X3ZtX2Jhc2UpOworCisJLyogRnJlZSBhbGxvY2F0b3IgaXRzZWxmICovCisJa2ZyZWUocHNtYSk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X3Nsb3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBbiBhdmFpbGFibGUgc2xvdCAjIGlzIHJldHVybmVkLiBSZXR1cm5zIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzMzIgZ2V0X3Nsb3Qoc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqKQoreworCXMzMiBzbG90X3NlZyA9IC0xOwkvKiBuZWcgb24gZmFpbHVyZSAqLworCURCQ19SRVFVSVJFKGNtbV9tZ3Jfb2JqICE9IE5VTEwpOworCS8qIGdldCBmaXJzdCBhdmFpbGFibGUgc2xvdCBpbiBjbW0gbWdyIFNNU2VnVGFiW10gKi8KKwlmb3IgKHNsb3Rfc2VnID0gMDsgc2xvdF9zZWcgPCBDTU1fTUFYR1BQU0VHUzsgc2xvdF9zZWcrKykgeworCQlpZiAoY21tX21ncl9vYmotPnBhX2dwcHNtX3NlZ190YWJbc2xvdF9zZWddID09IE5VTEwpCisJCQlicmVhazsKKworCX0KKwlpZiAoc2xvdF9zZWcgPT0gQ01NX01BWEdQUFNFR1MpCisJCXNsb3Rfc2VnID0gLTE7CS8qIGZhaWxlZCAqLworCisJcmV0dXJuIHNsb3Rfc2VnOworfQorCisvKgorICogID09PT09PT09IGdldF9ub2RlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IGEgbWVtb3J5IG5vZGUgZnJvbSBmcmVlbGlzdCBvciBjcmVhdGUgYSBuZXcgb25lLgorICovCitzdGF0aWMgc3RydWN0IGNtbV9tbm9kZSAqZ2V0X25vZGUoc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqLCB1MzIgZHdfcGEsCisJCQkJICB1MzIgZHdfdmEsIHUzMiB1bF9zaXplKQoreworCXN0cnVjdCBjbW1fbW5vZGUgKnBub2RlID0gTlVMTDsKKworCURCQ19SRVFVSVJFKGNtbV9tZ3Jfb2JqICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGR3X3BhICE9IDApOworCURCQ19SRVFVSVJFKGR3X3ZhICE9IDApOworCURCQ19SRVFVSVJFKHVsX3NpemUgIT0gMCk7CisJLyogQ2hlY2sgY21tIG1ncidzIG5vZGUgZnJlZWxpc3QgKi8KKwlpZiAoTFNUX0lTX0VNUFRZKGNtbV9tZ3Jfb2JqLT5ub2RlX2ZyZWVfbGlzdF9oZWFkKSkgeworCQlwbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbW1fbW5vZGUpLCBHRlBfS0VSTkVMKTsKKwl9IGVsc2UgeworCQkvKiBzdXJlbHkgYSB2YWxpZCBlbGVtZW50ICovCisJCXBub2RlID0gKHN0cnVjdCBjbW1fbW5vZGUgKikKKwkJICAgIGxzdF9nZXRfaGVhZChjbW1fbWdyX29iai0+bm9kZV9mcmVlX2xpc3RfaGVhZCk7CisJfQorCWlmIChwbm9kZSkgeworCQlsc3RfaW5pdF9lbGVtKChzdHJ1Y3QgbGlzdF9oZWFkICopcG5vZGUpOwkvKiBzZXQgc2VsZiAqLworCQlwbm9kZS0+ZHdfcGEgPSBkd19wYTsJLyogUGh5c2ljYWwgYWRkciBvZiBzdGFydCBvZiBibG9jayAqLworCQlwbm9kZS0+ZHdfdmEgPSBkd192YTsJLyogVmlydHVhbCAgICIgICAgICAgICAgICAiICovCisJCXBub2RlLT51bF9zaXplID0gdWxfc2l6ZTsJLyogU2l6ZSBvZiBibG9jayAqLworCX0KKwlyZXR1cm4gcG5vZGU7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGVsZXRlX25vZGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBQdXQgYSBtZW1vcnkgbm9kZSBvbiB0aGUgY21tIG5vZGVsaXN0IGZvciBsYXRlciB1c2UuCisgKiAgICAgIERvZXNuJ3QgYWN0dWFsbHkgZGVsZXRlIHRoZSBub2RlLiBIZWFwIHRocmFzaGluZyBmcmllbmRseS4KKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX25vZGUoc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqLCBzdHJ1Y3QgY21tX21ub2RlICpwbm9kZSkKK3sKKwlEQkNfUkVRVUlSRShwbm9kZSAhPSBOVUxMKTsKKwlsc3RfaW5pdF9lbGVtKChzdHJ1Y3QgbGlzdF9oZWFkICopcG5vZGUpOwkvKiBpbml0IC5zZWxmIHB0ciAqLworCWxzdF9wdXRfdGFpbChjbW1fbWdyX29iai0+bm9kZV9mcmVlX2xpc3RfaGVhZCwKKwkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKXBub2RlKTsKK30KKworLyoKKyAqID09PT09PSBnZXRfZnJlZV9ibG9jayA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNjYW4gdGhlIGZyZWUgYmxvY2sgbGlzdCBhbmQgcmV0dXJuIHRoZSBmaXJzdCBibG9jayB0aGF0IHNhdGlzZmllcworICogICAgICB0aGUgc2l6ZS4KKyAqLworc3RhdGljIHN0cnVjdCBjbW1fbW5vZGUgKmdldF9mcmVlX2Jsb2NrKHN0cnVjdCBjbW1fYWxsb2NhdG9yICphbGxvY2F0b3IsCisJCQkJCXUzMiB1c2l6ZSkKK3sKKwlpZiAoYWxsb2NhdG9yKSB7CisJCXN0cnVjdCBjbW1fbW5vZGUgKm1ub2RlX29iaiA9IChzdHJ1Y3QgY21tX21ub2RlICopCisJCSAgICBsc3RfZmlyc3QoYWxsb2NhdG9yLT5mcmVlX2xpc3RfaGVhZCk7CisJCXdoaWxlIChtbm9kZV9vYmopIHsKKwkJCWlmICh1c2l6ZSA8PSAodTMyKSBtbm9kZV9vYmotPnVsX3NpemUpIHsKKwkJCQlsc3RfcmVtb3ZlX2VsZW0oYWxsb2NhdG9yLT5mcmVlX2xpc3RfaGVhZCwKKwkJCQkJCShzdHJ1Y3QgbGlzdF9oZWFkICopbW5vZGVfb2JqKTsKKwkJCQlyZXR1cm4gbW5vZGVfb2JqOworCQkJfQorCQkJLyogbmV4dCBub2RlLiAqLworCQkJbW5vZGVfb2JqID0gKHN0cnVjdCBjbW1fbW5vZGUgKikKKwkJCSAgICBsc3RfbmV4dChhbGxvY2F0b3ItPmZyZWVfbGlzdF9oZWFkLAorCQkJCSAgICAgKHN0cnVjdCBsaXN0X2hlYWQgKiltbm9kZV9vYmopOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogID09PT09PT09IGFkZF90b19mcmVlX2xpc3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDb2VsZXNjZSBub2RlIGludG8gdGhlIGZyZWVsaXN0IGluIGFzY2VuZGluZyBzaXplIG9yZGVyLgorICovCitzdGF0aWMgdm9pZCBhZGRfdG9fZnJlZV9saXN0KHN0cnVjdCBjbW1fYWxsb2NhdG9yICphbGxvY2F0b3IsCisJCQkgICAgIHN0cnVjdCBjbW1fbW5vZGUgKnBub2RlKQoreworCXN0cnVjdCBjbW1fbW5vZGUgKm5vZGVfcHJldiA9IE5VTEw7CisJc3RydWN0IGNtbV9tbm9kZSAqbm9kZV9uZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgY21tX21ub2RlICptbm9kZV9vYmo7CisJdTMyIGR3X3RoaXNfcGE7CisJdTMyIGR3X25leHRfcGE7CisKKwlEQkNfUkVRVUlSRShwbm9kZSAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShhbGxvY2F0b3IgIT0gTlVMTCk7CisJZHdfdGhpc19wYSA9IHBub2RlLT5kd19wYTsKKwlkd19uZXh0X3BhID0gTkVYVF9QQShwbm9kZSk7CisJbW5vZGVfb2JqID0gKHN0cnVjdCBjbW1fbW5vZGUgKilsc3RfZmlyc3QoYWxsb2NhdG9yLT5mcmVlX2xpc3RfaGVhZCk7CisJd2hpbGUgKG1ub2RlX29iaikgeworCQlpZiAoZHdfdGhpc19wYSA9PSBORVhUX1BBKG1ub2RlX29iaikpIHsKKwkJCS8qIGZvdW5kIHRoZSBibG9jayBhaGVhZCBvZiB0aGlzIG9uZSAqLworCQkJbm9kZV9wcmV2ID0gbW5vZGVfb2JqOworCQl9IGVsc2UgaWYgKGR3X25leHRfcGEgPT0gbW5vZGVfb2JqLT5kd19wYSkgeworCQkJbm9kZV9uZXh0ID0gbW5vZGVfb2JqOworCQl9CisJCWlmICgobm9kZV9wcmV2ID09IE5VTEwpIHx8IChub2RlX25leHQgPT0gTlVMTCkpIHsKKwkJCS8qIG5leHQgbm9kZS4gKi8KKwkJCW1ub2RlX29iaiA9IChzdHJ1Y3QgY21tX21ub2RlICopCisJCQkgICAgbHN0X25leHQoYWxsb2NhdG9yLT5mcmVlX2xpc3RfaGVhZCwKKwkJCQkgICAgIChzdHJ1Y3QgbGlzdF9oZWFkICopbW5vZGVfb2JqKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGdvdCAnZW0gKi8KKwkJCWJyZWFrOworCQl9CisJfQkJCS8qIHdoaWxlICovCisJaWYgKG5vZGVfcHJldiAhPSBOVUxMKSB7CisJCS8qIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBibG9jayAqLworCQlsc3RfcmVtb3ZlX2VsZW0oYWxsb2NhdG9yLT5mcmVlX2xpc3RfaGVhZCwKKwkJCQkoc3RydWN0IGxpc3RfaGVhZCAqKW5vZGVfcHJldik7CisJCS8qIGdyb3cgbm9kZSB0byBob2xkIGJvdGggKi8KKwkJcG5vZGUtPnVsX3NpemUgKz0gbm9kZV9wcmV2LT51bF9zaXplOworCQlwbm9kZS0+ZHdfcGEgPSBub2RlX3ByZXYtPmR3X3BhOworCQlwbm9kZS0+ZHdfdmEgPSBub2RlX3ByZXYtPmR3X3ZhOworCQkvKiBwbGFjZSBub2RlIG9uIG1nciBub2RlRnJlZUxpc3QgKi8KKwkJZGVsZXRlX25vZGUoKHN0cnVjdCBjbW1fb2JqZWN0ICopYWxsb2NhdG9yLT5oY21tX21nciwKKwkJCSAgICBub2RlX3ByZXYpOworCX0KKwlpZiAobm9kZV9uZXh0ICE9IE5VTEwpIHsKKwkJLyogY29tYmluZSB3aXRoIG5leHQgYmxvY2sgKi8KKwkJbHN0X3JlbW92ZV9lbGVtKGFsbG9jYXRvci0+ZnJlZV9saXN0X2hlYWQsCisJCQkJKHN0cnVjdCBsaXN0X2hlYWQgKilub2RlX25leHQpOworCQkvKiBncm93IGRhIG5vZGUgKi8KKwkJcG5vZGUtPnVsX3NpemUgKz0gbm9kZV9uZXh0LT51bF9zaXplOworCQkvKiBwbGFjZSBub2RlIG9uIG1nciBub2RlRnJlZUxpc3QgKi8KKwkJZGVsZXRlX25vZGUoKHN0cnVjdCBjbW1fb2JqZWN0ICopYWxsb2NhdG9yLT5oY21tX21nciwKKwkJCSAgICBub2RlX25leHQpOworCX0KKwkvKiBOb3csIGxldCdzIGFkZCB0byBmcmVlbGlzdCBpbiBpbmNyZWFzaW5nIHNpemUgb3JkZXIgKi8KKwltbm9kZV9vYmogPSAoc3RydWN0IGNtbV9tbm9kZSAqKWxzdF9maXJzdChhbGxvY2F0b3ItPmZyZWVfbGlzdF9oZWFkKTsKKwl3aGlsZSAobW5vZGVfb2JqKSB7CisJCWlmIChwbm9kZS0+dWxfc2l6ZSA8PSBtbm9kZV9vYmotPnVsX3NpemUpCisJCQlicmVhazsKKworCQkvKiBuZXh0IG5vZGUuICovCisJCW1ub2RlX29iaiA9CisJCSAgICAoc3RydWN0IGNtbV9tbm9kZSAqKWxzdF9uZXh0KGFsbG9jYXRvci0+ZnJlZV9saXN0X2hlYWQsCisJCQkJCQkgKHN0cnVjdCBsaXN0X2hlYWQgKiltbm9kZV9vYmopOworCX0KKwkvKiBpZiBtbm9kZV9vYmogaXMgTlVMTCB0aGVuIGFkZCBvdXIgcG5vZGUgdG8gdGhlIGVuZCBvZiB0aGUgZnJlZWxpc3QgKi8KKwlpZiAobW5vZGVfb2JqID09IE5VTEwpIHsKKwkJbHN0X3B1dF90YWlsKGFsbG9jYXRvci0+ZnJlZV9saXN0X2hlYWQsCisJCQkgICAgIChzdHJ1Y3QgbGlzdF9oZWFkICopcG5vZGUpOworCX0gZWxzZSB7CisJCS8qIGluc2VydCBvdXIgbm9kZSBiZWZvcmUgdGhlIGN1cnJlbnQgdHJhdmVyc2VkIG5vZGUgKi8KKwkJbHN0X2luc2VydF9iZWZvcmUoYWxsb2NhdG9yLT5mcmVlX2xpc3RfaGVhZCwKKwkJCQkgIChzdHJ1Y3QgbGlzdF9oZWFkICopcG5vZGUsCisJCQkJICAoc3RydWN0IGxpc3RfaGVhZCAqKW1ub2RlX29iaik7CisJfQorfQorCisvKgorICogPT09PT09PT0gZ2V0X2FsbG9jYXRvciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybiB0aGUgYWxsb2NhdG9yIGZvciB0aGUgZ2l2ZW4gU00gU2VnaWQuCisgKiAgICAgIFNlZ0lkczogIDEsMiwzLi5tYXguCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY21tX2FsbG9jYXRvciAqZ2V0X2FsbG9jYXRvcihzdHJ1Y3QgY21tX29iamVjdCAqY21tX21ncl9vYmosCisJCQkJCSAgIHUzMiB1bF9zZWdfaWQpCit7CisJc3RydWN0IGNtbV9hbGxvY2F0b3IgKmFsbG9jYXRvciA9IE5VTEw7CisKKwlEQkNfUkVRVUlSRShjbW1fbWdyX29iaiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRSgodWxfc2VnX2lkID4gMCkgJiYgKHVsX3NlZ19pZCA8PSBDTU1fTUFYR1BQU0VHUykpOworCWFsbG9jYXRvciA9IGNtbV9tZ3Jfb2JqLT5wYV9ncHBzbV9zZWdfdGFiW3VsX3NlZ19pZCAtIDFdOworCWlmIChhbGxvY2F0b3IgIT0gTlVMTCkgeworCQkvKiBtYWtlIHN1cmUgaXQncyBmb3IgcmVhbCAqLworCQlpZiAoIWFsbG9jYXRvcikgeworCQkJYWxsb2NhdG9yID0gTlVMTDsKKwkJCURCQ19BU1NFUlQoZmFsc2UpOworCQl9CisJfQorCXJldHVybiBhbGxvY2F0b3I7Cit9CisKKy8qCisgKiAgVGhlIENNTV9YbGF0b3JbeHh4XSByb3V0aW5lcyBiZWxvdyBhcmUgdXNlZCBieSBOb2RlIGFuZCBTdHJlYW0KKyAqICB0byBwZXJmb3JtIFNNIGFkZHJlc3MgdHJhbnNsYXRpb24gdG8gdGhlIGNsaWVudCBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuCisgKiAgQSAidHJhbnNsYXRvciIgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYSBub2RlL3N0cmVhbSBmb3IgZWFjaCBTTSBzZWcgdXNlZC4KKyAqLworCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGFuIGFkZHJlc3MgdHJhbnNsYXRvciBvYmplY3QuCisgKi8KK2ludCBjbW1feGxhdG9yX2NyZWF0ZShzdHJ1Y3QgY21tX3hsYXRvcm9iamVjdCAqKnhsYXRvciwKKwkJCSAgICAgc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyLAorCQkJICAgICBzdHJ1Y3QgY21tX3hsYXRvcmF0dHJzICp4bGF0b3JfYXR0cnMpCit7CisJc3RydWN0IGNtbV94bGF0b3IgKnhsYXRvcl9vYmplY3QgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHhsYXRvciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShoY21tX21nciAhPSBOVUxMKTsKKworCSp4bGF0b3IgPSBOVUxMOworCWlmICh4bGF0b3JfYXR0cnMgPT0gTlVMTCkKKwkJeGxhdG9yX2F0dHJzID0gJmNtbV9kZmx0eGxhdG9yYXR0cnM7CS8qIHNldCBkZWZhdWx0cyAqLworCisJeGxhdG9yX29iamVjdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbW1feGxhdG9yKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHhsYXRvcl9vYmplY3QgIT0gTlVMTCkgeworCQl4bGF0b3Jfb2JqZWN0LT5oY21tX21nciA9IGhjbW1fbWdyOwkvKiByZWYgYmFjayB0byBDTU0gKi8KKwkJLyogU00gc2VnX2lkICovCisJCXhsYXRvcl9vYmplY3QtPnVsX3NlZ19pZCA9IHhsYXRvcl9hdHRycy0+dWxfc2VnX2lkOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCWlmICghc3RhdHVzKQorCQkqeGxhdG9yID0gKHN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICopeGxhdG9yX29iamVjdDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY21tX3hsYXRvcl9kZWxldGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGcmVlIHRoZSBYbGF0b3IgcmVzb3VyY2VzLgorICogICAgICBWTSBnZXRzIGZyZWVkIGxhdGVyLgorICovCitpbnQgY21tX3hsYXRvcl9kZWxldGUoc3RydWN0IGNtbV94bGF0b3JvYmplY3QgKnhsYXRvciwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3QgY21tX3hsYXRvciAqeGxhdG9yX29iaiA9IChzdHJ1Y3QgY21tX3hsYXRvciAqKXhsYXRvcjsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWtmcmVlKHhsYXRvcl9vYmopOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY21tX3hsYXRvcl9hbGxvY19idWYgPT09PT09PT0KKyAqLwordm9pZCAqY21tX3hsYXRvcl9hbGxvY19idWYoc3RydWN0IGNtbV94bGF0b3JvYmplY3QgKnhsYXRvciwgdm9pZCAqdmFfYnVmLAorCQkJICAgdTMyIHBhX3NpemUpCit7CisJc3RydWN0IGNtbV94bGF0b3IgKnhsYXRvcl9vYmogPSAoc3RydWN0IGNtbV94bGF0b3IgKil4bGF0b3I7CisJdm9pZCAqcGJ1ZiA9IE5VTEw7CisJdm9pZCAqdG1wX3ZhX2J1ZmY7CisJc3RydWN0IGNtbV9hdHRycyBhdHRyczsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRSh4bGF0b3IgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoeGxhdG9yX29iai0+aGNtbV9tZ3IgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUodmFfYnVmICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHBhX3NpemUgPiAwKTsKKwlEQkNfUkVRVUlSRSh4bGF0b3Jfb2JqLT51bF9zZWdfaWQgPiAwKTsKKworCWlmICh4bGF0b3Jfb2JqKSB7CisJCWF0dHJzLnVsX3NlZ19pZCA9IHhsYXRvcl9vYmotPnVsX3NlZ19pZDsKKwkJX19yYXdfd3JpdGVsKDAsIHZhX2J1Zik7CisJCS8qIEFsbG9jIFNNICovCisJCXBidWYgPQorCQkgICAgY21tX2NhbGxvY19idWYoeGxhdG9yX29iai0+aGNtbV9tZ3IsIHBhX3NpemUsICZhdHRycywgTlVMTCk7CisJCWlmIChwYnVmKSB7CisJCQkvKiBjb252ZXJ0IHRvIHRyYW5zbGF0b3Iobm9kZS9zdHJtKSBwcm9jZXNzIFZpcnR1YWwKKwkJCSAqIGFkZHJlc3MgKi8KKwkJCSB0bXBfdmFfYnVmZiA9IGNtbV94bGF0b3JfdHJhbnNsYXRlKHhsYXRvciwKKwkJCQkJCQkgcGJ1ZiwgQ01NX1BBMlZBKTsKKwkJCV9fcmF3X3dyaXRlbCgodTMyKXRtcF92YV9idWZmLCB2YV9idWYpOworCQl9CisJfQorCXJldHVybiBwYnVmOworfQorCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfZnJlZV9idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGcmVlIHRoZSBnaXZlbiBTTSBidWZmZXIgYW5kIGRlc2NyaXB0b3IuCisgKiAgICAgIERvZXMgbm90IGZyZWUgdmlydHVhbCBtZW1vcnkuCisgKi8KK2ludCBjbW1feGxhdG9yX2ZyZWVfYnVmKHN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICp4bGF0b3IsIHZvaWQgKmJ1Zl92YSkKK3sKKwlzdHJ1Y3QgY21tX3hsYXRvciAqeGxhdG9yX29iaiA9IChzdHJ1Y3QgY21tX3hsYXRvciAqKXhsYXRvcjsKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworCXZvaWQgKmJ1Zl9wYSA9IE5VTEw7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoYnVmX3ZhICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHhsYXRvcl9vYmotPnVsX3NlZ19pZCA+IDApOworCisJaWYgKHhsYXRvcl9vYmopIHsKKwkJLyogY29udmVydCBWYSB0byBQYSBzbyB3ZSBjYW4gZnJlZSBpdC4gKi8KKwkJYnVmX3BhID0gY21tX3hsYXRvcl90cmFuc2xhdGUoeGxhdG9yLCBidWZfdmEsIENNTV9WQTJQQSk7CisJCWlmIChidWZfcGEpIHsKKwkJCXN0YXR1cyA9IGNtbV9mcmVlX2J1Zih4bGF0b3Jfb2JqLT5oY21tX21nciwgYnVmX3BhLAorCQkJCQkgICAgICB4bGF0b3Jfb2JqLT51bF9zZWdfaWQpOworCQkJaWYgKHN0YXR1cykgeworCQkJCS8qIFVoIG9oLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4uIERlc2NyaXB0b3IKKwkJCQkgKiBnb25lISAqLworCQkJCURCQ19BU1NFUlQoZmFsc2UpOwkvKiBDTU0gaXMgbGVha2luZyBtZW0gKi8KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGNtbV94bGF0b3JfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNldC9HZXQgdHJhbnNsYXRvciBpbmZvLgorICovCitpbnQgY21tX3hsYXRvcl9pbmZvKHN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICp4bGF0b3IsIHU4ICoqIHBhZGRyLAorCQkJICAgdTMyIHVsX3NpemUsIHUzMiBzZWdtX2lkLCBib29sIHNldF9pbmZvKQoreworCXN0cnVjdCBjbW1feGxhdG9yICp4bGF0b3Jfb2JqID0gKHN0cnVjdCBjbW1feGxhdG9yICopeGxhdG9yOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHBhZGRyICE9IE5VTEwpOworCURCQ19SRVFVSVJFKChzZWdtX2lkID4gMCkgJiYgKHNlZ21faWQgPD0gQ01NX01BWEdQUFNFR1MpKTsKKworCWlmICh4bGF0b3Jfb2JqKSB7CisJCWlmIChzZXRfaW5mbykgeworCQkJLyogc2V0IHRyYW5zbGF0b3JzIHZpcnR1YWwgYWRkcmVzcyByYW5nZSAqLworCQkJeGxhdG9yX29iai0+ZHdfdmlydF9iYXNlID0gKHUzMikgKnBhZGRyOworCQkJeGxhdG9yX29iai0+dWxfdmlydF9zaXplID0gdWxfc2l6ZTsKKwkJfSBlbHNlIHsJLyogcmV0dXJuIHZpcnQgYmFzZSBhZGRyZXNzICovCisJCQkqcGFkZHIgPSAodTggKikgeGxhdG9yX29iai0+ZHdfdmlydF9iYXNlOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjbW1feGxhdG9yX3RyYW5zbGF0ZSA9PT09PT09PQorICovCit2b2lkICpjbW1feGxhdG9yX3RyYW5zbGF0ZShzdHJ1Y3QgY21tX3hsYXRvcm9iamVjdCAqeGxhdG9yLCB2b2lkICpwYWRkciwKKwkJCSAgIGVudW0gY21tX3hsYXRldHlwZSB4dHlwZSkKK3sKKwl1MzIgZHdfYWRkcl94bGF0ZSA9IDA7CisJc3RydWN0IGNtbV94bGF0b3IgKnhsYXRvcl9vYmogPSAoc3RydWN0IGNtbV94bGF0b3IgKil4bGF0b3I7CisJc3RydWN0IGNtbV9vYmplY3QgKmNtbV9tZ3Jfb2JqID0gTlVMTDsKKwlzdHJ1Y3QgY21tX2FsbG9jYXRvciAqYWxsb2NhdG9yID0gTlVMTDsKKwl1MzIgZHdfb2Zmc2V0ID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShwYWRkciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRSgoeHR5cGUgPj0gQ01NX1ZBMlBBKSAmJiAoeHR5cGUgPD0gQ01NX0RTUFBBMlBBKSk7CisKKwlpZiAoIXhsYXRvcl9vYmopCisJCWdvdG8gbG9vcF9jb250OworCisJY21tX21ncl9vYmogPSAoc3RydWN0IGNtbV9vYmplY3QgKil4bGF0b3Jfb2JqLT5oY21tX21ncjsKKwkvKiBnZXQgdGhpcyB0cmFuc2xhdG9yJ3MgZGVmYXVsdCBTTSBhbGxvY2F0b3IgKi8KKwlEQkNfQVNTRVJUKHhsYXRvcl9vYmotPnVsX3NlZ19pZCA+IDApOworCWFsbG9jYXRvciA9IGNtbV9tZ3Jfb2JqLT5wYV9ncHBzbV9zZWdfdGFiW3hsYXRvcl9vYmotPnVsX3NlZ19pZCAtIDFdOworCWlmICghYWxsb2NhdG9yKQorCQlnb3RvIGxvb3BfY29udDsKKworCWlmICgoeHR5cGUgPT0gQ01NX1ZBMkRTUFBBKSB8fCAoeHR5cGUgPT0gQ01NX1ZBMlBBKSB8fAorCSAgICAoeHR5cGUgPT0gQ01NX1BBMlZBKSkgeworCQlpZiAoeHR5cGUgPT0gQ01NX1BBMlZBKSB7CisJCQkvKiBHcHAgVmEgPSBWYSBCYXNlICsgb2Zmc2V0ICovCisJCQlkd19vZmZzZXQgPSAodTggKikgcGFkZHIgLSAodTggKikgKGFsbG9jYXRvci0+c2htX2Jhc2UgLQorCQkJCQkJCSAgIGFsbG9jYXRvci0+CisJCQkJCQkJICAgdWxfZHNwX3NpemUpOworCQkJZHdfYWRkcl94bGF0ZSA9IHhsYXRvcl9vYmotPmR3X3ZpcnRfYmFzZSArIGR3X29mZnNldDsKKwkJCS8qIENoZWNrIGlmIHRyYW5zbGF0ZWQgVmEgYmFzZSBpcyBpbiByYW5nZSAqLworCQkJaWYgKChkd19hZGRyX3hsYXRlIDwgeGxhdG9yX29iai0+ZHdfdmlydF9iYXNlKSB8fAorCQkJICAgIChkd19hZGRyX3hsYXRlID49CisJCQkgICAgICh4bGF0b3Jfb2JqLT5kd192aXJ0X2Jhc2UgKworCQkJICAgICAgeGxhdG9yX29iai0+dWxfdmlydF9zaXplKSkpIHsKKwkJCQlkd19hZGRyX3hsYXRlID0gMDsJLyogYmFkIGFkZHJlc3MgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEdwcCBQQSA9ICBHcHAgQmFzZSArIG9mZnNldCAqLworCQkJZHdfb2Zmc2V0ID0KKwkJCSAgICAodTggKikgcGFkZHIgLSAodTggKikgeGxhdG9yX29iai0+ZHdfdmlydF9iYXNlOworCQkJZHdfYWRkcl94bGF0ZSA9CisJCQkgICAgYWxsb2NhdG9yLT5zaG1fYmFzZSAtIGFsbG9jYXRvci0+dWxfZHNwX3NpemUgKworCQkJICAgIGR3X29mZnNldDsKKwkJfQorCX0gZWxzZSB7CisJCWR3X2FkZHJfeGxhdGUgPSAodTMyKSBwYWRkcjsKKwl9CisJLypOb3cgY29udmVydCBhZGRyZXNzIHRvIHByb3BlciB0YXJnZXQgcGh5c2ljYWwgYWRkcmVzcyBpZiBuZWVkZWQgKi8KKwlpZiAoKHh0eXBlID09IENNTV9WQTJEU1BQQSkgfHwgKHh0eXBlID09IENNTV9QQTJEU1BQQSkpIHsKKwkJLyogR290IEdwcCBQYSBub3csIGNvbnZlcnQgdG8gRFNQIFBhICovCisJCWR3X2FkZHJfeGxhdGUgPQorCQkgICAgR1BQUEEyRFNQUEEoKGFsbG9jYXRvci0+c2htX2Jhc2UgLSBhbGxvY2F0b3ItPnVsX2RzcF9zaXplKSwKKwkJCQlkd19hZGRyX3hsYXRlLAorCQkJCWFsbG9jYXRvci0+ZHdfZHNwX3BoeXNfYWRkcl9vZmZzZXQgKgorCQkJCWFsbG9jYXRvci0+Y19mYWN0b3IpOworCX0gZWxzZSBpZiAoeHR5cGUgPT0gQ01NX0RTUFBBMlBBKSB7CisJCS8qIEdvdCBEU1AgUGEsIGNvbnZlcnQgdG8gR1BQIFBhICovCisJCWR3X2FkZHJfeGxhdGUgPQorCQkgICAgRFNQUEEyR1BQUEEoYWxsb2NhdG9yLT5zaG1fYmFzZSAtIGFsbG9jYXRvci0+dWxfZHNwX3NpemUsCisJCQkJZHdfYWRkcl94bGF0ZSwKKwkJCQlhbGxvY2F0b3ItPmR3X2RzcF9waHlzX2FkZHJfb2Zmc2V0ICoKKwkJCQlhbGxvY2F0b3ItPmNfZmFjdG9yKTsKKwl9Citsb29wX2NvbnQ6CisJcmV0dXJuICh2b2lkICopZHdfYWRkcl94bGF0ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2NvZC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvY29kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5ODlhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2NvZC5jCkBAIC0wLDAgKzEsNjUyIEBACisvKgorICogY29kLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBEU1AgY29kZSBtYW5hZ2VtZW50IGZvciB0aGUgRFNQL0JJT1MgQnJpZGdlCisgKiBlbnZpcm9ubWVudC4gSXQgaXMgbW9zdGx5IGEgdGhpbiB3cmFwcGVyLgorICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgbG9hZGluZyBib3RoIHN0YXRpYyBhbmQKKyAqIGR5bmFtaWMgY29kZSBvYmplY3RzIG9udG8gRFNQIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2xkci5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhdGZvcm0gTWFuYWdlciAqLworLyogSW5jbHVkZSBhcHByb3ByaWF0ZSBsb2FkZXIgaGVhZGVyIGZpbGUgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJsbC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jb2QuaD4KKworLyoKKyAqICA9PT09PT09PSBjb2RfbWFuYWdlciA9PT09PT09PQorICovCitzdHJ1Y3QgY29kX21hbmFnZXIgeworCXN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldDsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqYmFzZV9saWI7CisJYm9vbCBsb2FkZWQ7CQkvKiBCYXNlIGxpYnJhcnkgbG9hZGVkPyAqLworCXUzMiB1bF9lbnRyeTsKKwlzdHJ1Y3QgbGRyX21vZHVsZSAqZGxsX29iajsKKwlzdHJ1Y3QgZGJsbF9meG5zIGZ4bnM7CisJc3RydWN0IGRibGxfYXR0cnMgYXR0cnM7CisJY2hhciBzel96bF9maWxlW0NPRF9NQVhQQVRITEVOR1RIXTsKK307CisKKy8qCisgKiAgPT09PT09PT0gY29kX2xpYnJhcnlvYmogPT09PT09PT0KKyAqLworc3RydWN0IGNvZF9saWJyYXJ5b2JqIHsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqZGJsbF9saWI7CisJc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyOworfTsKKworc3RhdGljIHUzMiByZWZzID0gMEw7CisKK3N0YXRpYyBzdHJ1Y3QgZGJsbF9meG5zIGxkcl9meG5zID0geworCShkYmxsX2Nsb3NlX2Z4bikgZGJsbF9jbG9zZSwKKwkoZGJsbF9jcmVhdGVfZnhuKSBkYmxsX2NyZWF0ZSwKKwkoZGJsbF9kZWxldGVfZnhuKSBkYmxsX2RlbGV0ZSwKKwkoZGJsbF9leGl0X2Z4bikgZGJsbF9leGl0LAorCShkYmxsX2dldF9hdHRyc19meG4pIGRibGxfZ2V0X2F0dHJzLAorCShkYmxsX2dldF9hZGRyX2Z4bikgZGJsbF9nZXRfYWRkciwKKwkoZGJsbF9nZXRfY19hZGRyX2Z4bikgZGJsbF9nZXRfY19hZGRyLAorCShkYmxsX2dldF9zZWN0X2Z4bikgZGJsbF9nZXRfc2VjdCwKKwkoZGJsbF9pbml0X2Z4bikgZGJsbF9pbml0LAorCShkYmxsX2xvYWRfZnhuKSBkYmxsX2xvYWQsCisJKGRibGxfbG9hZF9zZWN0X2Z4bikgZGJsbF9sb2FkX3NlY3QsCisJKGRibGxfb3Blbl9meG4pIGRibGxfb3BlbiwKKwkoZGJsbF9yZWFkX3NlY3RfZnhuKSBkYmxsX3JlYWRfc2VjdCwKKwkoZGJsbF9zZXRfYXR0cnNfZnhuKSBkYmxsX3NldF9hdHRycywKKwkoZGJsbF91bmxvYWRfZnhuKSBkYmxsX3VubG9hZCwKKwkoZGJsbF91bmxvYWRfc2VjdF9meG4pIGRibGxfdW5sb2FkX3NlY3QsCit9OworCitzdGF0aWMgYm9vbCBub19vcCh2b2lkKTsKKworLyoKKyAqIEZpbGUgb3BlcmF0aW9ucyAob3JpZ2luYWxseSB3ZXJlIHVuZGVyIGtmaWxlLmMpCisgKi8KK3N0YXRpYyBzMzIgY29kX2ZfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHApCit7CisJLyogQ2hlY2sgZm9yIHZhbGlkIGhhbmRsZSAqLworCWlmICghZmlscCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmaWxwX2Nsb3NlKGZpbHAsIE5VTEwpOworCisJLyogd2UgY2FuJ3QgdXNlIDAgaGVyZSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGUgKmNvZF9mX29wZW4oY29uc3QgY2hhciAqcHN6X2ZpbGVfbmFtZSwgY29uc3QgY2hhciAqc3pfbW9kZSkKK3sKKwltbV9zZWdtZW50X3QgZnM7CisJc3RydWN0IGZpbGUgKmZpbHA7CisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisKKwkvKiBpZ25vcmUgZ2l2ZW4gbW9kZSBhbmQgb3BlbiBmaWxlIGFzIHJlYWQtb25seSAqLworCWZpbHAgPSBmaWxwX29wZW4ocHN6X2ZpbGVfbmFtZSwgT19SRE9OTFksIDApOworCisJaWYgKElTX0VSUihmaWxwKSkKKwkJZmlscCA9IE5VTEw7CisKKwlzZXRfZnMoZnMpOworCisJcmV0dXJuIGZpbHA7Cit9CisKK3N0YXRpYyBzMzIgY29kX2ZfcmVhZCh2b2lkIF9fdXNlciAqcGJ1ZmZlciwgczMyIHNpemUsIHMzMiBjb3VudCwKKwkJICAgICAgc3RydWN0IGZpbGUgKmZpbHApCit7CisJLyogY2hlY2sgZm9yIHZhbGlkIGZpbGUgaGFuZGxlICovCisJaWYgKCFmaWxwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgoc2l6ZSA+IDApICYmIChjb3VudCA+IDApICYmIHBidWZmZXIpIHsKKwkJdTMyIGR3X2J5dGVzX3JlYWQ7CisJCW1tX3NlZ21lbnRfdCBmczsKKworCQkvKiByZWFkIGZyb20gZmlsZSAqLworCQlmcyA9IGdldF9mcygpOworCQlzZXRfZnMoZ2V0X2RzKCkpOworCQlkd19ieXRlc19yZWFkID0gZmlscC0+Zl9vcC0+cmVhZChmaWxwLCBwYnVmZmVyLCBzaXplICogY291bnQsCisJCQkJCQkgJihmaWxwLT5mX3BvcykpOworCQlzZXRfZnMoZnMpOworCisJCWlmICghZHdfYnl0ZXNfcmVhZCkKKwkJCXJldHVybiAtRUJBREY7CisKKwkJcmV0dXJuIGR3X2J5dGVzX3JlYWQgLyBzaXplOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgczMyIGNvZF9mX3NlZWsoc3RydWN0IGZpbGUgKmZpbHAsIHMzMiBvZmZzZXQsIHMzMiBvcmlnaW4pCit7CisJbG9mZl90IGR3X2N1cl9wb3M7CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgZmlsZSBoYW5kbGUgKi8KKwlpZiAoIWZpbHApCisJCXJldHVybiAtRUZBVUxUOworCisJLyogYmFzZWQgb24gdGhlIG9yaWdpbiBmbGFnLCBtb3ZlIHRoZSBpbnRlcm5hbCBwb2ludGVyICovCisJZHdfY3VyX3BvcyA9IGZpbHAtPmZfb3AtPmxsc2VlayhmaWxwLCBvZmZzZXQsIG9yaWdpbik7CisKKwlpZiAoKHMzMikgZHdfY3VyX3BvcyA8IDApCisJCXJldHVybiAtRVBFUk07CisKKwkvKiB3ZSBjYW4ndCB1c2UgMCBoZXJlICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgY29kX2ZfdGVsbChzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlsb2ZmX3QgZHdfY3VyX3BvczsKKworCWlmICghZmlscCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBHZXQgY3VycmVudCBwb3NpdGlvbiAqLworCWR3X2N1cl9wb3MgPSBmaWxwLT5mX29wLT5sbHNlZWsoZmlscCwgMCwgU0VFS19DVVIpOworCisJaWYgKChzMzIpIGR3X2N1cl9wb3MgPCAwKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIGR3X2N1cl9wb3M7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY29kX2Nsb3NlID09PT09PT09CisgKi8KK3ZvaWQgY29kX2Nsb3NlKHN0cnVjdCBjb2RfbGlicmFyeW9iaiAqbGliKQoreworCXN0cnVjdCBjb2RfbWFuYWdlciAqaG1ncjsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShsaWIgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobGliLT5jb2RfbWdyKTsKKworCWhtZ3IgPSBsaWItPmNvZF9tZ3I7CisJaG1nci0+Znhucy5jbG9zZV9meG4obGliLT5kYmxsX2xpYik7CisKKwlrZnJlZShsaWIpOworfQorCisvKgorICogID09PT09PT09IGNvZF9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYW4gb2JqZWN0IHRvIG1hbmFnZSBjb2RlIG9uIGEgRFNQIHN5c3RlbS4KKyAqICAgICAgVGhpcyBvYmplY3QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhbiBpbml0aWFsIHByb2dyYW0gaW1hZ2Ugd2l0aAorICogICAgICBhcmd1bWVudHMgdGhhdCBjYW4gbGF0ZXIgYmUgZXhwYW5kZWQgd2l0aAorICogICAgICBkeW5hbWljYWxseSBsb2FkZWQgb2JqZWN0IGZpbGVzLgorICoKKyAqLworaW50IGNvZF9jcmVhdGUoc3RydWN0IGNvZF9tYW5hZ2VyICoqbWdyLCBjaGFyICpzdHJfemxfZmlsZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGNvZF9hdHRycyAqYXR0cnMpCit7CisJc3RydWN0IGNvZF9tYW5hZ2VyICptZ3JfbmV3OworCXN0cnVjdCBkYmxsX2F0dHJzIHpsX2F0dHJzOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG1nciAhPSBOVUxMKTsKKworCS8qIGFzc3VtZSBmYWlsdXJlICovCisJKm1nciA9IE5VTEw7CisKKwkvKiB3ZSBkb24ndCBzdXBwb3J0IG5vbi1kZWZhdWx0IGF0dHJzIHlldCAqLworCWlmIChhdHRycyAhPSBOVUxMKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCW1ncl9uZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29kX21hbmFnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWdyX25ldyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNldCB1cCBsb2FkZXIgZnVuY3Rpb25zICovCisJbWdyX25ldy0+ZnhucyA9IGxkcl9meG5zOworCisJLyogaW5pdGlhbGl6ZSB0aGUgWkwgbW9kdWxlICovCisJbWdyX25ldy0+Znhucy5pbml0X2Z4bigpOworCisJemxfYXR0cnMuYWxsb2MgPSAoZGJsbF9hbGxvY19meG4pIG5vX29wOworCXpsX2F0dHJzLmZyZWUgPSAoZGJsbF9mcmVlX2Z4bikgbm9fb3A7CisJemxfYXR0cnMuZnJlYWQgPSAoZGJsbF9yZWFkX2Z4bikgY29kX2ZfcmVhZDsKKwl6bF9hdHRycy5mc2VlayA9IChkYmxsX3NlZWtfZnhuKSBjb2RfZl9zZWVrOworCXpsX2F0dHJzLmZ0ZWxsID0gKGRibGxfdGVsbF9meG4pIGNvZF9mX3RlbGw7CisJemxfYXR0cnMuZmNsb3NlID0gKGRibGxfZl9jbG9zZV9meG4pIGNvZF9mX2Nsb3NlOworCXpsX2F0dHJzLmZvcGVuID0gKGRibGxfZl9vcGVuX2Z4bikgY29kX2Zfb3BlbjsKKwl6bF9hdHRycy5zeW1fbG9va3VwID0gTlVMTDsKKwl6bF9hdHRycy5iYXNlX2ltYWdlID0gdHJ1ZTsKKwl6bF9hdHRycy5sb2dfd3JpdGUgPSBOVUxMOworCXpsX2F0dHJzLmxvZ193cml0ZV9oYW5kbGUgPSBOVUxMOworCXpsX2F0dHJzLndyaXRlID0gTlVMTDsKKwl6bF9hdHRycy5ybW1faGFuZGxlID0gTlVMTDsKKwl6bF9hdHRycy5pbnB1dF9wYXJhbXMgPSBOVUxMOworCXpsX2F0dHJzLnN5bV9oYW5kbGUgPSBOVUxMOworCXpsX2F0dHJzLnN5bV9hcmcgPSBOVUxMOworCisJbWdyX25ldy0+YXR0cnMgPSB6bF9hdHRyczsKKworCXN0YXR1cyA9IG1ncl9uZXctPmZ4bnMuY3JlYXRlX2Z4bigmbWdyX25ldy0+dGFyZ2V0LCAmemxfYXR0cnMpOworCisJaWYgKHN0YXR1cykgeworCQljb2RfZGVsZXRlKG1ncl9uZXcpOworCQlyZXR1cm4gLUVTUElQRTsKKwl9CisKKwkvKiByZXR1cm4gdGhlIG5ldyBtYW5hZ2VyICovCisJKm1nciA9IG1ncl9uZXc7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICA9PT09PT09PSBjb2RfZGVsZXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVsZXRlIGEgY29kZSBtYW5hZ2VyIG9iamVjdC4KKyAqLwordm9pZCBjb2RfZGVsZXRlKHN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncl9vYmopCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGNvZF9tZ3Jfb2JqKTsKKworCWlmIChjb2RfbWdyX29iai0+YmFzZV9saWIpIHsKKwkJaWYgKGNvZF9tZ3Jfb2JqLT5sb2FkZWQpCisJCQljb2RfbWdyX29iai0+Znhucy51bmxvYWRfZnhuKGNvZF9tZ3Jfb2JqLT5iYXNlX2xpYiwKKwkJCQkJCQkmY29kX21ncl9vYmotPmF0dHJzKTsKKworCQljb2RfbWdyX29iai0+Znhucy5jbG9zZV9meG4oY29kX21ncl9vYmotPmJhc2VfbGliKTsKKwl9CisJaWYgKGNvZF9tZ3Jfb2JqLT50YXJnZXQpIHsKKwkJY29kX21ncl9vYmotPmZ4bnMuZGVsZXRlX2Z4bihjb2RfbWdyX29iai0+dGFyZ2V0KTsKKwkJY29kX21ncl9vYmotPmZ4bnMuZXhpdF9meG4oKTsKKwl9CisJa2ZyZWUoY29kX21ncl9vYmopOworfQorCisvKgorICogID09PT09PT09IGNvZF9leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgdGhlIENPRCBtb2R1bGUuCisgKgorICovCit2b2lkIGNvZF9leGl0KHZvaWQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJcmVmcy0tOworCisJREJDX0VOU1VSRShyZWZzID49IDApOworfQorCisvKgorICogID09PT09PT09IGNvZF9nZXRfYmFzZV9saWIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHZXQgaGFuZGxlIHRvIHRoZSBiYXNlIGltYWdlIERCTCBsaWJyYXJ5LgorICovCitpbnQgY29kX2dldF9iYXNlX2xpYihzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3Jfb2JqLAorCQkJICAgIHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICoqcGxpYikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShjb2RfbWdyX29iaik7CisJREJDX1JFUVVJUkUocGxpYiAhPSBOVUxMKTsKKworCSpwbGliID0gKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICopY29kX21ncl9vYmotPmJhc2VfbGliOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjb2RfZ2V0X2Jhc2VfbmFtZSA9PT09PT09PQorICovCitpbnQgY29kX2dldF9iYXNlX25hbWUoc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyX29iaiwgY2hhciAqc3pfbmFtZSwKKwkJCSAgICAgdTMyIHVzaXplKQoreworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGNvZF9tZ3Jfb2JqKTsKKwlEQkNfUkVRVUlSRShzel9uYW1lICE9IE5VTEwpOworCisJaWYgKHVzaXplIDw9IENPRF9NQVhQQVRITEVOR1RIKQorCQlzdHJuY3B5KHN6X25hbWUsIGNvZF9tZ3Jfb2JqLT5zel96bF9maWxlLCB1c2l6ZSk7CisJZWxzZQorCQlzdGF0dXMgPSAtRVBFUk07CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGNvZF9nZXRfZW50cnkgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgZW50cnkgcG9pbnQgb2YgYSBsb2FkZWQgRFNQIHByb2dyYW0gaW1hZ2UKKyAqCisgKi8KK2ludCBjb2RfZ2V0X2VudHJ5KHN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncl9vYmosIHUzMiAqZW50cnlfcHQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGNvZF9tZ3Jfb2JqKTsKKwlEQkNfUkVRVUlSRShlbnRyeV9wdCAhPSBOVUxMKTsKKworCSplbnRyeV9wdCA9IGNvZF9tZ3Jfb2JqLT51bF9lbnRyeTsKKworCXJldHVybiAwOworfQorCisvKgorICogID09PT09PT09IGNvZF9nZXRfbG9hZGVyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IGhhbmRsZSB0byB0aGUgREJMTCBsb2FkZXIuCisgKi8KK2ludCBjb2RfZ2V0X2xvYWRlcihzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3Jfb2JqLAorCQkJICBzdHJ1Y3QgZGJsbF90YXJfb2JqICoqbG9hZGVyKQoreworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGNvZF9tZ3Jfb2JqKTsKKwlEQkNfUkVRVUlSRShsb2FkZXIgIT0gTlVMTCk7CisKKwkqbG9hZGVyID0gKHN0cnVjdCBkYmxsX3Rhcl9vYmogKiljb2RfbWdyX29iai0+dGFyZ2V0OworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjb2RfZ2V0X3NlY3Rpb24gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIGEgc2VjdGlvbiBpbiB0aGUgQ09GRiBmaWxlCisgKiAgICAgIGdpdmVuIHRoZSBzZWN0aW9uIG5hbWUuCisgKi8KK2ludCBjb2RfZ2V0X3NlY3Rpb24oc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIsIGNoYXIgKnN0cl9zZWN0LAorCQkJICAgdTMyICphZGRyLCB1MzIgKmxlbikKK3sKKwlzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3Jfb2JqOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGxpYiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShsaWItPmNvZF9tZ3IpOworCURCQ19SRVFVSVJFKHN0cl9zZWN0ICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGFkZHIgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobGVuICE9IE5VTEwpOworCisJKmFkZHIgPSAwOworCSpsZW4gPSAwOworCWlmIChsaWIgIT0gTlVMTCkgeworCQljb2RfbWdyX29iaiA9IGxpYi0+Y29kX21ncjsKKwkJc3RhdHVzID0gY29kX21ncl9vYmotPmZ4bnMuZ2V0X3NlY3RfZnhuKGxpYi0+ZGJsbF9saWIsIHN0cl9zZWN0LAorCQkJCQkJCWFkZHIsIGxlbik7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVTUElQRTsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKCgqYWRkciA9PSAwKSAmJiAoKmxlbiA9PSAwKSkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjb2RfZ2V0X3N5bV92YWx1ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBzeW1ib2wuIFRoZSBzeW1ib2wgaXMgZmlyc3QKKyAqICAgICAgc2VhcmNoZWQgZm9yIGxpdGVyYWxseSBhbmQgdGhlbiwgaWYgbm90IGZvdW5kLCBzZWFyY2hlZCBmb3IgYXMgYQorICogICAgICBDIHN5bWJvbC4KKyAqCisgKi8KK2ludCBjb2RfZ2V0X3N5bV92YWx1ZShzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3Jfb2JqLCBjaGFyICpzdHJfc3ltLAorCQkJICAgICB1MzIgKnB1bF92YWx1ZSkKK3sKKwlzdHJ1Y3QgZGJsbF9zeW1fdmFsICpkYmxsX3N5bTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShjb2RfbWdyX29iaik7CisJREJDX1JFUVVJUkUoc3RyX3N5bSAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwdWxfdmFsdWUgIT0gTlVMTCk7CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBjb2RfbWdyX29iajogJXAgc3RyX3N5bTogJXMgcHVsX3ZhbHVlOiAlcFxuIiwKKwkJX19mdW5jX18sIGNvZF9tZ3Jfb2JqLCBzdHJfc3ltLCBwdWxfdmFsdWUpOworCWlmIChjb2RfbWdyX29iai0+YmFzZV9saWIpIHsKKwkJaWYgKCFjb2RfbWdyX29iai0+Znhucy4KKwkJICAgIGdldF9hZGRyX2Z4bihjb2RfbWdyX29iai0+YmFzZV9saWIsIHN0cl9zeW0sICZkYmxsX3N5bSkpIHsKKwkJCWlmICghY29kX21ncl9vYmotPmZ4bnMuCisJCQkgICAgZ2V0X2NfYWRkcl9meG4oY29kX21ncl9vYmotPmJhc2VfbGliLCBzdHJfc3ltLAorCQkJCQkJJmRibGxfc3ltKSkKKwkJCQlyZXR1cm4gLUVTUElQRTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAtRVNQSVBFOworCX0KKworCSpwdWxfdmFsdWUgPSBkYmxsX3N5bS0+dmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICA9PT09PT09PSBjb2RfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgdGhlIENPRCBtb2R1bGUncyBwcml2YXRlIHN0YXRlLgorICoKKyAqLworYm9vbCBjb2RfaW5pdCh2b2lkKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlpZiAocmV0KQorCQlyZWZzKys7CisKKwlEQkNfRU5TVVJFKChyZXQgJiYgcmVmcyA+IDApIHx8ICghcmV0ICYmIHJlZnMgPj0gMCkpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY29kX2xvYWRfYmFzZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIExvYWQgdGhlIGluaXRpYWwgcHJvZ3JhbSBpbWFnZSwgb3B0aW9uYWxseSB3aXRoIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsCisgKiAgICAgIG9uIHRoZSBEU1Agc3lzdGVtIG1hbmFnZWQgYnkgdGhlIHN1cHBsaWVkIGhhbmRsZS4gVGhlIHByb2dyYW0gdG8gYmUKKyAqICAgICAgbG9hZGVkIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFyZ3MgYXJyYXkgYW5kIG11c3QgYmUgYSBmdWxseQorICogICAgICBxdWFsaWZpZWQgcGF0aG5hbWUuCisgKiAgRGV0YWlsczoKKyAqICAgICAgaWYgbnVtX2FyZ2MgZG9lc24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgYXJncyBhcnJheSwgdGhlCisgKiAgICAgIGFyZ3MgYXJyYXkgaXMgc2VhcmNoZWQgZm9yIGEgTlVMTCB0ZXJtaW5hdGluZyBlbnRyeSwgYW5kIGFyZ2MgaXMKKyAqICAgICAgcmVjYWxjdWxhdGVkIHRvIHJlZmxlY3QgdGhpcy4gIEluIHRoaXMgd2F5LCB3ZSBjYW4gc3VwcG9ydCBOVUxMCisgKiAgICAgIHRlcm1pbmF0aW5nIGFyZ3MgYXJyYXlzLCBpZiBudW1fYXJnYyBpcyB2ZXJ5IGxhcmdlLgorICovCitpbnQgY29kX2xvYWRfYmFzZShzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3Jfb2JqLCB1MzIgbnVtX2FyZ2MsIGNoYXIgKmFyZ3NbXSwKKwkJCSBjb2Rfd3JpdGVmeG4gcGZuX3dyaXRlLCB2b2lkICphcmIsIGNoYXIgKmVudnBbXSkKK3sKKwlkYmxsX2ZsYWdzIGZsYWdzOworCXN0cnVjdCBkYmxsX2F0dHJzIHNhdmVfYXR0cnM7CisJc3RydWN0IGRibGxfYXR0cnMgbmV3X2F0dHJzOworCWludCBzdGF0dXM7CisJdTMyIGk7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoY29kX21ncl9vYmopOworCURCQ19SRVFVSVJFKG51bV9hcmdjID4gMCk7CisJREJDX1JFUVVJUkUoYXJncyAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShhcmdzWzBdICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHBmbl93cml0ZSAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShjb2RfbWdyX29iai0+YmFzZV9saWIgIT0gTlVMTCk7CisKKwkvKgorCSAqICBNYWtlIHN1cmUgZXZlcnkgYXJndltdIHN0YXRlZCBpbiBhcmdjIGhhcyBhIHZhbHVlLCBvciBjaGFuZ2UgYXJnYyB0bworCSAqICByZWZsZWN0IHRydWUgbnVtYmVyIGluIE5VTEwgdGVybWluYXRlZCBhcmd2IGFycmF5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fYXJnYzsgaSsrKSB7CisJCWlmIChhcmdzW2ldID09IE5VTEwpIHsKKwkJCW51bV9hcmdjID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogc2V0IHRoZSB3cml0ZSBmdW5jdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24gKi8KKwljb2RfbWdyX29iai0+Znhucy5nZXRfYXR0cnNfZnhuKGNvZF9tZ3Jfb2JqLT50YXJnZXQsICZzYXZlX2F0dHJzKTsKKworCW5ld19hdHRycyA9IHNhdmVfYXR0cnM7CisJbmV3X2F0dHJzLndyaXRlID0gKGRibGxfd3JpdGVfZnhuKSBwZm5fd3JpdGU7CisJbmV3X2F0dHJzLmlucHV0X3BhcmFtcyA9IGFyYjsKKwluZXdfYXR0cnMuYWxsb2MgPSAoZGJsbF9hbGxvY19meG4pIG5vX29wOworCW5ld19hdHRycy5mcmVlID0gKGRibGxfZnJlZV9meG4pIG5vX29wOworCW5ld19hdHRycy5sb2dfd3JpdGUgPSBOVUxMOworCW5ld19hdHRycy5sb2dfd3JpdGVfaGFuZGxlID0gTlVMTDsKKworCS8qIExvYWQgdGhlIGltYWdlICovCisJZmxhZ3MgPSBEQkxMX0NPREUgfCBEQkxMX0RBVEEgfCBEQkxMX1NZTUI7CisJc3RhdHVzID0gY29kX21ncl9vYmotPmZ4bnMubG9hZF9meG4oY29kX21ncl9vYmotPmJhc2VfbGliLCBmbGFncywKKwkJCQkJICAgICZuZXdfYXR0cnMsCisJCQkJCSAgICAmY29kX21ncl9vYmotPnVsX2VudHJ5KTsKKwlpZiAoc3RhdHVzKQorCQljb2RfbWdyX29iai0+Znhucy5jbG9zZV9meG4oY29kX21ncl9vYmotPmJhc2VfbGliKTsKKworCWlmICghc3RhdHVzKQorCQljb2RfbWdyX29iai0+bG9hZGVkID0gdHJ1ZTsKKwllbHNlCisJCWNvZF9tZ3Jfb2JqLT5iYXNlX2xpYiA9IE5VTEw7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGNvZF9vcGVuID09PT09PT09CisgKiAgICAgIE9wZW4gbGlicmFyeSBmb3IgcmVhZGluZyBzZWN0aW9ucy4KKyAqLworaW50IGNvZF9vcGVuKHN0cnVjdCBjb2RfbWFuYWdlciAqaG1nciwgY2hhciAqc3pfY29mZl9wYXRoLAorCQkgICAgdTMyIGZsYWdzLCBzdHJ1Y3QgY29kX2xpYnJhcnlvYmogKipsaWJfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjb2RfbGlicmFyeW9iaiAqbGliID0gTlVMTDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShobWdyKTsKKwlEQkNfUkVRVUlSRShzel9jb2ZmX3BhdGggIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoZmxhZ3MgPT0gQ09EX05PTE9BRCB8fCBmbGFncyA9PSBDT0RfU1lNQik7CisJREJDX1JFUVVJUkUobGliX29iaiAhPSBOVUxMKTsKKworCSpsaWJfb2JqID0gTlVMTDsKKworCWxpYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb2RfbGlicmFyeW9iaiksIEdGUF9LRVJORUwpOworCWlmIChsaWIgPT0gTlVMTCkKKwkJc3RhdHVzID0gLUVOT01FTTsKKworCWlmICghc3RhdHVzKSB7CisJCWxpYi0+Y29kX21nciA9IGhtZ3I7CisJCXN0YXR1cyA9IGhtZ3ItPmZ4bnMub3Blbl9meG4oaG1nci0+dGFyZ2V0LCBzel9jb2ZmX3BhdGgsIGZsYWdzLAorCQkJCQkgICAgICZsaWItPmRibGxfbGliKTsKKwkJaWYgKCFzdGF0dXMpCisJCQkqbGliX29iaiA9IGxpYjsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlwcl9lcnIoIiVzOiBlcnJvciBzdGF0dXMgMHgleCwgc3pfY29mZl9wYXRoOiAlcyBmbGFnczogMHgleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIHN6X2NvZmZfcGF0aCwgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY29kX29wZW5fYmFzZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIE9wZW4gYmFzZSBpbWFnZSBmb3IgcmVhZGluZyBzZWN0aW9ucy4KKyAqLworaW50IGNvZF9vcGVuX2Jhc2Uoc3RydWN0IGNvZF9tYW5hZ2VyICpobWdyLCBjaGFyICpzel9jb2ZmX3BhdGgsCisJCQkgZGJsbF9mbGFncyBmbGFncykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGhtZ3IpOworCURCQ19SRVFVSVJFKHN6X2NvZmZfcGF0aCAhPSBOVUxMKTsKKworCS8qIGlmIHdlIHByZXZpb3VzbHkgb3BlbmVkIGEgYmFzZSBpbWFnZSwgY2xvc2UgaXQgbm93ICovCisJaWYgKGhtZ3ItPmJhc2VfbGliKSB7CisJCWlmIChobWdyLT5sb2FkZWQpIHsKKwkJCWhtZ3ItPmZ4bnMudW5sb2FkX2Z4bihobWdyLT5iYXNlX2xpYiwgJmhtZ3ItPmF0dHJzKTsKKwkJCWhtZ3ItPmxvYWRlZCA9IGZhbHNlOworCQl9CisJCWhtZ3ItPmZ4bnMuY2xvc2VfZnhuKGhtZ3ItPmJhc2VfbGliKTsKKwkJaG1nci0+YmFzZV9saWIgPSBOVUxMOworCX0KKwlzdGF0dXMgPSBobWdyLT5meG5zLm9wZW5fZnhuKGhtZ3ItPnRhcmdldCwgc3pfY29mZl9wYXRoLCBmbGFncywgJmxpYik7CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogaGFuZyBvbnRvIHRoZSBsaWJyYXJ5IGZvciBzdWJzZXF1ZW50IHN5bSB0YWJsZSB1c2FnZSAqLworCQlobWdyLT5iYXNlX2xpYiA9IGxpYjsKKwkJc3RybmNweShobWdyLT5zel96bF9maWxlLCBzel9jb2ZmX3BhdGgsIENPRF9NQVhQQVRITEVOR1RIIC0gMSk7CisJCWhtZ3ItPnN6X3psX2ZpbGVbQ09EX01BWFBBVEhMRU5HVEggLSAxXSA9ICdcMCc7CisJfQorCisJaWYgKHN0YXR1cykKKwkJcHJfZXJyKCIlczogZXJyb3Igc3RhdHVzIDB4JXggc3pfY29mZl9wYXRoOiAlc1xuIiwgX19mdW5jX18sCisJCSAgICAgICBzdGF0dXMsIHN6X2NvZmZfcGF0aCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjb2RfcmVhZF9zZWN0aW9uID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgYSBjb2RlIHNlY3Rpb24gZ2l2ZW4gdGhlIHNlY3Rpb24gbmFtZS4KKyAqLworaW50IGNvZF9yZWFkX3NlY3Rpb24oc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIsIGNoYXIgKnN0cl9zZWN0LAorCQkJICAgIGNoYXIgKnN0cl9jb250ZW50LCB1MzIgY29udGVudF9zaXplKQoreworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGxpYiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShsaWItPmNvZF9tZ3IpOworCURCQ19SRVFVSVJFKHN0cl9zZWN0ICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHN0cl9jb250ZW50ICE9IE5VTEwpOworCisJaWYgKGxpYiAhPSBOVUxMKQorCQlzdGF0dXMgPQorCQkgICAgbGliLT5jb2RfbWdyLT5meG5zLnJlYWRfc2VjdF9meG4obGliLT5kYmxsX2xpYiwgc3RyX3NlY3QsCisJCQkJCQkgICAgIHN0cl9jb250ZW50LCBjb250ZW50X3NpemUpOworCWVsc2UKKwkJc3RhdHVzID0gLUVTUElQRTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9fb3AgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBObyBPcGVyYXRpb24uCisgKgorICovCitzdGF0aWMgYm9vbCBub19vcCh2b2lkKQoreworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvZGJsbC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvZGJsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDA2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9kYmxsLmMKQEAgLTAsMCArMSwxNTg1IEBACisvKgorICogZGJsbC5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2doLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisKKy8qIER5bmFtaWMgbG9hZGVyIGxpYnJhcnkgaW50ZXJmYWNlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2R5bmFtaWNfbG9hZGVyLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2dldHNlY3Rpb24uaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJsbC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ybW0uaD4KKworLyogTnVtYmVyIG9mIGJ1Y2tldHMgZm9yIHN5bWJvbCBoYXNoIHRhYmxlICovCisjZGVmaW5lIE1BWEJVQ0tFVFMgMjExCisKKy8qIE1heCBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIE1BWEVYUFIgMTI4CisKKyNkZWZpbmUgRE9GRl9BTElHTih4KSAoKCh4KSArIDMpICYgfjNVTCkKKworLyoKKyAqICA9PT09PT09PSBzdHJ1Y3QgZGJsbF90YXJfb2JqKiA9PT09PT09PQorICogIEEgdGFyZ2V0IG1heSBoYXZlIG9uZSBvciBtb3JlIGxpYnJhcmllcyBvZiBzeW1ib2xzL2NvZGUvZGF0YSBsb2FkZWQKKyAqICBvbnRvIGl0LCB3aGVyZSBhIGxpYnJhcnkgaXMgc2ltcGx5IHRoZSBzeW1ib2xzL2NvZGUvZGF0YSBjb250YWluZWQKKyAqICBpbiBhIERPRkYgZmlsZS4KKyAqLworLyoKKyAqICA9PT09PT09PSBkYmxsX3Rhcl9vYmogPT09PT09PT0KKyAqLworc3RydWN0IGRibGxfdGFyX29iaiB7CisJc3RydWN0IGRibGxfYXR0cnMgYXR0cnM7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmhlYWQ7CS8qIExpc3Qgb2YgYWxsIG9wZW5lZCBsaWJyYXJpZXMgKi8KK307CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyA0IHR5cGVkZWZzIGFyZSAic3VwZXIgY2xhc3NlcyIgb2YgdGhlIGR5bmFtaWMgbG9hZGVyCisgKiAgbGlicmFyeSB0eXBlcyB1c2VkIGluIGR5bmFtaWMgbG9hZGVyIGZ1bmN0aW9ucyAoZHluYW1pY19sb2FkZXIuaCkuCisgKi8KKy8qCisgKiAgPT09PT09PT0gZGJsbF9zdHJlYW0gPT09PT09PT0KKyAqICBDb250YWlucyBkeW5hbWljX2xvYWRlcl9zdHJlYW0KKyAqLworc3RydWN0IGRibGxfc3RyZWFtIHsKKwlzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3RyZWFtIGRsX3N0cmVhbTsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliOworfTsKKworLyoKKyAqICA9PT09PT09PSBsZHJfc3ltYm9sID09PT09PT09CisgKi8KK3N0cnVjdCBsZHJfc3ltYm9sIHsKKwlzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltIGRsX3N5bWJvbDsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliOworfTsKKworLyoKKyAqICA9PT09PT09PSBkYmxsX2FsbG9jID09PT09PT09CisgKi8KK3N0cnVjdCBkYmxsX2FsbG9jIHsKKwlzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgZGxfYWxsb2M7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYjsKK307CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9pbml0X29iaiA9PT09PT09PQorICovCitzdHJ1Y3QgZGJsbF9pbml0X29iaiB7CisJc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgZGxfaW5pdDsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliOworfTsKKworLyoKKyAqICA9PT09PT09PSBEQkxMX0xpYnJhcnkgPT09PT09PT0KKyAqICBBIGxpYnJhcnkgaGFuZGxlIGlzIHJldHVybmVkIGJ5IERCTExfT3BlbigpIGFuZCBpcyBwYXNzZWQgdG8gZGJsbF9sb2FkKCkKKyAqICB0byBsb2FkIHN5bWJvbHMvY29kZS9kYXRhLCBhbmQgdG8gZGJsbF91bmxvYWQoKSwgdG8gcmVtb3ZlIHRoZQorICogIHN5bWJvbHMvY29kZS9kYXRhIGxvYWRlZCBieSBkYmxsX2xvYWQoKS4KKyAqLworCisvKgorICogID09PT09PT09IGRibGxfbGlicmFyeV9vYmogPT09PT09PT0KKyAqLworc3RydWN0IGRibGxfbGlicmFyeV9vYmogeworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpuZXh0OwkvKiBOZXh0IGxpYnJhcnkgaW4gdGFyZ2V0J3MgbGlzdCAqLworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpwcmV2OwkvKiBQcmV2aW91cyBpbiB0aGUgbGlzdCAqLworCXN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldF9vYmo7CS8qIHRhcmdldCBmb3IgdGhpcyBsaWJyYXJ5ICovCisKKwkvKiBPYmplY3RzIG5lZWRlZCBieSBkeW5hbWljIGxvYWRlciAqLworCXN0cnVjdCBkYmxsX3N0cmVhbSBzdHJlYW07CisJc3RydWN0IGxkcl9zeW1ib2wgc3ltYm9sOworCXN0cnVjdCBkYmxsX2FsbG9jIGFsbG9jYXRlOworCXN0cnVjdCBkYmxsX2luaXRfb2JqIGluaXQ7CisJdm9pZCAqZGxvYWRfbW9kX29iajsKKworCWNoYXIgKmZpbGVfbmFtZTsJLyogQ09GRiBmaWxlIG5hbWUgKi8KKwl2b2lkICpmcDsJCS8qIE9wYXF1ZSBmaWxlIGhhbmRsZSAqLworCXUzMiBlbnRyeTsJCS8qIEVudHJ5IHBvaW50ICovCisJdm9pZCAqZGVzYzsJLyogZGVzYyBvZiBET0ZGIGZpbGUgbG9hZGVkICovCisJdTMyIG9wZW5fcmVmOwkJLyogTnVtYmVyIG9mIHRpbWVzIG9wZW5lZCAqLworCXUzMiBsb2FkX3JlZjsJCS8qIE51bWJlciBvZiB0aW1lcyBsb2FkZWQgKi8KKwlzdHJ1Y3QgZ2hfdF9oYXNoX3RhYiAqc3ltX3RhYjsJLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzICovCisJdTMyIHVsX3BvczsKK307CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9zeW1ib2wgPT09PT09PT0KKyAqLworc3RydWN0IGRibGxfc3ltYm9sIHsKKwlzdHJ1Y3QgZGJsbF9zeW1fdmFsIHZhbHVlOworCWNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgdm9pZCBkb2ZfY2xvc2Uoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKnpsX2xpYik7CitzdGF0aWMgaW50IGRvZl9vcGVuKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIpOworc3RhdGljIHMzMiBub19vcChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpc3B0ciwgdm9pZCAqYnVmciwKKwkJIGxkcl9hZGRyIGxvY24sIHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICppbmZvLAorCQkgdW5zaWduZWQgYnl0c2l6ZSk7CisKKy8qCisgKiAgRnVuY3Rpb25zIGNhbGxlZCBieSBkeW5hbWljIGxvYWRlcgorICoKKyAqLworLyogZHluYW1pY19sb2FkZXJfc3RyZWFtICovCitzdGF0aWMgaW50IGRibGxfcmVhZF9idWZmZXIoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N0cmVhbSAqdGhpcywgdm9pZCAqYnVmZmVyLAorCQkJICAgIHVuc2lnbmVkIGJ1ZnNpemUpOworc3RhdGljIGludCBkYmxsX3NldF9maWxlX3Bvc24oc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N0cmVhbSAqdGhpcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBwb3MpOworLyogZHluYW1pY19sb2FkZXJfc3ltICovCitzdGF0aWMgc3RydWN0IGR5bmxvYWRfc3ltYm9sICpkYmxsX2ZpbmRfc3ltYm9sKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0gKnRoaXMsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKmRibGxfYWRkX3RvX3N5bWJvbF90YWJsZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltCisJCQkJCQkgICAgICAgKnRoaXMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbW9kdWxlX2lkKTsKK3N0YXRpYyBzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKmZpbmRfaW5fc3ltYm9sX3RhYmxlKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0KKwkJCQkJCSAgICp0aGlzLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJICAgdW5zaWduZWQgbW9kdWxlaWQpOworc3RhdGljIHZvaWQgZGJsbF9wdXJnZV9zeW1ib2xfdGFibGUoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqdGhpcywKKwkJCQkgICAgdW5zaWduZWQgbW9kdWxlX2lkKTsKK3N0YXRpYyB2b2lkICphbGxvY2F0ZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICp0aGlzLCB1bnNpZ25lZCBtZW1zaXplKTsKK3N0YXRpYyB2b2lkIGRlYWxsb2NhdGUoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqdGhpcywgdm9pZCAqbWVtX3B0cik7CitzdGF0aWMgdm9pZCBkYmxsX2Vycl9yZXBvcnQoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqdGhpcywgY29uc3QgY2hhciAqZXJyc3RyLAorCQkJICAgIHZhX2xpc3QgYXJncyk7CisvKiBkeW5hbWljX2xvYWRlcl9hbGxvY2F0ZSAqLworc3RhdGljIGludCBkYmxsX3JtbV9hbGxvYyhzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKnRoaXMsCisJCQkgIHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICppbmZvLCB1bnNpZ25lZCBhbGlnbik7CitzdGF0aWMgdm9pZCBybW1fZGVhbGxvYyhzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKnRoaXMsCisJCQlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbyk7CisKKy8qIGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKi8KK3N0YXRpYyBpbnQgY29ubmVjdChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpcyk7CitzdGF0aWMgaW50IHJlYWRfbWVtKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzLCB2b2lkICpidWYsCisJCSAgICBsZHJfYWRkciBhZGRyLCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbywKKwkJICAgIHVuc2lnbmVkIGJ5dGVzKTsKK3N0YXRpYyBpbnQgd3JpdGVfbWVtKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzLCB2b2lkICpidWYsCisJCSAgICAgbGRyX2FkZHIgYWRkciwgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmluZm8sCisJCSAgICAgdW5zaWduZWQgbmJ5dGVzKTsKK3N0YXRpYyBpbnQgZmlsbF9tZW0oc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKnRoaXMsIGxkcl9hZGRyIGFkZHIsCisJCSAgICBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbywgdW5zaWduZWQgYnl0ZXMsCisJCSAgICB1bnNpZ25lZCB2YWwpOworc3RhdGljIGludCBleGVjdXRlKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzLCBsZHJfYWRkciBzdGFydCk7CitzdGF0aWMgdm9pZCByZWxlYXNlKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzKTsKKworLyogc3ltYm9sIHRhYmxlIGhhc2ggZnVuY3Rpb25zICovCitzdGF0aWMgdTE2IG5hbWVfaGFzaCh2b2lkICprZXksIHUxNiBtYXhfYnVja2V0KTsKK3N0YXRpYyBib29sIG5hbWVfbWF0Y2godm9pZCAqa2V5LCB2b2lkICpzcCk7CitzdGF0aWMgdm9pZCBzeW1fZGVsZXRlKHZvaWQgKnZhbHVlKTsKKworc3RhdGljIHUzMiByZWZzOwkJLyogbW9kdWxlIHJlZmVyZW5jZSBjb3VudCAqLworCisvKiBTeW1ib2wgUmVkZWZpbml0aW9uICovCitzdGF0aWMgaW50IHJlZGVmaW5lZF9zeW1ib2w7CitzdGF0aWMgaW50IGdibF9zZWFyY2ggPSAxOworCisvKgorICogID09PT09PT09IGRibGxfY2xvc2UgPT09PT09PT0KKyAqLwordm9pZCBkYmxsX2Nsb3NlKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIpCit7CisJc3RydWN0IGRibGxfdGFyX29iaiAqemxfdGFyZ2V0OworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHpsX2xpYik7CisJREJDX1JFUVVJUkUoemxfbGliLT5vcGVuX3JlZiA+IDApOworCXpsX3RhcmdldCA9IHpsX2xpYi0+dGFyZ2V0X29iajsKKwl6bF9saWItPm9wZW5fcmVmLS07CisJaWYgKHpsX2xpYi0+b3Blbl9yZWYgPT0gMCkgeworCQkvKiBSZW1vdmUgbGlicmFyeSBmcm9tIGxpc3QgKi8KKwkJaWYgKHpsX3RhcmdldC0+aGVhZCA9PSB6bF9saWIpCisJCQl6bF90YXJnZXQtPmhlYWQgPSB6bF9saWItPm5leHQ7CisKKwkJaWYgKHpsX2xpYi0+cHJldikKKwkJCSh6bF9saWItPnByZXYpLT5uZXh0ID0gemxfbGliLT5uZXh0OworCisJCWlmICh6bF9saWItPm5leHQpCisJCQkoemxfbGliLT5uZXh0KS0+cHJldiA9IHpsX2xpYi0+cHJldjsKKworCQkvKiBGcmVlIERPRiByZXNvdXJjZXMgKi8KKwkJZG9mX2Nsb3NlKHpsX2xpYik7CisJCWtmcmVlKHpsX2xpYi0+ZmlsZV9uYW1lKTsKKworCQkvKiByZW1vdmUgc3ltYm9scyBmcm9tIHN5bWJvbCB0YWJsZSAqLworCQlpZiAoemxfbGliLT5zeW1fdGFiKQorCQkJZ2hfZGVsZXRlKHpsX2xpYi0+c3ltX3RhYik7CisKKwkJLyogcmVtb3ZlIHRoZSBsaWJyYXJ5IG9iamVjdCBpdHNlbGYgKi8KKwkJa2ZyZWUoemxfbGliKTsKKwkJemxfbGliID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9jcmVhdGUgPT09PT09PT0KKyAqLworaW50IGRibGxfY3JlYXRlKHN0cnVjdCBkYmxsX3Rhcl9vYmogKip0YXJnZXRfb2JqLAorCQkgICAgICAgc3RydWN0IGRibGxfYXR0cnMgKnBhdHRycykKK3sKKwlzdHJ1Y3QgZGJsbF90YXJfb2JqICpwemxfdGFyZ2V0OworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHBhdHRycyAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRSh0YXJnZXRfb2JqICE9IE5VTEwpOworCisJLyogQWxsb2NhdGUgREJMIHRhcmdldCBvYmplY3QgKi8KKwlwemxfdGFyZ2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRibGxfdGFyX29iaiksIEdGUF9LRVJORUwpOworCWlmICh0YXJnZXRfb2JqICE9IE5VTEwpIHsKKwkJaWYgKHB6bF90YXJnZXQgPT0gTlVMTCkgeworCQkJKnRhcmdldF9vYmogPSBOVUxMOworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCXB6bF90YXJnZXQtPmF0dHJzID0gKnBhdHRyczsKKwkJCSp0YXJnZXRfb2JqID0gKHN0cnVjdCBkYmxsX3Rhcl9vYmogKilwemxfdGFyZ2V0OworCQl9CisJCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgKnRhcmdldF9vYmopIHx8CisJCQkJKHN0YXR1cyAmJiAqdGFyZ2V0X29iaiA9PSBOVUxMKSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkYmxsX2RlbGV0ZSA9PT09PT09PQorICovCit2b2lkIGRibGxfZGVsZXRlKHN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZGJsbF90YXJfb2JqICp6bF90YXJnZXQgPSAoc3RydWN0IGRibGxfdGFyX29iaiAqKXRhcmdldDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRSh6bF90YXJnZXQpOworCisJaWYgKHpsX3RhcmdldCAhPSBOVUxMKQorCQlrZnJlZSh6bF90YXJnZXQpOworCit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9leGl0ID09PT09PT09CisgKiAgRGlzY29udGludWUgdXNhZ2Ugb2YgREJMIG1vZHVsZS4KKyAqLwordm9pZCBkYmxsX2V4aXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlyZWZzLS07CisKKwlpZiAocmVmcyA9PSAwKQorCQlnaF9leGl0KCk7CisKKwlEQkNfRU5TVVJFKHJlZnMgPj0gMCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9nZXRfYWRkciA9PT09PT09PQorICogIEdldCBhZGRyZXNzIG9mIG5hbWUgaW4gdGhlIHNwZWNpZmllZCBsaWJyYXJ5LgorICovCitib29sIGRibGxfZ2V0X2FkZHIoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKnpsX2xpYiwgY2hhciAqbmFtZSwKKwkJICAgc3RydWN0IGRibGxfc3ltX3ZhbCAqKnN5bV92YWwpCit7CisJc3RydWN0IGRibGxfc3ltYm9sICpzeW07CisJYm9vbCBzdGF0dXMgPSBmYWxzZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRSh6bF9saWIpOworCURCQ19SRVFVSVJFKG5hbWUgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoc3ltX3ZhbCAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRSh6bF9saWItPnN5bV90YWIgIT0gTlVMTCk7CisKKwlzeW0gPSAoc3RydWN0IGRibGxfc3ltYm9sICopZ2hfZmluZCh6bF9saWItPnN5bV90YWIsIG5hbWUpOworCWlmIChzeW0gIT0gTlVMTCkgeworCQkqc3ltX3ZhbCA9ICZzeW0tPnZhbHVlOworCQlzdGF0dXMgPSB0cnVlOworCX0KKworCWRldl9kYmcoYnJpZGdlLCAiJXM6IGxpYjogJXAgbmFtZTogJXMgcGFkZHI6ICVwLCBzdGF0dXMgMHgleFxuIiwKKwkJX19mdW5jX18sIHpsX2xpYiwgbmFtZSwgc3ltX3ZhbCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRibGxfZ2V0X2F0dHJzID09PT09PT09CisgKiAgUmV0cmlldmUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHRhcmdldC4KKyAqLwordm9pZCBkYmxsX2dldF9hdHRycyhzdHJ1Y3QgZGJsbF90YXJfb2JqICp0YXJnZXQsIHN0cnVjdCBkYmxsX2F0dHJzICpwYXR0cnMpCit7CisJc3RydWN0IGRibGxfdGFyX29iaiAqemxfdGFyZ2V0ID0gKHN0cnVjdCBkYmxsX3Rhcl9vYmogKil0YXJnZXQ7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoemxfdGFyZ2V0KTsKKwlEQkNfUkVRVUlSRShwYXR0cnMgIT0gTlVMTCk7CisKKwlpZiAoKHBhdHRycyAhPSBOVUxMKSAmJiAoemxfdGFyZ2V0ICE9IE5VTEwpKQorCQkqcGF0dHJzID0gemxfdGFyZ2V0LT5hdHRyczsKKworfQorCisvKgorICogID09PT09PT09IGRibGxfZ2V0X2NfYWRkciA9PT09PT09PQorICogIEdldCBhZGRyZXNzIG9mIGEgIkMiIG5hbWUgaW4gdGhlIHNwZWNpZmllZCBsaWJyYXJ5LgorICovCitib29sIGRibGxfZ2V0X2NfYWRkcihzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqemxfbGliLCBjaGFyICpuYW1lLAorCQkgICAgIHN0cnVjdCBkYmxsX3N5bV92YWwgKipzeW1fdmFsKQoreworCXN0cnVjdCBkYmxsX3N5bWJvbCAqc3ltOworCWNoYXIgY25hbWVbTUFYRVhQUiArIDFdOworCWJvb2wgc3RhdHVzID0gZmFsc2U7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoemxfbGliKTsKKwlEQkNfUkVRVUlSRShzeW1fdmFsICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHpsX2xpYi0+c3ltX3RhYiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShuYW1lICE9IE5VTEwpOworCisJY25hbWVbMF0gPSAnXyc7CisKKwlzdHJuY3B5KGNuYW1lICsgMSwgbmFtZSwgc2l6ZW9mKGNuYW1lKSAtIDIpOworCWNuYW1lW01BWEVYUFJdID0gJ1wwJzsJLyogaW5zdXJlICdcMCcgc3RyaW5nIHRlcm1pbmF0aW9uICovCisKKwkvKiBDaGVjayBmb3IgQyBuYW1lLCBpZiBub3QgZm91bmQgKi8KKwlzeW0gPSAoc3RydWN0IGRibGxfc3ltYm9sICopZ2hfZmluZCh6bF9saWItPnN5bV90YWIsIGNuYW1lKTsKKworCWlmIChzeW0gIT0gTlVMTCkgeworCQkqc3ltX3ZhbCA9ICZzeW0tPnZhbHVlOworCQlzdGF0dXMgPSB0cnVlOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9nZXRfc2VjdCA9PT09PT09PQorICogIEdldCB0aGUgYmFzZSBhZGRyZXNzIGFuZCBzaXplIChpbiBieXRlcykgb2YgYSBDT0ZGIHNlY3Rpb24uCisgKi8KK2ludCBkYmxsX2dldF9zZWN0KHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWIsIGNoYXIgKm5hbWUsIHUzMiAqcGFkZHIsCisJCQkgdTMyICpwc2l6ZSkKK3sKKwl1MzIgYnl0ZV9zaXplOworCWJvb2wgb3BlbmVkX2RvZmYgPSBmYWxzZTsKKwljb25zdCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqc2VjdCA9IE5VTEw7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKnpsX2xpYiA9IChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKWxpYjsKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShuYW1lICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHBhZGRyICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHBzaXplICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHpsX2xpYik7CisKKwkvKiBJZiBET0ZGIGZpbGUgaXMgbm90IG9wZW4sIHdlIG9wZW4gaXQuICovCisJaWYgKHpsX2xpYiAhPSBOVUxMKSB7CisJCWlmICh6bF9saWItPmZwID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IGRvZl9vcGVuKHpsX2xpYik7CisJCQlpZiAoIXN0YXR1cykKKwkJCQlvcGVuZWRfZG9mZiA9IHRydWU7CisKKwkJfSBlbHNlIHsKKwkJCSgqKHpsX2xpYi0+dGFyZ2V0X29iai0+YXR0cnMuZnNlZWspKSAoemxfbGliLT5mcCwKKwkJCQkJCQkgICAgICB6bF9saWItPnVsX3BvcywKKwkJCQkJCQkgICAgICBTRUVLX1NFVCk7CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKwlpZiAoIXN0YXR1cykgeworCQlieXRlX3NpemUgPSAxOworCQlpZiAoZGxvYWRfZ2V0X3NlY3Rpb25faW5mbyh6bF9saWItPmRlc2MsIG5hbWUsICZzZWN0KSkgeworCQkJKnBhZGRyID0gc2VjdC0+bG9hZF9hZGRyOworCQkJKnBzaXplID0gc2VjdC0+c2l6ZSAqIGJ5dGVfc2l6ZTsKKwkJCS8qIE1ha2Ugc3VyZSBzaXplIGlzIGV2ZW4gZm9yIGdvb2Qgc3dhcCAqLworCQkJaWYgKCpwc2l6ZSAlIDIpCisJCQkJKCpwc2l6ZSkrKzsKKworCQkJLyogQWxpZ24gc2l6ZSAqLworCQkJKnBzaXplID0gRE9GRl9BTElHTigqcHNpemUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVOWElPOworCQl9CisJfQorCWlmIChvcGVuZWRfZG9mZikgeworCQlkb2ZfY2xvc2UoemxfbGliKTsKKwkJb3BlbmVkX2RvZmYgPSBmYWxzZTsKKwl9CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBsaWI6ICVwIG5hbWU6ICVzIHBhZGRyOiAlcCBwc2l6ZTogJXAsICIKKwkJInN0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgbGliLCBuYW1lLCBwYWRkciwgcHNpemUsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRibGxfaW5pdCA9PT09PT09PQorICovCitib29sIGRibGxfaW5pdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlpZiAocmVmcyA9PSAwKQorCQlnaF9pbml0KCk7CisKKwlyZWZzKys7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqICA9PT09PT09PSBkYmxsX2xvYWQgPT09PT09PT0KKyAqLworaW50IGRibGxfbG9hZChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliLCBkYmxsX2ZsYWdzIGZsYWdzLAorCQkgICAgIHN0cnVjdCBkYmxsX2F0dHJzICphdHRycywgdTMyICplbnRyeSkKK3sKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqemxfbGliID0gKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICopbGliOworCXN0cnVjdCBkYmxsX3Rhcl9vYmogKmRiemw7CisJYm9vbCBnb3Rfc3ltYm9scyA9IHRydWU7CisJczMyIGVycjsKKwlpbnQgc3RhdHVzID0gMDsKKwlib29sIG9wZW5lZF9kb2ZmID0gZmFsc2U7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHpsX2xpYik7CisJREJDX1JFUVVJUkUoZW50cnkgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoYXR0cnMgIT0gTlVMTCk7CisKKwkvKgorCSAqICBMb2FkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KKwkgKi8KKwlpZiAoemxfbGliLT5sb2FkX3JlZiA9PSAwIHx8ICEoZmxhZ3MgJiBEQkxMX0RZTkFNSUMpKSB7CisJCWRiemwgPSB6bF9saWItPnRhcmdldF9vYmo7CisJCWRiemwtPmF0dHJzID0gKmF0dHJzOworCQkvKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciBzeW1ib2xzIGlmIG5vdCBhbHJlYWR5IGNyZWF0ZWQgKi8KKwkJaWYgKHpsX2xpYi0+c3ltX3RhYiA9PSBOVUxMKSB7CisJCQlnb3Rfc3ltYm9scyA9IGZhbHNlOworCQkJemxfbGliLT5zeW1fdGFiID0gZ2hfY3JlYXRlKE1BWEJVQ0tFVFMsCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkYmxsX3N5bWJvbCksCisJCQkJCQkgICAgbmFtZV9oYXNoLAorCQkJCQkJICAgIG5hbWVfbWF0Y2gsIHN5bV9kZWxldGUpOworCQkJaWYgKHpsX2xpYi0+c3ltX3RhYiA9PSBOVUxMKQorCQkJCXN0YXR1cyA9IC1FTk9NRU07CisKKwkJfQorCQkvKgorCQkgKiAgU2V0IHVwIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBkeW5hbWljIGxvYWRlcgorCQkgKi8KKwkJLyogU3RyZWFtICovCisJCXpsX2xpYi0+c3RyZWFtLmRsX3N0cmVhbS5yZWFkX2J1ZmZlciA9IGRibGxfcmVhZF9idWZmZXI7CisJCXpsX2xpYi0+c3RyZWFtLmRsX3N0cmVhbS5zZXRfZmlsZV9wb3NuID0gZGJsbF9zZXRfZmlsZV9wb3NuOworCQl6bF9saWItPnN0cmVhbS5saWIgPSB6bF9saWI7CisJCS8qIFN5bWJvbCAqLworCQl6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wuZmluZF9tYXRjaGluZ19zeW1ib2wgPQorCQkgICAgZGJsbF9maW5kX3N5bWJvbDsKKwkJaWYgKGdvdF9zeW1ib2xzKSB7CisJCQl6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wuYWRkX3RvX3N5bWJvbF90YWJsZSA9CisJCQkgICAgZmluZF9pbl9zeW1ib2xfdGFibGU7CisJCX0gZWxzZSB7CisJCQl6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wuYWRkX3RvX3N5bWJvbF90YWJsZSA9CisJCQkgICAgZGJsbF9hZGRfdG9fc3ltYm9sX3RhYmxlOworCQl9CisJCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5wdXJnZV9zeW1ib2xfdGFibGUgPQorCQkgICAgZGJsbF9wdXJnZV9zeW1ib2xfdGFibGU7CisJCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5kbG9hZF9hbGxvY2F0ZSA9IGFsbG9jYXRlOworCQl6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wuZGxvYWRfZGVhbGxvY2F0ZSA9IGRlYWxsb2NhdGU7CisJCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5lcnJvcl9yZXBvcnQgPSBkYmxsX2Vycl9yZXBvcnQ7CisJCXpsX2xpYi0+c3ltYm9sLmxpYiA9IHpsX2xpYjsKKwkJLyogQWxsb2NhdGUgKi8KKwkJemxfbGliLT5hbGxvY2F0ZS5kbF9hbGxvYy5kbG9hZF9hbGxvY2F0ZSA9IGRibGxfcm1tX2FsbG9jOworCQl6bF9saWItPmFsbG9jYXRlLmRsX2FsbG9jLmRsb2FkX2RlYWxsb2NhdGUgPSBybW1fZGVhbGxvYzsKKwkJemxfbGliLT5hbGxvY2F0ZS5saWIgPSB6bF9saWI7CisJCS8qIEluaXQgKi8KKwkJemxfbGliLT5pbml0LmRsX2luaXQuY29ubmVjdCA9IGNvbm5lY3Q7CisJCXpsX2xpYi0+aW5pdC5kbF9pbml0LnJlYWRtZW0gPSByZWFkX21lbTsKKwkJemxfbGliLT5pbml0LmRsX2luaXQud3JpdGVtZW0gPSB3cml0ZV9tZW07CisJCXpsX2xpYi0+aW5pdC5kbF9pbml0LmZpbGxtZW0gPSBmaWxsX21lbTsKKwkJemxfbGliLT5pbml0LmRsX2luaXQuZXhlY3V0ZSA9IGV4ZWN1dGU7CisJCXpsX2xpYi0+aW5pdC5kbF9pbml0LnJlbGVhc2UgPSByZWxlYXNlOworCQl6bF9saWItPmluaXQubGliID0gemxfbGliOworCQkvKiBJZiBDT0ZGIGZpbGUgaXMgbm90IG9wZW4sIHdlIG9wZW4gaXQuICovCisJCWlmICh6bF9saWItPmZwID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IGRvZl9vcGVuKHpsX2xpYik7CisJCQlpZiAoIXN0YXR1cykKKwkJCQlvcGVuZWRfZG9mZiA9IHRydWU7CisKKwkJfQorCQlpZiAoIXN0YXR1cykgeworCQkJemxfbGliLT51bF9wb3MgPSAoKih6bF9saWItPnRhcmdldF9vYmotPmF0dHJzLmZ0ZWxsKSkKKwkJCSAgICAoemxfbGliLT5mcCk7CisJCQkvKiBSZXNldCBmaWxlIGN1cnNvciAqLworCQkJKCooemxfbGliLT50YXJnZXRfb2JqLT5hdHRycy5mc2VlaykpICh6bF9saWItPmZwLAorCQkJCQkJCSAgICAgIChsb25nKTAsCisJCQkJCQkJICAgICAgU0VFS19TRVQpOworCQkJc3ltYm9sc19yZWxvYWRlZCA9IHRydWU7CisJCQkvKiBUaGUgNXRoIGFyZ3VtZW50LCBETE9BRF9JTklUQlNTLCB0ZWxscyB0aGUgRExMCisJCQkgKiBtb2R1bGUgdG8gemVyby1pbml0IGFsbCBCU1Mgc2VjdGlvbnMuICBJbiBnZW5lcmFsLAorCQkJICogdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFuZCBhbHNvIGluY3JlYXNlcyBsb2FkIHRpbWUuCisJCQkgKiBXZSBtYXkgd2FudCB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyICovCisJCQllcnIgPSBkeW5hbWljX2xvYWRfbW9kdWxlKCZ6bF9saWItPnN0cmVhbS5kbF9zdHJlYW0sCisJCQkJCQkgICZ6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wsCisJCQkJCQkgICZ6bF9saWItPmFsbG9jYXRlLmRsX2FsbG9jLAorCQkJCQkJICAmemxfbGliLT5pbml0LmRsX2luaXQsCisJCQkJCQkgIERMT0FEX0lOSVRCU1MsCisJCQkJCQkgICZ6bF9saWItPmRsb2FkX21vZF9vYmopOworCisJCQlpZiAoZXJyICE9IDApIHsKKwkJCQlzdGF0dXMgPSAtRUlMU0VROworCQkJfSBlbHNlIGlmIChyZWRlZmluZWRfc3ltYm9sKSB7CisJCQkJemxfbGliLT5sb2FkX3JlZisrOworCQkJCWRibGxfdW5sb2FkKHpsX2xpYiwgKHN0cnVjdCBkYmxsX2F0dHJzICopYXR0cnMpOworCQkJCXJlZGVmaW5lZF9zeW1ib2wgPSBmYWxzZTsKKwkJCQlzdGF0dXMgPSAtRUlMU0VROworCQkJfSBlbHNlIHsKKwkJCQkqZW50cnkgPSB6bF9saWItPmVudHJ5OworCQkJfQorCQl9CisJfQorCWlmICghc3RhdHVzKQorCQl6bF9saWItPmxvYWRfcmVmKys7CisKKwkvKiBDbGVhbiB1cCBET0ZGIHJlc291cmNlcyAqLworCWlmIChvcGVuZWRfZG9mZikKKwkJZG9mX2Nsb3NlKHpsX2xpYik7CisKKwlEQkNfRU5TVVJFKHN0YXR1cyB8fCB6bF9saWItPmxvYWRfcmVmID4gMCk7CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBsaWI6ICVwIGZsYWdzOiAweCV4IGVudHJ5OiAlcCwgc3RhdHVzIDB4JXhcbiIsCisJCV9fZnVuY19fLCBsaWIsIGZsYWdzLCBlbnRyeSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9sb2FkX3NlY3QgPT09PT09PT0KKyAqICBOb3Qgc3VwcG9ydGVkIGZvciBDT0ZGLgorICovCitpbnQgZGJsbF9sb2FkX3NlY3Qoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKnpsX2xpYiwgY2hhciAqc2VjX25hbWUsCisJCQkgIHN0cnVjdCBkYmxsX2F0dHJzICphdHRycykKK3sKKwlEQkNfUkVRVUlSRSh6bF9saWIpOworCisJcmV0dXJuIC1FTk9TWVM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9vcGVuID09PT09PT09CisgKi8KK2ludCBkYmxsX29wZW4oc3RydWN0IGRibGxfdGFyX29iaiAqdGFyZ2V0LCBjaGFyICpmaWxlLCBkYmxsX2ZsYWdzIGZsYWdzLAorCQkgICAgIHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICoqbGliX29iaikKK3sKKwlzdHJ1Y3QgZGJsbF90YXJfb2JqICp6bF90YXJnZXQgPSAoc3RydWN0IGRibGxfdGFyX29iaiAqKXRhcmdldDsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqemxfbGliID0gTlVMTDsKKwlzMzIgZXJyOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHpsX3RhcmdldCk7CisJREJDX1JFUVVJUkUoemxfdGFyZ2V0LT5hdHRycy5mb3BlbiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShmaWxlICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGxpYl9vYmogIT0gTlVMTCk7CisKKwl6bF9saWIgPSB6bF90YXJnZXQtPmhlYWQ7CisJd2hpbGUgKHpsX2xpYiAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoemxfbGliLT5maWxlX25hbWUsIGZpbGUpID09IDApIHsKKwkJCS8qIExpYnJhcnkgaXMgYWxyZWFkeSBvcGVuZWQgKi8KKwkJCXpsX2xpYi0+b3Blbl9yZWYrKzsKKwkJCWJyZWFrOworCQl9CisJCXpsX2xpYiA9IHpsX2xpYi0+bmV4dDsKKwl9CisJaWYgKHpsX2xpYiA9PSBOVUxMKSB7CisJCS8qIEFsbG9jYXRlIERCTCBsaWJyYXJ5IG9iamVjdCAqLworCQl6bF9saWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiksIEdGUF9LRVJORUwpOworCQlpZiAoemxfbGliID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQl6bF9saWItPnVsX3BvcyA9IDA7CisJCQkvKiBJbmNyZW1lbnQgcmVmIGNvdW50IHRvIGFsbG93IGNsb3NlIG9uIGZhaWx1cmUKKwkJCSAqIGxhdGVyIG9uICovCisJCQl6bF9saWItPm9wZW5fcmVmKys7CisJCQl6bF9saWItPnRhcmdldF9vYmogPSB6bF90YXJnZXQ7CisJCQkvKiBLZWVwIGEgY29weSBvZiB0aGUgZmlsZSBuYW1lICovCisJCQl6bF9saWItPmZpbGVfbmFtZSA9IGt6YWxsb2Moc3RybGVuKGZpbGUpICsgMSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICh6bF9saWItPmZpbGVfbmFtZSA9PSBOVUxMKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCX0gZWxzZSB7CisJCQkJc3RybmNweSh6bF9saWItPmZpbGVfbmFtZSwgZmlsZSwKKwkJCQkJc3RybGVuKGZpbGUpICsgMSk7CisJCQl9CisJCQl6bF9saWItPnN5bV90YWIgPSBOVUxMOworCQl9CisJfQorCS8qCisJICogIFNldCB1cCBvYmplY3RzIG5lZWRlZCBieSB0aGUgZHluYW1pYyBsb2FkZXIKKwkgKi8KKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfY29udDsKKworCS8qIFN0cmVhbSAqLworCXpsX2xpYi0+c3RyZWFtLmRsX3N0cmVhbS5yZWFkX2J1ZmZlciA9IGRibGxfcmVhZF9idWZmZXI7CisJemxfbGliLT5zdHJlYW0uZGxfc3RyZWFtLnNldF9maWxlX3Bvc24gPSBkYmxsX3NldF9maWxlX3Bvc247CisJemxfbGliLT5zdHJlYW0ubGliID0gemxfbGliOworCS8qIFN5bWJvbCAqLworCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5hZGRfdG9fc3ltYm9sX3RhYmxlID0gZGJsbF9hZGRfdG9fc3ltYm9sX3RhYmxlOworCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5maW5kX21hdGNoaW5nX3N5bWJvbCA9IGRibGxfZmluZF9zeW1ib2w7CisJemxfbGliLT5zeW1ib2wuZGxfc3ltYm9sLnB1cmdlX3N5bWJvbF90YWJsZSA9IGRibGxfcHVyZ2Vfc3ltYm9sX3RhYmxlOworCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5kbG9hZF9hbGxvY2F0ZSA9IGFsbG9jYXRlOworCXpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbC5kbG9hZF9kZWFsbG9jYXRlID0gZGVhbGxvY2F0ZTsKKwl6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wuZXJyb3JfcmVwb3J0ID0gZGJsbF9lcnJfcmVwb3J0OworCXpsX2xpYi0+c3ltYm9sLmxpYiA9IHpsX2xpYjsKKwkvKiBBbGxvY2F0ZSAqLworCXpsX2xpYi0+YWxsb2NhdGUuZGxfYWxsb2MuZGxvYWRfYWxsb2NhdGUgPSBkYmxsX3JtbV9hbGxvYzsKKwl6bF9saWItPmFsbG9jYXRlLmRsX2FsbG9jLmRsb2FkX2RlYWxsb2NhdGUgPSBybW1fZGVhbGxvYzsKKwl6bF9saWItPmFsbG9jYXRlLmxpYiA9IHpsX2xpYjsKKwkvKiBJbml0ICovCisJemxfbGliLT5pbml0LmRsX2luaXQuY29ubmVjdCA9IGNvbm5lY3Q7CisJemxfbGliLT5pbml0LmRsX2luaXQucmVhZG1lbSA9IHJlYWRfbWVtOworCXpsX2xpYi0+aW5pdC5kbF9pbml0LndyaXRlbWVtID0gd3JpdGVfbWVtOworCXpsX2xpYi0+aW5pdC5kbF9pbml0LmZpbGxtZW0gPSBmaWxsX21lbTsKKwl6bF9saWItPmluaXQuZGxfaW5pdC5leGVjdXRlID0gZXhlY3V0ZTsKKwl6bF9saWItPmluaXQuZGxfaW5pdC5yZWxlYXNlID0gcmVsZWFzZTsKKwl6bF9saWItPmluaXQubGliID0gemxfbGliOworCWlmICghc3RhdHVzICYmIHpsX2xpYi0+ZnAgPT0gTlVMTCkKKwkJc3RhdHVzID0gZG9mX29wZW4oemxfbGliKTsKKworCXpsX2xpYi0+dWxfcG9zID0gKCooemxfbGliLT50YXJnZXRfb2JqLT5hdHRycy5mdGVsbCkpICh6bF9saWItPmZwKTsKKwkoKih6bF9saWItPnRhcmdldF9vYmotPmF0dHJzLmZzZWVrKSkgKHpsX2xpYi0+ZnAsIChsb25nKTAsIFNFRUtfU0VUKTsKKwkvKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciBzeW1ib2xzIGlmIGZsYWcgaXMgc2V0ICovCisJaWYgKHpsX2xpYi0+c3ltX3RhYiAhPSBOVUxMIHx8ICEoZmxhZ3MgJiBEQkxMX1NZTUIpKQorCQlnb3RvIGZ1bmNfY29udDsKKworCXpsX2xpYi0+c3ltX3RhYiA9CisJICAgIGdoX2NyZWF0ZShNQVhCVUNLRVRTLCBzaXplb2Yoc3RydWN0IGRibGxfc3ltYm9sKSwgbmFtZV9oYXNoLAorCQkgICAgICBuYW1lX21hdGNoLCBzeW1fZGVsZXRlKTsKKwlpZiAoemxfbGliLT5zeW1fdGFiID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQkvKiBEbyBhIGZha2UgbG9hZCB0byBnZXQgc3ltYm9scyAtIHNldCB3cml0ZSBmdW5jIHRvIG5vX29wICovCisJCXpsX2xpYi0+aW5pdC5kbF9pbml0LndyaXRlbWVtID0gbm9fb3A7CisJCWVyciA9IGR5bmFtaWNfb3Blbl9tb2R1bGUoJnpsX2xpYi0+c3RyZWFtLmRsX3N0cmVhbSwKKwkJCQkJICAmemxfbGliLT5zeW1ib2wuZGxfc3ltYm9sLAorCQkJCQkgICZ6bF9saWItPmFsbG9jYXRlLmRsX2FsbG9jLAorCQkJCQkgICZ6bF9saWItPmluaXQuZGxfaW5pdCwgMCwKKwkJCQkJICAmemxfbGliLT5kbG9hZF9tb2Rfb2JqKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlzdGF0dXMgPSAtRUlMU0VROworCQl9IGVsc2UgeworCQkJLyogTm93IHRoYXQgd2UgaGF2ZSB0aGUgc3ltYm9sIHRhYmxlLCB3ZSBjYW4gdW5sb2FkICovCisJCQllcnIgPSBkeW5hbWljX3VubG9hZF9tb2R1bGUoemxfbGliLT5kbG9hZF9tb2Rfb2JqLAorCQkJCQkJICAgICZ6bF9saWItPnN5bWJvbC5kbF9zeW1ib2wsCisJCQkJCQkgICAgJnpsX2xpYi0+YWxsb2NhdGUuZGxfYWxsb2MsCisJCQkJCQkgICAgJnpsX2xpYi0+aW5pdC5kbF9pbml0KTsKKwkJCWlmIChlcnIgIT0gMCkKKwkJCQlzdGF0dXMgPSAtRUlMU0VROworCisJCQl6bF9saWItPmRsb2FkX21vZF9vYmogPSBOVUxMOworCQl9CisJfQorZnVuY19jb250OgorCWlmICghc3RhdHVzKSB7CisJCWlmICh6bF9saWItPm9wZW5fcmVmID09IDEpIHsKKwkJCS8qIEZpcnN0IHRpbWUgb3BlbmVkIC0gaW5zZXJ0IGluIGxpc3QgKi8KKwkJCWlmICh6bF90YXJnZXQtPmhlYWQpCisJCQkJKHpsX3RhcmdldC0+aGVhZCktPnByZXYgPSB6bF9saWI7CisKKwkJCXpsX2xpYi0+cHJldiA9IE5VTEw7CisJCQl6bF9saWItPm5leHQgPSB6bF90YXJnZXQtPmhlYWQ7CisJCQl6bF90YXJnZXQtPmhlYWQgPSB6bF9saWI7CisJCX0KKwkJKmxpYl9vYmogPSAoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKil6bF9saWI7CisJfSBlbHNlIHsKKwkJKmxpYl9vYmogPSBOVUxMOworCQlpZiAoemxfbGliICE9IE5VTEwpCisJCQlkYmxsX2Nsb3NlKChzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKXpsX2xpYik7CisKKwl9CisJREJDX0VOU1VSRSgoIXN0YXR1cyAmJiAoemxfbGliLT5vcGVuX3JlZiA+IDApICYmICpsaWJfb2JqKQorCQkJCXx8IChzdGF0dXMgJiYgKmxpYl9vYmogPT0gTlVMTCkpOworCisJZGV2X2RiZyhicmlkZ2UsICIlczogdGFyZ2V0OiAlcCBmaWxlOiAlcyBsaWJfb2JqOiAlcCwgc3RhdHVzIDB4JXhcbiIsCisJCV9fZnVuY19fLCB0YXJnZXQsIGZpbGUsIGxpYl9vYmosIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRibGxfcmVhZF9zZWN0ID09PT09PT09CisgKiAgR2V0IHRoZSBjb250ZW50IG9mIGEgQ09GRiBzZWN0aW9uLgorICovCitpbnQgZGJsbF9yZWFkX3NlY3Qoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwgY2hhciAqbmFtZSwKKwkJCSAgY2hhciAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqemxfbGliID0gKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICopbGliOworCWJvb2wgb3BlbmVkX2RvZmYgPSBmYWxzZTsKKwl1MzIgYnl0ZV9zaXplOwkJLyogc2l6ZSBvZiBieXRlcyAqLworCXUzMiB1bF9zZWN0X3NpemU7CS8qIHNpemUgb2Ygc2VjdGlvbiAqLworCWNvbnN0IHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICpzZWN0ID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRSh6bF9saWIpOworCURCQ19SRVFVSVJFKG5hbWUgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoYnVmICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHNpemUgIT0gMCk7CisKKwkvKiBJZiBET0ZGIGZpbGUgaXMgbm90IG9wZW4sIHdlIG9wZW4gaXQuICovCisJaWYgKHpsX2xpYiAhPSBOVUxMKSB7CisJCWlmICh6bF9saWItPmZwID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IGRvZl9vcGVuKHpsX2xpYik7CisJCQlpZiAoIXN0YXR1cykKKwkJCQlvcGVuZWRfZG9mZiA9IHRydWU7CisKKwkJfSBlbHNlIHsKKwkJCSgqKHpsX2xpYi0+dGFyZ2V0X29iai0+YXR0cnMuZnNlZWspKSAoemxfbGliLT5mcCwKKwkJCQkJCQkgICAgICB6bF9saWItPnVsX3BvcywKKwkJCQkJCQkgICAgICBTRUVLX1NFVCk7CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfY29udDsKKworCWJ5dGVfc2l6ZSA9IDE7CisJaWYgKCFkbG9hZF9nZXRfc2VjdGlvbl9pbmZvKHpsX2xpYi0+ZGVzYywgbmFtZSwgJnNlY3QpKSB7CisJCXN0YXR1cyA9IC1FTlhJTzsKKwkJZ290byBmdW5jX2NvbnQ7CisJfQorCS8qCisJICogRW5zdXJlIHRoZSBzdXBwbGllZCBidWZmZXIgc2l6ZSBpcyBzdWZmaWNpZW50IHRvIHN0b3JlCisJICogdGhlIHNlY3Rpb24gYnVmIHRvIGJlIHJlYWQuCisJICovCisJdWxfc2VjdF9zaXplID0gc2VjdC0+c2l6ZSAqIGJ5dGVfc2l6ZTsKKwkvKiBNYWtlIHN1cmUgc2l6ZSBpcyBldmVuIGZvciBnb29kIHN3YXAgKi8KKwlpZiAodWxfc2VjdF9zaXplICUgMikKKwkJdWxfc2VjdF9zaXplKys7CisKKwkvKiBBbGlnbiBzaXplICovCisJdWxfc2VjdF9zaXplID0gRE9GRl9BTElHTih1bF9zZWN0X3NpemUpOworCWlmICh1bF9zZWN0X3NpemUgPiBzaXplKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9IGVsc2UgeworCQlpZiAoIWRsb2FkX2dldF9zZWN0aW9uKHpsX2xpYi0+ZGVzYywgc2VjdCwgYnVmKSkKKwkJCXN0YXR1cyA9IC1FQkFERjsKKworCX0KK2Z1bmNfY29udDoKKwlpZiAob3BlbmVkX2RvZmYpIHsKKwkJZG9mX2Nsb3NlKHpsX2xpYik7CisJCW9wZW5lZF9kb2ZmID0gZmFsc2U7CisJfQorCisJZGV2X2RiZyhicmlkZ2UsICIlczogbGliOiAlcCBuYW1lOiAlcyBidWY6ICVwIHNpemU6IDB4JXgsICIKKwkJInN0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgbGliLCBuYW1lLCBidWYsIHNpemUsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkYmxsX3NldF9hdHRycyA9PT09PT09PQorICogIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdGFyZ2V0LgorICovCit2b2lkIGRibGxfc2V0X2F0dHJzKHN0cnVjdCBkYmxsX3Rhcl9vYmogKnRhcmdldCwgc3RydWN0IGRibGxfYXR0cnMgKnBhdHRycykKK3sKKwlzdHJ1Y3QgZGJsbF90YXJfb2JqICp6bF90YXJnZXQgPSAoc3RydWN0IGRibGxfdGFyX29iaiAqKXRhcmdldDsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoemxfdGFyZ2V0KTsKKwlEQkNfUkVRVUlSRShwYXR0cnMgIT0gTlVMTCk7CisKKwlpZiAoKHBhdHRycyAhPSBOVUxMKSAmJiAoemxfdGFyZ2V0ICE9IE5VTEwpKQorCQl6bF90YXJnZXQtPmF0dHJzID0gKnBhdHRyczsKKworfQorCisvKgorICogID09PT09PT09IGRibGxfdW5sb2FkID09PT09PT09CisgKi8KK3ZvaWQgZGJsbF91bmxvYWQoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzKQoreworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIgPSAoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKilsaWI7CisJczMyIGVyciA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoemxfbGliKTsKKwlEQkNfUkVRVUlSRSh6bF9saWItPmxvYWRfcmVmID4gMCk7CisJZGV2X2RiZyhicmlkZ2UsICIlczogbGliOiAlcFxuIiwgX19mdW5jX18sIGxpYik7CisJemxfbGliLT5sb2FkX3JlZi0tOworCS8qIFVubG9hZCBvbmx5IGlmIHJlZmVyZW5jZSBjb3VudCBpcyAwICovCisJaWYgKHpsX2xpYi0+bG9hZF9yZWYgIT0gMCkKKwkJZ290byBmdW5jX2VuZDsKKworCXpsX2xpYi0+dGFyZ2V0X29iai0+YXR0cnMgPSAqYXR0cnM7CisJaWYgKHpsX2xpYi0+ZGxvYWRfbW9kX29iaikgeworCQllcnIgPSBkeW5hbWljX3VubG9hZF9tb2R1bGUoemxfbGliLT5kbG9hZF9tb2Rfb2JqLAorCQkJCQkgICAgJnpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbCwKKwkJCQkJICAgICZ6bF9saWItPmFsbG9jYXRlLmRsX2FsbG9jLAorCQkJCQkgICAgJnpsX2xpYi0+aW5pdC5kbF9pbml0KTsKKwkJaWYgKGVyciAhPSAwKQorCQkJZGV2X2RiZyhicmlkZ2UsICIlczogZmFpbGVkOiAweCV4XG4iLCBfX2Z1bmNfXywgZXJyKTsKKwl9CisJLyogcmVtb3ZlIHN5bWJvbHMgZnJvbSBzeW1ib2wgdGFibGUgKi8KKwlpZiAoemxfbGliLT5zeW1fdGFiICE9IE5VTEwpIHsKKwkJZ2hfZGVsZXRlKHpsX2xpYi0+c3ltX3RhYik7CisJCXpsX2xpYi0+c3ltX3RhYiA9IE5VTEw7CisJfQorCS8qIGRlbGV0ZSBET0ZGIGRlc2Mgc2luY2UgaXQgaG9sZHMgKmxvdHMqIG9mIGhvc3QgT1MKKwkgKiByZXNvdXJjZXMgKi8KKwlkb2ZfY2xvc2UoemxfbGliKTsKK2Z1bmNfZW5kOgorCURCQ19FTlNVUkUoemxfbGliLT5sb2FkX3JlZiA+PSAwKTsKK30KKworLyoKKyAqICA9PT09PT09PSBkYmxsX3VubG9hZF9zZWN0ID09PT09PT09CisgKiAgTm90IHN1cHBvcnRlZCBmb3IgQ09GRi4KKyAqLworaW50IGRibGxfdW5sb2FkX3NlY3Qoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYiwgY2hhciAqc2VjX25hbWUsCisJCQkgICAgc3RydWN0IGRibGxfYXR0cnMgKmF0dHJzKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShzZWNfbmFtZSAhPSBOVUxMKTsKKworCXJldHVybiAtRU5PU1lTOworfQorCisvKgorICogID09PT09PT09IGRvZl9jbG9zZSA9PT09PT09PQorICovCitzdGF0aWMgdm9pZCBkb2ZfY2xvc2Uoc3RydWN0IGRibGxfbGlicmFyeV9vYmogKnpsX2xpYikKK3sKKwlpZiAoemxfbGliLT5kZXNjKSB7CisJCWRsb2FkX21vZHVsZV9jbG9zZSh6bF9saWItPmRlc2MpOworCQl6bF9saWItPmRlc2MgPSBOVUxMOworCX0KKwkvKiBjbG9zZSBmaWxlICovCisJaWYgKHpsX2xpYi0+ZnApIHsKKwkJKHpsX2xpYi0+dGFyZ2V0X29iai0+YXR0cnMuZmNsb3NlKSAoemxfbGliLT5mcCk7CisJCXpsX2xpYi0+ZnAgPSBOVUxMOworCX0KK30KKworLyoKKyAqICA9PT09PT09PSBkb2Zfb3BlbiA9PT09PT09PQorICovCitzdGF0aWMgaW50IGRvZl9vcGVuKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIpCit7CisJdm9pZCAqb3BlbiA9ICooemxfbGliLT50YXJnZXRfb2JqLT5hdHRycy5mb3Blbik7CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBGaXJzdCBvcGVuIHRoZSBmaWxlIGZvciB0aGUgZHluYW1pYyBsb2FkZXIsIHRoZW4gb3BlbiBDT0YgKi8KKwl6bF9saWItPmZwID0KKwkgICAgKHZvaWQgKikoKGRibGxfZl9vcGVuX2Z4bikgKG9wZW4pKSAoemxfbGliLT5maWxlX25hbWUsICJyYiIpOworCisJLyogT3BlbiBET0ZGIG1vZHVsZSAqLworCWlmICh6bF9saWItPmZwICYmIHpsX2xpYi0+ZGVzYyA9PSBOVUxMKSB7CisJCSgqKHpsX2xpYi0+dGFyZ2V0X29iai0+YXR0cnMuZnNlZWspKSAoemxfbGliLT5mcCwgKGxvbmcpMCwKKwkJCQkJCSAgICAgIFNFRUtfU0VUKTsKKwkJemxfbGliLT5kZXNjID0KKwkJICAgIGRsb2FkX21vZHVsZV9vcGVuKCZ6bF9saWItPnN0cmVhbS5kbF9zdHJlYW0sCisJCQkJICAgICAgJnpsX2xpYi0+c3ltYm9sLmRsX3N5bWJvbCk7CisJCWlmICh6bF9saWItPmRlc2MgPT0gTlVMTCkgeworCQkJKHpsX2xpYi0+dGFyZ2V0X29iai0+YXR0cnMuZmNsb3NlKSAoemxfbGliLT5mcCk7CisJCQl6bF9saWItPmZwID0gTlVMTDsKKwkJCXN0YXR1cyA9IC1FQkFERjsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FQkFERjsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5hbWVfaGFzaCA9PT09PT09PQorICovCitzdGF0aWMgdTE2IG5hbWVfaGFzaCh2b2lkICprZXksIHUxNiBtYXhfYnVja2V0KQoreworCXUxNiByZXQ7CisJdTE2IGhhc2g7CisJY2hhciAqbmFtZSA9IChjaGFyICopa2V5OworCisJREJDX1JFUVVJUkUobmFtZSAhPSBOVUxMKTsKKworCWhhc2ggPSAwOworCisJd2hpbGUgKCpuYW1lKSB7CisJCWhhc2ggPDw9IDE7CisJCWhhc2ggXj0gKm5hbWUrKzsKKwl9CisKKwlyZXQgPSBoYXNoICUgbWF4X2J1Y2tldDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbmFtZV9tYXRjaCA9PT09PT09PQorICovCitzdGF0aWMgYm9vbCBuYW1lX21hdGNoKHZvaWQgKmtleSwgdm9pZCAqc3ApCit7CisJREJDX1JFUVVJUkUoa2V5ICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHNwICE9IE5VTEwpOworCisJaWYgKChrZXkgIT0gTlVMTCkgJiYgKHNwICE9IE5VTEwpKSB7CisJCWlmIChzdHJjbXAoKGNoYXIgKilrZXksICgoc3RydWN0IGRibGxfc3ltYm9sICopc3ApLT5uYW1lKSA9PQorCQkgICAgMCkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9fb3AgPT09PT09PT0KKyAqLworc3RhdGljIGludCBub19vcChzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpc3B0ciwgdm9pZCAqYnVmciwKKwkJIGxkcl9hZGRyIGxvY24sIHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICppbmZvLCB1bnNpZ25lZCBieXRzaXplKQoreworCXJldHVybiAxOworfQorCisvKgorICogID09PT09PT09IHN5bV9kZWxldGUgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgc3ltX2RlbGV0ZSh2b2lkICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZGJsbF9zeW1ib2wgKnNwID0gKHN0cnVjdCBkYmxsX3N5bWJvbCAqKXZhbHVlOworCisJa2ZyZWUoc3AtPm5hbWUpOworfQorCisvKgorICogIER5bmFtaWMgTG9hZGVyIEZ1bmN0aW9ucworICovCisKKy8qIGR5bmFtaWNfbG9hZGVyX3N0cmVhbSAqLworLyoKKyAqICA9PT09PT09PSBkYmxsX3JlYWRfYnVmZmVyID09PT09PT09CisgKi8KK3N0YXRpYyBpbnQgZGJsbF9yZWFkX2J1ZmZlcihzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3RyZWFtICp0aGlzLCB2b2lkICpidWZmZXIsCisJCQkgICAgdW5zaWduZWQgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3QgZGJsbF9zdHJlYW0gKnBzdHJlYW0gPSAoc3RydWN0IGRibGxfc3RyZWFtICopdGhpczsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliOworCWludCBieXRlc19yZWFkID0gMDsKKworCURCQ19SRVFVSVJFKHRoaXMgIT0gTlVMTCk7CisJbGliID0gcHN0cmVhbS0+bGliOworCURCQ19SRVFVSVJFKGxpYik7CisKKwlpZiAobGliICE9IE5VTEwpIHsKKwkJYnl0ZXNfcmVhZCA9CisJCSAgICAoKihsaWItPnRhcmdldF9vYmotPmF0dHJzLmZyZWFkKSkgKGJ1ZmZlciwgMSwgYnVmc2l6ZSwKKwkJCQkJCSAgICAgICBsaWItPmZwKTsKKwl9CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9zZXRfZmlsZV9wb3NuID09PT09PT09CisgKi8KK3N0YXRpYyBpbnQgZGJsbF9zZXRfZmlsZV9wb3NuKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zdHJlYW0gKnRoaXMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgcG9zKQoreworCXN0cnVjdCBkYmxsX3N0cmVhbSAqcHN0cmVhbSA9IChzdHJ1Y3QgZGJsbF9zdHJlYW0gKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJaW50IHN0YXR1cyA9IDA7CQkvKiBTdWNjZXNzICovCisKKwlEQkNfUkVRVUlSRSh0aGlzICE9IE5VTEwpOworCWxpYiA9IHBzdHJlYW0tPmxpYjsKKwlEQkNfUkVRVUlSRShsaWIpOworCisJaWYgKGxpYiAhPSBOVUxMKSB7CisJCXN0YXR1cyA9ICgqKGxpYi0+dGFyZ2V0X29iai0+YXR0cnMuZnNlZWspKSAobGliLT5mcCwgKGxvbmcpcG9zLAorCQkJCQkJCSAgICBTRUVLX1NFVCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogZHluYW1pY19sb2FkZXJfc3ltICovCisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9maW5kX3N5bWJvbCA9PT09PT09PQorICovCitzdGF0aWMgc3RydWN0IGR5bmxvYWRfc3ltYm9sICpkYmxsX2ZpbmRfc3ltYm9sKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0gKnRoaXMsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkeW5sb2FkX3N5bWJvbCAqcmV0X3N5bTsKKwlzdHJ1Y3QgbGRyX3N5bWJvbCAqbGRyX3N5bSA9IChzdHJ1Y3QgbGRyX3N5bWJvbCAqKXRoaXM7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYjsKKwlzdHJ1Y3QgZGJsbF9zeW1fdmFsICpkYmxsX3N5bSA9IE5VTEw7CisJYm9vbCBzdGF0dXMgPSBmYWxzZTsJLyogU3ltYm9sIG5vdCBmb3VuZCB5ZXQgKi8KKworCURCQ19SRVFVSVJFKHRoaXMgIT0gTlVMTCk7CisJbGliID0gbGRyX3N5bS0+bGliOworCURCQ19SRVFVSVJFKGxpYik7CisKKwlpZiAobGliICE9IE5VTEwpIHsKKwkJaWYgKGxpYi0+dGFyZ2V0X29iai0+YXR0cnMuc3ltX2xvb2t1cCkgeworCQkJLyogQ2hlY2sgY3VycmVudCBsaWIgKyBiYXNlIGxpYiArIGRlcCBsaWIgKworCQkJICogcGVyc2lzdGVudCBsaWIgKi8KKwkJCXN0YXR1cyA9ICgqKGxpYi0+dGFyZ2V0X29iai0+YXR0cnMuc3ltX2xvb2t1cCkpCisJCQkgICAgKGxpYi0+dGFyZ2V0X29iai0+YXR0cnMuc3ltX2hhbmRsZSwKKwkJCSAgICAgbGliLT50YXJnZXRfb2JqLT5hdHRycy5zeW1fYXJnLAorCQkJICAgICBsaWItPnRhcmdldF9vYmotPmF0dHJzLnJtbV9oYW5kbGUsIG5hbWUsCisJCQkgICAgICZkYmxsX3N5bSk7CisJCX0gZWxzZSB7CisJCQkvKiBKdXN0IGNoZWNrIGN1cnJlbnQgbGliIGZvciBzeW1ib2wgKi8KKwkJCXN0YXR1cyA9IGRibGxfZ2V0X2FkZHIoKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICopbGliLAorCQkJCQkgICAgICAgKGNoYXIgKiluYW1lLCAmZGJsbF9zeW0pOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBkYmxsX2dldF9jX2FkZHIoKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICopCisJCQkJCQkgICAgbGliLCAoY2hhciAqKW5hbWUsCisJCQkJCQkgICAgJmRibGxfc3ltKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghc3RhdHVzICYmIGdibF9zZWFyY2gpCisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IFN5bWJvbCBub3QgZm91bmQ6ICVzXG4iLCBfX2Z1bmNfXywgbmFtZSk7CisKKwlEQkNfQVNTRVJUKChzdGF0dXMgJiYgKGRibGxfc3ltICE9IE5VTEwpKQorCQkgICB8fCAoIXN0YXR1cyAmJiAoZGJsbF9zeW0gPT0gTlVMTCkpKTsKKworCXJldF9zeW0gPSAoc3RydWN0IGR5bmxvYWRfc3ltYm9sICopZGJsbF9zeW07CisJcmV0dXJuIHJldF9zeW07Cit9CisKKy8qCisgKiAgPT09PT09PT0gZmluZF9pbl9zeW1ib2xfdGFibGUgPT09PT09PT0KKyAqLworc3RhdGljIHN0cnVjdCBkeW5sb2FkX3N5bWJvbCAqZmluZF9pbl9zeW1ib2xfdGFibGUoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bQorCQkJCQkJICAgKnRoaXMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICB1bnNpZ25lZCBtb2R1bGVpZCkKK3sKKwlzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKnJldF9zeW07CisJc3RydWN0IGxkcl9zeW1ib2wgKmxkcl9zeW0gPSAoc3RydWN0IGxkcl9zeW1ib2wgKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJc3RydWN0IGRibGxfc3ltYm9sICpzeW07CisKKwlEQkNfUkVRVUlSRSh0aGlzICE9IE5VTEwpOworCWxpYiA9IGxkcl9zeW0tPmxpYjsKKwlEQkNfUkVRVUlSRShsaWIpOworCURCQ19SRVFVSVJFKGxpYi0+c3ltX3RhYiAhPSBOVUxMKTsKKworCXN5bSA9IChzdHJ1Y3QgZGJsbF9zeW1ib2wgKilnaF9maW5kKGxpYi0+c3ltX3RhYiwgKGNoYXIgKiluYW1lKTsKKworCXJldF9zeW0gPSAoc3RydWN0IGR5bmxvYWRfc3ltYm9sICopJnN5bS0+dmFsdWU7CisJcmV0dXJuIHJldF9zeW07Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGJsbF9hZGRfdG9fc3ltYm9sX3RhYmxlID09PT09PT09CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKmRibGxfYWRkX3RvX3N5bWJvbF90YWJsZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltCisJCQkJCQkgICAgICAgKnRoaXMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbW9kdWxlX2lkKQoreworCXN0cnVjdCBkYmxsX3N5bWJvbCAqc3ltX3B0ciA9IE5VTEw7CisJc3RydWN0IGRibGxfc3ltYm9sIHN5bWJvbDsKKwlzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKmRibGxfc3ltID0gTlVMTDsKKwlzdHJ1Y3QgbGRyX3N5bWJvbCAqbGRyX3N5bSA9IChzdHJ1Y3QgbGRyX3N5bWJvbCAqKXRoaXM7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYjsKKwlzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKnJldDsKKworCURCQ19SRVFVSVJFKHRoaXMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobmFtZSk7CisJbGliID0gbGRyX3N5bS0+bGliOworCURCQ19SRVFVSVJFKGxpYik7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgc3ltYm9sIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBzeW1ib2wgdGFibGUgKi8KKwlpZiAoIShsaWItPnRhcmdldF9vYmotPmF0dHJzLmJhc2VfaW1hZ2UpKSB7CisJCWdibF9zZWFyY2ggPSBmYWxzZTsKKwkJZGJsbF9zeW0gPSBkYmxsX2ZpbmRfc3ltYm9sKHRoaXMsIG5hbWUpOworCQlnYmxfc2VhcmNoID0gdHJ1ZTsKKwkJaWYgKGRibGxfc3ltKSB7CisJCQlyZWRlZmluZWRfc3ltYm9sID0gdHJ1ZTsKKwkJCWRldl9kYmcoYnJpZGdlLCAiJXMgYWxyZWFkeSBkZWZpbmVkIGluIHN5bWJvbCB0YWJsZVxuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCS8qIEFsbG9jYXRlIHN0cmluZyB0byBjb3B5IHN5bWJvbCBuYW1lICovCisJc3ltYm9sLm5hbWUgPSBremFsbG9jKHN0cmxlbigoY2hhciAqY29uc3QpbmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3ltYm9sLm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc3ltYm9sLm5hbWUgIT0gTlVMTCkgeworCQkvKiBKdXN0IGNvcHkgbmFtZSAodmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZHluYW1pYyBsb2FkZXIpICovCisJCXN0cm5jcHkoc3ltYm9sLm5hbWUsIChjaGFyICpjb25zdCluYW1lLAorCQkJc3RybGVuKChjaGFyICpjb25zdCluYW1lKSArIDEpOworCisJCS8qIEFkZCBzeW1ib2wgdG8gc3ltYm9sIHRhYmxlICovCisJCXN5bV9wdHIgPQorCQkgICAgKHN0cnVjdCBkYmxsX3N5bWJvbCAqKWdoX2luc2VydChsaWItPnN5bV90YWIsICh2b2lkICopbmFtZSwKKwkJCQkJCSAgICAodm9pZCAqKSZzeW1ib2wpOworCQlpZiAoc3ltX3B0ciA9PSBOVUxMKQorCQkJa2ZyZWUoc3ltYm9sLm5hbWUpOworCisJfQorCWlmIChzeW1fcHRyICE9IE5VTEwpCisJCXJldCA9IChzdHJ1Y3QgZHlubG9hZF9zeW1ib2wgKikmc3ltX3B0ci0+dmFsdWU7CisJZWxzZQorCQlyZXQgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBkYmxsX3B1cmdlX3N5bWJvbF90YWJsZSA9PT09PT09PQorICovCitzdGF0aWMgdm9pZCBkYmxsX3B1cmdlX3N5bWJvbF90YWJsZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICp0aGlzLAorCQkJCSAgICB1bnNpZ25lZCBtb2R1bGVfaWQpCit7CisJc3RydWN0IGxkcl9zeW1ib2wgKmxkcl9zeW0gPSAoc3RydWN0IGxkcl9zeW1ib2wgKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisKKwlEQkNfUkVRVUlSRSh0aGlzICE9IE5VTEwpOworCWxpYiA9IGxkcl9zeW0tPmxpYjsKKwlEQkNfUkVRVUlSRShsaWIpOworCisJLyogTWF5IG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nICovCit9CisKKy8qCisgKiAgPT09PT09PT0gYWxsb2NhdGUgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgKmFsbG9jYXRlKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9zeW0gKnRoaXMsIHVuc2lnbmVkIG1lbXNpemUpCit7CisJc3RydWN0IGxkcl9zeW1ib2wgKmxkcl9zeW0gPSAoc3RydWN0IGxkcl9zeW1ib2wgKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJdm9pZCAqYnVmOworCisJREJDX1JFUVVJUkUodGhpcyAhPSBOVUxMKTsKKwlsaWIgPSBsZHJfc3ltLT5saWI7CisJREJDX1JFUVVJUkUobGliKTsKKworCWJ1ZiA9IGt6YWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogID09PT09PT09IGRlYWxsb2NhdGUgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgZGVhbGxvY2F0ZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfc3ltICp0aGlzLCB2b2lkICptZW1fcHRyKQoreworCXN0cnVjdCBsZHJfc3ltYm9sICpsZHJfc3ltID0gKHN0cnVjdCBsZHJfc3ltYm9sICopdGhpczsKKwlzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliOworCisJREJDX1JFUVVJUkUodGhpcyAhPSBOVUxMKTsKKwlsaWIgPSBsZHJfc3ltLT5saWI7CisJREJDX1JFUVVJUkUobGliKTsKKworCWtmcmVlKG1lbV9wdHIpOworfQorCisvKgorICogID09PT09PT09IGRibGxfZXJyX3JlcG9ydCA9PT09PT09PQorICovCitzdGF0aWMgdm9pZCBkYmxsX2Vycl9yZXBvcnQoc3RydWN0IGR5bmFtaWNfbG9hZGVyX3N5bSAqdGhpcywgY29uc3QgY2hhciAqZXJyc3RyLAorCQkJICAgIHZhX2xpc3QgYXJncykKK3sKKwlzdHJ1Y3QgbGRyX3N5bWJvbCAqbGRyX3N5bSA9IChzdHJ1Y3QgbGRyX3N5bWJvbCAqKXRoaXM7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYjsKKwljaGFyIHRlbXBfYnVmW01BWEVYUFJdOworCisJREJDX1JFUVVJUkUodGhpcyAhPSBOVUxMKTsKKwlsaWIgPSBsZHJfc3ltLT5saWI7CisJREJDX1JFUVVJUkUobGliKTsKKwl2c25wcmludGYoKGNoYXIgKil0ZW1wX2J1ZiwgTUFYRVhQUiwgKGNoYXIgKillcnJzdHIsIGFyZ3MpOworCWRldl9kYmcoYnJpZGdlLCAiJXNcbiIsIHRlbXBfYnVmKTsKK30KKworLyogZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKi8KKworLyoKKyAqICA9PT09PT09PSBkYmxsX3JtbV9hbGxvYyA9PT09PT09PQorICovCitzdGF0aWMgaW50IGRibGxfcm1tX2FsbG9jKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9hbGxvY2F0ZSAqdGhpcywKKwkJCSAgc3RydWN0IGxkcl9zZWN0aW9uX2luZm8gKmluZm8sIHVuc2lnbmVkIGFsaWduKQoreworCXN0cnVjdCBkYmxsX2FsbG9jICpkYmxsX2FsbG9jX29iaiA9IChzdHJ1Y3QgZGJsbF9hbGxvYyAqKXRoaXM7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYjsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgbWVtX3NlY3RfdHlwZTsKKwlzdHJ1Y3Qgcm1tX2FkZHIgcm1tX2FkZHJfb2JqOworCXMzMiByZXQgPSB0cnVlOworCXVuc2lnbmVkIHN0eXBlID0gRExPQURfU0VDVElPTl9UWVBFKGluZm8tPnR5cGUpOworCWNoYXIgKnRva2VuID0gTlVMTDsKKwljaGFyICpzel9zZWNfbGFzdF90b2tlbiA9IE5VTEw7CisJY2hhciAqc3pfbGFzdF90b2tlbiA9IE5VTEw7CisJY2hhciAqc3pfc2VjdF9uYW1lID0gTlVMTDsKKwljaGFyICpwc3pfY3VyOworCXMzMiB0b2tlbl9sZW4gPSAwOworCXMzMiBzZWdfaWQgPSAtMTsKKwlzMzIgcmVxID0gLTE7CisJczMyIGNvdW50ID0gMDsKKwl1MzIgYWxsb2Nfc2l6ZSA9IDA7CisJdTMyIHJ1bl9hZGRyX2ZsYWcgPSAwOworCisJREJDX1JFUVVJUkUodGhpcyAhPSBOVUxMKTsKKwlsaWIgPSBkYmxsX2FsbG9jX29iai0+bGliOworCURCQ19SRVFVSVJFKGxpYik7CisKKwltZW1fc2VjdF90eXBlID0KKwkgICAgKHN0eXBlID09IERMT0FEX1RFWFQpID8gREJMTF9DT0RFIDogKHN0eXBlID09CisJCQkJCQkgRExPQURfQlNTKSA/IERCTExfQlNTIDoKKwkgICAgREJMTF9EQVRBOworCisJLyogQXR0ZW1wdCB0byBleHRyYWN0IHRoZSBzZWdtZW50IElEIGFuZCByZXF1aXJlbWVudCBpbmZvcm1hdGlvbiBmcm9tCisJICAgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gKi8KKwlEQkNfUkVRVUlSRShpbmZvLT5uYW1lKTsKKwl0b2tlbl9sZW4gPSBzdHJsZW4oKGNoYXIgKikoaW5mby0+bmFtZSkpICsgMTsKKworCXN6X3NlY3RfbmFtZSA9IGt6YWxsb2ModG9rZW5fbGVuLCBHRlBfS0VSTkVMKTsKKwlzel9sYXN0X3Rva2VuID0ga3phbGxvYyh0b2tlbl9sZW4sIEdGUF9LRVJORUwpOworCXN6X3NlY19sYXN0X3Rva2VuID0ga3phbGxvYyh0b2tlbl9sZW4sIEdGUF9LRVJORUwpOworCisJaWYgKHN6X3NlY3RfbmFtZSA9PSBOVUxMIHx8IHN6X3NlY19sYXN0X3Rva2VuID09IE5VTEwgfHwKKwkgICAgc3pfbGFzdF90b2tlbiA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZnVuY19jb250OworCX0KKwlzdHJuY3B5KHN6X3NlY3RfbmFtZSwgKGNoYXIgKikoaW5mby0+bmFtZSksIHRva2VuX2xlbik7CisJcHN6X2N1ciA9IHN6X3NlY3RfbmFtZTsKKwl3aGlsZSAoKHRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCAiOiIpKSAmJiAqdG9rZW4gIT0gJ1wwJykgeworCQlzdHJuY3B5KHN6X3NlY19sYXN0X3Rva2VuLCBzel9sYXN0X3Rva2VuLAorCQkJc3RybGVuKHN6X2xhc3RfdG9rZW4pICsgMSk7CisJCXN0cm5jcHkoc3pfbGFzdF90b2tlbiwgdG9rZW4sIHN0cmxlbih0b2tlbikgKyAxKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsICI6Iik7CisJCWNvdW50Kys7CS8qIG9wdGltaXplcyBwcm9jZXNzaW5nICovCisJfQorCS8qIElmIHRva2VuIGlzIDAgb3IgMSwgYW5kIHN6X3NlY19sYXN0X3Rva2VuIGlzIERZTl9EQVJBTSBvciBEWU5fU0FSQU0sCisJICAgb3IgRFlOX0VYVEVSTkFMLCB0aGVuIG1lbSBncmFudWxhcml0eSBpbmZvcm1hdGlvbiBpcyBwcmVzZW50CisJICAgd2l0aGluIHRoZSBzZWN0aW9uIG5hbWUgLSBvbmx5IHByb2Nlc3MgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlCisJICAgdG9rZW5zIHdpdGhpbiB0aGUgc2VjdGlvbiBuYW1lIChqdXN0IGEgbWlub3Igb3B0aW1pemF0aW9uKSAqLworCWlmIChjb3VudCA+PSAzKQorCQlzdHJpY3Rfc3RydG9sKHN6X2xhc3RfdG9rZW4sIDEwLCAobG9uZyAqKSZyZXEpOworCisJaWYgKChyZXEgPT0gMCkgfHwgKHJlcSA9PSAxKSkgeworCQlpZiAoc3RyY21wKHN6X3NlY19sYXN0X3Rva2VuLCAiRFlOX0RBUkFNIikgPT0gMCkgeworCQkJc2VnX2lkID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoc3pfc2VjX2xhc3RfdG9rZW4sICJEWU5fU0FSQU0iKSA9PSAwKSB7CisJCQkJc2VnX2lkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0cmNtcChzel9zZWNfbGFzdF90b2tlbiwKKwkJCQkJICAgIkRZTl9FWFRFUk5BTCIpID09IDApCisJCQkJCXNlZ19pZCA9IDI7CisJCQl9CisJCX0KKwl9CitmdW5jX2NvbnQ6CisJa2ZyZWUoc3pfc2VjdF9uYW1lKTsKKwlzel9zZWN0X25hbWUgPSBOVUxMOworCWtmcmVlKHN6X2xhc3RfdG9rZW4pOworCXN6X2xhc3RfdG9rZW4gPSBOVUxMOworCWtmcmVlKHN6X3NlY19sYXN0X3Rva2VuKTsKKwlzel9zZWNfbGFzdF90b2tlbiA9IE5VTEw7CisKKwlpZiAobWVtX3NlY3RfdHlwZSA9PSBEQkxMX0NPREUpCisJCWFsbG9jX3NpemUgPSBpbmZvLT5zaXplICsgR0VNX0wxUF9QUkVGRVRDSF9TSVpFOworCWVsc2UKKwkJYWxsb2Nfc2l6ZSA9IGluZm8tPnNpemU7CisKKwlpZiAoaW5mby0+bG9hZF9hZGRyICE9IGluZm8tPnJ1bl9hZGRyKQorCQlydW5fYWRkcl9mbGFnID0gMTsKKwkvKiBUT0RPIC0gaWRlYWxseSwgd2UgY2FuIHBhc3MgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBhbHNvCisJICogZnJvbSBoZXJlICovCisJaWYgKGxpYiAhPSBOVUxMKSB7CisJCXN0YXR1cyA9CisJCSAgICAobGliLT50YXJnZXRfb2JqLT5hdHRycy5hbGxvYykgKGxpYi0+dGFyZ2V0X29iai0+YXR0cnMuCisJCQkJCQkgICAgcm1tX2hhbmRsZSwgbWVtX3NlY3RfdHlwZSwKKwkJCQkJCSAgICBhbGxvY19zaXplLCBhbGlnbiwKKwkJCQkJCSAgICAodTMyICopICZybW1fYWRkcl9vYmosCisJCQkJCQkgICAgc2VnX2lkLCByZXEsIGZhbHNlKTsKKwl9CisJaWYgKHN0YXR1cykgeworCQlyZXQgPSBmYWxzZTsKKwl9IGVsc2UgeworCQkvKiBSTU0gZ2l2ZXMgd29yZCBhZGRyZXNzLiBOZWVkIHRvIGNvbnZlcnQgdG8gYnl0ZSBhZGRyZXNzICovCisJCWluZm8tPmxvYWRfYWRkciA9IHJtbV9hZGRyX29iai5hZGRyICogRFNQV09SRFNJWkU7CisJCWlmICghcnVuX2FkZHJfZmxhZykKKwkJCWluZm8tPnJ1bl9hZGRyID0gaW5mby0+bG9hZF9hZGRyOworCQlpbmZvLT5jb250ZXh0ID0gKHUzMikgcm1tX2FkZHJfb2JqLnNlZ2lkOworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiAlcyBiYXNlID0gMHgleCBsZW4gPSAweCV4LCAiCisJCQkiaW5mby0+cnVuX2FkZHIgMHgleCwgaW5mby0+bG9hZF9hZGRyIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaW5mby0+bmFtZSwgaW5mby0+bG9hZF9hZGRyIC8gRFNQV09SRFNJWkUsCisJCQlpbmZvLT5zaXplIC8gRFNQV09SRFNJWkUsIGluZm8tPnJ1bl9hZGRyLAorCQkJaW5mby0+bG9hZF9hZGRyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBybW1fZGVhbGxvYyA9PT09PT09PQorICovCitzdGF0aWMgdm9pZCBybW1fZGVhbGxvYyhzdHJ1Y3QgZHluYW1pY19sb2FkZXJfYWxsb2NhdGUgKnRoaXMsCisJCQlzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZGJsbF9hbGxvYyAqZGJsbF9hbGxvY19vYmogPSAoc3RydWN0IGRibGxfYWxsb2MgKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJdTMyIHNlZ2lkOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIHN0eXBlID0gRExPQURfU0VDVElPTl9UWVBFKGluZm8tPnR5cGUpOworCXUzMiBtZW1fc2VjdF90eXBlOworCXUzMiBmcmVlX3NpemUgPSAwOworCisJbWVtX3NlY3RfdHlwZSA9CisJICAgIChzdHlwZSA9PSBETE9BRF9URVhUKSA/IERCTExfQ09ERSA6IChzdHlwZSA9PQorCQkJCQkJIERMT0FEX0JTUykgPyBEQkxMX0JTUyA6CisJICAgIERCTExfREFUQTsKKwlEQkNfUkVRVUlSRSh0aGlzICE9IE5VTEwpOworCWxpYiA9IGRibGxfYWxsb2Nfb2JqLT5saWI7CisJREJDX1JFUVVJUkUobGliKTsKKwkvKiBzZWdpZCB3YXMgc2V0IGJ5IGFsbG9jIGZ1bmN0aW9uICovCisJc2VnaWQgPSAodTMyKSBpbmZvLT5jb250ZXh0OworCWlmIChtZW1fc2VjdF90eXBlID09IERCTExfQ09ERSkKKwkJZnJlZV9zaXplID0gaW5mby0+c2l6ZSArIEdFTV9MMVBfUFJFRkVUQ0hfU0laRTsKKwllbHNlCisJCWZyZWVfc2l6ZSA9IGluZm8tPnNpemU7CisJaWYgKGxpYiAhPSBOVUxMKSB7CisJCXN0YXR1cyA9CisJCSAgICAobGliLT50YXJnZXRfb2JqLT5hdHRycy5mcmVlKSAobGliLT50YXJnZXRfb2JqLT5hdHRycy4KKwkJCQkJCSAgIHN5bV9oYW5kbGUsIHNlZ2lkLAorCQkJCQkJICAgaW5mby0+bG9hZF9hZGRyIC8KKwkJCQkJCSAgIERTUFdPUkRTSVpFLCBmcmVlX3NpemUsCisJCQkJCQkgICBmYWxzZSk7CisJfQorfQorCisvKiBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICovCisvKgorICogID09PT09PT09IGNvbm5lY3QgPT09PT09PT0KKyAqLworc3RhdGljIGludCBjb25uZWN0KHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzKQoreworCXJldHVybiB0cnVlOworfQorCisvKgorICogID09PT09PT09IHJlYWRfbWVtID09PT09PT09CisgKiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGltcGxlbWVudGVkLgorICovCitzdGF0aWMgaW50IHJlYWRfbWVtKHN0cnVjdCBkeW5hbWljX2xvYWRlcl9pbml0aWFsaXplICp0aGlzLCB2b2lkICpidWYsCisJCSAgICBsZHJfYWRkciBhZGRyLCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbywKKwkJICAgIHVuc2lnbmVkIG5ieXRlcykKK3sKKwlzdHJ1Y3QgZGJsbF9pbml0X29iaiAqaW5pdF9vYmogPSAoc3RydWN0IGRibGxfaW5pdF9vYmogKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCisJREJDX1JFUVVJUkUodGhpcyAhPSBOVUxMKTsKKwlsaWIgPSBpbml0X29iai0+bGliOworCURCQ19SRVFVSVJFKGxpYik7CisJLyogTmVlZCBicmlkZ2VfYnJkX3JlYWQgZnVuY3Rpb24gKi8KKwlyZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworLyoKKyAqICA9PT09PT09PSB3cml0ZV9tZW0gPT09PT09PT0KKyAqLworc3RhdGljIGludCB3cml0ZV9tZW0oc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKnRoaXMsIHZvaWQgKmJ1ZiwKKwkJICAgICBsZHJfYWRkciBhZGRyLCBzdHJ1Y3QgbGRyX3NlY3Rpb25faW5mbyAqaW5mbywKKwkJICAgICB1bnNpZ25lZCBieXRlcykKK3sKKwlzdHJ1Y3QgZGJsbF9pbml0X29iaiAqaW5pdF9vYmogPSAoc3RydWN0IGRibGxfaW5pdF9vYmogKil0aGlzOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJc3RydWN0IGRibGxfdGFyX29iaiAqdGFyZ2V0X29iajsKKwlzdHJ1Y3QgZGJsbF9zZWN0X2luZm8gc2VjdF9pbmZvOworCXUzMiBtZW1fc2VjdF90eXBlOworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCURCQ19SRVFVSVJFKHRoaXMgIT0gTlVMTCk7CisJbGliID0gaW5pdF9vYmotPmxpYjsKKwlpZiAoIWxpYikKKwkJcmV0dXJuIGZhbHNlOworCisJdGFyZ2V0X29iaiA9IGxpYi0+dGFyZ2V0X29iajsKKworCW1lbV9zZWN0X3R5cGUgPQorCSAgICAoRExPQURfU0VDVElPTl9UWVBFKGluZm8tPnR5cGUpID09CisJICAgICBETE9BRF9URVhUKSA/IERCTExfQ09ERSA6IERCTExfREFUQTsKKwlpZiAodGFyZ2V0X29iaiAmJiB0YXJnZXRfb2JqLT5hdHRycy53cml0ZSkgeworCQlyZXQgPQorCQkgICAgKCp0YXJnZXRfb2JqLT5hdHRycy53cml0ZSkgKHRhcmdldF9vYmotPmF0dHJzLmlucHV0X3BhcmFtcywKKwkJCQkJCWFkZHIsIGJ1ZiwgYnl0ZXMsCisJCQkJCQltZW1fc2VjdF90eXBlKTsKKworCQlpZiAodGFyZ2V0X29iai0+YXR0cnMubG9nX3dyaXRlKSB7CisJCQlzZWN0X2luZm8ubmFtZSA9IGluZm8tPm5hbWU7CisJCQlzZWN0X2luZm8uc2VjdF9ydW5fYWRkciA9IGluZm8tPnJ1bl9hZGRyOworCQkJc2VjdF9pbmZvLnNlY3RfbG9hZF9hZGRyID0gaW5mby0+bG9hZF9hZGRyOworCQkJc2VjdF9pbmZvLnNpemUgPSBpbmZvLT5zaXplOworCQkJc2VjdF9pbmZvLnR5cGUgPSBtZW1fc2VjdF90eXBlOworCQkJLyogUGFzcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSd2ZSB3cml0dGVuIHRvCisJCQkgKiBhbm90aGVyIG1vZHVsZSAqLworCQkJKCp0YXJnZXRfb2JqLT5hdHRycy5sb2dfd3JpdGUpICh0YXJnZXRfb2JqLT5hdHRycy4KKwkJCQkJCQlsb2dfd3JpdGVfaGFuZGxlLAorCQkJCQkJCSZzZWN0X2luZm8sIGFkZHIsCisJCQkJCQkJYnl0ZXMpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZmlsbF9tZW0gPT09PT09PT0KKyAqICBGaWxsIGJ5dGVzIG9mIG1lbW9yeSBhdCBhIGdpdmVuIGFkZHJlc3Mgd2l0aCBhIGdpdmVuIHZhbHVlIGJ5CisgKiAgd3JpdGluZyBmcm9tIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHZhbHVlLiAgV3JpdGUgaW4KKyAqICBzZXRzIG9mIE1BWEVYUFIgKDEyOCkgYnl0ZXMgdG8gYXZvaWQgbGFyZ2Ugc3RhY2sgYnVmZmVyIGlzc3Vlcy4KKyAqLworc3RhdGljIGludCBmaWxsX21lbShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpcywgbGRyX2FkZHIgYWRkciwKKwkJICAgIHN0cnVjdCBsZHJfc2VjdGlvbl9pbmZvICppbmZvLCB1bnNpZ25lZCBieXRlcywgdW5zaWduZWQgdmFsKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKwljaGFyICpwYnVmOworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CisJc3RydWN0IGRibGxfaW5pdF9vYmogKmluaXRfb2JqID0gKHN0cnVjdCBkYmxsX2luaXRfb2JqICopdGhpczsKKworCURCQ19SRVFVSVJFKHRoaXMgIT0gTlVMTCk7CisJbGliID0gaW5pdF9vYmotPmxpYjsKKwlwYnVmID0gTlVMTDsKKwkvKiBQYXNzIHRoZSBOVUxMIHBvaW50ZXIgdG8gd3JpdGVfbWVtIHRvIGdldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiBTaGFyZWQKKwkgICBtZW1vcnkuIFRoaXMgaXMgYSB0cmljayB0byBqdXN0IGdldCB0aGUgc3RhcnQgYWRkcmVzcywgdGhlcmUgaXMgbm8KKwkgICB3cml0aW5nIHRha2luZyBwbGFjZSB3aXRoIHRoaXMgV3JpdGVtZW0KKwkgKi8KKwlpZiAoKGxpYi0+dGFyZ2V0X29iai0+YXR0cnMud3JpdGUpICE9IChkYmxsX3dyaXRlX2Z4bikgbm9fb3ApCisJCXdyaXRlX21lbSh0aGlzLCAmcGJ1ZiwgYWRkciwgaW5mbywgMCk7CisJaWYgKHBidWYpCisJCW1lbXNldChwYnVmLCB2YWwsIGJ5dGVzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZXhlY3V0ZSA9PT09PT09PQorICovCitzdGF0aWMgaW50IGV4ZWN1dGUoc3RydWN0IGR5bmFtaWNfbG9hZGVyX2luaXRpYWxpemUgKnRoaXMsIGxkcl9hZGRyIHN0YXJ0KQoreworCXN0cnVjdCBkYmxsX2luaXRfb2JqICppbml0X29iaiA9IChzdHJ1Y3QgZGJsbF9pbml0X29iaiAqKXRoaXM7CisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmxpYjsKKwlib29sIHJldCA9IHRydWU7CisKKwlEQkNfUkVRVUlSRSh0aGlzICE9IE5VTEwpOworCWxpYiA9IGluaXRfb2JqLT5saWI7CisJREJDX1JFUVVJUkUobGliKTsKKwkvKiBTYXZlIGVudHJ5IHBvaW50ICovCisJaWYgKGxpYiAhPSBOVUxMKQorCQlsaWItPmVudHJ5ID0gKHUzMikgc3RhcnQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IHJlbGVhc2UgPT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgcmVsZWFzZShzdHJ1Y3QgZHluYW1pY19sb2FkZXJfaW5pdGlhbGl6ZSAqdGhpcykKK3sKK30KKworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9CQUNLVFJBQ0UKKy8qKgorICogIGZpbmRfc3ltYm9sX2NvbnRleHQgLSBCYXNpYyBzeW1ib2wgY29udGV4dCBzdHJ1Y3R1cmUKKyAqIEBhZGRyZXNzOgkJU3ltYm9sIEFkcmVzcworICogQG9mZnNldF9yYW5nZToJCU9mZnNldCByYW5nZSB3aGVyZSB0aGUgc2VhcmNoIGZvciB0aGUgRFNQIHN5bWJvbAorICoJCQlzdGFydGVkLgorICogQGN1cl9iZXN0X29mZnNldDoJQmVzdCBvZmZzZXQgdG8gc3RhcnQgbG9va2luZyBmb3IgdGhlIERTUCBzeW1ib2wKKyAqIEBzeW1fYWRkcjoJCUFkZHJlc3Mgb2YgdGhlIERTUCBzeW1ib2wKKyAqIEBuYW1lOgkJU3ltYm9sIG5hbWUKKyAqCisgKi8KK3N0cnVjdCBmaW5kX3N5bWJvbF9jb250ZXh0IHsKKwkvKiBpbnB1dCAqLworCXUzMiBhZGRyZXNzOworCXUzMiBvZmZzZXRfcmFuZ2U7CisJLyogc3RhdGUgKi8KKwl1MzIgY3VyX2Jlc3Rfb2Zmc2V0OworCS8qIG91dHB1dCAqLworCXUzMiBzeW1fYWRkcjsKKwljaGFyIG5hbWVbMTIwXTsKK307CisKKy8qKgorICogZmluZF9zeW1ib2xfY2FsbGJhY2soKSAtIFZhbGlkYXRlcyBzeW1ib2wgYWRkcmVzcyBhbmQgY29waWVzIHRoZSBzeW1ib2wgbmFtZQorICoJCQl0byB0aGUgdXNlciBkYXRhLgorICogQGVsZW06CQlkc3AgbGlicmFyeSBjb250ZXh0CisgKiBAdXNlcl9kYXRhOgkJRmluZCBzeW1ib2wgY29udGV4dAorICoKKyAqLwordm9pZCBmaW5kX3N5bWJvbF9jYWxsYmFjayh2b2lkICplbGVtLCB2b2lkICp1c2VyX2RhdGEpCit7CisJc3RydWN0IGRibGxfc3ltYm9sICpzeW1ib2wgPSBlbGVtOworCXN0cnVjdCBmaW5kX3N5bWJvbF9jb250ZXh0ICpjb250ZXh0ID0gdXNlcl9kYXRhOworCXUzMiBzeW1ib2xfYWRkciA9IHN5bWJvbC0+dmFsdWUudmFsdWU7CisJdTMyIG9mZnNldCA9IGNvbnRleHQtPmFkZHJlc3MgLSBzeW1ib2xfYWRkcjsKKworCS8qCisJICogQWRkcmVzcyBnaXZlbiBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHN5bWJvbCBhZGRyZXNzLAorCSAqIHN5bWJvbCBhZGRyZXNzIHNob3VsZCBiZSAgd2l0aGluIHNwZWNpZmllZCByYW5nZQorCSAqIGFuZCB0aGUgb2Zmc2V0IHNob3VsZCBiZSBiZXR0ZXIgdGhhbiBwcmV2aW91cyBvbmUKKwkgKi8KKwlpZiAoY29udGV4dC0+YWRkcmVzcyA+PSBzeW1ib2xfYWRkciAmJiBzeW1ib2xfYWRkciA8ICh1MzIpLTEgJiYKKwkJb2Zmc2V0IDwgY29udGV4dC0+Y3VyX2Jlc3Rfb2Zmc2V0KSB7CisJCWNvbnRleHQtPmN1cl9iZXN0X29mZnNldCA9IG9mZnNldDsKKwkJY29udGV4dC0+c3ltX2FkZHIgPSBzeW1ib2xfYWRkcjsKKwkJc3RybmNweShjb250ZXh0LT5uYW1lLCBzeW1ib2wtPm5hbWUsIHNpemVvZihjb250ZXh0LT5uYW1lKSk7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGRibGxfZmluZF9kc3Bfc3ltYm9sKCkgLSBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZHNwIHN5bWJvbCBmcm9tIHRoZSBkc3AgYmluYXJ5LgorICogQHpsX2xpYjoJCURTUCBiaW5hcnkgb2JqIGxpYnJhcnkgcG9pbnRlcgorICogQGFkZHJlc3M6CQlHaXZlbiBhZGRyZXNzIHRvIGZpbmQgdGhlIGRzcCBzeW1ib2wKKyAqIEBvZmZzZXRfcmFuZ2U6CQlvZmZzZXQgcmFuZ2UgdG8gbG9vayBmb3IgZHNwIHN5bWJvbAorICogQHN5bV9hZGRyX291dHB1dDoJU3ltYm9sIE91dHB1dCBhZGRyZXNzCisgKiBAbmFtZV9vdXRwdXQ6CQlTdHJpbmcgd2l0aCB0aGUgZHNwIHN5bWJvbAorICoKKyAqIAlUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZHNwIHN5bWJvbCBmcm9tIHRoZSBkc3AgYmluYXJ5LgorICovCitib29sIGRibGxfZmluZF9kc3Bfc3ltYm9sKHN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICp6bF9saWIsIHUzMiBhZGRyZXNzLAorCQkJCXUzMiBvZmZzZXRfcmFuZ2UsIHUzMiAqc3ltX2FkZHJfb3V0cHV0LAorCQkJCWNoYXIgKm5hbWVfb3V0cHV0KQoreworCWJvb2wgc3RhdHVzID0gZmFsc2U7CisJc3RydWN0IGZpbmRfc3ltYm9sX2NvbnRleHQgY29udGV4dDsKKworCWNvbnRleHQuYWRkcmVzcyA9IGFkZHJlc3M7CisJY29udGV4dC5vZmZzZXRfcmFuZ2UgPSBvZmZzZXRfcmFuZ2U7CisJY29udGV4dC5jdXJfYmVzdF9vZmZzZXQgPSBvZmZzZXRfcmFuZ2U7CisJY29udGV4dC5zeW1fYWRkciA9IDA7CisJY29udGV4dC5uYW1lWzBdID0gJ1wwJzsKKworCWdoX2l0ZXJhdGUoemxfbGliLT5zeW1fdGFiLCBmaW5kX3N5bWJvbF9jYWxsYmFjaywgJmNvbnRleHQpOworCisJaWYgKGNvbnRleHQubmFtZVswXSkgeworCQlzdGF0dXMgPSB0cnVlOworCQlzdHJjcHkobmFtZV9vdXRwdXQsIGNvbnRleHQubmFtZSk7CisJCSpzeW1fYWRkcl9vdXRwdXQgPSBjb250ZXh0LnN5bV9hZGRyOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkZjAzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2Rldi5jCkBAIC0wLDAgKzEsMTE1MSBAQAorLyoKKyAqIGRldi5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIEJyaWRnZSBCcmlkZ2UgZHJpdmVyIGRldmljZSBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhvc3QgT1MgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2xkci5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9saXN0Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NvZC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvcHJvYy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kbW0uaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc291cmNlIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbWdyLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL25vZGUuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE90aGVycyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BhcGkuaD4JLyogRFNQIEFQSSB2ZXJzaW9uIGluZm8uICovCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2hubC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9pby5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9tc2cuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY21tLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlaC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZXMsIERhdGEgU3RydWN0dXJlcywgVHlwZWRlZnMgKi8KKworI2RlZmluZSBNQUtFVkVSU0lPTihtYWpvciwgbWlub3IpICAgKG1ham9yICogMTAgKyBtaW5vcikKKyNkZWZpbmUgQlJEX0FQSV9WRVJTSU9OCQlNQUtFVkVSU0lPTihCUkRfQVBJX01BSk9SX1ZFUlNJT04sCVwKKwkJCQlCUkRfQVBJX01JTk9SX1ZFUlNJT04pCisKKy8qIFRoZSBCcmlkZ2UgZGV2aWNlIG9iamVjdDogKi8KK3N0cnVjdCBkZXZfb2JqZWN0IHsKKwkvKiBMU1QgcmVxdWlyZXMgImxpbmsiIHRvIGJlIGZpcnN0IGZpZWxkISAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogTGluayB0byBuZXh0IGRldl9vYmplY3QuICovCisJdTggZGV2X3R5cGU7CQkvKiBEZXZpY2UgVHlwZSAqLworCXN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqOwkvKiBQbGF0Zm9ybSBzcGVjaWZpYyBkZXYgaWQgKi8KKwkvKiBCcmlkZ2UgQ29udGV4dCBIYW5kbGUgKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0ICpoYnJpZGdlX2NvbnRleHQ7CisJLyogRnVuY3Rpb24gaW50ZXJmYWNlIHRvIEJyaWRnZSBkcml2ZXIuICovCisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlIGJyaWRnZV9pbnRlcmZhY2U7CisJc3RydWN0IGJyZF9vYmplY3QgKmxvY2tfb3duZXI7CS8qIENsaWVudCB3aXRoIGV4Y2x1c2l2ZSBhY2Nlc3MuICovCisJc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyOwkvKiBDb2RlIG1hbmFnZXIgaGFuZGxlLiAqLworCXN0cnVjdCBjaG5sX21nciAqaGNobmxfbWdyOwkvKiBDaGFubmVsIG1hbmFnZXIuICovCisJc3RydWN0IGRlaF9tZ3IgKmhkZWhfbWdyOwkvKiBERUggbWFuYWdlci4gKi8KKwlzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3I7CS8qIE1lc3NhZ2UgbWFuYWdlci4gKi8KKwlzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyOwkvKiBJTyBtYW5hZ2VyIChDSE5MLCBtc2dfY3RybCkgKi8KKwlzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3I7CS8qIFNNIG1lbW9yeSBtYW5hZ2VyLiAqLworCXN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fbWdyOwkvKiBEeW5hbWljIG1lbW9yeSBtYW5hZ2VyLiAqLworCXN0cnVjdCBsZHJfbW9kdWxlICptb2R1bGVfb2JqOwkvKiBCcmlkZ2UgTW9kdWxlIGhhbmRsZS4gKi8KKwl1MzIgd29yZF9zaXplOwkJLyogRFNQIHdvcmQgc2l6ZTogcXVpY2sgYWNjZXNzLiAqLworCXN0cnVjdCBkcnZfb2JqZWN0ICpoZHJ2X29iajsJLyogRHJpdmVyIE9iamVjdCAqLworCXN0cnVjdCBsc3RfbGlzdCAqcHJvY19saXN0OwkvKiBMaXN0IG9mIFByb2NlZW9zciBhdHRhY2hlZCB0bworCQkJCQkgKiB0aGlzIGRldmljZSAqLworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyOworfTsKKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbHMgKi8KK3N0YXRpYyB1MzIgcmVmczsJCS8qIE1vZHVsZSByZWZlcmVuY2UgY291bnQgKi8KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgZnhuX25vdF9pbXBsZW1lbnRlZChpbnQgYXJnLCAuLi4pOworc3RhdGljIGludCBpbml0X2NvZF9tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmopOworc3RhdGljIHZvaWQgc3RvcmVfaW50ZXJmYWNlX2Z4bnMoc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICpkcnZfZnhucywKKwkJCQkgc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnMpOworLyoKKyAqICA9PT09PT09PSBkZXZfYnJkX3dyaXRlX2Z4biA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEV4cG9ydGVkIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgdGhlIENPRCB3cml0ZSBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24KKyAqICAgICAgaXMgcGFzc2VkIGEgaGFuZGxlIHRvIGEgREVWX2hPYmplY3QsIHRoZW4gY2FsbHMgdGhlCisgKiAgICAgIGRldmljZSdzIGJyaWRnZV9icmRfd3JpdGUoKSBmdW5jdGlvbi4KKyAqLwordTMyIGRldl9icmRfd3JpdGVfZnhuKHZvaWQgKmFyYiwgdTMyIGRzcF9hZGQsIHZvaWQgKmhvc3RfYnVmLAorCQkgICAgICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgbWVtX3NwYWNlKQoreworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopYXJiOworCXUzMiB1bF93cml0dGVuID0gMDsKKwlpbnQgc3RhdHVzOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGhvc3RfYnVmICE9IE5VTEwpOwkvKiBSZXF1aXJlZCBvZiBCcmRXcml0ZSgpLiAqLworCWlmIChkZXZfb2JqKSB7CisJCS8qIFJlcXVpcmUgb2YgQnJkV3JpdGUoKSAqLworCQlEQkNfQVNTRVJUKGRldl9vYmotPmhicmlkZ2VfY29udGV4dCAhPSBOVUxMKTsKKwkJc3RhdHVzID0gKCpkZXZfb2JqLT5icmlkZ2VfaW50ZXJmYWNlLnBmbl9icmRfd3JpdGUpICgKKwkJCQkJZGV2X29iai0+aGJyaWRnZV9jb250ZXh0LCBob3N0X2J1ZiwKKwkJCQkJZHNwX2FkZCwgdWxfbnVtX2J5dGVzLCBtZW1fc3BhY2UpOworCQkvKiBTcGVjaWFsIGNhc2Ugb2YgZ2V0dGluZyB0aGUgYWRkcmVzcyBvbmx5ICovCisJCWlmICh1bF9udW1fYnl0ZXMgPT0gMCkKKwkJCXVsX251bV9ieXRlcyA9IDE7CisJCWlmICghc3RhdHVzKQorCQkJdWxfd3JpdHRlbiA9IHVsX251bV9ieXRlczsKKworCX0KKwlyZXR1cm4gdWxfd3JpdHRlbjsKK30KKworLyoKKyAqICA9PT09PT09PSBkZXZfY3JlYXRlX2RldmljZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENhbGxlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBsb2FkIHRoZSBQTSBCcmlkZ2UgRHJpdmVyIGZvciBhCisgKiAgICAgIFBNIGJvYXJkIChkZXZpY2UpLgorICovCitpbnQgZGV2X2NyZWF0ZV9kZXZpY2Uoc3RydWN0IGRldl9vYmplY3QgKipkZXZpY2Vfb2JqLAorCQkJICAgICBjb25zdCBjaGFyICpkcml2ZXJfZmlsZV9uYW1lLAorCQkJICAgICBzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlX29iaikKK3sKKwlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmhvc3RfcmVzOworCXN0cnVjdCBsZHJfbW9kdWxlICptb2R1bGVfb2JqID0gTlVMTDsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmRydl9meG5zID0gTlVMTDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaiA9IE5VTEw7CisJc3RydWN0IGNobmxfbWdyYXR0cnMgbWdyX2F0dHJzOworCXN0cnVjdCBpb19hdHRycyBpb19tZ3JfYXR0cnM7CisJdTMyIG51bV93aW5kb3dzOworCXN0cnVjdCBkcnZfb2JqZWN0ICpoZHJ2X29iaiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGRldmljZV9vYmogIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoZHJpdmVyX2ZpbGVfbmFtZSAhPSBOVUxMKTsKKworCXN0YXR1cyA9IGRydl9yZXF1ZXN0X2JyaWRnZV9yZXNfZHNwKCh2b2lkICopJmhvc3RfcmVzKTsKKworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogRmFpbGVkIHRvIHJlc2VydmUgYnJpZGdlIHJlc291cmNlc1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwkvKiAgR2V0IHRoZSBCcmlkZ2UgZHJpdmVyIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KKwlicmlkZ2VfZHJ2X2VudHJ5KCZkcnZfZnhucywgZHJpdmVyX2ZpbGVfbmFtZSk7CisJaWYgKGNmZ19nZXRfb2JqZWN0KCh1MzIgKikgJmhkcnZfb2JqLCBSRUdfRFJWX09CSkVDVCkpIHsKKwkJLyogZG9uJ3QgcHJvcG9nYXRlIENGRyBlcnJvcnMgZnJvbSB0aGlzIFBST0MgZnVuY3Rpb24gKi8KKwkJc3RhdHVzID0gLUVQRVJNOworCX0KKwkvKiBDcmVhdGUgdGhlIGRldmljZSBvYmplY3QsIGFuZCBwYXNzIGEgaGFuZGxlIHRvIHRoZSBCcmlkZ2UgZHJpdmVyIGZvcgorCSAqIHN0b3JhZ2UuICovCisJaWYgKCFzdGF0dXMpIHsKKwkJREJDX0FTU0VSVChkcnZfZnhucyk7CisJCWRldl9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X29iamVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoZGV2X29iaikgeworCQkJLyogRmlsbCBvdXQgdGhlIHJlc3Qgb2YgdGhlIERldiBPYmplY3Qgc3RydWN0dXJlOiAqLworCQkJZGV2X29iai0+ZGV2X25vZGVfb2JqID0gZGV2X25vZGVfb2JqOworCQkJZGV2X29iai0+bW9kdWxlX29iaiA9IG1vZHVsZV9vYmo7CisJCQlkZXZfb2JqLT5jb2RfbWdyID0gTlVMTDsKKwkJCWRldl9vYmotPmhjaG5sX21nciA9IE5VTEw7CisJCQlkZXZfb2JqLT5oZGVoX21nciA9IE5VTEw7CisJCQlkZXZfb2JqLT5sb2NrX293bmVyID0gTlVMTDsKKwkJCWRldl9vYmotPndvcmRfc2l6ZSA9IERTUFdPUkRTSVpFOworCQkJZGV2X29iai0+aGRydl9vYmogPSBoZHJ2X29iajsKKwkJCWRldl9vYmotPmRldl90eXBlID0gRFNQX1VOSVQ7CisJCQkvKiBTdG9yZSB0aGlzIEJyaWRnZSdzIGludGVyZmFjZSBmdW5jdGlvbnMsIGJhc2VkIG9uIGl0cworCQkJICogdmVyc2lvbi4gKi8KKwkJCXN0b3JlX2ludGVyZmFjZV9meG5zKGRydl9meG5zLAorCQkJCQkJJmRldl9vYmotPmJyaWRnZV9pbnRlcmZhY2UpOworCisJCQkvKiBDYWxsIGZ4bl9kZXZfY3JlYXRlKCkgdG8gZ2V0IHRoZSBCcmlkZ2UncyBkZXZpY2UKKwkJCSAqIGNvbnRleHQgaGFuZGxlLiAqLworCQkJc3RhdHVzID0gKGRldl9vYmotPmJyaWRnZV9pbnRlcmZhY2UucGZuX2Rldl9jcmVhdGUpCisJCQkgICAgKCZkZXZfb2JqLT5oYnJpZGdlX2NvbnRleHQsIGRldl9vYmosCisJCQkgICAgIGhvc3RfcmVzKTsKKwkJCS8qIEFzc2VydCBicmlkZ2VfZGV2X2NyZWF0ZSgpJ3MgZW5zdXJlIGNsYXVzZTogKi8KKwkJCURCQ19BU1NFUlQoc3RhdHVzCisJCQkJICAgfHwgKGRldl9vYmotPmhicmlkZ2VfY29udGV4dCAhPSBOVUxMKSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQl9CisJfQorCS8qIEF0dGVtcHQgdG8gY3JlYXRlIHRoZSBDT0QgbWFuYWdlciBmb3IgdGhpcyBkZXZpY2U6ICovCisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGluaXRfY29kX21ncihkZXZfb2JqKTsKKworCS8qIEF0dGVtcHQgdG8gY3JlYXRlIHRoZSBjaGFubmVsIG1hbmFnZXIgZm9yIHRoaXMgZGV2aWNlOiAqLworCWlmICghc3RhdHVzKSB7CisJCW1ncl9hdHRycy5tYXhfY2hhbm5lbHMgPSBDSE5MX01BWENIQU5ORUxTOworCQlpb19tZ3JfYXR0cnMuYmlycSA9IGhvc3RfcmVzLT5iaXJxX3JlZ2lzdGVyczsKKwkJaW9fbWdyX2F0dHJzLmlycV9zaGFyZWQgPQorCQkgICAgKGhvc3RfcmVzLT5iaXJxX2F0dHJpYiAmIENGR19JUlFTSEFSRUQpOworCQlpb19tZ3JfYXR0cnMud29yZF9zaXplID0gRFNQV09SRFNJWkU7CisJCW1ncl9hdHRycy53b3JkX3NpemUgPSBEU1BXT1JEU0laRTsKKwkJbnVtX3dpbmRvd3MgPSBob3N0X3Jlcy0+bnVtX21lbV93aW5kb3dzOworCQlpZiAobnVtX3dpbmRvd3MpIHsKKwkJCS8qIEFzc3VtZSBsYXN0IG1lbW9yeSB3aW5kb3cgaXMgZm9yIENITkwgKi8KKwkJCWlvX21ncl9hdHRycy5zaG1fYmFzZSA9IGhvc3RfcmVzLT5kd19tZW1fYmFzZVsxXSArCisJCQkgICAgaG9zdF9yZXMtPmR3X29mZnNldF9mb3JfbW9uaXRvcjsKKwkJCWlvX21ncl9hdHRycy51c21fbGVuZ3RoID0KKwkJCSAgICBob3N0X3Jlcy0+ZHdfbWVtX2xlbmd0aFsxXSAtCisJCQkgICAgaG9zdF9yZXMtPmR3X29mZnNldF9mb3JfbW9uaXRvcjsKKwkJfSBlbHNlIHsKKwkJCWlvX21ncl9hdHRycy5zaG1fYmFzZSA9IDA7CisJCQlpb19tZ3JfYXR0cnMudXNtX2xlbmd0aCA9IDA7CisJCQlwcl9lcnIoIiVzOiBObyBtZW1vcnkgcmVzZXJ2ZWQgZm9yIHNoYXJlZCBzdHJ1Y3R1cmVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJfQorCQlzdGF0dXMgPSBjaG5sX2NyZWF0ZSgmZGV2X29iai0+aGNobmxfbWdyLCBkZXZfb2JqLCAmbWdyX2F0dHJzKTsKKwkJaWYgKHN0YXR1cyA9PSAtRU5PU1lTKSB7CisJCQkvKiBJdCdzIE9LIGZvciBhIGRldmljZSBub3QgdG8gaGF2ZSBhIGNoYW5uZWwKKwkJCSAqIG1hbmFnZXI6ICovCisJCQlzdGF0dXMgPSAwOworCQl9CisJCS8qIENyZWF0ZSBDTU0gbWdyIGV2ZW4gaWYgTXNnIE1nciBub3QgaW1wbC4gKi8KKwkJc3RhdHVzID0gY21tX2NyZWF0ZSgmZGV2X29iai0+aGNtbV9tZ3IsCisJCQkJICAgIChzdHJ1Y3QgZGV2X29iamVjdCAqKWRldl9vYmosIE5VTEwpOworCQkvKiBPbmx5IGNyZWF0ZSBJTyBtYW5hZ2VyIGlmIHdlIGhhdmUgYSBjaGFubmVsIG1hbmFnZXIgKi8KKwkJaWYgKCFzdGF0dXMgJiYgZGV2X29iai0+aGNobmxfbWdyKSB7CisJCQlzdGF0dXMgPSBpb19jcmVhdGUoJmRldl9vYmotPmhpb19tZ3IsIGRldl9vYmosCisJCQkJCSAgICZpb19tZ3JfYXR0cnMpOworCQl9CisJCS8qIE9ubHkgY3JlYXRlIERFSCBtYW5hZ2VyIGlmIHdlIGhhdmUgYW4gSU8gbWFuYWdlciAqLworCQlpZiAoIXN0YXR1cykgeworCQkJLyogSW5zdGFudGlhdGUgdGhlIERFSCBtb2R1bGUgKi8KKwkJCXN0YXR1cyA9IGJyaWRnZV9kZWhfY3JlYXRlKCZkZXZfb2JqLT5oZGVoX21nciwgZGV2X29iaik7CisJCX0KKwkJLyogQ3JlYXRlIERNTSBtZ3IgLiAqLworCQlzdGF0dXMgPSBkbW1fY3JlYXRlKCZkZXZfb2JqLT5kbW1fbWdyLAorCQkJCSAgICAoc3RydWN0IGRldl9vYmplY3QgKilkZXZfb2JqLCBOVUxMKTsKKwl9CisJLyogQWRkIHRoZSBuZXcgREVWX09iamVjdCB0byB0aGUgZ2xvYmFsIGxpc3Q6ICovCisJaWYgKCFzdGF0dXMpIHsKKwkJbHN0X2luaXRfZWxlbSgmZGV2X29iai0+bGluayk7CisJCXN0YXR1cyA9IGRydl9pbnNlcnRfZGV2X29iamVjdChoZHJ2X29iaiwgZGV2X29iaik7CisJfQorCS8qIENyZWF0ZSB0aGUgUHJvY2Vzc29yIExpc3QgKi8KKwlpZiAoIXN0YXR1cykgeworCQlkZXZfb2JqLT5wcm9jX2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHN0X2xpc3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIShkZXZfb2JqLT5wcm9jX2xpc3QpKQorCQkJc3RhdHVzID0gLUVQRVJNOworCQllbHNlCisJCQlJTklUX0xJU1RfSEVBRCgmZGV2X29iai0+cHJvY19saXN0LT5oZWFkKTsKKwl9CitsZWF2ZToKKwkvKiAgSWYgYWxsIHdlbnQgd2VsbCwgcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBkZXYgb2JqZWN0OworCSAqICBlbHNlLCBjbGVhbnVwIGFuZCByZXR1cm4gTlVMTCBpbiB0aGUgT1VUIHBhcmFtZXRlci4gKi8KKwlpZiAoIXN0YXR1cykgeworCQkqZGV2aWNlX29iaiA9IGRldl9vYmo7CisJfSBlbHNlIHsKKwkJaWYgKGRldl9vYmopIHsKKwkJCWtmcmVlKGRldl9vYmotPnByb2NfbGlzdCk7CisJCQlpZiAoZGV2X29iai0+Y29kX21ncikKKwkJCQljb2RfZGVsZXRlKGRldl9vYmotPmNvZF9tZ3IpOworCQkJaWYgKGRldl9vYmotPmRtbV9tZ3IpCisJCQkJZG1tX2Rlc3Ryb3koZGV2X29iai0+ZG1tX21ncik7CisJCQlrZnJlZShkZXZfb2JqKTsKKwkJfQorCisJCSpkZXZpY2Vfb2JqID0gTlVMTDsKKwl9CisKKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmICpkZXZpY2Vfb2JqKSB8fCAoc3RhdHVzICYmICEqZGV2aWNlX29iaikpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2NyZWF0ZTIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBBZnRlciBzdWNjZXNzZnVsIGxvYWRpbmcgb2YgdGhlIGltYWdlIGZyb20gYXBpX2luaXRfY29tcGxldGUyCisgKiAgICAgIChQUk9DIEF1dG9fU3RhcnQpIG9yIHByb2NfbG9hZCB0aGlzIGZ4biBpcyBjYWxsZWQuIFRoaXMgY3JlYXRlcworICogICAgICB0aGUgTm9kZSBNYW5hZ2VyIGFuZCB1cGRhdGVzIHRoZSBERVYgT2JqZWN0LgorICovCitpbnQgZGV2X2NyZWF0ZTIoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gaGRldl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmopOworCisJLyogVGhlcmUgY2FuIGJlIG9ubHkgb25lIE5vZGUgTWFuYWdlciBwZXIgREVWIG9iamVjdCAqLworCURCQ19BU1NFUlQoIWRldl9vYmotPmhub2RlX21ncik7CisJc3RhdHVzID0gbm9kZV9jcmVhdGVfbWdyKCZkZXZfb2JqLT5obm9kZV9tZ3IsIGhkZXZfb2JqKTsKKwlpZiAoc3RhdHVzKQorCQlkZXZfb2JqLT5obm9kZV9tZ3IgPSBOVUxMOworCisJREJDX0VOU1VSRSgoIXN0YXR1cyAmJiBkZXZfb2JqLT5obm9kZV9tZ3IgIT0gTlVMTCkKKwkJICAgfHwgKHN0YXR1cyAmJiBkZXZfb2JqLT5obm9kZV9tZ3IgPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2Rlc3Ryb3kyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVzdHJveXMgdGhlIE5vZGUgbWFuYWdlciBmb3IgdGhpcyBkZXZpY2UuCisgKi8KK2ludCBkZXZfZGVzdHJveTIoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gaGRldl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmopOworCisJaWYgKGRldl9vYmotPmhub2RlX21ncikgeworCQlpZiAobm9kZV9kZWxldGVfbWdyKGRldl9vYmotPmhub2RlX21ncikpCisJCQlzdGF0dXMgPSAtRVBFUk07CisJCWVsc2UKKwkJCWRldl9vYmotPmhub2RlX21nciA9IE5VTEw7CisKKwl9CisKKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmIGRldl9vYmotPmhub2RlX21nciA9PSBOVUxMKSB8fCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2Rlc3Ryb3lfZGV2aWNlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVzdHJveXMgdGhlIGNoYW5uZWwgbWFuYWdlciBmb3IgdGhpcyBkZXZpY2UsIGlmIGFueSwgY2FsbHMKKyAqICAgICAgYnJpZGdlX2Rldl9kZXN0cm95KCksIGFuZCB0aGVuIGF0dGVtcHRzIHRvIHVubG9hZCB0aGUgQnJpZGdlIG1vZHVsZS4KKyAqLworaW50IGRldl9kZXN0cm95X2RldmljZShzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmopCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBoZGV2X29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmIChoZGV2X29iaikgeworCQlpZiAoZGV2X29iai0+Y29kX21ncikgeworCQkJY29kX2RlbGV0ZShkZXZfb2JqLT5jb2RfbWdyKTsKKwkJCWRldl9vYmotPmNvZF9tZ3IgPSBOVUxMOworCQl9CisKKwkJaWYgKGRldl9vYmotPmhub2RlX21ncikgeworCQkJbm9kZV9kZWxldGVfbWdyKGRldl9vYmotPmhub2RlX21ncik7CisJCQlkZXZfb2JqLT5obm9kZV9tZ3IgPSBOVUxMOworCQl9CisKKwkJLyogRnJlZSB0aGUgaW8sIGNoYW5uZWwsIGFuZCBtZXNzYWdlIG1hbmFnZXJzIGZvciB0aGlzIGJvYXJkOiAqLworCQlpZiAoZGV2X29iai0+aGlvX21ncikgeworCQkJaW9fZGVzdHJveShkZXZfb2JqLT5oaW9fbWdyKTsKKwkJCWRldl9vYmotPmhpb19tZ3IgPSBOVUxMOworCQl9CisJCWlmIChkZXZfb2JqLT5oY2hubF9tZ3IpIHsKKwkJCWNobmxfZGVzdHJveShkZXZfb2JqLT5oY2hubF9tZ3IpOworCQkJZGV2X29iai0+aGNobmxfbWdyID0gTlVMTDsKKwkJfQorCQlpZiAoZGV2X29iai0+aG1zZ19tZ3IpIHsKKwkJCW1zZ19kZWxldGUoZGV2X29iai0+aG1zZ19tZ3IpOworCQkJZGV2X29iai0+aG1zZ19tZ3IgPSBOVUxMOworCQl9CisKKwkJaWYgKGRldl9vYmotPmhkZWhfbWdyKSB7CisJCQkvKiBVbmluaXRpYWxpemUgREVIIG1vZHVsZS4gKi8KKwkJCWJyaWRnZV9kZWhfZGVzdHJveShkZXZfb2JqLT5oZGVoX21ncik7CisJCQlkZXZfb2JqLT5oZGVoX21nciA9IE5VTEw7CisJCX0KKwkJaWYgKGRldl9vYmotPmhjbW1fbWdyKSB7CisJCQljbW1fZGVzdHJveShkZXZfb2JqLT5oY21tX21nciwgdHJ1ZSk7CisJCQlkZXZfb2JqLT5oY21tX21nciA9IE5VTEw7CisJCX0KKworCQlpZiAoZGV2X29iai0+ZG1tX21ncikgeworCQkJZG1tX2Rlc3Ryb3koZGV2X29iai0+ZG1tX21ncik7CisJCQlkZXZfb2JqLT5kbW1fbWdyID0gTlVMTDsKKwkJfQorCisJCS8qIENhbGwgdGhlIGRyaXZlcidzIGJyaWRnZV9kZXZfZGVzdHJveSgpIGZ1bmN0aW9uOiAqLworCQkvKiBSZXF1aXJlIG9mIERldkRlc3Ryb3kgKi8KKwkJaWYgKGRldl9vYmotPmhicmlkZ2VfY29udGV4dCkgeworCQkJc3RhdHVzID0gKCpkZXZfb2JqLT5icmlkZ2VfaW50ZXJmYWNlLnBmbl9kZXZfZGVzdHJveSkKKwkJCSAgICAoZGV2X29iai0+aGJyaWRnZV9jb250ZXh0KTsKKwkJCWRldl9vYmotPmhicmlkZ2VfY29udGV4dCA9IE5VTEw7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gLUVQRVJNOworCQlpZiAoIXN0YXR1cykgeworCQkJa2ZyZWUoZGV2X29iai0+cHJvY19saXN0KTsKKwkJCWRldl9vYmotPnByb2NfbGlzdCA9IE5VTEw7CisKKwkJCS8qIFJlbW92ZSB0aGlzIERFVl9PYmplY3QgZnJvbSB0aGUgZ2xvYmFsIGxpc3Q6ICovCisJCQlkcnZfcmVtb3ZlX2Rldl9vYmplY3QoZGV2X29iai0+aGRydl9vYmosIGRldl9vYmopOworCQkJLyogRnJlZSBUaGUgbGlicmFyeSAqIExEUl9GcmVlTW9kdWxlCisJCQkgKiAoZGV2X29iai0+bW9kdWxlX29iaik7ICovCisJCQkvKiBGcmVlIHRoaXMgZGV2IG9iamVjdDogKi8KKwkJCWtmcmVlKGRldl9vYmopOworCQkJZGV2X29iaiA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9jaG5sX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBoYW5kbGUgdG8gdGhlIGNoYW5uZWwgbWFuYWdlciBoYW5kbGUgY3JlYXRlZCBmb3IgdGhpcworICogICAgICBkZXZpY2UuCisgKi8KK2ludCBkZXZfZ2V0X2NobmxfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgICBzdHJ1Y3QgY2hubF9tZ3IgKiptZ3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBoZGV2X29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShtZ3IgIT0gTlVMTCk7CisKKwlpZiAoaGRldl9vYmopIHsKKwkJKm1nciA9IGRldl9vYmotPmhjaG5sX21ncjsKKwl9IGVsc2UgeworCQkqbWdyID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKG1nciAhPSBOVUxMICYmICptZ3IgPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9jbW1fbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIGhhbmRsZSB0byB0aGUgc2hhcmVkIG1lbW9yeSBtYW5hZ2VyIGNyZWF0ZWQgZm9yIHRoaXMKKyAqICAgICAgZGV2aWNlLgorICovCitpbnQgZGV2X2dldF9jbW1fbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgIHN0cnVjdCBjbW1fb2JqZWN0ICoqbWdyKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gaGRldl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUobWdyICE9IE5VTEwpOworCisJaWYgKGhkZXZfb2JqKSB7CisJCSptZ3IgPSBkZXZfb2JqLT5oY21tX21ncjsKKwl9IGVsc2UgeworCQkqbWdyID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKG1nciAhPSBOVUxMICYmICptZ3IgPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9kbW1fbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIGhhbmRsZSB0byB0aGUgZHluYW1pYyBtZW1vcnkgbWFuYWdlciBjcmVhdGVkIGZvciB0aGlzCisgKiAgICAgIGRldmljZS4KKyAqLworaW50IGRldl9nZXRfZG1tX21ncihzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkgICBzdHJ1Y3QgZG1tX29iamVjdCAqKm1ncikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaiA9IGhkZXZfb2JqOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG1nciAhPSBOVUxMKTsKKworCWlmIChoZGV2X29iaikgeworCQkqbWdyID0gZGV2X29iai0+ZG1tX21ncjsKKwl9IGVsc2UgeworCQkqbWdyID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKG1nciAhPSBOVUxMICYmICptZ3IgPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9jb2RfbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIENPRCBtYW5hZ2VyIGNyZWF0ZSBmb3IgdGhpcyBkZXZpY2UuCisgKi8KK2ludCBkZXZfZ2V0X2NvZF9tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgc3RydWN0IGNvZF9tYW5hZ2VyICoqY29kX21ncikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaiA9IGhkZXZfb2JqOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGNvZF9tZ3IgIT0gTlVMTCk7CisKKwlpZiAoaGRldl9vYmopIHsKKwkJKmNvZF9tZ3IgPSBkZXZfb2JqLT5jb2RfbWdyOworCX0gZWxzZSB7CisJCSpjb2RfbWdyID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKGNvZF9tZ3IgIT0gTlVMTCAmJiAqY29kX21nciA9PSBOVUxMKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PT0gZGV2X2dldF9kZWhfbWdyID09PT09PT09CisgKi8KK2ludCBkZXZfZ2V0X2RlaF9tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgc3RydWN0IGRlaF9tZ3IgKipkZWhfbWFuYWdlcikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkZWhfbWFuYWdlciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShoZGV2X29iaik7CisJaWYgKGhkZXZfb2JqKSB7CisJCSpkZWhfbWFuYWdlciA9IGhkZXZfb2JqLT5oZGVoX21ncjsKKwl9IGVsc2UgeworCQkqZGVoX21hbmFnZXIgPSBOVUxMOworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRldl9nZXRfZGV2X25vZGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIElEIGZvciB0aGlzIGRldmljZS4KKyAqLworaW50IGRldl9nZXRfZGV2X25vZGUoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgIHN0cnVjdCBjZmdfZGV2bm9kZSAqKmRldl9uZGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBoZGV2X29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkZXZfbmRlICE9IE5VTEwpOworCisJaWYgKGhkZXZfb2JqKSB7CisJCSpkZXZfbmRlID0gZGV2X29iai0+ZGV2X25vZGVfb2JqOworCX0gZWxzZSB7CisJCSpkZXZfbmRlID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKGRldl9uZGUgIT0gTlVMTCAmJiAqZGV2X25kZSA9PSBOVUxMKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkZXZfZ2V0X2ZpcnN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIGZpcnN0IERldmljZSBPYmplY3QgaGFuZGxlIGZyb20gYW4gaW50ZXJuYWwgbGlua2VkIGxpc3QKKyAqICAgICAgREVWX09CSkVDVHMgbWFpbnRhaW5lZCBieSBERVYuCisgKi8KK3N0cnVjdCBkZXZfb2JqZWN0ICpkZXZfZ2V0X2ZpcnN0KHZvaWQpCit7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBOVUxMOworCisJZGV2X29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWRydl9nZXRfZmlyc3RfZGV2X29iamVjdCgpOworCisJcmV0dXJuIGRldl9vYmo7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9pbnRmX2Z4bnMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgQnJpZGdlIGludGVyZmFjZSBmdW5jdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBsb2FkZWQgZHJpdmVyLgorICogICAgICBpZl9meG5zICE9IE5VTEwuCisgKi8KK2ludCBkZXZfZ2V0X2ludGZfZnhucyhzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCQkgICAgIHN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqKmlmX2Z4bnMpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBoZGV2X29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShpZl9meG5zICE9IE5VTEwpOworCisJaWYgKGhkZXZfb2JqKSB7CisJCSppZl9meG5zID0gJmRldl9vYmotPmJyaWRnZV9pbnRlcmZhY2U7CisJfSBlbHNlIHsKKwkJKmlmX2Z4bnMgPSBOVUxMOworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCURCQ19FTlNVUkUoIXN0YXR1cyB8fCAoKGlmX2Z4bnMgIT0gTlVMTCkgJiYgKCppZl9meG5zID09IE5VTEwpKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PT0gZGV2X2dldF9pb19tZ3IgPT09PT09PT0KKyAqLworaW50IGRldl9nZXRfaW9fbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgc3RydWN0IGlvX21nciAqKmlvX21hbikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShpb19tYW4gIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmopOworCisJaWYgKGhkZXZfb2JqKSB7CisJCSppb19tYW4gPSBoZGV2X29iai0+aGlvX21ncjsKKwl9IGVsc2UgeworCQkqaW9fbWFuID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRldl9nZXRfbmV4dCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBuZXh0IERldmljZSBPYmplY3QgaGFuZGxlIGZyb20gYW4gaW50ZXJuYWwgbGlua2VkIGxpc3QKKyAqICAgICAgb2YgREVWX09CSkVDVHMgbWFpbnRhaW5lZCBieSBERVYsIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IGNhbGxlZAorICogICAgICBkZXZfZ2V0X2ZpcnN0KCkgYW5kIHplcm8gb3IgbW9yZSBkZXZfZ2V0X25leHQKKyAqLworc3RydWN0IGRldl9vYmplY3QgKmRldl9nZXRfbmV4dChzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmopCit7CisJc3RydWN0IGRldl9vYmplY3QgKm5leHRfZGV2X29iamVjdCA9IE5VTEw7CisKKwlpZiAoaGRldl9vYmopIHsKKwkJbmV4dF9kZXZfb2JqZWN0ID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopCisJCSAgICBkcnZfZ2V0X25leHRfZGV2X29iamVjdCgodTMyKSBoZGV2X29iaik7CisJfQorCisJcmV0dXJuIG5leHRfZGV2X29iamVjdDsKK30KKworLyoKKyAqICA9PT09PT09PT0gZGV2X2dldF9tc2dfbWdyID09PT09PT09CisgKi8KK3ZvaWQgZGV2X2dldF9tc2dfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwgc3RydWN0IG1zZ19tZ3IgKiptc2dfbWFuKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShtc2dfbWFuICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGhkZXZfb2JqKTsKKworCSptc2dfbWFuID0gaGRldl9vYmotPmhtc2dfbWdyOworfQorCisvKgorICogID09PT09PT09IGRldl9nZXRfbm9kZV9tYW5hZ2VyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIE5vZGUgTWFuYWdlciBIYW5kbGUKKyAqLworaW50IGRldl9nZXRfbm9kZV9tYW5hZ2VyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCQlzdHJ1Y3Qgbm9kZV9tZ3IgKipub2RlX21hbikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaiA9IGhkZXZfb2JqOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG5vZGVfbWFuICE9IE5VTEwpOworCisJaWYgKGhkZXZfb2JqKSB7CisJCSpub2RlX21hbiA9IGRldl9vYmotPmhub2RlX21ncjsKKwl9IGVsc2UgeworCQkqbm9kZV9tYW4gPSBOVUxMOworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCURCQ19FTlNVUkUoIXN0YXR1cyB8fCAobm9kZV9tYW4gIT0gTlVMTCAmJiAqbm9kZV9tYW4gPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2dldF9zeW1ib2wgPT09PT09PT0KKyAqLworaW50IGRldl9nZXRfc3ltYm9sKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgY29uc3QgY2hhciAqc3RyX3N5bSwgdTMyICogcHVsX3ZhbHVlKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncjsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShzdHJfc3ltICE9IE5VTEwgJiYgcHVsX3ZhbHVlICE9IE5VTEwpOworCisJaWYgKGhkZXZfb2JqKSB7CisJCXN0YXR1cyA9IGRldl9nZXRfY29kX21ncihoZGV2X29iaiwgJmNvZF9tZ3IpOworCQlpZiAoY29kX21ncikKKwkJCXN0YXR1cyA9IGNvZF9nZXRfc3ltX3ZhbHVlKGNvZF9tZ3IsIChjaGFyICopc3RyX3N5bSwKKwkJCQkJCSAgIHB1bF92YWx1ZSk7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkZXZfZ2V0X2JyaWRnZV9jb250ZXh0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIEJyaWRnZSBDb250ZXh0IGhhbmRsZSwgYXMgcmV0dXJuZWQgYnkgdGhlCisgKiAgICAgIGJyaWRnZV9kZXZfY3JlYXRlIGZ4bi4KKyAqLworaW50IGRldl9nZXRfYnJpZGdlX2NvbnRleHQoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJICAgICAgIHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKipwaGJyaWRnZV9jb250ZXh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gaGRldl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGhicmlkZ2VfY29udGV4dCAhPSBOVUxMKTsKKworCWlmIChoZGV2X29iaikgeworCQkqcGhicmlkZ2VfY29udGV4dCA9IGRldl9vYmotPmhicmlkZ2VfY29udGV4dDsKKwl9IGVsc2UgeworCQkqcGhicmlkZ2VfY29udGV4dCA9IE5VTEw7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCisJREJDX0VOU1VSRSghc3RhdHVzIHx8ICgocGhicmlkZ2VfY29udGV4dCAhPSBOVUxMKSAmJgorCQkJCQkgICAgICgqcGhicmlkZ2VfY29udGV4dCA9PSBOVUxMKSkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50LCBhbmQgZnJlZSByZXNvdXJjZXMgd2hlbiByZWZlcmVuY2UgY291bnQgaXMKKyAqICAgICAgMC4KKyAqLwordm9pZCBkZXZfZXhpdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXJlZnMtLTsKKworCWlmIChyZWZzID09IDApIHsKKwkJY21tX2V4aXQoKTsKKwkJZG1tX2V4aXQoKTsKKwl9CisKKwlEQkNfRU5TVVJFKHJlZnMgPj0gMCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGV2X2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIERFVidzIHByaXZhdGUgc3RhdGUsIGtlZXBpbmcgYSByZWZlcmVuY2UgY291bnQgb24gZWFjaCBjYWxsLgorICovCitib29sIGRldl9pbml0KHZvaWQpCit7CisJYm9vbCBjbW1fcmV0LCBkbW1fcmV0LCByZXQgPSB0cnVlOworCisJREJDX1JFUVVJUkUocmVmcyA+PSAwKTsKKworCWlmIChyZWZzID09IDApIHsKKwkJY21tX3JldCA9IGNtbV9pbml0KCk7CisJCWRtbV9yZXQgPSBkbW1faW5pdCgpOworCisJCXJldCA9IGNtbV9yZXQgJiYgZG1tX3JldDsKKworCQlpZiAoIXJldCkgeworCQkJaWYgKGNtbV9yZXQpCisJCQkJY21tX2V4aXQoKTsKKworCQkJaWYgKGRtbV9yZXQpCisJCQkJZG1tX2V4aXQoKTsKKworCQl9CisJfQorCisJaWYgKHJldCkKKwkJcmVmcysrOworCisJREJDX0VOU1VSRSgocmV0ICYmIChyZWZzID4gMCkpIHx8ICghcmV0ICYmIChyZWZzID49IDApKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IGRldl9ub3RpZnlfY2xpZW50cyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIE5vdGlmeSBhbGwgY2xpZW50cyBvZiB0aGlzIGRldmljZSBvZiBhIGNoYW5nZSBpbiBkZXZpY2Ugc3RhdHVzLgorICovCitpbnQgZGV2X25vdGlmeV9jbGllbnRzKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwgdTMyIHJldCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gaGRldl9vYmo7CisJdm9pZCAqcHJvY19vYmo7CisKKwlmb3IgKHByb2Nfb2JqID0gKHZvaWQgKilsc3RfZmlyc3QoZGV2X29iai0+cHJvY19saXN0KTsKKwkgICAgIHByb2Nfb2JqICE9IE5VTEw7CisJICAgICBwcm9jX29iaiA9ICh2b2lkICopbHN0X25leHQoZGV2X29iai0+cHJvY19saXN0LAorCQkJCQkgKHN0cnVjdCBsaXN0X2hlYWQgKilwcm9jX29iaikpCisJCXByb2Nfbm90aWZ5X2NsaWVudHMocHJvY19vYmosICh1MzIpIHJldCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRldl9yZW1vdmVfZGV2aWNlID09PT09PT09CisgKi8KK2ludCBkZXZfcmVtb3ZlX2RldmljZShzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlX29iaikKK3sKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmo7CS8qIGhhbmRsZSB0byBkZXZpY2Ugb2JqZWN0ICovCisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmo7CisKKwkvKiBSZXRyaWV2ZSB0aGUgZGV2aWNlIG9iamVjdCBoYW5kbGUgb3JpZ2luYWx5IHN0b3JlZCB3aXRoCisJICogdGhlIGRldl9ub2RlOiAqLworCXN0YXR1cyA9IGNmZ19nZXRfZGV2X29iamVjdChkZXZfbm9kZV9vYmosICh1MzIgKikgJmhkZXZfb2JqKTsKKwlpZiAoIXN0YXR1cykgeworCQkvKiBSZW1vdmUgdGhlIFByb2Nlc3NvciBMaXN0ICovCisJCWRldl9vYmogPSAoc3RydWN0IGRldl9vYmplY3QgKiloZGV2X29iajsKKwkJLyogRGVzdHJveSB0aGUgZGV2aWNlIG9iamVjdC4gKi8KKwkJc3RhdHVzID0gZGV2X2Rlc3Ryb3lfZGV2aWNlKGhkZXZfb2JqKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRldl9zZXRfY2hubF9tZ3IgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZXQgdGhlIGNoYW5uZWwgbWFuYWdlciBmb3IgdGhpcyBkZXZpY2UuCisgKi8KK2ludCBkZXZfc2V0X2NobmxfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJCSAgICBzdHJ1Y3QgY2hubF9tZ3IgKmhtZ3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBoZGV2X29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmIChoZGV2X29iaikKKwkJZGV2X29iai0+aGNobmxfbWdyID0gaG1ncjsKKwllbHNlCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwlEQkNfRU5TVVJFKHN0YXR1cyB8fCAoZGV2X29iai0+aGNobmxfbWdyID09IGhtZ3IpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRldl9zZXRfbXNnX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNldCB0aGUgbWVzc2FnZSBtYW5hZ2VyIGZvciB0aGlzIGRldmljZS4KKyAqLwordm9pZCBkZXZfc2V0X21zZ19tZ3Ioc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLCBzdHJ1Y3QgbXNnX21nciAqaG1ncikKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmopOworCisJaGRldl9vYmotPmhtc2dfbWdyID0gaG1ncjsKK30KKworLyoKKyAqICA9PT09PT09PSBkZXZfc3RhcnRfZGV2aWNlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIG5ldyBkZXZpY2Ugd2l0aCB0aGUgQlJJREdFIGVudmlyb25tZW50LgorICovCitpbnQgZGV2X3N0YXJ0X2RldmljZShzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlX29iaikKK3sKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmogPSBOVUxMOwkvKiBoYW5kbGUgdG8gJ0JyaWRnZSBEZXZpY2UgKi8KKwkvKiBCcmlkZ2UgZHJpdmVyIGZpbGVuYW1lICovCisJY2hhciBicmlkZ2VfZmlsZV9uYW1lW0NGR19NQVhTRUFSQ0hQQVRITEVOXSA9ICJVTUEiOworCWludCBzdGF0dXM7CisJc3RydWN0IG1ncl9vYmplY3QgKmhtZ3Jfb2JqID0gTlVMTDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCS8qIEdpdmVuIGFsbCByZXNvdXJjZXMsIGNyZWF0ZSBhIGRldmljZSBvYmplY3QuICovCisJc3RhdHVzID0gZGV2X2NyZWF0ZV9kZXZpY2UoJmhkZXZfb2JqLCBicmlkZ2VfZmlsZV9uYW1lLAorCQkJCSAgIGRldl9ub2RlX29iaik7CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogU3RvcmUgYXdheSB0aGUgaGRldl9vYmogd2l0aCB0aGUgREVWTk9ERSAqLworCQlzdGF0dXMgPSBjZmdfc2V0X2Rldl9vYmplY3QoZGV2X25vZGVfb2JqLCAodTMyKSBoZGV2X29iaik7CisJCWlmIChzdGF0dXMpIHsKKwkJCS8qIENsZWFuIHVwICovCisJCQlkZXZfZGVzdHJveV9kZXZpY2UoaGRldl9vYmopOworCQkJaGRldl9vYmogPSBOVUxMOworCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIENyZWF0ZSB0aGUgTWFuYWdlciBPYmplY3QgKi8KKwkJc3RhdHVzID0gbWdyX2NyZWF0ZSgmaG1ncl9vYmosIGRldl9ub2RlX29iaik7CisJfQorCWlmIChzdGF0dXMpIHsKKwkJaWYgKGhkZXZfb2JqKQorCQkJZGV2X2Rlc3Ryb3lfZGV2aWNlKGhkZXZfb2JqKTsKKworCQkvKiBFbnN1cmUgdGhlIGRldmljZSBleHRlbnNpb24gaXMgTlVMTCAqLworCQljZmdfc2V0X2Rldl9vYmplY3QoZGV2X25vZGVfb2JqLCAwTCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBmeG5fbm90X2ltcGxlbWVudGVkID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgVGFrZXMgdGhlIHBsYWNlIG9mIGEgQnJpZGdlIE51bGwgRnVuY3Rpb24uCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgTXVsdGlwbGUsIG9wdGlvbmFsLgorICogIFJldHVybnM6CisgKiAgICAgIC1FTk9TWVM6ICAgQWx3YXlzLgorICovCitzdGF0aWMgaW50IGZ4bl9ub3RfaW1wbGVtZW50ZWQoaW50IGFyZywgLi4uKQoreworCXJldHVybiAtRU5PU1lTOworfQorCisvKgorICogID09PT09PT09IGluaXRfY29kX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZSBhIENPRCBtYW5hZ2VyIGZvciB0aGlzIGRldmljZS4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZfb2JqOiAgICAgICAgICAgICBQb2ludGVyIHRvIGRldmljZSBvYmplY3QgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9jcmVhdGVfZGV2aWNlKCkKKyAqICBSZXR1cm5zOgorICogICAgICAwOiAgICAgICAgICAgICAgICBTdWNjZXNzLgorICogICAgICAtRUZBVUxUOiAgICAgICAgICAgIEludmFsaWQgaGRldl9vYmouCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGJ5IGRldl9jcmVhdGVfZGV2aWNlKCkgZm9yIGEgZ2l2ZW4gRGV2T2JqZWN0LgorICogIEVuc3VyZXM6CisgKi8KK3N0YXRpYyBpbnQgaW5pdF9jb2RfbWdyKHN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCWNoYXIgKnN6X2R1bW15X2ZpbGUgPSAiZHVtbXkiOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKCFkZXZfb2JqIHx8IChkZXZfb2JqLT5jb2RfbWdyID09IE5VTEwpKTsKKworCXN0YXR1cyA9IGNvZF9jcmVhdGUoJmRldl9vYmotPmNvZF9tZ3IsIHN6X2R1bW15X2ZpbGUsIE5VTEwpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkZXZfaW5zZXJ0X3Byb2Nfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5zZXJ0IGEgUHJvY09iamVjdCBpbnRvIHRoZSBsaXN0IG1haW50YWluZWQgYnkgREVWLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHBfcHJvY19vYmplY3Q6ICAgICAgICBQdHIgdG8gUHJvY09iamVjdCB0byBpbnNlcnQuCisgKiAgICAgIGRldl9vYmo6ICAgICAgICAgUHRyIHRvIERldiBPYmplY3Qgd2hlcmUgdGhlIGxpc3QgaXMuCisgICogICAgIGFscmVhZHlfYXR0YWNoZWQ6ICBQdHIgdG8gcmV0dXJuIHRoZSBib29sCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgIElmIHN1Y2Nlc3NmdWwuCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIExpc3QgRXhpc3RzCisgKiAgICAgIGhkZXZfb2JqIGlzIFZhbGlkIGhhbmRsZQorICogICAgICBERVYgSW5pdGlhbGl6ZWQKKyAqICAgICAgYWxyZWFkeV9hdHRhY2hlZCAhPSBOVUxMCisgKiAgICAgIHByb2Nfb2JqICE9IDAKKyAqICBFbnN1cmVzOgorICogICAgICAwIGFuZCBMaXN0IGlzIG5vdCBFbXB0eS4KKyAqLworaW50IGRldl9pbnNlcnRfcHJvY19vYmplY3Qoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCSAgdTMyIHByb2Nfb2JqLCBib29sICphbHJlYWR5X2F0dGFjaGVkKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopaGRldl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoZGV2X29iaik7CisJREJDX1JFUVVJUkUocHJvY19vYmogIT0gMCk7CisJREJDX1JFUVVJUkUoZGV2X29iai0+cHJvY19saXN0ICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGFscmVhZHlfYXR0YWNoZWQgIT0gTlVMTCk7CisJaWYgKCFMU1RfSVNfRU1QVFkoZGV2X29iai0+cHJvY19saXN0KSkKKwkJKmFscmVhZHlfYXR0YWNoZWQgPSB0cnVlOworCisJLyogQWRkIERldk9iamVjdCB0byB0YWlsLiAqLworCWxzdF9wdXRfdGFpbChkZXZfb2JqLT5wcm9jX2xpc3QsIChzdHJ1Y3QgbGlzdF9oZWFkICopcHJvY19vYmopOworCisJREJDX0VOU1VSRSghc3RhdHVzICYmICFMU1RfSVNfRU1QVFkoZGV2X29iai0+cHJvY19saXN0KSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRldl9yZW1vdmVfcHJvY19vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZWFyY2ggZm9yIGFuZCByZW1vdmUgYSBQcm9jIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBsaXN0IG1haW50YWluZWQKKyAqICAgICAgYnkgdGhlIERFVgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHBfcHJvY19vYmplY3Q6ICAgICAgICBQdHIgdG8gUHJvY09iamVjdCB0byBpbnNlcnQuCisgKiAgICAgIGRldl9vYmogICAgICAgICAgUHRyIHRvIERldiBPYmplY3Qgd2hlcmUgdGhlIGxpc3QgaXMuCisgKiAgUmV0dXJuczoKKyAqICAgICAgMDogICAgICAgICAgICBJZiBzdWNjZXNzZnVsLgorICogIFJlcXVpcmVzOgorICogICAgICBMaXN0IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5CisgKiAgICAgIHByb2Nfb2JqICE9IDAKKyAqICAgICAgaGRldl9vYmogaXMgYSB2YWxpZCBEZXYgaGFuZGxlLgorICogIEVuc3VyZXM6CisgKiAgRGV0YWlsczoKKyAqICAgICAgTGlzdCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgREVWIGlzIGRlc3Ryb3llZC4KKyAqLworaW50IGRldl9yZW1vdmVfcHJvY19vYmplY3Qoc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLCB1MzIgcHJvY19vYmopCit7CisJaW50IHN0YXR1cyA9IC1FUEVSTTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXJfZWxlbTsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWhkZXZfb2JqOworCisJREJDX1JFUVVJUkUoZGV2X29iaik7CisJREJDX1JFUVVJUkUocHJvY19vYmogIT0gMCk7CisJREJDX1JFUVVJUkUoZGV2X29iai0+cHJvY19saXN0ICE9IE5VTEwpOworCURCQ19SRVFVSVJFKCFMU1RfSVNfRU1QVFkoZGV2X29iai0+cHJvY19saXN0KSk7CisKKwkvKiBTZWFyY2ggbGlzdCBmb3IgZGV2X29iajogKi8KKwlmb3IgKGN1cl9lbGVtID0gbHN0X2ZpcnN0KGRldl9vYmotPnByb2NfbGlzdCk7IGN1cl9lbGVtICE9IE5VTEw7CisJICAgICBjdXJfZWxlbSA9IGxzdF9uZXh0KGRldl9vYmotPnByb2NfbGlzdCwgY3VyX2VsZW0pKSB7CisJCS8qIElmIGZvdW5kLCByZW1vdmUgaXQuICovCisJCWlmICgodTMyKSBjdXJfZWxlbSA9PSBwcm9jX29iaikgeworCQkJbHN0X3JlbW92ZV9lbGVtKGRldl9vYmotPnByb2NfbGlzdCwgY3VyX2VsZW0pOworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGRldl9nZXRfZGV2X3R5cGUoc3RydWN0IGRldl9vYmplY3QgKmRldmljZV9vYmosIHU4ICpkZXZfdHlwZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWRldmljZV9vYmo7CisKKwkqZGV2X3R5cGUgPSBkZXZfb2JqLT5kZXZfdHlwZTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc3RvcmVfaW50ZXJmYWNlX2Z4bnMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDb3B5IHRoZSBCcmlkZ2UncyBpbnRlcmZhY2UgZnVuY3Rpb25zIGludG8gdGhlIGRldmljZSBvYmplY3QsCisgKiAgICAgIGVuc3VyaW5nIHRoYXQgZnhuX25vdF9pbXBsZW1lbnRlZCgpIGlzIHNldCBmb3I6CisgKgorICogICAgICAxLiBBbGwgQnJpZGdlIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBOVUxMOyBhbmQKKyAqICAgICAgMi4gQWxsIGZ1bmN0aW9uIHNsb3RzIGluIHRoZSBzdHJ1Y3QgZGV2X29iamVjdCBzdHJ1Y3R1cmUgd2hpY2ggaGF2ZSBubworICogICAgICAgICBjb3JyZXNwb25kaW5nIHNsb3RzIGluIHRoZSB0aGUgQnJpZGdlJ3MgaW50ZXJmYWNlLCBiZWNhdXNlIHRoZSBCcmlkZ2UKKyAqICAgICAgICAgaXMgb2YgYW4gKm9sZGVyKiB2ZXJzaW9uLgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGludGZfZnhuczogICAgICBJbnRlcmZhY2UgZnhuIFN0cnVjdHVyZSBvZiB0aGUgQnJpZGdlJ3MgRGV2IE9iamVjdC4KKyAqICAgICAgZHJ2X2Z4bnM6ICAgICAgSW50ZXJmYWNlIEZ4bnMgb2ZmZXJlZCBieSB0aGUgQnJpZGdlIGR1cmluZyBERVZfQ3JlYXRlKCkuCisgKiAgUmV0dXJuczoKKyAqICBSZXF1aXJlczoKKyAqICAgICAgSW5wdXQgcG9pbnRlcnMgYXJlIHZhbGlkLgorICogICAgICBCcmlkZ2UgZHJpdmVyIGlzICpub3QqIHdyaXR0ZW4gZm9yIGEgbmV3ZXIgRFNQIEFQSS4KKyAqICBFbnN1cmVzOgorICogICAgICBBbGwgZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhlIGRldiBvYmplY3QncyBmeG4gaW50ZXJmYWNlIGFyZSBub3QgTlVMTC4KKyAqLworc3RhdGljIHZvaWQgc3RvcmVfaW50ZXJmYWNlX2Z4bnMoc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICpkcnZfZnhucywKKwkJCQkgc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnMpCit7CisJdTMyIGJyaWRnZV92ZXJzaW9uOworCisJLyogTG9jYWwgaGVscGVyIG1hY3JvOiAqLworI2RlZmluZSAgU1RPUkVfRlhOKGNhc3QsIHBmbikgXAorICAgIChpbnRmX2Z4bnMtPnBmbiA9ICgoZHJ2X2Z4bnMtPnBmbiAhPSBOVUxMKSA/IGRydl9meG5zLT5wZm4gOiBcCisgICAgKGNhc3QpZnhuX25vdF9pbXBsZW1lbnRlZCkpCisKKwlEQkNfUkVRVUlSRShpbnRmX2Z4bnMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoZHJ2X2Z4bnMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoTUFLRVZFUlNJT04oZHJ2X2Z4bnMtPmJyZF9hcGlfbWFqb3JfdmVyc2lvbiwKKwkJCWRydl9meG5zLT5icmRfYXBpX21pbm9yX3ZlcnNpb24pIDw9IEJSRF9BUElfVkVSU0lPTik7CisJYnJpZGdlX3ZlcnNpb24gPSBNQUtFVkVSU0lPTihkcnZfZnhucy0+YnJkX2FwaV9tYWpvcl92ZXJzaW9uLAorCQkJCSAgICAgZHJ2X2Z4bnMtPmJyZF9hcGlfbWlub3JfdmVyc2lvbik7CisJaW50Zl9meG5zLT5icmRfYXBpX21ham9yX3ZlcnNpb24gPSBkcnZfZnhucy0+YnJkX2FwaV9tYWpvcl92ZXJzaW9uOworCWludGZfZnhucy0+YnJkX2FwaV9taW5vcl92ZXJzaW9uID0gZHJ2X2Z4bnMtPmJyZF9hcGlfbWlub3JfdmVyc2lvbjsKKwkvKiBJbnN0YWxsIGZ1bmN0aW9ucyB1cCB0byBEU1AgQVBJIHZlcnNpb24gLjgwIChmaXJzdCBhbHBoYSk6ICovCisJaWYgKGJyaWRnZV92ZXJzaW9uID4gMCkgeworCQlTVE9SRV9GWE4oZnhuX2Rldl9jcmVhdGUsIHBmbl9kZXZfY3JlYXRlKTsKKwkJU1RPUkVfRlhOKGZ4bl9kZXZfZGVzdHJveSwgcGZuX2Rldl9kZXN0cm95KTsKKwkJU1RPUkVfRlhOKGZ4bl9kZXZfY3RybCwgcGZuX2Rldl9jbnRybCk7CisJCVNUT1JFX0ZYTihmeG5fYnJkX21vbml0b3IsIHBmbl9icmRfbW9uaXRvcik7CisJCVNUT1JFX0ZYTihmeG5fYnJkX3N0YXJ0LCBwZm5fYnJkX3N0YXJ0KTsKKwkJU1RPUkVfRlhOKGZ4bl9icmRfc3RvcCwgcGZuX2JyZF9zdG9wKTsKKwkJU1RPUkVfRlhOKGZ4bl9icmRfc3RhdHVzLCBwZm5fYnJkX3N0YXR1cyk7CisJCVNUT1JFX0ZYTihmeG5fYnJkX3JlYWQsIHBmbl9icmRfcmVhZCk7CisJCVNUT1JFX0ZYTihmeG5fYnJkX3dyaXRlLCBwZm5fYnJkX3dyaXRlKTsKKwkJU1RPUkVfRlhOKGZ4bl9icmRfc2V0c3RhdGUsIHBmbl9icmRfc2V0X3N0YXRlKTsKKwkJU1RPUkVfRlhOKGZ4bl9icmRfbWVtY29weSwgcGZuX2JyZF9tZW1fY29weSk7CisJCVNUT1JFX0ZYTihmeG5fYnJkX21lbXdyaXRlLCBwZm5fYnJkX21lbV93cml0ZSk7CisJCVNUT1JFX0ZYTihmeG5fYnJkX21lbW1hcCwgcGZuX2JyZF9tZW1fbWFwKTsKKwkJU1RPUkVfRlhOKGZ4bl9icmRfbWVtdW5tYXAsIHBmbl9icmRfbWVtX3VuX21hcCk7CisJCVNUT1JFX0ZYTihmeG5fY2hubF9jcmVhdGUsIHBmbl9jaG5sX2NyZWF0ZSk7CisJCVNUT1JFX0ZYTihmeG5fY2hubF9kZXN0cm95LCBwZm5fY2hubF9kZXN0cm95KTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX29wZW4sIHBmbl9jaG5sX29wZW4pOworCQlTVE9SRV9GWE4oZnhuX2NobmxfY2xvc2UsIHBmbl9jaG5sX2Nsb3NlKTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX2FkZGlvcmVxLCBwZm5fY2hubF9hZGRfaW9fcmVxKTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX2dldGlvYywgcGZuX2NobmxfZ2V0X2lvYyk7CisJCVNUT1JFX0ZYTihmeG5fY2hubF9jYW5jZWxpbywgcGZuX2NobmxfY2FuY2VsX2lvKTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX2ZsdXNoaW8sIHBmbl9jaG5sX2ZsdXNoX2lvKTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX2dldGluZm8sIHBmbl9jaG5sX2dldF9pbmZvKTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX2dldG1ncmluZm8sIHBmbl9jaG5sX2dldF9tZ3JfaW5mbyk7CisJCVNUT1JFX0ZYTihmeG5fY2hubF9pZGxlLCBwZm5fY2hubF9pZGxlKTsKKwkJU1RPUkVfRlhOKGZ4bl9jaG5sX3JlZ2lzdGVybm90aWZ5LCBwZm5fY2hubF9yZWdpc3Rlcl9ub3RpZnkpOworCQlTVE9SRV9GWE4oZnhuX2lvX2NyZWF0ZSwgcGZuX2lvX2NyZWF0ZSk7CisJCVNUT1JFX0ZYTihmeG5faW9fZGVzdHJveSwgcGZuX2lvX2Rlc3Ryb3kpOworCQlTVE9SRV9GWE4oZnhuX2lvX29ubG9hZGVkLCBwZm5faW9fb25fbG9hZGVkKTsKKwkJU1RPUkVfRlhOKGZ4bl9pb19nZXRwcm9jbG9hZCwgcGZuX2lvX2dldF9wcm9jX2xvYWQpOworCQlTVE9SRV9GWE4oZnhuX21zZ19jcmVhdGUsIHBmbl9tc2dfY3JlYXRlKTsKKwkJU1RPUkVfRlhOKGZ4bl9tc2dfY3JlYXRlcXVldWUsIHBmbl9tc2dfY3JlYXRlX3F1ZXVlKTsKKwkJU1RPUkVfRlhOKGZ4bl9tc2dfZGVsZXRlLCBwZm5fbXNnX2RlbGV0ZSk7CisJCVNUT1JFX0ZYTihmeG5fbXNnX2RlbGV0ZXF1ZXVlLCBwZm5fbXNnX2RlbGV0ZV9xdWV1ZSk7CisJCVNUT1JFX0ZYTihmeG5fbXNnX2dldCwgcGZuX21zZ19nZXQpOworCQlTVE9SRV9GWE4oZnhuX21zZ19wdXQsIHBmbl9tc2dfcHV0KTsKKwkJU1RPUkVfRlhOKGZ4bl9tc2dfcmVnaXN0ZXJub3RpZnksIHBmbl9tc2dfcmVnaXN0ZXJfbm90aWZ5KTsKKwkJU1RPUkVfRlhOKGZ4bl9tc2dfc2V0cXVldWVpZCwgcGZuX21zZ19zZXRfcXVldWVfaWQpOworCX0KKwkvKiBBZGQgY29kZSBmb3IgYW55IGFkZGl0aW9uYWwgZnVuY3Rpb25zIGluIG5ld2VyQnJpZGdlIHZlcnNpb25zIGhlcmUgKi8KKwkvKiBFbnN1cmUgcG9zdGNvbmRpdGlvbjogKi8KKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2Rldl9jcmVhdGUgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9kZXZfZGVzdHJveSAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2Rldl9jbnRybCAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2JyZF9tb25pdG9yICE9IE5VTEwpOworCURCQ19FTlNVUkUoaW50Zl9meG5zLT5wZm5fYnJkX3N0YXJ0ICE9IE5VTEwpOworCURCQ19FTlNVUkUoaW50Zl9meG5zLT5wZm5fYnJkX3N0b3AgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9icmRfc3RhdHVzICE9IE5VTEwpOworCURCQ19FTlNVUkUoaW50Zl9meG5zLT5wZm5fYnJkX3JlYWQgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9icmRfd3JpdGUgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX2NyZWF0ZSAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2NobmxfZGVzdHJveSAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2Nobmxfb3BlbiAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2NobmxfY2xvc2UgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX2FkZF9pb19yZXEgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX2dldF9pb2MgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX2NhbmNlbF9pbyAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2NobmxfZmx1c2hfaW8gIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX2dldF9pbmZvICE9IE5VTEwpOworCURCQ19FTlNVUkUoaW50Zl9meG5zLT5wZm5fY2hubF9nZXRfbWdyX2luZm8gIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX2lkbGUgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9jaG5sX3JlZ2lzdGVyX25vdGlmeSAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2lvX2NyZWF0ZSAhPSBOVUxMKTsKKwlEQkNfRU5TVVJFKGludGZfZnhucy0+cGZuX2lvX2Rlc3Ryb3kgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9pb19vbl9sb2FkZWQgIT0gTlVMTCk7CisJREJDX0VOU1VSRShpbnRmX2Z4bnMtPnBmbl9pb19nZXRfcHJvY19sb2FkICE9IE5VTEwpOworCURCQ19FTlNVUkUoaW50Zl9meG5zLT5wZm5fbXNnX3NldF9xdWV1ZV9pZCAhPSBOVUxMKTsKKworI3VuZGVmICBTVE9SRV9GWE4KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2RtbS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvZG1tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4NTIzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2RtbS5jCkBAIC0wLDAgKzEsNTMzIEBACisvKgorICogZG1tLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogVGhlIER5bmFtaWMgTWVtb3J5IE1hbmFnZXIgKERNTSkgbW9kdWxlIG1hbmFnZXMgdGhlIERTUCBWaXJ0dWFsIGFkZHJlc3MKKyAqIHNwYWNlIHRoYXQgY2FuIGJlIGRpcmVjdGx5IG1hcHBlZCB0byBhbnkgTVBVIGJ1ZmZlciBvciBtZW1vcnkgcmVnaW9uCisgKgorICogTm90ZXM6CisgKiAgIFJlZ2lvbjogR2VuZXJpYyBtZW1vcnkgZW50aXRpeSBoYXZpbmcgYSBzdGFydCBhZGRyZXNzIGFuZCBhIHNpemUKKyAqICAgQ2h1bms6ICBSZXNlcnZlZCByZWdpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3N5bmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBsYXRmb3JtIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Byb2MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZG1tLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZpbmVzLCBEYXRhIFN0cnVjdHVyZXMsIFR5cGVkZWZzICovCisjZGVmaW5lIERNTV9BRERSX1ZJUlRVQUwoYSkgXAorCSgoKHN0cnVjdCBtYXBfcGFnZSAqKShhKSAtIHZpcnR1YWxfbWFwcGluZ190YWJsZSkgKiBQR19TSVpFNEsgK1wKKwlkeW5fbWVtX21hcF9iZWcpCisjZGVmaW5lIERNTV9BRERSX1RPX0lOREVYKGEpICgoKGEpIC0gZHluX21lbV9tYXBfYmVnKSAvIFBHX1NJWkU0SykKKworLyogRE1NIE1nciAqLworc3RydWN0IGRtbV9vYmplY3QgeworCS8qIERtbSBMb2NrIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFjY2VzcyBtZW0gbWFuYWdlciBmb3IKKwkgKiBtdWx0aS10aHJlYWRzLiAqLworCXNwaW5sb2NrX3QgZG1tX2xvY2s7CS8qIExvY2sgdG8gYWNjZXNzIGRtbSBtZ3IgKi8KK307CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWxzICovCitzdGF0aWMgdTMyIHJlZnM7CQkvKiBtb2R1bGUgcmVmZXJlbmNlIGNvdW50ICovCitzdHJ1Y3QgbWFwX3BhZ2UgeworCXUzMiByZWdpb25fc2l6ZToxNTsKKwl1MzIgbWFwcGVkX3NpemU6MTU7CisJdTMyIHJlc2VydmVkOjE7CisJdTMyIG1hcHBlZDoxOworfTsKKworLyogIENyZWF0ZSB0aGUgZnJlZSBsaXN0ICovCitzdGF0aWMgc3RydWN0IG1hcF9wYWdlICp2aXJ0dWFsX21hcHBpbmdfdGFibGU7CitzdGF0aWMgdTMyIGZyZWVfcmVnaW9uOwkJLyogVGhlIGluZGV4IG9mIGZyZWUgcmVnaW9uICovCitzdGF0aWMgdTMyIGZyZWVfc2l6ZTsKK3N0YXRpYyB1MzIgZHluX21lbV9tYXBfYmVnOwkvKiBUaGUgQmVnaW5uaW5nIG9mIGR5bmFtaWMgbWVtb3J5IG1hcHBpbmcgKi8KK3N0YXRpYyB1MzIgdGFibGVfc2l6ZTsJCS8qIFRoZSBzaXplIG9mIHZpcnQgYW5kIHBoeXMgcGFnZXMgdGFibGVzICovCisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzICovCitzdGF0aWMgc3RydWN0IG1hcF9wYWdlICpnZXRfcmVnaW9uKHUzMiBhZGRyKTsKK3N0YXRpYyBzdHJ1Y3QgbWFwX3BhZ2UgKmdldF9mcmVlX3JlZ2lvbih1MzIgbGVuKTsKK3N0YXRpYyBzdHJ1Y3QgbWFwX3BhZ2UgKmdldF9tYXBwZWRfcmVnaW9uKHUzMiBhZGRycyk7CisKKy8qICA9PT09PT09PSBkbW1fY3JlYXRlX3RhYmxlcyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZSB0YWJsZSB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBvZiBwaHlzaWNhbCBhZGRyZXNzCisgKiAgICAgIHRoZSBidWZmZXIgcGFnZXMgdGhhdCBpcyBwYXNzZWQgYnkgdGhlIHVzZXIsIGFuZCB0aGUgdGFibGUKKyAqICAgICAgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIHZpcnR1YWwgbWVtb3J5IHRoYXQgaXMgcmVzZXJ2ZWQKKyAqICAgICAgZm9yIERTUC4KKyAqLworaW50IGRtbV9jcmVhdGVfdGFibGVzKHN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fbWdyLCB1MzIgYWRkciwgdTMyIHNpemUpCit7CisJc3RydWN0IGRtbV9vYmplY3QgKmRtbV9vYmogPSAoc3RydWN0IGRtbV9vYmplY3QgKilkbW1fbWdyOworCWludCBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gZG1tX2RlbGV0ZV90YWJsZXMoZG1tX29iaik7CisJaWYgKCFzdGF0dXMpIHsKKwkJZHluX21lbV9tYXBfYmVnID0gYWRkcjsKKwkJdGFibGVfc2l6ZSA9IFBHX0FMSUdOX0hJR0goc2l6ZSwgUEdfU0laRTRLKSAvIFBHX1NJWkU0SzsKKwkJLyogIENyZWF0ZSB0aGUgZnJlZSBsaXN0ICovCisJCXZpcnR1YWxfbWFwcGluZ190YWJsZSA9IF9fdm1hbGxvYyh0YWJsZV9zaXplICoKKwkJCQlzaXplb2Yoc3RydWN0IG1hcF9wYWdlKSwgR0ZQX0tFUk5FTCB8CisJCQkJX19HRlBfSElHSE1FTSB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKKwkJaWYgKHZpcnR1YWxfbWFwcGluZ190YWJsZSA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJZWxzZSB7CisJCQkvKiBPbiBzdWNjZXNzZnVsIGFsbG9jYXRpb24sCisJCQkgKiBhbGwgZW50cmllcyBhcmUgemVybyAoJ2ZyZWUnKSAqLworCQkJZnJlZV9yZWdpb24gPSAwOworCQkJZnJlZV9zaXplID0gdGFibGVfc2l6ZSAqIFBHX1NJWkU0SzsKKwkJCXZpcnR1YWxfbWFwcGluZ190YWJsZVswXS5yZWdpb25fc2l6ZSA9IHRhYmxlX3NpemU7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzKQorCQlwcl9lcnIoIiVzOiBmYWlsdXJlLCBzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRtbV9jcmVhdGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGUgYSBkeW5hbWljIG1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KKyAqLworaW50IGRtbV9jcmVhdGUoc3RydWN0IGRtbV9vYmplY3QgKipkbW1fbWFuYWdlciwKKwkJICAgICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZG1tX21ncmF0dHJzICptZ3JfYXR0cnRzKQoreworCXN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fb2JqID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoZG1tX21hbmFnZXIgIT0gTlVMTCk7CisKKwkqZG1tX21hbmFnZXIgPSBOVUxMOworCS8qIGNyZWF0ZSwgemVybywgYW5kIHRhZyBhIGNtbSBtZ3Igb2JqZWN0ICovCisJZG1tX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbW1fb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRtbV9vYmogIT0gTlVMTCkgeworCQlzcGluX2xvY2tfaW5pdCgmZG1tX29iai0+ZG1tX2xvY2spOworCQkqZG1tX21hbmFnZXIgPSBkbW1fb2JqOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkbW1fZGVzdHJveSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlbGVhc2UgdGhlIGNvbW11bmljYXRpb24gbWVtb3J5IG1hbmFnZXIgcmVzb3VyY2VzLgorICovCitpbnQgZG1tX2Rlc3Ryb3koc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3IpCit7CisJc3RydWN0IGRtbV9vYmplY3QgKmRtbV9vYmogPSAoc3RydWN0IGRtbV9vYmplY3QgKilkbW1fbWdyOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCWlmIChkbW1fbWdyKSB7CisJCXN0YXR1cyA9IGRtbV9kZWxldGVfdGFibGVzKGRtbV9vYmopOworCQlpZiAoIXN0YXR1cykKKwkJCWtmcmVlKGRtbV9vYmopOworCX0gZWxzZQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkbW1fZGVsZXRlX3RhYmxlcyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERlbGV0ZSBETU0gVGFibGVzLgorICovCitpbnQgZG1tX2RlbGV0ZV90YWJsZXMoc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJLyogRGVsZXRlIGFsbCBETU0gdGFibGVzICovCisJaWYgKGRtbV9tZ3IpCisJCXZmcmVlKHZpcnR1YWxfbWFwcGluZ190YWJsZSk7CisJZWxzZQorCQlzdGF0dXMgPSAtRUZBVUxUOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZG1tX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiBtb2R1bGU7IGZyZWUgcmVzb3VyY2VzIHdoZW4gcmVmZXJlbmNlIGNvdW50CisgKiAgICAgIHJlYWNoZXMgMC4KKyAqLwordm9pZCBkbW1fZXhpdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXJlZnMtLTsKK30KKworLyoKKyAqICA9PT09PT09PSBkbW1fZ2V0X2hhbmRsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybiB0aGUgZHluYW1pYyBtZW1vcnkgbWFuYWdlciBvYmplY3QgZm9yIHRoaXMgZGV2aWNlLgorICogICAgICBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgZnJvbSB0aGUgY2xpZW50IHByb2Nlc3MuCisgKi8KK2ludCBkbW1fZ2V0X2hhbmRsZSh2b2lkICpocHJvY2Vzc29yLCBzdHJ1Y3QgZG1tX29iamVjdCAqKmRtbV9tYW5hZ2VyKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkbW1fbWFuYWdlciAhPSBOVUxMKTsKKwlpZiAoaHByb2Nlc3NvciAhPSBOVUxMKQorCQlzdGF0dXMgPSBwcm9jX2dldF9kZXZfb2JqZWN0KGhwcm9jZXNzb3IsICZoZGV2X29iaik7CisJZWxzZQorCQloZGV2X29iaiA9IGRldl9nZXRfZmlyc3QoKTsJLyogZGVmYXVsdCAqLworCisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRldl9nZXRfZG1tX21ncihoZGV2X29iaiwgZG1tX21hbmFnZXIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkbW1faW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemVzIHByaXZhdGUgc3RhdGUgb2YgRE1NIG1vZHVsZS4KKyAqLworYm9vbCBkbW1faW5pdCh2b2lkKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlpZiAocmV0KQorCQlyZWZzKys7CisKKwlEQkNfRU5TVVJFKChyZXQgJiYgKHJlZnMgPiAwKSkgfHwgKCFyZXQgJiYgKHJlZnMgPj0gMCkpKTsKKworCXZpcnR1YWxfbWFwcGluZ190YWJsZSA9IE5VTEw7CisJdGFibGVfc2l6ZSA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IGRtbV9tYXBfbWVtb3J5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQWRkIGEgbWFwcGluZyBibG9jayB0byB0aGUgcmVzZXJ2ZWQgY2h1bmsuIERNTSBhc3N1bWVzIHRoYXQgdGhpcyBibG9jaworICogIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBEU1AvSVZBJ3MgYWRkcmVzcyBzcGFjZS4gRE1NIHJldHVybnMgYW4gZXJyb3IgaWYgYQorICogIG1hcHBpbmcgb3ZlcmxhcHMgYW5vdGhlciBvbmUuIFRoaXMgZnVuY3Rpb24gc3RvcmVzIHRoZSBpbmZvIHRoYXQgd2lsbCBiZQorICogIHJlcXVpcmVkIGxhdGVyIHdoaWxlIHVubWFwcGluZyB0aGUgYmxvY2suCisgKi8KK2ludCBkbW1fbWFwX21lbW9yeShzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21nciwgdTMyIGFkZHIsIHUzMiBzaXplKQoreworCXN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fb2JqID0gKHN0cnVjdCBkbW1fb2JqZWN0ICopZG1tX21ncjsKKwlzdHJ1Y3QgbWFwX3BhZ2UgKmNodW5rOworCWludCBzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrKCZkbW1fb2JqLT5kbW1fbG9jayk7CisJLyogRmluZCB0aGUgUmVzZXJ2ZWQgbWVtb3J5IGNodW5rIGNvbnRhaW5pbmcgdGhlIERTUCBibG9jayB0bworCSAqIGJlIG1hcHBlZCAqLworCWNodW5rID0gKHN0cnVjdCBtYXBfcGFnZSAqKWdldF9yZWdpb24oYWRkcik7CisJaWYgKGNodW5rICE9IE5VTEwpIHsKKwkJLyogTWFyayB0aGUgcmVnaW9uICdtYXBwZWQnLCBsZWF2ZSB0aGUgJ3Jlc2VydmVkJyBpbmZvIGFzLWlzICovCisJCWNodW5rLT5tYXBwZWQgPSB0cnVlOworCQljaHVuay0+bWFwcGVkX3NpemUgPSAoc2l6ZSAvIFBHX1NJWkU0Syk7CisJfSBlbHNlCisJCXN0YXR1cyA9IC1FTk9FTlQ7CisJc3Bpbl91bmxvY2soJmRtbV9vYmotPmRtbV9sb2NrKTsKKworCWRldl9kYmcoYnJpZGdlLCAiJXMgZG1tX21nciAlcCwgYWRkciAleCwgc2l6ZSAleFxuXHRzdGF0dXMgJXgsICIKKwkJImNodW5rICVwIiwgX19mdW5jX18sIGRtbV9tZ3IsIGFkZHIsIHNpemUsIHN0YXR1cywgY2h1bmspOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkbW1fcmVzZXJ2ZV9tZW1vcnkgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXNlcnZlIGEgY2h1bmsgb2YgdmlydHVhbGx5IGNvbnRpZ3VvdXMgRFNQL0lWQSBhZGRyZXNzIHNwYWNlLgorICovCitpbnQgZG1tX3Jlc2VydmVfbWVtb3J5KHN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fbWdyLCB1MzIgc2l6ZSwKKwkJCSAgICAgIHUzMiAqcHJzdl9hZGRyKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fb2JqID0gKHN0cnVjdCBkbW1fb2JqZWN0ICopZG1tX21ncjsKKwlzdHJ1Y3QgbWFwX3BhZ2UgKm5vZGU7CisJdTMyIHJzdl9hZGRyID0gMDsKKwl1MzIgcnN2X3NpemUgPSAwOworCisJc3Bpbl9sb2NrKCZkbW1fb2JqLT5kbW1fbG9jayk7CisKKwkvKiBUcnkgdG8gZ2V0IGEgRFNQIGNodW5rIGZyb20gdGhlIGZyZWUgbGlzdCAqLworCW5vZGUgPSBnZXRfZnJlZV9yZWdpb24oc2l6ZSk7CisJaWYgKG5vZGUgIT0gTlVMTCkgeworCQkvKiAgRFNQIGNodW5rIG9mIGdpdmVuIHNpemUgaXMgYXZhaWxhYmxlLiAqLworCQlyc3ZfYWRkciA9IERNTV9BRERSX1ZJUlRVQUwobm9kZSk7CisJCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIGVudHJpZXMgdG8gdXNlICovCisJCXJzdl9zaXplID0gc2l6ZSAvIFBHX1NJWkU0SzsKKwkJaWYgKHJzdl9zaXplIDwgbm9kZS0+cmVnaW9uX3NpemUpIHsKKwkJCS8qIE1hcmsgcmVtYWluZGVyIG9mIGZyZWUgcmVnaW9uICovCisJCQlub2RlW3Jzdl9zaXplXS5tYXBwZWQgPSBmYWxzZTsKKwkJCW5vZGVbcnN2X3NpemVdLnJlc2VydmVkID0gZmFsc2U7CisJCQlub2RlW3Jzdl9zaXplXS5yZWdpb25fc2l6ZSA9CisJCQkgICAgbm9kZS0+cmVnaW9uX3NpemUgLSByc3Zfc2l6ZTsKKwkJCW5vZGVbcnN2X3NpemVdLm1hcHBlZF9zaXplID0gMDsKKwkJfQorCQkvKiAgZ2V0X3JlZ2lvbiB3aWxsIHJldHVybiBmaXJzdCBmaXQgY2h1bmsuIEJ1dCB3ZSBvbmx5IHVzZSB3aGF0CisJCSAgIGlzIHJlcXVlc3RlZC4gKi8KKwkJbm9kZS0+bWFwcGVkID0gZmFsc2U7CisJCW5vZGUtPnJlc2VydmVkID0gdHJ1ZTsKKwkJbm9kZS0+cmVnaW9uX3NpemUgPSByc3Zfc2l6ZTsKKwkJbm9kZS0+bWFwcGVkX3NpemUgPSAwOworCQkvKiBSZXR1cm4gdGhlIGNodW5rJ3Mgc3RhcnRpbmcgYWRkcmVzcyAqLworCQkqcHJzdl9hZGRyID0gcnN2X2FkZHI7CisJfSBlbHNlCisJCS8qZFNQIGNodW5rIG9mIGdpdmVuIHNpemUgaXMgbm90IGF2YWlsYWJsZSAqLworCQlzdGF0dXMgPSAtRU5PTUVNOworCisJc3Bpbl91bmxvY2soJmRtbV9vYmotPmRtbV9sb2NrKTsKKworCWRldl9kYmcoYnJpZGdlLCAiJXMgZG1tX21nciAlcCwgc2l6ZSAleCwgcHJzdl9hZGRyICVwXG5cdHN0YXR1cyAleCwgIgorCQkicnN2X2FkZHIgJXgsIHJzdl9zaXplICV4XG4iLCBfX2Z1bmNfXywgZG1tX21nciwgc2l6ZSwKKwkJcHJzdl9hZGRyLCBzdGF0dXMsIHJzdl9hZGRyLCByc3Zfc2l6ZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRtbV91bl9tYXBfbWVtb3J5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVtb3ZlIHRoZSBtYXBwZWQgYmxvY2sgZnJvbSB0aGUgcmVzZXJ2ZWQgY2h1bmsuCisgKi8KK2ludCBkbW1fdW5fbWFwX21lbW9yeShzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21nciwgdTMyIGFkZHIsIHUzMiAqcHNpemUpCit7CisJc3RydWN0IGRtbV9vYmplY3QgKmRtbV9vYmogPSAoc3RydWN0IGRtbV9vYmplY3QgKilkbW1fbWdyOworCXN0cnVjdCBtYXBfcGFnZSAqY2h1bms7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGluX2xvY2soJmRtbV9vYmotPmRtbV9sb2NrKTsKKwljaHVuayA9IGdldF9tYXBwZWRfcmVnaW9uKGFkZHIpOworCWlmIChjaHVuayA9PSBOVUxMKQorCQlzdGF0dXMgPSAtRU5PRU5UOworCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogVW5tYXAgdGhlIHJlZ2lvbiAqLworCQkqcHNpemUgPSBjaHVuay0+bWFwcGVkX3NpemUgKiBQR19TSVpFNEs7CisJCWNodW5rLT5tYXBwZWQgPSBmYWxzZTsKKwkJY2h1bmstPm1hcHBlZF9zaXplID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmRtbV9vYmotPmRtbV9sb2NrKTsKKworCWRldl9kYmcoYnJpZGdlLCAiJXM6IGRtbV9tZ3IgJXAsIGFkZHIgJXgsIHBzaXplICVwXG5cdHN0YXR1cyAleCwgIgorCQkiY2h1bmsgJXBcbiIsIF9fZnVuY19fLCBkbW1fbWdyLCBhZGRyLCBwc2l6ZSwgc3RhdHVzLCBjaHVuayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRtbV91bl9yZXNlcnZlX21lbW9yeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWUgYSBjaHVuayBvZiByZXNlcnZlZCBEU1AvSVZBIGFkZHJlc3Mgc3BhY2UuCisgKi8KK2ludCBkbW1fdW5fcmVzZXJ2ZV9tZW1vcnkoc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3IsIHUzMiByc3ZfYWRkcikKK3sKKwlzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX29iaiA9IChzdHJ1Y3QgZG1tX29iamVjdCAqKWRtbV9tZ3I7CisJc3RydWN0IG1hcF9wYWdlICpjaHVuazsKKwl1MzIgaTsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgY2h1bmtfc2l6ZTsKKworCXNwaW5fbG9jaygmZG1tX29iai0+ZG1tX2xvY2spOworCisJLyogRmluZCB0aGUgY2h1bmsgY29udGFpbmluZyB0aGUgcmVzZXJ2ZWQgYWRkcmVzcyAqLworCWNodW5rID0gZ2V0X21hcHBlZF9yZWdpb24ocnN2X2FkZHIpOworCWlmIChjaHVuayA9PSBOVUxMKQorCQlzdGF0dXMgPSAtRU5PRU5UOworCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogRnJlZSBhbGwgdGhlIG1hcHBlZCBwYWdlcyBmb3IgdGhpcyByZXNlcnZlZCByZWdpb24gKi8KKwkJaSA9IDA7CisJCXdoaWxlIChpIDwgY2h1bmstPnJlZ2lvbl9zaXplKSB7CisJCQlpZiAoY2h1bmtbaV0ubWFwcGVkKSB7CisJCQkJLyogUmVtb3ZlIG1hcHBpbmcgZnJvbSB0aGUgcGFnZSB0YWJsZXMuICovCisJCQkJY2h1bmtfc2l6ZSA9IGNodW5rW2ldLm1hcHBlZF9zaXplOworCQkJCS8qIENsZWFyIHRoZSBtYXBwaW5nIGZsYWdzICovCisJCQkJY2h1bmtbaV0ubWFwcGVkID0gZmFsc2U7CisJCQkJY2h1bmtbaV0ubWFwcGVkX3NpemUgPSAwOworCQkJCWkgKz0gY2h1bmtfc2l6ZTsKKwkJCX0gZWxzZQorCQkJCWkrKzsKKwkJfQorCQkvKiBDbGVhciB0aGUgZmxhZ3MgKG1hcmsgdGhlIHJlZ2lvbiAnZnJlZScpICovCisJCWNodW5rLT5yZXNlcnZlZCA9IGZhbHNlOworCQkvKiBOT1RFOiBXZSBkbyBOT1QgY29hbGVzY2UgZnJlZSByZWdpb25zIGhlcmUuCisJCSAqIEZyZWUgcmVnaW9ucyBhcmUgY29hbGVzY2VkIGluIGdldF9yZWdpb24oKSwgYXMgaXQgdHJhdmVyc2VzCisJCSAqdGhlIHdob2xlIG1hcHBpbmcgdGFibGUKKwkJICovCisJfQorCXNwaW5fdW5sb2NrKCZkbW1fb2JqLT5kbW1fbG9jayk7CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBkbW1fbWdyICVwLCByc3ZfYWRkciAleFxuXHRzdGF0dXMgJXggY2h1bmsgJXAiLAorCQlfX2Z1bmNfXywgZG1tX21nciwgcnN2X2FkZHIsIHN0YXR1cywgY2h1bmspOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBnZXRfcmVnaW9uID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0dXJucyBhIHJlZ2lvbiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbgorICovCitzdGF0aWMgc3RydWN0IG1hcF9wYWdlICpnZXRfcmVnaW9uKHUzMiBhZGRyKQoreworCXN0cnVjdCBtYXBfcGFnZSAqY3Vycl9yZWdpb24gPSBOVUxMOworCXUzMiBpID0gMDsKKworCWlmICh2aXJ0dWFsX21hcHBpbmdfdGFibGUgIT0gTlVMTCkgeworCQkvKiBmaW5kIHBhZ2UgbWFwcGVkIGJ5IHRoaXMgYWRkcmVzcyAqLworCQlpID0gRE1NX0FERFJfVE9fSU5ERVgoYWRkcik7CisJCWlmIChpIDwgdGFibGVfc2l6ZSkKKwkJCWN1cnJfcmVnaW9uID0gdmlydHVhbF9tYXBwaW5nX3RhYmxlICsgaTsKKwl9CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBjdXJyX3JlZ2lvbiAlcCwgZnJlZV9yZWdpb24gJWQsIGZyZWVfc2l6ZSAlZFxuIiwKKwkJX19mdW5jX18sIGN1cnJfcmVnaW9uLCBmcmVlX3JlZ2lvbiwgZnJlZV9zaXplKTsKKwlyZXR1cm4gY3Vycl9yZWdpb247Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X2ZyZWVfcmVnaW9uID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICBSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgZnJlZSByZWdpb24KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfcGFnZSAqZ2V0X2ZyZWVfcmVnaW9uKHUzMiBsZW4pCit7CisJc3RydWN0IG1hcF9wYWdlICpjdXJyX3JlZ2lvbiA9IE5VTEw7CisJdTMyIGkgPSAwOworCXUzMiByZWdpb25fc2l6ZSA9IDA7CisJdTMyIG5leHRfaSA9IDA7CisKKwlpZiAodmlydHVhbF9tYXBwaW5nX3RhYmxlID09IE5VTEwpCisJCXJldHVybiBjdXJyX3JlZ2lvbjsKKwlpZiAobGVuID4gZnJlZV9zaXplKSB7CisJCS8qIEZpbmQgdGhlIGxhcmdlc3QgZnJlZSByZWdpb24KKwkJICogKGNvYWxlc2NlIGR1cmluZyB0aGUgdHJhdmVyc2FsKSAqLworCQl3aGlsZSAoaSA8IHRhYmxlX3NpemUpIHsKKwkJCXJlZ2lvbl9zaXplID0gdmlydHVhbF9tYXBwaW5nX3RhYmxlW2ldLnJlZ2lvbl9zaXplOworCQkJbmV4dF9pID0gaSArIHJlZ2lvbl9zaXplOworCQkJaWYgKHZpcnR1YWxfbWFwcGluZ190YWJsZVtpXS5yZXNlcnZlZCA9PSBmYWxzZSkgeworCQkJCS8qIENvYWxlc2NlLCBpZiBwb3NzaWJsZSAqLworCQkJCWlmIChuZXh0X2kgPCB0YWJsZV9zaXplICYmCisJCQkJICAgIHZpcnR1YWxfbWFwcGluZ190YWJsZVtuZXh0X2ldLnJlc2VydmVkCisJCQkJICAgID09IGZhbHNlKSB7CisJCQkJCXZpcnR1YWxfbWFwcGluZ190YWJsZVtpXS5yZWdpb25fc2l6ZSArPQorCQkJCQkgICAgdmlydHVhbF9tYXBwaW5nX3RhYmxlCisJCQkJCSAgICBbbmV4dF9pXS5yZWdpb25fc2l6ZTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJlZ2lvbl9zaXplICo9IFBHX1NJWkU0SzsKKwkJCQlpZiAocmVnaW9uX3NpemUgPiBmcmVlX3NpemUpIHsKKwkJCQkJZnJlZV9yZWdpb24gPSBpOworCQkJCQlmcmVlX3NpemUgPSByZWdpb25fc2l6ZTsKKwkJCQl9CisJCQl9CisJCQlpID0gbmV4dF9pOworCQl9CisJfQorCWlmIChsZW4gPD0gZnJlZV9zaXplKSB7CisJCWN1cnJfcmVnaW9uID0gdmlydHVhbF9tYXBwaW5nX3RhYmxlICsgZnJlZV9yZWdpb247CisJCWZyZWVfcmVnaW9uICs9IChsZW4gLyBQR19TSVpFNEspOworCQlmcmVlX3NpemUgLT0gbGVuOworCX0KKwlyZXR1cm4gY3Vycl9yZWdpb247Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X21hcHBlZF9yZWdpb24gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogIFJldHVybnMgdGhlIHJlcXVlc3RlZG1hcHBlZCByZWdpb24KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfcGFnZSAqZ2V0X21hcHBlZF9yZWdpb24odTMyIGFkZHJzKQoreworCXUzMiBpID0gMDsKKwlzdHJ1Y3QgbWFwX3BhZ2UgKmN1cnJfcmVnaW9uID0gTlVMTDsKKworCWlmICh2aXJ0dWFsX21hcHBpbmdfdGFibGUgPT0gTlVMTCkKKwkJcmV0dXJuIGN1cnJfcmVnaW9uOworCisJaSA9IERNTV9BRERSX1RPX0lOREVYKGFkZHJzKTsKKwlpZiAoaSA8IHRhYmxlX3NpemUgJiYgKHZpcnR1YWxfbWFwcGluZ190YWJsZVtpXS5tYXBwZWQgfHwKKwkJCSAgICAgICB2aXJ0dWFsX21hcHBpbmdfdGFibGVbaV0ucmVzZXJ2ZWQpKQorCQljdXJyX3JlZ2lvbiA9IHZpcnR1YWxfbWFwcGluZ190YWJsZSArIGk7CisJcmV0dXJuIGN1cnJfcmVnaW9uOworfQorCisjaWZkZWYgRFNQX0RNTV9ERUJVRwordTMyIGRtbV9tZW1fbWFwX2R1bXAoc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3IpCit7CisJc3RydWN0IG1hcF9wYWdlICpjdXJyX25vZGUgPSBOVUxMOworCXUzMiBpOworCXUzMiBmcmVlbWVtID0gMDsKKwl1MzIgYmlnc2l6ZSA9IDA7CisKKwlzcGluX2xvY2soJmRtbV9tZ3ItPmRtbV9sb2NrKTsKKworCWlmICh2aXJ0dWFsX21hcHBpbmdfdGFibGUgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgaSArPQorCQkgICAgIHZpcnR1YWxfbWFwcGluZ190YWJsZVtpXS5yZWdpb25fc2l6ZSkgeworCQkJY3Vycl9ub2RlID0gdmlydHVhbF9tYXBwaW5nX3RhYmxlICsgaTsKKwkJCWlmIChjdXJyX25vZGUtPnJlc2VydmVkKSB7CisJCQkJLypwcmludGsoIlJFU0VSVkVEIHNpemUgPSAweCV4LCAiCisJCQkJICAgIk1hcCBzaXplID0gMHgleFxuIiwKKwkJCQkgICAoY3Vycl9ub2RlLT5yZWdpb25fc2l6ZSAqIFBHX1NJWkU0SyksCisJCQkJICAgKGN1cnJfbm9kZS0+bWFwcGVkID09IGZhbHNlKSA/IDAgOgorCQkJCSAgIChjdXJyX25vZGUtPm1hcHBlZF9zaXplICogUEdfU0laRTRLKSk7CisJCQkJICovCisJCQl9IGVsc2UgeworLyoJCQkJcHJpbnRrKCJVTlJFU0VSVkVEIHNpemUgPSAweCV4XG4iLAorCQkJCQkoY3Vycl9ub2RlLT5yZWdpb25fc2l6ZSAqIFBHX1NJWkU0SykpOworICovCisJCQkJZnJlZW1lbSArPSAoY3Vycl9ub2RlLT5yZWdpb25fc2l6ZSAqIFBHX1NJWkU0Syk7CisJCQkJaWYgKGN1cnJfbm9kZS0+cmVnaW9uX3NpemUgPiBiaWdzaXplKQorCQkJCQliaWdzaXplID0gY3Vycl9ub2RlLT5yZWdpb25fc2l6ZTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmZG1tX21nci0+ZG1tX2xvY2spOworCXByaW50ayhLRVJOX0lORk8gIlRvdGFsIERTUCBWQSBGUkVFIG1lbW9yeSA9ICVkIE1ieXRlc1xuIiwKKwkgICAgICAgZnJlZW1lbSAvICgxMDI0ICogMTAyNCkpOworCXByaW50ayhLRVJOX0lORk8gIlRvdGFsIERTUCBWQSBVU0VEIG1lbW9yeT0gJWQgTWJ5dGVzIFxuIiwKKwkgICAgICAgKCgodGFibGVfc2l6ZSAqIFBHX1NJWkU0SykgLSBmcmVlbWVtKSkgLyAoMTAyNCAqIDEwMjQpKTsKKwlwcmludGsoS0VSTl9JTkZPICJEU1AgVkEgLSBCaWdnZXN0IEZSRUUgYmxvY2sgPSAlZCBNYnl0ZXMgXG5cbiIsCisJICAgICAgIChiaWdzaXplICogUEdfU0laRTRLIC8gKDEwMjQgKiAxMDI0KSkpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2RzcGFwaS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvZHNwYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MmY3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2RzcGFwaS5jCkBAIC0wLDAgKzEsMTkwNiBAQAorLyoKKyAqIGRzcGFwaS5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvbW1vbiBEU1AgQVBJIGZ1bmN0aW9ucywgYWxzbyBpbmNsdWRlcyB0aGUgd3JhcHBlcgorICogZnVuY3Rpb25zIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgRGV2aWNlSU9Db250cm9sIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9udGZ5Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3NlcnZpY2VzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NobmwuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rydi5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Byb2MuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3RybS5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzb3VyY2UgTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kaXNwLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL21nci5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ub2RlLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3JtbS5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL21zZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9jbW0uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaW8uaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwYXBpLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGNkLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvcmVzb3VyY2VjbGVhbnVwLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZpbmVzLCBEYXRhIFN0cnVjdHVyZXMsIFR5cGVkZWZzICovCisjZGVmaW5lIE1BWF9UUkFDRUJVRkxFTiAyNTUKKyNkZWZpbmUgTUFYX0xPQURBUkdTICAgIDE2CisjZGVmaW5lIE1BWF9OT0RFUyAgICAgICA2NAorI2RlZmluZSBNQVhfU1RSRUFNUyAgICAgMTYKKyNkZWZpbmUgTUFYX0JVRlMJNjQKKworLyogVXNlZCB0byBnZXQgZHNwYnJpZGdlIGlvY3RsIHRhYmxlICovCisjZGVmaW5lIERCX0dFVF9JT0NfVEFCTEUoY21kKQkoREJfR0VUX01PRFVMRShjbWQpID4+IERCX01PRFVMRV9TSElGVCkKKworLyogRGV2aWNlIElPQ3RsIGZ1bmN0aW9uIHBvaW50ZXIgKi8KK3N0cnVjdCBhcGlfY21kIHsKKwl1MzIoKmZ4bikgKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCk7CisJdTMyIGR3X2luZGV4OworfTsKKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbHMgKi8KK3N0YXRpYyB1MzIgYXBpX2NfcmVmczsKKworLyoKKyAqICBGdW5jdGlvbiB0YWJsZXMuCisgKiAgVGhlIG9yZGVyIG9mIHRoZXNlIGZ1bmN0aW9ucyBNVVNUIGJlIHRoZSBzYW1lIGFzIHRoZSBvcmRlciBvZiB0aGUgY29tbWFuZAorICogIG51bWJlcnMgZGVmaW5lZCBpbiBkc3BhcGktaW9jdGwuaCAgVGhpcyBpcyBob3cgYW4gSU9DVEwgbnVtYmVyIGluIHVzZXIgbW9kZQorICogIHR1cm5zIGludG8gYSBmdW5jdGlvbiBjYWxsIGluIGtlcm5lbCBtb2RlLgorICovCisKKy8qIE1HUiB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCBhcGlfY21kIG1ncl9jbWRbXSA9IHsKKwl7bWdyd3JhcF9lbnVtX25vZGVfaW5mb30sCS8qIE1HUl9FTlVNTk9ERV9JTkZPICovCisJe21ncndyYXBfZW51bV9wcm9jX2luZm99LAkvKiBNR1JfRU5VTVBST0NfSU5GTyAqLworCXttZ3J3cmFwX3JlZ2lzdGVyX29iamVjdH0sCS8qIE1HUl9SRUdJU1RFUk9CSkVDVCAqLworCXttZ3J3cmFwX3VucmVnaXN0ZXJfb2JqZWN0fSwJLyogTUdSX1VOUkVHSVNURVJPQkpFQ1QgKi8KKwl7bWdyd3JhcF93YWl0X2Zvcl9icmlkZ2VfZXZlbnRzfSwJLyogTUdSX1dBSVQgKi8KKwl7bWdyd3JhcF9nZXRfcHJvY2Vzc19yZXNvdXJjZXNfaW5mb30sCS8qIE1HUl9HRVRfUFJPQ19SRVMgKi8KK307CisKKy8qIFBST0Mgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgYXBpX2NtZCBwcm9jX2NtZFtdID0geworCXtwcm9jd3JhcF9hdHRhY2h9LAkvKiBQUk9DX0FUVEFDSCAqLworCXtwcm9jd3JhcF9jdHJsfSwJLyogUFJPQ19DVFJMICovCisJe3Byb2N3cmFwX2RldGFjaH0sCS8qIFBST0NfREVUQUNIICovCisJe3Byb2N3cmFwX2VudW1fbm9kZV9pbmZvfSwJLyogUFJPQ19FTlVNTk9ERSAqLworCXtwcm9jd3JhcF9lbnVtX3Jlc291cmNlc30sCS8qIFBST0NfRU5VTVJFU09VUkNFUyAqLworCXtwcm9jd3JhcF9nZXRfc3RhdGV9LAkvKiBQUk9DX0dFVF9TVEFURSAqLworCXtwcm9jd3JhcF9nZXRfdHJhY2V9LAkvKiBQUk9DX0dFVF9UUkFDRSAqLworCXtwcm9jd3JhcF9sb2FkfSwJLyogUFJPQ19MT0FEICovCisJe3Byb2N3cmFwX3JlZ2lzdGVyX25vdGlmeX0sCS8qIFBST0NfUkVHSVNURVJOT1RJRlkgKi8KKwl7cHJvY3dyYXBfc3RhcnR9LAkvKiBQUk9DX1NUQVJUICovCisJe3Byb2N3cmFwX3Jlc2VydmVfbWVtb3J5fSwJLyogUFJPQ19SU1ZNRU0gKi8KKwl7cHJvY3dyYXBfdW5fcmVzZXJ2ZV9tZW1vcnl9LAkvKiBQUk9DX1VOUlNWTUVNICovCisJe3Byb2N3cmFwX21hcH0sCQkvKiBQUk9DX01BUE1FTSAqLworCXtwcm9jd3JhcF91bl9tYXB9LAkvKiBQUk9DX1VOTUFQTUVNICovCisJe3Byb2N3cmFwX2ZsdXNoX21lbW9yeX0sCS8qIFBST0NfRkxVU0hNRU1PUlkgKi8KKwl7cHJvY3dyYXBfc3RvcH0sCS8qIFBST0NfU1RPUCAqLworCXtwcm9jd3JhcF9pbnZhbGlkYXRlX21lbW9yeX0sCS8qIFBST0NfSU5WQUxJREFURU1FTU9SWSAqLworCXtwcm9jd3JhcF9iZWdpbl9kbWF9LAkvKiBQUk9DX0JFR0lORE1BICovCisJe3Byb2N3cmFwX2VuZF9kbWF9LAkvKiBQUk9DX0VORERNQSAqLworfTsKKworLyogTk9ERSB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCBhcGlfY21kIG5vZGVfY21kW10gPSB7CisJe25vZGV3cmFwX2FsbG9jYXRlfSwJLyogTk9ERV9BTExPQ0FURSAqLworCXtub2Rld3JhcF9hbGxvY19tc2dfYnVmfSwJLyogTk9ERV9BTExPQ01TR0JVRiAqLworCXtub2Rld3JhcF9jaGFuZ2VfcHJpb3JpdHl9LAkvKiBOT0RFX0NIQU5HRVBSSU9SSVRZICovCisJe25vZGV3cmFwX2Nvbm5lY3R9LAkvKiBOT0RFX0NPTk5FQ1QgKi8KKwl7bm9kZXdyYXBfY3JlYXRlfSwJLyogTk9ERV9DUkVBVEUgKi8KKwl7bm9kZXdyYXBfZGVsZXRlfSwJLyogTk9ERV9ERUxFVEUgKi8KKwl7bm9kZXdyYXBfZnJlZV9tc2dfYnVmfSwJLyogTk9ERV9GUkVFTVNHQlVGICovCisJe25vZGV3cmFwX2dldF9hdHRyfSwJLyogTk9ERV9HRVRBVFRSICovCisJe25vZGV3cmFwX2dldF9tZXNzYWdlfSwJLyogTk9ERV9HRVRNRVNTQUdFICovCisJe25vZGV3cmFwX3BhdXNlfSwJLyogTk9ERV9QQVVTRSAqLworCXtub2Rld3JhcF9wdXRfbWVzc2FnZX0sCS8qIE5PREVfUFVUTUVTU0FHRSAqLworCXtub2Rld3JhcF9yZWdpc3Rlcl9ub3RpZnl9LAkvKiBOT0RFX1JFR0lTVEVSTk9USUZZICovCisJe25vZGV3cmFwX3J1bn0sCQkvKiBOT0RFX1JVTiAqLworCXtub2Rld3JhcF90ZXJtaW5hdGV9LAkvKiBOT0RFX1RFUk1JTkFURSAqLworCXtub2Rld3JhcF9nZXRfdXVpZF9wcm9wc30sCS8qIE5PREVfR0VUVVVJRFBST1BTICovCit9OworCisvKiBTVFJNIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgc3RydWN0IGFwaV9jbWQgc3RybV9jbWRbXSA9IHsKKwl7c3RybXdyYXBfYWxsb2NhdGVfYnVmZmVyfSwJLyogU1RSTV9BTExPQ0FURUJVRkZFUiAqLworCXtzdHJtd3JhcF9jbG9zZX0sCS8qIFNUUk1fQ0xPU0UgKi8KKwl7c3RybXdyYXBfZnJlZV9idWZmZXJ9LAkvKiBTVFJNX0ZSRUVCVUZGRVIgKi8KKwl7c3RybXdyYXBfZ2V0X2V2ZW50X2hhbmRsZX0sCS8qIFNUUk1fR0VURVZFTlRIQU5ETEUgKi8KKwl7c3RybXdyYXBfZ2V0X2luZm99LAkvKiBTVFJNX0dFVElORk8gKi8KKwl7c3RybXdyYXBfaWRsZX0sCS8qIFNUUk1fSURMRSAqLworCXtzdHJtd3JhcF9pc3N1ZX0sCS8qIFNUUk1fSVNTVUUgKi8KKwl7c3RybXdyYXBfb3Blbn0sCS8qIFNUUk1fT1BFTiAqLworCXtzdHJtd3JhcF9yZWNsYWltfSwJLyogU1RSTV9SRUNMQUlNICovCisJe3N0cm13cmFwX3JlZ2lzdGVyX25vdGlmeX0sCS8qIFNUUk1fUkVHSVNURVJOT1RJRlkgKi8KKwl7c3RybXdyYXBfc2VsZWN0fSwJLyogU1RSTV9TRUxFQ1QgKi8KK307CisKKy8qIENNTSB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCBhcGlfY21kIGNtbV9jbWRbXSA9IHsKKwl7Y21td3JhcF9jYWxsb2NfYnVmfSwJLyogQ01NX0FMTE9DQlVGICovCisJe2NtbXdyYXBfZnJlZV9idWZ9LAkvKiBDTU1fRlJFRUJVRiAqLworCXtjbW13cmFwX2dldF9oYW5kbGV9LAkvKiBDTU1fR0VUSEFORExFICovCisJe2NtbXdyYXBfZ2V0X2luZm99LAkvKiBDTU1fR0VUSU5GTyAqLworfTsKKworLyogQXJyYXkgdXNlZCB0byBzdG9yZSBpb2N0bCB0YWJsZSBzaXplcy4gSXQgY2FuIGhvbGQgdXAgdG8gOCBlbnRyaWVzICovCitzdGF0aWMgdTggc2l6ZV9jbWRbXSA9IHsKKwlBUlJBWV9TSVpFKG1ncl9jbWQpLAorCUFSUkFZX1NJWkUocHJvY19jbWQpLAorCUFSUkFZX1NJWkUobm9kZV9jbWQpLAorCUFSUkFZX1NJWkUoc3RybV9jbWQpLAorCUFSUkFZX1NJWkUoY21tX2NtZCksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgX2NwX2ZtX3Vzcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKiBmcm9tLAorCQkJICAgICAgaW50ICplcnIsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpCit7CisJaWYgKCplcnIpCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseSghZnJvbSkpIHsKKwkJKmVyciA9IC1FRkFVTFQ7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoY29weV9mcm9tX3VzZXIodG8sIGZyb20sIGJ5dGVzKSkpCisJCSplcnIgPSAtRUZBVUxUOworfQorCisjZGVmaW5lIENQX0ZNX1VTUih0bywgZnJvbSwgZXJyLCBuKQkJCQlcCisJX2NwX2ZtX3Vzcih0bywgZnJvbSwgJihlcnIpLCAobikgKiBzaXplb2YoKih0bykpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2NwX3RvX3Vzcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCisJCQkgICAgICBpbnQgKmVyciwgdW5zaWduZWQgbG9uZyBieXRlcykKK3sKKwlpZiAoKmVycikKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KCF0bykpIHsKKwkJKmVyciA9IC1FRkFVTFQ7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoY29weV90b191c2VyKHRvLCBmcm9tLCBieXRlcykpKQorCQkqZXJyID0gLUVGQVVMVDsKK30KKworI2RlZmluZSBDUF9UT19VU1IodG8sIGZyb20sIGVyciwgbikJCQkJXAorCV9jcF90b191c3IodG8sIGZyb20sICYoZXJyKSwgKG4pICogc2l6ZW9mKCooZnJvbSkpKQorCisvKgorICogID09PT09PT09IGFwaV9jYWxsX2Rldl9pb2N0bCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENhbGwgdGhlICh3cmFwcGVyKSBmdW5jdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgQVBJIElPQ1RMLgorICovCitpbmxpbmUgaW50IGFwaV9jYWxsX2Rldl9pb2N0bCh1MzIgY21kLCB1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsCisJCQkJICAgICAgdTMyICpyZXN1bHQsIHZvaWQgKnByX2N0eHQpCit7CisJdTMyKCppb2N0bF9jbWQpICh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpID0gTlVMTDsKKwlpbnQgaTsKKworCWlmIChfSU9DX1RZUEUoY21kKSAhPSBEQikgeworCQlwcl9lcnIoIiVzOiBJbmNvbXBhdGlibGUgZHNwYnJpZGdlIGlvY3RsIG51bWJlclxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoREJfR0VUX0lPQ19UQUJMRShjbWQpID4gQVJSQVlfU0laRShzaXplX2NtZCkpIHsKKwkJcHJfZXJyKCIlczogdW5kZWZpbmVkIGlvY3RsIG1vZHVsZVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgcmVxdWlyZWQgY21kIHRhYmxlICovCisJaSA9IERCX0dFVF9JT0MoY21kKTsKKwlpZiAoaSA+IHNpemVfY21kW0RCX0dFVF9JT0NfVEFCTEUoY21kKV0pIHsKKwkJcHJfZXJyKCIlczogcmVxdWVzdGVkIGlvY3RsICVkIG91dCBvZiBib3VuZHMgZm9yIHRhYmxlICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGksIERCX0dFVF9JT0NfVEFCTEUoY21kKSk7CisJCWdvdG8gZXJyOworCX0KKworCXN3aXRjaCAoREJfR0VUX01PRFVMRShjbWQpKSB7CisJY2FzZSBEQl9NR1I6CisJCWlvY3RsX2NtZCA9IG1ncl9jbWRbaV0uZnhuOworCQlicmVhazsKKwljYXNlIERCX1BST0M6CisJCWlvY3RsX2NtZCA9IHByb2NfY21kW2ldLmZ4bjsKKwkJYnJlYWs7CisJY2FzZSBEQl9OT0RFOgorCQlpb2N0bF9jbWQgPSBub2RlX2NtZFtpXS5meG47CisJCWJyZWFrOworCWNhc2UgREJfU1RSTToKKwkJaW9jdGxfY21kID0gc3RybV9jbWRbaV0uZnhuOworCQlicmVhazsKKwljYXNlIERCX0NNTToKKwkJaW9jdGxfY21kID0gY21tX2NtZFtpXS5meG47CisJCWJyZWFrOworCX0KKworCWlmICghaW9jdGxfY21kKSB7CisJCXByX2VycigiJXM6IHJlcXVlc3RlZCBpb2N0bCBub3QgZGVmaW5lZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9IGVsc2UgeworCQkqcmVzdWx0ID0gKCppb2N0bF9jbWQpIChhcmdzLCBwcl9jdHh0KTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogID09PT09PT09IGFwaV9leGl0ID09PT09PT09CisgKi8KK3ZvaWQgYXBpX2V4aXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShhcGlfY19yZWZzID4gMCk7CisJYXBpX2NfcmVmcy0tOworCisJaWYgKGFwaV9jX3JlZnMgPT0gMCkgeworCQkvKiBSZWxlYXNlIGFsbCBtb2R1bGVzIGluaXRpYWxpemVkIGluIGFwaV9pbml0KCkuICovCisJCWNvZF9leGl0KCk7CisJCWRldl9leGl0KCk7CisJCWNobmxfZXhpdCgpOworCQltc2dfZXhpdCgpOworCQlpb19leGl0KCk7CisJCXN0cm1fZXhpdCgpOworCQlkaXNwX2V4aXQoKTsKKwkJbm9kZV9leGl0KCk7CisJCXByb2NfZXhpdCgpOworCQltZ3JfZXhpdCgpOworCQlybW1fZXhpdCgpOworCQlkcnZfZXhpdCgpOworCX0KKwlEQkNfRU5TVVJFKGFwaV9jX3JlZnMgPj0gMCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYXBpX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBNb2R1bGUgaW5pdGlhbGl6YXRpb24gdXNlZCBieSBCcmlkZ2UgQVBJLgorICovCitib29sIGFwaV9pbml0KHZvaWQpCit7CisJYm9vbCByZXQgPSB0cnVlOworCWJvb2wgZmRydiwgZmRldiwgZmNvZCwgZmNobmwsIGZtc2csIGZpbzsKKwlib29sIGZtZ3IsIGZwcm9jLCBmbm9kZSwgZmRpc3AsIGZzdHJtLCBmcm1tOworCisJaWYgKGFwaV9jX3JlZnMgPT0gMCkgeworCQkvKiBpbml0aWFsaXplIGRyaXZlciBhbmQgb3RoZXIgbW9kdWxlcyAqLworCQlmZHJ2ID0gZHJ2X2luaXQoKTsKKwkJZm1nciA9IG1ncl9pbml0KCk7CisJCWZwcm9jID0gcHJvY19pbml0KCk7CisJCWZub2RlID0gbm9kZV9pbml0KCk7CisJCWZkaXNwID0gZGlzcF9pbml0KCk7CisJCWZzdHJtID0gc3RybV9pbml0KCk7CisJCWZybW0gPSBybW1faW5pdCgpOworCQlmY2hubCA9IGNobmxfaW5pdCgpOworCQlmbXNnID0gbXNnX21vZF9pbml0KCk7CisJCWZpbyA9IGlvX2luaXQoKTsKKwkJZmRldiA9IGRldl9pbml0KCk7CisJCWZjb2QgPSBjb2RfaW5pdCgpOworCQlyZXQgPSBmZHJ2ICYmIGZkZXYgJiYgZmNobmwgJiYgZmNvZCAmJiBmbXNnICYmIGZpbzsKKwkJcmV0ID0gcmV0ICYmIGZtZ3IgJiYgZnByb2MgJiYgZnJtbTsKKwkJaWYgKCFyZXQpIHsKKwkJCWlmIChmZHJ2KQorCQkJCWRydl9leGl0KCk7CisKKwkJCWlmIChmbWdyKQorCQkJCW1ncl9leGl0KCk7CisKKwkJCWlmIChmc3RybSkKKwkJCQlzdHJtX2V4aXQoKTsKKworCQkJaWYgKGZwcm9jKQorCQkJCXByb2NfZXhpdCgpOworCisJCQlpZiAoZm5vZGUpCisJCQkJbm9kZV9leGl0KCk7CisKKwkJCWlmIChmZGlzcCkKKwkJCQlkaXNwX2V4aXQoKTsKKworCQkJaWYgKGZjaG5sKQorCQkJCWNobmxfZXhpdCgpOworCisJCQlpZiAoZm1zZykKKwkJCQltc2dfZXhpdCgpOworCisJCQlpZiAoZmlvKQorCQkJCWlvX2V4aXQoKTsKKworCQkJaWYgKGZkZXYpCisJCQkJZGV2X2V4aXQoKTsKKworCQkJaWYgKGZjb2QpCisJCQkJY29kX2V4aXQoKTsKKworCQkJaWYgKGZybW0pCisJCQkJcm1tX2V4aXQoKTsKKworCQl9CisJfQorCWlmIChyZXQpCisJCWFwaV9jX3JlZnMrKzsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gYXBpX2luaXRfY29tcGxldGUyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUGVyZm9ybSBhbnkgcmVxdWlyZWQgYnJpZGdlIGluaXRpYWxpemF0aW9uIHdoaWNoIGNhbm5vdAorICogICAgICBiZSBwZXJmb3JtZWQgaW4gYXBpX2luaXQoKSBvciBkZXZfc3RhcnRfZGV2aWNlKCkgZHVlCisgKiAgICAgIHRvIHRoZSBmYWN0IHRoYXQgc29tZSBzZXJ2aWNlcyBhcmUgbm90IHlldAorICogICAgICBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgorICogIFBhcmFtZXRlcnM6CisgKiAgUmV0dXJuczoKKyAqICAgICAgMDoJQWxsb3cgdGhpcyBkZXZpY2UgdG8gbG9hZAorICogICAgICAtRVBFUk06ICAgICAgRmFpbHVyZS4KKyAqICBSZXF1aXJlczoKKyAqICAgICAgQnJpZGdlIEFQSSBpbml0aWFsaXplZC4KKyAqICBFbnN1cmVzOgorICovCitpbnQgYXBpX2luaXRfY29tcGxldGUyKHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZTsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmo7CisJdTggZGV2X3R5cGU7CisJdTMyIHRtcDsKKworCURCQ19SRVFVSVJFKGFwaV9jX3JlZnMgPiAwKTsKKworCS8qICBXYWxrIHRoZSBsaXN0IG9mIERldk9iamVjdHMsIGdldCBlYWNoIGRldm5vZGUsIGFuZCBhdHRlbXB0aW5nIHRvCisJICogIGF1dG9zdGFydCB0aGUgYm9hcmQuIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIENPRiBsb2FkaW5nLCB3aGljaAorCSAqICByZXF1aXJlcyBLRklMRS4gKi8KKwlmb3IgKGhkZXZfb2JqID0gZGV2X2dldF9maXJzdCgpOyBoZGV2X29iaiAhPSBOVUxMOworCSAgICAgaGRldl9vYmogPSBkZXZfZ2V0X25leHQoaGRldl9vYmopKSB7CisJCWlmIChkZXZfZ2V0X2Rldl9ub2RlKGhkZXZfb2JqLCAmZGV2X25vZGUpKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldl9nZXRfZGV2X3R5cGUoaGRldl9vYmosICZkZXZfdHlwZSkpCisJCQljb250aW51ZTsKKworCQlpZiAoKGRldl90eXBlID09IERTUF9VTklUKSB8fCAoZGV2X3R5cGUgPT0gSVZBX1VOSVQpKQorCQkJaWYgKGNmZ19nZXRfYXV0b19zdGFydChkZXZfbm9kZSwgJnRtcCkgPT0gMAorCQkJCQkJCQkJJiYgdG1wKQorCQkJCXByb2NfYXV0b19zdGFydChkZXZfbm9kZSwgaGRldl9vYmopOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFRPRE86IFJlbW92ZSBkZXByZWNhdGVkIGFuZCBub3QgaW1wbGVtZW50ZWQgaW9jdGwgd3JhcHBlcnMgKi8KKworLyoKKyAqID09PT09PT09IG1ncndyYXBfZW51bV9ub2RlX2luZm8gPT09PT09PT0KKyAqLwordTMyIG1ncndyYXBfZW51bV9ub2RlX2luZm8odW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCXU4ICpwbmRiX3Byb3BzOworCXUzMiBudW1fbm9kZXM7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIHNpemUgPSBhcmdzLT5hcmdzX21ncl9lbnVtbm9kZV9pbmZvLnVuZGJfcHJvcHNfc2l6ZTsKKworCWlmIChzaXplIDwgc2l6ZW9mKHN0cnVjdCBkc3BfbmRicHJvcHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBuZGJfcHJvcHMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbmRiX3Byb3BzID09IE5VTEwpCisJCXN0YXR1cyA9IC1FTk9NRU07CisKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPQorCQkgICAgbWdyX2VudW1fbm9kZV9pbmZvKGFyZ3MtPmFyZ3NfbWdyX2VudW1ub2RlX2luZm8ubm9kZV9pZCwKKwkJCQkgICAgICAgKHN0cnVjdCBkc3BfbmRicHJvcHMgKilwbmRiX3Byb3BzLCBzaXplLAorCQkJCSAgICAgICAmbnVtX25vZGVzKTsKKwl9CisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3NfbWdyX2VudW1ub2RlX2luZm8ucG5kYl9wcm9wcywgcG5kYl9wcm9wcywgc3RhdHVzLAorCQkgIHNpemUpOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX21ncl9lbnVtbm9kZV9pbmZvLnB1X251bV9ub2RlcywgJm51bV9ub2Rlcywgc3RhdHVzLAorCQkgIDEpOworCWtmcmVlKHBuZGJfcHJvcHMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IG1ncndyYXBfZW51bV9wcm9jX2luZm8gPT09PT09PT0KKyAqLwordTMyIG1ncndyYXBfZW51bV9wcm9jX2luZm8odW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCXU4ICpwcm9jZXNzb3JfaW5mbzsKKwl1OCBudW1fcHJvY3M7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIHNpemUgPSBhcmdzLT5hcmdzX21ncl9lbnVtcHJvY19pbmZvLnByb2Nlc3Nvcl9pbmZvX3NpemU7CisKKwlpZiAoc2l6ZSA8IHNpemVvZihzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb2Nlc3Nvcl9pbmZvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvY2Vzc29yX2luZm8gPT0gTlVMTCkKKwkJc3RhdHVzID0gLUVOT01FTTsKKworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9CisJCSAgICBtZ3JfZW51bV9wcm9jZXNzb3JfaW5mbyhhcmdzLT5hcmdzX21ncl9lbnVtcHJvY19pbmZvLgorCQkJCQkgICAgcHJvY2Vzc29yX2lkLAorCQkJCQkgICAgKHN0cnVjdCBkc3BfcHJvY2Vzc29yaW5mbyAqKQorCQkJCQkgICAgcHJvY2Vzc29yX2luZm8sIHNpemUsICZudW1fcHJvY3MpOworCX0KKwlDUF9UT19VU1IoYXJncy0+YXJnc19tZ3JfZW51bXByb2NfaW5mby5wcm9jZXNzb3JfaW5mbywgcHJvY2Vzc29yX2luZm8sCisJCSAgc3RhdHVzLCBzaXplKTsKKwlDUF9UT19VU1IoYXJncy0+YXJnc19tZ3JfZW51bXByb2NfaW5mby5wdV9udW1fcHJvY3MsICZudW1fcHJvY3MsCisJCSAgc3RhdHVzLCAxKTsKKwlrZnJlZShwcm9jZXNzb3JfaW5mbyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIFdSQVBfTUFQMkNBTExFUih4KSB4CisvKgorICogPT09PT09PT0gbWdyd3JhcF9yZWdpc3Rlcl9vYmplY3QgPT09PT09PT0KKyAqLwordTMyIG1ncndyYXBfcmVnaXN0ZXJfb2JqZWN0KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwl1MzIgcmV0OworCXN0cnVjdCBkc3BfdXVpZCB1dWlkX29iajsKKwl1MzIgcGF0aF9zaXplID0gMDsKKwljaGFyICpwc3pfcGF0aF9uYW1lID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKworCUNQX0ZNX1VTUigmdXVpZF9vYmosIGFyZ3MtPmFyZ3NfbWdyX3JlZ2lzdGVyb2JqZWN0LnV1aWRfb2JqLCBzdGF0dXMsIDEpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisJLyogcGF0aF9zaXplIGlzIGluY3JlYXNlZCBieSAxIHRvIGFjY29tbW9kYXRlIE5VTEwgKi8KKwlwYXRoX3NpemUgPSBzdHJsZW5fdXNlcigoY2hhciAqKQorCQkJCWFyZ3MtPmFyZ3NfbWdyX3JlZ2lzdGVyb2JqZWN0LnBzel9wYXRoX25hbWUpICsKKwkgICAgMTsKKwlwc3pfcGF0aF9uYW1lID0ga21hbGxvYyhwYXRoX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcHN6X3BhdGhfbmFtZSkKKwkJZ290byBmdW5jX2VuZDsKKwlyZXQgPSBzdHJuY3B5X2Zyb21fdXNlcihwc3pfcGF0aF9uYW1lLAorCQkJCShjaGFyICopYXJncy0+YXJnc19tZ3JfcmVnaXN0ZXJvYmplY3QuCisJCQkJcHN6X3BhdGhfbmFtZSwgcGF0aF9zaXplKTsKKwlpZiAoIXJldCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCWlmIChhcmdzLT5hcmdzX21ncl9yZWdpc3Rlcm9iamVjdC5vYmpfdHlwZSA+PSBEU1BfRENETUFYT0JKVFlQRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBkY2RfcmVnaXN0ZXJfb2JqZWN0KCZ1dWlkX29iaiwKKwkJCQkgICAgIGFyZ3MtPmFyZ3NfbWdyX3JlZ2lzdGVyb2JqZWN0Lm9ial90eXBlLAorCQkJCSAgICAgKGNoYXIgKilwc3pfcGF0aF9uYW1lKTsKK2Z1bmNfZW5kOgorCWtmcmVlKHBzel9wYXRoX25hbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBtZ3J3cmFwX3VucmVnaXN0ZXJfb2JqZWN0ID09PT09PT09CisgKi8KK3UzMiBtZ3J3cmFwX3VucmVnaXN0ZXJfb2JqZWN0KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNwX3V1aWQgdXVpZF9vYmo7CisKKwlDUF9GTV9VU1IoJnV1aWRfb2JqLCBhcmdzLT5hcmdzX21ncl9yZWdpc3Rlcm9iamVjdC51dWlkX29iaiwgc3RhdHVzLCAxKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJc3RhdHVzID0gZGNkX3VucmVnaXN0ZXJfb2JqZWN0KCZ1dWlkX29iaiwKKwkJCQkgICAgICAgYXJncy0+YXJnc19tZ3JfdW5yZWdpc3Rlcm9iamVjdC4KKwkJCQkgICAgICAgb2JqX3R5cGUpOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKKworfQorCisvKgorICogPT09PT09PT0gbWdyd3JhcF93YWl0X2Zvcl9icmlkZ2VfZXZlbnRzID09PT09PT09CisgKi8KK3UzMiBtZ3J3cmFwX3dhaXRfZm9yX2JyaWRnZV9ldmVudHModW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uICphbm90aWZpY2F0aW9uc1tNQVhfRVZFTlRTXTsKKwlzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbiBub3RpZmljYXRpb25zW01BWF9FVkVOVFNdOworCXUzMiBpbmRleCwgaTsKKwl1MzIgY291bnQgPSBhcmdzLT5hcmdzX21ncl93YWl0LmNvdW50OworCisJaWYgKGNvdW50ID4gTUFYX0VWRU5UUykKKwkJc3RhdHVzID0gLUVJTlZBTDsKKworCS8qIGdldCB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gdXNlciBzdHJ1Y3R1cmVzICovCisJQ1BfRk1fVVNSKGFub3RpZmljYXRpb25zLCBhcmdzLT5hcmdzX21ncl93YWl0LmFub3RpZmljYXRpb25zLAorCQkgIHN0YXR1cywgY291bnQpOworCS8qIGdldCB0aGUgZXZlbnRzICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJQ1BfRk1fVVNSKCZub3RpZmljYXRpb25zW2ldLCBhbm90aWZpY2F0aW9uc1tpXSwgc3RhdHVzLCAxKTsKKwkJaWYgKHN0YXR1cyB8fCAhbm90aWZpY2F0aW9uc1tpXS5oYW5kbGUpIHsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQkvKiBzZXQgdGhlIGFycmF5IG9mIHBvaW50ZXJzIHRvIGtlcm5lbCBzdHJ1Y3R1cmVzICovCisJCWFub3RpZmljYXRpb25zW2ldID0gJm5vdGlmaWNhdGlvbnNbaV07CisJfQorCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IG1ncl93YWl0X2Zvcl9icmlkZ2VfZXZlbnRzKGFub3RpZmljYXRpb25zLCBjb3VudCwKKwkJCQkJCQkgJmluZGV4LAorCQkJCQkJCSBhcmdzLT5hcmdzX21ncl93YWl0LgorCQkJCQkJCSB1dGltZW91dCk7CisJfQorCUNQX1RPX1VTUihhcmdzLT5hcmdzX21ncl93YWl0LnB1X2luZGV4LCAmaW5kZXgsIHN0YXR1cywgMSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IE1HUldSQVBfR2V0UHJvY2Vzc1Jlc291cmNlSW5mbyA9PT09PT09PQorICovCit1MzIgX19kZXByZWNhdGVkIG1ncndyYXBfZ2V0X3Byb2Nlc3NfcmVzb3VyY2VzX2luZm8odW5pb24gdHJhcHBlZF9hcmdzICogYXJncywKKwkJCQkJCSAgICB2b2lkICpwcl9jdHh0KQoreworCXByX2VycigiJXM6IGRlcHJlY2F0ZWQgZHNwYnJpZGdlIGlvY3RsXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiA9PT09PT09PSBwcm9jd3JhcF9hdHRhY2ggPT09PT09PT0KKyAqLwordTMyIHByb2N3cmFwX2F0dGFjaCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJdm9pZCAqcHJvY2Vzc29yOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkc3BfcHJvY2Vzc29yYXR0cmluIHByb2NfYXR0cl9pbiwgKmF0dHJfaW4gPSBOVUxMOworCisJLyogT3B0aW9uYWwgYXJndW1lbnQgKi8KKwlpZiAoYXJncy0+YXJnc19wcm9jX2F0dGFjaC5hdHRyX2luKSB7CisJCUNQX0ZNX1VTUigmcHJvY19hdHRyX2luLCBhcmdzLT5hcmdzX3Byb2NfYXR0YWNoLmF0dHJfaW4sIHN0YXR1cywKKwkJCSAgMSk7CisJCWlmICghc3RhdHVzKQorCQkJYXR0cl9pbiA9ICZwcm9jX2F0dHJfaW47CisJCWVsc2UKKwkJCWdvdG8gZnVuY19lbmQ7CisKKwl9CisJc3RhdHVzID0gcHJvY19hdHRhY2goYXJncy0+YXJnc19wcm9jX2F0dGFjaC5wcm9jZXNzb3JfaWQsIGF0dHJfaW4sCisJCQkgICAgICZwcm9jZXNzb3IsIHByX2N0eHQpOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3Byb2NfYXR0YWNoLnBoX3Byb2Nlc3NvciwgJnByb2Nlc3Nvciwgc3RhdHVzLCAxKTsKK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBwcm9jd3JhcF9jdHJsID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF9jdHJsKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwl1MzIgY2JfZGF0YV9zaXplLCBfX3VzZXIgKiBwc2l6ZSA9ICh1MzIgX191c2VyICopCisJICAgIGFyZ3MtPmFyZ3NfcHJvY19jdHJsLnBhcmdzOworCXU4ICpwYXJncyA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdm9pZCAqaHByb2Nlc3NvciA9ICgoc3RydWN0IHByb2Nlc3NfY29udGV4dCAqKXByX2N0eHQpLT5ocHJvY2Vzc29yOworCisJaWYgKHBzaXplKSB7CisJCWlmIChnZXRfdXNlcihjYl9kYXRhX3NpemUsIHBzaXplKSkgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCQljYl9kYXRhX3NpemUgKz0gc2l6ZW9mKHUzMik7CisJCXBhcmdzID0ga21hbGxvYyhjYl9kYXRhX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAocGFyZ3MgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZnVuY19lbmQ7CisJCX0KKworCQlDUF9GTV9VU1IocGFyZ3MsIGFyZ3MtPmFyZ3NfcHJvY19jdHJsLnBhcmdzLCBzdGF0dXMsCisJCQkgIGNiX2RhdGFfc2l6ZSk7CisJfQorCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IHByb2NfY3RybChocHJvY2Vzc29yLAorCQkJCSAgIGFyZ3MtPmFyZ3NfcHJvY19jdHJsLmR3X2NtZCwKKwkJCQkgICAoc3RydWN0IGRzcF9jYmRhdGEgKilwYXJncyk7CisJfQorCisJLyogQ1BfVE9fVVNSKGFyZ3MtPmFyZ3NfcHJvY19jdHJsLnBhcmdzLCBwYXJncywgc3RhdHVzLCAxKTsgKi8KKwlrZnJlZShwYXJncyk7CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gcHJvY3dyYXBfZGV0YWNoID09PT09PT09CisgKi8KK3UzMiBfX2RlcHJlY2F0ZWQgcHJvY3dyYXBfZGV0YWNoKHVuaW9uIHRyYXBwZWRfYXJncyAqIGFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJLyogcHJvY19kZXRhY2ggY2FsbGVkIGF0IGJyaWRnZV9yZWxlYXNlIG9ubHkgKi8KKwlwcl9lcnIoIiVzOiBkZXByZWNhdGVkIGRzcGJyaWRnZSBpb2N0bFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCisvKgorICogPT09PT09PT0gcHJvY3dyYXBfZW51bV9ub2RlX2luZm8gPT09PT09PT0KKyAqLwordTMyIHByb2N3cmFwX2VudW1fbm9kZV9pbmZvKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXZvaWQgKm5vZGVfdGFiW01BWF9OT0RFU107CisJdTMyIG51bV9ub2RlczsKKwl1MzIgYWxsb2NfY250OworCXZvaWQgKmhwcm9jZXNzb3IgPSAoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3NvcjsKKworCWlmICghYXJncy0+YXJnc19wcm9jX2VudW1ub2RlX2luZm8ubm9kZV90YWJfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBwcm9jX2VudW1fbm9kZXMoaHByb2Nlc3NvciwKKwkJCQkgbm9kZV90YWIsCisJCQkJIGFyZ3MtPmFyZ3NfcHJvY19lbnVtbm9kZV9pbmZvLm5vZGVfdGFiX3NpemUsCisJCQkJICZudW1fbm9kZXMsICZhbGxvY19jbnQpOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3Byb2NfZW51bW5vZGVfaW5mby5ub2RlX3RhYiwgbm9kZV90YWIsIHN0YXR1cywKKwkJICBudW1fbm9kZXMpOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3Byb2NfZW51bW5vZGVfaW5mby5wdV9udW1fbm9kZXMsICZudW1fbm9kZXMsCisJCSAgc3RhdHVzLCAxKTsKKwlDUF9UT19VU1IoYXJncy0+YXJnc19wcm9jX2VudW1ub2RlX2luZm8ucHVfYWxsb2NhdGVkLCAmYWxsb2NfY250LAorCQkgIHN0YXR1cywgMSk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordTMyIHByb2N3cmFwX2VuZF9kbWEodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXM7CisKKwlpZiAoYXJncy0+YXJnc19wcm9jX2RtYS5kaXIgPj0gRE1BX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gcHJvY19lbmRfZG1hKHByX2N0eHQsCisJCQkJICAgYXJncy0+YXJnc19wcm9jX2RtYS5wbXB1X2FkZHIsCisJCQkJICAgYXJncy0+YXJnc19wcm9jX2RtYS51bF9zaXplLAorCQkJCSAgIGFyZ3MtPmFyZ3NfcHJvY19kbWEuZGlyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit1MzIgcHJvY3dyYXBfYmVnaW5fZG1hKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKGFyZ3MtPmFyZ3NfcHJvY19kbWEuZGlyID49IERNQV9OT05FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IHByb2NfYmVnaW5fZG1hKHByX2N0eHQsCisJCQkJICAgYXJncy0+YXJnc19wcm9jX2RtYS5wbXB1X2FkZHIsCisJCQkJICAgYXJncy0+YXJnc19wcm9jX2RtYS51bF9zaXplLAorCQkJCSAgIGFyZ3MtPmFyZ3NfcHJvY19kbWEuZGlyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gcHJvY3dyYXBfZmx1c2hfbWVtb3J5ID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF9mbHVzaF9tZW1vcnkodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXM7CisKKwlpZiAoYXJncy0+YXJnc19wcm9jX2ZsdXNobWVtb3J5LnVsX2ZsYWdzID4KKwkgICAgUFJPQ19XUklURUJBQ0tfSU5WQUxJREFURV9NRU0pCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gcHJvY19mbHVzaF9tZW1vcnkocHJfY3R4dCwKKwkJCQkgICBhcmdzLT5hcmdzX3Byb2NfZmx1c2htZW1vcnkucG1wdV9hZGRyLAorCQkJCSAgIGFyZ3MtPmFyZ3NfcHJvY19mbHVzaG1lbW9yeS51bF9zaXplLAorCQkJCSAgIGFyZ3MtPmFyZ3NfcHJvY19mbHVzaG1lbW9yeS51bF9mbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX2ludmFsaWRhdGVfbWVtb3J5ID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF9pbnZhbGlkYXRlX21lbW9yeSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9CisJICAgIHByb2NfaW52YWxpZGF0ZV9tZW1vcnkocHJfY3R4dCwKKwkJCQkgICBhcmdzLT5hcmdzX3Byb2NfaW52YWxpZGF0ZW1lbW9yeS5wbXB1X2FkZHIsCisJCQkJICAgYXJncy0+YXJnc19wcm9jX2ludmFsaWRhdGVtZW1vcnkudWxfc2l6ZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX2VudW1fcmVzb3VyY2VzID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF9lbnVtX3Jlc291cmNlcyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRzcF9yZXNvdXJjZWluZm8gcmVzb3VyY2VfaW5mbzsKKwl2b2lkICpocHJvY2Vzc29yID0gKChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJfY3R4dCktPmhwcm9jZXNzb3I7CisKKwlpZiAoYXJncy0+YXJnc19wcm9jX2VudW1yZXNvdXJjZXMucmVzb3VyY2VfaW5mb19zaXplIDwKKwkgICAgc2l6ZW9mKHN0cnVjdCBkc3BfcmVzb3VyY2VpbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPQorCSAgICBwcm9jX2dldF9yZXNvdXJjZV9pbmZvKGhwcm9jZXNzb3IsCisJCQkJICAgYXJncy0+YXJnc19wcm9jX2VudW1yZXNvdXJjZXMucmVzb3VyY2VfdHlwZSwKKwkJCQkgICAmcmVzb3VyY2VfaW5mbywKKwkJCQkgICBhcmdzLT5hcmdzX3Byb2NfZW51bXJlc291cmNlcy4KKwkJCQkgICByZXNvdXJjZV9pbmZvX3NpemUpOworCisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3NfcHJvY19lbnVtcmVzb3VyY2VzLnJlc291cmNlX2luZm8sICZyZXNvdXJjZV9pbmZvLAorCQkgIHN0YXR1cywgMSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKy8qCisgKiA9PT09PT09PSBwcm9jd3JhcF9nZXRfc3RhdGUgPT09PT09PT0KKyAqLwordTMyIHByb2N3cmFwX2dldF9zdGF0ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlIHByb2Nfc3RhdGU7CisJdm9pZCAqaHByb2Nlc3NvciA9ICgoc3RydWN0IHByb2Nlc3NfY29udGV4dCAqKXByX2N0eHQpLT5ocHJvY2Vzc29yOworCisJaWYgKGFyZ3MtPmFyZ3NfcHJvY19nZXRzdGF0ZS5zdGF0ZV9pbmZvX3NpemUgPAorCSAgICBzaXplb2Yoc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gcHJvY19nZXRfc3RhdGUoaHByb2Nlc3NvciwgJnByb2Nfc3RhdGUsCisJCQkgICBhcmdzLT5hcmdzX3Byb2NfZ2V0c3RhdGUuc3RhdGVfaW5mb19zaXplKTsKKwlDUF9UT19VU1IoYXJncy0+YXJnc19wcm9jX2dldHN0YXRlLnByb2Nfc3RhdGVfb2JqLCAmcHJvY19zdGF0ZSwgc3RhdHVzLAorCQkgIDEpOworCXJldHVybiBzdGF0dXM7CisKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX2dldF90cmFjZSA9PT09PT09PQorICovCit1MzIgcHJvY3dyYXBfZ2V0X3RyYWNlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXU4ICpwYnVmOworCXZvaWQgKmhwcm9jZXNzb3IgPSAoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3NvcjsKKworCWlmIChhcmdzLT5hcmdzX3Byb2NfZ2V0dHJhY2UubWF4X3NpemUgPiBNQVhfVFJBQ0VCVUZMRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJcGJ1ZiA9IGt6YWxsb2MoYXJncy0+YXJnc19wcm9jX2dldHRyYWNlLm1heF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocGJ1ZiAhPSBOVUxMKSB7CisJCXN0YXR1cyA9IHByb2NfZ2V0X3RyYWNlKGhwcm9jZXNzb3IsIHBidWYsCisJCQkJCWFyZ3MtPmFyZ3NfcHJvY19nZXR0cmFjZS5tYXhfc2l6ZSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3NfcHJvY19nZXR0cmFjZS5wYnVmLCBwYnVmLCBzdGF0dXMsCisJCSAgYXJncy0+YXJnc19wcm9jX2dldHRyYWNlLm1heF9zaXplKTsKKwlrZnJlZShwYnVmKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBwcm9jd3JhcF9sb2FkID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF9sb2FkKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlzMzIgaSwgbGVuOworCWludCBzdGF0dXMgPSAwOworCWNoYXIgKnRlbXA7CisJczMyIGNvdW50ID0gYXJncy0+YXJnc19wcm9jX2xvYWQuYXJnY19pbmRleDsKKwl1OCAqKmFyZ3YgPSBOVUxMLCAqKmVudnAgPSBOVUxMOworCXZvaWQgKmhwcm9jZXNzb3IgPSAoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3NvcjsKKworCWlmIChjb3VudCA8PSAwIHx8IGNvdW50ID4gTUFYX0xPQURBUkdTKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZnVuY19jb250OworCX0KKworCWFyZ3YgPSBrbWFsbG9jKGNvdW50ICogc2l6ZW9mKHU4ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFyZ3YpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2NvbnQ7CisJfQorCisJQ1BfRk1fVVNSKGFyZ3YsIGFyZ3MtPmFyZ3NfcHJvY19sb2FkLnVzZXJfYXJncywgc3RhdHVzLCBjb3VudCk7CisJaWYgKHN0YXR1cykgeworCQlrZnJlZShhcmd2KTsKKwkJYXJndiA9IE5VTEw7CisJCWdvdG8gZnVuY19jb250OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChhcmd2W2ldKSB7CisJCQkvKiBVc2VyIHNwYWNlIHBvaW50ZXIgdG8gYXJndW1lbnQgKi8KKwkJCXRlbXAgPSAoY2hhciAqKWFyZ3ZbaV07CisJCQkvKiBsZW4gaXMgaW5jcmVhc2VkIGJ5IDEgdG8gYWNjb21tb2RhdGUgTlVMTCAqLworCQkJbGVuID0gc3RybGVuX3VzZXIoKGNoYXIgKil0ZW1wKSArIDE7CisJCQkvKiBLZXJuZWwgc3BhY2UgcG9pbnRlciB0byBhcmd1bWVudCAqLworCQkJYXJndltpXSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChhcmd2W2ldKSB7CisJCQkJQ1BfRk1fVVNSKGFyZ3ZbaV0sIHRlbXAsIHN0YXR1cywgbGVuKTsKKwkJCQlpZiAoc3RhdHVzKSB7CisJCQkJCWtmcmVlKGFyZ3ZbaV0pOworCQkJCQlhcmd2W2ldID0gTlVMTDsKKwkJCQkJZ290byBmdW5jX2NvbnQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCWdvdG8gZnVuY19jb250OworCQkJfQorCQl9CisJfQorCS8qIFRPRE86IHZhbGlkYXRlIHRoaXMgKi8KKwlpZiAoYXJncy0+YXJnc19wcm9jX2xvYWQudXNlcl9lbnZwKSB7CisJCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZW52cCBhcnJheSBpbmNsdWRpbmcgTlVMTCAqLworCQljb3VudCA9IDA7CisJCWRvIHsKKwkJCWdldF91c2VyKHRlbXAsIGFyZ3MtPmFyZ3NfcHJvY19sb2FkLnVzZXJfZW52cCArIGNvdW50KTsKKwkJCWNvdW50Kys7CisJCX0gd2hpbGUgKHRlbXApOworCQllbnZwID0ga21hbGxvYyhjb3VudCAqIHNpemVvZih1OCAqKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZW52cCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZnVuY19jb250OworCQl9CisKKwkJQ1BfRk1fVVNSKGVudnAsIGFyZ3MtPmFyZ3NfcHJvY19sb2FkLnVzZXJfZW52cCwgc3RhdHVzLCBjb3VudCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCWtmcmVlKGVudnApOworCQkJZW52cCA9IE5VTEw7CisJCQlnb3RvIGZ1bmNfY29udDsKKwkJfQorCQlmb3IgKGkgPSAwOyBlbnZwW2ldOyBpKyspIHsKKwkJCS8qIFVzZXIgc3BhY2UgcG9pbnRlciB0byBhcmd1bWVudCAqLworCQkJdGVtcCA9IChjaGFyICopZW52cFtpXTsKKwkJCS8qIGxlbiBpcyBpbmNyZWFzZWQgYnkgMSB0byBhY2NvbW1vZGF0ZSBOVUxMICovCisJCQlsZW4gPSBzdHJsZW5fdXNlcigoY2hhciAqKXRlbXApICsgMTsKKwkJCS8qIEtlcm5lbCBzcGFjZSBwb2ludGVyIHRvIGFyZ3VtZW50ICovCisJCQllbnZwW2ldID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQkJaWYgKGVudnBbaV0pIHsKKwkJCQlDUF9GTV9VU1IoZW52cFtpXSwgdGVtcCwgc3RhdHVzLCBsZW4pOworCQkJCWlmIChzdGF0dXMpIHsKKwkJCQkJa2ZyZWUoZW52cFtpXSk7CisJCQkJCWVudnBbaV0gPSBOVUxMOworCQkJCQlnb3RvIGZ1bmNfY29udDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJZ290byBmdW5jX2NvbnQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBwcm9jX2xvYWQoaHByb2Nlc3NvciwKKwkJCQkgICBhcmdzLT5hcmdzX3Byb2NfbG9hZC5hcmdjX2luZGV4LAorCQkJCSAgIChjb25zdCBjaGFyICoqKWFyZ3YsIChjb25zdCBjaGFyICoqKWVudnApOworCX0KK2Z1bmNfY29udDoKKwlpZiAoZW52cCkgeworCQlpID0gMDsKKwkJd2hpbGUgKGVudnBbaV0pCisJCQlrZnJlZShlbnZwW2krK10pOworCisJCWtmcmVlKGVudnApOworCX0KKworCWlmIChhcmd2KSB7CisJCWNvdW50ID0gYXJncy0+YXJnc19wcm9jX2xvYWQuYXJnY19pbmRleDsKKwkJZm9yIChpID0gMDsgKGkgPCBjb3VudCkgJiYgYXJndltpXTsgaSsrKQorCQkJa2ZyZWUoYXJndltpXSk7CisKKwkJa2ZyZWUoYXJndik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX21hcCA9PT09PT09PQorICovCit1MzIgcHJvY3dyYXBfbWFwKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXZvaWQgKm1hcF9hZGRyOworCXZvaWQgKmhwcm9jZXNzb3IgPSAoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3NvcjsKKworCWlmICghYXJncy0+YXJnc19wcm9jX21hcG1lbS51bF9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IHByb2NfbWFwKGFyZ3MtPmFyZ3NfcHJvY19tYXBtZW0uaHByb2Nlc3NvciwKKwkJCSAgYXJncy0+YXJnc19wcm9jX21hcG1lbS5wbXB1X2FkZHIsCisJCQkgIGFyZ3MtPmFyZ3NfcHJvY19tYXBtZW0udWxfc2l6ZSwKKwkJCSAgYXJncy0+YXJnc19wcm9jX21hcG1lbS5yZXFfYWRkciwgJm1hcF9hZGRyLAorCQkJICBhcmdzLT5hcmdzX3Byb2NfbWFwbWVtLnVsX21hcF9hdHRyLCBwcl9jdHh0KTsKKwlpZiAoIXN0YXR1cykgeworCQlpZiAocHV0X3VzZXIobWFwX2FkZHIsIGFyZ3MtPmFyZ3NfcHJvY19tYXBtZW0ucHBfbWFwX2FkZHIpKSB7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJcHJvY191bl9tYXAoaHByb2Nlc3NvciwgbWFwX2FkZHIsIHByX2N0eHQpOworCQl9CisKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX3JlZ2lzdGVyX25vdGlmeSA9PT09PT09PQorICovCit1MzIgcHJvY3dyYXBfcmVnaXN0ZXJfbm90aWZ5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBkc3Bfbm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbjsKKwl2b2lkICpocHJvY2Vzc29yID0gKChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJfY3R4dCktPmhwcm9jZXNzb3I7CisKKwkvKiBJbml0aWFsaXplIHRoZSBub3RpZmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKwlub3RpZmljYXRpb24ucHNfbmFtZSA9IE5VTEw7CisJbm90aWZpY2F0aW9uLmhhbmRsZSA9IE5VTEw7CisKKwlzdGF0dXMgPSBwcm9jX3JlZ2lzdGVyX25vdGlmeShocHJvY2Vzc29yLAorCQkJCSBhcmdzLT5hcmdzX3Byb2NfcmVnaXN0ZXJfbm90aWZ5LmV2ZW50X21hc2ssCisJCQkJIGFyZ3MtPmFyZ3NfcHJvY19yZWdpc3Rlcl9ub3RpZnkubm90aWZ5X3R5cGUsCisJCQkJICZub3RpZmljYXRpb24pOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3Byb2NfcmVnaXN0ZXJfbm90aWZ5Lmhub3RpZmljYXRpb24sICZub3RpZmljYXRpb24sCisJCSAgc3RhdHVzLCAxKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gcHJvY3dyYXBfcmVzZXJ2ZV9tZW1vcnkgPT09PT09PT0KKyAqLwordTMyIHByb2N3cmFwX3Jlc2VydmVfbWVtb3J5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXZvaWQgKnByc3ZfYWRkcjsKKwl2b2lkICpocHJvY2Vzc29yID0gKChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJfY3R4dCktPmhwcm9jZXNzb3I7CisKKwlpZiAoKGFyZ3MtPmFyZ3NfcHJvY19yc3ZtZW0udWxfc2l6ZSA8PSAwKSB8fAorCSAgICAoYXJncy0+YXJnc19wcm9jX3Jzdm1lbS51bF9zaXplICYgKFBHX1NJWkU0SyAtIDEpKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IHByb2NfcmVzZXJ2ZV9tZW1vcnkoaHByb2Nlc3NvciwKKwkJCQkgICAgIGFyZ3MtPmFyZ3NfcHJvY19yc3ZtZW0udWxfc2l6ZSwgJnByc3ZfYWRkciwKKwkJCQkgICAgIHByX2N0eHQpOworCWlmICghc3RhdHVzKSB7CisJCWlmIChwdXRfdXNlcihwcnN2X2FkZHIsIGFyZ3MtPmFyZ3NfcHJvY19yc3ZtZW0ucHBfcnN2X2FkZHIpKSB7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJcHJvY191bl9yZXNlcnZlX21lbW9yeShhcmdzLT5hcmdzX3Byb2NfcnN2bWVtLgorCQkJCQkgICAgICAgaHByb2Nlc3NvciwgcHJzdl9hZGRyLCBwcl9jdHh0KTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gcHJvY3dyYXBfc3RhcnQgPT09PT09PT0KKyAqLwordTMyIHByb2N3cmFwX3N0YXJ0KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwl1MzIgcmV0OworCisJcmV0ID0gcHJvY19zdGFydCgoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3Nvcik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX3VuX21hcCA9PT09PT09PQorICovCit1MzIgcHJvY3dyYXBfdW5fbWFwKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcHJvY191bl9tYXAoKChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJfY3R4dCktPmhwcm9jZXNzb3IsCisJCQkgICAgIGFyZ3MtPmFyZ3NfcHJvY191bm1hcG1lbS5tYXBfYWRkciwgcHJfY3R4dCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHByb2N3cmFwX3VuX3Jlc2VydmVfbWVtb3J5ID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF91bl9yZXNlcnZlX21lbW9yeSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1czsKKwl2b2lkICpocHJvY2Vzc29yID0gKChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJfY3R4dCktPmhwcm9jZXNzb3I7CisKKwlzdGF0dXMgPSBwcm9jX3VuX3Jlc2VydmVfbWVtb3J5KGhwcm9jZXNzb3IsCisJCQkJCWFyZ3MtPmFyZ3NfcHJvY191bnJzdm1lbS5wcnN2X2FkZHIsCisJCQkJCXByX2N0eHQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBwcm9jd3JhcF9zdG9wID09PT09PT09CisgKi8KK3UzMiBwcm9jd3JhcF9zdG9wKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwl1MzIgcmV0OworCisJcmV0ID0gcHJvY19zdG9wKCgoc3RydWN0IHByb2Nlc3NfY29udGV4dCAqKXByX2N0eHQpLT5ocHJvY2Vzc29yKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiA9PT09PT09PSBmaW5kX2hhbmRsZSA9PT09PT09PT0KKyAqLworaW5saW5lIHZvaWQgZmluZF9ub2RlX2hhbmRsZShzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICoqbm9kZXJlcywKKwkJCQl2b2lkICpwcl9jdHh0LCB2b2lkICpobm9kZSkKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJKm5vZGVyZXMgPSBpZHJfZmluZCgoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+bm9kZV9pZCwKKwkJCQkJCQkJKGludClobm9kZSAtIDEpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybjsKK30KKworCisvKgorICogPT09PT09PT0gbm9kZXdyYXBfYWxsb2NhdGUgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX2FsbG9jYXRlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNwX3V1aWQgbm9kZV91dWlkOworCXUzMiBjYl9kYXRhX3NpemUgPSAwOworCXUzMiBfX3VzZXIgKnBzaXplID0gKHUzMiBfX3VzZXIgKikgYXJncy0+YXJnc19ub2RlX2FsbG9jYXRlLnBhcmdzOworCXU4ICpwYXJncyA9IE5VTEw7CisJc3RydWN0IGRzcF9ub2RlYXR0cmluIHByb2NfYXR0cl9pbiwgKmF0dHJfaW4gPSBOVUxMOworCXN0cnVjdCBub2RlX3Jlc19vYmplY3QgKm5vZGVfcmVzOworCWludCBub2RlaWQ7CisJdm9pZCAqaHByb2Nlc3NvciA9ICgoc3RydWN0IHByb2Nlc3NfY29udGV4dCAqKXByX2N0eHQpLT5ocHJvY2Vzc29yOworCisJLyogT3B0aW9uYWwgYXJndW1lbnQgKi8KKwlpZiAocHNpemUpIHsKKwkJaWYgKGdldF91c2VyKGNiX2RhdGFfc2l6ZSwgcHNpemUpKQorCQkJc3RhdHVzID0gLUVQRVJNOworCisJCWNiX2RhdGFfc2l6ZSArPSBzaXplb2YodTMyKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXBhcmdzID0ga21hbGxvYyhjYl9kYXRhX3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKHBhcmdzID09IE5VTEwpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKworCQl9CisJCUNQX0ZNX1VTUihwYXJncywgYXJncy0+YXJnc19ub2RlX2FsbG9jYXRlLnBhcmdzLCBzdGF0dXMsCisJCQkgIGNiX2RhdGFfc2l6ZSk7CisJfQorCUNQX0ZNX1VTUigmbm9kZV91dWlkLCBhcmdzLT5hcmdzX25vZGVfYWxsb2NhdGUubm9kZV9pZF9wdHIsIHN0YXR1cywgMSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisJLyogT3B0aW9uYWwgYXJndW1lbnQgKi8KKwlpZiAoYXJncy0+YXJnc19ub2RlX2FsbG9jYXRlLmF0dHJfaW4pIHsKKwkJQ1BfRk1fVVNSKCZwcm9jX2F0dHJfaW4sIGFyZ3MtPmFyZ3Nfbm9kZV9hbGxvY2F0ZS5hdHRyX2luLAorCQkJICBzdGF0dXMsIDEpOworCQlpZiAoIXN0YXR1cykKKwkJCWF0dHJfaW4gPSAmcHJvY19hdHRyX2luOworCQllbHNlCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCisJfQorCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IG5vZGVfYWxsb2NhdGUoaHByb2Nlc3NvciwKKwkJCQkgICAgICAgJm5vZGVfdXVpZCwgKHN0cnVjdCBkc3BfY2JkYXRhICopcGFyZ3MsCisJCQkJICAgICAgIGF0dHJfaW4sICZub2RlX3JlcywgcHJfY3R4dCk7CisJfQorCWlmICghc3RhdHVzKSB7CisJCW5vZGVpZCA9IG5vZGVfcmVzLT5pZCArIDE7CisJCUNQX1RPX1VTUihhcmdzLT5hcmdzX25vZGVfYWxsb2NhdGUucGhfbm9kZSwgJm5vZGVpZCwKKwkJCXN0YXR1cywgMSk7CisJCWlmIChzdGF0dXMpIHsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQlub2RlX2RlbGV0ZShub2RlX3JlcywgcHJfY3R4dCk7CisJCX0KKwl9CitmdW5jX2NvbnQ6CisJa2ZyZWUocGFyZ3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2Rld3JhcF9hbGxvY19tc2dfYnVmID09PT09PT09CisgKi8KK3UzMiBub2Rld3JhcF9hbGxvY19tc2dfYnVmKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNwX2J1ZmZlcmF0dHIgKnBhdHRyID0gTlVMTDsKKwlzdHJ1Y3QgZHNwX2J1ZmZlcmF0dHIgYXR0cjsKKwl1OCAqcGJ1ZmZlciA9IE5VTEw7CisJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqbm9kZV9yZXM7CisKKwlmaW5kX25vZGVfaGFuZGxlKCZub2RlX3JlcywgIHByX2N0eHQsCisJCQkJYXJncy0+YXJnc19ub2RlX2FsbG9jbXNnYnVmLmhub2RlKTsKKworCWlmICghbm9kZV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCFhcmdzLT5hcmdzX25vZGVfYWxsb2Ntc2didWYudXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyZ3MtPmFyZ3Nfbm9kZV9hbGxvY21zZ2J1Zi5wYXR0cikgewkvKiBPcHRpb25hbCBhcmd1bWVudCAqLworCQlDUF9GTV9VU1IoJmF0dHIsIGFyZ3MtPmFyZ3Nfbm9kZV9hbGxvY21zZ2J1Zi5wYXR0ciwgc3RhdHVzLCAxKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlwYXR0ciA9ICZhdHRyOworCisJfQorCS8qIGFyZ3VtZW50ICovCisJQ1BfRk1fVVNSKCZwYnVmZmVyLCBhcmdzLT5hcmdzX25vZGVfYWxsb2Ntc2didWYucGJ1ZmZlciwgc3RhdHVzLCAxKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBub2RlX2FsbG9jX21zZ19idWYobm9kZV9yZXMtPmhub2RlLAorCQkJCQkgICAgYXJncy0+YXJnc19ub2RlX2FsbG9jbXNnYnVmLnVzaXplLAorCQkJCQkgICAgcGF0dHIsICZwYnVmZmVyKTsKKwl9CisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3Nfbm9kZV9hbGxvY21zZ2J1Zi5wYnVmZmVyLCAmcGJ1ZmZlciwgc3RhdHVzLCAxKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gbm9kZXdyYXBfY2hhbmdlX3ByaW9yaXR5ID09PT09PT09CisgKi8KK3UzMiBub2Rld3JhcF9jaGFuZ2VfcHJpb3JpdHkodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCXUzMiByZXQ7CisJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqbm9kZV9yZXM7CisKKwlmaW5kX25vZGVfaGFuZGxlKCZub2RlX3JlcywgcHJfY3R4dCwKKwkJCQlhcmdzLT5hcmdzX25vZGVfY2hhbmdlcHJpb3JpdHkuaG5vZGUpOworCisJaWYgKCFub2RlX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBub2RlX2NoYW5nZV9wcmlvcml0eShub2RlX3Jlcy0+aG5vZGUsCisJCQkJICAgYXJncy0+YXJnc19ub2RlX2NoYW5nZXByaW9yaXR5LnByaW8pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqID09PT09PT09IG5vZGV3cmFwX2Nvbm5lY3QgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX2Nvbm5lY3QodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkc3Bfc3RybWF0dHIgYXR0cnM7CisJc3RydWN0IGRzcF9zdHJtYXR0ciAqcGF0dHJzID0gTlVMTDsKKwl1MzIgY2JfZGF0YV9zaXplOworCXUzMiBfX3VzZXIgKnBzaXplID0gKHUzMiBfX3VzZXIgKikgYXJncy0+YXJnc19ub2RlX2Nvbm5lY3QuY29ubl9wYXJhbTsKKwl1OCAqcGFyZ3MgPSBOVUxMOworCXN0cnVjdCBub2RlX3Jlc19vYmplY3QgKm5vZGVfcmVzMSwgKm5vZGVfcmVzMjsKKwlzdHJ1Y3Qgbm9kZV9vYmplY3QgKm5vZGUxID0gTlVMTCwgKm5vZGUyID0gTlVMTDsKKworCWlmICgoaW50KWFyZ3MtPmFyZ3Nfbm9kZV9jb25uZWN0Lmhub2RlICE9IERTUF9IR1BQTk9ERSkgeworCQlmaW5kX25vZGVfaGFuZGxlKCZub2RlX3JlczEsIHByX2N0eHQsCisJCQkJYXJncy0+YXJnc19ub2RlX2Nvbm5lY3QuaG5vZGUpOworCQlpZiAobm9kZV9yZXMxKQorCQkJbm9kZTEgPSBub2RlX3JlczEtPmhub2RlOworCX0gZWxzZSB7CisJCW5vZGUxID0gYXJncy0+YXJnc19ub2RlX2Nvbm5lY3QuaG5vZGU7CisJfQorCisJaWYgKChpbnQpYXJncy0+YXJnc19ub2RlX2Nvbm5lY3Qub3RoZXJfbm9kZSAhPSBEU1BfSEdQUE5PREUpIHsKKwkJZmluZF9ub2RlX2hhbmRsZSgmbm9kZV9yZXMyLCBwcl9jdHh0LAorCQkJCWFyZ3MtPmFyZ3Nfbm9kZV9jb25uZWN0Lm90aGVyX25vZGUpOworCQlpZiAobm9kZV9yZXMyKQorCQkJbm9kZTIgPSBub2RlX3JlczItPmhub2RlOworCX0gZWxzZSB7CisJCW5vZGUyID0gYXJncy0+YXJnc19ub2RlX2Nvbm5lY3Qub3RoZXJfbm9kZTsKKwl9CisKKwlpZiAoIW5vZGUxIHx8ICFub2RlMikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBPcHRpb25hbCBhcmd1bWVudCAqLworCWlmIChwc2l6ZSkgeworCQlpZiAoZ2V0X3VzZXIoY2JfZGF0YV9zaXplLCBwc2l6ZSkpCisJCQlzdGF0dXMgPSAtRVBFUk07CisKKwkJY2JfZGF0YV9zaXplICs9IHNpemVvZih1MzIpOworCQlpZiAoIXN0YXR1cykgeworCQkJcGFyZ3MgPSBrbWFsbG9jKGNiX2RhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocGFyZ3MgPT0gTlVMTCkgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJZ290byBmdW5jX2NvbnQ7CisJCQl9CisKKwkJfQorCQlDUF9GTV9VU1IocGFyZ3MsIGFyZ3MtPmFyZ3Nfbm9kZV9jb25uZWN0LmNvbm5fcGFyYW0sIHN0YXR1cywKKwkJCSAgY2JfZGF0YV9zaXplKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZnVuY19jb250OworCX0KKwlpZiAoYXJncy0+YXJnc19ub2RlX2Nvbm5lY3QucGF0dHJzKSB7CS8qIE9wdGlvbmFsIGFyZ3VtZW50ICovCisJCUNQX0ZNX1VTUigmYXR0cnMsIGFyZ3MtPmFyZ3Nfbm9kZV9jb25uZWN0LnBhdHRycywgc3RhdHVzLCAxKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlwYXR0cnMgPSAmYXR0cnM7CisKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0gbm9kZV9jb25uZWN0KG5vZGUxLAorCQkJCSAgICAgIGFyZ3MtPmFyZ3Nfbm9kZV9jb25uZWN0LnN0cmVhbV9pZCwKKwkJCQkgICAgICBub2RlMiwKKwkJCQkgICAgICBhcmdzLT5hcmdzX25vZGVfY29ubmVjdC5vdGhlcl9zdHJlYW0sCisJCQkJICAgICAgcGF0dHJzLCAoc3RydWN0IGRzcF9jYmRhdGEgKilwYXJncyk7CisJfQorZnVuY19jb250OgorCWtmcmVlKHBhcmdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9jcmVhdGUgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX2NyZWF0ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJdTMyIHJldDsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfY3JlYXRlLmhub2RlKTsKKworCWlmICghbm9kZV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gbm9kZV9jcmVhdGUobm9kZV9yZXMtPmhub2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9kZWxldGUgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX2RlbGV0ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJdTMyIHJldDsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfZGVsZXRlLmhub2RlKTsKKworCWlmICghbm9kZV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gbm9kZV9kZWxldGUobm9kZV9yZXMsIHByX2N0eHQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBub2Rld3JhcF9mcmVlX21zZ19idWYgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX2ZyZWVfbXNnX2J1Zih1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRzcF9idWZmZXJhdHRyICpwYXR0ciA9IE5VTEw7CisJc3RydWN0IGRzcF9idWZmZXJhdHRyIGF0dHI7CisJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqbm9kZV9yZXM7CisKKwlmaW5kX25vZGVfaGFuZGxlKCZub2RlX3JlcywgcHJfY3R4dCwgYXJncy0+YXJnc19ub2RlX2ZyZWVtc2didWYuaG5vZGUpOworCisJaWYgKCFub2RlX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoYXJncy0+YXJnc19ub2RlX2ZyZWVtc2didWYucGF0dHIpIHsJLyogT3B0aW9uYWwgYXJndW1lbnQgKi8KKwkJQ1BfRk1fVVNSKCZhdHRyLCBhcmdzLT5hcmdzX25vZGVfZnJlZW1zZ2J1Zi5wYXR0ciwgc3RhdHVzLCAxKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlwYXR0ciA9ICZhdHRyOworCisJfQorCisJaWYgKCFhcmdzLT5hcmdzX25vZGVfZnJlZW1zZ2J1Zi5wYnVmZmVyKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IG5vZGVfZnJlZV9tc2dfYnVmKG5vZGVfcmVzLT5obm9kZSwKKwkJCQkJICAgYXJncy0+YXJnc19ub2RlX2ZyZWVtc2didWYucGJ1ZmZlciwKKwkJCQkJICAgcGF0dHIpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9nZXRfYXR0ciA9PT09PT09PQorICovCit1MzIgbm9kZXdyYXBfZ2V0X2F0dHIodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkc3Bfbm9kZWF0dHIgYXR0cjsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfZ2V0YXR0ci5obm9kZSk7CisKKwlpZiAoIW5vZGVfcmVzKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXR1cyA9IG5vZGVfZ2V0X2F0dHIobm9kZV9yZXMtPmhub2RlLCAmYXR0ciwKKwkJCSAgICAgICBhcmdzLT5hcmdzX25vZGVfZ2V0YXR0ci5hdHRyX3NpemUpOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX25vZGVfZ2V0YXR0ci5wYXR0ciwgJmF0dHIsIHN0YXR1cywgMSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gbm9kZXdyYXBfZ2V0X21lc3NhZ2UgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX2dldF9tZXNzYWdlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBkc3BfbXNnIG1zZzsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfZ2V0bWVzc2FnZS5obm9kZSk7CisKKwlpZiAoIW5vZGVfcmVzKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXR1cyA9IG5vZGVfZ2V0X21lc3NhZ2Uobm9kZV9yZXMtPmhub2RlLCAmbXNnLAorCQkJCSAgYXJncy0+YXJnc19ub2RlX2dldG1lc3NhZ2UudXRpbWVvdXQpOworCisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3Nfbm9kZV9nZXRtZXNzYWdlLm1lc3NhZ2UsICZtc2csIHN0YXR1cywgMSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gbm9kZXdyYXBfcGF1c2UgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX3BhdXNlKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwl1MzIgcmV0OworCXN0cnVjdCBub2RlX3Jlc19vYmplY3QgKm5vZGVfcmVzOworCisJZmluZF9ub2RlX2hhbmRsZSgmbm9kZV9yZXMsIHByX2N0eHQsIGFyZ3MtPmFyZ3Nfbm9kZV9wYXVzZS5obm9kZSk7CisKKwlpZiAoIW5vZGVfcmVzKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldCA9IG5vZGVfcGF1c2Uobm9kZV9yZXMtPmhub2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9wdXRfbWVzc2FnZSA9PT09PT09PQorICovCit1MzIgbm9kZXdyYXBfcHV0X21lc3NhZ2UodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkc3BfbXNnIG1zZzsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfcHV0bWVzc2FnZS5obm9kZSk7CisKKwlpZiAoIW5vZGVfcmVzKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUNQX0ZNX1VTUigmbXNnLCBhcmdzLT5hcmdzX25vZGVfcHV0bWVzc2FnZS5tZXNzYWdlLCBzdGF0dXMsIDEpOworCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0KKwkJICAgIG5vZGVfcHV0X21lc3NhZ2Uobm9kZV9yZXMtPmhub2RlLCAmbXNnLAorCQkJCSAgICAgYXJncy0+YXJnc19ub2RlX3B1dG1lc3NhZ2UudXRpbWVvdXQpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9yZWdpc3Rlcl9ub3RpZnkgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX3JlZ2lzdGVyX25vdGlmeSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGRzcF9ub3RpZmljYXRpb24gbm90aWZpY2F0aW9uOworCXN0cnVjdCBub2RlX3Jlc19vYmplY3QgKm5vZGVfcmVzOworCisJZmluZF9ub2RlX2hhbmRsZSgmbm9kZV9yZXMsIHByX2N0eHQsCisJCQlhcmdzLT5hcmdzX25vZGVfcmVnaXN0ZXJub3RpZnkuaG5vZGUpOworCisJaWYgKCFub2RlX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBub3RpZmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKwlub3RpZmljYXRpb24ucHNfbmFtZSA9IE5VTEw7CisJbm90aWZpY2F0aW9uLmhhbmRsZSA9IE5VTEw7CisKKwlpZiAoIWFyZ3MtPmFyZ3NfcHJvY19yZWdpc3Rlcl9ub3RpZnkuZXZlbnRfbWFzaykKKwkJQ1BfRk1fVVNSKCZub3RpZmljYXRpb24sCisJCQkgIGFyZ3MtPmFyZ3NfcHJvY19yZWdpc3Rlcl9ub3RpZnkuaG5vdGlmaWNhdGlvbiwKKwkJCSAgc3RhdHVzLCAxKTsKKworCXN0YXR1cyA9IG5vZGVfcmVnaXN0ZXJfbm90aWZ5KG5vZGVfcmVzLT5obm9kZSwKKwkJCQkgICAgICBhcmdzLT5hcmdzX25vZGVfcmVnaXN0ZXJub3RpZnkuZXZlbnRfbWFzaywKKwkJCQkgICAgICBhcmdzLT5hcmdzX25vZGVfcmVnaXN0ZXJub3RpZnkuCisJCQkJICAgICAgbm90aWZ5X3R5cGUsICZub3RpZmljYXRpb24pOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX25vZGVfcmVnaXN0ZXJub3RpZnkuaG5vdGlmaWNhdGlvbiwgJm5vdGlmaWNhdGlvbiwKKwkJICBzdGF0dXMsIDEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9ydW4gPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX3J1bih1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJdTMyIHJldDsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfcnVuLmhub2RlKTsKKworCWlmICghbm9kZV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gbm9kZV9ydW4obm9kZV9yZXMtPmhub2RlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF90ZXJtaW5hdGUgPT09PT09PT0KKyAqLwordTMyIG5vZGV3cmFwX3Rlcm1pbmF0ZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1czsKKwlpbnQgdGVtcHN0YXR1czsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKworCWZpbmRfbm9kZV9oYW5kbGUoJm5vZGVfcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX25vZGVfdGVybWluYXRlLmhub2RlKTsKKworCWlmICghbm9kZV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJc3RhdHVzID0gbm9kZV90ZXJtaW5hdGUobm9kZV9yZXMtPmhub2RlLCAmdGVtcHN0YXR1cyk7CisKKwlDUF9UT19VU1IoYXJncy0+YXJnc19ub2RlX3Rlcm1pbmF0ZS5wc3RhdHVzLCAmdGVtcHN0YXR1cywgc3RhdHVzLCAxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBub2Rld3JhcF9nZXRfdXVpZF9wcm9wcyA9PT09PT09PQorICovCit1MzIgbm9kZXdyYXBfZ2V0X3V1aWRfcHJvcHModW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkc3BfdXVpZCBub2RlX3V1aWQ7CisJc3RydWN0IGRzcF9uZGJwcm9wcyAqcG5vZGVfcHJvcHMgPSBOVUxMOworCXZvaWQgKmhwcm9jZXNzb3IgPSAoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3NvcjsKKworCUNQX0ZNX1VTUigmbm9kZV91dWlkLCBhcmdzLT5hcmdzX25vZGVfZ2V0dXVpZHByb3BzLm5vZGVfaWRfcHRyLCBzdGF0dXMsCisJCSAgMSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisJcG5vZGVfcHJvcHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHNwX25kYnByb3BzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBub2RlX3Byb3BzICE9IE5VTEwpIHsKKwkJc3RhdHVzID0KKwkJICAgIG5vZGVfZ2V0X3V1aWRfcHJvcHMoaHByb2Nlc3NvciwgJm5vZGVfdXVpZCwgcG5vZGVfcHJvcHMpOworCQlDUF9UT19VU1IoYXJncy0+YXJnc19ub2RlX2dldHV1aWRwcm9wcy5ub2RlX3Byb3BzLCBwbm9kZV9wcm9wcywKKwkJCSAgc3RhdHVzLCAxKTsKKwl9IGVsc2UKKwkJc3RhdHVzID0gLUVOT01FTTsKK2Z1bmNfY29udDoKKwlrZnJlZShwbm9kZV9wcm9wcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IGZpbmRfc3RybV9oYW5kbGUgPT09PT09PT09CisgKi8KK2lubGluZSB2b2lkIGZpbmRfc3RybV9oYW5kbGUoc3RydWN0IHN0cm1fcmVzX29iamVjdCAqKnN0cm1yZXMsCisJCQkJdm9pZCAqcHJfY3R4dCwgdm9pZCAqaHN0cmVhbSkKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJKnN0cm1yZXMgPSBpZHJfZmluZCgoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+c3RyZWFtX2lkLAorCQkJCQkJCShpbnQpaHN0cmVhbSAtIDEpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybjsKK30KKworLyoKKyAqID09PT09PT09IHN0cm13cmFwX2FsbG9jYXRlX2J1ZmZlciA9PT09PT09PQorICovCit1MzIgc3RybXdyYXBfYWxsb2NhdGVfYnVmZmVyKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCXU4ICoqYXBfYnVmZmVyID0gTlVMTDsKKwl1MzIgbnVtX2J1ZnMgPSBhcmdzLT5hcmdzX3N0cm1fYWxsb2NhdGVidWZmZXIubnVtX2J1ZnM7CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybV9yZXM7CisKKwlmaW5kX3N0cm1faGFuZGxlKCZzdHJtX3JlcywgcHJfY3R4dCwKKwkJYXJncy0+YXJnc19zdHJtX2FsbG9jYXRlYnVmZmVyLmhzdHJlYW0pOworCisJaWYgKCFzdHJtX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobnVtX2J1ZnMgPiBNQVhfQlVGUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhcF9idWZmZXIgPSBrbWFsbG9jKChudW1fYnVmcyAqIHNpemVvZih1OCAqKSksIEdGUF9LRVJORUwpOworCWlmIChhcF9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0dXMgPSBzdHJtX2FsbG9jYXRlX2J1ZmZlcihzdHJtX3JlcywKKwkJCQkgICAgICBhcmdzLT5hcmdzX3N0cm1fYWxsb2NhdGVidWZmZXIudXNpemUsCisJCQkJICAgICAgYXBfYnVmZmVyLCBudW1fYnVmcywgcHJfY3R4dCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3Nfc3RybV9hbGxvY2F0ZWJ1ZmZlci5hcF9idWZmZXIsIGFwX2J1ZmZlciwKKwkJCSAgc3RhdHVzLCBudW1fYnVmcyk7CisJCWlmIChzdGF0dXMpIHsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQlzdHJtX2ZyZWVfYnVmZmVyKHN0cm1fcmVzLAorCQkJCQkgYXBfYnVmZmVyLCBudW1fYnVmcywgcHJfY3R4dCk7CisJCX0KKwl9CisJa2ZyZWUoYXBfYnVmZmVyKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBzdHJtd3JhcF9jbG9zZSA9PT09PT09PQorICovCit1MzIgc3RybXdyYXBfY2xvc2UodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCXN0cnVjdCBzdHJtX3Jlc19vYmplY3QgKnN0cm1fcmVzOworCisJZmluZF9zdHJtX2hhbmRsZSgmc3RybV9yZXMsIHByX2N0eHQsIGFyZ3MtPmFyZ3Nfc3RybV9jbG9zZS5oc3RyZWFtKTsKKworCWlmICghc3RybV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN0cm1fY2xvc2Uoc3RybV9yZXMsIHByX2N0eHQpOworfQorCisvKgorICogPT09PT09PT0gc3RybXdyYXBfZnJlZV9idWZmZXIgPT09PT09PT0KKyAqLwordTMyIHN0cm13cmFwX2ZyZWVfYnVmZmVyKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1OCAqKmFwX2J1ZmZlciA9IE5VTEw7CisJdTMyIG51bV9idWZzID0gYXJncy0+YXJnc19zdHJtX2ZyZWVidWZmZXIubnVtX2J1ZnM7CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybV9yZXM7CisKKwlmaW5kX3N0cm1faGFuZGxlKCZzdHJtX3JlcywgcHJfY3R4dCwKKwkJCWFyZ3MtPmFyZ3Nfc3RybV9mcmVlYnVmZmVyLmhzdHJlYW0pOworCisJaWYgKCFzdHJtX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobnVtX2J1ZnMgPiBNQVhfQlVGUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhcF9idWZmZXIgPSBrbWFsbG9jKChudW1fYnVmcyAqIHNpemVvZih1OCAqKSksIEdGUF9LRVJORUwpOworCWlmIChhcF9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlDUF9GTV9VU1IoYXBfYnVmZmVyLCBhcmdzLT5hcmdzX3N0cm1fZnJlZWJ1ZmZlci5hcF9idWZmZXIsIHN0YXR1cywKKwkJICBudW1fYnVmcyk7CisKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gc3RybV9mcmVlX2J1ZmZlcihzdHJtX3JlcywKKwkJCQkJICBhcF9idWZmZXIsIG51bV9idWZzLCBwcl9jdHh0KTsKKworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3N0cm1fZnJlZWJ1ZmZlci5hcF9idWZmZXIsIGFwX2J1ZmZlciwgc3RhdHVzLAorCQkgIG51bV9idWZzKTsKKwlrZnJlZShhcF9idWZmZXIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHN0cm13cmFwX2dldF9ldmVudF9oYW5kbGUgPT09PT09PT0KKyAqLwordTMyIF9fZGVwcmVjYXRlZCBzdHJtd3JhcF9nZXRfZXZlbnRfaGFuZGxlKHVuaW9uIHRyYXBwZWRfYXJncyAqIGFyZ3MsCisJCQkJCSAgIHZvaWQgKnByX2N0eHQpCit7CisJcHJfZXJyKCIlczogZGVwcmVjYXRlZCBkc3BicmlkZ2UgaW9jdGxcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworLyoKKyAqID09PT09PT09IHN0cm13cmFwX2dldF9pbmZvID09PT09PT09CisgKi8KK3UzMiBzdHJtd3JhcF9nZXRfaW5mbyh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHN0cmVhbV9pbmZvIHN0cm1faW5mbzsKKwlzdHJ1Y3QgZHNwX3N0cmVhbWluZm8gdXNlcjsKKwlzdHJ1Y3QgZHNwX3N0cmVhbWluZm8gKnRlbXA7CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybV9yZXM7CisKKwlmaW5kX3N0cm1faGFuZGxlKCZzdHJtX3JlcywgcHJfY3R4dCwKKwkJCWFyZ3MtPmFyZ3Nfc3RybV9nZXRpbmZvLmhzdHJlYW0pOworCisJaWYgKCFzdHJtX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlDUF9GTV9VU1IoJnN0cm1faW5mbywgYXJncy0+YXJnc19zdHJtX2dldGluZm8uc3RyZWFtX2luZm8sIHN0YXR1cywgMSk7CisJdGVtcCA9IHN0cm1faW5mby51c2VyX3N0cm07CisKKwlzdHJtX2luZm8udXNlcl9zdHJtID0gJnVzZXI7CisKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBzdHJtX2dldF9pbmZvKHN0cm1fcmVzLT5oc3RyZWFtLAorCQkJCSAgICAgICAmc3RybV9pbmZvLAorCQkJCSAgICAgICBhcmdzLT5hcmdzX3N0cm1fZ2V0aW5mby4KKwkJCQkgICAgICAgc3RyZWFtX2luZm9fc2l6ZSk7CisJfQorCUNQX1RPX1VTUih0ZW1wLCBzdHJtX2luZm8udXNlcl9zdHJtLCBzdGF0dXMsIDEpOworCXN0cm1faW5mby51c2VyX3N0cm0gPSB0ZW1wOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3N0cm1fZ2V0aW5mby5zdHJlYW1faW5mbywgJnN0cm1faW5mbywgc3RhdHVzLCAxKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gc3RybXdyYXBfaWRsZSA9PT09PT09PQorICovCit1MzIgc3RybXdyYXBfaWRsZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJdTMyIHJldDsKKwlzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICpzdHJtX3JlczsKKworCWZpbmRfc3RybV9oYW5kbGUoJnN0cm1fcmVzLCBwcl9jdHh0LCBhcmdzLT5hcmdzX3N0cm1faWRsZS5oc3RyZWFtKTsKKworCWlmICghc3RybV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gc3RybV9pZGxlKHN0cm1fcmVzLT5oc3RyZWFtLCBhcmdzLT5hcmdzX3N0cm1faWRsZS5mbHVzaF9mbGFnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiA9PT09PT09PSBzdHJtd3JhcF9pc3N1ZSA9PT09PT09PQorICovCit1MzIgc3RybXdyYXBfaXNzdWUodW5pb24gdHJhcHBlZF9hcmdzICphcmdzLCB2b2lkICpwcl9jdHh0KQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBzdHJtX3Jlc19vYmplY3QgKnN0cm1fcmVzOworCisJZmluZF9zdHJtX2hhbmRsZSgmc3RybV9yZXMsIHByX2N0eHQsIGFyZ3MtPmFyZ3Nfc3RybV9pc3N1ZS5oc3RyZWFtKTsKKworCWlmICghc3RybV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCFhcmdzLT5hcmdzX3N0cm1faXNzdWUucGJ1ZmZlcikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBObyBuZWVkIG9mIGRvaW5nIENQX0ZNX1VTUiBmb3IgdGhlIHVzZXIgYnVmZmVyIChwYnVmZmVyKQorCSAgIGFzIHRoaXMgaXMgZG9uZSBpbiBCcmlkZ2UgaW50ZXJuYWwgZnVuY3Rpb24gYnJpZGdlX2NobmxfYWRkX2lvX3JlcQorCSAgIGluIGNobmxfc20uYyAqLworCXN0YXR1cyA9IHN0cm1faXNzdWUoc3RybV9yZXMtPmhzdHJlYW0sCisJCQkgICAgYXJncy0+YXJnc19zdHJtX2lzc3VlLnBidWZmZXIsCisJCQkgICAgYXJncy0+YXJnc19zdHJtX2lzc3VlLmR3X2J5dGVzLAorCQkJICAgIGFyZ3MtPmFyZ3Nfc3RybV9pc3N1ZS5kd19idWZfc2l6ZSwKKwkJCSAgICBhcmdzLT5hcmdzX3N0cm1faXNzdWUuZHdfYXJnKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBzdHJtd3JhcF9vcGVuID09PT09PT09CisgKi8KK3UzMiBzdHJtd3JhcF9vcGVuKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgc3RybV9hdHRyIGF0dHI7CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybV9yZXNfb2JqOworCXN0cnVjdCBkc3Bfc3RyZWFtYXR0cmluIHN0cm1fYXR0cl9pbjsKKwlzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlX3JlczsKKwlpbnQgc3RybWlkOworCisJZmluZF9ub2RlX2hhbmRsZSgmbm9kZV9yZXMsIHByX2N0eHQsIGFyZ3MtPmFyZ3Nfc3RybV9vcGVuLmhub2RlKTsKKworCWlmICghbm9kZV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJQ1BfRk1fVVNSKCZhdHRyLCBhcmdzLT5hcmdzX3N0cm1fb3Blbi5hdHRyX2luLCBzdGF0dXMsIDEpOworCisJaWYgKGF0dHIuc3RyZWFtX2F0dHJfaW4gIT0gTlVMTCkgewkvKiBPcHRpb25hbCBhcmd1bWVudCAqLworCQlDUF9GTV9VU1IoJnN0cm1fYXR0cl9pbiwgYXR0ci5zdHJlYW1fYXR0cl9pbiwgc3RhdHVzLCAxKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWF0dHIuc3RyZWFtX2F0dHJfaW4gPSAmc3RybV9hdHRyX2luOworCQkJaWYgKGF0dHIuc3RyZWFtX2F0dHJfaW4tPnN0cm1fbW9kZSA9PSBTVFJNTU9ERV9MRE1BKQorCQkJCXJldHVybiAtRU5PU1lTOworCQl9CisKKwl9CisJc3RhdHVzID0gc3RybV9vcGVuKG5vZGVfcmVzLT5obm9kZSwKKwkJCSAgIGFyZ3MtPmFyZ3Nfc3RybV9vcGVuLmRpcmVjdGlvbiwKKwkJCSAgIGFyZ3MtPmFyZ3Nfc3RybV9vcGVuLmluZGV4LCAmYXR0ciwgJnN0cm1fcmVzX29iaiwKKwkJCSAgIHByX2N0eHQpOworCWlmICghc3RhdHVzKSB7CisJCXN0cm1pZCA9IHN0cm1fcmVzX29iai0+aWQgKyAxOworCQlDUF9UT19VU1IoYXJncy0+YXJnc19zdHJtX29wZW4ucGhfc3RyZWFtLCAmc3RybWlkLCBzdGF0dXMsIDEpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogPT09PT09PT0gc3RybXdyYXBfcmVjbGFpbSA9PT09PT09PQorICovCit1MzIgc3RybXdyYXBfcmVjbGFpbSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTggKmJ1Zl9wdHI7CisJdTMyIHVsX2J5dGVzOworCXUzMiBkd19hcmc7CisJdTMyIHVsX2J1Zl9zaXplOworCXN0cnVjdCBzdHJtX3Jlc19vYmplY3QgKnN0cm1fcmVzOworCisJZmluZF9zdHJtX2hhbmRsZSgmc3RybV9yZXMsIHByX2N0eHQsIGFyZ3MtPmFyZ3Nfc3RybV9yZWNsYWltLmhzdHJlYW0pOworCisJaWYgKCFzdHJtX3JlcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdGF0dXMgPSBzdHJtX3JlY2xhaW0oc3RybV9yZXMtPmhzdHJlYW0sICZidWZfcHRyLAorCQkJICAgICAgJnVsX2J5dGVzLCAmdWxfYnVmX3NpemUsICZkd19hcmcpOworCUNQX1RPX1VTUihhcmdzLT5hcmdzX3N0cm1fcmVjbGFpbS5idWZfcHRyLCAmYnVmX3B0ciwgc3RhdHVzLCAxKTsKKwlDUF9UT19VU1IoYXJncy0+YXJnc19zdHJtX3JlY2xhaW0uYnl0ZXMsICZ1bF9ieXRlcywgc3RhdHVzLCAxKTsKKwlDUF9UT19VU1IoYXJncy0+YXJnc19zdHJtX3JlY2xhaW0ucGR3X2FyZywgJmR3X2FyZywgc3RhdHVzLCAxKTsKKworCWlmIChhcmdzLT5hcmdzX3N0cm1fcmVjbGFpbS5idWZfc2l6ZV9wdHIgIT0gTlVMTCkgeworCQlDUF9UT19VU1IoYXJncy0+YXJnc19zdHJtX3JlY2xhaW0uYnVmX3NpemVfcHRyLCAmdWxfYnVmX3NpemUsCisJCQkgIHN0YXR1cywgMSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqID09PT09PT09IHN0cm13cmFwX3JlZ2lzdGVyX25vdGlmeSA9PT09PT09PQorICovCit1MzIgc3RybXdyYXBfcmVnaXN0ZXJfbm90aWZ5KHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbiBub3RpZmljYXRpb247CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybV9yZXM7CisKKwlmaW5kX3N0cm1faGFuZGxlKCZzdHJtX3JlcywgcHJfY3R4dCwKKwkJCWFyZ3MtPmFyZ3Nfc3RybV9yZWdpc3Rlcm5vdGlmeS5oc3RyZWFtKTsKKworCWlmICghc3RybV9yZXMpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbm90aWZpY2F0aW9uIGRhdGEgc3RydWN0dXJlICovCisJbm90aWZpY2F0aW9uLnBzX25hbWUgPSBOVUxMOworCW5vdGlmaWNhdGlvbi5oYW5kbGUgPSBOVUxMOworCisJc3RhdHVzID0gc3RybV9yZWdpc3Rlcl9ub3RpZnkoc3RybV9yZXMtPmhzdHJlYW0sCisJCQkJICAgICAgYXJncy0+YXJnc19zdHJtX3JlZ2lzdGVybm90aWZ5LmV2ZW50X21hc2ssCisJCQkJICAgICAgYXJncy0+YXJnc19zdHJtX3JlZ2lzdGVybm90aWZ5LgorCQkJCSAgICAgIG5vdGlmeV90eXBlLCAmbm90aWZpY2F0aW9uKTsKKwlDUF9UT19VU1IoYXJncy0+YXJnc19zdHJtX3JlZ2lzdGVybm90aWZ5Lmhub3RpZmljYXRpb24sICZub3RpZmljYXRpb24sCisJCSAgc3RhdHVzLCAxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBzdHJtd3JhcF9zZWxlY3QgPT09PT09PT0KKyAqLwordTMyIHN0cm13cmFwX3NlbGVjdCh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJdTMyIG1hc2s7CisJc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJtX3RhYltNQVhfU1RSRUFNU107CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybV9yZXM7CisJaW50ICppZHNbTUFYX1NUUkVBTVNdOworCWludCBpOworCisJaWYgKGFyZ3MtPmFyZ3Nfc3RybV9zZWxlY3Quc3RybV9udW0gPiBNQVhfU1RSRUFNUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlDUF9GTV9VU1IoaWRzLCBhcmdzLT5hcmdzX3N0cm1fc2VsZWN0LnN0cmVhbV90YWIsIHN0YXR1cywKKwkJYXJncy0+YXJnc19zdHJtX3NlbGVjdC5zdHJtX251bSk7CisKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJZm9yIChpID0gMDsgaSA8IGFyZ3MtPmFyZ3Nfc3RybV9zZWxlY3Quc3RybV9udW07IGkrKykgeworCQlmaW5kX3N0cm1faGFuZGxlKCZzdHJtX3JlcywgcHJfY3R4dCwgaWRzW2ldKTsKKworCQlpZiAoIXN0cm1fcmVzKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3RybV90YWJbaV0gPSBzdHJtX3Jlcy0+aHN0cmVhbTsKKwl9CisKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBzdHJtX3NlbGVjdChzdHJtX3RhYiwgYXJncy0+YXJnc19zdHJtX3NlbGVjdC5zdHJtX251bSwKKwkJCQkgICAgICZtYXNrLCBhcmdzLT5hcmdzX3N0cm1fc2VsZWN0LnV0aW1lb3V0KTsKKwl9CisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3Nfc3RybV9zZWxlY3QucG1hc2ssICZtYXNrLCBzdGF0dXMsIDEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENNTSAqLworCisvKgorICogPT09PT09PT0gY21td3JhcF9jYWxsb2NfYnVmID09PT09PT09CisgKi8KK3UzMiBfX2RlcHJlY2F0ZWQgY21td3JhcF9jYWxsb2NfYnVmKHVuaW9uIHRyYXBwZWRfYXJncyAqIGFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJLyogVGhpcyBvcGVyYXRpb24gaXMgZG9uZSBpbiBrZXJuZWwgKi8KKwlwcl9lcnIoIiVzOiBkZXByZWNhdGVkIGRzcGJyaWRnZSBpb2N0bFxuIiwgX19mdW5jX18pOworCXJldHVybiAtRU5PU1lTOworfQorCisvKgorICogPT09PT09PT0gY21td3JhcF9mcmVlX2J1ZiA9PT09PT09PQorICovCit1MzIgX19kZXByZWNhdGVkIGNtbXdyYXBfZnJlZV9idWYodW5pb24gdHJhcHBlZF9hcmdzICogYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwkvKiBUaGlzIG9wZXJhdGlvbiBpcyBkb25lIGluIGtlcm5lbCAqLworCXByX2VycigiJXM6IGRlcHJlY2F0ZWQgZHNwYnJpZGdlIGlvY3RsXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKKy8qCisgKiA9PT09PT09PSBjbW13cmFwX2dldF9oYW5kbGUgPT09PT09PT0KKyAqLwordTMyIGNtbXdyYXBfZ2V0X2hhbmRsZSh1bmlvbiB0cmFwcGVkX2FyZ3MgKmFyZ3MsIHZvaWQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGNtbV9vYmplY3QgKmhjbW1fbWdyOworCXZvaWQgKmhwcm9jZXNzb3IgPSAoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcl9jdHh0KS0+aHByb2Nlc3NvcjsKKworCXN0YXR1cyA9IGNtbV9nZXRfaGFuZGxlKGhwcm9jZXNzb3IsICZoY21tX21ncik7CisKKwlDUF9UT19VU1IoYXJncy0+YXJnc19jbW1fZ2V0aGFuZGxlLnBoX2NtbV9tZ3IsICZoY21tX21nciwgc3RhdHVzLCAxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiA9PT09PT09PSBjbW13cmFwX2dldF9pbmZvID09PT09PT09CisgKi8KK3UzMiBjbW13cmFwX2dldF9pbmZvKHVuaW9uIHRyYXBwZWRfYXJncyAqYXJncywgdm9pZCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY21tX2luZm8gY21tX2luZm9fb2JqOworCisJc3RhdHVzID0gY21tX2dldF9pbmZvKGFyZ3MtPmFyZ3NfY21tX2dldGluZm8uaGNtbV9tZ3IsICZjbW1faW5mb19vYmopOworCisJQ1BfVE9fVVNSKGFyZ3MtPmFyZ3NfY21tX2dldGluZm8uY21tX2luZm9fb2JqLCAmY21tX2luZm9fb2JqLCBzdGF0dXMsCisJCSAgMSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3BtZ3IvaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3MGZlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2lvLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBpby5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIElPIG1hbmFnZXIgaW50ZXJmYWNlOiBNYW5hZ2VzIElPIGJldHdlZW4gQ0hOTCBhbmQgbXNnX2N0cmwuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9zdCBPUyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1MgQWRhcHRhdGlvbiBMYXllciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmcuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBsYXRmb3JtIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8aW9vYmouaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaW9kZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2lvLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWxzICovCitzdGF0aWMgdTMyIHJlZnM7CisKKy8qCisgKiAgPT09PT09PT0gaW9fY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGFuIElPIG1hbmFnZXIgb2JqZWN0LCByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgSU8gYmV0d2VlbgorICogICAgICBDSE5MIGFuZCBtc2dfY3RybAorICovCitpbnQgaW9fY3JlYXRlKHN0cnVjdCBpb19tZ3IgKippb19tYW4sIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaW9fYXR0cnMgKm1ncl9hdHRydHMpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IGlvX21nciAqaGlvX21nciA9IE5VTEw7CisJc3RydWN0IGlvX21ncl8gKnBpb19tZ3IgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGlvX21hbiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShtZ3JfYXR0cnRzICE9IE5VTEwpOworCisJKmlvX21hbiA9IE5VTEw7CisKKwkvKiBBIG1lbW9yeSBiYXNlIG9mIDAgaW1wbGllcyBubyBtZW1vcnkgYmFzZTogKi8KKwlpZiAoKG1ncl9hdHRydHMtPnNobV9iYXNlICE9IDApICYmIChtZ3JfYXR0cnRzLT51c21fbGVuZ3RoID09IDApKQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJaWYgKG1ncl9hdHRydHMtPndvcmRfc2l6ZSA9PSAwKQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJaWYgKCFzdGF0dXMpIHsKKwkJZGV2X2dldF9pbnRmX2Z4bnMoaGRldl9vYmosICZpbnRmX2Z4bnMpOworCisJCS8qIExldCBCcmlkZ2UgY2hhbm5lbCBtb2R1bGUgZmluaXNoIHRoZSBjcmVhdGU6ICovCisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5faW9fY3JlYXRlKSAoJmhpb19tZ3IsIGhkZXZfb2JqLAorCQkJCQkJICAgICAgbWdyX2F0dHJ0cyk7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXBpb19tZ3IgPSAoc3RydWN0IGlvX21ncl8gKiloaW9fbWdyOworCQkJcGlvX21nci0+aW50Zl9meG5zID0gaW50Zl9meG5zOworCQkJcGlvX21nci0+aGRldl9vYmogPSBoZGV2X29iajsKKworCQkJLyogUmV0dXJuIHRoZSBuZXcgY2hhbm5lbCBtYW5hZ2VyIGhhbmRsZTogKi8KKwkJCSppb19tYW4gPSBoaW9fbWdyOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBpb19kZXN0cm95ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVsZXRlIElPIG1hbmFnZXIuCisgKi8KK2ludCBpb19kZXN0cm95KHN0cnVjdCBpb19tZ3IgKmhpb19tZ3IpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IGlvX21ncl8gKnBpb19tZ3IgPSAoc3RydWN0IGlvX21ncl8gKiloaW9fbWdyOworCWludCBzdGF0dXM7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpbnRmX2Z4bnMgPSBwaW9fbWdyLT5pbnRmX2Z4bnM7CisKKwkvKiBMZXQgQnJpZGdlIGNoYW5uZWwgbW9kdWxlIGRlc3Ryb3kgdGhlIGlvX21ncjogKi8KKwlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2lvX2Rlc3Ryb3kpIChoaW9fbWdyKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gaW9fZXhpdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIERpc2NvbnRpbnVlIHVzYWdlIG9mIHRoZSBJTyBtb2R1bGUuCisgKi8KK3ZvaWQgaW9fZXhpdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXJlZnMtLTsKKworCURCQ19FTlNVUkUocmVmcyA+PSAwKTsKK30KKworLyoKKyAqICA9PT09PT09PSBpb19pbml0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgSW5pdGlhbGl6ZSB0aGUgSU8gbW9kdWxlJ3MgcHJpdmF0ZSBzdGF0ZS4KKyAqLworYm9vbCBpb19pbml0KHZvaWQpCit7CisJYm9vbCByZXQgPSB0cnVlOworCisJREJDX1JFUVVJUkUocmVmcyA+PSAwKTsKKworCWlmIChyZXQpCisJCXJlZnMrKzsKKworCURCQ19FTlNVUkUoKHJldCAmJiAocmVmcyA+IDApKSB8fCAoIXJldCAmJiAocmVmcyA+PSAwKSkpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL2lvb2JqLmggYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9pb29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjM1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9pb29iai5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBpb29iai5oCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFN0cnVjdHVyZSBzdWJjb21wb25lbnRzIG9mIGNoYW5uZWwgY2xhc3MgbGlicmFyeSBJTyBvYmplY3RzIHdoaWNoCisgKiBhcmUgZXhwb3NlZCB0byBEU1AgQVBJIGZyb20gQnJpZGdlIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIElPT0JKXworI2RlZmluZSBJT09CSl8KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXZkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlZnMuaD4KKworLyoKKyAqICBUaGlzIHN0cnVjdCBpcyB0aGUgZmlyc3QgZmllbGQgaW4gYSBpb19tZ3Igc3RydWN0LiBPdGhlciwgaW1wbGVtZW50YXRpb24KKyAqICBzcGVjaWZpYyBmaWVsZHMgZm9sbG93IHRoaXMgc3RydWN0dXJlIGluIG1lbW9yeS4KKyAqLworc3RydWN0IGlvX21ncl8geworCS8qIFRoZXNlIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkcyBpbiBhIGlvX21nciBzdHJ1Y3Q6ICovCisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqaGJyaWRnZV9jb250ZXh0OwkvKiBCcmlkZ2UgY29udGV4dC4gKi8KKwkvKiBGdW5jdGlvbiBpbnRlcmZhY2UgdG8gQnJpZGdlIGRyaXZlci4gKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmo7CS8qIERldmljZSB0aGlzIGJvYXJkIHJlcHJlc2VudHMuICovCit9OworCisjZW5kaWYgLyogSU9PQkpfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9tc2cuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDQzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9tc2cuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIG1zZy5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERTUC9CSU9TIEJyaWRnZSBtc2dfY3RybCBNb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9zdCBPUyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQnJpZGdlIERyaXZlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPG1zZ29iai5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9tc2cuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbHMgKi8KK3N0YXRpYyB1MzIgcmVmczsJCS8qIG1vZHVsZSByZWZlcmVuY2UgY291bnQgKi8KKworLyoKKyAqICA9PT09PT09PSBtc2dfY3JlYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGFuIG9iamVjdCB0byBtYW5hZ2UgbWVzc2FnZSBxdWV1ZXMuIE9ubHkgb25lIG9mIHRoZXNlIG9iamVjdHMKKyAqICAgICAgY2FuIGV4aXN0IHBlciBkZXZpY2Ugb2JqZWN0LgorICovCitpbnQgbXNnX2NyZWF0ZShzdHJ1Y3QgbXNnX21nciAqKm1zZ19tYW4sCisJCSAgICAgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiwgbXNnX29uZXhpdCBtc2dfY2FsbGJhY2spCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IG1zZ19tZ3JfICptc2dfbWdyX29iajsKKwlzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3I7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUobXNnX21hbiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShtc2dfY2FsbGJhY2sgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmogIT0gTlVMTCk7CisKKwkqbXNnX21hbiA9IE5VTEw7CisKKwlkZXZfZ2V0X2ludGZfZnhucyhoZGV2X29iaiwgJmludGZfZnhucyk7CisKKwkvKiBMZXQgQnJpZGdlIG1lc3NhZ2UgbW9kdWxlIGZpbmlzaCB0aGUgY3JlYXRlOiAqLworCXN0YXR1cyA9CisJICAgICgqaW50Zl9meG5zLT5wZm5fbXNnX2NyZWF0ZSkgKCZobXNnX21nciwgaGRldl9vYmosIG1zZ19jYWxsYmFjayk7CisKKwlpZiAoIXN0YXR1cykgeworCQkvKiBGaWxsIGluIERTUCBBUEkgbWVzc2FnZSBtb2R1bGUncyBmaWVsZHMgb2YgdGhlIG1zZ19tZ3IKKwkJICogc3RydWN0dXJlICovCisJCW1zZ19tZ3Jfb2JqID0gKHN0cnVjdCBtc2dfbWdyXyAqKWhtc2dfbWdyOworCQltc2dfbWdyX29iai0+aW50Zl9meG5zID0gaW50Zl9meG5zOworCisJCS8qIEZpbmFsbHksIHJldHVybiB0aGUgbmV3IG1lc3NhZ2UgbWFuYWdlciBoYW5kbGU6ICovCisJCSptc2dfbWFuID0gaG1zZ19tZ3I7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG1zZ19kZWxldGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWxldGUgYSBtc2dfY3RybCBtYW5hZ2VyIGFsbG9jYXRlZCBpbiBtc2dfY3JlYXRlKCkuCisgKi8KK3ZvaWQgbXNnX2RlbGV0ZShzdHJ1Y3QgbXNnX21nciAqaG1zZ19tZ3IpCit7CisJc3RydWN0IG1zZ19tZ3JfICptc2dfbWdyX29iaiA9IChzdHJ1Y3QgbXNnX21ncl8gKilobXNnX21ncjsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmIChtc2dfbWdyX29iaikgeworCQlpbnRmX2Z4bnMgPSBtc2dfbWdyX29iai0+aW50Zl9meG5zOworCisJCS8qIExldCBCcmlkZ2UgbWVzc2FnZSBtb2R1bGUgZGVzdHJveSB0aGUgbXNnX21ncjogKi8KKwkJKCppbnRmX2Z4bnMtPnBmbl9tc2dfZGVsZXRlKSAoaG1zZ19tZ3IpOworCX0gZWxzZSB7CisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEVycm9yIGhtc2dfbWdyIGhhbmRsZTogJXBcbiIsCisJCQlfX2Z1bmNfXywgaG1zZ19tZ3IpOworCX0KK30KKworLyoKKyAqICA9PT09PT09PSBtc2dfZXhpdCA9PT09PT09PQorICovCit2b2lkIG1zZ19leGl0KHZvaWQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCXJlZnMtLTsKKworCURCQ19FTlNVUkUocmVmcyA+PSAwKTsKK30KKworLyoKKyAqICA9PT09PT09PSBtc2dfbW9kX2luaXQgPT09PT09PT0KKyAqLworYm9vbCBtc2dfbW9kX2luaXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCisJcmVmcysrOworCisJREJDX0VOU1VSRShyZWZzID49IDApOworCisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9tc2dvYmouaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9wbWdyL21zZ29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2E2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvcG1nci9tc2dvYmouaApAQCAtMCwwICsxLDM4IEBACisvKgorICogbXNnb2JqLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogU3RydWN0dXJlIHN1YmNvbXBvbmVudHMgb2YgY2hhbm5lbCBjbGFzcyBsaWJyYXJ5IG1zZ19jdHJsIG9iamVjdHMgd2hpY2gKKyAqIGFyZSBleHBvc2VkIHRvIERTUCBBUEkgZnJvbSBCcmlkZ2UgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgTVNHT0JKXworI2RlZmluZSBNU0dPQkpfCisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwZGVmcy5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL21zZ2RlZnMuaD4KKworLyoKKyAqICBUaGlzIHN0cnVjdCBpcyB0aGUgZmlyc3QgZmllbGQgaW4gYSBtc2dfbWdyIHN0cnVjdC4gT3RoZXIsIGltcGxlbWVudGF0aW9uCisgKiAgc3BlY2lmaWMgZmllbGRzIGZvbGxvdyB0aGlzIHN0cnVjdHVyZSBpbiBtZW1vcnkuCisgKi8KK3N0cnVjdCBtc2dfbWdyXyB7CisJLyogVGhlIGZpcnN0IGZpZWxkIG11c3QgbWF0Y2ggdGhhdCBpbiBfbXNnX3NtLmggKi8KKworCS8qIEZ1bmN0aW9uIGludGVyZmFjZSB0byBCcmlkZ2UgZHJpdmVyLiAqLworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworfTsKKworI2VuZGlmIC8qIE1TR09CSl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2RiZGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MWU4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jCkBAIC0wLDAgKzEsMTUxMiBAQAorLyoKKyAqIGRiZGNkLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRFNQL0JJT1MgQnJpZGdlCisgKiBDb25maWd1cmF0aW9uIERhdGFiYXNlIChEQ0QpLgorICoKKyAqIE5vdGVzOgorICogICBUaGUgZnhuIGRjZF9nZXRfb2JqZWN0cyBjYW4gYXBwbHkgYSBjYWxsYmFjayBmeG4gdG8gZWFjaCBEQ0Qgb2JqZWN0CisgKiAgIHRoYXQgaXMgbG9jYXRlZCBpbiBhIHNwZWNpZmllZCBDT0ZGIGZpbGUuICBBdCB0aGUgbW9tZW50LAorICogICBkY2RfYXV0b19yZWdpc3RlciwgZGNkX2F1dG9fdW5yZWdpc3RlciwgYW5kIE5MRFIgbW9kdWxlIGFsbCB1c2UKKyAqICAgZGNkX2dldF9vYmplY3RzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhvc3QgT1MgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NvZC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3V1aWR1dGlsLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGNkLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgZGVmaW5lcy4gKi8KKyNkZWZpbmUgTUFYX0lOVDJDSEFSX0xFTkdUSCAgICAgMTYJLyogTWF4IGludDJjaGFyIGxlbiBvZiAzMiBiaXQgaW50ICovCisKKy8qIE5hbWUgb2Ygc2VjdGlvbiBjb250YWluaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKyNkZWZpbmUgREVQTElCU0VDVAkJIi5kc3BicmlkZ2VfZGVwbGlicyIKKworLyogRENEIHNwZWNpZmljIHN0cnVjdHVyZXMuICovCitzdHJ1Y3QgZGNkX21hbmFnZXIgeworCXN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncjsJLyogSGFuZGxlIHRvIENPRCBtYW5hZ2VyIG9iamVjdC4gKi8KK307CisKKy8qICBQb2ludGVyIHRvIHRoZSByZWdpc3RyeSBzdXBwb3J0IGtleSAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgcmVnX2tleV9saXN0Oworc3RhdGljIERFRklORV9TUElOTE9DSyhkYmRjZF9sb2NrKTsKKworLyogR2xvYmFsIHJlZmVyZW5jZSB2YXJpYWJsZXMuICovCitzdGF0aWMgdTMyIHJlZnM7CitzdGF0aWMgdTMyIGVudW1fcmVmczsKKworLyogSGVscGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCitzdGF0aWMgczMyIGF0b2koY2hhciAqcHN6X2J1Zik7CitzdGF0aWMgaW50IGdldF9hdHRyc19mcm9tX2J1ZihjaGFyICpwc3pfYnVmLCB1MzIgdWxfYnVmX3NpemUsCisJCQkJICAgICBlbnVtIGRzcF9kY2RvYmp0eXBlIG9ial90eXBlLAorCQkJCSAgICAgc3RydWN0IGRjZF9nZW5lcmljb2JqICpnZW5fb2JqKTsKK3N0YXRpYyB2b2lkIGNvbXByZXNzX2J1ZihjaGFyICpwc3pfYnVmLCB1MzIgdWxfYnVmX3NpemUsIHMzMiBjaGFyX3NpemUpOworc3RhdGljIGNoYXIgZHNwX2NoYXIyX2dwcF9jaGFyKGNoYXIgKndvcmQsIHMzMiBkc3BfY2hhcl9zaXplKTsKK3N0YXRpYyBpbnQgZ2V0X2RlcF9saWJfaW5mbyhzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyLAorCQkJCSAgIHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJICAgdTE2ICpudW1fbGlicywKKwkJCQkgICB1MTYgKm51bV9wZXJzX2xpYnMsCisJCQkJICAgc3RydWN0IGRzcF91dWlkICpkZXBfbGliX3V1aWRzLAorCQkJCSAgIGJvb2wgKnByc3RudF9kZXBfbGlicywKKwkJCQkgICBlbnVtIG5sZHJfcGhhc2UgcGhhc2UpOworCisvKgorICogID09PT09PT09IGRjZF9hdXRvX3JlZ2lzdGVyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUGFyc2VzIHRoZSBzdXBwbGllZCBpbWFnZSBhbmQgcmVzaWdzdGVycyB3aXRoIERDRC4KKyAqLworaW50IGRjZF9hdXRvX3JlZ2lzdGVyKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkgICAgIGNoYXIgKnN6X2NvZmZfcGF0aCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmIChoZGNkX21ncikKKwkJc3RhdHVzID0gZGNkX2dldF9vYmplY3RzKGhkY2RfbWdyLCBzel9jb2ZmX3BhdGgsCisJCQkJCSAoZGNkX3JlZ2lzdGVyZnhuKSBkY2RfcmVnaXN0ZXJfb2JqZWN0LAorCQkJCQkgKHZvaWQgKilzel9jb2ZmX3BhdGgpOworCWVsc2UKKwkJc3RhdHVzID0gLUVGQVVMVDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2F1dG9fdW5yZWdpc3RlciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFBhcnNlcyB0aGUgc3VwcGxpZWQgRFNQIGltYWdlIGFuZCB1bnJlc2l0ZXJzIGZyb20gRENELgorICovCitpbnQgZGNkX2F1dG9fdW5yZWdpc3RlcihzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyLAorCQkJICAgICAgIGNoYXIgKnN6X2NvZmZfcGF0aCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmIChoZGNkX21ncikKKwkJc3RhdHVzID0gZGNkX2dldF9vYmplY3RzKGhkY2RfbWdyLCBzel9jb2ZmX3BhdGgsCisJCQkJCSAoZGNkX3JlZ2lzdGVyZnhuKSBkY2RfcmVnaXN0ZXJfb2JqZWN0LAorCQkJCQkgTlVMTCk7CisJZWxzZQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkY2RfY3JlYXRlX21hbmFnZXIgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDcmVhdGVzIERDRCBtYW5hZ2VyLgorICovCitpbnQgZGNkX2NyZWF0ZV9tYW5hZ2VyKGNoYXIgKnN6X3psX2RsbF9uYW1lLAorCQkJICAgICAgc3RydWN0IGRjZF9tYW5hZ2VyICoqZGNkX21ncikKK3sKKwlzdHJ1Y3QgY29kX21hbmFnZXIgKmNvZF9tZ3I7CS8qIENPRCBtYW5hZ2VyIGhhbmRsZSAqLworCXN0cnVjdCBkY2RfbWFuYWdlciAqZGNkX21ncl9vYmogPSBOVUxMOwkvKiBEQ0QgTWFuYWdlciBwb2ludGVyICovCisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCURCQ19SRVFVSVJFKGRjZF9tZ3IpOworCisJc3RhdHVzID0gY29kX2NyZWF0ZSgmY29kX21nciwgc3pfemxfZGxsX25hbWUsIE5VTEwpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBDcmVhdGUgYSBEQ0Qgb2JqZWN0LiAqLworCWRjZF9tZ3Jfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRjZF9tYW5hZ2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRjZF9tZ3Jfb2JqICE9IE5VTEwpIHsKKwkJLyogRmlsbCBvdXQgdGhlIG9iamVjdC4gKi8KKwkJZGNkX21ncl9vYmotPmNvZF9tZ3IgPSBjb2RfbWdyOworCisJCS8qIFJldHVybiBoYW5kbGUgdG8gdGhpcyBEQ0QgaW50ZXJmYWNlLiAqLworCQkqZGNkX21nciA9IGRjZF9tZ3Jfb2JqOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisKKwkJLyoKKwkJICogSWYgYWxsb2NhdGlvbiBvZiBEY2RNYW5hZ2VyIG9iamVjdCBmYWlsZWQsIGRlbGV0ZSB0aGUKKwkJICogQ09EIG1hbmFnZXIuCisJCSAqLworCQljb2RfZGVsZXRlKGNvZF9tZ3IpOworCX0KKworCURCQ19FTlNVUkUoKCFzdGF0dXMpIHx8CisJCQkoKGRjZF9tZ3Jfb2JqID09IE5VTEwpICYmIChzdGF0dXMgPT0gLUVOT01FTSkpKTsKKworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkY2RfZGVzdHJveV9tYW5hZ2VyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRnJlZXMgRENEIE1hbmFnZXIgb2JqZWN0LgorICovCitpbnQgZGNkX2Rlc3Ryb3lfbWFuYWdlcihzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyKQoreworCXN0cnVjdCBkY2RfbWFuYWdlciAqZGNkX21ncl9vYmogPSBoZGNkX21ncjsKKwlpbnQgc3RhdHVzID0gLUVGQVVMVDsKKworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlpZiAoaGRjZF9tZ3IpIHsKKwkJLyogRGVsZXRlIHRoZSBDT0QgbWFuYWdlci4gKi8KKwkJY29kX2RlbGV0ZShkY2RfbWdyX29iai0+Y29kX21ncik7CisKKwkJLyogRGVhbGxvY2F0ZSBhIERDRCBtYW5hZ2VyIG9iamVjdC4gKi8KKwkJa2ZyZWUoZGNkX21ncl9vYmopOworCisJCXN0YXR1cyA9IDA7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkY2RfZW51bWVyYXRlX29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVudW1lcmF0ZXMgb2JqZWN0cyBpbiB0aGUgRENELgorICovCitpbnQgZGNkX2VudW1lcmF0ZV9vYmplY3QoczMyIGluZGV4LCBlbnVtIGRzcF9kY2RvYmp0eXBlIG9ial90eXBlLAorCQkJCXN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmopCit7CisJaW50IHN0YXR1cyA9IDA7CisJY2hhciBzel9yZWdfa2V5W0RDRF9NQVhQQVRITEVOR1RIXTsKKwljaGFyIHN6X3ZhbHVlW0RDRF9NQVhQQVRITEVOR1RIXTsKKwlzdHJ1Y3QgZHNwX3V1aWQgZHNwX3V1aWRfb2JqOworCWNoYXIgc3pfb2JqX3R5cGVbTUFYX0lOVDJDSEFSX0xFTkdUSF07CS8qIHN0ci4gcmVwLiBvZiBvYmpfdHlwZS4gKi8KKwl1MzIgZHdfa2V5X2xlbiA9IDA7CisJc3RydWN0IGRjZF9rZXlfZWxlbSAqZGNkX2tleTsKKwlpbnQgbGVuOworCisJREJDX1JFUVVJUkUocmVmcyA+PSAwKTsKKwlEQkNfUkVRVUlSRShpbmRleCA+PSAwKTsKKwlEQkNfUkVRVUlSRSh1dWlkX29iaiAhPSBOVUxMKTsKKworCWlmICgoaW5kZXggIT0gMCkgJiYgKGVudW1fcmVmcyA9PSAwKSkgeworCQkvKgorCQkgKiBJZiBhbiBlbnVtZXJhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQgb24gYW4gaW5kZXggZ3JlYXRlcgorCQkgKiB0aGFuIHplcm8sIHRoZW4gdGhlIGN1cnJlbnQgZW51bV9yZWZzIG11c3QgaGF2ZSBiZWVuCisJCSAqIGluY3JlbWVudGVkIHRvIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCQkgKi8KKwkJc3RhdHVzID0gLUVJRFJNOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFByZS1kZXRlcm1pbmUgZmluYWwga2V5IGxlbmd0aC4gSXQncyBsZW5ndGggb2YgRENEX1JFR0tFWSArCisJCSAqICAiX1wwIiArIGxlbmd0aCBvZiBzel9vYmpfdHlwZSBzdHJpbmcgKyB0ZXJtaW5hdGluZyBOVUxMLgorCQkgKi8KKwkJZHdfa2V5X2xlbiA9IHN0cmxlbihEQ0RfUkVHS0VZKSArIDEgKyBzaXplb2Yoc3pfb2JqX3R5cGUpICsgMTsKKwkJREJDX0FTU0VSVChkd19rZXlfbGVuIDwgRENEX01BWFBBVEhMRU5HVEgpOworCisJCS8qIENyZWF0ZSBwcm9wZXIgUkVHIGtleTsgY29uY2F0ZW5hdGUgRENEX1JFR0tFWSB3aXRoCisJCSAqIG9ial90eXBlLiAqLworCQlzdHJuY3B5KHN6X3JlZ19rZXksIERDRF9SRUdLRVksIHN0cmxlbihEQ0RfUkVHS0VZKSArIDEpOworCQlpZiAoKHN0cmxlbihzel9yZWdfa2V5KSArIHN0cmxlbigiX1wwIikpIDwKKwkJICAgIERDRF9NQVhQQVRITEVOR1RIKSB7CisJCQlzdHJuY2F0KHN6X3JlZ19rZXksICJfXDAiLCAyKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCisJCS8qIFRoaXMgc25wcmludGYgaXMgZ3VhcmFudGVlZCBub3QgdG8gZXhjZWVkIG1heCBzaXplIG9mIGFuCisJCSAqIGludGVnZXIuICovCisJCXN0YXR1cyA9IHNucHJpbnRmKHN6X29ial90eXBlLCBNQVhfSU5UMkNIQVJfTEVOR1RILCAiJWQiLAorCQkJCSAgb2JqX3R5cGUpOworCisJCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IDA7CisJCQlpZiAoKHN0cmxlbihzel9yZWdfa2V5KSArIHN0cmxlbihzel9vYmpfdHlwZSkpIDwKKwkJCSAgICBEQ0RfTUFYUEFUSExFTkdUSCkgeworCQkJCXN0cm5jYXQoc3pfcmVnX2tleSwgc3pfb2JqX3R5cGUsCisJCQkJCXN0cmxlbihzel9vYmpfdHlwZSkgKyAxKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gLUVQRVJNOworCQkJfQorCQl9CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWxlbiA9IHN0cmxlbihzel9yZWdfa2V5KTsKKwkJCXNwaW5fbG9jaygmZGJkY2RfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjZF9rZXksICZyZWdfa2V5X2xpc3QsIGxpbmspIHsKKwkJCQlpZiAoIXN0cm5jbXAoZGNkX2tleS0+bmFtZSwgc3pfcmVnX2tleSwgbGVuKQorCQkJCQkJJiYgIWluZGV4LS0pIHsKKwkJCQkJc3RybmNweShzel92YWx1ZSwgJmRjZF9rZXktPm5hbWVbbGVuXSwKKwkJCQkJICAgICAgIHN0cmxlbigmZGNkX2tleS0+bmFtZVtsZW5dKSArIDEpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJmRiZGNkX2xvY2spOworCisJCQlpZiAoJmRjZF9rZXktPmxpbmsgPT0gJnJlZ19rZXlfbGlzdCkKKwkJCQlzdGF0dXMgPSAtRU5PREFUQTsKKwkJfQorCisJCWlmICghc3RhdHVzKSB7CisJCQkvKiBDcmVhdGUgVVVJRCB2YWx1ZSB1c2luZyBzdHJpbmcgcmV0cmlldmVkIGZyb20KKwkJCSAqIHJlZ2lzdHJ5LiAqLworCQkJdXVpZF91dWlkX2Zyb21fc3RyaW5nKHN6X3ZhbHVlLCAmZHNwX3V1aWRfb2JqKTsKKworCQkJKnV1aWRfb2JqID0gZHNwX3V1aWRfb2JqOworCisJCQkvKiBJbmNyZW1lbnQgZW51bV9yZWZzIHRvIHVwZGF0ZSByZWZlcmVuY2UgY291bnQuICovCisJCQllbnVtX3JlZnMrKzsKKworCQkJc3RhdHVzID0gMDsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPT0gLUVOT0RBVEEpIHsKKwkJCS8qIEF0IHRoZSBlbmQgb2YgZW51bWVyYXRpb24uIFJlc2V0IGVudW1fcmVmcy4gKi8KKwkJCWVudW1fcmVmcyA9IDA7CisKKwkJCS8qCisJCQkgKiBUT0RPOiBSZXZpc2l0LCB0aGlzIGlzIG5vdCBhbiBlcnJyb3IgY2FzZSBidXQgY29kZQorCQkJICogZXhwZWN0cyBub24temVybyB2YWx1ZS4KKwkJCSAqLworCQkJc3RhdHVzID0gRU5PREFUQTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCX0KKworCURCQ19FTlNVUkUodXVpZF9vYmogfHwgKHN0YXR1cyA9PSAtRVBFUk0pKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiB0aGUgRENEIG1vZHVsZS4KKyAqLwordm9pZCBkY2RfZXhpdCh2b2lkKQoreworCXN0cnVjdCBkY2Rfa2V5X2VsZW0gKnJ2LCAqcnZfdG1wOworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXJlZnMtLTsKKwlpZiAocmVmcyA9PSAwKSB7CisJCWNvZF9leGl0KCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydiwgcnZfdG1wLCAmcmVnX2tleV9saXN0LCBsaW5rKSB7CisJCQlsaXN0X2RlbCgmcnYtPmxpbmspOworCQkJa2ZyZWUocnYtPnBhdGgpOworCQkJa2ZyZWUocnYpOworCQl9CisJfQorCisJREJDX0VOU1VSRShyZWZzID49IDApOworfQorCisvKgorICogID09PT09PT09IGRjZF9nZXRfZGVwX2xpYnMgPT09PT09PT0KKyAqLworaW50IGRjZF9nZXRfZGVwX2xpYnMoc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21nciwKKwkJCSAgICBzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJICAgIHUxNiBudW1fbGlicywgc3RydWN0IGRzcF91dWlkICpkZXBfbGliX3V1aWRzLAorCQkJICAgIGJvb2wgKnByc3RudF9kZXBfbGlicywKKwkJCSAgICBlbnVtIG5sZHJfcGhhc2UgcGhhc2UpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaGRjZF9tZ3IpOworCURCQ19SRVFVSVJFKHV1aWRfb2JqICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGRlcF9saWJfdXVpZHMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUocHJzdG50X2RlcF9saWJzICE9IE5VTEwpOworCisJc3RhdHVzID0KKwkgICAgZ2V0X2RlcF9saWJfaW5mbyhoZGNkX21nciwgdXVpZF9vYmosICZudW1fbGlicywgTlVMTCwgZGVwX2xpYl91dWlkcywKKwkJCSAgICAgcHJzdG50X2RlcF9saWJzLCBwaGFzZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRjZF9nZXRfbnVtX2RlcF9saWJzID09PT09PT09CisgKi8KK2ludCBkY2RfZ2V0X251bV9kZXBfbGlicyhzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyLAorCQkJCXN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJdTE2ICpudW1fbGlicywgdTE2ICpudW1fcGVyc19saWJzLAorCQkJCWVudW0gbmxkcl9waGFzZSBwaGFzZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShoZGNkX21ncik7CisJREJDX1JFUVVJUkUobnVtX2xpYnMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobnVtX3BlcnNfbGlicyAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRSh1dWlkX29iaiAhPSBOVUxMKTsKKworCXN0YXR1cyA9IGdldF9kZXBfbGliX2luZm8oaGRjZF9tZ3IsIHV1aWRfb2JqLCBudW1fbGlicywgbnVtX3BlcnNfbGlicywKKwkJCQkgIE5VTEwsIE5VTEwsIHBoYXNlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2dldF9vYmplY3RfZGVmID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbm9kZSBvciBwcm9jZXNzb3IgYmFzZWQgb24gdGhlIFVVSUQgYW5kCisgKiAgICAgIG9iamVjdCB0eXBlLgorICovCitpbnQgZGNkX2dldF9vYmplY3RfZGVmKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkgICAgICBzdHJ1Y3QgZHNwX3V1aWQgKm9ial91dWlkLAorCQkJICAgICAgZW51bSBkc3BfZGNkb2JqdHlwZSBvYmpfdHlwZSwKKwkJCSAgICAgIHN0cnVjdCBkY2RfZ2VuZXJpY29iaiAqb2JqX2RlZikKK3sKKwlzdHJ1Y3QgZGNkX21hbmFnZXIgKmRjZF9tZ3Jfb2JqID0gaGRjZF9tZ3I7CS8qIHB0ciB0byBEQ0QgbWdyICovCisJc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXUzMiB1bF9hZGRyID0gMDsJLyogVXNlZCBieSBjb2RfZ2V0X3NlY3Rpb24gKi8KKwl1MzIgdWxfbGVuID0gMDsJCS8qIFVzZWQgYnkgY29kX2dldF9zZWN0aW9uICovCisJdTMyIGR3X2J1Zl9zaXplOwkvKiBVc2VkIGJ5IFJFRyBmdW5jdGlvbnMgKi8KKwljaGFyIHN6X3JlZ19rZXlbRENEX01BWFBBVEhMRU5HVEhdOworCWNoYXIgKnN6X3V1aWQ7CQkvKltNQVhVVUlETEVOXTsgKi8KKwlzdHJ1Y3QgZGNkX2tleV9lbGVtICpkY2Rfa2V5ID0gTlVMTDsKKwljaGFyIHN6X3NlY3RfbmFtZVtNQVhVVUlETEVOICsgMl07CS8qICIuW1VVSURdXDAiICovCisJY2hhciAqcHN6X2NvZmZfYnVmOworCXUzMiBkd19rZXlfbGVuOwkJLyogTGVuIG9mIFJFRyBrZXkuICovCisJY2hhciBzel9vYmpfdHlwZVtNQVhfSU5UMkNIQVJfTEVOR1RIXTsJLyogc3RyLiByZXAuIG9mIG9ial90eXBlLiAqLworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG9ial9kZWYgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUob2JqX3V1aWQgIT0gTlVMTCk7CisKKwlzel91dWlkID0ga3phbGxvYyhNQVhVVUlETEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN6X3V1aWQpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwlpZiAoIWhkY2RfbWdyKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJLyogUHJlLWRldGVybWluZSBmaW5hbCBrZXkgbGVuZ3RoLiBJdCdzIGxlbmd0aCBvZiBEQ0RfUkVHS0VZICsKKwkgKiAgIl9cMCIgKyBsZW5ndGggb2Ygc3pfb2JqX3R5cGUgc3RyaW5nICsgdGVybWluYXRpbmcgTlVMTCAqLworCWR3X2tleV9sZW4gPSBzdHJsZW4oRENEX1JFR0tFWSkgKyAxICsgc2l6ZW9mKHN6X29ial90eXBlKSArIDE7CisJREJDX0FTU0VSVChkd19rZXlfbGVuIDwgRENEX01BWFBBVEhMRU5HVEgpOworCisJLyogQ3JlYXRlIHByb3BlciBSRUcga2V5OyBjb25jYXRlbmF0ZSBEQ0RfUkVHS0VZIHdpdGggb2JqX3R5cGUuICovCisJc3RybmNweShzel9yZWdfa2V5LCBEQ0RfUkVHS0VZLCBzdHJsZW4oRENEX1JFR0tFWSkgKyAxKTsKKworCWlmICgoc3RybGVuKHN6X3JlZ19rZXkpICsgc3RybGVuKCJfXDAiKSkgPCBEQ0RfTUFYUEFUSExFTkdUSCkKKwkJc3RybmNhdChzel9yZWdfa2V5LCAiX1wwIiwgMik7CisJZWxzZQorCQlzdGF0dXMgPSAtRVBFUk07CisKKwlzdGF0dXMgPSBzbnByaW50Zihzel9vYmpfdHlwZSwgTUFYX0lOVDJDSEFSX0xFTkdUSCwgIiVkIiwgb2JqX3R5cGUpOworCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IDA7CisKKwkJaWYgKChzdHJsZW4oc3pfcmVnX2tleSkgKyBzdHJsZW4oc3pfb2JqX3R5cGUpKSA8CisJCSAgICBEQ0RfTUFYUEFUSExFTkdUSCkgeworCQkJc3RybmNhdChzel9yZWdfa2V5LCBzel9vYmpfdHlwZSwKKwkJCQlzdHJsZW4oc3pfb2JqX3R5cGUpICsgMSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQkvKiBDcmVhdGUgVVVJRCB2YWx1ZSB0byBzZXQgaW4gcmVnaXN0cnkuICovCisJCXV1aWRfdXVpZF90b19zdHJpbmcob2JqX3V1aWQsIHN6X3V1aWQsIE1BWFVVSURMRU4pOworCisJCWlmICgoc3RybGVuKHN6X3JlZ19rZXkpICsgTUFYVVVJRExFTikgPCBEQ0RfTUFYUEFUSExFTkdUSCkKKwkJCXN0cm5jYXQoc3pfcmVnX2tleSwgc3pfdXVpZCwgTUFYVVVJRExFTik7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKworCQkvKiBSZXRyaWV2ZSBwYXRocyBmcm9tIHRoZSByZWdpc3RyeSBiYXNlZCBvbiBzdHJ1Y3QgZHNwX3V1aWQgKi8KKwkJZHdfYnVmX3NpemUgPSBEQ0RfTUFYUEFUSExFTkdUSDsKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJc3Bpbl9sb2NrKCZkYmRjZF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2Rfa2V5LCAmcmVnX2tleV9saXN0LCBsaW5rKSB7CisJCQlpZiAoIXN0cm5jbXAoZGNkX2tleS0+bmFtZSwgc3pfcmVnX2tleSwKKwkJCQkJCXN0cmxlbihzel9yZWdfa2V5KSArIDEpKQorCQkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrKCZkYmRjZF9sb2NrKTsKKwkJaWYgKCZkY2Rfa2V5LT5saW5rID09ICZyZWdfa2V5X2xpc3QpIHsKKwkJCXN0YXR1cyA9IC1FTk9LRVk7CisJCQlnb3RvIGZ1bmNfZW5kOworCQl9CisJfQorCisKKwkvKiBPcGVuIENPRkYgZmlsZS4gKi8KKwlzdGF0dXMgPSBjb2Rfb3BlbihkY2RfbWdyX29iai0+Y29kX21nciwgZGNkX2tleS0+cGF0aCwKKwkJCQkJCQlDT0RfTk9MT0FELCAmbGliKTsKKwlpZiAoc3RhdHVzKSB7CisJCXN0YXR1cyA9IC1FQUNDRVM7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJLyogRW5zdXJlIHN6X3V1aWQgKyAxIGlzIG5vdCBncmVhdGVyIHRoYW4gc2l6ZW9mIHN6X3NlY3RfbmFtZS4gKi8KKwlEQkNfQVNTRVJUKChzdHJsZW4oc3pfdXVpZCkgKyAxKSA8IHNpemVvZihzel9zZWN0X25hbWUpKTsKKworCS8qIENyZWF0ZSBzZWN0aW9uIG5hbWUgYmFzZWQgb24gbm9kZSBVVUlELiBBIHBlcmlvZCBpcworCSAqIHByZS1wZW5kZWQgdG8gdGhlIFVVSUQgc3RyaW5nIHRvIGZvcm0gdGhlIHNlY3Rpb24gbmFtZS4KKwkgKiBJLmUuICIuMjRCQzhEOTBfQkI0NV8xMWQ0X0I3NTZfMDA2MDA4QkRCNjZGIiAqLworCXN0cm5jcHkoc3pfc2VjdF9uYW1lLCAiLiIsIDIpOworCXN0cm5jYXQoc3pfc2VjdF9uYW1lLCBzel91dWlkLCBzdHJsZW4oc3pfdXVpZCkpOworCisJLyogR2V0IHNlY3Rpb24gaW5mb3JtYXRpb24uICovCisJc3RhdHVzID0gY29kX2dldF9zZWN0aW9uKGxpYiwgc3pfc2VjdF9uYW1lLCAmdWxfYWRkciwgJnVsX2xlbik7CisJaWYgKHN0YXR1cykgeworCQlzdGF0dXMgPSAtRUFDQ0VTOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCS8qIEFsbG9jYXRlIHplcm9lZCBidWZmZXIuICovCisJcHN6X2NvZmZfYnVmID0ga3phbGxvYyh1bF9sZW4gKyA0LCBHRlBfS0VSTkVMKTsKKyNpZmRlZiBfREJfVElPTUFQCisJaWYgKHN0cnN0cihkY2Rfa2V5LT5wYXRoLCAiaXZhIikgPT0gTlVMTCkgeworCQkvKiBMb2NhdGUgc2VjdGlvbiBieSBvYmplY3RJRCBhbmQgcmVhZCBpdHMgY29udGVudC4gKi8KKwkJc3RhdHVzID0KKwkJICAgIGNvZF9yZWFkX3NlY3Rpb24obGliLCBzel9zZWN0X25hbWUsIHBzel9jb2ZmX2J1ZiwgdWxfbGVuKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPQorCQkgICAgY29kX3JlYWRfc2VjdGlvbihsaWIsIHN6X3NlY3RfbmFtZSwgcHN6X2NvZmZfYnVmLCB1bF9sZW4pOworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBTa2lwcGVkIEJ5dGUgc3dhcCBmb3IgSVZBISFcbiIsIF9fZnVuY19fKTsKKwl9CisjZWxzZQorCXN0YXR1cyA9IGNvZF9yZWFkX3NlY3Rpb24obGliLCBzel9zZWN0X25hbWUsIHBzel9jb2ZmX2J1ZiwgdWxfbGVuKTsKKyNlbmRpZgorCWlmICghc3RhdHVzKSB7CisJCS8qIENvbXByZXMgRFNQIGJ1ZmZlciB0byBjb25mb3JtIHRvIFBDIGZvcm1hdC4gKi8KKwkJaWYgKHN0cnN0cihkY2Rfa2V5LT5wYXRoLCAiaXZhIikgPT0gTlVMTCkgeworCQkJY29tcHJlc3NfYnVmKHBzel9jb2ZmX2J1ZiwgdWxfbGVuLCBEU1BXT1JEU0laRSk7CisJCX0gZWxzZSB7CisJCQljb21wcmVzc19idWYocHN6X2NvZmZfYnVmLCB1bF9sZW4sIDEpOworCQkJZGV2X2RiZyhicmlkZ2UsICIlczogQ29tcHJlc3NpbmcgSVZBIENPRkYgYnVmZmVyIGJ5IDEgIgorCQkJCSJmb3IgSVZBISFcbiIsIF9fZnVuY19fKTsKKwkJfQorCisJCS8qIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBDT0ZGIGJ1ZmZlci4gKi8KKwkJc3RhdHVzID0KKwkJICAgIGdldF9hdHRyc19mcm9tX2J1Zihwc3pfY29mZl9idWYsIHVsX2xlbiwgb2JqX3R5cGUsIG9ial9kZWYpOworCQlpZiAoc3RhdHVzKQorCQkJc3RhdHVzID0gLUVBQ0NFUzsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUFDQ0VTOworCX0KKworCS8qIEZyZWUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGR5bmFtaWMgYnVmZmVyLiAqLworCWtmcmVlKHBzel9jb2ZmX2J1Zik7CitmdW5jX2VuZDoKKwlpZiAobGliKQorCQljb2RfY2xvc2UobGliKTsKKworCWtmcmVlKHN6X3V1aWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkY2RfZ2V0X29iamVjdHMgPT09PT09PT0KKyAqLworaW50IGRjZF9nZXRfb2JqZWN0cyhzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfbWdyLAorCQkJICAgY2hhciAqc3pfY29mZl9wYXRoLCBkY2RfcmVnaXN0ZXJmeG4gcmVnaXN0ZXJfZnhuLAorCQkJICAgdm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBkY2RfbWFuYWdlciAqZGNkX21ncl9vYmogPSBoZGNkX21ncjsKKwlpbnQgc3RhdHVzID0gMDsKKwljaGFyICpwc3pfY29mZl9idWY7CisJY2hhciAqcHN6X2N1cjsKKwlzdHJ1Y3QgY29kX2xpYnJhcnlvYmogKmxpYiA9IE5VTEw7CisJdTMyIHVsX2FkZHIgPSAwOwkvKiBVc2VkIGJ5IGNvZF9nZXRfc2VjdGlvbiAqLworCXUzMiB1bF9sZW4gPSAwOwkJLyogVXNlZCBieSBjb2RfZ2V0X3NlY3Rpb24gKi8KKwljaGFyIHNlcHNbXSA9ICI6LCAiOworCWNoYXIgKnRva2VuID0gTlVMTDsKKwlzdHJ1Y3QgZHNwX3V1aWQgZHNwX3V1aWRfb2JqOworCXMzMiBvYmplY3RfdHlwZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlpZiAoIWhkY2RfbWdyKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJLyogT3BlbiBEU1AgY29mZiBmaWxlLCBkb24ndCBsb2FkIHN5bWJvbHMuICovCisJc3RhdHVzID0gY29kX29wZW4oZGNkX21ncl9vYmotPmNvZF9tZ3IsIHN6X2NvZmZfcGF0aCwgQ09EX05PTE9BRCwgJmxpYik7CisJaWYgKHN0YXR1cykgeworCQlzdGF0dXMgPSAtRUFDQ0VTOworCQlnb3RvIGZ1bmNfY29udDsKKwl9CisKKwkvKiBHZXQgRENEX1JFU0lHRVJfU0VDVElPTiBzZWN0aW9uIGluZm9ybWF0aW9uLiAqLworCXN0YXR1cyA9IGNvZF9nZXRfc2VjdGlvbihsaWIsIERDRF9SRUdJU1RFUl9TRUNUSU9OLCAmdWxfYWRkciwgJnVsX2xlbik7CisJaWYgKHN0YXR1cyB8fCAhKHVsX2xlbiA+IDApKSB7CisJCXN0YXR1cyA9IC1FQUNDRVM7CisJCWdvdG8gZnVuY19jb250OworCX0KKworCS8qIEFsbG9jYXRlIHplcm9lZCBidWZmZXIuICovCisJcHN6X2NvZmZfYnVmID0ga3phbGxvYyh1bF9sZW4gKyA0LCBHRlBfS0VSTkVMKTsKKyNpZmRlZiBfREJfVElPTUFQCisJaWYgKHN0cnN0cihzel9jb2ZmX3BhdGgsICJpdmEiKSA9PSBOVUxMKSB7CisJCS8qIExvY2F0ZSBzZWN0aW9uIGJ5IG9iamVjdElEIGFuZCByZWFkIGl0cyBjb250ZW50LiAqLworCQlzdGF0dXMgPSBjb2RfcmVhZF9zZWN0aW9uKGxpYiwgRENEX1JFR0lTVEVSX1NFQ1RJT04sCisJCQkJCSAgcHN6X2NvZmZfYnVmLCB1bF9sZW4pOworCX0gZWxzZSB7CisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IFNraXBwZWQgQnl0ZSBzd2FwIGZvciBJVkEhIVxuIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSBjb2RfcmVhZF9zZWN0aW9uKGxpYiwgRENEX1JFR0lTVEVSX1NFQ1RJT04sCisJCQkJCSAgcHN6X2NvZmZfYnVmLCB1bF9sZW4pOworCX0KKyNlbHNlCisJc3RhdHVzID0KKwkgICAgY29kX3JlYWRfc2VjdGlvbihsaWIsIERDRF9SRUdJU1RFUl9TRUNUSU9OLCBwc3pfY29mZl9idWYsIHVsX2xlbik7CisjZW5kaWYKKwlpZiAoIXN0YXR1cykgeworCQkvKiBDb21wcmVzcyBEU1AgYnVmZmVyIHRvIGNvbmZvcm0gdG8gUEMgZm9ybWF0LiAqLworCQlpZiAoc3Ryc3RyKHN6X2NvZmZfcGF0aCwgIml2YSIpID09IE5VTEwpIHsKKwkJCWNvbXByZXNzX2J1Zihwc3pfY29mZl9idWYsIHVsX2xlbiwgRFNQV09SRFNJWkUpOworCQl9IGVsc2UgeworCQkJY29tcHJlc3NfYnVmKHBzel9jb2ZmX2J1ZiwgdWxfbGVuLCAxKTsKKwkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IENvbXByZXNzIENPRkYgYnVmZmVyIHdpdGggMSB3b3JkICIKKwkJCQkiZm9yIElWQSEhXG4iLCBfX2Z1bmNfXyk7CisJCX0KKworCQkvKiBSZWFkIGZyb20gYnVmZmVyIGFuZCByZWdpc3RlciBvYmplY3QgaW4gYnVmZmVyLiAqLworCQlwc3pfY3VyID0gcHN6X2NvZmZfYnVmOworCQl3aGlsZSAoKHRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKSkgJiYgKnRva2VuICE9ICdcMCcpIHsKKwkJCS8qICBSZXRyaWV2ZSBVVUlEIHN0cmluZy4gKi8KKwkJCXV1aWRfdXVpZF9mcm9tX3N0cmluZyh0b2tlbiwgJmRzcF91dWlkX29iaik7CisKKwkJCS8qICBSZXRyaWV2ZSBvYmplY3QgdHlwZSAqLworCQkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCQkvKiAgUmV0cmlldmUgb2JqZWN0IHR5cGUgKi8KKwkJCW9iamVjdF90eXBlID0gYXRvaSh0b2tlbik7CisKKwkJCS8qCisJCQkgKiAgQXBwbHkgcmVnaXN0ZXJfZnhuIHRvIHRoZSBmb3VuZCBEQ0Qgb2JqZWN0LgorCQkJICogIFBvc3NpYmxlIGFjdGlvbnMgaW5jbHVkZToKKwkJCSAqCisJCQkgKiAgMSkgUmVnaXN0ZXIgZm91bmQgRENEIG9iamVjdC4KKwkJCSAqICAyKSBVbnJlZ2lzdGVyIGZvdW5kIERDRCBvYmplY3QgKHdoZW4gaGFuZGxlID09IE5VTEwpCisJCQkgKiAgMykgQWRkIG92ZXJsYXkgbm9kZS4KKwkJCSAqLworCQkJc3RhdHVzID0KKwkJCSAgICByZWdpc3Rlcl9meG4oJmRzcF91dWlkX29iaiwgb2JqZWN0X3R5cGUsIGhhbmRsZSk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJLyogaWYgZXJyb3Igb2NjdXJzLCBicmVhayBmcm9tIHdoaWxlIGxvb3AuICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUFDQ0VTOworCX0KKworCS8qIEZyZWUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGR5bmFtaWMgYnVmZmVyLiAqLworCWtmcmVlKHBzel9jb2ZmX2J1Zik7CitmdW5jX2NvbnQ6CisJaWYgKGxpYikKKwkJY29kX2Nsb3NlKGxpYik7CisKK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2dldF9saWJyYXJ5X25hbWUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZXMgdGhlIGxpYnJhcnkgbmFtZSBmb3IgdGhlIGdpdmVuIFVVSUQuCisgKgorICovCitpbnQgZGNkX2dldF9saWJyYXJ5X25hbWUoc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21nciwKKwkJCQlzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJCWNoYXIgKnN0cl9saWJfbmFtZSwKKwkJCQl1MzIgKmJ1ZmZfc2l6ZSwKKwkJCQllbnVtIG5sZHJfcGhhc2UgcGhhc2UsIGJvb2wgKnBoYXNlX3NwbGl0KQoreworCWNoYXIgc3pfcmVnX2tleVtEQ0RfTUFYUEFUSExFTkdUSF07CisJY2hhciBzel91dWlkW01BWFVVSURMRU5dOworCXUzMiBkd19rZXlfbGVuOwkJLyogTGVuIG9mIFJFRyBrZXkuICovCisJY2hhciBzel9vYmpfdHlwZVtNQVhfSU5UMkNIQVJfTEVOR1RIXTsJLyogc3RyLiByZXAuIG9mIG9ial90eXBlLiAqLworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkY2Rfa2V5X2VsZW0gKmRjZF9rZXkgPSBOVUxMOworCisJREJDX1JFUVVJUkUodXVpZF9vYmogIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoc3RyX2xpYl9uYW1lICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGJ1ZmZfc2l6ZSAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShoZGNkX21ncik7CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBoZGNkX21nciAlcCwgdXVpZF9vYmogJXAsIHN0cl9saWJfbmFtZSAlcCwiCisJCSIgYnVmZl9zaXplICVwXG4iLCBfX2Z1bmNfXywgaGRjZF9tZ3IsIHV1aWRfb2JqLCBzdHJfbGliX25hbWUsCisJCWJ1ZmZfc2l6ZSk7CisKKwkvKgorCSAqICBQcmUtZGV0ZXJtaW5lIGZpbmFsIGtleSBsZW5ndGguIEl0J3MgbGVuZ3RoIG9mIERDRF9SRUdLRVkgKworCSAqICAiX1wwIiArIGxlbmd0aCBvZiBzel9vYmpfdHlwZSBzdHJpbmcgKyB0ZXJtaW5hdGluZyBOVUxMLgorCSAqLworCWR3X2tleV9sZW4gPSBzdHJsZW4oRENEX1JFR0tFWSkgKyAxICsgc2l6ZW9mKHN6X29ial90eXBlKSArIDE7CisJREJDX0FTU0VSVChkd19rZXlfbGVuIDwgRENEX01BWFBBVEhMRU5HVEgpOworCisJLyogQ3JlYXRlIHByb3BlciBSRUcga2V5OyBjb25jYXRlbmF0ZSBEQ0RfUkVHS0VZIHdpdGggb2JqX3R5cGUuICovCisJc3RybmNweShzel9yZWdfa2V5LCBEQ0RfUkVHS0VZLCBzdHJsZW4oRENEX1JFR0tFWSkgKyAxKTsKKwlpZiAoKHN0cmxlbihzel9yZWdfa2V5KSArIHN0cmxlbigiX1wwIikpIDwgRENEX01BWFBBVEhMRU5HVEgpCisJCXN0cm5jYXQoc3pfcmVnX2tleSwgIl9cMCIsIDIpOworCWVsc2UKKwkJc3RhdHVzID0gLUVQRVJNOworCisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgTkxEUl9DUkVBVEU6CisJCS8qIGNyZWF0ZSBwaGFzZSB0eXBlICovCisJCXNwcmludGYoc3pfb2JqX3R5cGUsICIlZCIsIERTUF9EQ0RDUkVBVEVMSUJUWVBFKTsKKwkJYnJlYWs7CisJY2FzZSBOTERSX0VYRUNVVEU6CisJCS8qIGV4ZWN1dGUgcGhhc2UgdHlwZSAqLworCQlzcHJpbnRmKHN6X29ial90eXBlLCAiJWQiLCBEU1BfRENERVhFQ1VURUxJQlRZUEUpOworCQlicmVhazsKKwljYXNlIE5MRFJfREVMRVRFOgorCQkvKiBkZWxldGUgcGhhc2UgdHlwZSAqLworCQlzcHJpbnRmKHN6X29ial90eXBlLCAiJWQiLCBEU1BfRENEREVMRVRFTElCVFlQRSk7CisJCWJyZWFrOworCWNhc2UgTkxEUl9OT1BIQVNFOgorCQkvKiBrbm93biB0byBiZSBhIGRlcGVuZGVudCBsaWJyYXJ5ICovCisJCXNwcmludGYoc3pfb2JqX3R5cGUsICIlZCIsIERTUF9EQ0RMSUJSQVJZVFlQRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCURCQ19BU1NFUlQoZmFsc2UpOworCX0KKwlpZiAoIXN0YXR1cykgeworCQlpZiAoKHN0cmxlbihzel9yZWdfa2V5KSArIHN0cmxlbihzel9vYmpfdHlwZSkpIDwKKwkJICAgIERDRF9NQVhQQVRITEVOR1RIKSB7CisJCQlzdHJuY2F0KHN6X3JlZ19rZXksIHN6X29ial90eXBlLAorCQkJCXN0cmxlbihzel9vYmpfdHlwZSkgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCQkvKiBDcmVhdGUgVVVJRCB2YWx1ZSB0byBmaW5kIG1hdGNoIGluIHJlZ2lzdHJ5LiAqLworCQl1dWlkX3V1aWRfdG9fc3RyaW5nKHV1aWRfb2JqLCBzel91dWlkLCBNQVhVVUlETEVOKTsKKwkJaWYgKChzdHJsZW4oc3pfcmVnX2tleSkgKyBNQVhVVUlETEVOKSA8IERDRF9NQVhQQVRITEVOR1RIKQorCQkJc3RybmNhdChzel9yZWdfa2V5LCBzel91dWlkLCBNQVhVVUlETEVOKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gLUVQRVJNOworCX0KKwlpZiAoIXN0YXR1cykgeworCQlzcGluX2xvY2soJmRiZGNkX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjZF9rZXksICZyZWdfa2V5X2xpc3QsIGxpbmspIHsKKwkJCS8qICBTZWUgaWYgdGhlIG5hbWUgbWF0Y2hlcy4gKi8KKwkJCWlmICghc3RybmNtcChkY2Rfa2V5LT5uYW1lLCBzel9yZWdfa2V5LAorCQkJCQkJc3RybGVuKHN6X3JlZ19rZXkpICsgMSkpCisJCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRiZGNkX2xvY2spOworCX0KKworCWlmICgmZGNkX2tleS0+bGluayA9PSAmcmVnX2tleV9saXN0KQorCQlzdGF0dXMgPSAtRU5PS0VZOworCisJLyogSWYgY2FuJ3QgZmluZCwgcGhhc2VzIG1pZ2h0IGJlIHJlZ2lzdGVyZWQgYXMgZ2VuZXJpYyBMSUJSQVJZVFlQRSAqLworCWlmIChzdGF0dXMgJiYgcGhhc2UgIT0gTkxEUl9OT1BIQVNFKSB7CisJCWlmIChwaGFzZV9zcGxpdCkKKwkJCSpwaGFzZV9zcGxpdCA9IGZhbHNlOworCisJCXN0cm5jcHkoc3pfcmVnX2tleSwgRENEX1JFR0tFWSwgc3RybGVuKERDRF9SRUdLRVkpICsgMSk7CisJCWlmICgoc3RybGVuKHN6X3JlZ19rZXkpICsgc3RybGVuKCJfXDAiKSkgPAorCQkgICAgRENEX01BWFBBVEhMRU5HVEgpIHsKKwkJCXN0cm5jYXQoc3pfcmVnX2tleSwgIl9cMCIsIDIpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisJCXNwcmludGYoc3pfb2JqX3R5cGUsICIlZCIsIERTUF9EQ0RMSUJSQVJZVFlQRSk7CisJCWlmICgoc3RybGVuKHN6X3JlZ19rZXkpICsgc3RybGVuKHN6X29ial90eXBlKSkKKwkJICAgIDwgRENEX01BWFBBVEhMRU5HVEgpIHsKKwkJCXN0cm5jYXQoc3pfcmVnX2tleSwgc3pfb2JqX3R5cGUsCisJCQkJc3RybGVuKHN6X29ial90eXBlKSArIDEpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisJCXV1aWRfdXVpZF90b19zdHJpbmcodXVpZF9vYmosIHN6X3V1aWQsIE1BWFVVSURMRU4pOworCQlpZiAoKHN0cmxlbihzel9yZWdfa2V5KSArIE1BWFVVSURMRU4pIDwgRENEX01BWFBBVEhMRU5HVEgpCisJCQlzdHJuY2F0KHN6X3JlZ19rZXksIHN6X3V1aWQsIE1BWFVVSURMRU4pOworCQllbHNlCisJCQlzdGF0dXMgPSAtRVBFUk07CisKKwkJc3Bpbl9sb2NrKCZkYmRjZF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2Rfa2V5LCAmcmVnX2tleV9saXN0LCBsaW5rKSB7CisJCQkvKiAgU2VlIGlmIHRoZSBuYW1lIG1hdGNoZXMuICovCisJCQlpZiAoIXN0cm5jbXAoZGNkX2tleS0+bmFtZSwgc3pfcmVnX2tleSwKKwkJCQkJCXN0cmxlbihzel9yZWdfa2V5KSArIDEpKQorCQkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrKCZkYmRjZF9sb2NrKTsKKworCQlzdGF0dXMgPSAoJmRjZF9rZXktPmxpbmsgIT0gJnJlZ19rZXlfbGlzdCkgPworCQkJCQkJMCA6IC1FTk9LRVk7CisJfQorCisJaWYgKCFzdGF0dXMpCisJCW1lbWNweShzdHJfbGliX25hbWUsIGRjZF9rZXktPnBhdGgsIHN0cmxlbihkY2Rfa2V5LT5wYXRoKSArIDEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGNkX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIHRoZSBEQ0QgbW9kdWxlLgorICovCitib29sIGRjZF9pbml0KHZvaWQpCit7CisJYm9vbCBpbml0X2NvZDsKKwlib29sIHJldCA9IHRydWU7CisKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCisJaWYgKHJlZnMgPT0gMCkgeworCQkvKiBJbml0aWFsaXplIHJlcXVpcmVkIG1vZHVsZXMuICovCisJCWluaXRfY29kID0gY29kX2luaXQoKTsKKworCQlpZiAoIWluaXRfY29kKSB7CisJCQlyZXQgPSBmYWxzZTsKKwkJCS8qIEV4aXQgaW5pdGlhbGl6ZWQgbW9kdWxlcy4gKi8KKwkJCWlmIChpbml0X2NvZCkKKwkJCQljb2RfZXhpdCgpOworCQl9CisKKwkJSU5JVF9MSVNUX0hFQUQoJnJlZ19rZXlfbGlzdCk7CisJfQorCisJaWYgKHJldCkKKwkJcmVmcysrOworCisJREJDX0VOU1VSRSgocmV0ICYmIChyZWZzID4gMCkpIHx8ICghcmV0ICYmIChyZWZzID09IDApKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IGRjZF9yZWdpc3Rlcl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZWdpc3RlcnMgYSBub2RlIG9yIGEgcHJvY2Vzc29yIHdpdGggdGhlIERDRC4KKyAqICAgICAgSWYgcHN6X3BhdGhfbmFtZSA9PSBOVUxMLCB1bnJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgRENEIG9iamVjdC4KKyAqLworaW50IGRjZF9yZWdpc3Rlcl9vYmplY3Qoc3RydWN0IGRzcF91dWlkICp1dWlkX29iaiwKKwkJCSAgICAgICBlbnVtIGRzcF9kY2RvYmp0eXBlIG9ial90eXBlLAorCQkJICAgICAgIGNoYXIgKnBzel9wYXRoX25hbWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJY2hhciBzel9yZWdfa2V5W0RDRF9NQVhQQVRITEVOR1RIXTsKKwljaGFyIHN6X3V1aWRbTUFYVVVJRExFTiArIDFdOworCXUzMiBkd19wYXRoX3NpemUgPSAwOworCXUzMiBkd19rZXlfbGVuOwkJLyogTGVuIG9mIFJFRyBrZXkuICovCisJY2hhciBzel9vYmpfdHlwZVtNQVhfSU5UMkNIQVJfTEVOR1RIXTsJLyogc3RyLiByZXAuIG9mIG9ial90eXBlLiAqLworCXN0cnVjdCBkY2Rfa2V5X2VsZW0gKmRjZF9rZXkgPSBOVUxMOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHV1aWRfb2JqICE9IE5VTEwpOworCURCQ19SRVFVSVJFKChvYmpfdHlwZSA9PSBEU1BfRENETk9ERVRZUEUpIHx8CisJCSAgICAob2JqX3R5cGUgPT0gRFNQX0RDRFBST0NFU1NPUlRZUEUpIHx8CisJCSAgICAob2JqX3R5cGUgPT0gRFNQX0RDRExJQlJBUllUWVBFKSB8fAorCQkgICAgKG9ial90eXBlID09IERTUF9EQ0RDUkVBVEVMSUJUWVBFKSB8fAorCQkgICAgKG9ial90eXBlID09IERTUF9EQ0RFWEVDVVRFTElCVFlQRSkgfHwKKwkJICAgIChvYmpfdHlwZSA9PSBEU1BfRENEREVMRVRFTElCVFlQRSkpOworCisJZGV2X2RiZyhicmlkZ2UsICIlczogb2JqZWN0IFVVSUQgJXAsIG9ial90eXBlICVkLCBzelBhdGhOYW1lICVzXG4iLAorCQlfX2Z1bmNfXywgdXVpZF9vYmosIG9ial90eXBlLCBwc3pfcGF0aF9uYW1lKTsKKworCS8qCisJICogUHJlLWRldGVybWluZSBmaW5hbCBrZXkgbGVuZ3RoLiBJdCdzIGxlbmd0aCBvZiBEQ0RfUkVHS0VZICsKKwkgKiAgIl9cMCIgKyBsZW5ndGggb2Ygc3pfb2JqX3R5cGUgc3RyaW5nICsgdGVybWluYXRpbmcgTlVMTC4KKwkgKi8KKwlkd19rZXlfbGVuID0gc3RybGVuKERDRF9SRUdLRVkpICsgMSArIHNpemVvZihzel9vYmpfdHlwZSkgKyAxOworCURCQ19BU1NFUlQoZHdfa2V5X2xlbiA8IERDRF9NQVhQQVRITEVOR1RIKTsKKworCS8qIENyZWF0ZSBwcm9wZXIgUkVHIGtleTsgY29uY2F0ZW5hdGUgRENEX1JFR0tFWSB3aXRoIG9ial90eXBlLiAqLworCXN0cm5jcHkoc3pfcmVnX2tleSwgRENEX1JFR0tFWSwgc3RybGVuKERDRF9SRUdLRVkpICsgMSk7CisJaWYgKChzdHJsZW4oc3pfcmVnX2tleSkgKyBzdHJsZW4oIl9cMCIpKSA8IERDRF9NQVhQQVRITEVOR1RIKQorCQlzdHJuY2F0KHN6X3JlZ19rZXksICJfXDAiLCAyKTsKKwllbHNlIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCXN0YXR1cyA9IHNucHJpbnRmKHN6X29ial90eXBlLCBNQVhfSU5UMkNIQVJfTEVOR1RILCAiJWQiLCBvYmpfdHlwZSk7CisJaWYgKHN0YXR1cyA9PSAtMSkgeworCQlzdGF0dXMgPSAtRVBFUk07CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gMDsKKwkJaWYgKChzdHJsZW4oc3pfcmVnX2tleSkgKyBzdHJsZW4oc3pfb2JqX3R5cGUpKSA8CisJCSAgICBEQ0RfTUFYUEFUSExFTkdUSCkgeworCQkJc3RybmNhdChzel9yZWdfa2V5LCBzel9vYmpfdHlwZSwKKwkJCQlzdHJsZW4oc3pfb2JqX3R5cGUpICsgMSk7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gLUVQRVJNOworCisJCS8qIENyZWF0ZSBVVUlEIHZhbHVlIHRvIHNldCBpbiByZWdpc3RyeS4gKi8KKwkJdXVpZF91dWlkX3RvX3N0cmluZyh1dWlkX29iaiwgc3pfdXVpZCwgTUFYVVVJRExFTik7CisJCWlmICgoc3RybGVuKHN6X3JlZ19rZXkpICsgTUFYVVVJRExFTikgPCBEQ0RfTUFYUEFUSExFTkdUSCkKKwkJCXN0cm5jYXQoc3pfcmVnX2tleSwgc3pfdXVpZCwgTUFYVVVJRExFTik7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyoKKwkgKiBJZiBwc3pfcGF0aF9uYW1lICE9IE5VTEwsIHBlcmZvcm0gcmVnaXN0cmF0aW9uLCBvdGhlcndpc2UsCisJICogcGVyZm9ybSB1bnJlZ2lzdHJhdGlvbi4KKwkgKi8KKworCWlmIChwc3pfcGF0aF9uYW1lKSB7CisJCWR3X3BhdGhfc2l6ZSA9IHN0cmxlbihwc3pfcGF0aF9uYW1lKSArIDE7CisJCXNwaW5fbG9jaygmZGJkY2RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGNkX2tleSwgJnJlZ19rZXlfbGlzdCwgbGluaykgeworCQkJLyogIFNlZSBpZiB0aGUgbmFtZSBtYXRjaGVzLiAqLworCQkJaWYgKCFzdHJuY21wKGRjZF9rZXktPm5hbWUsIHN6X3JlZ19rZXksCisJCQkJCQlzdHJsZW4oc3pfcmVnX2tleSkgKyAxKSkKKwkJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9jaygmZGJkY2RfbG9jayk7CisJCWlmICgmZGNkX2tleS0+bGluayA9PSAmcmVnX2tleV9saXN0KSB7CisJCQkvKgorCQkJICogQWRkIG5ldyByZWcgdmFsdWUgKFVVSUQrb2JqX3R5cGUpCisJCQkgKiB3aXRoIENPRkYgcGF0aCBpbmZvCisJCQkgKi8KKworCQkJZGNkX2tleSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkY2Rfa2V5X2VsZW0pLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghZGNkX2tleSkgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJZ290byBmdW5jX2VuZDsKKwkJCX0KKworCQkJZGNkX2tleS0+cGF0aCA9IGttYWxsb2Moc3RybGVuKHN6X3JlZ19rZXkpICsgMSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJCWlmICghZGNkX2tleS0+cGF0aCkgeworCQkJCWtmcmVlKGRjZF9rZXkpOworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJZ290byBmdW5jX2VuZDsKKwkJCX0KKworCQkJc3RybmNweShkY2Rfa2V5LT5uYW1lLCBzel9yZWdfa2V5LAorCQkJCQkJc3RybGVuKHN6X3JlZ19rZXkpICsgMSk7CisJCQlzdHJuY3B5KGRjZF9rZXktPnBhdGgsIHBzel9wYXRoX25hbWUgLAorCQkJCQkJZHdfcGF0aF9zaXplKTsKKwkJCXNwaW5fbG9jaygmZGJkY2RfbG9jayk7CisJCQlsaXN0X2FkZF90YWlsKCZkY2Rfa2V5LT5saW5rLCAmcmVnX2tleV9saXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZkYmRjZF9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCS8qICBNYWtlIHN1cmUgdGhlIG5ldyBkYXRhIGlzIHRoZSBzYW1lLiAqLworCQkJaWYgKHN0cm5jbXAoZGNkX2tleS0+cGF0aCwgcHN6X3BhdGhfbmFtZSwKKwkJCQkJCQlkd19wYXRoX3NpemUpKSB7CisJCQkJLyogIFRoZSBjYWxsZXIgbmVlZHMgYSBkaWZmZXJlbnQgZGF0YSBzaXplISAqLworCQkJCWtmcmVlKGRjZF9rZXktPnBhdGgpOworCQkJCWRjZF9rZXktPnBhdGggPSBrbWFsbG9jKGR3X3BhdGhfc2l6ZSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGRjZF9rZXktPnBhdGggPT0gTlVMTCkgeworCQkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCQlnb3RvIGZ1bmNfZW5kOworCQkJCX0KKwkJCX0KKworCQkJLyogIFdlIGhhdmUgYSBtYXRjaCEgIENvcHkgb3V0IHRoZSBkYXRhLiAqLworCQkJbWVtY3B5KGRjZF9rZXktPnBhdGgsIHBzel9wYXRoX25hbWUsIGR3X3BhdGhfc2l6ZSk7CisJCX0KKwkJZGV2X2RiZyhicmlkZ2UsICIlczogcHN6X3BhdGhfbmFtZT0lcywgZHdfcGF0aF9zaXplPSVkXG4iLAorCQkJX19mdW5jX18sIHBzel9wYXRoX25hbWUsIGR3X3BhdGhfc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogRGVyZWdpc3RlciBhbiBleGlzdGluZyBvYmplY3QgKi8KKwkJc3Bpbl9sb2NrKCZkYmRjZF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2Rfa2V5LCAmcmVnX2tleV9saXN0LCBsaW5rKSB7CisJCQlpZiAoIXN0cm5jbXAoZGNkX2tleS0+bmFtZSwgc3pfcmVnX2tleSwKKwkJCQkJCXN0cmxlbihzel9yZWdfa2V5KSArIDEpKSB7CisJCQkJbGlzdF9kZWwoJmRjZF9rZXktPmxpbmspOworCQkJCWtmcmVlKGRjZF9rZXktPnBhdGgpOworCQkJCWtmcmVlKGRjZF9rZXkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZkYmRjZF9sb2NrKTsKKwkJaWYgKCZkY2Rfa2V5LT5saW5rID09ICZyZWdfa2V5X2xpc3QpCisJCQlzdGF0dXMgPSAtRVBFUk07CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJLyoKKwkJICogIEJlY2F1c2UgdGhlIG5vZGUgZGF0YWJhc2UgaGFzIGJlZW4gdXBkYXRlZCB0aHJvdWdoIGEKKwkJICogIHN1Y2Nlc3NmdWwgb2JqZWN0IHJlZ2lzdHJhdGlvbi9kZS1yZWdpc3RyYXRpb24gb3BlcmF0aW9uLAorCQkgKiAgd2UgbmVlZCB0byByZXNldCB0aGUgb2JqZWN0IGVudW1lcmF0aW9uIGNvdW50ZXIgdG8gYWxsb3cKKwkJICogIGN1cnJlbnQgZW51bWVyYXRpb25zIHRvIHJlZmxlY3QgdGhpcyB1cGRhdGUgaW4gdGhlIG5vZGUKKwkJICogIGRhdGFiYXNlLgorCQkgKi8KKwkJZW51bV9yZWZzID0gMDsKKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRjZF91bnJlZ2lzdGVyX29iamVjdCA9PT09PT09PQorICogIENhbGwgRENEX1JlZ2lzdGVyIG9iamVjdCB3aXRoIHBzel9wYXRoX25hbWUgc2V0IHRvIE5VTEwgdG8KKyAqICBwZXJmb3JtIGFjdHVhbCBvYmplY3QgZGUtcmVnaXN0cmF0aW9uLgorICovCitpbnQgZGNkX3VucmVnaXN0ZXJfb2JqZWN0KHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJIGVudW0gZHNwX2RjZG9ianR5cGUgb2JqX3R5cGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUodXVpZF9vYmogIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoKG9ial90eXBlID09IERTUF9EQ0ROT0RFVFlQRSkgfHwKKwkJICAgIChvYmpfdHlwZSA9PSBEU1BfRENEUFJPQ0VTU09SVFlQRSkgfHwKKwkJICAgIChvYmpfdHlwZSA9PSBEU1BfRENETElCUkFSWVRZUEUpIHx8CisJCSAgICAob2JqX3R5cGUgPT0gRFNQX0RDRENSRUFURUxJQlRZUEUpIHx8CisJCSAgICAob2JqX3R5cGUgPT0gRFNQX0RDREVYRUNVVEVMSUJUWVBFKSB8fAorCQkgICAgKG9ial90eXBlID09IERTUF9EQ0RERUxFVEVMSUJUWVBFKSk7CisKKwkvKgorCSAqICBXaGVuIGRjZF9yZWdpc3Rlcl9vYmplY3QgaXMgY2FsbGVkIHdpdGggTlVMTCBhcyBwYXRobmFtZSwKKwkgKiAgaXQgaW5kaWNhdGVzIGFuIHVucmVnaXN0ZXIgb2JqZWN0IG9wZXJhdGlvbi4KKwkgKi8KKwlzdGF0dXMgPSBkY2RfcmVnaXN0ZXJfb2JqZWN0KHV1aWRfb2JqLCBvYmpfdHlwZSwgTlVMTCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERDRCBIZWxwZXIgRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiAgPT09PT09PT0gYXRvaSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgc3RyaW5ncyBpbiBkZWNpbWFsIG9yIGhleCBmb3JtYXQgdG8gaW50ZWdlcnMuCisgKi8KK3N0YXRpYyBzMzIgYXRvaShjaGFyICpwc3pfYnVmKQoreworCWNoYXIgKnBjaCA9IHBzel9idWY7CisJczMyIGJhc2UgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVzOworCWludCByZXRfdmFsOworCisJd2hpbGUgKGlzc3BhY2UoKnBjaCkpCisJCXBjaCsrOworCisJaWYgKCpwY2ggPT0gJy0nIHx8ICpwY2ggPT0gJysnKSB7CisJCWJhc2UgPSAxMDsKKwkJcGNoKys7CisJfSBlbHNlIGlmICgqcGNoICYmIHRvbG93ZXIocGNoW3N0cmxlbihwY2gpIC0gMV0pID09ICdoJykgeworCQliYXNlID0gMTY7CisJfQorCisJcmV0X3ZhbCA9IHN0cmljdF9zdHJ0b3VsKHBjaCwgYmFzZSwgJnJlcyk7CisKKwlyZXR1cm4gcmV0X3ZhbCA/IDogcmVzOworfQorCisvKgorICogID09PT09PT09IGdldF9hdHRyc19mcm9tX2J1ZiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFBhcnNlIHRoZSBjb250ZW50IG9mIGEgYnVmZmVyIGZpbGxlZCB3aXRoIERTUC1zaWRlIGRhdGEgYW5kCisgKiAgICAgIHJldHJpZXZlIGFuIG9iamVjdCdzIGF0dHJpYnV0ZXMgZnJvbSBpdC4gSU1QT1JUQU5UOiBBc3N1bWUgdGhlCisgKiAgICAgIGJ1ZmZlciBoYXMgYmVlbiBjb252ZXJ0ZWQgZnJvbSBEU1AgZm9ybWF0IHRvIEdQUCBmb3JtYXQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2F0dHJzX2Zyb21fYnVmKGNoYXIgKnBzel9idWYsIHUzMiB1bF9idWZfc2l6ZSwKKwkJCQkgICAgIGVudW0gZHNwX2RjZG9ianR5cGUgb2JqX3R5cGUsCisJCQkJICAgICBzdHJ1Y3QgZGNkX2dlbmVyaWNvYmogKmdlbl9vYmopCit7CisJaW50IHN0YXR1cyA9IDA7CisJY2hhciBzZXBzW10gPSAiLCAiOworCWNoYXIgKnBzel9jdXI7CisJY2hhciAqdG9rZW47CisJczMyIHRva2VuX2xlbiA9IDA7CisJdTMyIGkgPSAwOworI2lmZGVmIF9EQl9USU9NQVAKKwlzMzIgZW50cnlfaWQ7CisjZW5kaWYKKworCURCQ19SRVFVSVJFKHBzel9idWYgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUodWxfYnVmX3NpemUgIT0gMCk7CisJREJDX1JFUVVJUkUoKG9ial90eXBlID09IERTUF9EQ0ROT0RFVFlQRSkKKwkJICAgIHx8IChvYmpfdHlwZSA9PSBEU1BfRENEUFJPQ0VTU09SVFlQRSkpOworCURCQ19SRVFVSVJFKGdlbl9vYmogIT0gTlVMTCk7CisKKwlzd2l0Y2ggKG9ial90eXBlKSB7CisJY2FzZSBEU1BfRENETk9ERVRZUEU6CisJCS8qCisJCSAqIFBhcnNlIENPRkYgc2VjdCBidWZmZXIgdG8gcmV0cmlldmUgaW5kaXZpZHVhbCB0b2tlbnMgdXNlZAorCQkgKiB0byBmaWxsIGluIG9iamVjdCBhdHRycy4KKwkJICovCisJCXBzel9jdXIgPSBwc3pfYnVmOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogdTMyIGNiX3N0cnVjdCAqLworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuY2Jfc3RydWN0ID0KKwkJICAgICh1MzIpIGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogZHNwX3V1aWQgdWlfbm9kZV9pZCAqLworCQl1dWlkX3V1aWRfZnJvbV9zdHJpbmcodG9rZW4sCisJCQkJICAgICAgJmdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy4KKwkJCQkgICAgICB1aV9ub2RlX2lkKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCS8qIGFjX25hbWUgKi8KKwkJREJDX1JFUVVJUkUodG9rZW4pOworCQl0b2tlbl9sZW4gPSBzdHJsZW4odG9rZW4pOworCQlpZiAodG9rZW5fbGVuID4gRFNQX01BWE5BTUVMRU4gLSAxKQorCQkJdG9rZW5fbGVuID0gRFNQX01BWE5BTUVMRU4gLSAxOworCisJCXN0cm5jcHkoZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLmFjX25hbWUsCisJCQl0b2tlbiwgdG9rZW5fbGVuKTsKKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLmFjX25hbWVbdG9rZW5fbGVuXSA9ICdcMCc7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKwkJLyogdTMyIG50eXBlICovCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5udHlwZSA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCS8qIHUzMiBjYWNoZV9vbl9ncHAgKi8KKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLmNhY2hlX29uX2dwcCA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCS8qIGRzcF9yZXNvdXJjZXJlcW10cyBkc3BfcmVzb3VyY2VfcmVxbXRzICovCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5kc3BfcmVzb3VyY2VfcmVxbXRzLgorCQkgICAgY2Jfc3RydWN0ID0gKHUzMikgYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuCisJCSAgICBkc3BfcmVzb3VyY2VfcmVxbXRzLnN0YXRpY19kYXRhX3NpemUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuCisJCSAgICBkc3BfcmVzb3VyY2VfcmVxbXRzLmdsb2JhbF9kYXRhX3NpemUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuCisJCSAgICBkc3BfcmVzb3VyY2VfcmVxbXRzLnByb2dyYW1fbWVtX3NpemUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuCisJCSAgICBkc3BfcmVzb3VyY2VfcmVxbXRzLnV3Y19leGVjdXRpb25fdGltZSA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy4KKwkJICAgIGRzcF9yZXNvdXJjZV9yZXFtdHMudXdjX3BlcmlvZCA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLgorCQkgICAgZHNwX3Jlc291cmNlX3JlcW10cy51d2NfZGVhZGxpbmUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy4KKwkJICAgIGRzcF9yZXNvdXJjZV9yZXFtdHMuYXZnX2V4ZWN0aW9uX3RpbWUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy4KKwkJICAgIGRzcF9yZXNvdXJjZV9yZXFtdHMubWluaW11bV9wZXJpb2QgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCS8qIHMzMiBwcmlvICovCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5wcmlvID0gYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQkvKiB1MzIgc3RhY2tfc2l6ZSAqLworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuc3RhY2tfc2l6ZSA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogdTMyIHN5c19zdGFja19zaXplICovCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5zeXNfc3RhY2tfc2l6ZSA9CisJCSAgICBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCS8qIHUzMiBzdGFja19zZWcgKi8KKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLnN0YWNrX3NlZyA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogdTMyIG1lc3NhZ2VfZGVwdGggKi8KKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLm1lc3NhZ2VfZGVwdGggPQorCQkgICAgYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQkvKiB1MzIgbnVtX2lucHV0X3N0cmVhbXMgKi8KKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLm51bV9pbnB1dF9zdHJlYW1zID0KKwkJICAgIGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogdTMyIG51bV9vdXRwdXRfc3RyZWFtcyAqLworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMubnVtX291dHB1dF9zdHJlYW1zID0KKwkJICAgIGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogdTMyIHV0aW1lb3V0ICovCisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy51dGltZW91dCA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogY2hhciAqcHN0cl9jcmVhdGVfcGhhc2VfZnhuICovCisJCURCQ19SRVFVSVJFKHRva2VuKTsKKwkJdG9rZW5fbGVuID0gc3RybGVuKHRva2VuKTsKKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9jcmVhdGVfcGhhc2VfZnhuID0KKwkJCQkJa3phbGxvYyh0b2tlbl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJc3RybmNweShnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2NyZWF0ZV9waGFzZV9meG4sCisJCQl0b2tlbiwgdG9rZW5fbGVuKTsKKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9jcmVhdGVfcGhhc2VfZnhuW3Rva2VuX2xlbl0gPQorCQkgICAgJ1wwJzsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCS8qIGNoYXIgKnBzdHJfZXhlY3V0ZV9waGFzZV9meG4gKi8KKwkJREJDX1JFUVVJUkUodG9rZW4pOworCQl0b2tlbl9sZW4gPSBzdHJsZW4odG9rZW4pOworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2V4ZWN1dGVfcGhhc2VfZnhuID0KKwkJCQkJa3phbGxvYyh0b2tlbl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJc3RybmNweShnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2V4ZWN1dGVfcGhhc2VfZnhuLAorCQkJdG9rZW4sIHRva2VuX2xlbik7CisJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfZXhlY3V0ZV9waGFzZV9meG5bdG9rZW5fbGVuXSA9CisJCSAgICAnXDAnOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJLyogY2hhciAqcHN0cl9kZWxldGVfcGhhc2VfZnhuICovCisJCURCQ19SRVFVSVJFKHRva2VuKTsKKwkJdG9rZW5fbGVuID0gc3RybGVuKHRva2VuKTsKKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9kZWxldGVfcGhhc2VfZnhuID0KKwkJCQkJa3phbGxvYyh0b2tlbl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJc3RybmNweShnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2RlbGV0ZV9waGFzZV9meG4sCisJCQl0b2tlbiwgdG9rZW5fbGVuKTsKKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9kZWxldGVfcGhhc2VfZnhuW3Rva2VuX2xlbl0gPQorCQkgICAgJ1wwJzsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCS8qIFNlZ21lbnQgaWQgZm9yIG1lc3NhZ2UgYnVmZmVycyAqLworCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai5tc2dfc2VnaWQgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCS8qIE1lc3NhZ2Ugbm90aWZpY2F0aW9uIHR5cGUgKi8KKwkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubXNnX25vdGlmeV90eXBlID0gYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQkvKiBjaGFyICpwc3RyX2lfYWxnX25hbWUgKi8KKwkJaWYgKHRva2VuKSB7CisJCQl0b2tlbl9sZW4gPSBzdHJsZW4odG9rZW4pOworCQkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9pX2FsZ19uYW1lID0KKwkJCQkJa3phbGxvYyh0b2tlbl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJCXN0cm5jcHkoZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9pX2FsZ19uYW1lLAorCQkJCXRva2VuLCB0b2tlbl9sZW4pOworCQkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoucHN0cl9pX2FsZ19uYW1lW3Rva2VuX2xlbl0gPQorCQkJICAgICdcMCc7CisJCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCX0KKworCQkvKiBMb2FkIHR5cGUgKHN0YXRpYywgZHluYW1pYywgb3Igb3ZlcmxheSkgKi8KKwkJaWYgKHRva2VuKSB7CisJCQlnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai51c19sb2FkX3R5cGUgPSBhdG9pKHRva2VuKTsKKwkJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKwkJfQorCisJCS8qIER5bmFtaWMgbG9hZCBkYXRhIHJlcXVpcmVtZW50cyAqLworCQlpZiAodG9rZW4pIHsKKwkJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLnVsX2RhdGFfbWVtX3NlZ19tYXNrID0KKwkJCSAgICBhdG9pKHRva2VuKTsKKwkJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKwkJfQorCisJCS8qIER5bmFtaWMgbG9hZCBjb2RlIHJlcXVpcmVtZW50cyAqLworCQlpZiAodG9rZW4pIHsKKwkJCWdlbl9vYmotPm9ial9kYXRhLm5vZGVfb2JqLnVsX2NvZGVfbWVtX3NlZ19tYXNrID0KKwkJCSAgICBhdG9pKHRva2VuKTsKKwkJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKwkJfQorCisJCS8qIEV4dHJhY3Qgbm9kZSBwcm9maWxlcyBpbnRvIG5vZGUgcHJvcGVydGllcyAqLworCQlpZiAodG9rZW4pIHsKKworCQkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLmNvdW50X3Byb2ZpbGVzID0KKwkJCSAgICBhdG9pKHRva2VuKTsKKwkJCWZvciAoaSA9IDA7CisJCQkgICAgIGkgPAorCQkJICAgICBnZW5fb2JqLT5vYmpfZGF0YS5ub2RlX29iai4KKwkJCSAgICAgbmRiX3Byb3BzLmNvdW50X3Byb2ZpbGVzOyBpKyspIHsKKwkJCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCQkJaWYgKHRva2VuKSB7CisJCQkJCS8qIEhlYXAgU2l6ZSBmb3IgdGhlIG5vZGUgKi8KKwkJCQkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmouCisJCQkJCSAgICBuZGJfcHJvcHMubm9kZV9wcm9maWxlc1tpXS4KKwkJCQkJICAgIHVsX2hlYXBfc2l6ZSA9IGF0b2kodG9rZW4pOworCQkJCX0KKwkJCX0KKwkJfQorCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCWlmICh0b2tlbikgeworCQkJZ2VuX29iai0+b2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLnN0YWNrX3NlZ19uYW1lID0KKwkJCSAgICAodTMyKSAodG9rZW4pOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIERTUF9EQ0RQUk9DRVNTT1JUWVBFOgorCQkvKgorCQkgKiBQYXJzZSBDT0ZGIHNlY3QgYnVmZmVyIHRvIHJldHJpZXZlIGluZGl2aWR1YWwgdG9rZW5zIHVzZWQKKwkJICogdG8gZmlsbCBpbiBvYmplY3QgYXR0cnMuCisJCSAqLworCQlwc3pfY3VyID0gcHN6X2J1ZjsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCWdlbl9vYmotPm9ial9kYXRhLnByb2NfaW5mby5jYl9zdHJ1Y3QgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCWdlbl9vYmotPm9ial9kYXRhLnByb2NfaW5mby5wcm9jZXNzb3JfZmFtaWx5ID0gYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQlnZW5fb2JqLT5vYmpfZGF0YS5wcm9jX2luZm8ucHJvY2Vzc29yX3R5cGUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCWdlbl9vYmotPm9ial9kYXRhLnByb2NfaW5mby5jbG9ja19yYXRlID0gYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQlnZW5fb2JqLT5vYmpfZGF0YS5wcm9jX2luZm8udWxfaW50ZXJuYWxfbWVtX3NpemUgPSBhdG9pKHRva2VuKTsKKwkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCisJCWdlbl9vYmotPm9ial9kYXRhLnByb2NfaW5mby51bF9leHRlcm5hbF9tZW1fc2l6ZSA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJZ2VuX29iai0+b2JqX2RhdGEucHJvY19pbmZvLnByb2Nlc3Nvcl9pZCA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJZ2VuX29iai0+b2JqX2RhdGEucHJvY19pbmZvLnR5X3J1bm5pbmdfcnRvcyA9IGF0b2kodG9rZW4pOworCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisKKwkJZ2VuX29iai0+b2JqX2RhdGEucHJvY19pbmZvLm5vZGVfbWluX3ByaW9yaXR5ID0gYXRvaSh0b2tlbik7CisJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKworCQlnZW5fb2JqLT5vYmpfZGF0YS5wcm9jX2luZm8ubm9kZV9tYXhfcHJpb3JpdHkgPSBhdG9pKHRva2VuKTsKKworI2lmZGVmIF9EQl9USU9NQVAKKwkJLyogUHJvYyBvYmplY3QgbWF5IGNvbnRhaW4gYWRkaXRpb25hbChleHRlbmRlZCkgYXR0cmlidXRlcy4gKi8KKwkJLyogYXR0ciBtdXN0IG1hdGNoIHByb2MuaHh4ICovCisJCWZvciAoZW50cnlfaWQgPSAwOyBlbnRyeV9pZCA8IDc7IGVudHJ5X2lkKyspIHsKKwkJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKwkJCWdlbl9vYmotPm9ial9kYXRhLmV4dF9wcm9jX29iai50eV90bGJbZW50cnlfaWRdLgorCQkJICAgIHVsX2dwcF9waHlzID0gYXRvaSh0b2tlbik7CisKKwkJCXRva2VuID0gc3Ryc2VwKCZwc3pfY3VyLCBzZXBzKTsKKwkJCWdlbl9vYmotPm9ial9kYXRhLmV4dF9wcm9jX29iai50eV90bGJbZW50cnlfaWRdLgorCQkJICAgIHVsX2RzcF92aXJ0ID0gYXRvaSh0b2tlbik7CisJCX0KKyNlbmRpZgorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVQRVJNOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IENvbXByZXNzQnVmZmVyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ29tcHJlc3MgdGhlIERTUCBidWZmZXIsIGlmIG5lY2Vzc2FyeSwgdG8gY29uZm9ybSB0byBQQyBmb3JtYXQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbXByZXNzX2J1ZihjaGFyICpwc3pfYnVmLCB1MzIgdWxfYnVmX3NpemUsIHMzMiBjaGFyX3NpemUpCit7CisJY2hhciAqcDsKKwljaGFyIGNoOworCWNoYXIgKnE7CisKKwlwID0gcHN6X2J1ZjsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKHEgPSBwc3pfYnVmOyBxIDwgKHBzel9idWYgKyB1bF9idWZfc2l6ZSk7KSB7CisJCWNoID0gZHNwX2NoYXIyX2dwcF9jaGFyKHEsIGNoYXJfc2l6ZSk7CisJCWlmIChjaCA9PSAnXFwnKSB7CisJCQlxICs9IGNoYXJfc2l6ZTsKKwkJCWNoID0gZHNwX2NoYXIyX2dwcF9jaGFyKHEsIGNoYXJfc2l6ZSk7CisJCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICd0JzoKKwkJCQkqcCA9ICdcdCc7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ24nOgorCQkJCSpwID0gJ1xuJzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAncic6CisJCQkJKnAgPSAnXHInOworCQkJCWJyZWFrOworCisJCQljYXNlICcwJzoKKwkJCQkqcCA9ICdcMCc7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJKnAgPSBjaDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpwID0gY2g7CisJCX0KKwkJcCsrOworCQlxICs9IGNoYXJfc2l6ZTsKKwl9CisKKwkvKiBOVUxMIG91dCByZW1haW5kZXIgb2YgYnVmZmVyLiAqLworCXdoaWxlIChwIDwgcSkKKwkJKnArKyA9ICdcMCc7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZHNwX2NoYXIyX2dwcF9jaGFyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ29udmVydCBEU1AgY2hhciB0byBob3N0IEdQUCBjaGFyIGluIGEgcG9ydGFibGUgbWFubmVyCisgKi8KK3N0YXRpYyBjaGFyIGRzcF9jaGFyMl9ncHBfY2hhcihjaGFyICp3b3JkLCBzMzIgZHNwX2NoYXJfc2l6ZSkKK3sKKwljaGFyIGNoID0gJ1wwJzsKKwljaGFyICpjaF9zcmM7CisJczMyIGk7CisKKwlmb3IgKGNoX3NyYyA9IHdvcmQsIGkgPSBkc3BfY2hhcl9zaXplOyBpID4gMDsgaS0tKQorCQljaCB8PSAqY2hfc3JjKys7CisKKwlyZXR1cm4gY2g7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X2RlcF9saWJfaW5mbyA9PT09PT09PQorICovCitzdGF0aWMgaW50IGdldF9kZXBfbGliX2luZm8oc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21nciwKKwkJCQkgICBzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJCSAgIHUxNiAqbnVtX2xpYnMsCisJCQkJICAgdTE2ICpudW1fcGVyc19saWJzLAorCQkJCSAgIHN0cnVjdCBkc3BfdXVpZCAqZGVwX2xpYl91dWlkcywKKwkJCQkgICBib29sICpwcnN0bnRfZGVwX2xpYnMsCisJCQkJICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKQoreworCXN0cnVjdCBkY2RfbWFuYWdlciAqZGNkX21ncl9vYmogPSBoZGNkX21ncjsKKwljaGFyICpwc3pfY29mZl9idWYgPSBOVUxMOworCWNoYXIgKnBzel9jdXI7CisJY2hhciAqcHN6X2ZpbGVfbmFtZSA9IE5VTEw7CisJc3RydWN0IGNvZF9saWJyYXJ5b2JqICpsaWIgPSBOVUxMOworCXUzMiB1bF9hZGRyID0gMDsJLyogVXNlZCBieSBjb2RfZ2V0X3NlY3Rpb24gKi8KKwl1MzIgdWxfbGVuID0gMDsJCS8qIFVzZWQgYnkgY29kX2dldF9zZWN0aW9uICovCisJdTMyIGR3X2RhdGFfc2l6ZSA9IENPRF9NQVhQQVRITEVOR1RIOworCWNoYXIgc2Vwc1tdID0gIiwgIjsKKwljaGFyICp0b2tlbiA9IE5VTEw7CisJYm9vbCBnZXRfdXVpZHMgPSAoZGVwX2xpYl91dWlkcyAhPSBOVUxMKTsKKwl1MTYgZGVwX2xpYnMgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJREJDX1JFUVVJUkUoaGRjZF9tZ3IpOworCURCQ19SRVFVSVJFKG51bV9saWJzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHV1aWRfb2JqICE9IE5VTEwpOworCisJLyogIEluaXRpYWxpemUgdG8gMCBkZXBlbmRlbnQgbGlicmFyaWVzLCBpZiBvbmx5IGNvdW50aW5nIG51bWJlciBvZgorCSAqICBkZXBlbmRlbnQgbGlicmFyaWVzICovCisJaWYgKCFnZXRfdXVpZHMpIHsKKwkJKm51bV9saWJzID0gMDsKKwkJKm51bV9wZXJzX2xpYnMgPSAwOworCX0KKworCS8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciBmaWxlIG5hbWUgKi8KKwlwc3pfZmlsZV9uYW1lID0ga3phbGxvYyhkd19kYXRhX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChwc3pfZmlsZV9uYW1lID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQkvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgKi8KKwkJc3RhdHVzID0gZGNkX2dldF9saWJyYXJ5X25hbWUoaGRjZF9tZ3IsIHV1aWRfb2JqLCBwc3pfZmlsZV9uYW1lLAorCQkJCQkgICAgICAmZHdfZGF0YV9zaXplLCBwaGFzZSwgTlVMTCk7CisJfQorCisJLyogT3BlbiB0aGUgbGlicmFyeSAqLworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGNvZF9vcGVuKGRjZF9tZ3Jfb2JqLT5jb2RfbWdyLCBwc3pfZmlsZV9uYW1lLAorCQkJCSAgQ09EX05PTE9BRCwgJmxpYik7CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIEdldCBkZXBlbmRlbnQgbGlicmFyeSBzZWN0aW9uIGluZm9ybWF0aW9uLiAqLworCQlzdGF0dXMgPSBjb2RfZ2V0X3NlY3Rpb24obGliLCBERVBMSUJTRUNULCAmdWxfYWRkciwgJnVsX2xlbik7CisKKwkJaWYgKHN0YXR1cykgeworCQkJLyogT2ssIG5vIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKwkJCXVsX2xlbiA9IDA7CisJCQlzdGF0dXMgPSAwOworCQl9CisJfQorCisJaWYgKHN0YXR1cyB8fCAhKHVsX2xlbiA+IDApKQorCQlnb3RvIGZ1bmNfY29udDsKKworCS8qIEFsbG9jYXRlIHplcm9lZCBidWZmZXIuICovCisJcHN6X2NvZmZfYnVmID0ga3phbGxvYyh1bF9sZW4gKyA0LCBHRlBfS0VSTkVMKTsKKwlpZiAocHN6X2NvZmZfYnVmID09IE5VTEwpCisJCXN0YXR1cyA9IC1FTk9NRU07CisKKwkvKiBSZWFkIHNlY3Rpb24gY29udGVudHMuICovCisJc3RhdHVzID0gY29kX3JlYWRfc2VjdGlvbihsaWIsIERFUExJQlNFQ1QsIHBzel9jb2ZmX2J1ZiwgdWxfbGVuKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfY29udDsKKworCS8qIENvbXByZXNzIGFuZCBmb3JtYXQgRFNQIGJ1ZmZlciB0byBjb25mb3JtIHRvIFBDIGZvcm1hdC4gKi8KKwljb21wcmVzc19idWYocHN6X2NvZmZfYnVmLCB1bF9sZW4sIERTUFdPUkRTSVpFKTsKKworCS8qIFJlYWQgZnJvbSBidWZmZXIgKi8KKwlwc3pfY3VyID0gcHN6X2NvZmZfYnVmOworCXdoaWxlICgodG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpKSAmJiAqdG9rZW4gIT0gJ1wwJykgeworCQlpZiAoZ2V0X3V1aWRzKSB7CisJCQlpZiAoZGVwX2xpYnMgPj0gKm51bV9saWJzKSB7CisJCQkJLyogR29uZSBiZXlvbmQgdGhlIGxpbWl0ICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIFJldHJpZXZlIFVVSUQgc3RyaW5nLiAqLworCQkJCXV1aWRfdXVpZF9mcm9tX3N0cmluZyh0b2tlbiwKKwkJCQkJCSAgICAgICYoZGVwX2xpYl91dWlkcworCQkJCQkJCVtkZXBfbGlic10pKTsKKwkJCQkvKiBJcyB0aGlzIGxpYnJhcnkgcGVyc2lzdGVudD8gKi8KKwkJCQl0b2tlbiA9IHN0cnNlcCgmcHN6X2N1ciwgc2Vwcyk7CisJCQkJcHJzdG50X2RlcF9saWJzW2RlcF9saWJzXSA9IGF0b2kodG9rZW4pOworCQkJCWRlcF9saWJzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBZHZhbmMgdG8gbmV4dCB0b2tlbiAqLworCQkJdG9rZW4gPSBzdHJzZXAoJnBzel9jdXIsIHNlcHMpOworCQkJaWYgKGF0b2kodG9rZW4pKQorCQkJCSgqbnVtX3BlcnNfbGlicykrKzsKKworCQkJLyogSnVzdCBjb3VudGluZyBudW1iZXIgb2YgZGVwZW5kZW50IGxpYnJhcmllcyAqLworCQkJKCpudW1fbGlicykrKzsKKwkJfQorCX0KK2Z1bmNfY29udDoKKwlpZiAobGliKQorCQljb2RfY2xvc2UobGliKTsKKworCS8qIEZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgZHluYW1pYyBidWZmZXJzLiAqLworCWtmcmVlKHBzel9maWxlX25hbWUpOworCisJa2ZyZWUocHN6X2NvZmZfYnVmKTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kaXNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kaXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjZTQzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rpc3AuYwpAQCAtMCwwICsxLDc1MiBAQAorLyoKKyAqIGRpc3AuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBOb2RlIERpc3BhdGNoZXIgaW50ZXJmYWNlLiBDb21tdW5pY2F0ZXMgd2l0aCBSZXNvdXJjZSBNYW5hZ2VyIFNlcnZlcgorICogKFJNUykgb24gRFNQLiBBY2Nlc3MgdG8gUk1TIGlzIHN5bmNocm9uaXplZCBpbiBOT0RFLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL3N5bmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpbmsgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBsYXRmb3JtIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NobmxkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvdXJjZSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL25vZGVkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL25vZGVwcml2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Jtc19zaC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kaXNwLmg+CisKKy8qIFNpemUgb2YgYSByZXBseSBmcm9tIFJNUyAqLworI2RlZmluZSBSRVBMWVNJWkUgKDMgKiBzaXplb2Yocm1zX3dvcmQpKQorCisvKiBSZXNlcnZlZCBjaGFubmVsIG9mZnNldHMgZm9yIGNvbW11bmljYXRpb24gd2l0aCBSTVMgKi8KKyNkZWZpbmUgQ0hOTFRPUk1TT0ZGU0VUICAgICAgIDAKKyNkZWZpbmUgQ0hOTEZST01STVNPRkZTRVQgICAgIDEKKworI2RlZmluZSBDSE5MSU9SRVFTICAgICAgMQorCisvKgorICogID09PT09PT09IGRpc3Bfb2JqZWN0ID09PT09PT09CisgKi8KK3N0cnVjdCBkaXNwX29iamVjdCB7CisJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqOwkvKiBEZXZpY2UgZm9yIHRoaXMgcHJvY2Vzc29yICovCisJLyogRnVuY3Rpb24gaW50ZXJmYWNlIHRvIEJyaWRnZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgY2hubF9tZ3IgKmhjaG5sX21ncjsJLyogQ2hhbm5lbCBtYW5hZ2VyICovCisJc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX3RvX2RzcDsJLyogQ2hubCBmb3IgY29tbWFuZHMgdG8gUk1TICovCisJc3RydWN0IGNobmxfb2JqZWN0ICpjaG5sX2Zyb21fZHNwOwkvKiBDaG5sIGZvciByZXBsaWVzIGZyb20gUk1TICovCisJdTggKnBidWY7CQkvKiBCdWZmZXIgZm9yIGNvbW1hbmRzLCByZXBsaWVzICovCisJdTMyIHVsX2J1ZnNpemU7CQkvKiBwYnVmIHNpemUgaW4gYnl0ZXMgKi8KKwl1MzIgdWxfYnVmc2l6ZV9ybXM7CS8qIHBidWYgc2l6ZSBpbiBSTVMgd29yZHMgKi8KKwl1MzIgY2hhcl9zaXplOwkJLyogU2l6ZSBvZiBEU1AgY2hhcmFjdGVyICovCisJdTMyIHdvcmRfc2l6ZTsJCS8qIFNpemUgb2YgRFNQIHdvcmQgKi8KKwl1MzIgZGF0YV9tYXVfc2l6ZTsJLyogU2l6ZSBvZiBEU1AgRGF0YSBNQVUgKi8KK307CisKK3N0YXRpYyB1MzIgcmVmczsKKworc3RhdGljIHZvaWQgZGVsZXRlX2Rpc3Aoc3RydWN0IGRpc3Bfb2JqZWN0ICpkaXNwX29iaik7CitzdGF0aWMgaW50IGZpbGxfc3RyZWFtX2RlZihybXNfd29yZCAqcGR3X2J1ZiwgdTMyICpwdG90YWwsIHUzMiBvZmZzZXQsCisJCQkJICBzdHJ1Y3Qgbm9kZV9zdHJtZGVmIHN0cm1fZGVmLCB1MzIgbWF4LAorCQkJCSAgdTMyIGNoYXJzX2luX3Jtc193b3JkKTsKK3N0YXRpYyBpbnQgc2VuZF9tZXNzYWdlKHN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmosIHUzMiB0aW1lb3V0LAorCQkJICAgICAgIHUzMiB1bF9ieXRlcywgdTMyICpwZHdfYXJnKTsKKworLyoKKyAqICA9PT09PT09PSBkaXNwX2NyZWF0ZSA9PT09PT09PQorICogIENyZWF0ZSBhIE5PREUgRGlzcGF0Y2hlciBvYmplY3QuCisgKi8KK2ludCBkaXNwX2NyZWF0ZShzdHJ1Y3QgZGlzcF9vYmplY3QgKipkaXNwYXRjaF9vYmosCisJCSAgICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGlzcF9hdHRyICpkaXNwX2F0dHJzKQoreworCXN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmo7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJdTMyIHVsX2NobmxfaWQ7CisJc3RydWN0IGNobmxfYXR0ciBjaG5sX2F0dHJfb2JqOworCWludCBzdGF0dXMgPSAwOworCXU4IGRldl90eXBlOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGRpc3BhdGNoX29iaiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShkaXNwX2F0dHJzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGhkZXZfb2JqICE9IE5VTEwpOworCisJKmRpc3BhdGNoX29iaiA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBOb2RlIERpc3BhdGNoZXIgb2JqZWN0ICovCisJZGlzcF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGlzcF9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGlzcF9vYmogPT0gTlVMTCkKKwkJc3RhdHVzID0gLUVOT01FTTsKKwllbHNlCisJCWRpc3Bfb2JqLT5oZGV2X29iaiA9IGhkZXZfb2JqOworCisJLyogR2V0IENoYW5uZWwgbWFuYWdlciBhbmQgQnJpZGdlIGZ1bmN0aW9uIGludGVyZmFjZSAqLworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGRldl9nZXRfY2hubF9tZ3IoaGRldl9vYmosICYoZGlzcF9vYmotPmhjaG5sX21ncikpOworCQlpZiAoIXN0YXR1cykgeworCQkJKHZvaWQpZGV2X2dldF9pbnRmX2Z4bnMoaGRldl9vYmosICZpbnRmX2Z4bnMpOworCQkJZGlzcF9vYmotPmludGZfZnhucyA9IGludGZfZnhuczsKKwkJfQorCX0KKworCS8qIGNoZWNrIGRldmljZSB0eXBlIGFuZCBkZWNpZGUgaWYgc3RyZWFtcyBvciBtZXNzYWcnaW5nIGlzIHVzZWQgZm9yCisJICogUk1TL0VEUyAqLworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19jb250OworCisJc3RhdHVzID0gZGV2X2dldF9kZXZfdHlwZShoZGV2X29iaiwgJmRldl90eXBlKTsKKworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19jb250OworCisJaWYgKGRldl90eXBlICE9IERTUF9VTklUKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZ290byBmdW5jX2NvbnQ7CisJfQorCisJZGlzcF9vYmotPmNoYXJfc2l6ZSA9IERTUFdPUkRTSVpFOworCWRpc3Bfb2JqLT53b3JkX3NpemUgPSBEU1BXT1JEU0laRTsKKwlkaXNwX29iai0+ZGF0YV9tYXVfc2l6ZSA9IERTUFdPUkRTSVpFOworCS8qIE9wZW4gY2hhbm5lbHMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgUk1TICovCisJY2hubF9hdHRyX29iai51aW9fcmVxcyA9IENITkxJT1JFUVM7CisJY2hubF9hdHRyX29iai5ldmVudF9vYmogPSBOVUxMOworCXVsX2NobmxfaWQgPSBkaXNwX2F0dHJzLT51bF9jaG5sX29mZnNldCArIENITkxUT1JNU09GRlNFVDsKKwlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2Nobmxfb3BlbikgKCYoZGlzcF9vYmotPmNobmxfdG9fZHNwKSwKKwkJCQkJICAgICAgZGlzcF9vYmotPmhjaG5sX21nciwKKwkJCQkJICAgICAgQ0hOTF9NT0RFVE9EU1AsIHVsX2NobmxfaWQsCisJCQkJCSAgICAgICZjaG5sX2F0dHJfb2JqKTsKKworCWlmICghc3RhdHVzKSB7CisJCXVsX2NobmxfaWQgPSBkaXNwX2F0dHJzLT51bF9jaG5sX29mZnNldCArIENITkxGUk9NUk1TT0ZGU0VUOworCQlzdGF0dXMgPQorCQkgICAgKCppbnRmX2Z4bnMtPnBmbl9jaG5sX29wZW4pICgmKGRpc3Bfb2JqLT5jaG5sX2Zyb21fZHNwKSwKKwkJCQkJCSBkaXNwX29iai0+aGNobmxfbWdyLAorCQkJCQkJIENITkxfTU9ERUZST01EU1AsIHVsX2NobmxfaWQsCisJCQkJCQkgJmNobmxfYXR0cl9vYmopOworCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGNvbW1hbmRzLCByZXBsaWVzICovCisJCWRpc3Bfb2JqLT51bF9idWZzaXplID0gZGlzcF9hdHRycy0+dWxfY2hubF9idWZfc2l6ZTsKKwkJZGlzcF9vYmotPnVsX2J1ZnNpemVfcm1zID0gUk1TX0NPTU1BTkRCVUZTSVpFOworCQlkaXNwX29iai0+cGJ1ZiA9IGt6YWxsb2MoZGlzcF9vYmotPnVsX2J1ZnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoZGlzcF9vYmotPnBidWYgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorZnVuY19jb250OgorCWlmICghc3RhdHVzKQorCQkqZGlzcGF0Y2hfb2JqID0gZGlzcF9vYmo7CisJZWxzZQorCQlkZWxldGVfZGlzcChkaXNwX29iaik7CisKKwlEQkNfRU5TVVJFKChzdGF0dXMgJiYgKmRpc3BhdGNoX29iaiA9PSBOVUxMKSB8fAorCQkJCSghc3RhdHVzICYmICpkaXNwYXRjaF9vYmopKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRpc3BfZGVsZXRlID09PT09PT09CisgKiAgRGVsZXRlIHRoZSBOT0RFIERpc3BhdGNoZXIuCisgKi8KK3ZvaWQgZGlzcF9kZWxldGUoc3RydWN0IGRpc3Bfb2JqZWN0ICpkaXNwX29iaikKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoZGlzcF9vYmopOworCisJZGVsZXRlX2Rpc3AoZGlzcF9vYmopOworfQorCisvKgorICogID09PT09PT09IGRpc3BfZXhpdCA9PT09PT09PQorICogIERpc2NvbnRpbnVlIHVzYWdlIG9mIERJU1AgbW9kdWxlLgorICovCit2b2lkIGRpc3BfZXhpdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXJlZnMtLTsKKworCURCQ19FTlNVUkUocmVmcyA+PSAwKTsKK30KKworLyoKKyAqICA9PT09PT09PSBkaXNwX2luaXQgPT09PT09PT0KKyAqICBJbml0aWFsaXplIHRoZSBESVNQIG1vZHVsZS4KKyAqLworYm9vbCBkaXNwX2luaXQodm9pZCkKK3sKKwlib29sIHJldCA9IHRydWU7CisKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCisJaWYgKHJldCkKKwkJcmVmcysrOworCisJREJDX0VOU1VSRSgocmV0ICYmIChyZWZzID4gMCkpIHx8ICghcmV0ICYmIChyZWZzID49IDApKSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBkaXNwX25vZGVfY2hhbmdlX3ByaW9yaXR5ID09PT09PT09CisgKiAgQ2hhbmdlIHRoZSBwcmlvcml0eSBvZiBhIG5vZGUgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIHRhcmdldC4KKyAqLworaW50IGRpc3Bfbm9kZV9jaGFuZ2VfcHJpb3JpdHkoc3RydWN0IGRpc3Bfb2JqZWN0ICpkaXNwX29iaiwKKwkJCQkgICAgIHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkJICAgICB1MzIgcm1zX2Z4biwgbm9kZWVudiBub2RlX2VudiwgczMyIHByaW8pCit7CisJdTMyIGR3X2FyZzsKKwlzdHJ1Y3Qgcm1zX2NvbW1hbmQgKnJtc19jbWQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoZGlzcF9vYmopOworCURCQ19SRVFVSVJFKGhub2RlICE9IE5VTEwpOworCisJLyogU2VuZCBtZXNzYWdlIHRvIFJNUyB0byBjaGFuZ2UgcHJpb3JpdHkgKi8KKwlybXNfY21kID0gKHN0cnVjdCBybXNfY29tbWFuZCAqKShkaXNwX29iai0+cGJ1Zik7CisJcm1zX2NtZC0+ZnhuID0gKHJtc193b3JkKSAocm1zX2Z4bik7CisJcm1zX2NtZC0+YXJnMSA9IChybXNfd29yZCkgbm9kZV9lbnY7CisJcm1zX2NtZC0+YXJnMiA9IHByaW87CisJc3RhdHVzID0gc2VuZF9tZXNzYWdlKGRpc3Bfb2JqLCBub2RlX2dldF90aW1lb3V0KGhub2RlKSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgcm1zX2NvbW1hbmQpLCAmZHdfYXJnKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGlzcF9ub2RlX2NyZWF0ZSA9PT09PT09PQorICogIENyZWF0ZSBhIG5vZGUgb24gdGhlIERTUCBieSByZW1vdGVseSBjYWxsaW5nIHRoZSBub2RlJ3MgY3JlYXRlIGZ1bmN0aW9uLgorICovCitpbnQgZGlzcF9ub2RlX2NyZWF0ZShzdHJ1Y3QgZGlzcF9vYmplY3QgKmRpc3Bfb2JqLAorCQkJICAgIHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHUzMiBybXNfZnhuLAorCQkJICAgIHUzMiB1bF9jcmVhdGVfZnhuLAorCQkJICAgIGNvbnN0IHN0cnVjdCBub2RlX2NyZWF0ZWFyZ3MgKnBhcmdzLAorCQkJICAgIG5vZGVlbnYgKm5vZGVfZW52KQoreworCXN0cnVjdCBub2RlX21zZ2FyZ3Mgbm9kZV9tc2dfYXJnczsKKwlzdHJ1Y3Qgbm9kZV90YXNrYXJncyB0YXNrX2FyZ19vYmo7CisJc3RydWN0IHJtc19jb21tYW5kICpybXNfY21kOworCXN0cnVjdCBybXNfbXNnX2FyZ3MgKnBtc2dfYXJnczsKKwlzdHJ1Y3Qgcm1zX21vcmVfdGFza19hcmdzICptb3JlX3Rhc2tfYXJnczsKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGU7CisJdTMyIGR3X2xlbmd0aDsKKwlybXNfd29yZCAqcGR3X2J1ZiA9IE5VTEw7CisJdTMyIHVsX2J5dGVzOworCXUzMiBpOworCXUzMiB0b3RhbDsKKwl1MzIgY2hhcnNfaW5fcm1zX3dvcmQ7CisJczMyIHRhc2tfYXJnc19vZmZzZXQ7CisJczMyIHNpb19pbl9kZWZfb2Zmc2V0OworCXMzMiBzaW9fb3V0X2RlZl9vZmZzZXQ7CisJczMyIHNpb19kZWZzX29mZnNldDsKKwlzMzIgYXJnc19vZmZzZXQgPSAtMTsKKwlzMzIgb2Zmc2V0OworCXN0cnVjdCBub2RlX3N0cm1kZWYgc3RybV9kZWY7CisJdTMyIG1heDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNwX25vZGVpbmZvIG5vZGVfaW5mbzsKKwl1OCBkZXZfdHlwZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkaXNwX29iaik7CisJREJDX1JFUVVJUkUoaG5vZGUgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobm9kZV9nZXRfdHlwZShobm9kZSkgIT0gTk9ERV9ERVZJQ0UpOworCURCQ19SRVFVSVJFKG5vZGVfZW52ICE9IE5VTEwpOworCisJc3RhdHVzID0gZGV2X2dldF9kZXZfdHlwZShkaXNwX29iai0+aGRldl9vYmosICZkZXZfdHlwZSk7CisKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJaWYgKGRldl90eXBlICE9IERTUF9VTklUKSB7CisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IHVua25vd24gZGV2aWNlIHR5cGUgPSAweCV4XG4iLAorCQkJX19mdW5jX18sIGRldl90eXBlKTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJREJDX1JFUVVJUkUocGFyZ3MgIT0gTlVMTCk7CisJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShobm9kZSk7CisJbm9kZV9tc2dfYXJncyA9IHBhcmdzLT5hc2Eubm9kZV9tc2dfYXJnczsKKwltYXggPSBkaXNwX29iai0+dWxfYnVmc2l6ZV9ybXM7CS8qTWF4ICMgb2YgUk1TIHdvcmRzIHRoYXQgY2FuIGJlIHNlbnQgKi8KKwlEQkNfQVNTRVJUKG1heCA9PSBSTVNfQ09NTUFOREJVRlNJWkUpOworCWNoYXJzX2luX3Jtc193b3JkID0gc2l6ZW9mKHJtc193b3JkKSAvIGRpc3Bfb2JqLT5jaGFyX3NpemU7CisJLyogTnVtYmVyIG9mIFJNUyB3b3JkcyBuZWVkZWQgdG8gaG9sZCBhcmcgZGF0YSAqLworCWR3X2xlbmd0aCA9CisJICAgIChub2RlX21zZ19hcmdzLmFyZ19sZW5ndGggKyBjaGFyc19pbl9ybXNfd29yZCAtCisJICAgICAxKSAvIGNoYXJzX2luX3Jtc193b3JkOworCS8qIE1ha2Ugc3VyZSBtc2cgYXJncyBhbmQgY29tbWFuZCBmaXQgaW4gYnVmZmVyICovCisJdG90YWwgPSBzaXplb2Yoc3RydWN0IHJtc19jb21tYW5kKSAvIHNpemVvZihybXNfd29yZCkgKworCSAgICBzaXplb2Yoc3RydWN0IHJtc19tc2dfYXJncykKKwkgICAgLyBzaXplb2Yocm1zX3dvcmQpIC0gMSArIGR3X2xlbmd0aDsKKwlpZiAodG90YWwgPj0gbWF4KSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogTWVzc2FnZSBhcmdzIHRvbyBsYXJnZSBmb3IgYnVmZmVyISBzaXplICIKKwkJCSI9ICVkLCBtYXggPSAlZFxuIiwgX19mdW5jX18sIHRvdGFsLCBtYXgpOworCX0KKwkvKgorCSAqICBGaWxsIGluIGJ1ZmZlciB0byBzZW5kIHRvIFJNUy4KKwkgKiAgVGhlIGJ1ZmZlciB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyAgZm9ybWF0OgorCSAqCisJICogIFJNUyBjb21tYW5kOgorCSAqICAgICAgQWRkcmVzcyBvZiBSTVNfQ3JlYXRlTm9kZSgpCisJICogICAgICBBZGRyZXNzIG9mIG5vZGUncyBjcmVhdGUgZnVuY3Rpb24KKwkgKiAgICAgIGR1bW15IGFyZ3VtZW50CisJICogICAgICBub2RlIHR5cGUKKwkgKgorCSAqICBNZXNzYWdlIEFyZ3M6CisJICogICAgICBtYXggbnVtYmVyIG9mIG1lc3NhZ2VzCisJICogICAgICBzZWdpZCBmb3IgbWVzc2FnZSBidWZmZXIgYWxsb2NhdGlvbgorCSAqICAgICAgbm90aWZpY2F0aW9uIHR5cGUgdG8gdXNlIHdoZW4gbWVzc2FnZSBpcyByZWNlaXZlZAorCSAqICAgICAgbGVuZ3RoIG9mIG1lc3NhZ2UgYXJnIGRhdGEKKwkgKiAgICAgIG1lc3NhZ2UgYXJncyBkYXRhCisJICoKKwkgKiAgVGFzayBBcmdzIChpZiB0YXNrIG9yIHNvY2tldCBub2RlKToKKwkgKiAgICAgIHByaW9yaXR5CisJICogICAgICBzdGFjayBzaXplCisJICogICAgICBzeXN0ZW0gc3RhY2sgc2l6ZQorCSAqICAgICAgc3RhY2sgc2VnbWVudAorCSAqICAgICAgbWlzYworCSAqICAgICAgbnVtYmVyIG9mIGlucHV0IHN0cmVhbXMKKwkgKiAgICAgIHBTVFJNSW5EZWZbXSAtIG9mZnNldHMgb2YgU1RSTSBkZWZpbml0aW9ucyBmb3IgaW5wdXQgc3RyZWFtcworCSAqICAgICAgbnVtYmVyIG9mIG91dHB1dCBzdHJlYW1zCisJICogICAgICBwU1RSTU91dERlZltdIC0gb2Zmc2V0cyBvZiBTVFJNIGRlZmluaXRpb25zIGZvciBvdXRwdXQKKwkgKiAgICAgIHN0cmVhbXMKKwkgKiAgICAgIFNUUk1JbkRlZltdIC0gYXJyYXkgb2YgU1RSTSBkZWZpbml0aW9ucyBmb3IgaW5wdXQgc3RyZWFtcworCSAqICAgICAgU1RSTU91dERlZltdIC0gYXJyYXkgb2YgU1RSTSBkZWZpbml0aW9ucyBmb3Igb3V0cHV0IHN0cmVhbXMKKwkgKgorCSAqICBTb2NrZXQgQXJncyAoaWYgREFJUyBzb2NrZXQgbm9kZSk6CisJICoKKwkgKi8KKwlpZiAoIXN0YXR1cykgeworCQl0b3RhbCA9IDA7CS8qIFRvdGFsIG51bWJlciBvZiB3b3JkcyBpbiBidWZmZXIgc28gZmFyICovCisJCXBkd19idWYgPSAocm1zX3dvcmQgKikgZGlzcF9vYmotPnBidWY7CisJCXJtc19jbWQgPSAoc3RydWN0IHJtc19jb21tYW5kICopcGR3X2J1ZjsKKwkJcm1zX2NtZC0+ZnhuID0gKHJtc193b3JkKSAocm1zX2Z4bik7CisJCXJtc19jbWQtPmFyZzEgPSAocm1zX3dvcmQpICh1bF9jcmVhdGVfZnhuKTsKKwkJaWYgKG5vZGVfZ2V0X2xvYWRfdHlwZShobm9kZSkgPT0gTkxEUl9EWU5BTUlDTE9BRCkgeworCQkJLyogRmx1c2ggSUNBQ0hFIG9uIExvYWQgKi8KKwkJCXJtc19jbWQtPmFyZzIgPSAxOwkvKiBkdW1teSBhcmd1bWVudCAqLworCQl9IGVsc2UgeworCQkJLyogRG8gbm90IGZsdXNoIElDQUNIRSAqLworCQkJcm1zX2NtZC0+YXJnMiA9IDA7CS8qIGR1bW15IGFyZ3VtZW50ICovCisJCX0KKwkJcm1zX2NtZC0+ZGF0YSA9IG5vZGVfZ2V0X3R5cGUoaG5vZGUpOworCQkvKgorCQkgKiAgYXJnc19vZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSBmaWVsZCBpbiBzdHJ1Y3QKKwkJICogIHJtc19jb21tYW5kIHN0cnVjdHVyZS4gV2UgbmVlZCB0aGlzIHRvIGNhbGN1bGF0ZSBzdHJlYW0KKwkJICogIGRlZmluaXRpb24gb2Zmc2V0cy4KKwkJICovCisJCWFyZ3Nfb2Zmc2V0ID0gMzsKKwkJdG90YWwgKz0gc2l6ZW9mKHN0cnVjdCBybXNfY29tbWFuZCkgLyBzaXplb2Yocm1zX3dvcmQpOworCQkvKiBNZXNzYWdlIGFyZ3MgKi8KKwkJcG1zZ19hcmdzID0gKHN0cnVjdCBybXNfbXNnX2FyZ3MgKikocGR3X2J1ZiArIHRvdGFsKTsKKwkJcG1zZ19hcmdzLT5tYXhfbXNncyA9IG5vZGVfbXNnX2FyZ3MubWF4X21zZ3M7CisJCXBtc2dfYXJncy0+c2VnaWQgPSBub2RlX21zZ19hcmdzLnNlZ19pZDsKKwkJcG1zZ19hcmdzLT5ub3RpZnlfdHlwZSA9IG5vZGVfbXNnX2FyZ3Mubm90aWZ5X3R5cGU7CisJCXBtc2dfYXJncy0+YXJnX2xlbmd0aCA9IG5vZGVfbXNnX2FyZ3MuYXJnX2xlbmd0aDsKKwkJdG90YWwgKz0gc2l6ZW9mKHN0cnVjdCBybXNfbXNnX2FyZ3MpIC8gc2l6ZW9mKHJtc193b3JkKSAtIDE7CisJCW1lbWNweShwZHdfYnVmICsgdG90YWwsIG5vZGVfbXNnX2FyZ3MucGRhdGEsCisJCSAgICAgICBub2RlX21zZ19hcmdzLmFyZ19sZW5ndGgpOworCQl0b3RhbCArPSBkd19sZW5ndGg7CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBJZiBub2RlIGlzIGEgdGFzayBub2RlLCBjb3B5IHRhc2sgY3JlYXRlIGFyZ3VtZW50cyBpbnRvICBidWZmZXIgKi8KKwlpZiAobm9kZV90eXBlID09IE5PREVfVEFTSyB8fCBub2RlX3R5cGUgPT0gTk9ERV9EQUlTU09DS0VUKSB7CisJCXRhc2tfYXJnX29iaiA9IHBhcmdzLT5hc2EudGFza19hcmdfb2JqOworCQl0YXNrX2FyZ3Nfb2Zmc2V0ID0gdG90YWw7CisJCXRvdGFsICs9IHNpemVvZihzdHJ1Y3Qgcm1zX21vcmVfdGFza19hcmdzKSAvIHNpemVvZihybXNfd29yZCkgKworCQkgICAgMSArIHRhc2tfYXJnX29iai5udW1faW5wdXRzICsgdGFza19hcmdfb2JqLm51bV9vdXRwdXRzOworCQkvKiBDb3B5IHRhc2sgYXJndW1lbnRzICovCisJCWlmICh0b3RhbCA8IG1heCkgeworCQkJdG90YWwgPSB0YXNrX2FyZ3Nfb2Zmc2V0OworCQkJbW9yZV90YXNrX2FyZ3MgPSAoc3RydWN0IHJtc19tb3JlX3Rhc2tfYXJncyAqKShwZHdfYnVmICsKKwkJCQkJCQkJICAgICAgIHRvdGFsKTsKKwkJCS8qCisJCQkgKiBHZXQgc29tZSBpbXBvcnRhbnQgaW5mbyBhYm91dCB0aGUgbm9kZS4gTm90ZSB0aGF0IHdlCisJCQkgKiBkb24ndCBqdXN0IHJlYWNoIGludG8gdGhlIGhub2RlIHN0cnVjdCBiZWNhdXNlCisJCQkgKiB0aGF0IHdvdWxkIGJyZWFrIHRoZSBub2RlIG9iamVjdCdzIGFic3RyYWN0aW9uLgorCQkJICovCisJCQlnZXRfbm9kZV9pbmZvKGhub2RlLCAmbm9kZV9pbmZvKTsKKwkJCW1vcmVfdGFza19hcmdzLT5wcmlvcml0eSA9IG5vZGVfaW5mby5leGVjdXRpb25fcHJpb3JpdHk7CisJCQltb3JlX3Rhc2tfYXJncy0+c3RhY2tfc2l6ZSA9IHRhc2tfYXJnX29iai5zdGFja19zaXplOworCQkJbW9yZV90YXNrX2FyZ3MtPnN5c3N0YWNrX3NpemUgPQorCQkJICAgIHRhc2tfYXJnX29iai5zeXNfc3RhY2tfc2l6ZTsKKwkJCW1vcmVfdGFza19hcmdzLT5zdGFja19zZWcgPSB0YXNrX2FyZ19vYmouc3RhY2tfc2VnOworCQkJbW9yZV90YXNrX2FyZ3MtPmhlYXBfYWRkciA9IHRhc2tfYXJnX29iai51ZHNwX2hlYXBfYWRkcjsKKwkJCW1vcmVfdGFza19hcmdzLT5oZWFwX3NpemUgPSB0YXNrX2FyZ19vYmouaGVhcF9zaXplOworCQkJbW9yZV90YXNrX2FyZ3MtPm1pc2MgPSB0YXNrX2FyZ19vYmoudWxfZGFpc19hcmc7CisJCQltb3JlX3Rhc2tfYXJncy0+bnVtX2lucHV0X3N0cmVhbXMgPQorCQkJICAgIHRhc2tfYXJnX29iai5udW1faW5wdXRzOworCQkJdG90YWwgKz0KKwkJCSAgICBzaXplb2Yoc3RydWN0IHJtc19tb3JlX3Rhc2tfYXJncykgLworCQkJICAgIHNpemVvZihybXNfd29yZCk7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiB1ZHNwX2hlYXBfYWRkciAleCwgaGVhcF9zaXplICV4XG4iLAorCQkJCV9fZnVuY19fLCB0YXNrX2FyZ19vYmoudWRzcF9oZWFwX2FkZHIsCisJCQkJdGFza19hcmdfb2JqLmhlYXBfc2l6ZSk7CisJCQkvKiBLZWVwIHRyYWNrIG9mIHBTSU9JbkRlZltdIGFuZCBwU0lPT3V0RGVmW10KKwkJCSAqIHBvc2l0aW9ucyBpbiB0aGUgYnVmZmVyLCBzaW5jZSB0aGlzIG5lZWRzIHRvIGJlCisJCQkgKiBmaWxsZWQgaW4gbGF0ZXIuICovCisJCQlzaW9faW5fZGVmX29mZnNldCA9IHRvdGFsOworCQkJdG90YWwgKz0gdGFza19hcmdfb2JqLm51bV9pbnB1dHM7CisJCQlwZHdfYnVmW3RvdGFsKytdID0gdGFza19hcmdfb2JqLm51bV9vdXRwdXRzOworCQkJc2lvX291dF9kZWZfb2Zmc2V0ID0gdG90YWw7CisJCQl0b3RhbCArPSB0YXNrX2FyZ19vYmoubnVtX291dHB1dHM7CisJCQlzaW9fZGVmc19vZmZzZXQgPSB0b3RhbDsKKwkJCS8qIEZpbGwgU0lPIGRlZnMgYW5kIG9mZnNldHMgKi8KKwkJCW9mZnNldCA9IHNpb19kZWZzX29mZnNldDsKKwkJCWZvciAoaSA9IDA7IGkgPCB0YXNrX2FyZ19vYmoubnVtX2lucHV0czsgaSsrKSB7CisJCQkJaWYgKHN0YXR1cykKKwkJCQkJYnJlYWs7CisKKwkJCQlwZHdfYnVmW3Npb19pbl9kZWZfb2Zmc2V0ICsgaV0gPQorCQkJCSAgICAob2Zmc2V0IC0gYXJnc19vZmZzZXQpCisJCQkJICAgICogKHNpemVvZihybXNfd29yZCkgLyBEU1BXT1JEU0laRSk7CisJCQkJc3RybV9kZWYgPSB0YXNrX2FyZ19vYmouc3RybV9pbl9kZWZbaV07CisJCQkJc3RhdHVzID0KKwkJCQkgICAgZmlsbF9zdHJlYW1fZGVmKHBkd19idWYsICZ0b3RhbCwgb2Zmc2V0LAorCQkJCQkJICAgIHN0cm1fZGVmLCBtYXgsCisJCQkJCQkgICAgY2hhcnNfaW5fcm1zX3dvcmQpOworCQkJCW9mZnNldCA9IHRvdGFsOworCQkJfQorCQkJZm9yIChpID0gMDsgKGkgPCB0YXNrX2FyZ19vYmoubnVtX291dHB1dHMpICYmCisJCQkgICAgICghc3RhdHVzKTsgaSsrKSB7CisJCQkJcGR3X2J1ZltzaW9fb3V0X2RlZl9vZmZzZXQgKyBpXSA9CisJCQkJICAgIChvZmZzZXQgLSBhcmdzX29mZnNldCkKKwkJCQkgICAgKiAoc2l6ZW9mKHJtc193b3JkKSAvIERTUFdPUkRTSVpFKTsKKwkJCQlzdHJtX2RlZiA9IHRhc2tfYXJnX29iai5zdHJtX291dF9kZWZbaV07CisJCQkJc3RhdHVzID0KKwkJCQkgICAgZmlsbF9zdHJlYW1fZGVmKHBkd19idWYsICZ0b3RhbCwgb2Zmc2V0LAorCQkJCQkJICAgIHN0cm1fZGVmLCBtYXgsCisJCQkJCQkgICAgY2hhcnNfaW5fcm1zX3dvcmQpOworCQkJCW9mZnNldCA9IHRvdGFsOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQXJncyB3b24ndCBmaXQgKi8KKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cykgeworCQl1bF9ieXRlcyA9IHRvdGFsICogc2l6ZW9mKHJtc193b3JkKTsKKwkJREJDX0FTU0VSVCh1bF9ieXRlcyA8IChSTVNfQ09NTUFOREJVRlNJWkUgKiBzaXplb2Yocm1zX3dvcmQpKSk7CisJCXN0YXR1cyA9IHNlbmRfbWVzc2FnZShkaXNwX29iaiwgbm9kZV9nZXRfdGltZW91dChobm9kZSksCisJCQkJICAgICAgdWxfYnl0ZXMsIG5vZGVfZW52KTsKKwkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQkvKgorCQkJICogTWVzc2FnZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgZnJvbSBSTVMuCisJCQkgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgTm9kZSdzIGNyZWF0ZSBmdW5jdGlvbgorCQkJICogb24gdGhlIERTUC1zaWRlCisJCQkgKi8KKwkJCXN0YXR1cyA9ICgoKHJtc193b3JkICopIChkaXNwX29iai0+cGJ1ZikpWzBdKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IERTUC1zaWRlIGZhaWxlZDogMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCX0KKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRpc3Bfbm9kZV9kZWxldGUgPT09PT09PT0KKyAqICBwdXJwb3NlOgorICogICAgICBEZWxldGUgYSBub2RlIG9uIHRoZSBEU1AgYnkgcmVtb3RlbHkgY2FsbGluZyB0aGUgbm9kZSdzIGRlbGV0ZSBmdW5jdGlvbi4KKyAqCisgKi8KK2ludCBkaXNwX25vZGVfZGVsZXRlKHN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmosCisJCQkgICAgc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyIHJtc19meG4sCisJCQkgICAgdTMyIHVsX2RlbGV0ZV9meG4sIG5vZGVlbnYgbm9kZV9lbnYpCit7CisJdTMyIGR3X2FyZzsKKwlzdHJ1Y3Qgcm1zX2NvbW1hbmQgKnJtc19jbWQ7CisJaW50IHN0YXR1cyA9IDA7CisJdTggZGV2X3R5cGU7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoZGlzcF9vYmopOworCURCQ19SRVFVSVJFKGhub2RlICE9IE5VTEwpOworCisJc3RhdHVzID0gZGV2X2dldF9kZXZfdHlwZShkaXNwX29iai0+aGRldl9vYmosICZkZXZfdHlwZSk7CisKKwlpZiAoIXN0YXR1cykgeworCisJCWlmIChkZXZfdHlwZSA9PSBEU1BfVU5JVCkgeworCisJCQkvKgorCQkJICogIEZpbGwgaW4gYnVmZmVyIHRvIHNlbmQgdG8gUk1TCisJCQkgKi8KKwkJCXJtc19jbWQgPSAoc3RydWN0IHJtc19jb21tYW5kICopZGlzcF9vYmotPnBidWY7CisJCQlybXNfY21kLT5meG4gPSAocm1zX3dvcmQpIChybXNfZnhuKTsKKwkJCXJtc19jbWQtPmFyZzEgPSAocm1zX3dvcmQpIG5vZGVfZW52OworCQkJcm1zX2NtZC0+YXJnMiA9IChybXNfd29yZCkgKHVsX2RlbGV0ZV9meG4pOworCQkJcm1zX2NtZC0+ZGF0YSA9IG5vZGVfZ2V0X3R5cGUoaG5vZGUpOworCisJCQlzdGF0dXMgPSBzZW5kX21lc3NhZ2UoZGlzcF9vYmosIG5vZGVfZ2V0X3RpbWVvdXQoaG5vZGUpLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHJtc19jb21tYW5kKSwKKwkJCQkJICAgICAgJmR3X2FyZyk7CisJCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCQkvKgorCQkJCSAqIE1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGZyb20gUk1TLgorCQkJCSAqIFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBOb2RlJ3MgZGVsZXRlCisJCQkJICogZnVuY3Rpb24gb24gdGhlIERTUC1zaWRlCisJCQkJICovCisJCQkJc3RhdHVzID0gKCgocm1zX3dvcmQgKikgKGRpc3Bfb2JqLT5wYnVmKSlbMF0pOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBEU1Atc2lkZSBmYWlsZWQ6ICIKKwkJCQkJCSIweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGlzcF9ub2RlX3J1biA9PT09PT09PQorICogIHB1cnBvc2U6CisgKiAgICAgIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhIG5vZGUncyBleGVjdXRlIHBoYXNlLCBvciByZXN1bWUgZXhlY3V0aW9uIG9mIGEgbm9kZQorICogICAgICB0aGF0IGhhcyBiZWVuIHN1c3BlbmRlZCAodmlhIERJU1BfTm9kZVBhdXNlKCkpIG9uIHRoZSBEU1AuCisgKi8KK2ludCBkaXNwX25vZGVfcnVuKHN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmosCisJCQkgc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyIHJtc19meG4sCisJCQkgdTMyIHVsX2V4ZWN1dGVfZnhuLCBub2RlZW52IG5vZGVfZW52KQoreworCXUzMiBkd19hcmc7CisJc3RydWN0IHJtc19jb21tYW5kICpybXNfY21kOworCWludCBzdGF0dXMgPSAwOworCXU4IGRldl90eXBlOworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkaXNwX29iaik7CisJREJDX1JFUVVJUkUoaG5vZGUgIT0gTlVMTCk7CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2Rldl90eXBlKGRpc3Bfb2JqLT5oZGV2X29iaiwgJmRldl90eXBlKTsKKworCWlmICghc3RhdHVzKSB7CisKKwkJaWYgKGRldl90eXBlID09IERTUF9VTklUKSB7CisKKwkJCS8qCisJCQkgKiAgRmlsbCBpbiBidWZmZXIgdG8gc2VuZCB0byBSTVMuCisJCQkgKi8KKwkJCXJtc19jbWQgPSAoc3RydWN0IHJtc19jb21tYW5kICopZGlzcF9vYmotPnBidWY7CisJCQlybXNfY21kLT5meG4gPSAocm1zX3dvcmQpIChybXNfZnhuKTsKKwkJCXJtc19jbWQtPmFyZzEgPSAocm1zX3dvcmQpIG5vZGVfZW52OworCQkJcm1zX2NtZC0+YXJnMiA9IChybXNfd29yZCkgKHVsX2V4ZWN1dGVfZnhuKTsKKwkJCXJtc19jbWQtPmRhdGEgPSBub2RlX2dldF90eXBlKGhub2RlKTsKKworCQkJc3RhdHVzID0gc2VuZF9tZXNzYWdlKGRpc3Bfb2JqLCBub2RlX2dldF90aW1lb3V0KGhub2RlKSwKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybXNfY29tbWFuZCksCisJCQkJCSAgICAgICZkd19hcmcpOworCQkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBNZXNzYWdlIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBmcm9tIFJNUy4KKwkJCQkgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgTm9kZSdzIGV4ZWN1dGUKKwkJCQkgKiBmdW5jdGlvbiBvbiB0aGUgRFNQLXNpZGUKKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSAoKChybXNfd29yZCAqKSAoZGlzcF9vYmotPnBidWYpKVswXSk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IERTUC1zaWRlIGZhaWxlZDogIgorCQkJCQkJIjB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQkJfQorCisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGRlbGV0ZV9kaXNwID09PT09PT09CisgKiAgcHVycG9zZToKKyAqICAgICAgRnJlZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoZSBkaXNwYXRjaGVyLgorICovCitzdGF0aWMgdm9pZCBkZWxldGVfZGlzcChzdHJ1Y3QgZGlzcF9vYmplY3QgKmRpc3Bfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCisJaWYgKGRpc3Bfb2JqKSB7CisJCWludGZfZnhucyA9IGRpc3Bfb2JqLT5pbnRmX2Z4bnM7CisKKwkJLyogRnJlZSBOb2RlIERpc3BhdGNoZXIgcmVzb3VyY2VzICovCisJCWlmIChkaXNwX29iai0+Y2hubF9mcm9tX2RzcCkgeworCQkJLyogQ2hhbm5lbCBjbG9zZSBjYW4gZmFpbCBvbmx5IGlmIHRoZSBjaGFubmVsIGhhbmRsZQorCQkJICogaXMgaW52YWxpZC4gKi8KKwkJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fY2hubF9jbG9zZSkKKwkJCSAgICAoZGlzcF9vYmotPmNobmxfZnJvbV9kc3ApOworCQkJaWYgKHN0YXR1cykgeworCQkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEZhaWxlZCB0byBjbG9zZSBjaGFubmVsICIKKwkJCQkJImZyb20gUk1TOiAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlpZiAoZGlzcF9vYmotPmNobmxfdG9fZHNwKSB7CisJCQlzdGF0dXMgPQorCQkJICAgICgqaW50Zl9meG5zLT5wZm5fY2hubF9jbG9zZSkgKGRpc3Bfb2JqLT4KKwkJCQkJCQkgIGNobmxfdG9fZHNwKTsKKwkJCWlmIChzdGF0dXMpIHsKKwkJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gY2xvc2UgY2hhbm5lbCB0byIKKwkJCQkJIiBSTVM6IDB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQkJfQorCQl9CisJCWtmcmVlKGRpc3Bfb2JqLT5wYnVmKTsKKworCQlrZnJlZShkaXNwX29iaik7CisJfQorfQorCisvKgorICogID09PT09PT09IGZpbGxfc3RyZWFtX2RlZiA9PT09PT09PQorICogIHB1cnBvc2U6CisgKiAgICAgIEZpbGxzIHN0cmVhbSBkZWZpbml0aW9ucy4KKyAqLworc3RhdGljIGludCBmaWxsX3N0cmVhbV9kZWYocm1zX3dvcmQgKnBkd19idWYsIHUzMiAqcHRvdGFsLCB1MzIgb2Zmc2V0LAorCQkJCSAgc3RydWN0IG5vZGVfc3RybWRlZiBzdHJtX2RlZiwgdTMyIG1heCwKKwkJCQkgIHUzMiBjaGFyc19pbl9ybXNfd29yZCkKK3sKKwlzdHJ1Y3Qgcm1zX3N0cm1fZGVmICpzdHJtX2RlZl9vYmo7CisJdTMyIHRvdGFsID0gKnB0b3RhbDsKKwl1MzIgbmFtZV9sZW47CisJdTMyIGR3X2xlbmd0aDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICh0b3RhbCArIHNpemVvZihzdHJ1Y3Qgcm1zX3N0cm1fZGVmKSAvIHNpemVvZihybXNfd29yZCkgPj0gbWF4KSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9IGVsc2UgeworCQlzdHJtX2RlZl9vYmogPSAoc3RydWN0IHJtc19zdHJtX2RlZiAqKShwZHdfYnVmICsgdG90YWwpOworCQlzdHJtX2RlZl9vYmotPmJ1ZnNpemUgPSBzdHJtX2RlZi5idWZfc2l6ZTsKKwkJc3RybV9kZWZfb2JqLT5uYnVmcyA9IHN0cm1fZGVmLm51bV9idWZzOworCQlzdHJtX2RlZl9vYmotPnNlZ2lkID0gc3RybV9kZWYuc2VnX2lkOworCQlzdHJtX2RlZl9vYmotPmFsaWduID0gc3RybV9kZWYuYnVmX2FsaWdubWVudDsKKwkJc3RybV9kZWZfb2JqLT50aW1lb3V0ID0gc3RybV9kZWYudXRpbWVvdXQ7CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJLyoKKwkJICogIFNpbmNlIHdlIGhhdmVuJ3QgYWRkZWQgdGhlIGRldmljZSBuYW1lIHlldCwgc3VidHJhY3QKKwkJICogIDEgZnJvbSB0b3RhbC4KKwkJICovCisJCXRvdGFsICs9IHNpemVvZihzdHJ1Y3Qgcm1zX3N0cm1fZGVmKSAvIHNpemVvZihybXNfd29yZCkgLSAxOworCQlEQkNfUkVRVUlSRShzdHJtX2RlZi5zel9kZXZpY2UpOworCQlkd19sZW5ndGggPSBzdHJsZW4oc3RybV9kZWYuc3pfZGV2aWNlKSArIDE7CisKKwkJLyogTnVtYmVyIG9mIFJNU19XT1JEUyBuZWVkZWQgdG8gaG9sZCBkZXZpY2UgbmFtZSAqLworCQluYW1lX2xlbiA9CisJCSAgICAoZHdfbGVuZ3RoICsgY2hhcnNfaW5fcm1zX3dvcmQgLSAxKSAvIGNoYXJzX2luX3Jtc193b3JkOworCisJCWlmICh0b3RhbCArIG5hbWVfbGVuID49IG1heCkgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqICBaZXJvIG91dCBsYXN0IHdvcmQsIHNpbmNlIHRoZSBkZXZpY2UgbmFtZSBtYXkgbm90CisJCQkgKiAgZXh0ZW5kIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGlzIHdvcmQuCisJCQkgKi8KKwkJCXBkd19idWZbdG90YWwgKyBuYW1lX2xlbiAtIDFdID0gMDsKKwkJCS8qKiBUT0RPIFVTRSBTRVJWSUNFUyAqICovCisJCQltZW1jcHkocGR3X2J1ZiArIHRvdGFsLCBzdHJtX2RlZi5zel9kZXZpY2UsIGR3X2xlbmd0aCk7CisJCQl0b3RhbCArPSBuYW1lX2xlbjsKKwkJCSpwdG90YWwgPSB0b3RhbDsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc2VuZF9tZXNzYWdlID09PT09PQorICogIFNlbmQgY29tbWFuZCBtZXNzYWdlIHRvIFJNUywgZ2V0IHJlcGx5IGZyb20gUk1TLgorICovCitzdGF0aWMgaW50IHNlbmRfbWVzc2FnZShzdHJ1Y3QgZGlzcF9vYmplY3QgKmRpc3Bfb2JqLCB1MzIgdGltZW91dCwKKwkJCSAgICAgICB1MzIgdWxfYnl0ZXMsIHUzMiAqcGR3X2FyZykKK3sKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqOworCXUzMiBkd19hcmcgPSAwOworCXU4ICpwYnVmOworCXN0cnVjdCBjaG5sX2lvYyBjaG5sX2lvY19vYmo7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShwZHdfYXJnICE9IE5VTEwpOworCisJKnBkd19hcmcgPSAodTMyKSBOVUxMOworCWludGZfZnhucyA9IGRpc3Bfb2JqLT5pbnRmX2Z4bnM7CisJY2hubF9vYmogPSBkaXNwX29iai0+Y2hubF90b19kc3A7CisJcGJ1ZiA9IGRpc3Bfb2JqLT5wYnVmOworCisJLyogU2VuZCB0aGUgY29tbWFuZCAqLworCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fY2hubF9hZGRfaW9fcmVxKSAoY2hubF9vYmosIHBidWYsIHVsX2J5dGVzLCAwLAorCQkJCQkJICAgIDBMLCBkd19hcmcpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlzdGF0dXMgPQorCSAgICAoKmludGZfZnhucy0+cGZuX2NobmxfZ2V0X2lvYykgKGNobmxfb2JqLCB0aW1lb3V0LCAmY2hubF9pb2Nfb2JqKTsKKwlpZiAoIXN0YXR1cykgeworCQlpZiAoIUNITkxfSVNfSU9fQ09NUExFVEUoY2hubF9pb2Nfb2JqKSkgeworCQkJaWYgKENITkxfSVNfVElNRURfT1VUKGNobmxfaW9jX29iaikpCisJCQkJc3RhdHVzID0gLUVUSU1FOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCX0KKwkvKiBHZXQgdGhlIHJlcGx5ICovCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCWNobmxfb2JqID0gZGlzcF9vYmotPmNobmxfZnJvbV9kc3A7CisJdWxfYnl0ZXMgPSBSRVBMWVNJWkU7CisJc3RhdHVzID0gKCppbnRmX2Z4bnMtPnBmbl9jaG5sX2FkZF9pb19yZXEpIChjaG5sX29iaiwgcGJ1ZiwgdWxfYnl0ZXMsCisJCQkJCQkgICAgMCwgMEwsIGR3X2FyZyk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCXN0YXR1cyA9CisJICAgICgqaW50Zl9meG5zLT5wZm5fY2hubF9nZXRfaW9jKSAoY2hubF9vYmosIHRpbWVvdXQsICZjaG5sX2lvY19vYmopOworCWlmICghc3RhdHVzKSB7CisJCWlmIChDSE5MX0lTX1RJTUVEX09VVChjaG5sX2lvY19vYmopKSB7CisJCQlzdGF0dXMgPSAtRVRJTUU7CisJCX0gZWxzZSBpZiAoY2hubF9pb2Nfb2JqLmJ5dGVfc2l6ZSA8IHVsX2J5dGVzKSB7CisJCQkvKiBEaWQgbm90IGdldCBhbGwgb2YgdGhlIHJlcGx5IGZyb20gdGhlIFJNUyAqLworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9IGVsc2UgeworCQkJaWYgKENITkxfSVNfSU9fQ09NUExFVEUoY2hubF9pb2Nfb2JqKSkgeworCQkJCURCQ19BU1NFUlQoY2hubF9pb2Nfb2JqLnBidWYgPT0gcGJ1Zik7CisJCQkJc3RhdHVzID0gKCooKHJtc193b3JkICopIGNobmxfaW9jX29iai5wYnVmKSk7CisJCQkJKnBkd19hcmcgPQorCQkJCSAgICAoKChybXNfd29yZCAqKSAoY2hubF9pb2Nfb2JqLnBidWYpKVsxXSk7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJCX0KKwkJfQorCX0KK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOGRlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnYuYwpAQCAtMCwwICsxLDkyOSBAQAorLyoKKyAqIGRydi5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIERTUC9CSU9TIEJyaWRnZSByZXNvdXJjZSBhbGxvY2F0aW9uIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9saXN0Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rydi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9ub2RlLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Byb2MuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3RybS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ub2RlcHJpdi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BjaG5sLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Jlc291cmNlY2xlYW51cC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVmaW5lcywgRGF0YSBTdHJ1Y3R1cmVzLCBUeXBlZGVmcyAqLworc3RydWN0IGRydl9vYmplY3QgeworCXN0cnVjdCBsc3RfbGlzdCAqZGV2X2xpc3Q7CisJc3RydWN0IGxzdF9saXN0ICpkZXZfbm9kZV9zdHJpbmc7Cit9OworCisvKgorICogIFRoaXMgaXMgdGhlIERldmljZSBFeHRlbnNpb24uIE5hbWVkIHdpdGggdGhlIFByZWZpeAorICogIERSVl8gc2luY2UgaXQgaXMgbGl2aW5nIGluIHRoaXMgbW9kdWxlCisgKi8KK3N0cnVjdCBkcnZfZXh0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJY2hhciBzel9zdHJpbmdbTUFYUkVHUEFUSExFTkdUSF07Cit9OworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFscyAqLworc3RhdGljIHMzMiByZWZzOworc3RhdGljIGJvb2wgZXh0X3BoeXNfbWVtX3Bvb2xfZW5hYmxlZDsKK3N0cnVjdCBleHRfcGh5c19tZW1fcG9vbCB7CisJdTMyIHBoeXNfbWVtX2Jhc2U7CisJdTMyIHBoeXNfbWVtX3NpemU7CisJdTMyIHZpcnRfbWVtX2Jhc2U7CisJdTMyIG5leHRfcGh5c19hbGxvY19wdHI7Cit9Oworc3RhdGljIHN0cnVjdCBleHRfcGh5c19tZW1fcG9vbCBleHRfbWVtX3Bvb2w7CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzICovCitzdGF0aWMgaW50IHJlcXVlc3RfYnJpZGdlX3Jlc291cmNlcyhzdHJ1Y3QgY2ZnX2hvc3RyZXMgKnJlcyk7CisKKworLyogR1BQIFBST0NFU1MgQ0xFQU5VUCBDT0RFICovCisKK3N0YXRpYyBpbnQgZHJ2X3Byb2NfZnJlZV9ub2RlX3JlcyhpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpOworCisvKiBBbGxvY2F0ZSBhbmQgYWRkIGEgbm9kZSByZXNvdXJjZSBlbGVtZW50CisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gLk5vZGVfQWxsb2NhdGUuICovCitpbnQgZHJ2X2luc2VydF9ub2RlX3Jlc19lbGVtZW50KHZvaWQgKmhub2RlLCB2b2lkICpub2RlX3Jlc291cmNlLAorCQkJCSAgICAgICB2b2lkICpwcm9jZXNzX2N0eHQpCit7CisJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqKm5vZGVfcmVzX29iaiA9CisJICAgIChzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICoqKW5vZGVfcmVzb3VyY2U7CisJc3RydWN0IHByb2Nlc3NfY29udGV4dCAqY3R4dCA9IChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJvY2Vzc19jdHh0OworCWludCBzdGF0dXMgPSAwOworCWludCByZXR2YWw7CisKKwkqbm9kZV9yZXNfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vZGVfcmVzX29iamVjdCksIEdGUF9LRVJORUwpOworCWlmICghKm5vZGVfcmVzX29iaikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCSgqbm9kZV9yZXNfb2JqKS0+aG5vZGUgPSBobm9kZTsKKwlyZXR2YWwgPSBpZHJfZ2V0X25ldyhjdHh0LT5ub2RlX2lkLCAqbm9kZV9yZXNfb2JqLAorCQkJCQkJJigqbm9kZV9yZXNfb2JqKS0+aWQpOworCWlmIChyZXR2YWwgPT0gLUVBR0FJTikgeworCQlpZiAoIWlkcl9wcmVfZ2V0KGN0eHQtPm5vZGVfaWQsIEdGUF9LRVJORUwpKSB7CisJCQlwcl9lcnIoIiVzOiBPVVQgT0YgTUVNT1JZXG4iLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCisJCXJldHZhbCA9IGlkcl9nZXRfbmV3KGN0eHQtPm5vZGVfaWQsICpub2RlX3Jlc19vYmosCisJCQkJCQkmKCpub2RlX3Jlc19vYmopLT5pZCk7CisJfQorCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCIlczogRkFJTEVELCBJRFIgaXMgRlVMTFxuIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KK2Z1bmNfZW5kOgorCWlmIChzdGF0dXMpCisJCWtmcmVlKCpub2RlX3Jlc19vYmopOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmVsZWFzZSBhbGwgTm9kZSByZXNvdXJjZXMgYW5kIGl0cyBjb250ZXh0CisgKiBBY3R1YWwgTm9kZSBEZS1BbGxvY2F0aW9uICovCitzdGF0aWMgaW50IGRydl9wcm9jX2ZyZWVfbm9kZV9yZXMoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKmN0eHQgPSBkYXRhOworCWludCBzdGF0dXM7CisJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqbm9kZV9yZXNfb2JqID0gcDsKKwl1MzIgbm9kZV9zdGF0ZTsKKworCWlmIChub2RlX3Jlc19vYmotPm5vZGVfYWxsb2NhdGVkKSB7CisJCW5vZGVfc3RhdGUgPSBub2RlX2dldF9zdGF0ZShub2RlX3Jlc19vYmotPmhub2RlKTsKKwkJaWYgKG5vZGVfc3RhdGUgPD0gTk9ERV9ERUxFVElORykgeworCQkJaWYgKChub2RlX3N0YXRlID09IE5PREVfUlVOTklORykgfHwKKwkJCSAgICAobm9kZV9zdGF0ZSA9PSBOT0RFX1BBVVNFRCkgfHwKKwkJCSAgICAobm9kZV9zdGF0ZSA9PSBOT0RFX1RFUk1JTkFUSU5HKSkKKwkJCQlub2RlX3Rlcm1pbmF0ZQorCQkJCSAgICAobm9kZV9yZXNfb2JqLT5obm9kZSwgJnN0YXR1cyk7CisKKwkJCW5vZGVfZGVsZXRlKG5vZGVfcmVzX29iaiwgY3R4dCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVsZWFzZSBhbGwgTWFwcGVkIGFuZCBSZXNlcnZlZCBETU0gcmVzb3VyY2VzICovCitpbnQgZHJ2X3JlbW92ZV9hbGxfZG1tX3Jlc19lbGVtZW50cyh2b2lkICpwcm9jZXNzX2N0eHQpCit7CisJc3RydWN0IHByb2Nlc3NfY29udGV4dCAqY3R4dCA9IChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopcHJvY2Vzc19jdHh0OworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkbW1fbWFwX29iamVjdCAqdGVtcF9tYXAsICptYXBfb2JqOworCXN0cnVjdCBkbW1fcnN2X29iamVjdCAqdGVtcF9yc3YsICpyc3Zfb2JqOworCisJLyogRnJlZSBETU0gbWFwcGVkIG1lbW9yeSByZXNvdXJjZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWFwX29iaiwgdGVtcF9tYXAsICZjdHh0LT5kbW1fbWFwX2xpc3QsIGxpbmspIHsKKwkJc3RhdHVzID0gcHJvY191bl9tYXAoY3R4dC0+aHByb2Nlc3NvciwKKwkJCQkgICAgICh2b2lkICopbWFwX29iai0+ZHNwX2FkZHIsIGN0eHQpOworCQlpZiAoc3RhdHVzKQorCQkJcHJfZXJyKCIlczogcHJvY191bl9tYXAgZmFpbGVkISIKKwkJCSAgICAgICAiIHN0YXR1cyA9IDB4JXhuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJfQorCisJLyogRnJlZSBETU0gcmVzZXJ2ZWQgbWVtb3J5IHJlc291cmNlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyc3Zfb2JqLCB0ZW1wX3JzdiwgJmN0eHQtPmRtbV9yc3ZfbGlzdCwgbGluaykgeworCQlzdGF0dXMgPSBwcm9jX3VuX3Jlc2VydmVfbWVtb3J5KGN0eHQtPmhwcm9jZXNzb3IsICh2b2lkICopCisJCQkJCQlyc3Zfb2JqLT5kc3BfcmVzZXJ2ZWRfYWRkciwKKwkJCQkJCWN0eHQpOworCQlpZiAoc3RhdHVzKQorCQkJcHJfZXJyKCIlczogcHJvY191bl9yZXNlcnZlX21lbW9yeSBmYWlsZWQhIgorCQkJICAgICAgICIgc3RhdHVzID0gMHgleG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVXBkYXRlIE5vZGUgYWxsb2NhdGlvbiBzdGF0dXMgKi8KK3ZvaWQgZHJ2X3Byb2Nfbm9kZV91cGRhdGVfc3RhdHVzKHZvaWQgKm5vZGVfcmVzb3VyY2UsIHMzMiBzdGF0dXMpCit7CisJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqbm9kZV9yZXNfb2JqID0KKwkgICAgKHN0cnVjdCBub2RlX3Jlc19vYmplY3QgKilub2RlX3Jlc291cmNlOworCURCQ19BU1NFUlQobm9kZV9yZXNvdXJjZSAhPSBOVUxMKTsKKwlub2RlX3Jlc19vYmotPm5vZGVfYWxsb2NhdGVkID0gc3RhdHVzOworfQorCisvKiBVcGRhdGUgTm9kZSBIZWFwIHN0YXR1cyAqLwordm9pZCBkcnZfcHJvY19ub2RlX3VwZGF0ZV9oZWFwX3N0YXR1cyh2b2lkICpub2RlX3Jlc291cmNlLCBzMzIgc3RhdHVzKQoreworCXN0cnVjdCBub2RlX3Jlc19vYmplY3QgKm5vZGVfcmVzX29iaiA9CisJICAgIChzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICopbm9kZV9yZXNvdXJjZTsKKwlEQkNfQVNTRVJUKG5vZGVfcmVzb3VyY2UgIT0gTlVMTCk7CisJbm9kZV9yZXNfb2JqLT5oZWFwX2FsbG9jYXRlZCA9IHN0YXR1czsKK30KKworLyogUmVsZWFzZSBhbGwgTm9kZSByZXNvdXJjZXMgYW5kIGl0cyBjb250ZXh0CisqIFRoaXMgaXMgY2FsbGVkIGZyb20gLmJyaWRnZV9yZWxlYXNlLgorICovCitpbnQgZHJ2X3JlbW92ZV9hbGxfbm9kZV9yZXNfZWxlbWVudHModm9pZCAqcHJvY2Vzc19jdHh0KQoreworCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKmN0eHQgPSBwcm9jZXNzX2N0eHQ7CisKKwlpZHJfZm9yX2VhY2goY3R4dC0+bm9kZV9pZCwgZHJ2X3Byb2NfZnJlZV9ub2RlX3JlcywgY3R4dCk7CisJaWRyX2Rlc3Ryb3koY3R4dC0+bm9kZV9pZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGUgdGhlIFNUUk0gcmVzb3VyY2UgZWxlbWVudAorKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0dWFsIHJlc291cmNlIGlzIGFsbG9jYXRlZAorICovCitpbnQgZHJ2X3Byb2NfaW5zZXJ0X3N0cm1fcmVzX2VsZW1lbnQodm9pZCAqc3RyZWFtX29iaiwKKwkJCQkJICAgIHZvaWQgKnN0cm1fcmVzLCB2b2lkICpwcm9jZXNzX2N0eHQpCit7CisJc3RydWN0IHN0cm1fcmVzX29iamVjdCAqKnBzdHJtX3JlcyA9CisJICAgIChzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICoqKXN0cm1fcmVzOworCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKmN0eHQgPSAoc3RydWN0IHByb2Nlc3NfY29udGV4dCAqKXByb2Nlc3NfY3R4dDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgcmV0dmFsOworCisJKnBzdHJtX3JlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJtX3Jlc19vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoKnBzdHJtX3JlcyA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJKCpwc3RybV9yZXMpLT5oc3RyZWFtID0gc3RyZWFtX29iajsKKwlyZXR2YWwgPSBpZHJfZ2V0X25ldyhjdHh0LT5zdHJlYW1faWQsICpwc3RybV9yZXMsCisJCQkJCQkmKCpwc3RybV9yZXMpLT5pZCk7CisJaWYgKHJldHZhbCA9PSAtRUFHQUlOKSB7CisJCWlmICghaWRyX3ByZV9nZXQoY3R4dC0+c3RyZWFtX2lkLCBHRlBfS0VSTkVMKSkgeworCQkJcHJfZXJyKCIlczogT1VUIE9GIE1FTU9SWVxuIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZnVuY19lbmQ7CisJCX0KKworCQlyZXR2YWwgPSBpZHJfZ2V0X25ldyhjdHh0LT5zdHJlYW1faWQsICpwc3RybV9yZXMsCisJCQkJCQkmKCpwc3RybV9yZXMpLT5pZCk7CisJfQorCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCIlczogRkFJTEVELCBJRFIgaXMgRlVMTFxuIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSAtRVBFUk07CisJfQorCitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRydl9wcm9jX2ZyZWVfc3RybV9yZXMoaW50IGlkLCB2b2lkICpwLCB2b2lkICpwcm9jZXNzX2N0eHQpCit7CisJc3RydWN0IHByb2Nlc3NfY29udGV4dCAqY3R4dCA9IHByb2Nlc3NfY3R4dDsKKwlzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICpzdHJtX3JlcyA9IHA7CisJc3RydWN0IHN0cmVhbV9pbmZvIHN0cm1faW5mbzsKKwlzdHJ1Y3QgZHNwX3N0cmVhbWluZm8gdXNlcjsKKwl1OCAqKmFwX2J1ZmZlciA9IE5VTEw7CisJdTggKmJ1Zl9wdHI7CisJdTMyIHVsX2J5dGVzOworCXUzMiBkd19hcmc7CisJczMyIHVsX2J1Zl9zaXplOworCisJaWYgKHN0cm1fcmVzLT5udW1fYnVmcykgeworCQlhcF9idWZmZXIgPSBrbWFsbG9jKChzdHJtX3Jlcy0+bnVtX2J1ZnMgKgorCQkJCSAgICAgICBzaXplb2YodTggKikpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGFwX2J1ZmZlcikgeworCQkJc3RybV9mcmVlX2J1ZmZlcihzdHJtX3JlcywKKwkJCQkJCSAgYXBfYnVmZmVyLAorCQkJCQkJICBzdHJtX3Jlcy0+bnVtX2J1ZnMsCisJCQkJCQkgIGN0eHQpOworCQkJa2ZyZWUoYXBfYnVmZmVyKTsKKwkJfQorCX0KKwlzdHJtX2luZm8udXNlcl9zdHJtID0gJnVzZXI7CisJdXNlci5udW1iZXJfYnVmc19pbl9zdHJlYW0gPSAwOworCXN0cm1fZ2V0X2luZm8oc3RybV9yZXMtPmhzdHJlYW0sICZzdHJtX2luZm8sIHNpemVvZihzdHJtX2luZm8pKTsKKwl3aGlsZSAodXNlci5udW1iZXJfYnVmc19pbl9zdHJlYW0tLSkKKwkJc3RybV9yZWNsYWltKHN0cm1fcmVzLT5oc3RyZWFtLCAmYnVmX3B0ciwgJnVsX2J5dGVzLAorCQkJICAgICAodTMyICopICZ1bF9idWZfc2l6ZSwgJmR3X2FyZyk7CisJc3RybV9jbG9zZShzdHJtX3JlcywgY3R4dCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2UgYWxsIFN0cmVhbSByZXNvdXJjZXMgYW5kIGl0cyBjb250ZXh0CisqIFRoaXMgaXMgY2FsbGVkIGZyb20gLmJyaWRnZV9yZWxlYXNlLgorICovCitpbnQgZHJ2X3JlbW92ZV9hbGxfc3RybV9yZXNfZWxlbWVudHModm9pZCAqcHJvY2Vzc19jdHh0KQoreworCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKmN0eHQgPSBwcm9jZXNzX2N0eHQ7CisKKwlpZHJfZm9yX2VhY2goY3R4dC0+c3RyZWFtX2lkLCBkcnZfcHJvY19mcmVlX3N0cm1fcmVzLCBjdHh0KTsKKwlpZHJfZGVzdHJveShjdHh0LT5zdHJlYW1faWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFVwZGF0aW5nIHRoZSBzdHJlYW0gcmVzb3VyY2UgZWxlbWVudCAqLworaW50IGRydl9wcm9jX3VwZGF0ZV9zdHJtX3Jlcyh1MzIgbnVtX2J1ZnMsIHZvaWQgKnN0cm1fcmVzb3VyY2VzKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBzdHJtX3Jlc19vYmplY3QgKipzdHJtX3JlcyA9CisJICAgIChzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICoqKXN0cm1fcmVzb3VyY2VzOworCisJKCpzdHJtX3JlcyktPm51bV9idWZzID0gbnVtX2J1ZnM7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogR1BQIFBST0NFU1MgQ0xFQU5VUCBDT0RFIEVORCAqLworCisvKgorICogID09PT09PT09ID0gZHJ2X2NyZWF0ZSA9PT09PT09PSA9CisgKiAgUHVycG9zZToKKyAqICAgICAgRFJWIE9iamVjdCBnZXRzIGNyZWF0ZWQgb25seSBvbmNlIGR1cmluZyBEcml2ZXIgTG9hZGluZy4KKyAqLworaW50IGRydl9jcmVhdGUoc3RydWN0IGRydl9vYmplY3QgKipkcnZfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iamVjdCA9IE5VTEw7CisKKwlEQkNfUkVRVUlSRShkcnZfb2JqICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXBkcnZfb2JqZWN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRydl9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGRydl9vYmplY3QpIHsKKwkJLyogQ3JlYXRlIGFuZCBJbml0aWFsaXplIExpc3Qgb2YgZGV2aWNlIG9iamVjdHMgKi8KKwkJcGRydl9vYmplY3QtPmRldl9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxzdF9saXN0KSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHBkcnZfb2JqZWN0LT5kZXZfbGlzdCkgeworCQkJLyogQ3JlYXRlIGFuZCBJbml0aWFsaXplIExpc3Qgb2YgZGV2aWNlIEV4dGVuc2lvbiAqLworCQkJcGRydl9vYmplY3QtPmRldl9ub2RlX3N0cmluZyA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGxzdF9saXN0KSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIShwZHJ2X29iamVjdC0+ZGV2X25vZGVfc3RyaW5nKSkgeworCQkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJCX0gZWxzZSB7CisJCQkJSU5JVF9MSVNUX0hFQUQoJnBkcnZfb2JqZWN0LT4KKwkJCQkJICAgICAgIGRldl9ub2RlX3N0cmluZy0+aGVhZCk7CisJCQkJSU5JVF9MSVNUX0hFQUQoJnBkcnZfb2JqZWN0LT5kZXZfbGlzdC0+aGVhZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisJLyogU3RvcmUgdGhlIERSViBPYmplY3QgaW4gdGhlIFJlZ2lzdHJ5ICovCisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGNmZ19zZXRfb2JqZWN0KCh1MzIpIHBkcnZfb2JqZWN0LCBSRUdfRFJWX09CSkVDVCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJKmRydl9vYmogPSBwZHJ2X29iamVjdDsKKwl9IGVsc2UgeworCQlrZnJlZShwZHJ2X29iamVjdC0+ZGV2X2xpc3QpOworCQlrZnJlZShwZHJ2X29iamVjdC0+ZGV2X25vZGVfc3RyaW5nKTsKKwkJLyogRnJlZSB0aGUgRFJWIE9iamVjdCAqLworCQlrZnJlZShwZHJ2X29iamVjdCk7CisJfQorCisJREJDX0VOU1VSRShzdGF0dXMgfHwgcGRydl9vYmplY3QpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiB0aGUgRFJWIG1vZHVsZS4KKyAqLwordm9pZCBkcnZfZXhpdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXJlZnMtLTsKKworCURCQ19FTlNVUkUocmVmcyA+PSAwKTsKK30KKworLyoKKyAqICA9PT09PT09PSA9IGRydl9kZXN0cm95ID09PT09PT09ID0KKyAqICBwdXJwb3NlOgorICogICAgICBJbnZva2VkIGR1cmluZyBicmlkZ2UgZGUtaW5pdGlhbGl6YXRpb24KKyAqLworaW50IGRydl9kZXN0cm95KHN0cnVjdCBkcnZfb2JqZWN0ICpkcml2ZXJfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iamVjdCA9IChzdHJ1Y3QgZHJ2X29iamVjdCAqKWRyaXZlcl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGRydl9vYmplY3QpOworCisJLyoKKwkgKiAgRGVsZXRlIHRoZSBMaXN0IGlmIGl0IGV4aXN0cy5TaG91bGQgbm90IGNvbWUgaGVyZQorCSAqICBhcyB0aGUgZHJ2X3JlbW92ZV9kZXZfb2JqZWN0IGFuZCB0aGUgTGFzdCBkcnZfcmVxdWVzdF9yZXNvdXJjZXMKKwkgKiAgcmVtb3ZlcyB0aGUgbGlzdCBpZiB0aGUgbGlzdHMgYXJlIGVtcHR5LgorCSAqLworCWtmcmVlKHBkcnZfb2JqZWN0LT5kZXZfbGlzdCk7CisJa2ZyZWUocGRydl9vYmplY3QtPmRldl9ub2RlX3N0cmluZyk7CisJa2ZyZWUocGRydl9vYmplY3QpOworCS8qIFVwZGF0ZSB0aGUgRFJWIE9iamVjdCBpbiBSZWdpc3RyeSB0byBiZSAwICovCisJKHZvaWQpY2ZnX3NldF9vYmplY3QoMCwgUkVHX0RSVl9PQkpFQ1QpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkcnZfZ2V0X2Rldl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHaXZlbiBhIGluZGV4LCByZXR1cm5zIGEgaGFuZGxlIHRvIERldk9iamVjdCBmcm9tIHRoZSBsaXN0LgorICovCitpbnQgZHJ2X2dldF9kZXZfb2JqZWN0KHUzMiBpbmRleCwgc3RydWN0IGRydl9vYmplY3QgKmhkcnZfb2JqLAorCQkJICAgICAgc3RydWN0IGRldl9vYmplY3QgKipkZXZpY2Vfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9ERUJVRworCS8qIHVzZWQgb25seSBmb3IgQXNzZXJ0aW9ucyBhbmQgZGVidWcgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgZHJ2X29iamVjdCAqcGRydl9vYmogPSAoc3RydWN0IGRydl9vYmplY3QgKiloZHJ2X29iajsKKyNlbmRpZgorCXN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqOworCXUzMiBpOworCURCQ19SRVFVSVJFKHBkcnZfb2JqKTsKKwlEQkNfUkVRVUlSRShkZXZpY2Vfb2JqICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGluZGV4ID49IDApOworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfQVNTRVJUKCEoTFNUX0lTX0VNUFRZKHBkcnZfb2JqLT5kZXZfbGlzdCkpKTsKKworCWRldl9vYmogPSAoc3RydWN0IGRldl9vYmplY3QgKilkcnZfZ2V0X2ZpcnN0X2Rldl9vYmplY3QoKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworCQlkZXZfb2JqID0KKwkJICAgIChzdHJ1Y3QgZGV2X29iamVjdCAqKWRydl9nZXRfbmV4dF9kZXZfb2JqZWN0KCh1MzIpIGRldl9vYmopOworCX0KKwlpZiAoZGV2X29iaikgeworCQkqZGV2aWNlX29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWRldl9vYmo7CisJfSBlbHNlIHsKKwkJKmRldmljZV9vYmogPSBOVUxMOworCQlzdGF0dXMgPSAtRVBFUk07CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkcnZfZ2V0X2ZpcnN0X2Rldl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgZmlyc3QgRGV2aWNlIE9iamVjdCBoYW5kbGUgZnJvbSBhbiBpbnRlcm5hbCBsaW5rZWQgbGlzdCBvZgorICogICAgICBvZiBERVZfT0JKRUNUcyBtYWludGFpbmVkIGJ5IERSVi4KKyAqLwordTMyIGRydl9nZXRfZmlyc3RfZGV2X29iamVjdCh2b2lkKQoreworCXUzMiBkd19kZXZfb2JqZWN0ID0gMDsKKwlzdHJ1Y3QgZHJ2X29iamVjdCAqcGRydl9vYmo7CisKKwlpZiAoIWNmZ19nZXRfb2JqZWN0KCh1MzIgKikgJnBkcnZfb2JqLCBSRUdfRFJWX09CSkVDVCkpIHsKKwkJaWYgKChwZHJ2X29iai0+ZGV2X2xpc3QgIT0gTlVMTCkgJiYKKwkJICAgICFMU1RfSVNfRU1QVFkocGRydl9vYmotPmRldl9saXN0KSkKKwkJCWR3X2Rldl9vYmplY3QgPSAodTMyKSBsc3RfZmlyc3QocGRydl9vYmotPmRldl9saXN0KTsKKwl9CisKKwlyZXR1cm4gZHdfZGV2X29iamVjdDsKK30KKworLyoKKyAqICA9PT09PT09PSBEUlZfR2V0Rmlyc3REZXZOb2RlU3RyaW5nID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgdGhlIGZpcnN0IERldmljZSBFeHRlbnNpb24gZnJvbSBhbiBpbnRlcm5hbCBsaW5rZWQgbGlzdCBvZgorICogICAgICBvZiBQb2ludGVyIHRvIGRldl9ub2RlIFN0cmluZ3MgbWFpbnRhaW5lZCBieSBEUlYuCisgKi8KK3UzMiBkcnZfZ2V0X2ZpcnN0X2Rldl9leHRlbnNpb24odm9pZCkKK3sKKwl1MzIgZHdfZGV2X2V4dGVuc2lvbiA9IDA7CisJc3RydWN0IGRydl9vYmplY3QgKnBkcnZfb2JqOworCisJaWYgKCFjZmdfZ2V0X29iamVjdCgodTMyICopICZwZHJ2X29iaiwgUkVHX0RSVl9PQkpFQ1QpKSB7CisKKwkJaWYgKChwZHJ2X29iai0+ZGV2X25vZGVfc3RyaW5nICE9IE5VTEwpICYmCisJCSAgICAhTFNUX0lTX0VNUFRZKHBkcnZfb2JqLT5kZXZfbm9kZV9zdHJpbmcpKSB7CisJCQlkd19kZXZfZXh0ZW5zaW9uID0KKwkJCSAgICAodTMyKSBsc3RfZmlyc3QocGRydl9vYmotPmRldl9ub2RlX3N0cmluZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gZHdfZGV2X2V4dGVuc2lvbjsKK30KKworLyoKKyAqICA9PT09PT09PSBkcnZfZ2V0X25leHRfZGV2X29iamVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBuZXh0IERldmljZSBPYmplY3QgaGFuZGxlIGZyb20gYW4gaW50ZXJuYWwgbGlua2VkIGxpc3Qgb2YKKyAqICAgICAgb2YgREVWX09CSkVDVHMgbWFpbnRhaW5lZCBieSBEUlYsIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IGNhbGxlZAorICogICAgICBkcnZfZ2V0X2ZpcnN0X2Rldl9vYmplY3QoKSBhbmQgemVybyBvciBtb3JlIERSVl9HZXROZXh0LgorICovCit1MzIgZHJ2X2dldF9uZXh0X2Rldl9vYmplY3QodTMyIGhkZXZfb2JqKQoreworCXUzMiBkd19uZXh0X2Rldl9vYmplY3QgPSAwOworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iajsKKworCURCQ19SRVFVSVJFKGhkZXZfb2JqICE9IDApOworCisJaWYgKCFjZmdfZ2V0X29iamVjdCgodTMyICopICZwZHJ2X29iaiwgUkVHX0RSVl9PQkpFQ1QpKSB7CisKKwkJaWYgKChwZHJ2X29iai0+ZGV2X2xpc3QgIT0gTlVMTCkgJiYKKwkJICAgICFMU1RfSVNfRU1QVFkocGRydl9vYmotPmRldl9saXN0KSkgeworCQkJZHdfbmV4dF9kZXZfb2JqZWN0ID0gKHUzMikgbHN0X25leHQocGRydl9vYmotPmRldl9saXN0LAorCQkJCQkJCSAgICAoc3RydWN0IGxpc3RfaGVhZCAqKQorCQkJCQkJCSAgICBoZGV2X29iaik7CisJCX0KKwl9CisJcmV0dXJuIGR3X25leHRfZGV2X29iamVjdDsKK30KKworLyoKKyAqICA9PT09PT09PSBkcnZfZ2V0X25leHRfZGV2X2V4dGVuc2lvbiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlIHRoZSBuZXh0IERldmljZSBFeHRlbnNpb24gZnJvbSBhbiBpbnRlcm5hbCBsaW5rZWQgbGlzdCBvZgorICogICAgICBvZiBwb2ludGVyIHRvIERldk5vZGVTdHJpbmcgbWFpbnRhaW5lZCBieSBEUlYsIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5CisgKiAgICAgIGNhbGxlZCBkcnZfZ2V0X2ZpcnN0X2Rldl9leHRlbnNpb24oKSBhbmQgemVybyBvciBtb3JlCisgKiAgICAgIGRydl9nZXRfbmV4dF9kZXZfZXh0ZW5zaW9uKCkuCisgKi8KK3UzMiBkcnZfZ2V0X25leHRfZGV2X2V4dGVuc2lvbih1MzIgZGV2X2V4dGVuc2lvbikKK3sKKwl1MzIgZHdfZGV2X2V4dGVuc2lvbiA9IDA7CisJc3RydWN0IGRydl9vYmplY3QgKnBkcnZfb2JqOworCisJREJDX1JFUVVJUkUoZGV2X2V4dGVuc2lvbiAhPSAwKTsKKworCWlmICghY2ZnX2dldF9vYmplY3QoKHUzMiAqKSAmcGRydl9vYmosIFJFR19EUlZfT0JKRUNUKSkgeworCQlpZiAoKHBkcnZfb2JqLT5kZXZfbm9kZV9zdHJpbmcgIT0gTlVMTCkgJiYKKwkJICAgICFMU1RfSVNfRU1QVFkocGRydl9vYmotPmRldl9ub2RlX3N0cmluZykpIHsKKwkJCWR3X2Rldl9leHRlbnNpb24gPQorCQkJICAgICh1MzIpIGxzdF9uZXh0KHBkcnZfb2JqLT5kZXZfbm9kZV9zdHJpbmcsCisJCQkJCSAgIChzdHJ1Y3QgbGlzdF9oZWFkICopZGV2X2V4dGVuc2lvbik7CisJCX0KKwl9CisKKwlyZXR1cm4gZHdfZGV2X2V4dGVuc2lvbjsKK30KKworLyoKKyAqICA9PT09PT09PSBkcnZfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgRFJWIG1vZHVsZSBwcml2YXRlIHN0YXRlLgorICovCitpbnQgZHJ2X2luaXQodm9pZCkKK3sKKwlzMzIgcmV0ID0gMTsJCS8qIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSAqLworCisJREJDX1JFUVVJUkUocmVmcyA+PSAwKTsKKworCWlmIChyZXQpCisJCXJlZnMrKzsKKworCURCQ19FTlNVUkUoKHJldCAmJiAocmVmcyA+IDApKSB8fCAoIXJldCAmJiAocmVmcyA+PSAwKSkpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBkcnZfaW5zZXJ0X2Rldl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbnNlcnQgYSBEZXZPYmplY3QgaW50byB0aGUgbGlzdCBvZiBNYW5hZ2VyIG9iamVjdC4KKyAqLworaW50IGRydl9pbnNlcnRfZGV2X29iamVjdChzdHJ1Y3QgZHJ2X29iamVjdCAqZHJpdmVyX29iaiwKKwkJCQkgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKQoreworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iamVjdCA9IChzdHJ1Y3QgZHJ2X29iamVjdCAqKWRyaXZlcl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmogIT0gTlVMTCk7CisJREJDX1JFUVVJUkUocGRydl9vYmplY3QpOworCURCQ19BU1NFUlQocGRydl9vYmplY3QtPmRldl9saXN0KTsKKworCWxzdF9wdXRfdGFpbChwZHJ2X29iamVjdC0+ZGV2X2xpc3QsIChzdHJ1Y3QgbGlzdF9oZWFkICopaGRldl9vYmopOworCisJREJDX0VOU1VSRSghTFNUX0lTX0VNUFRZKHBkcnZfb2JqZWN0LT5kZXZfbGlzdCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X3JlbW92ZV9kZXZfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU2VhcmNoIGZvciBhbmQgcmVtb3ZlIGEgRGV2aWNlT2JqZWN0IGZyb20gdGhlIGdpdmVuIGxpc3Qgb2YgRFJWCisgKiAgICAgIG9iamVjdHMuCisgKi8KK2ludCBkcnZfcmVtb3ZlX2Rldl9vYmplY3Qoc3RydWN0IGRydl9vYmplY3QgKmRyaXZlcl9vYmosCisJCQkJIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaikKK3sKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iamVjdCA9IChzdHJ1Y3QgZHJ2X29iamVjdCAqKWRyaXZlcl9vYmo7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyX2VsZW07CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGRydl9vYmplY3QpOworCURCQ19SRVFVSVJFKGhkZXZfb2JqICE9IE5VTEwpOworCisJREJDX1JFUVVJUkUocGRydl9vYmplY3QtPmRldl9saXN0ICE9IE5VTEwpOworCURCQ19SRVFVSVJFKCFMU1RfSVNfRU1QVFkocGRydl9vYmplY3QtPmRldl9saXN0KSk7CisKKwkvKiBTZWFyY2ggbGlzdCBmb3IgcF9wcm9jX29iamVjdDogKi8KKwlmb3IgKGN1cl9lbGVtID0gbHN0X2ZpcnN0KHBkcnZfb2JqZWN0LT5kZXZfbGlzdCk7IGN1cl9lbGVtICE9IE5VTEw7CisJICAgICBjdXJfZWxlbSA9IGxzdF9uZXh0KHBkcnZfb2JqZWN0LT5kZXZfbGlzdCwgY3VyX2VsZW0pKSB7CisJCS8qIElmIGZvdW5kLCByZW1vdmUgaXQuICovCisJCWlmICgoc3RydWN0IGRldl9vYmplY3QgKiljdXJfZWxlbSA9PSBoZGV2X29iaikgeworCQkJbHN0X3JlbW92ZV9lbGVtKHBkcnZfb2JqZWN0LT5kZXZfbGlzdCwgY3VyX2VsZW0pOworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIFJlbW92ZSBsaXN0IGlmIGVtcHR5LiAqLworCWlmIChMU1RfSVNfRU1QVFkocGRydl9vYmplY3QtPmRldl9saXN0KSkgeworCQlrZnJlZShwZHJ2X29iamVjdC0+ZGV2X2xpc3QpOworCQlwZHJ2X29iamVjdC0+ZGV2X2xpc3QgPSBOVUxMOworCX0KKwlEQkNfRU5TVVJFKChwZHJ2X29iamVjdC0+ZGV2X2xpc3QgPT0gTlVMTCkgfHwKKwkJICAgIUxTVF9JU19FTVBUWShwZHJ2X29iamVjdC0+ZGV2X2xpc3QpKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X3JlcXVlc3RfcmVzb3VyY2VzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVxdWVzdHMgIHJlc291cmNlcyBmcm9tIHRoZSBPUy4KKyAqLworaW50IGRydl9yZXF1ZXN0X3Jlc291cmNlcyh1MzIgZHdfY29udGV4dCwgdTMyICpkZXZfbm9kZV9zdHJnKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iamVjdDsKKwlzdHJ1Y3QgZHJ2X2V4dCAqcHN6ZGV2X25vZGU7CisKKwlEQkNfUkVRVUlSRShkd19jb250ZXh0ICE9IDApOworCURCQ19SRVFVSVJFKGRldl9ub2RlX3N0cmcgIT0gTlVMTCk7CisKKwkvKgorCSAqICBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgc3RyaW5nLiBUaGlzIHdpbGwgbGl2ZSB1bnRpbGwKKwkgKiAgaXQgaXMgZnJlZWQgaW4gdGhlIFJlbGVhc2UgcmVzb3VyY2VzLiBVcGRhdGUgdGhlIGRyaXZlciBvYmplY3QKKwkgKiAgbGlzdC4KKwkgKi8KKworCXN0YXR1cyA9IGNmZ19nZXRfb2JqZWN0KCh1MzIgKikgJnBkcnZfb2JqZWN0LCBSRUdfRFJWX09CSkVDVCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJcHN6ZGV2X25vZGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2X2V4dCksIEdGUF9LRVJORUwpOworCQlpZiAocHN6ZGV2X25vZGUpIHsKKwkJCWxzdF9pbml0X2VsZW0oJnBzemRldl9ub2RlLT5saW5rKTsKKwkJCXN0cm5jcHkocHN6ZGV2X25vZGUtPnN6X3N0cmluZywKKwkJCQkoY2hhciAqKWR3X2NvbnRleHQsIE1BWFJFR1BBVEhMRU5HVEggLSAxKTsKKwkJCXBzemRldl9ub2RlLT5zel9zdHJpbmdbTUFYUkVHUEFUSExFTkdUSCAtIDFdID0gJ1wwJzsKKwkJCS8qIFVwZGF0ZSB0aGUgRHJpdmVyIE9iamVjdCBMaXN0ICovCisJCQkqZGV2X25vZGVfc3RyZyA9ICh1MzIpIHBzemRldl9ub2RlLT5zel9zdHJpbmc7CisJCQlsc3RfcHV0X3RhaWwocGRydl9vYmplY3QtPmRldl9ub2RlX3N0cmluZywKKwkJCQkgICAgIChzdHJ1Y3QgbGlzdF9oZWFkICopcHN6ZGV2X25vZGUpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCSpkZXZfbm9kZV9zdHJnID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEZhaWxlZCB0byBnZXQgRHJpdmVyIE9iamVjdCBmcm9tIFJlZ2lzdHJ5IiwKKwkJCV9fZnVuY19fKTsKKwkJKmRldl9ub2RlX3N0cmcgPSAwOworCX0KKworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgZGV2X25vZGVfc3RyZyAhPSBOVUxMICYmCisJCSAgICAhTFNUX0lTX0VNUFRZKHBkcnZfb2JqZWN0LT5kZXZfbm9kZV9zdHJpbmcpKSB8fAorCQkgICAoc3RhdHVzICYmICpkZXZfbm9kZV9zdHJnID09IDApKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZHJ2X3JlbGVhc2VfcmVzb3VyY2VzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVsZWFzZXMgIHJlc291cmNlcyBmcm9tIHRoZSBPUy4KKyAqLworaW50IGRydl9yZWxlYXNlX3Jlc291cmNlcyh1MzIgZHdfY29udGV4dCwgc3RydWN0IGRydl9vYmplY3QgKmhkcnZfb2JqKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkcnZfb2JqZWN0ICpwZHJ2X29iamVjdCA9IChzdHJ1Y3QgZHJ2X29iamVjdCAqKWhkcnZfb2JqOworCXN0cnVjdCBkcnZfZXh0ICpwc3pkZXZfbm9kZTsKKworCS8qCisJICogIElycmVzcGVjdGl2ZSBvZiB0aGUgc3RhdHVzIGdvIGFoZWFkIGFuZCBjbGVhbiBpdAorCSAqICBUaGUgZm9sbG93aW5nIHdpbGwgb3ZlciB3cml0ZSB0aGUgc3RhdHVzLgorCSAqLworCWZvciAocHN6ZGV2X25vZGUgPSAoc3RydWN0IGRydl9leHQgKilkcnZfZ2V0X2ZpcnN0X2Rldl9leHRlbnNpb24oKTsKKwkgICAgIHBzemRldl9ub2RlICE9IE5VTEw7IHBzemRldl9ub2RlID0gKHN0cnVjdCBkcnZfZXh0ICopCisJICAgICBkcnZfZ2V0X25leHRfZGV2X2V4dGVuc2lvbigodTMyKSBwc3pkZXZfbm9kZSkpIHsKKwkJaWYgKCFwZHJ2X29iamVjdC0+ZGV2X25vZGVfc3RyaW5nKSB7CisJCQkvKiBXaGVuIHRoaXMgY291bGQgaGFwcGVuPyAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCh1MzIpIHBzemRldl9ub2RlID09IGR3X2NvbnRleHQpIHsKKwkJCS8qIEZvdW5kIGl0ICovCisJCQkvKiBEZWxldGUgZnJvbSB0aGUgRHJpdmVyIG9iamVjdCBsaXN0ICovCisJCQlsc3RfcmVtb3ZlX2VsZW0ocGRydl9vYmplY3QtPmRldl9ub2RlX3N0cmluZywKKwkJCQkJKHN0cnVjdCBsaXN0X2hlYWQgKilwc3pkZXZfbm9kZSk7CisJCQlrZnJlZSgodm9pZCAqKXBzemRldl9ub2RlKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIERlbGV0ZSB0aGUgTGlzdCBpZiBpdCBpcyBlbXB0eSAqLworCQlpZiAoTFNUX0lTX0VNUFRZKHBkcnZfb2JqZWN0LT5kZXZfbm9kZV9zdHJpbmcpKSB7CisJCQlrZnJlZShwZHJ2X29iamVjdC0+ZGV2X25vZGVfc3RyaW5nKTsKKwkJCXBkcnZfb2JqZWN0LT5kZXZfbm9kZV9zdHJpbmcgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcmVxdWVzdF9icmlkZ2VfcmVzb3VyY2VzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVzZXJ2ZXMgc2hhcmVkIG1lbW9yeSBmb3IgYnJpZGdlLgorICovCitzdGF0aWMgaW50IHJlcXVlc3RfYnJpZGdlX3Jlc291cmNlcyhzdHJ1Y3QgY2ZnX2hvc3RyZXMgKnJlcykKK3sKKwlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmhvc3RfcmVzID0gcmVzOworCisJLyogbnVtX21lbV93aW5kb3dzIG11c3Qgbm90IGJlIG1vcmUgdGhhbiBDRkdfTUFYTUVNUkVHSVNURVJTICovCisJaG9zdF9yZXMtPm51bV9tZW1fd2luZG93cyA9IDI7CisKKwkvKiBGaXJzdCB3aW5kb3cgaXMgZm9yIERTUCBpbnRlcm5hbCBtZW1vcnkgKi8KKwlob3N0X3Jlcy0+ZHdfc3lzX2N0cmxfYmFzZSA9IGlvcmVtYXAoT01BUF9TWVNDX0JBU0UsIE9NQVBfU1lTQ19TSVpFKTsKKwlkZXZfZGJnKGJyaWRnZSwgImR3X21lbV9iYXNlWzBdIDB4JXhcbiIsIGhvc3RfcmVzLT5kd19tZW1fYmFzZVswXSk7CisJZGV2X2RiZyhicmlkZ2UsICJkd19tZW1fYmFzZVszXSAweCV4XG4iLCBob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbM10pOworCWRldl9kYmcoYnJpZGdlLCAiZHdfZG1tdV9iYXNlICVwXG4iLCBob3N0X3Jlcy0+ZHdfZG1tdV9iYXNlKTsKKworCS8qIGZvciAyNHh4IGJhc2UgcG9ydCBpcyBub3QgbWFwcGluZyB0aGUgbWFtb3J5IGZvciBEU1AKKwkgKiBpbnRlcm5hbCBtZW1vcnkgVE9ETyBEbyBhIGlvcmVtYXAgaGVyZSAqLworCS8qIFNlY29uZCB3aW5kb3cgaXMgZm9yIERTUCBleHRlcm5hbCBtZW1vcnkgc2hhcmVkIHdpdGggTVBVICovCisKKwkvKiBUaGVzZSBhcmUgaGFyZC1jb2RlZCB2YWx1ZXMgKi8KKwlob3N0X3Jlcy0+YmlycV9yZWdpc3RlcnMgPSAwOworCWhvc3RfcmVzLT5iaXJxX2F0dHJpYiA9IDA7CisJaG9zdF9yZXMtPmR3X29mZnNldF9mb3JfbW9uaXRvciA9IDA7CisJaG9zdF9yZXMtPmR3X2Nobmxfb2Zmc2V0ID0gMDsKKwkvKiBDSE5MX01BWENIQU5ORUxTICovCisJaG9zdF9yZXMtPmR3X251bV9jaG5scyA9IENITkxfTUFYQ0hBTk5FTFM7CisJaG9zdF9yZXMtPmR3X2NobmxfYnVmX3NpemUgPSAweDQwMDsKKworCXJldHVybiAwOworfQorCisvKgorICogID09PT09PT09IGRydl9yZXF1ZXN0X2JyaWRnZV9yZXNfZHNwID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVzZXJ2ZXMgc2hhcmVkIG1lbW9yeSBmb3IgYnJpZGdlLgorICovCitpbnQgZHJ2X3JlcXVlc3RfYnJpZGdlX3Jlc19kc3Aodm9pZCAqKnBob3N0X3Jlc291cmNlcykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmhvc3RfcmVzOworCXUzMiBkd19idWZmX3NpemU7CisJdTMyIGRtYV9hZGRyOworCXUzMiBzaG1fc2l6ZTsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJZHdfYnVmZl9zaXplID0gc2l6ZW9mKHN0cnVjdCBjZmdfaG9zdHJlcyk7CisKKwlob3N0X3JlcyA9IGt6YWxsb2MoZHdfYnVmZl9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChob3N0X3JlcyAhPSBOVUxMKSB7CisJCXJlcXVlc3RfYnJpZGdlX3Jlc291cmNlcyhob3N0X3Jlcyk7CisJCS8qIG51bV9tZW1fd2luZG93cyBtdXN0IG5vdCBiZSBtb3JlIHRoYW4gQ0ZHX01BWE1FTVJFR0lTVEVSUyAqLworCQlob3N0X3Jlcy0+bnVtX21lbV93aW5kb3dzID0gNDsKKworCQlob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbMF0gPSAwOworCQlob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbMl0gPSAodTMyKSBpb3JlbWFwKE9NQVBfRFNQX01FTTFfQkFTRSwKKwkJCQkJCQkgT01BUF9EU1BfTUVNMV9TSVpFKTsKKwkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzNdID0gKHUzMikgaW9yZW1hcChPTUFQX0RTUF9NRU0yX0JBU0UsCisJCQkJCQkJIE9NQVBfRFNQX01FTTJfU0laRSk7CisJCWhvc3RfcmVzLT5kd19tZW1fYmFzZVs0XSA9ICh1MzIpIGlvcmVtYXAoT01BUF9EU1BfTUVNM19CQVNFLAorCQkJCQkJCSBPTUFQX0RTUF9NRU0zX1NJWkUpOworCQlob3N0X3Jlcy0+ZHdfcGVyX2Jhc2UgPSBpb3JlbWFwKE9NQVBfUEVSX0NNX0JBU0UsCisJCQkJCQlPTUFQX1BFUl9DTV9TSVpFKTsKKwkJaG9zdF9yZXMtPmR3X3Blcl9wbV9iYXNlID0gKHUzMikgaW9yZW1hcChPTUFQX1BFUl9QUk1fQkFTRSwKKwkJCQkJCQkgT01BUF9QRVJfUFJNX1NJWkUpOworCQlob3N0X3Jlcy0+ZHdfY29yZV9wbV9iYXNlID0gKHUzMikgaW9yZW1hcChPTUFQX0NPUkVfUFJNX0JBU0UsCisJCQkJCQkJICBPTUFQX0NPUkVfUFJNX1NJWkUpOworCQlob3N0X3Jlcy0+ZHdfZG1tdV9iYXNlID0gaW9yZW1hcChPTUFQX0RNTVVfQkFTRSwKKwkJCQkJCSBPTUFQX0RNTVVfU0laRSk7CisKKwkJZGV2X2RiZyhicmlkZ2UsICJkd19tZW1fYmFzZVswXSAweCV4XG4iLAorCQkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzBdKTsKKwkJZGV2X2RiZyhicmlkZ2UsICJkd19tZW1fYmFzZVsxXSAweCV4XG4iLAorCQkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzFdKTsKKwkJZGV2X2RiZyhicmlkZ2UsICJkd19tZW1fYmFzZVsyXSAweCV4XG4iLAorCQkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzJdKTsKKwkJZGV2X2RiZyhicmlkZ2UsICJkd19tZW1fYmFzZVszXSAweCV4XG4iLAorCQkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzNdKTsKKwkJZGV2X2RiZyhicmlkZ2UsICJkd19tZW1fYmFzZVs0XSAweCV4XG4iLAorCQkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzRdKTsKKwkJZGV2X2RiZyhicmlkZ2UsICJkd19kbW11X2Jhc2UgJXBcbiIsIGhvc3RfcmVzLT5kd19kbW11X2Jhc2UpOworCisJCXNobV9zaXplID0gZHJ2X2RhdGFwLT5zaG1fc2l6ZTsKKwkJaWYgKHNobV9zaXplID49IDB4MTAwMDApIHsKKwkJCS8qIEFsbG9jYXRlIFBoeXNpY2FsbHkgY29udGlndW91cywKKwkJCSAqIG5vbi1jYWNoZWFibGUgIG1lbW9yeSAqLworCQkJaG9zdF9yZXMtPmR3X21lbV9iYXNlWzFdID0KKwkJCSAgICAodTMyKSBtZW1fYWxsb2NfcGh5c19tZW0oc2htX3NpemUsIDB4MTAwMDAwLAorCQkJCQkJICAgICAmZG1hX2FkZHIpOworCQkJaWYgKGhvc3RfcmVzLT5kd19tZW1fYmFzZVsxXSA9PSAwKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlwcl9lcnIoInNobSByZXNlcnZhdGlvbiBGYWlsZWRcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlob3N0X3Jlcy0+ZHdfbWVtX2xlbmd0aFsxXSA9IHNobV9zaXplOworCQkJCWhvc3RfcmVzLT5kd19tZW1fcGh5c1sxXSA9IGRtYV9hZGRyOworCisJCQkJZGV2X2RiZyhicmlkZ2UsICIlczogQnJpZGdlIHNobSBhZGRyZXNzIDB4JXggIgorCQkJCQkiZG1hX2FkZHIgJXggc2l6ZSAleFxuIiwgX19mdW5jX18sCisJCQkJCWhvc3RfcmVzLT5kd19tZW1fYmFzZVsxXSwKKwkJCQkJZG1hX2FkZHIsIHNobV9zaXplKTsKKwkJCX0KKwkJfQorCQlpZiAoIXN0YXR1cykgeworCQkJLyogVGhlc2UgYXJlIGhhcmQtY29kZWQgdmFsdWVzICovCisJCQlob3N0X3Jlcy0+YmlycV9yZWdpc3RlcnMgPSAwOworCQkJaG9zdF9yZXMtPmJpcnFfYXR0cmliID0gMDsKKwkJCWhvc3RfcmVzLT5kd19vZmZzZXRfZm9yX21vbml0b3IgPSAwOworCQkJaG9zdF9yZXMtPmR3X2Nobmxfb2Zmc2V0ID0gMDsKKwkJCS8qIENITkxfTUFYQ0hBTk5FTFMgKi8KKwkJCWhvc3RfcmVzLT5kd19udW1fY2hubHMgPSBDSE5MX01BWENIQU5ORUxTOworCQkJaG9zdF9yZXMtPmR3X2NobmxfYnVmX3NpemUgPSAweDQwMDsKKwkJCWR3X2J1ZmZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2ZnX2hvc3RyZXMpOworCQl9CisJCSpwaG9zdF9yZXNvdXJjZXMgPSBob3N0X3JlczsKKwl9CisJLyogRW5kIE1lbSBhbGxvYyAqLworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgbWVtX2V4dF9waHlzX3Bvb2xfaW5pdCh1MzIgcG9vbF9waHlzX2Jhc2UsIHUzMiBwb29sX3NpemUpCit7CisJdTMyIHBvb2xfdmlydF9iYXNlOworCisJLyogZ2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3MgZm9yIHRoZSBwaHlzaWNhbCBtZW1vcnkgcG9vbCBwYXNzZWQgKi8KKwlwb29sX3ZpcnRfYmFzZSA9ICh1MzIpIGlvcmVtYXAocG9vbF9waHlzX2Jhc2UsIHBvb2xfc2l6ZSk7CisKKwlpZiAoKHZvaWQgKiopcG9vbF92aXJ0X2Jhc2UgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBleHRlcm5hbCBwaHlzaWNhbCBtZW1vcnkgbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlleHRfcGh5c19tZW1fcG9vbF9lbmFibGVkID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJZXh0X21lbV9wb29sLnBoeXNfbWVtX2Jhc2UgPSBwb29sX3BoeXNfYmFzZTsKKwkJZXh0X21lbV9wb29sLnBoeXNfbWVtX3NpemUgPSBwb29sX3NpemU7CisJCWV4dF9tZW1fcG9vbC52aXJ0X21lbV9iYXNlID0gcG9vbF92aXJ0X2Jhc2U7CisJCWV4dF9tZW1fcG9vbC5uZXh0X3BoeXNfYWxsb2NfcHRyID0gcG9vbF9waHlzX2Jhc2U7CisJCWV4dF9waHlzX21lbV9wb29sX2VuYWJsZWQgPSB0cnVlOworCX0KK30KKwordm9pZCBtZW1fZXh0X3BoeXNfcG9vbF9yZWxlYXNlKHZvaWQpCit7CisJaWYgKGV4dF9waHlzX21lbV9wb29sX2VuYWJsZWQpIHsKKwkJaW91bm1hcCgodm9pZCAqKShleHRfbWVtX3Bvb2wudmlydF9tZW1fYmFzZSkpOworCQlleHRfcGh5c19tZW1fcG9vbF9lbmFibGVkID0gZmFsc2U7CisJfQorfQorCisvKgorICogID09PT09PT09IG1lbV9leHRfcGh5c19tZW1fYWxsb2MgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgIEFsbG9jYXRlIHBoeXNpY2FsbHkgY29udGlndW91cywgdW5jYWNoZWQgbWVtb3J5IGZyb20gZXh0ZXJuYWwgbWVtb3J5IHBvb2wKKyAqLworCitzdGF0aWMgdm9pZCAqbWVtX2V4dF9waHlzX21lbV9hbGxvYyh1MzIgYnl0ZXMsIHUzMiBhbGlnbiwgdTMyICogcGh5c19hZGRyKQoreworCXUzMiBuZXdfYWxsb2NfcHRyOworCXUzMiBvZmZzZXQ7CisJdTMyIHZpcnRfYWRkcjsKKworCWlmIChhbGlnbiA9PSAwKQorCQlhbGlnbiA9IDE7CisKKwlpZiAoYnl0ZXMgPiAoKGV4dF9tZW1fcG9vbC5waHlzX21lbV9iYXNlICsgZXh0X21lbV9wb29sLnBoeXNfbWVtX3NpemUpCisJCSAgICAgLSBleHRfbWVtX3Bvb2wubmV4dF9waHlzX2FsbG9jX3B0cikpIHsKKwkJcGh5c19hZGRyID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ID0gKGV4dF9tZW1fcG9vbC5uZXh0X3BoeXNfYWxsb2NfcHRyICYgKGFsaWduIC0gMSkpOworCQlpZiAob2Zmc2V0ID09IDApCisJCQluZXdfYWxsb2NfcHRyID0gZXh0X21lbV9wb29sLm5leHRfcGh5c19hbGxvY19wdHI7CisJCWVsc2UKKwkJCW5ld19hbGxvY19wdHIgPSAoZXh0X21lbV9wb29sLm5leHRfcGh5c19hbGxvY19wdHIpICsKKwkJCSAgICAoYWxpZ24gLSBvZmZzZXQpOworCQlpZiAoKG5ld19hbGxvY19wdHIgKyBieXRlcykgPD0KKwkJICAgIChleHRfbWVtX3Bvb2wucGh5c19tZW1fYmFzZSArIGV4dF9tZW1fcG9vbC5waHlzX21lbV9zaXplKSkgeworCQkJLyogd2UgY2FuIGFsbG9jYXRlICovCisJCQkqcGh5c19hZGRyID0gbmV3X2FsbG9jX3B0cjsKKwkJCWV4dF9tZW1fcG9vbC5uZXh0X3BoeXNfYWxsb2NfcHRyID0KKwkJCSAgICBuZXdfYWxsb2NfcHRyICsgYnl0ZXM7CisJCQl2aXJ0X2FkZHIgPQorCQkJICAgIGV4dF9tZW1fcG9vbC52aXJ0X21lbV9iYXNlICsgKG5ld19hbGxvY19wdHIgLQorCQkJCQkJCSAgZXh0X21lbV9wb29sLgorCQkJCQkJCSAgcGh5c19tZW1fYmFzZSk7CisJCQlyZXR1cm4gKHZvaWQgKil2aXJ0X2FkZHI7CisJCX0gZWxzZSB7CisJCQkqcGh5c19hZGRyID0gMDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorfQorCisvKgorICogID09PT09PT09IG1lbV9hbGxvY19waHlzX21lbSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEFsbG9jYXRlIHBoeXNpY2FsbHkgY29udGlndW91cywgdW5jYWNoZWQgbWVtb3J5CisgKi8KK3ZvaWQgKm1lbV9hbGxvY19waHlzX21lbSh1MzIgYnl0ZV9zaXplLCB1MzIgYWxpZ25fbWFzaywKKwkJCQl1MzIgKnBoeXNpY2FsX2FkZHJlc3MpCit7CisJdm9pZCAqdmFfbWVtID0gTlVMTDsKKwlkbWFfYWRkcl90IHBhX21lbTsKKworCWlmIChieXRlX3NpemUgPiAwKSB7CisJCWlmIChleHRfcGh5c19tZW1fcG9vbF9lbmFibGVkKSB7CisJCQl2YV9tZW0gPSBtZW1fZXh0X3BoeXNfbWVtX2FsbG9jKGJ5dGVfc2l6ZSwgYWxpZ25fbWFzaywKKwkJCQkJCQkodTMyICopICZwYV9tZW0pOworCQl9IGVsc2UKKwkJCXZhX21lbSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBieXRlX3NpemUsICZwYV9tZW0sCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAodmFfbWVtID09IE5VTEwpCisJCQkqcGh5c2ljYWxfYWRkcmVzcyA9IDA7CisJCWVsc2UKKwkJCSpwaHlzaWNhbF9hZGRyZXNzID0gcGFfbWVtOworCX0KKwlyZXR1cm4gdmFfbWVtOworfQorCisvKgorICogID09PT09PT09IG1lbV9mcmVlX3BoeXNfbWVtID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRnJlZSB0aGUgZ2l2ZW4gYmxvY2sgb2YgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeS4KKyAqLwordm9pZCBtZW1fZnJlZV9waHlzX21lbSh2b2lkICp2aXJ0dWFsX2FkZHJlc3MsIHUzMiBwaHlzaWNhbF9hZGRyZXNzLAorCQkgICAgICAgdTMyIGJ5dGVfc2l6ZSkKK3sKKwlEQkNfUkVRVUlSRSh2aXJ0dWFsX2FkZHJlc3MgIT0gTlVMTCk7CisKKwlpZiAoIWV4dF9waHlzX21lbV9wb29sX2VuYWJsZWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIGJ5dGVfc2l6ZSwgdmlydHVhbF9hZGRyZXNzLAorCQkJCSAgcGh5c2ljYWxfYWRkcmVzcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnZfaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnZfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlODk0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydl9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDY1NiBAQAorLyoKKyAqIGRydl9pbnRlcmZhY2UuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgZHJpdmVyIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9zdCBPUyAqLworCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpZmRlZiBNT0RVTEUKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc2VydmljZXMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2xrLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3N5bmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBsYXRmb3JtIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwYXBpLWlvY3RsLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGFwaS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkcnYuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc291cmNlIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvcHdyLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8ZHJ2X2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9yZXNvdXJjZWNsZWFudXAuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2hubC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9wcm9jLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnZkZWZzLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rydi5oPgorCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKyNpbmNsdWRlIDxtYWNoLW9tYXAyL29tYXAzLW9wcC5oPgorI2VuZGlmCisKKyNkZWZpbmUgQlJJREdFX05BTUUgIkM2NDEwIgorLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbHMgKi8KKyNkZWZpbmUgRFJJVkVSX05BTUUgICJEc3BCcmlkZ2UiCisjZGVmaW5lIERTUEJSSURHRV9WRVJTSU9OCSIwLjMiCitzMzIgZHNwX2RlYnVnOworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwX2RzcGJyaWRnZV9kZXY7CitzdHJ1Y3QgZGV2aWNlICpicmlkZ2U7CisKKy8qIFRoaXMgaXMgYSB0ZXN0IHZhcmlhYmxlIHVzZWQgYnkgQnJpZGdlIHRvIHRlc3QgZGlmZmVyZW50IHNsZWVwIHN0YXRlcyAqLworczMyIGRzcF90ZXN0X3NsZWVwc3RhdGU7CisKK3N0YXRpYyBzdHJ1Y3QgY2RldiBicmlkZ2VfY2RldjsKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqYnJpZGdlX2NsYXNzOworCitzdGF0aWMgdTMyIGRyaXZlcl9jb250ZXh0Oworc3RhdGljIHMzMiBkcml2ZXJfbWFqb3I7CitzdGF0aWMgY2hhciAqYmFzZV9pbWc7CitjaGFyICppdmFfaW1nOworc3RhdGljIHMzMiBzaG1fc2l6ZSA9IDB4NTAwMDAwOwkvKiA1IE1CICovCitzdGF0aWMgaW50IHRjX3dvcmRzd2Fwb247CS8qIERlZmF1bHQgdmFsdWUgaXMgYWx3YXlzIGZhbHNlICovCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX1JFQ09WRVJZCisjZGVmaW5lIFJFQ19USU1FT1VUIDUwMDAJLypyZWNvdmVyeSB0aW1lb3V0IGluIG1zZWNzICovCitzdGF0aWMgYXRvbWljX3QgYnJpZGdlX2NyZWY7CS8qIG51bWJlciBvZiBicmlkZ2Ugb3BlbiBoYW5kbGVzICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJyaWRnZV9yZWNfcXVldWU7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGJyaWRnZV9yZWNvdmVyeV93b3JrOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihicmlkZ2VfY29tcCk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGJyaWRnZV9vcGVuX2NvbXApOworc3RhdGljIGJvb2wgcmVjb3ZlcjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNCitzdHJ1Y3Qgb21hcDM0X3h4X2JyaWRnZV9zdXNwZW5kX2RhdGEgeworCWludCBzdXNwZW5kZWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3VzcGVuZF93cTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcDM0X3h4X2JyaWRnZV9zdXNwZW5kX2RhdGEgYnJpZGdlX3N1c3BlbmRfZGF0YTsKKworc3RhdGljIGludCBvbWFwMzRfeHhicmlkZ2Vfc3VzcGVuZF9sb2Nrb3V0KHN0cnVjdCBvbWFwMzRfeHhfYnJpZGdlX3N1c3BlbmRfZGF0YQorCQkJCQkgICAqcywgc3RydWN0IGZpbGUgKmYpCit7CisJaWYgKChzKS0+c3VzcGVuZGVkKSB7CisJCWlmICgoZiktPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKChzKS0+c3VzcGVuZF93cSwgKHMpLT5zdXNwZW5kZWQgPT0gMCk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK21vZHVsZV9wYXJhbShkc3BfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRzcF9kZWJ1ZywgIldhaXQgYWZ0ZXIgbG9hZGluZyBEU1AgaW1hZ2UuIGRlZmF1bHQgPSBmYWxzZSIpOworCittb2R1bGVfcGFyYW0oZHNwX3Rlc3Rfc2xlZXBzdGF0ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZHNwX3Rlc3Rfc2xlZXBzdGF0ZSwgIkRTUCBTbGVlcCBzdGF0ZSA9IDAiKTsKKworbW9kdWxlX3BhcmFtKGJhc2VfaW1nLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJhc2VfaW1nLCAiRFNQIGJhc2UgaW1hZ2UsIGRlZmF1bHQgPSBOVUxMIik7CisKK21vZHVsZV9wYXJhbShzaG1fc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2htX3NpemUsICJzaG0gc2l6ZSwgZGVmYXVsdCA9IDQgTUIsIG1pbmltdW0gPSA2NCBLQiIpOworCittb2R1bGVfcGFyYW0odGNfd29yZHN3YXBvbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGNfd29yZHN3YXBvbiwgIlRDIFdvcmQgU3dhcCBPcHRpb24uIGRlZmF1bHQgPSAwIik7CisKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEU1BCUklER0VfVkVSU0lPTik7CisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IERSSVZFUl9OQU1FOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBicmlkZ2VfZm9wcyA9IHsKKwkub3BlbiA9IGJyaWRnZV9vcGVuLAorCS5yZWxlYXNlID0gYnJpZGdlX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gYnJpZGdlX2lvY3RsLAorCS5tbWFwID0gYnJpZGdlX21tYXAsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdTMyIHRpbWVfb3V0ID0gMTAwMDsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworczMyIGRzcF9tYXhfb3BwcyA9IFZERDFfT1BQNTsKKyNlbmRpZgorCisvKiBNYXhpbXVtIE9wcHMgdGhhdCBjYW4gYmUgcmVxdWVzdGVkIGJ5IElWQSAqLworLyp2ZGQxIHJhdGUgdGFibGUgKi8KKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworY29uc3Qgc3RydWN0IG9tYXBfb3BwIHZkZDFfcmF0ZV90YWJsZV9icmlkZ2VbXSA9IHsKKwl7MCwgMCwgMH0sCisJLypPUFAxICovCisJe1MxMjVNLCBWREQxX09QUDEsIDB9LAorCS8qT1BQMiAqLworCXtTMjUwTSwgVkREMV9PUFAyLCAwfSwKKwkvKk9QUDMgKi8KKwl7UzUwME0sIFZERDFfT1BQMywgMH0sCisJLypPUFA0ICovCisJe1M1NTBNLCBWREQxX09QUDQsIDB9LAorCS8qT1BQNSAqLworCXtTNjAwTSwgVkREMV9PUFA1LCAwfSwKK307CisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3QgZHNwYnJpZGdlX3BsYXRmb3JtX2RhdGEgKm9tYXBfZHNwYnJpZGdlX3BkYXRhOworCit1MzIgdmRkMV9kc3BfZnJlcVs2XVs0XSA9IHsKKwl7MCwgMCwgMCwgMH0sCisJLypPUFAxICovCisJezAsIDkwMDAwLCAwLCA4NjAwMH0sCisJLypPUFAyICovCisJezAsIDE4MDAwMCwgODAwMDAsIDE3MDAwMH0sCisJLypPUFAzICovCisJezAsIDM2MDAwMCwgMTYwMDAwLCAzNDAwMDB9LAorCS8qT1BQNCAqLworCXswLCAzOTYwMDAsIDMyNTAwMCwgMzc2MDAwfSwKKwkvKk9QUDUgKi8KKwl7MCwgNDMwMDAwLCAzNTUwMDAsIDQzMDAwMH0sCit9OworCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX1JFQ09WRVJZCitzdGF0aWMgdm9pZCBicmlkZ2VfcmVjb3ZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRldl9vYmplY3QgKmRldjsKKwlzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlOworCWlmIChhdG9taWNfcmVhZCgmYnJpZGdlX2NyZWYpKSB7CisJCUlOSVRfQ09NUExFVElPTihicmlkZ2VfY29tcCk7CisJCXdoaWxlICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZicmlkZ2VfY29tcCwKKwkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoUkVDX1RJTUVPVVQpKSkKKwkJCXByX2luZm8oIiVzOiVkIGhhbmRsZShzKSBzdGlsbCBvcGVuZWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdG9taWNfcmVhZCgmYnJpZGdlX2NyZWYpKTsKKwl9CisJZGV2ID0gZGV2X2dldF9maXJzdCgpOworCWRldl9nZXRfZGV2X25vZGUoZGV2LCAmZGV2X25vZGUpOworCWlmICghZGV2X25vZGUgfHwgcHJvY19hdXRvX3N0YXJ0KGRldl9ub2RlLCBkZXYpKQorCQlwcl9lcnIoIkRTUCBjb3VsZCBub3QgYmUgcmVzdGFydGVkXG4iKTsKKwlyZWNvdmVyID0gZmFsc2U7CisJY29tcGxldGVfYWxsKCZicmlkZ2Vfb3Blbl9jb21wKTsKK30KKwordm9pZCBicmlkZ2VfcmVjb3Zlcl9zY2hlZHVsZSh2b2lkKQoreworCUlOSVRfQ09NUExFVElPTihicmlkZ2Vfb3Blbl9jb21wKTsKKwlyZWNvdmVyID0gdHJ1ZTsKKwlxdWV1ZV93b3JrKGJyaWRnZV9yZWNfcXVldWUsICZicmlkZ2VfcmVjb3Zlcnlfd29yayk7Cit9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworc3RhdGljIGludCBkc3BicmlkZ2Vfc2NhbGVfbm90aWZpY2F0aW9uKHN0cnVjdCBub3RpZmllcl9ibG9jayAqb3AsCisJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGRzcGJyaWRnZV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCQkJCW9tYXBfZHNwYnJpZGdlX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoQ1BVRlJFUV9QT1NUQ0hBTkdFID09IHZhbCAmJiBwZGF0YS0+ZHNwX2dldF9vcHApCisJCXB3cl9wbV9wb3N0X3NjYWxlKFBSQ01fVkREMSwgcGRhdGEtPmRzcF9nZXRfb3BwKCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXZhX2Nsa19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRzcGJyaWRnZV9zY2FsZV9ub3RpZmljYXRpb24sCisJTlVMTCwKK307CisjZW5kaWYKKworLyoqCisgKiBvbWFwM19icmlkZ2Vfc3RhcnR1cCgpIC0gcGVyZm9ybSBsb3cgbGV2ZXIgaW5pdGlhbGl6YXRpb25zCisgKiBAcGRldjogICAgICBwb2ludGVyIHRvIHBsYXRmb3JtIGRldmljZQorICoKKyAqIEluaXRpYWxpemVzIHJlY292ZXJ5LCBQTSBhbmQgRFZGUyByZXF1aXJlZCBkYXRhLCBiZWZvcmUgY2FsbGluZworICogY2xrIGFuZCBtZW1vcnkgaW5pdCByb3V0aW5lcy4KKyAqLworc3RhdGljIGludCBvbWFwM19icmlkZ2Vfc3RhcnR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IE5VTEw7CisJdTMyIHBoeXNfbWVtYmFzZSwgcGh5c19tZW1zaXplOworCWludCBlcnI7CisKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfUkVDT1ZFUlkKKwlicmlkZ2VfcmVjX3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgiYnJpZGdlX3JlY19xdWV1ZSIpOworCUlOSVRfV09SSygmYnJpZGdlX3JlY292ZXJ5X3dvcmssIGJyaWRnZV9yZWNvdmVyKTsKKwlJTklUX0NPTVBMRVRJT04oYnJpZGdlX2NvbXApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KKwkvKiBJbml0aWFsaXplIHRoZSB3YWl0IHF1ZXVlICovCisJYnJpZGdlX3N1c3BlbmRfZGF0YS5zdXNwZW5kZWQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJyaWRnZV9zdXNwZW5kX2RhdGEuc3VzcGVuZF93cSk7CisKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXBkYXRhLT5tcHVfc3BlZWRbaV0gPSB2ZGQxX3JhdGVfdGFibGVfYnJpZGdlW2ldLnJhdGU7CisKKwllcnIgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZpdmFfY2xrX25vdGlmaWVyLAorCQkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworCWlmIChlcnIpCisJCXByX2VycigiJXM6IGNsa19ub3RpZmllcl9yZWdpc3RlciBmYWlsZWQgZm9yIGl2YTJfY2tcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKyNlbmRpZgorI2VuZGlmCisKKwlkc3BfY2xrX2luaXQoKTsKKwlzZXJ2aWNlc19pbml0KCk7CisKKwlkcnZfZGF0YXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9kYXRhcCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJZHJ2X2RhdGFwLT5zaG1fc2l6ZSA9IHNobV9zaXplOworCWRydl9kYXRhcC0+dGNfd29yZHN3YXBvbiA9IHRjX3dvcmRzd2Fwb247CisKKwlpZiAoYmFzZV9pbWcpIHsKKwkJZHJ2X2RhdGFwLT5iYXNlX2ltZyA9IGttYWxsb2Moc3RybGVuKGJhc2VfaW1nKSArIDEsIEdGUF9LRVJORUwpOworCQlpZiAoIWRydl9kYXRhcC0+YmFzZV9pbWcpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycjI7CisJCX0KKwkJc3RybmNweShkcnZfZGF0YXAtPmJhc2VfaW1nLCBiYXNlX2ltZywgc3RybGVuKGJhc2VfaW1nKSArIDEpOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShicmlkZ2UsIGRydl9kYXRhcCk7CisKKwlpZiAoc2htX3NpemUgPCAweDEwMDAwKSB7CS8qIDY0IEtCICovCisJCWVyciA9IC1FSU5WQUw7CisJCXByX2VycigiJXM6IHNobSBzaXplIG11c3QgYmUgYXQgbGVhc3QgNjQgS0JcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIzOworCX0KKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiByZXF1ZXN0ZWQgc2htX3NpemUgPSAweCV4XG4iLCBfX2Z1bmNfXywgc2htX3NpemUpOworCisJcGh5c19tZW1iYXNlID0gcGRhdGEtPnBoeXNfbWVtcG9vbF9iYXNlOworCXBoeXNfbWVtc2l6ZSA9IHBkYXRhLT5waHlzX21lbXBvb2xfc2l6ZTsKKwlpZiAocGh5c19tZW1iYXNlID4gMCAmJiBwaHlzX21lbXNpemUgPiAwKQorCQltZW1fZXh0X3BoeXNfcG9vbF9pbml0KHBoeXNfbWVtYmFzZSwgcGh5c19tZW1zaXplKTsKKworCWlmICh0Y193b3Jkc3dhcG9uKQorCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBUQyBXb3JkIFN3YXAgaXMgZW5hYmxlZFxuIiwgX19mdW5jX18pOworCisJZHJpdmVyX2NvbnRleHQgPSBkc3BfaW5pdCgmZXJyKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRFNQIEJyaWRnZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnI0OworCX0KKworCXJldHVybiAwOworCitlcnI0OgorCW1lbV9leHRfcGh5c19wb29sX3JlbGVhc2UoKTsKK2VycjM6CisJa2ZyZWUoZHJ2X2RhdGFwLT5iYXNlX2ltZyk7CitlcnIyOgorCWtmcmVlKGRydl9kYXRhcCk7CitlcnIxOgorI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9EVkZTCisJY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZpdmFfY2xrX25vdGlmaWVyLAorCQkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworI2VuZGlmCisJZHNwX2Nsa19leGl0KCk7CisJc2VydmljZXNfZXhpdCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgb21hcDM0X3h4X2JyaWRnZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnI7CisJZGV2X3QgZGV2ID0gMDsKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfRFZGUworCWludCBpID0gMDsKKyNlbmRpZgorCisJb21hcF9kc3BicmlkZ2VfZGV2ID0gcGRldjsKKworCS8qIEdsb2JhbCBicmlkZ2UgZGV2aWNlICovCisJYnJpZGdlID0gJm9tYXBfZHNwYnJpZGdlX2Rldi0+ZGV2OworCisJLyogQnJpZGdlIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbnMgKi8KKwllcnIgPSBvbWFwM19icmlkZ2Vfc3RhcnR1cChwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisKKwkvKiB1c2UgMi42IGRldmljZSBtb2RlbCAqLworCWVyciA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgMCwgMSwgZHJpdmVyX25hbWUpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCIlczogQ2FuJ3QgZ2V0IG1ham9yICVkXG4iLCBfX2Z1bmNfXywgZHJpdmVyX21ham9yKTsKKwkJZ290byBlcnIxOworCX0KKworCWNkZXZfaW5pdCgmYnJpZGdlX2NkZXYsICZicmlkZ2VfZm9wcyk7CisJYnJpZGdlX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKworCWVyciA9IGNkZXZfYWRkKCZicmlkZ2VfY2RldiwgZGV2LCAxKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBhZGQgYnJpZGdlIGRldmljZVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjI7CisJfQorCisJLyogdWRldiBzdXBwb3J0ICovCisJYnJpZGdlX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidGlfYnJpZGdlIik7CisJaWYgKElTX0VSUihicmlkZ2VfY2xhc3MpKSB7CisJCXByX2VycigiJXM6IEVycm9yIGNyZWF0aW5nIGJyaWRnZSBjbGFzc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjM7CisJfQorCisJZHJpdmVyX21ham9yID0gTUFKT1IoZGV2KTsKKwlkZXZpY2VfY3JlYXRlKGJyaWRnZV9jbGFzcywgTlVMTCwgTUtERVYoZHJpdmVyX21ham9yLCAwKSwKKwkJICAgICAgTlVMTCwgIkRzcEJyaWRnZSIpOworCXByX2luZm8oIkRTUCBCcmlkZ2UgZHJpdmVyIGxvYWRlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyMzoKKwljZGV2X2RlbCgmYnJpZGdlX2NkZXYpOworZXJyMjoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAxKTsKK2VycjE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb21hcDM0X3h4X2JyaWRnZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlkZXZfdCBkZXZubzsKKwlib29sIHJldDsKKwlpbnQgc3RhdHVzID0gMDsKKwl2b2lkICpoZHJ2X29iaiA9IE5VTEw7CisKKwlzdGF0dXMgPSBjZmdfZ2V0X29iamVjdCgodTMyICopICZoZHJ2X29iaiwgUkVHX0RSVl9PQkpFQ1QpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19jb250OworCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMKKwlpZiAoY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZpdmFfY2xrX25vdGlmaWVyLAorCQkJCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKSkKKwkJcHJfZXJyKCIlczogY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyIGZhaWxlZCBmb3IgaXZhMl9ja1xuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0RWRlMgKi8KKworCWlmIChkcml2ZXJfY29udGV4dCkgeworCQkvKiBQdXQgdGhlIERTUCBpbiByZXNldCBzdGF0ZSAqLworCQlyZXQgPSBkc3BfZGVpbml0KGRyaXZlcl9jb250ZXh0KTsKKwkJZHJpdmVyX2NvbnRleHQgPSAwOworCQlEQkNfQVNTRVJUKHJldCA9PSB0cnVlKTsKKwl9CisKK2Z1bmNfY29udDoKKwltZW1fZXh0X3BoeXNfcG9vbF9yZWxlYXNlKCk7CisKKwlkc3BfY2xrX2V4aXQoKTsKKwlzZXJ2aWNlc19leGl0KCk7CisKKwlkZXZubyA9IE1LREVWKGRyaXZlcl9tYWpvciwgMCk7CisJY2Rldl9kZWwoJmJyaWRnZV9jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2bm8sIDEpOworCWlmIChicmlkZ2VfY2xhc3MpIHsKKwkJLyogcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSBzeXNmcyAqLworCQlkZXZpY2VfZGVzdHJveShicmlkZ2VfY2xhc3MsIE1LREVWKGRyaXZlcl9tYWpvciwgMCkpOworCQljbGFzc19kZXN0cm95KGJyaWRnZV9jbGFzcyk7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgQlJJREdFX1NVU1BFTkQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXUzMiBzdGF0dXM7CisJdTMyIGNvbW1hbmQgPSBQV1JfRU1FUkdFTkNZREVFUFNMRUVQOworCisJc3RhdHVzID0gcHdyX3NsZWVwX2RzcChjb21tYW5kLCB0aW1lX291dCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIC0xOworCisJYnJpZGdlX3N1c3BlbmRfZGF0YS5zdXNwZW5kZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEJSSURHRV9SRVNVTUUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gcHdyX3dha2VfZHNwKHRpbWVfb3V0KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gLTE7CisKKwlicmlkZ2Vfc3VzcGVuZF9kYXRhLnN1c3BlbmRlZCA9IDA7CisJd2FrZV91cCgmYnJpZGdlX3N1c3BlbmRfZGF0YS5zdXNwZW5kX3dxKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIEJSSURHRV9TVVNQRU5EIE5VTEwKKyNkZWZpbmUgQlJJREdFX1JFU1VNRSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnJpZGdlX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IEJSSURHRV9OQU1FLAorCQkgICB9LAorCS5wcm9iZSA9IG9tYXAzNF94eF9icmlkZ2VfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG9tYXAzNF94eF9icmlkZ2VfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IEJSSURHRV9TVVNQRU5ELAorCS5yZXN1bWUgPSBCUklER0VfUkVTVU1FLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYnJpZGdlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZicmlkZ2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJyaWRnZV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmJyaWRnZV9kcml2ZXIpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBvcGVucyBoYW5kbGUgdG8gdGhlCisgKiBicmlkZ2UgZHJpdmVyLgorICovCitzdGF0aWMgaW50IGJyaWRnZV9vcGVuKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQgPSBOVUxMOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIG5ldyBwcm9jZXNzIGNvbnRleHQgYW5kIGluc2VydCBpdCBpbnRvIGdsb2JhbAorCSAqIHByb2Nlc3MgY29udGV4dCBsaXN0LgorCSAqLworCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX1JFQ09WRVJZCisJaWYgKHJlY292ZXIpIHsKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLIHx8CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmJyaWRnZV9vcGVuX2NvbXApKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisjZW5kaWYKKwlwcl9jdHh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHByb2Nlc3NfY29udGV4dCksIEdGUF9LRVJORUwpOworCWlmIChwcl9jdHh0KSB7CisJCXByX2N0eHQtPnJlc19zdGF0ZSA9IFBST0NfUkVTX0FMTE9DQVRFRDsKKwkJc3Bpbl9sb2NrX2luaXQoJnByX2N0eHQtPmRtbV9tYXBfbG9jayk7CisJCUlOSVRfTElTVF9IRUFEKCZwcl9jdHh0LT5kbW1fbWFwX2xpc3QpOworCQlzcGluX2xvY2tfaW5pdCgmcHJfY3R4dC0+ZG1tX3Jzdl9sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnByX2N0eHQtPmRtbV9yc3ZfbGlzdCk7CisKKwkJcHJfY3R4dC0+bm9kZV9pZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZHIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHByX2N0eHQtPm5vZGVfaWQpIHsKKwkJCWlkcl9pbml0KHByX2N0eHQtPm5vZGVfaWQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcHJfY3R4dC0+c3RyZWFtX2lkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlkciksIEdGUF9LRVJORUwpOworCQlpZiAocHJfY3R4dC0+c3RyZWFtX2lkKQorCQkJaWRyX2luaXQocHJfY3R4dC0+c3RyZWFtX2lkKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KK2VycjoKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBwcl9jdHh0OworI2lmZGVmIENPTkZJR19USURTUEJSSURHRV9SRUNPVkVSWQorCWlmICghc3RhdHVzKQorCQlhdG9taWNfaW5jKCZicmlkZ2VfY3JlZik7CisjZW5kaWYKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBjbG9zZXMgaGFuZGxlIHRvIHRoZSBicmlkZ2UKKyAqIGRyaXZlci4KKyAqLworc3RhdGljIGludCBicmlkZ2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0OworCisJaWYgKCFmaWxwLT5wcml2YXRlX2RhdGEpIHsKKwkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQorCisJcHJfY3R4dCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCWRydl9yZW1vdmVfYWxsX3Jlc291cmNlcyhwcl9jdHh0KTsKKwlwcm9jX2RldGFjaChwcl9jdHh0KTsKKwlrZnJlZShwcl9jdHh0KTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKK2VycjoKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfUkVDT1ZFUlkKKwlpZiAoIWF0b21pY19kZWNfcmV0dXJuKCZicmlkZ2VfY3JlZikpCisJCWNvbXBsZXRlKCZicmlkZ2VfY29tcCk7CisjZW5kaWYKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIElPIGludGVyZmFjZSB0byB0aGUgYnJpZGdlIGRyaXZlci4gKi8KK3N0YXRpYyBsb25nIGJyaWRnZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNvZGUsCisJCQkgdW5zaWduZWQgbG9uZyBhcmdzKQoreworCWludCBzdGF0dXM7CisJdTMyIHJldHZhbCA9IDA7CisJdW5pb24gdHJhcHBlZF9hcmdzIGJ1Zl9pbjsKKworCURCQ19SRVFVSVJFKGZpbHAgIT0gTlVMTCk7CisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX1JFQ09WRVJZCisJaWYgKHJlY292ZXIpIHsKKwkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BNCisJc3RhdHVzID0gb21hcDM0X3h4YnJpZGdlX3N1c3BlbmRfbG9ja291dCgmYnJpZGdlX3N1c3BlbmRfZGF0YSwgZmlscCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworI2VuZGlmCisKKwlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkgeworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisKKwlzdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYnVmX2luLCAodW5pb24gdHJhcHBlZF9hcmdzICopYXJncywKKwkJCQlzaXplb2YodW5pb24gdHJhcHBlZF9hcmdzKSk7CisKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBhcGlfY2FsbF9kZXZfaW9jdGwoY29kZSwgJmJ1Zl9pbiwgJnJldHZhbCwKKwkJCQkJICAgICBmaWxwLT5wcml2YXRlX2RhdGEpOworCisJCWlmICghc3RhdHVzKSB7CisJCQlzdGF0dXMgPSByZXR2YWw7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBJT0NUTCBGYWlsZWQsIGNvZGU6IDB4JXggIgorCQkJCSJzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIGNvZGUsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSAtMTsKKwkJfQorCisJfQorCitlcnI6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVGhpcyBmdW5jdGlvbiBtYXBzIGtlcm5lbCBzcGFjZSBtZW1vcnkgdG8gdXNlciBzcGFjZSBtZW1vcnkuICovCitzdGF0aWMgaW50IGJyaWRnZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1MzIgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXUzMiBzdGF0dXM7CisKKwlEQkNfQVNTRVJUKHZtYS0+dm1fc3RhcnQgPCB2bWEtPnZtX2VuZCk7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEIHwgVk1fSU87CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCWRldl9kYmcoYnJpZGdlLCAiJXM6IHZtIGZpbHAgJXAgb2Zmc2V0ICV4IHN0YXJ0ICVseCBlbmQgJWx4IHBhZ2VfcHJvdCAiCisJCSIlbHggZmxhZ3MgJWx4XG4iLCBfX2Z1bmNfXywgZmlscCwgb2Zmc2V0LAorCQl2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgdm1hLT52bV9wYWdlX3Byb3QsIHZtYS0+dm1fZmxhZ3MpOworCisJc3RhdHVzID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKKwkJCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlzdGF0dXMgPSAtRUFHQUlOOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVG8gcmVtb3ZlIGFsbCBwcm9jZXNzIHJlc291cmNlcyBiZWZvcmUgcmVtb3ZpbmcgdGhlIHByb2Nlc3MgZnJvbSB0aGUKKyAqIHByb2Nlc3MgY29udGV4dCBsaXN0ICovCitpbnQgZHJ2X3JlbW92ZV9hbGxfcmVzb3VyY2VzKHZvaWQgKnByb2Nlc3NfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpjdHh0ID0gKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKilwcm9jZXNzX2N0eHQ7CisJZHJ2X3JlbW92ZV9hbGxfc3RybV9yZXNfZWxlbWVudHMoY3R4dCk7CisJZHJ2X3JlbW92ZV9hbGxfbm9kZV9yZXNfZWxlbWVudHMoY3R4dCk7CisJZHJ2X3JlbW92ZV9hbGxfZG1tX3Jlc19lbGVtZW50cyhjdHh0KTsKKwljdHh0LT5yZXNfc3RhdGUgPSBQUk9DX1JFU19GUkVFRDsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBCcmlkZ2UgZHJpdmVyIGluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KK21vZHVsZV9pbml0KGJyaWRnZV9pbml0KTsKK21vZHVsZV9leGl0KGJyaWRnZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydl9pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA3MDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZHJ2X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBkcnZfaW50ZXJmYWNlLmgKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZglfRFJWX0lOVEVSRkFDRV9IXworI2RlZmluZSBfRFJWX0lOVEVSRkFDRV9IXworCisvKiBQcm90b3R5cGVzIGZvciBhbGwgZnVuY3Rpb25zIGluIHRoaXMgYnJpZGdlICovCitzdGF0aWMgaW50IF9faW5pdCBicmlkZ2VfaW5pdCh2b2lkKTsJLyogSW5pdGlhbGl6ZSBicmlkZ2UgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBicmlkZ2VfZXhpdCh2b2lkKTsJLyogT3Bwb3NpdGUgb2YgaW5pdGlhbGl6ZSAqLworc3RhdGljIGludCBicmlkZ2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CS8qIE9wZW4gKi8KK3N0YXRpYyBpbnQgYnJpZGdlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZpbHApOwkvKiBSZWxlYXNlICovCitzdGF0aWMgbG9uZyBicmlkZ2VfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjb2RlLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJncyk7CitzdGF0aWMgaW50IGJyaWRnZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisjZW5kaWYgLyogaWZuZGVmIF9EUlZfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kc3BkcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2RzcGRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGYzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kc3BkcnYuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIGRzcGRydi5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIEludGVyZmFjZSB0byBhbGxvY2F0ZSBhbmQgZnJlZSBicmlkZ2UgcmVzb3VyY2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rydi5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwYXBpLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvdXJjZSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL21nci5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3BkcnYuaD4KKworLyoKKyAqICA9PT09PT09PSBkc3BfaW5pdCA9PT09PT09PQorICogIAlBbGxvY2F0ZXMgYnJpZGdlIHJlc291cmNlcy4gTG9hZHMgYSBiYXNlIGltYWdlIG9udG8gRFNQLCBpZiBzcGVjaWZpZWQuCisgKi8KK3UzMiBkc3BfaW5pdCh1MzIgKmluaXRfc3RhdHVzKQoreworCWNoYXIgZGV2X25vZGVbTUFYUkVHUEFUSExFTkdUSF0gPSAiVElPTUFQMTUxMCI7CisJaW50IHN0YXR1cyA9IC1FUEVSTTsKKwlzdHJ1Y3QgZHJ2X29iamVjdCAqZHJ2X29iaiA9IE5VTEw7CisJdTMyIGRldmljZV9ub2RlOworCXUzMiBkZXZpY2Vfbm9kZV9zdHJpbmc7CisKKwlpZiAoIWFwaV9pbml0KCkpCisJCWdvdG8gZnVuY19jb250OworCisJc3RhdHVzID0gZHJ2X2NyZWF0ZSgmZHJ2X29iaik7CisJaWYgKHN0YXR1cykgeworCQlhcGlfZXhpdCgpOworCQlnb3RvIGZ1bmNfY29udDsKKwl9CisKKwkvKiBFbmQgZHJ2X2NyZWF0ZSAqLworCS8qIFJlcXVlc3QgUmVzb3VyY2VzICovCisJc3RhdHVzID0gZHJ2X3JlcXVlc3RfcmVzb3VyY2VzKCh1MzIpICZkZXZfbm9kZSwgJmRldmljZV9ub2RlX3N0cmluZyk7CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogQXR0ZW1wdCB0byBTdGFydCB0aGUgRGV2aWNlICovCisJCXN0YXR1cyA9IGRldl9zdGFydF9kZXZpY2UoKHN0cnVjdCBjZmdfZGV2bm9kZSAqKQorCQkJCQkgIGRldmljZV9ub2RlX3N0cmluZyk7CisJCWlmIChzdGF0dXMpCisJCQkodm9pZClkcnZfcmVsZWFzZV9yZXNvdXJjZXMKKwkJCSAgICAoKHUzMikgZGV2aWNlX25vZGVfc3RyaW5nLCBkcnZfb2JqKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBkcnZfcmVxdWVzdF9yZXNvdXJjZXMgRmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9CisKKwkvKiBVbndpbmQgd2hhdGV2ZXIgd2FzIGxvYWRlZCAqLworCWlmIChzdGF0dXMpIHsKKwkJLyogaXJyZXNwZWN0aXZlIG9mIHRoZSBzdGF0dXMgb2YgZGV2X3JlbW92ZV9kZXZpY2Ugd2UgY29uaXRpbnVlCisJCSAqIHVubG9hZGluZy4gR2V0IHRoZSBEcml2ZXIgT2JqZWN0IGl0ZXJhdGUgdGhyb3VnaCBhbmQgcmVtb3ZlLgorCQkgKiBSZXNldCB0aGUgc3RhdHVzIHRvIEVfRkFJTCB0byBhdm9pZCBnb2luZyB0aHJvdWdoCisJCSAqIGFwaV9pbml0X2NvbXBsZXRlMi4gKi8KKwkJZm9yIChkZXZpY2Vfbm9kZSA9IGRydl9nZXRfZmlyc3RfZGV2X2V4dGVuc2lvbigpOworCQkgICAgIGRldmljZV9ub2RlICE9IDA7CisJCSAgICAgZGV2aWNlX25vZGUgPSBkcnZfZ2V0X25leHRfZGV2X2V4dGVuc2lvbihkZXZpY2Vfbm9kZSkpIHsKKwkJCSh2b2lkKWRldl9yZW1vdmVfZGV2aWNlKChzdHJ1Y3QgY2ZnX2Rldm5vZGUgKikKKwkJCQkJCWRldmljZV9ub2RlKTsKKwkJCSh2b2lkKWRydl9yZWxlYXNlX3Jlc291cmNlcygodTMyKSBkZXZpY2Vfbm9kZSwgZHJ2X29iaik7CisJCX0KKwkJLyogUmVtb3ZlIHRoZSBEcml2ZXIgT2JqZWN0ICovCisJCSh2b2lkKWRydl9kZXN0cm95KGRydl9vYmopOworCQlkcnZfb2JqID0gTlVMTDsKKwkJYXBpX2V4aXQoKTsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogTG9naWNhbCBkZXZpY2UgZmFpbGVkIGluaXRcbiIsIF9fZnVuY19fKTsKKwl9CQkJLyogVW53aW5kaW5nIHRoZSBsb2FkZWQgZHJpdmVycyAqLworZnVuY19jb250OgorCS8qIEF0dGVtcHQgdG8gU3RhcnQgdGhlIEJvYXJkICovCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogQlJEX0F1dG9TdGFydCBjb3VsZCBmYWlsIGlmIHRoZSBkc3AgZXhlY3VldGFibGUgaXMgbm90IHRoZQorCQkgKiBjb3JyZWN0IG9uZS4gV2Ugc2hvdWxkIG5vdCBwcm9wYWdhdGUgdGhhdCBlcnJvcgorCQkgKiBpbnRvIHRoZSBkZXZpY2UgbG9hZGVyLiAqLworCQkodm9pZClhcGlfaW5pdF9jb21wbGV0ZTIoKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9CQkJLyogRW5kIGFwaV9pbml0X2NvbXBsZXRlMiAqLworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgZHJ2X29iaiAhPSBOVUxMKSB8fAorCQkgICAoc3RhdHVzICYmIGRydl9vYmogPT0gTlVMTCkpOworCSppbml0X3N0YXR1cyA9IHN0YXR1czsKKwkvKiBSZXR1cm4gdGhlIERyaXZlciBPYmplY3QgKi8KKwlyZXR1cm4gKHUzMikgZHJ2X29iajsKK30KKworLyoKKyAqICA9PT09PT09PSBkc3BfZGVpbml0ID09PT09PT09CisgKiAgCUZyZWVzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBicmlkZ2UuCisgKi8KK2Jvb2wgZHNwX2RlaW5pdCh1MzIgZGV2aWNlX2NvbnRleHQpCit7CisJYm9vbCByZXQgPSB0cnVlOworCXUzMiBkZXZpY2Vfbm9kZTsKKwlzdHJ1Y3QgbWdyX29iamVjdCAqbWdyX29iaiA9IE5VTEw7CisKKwl3aGlsZSAoKGRldmljZV9ub2RlID0gZHJ2X2dldF9maXJzdF9kZXZfZXh0ZW5zaW9uKCkpICE9IDApIHsKKwkJKHZvaWQpZGV2X3JlbW92ZV9kZXZpY2UoKHN0cnVjdCBjZmdfZGV2bm9kZSAqKWRldmljZV9ub2RlKTsKKworCQkodm9pZClkcnZfcmVsZWFzZV9yZXNvdXJjZXMoKHUzMikgZGV2aWNlX25vZGUsCisJCQkJCShzdHJ1Y3QgZHJ2X29iamVjdCAqKWRldmljZV9jb250ZXh0KTsKKwl9CisKKwkodm9pZClkcnZfZGVzdHJveSgoc3RydWN0IGRydl9vYmplY3QgKilkZXZpY2VfY29udGV4dCk7CisKKwkvKiBHZXQgdGhlIE1hbmFnZXIgT2JqZWN0IGZyb20gUmVnaXN0cnkKKwkgKiBNR1IgRGVzdHJveSB3aWxsIHVubG9hZCB0aGUgRENEIGRsbCAqLworCWlmICghY2ZnX2dldF9vYmplY3QoKHUzMiAqKSAmbWdyX29iaiwgUkVHX01HUl9PQkpFQ1QpKQorCQkodm9pZCltZ3JfZGVzdHJveShtZ3Jfb2JqKTsKKworCWFwaV9leGl0KCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2EzOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvbWdyLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBtZ3IuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBNYW5hZ2VyIGludGVyZmFjZSB0byB0aGUgZGV2aWNlIG9iamVjdCBhdCB0aGUKKyAqIGRyaXZlciBsZXZlbC4gVGhpcyBxdWVyaWVzIHRoZSBOREIgZGF0YSBiYXNlIGFuZCByZXRyaWV2ZXMgdGhlCisgKiBkYXRhIGFib3V0IE5vZGUgYW5kIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdGhlcnMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkY2QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9tZ3IuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZXMsIERhdGEgU3RydWN0dXJlcywgVHlwZWRlZnMgKi8KKyNkZWZpbmUgWkxETExOQU1FICAgICAgICAgICAgICAgIiIKKworc3RydWN0IG1ncl9vYmplY3QgeworCXN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3I7CS8qIFByb2MvTm9kZSBkYXRhIG1hbmFnZXIgKi8KK307CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWxzICovCitzdGF0aWMgdTMyIHJlZnM7CisKKy8qCisgKiAgPT09PT09PT09IG1ncl9jcmVhdGUgPT09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgTUdSIE9iamVjdCBnZXRzIGNyZWF0ZWQgb25seSBvbmNlIGR1cmluZyBkcml2ZXIgTG9hZGluZy4KKyAqLworaW50IG1ncl9jcmVhdGUoc3RydWN0IG1ncl9vYmplY3QgKiptZ3Jfb2JqLAorCQkgICAgICBzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlX29iaikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbWdyX29iamVjdCAqcG1ncl9vYmogPSBOVUxMOworCisJREJDX1JFUVVJUkUobWdyX29iaiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlwbWdyX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtZ3Jfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBtZ3Jfb2JqKSB7CisJCXN0YXR1cyA9IGRjZF9jcmVhdGVfbWFuYWdlcihaTERMTE5BTUUsICZwbWdyX29iai0+aGRjZF9tZ3IpOworCQlpZiAoIXN0YXR1cykgeworCQkJLyogSWYgc3VjY2VlZGVkIHN0b3JlIHRoZSBoYW5kbGUgaW4gdGhlIE1HUiBPYmplY3QgKi8KKwkJCXN0YXR1cyA9IGNmZ19zZXRfb2JqZWN0KCh1MzIpIHBtZ3Jfb2JqLCBSRUdfTUdSX09CSkVDVCk7CisJCQlpZiAoIXN0YXR1cykgeworCQkJCSptZ3Jfb2JqID0gcG1ncl9vYmo7CisJCQl9IGVsc2UgeworCQkJCWRjZF9kZXN0cm95X21hbmFnZXIocG1ncl9vYmotPmhkY2RfbWdyKTsKKwkJCQlrZnJlZShwbWdyX29iaik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBmYWlsZWQgdG8gQ3JlYXRlIERDRCBNYW5hZ2VyICovCisJCQlrZnJlZShwbWdyX29iaik7CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KKworCURCQ19FTlNVUkUoc3RhdHVzIHx8IHBtZ3Jfb2JqKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09PSBtZ3JfZGVzdHJveSA9PT09PT09PT0KKyAqICAgICBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZHVyaW5nIGJyaWRnZSBkcml2ZXIgdW5sb2FkaW5nLkZyZWVzIE1HUiBvYmplY3QuCisgKi8KK2ludCBtZ3JfZGVzdHJveShzdHJ1Y3QgbWdyX29iamVjdCAqaG1ncl9vYmopCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IG1ncl9vYmplY3QgKnBtZ3Jfb2JqID0gKHN0cnVjdCBtZ3Jfb2JqZWN0ICopaG1ncl9vYmo7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaG1ncl9vYmopOworCisJLyogRnJlZSByZXNvdXJjZXMgKi8KKwlpZiAoaG1ncl9vYmotPmhkY2RfbWdyKQorCQlkY2RfZGVzdHJveV9tYW5hZ2VyKGhtZ3Jfb2JqLT5oZGNkX21ncik7CisKKwlrZnJlZShwbWdyX29iaik7CisJLyogVXBkYXRlIHRoZSBSZWdpc3RyeSB3aXRoIE5VTEwgZm9yIE1HUiBPYmplY3QgKi8KKwkodm9pZCljZmdfc2V0X29iamVjdCgwLCBSRUdfTUdSX09CSkVDVCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG1ncl9lbnVtX25vZGVfaW5mbyA9PT09PT09PQorICogICAgICBFbnVtZXJhdGUgYW5kIGdldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IG5vZGVzIGNvbmZpZ3VyZWQKKyAqICAgICAgaW4gdGhlIG5vZGUgZGF0YWJhc2UuCisgKi8KK2ludCBtZ3JfZW51bV9ub2RlX2luZm8odTMyIG5vZGVfaWQsIHN0cnVjdCBkc3BfbmRicHJvcHMgKnBuZGJfcHJvcHMsCisJCQkgICAgICB1MzIgdW5kYl9wcm9wc19zaXplLCB1MzIgKnB1X251bV9ub2RlcykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNwX3V1aWQgbm9kZV91dWlkLCB0ZW1wX3V1aWQ7CisJdTMyIHRlbXBfaW5kZXggPSAwOworCXUzMiBub2RlX2luZGV4ID0gMDsKKwlzdHJ1Y3QgZGNkX2dlbmVyaWNvYmogZ2VuX29iajsKKwlzdHJ1Y3QgbWdyX29iamVjdCAqcG1ncl9vYmogPSBOVUxMOworCisJREJDX1JFUVVJUkUocG5kYl9wcm9wcyAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwdV9udW1fbm9kZXMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUodW5kYl9wcm9wc19zaXplID49IHNpemVvZihzdHJ1Y3QgZHNwX25kYnByb3BzKSk7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJKnB1X251bV9ub2RlcyA9IDA7CisJLyogR2V0IFRoZSBNYW5hZ2VyIE9iamVjdCBmcm9tIHRoZSBSZWdpc3RyeSAqLworCXN0YXR1cyA9IGNmZ19nZXRfb2JqZWN0KCh1MzIgKikgJnBtZ3Jfb2JqLCBSRUdfTUdSX09CSkVDVCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisKKwlEQkNfQVNTRVJUKHBtZ3Jfb2JqKTsKKwkvKiBGb3JldmVyIGxvb3AgdGlsbCB3ZSBoaXQgZmFpbGVkIG9yIG5vIG1vcmUgaXRlbXMgaW4gdGhlCisJICogRW51bWVyYXRpb24uIFdlIHdpbGwgZXhpdCB0aGUgbG9vcCBvdGhlciB0aGFuIDA7ICovCisJd2hpbGUgKHN0YXR1cyA9PSAwKSB7CisJCXN0YXR1cyA9IGRjZF9lbnVtZXJhdGVfb2JqZWN0KHRlbXBfaW5kZXgrKywgRFNQX0RDRE5PREVUWVBFLAorCQkJCQkgICAgICAmdGVtcF91dWlkKTsKKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlub2RlX2luZGV4Kys7CisJCQlpZiAobm9kZV9pZCA9PSAobm9kZV9pbmRleCAtIDEpKQorCQkJCW5vZGVfdXVpZCA9IHRlbXBfdXVpZDsKKworCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCWlmIChub2RlX2lkID4gKG5vZGVfaW5kZXggLSAxKSkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGRjZF9nZXRfb2JqZWN0X2RlZihwbWdyX29iai0+aGRjZF9tZ3IsCisJCQkJCQkgICAgKHN0cnVjdCBkc3BfdXVpZCAqKQorCQkJCQkJICAgICZub2RlX3V1aWQsIERTUF9EQ0ROT0RFVFlQRSwKKwkJCQkJCSAgICAmZ2VuX29iaik7CisJCQlpZiAoIXN0YXR1cykgeworCQkJCS8qIEdldCB0aGUgT2JqIGRlZiAqLworCQkJCSpwbmRiX3Byb3BzID0KKwkJCQkgICAgZ2VuX29iai5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHM7CisJCQkJKnB1X251bV9ub2RlcyA9IG5vZGVfaW5kZXg7CisJCQl9CisJCX0KKwl9CisKK2Z1bmNfY29udDoKKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmICpwdV9udW1fbm9kZXMgPiAwKSB8fAorCQkgICAoc3RhdHVzICYmICpwdV9udW1fbm9kZXMgPT0gMCkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBtZ3JfZW51bV9wcm9jZXNzb3JfaW5mbyA9PT09PT09PQorICogICAgICBFbnVtZXJhdGUgYW5kIGdldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZQorICogICAgICBEU1AgcHJvY2Vzc29ycy4KKyAqLworaW50IG1ncl9lbnVtX3Byb2Nlc3Nvcl9pbmZvKHUzMiBwcm9jZXNzb3JfaWQsCisJCQkJICAgc3RydWN0IGRzcF9wcm9jZXNzb3JpbmZvICoKKwkJCQkgICBwcm9jZXNzb3JfaW5mbywgdTMyIHByb2Nlc3Nvcl9pbmZvX3NpemUsCisJCQkJICAgdTggKnB1X251bV9wcm9jcykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzMSA9IDA7CisJaW50IHN0YXR1czIgPSAwOworCXN0cnVjdCBkc3BfdXVpZCB0ZW1wX3V1aWQ7CisJdTMyIHRlbXBfaW5kZXggPSAwOworCXUzMiBwcm9jX2luZGV4ID0gMDsKKwlzdHJ1Y3QgZGNkX2dlbmVyaWNvYmogZ2VuX29iajsKKwlzdHJ1Y3QgbWdyX29iamVjdCAqcG1ncl9vYmogPSBOVUxMOworCXN0cnVjdCBtZ3JfcHJvY2Vzc29yZXh0aW5mbyAqZXh0X2luZm87CisJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqOworCXN0cnVjdCBkcnZfb2JqZWN0ICpoZHJ2X29iajsKKwl1OCBkZXZfdHlwZTsKKwlzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlOworCWJvb2wgcHJvY19kZXRlY3QgPSBmYWxzZTsKKworCURCQ19SRVFVSVJFKHByb2Nlc3Nvcl9pbmZvICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHB1X251bV9wcm9jcyAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwcm9jZXNzb3JfaW5mb19zaXplID49IHNpemVvZihzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmluZm8pKTsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwkqcHVfbnVtX3Byb2NzID0gMDsKKwlzdGF0dXMgPSBjZmdfZ2V0X29iamVjdCgodTMyICopICZoZHJ2X29iaiwgUkVHX0RSVl9PQkpFQ1QpOworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGRydl9nZXRfZGV2X29iamVjdChwcm9jZXNzb3JfaWQsIGhkcnZfb2JqLCAmaGRldl9vYmopOworCQlpZiAoIXN0YXR1cykgeworCQkJc3RhdHVzID0gZGV2X2dldF9kZXZfdHlwZShoZGV2X29iaiwgKHU4ICopICZkZXZfdHlwZSk7CisJCQlzdGF0dXMgPSBkZXZfZ2V0X2Rldl9ub2RlKGhkZXZfb2JqLCAmZGV2X25vZGUpOworCQkJaWYgKGRldl90eXBlICE9IERTUF9VTklUKQorCQkJCXN0YXR1cyA9IC1FUEVSTTsKKworCQkJaWYgKCFzdGF0dXMpCisJCQkJcHJvY2Vzc29yX2luZm8tPnByb2Nlc3Nvcl90eXBlID0gRFNQVFlQRTY0OworCQl9CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBHZXQgVGhlIE1hbmFnZXIgT2JqZWN0IGZyb20gdGhlIFJlZ2lzdHJ5ICovCisJaWYgKGNmZ19nZXRfb2JqZWN0KCh1MzIgKikgJnBtZ3Jfb2JqLCBSRUdfTUdSX09CSkVDVCkpIHsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogRmFpbGVkIHRvIGdldCBNR1IgT2JqZWN0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCURCQ19BU1NFUlQocG1ncl9vYmopOworCS8qIEZvcmV2ZXIgbG9vcCB0aWxsIHdlIGhpdCBubyBtb3JlIGl0ZW1zIGluIHRoZQorCSAqIEVudW1lcmF0aW9uLiBXZSB3aWxsIGV4aXQgdGhlIGxvb3Agb3RoZXIgdGhhbiAwOyAqLworCXdoaWxlIChzdGF0dXMxID09IDApIHsKKwkJc3RhdHVzMSA9IGRjZF9lbnVtZXJhdGVfb2JqZWN0KHRlbXBfaW5kZXgrKywKKwkJCQkJICAgICAgIERTUF9EQ0RQUk9DRVNTT1JUWVBFLAorCQkJCQkgICAgICAgJnRlbXBfdXVpZCk7CisJCWlmIChzdGF0dXMxICE9IDApCisJCQlicmVhazsKKworCQlwcm9jX2luZGV4Kys7CisJCS8qIEdldCB0aGUgT2JqZWN0IHByb3BlcnRpZXMgdG8gZmluZCB0aGUgRGV2aWNlL1Byb2Nlc3NvcgorCQkgKiBUeXBlICovCisJCWlmIChwcm9jX2RldGVjdCAhPSBmYWxzZSkKKwkJCWNvbnRpbnVlOworCisJCXN0YXR1czIgPSBkY2RfZ2V0X29iamVjdF9kZWYocG1ncl9vYmotPmhkY2RfbWdyLAorCQkJCQkgICAgIChzdHJ1Y3QgZHNwX3V1aWQgKikmdGVtcF91dWlkLAorCQkJCQkgICAgIERTUF9EQ0RQUk9DRVNTT1JUWVBFLCAmZ2VuX29iaik7CisJCWlmICghc3RhdHVzMikgeworCQkJLyogR2V0IHRoZSBPYmogZGVmICovCisJCQlpZiAocHJvY2Vzc29yX2luZm9fc2l6ZSA8CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBtZ3JfcHJvY2Vzc29yZXh0aW5mbykpIHsKKwkJCQkqcHJvY2Vzc29yX2luZm8gPSBnZW5fb2JqLm9ial9kYXRhLnByb2NfaW5mbzsKKwkJCX0gZWxzZSB7CisJCQkJLyogZXh0ZW5kZWQgaW5mbyAqLworCQkJCWV4dF9pbmZvID0gKHN0cnVjdCBtZ3JfcHJvY2Vzc29yZXh0aW5mbyAqKQorCQkJCSAgICBwcm9jZXNzb3JfaW5mbzsKKwkJCQkqZXh0X2luZm8gPSBnZW5fb2JqLm9ial9kYXRhLmV4dF9wcm9jX29iajsKKwkJCX0KKwkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEdvdCBwcm9jdHlwZSAgZnJvbSBEQ0QgJXhcbiIsCisJCQkJX19mdW5jX18sIHByb2Nlc3Nvcl9pbmZvLT5wcm9jZXNzb3JfdHlwZSk7CisJCQkvKiBTZWUgaWYgd2UgZ290IHRoZSBuZWVkZWQgcHJvY2Vzc29yICovCisJCQlpZiAoZGV2X3R5cGUgPT0gRFNQX1VOSVQpIHsKKwkJCQlpZiAocHJvY2Vzc29yX2luZm8tPnByb2Nlc3Nvcl90eXBlID09CisJCQkJICAgIERTUFBST0NUWVBFX0M2NCkKKwkJCQkJcHJvY19kZXRlY3QgPSB0cnVlOworCQkJfSBlbHNlIGlmIChkZXZfdHlwZSA9PSBJVkFfVU5JVCkgeworCQkJCWlmIChwcm9jZXNzb3JfaW5mby0+cHJvY2Vzc29yX3R5cGUgPT0KKwkJCQkgICAgSVZBUFJPQ1RZUEVfQVJNNykKKwkJCQkJcHJvY19kZXRlY3QgPSB0cnVlOworCQkJfQorCQkJLyogVXNlciBhcHBsY2lhdGl1b25zIGFvbmx5IGNoZWNrIGZvciBjaGlwIHR5cGUsIHNvCisJCQkgKiB0aGlzIGNsdW1zeSBvdmVyd3JpdGUgKi8KKwkJCXByb2Nlc3Nvcl9pbmZvLT5wcm9jZXNzb3JfdHlwZSA9IERTUFRZUEU2NDsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IEZhaWxlZCB0byBnZXQgRENEIHByb2Nlc3NvciBpbmZvICIKKwkJCQkiJXhcbiIsIF9fZnVuY19fLCBzdGF0dXMyKTsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCX0KKwkqcHVfbnVtX3Byb2NzID0gcHJvY19pbmRleDsKKwlpZiAocHJvY19kZXRlY3QgPT0gZmFsc2UpIHsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogRmFpbGVkIHRvIGdldCBwcm9jIGluZm8gZnJvbSBEQ0QsIHNvIHVzZSAiCisJCQkiQ0ZHIHJlZ2lzdHJ5XG4iLCBfX2Z1bmNfXyk7CisJCXByb2Nlc3Nvcl9pbmZvLT5wcm9jZXNzb3JfdHlwZSA9IERTUFRZUEU2NDsKKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG1ncl9leGl0ID09PT09PT09CisgKiAgICAgIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQsIGFuZCBmcmVlIHJlc291cmNlcyB3aGVuIHJlZmVyZW5jZSBjb3VudCBpcworICogICAgICAwLgorICovCit2b2lkIG1ncl9leGl0KHZvaWQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCXJlZnMtLTsKKwlpZiAocmVmcyA9PSAwKQorCQlkY2RfZXhpdCgpOworCisJREJDX0VOU1VSRShyZWZzID49IDApOworfQorCisvKgorICogID09PT09PT09IG1ncl9nZXRfZGNkX2hhbmRsZSA9PT09PT09PQorICogICAgICBSZXRyaWV2ZXMgdGhlIE1HUiBoYW5kbGUuIEFjY2Vzc29yIEZ1bmN0aW9uLgorICovCitpbnQgbWdyX2dldF9kY2RfaGFuZGxlKHN0cnVjdCBtZ3Jfb2JqZWN0ICptZ3JfaGFuZGxlLAorCQkJICAgICAgdTMyICpkY2RfaGFuZGxlKQoreworCWludCBzdGF0dXMgPSAtRVBFUk07CisJc3RydWN0IG1ncl9vYmplY3QgKnBtZ3Jfb2JqID0gKHN0cnVjdCBtZ3Jfb2JqZWN0ICopbWdyX2hhbmRsZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkY2RfaGFuZGxlICE9IE5VTEwpOworCisJKmRjZF9oYW5kbGUgPSAodTMyKSBOVUxMOworCWlmIChwbWdyX29iaikgeworCQkqZGNkX2hhbmRsZSA9ICh1MzIpIHBtZ3Jfb2JqLT5oZGNkX21ncjsKKwkJc3RhdHVzID0gMDsKKwl9CisJREJDX0VOU1VSRSgoIXN0YXR1cyAmJiAqZGNkX2hhbmRsZSAhPSAodTMyKSBOVUxMKSB8fAorCQkgICAoc3RhdHVzICYmICpkY2RfaGFuZGxlID09ICh1MzIpIE5VTEwpKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbWdyX2luaXQgPT09PT09PT0KKyAqICAgICAgSW5pdGlhbGl6ZSBNR1IncyBwcml2YXRlIHN0YXRlLCBrZWVwaW5nIGEgcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggY2FsbC4KKyAqLworYm9vbCBtZ3JfaW5pdCh2b2lkKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKwlib29sIGluaXRfZGNkID0gZmFsc2U7CisKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCisJaWYgKHJlZnMgPT0gMCkgeworCQlpbml0X2RjZCA9IGRjZF9pbml0KCk7CS8qICBEQ0QgTW9kdWxlICovCisKKwkJaWYgKCFpbml0X2RjZCkKKwkJCXJldCA9IGZhbHNlOworCX0KKworCWlmIChyZXQpCisJCXJlZnMrKzsKKworCURCQ19FTlNVUkUoKHJldCAmJiAocmVmcyA+IDApKSB8fCAoIXJldCAmJiAocmVmcyA+PSAwKSkpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBtZ3Jfd2FpdF9mb3JfYnJpZGdlX2V2ZW50cyA9PT09PT09PQorICogICAgICBCbG9jayBvbiBhbnkgQnJpZGdlIGV2ZW50KHMpCisgKi8KK2ludCBtZ3Jfd2FpdF9mb3JfYnJpZGdlX2V2ZW50cyhzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbiAqKmFub3RpZmljYXRpb25zLAorCQkJCSAgICAgIHUzMiBjb3VudCwgdTMyICpwdV9pbmRleCwKKwkJCQkgICAgICB1MzIgdXRpbWVvdXQpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgc3luY19vYmplY3QgKnN5bmNfZXZlbnRzW01BWF9FVkVOVFNdOworCXUzMiBpOworCisJREJDX1JFUVVJUkUoY291bnQgPCBNQVhfRVZFTlRTKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlzeW5jX2V2ZW50c1tpXSA9IGFub3RpZmljYXRpb25zW2ldLT5oYW5kbGU7CisKKwlzdGF0dXMgPSBzeW5jX3dhaXRfb25fbXVsdGlwbGVfZXZlbnRzKHN5bmNfZXZlbnRzLCBjb3VudCwgdXRpbWVvdXQsCisJCQkJCSAgICAgIHB1X2luZGV4KTsKKworCXJldHVybiBzdGF0dXM7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY0ZWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCkBAIC0wLDAgKzEsMTk3NCBAQAorLyoKKyAqIG5sZHIuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgZHluYW1pYyArIG92ZXJsYXkgTm9kZSBsb2FkZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiBQbGF0Zm9ybSBtYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NvZC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kZXYuaD4KKworLyogUmVzb3VyY2UgbWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmxsLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGNkLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3JtbS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS91dWlkdXRpbC5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL25sZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9nY2QuaD4KKworLyogTmFtZSBvZiBzZWN0aW9uIGNvbnRhaW5pbmcgZHluYW1pYyBsb2FkIG1lbSAqLworI2RlZmluZSBEWU5NRU1TRUNUICAiLmRzcGJyaWRnZV9tZW0iCisKKy8qIE5hbWUgb2Ygc2VjdGlvbiBjb250YWluaW5nIGRlcGVuZGVudCBsaWJyYXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIERFUExJQlNFQ1QgICIuZHNwYnJpZGdlX2RlcGxpYnMiCisKKy8qIE1heCBkZXB0aCBvZiByZWN1cnNpb24gZm9yIGxvYWRpbmcgbm9kZSdzIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKyNkZWZpbmUgTUFYREVQVEgJICAgIDUKKworLyogTWF4IG51bWJlciBvZiBwZXJzaXN0ZW50IGxpYnJhcmllcyBrZXB0IGJ5IGEgbm9kZSAqLworI2RlZmluZSBNQVhMSUJTCSA1CisKKy8qCisgKiAgRGVmaW5lcyBmb3IgZXh0cmFjdGluZyBwYWNrZWQgZHluYW1pYyBsb2FkIG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSB0d28KKyAqICBtYXNrcy4KKyAqICBUaGVzZSBkZWZpbmVzIG11c3QgbWF0Y2ggbm9kZS5jZGIgYW5kIGR5bm0uY2RiCisgKiAgRm9ybWF0IG9mIGRhdGEvY29kZSBtYXNrIGlzOgorICogICB1dXV1dXV1dXxmdWVlZWVlZXxmdWRkZGRkZHxmdWNjY2NjY3wKKyAqICB3aGVyZQorICogICAgICB1ID0gdW51c2VkCisgKiAgICAgIGNjY2NjYyA9IHByZWZlcmVkL3JlcXVpcmVkIGR5bmFtaWMgbWVtIHNlZ2lkIGZvciBjcmVhdGUgcGhhc2UgZGF0YS9jb2RlCisgKiAgICAgIGRkZGRkZCA9IHByZWZlcmVkL3JlcXVpcmVkIGR5bmFtaWMgbWVtIHNlZ2lkIGZvciBkZWxldGUgcGhhc2UgZGF0YS9jb2RlCisgKiAgICAgIGVlZWVlZSA9IHByZWZlcmVkL3JlcS4gZHluYW1pYyBtZW0gc2VnaWQgZm9yIGV4ZWN1dGUgcGhhc2UgZGF0YS9jb2RlCisgKiAgICAgIGYgPSBmbGFnIGluZGljYXRpbmcgaWYgbWVtb3J5IGlzIHByZWZlcnJlZCBvciByZXF1aXJlZDoKKyAqCSAgZiA9IDEgaWYgcmVxdWlyZWQsIGYgPSAwIGlmIHByZWZlcnJlZC4KKyAqCisgKiAgVGhlIDYgYml0cyBvZiB0aGUgc2VnaWQgYXJlIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisgKgorICogIElmIHRoZSA2dGggYml0IChiaXQgNSkgaXMgbm90IHNldCwgdGhlbiB0aGlzIHNwZWNpZmllcyBhIG1lbW9yeSBzZWdtZW50CisgKiAgYmV0d2VlbiAwIGFuZCAzMSAoYSBtYXhpbXVtIG9mIDMyIGR5bmFtaWMgbG9hZGluZyBtZW1vcnkgc2VnbWVudHMpLgorICogIElmIHRoZSA2dGggYml0IChiaXQgNSkgaXMgc2V0LCBzZWdpZCBoYXMgdGhlIGZvbGxvd2luZyBpbnRlcnByZXRhdGlvbjoKKyAqICAgICAgc2VnaWQgPSAzMiAtIEFueSBpbnRlcm5hbCBtZW1vcnkgc2VnbWVudCBjYW4gYmUgdXNlZC4KKyAqICAgICAgc2VnaWQgPSAzMyAtIEFueSBleHRlcm5hbCBtZW1vcnkgc2VnbWVudCBjYW4gYmUgdXNlZC4KKyAqICAgICAgc2VnaWQgPSA2MyAtIEFueSBtZW1vcnkgc2VnbWVudCBjYW4gYmUgdXNlZCAoaW4gdGhpcyBjYXNlIHRoZQorICoJCSAgIHJlcXVpcmVkL3ByZWZlcnJlZCBmbGFnIGlzIGlycmVsZXZhbnQpLgorICoKKyAqLworLyogTWF4aW11bSBhbGxvd2VkIGR5bmFtaWMgbG9hZGluZyBtZW1vcnkgc2VnbWVudHMgKi8KKyNkZWZpbmUgTUFYTUVNU0VHUyAgICAgIDMyCisKKyNkZWZpbmUgTUFYU0VHSUQJMwkvKiBMYXJnZXN0IHBvc3NpYmxlIChyZWFsKSBzZWdpZCAqLworI2RlZmluZSBNRU1JTlRFUk5BTElEICAgMzIJLyogU2VnaWQgbWVhbmluZyB1c2UgaW50ZXJuYWwgbWVtICovCisjZGVmaW5lIE1FTUVYVEVSTkFMSUQgICAzMwkvKiBTZWdpZCBtZWFuaW5nIHVzZSBleHRlcm5hbCBtZW0gKi8KKyNkZWZpbmUgTlVMTElECSAgNjMJCS8qIFNlZ2lkIG1lYW5pbmcgbm8gbWVtb3J5IHJlcS9wcmVmICovCisjZGVmaW5lIEZMQUdCSVQJIDcJCS8qIDd0aCBiaXQgaXMgcHJlZi4vcmVxLiBmbGFnICovCisjZGVmaW5lIFNFR01BU0sJIDB4M2YJCS8qIEJpdHMgMCAtIDUgKi8KKworI2RlZmluZSBDUkVBVEVCSVQJMAkvKiBDcmVhdGUgc2VnaWQgc3RhcnRzIGF0IGJpdCAwICovCisjZGVmaW5lIERFTEVURUJJVAk4CS8qIERlbGV0ZSBzZWdpZCBzdGFydHMgYXQgYml0IDggKi8KKyNkZWZpbmUgRVhFQ1VURUJJVCAgICAgIDE2CS8qIEV4ZWN1dGUgc2VnaWQgc3RhcnRzIGF0IGJpdCAxNiAqLworCisvKgorICogIE1hc2tzIHRoYXQgZGVmaW5lIG1lbW9yeSB0eXBlLiAgTXVzdCBtYXRjaCBkZWZpbmVzIGluIGR5bm0uY2RiLgorICovCisjZGVmaW5lIERZTk1fQ09ERQkweDIKKyNkZWZpbmUgRFlOTV9EQVRBCTB4NAorI2RlZmluZSBEWU5NX0NPREVEQVRBICAgKERZTk1fQ09ERSB8IERZTk1fREFUQSkKKyNkZWZpbmUgRFlOTV9JTlRFUk5BTCAgIDB4OAorI2RlZmluZSBEWU5NX0VYVEVSTkFMICAgMHgxMAorCisvKgorICogIERlZmluZXMgZm9yIHBhY2tpbmcgbWVtb3J5IHJlcXVpcmVtZW50L3ByZWZlcmVuY2UgZmxhZ3MgZm9yIGNvZGUgYW5kCisgKiAgZGF0YSBvZiBlYWNoIG9mIHRoZSBub2RlJ3MgcGhhc2VzIGludG8gb25lIG1hc2suCisgKiAgVGhlIGJpdCBpcyBzZXQgaWYgdGhlIHNlZ2lkIGlzIHJlcXVpcmVkIGZvciBsb2FkaW5nIGNvZGUvZGF0YSBvZiB0aGUKKyAqICBnaXZlbiBwaGFzZS4gVGhlIGJpdCBpcyBub3Qgc2V0LCBpZiB0aGUgc2VnaWQgaXMgcHJlZmVycmVkIG9ubHkuCisgKgorICogIFRoZXNlIGRlZmluZXMgYXJlIGFsc28gdXNlZCBhcyBpbmRlY2VzIGludG8gYSBzZWdpZCBhcnJheSBmb3IgdGhlIG5vZGUuCisgKiAgZWcgbm9kZSdzIHNlZ2lkW0NSRUFURURBVEFGTEFHQklUXSBpcyB0aGUgbWVtb3J5IHNlZ21lbnQgaWQgdGhhdCB0aGUKKyAqICBjcmVhdGUgcGhhc2UgZGF0YSBpcyByZXF1aXJlZCBvciBwcmVmZXJyZWQgdG8gYmUgbG9hZGVkIGludG8uCisgKi8KKyNkZWZpbmUgQ1JFQVRFREFUQUZMQUdCSVQgICAwCisjZGVmaW5lIENSRUFURUNPREVGTEFHQklUICAgMQorI2RlZmluZSBFWEVDVVRFREFUQUZMQUdCSVQgIDIKKyNkZWZpbmUgRVhFQ1VURUNPREVGTEFHQklUICAzCisjZGVmaW5lIERFTEVURURBVEFGTEFHQklUICAgNAorI2RlZmluZSBERUxFVEVDT0RFRkxBR0JJVCAgIDUKKyNkZWZpbmUgTUFYRkxBR1MJICAgIDYKKworICAgIC8qCisgICAgICogIFRoZXNlIG5hbWVzIG1heSBiZSBlbWJlZGRlZCBpbiBvdmVybGF5IHNlY3Rpb25zIHRvIGlkZW50aWZ5IHdoaWNoCisgICAgICogIG5vZGUgcGhhc2UgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIG92ZXJsYXllZC4KKyAqLworI2RlZmluZSBQQ1JFQVRFCSAiY3JlYXRlIgorI2RlZmluZSBQREVMRVRFCSAiZGVsZXRlIgorI2RlZmluZSBQRVhFQ1VURQkiZXhlY3V0ZSIKKworc3RhdGljIGlubGluZSBib29sIGlzX2VxdWFsX3V1aWQoc3RydWN0IGRzcF91dWlkICp1dWlkMSwKKwkJCQkJCQlzdHJ1Y3QgZHNwX3V1aWQgKnV1aWQyKQoreworCXJldHVybiAhbWVtY21wKHV1aWQxLCB1dWlkMiwgc2l6ZW9mKHN0cnVjdCBkc3BfdXVpZCkpOworfQorCisgICAgLyoKKyAgICAgKiAgPT09PT09PT0gbWVtX3NlZ19pbmZvID09PT09PT09CisgICAgICogIEZvcm1hdCBvZiBkeW5hbWljIGxvYWRpbmcgbWVtb3J5IHNlZ21lbnQgaW5mbyBpbiBjb2ZmIGZpbGUuCisgICAgICogIE11c3QgbWF0Y2ggZHlubS5oNTUuCisgKi8KK3N0cnVjdCBtZW1fc2VnX2luZm8geworCXUzMiBzZWdpZDsJCS8qIER5bmFtaWMgbG9hZGluZyBtZW1vcnkgc2VnbWVudCBudW1iZXIgKi8KKwl1MzIgYmFzZTsKKwl1MzIgbGVuOworCXUzMiB0eXBlOwkJLyogTWFzayBvZiBEWU5NX0NPREUsIERZTk1fSU5URVJOQUwsIGV0Yy4gKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gbGliX25vZGUgPT09PT09PT0KKyAqICBGb3IgbWFpbnRhaW5pbmcgYSB0cmVlIG9mIGxpYnJhcnkgZGVwZW5kZW5jaWVzLgorICovCitzdHJ1Y3QgbGliX25vZGUgeworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWI7CS8qIFRoZSBsaWJyYXJ5ICovCisJdTE2IGRlcF9saWJzOwkJLyogTnVtYmVyIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKwlzdHJ1Y3QgbGliX25vZGUgKmRlcF9saWJzX3RyZWU7CS8qIERlcGVuZGVudCBsaWJyYXJpZXMgb2YgbGliICovCit9OworCisvKgorICogID09PT09PT09IG92bHlfc2VjdCA9PT09PT09PQorICogIEluZm9ybWF0aW9uIG5lZWRlZCB0byBvdmVybGF5IGEgc2VjdGlvbi4KKyAqLworc3RydWN0IG92bHlfc2VjdCB7CisJc3RydWN0IG92bHlfc2VjdCAqbmV4dF9zZWN0OworCXUzMiBzZWN0X2xvYWRfYWRkcjsJLyogTG9hZCBhZGRyZXNzIG9mIHNlY3Rpb24gKi8KKwl1MzIgc2VjdF9ydW5fYWRkcjsJLyogUnVuIGFkZHJlc3Mgb2Ygc2VjdGlvbiAqLworCXUzMiBzaXplOwkJLyogU2l6ZSBvZiBzZWN0aW9uICovCisJdTE2IHBhZ2U7CQkvKiBEQkxfQ09ERSwgREJMX0RBVEEgKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gb3ZseV9ub2RlID09PT09PT09CisgKiAgRm9yIG1haW50YWluaW5nIGEgbGlzdCBvZiBvdmVybGF5IG5vZGVzLCB3aXRoIHNlY3Rpb25zIHRoYXQgbmVlZCB0byBiZQorICogIG92ZXJsYXllZCBmb3IgZWFjaCBvZiB0aGUgbm9kZXMgcGhhc2VzLgorICovCitzdHJ1Y3Qgb3ZseV9ub2RlIHsKKwlzdHJ1Y3QgZHNwX3V1aWQgdXVpZDsKKwljaGFyICpub2RlX25hbWU7CisJc3RydWN0IG92bHlfc2VjdCAqY3JlYXRlX3NlY3RzX2xpc3Q7CisJc3RydWN0IG92bHlfc2VjdCAqZGVsZXRlX3NlY3RzX2xpc3Q7CisJc3RydWN0IG92bHlfc2VjdCAqZXhlY3V0ZV9zZWN0c19saXN0OworCXN0cnVjdCBvdmx5X3NlY3QgKm90aGVyX3NlY3RzX2xpc3Q7CisJdTE2IGNyZWF0ZV9zZWN0czsKKwl1MTYgZGVsZXRlX3NlY3RzOworCXUxNiBleGVjdXRlX3NlY3RzOworCXUxNiBvdGhlcl9zZWN0czsKKwl1MTYgY3JlYXRlX3JlZjsKKwl1MTYgZGVsZXRlX3JlZjsKKwl1MTYgZXhlY3V0ZV9yZWY7CisJdTE2IG90aGVyX3JlZjsKK307CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9vYmplY3QgPT09PT09PT0KKyAqICBPdmVybGF5IGxvYWRlciBvYmplY3QuCisgKi8KK3N0cnVjdCBubGRyX29iamVjdCB7CisJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqOwkvKiBEZXZpY2Ugb2JqZWN0ICovCisJc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21ncjsJLyogUHJvYy9Ob2RlIGRhdGEgbWFuYWdlciAqLworCXN0cnVjdCBkYmxsX3Rhcl9vYmogKmRibGw7CS8qIFRoZSBEQkwgbG9hZGVyICovCisJc3RydWN0IGRibGxfbGlicmFyeV9vYmogKmJhc2VfbGliOwkvKiBCYXNlIGltYWdlIGxpYnJhcnkgKi8KKwlzdHJ1Y3Qgcm1tX3RhcmdldF9vYmogKnJtbTsJLyogUmVtb3RlIG1lbW9yeSBtYW5hZ2VyIGZvciBEU1AgKi8KKwlzdHJ1Y3QgZGJsbF9meG5zIGxkcl9meG5zOwkvKiBMb2FkZXIgZnVuY3Rpb24gdGFibGUgKi8KKwlzdHJ1Y3QgZGJsbF9hdHRycyBsZHJfYXR0cnM7CS8qIGF0dHJzIHRvIHBhc3MgdG8gbG9hZGVyIGZ1bmN0aW9ucyAqLworCW5sZHJfb3ZseWZ4biBvdmx5X2Z4bjsJLyogIndyaXRlIiBmb3Igb3ZlcmxheSBub2RlcyAqLworCW5sZHJfd3JpdGVmeG4gd3JpdGVfZnhuOwkvKiAid3JpdGUiIGZvciBkeW5hbWljIG5vZGVzICovCisJc3RydWN0IG92bHlfbm9kZSAqb3ZseV90YWJsZTsJLyogVGFibGUgb2Ygb3ZlcmxheSBub2RlcyAqLworCXUxNiBvdmx5X25vZGVzOwkJLyogTnVtYmVyIG9mIG92ZXJsYXkgbm9kZXMgaW4gYmFzZSAqLworCXUxNiBvdmx5X25pZDsJCS8qIEluZGV4IGZvciB0cmFja2luZyBvdmVybGF5IG5vZGVzICovCisJdTE2IGRsb2FkX3NlZ3M7CQkvKiBOdW1iZXIgb2YgZHluYW1pYyBsb2FkIG1lbSBzZWdzICovCisJdTMyICpzZWdfdGFibGU7CQkvKiBtZW10eXBlcyBvZiBkeW5hbWljIG1lbW9yeSBzZWdzCisJCQkJICogaW5kZXhlZCBieSBzZWdpZAorCQkJCSAqLworCXUxNiB1c19kc3BfbWF1X3NpemU7CS8qIFNpemUgb2YgRFNQIE1BVSAqLworCXUxNiB1c19kc3Bfd29yZF9zaXplOwkvKiBTaXplIG9mIERTUCB3b3JkICovCit9OworCisvKgorICogID09PT09PT09IG5sZHJfbm9kZW9iamVjdCA9PT09PT09PQorICogIER5bmFtaWMgbm9kZSBvYmplY3QuIFRoaXMgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhIG5vZGUgaXMgYWxsb2NhdGVkLgorICovCitzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0IHsKKwlzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHJfb2JqOwkvKiBEeW5hbWljIGxvYWRlciBoYW5kbGUgKi8KKwl2b2lkICpwcml2X3JlZjsJCS8qIEhhbmRsZSB0byBwYXNzIHRvIGRibF93cml0ZV9meG4gKi8KKwlzdHJ1Y3QgZHNwX3V1aWQgdXVpZDsJLyogTm9kZSdzIFVVSUQgKi8KKwlib29sIGR5bmFtaWM7CQkvKiBEeW5hbWljYWxseSBsb2FkZWQgbm9kZT8gKi8KKwlib29sIG92ZXJsYXk7CQkvKiBPdmVybGF5IG5vZGU/ICovCisJYm9vbCAqcGZfcGhhc2Vfc3BsaXQ7CS8qIE11bHRpcGxlIHBoYXNlIGxpYnJhcmllcz8gKi8KKwlzdHJ1Y3QgbGliX25vZGUgcm9vdDsJLyogTGlicmFyeSBjb250YWluaW5nIG5vZGUgcGhhc2UgKi8KKwlzdHJ1Y3QgbGliX25vZGUgY3JlYXRlX2xpYjsJLyogTGlicmFyeSB3aXRoIGNyZWF0ZSBwaGFzZSBsaWIgKi8KKwlzdHJ1Y3QgbGliX25vZGUgZXhlY3V0ZV9saWI7CS8qIExpYnJhcnkgd2l0aCBleGVjdXRlIHBoYXNlIGxpYiAqLworCXN0cnVjdCBsaWJfbm9kZSBkZWxldGVfbGliOwkvKiBMaWJyYXJ5IHdpdGggZGVsZXRlIHBoYXNlIGxpYiAqLworCS8qIGxpYnMgcmVtYWluIGxvYWRlZCB1bnRpbCBEZWxldGUgKi8KKwlzdHJ1Y3QgbGliX25vZGUgcGVyc19saWJfdGFibGVbTUFYTElCU107CisJczMyIHBlcnNfbGliczsJCS8qIE51bWJlciBvZiBwZXJzaXN0ZW50IGxpYnJhcmllcyAqLworCS8qIFBhdGggaW4gbGliIGRlcGVuZGVuY3kgdHJlZSAqLworCXN0cnVjdCBkYmxsX2xpYnJhcnlfb2JqICpsaWJfcGF0aFtNQVhERVBUSCArIDFdOworCWVudW0gbmxkcl9waGFzZSBwaGFzZTsJLyogTm9kZSBwaGFzZSBjdXJyZW50bHkgYmVpbmcgbG9hZGVkICovCisKKwkvKgorCSAqICBEeW5hbWljIGxvYWRpbmcgbWVtb3J5IHNlZ21lbnRzIGZvciBkYXRhIGFuZCBjb2RlIG9mIGVhY2ggcGhhc2UuCisJICovCisJdTE2IHNlZ19pZFtNQVhGTEFHU107CisKKwkvKgorCSAqICBNYXNrIGluZGljYXRpbmcgd2hldGhlciBlYWNoIG1lbSBzZWdtZW50IHNwZWNpZmllZCBpbiBzZWdfaWRbXQorCSAqICBpcyBwcmVmZXJyZWQgb3IgcmVxdWlyZWQuCisJICogIEZvciBleGFtcGxlCisJICogIAlpZiAoY29kZV9kYXRhX2ZsYWdfbWFzayAmICgxIDw8IEVYRUNVVEVEQVRBRkxBR0JJVCkpICE9IDAsCisJICogIHRoZW4gaXQgaXMgcmVxdWlyZWQgdG8gbG9hZCBleGVjdXRlIHBoYXNlIGRhdGEgaW50byB0aGUgbWVtb3J5CisJICogIHNwZWNpZmllZCBieSBzZWdfaWRbRVhFQ1VURURBVEFGTEFHQklUXS4KKwkgKi8KKwl1MzIgY29kZV9kYXRhX2ZsYWdfbWFzazsKK307CisKKy8qIER5bmFtaWMgbG9hZGVyIGZ1bmN0aW9uIHRhYmxlICovCitzdGF0aWMgc3RydWN0IGRibGxfZnhucyBsZHJfZnhucyA9IHsKKwkoZGJsbF9jbG9zZV9meG4pIGRibGxfY2xvc2UsCisJKGRibGxfY3JlYXRlX2Z4bikgZGJsbF9jcmVhdGUsCisJKGRibGxfZGVsZXRlX2Z4bikgZGJsbF9kZWxldGUsCisJKGRibGxfZXhpdF9meG4pIGRibGxfZXhpdCwKKwkoZGJsbF9nZXRfYXR0cnNfZnhuKSBkYmxsX2dldF9hdHRycywKKwkoZGJsbF9nZXRfYWRkcl9meG4pIGRibGxfZ2V0X2FkZHIsCisJKGRibGxfZ2V0X2NfYWRkcl9meG4pIGRibGxfZ2V0X2NfYWRkciwKKwkoZGJsbF9nZXRfc2VjdF9meG4pIGRibGxfZ2V0X3NlY3QsCisJKGRibGxfaW5pdF9meG4pIGRibGxfaW5pdCwKKwkoZGJsbF9sb2FkX2Z4bikgZGJsbF9sb2FkLAorCShkYmxsX2xvYWRfc2VjdF9meG4pIGRibGxfbG9hZF9zZWN0LAorCShkYmxsX29wZW5fZnhuKSBkYmxsX29wZW4sCisJKGRibGxfcmVhZF9zZWN0X2Z4bikgZGJsbF9yZWFkX3NlY3QsCisJKGRibGxfc2V0X2F0dHJzX2Z4bikgZGJsbF9zZXRfYXR0cnMsCisJKGRibGxfdW5sb2FkX2Z4bikgZGJsbF91bmxvYWQsCisJKGRibGxfdW5sb2FkX3NlY3RfZnhuKSBkYmxsX3VubG9hZF9zZWN0LAorfTsKKworc3RhdGljIHUzMiByZWZzOwkJLyogbW9kdWxlIHJlZmVyZW5jZSBjb3VudCAqLworCitzdGF0aWMgaW50IGFkZF9vdmx5X2luZm8odm9pZCAqaGFuZGxlLCBzdHJ1Y3QgZGJsbF9zZWN0X2luZm8gKnNlY3RfaW5mbywKKwkJCQl1MzIgYWRkciwgdTMyIGJ5dGVzKTsKK3N0YXRpYyBpbnQgYWRkX292bHlfbm9kZShzdHJ1Y3QgZHNwX3V1aWQgKnV1aWRfb2JqLAorCQkJCWVudW0gZHNwX2RjZG9ianR5cGUgb2JqX3R5cGUsIHZvaWQgKmhhbmRsZSk7CitzdGF0aWMgaW50IGFkZF9vdmx5X3NlY3Qoc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiwKKwkJCQlzdHJ1Y3Qgb3ZseV9zZWN0ICoqbHN0LAorCQkJCXN0cnVjdCBkYmxsX3NlY3RfaW5mbyAqc2VjdF9pbmYsCisJCQkJYm9vbCAqZXhpc3RzLCB1MzIgYWRkciwgdTMyIGJ5dGVzKTsKK3N0YXRpYyBzMzIgZmFrZV9vdmx5X3dyaXRlKHZvaWQgKmhhbmRsZSwgdTMyIGRzcF9hZGRyZXNzLCB2b2lkICpidWYsIHUzMiBieXRlcywKKwkJCSAgIHMzMiBtdHlwZSk7CitzdGF0aWMgdm9pZCBmcmVlX3NlY3RzKHN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmosCisJCSAgICAgICBzdHJ1Y3Qgb3ZseV9zZWN0ICpwaGFzZV9zZWN0cywgdTE2IGFsbG9jX251bSk7CitzdGF0aWMgYm9vbCBnZXRfc3ltYm9sX3ZhbHVlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcGFyZywgdm9pZCAqcm1tX2hhbmRsZSwKKwkJCSAgICAgY2hhciAqc3ltX25hbWUsIHN0cnVjdCBkYmxsX3N5bV92YWwgKipzeW0pOworc3RhdGljIGludCBsb2FkX2xpYihzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpubGRyX25vZGVfb2JqLAorCQkJICAgc3RydWN0IGxpYl9ub2RlICpyb290LCBzdHJ1Y3QgZHNwX3V1aWQgdXVpZCwKKwkJCSAgIGJvb2wgcm9vdF9wcnN0bnQsCisJCQkgICBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKmxpYl9wYXRoLAorCQkJICAgZW51bSBubGRyX3BoYXNlIHBoYXNlLCB1MTYgZGVwdGgpOworc3RhdGljIGludCBsb2FkX292bHkoc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiwKKwkJCSAgICBlbnVtIG5sZHJfcGhhc2UgcGhhc2UpOworc3RhdGljIGludCByZW1vdGVfYWxsb2Modm9pZCAqKnJlZiwgdTE2IG1lbV9zZWN0LCB1MzIgc2l6ZSwKKwkJCSAgICAgICB1MzIgYWxpZ24sIHUzMiAqZHNwX2FkZHJlc3MsCisJCQkgICAgICAgczMyIHNlZ21udF9pZCwKKwkJCSAgICAgICBzMzIgcmVxLCBib29sIHJlc2VydmUpOworc3RhdGljIGludCByZW1vdGVfZnJlZSh2b2lkICoqcmVmLCB1MTYgc3BhY2UsIHUzMiBkc3BfYWRkcmVzcywgdTMyIHNpemUsCisJCQkgICAgICBib29sIHJlc2VydmUpOworCitzdGF0aWMgdm9pZCB1bmxvYWRfbGliKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCSAgICAgICBzdHJ1Y3QgbGliX25vZGUgKnJvb3QpOworc3RhdGljIHZvaWQgdW5sb2FkX292bHkoc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiwKKwkJCWVudW0gbmxkcl9waGFzZSBwaGFzZSk7CitzdGF0aWMgYm9vbCBmaW5kX2luX3BlcnNpc3RlbnRfbGliX2FycmF5KHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCQkJCSBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliKTsKK3N0YXRpYyB1MzIgZmluZF9sY20odTMyIGEsIHUzMiBiKTsKKworLyoKKyAqICA9PT09PT09PSBubGRyX2FsbG9jYXRlID09PT09PT09CisgKi8KK2ludCBubGRyX2FsbG9jYXRlKHN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmosIHZvaWQgKnByaXZfcmVmLAorCQkJIGNvbnN0IHN0cnVjdCBkY2Rfbm9kZXByb3BzICpub2RlX3Byb3BzLAorCQkJIHN0cnVjdCBubGRyX25vZGVvYmplY3QgKipubGRyX25vZGVvYmosCisJCQkgYm9vbCAqcGZfcGhhc2Vfc3BsaXQpCit7CisJc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUobm9kZV9wcm9wcyAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShubGRyX25vZGVvYmogIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobmxkcl9vYmopOworCisJLyogSW5pdGlhbGl6ZSBoYW5kbGUgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJKm5sZHJfbm9kZW9iaiA9IE5VTEw7CisJLyogQWxsb2NhdGUgbm9kZSBvYmplY3QgKi8KKwlubGRyX25vZGVfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5sZHJfbm9kZW9iamVjdCksIEdGUF9LRVJORUwpOworCisJaWYgKG5sZHJfbm9kZV9vYmogPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0gZWxzZSB7CisJCW5sZHJfbm9kZV9vYmotPnBmX3BoYXNlX3NwbGl0ID0gcGZfcGhhc2Vfc3BsaXQ7CisJCW5sZHJfbm9kZV9vYmotPnBlcnNfbGlicyA9IDA7CisJCW5sZHJfbm9kZV9vYmotPm5sZHJfb2JqID0gbmxkcl9vYmo7CisJCW5sZHJfbm9kZV9vYmotPnByaXZfcmVmID0gcHJpdl9yZWY7CisJCS8qIFNhdmUgbm9kZSdzIFVVSUQuICovCisJCW5sZHJfbm9kZV9vYmotPnV1aWQgPSBub2RlX3Byb3BzLT5uZGJfcHJvcHMudWlfbm9kZV9pZDsKKwkJLyoKKwkJICogIERldGVybWluZSBpZiBub2RlIGlzIGEgZHluYW1pY2FsbHkgbG9hZGVkIG5vZGUgZnJvbQorCQkgKiAgbmRiX3Byb3BzLgorCQkgKi8KKwkJaWYgKG5vZGVfcHJvcHMtPnVzX2xvYWRfdHlwZSA9PSBOTERSX0RZTkFNSUNMT0FEKSB7CisJCQkvKiBEeW5hbWljIG5vZGUgKi8KKwkJCW5sZHJfbm9kZV9vYmotPmR5bmFtaWMgPSB0cnVlOworCQkJLyoKKwkJCSAqICBFeHRyYWN0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSBuZGJfcHJvcHMgbWFza3MKKwkJCSAqLworCQkJLyogQ3JlYXRlIHBoYXNlICovCisJCQlubGRyX25vZGVfb2JqLT5zZWdfaWRbQ1JFQVRFREFUQUZMQUdCSVRdID0gKHUxNikKKwkJCSAgICAobm9kZV9wcm9wcy0+dWxfZGF0YV9tZW1fc2VnX21hc2sgPj4gQ1JFQVRFQklUKSAmCisJCQkgICAgU0VHTUFTSzsKKwkJCW5sZHJfbm9kZV9vYmotPmNvZGVfZGF0YV9mbGFnX21hc2sgfD0KKwkJCSAgICAoKG5vZGVfcHJvcHMtPnVsX2RhdGFfbWVtX3NlZ19tYXNrID4+CisJCQkgICAgICAoQ1JFQVRFQklUICsgRkxBR0JJVCkpICYgMSkgPDwgQ1JFQVRFREFUQUZMQUdCSVQ7CisJCQlubGRyX25vZGVfb2JqLT5zZWdfaWRbQ1JFQVRFQ09ERUZMQUdCSVRdID0gKHUxNikKKwkJCSAgICAobm9kZV9wcm9wcy0+dWxfY29kZV9tZW1fc2VnX21hc2sgPj4KKwkJCSAgICAgQ1JFQVRFQklUKSAmIFNFR01BU0s7CisJCQlubGRyX25vZGVfb2JqLT5jb2RlX2RhdGFfZmxhZ19tYXNrIHw9CisJCQkgICAgKChub2RlX3Byb3BzLT51bF9jb2RlX21lbV9zZWdfbWFzayA+PgorCQkJICAgICAgKENSRUFURUJJVCArIEZMQUdCSVQpKSAmIDEpIDw8IENSRUFURUNPREVGTEFHQklUOworCQkJLyogRXhlY3V0ZSBwaGFzZSAqLworCQkJbmxkcl9ub2RlX29iai0+c2VnX2lkW0VYRUNVVEVEQVRBRkxBR0JJVF0gPSAodTE2KQorCQkJICAgIChub2RlX3Byb3BzLT51bF9kYXRhX21lbV9zZWdfbWFzayA+PgorCQkJICAgICBFWEVDVVRFQklUKSAmIFNFR01BU0s7CisJCQlubGRyX25vZGVfb2JqLT5jb2RlX2RhdGFfZmxhZ19tYXNrIHw9CisJCQkgICAgKChub2RlX3Byb3BzLT51bF9kYXRhX21lbV9zZWdfbWFzayA+PgorCQkJICAgICAgKEVYRUNVVEVCSVQgKyBGTEFHQklUKSkgJiAxKSA8PAorCQkJICAgIEVYRUNVVEVEQVRBRkxBR0JJVDsKKwkJCW5sZHJfbm9kZV9vYmotPnNlZ19pZFtFWEVDVVRFQ09ERUZMQUdCSVRdID0gKHUxNikKKwkJCSAgICAobm9kZV9wcm9wcy0+dWxfY29kZV9tZW1fc2VnX21hc2sgPj4KKwkJCSAgICAgRVhFQ1VURUJJVCkgJiBTRUdNQVNLOworCQkJbmxkcl9ub2RlX29iai0+Y29kZV9kYXRhX2ZsYWdfbWFzayB8PQorCQkJICAgICgobm9kZV9wcm9wcy0+dWxfY29kZV9tZW1fc2VnX21hc2sgPj4KKwkJCSAgICAgIChFWEVDVVRFQklUICsgRkxBR0JJVCkpICYgMSkgPDwKKwkJCSAgICBFWEVDVVRFQ09ERUZMQUdCSVQ7CisJCQkvKiBEZWxldGUgcGhhc2UgKi8KKwkJCW5sZHJfbm9kZV9vYmotPnNlZ19pZFtERUxFVEVEQVRBRkxBR0JJVF0gPSAodTE2KQorCQkJICAgIChub2RlX3Byb3BzLT51bF9kYXRhX21lbV9zZWdfbWFzayA+PiBERUxFVEVCSVQpICYKKwkJCSAgICBTRUdNQVNLOworCQkJbmxkcl9ub2RlX29iai0+Y29kZV9kYXRhX2ZsYWdfbWFzayB8PQorCQkJICAgICgobm9kZV9wcm9wcy0+dWxfZGF0YV9tZW1fc2VnX21hc2sgPj4KKwkJCSAgICAgIChERUxFVEVCSVQgKyBGTEFHQklUKSkgJiAxKSA8PCBERUxFVEVEQVRBRkxBR0JJVDsKKwkJCW5sZHJfbm9kZV9vYmotPnNlZ19pZFtERUxFVEVDT0RFRkxBR0JJVF0gPSAodTE2KQorCQkJICAgIChub2RlX3Byb3BzLT51bF9jb2RlX21lbV9zZWdfbWFzayA+PgorCQkJICAgICBERUxFVEVCSVQpICYgU0VHTUFTSzsKKwkJCW5sZHJfbm9kZV9vYmotPmNvZGVfZGF0YV9mbGFnX21hc2sgfD0KKwkJCSAgICAoKG5vZGVfcHJvcHMtPnVsX2NvZGVfbWVtX3NlZ19tYXNrID4+CisJCQkgICAgICAoREVMRVRFQklUICsgRkxBR0JJVCkpICYgMSkgPDwgREVMRVRFQ09ERUZMQUdCSVQ7CisJCX0gZWxzZSB7CisJCQkvKiBOb24tZHluYW1pY2FsbHkgbG9hZGVkIG5vZGVzIGFyZSBwYXJ0IG9mIHRoZQorCQkJICogYmFzZSBpbWFnZSAqLworCQkJbmxkcl9ub2RlX29iai0+cm9vdC5saWIgPSBubGRyX29iai0+YmFzZV9saWI7CisJCQkvKiBDaGVjayBmb3Igb3ZlcmxheSBub2RlICovCisJCQlpZiAobm9kZV9wcm9wcy0+dXNfbG9hZF90eXBlID09IE5MRFJfT1ZMWUxPQUQpCisJCQkJbmxkcl9ub2RlX29iai0+b3ZlcmxheSA9IHRydWU7CisKKwkJfQorCQkqbmxkcl9ub2Rlb2JqID0gKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKilubGRyX25vZGVfb2JqOworCX0KKwkvKiBDbGVhbnVwIG9uIGZhaWx1cmUgKi8KKwlpZiAoc3RhdHVzICYmIG5sZHJfbm9kZV9vYmopCisJCWtmcmVlKG5sZHJfbm9kZV9vYmopOworCisJREJDX0VOU1VSRSgoIXN0YXR1cyAmJiAqbmxkcl9ub2Rlb2JqKQorCQkgICB8fCAoc3RhdHVzICYmICpubGRyX25vZGVvYmogPT0gTlVMTCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9jcmVhdGUgPT09PT09PT0KKyAqLworaW50IG5sZHJfY3JlYXRlKHN0cnVjdCBubGRyX29iamVjdCAqKm5sZHIsCisJCSAgICAgICBzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmosCisJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxkcl9hdHRycyAqcGF0dHJzKQoreworCXN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncjsJLyogQ09EIG1hbmFnZXIgKi8KKwljaGFyICpwc3pfY29mZl9idWYgPSBOVUxMOworCWNoYXIgc3pfemxfZmlsZVtDT0RfTUFYUEFUSExFTkdUSF07CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiA9IE5VTEw7CisJc3RydWN0IGRibGxfYXR0cnMgc2F2ZV9hdHRyczsKKwlzdHJ1Y3QgZGJsbF9hdHRycyBuZXdfYXR0cnM7CisJZGJsbF9mbGFncyBmbGFnczsKKwl1MzIgdWxfZW50cnk7CisJdTE2IGRsb2FkX3NlZ3MgPSAwOworCXN0cnVjdCBtZW1fc2VnX2luZm8gKm1lbV9pbmZvX29iajsKKwl1MzIgdWxfbGVuID0gMDsKKwl1MzIgdWxfYWRkcjsKKwlzdHJ1Y3Qgcm1tX3NlZ21lbnQgKnJtbV9zZWdzID0gTlVMTDsKKwl1MTYgaTsKKwlpbnQgc3RhdHVzID0gMDsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUobmxkciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShoZGV2X29iaiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwYXR0cnMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUocGF0dHJzLT5wZm5fb3ZseSAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwYXR0cnMtPnBmbl93cml0ZSAhPSBOVUxMKTsKKworCS8qIEFsbG9jYXRlIGR5bmFtaWMgbG9hZGVyIG9iamVjdCAqLworCW5sZHJfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5sZHJfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5sZHJfb2JqKSB7CisJCW5sZHJfb2JqLT5oZGV2X29iaiA9IGhkZXZfb2JqOworCQkvKiB3YXJuaW5nLCBsYXp5IHN0YXR1cyBjaGVja2luZyBhbGVydCEgKi8KKwkJZGV2X2dldF9jb2RfbWdyKGhkZXZfb2JqLCAmY29kX21ncik7CisJCWlmIChjb2RfbWdyKSB7CisJCQlzdGF0dXMgPSBjb2RfZ2V0X2xvYWRlcihjb2RfbWdyLCAmbmxkcl9vYmotPmRibGwpOworCQkJREJDX0FTU0VSVCghc3RhdHVzKTsKKwkJCXN0YXR1cyA9IGNvZF9nZXRfYmFzZV9saWIoY29kX21nciwgJm5sZHJfb2JqLT5iYXNlX2xpYik7CisJCQlEQkNfQVNTRVJUKCFzdGF0dXMpOworCQkJc3RhdHVzID0KKwkJCSAgICBjb2RfZ2V0X2Jhc2VfbmFtZShjb2RfbWdyLCBzel96bF9maWxlLAorCQkJCQkJCUNPRF9NQVhQQVRITEVOR1RIKTsKKwkJCURCQ19BU1NFUlQoIXN0YXR1cyk7CisJCX0KKwkJc3RhdHVzID0gMDsKKwkJLyogZW5kIGxhenkgc3RhdHVzIGNoZWNraW5nICovCisJCW5sZHJfb2JqLT51c19kc3BfbWF1X3NpemUgPSBwYXR0cnMtPnVzX2RzcF9tYXVfc2l6ZTsKKwkJbmxkcl9vYmotPnVzX2RzcF93b3JkX3NpemUgPSBwYXR0cnMtPnVzX2RzcF93b3JkX3NpemU7CisJCW5sZHJfb2JqLT5sZHJfZnhucyA9IGxkcl9meG5zOworCQlpZiAoIShubGRyX29iai0+bGRyX2Z4bnMuaW5pdF9meG4oKSkpCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisJLyogQ3JlYXRlIHRoZSBEQ0QgTWFuYWdlciAqLworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkY2RfY3JlYXRlX21hbmFnZXIoTlVMTCwgJm5sZHJfb2JqLT5oZGNkX21ncik7CisKKwkvKiBHZXQgZHluYW1pYyBsb2FkaW5nIG1lbW9yeSBzZWN0aW9ucyBmcm9tIGJhc2UgbGliICovCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0KKwkJICAgIG5sZHJfb2JqLT5sZHJfZnhucy5nZXRfc2VjdF9meG4obmxkcl9vYmotPmJhc2VfbGliLAorCQkJCQkJICAgIERZTk1FTVNFQ1QsICZ1bF9hZGRyLAorCQkJCQkJICAgICZ1bF9sZW4pOworCQlpZiAoIXN0YXR1cykgeworCQkJcHN6X2NvZmZfYnVmID0KKwkJCQlremFsbG9jKHVsX2xlbiAqIG5sZHJfb2JqLT51c19kc3BfbWF1X3NpemUsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFwc3pfY29mZl9idWYpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCS8qIE9rIHRvIG5vdCBoYXZlIGR5bmFtaWMgbG9hZGluZyBtZW1vcnkgKi8KKwkJCXN0YXR1cyA9IDA7CisJCQl1bF9sZW4gPSAwOworCQkJZGV2X2RiZyhicmlkZ2UsICIlczogZmFpbGVkIC0gbm8gZHluYW1pYyBsb2FkaW5nIG1lbSAiCisJCQkJInNlZ21lbnRzOiAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cyAmJiB1bF9sZW4gPiAwKSB7CisJCS8qIFJlYWQgc2VjdGlvbiBjb250YWluaW5nIGR5bmFtaWMgbG9hZCBtZW0gc2VnbWVudHMgKi8KKwkJc3RhdHVzID0KKwkJICAgIG5sZHJfb2JqLT5sZHJfZnhucy5yZWFkX3NlY3RfZnhuKG5sZHJfb2JqLT5iYXNlX2xpYiwKKwkJCQkJCSAgICAgRFlOTUVNU0VDVCwgcHN6X2NvZmZfYnVmLAorCQkJCQkJICAgICB1bF9sZW4pOworCX0KKwlpZiAoIXN0YXR1cyAmJiB1bF9sZW4gPiAwKSB7CisJCS8qIFBhcnNlIG1lbW9yeSBzZWdtZW50IGRhdGEgKi8KKwkJZGxvYWRfc2VncyA9ICh1MTYpICgqKCh1MzIgKikgcHN6X2NvZmZfYnVmKSk7CisJCWlmIChkbG9hZF9zZWdzID4gTUFYTUVNU0VHUykKKwkJCXN0YXR1cyA9IC1FQkFERjsKKwl9CisJLyogUGFyc2UgZHluYW1pYyBsb2FkIG1lbW9yeSBzZWdtZW50cyAqLworCWlmICghc3RhdHVzICYmIGRsb2FkX3NlZ3MgPiAwKSB7CisJCXJtbV9zZWdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJtbV9zZWdtZW50KSAqIGRsb2FkX3NlZ3MsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQlubGRyX29iai0+c2VnX3RhYmxlID0KKwkJCQlremFsbG9jKHNpemVvZih1MzIpICogZGxvYWRfc2VncywgR0ZQX0tFUk5FTCk7CisJCWlmIChybW1fc2VncyA9PSBOVUxMIHx8IG5sZHJfb2JqLT5zZWdfdGFibGUgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCW5sZHJfb2JqLT5kbG9hZF9zZWdzID0gZGxvYWRfc2VnczsKKwkJCW1lbV9pbmZvX29iaiA9IChzdHJ1Y3QgbWVtX3NlZ19pbmZvICopKHBzel9jb2ZmX2J1ZiArCisJCQkJCQkJICAgICAgIHNpemVvZih1MzIpKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBkbG9hZF9zZWdzOyBpKyspIHsKKwkJCQlybW1fc2Vnc1tpXS5iYXNlID0gKG1lbV9pbmZvX29iaiArIGkpLT5iYXNlOworCQkJCXJtbV9zZWdzW2ldLmxlbmd0aCA9IChtZW1faW5mb19vYmogKyBpKS0+bGVuOworCQkJCXJtbV9zZWdzW2ldLnNwYWNlID0gMDsKKwkJCQlubGRyX29iai0+c2VnX3RhYmxlW2ldID0KKwkJCQkgICAgKG1lbV9pbmZvX29iaiArIGkpLT50eXBlOworCQkJCWRldl9kYmcoYnJpZGdlLAorCQkJCQkiKHByb2MpIERMTCBNRU1TRUdNRU5UOiAlZCwgIgorCQkJCQkiQmFzZTogMHgleCwgTGVuZ3RoOiAweCV4XG4iLCBpLAorCQkJCQlybW1fc2Vnc1tpXS5iYXNlLCBybW1fc2Vnc1tpXS5sZW5ndGgpOworCQkJfQorCQl9CisJfQorCS8qIENyZWF0ZSBSZW1vdGUgbWVtb3J5IG1hbmFnZXIgKi8KKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gcm1tX2NyZWF0ZSgmbmxkcl9vYmotPnJtbSwgcm1tX3NlZ3MsIGRsb2FkX3NlZ3MpOworCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogc2V0IHRoZSBhbGxvYywgZnJlZSwgd3JpdGUgZnVuY3Rpb25zIGZvciBsb2FkZXIgKi8KKwkJbmxkcl9vYmotPmxkcl9meG5zLmdldF9hdHRyc19meG4obmxkcl9vYmotPmRibGwsICZzYXZlX2F0dHJzKTsKKwkJbmV3X2F0dHJzID0gc2F2ZV9hdHRyczsKKwkJbmV3X2F0dHJzLmFsbG9jID0gKGRibGxfYWxsb2NfZnhuKSByZW1vdGVfYWxsb2M7CisJCW5ld19hdHRycy5mcmVlID0gKGRibGxfZnJlZV9meG4pIHJlbW90ZV9mcmVlOworCQluZXdfYXR0cnMuc3ltX2xvb2t1cCA9IChkYmxsX3N5bV9sb29rdXApIGdldF9zeW1ib2xfdmFsdWU7CisJCW5ld19hdHRycy5zeW1faGFuZGxlID0gbmxkcl9vYmo7CisJCW5ld19hdHRycy53cml0ZSA9IChkYmxsX3dyaXRlX2Z4bikgcGF0dHJzLT5wZm5fd3JpdGU7CisJCW5sZHJfb2JqLT5vdmx5X2Z4biA9IHBhdHRycy0+cGZuX292bHk7CisJCW5sZHJfb2JqLT53cml0ZV9meG4gPSBwYXR0cnMtPnBmbl93cml0ZTsKKwkJbmxkcl9vYmotPmxkcl9hdHRycyA9IG5ld19hdHRyczsKKwl9CisJa2ZyZWUocm1tX3NlZ3MpOworCisJa2ZyZWUocHN6X2NvZmZfYnVmKTsKKworCS8qIEdldCBvdmVybGF5IG5vZGVzICovCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0KKwkJICAgIGNvZF9nZXRfYmFzZV9uYW1lKGNvZF9tZ3IsIHN6X3psX2ZpbGUsIENPRF9NQVhQQVRITEVOR1RIKTsKKwkJLyogbGF6eSBjaGVjayAqLworCQlEQkNfQVNTRVJUKCFzdGF0dXMpOworCQkvKiBGaXJzdCBjb3VudCBudW1iZXIgb2Ygb3ZlcmxheSBub2RlcyAqLworCQlzdGF0dXMgPQorCQkgICAgZGNkX2dldF9vYmplY3RzKG5sZHJfb2JqLT5oZGNkX21nciwgc3pfemxfZmlsZSwKKwkJCQkgICAgYWRkX292bHlfbm9kZSwgKHZvaWQgKilubGRyX29iaik7CisJCS8qIE5vdyBidWlsZCB0YWJsZSBvZiBvdmVybGF5IG5vZGVzICovCisJCWlmICghc3RhdHVzICYmIG5sZHJfb2JqLT5vdmx5X25vZGVzID4gMCkgeworCQkJLyogQWxsb2NhdGUgdGFibGUgZm9yIG92ZXJsYXkgbm9kZXMgKi8KKwkJCW5sZHJfb2JqLT5vdmx5X3RhYmxlID0KKwkJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IG92bHlfbm9kZSkgKgorCQkJCQlubGRyX29iai0+b3ZseV9ub2RlcywgR0ZQX0tFUk5FTCk7CisJCQkvKiBQdXQgb3ZlcmxheSBub2RlcyBpbiB0aGUgdGFibGUgKi8KKwkJCW5sZHJfb2JqLT5vdmx5X25pZCA9IDA7CisJCQlzdGF0dXMgPSBkY2RfZ2V0X29iamVjdHMobmxkcl9vYmotPmhkY2RfbWdyLCBzel96bF9maWxlLAorCQkJCQkJIGFkZF9vdmx5X25vZGUsCisJCQkJCQkgKHZvaWQgKilubGRyX29iaik7CisJCX0KKwl9CisJLyogRG8gYSBmYWtlIHJlbG9hZCBvZiB0aGUgYmFzZSBpbWFnZSB0byBnZXQgb3ZlcmxheSBzZWN0aW9uIGluZm8gKi8KKwlpZiAoIXN0YXR1cyAmJiBubGRyX29iai0+b3ZseV9ub2RlcyA+IDApIHsKKwkJc2F2ZV9hdHRycy53cml0ZSA9IGZha2Vfb3ZseV93cml0ZTsKKwkJc2F2ZV9hdHRycy5sb2dfd3JpdGUgPSBhZGRfb3ZseV9pbmZvOworCQlzYXZlX2F0dHJzLmxvZ193cml0ZV9oYW5kbGUgPSBubGRyX29iajsKKwkJZmxhZ3MgPSBEQkxMX0NPREUgfCBEQkxMX0RBVEEgfCBEQkxMX1NZTUI7CisJCXN0YXR1cyA9IG5sZHJfb2JqLT5sZHJfZnhucy5sb2FkX2Z4bihubGRyX29iai0+YmFzZV9saWIsIGZsYWdzLAorCQkJCQkJICAgICAmc2F2ZV9hdHRycywgJnVsX2VudHJ5KTsKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJKm5sZHIgPSAoc3RydWN0IG5sZHJfb2JqZWN0ICopbmxkcl9vYmo7CisJfSBlbHNlIHsKKwkJaWYgKG5sZHJfb2JqKQorCQkJbmxkcl9kZWxldGUoKHN0cnVjdCBubGRyX29iamVjdCAqKW5sZHJfb2JqKTsKKworCQkqbmxkciA9IE5VTEw7CisJfQorCS8qIEZJWE1FOlRlbXAuIEZpeC4gTXVzdCBiZSByZW1vdmVkICovCisJREJDX0VOU1VSRSgoIXN0YXR1cyAmJiAqbmxkcikgfHwgKHN0YXR1cyAmJiAqbmxkciA9PSBOVUxMKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBubGRyX2RlbGV0ZSA9PT09PT09PQorICovCit2b2lkIG5sZHJfZGVsZXRlKHN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmopCit7CisJc3RydWN0IG92bHlfc2VjdCAqb3ZseV9zZWN0aW9uOworCXN0cnVjdCBvdmx5X3NlY3QgKm5leHQ7CisJdTE2IGk7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG5sZHJfb2JqKTsKKworCW5sZHJfb2JqLT5sZHJfZnhucy5leGl0X2Z4bigpOworCWlmIChubGRyX29iai0+cm1tKQorCQlybW1fZGVsZXRlKG5sZHJfb2JqLT5ybW0pOworCisJa2ZyZWUobmxkcl9vYmotPnNlZ190YWJsZSk7CisKKwlpZiAobmxkcl9vYmotPmhkY2RfbWdyKQorCQlkY2RfZGVzdHJveV9tYW5hZ2VyKG5sZHJfb2JqLT5oZGNkX21ncik7CisKKwkvKiBGcmVlIG92ZXJsYXkgbm9kZSBpbmZvcm1hdGlvbiAqLworCWlmIChubGRyX29iai0+b3ZseV90YWJsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbmxkcl9vYmotPm92bHlfbm9kZXM7IGkrKykgeworCQkJb3ZseV9zZWN0aW9uID0KKwkJCSAgICBubGRyX29iai0+b3ZseV90YWJsZVtpXS5jcmVhdGVfc2VjdHNfbGlzdDsKKwkJCXdoaWxlIChvdmx5X3NlY3Rpb24pIHsKKwkJCQluZXh0ID0gb3ZseV9zZWN0aW9uLT5uZXh0X3NlY3Q7CisJCQkJa2ZyZWUob3ZseV9zZWN0aW9uKTsKKwkJCQlvdmx5X3NlY3Rpb24gPSBuZXh0OworCQkJfQorCQkJb3ZseV9zZWN0aW9uID0KKwkJCSAgICBubGRyX29iai0+b3ZseV90YWJsZVtpXS5kZWxldGVfc2VjdHNfbGlzdDsKKwkJCXdoaWxlIChvdmx5X3NlY3Rpb24pIHsKKwkJCQluZXh0ID0gb3ZseV9zZWN0aW9uLT5uZXh0X3NlY3Q7CisJCQkJa2ZyZWUob3ZseV9zZWN0aW9uKTsKKwkJCQlvdmx5X3NlY3Rpb24gPSBuZXh0OworCQkJfQorCQkJb3ZseV9zZWN0aW9uID0KKwkJCSAgICBubGRyX29iai0+b3ZseV90YWJsZVtpXS5leGVjdXRlX3NlY3RzX2xpc3Q7CisJCQl3aGlsZSAob3ZseV9zZWN0aW9uKSB7CisJCQkJbmV4dCA9IG92bHlfc2VjdGlvbi0+bmV4dF9zZWN0OworCQkJCWtmcmVlKG92bHlfc2VjdGlvbik7CisJCQkJb3ZseV9zZWN0aW9uID0gbmV4dDsKKwkJCX0KKwkJCW92bHlfc2VjdGlvbiA9IG5sZHJfb2JqLT5vdmx5X3RhYmxlW2ldLm90aGVyX3NlY3RzX2xpc3Q7CisJCQl3aGlsZSAob3ZseV9zZWN0aW9uKSB7CisJCQkJbmV4dCA9IG92bHlfc2VjdGlvbi0+bmV4dF9zZWN0OworCQkJCWtmcmVlKG92bHlfc2VjdGlvbik7CisJCQkJb3ZseV9zZWN0aW9uID0gbmV4dDsKKwkJCX0KKwkJfQorCQlrZnJlZShubGRyX29iai0+b3ZseV90YWJsZSk7CisJfQorCWtmcmVlKG5sZHJfb2JqKTsKK30KKworLyoKKyAqICA9PT09PT09PSBubGRyX2V4aXQgPT09PT09PT0KKyAqICBEaXNjb250aW51ZSB1c2FnZSBvZiBOTERSIG1vZHVsZS4KKyAqLwordm9pZCBubGRyX2V4aXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlyZWZzLS07CisKKwlpZiAocmVmcyA9PSAwKQorCQlybW1fZXhpdCgpOworCisJREJDX0VOU1VSRShyZWZzID49IDApOworfQorCisvKgorICogID09PT09PT09IG5sZHJfZ2V0X2Z4bl9hZGRyID09PT09PT09CisgKi8KK2ludCBubGRyX2dldF9meG5fYWRkcihzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpubGRyX25vZGVfb2JqLAorCQkJICAgICBjaGFyICpzdHJfZnhuLCB1MzIgKiBhZGRyKQoreworCXN0cnVjdCBkYmxsX3N5bV92YWwgKmRibGxfc3ltOworCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmo7CisJaW50IHN0YXR1cyA9IDA7CisJYm9vbCBzdGF0dXMxID0gZmFsc2U7CisJczMyIGkgPSAwOworCXN0cnVjdCBsaWJfbm9kZSByb290ID0geyBOVUxMLCAwLCBOVUxMIH07CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG5sZHJfbm9kZV9vYmopOworCURCQ19SRVFVSVJFKGFkZHIgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoc3RyX2Z4biAhPSBOVUxMKTsKKworCW5sZHJfb2JqID0gbmxkcl9ub2RlX29iai0+bmxkcl9vYmo7CisJLyogQ2FsbGVkIGZyb20gbm9kZV9jcmVhdGUoKSwgbm9kZV9kZWxldGUoKSwgb3Igbm9kZV9ydW4oKS4gKi8KKwlpZiAobmxkcl9ub2RlX29iai0+ZHluYW1pYyAmJiAqbmxkcl9ub2RlX29iai0+cGZfcGhhc2Vfc3BsaXQpIHsKKwkJc3dpdGNoIChubGRyX25vZGVfb2JqLT5waGFzZSkgeworCQljYXNlIE5MRFJfQ1JFQVRFOgorCQkJcm9vdCA9IG5sZHJfbm9kZV9vYmotPmNyZWF0ZV9saWI7CisJCQlicmVhazsKKwkJY2FzZSBOTERSX0VYRUNVVEU6CisJCQlyb290ID0gbmxkcl9ub2RlX29iai0+ZXhlY3V0ZV9saWI7CisJCQlicmVhazsKKwkJY2FzZSBOTERSX0RFTEVURToKKwkJCXJvb3QgPSBubGRyX25vZGVfb2JqLT5kZWxldGVfbGliOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkNfQVNTRVJUKGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZm9yIE92ZXJsYXkgbm9kZXMgb3Igbm9uLXNwbGl0IER5bmFtaWMgbm9kZXMgKi8KKwkJcm9vdCA9IG5sZHJfbm9kZV9vYmotPnJvb3Q7CisJfQorCXN0YXR1czEgPQorCSAgICBubGRyX29iai0+bGRyX2Z4bnMuZ2V0X2NfYWRkcl9meG4ocm9vdC5saWIsIHN0cl9meG4sICZkYmxsX3N5bSk7CisJaWYgKCFzdGF0dXMxKQorCQlzdGF0dXMxID0KKwkJICAgIG5sZHJfb2JqLT5sZHJfZnhucy5nZXRfYWRkcl9meG4ocm9vdC5saWIsIHN0cl9meG4sCisJCQkJCQkgICAgJmRibGxfc3ltKTsKKworCS8qIElmIHN5bWJvbCBub3QgZm91bmQsIGNoZWNrIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKwlpZiAoIXN0YXR1czEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJvb3QuZGVwX2xpYnM7IGkrKykgeworCQkJc3RhdHVzMSA9CisJCQkgICAgbmxkcl9vYmotPmxkcl9meG5zLmdldF9hZGRyX2Z4bihyb290LmRlcF9saWJzX3RyZWUKKwkJCQkJCQkgICAgW2ldLmxpYiwgc3RyX2Z4biwKKwkJCQkJCQkgICAgJmRibGxfc3ltKTsKKwkJCWlmICghc3RhdHVzMSkgeworCQkJCXN0YXR1czEgPQorCQkJCSAgICBubGRyX29iai0+bGRyX2Z4bnMuCisJCQkJICAgIGdldF9jX2FkZHJfZnhuKHJvb3QuZGVwX2xpYnNfdHJlZVtpXS5saWIsCisJCQkJCQkgICBzdHJfZnhuLCAmZGJsbF9zeW0pOworCQkJfQorCQkJaWYgKHN0YXR1czEpIHsKKwkJCQkvKiBTeW1ib2wgZm91bmQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKiBDaGVjayBwZXJzaXN0ZW50IGxpYnJhcmllcyAqLworCWlmICghc3RhdHVzMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbmxkcl9ub2RlX29iai0+cGVyc19saWJzOyBpKyspIHsKKwkJCXN0YXR1czEgPQorCQkJICAgIG5sZHJfb2JqLT5sZHJfZnhucy4KKwkJCSAgICBnZXRfYWRkcl9meG4obmxkcl9ub2RlX29iai0+cGVyc19saWJfdGFibGVbaV0ubGliLAorCQkJCQkgc3RyX2Z4biwgJmRibGxfc3ltKTsKKwkJCWlmICghc3RhdHVzMSkgeworCQkJCXN0YXR1czEgPQorCQkJCSAgICBubGRyX29iai0+bGRyX2Z4bnMuCisJCQkJICAgIGdldF9jX2FkZHJfZnhuKG5sZHJfbm9kZV9vYmotPnBlcnNfbGliX3RhYmxlCisJCQkJCQkgICBbaV0ubGliLCBzdHJfZnhuLCAmZGJsbF9zeW0pOworCQkJfQorCQkJaWYgKHN0YXR1czEpIHsKKwkJCQkvKiBTeW1ib2wgZm91bmQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzdGF0dXMxKQorCQkqYWRkciA9IGRibGxfc3ltLT52YWx1ZTsKKwllbHNlCisJCXN0YXR1cyA9IC1FU1BJUEU7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5sZHJfZ2V0X3JtbV9tYW5hZ2VyID09PT09PT09CisgKiAgR2l2ZW4gYSBOTERSIG9iamVjdCwgcmV0cmlldmUgUk1NIE1hbmFnZXIgSGFuZGxlCisgKi8KK2ludCBubGRyX2dldF9ybW1fbWFuYWdlcihzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHIsCisJCQkJc3RydWN0IHJtbV90YXJnZXRfb2JqICoqcm1tX21ncikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHJfb2JqID0gbmxkcjsKKwlEQkNfUkVRVUlSRShybW1fbWdyICE9IE5VTEwpOworCisJaWYgKG5sZHIpIHsKKwkJKnJtbV9tZ3IgPSBubGRyX29iai0+cm1tOworCX0gZWxzZSB7CisJCSpybW1fbWdyID0gTlVMTDsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgKHJtbV9tZ3IgIT0gTlVMTCAmJiAqcm1tX21nciA9PSBOVUxMKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5sZHJfaW5pdCA9PT09PT09PQorICogIEluaXRpYWxpemUgdGhlIE5MRFIgbW9kdWxlLgorICovCitib29sIG5sZHJfaW5pdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlpZiAocmVmcyA9PSAwKQorCQlybW1faW5pdCgpOworCisJcmVmcysrOworCisJREJDX0VOU1VSRShyZWZzID4gMCk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbmxkcl9sb2FkID09PT09PT09CisgKi8KK2ludCBubGRyX2xvYWQoc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiwKKwkJICAgICBlbnVtIG5sZHJfcGhhc2UgcGhhc2UpCit7CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iajsKKwlzdHJ1Y3QgZHNwX3V1aWQgbGliX3V1aWQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUobmxkcl9ub2RlX29iaik7CisKKwlubGRyX29iaiA9IG5sZHJfbm9kZV9vYmotPm5sZHJfb2JqOworCisJaWYgKG5sZHJfbm9kZV9vYmotPmR5bmFtaWMpIHsKKwkJbmxkcl9ub2RlX29iai0+cGhhc2UgPSBwaGFzZTsKKworCQlsaWJfdXVpZCA9IG5sZHJfbm9kZV9vYmotPnV1aWQ7CisKKwkJLyogQXQgdGhpcyBwb2ludCwgd2UgbWF5IG5vdCBrbm93IGlmIG5vZGUgaXMgc3BsaXQgaW50bworCQkgKiBkaWZmZXJlbnQgbGlicmFyaWVzLiBTbyB3ZSdsbCBnbyBhaGVhZCBhbmQgbG9hZCB0aGUKKwkJICogbGlicmFyeSwgYW5kIHRoZW4gc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUKKwkJICogbG9jYXRpb24gYWZ0ZXIgd2Uga25vdy4gKi8KKworCQlzdGF0dXMgPQorCQkgICAgbG9hZF9saWIobmxkcl9ub2RlX29iaiwgJm5sZHJfbm9kZV9vYmotPnJvb3QsIGxpYl91dWlkLAorCQkJICAgICBmYWxzZSwgbmxkcl9ub2RlX29iai0+bGliX3BhdGgsIHBoYXNlLCAwKTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJaWYgKCpubGRyX25vZGVfb2JqLT5wZl9waGFzZV9zcGxpdCkgeworCQkJCXN3aXRjaCAocGhhc2UpIHsKKwkJCQljYXNlIE5MRFJfQ1JFQVRFOgorCQkJCQlubGRyX25vZGVfb2JqLT5jcmVhdGVfbGliID0KKwkJCQkJICAgIG5sZHJfbm9kZV9vYmotPnJvb3Q7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBOTERSX0VYRUNVVEU6CisJCQkJCW5sZHJfbm9kZV9vYmotPmV4ZWN1dGVfbGliID0KKwkJCQkJICAgIG5sZHJfbm9kZV9vYmotPnJvb3Q7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBOTERSX0RFTEVURToKKwkJCQkJbmxkcl9ub2RlX29iai0+ZGVsZXRlX2xpYiA9CisJCQkJCSAgICBubGRyX25vZGVfb2JqLT5yb290OworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCURCQ19BU1NFUlQoZmFsc2UpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobmxkcl9ub2RlX29iai0+b3ZlcmxheSkKKwkJCXN0YXR1cyA9IGxvYWRfb3ZseShubGRyX25vZGVfb2JqLCBwaGFzZSk7CisKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5sZHJfdW5sb2FkID09PT09PT09CisgKi8KK2ludCBubGRyX3VubG9hZChzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpubGRyX25vZGVfb2JqLAorCQkgICAgICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBsaWJfbm9kZSAqcm9vdF9saWIgPSBOVUxMOworCXMzMiBpID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShubGRyX25vZGVfb2JqKTsKKworCWlmIChubGRyX25vZGVfb2JqICE9IE5VTEwpIHsKKwkJaWYgKG5sZHJfbm9kZV9vYmotPmR5bmFtaWMpIHsKKwkJCWlmICgqbmxkcl9ub2RlX29iai0+cGZfcGhhc2Vfc3BsaXQpIHsKKwkJCQlzd2l0Y2ggKHBoYXNlKSB7CisJCQkJY2FzZSBOTERSX0NSRUFURToKKwkJCQkJcm9vdF9saWIgPSAmbmxkcl9ub2RlX29iai0+Y3JlYXRlX2xpYjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOTERSX0VYRUNVVEU6CisJCQkJCXJvb3RfbGliID0gJm5sZHJfbm9kZV9vYmotPmV4ZWN1dGVfbGliOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5MRFJfREVMRVRFOgorCQkJCQlyb290X2xpYiA9ICZubGRyX25vZGVfb2JqLT5kZWxldGVfbGliOworCQkJCQkvKiBVbmxvYWQgcGVyc2lzdGVudCBsaWJyYXJpZXMgKi8KKwkJCQkJZm9yIChpID0gMDsKKwkJCQkJICAgICBpIDwgbmxkcl9ub2RlX29iai0+cGVyc19saWJzOworCQkJCQkgICAgIGkrKykgeworCQkJCQkJdW5sb2FkX2xpYihubGRyX25vZGVfb2JqLAorCQkJCQkJCSAgICZubGRyX25vZGVfb2JqLT4KKwkJCQkJCQkgICBwZXJzX2xpYl90YWJsZVtpXSk7CisJCQkJCX0KKwkJCQkJbmxkcl9ub2RlX29iai0+cGVyc19saWJzID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJREJDX0FTU0VSVChmYWxzZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogVW5sb2FkIG1haW4gbGlicmFyeSAqLworCQkJCXJvb3RfbGliID0gJm5sZHJfbm9kZV9vYmotPnJvb3Q7CisJCQl9CisJCQlpZiAocm9vdF9saWIpCisJCQkJdW5sb2FkX2xpYihubGRyX25vZGVfb2JqLCByb290X2xpYik7CisJCX0gZWxzZSB7CisJCQlpZiAobmxkcl9ub2RlX29iai0+b3ZlcmxheSkKKwkJCQl1bmxvYWRfb3ZseShubGRyX25vZGVfb2JqLCBwaGFzZSk7CisKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGFkZF9vdmx5X2luZm8gPT09PT09PT0KKyAqLworc3RhdGljIGludCBhZGRfb3ZseV9pbmZvKHZvaWQgKmhhbmRsZSwgc3RydWN0IGRibGxfc2VjdF9pbmZvICpzZWN0X2luZm8sCisJCQkJdTMyIGFkZHIsIHUzMiBieXRlcykKK3sKKwljaGFyICpub2RlX25hbWU7CisJY2hhciAqc2VjdF9uYW1lID0gKGNoYXIgKilzZWN0X2luZm8tPm5hbWU7CisJYm9vbCBzZWN0X2V4aXN0cyA9IGZhbHNlOworCWNoYXIgc2VwcyA9ICc6JzsKKwljaGFyICpwY2g7CisJdTE2IGk7CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiA9IChzdHJ1Y3Qgbmxkcl9vYmplY3QgKiloYW5kbGU7CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBJcyB0aGlzIGFuIG92ZXJsYXkgc2VjdGlvbiAobG9hZCBhZGRyZXNzICE9IHJ1biBhZGRyZXNzKT8gKi8KKwlpZiAoc2VjdF9pbmZvLT5zZWN0X2xvYWRfYWRkciA9PSBzZWN0X2luZm8tPnNlY3RfcnVuX2FkZHIpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBGaW5kIHRoZSBub2RlIGl0IGJlbG9uZ3MgdG8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmxkcl9vYmotPm92bHlfbm9kZXM7IGkrKykgeworCQlub2RlX25hbWUgPSBubGRyX29iai0+b3ZseV90YWJsZVtpXS5ub2RlX25hbWU7CisJCURCQ19SRVFVSVJFKG5vZGVfbmFtZSk7CisJCWlmIChzdHJuY21wKG5vZGVfbmFtZSwgc2VjdF9uYW1lICsgMSwgc3RybGVuKG5vZGVfbmFtZSkpID09IDApIHsKKwkJCS8qIEZvdW5kIHRoZSBub2RlICovCisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIShpIDwgbmxkcl9vYmotPm92bHlfbm9kZXMpKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyogRGV0ZXJtaW5lIHdoaWNoIHBoYXNlIHRoaXMgc2VjdGlvbiBiZWxvbmdzIHRvICovCisJZm9yIChwY2ggPSBzZWN0X25hbWUgKyAxOyAqcGNoICYmICpwY2ggIT0gc2VwczsgcGNoKyspCisJCTs7CisKKwlpZiAoKnBjaCkgeworCQlwY2grKzsJCS8qIFNraXAgb3ZlciB0aGUgJzonICovCisJCWlmIChzdHJuY21wKHBjaCwgUENSRUFURSwgc3RybGVuKFBDUkVBVEUpKSA9PSAwKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFkZF9vdmx5X3NlY3Qobmxkcl9vYmosCisJCQkJCSAgJm5sZHJfb2JqLT4KKwkJCQkJICBvdmx5X3RhYmxlW2ldLmNyZWF0ZV9zZWN0c19saXN0LAorCQkJCQkgIHNlY3RfaW5mbywgJnNlY3RfZXhpc3RzLCBhZGRyLCBieXRlcyk7CisJCQlpZiAoIXN0YXR1cyAmJiAhc2VjdF9leGlzdHMpCisJCQkJbmxkcl9vYmotPm92bHlfdGFibGVbaV0uY3JlYXRlX3NlY3RzKys7CisKKwkJfSBlbHNlIGlmIChzdHJuY21wKHBjaCwgUERFTEVURSwgc3RybGVuKFBERUxFVEUpKSA9PSAwKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFkZF9vdmx5X3NlY3Qobmxkcl9vYmosCisJCQkJCSAgJm5sZHJfb2JqLT4KKwkJCQkJICBvdmx5X3RhYmxlW2ldLmRlbGV0ZV9zZWN0c19saXN0LAorCQkJCQkgIHNlY3RfaW5mbywgJnNlY3RfZXhpc3RzLCBhZGRyLCBieXRlcyk7CisJCQlpZiAoIXN0YXR1cyAmJiAhc2VjdF9leGlzdHMpCisJCQkJbmxkcl9vYmotPm92bHlfdGFibGVbaV0uZGVsZXRlX3NlY3RzKys7CisKKwkJfSBlbHNlIGlmIChzdHJuY21wKHBjaCwgUEVYRUNVVEUsIHN0cmxlbihQRVhFQ1VURSkpID09IDApIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWRkX292bHlfc2VjdChubGRyX29iaiwKKwkJCQkJICAmbmxkcl9vYmotPgorCQkJCQkgIG92bHlfdGFibGVbaV0uZXhlY3V0ZV9zZWN0c19saXN0LAorCQkJCQkgIHNlY3RfaW5mbywgJnNlY3RfZXhpc3RzLCBhZGRyLCBieXRlcyk7CisJCQlpZiAoIXN0YXR1cyAmJiAhc2VjdF9leGlzdHMpCisJCQkJbmxkcl9vYmotPm92bHlfdGFibGVbaV0uZXhlY3V0ZV9zZWN0cysrOworCisJCX0gZWxzZSB7CisJCQkvKiBQdXQgaW4gIm90aGVyIiBzZWN0aW5zICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFkZF9vdmx5X3NlY3Qobmxkcl9vYmosCisJCQkJCSAgJm5sZHJfb2JqLT4KKwkJCQkJICBvdmx5X3RhYmxlW2ldLm90aGVyX3NlY3RzX2xpc3QsCisJCQkJCSAgc2VjdF9pbmZvLCAmc2VjdF9leGlzdHMsIGFkZHIsIGJ5dGVzKTsKKwkJCWlmICghc3RhdHVzICYmICFzZWN0X2V4aXN0cykKKwkJCQlubGRyX29iai0+b3ZseV90YWJsZVtpXS5vdGhlcl9zZWN0cysrOworCisJCX0KKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGFkZF9vdmx5X25vZGUgPT09PT09PT09CisgKiAgQ2FsbGJhY2sgZnVuY3Rpb24gcGFzc2VkIHRvIGRjZF9nZXRfb2JqZWN0cy4KKyAqLworc3RhdGljIGludCBhZGRfb3ZseV9ub2RlKHN0cnVjdCBkc3BfdXVpZCAqdXVpZF9vYmosCisJCQkJZW51bSBkc3BfZGNkb2JqdHlwZSBvYmpfdHlwZSwgdm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmogPSAoc3RydWN0IG5sZHJfb2JqZWN0ICopaGFuZGxlOworCWNoYXIgKm5vZGVfbmFtZSA9IE5VTEw7CisJY2hhciAqcGJ1ZiA9IE5VTEw7CisJdTMyIGxlbjsKKwlzdHJ1Y3QgZGNkX2dlbmVyaWNvYmogb2JqX2RlZjsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChvYmpfdHlwZSAhPSBEU1BfRENETk9ERVRZUEUpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlzdGF0dXMgPQorCSAgICBkY2RfZ2V0X29iamVjdF9kZWYobmxkcl9vYmotPmhkY2RfbWdyLCB1dWlkX29iaiwgb2JqX3R5cGUsCisJCQkgICAgICAgJm9ial9kZWYpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBJZiBvdmVybGF5IG5vZGUsIGFkZCB0byB0aGUgbGlzdCAqLworCWlmIChvYmpfZGVmLm9ial9kYXRhLm5vZGVfb2JqLnVzX2xvYWRfdHlwZSA9PSBOTERSX09WTFlMT0FEKSB7CisJCWlmIChubGRyX29iai0+b3ZseV90YWJsZSA9PSBOVUxMKSB7CisJCQlubGRyX29iai0+b3ZseV9ub2RlcysrOworCQl9IGVsc2UgeworCQkJLyogQWRkIG5vZGUgdG8gdGFibGUgKi8KKwkJCW5sZHJfb2JqLT5vdmx5X3RhYmxlW25sZHJfb2JqLT5vdmx5X25pZF0udXVpZCA9CisJCQkgICAgKnV1aWRfb2JqOworCQkJREJDX1JFUVVJUkUob2JqX2RlZi5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuCisJCQkJICAgIGFjX25hbWUpOworCQkJbGVuID0KKwkJCSAgICBzdHJsZW4ob2JqX2RlZi5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMuYWNfbmFtZSk7CisJCQlub2RlX25hbWUgPSBvYmpfZGVmLm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5hY19uYW1lOworCQkJcGJ1ZiA9IGt6YWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocGJ1ZiA9PSBOVUxMKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCX0gZWxzZSB7CisJCQkJc3RybmNweShwYnVmLCBub2RlX25hbWUsIGxlbik7CisJCQkJbmxkcl9vYmotPm92bHlfdGFibGVbbmxkcl9vYmotPm92bHlfbmlkXS4KKwkJCQkgICAgbm9kZV9uYW1lID0gcGJ1ZjsKKwkJCQlubGRyX29iai0+b3ZseV9uaWQrKzsKKwkJCX0KKwkJfQorCX0KKwkvKiBUaGVzZSB3ZXJlIGFsbG9jYXRlZCBpbiBkY2RfZ2V0X29iamVjdF9kZWYgKi8KKwlrZnJlZShvYmpfZGVmLm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfY3JlYXRlX3BoYXNlX2Z4bik7CisKKwlrZnJlZShvYmpfZGVmLm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfZXhlY3V0ZV9waGFzZV9meG4pOworCisJa2ZyZWUob2JqX2RlZi5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2RlbGV0ZV9waGFzZV9meG4pOworCisJa2ZyZWUob2JqX2RlZi5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2lfYWxnX25hbWUpOworCitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IGFkZF9vdmx5X3NlY3QgPT09PT09PT0KKyAqLworc3RhdGljIGludCBhZGRfb3ZseV9zZWN0KHN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmosCisJCQkJc3RydWN0IG92bHlfc2VjdCAqKmxzdCwKKwkJCQlzdHJ1Y3QgZGJsbF9zZWN0X2luZm8gKnNlY3RfaW5mLAorCQkJCWJvb2wgKmV4aXN0cywgdTMyIGFkZHIsIHUzMiBieXRlcykKK3sKKwlzdHJ1Y3Qgb3ZseV9zZWN0ICpuZXdfc2VjdCA9IE5VTEw7CisJc3RydWN0IG92bHlfc2VjdCAqbGFzdF9zZWN0OworCXN0cnVjdCBvdmx5X3NlY3QgKm92bHlfc2VjdGlvbjsKKwlpbnQgc3RhdHVzID0gMDsKKworCW92bHlfc2VjdGlvbiA9IGxhc3Rfc2VjdCA9ICpsc3Q7CisJKmV4aXN0cyA9IGZhbHNlOworCXdoaWxlIChvdmx5X3NlY3Rpb24pIHsKKwkJLyoKKwkJICogIE1ha2Ugc3VyZSBzZWN0aW9uIGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkLiBNdWx0aXBsZQorCQkgKiAgJ3dyaXRlJyBjYWxscyBtYXkgYmUgbWFkZSB0byBsb2FkIHRoZSBzZWN0aW9uLgorCQkgKi8KKwkJaWYgKG92bHlfc2VjdGlvbi0+c2VjdF9sb2FkX2FkZHIgPT0gYWRkcikgeworCQkJLyogQWxyZWFkeSBhZGRlZCAqLworCQkJKmV4aXN0cyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlsYXN0X3NlY3QgPSBvdmx5X3NlY3Rpb247CisJCW92bHlfc2VjdGlvbiA9IG92bHlfc2VjdGlvbi0+bmV4dF9zZWN0OworCX0KKworCWlmICghb3ZseV9zZWN0aW9uKSB7CisJCS8qIE5ldyBzZWN0aW9uICovCisJCW5ld19zZWN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG92bHlfc2VjdCksIEdGUF9LRVJORUwpOworCQlpZiAobmV3X3NlY3QgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCW5ld19zZWN0LT5zZWN0X2xvYWRfYWRkciA9IGFkZHI7CisJCQluZXdfc2VjdC0+c2VjdF9ydW5fYWRkciA9IHNlY3RfaW5mLT5zZWN0X3J1bl9hZGRyICsKKwkJCSAgICAoYWRkciAtIHNlY3RfaW5mLT5zZWN0X2xvYWRfYWRkcik7CisJCQluZXdfc2VjdC0+c2l6ZSA9IGJ5dGVzOworCQkJbmV3X3NlY3QtPnBhZ2UgPSBzZWN0X2luZi0+dHlwZTsKKwkJfQorCisJCS8qIEFkZCB0byB0aGUgbGlzdCAqLworCQlpZiAoIXN0YXR1cykgeworCQkJaWYgKCpsc3QgPT0gTlVMTCkgeworCQkJCS8qIEZpcnN0IGluIHRoZSBsaXN0ICovCisJCQkJKmxzdCA9IG5ld19zZWN0OworCQkJfSBlbHNlIHsKKwkJCQlsYXN0X3NlY3QtPm5leHRfc2VjdCA9IG5ld19zZWN0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBmYWtlX292bHlfd3JpdGUgPT09PT09PT0KKyAqLworc3RhdGljIHMzMiBmYWtlX292bHlfd3JpdGUodm9pZCAqaGFuZGxlLCB1MzIgZHNwX2FkZHJlc3MsIHZvaWQgKmJ1ZiwgdTMyIGJ5dGVzLAorCQkJICAgczMyIG10eXBlKQoreworCXJldHVybiAoczMyKSBieXRlczsKK30KKworLyoKKyAqICA9PT09PT09PSBmcmVlX3NlY3RzID09PT09PT09CisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfc2VjdHMoc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiwKKwkJICAgICAgIHN0cnVjdCBvdmx5X3NlY3QgKnBoYXNlX3NlY3RzLCB1MTYgYWxsb2NfbnVtKQoreworCXN0cnVjdCBvdmx5X3NlY3QgKm92bHlfc2VjdGlvbiA9IHBoYXNlX3NlY3RzOworCXUxNiBpID0gMDsKKwlib29sIHJldDsKKworCXdoaWxlIChvdmx5X3NlY3Rpb24gJiYgaSA8IGFsbG9jX251bSkgeworCQkvKiAnRGVhbGxvY2F0ZScgKi8KKwkJLyogc2VnaWQgLSBwYWdlIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJCS8qIFJlc2VydmVkIG1lbW9yeSAqLworCQlyZXQgPQorCQkgICAgcm1tX2ZyZWUobmxkcl9vYmotPnJtbSwgMCwgb3ZseV9zZWN0aW9uLT5zZWN0X3J1bl9hZGRyLAorCQkJICAgICBvdmx5X3NlY3Rpb24tPnNpemUsIHRydWUpOworCQlEQkNfQVNTRVJUKHJldCk7CisJCW92bHlfc2VjdGlvbiA9IG92bHlfc2VjdGlvbi0+bmV4dF9zZWN0OworCQlpKys7CisJfQorfQorCisvKgorICogID09PT09PT09IGdldF9zeW1ib2xfdmFsdWUgPT09PT09PT0KKyAqICBGaW5kIHN5bWJvbCBpbiBsaWJyYXJ5J3MgYmFzZSBpbWFnZS4gIElmIG5vdCB0aGVyZSwgY2hlY2sgZGVwZW5kZW50CisgKiAgbGlicmFyaWVzLgorICovCitzdGF0aWMgYm9vbCBnZXRfc3ltYm9sX3ZhbHVlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcGFyZywgdm9pZCAqcm1tX2hhbmRsZSwKKwkJCSAgICAgY2hhciAqc3ltX25hbWUsIHN0cnVjdCBkYmxsX3N5bV92YWwgKipzeW0pCit7CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiA9IChzdHJ1Y3Qgbmxkcl9vYmplY3QgKiloYW5kbGU7CisJc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiA9CisJICAgIChzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICopcm1tX2hhbmRsZTsKKwlzdHJ1Y3QgbGliX25vZGUgKnJvb3QgPSAoc3RydWN0IGxpYl9ub2RlICopcGFyZzsKKwl1MTYgaTsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCisJLyogY2hlY2sgdGhlIGJhc2UgaW1hZ2UgKi8KKwlzdGF0dXMgPSBubGRyX29iai0+bGRyX2Z4bnMuZ2V0X2FkZHJfZnhuKG5sZHJfb2JqLT5iYXNlX2xpYiwKKwkJCQkJCSBzeW1fbmFtZSwgc3ltKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0KKwkJICAgIG5sZHJfb2JqLT5sZHJfZnhucy5nZXRfY19hZGRyX2Z4bihubGRyX29iai0+YmFzZV9saWIsCisJCQkJCQkJc3ltX25hbWUsIHN5bSk7CisKKwkvKgorCSAqICBDaGVjayBpbiByb290IGxpYiBpdHNlbGYuIElmIHRoZSBsaWJyYXJ5IGNvbnNpc3RzIG9mCisJICogIG11bHRpcGxlIG9iamVjdCBmaWxlcyBsaW5rZWQgdG9nZXRoZXIsIHNvbWUgc3ltYm9scyBpbiB0aGUKKwkgKiAgbGlicmFyeSBtYXkgbmVlZCB0byBiZSByZXNvbHZlZC4KKwkgKi8KKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBubGRyX29iai0+bGRyX2Z4bnMuZ2V0X2FkZHJfZnhuKHJvb3QtPmxpYiwgc3ltX25hbWUsCisJCQkJCQkJIHN5bSk7CisJCWlmICghc3RhdHVzKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIG5sZHJfb2JqLT5sZHJfZnhucy5nZXRfY19hZGRyX2Z4bihyb290LT5saWIsCisJCQkJCQkJICAgICAgc3ltX25hbWUsIHN5bSk7CisJCX0KKwl9CisKKwkvKgorCSAqICBDaGVjayBpbiByb290IGxpYidzIGRlcGVuZGVudCBsaWJyYXJpZXMsIGJ1dCBub3QgZGVwZW5kZW50CisJICogIGxpYnJhcmllcycgZGVwZW5kZW50cy4KKwkgKi8KKwlpZiAoIXN0YXR1cykgeworCQlmb3IgKGkgPSAwOyBpIDwgcm9vdC0+ZGVwX2xpYnM7IGkrKykgeworCQkJc3RhdHVzID0KKwkJCSAgICBubGRyX29iai0+bGRyX2Z4bnMuZ2V0X2FkZHJfZnhuKHJvb3QtPgorCQkJCQkJCSAgICBkZXBfbGlic190cmVlCisJCQkJCQkJICAgIFtpXS5saWIsCisJCQkJCQkJICAgIHN5bV9uYW1lLCBzeW0pOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBubGRyX29iai0+bGRyX2Z4bnMuCisJCQkJICAgIGdldF9jX2FkZHJfZnhuKHJvb3QtPmRlcF9saWJzX3RyZWVbaV0ubGliLAorCQkJCQkJICAgc3ltX25hbWUsIHN5bSk7CisJCQl9CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJLyogU3ltYm9sIGZvdW5kICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBDaGVjayBpbiBwZXJzaXN0ZW50IGxpYnJhcmllcworCSAqLworCWlmICghc3RhdHVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBubGRyX25vZGVfb2JqLT5wZXJzX2xpYnM7IGkrKykgeworCQkJc3RhdHVzID0KKwkJCSAgICBubGRyX29iai0+bGRyX2Z4bnMuCisJCQkgICAgZ2V0X2FkZHJfZnhuKG5sZHJfbm9kZV9vYmotPnBlcnNfbGliX3RhYmxlW2ldLmxpYiwKKwkJCQkJIHN5bV9uYW1lLCBzeW0pOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQlzdGF0dXMgPSBubGRyX29iai0+bGRyX2Z4bnMuZ2V0X2NfYWRkcl9meG4KKwkJCQkgICAgKG5sZHJfbm9kZV9vYmotPnBlcnNfbGliX3RhYmxlW2ldLmxpYiwKKwkJCQkgICAgIHN5bV9uYW1lLCBzeW0pOworCQkJfQorCQkJaWYgKHN0YXR1cykgeworCQkJCS8qIFN5bWJvbCBmb3VuZCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBsb2FkX2xpYiA9PT09PT09PQorICogIFJlY3Vyc2l2ZWx5IGxvYWQgbGlicmFyeSBhbmQgYWxsIGl0cyBkZXBlbmRlbnQgbGlicmFyaWVzLiBUaGUgbGlicmFyeQorICogIHdlJ3JlIGxvYWRpbmcgaXMgc3BlY2lmaWVkIGJ5IGEgdXVpZC4KKyAqLworc3RhdGljIGludCBsb2FkX2xpYihzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpubGRyX25vZGVfb2JqLAorCQkJICAgc3RydWN0IGxpYl9ub2RlICpyb290LCBzdHJ1Y3QgZHNwX3V1aWQgdXVpZCwKKwkJCSAgIGJvb2wgcm9vdF9wcnN0bnQsCisJCQkgICBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqKmxpYl9wYXRoLAorCQkJICAgZW51bSBubGRyX3BoYXNlIHBoYXNlLCB1MTYgZGVwdGgpCit7CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiA9IG5sZHJfbm9kZV9vYmotPm5sZHJfb2JqOworCXUxNiBuZF9saWJzID0gMDsJLyogTnVtYmVyIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKwl1MTYgbnBfbGlicyA9IDA7CS8qIE51bWJlciBvZiBwZXJzaXN0ZW50IGxpYnJhcmllcyAqLworCXUxNiBuZF9saWJzX2xvYWRlZCA9IDA7CS8qIE51bWJlciBvZiBkZXAuIGxpYnJhcmllcyBsb2FkZWQgKi8KKwl1MTYgaTsKKwl1MzIgZW50cnk7CisJdTMyIGR3X2J1Zl9zaXplID0gTkxEUl9NQVhQQVRITEVOR1RIOworCWRibGxfZmxhZ3MgZmxhZ3MgPSBEQkxMX1NZTUIgfCBEQkxMX0NPREUgfCBEQkxMX0RBVEEgfCBEQkxMX0RZTkFNSUM7CisJc3RydWN0IGRibGxfYXR0cnMgbmV3X2F0dHJzOworCWNoYXIgKnBzel9maWxlX25hbWUgPSBOVUxMOworCXN0cnVjdCBkc3BfdXVpZCAqZGVwX2xpYl91dWlfZHMgPSBOVUxMOworCWJvb2wgKnBlcnNpc3RlbnRfZGVwX2xpYnMgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCWJvb2wgbGliX3N0YXR1cyA9IGZhbHNlOworCXN0cnVjdCBsaWJfbm9kZSAqZGVwX2xpYjsKKworCWlmIChkZXB0aCA+IE1BWERFUFRIKSB7CisJCS8qIEVycm9yICovCisJCURCQ19BU1NFUlQoZmFsc2UpOworCX0KKwlyb290LT5saWIgPSBOVUxMOworCS8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciBsaWJyYXJ5IGZpbGUgbmFtZSBvZiBzaXplIERCTF9NQVhQQVRITEVOR1RIICovCisJcHN6X2ZpbGVfbmFtZSA9IGt6YWxsb2MoREJMTF9NQVhQQVRITEVOR1RILCBHRlBfS0VSTkVMKTsKKwlpZiAocHN6X2ZpbGVfbmFtZSA9PSBOVUxMKQorCQlzdGF0dXMgPSAtRU5PTUVNOworCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5ICovCisJCWlmIChkZXB0aCA9PSAwKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGRjZF9nZXRfbGlicmFyeV9uYW1lKG5sZHJfbm9kZV9vYmotPm5sZHJfb2JqLT4KKwkJCQkJCSBoZGNkX21nciwgJnV1aWQsIHBzel9maWxlX25hbWUsCisJCQkJCQkgJmR3X2J1Zl9zaXplLCBwaGFzZSwKKwkJCQkJCSBubGRyX25vZGVfb2JqLT5wZl9waGFzZV9zcGxpdCk7CisJCX0gZWxzZSB7CisJCQkvKiBEZXBlbmRlbnQgbGlicmFyaWVzIGFyZSByZWdpc3RlcmVkIHdpdGggYSBwaGFzZSAqLworCQkJc3RhdHVzID0KKwkJCSAgICBkY2RfZ2V0X2xpYnJhcnlfbmFtZShubGRyX25vZGVfb2JqLT5ubGRyX29iai0+CisJCQkJCQkgaGRjZF9tZ3IsICZ1dWlkLCBwc3pfZmlsZV9uYW1lLAorCQkJCQkJICZkd19idWZfc2l6ZSwgTkxEUl9OT1BIQVNFLAorCQkJCQkJIE5VTEwpOworCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIE9wZW4gdGhlIGxpYnJhcnksIGRvbid0IGxvYWQgc3ltYm9scyAqLworCQlzdGF0dXMgPQorCQkgICAgbmxkcl9vYmotPmxkcl9meG5zLm9wZW5fZnhuKG5sZHJfb2JqLT5kYmxsLCBwc3pfZmlsZV9uYW1lLAorCQkJCQkJREJMTF9OT0xPQUQsICZyb290LT5saWIpOworCX0KKwkvKiBEb25lIHdpdGggZmlsZSBuYW1lICovCisJa2ZyZWUocHN6X2ZpbGVfbmFtZSk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgbGlicmFyeSBub3QgYWxyZWFkeSBsb2FkZWQgKi8KKwlpZiAoIXN0YXR1cyAmJiByb290X3Byc3RudCkgeworCQlsaWJfc3RhdHVzID0KKwkJICAgIGZpbmRfaW5fcGVyc2lzdGVudF9saWJfYXJyYXkobmxkcl9ub2RlX29iaiwgcm9vdC0+bGliKTsKKwkJLyogQ2xvc2UgbGlicmFyeSAqLworCQlpZiAobGliX3N0YXR1cykgeworCQkJbmxkcl9vYmotPmxkcl9meG5zLmNsb3NlX2Z4bihyb290LT5saWIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogQ2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKwkJCWlmIChyb290LT5saWIgPT0gbGliX3BhdGhbaV0pIHsKKwkJCQkvKiBUaGlzIGNvbmRpdGlvbiBjb3VsZCBiZSBjaGVja2VkIGJ5IGEKKwkJCQkgKiB0b29sIGF0IGJ1aWxkIHRpbWUuICovCisJCQkJc3RhdHVzID0gLUVJTFNFUTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBBZGQgbGlicmFyeSB0byBjdXJyZW50IHBhdGggaW4gZGVwZW5kZW5jeSB0cmVlICovCisJCWxpYl9wYXRoW2RlcHRoXSA9IHJvb3QtPmxpYjsKKwkJZGVwdGgrKzsKKwkJLyogR2V0IG51bWJlciBvZiBkZXBlbmRlbnQgbGlicmFyaWVzICovCisJCXN0YXR1cyA9CisJCSAgICBkY2RfZ2V0X251bV9kZXBfbGlicyhubGRyX25vZGVfb2JqLT5ubGRyX29iai0+aGRjZF9tZ3IsCisJCQkJCSAmdXVpZCwgJm5kX2xpYnMsICZucF9saWJzLCBwaGFzZSk7CisJfQorCURCQ19BU1NFUlQobmRfbGlicyA+PSBucF9saWJzKTsKKwlpZiAoIXN0YXR1cykgeworCQlpZiAoISgqbmxkcl9ub2RlX29iai0+cGZfcGhhc2Vfc3BsaXQpKQorCQkJbnBfbGlicyA9IDA7CisKKwkJLyogbmRfbGlicyA9ICNvZiBkZXBlbmRlbnQgbGlicmFyaWVzICovCisJCXJvb3QtPmRlcF9saWJzID0gbmRfbGlicyAtIG5wX2xpYnM7CisJCWlmIChuZF9saWJzID4gMCkgeworCQkJZGVwX2xpYl91dWlfZHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHNwX3V1aWQpICoKKwkJCQkJCQluZF9saWJzLCBHRlBfS0VSTkVMKTsKKwkJCXBlcnNpc3RlbnRfZGVwX2xpYnMgPQorCQkJCWt6YWxsb2Moc2l6ZW9mKGJvb2wpICogbmRfbGlicywgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRlcF9saWJfdXVpX2RzIHx8ICFwZXJzaXN0ZW50X2RlcF9saWJzKQorCQkJCXN0YXR1cyA9IC1FTk9NRU07CisKKwkJCWlmIChyb290LT5kZXBfbGlicyA+IDApIHsKKwkJCQkvKiBBbGxvY2F0ZSBhcnJheXMgZm9yIGRlcGVuZGVudCBsaWIgVVVJRHMsCisJCQkJICogbGliIG5vZGVzICovCisJCQkJcm9vdC0+ZGVwX2xpYnNfdHJlZSA9IGt6YWxsb2MKKwkJCQkJCShzaXplb2Yoc3RydWN0IGxpYl9ub2RlKSAqCisJCQkJCQkocm9vdC0+ZGVwX2xpYnMpLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIShyb290LT5kZXBfbGlic190cmVlKSkKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKworCQkJfQorCisJCQlpZiAoIXN0YXR1cykgeworCQkJCS8qIEdldCB0aGUgZGVwZW5kZW50IGxpYnJhcnkgVVVJRHMgKi8KKwkJCQlzdGF0dXMgPQorCQkJCSAgICBkY2RfZ2V0X2RlcF9saWJzKG5sZHJfbm9kZV9vYmotPgorCQkJCQkJICAgICBubGRyX29iai0+aGRjZF9tZ3IsICZ1dWlkLAorCQkJCQkJICAgICBuZF9saWJzLCBkZXBfbGliX3V1aV9kcywKKwkJCQkJCSAgICAgcGVyc2lzdGVudF9kZXBfbGlicywKKwkJCQkJCSAgICAgcGhhc2UpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiAgUmVjdXJzaXZlbHkgbG9hZCBkZXBlbmRlbnQgbGlicmFyaWVzLgorCSAqLworCWlmICghc3RhdHVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuZF9saWJzOyBpKyspIHsKKwkJCS8qIElmIHJvb3QgbGlicmFyeSBpcyBOT1QgcGVyc2lzdGVudCwgYW5kIGRlcCBsaWJyYXJ5CisJCQkgKiBpcywgdGhlbiByZWNvcmQgaXQuICBJZiByb290IGxpYnJhcnkgSVMgcGVyc2lzdGVudCwKKwkJCSAqIHRoZSBkZXBsaWIgaXMgYWxyZWFkeSBpbmNsdWRlZCAqLworCQkJaWYgKCFyb290X3Byc3RudCAmJiBwZXJzaXN0ZW50X2RlcF9saWJzW2ldICYmCisJCQkgICAgKm5sZHJfbm9kZV9vYmotPnBmX3BoYXNlX3NwbGl0KSB7CisJCQkJaWYgKChubGRyX25vZGVfb2JqLT5wZXJzX2xpYnMpID49IE1BWExJQlMpIHsKKwkJCQkJc3RhdHVzID0gLUVJTFNFUTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogQWxsb2NhdGUgbGlicmFyeSBvdXRzaWRlIG9mIHBoYXNlICovCisJCQkJZGVwX2xpYiA9CisJCQkJICAgICZubGRyX25vZGVfb2JqLT5wZXJzX2xpYl90YWJsZQorCQkJCSAgICBbbmxkcl9ub2RlX29iai0+cGVyc19saWJzXTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJvb3RfcHJzdG50KQorCQkJCQlwZXJzaXN0ZW50X2RlcF9saWJzW2ldID0gdHJ1ZTsKKworCQkJCS8qIEFsbG9jYXRlIGxpYnJhcnkgd2l0aGluIHBoYXNlICovCisJCQkJZGVwX2xpYiA9ICZyb290LT5kZXBfbGlic190cmVlW25kX2xpYnNfbG9hZGVkXTsKKwkJCX0KKworCQkJc3RhdHVzID0gbG9hZF9saWIobmxkcl9ub2RlX29iaiwgZGVwX2xpYiwKKwkJCQkJICBkZXBfbGliX3V1aV9kc1tpXSwKKwkJCQkJICBwZXJzaXN0ZW50X2RlcF9saWJzW2ldLCBsaWJfcGF0aCwKKwkJCQkJICBwaGFzZSwgZGVwdGgpOworCisJCQlpZiAoIXN0YXR1cykgeworCQkJCWlmICgoc3RhdHVzICE9IDApICYmCisJCQkJICAgICFyb290X3Byc3RudCAmJiBwZXJzaXN0ZW50X2RlcF9saWJzW2ldICYmCisJCQkJICAgICpubGRyX25vZGVfb2JqLT5wZl9waGFzZV9zcGxpdCkgeworCQkJCQkobmxkcl9ub2RlX29iai0+cGVyc19saWJzKSsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghcGVyc2lzdGVudF9kZXBfbGlic1tpXSB8fAorCQkJCQkgICAgISgqbmxkcl9ub2RlX29iai0+cGZfcGhhc2Vfc3BsaXQpKSB7CisJCQkJCQluZF9saWJzX2xvYWRlZCsrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIE5vdyB3ZSBjYW4gbG9hZCB0aGUgcm9vdCBsaWJyYXJ5ICovCisJaWYgKCFzdGF0dXMpIHsKKwkJbmV3X2F0dHJzID0gbmxkcl9vYmotPmxkcl9hdHRyczsKKwkJbmV3X2F0dHJzLnN5bV9hcmcgPSByb290OworCQluZXdfYXR0cnMucm1tX2hhbmRsZSA9IG5sZHJfbm9kZV9vYmo7CisJCW5ld19hdHRycy5pbnB1dF9wYXJhbXMgPSBubGRyX25vZGVfb2JqLT5wcml2X3JlZjsKKwkJbmV3X2F0dHJzLmJhc2VfaW1hZ2UgPSBmYWxzZTsKKworCQlzdGF0dXMgPQorCQkgICAgbmxkcl9vYmotPmxkcl9meG5zLmxvYWRfZnhuKHJvb3QtPmxpYiwgZmxhZ3MsICZuZXdfYXR0cnMsCisJCQkJCQkmZW50cnkpOworCX0KKworCS8qCisJICogIEluIGNhc2Ugb2YgZmFpbHVyZSwgdW5sb2FkIGFueSBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKKwkgKiAgd2VyZSBsb2FkZWQsIGFuZCBjbG9zZSB0aGUgcm9vdCBsaWJyYXJ5LgorCSAqICAoUGVyc2lzdGVudCBsaWJyYXJpZXMgYXJlIHVubG9hZGVkIGZyb20gdGhlIHZlcnkgdG9wKQorCSAqLworCWlmIChzdGF0dXMpIHsKKwkJaWYgKHBoYXNlICE9IE5MRFJfRVhFQ1VURSkgeworCQkJZm9yIChpID0gMDsgaSA8IG5sZHJfbm9kZV9vYmotPnBlcnNfbGliczsgaSsrKQorCQkJCXVubG9hZF9saWIobmxkcl9ub2RlX29iaiwKKwkJCQkJICAgJm5sZHJfbm9kZV9vYmotPnBlcnNfbGliX3RhYmxlW2ldKTsKKworCQkJbmxkcl9ub2RlX29iai0+cGVyc19saWJzID0gMDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbmRfbGlic19sb2FkZWQ7IGkrKykKKwkJCXVubG9hZF9saWIobmxkcl9ub2RlX29iaiwgJnJvb3QtPmRlcF9saWJzX3RyZWVbaV0pOworCisJCWlmIChyb290LT5saWIpCisJCQlubGRyX29iai0+bGRyX2Z4bnMuY2xvc2VfZnhuKHJvb3QtPmxpYik7CisKKwl9CisKKwkvKiBHb2luZyB1cCBvbmUgbm9kZSBpbiB0aGUgZGVwZW5kZW5jeSB0cmVlICovCisJZGVwdGgtLTsKKworCWtmcmVlKGRlcF9saWJfdXVpX2RzKTsKKwlkZXBfbGliX3V1aV9kcyA9IE5VTEw7CisKKwlrZnJlZShwZXJzaXN0ZW50X2RlcF9saWJzKTsKKwlwZXJzaXN0ZW50X2RlcF9saWJzID0gTlVMTDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbG9hZF9vdmx5ID09PT09PT09CisgKi8KK3N0YXRpYyBpbnQgbG9hZF9vdmx5KHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCQkgICAgZW51bSBubGRyX3BoYXNlIHBoYXNlKQoreworCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmogPSBubGRyX25vZGVfb2JqLT5ubGRyX29iajsKKwlzdHJ1Y3Qgb3ZseV9ub2RlICpwb19ub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgb3ZseV9zZWN0ICpwaGFzZV9zZWN0cyA9IE5VTEw7CisJc3RydWN0IG92bHlfc2VjdCAqb3RoZXJfc2VjdHNfbGlzdCA9IE5VTEw7CisJdTE2IGk7CisJdTE2IGFsbG9jX251bSA9IDA7CisJdTE2IG90aGVyX2FsbG9jID0gMDsKKwl1MTYgKnJlZl9jb3VudCA9IE5VTEw7CisJdTE2ICpvdGhlcl9yZWYgPSBOVUxMOworCXUzMiBieXRlczsKKwlzdHJ1Y3Qgb3ZseV9zZWN0ICpvdmx5X3NlY3Rpb247CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBGaW5kIHRoZSBub2RlIGluIHRoZSB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBubGRyX29iai0+b3ZseV9ub2RlczsgaSsrKSB7CisJCWlmIChpc19lcXVhbF91dWlkCisJCSAgICAoJm5sZHJfbm9kZV9vYmotPnV1aWQsICZubGRyX29iai0+b3ZseV90YWJsZVtpXS51dWlkKSkgeworCQkJLyogRm91bmQgaXQgKi8KKwkJCXBvX25vZGUgPSAmKG5sZHJfb2JqLT5vdmx5X3RhYmxlW2ldKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJREJDX0FTU0VSVChpIDwgbmxkcl9vYmotPm92bHlfbm9kZXMpOworCisJaWYgKCFwb19ub2RlKSB7CisJCXN0YXR1cyA9IC1FTk9FTlQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgTkxEUl9DUkVBVEU6CisJCXJlZl9jb3VudCA9ICYocG9fbm9kZS0+Y3JlYXRlX3JlZik7CisJCW90aGVyX3JlZiA9ICYocG9fbm9kZS0+b3RoZXJfcmVmKTsKKwkJcGhhc2Vfc2VjdHMgPSBwb19ub2RlLT5jcmVhdGVfc2VjdHNfbGlzdDsKKwkJb3RoZXJfc2VjdHNfbGlzdCA9IHBvX25vZGUtPm90aGVyX3NlY3RzX2xpc3Q7CisJCWJyZWFrOworCisJY2FzZSBOTERSX0VYRUNVVEU6CisJCXJlZl9jb3VudCA9ICYocG9fbm9kZS0+ZXhlY3V0ZV9yZWYpOworCQlwaGFzZV9zZWN0cyA9IHBvX25vZGUtPmV4ZWN1dGVfc2VjdHNfbGlzdDsKKwkJYnJlYWs7CisKKwljYXNlIE5MRFJfREVMRVRFOgorCQlyZWZfY291bnQgPSAmKHBvX25vZGUtPmRlbGV0ZV9yZWYpOworCQlwaGFzZV9zZWN0cyA9IHBvX25vZGUtPmRlbGV0ZV9zZWN0c19saXN0OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCQ19BU1NFUlQoZmFsc2UpOworCQlicmVhazsKKwl9CisKKwlpZiAocmVmX2NvdW50ID09IE5VTEwpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlpZiAoKnJlZl9jb3VudCAhPSAwKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyogJ0FsbG9jYXRlJyBtZW1vcnkgZm9yIG92ZXJsYXkgc2VjdGlvbnMgb2YgdGhpcyBwaGFzZSAqLworCW92bHlfc2VjdGlvbiA9IHBoYXNlX3NlY3RzOworCXdoaWxlIChvdmx5X3NlY3Rpb24pIHsKKwkJLyogYWxsb2NhdGUgKi8vKiBwYWdlIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJCS8qIHJlc2VydmUgKi8vKiBhbGlnbiAqLworCQlzdGF0dXMgPSBybW1fYWxsb2Mobmxkcl9vYmotPnJtbSwgMCwgb3ZseV9zZWN0aW9uLT5zaXplLCAwLAorCQkJCSAgICYob3ZseV9zZWN0aW9uLT5zZWN0X3J1bl9hZGRyKSwgdHJ1ZSk7CisJCWlmICghc3RhdHVzKSB7CisJCQlvdmx5X3NlY3Rpb24gPSBvdmx5X3NlY3Rpb24tPm5leHRfc2VjdDsKKwkJCWFsbG9jX251bSsrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG90aGVyX3JlZiAmJiAqb3RoZXJfcmVmID09IDApIHsKKwkJLyogJ0FsbG9jYXRlJyBtZW1vcnkgZm9yIG90aGVyIG92ZXJsYXkgc2VjdGlvbnMKKwkJICogKGNyZWF0ZSBwaGFzZSkgKi8KKwkJaWYgKCFzdGF0dXMpIHsKKwkJCW92bHlfc2VjdGlvbiA9IG90aGVyX3NlY3RzX2xpc3Q7CisJCQl3aGlsZSAob3ZseV9zZWN0aW9uKSB7CisJCQkJLyogcGFnZSBub3Qgc3VwcG9ydGVkICovLyogYWxpZ24gKi8KKwkJCQkvKiByZXNlcnZlICovCisJCQkJc3RhdHVzID0KKwkJCQkgICAgcm1tX2FsbG9jKG5sZHJfb2JqLT5ybW0sIDAsCisJCQkJCSAgICAgIG92bHlfc2VjdGlvbi0+c2l6ZSwgMCwKKwkJCQkJICAgICAgJihvdmx5X3NlY3Rpb24tPnNlY3RfcnVuX2FkZHIpLAorCQkJCQkgICAgICB0cnVlKTsKKwkJCQlpZiAoIXN0YXR1cykgeworCQkJCQlvdmx5X3NlY3Rpb24gPSBvdmx5X3NlY3Rpb24tPm5leHRfc2VjdDsKKwkJCQkJb3RoZXJfYWxsb2MrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKCpyZWZfY291bnQgPT0gMCkgeworCQlpZiAoIXN0YXR1cykgeworCQkJLyogTG9hZCBzZWN0aW9ucyBmb3IgdGhpcyBwaGFzZSAqLworCQkJb3ZseV9zZWN0aW9uID0gcGhhc2Vfc2VjdHM7CisJCQl3aGlsZSAob3ZseV9zZWN0aW9uICYmICFzdGF0dXMpIHsKKwkJCQlieXRlcyA9CisJCQkJICAgICgqbmxkcl9vYmotPm92bHlfZnhuKSAobmxkcl9ub2RlX29iai0+CisJCQkJCQkJICAgcHJpdl9yZWYsCisJCQkJCQkJICAgb3ZseV9zZWN0aW9uLT4KKwkJCQkJCQkgICBzZWN0X3J1bl9hZGRyLAorCQkJCQkJCSAgIG92bHlfc2VjdGlvbi0+CisJCQkJCQkJICAgc2VjdF9sb2FkX2FkZHIsCisJCQkJCQkJICAgb3ZseV9zZWN0aW9uLT5zaXplLAorCQkJCQkJCSAgIG92bHlfc2VjdGlvbi0+cGFnZSk7CisJCQkJaWYgKGJ5dGVzICE9IG92bHlfc2VjdGlvbi0+c2l6ZSkKKwkJCQkJc3RhdHVzID0gLUVQRVJNOworCisJCQkJb3ZseV9zZWN0aW9uID0gb3ZseV9zZWN0aW9uLT5uZXh0X3NlY3Q7CisJCQl9CisJCX0KKwl9CisJaWYgKG90aGVyX3JlZiAmJiAqb3RoZXJfcmVmID09IDApIHsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCS8qIExvYWQgb3RoZXIgc2VjdGlvbnMgKGNyZWF0ZSBwaGFzZSkgKi8KKwkJCW92bHlfc2VjdGlvbiA9IG90aGVyX3NlY3RzX2xpc3Q7CisJCQl3aGlsZSAob3ZseV9zZWN0aW9uICYmICFzdGF0dXMpIHsKKwkJCQlieXRlcyA9CisJCQkJICAgICgqbmxkcl9vYmotPm92bHlfZnhuKSAobmxkcl9ub2RlX29iai0+CisJCQkJCQkJICAgcHJpdl9yZWYsCisJCQkJCQkJICAgb3ZseV9zZWN0aW9uLT4KKwkJCQkJCQkgICBzZWN0X3J1bl9hZGRyLAorCQkJCQkJCSAgIG92bHlfc2VjdGlvbi0+CisJCQkJCQkJICAgc2VjdF9sb2FkX2FkZHIsCisJCQkJCQkJICAgb3ZseV9zZWN0aW9uLT5zaXplLAorCQkJCQkJCSAgIG92bHlfc2VjdGlvbi0+cGFnZSk7CisJCQkJaWYgKGJ5dGVzICE9IG92bHlfc2VjdGlvbi0+c2l6ZSkKKwkJCQkJc3RhdHVzID0gLUVQRVJNOworCisJCQkJb3ZseV9zZWN0aW9uID0gb3ZseV9zZWN0aW9uLT5uZXh0X3NlY3Q7CisJCQl9CisJCX0KKwl9CisJaWYgKHN0YXR1cykgeworCQkvKiAnRGVhbGxvY2F0ZScgbWVtb3J5ICovCisJCWZyZWVfc2VjdHMobmxkcl9vYmosIHBoYXNlX3NlY3RzLCBhbGxvY19udW0pOworCQlmcmVlX3NlY3RzKG5sZHJfb2JqLCBvdGhlcl9zZWN0c19saXN0LCBvdGhlcl9hbGxvYyk7CisJfQorZnVuY19lbmQ6CisJaWYgKCFzdGF0dXMgJiYgKHJlZl9jb3VudCAhPSBOVUxMKSkgeworCQkqcmVmX2NvdW50ICs9IDE7CisJCWlmIChvdGhlcl9yZWYpCisJCQkqb3RoZXJfcmVmICs9IDE7CisKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHJlbW90ZV9hbGxvYyA9PT09PT09PQorICovCitzdGF0aWMgaW50IHJlbW90ZV9hbGxvYyh2b2lkICoqcmVmLCB1MTYgbWVtX3NlY3QsIHUzMiBzaXplLAorCQkJICAgICAgIHUzMiBhbGlnbiwgdTMyICpkc3BfYWRkcmVzcywKKwkJCSAgICAgICBzMzIgc2VnbW50X2lkLCBzMzIgcmVxLAorCQkJICAgICAgIGJvb2wgcmVzZXJ2ZSkKK3sKKwlzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpobm9kZSA9IChzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICopcmVmOworCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmo7CisJc3RydWN0IHJtbV90YXJnZXRfb2JqICpybW07CisJdTE2IG1lbV9waGFzZV9iaXQgPSBNQVhGTEFHUzsKKwl1MTYgc2VnaWQgPSAwOworCXUxNiBpOworCXUxNiBtZW1fc2VjdF90eXBlOworCXUzMiB3b3JkX3NpemU7CisJc3RydWN0IHJtbV9hZGRyICpybW1fYWRkcl9vYmogPSAoc3RydWN0IHJtbV9hZGRyICopZHNwX2FkZHJlc3M7CisJYm9vbCBtZW1fbG9hZF9yZXEgPSBmYWxzZTsKKwlpbnQgc3RhdHVzID0gLUVOT01FTTsJLyogU2V0IHRvIGZhaWwgKi8KKwlEQkNfUkVRVUlSRShobm9kZSk7CisJREJDX1JFUVVJUkUobWVtX3NlY3QgPT0gREJMTF9DT0RFIHx8IG1lbV9zZWN0ID09IERCTExfREFUQSB8fAorCQkgICAgbWVtX3NlY3QgPT0gREJMTF9CU1MpOworCW5sZHJfb2JqID0gaG5vZGUtPm5sZHJfb2JqOworCXJtbSA9IG5sZHJfb2JqLT5ybW07CisJLyogQ29udmVydCBzaXplIHRvIERTUCB3b3JkcyAqLworCXdvcmRfc2l6ZSA9CisJICAgIChzaXplICsgbmxkcl9vYmotPnVzX2RzcF93b3JkX3NpemUgLQorCSAgICAgMSkgLyBubGRyX29iai0+dXNfZHNwX3dvcmRfc2l6ZTsKKwkvKiBNb2RpZnkgbWVtb3J5ICdhbGlnbicgdG8gYWNjb3VudCBmb3IgRFNQIGNhY2hlIGxpbmUgc2l6ZSAqLworCWFsaWduID0gZmluZF9sY20oR0VNX0NBQ0hFX0xJTkVfU0laRSwgYWxpZ24pOworCWRldl9kYmcoYnJpZGdlLCAiJXM6IG1lbW9yeSBhbGlnbiB0byAweCV4XG4iLCBfX2Z1bmNfXywgYWxpZ24pOworCWlmIChzZWdtbnRfaWQgIT0gLTEpIHsKKwkJcm1tX2FkZHJfb2JqLT5zZWdpZCA9IHNlZ21udF9pZDsKKwkJc2VnaWQgPSBzZWdtbnRfaWQ7CisJCW1lbV9sb2FkX3JlcSA9IHJlcTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGhub2RlLT5waGFzZSkgeworCQljYXNlIE5MRFJfQ1JFQVRFOgorCQkJbWVtX3BoYXNlX2JpdCA9IENSRUFURURBVEFGTEFHQklUOworCQkJYnJlYWs7CisJCWNhc2UgTkxEUl9ERUxFVEU6CisJCQltZW1fcGhhc2VfYml0ID0gREVMRVRFREFUQUZMQUdCSVQ7CisJCQlicmVhazsKKwkJY2FzZSBOTERSX0VYRUNVVEU6CisJCQltZW1fcGhhc2VfYml0ID0gRVhFQ1VURURBVEFGTEFHQklUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkNfQVNTRVJUKGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChtZW1fc2VjdCA9PSBEQkxMX0NPREUpCisJCQltZW1fcGhhc2VfYml0Kys7CisKKwkJaWYgKG1lbV9waGFzZV9iaXQgPCBNQVhGTEFHUykKKwkJCXNlZ2lkID0gaG5vZGUtPnNlZ19pZFttZW1fcGhhc2VfYml0XTsKKworCQkvKiBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBtZW1vcnkgbG9hZGluZyByZXF1aXJlbWVudCAqLworCQlpZiAoKGhub2RlLT5jb2RlX2RhdGFfZmxhZ19tYXNrID4+IG1lbV9waGFzZV9iaXQpICYgMHgxKQorCQkJbWVtX2xvYWRfcmVxID0gdHJ1ZTsKKworCX0KKwltZW1fc2VjdF90eXBlID0gKG1lbV9zZWN0ID09IERCTExfQ09ERSkgPyBEWU5NX0NPREUgOiBEWU5NX0RBVEE7CisKKwkvKiBGaW5kIGFuIGFwcHJvcHJpYXRlIHNlZ21lbnQgYmFzZWQgb24gbWVtX3NlY3QgKi8KKwlpZiAoc2VnaWQgPT0gTlVMTElEKSB7CisJCS8qIE5vIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgcHJlZmVyZW5jZXMgKi8KKwkJREJDX0FTU0VSVCghbWVtX2xvYWRfcmVxKTsKKwkJZ290byBmdW5jX2NvbnQ7CisJfQorCWlmIChzZWdpZCA8PSBNQVhTRUdJRCkgeworCQlEQkNfQVNTRVJUKHNlZ2lkIDwgbmxkcl9vYmotPmRsb2FkX3NlZ3MpOworCQkvKiBBdHRlbXB0IHRvIGFsbG9jYXRlIGZyb20gc2VnaWQgZmlyc3QuICovCisJCXJtbV9hZGRyX29iai0+c2VnaWQgPSBzZWdpZDsKKwkJc3RhdHVzID0KKwkJICAgIHJtbV9hbGxvYyhybW0sIHNlZ2lkLCB3b3JkX3NpemUsIGFsaWduLCBkc3BfYWRkcmVzcywgZmFsc2UpOworCQlpZiAoc3RhdHVzKSB7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBVbmFibGUgYWxsb2NhdGUgZnJvbSBzZWdtZW50ICVkXG4iLAorCQkJCV9fZnVuY19fLCBzZWdpZCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzZWdpZCA+IE1BWFNFR0lEID09PiBJbnRlcm5hbCBvciBleHRlcm5hbCBtZW1vcnkgKi8KKwkJREJDX0FTU0VSVChzZWdpZCA9PSBNRU1JTlRFUk5BTElEIHx8IHNlZ2lkID09IE1FTUVYVEVSTkFMSUQpOworCQkvKiAgQ2hlY2sgZm9yIGFueSBpbnRlcm5hbCBvciBleHRlcm5hbCBtZW1vcnkgc2VnbWVudCwKKwkJICogIGRlcGVuZGluZyBvbiBzZWdpZC4gKi8KKwkJbWVtX3NlY3RfdHlwZSB8PSBzZWdpZCA9PSBNRU1JTlRFUk5BTElEID8KKwkJICAgIERZTk1fSU5URVJOQUwgOiBEWU5NX0VYVEVSTkFMOworCQlmb3IgKGkgPSAwOyBpIDwgbmxkcl9vYmotPmRsb2FkX3NlZ3M7IGkrKykgeworCQkJaWYgKChubGRyX29iai0+c2VnX3RhYmxlW2ldICYgbWVtX3NlY3RfdHlwZSkgIT0KKwkJCSAgICBtZW1fc2VjdF90eXBlKQorCQkJCWNvbnRpbnVlOworCisJCQlzdGF0dXMgPSBybW1fYWxsb2Mocm1tLCBpLCB3b3JkX3NpemUsIGFsaWduLAorCQkJCQlkc3BfYWRkcmVzcywgZmFsc2UpOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQkvKiBTYXZlIHNlZ2lkIGZvciBmcmVlaW5nIGxhdGVyICovCisJCQkJcm1tX2FkZHJfb2JqLT5zZWdpZCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CitmdW5jX2NvbnQ6CisJLyogSGF2ZW4ndCBmb3VuZCBtZW1vcnkgeWV0LCBhdHRlbXB0IHRvIGZpbmQgYW55IHNlZ21lbnQgdGhhdCB3b3JrcyAqLworCWlmIChzdGF0dXMgPT0gLUVOT01FTSAmJiAhbWVtX2xvYWRfcmVxKSB7CisJCWRldl9kYmcoYnJpZGdlLCAiJXM6IFByZWZlcnJlZCBzZWdtZW50IHVuYXZhaWxhYmxlLCB0cnlpbmcgIgorCQkJImFub3RoZXJcbiIsIF9fZnVuY19fKTsKKwkJZm9yIChpID0gMDsgaSA8IG5sZHJfb2JqLT5kbG9hZF9zZWdzOyBpKyspIHsKKwkJCS8qIEFsbCBiaXRzIG9mIG1lbV9zZWN0X3R5cGUgbXVzdCBiZSBzZXQgKi8KKwkJCWlmICgobmxkcl9vYmotPnNlZ190YWJsZVtpXSAmIG1lbV9zZWN0X3R5cGUpICE9CisJCQkgICAgbWVtX3NlY3RfdHlwZSkKKwkJCQljb250aW51ZTsKKworCQkJc3RhdHVzID0gcm1tX2FsbG9jKHJtbSwgaSwgd29yZF9zaXplLCBhbGlnbiwKKwkJCQkJICAgZHNwX2FkZHJlc3MsIGZhbHNlKTsKKwkJCWlmICghc3RhdHVzKSB7CisJCQkJLyogU2F2ZSBzZWdpZCAqLworCQkJCXJtbV9hZGRyX29iai0+c2VnaWQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCByZW1vdGVfZnJlZSh2b2lkICoqcmVmLCB1MTYgc3BhY2UsIHUzMiBkc3BfYWRkcmVzcywKKwkJCSAgICAgIHUzMiBzaXplLCBib29sIHJlc2VydmUpCit7CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiA9IChzdHJ1Y3Qgbmxkcl9vYmplY3QgKilyZWY7CisJc3RydWN0IHJtbV90YXJnZXRfb2JqICpybW07CisJdTMyIHdvcmRfc2l6ZTsKKwlpbnQgc3RhdHVzID0gLUVOT01FTTsJLyogU2V0IHRvIGZhaWwgKi8KKworCURCQ19SRVFVSVJFKG5sZHJfb2JqKTsKKworCXJtbSA9IG5sZHJfb2JqLT5ybW07CisKKwkvKiBDb252ZXJ0IHNpemUgdG8gRFNQIHdvcmRzICovCisJd29yZF9zaXplID0KKwkgICAgKHNpemUgKyBubGRyX29iai0+dXNfZHNwX3dvcmRfc2l6ZSAtCisJICAgICAxKSAvIG5sZHJfb2JqLT51c19kc3Bfd29yZF9zaXplOworCisJaWYgKHJtbV9mcmVlKHJtbSwgc3BhY2UsIGRzcF9hZGRyZXNzLCB3b3JkX3NpemUsIHJlc2VydmUpKQorCQlzdGF0dXMgPSAwOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSB1bmxvYWRfbGliID09PT09PT09CisgKi8KK3N0YXRpYyB2b2lkIHVubG9hZF9saWIoc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iaiwKKwkJICAgICAgIHN0cnVjdCBsaWJfbm9kZSAqcm9vdCkKK3sKKwlzdHJ1Y3QgZGJsbF9hdHRycyBuZXdfYXR0cnM7CisJc3RydWN0IG5sZHJfb2JqZWN0ICpubGRyX29iaiA9IG5sZHJfbm9kZV9vYmotPm5sZHJfb2JqOworCXUxNiBpOworCisJREJDX0FTU0VSVChyb290ICE9IE5VTEwpOworCisJLyogVW5sb2FkIGRlcGVuZGVudCBsaWJyYXJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcm9vdC0+ZGVwX2xpYnM7IGkrKykKKwkJdW5sb2FkX2xpYihubGRyX25vZGVfb2JqLCAmcm9vdC0+ZGVwX2xpYnNfdHJlZVtpXSk7CisKKwlyb290LT5kZXBfbGlicyA9IDA7CisKKwluZXdfYXR0cnMgPSBubGRyX29iai0+bGRyX2F0dHJzOworCW5ld19hdHRycy5ybW1faGFuZGxlID0gbmxkcl9vYmotPnJtbTsKKwluZXdfYXR0cnMuaW5wdXRfcGFyYW1zID0gbmxkcl9ub2RlX29iai0+cHJpdl9yZWY7CisJbmV3X2F0dHJzLmJhc2VfaW1hZ2UgPSBmYWxzZTsKKwluZXdfYXR0cnMuc3ltX2FyZyA9IHJvb3Q7CisKKwlpZiAocm9vdC0+bGliKSB7CisJCS8qIFVubG9hZCB0aGUgcm9vdCBsaWJyYXJ5ICovCisJCW5sZHJfb2JqLT5sZHJfZnhucy51bmxvYWRfZnhuKHJvb3QtPmxpYiwgJm5ld19hdHRycyk7CisJCW5sZHJfb2JqLT5sZHJfZnhucy5jbG9zZV9meG4ocm9vdC0+bGliKTsKKwl9CisKKwkvKiBGcmVlIGRlcGVuZGVudCBsaWJyYXJ5IGxpc3QgKi8KKwlrZnJlZShyb290LT5kZXBfbGlic190cmVlKTsKKwlyb290LT5kZXBfbGlic190cmVlID0gTlVMTDsKK30KKworLyoKKyAqICA9PT09PT09PSB1bmxvYWRfb3ZseSA9PT09PT09PQorICovCitzdGF0aWMgdm9pZCB1bmxvYWRfb3ZseShzdHJ1Y3Qgbmxkcl9ub2Rlb2JqZWN0ICpubGRyX25vZGVfb2JqLAorCQkJZW51bSBubGRyX3BoYXNlIHBoYXNlKQoreworCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmogPSBubGRyX25vZGVfb2JqLT5ubGRyX29iajsKKwlzdHJ1Y3Qgb3ZseV9ub2RlICpwb19ub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgb3ZseV9zZWN0ICpwaGFzZV9zZWN0cyA9IE5VTEw7CisJc3RydWN0IG92bHlfc2VjdCAqb3RoZXJfc2VjdHNfbGlzdCA9IE5VTEw7CisJdTE2IGk7CisJdTE2IGFsbG9jX251bSA9IDA7CisJdTE2IG90aGVyX2FsbG9jID0gMDsKKwl1MTYgKnJlZl9jb3VudCA9IE5VTEw7CisJdTE2ICpvdGhlcl9yZWYgPSBOVUxMOworCisJLyogRmluZCB0aGUgbm9kZSBpbiB0aGUgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmxkcl9vYmotPm92bHlfbm9kZXM7IGkrKykgeworCQlpZiAoaXNfZXF1YWxfdXVpZAorCQkgICAgKCZubGRyX25vZGVfb2JqLT51dWlkLCAmbmxkcl9vYmotPm92bHlfdGFibGVbaV0udXVpZCkpIHsKKwkJCS8qIEZvdW5kIGl0ICovCisJCQlwb19ub2RlID0gJihubGRyX29iai0+b3ZseV90YWJsZVtpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCURCQ19BU1NFUlQoaSA8IG5sZHJfb2JqLT5vdmx5X25vZGVzKTsKKworCWlmICghcG9fbm9kZSkKKwkJLyogVE9ETzogU2hvdWxkIHdlIHByaW50IHdhcm5pbmcgaGVyZT8gKi8KKwkJcmV0dXJuOworCisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgTkxEUl9DUkVBVEU6CisJCXJlZl9jb3VudCA9ICYocG9fbm9kZS0+Y3JlYXRlX3JlZik7CisJCXBoYXNlX3NlY3RzID0gcG9fbm9kZS0+Y3JlYXRlX3NlY3RzX2xpc3Q7CisJCWFsbG9jX251bSA9IHBvX25vZGUtPmNyZWF0ZV9zZWN0czsKKwkJYnJlYWs7CisJY2FzZSBOTERSX0VYRUNVVEU6CisJCXJlZl9jb3VudCA9ICYocG9fbm9kZS0+ZXhlY3V0ZV9yZWYpOworCQlwaGFzZV9zZWN0cyA9IHBvX25vZGUtPmV4ZWN1dGVfc2VjdHNfbGlzdDsKKwkJYWxsb2NfbnVtID0gcG9fbm9kZS0+ZXhlY3V0ZV9zZWN0czsKKwkJYnJlYWs7CisJY2FzZSBOTERSX0RFTEVURToKKwkJcmVmX2NvdW50ID0gJihwb19ub2RlLT5kZWxldGVfcmVmKTsKKwkJb3RoZXJfcmVmID0gJihwb19ub2RlLT5vdGhlcl9yZWYpOworCQlwaGFzZV9zZWN0cyA9IHBvX25vZGUtPmRlbGV0ZV9zZWN0c19saXN0OworCQkvKiAnT3RoZXInIG92ZXJsYXkgc2VjdGlvbnMgYXJlIHVubG9hZGVkIGluIHRoZSBkZWxldGUgcGhhc2UgKi8KKwkJb3RoZXJfc2VjdHNfbGlzdCA9IHBvX25vZGUtPm90aGVyX3NlY3RzX2xpc3Q7CisJCWFsbG9jX251bSA9IHBvX25vZGUtPmRlbGV0ZV9zZWN0czsKKwkJb3RoZXJfYWxsb2MgPSBwb19ub2RlLT5vdGhlcl9zZWN0czsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJDX0FTU0VSVChmYWxzZSk7CisJCWJyZWFrOworCX0KKwlEQkNfQVNTRVJUKHJlZl9jb3VudCAmJiAoKnJlZl9jb3VudCA+IDApKTsKKwlpZiAocmVmX2NvdW50ICYmICgqcmVmX2NvdW50ID4gMCkpIHsKKwkJKnJlZl9jb3VudCAtPSAxOworCQlpZiAob3RoZXJfcmVmKSB7CisJCQlEQkNfQVNTRVJUKCpvdGhlcl9yZWYgPiAwKTsKKwkJCSpvdGhlcl9yZWYgLT0gMTsKKwkJfQorCX0KKworCWlmIChyZWZfY291bnQgJiYgKnJlZl9jb3VudCA9PSAwKSB7CisJCS8qICdEZWFsbG9jYXRlJyBtZW1vcnkgKi8KKwkJZnJlZV9zZWN0cyhubGRyX29iaiwgcGhhc2Vfc2VjdHMsIGFsbG9jX251bSk7CisJfQorCWlmIChvdGhlcl9yZWYgJiYgKm90aGVyX3JlZiA9PSAwKQorCQlmcmVlX3NlY3RzKG5sZHJfb2JqLCBvdGhlcl9zZWN0c19saXN0LCBvdGhlcl9hbGxvYyk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZmluZF9pbl9wZXJzaXN0ZW50X2xpYl9hcnJheSA9PT09PT09PQorICovCitzdGF0aWMgYm9vbCBmaW5kX2luX3BlcnNpc3RlbnRfbGliX2FycmF5KHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCisJCQkJCSBzdHJ1Y3QgZGJsbF9saWJyYXJ5X29iaiAqbGliKQoreworCXMzMiBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBubGRyX25vZGVfb2JqLT5wZXJzX2xpYnM7IGkrKykgeworCQlpZiAobGliID09IG5sZHJfbm9kZV9vYmotPnBlcnNfbGliX3RhYmxlW2ldLmxpYikKKwkJCXJldHVybiB0cnVlOworCisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogPT09PT09PT09PT09PT09PSBGaW5kIExDTSAoTGVhc3QgQ29tbW9uIE11bHRpcGxpZXIgPT09CisgKi8KK3N0YXRpYyB1MzIgZmluZF9sY20odTMyIGEsIHUzMiBiKQoreworCXUzMiByZXQ7CisKKwlyZXQgPSBhICogYiAvIGdjZChhLCBiKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCisvKioKKyAqIG5sZHJfZmluZF9hZGRyKCkgLSBGaW5kIHRoZSBjbG9zZXN0IHN5bWJvbCB0byB0aGUgZ2l2ZW4gYWRkcmVzcyBiYXNlZCBvbgorICoJCWR5bmFtaWMgbm9kZSBvYmplY3QuCisgKgorICogQG5sZHJfbm9kZToJCUR5bmFtaWMgbm9kZSBvYmplY3QKKyAqIEBzeW1fYWRkcjoJCUdpdmVuIGFkZHJlc3MgdG8gZmluZCB0aGUgZHNwIHN5bWJvbAorICogQG9mZnNldF9yYW5nZToJCW9mZnNldCByYW5nZSB0byBsb29rIGZvciBkc3Agc3ltYm9sCisgKiBAb2Zmc2V0X291dHB1dDoJCVN5bWJvbCBPdXRwdXQgYWRkcmVzcworICogQHN5bV9uYW1lOgkJU3RyaW5nIHdpdGggdGhlIGRzcCBzeW1ib2wKKyAqCisgKiAJVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbm9kZSBsaWJyYXJ5IGZvciBhIGdpdmVuIGFkZHJlc3MgYW5kCisgKglyZXRyaWV2ZXMgdGhlIGRzcCBzeW1ib2wgYnkgY2FsbGluZyBkYmxsX2ZpbmRfZHNwX3N5bWJvbC4KKyAqLworaW50IG5sZHJfZmluZF9hZGRyKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZSwgdTMyIHN5bV9hZGRyLAorCQkJdTMyIG9mZnNldF9yYW5nZSwgdm9pZCAqb2Zmc2V0X291dHB1dCwgY2hhciAqc3ltX25hbWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJYm9vbCBzdGF0dXMxID0gZmFsc2U7CisJczMyIGkgPSAwOworCXN0cnVjdCBsaWJfbm9kZSByb290ID0geyBOVUxMLCAwLCBOVUxMIH07CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG9mZnNldF9vdXRwdXQgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoc3ltX25hbWUgIT0gTlVMTCk7CisJcHJfZGVidWcoIiVzKDB4JXgsIDB4JXgsIDB4JXgsIDB4JXgsICAlcylcbiIsIF9fZnVuY19fLCAodTMyKSBubGRyX25vZGUsCisJCQlzeW1fYWRkciwgb2Zmc2V0X3JhbmdlLCAodTMyKSBvZmZzZXRfb3V0cHV0LCBzeW1fbmFtZSk7CisKKwlpZiAobmxkcl9ub2RlLT5keW5hbWljICYmICpubGRyX25vZGUtPnBmX3BoYXNlX3NwbGl0KSB7CisJCXN3aXRjaCAobmxkcl9ub2RlLT5waGFzZSkgeworCQljYXNlIE5MRFJfQ1JFQVRFOgorCQkJcm9vdCA9IG5sZHJfbm9kZS0+Y3JlYXRlX2xpYjsKKwkJCWJyZWFrOworCQljYXNlIE5MRFJfRVhFQ1VURToKKwkJCXJvb3QgPSBubGRyX25vZGUtPmV4ZWN1dGVfbGliOworCQkJYnJlYWs7CisJCWNhc2UgTkxEUl9ERUxFVEU6CisJCQlyb290ID0gbmxkcl9ub2RlLT5kZWxldGVfbGliOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkNfQVNTRVJUKGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZm9yIE92ZXJsYXkgbm9kZXMgb3Igbm9uLXNwbGl0IER5bmFtaWMgbm9kZXMgKi8KKwkJcm9vdCA9IG5sZHJfbm9kZS0+cm9vdDsKKwl9CisKKwlzdGF0dXMxID0gZGJsbF9maW5kX2RzcF9zeW1ib2wocm9vdC5saWIsIHN5bV9hZGRyLAorCQkJb2Zmc2V0X3JhbmdlLCBvZmZzZXRfb3V0cHV0LCBzeW1fbmFtZSk7CisKKwkvKiBJZiBzeW1ib2wgbm90IGZvdW5kLCBjaGVjayBkZXBlbmRlbnQgbGlicmFyaWVzICovCisJaWYgKCFzdGF0dXMxKQorCQlmb3IgKGkgPSAwOyBpIDwgcm9vdC5kZXBfbGliczsgaSsrKSB7CisJCQlzdGF0dXMxID0gZGJsbF9maW5kX2RzcF9zeW1ib2woCisJCQkJcm9vdC5kZXBfbGlic190cmVlW2ldLmxpYiwgc3ltX2FkZHIsCisJCQkJb2Zmc2V0X3JhbmdlLCBvZmZzZXRfb3V0cHV0LCBzeW1fbmFtZSk7CisJCQlpZiAoc3RhdHVzMSkKKwkJCQkvKiBTeW1ib2wgZm91bmQgKi8KKwkJCQlicmVhazsKKwkJfQorCS8qIENoZWNrIHBlcnNpc3RlbnQgbGlicmFyaWVzICovCisJaWYgKCFzdGF0dXMxKQorCQlmb3IgKGkgPSAwOyBpIDwgbmxkcl9ub2RlLT5wZXJzX2xpYnM7IGkrKykgeworCQkJc3RhdHVzMSA9IGRibGxfZmluZF9kc3Bfc3ltYm9sKAorCQkJCW5sZHJfbm9kZS0+cGVyc19saWJfdGFibGVbaV0ubGliLCBzeW1fYWRkciwKKwkJCQlvZmZzZXRfcmFuZ2UsIG9mZnNldF9vdXRwdXQsIHN5bV9uYW1lKTsKKwkJCWlmIChzdGF0dXMxKQorCQkJCS8qIFN5bWJvbCBmb3VuZCAqLworCQkJCWJyZWFrOworCQl9CisKKwlpZiAoIXN0YXR1czEpIHsKKwkJcHJfZGVidWcoIiVzOiBBZGRyZXNzIDB4JXggbm90IGZvdW5kIGluIHJhbmdlICVkLlxuIiwKKwkJCQkJX19mdW5jX18sIHN5bV9hZGRyLCBvZmZzZXRfcmFuZ2UpOworCQlzdGF0dXMgPSAtRVNQSVBFOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTk0NDFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbm9kZS5jCkBAIC0wLDAgKzEsMzIzNCBAQAorLyoKKyAqIG5vZGUuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBEU1AvQklPUyBCcmlkZ2UgTm9kZSBNYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhvc3QgT1MgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2xpc3QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbWVtZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9wcm9jLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3N0cm0uaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3luYy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9udGZ5Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NtbS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9jb2QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL21zZy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzb3VyY2UgTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRjZC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kaXNwLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Jtc19zaC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGluayBEcml2ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3Bpb2N0bC5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2diLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3V1aWR1dGlsLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL25vZGVwcml2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL25vZGUuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZG1tLmg+CisKKy8qIFN0YXRpYy9EeW5hbWljIExvYWRlciBpbmNsdWRlcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmxsLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL25sZHIuaD4KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnYuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2ZGVmcy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9yZXNvdXJjZWNsZWFudXAuaD4KKyNpbmNsdWRlIDxfdGlvbWFwLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwZGVoLmg+CisKKyNkZWZpbmUgSE9TVFBSRUZJWAkgICIvaG9zdCIKKyNkZWZpbmUgUElQRVBSRUZJWAkgICIvZGJwaXBlIgorCisjZGVmaW5lIE1BWF9JTlBVVFMoaCkgIFwKKwkJKChoKS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5udW1faW5wdXRfc3RyZWFtcykKKyNkZWZpbmUgTUFYX09VVFBVVFMoaCkgXAorCQkoKGgpLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLm51bV9vdXRwdXRfc3RyZWFtcykKKworI2RlZmluZSBOT0RFX0dFVF9QUklPUklUWShoKSAoKGgpLT5wcmlvKQorI2RlZmluZSBOT0RFX1NFVF9QUklPUklUWShobm9kZSwgcHJpbykgKChobm9kZSktPnByaW8gPSBwcmlvKQorI2RlZmluZSBOT0RFX1NFVF9TVEFURShobm9kZSwgc3RhdGUpICgoaG5vZGUpLT5ub2RlX3N0YXRlID0gc3RhdGUpCisKKyNkZWZpbmUgTUFYUElQRVMJMTAwCS8qIE1heCAjIG9mIC9waXBlIGNvbm5lY3Rpb25zIChDU0wgbGltaXQpICovCisjZGVmaW5lIE1BWERFVlNVRkZJWExFTiAyCS8qIE1heChMb2cgYmFzZSAxMCBvZiBNQVhQSVBFUywgTUFYU1RSRUFNUykgKi8KKworI2RlZmluZSBQSVBFTkFNRUxFTiAgICAgKHNpemVvZihQSVBFUFJFRklYKSArIE1BWERFVlNVRkZJWExFTikKKyNkZWZpbmUgSE9TVE5BTUVMRU4gICAgIChzaXplb2YoSE9TVFBSRUZJWCkgKyBNQVhERVZTVUZGSVhMRU4pCisKKyNkZWZpbmUgTUFYREVWTkFNRUxFTgkzMgkvKiBkc3BfbmRicHJvcHMuYWNfbmFtZSBzaXplICovCisjZGVmaW5lIENSRUFURVBIQVNFCTEKKyNkZWZpbmUgRVhFQ1VURVBIQVNFCTIKKyNkZWZpbmUgREVMRVRFUEhBU0UJMworCisvKiBEZWZpbmUgZGVmYXVsdCBTVFJNIHBhcmFtZXRlcnMgKi8KKy8qCisgKiAgVEJEOiBQdXQgaW4gaGVhZGVyIGZpbGUsIG1ha2UgZ2xvYmFsIERTUF9TVFJNQVRUUlMgd2l0aCBkZWZhdWx0cywKKyAqICBvciBtYWtlIGRlZmF1bHRzIGNvbmZpZ3VyYWJsZS4KKyAqLworI2RlZmluZSBERUZBVUxUQlVGU0laRQkJMzIKKyNkZWZpbmUgREVGQVVMVE5CVUZTCQkyCisjZGVmaW5lIERFRkFVTFRTRUdJRAkJMAorI2RlZmluZSBERUZBVUxUQUxJR05NRU5UCTAKKyNkZWZpbmUgREVGQVVMVFRJTUVPVVQJCTEwMDAwCisKKyNkZWZpbmUgUk1TUVVFUllTRVJWRVIJCTAKKyNkZWZpbmUgUk1TQ09ORklHVVJFU0VSVkVSCTEKKyNkZWZpbmUgUk1TQ1JFQVRFTk9ERQkJMgorI2RlZmluZSBSTVNFWEVDVVRFTk9ERQkJMworI2RlZmluZSBSTVNERUxFVEVOT0RFCQk0CisjZGVmaW5lIFJNU0NIQU5HRU5PREVQUklPUklUWQk1CisjZGVmaW5lIFJNU1JFQURNRU1PUlkJCTYKKyNkZWZpbmUgUk1TV1JJVEVNRU1PUlkJCTcKKyNkZWZpbmUgUk1TQ09QWQkJCTgKKyNkZWZpbmUgTUFYVElNRU9VVAkJMjAwMAorCisjZGVmaW5lIE5VTVJNU0ZYTlMJCTkKKworI2RlZmluZSBQV1JfVElNRU9VVAkJNTAwCS8qIGRlZmF1bHQgUFdSIHRpbWVvdXQgaW4gbXNlYyAqLworCisjZGVmaW5lIFNUQUNLU0VHTEFCRUwgIkwxRFNSQU1fSEVBUCIJLyogTGFiZWwgZm9yIERTUCBTdGFjayBTZWdtZW50IEFkZHIgKi8KKworLyoKKyAqICA9PT09PT09PSBub2RlX21nciA9PT09PT09PQorICovCitzdHJ1Y3Qgbm9kZV9tZ3IgeworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iajsJLyogRGV2aWNlIG9iamVjdCAqLworCS8qIEZ1bmN0aW9uIGludGVyZmFjZSB0byBCcmlkZ2UgZHJpdmVyICovCisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21ncjsJLyogUHJvYy9Ob2RlIGRhdGEgbWFuYWdlciAqLworCXN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmo7CS8qIE5vZGUgZGlzcGF0Y2hlciAqLworCXN0cnVjdCBsc3RfbGlzdCAqbm9kZV9saXN0OwkvKiBMaXN0IG9mIGFsbCBhbGxvY2F0ZWQgbm9kZXMgKi8KKwl1MzIgbnVtX25vZGVzOwkJLyogTnVtYmVyIG9mIG5vZGVzIGluIG5vZGVfbGlzdCAqLworCXUzMiBudW1fY3JlYXRlZDsJLyogTnVtYmVyIG9mIG5vZGVzICpjcmVhdGVkKiBvbiBEU1AgKi8KKwlzdHJ1Y3QgZ2JfdF9tYXAgKnBpcGVfbWFwOwkvKiBQaXBlIGNvbm5lY3Rpb24gYml0IG1hcCAqLworCXN0cnVjdCBnYl90X21hcCAqcGlwZV9kb25lX21hcDsJLyogUGlwZXMgdGhhdCBhcmUgaGFsZiBmcmVlICovCisJc3RydWN0IGdiX3RfbWFwICpjaG5sX21hcDsJLyogQ2hhbm5lbCBhbGxvY2F0aW9uIGJpdCBtYXAgKi8KKwlzdHJ1Y3QgZ2JfdF9tYXAgKmRtYV9jaG5sX21hcDsJLyogRE1BIENoYW5uZWwgYWxsb2NhdGlvbiBiaXQgbWFwICovCisJc3RydWN0IGdiX3RfbWFwICp6Y19jaG5sX21hcDsJLyogWmVyby1Db3B5IENoYW5uZWwgYWxsb2MgYml0IG1hcCAqLworCXN0cnVjdCBudGZ5X29iamVjdCAqbnRmeV9vYmo7CS8qIE1hbmFnZXMgcmVnaXN0ZXJlZCBub3RpZmljYXRpb25zICovCisJc3RydWN0IG11dGV4IG5vZGVfbWdyX2xvY2s7CS8qIEZvciBjcml0aWNhbCBzZWN0aW9ucyAqLworCXUzMiB1bF9meG5fYWRkcnNbTlVNUk1TRlhOU107CS8qIFJNUyBmdW5jdGlvbiBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgbXNnX21nciAqbXNnX21ncl9vYmo7CisKKwkvKiBQcm9jZXNzb3IgcHJvcGVydGllcyBuZWVkZWQgYnkgTm9kZSBEaXNwYXRjaGVyICovCisJdTMyIHVsX251bV9jaG5sczsJLyogVG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovCisJdTMyIHVsX2Nobmxfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgY2hubCBpZHMgcnN2ZCBmb3IgUk1TICovCisJdTMyIHVsX2NobmxfYnVmX3NpemU7CS8qIEJ1ZmZlciBzaXplIGZvciBkYXRhIHRvIFJNUyAqLworCWludCBwcm9jX2ZhbWlseTsJLyogZWcsIDUwMDAgKi8KKwlpbnQgcHJvY190eXBlOwkJLyogZWcsIDU1MTAgKi8KKwl1MzIgdWRzcF93b3JkX3NpemU7CS8qIFNpemUgb2YgRFNQIHdvcmQgb24gaG9zdCBieXRlcyAqLworCXUzMiB1ZHNwX2RhdGFfbWF1X3NpemU7CS8qIFNpemUgb2YgRFNQIGRhdGEgTUFVICovCisJdTMyIHVkc3BfbWF1X3NpemU7CS8qIFNpemUgb2YgTUFVICovCisJczMyIG1pbl9wcmk7CQkvKiBNaW5pbXVtIHJ1bnRpbWUgcHJpb3JpdHkgZm9yIG5vZGUgKi8KKwlzMzIgbWF4X3ByaTsJCS8qIE1heGltdW0gcnVudGltZSBwcmlvcml0eSBmb3Igbm9kZSAqLworCisJc3RydWN0IHN0cm1fbWdyICpzdHJtX21ncl9vYmo7CS8qIFNUUk0gbWFuYWdlciAqLworCisJLyogTG9hZGVyIHByb3BlcnRpZXMgKi8KKwlzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHJfb2JqOwkvKiBIYW5kbGUgdG8gbG9hZGVyICovCisJc3RydWN0IG5vZGVfbGRyX2Z4bnMgbmxkcl9meG5zOwkvKiBIYW5kbGUgdG8gbG9hZGVyIGZ1bmN0aW9ucyAqLworCWJvb2wgbG9hZGVyX2luaXQ7CS8qIExvYWRlciBJbml0IGZ1bmN0aW9uIHN1Y2NlZWRlZD8gKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gY29ubmVjdHR5cGUgPT09PT09PT0KKyAqLworZW51bSBjb25uZWN0dHlwZSB7CisJTk9UQ09OTkVDVEVEID0gMCwKKwlOT0RFQ09OTkVDVCwKKwlIT1NUQ09OTkVDVCwKKwlERVZJQ0VDT05ORUNULAorfTsKKworLyoKKyAqICA9PT09PT09PSBzdHJlYW1fY2hubCA9PT09PT09PQorICovCitzdHJ1Y3Qgc3RyZWFtX2NobmwgeworCWVudW0gY29ubmVjdHR5cGUgdHlwZTsJLyogVHlwZSBvZiBzdHJlYW0gY29ubmVjdGlvbiAqLworCXUzMiBkZXZfaWQ7CQkvKiBwaXBlIG9yIGNoYW5uZWwgaWQgKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9vYmplY3QgPT09PT09PT0KKyAqLworc3RydWN0IG5vZGVfb2JqZWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZWxlbTsKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21ncjsJLyogVGhlIG1hbmFnZXIgb2YgdGhpcyBub2RlICovCisJc3RydWN0IHByb2Nfb2JqZWN0ICpocHJvY2Vzc29yOwkvKiBCYWNrIHBvaW50ZXIgdG8gcHJvY2Vzc29yICovCisJc3RydWN0IGRzcF91dWlkIG5vZGVfdXVpZDsJLyogTm9kZSdzIElEICovCisJczMyIHByaW87CQkvKiBOb2RlJ3MgY3VycmVudCBwcmlvcml0eSAqLworCXUzMiB1dGltZW91dDsJCS8qIFRpbWVvdXQgZm9yIGJsb2NraW5nIE5PREUgY2FsbHMgKi8KKwl1MzIgaGVhcF9zaXplOwkJLyogSGVhcCBTaXplICovCisJdTMyIHVkc3BfaGVhcF92aXJ0X2FkZHI7CS8qIEhlYXAgU2l6ZSAqLworCXUzMiB1Z3BwX2hlYXBfdmlydF9hZGRyOwkvKiBIZWFwIFNpemUgKi8KKwllbnVtIG5vZGVfdHlwZSBudHlwZTsJLyogVHlwZSBvZiBub2RlOiBtZXNzYWdlLCB0YXNrLCBldGMgKi8KKwllbnVtIG5vZGVfc3RhdGUgbm9kZV9zdGF0ZTsJLyogTk9ERV9BTExPQ0FURUQsIE5PREVfQ1JFQVRFRCwgLi4uICovCisJdTMyIG51bV9pbnB1dHM7CQkvKiBDdXJyZW50IG51bWJlciBvZiBpbnB1dHMgKi8KKwl1MzIgbnVtX291dHB1dHM7CS8qIEN1cnJlbnQgbnVtYmVyIG9mIG91dHB1dHMgKi8KKwl1MzIgbWF4X2lucHV0X2luZGV4OwkvKiBDdXJyZW50IG1heCBpbnB1dCBzdHJlYW0gaW5kZXggKi8KKwl1MzIgbWF4X291dHB1dF9pbmRleDsJLyogQ3VycmVudCBtYXggb3V0cHV0IHN0cmVhbSBpbmRleCAqLworCXN0cnVjdCBzdHJlYW1fY2hubCAqaW5wdXRzOwkvKiBOb2RlJ3MgaW5wdXQgc3RyZWFtcyAqLworCXN0cnVjdCBzdHJlYW1fY2hubCAqb3V0cHV0czsJLyogTm9kZSdzIG91dHB1dCBzdHJlYW1zICovCisJc3RydWN0IG5vZGVfY3JlYXRlYXJncyBjcmVhdGVfYXJnczsJLyogQXJncyBmb3Igbm9kZSBjcmVhdGUgZnVuYyAqLworCW5vZGVlbnYgbm9kZV9lbnY7CS8qIEVudmlyb25tZW50IHJldHVybmVkIGJ5IFJNUyAqLworCXN0cnVjdCBkY2RfZ2VuZXJpY29iaiBkY2RfcHJvcHM7CS8qIE5vZGUgcHJvcGVydGllcyBmcm9tIERDRCAqLworCXN0cnVjdCBkc3BfY2JkYXRhICpwYXJnczsJLyogT3B0aW9uYWwgYXJncyB0byBwYXNzIHRvIG5vZGUgKi8KKwlzdHJ1Y3QgbnRmeV9vYmplY3QgKm50Znlfb2JqOwkvKiBNYW5hZ2VzIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9ucyAqLworCWNoYXIgKnBzdHJfZGV2X25hbWU7CS8qIGRldmljZSBuYW1lLCBpZiBkZXZpY2Ugbm9kZSAqLworCXN0cnVjdCBzeW5jX29iamVjdCAqc3luY19kb25lOwkvKiBTeW5jaHJvbml6ZSBub2RlX3Rlcm1pbmF0ZSAqLworCXMzMiBleGl0X3N0YXR1czsJLyogZXhlY3V0ZSBmdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCisKKwkvKiBJbmZvcm1hdGlvbiBuZWVkZWQgZm9yIG5vZGVfZ2V0X2F0dHIoKSAqLworCXZvaWQgKmRldmljZV9vd25lcjsJLyogSWYgZGV2IG5vZGUsIHRhc2sgdGhhdCBvd25zIGl0ICovCisJdTMyIG51bV9ncHBfaW5wdXRzOwkvKiBDdXJyZW50ICMgb2YgZnJvbSBHUFAgc3RyZWFtcyAqLworCXUzMiBudW1fZ3BwX291dHB1dHM7CS8qIEN1cnJlbnQgIyBvZiB0byBHUFAgc3RyZWFtcyAqLworCS8qIEN1cnJlbnQgc3RyZWFtIGNvbm5lY3Rpb25zICovCisJc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0ICpzdHJlYW1fY29ubmVjdDsKKworCS8qIE1lc3NhZ2UgcXVldWUgKi8KKwlzdHJ1Y3QgbXNnX3F1ZXVlICptc2dfcXVldWVfb2JqOworCisJLyogVGhlc2UgZmllbGRzIHVzZWQgZm9yIFNNIG1lc3NhZ2luZyAqLworCXN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICp4bGF0b3I7CS8qIE5vZGUncyBTTSBhZGRyIHRyYW5zbGF0b3IgKi8KKworCS8qIEhhbmRsZSB0byBwYXNzIHRvIGR5bmFtaWMgbG9hZGVyICovCisJc3RydWN0IG5sZHJfbm9kZW9iamVjdCAqbmxkcl9ub2RlX29iajsKKwlib29sIGxvYWRlZDsJCS8qIENvZGUgaXMgKGR5bmFtaWNhbGx5KSBsb2FkZWQgKi8KKwlib29sIHBoYXNlX3NwbGl0OwkvKiBQaGFzZXMgc3BsaXQgaW4gbWFueSBsaWJzIG9yIG92bHkgKi8KKworfTsKKworLyogRGVmYXVsdCBidWZmZXIgYXR0cmlidXRlcyAqLworc3RhdGljIHN0cnVjdCBkc3BfYnVmZmVyYXR0ciBub2RlX2RmbHRidWZhdHRycyA9IHsKKwkwLAkJCS8qIGNiX3N0cnVjdCAqLworCTEsCQkJLyogc2VnbWVudF9pZCAqLworCTAsCQkJLyogYnVmX2FsaWdubWVudCAqLworfTsKKworc3RhdGljIHZvaWQgZGVsZXRlX25vZGUoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpOworc3RhdGljIHZvaWQgZGVsZXRlX25vZGVfbWdyKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyKTsKK3N0YXRpYyB2b2lkIGZpbGxfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IG5vZGVfb2JqZWN0ICpub2RlMSwKKwkJCQlzdHJ1Y3Qgbm9kZV9vYmplY3QgKm5vZGUyLCB1MzIgc3RyZWFtMSwKKwkJCQl1MzIgc3RyZWFtMik7CitzdGF0aWMgdm9pZCBmaWxsX3N0cmVhbV9kZWYoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCSAgICBzdHJ1Y3Qgbm9kZV9zdHJtZGVmICpwc3RybV9kZWYsCisJCQkgICAgc3RydWN0IGRzcF9zdHJtYXR0ciAqcGF0dHJzKTsKK3N0YXRpYyB2b2lkIGZyZWVfc3RyZWFtKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyLCBzdHJ1Y3Qgc3RyZWFtX2Nobmwgc3RyZWFtKTsKK3N0YXRpYyBpbnQgZ2V0X2Z4bl9hZGRyZXNzKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHUzMiAqIGZ4bl9hZGRyLAorCQkJCSAgdTMyIHBoYXNlKTsKK3N0YXRpYyBpbnQgZ2V0X25vZGVfcHJvcHMoc3RydWN0IGRjZF9tYW5hZ2VyICpoZGNkX21nciwKKwkJCQkgc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCQkgY29uc3Qgc3RydWN0IGRzcF91dWlkICpub2RlX3V1aWQsCisJCQkJIHN0cnVjdCBkY2RfZ2VuZXJpY29iaiAqZGNkX3Byb3ApOworc3RhdGljIGludCBnZXRfcHJvY19wcm9wcyhzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21nciwKKwkJCQkgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKTsKK3N0YXRpYyBpbnQgZ2V0X3Jtc19meG5zKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyKTsKK3N0YXRpYyB1MzIgb3ZseSh2b2lkICpwcml2X3JlZiwgdTMyIGRzcF9ydW5fYWRkciwgdTMyIGRzcF9sb2FkX2FkZHIsCisJCXUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fc3BhY2UpOworc3RhdGljIHUzMiBtZW1fd3JpdGUodm9pZCAqcHJpdl9yZWYsIHUzMiBkc3BfYWRkLCB2b2lkICpwYnVmLAorCQkgICAgIHUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fc3BhY2UpOworCitzdGF0aWMgdTMyIHJlZnM7CQkvKiBtb2R1bGUgcmVmZXJlbmNlIGNvdW50ICovCisKKy8qIER5bmFtaWMgbG9hZGVyIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBzdHJ1Y3Qgbm9kZV9sZHJfZnhucyBubGRyX2Z4bnMgPSB7CisJbmxkcl9hbGxvY2F0ZSwKKwlubGRyX2NyZWF0ZSwKKwlubGRyX2RlbGV0ZSwKKwlubGRyX2V4aXQsCisJbmxkcl9nZXRfZnhuX2FkZHIsCisJbmxkcl9pbml0LAorCW5sZHJfbG9hZCwKKwlubGRyX3VubG9hZCwKK307CisKK2VudW0gbm9kZV9zdGF0ZSBub2RlX2dldF9zdGF0ZSh2b2lkICpobm9kZSkKK3sKKwlzdHJ1Y3Qgbm9kZV9vYmplY3QgKnBub2RlID0gKHN0cnVjdCBub2RlX29iamVjdCAqKWhub2RlOworCWlmICghcG5vZGUpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiBwbm9kZS0+bm9kZV9zdGF0ZTsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2FsbG9jYXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQWxsb2NhdGUgR1BQIHJlc291cmNlcyB0byBtYW5hZ2UgYSBub2RlIG9uIHRoZSBEU1AuCisgKi8KK2ludCBub2RlX2FsbG9jYXRlKHN0cnVjdCBwcm9jX29iamVjdCAqaHByb2Nlc3NvciwKKwkJCWNvbnN0IHN0cnVjdCBkc3BfdXVpZCAqbm9kZV91dWlkLAorCQkJY29uc3Qgc3RydWN0IGRzcF9jYmRhdGEgKnBhcmdzLAorCQkJY29uc3Qgc3RydWN0IGRzcF9ub2RlYXR0cmluICphdHRyX2luLAorCQkJc3RydWN0IG5vZGVfcmVzX29iamVjdCAqKm5vZGVyZXMsCisJCQlzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KQoreworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyOworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iajsKKwlzdHJ1Y3Qgbm9kZV9vYmplY3QgKnBub2RlID0gTlVMTDsKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGUgPSBOT0RFX1RBU0s7CisJc3RydWN0IG5vZGVfbXNnYXJncyAqcG1zZ19hcmdzOworCXN0cnVjdCBub2RlX3Rhc2thcmdzICpwdGFza19hcmdzOworCXUzMiBudW1fc3RyZWFtczsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgY21tX29iamVjdCAqaGNtbV9tZ3IgPSBOVUxMOwkvKiBTaGFyZWQgbWVtb3J5IG1hbmFnZXIgaG5kbCAqLworCXUzMiBwcm9jX2lkOworCXUzMiBwdWxfdmFsdWU7CisJdTMyIGR5bmV4dF9iYXNlOworCXUzMiBvZmZfc2V0ID0gMDsKKwl1MzIgdWxfc3RhY2tfc2VnX2FkZHIsIHVsX3N0YWNrX3NlZ192YWw7CisJdTMyIHVsX2dwcF9tZW1fYmFzZTsKKwlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmhvc3RfcmVzOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKnBicmlkZ2VfY29udGV4dDsKKwl1MzIgbWFwcGVkX2FkZHIgPSAwOworCXUzMiBtYXBfYXR0cnMgPSAweDA7CisJc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZSBwcm9jX3N0YXRlOworI2lmZGVmIERTUF9ETU1fREVCVUcKKwlzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21ncjsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPSAoc3RydWN0IHByb2Nfb2JqZWN0ICopaHByb2Nlc3NvcjsKKyNlbmRpZgorCisJdm9pZCAqbm9kZV9yZXM7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaHByb2Nlc3NvciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShub2RlcmVzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKG5vZGVfdXVpZCAhPSBOVUxMKTsKKworCSpub2RlcmVzID0gTlVMTDsKKworCXN0YXR1cyA9IHByb2NfZ2V0X3Byb2Nlc3Nvcl9pZChocHJvY2Vzc29yLCAmcHJvY19pZCk7CisKKwlpZiAocHJvY19pZCAhPSBEU1BfVU5JVCkKKwkJZ290byBmdW5jX2VuZDsKKworCXN0YXR1cyA9IHByb2NfZ2V0X2Rldl9vYmplY3QoaHByb2Nlc3NvciwgJmhkZXZfb2JqKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBkZXZfZ2V0X25vZGVfbWFuYWdlcihoZGV2X29iaiwgJmhub2RlX21ncik7CisJCWlmIChobm9kZV9tZ3IgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKworCX0KKworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGhkZXZfb2JqLCAmcGJyaWRnZV9jb250ZXh0KTsKKwlpZiAoIXBicmlkZ2VfY29udGV4dCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCXN0YXR1cyA9IHByb2NfZ2V0X3N0YXRlKGhwcm9jZXNzb3IsICZwcm9jX3N0YXRlLAorCQkJCXNpemVvZihzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlKSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKwkvKiBJZiBwcm9jZXNzb3IgaXMgaW4gZXJyb3Igc3RhdGUgdGhlbiBkb24ndCBhdHRlbXB0CisJICAgdG8gc2VuZCB0aGUgbWVzc2FnZSAqLworCWlmIChwcm9jX3N0YXRlLnByb2Nfc3RhdGUgPT0gUFJPQ19FUlJPUikgeworCQlzdGF0dXMgPSAtRVBFUk07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJLyogQXNzdW1pbmcgdGhhdCAwIGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uIGFkZHJlc3MgKi8KKwlpZiAoaG5vZGVfbWdyLT51bF9meG5fYWRkcnNbMF0gPT0gMCkgeworCQkvKiBObyBSTVMgb24gdGFyZ2V0IC0gd2UgY3VycmVudGx5IGNhbid0IGhhbmRsZSB0aGlzICovCisJCXByX2VycigiJXM6IEZhaWxlZCwgbm8gUk1TIGluIGJhc2UgaW1hZ2VcbiIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gLUVQRVJNOworCX0gZWxzZSB7CisJCS8qIFZhbGlkYXRlIGF0dHJfaW4gZmllbGRzLCBpZiBub24tTlVMTCAqLworCQlpZiAoYXR0cl9pbikgeworCQkJLyogQ2hlY2sgaWYgYXR0cl9pbi0+cHJpbyBpcyB3aXRoaW4gcmFuZ2UgKi8KKwkJCWlmIChhdHRyX2luLT5wcmlvIDwgaG5vZGVfbWdyLT5taW5fcHJpIHx8CisJCQkgICAgYXR0cl9pbi0+cHJpbyA+IGhub2RlX21nci0+bWF4X3ByaSkKKwkJCQlzdGF0dXMgPSAtRURPTTsKKwkJfQorCX0KKwkvKiBBbGxvY2F0ZSBub2RlIG9iamVjdCBhbmQgZmlsbCBpbiAqLworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlwbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlX29iamVjdCksIEdGUF9LRVJORUwpOworCWlmIChwbm9kZSA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCXBub2RlLT5obm9kZV9tZ3IgPSBobm9kZV9tZ3I7CisJLyogVGhpcyBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3RzIGdldF9ub2RlX3Byb3BzICovCisJbXV0ZXhfbG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKworCS8qIEdldCBkc3BfbmRicHJvcHMgZnJvbSBub2RlIGRhdGFiYXNlICovCisJc3RhdHVzID0gZ2V0X25vZGVfcHJvcHMoaG5vZGVfbWdyLT5oZGNkX21nciwgcG5vZGUsIG5vZGVfdXVpZCwKKwkJCQkmKHBub2RlLT5kY2RfcHJvcHMpKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfY29udDsKKworCXBub2RlLT5ub2RlX3V1aWQgPSAqbm9kZV91dWlkOworCXBub2RlLT5ocHJvY2Vzc29yID0gaHByb2Nlc3NvcjsKKwlwbm9kZS0+bnR5cGUgPSBwbm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy5udHlwZTsKKwlwbm9kZS0+dXRpbWVvdXQgPSBwbm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLm5kYl9wcm9wcy51dGltZW91dDsKKwlwbm9kZS0+cHJpbyA9IHBub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLnByaW87CisKKwkvKiBDdXJyZW50bHkgb25seSBDNjQgRFNQIGJ1aWxkcyBzdXBwb3J0IE5vZGUgRHluYW1pYyAqIGhlYXBzICovCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBub2RlIGhlYXAgKi8KKwlwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai5oZWFwX3NpemUgPSAwOworCXBub2RlLT5jcmVhdGVfYXJncy5hc2EudGFza19hcmdfb2JqLnVkc3BfaGVhcF9hZGRyID0gMDsKKwlwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai51ZHNwX2hlYXBfcmVzX2FkZHIgPSAwOworCXBub2RlLT5jcmVhdGVfYXJncy5hc2EudGFza19hcmdfb2JqLnVncHBfaGVhcF9hZGRyID0gMDsKKwlpZiAoIWF0dHJfaW4pCisJCWdvdG8gZnVuY19jb250OworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHVzZXIgYWxsb2NhdGVkIG5vZGUgaGVhcCAqLworCWlmICghKGF0dHJfaW4tPnBncHBfdmlydF9hZGRyKSkKKwkJZ290byBmdW5jX2NvbnQ7CisKKwkvKiBjaGVjayBmb3IgcGFnZSBhbGlnbmVkIEhlYXAgc2l6ZSAqLworCWlmICgoKGF0dHJfaW4tPmhlYXBfc2l6ZSkgJiAoUEdfU0laRTRLIC0gMSkpKSB7CisJCXByX2VycigiJXM6IG5vZGUgaGVhcCBzaXplIG5vdCBhbGlnbmVkIHRvIDRLLCBzaXplID0gMHgleCBcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYXR0cl9pbi0+aGVhcF9zaXplKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai5oZWFwX3NpemUgPQorCQkgICAgYXR0cl9pbi0+aGVhcF9zaXplOworCQlwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai51Z3BwX2hlYXBfYWRkciA9CisJCSAgICAodTMyKSBhdHRyX2luLT5wZ3BwX3ZpcnRfYWRkcjsKKwl9CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisKKwlzdGF0dXMgPSBwcm9jX3Jlc2VydmVfbWVtb3J5KGhwcm9jZXNzb3IsCisJCQkJICAgICBwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai4KKwkJCQkgICAgIGhlYXBfc2l6ZSArIFBBR0VfU0laRSwKKwkJCQkgICAgICh2b2lkICoqKSYocG5vZGUtPmNyZWF0ZV9hcmdzLmFzYS4KKwkJCQkJdGFza19hcmdfb2JqLnVkc3BfaGVhcF9yZXNfYWRkciksCisJCQkJICAgICBwcl9jdHh0KTsKKwlpZiAoc3RhdHVzKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXNlcnZlIG1lbW9yeSBmb3IgaGVhcDogMHgleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIGZ1bmNfY29udDsKKwl9CisjaWZkZWYgRFNQX0RNTV9ERUJVRworCXN0YXR1cyA9IGRtbV9nZXRfaGFuZGxlKHBfcHJvY19vYmplY3QsICZkbW1fbWdyKTsKKwlpZiAoIWRtbV9tZ3IpIHsKKwkJc3RhdHVzID0gRFNQX0VIQU5ETEU7CisJCWdvdG8gZnVuY19jb250OworCX0KKworCWRtbV9tZW1fbWFwX2R1bXAoZG1tX21ncik7CisjZW5kaWYKKworCW1hcF9hdHRycyB8PSBEU1BfTUFQTElUVExFRU5ESUFOOworCW1hcF9hdHRycyB8PSBEU1BfTUFQRUxFTVNJWkUzMjsKKwltYXBfYXR0cnMgfD0gRFNQX01BUFZJUlRVQUxBRERSOworCXN0YXR1cyA9IHByb2NfbWFwKGhwcm9jZXNzb3IsICh2b2lkICopYXR0cl9pbi0+cGdwcF92aXJ0X2FkZHIsCisJCQkgIHBub2RlLT5jcmVhdGVfYXJncy5hc2EudGFza19hcmdfb2JqLmhlYXBfc2l6ZSwKKwkJCSAgKHZvaWQgKilwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai4KKwkJCSAgdWRzcF9oZWFwX3Jlc19hZGRyLCAodm9pZCAqKikmbWFwcGVkX2FkZHIsIG1hcF9hdHRycywKKwkJCSAgcHJfY3R4dCk7CisJaWYgKHN0YXR1cykKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIG1hcCBtZW1vcnkgZm9yIEhlYXA6IDB4JXhcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwllbHNlCisJCXBub2RlLT5jcmVhdGVfYXJncy5hc2EudGFza19hcmdfb2JqLnVkc3BfaGVhcF9hZGRyID0KKwkJICAgICh1MzIpIG1hcHBlZF9hZGRyOworCitmdW5jX2NvbnQ6CisJbXV0ZXhfdW5sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworCWlmIChhdHRyX2luICE9IE5VTEwpIHsKKwkJLyogT3ZlcnJpZGVzIG9mIE5CRCBwcm9wZXJ0aWVzICovCisJCXBub2RlLT51dGltZW91dCA9IGF0dHJfaW4tPnV0aW1lb3V0OworCQlwbm9kZS0+cHJpbyA9IGF0dHJfaW4tPnByaW87CisJfQorCS8qIENyZWF0ZSBvYmplY3QgdG8gbWFuYWdlIG5vdGlmaWNhdGlvbnMgKi8KKwlpZiAoIXN0YXR1cykgeworCQlwbm9kZS0+bnRmeV9vYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnRmeV9vYmplY3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAocG5vZGUtPm50Znlfb2JqKQorCQkJbnRmeV9pbml0KHBub2RlLT5udGZ5X29iaik7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShwbm9kZSk7CisJCS8qICBBbGxvY2F0ZSBkc3Bfc3RyZWFtY29ubmVjdCBhcnJheSBmb3IgZGV2aWNlLCB0YXNrLCBhbmQKKwkJICogIGRhaXMgc29ja2V0IG5vZGVzLiAqLworCQlpZiAobm9kZV90eXBlICE9IE5PREVfTUVTU0FHRSkgeworCQkJbnVtX3N0cmVhbXMgPSBNQVhfSU5QVVRTKHBub2RlKSArIE1BWF9PVVRQVVRTKHBub2RlKTsKKwkJCXBub2RlLT5zdHJlYW1fY29ubmVjdCA9IGt6YWxsb2MobnVtX3N0cmVhbXMgKgorCQkJCQlzaXplb2Yoc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0KSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAobnVtX3N0cmVhbXMgPiAwICYmIHBub2RlLT5zdHJlYW1fY29ubmVjdCA9PSBOVUxMKQorCQkJCXN0YXR1cyA9IC1FTk9NRU07CisKKwkJfQorCQlpZiAoIXN0YXR1cyAmJiAobm9kZV90eXBlID09IE5PREVfVEFTSyB8fAorCQkJCQkgICAgICBub2RlX3R5cGUgPT0gTk9ERV9EQUlTU09DS0VUKSkgeworCQkJLyogQWxsb2NhdGUgYXJyYXlzIGZvciBtYWludGFpbmlnIHN0cmVhbSBjb25uZWN0aW9ucyAqLworCQkJcG5vZGUtPmlucHV0cyA9IGt6YWxsb2MoTUFYX0lOUFVUUyhwbm9kZSkgKgorCQkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbV9jaG5sKSwgR0ZQX0tFUk5FTCk7CisJCQlwbm9kZS0+b3V0cHV0cyA9IGt6YWxsb2MoTUFYX09VVFBVVFMocG5vZGUpICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1fY2hubCksIEdGUF9LRVJORUwpOworCQkJcHRhc2tfYXJncyA9ICYocG5vZGUtPmNyZWF0ZV9hcmdzLmFzYS50YXNrX2FyZ19vYmopOworCQkJcHRhc2tfYXJncy0+c3RybV9pbl9kZWYgPSBremFsbG9jKE1BWF9JTlBVVFMocG5vZGUpICoKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgbm9kZV9zdHJtZGVmKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJcHRhc2tfYXJncy0+c3RybV9vdXRfZGVmID0ga3phbGxvYyhNQVhfT1VUUFVUUyhwbm9kZSkgKgorCQkJCQkJc2l6ZW9mKHN0cnVjdCBub2RlX3N0cm1kZWYpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoKE1BWF9JTlBVVFMocG5vZGUpID4gMCAmJiAocG5vZGUtPmlucHV0cyA9PSBOVUxMIHx8CisJCQkJCQkgICAgICAgcHRhc2tfYXJncy0+c3RybV9pbl9kZWYKKwkJCQkJCSAgICAgICA9PSBOVUxMKSkKKwkJCSAgICB8fCAoTUFYX09VVFBVVFMocG5vZGUpID4gMAorCQkJCSYmIChwbm9kZS0+b3V0cHV0cyA9PSBOVUxMCisJCQkJICAgIHx8IHB0YXNrX2FyZ3MtPnN0cm1fb3V0X2RlZiA9PSBOVUxMKSkpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cyAmJiAobm9kZV90eXBlICE9IE5PREVfREVWSUNFKSkgeworCQkvKiBDcmVhdGUgYW4gZXZlbnQgdGhhdCB3aWxsIGJlIHBvc3RlZCB3aGVuIFJNU19FWElUIGlzCisJCSAqIHJlY2VpdmVkLiAqLworCQlwbm9kZS0+c3luY19kb25lID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN5bmNfb2JqZWN0KSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChwbm9kZS0+c3luY19kb25lKQorCQkJc3luY19pbml0X2V2ZW50KHBub2RlLT5zeW5jX2RvbmUpOworCQllbHNlCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCisJCWlmICghc3RhdHVzKSB7CisJCQkvKkdldCB0aGUgc2hhcmVkIG1lbSBtZ3IgZm9yIHRoaXMgbm9kZXMgZGV2IG9iamVjdCAqLworCQkJc3RhdHVzID0gY21tX2dldF9oYW5kbGUoaHByb2Nlc3NvciwgJmhjbW1fbWdyKTsKKwkJCWlmICghc3RhdHVzKSB7CisJCQkJLyogQWxsb2NhdGUgYSBTTSBhZGRyIHRyYW5zbGF0b3IgZm9yIHRoaXMgbm9kZQorCQkJCSAqIHcvIGRlZmx0IGF0dHIgKi8KKwkJCQlzdGF0dXMgPSBjbW1feGxhdG9yX2NyZWF0ZSgmcG5vZGUtPnhsYXRvciwKKwkJCQkJCQkgICBoY21tX21nciwgTlVMTCk7CisJCQl9CisJCX0KKwkJaWYgKCFzdGF0dXMpIHsKKwkJCS8qIEZpbGwgaW4gbWVzc2FnZSBhcmdzICovCisJCQlpZiAoKHBhcmdzICE9IE5VTEwpICYmIChwYXJncy0+Y2JfZGF0YSA+IDApKSB7CisJCQkJcG1zZ19hcmdzID0KKwkJCQkgICAgJihwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLm5vZGVfbXNnX2FyZ3MpOworCQkJCXBtc2dfYXJncy0+cGRhdGEgPSBremFsbG9jKHBhcmdzLT5jYl9kYXRhLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAocG1zZ19hcmdzLT5wZGF0YSA9PSBOVUxMKSB7CisJCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJfSBlbHNlIHsKKwkJCQkJcG1zZ19hcmdzLT5hcmdfbGVuZ3RoID0gcGFyZ3MtPmNiX2RhdGE7CisJCQkJCW1lbWNweShwbXNnX2FyZ3MtPnBkYXRhLAorCQkJCQkgICAgICAgcGFyZ3MtPm5vZGVfZGF0YSwKKwkJCQkJICAgICAgIHBhcmdzLT5jYl9kYXRhKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXN0YXR1cyAmJiBub2RlX3R5cGUgIT0gTk9ERV9ERVZJQ0UpIHsKKwkJLyogQ3JlYXRlIGEgbWVzc2FnZSBxdWV1ZSBmb3IgdGhpcyBub2RlICovCisJCWludGZfZnhucyA9IGhub2RlX21nci0+aW50Zl9meG5zOworCQlzdGF0dXMgPQorCQkgICAgKCppbnRmX2Z4bnMtPnBmbl9tc2dfY3JlYXRlX3F1ZXVlKSAoaG5vZGVfbWdyLT5tc2dfbWdyX29iaiwKKwkJCQkJCQkmcG5vZGUtPm1zZ19xdWV1ZV9vYmosCisJCQkJCQkJMCwKKwkJCQkJCQlwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLgorCQkJCQkJCW5vZGVfbXNnX2FyZ3MubWF4X21zZ3MsCisJCQkJCQkJcG5vZGUpOworCX0KKworCWlmICghc3RhdHVzKSB7CisJCS8qIENyZWF0ZSBvYmplY3QgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworCisJCXN0YXR1cyA9IGhub2RlX21nci0+bmxkcl9meG5zLnBmbl9hbGxvY2F0ZShobm9kZV9tZ3ItPm5sZHJfb2JqLAorCQkJCQkJCSAgICh2b2lkICopcG5vZGUsCisJCQkJCQkJICAgJnBub2RlLT5kY2RfcHJvcHMuCisJCQkJCQkJICAgb2JqX2RhdGEubm9kZV9vYmosCisJCQkJCQkJICAgJnBub2RlLT4KKwkJCQkJCQkgICBubGRyX25vZGVfb2JqLAorCQkJCQkJCSAgICZwbm9kZS0+cGhhc2Vfc3BsaXQpOworCX0KKworCS8qIENvbXBhcmUgdmFsdWUgcmVhZCBmcm9tIE5vZGUgUHJvcGVydGllcyBhbmQgY2hlY2sgaWYgaXQgaXMgc2FtZSBhcworCSAqIFNUQUNLU0VHTEFCRUwsIGlmIHllcyByZWFkIHRoZSBBZGRyZXNzIG9mIFNUQUNLU0VHTEFCRUwsIGNhbGN1bGF0ZQorCSAqIEdQUCBBZGRyZXNzLCBSZWFkIHRoZSB2YWx1ZSBpbiB0aGF0IGFkZHJlc3MgYW5kIG92ZXJyaWRlIHRoZQorCSAqIHN0YWNrX3NlZyB2YWx1ZSBpbiB0YXNrIGFyZ3MgKi8KKwlpZiAoIXN0YXR1cyAmJgorCSAgICAoY2hhciAqKXBub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLgorCSAgICBzdGFja19zZWdfbmFtZSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoKGNoYXIgKikKKwkJCSAgIHBub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzLgorCQkJICAgc3RhY2tfc2VnX25hbWUsIFNUQUNLU0VHTEFCRUwpID09IDApIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgaG5vZGVfbWdyLT5ubGRyX2Z4bnMuCisJCQkgICAgcGZuX2dldF9meG5fYWRkcihwbm9kZS0+bmxkcl9ub2RlX29iaiwgIkRZTkVYVF9CRUciLAorCQkJCQkgICAgICZkeW5leHRfYmFzZSk7CisJCQlpZiAoc3RhdHVzKQorCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBnZXQgYWRkciBmb3IgRFlORVhUX0JFRyIKKwkJCQkgICAgICAgIiBzdGF0dXMgPSAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKworCQkJc3RhdHVzID0KKwkJCSAgICBobm9kZV9tZ3ItPm5sZHJfZnhucy4KKwkJCSAgICBwZm5fZ2V0X2Z4bl9hZGRyKHBub2RlLT5ubGRyX25vZGVfb2JqLAorCQkJCQkgICAgICJMMURTUkFNX0hFQVAiLCAmcHVsX3ZhbHVlKTsKKworCQkJaWYgKHN0YXR1cykKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZ2V0IGFkZHIgZm9yIEwxRFNSQU1fSEVBUCIKKwkJCQkgICAgICAgIiBzdGF0dXMgPSAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKworCQkJaG9zdF9yZXMgPSBwYnJpZGdlX2NvbnRleHQtPnJlc291cmNlczsKKwkJCWlmICghaG9zdF9yZXMpCisJCQkJc3RhdHVzID0gLUVQRVJNOworCisJCQlpZiAoc3RhdHVzKSB7CisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGdldCBob3N0IHJlc291cmNlLCBzdGF0dXMiCisJCQkJICAgICAgICIgPSAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCQlnb3RvIGZ1bmNfZW5kOworCQkJfQorCisJCQl1bF9ncHBfbWVtX2Jhc2UgPSAodTMyKSBob3N0X3Jlcy0+ZHdfbWVtX2Jhc2VbMV07CisJCQlvZmZfc2V0ID0gcHVsX3ZhbHVlIC0gZHluZXh0X2Jhc2U7CisJCQl1bF9zdGFja19zZWdfYWRkciA9IHVsX2dwcF9tZW1fYmFzZSArIG9mZl9zZXQ7CisJCQl1bF9zdGFja19zZWdfdmFsID0gcmVhZGwodWxfc3RhY2tfc2VnX2FkZHIpOworCisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBTdGFja1NlZ1ZhbCA9IDB4JXgsIFN0YWNrU2VnQWRkciA9IgorCQkJCSIgMHgleFxuIiwgX19mdW5jX18sIHVsX3N0YWNrX3NlZ192YWwsCisJCQkJdWxfc3RhY2tfc2VnX2FkZHIpOworCisJCQlwbm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai5zdGFja19zZWcgPQorCQkJICAgIHVsX3N0YWNrX3NlZ192YWw7CisKKwkJfQorCX0KKworCWlmICghc3RhdHVzKSB7CisJCS8qIEFkZCB0aGUgbm9kZSB0byB0aGUgbm9kZSBtYW5hZ2VyJ3MgbGlzdCBvZiBhbGxvY2F0ZWQKKwkJICogbm9kZXMuICovCisJCWxzdF9pbml0X2VsZW0oKHN0cnVjdCBsaXN0X2hlYWQgKilwbm9kZSk7CisJCU5PREVfU0VUX1NUQVRFKHBub2RlLCBOT0RFX0FMTE9DQVRFRCk7CisKKwkJbXV0ZXhfbG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKworCQlsc3RfcHV0X3RhaWwoaG5vZGVfbWdyLT5ub2RlX2xpc3QsIChzdHJ1Y3QgbGlzdF9oZWFkICopIHBub2RlKTsKKwkJCSsrKGhub2RlX21nci0+bnVtX25vZGVzKTsKKworCQkvKiBFeGl0IGNyaXRpY2FsIHNlY3Rpb24gKi8KKwkJbXV0ZXhfdW5sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworCisJCS8qIFByZXNldCB0aGlzIHRvIGFzc3VtZSBwaGFzZXMgYXJlIHNwbGl0CisJCSAqIChmb3Igb3ZlcmxheSBhbmQgZGxsKSAqLworCQlwbm9kZS0+cGhhc2Vfc3BsaXQgPSB0cnVlOworCisJCS8qIE5vdGlmeSBhbGwgY2xpZW50cyByZWdpc3RlcmVkIGZvciBEU1BfTk9ERVNUQVRFQ0hBTkdFLiAqLworCQlwcm9jX25vdGlmeV9hbGxfY2xpZW50cyhocHJvY2Vzc29yLCBEU1BfTk9ERVNUQVRFQ0hBTkdFKTsKKwl9IGVsc2UgeworCQkvKiBDbGVhbnVwICovCisJCWlmIChwbm9kZSkKKwkJCWRlbGV0ZV9ub2RlKHBub2RlLCBwcl9jdHh0KTsKKworCX0KKworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGRydl9pbnNlcnRfbm9kZV9yZXNfZWxlbWVudChwbm9kZSwgJm5vZGVfcmVzLCBwcl9jdHh0KTsKKwkJaWYgKHN0YXR1cykgeworCQkJZGVsZXRlX25vZGUocG5vZGUsIHByX2N0eHQpOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCisJCSpub2RlcmVzID0gKHN0cnVjdCBub2RlX3Jlc19vYmplY3QgKilub2RlX3JlczsKKwkJZHJ2X3Byb2Nfbm9kZV91cGRhdGVfaGVhcF9zdGF0dXMobm9kZV9yZXMsIHRydWUpOworCQlkcnZfcHJvY19ub2RlX3VwZGF0ZV9zdGF0dXMobm9kZV9yZXMsIHRydWUpOworCX0KKwlEQkNfRU5TVVJFKChzdGF0dXMgJiYgKm5vZGVyZXMgPT0gTlVMTCkgfHwgKCFzdGF0dXMgJiYgKm5vZGVyZXMpKTsKK2Z1bmNfZW5kOgorCWRldl9kYmcoYnJpZGdlLCAiJXM6IGhwcm9jZXNzb3I6ICVwIHBOb2RlSWQ6ICVwIHBhcmdzOiAlcCBhdHRyX2luOiAlcCAiCisJCSJub2RlX3JlczogJXAgc3RhdHVzOiAweCV4XG4iLCBfX2Z1bmNfXywgaHByb2Nlc3NvciwKKwkJbm9kZV91dWlkLCBwYXJncywgYXR0cl9pbiwgbm9kZXJlcywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5vZGVfYWxsb2NfbXNnX2J1ZiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEFsbG9jYXRlcyBidWZmZXIgZm9yIHplcm8gY29weSBtZXNzYWdpbmcuCisgKi8KK0RCQVBJIG5vZGVfYWxsb2NfbXNnX2J1ZihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgdXNpemUsCisJCQkgc3RydWN0IGRzcF9idWZmZXJhdHRyICpwYXR0ciwKKwkJCSB1OCAqKnBidWZmZXIpCit7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpwbm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilobm9kZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlib29sIHZhX2ZsYWcgPSBmYWxzZTsKKwlib29sIHNldF9pbmZvOworCXUzMiBwcm9jX2lkOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHBidWZmZXIgIT0gTlVMTCk7CisKKwlEQkNfUkVRVUlSRSh1c2l6ZSA+IDApOworCisJaWYgKCFwbm9kZSkKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwllbHNlIGlmIChub2RlX2dldF90eXBlKHBub2RlKSA9PSBOT0RFX0RFVklDRSkKKwkJc3RhdHVzID0gLUVQRVJNOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCWlmIChwYXR0ciA9PSBOVUxMKQorCQlwYXR0ciA9ICZub2RlX2RmbHRidWZhdHRyczsJLyogc2V0IGRlZmF1bHRzICovCisKKwlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQocG5vZGUtPmhwcm9jZXNzb3IsICZwcm9jX2lkKTsKKwlpZiAocHJvY19pZCAhPSBEU1BfVU5JVCkgeworCQlEQkNfQVNTRVJUKE5VTEwpOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkvKiAgSWYgc2VnbWVudCBJRCBpbmNsdWRlcyBNRU1fU0VUVklSVFVBTFNFR0lEIHRoZW4gcGJ1ZmZlciBpcyBhCisJICogIHZpcnQgIGFkZHJlc3MsIHNvIHNldCB0aGlzIGluZm8gaW4gdGhpcyBub2RlJ3MgdHJhbnNsYXRvcgorCSAqICBvYmplY3QgZm9yICBmdXR1cmUgcmVmLiBJZiBNRU1fR0VUVklSVFVBTFNFR0lEIHRoZW4gcmV0cmlldmUKKwkgKiAgdmlydHVhbCBhZGRyZXNzICBmcm9tIG5vZGUncyB0cmFuc2xhdG9yLiAqLworCWlmICgocGF0dHItPnNlZ21lbnRfaWQgJiBNRU1fU0VUVklSVFVBTFNFR0lEKSB8fAorCSAgICAocGF0dHItPnNlZ21lbnRfaWQgJiBNRU1fR0VUVklSVFVBTFNFR0lEKSkgeworCQl2YV9mbGFnID0gdHJ1ZTsKKwkJc2V0X2luZm8gPSAocGF0dHItPnNlZ21lbnRfaWQgJiBNRU1fU0VUVklSVFVBTFNFR0lEKSA/CisJCSAgICB0cnVlIDogZmFsc2U7CisJCS8qIENsZWFyIG1hc2sgYml0cyAqLworCQlwYXR0ci0+c2VnbWVudF9pZCAmPSB+TUVNX01BU0tWSVJUVUFMU0VHSUQ7CisJCS8qIFNldC9nZXQgdGhpcyBub2RlJ3MgdHJhbnNsYXRvcnMgdmlydHVhbCBhZGRyZXNzIGJhc2Uvc2l6ZSAqLworCQlzdGF0dXMgPSBjbW1feGxhdG9yX2luZm8ocG5vZGUtPnhsYXRvciwgcGJ1ZmZlciwgdXNpemUsCisJCQkJCSBwYXR0ci0+c2VnbWVudF9pZCwgc2V0X2luZm8pOworCX0KKwlpZiAoIXN0YXR1cyAmJiAoIXZhX2ZsYWcpKSB7CisJCWlmIChwYXR0ci0+c2VnbWVudF9pZCAhPSAxKSB7CisJCQkvKiBOb2RlIHN1cHBvcnRzIHNpbmdsZSBTTSBzZWdtZW50IG9ubHkuICovCisJCQlzdGF0dXMgPSAtRUJBRFI7CisJCX0KKwkJLyogIEFyYml0cmFyeSBTTSBidWZmZXIgYWxpZ25tZW50IG5vdCBzdXBwb3J0ZWQgZm9yIGhvc3Qgc2lkZQorCQkgKiAgYWxsb2NzLCBidXQgZ3VhcmFudGVlZCBmb3IgdGhlIGZvbGxvd2luZyBhbGlnbm1lbnQKKwkJICogIHZhbHVlcy4gKi8KKwkJc3dpdGNoIChwYXR0ci0+YnVmX2FsaWdubWVudCkgeworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGFsaWdubWVudCB2YWx1ZSBub3Qgc3Vwb3J0dGVkICovCisJCQlzdGF0dXMgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0YXR1cykgeworCQkJLyogYWxsb2NhdGUgcGh5c2ljYWwgYnVmZmVyIGZyb20gc2VnX2lkIGluIG5vZGUncworCQkJICogdHJhbnNsYXRvciAqLworCQkJKHZvaWQpY21tX3hsYXRvcl9hbGxvY19idWYocG5vZGUtPnhsYXRvciwgcGJ1ZmZlciwKKwkJCQkJCSAgIHVzaXplKTsKKwkJCWlmICgqcGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJcHJfZXJyKCIlczogZXJyb3IgLSBPdXQgb2Ygc2hhcmVkIG1lbW9yeVxuIiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQl9CisJCX0KKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5vZGVfY2hhbmdlX3ByaW9yaXR5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ2hhbmdlIHRoZSBwcmlvcml0eSBvZiBhIG5vZGUgaW4gdGhlIGFsbG9jYXRlZCBzdGF0ZSwgb3IgdGhhdCBpcworICogICAgICBjdXJyZW50bHkgcnVubmluZyBvciBwYXVzZWQgb24gdGhlIHRhcmdldC4KKyAqLworaW50IG5vZGVfY2hhbmdlX3ByaW9yaXR5KHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHMzMiBwcmlvKQoreworCXN0cnVjdCBub2RlX29iamVjdCAqcG5vZGUgPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopaG5vZGU7CisJc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IgPSBOVUxMOworCWVudW0gbm9kZV90eXBlIG5vZGVfdHlwZTsKKwllbnVtIG5vZGVfc3RhdGUgc3RhdGU7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIHByb2NfaWQ7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIWhub2RlIHx8ICFobm9kZS0+aG5vZGVfbWdyKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKwkJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShobm9kZSk7CisJCWlmIChub2RlX3R5cGUgIT0gTk9ERV9UQVNLICYmIG5vZGVfdHlwZSAhPSBOT0RFX0RBSVNTT0NLRVQpCisJCQlzdGF0dXMgPSAtRVBFUk07CisJCWVsc2UgaWYgKHByaW8gPCBobm9kZV9tZ3ItPm1pbl9wcmkgfHwgcHJpbyA+IGhub2RlX21nci0+bWF4X3ByaSkKKwkJCXN0YXR1cyA9IC1FRE9NOworCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisKKwlzdGF0ZSA9IG5vZGVfZ2V0X3N0YXRlKGhub2RlKTsKKwlpZiAoc3RhdGUgPT0gTk9ERV9BTExPQ0FURUQgfHwgc3RhdGUgPT0gTk9ERV9QQVVTRUQpIHsKKwkJTk9ERV9TRVRfUFJJT1JJVFkoaG5vZGUsIHByaW8pOworCX0gZWxzZSB7CisJCWlmIChzdGF0ZSAhPSBOT0RFX1JVTk5JTkcpIHsKKwkJCXN0YXR1cyA9IC1FQkFEUjsKKwkJCWdvdG8gZnVuY19jb250OworCQl9CisJCXN0YXR1cyA9IHByb2NfZ2V0X3Byb2Nlc3Nvcl9pZChwbm9kZS0+aHByb2Nlc3NvciwgJnByb2NfaWQpOworCQlpZiAocHJvY19pZCA9PSBEU1BfVU5JVCkgeworCQkJc3RhdHVzID0KKwkJCSAgICBkaXNwX25vZGVfY2hhbmdlX3ByaW9yaXR5KGhub2RlX21nci0+ZGlzcF9vYmosCisJCQkJCQkgICAgICBobm9kZSwKKwkJCQkJCSAgICAgIGhub2RlX21nci0+dWxfZnhuX2FkZHJzCisJCQkJCQkgICAgICBbUk1TQ0hBTkdFTk9ERVBSSU9SSVRZXSwKKwkJCQkJCSAgICAgIGhub2RlLT5ub2RlX2VudiwgcHJpbyk7CisJCX0KKwkJaWYgKHN0YXR1cyA+PSAwKQorCQkJTk9ERV9TRVRfUFJJT1JJVFkoaG5vZGUsIHByaW8pOworCisJfQorZnVuY19jb250OgorCS8qIExlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwltdXRleF91bmxvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5vZGVfY29ubmVjdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENvbm5lY3QgdHdvIG5vZGVzIG9uIHRoZSBEU1AsIG9yIGEgbm9kZSBvbiB0aGUgRFNQIHRvIHRoZSBHUFAuCisgKi8KK2ludCBub2RlX2Nvbm5lY3Qoc3RydWN0IG5vZGVfb2JqZWN0ICpub2RlMSwgdTMyIHN0cmVhbTEsCisJCQlzdHJ1Y3Qgbm9kZV9vYmplY3QgKm5vZGUyLAorCQkJdTMyIHN0cmVhbTIsIHN0cnVjdCBkc3Bfc3RybWF0dHIgKnBhdHRycywKKwkJCXN0cnVjdCBkc3BfY2JkYXRhICpjb25uX3BhcmFtKQoreworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyOworCWNoYXIgKnBzdHJfZGV2X25hbWUgPSBOVUxMOworCWVudW0gbm9kZV90eXBlIG5vZGUxX3R5cGUgPSBOT0RFX1RBU0s7CisJZW51bSBub2RlX3R5cGUgbm9kZTJfdHlwZSA9IE5PREVfVEFTSzsKKwlzdHJ1Y3Qgbm9kZV9zdHJtZGVmICpwc3RybV9kZWY7CisJc3RydWN0IG5vZGVfc3RybWRlZiAqaW5wdXQgPSBOVUxMOworCXN0cnVjdCBub2RlX3N0cm1kZWYgKm91dHB1dCA9IE5VTEw7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpkZXZfbm9kZV9vYmo7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZTsKKwlzdHJ1Y3Qgc3RyZWFtX2NobmwgKnBzdHJlYW07CisJdTMyIHBpcGVfaWQgPSBHQl9OT0JJVFM7CisJdTMyIGNobmxfaWQgPSBHQl9OT0JJVFM7CisJczggY2hubF9tb2RlOworCXUzMiBkd19sZW5ndGg7CisJaW50IHN0YXR1cyA9IDA7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJaWYgKChub2RlMSAhPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopRFNQX0hHUFBOT0RFICYmICFub2RlMSkgfHwKKwkgICAgKG5vZGUyICE9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilEU1BfSEdQUE5PREUgJiYgIW5vZGUyKSkKKwkJc3RhdHVzID0gLUVGQVVMVDsKKworCWlmICghc3RhdHVzKSB7CisJCS8qIFRoZSB0d28gbm9kZXMgbXVzdCBiZSBvbiB0aGUgc2FtZSBwcm9jZXNzb3IgKi8KKwkJaWYgKG5vZGUxICE9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilEU1BfSEdQUE5PREUgJiYKKwkJICAgIG5vZGUyICE9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilEU1BfSEdQUE5PREUgJiYKKwkJICAgIG5vZGUxLT5obm9kZV9tZ3IgIT0gbm9kZTItPmhub2RlX21ncikKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJLyogQ2Fubm90IGNvbm5lY3QgYSBub2RlIHRvIGl0c2VsZiAqLworCQlpZiAobm9kZTEgPT0gbm9kZTIpCisJCQlzdGF0dXMgPSAtRVBFUk07CisKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogbm9kZV9nZXRfdHlwZSgpIHdpbGwgcmV0dXJuIE5PREVfR1BQIGlmIGhub2RlID0KKwkJICogRFNQX0hHUFBOT0RFLiAqLworCQlub2RlMV90eXBlID0gbm9kZV9nZXRfdHlwZShub2RlMSk7CisJCW5vZGUyX3R5cGUgPSBub2RlX2dldF90eXBlKG5vZGUyKTsKKwkJLyogQ2hlY2sgc3RyZWFtIGluZGljZXMgcmFuZ2VzICovCisJCWlmICgobm9kZTFfdHlwZSAhPSBOT0RFX0dQUCAmJiBub2RlMV90eXBlICE9IE5PREVfREVWSUNFICYmCisJCSAgICAgc3RyZWFtMSA+PSBNQVhfT1VUUFVUUyhub2RlMSkpIHx8IChub2RlMl90eXBlICE9IE5PREVfR1BQCisJCQkJCQkJICAmJiBub2RlMl90eXBlICE9CisJCQkJCQkJICBOT0RFX0RFVklDRQorCQkJCQkJCSAgJiYgc3RyZWFtMiA+PQorCQkJCQkJCSAgTUFYX0lOUFVUUyhub2RlMikpKQorCQkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyoKKwkJICogIE9ubHkgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBjb25uZWN0aW9ucyBhcmUgYWxsb3dlZDoKKwkJICogICAgICB0YXNrL2RhaXMgc29ja2V0IDwgPT0gPiB0YXNrL2RhaXMgc29ja2V0CisJCSAqICAgICAgdGFzay9kYWlzIHNvY2tldCA8ID09ID4gZGV2aWNlCisJCSAqICAgICAgdGFzay9kYWlzIHNvY2tldCA8ID09ID4gR1BQCisJCSAqCisJCSAqICBpZSwgbm8gbWVzc2FnZSBub2RlcywgYW5kIGF0IGxlYXN0IG9uZSB0YXNrIG9yIGRhaXMKKwkJICogIHNvY2tldCBub2RlLgorCQkgKi8KKwkJaWYgKG5vZGUxX3R5cGUgPT0gTk9ERV9NRVNTQUdFIHx8IG5vZGUyX3R5cGUgPT0gTk9ERV9NRVNTQUdFIHx8CisJCSAgICAobm9kZTFfdHlwZSAhPSBOT0RFX1RBU0sgJiYgbm9kZTFfdHlwZSAhPSBOT0RFX0RBSVNTT0NLRVQgJiYKKwkJICAgICBub2RlMl90eXBlICE9IE5PREVfVEFTSyAmJiBub2RlMl90eXBlICE9IE5PREVfREFJU1NPQ0tFVCkpCisJCQlzdGF0dXMgPSAtRVBFUk07CisJfQorCS8qCisJICogQ2hlY2sgc3RyZWFtIG1vZGUuIERlZmF1bHQgaXMgU1RSTU1PREVfUFJPQ0NPUFkuCisJICovCisJaWYgKCFzdGF0dXMgJiYgcGF0dHJzKSB7CisJCWlmIChwYXR0cnMtPnN0cm1fbW9kZSAhPSBTVFJNTU9ERV9QUk9DQ09QWSkKKwkJCXN0YXR1cyA9IC1FUEVSTTsJLyogaWxsZWdhbCBzdHJlYW0gbW9kZSAqLworCisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlpZiAobm9kZTFfdHlwZSAhPSBOT0RFX0dQUCkgeworCQlobm9kZV9tZ3IgPSBub2RlMS0+aG5vZGVfbWdyOworCX0gZWxzZSB7CisJCURCQ19BU1NFUlQobm9kZTIgIT0gKHN0cnVjdCBub2RlX29iamVjdCAqKURTUF9IR1BQTk9ERSk7CisJCWhub2RlX21nciA9IG5vZGUyLT5obm9kZV9tZ3I7CisJfQorCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwltdXRleF9sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworCisJLyogTm9kZXMgbXVzdCBiZSBpbiB0aGUgYWxsb2NhdGVkIHN0YXRlICovCisJaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9HUFAgJiYgbm9kZV9nZXRfc3RhdGUobm9kZTEpICE9IE5PREVfQUxMT0NBVEVEKQorCQlzdGF0dXMgPSAtRUJBRFI7CisKKwlpZiAobm9kZTJfdHlwZSAhPSBOT0RFX0dQUCAmJiBub2RlX2dldF9zdGF0ZShub2RlMikgIT0gTk9ERV9BTExPQ0FURUQpCisJCXN0YXR1cyA9IC1FQkFEUjsKKworCWlmICghc3RhdHVzKSB7CisJCS8qICBDaGVjayB0aGF0IHN0cmVhbSBpbmRpY2VzIGZvciB0YXNrIGFuZCBkYWlzIHNvY2tldCBub2RlcworCQkgKiAgYXJlIG5vdCBhbHJlYWR5IGJlIHVzZWQuIChEZXZpY2Ugbm9kZXMgY2hlY2tlZCBsYXRlcikgKi8KKwkJaWYgKG5vZGUxX3R5cGUgPT0gTk9ERV9UQVNLIHx8IG5vZGUxX3R5cGUgPT0gTk9ERV9EQUlTU09DS0VUKSB7CisJCQlvdXRwdXQgPQorCQkJICAgICYobm9kZTEtPmNyZWF0ZV9hcmdzLmFzYS4KKwkJCSAgICAgIHRhc2tfYXJnX29iai5zdHJtX291dF9kZWZbc3RyZWFtMV0pOworCQkJaWYgKG91dHB1dC0+c3pfZGV2aWNlICE9IE5VTEwpCisJCQkJc3RhdHVzID0gLUVJU0NPTk47CisKKwkJfQorCQlpZiAobm9kZTJfdHlwZSA9PSBOT0RFX1RBU0sgfHwgbm9kZTJfdHlwZSA9PSBOT0RFX0RBSVNTT0NLRVQpIHsKKwkJCWlucHV0ID0KKwkJCSAgICAmKG5vZGUyLT5jcmVhdGVfYXJncy5hc2EuCisJCQkgICAgICB0YXNrX2FyZ19vYmouc3RybV9pbl9kZWZbc3RyZWFtMl0pOworCQkJaWYgKGlucHV0LT5zel9kZXZpY2UgIT0gTlVMTCkKKwkJCQlzdGF0dXMgPSAtRUlTQ09OTjsKKworCQl9CisJfQorCS8qIENvbm5lY3RpbmcgdHdvIHRhc2sgbm9kZXM/ICovCisJaWYgKCFzdGF0dXMgJiYgKChub2RlMV90eXBlID09IE5PREVfVEFTSyB8fAorCQkJCSAgICAgICBub2RlMV90eXBlID09IE5PREVfREFJU1NPQ0tFVCkKKwkJCQkgICAgICAmJiAobm9kZTJfdHlwZSA9PSBOT0RFX1RBU0sKKwkJCQkJICB8fCBub2RlMl90eXBlID09IE5PREVfREFJU1NPQ0tFVCkpKSB7CisJCS8qIEZpbmQgYXZhaWxhYmxlIHBpcGUgKi8KKwkJcGlwZV9pZCA9IGdiX2ZpbmRhbmRzZXQoaG5vZGVfbWdyLT5waXBlX21hcCk7CisJCWlmIChwaXBlX2lkID09IEdCX05PQklUUykgeworCQkJc3RhdHVzID0gLUVDT05OUkVGVVNFRDsKKwkJfSBlbHNlIHsKKwkJCW5vZGUxLT5vdXRwdXRzW3N0cmVhbTFdLnR5cGUgPSBOT0RFQ09OTkVDVDsKKwkJCW5vZGUyLT5pbnB1dHNbc3RyZWFtMl0udHlwZSA9IE5PREVDT05ORUNUOworCQkJbm9kZTEtPm91dHB1dHNbc3RyZWFtMV0uZGV2X2lkID0gcGlwZV9pZDsKKwkJCW5vZGUyLT5pbnB1dHNbc3RyZWFtMl0uZGV2X2lkID0gcGlwZV9pZDsKKwkJCW91dHB1dC0+c3pfZGV2aWNlID0ga3phbGxvYyhQSVBFTkFNRUxFTiArIDEsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpbnB1dC0+c3pfZGV2aWNlID0ga3phbGxvYyhQSVBFTkFNRUxFTiArIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKG91dHB1dC0+c3pfZGV2aWNlID09IE5VTEwgfHwKKwkJCSAgICBpbnB1dC0+c3pfZGV2aWNlID09IE5VTEwpIHsKKwkJCQkvKiBVbmRvIHRoZSBjb25uZWN0aW9uICovCisJCQkJa2ZyZWUob3V0cHV0LT5zel9kZXZpY2UpOworCisJCQkJa2ZyZWUoaW5wdXQtPnN6X2RldmljZSk7CisKKwkJCQlvdXRwdXQtPnN6X2RldmljZSA9IE5VTEw7CisJCQkJaW5wdXQtPnN6X2RldmljZSA9IE5VTEw7CisJCQkJZ2JfY2xlYXIoaG5vZGVfbWdyLT5waXBlX21hcCwgcGlwZV9pZCk7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQ29weSAiL2RicGlwZTxwaXBJZD4iIG5hbWUgdG8gZGV2aWNlIG5hbWVzICovCisJCQkJc3ByaW50ZihvdXRwdXQtPnN6X2RldmljZSwgIiVzJWQiLAorCQkJCQlQSVBFUFJFRklYLCBwaXBlX2lkKTsKKwkJCQlzdHJjcHkoaW5wdXQtPnN6X2RldmljZSwgb3V0cHV0LT5zel9kZXZpY2UpOworCQkJfQorCQl9CisJfQorCS8qIENvbm5lY3RpbmcgdGFzayBub2RlIHRvIGhvc3Q/ICovCisJaWYgKCFzdGF0dXMgJiYgKG5vZGUxX3R5cGUgPT0gTk9ERV9HUFAgfHwKKwkJCQkgICAgICBub2RlMl90eXBlID09IE5PREVfR1BQKSkgeworCQlpZiAobm9kZTFfdHlwZSA9PSBOT0RFX0dQUCkgeworCQkJY2hubF9tb2RlID0gQ0hOTF9NT0RFVE9EU1A7CisJCX0gZWxzZSB7CisJCQlEQkNfQVNTRVJUKG5vZGUyX3R5cGUgPT0gTk9ERV9HUFApOworCQkJY2hubF9tb2RlID0gQ0hOTF9NT0RFRlJPTURTUDsKKwkJfQorCQkvKiAgUmVzZXJ2ZSBhIGNoYW5uZWwgaWQuIFdlIG5lZWQgdG8gcHV0IHRoZSBuYW1lICIvaG9zdDxpZD4iCisJCSAqICBpbiB0aGUgbm9kZSdzIGNyZWF0ZV9hcmdzLCBidXQgdGhlIGhvc3QKKwkJICogIHNpZGUgY2hhbm5lbCB3aWxsIG5vdCBiZSBvcGVuZWQgdW50aWwgRFNQU3RyZWFtX09wZW4gaXMKKwkJICogIGNhbGxlZCBmb3IgdGhpcyBub2RlLiAqLworCQlpZiAocGF0dHJzKSB7CisJCQlpZiAocGF0dHJzLT5zdHJtX21vZGUgPT0gU1RSTU1PREVfUkRNQSkgeworCQkJCWNobmxfaWQgPQorCQkJCSAgICBnYl9maW5kYW5kc2V0KGhub2RlX21nci0+ZG1hX2NobmxfbWFwKTsKKwkJCQkvKiBkbWEgY2hhbnMgYXJlIDJuZCB0cmFuc3BvcnQgY2hubCBzZXQKKwkJCQkgKiBpZHMoZS5nLiAxNi0zMSkgKi8KKwkJCQkoY2hubF9pZCAhPSBHQl9OT0JJVFMpID8KKwkJCQkgICAgKGNobmxfaWQgPQorCQkJCSAgICAgY2hubF9pZCArCisJCQkJICAgICBobm9kZV9tZ3ItPnVsX251bV9jaG5scykgOiBjaG5sX2lkOworCQkJfSBlbHNlIGlmIChwYXR0cnMtPnN0cm1fbW9kZSA9PSBTVFJNTU9ERV9aRVJPQ09QWSkgeworCQkJCWNobmxfaWQgPSBnYl9maW5kYW5kc2V0KGhub2RlX21nci0+emNfY2hubF9tYXApOworCQkJCS8qIHplcm8tY29weSBjaGFucyBhcmUgM25kIHRyYW5zcG9ydCBzZXQKKwkJCQkgKiAoZS5nLiAzMi00NykgKi8KKwkJCQkoY2hubF9pZCAhPSBHQl9OT0JJVFMpID8gKGNobmxfaWQgPSBjaG5sX2lkICsKKwkJCQkJCQkgICgyICoKKwkJCQkJCQkgICBobm9kZV9tZ3ItPgorCQkJCQkJCSAgIHVsX251bV9jaG5scykpCisJCQkJICAgIDogY2hubF9pZDsKKwkJCX0gZWxzZSB7CS8qIG11c3QgYmUgUFJPQ0NPUFkgKi8KKwkJCQlEQkNfQVNTRVJUKHBhdHRycy0+c3RybV9tb2RlID09CisJCQkJCSAgIFNUUk1NT0RFX1BST0NDT1BZKTsKKwkJCQljaG5sX2lkID0gZ2JfZmluZGFuZHNldChobm9kZV9tZ3ItPmNobmxfbWFwKTsKKwkJCQkvKiBlLmcuIDAtMTUgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGRlZmF1bHQgdG8gUFJPQ0NPUFkgKi8KKwkJCWNobmxfaWQgPSBnYl9maW5kYW5kc2V0KGhub2RlX21nci0+Y2hubF9tYXApOworCQl9CisJCWlmIChjaG5sX2lkID09IEdCX05PQklUUykgeworCQkJc3RhdHVzID0gLUVDT05OUkVGVVNFRDsKKwkJCWdvdG8gZnVuY19jb250MjsKKwkJfQorCQlwc3RyX2Rldl9uYW1lID0ga3phbGxvYyhIT1NUTkFNRUxFTiArIDEsIEdGUF9LRVJORUwpOworCQlpZiAocHN0cl9kZXZfbmFtZSAhPSBOVUxMKQorCQkJZ290byBmdW5jX2NvbnQyOworCisJCWlmIChwYXR0cnMpIHsKKwkJCWlmIChwYXR0cnMtPnN0cm1fbW9kZSA9PSBTVFJNTU9ERV9SRE1BKSB7CisJCQkJZ2JfY2xlYXIoaG5vZGVfbWdyLT5kbWFfY2hubF9tYXAsIGNobmxfaWQgLQorCQkJCQkgaG5vZGVfbWdyLT51bF9udW1fY2hubHMpOworCQkJfSBlbHNlIGlmIChwYXR0cnMtPnN0cm1fbW9kZSA9PSBTVFJNTU9ERV9aRVJPQ09QWSkgeworCQkJCWdiX2NsZWFyKGhub2RlX21nci0+emNfY2hubF9tYXAsIGNobmxfaWQgLQorCQkJCQkgKDIgKiBobm9kZV9tZ3ItPnVsX251bV9jaG5scykpOworCQkJfSBlbHNlIHsKKwkJCQlEQkNfQVNTRVJUKHBhdHRycy0+c3RybV9tb2RlID09CisJCQkJCSAgIFNUUk1NT0RFX1BST0NDT1BZKTsKKwkJCQlnYl9jbGVhcihobm9kZV9tZ3ItPmNobmxfbWFwLCBjaG5sX2lkKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWdiX2NsZWFyKGhub2RlX21nci0+Y2hubF9tYXAsIGNobmxfaWQpOworCQl9CisJCXN0YXR1cyA9IC1FTk9NRU07CitmdW5jX2NvbnQyOgorCQlpZiAoIXN0YXR1cykgeworCQkJaWYgKG5vZGUxID09IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilEU1BfSEdQUE5PREUpIHsKKwkJCQlub2RlMi0+aW5wdXRzW3N0cmVhbTJdLnR5cGUgPSBIT1NUQ09OTkVDVDsKKwkJCQlub2RlMi0+aW5wdXRzW3N0cmVhbTJdLmRldl9pZCA9IGNobmxfaWQ7CisJCQkJaW5wdXQtPnN6X2RldmljZSA9IHBzdHJfZGV2X25hbWU7CisJCQl9IGVsc2UgeworCQkJCW5vZGUxLT5vdXRwdXRzW3N0cmVhbTFdLnR5cGUgPSBIT1NUQ09OTkVDVDsKKwkJCQlub2RlMS0+b3V0cHV0c1tzdHJlYW0xXS5kZXZfaWQgPSBjaG5sX2lkOworCQkJCW91dHB1dC0+c3pfZGV2aWNlID0gcHN0cl9kZXZfbmFtZTsKKwkJCX0KKwkJCXNwcmludGYocHN0cl9kZXZfbmFtZSwgIiVzJWQiLCBIT1NUUFJFRklYLCBjaG5sX2lkKTsKKwkJfQorCX0KKwkvKiBDb25uZWN0aW5nIHRhc2sgbm9kZSB0byBkZXZpY2Ugbm9kZT8gKi8KKwlpZiAoIXN0YXR1cyAmJiAoKG5vZGUxX3R5cGUgPT0gTk9ERV9ERVZJQ0UpIHx8CisJCQkJICAgICAgKG5vZGUyX3R5cGUgPT0gTk9ERV9ERVZJQ0UpKSkgeworCQlpZiAobm9kZTJfdHlwZSA9PSBOT0RFX0RFVklDRSkgeworCQkJLyogbm9kZTEgPT0gPiBkZXZpY2UgKi8KKwkJCWRldl9ub2RlX29iaiA9IG5vZGUyOworCQkJaG5vZGUgPSBub2RlMTsKKwkJCXBzdHJlYW0gPSAmKG5vZGUxLT5vdXRwdXRzW3N0cmVhbTFdKTsKKwkJCXBzdHJtX2RlZiA9IG91dHB1dDsKKwkJfSBlbHNlIHsKKwkJCS8qIGRldmljZSA9PSA+IG5vZGUyICovCisJCQlkZXZfbm9kZV9vYmogPSBub2RlMTsKKwkJCWhub2RlID0gbm9kZTI7CisJCQlwc3RyZWFtID0gJihub2RlMi0+aW5wdXRzW3N0cmVhbTJdKTsKKwkJCXBzdHJtX2RlZiA9IGlucHV0OworCQl9CisJCS8qIFNldCB1cCBjcmVhdGUgYXJncyAqLworCQlwc3RyZWFtLT50eXBlID0gREVWSUNFQ09OTkVDVDsKKwkJZHdfbGVuZ3RoID0gc3RybGVuKGRldl9ub2RlX29iai0+cHN0cl9kZXZfbmFtZSk7CisJCWlmIChjb25uX3BhcmFtICE9IE5VTEwpIHsKKwkJCXBzdHJtX2RlZi0+c3pfZGV2aWNlID0ga3phbGxvYyhkd19sZW5ndGggKyAxICsKKwkJCQkJCQljb25uX3BhcmFtLT5jYl9kYXRhLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQl9IGVsc2UgeworCQkJcHN0cm1fZGVmLT5zel9kZXZpY2UgPSBremFsbG9jKGR3X2xlbmd0aCArIDEsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCX0KKwkJaWYgKHBzdHJtX2RlZi0+c3pfZGV2aWNlID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQkvKiBDb3B5IGRldmljZSBuYW1lICovCisJCQlzdHJuY3B5KHBzdHJtX2RlZi0+c3pfZGV2aWNlLAorCQkJCWRldl9ub2RlX29iai0+cHN0cl9kZXZfbmFtZSwgZHdfbGVuZ3RoKTsKKwkJCWlmIChjb25uX3BhcmFtICE9IE5VTEwpIHsKKwkJCQlzdHJuY2F0KHBzdHJtX2RlZi0+c3pfZGV2aWNlLAorCQkJCQkoY2hhciAqKWNvbm5fcGFyYW0tPm5vZGVfZGF0YSwKKwkJCQkJKHUzMikgY29ubl9wYXJhbS0+Y2JfZGF0YSk7CisJCQl9CisJCQlkZXZfbm9kZV9vYmotPmRldmljZV9vd25lciA9IGhub2RlOworCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIEZpbGwgaW4gY3JlYXRlIGFyZ3MgKi8KKwkJaWYgKG5vZGUxX3R5cGUgPT0gTk9ERV9UQVNLIHx8IG5vZGUxX3R5cGUgPT0gTk9ERV9EQUlTU09DS0VUKSB7CisJCQlub2RlMS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai5udW1fb3V0cHV0cysrOworCQkJZmlsbF9zdHJlYW1fZGVmKG5vZGUxLCBvdXRwdXQsIHBhdHRycyk7CisJCX0KKwkJaWYgKG5vZGUyX3R5cGUgPT0gTk9ERV9UQVNLIHx8IG5vZGUyX3R5cGUgPT0gTk9ERV9EQUlTU09DS0VUKSB7CisJCQlub2RlMi0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai5udW1faW5wdXRzKys7CisJCQlmaWxsX3N0cmVhbV9kZWYobm9kZTIsIGlucHV0LCBwYXR0cnMpOworCQl9CisJCS8qIFVwZGF0ZSBub2RlMSBhbmQgbm9kZTIgc3RyZWFtX2Nvbm5lY3QgKi8KKwkJaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9HUFAgJiYgbm9kZTFfdHlwZSAhPSBOT0RFX0RFVklDRSkgeworCQkJbm9kZTEtPm51bV9vdXRwdXRzKys7CisJCQlpZiAoc3RyZWFtMSA+IG5vZGUxLT5tYXhfb3V0cHV0X2luZGV4KQorCQkJCW5vZGUxLT5tYXhfb3V0cHV0X2luZGV4ID0gc3RyZWFtMTsKKworCQl9CisJCWlmIChub2RlMl90eXBlICE9IE5PREVfR1BQICYmIG5vZGUyX3R5cGUgIT0gTk9ERV9ERVZJQ0UpIHsKKwkJCW5vZGUyLT5udW1faW5wdXRzKys7CisJCQlpZiAoc3RyZWFtMiA+IG5vZGUyLT5tYXhfaW5wdXRfaW5kZXgpCisJCQkJbm9kZTItPm1heF9pbnB1dF9pbmRleCA9IHN0cmVhbTI7CisKKwkJfQorCQlmaWxsX3N0cmVhbV9jb25uZWN0KG5vZGUxLCBub2RlMiwgc3RyZWFtMSwgc3RyZWFtMik7CisJfQorCS8qIGVuZCBvZiBzeW5jX2VudGVyX2NzICovCisJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJbXV0ZXhfdW5sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworZnVuY19lbmQ6CisJZGV2X2RiZyhicmlkZ2UsICIlczogbm9kZTE6ICVwIHN0cmVhbTE6ICVkIG5vZGUyOiAlcCBzdHJlYW0yOiAlZCIKKwkJInBhdHRyczogJXAgc3RhdHVzOiAweCV4XG4iLCBfX2Z1bmNfXywgbm9kZTEsCisJCXN0cmVhbTEsIG5vZGUyLCBzdHJlYW0yLCBwYXR0cnMsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2NyZWF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZSBhIG5vZGUgb24gdGhlIERTUCBieSByZW1vdGVseSBjYWxsaW5nIHRoZSBub2RlJ3MgY3JlYXRlIGZ1bmN0aW9uLgorICovCitpbnQgbm9kZV9jcmVhdGUoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSkKK3sKKwlzdHJ1Y3Qgbm9kZV9vYmplY3QgKnBub2RlID0gKHN0cnVjdCBub2RlX29iamVjdCAqKWhub2RlOworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXUzMiB1bF9jcmVhdGVfZnhuOworCWVudW0gbm9kZV90eXBlIG5vZGVfdHlwZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzMSA9IDA7CisJc3RydWN0IGRzcF9jYmRhdGEgY2JfZGF0YTsKKwl1MzIgcHJvY19pZCA9IDI1NTsKKwlzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlIHByb2Nfc3RhdGU7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpocHJvY2Vzc29yOworI2lmIGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0RWRlMpICYmICFkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkKKwlzdHJ1Y3QgZHNwYnJpZGdlX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkgICAgb21hcF9kc3BicmlkZ2VfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKyNlbmRpZgorCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCWlmICghcG5vZGUpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaHByb2Nlc3NvciA9IGhub2RlLT5ocHJvY2Vzc29yOworCXN0YXR1cyA9IHByb2NfZ2V0X3N0YXRlKGhwcm9jZXNzb3IsICZwcm9jX3N0YXRlLAorCQkJCXNpemVvZihzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlKSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKwkvKiBJZiBwcm9jZXNzb3IgaXMgaW4gZXJyb3Igc3RhdGUgdGhlbiBkb24ndCBhdHRlbXB0IHRvIGNyZWF0ZQorCSAgIG5ldyBub2RlICovCisJaWYgKHByb2Nfc3RhdGUucHJvY19zdGF0ZSA9PSBQUk9DX0VSUk9SKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJLyogY3JlYXRlIHN0cnVjdCBkc3BfY2JkYXRhIHN0cnVjdCBmb3IgUFdSIGNhbGxzICovCisJY2JfZGF0YS5jYl9kYXRhID0gUFdSX1RJTUVPVVQ7CisJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShobm9kZSk7CisJaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKwlpbnRmX2Z4bnMgPSBobm9kZV9tZ3ItPmludGZfZnhuczsKKwkvKiBHZXQgYWNjZXNzIHRvIG5vZGUgZGlzcGF0Y2hlciAqLworCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisKKwkvKiBDaGVjayBub2RlIHN0YXRlICovCisJaWYgKG5vZGVfZ2V0X3N0YXRlKGhub2RlKSAhPSBOT0RFX0FMTE9DQVRFRCkKKwkJc3RhdHVzID0gLUVCQURSOworCisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IHByb2NfZ2V0X3Byb2Nlc3Nvcl9pZChwbm9kZS0+aHByb2Nlc3NvciwgJnByb2NfaWQpOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQyOworCisJaWYgKHByb2NfaWQgIT0gRFNQX1VOSVQpCisJCWdvdG8gZnVuY19jb250MjsKKworCS8qIE1ha2Ugc3VyZSBzdHJlYW1zIGFyZSBwcm9wZXJseSBjb25uZWN0ZWQgKi8KKwlpZiAoKGhub2RlLT5udW1faW5wdXRzICYmIGhub2RlLT5tYXhfaW5wdXRfaW5kZXggPgorCSAgICAgaG5vZGUtPm51bV9pbnB1dHMgLSAxKSB8fAorCSAgICAoaG5vZGUtPm51bV9vdXRwdXRzICYmIGhub2RlLT5tYXhfb3V0cHV0X2luZGV4ID4KKwkgICAgIGhub2RlLT5udW1fb3V0cHV0cyAtIDEpKQorCQlzdGF0dXMgPSAtRU5PVENPTk47CisKKwlpZiAoIXN0YXR1cykgeworCQkvKiBJZiBub2RlJ3MgY3JlYXRlIGZ1bmN0aW9uIGlzIG5vdCBsb2FkZWQsIGxvYWQgaXQgKi8KKwkJLyogQm9vc3QgdGhlIE9QUCBsZXZlbCB0byBtYXggbGV2ZWwgdGhhdCBEU1AgY2FuIGJlIHJlcXVlc3RlZCAqLworI2lmIGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0RWRlMpICYmICFkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkKKwkJaWYgKHBkYXRhLT5jcHVfc2V0X2ZyZXEpCisJCQkoKnBkYXRhLT5jcHVfc2V0X2ZyZXEpIChwZGF0YS0+bXB1X3NwZWVkW1ZERDFfT1BQM10pOworI2VuZGlmCisJCXN0YXR1cyA9IGhub2RlX21nci0+bmxkcl9meG5zLnBmbl9sb2FkKGhub2RlLT5ubGRyX25vZGVfb2JqLAorCQkJCQkJICAgICAgIE5MRFJfQ1JFQVRFKTsKKwkJLyogR2V0IGFkZHJlc3Mgb2Ygbm9kZSdzIGNyZWF0ZSBmdW5jdGlvbiAqLworCQlpZiAoIXN0YXR1cykgeworCQkJaG5vZGUtPmxvYWRlZCA9IHRydWU7CisJCQlpZiAobm9kZV90eXBlICE9IE5PREVfREVWSUNFKSB7CisJCQkJc3RhdHVzID0gZ2V0X2Z4bl9hZGRyZXNzKGhub2RlLCAmdWxfY3JlYXRlX2Z4biwKKwkJCQkJCQkgQ1JFQVRFUEhBU0UpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGxvYWQgY3JlYXRlIGNvZGU6IDB4JXhcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHN0YXR1cyk7CisJCX0KKwkJLyogUmVxdWVzdCB0aGUgbG93ZXN0IE9QUCBsZXZlbCAqLworI2lmIGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0RWRlMpICYmICFkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkKKwkJaWYgKHBkYXRhLT5jcHVfc2V0X2ZyZXEpCisJCQkoKnBkYXRhLT5jcHVfc2V0X2ZyZXEpIChwZGF0YS0+bXB1X3NwZWVkW1ZERDFfT1BQMV0pOworI2VuZGlmCisJCS8qIEdldCBhZGRyZXNzIG9mIGlBbGcgZnVuY3Rpb25zLCBpZiBzb2NrZXQgbm9kZSAqLworCQlpZiAoIXN0YXR1cykgeworCQkJaWYgKG5vZGVfdHlwZSA9PSBOT0RFX0RBSVNTT0NLRVQpIHsKKwkJCQlzdGF0dXMgPSBobm9kZV9tZ3ItPm5sZHJfZnhucy5wZm5fZ2V0X2Z4bl9hZGRyCisJCQkJICAgIChobm9kZS0+bmxkcl9ub2RlX29iaiwKKwkJCQkgICAgIGhub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmouCisJCQkJICAgICBwc3RyX2lfYWxnX25hbWUsCisJCQkJICAgICAmaG5vZGUtPmNyZWF0ZV9hcmdzLmFzYS4KKwkJCQkgICAgIHRhc2tfYXJnX29iai51bF9kYWlzX2FyZyk7CisJCQl9CisJCX0KKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJaWYgKG5vZGVfdHlwZSAhPSBOT0RFX0RFVklDRSkgeworCQkJc3RhdHVzID0gZGlzcF9ub2RlX2NyZWF0ZShobm9kZV9tZ3ItPmRpc3Bfb2JqLCBobm9kZSwKKwkJCQkJCSAgaG5vZGVfbWdyLT51bF9meG5fYWRkcnMKKwkJCQkJCSAgW1JNU0NSRUFURU5PREVdLAorCQkJCQkJICB1bF9jcmVhdGVfZnhuLAorCQkJCQkJICAmKGhub2RlLT5jcmVhdGVfYXJncyksCisJCQkJCQkgICYoaG5vZGUtPm5vZGVfZW52KSk7CisJCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCQkvKiBTZXQgdGhlIG1lc3NhZ2UgcXVldWUgaWQgdG8gdGhlIG5vZGUgZW52CisJCQkJICogcG9pbnRlciAqLworCQkJCWludGZfZnhucyA9IGhub2RlX21nci0+aW50Zl9meG5zOworCQkJCSgqaW50Zl9meG5zLT5wZm5fbXNnX3NldF9xdWV1ZV9pZCkgKGhub2RlLT4KKwkJCQkJCQltc2dfcXVldWVfb2JqLAorCQkJCQkJCWhub2RlLT5ub2RlX2Vudik7CisJCQl9CisJCX0KKwl9CisJLyogIFBoYXNlIElJL092ZXJsYXlzOiBDcmVhdGUsIGV4ZWN1dGUsIGRlbGV0ZSBwaGFzZXMgIHBvc3NpYmx5IGluCisJICogIGRpZmZlcmVudCBmaWxlcy9zZWN0aW9ucy4gKi8KKwlpZiAoaG5vZGUtPmxvYWRlZCAmJiBobm9kZS0+cGhhc2Vfc3BsaXQpIHsKKwkJLyogSWYgY3JlYXRlIGNvZGUgd2FzIGR5bmFtaWNhbGx5IGxvYWRlZCwgd2UgY2FuIG5vdyB1bmxvYWQKKwkJICogaXQuICovCisJCXN0YXR1czEgPSBobm9kZV9tZ3ItPm5sZHJfZnhucy5wZm5fdW5sb2FkKGhub2RlLT5ubGRyX25vZGVfb2JqLAorCQkJCQkJCSAgTkxEUl9DUkVBVEUpOworCQlobm9kZS0+bG9hZGVkID0gZmFsc2U7CisJfQorCWlmIChzdGF0dXMxKQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gdW5sb2FkIGNyZWF0ZSBjb2RlOiAweCV4XG4iLAorCQkgICAgICAgX19mdW5jX18sIHN0YXR1czEpOworZnVuY19jb250MjoKKwkvKiBVcGRhdGUgbm9kZSBzdGF0ZSBhbmQgbm9kZSBtYW5hZ2VyIHN0YXRlICovCisJaWYgKHN0YXR1cyA+PSAwKSB7CisJCU5PREVfU0VUX1NUQVRFKGhub2RlLCBOT0RFX0NSRUFURUQpOworCQlobm9kZV9tZ3ItPm51bV9jcmVhdGVkKys7CisJCWdvdG8gZnVuY19jb250OworCX0KKwlpZiAoc3RhdHVzICE9IC1FQkFEUikgeworCQkvKiBQdXQgYmFjayBpbiBOT0RFX0FMTE9DQVRFRCBzdGF0ZSBpZiBlcnJvciBvY2N1cnJlZCAqLworCQlOT0RFX1NFVF9TVEFURShobm9kZSwgTk9ERV9BTExPQ0FURUQpOworCX0KK2Z1bmNfY29udDoKKwkvKiBGcmVlIGFjY2VzcyB0byBub2RlIGRpc3BhdGNoZXIgKi8KKwltdXRleF91bmxvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CitmdW5jX2VuZDoKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJcHJvY19ub3RpZnlfY2xpZW50cyhobm9kZS0+aHByb2Nlc3NvciwgRFNQX05PREVTVEFURUNIQU5HRSk7CisJCW50Znlfbm90aWZ5KGhub2RlLT5udGZ5X29iaiwgRFNQX05PREVTVEFURUNIQU5HRSk7CisJfQorCisJZGV2X2RiZyhicmlkZ2UsICIlczogaG5vZGU6ICVwIHN0YXR1czogMHgleFxuIiwgX19mdW5jX18sCisJCWhub2RlLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9jcmVhdGVfbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ3JlYXRlIGEgTk9ERSBNYW5hZ2VyIG9iamVjdC4KKyAqLworaW50IG5vZGVfY3JlYXRlX21ncihzdHJ1Y3Qgbm9kZV9tZ3IgKipub2RlX21hbiwKKwkJCSAgIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaikKK3sKKwl1MzIgaTsKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKm5vZGVfbWdyX29iaiA9IE5VTEw7CisJc3RydWN0IGRpc3BfYXR0ciBkaXNwX2F0dHJfb2JqOworCWNoYXIgKnN6X3psX2ZpbGUgPSAiIjsKKwlzdHJ1Y3Qgbmxkcl9hdHRycyBubGRyX2F0dHJzX29iajsKKwlpbnQgc3RhdHVzID0gMDsKKwl1OCBkZXZfdHlwZTsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUobm9kZV9tYW4gIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmogIT0gTlVMTCk7CisKKwkqbm9kZV9tYW4gPSBOVUxMOworCS8qIEFsbG9jYXRlIE5vZGUgbWFuYWdlciBvYmplY3QgKi8KKwlub2RlX21ncl9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZV9tZ3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAobm9kZV9tZ3Jfb2JqKSB7CisJCW5vZGVfbWdyX29iai0+aGRldl9vYmogPSBoZGV2X29iajsKKwkJbm9kZV9tZ3Jfb2JqLT5ub2RlX2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHN0X2xpc3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQlub2RlX21ncl9vYmotPnBpcGVfbWFwID0gZ2JfY3JlYXRlKE1BWFBJUEVTKTsKKwkJbm9kZV9tZ3Jfb2JqLT5waXBlX2RvbmVfbWFwID0gZ2JfY3JlYXRlKE1BWFBJUEVTKTsKKwkJaWYgKG5vZGVfbWdyX29iai0+bm9kZV9saXN0ID09IE5VTEwKKwkJICAgIHx8IG5vZGVfbWdyX29iai0+cGlwZV9tYXAgPT0gTlVMTAorCQkgICAgfHwgbm9kZV9tZ3Jfb2JqLT5waXBlX2RvbmVfbWFwID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQlJTklUX0xJU1RfSEVBRCgmbm9kZV9tZ3Jfb2JqLT5ub2RlX2xpc3QtPmhlYWQpOworCQkJbm9kZV9tZ3Jfb2JqLT5udGZ5X29iaiA9IGttYWxsb2MoCisJCQkJc2l6ZW9mKHN0cnVjdCBudGZ5X29iamVjdCksIEdGUF9LRVJORUwpOworCQkJaWYgKG5vZGVfbWdyX29iai0+bnRmeV9vYmopCisJCQkJbnRmeV9pbml0KG5vZGVfbWdyX29iai0+bnRmeV9vYmopOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCX0KKwkJbm9kZV9tZ3Jfb2JqLT5udW1fY3JlYXRlZCA9IDA7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisJLyogZ2V0IGRldk5vZGVUeXBlICovCisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRldl9nZXRfZGV2X3R5cGUoaGRldl9vYmosICZkZXZfdHlwZSk7CisKKwkvKiBDcmVhdGUgdGhlIERDRCBNYW5hZ2VyICovCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0KKwkJICAgIGRjZF9jcmVhdGVfbWFuYWdlcihzel96bF9maWxlLCAmbm9kZV9tZ3Jfb2JqLT5oZGNkX21ncik7CisJCWlmICghc3RhdHVzKQorCQkJc3RhdHVzID0gZ2V0X3Byb2NfcHJvcHMobm9kZV9tZ3Jfb2JqLCBoZGV2X29iaik7CisKKwl9CisJLyogQ3JlYXRlIE5PREUgRGlzcGF0Y2hlciAqLworCWlmICghc3RhdHVzKSB7CisJCWRpc3BfYXR0cl9vYmoudWxfY2hubF9vZmZzZXQgPSBub2RlX21ncl9vYmotPnVsX2Nobmxfb2Zmc2V0OworCQlkaXNwX2F0dHJfb2JqLnVsX2NobmxfYnVmX3NpemUgPSBub2RlX21ncl9vYmotPnVsX2NobmxfYnVmX3NpemU7CisJCWRpc3BfYXR0cl9vYmoucHJvY19mYW1pbHkgPSBub2RlX21ncl9vYmotPnByb2NfZmFtaWx5OworCQlkaXNwX2F0dHJfb2JqLnByb2NfdHlwZSA9IG5vZGVfbWdyX29iai0+cHJvY190eXBlOworCQlzdGF0dXMgPQorCQkgICAgZGlzcF9jcmVhdGUoJm5vZGVfbWdyX29iai0+ZGlzcF9vYmosIGhkZXZfb2JqLAorCQkJCSZkaXNwX2F0dHJfb2JqKTsKKwl9CisJLyogQ3JlYXRlIGEgU1RSTSBNYW5hZ2VyICovCisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IHN0cm1fY3JlYXRlKCZub2RlX21ncl9vYmotPnN0cm1fbWdyX29iaiwgaGRldl9vYmopOworCisJaWYgKCFzdGF0dXMpIHsKKwkJZGV2X2dldF9pbnRmX2Z4bnMoaGRldl9vYmosICZub2RlX21ncl9vYmotPmludGZfZnhucyk7CisJCS8qIEdldCBtc2dfY3RybCBxdWV1ZSBtYW5hZ2VyICovCisJCWRldl9nZXRfbXNnX21ncihoZGV2X29iaiwgJm5vZGVfbWdyX29iai0+bXNnX21ncl9vYmopOworCQltdXRleF9pbml0KCZub2RlX21ncl9vYmotPm5vZGVfbWdyX2xvY2spOworCQlub2RlX21ncl9vYmotPmNobmxfbWFwID0gZ2JfY3JlYXRlKG5vZGVfbWdyX29iai0+dWxfbnVtX2NobmxzKTsKKwkJLyogZG1hIGNobmwgbWFwLiB1bF9udW1fY2hubHMgaXMgIyBwZXIgdHJhbnNwb3J0ICovCisJCW5vZGVfbWdyX29iai0+ZG1hX2NobmxfbWFwID0KKwkJICAgIGdiX2NyZWF0ZShub2RlX21ncl9vYmotPnVsX251bV9jaG5scyk7CisJCW5vZGVfbWdyX29iai0+emNfY2hubF9tYXAgPQorCQkgICAgZ2JfY3JlYXRlKG5vZGVfbWdyX29iai0+dWxfbnVtX2NobmxzKTsKKwkJaWYgKChub2RlX21ncl9vYmotPmNobmxfbWFwID09IE5VTEwpCisJCSAgICB8fCAobm9kZV9tZ3Jfb2JqLT5kbWFfY2hubF9tYXAgPT0gTlVMTCkKKwkJICAgIHx8IChub2RlX21ncl9vYmotPnpjX2NobmxfbWFwID09IE5VTEwpKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJLyogQmxvY2sgb3V0IHJlc2VydmVkIGNoYW5uZWxzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbm9kZV9tZ3Jfb2JqLT51bF9jaG5sX29mZnNldDsgaSsrKQorCQkJCWdiX3NldChub2RlX21ncl9vYmotPmNobmxfbWFwLCBpKTsKKworCQkJLyogQmxvY2sgb3V0IGNoYW5uZWxzIHJlc2VydmVkIGZvciBSTVMgKi8KKwkJCWdiX3NldChub2RlX21ncl9vYmotPmNobmxfbWFwLAorCQkJICAgICAgIG5vZGVfbWdyX29iai0+dWxfY2hubF9vZmZzZXQpOworCQkJZ2Jfc2V0KG5vZGVfbWdyX29iai0+Y2hubF9tYXAsCisJCQkgICAgICAgbm9kZV9tZ3Jfb2JqLT51bF9jaG5sX29mZnNldCArIDEpOworCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIE5PIFJNIFNlcnZlciBvbiB0aGUgSVZBICovCisJCWlmIChkZXZfdHlwZSAhPSBJVkFfVU5JVCkgeworCQkJLyogR2V0IGFkZHJlc3NlcyBvZiBhbnkgUk1TIGZ1bmN0aW9ucyBsb2FkZWQgKi8KKwkJCXN0YXR1cyA9IGdldF9ybXNfZnhucyhub2RlX21ncl9vYmopOworCQl9CisJfQorCisJLyogR2V0IGxvYWRlciBmdW5jdGlvbnMgYW5kIGNyZWF0ZSBsb2FkZXIgKi8KKwlpZiAoIXN0YXR1cykKKwkJbm9kZV9tZ3Jfb2JqLT5ubGRyX2Z4bnMgPSBubGRyX2Z4bnM7CS8qIER5biBsb2FkZXIgZnVuY3MgKi8KKworCWlmICghc3RhdHVzKSB7CisJCW5sZHJfYXR0cnNfb2JqLnBmbl9vdmx5ID0gb3ZseTsKKwkJbmxkcl9hdHRyc19vYmoucGZuX3dyaXRlID0gbWVtX3dyaXRlOworCQlubGRyX2F0dHJzX29iai51c19kc3Bfd29yZF9zaXplID0gbm9kZV9tZ3Jfb2JqLT51ZHNwX3dvcmRfc2l6ZTsKKwkJbmxkcl9hdHRyc19vYmoudXNfZHNwX21hdV9zaXplID0gbm9kZV9tZ3Jfb2JqLT51ZHNwX21hdV9zaXplOworCQlub2RlX21ncl9vYmotPmxvYWRlcl9pbml0ID0gbm9kZV9tZ3Jfb2JqLT5ubGRyX2Z4bnMucGZuX2luaXQoKTsKKwkJc3RhdHVzID0KKwkJICAgIG5vZGVfbWdyX29iai0+bmxkcl9meG5zLnBmbl9jcmVhdGUoJm5vZGVfbWdyX29iai0+bmxkcl9vYmosCisJCQkJCQkgICAgICAgaGRldl9vYmosCisJCQkJCQkgICAgICAgJm5sZHJfYXR0cnNfb2JqKTsKKwl9CisJaWYgKCFzdGF0dXMpCisJCSpub2RlX21hbiA9IG5vZGVfbWdyX29iajsKKwllbHNlCisJCWRlbGV0ZV9ub2RlX21ncihub2RlX21ncl9vYmopOworCisJREJDX0VOU1VSRSgoc3RhdHVzICYmICpub2RlX21hbiA9PSBOVUxMKSB8fCAoIXN0YXR1cyAmJiAqbm9kZV9tYW4pKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9kZWxldGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZWxldGUgYSBub2RlIG9uIHRoZSBEU1AgYnkgcmVtb3RlbHkgY2FsbGluZyB0aGUgbm9kZSdzIGRlbGV0ZSBmdW5jdGlvbi4KKyAqICAgICAgTG9hZHMgdGhlIG5vZGUncyBkZWxldGUgZnVuY3Rpb24gaWYgbmVjZXNzYXJ5LiBGcmVlIEdQUCBzaWRlIHJlc291cmNlcworICogICAgICBhZnRlciBub2RlJ3MgZGVsZXRlIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK2ludCBub2RlX2RlbGV0ZShzdHJ1Y3Qgbm9kZV9yZXNfb2JqZWN0ICpub2RlcmVzLAorCQkgICAgICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCkKK3sKKwlzdHJ1Y3Qgbm9kZV9vYmplY3QgKnBub2RlID0gbm9kZXJlcy0+aG5vZGU7CisJc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3I7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpocHJvY2Vzc29yOworCXN0cnVjdCBkaXNwX29iamVjdCAqZGlzcF9vYmo7CisJdTMyIHVsX2RlbGV0ZV9meG47CisJZW51bSBub2RlX3R5cGUgbm9kZV90eXBlOworCWVudW0gbm9kZV9zdGF0ZSBzdGF0ZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzMSA9IDA7CisJc3RydWN0IGRzcF9jYmRhdGEgY2JfZGF0YTsKKwl1MzIgcHJvY19pZDsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKworCXZvaWQgKm5vZGVfcmVzID0gbm9kZXJlczsKKworCXN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgcHJvY19zdGF0ZTsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIXBub2RlKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCS8qIGNyZWF0ZSBzdHJ1Y3QgZHNwX2NiZGF0YSBzdHJ1Y3QgZm9yIFBXUiBjYWxsICovCisJY2JfZGF0YS5jYl9kYXRhID0gUFdSX1RJTUVPVVQ7CisJaG5vZGVfbWdyID0gcG5vZGUtPmhub2RlX21ncjsKKwlocHJvY2Vzc29yID0gcG5vZGUtPmhwcm9jZXNzb3I7CisJZGlzcF9vYmogPSBobm9kZV9tZ3ItPmRpc3Bfb2JqOworCW5vZGVfdHlwZSA9IG5vZGVfZ2V0X3R5cGUocG5vZGUpOworCWludGZfZnhucyA9IGhub2RlX21nci0+aW50Zl9meG5zOworCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwltdXRleF9sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworCisJc3RhdGUgPSBub2RlX2dldF9zdGF0ZShwbm9kZSk7CisJLyogIEV4ZWN1dGUgZGVsZXRlIHBoYXNlIGNvZGUgZm9yIG5vbi1kZXZpY2Ugbm9kZSBpbiBhbGwgY2FzZXMKKwkgKiAgZXhjZXB0IHdoZW4gdGhlIG5vZGUgd2FzIG9ubHkgYWxsb2NhdGVkLiBEZWxldGUgcGhhc2UgbXVzdCBiZQorCSAqICBleGVjdXRlZCBldmVuIGlmIGNyZWF0ZSBwaGFzZSB3YXMgZXhlY3V0ZWQsIGJ1dCBmYWlsZWQuCisJICogIElmIHRoZSBub2RlIGVudmlyb25tZW50IHBvaW50ZXIgaXMgbm9uLU5VTEwsIHRoZSBkZWxldGUgcGhhc2UKKwkgKiAgY29kZSBtdXN0IGJlICBleGVjdXRlZC4gKi8KKwlpZiAoIShzdGF0ZSA9PSBOT0RFX0FMTE9DQVRFRCAmJiBwbm9kZS0+bm9kZV9lbnYgPT0gKHUzMikgTlVMTCkgJiYKKwkgICAgbm9kZV90eXBlICE9IE5PREVfREVWSUNFKSB7CisJCXN0YXR1cyA9IHByb2NfZ2V0X3Byb2Nlc3Nvcl9pZChwbm9kZS0+aHByb2Nlc3NvciwgJnByb2NfaWQpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBmdW5jX2NvbnQxOworCisJCWlmIChwcm9jX2lkID09IERTUF9VTklUIHx8IHByb2NfaWQgPT0gSVZBX1VOSVQpIHsKKwkJCS8qICBJZiBub2RlIGhhcyB0ZXJtaW5hdGVkLCBleGVjdXRlIHBoYXNlIGNvZGUgd2lsbAorCQkJICogIGhhdmUgYWxyZWFkeSBiZWVuIHVubG9hZGVkIGluIG5vZGVfb25fZXhpdCgpLiBJZiB0aGUKKwkJCSAqICBub2RlIGlzIFBBVVNFRCwgdGhlIGV4ZWN1dGUgcGhhc2UgaXMgbG9hZGVkLCBhbmQgaXQKKwkJCSAqICBpcyBub3cgb2sgdG8gdW5sb2FkIGl0LiBJZiB0aGUgbm9kZSBpcyBydW5uaW5nLCB3ZQorCQkJICogIHdpbGwgdW5sb2FkIHRoZSBleGVjdXRlIHBoYXNlIG9ubHkgYWZ0ZXIgZGVsZXRpbmcKKwkJCSAqICB0aGUgbm9kZS4gKi8KKwkJCWlmIChzdGF0ZSA9PSBOT0RFX1BBVVNFRCAmJiBwbm9kZS0+bG9hZGVkICYmCisJCQkgICAgcG5vZGUtPnBoYXNlX3NwbGl0KSB7CisJCQkJLyogT2sgdG8gdW5sb2FkIGV4ZWN1dGUgY29kZSBhcyBsb25nIGFzIG5vZGUKKwkJCQkgKiBpcyBub3QgKiBydW5uaW5nICovCisJCQkJc3RhdHVzMSA9CisJCQkJICAgIGhub2RlX21nci0+bmxkcl9meG5zLgorCQkJCSAgICBwZm5fdW5sb2FkKHBub2RlLT5ubGRyX25vZGVfb2JqLAorCQkJCQkgICAgICAgTkxEUl9FWEVDVVRFKTsKKwkJCQlwbm9kZS0+bG9hZGVkID0gZmFsc2U7CisJCQkJTk9ERV9TRVRfU1RBVEUocG5vZGUsIE5PREVfRE9ORSk7CisJCQl9CisJCQkvKiBMb2FkIGRlbGV0ZSBwaGFzZSBjb2RlIGlmIG5vdCBsb2FkZWQgb3IgaWYgaGF2ZW4ndAorCQkJICogKiB1bmxvYWRlZCBFWEVDVVRFIHBoYXNlICovCisJCQlpZiAoKCEocG5vZGUtPmxvYWRlZCkgfHwgKHN0YXRlID09IE5PREVfUlVOTklORykpICYmCisJCQkgICAgcG5vZGUtPnBoYXNlX3NwbGl0KSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgaG5vZGVfbWdyLT5ubGRyX2Z4bnMuCisJCQkJICAgIHBmbl9sb2FkKHBub2RlLT5ubGRyX25vZGVfb2JqLCBOTERSX0RFTEVURSk7CisJCQkJaWYgKCFzdGF0dXMpCisJCQkJCXBub2RlLT5sb2FkZWQgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJcHJfZXJyKCIlczogZmFpbCAtIGxvYWQgZGVsZXRlIGNvZGU6IgorCQkJCQkgICAgICAgIiAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfQorZnVuY19jb250MToKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCS8qIFVuYmxvY2sgYSB0aHJlYWQgdHJ5aW5nIHRvIHRlcm1pbmF0ZSB0aGUgbm9kZSAqLworCQkJKHZvaWQpc3luY19zZXRfZXZlbnQocG5vZGUtPnN5bmNfZG9uZSk7CisJCQlpZiAocHJvY19pZCA9PSBEU1BfVU5JVCkgeworCQkJCS8qIHVsX2RlbGV0ZV9meG4gPSBhZGRyZXNzIG9mIG5vZGUncyBkZWxldGUKKwkJCQkgKiBmdW5jdGlvbiAqLworCQkJCXN0YXR1cyA9IGdldF9meG5fYWRkcmVzcyhwbm9kZSwgJnVsX2RlbGV0ZV9meG4sCisJCQkJCQkJIERFTEVURVBIQVNFKTsKKwkJCX0gZWxzZSBpZiAocHJvY19pZCA9PSBJVkFfVU5JVCkKKwkJCQl1bF9kZWxldGVfZnhuID0gKHUzMikgcG5vZGUtPm5vZGVfZW52OworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQlzdGF0dXMgPSBwcm9jX2dldF9zdGF0ZShocHJvY2Vzc29yLAorCQkJCQkJJnByb2Nfc3RhdGUsCisJCQkJCQlzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgICAgZHNwX3Byb2Nlc3NvcnN0YXRlKSk7CisJCQkJaWYgKHByb2Nfc3RhdGUucHJvY19zdGF0ZSAhPSBQUk9DX0VSUk9SKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBkaXNwX25vZGVfZGVsZXRlKGRpc3Bfb2JqLCBwbm9kZSwKKwkJCQkJCQkgICAgIGhub2RlX21nci0+CisJCQkJCQkJICAgICB1bF9meG5fYWRkcnMKKwkJCQkJCQkgICAgIFtSTVNERUxFVEVOT0RFXSwKKwkJCQkJCQkgICAgIHVsX2RlbGV0ZV9meG4sCisJCQkJCQkJICAgICBwbm9kZS0+bm9kZV9lbnYpOworCQkJCX0gZWxzZQorCQkJCQlOT0RFX1NFVF9TVEFURShwbm9kZSwgTk9ERV9ET05FKTsKKworCQkJCS8qIFVubG9hZCBleGVjdXRlLCBpZiBub3QgdW5sb2FkZWQsIGFuZCBkZWxldGUKKwkJCQkgKiBmdW5jdGlvbiAqLworCQkJCWlmIChzdGF0ZSA9PSBOT0RFX1JVTk5JTkcgJiYKKwkJCQkgICAgcG5vZGUtPnBoYXNlX3NwbGl0KSB7CisJCQkJCXN0YXR1czEgPQorCQkJCQkgICAgaG5vZGVfbWdyLT5ubGRyX2Z4bnMuCisJCQkJCSAgICBwZm5fdW5sb2FkKHBub2RlLT5ubGRyX25vZGVfb2JqLAorCQkJCQkJICAgICAgIE5MRFJfRVhFQ1VURSk7CisJCQkJfQorCQkJCWlmIChzdGF0dXMxKQorCQkJCQlwcl9lcnIoIiVzOiBmYWlsIC0gdW5sb2FkIGV4ZWN1dGUgY29kZToiCisJCQkJCSAgICAgICAiIDB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMxKTsKKworCQkJCXN0YXR1czEgPQorCQkJCSAgICBobm9kZV9tZ3ItPm5sZHJfZnhucy5wZm5fdW5sb2FkKHBub2RlLT4KKwkJCQkJCQkgICAgbmxkcl9ub2RlX29iaiwKKwkJCQkJCQkgICAgTkxEUl9ERUxFVEUpOworCQkJCXBub2RlLT5sb2FkZWQgPSBmYWxzZTsKKwkJCQlpZiAoc3RhdHVzMSkKKwkJCQkJcHJfZXJyKCIlczogZmFpbCAtIHVubG9hZCBkZWxldGUgY29kZTogIgorCQkJCQkgICAgICAgIjB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMxKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBGcmVlIGhvc3Qgc2lkZSByZXNvdXJjZXMgZXZlbiBpZiBhIGZhaWx1cmUgb2NjdXJyZWQgKi8KKwkvKiBSZW1vdmUgbm9kZSBmcm9tIGhub2RlX21nci0+bm9kZV9saXN0ICovCisJbHN0X3JlbW92ZV9lbGVtKGhub2RlX21nci0+bm9kZV9saXN0LCAoc3RydWN0IGxpc3RfaGVhZCAqKXBub2RlKTsKKwlobm9kZV9tZ3ItPm51bV9ub2Rlcy0tOworCS8qIERlY3JlbWVudCBjb3VudCBvZiBub2RlcyBjcmVhdGVkIG9uIERTUCAqLworCWlmICgoc3RhdGUgIT0gTk9ERV9BTExPQ0FURUQpIHx8ICgoc3RhdGUgPT0gTk9ERV9BTExPQ0FURUQpICYmCisJCQkJCSAgKHBub2RlLT5ub2RlX2VudiAhPSAodTMyKSBOVUxMKSkpCisJCWhub2RlX21nci0+bnVtX2NyZWF0ZWQtLTsKKwkvKiAgRnJlZSBob3N0LXNpZGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBub2RlX2NyZWF0ZSgpCisJICogIGRlbGV0ZV9ub2RlKCkgZmFpbHMgaWYgU00gYnVmZmVycyBub3QgZnJlZWQgYnkgY2xpZW50ISAqLworCWRydl9wcm9jX25vZGVfdXBkYXRlX3N0YXR1cyhub2RlX3JlcywgZmFsc2UpOworCWRlbGV0ZV9ub2RlKHBub2RlLCBwcl9jdHh0KTsKKworCS8qCisJICogUmVsZWFzZSBhbGwgTm9kZSByZXNvdXJjZXMgYW5kIGl0cyBjb250ZXh0CisJICovCisJaWRyX3JlbW92ZShwcl9jdHh0LT5ub2RlX2lkLCAoKHN0cnVjdCBub2RlX3Jlc19vYmplY3QgKilub2RlX3JlcyktPmlkKTsKKwlrZnJlZShub2RlX3Jlcyk7CisKKwkvKiBFeGl0IGNyaXRpY2FsIHNlY3Rpb24gKi8KKwltdXRleF91bmxvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJcHJvY19ub3RpZnlfY2xpZW50cyhocHJvY2Vzc29yLCBEU1BfTk9ERVNUQVRFQ0hBTkdFKTsKK2Z1bmNfZW5kOgorCWRldl9kYmcoYnJpZGdlLCAiJXM6IHBub2RlOiAlcCBzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHBub2RlLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9kZWxldGVfbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVsZXRlIHRoZSBOT0RFIE1hbmFnZXIuCisgKi8KK2ludCBub2RlX2RlbGV0ZV9tZ3Ioc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoaG5vZGVfbWdyKQorCQlkZWxldGVfbm9kZV9tZ3IoaG5vZGVfbWdyKTsKKwllbHNlCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5vZGVfZW51bV9ub2RlcyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVudW1lcmF0ZSBjdXJyZW50bHkgYWxsb2NhdGVkIG5vZGVzLgorICovCitpbnQgbm9kZV9lbnVtX25vZGVzKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyLCB2b2lkICoqbm9kZV90YWIsCisJCQkgICB1MzIgbm9kZV90YWJfc2l6ZSwgdTMyICpwdV9udW1fbm9kZXMsCisJCQkgICB1MzIgKnB1X2FsbG9jYXRlZCkKK3sKKwlzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlOworCXUzMiBpOworCWludCBzdGF0dXMgPSAwOworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShub2RlX3RhYiAhPSBOVUxMIHx8IG5vZGVfdGFiX3NpemUgPT0gMCk7CisJREJDX1JFUVVJUkUocHVfbnVtX25vZGVzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHB1X2FsbG9jYXRlZCAhPSBOVUxMKTsKKworCWlmICghaG5vZGVfbWdyKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwltdXRleF9sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworCisJaWYgKGhub2RlX21nci0+bnVtX25vZGVzID4gbm9kZV90YWJfc2l6ZSkgeworCQkqcHVfYWxsb2NhdGVkID0gaG5vZGVfbWdyLT5udW1fbm9kZXM7CisJCSpwdV9udW1fbm9kZXMgPSAwOworCQlzdGF0dXMgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCWhub2RlID0gKHN0cnVjdCBub2RlX29iamVjdCAqKWxzdF9maXJzdChobm9kZV9tZ3ItPgorCQkJbm9kZV9saXN0KTsKKwkJZm9yIChpID0gMDsgaSA8IGhub2RlX21nci0+bnVtX25vZGVzOyBpKyspIHsKKwkJCURCQ19BU1NFUlQoaG5vZGUpOworCQkJbm9kZV90YWJbaV0gPSBobm9kZTsKKwkJCWhub2RlID0gKHN0cnVjdCBub2RlX29iamVjdCAqKWxzdF9uZXh0CisJCQkJKGhub2RlX21nci0+bm9kZV9saXN0LAorCQkJCShzdHJ1Y3QgbGlzdF9oZWFkICopaG5vZGUpOworCQl9CisJCSpwdV9hbGxvY2F0ZWQgPSAqcHVfbnVtX25vZGVzID0gaG5vZGVfbWdyLT5udW1fbm9kZXM7CisJfQorCS8qIGVuZCBvZiBzeW5jX2VudGVyX2NzICovCisJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJbXV0ZXhfdW5sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiBOT0RFIG1vZHVsZS4KKyAqLwordm9pZCBub2RlX2V4aXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlyZWZzLS07CisKKwlEQkNfRU5TVVJFKHJlZnMgPj0gMCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9mcmVlX21zZ19idWYgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGcmVlcyB0aGUgbWVzc2FnZSBidWZmZXIuCisgKi8KK2ludCBub2RlX2ZyZWVfbXNnX2J1ZihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1OCAqIHBidWZmZXIsCisJCQkgICAgIHN0cnVjdCBkc3BfYnVmZmVyYXR0ciAqcGF0dHIpCit7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpwbm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilobm9kZTsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgcHJvY19pZDsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGJ1ZmZlciAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwbm9kZSAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwbm9kZS0+eGxhdG9yICE9IE5VTEwpOworCisJaWYgKCFobm9kZSkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQocG5vZGUtPmhwcm9jZXNzb3IsICZwcm9jX2lkKTsKKwlpZiAocHJvY19pZCA9PSBEU1BfVU5JVCkgeworCQlpZiAoIXN0YXR1cykgeworCQkJaWYgKHBhdHRyID09IE5VTEwpIHsKKwkJCQkvKiBzZXQgZGVmYXVsdHMgKi8KKwkJCQlwYXR0ciA9ICZub2RlX2RmbHRidWZhdHRyczsKKwkJCX0KKwkJCS8qIE5vZGUgc3VwcG9ydHMgc2luZ2xlIFNNIHNlZ21lbnQgb25seSAqLworCQkJaWYgKHBhdHRyLT5zZWdtZW50X2lkICE9IDEpCisJCQkJc3RhdHVzID0gLUVCQURSOworCisJCQkvKiBwYnVmZmVyIGlzIGNsaWVudHMgVmEuICovCisJCQlzdGF0dXMgPSBjbW1feGxhdG9yX2ZyZWVfYnVmKHBub2RlLT54bGF0b3IsIHBidWZmZXIpOworCQl9CisJfSBlbHNlIHsKKwkJREJDX0FTU0VSVChOVUxMKTsJLyogQlVHICovCisJfQorZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9hdHRyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQ29weSB0aGUgY3VycmVudCBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIGEgZHNwX25vZGVhdHRyCisgKiAgICAgIHN0cnVjdHVyZS4KKyAqLworaW50IG5vZGVfZ2V0X2F0dHIoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCSBzdHJ1Y3QgZHNwX25vZGVhdHRyICpwYXR0ciwgdTMyIGF0dHJfc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21ncjsKKwlpbnQgc3RhdHVzID0gMDsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGF0dHIgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoYXR0cl9zaXplID49IHNpemVvZihzdHJ1Y3QgZHNwX25vZGVhdHRyKSk7CisKKwlpZiAoIWhub2RlKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKwkJLyogRW50ZXIgaG5vZGVfbWdyIGNyaXRpY2FsIHNlY3Rpb24gKHNpbmNlIHdlJ3JlIGFjY2Vzc2luZworCQkgKiBkYXRhIHRoYXQgY291bGQgYmUgY2hhbmdlZCBieSBub2RlX2NoYW5nZV9wcmlvcml0eSgpIGFuZAorCQkgKiBub2RlX2Nvbm5lY3QoKS4gKi8KKwkJbXV0ZXhfbG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKwkJcGF0dHItPmNiX3N0cnVjdCA9IHNpemVvZihzdHJ1Y3QgZHNwX25vZGVhdHRyKTsKKwkJLyogZHNwX25vZGVhdHRyaW4gKi8KKwkJcGF0dHItPmluX25vZGVfYXR0cl9pbi5jYl9zdHJ1Y3QgPQorCQkJCSBzaXplb2Yoc3RydWN0IGRzcF9ub2RlYXR0cmluKTsKKwkJcGF0dHItPmluX25vZGVfYXR0cl9pbi5wcmlvID0gaG5vZGUtPnByaW87CisJCXBhdHRyLT5pbl9ub2RlX2F0dHJfaW4udXRpbWVvdXQgPSBobm9kZS0+dXRpbWVvdXQ7CisJCXBhdHRyLT5pbl9ub2RlX2F0dHJfaW4uaGVhcF9zaXplID0KKwkJCWhub2RlLT5jcmVhdGVfYXJncy5hc2EudGFza19hcmdfb2JqLmhlYXBfc2l6ZTsKKwkJcGF0dHItPmluX25vZGVfYXR0cl9pbi5wZ3BwX3ZpcnRfYWRkciA9ICh2b2lkICopCisJCQlobm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iai51Z3BwX2hlYXBfYWRkcjsKKwkJcGF0dHItPm5vZGVfYXR0cl9pbnB1dHMgPSBobm9kZS0+bnVtX2dwcF9pbnB1dHM7CisJCXBhdHRyLT5ub2RlX2F0dHJfb3V0cHV0cyA9IGhub2RlLT5udW1fZ3BwX291dHB1dHM7CisJCS8qIGRzcF9ub2RlaW5mbyAqLworCQlnZXRfbm9kZV9pbmZvKGhub2RlLCAmKHBhdHRyLT5ub2RlX2luZm8pKTsKKwkJLyogZW5kIG9mIHN5bmNfZW50ZXJfY3MgKi8KKwkJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uICovCisJCW11dGV4X3VubG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9jaGFubmVsX2lkID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgR2V0IHRoZSBjaGFubmVsIGluZGV4IHJlc2VydmVkIGZvciBhIHN0cmVhbSBjb25uZWN0aW9uIGJldHdlZW4gdGhlCisgKiAgICAgIGhvc3QgYW5kIGEgbm9kZS4KKyAqLworaW50IG5vZGVfZ2V0X2NoYW5uZWxfaWQoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyIGRpciwgdTMyIGluZGV4LAorCQkJICAgICAgIHUzMiAqY2hhbl9pZCkKK3sKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGU7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGRpciA9PSBEU1BfVE9OT0RFIHx8IGRpciA9PSBEU1BfRlJPTU5PREUpOworCURCQ19SRVFVSVJFKGNoYW5faWQgIT0gTlVMTCk7CisKKwlpZiAoIWhub2RlKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCXJldHVybiBzdGF0dXM7CisJfQorCW5vZGVfdHlwZSA9IG5vZGVfZ2V0X3R5cGUoaG5vZGUpOworCWlmIChub2RlX3R5cGUgIT0gTk9ERV9UQVNLICYmIG5vZGVfdHlwZSAhPSBOT0RFX0RBSVNTT0NLRVQpIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAoZGlyID09IERTUF9UT05PREUpIHsKKwkJaWYgKGluZGV4IDwgTUFYX0lOUFVUUyhobm9kZSkpIHsKKwkJCWlmIChobm9kZS0+aW5wdXRzW2luZGV4XS50eXBlID09IEhPU1RDT05ORUNUKSB7CisJCQkJKmNoYW5faWQgPSBobm9kZS0+aW5wdXRzW2luZGV4XS5kZXZfaWQ7CisJCQkJc3RhdHVzID0gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCURCQ19BU1NFUlQoZGlyID09IERTUF9GUk9NTk9ERSk7CisJCWlmIChpbmRleCA8IE1BWF9PVVRQVVRTKGhub2RlKSkgeworCQkJaWYgKGhub2RlLT5vdXRwdXRzW2luZGV4XS50eXBlID09IEhPU1RDT05ORUNUKSB7CisJCQkJKmNoYW5faWQgPSBobm9kZS0+b3V0cHV0c1tpbmRleF0uZGV2X2lkOworCQkJCXN0YXR1cyA9IDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9tZXNzYWdlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgYSBtZXNzYWdlIGZyb20gYSBub2RlIG9uIHRoZSBEU1AuCisgKi8KK2ludCBub2RlX2dldF9tZXNzYWdlKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkgICAgc3RydWN0IGRzcF9tc2cgKm1lc3NhZ2UsIHUzMiB1dGltZW91dCkKK3sKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21ncjsKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGU7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJaW50IHN0YXR1cyA9IDA7CisJdm9pZCAqdG1wX2J1ZjsKKwlzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlIHByb2Nfc3RhdGU7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpocHJvY2Vzc29yOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKG1lc3NhZ2UgIT0gTlVMTCk7CisKKwlpZiAoIWhub2RlKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCWhwcm9jZXNzb3IgPSBobm9kZS0+aHByb2Nlc3NvcjsKKwlzdGF0dXMgPSBwcm9jX2dldF9zdGF0ZShocHJvY2Vzc29yLCAmcHJvY19zdGF0ZSwKKwkJCQlzaXplb2Yoc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZSkpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisJLyogSWYgcHJvY2Vzc29yIGlzIGluIGVycm9yIHN0YXRlIHRoZW4gZG9uJ3QgYXR0ZW1wdCB0byBnZXQgdGhlCisJICAgbWVzc2FnZSAqLworCWlmIChwcm9jX3N0YXRlLnByb2Nfc3RhdGUgPT0gUFJPQ19FUlJPUikgeworCQlzdGF0dXMgPSAtRVBFUk07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCWhub2RlX21nciA9IGhub2RlLT5obm9kZV9tZ3I7CisJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShobm9kZSk7CisJaWYgKG5vZGVfdHlwZSAhPSBOT0RFX01FU1NBR0UgJiYgbm9kZV90eXBlICE9IE5PREVfVEFTSyAmJgorCSAgICBub2RlX3R5cGUgIT0gTk9ERV9EQUlTU09DS0VUKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJLyogIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bmxlc3MgYSBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gU2luY2UKKwkgKiAgRFNQTm9kZV9SZWdpc3Rlck5vdGlmeSgpIGFsbG93cyBub3RpZmljYXRpb24gd2hlbiBhIG1lc3NhZ2UKKwkgKiAgaXMgYXZhaWxhYmxlLCB0aGUgc3lzdGVtIGNhbiBiZSBkZXNpZ25lZCBzbyB0aGF0CisJICogIERTUE5vZGVfR2V0TWVzc2FnZSgpIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzCisJICogIGF2YWlsYWJsZS4gKi8KKwlpbnRmX2Z4bnMgPSBobm9kZV9tZ3ItPmludGZfZnhuczsKKwlzdGF0dXMgPQorCSAgICAoKmludGZfZnhucy0+cGZuX21zZ19nZXQpIChobm9kZS0+bXNnX3F1ZXVlX29iaiwgbWVzc2FnZSwgdXRpbWVvdXQpOworCS8qIENoZWNrIGlmIG1lc3NhZ2UgY29udGFpbnMgU00gZGVzY3JpcHRvciAqLworCWlmIChzdGF0dXMgfHwgIShtZXNzYWdlLT5kd19jbWQgJiBEU1BfUk1TQlVGREVTQykpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBUcmFuc2xhdGUgRFNQIGJ5dGUgYWRkciB0byBHUFAgVmEuICovCisJdG1wX2J1ZiA9IGNtbV94bGF0b3JfdHJhbnNsYXRlKGhub2RlLT54bGF0b3IsCisJCQkJICAgICAgICh2b2lkICopKG1lc3NhZ2UtPmR3X2FyZzEgKgorCQkJCQkJaG5vZGUtPmhub2RlX21nci0+CisJCQkJCQl1ZHNwX3dvcmRfc2l6ZSksIENNTV9EU1BQQTJQQSk7CisJaWYgKHRtcF9idWYgIT0gTlVMTCkgeworCQkvKiBub3cgY29udmVydCB0aGlzIEdQUCBQYSB0byBWYSAqLworCQl0bXBfYnVmID0gY21tX3hsYXRvcl90cmFuc2xhdGUoaG5vZGUtPnhsYXRvciwgdG1wX2J1ZiwKKwkJCQkJICAgICAgIENNTV9QQTJWQSk7CisJCWlmICh0bXBfYnVmICE9IE5VTEwpIHsKKwkJCS8qIEFkanVzdCBTTSBzaXplIGluIG1zZyAqLworCQkJbWVzc2FnZS0+ZHdfYXJnMSA9ICh1MzIpIHRtcF9idWY7CisJCQltZXNzYWdlLT5kd19hcmcyICo9IGhub2RlLT5obm9kZV9tZ3ItPnVkc3Bfd29yZF9zaXplOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVTUkNIOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVTUkNIOworCX0KK2Z1bmNfZW5kOgorCWRldl9kYmcoYnJpZGdlLCAiJXM6IGhub2RlOiAlcCBtZXNzYWdlOiAlcCB1dGltZW91dDogMHgleFxuIiwgX19mdW5jX18sCisJCWhub2RlLCBtZXNzYWdlLCB1dGltZW91dCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICAgPT09PT09PT0gbm9kZV9nZXRfbmxkcl9vYmogPT09PT09PT0KKyAqLworaW50IG5vZGVfZ2V0X25sZHJfb2JqKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyLAorCQkJICAgICBzdHJ1Y3Qgbmxkcl9vYmplY3QgKipubGRyX292bHlvYmopCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IG5vZGVfbWdyICpub2RlX21ncl9vYmogPSBobm9kZV9tZ3I7CisJREJDX1JFUVVJUkUobmxkcl9vdmx5b2JqICE9IE5VTEwpOworCisJaWYgKCFobm9kZV9tZ3IpCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJZWxzZQorCQkqbmxkcl9vdmx5b2JqID0gbm9kZV9tZ3Jfb2JqLT5ubGRyX29iajsKKworCURCQ19FTlNVUkUoIXN0YXR1cyB8fCAobmxkcl9vdmx5b2JqICE9IE5VTEwgJiYgKm5sZHJfb3ZseW9iaiA9PSBOVUxMKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9zdHJtX21nciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybnMgdGhlIFN0cmVhbSBtYW5hZ2VyLgorICovCitpbnQgbm9kZV9nZXRfc3RybV9tZ3Ioc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCSAgICAgc3RydWN0IHN0cm1fbWdyICoqc3RybV9tYW4pCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIWhub2RlKQorCQlzdGF0dXMgPSAtRUZBVUxUOworCWVsc2UKKwkJKnN0cm1fbWFuID0gaG5vZGUtPmhub2RlX21nci0+c3RybV9tZ3Jfb2JqOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF9sb2FkX3R5cGUgPT09PT09PT0KKyAqLworZW51bSBubGRyX2xvYWR0eXBlIG5vZGVfZ2V0X2xvYWRfdHlwZShzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShobm9kZSk7CisJaWYgKCFobm9kZSkgeworCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQuIGhub2RlOiAlcFxuIiwgX19mdW5jX18sIGhub2RlKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXJldHVybiBobm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLnVzX2xvYWRfdHlwZTsKKwl9Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9nZXRfdGltZW91dCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHVybnMgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoaXMgbm9kZS4KKyAqLwordTMyIG5vZGVfZ2V0X3RpbWVvdXQoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaG5vZGUpOworCWlmICghaG5vZGUpIHsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogZmFpbGVkLiBobm9kZTogJXBcbiIsIF9fZnVuY19fLCBobm9kZSk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiBobm9kZS0+dXRpbWVvdXQ7CisJfQorfQorCisvKgorICogID09PT09PT09IG5vZGVfZ2V0X3R5cGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm5zIHRoZSBub2RlIHR5cGUuCisgKi8KK2VudW0gbm9kZV90eXBlIG5vZGVfZ2V0X3R5cGUoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSkKK3sKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGU7CisKKwlpZiAoaG5vZGUgPT0gKHN0cnVjdCBub2RlX29iamVjdCAqKURTUF9IR1BQTk9ERSkKKwkJbm9kZV90eXBlID0gTk9ERV9HUFA7CisJZWxzZSB7CisJCWlmICghaG5vZGUpCisJCQlub2RlX3R5cGUgPSAtMTsKKwkJZWxzZQorCQkJbm9kZV90eXBlID0gaG5vZGUtPm50eXBlOworCX0KKwlyZXR1cm4gbm9kZV90eXBlOworfQorCisvKgorICogID09PT09PT09IG5vZGVfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgdGhlIE5PREUgbW9kdWxlLgorICovCitib29sIG5vZGVfaW5pdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlyZWZzKys7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX29uX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBHZXRzIGNhbGxlZCB3aGVuIFJNU19FWElUIGlzIHJlY2VpdmVkIGZvciBhIG5vZGUuCisgKi8KK3ZvaWQgbm9kZV9vbl9leGl0KHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHMzMiBub2RlX3N0YXR1cykKK3sKKwlpZiAoIWhub2RlKQorCQlyZXR1cm47CisKKwkvKiBTZXQgbm9kZSBzdGF0ZSB0byBkb25lICovCisJTk9ERV9TRVRfU1RBVEUoaG5vZGUsIE5PREVfRE9ORSk7CisJaG5vZGUtPmV4aXRfc3RhdHVzID0gbm9kZV9zdGF0dXM7CisJaWYgKGhub2RlLT5sb2FkZWQgJiYgaG5vZGUtPnBoYXNlX3NwbGl0KSB7CisJCSh2b2lkKWhub2RlLT5obm9kZV9tZ3ItPm5sZHJfZnhucy5wZm5fdW5sb2FkKGhub2RlLT4KKwkJCQkJCQkgICAgIG5sZHJfbm9kZV9vYmosCisJCQkJCQkJICAgICBOTERSX0VYRUNVVEUpOworCQlobm9kZS0+bG9hZGVkID0gZmFsc2U7CisJfQorCS8qIFVuYmxvY2sgY2FsbCB0byBub2RlX3Rlcm1pbmF0ZSAqLworCSh2b2lkKXN5bmNfc2V0X2V2ZW50KGhub2RlLT5zeW5jX2RvbmUpOworCS8qIE5vdGlmeSBjbGllbnRzICovCisJcHJvY19ub3RpZnlfY2xpZW50cyhobm9kZS0+aHByb2Nlc3NvciwgRFNQX05PREVTVEFURUNIQU5HRSk7CisJbnRmeV9ub3RpZnkoaG5vZGUtPm50Znlfb2JqLCBEU1BfTk9ERVNUQVRFQ0hBTkdFKTsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX3BhdXNlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU3VzcGVuZCBleGVjdXRpb24gb2YgYSBub2RlIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoZSBEU1AuCisgKi8KK2ludCBub2RlX3BhdXNlKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUpCit7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpwbm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilobm9kZTsKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGU7CisJZW51bSBub2RlX3N0YXRlIHN0YXRlOworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyOworCWludCBzdGF0dXMgPSAwOworCXUzMiBwcm9jX2lkOworCXN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgcHJvY19zdGF0ZTsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKmhwcm9jZXNzb3I7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIWhub2RlKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShobm9kZSk7CisJCWlmIChub2RlX3R5cGUgIT0gTk9ERV9UQVNLICYmIG5vZGVfdHlwZSAhPSBOT0RFX0RBSVNTT0NLRVQpCisJCQlzdGF0dXMgPSAtRVBFUk07CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQocG5vZGUtPmhwcm9jZXNzb3IsICZwcm9jX2lkKTsKKworCWlmIChwcm9jX2lkID09IElWQV9VTklUKQorCQlzdGF0dXMgPSAtRU5PU1lTOworCisJaWYgKCFzdGF0dXMpIHsKKwkJaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKworCQkvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisJCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJCXN0YXRlID0gbm9kZV9nZXRfc3RhdGUoaG5vZGUpOworCQkvKiBDaGVjayBub2RlIHN0YXRlICovCisJCWlmIChzdGF0ZSAhPSBOT0RFX1JVTk5JTkcpCisJCQlzdGF0dXMgPSAtRUJBRFI7CisKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZnVuY19jb250OworCQlocHJvY2Vzc29yID0gaG5vZGUtPmhwcm9jZXNzb3I7CisJCXN0YXR1cyA9IHByb2NfZ2V0X3N0YXRlKGhwcm9jZXNzb3IsICZwcm9jX3N0YXRlLAorCQkJCXNpemVvZihzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlKSk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGZ1bmNfY29udDsKKwkJLyogSWYgcHJvY2Vzc29yIGlzIGluIGVycm9yIHN0YXRlIHRoZW4gZG9uJ3QgYXR0ZW1wdAorCQkgICB0byBzZW5kIHRoZSBtZXNzYWdlICovCisJCWlmIChwcm9jX3N0YXRlLnByb2Nfc3RhdGUgPT0gUFJPQ19FUlJPUikgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJZ290byBmdW5jX2NvbnQ7CisJCX0KKworCQlzdGF0dXMgPSBkaXNwX25vZGVfY2hhbmdlX3ByaW9yaXR5KGhub2RlX21nci0+ZGlzcF9vYmosIGhub2RlLAorCQkJaG5vZGVfbWdyLT51bF9meG5fYWRkcnNbUk1TQ0hBTkdFTk9ERVBSSU9SSVRZXSwKKwkJCWhub2RlLT5ub2RlX2VudiwgTk9ERV9TVVNQRU5ERURQUkkpOworCisJCS8qIFVwZGF0ZSBzdGF0ZSAqLworCQlpZiAoc3RhdHVzID49IDApCisJCQlOT0RFX1NFVF9TVEFURShobm9kZSwgTk9ERV9QQVVTRUQpOworCitmdW5jX2NvbnQ6CisJCS8qIEVuZCBvZiBzeW5jX2VudGVyX2NzICovCisJCS8qIExlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwkJbXV0ZXhfdW5sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCXByb2Nfbm90aWZ5X2NsaWVudHMoaG5vZGUtPmhwcm9jZXNzb3IsCisJCQkJCSAgICBEU1BfTk9ERVNUQVRFQ0hBTkdFKTsKKwkJCW50Znlfbm90aWZ5KGhub2RlLT5udGZ5X29iaiwgRFNQX05PREVTVEFURUNIQU5HRSk7CisJCX0KKwl9CitmdW5jX2VuZDoKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBobm9kZTogJXAgc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCBobm9kZSwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5vZGVfcHV0X21lc3NhZ2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZW5kIGEgbWVzc2FnZSB0byBhIG1lc3NhZ2Ugbm9kZSwgdGFzayBub2RlLCBvciBYREFJUyBzb2NrZXQgbm9kZS4gVGhpcworICogICAgICBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIHRoZSBtZXNzYWdlIHN0cmVhbSBjYW4gYWNjb21tb2RhdGUgdGhlCisgKiAgICAgIG1lc3NhZ2UsIG9yIGEgdGltZW91dCBvY2N1cnMuCisgKi8KK2ludCBub2RlX3B1dF9tZXNzYWdlKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkgICAgY29uc3Qgc3RydWN0IGRzcF9tc2cgKnBtc2csIHUzMiB1dGltZW91dCkKK3sKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21nciA9IE5VTEw7CisJZW51bSBub2RlX3R5cGUgbm9kZV90eXBlOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCWVudW0gbm9kZV9zdGF0ZSBzdGF0ZTsKKwlpbnQgc3RhdHVzID0gMDsKKwl2b2lkICp0bXBfYnVmOworCXN0cnVjdCBkc3BfbXNnIG5ld19tc2c7CisJc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZSBwcm9jX3N0YXRlOworCXN0cnVjdCBwcm9jX29iamVjdCAqaHByb2Nlc3NvcjsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShwbXNnICE9IE5VTEwpOworCisJaWYgKCFobm9kZSkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlocHJvY2Vzc29yID0gaG5vZGUtPmhwcm9jZXNzb3I7CisJc3RhdHVzID0gcHJvY19nZXRfc3RhdGUoaHByb2Nlc3NvciwgJnByb2Nfc3RhdGUsCisJCQkJc2l6ZW9mKHN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUpKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCS8qIElmIHByb2Nlc3NvciBpcyBpbiBiYWQgc3RhdGUgdGhlbiBkb24ndCBhdHRlbXB0IHNlbmRpbmcgdGhlCisJICAgbWVzc2FnZSAqLworCWlmIChwcm9jX3N0YXRlLnByb2Nfc3RhdGUgPT0gUFJPQ19FUlJPUikgeworCQlzdGF0dXMgPSAtRVBFUk07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCWhub2RlX21nciA9IGhub2RlLT5obm9kZV9tZ3I7CisJbm9kZV90eXBlID0gbm9kZV9nZXRfdHlwZShobm9kZSk7CisJaWYgKG5vZGVfdHlwZSAhPSBOT0RFX01FU1NBR0UgJiYgbm9kZV90eXBlICE9IE5PREVfVEFTSyAmJgorCSAgICBub2RlX3R5cGUgIT0gTk9ERV9EQUlTU09DS0VUKQorCQlzdGF0dXMgPSAtRVBFUk07CisKKwlpZiAoIXN0YXR1cykgeworCQkvKiAgQ2hlY2sgbm9kZSBzdGF0ZS4gQ2FuJ3Qgc2VuZCBtZXNzYWdlcyB0byBhIG5vZGUgYWZ0ZXIKKwkJICogIHdlJ3ZlIHNlbnQgdGhlIFJNU19FWElUIGNvbW1hbmQuIFRoZXJlIGlzIHN0aWxsIHRoZQorCQkgKiAgcG9zc2liaWxpdHkgdGhhdCBub2RlX3Rlcm1pbmF0ZSBjYW4gYmUgY2FsbGVkIGFmdGVyIHdlJ3ZlCisJCSAqICBjaGVja2VkIHRoZSBzdGF0ZS4gQ291bGQgYWRkIGFub3RoZXIgU1lOQyBvYmplY3QgdG8KKwkJICogIHByZXZlbnQgdGhpcyAoY2FuJ3QgdXNlIG5vZGVfbWdyX2xvY2ssIHNpbmNlIHdlIGRvbid0CisJCSAqICB3YW50IHRvIGJsb2NrIG90aGVyIE5PREUgZnVuY3Rpb25zKS4gSG93ZXZlciwgdGhlIG5vZGUgbWF5CisJCSAqICBzdGlsbCBleGl0IG9uIGl0cyBvd24sIGJlZm9yZSB0aGlzIG1lc3NhZ2UgaXMgc2VudC4gKi8KKwkJbXV0ZXhfbG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKwkJc3RhdGUgPSBub2RlX2dldF9zdGF0ZShobm9kZSk7CisJCWlmIChzdGF0ZSA9PSBOT0RFX1RFUk1JTkFUSU5HIHx8IHN0YXRlID09IE5PREVfRE9ORSkKKwkJCXN0YXR1cyA9IC1FQkFEUjsKKworCQkvKiBlbmQgb2Ygc3luY19lbnRlcl9jcyAqLworCQltdXRleF91bmxvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBhc3NpZ24gcG1zZyB2YWx1ZXMgdG8gbmV3IG1zZyAqLworCW5ld19tc2cgPSAqcG1zZzsKKwkvKiBOb3csIGNoZWNrIGlmIG1lc3NhZ2UgY29udGFpbnMgYSBTTSBidWZmZXIgZGVzY3JpcHRvciAqLworCWlmIChwbXNnLT5kd19jbWQgJiBEU1BfUk1TQlVGREVTQykgeworCQkvKiBUcmFuc2xhdGUgR1BQIFZhIHRvIERTUCBwaHlzaWNhbCBidWYgUHRyLiAqLworCQl0bXBfYnVmID0gY21tX3hsYXRvcl90cmFuc2xhdGUoaG5vZGUtPnhsYXRvciwKKwkJCQkJICAgICAgICh2b2lkICopbmV3X21zZy5kd19hcmcxLAorCQkJCQkgICAgICAgQ01NX1ZBMkRTUFBBKTsKKwkJaWYgKHRtcF9idWYgIT0gTlVMTCkgeworCQkJLyogZ290IHRyYW5zbGF0aW9uLCBjb252ZXJ0IHRvIE1BVXMgaW4gbXNnICovCisJCQlpZiAoaG5vZGUtPmhub2RlX21nci0+dWRzcF93b3JkX3NpemUgIT0gMCkgeworCQkJCW5ld19tc2cuZHdfYXJnMSA9CisJCQkJICAgICh1MzIpIHRtcF9idWYgLworCQkJCSAgICBobm9kZS0+aG5vZGVfbWdyLT51ZHNwX3dvcmRfc2l6ZTsKKwkJCQkvKiBNQVVzICovCisJCQkJbmV3X21zZy5kd19hcmcyIC89IGhub2RlLT5obm9kZV9tZ3ItPgorCQkJCSAgICB1ZHNwX3dvcmRfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCIlczogdWRzcF93b3JkX3NpemUgaXMgemVybyFcbiIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQlzdGF0dXMgPSAtRVBFUk07CS8qIGJhZCBEU1BXb3JkU2l6ZSAqLworCQkJfQorCQl9IGVsc2UgewkvKiBmYWlsZWQgdG8gdHJhbnNsYXRlIGJ1ZmZlciBhZGRyZXNzICovCisJCQlzdGF0dXMgPSAtRVNSQ0g7CisJCX0KKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJaW50Zl9meG5zID0gaG5vZGVfbWdyLT5pbnRmX2Z4bnM7CisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fbXNnX3B1dCkgKGhub2RlLT5tc2dfcXVldWVfb2JqLAorCQkJCQkJICAgICZuZXdfbXNnLCB1dGltZW91dCk7CisJfQorZnVuY19lbmQ6CisJZGV2X2RiZyhicmlkZ2UsICIlczogaG5vZGU6ICVwIHBtc2c6ICVwIHV0aW1lb3V0OiAweCV4LCAiCisJCSJzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIGhub2RlLCBwbXNnLCB1dGltZW91dCwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG5vZGVfcmVnaXN0ZXJfbm90aWZ5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVnaXN0ZXIgdG8gYmUgbm90aWZpZWQgb24gc3BlY2lmaWMgZXZlbnRzIGZvciB0aGlzIG5vZGUuCisgKi8KK2ludCBub2RlX3JlZ2lzdGVyX25vdGlmeShzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgZXZlbnRfbWFzaywKKwkJCQl1MzIgbm90aWZ5X3R5cGUsCisJCQkJc3RydWN0IGRzcF9ub3RpZmljYXRpb24gKmhub3RpZmljYXRpb24pCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaG5vdGlmaWNhdGlvbiAhPSBOVUxMKTsKKworCWlmICghaG5vZGUpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQkvKiBDaGVjayBpZiBldmVudCBtYXNrIGlzIGEgdmFsaWQgbm9kZSByZWxhdGVkIGV2ZW50ICovCisJCWlmIChldmVudF9tYXNrICYgfihEU1BfTk9ERVNUQVRFQ0hBTkdFIHwgRFNQX05PREVNRVNTQUdFUkVBRFkpKQorCQkJc3RhdHVzID0gLUVJTlZBTDsKKworCQkvKiBDaGVjayBpZiBub3RpZnkgdHlwZSBpcyB2YWxpZCAqLworCQlpZiAobm90aWZ5X3R5cGUgIT0gRFNQX1NJR05BTEVWRU5UKQorCQkJc3RhdHVzID0gLUVJTlZBTDsKKworCQkvKiBPbmx5IG9uZSBOb3RpZmljYXRpb24gY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYQorCQkgKiB0aW1lIC0gTGltaXRhdGlvbiAqLworCQlpZiAoZXZlbnRfbWFzayA9PSAoRFNQX05PREVTVEFURUNIQU5HRSB8IERTUF9OT0RFTUVTU0FHRVJFQURZKSkKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCWlmICghc3RhdHVzKSB7CisJCWlmIChldmVudF9tYXNrID09IERTUF9OT0RFU1RBVEVDSEFOR0UpIHsKKwkJCXN0YXR1cyA9IG50ZnlfcmVnaXN0ZXIoaG5vZGUtPm50Znlfb2JqLCBobm90aWZpY2F0aW9uLAorCQkJCQkgICAgICAgZXZlbnRfbWFzayAmIERTUF9OT0RFU1RBVEVDSEFOR0UsCisJCQkJCSAgICAgICBub3RpZnlfdHlwZSk7CisJCX0gZWxzZSB7CisJCQkvKiBTZW5kIE1lc3NhZ2UgcGFydCBvZiBldmVudCBtYXNrIHRvIG1zZ19jdHJsICovCisJCQlpbnRmX2Z4bnMgPSBobm9kZS0+aG5vZGVfbWdyLT5pbnRmX2Z4bnM7CisJCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX21zZ19yZWdpc3Rlcl9ub3RpZnkpCisJCQkgICAgKGhub2RlLT5tc2dfcXVldWVfb2JqLAorCQkJICAgICBldmVudF9tYXNrICYgRFNQX05PREVNRVNTQUdFUkVBRFksIG5vdGlmeV90eXBlLAorCQkJICAgICBobm90aWZpY2F0aW9uKTsKKwkJfQorCisJfQorCWRldl9kYmcoYnJpZGdlLCAiJXM6IGhub2RlOiAlcCBldmVudF9tYXNrOiAweCV4IG5vdGlmeV90eXBlOiAweCV4ICIKKwkJImhub3RpZmljYXRpb246ICVwIHN0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgaG5vZGUsCisJCWV2ZW50X21hc2ssIG5vdGlmeV90eXBlLCBobm90aWZpY2F0aW9uLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbm9kZV9ydW4gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTdGFydCBleGVjdXRpb24gb2YgYSBub2RlJ3MgZXhlY3V0ZSBwaGFzZSwgb3IgcmVzdW1lIGV4ZWN1dGlvbiBvZiBhIG5vZGUKKyAqICAgICAgdGhhdCBoYXMgYmVlbiBzdXNwZW5kZWQgKHZpYSBOT0RFX05vZGVQYXVzZSgpKSBvbiB0aGUgRFNQLiBMb2FkIHRoZQorICogICAgICBub2RlJ3MgZXhlY3V0ZSBmdW5jdGlvbiBpZiBuZWNlc3NhcnkuCisgKi8KK2ludCBub2RlX3J1bihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlKQoreworCXN0cnVjdCBub2RlX29iamVjdCAqcG5vZGUgPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopaG5vZGU7CisJc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3I7CisJZW51bSBub2RlX3R5cGUgbm9kZV90eXBlOworCWVudW0gbm9kZV9zdGF0ZSBzdGF0ZTsKKwl1MzIgdWxfZXhlY3V0ZV9meG47CisJdTMyIHVsX2Z4bl9hZGRyOworCWludCBzdGF0dXMgPSAwOworCXUzMiBwcm9jX2lkOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgcHJvY19zdGF0ZTsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKmhwcm9jZXNzb3I7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIWhub2RlKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCWhwcm9jZXNzb3IgPSBobm9kZS0+aHByb2Nlc3NvcjsKKwlzdGF0dXMgPSBwcm9jX2dldF9zdGF0ZShocHJvY2Vzc29yLCAmcHJvY19zdGF0ZSwKKwkJCQlzaXplb2Yoc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZSkpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisJLyogSWYgcHJvY2Vzc29yIGlzIGluIGVycm9yIHN0YXRlIHRoZW4gZG9uJ3QgYXR0ZW1wdCB0byBydW4gdGhlIG5vZGUgKi8KKwlpZiAocHJvY19zdGF0ZS5wcm9jX3N0YXRlID09IFBST0NfRVJST1IpIHsKKwkJc3RhdHVzID0gLUVQRVJNOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlub2RlX3R5cGUgPSBub2RlX2dldF90eXBlKGhub2RlKTsKKwlpZiAobm9kZV90eXBlID09IE5PREVfREVWSUNFKQorCQlzdGF0dXMgPSAtRVBFUk07CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCWhub2RlX21nciA9IGhub2RlLT5obm9kZV9tZ3I7CisJaWYgKCFobm9kZV9tZ3IpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaW50Zl9meG5zID0gaG5vZGVfbWdyLT5pbnRmX2Z4bnM7CisJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisKKwlzdGF0ZSA9IG5vZGVfZ2V0X3N0YXRlKGhub2RlKTsKKwlpZiAoc3RhdGUgIT0gTk9ERV9DUkVBVEVEICYmIHN0YXRlICE9IE5PREVfUEFVU0VEKQorCQlzdGF0dXMgPSAtRUJBRFI7CisKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gcHJvY19nZXRfcHJvY2Vzc29yX2lkKHBub2RlLT5ocHJvY2Vzc29yLCAmcHJvY19pZCk7CisKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfY29udDE7CisKKwlpZiAoKHByb2NfaWQgIT0gRFNQX1VOSVQpICYmIChwcm9jX2lkICE9IElWQV9VTklUKSkKKwkJZ290byBmdW5jX2NvbnQxOworCisJaWYgKHN0YXRlID09IE5PREVfQ1JFQVRFRCkgeworCQkvKiBJZiBub2RlJ3MgZXhlY3V0ZSBmdW5jdGlvbiBpcyBub3QgbG9hZGVkLCBsb2FkIGl0ICovCisJCWlmICghKGhub2RlLT5sb2FkZWQpICYmIGhub2RlLT5waGFzZV9zcGxpdCkgeworCQkJc3RhdHVzID0KKwkJCSAgICBobm9kZV9tZ3ItPm5sZHJfZnhucy5wZm5fbG9hZChobm9kZS0+bmxkcl9ub2RlX29iaiwKKwkJCQkJCQkgIE5MRFJfRVhFQ1VURSk7CisJCQlpZiAoIXN0YXR1cykgeworCQkJCWhub2RlLT5sb2FkZWQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlwcl9lcnIoIiVzOiBmYWlsIC0gbG9hZCBleGVjdXRlIGNvZGU6IDB4JXhcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQkJfQorCQl9CisJCWlmICghc3RhdHVzKSB7CisJCQkvKiBHZXQgYWRkcmVzcyBvZiBub2RlJ3MgZXhlY3V0ZSBmdW5jdGlvbiAqLworCQkJaWYgKHByb2NfaWQgPT0gSVZBX1VOSVQpCisJCQkJdWxfZXhlY3V0ZV9meG4gPSAodTMyKSBobm9kZS0+bm9kZV9lbnY7CisJCQllbHNlIHsKKwkJCQlzdGF0dXMgPSBnZXRfZnhuX2FkZHJlc3MoaG5vZGUsICZ1bF9leGVjdXRlX2Z4biwKKwkJCQkJCQkgRVhFQ1VURVBIQVNFKTsKKwkJCX0KKwkJfQorCQlpZiAoIXN0YXR1cykgeworCQkJdWxfZnhuX2FkZHIgPSBobm9kZV9tZ3ItPnVsX2Z4bl9hZGRyc1tSTVNFWEVDVVRFTk9ERV07CisJCQlzdGF0dXMgPQorCQkJICAgIGRpc3Bfbm9kZV9ydW4oaG5vZGVfbWdyLT5kaXNwX29iaiwgaG5vZGUsCisJCQkJCSAgdWxfZnhuX2FkZHIsIHVsX2V4ZWN1dGVfZnhuLAorCQkJCQkgIGhub2RlLT5ub2RlX2Vudik7CisJCX0KKwl9IGVsc2UgaWYgKHN0YXRlID09IE5PREVfUEFVU0VEKSB7CisJCXVsX2Z4bl9hZGRyID0gaG5vZGVfbWdyLT51bF9meG5fYWRkcnNbUk1TQ0hBTkdFTk9ERVBSSU9SSVRZXTsKKwkJc3RhdHVzID0gZGlzcF9ub2RlX2NoYW5nZV9wcmlvcml0eShobm9kZV9tZ3ItPmRpc3Bfb2JqLCBobm9kZSwKKwkJCQkJCSAgIHVsX2Z4bl9hZGRyLCBobm9kZS0+bm9kZV9lbnYsCisJCQkJCQkgICBOT0RFX0dFVF9QUklPUklUWShobm9kZSkpOworCX0gZWxzZSB7CisJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQlEQkNfQVNTRVJUKGZhbHNlKTsKKwl9CitmdW5jX2NvbnQxOgorCS8qIFVwZGF0ZSBub2RlIHN0YXRlLiAqLworCWlmIChzdGF0dXMgPj0gMCkKKwkJTk9ERV9TRVRfU1RBVEUoaG5vZGUsIE5PREVfUlVOTklORyk7CisJZWxzZQkJCS8qIFNldCBzdGF0ZSBiYWNrIHRvIHByZXZpb3VzIHZhbHVlICovCisJCU5PREVfU0VUX1NUQVRFKGhub2RlLCBzdGF0ZSk7CisJLypFbmQgb2Ygc3luY19lbnRlcl9jcyAqLworCS8qIEV4aXQgY3JpdGljYWwgc2VjdGlvbiAqLworCW11dGV4X3VubG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJcHJvY19ub3RpZnlfY2xpZW50cyhobm9kZS0+aHByb2Nlc3NvciwgRFNQX05PREVTVEFURUNIQU5HRSk7CisJCW50Znlfbm90aWZ5KGhub2RlLT5udGZ5X29iaiwgRFNQX05PREVTVEFURUNIQU5HRSk7CisJfQorZnVuY19lbmQ6CisJZGV2X2RiZyhicmlkZ2UsICIlczogaG5vZGU6ICVwIHN0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgaG5vZGUsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX3Rlcm1pbmF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFNpZ25hbCBhIG5vZGUgcnVubmluZyBvbiB0aGUgRFNQIHRoYXQgaXQgc2hvdWxkIGV4aXQgaXRzIGV4ZWN1dGUgcGhhc2UKKyAqICAgICAgZnVuY3Rpb24uCisgKi8KK2ludCBub2RlX3Rlcm1pbmF0ZShzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCBpbnQgKnBzdGF0dXMpCit7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpwbm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilobm9kZTsKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21nciA9IE5VTEw7CisJZW51bSBub2RlX3R5cGUgbm9kZV90eXBlOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCWVudW0gbm9kZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgZHNwX21zZyBtc2csIGtpbGxtc2c7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIHByb2NfaWQsIGtpbGxfdGltZV9vdXQ7CisJc3RydWN0IGRlaF9tZ3IgKmhkZWhfbWdyOworCXN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgcHJvY19zdGF0ZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShwc3RhdHVzICE9IE5VTEwpOworCisJaWYgKCFobm9kZSB8fCAhaG5vZGUtPmhub2RlX21ncikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlpZiAocG5vZGUtPmhwcm9jZXNzb3IgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQocG5vZGUtPmhwcm9jZXNzb3IsICZwcm9jX2lkKTsKKworCWlmICghc3RhdHVzKSB7CisJCWhub2RlX21nciA9IGhub2RlLT5obm9kZV9tZ3I7CisJCW5vZGVfdHlwZSA9IG5vZGVfZ2V0X3R5cGUoaG5vZGUpOworCQlpZiAobm9kZV90eXBlICE9IE5PREVfVEFTSyAmJiBub2RlX3R5cGUgIT0gTk9ERV9EQUlTU09DS0VUKQorCQkJc3RhdHVzID0gLUVQRVJNOworCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBDaGVjayBub2RlIHN0YXRlICovCisJCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJCXN0YXRlID0gbm9kZV9nZXRfc3RhdGUoaG5vZGUpOworCQlpZiAoc3RhdGUgIT0gTk9ERV9SVU5OSU5HKSB7CisJCQlzdGF0dXMgPSAtRUJBRFI7CisJCQkvKiBTZXQgdGhlIGV4aXQgc3RhdHVzIGlmIG5vZGUgdGVybWluYXRlZCBvbgorCQkJICogaXRzIG93bi4gKi8KKwkJCWlmIChzdGF0ZSA9PSBOT0RFX0RPTkUpCisJCQkJKnBzdGF0dXMgPSBobm9kZS0+ZXhpdF9zdGF0dXM7CisKKwkJfSBlbHNlIHsKKwkJCU5PREVfU0VUX1NUQVRFKGhub2RlLCBOT0RFX1RFUk1JTkFUSU5HKTsKKwkJfQorCQkvKiBlbmQgb2Ygc3luY19lbnRlcl9jcyAqLworCQltdXRleF91bmxvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qCisJCSAqICBTZW5kIGV4aXQgbWVzc2FnZS4gRG8gbm90IGNoYW5nZSBzdGF0ZSB0byBOT0RFX0RPTkUKKwkJICogIGhlcmUuIFRoYXQgd2lsbCBiZSBkb25lIGluIGNhbGxiYWNrLgorCQkgKi8KKwkJc3RhdHVzID0gcHJvY19nZXRfc3RhdGUocG5vZGUtPmhwcm9jZXNzb3IsICZwcm9jX3N0YXRlLAorCQkJCQlzaXplb2Yoc3RydWN0IGRzcF9wcm9jZXNzb3JzdGF0ZSkpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBmdW5jX2NvbnQ7CisJCS8qIElmIHByb2Nlc3NvciBpcyBpbiBlcnJvciBzdGF0ZSB0aGVuIGRvbid0IGF0dGVtcHQgdG8gc2VuZAorCQkgKiBBIGtpbGwgdGFzayBjb21tYW5kICovCisJCWlmIChwcm9jX3N0YXRlLnByb2Nfc3RhdGUgPT0gUFJPQ19FUlJPUikgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJZ290byBmdW5jX2NvbnQ7CisJCX0KKworCQltc2cuZHdfY21kID0gUk1TX0VYSVQ7CisJCW1zZy5kd19hcmcxID0gaG5vZGUtPm5vZGVfZW52OworCQlraWxsbXNnLmR3X2NtZCA9IFJNU19LSUxMVEFTSzsKKwkJa2lsbG1zZy5kd19hcmcxID0gaG5vZGUtPm5vZGVfZW52OworCQlpbnRmX2Z4bnMgPSBobm9kZV9tZ3ItPmludGZfZnhuczsKKworCQlpZiAoaG5vZGUtPnV0aW1lb3V0ID4gTUFYVElNRU9VVCkKKwkJCWtpbGxfdGltZV9vdXQgPSBNQVhUSU1FT1VUOworCQllbHNlCisJCQlraWxsX3RpbWVfb3V0ID0gKGhub2RlLT51dGltZW91dCkgKiAyOworCisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fbXNnX3B1dCkgKGhub2RlLT5tc2dfcXVldWVfb2JqLCAmbXNnLAorCQkJCQkJICAgIGhub2RlLT51dGltZW91dCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGZ1bmNfY29udDsKKworCQkvKgorCQkgKiBXYWl0IG9uIHN5bmNocm9uaXphdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlCisJCSAqIHBvc3RlZCBpbiB0aGUgY2FsbGJhY2sgb24gcmVjZWl2aW5nIFJNU19FWElUCisJCSAqIG1lc3NhZ2UsIG9yIGJ5IG5vZGVfZGVsZXRlLiBDaGVjayBmb3IgdmFsaWQgaG5vZGUsCisJCSAqIGluIGNhc2UgcG9zdGVkIGJ5IG5vZGVfZGVsZXRlKCkuCisJCSAqLworCQlzdGF0dXMgPSBzeW5jX3dhaXRfb25fZXZlbnQoaG5vZGUtPnN5bmNfZG9uZSwKKwkJCQkJICAgIGtpbGxfdGltZV9vdXQgLyAyKTsKKwkJaWYgKHN0YXR1cyAhPSBFVElNRSkKKwkJCWdvdG8gZnVuY19jb250OworCisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fbXNnX3B1dCkoaG5vZGUtPm1zZ19xdWV1ZV9vYmosCisJCQkJCQkma2lsbG1zZywgaG5vZGUtPnV0aW1lb3V0KTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZnVuY19jb250OworCQlzdGF0dXMgPSBzeW5jX3dhaXRfb25fZXZlbnQoaG5vZGUtPnN5bmNfZG9uZSwKKwkJCQkJICAgICBraWxsX3RpbWVfb3V0IC8gMik7CisJCWlmIChzdGF0dXMpIHsKKwkJCS8qCisJCQkgKiBIZXJlIGl0IGdvZXMgdGhlIHBhcnQgb2YgdGhlIHNpbXVsYXRpb24gb2YKKwkJCSAqIHRoZSBEU1AgZXhjZXB0aW9uLgorCQkJICovCisJCQlkZXZfZ2V0X2RlaF9tZ3IoaG5vZGVfbWdyLT5oZGV2X29iaiwgJmhkZWhfbWdyKTsKKwkJCWlmICghaGRlaF9tZ3IpCisJCQkJZ290byBmdW5jX2NvbnQ7CisKKwkJCWJyaWRnZV9kZWhfbm90aWZ5KGhkZWhfbWdyLCBEU1BfU1lTRVJST1IsIERTUF9FWENFUFRJT05BQk9SVCk7CisJCX0KKwl9CitmdW5jX2NvbnQ6CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogRW50ZXIgQ1MgYmVmb3JlIGdldHRpbmcgZXhpdCBzdGF0dXMsIGluIGNhc2Ugbm9kZSB3YXMKKwkJICogZGVsZXRlZC4gKi8KKwkJbXV0ZXhfbG9jaygmaG5vZGVfbWdyLT5ub2RlX21ncl9sb2NrKTsKKwkJLyogTWFrZSBzdXJlIG5vZGUgd2Fzbid0IGRlbGV0ZWQgd2hpbGUgd2UgYmxvY2tlZCAqLworCQlpZiAoIWhub2RlKSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0gZWxzZSB7CisJCQkqcHN0YXR1cyA9IGhub2RlLT5leGl0X3N0YXR1czsKKwkJCWRldl9kYmcoYnJpZGdlLCAiJXM6IGhub2RlOiAlcCBlbnYgMHgleCBzdGF0dXMgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgaG5vZGUsIGhub2RlLT5ub2RlX2Vudiwgc3RhdHVzKTsKKwkJfQorCQltdXRleF91bmxvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJfQkJCS8qRW5kIG9mIHN5bmNfZW50ZXJfY3MgKi8KK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGVsZXRlX25vZGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBGcmVlIEdQUCByZXNvdXJjZXMgYWxsb2NhdGVkIGluIG5vZGVfYWxsb2NhdGUoKSBvciBub2RlX2Nvbm5lY3QoKS4KKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX25vZGUoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpCit7CisJc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3I7CisJc3RydWN0IGNtbV94bGF0b3JvYmplY3QgKnhsYXRvcjsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwl1MzIgaTsKKwllbnVtIG5vZGVfdHlwZSBub2RlX3R5cGU7CisJc3RydWN0IHN0cmVhbV9jaG5sIHN0cmVhbTsKKwlzdHJ1Y3Qgbm9kZV9tc2dhcmdzIG5vZGVfbXNnX2FyZ3M7CisJc3RydWN0IG5vZGVfdGFza2FyZ3MgdGFza19hcmdfb2JqOworI2lmZGVmIERTUF9ETU1fREVCVUcKKwlzdHJ1Y3QgZG1tX29iamVjdCAqZG1tX21ncjsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPQorCSAgICAoc3RydWN0IHByb2Nfb2JqZWN0ICopaG5vZGUtPmhwcm9jZXNzb3I7CisjZW5kaWYKKwlpbnQgc3RhdHVzOworCWlmICghaG5vZGUpCisJCWdvdG8gZnVuY19lbmQ7CisJaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKwlpZiAoIWhub2RlX21ncikKKwkJZ290byBmdW5jX2VuZDsKKwl4bGF0b3IgPSBobm9kZS0+eGxhdG9yOworCW5vZGVfdHlwZSA9IG5vZGVfZ2V0X3R5cGUoaG5vZGUpOworCWlmIChub2RlX3R5cGUgIT0gTk9ERV9ERVZJQ0UpIHsKKwkJbm9kZV9tc2dfYXJncyA9IGhub2RlLT5jcmVhdGVfYXJncy5hc2Eubm9kZV9tc2dfYXJnczsKKwkJa2ZyZWUobm9kZV9tc2dfYXJncy5wZGF0YSk7CisKKwkJLyogRnJlZSBtc2dfY3RybCBxdWV1ZSAqLworCQlpZiAoaG5vZGUtPm1zZ19xdWV1ZV9vYmopIHsKKwkJCWludGZfZnhucyA9IGhub2RlX21nci0+aW50Zl9meG5zOworCQkJKCppbnRmX2Z4bnMtPnBmbl9tc2dfZGVsZXRlX3F1ZXVlKSAoaG5vZGUtPgorCQkJCQkJCSAgICBtc2dfcXVldWVfb2JqKTsKKwkJCWhub2RlLT5tc2dfcXVldWVfb2JqID0gTlVMTDsKKwkJfQorCisJCWtmcmVlKGhub2RlLT5zeW5jX2RvbmUpOworCisJCS8qIEZyZWUgYWxsIHN0cmVhbSBpbmZvICovCisJCWlmIChobm9kZS0+aW5wdXRzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOUFVUUyhobm9kZSk7IGkrKykgeworCQkJCXN0cmVhbSA9IGhub2RlLT5pbnB1dHNbaV07CisJCQkJZnJlZV9zdHJlYW0oaG5vZGVfbWdyLCBzdHJlYW0pOworCQkJfQorCQkJa2ZyZWUoaG5vZGUtPmlucHV0cyk7CisJCQlobm9kZS0+aW5wdXRzID0gTlVMTDsKKwkJfQorCQlpZiAoaG5vZGUtPm91dHB1dHMpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfT1VUUFVUUyhobm9kZSk7IGkrKykgeworCQkJCXN0cmVhbSA9IGhub2RlLT5vdXRwdXRzW2ldOworCQkJCWZyZWVfc3RyZWFtKGhub2RlX21nciwgc3RyZWFtKTsKKwkJCX0KKwkJCWtmcmVlKGhub2RlLT5vdXRwdXRzKTsKKwkJCWhub2RlLT5vdXRwdXRzID0gTlVMTDsKKwkJfQorCQl0YXNrX2FyZ19vYmogPSBobm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLnRhc2tfYXJnX29iajsKKwkJaWYgKHRhc2tfYXJnX29iai5zdHJtX2luX2RlZikgeworCQkJZm9yIChpID0gMDsgaSA8IE1BWF9JTlBVVFMoaG5vZGUpOyBpKyspIHsKKwkJCQlrZnJlZSh0YXNrX2FyZ19vYmouc3RybV9pbl9kZWZbaV0uc3pfZGV2aWNlKTsKKwkJCQl0YXNrX2FyZ19vYmouc3RybV9pbl9kZWZbaV0uc3pfZGV2aWNlID0gTlVMTDsKKwkJCX0KKwkJCWtmcmVlKHRhc2tfYXJnX29iai5zdHJtX2luX2RlZik7CisJCQl0YXNrX2FyZ19vYmouc3RybV9pbl9kZWYgPSBOVUxMOworCQl9CisJCWlmICh0YXNrX2FyZ19vYmouc3RybV9vdXRfZGVmKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX09VVFBVVFMoaG5vZGUpOyBpKyspIHsKKwkJCQlrZnJlZSh0YXNrX2FyZ19vYmouc3RybV9vdXRfZGVmW2ldLnN6X2RldmljZSk7CisJCQkJdGFza19hcmdfb2JqLnN0cm1fb3V0X2RlZltpXS5zel9kZXZpY2UgPSBOVUxMOworCQkJfQorCQkJa2ZyZWUodGFza19hcmdfb2JqLnN0cm1fb3V0X2RlZik7CisJCQl0YXNrX2FyZ19vYmouc3RybV9vdXRfZGVmID0gTlVMTDsKKwkJfQorCQlpZiAodGFza19hcmdfb2JqLnVkc3BfaGVhcF9yZXNfYWRkcikgeworCQkJc3RhdHVzID0gcHJvY191bl9tYXAoaG5vZGUtPmhwcm9jZXNzb3IsICh2b2lkICopCisJCQkJCSAgICAgdGFza19hcmdfb2JqLnVkc3BfaGVhcF9hZGRyLAorCQkJCQkgICAgIHByX2N0eHQpOworCisJCQlzdGF0dXMgPSBwcm9jX3VuX3Jlc2VydmVfbWVtb3J5KGhub2RlLT5ocHJvY2Vzc29yLAorCQkJCQkJCSh2b2lkICopCisJCQkJCQkJdGFza19hcmdfb2JqLgorCQkJCQkJCXVkc3BfaGVhcF9yZXNfYWRkciwKKwkJCQkJCQlwcl9jdHh0KTsKKyNpZmRlZiBEU1BfRE1NX0RFQlVHCisJCQlzdGF0dXMgPSBkbW1fZ2V0X2hhbmRsZShwX3Byb2Nfb2JqZWN0LCAmZG1tX21ncik7CisJCQlpZiAoZG1tX21ncikKKwkJCQlkbW1fbWVtX21hcF9kdW1wKGRtbV9tZ3IpOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IERTUF9FSEFORExFOworI2VuZGlmCisJCX0KKwl9CisJaWYgKG5vZGVfdHlwZSAhPSBOT0RFX01FU1NBR0UpIHsKKwkJa2ZyZWUoaG5vZGUtPnN0cmVhbV9jb25uZWN0KTsKKwkJaG5vZGUtPnN0cmVhbV9jb25uZWN0ID0gTlVMTDsKKwl9CisJa2ZyZWUoaG5vZGUtPnBzdHJfZGV2X25hbWUpOworCWhub2RlLT5wc3RyX2Rldl9uYW1lID0gTlVMTDsKKworCWlmIChobm9kZS0+bnRmeV9vYmopIHsKKwkJbnRmeV9kZWxldGUoaG5vZGUtPm50Znlfb2JqKTsKKwkJa2ZyZWUoaG5vZGUtPm50Znlfb2JqKTsKKwkJaG5vZGUtPm50Znlfb2JqID0gTlVMTDsKKwl9CisKKwkvKiBUaGVzZSB3ZXJlIGFsbG9jYXRlZCBpbiBkY2RfZ2V0X29iamVjdF9kZWYgKHZpYSBub2RlX2FsbG9jYXRlKSAqLworCWtmcmVlKGhub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoucHN0cl9jcmVhdGVfcGhhc2VfZnhuKTsKKwlobm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfY3JlYXRlX3BoYXNlX2Z4biA9IE5VTEw7CisKKwlrZnJlZShobm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfZXhlY3V0ZV9waGFzZV9meG4pOworCWhub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoucHN0cl9leGVjdXRlX3BoYXNlX2Z4biA9IE5VTEw7CisKKwlrZnJlZShobm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfZGVsZXRlX3BoYXNlX2Z4bik7CisJaG5vZGUtPmRjZF9wcm9wcy5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2RlbGV0ZV9waGFzZV9meG4gPSBOVUxMOworCisJa2ZyZWUoaG5vZGUtPmRjZF9wcm9wcy5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2lfYWxnX25hbWUpOworCWhub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoucHN0cl9pX2FsZ19uYW1lID0gTlVMTDsKKworCS8qIEZyZWUgYWxsIFNNIGFkZHJlc3MgdHJhbnNsYXRvciByZXNvdXJjZXMgKi8KKwlpZiAoeGxhdG9yKSB7CisJCSh2b2lkKWNtbV94bGF0b3JfZGVsZXRlKHhsYXRvciwgdHJ1ZSk7CS8qIGZvcmNlIGZyZWUgKi8KKwkJeGxhdG9yID0gTlVMTDsKKwl9CisKKwlrZnJlZShobm9kZS0+bmxkcl9ub2RlX29iaik7CisJaG5vZGUtPm5sZHJfbm9kZV9vYmogPSBOVUxMOworCWhub2RlLT5obm9kZV9tZ3IgPSBOVUxMOworCWtmcmVlKGhub2RlKTsKKwlobm9kZSA9IE5VTEw7CitmdW5jX2VuZDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgPT09PT09PT0gZGVsZXRlX25vZGVfbWdyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRnJlZXMgdGhlIG5vZGUgbWFuYWdlci4KKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX25vZGVfbWdyKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyKQoreworCXN0cnVjdCBub2RlX29iamVjdCAqaG5vZGU7CisKKwlpZiAoaG5vZGVfbWdyKSB7CisJCS8qIEZyZWUgcmVzb3VyY2VzICovCisJCWlmIChobm9kZV9tZ3ItPmhkY2RfbWdyKQorCQkJZGNkX2Rlc3Ryb3lfbWFuYWdlcihobm9kZV9tZ3ItPmhkY2RfbWdyKTsKKworCQkvKiBSZW1vdmUgYW55IGVsZW1lbnRzIHJlbWFpbmluZyBpbiBsaXN0cyAqLworCQlpZiAoaG5vZGVfbWdyLT5ub2RlX2xpc3QpIHsKKwkJCXdoaWxlICgoaG5vZGUgPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopCisJCQkJbHN0X2dldF9oZWFkKGhub2RlX21nci0+bm9kZV9saXN0KSkpCisJCQkJZGVsZXRlX25vZGUoaG5vZGUsIE5VTEwpOworCisJCQlEQkNfQVNTRVJUKExTVF9JU19FTVBUWShobm9kZV9tZ3ItPm5vZGVfbGlzdCkpOworCQkJa2ZyZWUoaG5vZGVfbWdyLT5ub2RlX2xpc3QpOworCQl9CisJCW11dGV4X2Rlc3Ryb3koJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisJCWlmIChobm9kZV9tZ3ItPm50Znlfb2JqKSB7CisJCQludGZ5X2RlbGV0ZShobm9kZV9tZ3ItPm50Znlfb2JqKTsKKwkJCWtmcmVlKGhub2RlX21nci0+bnRmeV9vYmopOworCQl9CisKKwkJaWYgKGhub2RlX21nci0+cGlwZV9tYXApCisJCQlnYl9kZWxldGUoaG5vZGVfbWdyLT5waXBlX21hcCk7CisKKwkJaWYgKGhub2RlX21nci0+cGlwZV9kb25lX21hcCkKKwkJCWdiX2RlbGV0ZShobm9kZV9tZ3ItPnBpcGVfZG9uZV9tYXApOworCisJCWlmIChobm9kZV9tZ3ItPmNobmxfbWFwKQorCQkJZ2JfZGVsZXRlKGhub2RlX21nci0+Y2hubF9tYXApOworCisJCWlmIChobm9kZV9tZ3ItPmRtYV9jaG5sX21hcCkKKwkJCWdiX2RlbGV0ZShobm9kZV9tZ3ItPmRtYV9jaG5sX21hcCk7CisKKwkJaWYgKGhub2RlX21nci0+emNfY2hubF9tYXApCisJCQlnYl9kZWxldGUoaG5vZGVfbWdyLT56Y19jaG5sX21hcCk7CisKKwkJaWYgKGhub2RlX21nci0+ZGlzcF9vYmopCisJCQlkaXNwX2RlbGV0ZShobm9kZV9tZ3ItPmRpc3Bfb2JqKTsKKworCQlpZiAoaG5vZGVfbWdyLT5zdHJtX21ncl9vYmopCisJCQlzdHJtX2RlbGV0ZShobm9kZV9tZ3ItPnN0cm1fbWdyX29iaik7CisKKwkJLyogRGVsZXRlIHRoZSBsb2FkZXIgKi8KKwkJaWYgKGhub2RlX21nci0+bmxkcl9vYmopCisJCQlobm9kZV9tZ3ItPm5sZHJfZnhucy5wZm5fZGVsZXRlKGhub2RlX21nci0+bmxkcl9vYmopOworCisJCWlmIChobm9kZV9tZ3ItPmxvYWRlcl9pbml0KQorCQkJaG5vZGVfbWdyLT5ubGRyX2Z4bnMucGZuX2V4aXQoKTsKKworCQlrZnJlZShobm9kZV9tZ3IpOworCX0KK30KKworLyoKKyAqICA9PT09PT09PSBmaWxsX3N0cmVhbV9jb25uZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRmlsbHMgc3RyZWFtIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCBmaWxsX3N0cmVhbV9jb25uZWN0KHN0cnVjdCBub2RlX29iamVjdCAqbm9kZTEsCisJCQkJc3RydWN0IG5vZGVfb2JqZWN0ICpub2RlMiwKKwkJCQl1MzIgc3RyZWFtMSwgdTMyIHN0cmVhbTIpCit7CisJdTMyIHN0cm1faW5kZXg7CisJc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0ICpzdHJtMSA9IE5VTEw7CisJc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0ICpzdHJtMiA9IE5VTEw7CisJZW51bSBub2RlX3R5cGUgbm9kZTFfdHlwZSA9IE5PREVfVEFTSzsKKwllbnVtIG5vZGVfdHlwZSBub2RlMl90eXBlID0gTk9ERV9UQVNLOworCisJbm9kZTFfdHlwZSA9IG5vZGVfZ2V0X3R5cGUobm9kZTEpOworCW5vZGUyX3R5cGUgPSBub2RlX2dldF90eXBlKG5vZGUyKTsKKwlpZiAobm9kZTEgIT0gKHN0cnVjdCBub2RlX29iamVjdCAqKURTUF9IR1BQTk9ERSkgeworCisJCWlmIChub2RlMV90eXBlICE9IE5PREVfREVWSUNFKSB7CisJCQlzdHJtX2luZGV4ID0gbm9kZTEtPm51bV9pbnB1dHMgKworCQkJICAgIG5vZGUxLT5udW1fb3V0cHV0cyAtIDE7CisJCQlzdHJtMSA9ICYobm9kZTEtPnN0cmVhbV9jb25uZWN0W3N0cm1faW5kZXhdKTsKKwkJCXN0cm0xLT5jYl9zdHJ1Y3QgPSBzaXplb2Yoc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0KTsKKwkJCXN0cm0xLT50aGlzX25vZGVfc3RyZWFtX2luZGV4ID0gc3RyZWFtMTsKKwkJfQorCisJCWlmIChub2RlMiAhPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopRFNQX0hHUFBOT0RFKSB7CisJCQkvKiBOT0RFID09ID4gTk9ERSAqLworCQkJaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9ERVZJQ0UpIHsKKwkJCQlzdHJtMS0+Y29ubmVjdGVkX25vZGUgPSBub2RlMjsKKwkJCQlzdHJtMS0+dWlfY29ubmVjdGVkX25vZGVfaWQgPSBub2RlMi0+bm9kZV91dWlkOworCQkJCXN0cm0xLT5jb25uZWN0ZWRfbm9kZV9zdHJlYW1faW5kZXggPSBzdHJlYW0yOworCQkJCXN0cm0xLT5jb25uZWN0X3R5cGUgPSBDT05ORUNUVFlQRV9OT0RFT1VUUFVUOworCQkJfQorCQkJaWYgKG5vZGUyX3R5cGUgIT0gTk9ERV9ERVZJQ0UpIHsKKwkJCQlzdHJtX2luZGV4ID0gbm9kZTItPm51bV9pbnB1dHMgKworCQkJCSAgICBub2RlMi0+bnVtX291dHB1dHMgLSAxOworCQkJCXN0cm0yID0gJihub2RlMi0+c3RyZWFtX2Nvbm5lY3Rbc3RybV9pbmRleF0pOworCQkJCXN0cm0yLT5jYl9zdHJ1Y3QgPQorCQkJCSAgICBzaXplb2Yoc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0KTsKKwkJCQlzdHJtMi0+dGhpc19ub2RlX3N0cmVhbV9pbmRleCA9IHN0cmVhbTI7CisJCQkJc3RybTItPmNvbm5lY3RlZF9ub2RlID0gbm9kZTE7CisJCQkJc3RybTItPnVpX2Nvbm5lY3RlZF9ub2RlX2lkID0gbm9kZTEtPm5vZGVfdXVpZDsKKwkJCQlzdHJtMi0+Y29ubmVjdGVkX25vZGVfc3RyZWFtX2luZGV4ID0gc3RyZWFtMTsKKwkJCQlzdHJtMi0+Y29ubmVjdF90eXBlID0gQ09OTkVDVFRZUEVfTk9ERUlOUFVUOworCQkJfQorCQl9IGVsc2UgaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9ERVZJQ0UpCisJCQlzdHJtMS0+Y29ubmVjdF90eXBlID0gQ09OTkVDVFRZUEVfR1BQT1VUUFVUOworCX0gZWxzZSB7CisJCS8qIEdQUCA9PSA+IE5PREUgKi8KKwkJREJDX0FTU0VSVChub2RlMiAhPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopRFNQX0hHUFBOT0RFKTsKKwkJc3RybV9pbmRleCA9IG5vZGUyLT5udW1faW5wdXRzICsgbm9kZTItPm51bV9vdXRwdXRzIC0gMTsKKwkJc3RybTIgPSAmKG5vZGUyLT5zdHJlYW1fY29ubmVjdFtzdHJtX2luZGV4XSk7CisJCXN0cm0yLT5jYl9zdHJ1Y3QgPSBzaXplb2Yoc3RydWN0IGRzcF9zdHJlYW1jb25uZWN0KTsKKwkJc3RybTItPnRoaXNfbm9kZV9zdHJlYW1faW5kZXggPSBzdHJlYW0yOworCQlzdHJtMi0+Y29ubmVjdF90eXBlID0gQ09OTkVDVFRZUEVfR1BQSU5QVVQ7CisJfQorfQorCisvKgorICogID09PT09PT09IGZpbGxfc3RyZWFtX2RlZiA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZpbGxzIFN0cmVhbSBhdHRyaWJ1dGVzLgorICovCitzdGF0aWMgdm9pZCBmaWxsX3N0cmVhbV9kZWYoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwKKwkJCSAgICBzdHJ1Y3Qgbm9kZV9zdHJtZGVmICpwc3RybV9kZWYsCisJCQkgICAgc3RydWN0IGRzcF9zdHJtYXR0ciAqcGF0dHJzKQoreworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKworCWlmIChwYXR0cnMgIT0gTlVMTCkgeworCQlwc3RybV9kZWYtPm51bV9idWZzID0gcGF0dHJzLT5udW1fYnVmczsKKwkJcHN0cm1fZGVmLT5idWZfc2l6ZSA9CisJCSAgICBwYXR0cnMtPmJ1Zl9zaXplIC8gaG5vZGVfbWdyLT51ZHNwX2RhdGFfbWF1X3NpemU7CisJCXBzdHJtX2RlZi0+c2VnX2lkID0gcGF0dHJzLT5zZWdfaWQ7CisJCXBzdHJtX2RlZi0+YnVmX2FsaWdubWVudCA9IHBhdHRycy0+YnVmX2FsaWdubWVudDsKKwkJcHN0cm1fZGVmLT51dGltZW91dCA9IHBhdHRycy0+dXRpbWVvdXQ7CisJfSBlbHNlIHsKKwkJcHN0cm1fZGVmLT5udW1fYnVmcyA9IERFRkFVTFROQlVGUzsKKwkJcHN0cm1fZGVmLT5idWZfc2l6ZSA9CisJCSAgICBERUZBVUxUQlVGU0laRSAvIGhub2RlX21nci0+dWRzcF9kYXRhX21hdV9zaXplOworCQlwc3RybV9kZWYtPnNlZ19pZCA9IERFRkFVTFRTRUdJRDsKKwkJcHN0cm1fZGVmLT5idWZfYWxpZ25tZW50ID0gREVGQVVMVEFMSUdOTUVOVDsKKwkJcHN0cm1fZGVmLT51dGltZW91dCA9IERFRkFVTFRUSU1FT1VUOworCX0KK30KKworLyoKKyAqICA9PT09PT09PSBmcmVlX3N0cmVhbSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFVwZGF0ZXMgdGhlIGNoYW5uZWwgbWFzayBhbmQgZnJlZXMgdGhlIHBpcGUgaWQuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfc3RyZWFtKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyLCBzdHJ1Y3Qgc3RyZWFtX2Nobmwgc3RyZWFtKQoreworCS8qIEZyZWUgdXAgdGhlIHBpcGUgaWQgdW5sZXNzIG90aGVyIG5vZGUgaGFzIG5vdCB5ZXQgYmVlbiBkZWxldGVkLiAqLworCWlmIChzdHJlYW0udHlwZSA9PSBOT0RFQ09OTkVDVCkgeworCQlpZiAoZ2JfdGVzdChobm9kZV9tZ3ItPnBpcGVfZG9uZV9tYXAsIHN0cmVhbS5kZXZfaWQpKSB7CisJCQkvKiBUaGUgb3RoZXIgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgKi8KKwkJCWdiX2NsZWFyKGhub2RlX21nci0+cGlwZV9kb25lX21hcCwgc3RyZWFtLmRldl9pZCk7CisJCQlnYl9jbGVhcihobm9kZV9tZ3ItPnBpcGVfbWFwLCBzdHJlYW0uZGV2X2lkKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBvdGhlciBub2RlIGhhcyBub3QgYmVlbiBkZWxldGVkIHlldCAqLworCQkJZ2Jfc2V0KGhub2RlX21nci0+cGlwZV9kb25lX21hcCwgc3RyZWFtLmRldl9pZCk7CisJCX0KKwl9IGVsc2UgaWYgKHN0cmVhbS50eXBlID09IEhPU1RDT05ORUNUKSB7CisJCWlmIChzdHJlYW0uZGV2X2lkIDwgaG5vZGVfbWdyLT51bF9udW1fY2hubHMpIHsKKwkJCWdiX2NsZWFyKGhub2RlX21nci0+Y2hubF9tYXAsIHN0cmVhbS5kZXZfaWQpOworCQl9IGVsc2UgaWYgKHN0cmVhbS5kZXZfaWQgPCAoMiAqIGhub2RlX21nci0+dWxfbnVtX2NobmxzKSkgeworCQkJLyogZHNwLWRtYSAqLworCQkJZ2JfY2xlYXIoaG5vZGVfbWdyLT5kbWFfY2hubF9tYXAsIHN0cmVhbS5kZXZfaWQgLQorCQkJCSAoMSAqIGhub2RlX21nci0+dWxfbnVtX2NobmxzKSk7CisJCX0gZWxzZSBpZiAoc3RyZWFtLmRldl9pZCA8ICgzICogaG5vZGVfbWdyLT51bF9udW1fY2hubHMpKSB7CisJCQkvKiB6ZXJvLWNvcHkgKi8KKwkJCWdiX2NsZWFyKGhub2RlX21nci0+emNfY2hubF9tYXAsIHN0cmVhbS5kZXZfaWQgLQorCQkJCSAoMiAqIGhub2RlX21nci0+dWxfbnVtX2NobmxzKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X2Z4bl9hZGRyZXNzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmVzIHRoZSBhZGRyZXNzIGZvciBjcmVhdGUsIGV4ZWN1dGUgb3IgZGVsZXRlIHBoYXNlIGZvciBhIG5vZGUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2Z4bl9hZGRyZXNzKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHUzMiAqIGZ4bl9hZGRyLAorCQkJCSAgdTMyIHBoYXNlKQoreworCWNoYXIgKnBzdHJfZnhuX25hbWUgPSBOVUxMOworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyID0gaG5vZGUtPmhub2RlX21ncjsKKwlpbnQgc3RhdHVzID0gMDsKKwlEQkNfUkVRVUlSRShub2RlX2dldF90eXBlKGhub2RlKSA9PSBOT0RFX1RBU0sgfHwKKwkJICAgIG5vZGVfZ2V0X3R5cGUoaG5vZGUpID09IE5PREVfREFJU1NPQ0tFVCB8fAorCQkgICAgbm9kZV9nZXRfdHlwZShobm9kZSkgPT0gTk9ERV9NRVNTQUdFKTsKKworCXN3aXRjaCAocGhhc2UpIHsKKwljYXNlIENSRUFURVBIQVNFOgorCQlwc3RyX2Z4bl9uYW1lID0KKwkJICAgIGhub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoucHN0cl9jcmVhdGVfcGhhc2VfZnhuOworCQlicmVhazsKKwljYXNlIEVYRUNVVEVQSEFTRToKKwkJcHN0cl9meG5fbmFtZSA9CisJCSAgICBobm9kZS0+ZGNkX3Byb3BzLm9ial9kYXRhLm5vZGVfb2JqLnBzdHJfZXhlY3V0ZV9waGFzZV9meG47CisJCWJyZWFrOworCWNhc2UgREVMRVRFUEhBU0U6CisJCXBzdHJfZnhuX25hbWUgPQorCQkgICAgaG5vZGUtPmRjZF9wcm9wcy5vYmpfZGF0YS5ub2RlX29iai5wc3RyX2RlbGV0ZV9waGFzZV9meG47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQlEQkNfQVNTRVJUKGZhbHNlKTsKKwkJYnJlYWs7CisJfQorCisJc3RhdHVzID0KKwkgICAgaG5vZGVfbWdyLT5ubGRyX2Z4bnMucGZuX2dldF9meG5fYWRkcihobm9kZS0+bmxkcl9ub2RlX29iaiwKKwkJCQkJCSAgcHN0cl9meG5fbmFtZSwgZnhuX2FkZHIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBnZXRfbm9kZV9pbmZvID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmVzIHRoZSBub2RlIGluZm9ybWF0aW9uLgorICovCit2b2lkIGdldF9ub2RlX2luZm8oc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgc3RydWN0IGRzcF9ub2RlaW5mbyAqbm9kZV9pbmZvKQoreworCXUzMiBpOworCisJREJDX1JFUVVJUkUoaG5vZGUpOworCURCQ19SRVFVSVJFKG5vZGVfaW5mbyAhPSBOVUxMKTsKKworCW5vZGVfaW5mby0+Y2Jfc3RydWN0ID0gc2l6ZW9mKHN0cnVjdCBkc3Bfbm9kZWluZm8pOworCW5vZGVfaW5mby0+bmJfbm9kZV9kYXRhYmFzZV9wcm9wcyA9CisJICAgIGhub2RlLT5kY2RfcHJvcHMub2JqX2RhdGEubm9kZV9vYmoubmRiX3Byb3BzOworCW5vZGVfaW5mby0+ZXhlY3V0aW9uX3ByaW9yaXR5ID0gaG5vZGUtPnByaW87CisJbm9kZV9pbmZvLT5kZXZpY2Vfb3duZXIgPSBobm9kZS0+ZGV2aWNlX293bmVyOworCW5vZGVfaW5mby0+bnVtYmVyX3N0cmVhbXMgPSBobm9kZS0+bnVtX2lucHV0cyArIGhub2RlLT5udW1fb3V0cHV0czsKKwlub2RlX2luZm8tPm5vZGVfZW52ID0gaG5vZGUtPm5vZGVfZW52OworCisJbm9kZV9pbmZvLT5uc19leGVjdXRpb25fc3RhdGUgPSBub2RlX2dldF9zdGF0ZShobm9kZSk7CisKKwkvKiBDb3B5IHN0cmVhbSBjb25uZWN0IGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaG5vZGUtPm51bV9pbnB1dHMgKyBobm9kZS0+bnVtX291dHB1dHM7IGkrKykKKwkJbm9kZV9pbmZvLT5zY19zdHJlYW1fY29ubmVjdGlvbltpXSA9IGhub2RlLT5zdHJlYW1fY29ubmVjdFtpXTsKKworfQorCisvKgorICogID09PT09PT09IGdldF9ub2RlX3Byb3BzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmUgbm9kZSBwcm9wZXJ0aWVzLgorICovCitzdGF0aWMgaW50IGdldF9ub2RlX3Byb3BzKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCisJCQkJIHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCisJCQkJIGNvbnN0IHN0cnVjdCBkc3BfdXVpZCAqbm9kZV91dWlkLAorCQkJCSBzdHJ1Y3QgZGNkX2dlbmVyaWNvYmogKmRjZF9wcm9wKQoreworCXUzMiBsZW47CisJc3RydWN0IG5vZGVfbXNnYXJncyAqcG1zZ19hcmdzOworCXN0cnVjdCBub2RlX3Rhc2thcmdzICp0YXNrX2FyZ19vYmo7CisJZW51bSBub2RlX3R5cGUgbm9kZV90eXBlID0gTk9ERV9UQVNLOworCXN0cnVjdCBkc3BfbmRicHJvcHMgKnBuZGJfcHJvcHMgPQorCSAgICAmKGRjZF9wcm9wLT5vYmpfZGF0YS5ub2RlX29iai5uZGJfcHJvcHMpOworCWludCBzdGF0dXMgPSAwOworCWNoYXIgc3pfdXVpZFtNQVhVVUlETEVOXTsKKworCXN0YXR1cyA9IGRjZF9nZXRfb2JqZWN0X2RlZihoZGNkX21nciwgKHN0cnVjdCBkc3BfdXVpZCAqKW5vZGVfdXVpZCwKKwkJCQkgICAgRFNQX0RDRE5PREVUWVBFLCBkY2RfcHJvcCk7CisKKwlpZiAoIXN0YXR1cykgeworCQlobm9kZS0+bnR5cGUgPSBub2RlX3R5cGUgPSBwbmRiX3Byb3BzLT5udHlwZTsKKworCQkvKiBDcmVhdGUgVVVJRCB2YWx1ZSB0byBzZXQgaW4gcmVnaXN0cnkuICovCisJCXV1aWRfdXVpZF90b19zdHJpbmcoKHN0cnVjdCBkc3BfdXVpZCAqKW5vZGVfdXVpZCwgc3pfdXVpZCwKKwkJCQkgICAgTUFYVVVJRExFTik7CisJCWRldl9kYmcoYnJpZGdlLCAiKG5vZGUpIFVVSUQ6ICVzXG4iLCBzel91dWlkKTsKKworCQkvKiBGaWxsIGluIG1lc3NhZ2UgYXJncyB0aGF0IGNvbWUgZnJvbSBOREIgKi8KKwkJaWYgKG5vZGVfdHlwZSAhPSBOT0RFX0RFVklDRSkgeworCQkJcG1zZ19hcmdzID0gJihobm9kZS0+Y3JlYXRlX2FyZ3MuYXNhLm5vZGVfbXNnX2FyZ3MpOworCQkJcG1zZ19hcmdzLT5zZWdfaWQgPQorCQkJICAgIGRjZF9wcm9wLT5vYmpfZGF0YS5ub2RlX29iai5tc2dfc2VnaWQ7CisJCQlwbXNnX2FyZ3MtPm5vdGlmeV90eXBlID0KKwkJCSAgICBkY2RfcHJvcC0+b2JqX2RhdGEubm9kZV9vYmoubXNnX25vdGlmeV90eXBlOworCQkJcG1zZ19hcmdzLT5tYXhfbXNncyA9IHBuZGJfcHJvcHMtPm1lc3NhZ2VfZGVwdGg7CisJCQlkZXZfZGJnKGJyaWRnZSwgIihub2RlKSBNYXggTnVtYmVyIG9mIE1lc3NhZ2VzOiAweCV4XG4iLAorCQkJCXBtc2dfYXJncy0+bWF4X21zZ3MpOworCQl9IGVsc2UgeworCQkJLyogQ29weSBkZXZpY2UgbmFtZSAqLworCQkJREJDX1JFUVVJUkUocG5kYl9wcm9wcy0+YWNfbmFtZSk7CisJCQlsZW4gPSBzdHJsZW4ocG5kYl9wcm9wcy0+YWNfbmFtZSk7CisJCQlEQkNfQVNTRVJUKGxlbiA8IE1BWERFVk5BTUVMRU4pOworCQkJaG5vZGUtPnBzdHJfZGV2X25hbWUgPSBremFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKGhub2RlLT5wc3RyX2Rldl9uYW1lID09IE5VTEwpIHsKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJfSBlbHNlIHsKKwkJCQlzdHJuY3B5KGhub2RlLT5wc3RyX2Rldl9uYW1lLAorCQkJCQlwbmRiX3Byb3BzLT5hY19uYW1lLCBsZW4pOworCQkJfQorCQl9CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIEZpbGwgaW4gY3JlYXRlIGFyZ3MgdGhhdCBjb21lIGZyb20gTkRCICovCisJCWlmIChub2RlX3R5cGUgPT0gTk9ERV9UQVNLIHx8IG5vZGVfdHlwZSA9PSBOT0RFX0RBSVNTT0NLRVQpIHsKKwkJCXRhc2tfYXJnX29iaiA9ICYoaG5vZGUtPmNyZWF0ZV9hcmdzLmFzYS50YXNrX2FyZ19vYmopOworCQkJdGFza19hcmdfb2JqLT5wcmlvID0gcG5kYl9wcm9wcy0+cHJpbzsKKwkJCXRhc2tfYXJnX29iai0+c3RhY2tfc2l6ZSA9IHBuZGJfcHJvcHMtPnN0YWNrX3NpemU7CisJCQl0YXNrX2FyZ19vYmotPnN5c19zdGFja19zaXplID0KKwkJCSAgICBwbmRiX3Byb3BzLT5zeXNfc3RhY2tfc2l6ZTsKKwkJCXRhc2tfYXJnX29iai0+c3RhY2tfc2VnID0gcG5kYl9wcm9wcy0+c3RhY2tfc2VnOworCQkJZGV2X2RiZyhicmlkZ2UsICIobm9kZSkgUHJpb3JpdHk6IDB4JXggU3RhY2sgU2l6ZTogIgorCQkJCSIweCV4IHdvcmRzIFN5c3RlbSBTdGFjayBTaXplOiAweCV4IHdvcmRzICIKKwkJCQkiU3RhY2sgU2VnbWVudDogMHgleCBwcm9maWxlIGNvdW50IDogMHgleFxuIiwKKwkJCQl0YXNrX2FyZ19vYmotPnByaW8sIHRhc2tfYXJnX29iai0+c3RhY2tfc2l6ZSwKKwkJCQl0YXNrX2FyZ19vYmotPnN5c19zdGFja19zaXplLAorCQkJCXRhc2tfYXJnX29iai0+c3RhY2tfc2VnLAorCQkJCXBuZGJfcHJvcHMtPmNvdW50X3Byb2ZpbGVzKTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X3Byb2NfcHJvcHMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgcHJvY2Vzc29yIHByb3BlcnRpZXMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3Byb2NfcHJvcHMoc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IsCisJCQkJIHN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaikKK3sKKwlzdHJ1Y3QgY2ZnX2hvc3RyZXMgKmhvc3RfcmVzOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKnBicmlkZ2VfY29udGV4dDsKKwlpbnQgc3RhdHVzID0gMDsKKworCXN0YXR1cyA9IGRldl9nZXRfYnJpZGdlX2NvbnRleHQoaGRldl9vYmosICZwYnJpZGdlX2NvbnRleHQpOworCWlmICghcGJyaWRnZV9jb250ZXh0KQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJaWYgKCFzdGF0dXMpIHsKKwkJaG9zdF9yZXMgPSBwYnJpZGdlX2NvbnRleHQtPnJlc291cmNlczsKKwkJaWYgKCFob3N0X3JlcykKKwkJCXJldHVybiAtRVBFUk07CisJCWhub2RlX21nci0+dWxfY2hubF9vZmZzZXQgPSBob3N0X3Jlcy0+ZHdfY2hubF9vZmZzZXQ7CisJCWhub2RlX21nci0+dWxfY2hubF9idWZfc2l6ZSA9IGhvc3RfcmVzLT5kd19jaG5sX2J1Zl9zaXplOworCQlobm9kZV9tZ3ItPnVsX251bV9jaG5scyA9IGhvc3RfcmVzLT5kd19udW1fY2hubHM7CisKKwkJLyoKKwkJICogIFBST0Mgd2lsbCBhZGQgYW4gQVBJIHRvIGdldCBkc3BfcHJvY2Vzc29yaW5mby4KKwkJICogIEZpbGwgaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIG5vdy4KKwkJICovCisJCS8qIFRPRE8gLS0gSW5zdGVhZCBvZiBoYXJkIGNvZGluZywgdGFrZSBmcm9tIHJlZ2lzdHJ5ICovCisJCWhub2RlX21nci0+cHJvY19mYW1pbHkgPSA2MDAwOworCQlobm9kZV9tZ3ItPnByb2NfdHlwZSA9IDY0MTA7CisJCWhub2RlX21nci0+bWluX3ByaSA9IERTUF9OT0RFX01JTl9QUklPUklUWTsKKwkJaG5vZGVfbWdyLT5tYXhfcHJpID0gRFNQX05PREVfTUFYX1BSSU9SSVRZOworCQlobm9kZV9tZ3ItPnVkc3Bfd29yZF9zaXplID0gRFNQV09SRFNJWkU7CisJCWhub2RlX21nci0+dWRzcF9kYXRhX21hdV9zaXplID0gRFNQV09SRFNJWkU7CisJCWhub2RlX21nci0+dWRzcF9tYXVfc2l6ZSA9IDE7CisKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBub2RlX2dldF91dWlkX3Byb3BzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRmV0Y2ggTm9kZSBVVUlEIHByb3BlcnRpZXMgZnJvbSBEQ0QvRE9GIGZpbGUuCisgKi8KK2ludCBub2RlX2dldF91dWlkX3Byb3BzKHZvaWQgKmhwcm9jZXNzb3IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRzcF91dWlkICpub2RlX3V1aWQsCisJCQkgICAgICAgc3RydWN0IGRzcF9uZGJwcm9wcyAqbm9kZV9wcm9wcykKK3sKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21nciA9IE5VTEw7CisJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkY2Rfbm9kZXByb3BzIGRjZF9ub2RlX3Byb3BzOworCXN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUgcHJvY19zdGF0ZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShocHJvY2Vzc29yICE9IE5VTEwpOworCURCQ19SRVFVSVJFKG5vZGVfdXVpZCAhPSBOVUxMKTsKKworCWlmIChocHJvY2Vzc29yID09IE5VTEwgfHwgbm9kZV91dWlkID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJc3RhdHVzID0gcHJvY19nZXRfc3RhdGUoaHByb2Nlc3NvciwgJnByb2Nfc3RhdGUsCisJCQkJc2l6ZW9mKHN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUpKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCS8qIElmIHByb2Nlc3NvciBpcyBpbiBlcnJvciBzdGF0ZSB0aGVuIGRvbid0IGF0dGVtcHQKKwkgICB0byBzZW5kIHRoZSBtZXNzYWdlICovCisJaWYgKHByb2Nfc3RhdGUucHJvY19zdGF0ZSA9PSBQUk9DX0VSUk9SKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwlzdGF0dXMgPSBwcm9jX2dldF9kZXZfb2JqZWN0KGhwcm9jZXNzb3IsICZoZGV2X29iaik7CisJaWYgKGhkZXZfb2JqKSB7CisJCXN0YXR1cyA9IGRldl9nZXRfbm9kZV9tYW5hZ2VyKGhkZXZfb2JqLCAmaG5vZGVfbWdyKTsKKwkJaWYgKGhub2RlX21nciA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCX0KKworCS8qCisJICogRW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UKKwkgKiBkY2RfZ2V0X29iamVjdF9kZWYgd2lsbCB1bHRpbWF0ZWx5IGVuZCB1cCBjYWxsaW5nIGRibGxfb3Blbi9jbG9zZSwKKwkgKiB3aGljaCBuZWVkcyB0byBiZSBwcm90ZWN0ZWQgaW4gb3JkZXIgdG8gbm90IGNvcnJ1cHQgdGhlIHpsaWIgbWFuYWdlcgorCSAqIChDT0QpLgorCSAqLworCW11dGV4X2xvY2soJmhub2RlX21nci0+bm9kZV9tZ3JfbG9jayk7CisKKwlkY2Rfbm9kZV9wcm9wcy5wc3RyX2NyZWF0ZV9waGFzZV9meG4gPSBOVUxMOworCWRjZF9ub2RlX3Byb3BzLnBzdHJfZXhlY3V0ZV9waGFzZV9meG4gPSBOVUxMOworCWRjZF9ub2RlX3Byb3BzLnBzdHJfZGVsZXRlX3BoYXNlX2Z4biA9IE5VTEw7CisJZGNkX25vZGVfcHJvcHMucHN0cl9pX2FsZ19uYW1lID0gTlVMTDsKKworCXN0YXR1cyA9IGRjZF9nZXRfb2JqZWN0X2RlZihobm9kZV9tZ3ItPmhkY2RfbWdyLAorCQkoc3RydWN0IGRzcF91dWlkICopbm9kZV91dWlkLCBEU1BfRENETk9ERVRZUEUsCisJCShzdHJ1Y3QgZGNkX2dlbmVyaWNvYmogKikmZGNkX25vZGVfcHJvcHMpOworCisJaWYgKCFzdGF0dXMpIHsKKwkJKm5vZGVfcHJvcHMgPSBkY2Rfbm9kZV9wcm9wcy5uZGJfcHJvcHM7CisJCWtmcmVlKGRjZF9ub2RlX3Byb3BzLnBzdHJfY3JlYXRlX3BoYXNlX2Z4bik7CisKKwkJa2ZyZWUoZGNkX25vZGVfcHJvcHMucHN0cl9leGVjdXRlX3BoYXNlX2Z4bik7CisKKwkJa2ZyZWUoZGNkX25vZGVfcHJvcHMucHN0cl9kZWxldGVfcGhhc2VfZnhuKTsKKworCQlrZnJlZShkY2Rfbm9kZV9wcm9wcy5wc3RyX2lfYWxnX25hbWUpOworCX0KKwkvKiAgTGVhdmUgdGhlIGNyaXRpY2FsIHNlY3Rpb24sIHdlJ3JlIGRvbmUuICovCisJbXV0ZXhfdW5sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBnZXRfcm1zX2Z4bnMgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgUk1TIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBnZXRfcm1zX2Z4bnMoc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IpCit7CisJczMyIGk7CisJc3RydWN0IGRldl9vYmplY3QgKmRldl9vYmogPSBobm9kZV9tZ3ItPmhkZXZfb2JqOworCWludCBzdGF0dXMgPSAwOworCisJc3RhdGljIGNoYXIgKnBzel9meG5zW05VTVJNU0ZYTlNdID0geworCQkiUk1TX3F1ZXJ5U2VydmVyIiwJLyogUk1TUVVFUllTRVJWRVIgKi8KKwkJIlJNU19jb25maWd1cmVTZXJ2ZXIiLAkvKiBSTVNDT05GSUdVUkVTRVJWRVIgKi8KKwkJIlJNU19jcmVhdGVOb2RlIiwJLyogUk1TQ1JFQVRFTk9ERSAqLworCQkiUk1TX2V4ZWN1dGVOb2RlIiwJLyogUk1TRVhFQ1VURU5PREUgKi8KKwkJIlJNU19kZWxldGVOb2RlIiwJLyogUk1TREVMRVRFTk9ERSAqLworCQkiUk1TX2NoYW5nZU5vZGVQcmlvcml0eSIsCS8qIFJNU0NIQU5HRU5PREVQUklPUklUWSAqLworCQkiUk1TX3JlYWRNZW1vcnkiLAkvKiBSTVNSRUFETUVNT1JZICovCisJCSJSTVNfd3JpdGVNZW1vcnkiLAkvKiBSTVNXUklURU1FTU9SWSAqLworCQkiUk1TX2NvcHkiLAkvKiBSTVNDT1BZICovCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1STVNGWE5TOyBpKyspIHsKKwkJc3RhdHVzID0gZGV2X2dldF9zeW1ib2woZGV2X29iaiwgcHN6X2Z4bnNbaV0sCisJCQkJCSYoaG5vZGVfbWdyLT51bF9meG5fYWRkcnNbaV0pKTsKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKHN0YXR1cyA9PSAtRVNQSVBFKSB7CisJCQkJLyoKKwkJCQkgKiAgTWF5IGJlIGxvYWRlZCBkeW5hbWljYWxseSAoaW4gdGhlIGZ1dHVyZSksCisJCQkJICogIGJ1dCByZXR1cm4gYW4gZXJyb3IgZm9yIG5vdy4KKwkJCQkgKi8KKwkJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBSTVMgZnVuY3Rpb246ICVzIGN1cnJlbnRseSIKKwkJCQkJIiBub3QgbG9hZGVkXG4iLCBfX2Z1bmNfXywgcHN6X2Z4bnNbaV0pOworCQkJfSBlbHNlIHsKKwkJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBTeW1ib2wgbm90IGZvdW5kOiAlcyAiCisJCQkJCSJzdGF0dXMgPSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQkJcHN6X2Z4bnNbaV0sIHN0YXR1cyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IG92bHkgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBDYWxsZWQgZHVyaW5nIG92ZXJsYXkuU2VuZHMgY29tbWFuZCB0byBSTVMgdG8gY29weSBhIGJsb2NrIG9mIGRhdGEuCisgKi8KK3N0YXRpYyB1MzIgb3ZseSh2b2lkICpwcml2X3JlZiwgdTMyIGRzcF9ydW5fYWRkciwgdTMyIGRzcF9sb2FkX2FkZHIsCisJCXUzMiB1bF9udW1fYnl0ZXMsIHUzMiBtZW1fc3BhY2UpCit7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilwcml2X3JlZjsKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21ncjsKKwl1MzIgdWxfYnl0ZXMgPSAwOworCXUzMiB1bF9zaXplOworCXUzMiB1bF90aW1lb3V0OworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmhicmlkZ2VfY29udGV4dDsKKwkvKiBGdW5jdGlvbiBpbnRlcmZhY2UgdG8gQnJpZGdlIGRyaXZlciovCisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisKKwlEQkNfUkVRVUlSRShobm9kZSk7CisKKwlobm9kZV9tZ3IgPSBobm9kZS0+aG5vZGVfbWdyOworCisJdWxfc2l6ZSA9IHVsX251bV9ieXRlcyAvIGhub2RlX21nci0+dWRzcF93b3JkX3NpemU7CisJdWxfdGltZW91dCA9IGhub2RlLT51dGltZW91dDsKKworCS8qIENhbGwgbmV3IE1lbUNvcHkgZnVuY3Rpb24gKi8KKwlpbnRmX2Z4bnMgPSBobm9kZV9tZ3ItPmludGZfZnhuczsKKwlzdGF0dXMgPSBkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGhub2RlX21nci0+aGRldl9vYmosICZoYnJpZGdlX2NvbnRleHQpOworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9CisJCSAgICAoKmludGZfZnhucy0+cGZuX2JyZF9tZW1fY29weSkgKGhicmlkZ2VfY29udGV4dCwKKwkJCQkJCWRzcF9ydW5fYWRkciwgZHNwX2xvYWRfYWRkciwKKwkJCQkJCXVsX251bV9ieXRlcywgKHUzMikgbWVtX3NwYWNlKTsKKwkJaWYgKCFzdGF0dXMpCisJCQl1bF9ieXRlcyA9IHVsX251bV9ieXRlczsKKwkJZWxzZQorCQkJcHJfZGVidWcoIiVzOiBmYWlsZWQgdG8gY29weSBicmQgbWVtb3J5LCBzdGF0dXMgMHgleFxuIiwKKwkJCQkgX19mdW5jX18sIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBmYWlsZWQgdG8gZ2V0IEJyaWRnZSBjb250ZXh0LCBzdGF0dXMgMHgleFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gdWxfYnl0ZXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gbWVtX3dyaXRlID09PT09PT09CisgKi8KK3N0YXRpYyB1MzIgbWVtX3dyaXRlKHZvaWQgKnByaXZfcmVmLCB1MzIgZHNwX2FkZCwgdm9pZCAqcGJ1ZiwKKwkJICAgICB1MzIgdWxfbnVtX2J5dGVzLCB1MzIgbWVtX3NwYWNlKQoreworCXN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUgPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopcHJpdl9yZWY7CisJc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3I7CisJdTE2IG1lbV9zZWN0X3R5cGU7CisJdTMyIHVsX3RpbWVvdXQ7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqaGJyaWRnZV9jb250ZXh0OworCS8qIEZ1bmN0aW9uIGludGVyZmFjZSB0byBCcmlkZ2UgZHJpdmVyICovCisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisKKwlEQkNfUkVRVUlSRShobm9kZSk7CisJREJDX1JFUVVJUkUobWVtX3NwYWNlICYgREJMTF9DT0RFIHx8IG1lbV9zcGFjZSAmIERCTExfREFUQSk7CisKKwlobm9kZV9tZ3IgPSBobm9kZS0+aG5vZGVfbWdyOworCisJdWxfdGltZW91dCA9IGhub2RlLT51dGltZW91dDsKKwltZW1fc2VjdF90eXBlID0gKG1lbV9zcGFjZSAmIERCTExfQ09ERSkgPyBSTVNfQ09ERSA6IFJNU19EQVRBOworCisJLyogQ2FsbCBuZXcgTWVtV3JpdGUgZnVuY3Rpb24gKi8KKwlpbnRmX2Z4bnMgPSBobm9kZV9tZ3ItPmludGZfZnhuczsKKwlzdGF0dXMgPSBkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGhub2RlX21nci0+aGRldl9vYmosICZoYnJpZGdlX2NvbnRleHQpOworCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fYnJkX21lbV93cml0ZSkgKGhicmlkZ2VfY29udGV4dCwgcGJ1ZiwKKwkJCQkJZHNwX2FkZCwgdWxfbnVtX2J5dGVzLCBtZW1fc2VjdF90eXBlKTsKKworCXJldHVybiB1bF9udW1fYnl0ZXM7Cit9CisKKyNpZmRlZiBDT05GSUdfVElEU1BCUklER0VfQkFDS1RSQUNFCisvKgorICogID09PT09PT09IG5vZGVfZmluZF9hZGRyID09PT09PT09CisgKi8KK2ludCBub2RlX2ZpbmRfYWRkcihzdHJ1Y3Qgbm9kZV9tZ3IgKm5vZGVfbWdyLCB1MzIgc3ltX2FkZHIsCisJCXUzMiBvZmZzZXRfcmFuZ2UsIHZvaWQgKnN5bV9hZGRyX291dHB1dCwgY2hhciAqc3ltX25hbWUpCit7CisJc3RydWN0IG5vZGVfb2JqZWN0ICpub2RlX29iajsKKwlpbnQgc3RhdHVzID0gLUVOT0VOVDsKKwl1MzIgbjsKKworCXByX2RlYnVnKCIlcygweCV4LCAweCV4LCAweCV4LCAweCV4LCAgJXMpXG4iLCBfX2Z1bmNfXywKKwkJCSh1bnNpZ25lZCBpbnQpIG5vZGVfbWdyLAorCQkJc3ltX2FkZHIsIG9mZnNldF9yYW5nZSwKKwkJCSh1bnNpZ25lZCBpbnQpIHN5bV9hZGRyX291dHB1dCwgc3ltX25hbWUpOworCisJbm9kZV9vYmogPSAoc3RydWN0IG5vZGVfb2JqZWN0ICopKG5vZGVfbWdyLT5ub2RlX2xpc3QtPmhlYWQubmV4dCk7CisKKwlmb3IgKG4gPSAwOyBuIDwgbm9kZV9tZ3ItPm51bV9ub2RlczsgbisrKSB7CisJCXN0YXR1cyA9IG5sZHJfZmluZF9hZGRyKG5vZGVfb2JqLT5ubGRyX25vZGVfb2JqLCBzeW1fYWRkciwKKwkJCW9mZnNldF9yYW5nZSwgc3ltX2FkZHJfb3V0cHV0LCBzeW1fbmFtZSk7CisKKwkJaWYgKCFzdGF0dXMpCisJCQlicmVhazsKKworCQlub2RlX29iaiA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKikgKG5vZGVfb2JqLT5saXN0X2VsZW0ubmV4dCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzI2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9wcm9jLmMKQEAgLTAsMCArMSwxOTM2IEBACisvKgorICogcHJvYy5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIFByb2Nlc3NvciBpbnRlcmZhY2UgYXQgdGhlIGRyaXZlciBsZXZlbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1MgQWRhcHRhdGlvbiBMYXllciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmcuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvbGlzdC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9udGZ5Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3N5bmMuaD4KKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCcmlkZ2UgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwZGVoLmg+CisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxhdGZvcm0gTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jb2QuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGV2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3Byb2Nwcml2Lmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RtbS5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzb3VyY2UgTWFuYWdlciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9tZ3IuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZS5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9ubGRyLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL3JtbS5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3RoZXJzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGNkLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL21zZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kc3Bpb2N0bC5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9kcnYuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvcHJvYy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9wd3IuaD4KKworI2luY2x1ZGUgPGRzcGJyaWRnZS9yZXNvdXJjZWNsZWFudXAuaD4KKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZpbmVzLCBEYXRhIFN0cnVjdHVyZXMsIFR5cGVkZWZzICovCisjZGVmaW5lIE1BWENNRExJTkVMRU4gICAgICAgMjU1CisjZGVmaW5lIFBST0NfRU5WUFJPQ0lEICAgICAgIlBST0NfSUQ9JWQiCisjZGVmaW5lIE1BWFBST0NJRExFTgkoOCArIDUpCisjZGVmaW5lIFBST0NfREZMVF9USU1FT1VUICAgMTAwMDAJLyogVGltZSBvdXQgaW4gbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFBXUl9USU1FT1VUCSA1MDAJLyogU2xlZXAvd2FrZSB0aW1vdXQgaW4gbXNlYyAqLworI2RlZmluZSBFWFRFTkQJICAgICAgIl9FWFRfRU5EIgkvKiBFeHRtZW0gZW5kIGFkZHIgaW4gRFNQIGJpbmFyeSAqLworCisjZGVmaW5lIERTUF9DQUNIRV9MSU5FIDEyOAorCisjZGVmaW5lIEJVRk1PREVfTUFTSwkoMyA8PCAxNCkKKworLyogQnVmZmVyIG1vZGVzIGZyb20gRFNQIHBlcnNwZWN0aXZlICovCisjZGVmaW5lIFJCVUYJCTB4NDAwMAkJLyogSW5wdXQgYnVmZmVyICovCisjZGVmaW5lIFdCVUYJCTB4ODAwMAkJLyogT3V0cHV0IEJ1ZmZlciAqLworCitleHRlcm4gc3RydWN0IGRldmljZSAqYnJpZGdlOworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFscyAqLworCisvKiBUaGUgcHJvY19vYmplY3Qgc3RydWN0dXJlLiAqLworc3RydWN0IHByb2Nfb2JqZWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CS8qIExpbmsgdG8gbmV4dCBwcm9jX29iamVjdCAqLworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iajsJLyogRGV2aWNlIHRoaXMgUFJPQyByZXByZXNlbnRzICovCisJdTMyIHByb2Nlc3M7CQkvKiBQcm9jZXNzIG93bmluZyB0aGlzIFByb2Nlc3NvciAqLworCXN0cnVjdCBtZ3Jfb2JqZWN0ICpobWdyX29iajsJLyogTWFuYWdlciBPYmplY3QgSGFuZGxlICovCisJdTMyIGF0dGFjaF9jb3VudDsJLyogUHJvY2Vzc29yIGF0dGFjaCBjb3VudCAqLworCXUzMiBwcm9jZXNzb3JfaWQ7CS8qIFByb2Nlc3NvciBudW1iZXIgKi8KKwl1MzIgdXRpbWVvdXQ7CQkvKiBUaW1lIG91dCBjb3VudCAqLworCWVudW0gZHNwX3Byb2NzdGF0ZSBwcm9jX3N0YXRlOwkvKiBQcm9jZXNzb3Igc3RhdGUgKi8KKwl1MzIgdWxfdW5pdDsJCS8qIEREU1AgdW5pdCBudW1iZXIgKi8KKwlib29sIGlzX2FscmVhZHlfYXR0YWNoZWQ7CS8qCisJCQkJCSAqIFRydWUgaWYgdGhlIERldmljZSBiZWxvdyBoYXMKKwkJCQkJICogR1BQIENsaWVudCBhdHRhY2hlZAorCQkJCQkgKi8KKwlzdHJ1Y3QgbnRmeV9vYmplY3QgKm50Znlfb2JqOwkvKiBNYW5hZ2VzICBub3RpZmljYXRpb25zICovCisJLyogQnJpZGdlIENvbnRleHQgSGFuZGxlICovCisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqaGJyaWRnZV9jb250ZXh0OworCS8qIEZ1bmN0aW9uIGludGVyZmFjZSB0byBCcmlkZ2UgZHJpdmVyICovCisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJY2hhciAqcHN6X2xhc3RfY29mZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByb2NfbGlzdDsKK307CisKK3N0YXRpYyB1MzIgcmVmczsKKworREVGSU5FX01VVEVYKHByb2NfbG9jayk7CS8qIEZvciBjcml0aWNhbCBzZWN0aW9ucyAqLworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAqLworc3RhdGljIGludCBwcm9jX21vbml0b3Ioc3RydWN0IHByb2Nfb2JqZWN0ICpwcm9jX29iaik7CitzdGF0aWMgczMyIGdldF9lbnZwX2NvdW50KGNoYXIgKiplbnZwKTsKK3N0YXRpYyBjaGFyICoqcHJlcGVuZF9lbnZwKGNoYXIgKipuZXdfZW52cCwgY2hhciAqKmVudnAsIHMzMiBlbnZwX2VsZW1zLAorCQkJICAgczMyIGNuZXdfZW52cCwgY2hhciAqc3pfdmFyKTsKKworLyogcmVtZW1iZXIgbWFwcGluZyBpbmZvcm1hdGlvbiAqLworc3RhdGljIHN0cnVjdCBkbW1fbWFwX29iamVjdCAqYWRkX21hcHBpbmdfaW5mbyhzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0LAorCQkJCXUzMiBtcHVfYWRkciwgdTMyIGRzcF9hZGRyLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgZG1tX21hcF9vYmplY3QgKm1hcF9vYmo7CisKKwl1MzIgbnVtX3Vzcl9wZ3MgPSBzaXplIC8gUEdfU0laRTRLOworCisJcHJfZGVidWcoIiVzOiBhZGRpbmcgbWFwIGluZm86IG1wdV9hZGRyIDB4JXggdmlydCAweCV4IHNpemUgMHgleFxuIiwKKwkJCQkJCV9fZnVuY19fLCBtcHVfYWRkciwKKwkJCQkJCWRzcF9hZGRyLCBzaXplKTsKKworCW1hcF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1tX21hcF9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hcF9vYmopIHsKKwkJcHJfZXJyKCIlczoga3phbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUlOSVRfTElTVF9IRUFEKCZtYXBfb2JqLT5saW5rKTsKKworCW1hcF9vYmotPnBhZ2VzID0ga2NhbGxvYyhudW1fdXNyX3Bncywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLAorCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghbWFwX29iai0+cGFnZXMpIHsKKwkJcHJfZXJyKCIlczoga3phbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJa2ZyZWUobWFwX29iaik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1hcF9vYmotPm1wdV9hZGRyID0gbXB1X2FkZHI7CisJbWFwX29iai0+ZHNwX2FkZHIgPSBkc3BfYWRkcjsKKwltYXBfb2JqLT5zaXplID0gc2l6ZTsKKwltYXBfb2JqLT5udW1fdXNyX3BncyA9IG51bV91c3JfcGdzOworCisJc3Bpbl9sb2NrKCZwcl9jdHh0LT5kbW1fbWFwX2xvY2spOworCWxpc3RfYWRkKCZtYXBfb2JqLT5saW5rLCAmcHJfY3R4dC0+ZG1tX21hcF9saXN0KTsKKwlzcGluX3VubG9jaygmcHJfY3R4dC0+ZG1tX21hcF9sb2NrKTsKKworCXJldHVybiBtYXBfb2JqOworfQorCitzdGF0aWMgaW50IG1hdGNoX2V4YWN0X21hcF9vYmooc3RydWN0IGRtbV9tYXBfb2JqZWN0ICptYXBfb2JqLAorCQkJCQl1MzIgZHNwX2FkZHIsIHUzMiBzaXplKQoreworCWlmIChtYXBfb2JqLT5kc3BfYWRkciA9PSBkc3BfYWRkciAmJiBtYXBfb2JqLT5zaXplICE9IHNpemUpCisJCXByX2VycigiJXM6IGFkZHIgbWF0Y2ggKDB4JXgpLCBzaXplIGRvbid0ICgweCV4ICE9IDB4JXgpXG4iLAorCQkJCV9fZnVuY19fLCBkc3BfYWRkciwgbWFwX29iai0+c2l6ZSwgc2l6ZSk7CisKKwlyZXR1cm4gbWFwX29iai0+ZHNwX2FkZHIgPT0gZHNwX2FkZHIgJiYKKwkJbWFwX29iai0+c2l6ZSA9PSBzaXplOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfbWFwcGluZ19pbmZvcm1hdGlvbihzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0LAorCQkJCQkJdTMyIGRzcF9hZGRyLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgZG1tX21hcF9vYmplY3QgKm1hcF9vYmo7CisKKwlwcl9kZWJ1ZygiJXM6IGxvb2tpbmcgZm9yIHZpcnQgMHgleCBzaXplIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCQkJCWRzcF9hZGRyLCBzaXplKTsKKworCXNwaW5fbG9jaygmcHJfY3R4dC0+ZG1tX21hcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1hcF9vYmosICZwcl9jdHh0LT5kbW1fbWFwX2xpc3QsIGxpbmspIHsKKwkJcHJfZGVidWcoIiVzOiBjYW5kaWRhdGU6IG1wdV9hZGRyIDB4JXggdmlydCAweCV4IHNpemUgMHgleFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCQltYXBfb2JqLT5tcHVfYWRkciwKKwkJCQkJCQltYXBfb2JqLT5kc3BfYWRkciwKKwkJCQkJCQltYXBfb2JqLT5zaXplKTsKKworCQlpZiAobWF0Y2hfZXhhY3RfbWFwX29iaihtYXBfb2JqLCBkc3BfYWRkciwgc2l6ZSkpIHsKKwkJCXByX2RlYnVnKCIlczogbWF0Y2gsIGRlbGV0aW5nIG1hcCBpbmZvXG4iLCBfX2Z1bmNfXyk7CisJCQlsaXN0X2RlbCgmbWFwX29iai0+bGluayk7CisJCQlrZnJlZShtYXBfb2JqLT5kbWFfaW5mby5zZyk7CisJCQlrZnJlZShtYXBfb2JqLT5wYWdlcyk7CisJCQlrZnJlZShtYXBfb2JqKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByX2RlYnVnKCIlczogY2FuZGlkYXRlIGRpZG4ndCBtYXRjaFxuIiwgX19mdW5jX18pOworCX0KKworCXByX2VycigiJXM6IGZhaWxlZCB0byBmaW5kIGdpdmVuIG1hcCBpbmZvXG4iLCBfX2Z1bmNfXyk7CitvdXQ6CisJc3Bpbl91bmxvY2soJnByX2N0eHQtPmRtbV9tYXBfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfY29udGFpbmluZ19tYXBfb2JqKHN0cnVjdCBkbW1fbWFwX29iamVjdCAqbWFwX29iaiwKKwkJCQkJdTMyIG1wdV9hZGRyLCB1MzIgc2l6ZSkKK3sKKwl1MzIgbWFwX29ial9lbmQgPSBtYXBfb2JqLT5tcHVfYWRkciArIG1hcF9vYmotPnNpemU7CisKKwlyZXR1cm4gbXB1X2FkZHIgPj0gbWFwX29iai0+bXB1X2FkZHIgJiYKKwkJbXB1X2FkZHIgKyBzaXplIDw9IG1hcF9vYmpfZW5kOworfQorCitzdGF0aWMgc3RydWN0IGRtbV9tYXBfb2JqZWN0ICpmaW5kX2NvbnRhaW5pbmdfbWFwcGluZygKKwkJCQlzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0LAorCQkJCXUzMiBtcHVfYWRkciwgdTMyIHNpemUpCit7CisJc3RydWN0IGRtbV9tYXBfb2JqZWN0ICptYXBfb2JqOworCXByX2RlYnVnKCIlczogbG9va2luZyBmb3IgbXB1X2FkZHIgMHgleCBzaXplIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCQkJbXB1X2FkZHIsIHNpemUpOworCisJc3Bpbl9sb2NrKCZwcl9jdHh0LT5kbW1fbWFwX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwX29iaiwgJnByX2N0eHQtPmRtbV9tYXBfbGlzdCwgbGluaykgeworCQlwcl9kZWJ1ZygiJXM6IGNhbmRpZGF0ZTogbXB1X2FkZHIgMHgleCB2aXJ0IDB4JXggc2l6ZSAweCV4XG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQltYXBfb2JqLT5tcHVfYWRkciwKKwkJCQkJCW1hcF9vYmotPmRzcF9hZGRyLAorCQkJCQkJbWFwX29iai0+c2l6ZSk7CisJCWlmIChtYXRjaF9jb250YWluaW5nX21hcF9vYmoobWFwX29iaiwgbXB1X2FkZHIsIHNpemUpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IG1hdGNoIVxuIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6IG5vIG1hdGNoIVxuIiwgX19mdW5jX18pOworCX0KKworCW1hcF9vYmogPSBOVUxMOworb3V0OgorCXNwaW5fdW5sb2NrKCZwcl9jdHh0LT5kbW1fbWFwX2xvY2spOworCXJldHVybiBtYXBfb2JqOworfQorCitzdGF0aWMgaW50IGZpbmRfZmlyc3RfcGFnZV9pbl9jYWNoZShzdHJ1Y3QgZG1tX21hcF9vYmplY3QgKm1hcF9vYmosCisJCQkJCXVuc2lnbmVkIGxvbmcgbXB1X2FkZHIpCit7CisJdTMyIG1hcHBlZF9iYXNlX3BhZ2UgPSBtYXBfb2JqLT5tcHVfYWRkciA+PiBQQUdFX1NISUZUOworCXUzMiByZXF1ZXN0ZWRfYmFzZV9wYWdlID0gbXB1X2FkZHIgPj4gUEFHRV9TSElGVDsKKwlpbnQgcGdfaW5kZXggPSByZXF1ZXN0ZWRfYmFzZV9wYWdlIC0gbWFwcGVkX2Jhc2VfcGFnZTsKKworCWlmIChwZ19pbmRleCA8IDAgfHwgcGdfaW5kZXggPj0gbWFwX29iai0+bnVtX3Vzcl9wZ3MpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIChnb3QgJWQpXG4iLCBfX2Z1bmNfXywgcGdfaW5kZXgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfZGVidWcoIiVzOiBmaXJzdCBwYWdlIGlzICVkXG4iLCBfX2Z1bmNfXywgcGdfaW5kZXgpOworCXJldHVybiBwZ19pbmRleDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2V0X21hcHBpbmdfcGFnZShzdHJ1Y3QgZG1tX21hcF9vYmplY3QgKm1hcF9vYmosCisJCQkJCQkJCWludCBwZ19pKQoreworCXByX2RlYnVnKCIlczogbG9va2luZyBmb3IgcGdfaSAlZCwgbnVtX3Vzcl9wZ3M6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJcGdfaSwgbWFwX29iai0+bnVtX3Vzcl9wZ3MpOworCisJaWYgKHBnX2kgPCAwIHx8IHBnX2kgPj0gbWFwX29iai0+bnVtX3Vzcl9wZ3MpIHsKKwkJcHJfZXJyKCIlczogcmVxdWVzdGVkIHBnX2kgJWQgaXMgb3V0IG9mIG1hcHBlZCByYW5nZVxuIiwKKwkJCQlfX2Z1bmNfXywgcGdfaSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBtYXBfb2JqLT5wYWdlc1twZ19pXTsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX2F0dGFjaCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFByZXBhcmUgZm9yIGNvbW11bmljYXRpb24gd2l0aCBhIHBhcnRpY3VsYXIgRFNQIHByb2Nlc3NvciwgYW5kIHJldHVybgorICogICAgICBhIGhhbmRsZSB0byB0aGUgcHJvY2Vzc29yIG9iamVjdC4KKyAqLworaW50Citwcm9jX2F0dGFjaCh1MzIgcHJvY2Vzc29yX2lkLAorCSAgICBjb25zdCBzdHJ1Y3QgZHNwX3Byb2Nlc3NvcmF0dHJpbiAqYXR0cl9pbiwKKwkgICAgdm9pZCAqKnBoX3Byb2Nlc3Nvciwgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmo7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gTlVMTDsKKwlzdHJ1Y3QgbWdyX29iamVjdCAqaG1ncl9vYmogPSBOVUxMOworCXN0cnVjdCBkcnZfb2JqZWN0ICpoZHJ2X29iaiA9IE5VTEw7CisJdTggZGV2X3R5cGU7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGhfcHJvY2Vzc29yICE9IE5VTEwpOworCisJaWYgKHByX2N0eHQtPmhwcm9jZXNzb3IpIHsKKwkJKnBoX3Byb2Nlc3NvciA9IHByX2N0eHQtPmhwcm9jZXNzb3I7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogR2V0IHRoZSBEcml2ZXIgYW5kIE1hbmFnZXIgT2JqZWN0IEhhbmRsZXMgKi8KKwlzdGF0dXMgPSBjZmdfZ2V0X29iamVjdCgodTMyICopICZoZHJ2X29iaiwgUkVHX0RSVl9PQkpFQ1QpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBjZmdfZ2V0X29iamVjdCgodTMyICopICZobWdyX29iaiwgUkVHX01HUl9PQkpFQ1QpOworCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogR2V0IHRoZSBEZXZpY2UgT2JqZWN0ICovCisJCXN0YXR1cyA9IGRydl9nZXRfZGV2X29iamVjdChwcm9jZXNzb3JfaWQsIGhkcnZfb2JqLCAmaGRldl9vYmopOworCX0KKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGV2X2dldF9kZXZfdHlwZShoZGV2X29iaiwgJmRldl90eXBlKTsKKworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCBjcmVhdGUgdGhlIFByb2NlZXNvciBvYmplY3Q6ICovCisJcF9wcm9jX29iamVjdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX29iamVjdCksIEdGUF9LRVJORUwpOworCS8qIEZpbGwgb3V0IHRoZSBQcm9jZXNzb3IgT2JqZWN0OiAqLworCWlmIChwX3Byb2Nfb2JqZWN0ID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJcF9wcm9jX29iamVjdC0+aGRldl9vYmogPSBoZGV2X29iajsKKwlwX3Byb2Nfb2JqZWN0LT5obWdyX29iaiA9IGhtZ3Jfb2JqOworCXBfcHJvY19vYmplY3QtPnByb2Nlc3Nvcl9pZCA9IGRldl90eXBlOworCS8qIFN0b3JlIFRHSUQgaW5zdGVhZCBvZiBwcm9jZXNzIGhhbmRsZSAqLworCXBfcHJvY19vYmplY3QtPnByb2Nlc3MgPSBjdXJyZW50LT50Z2lkOworCisJSU5JVF9MSVNUX0hFQUQoJnBfcHJvY19vYmplY3QtPnByb2NfbGlzdCk7CisKKwlpZiAoYXR0cl9pbikKKwkJcF9wcm9jX29iamVjdC0+dXRpbWVvdXQgPSBhdHRyX2luLT51dGltZW91dDsKKwllbHNlCisJCXBfcHJvY19vYmplY3QtPnV0aW1lb3V0ID0gUFJPQ19ERkxUX1RJTUVPVVQ7CisKKwlzdGF0dXMgPSBkZXZfZ2V0X2ludGZfZnhucyhoZGV2X29iaiwgJnBfcHJvY19vYmplY3QtPmludGZfZnhucyk7CisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0gZGV2X2dldF9icmlkZ2VfY29udGV4dChoZGV2X29iaiwKKwkJCQkJICAgICAmcF9wcm9jX29iamVjdC0+aGJyaWRnZV9jb250ZXh0KTsKKwkJaWYgKHN0YXR1cykKKwkJCWtmcmVlKHBfcHJvY19vYmplY3QpOworCX0gZWxzZQorCQlrZnJlZShwX3Byb2Nfb2JqZWN0KTsKKworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKiBDcmVhdGUgdGhlIE5vdGlmaWNhdGlvbiBPYmplY3QgKi8KKwkvKiBUaGlzIGlzIGNyZWF0ZWQgd2l0aCBubyBldmVudCBtYXNrLCBubyBub3RpZnkgbWFzaworCSAqIGFuZCBubyB2YWxpZCBoYW5kbGUgdG8gdGhlIG5vdGlmaWNhdGlvbi4gVGhleSBhbGwgZ2V0CisJICogZmlsbGVkIHVwIHdoZW4gcHJvY19yZWdpc3Rlcl9ub3RpZnkgaXMgY2FsbGVkICovCisJcF9wcm9jX29iamVjdC0+bnRmeV9vYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnRmeV9vYmplY3QpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCWlmIChwX3Byb2Nfb2JqZWN0LT5udGZ5X29iaikKKwkJbnRmeV9pbml0KHBfcHJvY19vYmplY3QtPm50Znlfb2JqKTsKKwllbHNlCisJCXN0YXR1cyA9IC1FTk9NRU07CisKKwlpZiAoIXN0YXR1cykgeworCQkvKiBJbnNlcnQgdGhlIFByb2Nlc3NvciBPYmplY3QgaW50byB0aGUgREVWIExpc3QuCisJCSAqIFJldHVybiBoYW5kbGUgdG8gdGhpcyBQcm9jZXNzb3IgT2JqZWN0OgorCQkgKiBGaW5kIG91dCBpZiB0aGUgRGV2aWNlIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYQorCQkgKiBQcm9jZXNzb3IuIElmIHNvLCByZXR1cm4gQWxyZWFkeUF0dGFjaGVkIHN0YXR1cyAqLworCQlsc3RfaW5pdF9lbGVtKCZwX3Byb2Nfb2JqZWN0LT5saW5rKTsKKwkJc3RhdHVzID0gZGV2X2luc2VydF9wcm9jX29iamVjdChwX3Byb2Nfb2JqZWN0LT5oZGV2X29iaiwKKwkJCQkJCSh1MzIpIHBfcHJvY19vYmplY3QsCisJCQkJCQkmcF9wcm9jX29iamVjdC0+CisJCQkJCQlpc19hbHJlYWR5X2F0dGFjaGVkKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWlmIChwX3Byb2Nfb2JqZWN0LT5pc19hbHJlYWR5X2F0dGFjaGVkKQorCQkJCXN0YXR1cyA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAocF9wcm9jX29iamVjdC0+bnRmeV9vYmopIHsKKwkJCQludGZ5X2RlbGV0ZShwX3Byb2Nfb2JqZWN0LT5udGZ5X29iaik7CisJCQkJa2ZyZWUocF9wcm9jX29iamVjdC0+bnRmeV9vYmopOworCQkJfQorCisJCQlrZnJlZShwX3Byb2Nfb2JqZWN0KTsKKwkJfQorCQlpZiAoIXN0YXR1cykgeworCQkJKnBoX3Byb2Nlc3NvciA9ICh2b2lkICopcF9wcm9jX29iamVjdDsKKwkJCXByX2N0eHQtPmhwcm9jZXNzb3IgPSAqcGhfcHJvY2Vzc29yOworCQkJKHZvaWQpcHJvY19ub3RpZnlfY2xpZW50cyhwX3Byb2Nfb2JqZWN0LAorCQkJCQkJICBEU1BfUFJPQ0VTU09SQVRUQUNIKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIERvbid0IGxlYWsgbWVtb3J5IGlmIHN0YXR1cyBpcyBmYWlsZWQgKi8KKwkJa2ZyZWUocF9wcm9jX29iamVjdCk7CisJfQorZnVuY19lbmQ6CisJREJDX0VOU1VSRSgoc3RhdHVzID09IC1FUEVSTSAmJiAqcGhfcHJvY2Vzc29yID09IE5VTEwpIHx8CisJCSAgICghc3RhdHVzICYmIHBfcHJvY19vYmplY3QpIHx8CisJCSAgIChzdGF0dXMgPT0gMCAmJiBwX3Byb2Nfb2JqZWN0KSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGdldF9leGVjX2ZpbGUoc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmosCisJCQkJc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqLAorCQkJCXUzMiBzaXplLCBjaGFyICpleGVjX2ZpbGUpCit7CisJdTggZGV2X3R5cGU7CisJczMyIGxlbjsKKworCWRldl9nZXRfZGV2X3R5cGUoaGRldl9vYmosICh1OCAqKSAmZGV2X3R5cGUpOworCWlmIChkZXZfdHlwZSA9PSBEU1BfVU5JVCkgeworCQlyZXR1cm4gY2ZnX2dldF9leGVjX2ZpbGUoZGV2X25vZGVfb2JqLCBzaXplLCBleGVjX2ZpbGUpOworCX0gZWxzZSBpZiAoZGV2X3R5cGUgPT0gSVZBX1VOSVQpIHsKKwkJaWYgKGl2YV9pbWcpIHsKKwkJCWxlbiA9IHN0cmxlbihpdmFfaW1nKTsKKwkJCXN0cm5jcHkoZXhlY19maWxlLCBpdmFfaW1nLCBsZW4gKyAxKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKgorICogID09PT09PT09IHByb2NfYXV0b19zdGFydCA9PT09PT09PSA9CisgKiAgUHVycG9zZToKKyAqICAgICAgQSBQYXJ0aWN1bGFyIGRldmljZSBnZXRzIGxvYWRlZCB3aXRoIHRoZSBkZWZhdWx0IGltYWdlCisgKiAgICAgIGlmIHRoZSBBdXRvU3RhcnQgZmxhZyBpcyBzZXQuCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgaGRldl9vYmo6ICAgICBIYW5kbGUgdG8gdGhlIERldmljZQorICogIFJldHVybnM6CisgKiAgICAgIDA6ICAgT24gU3VjY2Vzc2Z1bCBMb2FkaW5nCisgKiAgICAgIC1FUEVSTSAgR2VuZXJhbCBGYWlsdXJlCisgKiAgUmVxdWlyZXM6CisgKiAgICAgIGhkZXZfb2JqICE9IE5VTEwKKyAqICBFbnN1cmVzOgorICovCitpbnQgcHJvY19hdXRvX3N0YXJ0KHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqLAorCQkJICAgc3RydWN0IGRldl9vYmplY3QgKmhkZXZfb2JqKQoreworCWludCBzdGF0dXMgPSAtRVBFUk07CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0OworCWNoYXIgc3pfZXhlY19maWxlW01BWENNRExJTkVMRU5dOworCWNoYXIgKmFyZ3ZbMl07CisJc3RydWN0IG1ncl9vYmplY3QgKmhtZ3Jfb2JqID0gTlVMTDsKKwl1OCBkZXZfdHlwZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShkZXZfbm9kZV9vYmogIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoaGRldl9vYmogIT0gTlVMTCk7CisKKwkvKiBDcmVhdGUgYSBEdW1teSBQUk9DIE9iamVjdCAqLworCXN0YXR1cyA9IGNmZ19nZXRfb2JqZWN0KCh1MzIgKikgJmhtZ3Jfb2JqLCBSRUdfTUdSX09CSkVDVCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCXBfcHJvY19vYmplY3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAocF9wcm9jX29iamVjdCA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCXBfcHJvY19vYmplY3QtPmhkZXZfb2JqID0gaGRldl9vYmo7CisJcF9wcm9jX29iamVjdC0+aG1ncl9vYmogPSBobWdyX29iajsKKwlzdGF0dXMgPSBkZXZfZ2V0X2ludGZfZnhucyhoZGV2X29iaiwgJnBfcHJvY19vYmplY3QtPmludGZfZnhucyk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRldl9nZXRfYnJpZGdlX2NvbnRleHQoaGRldl9vYmosCisJCQkJCSAgICAgJnBfcHJvY19vYmplY3QtPmhicmlkZ2VfY29udGV4dCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisKKwkvKiBTdG9wIHRoZSBEZXZpY2UsIHB1dCBpdCBpbnRvIHN0YW5kYnkgbW9kZSAqLworCXN0YXR1cyA9IHByb2Nfc3RvcChwX3Byb2Nfb2JqZWN0KTsKKworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19jb250OworCisJLyogR2V0IHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUgZm9yIHRoaXMgYm9hcmQuLi4gKi8KKwlkZXZfZ2V0X2Rldl90eXBlKGhkZXZfb2JqLCAodTggKikgJmRldl90eXBlKTsKKwlwX3Byb2Nfb2JqZWN0LT5wcm9jZXNzb3JfaWQgPSBkZXZfdHlwZTsKKwlzdGF0dXMgPSBnZXRfZXhlY19maWxlKGRldl9ub2RlX29iaiwgaGRldl9vYmosIHNpemVvZihzel9leGVjX2ZpbGUpLAorCQkJICAgICAgIHN6X2V4ZWNfZmlsZSk7CisJaWYgKCFzdGF0dXMpIHsKKwkJYXJndlswXSA9IHN6X2V4ZWNfZmlsZTsKKwkJYXJndlsxXSA9IE5VTEw7CisJCS8qIC4uLmFuZCB0cnkgdG8gbG9hZCBpdDogKi8KKwkJc3RhdHVzID0gcHJvY19sb2FkKHBfcHJvY19vYmplY3QsIDEsIChjb25zdCBjaGFyICoqKWFyZ3YsIE5VTEwpOworCQlpZiAoIXN0YXR1cykKKwkJCXN0YXR1cyA9IHByb2Nfc3RhcnQocF9wcm9jX29iamVjdCk7CisJfQorCWtmcmVlKHBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYpOworCXBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYgPSBOVUxMOworZnVuY19jb250OgorCWtmcmVlKHBfcHJvY19vYmplY3QpOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX2N0cmwgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBQYXNzIGNvbnRyb2wgaW5mb3JtYXRpb24gdG8gdGhlIEdQUCBkZXZpY2UgZHJpdmVyIG1hbmFnaW5nIHRoZQorICogICAgICBEU1AgcHJvY2Vzc29yLgorICoKKyAqICAgICAgVGhpcyB3aWxsIGJlIGFuIE9FTS1vbmx5IGZ1bmN0aW9uLCBhbmQgbm90IHBhcnQgb2YgdGhlIERTUC9CSU9TIEJyaWRnZQorICogICAgICBhcHBsaWNhdGlvbiBkZXZlbG9wZXIncyBBUEkuCisgKiAgICAgIENhbGwgdGhlIGJyaWRnZV9kZXZfY3RybCBmeG4gd2l0aCB0aGUgQXJndW1lbnQuIFRoaXMgaXMgYSBTeW5jaHJvbm91cworICogICAgICBPcGVyYXRpb24uIGFyZyBjYW4gYmUgbnVsbC4KKyAqLworaW50IHByb2NfY3RybCh2b2lkICpocHJvY2Vzc29yLCB1MzIgZHdfY21kLCBzdHJ1Y3QgZHNwX2NiZGF0YSAqIGFyZykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPSBocHJvY2Vzc29yOworCXUzMiB0aW1lb3V0ID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmIChwX3Byb2Nfb2JqZWN0KSB7CisJCS8qIGludGVyY2VwdCBQV1IgZGVlcCBzbGVlcCBjb21tYW5kICovCisJCWlmIChkd19jbWQgPT0gQlJESU9DVExfREVFUFNMRUVQKSB7CisJCQl0aW1lb3V0ID0gYXJnLT5jYl9kYXRhOworCQkJc3RhdHVzID0gcHdyX3NsZWVwX2RzcChQV1JfREVFUFNMRUVQLCB0aW1lb3V0KTsKKwkJfQorCQkvKiBpbnRlcmNlcHQgUFdSIGVtZXJnZW5jeSBzbGVlcCBjb21tYW5kICovCisJCWVsc2UgaWYgKGR3X2NtZCA9PSBCUkRJT0NUTF9FTUVSR0VOQ1lTTEVFUCkgeworCQkJdGltZW91dCA9IGFyZy0+Y2JfZGF0YTsKKwkJCXN0YXR1cyA9IHB3cl9zbGVlcF9kc3AoUFdSX0VNRVJHRU5DWURFRVBTTEVFUCwgdGltZW91dCk7CisJCX0gZWxzZSBpZiAoZHdfY21kID09IFBXUl9ERUVQU0xFRVApIHsKKwkJCS8qIHRpbWVvdXQgPSBhcmctPmNiX2RhdGE7ICovCisJCQlzdGF0dXMgPSBwd3Jfc2xlZXBfZHNwKFBXUl9ERUVQU0xFRVAsIHRpbWVvdXQpOworCQl9CisJCS8qIGludGVyY2VwdCBQV1Igd2FrZSBjb21tYW5kcyAqLworCQllbHNlIGlmIChkd19jbWQgPT0gQlJESU9DVExfV0FLRVVQKSB7CisJCQl0aW1lb3V0ID0gYXJnLT5jYl9kYXRhOworCQkJc3RhdHVzID0gcHdyX3dha2VfZHNwKHRpbWVvdXQpOworCQl9IGVsc2UgaWYgKGR3X2NtZCA9PSBQV1JfV0FLRVVQKSB7CisJCQkvKiB0aW1lb3V0ID0gYXJnLT5jYl9kYXRhOyAqLworCQkJc3RhdHVzID0gcHdyX3dha2VfZHNwKHRpbWVvdXQpOworCQl9IGVsc2UKKwkJICAgIGlmICghKCgqcF9wcm9jX29iamVjdC0+aW50Zl9meG5zLT5wZm5fZGV2X2NudHJsKQorCQkJCSAgICAgIChwX3Byb2Nfb2JqZWN0LT5oYnJpZGdlX2NvbnRleHQsIGR3X2NtZCwKKwkJCQkgICAgICAgYXJnKSkpIHsKKwkJCXN0YXR1cyA9IDA7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19kZXRhY2ggPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEZXN0cm95cyB0aGUgIFByb2Nlc3NvciBPYmplY3QuIFJlbW92ZXMgdGhlIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBEZXYKKyAqICAgICAgTGlzdC4KKyAqLworaW50IHByb2NfZGV0YWNoKHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gTlVMTDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCXBfcHJvY19vYmplY3QgPSAoc3RydWN0IHByb2Nfb2JqZWN0ICopcHJfY3R4dC0+aHByb2Nlc3NvcjsKKworCWlmIChwX3Byb2Nfb2JqZWN0KSB7CisJCS8qIE5vdGlmeSB0aGUgQ2xpZW50ICovCisJCW50Znlfbm90aWZ5KHBfcHJvY19vYmplY3QtPm50Znlfb2JqLCBEU1BfUFJPQ0VTU09SREVUQUNIKTsKKwkJLyogUmVtb3ZlIHRoZSBub3RpZmljYXRpb24gbWVtb3J5ICovCisJCWlmIChwX3Byb2Nfb2JqZWN0LT5udGZ5X29iaikgeworCQkJbnRmeV9kZWxldGUocF9wcm9jX29iamVjdC0+bnRmeV9vYmopOworCQkJa2ZyZWUocF9wcm9jX29iamVjdC0+bnRmeV9vYmopOworCQl9CisKKwkJa2ZyZWUocF9wcm9jX29iamVjdC0+cHN6X2xhc3RfY29mZik7CisJCXBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYgPSBOVUxMOworCQkvKiBSZW1vdmUgdGhlIFByb2MgZnJvbSB0aGUgREVWIExpc3QgKi8KKwkJKHZvaWQpZGV2X3JlbW92ZV9wcm9jX29iamVjdChwX3Byb2Nfb2JqZWN0LT5oZGV2X29iaiwKKwkJCQkJICAgICAodTMyKSBwX3Byb2Nfb2JqZWN0KTsKKwkJLyogRnJlZSB0aGUgUHJvY2Vzc29yIE9iamVjdCAqLworCQlrZnJlZShwX3Byb2Nfb2JqZWN0KTsKKwkJcHJfY3R4dC0+aHByb2Nlc3NvciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHByb2NfZW51bV9ub2RlcyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVudW1lcmF0ZSBhbmQgZ2V0IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgbm9kZXMgYWxsb2NhdGVkCisgKiAgICAgIG9uIGEgRFNQIHByb2Nlc3Nvci4KKyAqLworaW50IHByb2NfZW51bV9ub2Rlcyh2b2lkICpocHJvY2Vzc29yLCB2b2lkICoqbm9kZV90YWIsCisJCQkgICB1MzIgbm9kZV90YWJfc2l6ZSwgdTMyICpwdV9udW1fbm9kZXMsCisJCQkgICB1MzIgKnB1X2FsbG9jYXRlZCkKK3sKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworCXN0cnVjdCBwcm9jX29iamVjdCAqcF9wcm9jX29iamVjdCA9IChzdHJ1Y3QgcHJvY19vYmplY3QgKilocHJvY2Vzc29yOworCXN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyID0gTlVMTDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShub2RlX3RhYiAhPSBOVUxMIHx8IG5vZGVfdGFiX3NpemUgPT0gMCk7CisJREJDX1JFUVVJUkUocHVfbnVtX25vZGVzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHB1X2FsbG9jYXRlZCAhPSBOVUxMKTsKKworCWlmIChwX3Byb2Nfb2JqZWN0KSB7CisJCWlmICghKGRldl9nZXRfbm9kZV9tYW5hZ2VyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqLAorCQkJCQkJICAgICAgICZobm9kZV9tZ3IpKSkgeworCQkJaWYgKGhub2RlX21ncikgeworCQkJCXN0YXR1cyA9IG5vZGVfZW51bV9ub2Rlcyhobm9kZV9tZ3IsIG5vZGVfdGFiLAorCQkJCQkJCSBub2RlX3RhYl9zaXplLAorCQkJCQkJCSBwdV9udW1fbm9kZXMsCisJCQkJCQkJIHB1X2FsbG9jYXRlZCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhY2hlIG9wZXJhdGlvbiBhZ2FpbnN0IGtlcm5lbCBhZGRyZXNzIGluc3RlYWQgb2YgdXNlcnMgKi8KK3N0YXRpYyBpbnQgYnVpbGRfZG1hX3NnKHN0cnVjdCBkbW1fbWFwX29iamVjdCAqbWFwX29iaiwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJCXNzaXplX3QgbGVuLCBpbnQgcGdfaSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzc2l6ZV90IHJlc3Q7CisJaW50IHJldCA9IDAsIGkgPSAwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBtYXBfb2JqLT5kbWFfaW5mby5zZzsKKworCXdoaWxlIChsZW4pIHsKKwkJcGFnZSA9IGdldF9tYXBwaW5nX3BhZ2UobWFwX29iaiwgcGdfaSk7CisJCWlmICghcGFnZSkgeworCQkJcHJfZXJyKCIlczogbm8gcGFnZSBmb3IgJTA4bHhcbiIsIF9fZnVuY19fLCBzdGFydCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQlwcl9lcnIoIiVzOiBlcnIgcGFnZSBmb3IgJTA4bHgoJWx1KVxuIiwgX19mdW5jX18sIHN0YXJ0LAorCQkJICAgICAgIFBUUl9FUlIocGFnZSkpOworCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJb2Zmc2V0ID0gc3RhcnQgJiB+UEFHRV9NQVNLOworCQlyZXN0ID0gbWluX3Qoc3NpemVfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBsZW4pOworCisJCXNnX3NldF9wYWdlKCZzZ1tpXSwgcGFnZSwgcmVzdCwgb2Zmc2V0KTsKKworCQlsZW4gLT0gcmVzdDsKKwkJc3RhcnQgKz0gcmVzdDsKKwkJcGdfaSsrLCBpKys7CisJfQorCisJaWYgKGkgIT0gbWFwX29iai0+ZG1hX2luZm8ubnVtX3BhZ2VzKSB7CisJCXByX2VycigiJXM6IGJhZCBudW1iZXIgb2Ygc2cgaXRlcmF0aW9uc1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbW9yeV9yZWdhaW5fb3duZXJzaGlwKHN0cnVjdCBkbW1fbWFwX29iamVjdCAqbWFwX29iaiwKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgc3NpemVfdCBsZW4sIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X2RhdGFfcGFnZSA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X2RhdGFfcGFnZSA9ICgodTMyKShzdGFydCArIGxlbiAtIDEpID4+IFBBR0VfU0hJRlQpOworCS8qIGNhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBhcmVhIHNwYW5zICovCisJdW5zaWduZWQgbG9uZyBudW1fcGFnZXMgPSBsYXN0X2RhdGFfcGFnZSAtIGZpcnN0X2RhdGFfcGFnZSArIDE7CisJc3RydWN0IGJyaWRnZV9kbWFfbWFwX2luZm8gKmRtYV9pbmZvID0gJm1hcF9vYmotPmRtYV9pbmZvOworCisJaWYgKCFkbWFfaW5mby0+c2cpCisJCWdvdG8gb3V0OworCisJaWYgKGRtYV9pbmZvLT5kaXIgIT0gZGlyIHx8IGRtYV9pbmZvLT5udW1fcGFnZXMgIT0gbnVtX3BhZ2VzKSB7CisJCXByX2VycigiJXM6IGRtYSBpbmZvIGRvZXNuJ3QgbWF0Y2ggZ2l2ZW4gcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRtYV91bm1hcF9zZyhicmlkZ2UsIGRtYV9pbmZvLT5zZywgbnVtX3BhZ2VzLCBkbWFfaW5mby0+ZGlyKTsKKworCXByX2RlYnVnKCIlczogZG1hX21hcF9zZyB1bm1hcHBlZFxuIiwgX19mdW5jX18pOworCisJa2ZyZWUoZG1hX2luZm8tPnNnKTsKKworCW1hcF9vYmotPmRtYV9pbmZvLnNnID0gTlVMTDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIENhY2hlIG9wZXJhdGlvbiBhZ2FpbnN0IGtlcm5lbCBhZGRyZXNzIGluc3RlYWQgb2YgdXNlcnMgKi8KK3N0YXRpYyBpbnQgbWVtb3J5X2dpdmVfb3duZXJzaGlwKHN0cnVjdCBkbW1fbWFwX29iamVjdCAqbWFwX29iaiwKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgc3NpemVfdCBsZW4sIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlpbnQgcGdfaSwgcmV0LCBzZ19udW07CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X2RhdGFfcGFnZSA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X2RhdGFfcGFnZSA9ICgodTMyKShzdGFydCArIGxlbiAtIDEpID4+IFBBR0VfU0hJRlQpOworCS8qIGNhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBhcmVhIHNwYW5zICovCisJdW5zaWduZWQgbG9uZyBudW1fcGFnZXMgPSBsYXN0X2RhdGFfcGFnZSAtIGZpcnN0X2RhdGFfcGFnZSArIDE7CisKKwlwZ19pID0gZmluZF9maXJzdF9wYWdlX2luX2NhY2hlKG1hcF9vYmosIHN0YXJ0KTsKKwlpZiAocGdfaSA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGZpbmQgZmlyc3QgcGFnZSBpbiBjYWNoZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlzZyA9IGtjYWxsb2MobnVtX3BhZ2VzLCBzaXplb2YoKnNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZykgeworCQlwcl9lcnIoIiVzOiBrY2FsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlzZ19pbml0X3RhYmxlKHNnLCBudW1fcGFnZXMpOworCisJLyogY2xlYW51cCBhIHByZXZpb3VzIHNnIGFsbG9jYXRpb24gKi8KKwkvKiB0aGlzIG1heSBoYXBwZW4gaWYgYXBwbGljYXRpb24gZG9lc24ndCBzaWduYWwgZm9yIGUvbyBETUEgKi8KKwlrZnJlZShtYXBfb2JqLT5kbWFfaW5mby5zZyk7CisKKwltYXBfb2JqLT5kbWFfaW5mby5zZyA9IHNnOworCW1hcF9vYmotPmRtYV9pbmZvLmRpciA9IGRpcjsKKwltYXBfb2JqLT5kbWFfaW5mby5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisKKwlyZXQgPSBidWlsZF9kbWFfc2cobWFwX29iaiwgc3RhcnQsIGxlbiwgcGdfaSk7CisJaWYgKHJldCkKKwkJZ290byBrZnJlZV9zZzsKKworCXNnX251bSA9IGRtYV9tYXBfc2coYnJpZGdlLCBzZywgbnVtX3BhZ2VzLCBkaXIpOworCWlmIChzZ19udW0gPCAxKSB7CisJCXByX2VycigiJXM6IGRtYV9tYXBfc2cgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHNnX251bSk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8ga2ZyZWVfc2c7CisJfQorCisJcHJfZGVidWcoIiVzOiBkbWFfbWFwX3NnIG1hcHBlZCAlZCBlbGVtZW50c1xuIiwgX19mdW5jX18sIHNnX251bSk7CisJbWFwX29iai0+ZG1hX2luZm8uc2dfbnVtID0gc2dfbnVtOworCisJcmV0dXJuIDA7CisKK2tmcmVlX3NnOgorCWtmcmVlKHNnKTsKKwltYXBfb2JqLT5kbWFfaW5mby5zZyA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IHByb2NfYmVnaW5fZG1hKHZvaWQgKmhwcm9jZXNzb3IsIHZvaWQgKnBtcHVfYWRkciwgdTMyIHVsX3NpemUsCisJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCS8qIEtlZXAgU1RBVFVTIGhlcmUgZm9yIGZ1dHVyZSBhZGRpdGlvbnMgdG8gdGhpcyBmdW5jdGlvbiAqLworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQgPSAoc3RydWN0IHByb2Nlc3NfY29udGV4dCAqKSBocHJvY2Vzc29yOworCXN0cnVjdCBkbW1fbWFwX29iamVjdCAqbWFwX29iajsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCWlmICghcHJfY3R4dCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcHJfZGVidWcoIiVzOiBhZGRyIDB4JXgsIHNpemUgMHgleCwgdHlwZSAlZFxuIiwgX19mdW5jX18sCisJCQkJCQkJKHUzMilwbXB1X2FkZHIsCisJCQkJCQkJdWxfc2l6ZSwgZGlyKTsKKworCS8qIGZpbmQgcmVxdWVzdGVkIG1lbW9yeSBhcmUgaW4gY2FjaGVkIG1hcHBpbmcgaW5mb3JtYXRpb24gKi8KKwltYXBfb2JqID0gZmluZF9jb250YWluaW5nX21hcHBpbmcocHJfY3R4dCwgKHUzMikgcG1wdV9hZGRyLCB1bF9zaXplKTsKKwlpZiAoIW1hcF9vYmopIHsKKwkJcHJfZXJyKCIlczogZmluZF9jb250YWluaW5nX21hcHBpbmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAobWVtb3J5X2dpdmVfb3duZXJzaGlwKG1hcF9vYmosICh1MzIpIHBtcHVfYWRkciwgdWxfc2l6ZSwgZGlyKSkgeworCQlwcl9lcnIoIiVzOiBJblZhbGlkIGFkZHJlc3MgcGFyYW1ldGVycyAlcCAleFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcG1wdV9hZGRyLCB1bF9zaXplKTsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9CisKK2Vycl9vdXQ6CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcHJvY19lbmRfZG1hKHZvaWQgKmhwcm9jZXNzb3IsIHZvaWQgKnBtcHVfYWRkciwgdTMyIHVsX3NpemUsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJLyogS2VlcCBTVEFUVVMgaGVyZSBmb3IgZnV0dXJlIGFkZGl0aW9ucyB0byB0aGlzIGZ1bmN0aW9uICovCisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCA9IChzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICopIGhwcm9jZXNzb3I7CisJc3RydWN0IGRtbV9tYXBfb2JqZWN0ICptYXBfb2JqOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJaWYgKCFwcl9jdHh0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGFkZHIgMHgleCwgc2l6ZSAweCV4LCB0eXBlICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCQkodTMyKXBtcHVfYWRkciwKKwkJCQkJCQl1bF9zaXplLCBkaXIpOworCisJLyogZmluZCByZXF1ZXN0ZWQgbWVtb3J5IGFyZSBpbiBjYWNoZWQgbWFwcGluZyBpbmZvcm1hdGlvbiAqLworCW1hcF9vYmogPSBmaW5kX2NvbnRhaW5pbmdfbWFwcGluZyhwcl9jdHh0LCAodTMyKSBwbXB1X2FkZHIsIHVsX3NpemUpOworCWlmICghbWFwX29iaikgeworCQlwcl9lcnIoIiVzOiBmaW5kX2NvbnRhaW5pbmdfbWFwcGluZyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChtZW1vcnlfcmVnYWluX293bmVyc2hpcChtYXBfb2JqLCAodTMyKSBwbXB1X2FkZHIsIHVsX3NpemUsIGRpcikpIHsKKwkJcHJfZXJyKCIlczogSW5WYWxpZCBhZGRyZXNzIHBhcmFtZXRlcnMgJXAgJXhcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcG1wdV9hZGRyLCB1bF9zaXplKTsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBlcnJfb3V0OworCX0KKworZXJyX291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHByb2NfZmx1c2hfbWVtb3J5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICBGbHVzaCBjYWNoZQorICovCitpbnQgcHJvY19mbHVzaF9tZW1vcnkodm9pZCAqaHByb2Nlc3Nvciwgdm9pZCAqcG1wdV9hZGRyLAorCQkJICAgICB1MzIgdWxfc2l6ZSwgdTMyIHVsX2ZsYWdzKQoreworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciA9IERNQV9CSURJUkVDVElPTkFMOworCisJcmV0dXJuIHByb2NfYmVnaW5fZG1hKGhwcm9jZXNzb3IsIHBtcHVfYWRkciwgdWxfc2l6ZSwgZGlyKTsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX2ludmFsaWRhdGVfbWVtb3J5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICBJbnZhbGlkYXRlcyB0aGUgbWVtb3J5IHNwZWNpZmllZAorICovCitpbnQgcHJvY19pbnZhbGlkYXRlX21lbW9yeSh2b2lkICpocHJvY2Vzc29yLCB2b2lkICpwbXB1X2FkZHIsIHUzMiBzaXplKQoreworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciA9IERNQV9GUk9NX0RFVklDRTsKKworCXJldHVybiBwcm9jX2JlZ2luX2RtYShocHJvY2Vzc29yLCBwbXB1X2FkZHIsIHNpemUsIGRpcik7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19nZXRfcmVzb3VyY2VfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEVudW1lcmF0ZSB0aGUgcmVzb3VyY2VzIGN1cnJlbnRseSBhdmFpbGFibGUgb24gYSBwcm9jZXNzb3IuCisgKi8KK2ludCBwcm9jX2dldF9yZXNvdXJjZV9pbmZvKHZvaWQgKmhwcm9jZXNzb3IsIHUzMiByZXNvdXJjZV90eXBlLAorCQkJCSAgc3RydWN0IGRzcF9yZXNvdXJjZWluZm8gKnJlc291cmNlX2luZm8sCisJCQkJICB1MzIgcmVzb3VyY2VfaW5mb19zaXplKQoreworCWludCBzdGF0dXMgPSAtRVBFUk07CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gKHN0cnVjdCBwcm9jX29iamVjdCAqKWhwcm9jZXNzb3I7CisJc3RydWN0IG5vZGVfbWdyICpobm9kZV9tZ3IgPSBOVUxMOworCXN0cnVjdCBubGRyX29iamVjdCAqbmxkcl9vYmogPSBOVUxMOworCXN0cnVjdCBybW1fdGFyZ2V0X29iaiAqcm1tID0gTlVMTDsKKwlzdHJ1Y3QgaW9fbWdyICpoaW9fbWdyID0gTlVMTDsJLyogSU8gbWFuYWdlciBoYW5kbGUgKi8KKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShyZXNvdXJjZV9pbmZvICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHJlc291cmNlX2luZm9fc2l6ZSA+PSBzaXplb2Yoc3RydWN0IGRzcF9yZXNvdXJjZWluZm8pKTsKKworCWlmICghcF9wcm9jX29iamVjdCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwlzd2l0Y2ggKHJlc291cmNlX3R5cGUpIHsKKwljYXNlIERTUF9SRVNPVVJDRV9EWU5EQVJBTToKKwljYXNlIERTUF9SRVNPVVJDRV9EWU5TQVJBTToKKwljYXNlIERTUF9SRVNPVVJDRV9EWU5FWFRFUk5BTDoKKwljYXNlIERTUF9SRVNPVVJDRV9EWU5TUkFNOgorCQlzdGF0dXMgPSBkZXZfZ2V0X25vZGVfbWFuYWdlcihwX3Byb2Nfb2JqZWN0LT5oZGV2X29iaiwKKwkJCQkJICAgICAgJmhub2RlX21ncik7CisJCWlmICghaG5vZGVfbWdyKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCisJCXN0YXR1cyA9IG5vZGVfZ2V0X25sZHJfb2JqKGhub2RlX21nciwgJm5sZHJfb2JqKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXN0YXR1cyA9IG5sZHJfZ2V0X3JtbV9tYW5hZ2VyKG5sZHJfb2JqLCAmcm1tKTsKKwkJCWlmIChybW0pIHsKKwkJCQlpZiAoIXJtbV9zdGF0KHJtbSwKKwkJCQkJICAgICAgKGVudW0gZHNwX21lbXR5cGUpcmVzb3VyY2VfdHlwZSwKKwkJCQkJICAgICAgKHN0cnVjdCBkc3BfbWVtc3RhdCAqKQorCQkJCQkgICAgICAmKHJlc291cmNlX2luZm8tPnJlc3VsdC4KKwkJCQkJCW1lbV9zdGF0KSkpCisJCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEU1BfUkVTT1VSQ0VfUFJPQ0xPQUQ6CisJCXN0YXR1cyA9IGRldl9nZXRfaW9fbWdyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqLCAmaGlvX21ncik7CisJCWlmIChoaW9fbWdyKQorCQkJc3RhdHVzID0KKwkJCSAgICBwX3Byb2Nfb2JqZWN0LT5pbnRmX2Z4bnMtPgorCQkJICAgIHBmbl9pb19nZXRfcHJvY19sb2FkKGhpb19tZ3IsCisJCQkJCQkgKHN0cnVjdCBkc3BfcHJvY2xvYWRzdGF0ICopCisJCQkJCQkgJihyZXNvdXJjZV9pbmZvLT5yZXN1bHQuCisJCQkJCQkgICBwcm9jX2xvYWRfc3RhdCkpOworCQllbHNlCisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRVBFUk07CisJCWJyZWFrOworCX0KK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCwgYW5kIGZyZWUgcmVzb3VyY2VzIHdoZW4gcmVmZXJlbmNlIGNvdW50IGlzCisgKiAgICAgIDAuCisgKi8KK3ZvaWQgcHJvY19leGl0KHZvaWQpCit7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJcmVmcy0tOworCisJREJDX0VOU1VSRShyZWZzID49IDApOworfQorCisvKgorICogID09PT09PT09IHByb2NfZ2V0X2Rldl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm4gdGhlIERldiBPYmplY3QgaGFuZGxlIGZvciBhIGdpdmVuIFByb2Nlc3Nvci4KKyAqCisgKi8KK2ludCBwcm9jX2dldF9kZXZfb2JqZWN0KHZvaWQgKmhwcm9jZXNzb3IsCisJCQkgICAgICAgc3RydWN0IGRldl9vYmplY3QgKipkZXZpY2Vfb2JqKQoreworCWludCBzdGF0dXMgPSAtRVBFUk07CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gKHN0cnVjdCBwcm9jX29iamVjdCAqKWhwcm9jZXNzb3I7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoZGV2aWNlX29iaiAhPSBOVUxMKTsKKworCWlmIChwX3Byb2Nfb2JqZWN0KSB7CisJCSpkZXZpY2Vfb2JqID0gcF9wcm9jX29iamVjdC0+aGRldl9vYmo7CisJCXN0YXR1cyA9IDA7CisJfSBlbHNlIHsKKwkJKmRldmljZV9vYmogPSBOVUxMOworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgKmRldmljZV9vYmogIT0gTlVMTCkgfHwKKwkJICAgKHN0YXR1cyAmJiAqZGV2aWNlX29iaiA9PSBOVUxMKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHByb2NfZ2V0X3N0YXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVwb3J0IHRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIERTUCBwcm9jZXNzb3IuCisgKi8KK2ludCBwcm9jX2dldF9zdGF0ZSh2b2lkICpocHJvY2Vzc29yLAorCQkJICBzdHJ1Y3QgZHNwX3Byb2Nlc3NvcnN0YXRlICpwcm9jX3N0YXRlX29iaiwKKwkJCSAgdTMyIHN0YXRlX2luZm9fc2l6ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPSAoc3RydWN0IHByb2Nfb2JqZWN0ICopaHByb2Nlc3NvcjsKKwlpbnQgYnJkX3N0YXR1czsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShwcm9jX3N0YXRlX29iaiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShzdGF0ZV9pbmZvX3NpemUgPj0gc2l6ZW9mKHN0cnVjdCBkc3BfcHJvY2Vzc29yc3RhdGUpKTsKKworCWlmIChwX3Byb2Nfb2JqZWN0KSB7CisJCS8qIEZpcnN0LCByZXRyaWV2ZSBCUkQgc3RhdGUgaW5mb3JtYXRpb24gKi8KKwkJc3RhdHVzID0gKCpwX3Byb2Nfb2JqZWN0LT5pbnRmX2Z4bnMtPnBmbl9icmRfc3RhdHVzKQorCQkgICAgKHBfcHJvY19vYmplY3QtPmhicmlkZ2VfY29udGV4dCwgJmJyZF9zdGF0dXMpOworCQlpZiAoIXN0YXR1cykgeworCQkJc3dpdGNoIChicmRfc3RhdHVzKSB7CisJCQljYXNlIEJSRF9TVE9QUEVEOgorCQkJCXByb2Nfc3RhdGVfb2JqLT5wcm9jX3N0YXRlID0gUFJPQ19TVE9QUEVEOworCQkJCWJyZWFrOworCQkJY2FzZSBCUkRfU0xFRVBfVFJBTlNJVElPTjoKKwkJCWNhc2UgQlJEX0RTUF9ISUJFUk5BVElPTjoKKwkJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgQlJEX1JVTk5JTkc6CisJCQkJcHJvY19zdGF0ZV9vYmotPnByb2Nfc3RhdGUgPSBQUk9DX1JVTk5JTkc7CisJCQkJYnJlYWs7CisJCQljYXNlIEJSRF9MT0FERUQ6CisJCQkJcHJvY19zdGF0ZV9vYmotPnByb2Nfc3RhdGUgPSBQUk9DX0xPQURFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlJEX0VSUk9SOgorCQkJCXByb2Nfc3RhdGVfb2JqLT5wcm9jX3N0YXRlID0gUFJPQ19FUlJPUjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJvY19zdGF0ZV9vYmotPnByb2Nfc3RhdGUgPSAweEZGOworCQkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCWRldl9kYmcoYnJpZGdlLCAiJXMsIHJlc3VsdHM6IHN0YXR1czogMHgleCBwcm9jX3N0YXRlX29iajogMHgleFxuIiwKKwkJX19mdW5jX18sIHN0YXR1cywgcHJvY19zdGF0ZV9vYmotPnByb2Nfc3RhdGUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19nZXRfdHJhY2UgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgdHJhY2UgYnVmZmVyLCBsb2NhdGVkIG9uIHRoZQorICogICAgICBQcm9jZXNzb3IuICBQcmVkZWZpbmVkIHN5bWJvbHMgZm9yIHRoZSB0cmFjZSBidWZmZXIgbXVzdCBoYXZlIGJlZW4KKyAqICAgICAgY29uZmlndXJlZCBpbnRvIHRoZSBEU1AgZXhlY3V0YWJsZS4KKyAqICBEZXRhaWxzOgorICogICAgICBXZSBzdXBwb3J0IHVzaW5nIHRoZSBzeW1ib2xzIFNZU19QVVRDQkVHIGFuZCBTWVNfUFVUQ0VORCB0byBkZWZpbmUgYQorICogICAgICB0cmFjZSBidWZmZXIsIG9ubHkuICBUcmVhdCBpdCBhcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZS4KKyAqICAgICAgVGhpcyBjYWxsIGlzIGRlc3RydWN0aXZlLCBtZWFuaW5nIHRoZSBwcm9jZXNzb3IgaXMgcGxhY2VkIGluIHRoZSBtb25pdG9yCisgKiAgICAgIHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBwcm9jX2dldF90cmFjZSh2b2lkICpocHJvY2Vzc29yLCB1OCAqIHBidWYsIHUzMiBtYXhfc2l6ZSkKK3sKKwlpbnQgc3RhdHVzOworCXN0YXR1cyA9IC1FTk9TWVM7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIFBST0MncyBwcml2YXRlIHN0YXRlLCBrZWVwaW5nIGEgcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggY2FsbAorICovCitib29sIHByb2NfaW5pdCh2b2lkKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlpZiAocmV0KQorCQlyZWZzKys7CisKKwlEQkNfRU5TVVJFKChyZXQgJiYgKHJlZnMgPiAwKSkgfHwgKCFyZXQgJiYgKHJlZnMgPj0gMCkpKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19sb2FkID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVzZXQgYSBwcm9jZXNzb3IgYW5kIGxvYWQgYSBuZXcgYmFzZSBwcm9ncmFtIGltYWdlLgorICogICAgICBUaGlzIHdpbGwgYmUgYW4gT0VNLW9ubHkgZnVuY3Rpb24sIGFuZCBub3QgcGFydCBvZiB0aGUgRFNQL0JJT1MgQnJpZGdlCisgKiAgICAgIGFwcGxpY2F0aW9uIGRldmVsb3BlcidzIEFQSS4KKyAqLworaW50IHByb2NfbG9hZCh2b2lkICpocHJvY2Vzc29yLCBjb25zdCBzMzIgYXJnY19pbmRleCwKKwkJICAgICBjb25zdCBjaGFyICoqdXNlcl9hcmdzLCBjb25zdCBjaGFyICoqdXNlcl9lbnZwKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwcm9jX29iamVjdCAqcF9wcm9jX29iamVjdCA9IChzdHJ1Y3QgcHJvY19vYmplY3QgKilocHJvY2Vzc29yOworCXN0cnVjdCBpb19tZ3IgKmhpb19tZ3I7CS8qIElPIG1hbmFnZXIgaGFuZGxlICovCisJc3RydWN0IG1zZ19tZ3IgKmhtc2dfbWdyOworCXN0cnVjdCBjb2RfbWFuYWdlciAqY29kX21ncjsJLyogQ29kZSBtYW5hZ2VyIGhhbmRsZSAqLworCWNoYXIgKnBhcmd2MDsJCS8qIHRlbXAgYXJndlswXSBwdHIgKi8KKwljaGFyICoqbmV3X2VudnA7CS8qIFVwZGF0ZWQgZW52cFtdIGFycmF5LiAqLworCWNoYXIgc3pfcHJvY19pZFtNQVhQUk9DSURMRU5dOwkvKiBTaXplIG9mICJQUk9DX0lEPTxuPiIgKi8KKwlzMzIgZW52cF9lbGVtczsJCS8qIE51bSBlbGVtZW50cyBpbiBlbnZwW10uICovCisJczMyIGNuZXdfZW52cDsJCS8qICIgICIgaW4gbmV3X2VudnBbXSAqLworCXMzMiBucHJvY19pZCA9IDA7CS8qIEFudGljaXBhdGUgTVAgdmVyc2lvbi4gKi8KKwlzdHJ1Y3QgZGNkX21hbmFnZXIgKmhkY2RfaGFuZGxlOworCXN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fbWdyOworCXUzMiBkd19leHRfZW5kOworCXUzMiBwcm9jX2lkOworCWludCBicmRfc3RhdGU7CisJc3RydWN0IGRydl9kYXRhICpkcnZfZGF0YXAgPSBkZXZfZ2V0X2RydmRhdGEoYnJpZGdlKTsKKworI2lmZGVmIE9QVF9MT0FEX1RJTUVfSU5TVFJVTUVOVEFUSU9OCisJc3RydWN0IHRpbWV2YWwgdHYxOworCXN0cnVjdCB0aW1ldmFsIHR2MjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVElEU1BCUklER0VfRFZGUykgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9GUkVRKQorCXN0cnVjdCBkc3BicmlkZ2VfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCSAgICBvbWFwX2RzcGJyaWRnZV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworI2VuZGlmCisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoYXJnY19pbmRleCA+IDApOworCURCQ19SRVFVSVJFKHVzZXJfYXJncyAhPSBOVUxMKTsKKworI2lmZGVmIE9QVF9MT0FEX1RJTUVfSU5TVFJVTUVOVEFUSU9OCisJZG9fZ2V0dGltZW9mZGF5KCZ0djEpOworI2VuZGlmCisJaWYgKCFwX3Byb2Nfb2JqZWN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCWRldl9nZXRfY29kX21ncihwX3Byb2Nfb2JqZWN0LT5oZGV2X29iaiwgJmNvZF9tZ3IpOworCWlmICghY29kX21ncikgeworCQlzdGF0dXMgPSAtRVBFUk07CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCXN0YXR1cyA9IHByb2Nfc3RvcChocHJvY2Vzc29yKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyogUGxhY2UgdGhlIGJvYXJkIGluIHRoZSBtb25pdG9yIHN0YXRlLiAqLworCXN0YXR1cyA9IHByb2NfbW9uaXRvcihocHJvY2Vzc29yKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyogU2F2ZSBwdHIgdG8gIG9yaWdpbmFsIGFyZ3ZbMF0uICovCisJcGFyZ3YwID0gKGNoYXIgKil1c2VyX2FyZ3NbMF07CisJLypQcmVwZW5kICJQUk9DX0lEPTxucHJvY19pZD4idG8gZW52cCBhcnJheSBmb3IgdGFyZ2V0LiAqLworCWVudnBfZWxlbXMgPSBnZXRfZW52cF9jb3VudCgoY2hhciAqKil1c2VyX2VudnApOworCWNuZXdfZW52cCA9IChlbnZwX2VsZW1zID8gKGVudnBfZWxlbXMgKyAxKSA6IChlbnZwX2VsZW1zICsgMikpOworCW5ld19lbnZwID0ga3phbGxvYyhjbmV3X2VudnAgKiBzaXplb2YoY2hhciAqKiksIEdGUF9LRVJORUwpOworCWlmIChuZXdfZW52cCkgeworCQlzdGF0dXMgPSBzbnByaW50Zihzel9wcm9jX2lkLCBNQVhQUk9DSURMRU4sIFBST0NfRU5WUFJPQ0lELAorCQkJCSAgbnByb2NfaWQpOworCQlpZiAoc3RhdHVzID09IC0xKSB7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBQcm9jIElEIHN0cmluZyBvdmVyZmxvd1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0gZWxzZSB7CisJCQluZXdfZW52cCA9CisJCQkgICAgcHJlcGVuZF9lbnZwKG5ld19lbnZwLCAoY2hhciAqKil1c2VyX2VudnAsCisJCQkJCSBlbnZwX2VsZW1zLCBjbmV3X2VudnAsIHN6X3Byb2NfaWQpOworCQkJLyogR2V0IHRoZSBEQ0QgSGFuZGxlICovCisJCQlzdGF0dXMgPSBtZ3JfZ2V0X2RjZF9oYW5kbGUocF9wcm9jX29iamVjdC0+aG1ncl9vYmosCisJCQkJCQkgICAgKHUzMiAqKSAmaGRjZF9oYW5kbGUpOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQkvKiAgQmVmb3JlIHByb2NlZWRpbmcgd2l0aCBuZXcgbG9hZCwKKwkJCQkgKiAgY2hlY2sgaWYgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgQ09GRgorCQkJCSAqICBleGlzdHMuCisJCQkJICogIElmIHllcywgdW5yZWdpc3RlciBub2RlcyBpbiBwcmV2aW91c2x5CisJCQkJICogIHJlZ2lzdGVyZWQgQ09GRi4gIElmIGFueSBlcnJvciBvY2N1cnJlZCwKKwkJCQkgKiAgc2V0IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBDT0ZGIHRvIE5VTEwuICovCisJCQkJaWYgKHBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYgIT0gTlVMTCkgeworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgZGNkX2F1dG9fdW5yZWdpc3RlcihoZGNkX2hhbmRsZSwKKwkJCQkJCQkJcF9wcm9jX29iamVjdC0+CisJCQkJCQkJCXBzel9sYXN0X2NvZmYpOworCQkJCQkvKiBSZWdhcmRsZXNzIG9mIGF1dG8gdW5yZWdpc3RlciBzdGF0dXMsCisJCQkJCSAqICBmcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkCisJCQkJCSAqICBtZW1vcnkuICovCisJCQkJCWtmcmVlKHBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYpOworCQkJCQlwX3Byb2Nfb2JqZWN0LT5wc3pfbGFzdF9jb2ZmID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQkvKiBPbiBzdWNjZXNzLCBkbyBjb2Rfb3Blbl9iYXNlKCkgKi8KKwkJCXN0YXR1cyA9IGNvZF9vcGVuX2Jhc2UoY29kX21nciwgKGNoYXIgKil1c2VyX2FyZ3NbMF0sCisJCQkJCSAgICAgICBDT0RfU1lNQik7CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBBdXRvLXJlZ2lzdGVyIGRhdGEgYmFzZSAqLworCQkvKiBHZXQgdGhlIERDRCBIYW5kbGUgKi8KKwkJc3RhdHVzID0gbWdyX2dldF9kY2RfaGFuZGxlKHBfcHJvY19vYmplY3QtPmhtZ3Jfb2JqLAorCQkJCQkgICAgKHUzMiAqKSAmaGRjZF9oYW5kbGUpOworCQlpZiAoIXN0YXR1cykgeworCQkJLyogIEF1dG8gcmVnaXN0ZXIgbm9kZXMgaW4gc3BlY2lmaWVkIENPRkYKKwkJCSAqICBmaWxlLiAgSWYgcmVnaXN0cmF0aW9uIGRpZCBub3QgZmFpbCwKKwkJCSAqICAoc3RhdHVzID0gMCBvciAtRUFDQ0VTKQorCQkJICogIHNhdmUgdGhlIG5hbWUgb2YgdGhlIENPRkYgZmlsZSBmb3IKKwkJCSAqICBkZS1yZWdpc3RyYXRpb24gaW4gdGhlIGZ1dHVyZS4gKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgZGNkX2F1dG9fcmVnaXN0ZXIoaGRjZF9oYW5kbGUsCisJCQkJCSAgICAgIChjaGFyICopdXNlcl9hcmdzWzBdKTsKKwkJCWlmIChzdGF0dXMgPT0gLUVBQ0NFUykKKwkJCQlzdGF0dXMgPSAwOworCisJCQlpZiAoc3RhdHVzKSB7CisJCQkJc3RhdHVzID0gLUVQRVJNOworCQkJfSBlbHNlIHsKKwkJCQlEQkNfQVNTRVJUKHBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYgPT0KKwkJCQkJICAgTlVMTCk7CisJCQkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBwc3pMYXN0Q29mZiAqLworCQkJCXBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYgPQorCQkJCQkJa3phbGxvYygoc3RybGVuKHVzZXJfYXJnc1swXSkgKworCQkJCQkJMSksIEdGUF9LRVJORUwpOworCQkJCS8qIElmIG1lbW9yeSBhbGxvY2F0ZWQsIHNhdmUgQ09GRiBmaWxlIG5hbWUgKi8KKwkJCQlpZiAocF9wcm9jX29iamVjdC0+cHN6X2xhc3RfY29mZikgeworCQkJCQlzdHJuY3B5KHBfcHJvY19vYmplY3QtPnBzel9sYXN0X2NvZmYsCisJCQkJCQkoY2hhciAqKXVzZXJfYXJnc1swXSwKKwkJCQkJCShzdHJsZW4oKGNoYXIgKil1c2VyX2FyZ3NbMF0pICsKKwkJCQkJCSAxKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qIFVwZGF0ZSBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgYW5kIHNpemUgKi8KKwlpZiAoIXN0YXR1cykgeworCQkvKiAgQ3JlYXRlIHRoZSBtZXNzYWdlIG1hbmFnZXIuIFRoaXMgbXVzdCBiZSBkb25lCisJCSAqICBiZWZvcmUgY2FsbGluZyB0aGUgSU9PbkxvYWRlZCBmdW5jdGlvbi4gKi8KKwkJZGV2X2dldF9tc2dfbWdyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqLCAmaG1zZ19tZ3IpOworCQlpZiAoIWhtc2dfbWdyKSB7CisJCQlzdGF0dXMgPSBtc2dfY3JlYXRlKCZobXNnX21nciwgcF9wcm9jX29iamVjdC0+aGRldl9vYmosCisJCQkJCSAgICAobXNnX29uZXhpdCkgbm9kZV9vbl9leGl0KTsKKwkJCURCQ19BU1NFUlQoIXN0YXR1cyk7CisJCQlkZXZfc2V0X21zZ19tZ3IocF9wcm9jX29iamVjdC0+aGRldl9vYmosIGhtc2dfbWdyKTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBTZXQgdGhlIERldmljZSBvYmplY3QncyBtZXNzYWdlIG1hbmFnZXIgKi8KKwkJc3RhdHVzID0gZGV2X2dldF9pb19tZ3IocF9wcm9jX29iamVjdC0+aGRldl9vYmosICZoaW9fbWdyKTsKKwkJaWYgKGhpb19tZ3IpCisJCQlzdGF0dXMgPSAoKnBfcHJvY19vYmplY3QtPmludGZfZnhucy0+cGZuX2lvX29uX2xvYWRlZCkKKwkJCQkJCQkJKGhpb19tZ3IpOworCQllbHNlCisJCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKwlpZiAoIXN0YXR1cykgeworCQkvKiBOb3csIGF0dGVtcHQgdG8gbG9hZCBhbiBleGVjOiAqLworCisJCS8qIEJvb3N0IHRoZSBPUFAgbGV2ZWwgdG8gTWF4aW11bSBsZXZlbCBzdXBwb3J0ZWQgYnkgYmFzZXBvcnQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19USURTUEJSSURHRV9EVkZTKSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVEpCisJCWlmIChwZGF0YS0+Y3B1X3NldF9mcmVxKQorCQkJKCpwZGF0YS0+Y3B1X3NldF9mcmVxKSAocGRhdGEtPm1wdV9zcGVlZFtWREQxX09QUDVdKTsKKyNlbmRpZgorCQlzdGF0dXMgPSBjb2RfbG9hZF9iYXNlKGNvZF9tZ3IsIGFyZ2NfaW5kZXgsIChjaGFyICoqKXVzZXJfYXJncywKKwkJCQkgICAgICAgZGV2X2JyZF93cml0ZV9meG4sCisJCQkJICAgICAgIHBfcHJvY19vYmplY3QtPmhkZXZfb2JqLCBOVUxMKTsKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKHN0YXR1cyA9PSAtRUJBREYpIHsKKwkJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsdXJlIHRvIExvYWQgdGhlIEVYRVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJfQorCQkJaWYgKHN0YXR1cyA9PSAtRVNQSVBFKSB7CisJCQkJcHJfZXJyKCIlczogQ291bGRuJ3QgcGFyc2UgdGhlIGZpbGVcbiIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCX0KKwkJfQorCQkvKiBSZXF1ZXN0aW5nIHRoZSBsb3dlc3Qgb3BwIHN1cHBvcnRlZCAqLworI2lmIGRlZmluZWQoQ09ORklHX1RJRFNQQlJJREdFX0RWRlMpICYmICFkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkKKwkJaWYgKHBkYXRhLT5jcHVfc2V0X2ZyZXEpCisJCQkoKnBkYXRhLT5jcHVfc2V0X2ZyZXEpIChwZGF0YS0+bXB1X3NwZWVkW1ZERDFfT1BQMV0pOworI2VuZGlmCisKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogVXBkYXRlIHRoZSBQcm9jZXNzb3Igc3RhdHVzIHRvIGxvYWRlZCAqLworCQlzdGF0dXMgPSAoKnBfcHJvY19vYmplY3QtPmludGZfZnhucy0+cGZuX2JyZF9zZXRfc3RhdGUpCisJCSAgICAocF9wcm9jX29iamVjdC0+aGJyaWRnZV9jb250ZXh0LCBCUkRfTE9BREVEKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXBfcHJvY19vYmplY3QtPnByb2Nfc3RhdGUgPSBQUk9DX0xPQURFRDsKKwkJCWlmIChwX3Byb2Nfb2JqZWN0LT5udGZ5X29iaikKKwkJCQlwcm9jX25vdGlmeV9jbGllbnRzKHBfcHJvY19vYmplY3QsCisJCQkJCQkgICAgRFNQX1BST0NFU1NPUlNUQVRFQ0hBTkdFKTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQoaHByb2Nlc3NvciwgJnByb2NfaWQpOworCQlpZiAocHJvY19pZCA9PSBEU1BfVU5JVCkgeworCQkJLyogVXNlIGFsbCBhdmFpbGFibGUgRFNQIGFkZHJlc3Mgc3BhY2UgYWZ0ZXIgRVhUTUVNCisJCQkgKiBmb3IgRE1NICovCisJCQlpZiAoIXN0YXR1cykKKwkJCQlzdGF0dXMgPSBjb2RfZ2V0X3N5bV92YWx1ZShjb2RfbWdyLCBFWFRFTkQsCisJCQkJCQkJICAgJmR3X2V4dF9lbmQpOworCisJCQkvKiBSZXNldCBETU0gc3RydWN0cyBhbmQgYWRkIGFuIGluaXRpYWwgZnJlZSBjaHVuayAqLworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBkZXZfZ2V0X2RtbV9tZ3IocF9wcm9jX29iamVjdC0+aGRldl9vYmosCisJCQkJCQkgICAgJmRtbV9tZ3IpOworCQkJCWlmIChkbW1fbWdyKSB7CisJCQkJCS8qIFNldCBkd19leHRfZW5kIHRvIERNTSBTVEFSVCB1OAorCQkJCQkgKiBhZGRyZXNzICovCisJCQkJCWR3X2V4dF9lbmQgPQorCQkJCQkgICAgKGR3X2V4dF9lbmQgKyAxKSAqIERTUFdPUkRTSVpFOworCQkJCQkvKiBETU0gbWVtb3J5IGlzIGZyb20gRVhUX0VORCAqLworCQkJCQlzdGF0dXMgPSBkbW1fY3JlYXRlX3RhYmxlcyhkbW1fbWdyLAorCQkJCQkJCQkgICBkd19leHRfZW5kLAorCQkJCQkJCQkgICBETU1QT09MU0laRSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgYXJndlswXSAqLworCWtmcmVlKG5ld19lbnZwKTsKKwl1c2VyX2FyZ3NbMF0gPSBwYXJndjA7CisJaWYgKCFzdGF0dXMpIHsKKwkJaWYgKCEoKCpwX3Byb2Nfb2JqZWN0LT5pbnRmX2Z4bnMtPnBmbl9icmRfc3RhdHVzKQorCQkJCShwX3Byb2Nfb2JqZWN0LT5oYnJpZGdlX2NvbnRleHQsICZicmRfc3RhdGUpKSkgeworCQkJcHJfaW5mbygiJXM6IFByb2Nlc3NvciBMb2FkZWQgJXNcbiIsIF9fZnVuY19fLCBwYXJndjApOworCQkJa2ZyZWUoZHJ2X2RhdGFwLT5iYXNlX2ltZyk7CisJCQlkcnZfZGF0YXAtPmJhc2VfaW1nID0ga21hbGxvYyhzdHJsZW4ocGFyZ3YwKSArIDEsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKGRydl9kYXRhcC0+YmFzZV9pbWcpCisJCQkJc3RybmNweShkcnZfZGF0YXAtPmJhc2VfaW1nLCBwYXJndjAsCisJCQkJCQkJc3RybGVuKHBhcmd2MCkgKyAxKTsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJREJDX0FTU0VSVChicmRfc3RhdGUgPT0gQlJEX0xPQURFRCk7CisJCX0KKwl9CisKK2Z1bmNfZW5kOgorCWlmIChzdGF0dXMpIHsKKwkJcHJfZXJyKCIlczogUHJvY2Vzc29yIGZhaWxlZCB0byBsb2FkXG4iLCBfX2Z1bmNfXyk7CisJCXByb2Nfc3RvcChwX3Byb2Nfb2JqZWN0KTsKKwl9CisJREJDX0VOU1VSRSgoIXN0YXR1cworCQkgICAgJiYgcF9wcm9jX29iamVjdC0+cHJvY19zdGF0ZSA9PSBQUk9DX0xPQURFRCkKKwkJICAgfHwgc3RhdHVzKTsKKyNpZmRlZiBPUFRfTE9BRF9USU1FX0lOU1RSVU1FTlRBVElPTgorCWRvX2dldHRpbWVvZmRheSgmdHYyKTsKKwlpZiAodHYyLnR2X3VzZWMgPCB0djEudHZfdXNlYykgeworCQl0djIudHZfdXNlYyArPSAxMDAwMDAwOworCQl0djIudHZfc2VjLS07CisJfQorCWRldl9kYmcoYnJpZGdlLCAiJXM6IHRpbWUgdG8gbG9hZCAlZCBzZWMgYW5kICVkIHVzZWNcbiIsIF9fZnVuY19fLAorCQl0djIudHZfc2VjIC0gdHYxLnR2X3NlYywgdHYyLnR2X3VzZWMgLSB0djEudHZfdXNlYyk7CisjZW5kaWYKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHByb2NfbWFwID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgTWFwcyBhIE1QVSBidWZmZXIgdG8gRFNQIGFkZHJlc3Mgc3BhY2UuCisgKi8KK2ludCBwcm9jX21hcCh2b2lkICpocHJvY2Vzc29yLCB2b2lkICpwbXB1X2FkZHIsIHUzMiB1bF9zaXplLAorCQkgICAgdm9pZCAqcmVxX2FkZHIsIHZvaWQgKipwcF9tYXBfYWRkciwgdTMyIHVsX21hcF9hdHRyLAorCQkgICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCkKK3sKKwl1MzIgdmFfYWxpZ247CisJdTMyIHBhX2FsaWduOworCXN0cnVjdCBkbW1fb2JqZWN0ICpkbW1fbWdyOworCXUzMiBzaXplX2FsaWduOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwcm9jX29iamVjdCAqcF9wcm9jX29iamVjdCA9IChzdHJ1Y3QgcHJvY19vYmplY3QgKilocHJvY2Vzc29yOworCXN0cnVjdCBkbW1fbWFwX29iamVjdCAqbWFwX29iajsKKwl1MzIgdG1wX2FkZHIgPSAwOworCisjaWZkZWYgQ09ORklHX1RJRFNQQlJJREdFX0NBQ0hFX0xJTkVfQ0hFQ0sKKwlpZiAoKHVsX21hcF9hdHRyICYgQlVGTU9ERV9NQVNLKSAhPSBSQlVGKSB7CisJCWlmICghSVNfQUxJR05FRCgodTMyKXBtcHVfYWRkciwgRFNQX0NBQ0hFX0xJTkUpIHx8CisJCSAgICAhSVNfQUxJR05FRCh1bF9zaXplLCBEU1BfQ0FDSEVfTElORSkpIHsKKwkJCXByX2VycigiJXM6IG5vdCBhbGlnbmVkOiAweCV4ICglZClcbiIsIF9fZnVuY19fLAorCQkJCQkJKHUzMilwbXB1X2FkZHIsIHVsX3NpemUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIENhbGN1bGF0ZSB0aGUgcGFnZS1hbGlnbmVkIFBBLCBWQSBhbmQgc2l6ZSAqLworCXZhX2FsaWduID0gUEdfQUxJR05fTE9XKCh1MzIpIHJlcV9hZGRyLCBQR19TSVpFNEspOworCXBhX2FsaWduID0gUEdfQUxJR05fTE9XKCh1MzIpIHBtcHVfYWRkciwgUEdfU0laRTRLKTsKKwlzaXplX2FsaWduID0gUEdfQUxJR05fSElHSCh1bF9zaXplICsgKHUzMikgcG1wdV9hZGRyIC0gcGFfYWxpZ24sCisJCQkJICAgUEdfU0laRTRLKTsKKworCWlmICghcF9wcm9jX29iamVjdCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkvKiBDcml0aWNhbCBzZWN0aW9uICovCisJbXV0ZXhfbG9jaygmcHJvY19sb2NrKTsKKwlkbW1fZ2V0X2hhbmRsZShwX3Byb2Nfb2JqZWN0LCAmZG1tX21ncik7CisJaWYgKGRtbV9tZ3IpCisJCXN0YXR1cyA9IGRtbV9tYXBfbWVtb3J5KGRtbV9tZ3IsIHZhX2FsaWduLCBzaXplX2FsaWduKTsKKwllbHNlCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwkvKiBBZGQgbWFwcGluZyB0byB0aGUgcGFnZSB0YWJsZXMuICovCisJaWYgKCFzdGF0dXMpIHsKKworCQkvKiBNYXBwZWQgYWRkcmVzcyA9IE1TQiBvZiBWQSB8IExTQiBvZiBQQSAqLworCQl0bXBfYWRkciA9ICh2YV9hbGlnbiB8ICgodTMyKSBwbXB1X2FkZHIgJiAoUEdfU0laRTRLIC0gMSkpKTsKKwkJLyogbWFwcGVkIG1lbW9yeSByZXNvdXJjZSB0cmFja2luZyAqLworCQltYXBfb2JqID0gYWRkX21hcHBpbmdfaW5mbyhwcl9jdHh0LCBwYV9hbGlnbiwgdG1wX2FkZHIsCisJCQkJCQlzaXplX2FsaWduKTsKKwkJaWYgKCFtYXBfb2JqKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJZWxzZQorCQkJc3RhdHVzID0gKCpwX3Byb2Nfb2JqZWN0LT5pbnRmX2Z4bnMtPnBmbl9icmRfbWVtX21hcCkKKwkJCSAgICAocF9wcm9jX29iamVjdC0+aGJyaWRnZV9jb250ZXh0LCBwYV9hbGlnbiwgdmFfYWxpZ24sCisJCQkgICAgIHNpemVfYWxpZ24sIHVsX21hcF9hdHRyLCBtYXBfb2JqLT5wYWdlcyk7CisJfQorCWlmICghc3RhdHVzKSB7CisJCS8qIE1hcHBlZCBhZGRyZXNzID0gTVNCIG9mIFZBIHwgTFNCIG9mIFBBICovCisJCSpwcF9tYXBfYWRkciA9ICh2b2lkICopIHRtcF9hZGRyOworCX0gZWxzZSB7CisJCXJlbW92ZV9tYXBwaW5nX2luZm9ybWF0aW9uKHByX2N0eHQsIHRtcF9hZGRyLCBzaXplX2FsaWduKTsKKwkJZG1tX3VuX21hcF9tZW1vcnkoZG1tX21nciwgdmFfYWxpZ24sICZzaXplX2FsaWduKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwcm9jX2xvY2spOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworZnVuY19lbmQ6CisJZGV2X2RiZyhicmlkZ2UsICIlczogaHByb2Nlc3NvciAlcCwgcG1wdV9hZGRyICVwLCB1bF9zaXplICV4LCAiCisJCSJyZXFfYWRkciAlcCwgdWxfbWFwX2F0dHIgJXgsIHBwX21hcF9hZGRyICVwLCB2YV9hbGlnbiAleCwgIgorCQkicGFfYWxpZ24gJXgsIHNpemVfYWxpZ24gJXggc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLAorCQlocHJvY2Vzc29yLCBwbXB1X2FkZHIsIHVsX3NpemUsIHJlcV9hZGRyLCB1bF9tYXBfYXR0ciwKKwkJcHBfbWFwX2FkZHIsIHZhX2FsaWduLCBwYV9hbGlnbiwgc2l6ZV9hbGlnbiwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19yZWdpc3Rlcl9ub3RpZnkgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZWdpc3RlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWZpYyBwcm9jZXNzb3IgZXZlbnRzLgorICovCitpbnQgcHJvY19yZWdpc3Rlcl9ub3RpZnkodm9pZCAqaHByb2Nlc3NvciwgdTMyIGV2ZW50X21hc2ssCisJCQkJdTMyIG5vdGlmeV90eXBlLCBzdHJ1Y3QgZHNwX25vdGlmaWNhdGlvbgorCQkJCSogaG5vdGlmaWNhdGlvbikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPSAoc3RydWN0IHByb2Nfb2JqZWN0ICopaHByb2Nlc3NvcjsKKwlzdHJ1Y3QgZGVoX21nciAqaGRlaF9tZ3I7CisKKwlEQkNfUkVRVUlSRShobm90aWZpY2F0aW9uICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKworCS8qIENoZWNrIHByb2Nlc3NvciBoYW5kbGUgKi8KKwlpZiAoIXBfcHJvY19vYmplY3QpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJLyogQ2hlY2sgaWYgZXZlbnQgbWFzayBpcyBhIHZhbGlkIHByb2Nlc3NvciByZWxhdGVkIGV2ZW50ICovCisJaWYgKGV2ZW50X21hc2sgJiB+KERTUF9QUk9DRVNTT1JTVEFURUNIQU5HRSB8IERTUF9QUk9DRVNTT1JBVFRBQ0ggfAorCQkJRFNQX1BST0NFU1NPUkRFVEFDSCB8IERTUF9QUk9DRVNTT1JSRVNUQVJUIHwKKwkJCURTUF9NTVVGQVVMVCB8IERTUF9TWVNFUlJPUiB8IERTUF9QV1JFUlJPUiB8CisJCQlEU1BfV0RUT1ZFUkZMT1cpKQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJLyogQ2hlY2sgaWYgbm90aWZ5IHR5cGUgaXMgdmFsaWQgKi8KKwlpZiAobm90aWZ5X3R5cGUgIT0gRFNQX1NJR05BTEVWRU5UKQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogSWYgZXZlbnQgbWFzayBpcyBub3QgRFNQX1NZU0VSUk9SLCBEU1BfTU1VRkFVTFQsCisJCSAqIG9yIERTUF9QV1JFUlJPUiB0aGVuIHJlZ2lzdGVyIGV2ZW50IGltbWVkaWF0ZWx5LiAqLworCQlpZiAoZXZlbnRfbWFzayAmCisJCSAgICB+KERTUF9TWVNFUlJPUiB8IERTUF9NTVVGQVVMVCB8IERTUF9QV1JFUlJPUiB8CisJCQkJRFNQX1dEVE9WRVJGTE9XKSkgeworCQkJc3RhdHVzID0gbnRmeV9yZWdpc3RlcihwX3Byb2Nfb2JqZWN0LT5udGZ5X29iaiwKKwkJCQkJICAgICAgIGhub3RpZmljYXRpb24sIGV2ZW50X21hc2ssCisJCQkJCSAgICAgICBub3RpZnlfdHlwZSk7CisJCQkvKiBTcGVjaWFsIGNhc2UgYWxlcnQsIHNwZWNpYWwgY2FzZSBhbGVydCEKKwkJCSAqIElmIHdlJ3JlIHRyeWluZyB0byAqZGVyZWdpc3RlciogKGkuZS4gZXZlbnRfbWFzaworCQkJICogaXMgMCksIGEgRFNQX1NZU0VSUk9SIG9yIERTUF9NTVVGQVVMVCBub3RpZmljYXRpb24sCisJCQkgKiB3ZSBoYXZlIHRvIGRlcmVnaXN0ZXIgd2l0aCB0aGUgREVIIG1hbmFnZXIuCisJCQkgKiBUaGVyZSdzIG5vIHdheSB0byBrbm93LCBiYXNlZCBvbiBldmVudF9tYXNrIHdoaWNoCisJCQkgKiBtYW5hZ2VyIHRoZSBub3RpZmljYXRpb24gZXZlbnQgd2FzIHJlZ2lzdGVyZWQgd2l0aCwKKwkJCSAqIHNvIGlmIHdlJ3JlIHRyeWluZyB0byBkZXJlZ2lzdGVyIGFuZCBudGZ5X3JlZ2lzdGVyCisJCQkgKiBmYWlsZWQsIHdlJ2xsIGdpdmUgdGhlIGRlaCBtYW5hZ2VyIGEgc2hvdC4KKwkJCSAqLworCQkJaWYgKChldmVudF9tYXNrID09IDApICYmIHN0YXR1cykgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGRldl9nZXRfZGVoX21ncihwX3Byb2Nfb2JqZWN0LT5oZGV2X29iaiwKKwkJCQkJCSAgICAmaGRlaF9tZ3IpOworCQkJCXN0YXR1cyA9CisJCQkJCWJyaWRnZV9kZWhfcmVnaXN0ZXJfbm90aWZ5KGhkZWhfbWdyLAorCQkJCQkJCWV2ZW50X21hc2ssCisJCQkJCQkJbm90aWZ5X3R5cGUsCisJCQkJCQkJaG5vdGlmaWNhdGlvbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBkZXZfZ2V0X2RlaF9tZ3IocF9wcm9jX29iamVjdC0+aGRldl9vYmosCisJCQkJCQkgJmhkZWhfbWdyKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYnJpZGdlX2RlaF9yZWdpc3Rlcl9ub3RpZnkoaGRlaF9tZ3IsCisJCQkJCSAgICBldmVudF9tYXNrLAorCQkJCQkgICAgbm90aWZ5X3R5cGUsCisJCQkJCSAgICBobm90aWZpY2F0aW9uKTsKKworCQl9CisJfQorZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX3Jlc2VydmVfbWVtb3J5ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVzZXJ2ZSBhIHZpcnR1YWxseSBjb250aWd1b3VzIHJlZ2lvbiBvZiBEU1AgYWRkcmVzcyBzcGFjZS4KKyAqLworaW50IHByb2NfcmVzZXJ2ZV9tZW1vcnkodm9pZCAqaHByb2Nlc3NvciwgdTMyIHVsX3NpemUsCisJCQkgICAgICAgdm9pZCAqKnBwX3Jzdl9hZGRyLAorCQkJICAgICAgIHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpCit7CisJc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3I7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gKHN0cnVjdCBwcm9jX29iamVjdCAqKWhwcm9jZXNzb3I7CisJc3RydWN0IGRtbV9yc3Zfb2JqZWN0ICpyc3Zfb2JqOworCisJaWYgKCFwX3Byb2Nfb2JqZWN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJc3RhdHVzID0gZG1tX2dldF9oYW5kbGUocF9wcm9jX29iamVjdCwgJmRtbV9tZ3IpOworCWlmICghZG1tX21ncikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCXN0YXR1cyA9IGRtbV9yZXNlcnZlX21lbW9yeShkbW1fbWdyLCB1bF9zaXplLCAodTMyICopIHBwX3Jzdl9hZGRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gZnVuY19lbmQ7CisKKwkvKgorCSAqIEEgc3VjY2Vzc2Z1bCByZXNlcnZlIHNob3VsZCBiZSBmb2xsb3dlZCBieSBpbnNlcnRpb24gb2YgcnN2X29iagorCSAqIGludG8gZG1tX3Jzdl9saXN0LCBzbyB0aGF0IHJlc2VydmVkIG1lbW9yeSByZXNvdXJjZSB0cmFja2luZworCSAqIHJlbWFpbnMgdXB0b2RhdGUKKwkgKi8KKwlyc3Zfb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRtbV9yc3Zfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJzdl9vYmopIHsKKwkJcnN2X29iai0+ZHNwX3Jlc2VydmVkX2FkZHIgPSAodTMyKSAqcHBfcnN2X2FkZHI7CisJCXNwaW5fbG9jaygmcHJfY3R4dC0+ZG1tX3Jzdl9sb2NrKTsKKwkJbGlzdF9hZGQoJnJzdl9vYmotPmxpbmssICZwcl9jdHh0LT5kbW1fcnN2X2xpc3QpOworCQlzcGluX3VubG9jaygmcHJfY3R4dC0+ZG1tX3Jzdl9sb2NrKTsKKwl9CisKK2Z1bmNfZW5kOgorCWRldl9kYmcoYnJpZGdlLCAiJXM6IGhwcm9jZXNzb3I6IDB4JXAgdWxfc2l6ZTogMHgleCBwcF9yc3ZfYWRkcjogMHglcCAiCisJCSJzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIGhwcm9jZXNzb3IsCisJCXVsX3NpemUsIHBwX3Jzdl9hZGRyLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19zdGFydCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFN0YXJ0IGEgcHJvY2Vzc29yIHJ1bm5pbmcuCisgKi8KK2ludCBwcm9jX3N0YXJ0KHZvaWQgKmhwcm9jZXNzb3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gKHN0cnVjdCBwcm9jX29iamVjdCAqKWhwcm9jZXNzb3I7CisJc3RydWN0IGNvZF9tYW5hZ2VyICpjb2RfbWdyOwkvKiBDb2RlIG1hbmFnZXIgaGFuZGxlICovCisJdTMyIGR3X2RzcF9hZGRyOwkvKiBMb2FkZWQgY29kZSdzIGVudHJ5IHBvaW50LiAqLworCWludCBicmRfc3RhdGU7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJaWYgKCFwX3Byb2Nfb2JqZWN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCS8qIENhbGwgdGhlIGJyaWRnZV9icmRfc3RhcnQgKi8KKwlpZiAocF9wcm9jX29iamVjdC0+cHJvY19zdGF0ZSAhPSBQUk9DX0xPQURFRCkgeworCQlzdGF0dXMgPSAtRUJBRFI7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCXN0YXR1cyA9IGRldl9nZXRfY29kX21ncihwX3Byb2Nfb2JqZWN0LT5oZGV2X29iaiwgJmNvZF9tZ3IpOworCWlmICghY29kX21ncikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfY29udDsKKwl9CisKKwlzdGF0dXMgPSBjb2RfZ2V0X2VudHJ5KGNvZF9tZ3IsICZkd19kc3BfYWRkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisKKwlzdGF0dXMgPSAoKnBfcHJvY19vYmplY3QtPmludGZfZnhucy0+cGZuX2JyZF9zdGFydCkKKwkgICAgKHBfcHJvY19vYmplY3QtPmhicmlkZ2VfY29udGV4dCwgZHdfZHNwX2FkZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19jb250OworCisJLyogQ2FsbCBkZXZfY3JlYXRlMiAqLworCXN0YXR1cyA9IGRldl9jcmVhdGUyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqKTsKKwlpZiAoIXN0YXR1cykgeworCQlwX3Byb2Nfb2JqZWN0LT5wcm9jX3N0YXRlID0gUFJPQ19SVU5OSU5HOworCQkvKiBEZWVwIHNsZWVwIHN3aXRjZXMgb2ZmIHRoZSBwZXJpcGhlcmFsIGNsb2Nrcy4KKwkJICogd2UganVzdCBwdXQgdGhlIERTUCBDUFUgaW4gaWRsZSBpbiB0aGUgaWRsZSBsb29wLgorCQkgKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYSBjb21tYW5kIHRvIERTUCAqLworCisJCWlmIChwX3Byb2Nfb2JqZWN0LT5udGZ5X29iaikgeworCQkJcHJvY19ub3RpZnlfY2xpZW50cyhwX3Byb2Nfb2JqZWN0LAorCQkJCQkgICAgRFNQX1BST0NFU1NPUlNUQVRFQ0hBTkdFKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEZhaWxlZCB0byBDcmVhdGUgTm9kZSBNYW5hZ2VyIGFuZCBESVNQIE9iamVjdAorCQkgKiBTdG9wIHRoZSBQcm9jZXNzb3IgZnJvbSBydW5uaW5nLiBQdXQgaXQgaW4gU1RPUFBFRCBTdGF0ZSAqLworCQkodm9pZCkoKnBfcHJvY19vYmplY3QtPmludGZfZnhucy0+CisJCSAgICAgICBwZm5fYnJkX3N0b3ApIChwX3Byb2Nfb2JqZWN0LT5oYnJpZGdlX2NvbnRleHQpOworCQlwX3Byb2Nfb2JqZWN0LT5wcm9jX3N0YXRlID0gUFJPQ19TVE9QUEVEOworCX0KK2Z1bmNfY29udDoKKwlpZiAoIXN0YXR1cykgeworCQlpZiAoISgoKnBfcHJvY19vYmplY3QtPmludGZfZnhucy0+cGZuX2JyZF9zdGF0dXMpCisJCQkJKHBfcHJvY19vYmplY3QtPmhicmlkZ2VfY29udGV4dCwgJmJyZF9zdGF0ZSkpKSB7CisJCQlwcl9pbmZvKCIlczogZHNwIGluIHJ1bm5pbmcgc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJCURCQ19BU1NFUlQoYnJkX3N0YXRlICE9IEJSRF9ISUJFUk5BVElPTik7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc3RhcnQgdGhlIGRzcFxuIiwgX19mdW5jX18pOworCQlwcm9jX3N0b3AocF9wcm9jX29iamVjdCk7CisJfQorCitmdW5jX2VuZDoKKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmIHBfcHJvY19vYmplY3QtPnByb2Nfc3RhdGUgPT0KKwkJICAgIFBST0NfUlVOTklORykgfHwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHByb2Nfc3RvcCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFN0b3AgYSBwcm9jZXNzb3IgcnVubmluZy4KKyAqLworaW50IHByb2Nfc3RvcCh2b2lkICpocHJvY2Vzc29yKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwcm9jX29iamVjdCAqcF9wcm9jX29iamVjdCA9IChzdHJ1Y3QgcHJvY19vYmplY3QgKilocHJvY2Vzc29yOworCXN0cnVjdCBtc2dfbWdyICpobXNnX21ncjsKKwlzdHJ1Y3Qgbm9kZV9tZ3IgKmhub2RlX21ncjsKKwl2b2lkICpobm9kZTsKKwl1MzIgbm9kZV90YWJfc2l6ZSA9IDE7CisJdTMyIG51bV9ub2RlcyA9IDA7CisJdTMyIG5vZGVzX2FsbG9jYXRlZCA9IDA7CisJaW50IGJyZF9zdGF0ZTsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlpZiAoIXBfcHJvY19vYmplY3QpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJLyogY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBydW5uaW5nIG5vZGVzICovCisJc3RhdHVzID0gZGV2X2dldF9ub2RlX21hbmFnZXIocF9wcm9jX29iamVjdC0+aGRldl9vYmosICZobm9kZV9tZ3IpOworCWlmICghc3RhdHVzICYmIGhub2RlX21ncikgeworCQlzdGF0dXMgPSBub2RlX2VudW1fbm9kZXMoaG5vZGVfbWdyLCAmaG5vZGUsIG5vZGVfdGFiX3NpemUsCisJCQkJCSAmbnVtX25vZGVzLCAmbm9kZXNfYWxsb2NhdGVkKTsKKwkJaWYgKChzdGF0dXMgPT0gLUVJTlZBTCkgfHwgKG5vZGVzX2FsbG9jYXRlZCA+IDApKSB7CisJCQlwcl9lcnIoIiVzOiBDYW4ndCBzdG9wIGRldmljZSwgYWN0aXZlIG5vZGVzID0gJWQgXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBub2Rlc19hbGxvY2F0ZWQpOworCQkJcmV0dXJuIC1FQkFEUjsKKwkJfQorCX0KKwkvKiBDYWxsIHRoZSBicmlkZ2VfYnJkX3N0b3AgKi8KKwkvKiBJdCBpcyBPSyB0byBzdG9wIGEgZGV2aWNlIHRoYXQgZG9lcyBuJ3QgaGF2ZSBub2RlcyBPUiBub3Qgc3RhcnRlZCAqLworCXN0YXR1cyA9CisJICAgICgqcF9wcm9jX29iamVjdC0+aW50Zl9meG5zLT4KKwkgICAgIHBmbl9icmRfc3RvcCkgKHBfcHJvY19vYmplY3QtPmhicmlkZ2VfY29udGV4dCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogcHJvY2Vzc29yIGluIHN0YW5kYnkgbW9kZVxuIiwgX19mdW5jX18pOworCQlwX3Byb2Nfb2JqZWN0LT5wcm9jX3N0YXRlID0gUFJPQ19TVE9QUEVEOworCQkvKiBEZXN0b3J5IHRoZSBOb2RlIE1hbmFnZXIsIG1zZ19jdHJsIE1hbmFnZXIgKi8KKwkJaWYgKCEoZGV2X2Rlc3Ryb3kyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqKSkpIHsKKwkJCS8qIERlc3Ryb3kgdGhlIG1zZ19jdHJsIGJ5IGNhbGxpbmcgbXNnX2RlbGV0ZSAqLworCQkJZGV2X2dldF9tc2dfbWdyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqLCAmaG1zZ19tZ3IpOworCQkJaWYgKGhtc2dfbWdyKSB7CisJCQkJbXNnX2RlbGV0ZShobXNnX21ncik7CisJCQkJZGV2X3NldF9tc2dfbWdyKHBfcHJvY19vYmplY3QtPmhkZXZfb2JqLCBOVUxMKTsKKwkJCX0KKwkJCWlmICghKCgqcF9wcm9jX29iamVjdC0+CisJCQkgICAgICBpbnRmX2Z4bnMtPnBmbl9icmRfc3RhdHVzKSAocF9wcm9jX29iamVjdC0+CisJCQkJCQkJICBoYnJpZGdlX2NvbnRleHQsCisJCQkJCQkJICAmYnJkX3N0YXRlKSkpCisJCQkJREJDX0FTU0VSVChicmRfc3RhdGUgPT0gQlJEX1NUT1BQRUQpOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHN0b3AgdGhlIHByb2Nlc3NvclxuIiwgX19mdW5jX18pOworCX0KK2Z1bmNfZW5kOgorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX3VuX21hcCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlbW92ZXMgYSBNUFUgYnVmZmVyIG1hcHBpbmcgZnJvbSB0aGUgRFNQIGFkZHJlc3Mgc3BhY2UuCisgKi8KK2ludCBwcm9jX3VuX21hcCh2b2lkICpocHJvY2Vzc29yLCB2b2lkICptYXBfYWRkciwKKwkJICAgICAgIHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gKHN0cnVjdCBwcm9jX29iamVjdCAqKWhwcm9jZXNzb3I7CisJc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3I7CisJdTMyIHZhX2FsaWduOworCXUzMiBzaXplX2FsaWduOworCisJdmFfYWxpZ24gPSBQR19BTElHTl9MT1coKHUzMikgbWFwX2FkZHIsIFBHX1NJWkU0Syk7CisJaWYgKCFwX3Byb2Nfb2JqZWN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJc3RhdHVzID0gZG1tX2dldF9oYW5kbGUoaHByb2Nlc3NvciwgJmRtbV9tZ3IpOworCWlmICghZG1tX21ncikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCS8qIENyaXRpY2FsIHNlY3Rpb24gKi8KKwltdXRleF9sb2NrKCZwcm9jX2xvY2spOworCS8qCisJICogVXBkYXRlIERNTSBzdHJ1Y3R1cmVzLiBHZXQgdGhlIHNpemUgdG8gdW5tYXAuCisJICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGVycm9yIGlmIHRoZSBWQSBpcyBub3QgbWFwcGVkCisJICovCisJc3RhdHVzID0gZG1tX3VuX21hcF9tZW1vcnkoZG1tX21nciwgKHUzMikgdmFfYWxpZ24sICZzaXplX2FsaWduKTsKKwkvKiBSZW1vdmUgbWFwcGluZyBmcm9tIHRoZSBwYWdlIHRhYmxlcy4gKi8KKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSAoKnBfcHJvY19vYmplY3QtPmludGZfZnhucy0+cGZuX2JyZF9tZW1fdW5fbWFwKQorCQkgICAgKHBfcHJvY19vYmplY3QtPmhicmlkZ2VfY29udGV4dCwgdmFfYWxpZ24sIHNpemVfYWxpZ24pOworCX0KKworCW11dGV4X3VubG9jaygmcHJvY19sb2NrKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJLyoKKwkgKiBBIHN1Y2Nlc3NmdWwgdW5tYXAgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHJlbW92YWwgb2YgbWFwX29iagorCSAqIGZyb20gZG1tX21hcF9saXN0LCBzbyB0aGF0IG1hcHBlZCBtZW1vcnkgcmVzb3VyY2UgdHJhY2tpbmcKKwkgKiByZW1haW5zIHVwdG9kYXRlCisJICovCisJcmVtb3ZlX21hcHBpbmdfaW5mb3JtYXRpb24ocHJfY3R4dCwgKHUzMikgbWFwX2FkZHIsIHNpemVfYWxpZ24pOworCitmdW5jX2VuZDoKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBocHJvY2Vzc29yOiAweCVwIG1hcF9hZGRyOiAweCVwIHN0YXR1czogMHgleFxuIiwKKwkJX19mdW5jX18sIGhwcm9jZXNzb3IsIG1hcF9hZGRyLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY191bl9yZXNlcnZlX21lbW9yeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWVzIGEgcHJldmlvdXNseSByZXNlcnZlZCByZWdpb24gb2YgRFNQIGFkZHJlc3Mgc3BhY2UuCisgKi8KK2ludCBwcm9jX3VuX3Jlc2VydmVfbWVtb3J5KHZvaWQgKmhwcm9jZXNzb3IsIHZvaWQgKnByc3ZfYWRkciwKKwkJCQkgIHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpCit7CisJc3RydWN0IGRtbV9vYmplY3QgKmRtbV9tZ3I7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHByb2Nfb2JqZWN0ICpwX3Byb2Nfb2JqZWN0ID0gKHN0cnVjdCBwcm9jX29iamVjdCAqKWhwcm9jZXNzb3I7CisJc3RydWN0IGRtbV9yc3Zfb2JqZWN0ICpyc3Zfb2JqOworCisJaWYgKCFwX3Byb2Nfb2JqZWN0KSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZnVuY19lbmQ7CisJfQorCisJc3RhdHVzID0gZG1tX2dldF9oYW5kbGUocF9wcm9jX29iamVjdCwgJmRtbV9tZ3IpOworCWlmICghZG1tX21ncikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCXN0YXR1cyA9IGRtbV91bl9yZXNlcnZlX21lbW9yeShkbW1fbWdyLCAodTMyKSBwcnN2X2FkZHIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBmdW5jX2VuZDsKKworCS8qCisJICogQSBzdWNjZXNzZnVsIHVucmVzZXJ2ZSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgcmVtb3ZhbCBvZiByc3Zfb2JqCisJICogZnJvbSBkbW1fcnN2X2xpc3QsIHNvIHRoYXQgcmVzZXJ2ZWQgbWVtb3J5IHJlc291cmNlIHRyYWNraW5nCisJICogcmVtYWlucyB1cHRvZGF0ZQorCSAqLworCXNwaW5fbG9jaygmcHJfY3R4dC0+ZG1tX3Jzdl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzdl9vYmosICZwcl9jdHh0LT5kbW1fcnN2X2xpc3QsIGxpbmspIHsKKwkJaWYgKHJzdl9vYmotPmRzcF9yZXNlcnZlZF9hZGRyID09ICh1MzIpIHByc3ZfYWRkcikgeworCQkJbGlzdF9kZWwoJnJzdl9vYmotPmxpbmspOworCQkJa2ZyZWUocnN2X29iaik7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmcHJfY3R4dC0+ZG1tX3Jzdl9sb2NrKTsKKworZnVuY19lbmQ6CisJZGV2X2RiZyhicmlkZ2UsICIlczogaHByb2Nlc3NvcjogMHglcCBwcnN2X2FkZHI6IDB4JXAgc3RhdHVzOiAweCV4XG4iLAorCQlfX2Z1bmNfXywgaHByb2Nlc3NvciwgcHJzdl9hZGRyLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gPSBwcm9jX21vbml0b3IgPT09PT09PT0gPT0KKyAqICBQdXJwb3NlOgorICogICAgICBQbGFjZSB0aGUgUHJvY2Vzc29yIGluIE1vbml0b3IgU3RhdGUuIFRoaXMgaXMgYW4gaW50ZXJuYWwKKyAqICAgICAgZnVuY3Rpb24gYW5kIGEgcmVxdWlyZW1lbnQgYmVmb3JlIFByb2Nlc3NvciBpcyBsb2FkZWQuCisgKiAgICAgIFRoaXMgZG9lcyBhIGJyaWRnZV9icmRfc3RvcCwgZGV2X2Rlc3Ryb3kyIGFuZCBicmlkZ2VfYnJkX21vbml0b3IuCisgKiAgICAgIEluIGRldl9kZXN0cm95MiB3ZSBkZWxldGUgdGhlIG5vZGUgbWFuYWdlci4KKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBwX3Byb2Nfb2JqZWN0OiAgICBQb2ludGVyIHRvIFByb2Nlc3NvciBPYmplY3QKKyAqICBSZXR1cm5zOgorICogICAgICAwOglQcm9jZXNzb3IgcGxhY2VkIGluIG1vbml0b3IgbW9kZS4KKyAqICAgICAgITA6ICAgICAgIEZhaWxlZCB0byBwbGFjZSBwcm9jZXNzb3IgaW4gbW9uaXRvciBtb2RlLgorICogIFJlcXVpcmVzOgorICogICAgICBWYWxpZCBQcm9jZXNzb3IgSGFuZGxlCisgKiAgRW5zdXJlczoKKyAqICAgICAgU3VjY2VzczoJUHJvY09iamVjdCBzdGF0ZSBpcyBQUk9DX0lETEUKKyAqLworc3RhdGljIGludCBwcm9jX21vbml0b3Ioc3RydWN0IHByb2Nfb2JqZWN0ICpwcm9jX29iaikKK3sKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworCXN0cnVjdCBtc2dfbWdyICpobXNnX21ncjsKKwlpbnQgYnJkX3N0YXRlOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHByb2Nfb2JqKTsKKworCS8qIFRoaXMgaXMgbmVlZGVkIG9ubHkgd2hlbiBEZXZpY2UgaXMgbG9hZGVkIHdoZW4gaXQgaXMKKwkgKiBhbHJlYWR5ICdBQ1RJVkUnICovCisJLyogRGVzdG9yeSB0aGUgTm9kZSBNYW5hZ2VyLCBtc2dfY3RybCBNYW5hZ2VyICovCisJaWYgKCFkZXZfZGVzdHJveTIocHJvY19vYmotPmhkZXZfb2JqKSkgeworCQkvKiBEZXN0cm95IHRoZSBtc2dfY3RybCBieSBjYWxsaW5nIG1zZ19kZWxldGUgKi8KKwkJZGV2X2dldF9tc2dfbWdyKHByb2Nfb2JqLT5oZGV2X29iaiwgJmhtc2dfbWdyKTsKKwkJaWYgKGhtc2dfbWdyKSB7CisJCQltc2dfZGVsZXRlKGhtc2dfbWdyKTsKKwkJCWRldl9zZXRfbXNnX21ncihwcm9jX29iai0+aGRldl9vYmosIE5VTEwpOworCQl9CisJfQorCS8qIFBsYWNlIHRoZSBCb2FyZCBpbiB0aGUgTW9uaXRvciBTdGF0ZSAqLworCWlmICghKCgqcHJvY19vYmotPmludGZfZnhucy0+cGZuX2JyZF9tb25pdG9yKQorCQkJICAocHJvY19vYmotPmhicmlkZ2VfY29udGV4dCkpKSB7CisJCXN0YXR1cyA9IDA7CisJCWlmICghKCgqcHJvY19vYmotPmludGZfZnhucy0+cGZuX2JyZF9zdGF0dXMpCisJCQkJICAocHJvY19vYmotPmhicmlkZ2VfY29udGV4dCwgJmJyZF9zdGF0ZSkpKQorCQkJREJDX0FTU0VSVChicmRfc3RhdGUgPT0gQlJEX0lETEUpOworCX0KKworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgYnJkX3N0YXRlID09IEJSRF9JRExFKSB8fAorCQkgICBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gZ2V0X2VudnBfY291bnQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZW52cCBhcnJheSwgaW5jbHVkaW5nIHRoZQorICogICAgICB0ZXJtaW5hdGluZyBOVUxMIGVsZW1lbnQuCisgKi8KK3N0YXRpYyBzMzIgZ2V0X2VudnBfY291bnQoY2hhciAqKmVudnApCit7CisJczMyIHJldCA9IDA7CisJaWYgKGVudnApIHsKKwkJd2hpbGUgKCplbnZwKyspCisJCQlyZXQrKzsKKworCQlyZXQgKz0gMTsJLyogSW5jbHVkZSB0aGUgdGVybWluYXRpbmcgTlVMTCBpbiB0aGUgY291bnQuICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICA9PT09PT09PSBwcmVwZW5kX2VudnAgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBQcmVwZW5kIGFuIGVudmlyb25tZW50IHZhcmlhYmxlPXZhbHVlIHBhaXIgdG8gdGhlIG5ldyBlbnZwIGFycmF5LCBhbmQKKyAqICAgICAgY29weSBpbiB0aGUgZXhpc3RpbmcgdmFyPXZhbHVlIHBhaXJzIGluIHRoZSBvbGQgZW52cCBhcnJheS4KKyAqLworc3RhdGljIGNoYXIgKipwcmVwZW5kX2VudnAoY2hhciAqKm5ld19lbnZwLCBjaGFyICoqZW52cCwgczMyIGVudnBfZWxlbXMsCisJCQkgICBzMzIgY25ld19lbnZwLCBjaGFyICpzel92YXIpCit7CisJY2hhciAqKnBwX2VudnAgPSBuZXdfZW52cDsKKworCURCQ19SRVFVSVJFKG5ld19lbnZwKTsKKworCS8qIFByZXBlbmQgbmV3IGVudmlyb24gdmFyPXZhbHVlIHN0cmluZyAqLworCSpuZXdfZW52cCsrID0gc3pfdmFyOworCisJLyogQ29weSB1c2VyJ3MgZW52aXJvbm1lbnQgaW50byBvdXIgb3duLiAqLworCXdoaWxlIChlbnZwX2VsZW1zLS0pCisJCSpuZXdfZW52cCsrID0gKmVudnArKzsKKworCS8qIEVuc3VyZSBOVUxMIHRlcm1pbmF0ZXMgdGhlIG5ldyBlbnZpcm9ubWVudCBzdHJpbmdzIGFycmF5LiAqLworCWlmIChlbnZwX2VsZW1zID09IDApCisJCSpuZXdfZW52cCA9IE5VTEw7CisKKwlyZXR1cm4gcHBfZW52cDsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX25vdGlmeV9jbGllbnRzID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgTm90aWZ5IHRoZSBwcm9jZXNzb3IgdGhlIGV2ZW50cy4KKyAqLworaW50IHByb2Nfbm90aWZ5X2NsaWVudHModm9pZCAqcHJvYywgdTMyIGV2ZW50cykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPSAoc3RydWN0IHByb2Nfb2JqZWN0ICopcHJvYzsKKworCURCQ19SRVFVSVJFKHBfcHJvY19vYmplY3QpOworCURCQ19SRVFVSVJFKGlzX3ZhbGlkX3Byb2NfZXZlbnQoZXZlbnRzKSk7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCWlmICghcF9wcm9jX29iamVjdCkgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGZ1bmNfZW5kOworCX0KKworCW50Znlfbm90aWZ5KHBfcHJvY19vYmplY3QtPm50Znlfb2JqLCBldmVudHMpOworZnVuY19lbmQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwcm9jX25vdGlmeV9hbGxfY2xpZW50cyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIE5vdGlmeSB0aGUgcHJvY2Vzc29yIHRoZSBldmVudHMuIFRoaXMgaW5jbHVkZXMgbm90aWZ5aW5nIGFsbCBjbGllbnRzCisgKiAgICAgIGF0dGFjaGVkIHRvIGEgcGFydGljdWxhdCBEU1AuCisgKi8KK2ludCBwcm9jX25vdGlmeV9hbGxfY2xpZW50cyh2b2lkICpwcm9jLCB1MzIgZXZlbnRzKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwcm9jX29iamVjdCAqcF9wcm9jX29iamVjdCA9IChzdHJ1Y3QgcHJvY19vYmplY3QgKilwcm9jOworCisJREJDX1JFUVVJUkUoaXNfdmFsaWRfcHJvY19ldmVudChldmVudHMpKTsKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIXBfcHJvY19vYmplY3QpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisKKwlkZXZfbm90aWZ5X2NsaWVudHMocF9wcm9jX29iamVjdC0+aGRldl9vYmosIGV2ZW50cyk7CisKK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcHJvY19nZXRfcHJvY2Vzc29yX2lkID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmlldmVzIHRoZSBwcm9jZXNzb3IgSUQuCisgKi8KK2ludCBwcm9jX2dldF9wcm9jZXNzb3JfaWQodm9pZCAqcHJvYywgdTMyICogcHJvY19pZCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcHJvY19vYmplY3QgKnBfcHJvY19vYmplY3QgPSAoc3RydWN0IHByb2Nfb2JqZWN0ICopcHJvYzsKKworCWlmIChwX3Byb2Nfb2JqZWN0KQorCQkqcHJvY19pZCA9IHBfcHJvY19vYmplY3QtPnByb2Nlc3Nvcl9pZDsKKwllbHNlCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvcHdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9wd3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWNiMWEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvcHdyLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBwd3IuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBQV1IgQVBJIGZvciBjb250cm9sbGluZyBEU1AgcG93ZXIgc3RhdGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIb3N0IE9TICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2hvc3Rfb3MuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvcHdyLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvdXJjZSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RldmRlZnMuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF0Zm9ybSBNYW5hZ2VyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2Rldi5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGluayBEcml2ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHNwaW9jdGwuaD4KKworLyoKKyAqICA9PT09PT09PSBwd3Jfc2xlZXBfZHNwID09PT09PT09CisgKiAgICBTZW5kIGNvbW1hbmQgdG8gRFNQIHRvIGVudGVyIHNsZWVwIHN0YXRlLgorICovCitpbnQgcHdyX3NsZWVwX2RzcChjb25zdCB1MzIgc2xlZXBfY29kZSwgY29uc3QgdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZHdfY29udGV4dDsKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiA9IE5VTEw7CisJdTMyIGlvY3RsY29kZSA9IDA7CisJdTMyIGFyZyA9IHRpbWVvdXQ7CisKKwlmb3IgKGhkZXZfb2JqID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopZHJ2X2dldF9maXJzdF9kZXZfb2JqZWN0KCk7CisJICAgICBoZGV2X29iaiAhPSBOVUxMOworCSAgICAgaGRldl9vYmogPQorCSAgICAgKHN0cnVjdCBkZXZfb2JqZWN0ICopZHJ2X2dldF9uZXh0X2Rldl9vYmplY3QoKHUzMikgaGRldl9vYmopKSB7CisJCWlmIChkZXZfZ2V0X2JyaWRnZV9jb250ZXh0KGhkZXZfb2JqLAorCQkJCQkJKHN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKiopCisJCQkJCQkgICAmZHdfY29udGV4dCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChkZXZfZ2V0X2ludGZfZnhucyhoZGV2X29iaiwKKwkJCQkJCShzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKiopCisJCQkJCQkmaW50Zl9meG5zKSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNsZWVwX2NvZGUgPT0gUFdSX0RFRVBTTEVFUCkKKwkJCWlvY3RsY29kZSA9IEJSRElPQ1RMX0RFRVBTTEVFUDsKKwkJZWxzZSBpZiAoc2xlZXBfY29kZSA9PSBQV1JfRU1FUkdFTkNZREVFUFNMRUVQKQorCQkJaW9jdGxjb2RlID0gQlJESU9DVExfRU1FUkdFTkNZU0xFRVA7CisJCWVsc2UKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisKKwkJaWYgKHN0YXR1cyAhPSAtRUlOVkFMKSB7CisJCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2Rldl9jbnRybCkgKGR3X2NvbnRleHQsCisJCQkJCQkJICAgICAgaW9jdGxjb2RlLAorCQkJCQkJCSAgICAgICh2b2lkICopJmFyZyk7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwd3Jfd2FrZV9kc3AgPT09PT09PT0KKyAqICAgIFNlbmQgY29tbWFuZCB0byBEU1AgdG8gd2FrZSBpdCBmcm9tIHNsZWVwLgorICovCitpbnQgcHdyX3dha2VfZHNwKGNvbnN0IHUzMiB0aW1lb3V0KQoreworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmR3X2NvbnRleHQ7CisJaW50IHN0YXR1cyA9IC1FUEVSTTsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmogPSBOVUxMOworCXUzMiBhcmcgPSB0aW1lb3V0OworCisJZm9yIChoZGV2X29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWRydl9nZXRfZmlyc3RfZGV2X29iamVjdCgpOworCSAgICAgaGRldl9vYmogIT0gTlVMTDsKKwkgICAgIGhkZXZfb2JqID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopZHJ2X2dldF9uZXh0X2Rldl9vYmplY3QKKwkgICAgICgodTMyKSBoZGV2X29iaikpIHsKKwkJaWYgKCEoZGV2X2dldF9icmlkZ2VfY29udGV4dChoZGV2X29iaiwKKwkJCQkJCSAgICAgIChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0CisJCQkJCQkgICAgICAgKiopJmR3X2NvbnRleHQpKSkgeworCQkJaWYgKCEoZGV2X2dldF9pbnRmX2Z4bnMoaGRldl9vYmosCisJCQkgICAgICAoc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICoqKSZpbnRmX2Z4bnMpKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgICgqaW50Zl9meG5zLT5wZm5fZGV2X2NudHJsKSAoZHdfY29udGV4dCwKKwkJCQkJCQlCUkRJT0NUTF9XQUtFVVAsCisJCQkJCQkJKHZvaWQgKikmYXJnKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHB3cl9wbV9wcmVfc2NhbGU9PT09PT09PQorICogICAgU2VuZHMgcHJlLW5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIERTUC4KKyAqLworaW50IHB3cl9wbV9wcmVfc2NhbGUodTE2IHZvbHRhZ2VfZG9tYWluLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dCAqZHdfY29udGV4dDsKKwlpbnQgc3RhdHVzID0gLUVQRVJNOworCXN0cnVjdCBkZXZfb2JqZWN0ICpoZGV2X29iaiA9IE5VTEw7CisJdTMyIGFyZ1syXTsKKworCWFyZ1swXSA9IHZvbHRhZ2VfZG9tYWluOworCWFyZ1sxXSA9IGxldmVsOworCisJZm9yIChoZGV2X29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWRydl9nZXRfZmlyc3RfZGV2X29iamVjdCgpOworCSAgICAgaGRldl9vYmogIT0gTlVMTDsKKwkgICAgIGhkZXZfb2JqID0gKHN0cnVjdCBkZXZfb2JqZWN0ICopZHJ2X2dldF9uZXh0X2Rldl9vYmplY3QKKwkgICAgICgodTMyKSBoZGV2X29iaikpIHsKKwkJaWYgKCEoZGV2X2dldF9icmlkZ2VfY29udGV4dChoZGV2X29iaiwKKwkJCQkJCSAgICAgIChzdHJ1Y3QgYnJpZGdlX2Rldl9jb250ZXh0CisJCQkJCQkgICAgICAgKiopJmR3X2NvbnRleHQpKSkgeworCQkJaWYgKCEoZGV2X2dldF9pbnRmX2Z4bnMoaGRldl9vYmosCisJCQkgICAgICAoc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICoqKSZpbnRmX2Z4bnMpKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgICgqaW50Zl9meG5zLT5wZm5fZGV2X2NudHJsKSAoZHdfY29udGV4dCwKKwkJCQkJCUJSRElPQ1RMX1BSRVNDQUxFX05PVElGWSwKKwkJCQkJCSh2b2lkICopJmFyZyk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBwd3JfcG1fcG9zdF9zY2FsZT09PT09PT09CisgKiAgICBTZW5kcyBwb3N0LW5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIERTUC4KKyAqLworaW50IHB3cl9wbV9wb3N0X3NjYWxlKHUxNiB2b2x0YWdlX2RvbWFpbiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBicmlkZ2VfZGV2X2NvbnRleHQgKmR3X2NvbnRleHQ7CisJaW50IHN0YXR1cyA9IC1FUEVSTTsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqaGRldl9vYmogPSBOVUxMOworCXUzMiBhcmdbMl07CisKKwlhcmdbMF0gPSB2b2x0YWdlX2RvbWFpbjsKKwlhcmdbMV0gPSBsZXZlbDsKKworCWZvciAoaGRldl9vYmogPSAoc3RydWN0IGRldl9vYmplY3QgKilkcnZfZ2V0X2ZpcnN0X2Rldl9vYmplY3QoKTsKKwkgICAgIGhkZXZfb2JqICE9IE5VTEw7CisJICAgICBoZGV2X29iaiA9IChzdHJ1Y3QgZGV2X29iamVjdCAqKWRydl9nZXRfbmV4dF9kZXZfb2JqZWN0CisJICAgICAoKHUzMikgaGRldl9vYmopKSB7CisJCWlmICghKGRldl9nZXRfYnJpZGdlX2NvbnRleHQoaGRldl9vYmosCisJCQkJCQkgICAgICAoc3RydWN0IGJyaWRnZV9kZXZfY29udGV4dAorCQkJCQkJICAgICAgICoqKSZkd19jb250ZXh0KSkpIHsKKwkJCWlmICghKGRldl9nZXRfaW50Zl9meG5zKGhkZXZfb2JqLAorCQkJICAgICAgKHN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqKikmaW50Zl9meG5zKSkpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICAoKmludGZfZnhucy0+cGZuX2Rldl9jbnRybCkgKGR3X2NvbnRleHQsCisJCQkJCQlCUkRJT0NUTF9QT1NUU0NBTEVfTk9USUZZLAorCQkJCQkJKHZvaWQgKikmYXJnKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ybW0uYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL3JtbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWU4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ybW0uYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIHJtbS5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qCisgKiAgVGhpcyBtZW1vcnkgbWFuYWdlciBwcm92aWRlcyBnZW5lcmFsIGhlYXAgbWFuYWdlbWVudCBhbmQgYXJiaXRyYXJ5CisgKiAgYWxpZ25tZW50IGZvciBhbnkgbnVtYmVyIG9mIG1lbW9yeSBzZWdtZW50cy4KKyAqCisgKiAgTm90ZXM6CisgKgorICogIE1lbW9yeSBibG9ja3MgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGZyZWUgbWVtb3J5CisgKiAgYmxvY2sgbGFyZ2UgZW5vdWdoIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICBBbGlnbm1lbnQgcmVxdWlyZW1lbnRzCisgKiAgYXJlIHNhdGlzZmllZCBieSAic2xpZGluZyIgdGhlIGJsb2NrIGZvcndhcmQgdW50aWwgaXRzIGJhc2Ugc2F0aXNmaWVzCisgKiAgdGhlIGFsaWdubWVudCBzcGVjaWZpY2F0aW9uOyBpZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSB0aGVuIHRoZSBuZXh0CisgKiAgZnJlZSBibG9jayBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgcmVxdWVzdCBpcyB0cmllZC4KKyAqCisgKiAgU2luY2UgYWxpZ25tZW50IGNhbiBjYXVzZSB0aGUgY3JlYXRpb24gb2YgYSBuZXcgZnJlZSBibG9jayAtIHRoZQorICogIHVudXNlZCBtZW1vcnkgZm9ybWVkIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSBvcmlnaW5hbCBmcmVlIGJsb2NrCisgKiAgYW5kIHRoZSBzdGFydCBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrIC0gdGhlIG1lbW9yeSBtYW5hZ2VyIG11c3QgZnJlZQorICogIHRoaXMgbWVtb3J5IHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhay4KKyAqCisgKiAgT3ZlcmxheSBtZW1vcnkgaXMgbWFuYWdlZCBieSByZXNlcnZpbmcgdGhyb3VnaCBybW1fYWxsb2MsIGFuZCBmcmVlaW5nCisgKiAgaXQgdGhyb3VnaCBybW1fZnJlZS4gVGhlIG1lbW9yeSBtYW5hZ2VyIHByZXZlbnRzIERTUCBjb2RlL2RhdGEgdGhhdCBpcworICogIG92ZXJsYXllZCBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIGFzIGxvbmcgYXMgdGhlIG1lbW9yeSBpdCBydW5zIGF0IGhhcworICogIGJlZW4gYWxsb2NhdGVkLCBhbmQgbm90IHlldCBmcmVlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERTUC9CSU9TIEJyaWRnZSAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYWNlICYgRGVidWcgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJjLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUyBBZGFwdGF0aW9uIExheWVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2xpc3QuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvcm1tLmg+CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2hlYWRlciA9PT09PT09PQorICogIFRoaXMgaGVhZGVyIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBsaXN0IG9mIGZyZWUgbWVtb3J5IGJsb2Nrcy4KKyAqLworc3RydWN0IHJtbV9oZWFkZXIgeworCXN0cnVjdCBybW1faGVhZGVyICpuZXh0OwkvKiBmb3JtIGEgZnJlZSBtZW1vcnkgbGluayBsaXN0ICovCisJdTMyIHNpemU7CQkvKiBzaXplIG9mIHRoZSBmcmVlIG1lbW9yeSAqLworCXUzMiBhZGRyOwkJLyogRFNQIGFkZHJlc3Mgb2YgbWVtb3J5IGJsb2NrICovCit9OworCisvKgorICogID09PT09PT09IHJtbV9vdmx5X3NlY3QgPT09PT09PT0KKyAqICBLZWVwcyB0cmFjayBvZiBtZW1vcnkgb2NjdXBpZWQgYnkgb3ZlcmxheSBzZWN0aW9uLgorICovCitzdHJ1Y3Qgcm1tX292bHlfc2VjdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VsZW07CisJdTMyIGFkZHI7CQkvKiBTdGFydCBvZiBtZW1vcnkgc2VjdGlvbiAqLworCXUzMiBzaXplOwkJLyogTGVuZ3RoICh0YXJnZXQgTUFVcykgb2Ygc2VjdGlvbiAqLworCXMzMiBwYWdlOwkJLyogTWVtb3J5IHBhZ2UgKi8KK307CisKKy8qCisgKiAgPT09PT09PT0gcm1tX3RhcmdldF9vYmogPT09PT09PT0KKyAqLworc3RydWN0IHJtbV90YXJnZXRfb2JqIHsKKwlzdHJ1Y3Qgcm1tX3NlZ21lbnQgKnNlZ190YWI7CisJc3RydWN0IHJtbV9oZWFkZXIgKipmcmVlX2xpc3Q7CisJdTMyIG51bV9zZWdzOworCXN0cnVjdCBsc3RfbGlzdCAqb3ZseV9saXN0OwkvKiBMaXN0IG9mIG92ZXJsYXkgbWVtb3J5IGluIHVzZSAqLworfTsKKworc3RhdGljIHUzMiByZWZzOwkJLyogbW9kdWxlIHJlZmVyZW5jZSBjb3VudCAqLworCitzdGF0aWMgYm9vbCBhbGxvY19ibG9jayhzdHJ1Y3Qgcm1tX3RhcmdldF9vYmogKnRhcmdldCwgdTMyIHNlZ2lkLCB1MzIgc2l6ZSwKKwkJCXUzMiBhbGlnbiwgdTMyICpkc3BfYWRkcmVzcyk7CitzdGF0aWMgYm9vbCBmcmVlX2Jsb2NrKHN0cnVjdCBybW1fdGFyZ2V0X29iaiAqdGFyZ2V0LCB1MzIgc2VnaWQsIHUzMiBhZGRyLAorCQkgICAgICAgdTMyIHNpemUpOworCisvKgorICogID09PT09PT09IHJtbV9hbGxvYyA9PT09PT09PQorICovCitpbnQgcm1tX2FsbG9jKHN0cnVjdCBybW1fdGFyZ2V0X29iaiAqdGFyZ2V0LCB1MzIgc2VnaWQsIHUzMiBzaXplLAorCQkgICAgIHUzMiBhbGlnbiwgdTMyICpkc3BfYWRkcmVzcywgYm9vbCByZXNlcnZlKQoreworCXN0cnVjdCBybW1fb3ZseV9zZWN0ICpzZWN0OworCXN0cnVjdCBybW1fb3ZseV9zZWN0ICpwcmV2X3NlY3QgPSBOVUxMOworCXN0cnVjdCBybW1fb3ZseV9zZWN0ICpuZXdfc2VjdDsKKwl1MzIgYWRkcjsKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHRhcmdldCk7CisJREJDX1JFUVVJUkUoZHNwX2FkZHJlc3MgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUoc2l6ZSA+IDApOworCURCQ19SRVFVSVJFKHJlc2VydmUgfHwgKHRhcmdldC0+bnVtX3NlZ3MgPiAwKSk7CisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJaWYgKCFyZXNlcnZlKSB7CisJCWlmICghYWxsb2NfYmxvY2sodGFyZ2V0LCBzZWdpZCwgc2l6ZSwgYWxpZ24sIGRzcF9hZGRyZXNzKSkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MgaW4gdGhpcworCQkJICogc2VnbWVudCAqLworCQkJdGFyZ2V0LT5zZWdfdGFiW3NlZ2lkXS5udW1iZXIrKzsKKwkJfQorCQlnb3RvIGZ1bmNfZW5kOworCX0KKwkvKiBBbiBvdmVybGF5IHNlY3Rpb24gLSBTZWUgaWYgYmxvY2sgaXMgYWxyZWFkeSBpbiB1c2UuIElmIG5vdCwKKwkgKiBpbnNlcnQgaW50byB0aGUgbGlzdCBpbiBhc2NlbmRpbmcgYWRkcmVzcyBzaXplLiAqLworCWFkZHIgPSAqZHNwX2FkZHJlc3M7CisJc2VjdCA9IChzdHJ1Y3Qgcm1tX292bHlfc2VjdCAqKWxzdF9maXJzdCh0YXJnZXQtPm92bHlfbGlzdCk7CisJLyogIEZpbmQgcGxhY2UgdG8gaW5zZXJ0IG5ldyBsaXN0IGVsZW1lbnQuIExpc3QgaXMgc29ydGVkIGZyb20KKwkgKiAgc21hbGxlc3QgdG8gbGFyZ2VzdCBhZGRyZXNzLiAqLworCXdoaWxlIChzZWN0ICE9IE5VTEwpIHsKKwkJaWYgKGFkZHIgPD0gc2VjdC0+YWRkcikgeworCQkJLyogQ2hlY2sgZm9yIG92ZXJsYXAgd2l0aCBzZWN0ICovCisJCQlpZiAoKGFkZHIgKyBzaXplID4gc2VjdC0+YWRkcikgfHwgKHByZXZfc2VjdCAmJgorCQkJCQkJCSAgIChwcmV2X3NlY3QtPmFkZHIgKworCQkJCQkJCSAgICBwcmV2X3NlY3QtPnNpemUgPgorCQkJCQkJCSAgICBhZGRyKSkpIHsKKwkJCQlzdGF0dXMgPSAtRU5YSU87CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlwcmV2X3NlY3QgPSBzZWN0OworCQlzZWN0ID0gKHN0cnVjdCBybW1fb3ZseV9zZWN0ICopbHN0X25leHQodGFyZ2V0LT5vdmx5X2xpc3QsCisJCQkJCQkJKHN0cnVjdCBsaXN0X2hlYWQgKikKKwkJCQkJCQlzZWN0KTsKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJLyogTm8gb3ZlcmxhcCAtIGFsbG9jYXRlIGxpc3QgZWxlbWVudCBmb3IgbmV3IHNlY3Rpb24uICovCisJCW5ld19zZWN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJtbV9vdmx5X3NlY3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19zZWN0ID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQlsc3RfaW5pdF9lbGVtKChzdHJ1Y3QgbGlzdF9oZWFkICopbmV3X3NlY3QpOworCQkJbmV3X3NlY3QtPmFkZHIgPSBhZGRyOworCQkJbmV3X3NlY3QtPnNpemUgPSBzaXplOworCQkJbmV3X3NlY3QtPnBhZ2UgPSBzZWdpZDsKKwkJCWlmIChzZWN0ID09IE5VTEwpIHsKKwkJCQkvKiBQdXQgbmV3IHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworCQkJCWxzdF9wdXRfdGFpbCh0YXJnZXQtPm92bHlfbGlzdCwKKwkJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZCAqKW5ld19zZWN0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogUHV0IG5ldyBzZWN0aW9uIGp1c3QgYmVmb3JlIHNlY3QgKi8KKwkJCQlsc3RfaW5zZXJ0X2JlZm9yZSh0YXJnZXQtPm92bHlfbGlzdCwKKwkJCQkJCSAgKHN0cnVjdCBsaXN0X2hlYWQgKiluZXdfc2VjdCwKKwkJCQkJCSAgKHN0cnVjdCBsaXN0X2hlYWQgKilzZWN0KTsKKwkJCX0KKwkJfQorCX0KK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2NyZWF0ZSA9PT09PT09PQorICovCitpbnQgcm1tX2NyZWF0ZShzdHJ1Y3Qgcm1tX3RhcmdldF9vYmogKip0YXJnZXRfb2JqLAorCQkgICAgICBzdHJ1Y3Qgcm1tX3NlZ21lbnQgc2VnX3RhYltdLCB1MzIgbnVtX3NlZ3MpCit7CisJc3RydWN0IHJtbV9oZWFkZXIgKmhwdHI7CisJc3RydWN0IHJtbV9zZWdtZW50ICpzcHRyLCAqdG1wOworCXN0cnVjdCBybW1fdGFyZ2V0X29iaiAqdGFyZ2V0OworCXMzMiBpOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUodGFyZ2V0X29iaiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShudW1fc2VncyA9PSAwIHx8IHNlZ190YWIgIT0gTlVMTCk7CisKKwkvKiBBbGxvY2F0ZSBEQkwgdGFyZ2V0IG9iamVjdCAqLworCXRhcmdldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBybW1fdGFyZ2V0X29iaiksIEdGUF9LRVJORUwpOworCisJaWYgKHRhcmdldCA9PSBOVUxMKQorCQlzdGF0dXMgPSAtRU5PTUVNOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2NvbnQ7CisKKwl0YXJnZXQtPm51bV9zZWdzID0gbnVtX3NlZ3M7CisJaWYgKCEobnVtX3NlZ3MgPiAwKSkKKwkJZ290byBmdW5jX2NvbnQ7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBmcmVlbGlzdCBmcm9tIGhvc3QncyBtZW1vcnkgKi8KKwl0YXJnZXQtPmZyZWVfbGlzdCA9IGt6YWxsb2MobnVtX3NlZ3MgKiBzaXplb2Yoc3RydWN0IHJtbV9oZWFkZXIgKiksCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHRhcmdldC0+ZnJlZV9saXN0ID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQkvKiBBbGxvY2F0ZSBoZWFkZXJzIGZvciBlYWNoIGVsZW1lbnQgb24gdGhlIGZyZWUgbGlzdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgKHMzMikgbnVtX3NlZ3M7IGkrKykgeworCQkJdGFyZ2V0LT5mcmVlX2xpc3RbaV0gPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBybW1faGVhZGVyKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAodGFyZ2V0LT5mcmVlX2xpc3RbaV0gPT0gTlVMTCkgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBpbml0aWFsIHNlZ21lbnQgdGFibGUgKi8KKwkJdGFyZ2V0LT5zZWdfdGFiID0ga3phbGxvYyhudW1fc2VncyAqIHNpemVvZihzdHJ1Y3Qgcm1tX3NlZ21lbnQpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHRhcmdldC0+c2VnX3RhYiA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJLyogSW5pdGlhbGl6ZSBzZWdtZW50IHRhYmxlIGFuZCBmcmVlIGxpc3QgKi8KKwkJCXNwdHIgPSB0YXJnZXQtPnNlZ190YWI7CisJCQlmb3IgKGkgPSAwLCB0bXAgPSBzZWdfdGFiOyBudW1fc2VncyA+IDA7CisJCQkgICAgIG51bV9zZWdzLS0sIGkrKykgeworCQkJCSpzcHRyID0gKnRtcDsKKwkJCQlocHRyID0gdGFyZ2V0LT5mcmVlX2xpc3RbaV07CisJCQkJaHB0ci0+YWRkciA9IHRtcC0+YmFzZTsKKwkJCQlocHRyLT5zaXplID0gdG1wLT5sZW5ndGg7CisJCQkJaHB0ci0+bmV4dCA9IE5VTEw7CisJCQkJdG1wKys7CisJCQkJc3B0cisrOworCQkJfQorCQl9CisJfQorZnVuY19jb250OgorCS8qIEluaXRpYWxpemUgb3ZlcmxheSBtZW1vcnkgbGlzdCAqLworCWlmICghc3RhdHVzKSB7CisJCXRhcmdldC0+b3ZseV9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxzdF9saXN0KSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHRhcmdldC0+b3ZseV9saXN0ID09IE5VTEwpCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQllbHNlCisJCQlJTklUX0xJU1RfSEVBRCgmdGFyZ2V0LT5vdmx5X2xpc3QtPmhlYWQpOworCX0KKworCWlmICghc3RhdHVzKSB7CisJCSp0YXJnZXRfb2JqID0gdGFyZ2V0OworCX0gZWxzZSB7CisJCSp0YXJnZXRfb2JqID0gTlVMTDsKKwkJaWYgKHRhcmdldCkKKwkJCXJtbV9kZWxldGUodGFyZ2V0KTsKKworCX0KKworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgKnRhcmdldF9vYmopCisJCSAgIHx8IChzdGF0dXMgJiYgKnRhcmdldF9vYmogPT0gTlVMTCkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBybW1fZGVsZXRlID09PT09PT09CisgKi8KK3ZvaWQgcm1tX2RlbGV0ZShzdHJ1Y3Qgcm1tX3RhcmdldF9vYmogKnRhcmdldCkKK3sKKwlzdHJ1Y3Qgcm1tX292bHlfc2VjdCAqb3ZseV9zZWN0aW9uOworCXN0cnVjdCBybW1faGVhZGVyICpocHRyOworCXN0cnVjdCBybW1faGVhZGVyICpuZXh0OworCXUzMiBpOworCisJREJDX1JFUVVJUkUodGFyZ2V0KTsKKworCWtmcmVlKHRhcmdldC0+c2VnX3RhYik7CisKKwlpZiAodGFyZ2V0LT5vdmx5X2xpc3QpIHsKKwkJd2hpbGUgKChvdmx5X3NlY3Rpb24gPSAoc3RydWN0IHJtbV9vdmx5X3NlY3QgKilsc3RfZ2V0X2hlYWQKKwkJCSh0YXJnZXQtPm92bHlfbGlzdCkpKSB7CisJCQlrZnJlZShvdmx5X3NlY3Rpb24pOworCQl9CisJCURCQ19BU1NFUlQoTFNUX0lTX0VNUFRZKHRhcmdldC0+b3ZseV9saXN0KSk7CisJCWtmcmVlKHRhcmdldC0+b3ZseV9saXN0KTsKKwl9CisKKwlpZiAodGFyZ2V0LT5mcmVlX2xpc3QgIT0gTlVMTCkgeworCQkvKiBGcmVlIGVsZW1lbnRzIG9uIGZyZWVsaXN0ICovCisJCWZvciAoaSA9IDA7IGkgPCB0YXJnZXQtPm51bV9zZWdzOyBpKyspIHsKKwkJCWhwdHIgPSBuZXh0ID0gdGFyZ2V0LT5mcmVlX2xpc3RbaV07CisJCQl3aGlsZSAobmV4dCkgeworCQkJCWhwdHIgPSBuZXh0OworCQkJCW5leHQgPSBocHRyLT5uZXh0OworCQkJCWtmcmVlKGhwdHIpOworCQkJfQorCQl9CisJCWtmcmVlKHRhcmdldC0+ZnJlZV9saXN0KTsKKwl9CisKKwlrZnJlZSh0YXJnZXQpOworfQorCisvKgorICogID09PT09PT09IHJtbV9leGl0ID09PT09PT09CisgKi8KK3ZvaWQgcm1tX2V4aXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlyZWZzLS07CisKKwlEQkNfRU5TVVJFKHJlZnMgPj0gMCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2ZyZWUgPT09PT09PT0KKyAqLworYm9vbCBybW1fZnJlZShzdHJ1Y3Qgcm1tX3RhcmdldF9vYmogKnRhcmdldCwgdTMyIHNlZ2lkLCB1MzIgZHNwX2FkZHIsIHUzMiBzaXplLAorCSAgICAgIGJvb2wgcmVzZXJ2ZWQpCit7CisJc3RydWN0IHJtbV9vdmx5X3NlY3QgKnNlY3Q7CisJYm9vbCByZXQgPSB0cnVlOworCisJREJDX1JFUVVJUkUodGFyZ2V0KTsKKworCURCQ19SRVFVSVJFKHJlc2VydmVkIHx8IHNlZ2lkIDwgdGFyZ2V0LT5udW1fc2Vncyk7CisJREJDX1JFUVVJUkUocmVzZXJ2ZWQgfHwgKGRzcF9hZGRyID49IHRhcmdldC0+c2VnX3RhYltzZWdpZF0uYmFzZSAmJgorCQkJCSAoZHNwX2FkZHIgKyBzaXplKSA8PSAodGFyZ2V0LT5zZWdfdGFiW3NlZ2lkXS4KKwkJCQkJCSAgIGJhc2UgKworCQkJCQkJICAgdGFyZ2V0LT5zZWdfdGFiW3NlZ2lkXS4KKwkJCQkJCSAgIGxlbmd0aCkpKTsKKworCS8qCisJICogIEZyZWUgb3IgdW5yZXNlcnZlIG1lbW9yeS4KKwkgKi8KKwlpZiAoIXJlc2VydmVkKSB7CisJCXJldCA9IGZyZWVfYmxvY2sodGFyZ2V0LCBzZWdpZCwgZHNwX2FkZHIsIHNpemUpOworCQlpZiAocmV0KQorCQkJdGFyZ2V0LT5zZWdfdGFiW3NlZ2lkXS5udW1iZXItLTsKKworCX0gZWxzZSB7CisJCS8qIFVucmVzZXJ2ZSBtZW1vcnkgKi8KKwkJc2VjdCA9IChzdHJ1Y3Qgcm1tX292bHlfc2VjdCAqKWxzdF9maXJzdCh0YXJnZXQtPm92bHlfbGlzdCk7CisJCXdoaWxlIChzZWN0ICE9IE5VTEwpIHsKKwkJCWlmIChkc3BfYWRkciA9PSBzZWN0LT5hZGRyKSB7CisJCQkJREJDX0FTU0VSVChzaXplID09IHNlY3QtPnNpemUpOworCQkJCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KKwkJCQlsc3RfcmVtb3ZlX2VsZW0odGFyZ2V0LT5vdmx5X2xpc3QsCisJCQkJCQkoc3RydWN0IGxpc3RfaGVhZCAqKXNlY3QpOworCQkJCWtmcmVlKHNlY3QpOworCQkJCWJyZWFrOworCQkJfQorCQkJc2VjdCA9CisJCQkgICAgKHN0cnVjdCBybW1fb3ZseV9zZWN0ICopbHN0X25leHQodGFyZ2V0LT5vdmx5X2xpc3QsCisJCQkJCQkJICAgICAoc3RydWN0IGxpc3RfaGVhZAorCQkJCQkJCSAgICAgICopc2VjdCk7CisJCX0KKwkJaWYgKHNlY3QgPT0gTlVMTCkKKwkJCXJldCA9IGZhbHNlOworCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgPT09PT09PT0gcm1tX2luaXQgPT09PT09PT0KKyAqLworYm9vbCBybW1faW5pdCh2b2lkKQoreworCURCQ19SRVFVSVJFKHJlZnMgPj0gMCk7CisKKwlyZWZzKys7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqICA9PT09PT09PSBybW1fc3RhdCA9PT09PT09PQorICovCitib29sIHJtbV9zdGF0KHN0cnVjdCBybW1fdGFyZ2V0X29iaiAqdGFyZ2V0LCBlbnVtIGRzcF9tZW10eXBlIHNlZ2lkLAorCSAgICAgIHN0cnVjdCBkc3BfbWVtc3RhdCAqbWVtX3N0YXRfYnVmKQoreworCXN0cnVjdCBybW1faGVhZGVyICpoZWFkOworCWJvb2wgcmV0ID0gZmFsc2U7CisJdTMyIG1heF9mcmVlX3NpemUgPSAwOworCXUzMiB0b3RhbF9mcmVlX3NpemUgPSAwOworCXUzMiBmcmVlX2Jsb2NrcyA9IDA7CisKKwlEQkNfUkVRVUlSRShtZW1fc3RhdF9idWYgIT0gTlVMTCk7CisJREJDX0FTU0VSVCh0YXJnZXQgIT0gTlVMTCk7CisKKwlpZiAoKHUzMikgc2VnaWQgPCB0YXJnZXQtPm51bV9zZWdzKSB7CisJCWhlYWQgPSB0YXJnZXQtPmZyZWVfbGlzdFtzZWdpZF07CisKKwkJLyogQ29sbGVjdCBkYXRhIGZyb20gZnJlZV9saXN0ICovCisJCXdoaWxlIChoZWFkICE9IE5VTEwpIHsKKwkJCW1heF9mcmVlX3NpemUgPSBtYXgobWF4X2ZyZWVfc2l6ZSwgaGVhZC0+c2l6ZSk7CisJCQl0b3RhbF9mcmVlX3NpemUgKz0gaGVhZC0+c2l6ZTsKKwkJCWZyZWVfYmxvY2tzKys7CisJCQloZWFkID0gaGVhZC0+bmV4dDsKKwkJfQorCisJCS8qIHVsX3NpemUgKi8KKwkJbWVtX3N0YXRfYnVmLT51bF9zaXplID0gdGFyZ2V0LT5zZWdfdGFiW3NlZ2lkXS5sZW5ndGg7CisKKwkJLyogdWxfbnVtX2ZyZWVfYmxvY2tzICovCisJCW1lbV9zdGF0X2J1Zi0+dWxfbnVtX2ZyZWVfYmxvY2tzID0gZnJlZV9ibG9ja3M7CisKKwkJLyogdWxfdG90YWxfZnJlZV9zaXplICovCisJCW1lbV9zdGF0X2J1Zi0+dWxfdG90YWxfZnJlZV9zaXplID0gdG90YWxfZnJlZV9zaXplOworCisJCS8qIHVsX2xlbl9tYXhfZnJlZV9ibG9jayAqLworCQltZW1fc3RhdF9idWYtPnVsX2xlbl9tYXhfZnJlZV9ibG9jayA9IG1heF9mcmVlX3NpemU7CisKKwkJLyogdWxfbnVtX2FsbG9jX2Jsb2NrcyAqLworCQltZW1fc3RhdF9idWYtPnVsX251bV9hbGxvY19ibG9ja3MgPQorCQkgICAgdGFyZ2V0LT5zZWdfdGFiW3NlZ2lkXS5udW1iZXI7CisKKwkJcmV0ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IGJhbGxvYyA9PT09PT09PQorICogIFRoaXMgYWxsb2NhdGlvbiBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZyb20gdGhlIGxvd2VzdCBhZGRyZXNzZXMKKyAqICBmaXJzdC4KKyAqLworc3RhdGljIGJvb2wgYWxsb2NfYmxvY2soc3RydWN0IHJtbV90YXJnZXRfb2JqICp0YXJnZXQsIHUzMiBzZWdpZCwgdTMyIHNpemUsCisJCQl1MzIgYWxpZ24sIHUzMiAqZHNwX2FkZHJlc3MpCit7CisJc3RydWN0IHJtbV9oZWFkZXIgKmhlYWQ7CisJc3RydWN0IHJtbV9oZWFkZXIgKnByZXZoZWFkID0gTlVMTDsKKwlzdHJ1Y3Qgcm1tX2hlYWRlciAqbmV4dDsKKwl1MzIgdG1wYWxpZ247CisJdTMyIGFsaWduYnl0ZXM7CisJdTMyIGhzaXplOworCXUzMiBhbGxvY3NpemU7CisJdTMyIGFkZHI7CisKKwlhbGlnbmJ5dGVzID0gKGFsaWduID09IDApID8gMSA6IGFsaWduOworCXByZXZoZWFkID0gTlVMTDsKKwloZWFkID0gdGFyZ2V0LT5mcmVlX2xpc3Rbc2VnaWRdOworCisJZG8geworCQloc2l6ZSA9IGhlYWQtPnNpemU7CisJCW5leHQgPSBoZWFkLT5uZXh0OworCisJCWFkZHIgPSBoZWFkLT5hZGRyOwkvKiBhbGxvYyBmcm9tIHRoZSBib3R0b20gKi8KKworCQkvKiBhbGlnbiBhbGxvY2F0aW9uICovCisJCSh0bXBhbGlnbiA9ICh1MzIpIGFkZHIgJSBhbGlnbmJ5dGVzKTsKKwkJaWYgKHRtcGFsaWduICE9IDApCisJCQl0bXBhbGlnbiA9IGFsaWduYnl0ZXMgLSB0bXBhbGlnbjsKKworCQlhbGxvY3NpemUgPSBzaXplICsgdG1wYWxpZ247CisKKwkJaWYgKGhzaXplID49IGFsbG9jc2l6ZSkgewkvKiBiaWcgZW5vdWdoICovCisJCQlpZiAoaHNpemUgPT0gYWxsb2NzaXplICYmIHByZXZoZWFkICE9IE5VTEwpIHsKKwkJCQlwcmV2aGVhZC0+bmV4dCA9IG5leHQ7CisJCQkJa2ZyZWUoaGVhZCk7CisJCQl9IGVsc2UgeworCQkJCWhlYWQtPnNpemUgPSBoc2l6ZSAtIGFsbG9jc2l6ZTsKKwkJCQloZWFkLT5hZGRyICs9IGFsbG9jc2l6ZTsKKwkJCX0KKworCQkJLyogZnJlZSB1cCBhbnkgaG9sZSBjcmVhdGVkIGJ5IGFsaWdubWVudCAqLworCQkJaWYgKHRtcGFsaWduKQorCQkJCWZyZWVfYmxvY2sodGFyZ2V0LCBzZWdpZCwgYWRkciwgdG1wYWxpZ24pOworCisJCQkqZHNwX2FkZHJlc3MgPSBhZGRyICsgdG1wYWxpZ247CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXByZXZoZWFkID0gaGVhZDsKKwkJaGVhZCA9IG5leHQ7CisKKwl9IHdoaWxlIChoZWFkICE9IE5VTEwpOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogID09PT09PT09IGZyZWVfYmxvY2sgPT09PT09PT0KKyAqICBUTyBETzogZnJlZV9ibG9jaygpIGFsbG9jYXRlcyBtZW1vcnksIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBmYWlsdXJlLgorICogIENvdWxkIGFsbG9jYXRlIGFuIHJtbV9oZWFkZXIgaW4gcm1tX2FsbG9jKCksIHRvIGJlIGtlcHQgaW4gYSBwb29sLgorICogIGZyZWVfYmxvY2soKSBjb3VsZCB1c2UgYW4gcm1tX2hlYWRlciBmcm9tIHRoZSBwb29sLCBmcmVlaW5nIGFzIGJsb2NrcworICogIGFyZSBjb2FsZXNjZWQuCisgKi8KK3N0YXRpYyBib29sIGZyZWVfYmxvY2soc3RydWN0IHJtbV90YXJnZXRfb2JqICp0YXJnZXQsIHUzMiBzZWdpZCwgdTMyIGFkZHIsCisJCSAgICAgICB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3Qgcm1tX2hlYWRlciAqaGVhZDsKKwlzdHJ1Y3Qgcm1tX2hlYWRlciAqdGhlYWQ7CisJc3RydWN0IHJtbV9oZWFkZXIgKnJoZWFkOworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCS8qIENyZWF0ZSBhIG1lbW9yeSBoZWFkZXIgdG8gaG9sZCB0aGUgbmV3bHkgZnJlZSdkIGJsb2NrLiAqLworCXJoZWFkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJtbV9oZWFkZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmhlYWQgPT0gTlVMTCkgeworCQlyZXQgPSBmYWxzZTsKKwl9IGVsc2UgeworCQkvKiBzZWFyY2ggZG93biB0aGUgZnJlZSBsaXN0IHRvIGZpbmQgdGhlIHJpZ2h0IHBsYWNlIGZvciBhZGRyICovCisJCWhlYWQgPSB0YXJnZXQtPmZyZWVfbGlzdFtzZWdpZF07CisKKwkJaWYgKGFkZHIgPj0gaGVhZC0+YWRkcikgeworCQkJd2hpbGUgKGhlYWQtPm5leHQgIT0gTlVMTCAmJiBhZGRyID4gaGVhZC0+bmV4dC0+YWRkcikKKwkJCQloZWFkID0gaGVhZC0+bmV4dDsKKworCQkJdGhlYWQgPSBoZWFkLT5uZXh0OworCisJCQloZWFkLT5uZXh0ID0gcmhlYWQ7CisJCQlyaGVhZC0+bmV4dCA9IHRoZWFkOworCQkJcmhlYWQtPmFkZHIgPSBhZGRyOworCQkJcmhlYWQtPnNpemUgPSBzaXplOworCQl9IGVsc2UgeworCQkJKnJoZWFkID0gKmhlYWQ7CisJCQloZWFkLT5uZXh0ID0gcmhlYWQ7CisJCQloZWFkLT5hZGRyID0gYWRkcjsKKwkJCWhlYWQtPnNpemUgPSBzaXplOworCQkJdGhlYWQgPSByaGVhZC0+bmV4dDsKKwkJfQorCisJCS8qIGpvaW4gd2l0aCB1cHBlciBibG9jaywgaWYgcG9zc2libGUgKi8KKwkJaWYgKHRoZWFkICE9IE5VTEwgJiYgKHJoZWFkLT5hZGRyICsgcmhlYWQtPnNpemUpID09CisJCSAgICB0aGVhZC0+YWRkcikgeworCQkJaGVhZC0+bmV4dCA9IHJoZWFkLT5uZXh0OworCQkJdGhlYWQtPnNpemUgPSBzaXplICsgdGhlYWQtPnNpemU7CisJCQl0aGVhZC0+YWRkciA9IGFkZHI7CisJCQlrZnJlZShyaGVhZCk7CisJCQlyaGVhZCA9IHRoZWFkOworCQl9CisKKwkJLyogam9pbiB3aXRoIHRoZSBsb3dlciBibG9jaywgaWYgcG9zc2libGUgKi8KKwkJaWYgKChoZWFkLT5hZGRyICsgaGVhZC0+c2l6ZSkgPT0gcmhlYWQtPmFkZHIpIHsKKwkJCWhlYWQtPm5leHQgPSByaGVhZC0+bmV4dDsKKwkJCWhlYWQtPnNpemUgPSBoZWFkLT5zaXplICsgcmhlYWQtPnNpemU7CisJCQlrZnJlZShyaGVhZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivc3RybS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivc3RybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmVjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9zdHJtLmMKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBzdHJtLmMKKyAqCisgKiBEU1AtQklPUyBCcmlkZ2UgZHJpdmVyIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQIHByb2Nlc3NvcnMuCisgKgorICogRFNQL0JJT1MgQnJpZGdlIFN0cmVhbSBNYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9zdCBPUyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9ob3N0X29zLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1MgQWRhcHRhdGlvbiBMYXllciAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCcmlkZ2UgRHJpdmVyICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RzcGRlZnMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc291cmNlIE1hbmFnZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvbm9kZXByaXYuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE90aGVycyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jbW0uaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3RybS5oPgorCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2NmZy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9yZXNvdXJjZWNsZWFudXAuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlZmluZXMsIERhdGEgU3RydWN0dXJlcywgVHlwZWRlZnMgKi8KKyNkZWZpbmUgREVGQVVMVFRJTUVPVVQgICAgICAxMDAwMAorI2RlZmluZSBERUZBVUxUTlVNQlVGUyAgICAgIDIKKworLyoKKyAqICA9PT09PT09PSBzdHJtX21nciA9PT09PT09PQorICogIFRoZSBzdHJtX21nciBjb250YWlucyBkZXZpY2UgaW5mb3JtYXRpb24gbmVlZGVkIHRvIG9wZW4gdGhlIHVuZGVybHlpbmcKKyAqICBjaGFubmVscyBvZiBhIHN0cmVhbS4KKyAqLworc3RydWN0IHN0cm1fbWdyIHsKKwlzdHJ1Y3QgZGV2X29iamVjdCAqZGV2X29iajsJLyogRGV2aWNlIGZvciB0aGlzIHByb2Nlc3NvciAqLworCXN0cnVjdCBjaG5sX21nciAqaGNobmxfbWdyOwkvKiBDaGFubmVsIG1hbmFnZXIgKi8KKwkvKiBGdW5jdGlvbiBpbnRlcmZhY2UgdG8gQnJpZGdlIGRyaXZlciAqLworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworfTsKKworLyoKKyAqICA9PT09PT09PSBzdHJtX29iamVjdCA9PT09PT09PQorICogIFRoaXMgb2JqZWN0IGlzIGFsbG9jYXRlZCBpbiBzdHJtX29wZW4oKS4KKyAqLworc3RydWN0IHN0cm1fb2JqZWN0IHsKKwlzdHJ1Y3Qgc3RybV9tZ3IgKnN0cm1fbWdyX29iajsKKwlzdHJ1Y3QgY2hubF9vYmplY3QgKmNobmxfb2JqOworCXUzMiBkaXI7CQkvKiBEU1BfVE9OT0RFIG9yIERTUF9GUk9NTk9ERSAqLworCXUzMiB1dGltZW91dDsKKwl1MzIgbnVtX2J1ZnM7CQkvKiBNYXggIyBvZiBidWZzIGFsbG93ZWQgaW4gc3RyZWFtICovCisJdTMyIHVuX2J1ZnNfaW5fc3RybTsJLyogQ3VycmVudCAjIG9mIGJ1ZnMgaW4gc3RyZWFtICovCisJdTMyIHVsX25fYnl0ZXM7CQkvKiBieXRlcyB0cmFuc2ZlcnJlZCBzaW5jZSBpZGxlZCAqLworCS8qIFNUUkVBTV9JRExFLCBTVFJFQU1fUkVBRFksIC4uLiAqLworCWVudW0gZHNwX3N0cmVhbXN0YXRlIHN0cm1fc3RhdGU7CisJdm9pZCAqdXNlcl9ldmVudDsJLyogU2F2ZWQgZm9yIHN0cm1fZ2V0X2luZm8oKSAqLworCWVudW0gZHNwX3N0cm1tb2RlIHN0cm1fbW9kZTsJLyogU1RSTU1PREVfW1BST0NDT1BZXVtaRVJPQ09QWV0uLi4gKi8KKwl1MzIgdWRtYV9jaG5sX2lkOwkvKiBETUEgY2hubCBpZCAqLworCXUzMiB1ZG1hX3ByaW9yaXR5OwkvKiBETUEgcHJpb3JpdHk6RE1BUFJJX1tMT1ddW0hJR0hdICovCisJdTMyIHNlZ21lbnRfaWQ7CQkvKiA+MCBpcyBTTSBzZWdtZW50Lj0wIGlzIGxvY2FsIGhlYXAgKi8KKwl1MzIgYnVmX2FsaWdubWVudDsJLyogQWxpZ25tZW50IGZvciBzdHJlYW0gYnVmcyAqLworCS8qIFN0cmVhbSdzIFNNIGFkZHJlc3MgdHJhbnNsYXRvciAqLworCXN0cnVjdCBjbW1feGxhdG9yb2JqZWN0ICp4bGF0b3I7Cit9OworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFscyAqLworc3RhdGljIHUzMiByZWZzOwkJLyogbW9kdWxlIHJlZmVyZW5jZSBjb3VudCAqLworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAqLworc3RhdGljIGludCBkZWxldGVfc3RybShzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmopOworCisvKgorICogID09PT09PT09IHN0cm1fYWxsb2NhdGVfYnVmZmVyID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgQWxsb2NhdGVzIGJ1ZmZlcnMgZm9yIGEgc3RyZWFtLgorICovCitpbnQgc3RybV9hbGxvY2F0ZV9idWZmZXIoc3RydWN0IHN0cm1fcmVzX29iamVjdCAqc3RybXJlcywgdTMyIHVzaXplLAorCQkJCXU4ICoqYXBfYnVmZmVyLCB1MzIgbnVtX2J1ZnMsCisJCQkJc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgYWxsb2NfY250ID0gMDsKKwl1MzIgaTsKKwlzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmogPSBzdHJtcmVzLT5oc3RyZWFtOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGFwX2J1ZmZlciAhPSBOVUxMKTsKKworCWlmIChzdHJlYW1fb2JqKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGZyb20gc2VnbWVudCBzcGVjaWZpZWQgYXQgdGltZSBvZiBzdHJlYW0gb3Blbi4KKwkJICovCisJCWlmICh1c2l6ZSA9PSAwKQorCQkJc3RhdHVzID0gLUVJTlZBTDsKKworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfQorCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmczsgaSsrKSB7CisJCURCQ19BU1NFUlQoc3RyZWFtX29iai0+eGxhdG9yICE9IE5VTEwpOworCQkodm9pZCljbW1feGxhdG9yX2FsbG9jX2J1ZihzdHJlYW1fb2JqLT54bGF0b3IsICZhcF9idWZmZXJbaV0sCisJCQkJCSAgIHVzaXplKTsKKwkJaWYgKGFwX2J1ZmZlcltpXSA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJYWxsb2NfY250ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChzdGF0dXMpCisJCXN0cm1fZnJlZV9idWZmZXIoc3RybXJlcywgYXBfYnVmZmVyLCBhbGxvY19jbnQsIHByX2N0eHQpOworCisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCWRydl9wcm9jX3VwZGF0ZV9zdHJtX3JlcyhudW1fYnVmcywgc3RybXJlcyk7CisKK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9jbG9zZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENsb3NlIGEgc3RyZWFtIG9wZW5lZCB3aXRoIHN0cm1fb3BlbigpLgorICovCitpbnQgc3RybV9jbG9zZShzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICpzdHJtcmVzLAorCQkgICAgICBzdHJ1Y3QgcHJvY2Vzc19jb250ZXh0ICpwcl9jdHh0KQoreworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBjaG5sX2luZm8gY2hubF9pbmZvX29iajsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmogPSBzdHJtcmVzLT5oc3RyZWFtOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCisJaWYgKCFzdHJlYW1fb2JqKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJLyogSGF2ZSBhbGwgYnVmZmVycyBiZWVuIHJlY2xhaW1lZD8gSWYgbm90LCByZXR1cm4KKwkJICogLUVQSVBFICovCisJCWludGZfZnhucyA9IHN0cmVhbV9vYmotPnN0cm1fbWdyX29iai0+aW50Zl9meG5zOworCQlzdGF0dXMgPQorCQkgICAgKCppbnRmX2Z4bnMtPnBmbl9jaG5sX2dldF9pbmZvKSAoc3RyZWFtX29iai0+Y2hubF9vYmosCisJCQkJCQkgICAgICZjaG5sX2luZm9fb2JqKTsKKwkJREJDX0FTU0VSVCghc3RhdHVzKTsKKworCQlpZiAoY2hubF9pbmZvX29iai5jaW9fY3MgPiAwIHx8IGNobmxfaW5mb19vYmouY2lvX3JlcXMgPiAwKQorCQkJc3RhdHVzID0gLUVQSVBFOworCQllbHNlCisJCQlzdGF0dXMgPSBkZWxldGVfc3RybShzdHJlYW1fb2JqKTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfZW5kOworCisJaWRyX3JlbW92ZShwcl9jdHh0LT5zdHJlYW1faWQsIHN0cm1yZXMtPmlkKTsKK2Z1bmNfZW5kOgorCURCQ19FTlNVUkUoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IC1FRkFVTFQgfHwKKwkJICAgc3RhdHVzID09IC1FUElQRSB8fCBzdGF0dXMgPT0gLUVQRVJNKTsKKworCWRldl9kYmcoYnJpZGdlLCAiJXM6IHN0cmVhbV9vYmo6ICVwLCBzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sCisJCXN0cmVhbV9vYmosIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBzdHJtX2NyZWF0ZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIENyZWF0ZSBhIFNUUk0gbWFuYWdlciBvYmplY3QuCisgKi8KK2ludCBzdHJtX2NyZWF0ZShzdHJ1Y3Qgc3RybV9tZ3IgKipzdHJtX21hbiwKKwkJICAgICAgIHN0cnVjdCBkZXZfb2JqZWN0ICpkZXZfb2JqKQoreworCXN0cnVjdCBzdHJtX21nciAqc3RybV9tZ3Jfb2JqOworCWludCBzdGF0dXMgPSAwOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHN0cm1fbWFuICE9IE5VTEwpOworCURCQ19SRVFVSVJFKGRldl9vYmogIT0gTlVMTCk7CisKKwkqc3RybV9tYW4gPSBOVUxMOworCS8qIEFsbG9jYXRlIFNUUk0gbWFuYWdlciBvYmplY3QgKi8KKwlzdHJtX21ncl9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RybV9tZ3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RybV9tZ3Jfb2JqID09IE5VTEwpCisJCXN0YXR1cyA9IC1FTk9NRU07CisJZWxzZQorCQlzdHJtX21ncl9vYmotPmRldl9vYmogPSBkZXZfb2JqOworCisJLyogR2V0IENoYW5uZWwgbWFuYWdlciBhbmQgQnJpZGdlIGZ1bmN0aW9uIGludGVyZmFjZSAqLworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGRldl9nZXRfY2hubF9tZ3IoZGV2X29iaiwgJihzdHJtX21ncl9vYmotPmhjaG5sX21ncikpOworCQlpZiAoIXN0YXR1cykgeworCQkJKHZvaWQpZGV2X2dldF9pbnRmX2Z4bnMoZGV2X29iaiwKKwkJCQkJCSYoc3RybV9tZ3Jfb2JqLT5pbnRmX2Z4bnMpKTsKKwkJCURCQ19BU1NFUlQoc3RybV9tZ3Jfb2JqLT5pbnRmX2Z4bnMgIT0gTlVMTCk7CisJCX0KKwl9CisKKwlpZiAoIXN0YXR1cykKKwkJKnN0cm1fbWFuID0gc3RybV9tZ3Jfb2JqOworCWVsc2UKKwkJa2ZyZWUoc3RybV9tZ3Jfb2JqKTsKKworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgKnN0cm1fbWFuKSB8fCAoc3RhdHVzICYmICpzdHJtX21hbiA9PSBOVUxMKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHN0cm1fZGVsZXRlID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGVsZXRlIHRoZSBTVFJNIE1hbmFnZXIgT2JqZWN0LgorICovCit2b2lkIHN0cm1fZGVsZXRlKHN0cnVjdCBzdHJtX21nciAqc3RybV9tZ3Jfb2JqKQoreworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShzdHJtX21ncl9vYmopOworCisJa2ZyZWUoc3RybV9tZ3Jfb2JqKTsKK30KKworLyoKKyAqICA9PT09PT09PSBzdHJtX2V4aXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBEaXNjb250aW51ZSB1c2FnZSBvZiBTVFJNIG1vZHVsZS4KKyAqLwordm9pZCBzdHJtX2V4aXQodm9pZCkKK3sKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlyZWZzLS07CisKKwlEQkNfRU5TVVJFKHJlZnMgPj0gMCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9mcmVlX2J1ZmZlciA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWVzIHRoZSBidWZmZXJzIGFsbG9jYXRlZCBmb3IgYSBzdHJlYW0uCisgKi8KK2ludCBzdHJtX2ZyZWVfYnVmZmVyKHN0cnVjdCBzdHJtX3Jlc19vYmplY3QgKnN0cm1yZXMsIHU4ICoqIGFwX2J1ZmZlciwKKwkJCSAgICB1MzIgbnVtX2J1ZnMsIHN0cnVjdCBwcm9jZXNzX2NvbnRleHQgKnByX2N0eHQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGkgPSAwOworCXN0cnVjdCBzdHJtX29iamVjdCAqc3RyZWFtX29iaiA9IHN0cm1yZXMtPmhzdHJlYW07CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoYXBfYnVmZmVyICE9IE5VTEwpOworCisJaWYgKCFzdHJlYW1fb2JqKQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJaWYgKCFzdGF0dXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9idWZzOyBpKyspIHsKKwkJCURCQ19BU1NFUlQoc3RyZWFtX29iai0+eGxhdG9yICE9IE5VTEwpOworCQkJc3RhdHVzID0KKwkJCSAgICBjbW1feGxhdG9yX2ZyZWVfYnVmKHN0cmVhbV9vYmotPnhsYXRvciwKKwkJCQkJCWFwX2J1ZmZlcltpXSk7CisJCQlpZiAoc3RhdHVzKQorCQkJCWJyZWFrOworCQkJYXBfYnVmZmVyW2ldID0gTlVMTDsKKwkJfQorCX0KKwlkcnZfcHJvY191cGRhdGVfc3RybV9yZXMobnVtX2J1ZnMgLSBpLCBzdHJtcmVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9nZXRfaW5mbyA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHN0cmVhbS4KKyAqLworaW50IHN0cm1fZ2V0X2luZm8oc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLAorCQkJIHN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtX2luZm8sCisJCQkgdTMyIHN0cmVhbV9pbmZvX3NpemUpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJc3RydWN0IGNobmxfaW5mbyBjaG5sX2luZm9fb2JqOworCWludCBzdGF0dXMgPSAwOworCXZvaWQgKnZpcnRfYmFzZSA9IE5VTEw7CS8qIE5VTEwgaWYgbm8gU00gdXNlZCAqLworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHN0cmVhbV9pbmZvICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHN0cmVhbV9pbmZvX3NpemUgPj0gc2l6ZW9mKHN0cnVjdCBzdHJlYW1faW5mbykpOworCisJaWYgKCFzdHJlYW1fb2JqKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKHN0cmVhbV9pbmZvX3NpemUgPCBzaXplb2Yoc3RydWN0IHN0cmVhbV9pbmZvKSkgeworCQkJLyogc2l6ZSBvZiB1c2VycyBpbmZvICovCisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlpbnRmX2Z4bnMgPSBzdHJlYW1fb2JqLT5zdHJtX21ncl9vYmotPmludGZfZnhuczsKKwlzdGF0dXMgPQorCSAgICAoKmludGZfZnhucy0+cGZuX2NobmxfZ2V0X2luZm8pIChzdHJlYW1fb2JqLT5jaG5sX29iaiwKKwkJCQkJCSAgJmNobmxfaW5mb19vYmopOworCWlmIChzdGF0dXMpCisJCWdvdG8gZnVuY19lbmQ7CisKKwlpZiAoc3RyZWFtX29iai0+eGxhdG9yKSB7CisJCS8qIFdlIGhhdmUgYSB0cmFuc2xhdG9yICovCisJCURCQ19BU1NFUlQoc3RyZWFtX29iai0+c2VnbWVudF9pZCA+IDApOworCQljbW1feGxhdG9yX2luZm8oc3RyZWFtX29iai0+eGxhdG9yLCAodTggKiopICZ2aXJ0X2Jhc2UsIDAsCisJCQkJc3RyZWFtX29iai0+c2VnbWVudF9pZCwgZmFsc2UpOworCX0KKwlzdHJlYW1faW5mby0+c2VnbWVudF9pZCA9IHN0cmVhbV9vYmotPnNlZ21lbnRfaWQ7CisJc3RyZWFtX2luZm8tPnN0cm1fbW9kZSA9IHN0cmVhbV9vYmotPnN0cm1fbW9kZTsKKwlzdHJlYW1faW5mby0+dmlydF9iYXNlID0gdmlydF9iYXNlOworCXN0cmVhbV9pbmZvLT51c2VyX3N0cm0tPm51bWJlcl9idWZzX2FsbG93ZWQgPSBzdHJlYW1fb2JqLT5udW1fYnVmczsKKwlzdHJlYW1faW5mby0+dXNlcl9zdHJtLT5udW1iZXJfYnVmc19pbl9zdHJlYW0gPSBjaG5sX2luZm9fb2JqLmNpb19jcyArCisJICAgIGNobmxfaW5mb19vYmouY2lvX3JlcXM7CisJLyogIyBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzaW5jZSBsYXN0IGNhbGwgdG8gRFNQU3RyZWFtX0lkbGUoKSAqLworCXN0cmVhbV9pbmZvLT51c2VyX3N0cm0tPnVsX251bWJlcl9ieXRlcyA9IGNobmxfaW5mb19vYmouYnl0ZXNfdHg7CisJc3RyZWFtX2luZm8tPnVzZXJfc3RybS0+c3luY19vYmplY3RfaGFuZGxlID0gY2hubF9pbmZvX29iai5ldmVudF9vYmo7CisJLyogRGV0ZXJtaW5lIHN0cmVhbSBzdGF0ZSBiYXNlZCBvbiBjaGFubmVsIHN0YXRlIGFuZCBpbmZvICovCisJaWYgKGNobmxfaW5mb19vYmouZHdfc3RhdGUgJiBDSE5MX1NUQVRFRU9TKSB7CisJCXN0cmVhbV9pbmZvLT51c2VyX3N0cm0tPnNzX3N0cmVhbV9zdGF0ZSA9IFNUUkVBTV9ET05FOworCX0gZWxzZSB7CisJCWlmIChjaG5sX2luZm9fb2JqLmNpb19jcyA+IDApCisJCQlzdHJlYW1faW5mby0+dXNlcl9zdHJtLT5zc19zdHJlYW1fc3RhdGUgPSBTVFJFQU1fUkVBRFk7CisJCWVsc2UgaWYgKGNobmxfaW5mb19vYmouY2lvX3JlcXMgPiAwKQorCQkJc3RyZWFtX2luZm8tPnVzZXJfc3RybS0+c3Nfc3RyZWFtX3N0YXRlID0KKwkJCSAgICBTVFJFQU1fUEVORElORzsKKwkJZWxzZQorCQkJc3RyZWFtX2luZm8tPnVzZXJfc3RybS0+c3Nfc3RyZWFtX3N0YXRlID0gU1RSRUFNX0lETEU7CisKKwl9CitmdW5jX2VuZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogID09PT09PT09IHN0cm1faWRsZSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIElkbGVzIGEgcGFydGljdWxhciBzdHJlYW0uCisgKi8KK2ludCBzdHJtX2lkbGUoc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLCBib29sIGZsdXNoX2RhdGEpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisKKwlpZiAoIXN0cmVhbV9vYmopIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlpbnRmX2Z4bnMgPSBzdHJlYW1fb2JqLT5zdHJtX21ncl9vYmotPmludGZfZnhuczsKKworCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2NobmxfaWRsZSkgKHN0cmVhbV9vYmotPmNobmxfb2JqLAorCQkJCQkJICAgICAgc3RyZWFtX29iai0+dXRpbWVvdXQsCisJCQkJCQkgICAgICBmbHVzaF9kYXRhKTsKKwl9CisKKwlkZXZfZGJnKGJyaWRnZSwgIiVzOiBzdHJlYW1fb2JqOiAlcCBmbHVzaF9kYXRhOiAweCV4IHN0YXR1czogMHgleFxuIiwKKwkJX19mdW5jX18sIHN0cmVhbV9vYmosIGZsdXNoX2RhdGEsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBzdHJtX2luaXQgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJbml0aWFsaXplIHRoZSBTVFJNIG1vZHVsZS4KKyAqLworYm9vbCBzdHJtX2luaXQodm9pZCkKK3sKKwlib29sIHJldCA9IHRydWU7CisKKwlEQkNfUkVRVUlSRShyZWZzID49IDApOworCisJaWYgKHJldCkKKwkJcmVmcysrOworCisJREJDX0VOU1VSRSgocmV0ICYmIChyZWZzID4gMCkpIHx8ICghcmV0ICYmIChyZWZzID49IDApKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogID09PT09PT09IHN0cm1faXNzdWUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBJc3N1ZXMgYSBidWZmZXIgb24gYSBzdHJlYW0KKyAqLworaW50IHN0cm1faXNzdWUoc3RydWN0IHN0cm1fb2JqZWN0ICpzdHJlYW1fb2JqLCB1OCAqcGJ1ZiwgdTMyIHVsX2J5dGVzLAorCQkgICAgICB1MzIgdWxfYnVmX3NpemUsIHUzMiBkd19hcmcpCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJaW50IHN0YXR1cyA9IDA7CisJdm9pZCAqdG1wX2J1ZiA9IE5VTEw7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUocGJ1ZiAhPSBOVUxMKTsKKworCWlmICghc3RyZWFtX29iaikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0gZWxzZSB7CisJCWludGZfZnhucyA9IHN0cmVhbV9vYmotPnN0cm1fbWdyX29iai0+aW50Zl9meG5zOworCisJCWlmIChzdHJlYW1fb2JqLT5zZWdtZW50X2lkICE9IDApIHsKKwkJCXRtcF9idWYgPSBjbW1feGxhdG9yX3RyYW5zbGF0ZShzdHJlYW1fb2JqLT54bGF0b3IsCisJCQkJCQkgICAgICAgKHZvaWQgKilwYnVmLAorCQkJCQkJICAgICAgIENNTV9WQTJEU1BQQSk7CisJCQlpZiAodG1wX2J1ZiA9PSBOVUxMKQorCQkJCXN0YXR1cyA9IC1FU1JDSDsKKworCQl9CisJCWlmICghc3RhdHVzKSB7CisJCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2NobmxfYWRkX2lvX3JlcSkKKwkJCSAgICAoc3RyZWFtX29iai0+Y2hubF9vYmosIHBidWYsIHVsX2J5dGVzLCB1bF9idWZfc2l6ZSwKKwkJCSAgICAgKHUzMikgdG1wX2J1ZiwgZHdfYXJnKTsKKwkJfQorCQlpZiAoc3RhdHVzID09IC1FSU8pCisJCQlzdGF0dXMgPSAtRU5PU1I7CisJfQorCisJZGV2X2RiZyhicmlkZ2UsICIlczogc3RyZWFtX29iajogJXAgcGJ1ZjogJXAgdWxfYnl0ZXM6IDB4JXggZHdfYXJnOiIKKwkJIiAweCV4IHN0YXR1czogMHgleFxuIiwgX19mdW5jX18sIHN0cmVhbV9vYmosIHBidWYsCisJCXVsX2J5dGVzLCBkd19hcmcsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBzdHJtX29wZW4gPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBPcGVuIGEgc3RyZWFtIGZvciBzZW5kaW5nL3JlY2VpdmluZyBkYXRhIGJ1ZmZlcnMgdG8vZnJvbSBhIHRhc2sgb3IKKyAqICAgICAgWERBSVMgc29ja2V0IG5vZGUgb24gdGhlIERTUC4KKyAqLworaW50IHN0cm1fb3BlbihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgZGlyLCB1MzIgaW5kZXgsCisJCSAgICAgc3RydWN0IHN0cm1fYXR0ciAqcGF0dHIsCisJCSAgICAgc3RydWN0IHN0cm1fcmVzX29iamVjdCAqKnN0cm1yZXMsCisJCSAgICAgc3RydWN0IHByb2Nlc3NfY29udGV4dCAqcHJfY3R4dCkKK3sKKwlzdHJ1Y3Qgc3RybV9tZ3IgKnN0cm1fbWdyX29iajsKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwl1MzIgdWxfY2hubF9pZDsKKwlzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cm1fb2JqID0gTlVMTDsKKwlzOCBjaG5sX21vZGU7CisJc3RydWN0IGNobmxfYXR0ciBjaG5sX2F0dHJfb2JqOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBjbW1fb2JqZWN0ICpoY21tX21nciA9IE5VTEw7CS8qIFNoYXJlZCBtZW1vcnkgbWFuYWdlciBobmRsICovCisKKwl2b2lkICpzdHJlYW1fcmVzOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKHN0cm1yZXMgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUocGF0dHIgIT0gTlVMTCk7CisJKnN0cm1yZXMgPSBOVUxMOworCWlmIChkaXIgIT0gRFNQX1RPTk9ERSAmJiBkaXIgIT0gRFNQX0ZST01OT0RFKSB7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9IGVsc2UgeworCQkvKiBHZXQgdGhlIGNoYW5uZWwgaWQgZnJvbSB0aGUgbm9kZSAoc2V0IGluIG5vZGVfY29ubmVjdCgpKSAqLworCQlzdGF0dXMgPSBub2RlX2dldF9jaGFubmVsX2lkKGhub2RlLCBkaXIsIGluZGV4LCAmdWxfY2hubF9pZCk7CisJfQorCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBub2RlX2dldF9zdHJtX21ncihobm9kZSwgJnN0cm1fbWdyX29iaik7CisKKwlpZiAoIXN0YXR1cykgeworCQlzdHJtX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJtX29iamVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoc3RybV9vYmogPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCXN0cm1fb2JqLT5zdHJtX21ncl9vYmogPSBzdHJtX21ncl9vYmo7CisJCQlzdHJtX29iai0+ZGlyID0gZGlyOworCQkJc3RybV9vYmotPnN0cm1fc3RhdGUgPSBTVFJFQU1fSURMRTsKKwkJCXN0cm1fb2JqLT51c2VyX2V2ZW50ID0gcGF0dHItPnVzZXJfZXZlbnQ7CisJCQlpZiAocGF0dHItPnN0cmVhbV9hdHRyX2luICE9IE5VTEwpIHsKKwkJCQlzdHJtX29iai0+dXRpbWVvdXQgPQorCQkJCSAgICBwYXR0ci0+c3RyZWFtX2F0dHJfaW4tPnV0aW1lb3V0OworCQkJCXN0cm1fb2JqLT5udW1fYnVmcyA9CisJCQkJICAgIHBhdHRyLT5zdHJlYW1fYXR0cl9pbi0+bnVtX2J1ZnM7CisJCQkJc3RybV9vYmotPnN0cm1fbW9kZSA9CisJCQkJICAgIHBhdHRyLT5zdHJlYW1fYXR0cl9pbi0+c3RybV9tb2RlOworCQkJCXN0cm1fb2JqLT5zZWdtZW50X2lkID0KKwkJCQkgICAgcGF0dHItPnN0cmVhbV9hdHRyX2luLT5zZWdtZW50X2lkOworCQkJCXN0cm1fb2JqLT5idWZfYWxpZ25tZW50ID0KKwkJCQkgICAgcGF0dHItPnN0cmVhbV9hdHRyX2luLT5idWZfYWxpZ25tZW50OworCQkJCXN0cm1fb2JqLT51ZG1hX2NobmxfaWQgPQorCQkJCSAgICBwYXR0ci0+c3RyZWFtX2F0dHJfaW4tPnVkbWFfY2hubF9pZDsKKwkJCQlzdHJtX29iai0+dWRtYV9wcmlvcml0eSA9CisJCQkJICAgIHBhdHRyLT5zdHJlYW1fYXR0cl9pbi0+dWRtYV9wcmlvcml0eTsKKwkJCQljaG5sX2F0dHJfb2JqLnVpb19yZXFzID0KKwkJCQkgICAgcGF0dHItPnN0cmVhbV9hdHRyX2luLT5udW1fYnVmczsKKwkJCX0gZWxzZSB7CisJCQkJc3RybV9vYmotPnV0aW1lb3V0ID0gREVGQVVMVFRJTUVPVVQ7CisJCQkJc3RybV9vYmotPm51bV9idWZzID0gREVGQVVMVE5VTUJVRlM7CisJCQkJc3RybV9vYmotPnN0cm1fbW9kZSA9IFNUUk1NT0RFX1BST0NDT1BZOworCQkJCXN0cm1fb2JqLT5zZWdtZW50X2lkID0gMDsJLyogbG9jYWwgbWVtICovCisJCQkJc3RybV9vYmotPmJ1Zl9hbGlnbm1lbnQgPSAwOworCQkJCXN0cm1fb2JqLT51ZG1hX2NobmxfaWQgPSAwOworCQkJCXN0cm1fb2JqLT51ZG1hX3ByaW9yaXR5ID0gMDsKKwkJCQljaG5sX2F0dHJfb2JqLnVpb19yZXFzID0gREVGQVVMVE5VTUJVRlM7CisJCQl9CisJCQljaG5sX2F0dHJfb2JqLnJlc2VydmVkMSA9IE5VTEw7CisJCQkvKiBETUEgY2hubCBmbHVzaCB0aW1lb3V0ICovCisJCQljaG5sX2F0dHJfb2JqLnJlc2VydmVkMiA9IHN0cm1fb2JqLT51dGltZW91dDsKKwkJCWNobmxfYXR0cl9vYmouZXZlbnRfb2JqID0gTlVMTDsKKwkJCWlmIChwYXR0ci0+dXNlcl9ldmVudCAhPSBOVUxMKQorCQkJCWNobmxfYXR0cl9vYmouZXZlbnRfb2JqID0gcGF0dHItPnVzZXJfZXZlbnQ7CisKKwkJfQorCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZ1bmNfY29udDsKKworCWlmICgocGF0dHItPnZpcnRfYmFzZSA9PSBOVUxMKSB8fCAhKHBhdHRyLT51bF92aXJ0X3NpemUgPiAwKSkKKwkJZ290byBmdW5jX2NvbnQ7CisKKwkvKiBObyBTeXN0ZW0gRE1BICovCisJREJDX0FTU0VSVChzdHJtX29iai0+c3RybV9tb2RlICE9IFNUUk1NT0RFX0xETUEpOworCS8qIEdldCB0aGUgc2hhcmVkIG1lbSBtZ3IgZm9yIHRoaXMgc3RyZWFtcyBkZXYgb2JqZWN0ICovCisJc3RhdHVzID0gZGV2X2dldF9jbW1fbWdyKHN0cm1fbWdyX29iai0+ZGV2X29iaiwgJmhjbW1fbWdyKTsKKwlpZiAoIXN0YXR1cykgeworCQkvKkFsbG9jYXRlIGEgU00gYWRkciB0cmFuc2xhdG9yIGZvciB0aGlzIHN0cm0uICovCisJCXN0YXR1cyA9IGNtbV94bGF0b3JfY3JlYXRlKCZzdHJtX29iai0+eGxhdG9yLCBoY21tX21nciwgTlVMTCk7CisJCWlmICghc3RhdHVzKSB7CisJCQlEQkNfQVNTRVJUKHN0cm1fb2JqLT5zZWdtZW50X2lkID4gMCk7CisJCQkvKiAgU2V0IHRyYW5zbGF0b3JzIFZpcnQgQWRkciBhdHRyaWJ1dGVzICovCisJCQlzdGF0dXMgPSBjbW1feGxhdG9yX2luZm8oc3RybV9vYmotPnhsYXRvciwKKwkJCQkJCSAodTggKiopICZwYXR0ci0+dmlydF9iYXNlLAorCQkJCQkJIHBhdHRyLT51bF92aXJ0X3NpemUsCisJCQkJCQkgc3RybV9vYmotPnNlZ21lbnRfaWQsIHRydWUpOworCQl9CisJfQorZnVuY19jb250OgorCWlmICghc3RhdHVzKSB7CisJCS8qIE9wZW4gY2hhbm5lbCAqLworCQljaG5sX21vZGUgPSAoZGlyID09IERTUF9UT05PREUpID8KKwkJICAgIENITkxfTU9ERVRPRFNQIDogQ0hOTF9NT0RFRlJPTURTUDsKKwkJaW50Zl9meG5zID0gc3RybV9tZ3Jfb2JqLT5pbnRmX2Z4bnM7CisJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fY2hubF9vcGVuKSAoJihzdHJtX29iai0+Y2hubF9vYmopLAorCQkJCQkJICAgICAgc3RybV9tZ3Jfb2JqLT5oY2hubF9tZ3IsCisJCQkJCQkgICAgICBjaG5sX21vZGUsIHVsX2NobmxfaWQsCisJCQkJCQkgICAgICAmY2hubF9hdHRyX29iaik7CisJCWlmIChzdGF0dXMpIHsKKwkJCS8qCisJCQkgKiBvdmVyLXJpZGUgbm9uLXJldHVybmFibGUgc3RhdHVzIGNvZGVzIHNvIHdlIHJldHVybgorCQkJICogc29tZXRoaW5nIGRvY3VtZW50ZWQKKwkJCSAqLworCQkJaWYgKHN0YXR1cyAhPSAtRU5PTUVNICYmIHN0YXR1cyAhPQorCQkJICAgIC1FSU5WQUwgJiYgc3RhdHVzICE9IC1FUEVSTSkgeworCQkJCS8qCisJCQkJICogV2UgZ290IGEgc3RhdHVzIHRoYXQncyBub3QgcmV0dXJuLWFibGUuCisJCQkJICogQXNzZXJ0IHRoYXQgd2UgZ290IHNvbWV0aGluZyB3ZSB3ZXJlCisJCQkJICogZXhwZWN0aW5nICgtRUZBVUxUIGlzbid0IGFjY2VwdGFibGUsCisJCQkJICogc3RybV9tZ3Jfb2JqLT5oY2hubF9tZ3IgYmV0dGVyIGJlIHZhbGlkIG9yIHdlCisJCQkJICogYXNzZXJ0IGhlcmUpLCBhbmQgdGhlbiByZXR1cm4gLUVQRVJNLgorCQkJCSAqLworCQkJCURCQ19BU1NFUlQoc3RhdHVzID09IC1FTk9TUiB8fAorCQkJCQkgICBzdGF0dXMgPT0gLUVDSFJORyB8fAorCQkJCQkgICBzdGF0dXMgPT0gLUVBTFJFQURZIHx8CisJCQkJCSAgIHN0YXR1cyA9PSAtRUlPKTsKKwkJCQlzdGF0dXMgPSAtRVBFUk07CisJCQl9CisJCX0KKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0gZHJ2X3Byb2NfaW5zZXJ0X3N0cm1fcmVzX2VsZW1lbnQoc3RybV9vYmosCisJCQkJCQkJJnN0cmVhbV9yZXMsIHByX2N0eHQpOworCQlpZiAoc3RhdHVzKQorCQkJZGVsZXRlX3N0cm0oc3RybV9vYmopOworCQllbHNlCisJCQkqc3RybXJlcyA9IChzdHJ1Y3Qgc3RybV9yZXNfb2JqZWN0ICopc3RyZWFtX3JlczsKKwl9IGVsc2UgeworCQkodm9pZClkZWxldGVfc3RybShzdHJtX29iaik7CisJfQorCisJLyogZW5zdXJlIHdlIHJldHVybiBhIGRvY3VtZW50ZWQgZXJyb3IgY29kZSAqLworCURCQ19FTlNVUkUoKCFzdGF0dXMgJiYgc3RybV9vYmopIHx8CisJCSAgICgqc3RybXJlcyA9PSBOVUxMICYmIChzdGF0dXMgPT0gLUVGQVVMVCB8fAorCQkJCQlzdGF0dXMgPT0gLUVQRVJNCisJCQkJCXx8IHN0YXR1cyA9PSAtRUlOVkFMKSkpOworCisJZGV2X2RiZyhicmlkZ2UsICIlczogaG5vZGU6ICVwIGRpcjogMHgleCBpbmRleDogMHgleCBwYXR0cjogJXAgIgorCQkic3RybXJlczogJXAgc3RhdHVzOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJaG5vZGUsIGRpciwgaW5kZXgsIHBhdHRyLCBzdHJtcmVzLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9yZWNsYWltID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmVsY2FpbXMgYSBidWZmZXIgZnJvbSBhIHN0cmVhbS4KKyAqLworaW50IHN0cm1fcmVjbGFpbShzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmosIHU4ICoqIGJ1Zl9wdHIsCisJCQl1MzIgKm5ieXRlcywgdTMyICpidWZmX3NpemUsIHUzMiAqcGR3X2FyZykKK3sKKwlzdHJ1Y3QgYnJpZGdlX2Rydl9pbnRlcmZhY2UgKmludGZfZnhuczsKKwlzdHJ1Y3QgY2hubF9pb2MgY2hubF9pb2Nfb2JqOworCWludCBzdGF0dXMgPSAwOworCXZvaWQgKnRtcF9idWYgPSBOVUxMOworCisJREJDX1JFUVVJUkUocmVmcyA+IDApOworCURCQ19SRVFVSVJFKGJ1Zl9wdHIgIT0gTlVMTCk7CisJREJDX1JFUVVJUkUobmJ5dGVzICE9IE5VTEwpOworCURCQ19SRVFVSVJFKHBkd19hcmcgIT0gTlVMTCk7CisKKwlpZiAoIXN0cmVhbV9vYmopIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBmdW5jX2VuZDsKKwl9CisJaW50Zl9meG5zID0gc3RyZWFtX29iai0+c3RybV9tZ3Jfb2JqLT5pbnRmX2Z4bnM7CisKKwlzdGF0dXMgPQorCSAgICAoKmludGZfZnhucy0+cGZuX2NobmxfZ2V0X2lvYykgKHN0cmVhbV9vYmotPmNobmxfb2JqLAorCQkJCQkgICAgc3RyZWFtX29iai0+dXRpbWVvdXQsCisJCQkJCSAgICAmY2hubF9pb2Nfb2JqKTsKKwlpZiAoIXN0YXR1cykgeworCQkqbmJ5dGVzID0gY2hubF9pb2Nfb2JqLmJ5dGVfc2l6ZTsKKwkJaWYgKGJ1ZmZfc2l6ZSkKKwkJCSpidWZmX3NpemUgPSBjaG5sX2lvY19vYmouYnVmX3NpemU7CisKKwkJKnBkd19hcmcgPSBjaG5sX2lvY19vYmouZHdfYXJnOworCQlpZiAoIUNITkxfSVNfSU9fQ09NUExFVEUoY2hubF9pb2Nfb2JqKSkgeworCQkJaWYgKENITkxfSVNfVElNRURfT1VUKGNobmxfaW9jX29iaikpIHsKKwkJCQlzdGF0dXMgPSAtRVRJTUU7CisJCQl9IGVsc2UgeworCQkJCS8qIEFsbG93IHJlY2xhaW1zIGFmdGVyIGlkbGUgdG8gc3VjY2VlZCAqLworCQkJCWlmICghQ0hOTF9JU19JT19DQU5DRUxMRUQoY2hubF9pb2Nfb2JqKSkKKwkJCQkJc3RhdHVzID0gLUVQRVJNOworCisJCQl9CisJCX0KKwkJLyogVHJhbnNsYXRlIHplcm9jb3B5IGJ1ZmZlciBpZiBjaGFubmVsIG5vdCBjYW5jZWxlZC4gKi8KKwkJaWYgKCFzdGF0dXMKKwkJICAgICYmICghQ0hOTF9JU19JT19DQU5DRUxMRUQoY2hubF9pb2Nfb2JqKSkKKwkJICAgICYmIChzdHJlYW1fb2JqLT5zdHJtX21vZGUgPT0gU1RSTU1PREVfWkVST0NPUFkpKSB7CisJCQkvKgorCQkJICogIFRoaXMgaXMgYSB6ZXJvLWNvcHkgY2hhbm5lbCBzbyBjaG5sX2lvY19vYmoucGJ1ZgorCQkJICogIGNvbnRhaW5zIHRoZSBEU1AgYWRkcmVzcyBvZiBTTS4gV2UgbmVlZCB0bworCQkJICogIHRyYW5zbGF0ZSBpdCB0byBhIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhlIHVzZXIKKwkJCSAqICB0aHJlYWQgdG8gYWNjZXNzLgorCQkJICogIE5vdGU6IENvdWxkIGFkZCBDTU1fRFNQUEEyVkEgdG8gQ01NIGluIHRoZSBmdXR1cmUuCisJCQkgKi8KKwkJCXRtcF9idWYgPSBjbW1feGxhdG9yX3RyYW5zbGF0ZShzdHJlYW1fb2JqLT54bGF0b3IsCisJCQkJCQkgICAgICAgY2hubF9pb2Nfb2JqLnBidWYsCisJCQkJCQkgICAgICAgQ01NX0RTUFBBMlBBKTsKKwkJCWlmICh0bXBfYnVmICE9IE5VTEwpIHsKKwkJCQkvKiBub3cgY29udmVydCB0aGlzIEdQUCBQYSB0byBWYSAqLworCQkJCXRtcF9idWYgPSBjbW1feGxhdG9yX3RyYW5zbGF0ZShzdHJlYW1fb2JqLT4KKwkJCQkJCQkgICAgICAgeGxhdG9yLAorCQkJCQkJCSAgICAgICB0bXBfYnVmLAorCQkJCQkJCSAgICAgICBDTU1fUEEyVkEpOworCQkJfQorCQkJaWYgKHRtcF9idWYgPT0gTlVMTCkKKwkJCQlzdGF0dXMgPSAtRVNSQ0g7CisKKwkJCWNobmxfaW9jX29iai5wYnVmID0gdG1wX2J1ZjsKKwkJfQorCQkqYnVmX3B0ciA9IGNobmxfaW9jX29iai5wYnVmOworCX0KK2Z1bmNfZW5kOgorCS8qIGVuc3VyZSB3ZSByZXR1cm4gYSBkb2N1bWVudGVkIHJldHVybiBjb2RlICovCisJREJDX0VOU1VSRSghc3RhdHVzIHx8IHN0YXR1cyA9PSAtRUZBVUxUIHx8CisJCSAgIHN0YXR1cyA9PSAtRVRJTUUgfHwgc3RhdHVzID09IC1FU1JDSCB8fAorCQkgICBzdGF0dXMgPT0gLUVQRVJNKTsKKworCWRldl9kYmcoYnJpZGdlLCAiJXM6IHN0cmVhbV9vYmo6ICVwIGJ1Zl9wdHI6ICVwIG5ieXRlczogJXAgIgorCQkicGR3X2FyZzogJXAgc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCBzdHJlYW1fb2JqLAorCQlidWZfcHRyLCBuYnl0ZXMsIHBkd19hcmcsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBzdHJtX3JlZ2lzdGVyX25vdGlmeSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIFJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIG9uIHNwZWNpZmljIGV2ZW50cyBmb3IgdGhpcyBzdHJlYW0uCisgKi8KK2ludCBzdHJtX3JlZ2lzdGVyX25vdGlmeShzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmosIHUzMiBldmVudF9tYXNrLAorCQkJCXUzMiBub3RpZnlfdHlwZSwgc3RydWN0IGRzcF9ub3RpZmljYXRpb24KKwkJCQkqIGhub3RpZmljYXRpb24pCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEQkNfUkVRVUlSRShyZWZzID4gMCk7CisJREJDX1JFUVVJUkUoaG5vdGlmaWNhdGlvbiAhPSBOVUxMKTsKKworCWlmICghc3RyZWFtX29iaikgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0gZWxzZSBpZiAoKGV2ZW50X21hc2sgJiB+KChEU1BfU1RSRUFNSU9DT01QTEVUSU9OKSB8CisJCQkJICAgRFNQX1NUUkVBTURPTkUpKSAhPSAwKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKG5vdGlmeV90eXBlICE9IERTUF9TSUdOQUxFVkVOVCkKKwkJCXN0YXR1cyA9IC1FTk9TWVM7CisKKwl9CisJaWYgKCFzdGF0dXMpIHsKKwkJaW50Zl9meG5zID0gc3RyZWFtX29iai0+c3RybV9tZ3Jfb2JqLT5pbnRmX2Z4bnM7CisKKwkJc3RhdHVzID0KKwkJICAgICgqaW50Zl9meG5zLT5wZm5fY2hubF9yZWdpc3Rlcl9ub3RpZnkpIChzdHJlYW1fb2JqLT4KKwkJCQkJCQkgICAgY2hubF9vYmosCisJCQkJCQkJICAgIGV2ZW50X21hc2ssCisJCQkJCQkJICAgIG5vdGlmeV90eXBlLAorCQkJCQkJCSAgICBobm90aWZpY2F0aW9uKTsKKwl9CisJLyogZW5zdXJlIHdlIHJldHVybiBhIGRvY3VtZW50ZWQgcmV0dXJuIGNvZGUgKi8KKwlEQkNfRU5TVVJFKCFzdGF0dXMgfHwgc3RhdHVzID09IC1FRkFVTFQgfHwKKwkJICAgc3RhdHVzID09IC1FVElNRSB8fCBzdGF0dXMgPT0gLUVTUkNIIHx8CisJCSAgIHN0YXR1cyA9PSAtRU5PU1lTIHx8IHN0YXR1cyA9PSAtRVBFUk0pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc3RybV9zZWxlY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTZWxlY3RzIGEgcmVhZHkgc3RyZWFtLgorICovCitpbnQgc3RybV9zZWxlY3Qoc3RydWN0IHN0cm1fb2JqZWN0ICoqc3RybV90YWIsIHUzMiBzdHJtcywKKwkJICAgICAgIHUzMiAqcG1hc2ssIHUzMiB1dGltZW91dCkKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IGNobmxfaW5mbyBjaG5sX2luZm9fb2JqOworCXN0cnVjdCBicmlkZ2VfZHJ2X2ludGVyZmFjZSAqaW50Zl9meG5zOworCXN0cnVjdCBzeW5jX29iamVjdCAqKnN5bmNfZXZlbnRzID0gTlVMTDsKKwl1MzIgaTsKKwlpbnQgc3RhdHVzID0gMDsKKworCURCQ19SRVFVSVJFKHJlZnMgPiAwKTsKKwlEQkNfUkVRVUlSRShzdHJtX3RhYiAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShwbWFzayAhPSBOVUxMKTsKKwlEQkNfUkVRVUlSRShzdHJtcyA+IDApOworCisJKnBtYXNrID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc3RybXM7IGkrKykgeworCQlpZiAoIXN0cm1fdGFiW2ldKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHN0YXR1cykKKwkJZ290byBmdW5jX2VuZDsKKworCS8qIERldGVybWluZSB3aGljaCBjaGFubmVscyBoYXZlIElPIHJlYWR5ICovCisJZm9yIChpID0gMDsgaSA8IHN0cm1zOyBpKyspIHsKKwkJaW50Zl9meG5zID0gc3RybV90YWJbaV0tPnN0cm1fbWdyX29iai0+aW50Zl9meG5zOworCQlzdGF0dXMgPSAoKmludGZfZnhucy0+cGZuX2NobmxfZ2V0X2luZm8pIChzdHJtX3RhYltpXS0+Y2hubF9vYmosCisJCQkJCQkJICAmY2hubF9pbmZvX29iaik7CisJCWlmIChzdGF0dXMpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKGNobmxfaW5mb19vYmouY2lvX2NzID4gMCkKKwkJCQkqcG1hc2sgfD0gKDEgPDwgaSk7CisKKwkJfQorCX0KKwlpZiAoIXN0YXR1cyAmJiB1dGltZW91dCA+IDAgJiYgKnBtYXNrID09IDApIHsKKwkJLyogTm9uLXplcm8gdGltZW91dCAqLworCQlzeW5jX2V2ZW50cyA9IGttYWxsb2Moc3RybXMgKiBzaXplb2Yoc3RydWN0IHN5bmNfb2JqZWN0ICopLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKworCQlpZiAoc3luY19ldmVudHMgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdHJtczsgaSsrKSB7CisJCQkJaW50Zl9meG5zID0KKwkJCQkgICAgc3RybV90YWJbaV0tPnN0cm1fbWdyX29iai0+aW50Zl9meG5zOworCQkJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fY2hubF9nZXRfaW5mbykKKwkJCQkgICAgKHN0cm1fdGFiW2ldLT5jaG5sX29iaiwgJmNobmxfaW5mb19vYmopOworCQkJCWlmIChzdGF0dXMpCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQkJc3luY19ldmVudHNbaV0gPQorCQkJCQkgICAgY2hubF9pbmZvX29iai5zeW5jX2V2ZW50OworCisJCQl9CisJCX0KKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgc3luY193YWl0X29uX211bHRpcGxlX2V2ZW50cyhzeW5jX2V2ZW50cywgc3RybXMsCisJCQkJCQkJIHV0aW1lb3V0LCAmaW5kZXgpOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQkvKiBTaW5jZSB3ZSB3YWl0ZWQgb24gdGhlIGV2ZW50LCB3ZSBoYXZlIHRvCisJCQkJICogcmVzZXQgaXQgKi8KKwkJCQlzeW5jX3NldF9ldmVudChzeW5jX2V2ZW50c1tpbmRleF0pOworCQkJCSpwbWFzayA9IDEgPDwgaW5kZXg7CisJCQl9CisJCX0KKwl9CitmdW5jX2VuZDoKKwlrZnJlZShzeW5jX2V2ZW50cyk7CisKKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmICgqcG1hc2sgIT0gMCB8fCB1dGltZW91dCA9PSAwKSkgfHwKKwkJICAgKHN0YXR1cyAmJiAqcG1hc2sgPT0gMCkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBkZWxldGVfc3RybSA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEZyZWVzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHN0cmVhbS4KKyAqLworc3RhdGljIGludCBkZWxldGVfc3RybShzdHJ1Y3Qgc3RybV9vYmplY3QgKnN0cmVhbV9vYmopCit7CisJc3RydWN0IGJyaWRnZV9kcnZfaW50ZXJmYWNlICppbnRmX2Z4bnM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoc3RyZWFtX29iaikgeworCQlpZiAoc3RyZWFtX29iai0+Y2hubF9vYmopIHsKKwkJCWludGZfZnhucyA9IHN0cmVhbV9vYmotPnN0cm1fbWdyX29iai0+aW50Zl9meG5zOworCQkJLyogQ2hhbm5lbCBjbG9zZSBjYW4gZmFpbCBvbmx5IGlmIHRoZSBjaGFubmVsIGhhbmRsZQorCQkJICogaXMgaW52YWxpZC4gKi8KKwkJCXN0YXR1cyA9ICgqaW50Zl9meG5zLT5wZm5fY2hubF9jbG9zZSkKKwkJCQkJKHN0cmVhbV9vYmotPmNobmxfb2JqKTsKKwkJCS8qIEZyZWUgYWxsIFNNIGFkZHJlc3MgdHJhbnNsYXRvciByZXNvdXJjZXMgKi8KKwkJCWlmICghc3RhdHVzKSB7CisJCQkJaWYgKHN0cmVhbV9vYmotPnhsYXRvcikgeworCQkJCQkvKiBmb3JjZSBmcmVlICovCisJCQkJCSh2b2lkKWNtbV94bGF0b3JfZGVsZXRlKHN0cmVhbV9vYmotPgorCQkJCQkJCQl4bGF0b3IsCisJCQkJCQkJCXRydWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlrZnJlZShzdHJlYW1fb2JqKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3NlcnZpY2VzL2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3NlcnZpY2VzL2NmZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvc2VydmljZXMvY2ZnLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBjZmcuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBjb25maWcgc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEU1AvQklPUyBCcmlkZ2UgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZGJkZWZzLmg+CisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZSAmIERlYnVnICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiYy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1MgQWRhcHRhdGlvbiBMYXllciAqLworCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9jZmcuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2UvZHJ2Lmg+CisKK3N0cnVjdCBkcnZfZXh0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJY2hhciBzel9zdHJpbmdbTUFYUkVHUEFUSExFTkdUSF07Cit9OworCisvKgorICogID09PT09PT09IGNmZ19leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgdGhlIENGRyBtb2R1bGUuCisgKi8KK3ZvaWQgY2ZnX2V4aXQodm9pZCkKK3sKKwkvKiBEbyBub3RoaW5nICovCit9CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF9hdXRvX3N0YXJ0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgUmV0cmVpdmUgdGhlIGF1dG9zdGFydCBtYXNrLCBpZiBhbnksIGZvciB0aGlzIGJvYXJkLgorICovCitpbnQgY2ZnX2dldF9hdXRvX3N0YXJ0KHN0cnVjdCBjZmdfZGV2bm9kZSAqZGV2X25vZGVfb2JqLAorCQkJICAgICAgdTMyICphdXRvX3N0YXJ0KQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBkd19idWZfc2l6ZTsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJZHdfYnVmX3NpemUgPSBzaXplb2YoKmF1dG9fc3RhcnQpOworCWlmICghZGV2X25vZGVfb2JqKQorCQlzdGF0dXMgPSAtRUZBVUxUOworCWlmICghYXV0b19zdGFydCB8fCAhZHJ2X2RhdGFwKQorCQlzdGF0dXMgPSAtRUZBVUxUOworCWlmICghc3RhdHVzKQorCQkqYXV0b19zdGFydCA9IChkcnZfZGF0YXAtPmJhc2VfaW1nKSA/IDEgOiAwOworCisJREJDX0VOU1VSRSgoc3RhdHVzID09IDAgJiYKKwkJICAgICgqYXV0b19zdGFydCA9PSAwIHx8ICphdXRvX3N0YXJ0ID09IDEpKQorCQkgICB8fCBzdGF0dXMgIT0gMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjZmdfZ2V0X2Rldl9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgRGV2aWNlIE9iamVjdCBoYW5kbGUgZm9yIGEgZ2l2ZW4gZGV2bm9kZS4KKyAqLworaW50IGNmZ19nZXRfZGV2X29iamVjdChzdHJ1Y3QgY2ZnX2Rldm5vZGUgKmRldl9ub2RlX29iaiwKKwkJCSAgICAgIHUzMiAqdmFsdWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGR3X2J1Zl9zaXplOworCXN0cnVjdCBkcnZfZGF0YSAqZHJ2X2RhdGFwID0gZGV2X2dldF9kcnZkYXRhKGJyaWRnZSk7CisKKwlpZiAoIWRydl9kYXRhcCkKKwkJc3RhdHVzID0gLUVQRVJNOworCisJaWYgKCFkZXZfbm9kZV9vYmopCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwlpZiAoIXZhbHVlKQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJZHdfYnVmX3NpemUgPSBzaXplb2YodmFsdWUpOworCWlmICghc3RhdHVzKSB7CisKKwkJLyogY2hlY2sgdGhlIGRldmljZSBzdHJpbmcgYW5kIHRoZW4gc3RvcmUgZGV2IG9iamVjdCAqLworCQlpZiAoIQorCQkgICAgKHN0cmNtcAorCQkgICAgICgoY2hhciAqKSgoc3RydWN0IGRydl9leHQgKilkZXZfbm9kZV9vYmopLT5zel9zdHJpbmcsCisJCSAgICAgICJUSU9NQVAxNTEwIikpKQorCQkJKnZhbHVlID0gKHUzMilkcnZfZGF0YXAtPmRldl9vYmplY3Q7CisJfQorCWlmIChzdGF0dXMpCisJCXByX2VycigiJXM6IEZhaWxlZCwgc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF9leGVjX2ZpbGUgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyZWl2ZSB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBpZiBhbnksIGZvciB0aGlzIGJvYXJkLgorICovCitpbnQgY2ZnX2dldF9leGVjX2ZpbGUoc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmosIHUzMiBidWZfc2l6ZSwKKwkJCSAgICAgY2hhciAqc3RyX2V4ZWNfZmlsZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJaWYgKCFkZXZfbm9kZV9vYmopCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwllbHNlIGlmICghc3RyX2V4ZWNfZmlsZSB8fCAhZHJ2X2RhdGFwKQorCQlzdGF0dXMgPSAtRUZBVUxUOworCisJaWYgKHN0cmxlbihkcnZfZGF0YXAtPmJhc2VfaW1nKSA+IGJ1Zl9zaXplKQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJaWYgKCFzdGF0dXMgJiYgZHJ2X2RhdGFwLT5iYXNlX2ltZykKKwkJc3RyY3B5KHN0cl9leGVjX2ZpbGUsIGRydl9kYXRhcC0+YmFzZV9pbWcpOworCisJaWYgKHN0YXR1cykKKwkJcHJfZXJyKCIlczogRmFpbGVkLCBzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJREJDX0VOU1VSRSgoKHN0YXR1cyA9PSAwKSAmJgorCQkgICAgKHN0cmxlbihzdHJfZXhlY19maWxlKSA8PSBidWZfc2l6ZSkpCisJCSAgIHx8IChzdGF0dXMgIT0gMCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX2dldF9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBSZXRyaWV2ZSB0aGUgT2JqZWN0IGhhbmRsZSBmcm9tIHRoZSBSZWdpc3RyeQorICovCitpbnQgY2ZnX2dldF9vYmplY3QodTMyICp2YWx1ZSwgdTggZHdfdHlwZSkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJREJDX1JFUVVJUkUodmFsdWUgIT0gTlVMTCk7CisKKwlpZiAoIWRydl9kYXRhcCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoZHdfdHlwZSkgeworCWNhc2UgKFJFR19EUlZfT0JKRUNUKToKKwkJaWYgKGRydl9kYXRhcC0+ZHJ2X29iamVjdCkgeworCQkJKnZhbHVlID0gKHUzMilkcnZfZGF0YXAtPmRydl9vYmplY3Q7CisJCQlzdGF0dXMgPSAwOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVOT0RBVEE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAoUkVHX01HUl9PQkpFQ1QpOgorCQlpZiAoZHJ2X2RhdGFwLT5tZ3Jfb2JqZWN0KSB7CisJCQkqdmFsdWUgPSAodTMyKWRydl9kYXRhcC0+bWdyX29iamVjdDsKKwkJCXN0YXR1cyA9IDA7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRU5PREFUQTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpZiAoc3RhdHVzKSB7CisJCSp2YWx1ZSA9IDA7CisJCXByX2VycigiJXM6IEZhaWxlZCwgc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCX0KKwlEQkNfRU5TVVJFKCghc3RhdHVzICYmICp2YWx1ZSAhPSAwKSB8fCAoc3RhdHVzICYmICp2YWx1ZSA9PSAwKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqICA9PT09PT09PSBjZmdfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemUgdGhlIENGRyBtb2R1bGUncyBwcml2YXRlIHN0YXRlLgorICovCitib29sIGNmZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX3NldF9kZXZfb2JqZWN0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgU3RvcmUgdGhlIERldmljZSBPYmplY3QgaGFuZGxlIGFuZCBkZXZfbm9kZSBwb2ludGVyIGZvciBhIGdpdmVuIGRldm5vZGUuCisgKi8KK2ludCBjZmdfc2V0X2Rldl9vYmplY3Qoc3RydWN0IGNmZ19kZXZub2RlICpkZXZfbm9kZV9vYmosIHUzMiB2YWx1ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJaWYgKCFkcnZfZGF0YXApIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkLCBzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKCFkZXZfbm9kZV9vYmopCisJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwlpZiAoIXN0YXR1cykgeworCQkvKiBTdG9yZSB0aGUgQnJpZGdlIGRldmljZSBvYmplY3QgaW4gdGhlIFJlZ2lzdHJ5ICovCisKKwkJaWYgKCEoc3RyY21wKChjaGFyICopZGV2X25vZGVfb2JqLCAiVElPTUFQMTUxMCIpKSkKKwkJCWRydl9kYXRhcC0+ZGV2X29iamVjdCA9ICh2b2lkICopIHZhbHVlOworCX0KKwlpZiAoc3RhdHVzKQorCQlwcl9lcnIoIiVzOiBGYWlsZWQsIHN0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgPT09PT09PT0gY2ZnX3NldF9vYmplY3QgPT09PT09PT0KKyAqICBQdXJwb3NlOgorICogICAgICBTdG9yZSB0aGUgRHJpdmVyIE9iamVjdCBoYW5kbGUKKyAqLworaW50IGNmZ19zZXRfb2JqZWN0KHUzMiB2YWx1ZSwgdTggZHdfdHlwZSkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZHJ2X2RhdGEgKmRydl9kYXRhcCA9IGRldl9nZXRfZHJ2ZGF0YShicmlkZ2UpOworCisJaWYgKCFkcnZfZGF0YXApCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGR3X3R5cGUpIHsKKwljYXNlIChSRUdfRFJWX09CSkVDVCk6CisJCWRydl9kYXRhcC0+ZHJ2X29iamVjdCA9ICh2b2lkICopdmFsdWU7CisJCXN0YXR1cyA9IDA7CisJCWJyZWFrOworCWNhc2UgKFJFR19NR1JfT0JKRUNUKToKKwkJZHJ2X2RhdGFwLT5tZ3Jfb2JqZWN0ID0gKHZvaWQgKil2YWx1ZTsKKwkJc3RhdHVzID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMpCisJCXByX2VycigiJXM6IEZhaWxlZCwgc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvc2VydmljZXMvbnRmeS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3NlcnZpY2VzL250ZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmVhNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3NlcnZpY2VzL250ZnkuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogbnRmeS5jCisgKgorICogRFNQLUJJT1MgQnJpZGdlIGRyaXZlciBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgVEkgT01BUCBwcm9jZXNzb3JzLgorICoKKyAqIE1hbmFnZSBsaXN0cyBvZiBub3RpZmljYXRpb24gZXZlbnRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaGlzICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL250ZnkuaD4KKworaW50IGRzcF9ub3RpZmllcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJCQkgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCAgbnRmeV9ldmVudCAqbmUgPSBjb250YWluZXJfb2YodGhpcywgc3RydWN0IG50ZnlfZXZlbnQsCisJCQkJCQkJbm90aV9ibG9jayk7CisJaWYgKG5lLT5ldmVudCAmIGV2ZW50KQorCQlzeW5jX3NldF9ldmVudCgmbmUtPnN5bmNfb2JqKTsKKwlyZXR1cm4gTk9USUZZX09LOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvc2VydmljZXMvc2VydmljZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9zZXJ2aWNlcy9zZXJ2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2RkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvc2VydmljZXMvc2VydmljZXMuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogc2VydmljZXMuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBQcm92aWRlIFNFUlZJQ0VTIGxvYWRpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFNQL0JJT1MgQnJpZGdlICovCisjaW5jbHVkZSA8ZHNwYnJpZGdlL2RiZGVmcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2UgJiBEZWJ1ZyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9kYmMuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9TIEFkYXB0YXRpb24gTGF5ZXIgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvY2ZnLmg+CisjaW5jbHVkZSA8ZHNwYnJpZGdlL250ZnkuaD4KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc3luYy5oPgorI2luY2x1ZGUgPGRzcGJyaWRnZS9jbGsuaD4KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoaXMgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2Uvc2VydmljZXMuaD4KKworLyoKKyAqICA9PT09PT09PSBzZXJ2aWNlc19leGl0ID09PT09PT09CisgKiAgUHVycG9zZToKKyAqICAgICAgRGlzY29udGludWUgdXNhZ2Ugb2YgbW9kdWxlOyBmcmVlIHJlc291cmNlcyB3aGVuIHJlZmVyZW5jZSBjb3VudAorICogICAgICByZWFjaGVzIDAuCisgKi8KK3ZvaWQgc2VydmljZXNfZXhpdCh2b2lkKQoreworCWNmZ19leGl0KCk7Cit9CisKKy8qCisgKiAgPT09PT09PT0gc2VydmljZXNfaW5pdCA9PT09PT09PQorICogIFB1cnBvc2U6CisgKiAgICAgIEluaXRpYWxpemVzIFNFUlZJQ0VTIG1vZHVsZXMuCisgKi8KK2Jvb2wgc2VydmljZXNfaW5pdCh2b2lkKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKwlib29sIGZjZmc7CisKKwkvKiBQZXJmb3JtIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIG9mIFNFUlZJQ0VTIG1vZHVsZXMuICovCisJZmNmZyA9IGNmZ19pbml0KCk7CisKKwlyZXQgPSBmY2ZnOworCisJaWYgKCFyZXQpIHsKKwkJaWYgKGZjZmcpCisJCQljZmdfZXhpdCgpOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvc2VydmljZXMvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3NlcnZpY2VzL3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDEwYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3NlcnZpY2VzL3N5bmMuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIHN5bmMuYworICoKKyAqIERTUC1CSU9TIEJyaWRnZSBkcml2ZXIgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIFRJIE9NQVAgcHJvY2Vzc29ycy4KKyAqCisgKiBTeW5jaHJvbml6YXRpb24gc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhvc3QgT1MgKi8KKyNpbmNsdWRlIDxkc3BicmlkZ2UvaG9zdF9vcy5oPgorCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpcyAqLworI2luY2x1ZGUgPGRzcGJyaWRnZS9zeW5jLmg+CisKK0RFRklORV9TUElOTE9DSyhzeW5jX2xvY2spOworCisvKioKKyAqIHN5bmNfc2V0X2V2ZW50KCkgLSBzZXQgb3Igc2lnbmFsIGFuZCBzcGVjaWZpZWQgZXZlbnQKKyAqIEBldmVudDoJRXZlbnQgdG8gYmUgc2V0Li4KKyAqCisgKiBzZXQgdGhlIEBldmVudCwgaWYgdGhlcmUgaXMgYW4gdGhyZWFkIHdhaXRpbmcgZm9yIHRoZSBldmVudAorICogaXQgd2lsbCBiZSB3YWtlbiB1cCwgdGhpcyBmdW5jdGlvbiBvbmx5IHdha2VzIG9uZSB0aHJlYWQuCisgKi8KKwordm9pZCBzeW5jX3NldF9ldmVudChzdHJ1Y3Qgc3luY19vYmplY3QgKmV2ZW50KQoreworCXNwaW5fbG9ja19iaCgmc3luY19sb2NrKTsKKwljb21wbGV0ZSgmZXZlbnQtPmNvbXApOworCWlmIChldmVudC0+bXVsdGlfY29tcCkKKwkJY29tcGxldGUoZXZlbnQtPm11bHRpX2NvbXApOworCXNwaW5fdW5sb2NrX2JoKCZzeW5jX2xvY2spOworfQorCisvKioKKyAqIHN5bmNfd2FpdF9vbl9tdWx0aXBsZV9ldmVudHMoKSAtIHdhaXRzIGZvciBtdWx0aXBsZSBldmVudHMgdG8gYmUgc2V0LgorICogQGV2ZW50czoJQXJyYXkgb2YgZXZlbnRzIHRvIHdhaXQgZm9yIHRoZW0uCisgKiBAY291bnQ6CW51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCisgKiBAdGltZW91dAl0aW1lb3V0IG9uIHdhaXRpbmcgZm9yIHRoZSBldmV0bnMuCisgKiBAcHVfaW5kZXgJaW5kZXggb2YgdGhlIGV2ZW50IHNldC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9zIHdpbGwgd2FpdCB1bnRpbCBhbnkgb2YgdGhlIGFycmF5IGVsZW1lbnQgaXMgc2V0IG9yIHVudGlsCisgKiB0aW1lb3V0LiBJbiBjYXNlIG9mIHN1Y2Nlc3MgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAgYW5kCisgKiBAcHVfaW5kZXggd2lsbCBzdG9yZSB0aGUgaW5kZXggb2YgdGhlIGFycmF5IGVsZW1lbnQgc2V0IG9yIGluIGNhc2UKKyAqIG9mIHRpbWVvdXQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC1FVElNRSBvciBpbiBjYXNlIG9mCisgKiBpbnRlcnJ1cHRpbmcgYnkgYSBzaWduYWwgaXQgd2lsbCByZXR1cm4gLUVQRVJNLgorICovCisKK2ludCBzeW5jX3dhaXRfb25fbXVsdGlwbGVfZXZlbnRzKHN0cnVjdCBzeW5jX29iamVjdCAqKmV2ZW50cywKKwkJCQkgICAgIHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCB0aW1lb3V0LAorCQkJCSAgICAgdW5zaWduZWQgKmluZGV4KQoreworCXVuc2lnbmVkIGk7CisJaW50IHN0YXR1cyA9IC1FUEVSTTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBtX2NvbXA7CisKKwlpbml0X2NvbXBsZXRpb24oJm1fY29tcCk7CisKKwlpZiAoU1lOQ19JTkZJTklURSA9PSB0aW1lb3V0KQorCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisKKwlzcGluX2xvY2tfYmgoJnN5bmNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGNvbXBsZXRpb25fZG9uZSgmZXZlbnRzW2ldLT5jb21wKSkgeworCQkJSU5JVF9DT01QTEVUSU9OKGV2ZW50c1tpXS0+Y29tcCk7CisJCQkqaW5kZXggPSBpOworCQkJc3Bpbl91bmxvY2tfYmgoJnN5bmNfbG9jayk7CisJCQlzdGF0dXMgPSAwOworCQkJZ290byBmdW5jX2VuZDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlldmVudHNbaV0tPm11bHRpX2NvbXAgPSAmbV9jb21wOworCisJc3Bpbl91bmxvY2tfYmgoJnN5bmNfbG9jayk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZtX2NvbXAsCisJCQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKQorCQlzdGF0dXMgPSAtRVRJTUU7CisKKwlzcGluX2xvY2tfYmgoJnN5bmNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGNvbXBsZXRpb25fZG9uZSgmZXZlbnRzW2ldLT5jb21wKSkgeworCQkJSU5JVF9DT01QTEVUSU9OKGV2ZW50c1tpXS0+Y29tcCk7CisJCQkqaW5kZXggPSBpOworCQkJc3RhdHVzID0gMDsKKwkJfQorCQlldmVudHNbaV0tPm11bHRpX2NvbXAgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19iaCgmc3luY19sb2NrKTsKK2Z1bmNfZW5kOgorCXJldHVybiBzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvS2NvbmZpZwppbmRleCAzNjU3ZTMzLi5jNzI1MzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9LY29uZmlnCkBAIC0yNiw4ICsyNiw4IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdG02MDAwLWFsc2EuCiAKIGNvbmZpZyBWSURFT19UTTYwMDBfRFZCCi0JYm9vbCAiRFZCIFN1cHBvcnQgZm9yIHRtNjAwMCBiYXNlZCBUViBjYXJkcyIKLQlkZXBlbmRzIG9uIFZJREVPX1RNNjAwMCAmJiBEVkJfQ09SRSAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiRFZCIFN1cHBvcnQgZm9yIHRtNjAwMCBiYXNlZCBUViBjYXJkcyIKKwlkZXBlbmRzIG9uIFZJREVPX1RNNjAwMCAmJiBEVkJfQ09SRSAmJiBVU0IgJiYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IERWQl9aTDEwMzUzCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQiBjYXJkcyBiYXNlZCBvbiB0aGUgdG01NjAwL3RtNjAwMCBjaGlwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvTWFrZWZpbGUKaW5kZXggOTMzNzBmYy4uNzdlMDZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL01ha2VmaWxlCkBAIC0yLDE0ICsyLDEyIEBACiAJCSAgIHRtNjAwMC1jb3JlLm8gIFwKIAkJICAgdG02MDAwLWkyYy5vICAgXAogCQkgICB0bTYwMDAtdmlkZW8ubyBcCi0JCSAgIHRtNjAwMC1zdGRzLm8KLQotaWZlcSAoJChDT05GSUdfVklERU9fVE02MDAwX0RWQikseSkKLXRtNjAwMC1vYmpzICs9IHRtNjAwMC1kdmIubwotZW5kaWYKKwkJICAgdG02MDAwLXN0ZHMubyBcCisJCSAgIHRtNjAwMC1pbnB1dC5vCiAKIG9iai0kKENPTkZJR19WSURFT19UTTYwMDApICs9IHRtNjAwMC5vCiBvYmotJChDT05GSUdfVklERU9fVE02MDAwX0FMU0EpICs9IHRtNjAwMC1hbHNhLm8KK29iai0kKENPTkZJR19WSURFT19UTTYwMDBfRFZCKSArPSB0bTYwMDAtZHZiLm8KIAogRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYwppbmRleCAyNzNlMjZlLi4wODcxMzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1hbHNhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtYWxzYS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTM2LDM0ICszNywxMSBAQAogCX0gd2hpbGUgKDApCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRGF0YSB0eXBlIGRlY2xhcmF0aW9ucyAtIENhbiBiZSBtb2RlZCB0byBhIGhlYWRlciBmaWxlIGxhdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHNuZF90bTYwMDBfY2FyZCB7Ci0Jc3RydWN0IHNuZF9jYXJkICAgICAgICAgICAgKmNhcmQ7Ci0KLQlzcGlubG9ja190ICAgICAgICAgICAgICAgICByZWdfbG9jazsKLQotCWF0b21pY190CQkgICBjb3VudDsKLQotCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHBlcmlvZF9zaXplOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG51bV9wZXJpb2RzOwotCi0Jc3RydWN0IHRtNjAwMF9jb3JlICAgICAgICAgKmNvcmU7Ci0Jc3RydWN0IHRtNjAwMF9idWZmZXIgICAgICAgKmJ1ZjsKLQotCWludAkJCSAgIGJ1ZnNpemU7Ci0KLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkJCU1vZHVsZSBnbG9iYWwgc3RhdGljIHZhcnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLwotc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOyAgICAgICAvKiBJRCBmb3IgdGhpcyBjYXJkICovCisKIHN0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IHsxLCBbMSAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07CiAKIG1vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOwpAQCAtMTAwLDExICs3OCwxNSBAQAogCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7CiAJaW50IHZhbDsKIAorCWRwcmludGsoMSwgIlN0YXJ0aW5nIGF1ZGlvIERNQVxuIik7CisKIAkvKiBFbmFibGVzIGF1ZGlvICovCiAJdmFsID0gdG02MDAwX2dldF9yZWcoY29yZSwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfVklERU9fSUYsIDB4MCk7CiAJdmFsIHw9IDB4MjA7CiAJdG02MDAwX3NldF9yZWcoY29yZSwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfVklERU9fSUYsIHZhbCk7CiAKKwl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoY29yZSwgNDgwMDApOworCiAJdG02MDAwX3NldF9yZWcoY29yZSwgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQsIDB4ODApOwogCiAJcmV0dXJuIDA7CkBAIC0xMjksMTkgKzExMSwzOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzcF9idWZmZXJfZnJlZShzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwKQorc3RhdGljIHZvaWQgZHNwX2J1ZmZlcl9mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCUJVR19PTighY2hpcC0+YnVmc2l6ZSk7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAogCWRwcmludGsoMiwgIkZyZWVpbmcgYnVmZmVyXG4iKTsKIAotCS8qIEZJWE1FOiBGcmVlcyBidWZmZXIgKi8KLQotCWNoaXAtPmJ1ZnNpemUgPSAwOwotCi0gICAgICAgcmV0dXJuIDA7CisJdmZyZWUoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSk7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IE5VTEw7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSAwOwogfQogCitzdGF0aWMgaW50IGRzcF9idWZmZXJfYWxsb2Moc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBzaXplKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlkcHJpbnRrKDIsICJBbGxvY2F0aW5nIGJ1ZmZlclxuIik7CisKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgeworCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPiBzaXplKQorCQkJcmV0dXJuIDA7CisJCWRzcF9idWZmZXJfZnJlZShzdWJzdHJlYW0pOworCX0KKworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSB2bWFsbG9jKHNpemUpOworCWlmICghc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJCUFMU0EgUENNIEludGVyZmFjZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTgsMTYgKzE2MCwxNiBAQAogCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElELAogCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCiAKLQkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkucmF0ZV9taW4gPQkJNDQxMDAsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCS5yYXRlX21pbiA9CQk0ODAwMCwKIAkucmF0ZV9tYXggPQkJNDgwMDAsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCi0JLnBlcmlvZF9ieXRlc19taW4gPSBERUZBVUxUX0ZJRk9fU0laRS80LAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gREVGQVVMVF9GSUZPX1NJWkUvNCwKKwkucGVyaW9kX2J5dGVzX21pbiA9IDYyNzIwLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gNjI3MjAsCiAJLnBlcmlvZHNfbWluID0gMSwKIAkucGVyaW9kc19tYXggPSAxMDI0LAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gKDEwMjQqMTAyNCksCisJLmJ1ZmZlcl9ieXRlc19tYXggPSA2MjcyMCAqIDgsCiB9OwogCiAvKgpAQCAtMjAyLDI5ICsyMDQsNjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0bTYwMDBfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IGNvcmUtPmFkZXY7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjaGlwLT5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOworCXVuc2lnbmVkIGludCBzdHJpZGUsIGJ1Zl9wb3M7CisKKwlpZiAoIXNpemUgfHwgIXN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWlmICghcnVudGltZSB8fCAhcnVudGltZS0+ZG1hX2FyZWEpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmX3BvcyA9IGNoaXAtPmJ1Zl9wb3M7CisJc3RyaWRlID0gcnVudGltZS0+ZnJhbWVfYml0cyA+PiAzOworCisJZHByaW50aygxLCAiQ29weWluZyAlZCBieXRlcyBhdCAlcFslZF0gLSBidWYgc2l6ZT0lZCB4ICVkXG4iLCBzaXplLAorCQlydW50aW1lLT5kbWFfYXJlYSwgYnVmX3BvcywKKwkJKHVuc2lnbmVkIGludClydW50aW1lLT5idWZmZXJfc2l6ZSwgc3RyaWRlKTsKKworCWlmIChidWZfcG9zICsgc2l6ZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkgeworCQl1bnNpZ25lZCBpbnQgY250ID0gcnVudGltZS0+YnVmZmVyX3NpemUgKiBzdHJpZGUgLSBidWZfcG9zOworCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBidWZfcG9zLCBidWYsIGNudCk7CisJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgYnVmICsgY250LCBzaXplIC0gY250KTsKKwl9IGVsc2UKKwkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgYnVmX3BvcywgYnVmLCBzaXplKTsKKworCWNoaXAtPmJ1Zl9wb3MgKz0gc2l6ZTsKKwlpZiAoY2hpcC0+YnVmX3BvcyA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkKKwkJY2hpcC0+YnVmX3BvcyAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKKworCWNoaXAtPnBlcmlvZF9wb3MgKz0gc2l6ZTsKKwlpZiAoY2hpcC0+cGVyaW9kX3BvcyA+PSBydW50aW1lLT5wZXJpb2Rfc2l6ZSkgeworCQljaGlwLT5wZXJpb2RfcG9zIC09IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCQlwZXJpb2RfZWxhcHNlZCA9IDE7CisJfQorCisJaWYgKHBlcmlvZF9lbGFwc2VkKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIGh3X3BhcmFtcyBjYWxsYmFjawogICovCiBzdGF0aWMgaW50IHNuZF90bTYwMDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgc2l6ZSwgcmM7CiAKLQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgewotCQlkc3BfYnVmZmVyX2ZyZWUoY2hpcCk7Ci0JCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBOVUxMOwotCX0KKwlzaXplID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpICogcGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKTsKIAotCWNoaXAtPnBlcmlvZF9zaXplID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpOwotCWNoaXAtPm51bV9wZXJpb2RzID0gcGFyYW1zX3BlcmlvZHMoaHdfcGFyYW1zKTsKLQljaGlwLT5idWZzaXplID0gY2hpcC0+cGVyaW9kX3NpemUgKiBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpOwotCi0JQlVHX09OKCFjaGlwLT5idWZzaXplKTsKLQotCWRwcmludGsoMSwgIlNldHRpbmcgYnVmZmVyXG4iKTsKLQotCS8qIEZJWE1FOiBBbGxvY2F0ZSBidWZmZXIgZm9yIGF1ZGlvICovCi0KKwlyYyA9IGRzcF9idWZmZXJfYWxsb2Moc3Vic3RyZWFtLCBzaXplKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNCwxMyArMjcxLDkgQEAKICAqLwogc3RhdGljIGludCBzbmRfdG02MDAwX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0KIAlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCi0JaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpIHsKLQkJZHNwX2J1ZmZlcl9mcmVlKGNoaXApOwotCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKLQl9CisJX3RtNjAwMF9zdG9wX2F1ZGlvX2RtYShjaGlwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjUwLDYgKzI4MywxMSBAQAogICovCiBzdGF0aWMgaW50IHNuZF90bTYwMDBfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJY2hpcC0+YnVmX3BvcyA9IDA7CisJY2hpcC0+cGVyaW9kX3BvcyA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg3LDEyICszMjUsOCBAQAogc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF90bTYwMDBfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JdTE2IGNvdW50OwogCi0JY291bnQgPSBhdG9taWNfcmVhZCgmY2hpcC0+Y291bnQpOwotCi0JcmV0dXJuIHJ1bnRpbWUtPnBlcmlvZF9zaXplICogKGNvdW50ICYgKHJ1bnRpbWUtPnBlcmlvZHMtMSkpOworCXJldHVybiBjaGlwLT5idWZfcG9zOwogfQogCiAvKgpAQCAtMzEyLDIxICszNDYsNiBAQAogLyoKICAqIGNyZWF0ZSBhIFBDTSBkZXZpY2UKICAqLwotc3RhdGljIGludCBfX2RldmluaXQgc25kX3RtNjAwMF9wY20oc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCwKLQkJCQkgICAgaW50IGRldmljZSwgY2hhciAqbmFtZSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0KLQllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBkZXZpY2UsIDAsIDEsICZwY20pOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKLQlzdHJjcHkocGNtLT5uYW1lLCBuYW1lKTsKLQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfdG02MDAwX3BjbV9vcHMpOwotCi0JcmV0dXJuIDA7Ci19CiAKIC8qIEZJWE1FOiBDb250cm9sIGludGVyZmFjZSAtIEhvdyB0byBjb250cm9sIHZvbHVtZS9tdXRlPyAqLwogCkBAIC0zMzcsMjcgKzM1Niw0MSBAQAogLyoKICAqIEFsc2EgQ29uc3RydWN0b3IgLSBDb21wb25lbnQgcHJvYmUKICAqLwotCi1pbnQgdG02MDAwX2F1ZGlvX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBpZHgpCitpbnQgdG02MDAwX2F1ZGlvX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCiB7Ci0Jc3RydWN0IHNuZF9jYXJkICAgICAgICAgKmNhcmQ7Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAgKmNoaXA7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgcmMsIGxlbjsKLQljaGFyICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRbMTRdOworCXN0cnVjdCBzbmRfY2FyZAkJKmNhcmQ7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZAkqY2hpcDsKKwlpbnQJCQlyYzsKKwlzdGF0aWMgaW50CQlkZXZucjsKKwljaGFyCQkJY29tcG9uZW50WzE0XTsKKwlzdHJ1Y3Qgc25kX3BjbQkJKnBjbTsKIAotCWlmIChpZHggPj0gU05EUlZfQ0FSRFMpCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKGRldm5yID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghZW5hYmxlW2lkeF0pCisJaWYgKCFlbmFibGVbZGV2bnJdKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJcmMgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAidG02MDAwIiwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAocmMgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgY2FyZCBpbnN0YW5jZSAlZFxuIiwgaWR4KTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBjYXJkIGluc3RhbmNlICVkXG4iLCBkZXZucik7CiAJCXJldHVybiByYzsKIAl9CisJc3RyY3B5KGNhcmQtPmRyaXZlciwgInRtNjAwMC1hbHNhIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlRNNTYwMC82MHgwIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIlRNNTYwMC82MHgwIEF1ZGlvIGF0IGJ1cyAlZCBkZXZpY2UgJWQiLAorCQlkZXYtPnVkZXYtPmJ1cy0+YnVzbnVtLCBkZXYtPnVkZXYtPmRldm51bSk7CiAKLQljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlzcHJpbnRmKGNvbXBvbmVudCwgIlVTQiUwNHg6JTA0eCIsCisJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKwlzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21wb25lbnQpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+dWRldi0+ZGV2KTsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlwKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKQEAgLTM2NSw0NSArMzk4LDI0IEBACiAKIAljaGlwLT5jb3JlID0gZGV2OwogCWNoaXAtPmNhcmQgPSBjYXJkOworCWRldi0+YWRldiA9IGNoaXA7CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKIAotCXN0cmNweShjYXJkLT5kcml2ZXIsICJ0bTYwMDAtYWxzYSIpOwotCXNwcmludGYoY29tcG9uZW50LCAiVVNCJTA0eDolMDR4IiwKLQkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwotCXNuZF9jb21wb25lbnRfYWRkKGNhcmQsIGNvbXBvbmVudCk7Ci0KLQlpZiAoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIpCi0JCWxlbiA9IHVzYl9zdHJpbmcoZGV2LT51ZGV2LAotCQkJCSBkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaU1hbnVmYWN0dXJlciwKLQkJCQkgY2FyZC0+bG9uZ25hbWUsIHNpemVvZihjYXJkLT5sb25nbmFtZSkpOwotCWVsc2UKLQkJbGVuID0gMDsKLQotCWlmIChsZW4gPiAwKQotCQlzdHJsY2F0KGNhcmQtPmxvbmduYW1lLCAiICIsIHNpemVvZihjYXJkLT5sb25nbmFtZSkpOwotCi0Jc3RybGNhdChjYXJkLT5sb25nbmFtZSwgY2FyZC0+c2hvcnRuYW1lLCBzaXplb2YoY2FyZC0+bG9uZ25hbWUpKTsKLQotCWxlbiA9IHN0cmxjYXQoY2FyZC0+bG9uZ25hbWUsICIgYXQgIiwgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSk7Ci0KLQlpZiAobGVuIDwgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSkKLQkJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcmQtPmxvbmduYW1lICsgbGVuLAotCQkJICAgICAgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSAtIGxlbik7Ci0KLQlzdHJsY2F0KGNhcmQtPmxvbmduYW1lLAotCQlkZXYtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9MT1cgPyAiLCBsb3cgc3BlZWQiIDoKLQkJZGV2LT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCA/ICIsIGZ1bGwgc3BlZWQiIDoKLQkJCQkJCQkgICAiLCBoaWdoIHNwZWVkIiwKLQkJc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSk7Ci0KLQlyYyA9IHNuZF90bTYwMDBfcGNtKGNoaXAsIDAsICJ0bTYwMDAgRGlnaXRhbCIpOworCXJjID0gc25kX3BjbV9uZXcoY2FyZCwgIlRNNjAwMCBBdWRpbyIsIDAsIDAsIDEsICZwY20pOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZXJyb3I7CiAKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlzdHJjcHkocGNtLT5uYW1lLCAiVHJpZGVudCBUTTU2MDAvNjB4MCIpOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3RtNjAwMF9wY21fb3BzKTsKKwogCXJjID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnJvcjsKIAorCWRwcmludGsoMSwiUmVnaXN0ZXJlZCBhdWRpbyBkcml2ZXIgZm9yICVzXG4iLCBjYXJkLT5sb25nbmFtZSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNDE0LDE0ICs0MjYsMzEgQEAKIAogc3RhdGljIGludCB0bTYwMDBfYXVkaW9fZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKIHsKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkCSpjaGlwID0gZGV2LT5hZGV2OworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gMDsKKworCWlmICghY2hpcC0+Y2FyZCkKKwkJcmV0dXJuIDA7CisKKwlzbmRfY2FyZF9mcmVlKGNoaXAtPmNhcmQpOworCWNoaXAtPmNhcmQgPSBOVUxMOworCWtmcmVlKGNoaXApOworCWRldi0+YWRldiA9IE5VTEw7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RydWN0IHRtNjAwMF9vcHMgYXVkaW9fb3BzID0gewotCS5pZAk9IFRNNjAwMF9BVURJTywKKwkudHlwZQk9IFRNNjAwMF9BVURJTywKIAkubmFtZQk9ICJUTTYwMDAgQXVkaW8gRXh0ZW5zaW9uIiwKIAkuaW5pdAk9IHRtNjAwMF9hdWRpb19pbml0LAogCS5maW5pCT0gdG02MDAwX2F1ZGlvX2ZpbmksCisJLmZpbGxidWYgPSB0bTYwMDBfZmlsbGJ1ZiwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRtNjAwMF9hbHNhX3JlZ2lzdGVyKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jYXJkcy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY2FyZHMuYwppbmRleCA2YTlhZTQwLi45ZDA5MWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWNhcmRzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL3R2YXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9pMmMtYWRkci5oPgorI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgogCiAjaW5jbHVkZSAidG02MDAwLmgiCiAjaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKQEAgLTY5LDYgKzcwLDggQEAKIAlpbnQgICAgICAgICAgICAgZGVtb2RfYWRkcjsgICAgIC8qIGRlbW9kdWxhdG9yIGFkZHJlc3MgKi8KIAogCXN0cnVjdCB0bTYwMDBfZ3BpbyBncGlvOworCisJY2hhcgkJKmlyX2NvZGVzOwogfTsKIAogc3RydWN0IHRtNjAwMF9ib2FyZCB0bTYwMDBfYm9hcmRzW10gPSB7CkBAIC0yNzYsNiArMjc5LDcgQEAKIAkJCS5kdmJfbGVkCT0gVE02MDEwX0dQSU9fNSwKIAkJCS5pcgkJPSBUTTYwMTBfR1BJT18wLAogCQl9LAorCQkuaXJfY29kZXMgPSBSQ19NQVBfTkVDX1RFUlJBVEVDX0NJTkVSR1lfWFMsCiAJfSwKIAlbVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDFdID0gewogCQkubmFtZSAgICAgICAgID0gIlR3aW5oYW4gVFU1MDEoNzA0RDEpIiwKQEAgLTM0Nyw3ICszNTEsNyBAQAogCX0KIAlyZXR1cm4gKHJjKTsKIH0KLQorRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3hjNTAwMF9jYWxsYmFjayk7CiAKIC8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzIwMjggKi8KIApAQCAtMzYxLDYgKzM2NSw4IEBACiAKIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIAljYXNlIFhDMjAyOF9SRVNFVF9DTEs6CisJCXRtNjAwMF9pcl93YWl0KGRldiwgMCk7CisKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULAogCQkJCQkweDAyLCBhcmcpOwogCQltc2xlZXAoMTApOwpAQCAtNDEwLDEzICs0MTYsMTQgQEAKIAkJCQltc2xlZXAoMTMwKTsKIAkJCQlicmVhazsKIAkJCX0KKworCQkJdG02MDAwX2lyX3dhaXQoZGV2LCAxKTsKIAkJCWJyZWFrOwogCQljYXNlIDE6CiAJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsCiAJCQkJCQkweDAyLCAweDAxKTsKIAkJCW1zbGVlcCgxMCk7CiAJCQlicmVhazsKLQogCQljYXNlIDI6CiAJCQlyYyA9IHRtNjAwMF9pMmNfcmVzZXQoZGV2LCAxMDApOwogCQkJYnJlYWs7CkBAIC00MjQsNiArNDMxLDcgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3R1bmVyX2NhbGxiYWNrKTsKIAogaW50IHRtNjAwMF9jYXJkc19zZXR1cChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKIHsKQEAgLTYzNSw2ICs2NDMsOCBAQAogCiAJZGV2LT5ncGlvID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5ncGlvOwogCisJZGV2LT5pcl9jb2RlcyA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0uaXJfY29kZXM7CisKIAlkZXYtPmRlbW9kX2FkZHIgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmRlbW9kX2FkZHI7CiAKIAlkZXYtPmNhcHMgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmNhcHM7CkBAIC02ODEsMzEgKzY5MSwxMyBAQAogCQlnb3RvIGVycjsKIAogCXRtNjAwMF9hZGRfaW50b19kZXZsaXN0KGRldik7Ci0KIAl0bTYwMDBfaW5pdF9leHRlbnNpb24oZGV2KTsKIAotCWlmIChkZXYtPmNhcHMuaGFzX2R2YikgewotCQlkZXYtPmR2YiA9IGt6YWxsb2Moc2l6ZW9mKCooZGV2LT5kdmIpKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZGV2LT5kdmIpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyMjsKLQkJfQorCXRtNjAwMF9pcl9pbml0KGRldik7CiAKLSNpZmRlZiBDT05GSUdfVklERU9fVE02MDAwX0RWQgotCQlyYyA9IHRtNjAwMF9kdmJfcmVnaXN0ZXIoZGV2KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJa2ZyZWUoZGV2LT5kdmIpOwotCQkJZGV2LT5kdmIgPSBOVUxMOwotCQkJZ290byBlcnIyOwotCQl9Ci0jZW5kaWYKLQl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiAwOwogCi1lcnIyOgotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOwotCiBlcnI6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiByYzsKQEAgLTcyNCw3ICs3MTYsNyBAQAogCXVuc2lnbmVkIGludCBzaXplID0gdG1wICYgMHg3ZmY7CiAKIAlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCi0JCXNpemUgPSBzaXplICogaGJfbXVsdCAodG1wKTsKKwkJc2l6ZSA9IHNpemUgKiBoYl9tdWx0KHRtcCk7CiAKIAlpZiAoc2l6ZSA+IHRtX2VwLT5tYXhzaXplKSB7CiAJCXRtX2VwLT5lbmRwID0gY3Vycl9lOwpAQCAtODQ4LDYgKzg0MCwxOSBAQAogCQkJCQkJCSAmZGV2LT5pc29jX291dCk7CiAJCQkJfQogCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCQkJaWYgKCFkaXJfb3V0KSB7CisJCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAorCQkJCQkJCSZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJIklOVCBJTiIsIGUsCisJCQkJCQkJJmRldi0+aW50X2luKTsKKwkJCQl9IGVsc2UgeworCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKKwkJCQkJCQkmaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLAorCQkJCQkJCSJJTlQgT1VUIiwgZSwKKwkJCQkJCQkmZGV2LT5pbnRfb3V0KTsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CkBAIC05MDYsMTIgKzkxMSw3IEBACiAKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCi0jaWZkZWYgQ09ORklHX1ZJREVPX1RNNjAwMF9EVkIKLQlpZiAoZGV2LT5kdmIpIHsKLQkJdG02MDAwX2R2Yl91bnJlZ2lzdGVyKGRldik7Ci0JCWtmcmVlKGRldi0+ZHZiKTsKLQl9Ci0jZW5kaWYKKwl0bTYwMDBfaXJfZmluaShkZXYpOwogCiAJaWYgKGRldi0+Z3Bpby5wb3dlcl9sZWQpIHsKIAkJc3dpdGNoIChkZXYtPm1vZGVsKSB7CkBAIC05NDIsOCArOTQyLDggQEAKIAogCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CiAKLQl0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChkZXYpOwogCXRtNjAwMF9jbG9zZV9leHRlbnNpb24oZGV2KTsKKwl0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChkZXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCWtmcmVlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jb3JlLmMKaW5kZXggYzM2OTBlMy4uY2RlZDQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWNvcmUuYwpAQCAtMzIsNjYgKzMyLDY0IEBACiAKICNkZWZpbmUgVVNCX1RJTUVPVVQJNSpIWiAvKiBtcyAqLwogCi1pbnQgdG02MDAwX3JlYWRfd3JpdGVfdXNiIChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxX3R5cGUsIHU4IHJlcSwKLQkJCSAgIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1OCAqYnVmLCB1MTYgbGVuKQoraW50IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxX3R5cGUsIHU4IHJlcSwKKwkJCSAgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpidWYsIHUxNiBsZW4pCiB7CiAJaW50ICAgICAgICAgIHJldCwgaTsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKLQlzdGF0aWMgaW50ICAgaW5pPTAsIGxhc3Q9MCwgbj0wOwotCXU4CSAgICAgKmRhdGE9TlVMTDsKKwlzdGF0aWMgaW50ICAgaW5pID0gMCwgbGFzdCA9IDAsIG4gPSAwOworCXU4CSAgICAgKmRhdGEgPSBOVUxMOwogCiAJaWYgKGxlbikKIAkJZGF0YSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAogCiAJaWYgKHJlcV90eXBlICYgVVNCX0RJUl9JTikKLQkJcGlwZT11c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKTsKKwkJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApOwogCWVsc2UgewotCQlwaXBlPXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApOworCQlwaXBlID0gdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCk7CiAJCW1lbWNweShkYXRhLCBidWYsIGxlbik7CiAJfQogCiAJaWYgKHRtNjAwMF9kZWJ1ZyAmIFY0TDJfREVCVUdfSTJDKSB7CiAJCWlmICghaW5pKQotCQkJbGFzdD1pbmk9amlmZmllczsKKwkJCWxhc3QgPSBpbmkgPSBqaWZmaWVzOwogCiAJCXByaW50aygiJTA2aSAoZGV2ICVwLCBwaXBlICUwOHgpOiAiLCBuLCBkZXYtPnVkZXYsIHBpcGUpOwogCi0JCXByaW50ayggIiVzOiAlMDZ1IG1zICUwNnUgbXMgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIsCi0JCQkocmVxX3R5cGUgJiBVU0JfRElSX0lOKT8iIElOIjoiT1VUIiwKKwkJcHJpbnRrKCIlczogJTA2dSBtcyAlMDZ1IG1zICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAiLAorCQkJKHJlcV90eXBlICYgVVNCX0RJUl9JTikgPyAiIElOIiA6ICJPVVQiLAogCQkJamlmZmllc190b19tc2VjcyhqaWZmaWVzLWxhc3QpLAogCQkJamlmZmllc190b19tc2VjcyhqaWZmaWVzLWluaSksCi0JCQlyZXFfdHlwZSwgcmVxLHZhbHVlJjB4ZmYsdmFsdWU+PjgsIGluZGV4JjB4ZmYsIGluZGV4Pj44LAotCQkJbGVuJjB4ZmYsIGxlbj4+OCk7Ci0JCWxhc3Q9amlmZmllczsKKwkJCXJlcV90eXBlLCByZXEsIHZhbHVlJjB4ZmYsIHZhbHVlPj44LCBpbmRleCYweGZmLAorCQkJaW5kZXg+PjgsIGxlbiYweGZmLCBsZW4+PjgpOworCQlsYXN0ID0gamlmZmllczsKIAkJbisrOwogCi0JCWlmICggIShyZXFfdHlwZSAmIFVTQl9ESVJfSU4pICkgeworCQlpZiAoIShyZXFfdHlwZSAmIFVTQl9ESVJfSU4pKSB7CiAJCQlwcmludGsoIj4+PiAiKTsKLQkJCWZvciAoaT0wO2k8bGVuO2krKykgewotCQkJCXByaW50aygiICUwMngiLGJ1ZltpXSk7Ci0JCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZltpXSk7CiAJCXByaW50aygiXG4iKTsKIAkJfQogCX0KIAotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHBpcGUsIHJlcSwgcmVxX3R5cGUsIHZhbHVlLCBpbmRleCwgZGF0YSwKLQkJCSAgICAgIGxlbiwgVVNCX1RJTUVPVVQpOworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHBpcGUsIHJlcSwgcmVxX3R5cGUsIHZhbHVlLCBpbmRleCwKKwkJCSAgICAgIGRhdGEsIGxlbiwgVVNCX1RJTUVPVVQpOwogCiAJaWYgKHJlcV90eXBlICYgIFVTQl9ESVJfSU4pCiAJCW1lbWNweShidWYsIGRhdGEsIGxlbik7CiAKIAlpZiAodG02MDAwX2RlYnVnICYgVjRMMl9ERUJVR19JMkMpIHsKLQkJaWYgKHJldDwwKSB7CisJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAocmVxX3R5cGUgJiAgVVNCX0RJUl9JTikKLQkJCQlwcmludGsoIjw8PCAobGVuPSVkKVxuIixsZW4pOworCQkJCXByaW50aygiPDw8IChsZW49JWQpXG4iLCBsZW4pOwogCiAJCQlwcmludGsoIiVzOiBFcnJvciAjJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKIAkJfSBlbHNlIGlmIChyZXFfdHlwZSAmICBVU0JfRElSX0lOKSB7CiAJCQlwcmludGsoIjw8PCAiKTsKLQkJCWZvciAoaT0wO2k8bGVuO2krKykgewotCQkJCXByaW50aygiICUwMngiLGJ1ZltpXSk7Ci0JCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZltpXSk7CiAJCQlwcmludGsoIlxuIik7CiAJCX0KIAl9CkBAIC0xMDMsNTIgKzEwMSw1MiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB0bTYwMDBfc2V0X3JlZyAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCitpbnQgdG02MDAwX3NldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCiB7CiAJcmV0dXJuCi0JCXRtNjAwMF9yZWFkX3dyaXRlX3VzYiAoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwKLQkJCQkgICAgICAgcmVxLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDApOworCQl0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwKKwkJCQkgICAgICByZXEsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfc2V0X3JlZyk7CiAKLWludCB0bTYwMDBfZ2V0X3JlZyAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCitpbnQgdG02MDAwX2dldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCiB7CiAJaW50IHJjOwogCXU4IGJ1ZlsxXTsKIAotCXJjPXRtNjAwMF9yZWFkX3dyaXRlX3VzYiAoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLCByZXEsCi0JCQkJICAgICAgIHZhbHVlLCBpbmRleCwgYnVmLCAxKTsKKwlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKKwkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDEpOwogCi0JaWYgKHJjPDApCisJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCiAJcmV0dXJuICpidWY7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfZ2V0X3JlZyk7CiAKLWludCB0bTYwMDBfZ2V0X3JlZzE2IChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKK2ludCB0bTYwMDBfZ2V0X3JlZzE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQogewogCWludCByYzsKIAl1OCBidWZbMl07CiAKLQlyYz10bTYwMDBfcmVhZF93cml0ZV91c2IgKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAotCQkJCSAgICAgICB2YWx1ZSwgaW5kZXgsIGJ1ZiwgMik7CisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLCByZXEsCisJCQkJCXZhbHVlLCBpbmRleCwgYnVmLCAyKTsKIAotCWlmIChyYzwwKQorCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAogCXJldHVybiBidWZbMV18YnVmWzBdPDw4OwogfQogCi1pbnQgdG02MDAwX2dldF9yZWczMiAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCitpbnQgdG02MDAwX2dldF9yZWczMihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKIHsKIAlpbnQgcmM7CiAJdTggYnVmWzRdOwogCi0JcmM9dG02MDAwX3JlYWRfd3JpdGVfdXNiIChkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKLQkJCQkgICAgICAgdmFsdWUsIGluZGV4LCBidWYsIDQpOworCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAorCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgNCk7CiAKLQlpZiAocmM8MCkKKwlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKIAlyZXR1cm4gYnVmWzNdIHwgYnVmWzJdIDw8IDggfCBidWZbMV0gPDwgMTYgfCBidWZbMF0gPDwgMjQ7CkBAIC0xODgsNyArMTg2LDcgQEAKIAl9CiB9CiAKLWludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZSAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCitpbnQgdG02MDAwX2luaXRfYW5hbG9nX21vZGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCiB7CiAJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CiAJCWludCB2YWw7CkBAIC0yOTQsMTIgKzI5MiwxMCBAQAogCQkvKiBFbmFibGVzIHNvZnQgcmVzZXQgKi8KIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxKTsKIAotCQlpZiAoZGV2LT5zY2FsZXIpIHsKKwkJaWYgKGRldi0+c2NhbGVyKQogCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMwX0FDVElWRV9WSURFT19TT1VSQ0UsIDB4MjApOwotCQl9IGVsc2UgewotCQkJLyogRW5hYmxlIEhmaWx0ZXIgYW5kIGRpc2FibGUgVFMgRHJvcCBlcnIgKi8KKwkJZWxzZQkvKiBFbmFibGUgSGZpbHRlciBhbmQgZGlzYWJsZSBUUyBEcm9wIGVyciAqLwogCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMwX0FDVElWRV9WSURFT19TT1VSQ0UsIDB4ODApOwotCQl9CiAKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4ODgpOwogCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX1NFTCwgMHgyMyk7CkBAIC0zMzIsMTMgKzMyOCwxMyBAQAogCS8qRklYTUU6IEhhY2shISEgKi8KIAlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgZjsKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCWYuZnJlcXVlbmN5PWRldi0+ZnJlcTsKKwlmLmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKIAl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfZnJlcXVlbmN5LCAmZik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCiAJbXNsZWVwKDEwMCk7Ci0JdG02MDAwX3NldF9zdGFuZGFyZCAoZGV2LCAmZGV2LT5ub3JtKTsKLQl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUgKGRldiw0ODAwMCk7CisJdG02MDAwX3NldF9zdGFuZGFyZChkZXYsICZkZXYtPm5vcm0pOworCXRtNjAwMF9zZXRfYXVkaW9fYml0cmF0ZShkZXYsIDQ4MDAwKTsKIAogCS8qIHN3aXRjaCBkdmIgbGVkIG9mZiAqLwogCWlmIChkZXYtPmdwaW8uZHZiX2xlZCkgewpAQCAtMzQ5LDcgKzM0NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB0bTYwMDBfaW5pdF9kaWdpdGFsX21vZGUgKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoraW50IHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKIHsKIAlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKIAkJaW50IHZhbDsKQEAgLTM2NiwxMCArMzYyLDggQEAKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIDB4ZmMpOwogCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgMHhmZik7CiAJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JGMV9BQURDX1BPV0VSX0RPV04sIDB4ZmUpOwotCQl0bTYwMDBfcmVhZF93cml0ZV91c2IgKGRldiwgMHhjMCwgMHgwZSwgMHgwMGMyLCAweDAwMDgsIGJ1ZiwgMik7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJidWYgJSN4ICUjeCBcbiIsIGJ1ZlswXSwgYnVmWzFdKTsKLQotCisJCXRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIDB4YzAsIDB4MGUsIDB4MDBjMiwgMHgwMDA4LCBidWYsIDIpOworCQlwcmludGsoS0VSTl9JTkZPImJ1ZiAlI3ggJSN4XG4iLCBidWZbMF0sIGJ1ZlsxXSk7CiAJfSBlbHNlICB7CiAJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VULCAweDA4KTsKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDApOwpAQCAtMzc3LDcgKzM3MSw3IEBACiAJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQwLCAweDA4KTsKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkUyX09VVF9TRUwyLCAweDBjKTsKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkU4X1RZUEVTRUxfTU9TX0kyUywgMHhmZik7Ci0JCXRtNjAwMF9zZXRfcmVnIChkZXYsIFJFUV8wN19TRVRfR0VUX0FWUkVHLCAweDAwZWIsIDB4ZDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wN19TRVRfR0VUX0FWUkVHLCAweDAwZWIsIDB4ZDgpOwogCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwgMHg0MCk7CiAJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHhkMCk7CiAJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDM19IU1RBUlQxLCAweDA5KTsKQEAgLTM4OCwxNCArMzgyLDE0IEBACiAKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkUyX09VVF9TRUwyLCAweDBjKTsKIAkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkU4X1RZUEVTRUxfTU9TX0kyUywgMHhmZik7Ci0JCXRtNjAwMF9zZXRfcmVnIChkZXYsIFJFUV8wN19TRVRfR0VUX0FWUkVHLCAweDAwZWIsIDB4MDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wN19TRVRfR0VUX0FWUkVHLCAweDAwZWIsIDB4MDgpOwogCQltc2xlZXAoNTApOwogCi0JCXRtNjAwMF9zZXRfcmVnIChkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDAyMCwgMHgwMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMDIwLCAweDAwKTsKIAkJbXNsZWVwKDUwKTsKLQkJdG02MDAwX3NldF9yZWcgKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMDIwLCAweDAxKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAwMjAsIDB4MDEpOwogCQltc2xlZXAoNTApOwotCQl0bTYwMDBfc2V0X3JlZyAoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAwMjAsIDB4MDApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDAyMCwgMHgwMCk7CiAJCW1zbGVlcCgxMDApOwogCX0KIApAQCAtNDA3LDYgKzQwMSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKTsKIAogc3RydWN0IHJlZ19pbml0IHsKIAl1OCByZXE7CkBAIC01NjYsOSArNTYxLDkgQEAKIAl7IFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX1NFTCwgIDB4ZmYgfSwKIH07CiAKLWludCB0bTYwMDBfaW5pdCAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCitpbnQgdG02MDAwX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCiB7Ci0JaW50IGJvYXJkLCByYz0wLCBpLCBzaXplOworCWludCBib2FyZCwgcmMgPSAwLCBpLCBzaXplOwogCXN0cnVjdCByZWdfaW5pdCAqdGFiOwogCiAJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CkBAIC01ODAsMTIgKzU3NSwxMiBAQAogCX0KIAogCS8qIExvYWQgYm9hcmQncyBpbml0aWFsaXphdGlvbiB0YWJsZSAqLwotCWZvciAoaT0wOyBpPCBzaXplOyBpKyspIHsKLQkJcmM9IHRtNjAwMF9zZXRfcmVnIChkZXYsIHRhYltpXS5yZXEsIHRhYltpXS5yZWcsIHRhYltpXS52YWwpOwotCQlpZiAocmM8MCkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAiRXJyb3IgJWkgd2hpbGUgc2V0dGluZyByZXEgJWQsICIKLQkJCQkJICJyZWcgJWQgdG8gdmFsdWUgJWRcbiIsIHJjLAotCQkJCQkgdGFiW2ldLnJlcSx0YWJbaV0ucmVnLCB0YWJbaV0udmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCB0YWJbaV0ucmVxLCB0YWJbaV0ucmVnLCB0YWJbaV0udmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSBzZXR0aW5nIHJlcSAlZCwgIgorCQkJCQkicmVnICVkIHRvIHZhbHVlICVkXG4iLCByYywKKwkJCQkJdGFiW2ldLnJlcSwgdGFiW2ldLnJlZywgdGFiW2ldLnZhbCk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9CkBAIC01OTMsMTIgKzU4OCwxMSBAQAogCW1zbGVlcCg1KTsgLyogSnVzdCB0byBiZSBjb25zZXJ2YXRpdmUgKi8KIAogCS8qIENoZWNrIGJvYXJkIHZlcnNpb24gLSBtYXliZSAxME1vb25zIHNwZWNpZmljICovCi0JYm9hcmQ9dG02MDAwX2dldF9yZWczMiAoZGV2LCBSRVFfNDBfR0VUX1ZFUlNJT04sIDAsIDApOwotCWlmIChib2FyZCA+PTApIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gIkJvYXJkIHZlcnNpb24gPSAweCUwOHhcbiIsYm9hcmQpOwotCX0gZWxzZSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkVycm9yICVpIHdoaWxlIHJldHJpZXZpbmcgYm9hcmQgdmVyc2lvblxuIixib2FyZCk7Ci0JfQorCWJvYXJkID0gdG02MDAwX2dldF9yZWczMihkZXYsIFJFUV80MF9HRVRfVkVSU0lPTiwgMCwgMCk7CisJaWYgKGJvYXJkID49IDApCisJCXByaW50ayhLRVJOX0lORk8gIkJvYXJkIHZlcnNpb24gPSAweCUwOHhcbiIsIGJvYXJkKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWkgd2hpbGUgcmV0cmlldmluZyBib2FyZCB2ZXJzaW9uXG4iLCBib2FyZCk7CiAKIAlyYyA9IHRtNjAwMF9jYXJkc19zZXR1cChkZXYpOwogCkBAIC02MDksMjMgKzYwMywzMiBAQAogewogCWludCB2YWw7CiAKLQl2YWw9dG02MDAwX2dldF9yZWcgKGRldiwgUkVRXzA3X1NFVF9HRVRfQVZSRUcsIDB4ZWIsIDB4MCk7Ci1wcmludGsoIk9yaWdpbmFsIHZhbHVlPSVkXG4iLHZhbCk7Ci0JaWYgKHZhbDwwKQorCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQl2YWwgPSB0bTYwMDBfZ2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEFfQV9JMlNfTU9ELCAwKTsKKwkJaWYgKHZhbCA8IDApCisJCQlyZXR1cm4gdmFsOworCQl2YWwgPSAodmFsICYgMHhmMCkgfCAweDE7IC8qIDQ4IGtIeiwgbm90IG11dGVkICovCisJCXZhbCA9IHRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwQV9BX0kyU19NT0QsIHZhbCk7CisJCWlmICh2YWwgPCAwKQorCQkJcmV0dXJuIHZhbDsKKwl9CisKKwl2YWwgPSB0bTYwMDBfZ2V0X3JlZyhkZXYsIFJFUV8wN19TRVRfR0VUX0FWUkVHLCAweGViLCAweDApOworCWlmICh2YWwgPCAwKQogCQlyZXR1cm4gdmFsOwogCiAJdmFsICY9IDB4MGY7CQkvKiBQcmVzZXJ2ZSB0aGUgYXVkaW8gaW5wdXQgY29udHJvbCBiaXRzICovCiAJc3dpdGNoIChiaXRyYXRlKSB7CiAJY2FzZSA0NDEwMDoKLQkJdmFsfD0weGQwOwotCQlkZXYtPmF1ZGlvX2JpdHJhdGU9Yml0cmF0ZTsKKwkJdmFsIHw9IDB4ZDA7CisJCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7CiAJCWJyZWFrOwogCWNhc2UgNDgwMDA6Ci0JCXZhbHw9MHg2MDsKLQkJZGV2LT5hdWRpb19iaXRyYXRlPWJpdHJhdGU7CisJCXZhbCB8PSAweDYwOworCQlkZXYtPmF1ZGlvX2JpdHJhdGUgPSBiaXRyYXRlOwogCQlicmVhazsKIAl9Ci0JdmFsPXRtNjAwMF9zZXRfcmVnIChkZXYsIFJFUV8wN19TRVRfR0VUX0FWUkVHLCAweGViLCB2YWwpOworCXZhbCA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA3X1NFVF9HRVRfQVZSRUcsIDB4ZWIsIHZhbCk7CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtNjU5LDYgKzY2MiwyMyBAQAogc3RhdGljIExJU1RfSEVBRCh0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpOwogc3RhdGljIERFRklORV9NVVRFWCh0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayk7CiAKK2ludCB0bTYwMDBfY2FsbF9maWxsYnVmKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBlbnVtIHRtNjAwMF9vcHNfdHlwZSB0eXBlLAorCQkJY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdG02MDAwX29wcyAqb3BzID0gTlVMTDsKKworCS8qIEZJWE1FOiB0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayBzaG91bGQgYmUgYSBzcGlubG9jayAqLworCisJaWYgKCFsaXN0X2VtcHR5KCZ0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0LCBuZXh0KSB7CisJCQlpZiAob3BzLT5maWxsYnVmICYmIG9wcy0+dHlwZSA9PSB0eXBlKQorCQkJCW9wcy0+ZmlsbGJ1ZihkZXYsIGJ1Ziwgc2l6ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHRtNjAwMF9yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IE5VTEw7CkBAIC02NjcsMTAgKzY4NywxMCBAQAogCW11dGV4X2xvY2soJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZvcHMtPm5leHQsICZ0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdG02MDAwX2Rldmxpc3QsIGRldmxpc3QpIHsKLQkJaWYgKGRldikKLQkJCW9wcy0+aW5pdChkZXYpOworCQlvcHMtPmluaXQoZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBvcHMtPm5hbWUpOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOwogCW11dGV4X3VubG9jaygmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0X2xvY2spOwogCW11dGV4X3VubG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtZHZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1kdmIuYwppbmRleCA4NmMxYzhiLi5mNTAxZWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1kdmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1kdmIuYwpAQCAtMzEsMTIgKzMxLDI1IEBACiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAKLXN0YXRpYyB2b2lkIGlubGluZSBwcmludF9lcnJfc3RhdHVzIChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwKLQkJCQkgICAgIGludCBwYWNrZXQsIGludCBzdGF0dXMpCitNT0RVTEVfREVTQ1JJUFRJT04oIkRWQiBkcml2ZXIgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgdG01NjAwLzYwMDAvNjAxMCBiYXNlZCBUViBjYXJkcyIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1RyaWRlbnQsIHRtNTYwMH0sIgorCQkJInt7VHJpZGVudCwgdG02MDAwfSwiCisJCQkie3tUcmlkZW50LCB0bTYwMTB9Iik7CisKK3N0YXRpYyBpbnQgZGVidWc7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZSIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfZXJyX3N0YXR1cyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwKKwkJCQkgICAgaW50IHBhY2tldCwgaW50IHN0YXR1cykKIHsKIAljaGFyICplcnJtc2cgPSAiVW5rbm93biI7CiAKLQlzd2l0Y2goc3RhdHVzKSB7CisJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIC1FTk9FTlQ6CiAJCWVycm1zZyA9ICJ1bmxpbmtlZCBzeW5jaHJvbnVvdXNseSI7CiAJCWJyZWFrOwpAQCAtNjIsNyArNzUsNyBAQAogCQllcnJtc2cgPSAiRGV2aWNlIGRvZXMgbm90IHJlc3BvbmQiOwogCQlicmVhazsKIAl9Ci0JaWYgKHBhY2tldDwwKSB7CisJaWYgKHBhY2tldCA8IDApIHsKIAkJZHByaW50ayhkZXYsIDEsICJVUkIgc3RhdHVzICVkIFslc10uXG4iLAogCQkJc3RhdHVzLCBlcnJtc2cpOwogCX0gZWxzZSB7CkBAIC03NCwxOSArODcsMTcgQEAKIHN0YXRpYyB2b2lkIHRtNjAwMF91cmJfcmVjZWl2ZWQoc3RydWN0IHVyYiAqdXJiKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlKiBkZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSB1cmItPmNvbnRleHQ7CiAKLQlpZih1cmItPnN0YXR1cyAhPSAwKSB7Ci0JCXByaW50X2Vycl9zdGF0dXMgKGRldiwwLHVyYi0+c3RhdHVzKTsKLQl9Ci0JZWxzZSBpZih1cmItPmFjdHVhbF9sZW5ndGg+MCl7CisJaWYgKHVyYi0+c3RhdHVzICE9IDApCisJCXByaW50X2Vycl9zdGF0dXMoZGV2LCAwLCB1cmItPnN0YXR1cyk7CisJZWxzZSBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkKIAkJZHZiX2RteF9zd2ZpbHRlcigmZGV2LT5kdmItPmRlbXV4LCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKIAkJCQkJCSAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JfQogCi0JaWYoZGV2LT5kdmItPnN0cmVhbXMgPiAwKSB7CisJaWYgKGRldi0+ZHZiLT5zdHJlYW1zID4gMCkgewogCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCQlpZihyZXQgPCAwKSB7CisJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogIGVycm9yICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCQkJdXNiX2ZyZWVfdXJiKHVyYik7CkBAIC0xMDAsNyArMTExLDcgQEAKIAl1bnNpZ25lZCBpbnQgcGlwZSwgc2l6ZTsKIAlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGdvdCBzdGFydCBzdHJlYW0gcmVxdWVzdCAlc1xuIixfX0ZVTkNUSU9OX18pOworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZ290IHN0YXJ0IHN0cmVhbSByZXF1ZXN0ICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKGRldi0+bW9kZSAhPSBUTTYwMDBfTU9ERV9ESUdJVEFMKSB7CiAJCXRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZShkZXYpOwpAQCAtMTA4LDcgKzExOSw3IEBACiAJfQogCiAJZHZiLT5idWxrX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYoZHZiLT5idWxrX3VyYiA9PSBOVUxMKSB7CisJaWYgKGR2Yi0+YnVsa191cmIgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYWxsb2NhdGUgdXJiXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTIwLDcgKzEzMSw3IEBACiAJc2l6ZSA9IHNpemUgKiAxNTsgLyogNTEyIHggOCBvciAxMiBvciAxNSAqLwogCiAJZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZihkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgeworCWlmIChkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQl1c2JfZnJlZV91cmIoZHZiLT5idWxrX3VyYik7CiAJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhbGxvY2F0ZSB0cmFuc2ZlciBidWZmZXIhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMzIsMjAgKzE0MywyMCBAQAogCQkJCQkJIHRtNjAwMF91cmJfcmVjZWl2ZWQsIGRldik7CiAKIAlyZXQgPSB1c2JfY2xlYXJfaGFsdChkZXYtPnVkZXYsIHBpcGUpOwotCWlmKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGVycm9yICVpIGluICVzIGR1cmluZyBwaXBlIHJlc2V0XG4iLHJldCxfX0ZVTkNUSU9OX18pOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBlcnJvciAlaSBpbiAlcyBkdXJpbmcgcGlwZSByZXNldFxuIiwKKwkJCQkJCQlyZXQsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiByZXQ7Ci0JfQotCWVsc2UgeworCX0gZWxzZQogCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogcGlwZSByZXNldHRlZFxuIik7Ci0JfQogCiAvKgltdXRleF9sb2NrKCZ0bTYwMDBfZHJpdmVyLm9wZW5fY2xvc2VfbXV0ZXgpOyAqLwogCXJldCA9IHVzYl9zdWJtaXRfdXJiKGR2Yi0+YnVsa191cmIsIEdGUF9LRVJORUwpOwogCiAvKgltdXRleF91bmxvY2soJnRtNjAwMF9kcml2ZXIub3Blbl9jbG9zZV9tdXRleCk7ICovCiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogc3VibWl0IG9mIHVyYiBmYWlsZWQgKGVycm9yPSVpKVxuIixyZXQpOworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogc3VibWl0IG9mIHVyYiBmYWlsZWQgKGVycm9yPSVpKVxuIiwKKwkJCQkJCQkJCXJldCk7CiAKIAkJa2ZyZWUoZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAkJdXNiX2ZyZWVfdXJiKGR2Yi0+YnVsa191cmIpOwpAQCAtMTU5LDEwICsxNzAsMTAgQEAKIHsKIAlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7CiAKLQlpZihkdmItPmJ1bGtfdXJiKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJ1cmIga2lsbGluZ1xuIik7CisJaWYgKGR2Yi0+YnVsa191cmIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXJiIGtpbGxpbmdcbiIpOwogCQl1c2Jfa2lsbF91cmIoZHZiLT5idWxrX3VyYik7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJ1cmIgYnVmZmVyIGZyZWVcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJ1cmIgYnVmZmVyIGZyZWVcbiIpOwogCQlrZnJlZShkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCQl1c2JfZnJlZV91cmIoZHZiLT5idWxrX3VyYik7CiAJCWR2Yi0+YnVsa191cmIgPSBOVUxMOwpAQCAtMTc0LDM1ICsxODUsMzQgQEAKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGZlZWQtPmRlbXV4OwogCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZGVtdXgtPnByaXY7CiAJc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZ290IHN0YXJ0IGZlZWQgcmVxdWVzdCAlc1xuIixfX0ZVTkNUSU9OX18pOworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZ290IHN0YXJ0IGZlZWQgcmVxdWVzdCAlc1xuIiwgX19GVU5DVElPTl9fKTsKIAogCW11dGV4X2xvY2soJmR2Yi0+bXV0ZXgpOwotCWlmKGR2Yi0+c3RyZWFtcyA9PSAwKSB7CisJaWYgKGR2Yi0+c3RyZWFtcyA9PSAwKSB7CiAJCWR2Yi0+c3RyZWFtcyA9IDE7CiAvKgkJbXV0ZXhfaW5pdCgmdG02MDAwX2Rldi0+c3RyZW1pbmdfbXV0ZXgpOyAqLwogCQl0bTYwMDBfc3RhcnRfc3RyZWFtKGRldik7Ci0JfQotCWVsc2UgeworCX0gZWxzZQogCQkrKyhkdmItPnN0cmVhbXMpOwotCX0KIAltdXRleF91bmxvY2soJmR2Yi0+bXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCB0bTYwMDBfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkgeworaW50IHRtNjAwMF9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQorewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBkZW11eC0+cHJpdjsKIAlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGdvdCBzdG9wIGZlZWQgcmVxdWVzdCAlc1xuIixfX0ZVTkNUSU9OX18pOworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZ290IHN0b3AgZmVlZCByZXF1ZXN0ICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJbXV0ZXhfbG9jaygmZHZiLT5tdXRleCk7CiAKLQlwcmludGsgKEtFUk5fSU5GTyAic3RyZWFtICUjeFxuIiwgZHZiLT5zdHJlYW1zKTsKKwlwcmludGsoS0VSTl9JTkZPICJzdHJlYW0gJSN4XG4iLCBkdmItPnN0cmVhbXMpOwogCS0tKGR2Yi0+c3RyZWFtcyk7Ci0JaWYoZHZiLT5zdHJlYW1zID09IDApIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gInN0b3Agc3RyZWFtXG4iKTsKKwlpZiAoZHZiLT5zdHJlYW1zID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3RvcCBzdHJlYW1cbiIpOwogCQl0bTYwMDBfc3RvcF9zdHJlYW0oZGV2KTsKIC8qCQltdXRleF9kZXN0cm95KCZ0bTYwMDBfZGV2LT5zdHJlYW1pbmdfbXV0ZXgpOyAqLwogCX0KQEAgLTIxNiw5ICsyMjYsOSBAQAogewogCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKIAotCWlmKGRldi0+Y2Fwcy5oYXNfemwxMDM1MykgewotCQlzdHJ1Y3QgemwxMDM1M19jb25maWcgY29uZmlnID0KLQkJCQkgICAgey5kZW1vZF9hZGRyZXNzID0gZGV2LT5kZW1vZF9hZGRyLAorCWlmIChkZXYtPmNhcHMuaGFzX3psMTAzNTMpIHsKKwkJc3RydWN0IHpsMTAzNTNfY29uZmlnIGNvbmZpZyA9IHsKKwkJCQkgICAgIC5kZW1vZF9hZGRyZXNzID0gZGV2LT5kZW1vZF9hZGRyLAogCQkJCSAgICAgLm5vX3R1bmVyID0gMSwKIAkJCQkgICAgIC5wYXJhbGxlbF90cyA9IDEsCiAJCQkJICAgICAuaWYyID0gNDU3MDAsCkBAIC0yMjcsOCArMjM3LDcgQEAKIAogCQlkdmItPmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmNvbmZpZywKIAkJCQkJCQkgICAmZGV2LT5pMmNfYWRhcCk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBubyBmcm9udGVuZCBkZWZpbmVkIGZvciB0aGUgZGV2aWNlIVxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yMzgsNyArMjQ3LDcgQEAKIAogRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CiAKLWludCB0bTYwMDBfZHZiX3JlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoraW50IHJlZ2lzdGVyX2R2YihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKIHsKIAlpbnQgcmV0ID0gLTE7CiAJc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwpAQCAtMjQ5LDEzICsyNTgsMTMgQEAKIAogCS8qIGF0dGFjaCB0aGUgZnJvbnRlbmQgKi8KIAlyZXQgPSB0bTYwMDBfZHZiX2F0dGFjaF9mcm9udGVuZChkZXYpOwotCWlmKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYXR0YWNoIHRoZSBmcm9udGVuZCFcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmZHZiLT5hZGFwdGVyLCAiVHJpZGVudCBUVk1hc3RlciA2MDAwIERWQi1UIiwKLQkJCQkJCQkgIFRISVNfTU9EVUxFLCAmZGV2LT51ZGV2LT5kZXYsIGFkYXB0ZXJfbnIpOworCQkJCQlUSElTX01PRFVMRSwgJmRldi0+dWRldi0+ZGV2LCBhZGFwdGVyX25yKTsKIAlkdmItPmFkYXB0ZXIucHJpdiA9IGRldjsKIAogCWlmIChkdmItPmZyb250ZW5kKSB7CkBAIC0zMDgsOSArMzE3LDggQEAKIAkJCWJyZWFrOwogCQkJfQogCQl9Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IG5vIGZyb250ZW5kIGZvdW5kXG4iKTsKLQl9CiAKIAlkdmItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HCiAJCQkJCQkJICAgIHwgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7CkBAIC0zMjEsNyArMzI5LDcgQEAKIAlkdmItPmRlbXV4LnN0b3BfZmVlZCA9IHRtNjAwMF9zdG9wX2ZlZWQ7CiAJZHZiLT5kZW11eC53cml0ZV90b19kZWNvZGVyID0gTlVMTDsKIAlyZXQgPSBkdmJfZG14X2luaXQoJmR2Yi0+ZGVtdXgpOwotCWlmKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoInRtNjAwMDogZHZiX2RteF9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJldCk7CiAJCWdvdG8gZnJvbnRlbmRfZXJyOwogCX0KQEAgLTMzMSw3ICszMzksNyBAQAogCWR2Yi0+ZG14ZGV2LmNhcGFiaWxpdGllcyA9IDA7CiAKIAlyZXQgPSAgZHZiX2RteGRldl9pbml0KCZkdmItPmRteGRldiwgJmR2Yi0+YWRhcHRlcik7Ci0JaWYocmV0IDwgMCkgeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygidG02MDAwOiBkdmJfZG14ZGV2X2luaXQgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwgcmV0KTsKIAkJZ290byBkdmJfZG14X2VycjsKIAl9CkBAIC0zNDEsNyArMzQ5LDcgQEAKIGR2Yl9kbXhfZXJyOgogCWR2Yl9kbXhfcmVsZWFzZSgmZHZiLT5kZW11eCk7CiBmcm9udGVuZF9lcnI6Ci0JaWYoZHZiLT5mcm9udGVuZCkgeworCWlmIChkdmItPmZyb250ZW5kKSB7CiAJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mcm9udGVuZCk7CiAJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGR2Yi0+ZnJvbnRlbmQpOwogCX0KQEAgLTM1MSwxMSArMzU5LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB0bTYwMDBfZHZiX3VucmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit2b2lkIHVucmVnaXN0ZXJfZHZiKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQogewogCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKIAotCWlmKGR2Yi0+YnVsa191cmIgIT0gTlVMTCkgeworCWlmIChkdmItPmJ1bGtfdXJiICE9IE5VTEwpIHsKIAkJc3RydWN0IHVyYiAqYnVsa191cmIgPSBkdmItPmJ1bGtfdXJiOwogCiAJCWtmcmVlKGJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwpAQCAtMzY1LDcgKzM3Myw3IEBACiAJfQogCiAvKgltdXRleF9sb2NrKCZ0bTYwMDBfZHJpdmVyLm9wZW5fY2xvc2VfbXV0ZXgpOyAqLwotCWlmKGR2Yi0+ZnJvbnRlbmQpIHsKKwlpZiAoZHZiLT5mcm9udGVuZCkgewogCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZnJvbnRlbmQpOwogCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKIAl9CkBAIC0zNzUsNSArMzgzLDcwIEBACiAJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZHZiLT5hZGFwdGVyKTsKIAltdXRleF9kZXN0cm95KCZkdmItPm11dGV4KTsKIC8qCW11dGV4X3VubG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KLQogfQorCitzdGF0aWMgaW50IGR2Yl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmI7CisJaW50IHJjOworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKCFkZXYtPmNhcHMuaGFzX2R2YikKKwkJcmV0dXJuIDA7CisKKwlkdmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdG02MDAwX2R2YiksIEdGUF9LRVJORUwpOworCWlmICghZHZiKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXYtPmR2YiA9IGR2YjsKKworCXJjID0gcmVnaXN0ZXJfZHZiKGRldik7CisJaWYgKHJjIDwgMCkgeworCQlrZnJlZShkdmIpOworCQlkZXYtPmR2YiA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl9maW5pKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWlmICghZGV2LT5jYXBzLmhhc19kdmIpCisJCXJldHVybiAwOworCisJaWYgKGRldi0+ZHZiKSB7CisJCXVucmVnaXN0ZXJfZHZiKGRldik7CisJCWtmcmVlKGRldi0+ZHZiKTsKKwkJZGV2LT5kdmIgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRtNjAwMF9vcHMgZHZiX29wcyA9IHsKKwkudHlwZQk9IFRNNjAwMF9EVkIsCisJLm5hbWUJPSAiVE02MDAwIGR2YiBFeHRlbnNpb24iLAorCS5pbml0CT0gZHZiX2luaXQsCisJLmZpbmkJPSBkdmJfZmluaSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRtNjAwMF9kdmJfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gdG02MDAwX3JlZ2lzdGVyX2V4dGVuc2lvbigmZHZiX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0bTYwMDBfZHZiX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0bTYwMDBfdW5yZWdpc3Rlcl9leHRlbnNpb24oJmR2Yl9vcHMpOworfQorCittb2R1bGVfaW5pdCh0bTYwMDBfZHZiX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KHRtNjAwMF9kdmJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWkyYy5jCmluZGV4IDk0ZmY0ODkuLjc5YmM2N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWkyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWkyYy5jCkBAIC00MCw3ICs0MCw3IEBACiBtb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2kyY10iKTsKIAotI2RlZmluZSBpMmNfZHByaW50ayhsdmwsZm10LCBhcmdzLi4uKSBpZiAoaTJjX2RlYnVnPj1sdmwpIGRveyBcCisjZGVmaW5lIGkyY19kcHJpbnRrKGx2bCwgZm10LCBhcmdzLi4uKSBpZiAoaTJjX2RlYnVnID49IGx2bCkgZG8geyBcCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgYXQgJXM6ICIgZm10LCBcCiAJCQlkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7IH0gd2hpbGUgKDApCiAKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQlyZXR1cm4gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJYWRkciA9IChtc2dzW2ldLmFkZHIgPDwgMSkgJiAweGZmOwotCQlpMmNfZHByaW50aygyLCIlcyAlcyBhZGRyPTB4JXggbGVuPSVkOiIsCisJCWkyY19kcHJpbnRrKDIsICIlcyAlcyBhZGRyPTB4JXggbGVuPSVkOiIsCiAJCQkgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAogCQkJIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpXS5sZW4pOwogCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CkBAIC0yMzUsNyArMjM1LDcgQEAKIAogCXJldHVybiBudW07CiBlcnI6Ci0JaTJjX2RwcmludGsoMiwiIEVSUk9SOiAlaVxuIiwgcmMpOworCWkyY19kcHJpbnRrKDIsICIgRVJST1I6ICVpXG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNjYsMTEgKzI2NiwxMCBAQAogCQlpZiAoMCA9PSAoaSAlIDE2KSkKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpMmMgZWVwcm9tICUwMng6IiwgZGV2LT5uYW1lLCBpKTsKIAkJcHJpbnRrKCIgJTAyeCIsIGVlZGF0YVtpXSk7Ci0JCWlmICgoZWVkYXRhW2ldID49ICcgJykgJiYgKGVlZGF0YVtpXSA8PSAneicpKSB7CisJCWlmICgoZWVkYXRhW2ldID49ICcgJykgJiYgKGVlZGF0YVtpXSA8PSAneicpKQogCQkJYnl0ZXNbaSUxNl0gPSBlZWRhdGFbaV07Ci0JCX0gZWxzZSB7Ci0JCQlieXRlc1tpJTE2XT0nLic7Ci0JCX0KKwkJZWxzZQorCQkJYnl0ZXNbaSUxNl0gPSAnLic7CiAKIAkJaSsrOwogCkBAIC0zMDUsMTUgKzMwNCwxNSBAQAogfQogCiAjZGVmaW5lIG1hc3Nfd3JpdGUoYWRkciwgcmVnLCBkYXRhLi4uKQkJCQkJXAotCXsgY29uc3Qgc3RhdGljIHU4IF92YWxbXSA9IGRhdGE7CQkJCVwKLQlyYz10bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SLAlcCi0JUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sKHJlZzw8OCkrYWRkciwgMHgwMCwgKHU4ICopIF92YWwsCVwKKwl7IHN0YXRpYyBjb25zdCB1OCBfdmFsW10gPSBkYXRhOwkJCQlcCisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwJXAorCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCAocmVnPDw4KSthZGRyLCAweDAwLCAodTggKikgX3ZhbCwJXAogCUFSUkFZX1NJWkUoX3ZhbCkpOwkJCQkJCVwKLQlpZiAocmM8MCkgewkJCQkJCQlcCi0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igb24gbGluZSAlZDogJWRcbiIsX19MSU5FX18scmMpOwlcCisJaWYgKHJjIDwgMCkgewkJCQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igb24gbGluZSAlZDogJWRcbiIsIF9fTElORV9fLCByYyk7CVwKIAkJcmV0dXJuIHJjOwkJCQkJCVwKIAl9CQkJCQkJCQlcCi0JbXNsZWVwICgxMCk7CQkJCQkJCVwKKwltc2xlZXAoMTApOwkJCQkJCQlcCiAJfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gdG02MDAwX2FsZ28gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1pbnB1dC5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY3YTBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaW5wdXQuYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAgIHRtNjAwMC1pbnB1dC5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisKKyAgIENvcHlyaWdodCAoQykgMjAxMCBTdGVmYW4gUmluZ2VsIDxzdGVmYW4ucmluZ2VsQGFyY29yLmRlPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPG1lZGlhL2lyLWNvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KKworI2luY2x1ZGUgInRtNjAwMC5oIgorI2luY2x1ZGUgInRtNjAwMC1yZWdzLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJfZGVidWc7Cittb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2UgW0lSXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGVuYWJsZV9pciA9IDE7Cittb2R1bGVfcGFyYW0oZW5hYmxlX2lyLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfaXIsICJlbmFibGUgaXIgKGRlZmF1bHQgaXMgZW5hYmxlIik7CisKKyN1bmRlZiBkcHJpbnRrCisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZy4uLikgXAorCWlmIChpcl9kZWJ1ZykgeyBcCisJCXByaW50ayhLRVJOX0RFQlVHICIlcy9pcjogIiBmbXQsIGlyLT5uYW1lICwgIyMgYXJnKTsgXAorCX0KKworc3RydWN0IHRtNjAwMF9pcl9wb2xsX3Jlc3VsdCB7CisJdTggcmNfZGF0YVs0XTsKK307CisKK3N0cnVjdCB0bTYwMDBfSVIgeworCXN0cnVjdCB0bTYwMDBfY29yZQkqZGV2OworCXN0cnVjdCBpcl9pbnB1dF9kZXYJKmlucHV0OworCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZQlpcjsKKwljaGFyCQkJbmFtZVszMl07CisJY2hhcgkJCXBoeXNbMzJdOworCisJLyogcG9sbCBleHBlcm5hbCBkZWNvZGVyICovCisJaW50CQkJcG9sbGluZzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7CisJdTgJCQl3YWl0OjE7CisJc3RydWN0IHVyYgkJKmludF91cmI7CisJdTgJCQkqdXJiX2RhdGE7CisJdTgJCQlrZXk6MTsKKworCWludCAoKmdldF9rZXkpIChzdHJ1Y3QgdG02MDAwX0lSICosIHN0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgKik7CisKKwkvKiBJUiBkZXZpY2UgcHJvcGVydGllcyAqLworCXN0cnVjdCBpcl9kZXZfcHJvcHMJcHJvcHM7Cit9OworCisKK3ZvaWQgdG02MDAwX2lyX3dhaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHN0YXRlKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKKworCWlmICghZGV2LT5pcikKKwkJcmV0dXJuOworCisJaWYgKHN0YXRlKQorCQlpci0+d2FpdCA9IDE7CisJZWxzZQorCQlpci0+d2FpdCA9IDA7Cit9CisKKworc3RhdGljIGludCB0bTYwMDBfaXJfY29uZmlnKHN0cnVjdCB0bTYwMDBfSVIgKmlyKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaXItPmRldjsKKwl1OCBidWZbMTBdOworCWludCByYzsKKworCS8qIGhhY2sgKi8KKwlidWZbMF0gPSAweGZmOworCWJ1ZlsxXSA9IDB4ZmY7CisJYnVmWzJdID0gMHhmMjsKKwlidWZbM10gPSAweDJiOworCWJ1Zls0XSA9IDB4MjA7CisJYnVmWzVdID0gMHgzNTsKKwlidWZbNl0gPSAweDYwOworCWJ1Zls3XSA9IDB4MDQ7CisJYnVmWzhdID0gMHhjMDsKKwlidWZbOV0gPSAweDA4OworCisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCVVTQl9SRUNJUF9ERVZJQ0UsIFJFUV8wMF9TRVRfSVJfVkFMVUUsIDAsIDAsIGJ1ZiwgMHgwYSk7CisJbXNsZWVwKDEwMCk7CisKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIklSIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9pcl91cmJfcmVjZWl2ZWQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKKwlpbnQgcmM7CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibm90IHJlYWR5XG4iKTsKKwllbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKQorCQltZW1jcHkoaXItPnVyYl9kYXRhLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworCWRwcmludGsoImRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgaXItPnVyYl9kYXRhWzBdLAorCWlyLT51cmJfZGF0YVsxXSwgaXItPnVyYl9kYXRhWzJdLCBpci0+dXJiX2RhdGFbM10pOworCisJaXItPmtleSA9IDE7CisKKwlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9wb2xsaW5nX2dldGtleShzdHJ1Y3QgdG02MDAwX0lSICppciwKKwkJCQlzdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0ICpwb2xsX3Jlc3VsdCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGlyLT5kZXY7CisJaW50IHJjOworCXU4IGJ1ZlsyXTsKKworCWlmIChpci0+d2FpdCAmJiAhJmRldi0+aW50X2luKSB7CisJCXBvbGxfcmVzdWx0LT5yY19kYXRhWzBdID0gMHhmZjsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCZkZXYtPmludF9pbikgeworCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YVswXSA9IGlyLT51cmJfZGF0YVswXTsKKwkJcG9sbF9yZXN1bHQtPnJjX2RhdGFbMV0gPSBpci0+dXJiX2RhdGFbMV07CisJfSBlbHNlIHsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAyLCAwKTsKKwkJbXNsZWVwKDEwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAyLCAxKTsKKwkJbXNsZWVwKDEwKTsKKworCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkgVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzAyX0dFVF9JUl9DT0RFLCAwLCAwLCBidWYsIDEpOworCisJCW1zbGVlcCgxMCk7CisKKwkJZHByaW50aygicmVhZCBkYXRhPSUwMnhcbiIsIGJ1ZlswXSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJcG9sbF9yZXN1bHQtPnJjX2RhdGFbMF0gPSBidWZbMF07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0bTYwMDBfaXJfaGFuZGxlX2tleShzdHJ1Y3QgdG02MDAwX0lSICppcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgcG9sbF9yZXN1bHQ7CisKKwkvKiByZWFkIHRoZSByZWdpc3RlcnMgY29udGFpbmluZyB0aGUgSVIgc3RhdHVzICovCisJcmVzdWx0ID0gaXItPmdldF9rZXkoaXIsICZwb2xsX3Jlc3VsdCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXItPmdldF9rZXkoKSBmYWlsZWQgJWRcbiIsIHJlc3VsdCk7CisJCXJldHVybjsKKwl9CisKKwlkcHJpbnRrKCJpci0+Z2V0X2tleSByZXN1bHQgZGF0YT0lMDJ4ICUwMnhcbiIsCisJCXBvbGxfcmVzdWx0LnJjX2RhdGFbMF0sIHBvbGxfcmVzdWx0LnJjX2RhdGFbMV0pOworCisJaWYgKHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0gIT0gMHhmZiAmJiBpci0+a2V5ID09IDEpIHsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQtPmlucHV0X2RldiwgJmlyLT5pciwKKwkJCXBvbGxfcmVzdWx0LnJjX2RhdGFbMF0gfCBwb2xsX3Jlc3VsdC5yY19kYXRhWzFdIDw8IDgpOworCisJCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dC0+aW5wdXRfZGV2LCAmaXItPmlyKTsKKwkJaXItPmtleSA9IDA7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdG02MDAwX2lyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0bTYwMDBfSVIsIHdvcmsud29yayk7CisKKwl0bTYwMDBfaXJfaGFuZGxlX2tleShpcik7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgbXNlY3NfdG9famlmZmllcyhpci0+cG9sbGluZykpOworfQorCitzdGF0aWMgaW50IHRtNjAwMF9pcl9zdGFydCh2b2lkICpwcml2KQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gcHJpdjsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZpci0+d29yaywgdG02MDAwX2lyX3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaXItPndvcmssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9pcl9zdG9wKHZvaWQgKnByaXYpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBwcml2OworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpci0+d29yayk7Cit9CisKK2ludCB0bTYwMDBfaXJfY2hhbmdlX3Byb3RvY29sKHZvaWQgKnByaXYsIHU2NCBpcl90eXBlKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gcHJpdjsKKworCWlyLT5nZXRfa2V5ID0gZGVmYXVsdF9wb2xsaW5nX2dldGtleTsKKworCXRtNjAwMF9pcl9jb25maWcoaXIpOworCS8qIFRPRE8gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHRtNjAwMF9pcl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyOworCXN0cnVjdCBpcl9pbnB1dF9kZXYgKmlyX2lucHV0X2RldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgcGlwZSwgc2l6ZSwgcmM7CisKKwlpZiAoIWVuYWJsZV9pcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRldi0+Y2Fwcy5oYXNfcmVtb3RlKQorCQlyZXR1cm4gMDsKKworCWlmICghZGV2LT5pcl9jb2RlcykKKwkJcmV0dXJuIDA7CisKKwlpciA9IGt6YWxsb2Moc2l6ZW9mKCppciksIEdGUF9LRVJORUwpOworCWlyX2lucHV0X2RldiA9IGt6YWxsb2Moc2l6ZW9mKCppcl9pbnB1dF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpcl9pbnB1dF9kZXYtPmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaXIgfHwgIWlyX2lucHV0X2RldiB8fCAhaXJfaW5wdXRfZGV2LT5pbnB1dF9kZXYpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJLyogcmVjb3JkIGhhbmRsZXMgdG8gb3Vyc2VsZiAqLworCWlyLT5kZXYgPSBkZXY7CisJZGV2LT5pciA9IGlyOworCisJaXItPmlucHV0ID0gaXJfaW5wdXRfZGV2OworCisJLyogaW5wdXQgZWlucmljaHRlbiAqLworCWlyLT5wcm9wcy5hbGxvd2VkX3Byb3RvcyA9IElSX1RZUEVfUkM1IHwgSVJfVFlQRV9ORUM7CisJaXItPnByb3BzLnByaXYgPSBpcjsKKwlpci0+cHJvcHMuY2hhbmdlX3Byb3RvY29sID0gdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbDsKKwlpci0+cHJvcHMub3BlbiA9IHRtNjAwMF9pcl9zdGFydDsKKwlpci0+cHJvcHMuY2xvc2UgPSB0bTYwMDBfaXJfc3RvcDsKKwlpci0+cHJvcHMuZHJpdmVyX3R5cGUgPSBSQ19EUklWRVJfU0NBTkNPREU7CisKKwlpci0+cG9sbGluZyA9IDUwOworCisJc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJ0bTU2MDAvNjB4MCBJUiAoJXMpIiwKKwkJCQkJCWRldi0+bmFtZSk7CisKKwl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgaXItPnBoeXMsIHNpemVvZihpci0+cGh5cykpOworCXN0cmxjYXQoaXItPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGlyLT5waHlzKSk7CisKKwl0bTYwMDBfaXJfY2hhbmdlX3Byb3RvY29sKGlyLCBJUl9UWVBFX1VOS05PV04pOworCWVyciA9IGlyX2lucHV0X2luaXQoaXJfaW5wdXRfZGV2LT5pbnB1dF9kZXYsICZpci0+aXIsIElSX1RZUEVfT1RIRVIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKworCWlyX2lucHV0X2Rldi0+aW5wdXRfZGV2LT5uYW1lID0gaXItPm5hbWU7CisJaXJfaW5wdXRfZGV2LT5pbnB1dF9kZXYtPnBoeXMgPSBpci0+cGh5czsKKwlpcl9pbnB1dF9kZXYtPmlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19VU0I7CisJaXJfaW5wdXRfZGV2LT5pbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAxOworCWlyX2lucHV0X2Rldi0+aW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCWlyX2lucHV0X2Rldi0+aW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwlpcl9pbnB1dF9kZXYtPmlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKKworCWlmICgmZGV2LT5pbnRfaW4pIHsKKwkJZHByaW50aygiSVIgb3ZlciBpbnRcbiIpOworCisJCWlyLT5pbnRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKworCQlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAorCQkJZGV2LT5pbnRfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzCisJCQkmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisKKwkJc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJCWRwcmludGsoIklSIG1heCBzaXplOiAlZFxuIiwgc2l6ZSk7CisKKwkJaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKKwkJCXVzYl9mcmVlX3VyYihpci0+aW50X3VyYik7CisJCQlnb3RvIGVycl9vdXRfc3RvcDsKKwkJfQorCQlkcHJpbnRrKCJpbnQgaW50ZXJ2YWw6ICVkXG4iLCBkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbCk7CisJCXVzYl9maWxsX2ludF91cmIoaXItPmludF91cmIsIGRldi0+dWRldiwgcGlwZSwKKwkJCWlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIsIHNpemUsCisJCQl0bTYwMDBfaXJfdXJiX3JlY2VpdmVkLCBkZXYsCisJCQlkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbCk7CisJCXJjID0gdXNiX3N1Ym1pdF91cmIoaXItPmludF91cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKGlyLT5pbnRfdXJiKTsKKwkJCWVyciA9IHJjOworCQkJZ290byBlcnJfb3V0X3N0b3A7CisJCX0KKwkJaXItPnVyYl9kYXRhID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwl9CisKKwkvKiBpciByZWdpc3RlciAqLworCWVyciA9IGlyX2lucHV0X3JlZ2lzdGVyKGlyLT5pbnB1dC0+aW5wdXRfZGV2LCBkZXYtPmlyX2NvZGVzLAorCQkmaXItPnByb3BzLCAidG02MDAwIik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3N0b3A7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9zdG9wOgorCWRldi0+aXIgPSBOVUxMOworZXJyX291dF9mcmVlOgorCWtmcmVlKGlyX2lucHV0X2Rldik7CisJa2ZyZWUoaXIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCB0bTYwMDBfaXJfZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7CisKKwkvKiBza2lwIGRldGFjaCBvbiBub24gYXR0YWNoZWQgYm9hcmQgKi8KKworCWlmICghaXIpCisJCXJldHVybiAwOworCisJaXJfaW5wdXRfdW5yZWdpc3Rlcihpci0+aW5wdXQtPmlucHV0X2Rldik7CisKKwlpZiAoaXItPmludF91cmIpIHsKKwkJdXNiX2tpbGxfdXJiKGlyLT5pbnRfdXJiKTsKKwkJa2ZyZWUoaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYihpci0+aW50X3VyYik7CisJCWlyLT5pbnRfdXJiID0gTlVMTDsKKwkJa2ZyZWUoaXItPnVyYl9kYXRhKTsKKwkJaXItPnVyYl9kYXRhID0gTlVMTDsKKwl9CisKKwlrZnJlZShpci0+aW5wdXQpOworCWlyLT5pbnB1dCA9IE5VTEw7CisJa2ZyZWUoaXIpOworCWRldi0+aXIgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1zdGRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1zdGRzLmMKaW5kZXggYjM1NjRmNi4uNmJmNGE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtc3Rkcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXN0ZHMuYwpAQCAtNzcsNyArNzcsNyBAQAogCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAogCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAogCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDB9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDF9LAorCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAogCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4M30sCiAJCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4MGF9LApAQCAtMTM1LDcgKzEzNSw3IEBACiAJCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCiAJCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMX0sCisJCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAogCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkxfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgxZn0sCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAxfSwKKwkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ZDV9LAogCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDYzfSwKQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAogCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAogCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDF9LAorCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAogCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI0fSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5Mn0sCiAJCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4ZTh9LApAQCAtMzA4LDcgKzMwOCw3IEBACiAJCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZn0sCiAJCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCiAJCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMX0sCisJCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAogCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhifSwKIAkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMn0sCkBAIC0zNTQsNyArMzU0LDcgQEAKIAkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAxfSwKKwkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ODN9LAogCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDBhfSwKQEAgLTM5Niw3ICszOTYsNyBAQAogCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAogCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAogCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDF9LAorCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAogCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5MX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4MWZ9LApAQCAtNDM4LDcgKzQzOCw3IEBACiAJCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCiAJCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMX0sCisJCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MjV9LAogCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweGQ1fSwKIAkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHg2M30sCkBAIC00ODAsNyArNDgwLDcgQEAKIAkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAxfSwKKwkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNH0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTJ9LAogCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweGU4fSwKQEAgLTUyMSw3ICs1MjEsNyBAQAogCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGZ9LAogCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAogCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDB9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDF9LAorCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAogCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4Yn0sCiAJCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4YTJ9LApAQCAtNTY3LDcgKzU2Nyw3IEBACiAJCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCiAJCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwNH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMX0sCisJCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAogCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDgzfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgwYX0sCkBAIC02MDksNyArNjA5LDcgQEAKIAkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDA0fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAxfSwKKwkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTF9LAogCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDFmfSwKQEAgLTY1MSw3ICs2NTEsNyBAQAogCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAogCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAogCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDR9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDB9LAorCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzB9LAogCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI1fSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHhkNX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4NjN9LApAQCAtNjkzLDcgKzY5Myw3IEBACiAJCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCiAJCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwM30sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMX0sCisJCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MjR9LAogCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkyfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhlOH0sCkBAIC03MzQsNyArNzM0LDcgQEAKIAkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBmfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAwfSwKKwkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMwfSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE3X0hMT09QX01BWFNUQVRFLCAweDhifSwKIAkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZX0sCiAJCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OGJ9LApAQCAtNzYzLDExICs3NjMsMTEgQEAKIHZvaWQgdG02MDAwX2dldF9zdGRfcmVzKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQogewogCS8qIEN1cnJlbnRseSwgdGhvc2UgYXJlIHRoZSBvbmx5IHN1cHBvcnRlZCByZXNvbHRpb25zICovCi0JaWYgKGRldi0+bm9ybSAmIFY0TDJfU1REXzUyNV82MCkgeworCWlmIChkZXYtPm5vcm0gJiBWNEwyX1NURF81MjVfNjApCiAJCWRldi0+aGVpZ2h0ID0gNDgwOwotCX0gZWxzZSB7CisJZWxzZQogCQlkZXYtPmhlaWdodCA9IDU3NjsKLQl9CisKIAlkZXYtPndpZHRoID0gNzIwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtdXNiLWlzb2MuaAppbmRleCA1YTUwNDlhLi4xMzg3MTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXVzYi1pc29jLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAlpbnQJCQkJcG9zLCBzaXplLCBwa3RzaXplOwogCiAJCS8qIExhc3QgZmllbGQ6IE9ERCBvciBFVkVOPyAqLwotCWludAkJCQlmaWVsZDsKKwlpbnQJCQkJdmZpZWxkOwogCiAJCS8qIFN0b3JlcyBpbmNvbXBsZXRlIGNvbW1hbmRzICovCiAJdTMyCQkJCXRtcF9idWY7CkBAIC00Nyw3ICs0Nyw0IEBACiAKIAkJLyogU3RvcmVzIGFscmVhZHkgcmVxdWVzdGVkIGJ1ZmZlcnMgKi8KIAlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICAJKmJ1ZjsKLQotCQkvKiBTdG9yZXMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBmaWVsZHMgKi8KLQlpbnQJCQkJbmZpZWxkczsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC12aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtdmlkZW8uYwppbmRleCA1NmZhMzcxLi5jZTBhMDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC12aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXZpZGVvLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAogLyogRGVidWcgbGV2ZWwgKi8KIGludCB0bTYwMDBfZGVidWc7CitFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfZGVidWcpOwogCiAvKiBzdXBwb3J0ZWQgY29udHJvbHMgKi8KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdG02MDAwX3FjdHJsW10gPSB7CkBAIC0xNDksOCArMTUwLDYgQEAKIAogCS8qIENsZWFucyB1cCBidWZmZXIgLSBVc2VmdWxsIGZvciB0ZXN0aW5nIGZvciBmcmFtZS9VUkIgbG9zcyAqLwogCW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCYoKmJ1ZiktPnZiKTsKLS8vCWlmIChvdXRwKQotLy8JCW1lbXNldChvdXRwLCAwLCAoKmJ1ZiktPnZiLnNpemUpOwogCiAJcmV0dXJuOwogfQpAQCAtMTg2LDIzNiArMTg1LDE1MiBAQAogLyoKICAqIElkZW50aWZ5IHRoZSB0bTU2MDAvNjAwMCBidWZmZXIgaGVhZGVyIHR5cGUgYW5kIHByb3Blcmx5IGhhbmRsZXMKICAqLwotc3RhdGljIGludCBjb3B5X3BhY2tldChzdHJ1Y3QgdXJiICp1cmIsIHUzMiBoZWFkZXIsIHU4ICoqcHRyLCB1OCAqZW5kcCwKLQkJCXU4ICpvdXRfcCwgc3RydWN0IHRtNjAwMF9idWZmZXIgKipidWYpCi17Ci0Jc3RydWN0IHRtNjAwMF9kbWFxdWV1ZSAgKmRtYV9xID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gY29udGFpbmVyX29mKGRtYV9xLCBzdHJ1Y3QgdG02MDAwX2NvcmUsIHZpZHEpOwotCXU4IGM7Ci0JdW5zaWduZWQgaW50IGNtZCwgY3B5c2l6ZSwgcGt0c2l6ZSwgc2l6ZSwgZmllbGQsIGJsb2NrLCBsaW5lLCBwb3MgPSAwOwotCWludCByYyA9IDA7Ci0JLyogRklYTUU6IG1vdmUgdG8gdG02MDAwLWlzb2MgKi8KLQlzdGF0aWMgaW50IGxhc3RfbGluZSA9IC0yLCBzdGFydF9saW5lID0gLTIsIGxhc3RfZmllbGQgPSAtMjsKLQotCS8qIEZJWE1FOiB0aGlzIGlzIHRoZSBoYXJkY29kZWQgd2luZG93IHNpemUKLQkgKi8KLQl1bnNpZ25lZCBpbnQgbGluZXdpZHRoID0gKCpidWYpLT52Yi53aWR0aCA8PCAxOwotCi0JaWYgKCFkZXYtPmlzb2NfY3RsLmNtZCkgewotCQljID0gKGhlYWRlciA+PiAyNCkgJiAweGZmOwotCi0JCS8qIHNwbGl0IHRoZSBoZWFkZXIgZmllbGRzICovCi0JCXNpemUgID0gKChoZWFkZXIgJiAweDdlKSA8PCAxKTsKLQotCQlpZiAoc2l6ZSA+IDApCi0JCQlzaXplIC09IDQ7Ci0KLQkJYmxvY2sgPSAoaGVhZGVyID4+IDcpICYgMHhmOwotCQlmaWVsZCA9IChoZWFkZXIgPj4gMTEpICYgMHgxOwotCQlsaW5lICA9IChoZWFkZXIgPj4gMTIpICYgMHgxZmY7Ci0JCWNtZCAgID0gKGhlYWRlciA+PiAyMSkgJiAweDc7Ci0KLQkJLyogVmFsaWRhdGVzIGhlYWRlciBmaWVsZHMgKi8KLQkJaWYoc2l6ZSA+IFRNNjAwMF9VUkJfTVNHX0xFTikKLQkJCXNpemUgPSBUTTYwMDBfVVJCX01TR19MRU47Ci0KLQkJaWYgKGNtZCA9PSBUTTYwMDBfVVJCX01TR19WSURFTykgewotCQkJaWYgKChibG9jaysxKSpUTTYwMDBfVVJCX01TR19MRU4+bGluZXdpZHRoKQotCQkJCWNtZCA9IFRNNjAwMF9VUkJfTVNHX0VSUjsKLQotCQkJLyogRklYTUU6IE1vdW50cyB0aGUgaW1hZ2UgYXMgZmllbGQwK2ZpZWxkMQotCQkJICogSXQgc2hvdWxkLCBpbnN0ZWFkLCBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZAotCQkJICogZW50cmVsYWNlZCBvciBub24tZW50cmVsYWNlZCBtb2RlCi0JCQkgKi8KLQkJCXBvcyA9ICgobGluZSA8PCAxKSAtIGZpZWxkIC0gMSkgKiBsaW5ld2lkdGggKwotCQkJCWJsb2NrICogVE02MDAwX1VSQl9NU0dfTEVOOwotCi0JCQkvKiBEb24ndCBhbGxvdyB0byB3cml0ZSBvdXQgb2YgdGhlIGJ1ZmZlciAqLwotCQkJaWYgKHBvcytUTTYwMDBfVVJCX01TR19MRU4gPiAoKmJ1ZiktPnZiLnNpemUpIHsKLQkJCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLAotCQkJCQkiRVJSOiBzaXplPSVkLCBudW09JWQsIGxpbmU9JWQsICIKLQkJCQkJImZpZWxkPSVkXG4iLAotCQkJCQlzaXplLCBibG9jaywgbGluZSwgZmllbGQpOwotCi0JCQkJY21kID0gVE02MDAwX1VSQl9NU0dfRVJSOwotCQkJfQotCQl9IGVsc2UgewotCQkJcG9zPTA7Ci0JCX0KLQotCQkvKiBQcmludHMgZGVidWcgaW5mbyAqLwotCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLCAic2l6ZT0lZCwgbnVtPSVkLCAiCi0JCQkJIiBsaW5lPSVkLCBmaWVsZD0lZFxuIiwKLQkJCQlzaXplLCBibG9jaywgbGluZSwgZmllbGQpOwotCi0JCWlmICgobGFzdF9saW5lIT1saW5lKSYmKGxhc3RfbGluZSsxIT1saW5lKSAmJgotCQkgICAgKGNtZCAhPSBUTTYwMDBfVVJCX01TR19FUlIpICkgIHsKLQkJCWlmIChjbWQgIT0gVE02MDAwX1VSQl9NU0dfVklERU8pICB7Ci0JCQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSVNPQywgICJjbWQ9JWQsICIKLQkJCQkJInNpemU9JWQsIG51bT0lZCwgbGluZT0lZCwgZmllbGQ9JWRcbiIsCi0JCQkJCWNtZCwgc2l6ZSwgYmxvY2ssIGxpbmUsIGZpZWxkKTsKLQkJCX0KLQkJCWlmIChzdGFydF9saW5lPDApCi0JCQkJc3RhcnRfbGluZT1sYXN0X2xpbmU7Ci0JCQkvKiBQcmludHMgZGVidWcgaW5mbyAqLwotCQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSVNPQywgImxpbmVzPSAlZC0lZCwgIgotCQkJCQkiZmllbGQ9JWRcbiIsCi0JCQkJCXN0YXJ0X2xpbmUsIGxhc3RfbGluZSwgZmllbGQpOwotCi0JCQlpZiAoKHN0YXJ0X2xpbmU8NiAmJiBsYXN0X2xpbmU+MjAwKSAmJgotCQkJCShsYXN0X2ZpZWxkICE9IGZpZWxkKSApIHsKLQotCQkJCWRldi0+aXNvY19jdGwubmZpZWxkcysrOwotCQkJCWlmIChkZXYtPmlzb2NfY3RsLm5maWVsZHM+PTIpIHsKLQkJCQkJZGV2LT5pc29jX2N0bC5uZmllbGRzPTA7Ci0KLQkJCQkJLyogQW5ub3VuY2VzIHRoYXQgYSBuZXcgYnVmZmVyIHdlcmUgZmlsbGVkICovCi0JCQkJCWJ1ZmZlcl9maWxsZWQgKGRldiwgZG1hX3EsICpidWYpOwotCQkJCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLAotCQkJCQkJCSJuZXcgYnVmZmVyIGZpbGxlZFxuIik7Ci0JCQkJCWdldF9uZXh0X2J1ZiAoZG1hX3EsIGJ1Zik7Ci0JCQkJCWlmICghKmJ1ZikKLQkJCQkJCXJldHVybiByYzsKLQkJCQkJb3V0X3AgPSB2aWRlb2J1Zl90b192bWFsbG9jKCYoKCpidWYpLT52YikpOwotCQkJCQlpZiAoIW91dF9wKQotCQkJCQkJcmV0dXJuIHJjOwotCi0JCQkJCXBvcyA9IGRldi0+aXNvY19jdGwucG9zID0gMDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN0YXJ0X2xpbmU9bGluZTsKLQkJCWxhc3RfZmllbGQ9ZmllbGQ7Ci0JCX0KLQkJaWYgKGNtZCA9PSBUTTYwMDBfVVJCX01TR19WSURFTykKLQkJCWxhc3RfbGluZSA9IGxpbmU7Ci0KLQkJcGt0c2l6ZSA9IFRNNjAwMF9VUkJfTVNHX0xFTjsKLQl9IGVsc2UgewotCQkvKiBDb250aW51ZSB0aGUgbGFzdCBjb3B5ICovCi0JCWNtZCA9IGRldi0+aXNvY19jdGwuY21kOwotCQlzaXplPSBkZXYtPmlzb2NfY3RsLnNpemU7Ci0JCXBvcyA9IGRldi0+aXNvY19jdGwucG9zOwotCQlwa3RzaXplID0gZGV2LT5pc29jX2N0bC5wa3RzaXplOwotCX0KLQotCWNweXNpemUgPSAoZW5kcC0oKnB0cikgPiBzaXplKSA/IHNpemUgOiBlbmRwIC0gKnB0cjsKLQotCWlmIChjcHlzaXplKSB7Ci0JCS8qIGhhbmRsZXMgZWFjaCBkaWZmZXJlbnQgVVJCIG1lc3NhZ2UgKi8KLQkJc3dpdGNoKGNtZCkgewotCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgotCQkJLyogRmlsbHMgdmlkZW8gYnVmZmVyICovCi0JCQltZW1jcHkoJm91dF9wW3Bvc10sICpwdHIsIGNweXNpemUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX1VSQl9NU0dfUFRTOgotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86Ci0JCQkvKiBOZWVkIHNvbWUgY29kZSB0byBwcm9jZXNzIGF1ZGlvICovCi0JCQlwcmludGsgKCIlbGQ6IGNtZD0lcywgc2l6ZT0lZFxuIiwgamlmZmllcywKLQkJCQl0bTYwMDBfbXNnX3R5cGVbY21kXSxzaXplKTsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZHByaW50ayAoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJjbWQ9JXMsIHNpemU9JWRcbiIsCi0JCQkJCQl0bTYwMDBfbXNnX3R5cGVbY21kXSxzaXplKTsKLQkJfQotCX0KLQlpZiAoY3B5c2l6ZTxzaXplKSB7Ci0JCS8qIEVuZCBvZiBVUkIgcGFja2V0LCBidXQgY21kIHByb2Nlc3NpbmcgaXMgbm90Ci0JCSAqIGNvbXBsZXRlLiBQcmVzZXJ2ZSB0aGUgc3RhdGUgZm9yIGEgbmV4dCBwYWNrZXQKLQkJICovCi0JCWRldi0+aXNvY19jdGwucG9zID0gcG9zK2NweXNpemU7Ci0JCWRldi0+aXNvY19jdGwuc2l6ZT0gc2l6ZS1jcHlzaXplOwotCQlkZXYtPmlzb2NfY3RsLmNtZCA9IGNtZDsKLQkJZGV2LT5pc29jX2N0bC5wa3RzaXplID0gcGt0c2l6ZS1jcHlzaXplOwotCQkoKnB0cikrPWNweXNpemU7Ci0JfSBlbHNlIHsKLQkJZGV2LT5pc29jX2N0bC5jbWQgPSAwOwotCQkoKnB0cikrPXBrdHNpemU7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGNvcHlfc3RyZWFtcyh1OCAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHRtNjAwMF9kbWFxdWV1ZSAgKmRtYV9xID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2PSBjb250YWluZXJfb2YoZG1hX3Esc3RydWN0IHRtNjAwMF9jb3JlLHZpZHEpOwotCXU4ICpwdHI9ZGF0YSwgKmVuZHA9ZGF0YStsZW47CisJdTggKnB0cj1kYXRhLCAqZW5kcD1kYXRhK2xlbiwgYzsKIAl1bnNpZ25lZCBsb25nIGhlYWRlcj0wOwogCWludCByYz0wOwotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICpidWY7Ci0JY2hhciAqb3V0cCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNtZCwgY3B5c2l6ZSwgcGt0c2l6ZSwgc2l6ZSwgZmllbGQsIGJsb2NrLCBsaW5lLCBwb3MgPSAwOworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICp2YnVmOworCWNoYXIgKnZvdXRwID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbGluZXdpZHRoOwogCi0JZ2V0X25leHRfYnVmKGRtYV9xLCAmYnVmKTsKLQlpZiAoYnVmKQotCQlvdXRwID0gdmlkZW9idWZfdG9fdm1hbGxvYygmYnVmLT52Yik7Ci0KLQlpZiAoIW91dHApCisJLyogZ2V0IHZpZGVvIGJ1ZmZlciAqLworCWdldF9uZXh0X2J1ZiAoZG1hX3EsICZ2YnVmKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiByYzsKKwl2b3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJnZidWYtPnZiKTsKKwlpZiAoIXZvdXRwKQogCQlyZXR1cm4gMDsKIAotCWZvciAocHRyPWRhdGE7IHB0cjxlbmRwOykgeworCWZvciAocHRyID0gZGF0YTsgcHRyIDwgZW5kcDspIHsKIAkJaWYgKCFkZXYtPmlzb2NfY3RsLmNtZCkgewotCQkJdTggKnA9KHU4ICopJmRldi0+aXNvY19jdGwudG1wX2J1ZjsKLQkJCS8qIEZJWE1FOiBUaGlzIHNlZW1zIHZlcnkgY29tcGxleAotCQkJICogSXQganVzdCByZWNvdmVycyB1cCB0byAzIGJ5dGVzIG9mIHRoZSBoZWFkZXIgdGhhdAotCQkJICogbWlnaHQgYmUgYXQgdGhlIHByZXZpb3VzIHBhY2tldAotCQkJICovCi0JCQlpZiAoZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbikgewotCQkJCXdoaWxlIChkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuKSB7Ci0JCQkJCWlmICggKihwdHIrMy1kZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuKSA9PSAweDQ3KSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwKys7Ci0JCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4tLTsKLQkJCQl9Ci0JCQkJaWYgKGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4pIHsKLQkJCQkJbWVtY3B5KCZoZWFkZXIsIHAsCi0JCQkJCQlkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuKTsKLQkJCQkJbWVtY3B5KCh1OCAqKSZoZWFkZXIgKworCQkJLyogSGVhZGVyICovCisJCQlpZiAoZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA+IDApIHsKKwkJCQkvKiBmcm9tIGxhc3QgdXJiIG9yIHBhY2tldCAqLworCQkJCWhlYWRlciA9IGRldi0+aXNvY19jdGwudG1wX2J1ZjsKKwkJCQlpZiAoNCAtIGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4gPiAwKSB7CisJCQkJCW1lbWNweSAoKHU4ICopJmhlYWRlciArCiAJCQkJCQlkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuLAogCQkJCQkJcHRyLAogCQkJCQkJNCAtIGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4pOwogCQkJCQlwdHIgKz0gNCAtIGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW47Ci0JCQkJCWdvdG8gSEVBREVSOwogCQkJCX0KLQkJCX0KLQkJCS8qIFNlZWsgZm9yIHN5bmMgKi8KLQkJCWZvciAoO3B0cjxlbmRwLTM7cHRyKyspIHsKLQkJCQlpZiAoKihwdHIrMyk9PTB4NDcpCi0JCQkJCWJyZWFrOworCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocHRyICsgMyA+PSBlbmRwKSB7CisJCQkJCS8qIGhhdmUgaW5jb21wbGV0ZSBoZWFkZXIgKi8KKwkJCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA9IGVuZHAgLSBwdHI7CisJCQkJCW1lbWNweSAoJmRldi0+aXNvY19jdGwudG1wX2J1ZiwgcHRyLAorCQkJCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbik7CisJCQkJCXJldHVybiByYzsKKwkJCQl9CisJCQkJLyogU2VlayBmb3Igc3luYyAqLworCQkJCWZvciAoOyBwdHIgPCBlbmRwIC0gMzsgcHRyKyspIHsKKwkJCQkJaWYgKCoocHRyICsgMykgPT0gMHg0NykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBHZXQgbWVzc2FnZSBoZWFkZXIgKi8KKwkJCQloZWFkZXIgPSAqKHVuc2lnbmVkIGxvbmcgKilwdHI7CisJCQkJcHRyICs9IDQ7CiAJCQl9CiAKLQkJCWlmIChwdHIrMz49ZW5kcCkgewotCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW49ZW5kcC1wdHI7Ci0JCQkJbWVtY3B5ICgmZGV2LT5pc29jX2N0bC50bXBfYnVmLHB0ciwKLQkJCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbik7Ci0JCQkJZGV2LT5pc29jX2N0bC5jbWQ9MDsKLQkJCQlyZXR1cm4gcmM7CisJCQkvKiBzcGxpdCB0aGUgaGVhZGVyIGZpZWxkcyAqLworCQkJYyA9IChoZWFkZXIgPj4gMjQpICYgMHhmZjsKKwkJCXNpemUgPSAoKGhlYWRlciAmIDB4N2UpIDw8IDEpOworCQkJaWYgKHNpemUgPiAwKQorCQkJCXNpemUgLT0gNDsKKwkJCWJsb2NrID0gKGhlYWRlciA+PiA3KSAmIDB4ZjsKKwkJCWZpZWxkID0gKGhlYWRlciA+PiAxMSkgJiAweDE7CisJCQlsaW5lICA9IChoZWFkZXIgPj4gMTIpICYgMHgxZmY7CisJCQljbWQgICA9IChoZWFkZXIgPj4gMjEpICYgMHg3OworCQkJLyogVmFsaWRhdGVzIGhhZWRlciBmaWVsZHMgKi8KKwkJCWlmIChzaXplID4gVE02MDAwX1VSQl9NU0dfTEVOKQorCQkJCXNpemUgPSBUTTYwMDBfVVJCX01TR19MRU47CisJCQlwa3RzaXplID0gVE02MDAwX1VSQl9NU0dfTEVOOworCQkJLyogY2FsY3VsYXRlIHBvc2l0aW9uIGluIGJ1ZmZlcgorCQkJICogYW5kIGNoYW5nZSB0aGUgYnVmZmVyCisJCQkgKi8KKwkJCXN3aXRjaCAoY21kKSB7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgorCQkJCWlmICgoZGV2LT5pc29jX2N0bC52ZmllbGQgIT0gZmllbGQpICYmCisJCQkJCShmaWVsZCA9PSAxKSkgeworCQkJCQkvKiBBbm5vdW5jZXMgdGhhdCBhIG5ldyBidWZmZXIKKwkJCQkJICogd2VyZSBmaWxsZWQKKwkJCQkJICovCisJCQkJCWJ1ZmZlcl9maWxsZWQgKGRldiwgZG1hX3EsIHZidWYpOworCQkJCQlkcHJpbnRrIChkZXYsIFY0TDJfREVCVUdfSVNPQywKKwkJCQkJCQkibmV3IGJ1ZmZlciBmaWxsZWRcbiIpOworCQkJCQlnZXRfbmV4dF9idWYgKGRtYV9xLCAmdmJ1Zik7CisJCQkJCWlmICghdmJ1ZikKKwkJCQkJCXJldHVybiByYzsKKwkJCQkJdm91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jICgmdmJ1Zi0+dmIpOworCQkJCQlpZiAoIXZvdXRwKQorCQkJCQkJcmV0dXJuIHJjOworCQkJCQltZW1zZXQodm91dHAsIDAsIHZidWYtPnZiLnNpemUpOworCQkJCX0KKwkJCQlsaW5ld2lkdGggPSB2YnVmLT52Yi53aWR0aCA8PCAxOworCQkJCXBvcyA9ICgobGluZSA8PCAxKSAtIGZpZWxkIC0gMSkgKiBsaW5ld2lkdGggKworCQkJCQlibG9jayAqIFRNNjAwMF9VUkJfTVNHX0xFTjsKKwkJCQkvKiBEb24ndCBhbGxvdyB0byB3cml0ZSBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCQkJCWlmIChwb3MgKyBzaXplID4gdmJ1Zi0+dmIuc2l6ZSkKKwkJCQkJY21kID0gVE02MDAwX1VSQl9NU0dfRVJSOworCQkJCWRldi0+aXNvY19jdGwudmZpZWxkID0gZmllbGQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1BUUzoKKwkJCQlzaXplID0gcGt0c2l6ZTsJCS8qIFNpemUgaXMgYWx3YXlzIDE4MCBieXRlcyAqLworCQkJCWJyZWFrOwogCQkJfQotCi0JCQkvKiBHZXQgbWVzc2FnZSBoZWFkZXIgKi8KLQkJCWhlYWRlcj0qKHVuc2lnbmVkIGxvbmcgKilwdHI7Ci0JCQlwdHIrPTQ7CisJCX0gZWxzZSB7CisJCQkvKiBDb250aW51ZSB0aGUgbGFzdCBjb3B5ICovCisJCQljbWQgPSBkZXYtPmlzb2NfY3RsLmNtZDsKKwkJCXNpemUgPSBkZXYtPmlzb2NfY3RsLnNpemU7CisJCQlwb3MgPSBkZXYtPmlzb2NfY3RsLnBvczsKKwkJCXBrdHNpemUgPSBkZXYtPmlzb2NfY3RsLnBrdHNpemU7CiAJCX0KLUhFQURFUjoKLQkJLyogQ29weSBvciBjb250aW51ZSBsYXN0IGNvcHkgKi8KLQkJcmM9Y29weV9wYWNrZXQodXJiLGhlYWRlciwmcHRyLGVuZHAsb3V0cCwmYnVmKTsKLQkJaWYgKHJjPDApIHsKLQkJCWJ1Zj1OVUxMOwotCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGJ1ZmZlciB1bmRlcnJ1biBhdCAlbGRcbiIsCi0JCQkJCWppZmZpZXMpOwotCQkJcmV0dXJuIHJjOworCQljcHlzaXplID0gKGVuZHAgLSBwdHIgPiBzaXplKSA/IHNpemUgOiBlbmRwIC0gcHRyOworCQlpZiAoY3B5c2l6ZSkgeworCQkJLyogY29weSBkYXRhIGluIGRpZmZlcmVudCBidWZmZXJzICovCisJCQlzd2l0Y2ggKGNtZCkgeworCQkJY2FzZSBUTTYwMDBfVVJCX01TR19WSURFTzoKKwkJCQkvKiBGaWxscyB2aWRlbyBidWZmZXIgKi8KKwkJCQlpZiAodmJ1ZikKKwkJCQkJbWVtY3B5ICgmdm91dHBbcG9zXSwgcHRyLCBjcHlzaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86CisJCQkJdG02MDAwX2NhbGxfZmlsbGJ1ZihkZXYsIFRNNjAwMF9BVURJTywgcHRyLCBjcHlzaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfVkJJOgorCQkJCS8qIE5lZWQgc29tZSBjb2RlIHRvIGNvcHkgdmJpIGJ1ZmZlciAqLworCQkJCWJyZWFrOworCQkJY2FzZSBUTTYwMDBfVVJCX01TR19QVFM6CisJCQkJLyogTmVlZCBzb21lIGNvZGUgdG8gY29weSBwdHMgKi8KKwkJCQlicmVhazsKKwkJCX0KIAkJfQotCQlpZiAoIWJ1ZikKLQkJCXJldHVybiAwOworCQlpZiAocHRyICsgcGt0c2l6ZSA+IGVuZHApIHsKKwkJCS8qIEVuZCBvZiBVUkIgcGFja2V0LCBidXQgY21kIHByb2Nlc3NpbmcgaXMgbm90CisJCQkgKiBjb21wbGV0ZS4gUHJlc2VydmUgdGhlIHN0YXRlIGZvciBhIG5leHQgcGFja2V0CisJCQkgKi8KKwkJCWRldi0+aXNvY19jdGwucG9zID0gcG9zICsgY3B5c2l6ZTsKKwkJCWRldi0+aXNvY19jdGwuc2l6ZSA9IHNpemUgLSBjcHlzaXplOworCQkJZGV2LT5pc29jX2N0bC5jbWQgPSBjbWQ7CisJCQlkZXYtPmlzb2NfY3RsLnBrdHNpemUgPSBwa3RzaXplIC0gKGVuZHAgLSBwdHIpOworCQkJcHRyICs9IGVuZHAgLSBwdHI7CisJCX0gZWxzZSB7CisJCQlkZXYtPmlzb2NfY3RsLmNtZCA9IDA7CisJCQlwdHIgKz0gcGt0c2l6ZTsKKwkJfQogCX0KLQogCXJldHVybiAwOwogfQorCiAvKgogICogSWRlbnRpZnkgdGhlIHRtNTYwMC82MDAwIGJ1ZmZlciBoZWFkZXIgdHlwZSBhbmQgcHJvcGVybHkgaGFuZGxlcwogICovCkBAIC01MTAsNyArNDI1LDYgQEAKIHsKIAlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHRtNjAwMF9jb3JlICpkZXY9IGNvbnRhaW5lcl9vZihkbWFfcSxzdHJ1Y3QgdG02MDAwX2NvcmUsdmlkcSk7Ci0Jc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZjsKIAlpbnQgaSwgbGVuPTAsIHJjPTEsIHN0YXR1czsKIAljaGFyICpwOwogCkBAIC01ODUsNyArNDk5LDYgQEAKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJaW50IGk7CiAKLQlkZXYtPmlzb2NfY3RsLm5maWVsZHMgPSAtMTsKIAlkZXYtPmlzb2NfY3RsLmJ1ZiA9IE5VTEw7CiAJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmI9ZGV2LT5pc29jX2N0bC51cmJbaV07CkBAIC02MTAsOCArNTIzLDYgQEAKIAlkZXYtPmlzb2NfY3RsLnVyYj1OVUxMOwogCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyPU5VTEw7CiAJZGV2LT5pc29jX2N0bC5udW1fYnVmcyA9IDA7Ci0KLQlkZXYtPmlzb2NfY3RsLm51bV9idWZzPTA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAuaAppbmRleCA3YmJhZjI2Li4xZWMxYmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLmgKQEAgLTIwLDggKzIwLDggQEAKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLS8vIFVzZSB0aGUgdG02MDAwLWhhY2ssIGluc3RlYWQgb2YgdGhlIHByb3BlciBpbml0aWFsaXphdGlvbiBjb2RlCi0vLyNkZWZpbmUgSEFDSyAxCisvKiBVc2UgdGhlIHRtNjAwMC1oYWNrLCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gY29kZSBpKi8KKy8qICNkZWZpbmUgSEFDSyAxICovCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpAQCAtOTgsNyArOTgsNyBAQAogfTsKIAogZW51bSB0bTYwMDBfbW9kZSB7Ci0JVE02MDAwX01PREVfVU5LTk9XTj0wLAorCVRNNjAwMF9NT0RFX1VOS05PV04gPSAwLAogCVRNNjAwMF9NT0RFX0FOQUxPRywKIAlUTTYwMDBfTU9ERV9ESUdJVEFMLAogfTsKQEAgLTEyOCwxMCArMTI4LDIxIEBACiAJc3RydWN0IGR2Yl9mcm9udGVuZAkqZnJvbnRlbmQ7CiAJc3RydWN0IGRteGRldgkJZG14ZGV2OwogCXVuc2lnbmVkIGludAkJc3RyZWFtczsKLQlzdHJ1Y3QgdXJiIAkJKmJ1bGtfdXJiOworCXN0cnVjdCB1cmIJCSpidWxrX3VyYjsKIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogfTsKIAorc3RydWN0IHNuZF90bTYwMDBfY2FyZCB7CisJc3RydWN0IHNuZF9jYXJkCQkJKmNhcmQ7CisJc3BpbmxvY2tfdAkJCXJlZ19sb2NrOworCXN0cnVjdCB0bTYwMDBfY29yZQkJKmNvcmU7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtCSpzdWJzdHJlYW07CisKKwkvKiB0ZW1wb3JhcnkgZGF0YSBmb3IgYnVmZmVyIGZpbGwgcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkCQkJYnVmX3BvczsKKwl1bnNpZ25lZAkJCXBlcmlvZF9wb3M7Cit9OworCiBzdHJ1Y3QgdG02MDAwX2VuZHBvaW50IHsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVuZHA7CiAJX191OAkJCQliSW50ZXJmYWNlTnVtYmVyOwpAQCAtMTQ3LDcgKzE1OCw3IEBACiAJZW51bSB0bTYwMDBfZGV2dHlwZQkJZGV2X3R5cGU7CS8qIHR5cGUgb2YgZGV2aWNlICovCiAKIAl2NGwyX3N0ZF9pZCAgICAgICAgICAgICAgICAgICAgIG5vcm07ICAgICAgICAgICAvKiBDdXJyZW50IG5vcm0gKi8KLQlpbnQJCQkJd2lkdGgsaGVpZ2h0OwkvKiBTZWxlY3RlZCByZXNvbHV0aW9uICovCisJaW50CQkJCXdpZHRoLCBoZWlnaHQ7CS8qIFNlbGVjdGVkIHJlc29sdXRpb24gKi8KIAogCWVudW0gdG02MDAwX2NvcmVfc3RhdGUJCXN0YXRlOwogCkBAIC0xNjAsNiArMTcxLDggQEAKIAogCXN0cnVjdCB0bTYwMDBfZ3BpbwkJZ3BpbzsKIAorCWNoYXIJCQkJKmlyX2NvZGVzOworCiAJLyogRGVtb2R1bGF0b3IgY29uZmlndXJhdGlvbiAqLwogCWludAkJCQlkZW1vZF9hZGRyOwkvKiBkZW1vZHVsYXRvciBhZGRyZXNzICovCiAKQEAgLTE5MCw2ICsyMDMsMTEgQEAKIAkvKiBEVkItVCBzdXBwb3J0ICovCiAJc3RydWN0IHRtNjAwMF9kdmIJCSpkdmI7CiAKKwkvKiBhdWRpbyBzdXBwb3J0ICovCisJc3RydWN0IHNuZF90bTYwMDBfY2FyZAkJKmFkZXY7CisKKwlzdHJ1Y3QgdG02MDAwX0lSCQkqaXI7CisKIAkvKiBsb2NrcyAqLwogCXN0cnVjdCBtdXRleAkJCWxvY2s7CiAKQEAgLTE5Nyw2ICsyMTUsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlCQkqdWRldjsJCS8qIHRoZSB1c2IgZGV2aWNlICovCiAKIAlzdHJ1Y3QgdG02MDAwX2VuZHBvaW50CQlidWxrX2luLCBidWxrX291dCwgaXNvY19pbiwgaXNvY19vdXQ7CisJc3RydWN0IHRtNjAwMF9lbmRwb2ludAkJaW50X2luLCBpbnRfb3V0OwogCiAJLyogc2NhbGVyIT0wIGlmIHNjYWxlciBpcyBhY3RpdmUqLwogCWludAkJCQlzY2FsZXI7CkBAIC0yMDcsMTQgKzIyNiwxOCBAQAogCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgc2xvY2s7CiB9OwogCi0jZGVmaW5lIFRNNjAwMF9BVURJTyAweDEwCitlbnVtIHRtNjAwMF9vcHNfdHlwZSB7CisJVE02MDAwX0FVRElPID0gMHgxMCwKKwlUTTYwMDBfRFZCID0gMHgyMCwKK307CiAKIHN0cnVjdCB0bTYwMDBfb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5leHQ7CiAJY2hhcgkJCSpuYW1lOwotCWludAkJCWlkOworCWVudW0gdG02MDAwX29wc190eXBlCXR5cGU7CiAJaW50ICgqaW5pdCkoc3RydWN0IHRtNjAwMF9jb3JlICopOwogCWludCAoKmZpbmkpKHN0cnVjdCB0bTYwMDBfY29yZSAqKTsKKwlpbnQgKCpmaWxsYnVmKShzdHJ1Y3QgdG02MDAwX2NvcmUgKiwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CiB9OwogCiBzdHJ1Y3QgdG02MDAwX2ZoIHsKQEAgLTIyMiw3ICsyNDUsNyBAQAogCiAJLyogdmlkZW8gY2FwdHVyZSAqLwogCXN0cnVjdCB0bTYwMDBfZm10ICAgICAgICAgICAgKmZtdDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7CiAJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgICB2Yl92aWRxOwogCiAJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgICAgICB0eXBlOwpAQCAtMjM0LDI4ICsyNTcsMjQgQEAKIAogLyogSW4gdG02MDAwLWNhcmRzLmMgKi8KIAotaW50IHRtNjAwMF90dW5lcl9jYWxsYmFjayAodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7Ci1pbnQgdG02MDAwX3hjNTAwMF9jYWxsYmFjayAodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CitpbnQgdG02MDAwX3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpOworaW50IHRtNjAwMF94YzUwMDBfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CiBpbnQgdG02MDAwX2NhcmRzX3NldHVwKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKIAogLyogSW4gdG02MDAwLWNvcmUuYyAqLwogCi1pbnQgdG02MDAwX3JlYWRfd3JpdGVfdXNiIChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxdHlwZSwgdTggcmVxLAoraW50IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxdHlwZSwgdTggcmVxLAogCQkJICAgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpidWYsIHUxNiBsZW4pOwotaW50IHRtNjAwMF9nZXRfcmVnIChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitpbnQgdG02MDAwX2dldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpOwogaW50IHRtNjAwMF9nZXRfcmVnMTYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpOwogaW50IHRtNjAwMF9nZXRfcmVnMzIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpOwotaW50IHRtNjAwMF9zZXRfcmVnIChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitpbnQgdG02MDAwX3NldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpOwogaW50IHRtNjAwMF9pMmNfcmVzZXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHUxNiB0c2xlZXApOworaW50IHRtNjAwMF9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKIAotaW50IHRtNjAwMF9pbml0IChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLWludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZSAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZSAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9zZXRfYXVkaW9fYml0cmF0ZSAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKTsKLQotaW50IHRtNjAwMF9kdmJfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfZHZiX3VucmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9pbml0X2FuYWxvZ19tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfaW5pdF9kaWdpdGFsX21vZGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9zZXRfYXVkaW9fYml0cmF0ZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IGJpdHJhdGUpOwogCiBpbnQgdG02MDAwX3Y0bDJfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwogaW50IHRtNjAwMF92NGwyX3VucmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwpAQCAtMjY4LDEwICsyODcsMTMgQEAKIHZvaWQgdG02MDAwX3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpOwogdm9pZCB0bTYwMDBfaW5pdF9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwogdm9pZCB0bTYwMDBfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfY2FsbF9maWxsYnVmKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBlbnVtIHRtNjAwMF9vcHNfdHlwZSB0eXBlLAorCQkJY2hhciAqYnVmLCBpbnQgc2l6ZSk7CisKIAogLyogSW4gdG02MDAwLXN0ZHMuYyAqLwogdm9pZCB0bTYwMDBfZ2V0X3N0ZF9yZXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9zZXRfc3RhbmRhcmQgKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB2NGwyX3N0ZF9pZCAqbm9ybSk7CitpbnQgdG02MDAwX3NldF9zdGFuZGFyZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdjRsMl9zdGRfaWQgKm5vcm0pOwogCiAvKiBJbiB0bTYwMDAtaTJjLmMgKi8KIGludCB0bTYwMDBfaTJjX3JlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKQEAgLTI4NSwxNCArMzA3LDE0IEBACiAJCQkgICBlbnVtIHY0bDJfYnVmX3R5cGUgaSk7CiBpbnQgdG02MDAwX3ZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpOwotaW50IHRtNjAwMF92aWRpb2NfcmVxYnVmcyAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmIpOwotaW50IHRtNjAwMF92aWRpb2NfcXVlcnlidWYgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7Ci1pbnQgdG02MDAwX3ZpZGlvY19xYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKLWludCB0bTYwMDBfdmlkaW9jX2RxYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKK2ludCB0bTYwMDBfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYik7CitpbnQgdG02MDAwX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CitpbnQgdG02MDAwX3ZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOworaW50IHRtNjAwMF92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CiBzc2l6ZV90IHRtNjAwMF92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCi0JCQkgbG9mZl90ICogZl9wb3MpOworCQkJIGxvZmZfdCAqZl9wb3MpOwogdW5zaWduZWQgaW50IHRtNjAwMF92NGwyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOwogaW50IHRtNjAwMF9xdWV1ZV9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKQEAgLTMwMCw2ICszMjIsMTAgQEAKIC8qIEluIHRtNjAwMC1hbHNhLmMgKi8KIC8qaW50IHRtNjAwMF9hdWRpb19pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgaWR4KTsqLwogCisvKiBJbiB0bTYwMDAtaW5wdXQuYyAqLworaW50IHRtNjAwMF9pcl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfaXJfZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Cit2b2lkIHRtNjAwMF9pcl93YWl0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBzdGF0ZSk7CiAKIC8qIERlYnVnIHN0dWZmICovCiAKQEAgLTMwNyw3ICszMzMsNyBAQAogCiAjZGVmaW5lIGRwcmludGsoZGV2LCBsZXZlbCwgZm10LCBhcmcuLi4pIGRvIHtcCiAJaWYgKHRtNjAwMF9kZWJ1ZyAmIGxldmVsKSBcCi0JCXByaW50ayhLRVJOX0lORk8gIiglbHUpICVzICVzIDoiZm10LCBqaWZmaWVzLCAJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKCVsdSkgJXMgJXMgOiJmbXQsIGppZmZpZXMsIFwKIAkJCSBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBWNEwyX0RFQlVHX1JFRwkJMHgwMDA0CkBAIC0zMjAsNSArMzQ2LDMgQEAKICNkZWZpbmUgdG02MDAwX2VycihmbXQsIGFyZy4uLikgZG8ge1wKIAlwcmludGsoS0VSTl9FUlIgInRtNjAwMCAlcyA6ImZtdCwgXAogCQlfX0ZVTkNUSU9OX18gLCAjI2FyZyk7IH0gd2hpbGUgKDApCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKaW5kZXggMDIyZDA2NC4uMzBkYmZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCkBAIC0yNSw2ICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogCisjZGVmaW5lIFNUVUJfQlVTSURfT1RIRVIgMAorI2RlZmluZSBTVFVCX0JVU0lEX1JFTU9WIDEKKyNkZWZpbmUgU1RVQl9CVVNJRF9BRERFRCAyCisjZGVmaW5lIFNUVUJfQlVTSURfQUxMT0MgMworCiBzdHJ1Y3Qgc3R1Yl9kZXZpY2UgewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtNzIsNiArNzcsMTQgQEAKIAlfX3UzMiBzdGF0dXM7CiB9OwogCisjZGVmaW5lIEJVU0lEX1NJWkUgMjAKK3N0cnVjdCBidXNfaWRfcHJpdiB7CisJY2hhciBuYW1lW0JVU0lEX1NJWkVdOworCWNoYXIgc3RhdHVzOworCWludCBpbnRlcmZfY291bnQ7CisJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2OworCWNoYXIgc2h1dGRvd25fYnVzaWQ7Cit9OwogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnN0dWJfcHJpdl9jYWNoZTsKIApAQCAtOTEsNSArMTA0LDcgQEAKIHZvaWQgc3R1Yl9lbnF1ZXVlX3JldF91bmxpbmsoc3RydWN0IHN0dWJfZGV2aWNlICosIF9fdTMyLCBfX3UzMik7CiAKIC8qIHN0dWJfbWFpbi5jICovCi1pbnQgbWF0Y2hfYnVzaWQoY29uc3QgY2hhciAqYnVzaWQpOworc3RydWN0IGJ1c19pZF9wcml2ICpnZXRfYnVzaWRfcHJpdihjb25zdCBjaGFyICpidXNpZCk7CitpbnQgZGVsX21hdGNoX2J1c2lkKGNoYXIgKmJ1c2lkKTsKKwogdm9pZCBzdHViX2RldmljZV9jbGVhbnVwX3VyYnMoc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKaW5kZXggM2Y5NTYwNS4uYjZiNzUzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKQEAgLTM5MywxMSArMzkzLDE0IEBACiAJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gTlVMTDsKIAljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoaW50ZXJmYWNlLT5kZXYucGFyZW50KTsKIAlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgYnVzX2lkX3ByaXYgKmJ1c2lkX3ByaXY7CiAKIAlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIkVudGVyXG4iKTsKIAogCS8qIGNoZWNrIHdlIHNob3VsZCBjbGFpbSBvciBub3QgYnkgYnVzaWRfdGFibGUgKi8KLQlpZiAobWF0Y2hfYnVzaWQodWRldl9idXNpZCkpIHsKKwlidXNpZF9wcml2ID0gZ2V0X2J1c2lkX3ByaXYodWRldl9idXNpZCk7CisJaWYgKCFidXNpZF9wcml2ICB8fCAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfUkVNT1YpIHx8CisJCQkgICAgIChidXNpZF9wcml2LT5zdGF0dXMgPT0gU1RVQl9CVVNJRF9PVEhFUikpIHsKIAkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAogCQkJICJ0aGlzIGRldmljZSAlcyBpcyBub3QgaW4gbWF0Y2hfYnVzaWQgdGFibGUuIHNraXAhXG4iLAogCQkJIHVkZXZfYnVzaWQpOwpAQCAtNDIyLDI4ICs0MjUsODAgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisKKwlpZiAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfQUxMT0MpIHsKKwkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50Kys7CisJCXNkZXYgPSBidXNpZF9wcml2LT5zZGV2OworCQlpZiAoIXNkZXYpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsCisJCSAiVVNCL0lQIFN0dWI6IHJlZ2lzdGVyIGEgbmV3IGludGVyZmFjZSAiCisJCSAiKGJ1cyAldSBkZXYgJXUgaWZuICV1KVxuIiwgdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSwKKwkJIGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisKKwkJLyogc2V0IHByaXZhdGUgZGF0YSB0byB1c2JfaW50ZXJmYWNlICovCisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzZGV2KTsKKworCQllcnIgPSBzdHViX2FkZF9maWxlcygmaW50ZXJmYWNlLT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgImNyZWF0ZSBzeXNmcyBmaWxlcyBmb3IgJXNcbiIsCisJCQkJdWRldl9idXNpZCk7CisJCQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJCQlidXNpZF9wcml2LT5pbnRlcmZfY291bnQtLTsKKworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwogCS8qIG9rLiB0aGlzIGlzIG15IGRldmljZS4gKi8KIAlzZGV2ID0gc3R1Yl9kZXZpY2VfYWxsb2MoaW50ZXJmYWNlKTsKIAlpZiAoIXNkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCL0lQIFN0dWI6IHJlZ2lzdGVyIGEgbmV3IGludGVyZmFjZSAiCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCL0lQIFN0dWI6IHJlZ2lzdGVyIGEgbmV3IGRldmljZSAiCiAJCSAiKGJ1cyAldSBkZXYgJXUgaWZuICV1KVxuIiwgdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSwKIAkJIGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKKwlidXNpZF9wcml2LT5pbnRlcmZfY291bnQgPSAwOworCWJ1c2lkX3ByaXYtPnNodXRkb3duX2J1c2lkID0gMDsKKwogCS8qIHNldCBwcml2YXRlIGRhdGEgdG8gdXNiX2ludGVyZmFjZSAqLwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzZGV2KTsKKwlidXNpZF9wcml2LT5pbnRlcmZfY291bnQrKzsKKworCWJ1c2lkX3ByaXYtPnNkZXYgPSBzZGV2OwogCiAJZXJyID0gc3R1Yl9hZGRfZmlsZXMoJmludGVyZmFjZS0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiY3JlYXRlIHN5c2ZzIGZpbGVzIGZvciAlc1xuIiwKIAkJCXVkZXZfYnVzaWQpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA9IDA7CisKKwkJYnVzaWRfcHJpdi0+c2RldiA9IE5VTEw7CisJCXN0dWJfZGV2aWNlX2ZyZWUoc2Rldik7CiAJCXJldHVybiBlcnI7CiAJfQorCWJ1c2lkX3ByaXYtPnN0YXR1cyA9IFNUVUJfQlVTSURfQUxMT0M7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2h1dGRvd25fYnVzaWQoc3RydWN0IGJ1c19pZF9wcml2ICpidXNpZF9wcml2KQoreworCWlmIChidXNpZF9wcml2LT5zZGV2ICYmICFidXNpZF9wcml2LT5zaHV0ZG93bl9idXNpZCkgeworCQlidXNpZF9wcml2LT5zaHV0ZG93bl9idXNpZCA9IDE7CisJCXVzYmlwX2V2ZW50X2FkZCgmYnVzaWRfcHJpdi0+c2Rldi0+dWQsIFNERVZfRVZFTlRfUkVNT1ZFRCk7CisKKwkJLyogMi4gd2FpdCBmb3IgdGhlIHN0b3Agb2YgdGhlIGV2ZW50IGhhbmRsZXIgKi8KKwkJdXNiaXBfc3RvcF9laCgmYnVzaWRfcHJpdi0+c2Rldi0+dWQpOworCX0KKworfQorCiAKIC8qCiAgKiBjYWxsZWQgaW4gdXNiX2Rpc2Nvbm5lY3QoKSBvciB1c2JfZGVyZWdpc3RlcigpCkBAIC00NTEsMTAgKzUwNiwyMSBAQAogICovCiBzdGF0aWMgdm9pZCBzdHViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKLQlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2OworCWNvbnN0IGNoYXIgKnVkZXZfYnVzaWQgPSBkZXZfbmFtZShpbnRlcmZhY2UtPmRldi5wYXJlbnQpOworCXN0cnVjdCBidXNfaWRfcHJpdiAqYnVzaWRfcHJpdjsKKworCWJ1c2lkX3ByaXYgPSBnZXRfYnVzaWRfcHJpdih1ZGV2X2J1c2lkKTsKIAogCXVzYmlwX3VkYmcoIkVudGVyXG4iKTsKIAorCWlmICghYnVzaWRfcHJpdikgeworCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCXNkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKIAkvKiBnZXQgc3R1Yl9kZXZpY2UgKi8KIAlpZiAoIXNkZXYpIHsKIAkJZXJyKCIgY291bGQgbm90IGdldCBkZXZpY2UgZnJvbSBpbnRlZmFjZSBkYXRhIik7CkBAIC00NjQsMjIgKzUzMCwzOSBAQAogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCi0KIAkvKgogCSAqIE5PVEU6CiAJICogcngvdHggdGhyZWFkcyBhcmUgaW52b2tlZCBmb3IgZWFjaCB1c2JfZGV2aWNlLgogCSAqLwogCXN0dWJfcmVtb3ZlX2ZpbGVzKCZpbnRlcmZhY2UtPmRldik7CiAKLQkvKiAxLiBzaHV0ZG93biB0aGUgY3VycmVudCBjb25uZWN0aW9uICovCi0JdXNiaXBfZXZlbnRfYWRkKCZzZGV2LT51ZCwgU0RFVl9FVkVOVF9SRU1PVkVEKTsKKwkvKklmIHVzYiByZXNldCBjYWxsZWQgZnJvbSBldmVudCBoYW5kbGVyKi8KKwlpZiAoYnVzaWRfcHJpdi0+c2Rldi0+dWQuZWgudGhyZWFkID09IGN1cnJlbnQpIHsKKwkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50LS07CisJCXJldHVybjsKKwl9CiAKLQkvKiAyLiB3YWl0IGZvciB0aGUgc3RvcCBvZiB0aGUgZXZlbnQgaGFuZGxlciAqLwotCXVzYmlwX3N0b3BfZWgoJnNkZXYtPnVkKTsKKwlpZiAoYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50ID4gMSkgeworCQlidXNpZF9wcml2LT5pbnRlcmZfY291bnQtLTsKKwkJc2h1dGRvd25fYnVzaWQoYnVzaWRfcHJpdik7CisJCXJldHVybjsKKwl9CisKKwlidXNpZF9wcml2LT5pbnRlcmZfY291bnQgPSAwOworCisKKwkvKiAxLiBzaHV0ZG93biB0aGUgY3VycmVudCBjb25uZWN0aW9uICovCisJc2h1dGRvd25fYnVzaWQoYnVzaWRfcHJpdik7CiAKIAkvKiAzLiBmcmVlIHNkZXYgKi8KKwlidXNpZF9wcml2LT5zZGV2ID0gTlVMTDsKIAlzdHViX2RldmljZV9mcmVlKHNkZXYpOwogCi0KKwlpZiAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfQUxMT0MpIHsKKwkJYnVzaWRfcHJpdi0+c3RhdHVzID0gU1RVQl9CVVNJRF9BRERFRDsKKwl9IGVsc2UgeworCQlidXNpZF9wcml2LT5zdGF0dXMgPSBTVFVCX0JVU0lEX09USEVSOworCQlkZWxfbWF0Y2hfYnVzaWQoKGNoYXIgKil1ZGV2X2J1c2lkKTsKKwl9CiAJdXNiaXBfdWRiZygiYnllXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYwppbmRleCA2NjY1Y2VmLi5mM2E0MDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCkBAIC00MSw4ICs0MSw3IEBACiAgKiByZW1vdGUgaG9zdC4KICAqLwogI2RlZmluZSBNQVhfQlVTSUQgMTYKLSNkZWZpbmUgQlVTSURfU0laRSAyMAotc3RhdGljIGNoYXIgYnVzaWRfdGFibGVbTUFYX0JVU0lEXVtCVVNJRF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX2lkX3ByaXYgYnVzaWRfdGFibGVbTUFYX0JVU0lEXTsKIHN0YXRpYyBzcGlubG9ja190IGJ1c2lkX3RhYmxlX2xvY2s7CiAKIApAQCAtNTMsOCArNTIsOCBAQAogCXNwaW5fbG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCi0JCWlmIChidXNpZF90YWJsZVtpXVswXSkKLQkJCWlmICghc3RybmNtcChidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU0lEX1NJWkUpKSB7CisJCWlmIChidXNpZF90YWJsZVtpXS5uYW1lWzBdKQorCQkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLm5hbWUsIGJ1c2lkLCBCVVNJRF9TSVpFKSkgewogCQkJCS8qIGFscmVhZHkgcmVnaXN0ZXJkICovCiAJCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCQkJCXJldHVybiAwOwpAQCAtNjUsNiArNjQsMjUgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RydWN0IGJ1c19pZF9wcml2ICpnZXRfYnVzaWRfcHJpdihjb25zdCBjaGFyICpidXNpZCkKK3sKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmYnVzaWRfdGFibGVfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCisJCWlmIChidXNpZF90YWJsZVtpXS5uYW1lWzBdKQorCQkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLm5hbWUsIGJ1c2lkLCBCVVNJRF9TSVpFKSkgeworCQkJCS8qIGFscmVhZHkgcmVnaXN0ZXJkICovCisJCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOworCQkJCXJldHVybiAmKGJ1c2lkX3RhYmxlW2ldKTsKKwkJCX0KKworCXNwaW5fdW5sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X21hdGNoX2J1c2lkKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNoYXIgKmJ1ZikKIHsKIAlpbnQgaTsKQEAgLTczLDggKzkxLDggQEAKIAlzcGluX2xvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKQotCQlpZiAoYnVzaWRfdGFibGVbaV1bMF0pCi0JCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlcyAiLCBidXNpZF90YWJsZVtpXSk7CisJCWlmIChidXNpZF90YWJsZVtpXS5uYW1lWzBdKQorCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMgIiwgYnVzaWRfdGFibGVbaV0ubmFtZSk7CiAKIAlzcGluX3VubG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAKQEAgLTkzLDggKzExMSwxMSBAQAogCXNwaW5fbG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCi0JCWlmICghYnVzaWRfdGFibGVbaV1bMF0pIHsKLQkJCXN0cm5jcHkoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNJRF9TSVpFKTsKKwkJaWYgKCFidXNpZF90YWJsZVtpXS5uYW1lWzBdKSB7CisJCQlzdHJuY3B5KGJ1c2lkX3RhYmxlW2ldLm5hbWUsIGJ1c2lkLCBCVVNJRF9TSVpFKTsKKwkJCWlmICgoYnVzaWRfdGFibGVbaV0uc3RhdHVzICE9IFNUVUJfQlVTSURfQUxMT0MpICYmCisJCQkgICAgKGJ1c2lkX3RhYmxlW2ldLnN0YXR1cyAhPSBTVFVCX0JVU0lEX1JFTU9WKSkKKwkJCQlidXNpZF90YWJsZVtpXS5zdGF0dXMgPSBTVFVCX0JVU0lEX0FEREVEOwogCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEwNCwxNiArMTI1LDIxIEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGRlbF9tYXRjaF9idXNpZChjaGFyICpidXNpZCkKK2ludCBkZWxfbWF0Y2hfYnVzaWQoY2hhciAqYnVzaWQpCiB7CiAJaW50IGk7CiAKIAlzcGluX2xvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKQotCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNJRF9TSVpFKSkgeworCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0ubmFtZSwgYnVzaWQsIEJVU0lEX1NJWkUpKSB7CiAJCQkvKiBmb3VuZCAqLwotCQkJbWVtc2V0KGJ1c2lkX3RhYmxlW2ldLCAwLCBCVVNJRF9TSVpFKTsKKwkJCWlmIChidXNpZF90YWJsZVtpXS5zdGF0dXMgPT0gU1RVQl9CVVNJRF9PVEhFUikKKwkJCQltZW1zZXQoYnVzaWRfdGFibGVbaV0ubmFtZSwgMCwgQlVTSURfU0laRSk7CisJCQlpZiAoKGJ1c2lkX3RhYmxlW2ldLnN0YXR1cyAhPSBTVFVCX0JVU0lEX09USEVSKSAmJgorCQkJICAgIChidXNpZF90YWJsZVtpXS5zdGF0dXMgIT0gU1RVQl9CVVNJRF9BRERFRCkpIHsKKwkJCQlidXNpZF90YWJsZVtpXS5zdGF0dXMgPSBTVFVCX0JVU0lEX1JFTU9WOworCQkJfQogCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEyMiw2ICsxNDgsMjAgQEAKIAogCXJldHVybiAtMTsKIH0KK3N0YXRpYyB2b2lkIGluaXRfYnVzaWRfdGFibGUodm9pZCkKK3sKKwlpbnQgaTsKKworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKSB7CisJCW1lbXNldChidXNpZF90YWJsZVtpXS5uYW1lLCAwLCBCVVNJRF9TSVpFKTsKKwkJYnVzaWRfdGFibGVbaV0uc3RhdHVzID0gU1RVQl9CVVNJRF9PVEhFUjsKKwkJYnVzaWRfdGFibGVbaV0uaW50ZXJmX2NvdW50ID0gMDsKKwkJYnVzaWRfdGFibGVbaV0uc2RldiA9IE5VTEw7CisJCWJ1c2lkX3RhYmxlW2ldLnNodXRkb3duX2J1c2lkID0gMDsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmJ1c2lkX3RhYmxlX2xvY2spOworfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXRjaF9idXNpZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGV2LCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCkKQEAgLTI2MSw4ICszMDEsNyBAQAogCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjoiCiAJICAgICAgIERSSVZFUl9ERVNDICI6IiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKIAotCW1lbXNldChidXNpZF90YWJsZSwgMCwgc2l6ZW9mKGJ1c2lkX3RhYmxlKSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJ1c2lkX3RhYmxlX2xvY2spOworCWluaXRfYnVzaWRfdGFibGUoKTsKIAogCXJldCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmc3R1Yl9kcml2ZXIuZHJ2d3JhcC5kcml2ZXIsCiAJCQkJICZkcml2ZXJfYXR0cl9tYXRjaF9idXNpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwppbmRleCA1OTcyYWU3Li4zZGU2ZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKQEAgLTM2Miw1NCArMzYyLDE2IEBACiAJcmV0dXJuIHByaXY7CiB9CiAKLQotc3RhdGljIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZ2V0X2VwX2Zyb21fZXBudW0oc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCi0JCWludCBlcG51bTApCi17Ci0Jc3RydWN0IHVzYl9ob3N0X2NvbmZpZyAqY29uZmlnOwotCWludCBpID0gMCwgaiA9IDA7Ci0Jc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCA9IE5VTEw7Ci0JaW50IGVwbnVtOwotCWludCBmb3VuZCA9IDA7Ci0KLQlpZiAoZXBudW0wID09IDApCi0JCXJldHVybiAmdWRldi0+ZXAwOwotCi0JY29uZmlnID0gdWRldi0+YWN0Y29uZmlnOwotCWlmICghY29uZmlnKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewotCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpzZXR0aW5nOwotCi0JCXNldHRpbmcgPSBjb25maWctPmludGVyZmFjZVtpXS0+Y3VyX2FsdHNldHRpbmc7Ci0KLQkJZm9yIChqID0gMDsgaiA8IHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaisrKSB7Ci0JCQllcCA9ICZzZXR0aW5nLT5lbmRwb2ludFtqXTsKLQkJCWVwbnVtID0gKGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiAweDdmKTsKLQotCQkJaWYgKGVwbnVtID09IGVwbnVtMCkgewotCQkJCS8qIHVzYmlwX3VpbmZvKCJmb3VuZCBlcG51bSAlZFxuIiwgZXBudW0wKTsqLwotCQkJCWZvdW5kID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChmb3VuZCkKLQkJcmV0dXJuIGVwOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0KLQogc3RhdGljIGludCBnZXRfcGlwZShzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYsIGludCBlcG51bSwgaW50IGRpcikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoc2Rldi0+aW50ZXJmYWNlKTsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOwogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkID0gTlVMTDsKIAotCWVwID0gZ2V0X2VwX2Zyb21fZXBudW0odWRldiwgZXBudW0pOworCWlmIChkaXIgPT0gVVNCSVBfRElSX0lOKQorCQllcCA9IHVkZXYtPmVwX2luW2VwbnVtICYgMHg3Zl07CisJZWxzZQorCQllcCA9IHVkZXYtPmVwX291dFtlcG51bSAmIDB4N2ZdOwogCWlmICghZXApIHsKIAkJZGV2X2Vycigmc2Rldi0+aW50ZXJmYWNlLT5kZXYsICJubyBzdWNoIGVuZHBvaW50PywgJWRcbiIsCiAJCQllcG51bSk7CkBAIC00NjIsNiArNDI0LDYwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1hc2tpbmdfYm9ndXNfZmxhZ3Moc3RydWN0IHVyYiAqdXJiKQoreworCWludAkJCQl4ZmVydHlwZTsKKwlzdHJ1Y3QgdXNiX2RldmljZQkJKmRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVwOworCWludAkJCQlpc19vdXQ7CisJdW5zaWduZWQgaW50CWFsbG93ZWQ7CisKKwlpZiAoIXVyYiB8fCB1cmItPmhjcHJpdiB8fCAhdXJiLT5jb21wbGV0ZSkKKwkJcmV0dXJuOworCWRldiA9IHVyYi0+ZGV2OworCWlmICgoIWRldikgfHwgKGRldi0+c3RhdGUgPCBVU0JfU1RBVEVfVU5BVVRIRU5USUNBVEVEKSkKKwkJcmV0dXJuOworCisJZXAgPSAodXNiX3BpcGVpbih1cmItPnBpcGUpID8gZGV2LT5lcF9pbiA6IGRldi0+ZXBfb3V0KQorCQkJW3VzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKV07CisJaWYgKCFlcCkKKwkJcmV0dXJuOworCisJeGZlcnR5cGUgPSB1c2JfZW5kcG9pbnRfdHlwZSgmZXAtPmRlc2MpOworCWlmICh4ZmVydHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKSB7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwID0KKwkJCQkoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSB1cmItPnNldHVwX3BhY2tldDsKKworCQlpZiAoIXNldHVwKQorCQkJcmV0dXJuOworCQlpc19vdXQgPSAhKHNldHVwLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSB8fAorCQkJCSFzZXR1cC0+d0xlbmd0aDsKKwl9IGVsc2UgeworCQlpc19vdXQgPSB1c2JfZW5kcG9pbnRfZGlyX291dCgmZXAtPmRlc2MpOworCX0KKworCS8qIGVuZm9yY2Ugc2ltcGxlL3N0YW5kYXJkIHBvbGljeSAqLworCWFsbG93ZWQgPSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fSU5URVJSVVBUIHwKKwkJICAgVVJCX0RJUl9NQVNLIHwgVVJCX0ZSRUVfQlVGRkVSKTsKKwlzd2l0Y2ggKHhmZXJ0eXBlKSB7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQlpZiAoaXNfb3V0KQorCQkJYWxsb3dlZCB8PSBVUkJfWkVST19QQUNLRVQ7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQlhbGxvd2VkIHw9IFVSQl9OT19GU0JSOwkvKiBvbmx5IGFmZmVjdHMgVUhDSSAqLworCQkvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CQkJLyogYWxsIG5vbi1pc28gZW5kcG9pbnRzICovCisJCWlmICghaXNfb3V0KQorCQkJYWxsb3dlZCB8PSBVUkJfU0hPUlRfTk9UX09LOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCWFsbG93ZWQgfD0gVVJCX0lTT19BU0FQOworCQlicmVhazsKKwl9CisJdXJiLT50cmFuc2Zlcl9mbGFncyAmPSBhbGxvd2VkOworfQorCiBzdGF0aWMgdm9pZCBzdHViX3JlY3ZfY21kX3N1Ym1pdChzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYsCiAJCQkJIHN0cnVjdCB1c2JpcF9oZWFkZXIgKnBkdSkKIHsKQEAgLTUyOCw2ICs1NDQsNyBAQAogCS8qIG5vIG5lZWQgdG8gc3VibWl0IGFuIGludGVyY2VwdGVkIHJlcXVlc3QsIGJ1dCBoYXJtbGVzcz8gKi8KIAl0d2Vha19zcGVjaWFsX3JlcXVlc3RzKHByaXYtPnVyYik7CiAKKwltYXNraW5nX2JvZ3VzX2ZsYWdzKHByaXYtPnVyYik7CiAJLyogdXJiIGlzIG5vdyByZWFkeSB0byBzdWJtaXQgKi8KIAlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT51cmIsIEdGUF9LRVJORUwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmgKaW5kZXggZTFiYmQxMi4uZDI4MGUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uaApAQCAtMTcyLDcgKzE3Miw3IEBACiAjZGVmaW5lIFVTQklQX1JFVF9VTkxJTksJMHgwMDA0CiAJX191MzIgY29tbWFuZDsKIAotCSAvKiBzZXF1ZW5jaWFsIG51bWJlciB3aGljaCBpZGVudGlmaWVzIHJlcXVlc3RzLgorCSAvKiBzZXF1ZW50aWFsIG51bWJlciB3aGljaCBpZGVudGlmaWVzIHJlcXVlc3RzLgogCSAgKiBpbmNyZW1lbnRlZCBwZXIgY29ubmVjdGlvbnMgKi8KIAlfX3UzMiBzZXFudW07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwppbmRleCAwZjllYTU4Li4wNmJkNzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC05MDAsNyArOTAwLDggQEAKIAkvKiBBZGRyZXNzIG11c3QgYmUgNC1ieXRlIGFsaWduZWQgKi8KIAlpZiAocGNpX2FkZHIgJiAweDMpIHsKIAkJZGV2X2VycihkZXYsICJSTVcgQWRkcmVzcyBub3QgNC1ieXRlIGFsaWduZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogRW5zdXJlIFJNVyBEaXNhYmxlZCB3aGlsc3QgY29uZmlndXJpbmcgKi8KQEAgLTkyMSw2ICs5MjIsNyBAQAogCS8qIERpc2FibGUgUk1XICovCiAJaW93cml0ZTMyKDAsIGJyaWRnZS0+YmFzZSArIFNDWUNfQ1RMKTsKIAorb3V0OgogCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKIAogCW11dGV4X3VubG9jaygmKGJyaWRnZS0+dm1lX3JtdykpOwpAQCAtOTYxLDExICs5NjMsMTEgQEAKIAogCWlmIChkZXN0LT50eXBlID09IFZNRV9ETUFfVk1FKSB7CiAJCWVudHJ5LT5kZXNjcmlwdG9yLmRjdGwgfD0gQ0E5MUNYNDJfRENUTF9MMlY7Ci0JCXZtZV9hdHRyID0gKHN0cnVjdCB2bWVfZG1hX3ZtZSAqKWRlc3QtPnByaXZhdGU7Ci0JCXBjaV9hdHRyID0gKHN0cnVjdCB2bWVfZG1hX3BjaSAqKXNyYy0+cHJpdmF0ZTsKKwkJdm1lX2F0dHIgPSBkZXN0LT5wcml2YXRlOworCQlwY2lfYXR0ciA9IHNyYy0+cHJpdmF0ZTsKIAl9IGVsc2UgewotCQl2bWVfYXR0ciA9IChzdHJ1Y3Qgdm1lX2RtYV92bWUgKilzcmMtPnByaXZhdGU7Ci0JCXBjaV9hdHRyID0gKHN0cnVjdCB2bWVfZG1hX3BjaSAqKWRlc3QtPnByaXZhdGU7CisJCXZtZV9hdHRyID0gc3JjLT5wcml2YXRlOworCQlwY2lfYXR0ciA9IGRlc3QtPnByaXZhdGU7CiAJfQogCiAJLyogQ2hlY2sgd2UgY2FuIGRvIGZ1bGxmaWxsIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCmluZGV4IGYwOWNhYzEuLjQ5MmRkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtMTY0OSw3ICsxNjQ5LDcgQEAKIAkvKiBGaWxsIG91dCBzb3VyY2UgcGFydCAqLwogCXN3aXRjaCAoc3JjLT50eXBlKSB7CiAJY2FzZSBWTUVfRE1BX1BBVFRFUk46Ci0JCXBhdHRlcm5fYXR0ciA9IChzdHJ1Y3Qgdm1lX2RtYV9wYXR0ZXJuICopc3JjLT5wcml2YXRlOworCQlwYXR0ZXJuX2F0dHIgPSBzcmMtPnByaXZhdGU7CiAKIAkJZW50cnktPmRlc2NyaXB0b3IuZHNhbCA9IHBhdHRlcm5fYXR0ci0+cGF0dGVybjsKIAkJZW50cnktPmRlc2NyaXB0b3IuZHNhdCA9IFRTSTE0OF9MQ1NSX0RTQVRfVFlQX1BBVDsKQEAgLTE2NjMsNyArMTY2Myw3IEBACiAKIAkJYnJlYWs7CiAJY2FzZSBWTUVfRE1BX1BDSToKLQkJcGNpX2F0dHIgPSAoc3RydWN0IHZtZV9kbWFfcGNpICopc3JjLT5wcml2YXRlOworCQlwY2lfYXR0ciA9IHNyYy0+cHJpdmF0ZTsKIAogCQlyZWdfc3BsaXQoKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfYXR0ci0+YWRkcmVzcywgJmFkZHJlc3NfaGlnaCwKIAkJCSZhZGRyZXNzX2xvdyk7CkBAIC0xNjcyLDcgKzE2NzIsNyBAQAogCQllbnRyeS0+ZGVzY3JpcHRvci5kc2F0ID0gVFNJMTQ4X0xDU1JfRFNBVF9UWVBfUENJOwogCQlicmVhazsKIAljYXNlIFZNRV9ETUFfVk1FOgotCQl2bWVfYXR0ciA9IChzdHJ1Y3Qgdm1lX2RtYV92bWUgKilzcmMtPnByaXZhdGU7CisJCXZtZV9hdHRyID0gc3JjLT5wcml2YXRlOwogCiAJCXJlZ19zcGxpdCgodW5zaWduZWQgbG9uZyBsb25nKXZtZV9hdHRyLT5hZGRyZXNzLCAmYWRkcmVzc19oaWdoLAogCQkJJmFkZHJlc3NfbG93KTsKQEAgLTE3MDEsNyArMTcwMSw3IEBACiAJLyogRmlsbCBvdXQgZGVzdGluYXRpb24gcGFydCAqLwogCXN3aXRjaCAoZGVzdC0+dHlwZSkgewogCWNhc2UgVk1FX0RNQV9QQ0k6Ci0JCXBjaV9hdHRyID0gKHN0cnVjdCB2bWVfZG1hX3BjaSAqKWRlc3QtPnByaXZhdGU7CisJCXBjaV9hdHRyID0gZGVzdC0+cHJpdmF0ZTsKIAogCQlyZWdfc3BsaXQoKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfYXR0ci0+YWRkcmVzcywgJmFkZHJlc3NfaGlnaCwKIAkJCSZhZGRyZXNzX2xvdyk7CkBAIC0xNzEwLDcgKzE3MTAsNyBAQAogCQllbnRyeS0+ZGVzY3JpcHRvci5kZGF0ID0gVFNJMTQ4X0xDU1JfRERBVF9UWVBfUENJOwogCQlicmVhazsKIAljYXNlIFZNRV9ETUFfVk1FOgotCQl2bWVfYXR0ciA9IChzdHJ1Y3Qgdm1lX2RtYV92bWUgKilkZXN0LT5wcml2YXRlOworCQl2bWVfYXR0ciA9IGRlc3QtPnByaXZhdGU7CiAKIAkJcmVnX3NwbGl0KCh1bnNpZ25lZCBsb25nIGxvbmcpdm1lX2F0dHItPmFkZHJlc3MsICZhZGRyZXNzX2hpZ2gsCiAJCQkmYWRkcmVzc19sb3cpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwppbmRleCBiYzE2ZmMwNy4uOGY3N2JkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKQEAgLTMxLDE1ICszMSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiLi4vdm1lLmgiCiAjaW5jbHVkZSAidm1lX3VzZXIuaCIKIAorc3RhdGljIERFRklORV9NVVRFWCh2bWVfdXNlcl9tdXRleCk7CiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV91c2VyIjsKIAogc3RhdGljIGludCBidXNbVVNFUl9CVVNfTUFYXTsKQEAgLTQ4LDE5ICs0OSwxOSBAQAogLyogQ3VycmVudGx5IERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZvciBWTUU6CiAgKgogICogMjIxIGNoYXIJVk1FIGJ1cwotICogCQkgIDAgPSAvZGV2L2J1cy92bWUvbTAJCUZpcnN0IG1hc3RlciBpbWFnZQotICogCQkgIDEgPSAvZGV2L2J1cy92bWUvbTEJCVNlY29uZCBtYXN0ZXIgaW1hZ2UKLSAqIAkJICAyID0gL2Rldi9idXMvdm1lL20yCQlUaGlyZCBtYXN0ZXIgaW1hZ2UKLSAqIAkJICAzID0gL2Rldi9idXMvdm1lL20zCQlGb3VydGggbWFzdGVyIGltYWdlCi0gKiAJCSAgNCA9IC9kZXYvYnVzL3ZtZS9zMAkJRmlyc3Qgc2xhdmUgaW1hZ2UKLSAqIAkJICA1ID0gL2Rldi9idXMvdm1lL3MxCQlTZWNvbmQgc2xhdmUgaW1hZ2UKLSAqIAkJICA2ID0gL2Rldi9idXMvdm1lL3MyCQlUaGlyZCBzbGF2ZSBpbWFnZQotICogCQkgIDcgPSAvZGV2L2J1cy92bWUvczMJCUZvdXJ0aCBzbGF2ZSBpbWFnZQotICogCQkgIDggPSAvZGV2L2J1cy92bWUvY3RsCQlDb250cm9sCisgKgkJICAwID0gL2Rldi9idXMvdm1lL20wCQlGaXJzdCBtYXN0ZXIgaW1hZ2UKKyAqCQkgIDEgPSAvZGV2L2J1cy92bWUvbTEJCVNlY29uZCBtYXN0ZXIgaW1hZ2UKKyAqCQkgIDIgPSAvZGV2L2J1cy92bWUvbTIJCVRoaXJkIG1hc3RlciBpbWFnZQorICoJCSAgMyA9IC9kZXYvYnVzL3ZtZS9tMwkJRm91cnRoIG1hc3RlciBpbWFnZQorICoJCSAgNCA9IC9kZXYvYnVzL3ZtZS9zMAkJRmlyc3Qgc2xhdmUgaW1hZ2UKKyAqCQkgIDUgPSAvZGV2L2J1cy92bWUvczEJCVNlY29uZCBzbGF2ZSBpbWFnZQorICoJCSAgNiA9IC9kZXYvYnVzL3ZtZS9zMgkJVGhpcmQgc2xhdmUgaW1hZ2UKKyAqCQkgIDcgPSAvZGV2L2J1cy92bWUvczMJCUZvdXJ0aCBzbGF2ZSBpbWFnZQorICoJCSAgOCA9IC9kZXYvYnVzL3ZtZS9jdGwJCUNvbnRyb2wKICAqCi0gKiAJCUl0IGlzIGV4cGVjdGVkIHRoYXQgYWxsIFZNRSBidXMgZHJpdmVycyB3aWxsIHVzZSB0aGUKLSAqIAkJc2FtZSBpbnRlcmZhY2UuICBGb3IgaW50ZXJmYWNlIGRvY3VtZW50YXRpb24gc2VlCi0gKiAJCWh0dHA6Ly93d3cudm1lbGludXgub3JnLy4KKyAqCQlJdCBpcyBleHBlY3RlZCB0aGF0IGFsbCBWTUUgYnVzIGRyaXZlcnMgd2lsbCB1c2UgdGhlCisgKgkJc2FtZSBpbnRlcmZhY2UuICBGb3IgaW50ZXJmYWNlIGRvY3VtZW50YXRpb24gc2VlCisgKgkJaHR0cDovL3d3dy52bWVsaW51eC5vcmcvLgogICoKICAqIEhvd2V2ZXIgdGhlIFZNRSBkcml2ZXIgYXQgaHR0cDovL3d3dy52bWVsaW51eC5vcmcvIGlzIHJhdGhlciBvbGQgYW5kIGRvZXNuJ3QKICAqIGV2ZW4gc3VwcG9ydCB0aGUgdHNpMTQ4IGNoaXBzZXQgKHdoaWNoIGhhcyA4IG1hc3RlciBhbmQgOCBzbGF2ZSB3aW5kb3dzKS4KQEAgLTEzNywxMiArMTM4LDEyIEBACiBzdGF0aWMgaW50IF9fZXhpdCB2bWVfdXNlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZtZV91c2VyX2ZvcHMgPSB7Ci0gICAgICAgIC5vcGVuID0gdm1lX3VzZXJfb3BlbiwKLSAgICAgICAgLnJlbGVhc2UgPSB2bWVfdXNlcl9yZWxlYXNlLAotICAgICAgICAucmVhZCA9IHZtZV91c2VyX3JlYWQsCi0gICAgICAgIC53cml0ZSA9IHZtZV91c2VyX3dyaXRlLAotICAgICAgICAubGxzZWVrID0gdm1lX3VzZXJfbGxzZWVrLAotICAgICAgICAudW5sb2NrZWRfaW9jdGwgPSB2bWVfdXNlcl91bmxvY2tlZF9pb2N0bCwKKwkub3BlbiA9IHZtZV91c2VyX29wZW4sCisJLnJlbGVhc2UgPSB2bWVfdXNlcl9yZWxlYXNlLAorCS5yZWFkID0gdm1lX3VzZXJfcmVhZCwKKwkud3JpdGUgPSB2bWVfdXNlcl93cml0ZSwKKwkubGxzZWVrID0gdm1lX3VzZXJfbGxzZWVrLAorCS51bmxvY2tlZF9pb2N0bCA9IHZtZV91c2VyX3VubG9ja2VkX2lvY3RsLAogfTsKIAogCkBAIC0xNTEsMTMgKzE1MiwxMyBAQAogICovCiBzdGF0aWMgdm9pZCByZXNldF9jb3VudGVycyh2b2lkKQogewotICAgICAgICBzdGF0aXN0aWNzLnJlYWRzID0gMDsKLSAgICAgICAgc3RhdGlzdGljcy53cml0ZXMgPSAwOwotICAgICAgICBzdGF0aXN0aWNzLmlvY3RscyA9IDA7Ci0gICAgICAgIHN0YXRpc3RpY3MuaXJxcyA9IDA7Ci0gICAgICAgIHN0YXRpc3RpY3MuYmVycnMgPSAwOwotICAgICAgICBzdGF0aXN0aWNzLmRtYUVycm9ycyA9IDA7Ci0gICAgICAgIHN0YXRpc3RpY3MudGltZW91dHMgPSAwOworCXN0YXRpc3RpY3MucmVhZHMgPSAwOworCXN0YXRpc3RpY3Mud3JpdGVzID0gMDsKKwlzdGF0aXN0aWNzLmlvY3RscyA9IDA7CisJc3RhdGlzdGljcy5pcnFzID0gMDsKKwlzdGF0aXN0aWNzLmJlcnJzID0gMDsKKwlzdGF0aXN0aWNzLmRtYUVycm9ycyA9IDA7CisJc3RhdGlzdGljcy50aW1lb3V0cyA9IDA7CiB9CiAKIHN0YXRpYyBpbnQgdm1lX3VzZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTIxNiwyMSArMjE3LDIwIEBACiAJCS8qIFdlIGNvcHkgdG8ga2VybmVsIGJ1ZmZlciAqLwogCQljb3BpZWQgPSB2bWVfbWFzdGVyX3JlYWQoaW1hZ2VbbWlub3JdLnJlc291cmNlLAogCQkJaW1hZ2VbbWlub3JdLmtlcm5fYnVmLCBjb3VudCwgKnBwb3MpOwotCQlpZiAoY29waWVkIDwgMCkgeworCQlpZiAoY29waWVkIDwgMCkKIAkJCXJldHVybiAoaW50KWNvcGllZDsKLQkJfQogCiAJCXJldHZhbCA9IF9fY29weV90b191c2VyKGJ1ZiwgaW1hZ2VbbWlub3JdLmtlcm5fYnVmLAogCQkJKHVuc2lnbmVkIGxvbmcpY29waWVkKTsKIAkJaWYgKHJldHZhbCAhPSAwKSB7CiAJCQljb3BpZWQgPSAoY29waWVkIC0gcmV0dmFsKTsKLQkJCXByaW50aygiVXNlciBjb3B5IGZhaWxlZFxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJVc2VyIGNvcHkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAl9IGVsc2UgewogCQkvKiBYWFggTmVlZCB0byB3cml0ZSB0aGlzICovCi0JCXByaW50aygiQ3VycmVudGx5IGRvbid0IHN1cHBvcnQgbGFyZ2UgdHJhbnNmZXJzXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ3VycmVudGx5IGRvbid0IHN1cHBvcnQgbGFyZ2UgdHJhbnNmZXJzXG4iKTsKIAkJLyogTWFwIGluIHBhZ2VzIGZyb20gdXNlcnNwYWNlICovCiAKIAkJLyogQ2FsbCB2bWVfbWFzdGVyX3JlYWQgdG8gZG8gdGhlIHRyYW5zZmVyICovCkBAIC0yNjQsNyArMjY0LDcgQEAKIAkJCWltYWdlW21pbm9yXS5rZXJuX2J1ZiwgY29waWVkLCAqcHBvcyk7CiAJfSBlbHNlIHsKIAkJLyogWFhYIE5lZWQgdG8gd3JpdGUgdGhpcyAqLwotCQlwcmludGsoIkN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGxhcmdlIHRyYW5zZmVyc1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGxhcmdlIHRyYW5zZmVyc1xuIik7CiAJCS8qIE1hcCBpbiBwYWdlcyBmcm9tIHVzZXJzcGFjZSAqLwogCiAJCS8qIENhbGwgdm1lX21hc3Rlcl93cml0ZSB0byBkbyB0aGUgdHJhbnNmZXIgKi8KQEAgLTMxMyw3ICszMTMsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdCB2bWVfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCWxvZmZfdCAqIHBwb3MpCisJCQlsb2ZmX3QgKnBwb3MpCiB7CiAJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldik7CiAJc3NpemVfdCByZXR2YWw7CkBAIC0zMzcsNyArMzM3LDcgQEAKIAllbHNlCiAJCW9rY291bnQgPSBjb3VudDsKIAotCXN3aXRjaCAodHlwZVttaW5vcl0peworCXN3aXRjaCAodHlwZVttaW5vcl0pIHsKIAljYXNlIE1BU1RFUl9NSU5PUjoKIAkJcmV0dmFsID0gcmVzb3VyY2VfdG9fdXNlcihtaW5vciwgYnVmLCBva2NvdW50LCBwcG9zKTsKIAkJYnJlYWs7CkBAIC0zODAsNyArMzgwLDcgQEAKIAllbHNlCiAJCW9rY291bnQgPSBjb3VudDsKIAotCXN3aXRjaCAodHlwZVttaW5vcl0peworCXN3aXRjaCAodHlwZVttaW5vcl0pIHsKIAljYXNlIE1BU1RFUl9NSU5PUjoKIAkJcmV0dmFsID0gcmVzb3VyY2VfZnJvbV91c2VyKG1pbm9yLCBidWYsIG9rY291bnQsIHBwb3MpOwogCQlicmVhazsKQEAgLTU2MCw5ICs1NjAsOSBAQAogewogCWludCByZXQ7CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJnZtZV91c2VyX211dGV4KTsKIAlyZXQgPSB2bWVfdXNlcl9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmdm1lX3VzZXJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU3MSw3ICs1NzEsNyBAQAogLyoKICAqIFVuYWxsb2NhdGUgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBidWZmZXIKICAqLwotc3RhdGljIHZvaWQgYnVmX3VuYWxsb2MgKGludCBudW0pCitzdGF0aWMgdm9pZCBidWZfdW5hbGxvYyhpbnQgbnVtKQogewogCWlmIChpbWFnZVtudW1dLmtlcm5fYnVmKSB7CiAjaWZkZWYgVk1FX0RFQlVHCkBAIC01OTQsOCArNTk0LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCB2bWVfZHJpdmVyIHZtZV91c2VyX2RyaXZlciA9IHsKLSAgICAgICAgLm5hbWUgPSBkcml2ZXJfbmFtZSwKLSAgICAgICAgLnByb2JlID0gdm1lX3VzZXJfcHJvYmUsCisJLm5hbWUgPSBkcml2ZXJfbmFtZSwKKwkucHJvYmUgPSB2bWVfdXNlcl9wcm9iZSwKIAkucmVtb3ZlID0gdm1lX3VzZXJfcmVtb3ZlLAogfTsKIApAQCAtNzcwLDE2ICs3NzAsMTYgQEAKIAl9CiAKIAkvKiBBZGQgc3lzZnMgRW50cmllcyAqLwotCWZvciAoaT0wOyBpPFZNRV9ERVZTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgVk1FX0RFVlM7IGkrKykgewogCQlzd2l0Y2ggKHR5cGVbaV0pIHsKIAkJY2FzZSBNQVNURVJfTUlOT1I6Ci0JCQlzcHJpbnRmKG5hbWUsImJ1cy92bWUvbSUlZCIpOworCQkJc3ByaW50ZihuYW1lLCAiYnVzL3ZtZS9tJSVkIik7CiAJCQlicmVhazsKIAkJY2FzZSBDT05UUk9MX01JTk9SOgotCQkJc3ByaW50ZihuYW1lLCJidXMvdm1lL2N0bCIpOworCQkJc3ByaW50ZihuYW1lLCAiYnVzL3ZtZS9jdGwiKTsKIAkJCWJyZWFrOwogCQljYXNlIFNMQVZFX01JTk9SOgotCQkJc3ByaW50ZihuYW1lLCJidXMvdm1lL3MlJWQiKTsKKwkJCXNwcmludGYobmFtZSwgImJ1cy92bWUvcyUlZCIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtNzkwLDkgKzc5MCw5IEBACiAJCWltYWdlW2ldLmRldmljZSA9CiAJCQlkZXZpY2VfY3JlYXRlKHZtZV91c2VyX3N5c2ZzX2NsYXNzLCBOVUxMLAogCQkJCU1LREVWKFZNRV9NQUpPUiwgaSksIE5VTEwsIG5hbWUsCi0JCQkJKHR5cGVbaV0gPT0gU0xBVkVfTUlOT1IpPyBpIC0gKE1BU1RFUl9NQVggKyAxKSA6IGkpOworCQkJCSh0eXBlW2ldID09IFNMQVZFX01JTk9SKSA/IGkgLSAoTUFTVEVSX01BWCArIDEpIDogaSk7CiAJCWlmIChJU19FUlIoaW1hZ2VbaV0uZGV2aWNlKSkgewotCQkJcHJpbnRrKCIlczogRXJyb3IgY3JlYXRpbmcgc3lzZnMgZGV2aWNlXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yIGNyZWF0aW5nIHN5c2ZzIGRldmljZVxuIiwKIAkJCQlkcml2ZXJfbmFtZSk7CiAJCQllcnIgPSBQVFJfRVJSKGltYWdlW2ldLmRldmljZSk7CiAJCQlnb3RvIGVycl9zeXNmczsKQEAgLTgwNCw3ICs4MDQsNyBAQAogCS8qIEVuc3VyZSBjb3VudGVyIHNldCBjb3JyZWN0eSB0byBkZXN0cm95IGFsbCBzeXNmcyBkZXZpY2VzICovCiAJaSA9IFZNRV9ERVZTOwogZXJyX3N5c2ZzOgotCXdoaWxlIChpID4gMCl7CisJd2hpbGUgKGkgPiAwKSB7CiAJCWktLTsKIAkJZGV2aWNlX2Rlc3Ryb3kodm1lX3VzZXJfc3lzZnNfY2xhc3MsIE1LREVWKFZNRV9NQUpPUiwgaSkpOwogCX0KQEAgLTg0NSw5ICs4NDUsOCBAQAogCWludCBpOwogCiAJLyogUmVtb3ZlIHN5c2ZzIEVudHJpZXMgKi8KLQlmb3IoaT0wOyBpPFZNRV9ERVZTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgVk1FX0RFVlM7IGkrKykKIAkJZGV2aWNlX2Rlc3Ryb3kodm1lX3VzZXJfc3lzZnNfY2xhc3MsIE1LREVWKFZNRV9NQUpPUiwgaSkpOwotCX0KIAljbGFzc19kZXN0cm95KHZtZV91c2VyX3N5c2ZzX2NsYXNzKTsKIAogCWZvciAoaSA9IE1BU1RFUl9NSU5PUjsgaSA8IChNQVNURVJfTUFYICsgMSk7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFoZHIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFoZHIuaAppbmRleCBiN2IxNzBlLi5mNTUyODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExaGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMWhkci5oCkBAIC0xNjEsMjEgKzE2MSwyMSBAQAogI2lmZGVmIF9fQklHX0VORElBTgogCiAvKiBHRVQgJiBTRVQgRnJhbWUgQ29udHJvbCBiaXQgKi8KLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFJWRVIobikgICAgKCgoKFdPUkQpKG4pID4+IDgpICYgKEJJVDAgfCBCSVQxKSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfRlRZUEUobikgICAgKCgoKFdPUkQpKG4pID4+IDgpICYgKEJJVDIgfCBCSVQzKSkgPj4gMikKLSNkZWZpbmUgV0xBTl9HRVRfRkNfRlNUWVBFKG4pICAgKCgoKFdPUkQpKG4pID4+IDgpICYgKEJJVDR8QklUNXxCSVQ2fEJJVDcpKSA+PiA0KQotI2RlZmluZSBXTEFOX0dFVF9GQ19UT0RTKG4pICAgICAoKCgoV09SRCkobikgPDwgOCkgJiAoQklUOCkpID4+IDgpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZST01EUyhuKSAgICgoKChXT1JEKShuKSA8PCA4KSAmIChCSVQ5KSkgPj4gOSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRUZSQUcobikgKCgoKFdPUkQpKG4pIDw8IDgpICYgKEJJVDEwKSkgPj4gMTApCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pICAgICgoKChXT1JEKShuKSA8PCA4KSAmIChCSVQxMSkpID4+IDExKQotI2RlZmluZSBXTEFOX0dFVF9GQ19QV1JNR1QobikgICAoKCgoV09SRCkobikgPDwgOCkgJiAoQklUMTIpKSA+PiAxMikKLSNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRURBVEEobikgKCgoKFdPUkQpKG4pIDw8IDgpICYgKEJJVDEzKSkgPj4gMTMpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0lTV0VQKG4pICAgICgoKChXT1JEKShuKSA8PCA4KSAmIChCSVQxNCkpID4+IDE0KQotI2RlZmluZSBXTEFOX0dFVF9GQ19PUkRFUihuKSAgICAoKCgoV09SRCkobikgPDwgOCkgJiAoQklUMTUpKSA+PiAxNSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUFJWRVIobikgICAgKCgoKHVuc2lnbmVkIHNob3J0KShuKSA+PiA4KSAmIChCSVQwIHwgQklUMSkpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pICAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikgPj4gOCkgJiAoQklUMiB8IEJJVDMpKSA+PiAyKQorI2RlZmluZSBXTEFOX0dFVF9GQ19GU1RZUEUobikgICAoKCgodW5zaWduZWQgc2hvcnQpKG4pID4+IDgpICYgKEJJVDR8QklUNXxCSVQ2fEJJVDcpKSA+PiA0KQorI2RlZmluZSBXTEFOX0dFVF9GQ19UT0RTKG4pICAgICAoKCgodW5zaWduZWQgc2hvcnQpKG4pIDw8IDgpICYgKEJJVDgpKSA+PiA4KQorI2RlZmluZSBXTEFOX0dFVF9GQ19GUk9NRFMobikgICAoKCgodW5zaWduZWQgc2hvcnQpKG4pIDw8IDgpICYgKEJJVDkpKSA+PiA5KQorI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFRlJBRyhuKSAoKCgodW5zaWduZWQgc2hvcnQpKG4pIDw8IDgpICYgKEJJVDEwKSkgPj4gMTApCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pICAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikgPDwgOCkgJiAoQklUMTEpKSA+PiAxMSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUFdSTUdUKG4pICAgKCgoKHVuc2lnbmVkIHNob3J0KShuKSA8PCA4KSAmIChCSVQxMikpID4+IDEyKQorI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFREFUQShuKSAoKCgodW5zaWduZWQgc2hvcnQpKG4pIDw8IDgpICYgKEJJVDEzKSkgPj4gMTMpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0lTV0VQKG4pICAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikgPDwgOCkgJiAoQklUMTQpKSA+PiAxNCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfT1JERVIobikgICAgKCgoKHVuc2lnbmVkIHNob3J0KShuKSA8PCA4KSAmIChCSVQxNSkpID4+IDE1KQogCiAvKiBTZXF1ZW5jZSBGaWVsZCBiaXQgKi8KLSNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSR05VTShuKSAoKChXT1JEKShuKSA+PiA4KSAmIChCSVQwfEJJVDF8QklUMnxCSVQzKSkKLSNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUU5VTShuKSAoKCgoV09SRCkobikgPj4gOCkgJiAofihCSVQwfEJJVDF8QklUMnxCSVQzKSkpID4+IDQpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkdOVU0obikgKCgodW5zaWduZWQgc2hvcnQpKG4pID4+IDgpICYgKEJJVDB8QklUMXxCSVQyfEJJVDMpKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRTlVNKG4pICgoKCh1bnNpZ25lZCBzaG9ydCkobikgPj4gOCkgJiAofihCSVQwfEJJVDF8QklUMnxCSVQzKSkpID4+IDQpCiAKIAogLyogQ2FwYWJpbGl0eSBGaWVsZCBiaXQgKi8KQEAgLTE5NiwyMiArMTk2LDIyIEBACiAjZWxzZQogCiAvKiBHRVQgJiBTRVQgRnJhbWUgQ29udHJvbCBiaXQgKi8KLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFJWRVIobikgICAgKCgoV09SRCkobikpICYgKEJJVDAgfCBCSVQxKSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfRlRZUEUobikgICAgKCgoKFdPUkQpKG4pKSAmIChCSVQyIHwgQklUMykpID4+IDIpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKSAgICgoKChXT1JEKShuKSkgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1RPRFMobikgICAgICgoKChXT1JEKShuKSkgJiAoQklUOCkpID4+IDgpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZST01EUyhuKSAgICgoKChXT1JEKShuKSkgJiAoQklUOSkpID4+IDkpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVGUkFHKG4pICgoKChXT1JEKShuKSkgJiAoQklUMTApKSA+PiAxMCkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfUkVUUlkobikgICAgKCgoKFdPUkQpKG4pKSAmIChCSVQxMSkpID4+IDExKQotI2RlZmluZSBXTEFOX0dFVF9GQ19QV1JNR1QobikgICAoKCgoV09SRCkobikpICYgKEJJVDEyKSkgPj4gMTIpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVEQVRBKG4pICgoKChXT1JEKShuKSkgJiAoQklUMTMpKSA+PiAxMykKLSNkZWZpbmUgV0xBTl9HRVRfRkNfSVNXRVAobikgICAgKCgoKFdPUkQpKG4pKSAmIChCSVQxNCkpID4+IDE0KQotI2RlZmluZSBXTEFOX0dFVF9GQ19PUkRFUihuKSAgICAoKCgoV09SRCkobikpICYgKEJJVDE1KSkgPj4gMTUpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1BSVkVSKG4pICAgICgoKHVuc2lnbmVkIHNob3J0KShuKSkgJiAoQklUMCB8IEJJVDEpKQorI2RlZmluZSBXTEFOX0dFVF9GQ19GVFlQRShuKSAgICAoKCgodW5zaWduZWQgc2hvcnQpKG4pKSAmIChCSVQyIHwgQklUMykpID4+IDIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKSAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDR8QklUNXxCSVQ2fEJJVDcpKSA+PiA0KQorI2RlZmluZSBXTEFOX0dFVF9GQ19UT0RTKG4pICAgICAoKCgodW5zaWduZWQgc2hvcnQpKG4pKSAmIChCSVQ4KSkgPj4gOCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfRlJPTURTKG4pICAgKCgoKHVuc2lnbmVkIHNob3J0KShuKSkgJiAoQklUOSkpID4+IDkpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVGUkFHKG4pICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDEwKSkgPj4gMTApCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pICAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDExKSkgPj4gMTEpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1BXUk1HVChuKSAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDEyKSkgPj4gMTIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVEQVRBKG4pICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDEzKSkgPj4gMTMpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0lTV0VQKG4pICAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDE0KSkgPj4gMTQpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX09SREVSKG4pICAgICgoKCh1bnNpZ25lZCBzaG9ydCkobikpICYgKEJJVDE1KSkgPj4gMTUpCiAKIAogLyogU2VxdWVuY2UgRmllbGQgYml0ICovCi0jZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkdOVU0obikgKCgoV09SRCkobikpICYgKEJJVDB8QklUMXxCSVQyfEJJVDMpKQotI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRTlVNKG4pICgoKChXT1JEKShuKSkgJiAofihCSVQwfEJJVDF8QklUMnxCSVQzKSkpID4+IDQpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkdOVU0obikgKCgodW5zaWduZWQgc2hvcnQpKG4pKSAmIChCSVQwfEJJVDF8QklUMnxCSVQzKSkKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUU5VTShuKSAoKCgodW5zaWduZWQgc2hvcnQpKG4pKSAmICh+KEJJVDB8QklUMXxCSVQyfEJJVDMpKSkgPj4gNCkKIAogCiAvKiBDYXBhYmlsaXR5IEZpZWxkIGJpdCAqLwpAQCAtMjQ2LDIwICsyNDYsMjAgQEAKICNkZWZpbmUgV0xBTl9TRVRfQ0FQX0lORk9fR1JQQUNLKG4pICAgICAgICAoKG4pIDw8IDE0KQogCiAKLSNkZWZpbmUgV0xBTl9TRVRfRkNfUFJWRVIobikgICAgKChXT1JEKShuKSkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfRlRZUEUobikgICAgKCgoV09SRCkobikpIDw8IDIpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0ZTVFlQRShuKSAgICgoKFdPUkQpKG4pKSA8PCA0KQotI2RlZmluZSBXTEFOX1NFVF9GQ19UT0RTKG4pICAgICAoKChXT1JEKShuKSkgPDwgOCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfRlJPTURTKG4pICAgKCgoV09SRCkobikpIDw8IDkpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVGUkFHKG4pICgoKFdPUkQpKG4pKSA8PCAxMCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfUkVUUlkobikgICAgKCgoV09SRCkobikpIDw8IDExKQotI2RlZmluZSBXTEFOX1NFVF9GQ19QV1JNR1QobikgICAoKChXT1JEKShuKSkgPDwgMTIpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVEQVRBKG4pICgoKFdPUkQpKG4pKSA8PCAxMykKLSNkZWZpbmUgV0xBTl9TRVRfRkNfSVNXRVAobikgICAgKCgoV09SRCkobikpIDw8IDE0KQotI2RlZmluZSBXTEFOX1NFVF9GQ19PUkRFUihuKSAgICAoKChXT1JEKShuKSkgPDwgMTUpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1BSVkVSKG4pICAgICgodW5zaWduZWQgc2hvcnQpKG4pKQorI2RlZmluZSBXTEFOX1NFVF9GQ19GVFlQRShuKSAgICAoKCh1bnNpZ25lZCBzaG9ydCkobikpIDw8IDIpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0ZTVFlQRShuKSAgICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgNCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfVE9EUyhuKSAgICAgKCgodW5zaWduZWQgc2hvcnQpKG4pKSA8PCA4KQorI2RlZmluZSBXTEFOX1NFVF9GQ19GUk9NRFMobikgICAoKCh1bnNpZ25lZCBzaG9ydCkobikpIDw8IDkpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVGUkFHKG4pICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgMTApCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1JFVFJZKG4pICAgICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgMTEpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1BXUk1HVChuKSAgICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgMTIpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVEQVRBKG4pICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgMTMpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0lTV0VQKG4pICAgICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgMTQpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX09SREVSKG4pICAgICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgMTUpCiAKLSNkZWZpbmUgV0xBTl9TRVRfU0VRX0ZSR05VTShuKSAoKFdPUkQpKG4pKQotI2RlZmluZSBXTEFOX1NFVF9TRVFfU0VRTlVNKG4pICgoKFdPUkQpKG4pKSA8PCA0KQorI2RlZmluZSBXTEFOX1NFVF9TRVFfRlJHTlVNKG4pICgodW5zaWduZWQgc2hvcnQpKG4pKQorI2RlZmluZSBXTEFOX1NFVF9TRVFfU0VRTlVNKG4pICgoKHVuc2lnbmVkIHNob3J0KShuKSkgPDwgNCkKIAogLyogRVJQIEZpZWxkIGJpdCAqLwogCkBAIC0yODIsNTAgKzI4Miw1MCBAQAogI2RlZmluZSBXTEFOX01HTVRfR0VUX1RJTV9PRkZTRVQoYikgICAgICgoKGIpICYgfkJJVDApID4+IDEpCiAKIC8qIDMtQWRkciAmIDQtQWRkciAqLwotI2RlZmluZSBXTEFOX0hEUl9BM19EQVRBX1BUUihwKSAoKChQQllURSkocCkpICsgV0xBTl9IRFJfQUREUjNfTEVOKQotI2RlZmluZSBXTEFOX0hEUl9BNF9EQVRBX1BUUihwKSAoKChQQllURSkocCkpICsgV0xBTl9IRFJfQUREUjRfTEVOKQorI2RlZmluZSBXTEFOX0hEUl9BM19EQVRBX1BUUihwKSAoKCh1bnNpZ25lZCBjaGFyICopKHApKSArIFdMQU5fSERSX0FERFIzX0xFTikKKyNkZWZpbmUgV0xBTl9IRFJfQTRfREFUQV9QVFIocCkgKCgodW5zaWduZWQgY2hhciAqKShwKSkgKyBXTEFOX0hEUl9BRERSNF9MRU4pCiAKIC8qIElFRUUgQUREUiAqLwogI2RlZmluZSBJRUVFX0FERFJfVU5JVkVSU0FMICAgICAgICAgMHgwMgogI2RlZmluZSBJRUVFX0FERFJfR1JPVVAgICAgICAgICAgICAgMHgwMQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgQllURSAgICAgICAgICAgIGFieUFkZHJbNl07CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRyWzZdOwogfSBJRUVFX0FERFIsICpQSUVFRV9BRERSOwogCiAvKiA4MDIuMTEgSGVhZGVyIEZvcm1hdCAqLwogCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOXzgwMjExSERSX0EyIHsKIAotICAgIFdPUkQgICAgd0ZyYW1lQ3RsOwotICAgIFdPUkQgICAgd0R1cmF0aW9uSUQ7Ci0gICAgQllURSAgICBhYnlBZGRyMVtXTEFOX0FERFJfTEVOXTsKLSAgICBCWVRFICAgIGFieUFkZHIyW1dMQU5fQUREUl9MRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdGcmFtZUN0bDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25JRDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIxW1dMQU5fQUREUl9MRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5QWRkcjJbV0xBTl9BRERSX0xFTl07CiAKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl84MDIxMUhEUl9BMiwgKlBXTEFOXzgwMjExSERSX0EyOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOXzgwMjExSERSX0EzIHsKIAotICAgIFdPUkQgICAgd0ZyYW1lQ3RsOwotICAgIFdPUkQgICAgd0R1cmF0aW9uSUQ7Ci0gICAgQllURSAgICBhYnlBZGRyMVtXTEFOX0FERFJfTEVOXTsKLSAgICBCWVRFICAgIGFieUFkZHIyW1dMQU5fQUREUl9MRU5dOwotICAgIEJZVEUgICAgYWJ5QWRkcjNbV0xBTl9BRERSX0xFTl07Ci0gICAgV09SRCAgICB3U2VxQ3RsOworICAgIHVuc2lnbmVkIHNob3J0IHdGcmFtZUN0bDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25JRDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIxW1dMQU5fQUREUl9MRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5QWRkcjJbV0xBTl9BRERSX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRyM1tXTEFOX0FERFJfTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3U2VxQ3RsOwogCiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl84MDIxMUhEUl9BMywgKlBXTEFOXzgwMjExSERSX0EzOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOXzgwMjExSERSX0E0IHsKIAotICAgIFdPUkQgICAgd0ZyYW1lQ3RsOwotICAgIFdPUkQgICAgd0R1cmF0aW9uSUQ7Ci0gICAgQllURSAgICBhYnlBZGRyMVtXTEFOX0FERFJfTEVOXTsKLSAgICBCWVRFICAgIGFieUFkZHIyW1dMQU5fQUREUl9MRU5dOwotICAgIEJZVEUgICAgYWJ5QWRkcjNbV0xBTl9BRERSX0xFTl07Ci0gICAgV09SRCAgICB3U2VxQ3RsOwotICAgIEJZVEUgICAgYWJ5QWRkcjRbV0xBTl9BRERSX0xFTl07CisgICAgdW5zaWduZWQgc2hvcnQgd0ZyYW1lQ3RsOworICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbklEOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5QWRkcjFbV0xBTl9BRERSX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRyMltXTEFOX0FERFJfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIzW1dMQU5fQUREUl9MRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdTZXFDdGw7CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRyNFtXTEFOX0FERFJfTEVOXTsKIAogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBXTEFOXzgwMjExSERSX0E0LCAqUFdMQU5fODAyMTFIRFJfQTQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmMKaW5kZXggMzg2OTdjOC4uMWVkMGYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFtZ3IuYwpAQCAtOTksOSArOTksOSBAQAogICAgIC8vIEZpeGVkIEZpZWxkcwogICAgIHBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQkVBQ09OX09GRl9UUyk7Ci0gICAgcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQkVBQ09OX09GRl9CQ05fSU5UKTsKLSAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8pOwogCiAgICAgcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0JFQUNPTl9PRkZfU1NJRDsKQEAgLTEzMywxNSArMTMzLDE1IEBACiAgICAgLy8gRml4ZWQgRmllbGRzCiAgICAgcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9CRUFDT05fT0ZGX1RTKTsKLSAgICBwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQpOwotICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTyk7CiAKICAgICAvLyBJbmZvcm1hdGlvbiBlbGVtZW50cwotICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoUEJZVEUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSkKKyAgICBwSXRlbSA9IChQV0xBTl9JRSkoKHVuc2lnbmVkIGNoYXIgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpKQogICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQkVBQ09OX09GRl9TU0lEKTsKLSAgICB3aGlsZSggKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pICl7CisgICAgd2hpbGUoICgodW5zaWduZWQgY2hhciAqKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikgKXsKIAogICAgICAgICBzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCkgewogICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9TU0lEOgpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6CiAgICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXUEFiX0lzX1JTTigoUFdMQU5fSUVfUlNOX0VYVClwSXRlbSkgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOV1BBID0gKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgfQotICAgICAgICBwSXRlbSA9IChQV0xBTl9JRSkoKChQQllURSlwSXRlbSkgKyAyICsgcEl0ZW0tPmxlbik7CisgICAgICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgKyAyICsgcEl0ZW0tPmxlbik7CiAgICAgfQogCiAgICAgcmV0dXJuOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdSZWFzb24gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOwogICAgIHBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OICsgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOwogCkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdSZWFzb24gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOwogCiAgICAgcmV0dXJuOwpAQCAtMzQ4LDkgKzM0OCw5IEBACiB7CiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAgICAgLy8gRml4ZWQgRmllbGRzCi0gICAgcEZyYW1lLT5wd0NhcEluZm8gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVNTT0NSRVFfT0ZGX0NBUF9JTkZPKTsKLSAgICBwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CiAgICAgcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UICsgc2l6ZW9mKCoocEZyYW1lLT5wd0xpc3RlbkludGVydmFsKSk7CiAgICAgcmV0dXJuOwpAQCAtMzc3LDE2ICszNzcsMTYgQEAKIAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7Ci0gICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CiAKICAgICAvLyBJbmZvcm1hdGlvbiBlbGVtZW50cwogICAgIHBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVNTT0NSRVFfT0ZGX1NTSUQpOwogCi0gICAgd2hpbGUgKCgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgeworICAgIHdoaWxlICgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSB7CiAgICAgICAgIHN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKXsKICAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfU1NJRDoKICAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wU1NJRCA9PSBOVUxMKQpAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6CiAgICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXUEFiX0lzX1JTTigoUFdMQU5fSUVfUlNOX0VYVClwSXRlbSkgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOV1BBID0gKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+YnlFbGVtZW50SUQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKFBCWVRFKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKKyAgICAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKCgodW5zaWduZWQgY2hhciAqKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKICAgICB9CiAgICAgcmV0dXJuOwogfQpAQCAtNDQyLDExICs0NDIsMTEgQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwotICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKLSAgICBwRnJhbWUtPnB3QWlkID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX0FJRCk7CiAgICAgcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FTU09DUkVTUF9PRkZfQUlECiAgICAgICAgICAgICAgICAgICArIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKQEAgLTQ3NiwxMSArNDc2LDExIEBACiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKICAgICAvLyBGaXhlZCBGaWVsZHMKLSAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKLSAgICBwRnJhbWUtPnB3U3RhdHVzID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0gICAgcEZyYW1lLT5wd0FpZCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQpOwogCiAgICAgLy8gSW5mb3JtYXRpb24gZWxlbWVudHMKQEAgLTQ4OCw5ICs0ODgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NVUFBfUkFURVMpOwogCiAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKHBGcmFtZS0+cFN1cHBSYXRlcyk7Ci0gICAgcEl0ZW0gPSAoUFdMQU5fSUUpKCgoUEJZVEUpcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOworICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgKyAyICsgcEl0ZW0tPmxlbik7CiAKLSAgICBpZiAoKCgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgJiYgKHBJdGVtLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTKSkgeworICAgIGlmICgoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgJiYKKwkJICAgIChwSXRlbS0+YnlFbGVtZW50SUQgPT0gV0xBTl9FSURfRVhUU1VQUF9SQVRFUykpIHsKICAgICAgICAgcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBGcmFtZS0+cEV4dFN1cHBSYXRlcz1bJXBdLlxuIiwgcEl0ZW0pOwogICAgIH0KQEAgLTUyMCw5ICs1MjEsOSBAQAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAgICAgLy8gRml4ZWQgRmllbGRzCi0gICAgcEZyYW1lLT5wd0NhcEluZm8gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotICAgIHBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CiAgICAgcEZyYW1lLT5wQWRkckN1cnJBUCA9IChQSUVFRV9BRERSKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKQEAgLTU1Myw5ICs1NTQsOSBAQAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAgICAgLy8gRml4ZWQgRmllbGRzCi0gICAgcEZyYW1lLT5wd0NhcEluZm8gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotICAgIHBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CiAgICAgcEZyYW1lLT5wQWRkckN1cnJBUCA9IChQSUVFRV9BRERSKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKQEAgLTU2NCw3ICs1NjUsNyBAQAogICAgIHBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX1NTSUQpOwogCi0gICAgd2hpbGUoKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSB7CisgICAgd2hpbGUoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgewogCiAgICAgICAgIHN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKXsKICAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfU1NJRDoKQEAgLTU4Myw3ICs1ODQsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBSU05XUEEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgIGlmIChXUEFiX0lzX1JTTigoUFdMQU5fSUVfUlNOX0VYVClwSXRlbSkgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU5Nyw3ICs1OTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJdGVtLT5ieUVsZW1lbnRJRCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKCgoUEJZVEUpcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOworICAgICAgICBwSXRlbSA9IChQV0xBTl9JRSkoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOwogICAgIH0KICAgICByZXR1cm47CiB9CkBAIC02NDksNyArNjUwLDcgQEAKICAgICAvLyBJbmZvcm1hdGlvbiBlbGVtZW50cwogICAgIHBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkpOwogCi0gICAgd2hpbGUoICgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSApIHsKKyAgICB3aGlsZSggKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSApIHsKIAogICAgICAgICBzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCkgewogICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9TU0lEOgpAQCAtNjcyLDcgKzY3Myw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBwSXRlbSA9IChQV0xBTl9JRSkoKChQQllURSlwSXRlbSkgKyAyICsgIHBJdGVtLT5sZW4pOworICAgICAgICBwSXRlbSA9IChQV0xBTl9JRSkoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pICsgMiArICBwSXRlbS0+bGVuKTsKICAgICB9CiAgICAgcmV0dXJuOwogfQpAQCAtNzAwLDkgKzcwMSw5IEBACiAgICAgLy8gRml4ZWQgRmllbGRzCiAgICAgcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX1RTKTsKLSAgICBwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQpOwotICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8pOwogCiAgICAgcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8gKwpAQCAtNzM3LDE2ICs3MzgsMTYgQEAKICAgICAvLyBGaXhlZCBGaWVsZHMKICAgICBwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfVFMpOwotICAgIHBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX0lOVCk7Ci0gICAgcEZyYW1lLT5wd0NhcEluZm8gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTyk7CiAKICAgICAvLyBJbmZvcm1hdGlvbiBlbGVtZW50cwogICAgIHBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfU1NJRCk7CiAKLSAgICB3aGlsZSggKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pICkgeworICAgIHdoaWxlKCAoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pICkgewogICAgICAgICBzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCkgewogICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9TU0lEOgogICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTU0lEID09IE5VTEwpCkBAIC03NzgsNyArNzc5LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfUlNOX1dQQToKICAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04MjEsNyArODIyLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKFBCWVRFKXBJdGVtKSArIDIgKyAgcEl0ZW0tPmxlbik7CisgICAgICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKHVuc2lnbmVkIGNoYXIgKilwSXRlbSkgKyAyICsgIHBJdGVtLT5sZW4pOwogICAgIH0KICAgICByZXR1cm47CiB9CkBAIC04NDYsMTEgKzg0NywxMSBAQAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAgICAgLy8gRml4ZWQgRmllbGRzCi0gICAgcEZyYW1lLT5wd0F1dGhBbGdvcml0aG0gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7Ci0gICAgcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX1NFUSk7Ci0gICAgcEZyYW1lLT5wd1N0YXR1cyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9TVEFUVVMpOwogICAgIHBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyArIHNpemVvZigqKHBGcmFtZS0+cHdTdGF0dXMpKTsKIApAQCAtODc5LDE4ICs4ODAsMTggQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3QXV0aEFsZ29yaXRobSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOwotICAgIHBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOwotICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTKTsKIAogICAgIC8vIEluZm9ybWF0aW9uIGVsZW1lbnRzCiAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9DSEFMTEVOR0UpOwogCi0gICAgaWYgKCgoKFBCWVRFKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikpICYmIChwSXRlbS0+YnlFbGVtZW50SUQgPT0gV0xBTl9FSURfQ0hBTExFTkdFKSkgeworICAgIGlmICgoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgJiYgKHBJdGVtLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9DSEFMTEVOR0UpKSB7CiAgICAgICAgIHBGcmFtZS0+cENoYWxsZW5nZSA9IChQV0xBTl9JRV9DSEFMTEVOR0UpcEl0ZW07CiAgICAgfQogCkBAIC05MTcsNyArOTE4LDcgQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdSZWFzb24gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOwogICAgIHBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OICsgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOwogCkBAIC05NDQsNyArOTQ1LDcgQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdSZWFzb24gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQorICAgIHBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOwogCiAgICAgcmV0dXJuOwpAQCAtOTcwLDExICs5NzEsMTEgQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7Ci0gICAgcEZyYW1lLT5wd1N0YXR1cyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0gICAgcEZyYW1lLT5wd0FpZCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKICAgICBwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCArIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKQEAgLTEwMDUsMTEgKzEwMDYsMTEgQEAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogICAgIC8vIEZpeGVkIEZpZWxkcwotICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKKyAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7Ci0gICAgcEZyYW1lLT5wd1N0YXR1cyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0gICAgcEZyYW1lLT5wd0FpZCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCisgICAgcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKICAgICAvL0luZm9ybWF0aW9uIGVsZW1lbnRzCkBAIC0xMDE3LDkgKzEwMTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTKTsKIAogICAgIHBJdGVtID0gKFBXTEFOX0lFKShwRnJhbWUtPnBTdXBwUmF0ZXMpOwotICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKFBCWVRFKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKKyAgICBwSXRlbSA9IChQV0xBTl9JRSkoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOwogCi0gICAgaWYgKCgoKFBCWVRFKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikpICYmIChwSXRlbS0+YnlFbGVtZW50SUQgPT0gV0xBTl9FSURfRVhUU1VQUF9SQVRFUykpIHsKKyAgICBpZiAoKCgodW5zaWduZWQgY2hhciAqKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikpICYmCisJCSAgICAocEl0ZW0tPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0VYVFNVUFBfUkFURVMpKSB7CiAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogICAgIH0KICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmgKaW5kZXggNjU4ZmUxNC4uM2JkYWIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFtZ3IuaApAQCAtMTksNyArMTksNyBAQAogICoKICAqIEZpbGU6IDgwMjExbWdyLmgKICAqCi0gKiBQdXJwb3NlOiA4MDIuMTEgbWFuYWdtZW50IGZyYW1lcyBwcmUtZGVmaW5lcy4KKyAqIFB1cnBvc2U6IDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcyBwcmUtZGVmaW5lcy4KICAqCiAgKgogICogQXV0aG9yOiBMeW5kb24gQ2hlbgpAQCAtMjMwLDggKzIzMCw4IEBACiAKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRSB7Ci0gICAgQllURSAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICBsZW47CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBXTEFOX0lFLCAqUFdMQU5fSUU7CiAKQEAgLTIzOSw5ICsyMzksOSBAQAogLy8gU2VydmljZSBTZXQgSWRlbnRpdHkgKFNTSUQpCiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfU1NJRCB7Ci0gICAgQllURSAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICBsZW47Ci0gICAgQllURSAgIGFieVNTSURbMV07CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVNTSURbMV07CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl9JRV9TU0lELCAqUFdMQU5fSUVfU1NJRDsKIApAQCAtMjQ5LDkgKzI0OSw5IEBACiAvLyBTdXBwb3J0ZWQgUmF0ZXMKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRV9TVVBQX1JBVEVTIHsKLSAgICBCWVRFICAgYnlFbGVtZW50SUQ7Ci0gICAgQllURSAgIGxlbjsKLSAgICBCWVRFICAgYWJ5UmF0ZXNbMV07CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVJhdGVzWzFdOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfU1VQUF9SQVRFUywgICpQV0xBTl9JRV9TVVBQX1JBVEVTOwogCkBAIC0yNjAsMjAgKzI2MCwyMCBAQAogLy8gRkggUGFyYW1ldGVyIFNldAogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9JRV9GSF9QQVJNUyB7Ci0gICAgQllURSAgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgIGxlbjsKLSAgICBXT1JEICAgIHdEd2VsbFRpbWU7Ci0gICAgQllURSAgICBieUhvcFNldDsKLSAgICBCWVRFICAgIGJ5SG9wUGF0dGVybjsKLSAgICBCWVRFICAgIGJ5SG9wSW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHdlbGxUaW1lOworICAgIHVuc2lnbmVkIGNoYXIgYnlIb3BTZXQ7CisgICAgdW5zaWduZWQgY2hhciBieUhvcFBhdHRlcm47CisgICAgdW5zaWduZWQgY2hhciBieUhvcEluZGV4OwogfSBXTEFOX0lFX0ZIX1BBUk1TLCAgKlBXTEFOX0lFX0ZIX1BBUk1TOwogCiAvLyBEUyBQYXJhbWV0ZXIgU2V0CiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfRFNfUEFSTVMgewotICAgIEJZVEUgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgbGVuOwotICAgIEJZVEUgICBieUN1cnJDaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgYnlFbGVtZW50SUQ7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBieUN1cnJDaGFubmVsOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfRFNfUEFSTVMsICAqUFdMQU5fSUVfRFNfUEFSTVM7CiAKQEAgLTI4MSwxMiArMjgxLDEyIEBACiAvLyBDRiBQYXJhbWV0ZXIgU2V0CiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfQ0ZfUEFSTVMgewotICAgIEJZVEUgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgbGVuOwotICAgIEJZVEUgICBieUNGUENvdW50OwotICAgIEJZVEUgICBieUNGUFBlcmlvZDsKLSAgICBXT1JEICAgd0NGUE1heER1cmF0aW9uOwotICAgIFdPUkQgICB3Q0ZQRHVyUmVtYWluaW5nOworICAgIHVuc2lnbmVkIGNoYXIgYnlFbGVtZW50SUQ7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBieUNGUENvdW50OworICAgIHVuc2lnbmVkIGNoYXIgYnlDRlBQZXJpb2Q7CisgICAgdW5zaWduZWQgc2hvcnQgd0NGUE1heER1cmF0aW9uOworICAgIHVuc2lnbmVkIHNob3J0IHdDRlBEdXJSZW1haW5pbmc7CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl9JRV9DRl9QQVJNUywgICpQV0xBTl9JRV9DRl9QQVJNUzsKIApAQCAtMjk0LDEyICsyOTQsMTIgQEAKIC8vIFRJTQogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0lFX1RJTSB7Ci0gICAgQllURSAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICBsZW47Ci0gICAgQllURSAgIGJ5RFRJTUNvdW50OwotICAgIEJZVEUgICBieURUSU1QZXJpb2Q7Ci0gICAgQllURSAgIGJ5Qml0TWFwQ3RsOwotICAgIEJZVEUgICBieVZpcnRCaXRNYXBbMV07CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RFRJTUNvdW50OworICAgIHVuc2lnbmVkIGNoYXIgYnlEVElNUGVyaW9kOworICAgIHVuc2lnbmVkIGNoYXIgYnlCaXRNYXBDdGw7CisgICAgdW5zaWduZWQgY2hhciBieVZpcnRCaXRNYXBbMV07CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl9JRV9USU0sICAqUFdMQU5fSUVfVElNOwogCkBAIC0zMDcsOSArMzA3LDkgQEAKIC8vIElCU1MgUGFyYW1ldGVyIFNldAogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0lFX0lCU1NfUEFSTVMgewotICAgIEJZVEUgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgbGVuOwotICAgIFdPUkQgICB3QVRJTVdpbmRvdzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIHNob3J0IHdBVElNV2luZG93OwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfSUJTU19QQVJNUywgKlBXTEFOX0lFX0lCU1NfUEFSTVM7CiAKQEAgLTMxNyw4NCArMzE3LDg0IEBACiAvLyBDaGFsbGVuZ2UgVGV4dAogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0lFX0NIQUxMRU5HRSB7Ci0gICAgQllURSAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICBsZW47Ci0gICAgQllURSAgIGFieUNoYWxsZW5nZVsxXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q2hhbGxlbmdlWzFdOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfQ0hBTExFTkdFLCAgKlBXTEFOX0lFX0NIQUxMRU5HRTsKIAogCiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfUlNOX0VYVCB7Ci0gICAgQllURSBieUVsZW1lbnRJRDsKLSAgICBCWVRFIGxlbjsKLSAgICBCWVRFIGFieU9VSVs0XTsKLSAgICBXT1JEIHdWZXJzaW9uOwotICAgIEJZVEUgYWJ5TXVsdGljYXN0WzRdOwotICAgIFdPUkQgd1BLQ291bnQ7CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGFieU9VSVs0XTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VmVyc2lvbjsKKyAgICB1bnNpZ25lZCBjaGFyIGFieU11bHRpY2FzdFs0XTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UEtDb3VudDsKICAgICBzdHJ1Y3QgewotICAgICAgICBCWVRFIGFieU9VSVs0XTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBhYnlPVUlbNF07CiAgICAgfSBQS1NMaXN0WzFdOyAvLyB0aGUgcmVzdCBpcyB2YXJpYWJsZSBzbyBuZWVkIHRvCiAgICAgLy8gb3ZlcmxheSBpZWF1dGggc3RydWN0dXJlCiB9IFdMQU5fSUVfUlNOX0VYVCwgKlBXTEFOX0lFX1JTTl9FWFQ7CiAKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRV9SU05fQVVUSCB7Ci0gICAgV09SRCB3QXV0aENvdW50OworICAgIHVuc2lnbmVkIHNob3J0IHdBdXRoQ291bnQ7CiAgICAgc3RydWN0IHsKLSAgICAgICAgQllURSBhYnlPVUlbNF07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYWJ5T1VJWzRdOwogICAgIH0gQXV0aEtTTGlzdFsxXTsKIH0gV0xBTl9JRV9SU05fQVVUSCwgKlBXTEFOX0lFX1JTTl9BVVRIOwogCiAvLyBSU04gSWRlbnRpdHkKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRV9SU04gewotICAgIEJZVEUgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgbGVuOwotICAgIFdPUkQgICB3VmVyc2lvbjsKLSAgICBCWVRFICAgYWJ5UlNOW1dMQU5fTUlOX0FSUkFZXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIHNob3J0IHdWZXJzaW9uOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UlNOW1dMQU5fTUlOX0FSUkFZXTsKIH0gV0xBTl9JRV9SU04sICpQV0xBTl9JRV9SU047CiAKIAogLy8gRVJQCiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfRVJQIHsKLSAgICBCWVRFICAgYnlFbGVtZW50SUQ7Ci0gICAgQllURSAgIGxlbjsKLSAgICBCWVRFICAgYnlDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgYnlFbGVtZW50SUQ7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBieUNvbnRleHQ7CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl9JRV9FUlAsICAqUFdMQU5fSUVfRVJQOwogCiAKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgX01FQVNFVVJFX1JFUSB7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNoYW5uZWw7Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlTdGFydFRpbWVbOF07Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlEdXJhdGlvblsyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVN0YXJ0VGltZVs4XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUR1cmF0aW9uWzJdOwogfSBNRUFTRVVSRV9SRVEsICpQTUVBU0VVUkVfUkVRLAogICBNRUFTRVVSRV9SRVFfQkFTSUMsICpQTUVBU0VVUkVfUkVRX0JBU0lDLAogICBNRUFTRVVSRV9SRVFfQ0NBLCAqUE1FQVNFVVJFX1JFUV9DQ0EsCiAgIE1FQVNFVVJFX1JFUV9SUEksICpQTUVBU0VVUkVfUkVRX1JQSTsKIAogdHlwZWRlZiBzdHJ1Y3QgX01FQVNFVVJFX1JFUF9CQVNJQyB7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNoYW5uZWw7Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlTdGFydFRpbWVbOF07Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlEdXJhdGlvblsyXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5TWFwOworICAgIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U3RhcnRUaW1lWzhdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5RHVyYXRpb25bMl07CisgICAgdW5zaWduZWQgY2hhciBieU1hcDsKIH0gTUVBU0VVUkVfUkVQX0JBU0lDLCAqUE1FQVNFVVJFX1JFUF9CQVNJQzsKIAogdHlwZWRlZiBzdHJ1Y3QgX01FQVNFVVJFX1JFUF9DQ0EgewotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlDaGFubmVsOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5U3RhcnRUaW1lWzhdOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5RHVyYXRpb25bMl07Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNDQUJ1c3lGcmFjdGlvbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVN0YXJ0VGltZVs4XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUR1cmF0aW9uWzJdOworICAgIHVuc2lnbmVkIGNoYXIgYnlDQ0FCdXN5RnJhY3Rpb247CiB9IE1FQVNFVVJFX1JFUF9DQ0EsICpQTUVBU0VVUkVfUkVQX0NDQTsKIAogdHlwZWRlZiBzdHJ1Y3QgX01FQVNFVVJFX1JFUF9SUEkgewotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlDaGFubmVsOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5U3RhcnRUaW1lWzhdOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5RHVyYXRpb25bMl07Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlSUElkZW5zaXR5WzhdOworICAgIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U3RhcnRUaW1lWzhdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5RHVyYXRpb25bMl07CisgICAgdW5zaWduZWQgY2hhciBhYnlSUElkZW5zaXR5WzhdOwogfSBNRUFTRVVSRV9SRVBfUlBJLCAqUE1FQVNFVVJFX1JFUF9SUEk7CiAKIHR5cGVkZWYgdW5pb24gX01FQVNFVVJFX1JFUCB7CkBAIC00MDYsODUgKzQwNiw4NSBAQAogfSBNRUFTRVVSRV9SRVAsICpQTUVBU0VVUkVfUkVQOwogCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9JRV9NRUFTVVJFX1JFUSB7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGxlbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5VG9rZW47Ci0gICAgQllURSAgICAgICAgICAgICAgICBieU1vZGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieVR5cGU7CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VG9rZW47CisgICAgdW5zaWduZWQgY2hhciBieU1vZGU7CisgICAgdW5zaWduZWQgY2hhciBieVR5cGU7CiAgICAgTUVBU0VVUkVfUkVRICAgICAgICBzUmVxOwogfSBXTEFOX0lFX01FQVNVUkVfUkVRLCAqUFdMQU5fSUVfTUVBU1VSRV9SRVE7CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0lFX01FQVNVUkVfUkVQIHsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgbGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlUb2tlbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5TW9kZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5VHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnlUb2tlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TW9kZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VHlwZTsKICAgICBNRUFTRVVSRV9SRVAgICAgICAgIHNSZXA7CiB9IFdMQU5fSUVfTUVBU1VSRV9SRVAsICpQV0xBTl9JRV9NRUFTVVJFX1JFUDsKIAogdHlwZWRlZiBzdHJ1Y3QgX1dMQU5fSUVfQ0hfU1cgewotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlFbGVtZW50SUQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICBsZW47Ci0gICAgQllURSAgICAgICAgICAgICAgICBieU1vZGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNoYW5uZWw7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNvdW50OworICAgIHVuc2lnbmVkIGNoYXIgYnlFbGVtZW50SUQ7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBieU1vZGU7CisgICAgdW5zaWduZWQgY2hhciBieUNoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBieUNvdW50OwogfSBXTEFOX0lFX0NIX1NXLCAqUFdMQU5fSUVfQ0hfU1c7CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0lFX1FVSUVUIHsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgbGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlRdWlldENvdW50OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlRdWlldFBlcmlvZDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGFieVF1aWV0RHVyYXRpb25bMl07Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlRdWlldE9mZnNldFsyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnlRdWlldENvdW50OworICAgIHVuc2lnbmVkIGNoYXIgYnlRdWlldFBlcmlvZDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVF1aWV0RHVyYXRpb25bMl07CisgICAgdW5zaWduZWQgY2hhciBhYnlRdWlldE9mZnNldFsyXTsKIH0gV0xBTl9JRV9RVUlFVCwgKlBXTEFOX0lFX1FVSUVUOwogCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9JRV9DT1VOVFJZIHsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgbGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5Q291bnRyeVN0cmluZ1szXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGFieUNvdW50cnlJbmZvWzNdOworICAgIHVuc2lnbmVkIGNoYXIgYnlFbGVtZW50SUQ7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBhYnlDb3VudHJ5U3RyaW5nWzNdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q291bnRyeUluZm9bM107CiB9IFdMQU5fSUVfQ09VTlRSWSwgKlBXTEFOX0lFX0NPVU5UUlk7CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0lFX1BXX0NPTlNUIHsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgbGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlQb3dlcjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnlQb3dlcjsKIH0gV0xBTl9JRV9QV19DT05TVCwgKlBXTEFOX0lFX1BXX0NPTlNUOwogCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9JRV9QV19DQVAgewotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlFbGVtZW50SUQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICBsZW47Ci0gICAgQllURSAgICAgICAgICAgICAgICBieU1pblBvd2VyOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlNYXhQb3dlcjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnlNaW5Qb3dlcjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWF4UG93ZXI7CiB9IFdMQU5fSUVfUFdfQ0FQLCAqUFdMQU5fSUVfUFdfQ0FQOwogCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9JRV9TVVBQX0NIIHsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgbGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5Q2hhbm5lbFR1cGxlWzJdOworICAgIHVuc2lnbmVkIGNoYXIgYnlFbGVtZW50SUQ7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBhYnlDaGFubmVsVHVwbGVbMl07CiB9IFdMQU5fSUVfU1VQUF9DSCwgKlBXTEFOX0lFX1NVUFBfQ0g7CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0lFX1RQQ19SRVEgewotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlFbGVtZW50SUQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICBsZW47CisgICAgdW5zaWduZWQgY2hhciBieUVsZW1lbnRJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsKIH0gV0xBTl9JRV9UUENfUkVRLCAqUFdMQU5fSUVfVFBDX1JFUTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1dMQU5fSUVfVFBDX1JFUCB7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUVsZW1lbnRJRDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGxlbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5VHhQb3dlcjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5TGlua01hcmdpbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnlUeFBvd2VyOworICAgIHVuc2lnbmVkIGNoYXIgYnlMaW5rTWFyZ2luOwogfSBXTEFOX0lFX1RQQ19SRVAsICpQV0xBTl9JRV9UUENfUkVQOwogCiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0lFX0lCU1NfREZTIHsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RWxlbWVudElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgbGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5REZTT3duZXJbNl07Ci0gICAgQllURSAgICAgICAgICAgICAgICBieURGU1JlY292ZXJ5OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5Q2hhbm5lbE1hcFsyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RWxlbWVudElEOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5REZTT3duZXJbNl07CisgICAgdW5zaWduZWQgY2hhciBieURGU1JlY292ZXJ5OworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q2hhbm5lbE1hcFsyXTsKIH0gV0xBTl9JRV9JQlNTX0RGUywgKlBXTEFOX0lFX0lCU1NfREZTOwogCiAjcHJhZ21hIHBhY2soKQpAQCAtNDk1LDkgKzQ5NSw5IEBACiAvLyBwcm90b3R5cGUgc3RydWN0dXJlLCBhbGwgbWdtdCBmcmFtZSB0eXBlcyB3aWxsIHN0YXJ0IHdpdGggdGhlc2UgbWVtYmVycwogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9GUl9NR01UIHsKIAotICAgIFVJTlQgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgbGVuOwotICAgIFBCWVRFICAgICAgICAgICAgICAgICBwQnVmOworICAgIHVuc2lnbmVkIGludAl1VHlwZTsKKyAgICB1bnNpZ25lZCBpbnQJbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CiAgICAgUFVXTEFOXzgwMjExSERSICAgICAgIHBIZHI7CiAKIH0gV0xBTl9GUl9NR01ULCAgKlBXTEFOX0ZSX01HTVQ7CkBAIC01MDUsMTQgKzUwNSwxNCBAQAogLy8gQmVhY29uIGZyYW1lCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0ZSX0JFQUNPTiB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAgICAgLy8gZml4ZWQgZmllbGRzCiAgICAgUFFXT1JEICAgICAgICAgICAgICAgICAgcHF3VGltZXN0YW1wOwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3QmVhY29uSW50ZXJ2YWw7Ci0gICAgUFdPUkQgICAgICAgICAgICAgICAgICAgcHdDYXBJbmZvOworICAgIHVuc2lnbmVkIHNob3J0ICpwd0JlYWNvbkludGVydmFsOworICAgIHVuc2lnbmVkIHNob3J0ICpwd0NhcEluZm87CiAgICAgLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogICAgIFBXTEFOX0lFX1NTSUQgICAgICAgICAgIHBTU0lEOwogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgICAgIHBTdXBwUmF0ZXM7CkBAIC01MzcsOSArNTM3LDkgQEAKIC8vIElCU1MgQVRJTSBmcmFtZQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9GUl9JQlNTQVRJTSB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAKICAgICAvLyBmaXhlZCBmaWVsZHMKQEAgLTU1MSwxMiArNTUxLDEyIEBACiAvLyBEaXNhc3NvY2lhdGlvbgogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9GUl9ESVNBU1NPQyB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAgICAgLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3UmVhc29uOworICAgIHVuc2lnbmVkIHNob3J0ICpwd1JlYXNvbjsKICAgICAvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKIH0gV0xBTl9GUl9ESVNBU1NPQywgKlBXTEFOX0ZSX0RJU0FTU09DOwpAQCAtNTY0LDEzICs1NjQsMTMgQEAKIC8vIEFzc29jaWF0aW9uIFJlcXVlc3QKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fRlJfQVNTT0NSRVEgewogCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdVR5cGU7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgIHBCdWY7CisgICAgdW5zaWduZWQgaW50CXVUeXBlOworICAgIHVuc2lnbmVkIGludAlsZW47CisgICAgdW5zaWduZWQgY2hhciAqcEJ1ZjsKICAgICBQVVdMQU5fODAyMTFIRFIgICAgICAgICBwSGRyOwogICAgIC8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd0NhcEluZm87Ci0gICAgUFdPUkQgICAgICAgICAgICAgICAgICAgcHdMaXN0ZW5JbnRlcnZhbDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdDYXBJbmZvOworICAgIHVuc2lnbmVkIHNob3J0ICpwd0xpc3RlbkludGVydmFsOwogICAgIC8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KICAgICBQV0xBTl9JRV9TU0lEICAgICAgICAgICBwU1NJRDsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTICAgICBwU3VwcFJhdGVzOwpAQCAtNTg1LDE0ICs1ODUsMTQgQEAKIC8vIEFzc29jaWF0aW9uIFJlc3BvbnNlCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0ZSX0FTU09DUkVTUCB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAgICAgLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3Q2FwSW5mbzsKLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd1N0YXR1czsKLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd0FpZDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdDYXBJbmZvOworICAgIHVuc2lnbmVkIHNob3J0ICpwd1N0YXR1czsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdBaWQ7CiAgICAgLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgICAgIHBTdXBwUmF0ZXM7CiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyAgICAgcEV4dFN1cHBSYXRlczsKQEAgLTYwMiwxNCArNjAyLDE0IEBACiAvLyBSZWFzc29jaWF0aW9uIFJlcXVlc3QKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fRlJfUkVBU1NPQ1JFUSB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAKICAgICAvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0gICAgUFdPUkQgICAgICAgICAgICAgICAgICAgcHdDYXBJbmZvOwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3TGlzdGVuSW50ZXJ2YWw7CisgICAgdW5zaWduZWQgc2hvcnQgKnB3Q2FwSW5mbzsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdMaXN0ZW5JbnRlcnZhbDsKICAgICBQSUVFRV9BRERSICAgICAgICAgICAgICBwQWRkckN1cnJBUDsKIAogICAgIC8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KQEAgLTYyNCwxNCArNjI0LDE0IEBACiAvLyBSZWFzc29jaWF0aW9uIFJlc3BvbnNlCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0ZSX1JFQVNTT0NSRVNQIHsKIAotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVUeXBlOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBQQllURSAgICAgICAgICAgICAgICAgICBwQnVmOworICAgIHVuc2lnbmVkIGludAl1VHlwZTsKKyAgICB1bnNpZ25lZCBpbnQJbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CiAgICAgUFVXTEFOXzgwMjExSERSICAgICAgICAgcEhkcjsKICAgICAvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0gICAgUFdPUkQgICAgICAgICAgICAgICAgICAgcHdDYXBJbmZvOwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3U3RhdHVzOwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3QWlkOworICAgIHVuc2lnbmVkIHNob3J0ICpwd0NhcEluZm87CisgICAgdW5zaWduZWQgc2hvcnQgKnB3U3RhdHVzOworICAgIHVuc2lnbmVkIHNob3J0ICpwd0FpZDsKICAgICAvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyAgICAgcFN1cHBSYXRlczsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTICAgICBwRXh0U3VwcFJhdGVzOwpAQCAtNjQxLDkgKzY0MSw5IEBACiAvLyBQcm9iZSBSZXF1ZXN0CiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0ZSX1BST0JFUkVRIHsKIAotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVUeXBlOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBQQllURSAgICAgICAgICAgICAgICAgICBwQnVmOworICAgIHVuc2lnbmVkIGludAl1VHlwZTsKKyAgICB1bnNpZ25lZCBpbnQJbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CiAgICAgUFVXTEFOXzgwMjExSERSICAgICAgICAgcEhkcjsKICAgICAvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCiAgICAgLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwpAQCAtNjU2LDE0ICs2NTYsMTQgQEAKIC8vIFByb2JlIFJlc3BvbnNlCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0ZSX1BST0JFUkVTUCB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAgICAgLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwogICAgIFBRV09SRCAgICAgICAgICAgICAgICAgIHBxd1RpbWVzdGFtcDsKLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd0JlYWNvbkludGVydmFsOwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3Q2FwSW5mbzsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdCZWFjb25JbnRlcnZhbDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdDYXBJbmZvOwogICAgIC8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KICAgICBQV0xBTl9JRV9TU0lEICAgICAgICAgICBwU1NJRDsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTICAgICBwU3VwcFJhdGVzOwpAQCAtNjg1LDE0ICs2ODUsMTQgQEAKIC8vIEF1dGhlbnRpY2F0aW9uCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0ZSX0FVVEhFTiB7CiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1VHlwZTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcEJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQJdVR5cGU7CisgICAgdW5zaWduZWQgaW50CWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmOwogICAgIFBVV0xBTl84MDIxMUhEUiAgICAgICAgIHBIZHI7CiAgICAgLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotICAgIFBXT1JEICAgICAgICAgICAgICAgICAgIHB3QXV0aEFsZ29yaXRobTsKLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd0F1dGhTZXF1ZW5jZTsKLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd1N0YXR1czsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdBdXRoQWxnb3JpdGhtOworICAgIHVuc2lnbmVkIHNob3J0ICpwd0F1dGhTZXF1ZW5jZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdTdGF0dXM7CiAgICAgLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogICAgIFBXTEFOX0lFX0NIQUxMRU5HRSAgICAgIHBDaGFsbGVuZ2U7CiAKQEAgLTcwMSwxMiArNzAxLDEyIEBACiAvLyBEZWF1dGhlbmljYXRpb24KIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fRlJfREVBVVRIRU4gewogCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdVR5cGU7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgIHBCdWY7CisgICAgdW5zaWduZWQgaW50CXVUeXBlOworICAgIHVuc2lnbmVkIGludAlsZW47CisgICAgdW5zaWduZWQgY2hhciAqcEJ1ZjsKICAgICBQVVdMQU5fODAyMTFIRFIgICAgICAgICBwSGRyOwogICAgIC8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLSAgICBQV09SRCAgICAgICAgICAgICAgICAgICBwd1JlYXNvbjsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdSZWFzb247CiAKICAgICAvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvSUVFRTExaC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmMKaW5kZXggMjJmMTJmNS4uZTA3ZWJkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJkZXZpY2UuaCIKICNpbmNsdWRlICJ3bWdyLmgiCiAjaW5jbHVkZSAicnh0eC5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPU1TR19MRVZFTF9JTkZPOwpAQCAtNDYsNDAgKzQ3LDQwIEBACiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0ZSQU1FX0FDVElPTiB7CiAgICAgV0xBTl84MDIxMUhEUl9BMyAgICBIZWFkZXI7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNhdGVnb3J5OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlBY3Rpb247Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlWYXJzWzFdOworICAgIHVuc2lnbmVkIGNoYXIgYnlDYXRlZ29yeTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QWN0aW9uOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5VmFyc1sxXTsKIH0gV0xBTl9GUkFNRV9BQ1RJT04sICpQV0xBTl9GUkFNRV9BQ1RJT047CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0ZSQU1FX01TUlJFUSB7CiAgICAgV0xBTl84MDIxMUhEUl9BMyAgICBIZWFkZXI7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNhdGVnb3J5OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlBY3Rpb247Ci0gICAgQllURSAgICAgICAgICAgICAgICBieURpYWxvZ1Rva2VuOworICAgIHVuc2lnbmVkIGNoYXIgYnlDYXRlZ29yeTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QWN0aW9uOworICAgIHVuc2lnbmVkIGNoYXIgYnlEaWFsb2dUb2tlbjsKICAgICBXTEFOX0lFX01FQVNVUkVfUkVRIHNNU1JSZXFFSURzWzFdOwogfSBXTEFOX0ZSQU1FX01TUlJFUSwgKlBXTEFOX0ZSQU1FX01TUlJFUTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1dMQU5fRlJBTUVfTVNSUkVQIHsKICAgICBXTEFOXzgwMjExSERSX0EzICAgIEhlYWRlcjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5Q2F0ZWdvcnk7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUFjdGlvbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RGlhbG9nVG9rZW47CisgICAgdW5zaWduZWQgY2hhciBieUNhdGVnb3J5OworICAgIHVuc2lnbmVkIGNoYXIgYnlBY3Rpb247CisgICAgdW5zaWduZWQgY2hhciBieURpYWxvZ1Rva2VuOwogICAgIFdMQU5fSUVfTUVBU1VSRV9SRVAgc01TUlJlcEVJRHNbMV07CiB9IFdMQU5fRlJBTUVfTVNSUkVQLCAqUFdMQU5fRlJBTUVfTVNSUkVQOwogCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9GUkFNRV9UUENSRVEgewogICAgIFdMQU5fODAyMTFIRFJfQTMgICAgSGVhZGVyOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlDYXRlZ29yeTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5QWN0aW9uOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlEaWFsb2dUb2tlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2F0ZWdvcnk7CisgICAgdW5zaWduZWQgY2hhciBieUFjdGlvbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGlhbG9nVG9rZW47CiAgICAgV0xBTl9JRV9UUENfUkVRICAgICBzVFBDUmVxRUlEczsKIH0gV0xBTl9GUkFNRV9UUENSRVEsICpQV0xBTl9GUkFNRV9UUENSRVE7CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0ZSQU1FX1RQQ1JFUCB7CiAgICAgV0xBTl84MDIxMUhEUl9BMyAgICBIZWFkZXI7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNhdGVnb3J5OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlBY3Rpb247Ci0gICAgQllURSAgICAgICAgICAgICAgICBieURpYWxvZ1Rva2VuOworICAgIHVuc2lnbmVkIGNoYXIgYnlDYXRlZ29yeTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QWN0aW9uOworICAgIHVuc2lnbmVkIGNoYXIgYnlEaWFsb2dUb2tlbjsKICAgICBXTEFOX0lFX1RQQ19SRVAgICAgIHNUUENSZXBFSURzOwogfSBXTEFOX0ZSQU1FX1RQQ1JFUCwgKlBXTEFOX0ZSQU1FX1RQQ1JFUDsKIApAQCAtOTcsMTAgKzk4LDExIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIEJPT0wgc19iUnhNU1JSZXEoUFNNZ210T2JqZWN0IHBNZ210LCBQV0xBTl9GUkFNRV9NU1JSRVEgcE1TUlJlcSwgVUlOVCB1TGVuZ3RoKQorc3RhdGljIGJvb2wgc19iUnhNU1JSZXEoUFNNZ210T2JqZWN0IHBNZ210LCBQV0xBTl9GUkFNRV9NU1JSRVEgcE1TUlJlcSwKKwkJdW5zaWduZWQgaW50IHVMZW5ndGgpCiB7CiAgICAgc2l6ZV90ICAgIHVOdW1PZkVJRHMgPSAwOwotICAgIEJPT0wgICAgYlJlc3VsdCA9IFRSVUU7CisgICAgYm9vbCBiUmVzdWx0ID0gdHJ1ZTsKIAogICAgIGlmICh1TGVuZ3RoIDw9IFdMQU5fQTNGUl9NQVhMRU4pIHsKICAgICAgICAgbWVtY3B5KHBNZ210LT5hYnlDdXJyZW50TVNSUmVxLCBwTVNSUmVxLCB1TGVuZ3RoKTsKQEAgLTExNiw3ICsxMTgsNyBAQAogfQogCiAKLXN0YXRpYyBCT09MIHNfYlJ4VFBDUmVxKFBTTWdtdE9iamVjdCBwTWdtdCwgUFdMQU5fRlJBTUVfVFBDUkVRIHBUUENSZXEsIEJZVEUgYnlSYXRlLCBCWVRFIGJ5UlNTSSkKK3N0YXRpYyBib29sIHNfYlJ4VFBDUmVxKFBTTWdtdE9iamVjdCBwTWdtdCwgUFdMQU5fRlJBTUVfVFBDUkVRIHBUUENSZXEsIHVuc2lnbmVkIGNoYXIgYnlSYXRlLCB1bnNpZ25lZCBjaGFyIGJ5UlNTSSkKIHsKICAgICBQV0xBTl9GUkFNRV9UUENSRVAgIHBGcmFtZTsKICAgICBQU1R4TWdtdFBhY2tldCAgICAgIHBUeFBhY2tldCA9IE5VTEw7CkBAIC0xMjQsOSArMTI2LDkgQEAKIAogICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BM0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgoUEJZVEUpcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKyAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKIAotICAgIHBGcmFtZSA9IChQV0xBTl9GUkFNRV9UUENSRVApKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHBGcmFtZSA9IChQV0xBTl9GUkFNRV9UUENSRVApKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKIAogICAgIHBGcmFtZS0+SGVhZGVyLndGcmFtZUN0bCA9ICggICBXTEFOX1NFVF9GQ19GVFlQRShXTEFOX0ZUWVBFX01HTVQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fU0VUX0ZDX0ZTVFlQRShXTEFOX0ZTVFlQRV9BQ1RJT04pCkBAIC0xNzQsOCArMTc2LDggQEAKICAgICBwVHhQYWNrZXQtPmNiTVBEVUxlbiA9IHNpemVvZihXTEFOX0ZSQU1FX1RQQ1JFUCk7CiAgICAgcFR4UGFja2V0LT5jYlBheWxvYWRMZW4gPSBzaXplb2YoV0xBTl9GUkFNRV9UUENSRVApIC0gV0xBTl9IRFJfQUREUjNfTEVOOwogICAgIGlmIChjc01nbXRfeG1pdChwTWdtdC0+cEFkYXB0ZXIsIHBUeFBhY2tldCkgIT0gQ01EX1NUQVRVU19QRU5ESU5HKQotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICByZXR1cm4gKFRSVUUpOworICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICByZXR1cm4gKHRydWUpOwogLy8gICAgcmV0dXJuIChDQVJEYlNlbmRQYWNrZXQocE1nbXQtPnBBZGFwdGVyLCBwRnJhbWUsIFBLVF9UWVBFXzgwMl8xMV9NTkcsIHNpemVvZihXTEFOX0ZSQU1FX1RQQ1JFUCkpKTsKIAogfQpAQCAtMjAxLDcgKzIwMyw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IE5vbmUuCiAgKgogLSovCi1CT09MCitib29sCiBJRUVFMTFoYk1nclJ4QWN0aW9uICgKICAgICB2b2lkICpwTWdtdEhhbmRsZSwKICAgICB2b2lkICpwUnhQYWNrZXQKQEAgLTIwOSwxNCArMjExLDE0IEBACiB7CiAgICAgUFNNZ210T2JqZWN0ICAgICAgICAgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KSBwTWdtdEhhbmRsZTsKICAgICBQV0xBTl9GUkFNRV9BQ1RJT04gICAgICBwQWN0aW9uID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1TGVuZ3RoID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUxlbmd0aCA9IDA7CiAgICAgUFdMQU5fSUVfQ0hfU1cgICAgICAgICAgcENoYW5uZWxTd2l0Y2ggPSBOVUxMOwogCiAKICAgICAvLyBkZWNvZGUgdGhlIGZyYW1lCiAgICAgdUxlbmd0aCA9ICgoUFNSeE1nbXRQYWNrZXQpcFJ4UGFja2V0KS0+Y2JNUERVTGVuOwogICAgIGlmICh1TGVuZ3RoID4gV0xBTl9BM0ZSX01BWExFTikgewotICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgfQogCiAKQEAgLTIzMyw3ICsyMzUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoc19iUnhUUENSZXEocE1nbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFdMQU5fRlJBTUVfVFBDUkVRKSBwQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQU1J4TWdtdFBhY2tldClwUnhQYWNrZXQpLT5ieVJ4UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKSAoKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldCktPnVSU1NJKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikgKChQU1J4TWdtdFBhY2tldClwUnhQYWNrZXQpLT51UlNTSSkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBQ1RJT05fVFBDUkVQOgogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjQ0LDcgKzI0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkIGVsZW1lbnQgaWQKICAgICAgICAgICAgICAgICAgICAgQ0FSRGJDaGFubmVsU3dpdGNoKCBwTWdtdC0+cEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxTd2l0Y2gtPmJ5TW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVJEYnlHZXRDaGFubmVsTWFwcGluZyhwTWdtdC0+cEFkYXB0ZXIsIHBDaGFubmVsU3dpdGNoLT5ieUNoYW5uZWwsIHBNZ210LT5lQ3VycmVudFBIWU1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaGFubmVsX21hcHBpbmcocE1nbXQtPnBBZGFwdGVyLCBwQ2hhbm5lbFN3aXRjaC0+YnlDaGFubmVsLCBwTWdtdC0+ZUN1cnJlbnRQSFlNb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbFN3aXRjaC0+YnlDb3VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjU4LDEzICsyNjAsMTMgQEAKICAgICAgICAgcEFjdGlvbi0+YnlDYXRlZ29yeSB8PSAweDgwOwogCiAgICAgICAgLy9yZXR1cm4gKENBUkRiU2VuZFBhY2tldChwTWdtdC0+cEFkYXB0ZXIsIHBBY3Rpb24sIFBLVF9UWVBFXzgwMl8xMV9NTkcsIHVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKICAgICB9Ci0gICAgcmV0dXJuIChUUlVFKTsKKyAgICByZXR1cm4gKHRydWUpOwogfQogCiAKLUJPT0wgSUVFRTExaGJNU1JSZXBUeCAoCitib29sIElFRUUxMWhiTVNSUmVwVHggKAogICAgIHZvaWQgKnBNZ210SGFuZGxlCiAgICAgKQogewpAQCAtMjc1LDcgKzI3Nyw3IEBACiAKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPmFieUN1cnJlbnRNU1JSZXA7CiAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BM0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgoUEJZVEUpcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKyAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKIAogCiAgICAgcE1TUlJlcC0+SGVhZGVyLndGcmFtZUN0bCA9ICggICBXTEFOX1NFVF9GQ19GVFlQRShXTEFOX0ZUWVBFX01HTVQpIHwKQEAgLTI5NSw4ICsyOTcsOCBAQAogICAgIHBUeFBhY2tldC0+Y2JNUERVTGVuID0gdUxlbmd0aDsKICAgICBwVHhQYWNrZXQtPmNiUGF5bG9hZExlbiA9IHVMZW5ndGggLSBXTEFOX0hEUl9BRERSM19MRU47CiAgICAgaWYgKGNzTWdtdF94bWl0KHBNZ210LT5wQWRhcHRlciwgcFR4UGFja2V0KSAhPSBDTURfU1RBVFVTX1BFTkRJTkcpCi0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIHJldHVybiAoVFJVRSk7CisgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgIHJldHVybiAodHJ1ZSk7CiAvLyAgICByZXR1cm4gKENBUkRiU2VuZFBhY2tldChwTWdtdC0+cEFkYXB0ZXIsIHBNU1JSZXAsIFBLVF9UWVBFXzgwMl8xMV9NTkcsIHVMZW5ndGgpKTsKIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L0lFRUUxMWguaAppbmRleCBhZTMyNDk4Li41NDIzNDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L0lFRUUxMWguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L0lFRUUxMWguaApAQCAtNDUsNyArNDUsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CT09MIElFRUUxMWhiTVNSUmVwVHggKAorYm9vbCBJRUVFMTFoYk1TUlJlcFR4ICgKICAgICB2b2lkICpwTWdtdEhhbmRsZQogICAgICk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L01ha2VmaWxlCmluZGV4IDkzMWRlYjEuLjgyNGM5NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAKIAogdnQ2NjU1X3N0YWdlLXkgKz0JZGV2aWNlX21haW4ubyBcCiAJY2FyZC5vIFwKKwljaGFubmVsLm8gXAogCW1hYy5vIFwKIAliYXNlYmFuZC5vIFwKIAl3Y3RsLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9UT0RPCmluZGV4IGNiMDRhYWEuLjYzNjA3ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L1RPRE8KQEAgLTMsNyArMyw2IEBACiAtIHByZXBhcmUgZm9yIG1lcmdlIHdpdGggdnQ2NjU2IGRyaXZlcjoKICAgLSByZW5hbWUgREVWSUNFX1BSVCgpIHRvIERCR19QUlQoKSAtLSBkb25lCiAgIC0gc2hhcmUgODAyMTEqLmggaW5jbHVkZXMKLSAgLSBtb3ZlIGNvZGUgZm9yIGNoYW5uZWwgbWFwcGluZyBmcm9tIGNhcmQuYyB0byBjaGFubmVsLmMKICAgLSBzcGxpdCByZi5jCiAgIC0gcmVtb3ZlIGRlYWQgY29kZQogICAtIGFic3RyYWN0IFZUMzI1MyBjaGlwc2V0IHNwZWNpZmljIGNvZGUKQEAgLTExLDYgKzEwLDggQEAKIC0ga2lsbCB0dHlwZS5oCiAtIHN3aXRjaCB0byB1c2UgTElCODAyMTEKIC0gc3dpdGNoIHRvIHVzZSBNQUM4MDIxMQorLSB2ZXJpZnkgdW5zaWduZWQgbG9uZyB1c2FnZSBmb3IgeDg2LTY0IGFyY2gKKy0gcmVkdWNlIC5kYXRhIGZvb3RwcmludAogLSB1c2Uga2VybmVsIGNvZGluZyBzdHlsZQogLSBjaGVja3BhdGNoLnBsIGZpeGVzCiAtIHNwYXJzZSBmaXhlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jCmluZGV4IGZlZjFiOTEuLmUzMDE2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYWVzX2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Flc19jY21wLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICAqIFNCT1ggVGFibGUKICAqLwogCi1CWVRFIHNib3hfdGFibGVbMjU2XSA9Cit1bnNpZ25lZCBjaGFyIHNib3hfdGFibGVbMjU2XSA9CiB7CiAweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LCAweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAogMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKQEAgLTY2LDcgKzY2LDcgQEAKIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKIH07CiAKLUJZVEUgZG90Ml90YWJsZVsyNTZdID0gewordW5zaWduZWQgY2hhciBkb3QyX3RhYmxlWzI1Nl0gPSB7CiAweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBhLCAweDBjLCAweDBlLCAweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE4LCAweDFhLCAweDFjLCAweDFlLAogMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwgMHgzMCwgMHgzMiwgMHgzNCwgMHgzNiwgMHgzOCwgMHgzYSwgMHgzYywgMHgzZSwKIDB4NDAsIDB4NDIsIDB4NDQsIDB4NDYsIDB4NDgsIDB4NGEsIDB4NGMsIDB4NGUsIDB4NTAsIDB4NTIsIDB4NTQsIDB4NTYsIDB4NTgsIDB4NWEsIDB4NWMsIDB4NWUsCkBAIC04NSw3ICs4NSw3IEBACiAweGZiLCAweGY5LCAweGZmLCAweGZkLCAweGYzLCAweGYxLCAweGY3LCAweGY1LCAweGViLCAweGU5LCAweGVmLCAweGVkLCAweGUzLCAweGUxLCAweGU3LCAweGU1CiB9OwogCi1CWVRFIGRvdDNfdGFibGVbMjU2XSA9IHsKK3Vuc2lnbmVkIGNoYXIgZG90M190YWJsZVsyNTZdID0gewogMHgwMCwgMHgwMywgMHgwNiwgMHgwNSwgMHgwYywgMHgwZiwgMHgwYSwgMHgwOSwgMHgxOCwgMHgxYiwgMHgxZSwgMHgxZCwgMHgxNCwgMHgxNywgMHgxMiwgMHgxMSwKIDB4MzAsIDB4MzMsIDB4MzYsIDB4MzUsIDB4M2MsIDB4M2YsIDB4M2EsIDB4MzksIDB4MjgsIDB4MmIsIDB4MmUsIDB4MmQsIDB4MjQsIDB4MjcsIDB4MjIsIDB4MjEsCiAweDYwLCAweDYzLCAweDY2LCAweDY1LCAweDZjLCAweDZmLCAweDZhLCAweDY5LCAweDc4LCAweDdiLCAweDdlLCAweDdkLCAweDc0LCAweDc3LCAweDcyLCAweDcxLApAQCAtMTEwLDExICsxMTAsMTEgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCB4b3JfMTI4KEJZVEUgKmEsIEJZVEUgKmIsIEJZVEUgKm91dCkKK3ZvaWQgeG9yXzEyOCh1bnNpZ25lZCBjaGFyICphLCB1bnNpZ25lZCBjaGFyICpiLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7Ci1QRFdPUkQgZHdQdHJBID0gKFBEV09SRCkgYTsKLVBEV09SRCBkd1B0ckIgPSAoUERXT1JEKSBiOwotUERXT1JEIGR3UHRyT3V0ID0oUERXT1JEKSBvdXQ7Cit1bnNpZ25lZCBsb25nICpkd1B0ckEgPSAodW5zaWduZWQgbG9uZyAqKSBhOwordW5zaWduZWQgbG9uZyAqZHdQdHJCID0gKHVuc2lnbmVkIGxvbmcgKikgYjsKK3Vuc2lnbmVkIGxvbmcgKmR3UHRyT3V0ID0odW5zaWduZWQgbG9uZyAqKSBvdXQ7CiAKICAgICAoKmR3UHRyT3V0KyspID0gKCpkd1B0ckErKykgXiAoKmR3UHRyQisrKTsKICAgICAoKmR3UHRyT3V0KyspID0gKCpkd1B0ckErKykgXiAoKmR3UHRyQisrKTsKQEAgLTEyMywxOSArMTIzLDE5IEBACiB9CiAKIAotdm9pZCB4b3JfMzIoQllURSAqYSwgQllURSAqYiwgQllURSAqb3V0KQordm9pZCB4b3JfMzIodW5zaWduZWQgY2hhciAqYSwgdW5zaWduZWQgY2hhciAqYiwgdW5zaWduZWQgY2hhciAqb3V0KQogewotUERXT1JEIGR3UHRyQSA9IChQRFdPUkQpIGE7Ci1QRFdPUkQgZHdQdHJCID0gKFBEV09SRCkgYjsKLVBEV09SRCBkd1B0ck91dCA9KFBEV09SRCkgb3V0OwordW5zaWduZWQgbG9uZyAqZHdQdHJBID0gKHVuc2lnbmVkIGxvbmcgKikgYTsKK3Vuc2lnbmVkIGxvbmcgKmR3UHRyQiA9ICh1bnNpZ25lZCBsb25nICopIGI7Cit1bnNpZ25lZCBsb25nICpkd1B0ck91dCA9KHVuc2lnbmVkIGxvbmcgKikgb3V0OwogCiAgICAgKCpkd1B0ck91dCsrKSA9ICgqZHdQdHJBKyspIF4gKCpkd1B0ckIrKyk7CiB9CiAKLXZvaWQgQWRkUm91bmRLZXkoQllURSAqa2V5LCBpbnQgcm91bmQpCit2b2lkIEFkZFJvdW5kS2V5KHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IHJvdW5kKQogewotQllURSBzYm94X2tleVs0XTsKLUJZVEUgcmNvbl90YWJsZVsxMF0gPSB7IDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZ9OwordW5zaWduZWQgY2hhciBzYm94X2tleVs0XTsKK3Vuc2lnbmVkIGNoYXIgcmNvbl90YWJsZVsxMF0gPSB7IDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZ9OwogCiAgICAgc2JveF9rZXlbMF0gPSBzYm94X3RhYmxlW2tleVsxM11dOwogICAgIHNib3hfa2V5WzFdID0gc2JveF90YWJsZVtrZXlbMTRdXTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgIHhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwogfQogCi12b2lkIFN1YkJ5dGVzKEJZVEUgKmluLCBCWVRFICpvdXQpCit2b2lkIFN1YkJ5dGVzKHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7CiBpbnQgaTsKIApAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgfQogfQogCi12b2lkIFNoaWZ0Um93cyhCWVRFICppbiwgQllURSAqb3V0KQordm9pZCBTaGlmdFJvd3ModW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKICAgICBvdXRbMF0gID0gaW5bMF07CiAgICAgb3V0WzFdICA9IGluWzVdOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAgICAgb3V0WzE1XSA9IGluWzExXTsKIH0KIAotdm9pZCBNaXhDb2x1bW5zKEJZVEUgKmluLCBCWVRFICpvdXQpCit2b2lkIE1peENvbHVtbnModW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKIAogICAgIG91dFswXSA9IGRvdDJfdGFibGVbaW5bMF1dIF4gZG90M190YWJsZVtpblsxXV0gXiBpblsyXSBeIGluWzNdOwpAQCAtMTkwLDEzICsxOTAsMTMgQEAKIH0KIAogCi12b2lkIEFFU3YxMjgoQllURSAqa2V5LCBCWVRFICpkYXRhLCBCWVRFICpjaXBoZXJ0ZXh0KQordm9pZCBBRVN2MTI4KHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqY2lwaGVydGV4dCkKIHsKIGludCAgaTsKIGludCAgcm91bmQ7Ci1CWVRFIFRtcGRhdGFBWzE2XTsKLUJZVEUgVG1wZGF0YUJbMTZdOwotQllURSBhYnlSb3VuZEtleVsxNl07Cit1bnNpZ25lZCBjaGFyIFRtcGRhdGFBWzE2XTsKK3Vuc2lnbmVkIGNoYXIgVG1wZGF0YUJbMTZdOwordW5zaWduZWQgY2hhciBhYnlSb3VuZEtleVsxNl07CiAKICAgICBmb3IoaT0wOyBpPDE2OyBpKyspCiAgICAgICAgIGFieVJvdW5kS2V5W2ldID0ga2V5W2ldOwpAQCAtMjQzLDMzICsyNDMsMzMgQEAKICAqIFJldHVybiBWYWx1ZTogTUlDIGNvbXBhcmUgcmVzdWx0CiAgKgogICovCi1CT09MIEFFU2JHZW5DQ01QKFBCWVRFIHBieVJ4S2V5LCBQQllURSBwYnlGcmFtZSwgV09SRCB3RnJhbWVTaXplKQorYm9vbCBBRVNiR2VuQ0NNUCh1bnNpZ25lZCBjaGFyICpwYnlSeEtleSwgdW5zaWduZWQgY2hhciAqcGJ5RnJhbWUsIHVuc2lnbmVkIHNob3J0IHdGcmFtZVNpemUpCiB7Ci1CWVRFICAgICAgICAgICAgYWJ5Tm9uY2VbMTNdOwotQllURSAgICAgICAgICAgIE1JQ19JVlsxNl07Ci1CWVRFICAgICAgICAgICAgTUlDX0hEUjFbMTZdOwotQllURSAgICAgICAgICAgIE1JQ19IRFIyWzE2XTsKLUJZVEUgICAgICAgICAgICBhYnlNSUNbMTZdOwotQllURSAgICAgICAgICAgIGFieUNUUlBMRFsxNl07Ci1CWVRFICAgICAgICAgICAgYWJ5VG1wWzE2XTsKLUJZVEUgICAgICAgICAgICBhYnlQbGFpblRleHRbMTZdOwotQllURSAgICAgICAgICAgIGFieUxhc3RDaXBoZXJbMTZdOwordW5zaWduZWQgY2hhciBhYnlOb25jZVsxM107Cit1bnNpZ25lZCBjaGFyIE1JQ19JVlsxNl07Cit1bnNpZ25lZCBjaGFyIE1JQ19IRFIxWzE2XTsKK3Vuc2lnbmVkIGNoYXIgTUlDX0hEUjJbMTZdOwordW5zaWduZWQgY2hhciBhYnlNSUNbMTZdOwordW5zaWduZWQgY2hhciBhYnlDVFJQTERbMTZdOwordW5zaWduZWQgY2hhciBhYnlUbXBbMTZdOwordW5zaWduZWQgY2hhciBhYnlQbGFpblRleHRbMTZdOwordW5zaWduZWQgY2hhciBhYnlMYXN0Q2lwaGVyWzE2XTsKIAogUFM4MDJfMTFIZWFkZXIgIHBNQUNIZWFkZXIgPSAoUFM4MDJfMTFIZWFkZXIpIHBieUZyYW1lOwotUEJZVEUgICAgICAgICAgIHBieUlWOwotUEJZVEUgICAgICAgICAgIHBieVBheWxvYWQ7Ci1XT1JEICAgICAgICAgICAgd0hMZW4gPSAyMjsKLVdPUkQgICAgICAgICAgICB3UGF5bG9hZFNpemUgPSB3RnJhbWVTaXplIC0gOCAtIDggLSA0IC0gV0xBTl9IRFJfQUREUjNfTEVOOy8vOCBpcyBJViwgOCBpcyBNSUMsIDQgaXMgQ1JDCi1CT09MICAgICAgICAgICAgYkE0ID0gRkFMU0U7Ci1CWVRFICAgICAgICAgICAgYnlUbXA7Ci1XT1JEICAgICAgICAgICAgd0NudDsKK3Vuc2lnbmVkIGNoYXIgKnBieUlWOwordW5zaWduZWQgY2hhciAqcGJ5UGF5bG9hZDsKK3Vuc2lnbmVkIHNob3J0IHdITGVuID0gMjI7Cit1bnNpZ25lZCBzaG9ydCB3UGF5bG9hZFNpemUgPSB3RnJhbWVTaXplIC0gOCAtIDggLSA0IC0gV0xBTl9IRFJfQUREUjNfTEVOOy8vOCBpcyBJViwgOCBpcyBNSUMsIDQgaXMgQ1JDCitib29sIGJBNCA9IGZhbHNlOwordW5zaWduZWQgY2hhciBieVRtcDsKK3Vuc2lnbmVkIHNob3J0IHdDbnQ7CiBpbnQgICAgICAgICAgICAgaWksamosa2s7CiAKIAogICAgIHBieUlWID0gcGJ5RnJhbWUgKyBXTEFOX0hEUl9BRERSM19MRU47Ci0gICAgaWYgKCBXTEFOX0dFVF9GQ19UT0RTKCooUFdPUkQpcGJ5RnJhbWUpICYmCi0gICAgICAgICBXTEFOX0dFVF9GQ19GUk9NRFMoKihQV09SRClwYnlGcmFtZSkgKSB7Ci0gICAgICAgICBiQTQgPSBUUlVFOworICAgIGlmICggV0xBTl9HRVRfRkNfVE9EUygqKHVuc2lnbmVkIHNob3J0ICopcGJ5RnJhbWUpICYmCisgICAgICAgICBXTEFOX0dFVF9GQ19GUk9NRFMoKih1bnNpZ25lZCBzaG9ydCAqKXBieUZyYW1lKSApIHsKKyAgICAgICAgIGJBNCA9IHRydWU7CiAgICAgICAgICBwYnlJViArPSA2OyAgICAgICAgICAgICAvLyA2IGlzIDgwMi4xMSBhZGRyZXNzNAogICAgICAgICAgd0hMZW4gKz0gNjsKICAgICAgICAgIHdQYXlsb2FkU2l6ZSAtPSA2OwpAQCAtMjg4LDE1ICsyODgsMTUgQEAKICAgICAvL01JQ19JVgogICAgIE1JQ19JVlswXSA9IDB4NTk7CiAgICAgbWVtY3B5KCYoTUlDX0lWWzFdKSwgJihhYnlOb25jZVswXSksIDEzKTsKLSAgICBNSUNfSVZbMTRdID0gKEJZVEUpKHdQYXlsb2FkU2l6ZSA+PiA4KTsKLSAgICBNSUNfSVZbMTVdID0gKEJZVEUpKHdQYXlsb2FkU2l6ZSAmIDB4ZmYpOworICAgIE1JQ19JVlsxNF0gPSAodW5zaWduZWQgY2hhcikod1BheWxvYWRTaXplID4+IDgpOworICAgIE1JQ19JVlsxNV0gPSAodW5zaWduZWQgY2hhcikod1BheWxvYWRTaXplICYgMHhmZik7CiAKICAgICAvL01JQ19IRFIxCi0gICAgTUlDX0hEUjFbMF0gPSAoQllURSkod0hMZW4gPj4gOCk7Ci0gICAgTUlDX0hEUjFbMV0gPSAoQllURSkod0hMZW4gJiAweGZmKTsKLSAgICBieVRtcCA9IChCWVRFKShwTUFDSGVhZGVyLT53RnJhbWVDdGwgJiAweGZmKTsKKyAgICBNSUNfSERSMVswXSA9ICh1bnNpZ25lZCBjaGFyKSh3SExlbiA+PiA4KTsKKyAgICBNSUNfSERSMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSh3SExlbiAmIDB4ZmYpOworICAgIGJ5VG1wID0gKHVuc2lnbmVkIGNoYXIpKHBNQUNIZWFkZXItPndGcmFtZUN0bCAmIDB4ZmYpOwogICAgIE1JQ19IRFIxWzJdID0gYnlUbXAgJiAweDhmOwotICAgIGJ5VG1wID0gKEJZVEUpKHBNQUNIZWFkZXItPndGcmFtZUN0bCA+PiA4KTsKKyAgICBieVRtcCA9ICh1bnNpZ25lZCBjaGFyKShwTUFDSGVhZGVyLT53RnJhbWVDdGwgPj4gOCk7CiAgICAgYnlUbXAgJj0gMHg4NzsKICAgICBNSUNfSERSMVszXSA9IGJ5VG1wIHwgMHg0MDsKICAgICBtZW1jcHkoJihNSUNfSERSMVs0XSksIHBNQUNIZWFkZXItPmFieUFkZHIxLCBFVEhfQUxFTik7CkBAIC0zMDQsNyArMzA0LDcgQEAKIAogICAgIC8vTUlDX0hEUjIKICAgICBtZW1jcHkoJihNSUNfSERSMlswXSksIHBNQUNIZWFkZXItPmFieUFkZHIzLCBFVEhfQUxFTik7Ci0gICAgYnlUbXAgPSAoQllURSkocE1BQ0hlYWRlci0+d1NlcUN0bCAmIDB4ZmYpOworICAgIGJ5VG1wID0gKHVuc2lnbmVkIGNoYXIpKHBNQUNIZWFkZXItPndTZXFDdGwgJiAweGZmKTsKICAgICBNSUNfSERSMls2XSA9IGJ5VG1wICYgMHgwZjsKICAgICBNSUNfSERSMls3XSA9IDA7CiAgICAgaWYgKCBiQTQgKSB7CkBAIC0zMzcsOCArMzM3LDggQEAKIAogICAgIGZvcihqaj13UGF5bG9hZFNpemU7IGpqPjE2OyBqaj1qai0xNikgewogCi0gICAgICAgIGFieUNUUlBMRFsxNF0gPSAoQllURSkgKHdDbnQgPj4gOCk7Ci0gICAgICAgIGFieUNUUlBMRFsxNV0gPSAoQllURSkgKHdDbnQgJiAweGZmKTsKKyAgICAgICAgYWJ5Q1RSUExEWzE0XSA9ICh1bnNpZ25lZCBjaGFyKSAod0NudCA+PiA4KTsKKyAgICAgICAgYWJ5Q1RSUExEWzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAod0NudCAmIDB4ZmYpOwogCiAgICAgICAgIEFFU3YxMjgocGJ5UnhLZXksYWJ5Q1RSUExELGFieVRtcCk7CiAKQEAgLTM2MSw4ICszNjEsOCBAQAogICAgICAgICBhYnlMYXN0Q2lwaGVyW2lpXSA9IDB4MDA7CiAgICAgfQogCi0gICAgYWJ5Q1RSUExEWzE0XSA9IChCWVRFKSAod0NudCA+PiA4KTsKLSAgICBhYnlDVFJQTERbMTVdID0gKEJZVEUpICh3Q250ICYgMHhmZik7CisgICAgYWJ5Q1RSUExEWzE0XSA9ICh1bnNpZ25lZCBjaGFyKSAod0NudCA+PiA4KTsKKyAgICBhYnlDVFJQTERbMTVdID0gKHVuc2lnbmVkIGNoYXIpICh3Q250ICYgMHhmZik7CiAKICAgICBBRVN2MTI4KHBieVJ4S2V5LGFieUNUUlBMRCxhYnlUbXApOwogICAgIGZvciAoIGtrPTA7IGtrPDE2OyBraysrICkgewpAQCAtMzg0LDggKzM4NCw4IEBACiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgd0NudCA9IDA7Ci0gICAgYWJ5Q1RSUExEWzE0XSA9IChCWVRFKSAod0NudCA+PiA4KTsKLSAgICBhYnlDVFJQTERbMTVdID0gKEJZVEUpICh3Q250ICYgMHhmZik7CisgICAgYWJ5Q1RSUExEWzE0XSA9ICh1bnNpZ25lZCBjaGFyKSAod0NudCA+PiA4KTsKKyAgICBhYnlDVFJQTERbMTVdID0gKHVuc2lnbmVkIGNoYXIpICh3Q250ICYgMHhmZik7CiAgICAgQUVTdjEyOChwYnlSeEtleSxhYnlDVFJQTEQsYWJ5VG1wKTsKICAgICBmb3IgKCBraz0wOyBrazw4OyBraysrICkgewogICAgICAgICBhYnlUbXBba2tdID0gYWJ5VG1wW2trXSBeIHBieVBheWxvYWRba2tdOwpAQCAtMzk0LDkgKzM5NCw5IEBACiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgaWYgKCAhbWVtY21wKGFieU1JQyxhYnlUbXAsOCkgKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYWVzX2NjbXAuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYWVzX2NjbXAuaAppbmRleCBmMmJhMWQ1Li5jOGIyOGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Flc19jY21wLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5oCkBAIC00MSw2ICs0MSw2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotQk9PTCBBRVNiR2VuQ0NNUChQQllURSBwYnlSeEtleSwgUEJZVEUgcGJ5RnJhbWUsIFdPUkQgd0ZyYW1lU2l6ZSk7Citib29sIEFFU2JHZW5DQ01QKHVuc2lnbmVkIGNoYXIgKnBieVJ4S2V5LCB1bnNpZ25lZCBjaGFyICpwYnlGcmFtZSwgdW5zaWduZWQgc2hvcnQgd0ZyYW1lU2l6ZSk7CiAKICNlbmRpZiAvL19fQUVTX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jCmluZGV4IDU0MTRjNmMuLjFlMWM2ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAogCiAjZGVmaW5lIENCX1ZUMzI1M19JTklUX0ZPUl9SRk1EIDQ0NgotQllURSBieVZUMzI1M0luaXRUYWJfUkZNRFtDQl9WVDMyNTNfSU5JVF9GT1JfUkZNRF1bMl0gPSB7Cit1bnNpZ25lZCBjaGFyIGJ5VlQzMjUzSW5pdFRhYl9SRk1EW0NCX1ZUMzI1M19JTklUX0ZPUl9SRk1EXVsyXSA9IHsKICAgICB7MHgwMCwgMHgzMH0sCiAgICAgezB4MDEsIDB4MDB9LAogICAgIHsweDAyLCAweDAwfSwKQEAgLTUyOSw3ICs1MjksNyBAQAogfTsKIAogI2RlZmluZSBDQl9WVDMyNTNCMF9JTklUX0ZPUl9SRk1EIDI1NgotQllURSBieVZUMzI1M0IwX1JGTURbQ0JfVlQzMjUzQjBfSU5JVF9GT1JfUkZNRF1bMl0gPSB7Cit1bnNpZ25lZCBjaGFyIGJ5VlQzMjUzQjBfUkZNRFtDQl9WVDMyNTNCMF9JTklUX0ZPUl9SRk1EXVsyXSA9IHsKICAgICB7MHgwMCwgMHgzMX0sCiAgICAgezB4MDEsIDB4MDB9LAogICAgIHsweDAyLCAweDAwfSwKQEAgLTc5MCw3ICs3OTAsNyBAQAogCiAjZGVmaW5lIENCX1ZUMzI1M0IwX0FHQ19GT1JfUkZNRDI5NTkgMTk1CiAvLyBGb3IgUkZNRDI5NTkKLUJZVEUgYnlWVDMyNTNCMF9BR0M0X1JGTUQyOTU5W0NCX1ZUMzI1M0IwX0FHQ19GT1JfUkZNRDI5NTldWzJdID0gewordW5zaWduZWQgY2hhciBieVZUMzI1M0IwX0FHQzRfUkZNRDI5NTlbQ0JfVlQzMjUzQjBfQUdDX0ZPUl9SRk1EMjk1OV1bMl0gPSB7CiAgICAgezB4RjAsIDB4MDB9LAogICAgIHsweEYxLCAweDNFfSwKICAgICB7MHhGMCwgMHg4MH0sCkBAIC05OTAsNyArOTkwLDcgQEAKIAogI2RlZmluZSBDQl9WVDMyNTNCMF9JTklUX0ZPUl9BSVJPSEEyMjMwIDI1NgogLy8gRm9yIEFJUk9IQQotQllURSBieVZUMzI1M0IwX0FJUk9IQTIyMzBbQ0JfVlQzMjUzQjBfSU5JVF9GT1JfQUlST0hBMjIzMF1bMl0gPSB7Cit1bnNpZ25lZCBjaGFyIGJ5VlQzMjUzQjBfQUlST0hBMjIzMFtDQl9WVDMyNTNCMF9JTklUX0ZPUl9BSVJPSEEyMjMwXVsyXSA9IHsKICAgICB7MHgwMCwgMHgzMX0sCiAgICAgezB4MDEsIDB4MDB9LAogICAgIHsweDAyLCAweDAwfSwKQEAgLTEyNTQsNyArMTI1NCw3IEBACiAKICNkZWZpbmUgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfVVcyNDUxIDI1NgogLy9Gb3IgVVcyNDUxCi1CWVRFIGJ5VlQzMjUzQjBfVVcyNDUxW0NCX1ZUMzI1M0IwX0lOSVRfRk9SX1VXMjQ1MV1bMl0gPSB7Cit1bnNpZ25lZCBjaGFyIGJ5VlQzMjUzQjBfVVcyNDUxW0NCX1ZUMzI1M0IwX0lOSVRfRk9SX1VXMjQ1MV1bMl0gPSB7CiAgICAgezB4MDAsIDB4MzF9LAogICAgIHsweDAxLCAweDAwfSwKICAgICB7MHgwMiwgMHgwMH0sCkBAIC0xNTE2LDcgKzE1MTYsNyBAQAogCiAjZGVmaW5lIENCX1ZUMzI1M0IwX0FHQyAxOTMKIC8vIEZvciBBSVJPSEEKLUJZVEUgYnlWVDMyNTNCMF9BR0NbQ0JfVlQzMjUzQjBfQUdDXVsyXSA9IHsKK3Vuc2lnbmVkIGNoYXIgYnlWVDMyNTNCMF9BR0NbQ0JfVlQzMjUzQjBfQUdDXVsyXSA9IHsKICAgICB7MHhGMCwgMHgwMH0sCiAgICAgezB4RjEsIDB4MDB9LAogICAgIHsweEYwLCAweDgwfSwKQEAgLTE3MTIsMTQgKzE3MTIsMTQgQEAKICAgICB7MHhGMCwgMHgwMH0sCiB9OwogCi1jb25zdCBXT1JEIGF3Y0ZyYW1lVGltZVtNQVhfUkFURV0gPQorY29uc3QgdW5zaWduZWQgc2hvcnQgYXdjRnJhbWVUaW1lW01BWF9SQVRFXSA9CiB7MTAsIDIwLCA1NSwgMTEwLCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDE0NCwgMTkyLCAyMTZ9OwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYwotVUxPTkcKK3Vuc2lnbmVkIGxvbmcKIHNfdWxHZXRSYXRpbyhQU0RldmljZSBwRGV2aWNlKTsKIAogc3RhdGljCkBAIC0xNzQwLDEzICsxNzQwLDEzIEBACiAjZW5kaWYKICAgICBpZiAoIHBEZXZpY2UtPmR3UnhBbnRlbm5hU2VsID09IDApIHsKICAgICAgICAgcERldmljZS0+ZHdSeEFudGVubmFTZWw9MTsKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJUeFJ4QW50SW52ID09IFRSVUUpCisgICAgICAgIGlmIChwRGV2aWNlLT5iVHhSeEFudEludiA9PSB0cnVlKQogICAgICAgICAgICAgQkJ2U2V0UnhBbnRlbm5hTW9kZShwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBBTlRfQSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIEJCdlNldFJ4QW50ZW5uYU1vZGUocERldmljZS0+UG9ydE9mZnNldCwgQU5UX0IpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBEZXZpY2UtPmR3UnhBbnRlbm5hU2VsPTA7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iVHhSeEFudEludiA9PSBUUlVFKQorICAgICAgICBpZiAocERldmljZS0+YlR4UnhBbnRJbnYgPT0gdHJ1ZSkKICAgICAgICAgICAgIEJCdlNldFJ4QW50ZW5uYU1vZGUocERldmljZS0+UG9ydE9mZnNldCwgQU5UX0IpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBCQnZTZXRSeEFudGVubmFNb2RlKHBEZXZpY2UtPlBvcnRPZmZzZXQsIEFOVF9BKTsKQEAgLTE3NzYsMTkgKzE3NzYsMTkgQEAKICAqIFJldHVybiBWYWx1ZTogRnJhbWVUaW1lCiAgKgogICovCi1VSU5UCit1bnNpZ25lZCBpbnQKIEJCdUdldEZyYW1lVGltZSAoCi0gICAgQllURSBieVByZWFtYmxlVHlwZSwKLSAgICBCWVRFIGJ5UGt0VHlwZSwKLSAgICBVSU5UIGNiRnJhbWVMZW5ndGgsCi0gICAgV09SRCB3UmF0ZQorICAgIHVuc2lnbmVkIGNoYXIgYnlQcmVhbWJsZVR5cGUsCisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCisgICAgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgsCisgICAgdW5zaWduZWQgc2hvcnQgd1JhdGUKICAgICApCiB7Ci0gICAgVUlOVCB1RnJhbWVUaW1lOwotICAgIFVJTlQgdVByZWFtYmxlOwotICAgIFVJTlQgdVRtcDsKLSAgICBVSU5UIHVSYXRlSWR4ID0gKFVJTlQpd1JhdGU7Ci0gICAgVUlOVCB1UmF0ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IHVGcmFtZVRpbWU7CisgICAgdW5zaWduZWQgaW50IHVQcmVhbWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgdVRtcDsKKyAgICB1bnNpZ25lZCBpbnQgdVJhdGVJZHggPSAodW5zaWduZWQgaW50KSB3UmF0ZTsKKyAgICB1bnNpZ25lZCBpbnQgdVJhdGUgPSAwOwogCiAKICAgICBpZiAodVJhdGVJZHggPiBSQVRFXzU0TSkgewpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdVJhdGUgPSAoVUlOVClhd2NGcmFtZVRpbWVbdVJhdGVJZHhdOworICAgIHVSYXRlID0gKHVuc2lnbmVkIGludCkgYXdjRnJhbWVUaW1lW3VSYXRlSWR4XTsKIAogICAgIGlmICh1UmF0ZUlkeCA8PSAzKSB7ICAgICAgICAgIC8vQ0NLIG1vZGUKIApAQCAtMTg0NiwyMyArMTg0NiwyMyBAQAogdm9pZAogQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIgKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgVUlOVCBjYkZyYW1lTGVuZ3RoLAotICAgIFdPUkQgd1JhdGUsCi0gICAgQllURSBieVBhY2tldFR5cGUsCi0gICAgUFdPUkQgcHdQaHlMZW4sCi0gICAgUEJZVEUgcGJ5UGh5U3J2LAotICAgIFBCWVRFIHBieVBoeVNnbgorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoLAorICAgIHVuc2lnbmVkIHNob3J0IHdSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlQYWNrZXRUeXBlLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd1BoeUxlbiwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlQaHlTcnYsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5UGh5U2duCiAgICAgKQogewotICAgIFVJTlQgY2JCaXRDb3VudDsKLSAgICBVSU5UIGNiVXNDb3VudCA9IDA7Ci0gICAgVUlOVCBjYlRtcDsKLSAgICBCT09MIGJFeHRCaXQ7Ci0gICAgQllURSBieVByZWFtYmxlVHlwZSA9IHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlOwotICAgIEJPT0wgYkNDSyA9IHBEZXZpY2UtPmJDQ0s7CisgICAgdW5zaWduZWQgaW50IGNiQml0Q291bnQ7CisgICAgdW5zaWduZWQgaW50IGNiVXNDb3VudCA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiVG1wOworICAgIGJvb2wgYkV4dEJpdDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UHJlYW1ibGVUeXBlID0gcERldmljZS0+YnlQcmVhbWJsZVR5cGU7CisgICAgYm9vbCBiQ0NLID0gcERldmljZS0+YkNDSzsKIAogICAgIGNiQml0Q291bnQgPSBjYkZyYW1lTGVuZ3RoICogODsKLSAgICBiRXh0Qml0ID0gRkFMU0U7CisgICAgYkV4dEJpdCA9IGZhbHNlOwogCiAgICAgc3dpdGNoICh3UmF0ZSkgewogICAgIGNhc2UgUkFURV8xTSA6CkBAIC0xODc5LDcgKzE4NzksNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgUkFURV81TSA6Ci0gICAgICAgIGlmIChiQ0NLID09IEZBTFNFKQorICAgICAgICBpZiAoYkNDSyA9PSBmYWxzZSkKICAgICAgICAgICAgIGNiQml0Q291bnQgKys7CiAgICAgICAgIGNiVXNDb3VudCA9IChjYkJpdENvdW50ICogMTApIC8gNTU7CiAgICAgICAgIGNiVG1wID0gKGNiVXNDb3VudCAqIDU1KSAvIDEwOwpAQCAtMTg5MywxNCArMTg5MywxNCBAQAogCiAgICAgY2FzZSBSQVRFXzExTSA6CiAKLSAgICAgICAgaWYgKGJDQ0sgPT0gRkFMU0UpCisgICAgICAgIGlmIChiQ0NLID09IGZhbHNlKQogICAgICAgICAgICAgY2JCaXRDb3VudCArKzsKICAgICAgICAgY2JVc0NvdW50ID0gY2JCaXRDb3VudCAvIDExOwogICAgICAgICBjYlRtcCA9IGNiVXNDb3VudCAqIDExOwogICAgICAgICBpZiAoY2JUbXAgIT0gY2JCaXRDb3VudCkgewogICAgICAgICAgICAgY2JVc0NvdW50ICsrOwogICAgICAgICAgICAgaWYgKChjYkJpdENvdW50IC0gY2JUbXApIDw9IDMpCi0gICAgICAgICAgICAgICAgYkV4dEJpdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYkV4dEJpdCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5UHJlYW1ibGVUeXBlID09IDEpCiAgICAgICAgICAgICAqcGJ5UGh5U2duID0gMHgwYjsKQEAgLTE5OTQsMTEgKzE5OTQsMTEgQEAKICAgICAgICAgKnBieVBoeVNydiA9IDB4MDA7CiAgICAgICAgIGlmIChiRXh0Qml0KQogICAgICAgICAgICAgKnBieVBoeVNydiA9ICpwYnlQaHlTcnYgfCAweDgwOwotICAgICAgICAqcHdQaHlMZW4gPSAoV09SRCljYlVzQ291bnQ7CisgICAgICAgICpwd1BoeUxlbiA9ICh1bnNpZ25lZCBzaG9ydCljYlVzQ291bnQ7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICAqcGJ5UGh5U3J2ID0gMHgwMDsKLSAgICAgICAgKnB3UGh5TGVuID0gKFdPUkQpY2JGcmFtZUxlbmd0aDsKKyAgICAgICAgKnB3UGh5TGVuID0gKHVuc2lnbmVkIHNob3J0KWNiRnJhbWVMZW5ndGg7CiAgICAgfQogfQogCkBAIC0yMDEyLDEzICsyMDEyLDEzIEBACiAgKiAgT3V0OgogICogICAgICBwYnlEYXRhICAgICAtIGRhdGEgcmVhZAogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KLUJPT0wgQkJiUmVhZEVtYmVkZWQgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUJCQWRkciwgUEJZVEUgcGJ5RGF0YSkKK2Jvb2wgQkJiUmVhZEVtYmVkZWQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlCQkFkZHIsIHVuc2lnbmVkIGNoYXIgKnBieURhdGEpCiB7Ci0gICAgV09SRCAgICB3dzsKLSAgICBCWVRFICAgIGJ5VmFsdWU7CisgICAgdW5zaWduZWQgc2hvcnQgd3c7CisgICAgdW5zaWduZWQgY2hhciBieVZhbHVlOwogCiAgICAgLy8gQkIgcmVnIG9mZnNldAogICAgIFZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfQkJSRUdBRFIsIGJ5QkJBZGRyKTsKQEAgLTIwMzgsOSArMjAzOCw5IEBACiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpIHsKICAgICAgICAgREJHX1BPUlQ4MCgweDMwKTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgREJHX1BPUlQ4MCgweDMwKVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCkBAIC0yMDU1LDEzICsyMDU1LDEzIEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwotQk9PTCBCQmJXcml0ZUVtYmVkZWQgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUJCQWRkciwgQllURSBieURhdGEpCitib29sIEJCYldyaXRlRW1iZWRlZCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUJCQWRkciwgdW5zaWduZWQgY2hhciBieURhdGEpCiB7Ci0gICAgV09SRCAgICB3dzsKLSAgICBCWVRFICAgIGJ5VmFsdWU7CisgICAgdW5zaWduZWQgc2hvcnQgd3c7CisgICAgdW5zaWduZWQgY2hhciBieVZhbHVlOwogCiAgICAgLy8gQkIgcmVnIG9mZnNldAogICAgIFZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfQkJSRUdBRFIsIGJ5QkJBZGRyKTsKQEAgLTIwODAsOSArMjA4MCw5IEBACiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpIHsKICAgICAgICAgREJHX1BPUlQ4MCgweDMxKTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgREJHX1BPUlQ4MCgweDMxKVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCkBAIC0yMDk3LDEyICsyMDk3LDEyIEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIGFsbCBUZXN0Qml0cyBhcmUgc2V0OyBGQUxTRSBvdGhlcndpc2UuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgYWxsIFRlc3RCaXRzIGFyZSBzZXQ7IGZhbHNlIG90aGVyd2lzZS4KICAqCiAgKi8KLUJPT0wgQkJiSXNSZWdCaXRzT24gKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUJCQWRkciwgQllURSBieVRlc3RCaXRzKQorYm9vbCBCQmJJc1JlZ0JpdHNPbiAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUJCQWRkciwgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKQogewotICAgIEJZVEUgYnlPcmdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdEYXRhOwogCiAgICAgQkJiUmVhZEVtYmVkZWQoZHdJb0Jhc2UsIGJ5QkJBZGRyLCAmYnlPcmdEYXRhKTsKICAgICByZXR1cm4gKGJ5T3JnRGF0YSAmIGJ5VGVzdEJpdHMpID09IGJ5VGVzdEJpdHM7CkBAIC0yMTIwLDEyICsyMTIwLDEyIEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIGFsbCBUZXN0Qml0cyBhcmUgY2xlYXI7IEZBTFNFIG90aGVyd2lzZS4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBhbGwgVGVzdEJpdHMgYXJlIGNsZWFyOyBmYWxzZSBvdGhlcndpc2UuCiAgKgogICovCi1CT09MIEJCYklzUmVnQml0c09mZiAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5QkJBZGRyLCBCWVRFIGJ5VGVzdEJpdHMpCitib29sIEJCYklzUmVnQml0c09mZiAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUJCQWRkciwgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKQogewotICAgIEJZVEUgYnlPcmdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdEYXRhOwogCiAgICAgQkJiUmVhZEVtYmVkZWQoZHdJb0Jhc2UsIGJ5QkJBZGRyLCAmYnlPcmdEYXRhKTsKICAgICByZXR1cm4gKGJ5T3JnRGF0YSAmIGJ5VGVzdEJpdHMpID09IDA7CkBAIC0yMTQyLDE3ICsyMTQyLDE3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwogCi1CT09MIEJCYlZUMzI1M0luaXQgKFBTRGV2aWNlIHBEZXZpY2UpCitib29sIEJCYlZUMzI1M0luaXQgKFBTRGV2aWNlIHBEZXZpY2UpCiB7Ci0gICAgQk9PTCAgICAgICBiUmVzdWx0ID0gVFJVRTsKKyAgICBib29sIGJSZXN1bHQgPSB0cnVlOwogICAgIGludCAgICAgICAgaWk7Ci0gICAgRFdPUkRfUFRSICBkd0lvQmFzZSA9IHBEZXZpY2UtPlBvcnRPZmZzZXQ7Ci0gICAgQllURSAgICAgICBieVJGVHlwZSA9IHBEZXZpY2UtPmJ5UkZUeXBlOwotICAgIEJZVEUgICAgICAgYnlMb2NhbElEID0gcERldmljZS0+YnlMb2NhbElEOworICAgIHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UgPSBwRGV2aWNlLT5Qb3J0T2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgYnlSRlR5cGUgPSBwRGV2aWNlLT5ieVJGVHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCA9IHBEZXZpY2UtPmJ5TG9jYWxJRDsKIAogICAgIGlmIChieVJGVHlwZSA9PSBSRl9SRk1EMjk1OSkgewogICAgICAgICBpZiAoYnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQTEpIHsKQEAgLTIyOTQsNyArMjI5NCw3IEBACiAgICAgLy99fSBSb2JlcnRZdQogICAgIH0gZWxzZSB7CiAgICAgCS8vIE5vIFZHQSBUYWJsZSBub3cKLSAgICAJcERldmljZS0+YlVwZGF0ZUJCVkdBID0gRkFMU0U7CisgICAgCXBEZXZpY2UtPmJVcGRhdGVCQlZHQSA9IGZhbHNlOwogICAgICAgICBwRGV2aWNlLT5hYnlCQlZHQVswXSA9IDB4MUM7CiAgICAgfQogCkBAIC0yMzIxLDEyICsyMzIxLDEyIEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgQkJ2UmVhZEFsbFJlZ3MgKERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5QkJSZWdzKQordm9pZCBCQnZSZWFkQWxsUmVncyAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5QkJSZWdzKQogewogICAgIGludCAgaWk7Ci0gICAgQllURSBieUJhc2UgPSAxOworICAgIHVuc2lnbmVkIGNoYXIgYnlCYXNlID0gMTsKICAgICBmb3IgKGlpID0gMDsgaWkgPCBCQl9NQVhfQ09OVEVYVF9TSVpFOyBpaSsrKSB7Ci0gICAgICAgIEJCYlJlYWRFbWJlZGVkKGR3SW9CYXNlLCAoQllURSkoaWkqYnlCYXNlKSwgcGJ5QkJSZWdzKTsKKyAgICAgICAgQkJiUmVhZEVtYmVkZWQoZHdJb0Jhc2UsICh1bnNpZ25lZCBjaGFyKShpaSpieUJhc2UpLCBwYnlCQlJlZ3MpOwogICAgICAgICBwYnlCQlJlZ3MgKz0gYnlCYXNlOwogICAgIH0KIH0KQEAgLTIzNDgsOCArMjM0OCw4IEBACiAKIHZvaWQgQkJ2TG9vcGJhY2tPbiAoUFNEZXZpY2UgcERldmljZSkKIHsKLSAgICBCWVRFICAgICAgYnlEYXRhOwotICAgIERXT1JEX1BUUiBkd0lvQmFzZSA9IHBEZXZpY2UtPlBvcnRPZmZzZXQ7CisgICAgdW5zaWduZWQgY2hhciBieURhdGE7CisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZSA9IHBEZXZpY2UtPlBvcnRPZmZzZXQ7CiAKICAgICAvL0NSIEM5ID0gMHgwMAogICAgIEJCYlJlYWRFbWJlZGVkKGR3SW9CYXNlLCAweEM5LCAmcERldmljZS0+YnlCQkNSYzkpOy8vQ1IyMDEKQEAgLTIzNjMsNyArMjM2Myw3IEBACiAgICAgaWYgKHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA8PSBSQVRFXzExTSkgeyAvL0NDSwogICAgICAgICAvLyBFbmFibGUgaW50ZXJuYWwgZGlnaXRhbCBsb29wYmFjazogQ1IzMyB8PSAwMDAwIDAwMDEKICAgICAgICAgQkJiUmVhZEVtYmVkZWQoZHdJb0Jhc2UsIDB4MjEsICZieURhdGEpOy8vQ1IzMwotICAgICAgICBCQmJXcml0ZUVtYmVkZWQoZHdJb0Jhc2UsIDB4MjEsIChCWVRFKShieURhdGEgfCAweDAxKSk7Ly9DUjMzCisgICAgICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHgyMSwgKHVuc2lnbmVkIGNoYXIpKGJ5RGF0YSB8IDB4MDEpKTsvL0NSMzMKICAgICAgICAgLy8gQ1IxNTQgPSAweDAwCiAgICAgICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHg5QSwgMCk7ICAgLy9DUjE1NAogCkBAIC0yMzcyLDcgKzIzNzIsNyBAQAogICAgIGVsc2UgeyAvL09GRE0KICAgICAgICAgLy8gRW5hYmxlIGludGVybmFsIGRpZ2l0YWwgbG9vcGJhY2s6Q1IxNTQgfD0gMDAwMCAwMDAxCiAgICAgICAgIEJCYlJlYWRFbWJlZGVkKGR3SW9CYXNlLCAweDlBLCAmYnlEYXRhKTsvL0NSMTU0Ci0gICAgICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHg5QSwgKEJZVEUpKGJ5RGF0YSB8IDB4MDEpKTsvL0NSMTU0CisgICAgICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHg5QSwgKHVuc2lnbmVkIGNoYXIpKGJ5RGF0YSB8IDB4MDEpKTsvL0NSMTU0CiAgICAgICAgIC8vIENSMzMgPSAweDAwCiAgICAgICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHgyMSwgMCk7ICAgLy9DUjMzCiAKQEAgLTIzODQsNyArMjM4NCw3IEBACiAKICAgICAvLyBEaXNhYmxlIFRYX0lRVU4KICAgICBCQmJSZWFkRW1iZWRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAweDA5LCAmcERldmljZS0+YnlCQkNSMDkpOwotICAgIEJCYldyaXRlRW1iZWRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAweDA5LCAoQllURSkocERldmljZS0+YnlCQkNSMDkgJiAweERFKSk7CisgICAgQkJiV3JpdGVFbWJlZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIDB4MDksICh1bnNpZ25lZCBjaGFyKShwRGV2aWNlLT5ieUJCQ1IwOSAmIDB4REUpKTsKIH0KIAogLyoKQEAgLTI0MDIsOCArMjQwMiw4IEBACiAgKi8KIHZvaWQgQkJ2TG9vcGJhY2tPZmYgKFBTRGV2aWNlIHBEZXZpY2UpCiB7Ci0gICAgQllURSAgICAgIGJ5RGF0YTsKLSAgICBEV09SRF9QVFIgZHdJb0Jhc2UgPSBwRGV2aWNlLT5Qb3J0T2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgYnlEYXRhOworICAgIHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UgPSBwRGV2aWNlLT5Qb3J0T2Zmc2V0OwogCiAgICAgQkJiV3JpdGVFbWJlZGVkKGR3SW9CYXNlLCAweEM5LCBwRGV2aWNlLT5ieUJCQ1JjOSk7Ly9DUjIwMQogICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHg4OCwgcERldmljZS0+YnlCQkNSODgpOy8vQ1IxMzYKQEAgLTI0MTMsMTQgKzI0MTMsMTQgQEAKICAgICBpZiAocERldmljZS0+dUNvbm5lY3Rpb25SYXRlIDw9IFJBVEVfMTFNKSB7IC8vIENDSwogICAgICAgICAvLyBTZXQgdGhlIENSMzMgQml0MiB0byBkaXNhYmxlIGludGVybmFsIExvb3BiYWNrLgogICAgICAgICBCQmJSZWFkRW1iZWRlZChkd0lvQmFzZSwgMHgyMSwgJmJ5RGF0YSk7Ly9DUjMzCi0gICAgICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHgyMSwgKEJZVEUpKGJ5RGF0YSAmIDB4RkUpKTsvL0NSMzMKKyAgICAgICAgQkJiV3JpdGVFbWJlZGVkKGR3SW9CYXNlLCAweDIxLCAodW5zaWduZWQgY2hhcikoYnlEYXRhICYgMHhGRSkpOy8vQ1IzMwogICAgIH0KICAgICBlbHNlIHsgLy8gT0ZETQogICAgICAgICBCQmJSZWFkRW1iZWRlZChkd0lvQmFzZSwgMHg5QSwgJmJ5RGF0YSk7Ly9DUjE1NAotICAgICAgICBCQmJXcml0ZUVtYmVkZWQoZHdJb0Jhc2UsIDB4OUEsIChCWVRFKShieURhdGEgJiAweEZFKSk7Ly9DUjE1NAorICAgICAgICBCQmJXcml0ZUVtYmVkZWQoZHdJb0Jhc2UsIDB4OUEsICh1bnNpZ25lZCBjaGFyKShieURhdGEgJiAweEZFKSk7Ly9DUjE1NAogICAgIH0KICAgICBCQmJSZWFkRW1iZWRlZChkd0lvQmFzZSwgMHgwRSwgJmJ5RGF0YSk7Ly9DUjE0Ci0gICAgQkJiV3JpdGVFbWJlZGVkKGR3SW9CYXNlLCAweDBFLCAoQllURSkoYnlEYXRhIHwgMHg4MCkpOy8vQ1IxNAorICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHgwRSwgKHVuc2lnbmVkIGNoYXIpKGJ5RGF0YSB8IDB4ODApKTsvL0NSMTQKIAogfQogCkBAIC0yNDQxLDggKzI0NDEsOCBAQAogdm9pZAogQkJ2U2V0U2hvcnRTbG90VGltZSAoUFNEZXZpY2UgcERldmljZSkKIHsKLSAgICBCWVRFIGJ5QkJSeENvbmY9MDsKLSAgICBCWVRFIGJ5QkJWR0E9MDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QkJSeENvbmY9MDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QkJWR0E9MDsKIAogICAgIEJCYlJlYWRFbWJlZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIDB4MEEsICZieUJCUnhDb25mKTsvL0NSMTAKIApAQCAtMjQ2Miw5ICsyNDYyLDkgQEAKIAogfQogCi12b2lkIEJCdlNldFZHQUdhaW5PZmZzZXQoUFNEZXZpY2UgcERldmljZSwgQllURSBieURhdGEpCit2b2lkIEJCdlNldFZHQUdhaW5PZmZzZXQoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgY2hhciBieURhdGEpCiB7Ci0gICAgQllURSBieUJCUnhDb25mPTA7CisgICAgdW5zaWduZWQgY2hhciBieUJCUnhDb25mPTA7CiAKICAgICBCQmJXcml0ZUVtYmVkZWQocERldmljZS0+UG9ydE9mZnNldCwgMHhFNywgYnlEYXRhKTsKIApAQCAtMjQ5NSw3ICsyNDk1LDcgQEAKICAqCiAgKi8KIHZvaWQKLUJCdlNvZnR3YXJlUmVzZXQgKERXT1JEX1BUUiBkd0lvQmFzZSkKK0JCdlNvZnR3YXJlUmVzZXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpCiB7CiAgICAgQkJiV3JpdGVFbWJlZGVkKGR3SW9CYXNlLCAweDUwLCAweDQwKTsKICAgICBCQmJXcml0ZUVtYmVkZWQoZHdJb0Jhc2UsIDB4NTAsIDApOwpAQCAtMjUxNiw5ICsyNTE2LDkgQEAKICAqCiAgKi8KIHZvaWQKLUJCdlBvd2VyU2F2ZU1vZGVPTiAoRFdPUkRfUFRSIGR3SW9CYXNlKQorQkJ2UG93ZXJTYXZlTW9kZU9OICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewotICAgIEJZVEUgYnlPcmdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdEYXRhOwogCiAgICAgQkJiUmVhZEVtYmVkZWQoZHdJb0Jhc2UsIDB4MEQsICZieU9yZ0RhdGEpOwogICAgIGJ5T3JnRGF0YSB8PSBCSVQwOwpAQCAtMjUzOCw5ICsyNTM4LDkgQEAKICAqCiAgKi8KIHZvaWQKLUJCdlBvd2VyU2F2ZU1vZGVPRkYgKERXT1JEX1BUUiBkd0lvQmFzZSkKK0JCdlBvd2VyU2F2ZU1vZGVPRkYgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpCiB7Ci0gICAgQllURSBieU9yZ0RhdGE7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ0RhdGE7CiAKICAgICBCQmJSZWFkRW1iZWRlZChkd0lvQmFzZSwgMHgwRCwgJmJ5T3JnRGF0YSk7CiAgICAgYnlPcmdEYXRhICY9IH4oQklUMCk7CkBAIC0yNTYyLDkgKzI1NjIsOSBAQAogICovCiAKIHZvaWQKLUJCdlNldFR4QW50ZW5uYU1vZGUgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUFudGVubmFNb2RlKQorQkJ2U2V0VHhBbnRlbm5hTW9kZSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUFudGVubmFNb2RlKQogewotICAgIEJZVEUgYnlCQlR4Q29uZjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QkJUeENvbmY7CiAKICNpZmRlZglQTElDRV9ERUJVRwogCS8vcHJpbnRrKCJFbnRlciBCQnZTZXRUeEFudGVubmFNb2RlXG4iKTsKQEAgLTI2MDQsOSArMjYwNCw5IEBACiAgKi8KIAogdm9pZAotQkJ2U2V0UnhBbnRlbm5hTW9kZSAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5QW50ZW5uYU1vZGUpCitCQnZTZXRSeEFudGVubmFNb2RlICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5QW50ZW5uYU1vZGUpCiB7Ci0gICAgQllURSBieUJCUnhDb25mOworICAgIHVuc2lnbmVkIGNoYXIgYnlCQlJ4Q29uZjsKIAogICAgIEJCYlJlYWRFbWJlZGVkKGR3SW9CYXNlLCAweDBBLCAmYnlCQlJ4Q29uZik7Ly9DUjEwCiAgICAgaWYgKGJ5QW50ZW5uYU1vZGUgPT0gQU5UX0RJVkVSU0lUWSkgewpAQCAtMjYzNSwxNCArMjYzNSwxNCBAQAogICoKICAqLwogdm9pZAotQkJ2U2V0RGVlcFNsZWVwIChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlMb2NhbElEKQorQkJ2U2V0RGVlcFNsZWVwICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCkKIHsKICAgICBCQmJXcml0ZUVtYmVkZWQoZHdJb0Jhc2UsIDB4MEMsIDB4MTcpOy8vQ1IxMgogICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHgwRCwgMHhCOSk7Ly9DUjEzCiB9CiAKIHZvaWQKLUJCdkV4aXREZWVwU2xlZXAgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUxvY2FsSUQpCitCQnZFeGl0RGVlcFNsZWVwICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCkKIHsKICAgICBCQmJXcml0ZUVtYmVkZWQoZHdJb0Jhc2UsIDB4MEMsIDB4MDApOy8vQ1IxMgogICAgIEJCYldyaXRlRW1iZWRlZChkd0lvQmFzZSwgMHgwRCwgMHgwMSk7Ly9DUjEzCkBAIC0yNjUxLDEyICsyNjUxLDEyIEBACiAKIAogc3RhdGljCi1VTE9ORwordW5zaWduZWQgbG9uZwogc191bEdldFJhdGlvIChQU0RldmljZSBwRGV2aWNlKQogewotVUxPTkcgICB1bFJhdGlvID0gMDsKLVVMT05HICAgdWxNYXhQYWNrZXQ7Ci1VTE9ORyAgIHVsUGFja2V0TnVtOwordW5zaWduZWQgbG9uZyB1bFJhdGlvID0gMDsKK3Vuc2lnbmVkIGxvbmcgdWxNYXhQYWNrZXQ7Cit1bnNpZ25lZCBsb25nIHVsUGFja2V0TnVtOwogCiAgICAgLy9UaGlzIGlzIGEgdGhvdXNhbmQtcmF0aW8KICAgICB1bE1heFBhY2tldCA9IHBEZXZpY2UtPnVOdW1TUTNbUkFURV81NE1dOwpAQCAtMjc2Miw3ICsyNzYyLDcgQEAKIHZvaWQKIEJCdkNsZWFyQW50RGl2U1EzVmFsdWUgKFBTRGV2aWNlIHBEZXZpY2UpCiB7Ci0gICAgVUlOVCAgICBpaTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAKICAgICBwRGV2aWNlLT51RGl2ZXJzaXR5Q250ID0gMDsKICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfUkFURTsgaWkrKykgewpAQCAtMjc4Nyw3ICsyNzg3LDcgQEAKICAqLwogCiB2b2lkCi1CQnZBbnRlbm5hRGl2ZXJzaXR5IChQU0RldmljZSBwRGV2aWNlLCBCWVRFIGJ5UnhSYXRlLCBCWVRFIGJ5U1EzKQorQkJ2QW50ZW5uYURpdmVyc2l0eSAoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgY2hhciBieVJ4UmF0ZSwgdW5zaWduZWQgY2hhciBieVNRMykKIHsKIAogICAgIGlmICgoYnlSeFJhdGUgPj0gTUFYX1JBVEUpIHx8IChwRGV2aWNlLT53QW50RGl2ZXJzaXR5TWF4UmF0ZSA+PSBNQVhfUkFURSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuaAppbmRleCBiMjM2ZmY0Li44Mjk0YmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5oCkBAIC0xMTgsNDUgKzExOCw0NSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1VSU5UCit1bnNpZ25lZCBpbnQKIEJCdUdldEZyYW1lVGltZSgKLSAgICBCWVRFIGJ5UHJlYW1ibGVUeXBlLAotICAgIEJZVEUgYnlQa3RUeXBlLAotICAgIFVJTlQgY2JGcmFtZUxlbmd0aCwKLSAgICBXT1JEIHdSYXRlCisgICAgdW5zaWduZWQgY2hhciBieVByZWFtYmxlVHlwZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UGt0VHlwZSwKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZQogICAgICk7CiAKIHZvaWQKIEJCdkNhY3VsYXRlUGFyYW1ldGVyICgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIFVJTlQgY2JGcmFtZUxlbmd0aCwKLSAgICBXT1JEIHdSYXRlLAotICAgIEJZVEUgYnlQYWNrZXRUeXBlLAotICAgIFBXT1JEIHB3UGh5TGVuLAotICAgIFBCWVRFIHBieVBoeVNydiwKLSAgICBQQllURSBwYnlQaHlTZ24KKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UGFja2V0VHlwZSwKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdQaHlMZW4sCisgICAgdW5zaWduZWQgY2hhciAqcGJ5UGh5U3J2LAorICAgIHVuc2lnbmVkIGNoYXIgKnBieVBoeVNnbgogICAgICk7CiAKLUJPT0wgQkJiUmVhZEVtYmVkZWQoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5QkJBZGRyLCBQQllURSBwYnlEYXRhKTsKLUJPT0wgQkJiV3JpdGVFbWJlZGVkKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUJCQWRkciwgQllURSBieURhdGEpOworYm9vbCBCQmJSZWFkRW1iZWRlZCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5QkJBZGRyLCB1bnNpZ25lZCBjaGFyICpwYnlEYXRhKTsKK2Jvb2wgQkJiV3JpdGVFbWJlZGVkKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlCQkFkZHIsIHVuc2lnbmVkIGNoYXIgYnlEYXRhKTsKIAotdm9pZCBCQnZSZWFkQWxsUmVncyhEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieUJCUmVncyk7Cit2b2lkIEJCdlJlYWRBbGxSZWdzKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieUJCUmVncyk7CiB2b2lkIEJCdkxvb3BiYWNrT24oUFNEZXZpY2UgcERldmljZSk7CiB2b2lkIEJCdkxvb3BiYWNrT2ZmKFBTRGV2aWNlIHBEZXZpY2UpOwogdm9pZCBCQnZTZXRTaG9ydFNsb3RUaW1lKFBTRGV2aWNlIHBEZXZpY2UpOwotQk9PTCBCQmJJc1JlZ0JpdHNPbihEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlCQkFkZHIsIEJZVEUgYnlUZXN0Qml0cyk7Ci1CT09MIEJCYklzUmVnQml0c09mZihEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlCQkFkZHIsIEJZVEUgYnlUZXN0Qml0cyk7Ci12b2lkIEJCdlNldFZHQUdhaW5PZmZzZXQoUFNEZXZpY2UgcERldmljZSwgQllURSBieURhdGEpOworYm9vbCBCQmJJc1JlZ0JpdHNPbih1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5QkJBZGRyLCB1bnNpZ25lZCBjaGFyIGJ5VGVzdEJpdHMpOworYm9vbCBCQmJJc1JlZ0JpdHNPZmYodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUJCQWRkciwgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKTsKK3ZvaWQgQkJ2U2V0VkdBR2Fpbk9mZnNldChQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBjaGFyIGJ5RGF0YSk7CiAKIC8vIFZUMzI1MyBCYXNlYmFuZAotQk9PTCBCQmJWVDMyNTNJbml0KFBTRGV2aWNlIHBEZXZpY2UpOwotdm9pZCBCQnZTb2Z0d2FyZVJlc2V0KERXT1JEX1BUUiBkd0lvQmFzZSk7Ci12b2lkIEJCdlBvd2VyU2F2ZU1vZGVPTihEV09SRF9QVFIgZHdJb0Jhc2UpOwotdm9pZCBCQnZQb3dlclNhdmVNb2RlT0ZGKERXT1JEX1BUUiBkd0lvQmFzZSk7Ci12b2lkIEJCdlNldFR4QW50ZW5uYU1vZGUoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5QW50ZW5uYU1vZGUpOwotdm9pZCBCQnZTZXRSeEFudGVubmFNb2RlKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUFudGVubmFNb2RlKTsKLXZvaWQgQkJ2U2V0RGVlcFNsZWVwKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUxvY2FsSUQpOwotdm9pZCBCQnZFeGl0RGVlcFNsZWVwKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUxvY2FsSUQpOworYm9vbCBCQmJWVDMyNTNJbml0KFBTRGV2aWNlIHBEZXZpY2UpOwordm9pZCBCQnZTb2Z0d2FyZVJlc2V0KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOwordm9pZCBCQnZQb3dlclNhdmVNb2RlT04odW5zaWduZWQgbG9uZyBkd0lvQmFzZSk7Cit2b2lkIEJCdlBvd2VyU2F2ZU1vZGVPRkYodW5zaWduZWQgbG9uZyBkd0lvQmFzZSk7Cit2b2lkIEJCdlNldFR4QW50ZW5uYU1vZGUodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUFudGVubmFNb2RlKTsKK3ZvaWQgQkJ2U2V0UnhBbnRlbm5hTW9kZSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5QW50ZW5uYU1vZGUpOwordm9pZCBCQnZTZXREZWVwU2xlZXAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpOwordm9pZCBCQnZFeGl0RGVlcFNsZWVwKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKTsKIAogLy8gdGltZXIgZm9yIGFudGVubmEgZGl2ZXJzaXR5CiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0CiAgICAgKTsKIAotdm9pZCBCQnZBbnRlbm5hRGl2ZXJzaXR5KFBTRGV2aWNlIHBEZXZpY2UsIEJZVEUgYnlSeFJhdGUsIEJZVEUgYnlTUTMpOwordm9pZCBCQnZBbnRlbm5hRGl2ZXJzaXR5KFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGNoYXIgYnlSeFJhdGUsIHVuc2lnbmVkIGNoYXIgYnlTUTMpOwogdm9pZAogQkJ2Q2xlYXJBbnREaXZTUTNWYWx1ZSAoUFNEZXZpY2UgcERldmljZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYnNzZGIuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYnNzZGIuYwppbmRleCA2MzEyYTU1Li41N2MxY2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jzc2RiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9ic3NkYi5jCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSAiYmFzZWJhbmQuaCIKICNpbmNsdWRlICJyZi5oIgogI2luY2x1ZGUgImNhcmQuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAibWFjLmgiCiAjaW5jbHVkZSAid3BhMi5oIgogI2luY2x1ZGUgImlvd3BhLmgiCkBAIC03MSwxNCArNzIsMTQgQEAKIAogCiAKLWNvbnN0IFdPUkQgICAgICAgICAgICAgYXdIV1JldHJ5MFs1XVs1XSA9IHsKK2NvbnN0IHVuc2lnbmVkIHNob3J0IGF3SFdSZXRyeTBbNV1bNV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSQVRFXzE4TSwgUkFURV8xOE0sIFJBVEVfMTJNLCBSQVRFXzEyTSwgUkFURV8xMk19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UkFURV8yNE0sIFJBVEVfMjRNLCBSQVRFXzE4TSwgUkFURV8xMk0sIFJBVEVfMTJNfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JBVEVfMzZNLCBSQVRFXzM2TSwgUkFURV8yNE0sIFJBVEVfMThNLCBSQVRFXzE4TX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSQVRFXzQ4TSwgUkFURV80OE0sIFJBVEVfMzZNLCBSQVRFXzI0TSwgUkFURV8yNE19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UkFURV81NE0sIFJBVEVfNTRNLCBSQVRFXzQ4TSwgUkFURV8zNk0sIFJBVEVfMzZNfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci1jb25zdCBXT1JEICAgICAgICAgICAgIGF3SFdSZXRyeTFbNV1bNV0gPSB7Citjb25zdCB1bnNpZ25lZCBzaG9ydCBhd0hXUmV0cnkxWzVdWzVdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UkFURV8xOE0sIFJBVEVfMThNLCBSQVRFXzEyTSwgUkFURV82TSwgUkFURV82TX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSQVRFXzI0TSwgUkFURV8yNE0sIFJBVEVfMThNLCBSQVRFXzZNLCBSQVRFXzZNfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JBVEVfMzZNLCBSQVRFXzM2TSwgUkFURV8yNE0sIFJBVEVfMTJNLCBSQVRFXzEyTX0sCkBAIC0xMjYsMjUgKzEyNywyNSBAQAogUEtub3duQlNTCiBCU1NwU2VhcmNoQlNTTGlzdCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBQQllURSBwYnlEZXNpcmVCU1NJRCwKLSAgICBQQllURSBwYnlEZXNpcmVTU0lELAorICAgIHVuc2lnbmVkIGNoYXIgKnBieURlc2lyZUJTU0lELAorICAgIHVuc2lnbmVkIGNoYXIgKnBieURlc2lyZVNTSUQsCiAgICAgQ0FSRF9QSFlfVFlQRSAgZVBoeVR5cGUKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgUEJZVEUgICAgICAgICAgIHBieUJTU0lEID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCA9IE5VTEw7CiAgICAgUFdMQU5fSUVfU1NJRCAgIHBTU0lEID0gTlVMTDsKICAgICBQS25vd25CU1MgICAgICAgcEN1cnJCU1MgPSBOVUxMOwogICAgIFBLbm93bkJTUyAgICAgICBwU2VsZWN0ID0gTlVMTDsKLUJZVEUgICAgICAgICAgICAgICAgIFplcm9CU1NJRFtXTEFOX0JTU0lEX0xFTl09ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKLSAgICBVSU5UICAgICAgICAgICAgaWkgPSAwOwotLy8gICAgVUlOVCAgICAgICAgICAgIGpqID0gMDsgICAvL0RhdmlkV2FuZworICAgIHVuc2lnbmVkIGNoYXIgWmVyb0JTU0lEW1dMQU5fQlNTSURfTEVOXT17MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OworICAgIHVuc2lnbmVkIGludCBpaSA9IDA7CisKICAgICBpZiAocGJ5RGVzaXJlQlNTSUQgIT0gTlVMTCkgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkJTU3BTZWFyY2hCU1NMaXN0IEJTU0lEWyUwMlggJTAyWCAlMDJYLSUwMlggJTAyWCAlMDJYXVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGJ5RGVzaXJlQlNTSUQsKihwYnlEZXNpcmVCU1NJRCsxKSwqKHBieURlc2lyZUJTU0lEKzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocGJ5RGVzaXJlQlNTSUQrMyksKihwYnlEZXNpcmVCU1NJRCs0KSwqKHBieURlc2lyZUJTU0lEKzUpKTsKLSAgICAgICAgaWYgKCghSVNfQlJPQURDQVNUX0FERFJFU1MocGJ5RGVzaXJlQlNTSUQpKSAmJgorICAgICAgICBpZiAoKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihwYnlEZXNpcmVCU1NJRCkpICYmCiAJICAgICAobWVtY21wKHBieURlc2lyZUJTU0lELCBaZXJvQlNTSUQsIDYpIT0gMCkpewogICAgICAgICAgICAgcGJ5QlNTSUQgPSBwYnlEZXNpcmVCU1NJRDsKICAgICAgICAgfQpAQCAtMTU5LDEwICsxNjAsMTAgQEAKICAgICAgICAgLy8gbWF0Y2ggQlNTSUQgZmlyc3QKICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDxNQVhfQlNTX05VTTsgaWkrKykgewogICAgICAgICAgICAgcEN1cnJCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFtpaV0pOwotaWYocERldmljZS0+YkxpbmtQYXNzPT1GQUxTRSkgcEN1cnJCU1MtPmJTZWxlY3RlZCA9IEZBTFNFOworaWYocERldmljZS0+YkxpbmtQYXNzPT1mYWxzZSkgcEN1cnJCU1MtPmJTZWxlY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKChwQ3VyckJTUy0+YkFjdGl2ZSkgJiYKLSAgICAgICAgICAgICAgICAocEN1cnJCU1MtPmJTZWxlY3RlZCA9PSBGQUxTRSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwocEN1cnJCU1MtPmFieUJTU0lELCBwYnlCU1NJRCkpIHsKKyAgICAgICAgICAgICAgICAocEN1cnJCU1MtPmJTZWxlY3RlZCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwQ3VyckJTUy0+YWJ5QlNTSUQsIHBieUJTU0lEKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAocFNTSUQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSBzc2lkCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFtZW1jbXAocFNTSUQtPmFieVNTSUQsCkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfSUJTU19TVEEpICYmIFdMQU5fR0VUX0NBUF9JTkZPX0lCU1MocEN1cnJCU1MtPndDYXBJbmZvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfRVNTX1NUQSkgJiYgV0xBTl9HRVRfQ0FQX0lORk9fRVNTKHBDdXJyQlNTLT53Q2FwSW5mbykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyckJTUy0+YlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJCU1MtPmJTZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihwQ3VyckJTUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTgxLDcgKzE4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfSUJTU19TVEEpICYmIFdMQU5fR0VUX0NBUF9JTkZPX0lCU1MocEN1cnJCU1MtPndDYXBJbmZvKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBNZ210LT5lQ29uZmlnTW9kZSA9PSBXTUFDX0NPTkZJR19FU1NfU1RBKSAmJiBXTEFOX0dFVF9DQVBfSU5GT19FU1MocEN1cnJCU1MtPndDYXBJbmZvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyckJTUy0+YlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyckJTUy0+YlNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ocEN1cnJCU1MpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xOTMsNyArMTk0LDcgQEAKICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDxNQVhfQlNTX05VTTsgaWkrKykgewogICAgICAgICAgICAgcEN1cnJCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFtpaV0pOwogCS8vMjAwNy0wNzIxLTAxPEFkZD5ieSBNaWtlTGl1Ci0JICBwQ3VyckJTUy0+YlNlbGVjdGVkID0gRkFMU0U7CisJICBwQ3VyckJTUy0+YlNlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgaWYgKHBDdXJyQlNTLT5iQWN0aXZlKSB7CiAKICAgICAgICAgICAgICAgICBpZiAocFNTSUQgIT0gTlVMTCkgewpAQCAtMjI0LDE5ICsyMjUsMTkgQEAKICAgICAgICAgICAgICAgICB9CiAvKgogICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+ZUF1dGhlbk1vZGUgPCBXTUFDX0FVVEhfV1BBKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQ3VyckJTUy0+YldQQVZhbGlkID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyQlNTLT5iV1BBVmFsaWQgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gV1BBIEFQIHdpbGwgcmVqZWN0IGNvbm5lY3Rpb24gb2Ygc3RhdGlvbiB3aXRob3V0IFdQQSBlbmFibGUuCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBUFNLKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocEN1cnJCU1MtPmJXUEFWYWxpZCA9PSBGQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocEN1cnJCU1MtPmJXUEFWYWxpZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGlvbiB3aXRoIFdQQSBlbmFibGUgY2FuJ3Qgam9pbiBOb25XUEEgQVAuCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQTJQU0spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQ3VyckJTUy0+YldQQTJWYWxpZCA9PSBGQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocEN1cnJCU1MtPmJXUEEyVmFsaWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRpb24gd2l0aCBXUEEyIGVuYWJsZSBjYW4ndCBqb2luIE5vbldQQTIgQVAuCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjUzLDkgKzI1NCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBTZWxlY3QgIT0gTlVMTCkgewotICAgICAgICAgICAgcFNlbGVjdC0+YlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICAgIHBTZWxlY3QtPmJTZWxlY3RlZCA9IHRydWU7CiAvKgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJSb2FtaW5nID09IEZBTFNFKSAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJSb2FtaW5nID09IGZhbHNlKSAgewogCS8vICAgICAgIEVpbnNuIEFkZCBAMjAwNzA5MDcKIAkJCW1lbXNldChwYnlEZXNpcmVTU0lELCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKIAkJCW1lbWNweShwYnlEZXNpcmVTU0lELHBDdXJyQlNTLT5hYnlTU0lELFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpIDsKQEAgLTI4MywxOCArMjg0LDE4IEBACiB2b2lkCiBCU1N2Q2xlYXJCU1NMaXN0KAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIEJPT0wgYktlZXBDdXJyQlNTSUQKKyAgICBib29sIGJLZWVwQ3VyckJTU0lECiAgICAgKQogewogICAgIFBTRGV2aWNlICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwotICAgIFVJTlQgICAgICAgICAgICBpaTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAKICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewogICAgICAgICBpZiAoYktlZXBDdXJyQlNTSUQpIHsKICAgICAgICAgICAgIGlmIChwTWdtdC0+c0JTU0xpc3RbaWldLmJBY3RpdmUgJiYKLSAgICAgICAgICAgICAgICBJU19FVEhfQUREUkVTU19FUVVBTChwTWdtdC0+c0JTU0xpc3RbaWldLmFieUJTU0lELCBwTWdtdC0+YWJ5Q3VyckJTU0lEKSkgewotICAgICAgICAgICAgICAgLy8gYktlZXBDdXJyQlNTSUQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAhY29tcGFyZV9ldGhlcl9hZGRyKHBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5QlNTSUQsIHBNZ210LT5hYnlDdXJyQlNTSUQpKSB7CisgICAgICAgICAgICAgICAvLyBiS2VlcEN1cnJCU1NJRCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMDQsNyArMzA1LDcgQEAKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIHBNZ210LT5zQlNTTGlzdFtpaV0uYkFjdGl2ZSA9IEZBTFNFOworICAgICAgICBwTWdtdC0+c0JTU0xpc3RbaWldLmJBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgbWVtc2V0KCZwTWdtdC0+c0JTU0xpc3RbaWldLCAwLCBzaXplb2YoS25vd25CU1MpKTsKICAgICB9CiAgICAgQlNTdkNsZWFyQW55QlNTSm9pblJlY29yZChwRGV2aWNlKTsKQEAgLTMyMCwyNSArMzIxLDI1IEBACiAgKiAgICBzZWFyY2ggQlNTIGxpc3QgYnkgQlNTSUQgJiBTU0lEIGlmIG1hdGNoZWQKICAqCiAgKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBUUlVFIGlmIGZvdW5kLgorICogICAgdHJ1ZSBpZiBmb3VuZC4KICAqCiAtKi8KIFBLbm93bkJTUwogQlNTcEFkZHJJc0luQlNTTGlzdCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBQQllURSBhYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBjaGFyICphYnlCU1NJRCwKICAgICBQV0xBTl9JRV9TU0lEIHBTU0lECiAgICAgKQogewogICAgIFBTRGV2aWNlICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogICAgIFBLbm93bkJTUyAgICAgICBwQlNTTGlzdCA9IE5VTEw7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCBpaTsKIAogICAgIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7CiAgICAgICAgIHBCU1NMaXN0ID0gJihwTWdtdC0+c0JTU0xpc3RbaWldKTsKICAgICAgICAgaWYgKHBCU1NMaXN0LT5iQWN0aXZlKSB7Ci0gICAgICAgICAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwocEJTU0xpc3QtPmFieUJTU0lELCBhYnlCU1NJRCkpIHsKKyAgICAgICAgICAgIGlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBCU1NMaXN0LT5hYnlCU1NJRCwgYWJ5QlNTSUQpKSB7CiAvLyAgICAgICAgICAgICAgICBpZiAocFNTSUQgPT0gTlVMTCkKIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEJTU0xpc3Q7CiAgICAgICAgICAgICAgICAgaWYgKHBTU0lELT5sZW4gPT0gKChQV0xBTl9JRV9TU0lEKXBCU1NMaXN0LT5hYnlTU0lEKS0+bGVuKXsKQEAgLTM2MiwxOCArMzYzLDE4IEBACiAgKiAgICBJbnNlcnQgYSBCU1Mgc2V0IGludG8ga25vd24gQlNTIGxpc3QKICAqCiAgKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBUUlVFIGlmIHN1Y2Nlc3MuCisgKiAgICB0cnVlIGlmIHN1Y2Nlc3MuCiAgKgogLSovCiAKLUJPT0wKK2Jvb2wKIEJTU2JJbnNlcnRUb0JTU0xpc3QgKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFBCWVRFIGFieUJTU0lEQWRkciwKKyAgICB1bnNpZ25lZCBjaGFyICphYnlCU1NJREFkZHIsCiAgICAgUVdPUkQgcXdUaW1lc3RhbXAsCi0gICAgV09SRCB3QmVhY29uSW50ZXJ2YWwsCi0gICAgV09SRCB3Q2FwSW5mbywKLSAgICBCWVRFIGJ5Q3VyckNoYW5uZWwsCisgICAgdW5zaWduZWQgc2hvcnQgd0JlYWNvbkludGVydmFsLAorICAgIHVuc2lnbmVkIHNob3J0IHdDYXBJbmZvLAorICAgIHVuc2lnbmVkIGNoYXIgYnlDdXJyQ2hhbm5lbCwKICAgICBQV0xBTl9JRV9TU0lEIHBTU0lELAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcFN1cHBSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBFeHRTdXBwUmF0ZXMsCkBAIC0zODIsOCArMzgzLDggQEAKICAgICBQV0xBTl9JRV9SU05fRVhUIHBSU05XUEEsCiAgICAgUFdMQU5fSUVfQ09VTlRSWSBwSUVfQ291bnRyeSwKICAgICBQV0xBTl9JRV9RVUlFVCBwSUVfUXVpZXQsCi0gICAgVUlOVCB1SUVMZW5ndGgsCi0gICAgUEJZVEUgcGJ5SUVzLAorICAgIHVuc2lnbmVkIGludCB1SUVMZW5ndGgsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5SUVzLAogICAgIHZvaWQgKnBSeFBhY2tldENvbnRleHQKICAgICApCiB7CkBAIC0zOTIsOCArMzkzLDggQEAKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKICAgICBQU1J4TWdtdFBhY2tldCAgcFJ4UGFja2V0ID0gKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldENvbnRleHQ7CiAgICAgUEtub3duQlNTICAgICAgIHBCU1NMaXN0ID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgaWk7Ci0gICAgQk9PTCAgICAgICAgICAgIGJQYXJzaW5nUXVpZXQgPSBGQUxTRTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CisgICAgYm9vbCBiUGFyc2luZ1F1aWV0ID0gZmFsc2U7CiAgICAgUFdMQU5fSUVfUVVJRVQgIHBRdWlldCA9IE5VTEw7CiAKIApAQCAtNDA4LDEwICs0MDksMTAgQEAKIAogICAgIGlmIChpaSA9PSBNQVhfQlNTX05VTSl7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkdldCBmcmVlIEtub3dCU1Mgbm9kZSBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIC8vIHNhdmUgdGhlIEJTUyBpbmZvCi0gICAgcEJTU0xpc3QtPmJBY3RpdmUgPSBUUlVFOworICAgIHBCU1NMaXN0LT5iQWN0aXZlID0gdHJ1ZTsKICAgICBtZW1jcHkoIHBCU1NMaXN0LT5hYnlCU1NJRCwgYWJ5QlNTSURBZGRyLCBXTEFOX0JTU0lEX0xFTik7CiAgICAgSElEV09SRChwQlNTTGlzdC0+cXdCU1NUaW1lc3RhbXApID0gY3B1X3RvX2xlMzIoSElEV09SRChxd1RpbWVzdGFtcCkpOwogICAgIExPRFdPUkQocEJTU0xpc3QtPnF3QlNTVGltZXN0YW1wKSA9IGNwdV90b19sZTMyKExPRFdPUkQocXdUaW1lc3RhbXApKTsKQEAgLTQ0NSw3ICs0NDYsNyBAQAogICAgIGlmIChwQlNTTGlzdC0+dUNoYW5uZWwgPiBDQl9NQVhfQ0hBTk5FTF8yNEcpIHsKICAgICAgICAgcEJTU0xpc3QtPmVOZXR3b3JrVHlwZUluVXNlID0gUEhZX1RZUEVfMTFBOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwQlNTTGlzdC0+c0VSUC5iRVJQRXhpc3QgPT0gVFJVRSkgeworICAgICAgICBpZiAocEJTU0xpc3QtPnNFUlAuYkVSUEV4aXN0ID09IHRydWUpIHsKICAgICAgICAgICAgIHBCU1NMaXN0LT5lTmV0d29ya1R5cGVJblVzZSA9IFBIWV9UWVBFXzExRzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBCU1NMaXN0LT5lTmV0d29ya1R5cGVJblVzZSA9IFBIWV9UWVBFXzExQjsKQEAgLTQ2MSwxNiArNDYyLDE2IEBACiAgICAgICAgIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0FTU09DKSkgewogICAgICAgICAvLyBhc3NvYyB3aXRoIEJTUwogICAgICAgICBpZiAocEJTU0xpc3QgPT0gcE1nbXQtPnBDdXJyQlNTKSB7Ci0gICAgICAgICAgICBiUGFyc2luZ1F1aWV0ID0gVFJVRTsKKyAgICAgICAgICAgIGJQYXJzaW5nUXVpZXQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgV1BBX0NsZWFyUlNOKHBCU1NMaXN0KTsKIAogICAgIGlmIChwUlNOV1BBICE9IE5VTEwpIHsKLSAgICAgICAgVUlOVCB1TGVuID0gcFJTTldQQS0+bGVuICsgMjsKKyAgICAgICAgdW5zaWduZWQgaW50IHVMZW4gPSBwUlNOV1BBLT5sZW4gKyAyOwogCi0gICAgICAgIGlmICh1TGVuIDw9ICh1SUVMZW5ndGggLSAoVUlOVCkoVUxPTkdfUFRSKSgoUEJZVEUpcFJTTldQQSAtIHBieUlFcykpKSB7CisgICAgICAgIGlmICh1TGVuIDw9ICh1SUVMZW5ndGggLSAodW5zaWduZWQgaW50KSgodW5zaWduZWQgY2hhciAqKXBSU05XUEEgLSBwYnlJRXMpKSkgewogICAgICAgICAgICAgcEJTU0xpc3QtPndXUEFMZW4gPSB1TGVuOwogICAgICAgICAgICAgbWVtY3B5KHBCU1NMaXN0LT5ieVdQQUlFLCBwUlNOV1BBLCB1TGVuKTsKICAgICAgICAgICAgIFdQQV9QYXJzZVJTTihwQlNTTGlzdCwgcFJTTldQQSk7CkBAIC00ODAsMzMgKzQ4MSwzMyBAQAogICAgIFdQQTJfQ2xlYXJSU04ocEJTU0xpc3QpOwogCiAgICAgaWYgKHBSU04gIT0gTlVMTCkgewotICAgICAgICBVSU5UIHVMZW4gPSBwUlNOLT5sZW4gKyAyOwotICAgICAgICBpZiAodUxlbiA8PSAodUlFTGVuZ3RoIC0gKFVJTlQpKFVMT05HX1BUUikoKFBCWVRFKXBSU04gLSBwYnlJRXMpKSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgdUxlbiA9IHBSU04tPmxlbiArIDI7CisgICAgICAgIGlmICh1TGVuIDw9ICh1SUVMZW5ndGggLSAodW5zaWduZWQgaW50KSgodW5zaWduZWQgY2hhciAqKXBSU04gLSBwYnlJRXMpKSkgewogICAgICAgICAgICAgcEJTU0xpc3QtPndSU05MZW4gPSB1TGVuOwogICAgICAgICAgICAgbWVtY3B5KHBCU1NMaXN0LT5ieVJTTklFLCBwUlNOLCB1TGVuKTsKICAgICAgICAgICAgIFdQQTJ2UGFyc2VSU04ocEJTU0xpc3QsIHBSU04pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQTIpIHx8IChwQlNTTGlzdC0+YldQQTJWYWxpZCA9PSBUUlVFKSkgeworICAgIGlmICgocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEEyKSB8fCAocEJTU0xpc3QtPmJXUEEyVmFsaWQgPT0gdHJ1ZSkpIHsKIAogICAgICAgICBQU0tleUl0ZW0gIHBUcmFuc21pdEtleSA9IE5VTEw7Ci0gICAgICAgIEJPT0wgICAgICAgYklzODAyXzF4ID0gRkFMU0U7CisgICAgICAgIGJvb2wgYklzODAyXzF4ID0gZmFsc2U7CiAKICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcEJTU0xpc3QtPndBS01TU0F1dGhDb3VudDsgaWkgKyspIHsKICAgICAgICAgICAgIGlmIChwQlNTTGlzdC0+YWJ5QUtNU1NBdXRoVHlwZVtpaV0gPT0gV0xBTl8xMWlfQUtNU1NfODAyXzFYKSB7Ci0gICAgICAgICAgICAgICAgYklzODAyXzF4ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiSXM4MDJfMXggPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICgoYklzODAyXzF4ID09IFRSVUUpICYmIChwU1NJRC0+bGVuID09ICgoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5RGVzaXJlU1NJRCktPmxlbikgJiYKKyAgICAgICAgaWYgKChiSXM4MDJfMXggPT0gdHJ1ZSkgJiYgKHBTU0lELT5sZW4gPT0gKChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlEZXNpcmVTU0lEKS0+bGVuKSAmJgogICAgICAgICAgICAgKCAhbWVtY21wKHBTU0lELT5hYnlTU0lELCAoKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieURlc2lyZVNTSUQpLT5hYnlTU0lELCBwU1NJRC0+bGVuKSkpIHsKIAogICAgICAgICAgICAgYkFkZF9QTUtJRF9DYW5kaWRhdGUoKHZvaWQgKilwRGV2aWNlLCBwQlNTTGlzdC0+YWJ5QlNTSUQsICZwQlNTTGlzdC0+c1JTTkNhcE9iaik7CiAKLSAgICAgICAgICAgIGlmICgocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpICYmIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0FTU09DKSkgewotICAgICAgICAgICAgICAgIGlmICgoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJTU0lELCBQQUlSV0lTRV9LRVksICZwVHJhbnNtaXRLZXkpID09IFRSVUUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcERldmljZS0+YWJ5QlNTSUQsIEdST1VQX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gVFJVRSkpIHsKKyAgICAgICAgICAgIGlmICgocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpICYmIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0FTU09DKSkgeworICAgICAgICAgICAgICAgIGlmICgoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJTU0lELCBQQUlSV0lTRV9LRVksICZwVHJhbnNtaXRLZXkpID09IHRydWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcERldmljZS0+YWJ5QlNTSUQsIEdST1VQX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5TdGF0dXNUeXBlID0gTmRpczgwMl8xMVN0YXR1c1R5cGVfUE1LSURfQ2FuZGlkYXRlTGlzdDsKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5WZXJzaW9uID0gMTsKIApAQCAtNTE5LDQ2ICs1MjAsNDUgQEAKICAgICBpZiAocERldmljZS0+YlVwZGF0ZUJCVkdBKSB7CiAgICAgICAgIC8vIE1vbml0ZXIgaWYgUlNTSSBpcyB0b28gc3Ryb25nLgogICAgICAgICBwQlNTTGlzdC0+YnlSU1NJU3RhdENudCA9IDA7Ci0gICAgICAgIFJGdlJTU0lUb2RCbShwRGV2aWNlLCAoQllURSkocFJ4UGFja2V0LT51UlNTSSksICZwQlNTTGlzdC0+bGRCbU1BWCk7CisgICAgICAgIFJGdlJTU0lUb2RCbShwRGV2aWNlLCAodW5zaWduZWQgY2hhcikocFJ4UGFja2V0LT51UlNTSSksICZwQlNTTGlzdC0+bGRCbU1BWCk7CiAgICAgICAgIHBCU1NMaXN0LT5sZEJtQXZlcmFnZVswXSA9IHBCU1NMaXN0LT5sZEJtTUFYOwogICAgICAgICBmb3IgKGlpID0gMTsgaWkgPCBSU1NJX1NUQVRfQ09VTlQ7IGlpKyspCiAgICAgICAgICAgICBwQlNTTGlzdC0+bGRCbUF2ZXJhZ2VbaWldID0gMDsKICAgICB9CiAKICAgICBpZiAoKHBJRV9Db3VudHJ5ICE9IE5VTEwpICYmCi0gICAgICAgIChwTWdtdC0+YjExaEVuYWJsZSA9PSBUUlVFKSkgewotICAgICAgICBDQVJEdlNldENvdW50cnlJbmZvKHBNZ210LT5wQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQlNTTGlzdC0+ZU5ldHdvcmtUeXBlSW5Vc2UsCisgICAgICAgIChwTWdtdC0+YjExaEVuYWJsZSA9PSB0cnVlKSkgeworICAgICAgICBzZXRfY291bnRyeV9pbmZvKHBNZ210LT5wQWRhcHRlciwgcEJTU0xpc3QtPmVOZXR3b3JrVHlwZUluVXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJRV9Db3VudHJ5KTsKICAgICB9CiAKLSAgICBpZiAoKGJQYXJzaW5nUXVpZXQgPT0gVFJVRSkgJiYgKHBJRV9RdWlldCAhPSBOVUxMKSkgeworICAgIGlmICgoYlBhcnNpbmdRdWlldCA9PSB0cnVlKSAmJiAocElFX1F1aWV0ICE9IE5VTEwpKSB7CiAgICAgICAgIGlmICgoKChQV0xBTl9JRV9RVUlFVClwSUVfUXVpZXQpLT5sZW4gPT0gOCkgJiYKICAgICAgICAgICAgICgoKFBXTEFOX0lFX1FVSUVUKXBJRV9RdWlldCktPmJ5UXVpZXRDb3VudCAhPSAwKSkgewogICAgICAgICAgICAgLy8gdmFsaWQgRUlECiAgICAgICAgICAgICBpZiAocFF1aWV0ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBwUXVpZXQgPSAoUFdMQU5fSUVfUVVJRVQpcElFX1F1aWV0OwogICAgICAgICAgICAgICAgIENBUkRiU2V0UXVpZXQoICBwTWdtdC0+cEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWlldC0+YnlRdWlldENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVpZXQtPmJ5UXVpZXRQZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKFBXT1JEKXBRdWlldC0+YWJ5UXVpZXREdXJhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKFBXT1JEKXBRdWlldC0+YWJ5UXVpZXRPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKHVuc2lnbmVkIHNob3J0ICopcFF1aWV0LT5hYnlRdWlldER1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigodW5zaWduZWQgc2hvcnQgKilwUXVpZXQtPmFieVF1aWV0T2Zmc2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwUXVpZXQgPSAoUFdMQU5fSUVfUVVJRVQpcElFX1F1aWV0OwogICAgICAgICAgICAgICAgIENBUkRiU2V0UXVpZXQoICBwTWdtdC0+cEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1aWV0LT5ieVF1aWV0Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWlldC0+YnlRdWlldFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoUFdPUkQpcFF1aWV0LT5hYnlRdWlldER1cmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoUFdPUkQpcFF1aWV0LT5hYnlRdWlldE9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigodW5zaWduZWQgc2hvcnQgKilwUXVpZXQtPmFieVF1aWV0RHVyYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCh1bnNpZ25lZCBzaG9ydCAqKXBRdWlldC0+YWJ5UXVpZXRPZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKGJQYXJzaW5nUXVpZXQgPT0gVFJVRSkgJiYKKyAgICBpZiAoKGJQYXJzaW5nUXVpZXQgPT0gdHJ1ZSkgJiYKICAgICAgICAgKHBRdWlldCAhPSBOVUxMKSkgewogICAgICAgICBDQVJEYlN0YXJ0UXVpZXQocE1nbXQtPnBBZGFwdGVyKTsKICAgICB9CkBAIC01NjgsNyArNTY4LDcgQEAKICAgICAgICAgcEJTU0xpc3QtPnVJRUxlbmd0aCA9IFdMQU5fQkVBQ09OX0ZSX01BWExFTjsKICAgICBtZW1jcHkocEJTU0xpc3QtPmFieUlFcywgcGJ5SUVzLCBwQlNTTGlzdC0+dUlFTGVuZ3RoKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKQEAgLTU3OCwxOSArNTc4LDE5IEBACiAgKiAgICBVcGRhdGUgQlNTIHNldCBpbiBrbm93biBCU1MgbGlzdAogICoKICAqIFJldHVybiBWYWx1ZToKLSAqICAgIFRSVUUgaWYgc3VjY2Vzcy4KKyAqICAgIHRydWUgaWYgc3VjY2Vzcy4KICAqCiAtKi8KIC8vIFRPRE86IGlucHV0IHN0cnVjdHVyZSBtb2RpZnkKIAotQk9PTAorYm9vbAogQlNTYlVwZGF0ZVRvQlNTTGlzdCAoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCiAgICAgUVdPUkQgcXdUaW1lc3RhbXAsCi0gICAgV09SRCB3QmVhY29uSW50ZXJ2YWwsCi0gICAgV09SRCB3Q2FwSW5mbywKLSAgICBCWVRFIGJ5Q3VyckNoYW5uZWwsCi0gICAgQk9PTCBiQ2hhbm5lbEhpdCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3QmVhY29uSW50ZXJ2YWwsCisgICAgdW5zaWduZWQgc2hvcnQgd0NhcEluZm8sCisgICAgdW5zaWduZWQgY2hhciBieUN1cnJDaGFubmVsLAorICAgIGJvb2wgYkNoYW5uZWxIaXQsCiAgICAgUFdMQU5fSUVfU1NJRCBwU1NJRCwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwRXh0U3VwcFJhdGVzLApAQCAtNjAwLDggKzYwMCw4IEBACiAgICAgUFdMQU5fSUVfQ09VTlRSWSBwSUVfQ291bnRyeSwKICAgICBQV0xBTl9JRV9RVUlFVCBwSUVfUXVpZXQsCiAgICAgUEtub3duQlNTIHBCU1NMaXN0LAotICAgIFVJTlQgdUlFTGVuZ3RoLAotICAgIFBCWVRFIHBieUlFcywKKyAgICB1bnNpZ25lZCBpbnQgdUlFTGVuZ3RoLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUlFcywKICAgICB2b2lkICpwUnhQYWNrZXRDb250ZXh0CiAgICAgKQogewpAQCAtNjA5LDE0ICs2MDksMTQgQEAKICAgICBQU0RldmljZSAgICAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKICAgICBQU1J4TWdtdFBhY2tldCAgcFJ4UGFja2V0ID0gKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldENvbnRleHQ7Ci0gICAgTE9ORyAgICAgICAgICAgIGxkQm07Ci0gICAgQk9PTCAgICAgICAgICAgIGJQYXJzaW5nUXVpZXQgPSBGQUxTRTsKKyAgICBsb25nICAgICAgICAgICAgbGRCbTsKKyAgICBib29sIGJQYXJzaW5nUXVpZXQgPSBmYWxzZTsKICAgICBQV0xBTl9JRV9RVUlFVCAgcFF1aWV0ID0gTlVMTDsKIAogCiAKICAgICBpZiAocEJTU0xpc3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKIAogICAgIEhJRFdPUkQocEJTU0xpc3QtPnF3QlNTVGltZXN0YW1wKSA9IGNwdV90b19sZTMyKEhJRFdPUkQocXdUaW1lc3RhbXApKTsKQEAgLTY0Niw3ICs2NDYsNyBAQAogICAgIGlmIChwQlNTTGlzdC0+dUNoYW5uZWwgPiBDQl9NQVhfQ0hBTk5FTF8yNEcpIHsKICAgICAgICAgcEJTU0xpc3QtPmVOZXR3b3JrVHlwZUluVXNlID0gUEhZX1RZUEVfMTFBOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwQlNTTGlzdC0+c0VSUC5iRVJQRXhpc3QgPT0gVFJVRSkgeworICAgICAgICBpZiAocEJTU0xpc3QtPnNFUlAuYkVSUEV4aXN0ID09IHRydWUpIHsKICAgICAgICAgICAgIHBCU1NMaXN0LT5lTmV0d29ya1R5cGVJblVzZSA9IFBIWV9UWVBFXzExRzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBCU1NMaXN0LT5lTmV0d29ya1R5cGVJblVzZSA9IFBIWV9UWVBFXzExQjsKQEAgLTY2MywxNSArNjYzLDE1IEBACiAgICAgICAgIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0FTU09DKSkgewogICAgICAgICAvLyBhc3NvYyB3aXRoIEJTUwogICAgICAgICBpZiAocEJTU0xpc3QgPT0gcE1nbXQtPnBDdXJyQlNTKSB7Ci0gICAgICAgICAgICBiUGFyc2luZ1F1aWV0ID0gVFJVRTsKKyAgICAgICAgICAgIGJQYXJzaW5nUXVpZXQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCiAgICBXUEFfQ2xlYXJSU04ocEJTU0xpc3QpOyAgICAgICAgIC8vbWlrZSB1cGRhdGUKIAogICAgIGlmIChwUlNOV1BBICE9IE5VTEwpIHsKLSAgICAgICAgVUlOVCB1TGVuID0gcFJTTldQQS0+bGVuICsgMjsKLSAgICAgICAgaWYgKHVMZW4gPD0gKHVJRUxlbmd0aCAtIChVSU5UKShVTE9OR19QVFIpKChQQllURSlwUlNOV1BBIC0gcGJ5SUVzKSkpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHVMZW4gPSBwUlNOV1BBLT5sZW4gKyAyOworICAgICAgICBpZiAodUxlbiA8PSAodUlFTGVuZ3RoIC0gKHVuc2lnbmVkIGludCkoKHVuc2lnbmVkIGNoYXIgKilwUlNOV1BBIC0gcGJ5SUVzKSkpIHsKICAgICAgICAgICAgIHBCU1NMaXN0LT53V1BBTGVuID0gdUxlbjsKICAgICAgICAgICAgIG1lbWNweShwQlNTTGlzdC0+YnlXUEFJRSwgcFJTTldQQSwgdUxlbik7CiAgICAgICAgICAgICBXUEFfUGFyc2VSU04ocEJTU0xpc3QsIHBSU05XUEEpOwpAQCAtNjgxLDggKzY4MSw4IEBACiAgICBXUEEyX0NsZWFyUlNOKHBCU1NMaXN0KTsgIC8vbWlrZSB1cGRhdGUKIAogICAgIGlmIChwUlNOICE9IE5VTEwpIHsKLSAgICAgICAgVUlOVCB1TGVuID0gcFJTTi0+bGVuICsgMjsKLSAgICAgICAgaWYgKHVMZW4gPD0gKHVJRUxlbmd0aCAtIChVSU5UKShVTE9OR19QVFIpKChQQllURSlwUlNOIC0gcGJ5SUVzKSkpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHVMZW4gPSBwUlNOLT5sZW4gKyAyOworICAgICAgICBpZiAodUxlbiA8PSAodUlFTGVuZ3RoIC0gKHVuc2lnbmVkIGludCkoKHVuc2lnbmVkIGNoYXIgKilwUlNOIC0gcGJ5SUVzKSkpIHsKICAgICAgICAgICAgIHBCU1NMaXN0LT53UlNOTGVuID0gdUxlbjsKICAgICAgICAgICAgIG1lbWNweShwQlNTTGlzdC0+YnlSU05JRSwgcFJTTiwgdUxlbik7CiAgICAgICAgICAgICBXUEEydlBhcnNlUlNOKHBCU1NMaXN0LCBwUlNOKTsKQEAgLTY5MCw3ICs2OTAsNyBAQAogICAgIH0KIAogICAgIGlmIChwUnhQYWNrZXQtPnVSU1NJICE9IDApIHsKLSAgICAgICAgUkZ2UlNTSVRvZEJtKHBEZXZpY2UsIChCWVRFKShwUnhQYWNrZXQtPnVSU1NJKSwgJmxkQm0pOworICAgICAgICBSRnZSU1NJVG9kQm0ocERldmljZSwgKHVuc2lnbmVkIGNoYXIpKHBSeFBhY2tldC0+dVJTU0kpLCAmbGRCbSk7CiAgICAgICAgIC8vIE1vbml0ZXIgaWYgUlNTSSBpcyB0b28gc3Ryb25nLgogICAgICAgICBwQlNTTGlzdC0+YnlSU1NJU3RhdENudCsrOwogICAgICAgICBwQlNTTGlzdC0+YnlSU1NJU3RhdENudCAlPSBSU1NJX1NUQVRfQ09VTlQ7CkBAIC03MDMsMzkgKzcwMywzOCBAQAogICAgIH0KIAogICAgIGlmICgocElFX0NvdW50cnkgIT0gTlVMTCkgJiYKLSAgICAgICAgKHBNZ210LT5iMTFoRW5hYmxlID09IFRSVUUpKSB7Ci0gICAgICAgIENBUkR2U2V0Q291bnRyeUluZm8ocE1nbXQtPnBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCU1NMaXN0LT5lTmV0d29ya1R5cGVJblVzZSwKKyAgICAgICAgKHBNZ210LT5iMTFoRW5hYmxlID09IHRydWUpKSB7CisgICAgICAgIHNldF9jb3VudHJ5X2luZm8ocE1nbXQtPnBBZGFwdGVyLCBwQlNTTGlzdC0+ZU5ldHdvcmtUeXBlSW5Vc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElFX0NvdW50cnkpOwogICAgIH0KIAotICAgIGlmICgoYlBhcnNpbmdRdWlldCA9PSBUUlVFKSAmJiAocElFX1F1aWV0ICE9IE5VTEwpKSB7CisgICAgaWYgKChiUGFyc2luZ1F1aWV0ID09IHRydWUpICYmIChwSUVfUXVpZXQgIT0gTlVMTCkpIHsKICAgICAgICAgaWYgKCgoKFBXTEFOX0lFX1FVSUVUKXBJRV9RdWlldCktPmxlbiA9PSA4KSAmJgogICAgICAgICAgICAgKCgoUFdMQU5fSUVfUVVJRVQpcElFX1F1aWV0KS0+YnlRdWlldENvdW50ICE9IDApKSB7CiAgICAgICAgICAgICAvLyB2YWxpZCBFSUQKICAgICAgICAgICAgIGlmIChwUXVpZXQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHBRdWlldCA9IChQV0xBTl9JRV9RVUlFVClwSUVfUXVpZXQ7CiAgICAgICAgICAgICAgICAgQ0FSRGJTZXRRdWlldCggIHBNZ210LT5wQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1aWV0LT5ieVF1aWV0Q291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWlldC0+YnlRdWlldFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoUFdPUkQpcFF1aWV0LT5hYnlRdWlldER1cmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoUFdPUkQpcFF1aWV0LT5hYnlRdWlldE9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigodW5zaWduZWQgc2hvcnQgKilwUXVpZXQtPmFieVF1aWV0RHVyYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCh1bnNpZ25lZCBzaG9ydCAqKXBRdWlldC0+YWJ5UXVpZXRPZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBRdWlldCA9IChQV0xBTl9JRV9RVUlFVClwSUVfUXVpZXQ7CiAgICAgICAgICAgICAgICAgQ0FSRGJTZXRRdWlldCggIHBNZ210LT5wQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVpZXQtPmJ5UXVpZXRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1aWV0LT5ieVF1aWV0UGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChQV09SRClwUXVpZXQtPmFieVF1aWV0RHVyYXRpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChQV09SRClwUXVpZXQtPmFieVF1aWV0T2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCh1bnNpZ25lZCBzaG9ydCAqKXBRdWlldC0+YWJ5UXVpZXREdXJhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKHVuc2lnbmVkIHNob3J0ICopcFF1aWV0LT5hYnlRdWlldE9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoYlBhcnNpbmdRdWlldCA9PSBUUlVFKSAmJgorICAgIGlmICgoYlBhcnNpbmdRdWlldCA9PSB0cnVlKSAmJgogICAgICAgICAocFF1aWV0ICE9IE5VTEwpKSB7CiAgICAgICAgIENBUkRiU3RhcnRRdWlldChwTWdtdC0+cEFkYXB0ZXIpOwogICAgIH0KQEAgLTc0NSw3ICs3NDQsNyBAQAogICAgICAgICBwQlNTTGlzdC0+dUlFTGVuZ3RoID0gV0xBTl9CRUFDT05fRlJfTUFYTEVOOwogICAgIG1lbWNweShwQlNTTGlzdC0+YWJ5SUVzLCBwYnlJRXMsIHBCU1NMaXN0LT51SUVMZW5ndGgpOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIApAQCAtNzYyLDI3ICs3NjEsMjQgQEAKICAqCiAtKi8KIAotQk9PTAotQlNTREJiSXNTVEFJbk5vZGVEQigKLSAgICB2b2lkICpwTWdtdE9iamVjdCwKLSAgICBQQllURSBhYnlEc3RBZGRyLAotICAgIFBVSU5UIHB1Tm9kZUluZGV4Ci0gICAgKQorYm9vbAorQlNTREJiSXNTVEFJbk5vZGVEQih2b2lkICpwTWdtdE9iamVjdCwgdW5zaWduZWQgY2hhciAqYWJ5RHN0QWRkciwKKwkJdW5zaWduZWQgaW50ICpwdU5vZGVJbmRleCkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KSBwTWdtdE9iamVjdDsKLSAgICBVSU5UICAgICAgICAgICAgaWk7CisgICAgdW5zaWduZWQgaW50IGlpOwogCiAgICAgLy8gSW5kZXggPSAwIHJlc2VydmVkIGZvciBBUCBOb2RlCiAgICAgZm9yIChpaSA9IDE7IGlpIDwgKE1BWF9OT0RFX05VTSArIDEpOyBpaSsrKSB7CiAgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW2lpXS5iQWN0aXZlKSB7Ci0gICAgICAgICAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwoYWJ5RHN0QWRkciwgcE1nbXQtPnNOb2RlREJUYWJsZVtpaV0uYWJ5TUFDQWRkcikpIHsKKyAgICAgICAgICAgIGlmICghY29tcGFyZV9ldGhlcl9hZGRyKGFieURzdEFkZHIsIHBNZ210LT5zTm9kZURCVGFibGVbaWldLmFieU1BQ0FkZHIpKSB7CiAgICAgICAgICAgICAgICAgKnB1Tm9kZUluZGV4ID0gaWk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgIHJldHVybiBGQUxTRTsKKyAgIHJldHVybiBmYWxzZTsKIH07CiAKIApAQCAtNzk4LDE3ICs3OTQsMTQgQEAKICAqCiAtKi8KIHZvaWQKLUJTU3ZDcmVhdGVPbmVOb2RlKAotICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFBVSU5UIHB1Tm9kZUluZGV4Ci0gICAgKQorQlNTdkNyZWF0ZU9uZU5vZGUodm9pZCAqaERldmljZUNvbnRleHQsIHVuc2lnbmVkIGludCAqcHVOb2RlSW5kZXgpCiB7CiAKICAgICBQU0RldmljZSAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBVSU5UICAgICAgICAgICAgaWk7Ci0gICAgVUlOVCAgICAgICAgICAgIEJpZ2VzdENvdW50ID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgU2VsZWN0SW5kZXg7CisgICAgdW5zaWduZWQgaW50IGlpOworICAgIHVuc2lnbmVkIGludCBCaWdlc3RDb3VudCA9IDA7CisgICAgdW5zaWduZWQgaW50IFNlbGVjdEluZGV4OwogICAgIHN0cnVjdCBza19idWZmICAqc2tiOwogICAgIC8vIEluZGV4ID0gMCByZXNlcnZlZCBmb3IgQVAgTm9kZSAoSW4gU1RBIG1vZGUpCiAgICAgLy8gSW5kZXggPSAwIHJlc2VydmVkIGZvciBCcm9hZGNhc3QvTXVsdGlDYXN0IChJbiBBUCBtb2RlKQpAQCAtODQwLDcgKzgzMyw3IEBACiAgICAgfQogCiAgICAgbWVtc2V0KCZwTWdtdC0+c05vZGVEQlRhYmxlWypwdU5vZGVJbmRleF0sIDAsIHNpemVvZihLbm93bk5vZGVEQikpOwotICAgIHBNZ210LT5zTm9kZURCVGFibGVbKnB1Tm9kZUluZGV4XS5iQWN0aXZlID0gVFJVRTsKKyAgICBwTWdtdC0+c05vZGVEQlRhYmxlWypwdU5vZGVJbmRleF0uYkFjdGl2ZSA9IHRydWU7CiAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVsqcHVOb2RlSW5kZXhdLnVSYXRlUG9sbFRpbWVvdXQgPSBGQUxMQkFDS19QT0xMX1NFQ09ORDsKICAgICAvLyBmb3IgQVAgbW9kZSBQUyBxdWV1ZQogICAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJnBNZ210LT5zTm9kZURCVGFibGVbKnB1Tm9kZUluZGV4XS5zVHhQU1F1ZXVlKTsKQEAgLTg2NSwxMyArODU4LDEzIEBACiB2b2lkCiBCU1N2UmVtb3ZlT25lTm9kZSgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBVSU5UIHVOb2RlSW5kZXgKKyAgICB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleAogICAgICkKIHsKIAogICAgIFBTRGV2aWNlICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwotICAgIEJZVEUgICAgICAgICAgICBieU1hc2tbOF0gPSB7MSwgMiwgNCwgOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07CisgICAgdW5zaWduZWQgY2hhciBieU1hc2tbOF0gPSB7MSwgMiwgNCwgOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07CiAgICAgc3RydWN0IHNrX2J1ZmYgICpza2I7CiAKIApAQCAtODk4LDE4ICs4OTEsMTggQEAKIHZvaWQKIEJTU3ZVcGRhdGVBUE5vZGUoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgUFdPUkQgcHdDYXBJbmZvLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd0NhcEluZm8sCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwU3VwcFJhdGVzLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEV4dFN1cHBSYXRlcwogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBVSU5UICAgICAgICAgICAgdVJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTjsKKyAgICB1bnNpZ25lZCBpbnQgdVJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTjsKIAogICAgIG1lbXNldCgmcE1nbXQtPnNOb2RlREJUYWJsZVswXSwgMCwgc2l6ZW9mKEtub3duTm9kZURCKSk7CiAKLSAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSBUUlVFOworICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYkFjdGl2ZSA9IHRydWU7CiAgICAgaWYgKHBEZXZpY2UtPmVDdXJyZW50UEhZVHlwZSA9PSBQSFlfVFlQRV8xMUIpIHsKICAgICAgICAgdVJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTl8xMUI7CiAgICAgfQpAQCAtOTIyLDcgKzkxNSw3IEBACiAgICAgUkFURXZQYXJzZU1heFJhdGUoKHZvaWQgKilwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwTWdtdC0+YWJ5Q3VyclN1cHBSYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJFeHRTdXBwUmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVswXS53TWF4QmFzaWNSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdLndNYXhTdXBwUmF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVswXS53U3VwcFJhdGUpLApAQCAtOTY5LDEzICs5NjIsMTMgQEAKICAgICBpZiAoIXBEZXZpY2UtPmJFbmFibGVIb3N0V0VQKQogICAgICAgICBtZW1zZXQoJnBNZ210LT5zTm9kZURCVGFibGVbMF0sIDAsIHNpemVvZihLbm93bk5vZGVEQikpOwogICAgIG1lbXNldChwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmFieU1BQ0FkZHIsIDB4ZmYsIFdMQU5fQUREUl9MRU4pOwotICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYkFjdGl2ZSA9IFRSVUU7Ci0gICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUgPSBGQUxTRTsKKyAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSB0cnVlOworICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYlBTRW5hYmxlID0gZmFsc2U7CiAgICAgc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcE1nbXQtPnNOb2RlREJUYWJsZVswXS5zVHhQU1F1ZXVlKTsKICAgICBSQVRFdlBhcnNlTWF4UmF0ZSgodm9pZCAqKXBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJTdXBwUmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJFeHRTdXBwUmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVswXS53TWF4QmFzaWNSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAmKHBNZ210LT5zTm9kZURCVGFibGVbMF0ud01heFN1cHBSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdLndTdXBwUmF0ZSksCkBAIC0xMDA4LDggKzEwMDEsOCBAQAogLSovCiAgLy8yMDA4LTQtMTQgPGFkZD4gYnkgY2hlc3RlciBmb3IgbGVkIGlzc3VlCiAgI2lmZGVmIEZPUl9MRURfT05fTk9URUJPT0sKLUJPT0wgY2M9RkFMU0U7Ci1VSU5UIHN0YXR1czsKK2Jvb2wgY2M9ZmFsc2U7Cit1bnNpZ25lZCBpbnQgc3RhdHVzOwogI2VuZGlmCiB2b2lkCiBCU1N2U2Vjb25kQ2FsbEJhY2soCkBAIC0xMDE4LDExICsxMDExLDExIEBACiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCBpaTsKICAgICBQV0xBTl9JRV9TU0lEICAgcEl0ZW1TU0lELCBwQ3VyclNTSUQ7Ci0gICAgVUlOVCAgICAgICAgICAgIHVTbGVlcHlTVEFDbnQgPSAwOwotICAgIFVJTlQgICAgICAgICAgICB1Tm9uU2hvcnRTbG90U1RBQ250ID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgdUxvbmdQcmVhbWJsZVNUQUNudCA9IDA7CisgICAgdW5zaWduZWQgaW50IHVTbGVlcHlTVEFDbnQgPSAwOworICAgIHVuc2lnbmVkIGludCB1Tm9uU2hvcnRTbG90U1RBQ250ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUxvbmdQcmVhbWJsZVNUQUNudCA9IDA7CiAgICAgdmlhd2dldF93cGFfaGVhZGVyKiB3cGFoZHI7ICAvL0RhdmlkV2FuZwogCiAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CkBAIC0xMDM0LDIyICsxMDI3LDIyIEBACiAgLy8yMDA4LTQtMTQgPGFkZD4gYnkgY2hlc3RlciBmb3IgbGVkIGlzc3VlCiAjaWZkZWYgRk9SX0xFRF9PTl9OT1RFQk9PSwogTUFDdkdQSU9JbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAmcERldmljZS0+YnlHUElPKTsKLWlmICgoKCAhKHBEZXZpY2UtPmJ5R1BJTyAmIEdQSU8wX0RBVEEpJiYocERldmljZS0+YkhXUmFkaW9PZmYgPT0gRkFMU0UpKXx8KChwRGV2aWNlLT5ieUdQSU8gJiBHUElPMF9EQVRBKSYmKHBEZXZpY2UtPmJIV1JhZGlvT2ZmID09IFRSVUUpKSkmJihjYz09RkFMU0UpKXsKLWNjPVRSVUU7CitpZiAoKCggIShwRGV2aWNlLT5ieUdQSU8gJiBHUElPMF9EQVRBKSYmKHBEZXZpY2UtPmJIV1JhZGlvT2ZmID09IGZhbHNlKSl8fCgocERldmljZS0+YnlHUElPICYgR1BJTzBfREFUQSkmJihwRGV2aWNlLT5iSFdSYWRpb09mZiA9PSB0cnVlKSkpJiYoY2M9PWZhbHNlKSl7CitjYz10cnVlOwogfQotZWxzZSBpZihjYz09VFJVRSl7CitlbHNlIGlmKGNjPT10cnVlKXsKIAotaWYocERldmljZS0+YkhXUmFkaW9PZmYgPT0gVFJVRSl7CitpZihwRGV2aWNlLT5iSFdSYWRpb09mZiA9PSB0cnVlKXsKICAgICAgICAgICAgIGlmICggIShwRGV2aWNlLT5ieUdQSU8gJiBHUElPMF9EQVRBKSkKIC8vfHwoICEocERldmljZS0+YnlHUElPICYgR1BJTzBfREFUQSkgJiYgKHBEZXZpY2UtPmJ5UmFkaW9DdGwgJiBFRVBfUkFESU9DVExfSU5WKSkpCiB7aWYoc3RhdHVzPT0xKSBnb3RvIHN0YXJ0Owogc3RhdHVzPTE7CiBDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7Ci0gICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyTW9kZSA9IFdNQUNfTU9ERV9TVEFOREJZOwogICAgICAgICAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwogICAgICAgICAgICAgICAgIC8vbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogCiB9CiAgIGlmIChwRGV2aWNlLT5ieUdQSU8gJkdQSU8wX0RBVEEpCkBAIC0xMDY0LDExICsxMDU3LDExIEBACiB7aWYoc3RhdHVzPT0zKSBnb3RvIHN0YXJ0Owogc3RhdHVzPTM7CiBDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7Ci0gICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyTW9kZSA9IFdNQUNfTU9ERV9TVEFOREJZOwogICAgICAgICAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwogICAgICAgICAgICAgICAgIC8vbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogCiB9CiAgIGlmICggIShwRGV2aWNlLT5ieUdQSU8gJiBHUElPMF9EQVRBKSkKQEAgLTEwOTIsMTEgKzEwODUsMTEgQEAKIAogewogICAgICAgIHBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50Kys7Ci0gICBpZigocERldmljZS0+YnlSZUFzc29jQ291bnQgPiAxMCkgJiYgKHBEZXZpY2UtPmJMaW5rUGFzcyAhPSBUUlVFKSkgeyAgLy8xMCBzZWMgdGltZW91dAorICAgaWYoKHBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID4gMTApICYmIChwRGV2aWNlLT5iTGlua1Bhc3MgIT0gdHJ1ZSkpIHsgIC8vMTAgc2VjIHRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiUmUtYXNzb2NpYXRpb24gdGltZW91dCEhIVxuIik7CiAJCSAgIHBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgCXVuaW9uIGl3cmVxX2RhdGEgIHdycXU7CiAgICAgICAgICAgICAgICAgICAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2YgKHdycXUpKTsKQEAgLTExMDYsNyArMTA5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgIH0KLSAgIGVsc2UgaWYocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpCisgICBlbHNlIGlmKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKQogICAgCXBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKIH0KIApAQCAtMTIwMCwyNyArMTE5MywyNyBAQAogICAgICAgICBpZiAoV0xBTl9HRVRfRVJQX1VTRV9QUk9URUNUSU9OKHBEZXZpY2UtPmJ5RVJQRmxhZykpIHsKICAgICAgICAgICAgIGlmICghcERldmljZS0+YlByb3RlY3RNb2RlKSB7CiAgICAgICAgICAgICAgICAgTUFDdkVuYWJsZVByb3RlY3RNRChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSBUUlVFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJQcm90ZWN0TW9kZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBpZiAocERldmljZS0+YlByb3RlY3RNb2RlKSB7CiAgICAgICAgICAgICAgICAgTUFDdkRpc2FibGVQcm90ZWN0TUQocERldmljZS0+UG9ydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YlByb3RlY3RNb2RlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcERldmljZS0+YlByb3RlY3RNb2RlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gb24vb2ZmIHNob3J0IHNsb3QgdGltZQogCiAgICAgICAgIGlmICh1Tm9uU2hvcnRTbG90U1RBQ250ID4gMCkgewogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJTaG9ydFNsb3RUaW1lKSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YlNob3J0U2xvdFRpbWUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iU2hvcnRTbG90VGltZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIEJCdlNldFNob3J0U2xvdFRpbWUocERldmljZSk7CiAgICAgICAgICAgICAgICAgdlVwZGF0ZUlGUygodm9pZCAqKXBEZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaWYgKCFwRGV2aWNlLT5iU2hvcnRTbG90VGltZSkgewotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJTaG9ydFNsb3RUaW1lID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iU2hvcnRTbG90VGltZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgQkJ2U2V0U2hvcnRTbG90VGltZShwRGV2aWNlKTsKICAgICAgICAgICAgICAgICB2VXBkYXRlSUZTKCh2b2lkICopcERldmljZSk7CiAgICAgICAgICAgICB9CkBAIC0xMjMxLDEzICsxMjI0LDEzIEBACiAgICAgICAgIGlmICh1TG9uZ1ByZWFtYmxlU1RBQ250ID4gMCkgewogICAgICAgICAgICAgaWYgKCFwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCkgewogICAgICAgICAgICAgICAgIE1BQ3ZFbmFibGVCYXJrZXJQcmVhbWJsZU1kKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJCYXJrZXJQcmVhbWJsZU1kID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBpZiAocERldmljZS0+YkJhcmtlclByZWFtYmxlTWQpIHsKICAgICAgICAgICAgICAgICBNQUN2RGlzYWJsZUJhcmtlclByZWFtYmxlTWQocERldmljZS0+UG9ydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YkJhcmtlclByZWFtYmxlTWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEyNDcsOSArMTI0MCw5IEBACiAgICAgLy8gQ2hlY2sgaWYgYW55IFNUQSBpbiBQUyBtb2RlLCBlbmFibGUgRFRJTSBtdWx0aWNhc3QgZGVsaXZlcgogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKICAgICAgICAgaWYgKHVTbGVlcHlTVEFDbnQgPiAwKQotICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUgPSB0cnVlOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJQU0VuYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUgPSBmYWxzZTsKICAgICB9CiAKICAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5RGVzaXJlU1NJRDsKQEAgLTEyNzYsMTIgKzEyNjksMTIgQEAKICAgICAJICAgIH0KIAogICAgICAgICAJaWYgKHBNZ210LT5zTm9kZURCVGFibGVbMF0udUluQWN0aXZlQ291bnQgPj0gTE9TVF9CRUFDT05fQ09VTlQpIHsKLSAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJNb2RlID0gV01BQ19NT0RFX1NUQU5EQlk7CiAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJSb2FtaW5nID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iUm9hbWluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfTk9USUNFLCBLRVJOX0lORk8gIkxvc3QgQVAgYmVhY29uIFslZF0gc2VjLCBkaXNjb25uZWN0ZWQgIVxuIiwgcE1nbXQtPnNOb2RlREJUYWJsZVswXS51SW5BY3RpdmVDb3VudCk7CiAgICAgICAgIGlmICgocERldmljZS0+YldQQURFVlVwKSAmJiAocERldmljZS0+c2tiICE9IE5VTEwpKSB7CiAgICAgICAgICAgICAgd3BhaGRyID0gKHZpYXdnZXRfd3BhX2hlYWRlciAqKXBEZXZpY2UtPnNrYi0+ZGF0YTsKQEAgLTEyOTgsNyArMTI5MSw3IEBACiAgICAgICAgICAgICAgcERldmljZS0+c2tiID0gZGV2X2FsbG9jX3NrYigoaW50KXBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAgICAgICAgICB9OwogICAgI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKLSAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSBUUlVFKQorICAvLyBpZihwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID09IHRydWUpCiAgICAgICB7CiAJdW5pb24gaXdyZXFfZGF0YSAgd3JxdTsKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZiAod3JxdSkpOwpAQCAtMTMxNCw3ICsxMzA3LDcgQEAKICAgICAgICAgICAgICAgICBwRGV2aWNlLT51QXV0b1JlQ29ubmVjdFRpbWUrKzsKIAkgICAgICAgI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKICAgICAgICAgICAgICAgICAvL25ldHdvcmsgbWFuYWdlciBzdXBwb3J0IG5lZWQgbm90IGRvIFJvYW1pbmcgc2Nhbj8/PwotICAgICAgICAgICAgICAgIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT1UUlVFKQorICAgICAgICAgICAgICAgIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT10cnVlKQogCQkgcERldmljZS0+dUF1dG9SZUNvbm5lY3RUaW1lID0gMDsKIAkgICAgICNlbmRpZgogICAgICAgICAgICAgfQpAQCAtMTM1OCw3ICsxMzUxLDcgQEAKICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLnVJbkFjdGl2ZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfU1RBUlRFRDsKICAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzkxLDIzICsxMzg0LDIzIEBACiB2b2lkCiBCU1N2VXBkYXRlTm9kZVR4Q291bnRlcigKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBCWVRFICAgICAgICBieVRzcjAsCi0gICAgQllURSAgICAgICAgYnlUc3IxLAotICAgIFBCWVRFICAgICAgIHBieUJ1ZmZlciwKLSAgICBVSU5UICAgICAgICB1RklGT0hlYWRlclNpemUKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VHNyMCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VHNyMSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsCisgICAgdW5zaWduZWQgaW50IHVGSUZPSGVhZGVyU2l6ZQogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBVSU5UICAgICAgICAgICAgdU5vZGVJbmRleCA9IDA7Ci0gICAgQllURSAgICAgICAgICAgIGJ5VHhSZXRyeSA9IChieVRzcjAgJiBUU1IwX05DUik7CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlUeFJldHJ5ID0gKGJ5VHNyMCAmIFRTUjBfTkNSKTsKICAgICBQU1R4QnVmSGVhZCAgICAgcFR4QnVmSGVhZDsKICAgICBQUzgwMl8xMUhlYWRlciAgcE1BQ0hlYWRlcjsKLSAgICBXT1JEICAgICAgICAgICAgd1JhdGU7Ci0gICAgV09SRCAgICAgICAgICAgIHdGYWxsQmFja1JhdGUgPSBSQVRFXzFNOwotICAgIEJZVEUgICAgICAgICAgICBieUZhbGxCYWNrOwotICAgIFVJTlQgICAgICAgICAgICBpaTsKLS8vCVVJTlQJCXR4UmV0cnlUZW1wOworICAgIHVuc2lnbmVkIHNob3J0IHdSYXRlOworICAgIHVuc2lnbmVkIHNob3J0IHdGYWxsQmFja1JhdGUgPSBSQVRFXzFNOworICAgIHVuc2lnbmVkIGNoYXIgYnlGYWxsQmFjazsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CisvLwl1bnNpZ25lZCBpbnQgdHhSZXRyeVRlbXA7CiAvL1BMSUNFX0RFQlVHLT4KIAkvL3R4UmV0cnlUZW1wID0gYnlUeFJldHJ5OwogCS8vaWYgKHR4UmV0cnlUZW1wPT0gOCkKQEAgLTE1ODQsMTQgKzE1NzcsMTQgQEAKIHZvaWQKIEJTU3ZDbGVhck5vZGVEQlRhYmxlKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFVJTlQgdVN0YXJ0SW5kZXgKKyAgICB1bnNpZ25lZCBpbnQgdVN0YXJ0SW5kZXgKICAgICApCiAKIHsKICAgICBQU0RldmljZSAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKICAgICBzdHJ1Y3Qgc2tfYnVmZiAgKnNrYjsKLSAgICBVSU5UICAgICAgICAgICAgaWk7CisgICAgdW5zaWduZWQgaW50IGlpOwogCiAgICAgZm9yIChpaSA9IHVTdGFydEluZGV4OyBpaSA8IChNQVhfTk9ERV9OVU0gKyAxKTsgaWkrKykgewogICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVtpaV0uYkFjdGl2ZSkgewpAQCAtMTYyOSw4ICsxNjIyLDggQEAKICAgICAgICAgcEJTU0xpc3QgPSBCU1NwQWRkcklzSW5CU1NMaXN0KHBEZXZpY2UsIHBNZ210LT5hYnlDdXJyQlNTSUQsIChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlDdXJyU1NJRCk7CiAgICAgICAgIGlmIChwQlNTTGlzdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBVcGRhdGEgQkIgUmVnIGlmIFJTU0kgaXMgdG9vIHN0cm9uZy4KLSAgICAgICAgICAgIExPTkcgICAgTG9jYWxsZEJtQXZlcmFnZSA9IDA7Ci0gICAgICAgICAgICBMT05HICAgIHVOdW1vZmRCbSA9IDA7CisgICAgICAgICAgICBsb25nICAgIExvY2FsbGRCbUF2ZXJhZ2UgPSAwOworICAgICAgICAgICAgbG9uZyAgICB1TnVtb2ZkQm0gPSAwOwogICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgUlNTSV9TVEFUX0NPVU5UOyBpaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBCU1NMaXN0LT5sZEJtQXZlcmFnZVtpaV0gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB1TnVtb2ZkQm0gKys7CkBAIC0xNjY2LDEwICsxNjU5LDEwIEBACiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCBpaTsKIAogICAgIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7Ci0gICAgICAgIHBNZ210LT5zQlNTTGlzdFtpaV0uYlNlbGVjdGVkID0gRkFMU0U7CisgICAgICAgIHBNZ210LT5zQlNTTGlzdFtpaV0uYlNlbGVjdGVkID0gZmFsc2U7CiAgICAgfQogICAgIHJldHVybjsKIH0KQEAgLTE2ODAsOSArMTY3Myw5IEBACiAgICAgKQogewogICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7Ci0gICBVTE9ORyBUeE9rUmF0aW8sIFR4Q250OwotICAgVUxPTkcgUnhPa1JhdGlvLFJ4Q250OwotICAgVUxPTkcgUnNzaVJhdGlvOworICAgdW5zaWduZWQgbG9uZyBUeE9rUmF0aW8sIFR4Q250OworICAgdW5zaWduZWQgbG9uZyBSeE9rUmF0aW8sUnhDbnQ7CisgICB1bnNpZ25lZCBsb25nIFJzc2lSYXRpbzsKICAgIGxvbmcgbGRCbTsKIAogVHhDbnQgPSBwRGV2aWNlLT5zY1N0YXRpc3RpYy5UeE5vUmV0cnlPa0NvdW50ICsKQEAgLTE2OTMsNyArMTY4Niw3IEBACiBUeE9rUmF0aW8gPSAoVHhDbnQgPCA2KSA/IDQwMDA6KChwRGV2aWNlLT5zY1N0YXRpc3RpYy5UeE5vUmV0cnlPa0NvdW50ICogNDAwMCkgLyBUeENudCk7CiBSeE9rUmF0aW8gPSAoUnhDbnQgPCA2KSA/IDIwMDA6KChwRGV2aWNlLT5zY1N0YXRpc3RpYy5SeE9rQ250ICogMjAwMCkgLyBSeENudCk7CiAvL2RlY2lkZSBsaW5rIHF1YWxpdHkKLWlmKHBEZXZpY2UtPmJMaW5rUGFzcyAhPVRSVUUpCitpZihwRGV2aWNlLT5iTGlua1Bhc3MgIT10cnVlKQogewogIC8vICBwcmludGsoInNfdUNhbGN1bGF0ZUxpbmtRdWFsLS0+TGluayBkaXNjb25uZWN0IGFuZCBQb29yIHF1YWxpdHkqKlxuIik7CiAgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSA9IDA7CkBAIC0xNzAxLDcgKzE2OTQsNyBAQAogfQogZWxzZQogewotICAgUkZ2UlNTSVRvZEJtKHBEZXZpY2UsIChCWVRFKShwRGV2aWNlLT51Q3VyclJTU0kpLCAmbGRCbSk7CisgICBSRnZSU1NJVG9kQm0ocERldmljZSwgKHVuc2lnbmVkIGNoYXIpKHBEZXZpY2UtPnVDdXJyUlNTSSksICZsZEJtKTsKICAgIGlmKC1sZEJtIDwgNTApICB7CiAgICAJUnNzaVJhdGlvID0gNDAwMDsKICAgICAgfQpAQCAtMTczNSw4ICsxNzI4LDggQEAKICAgICAgICAgKChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkgJiYgKHBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfSk9JTlRFRCkpKSB7CiAgICAgICAgIHBCU1NMaXN0ID0gQlNTcEFkZHJJc0luQlNTTGlzdChwRGV2aWNlLCBwTWdtdC0+YWJ5Q3VyckJTU0lELCAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQpOwogICAgICAgICBpZiAocEJTU0xpc3QgIT0gTlVMTCkgewotICAgICAgICAgICAgcERldmljZS0+YnlCQlByZUVEUlNTSSA9IChCWVRFKSAofihwQlNTTGlzdC0+bGRCbUF2ZXJSYW5nZSkgKyAxKTsKLSAgICAgICAgICAgIC8vQkJ2VXBkYXRlUHJlRURUaHJlc2hvbGQocERldmljZSwgRkFMU0UpOworICAgICAgICAgICAgcERldmljZS0+YnlCQlByZUVEUlNTSSA9ICh1bnNpZ25lZCBjaGFyKSAofihwQlNTTGlzdC0+bGRCbUF2ZXJSYW5nZSkgKyAxKTsKKyAgICAgICAgICAgIC8vQkJ2VXBkYXRlUHJlRURUaHJlc2hvbGQocERldmljZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYnNzZGIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYnNzZGIuaAppbmRleCBlMDllZjg3Li4wYWY0MjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jzc2RiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9ic3NkYi5oCkBAIC05MCw2OSArOTAsNjkgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTRVJQT2JqZWN0IHsKLSAgICBCT09MICAgIGJFUlBFeGlzdDsKLSAgICBCWVRFICAgIGJ5RVJQOworICAgIGJvb2wgYkVSUEV4aXN0OworICAgIHVuc2lnbmVkIGNoYXIgYnlFUlA7CiB9RVJQT2JqZWN0LCAqUEVSUE9iamVjdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlNOQ2FwT2JqZWN0IHsKLSAgICBCT09MICAgIGJSU05DYXBFeGlzdDsKLSAgICBXT1JEICAgIHdSU05DYXA7CisgICAgYm9vbCBiUlNOQ2FwRXhpc3Q7CisgICAgdW5zaWduZWQgc2hvcnQgd1JTTkNhcDsKIH1TUlNOQ2FwT2JqZWN0LCAqUFNSU05DYXBPYmplY3Q7CiAKIC8vIEJTUyBpbmZvKEFQKQogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdLbm93bkJTUyB7CiAgICAgLy8gQlNTIGluZm8KLSAgICBCT09MICAgICAgICAgICAgYkFjdGl2ZTsKLSAgICBCWVRFICAgICAgICAgICAgYWJ5QlNTSURbV0xBTl9CU1NJRF9MRU5dOwotICAgIFVJTlQgICAgICAgICAgICB1Q2hhbm5lbDsKLSAgICBCWVRFICAgICAgICAgICAgYWJ5U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKLSAgICBCWVRFICAgICAgICAgICAgYWJ5RXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKLSAgICBVSU5UICAgICAgICAgICAgdVJTU0k7Ci0gICAgQllURSAgICAgICAgICAgIGJ5U1E7Ci0gICAgV09SRCAgICAgICAgICAgIHdCZWFjb25JbnRlcnZhbDsKLSAgICBXT1JEICAgICAgICAgICAgd0NhcEluZm87Ci0gICAgQllURSAgICAgICAgICAgIGFieVNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07Ci0gICAgQllURSAgICAgICAgICAgIGJ5UnhSYXRlOworICAgIGJvb2wgYkFjdGl2ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUJTU0lEW1dMQU5fQlNTSURfTEVOXTsKKyAgICB1bnNpZ25lZCBpbnQJdUNoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBhYnlTdXBwUmF0ZXNbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1JBVEVTX01BWExFTiArIDFdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5RXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKKyAgICB1bnNpZ25lZCBpbnQJdVJTU0k7CisgICAgdW5zaWduZWQgY2hhciBieVNROworICAgIHVuc2lnbmVkIHNob3J0IHdCZWFjb25JbnRlcnZhbDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q2FwSW5mbzsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgY2hhciBieVJ4UmF0ZTsKIAotLy8gICAgV09SRCAgICAgICAgICAgIHdBVElNV2luZG93OwotICAgIEJZVEUgICAgICAgICAgICBieVJTU0lTdGF0Q250OwotICAgIExPTkcgICAgICAgICAgICBsZEJtTUFYOwotICAgIExPTkcgICAgICAgICAgICBsZEJtQXZlcmFnZVtSU1NJX1NUQVRfQ09VTlRdOwotICAgIExPTkcgICAgICAgICAgICBsZEJtQXZlclJhbmdlOworLy8gICAgdW5zaWduZWQgc2hvcnQgd0FUSU1XaW5kb3c7CisgICAgdW5zaWduZWQgY2hhciBieVJTU0lTdGF0Q250OworICAgIGxvbmcgICAgICAgICAgICBsZEJtTUFYOworICAgIGxvbmcgICAgICAgICAgICBsZEJtQXZlcmFnZVtSU1NJX1NUQVRfQ09VTlRdOworICAgIGxvbmcgICAgICAgICAgICBsZEJtQXZlclJhbmdlOwogICAgIC8vRm9yIGFueSBCU1NJRCBzZWxlY3Rpb24gaW1wcm92bWVudAotICAgIEJPT0wgICAgICAgICAgICBiU2VsZWN0ZWQ7CisgICAgYm9vbCBiU2VsZWN0ZWQ7CiAKICAgICAvLysrIFdQQSBpbmZvcm1hdGlvbnMKLSAgICBCT09MICAgICAgICAgICAgYldQQVZhbGlkOwotICAgIEJZVEUgICAgICAgICAgICBieUdLVHlwZTsKLSAgICBCWVRFICAgICAgICAgICAgYWJ5UEtUeXBlWzRdOwotICAgIFdPUkQgICAgICAgICAgICB3UEtDb3VudDsKLSAgICBCWVRFICAgICAgICAgICAgYWJ5QXV0aFR5cGVbNF07Ci0gICAgV09SRCAgICAgICAgICAgIHdBdXRoQ291bnQ7Ci0gICAgQllURSAgICAgICAgICAgIGJ5RGVmYXVsdEtfYXNfUEs7Ci0gICAgQllURSAgICAgICAgICAgIGJ5UmVwbGF5SWR4OworICAgIGJvb2wgYldQQVZhbGlkOworICAgIHVuc2lnbmVkIGNoYXIgYnlHS1R5cGU7CisgICAgdW5zaWduZWQgY2hhciBhYnlQS1R5cGVbNF07CisgICAgdW5zaWduZWQgc2hvcnQgd1BLQ291bnQ7CisgICAgdW5zaWduZWQgY2hhciBhYnlBdXRoVHlwZVs0XTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3QXV0aENvdW50OworICAgIHVuc2lnbmVkIGNoYXIgYnlEZWZhdWx0S19hc19QSzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UmVwbGF5SWR4OwogICAgIC8vLS0KIAogICAgIC8vKysgV1BBMiBpbmZvcm1hdGlvbnMKLSAgICBCT09MICAgICAgICAgICAgYldQQTJWYWxpZDsKLSAgICBCWVRFICAgICAgICAgICAgYnlDU1NHSzsKLSAgICBXT1JEICAgICAgICAgICAgd0NTU1BLQ291bnQ7Ci0gICAgQllURSAgICAgICAgICAgIGFieUNTU1BLWzRdOwotICAgIFdPUkQgICAgICAgICAgICB3QUtNU1NBdXRoQ291bnQ7Ci0gICAgQllURSAgICAgICAgICAgIGFieUFLTVNTQXV0aFR5cGVbNF07CisgICAgYm9vbCBiV1BBMlZhbGlkOworICAgIHVuc2lnbmVkIGNoYXIgYnlDU1NHSzsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q1NTUEtDb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUNTU1BLWzRdOworICAgIHVuc2lnbmVkIHNob3J0IHdBS01TU0F1dGhDb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFLTVNTQXV0aFR5cGVbNF07CiAKICAgICAvLysrICB3cGFjdGwKLSAgICBCWVRFICAgICAgICAgICAgYnlXUEFJRVtNQVhfV1BBX0lFX0xFTl07Ci0gICAgQllURSAgICAgICAgICAgIGJ5UlNOSUVbTUFYX1dQQV9JRV9MRU5dOwotICAgIFdPUkQgICAgICAgICAgICB3V1BBTGVuOwotICAgIFdPUkQgICAgICAgICAgICB3UlNOTGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnlXUEFJRVtNQVhfV1BBX0lFX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBieVJTTklFW01BWF9XUEFfSUVfTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3V1BBTGVuOworICAgIHVuc2lnbmVkIHNob3J0IHdSU05MZW47CiAKICAgICAvLyBDbGVhciBjb3VudAotICAgIFVJTlQgICAgICAgICAgICB1Q2xlYXJDb3VudDsKLS8vICAgIEJZVEUgICAgICAgICAgICBhYnlJRXNbV0xBTl9CRUFDT05fRlJfTUFYTEVOXTsKLSAgICBVSU5UICAgICAgICAgICAgdUlFTGVuZ3RoOworICAgIHVuc2lnbmVkIGludAl1Q2xlYXJDb3VudDsKKy8vICAgIHVuc2lnbmVkIGNoYXIgYWJ5SUVzW1dMQU5fQkVBQ09OX0ZSX01BWExFTl07CisgICAgdW5zaWduZWQgaW50CXVJRUxlbmd0aDsKICAgICBRV09SRCAgICAgICAgICAgcXdCU1NUaW1lc3RhbXA7CiAgICAgUVdPUkQgICAgICAgICAgIHF3TG9jYWxUU0Y7ICAgICAvLyBsb2NhbCBUU0YgdGltZXIKIApAQCAtMTYxLDcgKzE2MSw3IEBACiAKICAgICBFUlBPYmplY3QgICAgICAgc0VSUDsKICAgICBTUlNOQ2FwT2JqZWN0ICAgc1JTTkNhcE9iajsKLSAgICBCWVRFICAgICAgICAgICAgYWJ5SUVzWzEwMjRdOyAgIC8vIGRvbid0IG1vdmUgdGhpcyBmaWVsZCAhIQorICAgIHVuc2lnbmVkIGNoYXIgYWJ5SUVzWzEwMjRdOyAgIC8vIGRvbid0IG1vdmUgdGhpcyBmaWVsZCAhIQogCiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogS25vd25CU1MgLCAqUEtub3duQlNTOwpAQCAtMTgxLDU5ICsxODEsNTkgQEAKIC8vIFNUQSBub2RlIGluZm8KIHR5cGVkZWYgc3RydWN0IHRhZ0tub3duTm9kZURCIHsKICAgICAvLyBTVEEgaW5mbwotICAgIEJPT0wgICAgICAgICAgICBiQWN0aXZlOwotICAgIEJZVEUgICAgICAgICAgICBhYnlNQUNBZGRyW1dMQU5fQUREUl9MRU5dOwotICAgIEJZVEUgICAgICAgICAgICBhYnlDdXJyU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU5dOwotICAgIEJZVEUgICAgICAgICAgICBhYnlDdXJyRXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU5dOwotICAgIFdPUkQgICAgICAgICAgICB3VHhEYXRhUmF0ZTsKLSAgICBCT09MICAgICAgICAgICAgYlNob3J0UHJlYW1ibGU7Ci0gICAgQk9PTCAgICAgICAgICAgIGJFUlBFeGlzdDsKLSAgICBCT09MICAgICAgICAgICAgYlNob3J0U2xvdFRpbWU7Ci0gICAgVUlOVCAgICAgICAgICAgIHVJbkFjdGl2ZUNvdW50OwotICAgIFdPUkQgICAgICAgICAgICB3TWF4QmFzaWNSYXRlOyAgICAgLy9HZXQgZnJvbSBieVRvcE9GRE1CYXNpY1JhdGUgb3IgYnlUb3BDQ0tCYXNpY1JhdGUgd2hpY2ggZGVwZW5kcyBvbiBwYWNrZXRUeXAuCi0gICAgV09SRCAgICAgICAgICAgIHdNYXhTdXBwUmF0ZTsgICAgICAvL1JlY29yZHMgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIHJhdGUgZ2V0dGluZyBmcm9tIFN1cHBSYXRlcyBJRSBhbmQgRXh0U3VwcFJhdGVzIElFIGluIEJlYWNvbi4KLSAgICBXT1JEICAgICAgICAgICAgd1N1cHBSYXRlOwotICAgIEJZVEUgICAgICAgICAgICBieVRvcE9GRE1CYXNpY1JhdGU7Ly9SZWNvcmRzIHRoZSBoaWdoZXN0IGJhc2ljIHJhdGUgaW4gT0ZETSBtb2RlCi0gICAgQllURSAgICAgICAgICAgIGJ5VG9wQ0NLQmFzaWNSYXRlOyAvL1JlY29yZHMgdGhlIGhpZ2hlc3QgYmFzaWMgcmF0ZSBpbiBDQ0sgbW9kZQorICAgIGJvb2wgYkFjdGl2ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieU1BQ0FkZHJbV0xBTl9BRERSX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VyckV4dFN1cHBSYXRlc1tXTEFOX0lFSERSX0xFTiArIFdMQU5fUkFURVNfTUFYTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHhEYXRhUmF0ZTsKKyAgICBib29sIGJTaG9ydFByZWFtYmxlOworICAgIGJvb2wgYkVSUEV4aXN0OworICAgIGJvb2wgYlNob3J0U2xvdFRpbWU7CisgICAgdW5zaWduZWQgaW50CXVJbkFjdGl2ZUNvdW50OworICAgIHVuc2lnbmVkIHNob3J0IHdNYXhCYXNpY1JhdGU7ICAgICAvL0dldCBmcm9tIGJ5VG9wT0ZETUJhc2ljUmF0ZSBvciBieVRvcENDS0Jhc2ljUmF0ZSB3aGljaCBkZXBlbmRzIG9uIHBhY2tldFR5cC4KKyAgICB1bnNpZ25lZCBzaG9ydCB3TWF4U3VwcFJhdGU7ICAgICAgLy9SZWNvcmRzIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCByYXRlIGdldHRpbmcgZnJvbSBTdXBwUmF0ZXMgSUUgYW5kIEV4dFN1cHBSYXRlcyBJRSBpbiBCZWFjb24uCisgICAgdW5zaWduZWQgc2hvcnQgd1N1cHBSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlUb3BPRkRNQmFzaWNSYXRlOy8vUmVjb3JkcyB0aGUgaGlnaGVzdCBiYXNpYyByYXRlIGluIE9GRE0gbW9kZQorICAgIHVuc2lnbmVkIGNoYXIgYnlUb3BDQ0tCYXNpY1JhdGU7IC8vUmVjb3JkcyB0aGUgaGlnaGVzdCBiYXNpYyByYXRlIGluIENDSyBtb2RlCiAKICAgICAvLyBGb3IgQVAgbW9kZQogICAgIHN0cnVjdCBza19idWZmX2hlYWQgc1R4UFNRdWV1ZTsKLSAgICBXT1JEICAgICAgICAgICAgd0NhcEluZm87Ci0gICAgV09SRCAgICAgICAgICAgIHdMaXN0ZW5JbnRlcnZhbDsKLSAgICBXT1JEICAgICAgICAgICAgd0FJRDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q2FwSW5mbzsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TGlzdGVuSW50ZXJ2YWw7CisgICAgdW5zaWduZWQgc2hvcnQgd0FJRDsKICAgICBOT0RFX1NUQVRFICAgICAgZU5vZGVTdGF0ZTsKLSAgICBCT09MICAgICAgICAgICAgYlBTRW5hYmxlOwotICAgIEJPT0wgICAgICAgICAgICBiUnhQU1BvbGw7Ci0gICAgQllURSAgICAgICAgICAgIGJ5QXV0aFNlcXVlbmNlOwotICAgIFVMT05HICAgICAgICAgICB1bExhc3RSeEppZmZlcjsKLSAgICBCWVRFICAgICAgICAgICAgYnlTdXBwUmF0ZTsKLSAgICBEV09SRCAgICAgICAgICAgZHdGbGFnczsKLSAgICBXT1JEICAgICAgICAgICAgd0VuUXVldWVDbnQ7CisgICAgYm9vbCBiUFNFbmFibGU7CisgICAgYm9vbCBiUnhQU1BvbGw7CisgICAgdW5zaWduZWQgY2hhciBieUF1dGhTZXF1ZW5jZTsKKyAgICB1bnNpZ25lZCBsb25nIHVsTGFzdFJ4SmlmZmVyOworICAgIHVuc2lnbmVkIGNoYXIgYnlTdXBwUmF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIGR3RmxhZ3M7CisgICAgdW5zaWduZWQgc2hvcnQgd0VuUXVldWVDbnQ7CiAKLSAgICBCT09MICAgICAgICAgICAgYk9uRmx5OwotICAgIFVMT05HTE9ORyAgICAgICBLZXlSU0M7Ci0gICAgQllURSAgICAgICAgICAgIGJ5S2V5SW5kZXg7Ci0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5SW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgIGJ5Q2lwaGVyU3VpdGU7Ci0gICAgRFdPUkQgICAgICAgICAgIGR3VFNDNDdfMTY7Ci0gICAgV09SRCAgICAgICAgICAgIHdUU0MxNV8wOwotICAgIFVJTlQgICAgICAgICAgICB1V2VwS2V5TGVuZ3RoOwotICAgIEJZVEUgICAgICAgICAgICBhYnlXZXBLZXlbV0xBTl9XRVBNQVhfS0VZTEVOXTsKKyAgICBib29sIGJPbkZseTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICAgICAgS2V5UlNDOworICAgIHVuc2lnbmVkIGNoYXIgYnlLZXlJbmRleDsKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBieUNpcGhlclN1aXRlOworICAgIHVuc2lnbmVkIGxvbmcgZHdUU0M0N18xNjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VFNDMTVfMDsKKyAgICB1bnNpZ25lZCBpbnQJdVdlcEtleUxlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVdlcEtleVtXTEFOX1dFUE1BWF9LRVlMRU5dOwogICAgIC8vCiAgICAgLy8gQXV0byByYXRlIGZhbGxiYWNrIHZhcnMKLSAgICBCT09MICAgICAgICAgICAgYklzSW5GYWxsYmFjazsKLSAgICBVSU5UICAgICAgICAgICAgdUF2ZXJhZ2VSU1NJOwotICAgIFVJTlQgICAgICAgICAgICB1UmF0ZVJlY292ZXJ5VGltZW91dDsKLSAgICBVSU5UICAgICAgICAgICAgdVJhdGVQb2xsVGltZW91dDsKLSAgICBVSU5UICAgICAgICAgICAgdVR4RmFpbHVyZXM7Ci0gICAgVUlOVCAgICAgICAgICAgIHVUeEF0dGVtcHRzOworICAgIGJvb2wgYklzSW5GYWxsYmFjazsKKyAgICB1bnNpZ25lZCBpbnQJdUF2ZXJhZ2VSU1NJOworICAgIHVuc2lnbmVkIGludAl1UmF0ZVJlY292ZXJ5VGltZW91dDsKKyAgICB1bnNpZ25lZCBpbnQJdVJhdGVQb2xsVGltZW91dDsKKyAgICB1bnNpZ25lZCBpbnQJdVR4RmFpbHVyZXM7CisgICAgdW5zaWduZWQgaW50CXVUeEF0dGVtcHRzOwogCi0gICAgVUlOVCAgICAgICAgICAgIHVUeFJldHJ5OwotICAgIFVJTlQgICAgICAgICAgICB1RmFpbHVyZVJhdGlvOwotICAgIFVJTlQgICAgICAgICAgICB1UmV0cnlSYXRpbzsKLSAgICBVSU5UICAgICAgICAgICAgdVR4T2tbTUFYX1JBVEUrMV07Ci0gICAgVUlOVCAgICAgICAgICAgIHVUeEZhaWxbTUFYX1JBVEUrMV07Ci0gICAgVUlOVCAgICAgICAgICAgIHVUaW1lQ291bnQ7CisgICAgdW5zaWduZWQgaW50CXVUeFJldHJ5OworICAgIHVuc2lnbmVkIGludAl1RmFpbHVyZVJhdGlvOworICAgIHVuc2lnbmVkIGludAl1UmV0cnlSYXRpbzsKKyAgICB1bnNpZ25lZCBpbnQJdVR4T2tbTUFYX1JBVEUrMV07CisgICAgdW5zaWduZWQgaW50CXVUeEZhaWxbTUFYX1JBVEUrMV07CisgICAgdW5zaWduZWQgaW50CXVUaW1lQ291bnQ7CiAKIH0gS25vd25Ob2RlREIsICpQS25vd25Ob2RlREI7CiAKQEAgLTI0NSwzMiArMjQ1LDMyIEBACiBQS25vd25CU1MKIEJTU3BTZWFyY2hCU1NMaXN0KAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFBCWVRFIHBieURlc2lyZUJTU0lELAotICAgIFBCWVRFIHBieURlc2lyZVNTSUQsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5RGVzaXJlQlNTSUQsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5RGVzaXJlU1NJRCwKICAgICBDQVJEX1BIWV9UWVBFIGVQaHlUeXBlCiAgICAgKTsKIAogUEtub3duQlNTCiBCU1NwQWRkcklzSW5CU1NMaXN0KAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFBCWVRFIGFieUJTU0lELAorICAgIHVuc2lnbmVkIGNoYXIgKmFieUJTU0lELAogICAgIFBXTEFOX0lFX1NTSUQgcFNTSUQKICAgICApOwogCiB2b2lkCiBCU1N2Q2xlYXJCU1NMaXN0KAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIEJPT0wgYktlZXBDdXJyQlNTSUQKKyAgICBib29sIGJLZWVwQ3VyckJTU0lECiAgICAgKTsKIAotQk9PTAorYm9vbAogQlNTYkluc2VydFRvQlNTTGlzdCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBQQllURSBhYnlCU1NJREFkZHIsCisgICAgdW5zaWduZWQgY2hhciAqYWJ5QlNTSURBZGRyLAogICAgIFFXT1JEIHF3VGltZXN0YW1wLAotICAgIFdPUkQgd0JlYWNvbkludGVydmFsLAotICAgIFdPUkQgd0NhcEluZm8sCi0gICAgQllURSBieUN1cnJDaGFubmVsLAorICAgIHVuc2lnbmVkIHNob3J0IHdCZWFjb25JbnRlcnZhbCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q2FwSW5mbywKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q3VyckNoYW5uZWwsCiAgICAgUFdMQU5fSUVfU1NJRCBwU1NJRCwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwRXh0U3VwcFJhdGVzLApAQCAtMjc5LDIwICsyNzksMjAgQEAKICAgICBQV0xBTl9JRV9SU05fRVhUIHBSU05XUEEsCiAgICAgUFdMQU5fSUVfQ09VTlRSWSBwSUVfQ291bnRyeSwKICAgICBQV0xBTl9JRV9RVUlFVCBwSUVfUXVpZXQsCi0gICAgVUlOVCB1SUVMZW5ndGgsCi0gICAgUEJZVEUgcGJ5SUVzLAorICAgIHVuc2lnbmVkIGludCB1SUVMZW5ndGgsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5SUVzLAogICAgIHZvaWQgKnBSeFBhY2tldENvbnRleHQKICAgICApOwogCiAKLUJPT0wKK2Jvb2wKIEJTU2JVcGRhdGVUb0JTU0xpc3QoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCiAgICAgUVdPUkQgcXdUaW1lc3RhbXAsCi0gICAgV09SRCB3QmVhY29uSW50ZXJ2YWwsCi0gICAgV09SRCB3Q2FwSW5mbywKLSAgICBCWVRFIGJ5Q3VyckNoYW5uZWwsCi0gICAgQk9PTCBiQ2hhbm5lbEhpdCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3QmVhY29uSW50ZXJ2YWwsCisgICAgdW5zaWduZWQgc2hvcnQgd0NhcEluZm8sCisgICAgdW5zaWduZWQgY2hhciBieUN1cnJDaGFubmVsLAorICAgIGJvb2wgYkNoYW5uZWxIaXQsCiAgICAgUFdMQU5fSUVfU1NJRCBwU1NJRCwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwRXh0U3VwcFJhdGVzLApAQCAtMzAyLDI5ICszMDIsMjMgQEAKICAgICBQV0xBTl9JRV9DT1VOVFJZIHBJRV9Db3VudHJ5LAogICAgIFBXTEFOX0lFX1FVSUVUIHBJRV9RdWlldCwKICAgICBQS25vd25CU1MgcEJTU0xpc3QsCi0gICAgVUlOVCB1SUVMZW5ndGgsCi0gICAgUEJZVEUgcGJ5SUVzLAorICAgIHVuc2lnbmVkIGludCB1SUVMZW5ndGgsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5SUVzLAogICAgIHZvaWQgKnBSeFBhY2tldENvbnRleHQKICAgICApOwogCiAKLUJPT0wKLUJTU0RCYklzU1RBSW5Ob2RlREIoCi0gICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgUEJZVEUgYWJ5RHN0QWRkciwKLSAgICBQVUlOVCBwdU5vZGVJbmRleAotICAgICk7Citib29sCitCU1NEQmJJc1NUQUluTm9kZURCKHZvaWQgKmhEZXZpY2VDb250ZXh0LCB1bnNpZ25lZCBjaGFyICphYnlEc3RBZGRyLAorCQl1bnNpZ25lZCBpbnQgKnB1Tm9kZUluZGV4KTsKIAogdm9pZAotQlNTdkNyZWF0ZU9uZU5vZGUoCi0gICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgUFVJTlQgcHVOb2RlSW5kZXgKLSAgICApOworQlNTdkNyZWF0ZU9uZU5vZGUodm9pZCAqaERldmljZUNvbnRleHQsIHVuc2lnbmVkIGludCAqcHVOb2RlSW5kZXgpOwogCiB2b2lkCiBCU1N2VXBkYXRlQVBOb2RlKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFBXT1JEIHB3Q2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdDYXBJbmZvLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEl0ZW1SYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBFeHRTdXBwUmF0ZXMKICAgICApOwpAQCAtMzM5LDE2ICszMzMsMTYgQEAKIHZvaWQKIEJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIEJZVEUgICAgICAgIGJ5VHNyMCwKLSAgICBCWVRFICAgICAgICBieVRzcjEsCi0gICAgUEJZVEUgICAgICAgcGJ5QnVmZmVyLAotICAgIFVJTlQgICAgICAgIHVGSUZPSGVhZGVyU2l6ZQorICAgIHVuc2lnbmVkIGNoYXIgYnlUc3IwLAorICAgIHVuc2lnbmVkIGNoYXIgYnlUc3IxLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlciwKKyAgICB1bnNpZ25lZCBpbnQgdUZJRk9IZWFkZXJTaXplCiAgICAgKTsKIAogdm9pZAogQlNTdlJlbW92ZU9uZU5vZGUoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgVUlOVCB1Tm9kZUluZGV4CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXgKICAgICApOwogCiB2b2lkCkBAIC0zNjAsNyArMzU0LDcgQEAKIHZvaWQKIEJTU3ZDbGVhck5vZGVEQlRhYmxlKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAotICAgIFVJTlQgdVN0YXJ0SW5kZXgKKyAgICB1bnNpZ25lZCBpbnQgdVN0YXJ0SW5kZXgKICAgICApOwogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCmluZGV4IDdiYzJkNzYuLjMyZDA5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAia2V5LmgiCiAjaW5jbHVkZSAicmM0LmgiCiAjaW5jbHVkZSAiY291bnRyeS5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNzYsNDExICs3NywzOSBAQAogCiAjZGVmaW5lIENfQ1dNQVggICAgICAgICAxMDIzICAgIC8vIHNsb3QgdGltZQogCi0jZGVmaW5lIENBUkRfTUFYX0NIQU5ORUxfVEJMICAgIDU2Ci0KICNkZWZpbmUgV0FJVF9CRUFDT05fVFhfRE9XTl9UTU8gICAgICAgICAzICAgIC8vIFRpbWVzCiAKLXR5cGVkZWYgc3RydWN0IHRhZ1NDaGFubmVsVGJsRWxlbWVudCB7Ci0gICAgQllURSAgICBieUNoYW5uZWxOdW1iZXI7Ci0gICAgVUlOVCAgICB1RnJlcXVlbmN5OwotICAgIEJPT0wgICAgYlZhbGlkOwotICAgIEJZVEUgICAgYnlNQVA7Ci19U0NoYW5uZWxUYmxFbGVtZW50LCAqUFNDaGFubmVsVGJsRWxlbWVudDsKLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzFNLCAgIDJNLCAgIDVNLCAgMTFNLCAgMThNLCAgMjRNLCAgMzZNLCAgNTRNCi1zdGF0aWMgQllURSBhYnlEZWZhdWx0U3VwcFJhdGVzR1tdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDgsIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NkN9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWJ5RGVmYXVsdFN1cHBSYXRlc0dbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LCAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDI0LCAweDMwLCAweDQ4LCAweDZDfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy82TSwgICA5TSwgIDEyTSwgIDQ4TQotc3RhdGljIEJZVEUgYWJ5RGVmYXVsdEV4dFN1cHBSYXRlc0dbXSA9IHtXTEFOX0VJRF9FWFRTVVBQX1JBVEVTLCA0LCAweDBDLCAweDEyLCAweDE4LCAweDYwfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFieURlZmF1bHRFeHRTdXBwUmF0ZXNHW10gPSB7V0xBTl9FSURfRVhUU1VQUF9SQVRFUywgNCwgMHgwQywgMHgxMiwgMHgxOCwgMHg2MH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vNk0sICAgOU0sICAxMk0sICAxOE0sICAyNE0sICAzNk0sICA0OE0sICA1NE0KLXN0YXRpYyBCWVRFIGFieURlZmF1bHRTdXBwUmF0ZXNBW10gPSB7V0xBTl9FSURfU1VQUF9SQVRFUywgOCwgMHgwQywgMHgxMiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwgMHg2Q307CitzdGF0aWMgdW5zaWduZWQgY2hhciBhYnlEZWZhdWx0U3VwcFJhdGVzQVtdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDgsIDB4MEMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkN9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzFNLCAgIDJNLCAgIDVNLCAgMTFNLAotc3RhdGljIEJZVEUgYWJ5RGVmYXVsdFN1cHBSYXRlc0JbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA0LCAweDAyLCAweDA0LCAweDBCLCAweDE2fTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFieURlZmF1bHRTdXBwUmF0ZXNCW10gPSB7V0xBTl9FSURfU1VQUF9SQVRFUywgNCwgMHgwMiwgMHgwNCwgMHgwQiwgMHgxNn07CiAKIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKLWNvbnN0IFdPUkQgY3dSWEJDTlRTRk9mZltNQVhfUkFURV0gPQorY29uc3QgdW5zaWduZWQgc2hvcnQgY3dSWEJDTlRTRk9mZltNQVhfUkFURV0gPQogezE3LCAxNywgMTcsIDE3LCAzNCwgMjMsIDE3LCAxMSwgOCwgNSwgNCwgM307CiAKLXN0YXRpYyBTQ2hhbm5lbFRibEVsZW1lbnQgc0NoYW5uZWxUYmxbQ0FSRF9NQVhfQ0hBTk5FTF9UQkwrMV0gPQotewotICB7MCwgICAwLCAgICBGQUxTRSwgICAgMH0sCi0gIHsxLCAgIDI0MTIsIFRSVUUsICAgICAwfSwKLSAgezIsICAgMjQxNywgVFJVRSwgICAgIDB9LAotICB7MywgICAyNDIyLCBUUlVFLCAgICAgMH0sCi0gIHs0LCAgIDI0MjcsIFRSVUUsICAgICAwfSwKLSAgezUsICAgMjQzMiwgVFJVRSwgICAgIDB9LAotICB7NiwgICAyNDM3LCBUUlVFLCAgICAgMH0sCi0gIHs3LCAgIDI0NDIsIFRSVUUsICAgICAwfSwKLSAgezgsICAgMjQ0NywgVFJVRSwgICAgIDB9LAotICB7OSwgICAyNDUyLCBUUlVFLCAgICAgMH0sCi0gIHsxMCwgIDI0NTcsIFRSVUUsICAgICAwfSwKLSAgezExLCAgMjQ2MiwgVFJVRSwgICAgIDB9LAotICB7MTIsICAyNDY3LCBUUlVFLCAgICAgMH0sCi0gIHsxMywgIDI0NzIsIFRSVUUsICAgICAwfSwKLSAgezE0LCAgMjQ4NCwgVFJVRSwgICAgIDB9LAotICB7MTgzLCA0OTE1LCBUUlVFLCAgICAgMH0sCi0gIHsxODQsIDQ5MjAsIFRSVUUsICAgICAwfSwKLSAgezE4NSwgNDkyNSwgVFJVRSwgICAgIDB9LAotICB7MTg3LCA0OTM1LCBUUlVFLCAgICAgMH0sCi0gIHsxODgsIDQ5NDAsIFRSVUUsICAgICAwfSwKLSAgezE4OSwgNDk0NSwgVFJVRSwgICAgIDB9LAotICB7MTkyLCA0OTYwLCBUUlVFLCAgICAgMH0sCi0gIHsxOTYsIDQ5ODAsIFRSVUUsICAgICAwfSwKLSAgezcsICAgNTAzNSwgVFJVRSwgICAgIDB9LAotICB7OCwgICA1MDQwLCBUUlVFLCAgICAgMH0sCi0gIHs5LCAgIDUwNDUsIFRSVUUsICAgICAwfSwKLSAgezExLCAgNTA1NSwgVFJVRSwgICAgIDB9LAotICB7MTIsICA1MDYwLCBUUlVFLCAgICAgMH0sCi0gIHsxNiwgIDUwODAsIFRSVUUsICAgICAwfSwKLSAgezM0LCAgNTE3MCwgVFJVRSwgICAgIDB9LAotICB7MzYsICA1MTgwLCBUUlVFLCAgICAgMH0sCi0gIHszOCwgIDUxOTAsIFRSVUUsICAgICAwfSwKLSAgezQwLCAgNTIwMCwgVFJVRSwgICAgIDB9LAotICB7NDIsICA1MjEwLCBUUlVFLCAgICAgMH0sCi0gIHs0NCwgIDUyMjAsIFRSVUUsICAgICAwfSwKLSAgezQ2LCAgNTIzMCwgVFJVRSwgICAgIDB9LAotICB7NDgsICA1MjQwLCBUUlVFLCAgICAgMH0sCi0gIHs1MiwgIDUyNjAsIFRSVUUsICAgICAwfSwKLSAgezU2LCAgNTI4MCwgVFJVRSwgICAgIDB9LAotICB7NjAsICA1MzAwLCBUUlVFLCAgICAgMH0sCi0gIHs2NCwgIDUzMjAsIFRSVUUsICAgICAwfSwKLSAgezEwMCwgNTUwMCwgVFJVRSwgICAgIDB9LAotICB7MTA0LCA1NTIwLCBUUlVFLCAgICAgMH0sCi0gIHsxMDgsIDU1NDAsIFRSVUUsICAgICAwfSwKLSAgezExMiwgNTU2MCwgVFJVRSwgICAgIDB9LAotICB7MTE2LCA1NTgwLCBUUlVFLCAgICAgMH0sCi0gIHsxMjAsIDU2MDAsIFRSVUUsICAgICAwfSwKLSAgezEyNCwgNTYyMCwgVFJVRSwgICAgIDB9LAotICB7MTI4LCA1NjQwLCBUUlVFLCAgICAgMH0sCi0gIHsxMzIsIDU2NjAsIFRSVUUsICAgICAwfSwKLSAgezEzNiwgNTY4MCwgVFJVRSwgICAgIDB9LAotICB7MTQwLCA1NzAwLCBUUlVFLCAgICAgMH0sCi0gIHsxNDksIDU3NDUsIFRSVUUsICAgICAwfSwKLSAgezE1MywgNTc2NSwgVFJVRSwgICAgIDB9LAotICB7MTU3LCA1Nzg1LCBUUlVFLCAgICAgMH0sCi0gIHsxNjEsIDU4MDUsIFRSVUUsICAgICAwfSwKLSAgezE2NSwgNTgyNSwgVFJVRSwgICAgIDB9Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoZSBSYWRhciByZWd1bGF0aW9uIHJ1bGVzIGZvciBlYWNoIGNvdW50cnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TQ291bnRyeVRhYmxlIENoYW5uZWxSdWxlVGFiW0NDT0RFX01BWCsxXSA9Ci17Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIHRhYmxlIGlzIGJhc2VkIG9uIEF0aGVybyBkcml2ZXIgcnVsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDb3VudHJ5ICAgICAgICAgIEF2YWlsYWJsZSBjaGFubmVscywgZW5kZWQgd2l0aCAwICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1ICAxNiAgMTcgIDE4ICAxOSAgMjAgIDIxICAyMiAgMjMgIDI0ICAyNSAgMjYgIDI3ICAyOCAgMjkgIDMwICAzMSAgMzIgIDMzICAzNCAgMzUgIDM2ICAzNyAgMzggIDM5ICA0MCAgNDEgIDQyICA0MyAgNDQgIDQ1ICA0NiAgNDcgIDQ4ICA0OSAgNTAgIDUxICA1MiAgNTMgIDU0ICA1NSAgNTYgICovCi17Q0NPREVfRkNDLCAgICAgICAgICAgICAgICAgICAgIHsnVScsJ1MnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKLXtDQ09ERV9URUxFQywgICAgICAgICAgICAgICAgICAgeydKJywnUCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAyMywgIDAsICAwLCAyMywgIDAsIDIzLCAyMywgIDAsIDIzLCAgMCwgIDAsIDIzLCAyMywgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0VUU0ksICAgICAgICAgICAgICAgICAgICB7J0UnLCdVJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfUkVTVjMsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9SRVNWNCwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1JFU1Y1LCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfUkVTVjYsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9SRVNWNywgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1JFU1Y4LCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfUkVTVjksICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9SRVNWYSwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1JFU1ZiLCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfUkVTVmMsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9SRVNWZCwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1JFU1ZlLCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfQUxMQkFORCwgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9BTEJBTklBLCAgICAgICAgICAgICAgICAgeydBJywnTCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0FMR0VSSUEsICAgICAgICAgICAgICAgICB7J0QnLCdaJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfQVJHRU5USU5BLCAgICAgICAgICAgICAgIHsnQScsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAxNywgMTcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsICAwfSAgfSwKLXtDQ09ERV9BUk1FTklBLCAgICAgICAgICAgICAgICAgeydBJywnTSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAxOCwgMTgsIDE4LCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0FVU1RSQUxJQSwgICAgICAgICAgICAgICB7J0EnLCdVJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfQVVTVFJJQSwgICAgICAgICAgICAgICAgIHsnQScsJ1QnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNSwgIDAsIDE1LCAgMCwgMTUsICAwLCAxNSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9BWkVSQkFJSkFOLCAgICAgICAgICAgICAgeydBJywnWid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAxOCwgMTgsIDE4LCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0JBSFJBSU4sICAgICAgICAgICAgICAgICB7J0InLCdIJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfQkVMQVJVUywgICAgICAgICAgICAgICAgIHsnQicsJ1knfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9CRUxHSVVNLCAgICAgICAgICAgICAgICAgeydCJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0JFTElaRSwgICAgICAgICAgICAgICAgICB7J0InLCdaJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfQk9MSVZJQSwgICAgICAgICAgICAgICAgIHsnQicsJ08nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKLXtDQ09ERV9CUkFaSUwsICAgICAgICAgICAgICAgICAgeydCJywnUid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0JSVU5FSV9EQVJVU1NBTEFNLCAgICAgICB7J0InLCdOJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfQlVMR0FSSUEsICAgICAgICAgICAgICAgIHsnQicsJ0cnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgMjMsIDIzLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9DQU5BREEsICAgICAgICAgICAgICAgICAgeydDJywnQSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX0NISUxFLCAgICAgICAgICAgICAgICAgICB7J0MnLCdMJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAxNywgMTcsIDE3LCAxN30gIH0sCi17Q0NPREVfQ0hJTkEsICAgICAgICAgICAgICAgICAgIHsnQycsJ04nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKLXtDQ09ERV9DT0xPTUJJQSwgICAgICAgICAgICAgICAgeydDJywnTyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX0NPU1RBX1JJQ0EsICAgICAgICAgICAgICB7J0MnLCdSJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfQ1JPQVRJQSwgICAgICAgICAgICAgICAgIHsnSCcsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9DWVBSVVMsICAgICAgICAgICAgICAgICAgeydDJywnWSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0NaRUNILCAgICAgICAgICAgICAgICAgICB7J0MnLCdaJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfREVOTUFSSywgICAgICAgICAgICAgICAgIHsnRCcsJ0snfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9ET01JTklDQU5fUkVQVUJMSUMsICAgICAgeydEJywnTyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX0VDVUFET1IsICAgICAgICAgICAgICAgICB7J0UnLCdDJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfRUdZUFQsICAgICAgICAgICAgICAgICAgIHsnRScsJ0cnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9FTF9TQUxWQURPUiwgICAgICAgICAgICAgeydTJywnVid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0VTVE9OSUEsICAgICAgICAgICAgICAgICB7J0UnLCdFJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfRklOTEFORCwgICAgICAgICAgICAgICAgIHsnRicsJ0knfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9GUkFOQ0UsICAgICAgICAgICAgICAgICAgeydGJywnUid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0dFUk1BTlksICAgICAgICAgICAgICAgICB7J0QnLCdFJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfR1JFRUNFLCAgICAgICAgICAgICAgICAgIHsnRycsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9HRU9SR0lBLCAgICAgICAgICAgICAgICAgeydHJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAxOCwgMTgsIDE4LCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0dVQVRFTUFMQSwgICAgICAgICAgICAgICB7J0cnLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfSE9ORFVSQVMsICAgICAgICAgICAgICAgIHsnSCcsJ04nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9IT05HX0tPTkcsICAgICAgICAgICAgICAgeydIJywnSyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX0hVTkdBUlksICAgICAgICAgICAgICAgICB7J0gnLCdVJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfSUNFTEFORCwgICAgICAgICAgICAgICAgIHsnSScsJ1MnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9JTkRJQSwgICAgICAgICAgICAgICAgICAgeydJJywnTid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0lORE9ORVNJQSwgICAgICAgICAgICAgICB7J0knLCdEJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfSVJBTiwgICAgICAgICAgICAgICAgICAgIHsnSScsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKLXtDQ09ERV9JUkVMQU5ELCAgICAgICAgICAgICAgICAgeydJJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0lUQUxZLCAgICAgICAgICAgICAgICAgICB7J0knLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfSVNSQUVMLCAgICAgICAgICAgICAgICAgIHsnSScsJ0wnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9KQVBBTiwgICAgICAgICAgICAgICAgICAgeydKJywnUCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0pPUkRBTiwgICAgICAgICAgICAgICAgICB7J0onLCdPJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfS0FaQUtIU1RBTiwgICAgICAgICAgICAgIHsnSycsJ1onfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9LVVdBSVQsICAgICAgICAgICAgICAgICAgeydLJywnVyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0xBVFZJQSwgICAgICAgICAgICAgICAgICB7J0wnLCdWJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfTEVCQU5PTiwgICAgICAgICAgICAgICAgIHsnTCcsJ0InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9MRUlDSFRFTlNURUlOLCAgICAgICAgICAgeydMJywnSSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX0xJVEhVQU5JQSwgICAgICAgICAgICAgICB7J0wnLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfTFVYRU1CVVJHLCAgICAgICAgICAgICAgIHsnTCcsJ1UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9NQUNBVSwgICAgICAgICAgICAgICAgICAgeydNJywnTyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX01BQ0VET05JQSwgICAgICAgICAgICAgICB7J00nLCdLJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfTUFMVEEsICAgICAgICAgICAgICAgICAgIHsnTScsJ1QnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNiwgIDAsIDE2LCAgMCwgMTYsICAwLCAxNiwgMTYsIDE2LCAxNiwgMTYsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTYsIDE2LCAxNiwgMTYsICAwfSAgfSwKLXtDQ09ERV9NQUxBWVNJQSwgICAgICAgICAgICAgICAgeydNJywnWSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX01FWElDTywgICAgICAgICAgICAgICAgICB7J00nLCdYJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfTU9OQUNPLCAgICAgICAgICAgICAgICAgIHsnTScsJ0MnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgMTgsIDE4LCAxOCwgMTgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9NT1JPQ0NPLCAgICAgICAgICAgICAgICAgeydNJywnQSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX05FVEhFUkxBTkRTLCAgICAgICAgICAgICB7J04nLCdMJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfTkVXX1pFQUxBTkQsICAgICAgICAgICAgIHsnTicsJ1onfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKLXtDQ09ERV9OT1JUSF9LT1JFQSwgICAgICAgICAgICAgeydLJywnUCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgMjMsIDIzLCAyMywgIDB9ICB9LAote0NDT0RFX05PUldBWSwgICAgICAgICAgICAgICAgICB7J04nLCdPJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfT01BTiwgICAgICAgICAgICAgICAgICAgIHsnTycsJ00nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9QQUtJU1RBTiwgICAgICAgICAgICAgICAgeydQJywnSyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1BBTkFNQSwgICAgICAgICAgICAgICAgICB7J1AnLCdBJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfUEVSVSwgICAgICAgICAgICAgICAgICAgIHsnUCcsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9QSElMSVBQSU5FUywgICAgICAgICAgICAgeydQJywnSCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX1BPTEFORCwgICAgICAgICAgICAgICAgICB7J1AnLCdMJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfUE9SVFVHQUwsICAgICAgICAgICAgICAgIHsnUCcsJ1QnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9QVUVSVE9fUklDTywgICAgICAgICAgICAgeydQJywnUid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAote0NDT0RFX1FBVEFSLCAgICAgICAgICAgICAgICAgICB7J1EnLCdBJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfUk9NQU5JQSwgICAgICAgICAgICAgICAgIHsnUicsJ08nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9SVVNTSUEsICAgICAgICAgICAgICAgICAgeydSJywnVSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1NBVURJX0FSQUJJQSwgICAgICAgICAgICB7J1MnLCdBJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfU0lOR0FQT1JFLCAgICAgICAgICAgICAgIHsnUycsJ0cnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwfSAgfSwKLXtDQ09ERV9TTE9WQUtJQSwgICAgICAgICAgICAgICAgeydTJywnSyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE2LCAgMCwgMTYsICAwLCAxNiwgIDAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNiwgMTYsIDE2LCAxNiwgIDB9ICB9LAote0NDT0RFX1NMT1ZFTklBLCAgICAgICAgICAgICAgICB7J1MnLCdJJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfU09VVEhfQUZSSUNBLCAgICAgICAgICAgIHsnWicsJ0EnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9TT1VUSF9LT1JFQSwgICAgICAgICAgICAgeydLJywnUid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgMjMsIDIzLCAyMywgIDB9ICB9LAote0NDT0RFX1NQQUlOLCAgICAgICAgICAgICAgICAgICB7J0UnLCdTJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTYsICAwLCAxNiwgIDAsIDE2LCAgMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE2LCAxNiwgMTYsIDE2LCAgMH0gIH0sCi17Q0NPREVfU1dFREVOLCAgICAgICAgICAgICAgICAgIHsnUycsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9TV0lUWkVSTEFORCwgICAgICAgICAgICAgeydDJywnSCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1NZUklBLCAgICAgICAgICAgICAgICAgICB7J1MnLCdZJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfVEFJV0FOLCAgICAgICAgICAgICAgICAgIHsnVCcsJ1cnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAxNywgMTcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsICAwfSAgfSwKLXtDQ09ERV9USEFJTEFORCwgICAgICAgICAgICAgICAgeydUJywnSCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgMjMsIDIzLCAyMywgIDB9ICB9LAote0NDT0RFX1RSSU5JREFEX1RPQkFHTywgICAgICAgICB7J1QnLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfVFVOSVNJQSwgICAgICAgICAgICAgICAgIHsnVCcsJ04nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9UVVJLRVksICAgICAgICAgICAgICAgICAgeydUJywnUid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1VLLCAgICAgICAgICAgICAgICAgICAgICB7J0cnLCdCJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfVUtSQUlORSwgICAgICAgICAgICAgICAgIHsnVScsJ0EnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9VTklURURfQVJBQl9FTUlSQVRFUywgICAgeydBJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1VOSVRFRF9TVEFURVMsICAgICAgICAgICB7J1UnLCdTJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCi17Q0NPREVfVVJVR1VBWSwgICAgICAgICAgICAgICAgIHsnVScsJ1knfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsIDIzLCAyMywgMjMsICAwfSAgfSwKLXtDQ09ERV9VWkJFS0lTVEFOLCAgICAgICAgICAgICAgeydVJywnWid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1ZFTkVaVUVMQSwgICAgICAgICAgICAgICB7J1YnLCdFJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIzLCAyMywgMjMsIDIzLCAgMH0gIH0sCi17Q0NPREVfVklFVE5BTSwgICAgICAgICAgICAgICAgIHsnVicsJ04nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9ZRU1FTiwgICAgICAgICAgICAgICAgICAgeydZJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAote0NDT0RFX1pJTUJBQldFLCAgICAgICAgICAgICAgICB7J1onLCdXJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCi17Q0NPREVfSkFQQU5fVzUyX1c1MywgICAgICAgICAgIHsnSicsJ0onfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKLXtDQ09ERV9NQVgsICAgICAgICAgICAgICAgICAgICAgeydVJywnTid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9Ci0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUgIDE2ICAxNyAgMTggIDE5ICAyMCAgMjEgIDIyICAyMyAgMjQgIDI1ICAyNiAgMjcgIDI4ICAyOSAgMzAgIDMxICAzMiAgMzMgIDM0ICAzNSAgMzYgIDM3ICAzOCAgMzkgIDQwICA0MSAgNDIgIDQzICA0NCAgNDUgIDQ2ICA0NyAgNDggIDQ5ICA1MCAgNTEgIDUyICA1MyAgNTQgIDU1ICA1NiAgKi8KLX07Ci0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljCiB2b2lkCiBzX3ZDYWN1bGF0ZU9GRE1SUGFyYW1ldGVyKAotICAgIEJZVEUgYnlSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlSYXRlLAogICAgIENBUkRfUEhZX1RZUEUgZVBIWVR5cGUsCi0gICAgUEJZVEUgcGJ5VHhSYXRlLAotICAgIFBCWVRFIHBieVJzdlRpbWUKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlUeFJhdGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5UnN2VGltZQogICAgICk7CiAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IGZ1bmN0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvdW50cnkgQ2hhbm5lbCBWYWxpZAotICogIElucHV0OiAgQ291bnRyeUNvZGUsIENoYW5uZWxOdW0KLSAqICAgICAgICAgIENoYW5uZUluZGV4IGlzIGRlZmluZWQgYXMgVlQzMjUzIE1BQyBjaGFubmVsOgotICogICAgICAgICAgICAgIDEgICA9IDIuNEcgY2hhbm5lbCAxCi0gKiAgICAgICAgICAgICAgMiAgID0gMi40RyBjaGFubmVsIDIKLSAqICAgICAgICAgICAgICAuLi4KLSAqICAgICAgICAgICAgICAxNCAgPSAyLjRHIGNoYW5uZWwgMTQKLSAqICAgICAgICAgICAgICAxNSAgPSA0LjlHIGNoYW5uZWwgMTgzCi0gKiAgICAgICAgICAgICAgMTYgID0gNC45RyBjaGFubmVsIDE4NAotICogICAgICAgICAgICAgIC4uLi4uCi0gKiAgT3V0cHV0OiBUUlVFIGlmIHRoZSBzcGVjaWZpZWQgNUdIeiBiYW5kIGlzIGFsbG93ZWQgdG8gYmUgdXNlZC4KLSAgICAgICAgICAgIEZhbHNlIG90aGVyd2lzZS4KLS8vIDQuOUcgPT4gQ2ggMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYgKFZhbHVlOjE1IH4gMjIpCi0KLS8vIDVHID0+IENoIDcsIDgsIDksIDExLCAxMiwgMTYsIDM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTIsIDU2LCA2MCwgNjQsCi0vLyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgKFZhbHVlIDIzIH4gNTYpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8yMDA4LTgtNCA8YWRkPiBieSBjaGVzdGVyCi1CT09MCi1DaGFubmVsVmFsaWQoVUlOVCBDb3VudHJ5Q29kZSwgVUlOVCBDaGFubmVsSW5kZXgpCi17Ci0gICAgQk9PTCAgICBiVmFsaWQ7Ci0KLSAgICBiVmFsaWQgPSBGQUxTRTsKLSAgICAvKgotICAgICAqIElmIENoYW5uZWwgSW5kZXggaXMgaW52YWxpZCwgcmV0dXJuIGludmFsaWQKLSAgICAgKi8KLSAgICBpZiAoKENoYW5uZWxJbmRleCA+IENCX01BWF9DSEFOTkVMKSB8fAotICAgICAgICAoQ2hhbm5lbEluZGV4ID09IDApKQotICAgIHsKLSAgICAgICAgYlZhbGlkID0gRkFMU0U7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0KLSAgICBiVmFsaWQgPSBzQ2hhbm5lbFRibFtDaGFubmVsSW5kZXhdLmJWYWxpZDsKLQotZXhpdDoKLSAgICByZXR1cm4gKGJWYWxpZCk7Ci0KLX0gLyogZW5kIENoYW5uZWxWYWxpZCAqLwotCi0KIC8qCiAgKiBEZXNjcmlwdGlvbjogQ2FjdWxhdGUgVHhSYXRlIGFuZCBSc3ZUaW1lIGZpZWxkcyBmb3IgUlNQSU5GIGluIE9GRE0gbW9kZS4KICAqCkBAIC00OTgsMTAgKzEyNywxMCBAQAogc3RhdGljCiB2b2lkCiBzX3ZDYWN1bGF0ZU9GRE1SUGFyYW1ldGVyICgKLSAgICBCWVRFIGJ5UmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UmF0ZSwKICAgICBDQVJEX1BIWV9UWVBFIGVQSFlUeXBlLAotICAgIFBCWVRFIHBieVR4UmF0ZSwKLSAgICBQQllURSBwYnlSc3ZUaW1lCisgICAgdW5zaWduZWQgY2hhciAqcGJ5VHhSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieVJzdlRpbWUKICAgICApCiB7CiAgICAgc3dpdGNoIChieVJhdGUpIHsKQEAgLTYxNCw5ICsyNDMsOSBAQAogdm9pZAogc192U2V0UlNQSU5GIChQU0RldmljZSBwRGV2aWNlLCBDQVJEX1BIWV9UWVBFIGVQSFlUeXBlLCB2b2lkICpwdlN1cHBvcnRSYXRlSUVzLCB2b2lkICpwdkV4dFN1cHBvcnRSYXRlSUVzKQogewotICAgIEJZVEUgIGJ5U2VydiA9IDAsIGJ5U2lnbmFsID0gMDsgLy8gRm9yIENDSwotICAgIFdPUkQgIHdMZW4gPSAwOwotICAgIEJZVEUgIGJ5VHhSYXRlID0gMCwgYnlSc3ZUaW1lID0gMDsgICAgLy8gRm9yIE9GRE0KKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydiA9IDAsIGJ5U2lnbmFsID0gMDsgLy8gRm9yIENDSworICAgIHVuc2lnbmVkIHNob3J0IHdMZW4gPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlUeFJhdGUgPSAwLCBieVJzdlRpbWUgPSAwOyAgICAvLyBGb3IgT0ZETQogCiAgICAgLy9TZXQgdG8gUGFnZTEKICAgICBNQUN2U2VsZWN0UGFnZTEocERldmljZS0+UG9ydE9mZnNldCk7CkBAIC03MjIsMTIwICszNTEsNyBAQAogICAgIE1BQ3ZTZWxlY3RQYWdlMChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKIH0KIAotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUJZVEUgQ0FSRGJ5R2V0Q2hhbm5lbE1hcHBpbmcgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBCWVRFIGJ5Q2hhbm5lbE51bWJlciwgQ0FSRF9QSFlfVFlQRSBlUGh5VHlwZSkKLXsKLSAgICBVSU5UICAgICAgICBpaTsKLQotICAgIGlmICgoZVBoeVR5cGUgPT0gUEhZX1RZUEVfMTFCKSB8fCAoZVBoeVR5cGUgPT0gUEhZX1RZUEVfMTFHKSkgewotICAgICAgICByZXR1cm4gKGJ5Q2hhbm5lbE51bWJlcik7Ci0gICAgfQotCi0gICAgZm9yKGlpID0gKENCX01BWF9DSEFOTkVMXzI0RyArIDEpOyBpaSA8PSBDQl9NQVhfQ0hBTk5FTDsgKSB7Ci0gICAgICAgIGlmIChzQ2hhbm5lbFRibFtpaV0uYnlDaGFubmVsTnVtYmVyID09IGJ5Q2hhbm5lbE51bWJlcikgewotICAgICAgICAgICAgcmV0dXJuICgoQllURSkgaWkpOwotICAgICAgICB9Ci0gICAgICAgIGlpKys7Ci0gICAgfQotICAgIHJldHVybiAoMCk7Ci19Ci0KLQotQllURSBDQVJEYnlHZXRDaGFubmVsTnVtYmVyICh2b2lkICpwRGV2aWNlSGFuZGxlciwgQllURSBieUNoYW5uZWxJbmRleCkKLXsKLS8vICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIHJldHVybihzQ2hhbm5lbFRibFtieUNoYW5uZWxJbmRleF0uYnlDaGFubmVsTnVtYmVyKTsKLX0KLQotLyoKLSAqIERlc2NyaXB0aW9uOiBTZXQgTklDIG1lZGlhIGNoYW5uZWwKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogIEluOgotICogICAgICBwRGV2aWNlSGFuZGxlciAgICAgIC0gVGhlIGFkYXB0ZXIgdG8gYmUgc2V0Ci0gKiAgICAgIHVDb25uZWN0aW9uQ2hhbm5lbCAgLSBDaGFubmVsIHRvIGJlIHNldAotICogIE91dDoKLSAqICAgICAgbm9uZQotICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KLSAqCi0gKi8KLUJPT0wgQ0FSRGJTZXRDaGFubmVsICh2b2lkICpwRGV2aWNlSGFuZGxlciwgVUlOVCB1Q29ubmVjdGlvbkNoYW5uZWwpCi17Ci0gICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgQk9PTCAgICAgICAgYlJlc3VsdCA9IFRSVUU7Ci0KLQotICAgIGlmIChwRGV2aWNlLT5ieUN1cnJlbnRDaCA9PSB1Q29ubmVjdGlvbkNoYW5uZWwpIHsKLSAgICAgICAgcmV0dXJuIGJSZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKHNDaGFubmVsVGJsW3VDb25uZWN0aW9uQ2hhbm5lbF0uYlZhbGlkID09IEZBTFNFKSB7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIGlmICgodUNvbm5lY3Rpb25DaGFubmVsID4gQ0JfTUFYX0NIQU5ORUxfMjRHKSAmJgotICAgICAgICAocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlICE9IFBIWV9UWVBFXzExQSkpIHsKLSAgICAgICAgQ0FSRGJTZXRQaHlQYXJhbWV0ZXIocERldmljZSwgUEhZX1RZUEVfMTFBLCAwLCAwLCBOVUxMLCBOVUxMKTsKLSAgICB9IGVsc2UgaWYgKCh1Q29ubmVjdGlvbkNoYW5uZWwgPD0gQ0JfTUFYX0NIQU5ORUxfMjRHKSAmJgotICAgICAgICAocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQSkpIHsKLSAgICAgICAgQ0FSRGJTZXRQaHlQYXJhbWV0ZXIocERldmljZSwgUEhZX1RZUEVfMTFHLCAwLCAwLCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0gICAgLy8gY2xlYXIgTkFWCi0gICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX01BQ0NSLCBNQUNDUl9DTFJOQVYpOwotCi0gICAgLy97eyBSb2JlcnRZdTogMjAwNDEyMDIKLSAgICAvLy8vIFRYX1BFIHdpbGwgcmVzZXJ2ZSAzIHVzIGZvciBNQVgyODI5IEEgbW9kZSBvbmx5LCBpdCBpcyBmb3IgYmV0dGVyIFRYIHRocm91Z2hwdXQKLQotICAgIGlmICggcERldmljZS0+YnlSRlR5cGUgPT0gUkZfQUlST0hBNzIzMCApCi0gICAgewotICAgICAgICBSRmJBTDcyMzBTZWxlY3RDaGFubmVsUG9zdFByb2Nlc3MocERldmljZS0+UG9ydE9mZnNldCwgcERldmljZS0+YnlDdXJyZW50Q2gsIChCWVRFKXVDb25uZWN0aW9uQ2hhbm5lbCk7Ci0gICAgfQotICAgIC8vfX0gUm9iZXJ0WXUKLQotCi0gICAgcERldmljZS0+YnlDdXJyZW50Q2ggPSAoQllURSl1Q29ubmVjdGlvbkNoYW5uZWw7Ci0gICAgYlJlc3VsdCAmPSBSRmJTZWxlY3RDaGFubmVsKHBEZXZpY2UtPlBvcnRPZmZzZXQsIHBEZXZpY2UtPmJ5UkZUeXBlLCAoQllURSl1Q29ubmVjdGlvbkNoYW5uZWwpOwotCi0gICAgLy8gSW5pdCBTeW50aGVzaXplciBUYWJsZQotICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID09IFRSVUUpCi0gICAgICAgIFJGdldyaXRlV2FrZVByb2dTeW4ocERldmljZS0+UG9ydE9mZnNldCwgcERldmljZS0+YnlSRlR5cGUsIHVDb25uZWN0aW9uQ2hhbm5lbCk7Ci0KLQotICAgIC8vREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJDQVJEYlNldE1lZGlhQ2hhbm5lbDogJWRcbiIsIChCWVRFKXVDb25uZWN0aW9uQ2hhbm5lbCk7Ci0gICAgQkJ2U29mdHdhcmVSZXNldChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLQotICAgIGlmIChwRGV2aWNlLT5ieUxvY2FsSUQgPiBSRVZfSURfVlQzMjUzX0IxKSB7Ci0gICAgICAgIC8vIHNldCBIVyBkZWZhdWx0IHBvd2VyIHJlZ2lzdGVyCi0gICAgICAgIE1BQ3ZTZWxlY3RQYWdlMShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICAgICAgUkZiU2V0UG93ZXIocERldmljZSwgUkFURV8xTSwgcERldmljZS0+YnlDdXJyZW50Q2gpOwotICAgICAgICBWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUFdSQ0NLLCBwRGV2aWNlLT5ieUN1clB3cik7Ci0gICAgICAgIFJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfNk0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLSAgICAgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUk9GRE0sIHBEZXZpY2UtPmJ5Q3VyUHdyKTsKLSAgICAgICAgTUFDdlNlbGVjdFBhZ2UwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChwRGV2aWNlLT5lQ3VycmVudFBIWVR5cGUgPT0gUEhZX1RZUEVfMTFCKSB7Ci0jaWZkZWYJUExJQ0VfREVCVUcKLQkvL3ByaW50aygiRnVuYzpDQVJEYlNldENoYW5uZWw6Y2FsbCBSRmJTZXRQb3dlcjoxMUJcbiIpOwotI2VuZGlmCi0gICAgICAgIFJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfMU0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLSAgICB9IGVsc2UgewotI2lmZGVmCVBMSUNFX0RFQlVHCi0JLy9wcmludGsoIkZ1bmM6Q0FSRGJTZXRDaGFubmVsOmNhbGwgUkZiU2V0UG93ZXJcbiIpOwotI2VuZGlmCi0JCVJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfNk0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oYlJlc3VsdCk7Ci19Ci0KLQogCiAvKgogICogRGVzY3JpcHRpb246IENhcmQgU2VuZCBwYWNrZXQgZnVuY3Rpb24KQEAgLTg0OSwxMSArMzY1LDExIEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwogLyoKLUJPT0wgQ0FSRGJTZW5kUGFja2V0ICh2b2lkICpwRGV2aWNlSGFuZGxlciwgdm9pZCAqcFBhY2tldCwgQ0FSRF9QS1RfVFlQRSBlUGt0VHlwZSwgVUlOVCB1TGVuZ3RoKQorYm9vbCBDQVJEYlNlbmRQYWNrZXQgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB2b2lkICpwUGFja2V0LCBDQVJEX1BLVF9UWVBFIGVQa3RUeXBlLCB1bnNpZ25lZCBpbnQgdUxlbmd0aCkKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKICAgICBpZiAoZVBrdFR5cGUgPT0gUEtUX1RZUEVfODAyXzExX01ORykgewpAQCAtODY0LDcgKzM4MCw3IEBACiAgICAgICAgIHJldHVybiBUWGJURDFTZW5kKHBEZXZpY2UsIHBQYWNrZXQsIHVMZW5ndGgpOwogICAgIH0KIAotICAgIHJldHVybiAoVFJVRSk7CisgICAgcmV0dXJuICh0cnVlKTsKIH0KICovCiAKQEAgLTg3OCwxNiArMzk0LDE2IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHNob3J0IHByZWFtYmxlOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzaG9ydCBwcmVhbWJsZTsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIENBUkRiSXNTaG9ydFByZWFtYmxlICh2b2lkICpwRGV2aWNlSGFuZGxlcikKK2Jvb2wgQ0FSRGJJc1Nob3J0UHJlYW1ibGUgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogICAgIGlmIChwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgfQotICAgIHJldHVybihUUlVFKTsKKyAgICByZXR1cm4odHJ1ZSk7CiB9CiAKIC8qCkBAIC04OTksMTAgKzQxNSwxMCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzaG9ydCBzbG90IHRpbWU7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHNob3J0IHNsb3QgdGltZTsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIENBUkRiSXNTaG9yU2xvdFRpbWUgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQorYm9vbCBDQVJEYklzU2hvclNsb3RUaW1lICh2b2lkICpwRGV2aWNlSGFuZGxlcikKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKICAgICByZXR1cm4ocERldmljZS0+YlNob3J0U2xvdFRpbWUpOwpAQCAtOTIxLDE0ICs0MzcsMTQgQEAKICAqIFJldHVybiBWYWx1ZTogTm9uZS4KICAqCiAgKi8KLUJPT0wgQ0FSRGJTZXRQaHlQYXJhbWV0ZXIgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BIWV9UWVBFIGVQSFlUeXBlLCBXT1JEIHdDYXBJbmZvLCBCWVRFIGJ5RVJQRmllbGQsIHZvaWQgKnB2U3VwcG9ydFJhdGVJRXMsIHZvaWQgKnB2RXh0U3VwcG9ydFJhdGVJRXMpCitib29sIENBUkRiU2V0UGh5UGFyYW1ldGVyICh2b2lkICpwRGV2aWNlSGFuZGxlciwgQ0FSRF9QSFlfVFlQRSBlUEhZVHlwZSwgdW5zaWduZWQgc2hvcnQgd0NhcEluZm8sIHVuc2lnbmVkIGNoYXIgYnlFUlBGaWVsZCwgdm9pZCAqcHZTdXBwb3J0UmF0ZUlFcywgdm9pZCAqcHZFeHRTdXBwb3J0UmF0ZUlFcykKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKLSAgICBCWVRFICAgICAgICBieUNXTWF4TWluID0gMDsKLSAgICBCWVRFICAgICAgICBieVNsb3QgPSAwOwotICAgIEJZVEUgICAgICAgIGJ5U0lGUyA9IDA7Ci0gICAgQllURSAgICAgICAgYnlESUZTID0gMDsKLSAgICBCWVRFICAgICAgICBieURhdGE7CisgICAgdW5zaWduZWQgY2hhciBieUNXTWF4TWluID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2xvdCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBieVNJRlMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlESUZTID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKIC8vICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcFJhdGVzID0gTlVMTDsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBTdXBwb3J0UmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykgcHZTdXBwb3J0UmF0ZUlFczsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBFeHRTdXBwb3J0UmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykgcHZFeHRTdXBwb3J0UmF0ZUlFczsKQEAgLTEwNzEsOSArNTg3LDkgQEAKICAgICAgICAgcERldmljZS0+YnlTbG90ID0gYnlTbG90OwogICAgICAgICBWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfU0xPVCwgcERldmljZS0+YnlTbG90KTsKICAgICAgICAgaWYgKHBEZXZpY2UtPmJ5U2xvdCA9PSBDX1NMT1RfU0hPUlQpIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJTaG9ydFNsb3RUaW1lID0gVFJVRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJTaG9ydFNsb3RUaW1lID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJTaG9ydFNsb3RUaW1lID0gRkFMU0U7CisgICAgICAgICAgICBwRGV2aWNlLT5iU2hvcnRTbG90VGltZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEJCdlNldFNob3J0U2xvdFRpbWUocERldmljZSk7CiAgICAgfQpAQCAtMTA4OSw3ICs2MDUsNyBAQAogICAgIHNfdlNldFJTUElORihwRGV2aWNlLCBlUEhZVHlwZSwgcFN1cHBvcnRSYXRlcywgcEV4dFN1cHBvcnRSYXRlcyk7CiAgICAgcERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID0gZVBIWVR5cGU7CiAgICAgLy8gc2V0IGZvciBORElTIE9JRF84MDJfMTFTVVBQT1JURURfUkFURVMKLSAgICByZXR1cm4gKFRSVUUpOworICAgIHJldHVybiAodHJ1ZSk7CiB9CiAKIC8qCkBAIC0xMTA4LDcgKzYyNCw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLUJPT0wgQ0FSRGJVcGRhdGVUU0YgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBCWVRFIGJ5UnhSYXRlLCBRV09SRCBxd0JTU1RpbWVzdGFtcCwgUVdPUkQgcXdMb2NhbFRTRikKK2Jvb2wgQ0FSRGJVcGRhdGVUU0YgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBjaGFyIGJ5UnhSYXRlLCBRV09SRCBxd0JTU1RpbWVzdGFtcCwgUVdPUkQgcXdMb2NhbFRTRikKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKICAgICBRV09SRCAgICAgICBxd1RTRk9mZnNldDsKQEAgLTExMjUsNyArNjQxLDcgQEAKICAgICAgICAgVk5Tdk91dFBvcnREKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1RTRk9GU1QgKyA0LCBISURXT1JEKHF3VFNGT2Zmc2V0KSk7CiAgICAgICAgIE1BQ3ZSZWdCaXRzT24ocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19URlRDVEwsIFRGVENUTF9UU0ZTWU5DRU4pOwogICAgIH0KLSAgICByZXR1cm4oVFJVRSk7CisgICAgcmV0dXJuKHRydWUpOwogfQogCiAKQEAgLTExNDAsMTYgKzY1NiwxNiBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgQ0FSRGJTZXRCZWFjb25QZXJpb2QgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBXT1JEIHdCZWFjb25JbnRlcnZhbCkKK2Jvb2wgQ0FSRGJTZXRCZWFjb25QZXJpb2QgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBzaG9ydCB3QmVhY29uSW50ZXJ2YWwpCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgdUJlYWNvbkludGVydmFsID0gMDsKLSAgICBVSU5UICAgICAgICB1TG93TmV4dFRCVFQgPSAwOwotICAgIFVJTlQgICAgICAgIHVIaWdoUmVtYWluID0gMDsKLSAgICBVSU5UICAgICAgICB1TG93UmVtYWluID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUJlYWNvbkludGVydmFsID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUxvd05leHRUQlRUID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUhpZ2hSZW1haW4gPSAwOworICAgIHVuc2lnbmVkIGludCB1TG93UmVtYWluID0gMDsKICAgICBRV09SRCAgICAgICBxd05leHRUQlRUOwogCiAgICAgSElEV09SRChxd05leHRUQlRUKSA9IDA7CkBAIC0xMTc5LDcgKzY5NSw3IEBACiAgICAgVk5Tdk91dFBvcnREKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX05FWFRUQlRUICsgNCwgSElEV09SRChxd05leHRUQlRUKSk7CiAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1RGVENUTCwgVEZUQ1RMX1RCVFRTWU5DRU4pOwogCi0gICAgcmV0dXJuKFRSVUUpOworICAgIHJldHVybih0cnVlKTsKIH0KIAogCkBAIC0xMTk0LDUxICs3MTAsNTEgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgYWxsIGRhdGEgcGFja2V0IGNvbXBsZXRlOyBvdGhlcndpc2UgRkFMU0UuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgYWxsIGRhdGEgcGFja2V0IGNvbXBsZXRlOyBvdGhlcndpc2UgZmFsc2UuCiAgKgogICovCi1CT09MIENBUkRiU3RvcFR4UGFja2V0ICh2b2lkICpwRGV2aWNlSGFuZGxlciwgQ0FSRF9QS1RfVFlQRSBlUGt0VHlwZSkKK2Jvb2wgQ0FSRGJTdG9wVHhQYWNrZXQgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BLVF9UWVBFIGVQa3RUeXBlKQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogCiAKICAgICBpZiAoZVBrdFR5cGUgPT0gUEtUX1RZUEVfODAyXzExX0FMTCkgewotICAgICAgICBwRGV2aWNlLT5iU3RvcEJlYWNvbiA9IFRSVUU7Ci0gICAgICAgIHBEZXZpY2UtPmJTdG9wVHgwUGt0ID0gVFJVRTsKLSAgICAgICAgcERldmljZS0+YlN0b3BEYXRhUGt0ID0gVFJVRTsKKyAgICAgICAgcERldmljZS0+YlN0b3BCZWFjb24gPSB0cnVlOworICAgICAgICBwRGV2aWNlLT5iU3RvcFR4MFBrdCA9IHRydWU7CisgICAgICAgIHBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IHRydWU7CiAgICAgfSBlbHNlIGlmIChlUGt0VHlwZSA9PSBQS1RfVFlQRV84MDJfMTFfQkNOKSB7Ci0gICAgICAgIHBEZXZpY2UtPmJTdG9wQmVhY29uID0gVFJVRTsKKyAgICAgICAgcERldmljZS0+YlN0b3BCZWFjb24gPSB0cnVlOwogICAgIH0gZWxzZSBpZiAoZVBrdFR5cGUgPT0gUEtUX1RZUEVfODAyXzExX01ORykgewotICAgICAgICBwRGV2aWNlLT5iU3RvcFR4MFBrdCA9IFRSVUU7CisgICAgICAgIHBEZXZpY2UtPmJTdG9wVHgwUGt0ID0gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKGVQa3RUeXBlID09IFBLVF9UWVBFXzgwMl8xMV9EQVRBKSB7Ci0gICAgICAgIHBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IFRSVUU7CisgICAgICAgIHBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IHRydWU7CiAgICAgfQogCi0gICAgaWYgKHBEZXZpY2UtPmJTdG9wQmVhY29uID09IFRSVUUpIHsKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJJc0JlYWNvbkJ1ZlJlYWR5U2V0ID09IFRSVUUpIHsKKyAgICBpZiAocERldmljZS0+YlN0b3BCZWFjb24gPT0gdHJ1ZSkgeworICAgICAgICBpZiAocERldmljZS0+YklzQmVhY29uQnVmUmVhZHlTZXQgPT0gdHJ1ZSkgewogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmNiQmVhY29uQnVmUmVhZHlTZXRDbnQgPCBXQUlUX0JFQUNPTl9UWF9ET1dOX1RNTykgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmNiQmVhY29uQnVmUmVhZHlTZXRDbnQgKys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHBEZXZpY2UtPmJJc0JlYWNvbkJ1ZlJlYWR5U2V0ID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJJc0JlYWNvbkJ1ZlJlYWR5U2V0ID0gZmFsc2U7CiAgICAgICAgIHBEZXZpY2UtPmNiQmVhY29uQnVmUmVhZHlTZXRDbnQgPSAwOwogICAgICAgICBNQUN2UmVnQml0c09mZihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1RDUiwgVENSX0FVVE9CQ05UWCk7CiAgICAgfQogICAgIC8vIHdhaXQgYWxsIFREMCBjb21wbGV0ZQotICAgIGlmIChwRGV2aWNlLT5iU3RvcFR4MFBrdCA9PSBUUlVFKSB7CisgICAgaWYgKHBEZXZpY2UtPmJTdG9wVHgwUGt0ID09IHRydWUpIHsKICAgICAgICAgIGlmIChwRGV2aWNlLT5pVERVc2VkW1RZUEVfVFhETUEwXSAhPSAwKXsKLSAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIHdhaXQgYWxsIERhdGEgVEQgY29tcGxldGUKLSAgICBpZiAocERldmljZS0+YlN0b3BEYXRhUGt0ID09IFRSVUUpIHsKKyAgICBpZiAocERldmljZS0+YlN0b3BEYXRhUGt0ID09IHRydWUpIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmlURFVzZWRbVFlQRV9BQzBETUFdICE9IDApewotICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4oVFJVRSk7CisgICAgcmV0dXJuKHRydWUpOwogfQogCiAKQEAgLTEyNTIsMzMgKzc2OCwzMyBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzOyBGQUxTRSBpZiBmYWlsZWQuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VzczsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwotQk9PTCBDQVJEYlN0YXJ0VHhQYWNrZXQgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BLVF9UWVBFIGVQa3RUeXBlKQorYm9vbCBDQVJEYlN0YXJ0VHhQYWNrZXQgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BLVF9UWVBFIGVQa3RUeXBlKQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogCiAKICAgICBpZiAoZVBrdFR5cGUgPT0gUEtUX1RZUEVfODAyXzExX0FMTCkgewotICAgICAgICBwRGV2aWNlLT5iU3RvcEJlYWNvbiA9IEZBTFNFOwotICAgICAgICBwRGV2aWNlLT5iU3RvcFR4MFBrdCA9IEZBTFNFOwotICAgICAgICBwRGV2aWNlLT5iU3RvcERhdGFQa3QgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+YlN0b3BCZWFjb24gPSBmYWxzZTsKKyAgICAgICAgcERldmljZS0+YlN0b3BUeDBQa3QgPSBmYWxzZTsKKyAgICAgICAgcERldmljZS0+YlN0b3BEYXRhUGt0ID0gZmFsc2U7CiAgICAgfSBlbHNlIGlmIChlUGt0VHlwZSA9PSBQS1RfVFlQRV84MDJfMTFfQkNOKSB7Ci0gICAgICAgIHBEZXZpY2UtPmJTdG9wQmVhY29uID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJTdG9wQmVhY29uID0gZmFsc2U7CiAgICAgfSBlbHNlIGlmIChlUGt0VHlwZSA9PSBQS1RfVFlQRV84MDJfMTFfTU5HKSB7Ci0gICAgICAgIHBEZXZpY2UtPmJTdG9wVHgwUGt0ID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJTdG9wVHgwUGt0ID0gZmFsc2U7CiAgICAgfSBlbHNlIGlmIChlUGt0VHlwZSA9PSBQS1RfVFlQRV84MDJfMTFfREFUQSkgewotICAgICAgICBwRGV2aWNlLT5iU3RvcERhdGFQa3QgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+YlN0b3BEYXRhUGt0ID0gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKChwRGV2aWNlLT5iU3RvcEJlYWNvbiA9PSBGQUxTRSkgJiYKLSAgICAgICAgKHBEZXZpY2UtPmJCZWFjb25CdWZSZWFkeSA9PSBUUlVFKSAmJgorICAgIGlmICgocERldmljZS0+YlN0b3BCZWFjb24gPT0gZmFsc2UpICYmCisgICAgICAgIChwRGV2aWNlLT5iQmVhY29uQnVmUmVhZHkgPT0gdHJ1ZSkgJiYKICAgICAgICAgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykpIHsKICAgICAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1RDUiwgVENSX0FVVE9CQ05UWCk7CiAgICAgfQogCi0gICAgcmV0dXJuKFRSVUUpOworICAgIHJldHVybih0cnVlKTsKIH0KIAogCkBAIC0xMjk0LDEwICs4MTAsMTAgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VzczsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3M7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KLUJPT0wgQ0FSRGJTZXRCU1NJRCh2b2lkICpwRGV2aWNlSGFuZGxlciwgUEJZVEUgcGJ5QlNTSUQsIENBUkRfT1BfTU9ERSBlT1BNb2RlKQorYm9vbCBDQVJEYlNldEJTU0lEKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwgQ0FSRF9PUF9NT0RFIGVPUE1vZGUpCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7CiAKQEAgLTEzMTUsMjAgKzgzMSwyMCBAQAogICAgIH0KICAgICBpZiAoZU9QTW9kZSA9PSBPUF9NT0RFX1VOS05PV04pIHsKICAgICAgICAgTUFDdlJlZ0JpdHNPZmYocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19SQ1IsIFJDUl9CU1NJRCk7Ci0gICAgICAgIHBEZXZpY2UtPmJCU1NJREZpbHRlciA9IEZBTFNFOworICAgICAgICBwRGV2aWNlLT5iQlNTSURGaWx0ZXIgPSBmYWxzZTsKICAgICAgICAgcERldmljZS0+YnlSeE1vZGUgJj0gflJDUl9CU1NJRDsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAid2NtZDogcnhfbW9kZSA9ICV4XG4iLCBwRGV2aWNlLT5ieVJ4TW9kZSApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChJU19OVUxMX0FERFJFU1MocERldmljZS0+YWJ5QlNTSUQpID09IEZBTFNFKSB7CisgICAgICAgIGlmIChpc196ZXJvX2V0aGVyX2FkZHIocERldmljZS0+YWJ5QlNTSUQpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfUkNSLCBSQ1JfQlNTSUQpOwotICAgICAgICAgICAgcERldmljZS0+YkJTU0lERmlsdGVyID0gVFJVRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJCU1NJREZpbHRlciA9IHRydWU7CiAgICAgICAgICAgICBwRGV2aWNlLT5ieVJ4TW9kZSB8PSBSQ1JfQlNTSUQ7CiAJICAgIH0KIAkgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAid21ncjogcnhfbW9kZSA9ICV4XG4iLCBwRGV2aWNlLT5ieVJ4TW9kZSApOwogICAgIH0KICAgICAvLyBBZG9wdCBCU1Mgc3RhdGUgaW4gQWRhcHRlciBEZXZpY2UgT2JqZWN0CiAgICAgcERldmljZS0+ZU9QTW9kZSA9IGVPUE1vZGU7Ci0gICAgcmV0dXJuKFRSVUUpOworICAgIHJldHVybih0cnVlKTsKIH0KIAogCkBAIC0xMzQyLDcgKzg1OCw3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3M7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZXNzOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogICovCiAKQEAgLTEzNjMsMTggKzg3OSwxOCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgQ0FSRGJTZXRUeERhdGFSYXRlKAorYm9vbCBDQVJEYlNldFR4RGF0YVJhdGUoCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgV09SRCAgICB3RGF0YVJhdGUKKyAgICB1bnNpZ25lZCBzaG9ydCB3RGF0YVJhdGUKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7CiAKICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSB3RGF0YVJhdGU7Ci0gICAgcmV0dXJuKFRSVUUpOworICAgIHJldHVybih0cnVlKTsKIH0KIAogLyorCkBAIC0xMzg4LDIwICs5MDQsMjAgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgcG93ZXIgZG93biBzdWNjZXNzOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBwb3dlciBkb3duIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZQogICoKIC0qLwotQk9PTAorYm9vbAogQ0FSRGJQb3dlckRvd24oCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgICAgIHVJZHg7CisgICAgdW5zaWduZWQgaW50IHVJZHg7CiAKICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IGluIERvemUgbW9kZQogICAgIGlmIChNQUNiSXNSZWdCaXRzT24ocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19QU0NUTCwgUFNDVExfUFMpKQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAvLyBGcm9jZSBQU0VOIG9uCiAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9QU0VOKTsKQEAgLTE0MTAsMTIgKzkyNiwxMiBAQAogCiAgICAgZm9yICh1SWR4ID0gMDsgdUlkeCA8IFRZUEVfTUFYVEQ7IHVJZHggKyspIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmlURFVzZWRbdUlkeF0gIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX0dPMkRPWkUpOwogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iR28gdG8gRG96ZSBaWlpaWlpaWlpaWlpaWlpcbiIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvKgpAQCAtMTQyNywxNiArOTQzLDE2IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZQogICoKICAqLwotQk9PTCBDQVJEYlJhZGlvUG93ZXJPZmYgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQorYm9vbCBDQVJEYlJhZGlvUG93ZXJPZmYgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIEJPT0wgICAgICAgIGJSZXN1bHQgPSBUUlVFOworICAgIGJvb2wgYlJlc3VsdCA9IHRydWU7CiAKLSAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IFRSVUUpCi0gICAgICAgIHJldHVybiBUUlVFOworICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKIAogICAgIHN3aXRjaCAocERldmljZS0+YnlSRlR5cGUpIHsKQEAgLTE0NTksNyArOTc1LDcgQEAKIAogICAgIEJCdlNldERlZXBTbGVlcChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBwRGV2aWNlLT5ieUxvY2FsSUQpOwogCi0gICAgcERldmljZS0+YlJhZGlvT2ZmID0gVFJVRTsKKyAgICBwRGV2aWNlLT5iUmFkaW9PZmYgPSB0cnVlOwogICAgICAvLzIwMDctMDQwOS0wMyw8QWRkPiBieSBjaGVzdGVyCiBwcmludGsoImNoZXN0ZXIgcG93ZXIgb2ZmXG4iKTsKIE1BQ3ZSZWdCaXRzT24ocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19HUElPQ1RMMCwgTEVEX0FDVFNFVCk7ICAvL0xFRCBpc3N1ZQpAQCAtMTQ3NiwyMyArOTkyLDIzIEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZQogICoKICAqLwotQk9PTCBDQVJEYlJhZGlvUG93ZXJPbiAodm9pZCAqcERldmljZUhhbmRsZXIpCitib29sIENBUkRiUmFkaW9Qb3dlck9uICh2b2lkICpwRGV2aWNlSGFuZGxlcikKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKLSAgICBCT09MICAgICAgICBiUmVzdWx0ID0gVFJVRTsKKyAgICBib29sIGJSZXN1bHQgPSB0cnVlOwogcHJpbnRrKCJjaGVzdGVyIHBvd2VyIG9uXG4iKTsKLSAgICBpZiAocERldmljZS0+YlJhZGlvQ29udHJvbE9mZiA9PSBUUlVFKXsKLWlmIChwRGV2aWNlLT5iSFdSYWRpb09mZiA9PSBUUlVFKSBwcmludGsoImNoZXN0ZXIgYkhXUmFkaW9PZmZcbiIpOwotaWYgKHBEZXZpY2UtPmJSYWRpb0NvbnRyb2xPZmYgPT0gVFJVRSkgcHJpbnRrKCJjaGVzdGVyIGJSYWRpb0NvbnRyb2xPZmZcbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7fQorICAgIGlmIChwRGV2aWNlLT5iUmFkaW9Db250cm9sT2ZmID09IHRydWUpeworaWYgKHBEZXZpY2UtPmJIV1JhZGlvT2ZmID09IHRydWUpIHByaW50aygiY2hlc3RlciBiSFdSYWRpb09mZlxuIik7CitpZiAocERldmljZS0+YlJhZGlvQ29udHJvbE9mZiA9PSB0cnVlKSBwcmludGsoImNoZXN0ZXIgYlJhZGlvQ29udHJvbE9mZlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTt9CiAKLSAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IEZBTFNFKQorICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gZmFsc2UpCiAgICAgICAgewogcHJpbnRrKCJjaGVzdGVyIHBiUmFkaW9PZmZcbiIpOwotcmV0dXJuIFRSVUU7fQorcmV0dXJuIHRydWU7fQogCiAgICAgQkJ2RXhpdERlZXBTbGVlcChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBwRGV2aWNlLT5ieUxvY2FsSUQpOwogCkBAIC0xNTE0LDcgKzEwMzAsNyBAQAogCiAgICAgfQogCi0gICAgcERldmljZS0+YlJhZGlvT2ZmID0gRkFMU0U7CisgICAgcERldmljZS0+YlJhZGlvT2ZmID0gZmFsc2U7CiAvLyAgMjAwNy0wNDA5LTAzLDxBZGQ+IGJ5IGNoZXN0ZXIKIHByaW50aygiY2hlc3RlciBwb3dlciBvblxuIik7CiBNQUN2UmVnQml0c09mZihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX0dQSU9DVEwwLCBMRURfQUNUU0VUKTsgLy9MRUQgaXNzdWUKQEAgLTE1MjMsMTIgKzEwMzksMTIgQEAKIAogCiAKLUJPT0wgQ0FSRGJSZW1vdmVLZXkgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBQQllURSBwYnlCU1NJRCkKK2Jvb2wgQ0FSRGJSZW1vdmVLZXkgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCkKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKIAogICAgIEtleWJSZW1vdmVBbGxLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgIHJldHVybiAoVFJVRSk7CisgICAgcmV0dXJuICh0cnVlKTsKIH0KIAogCkBAIC0xNTQ4LDE3ICsxMDY0LDE3IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUuCiAgKgogLSovCi1CT09MCitib29sCiBDQVJEYkFkZF9QTUtJRF9DYW5kaWRhdGUgKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIFBCWVRFICAgICAgICAgICAgcGJ5QlNTSUQsCi0gICAgQk9PTCAgICAgICAgICAgICBiUlNOQ2FwRXhpc3QsCi0gICAgV09SRCAgICAgICAgICAgICB3UlNOQ2FwCisgICAgdW5zaWduZWQgY2hhciAqcGJ5QlNTSUQsCisgICAgYm9vbCBiUlNOQ2FwRXhpc3QsCisgICAgdW5zaWduZWQgc2hvcnQgd1JTTkNhcAogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogICAgIFBQTUtJRF9DQU5ESURBVEUgICAgcENhbmRpZGF0ZUxpc3Q7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICBpaSA9IDA7CisgICAgdW5zaWduZWQgaW50IGlpID0gMDsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iYkFkZF9QTUtJRF9DYW5kaWRhdGUgU1RBUlQ6ICglZClcbiIsIChpbnQpcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5OdW1DYW5kaWRhdGVzKTsKIApAQCAtMTU3NywxOCArMTA5MywxOCBAQAogICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmdzUE1LSURDYW5kaWRhdGUuTnVtQ2FuZGlkYXRlczsgaWkrKykgewogICAgICAgICBwQ2FuZGlkYXRlTGlzdCA9ICZwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLkNhbmRpZGF0ZUxpc3RbaWldOwogICAgICAgICBpZiAoICFtZW1jbXAocENhbmRpZGF0ZUxpc3QtPkJTU0lELCBwYnlCU1NJRCwgRVRIX0FMRU4pKSB7Ci0gICAgICAgICAgICBpZiAoKGJSU05DYXBFeGlzdCA9PSBUUlVFKSAmJiAod1JTTkNhcCAmIEJJVDApKSB7CisgICAgICAgICAgICBpZiAoKGJSU05DYXBFeGlzdCA9PSB0cnVlKSAmJiAod1JTTkNhcCAmIEJJVDApKSB7CiAgICAgICAgICAgICAgICAgcENhbmRpZGF0ZUxpc3QtPkZsYWdzIHw9IE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9QUkVBVVRIX0VOQUJMRUQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBDYW5kaWRhdGVMaXN0LT5GbGFncyAmPSB+KE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9QUkVBVVRIX0VOQUJMRUQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIE5ldyBDYW5kaWRhdGUKICAgICBwQ2FuZGlkYXRlTGlzdCA9ICZwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLkNhbmRpZGF0ZUxpc3RbcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5OdW1DYW5kaWRhdGVzXTsKLSAgICBpZiAoKGJSU05DYXBFeGlzdCA9PSBUUlVFKSAmJiAod1JTTkNhcCAmIEJJVDApKSB7CisgICAgaWYgKChiUlNOQ2FwRXhpc3QgPT0gdHJ1ZSkgJiYgKHdSU05DYXAgJiBCSVQwKSkgewogICAgICAgICBwQ2FuZGlkYXRlTGlzdC0+RmxhZ3MgfD0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRDsKICAgICB9IGVsc2UgewogICAgICAgICBwQ2FuZGlkYXRlTGlzdC0+RmxhZ3MgJj0gfihORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVEKTsKQEAgLTE1OTYsNyArMTExMiw3IEBACiAgICAgbWVtY3B5KHBDYW5kaWRhdGVMaXN0LT5CU1NJRCwgcGJ5QlNTSUQsIEVUSF9BTEVOKTsKICAgICBwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLk51bUNhbmRpZGF0ZXMrKzsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIk51bUNhbmRpZGF0ZXM6JWRcbiIsIChpbnQpcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5OdW1DYW5kaWRhdGVzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCAqCkBAIC0xNjA5LDg5ICsxMTI1LDYgQEAKICAgICByZXR1cm4gKHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyKTsKIH0KIAotCi0KLXZvaWQgQ0FSRHZJbml0Q2hhbm5lbFRhYmxlICh2b2lkICpwRGV2aWNlSGFuZGxlcikKLXsKLSAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKLSAgICBCT09MICAgICAgICBiTXVsdGlCYW5kID0gRkFMU0U7Ci0gICAgVUlOVCAgICAgICAgaWk7Ci0KLSAgICBmb3IoaWk9MTtpaTw9Q0FSRF9NQVhfQ0hBTk5FTF9UQkw7aWkrKykgewotICAgICAgICBzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID0gRkFMU0U7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwRGV2aWNlLT5ieVJGVHlwZSkgewotICAgICAgICBjYXNlIFJGX1JGTUQyOTU5IDoKLSAgICAgICAgY2FzZSBSRl9BSVJPSEEgOgotICAgICAgICBjYXNlIFJGX0FMMjIzMFM6Ci0gICAgICAgIGNhc2UgUkZfVVcyNDUxIDoKLSAgICAgICAgY2FzZSBSRl9WVDMyMjYgOgotCS8vCQlwcmludGsoImNoZXN0ZXItZmFsc2VcbiIpOwotICAgICAgICAgICAgYk11bHRpQmFuZCA9IEZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkZfQUlST0hBNzIzMCA6Ci0gICAgICAgIGNhc2UgUkZfVVcyNDUyIDoKLSAgICAgICAgY2FzZSBSRl9OT1RISU5HIDoKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBiTXVsdGlCYW5kID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICgocERldmljZS0+ZHdEaWFnUmVmQ291bnQgIT0gMCkgfHwKLSAgICAgICAgKHBEZXZpY2UtPmIxMWhFbmFibGUgPT0gVFJVRSkpIHsKLSAgICAgICAgaWYgKGJNdWx0aUJhbmQgPT0gVFJVRSkgewotICAgICAgICAgICAgZm9yKGlpPTA7aWk8Q0FSRF9NQVhfQ0hBTk5FTF9UQkw7aWkrKykgewotICAgICAgICAgICAgICAgIHNDaGFubmVsVGJsW2lpKzFdLmJWYWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gcERldmljZS0+YWJ5T0ZETURlZmF1bHRQd3JbaWkrMV07Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YWJ5TG9jYWxQd3JbaWkrMV0gPSBwRGV2aWNlLT5hYnlPRkRNRGVmYXVsdFB3cltpaSsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihpaT0wO2lpPENIQU5ORUxfTUFYXzI0RztpaSsrKSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gcERldmljZS0+YWJ5Q0NLRGVmYXVsdFB3cltpaSsxXTsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IHBEZXZpY2UtPmFieUNDS0RlZmF1bHRQd3JbaWkrMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IoaWk9MDtpaTxDSEFOTkVMX01BWF8yNEc7aWkrKykgewotLy8yMDA4LTgtNCA8YWRkPiBieSBjaGVzdGVyCi0gaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gIT0gMCkgewotICAgICAgICAgICAgICAgIHNDaGFubmVsVGJsW2lpKzFdLmJWYWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gcERldmljZS0+YWJ5Q0NLRGVmYXVsdFB3cltpaSsxXTsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IHBEZXZpY2UtPmFieUNDS0RlZmF1bHRQd3JbaWkrMV07Ci0gCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocERldmljZS0+Ynlab25lVHlwZSA8PSBDQ09ERV9NQVgpIHsKLSAgICAgICAgaWYgKGJNdWx0aUJhbmQgPT0gVFJVRSkgewotICAgICAgICAgICAgZm9yKGlpPTA7aWk8Q0FSRF9NQVhfQ0hBTk5FTF9UQkw7aWkrKykgewotICAgICAgICAgICAgICAgIGlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbaWldICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc0NoYW5uZWxUYmxbaWkrMV0uYlZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07Ci0gICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yKGlpPTA7aWk8Q0hBTk5FTF9NQVhfMjRHO2lpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0W2lpXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNDaGFubmVsVGJsW2lpKzFdLmJWYWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmFieVJlZ1B3cltpaSsxXSA9IENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJ5UG93ZXJbaWldOwotICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJ5UG93ZXJbaWldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSBEQkdfUFJUKE1TR19MRVZFTF9OT1RJQ0UsIEtFUk5fSU5GTyJab25lPVslZF1bJWNdWyVjXSEhXG4iLHBEZXZpY2UtPmJ5Wm9uZVR5cGUsQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uY2hDb3VudHJ5Q29kZVswXSxDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5jaENvdW50cnlDb2RlWzFdKTsKLSAgICBmb3IoaWk9MDtpaTxDQVJEX01BWF9DSEFOTkVMX1RCTDtpaSsrKSB7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPT0gMCkgewotICAgICAgICAgICAgcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gcERldmljZS0+YWJ5T0ZETURlZmF1bHRQd3JbaWkrMV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID09IDApIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gcERldmljZS0+YWJ5T0ZETURlZmF1bHRQd3JbaWkrMV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotCiAvKgogICoKICAqIERlc2NyaXB0aW9uOgpAQCAtMTcwNiwyNyArMTEzOSwyNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lLgogICoKIC0qLwotQk9PTAorYm9vbAogQ0FSRGJTdGFydE1lYXN1cmUgKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAogICAgIHZvaWQgKnB2TWVhc3VyZUVJRHMsCi0gICAgVUlOVCAgICAgICAgICAgICB1TnVtT2ZNZWFzdXJlRUlEcworICAgIHVuc2lnbmVkIGludCB1TnVtT2ZNZWFzdXJlRUlEcwogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgICAgICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKICAgICBQV0xBTl9JRV9NRUFTVVJFX1JFUSAgICBwRUlEID0gKFBXTEFOX0lFX01FQVNVUkVfUkVRKSBwdk1lYXN1cmVFSURzOwogICAgIFFXT1JEICAgICAgICAgICAgICAgICAgIHF3Q3VyclRTRjsKICAgICBRV09SRCAgICAgICAgICAgICAgICAgICBxd1N0YXJ0VFNGOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJFeHBpcmVkID0gVFJVRTsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3RHVyYXRpb24gPSAwOworICAgIGJvb2wgYkV4cGlyZWQgPSB0cnVlOworICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbiA9IDA7CiAKICAgICBpZiAoKHBFSUQgPT0gTlVMTCkgfHwKICAgICAgICAgKHVOdW1PZk1lYXN1cmVFSURzID09IDApKSB7Ci0gICAgICAgIHJldHVybiAoVFJVRSk7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CiAgICAgfQogICAgIENBUkRiR2V0Q3VycmVudFRTRihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAmcXdDdXJyVFNGKTsKLSAgICBpZiAocERldmljZS0+Yk1lYXN1cmVJblByb2dyZXNzID09IFRSVUUpIHsKLSAgICAgICAgcERldmljZS0+Yk1lYXN1cmVJblByb2dyZXNzID0gRkFMU0U7CisgICAgaWYgKHBEZXZpY2UtPmJNZWFzdXJlSW5Qcm9ncmVzcyA9PSB0cnVlKSB7CisgICAgICAgIHBEZXZpY2UtPmJNZWFzdXJlSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICAgICBWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUkNSLCBwRGV2aWNlLT5ieU9yZ1JDUik7CiAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgVk5Tdk91dFBvcnREKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX01BUjAsIHBEZXZpY2UtPmR3T3JnTUFSMCk7CkBAIC0xNzM0LDcgKzExNjcsNyBAQAogICAgICAgICAvLyBjbGVhciBtZWFzdXJlIGNvbnRyb2wKICAgICAgICAgTUFDdlJlZ0JpdHNPZmYocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19NU1JDVEwsIE1TUkNUTF9FTik7CiAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICAgICAgQ0FSRGJTZXRDaGFubmVsKHBEZXZpY2UsIHBEZXZpY2UtPmJ5T3JnQ2hhbm5lbCk7CisgICAgICAgIHNldF9jaGFubmVsKHBEZXZpY2UsIHBEZXZpY2UtPmJ5T3JnQ2hhbm5lbCk7CiAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX01TUkNUTCsxLCBNU1JDVEwxX1RYUEFVU0UpOwogICAgICAgICBNQUN2U2VsZWN0UGFnZTAocERldmljZS0+UG9ydE9mZnNldCk7CkBAIC0xNzQ5LDcgKzExODIsNyBAQAogICAgICAgICBpZiAocERldmljZS0+YnlMb2NhbElEID4gUkVWX0lEX1ZUMzI1M19CMSkgewogICAgICAgICAgICAgSElEV09SRChxd1N0YXJ0VFNGKSA9IEhJRFdPUkQoKigoUFFXT1JEKSAocERldmljZS0+cEN1cnJNZWFzdXJlRUlELT5zUmVxLmFieVN0YXJ0VGltZSkpKTsKICAgICAgICAgICAgIExPRFdPUkQocXdTdGFydFRTRikgPSBMT0RXT1JEKCooKFBRV09SRCkgKHBEZXZpY2UtPnBDdXJyTWVhc3VyZUVJRC0+c1JlcS5hYnlTdGFydFRpbWUpKSk7Ci0gICAgICAgICAgICB3RHVyYXRpb24gPSAqKChQV09SRCkgKHBEZXZpY2UtPnBDdXJyTWVhc3VyZUVJRC0+c1JlcS5hYnlEdXJhdGlvbikpOworICAgICAgICAgICAgd0R1cmF0aW9uID0gKigodW5zaWduZWQgc2hvcnQgKikgKHBEZXZpY2UtPnBDdXJyTWVhc3VyZUVJRC0+c1JlcS5hYnlEdXJhdGlvbikpOwogICAgICAgICAgICAgd0R1cmF0aW9uICs9IDE7IC8vIDEgVFUgZm9yIGNoYW5uZWwgc3dpdGNoaW5nCiAKICAgICAgICAgICAgIGlmICgoTE9EV09SRChxd1N0YXJ0VFNGKSA9PSAwKSAmJiAoSElEV09SRChxd1N0YXJ0VFNGKSA9PSAwKSkgewpAQCAtMTc1OSw3ICsxMTkyLDcgQEAKICAgICAgICAgICAgICAgICBpZiAoTE9EV09SRChxd0N1cnJUU0YpID4gTE9EV09SRChxd1N0YXJ0VFNGKSkgewogICAgICAgICAgICAgICAgICAgICBISURXT1JEKHF3U3RhcnRUU0YpKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJFeHBpcmVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkV4cGlyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgc2V0dGluZyBzdGFydCBUU0YgLSAxVFUoZm9yIGNoYW5uZWwgc3dpdGNoaW5nKQpAQCAtMTc3MywxMSArMTIwNiwxMSBAQAogICAgICAgICAgICAgICAgICgoSElEV09SRChxd0N1cnJUU0YpID09IEhJRFdPUkQocXdTdGFydFRTRikpICYmCiAgICAgICAgICAgICAgICAgKExPRFdPUkQocXdDdXJyVFNGKSA8IExPRFdPUkQocXdTdGFydFRTRikpKQogICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIGJFeHBpcmVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYkV4cGlyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFZOVFdJRkliTWVhc3VyZVJlcG9ydCggIHBEZXZpY2UtPnBNZ210LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPnBDdXJyTWVhc3VyZUVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FQVNVUkVfTU9ERV9MQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlCYXNpY01hcCwKQEAgLTE3ODcsNyArMTIyMCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBkbyBub3Qgc3VwcG9ydCBtZWFzdXJlCiAgICAgICAgICAgICBWTlRXSUZJYk1lYXN1cmVSZXBvcnQoICBwRGV2aWNlLT5wTWdtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5wQ3Vyck1lYXN1cmVFSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRUFTVVJFX01PREVfSU5DQVBBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlCYXNpY01hcCwKQEAgLTE3OTcsNyArMTIzMCw3IEBACiAgICAgICAgIH0KICAgICB9IHdoaWxlIChwRGV2aWNlLT51TnVtT2ZNZWFzdXJlRUlEcyAhPSAwKTsKIAotICAgIGlmIChiRXhwaXJlZCA9PSBGQUxTRSkgeworICAgIGlmIChiRXhwaXJlZCA9PSBmYWxzZSkgewogICAgICAgICBNQUN2U2VsZWN0UGFnZTEocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgIFZOU3ZPdXRQb3J0RChwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19NU1JTVEFSVCwgTE9EV09SRChxd1N0YXJ0VFNGKSk7CiAgICAgICAgIFZOU3ZPdXRQb3J0RChwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19NU1JTVEFSVCArIDQsIEhJRFdPUkQocXdTdGFydFRTRikpOwpAQCAtMTgwNyw3ICsxMjQwLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBhbGwgbWVhc3VyZSBzdGFydCB0aW1lIGV4cGlyZWQgd2Ugc2hvdWxkIGNvbXBsZXRlIGFjdGlvbgogICAgICAgICBWTlRXSUZJYk1lYXN1cmVSZXBvcnQoICBwRGV2aWNlLT5wTWdtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlCYXNpY01hcCwKQEAgLTE4MTUsNyArMTI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmFieVJQSXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICB9Ci0gICAgcmV0dXJuIChUUlVFKTsKKyAgICByZXR1cm4gKHRydWUpOwogfQogCiAKQEAgLTE4MzMsMTkgKzEyNjYsMTkgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZS4KICAqCiAtKi8KLUJPT0wKK2Jvb2wKIENBUkRiQ2hhbm5lbFN3aXRjaCAoCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgQllURSAgICAgICAgICAgICBieU1vZGUsCi0gICAgQllURSAgICAgICAgICAgICBieU5ld0NoYW5uZWwsCi0gICAgQllURSAgICAgICAgICAgICBieUNvdW50CisgICAgdW5zaWduZWQgY2hhciBieU1vZGUsCisgICAgdW5zaWduZWQgY2hhciBieU5ld0NoYW5uZWwsCisgICAgdW5zaWduZWQgY2hhciBieUNvdW50CiAgICAgKQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIEJPT0wgICAgICAgIGJSZXN1bHQgPSBUUlVFOworICAgIGJvb2wgYlJlc3VsdCA9IHRydWU7CiAKICAgICBpZiAoYnlDb3VudCA9PSAwKSB7Ci0gICAgICAgIGJSZXN1bHQgPSBDQVJEYlNldENoYW5uZWwocERldmljZSwgYnlOZXdDaGFubmVsKTsKKyAgICAgICAgYlJlc3VsdCA9IHNldF9jaGFubmVsKHBEZXZpY2UsIGJ5TmV3Q2hhbm5lbCk7CiAgICAgICAgIFZOVFdJRkliQ2hhbm5lbFN3aXRjaChwRGV2aWNlLT5wTWdtdCwgYnlOZXdDaGFubmVsKTsKICAgICAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTVNSQ1RMKzEsIE1TUkNUTDFfVFhQQVVTRSk7CkBAIC0xODU0LDcgKzEyODcsNyBAQAogICAgIH0KICAgICBwRGV2aWNlLT5ieUNoYW5uZWxTd2l0Y2hDb3VudCA9IGJ5Q291bnQ7CiAgICAgcERldmljZS0+YnlOZXdDaGFubmVsID0gYnlOZXdDaGFubmVsOwotICAgIHBEZXZpY2UtPmJDaGFubmVsU3dpdGNoID0gVFJVRTsKKyAgICBwRGV2aWNlLT5iQ2hhbm5lbFN3aXRjaCA9IHRydWU7CiAgICAgaWYgKGJ5TW9kZSA9PSAxKSB7CiAgICAgICAgIGJSZXN1bHQ9Q0FSRGJTdG9wVHhQYWNrZXQocERldmljZSwgUEtUX1RZUEVfODAyXzExX0FMTCk7CiAgICAgfQpAQCAtMTg3NiwzNCArMTMwOSwzNCBAQAogICogUmV0dXJuIFZhbHVlOiBub25lLgogICoKIC0qLwotQk9PTAorYm9vbAogQ0FSRGJTZXRRdWlldCAoCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgQk9PTCAgICAgICAgICAgICBiUmVzZXRRdWlldCwKLSAgICBCWVRFICAgICAgICAgICAgIGJ5UXVpZXRDb3VudCwKLSAgICBCWVRFICAgICAgICAgICAgIGJ5UXVpZXRQZXJpb2QsCi0gICAgV09SRCAgICAgICAgICAgICB3UXVpZXREdXJhdGlvbiwKLSAgICBXT1JEICAgICAgICAgICAgIHdRdWlldE9mZnNldAorICAgIGJvb2wgYlJlc2V0UXVpZXQsCisgICAgdW5zaWduZWQgY2hhciBieVF1aWV0Q291bnQsCisgICAgdW5zaWduZWQgY2hhciBieVF1aWV0UGVyaW9kLAorICAgIHVuc2lnbmVkIHNob3J0IHdRdWlldER1cmF0aW9uLAorICAgIHVuc2lnbmVkIHNob3J0IHdRdWlldE9mZnNldAogICAgICkKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKLSAgICBVSU5UICAgICAgICBpaSA9IDA7CisgICAgdW5zaWduZWQgaW50IGlpID0gMDsKIAotICAgIGlmIChiUmVzZXRRdWlldCA9PSBUUlVFKSB7CisgICAgaWYgKGJSZXNldFF1aWV0ID09IHRydWUpIHsKICAgICAgICAgTUFDdlJlZ0JpdHNPZmYocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19NU1JDVEwsIChNU1JDVExfUVVJRVRUWENISyB8IE1TUkNUTF9RVUlFVEVOKSk7CiAgICAgICAgIGZvcihpaT0wO2lpPE1BWF9RVUlFVF9DT1VOVDtpaSsrKSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5zUXVpZXRbaWldLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPnNRdWlldFtpaV0uYkVuYWJsZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHBEZXZpY2UtPnVRdWlldEVucXVldWUgPSAwOwotICAgICAgICBwRGV2aWNlLT5iRW5hYmxlRmlyc3RRdWlldCA9IEZBTFNFOwotICAgICAgICBwRGV2aWNlLT5iUXVpZXRFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+YkVuYWJsZUZpcnN0UXVpZXQgPSBmYWxzZTsKKyAgICAgICAgcERldmljZS0+YlF1aWV0RW5hYmxlID0gZmFsc2U7CiAgICAgICAgIHBEZXZpY2UtPmJ5UXVpZXRTdGFydENvdW50ID0gYnlRdWlldENvdW50OwogICAgIH0KLSAgICBpZiAocERldmljZS0+c1F1aWV0W3BEZXZpY2UtPnVRdWlldEVucXVldWVdLmJFbmFibGUgPT0gRkFMU0UpIHsKLSAgICAgICAgcERldmljZS0+c1F1aWV0W3BEZXZpY2UtPnVRdWlldEVucXVldWVdLmJFbmFibGUgPSBUUlVFOworICAgIGlmIChwRGV2aWNlLT5zUXVpZXRbcERldmljZS0+dVF1aWV0RW5xdWV1ZV0uYkVuYWJsZSA9PSBmYWxzZSkgeworICAgICAgICBwRGV2aWNlLT5zUXVpZXRbcERldmljZS0+dVF1aWV0RW5xdWV1ZV0uYkVuYWJsZSA9IHRydWU7CiAgICAgICAgIHBEZXZpY2UtPnNRdWlldFtwRGV2aWNlLT51UXVpZXRFbnF1ZXVlXS5ieVBlcmlvZCA9IGJ5UXVpZXRQZXJpb2Q7CiAgICAgICAgIHBEZXZpY2UtPnNRdWlldFtwRGV2aWNlLT51UXVpZXRFbnF1ZXVlXS53RHVyYXRpb24gPSB3UXVpZXREdXJhdGlvbjsKLSAgICAgICAgcERldmljZS0+c1F1aWV0W3BEZXZpY2UtPnVRdWlldEVucXVldWVdLmR3U3RhcnRUaW1lID0gKERXT1JEKSBieVF1aWV0Q291bnQ7CisgICAgICAgIHBEZXZpY2UtPnNRdWlldFtwRGV2aWNlLT51UXVpZXRFbnF1ZXVlXS5kd1N0YXJ0VGltZSA9ICh1bnNpZ25lZCBsb25nKSBieVF1aWV0Q291bnQ7CiAgICAgICAgIHBEZXZpY2UtPnNRdWlldFtwRGV2aWNlLT51UXVpZXRFbnF1ZXVlXS5kd1N0YXJ0VGltZSAqPSBwRGV2aWNlLT53QmVhY29uSW50ZXJ2YWw7CiAgICAgICAgIHBEZXZpY2UtPnNRdWlldFtwRGV2aWNlLT51UXVpZXRFbnF1ZXVlXS5kd1N0YXJ0VGltZSArPSB3UXVpZXRPZmZzZXQ7CiAgICAgICAgIHBEZXZpY2UtPnVRdWlldEVucXVldWUrKzsKQEAgLTE5MTQsNyArMTM0Nyw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2UgY2FuIG5vdCBoYW5kbGUgUXVpZXQgRUlEIG1vcmUKICAgICB9Ci0gICAgcmV0dXJuIChUUlVFKTsKKyAgICByZXR1cm4gKHRydWUpOwogfQogCiAKQEAgLTE5MzIsMjEgKzEzNjUsMjEgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZS4KICAqCiAtKi8KLUJPT0wKK2Jvb2wKIENBUkRiU3RhcnRRdWlldCAoCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgaWkgPSAwOwotICAgIERXT1JEICAgICAgIGR3U3RhcnRUaW1lID0gMHhGRkZGRkZGRjsKLSAgICBVSU5UICAgICAgICB1Q3VycmVudFF1aWV0SW5kZXggPSAwOwotICAgIERXT1JEICAgICAgIGR3TmV4dFRpbWUgPSAwOwotICAgIERXT1JEICAgICAgIGR3R2FwID0gMDsKLSAgICBEV09SRCAgICAgICBkd0R1cmF0aW9uID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaWkgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZHdTdGFydFRpbWUgPSAweEZGRkZGRkZGOworICAgIHVuc2lnbmVkIGludCB1Q3VycmVudFF1aWV0SW5kZXggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZHdOZXh0VGltZSA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBkd0dhcCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBkd0R1cmF0aW9uID0gMDsKIAogICAgIGZvcihpaT0wO2lpPE1BWF9RVUlFVF9DT1VOVDtpaSsrKSB7Ci0gICAgICAgIGlmICgocERldmljZS0+c1F1aWV0W2lpXS5iRW5hYmxlID09IFRSVUUpICYmCisgICAgICAgIGlmICgocERldmljZS0+c1F1aWV0W2lpXS5iRW5hYmxlID09IHRydWUpICYmCiAgICAgICAgICAgICAoZHdTdGFydFRpbWUgPiBwRGV2aWNlLT5zUXVpZXRbaWldLmR3U3RhcnRUaW1lKSkgewogICAgICAgICAgICAgZHdTdGFydFRpbWUgPSBwRGV2aWNlLT5zUXVpZXRbaWldLmR3U3RhcnRUaW1lOwogICAgICAgICAgICAgdUN1cnJlbnRRdWlldEluZGV4ID0gaWk7CkBAIC0xOTU0LDIyICsxMzg3LDIyIEBACiAgICAgfQogICAgIGlmIChkd1N0YXJ0VGltZSA9PSAweEZGRkZGRkZGKSB7CiAgICAgICAgIC8vIG5vIG1vcmUgcXVpZXQKLSAgICAgICAgcERldmljZS0+YlF1aWV0RW5hYmxlID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJRdWlldEVuYWJsZSA9IGZhbHNlOwogICAgICAgICBNQUN2UmVnQml0c09mZihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX01TUkNUTCwgKE1TUkNUTF9RVUlFVFRYQ0hLIHwgTVNSQ1RMX1FVSUVURU4pKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAocERldmljZS0+YlF1aWV0RW5hYmxlID09IEZBTFNFKSB7CisgICAgICAgIGlmIChwRGV2aWNlLT5iUXVpZXRFbmFibGUgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIC8vIGZpcnN0IHF1aWV0CiAgICAgICAgICAgICBwRGV2aWNlLT5ieVF1aWV0U3RhcnRDb3VudC0tOwogICAgICAgICAgICAgZHdOZXh0VGltZSA9IHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLmR3U3RhcnRUaW1lOwogICAgICAgICAgICAgZHdOZXh0VGltZSAlPSBwRGV2aWNlLT53QmVhY29uSW50ZXJ2YWw7CiAgICAgICAgICAgICBNQUN2U2VsZWN0UGFnZTEocERldmljZS0+UG9ydE9mZnNldCk7Ci0gICAgICAgICAgICBWTlN2T3V0UG9ydFcocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUVVJRVRJTklULCAoV09SRCkgZHdOZXh0VGltZSk7Ci0gICAgICAgICAgICBWTlN2T3V0UG9ydFcocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUVVJRVREVVIsIChXT1JEKSBwRGV2aWNlLT5zUXVpZXRbdUN1cnJlbnRRdWlldEluZGV4XS53RHVyYXRpb24pOworICAgICAgICAgICAgVk5Tdk91dFBvcnRXKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1FVSUVUSU5JVCwgKHVuc2lnbmVkIHNob3J0KSBkd05leHRUaW1lKTsKKyAgICAgICAgICAgIFZOU3ZPdXRQb3J0VyhwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19RVUlFVERVUiwgKHVuc2lnbmVkIHNob3J0KSBwRGV2aWNlLT5zUXVpZXRbdUN1cnJlbnRRdWlldEluZGV4XS53RHVyYXRpb24pOwogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJ5UXVpZXRTdGFydENvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5iRW5hYmxlRmlyc3RRdWlldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJFbmFibGVGaXJzdFF1aWV0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX01TUkNUTCwgKE1TUkNUTF9RVUlFVFRYQ0hLIHwgTVNSQ1RMX1FVSUVURU4pKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUZpcnN0UXVpZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJFbmFibGVGaXJzdFF1aWV0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE5NzcsOCArMTQxMCw4IEBACiAgICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCB3aXRoIHByZXZpb3VzIFF1aWV0CiAgICAgICAgICAgICAgICAgZHdHYXAgPSAgcERldmljZS0+ZHdDdXJyZW50UXVpZXRFbmRUaW1lIC0gcERldmljZS0+c1F1aWV0W3VDdXJyZW50UXVpZXRJbmRleF0uZHdTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgaWYgKGR3R2FwID49IHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLndEdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gRkFMU0UgdG8gaW5kaWNhdGUgbmV4dCBxdWlldCBleHBpcmVkLCBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgbmV4dCBxdWlldCBleHBpcmVkLCBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkd0R1cmF0aW9uID0gcERldmljZS0+c1F1aWV0W3VDdXJyZW50UXVpZXRJbmRleF0ud0R1cmF0aW9uIC0gZHdHYXA7CiAgICAgICAgICAgICAgICAgZHdHYXAgPSAwOwpAQCAtMTk4OCw5NCArMTQyMSwzNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gc2V0IEdBUCBhbmQgTmV4dCBkdXJhdGlvbgogICAgICAgICAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgICAgICAgICAgVk5Tdk91dFBvcnRXKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1FVSUVUR0FQLCAoV09SRCkgZHdHYXApOwotICAgICAgICAgICAgVk5Tdk91dFBvcnRXKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1FVSUVURFVSLCAoV09SRCkgZHdEdXJhdGlvbik7CisgICAgICAgICAgICBWTlN2T3V0UG9ydFcocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUVVJRVRHQVAsICh1bnNpZ25lZCBzaG9ydCkgZHdHYXApOworICAgICAgICAgICAgVk5Tdk91dFBvcnRXKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1FVSUVURFVSLCAodW5zaWduZWQgc2hvcnQpIGR3RHVyYXRpb24pOwogICAgICAgICAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX01TUkNUTCwgTVNSQ1RMX1FVSUVUUlBUKTsKICAgICAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5iUXVpZXRFbmFibGUgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5iUXVpZXRFbmFibGUgPSB0cnVlOwogICAgICAgICBwRGV2aWNlLT5kd0N1cnJlbnRRdWlldEVuZFRpbWUgPSBwRGV2aWNlLT5zUXVpZXRbdUN1cnJlbnRRdWlldEluZGV4XS5kd1N0YXJ0VGltZTsKICAgICAgICAgcERldmljZS0+ZHdDdXJyZW50UXVpZXRFbmRUaW1lICs9IHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLndEdXJhdGlvbjsKICAgICAgICAgaWYgKHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLmJ5UGVyaW9kID09IDApIHsKICAgICAgICAgICAgIC8vIG5vdCBwZXJpb2QgZGlzYWJsZSBjdXJyZW50IHF1aWV0IGVsZW1lbnQKLSAgICAgICAgICAgIHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLmJFbmFibGUgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHNldCBuZXh0IHBlcmlvZCBzdGFydCB0aW1lCi0gICAgICAgICAgICBkd05leHRUaW1lID0gKERXT1JEKSBwRGV2aWNlLT5zUXVpZXRbdUN1cnJlbnRRdWlldEluZGV4XS5ieVBlcmlvZDsKKyAgICAgICAgICAgIGR3TmV4dFRpbWUgPSAodW5zaWduZWQgbG9uZykgcERldmljZS0+c1F1aWV0W3VDdXJyZW50UXVpZXRJbmRleF0uYnlQZXJpb2Q7CiAgICAgICAgICAgICBkd05leHRUaW1lICo9IHBEZXZpY2UtPndCZWFjb25JbnRlcnZhbDsKICAgICAgICAgICAgIHBEZXZpY2UtPnNRdWlldFt1Q3VycmVudFF1aWV0SW5kZXhdLmR3U3RhcnRUaW1lID0gZHdOZXh0VGltZTsKICAgICAgICAgfQogICAgICAgICBpZiAocERldmljZS0+ZHdDdXJyZW50UXVpZXRFbmRUaW1lID4gMHg4MDAxMDAwMCkgewogICAgICAgICAgICAgLy8gZGVjcmVhbWVudCBhbGwgdGltZSB0byBhdm9pZCB3cmFwIGFyb3VuZAogICAgICAgICAgICAgZm9yKGlpPTA7aWk8TUFYX1FVSUVUX0NPVU5UO2lpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocERldmljZS0+c1F1aWV0W2lpXS5iRW5hYmxlID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAocERldmljZS0+c1F1aWV0W2lpXS5iRW5hYmxlID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+c1F1aWV0W2lpXS5kd1N0YXJ0VGltZSAtPSAweDgwMDAwMDAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBEZXZpY2UtPmR3Q3VycmVudFF1aWV0RW5kVGltZSAtPSAweDgwMDAwMDAwOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAoVFJVRSk7Ci19Ci0KLQotLyoKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIFNldCBDaGFubmVsIEluZm8gb2YgQ291bnRyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiAgSW46Ci0gKiAgICAgIGhEZXZpY2VDb250ZXh0IC0gZGV2aWNlIHN0cnVjdHVyZSBwb2ludAotICogIE91dDoKLSAqICAgICAgbm9uZQotICoKLSAqIFJldHVybiBWYWx1ZTogbm9uZS4KLSAqCi0tKi8KLXZvaWQKLUNBUkR2U2V0Q291bnRyeUluZm8gKAotICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIENBUkRfUEhZX1RZUEUgICAgZVBIWVR5cGUsCi0gICAgdm9pZCAqcElFCi0gICAgKQotewotICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICBpaSA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1dSA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICBzdGVwID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgICAgIHVOdW1PZkNvdW50cnlJbmZvID0gMDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5Q2ggPSAwOwotICAgIFBXTEFOX0lFX0NPVU5UUlkgICAgcElFX0NvdW50cnkgPSAoUFdMQU5fSUVfQ09VTlRSWSkgcElFOwotCi0KLSAgICB1TnVtT2ZDb3VudHJ5SW5mbyA9IChwSUVfQ291bnRyeS0+bGVuIC0gMyk7Ci0gICAgdU51bU9mQ291bnRyeUluZm8gLz0gMzsKLQotICAgIGlmIChlUEhZVHlwZSA9PSBQSFlfVFlQRV8xMUEpIHsKLSAgICAgICAgcERldmljZS0+YkNvdW50cnlJbmZvNUcgPSBUUlVFOwotICAgICAgICBmb3IoaWk9Q0JfTUFYX0NIQU5ORUxfMjRHKzE7aWk8PUNBUkRfTUFYX0NIQU5ORUxfVEJMO2lpKyspIHsKLSAgICAgICAgICAgIHNDaGFubmVsVGJsW2lpXS5iVmFsaWQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBzdGVwID0gNDsKLSAgICB9IGVsc2UgewotICAgICAgICBwRGV2aWNlLT5iQ291bnRyeUluZm8yNEcgPSBUUlVFOwotICAgICAgICBmb3IoaWk9MTtpaTw9Q0JfTUFYX0NIQU5ORUxfMjRHO2lpKyspIHsKLSAgICAgICAgICAgIHNDaGFubmVsVGJsW2lpXS5iVmFsaWQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBzdGVwID0gMTsKLSAgICB9Ci0gICAgcERldmljZS0+YWJ5Q291bnRyeUNvZGVbMF0gPSBwSUVfQ291bnRyeS0+YWJ5Q291bnRyeVN0cmluZ1swXTsKLSAgICBwRGV2aWNlLT5hYnlDb3VudHJ5Q29kZVsxXSA9IHBJRV9Db3VudHJ5LT5hYnlDb3VudHJ5U3RyaW5nWzFdOwotICAgIHBEZXZpY2UtPmFieUNvdW50cnlDb2RlWzJdID0gcElFX0NvdW50cnktPmFieUNvdW50cnlTdHJpbmdbMl07Ci0KLSAgICBmb3IoaWk9MDtpaTx1TnVtT2ZDb3VudHJ5SW5mbztpaSsrKSB7Ci0gICAgICAgIGZvcih1dT0wO3V1PHBJRV9Db3VudHJ5LT5hYnlDb3VudHJ5SW5mb1tpaSozKzFdO3V1KyspIHsKLSAgICAgICAgICAgIGJ5Q2ggPSBDQVJEYnlHZXRDaGFubmVsTWFwcGluZyhwRGV2aWNlLCAoQllURSkocElFX0NvdW50cnktPmFieUNvdW50cnlJbmZvW2lpKjNdK3N0ZXAqdXUpLCBlUEhZVHlwZSk7Ci0gICAgICAgICAgICBzQ2hhbm5lbFRibFtieUNoXS5iVmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgcERldmljZS0+YWJ5UmVnUHdyW2J5Q2hdID0gcElFX0NvdW50cnktPmFieUNvdW50cnlJbmZvW2lpKjMrMl07Ci0gICAgICAgIH0KLSAgICB9CisgICAgcmV0dXJuICh0cnVlKTsKIH0KIAogLyoKQEAgLTIwOTUsMTggKzE0NjgsMTggQEAKIHZvaWQKIENBUkR2U2V0UG93ZXJDb25zdHJhaW50ICgKICAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKLSAgICBCWVRFICAgICAgICAgICAgIGJ5Q2hhbm5lbCwKLSAgICBJOCAgICAgICAgICAgICAgIGJ5UG93ZXIKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbCwKKyAgICBjaGFyIGJ5UG93ZXIKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7CiAKICAgICBpZiAoYnlDaGFubmVsID4gQ0JfTUFYX0NIQU5ORUxfMjRHKSB7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iQ291bnRyeUluZm81RyA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwRGV2aWNlLT5iQ291bnRyeUluZm81RyA9PSB0cnVlKSB7CiAgICAgICAgICAgICBwRGV2aWNlLT5hYnlMb2NhbFB3cltieUNoYW5uZWxdID0gcERldmljZS0+YWJ5UmVnUHdyW2J5Q2hhbm5lbF0gLSBieVBvd2VyOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJDb3VudHJ5SW5mbzI0RyA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwRGV2aWNlLT5iQ291bnRyeUluZm8yNEcgPT0gdHJ1ZSkgewogICAgICAgICAgICAgcERldmljZS0+YWJ5TG9jYWxQd3JbYnlDaGFubmVsXSA9IHBEZXZpY2UtPmFieVJlZ1B3cltieUNoYW5uZWxdIC0gYnlQb3dlcjsKICAgICAgICAgfQogICAgIH0KQEAgLTIxMzAsMTIgKzE1MDMsMTIgQEAKIHZvaWQKIENBUkR2R2V0UG93ZXJDYXBhYmlsaXR5ICgKICAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKLSAgICBQQllURSAgICAgICAgICAgcGJ5TWluUG93ZXIsCi0gICAgUEJZVEUgICAgICAgICAgIHBieU1heFBvd2VyCisgICAgdW5zaWduZWQgY2hhciAqcGJ5TWluUG93ZXIsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5TWF4UG93ZXIKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgQllURSAgICAgICAgYnlEZWMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlEZWMgPSAwOwogCiAgICAgKnBieU1heFBvd2VyID0gcERldmljZS0+YWJ5T0ZETURlZmF1bHRQd3JbcERldmljZS0+YnlDdXJyZW50Q2hdOwogICAgIGJ5RGVjID0gcERldmljZS0+YWJ5T0ZETVB3clRibFtwRGV2aWNlLT5ieUN1cnJlbnRDaF07CkBAIC0yMTQ4LDk4ICsxNTIxLDYgQEAKICAgICAqcGJ5TWluUG93ZXIgPSBwRGV2aWNlLT5hYnlPRkRNRGVmYXVsdFB3cltwRGV2aWNlLT5ieUN1cnJlbnRDaF0gLSBieURlYzsKIH0KIAotCi0vKgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgU2V0IFN1cHBvcnQgQ2hhbm5lbHMgSUUgZGVmaW5lZCBpbiA4MDIuMTFoCi0gKgotICogUGFyYW1ldGVyczoKLSAqICBJbjoKLSAqICAgICAgaERldmljZUNvbnRleHQgLSBkZXZpY2Ugc3RydWN0dXJlIHBvaW50Ci0gKiAgT3V0OgotICogICAgICBub25lCi0gKgotICogUmV0dXJuIFZhbHVlOiBub25lLgotICoKLS0qLwotQllURQotQ0FSRGJ5U2V0U3VwcG9ydENoYW5uZWxzICgKLSAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKLSAgICBQQllURSAgICAgICAgcGJ5SUVzCi0gICAgKQotewotICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICBpaTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5Q291bnQ7Ci0gICAgUFdMQU5fSUVfU1VQUF9DSCAgICBwSUUgPSAoUFdMQU5fSUVfU1VQUF9DSCkgcGJ5SUVzOwotICAgIFBCWVRFICAgICAgICAgICAgICAgcGJ5Q2hUdXBwbGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUxlbiA9IDA7Ci0KLQotICAgIHBJRS0+YnlFbGVtZW50SUQgPSBXTEFOX0VJRF9TVVBQX0NIOwotICAgIHBJRS0+bGVuID0gMDsKLSAgICBwYnlDaFR1cHBsZSA9IHBJRS0+YWJ5Q2hhbm5lbFR1cGxlOwotICAgIGJ5TGVuID0gMjsKLSAgICAvLyBsb3dlciBiYW5kCi0gICAgYnlDb3VudCA9IDA7Ci0gICAgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFsyOF0gPT0gVFJVRSkgewotICAgICAgICBmb3IgKGlpPTI4O2lpPDM2O2lpKz0yKSB7Ci0gICAgICAgICAgICBpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0W2lpXSA9PSBUUlVFKSB7Ci0gICAgICAgICAgICAgICAgYnlDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICpwYnlDaFR1cHBsZSsrID0gMzQ7Ci0gICAgICAgICpwYnlDaFR1cHBsZSsrID0gYnlDb3VudDsKLSAgICAgICAgYnlMZW4gKz0gMjsKLSAgICB9IGVsc2UgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFsyOV0gPT0gVFJVRSkgewotICAgICAgICBmb3IgKGlpPTI5O2lpPDM2O2lpKz0yKSB7Ci0gICAgICAgICAgICBpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0W2lpXSA9PSBUUlVFKSB7Ci0gICAgICAgICAgICAgICAgYnlDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICpwYnlDaFR1cHBsZSsrID0gMzY7Ci0gICAgICAgICpwYnlDaFR1cHBsZSsrID0gYnlDb3VudDsKLSAgICAgICAgYnlMZW4gKz0gMjsKLSAgICB9Ci0gICAgLy8gbWlkZGxlIGJhbmQKLSAgICBieUNvdW50ID0gMDsKLSAgICBpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0WzM2XSA9PSBUUlVFKSB7Ci0gICAgICAgIGZvciAoaWk9MzY7aWk8NDA7aWkrKykgewotICAgICAgICAgICAgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gPT0gVFJVRSkgewotICAgICAgICAgICAgICAgIGJ5Q291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqcGJ5Q2hUdXBwbGUrKyA9IDUyOwotICAgICAgICAqcGJ5Q2hUdXBwbGUrKyA9IGJ5Q291bnQ7Ci0gICAgICAgIGJ5TGVuICs9IDI7Ci0gICAgfQotICAgIC8vIGhpZ2hlciBiYW5kCi0gICAgYnlDb3VudCA9IDA7Ci0gICAgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFs0MF0gPT0gVFJVRSkgewotICAgICAgICBmb3IgKGlpPTQwO2lpPDUxO2lpKyspIHsKLSAgICAgICAgICAgIGlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbaWldID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICBieUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKnBieUNoVHVwcGxlKysgPSAxMDA7Ci0gICAgICAgICpwYnlDaFR1cHBsZSsrID0gYnlDb3VudDsKLSAgICAgICAgYnlMZW4gKz0gMjsKLSAgICB9IGVsc2UgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFs1MV0gPT0gVFJVRSkgewotICAgICAgICBmb3IgKGlpPTUxO2lpPDU2O2lpKyspIHsKLSAgICAgICAgICAgIGlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbaWldID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICBieUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKnBieUNoVHVwcGxlKysgPSAxNDk7Ci0gICAgICAgICpwYnlDaFR1cHBsZSsrID0gYnlDb3VudDsKLSAgICAgICAgYnlMZW4gKz0gMjsKLSAgICB9Ci0gICAgcElFLT5sZW4gKz0gKGJ5TGVuIC0gMik7Ci0gICAgcmV0dXJuIChieUxlbik7Ci19Ci0KLQogLyoKICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTIyNTMsOCArMTUzNCw4IEBACiAgKgogICogUmV0dXJuIFZhbHVlOiBub25lLgogICoKLS0qLwotSTgKKyAqLworY2hhcgogQ0FSRGJ5R2V0VHJhbnNtaXRQb3dlciAoCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIKICAgICApCkBAIC0yMjY0LDE2MSArMTU0NSw2IEBACiAgICAgcmV0dXJuIChwRGV2aWNlLT5ieUN1clB3cmRCbSk7CiB9CiAKLQotQk9PTAotQ0FSRGJDaGFubmVsR2V0TGlzdCAoCi0gICAgIFVJTlQgICAgICAgdUNvdW50cnlDb2RlSWR4LAotICAgIFBCWVRFICAgICAgcGJ5Q2hhbm5lbFRhYmxlCi0gICAgKQotewotICAgIGlmICh1Q291bnRyeUNvZGVJZHggPj0gQ0NPREVfTUFYKSB7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLSAgICBtZW1jcHkocGJ5Q2hhbm5lbFRhYmxlLCBDaGFubmVsUnVsZVRhYlt1Q291bnRyeUNvZGVJZHhdLmJDaGFubmVsSWR4TGlzdCwgQ0JfTUFYX0NIQU5ORUwpOwotICAgIHJldHVybiAoVFJVRSk7Ci19Ci0KLQotdm9pZAotQ0FSRHZTZXRDb3VudHJ5SUUoCi0gICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgdm9pZCAqcElFCi0gICAgKQotewotICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICBpaTsKLSAgICBQV0xBTl9JRV9DT1VOVFJZICAgIHBJRUNvdW50cnkgPSAoUFdMQU5fSUVfQ09VTlRSWSkgcElFOwotCi0gICAgcElFQ291bnRyeS0+YnlFbGVtZW50SUQgPSBXTEFOX0VJRF9DT1VOVFJZOwotICAgIHBJRUNvdW50cnktPmxlbiA9IDA7Ci0gICAgcElFQ291bnRyeS0+YWJ5Q291bnRyeVN0cmluZ1swXSA9IENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmNoQ291bnRyeUNvZGVbMF07Ci0gICAgcElFQ291bnRyeS0+YWJ5Q291bnRyeVN0cmluZ1sxXSA9IENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmNoQ291bnRyeUNvZGVbMV07Ci0gICAgcElFQ291bnRyeS0+YWJ5Q291bnRyeVN0cmluZ1syXSA9ICcgJzsKLSAgICBmb3IgKGlpID0gQ0JfTUFYX0NIQU5ORUxfMjRHOyBpaSA8IENCX01BWF9DSEFOTkVMOyBpaSsrICkgewotICAgICAgICBpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0W2lpXSAhPSAwKSB7Ci0gICAgICAgICAgICBwSUVDb3VudHJ5LT5hYnlDb3VudHJ5SW5mb1twSUVDb3VudHJ5LT5sZW4rK10gPSBzQ2hhbm5lbFRibFtpaSsxXS5ieUNoYW5uZWxOdW1iZXI7Ci0gICAgICAgICAgICBwSUVDb3VudHJ5LT5hYnlDb3VudHJ5SW5mb1twSUVDb3VudHJ5LT5sZW4rK10gPSAxOwotICAgICAgICAgICAgcElFQ291bnRyeS0+YWJ5Q291bnRyeUluZm9bcElFQ291bnRyeS0+bGVuKytdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcElFQ291bnRyeS0+bGVuICs9IDM7Ci19Ci0KLQotQk9PTAotQ0FSRGJHZXRDaGFubmVsTWFwSW5mbygKLSAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKLSAgICBVSU5UICAgICAgICAgdUNoYW5uZWxJbmRleCwKLSAgICBQQllURSAgICAgICBwYnlDaGFubmVsTnVtYmVyLAotICAgIFBCWVRFICAgICAgIHBieU1hcAotICAgICkKLXsKLS8vICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0KLSAgICBpZiAodUNoYW5uZWxJbmRleCA+IENCX01BWF9DSEFOTkVMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgKnBieUNoYW5uZWxOdW1iZXIgPSBzQ2hhbm5lbFRibFt1Q2hhbm5lbEluZGV4XS5ieUNoYW5uZWxOdW1iZXI7Ci0gICAgKnBieU1hcCA9IHNDaGFubmVsVGJsW3VDaGFubmVsSW5kZXhdLmJ5TUFQOwotICAgIHJldHVybiBzQ2hhbm5lbFRibFt1Q2hhbm5lbEluZGV4XS5iVmFsaWQ7Ci19Ci0KLQotdm9pZAotQ0FSRHZTZXRDaGFubmVsTWFwSW5mbygKLSAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKLSAgICBVSU5UICAgICAgICAgdUNoYW5uZWxJbmRleCwKLSAgICBCWVRFICAgICAgICAgYnlNYXAKLSAgICApCi17Ci0vLyAgICBQU0RldmljZSAgICAgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotCi0gICAgaWYgKHVDaGFubmVsSW5kZXggPiBDQl9NQVhfQ0hBTk5FTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNDaGFubmVsVGJsW3VDaGFubmVsSW5kZXhdLmJ5TUFQIHw9IGJ5TWFwOwotfQotCi0KLXZvaWQKLUNBUkR2Q2xlYXJDaGFubmVsTWFwSW5mbygKLSAgICB2b2lkICpwRGV2aWNlSGFuZGxlcgotICAgICkKLXsKLS8vICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIFVJTlQgICAgICAgIGlpID0gMDsKLQotICAgIGZvciAoaWkgPSAxOyBpaSA8PSAgQ0JfTUFYX0NIQU5ORUw7IGlpKyspIHsKLSAgICAgICAgc0NoYW5uZWxUYmxbaWldLmJ5TUFQID0gMDsKLSAgICB9Ci19Ci0KLQotQllURQotQ0FSRGJ5QXV0b0NoYW5uZWxTZWxlY3QoCi0gICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgQ0FSRF9QSFlfVFlQRSAgIGVQSFlUeXBlCi0gICAgKQotewotLy8gICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIFVJTlQgICAgICAgICAgICBpaSA9IDA7Ci0gICAgQllURSAgICAgICAgICAgIGJ5T3B0aW9uQ2hhbm5lbCA9IDA7Ci0gICAgSU5UICAgICAgICAgICAgIGFpV2VpZ2h0W0NCX01BWF9DSEFOTkVMXzI0RysxXSA9IHstMTAwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwotCi0gICAgaWYgKGVQSFlUeXBlID09IFBIWV9UWVBFXzExQSkgewotICAgICAgICBmb3IoaWk9Q0JfTUFYX0NIQU5ORUxfMjRHKzE7aWk8PUNCX01BWF9DSEFOTkVMO2lpKyspIHsKLSAgICAgICAgICAgIGlmIChzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnlPcHRpb25DaGFubmVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnlPcHRpb25DaGFubmVsID0gKEJZVEUpIGlpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc0NoYW5uZWxUYmxbaWldLmJ5TUFQID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQllURSkgaWkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICEoc0NoYW5uZWxUYmxbaWldLmJ5TUFQICYgMHgwOCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnlPcHRpb25DaGFubmVsID0gKEJZVEUpIGlpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ5T3B0aW9uQ2hhbm5lbCA9IDA7Ci0gICAgICAgIGZvcihpaT0xO2lpPD1DQl9NQVhfQ0hBTk5FTF8yNEc7aWkrKykgewotICAgICAgICAgICAgaWYgKHNDaGFubmVsVGJsW2lpXS5iVmFsaWQgPT0gVFJVRSkgewotICAgICAgICAgICAgICAgIGlmIChzQ2hhbm5lbFRibFtpaV0uYnlNQVAgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBhaVdlaWdodFtpaV0gKz0gMTAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc0NoYW5uZWxUYmxbaWldLmJ5TUFQICYgMHgwMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPiAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaVdlaWdodFtpaS0zXSAtPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaVdlaWdodFtpaS0yXSAtPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaVdlaWdodFtpaS0xXSAtPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhaVdlaWdodFtpaV0gLT0gODA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpaSA8IENCX01BWF9DSEFOTkVMXzI0RykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWlXZWlnaHRbaWkrMV0gLT0gNDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlpIDwgKENCX01BWF9DSEFOTkVMXzI0RyAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaVdlaWdodFtpaSsyXSAtPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPCAoQ0JfTUFYX0NIQU5ORUxfMjRHIC0gMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFpV2VpZ2h0W2lpKzNdIC09IDEwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvcihpaT0xO2lpPD1DQl9NQVhfQ0hBTk5FTF8yNEc7aWkrKykgewotICAgICAgICAgICAgaWYgKChzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID09IFRSVUUpICYmCi0gICAgICAgICAgICAgICAgKGFpV2VpZ2h0W2lpXSA+IGFpV2VpZ2h0W2J5T3B0aW9uQ2hhbm5lbF0pKSB7Ci0gICAgICAgICAgICAgICAgYnlPcHRpb25DaGFubmVsID0gKEJZVEUpIGlpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoYnlPcHRpb25DaGFubmVsKTsKLX0KLQotCi0KIC8veHh4CiB2b2lkCiBDQVJEdlNhZmVSZXNldFR4ICgKQEAgLTI0MjYsNyArMTU1Miw3IEBACiAgICAgKQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIFVJTlQgICAgICAgIHV1OworICAgIHVuc2lnbmVkIGludCB1dTsKICAgICBQU1R4RGVzYyAgICBwQ3VyclREOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBURCBpbmRleApAQCAtMjQ4Miw3ICsxNjA4LDcgQEAKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgVUlOVCAgICAgICAgdXU7CisgICAgdW5zaWduZWQgaW50IHV1OwogICAgIFBTUnhEZXNjICAgIHBEZXNjOwogCiAKQEAgLTI0OTQsMTcgKzE2MjAsMTcgQEAKICAgICAvLyBpbml0IHN0YXRlLCBhbGwgUkQgaXMgY2hpcCdzCiAgICAgZm9yICh1dSA9IDA7IHV1IDwgcERldmljZS0+c09wdHMublJ4RGVzY3MwOyB1dSsrKSB7CiAgICAgICAgIHBEZXNjID0mKHBEZXZpY2UtPmFSRDBSaW5nW3V1XSk7Ci0gICAgICAgIHBEZXNjLT5tX3JkMFJEMC53UmVzQ291bnQgPSAoV09SRCkocERldmljZS0+cnhfYnVmX3N6KTsKKyAgICAgICAgcERlc2MtPm1fcmQwUkQwLndSZXNDb3VudCA9ICh1bnNpZ25lZCBzaG9ydCkocERldmljZS0+cnhfYnVmX3N6KTsKICAgICAgICAgcERlc2MtPm1fcmQwUkQwLmYxT3duZXI9T1dORURfQllfTklDOwotICAgICAgICBwRGVzYy0+bV9yZDFSRDEud1JlcUNvdW50ID0gKFdPUkQpKHBEZXZpY2UtPnJ4X2J1Zl9zeik7CisgICAgICAgIHBEZXNjLT5tX3JkMVJEMS53UmVxQ291bnQgPSAodW5zaWduZWQgc2hvcnQpKHBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAgICAgfQogCiAgICAgLy8gaW5pdCBzdGF0ZSwgYWxsIFJEIGlzIGNoaXAncwogICAgIGZvciAodXUgPSAwOyB1dSA8IHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMTsgdXUrKykgewogICAgICAgICBwRGVzYyA9JihwRGV2aWNlLT5hUkQxUmluZ1t1dV0pOwotICAgICAgICBwRGVzYy0+bV9yZDBSRDAud1Jlc0NvdW50ID0gKFdPUkQpKHBEZXZpY2UtPnJ4X2J1Zl9zeik7CisgICAgICAgIHBEZXNjLT5tX3JkMFJEMC53UmVzQ291bnQgPSAodW5zaWduZWQgc2hvcnQpKHBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAgICAgICAgIHBEZXNjLT5tX3JkMFJEMC5mMU93bmVyPU9XTkVEX0JZX05JQzsKLSAgICAgICAgcERlc2MtPm1fcmQxUkQxLndSZXFDb3VudCA9IChXT1JEKShwRGV2aWNlLT5yeF9idWZfc3opOworICAgICAgICBwRGVzYy0+bV9yZDFSRDEud1JlcUNvdW50ID0gKHVuc2lnbmVkIHNob3J0KShwRGV2aWNlLT5yeF9idWZfc3opOwogICAgIH0KIAogICAgIHBEZXZpY2UtPmNiREZDQiA9IENCX01BWF9SWF9GUkFHOwpAQCAtMjUzNywxOCArMTY2MywxOCBAQAogICogUmV0dXJuIFZhbHVlOiByZXNwb25zZSBDb250cm9sIGZyYW1lIHJhdGUKICAqCiAgKi8KLVdPUkQgQ0FSRHdHZXRDQ0tDb250cm9sUmF0ZSh2b2lkICpwRGV2aWNlSGFuZGxlciwgV09SRCB3UmF0ZUlkeCkKK3Vuc2lnbmVkIHNob3J0IENBUkR3R2V0Q0NLQ29udHJvbFJhdGUodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIHNob3J0IHdSYXRlSWR4KQogewogICAgIFBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIFVJTlQgdWkgPSAoVUlOVCl3UmF0ZUlkeDsKKyAgICB1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KSB3UmF0ZUlkeDsKIAogICAgIHdoaWxlICh1aSA+IFJBVEVfMU0pIHsKLSAgICAgICAgaWYgKHBEZXZpY2UtPndCYXNpY1JhdGUgJiAoKFdPUkQpMSA8PCB1aSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoV09SRCl1aTsKKyAgICAgICAgaWYgKHBEZXZpY2UtPndCYXNpY1JhdGUgJiAoKHVuc2lnbmVkIHNob3J0KTEgPDwgdWkpKSB7CisgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KXVpOwogICAgICAgICB9CiAgICAgICAgIHVpIC0tOwogICAgIH0KLSAgICByZXR1cm4gKFdPUkQpUkFURV8xTTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KVJBVEVfMU07CiB9CiAKIC8qCkBAIC0yNTY0LDEwICsxNjkwLDEwIEBACiAgKiBSZXR1cm4gVmFsdWU6IHJlc3BvbnNlIENvbnRyb2wgZnJhbWUgcmF0ZQogICoKICAqLwotV09SRCBDQVJEd0dldE9GRE1Db250cm9sUmF0ZSAodm9pZCAqcERldmljZUhhbmRsZXIsIFdPUkQgd1JhdGVJZHgpCit1bnNpZ25lZCBzaG9ydCBDQVJEd0dldE9GRE1Db250cm9sUmF0ZSAodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIHNob3J0IHdSYXRlSWR4KQogewogICAgIFBTRGV2aWNlIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIFVJTlQgdWkgPSAoVUlOVCl3UmF0ZUlkeDsKKyAgICB1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KSB3UmF0ZUlkeDsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQkFTSUMgUkFURTogJVhcbiIsIHBEZXZpY2UtPndCYXNpY1JhdGUpOwogCkBAIC0yNTc4LDE0ICsxNzA0LDE0IEBACiAgICAgICAgIHJldHVybiB3UmF0ZUlkeDsKICAgICB9CiAgICAgd2hpbGUgKHVpID4gUkFURV8xMU0pIHsKLSAgICAgICAgaWYgKHBEZXZpY2UtPndCYXNpY1JhdGUgJiAoKFdPUkQpMSA8PCB1aSkpIHsKKyAgICAgICAgaWYgKHBEZXZpY2UtPndCYXNpY1JhdGUgJiAoKHVuc2lnbmVkIHNob3J0KTEgPDwgdWkpKSB7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkNBUkR3R2V0T0ZETUNvbnRyb2xSYXRlIDogJWRcbiIsIHVpKTsKLSAgICAgICAgICAgIHJldHVybiAoV09SRCl1aTsKKyAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgc2hvcnQpdWk7CiAgICAgICAgIH0KICAgICAgICAgdWkgLS07CiAgICAgfQogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQ0FSRHdHZXRPRkRNQ29udHJvbFJhdGU6IDZNXG4iKTsKLSAgICByZXR1cm4gKFdPUkQpUkFURV8yNE07CisgICAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydClSQVRFXzI0TTsKIH0KIAogCkBAIC0yNjA0LDkgKzE3MzAsOSBAQAogdm9pZCBDQVJEdlNldFJTUElORiAodm9pZCAqcERldmljZUhhbmRsZXIsIENBUkRfUEhZX1RZUEUgZVBIWVR5cGUpCiB7CiAgICAgUFNEZXZpY2UgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgQllURSAgYnlTZXJ2ID0gMHgwMCwgYnlTaWduYWwgPSAweDAwOyAvL0ZvciBDQ0sKLSAgICBXT1JEICB3TGVuID0gMHgwMDAwOwotICAgIEJZVEUgIGJ5VHhSYXRlLCBieVJzdlRpbWU7ICAgICAgICAgICAgIC8vRm9yIE9GRE0KKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydiA9IDB4MDAsIGJ5U2lnbmFsID0gMHgwMDsgLy9Gb3IgQ0NLCisgICAgdW5zaWduZWQgc2hvcnQgd0xlbiA9IDB4MDAwMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VHhSYXRlLCBieVJzdlRpbWU7ICAgICAgICAgICAgIC8vRm9yIE9GRE0KIAogICAgIC8vU2V0IHRvIFBhZ2UxCiAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwpAQCAtMjczMSw3ICsxODU3LDcgQEAKICAgICAvL1NldCBTSUZTLCBESUZTLCBFSUZTLCBTbG90VGltZSwgQ3dNaW4KICAgICBQU0RldmljZSBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKIAotICAgIEJZVEUgYnlNYXhNaW4gPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlNYXhNaW4gPSAwOwogICAgIGlmIChwRGV2aWNlLT5ieVBhY2tldFR5cGU9PVBLX1RZUEVfMTFBKSB7Ly8wMDAwIDAwMDAgMDAwMCAwMDAwLDExYQogICAgICAgICBwRGV2aWNlLT51U2xvdCA9IENfU0xPVF9TSE9SVDsKICAgICAgICAgcERldmljZS0+dVNJRlMgPSBDX1NJRlNfQTsKQEAgLTI3NjgsMjcgKzE4OTQsMjcgQEAKICAgICBwRGV2aWNlLT51RUlGUyA9IENfRUlGUzsKICAgICBpZiAocERldmljZS0+YnlSRlR5cGUgPT0gUkZfUkZNRDI5NTkpIHsKICAgICAgICAgLy8gYmNzIFRYX1BFIHdpbGwgcmVzZXJ2ZSAzIHVzCi0gICAgICAgIFZOU3ZPdXRQb3J0QihwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19TSUZTLCAoQllURSkocERldmljZS0+dVNJRlMgLSAzKSk7Ci0gICAgICAgIFZOU3ZPdXRQb3J0QihwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19ESUZTLCAoQllURSkocERldmljZS0+dURJRlMgLSAzKSk7CisgICAgICAgIFZOU3ZPdXRQb3J0QihwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19TSUZTLCAodW5zaWduZWQgY2hhcikocERldmljZS0+dVNJRlMgLSAzKSk7CisgICAgICAgIFZOU3ZPdXRQb3J0QihwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19ESUZTLCAodW5zaWduZWQgY2hhcikocERldmljZS0+dURJRlMgLSAzKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1NJRlMsIChCWVRFKXBEZXZpY2UtPnVTSUZTKTsKLSAgICAgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX0RJRlMsIChCWVRFKXBEZXZpY2UtPnVESUZTKTsKKyAgICAgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1NJRlMsICh1bnNpZ25lZCBjaGFyKXBEZXZpY2UtPnVTSUZTKTsKKyAgICAgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX0RJRlMsICh1bnNpZ25lZCBjaGFyKXBEZXZpY2UtPnVESUZTKTsKICAgICB9Ci0gICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX0VJRlMsIChCWVRFKXBEZXZpY2UtPnVFSUZTKTsKLSAgICBWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfU0xPVCwgKEJZVEUpcERldmljZS0+dVNsb3QpOworICAgIFZOU3ZPdXRQb3J0QihwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19FSUZTLCAodW5zaWduZWQgY2hhcilwRGV2aWNlLT51RUlGUyk7CisgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1NMT1QsICh1bnNpZ25lZCBjaGFyKXBEZXZpY2UtPnVTbG90KTsKICAgICBieU1heE1pbiB8PSAweEEwOy8vMTAxMCAxMTExLENfQ1dNQVggPSAxMDIzCi0gICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX0NXTUFYTUlOMCwgKEJZVEUpYnlNYXhNaW4pOworICAgIFZOU3ZPdXRQb3J0QihwRGV2aWNlLT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19DV01BWE1JTjAsICh1bnNpZ25lZCBjaGFyKWJ5TWF4TWluKTsKIH0KIAogdm9pZCBDQVJEdlVwZGF0ZUJhc2ljVG9wUmF0ZSAodm9pZCAqcERldmljZUhhbmRsZXIpCiB7CiAgICAgUFNEZXZpY2UgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci0gICAgQllURSBieVRvcE9GRE0gPSBSQVRFXzI0TSwgYnlUb3BDQ0sgPSBSQVRFXzFNOwotICAgIEJZVEUgaWk7CisgICAgdW5zaWduZWQgY2hhciBieVRvcE9GRE0gPSBSQVRFXzI0TSwgYnlUb3BDQ0sgPSBSQVRFXzFNOworICAgIHVuc2lnbmVkIGNoYXIgaWk7CiAKICAgICAgLy9EZXRlcm1pbmVzIHRoZSBoaWdoZXN0IGJhc2ljIHJhdGUuCiAgICAgIGZvciAoaWkgPSBSQVRFXzU0TTsgaWkgPj0gUkFURV82TTsgaWkgLS0pIHsKLSAgICAgICAgIGlmICggKHBEZXZpY2UtPndCYXNpY1JhdGUpICYgKChXT1JEKSgxPDxpaSkpICkgeworICAgICAgICAgaWYgKCAocERldmljZS0+d0Jhc2ljUmF0ZSkgJiAoKHVuc2lnbmVkIHNob3J0KSgxPDxpaSkpICkgewogICAgICAgICAgICAgIGJ5VG9wT0ZETSA9IGlpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQpAQCAtMjc5Niw3ICsxOTIyLDcgQEAKICAgICAgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlID0gYnlUb3BPRkRNOwogCiAgICAgIGZvciAoaWkgPSBSQVRFXzExTTs7IGlpIC0tKSB7Ci0gICAgICAgICBpZiAoIChwRGV2aWNlLT53QmFzaWNSYXRlKSAmICgoV09SRCkoMTw8aWkpKSApIHsKKyAgICAgICAgIGlmICggKHBEZXZpY2UtPndCYXNpY1JhdGUpICYgKCh1bnNpZ25lZCBzaG9ydCkoMTw8aWkpKSApIHsKICAgICAgICAgICAgICBieVRvcENDSyA9IGlpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQpAQCAtMjgxNyw0MCArMTk0Myw0MCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KLUJPT0wgQ0FSRGJBZGRCYXNpY1JhdGUgKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBXT1JEIHdSYXRlSWR4KQorYm9vbCBDQVJEYkFkZEJhc2ljUmF0ZSAodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIHNob3J0IHdSYXRlSWR4KQogewogICAgIFBTRGV2aWNlIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwotICAgIFdPUkQgd1JhdGUgPSAoV09SRCkoMTw8d1JhdGVJZHgpOworICAgIHVuc2lnbmVkIHNob3J0IHdSYXRlID0gKHVuc2lnbmVkIHNob3J0KSgxPDx3UmF0ZUlkeCk7CiAKICAgICBwRGV2aWNlLT53QmFzaWNSYXRlIHw9IHdSYXRlOwogCiAgICAgLy9EZXRlcm1pbmVzIHRoZSBoaWdoZXN0IGJhc2ljIHJhdGUuCiAgICAgQ0FSRHZVcGRhdGVCYXNpY1RvcFJhdGUoKHZvaWQgKilwRGV2aWNlKTsKIAotICAgIHJldHVybihUUlVFKTsKKyAgICByZXR1cm4odHJ1ZSk7CiB9CiAKLUJPT0wgQ0FSRGJJc09GRE1pbkJhc2ljUmF0ZSAodm9pZCAqcERldmljZUhhbmRsZXIpCitib29sIENBUkRiSXNPRkRNaW5CYXNpY1JhdGUgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQogewogICAgIFBTRGV2aWNlIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogICAgIGludCBpaTsKIAogICAgIGZvciAoaWkgPSBSQVRFXzU0TTsgaWkgPj0gUkFURV82TTsgaWkgLS0pIHsKLSAgICAgICAgaWYgKChwRGV2aWNlLT53QmFzaWNSYXRlKSAmICgoV09SRCkoMTw8aWkpKSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBpZiAoKHBEZXZpY2UtPndCYXNpY1JhdGUpICYgKCh1bnNpZ25lZCBzaG9ydCkoMTw8aWkpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1CWVRFIENBUkRieUdldFBrdFR5cGUgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQordW5zaWduZWQgY2hhciBDQVJEYnlHZXRQa3RUeXBlICh2b2lkICpwRGV2aWNlSGFuZGxlcikKIHsKICAgICBQU0RldmljZSBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKIAogICAgIGlmIChwRGV2aWNlLT5ieUJCVHlwZSA9PSBCQl9UWVBFXzExQSB8fCBwRGV2aWNlLT5ieUJCVHlwZSA9PSBCQl9UWVBFXzExQikgewotICAgICAgICByZXR1cm4gKEJZVEUpcERldmljZS0+YnlCQlR5cGU7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcilwRGV2aWNlLT5ieUJCVHlwZTsKICAgICB9CiAgICAgZWxzZSBpZiAoQ0FSRGJJc09GRE1pbkJhc2ljUmF0ZSgodm9pZCAqKXBEZXZpY2UpKSB7CiAgICAgICAgIHJldHVybiBQS19UWVBFXzExR0E7CkBAIC0yODczLDcgKzE5OTksNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIENBUkR2U2V0TG9vcGJhY2tNb2RlIChEV09SRF9QVFIgZHdJb0Jhc2UsIFdPUkQgd0xvb3BiYWNrTW9kZSkKK3ZvaWQgQ0FSRHZTZXRMb29wYmFja01vZGUgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIHNob3J0IHdMb29wYmFja01vZGUpCiB7CiAgICAgc3dpdGNoKHdMb29wYmFja01vZGUpIHsKICAgICBjYXNlIENBUkRfTEJfTk9ORToKQEAgLTI4ODEsNyArMjAwNyw3IEBACiAgICAgY2FzZSBDQVJEX0xCX1BIWToKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUKEZBTFNFKTsKKyAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIC8vIHNldCBNQUMgbG9vcGJhY2sKQEAgLTI5MDIsMTUgKzIwMjgsMTUgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotQk9PTCBDQVJEYlNvZnR3YXJlUmVzZXQgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQorYm9vbCBDQVJEYlNvZnR3YXJlUmVzZXQgKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQogewogICAgIFBTRGV2aWNlIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogCiAgICAgLy8gcmVzZXQgTUFDCiAgICAgaWYgKCFNQUNiU2FmZVNvZnR3YXJlUmVzZXQocERldmljZS0+UG9ydE9mZnNldCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIApAQCAtMjkyOSwxNiArMjA1NSwxNiBAQAogICogUmV0dXJuIFZhbHVlOiBUU0YgT2Zmc2V0IHZhbHVlCiAgKgogICovCi1RV09SRCBDQVJEcUdldFRTRk9mZnNldCAoQllURSBieVJ4UmF0ZSwgUVdPUkQgcXdUU0YxLCBRV09SRCBxd1RTRjIpCitRV09SRCBDQVJEcUdldFRTRk9mZnNldCAodW5zaWduZWQgY2hhciBieVJ4UmF0ZSwgUVdPUkQgcXdUU0YxLCBRV09SRCBxd1RTRjIpCiB7CiAgICAgUVdPUkQgICBxd1RTRk9mZnNldDsKLSAgICBXT1JEICAgIHdSeEJjblRTRk9mZnN0PSAwOzsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UnhCY25UU0ZPZmZzdD0gMDs7CiAKICAgICBISURXT1JEKHF3VFNGT2Zmc2V0KSA9IDA7CiAgICAgTE9EV09SRChxd1RTRk9mZnNldCkgPSAwOwogICAgIHdSeEJjblRTRk9mZnN0ID0gY3dSWEJDTlRTRk9mZltieVJ4UmF0ZSVNQVhfUkFURV07Ci0gICAgKHF3VFNGMikudS5kd0xvd0R3b3JkICs9IChEV09SRCkod1J4QmNuVFNGT2Zmc3QpOwotICAgIGlmICgocXdUU0YyKS51LmR3TG93RHdvcmQgPCAoRFdPUkQpKHdSeEJjblRTRk9mZnN0KSkgeworICAgIChxd1RTRjIpLnUuZHdMb3dEd29yZCArPSAodW5zaWduZWQgbG9uZykod1J4QmNuVFNGT2Zmc3QpOworICAgIGlmICgocXdUU0YyKS51LmR3TG93RHdvcmQgPCAodW5zaWduZWQgbG9uZykod1J4QmNuVFNGT2Zmc3QpKSB7CiAgICAgICAgIChxd1RTRjIpLnUuZHdIaWdoRHdvcmQrKzsKICAgICB9CiAgICAgTE9EV09SRChxd1RTRk9mZnNldCkgPSBMT0RXT1JEKHF3VFNGMSkgLSBMT0RXT1JEKHF3VFNGMik7CkBAIC0yOTYzLDEzICsyMDg5LDEzIEBACiAgKiAgT3V0OgogICogICAgICBxd0N1cnJUU0YgICAgICAgLSBDdXJyZW50IFRTRiBjb3VudGVyCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZQogICoKICAqLwotQk9PTCBDQVJEYkdldEN1cnJlbnRUU0YgKERXT1JEX1BUUiBkd0lvQmFzZSwgUFFXT1JEIHBxd0N1cnJUU0YpCitib29sIENBUkRiR2V0Q3VycmVudFRTRiAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgUFFXT1JEIHBxd0N1cnJUU0YpCiB7Ci0gICAgV09SRCAgICB3dzsKLSAgICBCWVRFICAgIGJ5RGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3dzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKIAogICAgIE1BQ3ZSZWdCaXRzT24oZHdJb0Jhc2UsIE1BQ19SRUdfVEZUQ1RMLCBURlRDVExfVFNGQ05UUlJEKTsKICAgICBmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CkBAIC0yOTc4LDExICsyMTA0LDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpCi0gICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1RTRkNOVFIsICZMT0RXT1JEKCpwcXdDdXJyVFNGKSk7CiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1RTRkNOVFIgKyA0LCAmSElEV09SRCgqcHF3Q3VyclRTRikpOwogCi0gICAgcmV0dXJuKFRSVUUpOworICAgIHJldHVybih0cnVlKTsKIH0KIAogCkBAIC0zMDAwLDEyICsyMTI2LDEyIEBACiAgKiBSZXR1cm4gVmFsdWU6IFRTRiB2YWx1ZSBvZiBuZXh0IEJlYWNvbgogICoKICAqLwotUVdPUkQgQ0FSRHFHZXROZXh0VEJUVCAoUVdPUkQgcXdUU0YsIFdPUkQgd0JlYWNvbkludGVydmFsKQorUVdPUkQgQ0FSRHFHZXROZXh0VEJUVCAoUVdPUkQgcXdUU0YsIHVuc2lnbmVkIHNob3J0IHdCZWFjb25JbnRlcnZhbCkKIHsKIAotICAgIFVJTlQgICAgdUxvd05leHRUQlRUOwotICAgIFVJTlQgICAgdUhpZ2hSZW1haW4sIHVMb3dSZW1haW47Ci0gICAgVUlOVCAgICB1QmVhY29uSW50ZXJ2YWw7CisgICAgdW5zaWduZWQgaW50IHVMb3dOZXh0VEJUVDsKKyAgICB1bnNpZ25lZCBpbnQgdUhpZ2hSZW1haW4sIHVMb3dSZW1haW47CisgICAgdW5zaWduZWQgaW50IHVCZWFjb25JbnRlcnZhbDsKIAogICAgIHVCZWFjb25JbnRlcnZhbCA9IHdCZWFjb25JbnRlcnZhbCAqIDEwMjQ7CiAgICAgLy8gTmV4dCBUQlRUID0gKChsb2NhbF9jdXJyZW50X1RTRiAvIGJlYWNvbl9pbnRlcnZhbCkgKyAxICkgKiBiZWFjb25faW50ZXJ2YWwKQEAgLTMwNDQsNyArMjE3MCw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgQ0FSRHZTZXRGaXJzdE5leHRUQlRUIChEV09SRF9QVFIgZHdJb0Jhc2UsIFdPUkQgd0JlYWNvbkludGVydmFsKQordm9pZCBDQVJEdlNldEZpcnN0TmV4dFRCVFQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIHNob3J0IHdCZWFjb25JbnRlcnZhbCkKIHsKIAogICAgIFFXT1JEICAgcXdOZXh0VEJUVDsKQEAgLTMwNzcsNyArMjIwMyw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgQ0FSRHZVcGRhdGVOZXh0VEJUVCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBRV09SRCBxd1RTRiwgV09SRCB3QmVhY29uSW50ZXJ2YWwpCit2b2lkIENBUkR2VXBkYXRlTmV4dFRCVFQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIFFXT1JEIHF3VFNGLCB1bnNpZ25lZCBzaG9ydCB3QmVhY29uSW50ZXJ2YWwpCiB7CiAKICAgICBxd1RTRiA9IENBUkRxR2V0TmV4dFRCVFQocXdUU0YsIHdCZWFjb25JbnRlcnZhbCk7CkBAIC0zMDg1LDcgKzIyMTEsOCBAQAogICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTkVYVFRCVFQsIExPRFdPUkQocXdUU0YpKTsKICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX05FWFRUQlRUICsgNCwgSElEV09SRChxd1RTRikpOwogICAgIE1BQ3ZSZWdCaXRzT24oZHdJb0Jhc2UsIE1BQ19SRUdfVEZUQ1RMLCBURlRDVExfVEJUVFNZTkNFTik7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJDYXJkOlVwZGF0ZSBOZXh0IFRCVFRbJTh4aDolOHhoXSBcbiIsKFVJTlQpSElEV09SRChxd1RTRiksIChVSU5UKUxPRFdPUkQocXdUU0YpKTsKKyAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkNhcmQ6VXBkYXRlIE5leHQgVEJUVFslOHhoOiU4eGhdIFxuIiwKKwkJICAgICh1bnNpZ25lZCBpbnQpIEhJRFdPUkQocXdUU0YpLCAodW5zaWduZWQgaW50KSBMT0RXT1JEKHF3VFNGKSk7CiAKICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5oCmluZGV4IDc2MzEzNDYuLmUwODM2ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5oCkBAIC0zMCw2ICszMCw3IEBACiAjZGVmaW5lIF9fQ0FSRF9IX18KIAogI2luY2x1ZGUgInR0eXBlLmgiCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8vCkBAIC04Niw1NyArODcsNTUgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQk9PTCBDaGFubmVsVmFsaWQoVUlOVCBDb3VudHJ5Q29kZSwgVUlOVCBDaGFubmVsSW5kZXgpOwogdm9pZCBDQVJEdlNldFJTUElORih2b2lkICpwRGV2aWNlSGFuZGxlciwgQ0FSRF9QSFlfVFlQRSBlUEhZVHlwZSk7CiB2b2lkIHZVcGRhdGVJRlModm9pZCAqcERldmljZUhhbmRsZXIpOwogdm9pZCBDQVJEdlVwZGF0ZUJhc2ljVG9wUmF0ZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7Ci1CT09MIENBUkRiQWRkQmFzaWNSYXRlKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBXT1JEIHdSYXRlSWR4KTsKLUJPT0wgQ0FSRGJJc09GRE1pbkJhc2ljUmF0ZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7Ci12b2lkIENBUkR2U2V0TG9vcGJhY2tNb2RlKERXT1JEX1BUUiBkd0lvQmFzZSwgV09SRCB3TG9vcGJhY2tNb2RlKTsKLUJPT0wgQ0FSRGJTb2Z0d2FyZVJlc2V0KHZvaWQgKnBEZXZpY2VIYW5kbGVyKTsKLXZvaWQgQ0FSRHZTZXRGaXJzdE5leHRUQlRUKERXT1JEX1BUUiBkd0lvQmFzZSwgV09SRCB3QmVhY29uSW50ZXJ2YWwpOwotdm9pZCBDQVJEdlVwZGF0ZU5leHRUQlRUKERXT1JEX1BUUiBkd0lvQmFzZSwgUVdPUkQgcXdUU0YsIFdPUkQgd0JlYWNvbkludGVydmFsKTsKLUJPT0wgQ0FSRGJHZXRDdXJyZW50VFNGKERXT1JEX1BUUiBkd0lvQmFzZSwgUFFXT1JEIHBxd0N1cnJUU0YpOwotUVdPUkQgQ0FSRHFHZXROZXh0VEJUVChRV09SRCBxd1RTRiwgV09SRCB3QmVhY29uSW50ZXJ2YWwpOwotUVdPUkQgQ0FSRHFHZXRUU0ZPZmZzZXQoQllURSBieVJ4UmF0ZSwgUVdPUkQgcXdUU0YxLCBRV09SRCBxd1RTRjIpOwotQk9PTCBDQVJEYlNldFR4UG93ZXIodm9pZCAqcERldmljZUhhbmRsZXIsIFVMT05HIHVsVHhQb3dlcik7Ci1CWVRFIENBUkRieUdldFBrdFR5cGUodm9pZCAqcERldmljZUhhbmRsZXIpOworYm9vbCBDQVJEYkFkZEJhc2ljUmF0ZSh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgc2hvcnQgd1JhdGVJZHgpOworYm9vbCBDQVJEYklzT0ZETWluQmFzaWNSYXRlKHZvaWQgKnBEZXZpY2VIYW5kbGVyKTsKK3ZvaWQgQ0FSRHZTZXRMb29wYmFja01vZGUodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgc2hvcnQgd0xvb3BiYWNrTW9kZSk7Citib29sIENBUkRiU29mdHdhcmVSZXNldCh2b2lkICpwRGV2aWNlSGFuZGxlcik7Cit2b2lkIENBUkR2U2V0Rmlyc3ROZXh0VEJUVCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3QmVhY29uSW50ZXJ2YWwpOwordm9pZCBDQVJEdlVwZGF0ZU5leHRUQlRUKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIFFXT1JEIHF3VFNGLCB1bnNpZ25lZCBzaG9ydCB3QmVhY29uSW50ZXJ2YWwpOworYm9vbCBDQVJEYkdldEN1cnJlbnRUU0YodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgUFFXT1JEIHBxd0N1cnJUU0YpOworUVdPUkQgQ0FSRHFHZXROZXh0VEJUVChRV09SRCBxd1RTRiwgdW5zaWduZWQgc2hvcnQgd0JlYWNvbkludGVydmFsKTsKK1FXT1JEIENBUkRxR2V0VFNGT2Zmc2V0KHVuc2lnbmVkIGNoYXIgYnlSeFJhdGUsIFFXT1JEIHF3VFNGMSwgUVdPUkQgcXdUU0YyKTsKK2Jvb2wgQ0FSRGJTZXRUeFBvd2VyKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBsb25nIHVsVHhQb3dlcik7Cit1bnNpZ25lZCBjaGFyIENBUkRieUdldFBrdFR5cGUodm9pZCAqcERldmljZUhhbmRsZXIpOwogdm9pZCBDQVJEdlNhZmVSZXNldFR4KHZvaWQgKnBEZXZpY2VIYW5kbGVyKTsKIHZvaWQgQ0FSRHZTYWZlUmVzZXRSeCh2b2lkICpwRGV2aWNlSGFuZGxlcik7CiAKIC8veHh4Ci1CT09MIENBUkRiUmFkaW9Qb3dlck9mZih2b2lkICpwRGV2aWNlSGFuZGxlcik7Ci1CT09MIENBUkRiUmFkaW9Qb3dlck9uKHZvaWQgKnBEZXZpY2VIYW5kbGVyKTsKLUJPT0wgQ0FSRGJTZXRDaGFubmVsKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBVSU5UIHVDb25uZWN0aW9uQ2hhbm5lbCk7Ci0vL0JPT0wgQ0FSRGJTZW5kUGFja2V0KHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB2b2lkICpwUGFja2V0LCBDQVJEX1BLVF9UWVBFIGVQa3RUeXBlLCBVSU5UIHVMZW5ndGgpOwotQk9PTCBDQVJEYklzU2hvcnRQcmVhbWJsZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7Ci1CT09MIENBUkRiSXNTaG9yU2xvdFRpbWUodm9pZCAqcERldmljZUhhbmRsZXIpOwotQk9PTCBDQVJEYlNldFBoeVBhcmFtZXRlcih2b2lkICpwRGV2aWNlSGFuZGxlciwgQ0FSRF9QSFlfVFlQRSBlUEhZVHlwZSwgV09SRCB3Q2FwSW5mbywgQllURSBieUVSUEZpZWxkLCB2b2lkICpwdlN1cHBvcnRSYXRlSUVzLCB2b2lkICpwdkV4dFN1cHBvcnRSYXRlSUVzKTsKLUJPT0wgQ0FSRGJVcGRhdGVUU0Yodm9pZCAqcERldmljZUhhbmRsZXIsIEJZVEUgYnlSeFJhdGUsIFFXT1JEIHF3QlNTVGltZXN0YW1wLCBRV09SRCBxd0xvY2FsVFNGKTsKLUJPT0wgQ0FSRGJTdG9wVHhQYWNrZXQodm9pZCAqcERldmljZUhhbmRsZXIsIENBUkRfUEtUX1RZUEUgZVBrdFR5cGUpOwotQk9PTCBDQVJEYlN0YXJ0VHhQYWNrZXQodm9pZCAqcERldmljZUhhbmRsZXIsIENBUkRfUEtUX1RZUEUgZVBrdFR5cGUpOwotQk9PTCBDQVJEYlNldEJlYWNvblBlcmlvZCh2b2lkICpwRGV2aWNlSGFuZGxlciwgV09SRCB3QmVhY29uSW50ZXJ2YWwpOwotQk9PTCBDQVJEYlNldEJTU0lEKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBQQllURSBwYnlCU1NJRCwgQ0FSRF9PUF9NT0RFIGVPUE1vZGUpOworYm9vbCBDQVJEYlJhZGlvUG93ZXJPZmYodm9pZCAqcERldmljZUhhbmRsZXIpOworYm9vbCBDQVJEYlJhZGlvUG93ZXJPbih2b2lkICpwRGV2aWNlSGFuZGxlcik7CisvL2Jvb2wgQ0FSRGJTZW5kUGFja2V0KHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB2b2lkICpwUGFja2V0LCBDQVJEX1BLVF9UWVBFIGVQa3RUeXBlLCB1bnNpZ25lZCBpbnQgdUxlbmd0aCk7Citib29sIENBUkRiSXNTaG9ydFByZWFtYmxlKHZvaWQgKnBEZXZpY2VIYW5kbGVyKTsKK2Jvb2wgQ0FSRGJJc1Nob3JTbG90VGltZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7Citib29sIENBUkRiU2V0UGh5UGFyYW1ldGVyKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BIWV9UWVBFIGVQSFlUeXBlLCB1bnNpZ25lZCBzaG9ydCB3Q2FwSW5mbywgdW5zaWduZWQgY2hhciBieUVSUEZpZWxkLCB2b2lkICpwdlN1cHBvcnRSYXRlSUVzLCB2b2lkICpwdkV4dFN1cHBvcnRSYXRlSUVzKTsKK2Jvb2wgQ0FSRGJVcGRhdGVUU0Yodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIGNoYXIgYnlSeFJhdGUsIFFXT1JEIHF3QlNTVGltZXN0YW1wLCBRV09SRCBxd0xvY2FsVFNGKTsKK2Jvb2wgQ0FSRGJTdG9wVHhQYWNrZXQodm9pZCAqcERldmljZUhhbmRsZXIsIENBUkRfUEtUX1RZUEUgZVBrdFR5cGUpOworYm9vbCBDQVJEYlN0YXJ0VHhQYWNrZXQodm9pZCAqcERldmljZUhhbmRsZXIsIENBUkRfUEtUX1RZUEUgZVBrdFR5cGUpOworYm9vbCBDQVJEYlNldEJlYWNvblBlcmlvZCh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgc2hvcnQgd0JlYWNvbkludGVydmFsKTsKK2Jvb2wgQ0FSRGJTZXRCU1NJRCh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgY2hhciAqcGJ5QlNTSUQsIENBUkRfT1BfTU9ERSBlT1BNb2RlKTsKIAotQk9PTAorYm9vbAogQ0FSRGJQb3dlckRvd24oCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIKICAgICApOwogCi1CT09MIENBUkRiU2V0VHhEYXRhUmF0ZSgKK2Jvb2wgQ0FSRGJTZXRUeERhdGFSYXRlKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIFdPUkQgICAgd0RhdGFSYXRlCisgICAgdW5zaWduZWQgc2hvcnQgd0RhdGFSYXRlCiAgICAgKTsKIAogCi1CT09MIENBUkRiUmVtb3ZlS2V5ICh2b2lkICpwRGV2aWNlSGFuZGxlciwgUEJZVEUgcGJ5QlNTSUQpOworYm9vbCBDQVJEYlJlbW92ZUtleSAodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lEKTsKIAotQk9PTAorYm9vbAogQ0FSRGJBZGRfUE1LSURfQ2FuZGlkYXRlICgKICAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKLSAgICBQQllURSAgICAgICAgICAgIHBieUJTU0lELAotICAgIEJPT0wgICAgICAgICAgICAgYlJTTkNhcEV4aXN0LAotICAgIFdPUkQgICAgICAgICAgICAgd1JTTkNhcAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lELAorICAgIGJvb2wgYlJTTkNhcEV4aXN0LAorICAgIHVuc2lnbmVkIHNob3J0IHdSU05DYXAKICAgICApOwogCiB2b2lkICoKQEAgLTE0NCwxMTIgKzE0Myw1NSBAQAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyCiAgICAgKTsKIAotCi12b2lkIENBUkR2SW5pdENoYW5uZWxUYWJsZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7Ci1CWVRFIENBUkRieUdldENoYW5uZWxNYXBwaW5nKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBCWVRFIGJ5Q2hhbm5lbE51bWJlciwgQ0FSRF9QSFlfVFlQRSBlUGh5VHlwZSk7Ci0KLUJPT0wKK2Jvb2wKIENBUkRiU3RhcnRNZWFzdXJlICgKICAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKICAgICB2b2lkICpwdk1lYXN1cmVFSURzLAotICAgIFVJTlQgICAgICAgICAgICAgdU51bU9mTWVhc3VyZUVJRHMKKyAgICB1bnNpZ25lZCBpbnQgdU51bU9mTWVhc3VyZUVJRHMKICAgICApOwogCi1CT09MCitib29sCiBDQVJEYkNoYW5uZWxTd2l0Y2ggKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIEJZVEUgICAgICAgICAgICAgYnlNb2RlLAotICAgIEJZVEUgICAgICAgICAgICAgYnlOZXdDaGFubmVsLAotICAgIEJZVEUgICAgICAgICAgICAgYnlDb3VudAorICAgIHVuc2lnbmVkIGNoYXIgYnlNb2RlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlOZXdDaGFubmVsLAorICAgIHVuc2lnbmVkIGNoYXIgYnlDb3VudAogICAgICk7CiAKLUJPT0wKK2Jvb2wKIENBUkRiU2V0UXVpZXQgKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIEJPT0wgICAgICAgICAgICAgYlJlc2V0UXVpZXQsCi0gICAgQllURSAgICAgICAgICAgICBieVF1aWV0Q291bnQsCi0gICAgQllURSAgICAgICAgICAgICBieVF1aWV0UGVyaW9kLAotICAgIFdPUkQgICAgICAgICAgICAgd1F1aWV0RHVyYXRpb24sCi0gICAgV09SRCAgICAgICAgICAgICB3UXVpZXRPZmZzZXQKKyAgICBib29sIGJSZXNldFF1aWV0LAorICAgIHVuc2lnbmVkIGNoYXIgYnlRdWlldENvdW50LAorICAgIHVuc2lnbmVkIGNoYXIgYnlRdWlldFBlcmlvZCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UXVpZXREdXJhdGlvbiwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UXVpZXRPZmZzZXQKICAgICApOwogCi1CT09MCitib29sCiBDQVJEYlN0YXJ0UXVpZXQgKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyCiAgICAgKTsKIAogdm9pZAotQ0FSRHZTZXRDb3VudHJ5SW5mbyAoCi0gICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgQ0FSRF9QSFlfVFlQRSAgICBlUEhZVHlwZSwKLSAgICB2b2lkICpwSUUKLSAgICApOwotCi12b2lkCiBDQVJEdlNldFBvd2VyQ29uc3RyYWludCAoCiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgQllURSAgICAgICAgICAgICBieUNoYW5uZWwsCi0gICAgSTggICAgICAgICAgICAgICBieVBvd2VyCisgICAgdW5zaWduZWQgY2hhciBieUNoYW5uZWwsCisgICAgY2hhciBieVBvd2VyCiAgICAgKTsKIAogdm9pZAogQ0FSRHZHZXRQb3dlckNhcGFiaWxpdHkgKAogICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIFBCWVRFICAgICAgICAgICBwYnlNaW5Qb3dlciwKLSAgICBQQllURSAgICAgICAgICAgcGJ5TWF4UG93ZXIKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlNaW5Qb3dlciwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlNYXhQb3dlcgogICAgICk7CiAKLUJZVEUKLUNBUkRieVNldFN1cHBvcnRDaGFubmVscyAoCi0gICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgUEJZVEUgICAgICAgIHBieUlFcwotICAgICk7Ci0KLUk4CitjaGFyCiBDQVJEYnlHZXRUcmFuc21pdFBvd2VyICgKICAgICB2b2lkICpwRGV2aWNlSGFuZGxlcgogICAgICk7CiAKLUJPT0wKLUNBUkRiQ2hhbm5lbEdldExpc3QgKAotICAgICBVSU5UICAgICAgIHVDb3VudHJ5Q29kZUlkeCwKLSAgICBQQllURSAgICAgIHBieUNoYW5uZWxUYWJsZQotICAgICk7Ci0KLXZvaWQKLUNBUkR2U2V0Q291bnRyeUlFKAotICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIHZvaWQgKnBJRQotICAgICk7Ci0KLUJPT0wKLUNBUkRiR2V0Q2hhbm5lbE1hcEluZm8oCi0gICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgVUlOVCAgICAgICAgIHVDaGFubmVsSW5kZXgsCi0gICAgUEJZVEUgICAgICAgcGJ5Q2hhbm5lbE51bWJlciwKLSAgICBQQllURSAgICAgICBwYnlNYXAKLSAgICApOwotCi12b2lkCi1DQVJEdlNldENoYW5uZWxNYXBJbmZvKAotICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIFVJTlQgICAgICAgICB1Q2hhbm5lbEluZGV4LAotICAgIEJZVEUgICAgICAgICBieU1hcAotICAgICk7Ci0KLXZvaWQKLUNBUkR2Q2xlYXJDaGFubmVsTWFwSW5mbygKLSAgICB2b2lkICpwRGV2aWNlSGFuZGxlcgotICAgICk7Ci0KLUJZVEUKLUNBUkRieUF1dG9DaGFubmVsU2VsZWN0KAotICAgIHZvaWQgKnBEZXZpY2VIYW5kbGVyLAotICAgIENBUkRfUEhZX1RZUEUgICBlUEhZVHlwZQotICAgICk7Ci0KLUJZVEUgQ0FSRGJ5R2V0Q2hhbm5lbE51bWJlcih2b2lkICpwRGV2aWNlSGFuZGxlciwgQllURSBieUNoYW5uZWxJbmRleCk7Ci0KICNlbmRpZiAvLyBfX0NBUkRfSF9fCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NoYW5uZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2MxNTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDMgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogRmlsZTogY2hhbm5lbC5jCisgKgorICovCisKKyNpbmNsdWRlICJiYXNlYmFuZC5oIgorI2luY2x1ZGUgImNvdW50cnkuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAicmYuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBDQVJEX01BWF9DSEFOTkVMX1RCTCAgICA1NgorCisvL3N0YXRpYyBpbnQgbXNnbGV2ZWwgPSBNU0dfTEVWRUxfREVCVUc7CitzdGF0aWMgaW50IG1zZ2xldmVsID0gTVNHX0xFVkVMX0lORk87CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBTQ2hhbm5lbFRibEVsZW1lbnQgc0NoYW5uZWxUYmxbQ0FSRF9NQVhfQ0hBTk5FTF9UQkwgKyAxXSA9Cit7CisgIHswLCAgIDAsICAgIGZhbHNlLCAgICAwfSwKKyAgezEsICAgMjQxMiwgdHJ1ZSwgICAgIDB9LAorICB7MiwgICAyNDE3LCB0cnVlLCAgICAgMH0sCisgIHszLCAgIDI0MjIsIHRydWUsICAgICAwfSwKKyAgezQsICAgMjQyNywgdHJ1ZSwgICAgIDB9LAorICB7NSwgICAyNDMyLCB0cnVlLCAgICAgMH0sCisgIHs2LCAgIDI0MzcsIHRydWUsICAgICAwfSwKKyAgezcsICAgMjQ0MiwgdHJ1ZSwgICAgIDB9LAorICB7OCwgICAyNDQ3LCB0cnVlLCAgICAgMH0sCisgIHs5LCAgIDI0NTIsIHRydWUsICAgICAwfSwKKyAgezEwLCAgMjQ1NywgdHJ1ZSwgICAgIDB9LAorICB7MTEsICAyNDYyLCB0cnVlLCAgICAgMH0sCisgIHsxMiwgIDI0NjcsIHRydWUsICAgICAwfSwKKyAgezEzLCAgMjQ3MiwgdHJ1ZSwgICAgIDB9LAorICB7MTQsICAyNDg0LCB0cnVlLCAgICAgMH0sCisgIHsxODMsIDQ5MTUsIHRydWUsICAgICAwfSwKKyAgezE4NCwgNDkyMCwgdHJ1ZSwgICAgIDB9LAorICB7MTg1LCA0OTI1LCB0cnVlLCAgICAgMH0sCisgIHsxODcsIDQ5MzUsIHRydWUsICAgICAwfSwKKyAgezE4OCwgNDk0MCwgdHJ1ZSwgICAgIDB9LAorICB7MTg5LCA0OTQ1LCB0cnVlLCAgICAgMH0sCisgIHsxOTIsIDQ5NjAsIHRydWUsICAgICAwfSwKKyAgezE5NiwgNDk4MCwgdHJ1ZSwgICAgIDB9LAorICB7NywgICA1MDM1LCB0cnVlLCAgICAgMH0sCisgIHs4LCAgIDUwNDAsIHRydWUsICAgICAwfSwKKyAgezksICAgNTA0NSwgdHJ1ZSwgICAgIDB9LAorICB7MTEsICA1MDU1LCB0cnVlLCAgICAgMH0sCisgIHsxMiwgIDUwNjAsIHRydWUsICAgICAwfSwKKyAgezE2LCAgNTA4MCwgdHJ1ZSwgICAgIDB9LAorICB7MzQsICA1MTcwLCB0cnVlLCAgICAgMH0sCisgIHszNiwgIDUxODAsIHRydWUsICAgICAwfSwKKyAgezM4LCAgNTE5MCwgdHJ1ZSwgICAgIDB9LAorICB7NDAsICA1MjAwLCB0cnVlLCAgICAgMH0sCisgIHs0MiwgIDUyMTAsIHRydWUsICAgICAwfSwKKyAgezQ0LCAgNTIyMCwgdHJ1ZSwgICAgIDB9LAorICB7NDYsICA1MjMwLCB0cnVlLCAgICAgMH0sCisgIHs0OCwgIDUyNDAsIHRydWUsICAgICAwfSwKKyAgezUyLCAgNTI2MCwgdHJ1ZSwgICAgIDB9LAorICB7NTYsICA1MjgwLCB0cnVlLCAgICAgMH0sCisgIHs2MCwgIDUzMDAsIHRydWUsICAgICAwfSwKKyAgezY0LCAgNTMyMCwgdHJ1ZSwgICAgIDB9LAorICB7MTAwLCA1NTAwLCB0cnVlLCAgICAgMH0sCisgIHsxMDQsIDU1MjAsIHRydWUsICAgICAwfSwKKyAgezEwOCwgNTU0MCwgdHJ1ZSwgICAgIDB9LAorICB7MTEyLCA1NTYwLCB0cnVlLCAgICAgMH0sCisgIHsxMTYsIDU1ODAsIHRydWUsICAgICAwfSwKKyAgezEyMCwgNTYwMCwgdHJ1ZSwgICAgIDB9LAorICB7MTI0LCA1NjIwLCB0cnVlLCAgICAgMH0sCisgIHsxMjgsIDU2NDAsIHRydWUsICAgICAwfSwKKyAgezEzMiwgNTY2MCwgdHJ1ZSwgICAgIDB9LAorICB7MTM2LCA1NjgwLCB0cnVlLCAgICAgMH0sCisgIHsxNDAsIDU3MDAsIHRydWUsICAgICAwfSwKKyAgezE0OSwgNTc0NSwgdHJ1ZSwgICAgIDB9LAorICB7MTUzLCA1NzY1LCB0cnVlLCAgICAgMH0sCisgIHsxNTcsIDU3ODUsIHRydWUsICAgICAwfSwKKyAgezE2MSwgNTgwNSwgdHJ1ZSwgICAgIDB9LAorICB7MTY1LCA1ODI1LCB0cnVlLCAgICAgMH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBSYWRhciByZWd1bGF0aW9uIHJ1bGVzIGZvciBlYWNoIGNvdW50cnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0Cit7CisJdW5zaWduZWQgY2hhciBieUNoYW5uZWxDb3VudHJ5Q29kZTsgICAgICAgICAgICAgLyogVGhlIGNvdW50cnkgY29kZSAgICAgICAgICovCisJY2hhciBjaENvdW50cnlDb2RlWzJdOworCXVuc2lnbmVkIGNoYXIgYkNoYW5uZWxJZHhMaXN0W0NCX01BWF9DSEFOTkVMXTsgIC8qIEF2YWlsYWJsZSBjaGFubmVscyBJbmRleCAqLworCXVuc2lnbmVkIGNoYXIgYnlQb3dlcltDQl9NQVhfQ0hBTk5FTF07Cit9IENoYW5uZWxSdWxlVGFiW10gPQoreworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyB0YWJsZSBpcyBiYXNlZCBvbiBBdGhlcm8gZHJpdmVyIHJ1bGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ291bnRyeSAgICAgICAgICBBdmFpbGFibGUgY2hhbm5lbHMsIGVuZGVkIHdpdGggMCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNSAgMTYgIDE3ICAxOCAgMTkgIDIwICAyMSAgMjIgIDIzICAyNCAgMjUgIDI2ICAyNyAgMjggIDI5ICAzMCAgMzEgIDMyICAzMyAgMzQgIDM1ICAzNiAgMzcgIDM4ICAzOSAgNDAgIDQxICA0MiAgNDMgIDQ0ICA0NSAgNDYgIDQ3ICA0OCAgNDkgIDUwICA1MSAgNTIgIDUzICA1NCAgNTUgIDU2ICAqLwore0NDT0RFX0ZDQywgICAgICAgICAgICAgICAgICAgICB7J1UnLCdTJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCit7Q0NPREVfVEVMRUMsICAgICAgICAgICAgICAgICAgIHsnSicsJ1AnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgMjMsICAwLCAgMCwgMjMsICAwLCAyMywgMjMsICAwLCAyMywgIDAsICAwLCAyMywgMjMsIDIzLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9FVFNJLCAgICAgICAgICAgICAgICAgICAgeydFJywnVSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1JFU1YzLCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUkVTVjQsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9SRVNWNSwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1JFU1Y2LCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUkVTVjcsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9SRVNWOCwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1JFU1Y5LCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUkVTVmEsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9SRVNWYiwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1JFU1ZjLCAgICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUkVTVmQsICAgICAgICAgICAgICAgICAgIHsnICcsJyAnfSwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9SRVNWZSwgICAgICAgICAgICAgICAgICAgeycgJywnICd9LCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0FMTEJBTkQsICAgICAgICAgICAgICAgICB7JyAnLCcgJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfQUxCQU5JQSwgICAgICAgICAgICAgICAgIHsnQScsJ0wnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9BTEdFUklBLCAgICAgICAgICAgICAgICAgeydEJywnWid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0FSR0VOVElOQSwgICAgICAgICAgICAgICB7J0EnLCdSJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgMTcsIDE3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAgMH0gIH0sCit7Q0NPREVfQVJNRU5JQSwgICAgICAgICAgICAgICAgIHsnQScsJ00nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgMTgsIDE4LCAxOCwgMTgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9BVVNUUkFMSUEsICAgICAgICAgICAgICAgeydBJywnVSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX0FVU1RSSUEsICAgICAgICAgICAgICAgICB7J0EnLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTUsICAwLCAxNSwgIDAsIDE1LCAgMCwgMTUsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfQVpFUkJBSUpBTiwgICAgICAgICAgICAgIHsnQScsJ1onfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgMTgsIDE4LCAxOCwgMTgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9CQUhSQUlOLCAgICAgICAgICAgICAgICAgeydCJywnSCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0JFTEFSVVMsICAgICAgICAgICAgICAgICB7J0InLCdZJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfQkVMR0lVTSwgICAgICAgICAgICAgICAgIHsnQicsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9CRUxJWkUsICAgICAgICAgICAgICAgICAgeydCJywnWid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX0JPTElWSUEsICAgICAgICAgICAgICAgICB7J0InLCdPJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCit7Q0NPREVfQlJBWklMLCAgICAgICAgICAgICAgICAgIHsnQicsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9CUlVORUlfREFSVVNTQUxBTSwgICAgICAgeydCJywnTid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX0JVTEdBUklBLCAgICAgICAgICAgICAgICB7J0InLCdHJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsIDIzLCAyMywgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfQ0FOQURBLCAgICAgICAgICAgICAgICAgIHsnQycsJ0EnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9DSElMRSwgICAgICAgICAgICAgICAgICAgeydDJywnTCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgMTcsIDE3LCAxNywgMTd9ICB9LAore0NDT0RFX0NISU5BLCAgICAgICAgICAgICAgICAgICB7J0MnLCdOJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCit7Q0NPREVfQ09MT01CSUEsICAgICAgICAgICAgICAgIHsnQycsJ08nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9DT1NUQV9SSUNBLCAgICAgICAgICAgICAgeydDJywnUid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0NST0FUSUEsICAgICAgICAgICAgICAgICB7J0gnLCdSJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfQ1lQUlVTLCAgICAgICAgICAgICAgICAgIHsnQycsJ1knfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9DWkVDSCwgICAgICAgICAgICAgICAgICAgeydDJywnWid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0RFTk1BUkssICAgICAgICAgICAgICAgICB7J0QnLCdLJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfRE9NSU5JQ0FOX1JFUFVCTElDLCAgICAgIHsnRCcsJ08nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9FQ1VBRE9SLCAgICAgICAgICAgICAgICAgeydFJywnQyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0VHWVBULCAgICAgICAgICAgICAgICAgICB7J0UnLCdHJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfRUxfU0FMVkFET1IsICAgICAgICAgICAgIHsnUycsJ1YnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9FU1RPTklBLCAgICAgICAgICAgICAgICAgeydFJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0ZJTkxBTkQsICAgICAgICAgICAgICAgICB7J0YnLCdJJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfRlJBTkNFLCAgICAgICAgICAgICAgICAgIHsnRicsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9HRVJNQU5ZLCAgICAgICAgICAgICAgICAgeydEJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0dSRUVDRSwgICAgICAgICAgICAgICAgICB7J0cnLCdSJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfR0VPUkdJQSwgICAgICAgICAgICAgICAgIHsnRycsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgMTgsIDE4LCAxOCwgMTgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9HVUFURU1BTEEsICAgICAgICAgICAgICAgeydHJywnVCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX0hPTkRVUkFTLCAgICAgICAgICAgICAgICB7J0gnLCdOJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfSE9OR19LT05HLCAgICAgICAgICAgICAgIHsnSCcsJ0snfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9IVU5HQVJZLCAgICAgICAgICAgICAgICAgeydIJywnVSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0lDRUxBTkQsICAgICAgICAgICAgICAgICB7J0knLCdTJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfSU5ESUEsICAgICAgICAgICAgICAgICAgIHsnSScsJ04nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9JTkRPTkVTSUEsICAgICAgICAgICAgICAgeydJJywnRCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0lSQU4sICAgICAgICAgICAgICAgICAgICB7J0knLCdSJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCit7Q0NPREVfSVJFTEFORCwgICAgICAgICAgICAgICAgIHsnSScsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9JVEFMWSwgICAgICAgICAgICAgICAgICAgeydJJywnVCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0lTUkFFTCwgICAgICAgICAgICAgICAgICB7J0knLCdMJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfSkFQQU4sICAgICAgICAgICAgICAgICAgIHsnSicsJ1AnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9KT1JEQU4sICAgICAgICAgICAgICAgICAgeydKJywnTyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0tBWkFLSFNUQU4sICAgICAgICAgICAgICB7J0snLCdaJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfS1VXQUlULCAgICAgICAgICAgICAgICAgIHsnSycsJ1cnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9MQVRWSUEsICAgICAgICAgICAgICAgICAgeydMJywnVid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0xFQkFOT04sICAgICAgICAgICAgICAgICB7J0wnLCdCJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfTEVJQ0hURU5TVEVJTiwgICAgICAgICAgIHsnTCcsJ0knfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9MSVRIVUFOSUEsICAgICAgICAgICAgICAgeydMJywnVCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0xVWEVNQlVSRywgICAgICAgICAgICAgICB7J0wnLCdVJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfTUFDQVUsICAgICAgICAgICAgICAgICAgIHsnTScsJ08nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsICAwLCAyMywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9NQUNFRE9OSUEsICAgICAgICAgICAgICAgeydNJywnSyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX01BTFRBLCAgICAgICAgICAgICAgICAgICB7J00nLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTYsICAwLCAxNiwgIDAsIDE2LCAgMCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE2LCAxNiwgMTYsIDE2LCAgMH0gIH0sCit7Q0NPREVfTUFMQVlTSUEsICAgICAgICAgICAgICAgIHsnTScsJ1knfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9NRVhJQ08sICAgICAgICAgICAgICAgICAgeydNJywnWCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX01PTkFDTywgICAgICAgICAgICAgICAgICB7J00nLCdDJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfTU9ST0NDTywgICAgICAgICAgICAgICAgIHsnTScsJ0EnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9ORVRIRVJMQU5EUywgICAgICAgICAgICAgeydOJywnTCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX05FV19aRUFMQU5ELCAgICAgICAgICAgICB7J04nLCdaJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsICAwLCAyMywgIDAsIDIzLCAgMCwgMjMsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAzMH0gIH0sCit7Q0NPREVfTk9SVEhfS09SRUEsICAgICAgICAgICAgIHsnSycsJ1AnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsIDIzLCAyMywgMjMsICAwfSAgfSwKK3tDQ09ERV9OT1JXQVksICAgICAgICAgICAgICAgICAgeydOJywnTyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX09NQU4sICAgICAgICAgICAgICAgICAgICB7J08nLCdNJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUEFLSVNUQU4sICAgICAgICAgICAgICAgIHsnUCcsJ0snfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9QQU5BTUEsICAgICAgICAgICAgICAgICAgeydQJywnQSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX1BFUlUsICAgICAgICAgICAgICAgICAgICB7J1AnLCdFJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUEhJTElQUElORVMsICAgICAgICAgICAgIHsnUCcsJ0gnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9QT0xBTkQsICAgICAgICAgICAgICAgICAgeydQJywnTCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1BPUlRVR0FMLCAgICAgICAgICAgICAgICB7J1AnLCdUJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUFVFUlRPX1JJQ08sICAgICAgICAgICAgIHsnUCcsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgMjMsIDIzLCAyMywgMjMsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMzAsIDMwLCAzMCwgMzAsIDMwfSAgfSwKK3tDQ09ERV9RQVRBUiwgICAgICAgICAgICAgICAgICAgeydRJywnQSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1JPTUFOSUEsICAgICAgICAgICAgICAgICB7J1InLCdPJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfUlVTU0lBLCAgICAgICAgICAgICAgICAgIHsnUicsJ1UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9TQVVESV9BUkFCSUEsICAgICAgICAgICAgeydTJywnQSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1NJTkdBUE9SRSwgICAgICAgICAgICAgICB7J1MnLCdHJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDF9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMH0gIH0sCit7Q0NPREVfU0xPVkFLSUEsICAgICAgICAgICAgICAgIHsnUycsJ0snfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNiwgIDAsIDE2LCAgMCwgMTYsICAwLCAxNiwgMTYsIDE2LCAxNiwgMTYsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMTYsIDE2LCAxNiwgMTYsICAwfSAgfSwKK3tDQ09ERV9TTE9WRU5JQSwgICAgICAgICAgICAgICAgeydTJywnSSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1NPVVRIX0FGUklDQSwgICAgICAgICAgICB7J1onLCdBJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfU09VVEhfS09SRUEsICAgICAgICAgICAgIHsnSycsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsIDIzLCAyMywgMjMsICAwfSAgfSwKK3tDQ09ERV9TUEFJTiwgICAgICAgICAgICAgICAgICAgeydFJywnUyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE2LCAgMCwgMTYsICAwLCAxNiwgIDAsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNiwgMTYsIDE2LCAxNiwgIDB9ICB9LAore0NDT0RFX1NXRURFTiwgICAgICAgICAgICAgICAgICB7J1MnLCdFJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfU1dJVFpFUkxBTkQsICAgICAgICAgICAgIHsnQycsJ0gnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxOCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9TWVJJQSwgICAgICAgICAgICAgICAgICAgeydTJywnWSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1RBSVdBTiwgICAgICAgICAgICAgICAgICB7J1QnLCdXJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAxNywgMTcsIDE3LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDMwLCAzMCwgMzAsIDMwLCAgMH0gIH0sCit7Q0NPREVfVEhBSUxBTkQsICAgICAgICAgICAgICAgIHsnVCcsJ0gnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjMsIDIzLCAyMywgMjMsICAwfSAgfSwKK3tDQ09ERV9UUklOSURBRF9UT0JBR08sICAgICAgICAgeydUJywnVCd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE4LCAgMCwgMTgsICAwLCAxOCwgIDAsIDE4LCAxOCwgMTgsIDE4LCAxOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1RVTklTSUEsICAgICAgICAgICAgICAgICB7J1QnLCdOJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfVFVSS0VZLCAgICAgICAgICAgICAgICAgIHsnVCcsJ1InfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgMjAsIDIwLCAyMCwgMjAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9VSywgICAgICAgICAgICAgICAgICAgICAgeydHJywnQid9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX1VLUkFJTkUsICAgICAgICAgICAgICAgICB7J1UnLCdBJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfVU5JVEVEX0FSQUJfRU1JUkFURVMsICAgIHsnQScsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9VTklURURfU1RBVEVTLCAgICAgICAgICAgeydVJywnUyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDE3LCAgMCwgMTcsICAwLCAxNywgIDAsIDE3LCAyMywgMjMsIDIzLCAyMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAzMCwgMzAsIDMwLCAzMCwgMzB9ICB9LAore0NDT0RFX1VSVUdVQVksICAgICAgICAgICAgICAgICB7J1UnLCdZJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDIzLCAyMywgMjMsIDIzLCAgMH0gIH0sCit7Q0NPREVfVVpCRUtJU1RBTiwgICAgICAgICAgICAgIHsnVScsJ1onfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9WRU5FWlVFTEEsICAgICAgICAgICAgICAgeydWJywnRSd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAyMywgMjMsIDIzLCAyMywgIDB9ICB9LAore0NDT0RFX1ZJRVROQU0sICAgICAgICAgICAgICAgICB7J1YnLCdOJ30sICB7ICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfWUVNRU4sICAgICAgICAgICAgICAgICAgIHsnWScsJ0UnfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfSwKK3tDQ09ERV9aSU1CQUJXRSwgICAgICAgICAgICAgICAgeydaJywnVyd9LCAgeyAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9ICB9LAore0NDT0RFX0pBUEFOX1c1Ml9XNTMsICAgICAgICAgICB7J0onLCdKJ30sICB7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0gIH0sCit7Q0NPREVfTUFYLCAgICAgICAgICAgICAgICAgICAgIHsnVScsJ04nfSwgIHsgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSAgfQorLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1ICAxNiAgMTcgIDE4ICAxOSAgMjAgIDIxICAyMiAgMjMgIDI0ICAyNSAgMjYgIDI3ICAyOCAgMjkgIDMwICAzMSAgMzIgIDMzICAzNCAgMzUgIDM2ICAzNyAgMzggIDM5ICA0MCAgNDEgIDQyICA0MyAgNDQgIDQ1ICA0NiAgNDcgIDQ4ICA0OSAgNTAgIDUxICA1MiAgNTMgIDU0ICA1NSAgNTYgICovCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIGlzX2NoYW5uZWxfdmFsaWQoKSAtIElzIENvdW50cnkgQ2hhbm5lbCBWYWxpZAorICogIEBDaGFubmVJbmRleDogZGVmaW5lZCBhcyBWVDMyNTMgTUFDIGNoYW5uZWw6CisgKiAgICAgICAgICAgICAgMSAgID0gMi40RyBjaGFubmVsIDEKKyAqICAgICAgICAgICAgICAyICAgPSAyLjRHIGNoYW5uZWwgMgorICogICAgICAgICAgICAgIC4uLgorICogICAgICAgICAgICAgIDE0ICA9IDIuNEcgY2hhbm5lbCAxNAorICogICAgICAgICAgICAgIDE1ICA9IDQuOUcgY2hhbm5lbCAxODMKKyAqICAgICAgICAgICAgICAxNiAgPSA0LjlHIGNoYW5uZWwgMTg0CisgKiAgICAgICAgICAgICAgLi4uLi4KKyAqICBPdXRwdXQ6IHRydWUgaWYgdGhlIHNwZWNpZmllZCA1R0h6IGJhbmQgaXMgYWxsb3dlZCB0byBiZSB1c2VkLAorICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICogNC45RyA9PiBDaCAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiAoVmFsdWU6MTUgfiAyMikKKyAqCisgKiA1RyA9PiBDaCA3LCA4LCA5LCAxMSwgMTIsIDE2LCAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0LAorICogMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1IChWYWx1ZSAyMyB+IDU2KQorICovCisKK2Jvb2wgaXNfY2hhbm5lbF92YWxpZCh1bnNpZ25lZCBpbnQgQ2hhbm5lbEluZGV4KQoreworCWJvb2wgYlZhbGlkOworCisJYlZhbGlkID0gZmFsc2U7CisJLyoKKwkgKiBJZiBDaGFubmVsIEluZGV4IGlzIGludmFsaWQsIHJldHVybiBpbnZhbGlkCisJICovCisJaWYgKChDaGFubmVsSW5kZXggPiBDQl9NQVhfQ0hBTk5FTCkgfHwKKwkJKENoYW5uZWxJbmRleCA9PSAwKSkKKwl7CisJCWJWYWxpZCA9IGZhbHNlOworCQlnb3RvIGV4aXQ7CisJfQorCisJYlZhbGlkID0gc0NoYW5uZWxUYmxbQ2hhbm5lbEluZGV4XS5iVmFsaWQ7CisKK2V4aXQ6CisJcmV0dXJuIChiVmFsaWQpOworCit9CisKKy8qKgorICogY2hhbm5lbF9nZXRfbGlzdCgpIC0gR2V0IEF2YWlsYWJsZSBDaGFubmVsIExpc3QgZm9yIGEgZ2l2ZW4gY291bnRyeQorICogQENvdW50cnlDb2RlOiBUaGUgY291bnRyeSBjb2RlIGRlZmluZWQgaW4gY291bnRyeS5oCisgKgorICogT3V0cHV0OgorICogICAgICBwYnlDaGFubmVsVGFibGU6ICAgKFFXT1JEICopIGNvcnJlc3BvbmRlbnQgYml0IG1hc2sKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhdmFpbGFibGUgY2hhbm5lbHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDEgbWVhbnMgY2hhbm5lbCAxIGlzIHN1cHBvcnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMyBtZWFucyBjaGFubmVsIDEsMiBhcmUgc3VwcG9ydGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDBGIG1lYW5zIGNoYW5uZWwgMSwyLC4uMTUgYXJlIHN1cHBvcnRlZAorICovCisKK2Jvb2wgY2hhbm5lbF9nZXRfbGlzdCh1bnNpZ25lZCBpbnQgdUNvdW50cnlDb2RlSWR4LCB1bnNpZ25lZCBjaGFyICpwYnlDaGFubmVsVGFibGUpCit7CisJaWYgKHVDb3VudHJ5Q29kZUlkeCA+PSBDQ09ERV9NQVgpCisJCXJldHVybiAoZmFsc2UpOworCisJbWVtY3B5KHBieUNoYW5uZWxUYWJsZSwgQ2hhbm5lbFJ1bGVUYWJbdUNvdW50cnlDb2RlSWR4XS5iQ2hhbm5lbElkeExpc3QsIENCX01BWF9DSEFOTkVMKTsKKworCXJldHVybiAodHJ1ZSk7Cit9CisKK3ZvaWQgaW5pdF9jaGFubmVsX3RhYmxlKHZvaWQgKnBEZXZpY2VIYW5kbGVyKQoreworCVBTRGV2aWNlICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOworCWJvb2wgYk11bHRpQmFuZCA9IGZhbHNlOworCXVuc2lnbmVkIGludCBpaTsKKworCWZvcihpaSA9IDEgOyBpaTw9Q0FSRF9NQVhfQ0hBTk5FTF9UQkwgOyBpaSsrKSB7CisJCXNDaGFubmVsVGJsW2lpXS5iVmFsaWQgPSBmYWxzZTsKKwl9CisKKwlzd2l0Y2ggKHBEZXZpY2UtPmJ5UkZUeXBlKSB7CisJCWNhc2UgUkZfUkZNRDI5NTkgOgorCQljYXNlIFJGX0FJUk9IQSA6CisJCWNhc2UgUkZfQUwyMjMwUzoKKwkJY2FzZSBSRl9VVzI0NTEgOgorCQljYXNlIFJGX1ZUMzIyNiA6CisJCQkvL3ByaW50aygiY2hlc3Rlci1mYWxzZVxuIik7CisJCQliTXVsdGlCYW5kID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSBSRl9BSVJPSEE3MjMwIDoKKwkJY2FzZSBSRl9VVzI0NTIgOgorCQljYXNlIFJGX05PVEhJTkcgOgorCQlkZWZhdWx0IDoKKwkJCWJNdWx0aUJhbmQgPSB0cnVlOworCQkJYnJlYWs7CisJfQorCisJaWYgKChwRGV2aWNlLT5kd0RpYWdSZWZDb3VudCAhPSAwKSB8fCAocERldmljZS0+YjExaEVuYWJsZSA9PSB0cnVlKSkgeworCQlpZiAoYk11bHRpQmFuZCA9PSB0cnVlKSB7CisJCQlmb3IoaWkgPSAwIDsgaWk8Q0FSRF9NQVhfQ0hBTk5FTF9UQkwgOyBpaSsrKSB7CisJCQkJc0NoYW5uZWxUYmxbaWkrMV0uYlZhbGlkID0gdHJ1ZTsKKwkJCQlwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPSBwRGV2aWNlLT5hYnlPRkRNRGVmYXVsdFB3cltpaSsxXTsKKwkJCQlwRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IHBEZXZpY2UtPmFieU9GRE1EZWZhdWx0UHdyW2lpKzFdOworCQkJfQorCQkJZm9yKGlpID0gMCA7IGlpPENIQU5ORUxfTUFYXzI0RyA7IGlpKyspIHsKKwkJCQlwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPSBwRGV2aWNlLT5hYnlDQ0tEZWZhdWx0UHdyW2lpKzFdOworCQkJCXBEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gcERldmljZS0+YWJ5Q0NLRGVmYXVsdFB3cltpaSsxXTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvcihpaSA9IDAgOyBpaTxDSEFOTkVMX01BWF8yNEcgOyBpaSsrKSB7CisJCQkJLy8yMDA4LTgtNCA8YWRkPiBieSBjaGVzdGVyCisJCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gIT0gMCkgeworCQkJCQlzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSB0cnVlOworCQkJCQlwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPSBwRGV2aWNlLT5hYnlDQ0tEZWZhdWx0UHdyW2lpKzFdOworCQkJCQlwRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IHBEZXZpY2UtPmFieUNDS0RlZmF1bHRQd3JbaWkrMV07CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChwRGV2aWNlLT5ieVpvbmVUeXBlIDw9IENDT0RFX01BWCkgeworCQlpZiAoYk11bHRpQmFuZCA9PSB0cnVlKSB7CisJCQlmb3IoaWkgPSAwIDsgaWk8Q0FSRF9NQVhfQ0hBTk5FTF9UQkwgOyBpaSsrKSB7CisJCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gIT0gMCkgeworCQkJCQlzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSB0cnVlOworCQkJCQlwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPSBDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5ieVBvd2VyW2lpXTsKKwkJCQkJcERldmljZS0+YWJ5TG9jYWxQd3JbaWkrMV0gPSBDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5ieVBvd2VyW2lpXTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IoaWkgPSAwIDsgaWk8Q0hBTk5FTF9NQVhfMjRHIDsgaWkrKykgeworCQkJCWlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbaWldICE9IDApIHsKKwkJCQkJc0NoYW5uZWxUYmxbaWkrMV0uYlZhbGlkID0gdHJ1ZTsKKwkJCQkJcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07CisJCQkJCXBEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJREJHX1BSVChNU0dfTEVWRUxfTk9USUNFLCBLRVJOX0lORk8iWm9uZT1bJWRdWyVjXVslY10hIVxuIixwRGV2aWNlLT5ieVpvbmVUeXBlLENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmNoQ291bnRyeUNvZGVbMF0sQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uY2hDb3VudHJ5Q29kZVsxXSk7CisKKwlmb3IoaWkgPSAwIDsgaWk8Q0FSRF9NQVhfQ0hBTk5FTF9UQkwgOyBpaSsrKSB7CisJCWlmIChwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPT0gMCkKKwkJCXBEZXZpY2UtPmFieVJlZ1B3cltpaSsxXSA9IHBEZXZpY2UtPmFieU9GRE1EZWZhdWx0UHdyW2lpKzFdOworCQlpZiAocERldmljZS0+YWJ5TG9jYWxQd3JbaWkrMV0gPT0gMCkKKwkJCXBEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gcERldmljZS0+YWJ5T0ZETURlZmF1bHRQd3JbaWkrMV07CisJfQorfQorCit1bnNpZ25lZCBjaGFyIGdldF9jaGFubmVsX21hcHBpbmcodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsTnVtYmVyLCBDQVJEX1BIWV9UWVBFIGVQaHlUeXBlKQoreworCXVuc2lnbmVkIGludCBpaTsKKworCWlmICgoZVBoeVR5cGUgPT0gUEhZX1RZUEVfMTFCKSB8fCAoZVBoeVR5cGUgPT0gUEhZX1RZUEVfMTFHKSkKKwkJcmV0dXJuIChieUNoYW5uZWxOdW1iZXIpOworCisJZm9yKGlpID0gKENCX01BWF9DSEFOTkVMXzI0RyArIDEpOyBpaSA8PSBDQl9NQVhfQ0hBTk5FTDsgKSB7CisJCWlmIChzQ2hhbm5lbFRibFtpaV0uYnlDaGFubmVsTnVtYmVyID09IGJ5Q2hhbm5lbE51bWJlcikKKwkJCXJldHVybiAoKHVuc2lnbmVkIGNoYXIpIGlpKTsKKwkJaWkrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGNoYXIgZ2V0X2NoYW5uZWxfbnVtYmVyKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbEluZGV4KQoreworCS8vUFNEZXZpY2UgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7CisJcmV0dXJuKHNDaGFubmVsVGJsW2J5Q2hhbm5lbEluZGV4XS5ieUNoYW5uZWxOdW1iZXIpOworfQorCisvKioKKyAqIHNldF9jaGFubmVsKCkgLSBTZXQgTklDIG1lZGlhIGNoYW5uZWwKKyAqCisgKiBAcERldmljZUhhbmRsZXI6IFRoZSBhZGFwdGVyIHRvIGJlIHNldAorICogQHVDb25uZWN0aW9uQ2hhbm5lbDogQ2hhbm5lbCB0byBiZSBzZXQKKyAqCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VlZGVkOyBmYWxzZSBpZiBmYWlsZWQuCisgKgorICovCitib29sIHNldF9jaGFubmVsICh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgaW50IHVDb25uZWN0aW9uQ2hhbm5lbCkKK3sKKwlQU0RldmljZSBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKKwlib29sIGJSZXN1bHQgPSB0cnVlOworCisKKwlpZiAocERldmljZS0+YnlDdXJyZW50Q2ggPT0gdUNvbm5lY3Rpb25DaGFubmVsKSB7CisJCXJldHVybiBiUmVzdWx0OworCX0KKworCWlmIChzQ2hhbm5lbFRibFt1Q29ubmVjdGlvbkNoYW5uZWxdLmJWYWxpZCA9PSBmYWxzZSkgeworCQlyZXR1cm4gKGZhbHNlKTsKKwl9CisKKwlpZiAoKHVDb25uZWN0aW9uQ2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykgJiYKKwkJCShwRGV2aWNlLT5lQ3VycmVudFBIWVR5cGUgIT0gUEhZX1RZUEVfMTFBKSkgeworCQlDQVJEYlNldFBoeVBhcmFtZXRlcihwRGV2aWNlLCBQSFlfVFlQRV8xMUEsIDAsIDAsIE5VTEwsIE5VTEwpOworCX0gZWxzZSBpZiAoKHVDb25uZWN0aW9uQ2hhbm5lbCA8PSBDQl9NQVhfQ0hBTk5FTF8yNEcpICYmCisJCQkocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQSkpIHsKKwkJQ0FSRGJTZXRQaHlQYXJhbWV0ZXIocERldmljZSwgUEhZX1RZUEVfMTFHLCAwLCAwLCBOVUxMLCBOVUxMKTsKKwl9CisJLy8gY2xlYXIgTkFWCisJTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX01BQ0NSLCBNQUNDUl9DTFJOQVYpOworCisJLy97eyBSb2JlcnRZdTogMjAwNDEyMDIKKwkvLy8vIFRYX1BFIHdpbGwgcmVzZXJ2ZSAzIHVzIGZvciBNQVgyODI5IEEgbW9kZSBvbmx5LCBpdCBpcyBmb3IgYmV0dGVyIFRYIHRocm91Z2hwdXQKKworCWlmICggcERldmljZS0+YnlSRlR5cGUgPT0gUkZfQUlST0hBNzIzMCApCisJeworCQlSRmJBTDcyMzBTZWxlY3RDaGFubmVsUG9zdFByb2Nlc3MocERldmljZS0+UG9ydE9mZnNldCwgcERldmljZS0+YnlDdXJyZW50Q2gsICh1bnNpZ25lZCBjaGFyKXVDb25uZWN0aW9uQ2hhbm5lbCk7CisJfQorCS8vfX0gUm9iZXJ0WXUKKworCisJcERldmljZS0+YnlDdXJyZW50Q2ggPSAodW5zaWduZWQgY2hhcil1Q29ubmVjdGlvbkNoYW5uZWw7CisJYlJlc3VsdCAmPSBSRmJTZWxlY3RDaGFubmVsKHBEZXZpY2UtPlBvcnRPZmZzZXQsIHBEZXZpY2UtPmJ5UkZUeXBlLCAodW5zaWduZWQgY2hhcil1Q29ubmVjdGlvbkNoYW5uZWwpOworCisJLy8gSW5pdCBTeW50aGVzaXplciBUYWJsZQorCWlmIChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID09IHRydWUpCisJCVJGdldyaXRlV2FrZVByb2dTeW4ocERldmljZS0+UG9ydE9mZnNldCwgcERldmljZS0+YnlSRlR5cGUsIHVDb25uZWN0aW9uQ2hhbm5lbCk7CisKKworCS8vREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJDQVJEYlNldE1lZGlhQ2hhbm5lbDogJWRcbiIsICh1bnNpZ25lZCBjaGFyKXVDb25uZWN0aW9uQ2hhbm5lbCk7CisJQkJ2U29mdHdhcmVSZXNldChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKKworCWlmIChwRGV2aWNlLT5ieUxvY2FsSUQgPiBSRVZfSURfVlQzMjUzX0IxKSB7CisJCS8vIHNldCBIVyBkZWZhdWx0IHBvd2VyIHJlZ2lzdGVyCisJCU1BQ3ZTZWxlY3RQYWdlMShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKKwkJUkZiU2V0UG93ZXIocERldmljZSwgUkFURV8xTSwgcERldmljZS0+YnlDdXJyZW50Q2gpOworCQlWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUFdSQ0NLLCBwRGV2aWNlLT5ieUN1clB3cik7CisJCVJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfNk0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKKwkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUk9GRE0sIHBEZXZpY2UtPmJ5Q3VyUHdyKTsKKwkJTUFDdlNlbGVjdFBhZ2UwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOworCX0KKworCWlmIChwRGV2aWNlLT5lQ3VycmVudFBIWVR5cGUgPT0gUEhZX1RZUEVfMTFCKSB7CisjaWZkZWYJUExJQ0VfREVCVUcKKwkJLy9wcmludGsoIkZ1bmM6Q2hiU2V0Q2hhbm5lbDpjYWxsIFJGYlNldFBvd2VyOjExQlxuIik7CisjZW5kaWYKKwkJUkZiU2V0UG93ZXIocERldmljZSwgUkFURV8xTSwgcERldmljZS0+YnlDdXJyZW50Q2gpOworCX0gZWxzZSB7CisjaWZkZWYJUExJQ0VfREVCVUcKKwkJLy9wcmludGsoIkZ1bmM6Q2hiU2V0Q2hhbm5lbDpjYWxsIFJGYlNldFBvd2VyXG4iKTsKKyNlbmRpZgorCQlSRmJTZXRQb3dlcihwRGV2aWNlLCBSQVRFXzZNLCBwRGV2aWNlLT5ieUN1cnJlbnRDaCk7CisJfQorCisJcmV0dXJuKGJSZXN1bHQpOworfQorCisvKioKKyAqIHNldF9jb3VudHJ5X2luZm8oKSAtIFNldCBDaGFubmVsIEluZm8gb2YgQ291bnRyeQorICoKKyAqIFJldHVybiBWYWx1ZTogbm9uZS4KKyAqCisgKi8KKwordm9pZCBzZXRfY291bnRyeV9pbmZvKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BIWV9UWVBFIGVQSFlUeXBlLCB2b2lkICpwSUUpCit7CisJUFNEZXZpY2UgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7CisJdW5zaWduZWQgaW50IGlpID0gMDsKKwl1bnNpZ25lZCBpbnQgdXUgPSAwOworCXVuc2lnbmVkIGludCBzdGVwID0gMDsKKwl1bnNpZ25lZCBpbnQgdU51bU9mQ291bnRyeUluZm8gPSAwOworCXVuc2lnbmVkIGNoYXIgYnlDaCA9IDA7CisJUFdMQU5fSUVfQ09VTlRSWSBwSUVfQ291bnRyeSA9IChQV0xBTl9JRV9DT1VOVFJZKSBwSUU7CisKKworCXVOdW1PZkNvdW50cnlJbmZvID0gKHBJRV9Db3VudHJ5LT5sZW4gLSAzKTsKKwl1TnVtT2ZDb3VudHJ5SW5mbyAvPSAzOworCisJaWYgKGVQSFlUeXBlID09IFBIWV9UWVBFXzExQSkgeworCQlwRGV2aWNlLT5iQ291bnRyeUluZm81RyA9IHRydWU7CisJCWZvcihpaSA9IENCX01BWF9DSEFOTkVMXzI0RyArIDEgOyBpaSA8PSBDQVJEX01BWF9DSEFOTkVMX1RCTCA7IGlpKyspIHsKKwkJCXNDaGFubmVsVGJsW2lpXS5iVmFsaWQgPSBmYWxzZTsKKwkJfQorCQlzdGVwID0gNDsKKwl9IGVsc2UgeworCQlwRGV2aWNlLT5iQ291bnRyeUluZm8yNEcgPSB0cnVlOworCQlmb3IoaWkgPSAxIDsgaWkgPD0gQ0JfTUFYX0NIQU5ORUxfMjRHIDsgaWkrKykgeworCQkJc0NoYW5uZWxUYmxbaWldLmJWYWxpZCA9IGZhbHNlOworCQl9CisJCXN0ZXAgPSAxOworCX0KKwlwRGV2aWNlLT5hYnlDb3VudHJ5Q29kZVswXSA9IHBJRV9Db3VudHJ5LT5hYnlDb3VudHJ5U3RyaW5nWzBdOworCXBEZXZpY2UtPmFieUNvdW50cnlDb2RlWzFdID0gcElFX0NvdW50cnktPmFieUNvdW50cnlTdHJpbmdbMV07CisJcERldmljZS0+YWJ5Q291bnRyeUNvZGVbMl0gPSBwSUVfQ291bnRyeS0+YWJ5Q291bnRyeVN0cmluZ1syXTsKKworCWZvcihpaSA9IDAgOyBpaSA8IHVOdW1PZkNvdW50cnlJbmZvIDsgaWkrKykgeworCQlmb3IodXUgPSAwIDsgdXUgPCBwSUVfQ291bnRyeS0+YWJ5Q291bnRyeUluZm9baWkqMysxXSA7IHV1KyspIHsKKwkJCWJ5Q2ggPSBnZXRfY2hhbm5lbF9tYXBwaW5nKHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyKShwSUVfQ291bnRyeS0+YWJ5Q291bnRyeUluZm9baWkqM10rc3RlcCp1dSksIGVQSFlUeXBlKTsKKwkJCXNDaGFubmVsVGJsW2J5Q2hdLmJWYWxpZCA9IHRydWU7CisJCQlwRGV2aWNlLT5hYnlSZWdQd3JbYnlDaF0gPSBwSUVfQ291bnRyeS0+YWJ5Q291bnRyeUluZm9baWkqMysyXTsKKwkJfQorCX0KK30KKworLyoqCisgKgorICogc2V0X3N1cHBvcnRfY2hhbm5lbHMoKSAtIFNldCBTdXBwb3J0IENoYW5uZWxzIElFIGRlZmluZWQgaW4gODAyLjExaAorICoKKyAqIEBoRGV2aWNlQ29udGV4dDogZGV2aWNlIHN0cnVjdHVyZSBwb2ludAorICoKKyAqIFJldHVybiBWYWx1ZTogbm9uZS4KKyAqCisgKi8KKwordW5zaWduZWQgY2hhciBzZXRfc3VwcG9ydF9jaGFubmVscyh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgY2hhciAqcGJ5SUVzKQoreworCVBTRGV2aWNlIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOworCXVuc2lnbmVkIGludCBpaTsKKwl1bnNpZ25lZCBjaGFyIGJ5Q291bnQ7CisJUFdMQU5fSUVfU1VQUF9DSCBwSUUgPSAoUFdMQU5fSUVfU1VQUF9DSCkgcGJ5SUVzOworCXVuc2lnbmVkIGNoYXIgKnBieUNoVHVwcGxlOworCXVuc2lnbmVkIGNoYXIgYnlMZW4gPSAwOworCisKKwlwSUUtPmJ5RWxlbWVudElEID0gV0xBTl9FSURfU1VQUF9DSDsKKwlwSUUtPmxlbiA9IDA7CisJcGJ5Q2hUdXBwbGUgPSBwSUUtPmFieUNoYW5uZWxUdXBsZTsKKwlieUxlbiA9IDI7CisJLy8gbG93ZXIgYmFuZAorCWJ5Q291bnQgPSAwOworCWlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbMjhdID09IHRydWUpIHsKKwkJZm9yIChpaSA9IDI4IDsgaWkgPCAzNiA7IGlpKz0gMikgeworCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gPT0gdHJ1ZSkgeworCQkJCWJ5Q291bnQrKzsKKwkJCX0KKwkJfQorCQkqcGJ5Q2hUdXBwbGUrKyA9IDM0OworCQkqcGJ5Q2hUdXBwbGUrKyA9IGJ5Q291bnQ7CisJCWJ5TGVuICs9IDI7CisJfSBlbHNlIGlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbMjldID09IHRydWUpIHsKKwkJZm9yIChpaSA9IDI5IDsgaWkgPCAzNiA7IGlpKz0gMikgeworCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gPT0gdHJ1ZSkgeworCQkJCWJ5Q291bnQrKzsKKwkJCX0KKwkJfQorCQkqcGJ5Q2hUdXBwbGUrKyA9IDM2OworCQkqcGJ5Q2hUdXBwbGUrKyA9IGJ5Q291bnQ7CisJCWJ5TGVuICs9IDI7CisJfQorCS8vIG1pZGRsZSBiYW5kCisJYnlDb3VudCA9IDA7CisJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFszNl0gPT0gdHJ1ZSkgeworCQlmb3IgKGlpID0gMzYgOyBpaSA8IDQwIDsgaWkrKykgeworCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gPT0gdHJ1ZSkgeworCQkJCWJ5Q291bnQrKzsKKwkJCX0KKwkJfQorCQkqcGJ5Q2hUdXBwbGUrKyA9IDUyOworCQkqcGJ5Q2hUdXBwbGUrKyA9IGJ5Q291bnQ7CisJCWJ5TGVuICs9IDI7CisJfQorCS8vIGhpZ2hlciBiYW5kCisJYnlDb3VudCA9IDA7CisJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFs0MF0gPT0gdHJ1ZSkgeworCQlmb3IgKGlpID0gNDAgOyBpaSA8IDUxIDsgaWkrKykgeworCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gPT0gdHJ1ZSkgeworCQkJCWJ5Q291bnQrKzsKKwkJCX0KKwkJfQorCQkqcGJ5Q2hUdXBwbGUrKyA9IDEwMDsKKwkJKnBieUNoVHVwcGxlKysgPSBieUNvdW50OworCQlieUxlbiArPSAyOworCX0gZWxzZSBpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0WzUxXSA9PSB0cnVlKSB7CisJCWZvciAoaWkgPSA1MSA7IGlpIDwgNTYgOyBpaSsrKSB7CisJCQlpZiAoQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYkNoYW5uZWxJZHhMaXN0W2lpXSA9PSB0cnVlKSB7CisJCQkJYnlDb3VudCsrOworCQkJfQorCQl9CisJCSpwYnlDaFR1cHBsZSsrID0gMTQ5OworCQkqcGJ5Q2hUdXBwbGUrKyA9IGJ5Q291bnQ7CisJCWJ5TGVuICs9IDI7CisJfQorCXBJRS0+bGVuICs9IChieUxlbiAtIDIpOworCXJldHVybiAoYnlMZW4pOworfQorCit2b2lkIHNldF9jb3VudHJ5X0lFKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB2b2lkICpwSUUpCit7CisJUFNEZXZpY2UgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7CisJdW5zaWduZWQgaW50IGlpOworCVBXTEFOX0lFX0NPVU5UUlkgcElFQ291bnRyeSA9IChQV0xBTl9JRV9DT1VOVFJZKSBwSUU7CisKKwlwSUVDb3VudHJ5LT5ieUVsZW1lbnRJRCA9IFdMQU5fRUlEX0NPVU5UUlk7CisJcElFQ291bnRyeS0+bGVuID0gMDsKKwlwSUVDb3VudHJ5LT5hYnlDb3VudHJ5U3RyaW5nWzBdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uY2hDb3VudHJ5Q29kZVswXTsKKwlwSUVDb3VudHJ5LT5hYnlDb3VudHJ5U3RyaW5nWzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uY2hDb3VudHJ5Q29kZVsxXTsKKwlwSUVDb3VudHJ5LT5hYnlDb3VudHJ5U3RyaW5nWzJdID0gJyAnOworCWZvciAoaWkgPSBDQl9NQVhfQ0hBTk5FTF8yNEc7IGlpIDwgQ0JfTUFYX0NIQU5ORUw7IGlpKysgKSB7CisJCWlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbaWldICE9IDApIHsKKwkJCXBJRUNvdW50cnktPmFieUNvdW50cnlJbmZvW3BJRUNvdW50cnktPmxlbisrXSA9IHNDaGFubmVsVGJsW2lpKzFdLmJ5Q2hhbm5lbE51bWJlcjsKKwkJCXBJRUNvdW50cnktPmFieUNvdW50cnlJbmZvW3BJRUNvdW50cnktPmxlbisrXSA9IDE7CisJCQlwSUVDb3VudHJ5LT5hYnlDb3VudHJ5SW5mb1twSUVDb3VudHJ5LT5sZW4rK10gPSBDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5ieVBvd2VyW2lpXTsKKwkJfQorCX0KKwlwSUVDb3VudHJ5LT5sZW4gKz0gMzsKK30KKworYm9vbCBnZXRfY2hhbm5lbF9tYXBfaW5mbyh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgaW50IHVDaGFubmVsSW5kZXgsCisJCXVuc2lnbmVkIGNoYXIgKnBieUNoYW5uZWxOdW1iZXIsIHVuc2lnbmVkIGNoYXIgKnBieU1hcCkKK3sKKworCWlmICh1Q2hhbm5lbEluZGV4ID4gQ0JfTUFYX0NIQU5ORUwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkqcGJ5Q2hhbm5lbE51bWJlciA9IHNDaGFubmVsVGJsW3VDaGFubmVsSW5kZXhdLmJ5Q2hhbm5lbE51bWJlcjsKKwkqcGJ5TWFwID0gc0NoYW5uZWxUYmxbdUNoYW5uZWxJbmRleF0uYnlNQVA7CisJcmV0dXJuIHNDaGFubmVsVGJsW3VDaGFubmVsSW5kZXhdLmJWYWxpZDsKK30KKwordm9pZCBzZXRfY2hhbm5lbF9tYXBfaW5mbyh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgaW50IHVDaGFubmVsSW5kZXgsCisJCXVuc2lnbmVkIGNoYXIgYnlNYXApCit7CisKKwlpZiAodUNoYW5uZWxJbmRleCA+IENCX01BWF9DSEFOTkVMKSB7CisJCXJldHVybjsKKwl9CisJc0NoYW5uZWxUYmxbdUNoYW5uZWxJbmRleF0uYnlNQVAgfD0gYnlNYXA7Cit9CisKK3ZvaWQgY2xlYXJfY2hhbm5lbF9tYXBfaW5mbyh2b2lkICpwRGV2aWNlSGFuZGxlcikKK3sKKwl1bnNpZ25lZCBpbnQgaWkgPSAwOworCisJZm9yIChpaSA9IDE7IGlpIDw9ICBDQl9NQVhfQ0hBTk5FTDsgaWkrKykgeworCQlzQ2hhbm5lbFRibFtpaV0uYnlNQVAgPSAwOworCX0KK30KKwordW5zaWduZWQgY2hhciBhdXRvX2NoYW5uZWxfc2VsZWN0KHZvaWQgKnBEZXZpY2VIYW5kbGVyLCBDQVJEX1BIWV9UWVBFIGVQSFlUeXBlKQoreworCXVuc2lnbmVkIGludCBpaSA9IDA7CisJdW5zaWduZWQgY2hhciBieU9wdGlvbkNoYW5uZWwgPSAwOworCWludCBhaVdlaWdodFtDQl9NQVhfQ0hBTk5FTF8yNEcrMV0gPSB7LTEwMDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKworCWlmIChlUEhZVHlwZSA9PSBQSFlfVFlQRV8xMUEpIHsKKwkJZm9yKGlpID0gQ0JfTUFYX0NIQU5ORUxfMjRHICsgMSA7IGlpIDw9IENCX01BWF9DSEFOTkVMIDsgaWkrKykgeworCQkJaWYgKHNDaGFubmVsVGJsW2lpXS5iVmFsaWQgPT0gdHJ1ZSkgeworCQkJCWlmIChieU9wdGlvbkNoYW5uZWwgPT0gMCkgeworCQkJCQlieU9wdGlvbkNoYW5uZWwgPSAodW5zaWduZWQgY2hhcikgaWk7CisJCQkJfQorCQkJCWlmIChzQ2hhbm5lbFRibFtpaV0uYnlNQVAgPT0gMCkgeworCQkJCQlyZXR1cm4gKCh1bnNpZ25lZCBjaGFyKSBpaSk7CisJCQkJfSBlbHNlIGlmICggIShzQ2hhbm5lbFRibFtpaV0uYnlNQVAgJiAweDA4KSkgeworCQkJCQlieU9wdGlvbkNoYW5uZWwgPSAodW5zaWduZWQgY2hhcikgaWk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYnlPcHRpb25DaGFubmVsID0gMDsKKwkJZm9yKGlpID0gMSA7IGlpIDw9IENCX01BWF9DSEFOTkVMXzI0RyA7IGlpKyspIHsKKwkJCWlmIChzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID09IHRydWUpIHsKKwkJCQlpZiAoc0NoYW5uZWxUYmxbaWldLmJ5TUFQID09IDApIHsKKwkJCQkJYWlXZWlnaHRbaWldICs9IDEwMDsKKwkJCQl9IGVsc2UgaWYgKHNDaGFubmVsVGJsW2lpXS5ieU1BUCAmIDB4MDEpIHsKKwkJCQkJaWYgKGlpID4gMykgeworCQkJCQkJYWlXZWlnaHRbaWktM10gLT0gMTA7CisJCQkJCX0KKwkJCQkJaWYgKGlpID4gMikgeworCQkJCQkJYWlXZWlnaHRbaWktMl0gLT0gMjA7CisJCQkJCX0KKwkJCQkJaWYgKGlpID4gMSkgeworCQkJCQkJYWlXZWlnaHRbaWktMV0gLT0gNDA7CisJCQkJCX0KKwkJCQkJYWlXZWlnaHRbaWldIC09IDgwOworCQkJCQlpZiAoaWkgPCBDQl9NQVhfQ0hBTk5FTF8yNEcpIHsKKwkJCQkJCWFpV2VpZ2h0W2lpKzFdIC09IDQwOworCQkJCQl9CisJCQkJCWlmIChpaSA8IChDQl9NQVhfQ0hBTk5FTF8yNEcgLSAxKSkgeworCQkJCQkJYWlXZWlnaHRbaWkrMl0gLT0gMjA7CisJCQkJCX0KKwkJCQkJaWYgKGlpIDwgKENCX01BWF9DSEFOTkVMXzI0RyAtIDIpKSB7CisJCQkJCQlhaVdlaWdodFtpaSszXSAtPSAxMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IoaWkgPSAxIDsgaWkgPD0gQ0JfTUFYX0NIQU5ORUxfMjRHIDsgaWkrKykgeworCQkJaWYgKChzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID09IHRydWUpICYmCisJCQkJCShhaVdlaWdodFtpaV0gPiBhaVdlaWdodFtieU9wdGlvbkNoYW5uZWxdKSkgeworCQkJCWJ5T3B0aW9uQ2hhbm5lbCA9ICh1bnNpZ25lZCBjaGFyKSBpaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKGJ5T3B0aW9uQ2hhbm5lbCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzhmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NoYW5uZWwuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIEZpbGU6IGNoYW5uZWwuaAorICoKKyAqLworCisjaWZuZGVmIF9DSEFOTkVMX0hfCisjZGVmaW5lIF9DSEFOTkVMX0hfCisKKyNpbmNsdWRlICJ0dHlwZS5oIgorI2luY2x1ZGUgImNhcmQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGFnU0NoYW5uZWxUYmxFbGVtZW50IHsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbE51bWJlcjsKKyAgICB1bnNpZ25lZCBpbnQgdUZyZXF1ZW5jeTsKKyAgICBib29sIGJWYWxpZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TUFQOworfVNDaGFubmVsVGJsRWxlbWVudCwgKlBTQ2hhbm5lbFRibEVsZW1lbnQ7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworYm9vbCBpc19jaGFubmVsX3ZhbGlkKHVuc2lnbmVkIGludCBDb3VudHJ5Q29kZSk7Cit2b2lkIGluaXRfY2hhbm5lbF90YWJsZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7Cit1bnNpZ25lZCBjaGFyIGdldF9jaGFubmVsX21hcHBpbmcodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsTnVtYmVyLCBDQVJEX1BIWV9UWVBFIGVQaHlUeXBlKTsKK2Jvb2wgY2hhbm5lbF9nZXRfbGlzdCh1bnNpZ25lZCBpbnQgdUNvdW50cnlDb2RlSWR4LCB1bnNpZ25lZCBjaGFyICpwYnlDaGFubmVsVGFibGUpOwordW5zaWduZWQgY2hhciBnZXRfY2hhbm5lbF9udW1iZXIodm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsSW5kZXgpOworYm9vbCBzZXRfY2hhbm5lbCh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgaW50IHVDb25uZWN0aW9uQ2hhbm5lbCk7Cit2b2lkIHNldF9jb3VudHJ5X2luZm8odm9pZCAqcERldmljZUhhbmRsZXIsIENBUkRfUEhZX1RZUEUgZVBIWVR5cGUsIHZvaWQgKnBJRSk7Cit1bnNpZ25lZCBjaGFyIHNldF9zdXBwb3J0X2NoYW5uZWxzKHZvaWQgKnBEZXZpY2VIYW5kbGVyLCB1bnNpZ25lZCBjaGFyICpwYnlJRXMpOwordm9pZCBzZXRfY291bnRyeV9JRSh2b2lkICpwRGV2aWNlSGFuZGxlciwgdm9pZCAqcElFKTsKK2Jvb2wgZ2V0X2NoYW5uZWxfbWFwX2luZm8odm9pZCAqcERldmljZUhhbmRsZXIsIHVuc2lnbmVkIGludCB1Q2hhbm5lbEluZGV4LAorCQl1bnNpZ25lZCBjaGFyICpwYnlDaGFubmVsTnVtYmVyLCB1bnNpZ25lZCBjaGFyICpwYnlNYXApOwordm9pZCBzZXRfY2hhbm5lbF9tYXBfaW5mbyh2b2lkICpwRGV2aWNlSGFuZGxlciwgdW5zaWduZWQgaW50IHVDaGFubmVsSW5kZXgsCisJCXVuc2lnbmVkIGNoYXIgYnlNYXApOwordm9pZCBjbGVhcl9jaGFubmVsX21hcF9pbmZvKHZvaWQgKnBEZXZpY2VIYW5kbGVyKTsKK3Vuc2lnbmVkIGNoYXIgYXV0b19jaGFubmVsX3NlbGVjdCh2b2lkICpwRGV2aWNlSGFuZGxlciwgQ0FSRF9QSFlfVFlQRSBlUEhZVHlwZSk7CisKKworI2VuZGlmIC8qIF9DSEFOTkVMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NvdW50cnkuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY291bnRyeS5oCmluZGV4IDIwMDVkMjcuLjA1ZmRhNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY291bnRyeS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY291bnRyeS5oCkBAIC0xNTksMTkgKzE1OSw0IEBACiAgICAgQ0NPREVfTUFYCiB9IENPVU5UUllfQ09ERTsKIAotdHlwZWRlZiBzdHJ1Y3QgdGFnU0NvdW50cnlUYWJsZQotewotICAgIEJZVEUgICAgYnlDaGFubmVsQ291bnRyeUNvZGU7ICAgICAgICAgICAgIC8qIFRoZSBjb3VudHJ5IGNvZGUgICAgICAgICAqLwotICAgIENIQVIgICAgY2hDb3VudHJ5Q29kZVsyXTsKLSAgICBCWVRFICAgIGJDaGFubmVsSWR4TGlzdFtDQl9NQVhfQ0hBTk5FTF07ICAvKiBBdmFpbGFibGUgY2hhbm5lbHMgSW5kZXggKi8KLSAgICBCWVRFICAgIGJ5UG93ZXJbQ0JfTUFYX0NIQU5ORUxdOwotfSAgIFNDb3VudHJ5VGFibGUsICpQU0NvdW50cnlUYWJsZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybiBTQ291bnRyeVRhYmxlIENoYW5uZWxSdWxlVGFiW0NDT0RFX01BWCsxXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogI2VuZGlmICAvKiBfX0NPVU5UUllfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RhdGFyYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RhdGFyYXRlLmMKaW5kZXggMzhiMDlhNy4uZWZiYjhmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kYXRhcmF0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGF0YXJhdGUuYwpAQCAtNTEsMTEgKzUxLDExIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKLSBleHRlcm4gV09SRCBUeFJhdGVfaXdjb25maWc7IC8vMjAwOC01LTggPGFkZD4gYnkgY2hlc3RlcgorIGV4dGVybiB1bnNpZ25lZCBzaG9ydCBUeFJhdGVfaXdjb25maWc7IC8vMjAwOC01LTggPGFkZD4gYnkgY2hlc3RlcgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8vc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87Ci1jb25zdCBCWVRFIGFjYnlJRVJhdGVbTUFYX1JBVEVdID0KK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWNieUlFUmF0ZVtNQVhfUkFURV0gPQogezB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MEMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkN9OwogCiAjZGVmaW5lIEFVVE9SQVRFX1RYT0tfQ05UICAgICAgIDB4MDQwMApAQCAtNzUsNyArNzUsNyBAQAogICAgIFBLbm93bk5vZGVEQiBwc05vZGVEQlRhYmxlCiAgICAgKQogewotICAgIEJZVEUgICAgICAgICAgICBpaTsKKyAgICB1bnNpZ25lZCBjaGFyIGlpOwogCiAgICAgLy8gY2xlYXIgc3RhdGlzdGljIGNvdW50ZXIgZm9yIGF1dG9fcmF0ZQogICAgIGZvcihpaT0wO2lpPD1NQVhfUkFURTtpaSsrKSB7CkBAIC05NywxOSArOTcsMTkgQEAKICAqCiAgKiBQYXJhbWV0ZXJzOgogICogIEluOgotICogICAgICBCWVRFICAgIC0gUmF0ZSB2YWx1ZSBpbiBTdXBwUmF0ZXMgSUUgb3IgRXh0U3VwcFJhdGVzIElFCisgKiAgICAgIHVuc2lnbmVkIGNoYXIgLSBSYXRlIHZhbHVlIGluIFN1cHBSYXRlcyBJRSBvciBFeHRTdXBwUmF0ZXMgSUUKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCiAgKiBSZXR1cm4gVmFsdWU6IFJhdGVJZHgKICAqCiAtKi8KLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIERBVEFSQVRFYnlHZXRSYXRlSWR4ICgKLSAgICBCWVRFIGJ5UmF0ZQorICAgIHVuc2lnbmVkIGNoYXIgYnlSYXRlCiAgICAgKQogewotICAgIEJZVEUgICAgaWk7CisgICAgdW5zaWduZWQgY2hhciBpaTsKIAogICAgIC8vRXJhc2UgYmFzaWNSYXRlIGZsYWcuCiAgICAgYnlSYXRlID0gYnlSYXRlICYgMHg3RjsvLzAxMTEgMTExMQpAQCAtMTUxLDE5ICsxNTEsMTkgQEAKICAqCiAgKiBQYXJhbWV0ZXJzOgogICogIEluOgotICogICAgICBCWVRFICAgIC0gUmF0ZSB2YWx1ZSBpbiBTdXBwUmF0ZXMgSUUgb3IgRXh0U3VwcFJhdGVzIElFCisgKiAgICAgIHVuc2lnbmVkIGNoYXIgLSBSYXRlIHZhbHVlIGluIFN1cHBSYXRlcyBJRSBvciBFeHRTdXBwUmF0ZXMgSUUKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCiAgKiBSZXR1cm4gVmFsdWU6IFJhdGVJZHgKICAqCiAtKi8KLVdPUkQKK3Vuc2lnbmVkIHNob3J0CiB3R2V0UmF0ZUlkeCgKLSAgICBCWVRFIGJ5UmF0ZQorICAgIHVuc2lnbmVkIGNoYXIgYnlSYXRlCiAgICAgKQogewotICAgIFdPUkQgICAgaWk7CisgICAgdW5zaWduZWQgc2hvcnQgaWk7CiAKICAgICAvL0VyYXNlIGJhc2ljUmF0ZSBmbGFnLgogICAgIGJ5UmF0ZSA9IGJ5UmF0ZSAmIDB4N0Y7Ly8wMTExIDExMTEKQEAgLTE5OSwyMCArMTk5LDIwIEBACiAgICAgdm9pZCAqcERldmljZUhhbmRsZXIsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwSXRlbVJhdGVzLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEl0ZW1FeHRSYXRlcywKLSAgICBCT09MIGJVcGRhdGVCYXNpY1JhdGUsCi0gICAgUFdPUkQgcHdNYXhCYXNpY1JhdGUsCi0gICAgUFdPUkQgcHdNYXhTdXBwUmF0ZSwKLSAgICBQV09SRCBwd1N1cHBSYXRlLAotICAgIFBCWVRFIHBieVRvcENDS1JhdGUsCi0gICAgUEJZVEUgcGJ5VG9wT0ZETVJhdGUKKyAgICBib29sIGJVcGRhdGVCYXNpY1JhdGUsCisgICAgdW5zaWduZWQgc2hvcnQgKnB3TWF4QmFzaWNSYXRlLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd01heFN1cHBSYXRlLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd1N1cHBSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieVRvcENDS1JhdGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5VG9wT0ZETVJhdGUKICAgICApCiB7CiBQU0RldmljZSAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci1VSU5UICBpaTsKLUJZVEUgIGJ5SGlnaFN1cHBSYXRlID0gMDsKLUJZVEUgIGJ5UmF0ZSA9IDA7Ci1XT1JEICB3T2xkQmFzaWNSYXRlID0gcERldmljZS0+d0Jhc2ljUmF0ZTsKLVVJTlQgIHVSYXRlTGVuOwordW5zaWduZWQgaW50IGlpOwordW5zaWduZWQgY2hhciBieUhpZ2hTdXBwUmF0ZSA9IDA7Cit1bnNpZ25lZCBjaGFyIGJ5UmF0ZSA9IDA7Cit1bnNpZ25lZCBzaG9ydCB3T2xkQmFzaWNSYXRlID0gcERldmljZS0+d0Jhc2ljUmF0ZTsKK3Vuc2lnbmVkIGludCB1UmF0ZUxlbjsKIAogCiAgICAgaWYgKHBJdGVtUmF0ZXMgPT0gTlVMTCkKQEAgLTIzMSwxNCArMjMxLDE0IEBACiAgICAgfQogCiAgICAgZm9yIChpaSA9IDA7IGlpIDwgdVJhdGVMZW47IGlpKyspIHsKLSAgICAJYnlSYXRlID0gKEJZVEUpKHBJdGVtUmF0ZXMtPmFieVJhdGVzW2lpXSk7CisgICAgCWJ5UmF0ZSA9ICh1bnNpZ25lZCBjaGFyKShwSXRlbVJhdGVzLT5hYnlSYXRlc1tpaV0pOwogICAgICAgICBpZiAoV0xBTl9NR01UX0lTX0JBU0lDUkFURShieVJhdGUpICYmCi0gICAgICAgICAgICAoYlVwZGF0ZUJhc2ljUmF0ZSA9PSBUUlVFKSkgIHsKKyAgICAgICAgICAgIChiVXBkYXRlQmFzaWNSYXRlID09IHRydWUpKSAgewogICAgICAgICAgICAgLy8gQWRkIHRvIGJhc2ljIHJhdGUgc2V0LCB1cGRhdGUgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUgYW5kIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZQogICAgICAgICAgICAgQ0FSRGJBZGRCYXNpY1JhdGUoKHZvaWQgKilwRGV2aWNlLCB3R2V0UmF0ZUlkeChieVJhdGUpKTsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iUGFyc2VNYXhSYXRlIEFkZEJhc2ljUmF0ZTogJWRcbiIsIHdHZXRSYXRlSWR4KGJ5UmF0ZSkpOwogICAgICAgICB9Ci0gICAgICAgIGJ5UmF0ZSA9IChCWVRFKShwSXRlbVJhdGVzLT5hYnlSYXRlc1tpaV0mMHg3Rik7CisgICAgICAgIGJ5UmF0ZSA9ICh1bnNpZ25lZCBjaGFyKShwSXRlbVJhdGVzLT5hYnlSYXRlc1tpaV0mMHg3Rik7CiAgICAgICAgIGlmIChieUhpZ2hTdXBwUmF0ZSA9PSAwKQogICAgICAgICAgICAgYnlIaWdoU3VwcFJhdGUgPSBieVJhdGU7CiAgICAgICAgIGlmIChieVJhdGUgPiBieUhpZ2hTdXBwUmF0ZSkKQEAgLTI0OCwyMCArMjQ4LDIwIEBACiAgICAgaWYgKChwSXRlbUV4dFJhdGVzICE9IE5VTEwpICYmIChwSXRlbUV4dFJhdGVzLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTKSAmJgogICAgICAgICAocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlICE9IFBIWV9UWVBFXzExQikpIHsKIAotICAgICAgICBVSU5UICB1RXh0UmF0ZUxlbiA9IHBJdGVtRXh0UmF0ZXMtPmxlbjsKKyAgICAgICAgdW5zaWduZWQgaW50IHVFeHRSYXRlTGVuID0gcEl0ZW1FeHRSYXRlcy0+bGVuOwogCiAgICAgICAgIGlmICh1RXh0UmF0ZUxlbiA+IFdMQU5fUkFURVNfTUFYTEVOKQogICAgICAgICAgICAgdUV4dFJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTjsKIAogICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCB1RXh0UmF0ZUxlbiA7IGlpKyspIHsKLSAgICAgICAgICAgIGJ5UmF0ZSA9IChCWVRFKShwSXRlbUV4dFJhdGVzLT5hYnlSYXRlc1tpaV0pOworICAgICAgICAgICAgYnlSYXRlID0gKHVuc2lnbmVkIGNoYXIpKHBJdGVtRXh0UmF0ZXMtPmFieVJhdGVzW2lpXSk7CiAgICAgICAgICAgICAvLyBzZWxlY3QgaGlnaGVzdCBiYXNpYyByYXRlCiAgICAgICAgICAgICBpZiAoV0xBTl9NR01UX0lTX0JBU0lDUkFURShwSXRlbUV4dFJhdGVzLT5hYnlSYXRlc1tpaV0pKSB7CiAgICAgICAgICAgICAJLy8gQWRkIHRvIGJhc2ljIHJhdGUgc2V0LCB1cGRhdGUgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUgYW5kIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZQogICAgICAgICAgICAgICAgIENBUkRiQWRkQmFzaWNSYXRlKCh2b2lkICopcERldmljZSwgd0dldFJhdGVJZHgoYnlSYXRlKSk7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJQYXJzZU1heFJhdGUgQWRkQmFzaWNSYXRlOiAlZFxuIiwgd0dldFJhdGVJZHgoYnlSYXRlKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBieVJhdGUgPSAoQllURSkocEl0ZW1FeHRSYXRlcy0+YWJ5UmF0ZXNbaWldJjB4N0YpOworICAgICAgICAgICAgYnlSYXRlID0gKHVuc2lnbmVkIGNoYXIpKHBJdGVtRXh0UmF0ZXMtPmFieVJhdGVzW2lpXSYweDdGKTsKICAgICAgICAgICAgIGlmIChieUhpZ2hTdXBwUmF0ZSA9PSAwKQogICAgICAgICAgICAgICAgIGJ5SGlnaFN1cHBSYXRlID0gYnlSYXRlOwogICAgICAgICAgICAgaWYgKGJ5UmF0ZSA+IGJ5SGlnaFN1cHBSYXRlKQpAQCAtMzE0LDE0ICszMTQsMTQgQEAKICAgICApCiB7CiBQU0RldmljZSAgICAgICAgcERldmljZSA9IChQU0RldmljZSkgcERldmljZUhhbmRsZXI7Ci1XT1JEICAgICAgICAgICAgd0lkeERvd25SYXRlID0gMDsKLVVJTlQgICAgICAgICAgICBpaTsKLS8vRFdPUkQgICAgICAgICAgIGR3UmF0ZVRhYmxlW01BWF9SQVRFXSAgPSB7MSwgICAyLCAgIDUsICAgMTEsICA2LCAgICA5LCAgICAxMiwgICAxOCwgIDI0LCAgMzYsICA0OCwgIDU0fTsKLUJPT0wgICAgICAgICAgICBiQXV0b1JhdGVbTUFYX1JBVEVdICAgID0ge1RSVUUsVFJVRSxUUlVFLFRSVUUsRkFMU0UsRkFMU0UsVFJVRSxUUlVFLFRSVUUsVFJVRSxUUlVFLFRSVUV9OwotRFdPUkQgICAgICAgICAgIGR3VGhyb3VnaHB1dFRibFtNQVhfUkFURV0gPSB7MTAsIDIwLCA1NSwgMTEwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDB9OwotRFdPUkQgICAgICAgICAgIGR3VGhyb3VnaHB1dCA9IDA7Ci1XT1JEICAgICAgICAgICAgd0lkeFVwUmF0ZSA9IDA7Ci1EV09SRCAgICAgICAgICAgZHdUeERpZmYgPSAwOwordW5zaWduZWQgc2hvcnQgd0lkeERvd25SYXRlID0gMDsKK3Vuc2lnbmVkIGludCBpaTsKKy8vdW5zaWduZWQgbG9uZyBkd1JhdGVUYWJsZVtNQVhfUkFURV0gID0gezEsICAgMiwgICA1LCAgIDExLCAgNiwgICAgOSwgICAgMTIsICAgMTgsICAyNCwgIDM2LCAgNDgsICA1NH07Citib29sIGJBdXRvUmF0ZVtNQVhfUkFURV0gICAgPSB7dHJ1ZSx0cnVlLHRydWUsdHJ1ZSxmYWxzZSxmYWxzZSx0cnVlLHRydWUsdHJ1ZSx0cnVlLHRydWUsdHJ1ZX07CisJdW5zaWduZWQgbG9uZyBkd1Rocm91Z2hwdXRUYmxbTUFYX1JBVEVdID0gezEwLCAyMCwgNTUsIDExMCwgNjAsIDkwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwfTsKKwl1bnNpZ25lZCBsb25nIGR3VGhyb3VnaHB1dCA9IDA7CisJdW5zaWduZWQgc2hvcnQgd0lkeFVwUmF0ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBkd1R4RGlmZiA9IDA7CiAKICAgICBpZiAocERldmljZS0+cE1nbXQtPmVTY2FuU3RhdGUgIT0gV01BQ19OT19TQ0FOTklORykgewogICAgICAgICAvLyBEb24ndCBkbyBGYWxsYmFjayB3aGVuIHNjYW5uaW5nIENoYW5uZWwKQEAgLTM0NiwxMSArMzQ2LDExIEBACiAKICAgICBmb3IoaWk9MDtpaTxNQVhfUkFURTtpaSsrKSB7CiAgICAgICAgIGlmIChwc05vZGVEQlRhYmxlLT53U3VwcFJhdGUgJiAoMHgwMDAxPDxpaSkpIHsKLSAgICAgICAgICAgIGlmIChiQXV0b1JhdGVbaWldID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICB3SWR4VXBSYXRlID0gKFdPUkQpIGlpOworICAgICAgICAgICAgaWYgKGJBdXRvUmF0ZVtpaV0gPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIHdJZHhVcFJhdGUgPSAodW5zaWduZWQgc2hvcnQpIGlpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYkF1dG9SYXRlW2lpXSA9IEZBTFNFOworICAgICAgICAgICAgYkF1dG9SYXRlW2lpXSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNzIsOSArMzcyLDkgQEAKICAgICBmb3IoaWkgPSBwc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZTsgaWkgPiAwOykgewogICAgICAgICBpaS0tOwogICAgICAgICBpZiAoIChkd1Rocm91Z2hwdXRUYmxbaWldID4gZHdUaHJvdWdocHV0KSAmJgotICAgICAgICAgICAgIChiQXV0b1JhdGVbaWldPT1UUlVFKSApIHsKKyAgICAgICAgICAgICAoYkF1dG9SYXRlW2lpXT09dHJ1ZSkgKSB7CiAgICAgICAgICAgICBkd1Rocm91Z2hwdXQgPSBkd1Rocm91Z2hwdXRUYmxbaWldOwotICAgICAgICAgICAgd0lkeERvd25SYXRlID0gKFdPUkQpIGlpOworICAgICAgICAgICAgd0lkeERvd25SYXRlID0gKHVuc2lnbmVkIHNob3J0KSBpaTsKICAgICAgICAgfQogICAgIH0KICAgICBwc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZSA9IHdJZHhEb3duUmF0ZTsKQEAgLTQwOSwxNCArNDA5LDE0IEBACiAgKiBSZXR1cm4gVmFsdWU6IE5vbmUKICAqCiAtKi8KLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIFJBVEV1U2V0SUUgKAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcFNyY1JhdGVzLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcERzdFJhdGVzLAotICAgIFVJTlQgICAgICAgICAgICAgICAgdVJhdGVMZW4KKyAgICB1bnNpZ25lZCBpbnQgdVJhdGVMZW4KICAgICApCiB7Ci0gICAgVUlOVCBpaSwgdXUsIHVSYXRlQ250ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaWksIHV1LCB1UmF0ZUNudCA9IDA7CiAKICAgICBpZiAoKHBTcmNSYXRlcyA9PSBOVUxMKSB8fCAocERzdFJhdGVzID09IE5VTEwpKQogICAgICAgICByZXR1cm4gMDsKQEAgLTQzMiw2ICs0MzIsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAoQllURSl1UmF0ZUNudDsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpdVJhdGVDbnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGF0YXJhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGF0YXJhdGUuaAppbmRleCBiOGNhNzkyLi40ZjhlYTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RhdGFyYXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kYXRhcmF0ZS5oCkBAIC01OSwxMiArNTksMTIgQEAKICAgICB2b2lkICpwRGV2aWNlSGFuZGxlciwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBJdGVtUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwSXRlbUV4dFJhdGVzLAotICAgIEJPT0wgYlVwZGF0ZUJhc2ljUmF0ZSwKLSAgICBQV09SRCBwd01heEJhc2ljUmF0ZSwKLSAgICBQV09SRCBwd01heFN1cHBSYXRlLAotICAgIFBXT1JEIHB3U3VwcFJhdGUsCi0gICAgUEJZVEUgcGJ5VG9wQ0NLUmF0ZSwKLSAgICBQQllURSBwYnlUb3BPRkRNUmF0ZQorICAgIGJvb2wgYlVwZGF0ZUJhc2ljUmF0ZSwKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdNYXhCYXNpY1JhdGUsCisgICAgdW5zaWduZWQgc2hvcnQgKnB3TWF4U3VwcFJhdGUsCisgICAgdW5zaWduZWQgc2hvcnQgKnB3U3VwcFJhdGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5VG9wQ0NLUmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlUb3BPRkRNUmF0ZQogICAgICk7CiAKIHZvaWQKQEAgLTczLDIyICs3MywyMiBAQAogICAgIFBLbm93bk5vZGVEQiBwc05vZGVEQlRhYmxlCiAgICAgKTsKIAotQllURQordW5zaWduZWQgY2hhcgogUkFURXVTZXRJRSgKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBTcmNSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBEc3RSYXRlcywKLSAgICBVSU5UICAgICAgICAgICAgICAgIHVSYXRlTGVuCisgICAgdW5zaWduZWQgaW50IHVSYXRlTGVuCiAgICAgKTsKIAotV09SRAordW5zaWduZWQgc2hvcnQKIHdHZXRSYXRlSWR4KAotICAgIEJZVEUgYnlSYXRlCisgICAgdW5zaWduZWQgY2hhciBieVJhdGUKICAgICApOwogCiAKLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIERBVEFSQVRFYnlHZXRSYXRlSWR4KAotICAgIEJZVEUgYnlSYXRlCisgICAgdW5zaWduZWQgY2hhciBieVJhdGUKICAgICApOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGVzYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXNjLmgKaW5kZXggY2VkYjFlNy4uMTM4ODk3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXNjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXNjLmgKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAKIC8qCiB0eXBlZGVmIHN0cnVjdCB0YWdSREVTMCB7Ci0gICAgV09SRCAgICB3UmVzQ291bnQ7Ci0gICAgV09SRCAgICB3ZjFPd25lciA7Ci0vLyAgICBXT1JEICAgIGYxNVJlc2VydmVkIDogMTU7Ci0vLyAgICBXT1JEICAgIGYxT3duZXIgOiAxOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNDb3VudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3ZjFPd25lciA7CisvLyAgICB1bnNpZ25lZCBzaG9ydCBmMTVSZXNlcnZlZCA6IDE1OworLy8gICAgdW5zaWduZWQgc2hvcnQgZjFPd25lciA6IDE7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNSREVTMDsKICovCkBAIC0yNTUsMTMgKzI1NSwxMyBAQAogI2lmZGVmIF9fQklHX0VORElBTgogCiB0eXBlZGVmIHN0cnVjdCB0YWdSREVTMCB7Ci0gICB2b2xhdGlsZSBXT1JEICAgIHdSZXNDb3VudDsKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHdSZXNDb3VudDsKIAl1bmlvbiB7Ci0JCXZvbGF0aWxlIFUxNiAgICBmMTVSZXNlcnZlZDsKKwkJdm9sYXRpbGUgdTE2ICAgIGYxNVJlc2VydmVkOwogCQlzdHJ1Y3QgewotICAgICAgICAgICAgdm9sYXRpbGUgVTggZjhSZXNlcnZlZDE7Ci0JCQl2b2xhdGlsZSBVOCBmMU93bmVyOjE7Ci0JCQl2b2xhdGlsZSBVOCBmN1Jlc2VydmVkOjc7CisgICAgICAgICAgICB2b2xhdGlsZSB1OCBmOFJlc2VydmVkMTsKKwkJCXZvbGF0aWxlIHU4IGYxT3duZXI6MTsKKwkJCXZvbGF0aWxlIHU4IGY3UmVzZXJ2ZWQ6NzsKIAkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQpAQCAtMjcwLDkgKzI3MCw5IEBACiAjZWxzZQogCiB0eXBlZGVmIHN0cnVjdCB0YWdSREVTMCB7Ci0gICAgV09SRCAgICB3UmVzQ291bnQ7Ci0gICAgV09SRCAgICBmMTVSZXNlcnZlZCA6IDE1OwotICAgIFdPUkQgICAgZjFPd25lciA6IDE7CisgICAgdW5zaWduZWQgc2hvcnQgd1Jlc0NvdW50OworICAgIHVuc2lnbmVkIHNob3J0IGYxNVJlc2VydmVkIDogMTU7CisgICAgdW5zaWduZWQgc2hvcnQgZjFPd25lciA6IDE7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNSREVTMDsKIApAQCAtMjgwLDggKzI4MCw4IEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnUkRFUzEgewotICAgIFdPUkQgICB3UmVxQ291bnQ7Ci0gICAgV09SRCAgIHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmVxQ291bnQ7CisgICAgdW5zaWduZWQgc2hvcnQgd1Jlc2VydmVkOwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUkRFUzE7CiAKQEAgLTI5MSwxMSArMjkxLDExIEBACiB0eXBlZGVmIHN0cnVjdCB0YWdTUnhEZXNjIHsKICAgICB2b2xhdGlsZSBTUkRFUzAgbV9yZDBSRDA7CiAgICAgdm9sYXRpbGUgU1JERVMxIG1fcmQxUkQxOwotICAgIHZvbGF0aWxlIFUzMiAgICBidWZmX2FkZHI7Ci0gICAgdm9sYXRpbGUgVTMyICAgIG5leHRfZGVzYzsKKyAgICB2b2xhdGlsZSB1MzIgICAgYnVmZl9hZGRyOworICAgIHZvbGF0aWxlIHUzMiAgICBuZXh0X2Rlc2M7CiAgICAgc3RydWN0IHRhZ1NSeERlc2MgICAqbmV4dDsvLzQgYnl0ZXMKICAgICB2b2xhdGlsZSBQREVWSUNFX1JEX0lORk8gICAgcFJESW5mbzsvLzQgYnl0ZXMKLSAgICB2b2xhdGlsZSBVMzIgICAgUmVzZXJ2ZWRbMl07Ly84IGJ5dGVzCisgICAgdm9sYXRpbGUgdTMyICAgIFJlc2VydmVkWzJdOy8vOCBieXRlcwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnhEZXNjLCAqUFNSeERlc2M7CiB0eXBlZGVmIGNvbnN0IFNSeERlc2MgKlBDU1J4RGVzYzsKQEAgLTMwNCwyNCArMzA0LDI0IEBACiAKIC8qCiB0eXBlZGVmIHN0cnVjdCB0YWdUREVTMCB7Ci0gICAgdm9sYXRpbGUgICAgQllURSAgICBieVRTUjA7Ci0gICAgdm9sYXRpbGUgICAgQllURSAgICBieVRTUjE7Ci0gICAgdm9sYXRpbGUgICAgV09SRCAgICB3T3duZXJfVHh0aW1lOwotLy8gICAgdm9sYXRpbGUgICAgV09SRCAgICBmMTVUeHRpbWUgOiAxNTsKLS8vICAgIHZvbGF0aWxlICAgIFdPUkQgICAgZjFPd25lcjoxOworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIGNoYXIgYnlUU1IwOworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIGNoYXIgYnlUU1IxOworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIHNob3J0IHdPd25lcl9UeHRpbWU7CisvLyAgICB2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBmMTVUeHRpbWUgOiAxNTsKKy8vICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIHNob3J0IGYxT3duZXI6MTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1RERVMwOwogKi8KIAogdHlwZWRlZiBzdHJ1Y3QgdGFnVERFUzAgewotICAgIHZvbGF0aWxlICAgIEJZVEUgICAgYnlUU1IwOwotICAgIHZvbGF0aWxlICAgIEJZVEUgICAgYnlUU1IxOworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIGNoYXIgYnlUU1IwOworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIGNoYXIgYnlUU1IxOwogCXVuaW9uIHsKLQkJdm9sYXRpbGUgVTE2ICAgIGYxNVR4dGltZTsKKwkJdm9sYXRpbGUgdTE2ICAgIGYxNVR4dGltZTsKIAkJc3RydWN0IHsKLSAgICAgICAgICAgIHZvbGF0aWxlIFU4IGY4UmVzZXJ2ZWQxOwotCQkJdm9sYXRpbGUgVTggZjFPd25lcjoxOwotCQkJdm9sYXRpbGUgVTggZjdSZXNlcnZlZDo3OworICAgICAgICAgICAgdm9sYXRpbGUgdTggZjhSZXNlcnZlZDE7CisJCQl2b2xhdGlsZSB1OCBmMU93bmVyOjE7CisJCQl2b2xhdGlsZSB1OCBmN1Jlc2VydmVkOjc7CiAJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKQEAgLTMzMCwxMCArMzMwLDEwIEBACiAjZWxzZQogCiB0eXBlZGVmIHN0cnVjdCB0YWdUREVTMCB7Ci0gICAgdm9sYXRpbGUgICAgQllURSAgICBieVRTUjA7Ci0gICAgdm9sYXRpbGUgICAgQllURSAgICBieVRTUjE7Ci0gICAgdm9sYXRpbGUgICAgV09SRCAgICBmMTVUeHRpbWUgOiAxNTsKLSAgICB2b2xhdGlsZSAgICBXT1JEICAgIGYxT3duZXI6MTsKKyAgICB2b2xhdGlsZSAgICB1bnNpZ25lZCBjaGFyIGJ5VFNSMDsKKyAgICB2b2xhdGlsZSAgICB1bnNpZ25lZCBjaGFyIGJ5VFNSMTsKKyAgICB2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBmMTVUeHRpbWUgOiAxNTsKKyAgICB2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBmMU93bmVyOjE7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUREVTMDsKIApAQCAtMzQxLDIyICszNDEsMjIgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdUREVTMSB7Ci0gICAgdm9sYXRpbGUgICAgV09SRCAgICB3UmVxQ291bnQ7Ci0gICAgdm9sYXRpbGUgICAgQllURSAgICBieVRDUjsKLSAgICB2b2xhdGlsZSAgICBCWVRFICAgIGJ5UmVzZXJ2ZWQ7CisgICAgdm9sYXRpbGUgICAgdW5zaWduZWQgc2hvcnQgd1JlcUNvdW50OworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIGNoYXIgYnlUQ1I7CisgICAgdm9sYXRpbGUgICAgdW5zaWduZWQgY2hhciBieVJlc2VydmVkOwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVERFUzE7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnREVWSUNFX1REX0lORk97CiAgICAgc3RydWN0IHNrX2J1ZmYqICAgICBza2I7Ci0gICAgUEJZVEUgICAgICAgICAgICAgICBidWY7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOwogICAgIGRtYV9hZGRyX3QgICAgICAgICAgc2tiX2RtYTsKICAgICBkbWFfYWRkcl90ICAgICAgICAgIGJ1Zl9kbWE7CiAgICAgZG1hX2FkZHJfdCAgICAgICAgICBjdXJyX2Rlc2M7Ci0gICAgRFdPUkQgICAgICAgICAgICAgICBkd1JlcUNvdW50OwotICAgIERXT1JEICAgICAgICAgICAgICAgZHdIZWFkZXJMZW5ndGg7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUZsYWdzOworICAgIHVuc2lnbmVkIGxvbmcgZHdSZXFDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGR3SGVhZGVyTGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgYnlGbGFnczsKIH0gREVWSUNFX1REX0lORk8sICAgICpQREVWSUNFX1REX0lORk87CiAKIC8qCkBAIC0zNzgsMTEgKzM3OCwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1R4RGVzYyB7CiAgICAgdm9sYXRpbGUgICAgU1RERVMwICBtX3RkMFREMDsKICAgICB2b2xhdGlsZSAgICBTVERFUzEgIG1fdGQxVEQxOwotICAgIHZvbGF0aWxlICAgIFUzMiAgICBidWZmX2FkZHI7Ci0gICAgdm9sYXRpbGUgICAgVTMyICAgIG5leHRfZGVzYzsKKyAgICB2b2xhdGlsZSAgICB1MzIgICAgYnVmZl9hZGRyOworICAgIHZvbGF0aWxlICAgIHUzMiAgICBuZXh0X2Rlc2M7CiAgICAgc3RydWN0IHRhZ1NUeERlc2MqICBuZXh0OyAvLzQgYnl0ZXMKICAgICB2b2xhdGlsZSAgICBQREVWSUNFX1REX0lORk8gcFRESW5mbzsvLzQgYnl0ZXMKLSAgICB2b2xhdGlsZSAgICBVMzIgICAgUmVzZXJ2ZWRbMl07Ly84IGJ5dGVzCisgICAgdm9sYXRpbGUgICAgdTMyICAgIFJlc2VydmVkWzJdOy8vOCBieXRlcwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVHhEZXNjLCAqUFNUeERlc2M7CiB0eXBlZGVmIGNvbnN0IFNUeERlc2MgKlBDU1R4RGVzYzsKQEAgLTM5MSwxMyArMzkxLDEzIEBACiB0eXBlZGVmIHN0cnVjdCB0YWdTVHhTeW5jRGVzYyB7CiAgICAgdm9sYXRpbGUgICAgU1RERVMwICBtX3RkMFREMDsKICAgICB2b2xhdGlsZSAgICBTVERFUzEgIG1fdGQxVEQxOwotICAgIHZvbGF0aWxlICAgIERXT1JEICAgYnVmZl9hZGRyOyAvLyBwb2ludGVyIHRvIGxvZ2ljYWwgYnVmZmVyCi0gICAgdm9sYXRpbGUgICAgRFdPUkQgICBuZXh0X2Rlc2M7IC8vIHBvaW50ZXIgdG8gbmV4dCBsb2dpY2FsIGRlc2NyaXB0b3IKLSAgICB2b2xhdGlsZSAgICBXT1JEICAgIG1fd0ZJRk9DdGw7Ci0gICAgdm9sYXRpbGUgICAgV09SRCAgICBtX3dUaW1lU3RhbXA7CisgICAgdm9sYXRpbGUgICAgdTMyIGJ1ZmZfYWRkcjsgLy8gcG9pbnRlciB0byBsb2dpY2FsIGJ1ZmZlcgorICAgIHZvbGF0aWxlICAgIHUzMiBuZXh0X2Rlc2M7IC8vIHBvaW50ZXIgdG8gbmV4dCBsb2dpY2FsIGRlc2NyaXB0b3IKKyAgICB2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBtX3dGSUZPQ3RsOworICAgIHZvbGF0aWxlICAgIHVuc2lnbmVkIHNob3J0IG1fd1RpbWVTdGFtcDsKICAgICBzdHJ1Y3QgdGFnU1R4U3luY0Rlc2MqICBuZXh0OyAvLzQgYnl0ZXMKICAgICB2b2xhdGlsZSAgICBQREVWSUNFX1REX0lORk8gcFRESW5mbzsvLzQgYnl0ZXMKLSAgICB2b2xhdGlsZSAgICBEV09SRCAgIG1fZHdSZXNlcnZlZDI7CisgICAgdm9sYXRpbGUgICAgdTMyIG1fZHdSZXNlcnZlZDI7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeFN5bmNEZXNjLCAqUFNUeFN5bmNEZXNjOwogdHlwZWRlZiBjb25zdCBTVHhTeW5jRGVzYyAqUENTVHhTeW5jRGVzYzsKQEAgLTQwNywzNSArNDA3LDM1IEBACiAvLyBSc3ZUaW1lIGJ1ZmZlciBoZWFkZXIKIC8vCiB0eXBlZGVmIHN0cnVjdCB0YWdTUnJ2VGltZV9nUlRTIHsKLSAgICBXT1JEICAgICAgICB3UlRTVHhScnZUaW1lX2JhOwotICAgIFdPUkQgICAgICAgIHdSVFNUeFJydlRpbWVfYWE7Ci0gICAgV09SRCAgICAgICAgd1JUU1R4UnJ2VGltZV9iYjsKLSAgICBXT1JEICAgICAgICB3UmVzZXJ2ZWQ7Ci0gICAgV09SRCAgICAgICAgd1R4UnJ2VGltZV9iOwotICAgIFdPUkQgICAgICAgIHdUeFJydlRpbWVfYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UlRTVHhScnZUaW1lX2JhOworICAgIHVuc2lnbmVkIHNob3J0IHdSVFNUeFJydlRpbWVfYWE7CisgICAgdW5zaWduZWQgc2hvcnQgd1JUU1R4UnJ2VGltZV9iYjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmVzZXJ2ZWQ7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4UnJ2VGltZV9iOworICAgIHVuc2lnbmVkIHNob3J0IHdUeFJydlRpbWVfYTsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnJ2VGltZV9nUlRTLCAqUFNScnZUaW1lX2dSVFM7CiB0eXBlZGVmIGNvbnN0IFNScnZUaW1lX2dSVFMgKlBDU1JydlRpbWVfZ1JUUzsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1JydlRpbWVfZ0NUUyB7Ci0gICAgV09SRCAgICAgICAgd0NUU1R4UnJ2VGltZV9iYTsKLSAgICBXT1JEICAgICAgICB3UmVzZXJ2ZWQ7Ci0gICAgV09SRCAgICAgICAgd1R4UnJ2VGltZV9iOwotICAgIFdPUkQgICAgICAgIHdUeFJydlRpbWVfYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q1RTVHhScnZUaW1lX2JhOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHhScnZUaW1lX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4UnJ2VGltZV9hOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNScnZUaW1lX2dDVFMsICpQU1JydlRpbWVfZ0NUUzsKIHR5cGVkZWYgY29uc3QgU1JydlRpbWVfZ0NUUyAqUENTUnJ2VGltZV9nQ1RTOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUnJ2VGltZV9hYiB7Ci0gICAgV09SRCAgICAgICAgd1JUU1R4UnJ2VGltZTsKLSAgICBXT1JEICAgICAgICB3VHhScnZUaW1lOworICAgIHVuc2lnbmVkIHNob3J0IHdSVFNUeFJydlRpbWU7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4UnJ2VGltZTsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnJ2VGltZV9hYiwgKlBTUnJ2VGltZV9hYjsKIHR5cGVkZWYgY29uc3QgU1JydlRpbWVfYWIgKlBDU1JydlRpbWVfYWI7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NScnZUaW1lX2F0aW0gewotICAgIFdPUkQgICAgICAgIHdDVFNUeFJydlRpbWVfYmE7Ci0gICAgV09SRCAgICAgICAgd1R4UnJ2VGltZV9hOworICAgIHVuc2lnbmVkIHNob3J0IHdDVFNUeFJydlRpbWVfYmE7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4UnJ2VGltZV9hOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNScnZUaW1lX2F0aW0sICpQU1JydlRpbWVfYXRpbTsKIHR5cGVkZWYgY29uc3QgU1JydlRpbWVfYXRpbSAqUENTUnJ2VGltZV9hdGltOwpAQCAtNDQ0LDI1ICs0NDQsMjUgQEAKIC8vIFJUUyBidWZmZXIgaGVhZGVyCiAvLwogdHlwZWRlZiBzdHJ1Y3QgdGFnU1JUU0RhdGEgewotICAgIFdPUkQgICAgd0ZyYW1lQ29udHJvbDsKLSAgICBXT1JEICAgIHdEdXJhdGlvbklEOwotICAgIEJZVEUgICAgYWJ5UkFbRVRIX0FMRU5dOwotICAgIEJZVEUgICAgYWJ5VEFbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdGcmFtZUNvbnRyb2w7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uSUQ7CisgICAgdW5zaWduZWQgY2hhciBhYnlSQVtFVEhfQUxFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlUQVtFVEhfQUxFTl07CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1JUU0RhdGEsICpQU1JUU0RhdGE7CiB0eXBlZGVmIGNvbnN0IFNSVFNEYXRhICpQQ1NSVFNEYXRhOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlRTX2cgewotICAgIEJZVEUgICAgICAgIGJ5U2lnbmFsRmllbGRfYjsKLSAgICBCWVRFICAgICAgICBieVNlcnZpY2VGaWVsZF9iOwotICAgIFdPUkQgICAgICAgIHdUcmFuc21pdExlbmd0aF9iOwotICAgIEJZVEUgICAgICAgIGJ5U2lnbmFsRmllbGRfYTsKLSAgICBCWVRFICAgICAgICBieVNlcnZpY2VGaWVsZF9hOwotICAgIFdPUkQgICAgICAgIHdUcmFuc21pdExlbmd0aF9hOwotICAgIFdPUkQgICAgICAgIHdEdXJhdGlvbl9iYTsKLSAgICBXT1JEICAgICAgICB3RHVyYXRpb25fYWE7Ci0gICAgV09SRCAgICAgICAgd0R1cmF0aW9uX2JiOwotICAgIFdPUkQgICAgICAgIHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2lnbmFsRmllbGRfYjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd1RyYW5zbWl0TGVuZ3RoX2I7CisgICAgdW5zaWduZWQgY2hhciBieVNpZ25hbEZpZWxkX2E7CisgICAgdW5zaWduZWQgY2hhciBieVNlcnZpY2VGaWVsZF9hOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aF9hOworICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbl9iYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25fYWE7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2JiOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNlcnZlZDsKICAgICBTUlRTRGF0YSAgICBEYXRhOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNSVFNfZywgKlBTUlRTX2c7CkBAIC00NzAsMjAgKzQ3MCwyMCBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NSVFNfZ19GQiB7Ci0gICAgQllURSAgICAgICAgYnlTaWduYWxGaWVsZF9iOwotICAgIEJZVEUgICAgICAgIGJ5U2VydmljZUZpZWxkX2I7Ci0gICAgV09SRCAgICAgICAgd1RyYW5zbWl0TGVuZ3RoX2I7Ci0gICAgQllURSAgICAgICAgYnlTaWduYWxGaWVsZF9hOwotICAgIEJZVEUgICAgICAgIGJ5U2VydmljZUZpZWxkX2E7Ci0gICAgV09SRCAgICAgICAgd1RyYW5zbWl0TGVuZ3RoX2E7Ci0gICAgV09SRCAgICAgICAgd0R1cmF0aW9uX2JhOwotICAgIFdPUkQgICAgICAgIHdEdXJhdGlvbl9hYTsKLSAgICBXT1JEICAgICAgICB3RHVyYXRpb25fYmI7Ci0gICAgV09SRCAgICAgICAgd1Jlc2VydmVkOwotICAgIFdPUkQgICAgICAgIHdSVFNEdXJhdGlvbl9iYV9mMDsKLSAgICBXT1JEICAgICAgICB3UlRTRHVyYXRpb25fYWFfZjA7Ci0gICAgV09SRCAgICAgICAgd1JUU0R1cmF0aW9uX2JhX2YxOwotICAgIFdPUkQgICAgICAgIHdSVFNEdXJhdGlvbl9hYV9mMTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2lnbmFsRmllbGRfYjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd1RyYW5zbWl0TGVuZ3RoX2I7CisgICAgdW5zaWduZWQgY2hhciBieVNpZ25hbEZpZWxkX2E7CisgICAgdW5zaWduZWQgY2hhciBieVNlcnZpY2VGaWVsZF9hOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aF9hOworICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbl9iYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25fYWE7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2JiOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UlRTRHVyYXRpb25fYmFfZjA7CisgICAgdW5zaWduZWQgc2hvcnQgd1JUU0R1cmF0aW9uX2FhX2YwOworICAgIHVuc2lnbmVkIHNob3J0IHdSVFNEdXJhdGlvbl9iYV9mMTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UlRTRHVyYXRpb25fYWFfZjE7CiAgICAgU1JUU0RhdGEgICAgRGF0YTsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUlRTX2dfRkIsICpQU1JUU19nX0ZCOwpAQCAtNDkxLDExICs0OTEsMTEgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlRTX2FiIHsKLSAgICBCWVRFICAgICAgICBieVNpZ25hbEZpZWxkOwotICAgIEJZVEUgICAgICAgIGJ5U2VydmljZUZpZWxkOwotICAgIFdPUkQgICAgICAgIHdUcmFuc21pdExlbmd0aDsKLSAgICBXT1JEICAgICAgICB3RHVyYXRpb247Ci0gICAgV09SRCAgICAgICAgd1Jlc2VydmVkOworICAgIHVuc2lnbmVkIGNoYXIgYnlTaWduYWxGaWVsZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb247CisgICAgdW5zaWduZWQgc2hvcnQgd1Jlc2VydmVkOwogICAgIFNSVFNEYXRhICAgIERhdGE7CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1JUU19hYiwgKlBTUlRTX2FiOwpAQCAtNTAzLDEzICs1MDMsMTMgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlRTX2FfRkIgewotICAgIEJZVEUgICAgICAgIGJ5U2lnbmFsRmllbGQ7Ci0gICAgQllURSAgICAgICAgYnlTZXJ2aWNlRmllbGQ7Ci0gICAgV09SRCAgICAgICAgd1RyYW5zbWl0TGVuZ3RoOwotICAgIFdPUkQgICAgICAgIHdEdXJhdGlvbjsKLSAgICBXT1JEICAgICAgICB3UmVzZXJ2ZWQ7Ci0gICAgV09SRCAgICAgICAgd1JUU0R1cmF0aW9uX2YwOwotICAgIFdPUkQgICAgICAgIHdSVFNEdXJhdGlvbl9mMTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2lnbmFsRmllbGQ7CisgICAgdW5zaWduZWQgY2hhciBieVNlcnZpY2VGaWVsZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHJhbnNtaXRMZW5ndGg7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UlRTRHVyYXRpb25fZjA7CisgICAgdW5zaWduZWQgc2hvcnQgd1JUU0R1cmF0aW9uX2YxOwogICAgIFNSVFNEYXRhICAgIERhdGE7CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1JUU19hX0ZCLCAqUFNSVFNfYV9GQjsKQEAgLTUyMCwzMiArNTIwLDMyIEBACiAvLyBDVFMgYnVmZmVyIGhlYWRlcgogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1NDVFNEYXRhIHsKLSAgICBXT1JEICAgIHdGcmFtZUNvbnRyb2w7Ci0gICAgV09SRCAgICB3RHVyYXRpb25JRDsKLSAgICBCWVRFICAgIGFieVJBW0VUSF9BTEVOXTsKLSAgICBXT1JEICAgIHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RnJhbWVDb250cm9sOworICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbklEOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UkFbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNlcnZlZDsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTQ1RTRGF0YSwgKlBTQ1RTRGF0YTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0NUUyB7Ci0gICAgQllURSAgICAgICAgYnlTaWduYWxGaWVsZF9iOwotICAgIEJZVEUgICAgICAgIGJ5U2VydmljZUZpZWxkX2I7Ci0gICAgV09SRCAgICAgICAgd1RyYW5zbWl0TGVuZ3RoX2I7Ci0gICAgV09SRCAgICAgICAgd0R1cmF0aW9uX2JhOwotICAgIFdPUkQgICAgICAgIHdSZXNlcnZlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2lnbmFsRmllbGRfYjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd1RyYW5zbWl0TGVuZ3RoX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2JhOworICAgIHVuc2lnbmVkIHNob3J0IHdSZXNlcnZlZDsKICAgICBTQ1RTRGF0YSAgICBEYXRhOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNDVFMsICpQU0NUUzsKIHR5cGVkZWYgY29uc3QgU0NUUyAqUENTQ1RTOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTQ1RTX0ZCIHsKLSAgICBCWVRFICAgICAgICBieVNpZ25hbEZpZWxkX2I7Ci0gICAgQllURSAgICAgICAgYnlTZXJ2aWNlRmllbGRfYjsKLSAgICBXT1JEICAgICAgICB3VHJhbnNtaXRMZW5ndGhfYjsKLSAgICBXT1JEICAgICAgICB3RHVyYXRpb25fYmE7Ci0gICAgV09SRCAgICAgICAgd1Jlc2VydmVkOwotICAgIFdPUkQgICAgICAgIHdDVFNEdXJhdGlvbl9iYV9mMDsKLSAgICBXT1JEICAgICAgICB3Q1RTRHVyYXRpb25fYmFfZjE7CisgICAgdW5zaWduZWQgY2hhciBieVNpZ25hbEZpZWxkX2I7CisgICAgdW5zaWduZWQgY2hhciBieVNlcnZpY2VGaWVsZF9iOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aF9iOworICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbl9iYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmVzZXJ2ZWQ7CisgICAgdW5zaWduZWQgc2hvcnQgd0NUU0R1cmF0aW9uX2JhX2YwOworICAgIHVuc2lnbmVkIHNob3J0IHdDVFNEdXJhdGlvbl9iYV9mMTsKICAgICBTQ1RTRGF0YSAgICBEYXRhOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNDVFNfRkIsICpQU0NUU19GQjsKQEAgLTU1NiwxOSArNTU2LDE5IEBACiAvLyBUeCBGSUZPIGhlYWRlcgogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1NUeEJ1ZkhlYWQgewotICAgIERXT1JEICAgYWR3VHhLZXlbNF07Ci0gICAgV09SRCAgICB3RklGT0N0bDsKLSAgICBXT1JEICAgIHdUaW1lU3RhbXA7Ci0gICAgV09SRCAgICB3RnJhZ0N0bDsKLSAgICBCWVRFICAgIGJ5VHhQb3dlcjsKLSAgICBCWVRFICAgIHdSZXNlcnZlZDsKKyAgICB1MzIgYWR3VHhLZXlbNF07CisgICAgdW5zaWduZWQgc2hvcnQgd0ZJRk9DdGw7CisgICAgdW5zaWduZWQgc2hvcnQgd1RpbWVTdGFtcDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RnJhZ0N0bDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VHhQb3dlcjsKKyAgICB1bnNpZ25lZCBjaGFyIHdSZXNlcnZlZDsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVHhCdWZIZWFkLCAqUFNUeEJ1ZkhlYWQ7CiB0eXBlZGVmIGNvbnN0IFNUeEJ1ZkhlYWQgKlBDU1R4QnVmSGVhZDsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1R4U2hvcnRCdWZIZWFkIHsKLSAgICBXT1JEICAgIHdGSUZPQ3RsOwotICAgIFdPUkQgICAgd1RpbWVTdGFtcDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RklGT0N0bDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VGltZVN0YW1wOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeFNob3J0QnVmSGVhZCwgKlBTVHhTaG9ydEJ1ZkhlYWQ7CiB0eXBlZGVmIGNvbnN0IFNUeFNob3J0QnVmSGVhZCAqUENTVHhTaG9ydEJ1ZkhlYWQ7CkBAIC01NzcsNTcgKzU3Nyw1NyBAQAogLy8gVHggZGF0YSBoZWFkZXIKIC8vCiB0eXBlZGVmIHN0cnVjdCB0YWdTVHhEYXRhSGVhZF9nIHsKLSAgICBCWVRFICAgIGJ5U2lnbmFsRmllbGRfYjsKLSAgICBCWVRFICAgIGJ5U2VydmljZUZpZWxkX2I7Ci0gICAgV09SRCAgICB3VHJhbnNtaXRMZW5ndGhfYjsKLSAgICBCWVRFICAgIGJ5U2lnbmFsRmllbGRfYTsKLSAgICBCWVRFICAgIGJ5U2VydmljZUZpZWxkX2E7Ci0gICAgV09SRCAgICB3VHJhbnNtaXRMZW5ndGhfYTsKLSAgICBXT1JEICAgIHdEdXJhdGlvbl9iOwotICAgIFdPUkQgICAgd0R1cmF0aW9uX2E7Ci0gICAgV09SRCAgICB3VGltZVN0YW1wT2ZmX2I7Ci0gICAgV09SRCAgICB3VGltZVN0YW1wT2ZmX2E7CisgICAgdW5zaWduZWQgY2hhciBieVNpZ25hbEZpZWxkX2I7CisgICAgdW5zaWduZWQgY2hhciBieVNlcnZpY2VGaWVsZF9iOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aF9iOworICAgIHVuc2lnbmVkIGNoYXIgYnlTaWduYWxGaWVsZF9hOworICAgIHVuc2lnbmVkIGNoYXIgYnlTZXJ2aWNlRmllbGRfYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHJhbnNtaXRMZW5ndGhfYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25fYjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25fYTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VGltZVN0YW1wT2ZmX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd1RpbWVTdGFtcE9mZl9hOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeERhdGFIZWFkX2csICpQU1R4RGF0YUhlYWRfZzsKIHR5cGVkZWYgY29uc3QgU1R4RGF0YUhlYWRfZyAqUENTVHhEYXRhSGVhZF9nOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTVHhEYXRhSGVhZF9nX0ZCIHsKLSAgICBCWVRFICAgIGJ5U2lnbmFsRmllbGRfYjsKLSAgICBCWVRFICAgIGJ5U2VydmljZUZpZWxkX2I7Ci0gICAgV09SRCAgICB3VHJhbnNtaXRMZW5ndGhfYjsKLSAgICBCWVRFICAgIGJ5U2lnbmFsRmllbGRfYTsKLSAgICBCWVRFICAgIGJ5U2VydmljZUZpZWxkX2E7Ci0gICAgV09SRCAgICB3VHJhbnNtaXRMZW5ndGhfYTsKLSAgICBXT1JEICAgIHdEdXJhdGlvbl9iOwotICAgIFdPUkQgICAgd0R1cmF0aW9uX2E7Ci0gICAgV09SRCAgICB3RHVyYXRpb25fYV9mMDsKLSAgICBXT1JEICAgIHdEdXJhdGlvbl9hX2YxOwotICAgIFdPUkQgICAgd1RpbWVTdGFtcE9mZl9iOwotICAgIFdPUkQgICAgd1RpbWVTdGFtcE9mZl9hOworICAgIHVuc2lnbmVkIGNoYXIgYnlTaWduYWxGaWVsZF9iOworICAgIHVuc2lnbmVkIGNoYXIgYnlTZXJ2aWNlRmllbGRfYjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHJhbnNtaXRMZW5ndGhfYjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2lnbmFsRmllbGRfYTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkX2E7CisgICAgdW5zaWduZWQgc2hvcnQgd1RyYW5zbWl0TGVuZ3RoX2E7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2I7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2E7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2FfZjA7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2FfZjE7CisgICAgdW5zaWduZWQgc2hvcnQgd1RpbWVTdGFtcE9mZl9iOworICAgIHVuc2lnbmVkIHNob3J0IHdUaW1lU3RhbXBPZmZfYTsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVHhEYXRhSGVhZF9nX0ZCLCAqUFNUeERhdGFIZWFkX2dfRkI7CiB0eXBlZGVmIGNvbnN0IFNUeERhdGFIZWFkX2dfRkIgKlBDU1R4RGF0YUhlYWRfZ19GQjsKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTVHhEYXRhSGVhZF9hYiB7Ci0gICAgQllURSAgICBieVNpZ25hbEZpZWxkOwotICAgIEJZVEUgICAgYnlTZXJ2aWNlRmllbGQ7Ci0gICAgV09SRCAgICB3VHJhbnNtaXRMZW5ndGg7Ci0gICAgV09SRCAgICB3RHVyYXRpb247Ci0gICAgV09SRCAgICB3VGltZVN0YW1wT2ZmOworICAgIHVuc2lnbmVkIGNoYXIgYnlTaWduYWxGaWVsZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb247CisgICAgdW5zaWduZWQgc2hvcnQgd1RpbWVTdGFtcE9mZjsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTVHhEYXRhSGVhZF9hYiwgKlBTVHhEYXRhSGVhZF9hYjsKIHR5cGVkZWYgY29uc3QgU1R4RGF0YUhlYWRfYWIgKlBDU1R4RGF0YUhlYWRfYWI7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1R4RGF0YUhlYWRfYV9GQiB7Ci0gICAgQllURSAgICBieVNpZ25hbEZpZWxkOwotICAgIEJZVEUgICAgYnlTZXJ2aWNlRmllbGQ7Ci0gICAgV09SRCAgICB3VHJhbnNtaXRMZW5ndGg7Ci0gICAgV09SRCAgICB3RHVyYXRpb247Ci0gICAgV09SRCAgICB3VGltZVN0YW1wT2ZmOwotICAgIFdPUkQgICAgd0R1cmF0aW9uX2YwOwotICAgIFdPUkQgICAgd0R1cmF0aW9uX2YxOworICAgIHVuc2lnbmVkIGNoYXIgYnlTaWduYWxGaWVsZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2VydmljZUZpZWxkOworICAgIHVuc2lnbmVkIHNob3J0IHdUcmFuc21pdExlbmd0aDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb247CisgICAgdW5zaWduZWQgc2hvcnQgd1RpbWVTdGFtcE9mZjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25fZjA7CisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uX2YxOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeERhdGFIZWFkX2FfRkIsICpQU1R4RGF0YUhlYWRfYV9GQjsKIHR5cGVkZWYgY29uc3QgU1R4RGF0YUhlYWRfYV9GQiAqUENTVHhEYXRhSGVhZF9hX0ZCOwpAQCAtNjM2LDM3ICs2MzYsMzcgQEAKIC8vIE1JQ0hEUiBkYXRhIGhlYWRlcgogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1NNSUNIRFJIZWFkIHsKLSAgICBEV09SRCAgIGFkd0hEUjBbNF07Ci0gICAgRFdPUkQgICBhZHdIRFIxWzRdOwotICAgIERXT1JEICAgYWR3SERSMls0XTsKKyAgICB1MzIgYWR3SERSMFs0XTsKKyAgICB1MzIgYWR3SERSMVs0XTsKKyAgICB1MzIgYWR3SERSMls0XTsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTTUlDSERSSGVhZCwgKlBTTUlDSERSSGVhZDsKIHR5cGVkZWYgY29uc3QgU01JQ0hEUkhlYWQgKlBDU01JQ0hEUkhlYWQ7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NCRUFDT05DdGwgewotICAgIERXT1JEICAgQnVmUmVhZHkgOiAxOwotICAgIERXT1JEICAgVFNGICAgICAgOiAxNTsKLSAgICBEV09SRCAgIEJ1ZkxlbiAgIDogMTE7Ci0gICAgRFdPUkQgICBSZXNlcnZlZCA6IDU7CisgICAgdTMyIEJ1ZlJlYWR5IDogMTsKKyAgICB1MzIgVFNGICAgICAgOiAxNTsKKyAgICB1MzIgQnVmTGVuICAgOiAxMTsKKyAgICB1MzIgUmVzZXJ2ZWQgOiA1OwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNCRUFDT05DdGw7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1NlY3JldEtleSB7Ci0gICAgRFdPUkQgICBkd0xvd0R3b3JkOwotICAgIEJZVEUgICAgYnlIaWdoQnl0ZTsKKyAgICB1MzIgZHdMb3dEd29yZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5SGlnaEJ5dGU7CiB9X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1NlY3JldEtleTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0tleUVudHJ5IHsKLSAgICBCWVRFICBhYnlBZGRySGlbMl07Ci0gICAgV09SRCAgd0tDVEw7Ci0gICAgQllURSAgYWJ5QWRkckxvWzRdOwotICAgIERXT1JEIGR3S2V5MFs0XTsKLSAgICBEV09SRCBkd0tleTFbNF07Ci0gICAgRFdPUkQgZHdLZXkyWzRdOwotICAgIERXT1JEIGR3S2V5M1s0XTsKLSAgICBEV09SRCBkd0tleTRbNF07CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRySGlbMl07CisgICAgdW5zaWduZWQgc2hvcnQgd0tDVEw7CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRyTG9bNF07CisgICAgdTMyIGR3S2V5MFs0XTsKKyAgICB1MzIgZHdLZXkxWzRdOworICAgIHUzMiBkd0tleTJbNF07CisgICAgdTMyIGR3S2V5M1s0XTsKKyAgICB1MzIgZHdLZXk0WzRdOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNLZXlFbnRyeTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2UuaAppbmRleCA0MGVlNGUxLi4yZTdjMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlLmgKQEAgLTQ4LDEwICs0OCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaWYuaD4KIC8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CkBAIC0yMTgsNyArMjE4LDcgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRAkweDAxCiAKIC8vIFBNS0lEIFN0cnVjdHVyZXMKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRVsxNl07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTkRJU184MDJfMTFfUE1LSURfVkFMVUVbMTZdOwogCiAKIHR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfV0VQX1NUQVRVUwpAQCAtMjUwLDcgKzI1MCw3IEBACiAvL0FkZGVkIG5ldyB0eXBlcyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3RzLgogdHlwZWRlZiBzdHJ1Y3QgX1BNS0lEX0NBTkRJREFURSB7CiAgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Ci0gICAgVUxPTkcgRmxhZ3M7CisgICAgdW5zaWduZWQgbG9uZyBGbGFnczsKIH0gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKIAogCkBAIC0yNjEsMTUgKzI2MSwxNSBAQAogfSBCU1NJRF9JTkZPLCAqUEJTU0lEX0lORk87CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NQTUtJRCB7Ci0gICAgVUxPTkcgTGVuZ3RoOwotICAgIFVMT05HIEJTU0lESW5mb0NvdW50OworICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgQlNTSURJbmZvQ291bnQ7CiAgICAgQlNTSURfSU5GTyBCU1NJREluZm9bTUFYX0JTU0lESU5GT180X1BNS0lEXTsKIH0gU1BNS0lELCAqUFNQTUtJRDsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1BNS0lEQ2FuZGlkYXRlRXZlbnQgewogICAgIE5ESVNfODAyXzExX1NUQVRVU19UWVBFICAgICBTdGF0dXNUeXBlOwotICAgIFVMT05HIFZlcnNpb247ICAgICAgIC8vIFZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZQotICAgIFVMT05HIE51bUNhbmRpZGF0ZXM7IC8vIE5vLiBvZiBwbWtpZCBjYW5kaWRhdGVzCisgICAgdW5zaWduZWQgbG9uZyBWZXJzaW9uOyAgICAgICAvLyBWZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICB1bnNpZ25lZCBsb25nIE51bUNhbmRpZGF0ZXM7IC8vIE5vLiBvZiBwbWtpZCBjYW5kaWRhdGVzCiAgICAgUE1LSURfQ0FORElEQVRFIENhbmRpZGF0ZUxpc3RbTUFYX1BNS0lETElTVF07CiB9IFNQTUtJRENhbmRpZGF0ZUV2ZW50LCAqUFNQTUtJRENhbmRpZGF0ZUV2ZW50OwogCkBAIC0yNzksMTAgKzI3OSwxMCBAQAogI2RlZmluZSBNQVhfUVVJRVRfQ09VTlQgICAgIDgKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1F1aWV0Q29udHJvbCB7Ci0gICAgQk9PTCAgICAgICAgYkVuYWJsZTsKLSAgICBEV09SRCAgICAgICBkd1N0YXJ0VGltZTsKLSAgICBCWVRFICAgICAgICBieVBlcmlvZDsKLSAgICBXT1JEICAgICAgICB3RHVyYXRpb247CisgICAgYm9vbCBiRW5hYmxlOworICAgIHVuc2lnbmVkIGxvbmcgZHdTdGFydFRpbWU7CisgICAgdW5zaWduZWQgY2hhciBieVBlcmlvZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb247CiB9IFNRdWlldENvbnRyb2wsICpQU1F1aWV0Q29udHJvbDsKIAogLy8tLQpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgY2hhciogICAgICAgbmFtZTsKICAgICBpbnQgICAgICAgICBpb19zaXplOwogICAgIGludCAgICAgICAgIG5UeFF1ZXVlOwotICAgIFUzMiAgICAgICAgIGZsYWdzOworICAgIHUzMiAgICAgICAgIGZsYWdzOwogfSBDSElQX0lORk8sICpQQ0hJUF9JTkZPOwogCiAKQEAgLTMwMywxNSArMzAzLDE1IEBACiAKIC8vIFRoZSByZWNlaXZlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gY2FjaGUgZW50cnkKIHR5cGVkZWYgc3RydWN0IHRhZ1NDYWNoZUVudHJ5ewotICAgIFdPUkQgICAgICAgIHdGbVNlcXVlbmNlOwotICAgIEJZVEUgICAgICAgIGFieUFkZHIyW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Rm1TZXF1ZW5jZTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIyW0VUSF9BTEVOXTsKIH0gU0NhY2hlRW50cnksICpQU0NhY2hlRW50cnk7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDYWNoZXsKIC8qIFRoZSByZWNlaXZlIGNhY2hlIGlzIHVwZGF0ZWQgY2lyY3VsYXJseS4gIFRoZSBuZXh0IGVudHJ5IHRvIGJlIHdyaXR0ZW4gaXMKICAqIGluZGV4ZWQgYnkgdGhlICJJblB0ciIuCiAqLwotICAgIFVJTlQgICAgICAgICAgICB1SW5QdHI7ICAgICAgICAgLy8gUGxhY2UgdG8gdXNlIG5leHQKKyAgICB1bnNpZ25lZCBpbnQgdUluUHRyOyAgICAgICAgIC8vIFBsYWNlIHRvIHVzZSBuZXh0CiAgICAgU0NhY2hlRW50cnkgICAgIGFzQ2FjaGVFbnRyeVtEVVBMSUNBVEVfUlhfQ0FDSEVfTEVOR1RIXTsKIH0gU0NhY2hlLCAqUFNDYWNoZTsKIApAQCAtMzE5LDE0ICszMTksMTQgQEAKIC8vIERlRnJhZ21lbnQgQ29udHJvbCBCbG9jaywgdXNlZCBmb3IgY29sbGVjdGluZyBmcmFnbWVudHMgcHJpb3IgdG8gcmVhc3NlbWJseQogdHlwZWRlZiBzdHJ1Y3QgdGFnU0RlRnJhZ0NvbnRyb2xCbG9jawogewotICAgIFdPUkQgICAgICAgICAgICB3U2VxdWVuY2U7Ci0gICAgV09SRCAgICAgICAgICAgIHdGcmFnTnVtOwotICAgIEJZVEUgICAgICAgICAgICBhYnlBZGRyMltFVEhfQUxFTl07Ci0JVUlOVCAgICAgICAgICAgIHVMaWZldGltZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3U2VxdWVuY2U7CisgICAgdW5zaWduZWQgc2hvcnQgd0ZyYWdOdW07CisgICAgdW5zaWduZWQgY2hhciBhYnlBZGRyMltFVEhfQUxFTl07CisgICAgdW5zaWduZWQgaW50IHVMaWZldGltZTsKICAgICBzdHJ1Y3Qgc2tfYnVmZiogc2tiOwotICAgIFBCWVRFICAgICAgICAgICBwYnlSeEJ1ZmZlcjsKLSAgICBVSU5UICAgICAgICAgICAgY2JGcmFtZUxlbmd0aDsKLSAgICBCT09MICAgICAgICAgICAgYkluVXNlOworICAgIHVuc2lnbmVkIGNoYXIgKnBieVJ4QnVmZmVyOworICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoOworICAgIGJvb2wgYkluVXNlOwogfSBTRGVGcmFnQ29udHJvbEJsb2NrLCAqUFNEZUZyYWdDb250cm9sQmxvY2s7CiAKIApAQCAtMzg2LDcgKzM4Niw3IEBACiAgICAgaW50ICAgICAgICAgc2hvcnRfcmV0cnk7CiAgICAgaW50ICAgICAgICAgbG9uZ19yZXRyeTsKICAgICBpbnQgICAgICAgICBiYnBfdHlwZTsKLSAgICBVMzIgICAgICAgICBmbGFnczsKKyAgICB1MzIgICAgICAgICBmbGFnczsKIH0gT1BUSU9OUywgKlBPUFRJT05TOwogCiAKQEAgLTQxNywyMSArNDE3LDIxIEBACiAgICAgZG1hX2FkZHJfdCAgICAgICAgICAgICAgICAgIHR4X2J1ZnNfZG1hMTsKICAgICBkbWFfYWRkcl90ICAgICAgICAgICAgICAgICAgdHhfYmVhY29uX2RtYTsKIAotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgICAgICB0eDBfYnVmczsKLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgdHgxX2J1ZnM7Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgIHR4X2JlYWNvbl9idWZzOworICAgIHVuc2lnbmVkIGNoYXIgKnR4MF9idWZzOworICAgIHVuc2lnbmVkIGNoYXIgKnR4MV9idWZzOworICAgIHVuc2lnbmVkIGNoYXIgKnR4X2JlYWNvbl9idWZzOwogCiAgICAgQ0hJUF9UWVBFICAgICAgICAgICAgICAgICAgIGNoaXBfaWQ7CiAKLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydE9mZnNldDsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgZHdJc3I7Ci0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWFkZHI7Ci0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIGlvYWRkcjsKLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgaW9fc2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgUG9ydE9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyOworICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBtZW1hZGRyOworICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBpb2FkZHI7CisgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgIGlvX3NpemU7CiAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlSZXZJZDsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgU3ViU3lzdGVtSUQ7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIFN1YlZlbmRvcklEOworICAgIHVuc2lnbmVkIGNoYXIgYnlSZXZJZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBTdWJTeXN0ZW1JRDsKKyAgICB1bnNpZ25lZCBzaG9ydCBTdWJWZW5kb3JJRDsKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBuVHhRdWV1ZXM7CiAgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgICAgIGlURFVzZWRbVFlQRV9NQVhURF07CkBAIC00NDgsMTcgKzQ0OCwxNyBAQAogICAgIFNDYWNoZSAgICAgICAgICAgICAgICAgICAgICBzRHVwUnhDYWNoZTsKIAogICAgIFNEZUZyYWdDb250cm9sQmxvY2sgICAgICAgICBzUnhERkNCW0NCX01BWF9SWF9GUkFHXTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgY2JERkNCOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICBjYkZyZWVERkNCOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICB1Q3VycmVudERGQ0JJZHg7CisgICAgdW5zaWduZWQgaW50CWNiREZDQjsKKyAgICB1bnNpZ25lZCBpbnQJY2JGcmVlREZDQjsKKyAgICB1bnNpZ25lZCBpbnQJdUN1cnJlbnRERkNCSWR4OwogCiAgICAgT1BUSU9OUyAgICAgICAgICAgICAgICAgICAgIHNPcHRzOwogCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKIAotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICByeF9idWZfc3o7CisgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X2J1Zl9zejsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGljYXN0X2xpbWl0OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieVJ4TW9kZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UnhNb2RlOwogCiAgICAgc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgIGxvY2s7CiAvL1BMSUNFX0RFQlVHLT4KQEAgLTQ3MiwxOSArNDcyLDE5IEBACiAvL1BMSUNFX0RFQlVHIDwtCiAKIAotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICByeF9ieXRlczsKKyAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcnhfYnl0ZXM7CiAKICAgICAvLyBWZXJzaW9uIGNvbnRyb2wKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlMb2NhbElEOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieVJGVHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UkZUeXBlOwogCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5TWF4UHdyTGV2ZWw7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5Wm9uZVR5cGU7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJab25lUmVnRXhpc3Q7Ci0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlPcmlnaW5hbFpvbmV0eXBlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYnlNYWNDb250ZXh0W01BQ19NQVhfQ09OVEVYVF9SRUddOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICBiTGlua1Bhc3M7ICAgICAgICAgIC8vIGxpbmsgc3RhdHVzOiBPSyBvciBmYWlsCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFieUN1cnJlbnROZXRBZGRyW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWF4UHdyTGV2ZWw7CisgICAgdW5zaWduZWQgY2hhciBieVpvbmVUeXBlOworICAgIGJvb2wgYlpvbmVSZWdFeGlzdDsKKyAgIHVuc2lnbmVkIGNoYXIgYnlPcmlnaW5hbFpvbmV0eXBlOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5TWFjQ29udGV4dFtNQUNfTUFYX0NPTlRFWFRfUkVHXTsKKyAgICBib29sIGJMaW5rUGFzczsgICAgICAgICAgLy8gbGluayBzdGF0dXM6IE9LIG9yIGZhaWwKKyAgICB1bnNpZ25lZCBjaGFyIGFieUN1cnJlbnROZXRBZGRyW0VUSF9BTEVOXTsKIAogICAgIC8vIEFkYXB0ZXIgc3RhdGlzdGljcwogICAgIFNTdGF0Q291bnRlciAgICAgICAgICAgICAgICBzY1N0YXRpc3RpYzsKQEAgLTQ5NywyNDkgKzQ5NywyNDkgQEAKICAgICBTTWdtdE9iamVjdCAgICAgICAgICAgICAgICAgc01nbXRPYmo7CiAKICAgICAvLyA4MDIuMTEgTUFDIHNwZWNpZmljCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIHVDdXJyUlNTSTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlDdXJyU1E7CisgICAgdW5zaWduZWQgaW50CXVDdXJyUlNTSTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q3VyclNROwogCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3VHhBbnRlbm5hU2VsOwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd1J4QW50ZW5uYVNlbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlBbnRlbm5hQ291bnQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5UnhBbnRlbm5hTW9kZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlUeEFudGVubmFNb2RlOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICBiVHhSeEFudEludjsKKyAgICB1bnNpZ25lZCBsb25nIGR3VHhBbnRlbm5hU2VsOworICAgIHVuc2lnbmVkIGxvbmcgZHdSeEFudGVubmFTZWw7CisgICAgdW5zaWduZWQgY2hhciBieUFudGVubmFDb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UnhBbnRlbm5hTW9kZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VHhBbnRlbm5hTW9kZTsKKyAgICBib29sIGJUeFJ4QW50SW52OwogCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgIHBieVRtcEJ1ZmY7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIHVTSUZTOyAgICAvL0N1cnJlbnQgU0lGUwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICB1RElGUzsgICAgLy9DdXJyZW50IERJRlMKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgdUVJRlM7ICAgIC8vQ3VycmVudCBFSUZTCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIHVTbG90OyAgICAvL0N1cnJlbnQgU2xvdFRpbWUKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgdUN3TWluOyAgIC8vQ3VycmVudCBDd01pbgotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICB1Q3dNYXg7ICAgLy9Dd01heCBpcyBmaXhlZCBvbiAxMDIzLgorICAgIHVuc2lnbmVkIGNoYXIgKnBieVRtcEJ1ZmY7CisgICAgdW5zaWduZWQgaW50CXVTSUZTOyAgICAvL0N1cnJlbnQgU0lGUworICAgIHVuc2lnbmVkIGludAl1RElGUzsgICAgLy9DdXJyZW50IERJRlMKKyAgICB1bnNpZ25lZCBpbnQJdUVJRlM7ICAgIC8vQ3VycmVudCBFSUZTCisgICAgdW5zaWduZWQgaW50CXVTbG90OyAgICAvL0N1cnJlbnQgU2xvdFRpbWUKKyAgICB1bnNpZ25lZCBpbnQJdUN3TWluOyAgIC8vQ3VycmVudCBDd01pbgorICAgIHVuc2lnbmVkIGludAl1Q3dNYXg7ICAgLy9Dd01heCBpcyBmaXhlZCBvbiAxMDIzLgogICAgIC8vIFBIWSBwYXJhbWV0ZXIKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlTSUZTOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieURJRlM7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5RUlGUzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlTbG90OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieUNXTWF4TWluOworICAgIHVuc2lnbmVkIGNoYXIgYnlTSUZTOworICAgIHVuc2lnbmVkIGNoYXIgYnlESUZTOworICAgIHVuc2lnbmVkIGNoYXIgYnlFSUZTOworICAgIHVuc2lnbmVkIGNoYXIgYnlTbG90OworICAgIHVuc2lnbmVkIGNoYXIgYnlDV01heE1pbjsKICAgICBDQVJEX1BIWV9UWVBFICAgICAgICAgICAgICAgZUN1cnJlbnRQSFlUeXBlOwogCiAKICAgICBWSUFfQkJfVFlQRSAgICAgICAgICAgICAgICAgYnlCQlR5cGU7IC8vMDogMTFBLCAxOjExQiwgMjoxMUcKICAgICBWSUFfUEtUX1RZUEUgICAgICAgICAgICAgICAgYnlQYWNrZXRUeXBlOyAvLzA6MTFhLDE6MTFiLDI6MTFnYihvbmx5IENDSyBpbiBCYXNpY1JhdGUpLDM6MTFnYShPRkRNIGluIEJhc2ljIFJhdGUpCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdCYXNpY1JhdGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5QUNLUmF0ZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlUb3BPRkRNQmFzaWNSYXRlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieVRvcENDS0Jhc2ljUmF0ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3QmFzaWNSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlBQ0tSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlUb3BPRkRNQmFzaWNSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlUb3BDQ0tCYXNpY1JhdGU7CiAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlNaW5DaGFubmVsOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieU1heENoYW5uZWw7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIHVDb25uZWN0aW9uUmF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWluQ2hhbm5lbDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWF4Q2hhbm5lbDsKKyAgICB1bnNpZ25lZCBpbnQJdUNvbm5lY3Rpb25SYXRlOwogCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5UHJlYW1ibGVUeXBlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieVNob3J0UHJlYW1ibGU7CisgICAgdW5zaWduZWQgY2hhciBieVByZWFtYmxlVHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2hvcnRQcmVhbWJsZTsKIAotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3Q3VycmVudFJhdGU7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdSVFNUaHJlc2hvbGQ7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdGcmFnbWVudGF0aW9uVGhyZXNob2xkOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBieVNob3J0UmV0cnlMaW1pdDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlMb25nUmV0cnlMaW1pdDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VycmVudFJhdGU7CisgICAgdW5zaWduZWQgc2hvcnQgd1JUU1RocmVzaG9sZDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2hvcnRSZXRyeUxpbWl0OworICAgIHVuc2lnbmVkIGNoYXIgYnlMb25nUmV0cnlMaW1pdDsKICAgICBDQVJEX09QX01PREUgICAgICAgICAgICAgICAgZU9QTW9kZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlPcE1vZGU7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJCU1NJREZpbHRlcjsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgd01heFRyYW5zbWl0TVNEVUxpZmV0aW1lOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYnlCU1NJRFtFVEhfQUxFTl07Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFieURlc2lyZUJTU0lEW0VUSF9BTEVOXTsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgd0NUU0R1cmF0aW9uOyAgICAgICAvLyB1cGRhdGUgd2hpbGUgc3BlZWQgY2hhbmdlCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdBQ0tEdXJhdGlvbjsgICAgICAgLy8gdXBkYXRlIHdoaWxlIHNwZWVkIGNoYW5nZQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3UlRTVHJhbnNtaXRMZW47ICAgIC8vIHVwZGF0ZSB3aGlsZSBzcGVlZCBjaGFuZ2UKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlSVFNTZXJ2aWNlRmllbGQ7ICAvLyB1cGRhdGUgd2hpbGUgc3BlZWQgY2hhbmdlCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJ5UlRTU2lnbmFsRmllbGQ7ICAgLy8gdXBkYXRlIHdoaWxlIHNwZWVkIGNoYW5nZQorICAgIHVuc2lnbmVkIGNoYXIgYnlPcE1vZGU7CisgICAgYm9vbCBiQlNTSURGaWx0ZXI7CisgICAgdW5zaWduZWQgc2hvcnQgd01heFRyYW5zbWl0TVNEVUxpZmV0aW1lOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5QlNTSURbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5RGVzaXJlQlNTSURbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdDVFNEdXJhdGlvbjsgICAgICAgLy8gdXBkYXRlIHdoaWxlIHNwZWVkIGNoYW5nZQorICAgIHVuc2lnbmVkIHNob3J0IHdBQ0tEdXJhdGlvbjsgICAgICAgLy8gdXBkYXRlIHdoaWxlIHNwZWVkIGNoYW5nZQorICAgIHVuc2lnbmVkIHNob3J0IHdSVFNUcmFuc21pdExlbjsgICAgLy8gdXBkYXRlIHdoaWxlIHNwZWVkIGNoYW5nZQorICAgIHVuc2lnbmVkIGNoYXIgYnlSVFNTZXJ2aWNlRmllbGQ7ICAvLyB1cGRhdGUgd2hpbGUgc3BlZWQgY2hhbmdlCisgICAgdW5zaWduZWQgY2hhciBieVJUU1NpZ25hbEZpZWxkOyAgIC8vIHVwZGF0ZSB3aGlsZSBzcGVlZCBjaGFuZ2UKIAotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd01heFJlY2VpdmVMaWZldGltZTsgICAgICAgLy8gZG90MTFNYXhSZWNlaXZlTGlmZXRpbWUKKyAgICB1bnNpZ25lZCBsb25nIGR3TWF4UmVjZWl2ZUxpZmV0aW1lOyAgICAgICAvLyBkb3QxMU1heFJlY2VpdmVMaWZldGltZQogCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJDQ0s7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJFbmNyeXB0aW9uRW5hYmxlOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICBiTG9uZ0hlYWRlcjsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICAgYlNob3J0U2xvdFRpbWU7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJQcm90ZWN0TW9kZTsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICAgYk5vbkVSUFByZXNlbnQ7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJCYXJrZXJQcmVhbWJsZU1kOworICAgIGJvb2wgYkNDSzsKKyAgICBib29sIGJFbmNyeXB0aW9uRW5hYmxlOworICAgIGJvb2wgYkxvbmdIZWFkZXI7CisgICAgYm9vbCBiU2hvcnRTbG90VGltZTsKKyAgICBib29sIGJQcm90ZWN0TW9kZTsKKyAgICBib29sIGJOb25FUlBQcmVzZW50OworICAgIGJvb2wgYkJhcmtlclByZWFtYmxlTWQ7CiAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYnlFUlBGbGFnOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3VXNlUHJvdGVjdENudERvd247CisgICAgdW5zaWduZWQgY2hhciBieUVSUEZsYWc7CisgICAgdW5zaWduZWQgc2hvcnQgd1VzZVByb3RlY3RDbnREb3duOwogCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJSYWRpb0NvbnRyb2xPZmY7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgIGJSYWRpb09mZjsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiRW5hYmxlUFNNb2RlOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgIHdMaXN0ZW5JbnRlcnZhbDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiUFdCaXRPbjsKKyAgICBib29sIGJSYWRpb0NvbnRyb2xPZmY7CisgICAgYm9vbCBiUmFkaW9PZmY7CisgICAgYm9vbCBiRW5hYmxlUFNNb2RlOworICAgIHVuc2lnbmVkIHNob3J0IHdMaXN0ZW5JbnRlcnZhbDsKKyAgICBib29sIGJQV0JpdE9uOwogICAgIFdNQUNfUE9XRVJfTU9ERSAgICAgICAgIGVQU01vZGU7CiAKIAogICAgIC8vIEdQSU8gUmFkaW8gQ29udHJvbAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5UmFkaW9DdGw7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlHUElPOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJIV1JhZGlvT2ZmOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJQcnZBY3RpdmU0UmFkaW9PRkY7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYkdQSU9CbG9ja1JlYWQ7CisgICAgdW5zaWduZWQgY2hhciBieVJhZGlvQ3RsOworICAgIHVuc2lnbmVkIGNoYXIgYnlHUElPOworICAgIGJvb2wgYkhXUmFkaW9PZmY7CisgICAgYm9vbCBiUHJ2QWN0aXZlNFJhZGlvT0ZGOworICAgIGJvb2wgYkdQSU9CbG9ja1JlYWQ7CiAKICAgICAvLyBCZWFjb24gcmVsZWF0ZWQKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3U2VxQ291bnRlcjsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3QkNOQnVmTGVuOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJCZWFjb25CdWZSZWFkeTsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiQmVhY29uU2VudDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiSXNCZWFjb25CdWZSZWFkeVNldDsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBjYkJlYWNvbkJ1ZlJlYWR5U2V0Q250OwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJGaXhSYXRlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5Q3VycmVudENoOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVTY2FuVGltZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3U2VxQ291bnRlcjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3QkNOQnVmTGVuOworICAgIGJvb2wgYkJlYWNvbkJ1ZlJlYWR5OworICAgIGJvb2wgYkJlYWNvblNlbnQ7CisgICAgYm9vbCBiSXNCZWFjb25CdWZSZWFkeVNldDsKKyAgICB1bnNpZ25lZCBpbnQJY2JCZWFjb25CdWZSZWFkeVNldENudDsKKyAgICBib29sIGJGaXhSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlDdXJyZW50Q2g7CisgICAgdW5zaWduZWQgaW50CXVTY2FuVGltZTsKIAogICAgIENNRF9TVEFURSAgICAgICAgICAgICAgIGVDb21tYW5kU3RhdGU7CiAKICAgICBDTURfQ09ERSAgICAgICAgICAgICAgICBlQ29tbWFuZDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiQmVhY29uVHg7CisgICAgYm9vbCBiQmVhY29uVHg7CiAKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiU3RvcEJlYWNvbjsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiU3RvcERhdGFQa3Q7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYlN0b3BUeDBQa3Q7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdUF1dG9SZUNvbm5lY3RUaW1lOworICAgIGJvb2wgYlN0b3BCZWFjb247CisgICAgYm9vbCBiU3RvcERhdGFQa3Q7CisgICAgYm9vbCBiU3RvcFR4MFBrdDsKKyAgICB1bnNpZ25lZCBpbnQJdUF1dG9SZUNvbm5lY3RUaW1lOwogCiAgICAgLy8gODAyLjExIGNvdW50ZXIKIAogICAgIENNRF9JVEVNICAgICAgICAgICAgICAgIGVDbWRRdWV1ZVtDTURfUV9TSVpFXTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1Q21kRGVxdWV1ZUlkeDsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1Q21kRW5xdWV1ZUlkeDsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICBjYkZyZWVDbWRRdWV1ZTsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiQ21kUnVubmluZzsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiQ21kQ2xlYXI7CisgICAgdW5zaWduZWQgaW50CXVDbWREZXF1ZXVlSWR4OworICAgIHVuc2lnbmVkIGludAl1Q21kRW5xdWV1ZUlkeDsKKyAgICB1bnNpZ25lZCBpbnQJY2JGcmVlQ21kUXVldWU7CisgICAgYm9vbCBiQ21kUnVubmluZzsKKyAgICBib29sIGJDbWRDbGVhcjsKIAogCiAKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiUm9hbWluZzsKKyAgICBib29sIGJSb2FtaW5nOwogICAgIC8vV09XCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5SVBBZGRyWzRdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5SVBBZGRyWzRdOwogCi0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgdWxUeFBvd2VyOworICAgIHVuc2lnbmVkIGxvbmcgdWxUeFBvd2VyOwogICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgIGVFbmNyeXB0aW9uU3RhdHVzOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJUcmFuc21pdEtleTsKKyAgICBib29sIGJUcmFuc21pdEtleTsKIC8vMjAwNy0wOTI1LTAxPEFkZD5ieSBNaWtlTGl1CiAvL21pa2UgYWRkIDpzYXZlIG9sZCBFbmNyeXB0aW9uCiAgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgZU9sZEVuY3J5cHRpb25TdGF0dXM7CiAKICAgICBTS2V5TWFuYWdlbWVudCAgICAgICAgICBzS2V5OwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3SVZDb3VudGVyOworICAgIHVuc2lnbmVkIGxvbmcgZHdJVkNvdW50ZXI7CiAKICAgICBRV09SRCAgICAgICAgICAgICAgICAgICBxd1BhY2tldE51bWJlcjsgLy9Gb3IgQ0NNUCBhbmQgVEtJUCBhcyBUU0MoNiBieXRlcykKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1Q3VycmVudFdFUE1vZGU7CisgICAgdW5zaWduZWQgaW50CXVDdXJyZW50V0VQTW9kZTsKIAogICAgIFJDNEV4dCAgICAgICAgICAgICAgICAgIFNCb3g7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5UFJOR1tXTEFOX1dFUE1BWF9LRVlMRU4rM107Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlLZXlJbmRleDsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1S2V5TGVuZ3RoOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieUtleVtXTEFOX1dFUDIzMl9LRVlMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UFJOR1tXTEFOX1dFUE1BWF9LRVlMRU4rM107CisgICAgdW5zaWduZWQgY2hhciBieUtleUluZGV4OworICAgIHVuc2lnbmVkIGludAl1S2V5TGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5S2V5W1dMQU5fV0VQMjMyX0tFWUxFTl07CiAKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiQUVTOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5Q250TWVhc3VyZTsKKyAgICBib29sIGJBRVM7CisgICAgdW5zaWduZWQgY2hhciBieUNudE1lYXN1cmU7CiAKICAgICAvLyBmb3IgQVAgbW9kZQotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVBc3NvY0NvdW50OwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJNb3JlRGF0YTsKKyAgICB1bnNpZ25lZCBpbnQJdUFzc29jQ291bnQ7CisgICAgYm9vbCBiTW9yZURhdGE7CiAKICAgICAvLyBRb1MKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiR3JwQWNrUG9saWN5OworICAgIGJvb2wgYkdycEFja1BvbGljeTsKIAogICAgIC8vIGZvciBPSURfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYkFzc29jSW5mb1NldDsKKyAgICBib29sIGJBc3NvY0luZm9TZXQ7CiAKIAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5QXV0b0ZCQ3RybDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QXV0b0ZCQ3RybDsKIAotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJUeE1JQ0ZhaWw7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYlJ4TUlDRmFpbDsKKyAgICBib29sIGJUeE1JQ0ZhaWw7CisgICAgYm9vbCBiUnhNSUNGYWlsOwogCiAKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1UkFURUlkeDsKKyAgICB1bnNpZ25lZCBpbnQJdVJBVEVJZHg7CiAKIAogICAgIC8vIEZvciBVcGRhdGUgQmFzZUJhbmQgVkdBIEdhaW4gT2Zmc2V0Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYlVwZGF0ZUJCVkdBOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVCQlZHQURpZmZDb3VudDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUJCVkdBTmV3OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5QkJWR0FDdXJyZW50OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieUJCVkdBW0JCX1ZHQV9MRVZFTF07Ci0gICAgTE9ORyAgICAgICAgICAgICAgICAgICAgbGRCbVRocmVzaG9sZFtCQl9WR0FfTEVWRUxdOworICAgIGJvb2wgYlVwZGF0ZUJCVkdBOworICAgIHVuc2lnbmVkIGludAl1QkJWR0FEaWZmQ291bnQ7CisgICAgdW5zaWduZWQgY2hhciBieUJCVkdBTmV3OworICAgIHVuc2lnbmVkIGNoYXIgYnlCQlZHQUN1cnJlbnQ7CisgICAgdW5zaWduZWQgY2hhciBhYnlCQlZHQVtCQl9WR0FfTEVWRUxdOworICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIGxkQm1UaHJlc2hvbGRbQkJfVkdBX0xFVkVMXTsKIAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5QkJQcmVFRFJTU0k7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlCQlByZUVESW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBieUJCUHJlRURSU1NJOworICAgIHVuc2lnbmVkIGNoYXIgYnlCQlByZUVESW5kZXg7CiAKIAotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJSYWRpb0NtZDsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0RpYWdSZWZDb3VudDsKKyAgICBib29sIGJSYWRpb0NtZDsKKyAgICB1bnNpZ25lZCBsb25nIGR3RGlhZ1JlZkNvdW50OwogCiAgICAgLy8gRm9yIEZPRSBUdW5pbmcKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUZPRVR1bmluZzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Rk9FVHVuaW5nOwogCiAgICAgLy8gRm9yIEF1dG8gUG93ZXIgVHVubmluZwogCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlBdXRvUHdyVHVubmluZzsKLSAgICBTSE9SVCAgICAgICAgICAgICAgICAgICBzUFNldFBvaW50Q0NLOwotICAgIFNIT1JUICAgICAgICAgICAgICAgICAgIHNQU2V0UG9pbnRPRkRNRzsKLSAgICBTSE9SVCAgICAgICAgICAgICAgICAgICBzUFNldFBvaW50T0ZETUE7Ci0gICAgTE9ORyAgICAgICAgICAgICAgICAgICAgbFBGb3JtdWxhT2Zmc2V0OwotICAgIFNIT1JUICAgICAgICAgICAgICAgICAgIHNQVGhyZXNob2xkOwotICAgIENIQVIgICAgICAgICAgICAgICAgICAgIGNBZGp1c3RTdGVwOwotICAgIENIQVIgICAgICAgICAgICAgICAgICAgIGNNaW5UeEFHQzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QXV0b1B3clR1bm5pbmc7CisgICAgc2hvcnQgICAgICAgICAgICAgICAgICAgc1BTZXRQb2ludENDSzsKKyAgICBzaG9ydCAgICAgICAgICAgICAgICAgICBzUFNldFBvaW50T0ZETUc7CisgICAgc2hvcnQgICAgICAgICAgICAgICAgICAgc1BTZXRQb2ludE9GRE1BOworICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIGxQRm9ybXVsYU9mZnNldDsKKyAgICBzaG9ydCAgICAgICAgICAgICAgICAgICBzUFRocmVzaG9sZDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICBjQWRqdXN0U3RlcDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICBjTWluVHhBR0M7CiAKICAgICAvLyBGb3IgUkYgUG93ZXIgdGFibGUKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUNDS1B3cjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieU9GRE1Qd3JHOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5Q3VyUHdyOwotICAgIEk4ICAgICAgICAgICAgICAgICAgICAgIGJ5Q3VyUHdyZEJtOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieUNDS1B3clRibFtDQl9NQVhfQ0hBTk5FTF8yNEcrMV07Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5T0ZETVB3clRibFtDQl9NQVhfQ0hBTk5FTCsxXTsKLSAgICBJOCAgICAgICAgICAgICAgICAgICAgICBhYnlDQ0tEZWZhdWx0UHdyW0NCX01BWF9DSEFOTkVMXzI0RysxXTsKLSAgICBJOCAgICAgICAgICAgICAgICAgICAgICBhYnlPRkRNRGVmYXVsdFB3cltDQl9NQVhfQ0hBTk5FTCsxXTsKLSAgICBJOCAgICAgICAgICAgICAgICAgICAgICBhYnlSZWdQd3JbQ0JfTUFYX0NIQU5ORUwrMV07Ci0gICAgSTggICAgICAgICAgICAgICAgICAgICAgYWJ5TG9jYWxQd3JbQ0JfTUFYX0NIQU5ORUwrMV07CisgICAgdW5zaWduZWQgY2hhciBieUNDS1B3cjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T0ZETVB3ckc7CisgICAgdW5zaWduZWQgY2hhciBieUN1clB3cjsKKyAgICBjaGFyCSBieUN1clB3cmRCbTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUNDS1B3clRibFtDQl9NQVhfQ0hBTk5FTF8yNEcrMV07CisgICAgdW5zaWduZWQgY2hhciBhYnlPRkRNUHdyVGJsW0NCX01BWF9DSEFOTkVMKzFdOworICAgIGNoYXIJYWJ5Q0NLRGVmYXVsdFB3cltDQl9NQVhfQ0hBTk5FTF8yNEcrMV07CisgICAgY2hhcglhYnlPRkRNRGVmYXVsdFB3cltDQl9NQVhfQ0hBTk5FTCsxXTsKKyAgICBjaGFyCWFieVJlZ1B3cltDQl9NQVhfQ0hBTk5FTCsxXTsKKyAgICBjaGFyCWFieUxvY2FsUHdyW0NCX01BWF9DSEFOTkVMKzFdOwogCiAKICAgICAvLyBCYXNlQmFuZCBMb29wYmFjayBVc2UKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUJCQ1I0ZDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUJCQ1JjOTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUJCQ1I4ODsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUJCQ1IwOTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QkJDUjRkOworICAgIHVuc2lnbmVkIGNoYXIgYnlCQkNSYzk7CisgICAgdW5zaWduZWQgY2hhciBieUJCQ1I4ODsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QkJDUjA5OwogCiAgICAgLy8gY29tbWFuZCB0aW1lcgogICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHNUaW1lckNvbW1hbmQ7CiAjaWZkZWYgVHhJblNsZWVwCiAgICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHNUaW1lclR4RGF0YTsKLSAgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgIG5UeERhdGFUaW1lQ291dDsKLSAgICAgQk9PTCAgZlR4RGF0YUluU2xlZXA7Ci0gICAgIEJPT0wgIElzVHhEYXRhVHJpZ2dlcjsKKyAgICAgdW5zaWduZWQgbG9uZyBuVHhEYXRhVGltZUNvdXQ7CisgICAgIGJvb2wgZlR4RGF0YUluU2xlZXA7CisgICAgIGJvb2wgSXNUeERhdGFUcmlnZ2VyOwogI2VuZGlmCiAKICNpZmRlZiBXUEFfU01fVHJhbnN0YXR1cwotICAgIEJPT0wgIGZXUEFfQXV0aGVuZWQ7ICAgICAgICAgICAvL2lzIFdQQS9XUEEtUFNLIG9yIFdQQTIvV1BBMi1QU0sgYXV0aGVuPz8KKyAgICBib29sIGZXUEFfQXV0aGVuZWQ7ICAgICAgICAgICAvL2lzIFdQQS9XUEEtUFNLIG9yIFdQQTIvV1BBMi1QU0sgYXV0aGVuPz8KICNlbmRpZgotICAgIEJZVEUgICAgICAgICAgICBieVJlQXNzb2NDb3VudDsgICAvL21pa2UgYWRkOnJlLWFzc29jaWF0aW9uIHJldHJ5IHRpbWVzIQotICAgIEJZVEUgICAgICAgICAgICBieUxpbmtXYWl0Q291bnQ7CisgICAgdW5zaWduZWQgY2hhciBieVJlQXNzb2NDb3VudDsgICAvL21pa2UgYWRkOnJlLWFzc29jaWF0aW9uIHJldHJ5IHRpbWVzIQorICAgIHVuc2lnbmVkIGNoYXIgYnlMaW5rV2FpdENvdW50OwogCiAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlOb2RlTmFtZVsxN107CisgICAgdW5zaWduZWQgY2hhciBhYnlOb2RlTmFtZVsxN107CiAKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiRGl2ZXJzaXR5UmVnQ3RsT047Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYkRpdmVyc2l0eUVuYWJsZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICB1bERpdmVyc2l0eU5WYWx1ZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICB1bERpdmVyc2l0eU1WYWx1ZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieVRNYXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlUTWF4MjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieVRNYXgzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIHVsU1EzVEg7CisgICAgYm9vbCBiRGl2ZXJzaXR5UmVnQ3RsT047CisgICAgYm9vbCBiRGl2ZXJzaXR5RW5hYmxlOworICAgIHVuc2lnbmVkIGxvbmcgdWxEaXZlcnNpdHlOVmFsdWU7CisgICAgdW5zaWduZWQgbG9uZyB1bERpdmVyc2l0eU1WYWx1ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VE1heDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VE1heDI7CisgICAgdW5zaWduZWQgY2hhciBieVRNYXgzOworICAgIHVuc2lnbmVkIGxvbmcgdWxTUTNUSDsKIAogLy8gQU5UIGRpdmVyc2l0eQotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIHVEaXZlcnNpdHlDbnQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlBbnRlbm5hU3RhdGU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgdWxSYXRpb19TdGF0ZTA7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgdWxSYXRpb19TdGF0ZTE7CisgICAgdW5zaWduZWQgbG9uZyB1RGl2ZXJzaXR5Q250OworICAgIHVuc2lnbmVkIGNoYXIgYnlBbnRlbm5hU3RhdGU7CisgICAgdW5zaWduZWQgbG9uZyB1bFJhdGlvX1N0YXRlMDsKKyAgICB1bnNpZ25lZCBsb25nIHVsUmF0aW9fU3RhdGUxOwogCiAgICAgLy9TUTMgZnVuY3Rpb25zIGZvciBhbnRlbm5hIGRpdmVyc2l0eQogICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgICAgICBUaW1lclNRM1RtYXgxOwpAQCAtNzQ3LDgwICs3NDcsODAgQEAKICAgICBzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICAgICAgVGltZXJTUTNUbWF4MzsKIAogCi0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgdU51bVNRM1tNQVhfUkFURV07Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0FudERpdmVyc2l0eU1heFJhdGU7CisgICAgdW5zaWduZWQgbG9uZyB1TnVtU1EzW01BWF9SQVRFXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3QW50RGl2ZXJzaXR5TWF4UmF0ZTsKIAogCiAgICAgU0V0aGVybmV0SGVhZGVyICAgICAgICAgc1R4RXRoSGVhZGVyOwogICAgIFNFdGhlcm5ldEhlYWRlciAgICAgICAgIHNSeEV0aEhlYWRlcjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlCcm9hZGNhc3RBZGRyW0VUSF9BTEVOXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlTTkFQX1JGQzEwNDJbRVRIX0FMRU5dOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieVNOQVBfQnJpZGdldHVubmVsW0VUSF9BTEVOXTsKLSAgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFieUVFUFJPTVtFRVBfTUFYX0NPTlRFWFRfU0laRV07ICAvL0RXT1JEIGFsaWdubWVudAorICAgIHVuc2lnbmVkIGNoYXIgYWJ5QnJvYWRjYXN0QWRkcltFVEhfQUxFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlTTkFQX1JGQzEwNDJbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U05BUF9CcmlkZ2V0dW5uZWxbRVRIX0FMRU5dOworICAgICB1bnNpZ25lZCBjaGFyIGFieUVFUFJPTVtFRVBfTUFYX0NPTlRFWFRfU0laRV07ICAvL3Vuc2lnbmVkIGxvbmcgYWxpZ25tZW50CiAgICAgLy8gUHJlLUF1dGhlbnRpY2F0aW9uICYgUE1LIGNhY2hlCiAgICAgU1BNS0lEICAgICAgICAgICAgICAgICAgZ3NQTUtJRDsKICAgICBTUE1LSURDYW5kaWRhdGVFdmVudCAgICBnc1BNS0lEQ2FuZGlkYXRlOwogCiAKICAgICAvLyBmb3IgODAyLjExaAotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGIxMWhFbmFibGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5Q291bnRyeUNvZGVbM107CisgICAgYm9vbCBiMTFoRW5hYmxlOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q291bnRyeUNvZGVbM107CiAgICAgLy8gZm9yIDgwMi4xMWggREZTCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdU51bU9mTWVhc3VyZUVJRHM7CisgICAgdW5zaWduZWQgaW50CXVOdW1PZk1lYXN1cmVFSURzOwogICAgIFBXTEFOX0lFX01FQVNVUkVfUkVRICAgIHBDdXJyTWVhc3VyZUVJRDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiTWVhc3VyZUluUHJvZ3Jlc3M7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlPcmdDaGFubmVsOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5T3JnUkNSOwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3T3JnTUFSMDsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd09yZ01BUjQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlCYXNpY01hcDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUNDQUZyYWN0aW9uOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieVJQSXNbOF07Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdSUElzWzhdOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJDaGFubmVsU3dpdGNoOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5TmV3Q2hhbm5lbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUNoYW5uZWxTd2l0Y2hDb3VudDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiUXVpZXRFbmFibGU7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYkVuYWJsZUZpcnN0UXVpZXQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlRdWlldFN0YXJ0Q291bnQ7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdVF1aWV0RW5xdWV1ZTsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0N1cnJlbnRRdWlldEVuZFRpbWU7CisgICAgYm9vbCBiTWVhc3VyZUluUHJvZ3Jlc3M7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ0NoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ1JDUjsKKyAgICB1bnNpZ25lZCBsb25nIGR3T3JnTUFSMDsKKyAgICB1bnNpZ25lZCBsb25nIGR3T3JnTUFSNDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QmFzaWNNYXA7CisgICAgdW5zaWduZWQgY2hhciBieUNDQUZyYWN0aW9uOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UlBJc1s4XTsKKyAgICB1bnNpZ25lZCBsb25nIGR3UlBJc1s4XTsKKyAgICBib29sIGJDaGFubmVsU3dpdGNoOworICAgIHVuc2lnbmVkIGNoYXIgYnlOZXdDaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsU3dpdGNoQ291bnQ7CisgICAgYm9vbCBiUXVpZXRFbmFibGU7CisgICAgYm9vbCBiRW5hYmxlRmlyc3RRdWlldDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UXVpZXRTdGFydENvdW50OworICAgIHVuc2lnbmVkIGludAl1UXVpZXRFbnF1ZXVlOworICAgIHVuc2lnbmVkIGxvbmcgZHdDdXJyZW50UXVpZXRFbmRUaW1lOwogICAgIFNRdWlldENvbnRyb2wgICAgICAgICAgIHNRdWlldFtNQVhfUVVJRVRfQ09VTlRdOwogICAgIC8vIGZvciA4MDIuMTFoIFRQQwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJDb3VudHJ5SW5mbzVHOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJDb3VudHJ5SW5mbzI0RzsKKyAgICBib29sIGJDb3VudHJ5SW5mbzVHOworICAgIGJvb2wgYkNvdW50cnlJbmZvMjRHOwogCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0JlYWNvbkludGVydmFsOworICAgIHVuc2lnbmVkIHNob3J0IHdCZWFjb25JbnRlcnZhbDsKIAogICAgIC8vV1BBIHN1cHBsaWNhbnQgZGVhbW9uCiAJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKndwYWRldjsKLQlCT09MICAgICAgICAgICAgICAgICAgICBiV1BBREVWVXA7CisJYm9vbCBiV1BBREVWVXA7CiAgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYjsKICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCiAvKgotICAgICAgICBCT09MICAgICAgICAgICAgICAgICBid2V4dHN0ZXAwOwotICAgICAgICBCT09MICAgICAgICAgICAgICAgICBid2V4dHN0ZXAxOwotICAgICAgICBCT09MICAgICAgICAgICAgICAgICBid2V4dHN0ZXAyOwotICAgICAgICBCT09MICAgICAgICAgICAgICAgICBid2V4dHN0ZXAzOworICAgICAgICBib29sIGJ3ZXh0c3RlcDA7CisgICAgICAgIGJvb2wgYndleHRzdGVwMTsKKyAgICAgICAgYm9vbCBid2V4dHN0ZXAyOworICAgICAgICBib29sIGJ3ZXh0c3RlcDM7CiAgICAgICAgICovCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgYndleHRjb3VudDsKLSAgICAgICAgQk9PTCAgICAgICAgICAgICAgICAgYldQQVN1cHBXZXh0RW5hYmxlZDsKKyAgICAgICAgdW5zaWduZWQgaW50CWJ3ZXh0Y291bnQ7CisgICAgICAgIGJvb2wgYldQQVN1cHBXZXh0RW5hYmxlZDsKICNlbmRpZgogCiAgICAgLy8tLQogI2lmZGVmIEhPU1RBUAogICAgIC8vIHVzZXIgc3BhY2UgZGFlbW9uOiBob3N0YXBkLCBpcyB1c2VkIGZvciBIT1NUQVAKLQlCT09MICAgICAgICAgICAgICAgICAgICBiRW5hYmxlSG9zdGFwZDsKLQlCT09MICAgICAgICAgICAgICAgICAgICBiRW5hYmxlODAyMXg7Ci0JQk9PTCAgICAgICAgICAgICAgICAgICAgYkVuYWJsZUhvc3RXRVA7CisJYm9vbCBiRW5hYmxlSG9zdGFwZDsKKwlib29sIGJFbmFibGU4MDIxeDsKKwlib29sIGJFbmFibGVIb3N0V0VQOwogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICphcGRldjsKIAlpbnQgKCp0eF84MDIxMSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjZW5kaWYKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1Q2hhbm5lbDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiTUFDU3VzcGVuZDsKKyAgICB1bnNpZ25lZCBpbnQJdUNoYW5uZWw7CisgICAgYm9vbCBiTUFDU3VzcGVuZDsKIAogCXN0cnVjdCBpd19zdGF0aXN0aWNzCXdzdGF0czsJCS8vIHdpcmVsZXNzIHN0YXRzCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYkNvbW1pdDsKKyAgICBib29sIGJDb21taXQ7CiAKIH0gREVWSUNFX0lORk8sICpQU0RldmljZTsKIApAQCAtODgwLDcgKzg4MCw3IEBACiAKIAogCi1pbmxpbmUgc3RhdGljIEJPT0wgZGV2aWNlX2dldF9pcChQU0RldmljZSBwSW5mbykgeworaW5saW5lIHN0YXRpYyBib29sIGRldmljZV9nZXRfaXAoUFNEZXZpY2UgcEluZm8pIHsKICAgICBzdHJ1Y3QgaW5fZGV2aWNlKiBpbl9kZXY9KHN0cnVjdCBpbl9kZXZpY2UqKSBwSW5mby0+ZGV2LT5pcF9wdHI7CiAgICAgc3RydWN0IGluX2lmYWRkciogaWZhOwogCkBAIC04ODgsMTAgKzg4OCwxMCBAQAogICAgICAgICBpZmE9KHN0cnVjdCBpbl9pZmFkZHIqKSBpbl9kZXYtPmlmYV9saXN0OwogICAgICAgICBpZiAoaWZhIT1OVUxMKSB7CiAgICAgICAgICAgICBtZW1jcHkocEluZm8tPmFieUlQQWRkciwmaWZhLT5pZmFfYWRkcmVzcyw0KTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogCkBAIC05MjAsOSArOTIwLDkgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQk9PTCBkZXZpY2VfZG1hMF94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIHN0cnVjdCBza19idWZmICpza2IsIFVJTlQgdU5vZGVJbmRleCk7Ci1CT09MIGRldmljZV9hbGxvY19mcmFnX2J1ZihQU0RldmljZSBwRGV2aWNlLCBQU0RlRnJhZ0NvbnRyb2xCbG9jayBwRGVGKTsKLWludCBDb25maWdfRmlsZU9wZXJhdGlvbihQU0RldmljZSBwRGV2aWNlLEJPT0wgZndyaXRlLHVuc2lnbmVkIGNoYXIgKlBhcmFtZXRlcik7Citib29sIGRldmljZV9kbWEwX3htaXQoUFNEZXZpY2UgcERldmljZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHVOb2RlSW5kZXgpOworYm9vbCBkZXZpY2VfYWxsb2NfZnJhZ19idWYoUFNEZXZpY2UgcERldmljZSwgUFNEZUZyYWdDb250cm9sQmxvY2sgcERlRik7CitpbnQgQ29uZmlnX0ZpbGVPcGVyYXRpb24oUFNEZXZpY2UgcERldmljZSwgYm9vbCBmd3JpdGUsIHVuc2lnbmVkIGNoYXIgKlBhcmFtZXRlcik7CiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9jZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX2NmZy5oCmluZGV4IGQxZTljMTkuLjQwOGVkYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX2NmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX2NmZy5oCkBAIC0zOSwxNCArMzksNiBAQAogICAgIHVuc2lnbmVkIGNoYXIgICBidWlsZDsKIH0gdmVyc2lvbl90LCAqcHZlcnNpb25fdDsKIAotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgICgwKQotI2VuZGlmCi0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgICghKEZBTFNFKSkKLSNlbmRpZgotCiAjZGVmaW5lIFZJRF9UQUJMRV9TSVpFICAgICAgNjQKICNkZWZpbmUgTUNBU1RfVEFCTEVfU0laRSAgICA2NAogI2RlZmluZSBNQ0FNX1NJWkUgICAgICAgICAgIDMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKaW5kZXggZTQ5YmIyNS4uNGQ2YjY2YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKQEAgLTI2LDkgKzI2LDkgQEAKICAqCiAgKiBGdW5jdGlvbnM6CiAgKgotICogICBkZXZpY2VfZm91bmQxIC0gbW9kdWxlIGluaXRpYWwgKGluc21vZCkgZHJpdmVyIGVudHJ5Ci0gKiAgIGRldmljZV9yZW1vdmUxIC0gbW9kdWxlIHJlbW92ZSBlbnRyeQotICogICBkZXZpY2VfaW5pdF9pbmZvIC0gZGV2aWNlIHN0cnVjdHVyZSByZXNvdXJjZSBhbGxvY2F0aW9uIGZ1bmN0aW9uCisgKiAgIHZ0NjY1NV9wcm9iZSAtIG1vZHVsZSBpbml0aWFsIChpbnNtb2QpIGRyaXZlciBlbnRyeQorICogICB2dDY2NTVfcmVtb3ZlIC0gbW9kdWxlIHJlbW92ZSBlbnRyeQorICogICB2dDY2NTVfaW5pdF9pbmZvIC0gZGV2aWNlIHN0cnVjdHVyZSByZXNvdXJjZSBhbGxvY2F0aW9uIGZ1bmN0aW9uCiAgKiAgIGRldmljZV9mcmVlX2luZm8gLSBkZXZpY2Ugc3RydWN0dXJlIHJlc291cmNlIGZyZWUgZnVuY3Rpb24KICAqICAgZGV2aWNlX2dldF9wY2lfaW5mbyAtIGdldCBhbGxvY2F0ZWQgcGNpIGlvL21lbSByZXNvdXJjZQogICogICBkZXZpY2VfcHJpbnRfaW5mbyAtIHByaW50IG91dCByZXNvdXJjZQpAQCAtNjIsNiArNjIsNyBAQAogCiAjaW5jbHVkZSAiZGV2aWNlLmgiCiAjaW5jbHVkZSAiY2FyZC5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKICNpbmNsdWRlICJiYXNlYmFuZC5oIgogI2luY2x1ZGUgIm1hYy5oIgogI2luY2x1ZGUgInRldGhlci5oIgpAQCAtMTMzLDEwICsxMzQsMTAgQEAKIAogCiAjZGVmaW5lIElQX0FMSUdfREVGICAgICAwCi0vKiBJUF9ieXRlX2FsaWduW10gaXMgdXNlZCBmb3IgSVAgaGVhZGVyIERXT1JEIGJ5dGUgYWxpZ25lZAotICAgMDogaW5kaWNhdGUgdGhlIElQIGhlYWRlciB3b24ndCBiZSBEV09SRCBieXRlIGFsaWduZWQuKERlZmF1bHQpIC4KLSAgIDE6IGluZGljYXRlIHRoZSBJUCBoZWFkZXIgd2lsbCBiZSBEV09SRCBieXRlIGFsaWduZWQuCi0gICAgICBJbiBzb21lIGVudmlyb21lbnQsIHRoZSBJUCBoZWFkZXIgc2hvdWxkIGJlIERXT1JEIGJ5dGUgYWxpZ25lZCwKKy8qIElQX2J5dGVfYWxpZ25bXSBpcyB1c2VkIGZvciBJUCBoZWFkZXIgdW5zaWduZWQgbG9uZyBieXRlIGFsaWduZWQKKyAgIDA6IGluZGljYXRlIHRoZSBJUCBoZWFkZXIgd29uJ3QgYmUgdW5zaWduZWQgbG9uZyBieXRlIGFsaWduZWQuKERlZmF1bHQpIC4KKyAgIDE6IGluZGljYXRlIHRoZSBJUCBoZWFkZXIgd2lsbCBiZSB1bnNpZ25lZCBsb25nIGJ5dGUgYWxpZ25lZC4KKyAgICAgIEluIHNvbWUgZW52aXJvbWVudCwgdGhlIElQIGhlYWRlciBzaG91bGQgYmUgdW5zaWduZWQgbG9uZyBieXRlIGFsaWduZWQsCiAgICAgICBvciB0aGUgcGFja2V0IHdpbGwgYmUgZHJvcGVkIHdoZW4gd2UgcmVjZWl2ZSBpdC4gKGVnOiBJUFZTKQogKi8KIERFVklDRV9QQVJBTShJUF9ieXRlX2FsaWduLCJFbmFibGUgSVAgaGVhZGVyIGR3b3JkIGFsaWduZWQiKTsKQEAgLTI4NCw3ICsyODUsNyBAQAogICAgIHswLE5VTEx9CiB9OwogCi1ERUZJTkVfUENJX0RFVklDRV9UQUJMRShkZXZpY2VfaWRfdGFibGUpID0geworREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUodnQ2NjU1X3BjaV9pZF90YWJsZSkgPSB7CiAJeyBQQ0lfVkRFVklDRShWSUEsIDB4MzI1MyksIChrZXJuZWxfdWxvbmdfdCljaGlwX2luZm9fdGFibGV9LAogCXsgMCwgfQogfTsKQEAgLTI5MiwxMCArMjkzLDEwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKLXN0YXRpYyBpbnQgIGRldmljZV9mb3VuZDEoc3RydWN0IHBjaV9kZXYgKnBjaWQsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIEJPT0wgZGV2aWNlX2luaXRfaW5mbyhzdHJ1Y3QgcGNpX2RldiogcGNpZCwgUFNEZXZpY2UqIHBwRGV2aWNlLCBQQ0hJUF9JTkZPKTsKK3N0YXRpYyBpbnQgIHZ0NjY1NV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZCwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgYm9vbCB2dDY2NTVfaW5pdF9pbmZvKHN0cnVjdCBwY2lfZGV2KiBwY2lkLCBQU0RldmljZSogcHBEZXZpY2UsIFBDSElQX0lORk8pOwogc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfaW5mbyhQU0RldmljZSBwRGV2aWNlKTsKLXN0YXRpYyBCT09MIGRldmljZV9nZXRfcGNpX2luZm8oUFNEZXZpY2UsIHN0cnVjdCBwY2lfZGV2KiBwY2lkKTsKK3N0YXRpYyBib29sIGRldmljZV9nZXRfcGNpX2luZm8oUFNEZXZpY2UsIHN0cnVjdCBwY2lfZGV2KiBwY2lkKTsKIHN0YXRpYyB2b2lkIGRldmljZV9wcmludF9pbmZvKFBTRGV2aWNlIHBEZXZpY2UpOwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkZXZpY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgZGV2aWNlX2luaXRfZGl2ZXJzaXR5X3RpbWVyKFBTRGV2aWNlIHBEZXZpY2UpOwpAQCAtMzI2LDEyICszMjcsMTIgQEAKIAogc3RhdGljIGludCAgZGV2aWNlX2RtYTBfdHhfODAyMTEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAvLzIwMDgtMDcxNDxBZGQ+YnkgTWlrZSBMaXUKLXN0YXRpYyBCT09MIGRldmljZV9yZWxlYXNlX1dQQURFVihQU0RldmljZSBwRGV2aWNlKTsKK3N0YXRpYyBib29sIGRldmljZV9yZWxlYXNlX1dQQURFVihQU0RldmljZSBwRGV2aWNlKTsKIAogc3RhdGljIGludCAgZXRodG9vbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICp1c2VyYWRkcik7Ci1zdGF0aWMgaW50ICBkZXZpY2Vfcnhfc3J2KFBTRGV2aWNlIHBEZXZpY2UsIFVJTlQgdUlkeCk7Ci1zdGF0aWMgaW50ICBkZXZpY2VfdHhfc3J2KFBTRGV2aWNlIHBEZXZpY2UsIFVJTlQgdUlkeCk7Ci1zdGF0aWMgQk9PTCBkZXZpY2VfYWxsb2NfcnhfYnVmKFBTRGV2aWNlIHBEZXZpY2UsIFBTUnhEZXNjIHBEZXNjKTsKK3N0YXRpYyBpbnQgIGRldmljZV9yeF9zcnYoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgaW50IHVJZHgpOworc3RhdGljIGludCAgZGV2aWNlX3R4X3NydihQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBpbnQgdUlkeCk7CitzdGF0aWMgYm9vbCBkZXZpY2VfYWxsb2NfcnhfYnVmKFBTRGV2aWNlIHBEZXZpY2UsIFBTUnhEZXNjIHBEZXNjKTsKIHN0YXRpYyB2b2lkIGRldmljZV9pbml0X3JlZ2lzdGVycyhQU0RldmljZSBwRGV2aWNlLCBERVZJQ0VfSU5JVF9UWVBFIEluaXRUeXBlKTsKIHN0YXRpYyB2b2lkIGRldmljZV9mcmVlX3R4X2J1ZihQU0RldmljZSBwRGV2aWNlLCBQU1R4RGVzYyBwRGVzYyk7CiBzdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV90ZDBfcmluZyhQU0RldmljZSBwRGV2aWNlKTsKQEAgLTM0MCw3ICszNDEsOCBAQAogc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfcmQxX3JpbmcoUFNEZXZpY2UgcERldmljZSk7CiBzdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV9yaW5ncyhQU0RldmljZSBwRGV2aWNlKTsKIHN0YXRpYyB2b2lkIGRldmljZV9mcmVlX2ZyYWdfYnVmKFBTRGV2aWNlIHBEZXZpY2UpOwotc3RhdGljIGludCBDb25maWdfRmlsZUdldFBhcmFtZXRlcihVQ0hBUiAqc3RyaW5nLCBVQ0hBUiAqZGVzdCxVQ0hBUiAqc291cmNlKTsKK3N0YXRpYyBpbnQgQ29uZmlnX0ZpbGVHZXRQYXJhbWV0ZXIodW5zaWduZWQgY2hhciAqc3RyaW5nLAorCQl1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBjaGFyICpzb3VyY2UpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zNTcsNyArMzU5LDcgQEAKICAgICByZXR1cm4gY2hpcF9pbmZvX3RhYmxlW2ldLm5hbWU7CiB9CiAKLXN0YXRpYyB2b2lkIGRldmljZV9yZW1vdmUxKHN0cnVjdCBwY2lfZGV2ICpwY2lkKQorc3RhdGljIHZvaWQgX19kZXZleGl0IHZ0NjY1NV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWQpCiB7CiAgICAgUFNEZXZpY2UgcERldmljZT1wY2lfZ2V0X2RydmRhdGEocGNpZCk7CiAKQEAgLTM4NCw3ICszODYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotZGV2aWNlX3NldF9ib29sX29wdCh1bnNpZ25lZCBpbnQgKm9wdCwgaW50IHZhbCxCT09MIGRlZixVMzIgZmxhZywgY2hhciogbmFtZSxjaGFyKiBkZXZuYW1lKSB7CitkZXZpY2Vfc2V0X2Jvb2xfb3B0KHVuc2lnbmVkIGludCAqb3B0LCBpbnQgdmFsLGJvb2wgZGVmLHUzMiBmbGFnLCBjaGFyKiBuYW1lLGNoYXIqIGRldm5hbWUpIHsKICAgICAoKm9wdCkmPSh+ZmxhZyk7CiAgICAgaWYgKHZhbD09LTEpCiAgICAgICAgICpvcHR8PShkZWYgPyBmbGFnIDogMCk7CkBAIC0zOTQsNyArMzk2LDcgQEAKICAgICAgICAgKm9wdHw9KGRlZiA/IGZsYWcgOiAwKTsKICAgICB9IGVsc2UgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX05PVElDRSAiJXM6IHNldCBwYXJhbWV0ZXIgJXMgdG8gJXNcbiIsCi0gICAgICAgICAgICBkZXZuYW1lLG5hbWUgLCB2YWwgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIGRldm5hbWUsbmFtZSAsIHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICAgICAqb3B0fD0odmFsID8gZmxhZyA6IDApOwogICAgIH0KIH0KQEAgLTQyOSw5ICs0MzEsOSBAQAogc3RhdGljIHZvaWQKIGRldmljZV9zZXRfb3B0aW9ucyhQU0RldmljZSBwRGV2aWNlKSB7CiAKLSAgICBCWVRFICAgIGFieUJyb2FkY2FzdEFkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotICAgIEJZVEUgICAgYWJ5U05BUF9SRkMxMDQyW0VUSF9BTEVOXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLSAgICBCWVRFICAgIGFieVNOQVBfQnJpZGdldHVubmVsW0VUSF9BTEVOXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweEY4fTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUJyb2FkY2FzdEFkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U05BUF9SRkMxMDQyW0VUSF9BTEVOXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVNOQVBfQnJpZGdldHVubmVsW0VUSF9BTEVOXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweEY4fTsKIAogCiAgICAgbWVtY3B5KHBEZXZpY2UtPmFieUJyb2FkY2FzdEFkZHIsIGFieUJyb2FkY2FzdEFkZHIsIEVUSF9BTEVOKTsKQEAgLTQ1MCw3ICs0NTIsNyBAQAogICAgIHBEZXZpY2UtPmIxMWhFbmFibGUgPSAocERldmljZS0+c09wdHMuZmxhZ3MgJiBERVZJQ0VfRkxBR1NfODAyMTFoX01PREUpID8gMSA6IDA7CiAgICAgcERldmljZS0+YkRpdmVyc2l0eVJlZ0N0bE9OID0gKHBEZXZpY2UtPnNPcHRzLmZsYWdzICYgREVWSUNFX0ZMQUdTX0RpdmVyc2l0eUFOVCkgPyAxIDogMDsKICAgICBwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPSBwRGV2aWNlLT5zT3B0cy5kYXRhX3JhdGU7Ci0gICAgaWYgKHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA8IFJBVEVfQVVUTykgcERldmljZS0+YkZpeFJhdGUgPSBUUlVFOworICAgIGlmIChwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPCBSQVRFX0FVVE8pIHBEZXZpY2UtPmJGaXhSYXRlID0gdHJ1ZTsKICAgICBwRGV2aWNlLT5ieUJCVHlwZSA9IHBEZXZpY2UtPnNPcHRzLmJicF90eXBlOwogICAgIHBEZXZpY2UtPmJ5UGFja2V0VHlwZSA9IHBEZXZpY2UtPmJ5QkJUeXBlOwogCkBAIC00NTgsNDUgKzQ2MCw0NSBAQAogCXBEZXZpY2UtPmJ5QXV0b0ZCQ3RybCA9IEFVVE9fRkJfMDsKIAkvL3BEZXZpY2UtPmJ5QXV0b0ZCQ3RybCA9IEFVVE9fRkJfMTsKIC8vUExJQ0VfREVCVUc8LQotcERldmljZS0+YlVwZGF0ZUJCVkdBID0gVFJVRTsKK3BEZXZpY2UtPmJVcGRhdGVCQlZHQSA9IHRydWU7CiAgICAgcERldmljZS0+YnlGT0VUdW5pbmcgPSAwOwogICAgIHBEZXZpY2UtPndDVFNEdXJhdGlvbiA9IDA7CiAgICAgcERldmljZS0+YnlQcmVhbWJsZVR5cGUgPSAwOwogCiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiB1Q2hhbm5lbD0gJWRcbiIsKElOVClwRGV2aWNlLT51Q2hhbm5lbCk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgYnlPcE1vZGU9ICVkXG4iLChJTlQpcERldmljZS0+YnlPcE1vZGUpOwotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIGVQU01vZGU9ICVkXG4iLChJTlQpcERldmljZS0+ZVBTTW9kZSk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgd1JUU1RocmVzaG9sZD0gJWRcbiIsKElOVClwRGV2aWNlLT53UlRTVGhyZXNob2xkKTsKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBieVNob3J0UmV0cnlMaW1pdD0gJWRcbiIsKElOVClwRGV2aWNlLT5ieVNob3J0UmV0cnlMaW1pdCk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgYnlMb25nUmV0cnlMaW1pdD0gJWRcbiIsKElOVClwRGV2aWNlLT5ieUxvbmdSZXRyeUxpbWl0KTsKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBieVByZWFtYmxlVHlwZT0gJWRcbiIsKElOVClwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgYnlTaG9ydFByZWFtYmxlPSAlZFxuIiwoSU5UKXBEZXZpY2UtPmJ5U2hvcnRQcmVhbWJsZSk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgdUNvbm5lY3Rpb25SYXRlPSAlZFxuIiwoSU5UKXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgYnlCQlR5cGU9ICVkXG4iLChJTlQpcERldmljZS0+YnlCQlR5cGUpOwotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIHBEZXZpY2UtPmIxMWhFbmFibGU9ICVkXG4iLChJTlQpcERldmljZS0+YjExaEVuYWJsZSk7Ci0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgcERldmljZS0+YkRpdmVyc2l0eVJlZ0N0bE9OPSAlZFxuIiwoSU5UKXBEZXZpY2UtPmJEaXZlcnNpdHlSZWdDdGxPTik7CisgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgdUNoYW5uZWw9ICVkXG4iLChpbnQpcERldmljZS0+dUNoYW5uZWwpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIGJ5T3BNb2RlPSAlZFxuIiwoaW50KXBEZXZpY2UtPmJ5T3BNb2RlKTsKKyAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBlUFNNb2RlPSAlZFxuIiwoaW50KXBEZXZpY2UtPmVQU01vZGUpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIHdSVFNUaHJlc2hvbGQ9ICVkXG4iLChpbnQpcERldmljZS0+d1JUU1RocmVzaG9sZCk7CisgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgYnlTaG9ydFJldHJ5TGltaXQ9ICVkXG4iLChpbnQpcERldmljZS0+YnlTaG9ydFJldHJ5TGltaXQpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIGJ5TG9uZ1JldHJ5TGltaXQ9ICVkXG4iLChpbnQpcERldmljZS0+YnlMb25nUmV0cnlMaW1pdCk7CisgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgYnlQcmVhbWJsZVR5cGU9ICVkXG4iLChpbnQpcERldmljZS0+YnlQcmVhbWJsZVR5cGUpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIGJ5U2hvcnRQcmVhbWJsZT0gJWRcbiIsKGludClwRGV2aWNlLT5ieVNob3J0UHJlYW1ibGUpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIHVDb25uZWN0aW9uUmF0ZT0gJWRcbiIsKGludClwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIGJ5QkJUeXBlPSAlZFxuIiwoaW50KXBEZXZpY2UtPmJ5QkJUeXBlKTsKKyAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBwRGV2aWNlLT5iMTFoRW5hYmxlPSAlZFxuIiwoaW50KXBEZXZpY2UtPmIxMWhFbmFibGUpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIHBEZXZpY2UtPmJEaXZlcnNpdHlSZWdDdGxPTj0gJWRcbiIsKGludClwRGV2aWNlLT5iRGl2ZXJzaXR5UmVnQ3RsT04pOwogfQogCi1zdGF0aWMgdm9pZCBzX3ZDb21wbGV0ZUN1cnJlbnRNZWFzdXJlIChQU0RldmljZSBwRGV2aWNlLCBCWVRFIGJ5UmVzdWx0KQorc3RhdGljIHZvaWQgc192Q29tcGxldGVDdXJyZW50TWVhc3VyZSAoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgY2hhciBieVJlc3VsdCkKIHsKLSAgICBVSU5UICAgIGlpOwotICAgIERXT1JEICAgZHdEdXJhdGlvbiA9IDA7Ci0gICAgQllURSAgICBieVJQSTAgPSAwOworICAgIHVuc2lnbmVkIGludCBpaTsKKyAgICB1bnNpZ25lZCBsb25nIGR3RHVyYXRpb24gPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlSUEkwID0gMDsKIAogICAgIGZvcihpaT0xO2lpPDg7aWkrKykgewogICAgICAgICBwRGV2aWNlLT5kd1JQSXNbaWldICo9IDI1NTsKLSAgICAgICAgZHdEdXJhdGlvbiB8PSAqKChQV09SRCkgKHBEZXZpY2UtPnBDdXJyTWVhc3VyZUVJRC0+c1JlcS5hYnlEdXJhdGlvbikpOworICAgICAgICBkd0R1cmF0aW9uIHw9ICooKHVuc2lnbmVkIHNob3J0ICopIChwRGV2aWNlLT5wQ3Vyck1lYXN1cmVFSUQtPnNSZXEuYWJ5RHVyYXRpb24pKTsKICAgICAgICAgZHdEdXJhdGlvbiA8PD0gMTA7CiAgICAgICAgIHBEZXZpY2UtPmR3UlBJc1tpaV0gLz0gZHdEdXJhdGlvbjsKLSAgICAgICAgcERldmljZS0+YWJ5UlBJc1tpaV0gPSAoQllURSkgcERldmljZS0+ZHdSUElzW2lpXTsKKyAgICAgICAgcERldmljZS0+YWJ5UlBJc1tpaV0gPSAodW5zaWduZWQgY2hhcikgcERldmljZS0+ZHdSUElzW2lpXTsKICAgICAgICAgYnlSUEkwICs9IHBEZXZpY2UtPmFieVJQSXNbaWldOwogICAgIH0KICAgICBwRGV2aWNlLT5hYnlSUElzWzBdID0gKDB4RkYgLSBieVJQSTApOwogCiAgICAgIGlmIChwRGV2aWNlLT51TnVtT2ZNZWFzdXJlRUlEcyA9PSAwKSB7CiAgICAgICAgIFZOVFdJRkliTWVhc3VyZVJlcG9ydCggIHBEZXZpY2UtPnBNZ210LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5wQ3Vyck1lYXN1cmVFSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5UmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUJhc2ljTWFwLApAQCAtNTA1LDcgKzUwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgVk5UV0lGSWJNZWFzdXJlUmVwb3J0KCAgcERldmljZS0+cE1nbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+cEN1cnJNZWFzdXJlRUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlCYXNpY01hcCwKQEAgLTUyNSwxMiArNTI3LDEyIEBACiAKIHN0YXRpYyB2b2lkIGRldmljZV9pbml0X3JlZ2lzdGVycyhQU0RldmljZSBwRGV2aWNlLCBERVZJQ0VfSU5JVF9UWVBFIEluaXRUeXBlKQogewotICAgIFVJTlQgICAgaWk7Ci0gICAgQllURSAgICBieVZhbHVlOwotCUJZVEUgICAgYnlWYWx1ZTE7Ci0gICAgQllURSAgICBieUNDS1B3cmRCbSA9IDA7Ci0gICAgQllURSAgICBieU9GRE1Qd3JkQm0gPSAwOwotICAgIElOVCB6b25ldHlwZT0wOworICAgIHVuc2lnbmVkIGludCBpaTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VmFsdWU7CisgICAgdW5zaWduZWQgY2hhciBieVZhbHVlMTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q0NLUHdyZEJtID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T0ZETVB3cmRCbSA9IDA7CisgICAgaW50IHpvbmV0eXBlPTA7CiAgICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwogICAgIE1BQ2JTaHV0ZG93bihwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICBCQnZTb2Z0d2FyZVJlc2V0KHBEZXZpY2UtPlBvcnRPZmZzZXQpOwpAQCAtNTQwLDExICs1NDIsMTEgQEAKICAgICAgICAgLy8gRG8gTUFDYlNvZnR3YXJlUmVzZXQgaW4gTUFDdkluaXRpYWxpemUKICAgICAgICAgTUFDYlNvZnR3YXJlUmVzZXQocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgIC8vIGZvcmNlIENDSwotICAgICAgICBwRGV2aWNlLT5iQ0NLID0gVFJVRTsKLSAgICAgICAgcERldmljZS0+YkFFUyA9IEZBTFNFOwotICAgICAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSBGQUxTRTsgICAgICAvL09ubHkgdXNlZCBpbiAxMWcgdHlwZSwgc3luYyB3aXRoIEVSUCBJRQotICAgICAgICBwRGV2aWNlLT5iTm9uRVJQUHJlc2VudCA9IEZBTFNFOwotICAgICAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IEZBTFNFOworICAgICAgICBwRGV2aWNlLT5iQ0NLID0gdHJ1ZTsKKyAgICAgICAgcERldmljZS0+YkFFUyA9IGZhbHNlOworICAgICAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSBmYWxzZTsgICAgICAvL09ubHkgdXNlZCBpbiAxMWcgdHlwZSwgc3luYyB3aXRoIEVSUCBJRQorICAgICAgICBwRGV2aWNlLT5iTm9uRVJQUHJlc2VudCA9IGZhbHNlOworICAgICAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IGZhbHNlOwogICAgICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSBSQVRFXzFNOwogICAgICAgICBwRGV2aWNlLT5ieVRvcE9GRE1CYXNpY1JhdGUgPSBSQVRFXzI0TTsKICAgICAgICAgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUgPSBSQVRFXzFNOwpAQCAtNTcwLDkgKzU3Miw5IEBACiAgICAgICAgIC8vIEdldCBBbnRlbmEKICAgICAgICAgYnlWYWx1ZSA9IFNST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBFRVBfT0ZTX0FOVEVOTkEpOwogICAgICAgICBpZiAoYnlWYWx1ZSAmIEVFUF9BTlRJTlYpCi0gICAgICAgICAgICBwRGV2aWNlLT5iVHhSeEFudEludiA9IFRSVUU7CisgICAgICAgICAgICBwRGV2aWNlLT5iVHhSeEFudEludiA9IHRydWU7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBEZXZpY2UtPmJUeFJ4QW50SW52ID0gRkFMU0U7CisgICAgICAgICAgICBwRGV2aWNlLT5iVHhSeEFudEludiA9IGZhbHNlOwogI2lmZGVmCVBMSUNFX0RFQlVHCiAJLy9wcmludGsoImluaXRfcmVnaXN0ZXI6VHhSeEFudEludiBpcyAlZCxieVZhbHVlIGlzICVkXG4iLHBEZXZpY2UtPmJUeFJ4QW50SW52LGJ5VmFsdWUpOwogI2VuZGlmCkBAIC01ODcsNyArNTg5LDcgQEAKICAgICAgICAgcERldmljZS0+dWxEaXZlcnNpdHlNVmFsdWUgPSAxMDAqMTY7Ly9TUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgMHg1Mik7CiAgICAgICAgIHBEZXZpY2UtPmJ5VE1heCA9IDE7Ly9TUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgMHg1Myk7CiAgICAgICAgIHBEZXZpY2UtPmJ5VE1heDIgPSA0Oy8vU1JPTWJ5UmVhZEVtYmVkZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIDB4NTQpOwotICAgICAgICBwRGV2aWNlLT51bFNRM1RIID0gMDsvLyhVTE9ORykgU1JPTWJ5UmVhZEVtYmVkZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIDB4NTUpOworICAgICAgICBwRGV2aWNlLT51bFNRM1RIID0gMDsvLyh1bnNpZ25lZCBsb25nKSBTUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgMHg1NSk7CiAgICAgICAgIHBEZXZpY2UtPmJ5VE1heDMgPSA2NDsvL1NST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAweDU2KTsKIAogICAgICAgICBpZiAoYnlWYWx1ZSA9PSAoRUVQX0FOVEVOTkFfQVVYIHwgRUVQX0FOVEVOTkFfTUFJTikpIHsKQEAgLTU5NSw3ICs1OTcsNyBAQAogICAgICAgICAgICAgcERldmljZS0+YnlUeEFudGVubmFNb2RlID0gQU5UX0I7CiAgICAgICAgICAgICBwRGV2aWNlLT5kd1R4QW50ZW5uYVNlbCA9IDE7CiAgICAgICAgICAgICBwRGV2aWNlLT5kd1J4QW50ZW5uYVNlbCA9IDE7Ci0gICAgICAgICAgICBpZiAocERldmljZS0+YlR4UnhBbnRJbnYgPT0gVFJVRSkKKyAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iVHhSeEFudEludiA9PSB0cnVlKQogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5UnhBbnRlbm5hTW9kZSA9IEFOVF9BOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5UnhBbnRlbm5hTW9kZSA9IEFOVF9COwpAQCAtNjAzLDI2ICs2MDUsMjYgQEAKIGJ5VmFsdWUxID0gU1JPTWJ5UmVhZEVtYmVkZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIEVFUF9PRlNfQU5URU5OQSk7CiAgICAgICAgICAgLy8gIGlmIChwRGV2aWNlLT5iRGl2ZXJzaXR5UmVnQ3RsT04pCiAgICAgICAgICAgaWYoKGJ5VmFsdWUxJjB4MDgpPT0wKQotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJEaXZlcnNpdHlFbmFibGUgPSBGQUxTRTsvL1NST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAweDUwKTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iRGl2ZXJzaXR5RW5hYmxlID0gZmFsc2U7Ly9TUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgMHg1MCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcERldmljZS0+YkRpdmVyc2l0eUVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgcERldmljZS0+YkRpdmVyc2l0eUVuYWJsZSA9IHRydWU7CiAjaWZkZWYJUExJQ0VfREVCVUcKIAkJLy9wcmludGsoImF1eCB8bWFpbiBhbnRlbm5hOiBSeEFudGVubmFNb2RlIGlzICVkXG4iLHBEZXZpY2UtPmJ5UnhBbnRlbm5hTW9kZSk7CiAjZW5kaWYKIAl9IGVsc2UgIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJEaXZlcnNpdHlFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJEaXZlcnNpdHlFbmFibGUgPSBmYWxzZTsKICAgICAgICAgICAgIHBEZXZpY2UtPmJ5QW50ZW5uYUNvdW50ID0gMTsKICAgICAgICAgICAgIHBEZXZpY2UtPmR3VHhBbnRlbm5hU2VsID0gMDsKICAgICAgICAgICAgIHBEZXZpY2UtPmR3UnhBbnRlbm5hU2VsID0gMDsKICAgICAgICAgICAgIGlmIChieVZhbHVlICYgRUVQX0FOVEVOTkFfQVVYKSB7CiAgICAgICAgICAgICAgICAgcERldmljZS0+YnlUeEFudGVubmFNb2RlID0gQU5UX0E7Ci0gICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJUeFJ4QW50SW52ID09IFRSVUUpCisgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJUeFJ4QW50SW52ID09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5UnhBbnRlbm5hTW9kZSA9IEFOVF9COwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlSeEFudGVubmFNb2RlID0gQU5UX0E7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5VHhBbnRlbm5hTW9kZSA9IEFOVF9COwotICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iVHhSeEFudEludiA9PSBUUlVFKQorICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iVHhSeEFudEludiA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieVJ4QW50ZW5uYU1vZGUgPSBBTlRfQTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5UnhBbnRlbm5hTW9kZSA9IEFOVF9COwpAQCAtNjM4LDcgKzY0MCw3IEBACiAvLzIwMDgtOC00IDxhZGQ+IGJ5IGNoZXN0ZXIKIC8vem9uZXR5cGUgaW5pdGlhbAogIHBEZXZpY2UtPmJ5T3JpZ2luYWxab25ldHlwZSA9IHBEZXZpY2UtPmFieUVFUFJPTVtFRVBfT0ZTX1pPTkVUWVBFXTsKLSB6b25ldHlwZSA9IENvbmZpZ19GaWxlT3BlcmF0aW9uKHBEZXZpY2UsRkFMU0UsTlVMTCk7Cisgem9uZXR5cGUgPSBDb25maWdfRmlsZU9wZXJhdGlvbihwRGV2aWNlLGZhbHNlLE5VTEwpOwogIGlmICh6b25ldHlwZSA+PSAwKSB7ICAgICAgICAgLy9yZWFkIHpvbmV0eXBlIGZpbGUgb2shCiAgIGlmICgoem9uZXR5cGUgPT0gMCkmJgogICAgICAgICAocERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdICE9MHgwMCkpeyAgICAgICAgICAvL2ZvciBVU0EKQEAgLTY4MCw3ICs2ODIsNyBAQAogICAgICAgICBwRGV2aWNlLT5ieVJGVHlwZSAmPSBSRl9NQVNLOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwRGV2aWNlLT5ieVJGVHlwZSA9ICV4XG4iLCBwRGV2aWNlLT5ieVJGVHlwZSk7CiAKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJab25lUmVnRXhpc3QgPT0gRkFMU0UpIHsKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJab25lUmVnRXhpc3QgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIHBEZXZpY2UtPmJ5Wm9uZVR5cGUgPSBwRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV07CiAgICAgICAgIH0KICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+Ynlab25lVHlwZSA9ICV4XG4iLCBwRGV2aWNlLT5ieVpvbmVUeXBlKTsKQEAgLTcwMCwxMSArNzAyLDExIEBACiAKIAogICAgICAgICBmb3IgKGlpPTA7aWk8Q0JfTUFYX0NIQU5ORUxfMjRHO2lpKyspIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmFieUNDS1B3clRibFtpaSsxXSA9IFNST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAoQllURSkoaWkgKyBFRVBfT0ZTX0NDS19QV1JfVEJMKSk7CisgICAgICAgICAgICBwRGV2aWNlLT5hYnlDQ0tQd3JUYmxbaWkrMV0gPSBTUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgKHVuc2lnbmVkIGNoYXIpKGlpICsgRUVQX09GU19DQ0tfUFdSX1RCTCkpOwogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmFieUNDS1B3clRibFtpaSsxXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcERldmljZS0+YWJ5Q0NLUHdyVGJsW2lpKzFdID0gcERldmljZS0+YnlDQ0tQd3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpKzFdID0gU1JPTWJ5UmVhZEVtYmVkZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIChCWVRFKShpaSArIEVFUF9PRlNfT0ZETV9QV1JfVEJMKSk7CisgICAgICAgICAgICBwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpKzFdID0gU1JPTWJ5UmVhZEVtYmVkZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsICh1bnNpZ25lZCBjaGFyKShpaSArIEVFUF9PRlNfT0ZETV9QV1JfVEJMKSk7CiAgICAgICAgICAgICBpZiAocERldmljZS0+YWJ5T0ZETVB3clRibFtpaSsxXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcERldmljZS0+YWJ5T0ZETVB3clRibFtpaSsxXSA9IHBEZXZpY2UtPmJ5T0ZETVB3ckc7CiAgICAgICAgICAgICB9CkBAIC03MjYsMTAgKzcyOCwxMCBAQAogCiAgICAgICAgIC8vIExvYWQgT0ZETSBBIFBvd2VyIFRhYmxlCiAgICAgICAgIGZvciAoaWk9MDtpaTxDQl9NQVhfQ0hBTk5FTF81RztpaSsrKSB7IC8vUm9iZXJ0WXU6MjAwNDEyMjQsIGJ1ZyB1c2luZyBDQl9NQVhfQ0hBTk5FTAotICAgICAgICAgICAgcERldmljZS0+YWJ5T0ZETVB3clRibFtpaStDQl9NQVhfQ0hBTk5FTF8yNEcrMV0gPSBTUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgKEJZVEUpKGlpICsgRUVQX09GU19PRkRNQV9QV1JfVEJMKSk7Ci0gICAgICAgICAgICBwRGV2aWNlLT5hYnlPRkRNRGVmYXVsdFB3cltpaStDQl9NQVhfQ0hBTk5FTF8yNEcrMV0gPSBTUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgKEJZVEUpKGlpICsgRUVQX09GU19PRkRNQV9QV1JfZEJtKSk7CisgICAgICAgICAgICBwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpK0NCX01BWF9DSEFOTkVMXzI0RysxXSA9IFNST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAodW5zaWduZWQgY2hhcikoaWkgKyBFRVBfT0ZTX09GRE1BX1BXUl9UQkwpKTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmFieU9GRE1EZWZhdWx0UHdyW2lpK0NCX01BWF9DSEFOTkVMXzI0RysxXSA9IFNST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAodW5zaWduZWQgY2hhcikoaWkgKyBFRVBfT0ZTX09GRE1BX1BXUl9kQm0pKTsKICAgICAgICAgfQotICAgICAgICBDQVJEdkluaXRDaGFubmVsVGFibGUoKHZvaWQgKilwRGV2aWNlKTsKKyAgICAgICAgaW5pdF9jaGFubmVsX3RhYmxlKCh2b2lkICopcERldmljZSk7CiAKIAogICAgICAgICBpZiAocERldmljZS0+YnlMb2NhbElEID4gUkVWX0lEX1ZUMzI1M19CMSkgewpAQCAtNzczLDM4ICs3NzUsMzggQEAKICAgICAgICAgaWYgKHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA9PSBSQVRFX0FVVE8pIHsKICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IFJBVEVfNTRNOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKFdPUkQpcERldmljZS0+dUNvbm5lY3Rpb25SYXRlOworICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGRlZmF1bHQgRyBNb2RlCiAgICAgICAgIFZOVFdJRkliQ29uZmlnUGh5TW9kZShwRGV2aWNlLT5wTWdtdCwgUEhZX1RZUEVfMTFHKTsKICAgICAgICAgVk5UV0lGSWJDb25maWdQaHlNb2RlKHBEZXZpY2UtPnBNZ210LCBQSFlfVFlQRV9BVVRPKTsKIAotICAgICAgICBwRGV2aWNlLT5iUmFkaW9PZmYgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+YlJhZGlvT2ZmID0gZmFsc2U7CiAKICAgICAgICAgcERldmljZS0+YnlSYWRpb0N0bCA9IFNST01ieVJlYWRFbWJlZGRlZChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBFRVBfT0ZTX1JBRElPQ1RMKTsKLSAgICAgICAgcERldmljZS0+YkhXUmFkaW9PZmYgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+YkhXUmFkaW9PZmYgPSBmYWxzZTsKIAogICAgICAgICBpZiAocERldmljZS0+YnlSYWRpb0N0bCAmIEVFUF9SQURJT0NUTF9FTkFCTEUpIHsKICAgICAgICAgICAgIC8vIEdldCBHUElPCiAgICAgICAgICAgICBNQUN2R1BJT0luKHBEZXZpY2UtPlBvcnRPZmZzZXQsICZwRGV2aWNlLT5ieUdQSU8pOwogLy8yMDA4LTQtMTQgPGFkZD4gYnkgY2hlc3RlciBmb3IgbGVkIGlzc3VlCiAgI2lmZGVmIEZPUl9MRURfT05fTk9URUJPT0sKLWlmIChwRGV2aWNlLT5ieUdQSU8gJiBHUElPMF9EQVRBKXtwRGV2aWNlLT5iSFdSYWRpb09mZiA9IFRSVUU7fQotaWYgKCAhKHBEZXZpY2UtPmJ5R1BJTyAmIEdQSU8wX0RBVEEpKXtwRGV2aWNlLT5iSFdSYWRpb09mZiA9IEZBTFNFO30KK2lmIChwRGV2aWNlLT5ieUdQSU8gJiBHUElPMF9EQVRBKXtwRGV2aWNlLT5iSFdSYWRpb09mZiA9IHRydWU7fQoraWYgKCAhKHBEZXZpY2UtPmJ5R1BJTyAmIEdQSU8wX0RBVEEpKXtwRGV2aWNlLT5iSFdSYWRpb09mZiA9IGZhbHNlO30KIAogICAgICAgICAgICAgfQotICAgICAgICBpZiAoIChwRGV2aWNlLT5iUmFkaW9Db250cm9sT2ZmID09IFRSVUUpKSB7CisgICAgICAgIGlmICggKHBEZXZpY2UtPmJSYWRpb0NvbnRyb2xPZmYgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9mZihwRGV2aWNlKTsKICAgICAgICAgfQogZWxzZSAgQ0FSRGJSYWRpb1Bvd2VyT24ocERldmljZSk7CiAjZWxzZQogICAgICAgICAgICAgaWYgKCgocERldmljZS0+YnlHUElPICYgR1BJTzBfREFUQSkgJiYgIShwRGV2aWNlLT5ieVJhZGlvQ3RsICYgRUVQX1JBRElPQ1RMX0lOVikpIHx8CiAgICAgICAgICAgICAgICAgKCAhKHBEZXZpY2UtPmJ5R1BJTyAmIEdQSU8wX0RBVEEpICYmIChwRGV2aWNlLT5ieVJhZGlvQ3RsICYgRUVQX1JBRElPQ1RMX0lOVikpKSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YkhXUmFkaW9PZmYgPSBUUlVFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJIV1JhZGlvT2ZmID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoKHBEZXZpY2UtPmJIV1JhZGlvT2ZmID09IFRSVUUpIHx8IChwRGV2aWNlLT5iUmFkaW9Db250cm9sT2ZmID09IFRSVUUpKSB7CisgICAgICAgIGlmICgocERldmljZS0+YkhXUmFkaW9PZmYgPT0gdHJ1ZSkgfHwgKHBEZXZpY2UtPmJSYWRpb0NvbnRyb2xPZmYgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9mZihwRGV2aWNlKTsKICAgICAgICAgfQogCkBAIC04NTAsMTcgKzg1MiwxNyBAQAogc3RhdGljIHZvaWQgZGV2aWNlX2luaXRfZGl2ZXJzaXR5X3RpbWVyKFBTRGV2aWNlIHBEZXZpY2UpIHsKIAogICAgIGluaXRfdGltZXIoJnBEZXZpY2UtPlRpbWVyU1EzVG1heDEpOwotICAgIHBEZXZpY2UtPlRpbWVyU1EzVG1heDEuZGF0YSA9IChVTE9ORylwRGV2aWNlOworICAgIHBEZXZpY2UtPlRpbWVyU1EzVG1heDEuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwRGV2aWNlOwogICAgIHBEZXZpY2UtPlRpbWVyU1EzVG1heDEuZnVuY3Rpb24gPSAoVGltZXJGdW5jdGlvbilUaW1lclNRM0NhbGxCYWNrOwogICAgIHBEZXZpY2UtPlRpbWVyU1EzVG1heDEuZXhwaXJlcyA9IFJVTl9BVChIWik7CiAKICAgICBpbml0X3RpbWVyKCZwRGV2aWNlLT5UaW1lclNRM1RtYXgyKTsKLSAgICBwRGV2aWNlLT5UaW1lclNRM1RtYXgyLmRhdGEgPSAoVUxPTkcpcERldmljZTsKKyAgICBwRGV2aWNlLT5UaW1lclNRM1RtYXgyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgcERldmljZTsKICAgICBwRGV2aWNlLT5UaW1lclNRM1RtYXgyLmZ1bmN0aW9uID0gKFRpbWVyRnVuY3Rpb24pVGltZXJTUTNDYWxsQmFjazsKICAgICBwRGV2aWNlLT5UaW1lclNRM1RtYXgyLmV4cGlyZXMgPSBSVU5fQVQoSFopOwogCiAgICAgaW5pdF90aW1lcigmcERldmljZS0+VGltZXJTUTNUbWF4Myk7Ci0gICAgcERldmljZS0+VGltZXJTUTNUbWF4My5kYXRhID0gKFVMT05HKXBEZXZpY2U7CisgICAgcERldmljZS0+VGltZXJTUTNUbWF4My5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHBEZXZpY2U7CiAgICAgcERldmljZS0+VGltZXJTUTNUbWF4My5mdW5jdGlvbiA9IChUaW1lckZ1bmN0aW9uKVRpbWVyU3RhdGUxQ2FsbEJhY2s7CiAgICAgcERldmljZS0+VGltZXJTUTNUbWF4My5leHBpcmVzID0gUlVOX0FUKEhaKTsKIApAQCAtODY4LDEzICs4NzAsMTMgQEAKIH0KIAogCi1zdGF0aWMgQk9PTCBkZXZpY2VfcmVsZWFzZV9XUEFERVYoUFNEZXZpY2UgcERldmljZSkKK3N0YXRpYyBib29sIGRldmljZV9yZWxlYXNlX1dQQURFVihQU0RldmljZSBwRGV2aWNlKQogewogICB2aWF3Z2V0X3dwYV9oZWFkZXIgKndwYWhkcjsKICAgaW50IGlpPTA7CiAgLy8gd2FpdF9xdWV1ZV9oZWFkX3QJU2V0X3dhaXQ7CiAgIC8vc2VuZCBkZXZpY2UgY2xvc2UgdG8gd3BhX3N1cHBsaWNuYXQgbGF5ZXIKLSAgICBpZiAocERldmljZS0+YldQQURFVlVwPT1UUlVFKSB7CisgICAgaWYgKHBEZXZpY2UtPmJXUEFERVZVcD09dHJ1ZSkgewogICAgICAgICAgICAgICAgICB3cGFoZHIgPSAodmlhd2dldF93cGFfaGVhZGVyICopcERldmljZS0+c2tiLT5kYXRhOwogICAgICAgICAgICAgICAgICB3cGFoZHItPnR5cGUgPSBWSUFXR0VUX0RFVklDRUNMT1NFX01TRzsKICAgICAgICAgICAgICAgICAgd3BhaGRyLT5yZXNwX2llX2xlbiA9IDA7CkBAIC04OTEsNyArODkzLDcgQEAKICAvL3dhaXQgcmVsZWFzZSBXUEFERVYKICAgICAgICAgICAgICAgLy8gICAgaW5pdF93YWl0cXVldWVfaGVhZCgmU2V0X3dhaXQpOwogICAgICAgICAgICAgICAvLyAgICB3YWl0X2V2ZW50X3RpbWVvdXQoU2V0X3dhaXQsICgocERldmljZS0+d3BhZGV2PT1OVUxMKSYmKHBEZXZpY2UtPnNrYiA9PSBOVUxMKSksNSpIWik7ICAgIC8vMXMgd2FpdAotICAgICAgICAgICAgICB3aGlsZSgocERldmljZS0+YldQQURFVlVwPT1UUlVFKSkgeworICAgICAgICAgICAgICB3aGlsZSgocERldmljZS0+YldQQURFVlVwPT10cnVlKSkgewogCSAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogICAgICAgICAgICAgICAgICBzY2hlZHVsZV90aW1lb3V0IChIWi8yMCk7ICAgICAgICAgIC8vd2FpdCA1MG1zCiAgICAgICAgICAgICAgICAgIGlpKys7CkBAIC04OTksNyArOTAxLDcgQEAKIAkJICBicmVhazsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKQEAgLTkxNCwxMCArOTE2LDEwIEBACiAKIAogCi1zdGF0aWMgaW50Ci1kZXZpY2VfZm91bmQxKHN0cnVjdCBwY2lfZGV2ICpwY2lkLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorc3RhdGljIGludCBfX2RldmluaXQKK3Z0NjY1NV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZCwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLSAgICBzdGF0aWMgQk9PTCBiRmlyc3QgPSBUUlVFOworICAgIHN0YXRpYyBib29sIGJGaXJzdCA9IHRydWU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UqICBkZXYgPSBOVUxMOwogICAgIFBDSElQX0lORk8gIHBDaGlwX2luZm8gPSAoUENISVBfSU5GTyllbnQtPmRyaXZlcl9kYXRhOwogICAgIFBTRGV2aWNlICAgIHBEZXZpY2U7CkBAIC05NDQsMTAgKzk0NiwxMCBAQAogICAgIGlmIChiRmlyc3QpIHsKICAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyBWZXIuICVzXG4iLERFVklDRV9GVUxMX0RSVl9OQU0sIERFVklDRV9WRVJTSU9OKTsKICAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJDb3B5cmlnaHQgKGMpIDIwMDMgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuXG4iKTsKLSAgICAgICAgYkZpcnN0PUZBTFNFOworICAgICAgICBiRmlyc3Q9ZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFkZXZpY2VfaW5pdF9pbmZvKHBjaWQsICZwRGV2aWNlLCBwQ2hpcF9pbmZvKSkgeworICAgIGlmICghdnQ2NjU1X2luaXRfaW5mbyhwY2lkLCAmcERldmljZSwgcENoaXBfaW5mbykpIHsKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgfQogICAgIHBEZXZpY2UtPmRldiA9IGRldjsKQEAgLTk2Miw3ICs5NjQsNyBAQAogI2lmZGVmCURFQlVHCiAJcHJpbnRrKCJCZWZvcmUgZ2V0IHBjaV9pbmZvIG1lbWFkZHIgaXMgJXhcbiIscERldmljZS0+bWVtYWRkcik7CiAjZW5kaWYKLSAgICBpZiAoZGV2aWNlX2dldF9wY2lfaW5mbyhwRGV2aWNlLHBjaWQpID09IEZBTFNFKSB7CisgICAgaWYgKGRldmljZV9nZXRfcGNpX2luZm8ocERldmljZSxwY2lkKSA9PSBmYWxzZSkgewogICAgICAgICBwcmludGsoS0VSTl9FUlIgREVWSUNFX05BTUUgIjogRmFpbGVkIHRvIGZpbmQgUENJIGRldmljZS5cbiIpOwogICAgICAgICBkZXZpY2VfZnJlZV9pbmZvKHBEZXZpY2UpOwogICAgICAgICByZXR1cm4gLUVOT0RFVjsKQEAgLTk3Niw3ICs5NzgsNyBAQAogCXByaW50aygiYWZ0ZXIgZ2V0IHBjaV9pbmZvIG1lbWFkZHIgaXMgJXgsIGlvIGFkZHIgaXMgJXgsaW9fc2l6ZSBpcyAlZFxuIixwRGV2aWNlLT5tZW1hZGRyLHBEZXZpY2UtPmlvYWRkcixwRGV2aWNlLT5pb19zaXplKTsKIAl7CiAJCWludCBpOwotCQlVMzIJCQliYXIsbGVuOworCQl1MzIJCQliYXIsbGVuOwogCQl1MzIgYWRkcmVzc1tdID0gewogCQlQQ0lfQkFTRV9BRERSRVNTXzAsCiAJCVBDSV9CQVNFX0FERFJFU1NfMSwKQEAgLTEwMjAsOCArMTAyMiw4IEBACiAjaWZkZWYJREVCVUcKIAkvL3JldHVybiAgMCAgOwogI2VuZGlmCi0gICAgcERldmljZS0+UG9ydE9mZnNldCA9IChEV09SRClpb3JlbWFwKHBEZXZpY2UtPm1lbWFkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLLCBwRGV2aWNlLT5pb19zaXplKTsKLQkvL3BEZXZpY2UtPlBvcnRPZmZzZXQgPSAoRFdPUkQpaW9yZW1hcChwRGV2aWNlLT5pb2FkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0ssIHBEZXZpY2UtPmlvX3NpemUpOworICAgIHBEZXZpY2UtPlBvcnRPZmZzZXQgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKHBEZXZpY2UtPm1lbWFkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLLCBwRGV2aWNlLT5pb19zaXplKTsKKwkvL3BEZXZpY2UtPlBvcnRPZmZzZXQgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKHBEZXZpY2UtPmlvYWRkciAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSywgcERldmljZS0+aW9fc2l6ZSk7CiAKIAlpZihwRGV2aWNlLT5Qb3J0T2Zmc2V0ID09IDApIHsKICAgICAgICBwcmludGsoS0VSTl9FUlIgREVWSUNFX05BTUUgIjogRmFpbGVkIHRvIElPIHJlbWFwcGluZyAuLlxuIik7CkBAIC0xMDQxLDcgKzEwNDMsNyBAQAogCiAgICAgZGV2LT5iYXNlX2FkZHIgPSBwRGV2aWNlLT5pb2FkZHI7CiAjaWZkZWYJUExJQ0VfREVCVUcKLQlCWVRFCXZhbHVlOworCXVuc2lnbmVkIGNoYXIgCXZhbHVlOwogCiAJVk5TdkluUG9ydEIocERldmljZS0+UG9ydE9mZnNldCsweDRGLCAmdmFsdWUpOwogCXByaW50aygiQmVmb3JlIHdyaXRlOiB2YWx1ZSBpcyAleFxuIix2YWx1ZSk7CkBAIC0xMTExLDE2ICsxMTEzLDE3IEBACiAgICAgREJHX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9JTkZPICIlczogJXNcbiIsZGV2LT5uYW1lLCBnZXRfY2hpcF9uYW1lKHBEZXZpY2UtPmNoaXBfaWQpKTsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8gIiVzOiBNQUM9JXBNIiwgZGV2LT5uYW1lLCBkZXYtPmRldl9hZGRyKTsKICNpZmRlZiBJT19NQVAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8iIElPPTB4JWx4ICAiLChVTE9ORykgcERldmljZS0+aW9hZGRyKTsKKyAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8iIElPPTB4JWx4ICAiLCh1bnNpZ25lZCBsb25nKSBwRGV2aWNlLT5pb2FkZHIpOwogICAgIERCR19QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyIgSVJRPSVkIFxuIiwgcERldmljZS0+ZGV2LT5pcnEpOwogI2Vsc2UKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8iIElPPTB4JWx4IE1lbT0weCVseCAiLChVTE9ORykgcERldmljZS0+aW9hZGRyLChVTE9ORykgcERldmljZS0+UG9ydE9mZnNldCk7CisgICAgREJHX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9JTkZPIiBJTz0weCVseCBNZW09MHglbHggIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBwRGV2aWNlLT5pb2FkZHIsKHVuc2lnbmVkIGxvbmcpIHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgIERCR19QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyIgSVJRPSVkIFxuIiwgcERldmljZS0+ZGV2LT5pcnEpOwogI2VuZGlmCiAKIH0KIAotc3RhdGljIEJPT0wgZGV2aWNlX2luaXRfaW5mbyhzdHJ1Y3QgcGNpX2RldiogcGNpZCwgUFNEZXZpY2UqIHBwRGV2aWNlLAorc3RhdGljIGJvb2wgX19kZXZpbml0IHZ0NjY1NV9pbml0X2luZm8oc3RydWN0IHBjaV9kZXYqIHBjaWQsIFBTRGV2aWNlKiBwcERldmljZSwKICAgICBQQ0hJUF9JTkZPIHBDaGlwX2luZm8pIHsKIAogICAgIFBTRGV2aWNlIHA7CkBAIC0xMTQ1LDE5ICsxMTQ4LDE5IEBACiAKICAgICBzcGluX2xvY2tfaW5pdCgmKCgqcHBEZXZpY2UpLT5sb2NrKSk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIEJPT0wgZGV2aWNlX2dldF9wY2lfaW5mbyhQU0RldmljZSBwRGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiogcGNpZCkgeworc3RhdGljIGJvb2wgZGV2aWNlX2dldF9wY2lfaW5mbyhQU0RldmljZSBwRGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiogcGNpZCkgewogCi0gICAgVTE2IHBjaV9jbWQ7Ci0gICAgVTggIGI7Ci0gICAgVUlOVCBjaXNfYWRkcjsKKyAgICB1MTYgcGNpX2NtZDsKKyAgICB1OCAgYjsKKyAgICB1bnNpZ25lZCBpbnQgY2lzX2FkZHI7CiAjaWZkZWYJUExJQ0VfREVCVUcKLQlCWVRFICAgICAgIHBjaV9jb25maWdbMjU2XTsKLQlCWVRFCXZhbHVlID0weDAwOworCXVuc2lnbmVkIGNoYXIgcGNpX2NvbmZpZ1syNTZdOworCXVuc2lnbmVkIGNoYXIgCXZhbHVlID0weDAwOwogCWludAkJaWksajsKLQlVMTYJbWF4X2xhdD0weDAwMDA7CisJdTE2CW1heF9sYXQ9MHgwMDAwOwogCW1lbXNldChwY2lfY29uZmlnLDB4MDAsMjU2KTsKICNlbmRpZgogCkBAIC0xMjExLDcgKzEyMTQsNyBAQAogCQl9CiAJfQogI2VuZGlmCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGRldmljZV9mcmVlX2luZm8oUFNEZXZpY2UgcERldmljZSkgewpAQCAtMTI2Myw3ICsxMjY2LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBCT09MIGRldmljZV9pbml0X3JpbmdzKFBTRGV2aWNlIHBEZXZpY2UpIHsKK3N0YXRpYyBib29sIGRldmljZV9pbml0X3JpbmdzKFBTRGV2aWNlIHBEZXZpY2UpIHsKICAgICB2b2lkKiAgIHZpcl9wb29sOwogCiAKQEAgLTEyNzcsNyArMTI4MCw3IEBACiAKICAgICBpZiAodmlyX3Bvb2wgPT0gTlVMTCkgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIgIiVzIDogYWxsb2NhdGUgZGVzYyBkbWEgbWVtb3J5IGZhaWxlZFxuIiwgcERldmljZS0+ZGV2LT5uYW1lKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgbWVtc2V0KHZpcl9wb29sLCAwLApAQCAtMTMxMiw3ICsxMzE1LDcgQEAKICAgICAgICAgICAgIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzFdICogc2l6ZW9mKFNUeERlc2MpLAogICAgICAgICAgICAgdmlyX3Bvb2wsIHBEZXZpY2UtPnBvb2xfZG1hCiAgICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBtZW1zZXQocERldmljZS0+dHgwX2J1ZnMsIDAsCkBAIC0xMzU4LDcgKzEzNjEsNyBAQAogICAgICAgICAgICAgcERldmljZS0+c09wdHMublR4RGVzY3NbMV0gKiBQS1RfQlVGX1NaOwogCiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfcmluZ3MoUFNEZXZpY2UgcERldmljZSkgewpAQCAtMTU5Myw3ICsxNTk2LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbnQgZGV2aWNlX3J4X3NydihQU0RldmljZSBwRGV2aWNlLCBVSU5UIHVJZHgpIHsKK3N0YXRpYyBpbnQgZGV2aWNlX3J4X3NydihQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBpbnQgdUlkeCkgewogICAgIFBTUnhEZXNjICAgIHBSRDsKICAgICBpbnQgd29ya3MgPSAwOwogCkBAIC0xNjIxLDcgKzE2MjQsNyBAQAogfQogCiAKLXN0YXRpYyBCT09MIGRldmljZV9hbGxvY19yeF9idWYoUFNEZXZpY2UgcERldmljZSwgUFNSeERlc2MgcFJEKSB7CitzdGF0aWMgYm9vbCBkZXZpY2VfYWxsb2NfcnhfYnVmKFBTRGV2aWNlIHBEZXZpY2UsIFBTUnhEZXNjIHBSRCkgewogCiAgICAgUERFVklDRV9SRF9JTkZPIHBSREluZm89cFJELT5wUkRJbmZvOwogCkBAIC0xNjMxLDcgKzE2MzQsNyBAQAogCS8vcHJpbnRrKCJkZXZpY2VfYWxsb2NfcnhfYnVmOnNrYiBpcyAleFxuIixwUkRJbmZvLT5za2IpOwogI2VuZGlmCiAgICAgaWYgKHBSREluZm8tPnNrYj09TlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgQVNTRVJUKHBSREluZm8tPnNrYik7CiAgICAgcFJESW5mby0+c2tiLT5kZXYgPSBwRGV2aWNlLT5kZXY7CiAgICAgcFJESW5mby0+c2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHBEZXZpY2UtPnBjaWQsIHNrYl90YWlsX3BvaW50ZXIocFJESW5mby0+c2tiKSwKQEAgLTE2NDMsMzUgKzE2NDYsMzUgQEAKICAgICBwUkQtPm1fcmQxUkQxLndSZXFDb3VudCA9IGNwdV90b19sZTE2KHBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAgICAgcFJELT5idWZmX2FkZHIgPSBjcHVfdG9fbGUzMihwUkRJbmZvLT5za2JfZG1hKTsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIAotQk9PTCBkZXZpY2VfYWxsb2NfZnJhZ19idWYoUFNEZXZpY2UgcERldmljZSwgUFNEZUZyYWdDb250cm9sQmxvY2sgcERlRikgeworYm9vbCBkZXZpY2VfYWxsb2NfZnJhZ19idWYoUFNEZXZpY2UgcERldmljZSwgUFNEZUZyYWdDb250cm9sQmxvY2sgcERlRikgewogCiAgICAgcERlRi0+c2tiID0gZGV2X2FsbG9jX3NrYigoaW50KXBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAgICAgaWYgKHBEZUYtPnNrYiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBBU1NFUlQocERlRi0+c2tiKTsKICAgICBwRGVGLT5za2ItPmRldiA9IHBEZXZpY2UtPmRldjsKIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIAotc3RhdGljIGludCBkZXZpY2VfdHhfc3J2KFBTRGV2aWNlIHBEZXZpY2UsIFVJTlQgdUlkeCkgeworc3RhdGljIGludCBkZXZpY2VfdHhfc3J2KFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGludCB1SWR4KSB7CiAgICAgUFNUeERlc2MgICAgICAgICAgICAgICAgIHBURDsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICAgYkZ1bGw9RkFMU0U7CisgICAgYm9vbCBiRnVsbD1mYWxzZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgd29ya3MgPSAwOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBieVRzcjA7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJ5VHNyMTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgdUZyYW1lU2l6ZSwgdUZJRk9IZWFkZXJTaXplOworICAgIHVuc2lnbmVkIGNoYXIgYnlUc3IwOworICAgIHVuc2lnbmVkIGNoYXIgYnlUc3IxOworICAgIHVuc2lnbmVkIGludAl1RnJhbWVTaXplLCB1RklGT0hlYWRlclNpemU7CiAgICAgUFNUeEJ1ZkhlYWQgICAgICAgICAgICAgIHBUeEJ1ZkhlYWQ7CiAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIHBTdGF0cyA9ICZwRGV2aWNlLT5zdGF0czsKICAgICBzdHJ1Y3Qgc2tfYnVmZiogICAgICAgICAgc2tiOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICB1Tm9kZUluZGV4OworICAgIHVuc2lnbmVkIGludAl1Tm9kZUluZGV4OwogICAgIFBTTWdtdE9iamVjdCAgICAgICAgICAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogCiAKQEAgLTE2OTcsMjAgKzE3MDAsMjAgQEAKIAogICAgICAgICAgICAgICAgIFNUQXZVcGRhdGVURFN0YXRDb3VudGVyKCZwRGV2aWNlLT5zY1N0YXRpc3RpYywKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5VHNyMCwgYnlUc3IxLAotICAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKShwVEQtPnBUREluZm8tPmJ1ZiArIHVGSUZPSGVhZGVyU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKShwVEQtPnBUREluZm8tPmJ1ZiArIHVGSUZPSGVhZGVyU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICB1RnJhbWVTaXplLCB1SWR4KTsKIAogCiAgICAgICAgICAgICAgICAgQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBieVRzcjAsIGJ5VHNyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoUEJZVEUpKHBURC0+cFRESW5mby0+YnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKShwVEQtPnBUREluZm8tPmJ1ZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdUZJRk9IZWFkZXJTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgICAgIGlmICggIShieVRzcjEgJiBUU1IxX1RFUlIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChieVRzcjAgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgVHhbJWRdIE9LIGJ1dCBoYXMgZXJyb3IuIHRzcjFbJTAyWF0gdHNyMFslMDJYXS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXVJZHgsIGJ5VHNyMSwgYnlUc3IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpdUlkeCwgYnlUc3IxLCBieVRzcjApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmICgocFR4QnVmSGVhZC0+d0ZyYWdDdGwgJiBGUkFHQ1RMX0VOREZSQUcpICE9IEZSQUdDVExfTk9ORlJBRykgewogICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+czgwMl8xMUNvdW50ZXIuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50ICsrOwpAQCAtMTcyMCw3ICsxNzIzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBUeFslZF0gZHJvcHBlZCAmIHRzcjFbJTAyWF0gdHNyMFslMDJYXS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXVJZHgsIGJ5VHNyMSwgYnlUc3IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpdUlkeCwgYnlUc3IxLCBieVRzcjApOwogICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4X2Vycm9ycysrOwogICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgICB9CkBAIC0xNzQyLDE5ICsxNzQ1LDE5IEBACiAgICAgICAgICAgICBpZiAoYnlUc3IxICYgVFNSMV9URVJSKSB7CiAgICAgICAgICAgICBpZiAoKHBURC0+cFRESW5mby0+YnlGbGFncyAmIFREX0ZMQUdTX1BSSVZfU0tCKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgVHhbJWRdIGZhaWwgaGFzIGVycm9yLiB0c3IxWyUwMlhdIHRzcjBbJTAyWF0uXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXVJZHgsIGJ5VHNyMSwgYnlUc3IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCl1SWR4LCBieVRzcjEsIGJ5VHNyMCk7CiAgICAgICAgICAgICB9CiAKIC8vICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIFR4WyVkXSBmYWlsIGhhcyBlcnJvci4gdHNyMVslMDJYXSB0c3IwWyUwMlhdLlxuIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXVJZHgsIGJ5VHNyMSwgYnlUc3IwKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXVJZHgsIGJ5VHNyMSwgYnlUc3IwKTsKIAogICAgICAgICAgICAgICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSAmJgogICAgICAgICAgICAgICAgICAgICAocFRELT5wVERJbmZvLT5ieUZsYWdzICYgVERfRkxBR1NfTkVUSUZfU0tCKSkgewotICAgICAgICAgICAgICAgICAgICBXT1JEICAgIHdBSUQ7Ci0gICAgICAgICAgICAgICAgICAgIEJZVEUgICAgYnlNYXNrWzhdID0gezEsIDIsIDQsIDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB3QUlEOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5TWFza1s4XSA9IHsxLCAyLCA0LCA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwfTsKIAogICAgICAgICAgICAgICAgICAgICBza2IgPSBwVEQtPnBUREluZm8tPnNrYjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJTU0RCYklzU1RBSW5Ob2RlREIocE1nbXQsIChQQllURSkoc2tiLT5kYXRhKSwgJnVOb2RlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCAodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGEpLCAmdU5vZGVJbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJQU0VuYWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLnNUeFBTUXVldWUsIHNrYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53RW5RdWV1ZUNudCsrOwpAQCAtMTc2Myw3ICsxNzY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5UFNUeE1hcFt3QUlEID4+IDNdIHw9ICBieU1hc2tbd0FJRCAmIDddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBURC0+cFRESW5mby0+YnlGbGFncyAmPSB+KFREX0ZMQUdTX05FVElGX1NLQik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAidHhfc3J2OnR4IGZhaWwgcmUtcXVldWUgc3RhIGluZGV4PSAlZCwgUXVlQ250PSAlZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLChJTlQpdU5vZGVJbmRleCwgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53RW5RdWV1ZUNudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsKGludCl1Tm9kZUluZGV4LCBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndFblF1ZXVlQ250KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdHMtPnR4X2Vycm9ycy0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhfZHJvcHBlZC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTc4MCwxMCArMTc4MywxMCBAQAogICAgICAgICAvLyBSRVNFUlZfQUMwRE1BIHJlc2VydmVkIGZvciByZWxheQogCiAgICAgICAgIGlmIChBVkFJTF9URChwRGV2aWNlLCB1SWR4KSA8IFJFU0VSVl9BQzBETUEpIHsKLSAgICAgICAgICAgIGJGdWxsID0gVFJVRTsKKyAgICAgICAgICAgIGJGdWxsID0gdHJ1ZTsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBBQzBETUEgaXMgRnVsbCA9ICVkXG4iLCBwRGV2aWNlLT5pVERVc2VkW3VJZHhdKTsKICAgICAgICAgfQotICAgICAgICBpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwRGV2aWNlLT5kZXYpICYmIChiRnVsbD09RkFMU0UpKXsKKyAgICAgICAgaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocERldmljZS0+ZGV2KSAmJiAoYkZ1bGw9PWZhbHNlKSl7CiAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzk1LDcgKzE3OTgsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGRldmljZV9lcnJvcihQU0RldmljZSBwRGV2aWNlLCBXT1JEIHN0YXR1cykgeworc3RhdGljIHZvaWQgZGV2aWNlX2Vycm9yKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIHNob3J0IHN0YXR1cykgewogCiAgICAgaWYgKHN0YXR1cyAmIElTUl9GRVRBTEVSUikgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCkBAIC0xODA0LDcgKzE4MDcsNyBAQAogICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAgICAgICAgIGRlbF90aW1lcigmcERldmljZS0+c1RpbWVyQ29tbWFuZCk7CiAgICAgICAgIGRlbF90aW1lcigmKHBEZXZpY2UtPnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjaykpOwotICAgICAgICBwRGV2aWNlLT5iQ21kUnVubmluZyA9IEZBTFNFOworICAgICAgICBwRGV2aWNlLT5iQ21kUnVubmluZyA9IGZhbHNlOwogICAgICAgICBNQUNiU2h1dGRvd24ocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xODQ0LDcgKzE4NDcsNyBAQAogCiAKIC8vUExJQ0VfREVCVUcgLT4KLUlOVCBNbG1lVGhyZWFkKAoraW50IE1sbWVUaHJlYWQoCiAgICAgIHZvaWQgKiBDb250ZXh0KQogewogCVBTRGV2aWNlCXBEZXZpY2UgPSAgKFBTRGV2aWNlKSBDb250ZXh0OwpAQCAtMTkxNCw4ICsxOTE3LDggQEAKICAgICAgd3BhX1Jlc3VsdC5wcm90byA9IDA7CiAgICAgIHdwYV9SZXN1bHQua2V5X21nbXQgPSAwOwogICAgICB3cGFfUmVzdWx0LmVhcF90eXBlID0gMDsKLSAgICAgd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkID0gRkFMU0U7Ci0gICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBGQUxTRTsKKyAgICAgd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkID0gZmFsc2U7CisgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBmYWxzZTsKICNlbmRpZgogREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiY2FsbCBkZXZpY2UgaW5pdCByZDAgcmluZ1xuIik7CiBkZXZpY2VfaW5pdF9yZDBfcmluZyhwRGV2aWNlKTsKQEAgLTE5ODAsMjAgKzE5ODMsMjAgQEAKIAogCSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCiAJLyoKLSAgICAgcERldmljZS0+YndleHRzdGVwMCA9IEZBTFNFOwotICAgICBwRGV2aWNlLT5id2V4dHN0ZXAxID0gRkFMU0U7Ci0gICAgIHBEZXZpY2UtPmJ3ZXh0c3RlcDIgPSBGQUxTRTsKLSAgICAgcERldmljZS0+YndleHRzdGVwMyA9IEZBTFNFOworICAgICBwRGV2aWNlLT5id2V4dHN0ZXAwID0gZmFsc2U7CisgICAgIHBEZXZpY2UtPmJ3ZXh0c3RlcDEgPSBmYWxzZTsKKyAgICAgcERldmljZS0+YndleHRzdGVwMiA9IGZhbHNlOworICAgICBwRGV2aWNlLT5id2V4dHN0ZXAzID0gZmFsc2U7CiAgICAgICovCiAgICAgICAgcERldmljZS0+YndleHRjb3VudD0wOwotICAgICBwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID0gRkFMU0U7CisgICAgIHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPSBmYWxzZTsKICNlbmRpZgogICAgIHBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKLSAgIHBEZXZpY2UtPmJXUEFERVZVcCA9IEZBTFNFOworICAgcERldmljZS0+YldQQURFVlVwID0gZmFsc2U7CiAgICAgLy8gUGF0Y2g6IGlmIFdFUCBrZXkgYWxyZWFkeSBzZXQgYnkgaXdjb25maWcgYnV0IGRldmljZSBub3QgeWV0IG9wZW4KLSAgICBpZiAoKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID09IFRSVUUpICYmIChwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPT0gVFJVRSkpIHsKKyAgICBpZiAoKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID09IHRydWUpICYmIChwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPT0gdHJ1ZSkpIHsKICAgICAgICAgS2V5YlNldERlZmF1bHRLZXkoJihwRGV2aWNlLT5zS2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpKHBEZXZpY2UtPmJ5S2V5SW5kZXggfCAoMSA8PCAzMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShwRGV2aWNlLT5ieUtleUluZGV4IHwgKDEgPDwgMzEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT51S2V5TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YWJ5S2V5LApAQCAtMjA1MiwxMiArMjA1NSwxMiBAQAogCXRhc2tsZXRfa2lsbCgmcERldmljZS0+UnhNbmdXb3JrSXRlbSk7CiAjZW5kaWYKICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotICAgIHBEZXZpY2UtPmJDbWRSdW5uaW5nID0gRkFMU0U7CisgICAgcERldmljZS0+YkNtZFJ1bm5pbmcgPSBmYWxzZTsKICAgICBNQUNiU2h1dGRvd24ocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgTUFDYlNvZnR3YXJlUmVzZXQocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgQ0FSRGJSYWRpb1Bvd2VyT2ZmKHBEZXZpY2UpOwogCi0gICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisgICAgcERldmljZS0+YkxpbmtQYXNzID0gZmFsc2U7CiAgICAgbWVtc2V0KHBNZ210LT5hYnlDdXJyQlNTSUQsIDAsIDYpOwogICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwogICAgIGRldmljZV9mcmVlX3RkMF9yaW5nKHBEZXZpY2UpOwpAQCAtMjA4Miw4ICsyMDg1LDggQEAKIAogc3RhdGljIGludCBkZXZpY2VfZG1hMF90eF84MDIxMShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2U9bmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBQQllURSAgICAgICAgICAgcGJNUERVOwotICAgIFVJTlQgICAgICAgICAgICBjYk1QRFVMZW4gPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKnBiTVBEVTsKKyAgICB1bnNpZ25lZCBpbnQgY2JNUERVTGVuID0gMDsKIAogCiAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZGV2aWNlX2RtYTBfdHhfODAyMTFcbiIpOwpAQCAtMjA5Niw3ICsyMDk5LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKHBEZXZpY2UtPmJTdG9wVHgwUGt0ID09IFRSVUUpIHsKKyAgICBpZiAocERldmljZS0+YlN0b3BUeDBQa3QgPT0gdHJ1ZSkgewogICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogICAgICAgICByZXR1cm4gMDsKQEAgLTIxMTUsMzYgKzIxMTgsMzYgQEAKIAogCiAKLUJPT0wgZGV2aWNlX2RtYTBfeG1pdChQU0RldmljZSBwRGV2aWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBVSU5UIHVOb2RlSW5kZXgpIHsKK2Jvb2wgZGV2aWNlX2RtYTBfeG1pdChQU0RldmljZSBwRGV2aWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleCkgewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogICAgIFBTVHhEZXNjICAgICAgICBwSGVhZFRELCBwTGFzdFREOwotICAgIFVJTlQgICAgICAgICAgICBjYkZyYW1lQm9keVNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgIHVNQUNmcmFnTnVtOwotICAgIEJZVEUgICAgICAgICAgICBieVBrdFR5cGU7Ci0gICAgQk9PTCAgICAgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IEZBTFNFOworICAgIHVuc2lnbmVkIGludCBjYkZyYW1lQm9keVNpemU7CisgICAgdW5zaWduZWQgaW50IHVNQUNmcmFnTnVtOworICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlOworICAgIGJvb2wgYk5lZWRFbmNyeXB0aW9uID0gZmFsc2U7CiAgICAgUFNLZXlJdGVtICAgICAgIHBUcmFuc21pdEtleSA9IE5VTEw7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSGVhZGVyU2l6ZTsKLSAgICBVSU5UICAgICAgICAgICAgaWk7CisgICAgdW5zaWduZWQgaW50IGNiSGVhZGVyU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAgICAgU0tleUl0ZW0gICAgICAgIFNUZW1wS2V5OwotLy8gICAgQllURSAgICAgICAgICAgIGJ5S2V5SW5kZXggPSAwOworLy8gICAgdW5zaWduZWQgY2hhciBieUtleUluZGV4ID0gMDsKIAogCi0gICAgaWYgKHBEZXZpY2UtPmJTdG9wVHgwUGt0ID09IFRSVUUpIHsKKyAgICBpZiAocERldmljZS0+YlN0b3BUeDBQa3QgPT0gdHJ1ZSkgewogICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9OwogCiAgICAgaWYgKEFWQUlMX1REKHBEZXZpY2UsIFRZUEVfVFhETUEwKSA8PSAwKSB7CiAgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImRldmljZV9kbWEwX3htaXQsIHRkMCA8PTBcbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSB7CiAgICAgICAgIGlmIChwRGV2aWNlLT51QXNzb2NDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZGV2aWNlX2RtYTBfeG1pdCwgYXNzb2NDb3VudCA9IDBcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTUyLDcgKzIxNTUsNyBAQAogCiAgICAgcEhlYWRURC0+bV90ZDFURDEuYnlUQ1IgPSAoVENSX0VEUHxUQ1JfU1RQKTsKIAotICAgIG1lbWNweShwRGV2aWNlLT5zVHhFdGhIZWFkZXIuYWJ5RHN0QWRkciwgKFBCWVRFKShza2ItPmRhdGEpLCBFVEhfSExFTik7CisgICAgbWVtY3B5KHBEZXZpY2UtPnNUeEV0aEhlYWRlci5hYnlEc3RBZGRyLCAodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGEpLCBFVEhfSExFTik7CiAgICAgY2JGcmFtZUJvZHlTaXplID0gc2tiLT5sZW4gLSBFVEhfSExFTjsKIAogICAgIC8vIDgwMi4xSApAQCAtMjE2Myw5ICsyMTY2LDkgQEAKIAogICAgIGlmICggdU1BQ2ZyYWdOdW0gPiBBVkFJTF9URChwRGV2aWNlLCBUWVBFX1RYRE1BMCkpIHsKICAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGJ5UGt0VHlwZSA9IChCWVRFKXBEZXZpY2UtPmJ5UGFja2V0VHlwZTsKKyAgICBieVBrdFR5cGUgPSAodW5zaWduZWQgY2hhcilwRGV2aWNlLT5ieVBhY2tldFR5cGU7CiAKIAogICAgIGlmIChwRGV2aWNlLT5iRml4UmF0ZSkgewpAQCAtMjE3MywxMyArMjE3NiwxMyBAQAogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA+PSBSQVRFXzExTSkgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IFJBVEVfMTFNOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSAoV09SRClwRGV2aWNlLT51Q29ubmVjdGlvblJhdGU7CisgICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPj0gUkFURV81NE0pCiAgICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gUkFURV81NE07CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKFdPUkQpcERldmljZS0+dUNvbm5lY3Rpb25SYXRlOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9ICh1bnNpZ25lZCBzaG9ydClwRGV2aWNlLT51Q29ubmVjdGlvblJhdGU7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CkBAIC0yMjAyLDE1ICsyMjA1LDE1IEBACiAgICAgfSBlbHNlIGlmIChwRGV2aWNlLT5lQ3VycmVudFBIWVR5cGUgPT0gUEhZX1RZUEVfMTFBKSB7CiAgICAgICAgIGJ5UGt0VHlwZSA9IFBLX1RZUEVfMTFBOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPT0gVFJVRSkgeworICAgICAgICBpZiAocERldmljZS0+YlByb3RlY3RNb2RlID09IHRydWUpIHsKICAgICAgICAgICAgIGJ5UGt0VHlwZSA9IFBLX1RZUEVfMTFHQjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5UGt0VHlwZSA9IFBLX1RZUEVfMTFHQTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9PSBUUlVFKQotICAgICAgICBiTmVlZEVuY3J5cHRpb24gPSBUUlVFOworICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9PSB0cnVlKQorICAgICAgICBiTmVlZEVuY3J5cHRpb24gPSB0cnVlOwogCiAgICAgaWYgKHBEZXZpY2UtPmJFbmFibGVIb3N0V0VQKSB7CiAgICAgICAgIHBUcmFuc21pdEtleSA9ICZTVGVtcEtleTsKQEAgLTIyMjYsNyArMjIyOSw3IEBACiAgICAgfQogICAgIHZHZW5lcmF0ZUZJRk9IZWFkZXIocERldmljZSwgYnlQa3RUeXBlLCBwRGV2aWNlLT5wYnlUbXBCdWZmLCBiTmVlZEVuY3J5cHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBjYkZyYW1lQm9keVNpemUsIFRZUEVfVFhETUEwLCBwSGVhZFRELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBEZXZpY2UtPnNUeEV0aEhlYWRlciwgKFBCWVRFKXNrYi0+ZGF0YSwgcFRyYW5zbWl0S2V5LCB1Tm9kZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBEZXZpY2UtPnNUeEV0aEhlYWRlciwgKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEsIHBUcmFuc21pdEtleSwgdU5vZGVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICZ1TUFDZnJhZ051bSwKICAgICAgICAgICAgICAgICAgICAgICAgICZjYkhlYWRlclNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICk7CkBAIC0yMjM2LDcgKzIyMzksNyBAQAogICAgICAgICBNQUNiUFNXYWtldXAocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgfQogCi0gICAgcERldmljZS0+YlBXQml0T24gPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IGZhbHNlOwogCiAgICAgcExhc3RURCA9IHBIZWFkVEQ7CiAgICAgZm9yIChpaSA9IDA7IGlpIDwgdU1BQ2ZyYWdOdW07IGlpKyspIHsKQEAgLTIyNjAsNyArMjI2Myw3IEBACiAgICAgTUFDdlRyYW5zbWl0MChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKIAogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vVFlQRV9BQzBETUEgZGF0YSB0eApAQCAtMjI2OSwyNiArMjI3MiwyNiBAQAogCiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7CiAgICAgUFNUeERlc2MgICAgICAgIHBIZWFkVEQsIHBMYXN0VEQ7Ci0gICAgVUlOVCAgICAgICAgICAgIHVOb2RlSW5kZXggPSAwOwotICAgIEJZVEUgICAgICAgICAgICBieU1hc2tbOF0gPSB7MSwgMiwgNCwgOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci0gICAgV09SRCAgICAgICAgICAgIHdBSUQ7Ci0gICAgVUlOVCAgICAgICAgICAgIHVNQUNmcmFnTnVtID0gMTsKLSAgICBVSU5UICAgICAgICAgICAgY2JGcmFtZUJvZHlTaXplOwotICAgIEJZVEUgICAgICAgICAgICBieVBrdFR5cGU7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSGVhZGVyU2l6ZTsKLSAgICBCT09MICAgICAgICAgICAgYk5lZWRFbmNyeXB0aW9uID0gRkFMU0U7CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlNYXNrWzhdID0gezEsIDIsIDQsIDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworICAgIHVuc2lnbmVkIHNob3J0IHdBSUQ7CisgICAgdW5zaWduZWQgaW50IHVNQUNmcmFnTnVtID0gMTsKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUJvZHlTaXplOworICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlOworICAgIHVuc2lnbmVkIGludCBjYkhlYWRlclNpemU7CisgICAgYm9vbCBiTmVlZEVuY3J5cHRpb24gPSBmYWxzZTsKICAgICBQU0tleUl0ZW0gICAgICAgcFRyYW5zbWl0S2V5ID0gTlVMTDsKICAgICBTS2V5SXRlbSAgICAgICAgU1RlbXBLZXk7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOwotICAgIEJPT0wgICAgICAgICAgICBiVEtJUF9Vc2VHVEsgPSBGQUxTRTsKLSAgICBCT09MICAgICAgICAgICAgYk5lZWREZUF1dGggPSBGQUxTRTsKLSAgICBQQllURSAgICAgICAgICAgcGJ5QlNTSUQ7Ci0gICAgQk9PTCAgICAgICAgICAgIGJOb2RlRXhpc3QgPSBGQUxTRTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CisgICAgYm9vbCBiVEtJUF9Vc2VHVEsgPSBmYWxzZTsKKyAgICBib29sIGJOZWVkRGVBdXRoID0gZmFsc2U7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5QlNTSUQ7CisgICAgYm9vbCBiTm9kZUV4aXN0ID0gZmFsc2U7CiAKIAogCiAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgaWYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBGQUxTRSkgeworICAgIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gZmFsc2UpIHsKICAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMzA3LDkgKzIzMTAsOSBAQAogICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGlmIChJU19NVUxUSUNBU1RfQUREUkVTUygoUEJZVEUpKHNrYi0+ZGF0YSkpKSB7CisgICAgICAgIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcigodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGEpKSkgewogICAgICAgICAgICAgdU5vZGVJbmRleCA9IDA7Ci0gICAgICAgICAgICBiTm9kZUV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJOb2RlRXhpc3QgPSB0cnVlOwogICAgICAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbMF0uYlBTRW5hYmxlKSB7CiAgICAgICAgICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdLnNUeFBTUXVldWUpLCBza2IpOwogICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0ud0VuUXVldWVDbnQrKzsKQEAgLTIzMTksNyArMjMyMiw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiB9ZWxzZSB7Ci0gICAgICAgICAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgKFBCWVRFKShza2ItPmRhdGEpLCAmdU5vZGVJbmRleCkpIHsKKyAgICAgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCAodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGEpLCAmdU5vZGVJbmRleCkpIHsKICAgICAgICAgICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iUFNFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJnBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uc1R4UFNRdWV1ZSwgc2tiKTsKICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53RW5RdWV1ZUNudCsrOwpAQCAtMjMzOCwxMiArMjM0MSwxMiBAQAogICAgICAgICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlQcmVhbWJsZVR5cGUgPSBQUkVBTUJMRV9MT05HOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiTm9kZUV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiTm9kZUV4aXN0ID0gdHJ1ZTsKIAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGJOb2RlRXhpc3QgPT0gRkFMU0UpIHsKKyAgICAgICAgaWYgKGJOb2RlRXhpc3QgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0RFQlVHIlVua25vd24gU1RBIG5vdCBmb3VuZCBpbiBub2RlIERCIFxuIik7CiAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKQEAgLTIzNTYsNyArMjM1OSw3IEBACiAgICAgcEhlYWRURC0+bV90ZDFURDEuYnlUQ1IgPSAoVENSX0VEUHxUQ1JfU1RQKTsKIAogCi0gICAgbWVtY3B5KHBEZXZpY2UtPnNUeEV0aEhlYWRlci5hYnlEc3RBZGRyLCAoUEJZVEUpKHNrYi0+ZGF0YSksIEVUSF9ITEVOKTsKKyAgICBtZW1jcHkocERldmljZS0+c1R4RXRoSGVhZGVyLmFieURzdEFkZHIsICh1bnNpZ25lZCBjaGFyICopKHNrYi0+ZGF0YSksIEVUSF9ITEVOKTsKICAgICBjYkZyYW1lQm9keVNpemUgPSBza2ItPmxlbiAtIEVUSF9ITEVOOwogICAgIC8vIDgwMi4xSAogICAgIGlmIChudG9ocyhwRGV2aWNlLT5zVHhFdGhIZWFkZXIud1R5cGUpID4gRVRIX0RBVEFfTEVOKSB7CkBAIC0yMzY0LDE4ICsyMzY3LDE4IEBACiAgICAgfQogCiAKLSAgICBpZiAocERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPT0gVFJVRSkgewotICAgICAgICBiTmVlZEVuY3J5cHRpb24gPSBUUlVFOworICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9PSB0cnVlKSB7CisgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IHRydWU7CiAgICAgICAgIC8vIGdldCBUcmFuc21pdCBrZXkKICAgICAgICAgZG8gewogICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5wTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfU1RBKSAmJgogICAgICAgICAgICAgICAgIChwRGV2aWNlLT5wTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0FTU09DKSkgewogICAgICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QlNTSUQ7CiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBhaXJ3aXNlIGtleQotICAgICAgICAgICAgICAgIGlmIChLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIFBBSVJXSVNFX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBpZiAoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBQQUlSV0lTRV9LRVksICZwVHJhbnNtaXRLZXkpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBncm91cCBrZXkKLSAgICAgICAgICAgICAgICAgICAgaWYoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJUS0lQX1VzZUdUSyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgR1JPVVBfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiVEtJUF9Vc2VHVEsgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fREVCVUciR2V0IEdUSy5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTIzOTIsMTIgKzIzOTUsMTIgQEAKICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9ERUJVRyJcbiIpOwogCiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBhaXJ3aXNlIGtleQotICAgICAgICAgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgUEFJUldJU0VfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBUUlVFKQorICAgICAgICAgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgUEFJUldJU0VfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGdldCBncm91cCBrZXkKICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QnJvYWRjYXN0QWRkcjsKLSAgICAgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgR1JPVVBfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBGQUxTRSkgeworICAgICAgICAgICAgaWYoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgcFRyYW5zbWl0S2V5ID0gTlVMTDsKICAgICAgICAgICAgICAgICBpZiAocERldmljZS0+cE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpIHsKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fREVCVUciSUJTUyBhbmQgS0VZIGlzIE5VTEwuIFslZF1cbiIsIHBEZXZpY2UtPnBNZ210LT5lQ3Vyck1vZGUpOwpAQCAtMjQwNSwxNSArMjQwOCwxNSBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fREVCVUciTk9UIElCU1MgYW5kIEtFWSBpcyBOVUxMLiBbJWRdXG4iLCBwRGV2aWNlLT5wTWdtdC0+ZUN1cnJNb2RlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYlRLSVBfVXNlR1RLID0gVFJVRTsKKyAgICAgICAgICAgICAgICBiVEtJUF9Vc2VHVEsgPSB0cnVlOwogICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0RFQlVHIkdldCBHVEsuXG4iKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZShGQUxTRSk7CisgICAgICAgIH0gd2hpbGUoZmFsc2UpOwogICAgIH0KIAogICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9ERUJVRyJhY2RtYTA6IFNUQSBpbmRleCAlZFxuIiwgdU5vZGVJbmRleCk7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9PSB0cnVlKSB7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXkgPSAmU1RlbXBLZXk7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJ5Q2lwaGVyU3VpdGU7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmR3S2V5SW5kZXggPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3S2V5SW5kZXg7CkBAIC0yNDQzLDcgKzI0NDYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgYnlQa3RUeXBlID0gKEJZVEUpcERldmljZS0+YnlQYWNrZXRUeXBlOworICAgIGJ5UGt0VHlwZSA9ICh1bnNpZ25lZCBjaGFyKXBEZXZpY2UtPmJ5UGFja2V0VHlwZTsKIAogICAgIGlmIChwRGV2aWNlLT5iRml4UmF0ZSkgewogI2lmZGVmCVBMSUNFX0RFQlVHCkBAIC0yNDU0LDcgKzI0NTcsNyBAQAogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA+PSBSQVRFXzExTSkgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IFJBVEVfMTFNOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSAoV09SRClwRGV2aWNlLT51Q29ubmVjdGlvblJhdGU7CisgICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICgocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQSkgJiYKQEAgLTI0NjQsMTEgKzI0NjcsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAocERldmljZS0+dUNvbm5lY3Rpb25SYXRlID49IFJBVEVfNTRNKQogICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSBSQVRFXzU0TTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IChXT1JEKXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZTsKIAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHBEZXZpY2UtPmJ5QUNLUmF0ZSA9IChCWVRFKSBwRGV2aWNlLT53Q3VycmVudFJhdGU7CisgICAgICAgIHBEZXZpY2UtPmJ5QUNLUmF0ZSA9ICh1bnNpZ25lZCBjaGFyKSBwRGV2aWNlLT53Q3VycmVudFJhdGU7CiAgICAgICAgIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlID0gUkFURV8xTTsKICAgICAgICAgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlID0gUkFURV82TTsKICAgICB9CkBAIC0yNTIxLDcgKzI1MjQsNyBAQAogICAgIH0gZWxzZSBpZiAocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQSkgewogICAgICAgICBieVBrdFR5cGUgPSBQS19UWVBFXzExQTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAocERldmljZS0+YlByb3RlY3RNb2RlID09IFRSVUUpIHsKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJQcm90ZWN0TW9kZSA9PSB0cnVlKSB7CiAgICAgICAgICAgICBieVBrdFR5cGUgPSBQS19UWVBFXzExR0I7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieVBrdFR5cGUgPSBQS19UWVBFXzExR0E7CkBAIC0yNTMyLDI4ICsyNTM1LDI4IEBACiAvLwlwcmludGsoIkZJWCBSQVRFOkN1cnJlbnRSYXRlIGlzICVkIik7CiAvLyNlbmRpZgogCi0gICAgaWYgKGJOZWVkRW5jcnlwdGlvbiA9PSBUUlVFKSB7CisgICAgaWYgKGJOZWVkRW5jcnlwdGlvbiA9PSB0cnVlKSB7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8ibnRvaHMgUGt0IFR5cGU9JTA0eFxuIiwgbnRvaHMocERldmljZS0+c1R4RXRoSGVhZGVyLndUeXBlKSk7CiAgICAgICAgIGlmICgocERldmljZS0+c1R4RXRoSGVhZGVyLndUeXBlKSA9PSBUWVBFX1BLVF84MDJfMXgpIHsKLSAgICAgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IEZBTFNFOworICAgICAgICAgICAgYk5lZWRFbmNyeXB0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlBrdCBUeXBlPSUwNHhcbiIsIChwRGV2aWNlLT5zVHhFdGhIZWFkZXIud1R5cGUpKTsKICAgICAgICAgICAgIGlmICgocERldmljZS0+cE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX1NUQSkgJiYgKHBEZXZpY2UtPnBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfQVNTT0MpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBUcmFuc21pdEtleSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRG9uJ3QgRmluZCBUWCBLRVlcbiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJUS0lQX1VzZUdUSyA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiVEtJUF9Vc2VHVEsgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJlcnJvcjogS0VZIGlzIEdUSyEhfn5cbiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJGaW5kIFBUSyBbJWxYXVxuIiwgcFRyYW5zbWl0S2V5LT5kd0tleUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiTmVlZEVuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocERldmljZS0+YnlDbnRNZWFzdXJlID09IDIpIHsKLSAgICAgICAgICAgICAgICBiTmVlZERlQXV0aCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYk5lZWREZUF1dGggPSB0cnVlOwogICAgICAgICAgICAgICAgIHBEZXZpY2UtPnM4MDJfMTFDb3VudGVyLlRLSVBDb3VudGVyTWVhc3VyZXNJbnZva2VkKys7CiAgICAgICAgICAgICB9CiAKQEAgLTI1NjEsNyArMjU2NCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCh1Tm9kZUluZGV4ICE9IDApICYmCiAgICAgICAgICAgICAgICAgICAgIChwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3S2V5SW5kZXggJiBQQUlSV0lTRV9LRVkpKSB7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRmluZCBQVEsgWyVsWF1cbiIsIHBUcmFuc21pdEtleS0+ZHdLZXlJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI1ODQsNyArMjU4Nyw3IEBACiAjZW5kaWYKICAgICB2R2VuZXJhdGVGSUZPSGVhZGVyKHBEZXZpY2UsIGJ5UGt0VHlwZSwgcERldmljZS0+cGJ5VG1wQnVmZiwgYk5lZWRFbmNyeXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgY2JGcmFtZUJvZHlTaXplLCBUWVBFX0FDMERNQSwgcEhlYWRURCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwRGV2aWNlLT5zVHhFdGhIZWFkZXIsIChQQllURSlza2ItPmRhdGEsIHBUcmFuc21pdEtleSwgdU5vZGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwRGV2aWNlLT5zVHhFdGhIZWFkZXIsICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhLCBwVHJhbnNtaXRLZXksIHVOb2RlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAmdU1BQ2ZyYWdOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAmY2JIZWFkZXJTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICApOwpAQCAtMjU5Myw3ICsyNTk2LDcgQEAKICAgICAgICAgLy8gRGlzYWJsZSBQUwogICAgICAgICBNQUNiUFNXYWtldXAocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgfQotICAgIHBEZXZpY2UtPmJQV0JpdE9uID0gRkFMU0U7CisgICAgcERldmljZS0+YlBXQml0T24gPSBmYWxzZTsKIAogICAgIHBMYXN0VEQgPSBwSGVhZFREOwogICAgIGZvciAoaWkgPSAwOyBpaSA8IHVNQUNmcmFnTnVtOyBpaSsrKSB7CkBAIC0yNjMxLDExICsyNjM0LDExIEBACiAvLyNlbmRpZgogCiB7Ci0gICAgQllURSAgUHJvdG9jb2xfVmVyc2lvbjsgICAgLy84MDIuMXggQXV0aGVudGljYXRpb24KLSAgICBCWVRFICBQYWNrZXRfVHlwZTsgICAgICAgICAgIC8vODAyLjF4IEF1dGhlbnRpY2F0aW9uCi0gICAgQllURSAgRGVzY3JpcHRvcl90eXBlOwotICAgIFdPUkQgS2V5X2luZm87Ci1CT09MICAgICAgICAgICAgYlR4ZWFwb2xfa2V5ID0gRkFMU0U7CisgICAgdW5zaWduZWQgY2hhciBQcm90b2NvbF9WZXJzaW9uOyAgICAvLzgwMi4xeCBBdXRoZW50aWNhdGlvbgorICAgIHVuc2lnbmVkIGNoYXIgUGFja2V0X1R5cGU7ICAgICAgICAgICAvLzgwMi4xeCBBdXRoZW50aWNhdGlvbgorICAgIHVuc2lnbmVkIGNoYXIgRGVzY3JpcHRvcl90eXBlOworICAgIHVuc2lnbmVkIHNob3J0IEtleV9pbmZvOworYm9vbCBiVHhlYXBvbF9rZXkgPSBmYWxzZTsKICAgICBQcm90b2NvbF9WZXJzaW9uID0gc2tiLT5kYXRhW0VUSF9ITEVOXTsKICAgICBQYWNrZXRfVHlwZSA9IHNrYi0+ZGF0YVtFVEhfSExFTisxXTsKICAgICBEZXNjcmlwdG9yX3R5cGUgPSBza2ItPmRhdGFbRVRIX0hMRU4rMSsxKzJdOwpAQCAtMjY0MywxMSArMjY0NiwxMSBAQAogICAgaWYgKHBEZXZpY2UtPnNUeEV0aEhlYWRlci53VHlwZSA9PSBUWVBFX1BLVF84MDJfMXgpIHsKICAgICAgICAgICAgaWYoKChQcm90b2NvbF9WZXJzaW9uPT0xKSB8fChQcm90b2NvbF9WZXJzaW9uPT0yKSkgJiYKIAkgICAgICAgIChQYWNrZXRfVHlwZT09MykpIHsgIC8vODAyLjF4IE9SIGVhcG9sLWtleSBjaGFsbGVuZ2UgZnJhbWUgdHJhbnNmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGJUeGVhcG9sX2tleSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBiVHhlYXBvbF9rZXkgPSB0cnVlOwogCQlpZigoRGVzY3JpcHRvcl90eXBlPT0yNTQpfHwoRGVzY3JpcHRvcl90eXBlPT0yKSkgeyAgICAgICAvL1dQQSBvciBSU04KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShLZXlfaW5mbyAmIEJJVDMpICYmICAgLy9ncm91cC1rZXkgY2hhbGxlbmdlCiAJCQkgICAoS2V5X2luZm8gJiBCSVQ4KSAmJiAoS2V5X2luZm8gJiBCSVQ5KSkgeyAgICAvL3NlbmQgMi8yIGtleQotCQkJICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsKKwkJCSAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IHRydWU7CiAJCQkgIGlmKERlc2NyaXB0b3JfdHlwZT09MjU0KQogCQkJICAgICAgcHJpbnRrKCJXUEEgIik7CiAJCQkgIGVsc2UKQEAgLTI2NzQsMTMgKzI2NzcsMTMgQEAKICAgICBQU0RldmljZSAgICAgcERldmljZT0oUFNEZXZpY2UpIG5ldGRldl9wcml2KGRldik7CiAKICAgICBpbnQgICAgICAgICAgICAgbWF4X2NvdW50PTA7Ci0gICAgRFdPUkQgICAgICAgICAgIGR3TUlCQ291bnRlcj0wOworICAgIHVuc2lnbmVkIGxvbmcgZHdNSUJDb3VudGVyPTA7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgQllURSAgICAgICAgICAgIGJ5T3JnUGFnZVNlbD0wOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdQYWdlU2VsPTA7CiAgICAgaW50ICAgICAgICAgICAgIGhhbmRsZWQgPSAwOwotICAgIEJZVEUgICAgICAgICAgICBieURhdGEgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlEYXRhID0gMDsKICAgICBpbnQgICAgICAgICAgICAgaWk9IDA7Ci0vLyAgICBCWVRFICAgICAgICAgICAgYnlSU1NJOworLy8gICAgdW5zaWduZWQgY2hhciBieVJTU0k7CiAKIAogICAgIE1BQ3ZSZWFkSVNSKHBEZXZpY2UtPlBvcnRPZmZzZXQsICZwRGV2aWNlLT5kd0lzcik7CkBAIC0yNjk3LDcgKzI3MDAsNyBAQAogCiAgICAgCWlmICgocERldmljZS0+ZHdJc3IgJiBJU1JfUlhETUEwKSAmJgogICAgICAgICAocERldmljZS0+YnlMb2NhbElEICE9IFJFVl9JRF9WVDMyNTNfQjApICYmCi0gICAgICAgIChwRGV2aWNlLT5iQlNTSURGaWx0ZXIgPT0gVFJVRSkpIHsKKyAgICAgICAgKHBEZXZpY2UtPmJCU1NJREZpbHRlciA9PSB0cnVlKSkgewogICAgICAgICAvLyB1cGRhdGUgUlNTSQogICAgICAgICAvL0JCYlJlYWRFbWJlZGVkKHBEZXZpY2UtPlBvcnRPZmZzZXQsIDB4M0UsICZieVJTU0kpOwogICAgICAgICAvL3BEZXZpY2UtPnVDdXJyUlNTSSA9IGJ5UlNTSTsKQEAgLTI3NDYsOSArMjc0OSw5IEBACiAgICAgICAgICAgICAgICAgVk5TdkluUG9ydEQocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfTUFSNCwgJihwRGV2aWNlLT5kd09yZ01BUjQpKTsKICAgICAgICAgICAgICAgICBNQUN2U2VsZWN0UGFnZTAocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgICAgICAgICAvL3h4eHgKLSAgICAgICAgICAgICAgIC8vIFdDTURiRmx1c2hDb21tYW5kUXVldWUocERldmljZS0+cE1nbXQsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmIChDQVJEYlNldENoYW5uZWwocERldmljZSwgcERldmljZS0+cEN1cnJNZWFzdXJlRUlELT5zUmVxLmJ5Q2hhbm5lbCkgPT0gVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTWVhc3VyZUluUHJvZ3Jlc3MgPSBUUlVFOworICAgICAgICAgICAgICAgLy8gV0NNRGJGbHVzaENvbW1hbmRRdWV1ZShwRGV2aWNlLT5wTWdtdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNldF9jaGFubmVsKHBEZXZpY2UsIHBEZXZpY2UtPnBDdXJyTWVhc3VyZUVJRC0+c1JlcS5ieUNoYW5uZWwpID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Yk1lYXN1cmVJblByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTVNSQ1RMLCBNU1JDVExfUkVBRFkpOwogICAgICAgICAgICAgICAgICAgICBNQUN2U2VsZWN0UGFnZTAocERldmljZS0+UG9ydE9mZnNldCk7CkBAIC0yNzcwLDcgKzI3NzMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmR3SXNyICYgSVNSX01FQVNVUkVFTkQpIHsKICAgICAgICAgICAgICAgICAvLyA4MDIuMTFoIG1lYXN1cmUgZW5kCi0gICAgICAgICAgICAgICAgcERldmljZS0+Yk1lYXN1cmVJblByb2dyZXNzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcERldmljZS0+Yk1lYXN1cmVJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1JDUiwgcERldmljZS0+YnlPcmdSQ1IpOwogICAgICAgICAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICBWTlN2T3V0UG9ydEQocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfTUFSMCwgcERldmljZS0+ZHdPcmdNQVIwKTsKQEAgLTI3ODIsNyArMjc4NSw3IEBACiAgICAgICAgICAgICAgICAgLy8gY2xlYXIgbWVhc3VyZSBjb250cm9sCiAgICAgICAgICAgICAgICAgTUFDdlJlZ0JpdHNPZmYocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19NU1JDVEwsIE1TUkNUTF9FTik7CiAgICAgICAgICAgICAgICAgTUFDdlNlbGVjdFBhZ2UwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgICAgICAgICAgICAgIENBUkRiU2V0Q2hhbm5lbChwRGV2aWNlLCBwRGV2aWNlLT5ieU9yZ0NoYW5uZWwpOworICAgICAgICAgICAgICAgIHNldF9jaGFubmVsKHBEZXZpY2UsIHBEZXZpY2UtPmJ5T3JnQ2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgLy8gV0NNRGJSZXNldENvbW1hbmRRdWV1ZShwRGV2aWNlLT5wTWdtdCk7CiAgICAgICAgICAgICAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIE1BQ3ZSZWdCaXRzT24ocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19NU1JDVEwrMSwgTVNSQ1RMMV9UWFBBVVNFKTsKQEAgLTI3OTgsMjYgKzI4MDEsMjYgQEAKICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5kd0lzciAmIElTUl9RVUlFVFNUQVJUKSB7CiAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoQ0FSRGJTdGFydFF1aWV0KHBEZXZpY2UpID09IEZBTFNFKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChDQVJEYlN0YXJ0UXVpZXQocERldmljZSkgPT0gZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHBEZXZpY2UtPmR3SXNyICYgSVNSX1RCVFQpIHsKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlRmlyc3RRdWlldCA9PSBUUlVFKSB7CisgICAgICAgICAgICBpZiAocERldmljZS0+YkVuYWJsZUZpcnN0UXVpZXQgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5UXVpZXRTdGFydENvdW50LS07CiAgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJ5UXVpZXRTdGFydENvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUZpcnN0UXVpZXQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUZpcnN0UXVpZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTVNSQ1RMLCAoTVNSQ1RMX1FVSUVUVFhDSEsgfCBNU1JDVExfUVVJRVRFTikpOwogICAgICAgICAgICAgICAgICAgICBNQUN2U2VsZWN0UGFnZTAocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5iQ2hhbm5lbFN3aXRjaCA9PSBUUlVFKSAmJgorICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5iQ2hhbm5lbFN3aXRjaCA9PSB0cnVlKSAmJgogICAgICAgICAgICAgICAgIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfSU5GUkFTVFJVQ1RVUkUpKSB7CiAgICAgICAgICAgICAgICAgcERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQtLTsKICAgICAgICAgICAgICAgICBpZiAocERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5iQ2hhbm5lbFN3aXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBDQVJEYlNldENoYW5uZWwocERldmljZSwgcERldmljZS0+YnlOZXdDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkNoYW5uZWxTd2l0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2V0X2NoYW5uZWwocERldmljZSwgcERldmljZS0+YnlOZXdDaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgVk5UV0lGSWJDaGFubmVsU3dpdGNoKHBEZXZpY2UtPnBNZ210LCBwRGV2aWNlLT5ieU5ld0NoYW5uZWwpOwogICAgICAgICAgICAgICAgICAgICBNQUN2U2VsZWN0UGFnZTEocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgIE1BQ3ZSZWdCaXRzT24ocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19NU1JDVEwrMSwgTVNSQ1RMMV9UWFBBVVNFKTsKQEAgLTI4MjcsMTIgKzI4MzAsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DKSB7Ci0gICAgICAgICAgICAgICAgLy9wRGV2aWNlLT5iQmVhY29uU2VudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIC8vcERldmljZS0+YkJlYWNvblNlbnQgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5iVXBkYXRlQkJWR0EpICYmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gVFJVRSkgJiYgKHBEZXZpY2UtPnVDdXJyUlNTSSAhPSAwKSkgewotICAgICAgICAgICAgICAgICAgICBMT05HICAgICAgICAgICAgbGRCbTsKKyAgICAgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJVcGRhdGVCQlZHQSkgJiYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSAmJiAocERldmljZS0+dUN1cnJSU1NJICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBsZEJtOwogCi0gICAgICAgICAgICAgICAgICAgIFJGdlJTU0lUb2RCbShwRGV2aWNlLCAoQllURSkgcERldmljZS0+dUN1cnJSU1NJLCAmbGRCbSk7CisgICAgICAgICAgICAgICAgICAgIFJGdlJTU0lUb2RCbShwRGV2aWNlLCAodW5zaWduZWQgY2hhcikgcERldmljZS0+dUN1cnJSU1NJLCAmbGRCbSk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaWk9MDtpaTxCQl9WR0FfTEVWRUw7aWkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxkQm0gPCBwRGV2aWNlLT5sZEJtVGhyZXNob2xkW2lpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5QkJWR0FOZXcgPSBwRGV2aWNlLT5hYnlCQlZHQVtpaV07CkBAIC0yODU4LDcgKzI4NjEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcERldmljZS0+YkJlYWNvblNlbnQgPSBGQUxTRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJCZWFjb25TZW50ID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAocERldmljZS0+YkVuYWJsZVBTTW9kZSkgewogICAgICAgICAgICAgICAgIFBTYklzTmV4dFRCVFRXYWtlVXAoKHZvaWQgKilwRGV2aWNlKTsKICAgICAgICAgICAgIH07CkBAIC0yODc5LDMxICsyODgyLDMxIEBACiAgICAgICAgIGlmIChwRGV2aWNlLT5kd0lzciAmIElTUl9CTlRYKSB7CiAKICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQURIT0MpIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5iSXNCZWFjb25CdWZSZWFkeVNldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJJc0JlYWNvbkJ1ZlJlYWR5U2V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcERldmljZS0+Y2JCZWFjb25CdWZSZWFkeVNldENudCA9IDA7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSB7CiAgICAgICAgICAgICAgICAgaWYocE1nbXQtPmJ5RFRJTUNvdW50ID4gMCkgewogICAgICAgICAgICAgICAgICAgIHBNZ210LT5ieURUSU1Db3VudCAtLTsKLSAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJSeFBTUG9sbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYlJ4UFNQb2xsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZihwTWdtdC0+YnlEVElNQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbXV0bHRjYXN0IHR4IGJ1ZmZlcnJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5ieURUSU1Db3VudCA9IHBNZ210LT5ieURUSU1QZXJpb2QgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUnhQU1BvbGwgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUnhQU1BvbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKXBEZXZpY2UsIFdMQU5fQ01EX1JYX1BTUE9MTCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGV2aWNlLT5iQmVhY29uU2VudCA9IFRSVUU7CisgICAgICAgICAgICBwRGV2aWNlLT5iQmVhY29uU2VudCA9IHRydWU7CiAKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iQ2hhbm5lbFN3aXRjaCA9PSBUUlVFKSB7CisgICAgICAgICAgICBpZiAocERldmljZS0+YkNoYW5uZWxTd2l0Y2ggPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5Q2hhbm5lbFN3aXRjaENvdW50LS07CiAgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJ5Q2hhbm5lbFN3aXRjaENvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkNoYW5uZWxTd2l0Y2ggPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgQ0FSRGJTZXRDaGFubmVsKHBEZXZpY2UsIHBEZXZpY2UtPmJ5TmV3Q2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJDaGFubmVsU3dpdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNldF9jaGFubmVsKHBEZXZpY2UsIHBEZXZpY2UtPmJ5TmV3Q2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgIFZOVFdJRkliQ2hhbm5lbFN3aXRjaChwRGV2aWNlLT5wTWdtdCwgcERldmljZS0+YnlOZXdDaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgTUFDdlNlbGVjdFBhZ2UxKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTVNSQ1RMKzEsIE1TUkNUTDFfVFhQQVVTRSk7CkBAIC0yOTc4LDkgKzI5ODEsMTAgQEAKIH0KIAogLy8yMDA4LTgtNCA8YWRkPiBieSBjaGVzdGVyCi1zdGF0aWMgaW50IENvbmZpZ19GaWxlR2V0UGFyYW1ldGVyKFVDSEFSICpzdHJpbmcsIFVDSEFSICpkZXN0LFVDSEFSICpzb3VyY2UpCitzdGF0aWMgaW50IENvbmZpZ19GaWxlR2V0UGFyYW1ldGVyKHVuc2lnbmVkIGNoYXIgKnN0cmluZywKKwkJdW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciAqc291cmNlKQogewotICBVQ0hBUiBidWYxWzEwMF07CisgIHVuc2lnbmVkIGNoYXIgYnVmMVsxMDBdOwogICBpbnQgc291cmNlX2xlbiA9IHN0cmxlbihzb3VyY2UpOwogCiAgICAgbWVtc2V0KGJ1ZjEsMCwxMDApOwpAQCAtMjk4OSwxMyArMjk5MywxMyBAQAogICAgIHNvdXJjZSs9c3RybGVuKGJ1ZjEpOwogCiAgICBtZW1jcHkoZGVzdCxzb3VyY2Usc291cmNlX2xlbi1zdHJsZW4oYnVmMSkpOwotIHJldHVybiBUUlVFOworIHJldHVybiB0cnVlOwogfQogCi1pbnQgQ29uZmlnX0ZpbGVPcGVyYXRpb24oUFNEZXZpY2UgcERldmljZSxCT09MIGZ3cml0ZSx1bnNpZ25lZCBjaGFyICpQYXJhbWV0ZXIpIHsKLSAgICBVQ0hBUiAgICAqY29uZmlnX3BhdGg9Q09ORklHX1BBVEg7Ci0gICAgVUNIQVIgICAgKmJ1ZmZlcj1OVUxMOwotICAgIFVDSEFSICAgICAgdG1wYnVmZmVyWzIwXTsKK2ludCBDb25maWdfRmlsZU9wZXJhdGlvbihQU0RldmljZSBwRGV2aWNlLGJvb2wgZndyaXRlLHVuc2lnbmVkIGNoYXIgKlBhcmFtZXRlcikgeworICAgIHVuc2lnbmVkIGNoYXIgKmNvbmZpZ19wYXRoID0gQ09ORklHX1BBVEg7CisgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyIHRtcGJ1ZmZlclsyMF07CiAgICAgc3RydWN0IGZpbGUgICAqZmlscD1OVUxMOwogICAgIG1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKICAgICAvL2ludCBvbGRmc3VpZD0wLG9sZGZzZ2lkPTA7CkBAIC0zMDM4LDcgKzMwNDIsNyBAQAogIGdvdG8gZXJyb3IxOwogfQogCi1pZihDb25maWdfRmlsZUdldFBhcmFtZXRlcigiWk9ORVRZUEUiLHRtcGJ1ZmZlcixidWZmZXIpIT1UUlVFKSB7CitpZihDb25maWdfRmlsZUdldFBhcmFtZXRlcigiWk9ORVRZUEUiLHRtcGJ1ZmZlcixidWZmZXIpIT10cnVlKSB7CiAgIHByaW50aygiZ2V0IHBhcmFtZXRlciBlcnJvcj9cbiIpOwogICByZXN1bHQgPSAtMTsKICAgZ290byBlcnJvcjE7CkBAIC0zNTU1LDE5ICszNTU5LDE5IEBACiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkNvbW1pdCB0aGUgc2V0dGluZ3NcbiIpOwogICAgICAgICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogICAgICAgICAgICBtZW1zZXQocE1nbXQtPmFieUN1cnJCU1NJRCwgMCwgNik7CiAgICAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwogICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAJI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKIAkgICAgICBwTWdtdC0+ZVNjYW5UeXBlID0gV01BQ19TQ0FOX0FDVElWRTsKLQkgaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCAhPVRSVUUpCisJIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgIT10cnVlKQogCSAjZW5kaWYKICAgICAgICAgICAgYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLCBXTEFOX0NNRF9CU1NJRF9TQ0FOLCBwTWdtdC0+YWJ5RGVzaXJlU1NJRCk7CiAgICAgICAgICAgIGJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwgV0xBTl9DTURfU1NJRCwgTlVMTCk7CiAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgICAgICB9Ci0gICAgICBwRGV2aWNlLT5iQ29tbWl0ID0gRkFMU0U7CisgICAgICBwRGV2aWNlLT5iQ29tbWl0ID0gZmFsc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHJjOwpAQCAtMzU5OCwyMCArMzYwMiwyMCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZXZpY2VfaWRfdGFibGUpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZ0NjY1NV9wY2lfaWRfdGFibGUpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGV2aWNlX2RyaXZlciA9IHsKICAgICAgICAgbmFtZTogICAgICAgREVWSUNFX05BTUUsCi0gICAgICAgIGlkX3RhYmxlOiAgIGRldmljZV9pZF90YWJsZSwKLSAgICAgICAgcHJvYmU6ICAgICAgZGV2aWNlX2ZvdW5kMSwKLSAgICAgICAgcmVtb3ZlOiAgICAgZGV2aWNlX3JlbW92ZTEsCisgICAgICAgIGlkX3RhYmxlOiAgIHZ0NjY1NV9wY2lfaWRfdGFibGUsCisgICAgICAgIHByb2JlOiAgICAgIHZ0NjY1NV9wcm9iZSwKKyAgICAgICAgcmVtb3ZlOiAgICAgdnQ2NjU1X3JlbW92ZSwKICNpZmRlZiBDT05GSUdfUE0KICAgICAgICAgc3VzcGVuZDogICAgdmlhd2dldF9zdXNwZW5kLAogICAgICAgICByZXN1bWU6ICAgICB2aWF3Z2V0X3Jlc3VtZSwKICNlbmRpZgogfTsKIAotc3RhdGljIGludCBfX2luaXQgZGV2aWNlX2luaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB2dDY2NTVfaW5pdF9tb2R1bGUodm9pZCkKIHsKICAgICBpbnQgcmV0OwogCkBAIC0zNjI3LDcgKzM2MzEsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkZXZpY2VfY2xlYW51cF9tb2R1bGUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCB2dDY2NTVfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAogCkBAIC0zNjM4LDggKzM2NDIsOCBAQAogCiB9CiAKLW1vZHVsZV9pbml0KGRldmljZV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChkZXZpY2VfY2xlYW51cF9tb2R1bGUpOworbW9kdWxlX2luaXQodnQ2NjU1X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHZ0NjY1NV9jbGVhbnVwX21vZHVsZSk7CiAKIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMzY1MSw3ICszNjU1LDcgQEAKICAgICBjYXNlIFNZU19ET1dOOgogICAgIGNhc2UgU1lTX0hBTFQ6CiAgICAgY2FzZSBTWVNfUE9XRVJfT0ZGOgotICAgICAgICB3aGlsZSAoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgewogICAgICAgICAgICAgaWYocGNpX2Rldl9kcml2ZXIocGRldikgPT0gJmRldmljZV9kcml2ZXIpIHsKICAgICAgICAgICAgICAgICBpZiAocGNpX2dldF9kcnZkYXRhKHBkZXYpKQogICAgICAgICAgICAgICAgICAgICB2aWF3Z2V0X3N1c3BlbmQocGRldiwgUE1TR19ISUJFUk5BVEUpOwpAQCAtMzY3NywxMCArMzY4MSwxMCBAQAogICAgIHBEZXZpY2UtPmNiRnJlZUNtZFF1ZXVlID0gQ01EX1FfU0laRTsKICAgICBwRGV2aWNlLT51Q21kRGVxdWV1ZUlkeCA9IDA7CiAgICAgcERldmljZS0+dUNtZEVucXVldWVJZHggPSAwOwotICAgIHBEZXZpY2UtPmJDbWRSdW5uaW5nID0gRkFMU0U7CisgICAgcERldmljZS0+YkNtZFJ1bm5pbmcgPSBmYWxzZTsKICAgICBNQUNiU2h1dGRvd24ocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgTUFDdlNhdmVDb250ZXh0KHBEZXZpY2UtPlBvcnRPZmZzZXQsIHBEZXZpY2UtPmFieU1hY0NvbnRleHQpOwotICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IEZBTFNFOworICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogICAgIG1lbXNldChwTWdtdC0+YWJ5Q3VyckJTU0lELCAwLCA2KTsKICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGNpZCk7CkBAIC0zNzA0LDkgKzM3MDgsOSBAQAogICAgICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgTUFDdlJlc3RvcmVDb250ZXh0KHBEZXZpY2UtPlBvcnRPZmZzZXQsIHBEZXZpY2UtPmFieU1hY0NvbnRleHQpOwogICAgICAgICBkZXZpY2VfaW5pdF9yZWdpc3RlcnMocERldmljZSwgREVWSUNFX0lOSVRfRFhQTCk7Ci0gICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPT0gVFJVRSkgeyAvLyBBc3NvYyB3aXRoIEJTUwotICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gRkFMU0U7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBGQUxTRTsKKyAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbMF0uYkFjdGl2ZSA9PSB0cnVlKSB7IC8vIEFzc29jIHdpdGggQlNTCisgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogICAgICAgICAgICAgaWYocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpIHsKICAgICAgICAgICAgICAgICAvLyBJbiBBZGhvYywgQlNTIHN0YXRlIHNldCBiYWNrIHRvIHN0YXJ0ZWQuCiAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX1NUQVJURUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYwppbmRleCA2Yjc1OGE4Li4xNTEzMDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKQEAgLTY2LDcgKzY2LDcgQEAKIC8vc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CiAKLWNvbnN0IEJZVEUgYWNieVJ4UmF0ZVtNQVhfUkFURV0gPQorY29uc3QgdW5zaWduZWQgY2hhciBhY2J5UnhSYXRlW01BWF9SQVRFXSA9CiB7MiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4fTsKIAogCkBAIC03Niw3MCArNzYsNjAgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIEJZVEUgc19ieUdldFJhdGVJZHgoQllURSBieVJhdGUpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgc19ieUdldFJhdGVJZHgodW5zaWduZWQgY2hhciBieVJhdGUpOwogCiAKLXN0YXRpYwotdm9pZAotc192R2V0REFTQSgKLSAgICBQQllURSBwYnlSeEJ1ZmZlckFkZHIsCi0gICAgUFVJTlQgcGNiSGVhZGVyU2l6ZSwKLSAgICBQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyCi0gICAgKTsKK3N0YXRpYyB2b2lkCitzX3ZHZXREQVNBKHVuc2lnbmVkIGNoYXIgKnBieVJ4QnVmZmVyQWRkciwgdW5zaWduZWQgaW50ICpwY2JIZWFkZXJTaXplLAorCQlQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyKTsKIAotc3RhdGljCi12b2lkCi1zX3ZQcm9jZXNzUnhNQUNIZWFkZXIgKAorc3RhdGljIHZvaWQKK3NfdlByb2Nlc3NSeE1BQ0hlYWRlcihQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBjaGFyICpwYnlSeEJ1ZmZlckFkZHIsCisJCXVuc2lnbmVkIGludCBjYlBhY2tldFNpemUsIGJvb2wgYklzV0VQLCBib29sIGJFeHRJViwKKwkJdW5zaWduZWQgaW50ICpwY2JIZWFkU2l6ZSk7CisKK3N0YXRpYyBib29sIHNfYkFQTW9kZVJ4Q3RsKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgUEJZVEUgcGJ5UnhCdWZmZXJBZGRyLAotICAgIFVJTlQgY2JQYWNrZXRTaXplLAotICAgIEJPT0wgYklzV0VQLAotICAgIEJPT0wgYkV4dElWLAotICAgIFBVSU5UIHBjYkhlYWRTaXplCi0gICAgKTsKLQotc3RhdGljIEJPT0wgc19iQVBNb2RlUnhDdGwoCi0gICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBQQllURSAgICBwYnlGcmFtZSwKLSAgICBJTlQgICAgICBpU0FOb2RlSW5kZXgKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlGcmFtZSwKKyAgICBpbnQgICAgICBpU0FOb2RlSW5kZXgKICAgICApOwogCiAKIAotc3RhdGljIEJPT0wgc19iQVBNb2RlUnhEYXRhICgKK3N0YXRpYyBib29sIHNfYkFQTW9kZVJ4RGF0YSAoCiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBzdHJ1Y3Qgc2tfYnVmZiogc2tiLAotICAgIFVJTlQgICAgIEZyYW1lU2l6ZSwKLSAgICBVSU5UICAgICBjYkhlYWRlck9mZnNldCwKLSAgICBJTlQgICAgICBpU0FOb2RlSW5kZXgsCi0gICAgSU5UICAgICAgaURBTm9kZUluZGV4CisgICAgdW5zaWduZWQgaW50IEZyYW1lU2l6ZSwKKyAgICB1bnNpZ25lZCBpbnQgY2JIZWFkZXJPZmZzZXQsCisgICAgaW50ICAgICAgaVNBTm9kZUluZGV4LAorICAgIGludCAgICAgIGlEQU5vZGVJbmRleAogICAgICk7CiAKIAotc3RhdGljIEJPT0wgc19iSGFuZGxlUnhFbmNyeXB0aW9uKAorc3RhdGljIGJvb2wgc19iSGFuZGxlUnhFbmNyeXB0aW9uKAogICAgIFBTRGV2aWNlICAgICBwRGV2aWNlLAotICAgIFBCWVRFICAgICAgICBwYnlGcmFtZSwKLSAgICBVSU5UICAgICAgICAgRnJhbWVTaXplLAotICAgIFBCWVRFICAgICAgICBwYnlSc3IsCi0gICAgUEJZVEUgICAgICAgcGJ5TmV3UnNyLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUZyYW1lLAorICAgIHVuc2lnbmVkIGludCBGcmFtZVNpemUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5UnNyLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieU5ld1JzciwKICAgICBQU0tleUl0ZW0gICAqcEtleU91dCwKLSAgICBpbnQgKiAgICAgICBwYkV4dElWLAotICAgIFBXT1JEICAgICAgIHB3UnhUU0MxNV8wLAotICAgIFBEV09SRCAgICAgIHBkd1J4VFNDNDdfMTYKKyAgICBib29sICpwYkV4dElWLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd1J4VFNDMTVfMCwKKyAgICB1bnNpZ25lZCBsb25nICpwZHdSeFRTQzQ3XzE2CiAgICAgKTsKIAotc3RhdGljIEJPT0wgc19iSG9zdFdlcFJ4RW5jcnlwdGlvbigKK3N0YXRpYyBib29sIHNfYkhvc3RXZXBSeEVuY3J5cHRpb24oCiAKICAgICBQU0RldmljZSAgICAgcERldmljZSwKLSAgICBQQllURSAgICAgICAgcGJ5RnJhbWUsCi0gICAgVUlOVCAgICAgICAgIEZyYW1lU2l6ZSwKLSAgICBQQllURSAgICAgICAgcGJ5UnNyLAotICAgIEJPT0wgICAgICAgICBiT25GbHksCisgICAgdW5zaWduZWQgY2hhciAqcGJ5RnJhbWUsCisgICAgdW5zaWduZWQgaW50IEZyYW1lU2l6ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlSc3IsCisgICAgYm9vbCBiT25GbHksCiAgICAgUFNLZXlJdGVtICAgIHBLZXksCi0gICAgUEJZVEUgICAgICAgcGJ5TmV3UnNyLAotICAgIGludCAqICAgICAgIHBiRXh0SVYsCi0gICAgUFdPUkQgICAgICAgcHdSeFRTQzE1XzAsCi0gICAgUERXT1JEICAgICAgcGR3UnhUU0M0N18xNgorICAgIHVuc2lnbmVkIGNoYXIgKnBieU5ld1JzciwKKyAgICBib29sICpwYkV4dElWLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd1J4VFNDMTVfMCwKKyAgICB1bnNpZ25lZCBsb25nICpwZHdSeFRTQzQ3XzE2CiAKICAgICApOwogCkBAIC0xNjIsMjcgKzE1MiwyMSBAQAogICogUmV0dXJuIFZhbHVlOiBOb25lCiAgKgogLSovCi1zdGF0aWMKLXZvaWQKLXNfdlByb2Nlc3NSeE1BQ0hlYWRlciAoCi0gICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBQQllURSBwYnlSeEJ1ZmZlckFkZHIsCi0gICAgVUlOVCBjYlBhY2tldFNpemUsCi0gICAgQk9PTCBiSXNXRVAsCi0gICAgQk9PTCBiRXh0SVYsCi0gICAgUFVJTlQgcGNiSGVhZFNpemUKLSAgICApCitzdGF0aWMgdm9pZAorc192UHJvY2Vzc1J4TUFDSGVhZGVyKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGNoYXIgKnBieVJ4QnVmZmVyQWRkciwKKwkJdW5zaWduZWQgaW50IGNiUGFja2V0U2l6ZSwgYm9vbCBiSXNXRVAsIGJvb2wgYkV4dElWLAorCQl1bnNpZ25lZCBpbnQgKnBjYkhlYWRTaXplKQogewotICAgIFBCWVRFICAgICAgICAgICBwYnlSeEJ1ZmZlcjsKLSAgICBVSU5UICAgICAgICAgICAgY2JIZWFkZXJTaXplID0gMDsKLSAgICBQV09SRCAgICAgICAgICAgcHdUeXBlOworICAgIHVuc2lnbmVkIGNoYXIgKnBieVJ4QnVmZmVyOworICAgIHVuc2lnbmVkIGludCBjYkhlYWRlclNpemUgPSAwOworICAgIHVuc2lnbmVkIHNob3J0ICpwd1R5cGU7CiAgICAgUFM4MDJfMTFIZWFkZXIgIHBNQUNIZWFkZXI7CiAgICAgaW50ICAgICAgICAgICAgIGlpOwogCiAKICAgICBwTUFDSGVhZGVyID0gKFBTODAyXzExSGVhZGVyKSAocGJ5UnhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKIAotICAgIHNfdkdldERBU0EoKFBCWVRFKXBNQUNIZWFkZXIsICZjYkhlYWRlclNpemUsICZwRGV2aWNlLT5zUnhFdGhIZWFkZXIpOworICAgIHNfdkdldERBU0EoKHVuc2lnbmVkIGNoYXIgKilwTUFDSGVhZGVyLCAmY2JIZWFkZXJTaXplLCAmcERldmljZS0+c1J4RXRoSGVhZGVyKTsKIAogICAgIGlmIChiSXNXRVApIHsKICAgICAgICAgaWYgKGJFeHRJVikgewpAQCAtMTk3LDE4ICsxODEsMTggQEAKICAgICAgICAgY2JIZWFkZXJTaXplICs9IFdMQU5fSERSX0FERFIzX0xFTjsKICAgICB9OwogCi0gICAgcGJ5UnhCdWZmZXIgPSAoUEJZVEUpIChwYnlSeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUpOwotICAgIGlmIChJU19FVEhfQUREUkVTU19FUVVBTChwYnlSeEJ1ZmZlciwgJnBEZXZpY2UtPmFieVNOQVBfQnJpZGdldHVubmVsWzBdKSkgeworICAgIHBieVJ4QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgKHBieVJ4QnVmZmVyQWRkciArIGNiSGVhZGVyU2l6ZSk7CisgICAgaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIocGJ5UnhCdWZmZXIsICZwRGV2aWNlLT5hYnlTTkFQX0JyaWRnZXR1bm5lbFswXSkpIHsKICAgICAgICAgY2JIZWFkZXJTaXplICs9IDY7CiAgICAgfQotICAgIGVsc2UgaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMKHBieVJ4QnVmZmVyLCAmcERldmljZS0+YWJ5U05BUF9SRkMxMDQyWzBdKSkgeworICAgIGVsc2UgaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIocGJ5UnhCdWZmZXIsICZwRGV2aWNlLT5hYnlTTkFQX1JGQzEwNDJbMF0pKSB7CiAgICAgICAgIGNiSGVhZGVyU2l6ZSArPSA2OwotICAgICAgICBwd1R5cGUgPSAoUFdPUkQpIChwYnlSeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUpOworICAgICAgICBwd1R5cGUgPSAodW5zaWduZWQgc2hvcnQgKikgKHBieVJ4QnVmZmVyQWRkciArIGNiSGVhZGVyU2l6ZSk7CiAgICAgICAgIGlmICgoKnB3VHlwZSE9IFRZUEVfUEtUX0lQWCkgJiYgKCpwd1R5cGUgIT0gY3B1X3RvX2xlMTYoMHhGMzgwKSkpIHsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGNiSGVhZGVyU2l6ZSAtPSA4OwotICAgICAgICAgICAgcHdUeXBlID0gKFBXT1JEKSAocGJ5UnhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIHB3VHlwZSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAocGJ5UnhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKICAgICAgICAgICAgIGlmIChiSXNXRVApIHsKICAgICAgICAgICAgICAgICBpZiAoYkV4dElWKSB7CiAgICAgICAgICAgICAgICAgICAgICpwd1R5cGUgPSBodG9ucyhjYlBhY2tldFNpemUgLSBXTEFOX0hEUl9BRERSM19MRU4gLSA4KTsgICAgLy8gOCBpcyBJViZFeHRJVgpAQCAtMjIzLDcgKzIwNyw3IEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBjYkhlYWRlclNpemUgLT0gMjsKLSAgICAgICAgcHdUeXBlID0gKFBXT1JEKSAocGJ5UnhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKKyAgICAgICAgcHdUeXBlID0gKHVuc2lnbmVkIHNob3J0ICopIChwYnlSeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUpOwogICAgICAgICBpZiAoYklzV0VQKSB7CiAgICAgICAgICAgICBpZiAoYkV4dElWKSB7CiAgICAgICAgICAgICAgICAgKnB3VHlwZSA9IGh0b25zKGNiUGFja2V0U2l6ZSAtIFdMQU5fSERSX0FERFIzX0xFTiAtIDgpOyAgICAvLyA4IGlzIElWJkV4dElWCkBAIC0yMzcsNyArMjIxLDcgQEAKICAgICB9CiAKICAgICBjYkhlYWRlclNpemUgLT0gKEVUSF9BTEVOICogMik7Ci0gICAgcGJ5UnhCdWZmZXIgPSAoUEJZVEUpIChwYnlSeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUpOworICAgIHBieVJ4QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgKHBieVJ4QnVmZmVyQWRkciArIGNiSGVhZGVyU2l6ZSk7CiAgICAgZm9yKGlpPTA7aWk8RVRIX0FMRU47aWkrKykKICAgICAgICAgKnBieVJ4QnVmZmVyKysgPSBwRGV2aWNlLT5zUnhFdGhIZWFkZXIuYWJ5RHN0QWRkcltpaV07CiAgICAgZm9yKGlpPTA7aWk8RVRIX0FMRU47aWkrKykKQEAgLTI0OSw5ICsyMzMsOSBAQAogCiAKIAotc3RhdGljIEJZVEUgc19ieUdldFJhdGVJZHggKEJZVEUgYnlSYXRlKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgc19ieUdldFJhdGVJZHggKHVuc2lnbmVkIGNoYXIgYnlSYXRlKQogewotICAgIEJZVEUgICAgYnlSYXRlSWR4OworICAgIHVuc2lnbmVkIGNoYXIgYnlSYXRlSWR4OwogCiAgICAgZm9yIChieVJhdGVJZHggPSAwOyBieVJhdGVJZHggPE1BWF9SQVRFIDsgYnlSYXRlSWR4KyspIHsKICAgICAgICAgaWYgKGFjYnlSeFJhdGVbYnlSYXRlSWR4JU1BWF9SQVRFXSA9PSBieVJhdGUpCkBAIC0yNjEsMTUgKzI0NSwxMSBAQAogfQogCiAKLXN0YXRpYwotdm9pZAotc192R2V0REFTQSAoCi0gICAgUEJZVEUgcGJ5UnhCdWZmZXJBZGRyLAotICAgIFBVSU5UIHBjYkhlYWRlclNpemUsCi0gICAgUFNFdGhlcm5ldEhlYWRlciBwc0V0aEhlYWRlcgotICAgICkKK3N0YXRpYyB2b2lkCitzX3ZHZXREQVNBKHVuc2lnbmVkIGNoYXIgKnBieVJ4QnVmZmVyQWRkciwgdW5zaWduZWQgaW50ICpwY2JIZWFkZXJTaXplLAorCVBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIpCiB7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSGVhZGVyU2l6ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiSGVhZGVyU2l6ZSA9IDA7CiAgICAgUFM4MDJfMTFIZWFkZXIgIHBNQUNIZWFkZXI7CiAgICAgaW50ICAgICAgICAgICAgIGlpOwogCkBAIC0zMzMsNyArMzEzLDcgQEAKIAogCiAKLUJPT0wKK2Jvb2wKIGRldmljZV9yZWNlaXZlX2ZyYW1lICgKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTUnhEZXNjIHBDdXJyUkQKQEAgLTM0OSwzNiArMzI5LDM2IEBACiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7CiAgICAgUFNSeE1nbXRQYWNrZXQgIHBSeFBhY2tldCA9ICYocERldmljZS0+cE1nbXQtPnNSeFBhY2tldCk7CiAgICAgUFM4MDJfMTFIZWFkZXIgIHA4MDJfMTFIZWFkZXI7Ci0gICAgUEJZVEUgICAgICAgICAgIHBieVJzcjsKLSAgICBQQllURSAgICAgICAgICAgcGJ5TmV3UnNyOwotICAgIFBCWVRFICAgICAgICAgICBwYnlSU1NJOworICAgIHVuc2lnbmVkIGNoYXIgKnBieVJzcjsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlOZXdSc3I7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5UlNTSTsKICAgICBQUVdPUkQgICAgICAgICAgcHF3VFNGVGltZTsKLSAgICBQV09SRCAgICAgICAgICAgcHdGcmFtZVNpemU7Ci0gICAgUEJZVEUgICAgICAgICAgIHBieUZyYW1lOwotICAgIEJPT0wgICAgICAgICAgICBiRGVGcmFnUnggPSBGQUxTRTsKLSAgICBCT09MICAgICAgICAgICAgYklzV0VQID0gRkFMU0U7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSGVhZGVyT2Zmc2V0OwotICAgIFVJTlQgICAgICAgICAgICBGcmFtZVNpemU7Ci0gICAgV09SRCAgICAgICAgICAgIHdFdGhlclR5cGUgPSAwOwotICAgIElOVCAgICAgICAgICAgICBpU0FOb2RlSW5kZXggPSAtMTsKLSAgICBJTlQgICAgICAgICAgICAgaURBTm9kZUluZGV4ID0gLTE7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOwotICAgIFVJTlQgICAgICAgICAgICBjYklWT2Zmc2V0OwotICAgIEJPT0wgICAgICAgICAgICBiRXh0SVYgPSBGQUxTRTsKLSAgICBQQllURSAgICAgICAgICAgcGJ5UnhTdHM7Ci0gICAgUEJZVEUgICAgICAgICAgIHBieVJ4UmF0ZTsKLSAgICBQQllURSAgICAgICAgICAgcGJ5U1E7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSGVhZGVyU2l6ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdGcmFtZVNpemU7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5RnJhbWU7CisgICAgYm9vbCBiRGVGcmFnUnggPSBmYWxzZTsKKyAgICBib29sIGJJc1dFUCA9IGZhbHNlOworICAgIHVuc2lnbmVkIGludCBjYkhlYWRlck9mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgRnJhbWVTaXplOworICAgIHVuc2lnbmVkIHNob3J0IHdFdGhlclR5cGUgPSAwOworICAgIGludCAgICAgICAgICAgICBpU0FOb2RlSW5kZXggPSAtMTsKKyAgICBpbnQgICAgICAgICAgICAgaURBTm9kZUluZGV4ID0gLTE7CisgICAgdW5zaWduZWQgaW50IGlpOworICAgIHVuc2lnbmVkIGludCBjYklWT2Zmc2V0OworICAgIGJvb2wgYkV4dElWID0gZmFsc2U7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5UnhTdHM7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5UnhSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgKnBieVNROworICAgIHVuc2lnbmVkIGludCBjYkhlYWRlclNpemU7CiAgICAgUFNLZXlJdGVtICAgICAgIHBLZXkgPSBOVUxMOwotICAgIFdPUkQgICAgICAgICAgICB3UnhUU0MxNV8wID0gMDsKLSAgICBEV09SRCAgICAgICAgICAgZHdSeFRTQzQ3XzE2ID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UnhUU0MxNV8wID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnhUU0M0N18xNiA9IDA7CiAgICAgU0tleUl0ZW0gICAgICAgIFNUZW1wS2V5OwogICAgIC8vIDgwMi4xMWggUlBJCi0gICAgRFdPUkQgICAgICAgICAgIGR3RHVyYXRpb24gPSAwOwotICAgIExPTkcgICAgICAgICAgICBsZEJtID0gMDsKLSAgICBMT05HICAgICAgICAgICAgbGRCbVRocmVzaG9sZCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBkd0R1cmF0aW9uID0gMDsKKyAgICBsb25nICAgICAgICAgICAgbGRCbSA9IDA7CisgICAgbG9uZyAgICAgICAgICAgIGxkQm1UaHJlc2hvbGQgPSAwOwogICAgIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXI7Ci0gQk9PTCAgICAgICAgICAgIGJSeGVhcG9sX2tleSA9IEZBTFNFOworIGJvb2wgYlJ4ZWFwb2xfa2V5ID0gZmFsc2U7CiAKIC8vICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLS0tLS0tLSBkZXZpY2VfcmVjZWl2ZV9mcmFtZS0tLVxuIik7CiAKQEAgLTM5MSw3ICszNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogI2VuZGlmCiAvL1BMSUNFX0RFQlVHPC0KLSAgICBwd0ZyYW1lU2l6ZSA9IChQV09SRCkoc2tiLT5kYXRhICsgMik7CisgICAgcHdGcmFtZVNpemUgPSAodW5zaWduZWQgc2hvcnQgKikoc2tiLT5kYXRhICsgMik7CiAgICAgRnJhbWVTaXplID0gY3B1X3RvX2xlMTYocEN1cnJSRC0+bV9yZDFSRDEud1JlcUNvdW50KSAtIGNwdV90b19sZTE2KHBDdXJyUkQtPm1fcmQwUkQwLndSZXNDb3VudCk7CiAKICAgICAvLyBNYXg6IDIzMTJQYXlsb2FkICsgMzBIRCArNENSQyArIDJQYWRkaW5nICsgNExlbiArIDhUU0YgKyA0UlNSCkBAIC0zOTksMTcgKzM3OSwxNyBAQAogICAgIGlmICgoRnJhbWVTaXplID4gMjM2NCl8fChGcmFtZVNpemUgPD0gMzIpKSB7CiAgICAgICAgIC8vIEZyYW1lIFNpemUgZXJyb3IgZHJvcCB0aGlzIHBhY2tldC4KICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tLS0tLS0tIFdST05HIExlbmd0aCAxIFxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHBieVJ4U3RzID0gKFBCWVRFKSAoc2tiLT5kYXRhKTsKLSAgICBwYnlSeFJhdGUgPSAoUEJZVEUpIChza2ItPmRhdGEgKyAxKTsKLSAgICBwYnlSc3IgPSAoUEJZVEUpIChza2ItPmRhdGEgKyBGcmFtZVNpemUgLSAxKTsKLSAgICBwYnlSU1NJID0gKFBCWVRFKSAoc2tiLT5kYXRhICsgRnJhbWVTaXplIC0gMik7Ci0gICAgcGJ5TmV3UnNyID0gKFBCWVRFKSAoc2tiLT5kYXRhICsgRnJhbWVTaXplIC0gMyk7Ci0gICAgcGJ5U1EgPSAoUEJZVEUpIChza2ItPmRhdGEgKyBGcmFtZVNpemUgLSA0KTsKKyAgICBwYnlSeFN0cyA9ICh1bnNpZ25lZCBjaGFyICopIChza2ItPmRhdGEpOworICAgIHBieVJ4UmF0ZSA9ICh1bnNpZ25lZCBjaGFyICopIChza2ItPmRhdGEgKyAxKTsKKyAgICBwYnlSc3IgPSAodW5zaWduZWQgY2hhciAqKSAoc2tiLT5kYXRhICsgRnJhbWVTaXplIC0gMSk7CisgICAgcGJ5UlNTSSA9ICh1bnNpZ25lZCBjaGFyICopIChza2ItPmRhdGEgKyBGcmFtZVNpemUgLSAyKTsKKyAgICBwYnlOZXdSc3IgPSAodW5zaWduZWQgY2hhciAqKSAoc2tiLT5kYXRhICsgRnJhbWVTaXplIC0gMyk7CisgICAgcGJ5U1EgPSAodW5zaWduZWQgY2hhciAqKSAoc2tiLT5kYXRhICsgRnJhbWVTaXplIC0gNCk7CiAgICAgcHF3VFNGVGltZSA9IChQUVdPUkQpIChza2ItPmRhdGEgKyBGcmFtZVNpemUgLSAxMik7Ci0gICAgcGJ5RnJhbWUgPSAoUEJZVEUpKHNrYi0+ZGF0YSArIDQpOworICAgIHBieUZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5kYXRhICsgNCk7CiAKICAgICAvLyBnZXQgcGFja2V0IHNpemUKICAgICBGcmFtZVNpemUgPSBjcHVfdG9fbGUxNigqcHdGcmFtZVNpemUpOwpAQCAtNDE3LDcgKzM5Nyw3IEBACiAgICAgaWYgKChGcmFtZVNpemUgPiAyMzQ2KXwoRnJhbWVTaXplIDwgMTQpKSB7IC8vIE1heDogMjMxMlBheWxvYWQgKyAzMEhEICs0Q1JDCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pbjogMTQgYnl0ZXMgQUNLCiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLS0tLS0tLSBXUk9ORyBMZW5ndGggMiBcbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAvL1BMSUNFX0RFQlVHLT4KICNpZiAxCkBAIC00MzEsOSArNDExLDkgQEAKIAogI2VuZGlmCiAKLSAgcE1BQ0hlYWRlcj0oUFM4MDJfMTFIZWFkZXIpKChQQllURSkgKHNrYi0+ZGF0YSkrOCk7CisgIHBNQUNIZWFkZXI9KFBTODAyXzExSGVhZGVyKSgodW5zaWduZWQgY2hhciAqKSAoc2tiLT5kYXRhKSs4KTsKIC8vUExJQ0VfREVCVUc8LQotCWlmIChwRGV2aWNlLT5iTWVhc3VyZUluUHJvZ3Jlc3MgPT0gVFJVRSkgeworCWlmIChwRGV2aWNlLT5iTWVhc3VyZUluUHJvZ3Jlc3MgPT0gdHJ1ZSkgewogICAgICAgICBpZiAoKCpwYnlSc3IgJiBSU1JfQ1JDT0spICE9IDApIHsKICAgICAgICAgICAgIHBEZXZpY2UtPmJ5QmFzaWNNYXAgfD0gMHgwMTsKICAgICAgICAgfQpAQCAtNDYwLDEzICs0NDAsMTMgQEAKICAgICAgICAgICAgIGlpLS07CiAgICAgICAgIH0KICAgICAgICAgcERldmljZS0+ZHdSUElzW2lpXSArPSBkd0R1cmF0aW9uOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIUlTX01VTFRJQ0FTVF9BRERSRVNTKHBieUZyYW1lKSAmJiAhSVNfQlJPQURDQVNUX0FERFJFU1MocGJ5RnJhbWUpKSB7CisgICAgaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYnlGcmFtZSkpIHsKICAgICAgICAgaWYgKFdDVExiSXNEdXBsaWNhdGUoJihwRGV2aWNlLT5zRHVwUnhDYWNoZSksIChQUzgwMl8xMUhlYWRlcikgKHNrYi0+ZGF0YSArIDQpKSkgewogICAgICAgICAgICAgcERldmljZS0+czgwMl8xMUNvdW50ZXIuRnJhbWVEdXBsaWNhdGVDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NzUsMTQgKzQ1NSwxNCBAQAogICAgIHNfdkdldERBU0Eoc2tiLT5kYXRhKzQsICZjYkhlYWRlclNpemUsICZwRGV2aWNlLT5zUnhFdGhIZWFkZXIpOwogCiAgICAgLy8gZmlsdGVyIHBhY2tldCBzZW5kIGZyb20gbXlzZWxmCi0gICAgaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMKChQQllURSkmKHBEZXZpY2UtPnNSeEV0aEhlYWRlci5hYnlTcmNBZGRyWzBdKSwgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoKHVuc2lnbmVkIGNoYXIgKikmKHBEZXZpY2UtPnNSeEV0aEhlYWRlci5hYnlTcmNBZGRyWzBdKSwgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgfHwgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0lCU1NfU1RBKSkgewogICAgICAgICBpZiAoSVNfQ1RMX1BTUE9MTChwYnlGcmFtZSkgfHwgIUlTX1RZUEVfQ09OVFJPTChwYnlGcmFtZSkpIHsKICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXIgPSAoUFM4MDJfMTFIZWFkZXIpIChwYnlGcmFtZSk7CiAgICAgICAgICAgICAvLyBnZXQgU0EgTm9kZUluZGV4Ci0gICAgICAgICAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgKFBCWVRFKShwODAyXzExSGVhZGVyLT5hYnlBZGRyMiksICZpU0FOb2RlSW5kZXgpKSB7CisgICAgICAgICAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgKHVuc2lnbmVkIGNoYXIgKikocDgwMl8xMUhlYWRlci0+YWJ5QWRkcjIpLCAmaVNBTm9kZUluZGV4KSkgewogICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbaVNBTm9kZUluZGV4XS51bExhc3RSeEppZmZlciA9IGppZmZpZXM7CiAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLnVJbkFjdGl2ZUNvdW50ID0gMDsKICAgICAgICAgICAgIH0KQEAgLTQ5MCwxNyArNDcwLDE3IEBACiAgICAgfQogCiAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgewotICAgICAgICBpZiAoc19iQVBNb2RlUnhDdGwocERldmljZSwgcGJ5RnJhbWUsIGlTQU5vZGVJbmRleCkgPT0gVFJVRSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoc19iQVBNb2RlUnhDdGwocERldmljZSwgcGJ5RnJhbWUsIGlTQU5vZGVJbmRleCkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCiAKICAgICBpZiAoSVNfRkNfV0VQKHBieUZyYW1lKSkgewotICAgICAgICBCT09MICAgICBiUnhEZWNyeU9LID0gRkFMU0U7CisgICAgICAgIGJvb2wgYlJ4RGVjcnlPSyA9IGZhbHNlOwogCiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icnggV0VQIHBrdFxuIik7Ci0gICAgICAgIGJJc1dFUCA9IFRSVUU7CisgICAgICAgIGJJc1dFUCA9IHRydWU7CiAgICAgICAgIGlmICgocERldmljZS0+YkVuYWJsZUhvc3RXRVApICYmIChpU0FOb2RlSW5kZXggPj0gMCkpIHsKICAgICAgICAgICAgIHBLZXkgPSAmU1RlbXBLZXk7CiAgICAgICAgICAgICBwS2V5LT5ieUNpcGhlclN1aXRlID0gcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLmJ5Q2lwaGVyU3VpdGU7CkBAIC01NTIsMTEgKzUzMiwxMSBAQAogLy8gICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+czgwMl8xMUNvdW50ZXIuV0VQSUNWRXJyb3JDb3VudC5RdWFkUGFydCsrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIldFUCBGdW5jIEZhaWxcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICgocEtleSAhPSBOVUxMKSAmJiAocEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX0NDTVApKQogICAgICAgICAgICAgRnJhbWVTaXplIC09IDg7ICAgICAgICAgLy8gTWVzc2FnZSBJbnRlZ3JpdHkgQ29kZQpAQCAtNTg0LDE4ICs1NjQsMTggQEAKIAogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCiAKIC8vIE1hbmFnZW1lbnQgJiBDb250cm9sIGZyYW1lIEhhbmRsZQotICAgIGlmICgoSVNfVFlQRV9EQVRBKChza2ItPmRhdGErNCkpKSA9PSBGQUxTRSkgeworICAgIGlmICgoSVNfVFlQRV9EQVRBKChza2ItPmRhdGErNCkpKSA9PSBmYWxzZSkgewogICAgICAgICAvLyBIYW5kbGUgQ29udHJvbCAmIE1hbmFnZSBGcmFtZQogCiAgICAgICAgIGlmIChJU19UWVBFX01HTVQoKHNrYi0+ZGF0YSs0KSkpIHsKLSAgICAgICAgICAgIFBCWVRFIHBieURhdGExOwotICAgICAgICAgICAgUEJZVEUgcGJ5RGF0YTI7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwYnlEYXRhMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBieURhdGEyOwogCiAgICAgICAgICAgICBwUnhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKHNrYi0+ZGF0YSs0KTsKICAgICAgICAgICAgIHBSeFBhY2tldC0+Y2JNUERVTGVuID0gRnJhbWVTaXplOwpAQCAtNjQ5LDEzICs2MjksMTMgQEAKICAgICAJICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwogCSAgICAgICAgICAgIG1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOwogCSAgICAgICAgICAgIG5ldGlmX3J4KHNrYik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAJICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAvLyBDb250cm9sIEZyYW1lCiAgICAgICAgIH07Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgewpAQCAtNjY3LDEyICs2NDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmRldi0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIC8vIGRpc2NhcmQgREFUQSBwYWNrZXQgd2hpbGUgbm90IGFzc29jaWF0ZSB8fCBCU1NJRCBlcnJvcgotICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gRkFMU0UpIHx8CisgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBmYWxzZSkgfHwKICAgICAgICAgICAgICAgICAhKCpwYnlSc3IgJiBSU1JfQlNTSURPSykpIHsKICAgICAgICAgICAgICAgICBpZiAoYkRlRnJhZ1J4KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2FsbG9jX2ZyYWdfYnVmKHBEZXZpY2UsICZwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0pKSB7CkBAIC02ODAsMTIgKzY2MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+ZGV2LT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgLy9taWtlIGFkZDpzdGF0aW9uIG1vZGUgY2hlY2sgZWFwb2wta2V5IGNoYWxsZW5nZS0tLT4KICAgIAkgIHsKLSAgIAkgICAgQllURSAgUHJvdG9jb2xfVmVyc2lvbjsgICAgLy84MDIuMXggQXV0aGVudGljYXRpb24KLQkgICAgQllURSAgUGFja2V0X1R5cGU7ICAgICAgICAgICAvLzgwMi4xeCBBdXRoZW50aWNhdGlvbgorICAgCSAgICB1bnNpZ25lZCBjaGFyIFByb3RvY29sX1ZlcnNpb247ICAgIC8vODAyLjF4IEF1dGhlbnRpY2F0aW9uCisJICAgIHVuc2lnbmVkIGNoYXIgUGFja2V0X1R5cGU7ICAgICAgICAgICAvLzgwMi4xeCBBdXRoZW50aWNhdGlvbgogICAgICAgICAgICAgICBpZiAoYklzV0VQKQogICAgICAgICAgICAgICAgICAgY2JJVk9mZnNldCA9IDg7CiAgICAgICAgICAgICAgIGVsc2UKQEAgLTY5Nyw3ICs2NzcsNyBAQAogCSAgICAgaWYgKHdFdGhlclR5cGUgPT0gRVRIX1BfUEFFKSB7ICAgICAgICAgLy9Qcm90b2NvbCBUeXBlIGluIExMQy1IZWFkZXIKICAgICAgICAgICAgICAgICAgIGlmKCgoUHJvdG9jb2xfVmVyc2lvbj09MSkgfHwoUHJvdG9jb2xfVmVyc2lvbj09MikpICYmCiAJCSAgICAgKFBhY2tldF9UeXBlPT0zKSkgeyAgLy84MDIuMXggT1IgZWFwb2wta2V5IGNoYWxsZW5nZSBmcmFtZSByZWNlaXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBiUnhlYXBvbF9rZXkgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYlJ4ZWFwb2xfa2V5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgIH0KIAkgICAgICB9CiAgICAJICB9CkBAIC03MTYsOCArNjk2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5wTWdtdC0+YkluVElNV2FrZSA9PSBUUlVFKSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+cE1nbXQtPmJJblRJTVdha2UgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwRGV2aWNlLT5wTWdtdC0+YkluVElNV2FrZSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgcERldmljZS0+cE1nbXQtPmJJblRJTVdha2UgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC03MjUsNyArNzA1LDcgQEAKICAgICAvLyBOb3cgaXQgb25seSBzdXBwb3J0cyA4MDIuMTFnIEluZnJhc3RydWN0dXJlIE1vZGUsIGFuZCBzdXBwb3J0IHJhdGUgbXVzdCB1cCB0byA1NCBNYnBzCiAgICAgaWYgKHBEZXZpY2UtPmJEaXZlcnNpdHlFbmFibGUgJiYgKEZyYW1lU2l6ZT41MCkgJiYKICAgICAgICAgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYKLSAgICAgICAgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBUUlVFKSkgeworICAgICAgICAocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpKSB7CiAJLy9wcmludGsoImRldmljZV9yZWNlaXZlX2ZyYW1lOiBSeFJhdGUgaXMgJWRcbiIsKnBieVJ4UmF0ZSk7CiAJCUJCdkFudGVubmFEaXZlcnNpdHkocERldmljZSwgc19ieUdldFJhdGVJZHgoKnBieVJ4UmF0ZSksIDApOwogICAgIH0KQEAgLTc1Miw4ICs3MzIsOCBAQAogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSAmJiAocERldmljZS0+YkVuYWJsZTgwMjF4ID09IFRSVUUpKXsKLSAgICAgICAgQllURSAgICBhYnlNYWNIZHJbMjRdOworICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSAmJiAocERldmljZS0+YkVuYWJsZTgwMjF4ID09IHRydWUpKXsKKyAgICAgICAgdW5zaWduZWQgY2hhciBhYnlNYWNIZHJbMjRdOwogCiAgICAgICAgIC8vIE9ubHkgODAyLjF4IHBhY2tldCBpbmNvbWluZyBhbGxvd2VkCiAgICAgICAgIGlmIChiSXNXRVApCkBAIC03NjcsNyArNzQ3LDcgQEAKICAgICAgICAgaWYgKHdFdGhlclR5cGUgPT0gRVRIX1BfUEFFKSB7CiAgICAgICAgICAgICBza2ItPmRldiA9IHBEZXZpY2UtPmFwZGV2OwogCi0gICAgICAgICAgICBpZiAoYklzV0VQID09IFRSVUUpIHsKKyAgICAgICAgICAgIGlmIChiSXNXRVAgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIC8vIHN0cmlwIElWIGhlYWRlcig4KQogICAgICAgICAgICAgICAgIG1lbWNweSgmYWJ5TWFjSGRyWzBdLCAoc2tiLT5kYXRhICsgNCksIDI0KTsKICAgICAgICAgICAgICAgICBtZW1jcHkoKHNrYi0+ZGF0YSArIDQgKyBjYklWT2Zmc2V0KSwgJmFieU1hY0hkclswXSwgMjQpOwpAQCAtNzgxLDEyICs3NjEsMTIgQEAKICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7CiAgICAgICAgICAgICBtZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKICAgICAgICAgICAgIG5ldGlmX3J4KHNrYik7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiB9CiAgICAgICAgIC8vIGNoZWNrIGlmIDgwMi4xeCBhdXRob3JpemVkCiAgICAgICAgIGlmICghKHBNZ210LT5zTm9kZURCVGFibGVbaVNBTm9kZUluZGV4XS5kd0ZsYWdzICYgV0xBTl9TVEFfQVVUSE9SSVpFRCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAKQEAgLTgwMCw1MyArNzgwLDUzIEBACiAgICAgLy8gU29mdCBNSUMKICAgICBpZiAoKHBLZXkgIT0gTlVMTCkgJiYgKHBLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewogICAgICAgICBpZiAoYklzV0VQKSB7Ci0gICAgICAgICAgICBQRFdPUkQgICAgICAgICAgcGR3TUlDX0w7Ci0gICAgICAgICAgICBQRFdPUkQgICAgICAgICAgcGR3TUlDX1I7Ci0gICAgICAgICAgICBEV09SRCAgICAgICAgICAgZHdNSUNfUHJpb3JpdHk7Ci0gICAgICAgICAgICBEV09SRCAgICAgICAgICAgZHdNSUNLZXkwID0gMCwgZHdNSUNLZXkxID0gMDsKLSAgICAgICAgICAgIERXT1JEICAgICAgICAgICBkd0xvY2FsTUlDX0wgPSAwOwotICAgICAgICAgICAgRFdPUkQgICAgICAgICAgIGR3TG9jYWxNSUNfUiA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpwZHdNSUNfTDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnBkd01JQ19SOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkd01JQ19Qcmlvcml0eTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZHdNSUNLZXkwID0gMCwgZHdNSUNLZXkxID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZHdMb2NhbE1JQ19MID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZHdMb2NhbE1JQ19SID0gMDsKICAgICAgICAgICAgIHZpYXdnZXRfd3BhX2hlYWRlciAqd3BhaGRyOwogCiAKICAgICAgICAgICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKLSAgICAgICAgICAgICAgICBkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKFBEV09SRCkoJnBLZXktPmFieUtleVsyNF0pKTsKLSAgICAgICAgICAgICAgICBkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKFBEV09SRCkoJnBLZXktPmFieUtleVsyOF0pKTsKKyAgICAgICAgICAgICAgICBkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyNF0pKTsKKyAgICAgICAgICAgICAgICBkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyOF0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5wTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQU5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKihQRFdPUkQpKCZwS2V5LT5hYnlLZXlbMTZdKSk7Ci0gICAgICAgICAgICAgICAgICAgIGR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCooUERXT1JEKSgmcEtleS0+YWJ5S2V5WzIwXSkpOworICAgICAgICAgICAgICAgICAgICBkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsxNl0pKTsKKyAgICAgICAgICAgICAgICAgICAgZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjBdKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocEtleS0+ZHdLZXlJbmRleCAmIEJJVDI4KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCooUERXT1JEKSgmcEtleS0+YWJ5S2V5WzE2XSkpOwotICAgICAgICAgICAgICAgICAgICBkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKFBEV09SRCkoJnBLZXktPmFieUtleVsyMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMTZdKSk7CisgICAgICAgICAgICAgICAgICAgIGR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCooUERXT1JEKSgmcEtleS0+YWJ5S2V5WzI0XSkpOwotICAgICAgICAgICAgICAgICAgICBkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKFBEV09SRCkoJnBLZXktPmFieUtleVsyOF0pKTsKKyAgICAgICAgICAgICAgICAgICAgZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjRdKSk7CisgICAgICAgICAgICAgICAgICAgIGR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzI4XSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTUlDX3ZJbml0KGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKLSAgICAgICAgICAgIE1JQ192QXBwZW5kKChQQllURSkmKHBEZXZpY2UtPnNSeEV0aEhlYWRlci5hYnlEc3RBZGRyWzBdKSwgMTIpOworICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKHVuc2lnbmVkIGNoYXIgKikmKHBEZXZpY2UtPnNSeEV0aEhlYWRlci5hYnlEc3RBZGRyWzBdKSwgMTIpOwogICAgICAgICAgICAgZHdNSUNfUHJpb3JpdHkgPSAwOwotICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKFBCWVRFKSZkd01JQ19Qcmlvcml0eSwgNCk7CisgICAgICAgICAgICBNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSZkd01JQ19Qcmlvcml0eSwgNCk7CiAgICAgICAgICAgICAvLyA0IGlzIFJjdiBidWZmZXIgaGVhZGVyLCAyNCBpcyBNQUMgSGVhZGVyLCBhbmQgOCBpcyBJViBhbmQgRXh0IElWLgotICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKFBCWVRFKShza2ItPmRhdGEgKyA0ICsgV0xBTl9IRFJfQUREUjNfTEVOICsgOCksCisgICAgICAgICAgICBNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGEgKyA0ICsgV0xBTl9IRFJfQUREUjNfTEVOICsgOCksCiAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVNpemUgLSBXTEFOX0hEUl9BRERSM19MRU4gLSA4KTsKICAgICAgICAgICAgIE1JQ192R2V0TUlDKCZkd0xvY2FsTUlDX0wsICZkd0xvY2FsTUlDX1IpOwogICAgICAgICAgICAgTUlDX3ZVbkluaXQoKTsKIAotICAgICAgICAgICAgcGR3TUlDX0wgPSAoUERXT1JEKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplKTsKLSAgICAgICAgICAgIHBkd01JQ19SID0gKFBEV09SRCkoc2tiLT5kYXRhICsgNCArIEZyYW1lU2l6ZSArIDQpOworICAgICAgICAgICAgcGR3TUlDX0wgPSAodW5zaWduZWQgbG9uZyAqKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplKTsKKyAgICAgICAgICAgIHBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikoc2tiLT5kYXRhICsgNCArIEZyYW1lU2l6ZSArIDQpOwogICAgICAgICAgICAgLy9EQkdfUFJOX0dSUDEyKCgiUnhMOiAlbHgsIFJ4UjogJWx4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUikpOwogICAgICAgICAgICAgLy9EQkdfUFJOX0dSUDEyKCgiTG9jYWxMOiAlbHgsIExvY2FsUjogJWx4XG4iLCBkd0xvY2FsTUlDX0wsIGR3TG9jYWxNSUNfUikpOwogICAgICAgICAgICAgLy9EQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPImR3TUlDS2V5MD0gJWx4LGR3TUlDS2V5MT0gJWx4IFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCiAKICAgICAgICAgICAgIGlmICgoY3B1X3RvX2xlMzIoKnBkd01JQ19MKSAhPSBkd0xvY2FsTUlDX0wpIHx8IChjcHVfdG9fbGUzMigqcGR3TUlDX1IpICE9IGR3TG9jYWxNSUNfUikgfHwKLSAgICAgICAgICAgICAgICAocERldmljZS0+YlJ4TUlDRmFpbCA9PSBUUlVFKSkgeworICAgICAgICAgICAgICAgIChwRGV2aWNlLT5iUnhNSUNGYWlsID09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJNSUMgY29tcGFyaXNvbiBpcyBmYWlsIVxuIik7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YlJ4TUlDRmFpbCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJSeE1JQ0ZhaWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAvL3BEZXZpY2UtPnM4MDJfMTFDb3VudGVyLlRLSVBMb2NhbE1JQ0ZhaWx1cmVzLlF1YWRQYXJ0Kys7CiAgICAgICAgICAgICAgICAgcERldmljZS0+czgwMl8xMUNvdW50ZXIuVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKICAgICAgICAgICAgICAgICBpZiAoYkRlRnJhZ1J4KSB7CkBAIC04NTgsNyArODM4LDcgQEAKICAgICAgICAgICAgICAgIC8vMjAwOC0wNDA5LTA3LCA8QWRkPiBieSBFaW5zbiBMaXUKICAgICAgICAjaWZkZWYgV1BBX1NVUFBMSUNBTlRfRFJJVkVSX1dFWFRfU1VQUE9SVAogCQkJCS8vc2VuZCBldmVudCB0byB3cGFfc3VwcGxpY2FudAotCQkJCS8vaWYocERldmljZS0+YldQQURldkVuYWJsZSA9PSBUUlVFKQorCQkJCS8vaWYocERldmljZS0+YldQQURldkVuYWJsZSA9PSB0cnVlKQogCQkJCXsKIAkJCQkJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogCQkJCQlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgZXY7CkBAIC05MDYsNyArODg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPnNrYiA9IGRldl9hbGxvY19za2IoKGludClwRGV2aWNlLT5yeF9idWZfc3opOwogICAgICAgICAgICAgICAgICB9OwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05MTcsMTMgKzg5NywxMyBAQAogICAgIGlmICgocEtleSAhPSBOVUxMKSAmJiAoKHBLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9DQ01QKSkpIHsKICAgICAgICAgaWYgKGJJc1dFUCkgewotICAgICAgICAgICAgV09SRCAgICAgICAgd0xvY2FsVFNDMTVfMCA9IDA7Ci0gICAgICAgICAgICBEV09SRCAgICAgICBkd0xvY2FsVFNDNDdfMTYgPSAwOwotICAgICAgICAgICAgVUxPTkdMT05HICAgICAgIFJTQyA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB3TG9jYWxUU0MxNV8wID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZHdMb2NhbFRTQzQ3XzE2ID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgICBSU0MgPSAwOwogICAgICAgICAgICAgLy8gZW5kaWFuIGlzc3VlcwotICAgICAgICAgICAgUlNDID0gKigoVUxPTkdMT05HICopICYocEtleS0+S2V5UlNDKSk7Ci0gICAgICAgICAgICB3TG9jYWxUU0MxNV8wID0gKFdPUkQpIFJTQzsKLSAgICAgICAgICAgIGR3TG9jYWxUU0M0N18xNiA9IChEV09SRCkgKFJTQz4+MTYpOworICAgICAgICAgICAgUlNDID0gKigodW5zaWduZWQgbG9uZyBsb25nICopICYocEtleS0+S2V5UlNDKSk7CisgICAgICAgICAgICB3TG9jYWxUU0MxNV8wID0gKHVuc2lnbmVkIHNob3J0KSBSU0M7CisgICAgICAgICAgICBkd0xvY2FsVFNDNDdfMTYgPSAodW5zaWduZWQgbG9uZykgKFJTQz4+MTYpOwogCiAgICAgICAgICAgICBSU0MgPSBkd1J4VFNDNDdfMTY7CiAgICAgICAgICAgICBSU0MgPDw9IDE2OwpAQCAtOTUwLDcgKzkzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmRldi0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NjMsMTMgKzk0MywxMyBAQAogICAgIH0KIAogCi0gICAgc192UHJvY2Vzc1J4TUFDSGVhZGVyKHBEZXZpY2UsIChQQllURSkoc2tiLT5kYXRhKzQpLCBGcmFtZVNpemUsIGJJc1dFUCwgYkV4dElWLCAmY2JIZWFkZXJPZmZzZXQpOworICAgIHNfdlByb2Nlc3NSeE1BQ0hlYWRlcihwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGErNCksIEZyYW1lU2l6ZSwgYklzV0VQLCBiRXh0SVYsICZjYkhlYWRlck9mZnNldCk7CiAgICAgRnJhbWVTaXplIC09IGNiSGVhZGVyT2Zmc2V0OwogICAgIGNiSGVhZGVyT2Zmc2V0ICs9IDQ7ICAgICAgICAvLyA0IGlzIFJjdiBidWZmZXIgaGVhZGVyCiAKICAgICAvLyBOdWxsIGRhdGEsIGZyYW1lc2l6ZSA9IDE0CiAgICAgaWYgKEZyYW1lU2l6ZSA8IDE1KQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKICAgICAgICAgaWYgKHNfYkFQTW9kZVJ4RGF0YShwRGV2aWNlLApAQCAtOTc4LDcgKzk1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JIZWFkZXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVNBTm9kZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEQU5vZGVJbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApID09IGZhbHNlKSB7CiAKICAgICAgICAgICAgIGlmIChiRGVGcmFnUngpIHsKICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9hbGxvY19mcmFnX2J1ZihwRGV2aWNlLCAmcERldmljZS0+c1J4REZDQltwRGV2aWNlLT51Q3VycmVudERGQ0JJZHhdKSkgewpAQCAtOTg2LDEwICs5NjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+ZGV2LT5uYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotLy8gICAgICAgIGlmKHBEZXZpY2UtPmJSeE1JQ0ZhaWwgPT0gRkFMU0UpIHsKKy8vICAgICAgICBpZihwRGV2aWNlLT5iUnhNSUNGYWlsID09IGZhbHNlKSB7CiAvLyAgICAgICAgICAgZm9yIChpaSA9MDsgaWkgPCAxMDA7IGlpKyspCiAvLyAgICAgICAgICAgICAgICBwcmludGsoIiAlMDJ4IiwgKihza2ItPmRhdGEgKyBpaSkpOwogLy8gICAgICAgICAgIHByaW50aygiXG4iKTsKQEAgLTEwMTYsNyArOTk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+ZGV2LT5uYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0JCQlyZXR1cm4gRkFMU0U7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAqLwpAQCAtMTAzMSwxNyArMTAxMSwxNyBAQAogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSICIlczogY2FuIG5vdCBhbGxvYyBtb3JlIGZyYWcgYnVmc1xuIiwKICAgICAgICAgICAgICAgICBwRGV2aWNlLT5kZXYtPm5hbWUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAKLXN0YXRpYyBCT09MIHNfYkFQTW9kZVJ4Q3RsICgKK3N0YXRpYyBib29sIHNfYkFQTW9kZVJ4Q3RsICgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIFBCWVRFICAgIHBieUZyYW1lLAotICAgIElOVCAgICAgIGlTQU5vZGVJbmRleAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUZyYW1lLAorICAgIGludCAgICAgIGlTQU5vZGVJbmRleAogICAgICkKIHsKICAgICBQUzgwMl8xMUhlYWRlciAgICAgIHA4MDJfMTFIZWFkZXI7CkBAIC0xMDYzLDMwICsxMDQzLDMwIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHJlYXNvbiA9ICg2KSBjbGFzcyAyIHJlY2VpdmVkIGZyb20gbm9uYXV0aCBzdGEKICAgICAgICAgICAgICAgICAgICAgdk1nckRlQXV0aGVuQmVnaW5TdGEocERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQQllURSkocDgwMl8xMUhlYWRlci0+YWJ5QWRkcjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKShwODAyXzExSGVhZGVyLT5hYnlBZGRyMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX01HTVRfUkVBU09OX0NMQVNTMl9OT05BVVRIKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0YXR1cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkcGM6IHNlbmQgdk1nckRlQXV0aGVuQmVnaW5TdGEgMVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW2lTQU5vZGVJbmRleF0uZU5vZGVTdGF0ZSA8IE5PREVfQVNTT0MpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBkZWFzc29jIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAvLyByZWFzb24gPSAoNykgY2xhc3MgMyByZWNlaXZlZCBmcm9tIG5vbmFzc29jIHN0YQogICAgICAgICAgICAgICAgICAgICB2TWdyRGlzYXNzb2NCZWdpblN0YShwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKShwODAyXzExSGVhZGVyLT5hYnlBZGRyMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopKHA4MDJfMTFIZWFkZXItPmFieUFkZHIyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fTUdNVF9SRUFTT05fQ0xBU1MzX05PTkFTU09DKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0YXR1cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkcGM6IHNlbmQgdk1nckRpc2Fzc29jQmVnaW5TdGEgMlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbaVNBTm9kZUluZGV4XS5iUFNFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVsY2FyZSByZWNlaXZlZCBwcy1wb2xsIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgIGlmIChJU19DVExfUFNQT0xMKHBieUZyYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLmJSeFBTUG9sbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lTQU5vZGVJbmRleF0uYlJ4UFNQb2xsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKilwRGV2aWNlLCBXTEFOX0NNRF9SWF9QU1BPTEwsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZHBjOiBXTEFOX0NNRF9SWF9QU1BPTEwgMVxuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwOTQsOCArMTA3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBEYXRhIFBTIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBQVyBiaXQgb2ZmLCBzZW5kIG91dCBhbGwgUFMgYnVmZmVycmluZyBwYWNrZXRzLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJU19GQ19QT1dFUk1HVChwYnlGcmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lTQU5vZGVJbmRleF0uYlBTRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLmJSeFBTUG9sbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLmJQU0VuYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbaVNBTm9kZUluZGV4XS5iUnhQU1BvbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKilwRGV2aWNlLCBXTEFOX0NNRF9SWF9QU1BPTEwsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImRwYzogV0xBTl9DTURfUlhfUFNQT0xMIDJcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTEwMywxNSArMTA4MywxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoSVNfRkNfUE9XRVJNR1QocGJ5RnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbaVNBTm9kZUluZGV4XS5iUFNFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lTQU5vZGVJbmRleF0uYlBTRW5hYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSBpZiBTVEEgaW4gUFMgc3RhdGUsIGVuYWJsZSBtdWx0aWNhc3QgYnVmZmVycmluZwotICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJQU0VuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYlBTRW5hYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYWxsIHBlbmRpbmcgUFMgZnJhbWUuCiAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbaVNBTm9kZUluZGV4XS53RW5RdWV1ZUNudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLmJQU0VuYWJsZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lTQU5vZGVJbmRleF0uYlJ4UFNQb2xsID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpU0FOb2RlSW5kZXhdLmJQU0VuYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lTQU5vZGVJbmRleF0uYlJ4UFNQb2xsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKXBEZXZpY2UsIFdMQU5fQ01EX1JYX1BTUE9MTCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZHBjOiBXTEFOX0NNRF9SWF9QU1BPTEwgM1xuIik7CiAKQEAgLTExMjIsNyArMTEwMiw3IEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgIHZNZ3JEZUF1dGhlbkJlZ2luU3RhKHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQQllURSkocDgwMl8xMUhlYWRlci0+YWJ5QWRkcjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikocDgwMl8xMUhlYWRlci0+YWJ5QWRkcjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5fTUdNVF9SRUFTT05fQ0xBU1MyX05PTkFVVEgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0YXR1cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKQEAgLTExNTQsMzEgKzExMzQsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZHBjOiB3RnJhbWVDdGw9ICV4XG4iLCBwODAyXzExSGVhZGVyLT53RnJhbWVDdGwgKTsKICAgICAgICAgICAgICAgICAgICAgVk5TdkluUG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUkNSLCAmKHBEZXZpY2UtPmJ5UnhNb2RlKSk7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImRwYzpwRGV2aWNlLT5ieVJ4TW9kZSA9ICV4XG4iLCBwRGV2aWNlLT5ieVJ4TW9kZSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIAogfQogCi1zdGF0aWMgQk9PTCBzX2JIYW5kbGVSeEVuY3J5cHRpb24gKAorc3RhdGljIGJvb2wgc19iSGFuZGxlUnhFbmNyeXB0aW9uICgKICAgICBQU0RldmljZSAgICAgcERldmljZSwKLSAgICBQQllURSAgICAgICAgcGJ5RnJhbWUsCi0gICAgVUlOVCAgICAgICAgIEZyYW1lU2l6ZSwKLSAgICBQQllURSAgICAgICAgcGJ5UnNyLAotICAgIFBCWVRFICAgICAgIHBieU5ld1JzciwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlGcmFtZSwKKyAgICB1bnNpZ25lZCBpbnQgRnJhbWVTaXplLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieVJzciwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlOZXdSc3IsCiAgICAgUFNLZXlJdGVtICAgKnBLZXlPdXQsCi0gICAgaW50ICogICAgICAgcGJFeHRJViwKLSAgICBQV09SRCAgICAgICBwd1J4VFNDMTVfMCwKLSAgICBQRFdPUkQgICAgICBwZHdSeFRTQzQ3XzE2CisgICAgYm9vbCAqcGJFeHRJViwKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdSeFRTQzE1XzAsCisgICAgdW5zaWduZWQgbG9uZyAqcGR3UnhUU0M0N18xNgogICAgICkKIHsKLSAgICBVSU5UICAgICAgICAgICAgUGF5bG9hZExlbiA9IEZyYW1lU2l6ZTsKLSAgICBQQllURSAgICAgICAgICAgcGJ5SVY7Ci0gICAgQllURSAgICAgICAgICAgIGJ5S2V5SWR4OworICAgIHVuc2lnbmVkIGludCBQYXlsb2FkTGVuID0gRnJhbWVTaXplOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUlWOworICAgIHVuc2lnbmVkIGNoYXIgYnlLZXlJZHg7CiAgICAgUFNLZXlJdGVtICAgICAgIHBLZXkgPSBOVUxMOwotICAgIEJZVEUgICAgICAgICAgICBieURlY01vZGUgPSBLRVlfQ1RMX1dFUDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGVjTW9kZSA9IEtFWV9DVExfV0VQOwogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogCiAKQEAgLTExODYsOCArMTE2Niw4IEBACiAgICAgKnBkd1J4VFNDNDdfMTYgPSAwOwogCiAgICAgcGJ5SVYgPSBwYnlGcmFtZSArIFdMQU5fSERSX0FERFIzX0xFTjsKLSAgICBpZiAoIFdMQU5fR0VUX0ZDX1RPRFMoKihQV09SRClwYnlGcmFtZSkgJiYKLSAgICAgICAgIFdMQU5fR0VUX0ZDX0ZST01EUygqKFBXT1JEKXBieUZyYW1lKSApIHsKKyAgICBpZiAoIFdMQU5fR0VUX0ZDX1RPRFMoKih1bnNpZ25lZCBzaG9ydCAqKXBieUZyYW1lKSAmJgorICAgICAgICAgV0xBTl9HRVRfRkNfRlJPTURTKCoodW5zaWduZWQgc2hvcnQgKilwYnlGcmFtZSkgKSB7CiAgICAgICAgICBwYnlJViArPSA2OyAgICAgICAgICAgICAvLyA2IGlzIDgwMi4xMSBhZGRyZXNzNAogICAgICAgICAgUGF5bG9hZExlbiAtPSA2OwogICAgIH0KQEAgLTEyMDQsNyArMTE4NCw3IEBACiAgICAgICAgICAgICAocERldmljZS0+cE1nbXQtPmJ5Q1NTUEsgIT0gS0VZX0NUTF9OT05FKSkgewogICAgICAgICAgICAgLy8gdW5pY2FzdCBwa3QgdXNlIHBhaXJ3aXNlIGtleQogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ1bmljYXN0IHBrdFxuIik7Ci0gICAgICAgICAgICBpZiAoS2V5YkdldEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwRGV2aWNlLT5hYnlCU1NJRCwgMHhGRkZGRkZGRiwgJnBLZXkpID09IFRSVUUpIHsKKyAgICAgICAgICAgIGlmIChLZXliR2V0S2V5KCYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJTU0lELCAweEZGRkZGRkZGLCAmcEtleSkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5wTWdtdC0+YnlDU1NQSyA9PSBLRVlfQ1RMX1RLSVApCiAgICAgICAgICAgICAgICAgICAgIGJ5RGVjTW9kZSA9IEtFWV9DVExfVEtJUDsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChwRGV2aWNlLT5wTWdtdC0+YnlDU1NQSyA9PSBLRVlfQ1RMX0NDTVApCkBAIC0xMjM4LDI0ICsxMjE4LDI0IEBACiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icEtleSA9PSBOVUxMXG4iKTsKICAgICAgICAgaWYgKGJ5RGVjTW9kZSA9PSBLRVlfQ1RMX1dFUCkgewogLy8gICAgICAgICAgICBwRGV2aWNlLT5zODAyXzExQ291bnRlci5XRVBVbmRlY3J5cHRhYmxlQ291bnQuUXVhZFBhcnQrKzsKLSAgICAgICAgfSBlbHNlIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gVFJVRSkgeworICAgICAgICB9IGVsc2UgaWYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSB7CiAvLyAgICAgICAgICAgIHBEZXZpY2UtPnM4MDJfMTFDb3VudGVyLkRlY3J5cHRGYWlsdXJlQ291bnQuUXVhZFBhcnQrKzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGJ5RGVjTW9kZSAhPSBwS2V5LT5ieUNpcGhlclN1aXRlKSB7CiAgICAgICAgIGlmIChieURlY01vZGUgPT0gS0VZX0NUTF9XRVApIHsKIC8vICAgICAgICAgICAgcERldmljZS0+czgwMl8xMUNvdW50ZXIuV0VQVW5kZWNyeXB0YWJsZUNvdW50LlF1YWRQYXJ0Kys7Ci0gICAgICAgIH0gZWxzZSBpZiAocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgewogLy8gICAgICAgICAgICBwRGV2aWNlLT5zODAyXzExQ291bnRlci5EZWNyeXB0RmFpbHVyZUNvdW50LlF1YWRQYXJ0Kys7CiAgICAgICAgIH0KICAgICAgICAgKnBLZXlPdXQgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKGJ5RGVjTW9kZSA9PSBLRVlfQ1RMX1dFUCkgewogICAgICAgICAvLyBoYW5kbGUgV0VQCiAgICAgICAgIGlmICgocERldmljZS0+YnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQTEpIHx8Ci0gICAgICAgICAgICAoKChQU0tleVRhYmxlKShwS2V5LT5wdktleVRhYmxlKSktPmJTb2Z0V0VQID09IFRSVUUpKSB7CisgICAgICAgICAgICAoKChQU0tleVRhYmxlKShwS2V5LT5wdktleVRhYmxlKSktPmJTb2Z0V0VQID09IHRydWUpKSB7CiAgICAgICAgICAgICAvLyBTb2Z0d2FyZSBXRVAKICAgICAgICAgICAgIC8vIDEuIDMyNTNBCiAgICAgICAgICAgICAvLyAyLiBXRVAgMjU2CkBAIC0xMjc1LDEyICsxMjU1LDEyIEBACiAgICAgICAgIC8vIFRLSVAvQUVTCiAKICAgICAgICAgUGF5bG9hZExlbiAtPSAoV0xBTl9IRFJfQUREUjNfTEVOICsgOCArIDQpOyAvLyAyNCBpcyA4MDIuMTEgaGVhZGVyLCA4IGlzIElWJkV4dElWLCA0IGlzIGNyYwotICAgICAgICAqcGR3UnhUU0M0N18xNiA9IGNwdV90b19sZTMyKCooUERXT1JEKShwYnlJViArIDQpKTsKKyAgICAgICAgKnBkd1J4VFNDNDdfMTYgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikocGJ5SVYgKyA0KSk7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRXh0SVY6ICVseFxuIiwqcGR3UnhUU0M0N18xNik7CiAgICAgICAgIGlmIChieURlY01vZGUgPT0gS0VZX0NUTF9US0lQKSB7CiAgICAgICAgICAgICAqcHdSeFRTQzE1XzAgPSBjcHVfdG9fbGUxNihNQUtFV09SRCgqKHBieUlWKzIpLCAqcGJ5SVYpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpwd1J4VFNDMTVfMCA9IGNwdV90b19sZTE2KCooUFdPUkQpcGJ5SVYpOworICAgICAgICAgICAgKnB3UnhUU0MxNV8wID0gY3B1X3RvX2xlMTYoKih1bnNpZ25lZCBzaG9ydCAqKXBieUlWKTsKICAgICAgICAgfQogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlRTQzBfMTU6ICV4XG4iLCAqcHdSeFRTQzE1XzApOwogCkBAIC0xMzAzLDI4ICsxMjgzLDI4IEBACiAgICAgfS8vIGVuZCBvZiBUS0lQL0FFUwogCiAgICAgaWYgKCgqKHBieUlWKzMpICYgMHgyMCkgIT0gMCkKLSAgICAgICAgKnBiRXh0SVYgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgICAgICAqcGJFeHRJViA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIAotc3RhdGljIEJPT0wgc19iSG9zdFdlcFJ4RW5jcnlwdGlvbiAoCitzdGF0aWMgYm9vbCBzX2JIb3N0V2VwUnhFbmNyeXB0aW9uICgKICAgICBQU0RldmljZSAgICAgcERldmljZSwKLSAgICBQQllURSAgICAgICAgcGJ5RnJhbWUsCi0gICAgVUlOVCAgICAgICAgIEZyYW1lU2l6ZSwKLSAgICBQQllURSAgICAgICAgcGJ5UnNyLAotICAgIEJPT0wgICAgICAgICBiT25GbHksCisgICAgdW5zaWduZWQgY2hhciAqcGJ5RnJhbWUsCisgICAgdW5zaWduZWQgaW50IEZyYW1lU2l6ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlSc3IsCisgICAgYm9vbCBiT25GbHksCiAgICAgUFNLZXlJdGVtICAgIHBLZXksCi0gICAgUEJZVEUgICAgICAgcGJ5TmV3UnNyLAotICAgIGludCAqICAgICAgIHBiRXh0SVYsCi0gICAgUFdPUkQgICAgICAgcHdSeFRTQzE1XzAsCi0gICAgUERXT1JEICAgICAgcGR3UnhUU0M0N18xNgorICAgIHVuc2lnbmVkIGNoYXIgKnBieU5ld1JzciwKKyAgICBib29sICpwYkV4dElWLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd1J4VFNDMTVfMCwKKyAgICB1bnNpZ25lZCBsb25nICpwZHdSeFRTQzQ3XzE2CiAgICAgKQogewotICAgIFVJTlQgICAgICAgICAgICBQYXlsb2FkTGVuID0gRnJhbWVTaXplOwotICAgIFBCWVRFICAgICAgICAgICBwYnlJVjsKLSAgICBCWVRFICAgICAgICAgICAgYnlLZXlJZHg7Ci0gICAgQllURSAgICAgICAgICAgIGJ5RGVjTW9kZSA9IEtFWV9DVExfV0VQOworICAgIHVuc2lnbmVkIGludCBQYXlsb2FkTGVuID0gRnJhbWVTaXplOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUlWOworICAgIHVuc2lnbmVkIGNoYXIgYnlLZXlJZHg7CisgICAgdW5zaWduZWQgY2hhciBieURlY01vZGUgPSBLRVlfQ1RMX1dFUDsKICAgICBQUzgwMl8xMUhlYWRlciAgcE1BQ0hlYWRlcjsKIAogCkBAIC0xMzMzLDggKzEzMTMsOCBAQAogICAgICpwZHdSeFRTQzQ3XzE2ID0gMDsKIAogICAgIHBieUlWID0gcGJ5RnJhbWUgKyBXTEFOX0hEUl9BRERSM19MRU47Ci0gICAgaWYgKCBXTEFOX0dFVF9GQ19UT0RTKCooUFdPUkQpcGJ5RnJhbWUpICYmCi0gICAgICAgICBXTEFOX0dFVF9GQ19GUk9NRFMoKihQV09SRClwYnlGcmFtZSkgKSB7CisgICAgaWYgKCBXTEFOX0dFVF9GQ19UT0RTKCoodW5zaWduZWQgc2hvcnQgKilwYnlGcmFtZSkgJiYKKyAgICAgICAgIFdMQU5fR0VUX0ZDX0ZST01EUygqKHVuc2lnbmVkIHNob3J0ICopcGJ5RnJhbWUpICkgewogICAgICAgICAgcGJ5SVYgKz0gNjsgICAgICAgICAgICAgLy8gNiBpcyA4MDIuMTEgYWRkcmVzczQKICAgICAgICAgIFBheWxvYWRMZW4gLT0gNjsKICAgICB9CkBAIC0xMzUzLDE4ICsxMzMzLDE4IEBACiAgICAgaWYgKGJ5RGVjTW9kZSAhPSBwS2V5LT5ieUNpcGhlclN1aXRlKSB7CiAgICAgICAgIGlmIChieURlY01vZGUgPT0gS0VZX0NUTF9XRVApIHsKIC8vICAgICAgICAgICAgcERldmljZS0+czgwMl8xMUNvdW50ZXIuV0VQVW5kZWNyeXB0YWJsZUNvdW50LlF1YWRQYXJ0Kys7Ci0gICAgICAgIH0gZWxzZSBpZiAocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgewogLy8gICAgICAgICAgICBwRGV2aWNlLT5zODAyXzExQ291bnRlci5EZWNyeXB0RmFpbHVyZUNvdW50LlF1YWRQYXJ0Kys7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaWYgKGJ5RGVjTW9kZSA9PSBLRVlfQ1RMX1dFUCkgewogICAgICAgICAvLyBoYW5kbGUgV0VQCiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iYnlEZWNNb2RlID09IEtFWV9DVExfV0VQIFxuIik7CiAgICAgICAgIGlmICgocERldmljZS0+YnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQTEpIHx8Ci0gICAgICAgICAgICAoKChQU0tleVRhYmxlKShwS2V5LT5wdktleVRhYmxlKSktPmJTb2Z0V0VQID09IFRSVUUpIHx8Ci0gICAgICAgICAgICAoYk9uRmx5ID09IEZBTFNFKSkgeworICAgICAgICAgICAgKCgoUFNLZXlUYWJsZSkocEtleS0+cHZLZXlUYWJsZSkpLT5iU29mdFdFUCA9PSB0cnVlKSB8fAorICAgICAgICAgICAgKGJPbkZseSA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgIC8vIFNvZnR3YXJlIFdFUAogICAgICAgICAgICAgLy8gMS4gMzI1M0EKICAgICAgICAgICAgIC8vIDIuIFdFUCAyNTYKQEAgLTEzODUsMTkgKzEzNjUsMTkgQEAKICAgICAgICAgLy8gVEtJUC9BRVMKIAogICAgICAgICBQYXlsb2FkTGVuIC09IChXTEFOX0hEUl9BRERSM19MRU4gKyA4ICsgNCk7IC8vIDI0IGlzIDgwMi4xMSBoZWFkZXIsIDggaXMgSVYmRXh0SVYsIDQgaXMgY3JjCi0gICAgICAgICpwZHdSeFRTQzQ3XzE2ID0gY3B1X3RvX2xlMzIoKihQRFdPUkQpKHBieUlWICsgNCkpOworICAgICAgICAqcGR3UnhUU0M0N18xNiA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKShwYnlJViArIDQpKTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJFeHRJVjogJWx4XG4iLCpwZHdSeFRTQzQ3XzE2KTsKIAogICAgICAgICBpZiAoYnlEZWNNb2RlID09IEtFWV9DVExfVEtJUCkgewogICAgICAgICAgICAgKnB3UnhUU0MxNV8wID0gY3B1X3RvX2xlMTYoTUFLRVdPUkQoKihwYnlJVisyKSwgKnBieUlWKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqcHdSeFRTQzE1XzAgPSBjcHVfdG9fbGUxNigqKFBXT1JEKXBieUlWKTsKKyAgICAgICAgICAgICpwd1J4VFNDMTVfMCA9IGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKilwYnlJVik7CiAgICAgICAgIH0KICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJUU0MwXzE1OiAleFxuIiwgKnB3UnhUU0MxNV8wKTsKIAogICAgICAgICBpZiAoYnlEZWNNb2RlID09IEtFWV9DVExfVEtJUCkgewogCi0gICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJ5TG9jYWxJRCA8PSBSRVZfSURfVlQzMjUzX0ExKSB8fCAoYk9uRmx5ID09IEZBTFNFKSkgeworICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5ieUxvY2FsSUQgPD0gUkVWX0lEX1ZUMzI1M19BMSkgfHwgKGJPbkZseSA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICAvLyBTb2Z0d2FyZSBUS0lQCiAgICAgICAgICAgICAgICAgLy8gMS4gMzI1MyBBCiAgICAgICAgICAgICAgICAgLy8gMi4gTm90T25GbHkKQEAgLTE0MTcsNyArMTM5Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYnlEZWNNb2RlID09IEtFWV9DVExfQ0NNUCkgewotICAgICAgICAgICAgaWYgKGJPbkZseSA9PSBGQUxTRSkgeworICAgICAgICAgICAgaWYgKGJPbkZseSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIC8vIFNvZnR3YXJlIENDTVAKICAgICAgICAgICAgICAgICAvLyBOb3RPbkZseQogICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8ic29mdCBLRVlfQ1RMX0NDTVBcbiIpOwpAQCAtMTQzMywzNCArMTQxMywzNCBAQAogICAgIH0vLyBlbmQgb2YgVEtJUC9BRVMKIAogICAgIGlmICgoKihwYnlJViszKSAmIDB4MjApICE9IDApCi0gICAgICAgICpwYkV4dElWID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgKnBiRXh0SVYgPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogfQogCiAKIAotc3RhdGljIEJPT0wgc19iQVBNb2RlUnhEYXRhICgKK3N0YXRpYyBib29sIHNfYkFQTW9kZVJ4RGF0YSAoCiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBzdHJ1Y3Qgc2tfYnVmZiogc2tiLAotICAgIFVJTlQgICAgIEZyYW1lU2l6ZSwKLSAgICBVSU5UICAgICBjYkhlYWRlck9mZnNldCwKLSAgICBJTlQgICAgICBpU0FOb2RlSW5kZXgsCi0gICAgSU5UICAgICAgaURBTm9kZUluZGV4CisgICAgdW5zaWduZWQgaW50IEZyYW1lU2l6ZSwKKyAgICB1bnNpZ25lZCBpbnQgY2JIZWFkZXJPZmZzZXQsCisgICAgaW50ICAgICAgaVNBTm9kZUluZGV4LAorICAgIGludCAgICAgIGlEQU5vZGVJbmRleAogICAgICkKIHsKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICBiUmVsYXlBbmRGb3J3YXJkID0gRkFMU0U7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICBiUmVsYXlPbmx5ID0gRkFMU0U7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieU1hc2tbOF0gPSB7MSwgMiwgNCwgOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci0gICAgV09SRCAgICAgICAgICAgICAgICB3QUlEOworICAgIGJvb2wgYlJlbGF5QW5kRm9yd2FyZCA9IGZhbHNlOworICAgIGJvb2wgYlJlbGF5T25seSA9IGZhbHNlOworICAgIHVuc2lnbmVkIGNoYXIgYnlNYXNrWzhdID0gezEsIDIsIDQsIDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworICAgIHVuc2lnbmVkIHNob3J0IHdBSUQ7CiAKIAogICAgIHN0cnVjdCBza19idWZmKiBza2JjcHkgPSBOVUxMOwogCiAgICAgaWYgKEZyYW1lU2l6ZSA+IENCX01BWF9CVUZfU0laRSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgLy8gY2hlY2sgREEKLSAgICBpZihJU19NVUxUSUNBU1RfQUREUkVTUygoUEJZVEUpKHNrYi0+ZGF0YStjYkhlYWRlck9mZnNldCkpKSB7CisgICAgaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5kYXRhK2NiSGVhZGVyT2Zmc2V0KSkpIHsKICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpIHsKIAogICAgICAgICAgICBza2JjcHkgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcERldmljZS0+cnhfYnVmX3N6KTsKQEAgLTE0ODEsMTIgKzE0NjEsMTIgQEAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgYlJlbGF5QW5kRm9yd2FyZCA9IFRSVUU7CisgICAgICAgICAgIGJSZWxheUFuZEZvcndhcmQgPSB0cnVlOwogICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIC8vIGNoZWNrIGlmIHJlbGF5Ci0gICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCAoUEJZVEUpKHNrYi0+ZGF0YStjYkhlYWRlck9mZnNldCksICZpREFOb2RlSW5kZXgpKSB7CisgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCAodW5zaWduZWQgY2hhciAqKShza2ItPmRhdGErY2JIZWFkZXJPZmZzZXQpLCAmaURBTm9kZUluZGV4KSkgewogICAgICAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbaURBTm9kZUluZGV4XS5lTm9kZVN0YXRlID49IE5PREVfQVNTT0MpIHsKICAgICAgICAgICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVtpREFOb2RlSW5kZXhdLmJQU0VuYWJsZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGlzIHNrYiB1bnRpbCBuZXh0IFBTIHR4LCBhbmQgdGhlbiByZWxlYXNlLgpAQCAtMTUwMCwxMCArMTQ4MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5UFNUeE1hcFt3QUlEID4+IDNdIHw9ICBieU1hc2tbd0FJRCAmIDddOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJyZWxheTogaW5kZXg9ICVkLCBwTWdtdC0+YWJ5UFNUeE1hcFslZF09ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEQU5vZGVJbmRleCwgKHdBSUQgPj4gMyksIHBNZ210LT5hYnlQU1R4TWFwW3dBSUQgPj4gM10pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiUmVsYXlPbmx5ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYlJlbGF5T25seSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtMTUxNSwxNiArMTQ5NSwxNiBAQAogICAgICAgICAgICAgaURBTm9kZUluZGV4ID0gMDsKIAogICAgICAgICBpZiAoKHBEZXZpY2UtPnVBc3NvY0NvdW50ID4gMSkgJiYgKGlEQU5vZGVJbmRleCA+PSAwKSkgewotICAgICAgICAgICAgUk9VVEViUmVsYXkocERldmljZSwgKFBCWVRFKShza2ItPmRhdGEgKyBjYkhlYWRlck9mZnNldCksIEZyYW1lU2l6ZSwgKFVJTlQpaURBTm9kZUluZGV4KTsKKyAgICAgICAgICAgIFJPVVRFYlJlbGF5KHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyICopKHNrYi0+ZGF0YSArIGNiSGVhZGVyT2Zmc2V0KSwgRnJhbWVTaXplLCAodW5zaWduZWQgaW50KWlEQU5vZGVJbmRleCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYlJlbGF5T25seSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gbm9uZSBhc3NvY2lhdGUsIGRvbid0IGZvcndhcmQKICAgICBpZiAocERldmljZS0+dUFzc29jQ291bnQgPT0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmgKaW5kZXggZTU3NDk2My4uYzFiNmU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5oCkBAIC00MSw3ICs0MSw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUJPT0wKK2Jvb2wKIGRldmljZV9yZWNlaXZlX2ZyYW1lICgKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTUnhEZXNjIHBDdXJyUkQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaG9zdGFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2hvc3RhcC5jCmluZGV4IDE5NWNjMzYuLjViODNmOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaG9zdGFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9ob3N0YXAuYwpAQCAtMTU0LDkgKzE1NCw5IEBACiAJfQogCWtmcmVlKHBEZXZpY2UtPmFwZGV2KTsKIAlwRGV2aWNlLT5hcGRldiA9IE5VTEw7Ci0gICAgcERldmljZS0+YkVuYWJsZTgwMjF4ID0gRkFMU0U7Ci0gICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBGQUxTRTsKLSAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IEZBTFNFOworICAgIHBEZXZpY2UtPmJFbmFibGU4MDIxeCA9IGZhbHNlOworICAgIHBEZXZpY2UtPmJFbmFibGVIb3N0V0VQID0gZmFsc2U7CisgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBmYWxzZTsKIAogLy80LjIwMDctMDExOC0wMyw8QWRkPiBieSBFaW5zbkxpdQogLy9leGVjdXRlIHNvbWUgY2xlYXIgd29yawpAQCAtMjE1LDcgKzIxNSw3IEBACiBzdGF0aWMgaW50IGhvc3RhcF9yZW1vdmVfc3RhKFBTRGV2aWNlIHBEZXZpY2UsCiAJCQkJICAgICBzdHJ1Y3Qgdmlhd2dldF9ob3N0YXBkX3BhcmFtICpwYXJhbSkKIHsKLQlVSU5UIHVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IHVOb2RlSW5kZXg7CiAKIAogICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBEZXZpY2UtPnBNZ210LCBwYXJhbS0+c3RhX2FkZHIsICZ1Tm9kZUluZGV4KSkgewpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCQkJICBzdHJ1Y3Qgdmlhd2dldF9ob3N0YXBkX3BhcmFtICpwYXJhbSkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLQlVSU5UIHVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IHVOb2RlSW5kZXg7CiAKIAogICAgIGlmICghQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgcGFyYW0tPnN0YV9hZGRyLCAmdU5vZGVJbmRleCkpIHsKQEAgLTI1NSw3ICsyNTUsNyBAQAogICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud0NhcEluZm8gPSBwYXJhbS0+dS5hZGRfc3RhLmNhcGFiaWxpdHk7CiAvLyBUT0RPIGxpc3RlbkludGVydmFsCiAvLyAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndMaXN0ZW5JbnRlcnZhbCA9IDE7Ci0gICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iUFNFbmFibGUgPSBGQUxTRTsKKyAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJQU0VuYWJsZSA9IGZhbHNlOwogICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uYnlTdXBwUmF0ZSA9IHBhcmFtLT51LmFkZF9zdGEudHhfc3VwcF9yYXRlczsKIAogICAgIC8vIHNldCBtYXggdHggcmF0ZQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iU2hvcnRQcmVhbWJsZSA9CiAgICAgICAgICAgICBXTEFOX0dFVF9DQVBfSU5GT19TSE9SVFBSRUFNQkxFKHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud0NhcEluZm8pOwogCi0gICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53QUlEID0gKFdPUkQpcGFyYW0tPnUuYWRkX3N0YS5haWQ7CisgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53QUlEID0gKHVuc2lnbmVkIHNob3J0KXBhcmFtLT51LmFkZF9zdGEuYWlkOwogCiAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS51bExhc3RSeEppZmZlciA9IGppZmZpZXM7CiAKQEAgLTMwNCw3ICszMDQsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3Qgdmlhd2dldF9ob3N0YXBkX3BhcmFtICpwYXJhbSkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLQlVSU5UIHVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IHVOb2RlSW5kZXg7CiAKICAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgcGFyYW0tPnN0YV9hZGRyLCAmdU5vZGVJbmRleCkpIHsKIAkgICAgcGFyYW0tPnUuZ2V0X2luZm9fc3RhLmluYWN0aXZlX3NlYyA9CkBAIC0zMjgsNyArMzI4LDcgQEAKICAqICAgICAgcERldmljZSAgIC0KICAqICAgICAgcGFyYW0gICAgIC0KICAqICBPdXQ6Ci0gKiAgICAgIFRVUkUsIEZBTFNFCisgKiAgICAgIHRydWUsIGZhbHNlCiAgKgogICogUmV0dXJuIFZhbHVlOgogICoKQEAgLTMzOCw3ICszMzgsNyBAQAogCQkJCQkgIHN0cnVjdCB2aWF3Z2V0X2hvc3RhcGRfcGFyYW0gKnBhcmFtKQogewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwotCVVJTlQgdU5vZGVJbmRleDsKKwl1bnNpZ25lZCBpbnQgdU5vZGVJbmRleDsKIAogICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBwYXJhbS0+c3RhX2FkZHIsICZ1Tm9kZUluZGV4KSkgewogICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLnVUeEF0dGVtcHRzID0gMDsKQEAgLTM2OCwxMyArMzY4LDEzIEBACiAJCQkJCXN0cnVjdCB2aWF3Z2V0X2hvc3RhcGRfcGFyYW0gKnBhcmFtKQogewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwotCVVJTlQgdU5vZGVJbmRleDsKKwl1bnNpZ25lZCBpbnQgdU5vZGVJbmRleDsKIAogICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBwYXJhbS0+c3RhX2FkZHIsICZ1Tm9kZUluZGV4KSkgewogCQlwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3RmxhZ3MgfD0gcGFyYW0tPnUuc2V0X2ZsYWdzX3N0YS5mbGFnc19vcjsKIAkJcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5kd0ZsYWdzICY9IHBhcmFtLT51LnNldF9mbGFnc19zdGEuZmxhZ3NfYW5kOwogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIgZHdGbGFncyA9ICV4IFxuIiwKLQkJICAgICAgICAgICAgKFVJTlQpcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5kd0ZsYWdzKTsKKwkJICAgICAgICAgICAgKHVuc2lnbmVkIGludClwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3RmxhZ3MpOwogCX0KIAllbHNlIHsKIAkgICAgcmV0dXJuIC1FTk9FTlQ7CkBAIC00NzEsMTYgKzQ3MSwxNiBAQAogCQkJCSAgICAgICBpbnQgcGFyYW1fbGVuKQogewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwotICAgIERXT1JEICAgZHdLZXlJbmRleCA9IDA7Ci0gICAgQllURSAgICBhYnlLZXlbTUFYX0tFWV9MRU5dOwotICAgIEJZVEUgICAgYWJ5U2VxW01BWF9LRVlfTEVOXTsKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5S2V5W01BWF9LRVlfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVNlcVtNQVhfS0VZX0xFTl07CiAgICAgTkRJU184MDJfMTFfS0VZX1JTQyAgIEtleVJTQzsKLSAgICBCWVRFICAgIGJ5S2V5RGVjTW9kZSA9IEtFWV9DVExfV0VQOworICAgIHVuc2lnbmVkIGNoYXIgYnlLZXlEZWNNb2RlID0gS0VZX0NUTF9XRVA7CiAJaW50ICAgICByZXQgPSAwOwogCWludCAgICAgaU5vZGVJbmRleCA9IC0xOwogCWludCAgICAgaWk7Ci0JQk9PTCAgICBiS2V5VGFibGVGdWxsID0gRkFMU0U7Ci0JV09SRCAgICB3S2V5Q3RsID0gMDsKKwlib29sIGJLZXlUYWJsZUZ1bGwgPSBmYWxzZTsKKwl1bnNpZ25lZCBzaG9ydCB3S2V5Q3RsID0gMDsKIAogCiAJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKQEAgLTUwOSw3ICs1MDksNyBAQAogICAgICAgICBpTm9kZUluZGV4ID0gMDsKIAogCX0gZWxzZSB7Ci0JICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBwYXJhbS0+c3RhX2FkZHIsICZpTm9kZUluZGV4KSA9PSBGQUxTRSkgeworCSAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgcGFyYW0tPnN0YV9hZGRyLCAmaU5vZGVJbmRleCkgPT0gZmFsc2UpIHsKIAkgICAgICAgIHBhcmFtLT51LmNyeXB0LmVyciA9IEhPU1RBUF9DUllQVF9FUlJfVU5LTk9XTl9BRERSOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiIEhPU1RBUF9DUllQVF9FUlJfVU5LTk9XTl9BRERSXG4iKTsKIAkgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNTIwLDE0ICs1MjAsMTQgQEAKIAogCWlmIChwYXJhbS0+dS5jcnlwdC5hbGcgPT0gV1BBX0FMR19OT05FKSB7CiAKLSAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbaU5vZGVJbmRleF0uYk9uRmx5ID09IFRSVUUpIHsKKyAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbaU5vZGVJbmRleF0uYk9uRmx5ID09IHRydWUpIHsKICAgICAgICAgICAgIGlmIChLZXliUmVtb3ZlS2V5KCYocERldmljZS0+c0tleSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zdGFfYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5kd0tleUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0KSA9PSBGQUxTRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0KSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIktleWJSZW1vdmVLZXkgZmFpbCBcbiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSBGQUxTRTsKKyAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbaU5vZGVJbmRleF0uYk9uRmx5ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5ieUtleUluZGV4ID0gMDsKICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5kd0tleUluZGV4ID0gMDsKQEAgLTU1MywxNiArNTUzLDE2IEBACiAgICAgICAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuCiAgICAgICAgICAgICk7CiAKLSAgICBkd0tleUluZGV4ID0gKERXT1JEKShwYXJhbS0+dS5jcnlwdC5pZHgpOworICAgIGR3S2V5SW5kZXggPSAodW5zaWduZWQgbG9uZykocGFyYW0tPnUuY3J5cHQuaWR4KTsKICAgICBpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBIT1NUQVBfQ1JZUFRfRkxBR19TRVRfVFhfS0VZKSB7Ci0gICAgICAgIHBEZXZpY2UtPmJ5S2V5SW5kZXggPSAoQllURSlkd0tleUluZGV4OwotICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gKHVuc2lnbmVkIGNoYXIpZHdLZXlJbmRleDsKKyAgICAgICAgcERldmljZS0+YlRyYW5zbWl0S2V5ID0gdHJ1ZTsKICAgICAgICAgZHdLZXlJbmRleCB8PSAoMSA8PCAzMSk7CiAgICAgfQogCiAJaWYgKHBhcmFtLT51LmNyeXB0LmFsZyA9PSBXUEFfQUxHX1dFUCkgewogCi0gICAgICAgIGlmICgocERldmljZS0+YkVuYWJsZTgwMjF4ID09IEZBTFNFKSB8fCAoaU5vZGVJbmRleCA9PSAwKSkgeworICAgICAgICBpZiAoKHBEZXZpY2UtPmJFbmFibGU4MDIxeCA9PSBmYWxzZSkgfHwgKGlOb2RlSW5kZXggPT0gMCkpIHsKICAgICAgICAgICAgIEtleWJTZXREZWZhdWx0S2V5KCYocERldmljZS0+c0tleSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3S2V5SW5kZXggJiB+KEJJVDMwIHwgVVNFX0tFWVJTQyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sCkBAIC01ODAsMjEgKzU4MCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdLZXlJbmRleCAmIH4oVVNFX0tFWVJTQyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBRV09SRCkgJihLZXlSU0MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKWFieUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopYWJ5S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9DVExfV0VQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPlBvcnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlMb2NhbElEKSA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlMb2NhbElEKSA9PSB0cnVlKSB7CiAKLSAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lOb2RlSW5kZXhdLmJPbkZseSA9IFRSVUU7CisgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSB0cnVlOwogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIEtleSBUYWJsZSBGdWxsCi0gICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBiS2V5VGFibGVGdWxsID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lOb2RlSW5kZXhdLmJPbkZseSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJLZXlUYWJsZUZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLSAgICAgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IHRydWU7CiAgICAgICAgIHBNZ210LT5ieUNTU1BLID0gS0VZX0NUTF9XRVA7CiAgICAgICAgIHBNZ210LT5ieUNTU0dLID0gS0VZX0NUTF9XRVA7CiAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbaU5vZGVJbmRleF0uYnlDaXBoZXJTdWl0ZSA9IEtFWV9DVExfV0VQOwpAQCAtNjQwLDcgKzY0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieUtleURlY01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlMb2NhbElEKTsKLSAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lOb2RlSW5kZXhdLmJPbkZseSA9IFRSVUU7CisgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSB0cnVlOwogCiAgICAgfSBlbHNlIHsKICAgICAgICAgZHdLZXlJbmRleCB8PSAoMSA8PCAzMCk7IC8vIHNldCBwYWlyd2lzZSBrZXkKQEAgLTY0OSwyMyArNjQ5LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGR3S2V5SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIChQUVdPUkQpICYoS2V5UlNDKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKWFieUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilhYnlLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICBieUtleURlY01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlMb2NhbElEKSA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUxvY2FsSUQpID09IHRydWUpIHsKIAotICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSBUUlVFOworICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSB0cnVlOwogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBLZXkgVGFibGUgRnVsbAotICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSBGQUxTRTsKLSAgICAgICAgICAgIGJLZXlUYWJsZUZ1bGwgPSBUUlVFOworICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5iT25GbHkgPSBmYWxzZTsKKyAgICAgICAgICAgIGJLZXlUYWJsZUZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiIEtleSBUYWJsZSBGdWxsXG4iKTsKICAgICAgICAgfQogCiAgICAgfQogCi0gICAgaWYgKGJLZXlUYWJsZUZ1bGwgPT0gVFJVRSkgeworICAgIGlmIChiS2V5VGFibGVGdWxsID09IHRydWUpIHsKICAgICAgICAgd0tleUN0bCAmPSAweDdGMDA7ICAgICAgICAgICAgICAvLyBjbGVhciBhbGwga2V5IGNvbnRyb2wgZmlsZWQKICAgICAgICAgd0tleUN0bCB8PSAoYnlLZXlEZWNNb2RlIDw8IDQpOwogICAgICAgICB3S2V5Q3RsIHw9IChieUtleURlY01vZGUpOwpAQCAtNjg2LDcgKzY4Niw3IEBACiAgICAgICAgICAgICAgICk7CiAKIAkvLyBzZXQgd2VwIGtleQotICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gVFJVRTsKKyAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IHRydWU7CiAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5ieUNpcGhlclN1aXRlID0gYnlLZXlEZWNNb2RlOwogICAgIHBNZ210LT5zTm9kZURCVGFibGVbaU5vZGVJbmRleF0uZHdLZXlJbmRleCA9IGR3S2V5SW5kZXg7CiAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5kd1RTQzQ3XzE2ID0gMDsKQEAgLTcyNyw3ICs3MjcsNyBAQAogCSAgICBwYXJhbS0+c3RhX2FkZHJbNF0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbNV0gPT0gMHhmZikgewogICAgICAgICBpTm9kZUluZGV4ID0gMDsKIAl9IGVsc2UgewotCSAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgcGFyYW0tPnN0YV9hZGRyLCAmaU5vZGVJbmRleCkgPT0gRkFMU0UpIHsKKwkgICAgaWYgKEJTU0RCYklzU1RBSW5Ob2RlREIocE1nbXQsIHBhcmFtLT5zdGFfYWRkciwgJmlOb2RlSW5kZXgpID09IGZhbHNlKSB7CiAJICAgICAgICBwYXJhbS0+dS5jcnlwdC5lcnIgPSBIT1NUQVBfQ1JZUFRfRVJSX1VOS05PV05fQUREUjsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImhvc3RhcF9nZXRfZW5jcnlwdGlvbjogSE9TVEFQX0NSWVBUX0VSUl9VTktOT1dOX0FERFJcbiIpOwogCSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC03MzYsNyArNzM2LDcgQEAKIAlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJob3N0YXBfZ2V0X2VuY3J5cHRpb246ICVkXG4iLCBpTm9kZUluZGV4KTsKICAgICBtZW1zZXQocGFyYW0tPnUuY3J5cHQuc2VxLCAwLCA4KTsKICAgICBmb3IgKGlpID0gMCA7IGlpIDwgOCA7IGlpKyspIHsKLSAgICAgICAgcGFyYW0tPnUuY3J5cHQuc2VxW2lpXSA9IChCWVRFKXBNZ210LT5zTm9kZURCVGFibGVbaU5vZGVJbmRleF0uS2V5UlNDID4+IChpaSAqIDgpOworICAgICAgICBwYXJhbS0+dS5jcnlwdC5zZXFbaWldID0gKHVuc2lnbmVkIGNoYXIpcE1nbXQtPnNOb2RlREJUYWJsZVtpTm9kZUluZGV4XS5LZXlSU0MgPj4gKGlpICogOCk7CiAgICAgfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jbWQuaAppbmRleCA2MGMwYTM2Li41M2M1MGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2NtZC5oCkBAIC0zNyw3ICszNyw2IEBACiAjZGVmaW5lIERFRgogI2VuZGlmCiAKLS8vdHlwZWRlZiBpbnQgQk9PTDsKIC8vdHlwZWRlZiB1aW50MzJfdCB1MzI7CiAvL3R5cGVkZWYgdWludDE2X3QgdTE2OwogLy90eXBlZGVmIHVpbnQ4X3QgdTg7CkBAIC0xMDksMTAgKzEwOCwxMCBAQAogLy8KICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnU0NtZFJlcXVlc3QgewotCVU4IAkgICAgbmFtZVsxNl07CisJdTgJICAgIG5hbWVbMTZdOwogCXZvaWQJKmRhdGE7Ci0JVTE2CSAgICB3UmVzdWx0OwotCVUxNiAgICAgd0NtZENvZGU7CisJdTE2CSAgICB3UmVzdWx0OworCXUxNiAgICAgd0NtZENvZGU7CiB9IFNDbWRSZXF1ZXN0LCAqUFNDbWRSZXF1ZXN0OwogCiAvLwpAQCAtMTIxLDcgKzEyMCw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDbWRTY2FuIHsKIAotICAgIFU4CSAgICBzc2lkW1NTSURfTUFYTEVOICsgMl07CisJdTggc3NpZFtTU0lEX01BWExFTiArIDJdOwogCiB9IFNDbWRTY2FuLCAqUFNDbWRTY2FuOwogCkBAIC0xMzIsMTIgKzEzMSwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTQ21kQlNTSm9pbiB7CiAKLSAgICBVMTYJICAgIHdCU1NUeXBlOwotICAgIFUxNiAgICAgd0JCUFR5cGU7Ci0gICAgVTgJICAgIHNzaWRbU1NJRF9NQVhMRU4gKyAyXTsKLSAgICBVMzIJICAgIHVDaGFubmVsOwotICAgIEJPT0wgICAgYlBTRW5hYmxlOwotICAgIEJPT0wgICAgYlNoYXJlS2V5QXV0aDsKKyAgICB1MTYJICAgIHdCU1NUeXBlOworICAgIHUxNiAgICAgd0JCUFR5cGU7CisgICAgdTgJICAgIHNzaWRbU1NJRF9NQVhMRU4gKyAyXTsKKyAgICB1MzIJICAgIHVDaGFubmVsOworICAgIGJvb2wgYlBTRW5hYmxlOworICAgIGJvb2wgYlNoYXJlS2V5QXV0aDsKIAogfSBTQ21kQlNTSm9pbiwgKlBTQ21kQlNTSm9pbjsKIApAQCAtMTQ3LDcgKzE0Niw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDbWRab25lVHlwZVNldCB7CiAKLSBCT09MICAgICAgIGJXcml0ZTsKKyBib29sIGJXcml0ZTsKICBXWk9ORVRZUEUgIFpvbmVUeXBlOwogCiB9IFNDbWRab25lVHlwZVNldCwgKlBTQ21kWm9uZVR5cGVTZXQ7CkBAIC0xNTUsMzMgKzE1NCwzMyBAQAogI2lmZGVmIFdQQV9TTV9UcmFuc3RhdHVzCiB0eXBlZGVmIHN0cnVjdCB0YWdTV1BBUmVzdWx0IHsKICAgICAgICAgIGNoYXIJaWZuYW1lWzEwMF07Ci0gICAgICAgICBVOAkJcHJvdG87Ci0gICAgICAgICBVOCAgIGtleV9tZ210OwotICAgICAgICAgVTggICBlYXBfdHlwZTsKLSAgICAgICAgIEJPT0wgYXV0aGVudGljYXRlZDsKKyAgICAgICAgIHU4IHByb3RvOworICAgICAgICAgdTgga2V5X21nbXQ7CisgICAgICAgICB1OCBlYXBfdHlwZTsKKyAgICAgICAgIGJvb2wgYXV0aGVudGljYXRlZDsKIH0gU1dQQVJlc3VsdCwgKlBTV1BBUmVzdWx0OwogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDbWRTdGFydEFQIHsKIAotICAgIFUxNgkgICAgd0JTU1R5cGU7Ci0gICAgVTE2ICAgICB3QkJQVHlwZTsKLSAgICBVOAkgICAgc3NpZFtTU0lEX01BWExFTiArIDJdOwotICAgIFUzMiAJdUNoYW5uZWw7Ci0gICAgVTMyICAgICB1QmVhY29uSW50OwotICAgIEJPT0wgICAgYlNoYXJlS2V5QXV0aDsKLSAgICBVOCAgICAgIGJ5QmFzaWNSYXRlOworICAgIHUxNgkgICAgd0JTU1R5cGU7CisgICAgdTE2ICAgICB3QkJQVHlwZTsKKyAgICB1OAkgICAgc3NpZFtTU0lEX01BWExFTiArIDJdOworICAgIHUzMgkgICAgdUNoYW5uZWw7CisgICAgdTMyICAgICB1QmVhY29uSW50OworICAgIGJvb2wgYlNoYXJlS2V5QXV0aDsKKyAgICB1OCAgICAgIGJ5QmFzaWNSYXRlOwogCiB9IFNDbWRTdGFydEFQLCAqUFNDbWRTdGFydEFQOwogCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDbWRTZXRXRVAgewogCi0gICAgQk9PTCAgICBiRW5hYmxlV2VwOwotICAgIFU4ICAgICAgYnlLZXlJbmRleDsKLSAgICBVOCAgICAgIGFieVdlcEtleVtXRVBfTktFWVNdW1dFUF9LRVlNQVhMRU5dOwotICAgIEJPT0wgICAgYldlcEtleUF2YWlsYWJsZVtXRVBfTktFWVNdOwotICAgIFUzMiAgICAgYXVXZXBLZXlMZW5ndGhbV0VQX05LRVlTXTsKKyAgICBib29sIGJFbmFibGVXZXA7CisgICAgdTggICAgICBieUtleUluZGV4OworICAgIHU4ICAgICAgYWJ5V2VwS2V5W1dFUF9OS0VZU11bV0VQX0tFWU1BWExFTl07CisgICAgYm9vbCBiV2VwS2V5QXZhaWxhYmxlW1dFUF9OS0VZU107CisgICAgdTMyICAgICBhdVdlcEtleUxlbmd0aFtXRVBfTktFWVNdOwogCiB9IFNDbWRTZXRXRVAsICpQU0NtZFNldFdFUDsKIApAQCAtMTg5LDM5ICsxODgsMzkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0JTU0lESXRlbSB7CiAKLQlVMzIJICAgIHVDaGFubmVsOwotICAgIFU4ICAgICAgYWJ5QlNTSURbQlNTSURfTEVOXTsKLSAgICBVOCAgICAgIGFieVNTSURbU1NJRF9NQVhMRU4gKyAxXTsKKwl1MzIJICAgIHVDaGFubmVsOworICAgIHU4ICAgICAgYWJ5QlNTSURbQlNTSURfTEVOXTsKKyAgICB1OCAgICAgIGFieVNTSURbU1NJRF9NQVhMRU4gKyAxXTsKICAgICAvLzIwMDYtMTExNi0wMSw8TW9kaWZ5PiBieSBOb21hZFpoYW8KLSAgICAvL1UxNgkgICAgd0JlYWNvbkludGVydmFsOwotICAgIC8vVTE2CSAgICB3Q2FwSW5mbzsKLSAgICAvL1U4ICAgICAgYnlOZXRUeXBlOwotICAgIFU4ICAgICAgYnlOZXRUeXBlOwotICAgIFUxNgkgICAgd0JlYWNvbkludGVydmFsOwotICAgIFUxNgkgICAgd0NhcEluZm87ICAgICAgICAvLyBmb3IgYWRkcmVzcyBvZiBieU5ldFR5cGUgYXQgYWxpZ24gNAorICAgIC8vdTE2CSAgICB3QmVhY29uSW50ZXJ2YWw7CisgICAgLy91MTYJICAgIHdDYXBJbmZvOworICAgIC8vdTggICAgICBieU5ldFR5cGU7CisgICAgdTggICAgICBieU5ldFR5cGU7CisgICAgdTE2CSAgICB3QmVhY29uSW50ZXJ2YWw7CisgICAgdTE2CSAgICB3Q2FwSW5mbzsgICAgICAgIC8vIGZvciBhZGRyZXNzIG9mIGJ5TmV0VHlwZSBhdCBhbGlnbiA0CiAKLSAgICBCT09MICAgIGJXRVBPbjsKLSAgICBVMzIgICAgIHVSU1NJOworICAgIGJvb2wgYldFUE9uOworICAgIHUzMiAgICAgdVJTU0k7CiAKIH0gU0JTU0lESXRlbTsKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTQlNTSURMaXN0IHsKIAotCVUzMgkJICAgIHVJdGVtOworCXUzMgkJICAgIHVJdGVtOwogCVNCU1NJREl0ZW0Jc0JTU0lETGlzdFswXTsKIH0gU0JTU0lETGlzdCwgKlBTQlNTSURMaXN0OwogCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDbWRMaW5rU3RhdHVzIHsKIAotICAgIEJPT0wgICAgYkxpbms7Ci0JVTE2CSAgICB3QlNTVHlwZTsKLQlVOCAgICAgIGJ5U3RhdGU7Ci0gICAgVTggICAgICBhYnlCU1NJRFtCU1NJRF9MRU5dOwotICAgIFU4ICAgICAgYWJ5U1NJRFtTU0lEX01BWExFTiArIDJdOwotICAgIFUzMiAgICAgdUNoYW5uZWw7Ci0gICAgVTMyICAgICB1TGlua1JhdGU7CisgICAgYm9vbCBiTGluazsKKwl1MTYgICB3QlNTVHlwZTsKKwl1OCAgICAgIGJ5U3RhdGU7CisgICAgdTggICAgICBhYnlCU1NJRFtCU1NJRF9MRU5dOworICAgIHU4ICAgICAgYWJ5U1NJRFtTU0lEX01BWExFTiArIDJdOworICAgIHUzMiAgICAgdUNoYW5uZWw7CisgICAgdTMyICAgICB1TGlua1JhdGU7CiAKIH0gU0NtZExpbmtTdGF0dXMsICpQU0NtZExpbmtTdGF0dXM7CiAKQEAgLTIyOSwxOCArMjI4LDE4IEBACiAvLyA4MDIuMTEgY291bnRlcgogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1NEb3QxMU1JQkNvdW50IHsKLSAgICBVMzIgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotICAgIFUzMiBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7Ci0gICAgVTMyIEZhaWxlZENvdW50OwotICAgIFUzMiBSZXRyeUNvdW50OwotICAgIFUzMiBNdWx0aXBsZVJldHJ5Q291bnQ7Ci0gICAgVTMyIFJUU1N1Y2Nlc3NDb3VudDsKLSAgICBVMzIgUlRTRmFpbHVyZUNvdW50OwotICAgIFUzMiBBQ0tGYWlsdXJlQ291bnQ7Ci0gICAgVTMyIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICAgVTMyIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKLSAgICBVMzIgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OwotICAgIFUzMiBGQ1NFcnJvckNvdW50OworCXUzMiBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJdTMyIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKwl1MzIgRmFpbGVkQ291bnQ7CisJdTMyIFJldHJ5Q291bnQ7CisJdTMyIE11bHRpcGxlUmV0cnlDb3VudDsKKwl1MzIgUlRTU3VjY2Vzc0NvdW50OworCXUzMiBSVFNGYWlsdXJlQ291bnQ7CisJdTMyIEFDS0ZhaWx1cmVDb3VudDsKKwl1MzIgRnJhbWVEdXBsaWNhdGVDb3VudDsKKwl1MzIgUmVjZWl2ZWRGcmFnbWVudENvdW50OworCXUzMiBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisJdTMyIEZDU0Vycm9yQ291bnQ7CiB9IFNEb3QxMU1JQkNvdW50LCAqUFNEb3QxMU1JQkNvdW50OwogCiAKQEAgLTI1MiwxMjkgKzI1MSwxMjkgQEAKICAgICAvLwogICAgIC8vIElTUiBzdGF0dXMgY291bnQKICAgICAvLwotICAgIFUzMiAgIGR3SXNyVHgwT0s7Ci0gICAgVTMyICAgZHdJc3JUeDFPSzsKLSAgICBVMzIgICBkd0lzckJlYWNvblR4T0s7Ci0gICAgVTMyICAgZHdJc3JSeE9LOwotICAgIFUzMiAgIGR3SXNyVEJUVEludDsKLSAgICBVMzIgICBkd0lzclNUSU1FUkludDsKLSAgICBVMzIgICBkd0lzclVucmVjb3ZlcmFibGVFcnJvcjsKLSAgICBVMzIgICBkd0lzclNvZnRJbnRlcnJ1cHQ7Ci0gICAgVTMyICAgZHdJc3JSeE5vQnVmOworCXUzMiAgIGR3SXNyVHgwT0s7CisJdTMyICAgZHdJc3JUeDFPSzsKKwl1MzIgICBkd0lzckJlYWNvblR4T0s7CisJdTMyICAgZHdJc3JSeE9LOworCXUzMiAgIGR3SXNyVEJUVEludDsKKwl1MzIgICBkd0lzclNUSU1FUkludDsKKwl1MzIgICBkd0lzclVucmVjb3ZlcmFibGVFcnJvcjsKKwl1MzIgICBkd0lzclNvZnRJbnRlcnJ1cHQ7CisJdTMyICAgZHdJc3JSeE5vQnVmOwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIFUzMiAgIGR3SXNyVW5rbm93bjsgICAgICAgICAgICAgICAvLyB1bmtub3duIGludGVycnVwdCBjb3VudAorCXUzMiAgIGR3SXNyVW5rbm93bjsgICAgICAgICAgICAgICAvLyB1bmtub3duIGludGVycnVwdCBjb3VudAogCiAgICAgLy8gUlNSIHN0YXR1cyBjb3VudAogICAgIC8vCi0gICAgVTMyICAgZHdSc3JGcm1BbGduRXJyOwotICAgIFUzMiAgIGR3UnNyRXJyOwotICAgIFUzMiAgIGR3UnNyQ1JDRXJyOwotICAgIFUzMiAgIGR3UnNyQ1JDT2s7Ci0gICAgVTMyICAgZHdSc3JCU1NJRE9rOwotICAgIFUzMiAgIGR3UnNyQUREUk9rOwotICAgIFUzMiAgIGR3UnNySUNWT2s7Ci0gICAgVTMyICAgZHdOZXdSc3JTaG9ydFByZWFtYmxlOwotICAgIFUzMiAgIGR3UnNyTG9uZzsKLSAgICBVMzIgICBkd1JzclJ1bnQ7CisJdTMyICAgZHdSc3JGcm1BbGduRXJyOworCXUzMiAgIGR3UnNyRXJyOworCXUzMiAgIGR3UnNyQ1JDRXJyOworCXUzMiAgIGR3UnNyQ1JDT2s7CisJdTMyICAgZHdSc3JCU1NJRE9rOworCXUzMiAgIGR3UnNyQUREUk9rOworCXUzMiAgIGR3UnNySUNWT2s7CisJdTMyICAgZHdOZXdSc3JTaG9ydFByZWFtYmxlOworCXUzMiAgIGR3UnNyTG9uZzsKKwl1MzIgICBkd1JzclJ1bnQ7CiAKLSAgICBVMzIgICBkd1JzclJ4Q29udHJvbDsKLSAgICBVMzIgICBkd1JzclJ4RGF0YTsKLSAgICBVMzIgICBkd1JzclJ4TWFuYWdlOworCXUzMiAgIGR3UnNyUnhDb250cm9sOworCXUzMiAgIGR3UnNyUnhEYXRhOworCXUzMiAgIGR3UnNyUnhNYW5hZ2U7CiAKLSAgICBVMzIgICBkd1JzclJ4UGFja2V0OwotICAgIFUzMiAgIGR3UnNyUnhPY3RldDsKLSAgICBVMzIgICBkd1JzckJyb2FkY2FzdDsKLSAgICBVMzIgICBkd1Jzck11bHRpY2FzdDsKLSAgICBVMzIgICBkd1JzckRpcmVjdGVkOworCXUzMiAgIGR3UnNyUnhQYWNrZXQ7CisJdTMyICAgZHdSc3JSeE9jdGV0OworCXUzMiAgIGR3UnNyQnJvYWRjYXN0OworCXUzMiAgIGR3UnNyTXVsdGljYXN0OworCXUzMiAgIGR3UnNyRGlyZWN0ZWQ7CiAgICAgLy8gNjQtYml0IE9JRAotICAgIFUzMiAgIHVsbFJzck9LOworCXUzMiAgIHVsbFJzck9LOwogCiAgICAgLy8gZm9yIHNvbWUgb3B0aW9uYWwgT0lEcyAoNjQgYml0cykgYW5kIERNSSBzdXBwb3J0Ci0gICAgVTMyICAgdWxsUnhCcm9hZGNhc3RCeXRlczsKLSAgICBVMzIgICB1bGxSeE11bHRpY2FzdEJ5dGVzOwotICAgIFUzMiAgIHVsbFJ4RGlyZWN0ZWRCeXRlczsKLSAgICBVMzIgICB1bGxSeEJyb2FkY2FzdEZyYW1lczsKLSAgICBVMzIgICB1bGxSeE11bHRpY2FzdEZyYW1lczsKLSAgICBVMzIgICB1bGxSeERpcmVjdGVkRnJhbWVzOworCXUzMiAgIHVsbFJ4QnJvYWRjYXN0Qnl0ZXM7CisJdTMyICAgdWxsUnhNdWx0aWNhc3RCeXRlczsKKwl1MzIgICB1bGxSeERpcmVjdGVkQnl0ZXM7CisJdTMyICAgdWxsUnhCcm9hZGNhc3RGcmFtZXM7CisJdTMyICAgdWxsUnhNdWx0aWNhc3RGcmFtZXM7CisJdTMyICAgdWxsUnhEaXJlY3RlZEZyYW1lczsKIAotICAgIFUzMiAgIGR3UnNyUnhGcmFnbWVudDsKLSAgICBVMzIgICBkd1JzclJ4RnJtTGVuNjQ7Ci0gICAgVTMyICAgZHdSc3JSeEZybUxlbjY1XzEyNzsKLSAgICBVMzIgICBkd1JzclJ4RnJtTGVuMTI4XzI1NTsKLSAgICBVMzIgICBkd1JzclJ4RnJtTGVuMjU2XzUxMTsKLSAgICBVMzIgICBkd1JzclJ4RnJtTGVuNTEyXzEwMjM7Ci0gICAgVTMyICAgZHdSc3JSeEZybUxlbjEwMjRfMTUxODsKKwl1MzIgICBkd1JzclJ4RnJhZ21lbnQ7CisJdTMyICAgZHdSc3JSeEZybUxlbjY0OworCXUzMiAgIGR3UnNyUnhGcm1MZW42NV8xMjc7CisJdTMyICAgZHdSc3JSeEZybUxlbjEyOF8yNTU7CisJdTMyICAgZHdSc3JSeEZybUxlbjI1Nl81MTE7CisJdTMyICAgZHdSc3JSeEZybUxlbjUxMl8xMDIzOworCXUzMiAgIGR3UnNyUnhGcm1MZW4xMDI0XzE1MTg7CiAKICAgICAvLyBUU1IwLDEgc3RhdHVzIGNvdW50CiAgICAgLy8KLSAgICBVMzIgICBkd1RzclRvdGFsUmV0cnlbMl07ICAgICAgICAvLyB0b3RhbCBjb2xsaXNpb24gcmV0cnkgY291bnQKLSAgICBVMzIgICBkd1Rzck9uY2VSZXRyeVsyXTsgICAgICAgICAvLyB0aGlzIHBhY2tldCBvbmx5IG9jY3VyIG9uZSBjb2xsaXNpb24KLSAgICBVMzIgICBkd1Rzck1vcmVUaGFuT25jZVJldHJ5WzJdOyAvLyB0aGlzIHBhY2tldCBvY2N1ciBtb3JlIHRoYW4gb25lIGNvbGxpc2lvbgotICAgIFUzMiAgIGR3VHNyUmV0cnlbMl07ICAgICAgICAgICAgIC8vIHRoaXMgcGFja2V0IGhhcyBldmVyIG9jY3VyIGNvbGxpc2lvbiwKKwl1MzIgICBkd1RzclRvdGFsUmV0cnlbMl07ICAgICAgICAvLyB0b3RhbCBjb2xsaXNpb24gcmV0cnkgY291bnQKKwl1MzIgICBkd1Rzck9uY2VSZXRyeVsyXTsgICAgICAgICAvLyB0aGlzIHBhY2tldCBvbmx5IG9jY3VyIG9uZSBjb2xsaXNpb24KKwl1MzIgICBkd1Rzck1vcmVUaGFuT25jZVJldHJ5WzJdOyAvLyB0aGlzIHBhY2tldCBvY2N1ciBtb3JlIHRoYW4gb25lIGNvbGxpc2lvbgorCXUzMiAgIGR3VHNyUmV0cnlbMl07ICAgICAgICAgICAgIC8vIHRoaXMgcGFja2V0IGhhcyBldmVyIG9jY3VyIGNvbGxpc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaXMgKGR3VHNyT25jZUNvbGxpc2lvbjAgKyBkd1Rzck1vcmVUaGFuT25jZUNvbGxpc2lvbjApCi0gICAgVTMyICAgZHdUc3JBQ0tEYXRhWzJdOwotICAgIFUzMiAgIGR3VHNyRXJyWzJdOwotICAgIFUzMiAgIGR3QWxsVHNyT0tbMl07Ci0gICAgVTMyICAgZHdUc3JSZXRyeVRpbWVvdXRbMl07Ci0gICAgVTMyICAgZHdUc3JUcmFuc21pdFRpbWVvdXRbMl07CisJdTMyICAgZHdUc3JBQ0tEYXRhWzJdOworCXUzMiAgIGR3VHNyRXJyWzJdOworCXUzMiAgIGR3QWxsVHNyT0tbMl07CisJdTMyICAgZHdUc3JSZXRyeVRpbWVvdXRbMl07CisJdTMyICAgZHdUc3JUcmFuc21pdFRpbWVvdXRbMl07CiAKLSAgICBVMzIgICBkd1RzclR4UGFja2V0WzJdOwotICAgIFUzMiAgIGR3VHNyVHhPY3RldFsyXTsKLSAgICBVMzIgICBkd1RzckJyb2FkY2FzdFsyXTsKLSAgICBVMzIgICBkd1Rzck11bHRpY2FzdFsyXTsKLSAgICBVMzIgICBkd1RzckRpcmVjdGVkWzJdOworCXUzMiAgIGR3VHNyVHhQYWNrZXRbMl07CisJdTMyICAgZHdUc3JUeE9jdGV0WzJdOworCXUzMiAgIGR3VHNyQnJvYWRjYXN0WzJdOworCXUzMiAgIGR3VHNyTXVsdGljYXN0WzJdOworCXUzMiAgIGR3VHNyRGlyZWN0ZWRbMl07CiAKICAgICAvLyBSRC9URCBjb3VudAotICAgIFUzMiAgIGR3Q250UnhGcm1MZW5ndGg7Ci0gICAgVTMyICAgZHdDbnRUeEJ1Zkxlbmd0aDsKKwl1MzIgICBkd0NudFJ4RnJtTGVuZ3RoOworCXUzMiAgIGR3Q250VHhCdWZMZW5ndGg7CiAKLSAgICBVOCAgICBhYnlDbnRSeFBhdHRlcm5bMTZdOwotICAgIFU4ICAgIGFieUNudFR4UGF0dGVyblsxNl07CisJdTggICAgYWJ5Q250UnhQYXR0ZXJuWzE2XTsKKwl1OCAgICBhYnlDbnRUeFBhdHRlcm5bMTZdOwogCiAgICAgLy8gU29mdHdhcmUgY2hlY2suLi4uCi0gICAgVTMyICAgZHdDbnRSeERhdGFFcnI7ICAgICAgICAgICAgIC8vIHJ4IGJ1ZmZlciBkYXRhIHNvZnR3YXJlIGNvbXBhcmUgQ1JDIGVyciBjb3VudAotICAgIFUzMiAgIGR3Q250RGVjcnlwdEVycjsgICAgICAgICAgICAvLyByeCBidWZmZXIgZGF0YSBzb2Z0d2FyZSBjb21wYXJlIENSQyBlcnIgY291bnQKLSAgICBVMzIgICBkd0NudFJ4SUNWRXJyOyAgICAgICAgICAgICAgLy8gcnggYnVmZmVyIGRhdGEgc29mdHdhcmUgY29tcGFyZSBDUkMgZXJyIGNvdW50Ci0gICAgVTMyICAgIGlkeFJ4RXJyb3JEZXNjOyAgICAgICAgICAgICAvLyBpbmRleCBmb3IgcnggZGF0YSBlcnJvciBSRAorCXUzMiAgIGR3Q250UnhEYXRhRXJyOyAgICAgICAgICAgICAvLyByeCBidWZmZXIgZGF0YSBzb2Z0d2FyZSBjb21wYXJlIENSQyBlcnIgY291bnQKKwl1MzIgICBkd0NudERlY3J5cHRFcnI7ICAgICAgICAgICAgLy8gcnggYnVmZmVyIGRhdGEgc29mdHdhcmUgY29tcGFyZSBDUkMgZXJyIGNvdW50CisJdTMyICAgZHdDbnRSeElDVkVycjsgICAgICAgICAgICAgIC8vIHJ4IGJ1ZmZlciBkYXRhIHNvZnR3YXJlIGNvbXBhcmUgQ1JDIGVyciBjb3VudAorCXUzMiAgICBpZHhSeEVycm9yRGVzYzsgICAgICAgICAgICAgLy8gaW5kZXggZm9yIHJ4IGRhdGEgZXJyb3IgUkQKIAogICAgIC8vIDY0LWJpdCBPSUQKLSAgICBVMzIgICB1bGxUc3JPS1syXTsKKwl1MzIgICB1bGxUc3JPS1syXTsKIAogICAgIC8vIGZvciBzb21lIG9wdGlvbmFsIE9JRHMgKDY0IGJpdHMpIGFuZCBETUkgc3VwcG9ydAotICAgIFUzMiAgIHVsbFR4QnJvYWRjYXN0RnJhbWVzWzJdOwotICAgIFUzMiAgIHVsbFR4TXVsdGljYXN0RnJhbWVzWzJdOwotICAgIFUzMiAgIHVsbFR4RGlyZWN0ZWRGcmFtZXNbMl07Ci0gICAgVTMyICAgdWxsVHhCcm9hZGNhc3RCeXRlc1syXTsKLSAgICBVMzIgICB1bGxUeE11bHRpY2FzdEJ5dGVzWzJdOwotICAgIFUzMiAgIHVsbFR4RGlyZWN0ZWRCeXRlc1syXTsKKwl1MzIgICB1bGxUeEJyb2FkY2FzdEZyYW1lc1syXTsKKwl1MzIgICB1bGxUeE11bHRpY2FzdEZyYW1lc1syXTsKKwl1MzIgICB1bGxUeERpcmVjdGVkRnJhbWVzWzJdOworCXUzMiAgIHVsbFR4QnJvYWRjYXN0Qnl0ZXNbMl07CisJdTMyICAgdWxsVHhNdWx0aWNhc3RCeXRlc1syXTsKKwl1MzIgICB1bGxUeERpcmVjdGVkQnl0ZXNbMl07CiB9IFNTdGF0TUlCQ291bnQsICpQU1N0YXRNSUJDb3VudDsKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTTm9kZUl0ZW0gewogICAgIC8vIFNUQSBpbmZvCi0gICAgVTE2ICAgICAgICAgICAgd0FJRDsKLSAgICBVOCAgICAgICAgICAgICBhYnlNQUNBZGRyWzZdOwotICAgIFUxNiAgICAgICAgICAgIHdUeERhdGFSYXRlOwotICAgIFUxNiAgICAgICAgICAgIHdJbkFjdGl2ZUNvdW50OwotICAgIFUxNiAgICAgICAgICAgIHdFblF1ZXVlQ250OwotICAgIFUxNiAgICAgICAgICAgIHdGbGFnczsKLSAgICBCT09MICAgICAgICAgICBiUFdCaXRPbjsKLSAgICBVOCAgICAgICAgICAgICBieUtleUluZGV4OwotICAgIFUxNiAgICAgICAgICAgIHdXZXBLZXlMZW5ndGg7Ci0gICAgVTggICAgICAgICAgICBhYnlXZXBLZXlbV0VQX0tFWU1BWExFTl07CisgICAgdTE2ICAgICAgICAgICAgd0FJRDsKKyAgICB1OCAgICAgICAgICAgICBhYnlNQUNBZGRyWzZdOworICAgIHUxNiAgICAgICAgICAgIHdUeERhdGFSYXRlOworICAgIHUxNiAgICAgICAgICAgIHdJbkFjdGl2ZUNvdW50OworICAgIHUxNiAgICAgICAgICAgIHdFblF1ZXVlQ250OworICAgIHUxNiAgICAgICAgICAgIHdGbGFnczsKKyAgICBib29sIGJQV0JpdE9uOworICAgIHU4ICAgICAgICAgICAgIGJ5S2V5SW5kZXg7CisgICAgdTE2ICAgICAgICAgICAgd1dlcEtleUxlbmd0aDsKKyAgICB1OCAgICAgICAgICAgIGFieVdlcEtleVtXRVBfS0VZTUFYTEVOXTsKICAgICAvLyBBdXRvIHJhdGUgZmFsbGJhY2sgdmFycwotICAgIEJPT0wgICAgICAgICAgIGJJc0luRmFsbGJhY2s7Ci0gICAgVTMyICAgICAgICAgICAgdVR4RmFpbHVyZXM7Ci0gICAgVTMyICAgICAgICAgICAgdVR4QXR0ZW1wdHM7Ci0gICAgVTE2ICAgICAgICAgICAgd0ZhaWx1cmVSYXRpbzsKKyAgICBib29sIGJJc0luRmFsbGJhY2s7CisgICAgdTMyICAgICAgICAgICAgdVR4RmFpbHVyZXM7CisgICAgdTMyICAgICAgICAgICAgdVR4QXR0ZW1wdHM7CisgICAgdTE2ICAgICAgICAgICAgd0ZhaWx1cmVSYXRpbzsKIAogfSBTTm9kZUl0ZW07CiAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU05vZGVMaXN0IHsKIAotCVUzMgkJICAgIHVJdGVtOworCXUzMgkJICAgIHVJdGVtOwogCVNOb2RlSXRlbQlzTm9kZUxpc3RbMF07CiAKIH0gU05vZGVMaXN0LCAqUFNOb2RlTGlzdDsKQEAgLTM4Myw3ICszODIsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTQ21kVmFsdWUgewogCi0gICAgVTMyICAgICBkd1ZhbHVlOworCXUzMiBkd1ZhbHVlOwogCiB9IFNDbWRWYWx1ZSwgICpQU0NtZFZhbHVlOwogCkBAIC00MTgsNDYgKzQxNyw0NiBAQAogCiAKIHN0cnVjdCB2aWF3Z2V0X2hvc3RhcGRfcGFyYW0gewotCVUzMiBjbWQ7Ci0JVTggc3RhX2FkZHJbNl07CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcls2XTsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlVMTYgYWlkOwotCQkJVTE2IGNhcGFiaWxpdHk7Ci0JCQlVOCB0eF9zdXBwX3JhdGVzOworCQkJdTE2IGFpZDsKKwkJCXUxNiBjYXBhYmlsaXR5OworCQkJdTggdHhfc3VwcF9yYXRlczsKIAkJfSBhZGRfc3RhOwogCQlzdHJ1Y3QgewotCQkJVTMyIGluYWN0aXZlX3NlYzsKKwkJCXUzMiBpbmFjdGl2ZV9zZWM7CiAJCX0gZ2V0X2luZm9fc3RhOwogCQlzdHJ1Y3QgewotCQkJVTggYWxnOwotCQkJVTMyIGZsYWdzOwotCQkJVTMyIGVycjsKLQkJCVU4IGlkeDsKLQkJCVU4IHNlcVs4XTsKLQkJCVUxNiBrZXlfbGVuOwotCQkJVTgga2V5WzBdOworCQkJdTggYWxnOworCQkJdTMyIGZsYWdzOworCQkJdTMyIGVycjsKKwkJCXU4IGlkeDsKKwkJCXU4IHNlcVs4XTsKKwkJCXUxNiBrZXlfbGVuOworCQkJdTgga2V5WzBdOwogCQl9IGNyeXB0OwogCQlzdHJ1Y3QgewotCQkJVTMyIGZsYWdzX2FuZDsKLQkJCVUzMiBmbGFnc19vcjsKKwkJCXUzMiBmbGFnc19hbmQ7CisJCQl1MzIgZmxhZ3Nfb3I7CiAJCX0gc2V0X2ZsYWdzX3N0YTsKIAkJc3RydWN0IHsKLQkJCVUxNiByaWQ7Ci0JCQlVMTYgbGVuOwotCQkJVTggZGF0YVswXTsKKwkJCXUxNiByaWQ7CisJCQl1MTYgbGVuOworCQkJdTggZGF0YVswXTsKIAkJfSByaWQ7CiAJCXN0cnVjdCB7Ci0JCQlVOCBsZW47Ci0JCQlVOCBkYXRhWzBdOworCQkJdTggbGVuOworCQkJdTggZGF0YVswXTsKIAkJfSBnZW5lcmljX2VsZW07CiAJCXN0cnVjdCB7Ci0JCQlVMTYgY21kOwotCQkJVTE2IHJlYXNvbl9jb2RlOworCQkJdTE2IGNtZDsKKwkJCXUxNiByZWFzb25fY29kZTsKIAkJfSBtbG1lOwogCQlzdHJ1Y3QgewotCQkJVTggc3NpZF9sZW47Ci0JCQlVOCBzc2lkWzMyXTsKKwkJCXU4IHNzaWRfbGVuOworCQkJdTggc3NpZFszMl07CiAJCX0gc2Nhbl9yZXE7CiAJfSB1OwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYwppbmRleCA0MDQyODdjLi41NjI0YTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jCkBAIC03MCwxNiArNzAsMTYgQEAKICAgICBTTm9kZUxpc3QgICAgICAgICAgIHNOb2RlTGlzdDsKICAgICBQU0JTU0lETGlzdCAgICAgICAgIHBMaXN0OwogICAgIFBTTm9kZUxpc3QgICAgICAgICAgcE5vZGVMaXN0OwotICAgIFVJTlQgICAgICAgICAgICAgICAgY2JMaXN0Q291bnQ7CisgICAgdW5zaWduZWQgaW50IGNiTGlzdENvdW50OwogICAgIFBLbm93bkJTUyAgICAgICAgICAgcEJTUzsKICAgICBQS25vd25Ob2RlREIgICAgICAgIHBOb2RlOwotICAgIFVJTlQgICAgICAgICAgICAgICAgaWksIGpqOworICAgIHVuc2lnbmVkIGludCBpaSwgamo7CiAgICAgU0NtZExpbmtTdGF0dXMgICAgICBzTGlua1N0YXR1czsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGFieVN1cHBSYXRlc1tdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDQsIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTZ9OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5TnVsbEFkZHJbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgICBEV09SRCAgICAgICAgICAgICAgIGR3S2V5SW5kZXg9IDA7Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlTY2FuU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKLSAgICBMT05HICAgICAgICAgICAgICAgIGxkQm07CisgICAgdW5zaWduZWQgY2hhciBhYnlTdXBwUmF0ZXNbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA0LCAweDAyLCAweDA0LCAweDBCLCAweDE2fTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieU51bGxBZGRyW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4PSAwOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U2NhblNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgbG9uZyAgICAgICAgICAgICAgICBsZEJtOwogCiAgICAgcFJlcS0+d1Jlc3VsdCA9IDA7CiAKQEAgLTk5LDE3ICs5OSwxNyBAQAogICAgICAgICAgICAgbWVtY3B5KGFieVNjYW5TU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJNQUNTdXNwZW5kID09IFRSVUUpIHsKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJNQUNTdXNwZW5kID09IHRydWUpIHsKKyAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPbihwRGV2aWNlKTsKICAgICAgICAgICAgIHZNZ3JUaW1lckluaXQocERldmljZSk7CiAgICAgICAgICAgICBNQUN2SW50RW5hYmxlKHBEZXZpY2UtPlBvcnRPZmZzZXQsIElNUl9NQVNLX1ZBTFVFKTsKICAgICAgICAgICAgIGFkZF90aW1lcigmcE1nbXQtPnNUaW1lclNlY29uZENhbGxiYWNrKTsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJNQUNTdXNwZW5kID0gRkFMU0U7CisgICAgICAgICAgICBwRGV2aWNlLT5iTUFDU3VzcGVuZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogICAgICAgICBpZiAobWVtY21wKHBNZ210LT5hYnlDdXJyQlNTSUQsICZhYnlOdWxsQWRkclswXSwgNikgPT0gMCkKLSAgICAgICAgICAgIEJTU3ZDbGVhckJTU0xpc3QoKHZvaWQgKilwRGV2aWNlLCBGQUxTRSk7CisgICAgICAgICAgICBCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopcERldmljZSwgZmFsc2UpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopcERldmljZSwgcERldmljZS0+YkxpbmtQYXNzKTsKIApAQCAtMTMwLDcgKzEzMCw3IEBACiAJCQlicmVhazsKIAkJfTsKIAotICAgICAgICAgIGlmKHNab25lVHlwZUNtZC5iV3JpdGU9PVRSVUUpIHsKKyAgICAgICAgICBpZihzWm9uZVR5cGVDbWQuYldyaXRlPT10cnVlKSB7CiAJICAvLy8vLy93cml0ZSB6b25ldHlwZQogICAgICAgICAgICAgICAgIGlmKHNab25lVHlwZUNtZC5ab25lVHlwZSA9PSBab25lVHlwZV9VU0EpIHsKICAgICAgICAgICAgICAgICAgIC8vc2V0IHRvIFVTQQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICB9CiAJZWxzZSB7CiAgICAgICAgICAgLy8vLy8vL3JlYWQgem9uZXR5cGUKLQkgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgIHpvbmV0eXBlPTA7CisJICB1bnNpZ25lZCBjaGFyIHpvbmV0eXBlPTA7CiAKIAogICAgICAgICAgICBpZih6b25ldHlwZSA9PSAweDAwKSAgeyAvL1VTQQpAQCAtMTc0LDEzICsxNzQsMTMgQEAKIAogICAgIGNhc2UgV0xBTl9DTURfQlNTX0pPSU46CiAKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJNQUNTdXNwZW5kID09IFRSVUUpIHsKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJNQUNTdXNwZW5kID09IHRydWUpIHsKKyAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPbihwRGV2aWNlKTsKICAgICAgICAgICAgIHZNZ3JUaW1lckluaXQocERldmljZSk7CiAgICAgICAgICAgICBNQUN2SW50RW5hYmxlKHBEZXZpY2UtPlBvcnRPZmZzZXQsIElNUl9NQVNLX1ZBTFVFKTsKICAgICAgICAgICAgIGFkZF90aW1lcigmcE1nbXQtPnNUaW1lclNlY29uZENhbGxiYWNrKTsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJNQUNTdXNwZW5kID0gRkFMU0U7CisgICAgICAgICAgICBwRGV2aWNlLT5iTUFDU3VzcGVuZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZzSm9pbkNtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRCU1NKb2luKSkpIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogCSAgICAgICAgcE1nbXQtPmVDb25maWdNb2RlID0gV01BQ19DT05GSUdfRVNTX1NUQTsKIAkgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImlvY3Qgc2V0IHRvIFNUQSBtb2RlXG4iKTsKIAkgICAgfQotCSAgICBpZiAoc0pvaW5DbWQuYlBTRW5hYmxlID09IFRSVUUpIHsKKwkgICAgaWYgKHNKb2luQ21kLmJQU0VuYWJsZSA9PSB0cnVlKSB7CiAgICAgICAgICAgICBwRGV2aWNlLT5lUFNNb2RlID0gV01BQ19QT1dFUl9GQVNUOwogLy8gICAgICAgICAgICBwRGV2aWNlLT5lUFNNb2RlID0gV01BQ19QT1dFUl9NQVg7CiAgICAgICAgICAgICBwTWdtdC0+d0xpc3RlbkludGVydmFsID0gMjsKQEAgLTIxMSwxMiArMjExLDEyIEBACiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT2ZmIFxuIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc0pvaW5DbWQuYlNoYXJlS2V5QXV0aCA9PSBUUlVFKXsKLSAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBUUlVFOworICAgICAgICBpZiAoc0pvaW5DbWQuYlNoYXJlS2V5QXV0aCA9PSB0cnVlKXsKKyAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSB0cnVlOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5IFxuIik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gRkFMU0U7CisgICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gZmFsc2U7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJPcGVuIFN5c3RlbSBcbiIpOwogICAgICAgICB9CiAJICAgIHBEZXZpY2UtPnVDaGFubmVsID0gc0pvaW5DbWQudUNoYW5uZWw7CkBAIC0yMzUsOCArMjM1LDggQEAKIAkJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfTsKLQkgICAgaWYgKHNXRVBDbWQuYkVuYWJsZVdlcCAhPSBUUlVFKSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IEZBTFNFOworCSAgICBpZiAoc1dFUENtZC5iRW5hYmxlV2VwICE9IHRydWUpIHsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gZmFsc2U7CiAgICAgICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CiAgICAgICAgICAgICBNQUN2RGlzYWJsZURlZmF1bHRLZXkocERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXRVAgZnVuY3Rpb24gZGlzYWJsZS4gXG4iKTsKQEAgLTI1NywxNSArMjU3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0tleUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1dFUENtZC5hdVdlcEtleUxlbmd0aFtpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKSZzV0VQQ21kLmFieVdlcEtleVtpaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZzV0VQQ21kLmFieVdlcEtleVtpaV1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQ1RMX1dFUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPlBvcnRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUxvY2FsSUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHBEZXZpY2UtPmJ5S2V5SW5kZXggPSBzV0VQQ21kLmJ5S2V5SW5kZXg7Ci0gICAgICAgIHBEZXZpY2UtPmJUcmFuc21pdEtleSA9IFRSVUU7Ci0gICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gVFJVRTsKKyAgICAgICAgcERldmljZS0+YlRyYW5zbWl0S2V5ID0gdHJ1ZTsKKyAgICAgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSB0cnVlOwogICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CiAKICAgICAgICAgYnJlYWs7CkBAIC0yODYsOCArMjg2LDggQEAKICAgICAgICAgICAgIHNMaW5rU3RhdHVzLmJ5U3RhdGUgPSBBREhPQ19TVEFSVEVEOwogCiAgICAgICAgIHNMaW5rU3RhdHVzLnVDaGFubmVsID0gcE1nbXQtPnVDdXJyQ2hhbm5lbDsKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBUUlVFKSB7Ci0gICAgICAgICAgICBzTGlua1N0YXR1cy5iTGluayA9IFRSVUU7CisgICAgICAgIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgeworICAgICAgICAgICAgc0xpbmtTdGF0dXMuYkxpbmsgPSB0cnVlOwogIAkJICAgIHBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlDdXJyU1NJRDsKIAkJICAgIG1lbWNweShzTGlua1N0YXR1cy5hYnlTU0lELCBwSXRlbVNTSUQtPmFieVNTSUQsIHBJdGVtU1NJRC0+bGVuKTsKIAkJICAgIG1lbWNweShzTGlua1N0YXR1cy5hYnlCU1NJRCwgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOwpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBMaW5rIFN1Y2Nlc3MgISBcbiIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgc0xpbmtTdGF0dXMuYkxpbmsgPSBGQUxTRTsKKyAgICAgICAgICAgIHNMaW5rU3RhdHVzLmJMaW5rID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmc0xpbmtTdGF0dXMsIHNpemVvZihTQ21kTGlua1N0YXR1cykpKSB7CiAJCQlyZXN1bHQgPSAtRUZBVUxUOwpAQCAtMzQwLDggKzM0MCw4IEBACiAgICAgCQkgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLndCZWFjb25JbnRlcnZhbCA9IHBCU1MtPndCZWFjb25JbnRlcnZhbDsKICAgICAJCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0ud0NhcEluZm8gPSBwQlNTLT53Q2FwSW5mbzsKIC8vICAgIAkJICAgIHBMaXN0LT5zQlNTSURMaXN0W2lpXS51UlNTSSA9IHBCU1MtPnVSU1NJOwotICAgIAkJICAgIFJGdlJTU0lUb2RCbShwRGV2aWNlLCAoQllURSkocEJTUy0+dVJTU0kpLCAmbGRCbSk7Ci0gICAgCQkgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLnVSU1NJID0gKFVJTlQpbGRCbTsKKyAgICAJCSAgICBSRnZSU1NJVG9kQm0ocERldmljZSwgKHVuc2lnbmVkIGNoYXIpKHBCU1MtPnVSU1NJKSwgJmxkQm0pOworICAgIAkJICAgIHBMaXN0LT5zQlNTSURMaXN0W2lpXS51UlNTSSA9ICh1bnNpZ25lZCBpbnQpbGRCbTsKICAgICAJCSAgICBtZW1jcHkocExpc3QtPnNCU1NJRExpc3RbaWldLmFieUJTU0lELCBwQlNTLT5hYnlCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOwogICAgIAkJICAgIHBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBCU1MtPmFieVNTSUQ7CiAgICAgCQkgICAgbWVtc2V0KHBMaXN0LT5zQlNTSURMaXN0W2lpXS5hYnlTU0lELCAwLCBXTEFOX1NTSURfTUFYTEVOICsgMSk7CkBAIC0zNTMsMTAgKzM1MywxMCBAQAogICAgIAkJICAgICAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0uYnlOZXRUeXBlID0gQURIT0M7CiAgICAgCQkgICAgfQogICAgIAkJICAgIGlmIChXTEFOX0dFVF9DQVBfSU5GT19QUklWQUNZKHBCU1MtPndDYXBJbmZvKSkgewotICAgIAkJICAgICAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0uYldFUE9uID0gVFJVRTsKKyAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJXRVBPbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgIAkJICAgICAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0uYldFUE9uID0gRkFMU0U7CisgICAgCQkgICAgICAgIHBMaXN0LT5zQlNTSURMaXN0W2lpXS5iV0VQT24gPSBmYWxzZTsKICAgICAJCSAgICB9CiAgICAgCQkgICAgaWkgKys7CiAgICAgCQkgICAgaWYgKGlpID49IHBMaXN0LT51SXRlbSkKQEAgLTM5MSwxNiArMzkxLDE2IEBACiAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKIAogICAgICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSBGQUxTRSkgeworICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IGZhbHNlKSB7CiAgICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7CiAgICAgICAgIH0KLSAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogICAgICAgICBtZW1zZXQocE1nbXQtPmFieUN1cnJCU1NJRCwgMCwgNik7CiAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwogICAgICAgICBkZWxfdGltZXIoJnBEZXZpY2UtPnNUaW1lckNvbW1hbmQpOwogICAgICAgICBkZWxfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7Ci0gICAgICAgIHBEZXZpY2UtPmJDbWRSdW5uaW5nID0gRkFMU0U7Ci0gICAgICAgIHBEZXZpY2UtPmJNQUNTdXNwZW5kID0gVFJVRTsKKyAgICAgICAgcERldmljZS0+YkNtZFJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgcERldmljZS0+Yk1BQ1N1c3BlbmQgPSB0cnVlOwogICAgICAgICBNQUN2SW50RGlzYWJsZShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKIApAQCAtNDEwLDEzICs0MTAsMTMgQEAKIAogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TVEFSVF9NQUNcbiIpOwogCi0gICAgICAgIGlmIChwRGV2aWNlLT5iTUFDU3VzcGVuZCA9PSBUUlVFKSB7Ci0gICAgICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IFRSVUUpCisgICAgICAgIGlmIChwRGV2aWNlLT5iTUFDU3VzcGVuZCA9PSB0cnVlKSB7CisgICAgICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpCiAgICAgICAgICAgICAgICAgQ0FSRGJSYWRpb1Bvd2VyT24ocERldmljZSk7CiAgICAgICAgICAgICB2TWdyVGltZXJJbml0KHBEZXZpY2UpOwogICAgICAgICAgICAgTUFDdkludEVuYWJsZShwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBJTVJfTUFTS19WQUxVRSk7CiAgICAgICAgICAgICBhZGRfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iTUFDU3VzcGVuZCA9IEZBTFNFOworICAgICAgICAgICAgcERldmljZS0+Yk1BQ1N1c3BlbmQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtNDU4LDExICs0NTgsMTEgQEAKIAkJfTsKIAogCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZTgwMjF4ID0gVFJVRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJFbmFibGU4MDIxeCA9IHRydWU7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJFbmFibGUgODAyLjF4XG4iKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJFbmFibGU4MDIxeCA9IEZBTFNFOworICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZTgwMjF4ID0gZmFsc2U7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJEaXNhYmxlIDgwMi4xeFxuIik7CiAgICAgICAgIH0KIApAQCAtNDc4LDExICs0NzgsMTEgQEAKIAkJfTsKIAogCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBUUlVFOworICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSB0cnVlOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhvc3RXRVBcbiIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBGQUxTRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJFbmFibGVIb3N0V0VQID0gZmFsc2U7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJEaXNhYmxlIEhvc3RXRVBcbiIpOwogICAgICAgICB9CiAKQEAgLTQ5OCwxMSArNDk4LDExIEBACiAJCWlmIChzVmFsdWUuZHdWYWx1ZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJ1cCB3cGFkZXZcbiIpOwogCQkgICBtZW1jcHkocERldmljZS0+d3BhZGV2LT5kZXZfYWRkciwgcERldmljZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQkgICBwRGV2aWNlLT5iV1BBREVWVXAgPSBUUlVFOworCQkgICBwRGV2aWNlLT5iV1BBREVWVXAgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiY2xvc2Ugd3BhZGV2XG4iKTsKLQkgICBwRGV2aWNlLT5iV1BBREVWVXAgPSBGQUxTRTsKKwkgICBwRGV2aWNlLT5iV1BBREVWVXAgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGJyZWFrOwpAQCAtNTEwLDcgKzUxMCw3IEBACiAgICAgY2FzZSBXTEFOX0NNRF9BUF9TVEFSVDoKIAogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9BUF9TVEFSVFxuIik7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gVFJVRSkgeworICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKICAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOwogICAgICAgICAgICAgdk1nclRpbWVySW5pdChwRGV2aWNlKTsKICAgICAgICAgICAgIE1BQ3ZJbnRFbmFibGUocERldmljZS0+UG9ydE9mZnNldCwgSU1SX01BU0tfVkFMVUUpOwpAQCAtNTU0LDEyICs1NTQsMTIgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcE1nbXQtPndJQlNTQmVhY29uUGVyaW9kID0gMTAwOwogCi0gICAgICAgIGlmIChzU3RhcnRBUENtZC5iU2hhcmVLZXlBdXRoID09IFRSVUUpewotICAgICAgICAgICAgcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IFRSVUU7CisgICAgICAgIGlmIChzU3RhcnRBUENtZC5iU2hhcmVLZXlBdXRoID09IHRydWUpeworICAgICAgICAgICAgcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IHRydWU7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTaGFyZSBLZXkgXG4iKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBGQUxTRTsKKyAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBmYWxzZTsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk9wZW4gU3lzdGVtIFxuIik7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzLCBhYnlTdXBwUmF0ZXMsIDYpOwpAQCAtNjM1LDkgKzYzNSw5IEBACiAgICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndBSUQgPSBwTm9kZS0+d0FJRDsKICAgICAJCSAgICBtZW1jcHkocE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieU1BQ0FkZHIsIHBOb2RlLT5hYnlNQUNBZGRyLCBXTEFOX0FERFJfTEVOKTsKICAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud1R4RGF0YVJhdGUgPSBwTm9kZS0+d1R4RGF0YVJhdGU7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndJbkFjdGl2ZUNvdW50ID0gKFdPUkQpcE5vZGUtPnVJbkFjdGl2ZUNvdW50OwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RW5RdWV1ZUNudCA9IChXT1JEKXBOb2RlLT53RW5RdWV1ZUNudDsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0ZsYWdzID0gKFdPUkQpcE5vZGUtPmR3RmxhZ3M7CisgICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndJbkFjdGl2ZUNvdW50ID0gKHVuc2lnbmVkIHNob3J0KXBOb2RlLT51SW5BY3RpdmVDb3VudDsKKyAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0VuUXVldWVDbnQgPSAodW5zaWduZWQgc2hvcnQpcE5vZGUtPndFblF1ZXVlQ250OworICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmxhZ3MgPSAodW5zaWduZWQgc2hvcnQpcE5vZGUtPmR3RmxhZ3M7CiAgICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmJQV0JpdE9uID0gcE5vZGUtPmJQU0VuYWJsZTsKICAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYnlLZXlJbmRleCA9IHBOb2RlLT5ieUtleUluZGV4OwogICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53V2VwS2V5TGVuZ3RoID0gcE5vZGUtPnVXZXBLZXlMZW5ndGg7CkBAIC02NTIsNyArNjUyLDcgQEAKICAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYklzSW5GYWxsYmFjayA9IHBOb2RlLT5iSXNJbkZhbGxiYWNrOwogICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS51VHhGYWlsdXJlcyA9IHBOb2RlLT51VHhGYWlsdXJlczsKICAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0udVR4QXR0ZW1wdHMgPSBwTm9kZS0+dVR4QXR0ZW1wdHM7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndGYWlsdXJlUmF0aW8gPSAoV09SRClwTm9kZS0+dUZhaWx1cmVSYXRpbzsKKyAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0ZhaWx1cmVSYXRpbyA9ICh1bnNpZ25lZCBzaG9ydClwTm9kZS0+dUZhaWx1cmVSYXRpbzsKICAgICAJCSAgICBqaiArKzsKICAgICAJCSAgICBpZiAoamogPj0gcE5vZGVMaXN0LT51SXRlbSkKICAgICAJCSAgICAgICAgYnJlYWs7CkBAIC02NzIsMTQgKzY3MiwxNCBAQAogCSAgICB3cGFfUmVzdWx0LnByb3RvID0gMDsKIAkgICAgd3BhX1Jlc3VsdC5rZXlfbWdtdCA9IDA7CiAJICAgIHdwYV9SZXN1bHQuZWFwX3R5cGUgPSAwOwotCSAgICB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKLQkgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gRkFMU0U7CisJICAgIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZCA9IGZhbHNlOworCSAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZ3cGFfUmVzdWx0LCBwUmVxLT5kYXRhLCBzaXplb2Yod3BhX1Jlc3VsdCkpKSB7CiAgICAgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogCQkJYnJlYWs7CiAJCX0KIAotaWYod3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPT1UUlVFKSB7CitpZih3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ9PXRydWUpIHsKICAgICNpZmRlZiBTbmRFdnRfVG9BUEkKICAgIHsKICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICAgIHdycXU7CkBAIC02OTIsNyArNjkyLDcgQEAKICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwSXRlbVNTSUQtPmFieVNTSUQpOwogICAgfQogICAgI2VuZGlmCi0gICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjY2Vzc2Z1bCBwZWVyIHRvIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD8KKyAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSB0cnVlOyAgICAgICAgICAgLy9pcyBzdWNjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPwogfQogCiAgICAgICAgIC8vcHJpbnRrKCJnZXQgcHJpdmF0ZSB3cGFfc3VwcGxpY2FudCBhbm5vdW5jZSBXUEEgU01cbiIpOwpAQCAtNzAwLDcgKzcwMCw3IEBACiAJLy9wcmludGsoIndwYS0tPnByb3RvPSVkXG4iLHdwYV9SZXN1bHQucHJvdG8pOwogCS8vcHJpbnRrKCJ3cGEtLT5rZXktbWdtdD0lZFxuIix3cGFfUmVzdWx0LmtleV9tZ210KTsKIAkvL3ByaW50aygid3BhLS0+ZWFwX3R5cGU9JWRcbiIsd3BhX1Jlc3VsdC5lYXBfdHlwZSk7Ci0JLy9wcmludGsoIndwYS0tPmF1dGhlbnRpY2F0ZWQgaXMgJXNcbiIsKHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD09VFJVRSk/IlRSVUUiOiJGQUxTRSIpOworCS8vcHJpbnRrKCJ3cGEtLT5hdXRoZW50aWNhdGVkIGlzICVzXG4iLCh3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ9PXRydWUpPyJ0cnVlIjoiZmFsc2UiKTsKIAogCXBSZXEtPndSZXN1bHQgPSAwOwogICAgICAgICBicmVhazsKQEAgLTcxNyw5ICs3MTcsOSBAQAogdm9pZAogdkNvbmZpZ1dFUEtleSAoCiAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBEV09SRCAgICBkd0tleUluZGV4LAotICAgIFBCWVRFICAgIHBieUtleSwKLSAgICBVTE9ORyAgICB1S2V5TGVuZ3RoCisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4LAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUtleSwKKyAgICB1bnNpZ25lZCBsb25nIHVLZXlMZW5ndGgKICAgICApCiB7CiAgICAgaW50IGlpOwpAQCAtNzI4LDE1ICs3MjgsMTUgQEAKICAgICBtZW1zZXQoJnBEZXZpY2UtPmFieVdlcEtleVtkd0tleUluZGV4XVswXSwgMCwgV0xBTl9XRVBNQVhfS0VZTEVOKTsKICAgICBtZW1jcHkoJnBEZXZpY2UtPmFieVdlcEtleVtkd0tleUluZGV4XVswXSwgcGJ5S2V5LCB1S2V5TGVuZ3RoKTsKIAotICAgIHBEZXZpY2UtPmJXZXBLZXlBdmFpbGFibGVbZHdLZXlJbmRleF0gPSBUUlVFOworICAgIHBEZXZpY2UtPmJXZXBLZXlBdmFpbGFibGVbZHdLZXlJbmRleF0gPSB0cnVlOwogICAgIHBEZXZpY2UtPmF1V2VwS2V5TGVuZ3RoW2R3S2V5SW5kZXhdID0gdUtleUxlbmd0aDsKIAogICAgIE1BQ3ZTZXREZWZhdWx0S2V5RW50cnkocERldmljZS0+UG9ydE9mZnNldCwgdUtleUxlbmd0aCwgZHdLZXlJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChQRFdPUkQpICYocERldmljZS0+YWJ5V2VwS2V5W2R3S2V5SW5kZXhdWzBdKSwgcERldmljZS0+YnlMb2NhbElEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nICopICYocERldmljZS0+YWJ5V2VwS2V5W2R3S2V5SW5kZXhdWzBdKSwgcERldmljZS0+YnlMb2NhbElEKTsKIAogICAgIGlmIChwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA8IE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkKSB7CiAgICAgICAgIGZvcihpaT0wOyBpaTxNQVhfR1JPVVBfS0VZOyBpaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJXZXBLZXlBdmFpbGFibGVbaWldID09IFRSVUUpICYmCisgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJXZXBLZXlBdmFpbGFibGVbaWldID09IHRydWUpICYmCiAgICAgICAgICAgICAgICAgKHBEZXZpY2UtPmF1V2VwS2V5TGVuZ3RoW2lpXSA9PSBXTEFOX1dFUDIzMl9LRVlMRU4pKSB7CiAgICAgICAgICAgICAgICAgcERldmljZS0+dUN1cnJlbnRXRVBNb2RlID0gVFhfV0VQX1NXMjMyOwogICAgICAgICAgICAgICAgIE1BQ3ZEaXNhYmxlRGVmYXVsdEtleShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuaAppbmRleCAwZDEwYzJhLi5iYTg1MDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5oCkBAIC00NSw5ICs0NSw5IEBACiAvKgogdm9pZCB2Q29uZmlnV0VQS2V5ICgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIERXT1JEICAgIGR3S2V5SW5kZXgsCi0gICAgUEJZVEUgICAgcGJ5S2V5LAotICAgIFVMT05HICAgIHVLZXlMZW5ndGgKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXgsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5S2V5LAorICAgIHVuc2lnbmVkIGxvbmcgdUtleUxlbmd0aAogICAgICk7CiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2l3Y3RsLmMKaW5kZXggY2Y2OTAzNC4uNDMyMjc2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaXdjdGwuYwpAQCAtNDUsNyArNDUsNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotZXh0ZXJuIFdPUkQgVHhSYXRlX2l3Y29uZmlnOy8vMjAwOC01LTggPGFkZD4gYnkgY2hlc3RlcgorZXh0ZXJuIHVuc2lnbmVkIHNob3J0IFR4UmF0ZV9pd2NvbmZpZzsvLzIwMDgtNS04IDxhZGQ+IGJ5IGNoZXN0ZXIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtOTksMTYgKzk5LDE2IEBACiAJICAgICAgIGVsc2UKIAkJICAgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHkgPSAoOTYtcERldmljZS0+YnlDdXJyU1EpKjEwMC83NjsKIAkgICB9Ci0JICAgaWYocERldmljZS0+YkxpbmtQYXNzICE9VFJVRSkKKwkgICBpZihwRGV2aWNlLT5iTGlua1Bhc3MgIT10cnVlKQogCSAgICAgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSA9IDA7CiAJICAjZW5kaWYKIAkgICBpZihwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSA+IDEwMCkKICAgIAkgICAgICAgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHkgPSAxMDA7Ci0gICAgICAgICAgICAgICBwRGV2aWNlLT53c3RhdHMucXVhbC5xdWFsID0oQllURSkgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHk7CisgICAgICAgICAgICAgICBwRGV2aWNlLT53c3RhdHMucXVhbC5xdWFsID0odW5zaWduZWQgY2hhcikgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHk7CiAJI2Vsc2UKIAlwRGV2aWNlLT53c3RhdHMucXVhbC5xdWFsID0gcERldmljZS0+YnlDdXJyU1E7CiAJI2VuZGlmCi0JUkZ2UlNTSVRvZEJtKHBEZXZpY2UsIChCWVRFKShwRGV2aWNlLT51Q3VyclJTU0kpLCAmbGRCbSk7CisJUkZ2UlNTSVRvZEJtKHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyKShwRGV2aWNlLT51Q3VyclJTU0kpLCAmbGRCbSk7CiAJcERldmljZS0+d3N0YXRzLnF1YWwubGV2ZWwgPSBsZEJtOwogCS8vcERldmljZS0+d3N0YXRzLnF1YWwubGV2ZWwgPSAweDEwMCAtIHBEZXZpY2UtPnVDdXJyUlNTSTsKIAlwRGV2aWNlLT53c3RhdHMucXVhbC5ub2lzZSA9IDA7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5ud2lkID0gMDsKIAlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5jb2RlID0gMDsKIAlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5mcmFnbWVudCA9IDA7Ci0JcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IChVMzIpcERldmljZS0+c2NTdGF0aXN0aWMuZHdUc3JFcnI7CisJcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9ICh1bnNpZ25lZCBsb25nKXBEZXZpY2UtPnNjU3RhdGlzdGljLmR3VHNyRXJyOwogCXBEZXZpY2UtPndzdGF0cy5kaXNjYXJkLm1pc2MgPSAwOwogCXBEZXZpY2UtPndzdGF0cy5taXNzLmJlYWNvbiA9IDA7CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogCVBTRGV2aWNlCSAgICAgICAgcERldmljZSA9IChQU0RldmljZSluZXRkZXZfcHJpdihkZXYpOwogCSBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7CiAJc3RydWN0IGl3X3NjYW5fcmVxICAqcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKWV4dHJhOwotCUJZVEUgICAgICAgICAgICAgICAgYWJ5U2NhblNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisJdW5zaWduZWQgY2hhciBhYnlTY2FuU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKIAlQV0xBTl9JRV9TU0lEICAgICAgIHBJdGVtU1NJRD1OVUxMOwogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DU0lXU0NBTiBcbiIpOwogCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAJCS8vQUREIHF1YWxpdHkKICAgICAgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJICAgICAgICBpd2UuY21kID0gSVdFVlFVQUw7Ci0JICAgICAgICBSRnZSU1NJVG9kQm0ocERldmljZSwgKEJZVEUpKHBCU1MtPnVSU1NJKSwgJmxkQm0pOworCSAgICAgICAgUkZ2UlNTSVRvZEJtKHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyKShwQlNTLT51UlNTSSksICZsZEJtKTsKIAkJICAgIGl3ZS51LnF1YWwubGV2ZWwgPSBsZEJtOwogCSAgICAgICAgaXdlLnUucXVhbC5ub2lzZSA9IDA7CiAvLzIwMDgtMDQwOS0wMSwgPEFkZD4gYnkgRWluc24gTGl1CkBAIC00MjYsNyArNDI2LDcgQEAKIAkJCSAgcERldmljZS0+dUNoYW5uZWwgPSBjaGFubmVsOwogIAkJCSAvLzIwMDctMDIwNy0wNCw8QWRkPiBieSBFaW5zbkxpdQogCQkJIC8vTWFrZSBjaGFuZ2UgZWZmZWN0IGF0IG9uY2UKLQkJCSAgcERldmljZS0+YkNvbW1pdCA9IFRSVUU7CisJCQkgIHBEZXZpY2UtPmJDb21taXQgPSB0cnVlOwogCQl9CiAJfQogCkBAIC00ODksNyArNDg5LDcgQEAKIAkgICAgaWYgKHBNZ210LT5lQ29uZmlnTW9kZSAhPSBXTUFDX0NPTkZJR19JQlNTX1NUQSkgewogICAgICAgICAgICAgcE1nbXQtPmVDb25maWdNb2RlID0gV01BQ19DT05GSUdfSUJTU19TVEE7CiAgICAgICAgICAgICBpZiAocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSB7Ci0JCSAgICAgICAgcERldmljZS0+YkNvbW1pdCA9IFRSVUU7CisJCSAgICAgICAgcERldmljZS0+YkNvbW1pdCA9IHRydWU7CiAgICAJCSAgICB9CiAJCX0KICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAic2V0IG1vZGUgdG8gYWQtaG9jIFxuIik7CkBAIC00OTksNyArNDk5LDcgQEAKIAkgICAgaWYgKHBNZ210LT5lQ29uZmlnTW9kZSAhPSBXTUFDX0NPTkZJR19FU1NfU1RBKSB7CiAgICAgICAgICAgICBwTWdtdC0+ZUNvbmZpZ01vZGUgPSBXTUFDX0NPTkZJR19FU1NfU1RBOwogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmZsYWdzICYgREVWSUNFX0ZMQUdTX09QRU5FRCkgewotCQkgICAgICAgIHBEZXZpY2UtPmJDb21taXQgPSBUUlVFOworCQkgICAgICAgIHBEZXZpY2UtPmJDb21taXQgPSB0cnVlOwogICAgCQkgICAgfQogCQl9CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInNldCBtb2RlIHRvIGluZnJhc3RydWN0dXJlIFxuIik7CkBAIC01MTMsNyArNTEzLDcgQEAKIAkgICAgaWYgKHBNZ210LT5lQ29uZmlnTW9kZSAhPSBXTUFDX0NPTkZJR19BUCkgewogICAgICAgICAgICAgcE1nbXQtPmVDb25maWdNb2RlID0gV01BQ19DT05GSUdfQVA7CiAgICAgICAgICAgICBpZiAocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSB7Ci0JCSAgICAgICAgcERldmljZS0+YkNvbW1pdCA9IFRSVUU7CisJCSAgICAgICAgcERldmljZS0+YkNvbW1pdCA9IHRydWU7CiAgICAJCSAgICB9CiAJCX0KICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAic2V0IG1vZGUgdG8gQWNjZXNzIFBvaW50IFxuIik7CkBAIC01NzcsNyArNTc3LDcgQEAKIHsKIAlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKIAlpbnQJCWksazsKLSAgICBCWVRFIGFieVN1cHBvcnRlZFJhdGVzWzEzXT0gezB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MGMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkMsIDB4OTB9OworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U3VwcG9ydGVkUmF0ZXNbMTNdPSB7MHgwMiwgMHgwNCwgMHgwQiwgMHgxNiwgMHgwYywgMHgxMiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwgMHg2QywgMHg5MH07CiAKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DR0lXUkFOR0UgXG4iKTsKQEAgLTY4OCw3ICs2ODgsNyBAQAogCVBTRGV2aWNlCSAgICAgICAgcERldmljZSA9IChQU0RldmljZSluZXRkZXZfcHJpdihkZXYpOwogICAgIFBTTWdtdE9iamVjdCAgICAgICAgcE1nbXQgPSAmKHBEZXZpY2UtPnNNZ210T2JqKTsKICAgICBpbnQgcmMgPSAwOwotICAgIEJZVEUgICAgICAgICAgICAgICAgIFplcm9CU1NJRFtXTEFOX0JTU0lEX0xFTl09ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKKyAgICB1bnNpZ25lZCBjaGFyIFplcm9CU1NJRFtXTEFOX0JTU0lEX0xFTl09ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DU0lXQVAgXG4iKTsKIGlmIChwTWdtdC0+ZVNjYW5TdGF0ZSA9PSAgV01BQ19JU19TQ0FOTklORykgewpAQCAtNzAxLDEyICs3MDEsMTIgQEAKIAllbHNlIHsKIAkJbWVtY3B5KHBNZ210LT5hYnlEZXNpcmVCU1NJRCwgd3JxLT5zYV9kYXRhLCA2KTsKIAkJICAgICAgICAgICAgICAgIC8vMjAwOC0wNDA5LTA1LCA8QWRkPiBieSBFaW5zbiBMaXUKLQkJaWYoKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBUUlVFKSAmJgorCQlpZigocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAobWVtY21wKHBNZ210LT5hYnlEZXNpcmVCU1NJRCwgcE1nbXQtPmFieUN1cnJCU1NJRCwgNik9PSAwKSl7CiAJCQlyZXR1cm4gcmM7CiAJCQl9CiAJLy9taWtlIDphZGQKLQkgaWYgKChJU19CUk9BRENBU1RfQUREUkVTUyhwTWdtdC0+YWJ5RGVzaXJlQlNTSUQpKSB8fAorCSBpZiAoKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBNZ210LT5hYnlEZXNpcmVCU1NJRCkpIHx8CiAJICAgICAobWVtY21wKHBNZ210LT5hYnlEZXNpcmVCU1NJRCwgWmVyb0JTU0lELCA2KSA9PSAwKSl7CiAJICAgICAgUFJJTlRfSygiU0lPQ1NJV0FQOmludmFsaWQgZGVzaXJlZCBCU1NJRCByZXR1cm4hXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiByYzsKQEAgLTcxNCwxMCArNzE0LDEwIEBACiAgICAgICAgLy9taWtlIGFkZDogaWYgZGVzaXJlZCBBUCBpcyBoaWRkZW4gc3NpZCh0aGVyZSBhcmUgdHdvIHNhbWUgQlNTSUQgaW4gbGlzdCksCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICB0aGVuIGlnbm9yZSxiZWNhdXNlIHlvdSBkb24ndCBrbm93biB3aGljaCBvbmUgdG8gYmUgY29ubmVjdCB3aXRoPz8KICAgICAgICAJewotICAgICAgICAgICBVSU5UICAgICAgICAgICAgaWkgLCB1U2FtZUJzc2lkTnVtPTA7CisgICAgICAgICAgIHVuc2lnbmVkIGludCBpaSAsIHVTYW1lQnNzaWROdW09MDsKICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAocE1nbXQtPnNCU1NMaXN0W2lpXS5iQWN0aXZlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBJU19FVEhfQUREUkVTU19FUVVBTChwTWdtdC0+c0JTU0xpc3RbaWldLmFieUJTU0lELHBNZ210LT5hYnlEZXNpcmVCU1NJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICFjb21wYXJlX2V0aGVyX2FkZHIocE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlCU1NJRCwgcE1nbXQtPmFieURlc2lyZUJTU0lEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdVNhbWVCc3NpZE51bSsrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQpAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICAgCX0KIAogICAgICAgICBpZiAocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSB7Ci0JCSAgICBwRGV2aWNlLT5iQ29tbWl0ID0gVFJVRTsKKwkJICAgIHBEZXZpY2UtPmJDb21taXQgPSB0cnVlOwogICAgCQl9CiAJfQogCXJldHVybiByYzsKQEAgLTc1MSw3ICs3NTEsNyBAQAogCiAgICAgbWVtY3B5KHdycS0+c2FfZGF0YSwgcE1nbXQtPmFieUN1cnJCU1NJRCwgNik7CiAgICAvLzIwMDgtMDQxMCw8TW9kaWZ5PiBieSBFaW5zbiBMaXUKLSAgICBpZiAoKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBGQUxTRSkgJiYgKHBNZ210LT5lQ3Vyck1vZGUgIT0gV01BQ19NT0RFX0VTU19BUCkpCisgICAgaWYgKChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gZmFsc2UpICYmIChwTWdtdC0+ZUN1cnJNb2RlICE9IFdNQUNfTU9ERV9FU1NfQVApKQogICAgICAgICBtZW1zZXQod3JxLT5zYV9kYXRhLCAwLCA2KTsKIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKQEAgLTgzMCwxMSArODMwLDExIEBACiAgICAgUFNNZ210T2JqZWN0ICAgICAgICBwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwogICAgIFBXTEFOX0lFX1NTSUQgICAgICAgcEl0ZW1TU0lEOwogICAvLzIwMDgtMDQwOS0wNSwgPEFkZD4gYnkgRWluc24gTGl1Ci0gICAgQllURSAgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgbGVuOwogCiAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIgU0lPQ1NJV0VTU0lEIFxuIik7Ci0gcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IEZBTFNFOworIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBmYWxzZTsKIGlmIChwTWdtdC0+ZVNjYW5TdGF0ZSA9PSAgV01BQ19JU19TQ0FOTklORykgewogICAgICAgICAvLyBJbiBzY2FubmluZy4uCiAgICAgIHByaW50aygiU0lPQ1NJV0VTU0lEKD8/KS0tPkluIHNjYW5uaW5nLi4uXG4iKTsKQEAgLTg0OCw3ICs4NDgsNyBAQAogCSAgICBQUklOVF9LKCJzZXQgZXNzaWQgdG8gJ2FueScgXG4iKTsKICAgICAgICAgICAgI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKICAgICAgICAgICAgICAvL1Vua25vd24gZGVzaXJlZCBBUCxzbyBoZXJlIG5lZWQgbm90IGFzc29jaWF0ZT8/Ci0gICAgICAgICAgICAvL2lmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT0gVFJVRSkgIHsKKyAgICAgICAgICAgIC8vaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSB0cnVlKSAgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAjZW5kaWYKQEAgLTg2OCw3ICs4NjgsNyBAQAogCXByaW50aygic2V0IGVzc2lkIHRvICVzIFxuIixwSXRlbVNTSUQtPmFieVNTSUQpOwogCQkvLzIwMDgtMDQwOS0wNSwgPEFkZD4gYnkgRWluc24gTGl1CiAgICAgICAgbGVuPShwSXRlbVNTSUQtPmxlbiA+ICgoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQpLT5sZW4pP3BJdGVtU1NJRC0+bGVuOigoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQpLT5sZW47Ci0gICBpZigocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpICYmCisgICBpZigocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpICYmCiAgIAkobWVtY21wKHBJdGVtU1NJRC0+YWJ5U1NJRCwoKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieUN1cnJTU0lEKS0+YWJ5U1NJRCxsZW4pPT0wKSkKICAgICAgICAgIHJldHVybiAwOwogCkBAIC04ODEsMTIgKzg4MSwxMiBAQAogI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKICAvL1dleHQgd2lsIG9yZGVyIGFub3RoZXIgY29tbWFuZCBvZiBzaXdhcCB0byBsaW5rIHdpdGggZGVzaXJlZCBBUCwKICAvL3NvIGhlcmUgbmVlZCBub3QgYXNzb2NpYXRlPz8KLSAgaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSBUUlVFKSAgeworICBpZihwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID09IHRydWUpICB7CiAgICAgICAgIC8qKioqKioqc2VhcmNoIGlmICBpbiBoaWRkZW4gc3NpZCBtb2RlICoqKiovCiAgICAgICAgIHsKICAgICAgICAgICAgUEtub3duQlNTICAgICAgIHBDdXJyID0gTlVMTDsKLSAgICAgICAgICAgQllURSAgICAgICAgICAgICAgICAgICBhYnlUbXBEZXNpcmVTU0lEW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDFdOwotCSAgVUlOVCAgICAgICAgICAgIGlpICwgdVNhbWVCc3NpZE51bT0wOworICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFieVRtcERlc2lyZVNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisJICB1bnNpZ25lZCBpbnQgaWkgLCB1U2FtZUJzc2lkTnVtPTA7CiAKIAkgIG1lbWNweShhYnlUbXBEZXNpcmVTU0lELHBNZ210LT5hYnlEZXNpcmVTU0lELHNpemVvZihhYnlUbXBEZXNpcmVTU0lEKSk7CiAgICAgICAgICAgICBwQ3VyciA9IEJTU3BTZWFyY2hCU1NMaXN0KHBEZXZpY2UsCkBAIC05MDYsNyArOTA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgYnkgbWVhbnMgb2YganVkZ2luZyBpZiB0aGVyZSBhcmUgdHdvIHNhbWUgQlNTSUQgZXhpc3QgaW4gbGlzdCA/CiAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHBNZ210LT5zQlNTTGlzdFtpaV0uYkFjdGl2ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgSVNfRVRIX0FERFJFU1NfRVFVQUwocE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlCU1NJRCwgcEN1cnItPmFieUJTU0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwTWdtdC0+c0JTU0xpc3RbaWldLmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1U2FtZUJzc2lkTnVtKys7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CkBAIC05MjcsNyArOTI3LDcgQEAKIAl9CiAKICAgICBpZiAocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSB7Ci0JICAgIHBEZXZpY2UtPmJDb21taXQgPSBUUlVFOworCSAgICBwRGV2aWNlLT5iQ29tbWl0ID0gdHJ1ZTsKIAl9CiAKIApAQCAtOTgxLDcgKzk4MSw3IEBACiAgICAgaW50IHJjID0gMDsKIAl1OAlicmF0ZSA9IDA7CiAJaW50CWk7Ci0JQllURSBhYnlTdXBwb3J0ZWRSYXRlc1sxM109IHsweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDBjLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDLCAweDkwfTsKKwl1bnNpZ25lZCBjaGFyIGFieVN1cHBvcnRlZFJhdGVzWzEzXT0gezB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MGMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkMsIDB4OTB9OwogCiAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIgU0lPQ1NJV1JBVEUgXG4iKTsKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAJCS8vIEZpeGVkIG1vZGUKIAkJLy8gT25lIHJhdGUsIGZpeGVkCiAJcHJpbnRrKCJSYXRlIEZpeFxuIik7Ci0JCXBEZXZpY2UtPmJGaXhSYXRlID0gVFJVRTsKKwkJcERldmljZS0+YkZpeFJhdGUgPSB0cnVlOwogICAgICAgICBpZiAoKHBEZXZpY2UtPmJ5QkJUeXBlID09IEJCX1RZUEVfMTFCKSYmIChicmF0ZSA+IDMpKSB7CiAJICAgIHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA9IDM7CiAgICAgICAgIH0KQEAgLTEwNDQsNyArMTA0NCw3IEBACiAKIAl9CiAJZWxzZSB7Ci0gICAgICAgIHBEZXZpY2UtPmJGaXhSYXRlID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJGaXhSYXRlID0gZmFsc2U7CiAgICAgICAgIHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA9IDEzOwogCXByaW50aygiYXV0byByYXRlOmNvbm5lY3Rpb25fcmF0ZSBpcyAxM1xuIik7CiAgICAgIH0KQEAgLTEwNjgsMTEgKzEwNjgsMTEgQEAKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DR0lXUkFURSBcbiIpOwogICAgIHsKLSAgICAgICAgQllURSBhYnlTdXBwb3J0ZWRSYXRlc1sxM109IHsweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDBjLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDLCAweDkwfTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBhYnlTdXBwb3J0ZWRSYXRlc1sxM109IHsweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDBjLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDLCAweDkwfTsKIAkgICAgaW50IGJyYXRlID0gMDsKIC8vMjAwOC01LTggPG1vZGlmeT4gYnkgY2hlc3RlcgogaWYocERldmljZS0+YkxpbmtQYXNzKXsKLWlmKHBEZXZpY2UtPmJGaXhSYXRlID09IFRSVUUpeworaWYocERldmljZS0+YkZpeFJhdGUgPT0gdHJ1ZSl7CiAJCWlmIChwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPCAxMykgewogCSAgICAgICAgYnJhdGUgPSBhYnlTdXBwb3J0ZWRSYXRlc1twRGV2aWNlLT51Q29ubmVjdGlvblJhdGVdOwogCSAgICB9ZWxzZSB7CkBAIC0xMTA4LDggKzExMDgsOCBAQAogLy8gICAgICAgICAgICAgICAgYnJhdGUgPSBhYnlTdXBwb3J0ZWRSYXRlc1twRGV2aWNlLT53Q3VycmVudFJhdGVdOwogCSAgICB3cnEtPnZhbHVlID0gYnJhdGUgKiA1MDAwMDA7CiAJICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgcmF0ZSwgc2V0IGF1dG8KLQkgICAgaWYgKHBEZXZpY2UtPmJGaXhSYXRlID09IFRSVUUpCi0JICAgICAgICB3cnEtPmZpeGVkID0gVFJVRTsKKwkgICAgaWYgKHBEZXZpY2UtPmJGaXhSYXRlID09IHRydWUpCisJICAgICAgICB3cnEtPmZpeGVkID0gdHJ1ZTsKICAgICB9CiAKIApAQCAtMTI5NCw3ICsxMjk0LDcgQEAKIHsKICAgICBQU0RldmljZQkgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7Ci0JRFdPUkQgZHdLZXlJbmRleCA9IChEV09SRCkod3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCk7CisJdW5zaWduZWQgbG9uZyBkd0tleUluZGV4ID0gKHVuc2lnbmVkIGxvbmcpKHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpOwogCWludCBpaSx1dSwgcmMgPSAwOwogCWludCBpbmRleCA9ICh3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKTsKIApAQCAtMTM1OCw3ICsxMzU4LDcgQEAKICAgICAgICAgaWYgKHBEZXZpY2UtPmZsYWdzICYgREVWSUNFX0ZMQUdTX09QRU5FRCkgewogICAgICAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgICAgICAgICAgICBLZXliU2V0RGVmYXVsdEtleSgmKHBEZXZpY2UtPnNLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkoZHdLZXlJbmRleCB8ICgxIDw8IDMxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGR3S2V5SW5kZXggfCAoMSA8PCAzMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCXdycS0+bGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YWJ5S2V5LApAQCAtMTM2OCwzOCArMTM2OCwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gKEJZVEUpZHdLZXlJbmRleDsKKyAgICAgICAgcERldmljZS0+YnlLZXlJbmRleCA9ICh1bnNpZ25lZCBjaGFyKWR3S2V5SW5kZXg7CiAgICAgICAgIHBEZXZpY2UtPnVLZXlMZW5ndGggPSB3cnEtPmxlbmd0aDsKLSAgICAgICAgcERldmljZS0+YlRyYW5zbWl0S2V5ID0gVFJVRTsKLSAgICAgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSB0cnVlOworICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IHRydWU7CiAgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKIAogCQl9ZWxzZSBpZihpbmRleD4wKXsKIAkvL3doZW4gdGhlIGxlbmd0aCBpcyAwIHRoZSByZXF1ZXN0IG9ubHkgY2hhbmdlcyB0aGUgZGVmYXVsdCB0cmFuc21pdCBrZXkgaW5kZXgKIAkvL2NoZWNrIHRoZSBuZXcga2V5IGhhcyBhIG5vbiB6ZXJvIGxlbmdldAotCWlmKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlPT1GQUxTRSkKKwlpZihwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZT09ZmFsc2UpCiAJewogCQlyYyA9IC1FSU5WQUw7CiAgICAgICAgIAlyZXR1cm4gcmM7CiAJfQogCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkp1c3Qgc2V0IERlZmF1bHQga2V5IEluZGV4OlxuIik7CiAJcGtleXRhYj0mKHBEZXZpY2UtPnNLZXkuS2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXSk7Ci0JaWYocGtleXRhYi0+R3JvdXBLZXlbKEJZVEUpZHdLZXlJbmRleF0udUtleUxlbmd0aD09MCl7CisJaWYocGtleXRhYi0+R3JvdXBLZXlbKHVuc2lnbmVkIGNoYXIpZHdLZXlJbmRleF0udUtleUxlbmd0aD09MCl7CiAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRlZmF1bHQga2V5IGxlbiBpcyAwXG4iKTsKIAkJcmMgPSAtRUlOVkFMOwogICAgICAgCSAgCXJldHVybiByYzsKIAkJfQotCSBwRGV2aWNlLT5ieUtleUluZGV4ID0oQllURSlkd0tleUluZGV4OworCSBwRGV2aWNlLT5ieUtleUluZGV4ID0odW5zaWduZWQgY2hhcilkd0tleUluZGV4OwogCSBwa2V5dGFiLT5kd0dUS2V5SW5kZXggPWR3S2V5SW5kZXggfCAoMSA8PCAzMSk7Ci0JIHBrZXl0YWItPkdyb3VwS2V5WyhCWVRFKWR3S2V5SW5kZXhdLmR3S2V5SW5kZXg9ZHdLZXlJbmRleCB8ICgxIDw8IDMxKTsKKwkgcGtleXRhYi0+R3JvdXBLZXlbKHVuc2lnbmVkIGNoYXIpZHdLZXlJbmRleF0uZHdLZXlJbmRleD1kd0tleUluZGV4IHwgKDEgPDwgMzEpOwogCX0KIAogfWVsc2Ugey8vZGlzYWJsZSB0aGUga2V5CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgV0VQIGZ1bmN0aW9uXG4iKTsKLQlpZihwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZT09RkFMU0UpCisJaWYocERldmljZS0+YkVuY3J5cHRpb25FbmFibGU9PWZhbHNlKQogCQlyZXR1cm4gMDsKLQlwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gRkFMU0U7Ci0gICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gRkFMU0U7CisJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IGZhbHNlOworICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IGZhbHNlOwogICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CiAgICAgICAgIGlmIChwRGV2aWNlLT5mbGFncyAmIERFVklDRV9GTEFHU19PUEVORUQpIHsKICAgICAgICAgICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwpAQCAtMTQ1MCw3ICsxNDUwLDcgQEAKICAgICAgICAgaWYgKHBEZXZpY2UtPmZsYWdzICYgREVWSUNFX0ZMQUdTX09QRU5FRCkgewogICAgICAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgICAgICAgICAgICBLZXliU2V0RGVmYXVsdEtleSgmKHBEZXZpY2UtPnNLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkocERldmljZS0+YnlLZXlJbmRleCB8ICgxIDw8IDMxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHBEZXZpY2UtPmJ5S2V5SW5kZXggfCAoMSA8PCAzMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPnVLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5hYnlLZXksCkBAIC0xNDYwLDEwICsxNDYwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogICAgICAgICB9Ci0gICAgICAgIHBEZXZpY2UtPmJ5S2V5SW5kZXggPSAoQllURSlkd0tleUluZGV4OworICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gKHVuc2lnbmVkIGNoYXIpZHdLZXlJbmRleDsKICAgICAgICAgcERldmljZS0+dUtleUxlbmd0aCA9IHdycS0+bGVuZ3RoOwotICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSBUUlVFOwotICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IFRSVUU7CisgICAgICAgIHBEZXZpY2UtPmJUcmFuc21pdEtleSA9IHRydWU7CisgICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gdHJ1ZTsKICAgICAgICAgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwogCiAJCS8vIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/CkBAIC0xNDc5LDggKzE0NzksOCBAQAogCWlmKHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpewogCiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgV0VQIGZ1bmN0aW9uXG4iKTsKLQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IEZBTFNFOwotICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IEZBTFNFOworCQlwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gZmFsc2U7CisgICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gZmFsc2U7CiAgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKICAgICAgICAgaWYgKHBEZXZpY2UtPmZsYWdzICYgREVWSUNFX0ZMQUdTX09QRU5FRCkgewogICAgICAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CkBAIC0xNDkzLDExICsxNDkzLDExIEBACiAKIAlpZih3cnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIFdFUCAmIFNoYXJlS2V5IFN5c3RlbVxuIik7Ci0JCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBUUlVFOworCQlwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gdHJ1ZTsKIAl9CiAJaWYod3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CiAJICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkVuYWJsZSBXRVAgJiBPcGVuIFN5c3RlbVxuIik7Ci0JCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBGQUxTRTsKKwkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IGZhbHNlOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC0xNTE1LDcgKzE1MTUsNyBAQAogICAgIFBTTWdtdE9iamVjdCAgICAgICAgcE1nbXQgPSAmKHBEZXZpY2UtPnNNZ210T2JqKTsKICAgICBpbnQgcmMgPSAwOwogICAgIGNoYXIgYWJ5S2V5W1dMQU5fV0VQMjMyX0tFWUxFTl07Ci0JVUlOVCBpbmRleCA9IChVSU5UKSh3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAodW5zaWduZWQgaW50KSh3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKTsKIAlQU0tleUl0ZW0gICBwS2V5ID0gTlVMTDsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DR0lXRU5DT0RFXG4iKTsKQEAgLTE1NDksNyArMTU0OSw3IEBACiAJZWxzZQogCQl3cnEtPmZsYWdzIHw9ICBJV19FTkNPREVfT1BFTjsKIAotCWlmIChLZXliR2V0S2V5KCYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJyb2FkY2FzdEFkZHIsIChCWVRFKWluZGV4ICwgJnBLZXkpKXsKKwlpZiAoS2V5YkdldEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwRGV2aWNlLT5hYnlCcm9hZGNhc3RBZGRyLCAodW5zaWduZWQgY2hhcilpbmRleCAsICZwS2V5KSl7CiAgICAgICAgIHdycS0+bGVuZ3RoID0gcEtleS0+dUtleUxlbmd0aDsKICAgICAgICAgbWVtY3B5KGFieUtleSwgcEtleS0+YWJ5S2V5LCAgcEtleS0+dUtleUxlbmd0aCk7CiAvLzIwMDctMDIwNy0wNiw8TW9kaWZ5PiBieSBFaW5zbkxpdQpAQCAtMTU4NCw3ICsxNTg0LDcgQEAKIAlQU01nbXRPYmplY3QJCXBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7CiAJY2hhciBhYnlLZXlbV0xBTl9XRVAyMzJfS0VZTEVOXTsKIAotCVVJTlQgaW5kZXggPSAoVUlOVCkod3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCk7CisJdW5zaWduZWQgaW50IGluZGV4ID0gKHVuc2lnbmVkIGludCkod3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCk7CiAJUFNLZXlJdGVtCXBLZXkgPSBOVUxMOwogCiAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiIFNJT0NHSVdFTkNPREVcbiIpOwpAQCAtMTYyMiw3ICsxNjIyLDcgQEAKIAkJCQkgIG1lbWNweShhYnlLZXksIHBLZXktPmFieUtleSwJcEtleS0+dUtleUxlbmd0aCk7CiAJCQkJICBtZW1jcHkoZXh0cmEsICBhYnlLZXksIFdMQU5fV0VQMjMyX0tFWUxFTik7CiAJCQkgICB9Ci0JfWVsc2UgaWYgKEtleWJHZXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcERldmljZS0+YWJ5QnJvYWRjYXN0QWRkciwgKEJZVEUpaW5kZXggLCAmcEtleSkpeworCX1lbHNlIGlmIChLZXliR2V0S2V5KCYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJyb2FkY2FzdEFkZHIsICh1bnNpZ25lZCBjaGFyKWluZGV4ICwgJnBLZXkpKXsKIAkJCXdycS0+bGVuZ3RoID0gcEtleS0+dUtleUxlbmd0aDsKIAkJCW1lbWNweShhYnlLZXksIHBLZXktPmFieUtleSwgIHBLZXktPnVLZXlMZW5ndGgpOwogCQltZW1jcHkoZXh0cmEsICBhYnlLZXksIFdMQU5fV0VQMjMyX0tFWUxFTik7CkBAIC0xNzI5LDggKzE3MjksOCBAQAogICAgIGxvbmcgbGRCbTsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DR0lXU0VOUyBcbiIpOwotICAgIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gVFJVRSkgewotICAgICAgICBSRnZSU1NJVG9kQm0ocERldmljZSwgKEJZVEUpKHBEZXZpY2UtPnVDdXJyUlNTSSksICZsZEJtKTsKKyAgICBpZiAocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpIHsKKyAgICAgICAgUkZ2UlNTSVRvZEJtKHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyKShwRGV2aWNlLT51Q3VyclJTU0kpLCAmbGRCbSk7CiAJICAgIHdycS0+dmFsdWUgPSBsZEJtOwogCX0KIAllbHNlIHsKQEAgLTE3NjMsNyArMTc2Myw3IEBACiAJCXdwYV92ZXJzaW9uID0gd3JxLT52YWx1ZTsKIAkJaWYod3JxLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEKSB7CiAJCSAgICAgICBQUklOVF9LKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gZGlzYWJsZSBhdCAxPz8/Pz8/XG4iKTsKLQkJCS8vcERldmljZS0+YldQQURldkVuYWJsZSA9IEZBTFNFOworCQkJLy9wRGV2aWNlLT5iV1BBRGV2RW5hYmxlID0gZmFsc2U7CiAJCX0KIAkJZWxzZSBpZih3cnEtPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UX0soIml3Y3RsX3Npd2F1dGg6c2V0IFdQQURFViB0byBXUEExKioqKioqXG4iKTsKQEAgLTE3NzEsNyArMTc3MSw3IEBACiAJCWVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVF9LKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gV1BBMioqKioqKlxuIik7CiAJCX0KLQkJLy9wRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID1UUlVFOworCQkvL3BEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPXRydWU7CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CiAJCXBhaXJ3aXNlID0gd3JxLT52YWx1ZTsKQEAgLTE4MTgsOSArMTgxOCw5IEBACiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKIAkJaWYod3JxLT52YWx1ZT09SVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pewotCQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobT1GQUxTRTsKKwkJCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG09ZmFsc2U7CiAJCX1lbHNlIGlmKHdycS0+dmFsdWU9PUlXX0FVVEhfQUxHX1NIQVJFRF9LRVkpewotCQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobT1UUlVFOworCQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobT10cnVlOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKQEAgLTE4MzMsMTMgKzE4MzMsMTMgQEAKIAkJYnJlYWs7CiAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKIAkJcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSAhIXdycS0+dmFsdWU7Ci0JCWlmKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID09IEZBTFNFKXsKKwkJaWYocERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPT0gZmFsc2UpewogCQkJd3BhX3ZlcnNpb24gPSAwOwogCQkJcGFpcndpc2UgPSAwOwogCQkJcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IEZBTFNFOwotCQkJcE1nbXQtPmVBdXRoZW5Nb2RlID0gRkFMU0U7Ci0JCQkvL3BEZXZpY2UtPmJXUEFEZXZFbmFibGUgPSBGQUxTRTsKKwkJCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBmYWxzZTsKKwkJCXBNZ210LT5lQXV0aGVuTW9kZSA9IGZhbHNlOworCQkJLy9wRGV2aWNlLT5iV1BBRGV2RW5hYmxlID0gZmFsc2U7CiAJCX0KIAogCQlicmVhazsKQEAgLTE4NTIsOSArMTg1Miw5IEBACiAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicGFpcndpc2UgPSAlZFxuIixwYWlyd2lzZSk7CiAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSAlZFxuIixwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyk7CiAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicE1nbXQtPmVBdXRoZW5Nb2RlICA9ICVkXG4iLHBNZ210LT5lQXV0aGVuTW9kZSk7Ci0JREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9ICVzXG4iLHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0/IlRSVUUiOiJGQUxTRSIpOwotCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gJXNcbiIscERldmljZS0+YkVuY3J5cHRpb25FbmFibGU/IlRSVUUiOiJGQUxTRSIpOwotCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBEZXZpY2UtPmJXUEFEZXZFbmFibGUgPSAlc1xuIixwRGV2aWNlLT5iV1BBRGV2RW5hYmxlPyJUUlVFIjoiRkFMU0UiKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gJXNcbiIscE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobT8idHJ1ZSI6ImZhbHNlIik7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSAlc1xuIixwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZT8idHJ1ZSI6ImZhbHNlIik7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+YldQQURldkVuYWJsZSA9ICVzXG4iLHBEZXZpY2UtPmJXUEFEZXZFbmFibGU/InRydWUiOiJmYWxzZSIpOwogKi8KICAgIHJldHVybiByZXQ7CiB9CkBAIC0yMDU1LDEyICsyMDU1LDEyIEBACiBpZiggcERldmljZS0+YndleHRjb3VudCA9PSA0KSB7CiAgICAgcHJpbnRrKCJTSU9DU0lXRU5DT0RFRVhUOkVuYWJsZSBXUEEgV0VYVCBTVVBQT1JUISEhISFcbiIpOwogIHBEZXZpY2UtPmJ3ZXh0Y291bnQ9MDsKLSAgIHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPSBUUlVFOworICAgcERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9IHRydWU7CiAJCSB9CiAvLyoqKioqKgogCiAJCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotIHJldCA9IHdwYV9zZXRfa2V5cyhwRGV2aWNlLCBwYXJhbSwgVFJVRSk7CisgcmV0ID0gd3BhX3NldF9rZXlzKHBEZXZpY2UsIHBhcmFtLCB0cnVlKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKIAogZXJyb3I6CkBAIC0yMDk2LDEwICsyMDk2LDEwIEBACiAJc3dpdGNoKG1sbWUtPmNtZCl7CiAJY2FzZSBJV19NTE1FX0RFQVVUSDoKIAkJLy90aGlzIGNvbW1hbmQgc2VlbXMgdG8gYmUgbm90IGNvbXBsZXRlLHBsZWFzZSB0ZXN0IGl0IC0tZWluc25saXUKLQkJLy9iU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsIFdMQU5fQ01EX0RFQVVUSCwgKFBCWVRFKSZyZWFzb24pOworCQkvL2JTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwgV0xBTl9DTURfREVBVVRILCAodW5zaWduZWQgY2hhciAqKSZyZWFzb24pOwogCQlicmVhazsKIAljYXNlIElXX01MTUVfRElTQVNTT0M6Ci0JCWlmKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBUUlVFKXsKKwkJaWYocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpewogCQkJCQkgIHByaW50aygiaXdjdGxfc2l3bWxtZS0tLT5zZW5kIERJU0FTU09DSUFURVxuIik7CiAJCSAgLy9jbGVhciByZWxhdGVkIGZsYWdzCiAJCSAgIG1lbXNldChwTWdtdC0+YWJ5RGVzaXJlQlNTSUQsIDB4RkYsNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYwppbmRleCBiZmM1YzUwLi4wZmY4ZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKQEAgLTU5LDIyICs1OSwyMiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQKLXNfdkNoZWNrS2V5VGFibGVWYWxpZCAoUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwgRFdPUkRfUFRSIGR3SW9CYXNlKQorc192Q2hlY2tLZXlUYWJsZVZhbGlkIChQU0tleU1hbmFnZW1lbnQgcFRhYmxlLCB1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewogICAgIGludCBpOwogCiAgICAgZm9yIChpPTA7aTxNQVhfS0VZX1RBQkxFO2krKykgewotICAgICAgICBpZiAoKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IFRSVUUpICYmCi0gICAgICAgICAgICAocFRhYmxlLT5LZXlUYWJsZVtpXS5QYWlyd2lzZUtleS5iS2V5VmFsaWQgPT0gRkFMU0UpICYmCi0gICAgICAgICAgICAocFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVswXS5iS2V5VmFsaWQgPT0gRkFMU0UpICYmCi0gICAgICAgICAgICAocFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVsxXS5iS2V5VmFsaWQgPT0gRkFMU0UpICYmCi0gICAgICAgICAgICAocFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVsyXS5iS2V5VmFsaWQgPT0gRkFMU0UpICYmCi0gICAgICAgICAgICAocFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVszXS5iS2V5VmFsaWQgPT0gRkFMU0UpCisgICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgIChwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5LmJLZXlWYWxpZCA9PSBmYWxzZSkgJiYKKyAgICAgICAgICAgIChwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5WzBdLmJLZXlWYWxpZCA9PSBmYWxzZSkgJiYKKyAgICAgICAgICAgIChwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5WzFdLmJLZXlWYWxpZCA9PSBmYWxzZSkgJiYKKyAgICAgICAgICAgIChwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5WzJdLmJLZXlWYWxpZCA9PSBmYWxzZSkgJiYKKyAgICAgICAgICAgIChwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5WzNdLmJLZXlWYWxpZCA9PSBmYWxzZSkKICAgICAgICAgICAgICkgewogCi0gICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9IEZBTFNFOworICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPSBmYWxzZTsKICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCA9IDA7Ci0gICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLmJTb2Z0V0VQID0gRkFMU0U7CisgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLmJTb2Z0V0VQID0gZmFsc2U7CiAgICAgICAgICAgICBNQUN2RGlzYWJsZUtleUVudHJ5KGR3SW9CYXNlLCBpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTk2LDIyICs5NiwyMiBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIEtleXZJbml0VGFibGUgKFBTS2V5TWFuYWdlbWVudCBwVGFibGUsIERXT1JEX1BUUiBkd0lvQmFzZSkKK3ZvaWQgS2V5dkluaXRUYWJsZSAoUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwgdW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKICAgICBpbnQgaTsKICAgICBpbnQgamo7CiAKICAgICBmb3IgKGk9MDtpPE1BWF9LRVlfVEFCTEU7aSsrKSB7Ci0gICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID0gRkFMU0U7Ci0gICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID0gRkFMU0U7CisgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID0gZmFsc2U7CisgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID0gZmFsc2U7CiAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkucHZLZXlUYWJsZSA9ICh2b2lkICopJnBUYWJsZS0+S2V5VGFibGVbaV07CiAgICAgICAgIGZvciAoamo9MDsgamogPCBNQVhfR1JPVVBfS0VZOyBqaisrKSB7Ci0gICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5W2pqXS5iS2V5VmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbampdLmJLZXlWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVtqal0ucHZLZXlUYWJsZSA9ICh2b2lkICopJnBUYWJsZS0+S2V5VGFibGVbaV07CiAgICAgICAgIH0KICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsID0gMDsKICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5kd0dUS2V5SW5kZXggPSAwOwotICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLmJTb2Z0V0VQID0gRkFMU0U7CisgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uYlNvZnRXRVAgPSBmYWxzZTsKICAgICAgICAgTUFDdkRpc2FibGVLZXlFbnRyeShkd0lvQmFzZSwgaSk7CiAgICAgfQogfQpAQCAtMTI4LDEzICsxMjgsMTMgQEAKICAqICBPdXQ6CiAgKiAgICAgIHBLZXkgICAgICAgICAgICAtIEtleSByZXR1cm4KICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgZm91bmQgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgZm91bmQgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIEtleWJHZXRLZXkgKAorYm9vbCBLZXliR2V0S2V5ICgKICAgICBQU0tleU1hbmFnZW1lbnQgcFRhYmxlLAotICAgIFBCWVRFICAgICAgICAgICBwYnlCU1NJRCwKLSAgICBEV09SRCAgICAgICAgICAgZHdLZXlJbmRleCwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXgsCiAgICAgUFNLZXlJdGVtICAgICAgICpwS2V5CiAgICAgKQogewpAQCAtMTQ0LDMxICsxNDQsMzEgQEAKIAogICAgICpwS2V5ID0gTlVMTDsKICAgICBmb3IgKGk9MDtpPE1BWF9LRVlfVEFCTEU7aSsrKSB7Ci0gICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gVFJVRSkgJiYKLSAgICAgICAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQscGJ5QlNTSUQpKSB7CisgICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgICFjb21wYXJlX2V0aGVyX2FkZHIocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgcGJ5QlNTSUQpKSB7CiAgICAgICAgICAgICBpZiAoZHdLZXlJbmRleCA9PSAweEZGRkZGRkZGKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAocFRhYmxlLT5LZXlUYWJsZVtpXS5QYWlyd2lzZUtleS5iS2V5VmFsaWQgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAqcEtleSA9ICYocFRhYmxlLT5LZXlUYWJsZVtpXS5QYWlyd2lzZUtleSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChkd0tleUluZGV4IDwgTUFYX0dST1VQX0tFWSkgewotICAgICAgICAgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5W2R3S2V5SW5kZXhdLmJLZXlWYWxpZCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbZHdLZXlJbmRleF0uYktleVZhbGlkID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgKnBLZXkgPSAmKHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbZHdLZXlJbmRleF0pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFRSVUUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAoRkFMU0UpOworICAgIHJldHVybiAoZmFsc2UpOwogfQogCiAKQEAgLTE4NiwzNyArMTg2LDM3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3Mgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VzcyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgS2V5YlNldEtleSAoCitib29sIEtleWJTZXRLZXkgKAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgUEJZVEUgICAgICAgICAgIHBieUJTU0lELAotICAgIERXT1JEICAgICAgICAgICBkd0tleUluZGV4LAotICAgIFVMT05HICAgICAgICAgICB1S2V5TGVuZ3RoLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lELAorICAgIHVuc2lnbmVkIGxvbmcgZHdLZXlJbmRleCwKKyAgICB1bnNpZ25lZCBsb25nIHVLZXlMZW5ndGgsCiAgICAgUFFXT1JEICAgICAgICAgIHBLZXlSU0MsCi0gICAgUEJZVEUgICAgICAgICAgIHBieUtleSwKLSAgICBCWVRFICAgICAgICAgICAgYnlLZXlEZWNNb2RlLAotICAgIERXT1JEX1BUUiAgICAgICBkd0lvQmFzZSwKLSAgICBCWVRFICAgICAgICAgICAgYnlMb2NhbElECisgICAgdW5zaWduZWQgY2hhciAqcGJ5S2V5LAorICAgIHVuc2lnbmVkIGNoYXIgYnlLZXlEZWNNb2RlLAorICAgIHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsCisgICAgdW5zaWduZWQgY2hhciBieUxvY2FsSUQKICAgICApCiB7CiAgICAgaW50ICAgICAgICAgaSxqOwotICAgIFVJTlQgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCBpaTsKICAgICBQU0tleUl0ZW0gICBwS2V5OwotICAgIFVJTlQgICAgICAgIHVLZXlJZHg7CisgICAgdW5zaWduZWQgaW50IHVLZXlJZHg7CiAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkVudGVyIEtleWJTZXRLZXk6ICVsWFxuIiwgZHdLZXlJbmRleCk7CiAKICAgICBqID0gKE1BWF9LRVlfVEFCTEUtMSk7CiAgICAgZm9yIChpPTA7aTwoTUFYX0tFWV9UQUJMRS0xKTtpKyspIHsKLSAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBGQUxTRSkgJiYKKyAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBmYWxzZSkgJiYKICAgICAgICAgICAgIChqID09IChNQVhfS0VZX1RBQkxFLTEpKSkgewogICAgICAgICAgICAgLy8gZm91bmQgZW1wdHkgdGFibGUKICAgICAgICAgICAgIGogPSBpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gVFJVRSkgJiYKLSAgICAgICAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQscGJ5QlNTSUQpKSB7CisgICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgICFjb21wYXJlX2V0aGVyX2FkZHIocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgcGJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAvLyBmb3VuZCB0YWJsZSBhbHJlYWR5IGV4aXN0CiAgICAgICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiBQQUlSV0lTRV9LRVkpICE9IDApIHsKICAgICAgICAgICAgICAgICAvLyBQYWlyd2lzZSBrZXkKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBHcm91cCBrZXkKICAgICAgICAgICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiAweDAwMDAwMEZGKSA+PSBNQVhfR1JPVVBfS0VZKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgICAgICAgICAgICAgcEtleSA9ICYocFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVtkd0tleUluZGV4ICYgMHgwMDAwMDBGRl0pOwogICAgICAgICAgICAgICAgIGlmICgoZHdLZXlJbmRleCAmIFRSQU5TTUlUX0tFWSkgIT0gMCkgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gR3JvdXAgdHJhbnNtaXQga2V5CkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCB8PSAweDgwMDA7ICAgICAgICAgICAgICAvLyBlbmFibGUgb24tZmx5CiAKLSAgICAgICAgICAgIHBLZXktPmJLZXlWYWxpZCA9IFRSVUU7CisgICAgICAgICAgICBwS2V5LT5iS2V5VmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgcEtleS0+dUtleUxlbmd0aCA9IHVLZXlMZW5ndGg7CiAgICAgICAgICAgICBwS2V5LT5kd0tleUluZGV4ID0gZHdLZXlJbmRleDsKICAgICAgICAgICAgIHBLZXktPmJ5Q2lwaGVyU3VpdGUgPSBieUtleURlY01vZGU7CkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgICAgICAgICAgICBpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAgICAgICAgICAgICAgICAgICAgIHBLZXktPmFieUtleVsxNV0gfD0gMHg4MDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsLCBpLCB1S2V5SWR4LCBwYnlCU1NJRCwgKFBEV09SRClwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisgICAgICAgICAgICBNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcGJ5QlNTSUQsICh1bnNpZ25lZCBsb25nICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOwogCiAgICAgICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gUlNDIHNldCBieSBOSUMKQEAgLTI3NywxMiArMjc3LDEyIEBACiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInBLZXktPndUU0MxNV8wOiAleFxuICIsIHBLZXktPndUU0MxNV8wKTsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icEtleS0+ZHdLZXlJbmRleDogJWx4XG4gIiwgcEtleS0+ZHdLZXlJbmRleCk7CiAKLSAgICAgICAgICAgIHJldHVybiAoVFJVRSk7CisgICAgICAgICAgICByZXR1cm4gKHRydWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChqIDwgKE1BWF9LRVlfVEFCTEUtMSkpIHsKICAgICAgICAgbWVtY3B5KHBUYWJsZS0+S2V5VGFibGVbal0uYWJ5QlNTSUQscGJ5QlNTSUQsRVRIX0FMRU4pOwotICAgICAgICBwVGFibGUtPktleVRhYmxlW2pdLmJJblVzZSA9IFRSVUU7CisgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbal0uYkluVXNlID0gdHJ1ZTsKICAgICAgICAgaWYgKChkd0tleUluZGV4ICYgUEFJUldJU0VfS0VZKSAhPSAwKSAgewogICAgICAgICAgICAgLy8gUGFpcndpc2Uga2V5CiAgICAgICAgICAgICBwS2V5ID0gJihwVGFibGUtPktleVRhYmxlW2pdLlBhaXJ3aXNlS2V5KTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gR3JvdXAga2V5CiAgICAgICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiAweDAwMDAwMEZGKSA+PSBNQVhfR1JPVVBfS0VZKQotICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgICAgICAgICAgcEtleSA9ICYocFRhYmxlLT5LZXlUYWJsZVtqXS5Hcm91cEtleVtkd0tleUluZGV4ICYgMHgwMDAwMDBGRl0pOwogICAgICAgICAgICAgaWYgKChkd0tleUluZGV4ICYgVFJBTlNNSVRfS0VZKSAhPSAwKSAgewogICAgICAgICAgICAgICAgIC8vIEdyb3VwIHRyYW5zbWl0IGtleQpAQCAtMzA2LDcgKzMwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtqXS53S2V5Q3RsIHw9IDB4ODAwMDsgICAgICAgICAgICAgIC8vIGVuYWJsZSBvbi1mbHkKIAotICAgICAgICBwS2V5LT5iS2V5VmFsaWQgPSBUUlVFOworICAgICAgICBwS2V5LT5iS2V5VmFsaWQgPSB0cnVlOwogICAgICAgICBwS2V5LT51S2V5TGVuZ3RoID0gdUtleUxlbmd0aDsKICAgICAgICAgcEtleS0+ZHdLZXlJbmRleCA9IGR3S2V5SW5kZXg7CiAgICAgICAgIHBLZXktPmJ5Q2lwaGVyU3VpdGUgPSBieUtleURlY01vZGU7CkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgICAgIGlmICh1S2V5TGVuZ3RoID09IFdMQU5fV0VQMTA0X0tFWUxFTikKICAgICAgICAgICAgICAgICBwS2V5LT5hYnlLZXlbMTVdIHw9IDB4ODA7CiAgICAgICAgIH0KLSAgICAgICAgTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW2pdLndLZXlDdGwsIGosIHVLZXlJZHgsIHBieUJTU0lELCAoUERXT1JEKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKKyAgICAgICAgTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW2pdLndLZXlDdGwsIGosIHVLZXlJZHgsIHBieUJTU0lELCAodW5zaWduZWQgbG9uZyAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKIAogICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtMzQyLDkgKzM0Miw5IEBACiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icEtleS0+d1RTQzE1XzA6ICV4XG4gIiwgcEtleS0+d1RTQzE1XzApOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInBLZXktPmR3S2V5SW5kZXg6ICVseFxuICIsIHBLZXktPmR3S2V5SW5kZXgpOwogCi0gICAgICAgIHJldHVybiAoVFJVRSk7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CiAgICAgfQotICAgIHJldHVybiAoRkFMU0UpOworICAgIHJldHVybiAoZmFsc2UpOwogfQogCiAKQEAgLTM1OSw2NiArMzU5LDY2IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3Mgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VzcyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgS2V5YlJlbW92ZUtleSAoCitib29sIEtleWJSZW1vdmVLZXkgKAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgUEJZVEUgICAgICAgICAgIHBieUJTU0lELAotICAgIERXT1JEICAgICAgICAgICBkd0tleUluZGV4LAotICAgIERXT1JEX1BUUiAgICAgICBkd0lvQmFzZQorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lELAorICAgIHVuc2lnbmVkIGxvbmcgZHdLZXlJbmRleCwKKyAgICB1bnNpZ25lZCBsb25nIGR3SW9CYXNlCiAgICAgKQogewogICAgIGludCAgaTsKIAotICAgIGlmIChJU19CUk9BRENBU1RfQUREUkVTUyhwYnlCU1NJRCkpIHsKKyAgICBpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIocGJ5QlNTSUQpKSB7CiAgICAgICAgIC8vIGRlYWx0ZSBhbGwga2V5CiAgICAgICAgIGlmICgoZHdLZXlJbmRleCAmIFBBSVJXSVNFX0tFWSkgIT0gMCkgewogICAgICAgICAgICAgZm9yIChpPTA7aTxNQVhfS0VZX1RBQkxFO2krKykgewotICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5QYWlyd2lzZUtleS5iS2V5VmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNfdkNoZWNrS2V5VGFibGVWYWxpZChwVGFibGUsIGR3SW9CYXNlKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoKGR3S2V5SW5kZXggJiAweDAwMDAwMEZGKSA8IE1BWF9HUk9VUF9LRVkpIHsKICAgICAgICAgICAgIGZvciAoaT0wO2k8TUFYX0tFWV9UQUJMRTtpKyspIHsKLSAgICAgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5W2R3S2V5SW5kZXggJiAweDAwMDAwMEZGXS5iS2V5VmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5W2R3S2V5SW5kZXggJiAweDAwMDAwMEZGXS5iS2V5VmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiAweDdGRkZGRkZGKSA9PSAocFRhYmxlLT5LZXlUYWJsZVtpXS5kd0dUS2V5SW5kZXggJiAweDdGRkZGRkZGKSkgewogICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgR3JvdXAgdHJhbnNtaXQga2V5CiAgICAgICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uZHdHVEtleUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzX3ZDaGVja0tleVRhYmxlVmFsaWQocFRhYmxlLCBkd0lvQmFzZSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgZm9yIChpPTA7aTxNQVhfS0VZX1RBQkxFO2krKykgewotICAgICAgICBpZiAoKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IFRSVUUpICYmCi0gICAgICAgICAgICBJU19FVEhfQUREUkVTU19FUVVBTChwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELHBieUJTU0lEKSkgeworICAgICAgICBpZiAoKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IHRydWUpICYmCisgICAgICAgICAgICAhY29tcGFyZV9ldGhlcl9hZGRyKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQsIHBieUJTU0lEKSkgewogICAgICAgICAgICAgaWYgKChkd0tleUluZGV4ICYgUEFJUldJU0VfS0VZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5QYWlyd2lzZUtleS5iS2V5VmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5LmJLZXlWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHNfdkNoZWNrS2V5VGFibGVWYWxpZChwVGFibGUsIGR3SW9CYXNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRSVUUpOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmICgoZHdLZXlJbmRleCAmIDB4MDAwMDAwRkYpIDwgTUFYX0dST1VQX0tFWSkgewotICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbZHdLZXlJbmRleCAmIDB4MDAwMDAwRkZdLmJLZXlWYWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbZHdLZXlJbmRleCAmIDB4MDAwMDAwRkZdLmJLZXlWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmICgoZHdLZXlJbmRleCAmIDB4N0ZGRkZGRkYpID09IChwVGFibGUtPktleVRhYmxlW2ldLmR3R1RLZXlJbmRleCAmIDB4N0ZGRkZGRkYpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBHcm91cCB0cmFuc21pdCBrZXkKICAgICAgICAgICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5kd0dUS2V5SW5kZXggPSAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzX3ZDaGVja0tleVRhYmxlVmFsaWQocFRhYmxlLCBkd0lvQmFzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIChmYWxzZSk7CiB9CiAKIApAQCAtNDMyLDMwICs0MzIsMzAgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VzcyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZXNzIG90aGVyd2lzZSBmYWxzZQogICoKICAqLwotQk9PTCBLZXliUmVtb3ZlQWxsS2V5ICgKK2Jvb2wgS2V5YlJlbW92ZUFsbEtleSAoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBQQllURSAgICAgICAgICAgcGJ5QlNTSUQsCi0gICAgRFdPUkRfUFRSICAgICAgIGR3SW9CYXNlCisgICAgdW5zaWduZWQgY2hhciAqcGJ5QlNTSUQsCisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZQogICAgICkKIHsKICAgICBpbnQgIGksdTsKIAogICAgIGZvciAoaT0wO2k8TUFYX0tFWV9UQUJMRTtpKyspIHsKLSAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBUUlVFKSAmJgotICAgICAgICAgICAgSVNfRVRIX0FERFJFU1NfRVFVQUwocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCxwYnlCU1NJRCkpIHsKLSAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID0gRkFMU0U7CisgICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgICFjb21wYXJlX2V0aGVyX2FkZHIocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgcGJ5QlNTSUQpKSB7CisgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5LmJLZXlWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgZm9yKHU9MDt1PE1BWF9HUk9VUF9LRVk7dSsrKSB7Ci0gICAgICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVt1XS5iS2V5VmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5W3VdLmJLZXlWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5kd0dUS2V5SW5kZXggPSAwOwogICAgICAgICAgICAgc192Q2hlY2tLZXlUYWJsZVZhbGlkKHBUYWJsZSwgZHdJb0Jhc2UpOwotICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIChmYWxzZSk7CiB9CiAKIC8qCkBAIC00NjcsMjAgKzQ2NywyMCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzIG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCiB2b2lkIEtleXZSZW1vdmVXRVBLZXkgKAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5SW5kZXgsCi0gICAgRFdPUkRfUFRSICAgICAgIGR3SW9CYXNlCisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4LAorICAgIHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UKICAgICApCiB7CiAKICAgIGlmICgoZHdLZXlJbmRleCAmIDB4MDAwMDAwRkYpIDwgTUFYX0dST1VQX0tFWSkgewotICAgICAgICBpZiAocFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmJJblVzZSA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0uYkluVXNlID09IHRydWUpIHsKICAgICAgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0uR3JvdXBLZXlbZHdLZXlJbmRleCAmIDB4MDAwMDAwRkZdLmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9XRVApIHsKLSAgICAgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0uR3JvdXBLZXlbZHdLZXlJbmRleCAmIDB4MDAwMDAwRkZdLmJLZXlWYWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5Hcm91cEtleVtkd0tleUluZGV4ICYgMHgwMDAwMDBGRl0uYktleVZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKChkd0tleUluZGV4ICYgMHg3RkZGRkZGRikgPT0gKHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5kd0dUS2V5SW5kZXggJiAweDdGRkZGRkZGKSkgewogICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgR3JvdXAgdHJhbnNtaXQga2V5CiAgICAgICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5kd0dUS2V5SW5kZXggPSAwOwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAKIHZvaWQgS2V5dlJlbW92ZUFsbFdFUEtleSAoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBEV09SRF9QVFIgICAgICAgZHdJb0Jhc2UKKyAgICB1bnNpZ25lZCBsb25nIGR3SW9CYXNlCiAgICAgKQogewogICAgIGludCBpOwpAQCAtNTE0LDEzICs1MTQsMTMgQEAKICAqICBPdXQ6CiAgKiAgICAgIHBLZXkgICAgICAgICAgICAtIEtleSByZXR1cm4KICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgZm91bmQgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgZm91bmQgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIEtleWJHZXRUcmFuc21pdEtleSAoCitib29sIEtleWJHZXRUcmFuc21pdEtleSAoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBQQllURSAgICAgICAgICAgcGJ5QlNTSUQsCi0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5VHlwZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5VHlwZSwKICAgICBQU0tleUl0ZW0gICAgICAgKnBLZXkKICAgICApCiB7CkBAIC01MjgsMTIgKzUyOCwxMiBAQAogCiAgICAgKnBLZXkgPSBOVUxMOwogICAgIGZvciAoaT0wO2k8TUFYX0tFWV9UQUJMRTtpKyspIHsKLSAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBUUlVFKSAmJgotICAgICAgICAgICAgSVNfRVRIX0FERFJFU1NfRVFVQUwocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCxwYnlCU1NJRCkpIHsKKyAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSB0cnVlKSAmJgorICAgICAgICAgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELCBwYnlCU1NJRCkpIHsKIAogICAgICAgICAgICAgaWYgKGR3S2V5VHlwZSA9PSBQQUlSV0lTRV9LRVkpIHsKIAotICAgICAgICAgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5LmJLZXlWYWxpZCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgKnBLZXkgPSAmKHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkpOwogCiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iS2V5YkdldFRyYW5zbWl0S2V5OiIpOwpAQCAtNTQ0LDE5ICs1NDQsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJcbiIpOwogCiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iUGFpcndpc2VLZXkuYktleVZhbGlkID09IEZBTFNFXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iUGFpcndpc2VLZXkuYktleVZhbGlkID09IGZhbHNlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAvLyBFbmQgb2YgVHlwZSA9PSBQQUlSV0lTRQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHBUYWJsZS0+S2V5VGFibGVbaV0uZHdHVEtleUluZGV4ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJFUlJPUjogZHdHVEtleUluZGV4ID09IDAgISEhXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5WyhwVGFibGUtPktleVRhYmxlW2ldLmR3R1RLZXlJbmRleCYweDAwMDAwMEZGKV0uYktleVZhbGlkID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAocFRhYmxlLT5LZXlUYWJsZVtpXS5Hcm91cEtleVsocFRhYmxlLT5LZXlUYWJsZVtpXS5kd0dUS2V5SW5kZXgmMHgwMDAwMDBGRildLmJLZXlWYWxpZCA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICpwS2V5ID0gJihwVGFibGUtPktleVRhYmxlW2ldLkdyb3VwS2V5WyhwVGFibGUtPktleVRhYmxlW2ldLmR3R1RLZXlJbmRleCYweDAwMDAwMEZGKV0pOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIktleWJHZXRUcmFuc21pdEtleToiKTsKQEAgLTU2NywxMSArNTY3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPImR3R1RLZXlJbmRleDogJWxYXG4iLCBwVGFibGUtPktleVRhYmxlW2ldLmR3R1RLZXlJbmRleCk7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iR3JvdXBLZXkuYktleVZhbGlkID09IEZBTFNFXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iR3JvdXBLZXkuYktleVZhbGlkID09IGZhbHNlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAvLyBFbmQgb2YgVHlwZSA9IEdST1VQCiAgICAgICAgIH0gLy8gQlNTSUQgbWF0Y2gKQEAgLTU4MSw3ICs1ODEsNyBAQAogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiUwMnggIiwgKihwYnlCU1NJRCtpaSkpOwogICAgIH0KICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlxuIik7Ci0gICAgcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIChmYWxzZSk7CiB9CiAKIApAQCAtNTk0LDEwICs1OTQsMTAgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgZm91bmQgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgZm91bmQgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIEtleWJDaGVja1BhaXJld2lzZUtleSAoCitib29sIEtleWJDaGVja1BhaXJld2lzZUtleSAoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKICAgICBQU0tleUl0ZW0gICAgICAgKnBLZXkKICAgICApCkBAIC02MDYsMTMgKzYwNiwxMyBAQAogCiAgICAgKnBLZXkgPSBOVUxMOwogICAgIGZvciAoaT0wO2k8TUFYX0tFWV9UQUJMRTtpKyspIHsKLSAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBUUlVFKSAmJgotICAgICAgICAgICAgKHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID09IFRSVUUpKSB7CisgICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgIChwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5LmJLZXlWYWxpZCA9PSB0cnVlKSkgewogICAgICAgICAgICAgKnBLZXkgPSAmKHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkpOwotICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIChmYWxzZSk7CiB9CiAKIC8qCkBAIC02MjgsMzQgKzYyOCwzNCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzIG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIEtleWJTZXREZWZhdWx0S2V5ICgKK2Jvb2wgS2V5YlNldERlZmF1bHRLZXkgKAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5SW5kZXgsCi0gICAgVUxPTkcgICAgICAgICAgIHVLZXlMZW5ndGgsCisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4LAorICAgIHVuc2lnbmVkIGxvbmcgdUtleUxlbmd0aCwKICAgICBQUVdPUkQgICAgICAgICAgcEtleVJTQywKLSAgICBQQllURSAgICAgICAgICAgcGJ5S2V5LAotICAgIEJZVEUgICAgICAgICAgICBieUtleURlY01vZGUsCi0gICAgRFdPUkRfUFRSICAgICAgIGR3SW9CYXNlLAotICAgIEJZVEUgICAgICAgICAgICBieUxvY2FsSUQKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlLZXksCisgICAgdW5zaWduZWQgY2hhciBieUtleURlY01vZGUsCisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRAogICAgICkKIHsKLSAgICBVSU5UICAgICAgICBpaTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAgICAgUFNLZXlJdGVtICAgcEtleTsKLSAgICBVSU5UICAgICAgICB1S2V5SWR4OworICAgIHVuc2lnbmVkIGludCB1S2V5SWR4OwogCiAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJFbnRlciBLZXliU2V0RGVmYXVsdEtleTogJTF4LCAlZCBcbiIsIChpbnQpZHdLZXlJbmRleCwgKGludCl1S2V5TGVuZ3RoKTsKIAogCiAgICAgaWYgKChkd0tleUluZGV4ICYgUEFJUldJU0VfS0VZKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgLy8gUGFpcndpc2Uga2V5Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICByZXR1cm4gKGZhbHNlKTsKICAgICB9IGVsc2UgaWYgKChkd0tleUluZGV4ICYgMHgwMDAwMDBGRikgPj0gTUFYX0dST1VQX0tFWSkgewotICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgfQogCi0gICAgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmJJblVzZSA9IFRSVUU7CisgICAgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmJJblVzZSA9IHRydWU7CiAgICAgZm9yKGlpPTA7aWk8RVRIX0FMRU47aWkrKykKICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmFieUJTU0lEW2lpXSA9IDB4RkY7CiAKQEAgLTY3NiwxMyArNjc2LDEzIEBACiAgICAgaWYgKCh1S2V5TGVuZ3RoID09IFdMQU5fV0VQMjMyX0tFWUxFTikgJiYKICAgICAgICAgKGJ5S2V5RGVjTW9kZSA9PSBLRVlfQ1RMX1dFUCkpIHsKICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLndLZXlDdGwgfD0gMHg0MDAwOyAgICAgICAgICAgICAgLy8gZGlzYWJsZSBvbi1mbHkgZGlzYWJsZSBhZGRyZXNzIG1hdGNoCi0gICAgICAgIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5iU29mdFdFUCA9IFRSVUU7CisgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5iU29mdFdFUCA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5iU29mdFdFUCA9PSBGQUxTRSkKKyAgICAgICAgaWYgKHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5iU29mdFdFUCA9PSBmYWxzZSkKICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS53S2V5Q3RsIHw9IDB4QzAwMDsgICAgICAgICAgLy8gZW5hYmxlIG9uLWZseSBkaXNhYmxlIGFkZHJlc3MgbWF0Y2gKICAgICB9CiAKLSAgICBwS2V5LT5iS2V5VmFsaWQgPSBUUlVFOworICAgIHBLZXktPmJLZXlWYWxpZCA9IHRydWU7CiAgICAgcEtleS0+dUtleUxlbmd0aCA9IHVLZXlMZW5ndGg7CiAgICAgcEtleS0+ZHdLZXlJbmRleCA9IGR3S2V5SW5kZXg7CiAgICAgcEtleS0+YnlDaXBoZXJTdWl0ZSA9IGJ5S2V5RGVjTW9kZTsKQEAgLTY5Myw3ICs2OTMsNyBAQAogICAgICAgICBpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAgICAgICAgICAgICBwS2V5LT5hYnlLZXlbMTVdIHw9IDB4ODA7CiAgICAgfQotICAgIE1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLndLZXlDdGwsIE1BWF9LRVlfVEFCTEUtMSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmFieUJTU0lELCAoUERXT1JEKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKKyAgICBNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS53S2V5Q3RsLCBNQVhfS0VZX1RBQkxFLTEsIHVLZXlJZHgsIHBUYWJsZS0+S2V5VGFibGVbTUFYX0tFWV9UQUJMRS0xXS5hYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CiAKICAgICBpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAgICAgICAgIC8vIFJTQyBzZXQgYnkgTklDCkBAIC03MTgsNyArNzE4LDcgQEAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInBLZXktPndUU0MxNV8wOiAleFxuIiwgcEtleS0+d1RTQzE1XzApOwogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icEtleS0+ZHdLZXlJbmRleDogJWx4XG4iLCBwS2V5LT5kd0tleUluZGV4KTsKIAotICAgIHJldHVybiAoVFJVRSk7CisgICAgcmV0dXJuICh0cnVlKTsKIH0KIAogCkBAIC03MzUsMzYgKzczNSwzNiBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzIG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIEtleWJTZXRBbGxHcm91cEtleSAoCitib29sIEtleWJTZXRBbGxHcm91cEtleSAoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBEV09SRCAgICAgICAgICAgZHdLZXlJbmRleCwKLSAgICBVTE9ORyAgICAgICAgICAgdUtleUxlbmd0aCwKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXgsCisgICAgdW5zaWduZWQgbG9uZyB1S2V5TGVuZ3RoLAogICAgIFBRV09SRCAgICAgICAgICBwS2V5UlNDLAotICAgIFBCWVRFICAgICAgICAgICBwYnlLZXksCi0gICAgQllURSAgICAgICAgICAgIGJ5S2V5RGVjTW9kZSwKLSAgICBEV09SRF9QVFIgICAgICAgZHdJb0Jhc2UsCi0gICAgQllURSAgICAgICAgICAgIGJ5TG9jYWxJRAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUtleSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5S2V5RGVjTW9kZSwKKyAgICB1bnNpZ25lZCBsb25nIGR3SW9CYXNlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElECiAgICAgKQogewogICAgIGludCAgICAgICAgIGk7Ci0gICAgVUlOVCAgICAgICAgaWk7CisgICAgdW5zaWduZWQgaW50IGlpOwogICAgIFBTS2V5SXRlbSAgIHBLZXk7Ci0gICAgVUlOVCAgICAgICAgdUtleUlkeDsKKyAgICB1bnNpZ25lZCBpbnQgdUtleUlkeDsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRW50ZXIgS2V5YlNldEFsbEdyb3VwS2V5OiAlbFhcbiIsIGR3S2V5SW5kZXgpOwogCiAKICAgICBpZiAoKGR3S2V5SW5kZXggJiBQQUlSV0lTRV9LRVkpICE9IDApIHsgICAgICAgICAgICAgICAgICAvLyBQYWlyd2lzZSBrZXkKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgIH0gZWxzZSBpZiAoKGR3S2V5SW5kZXggJiAweDAwMDAwMEZGKSA+PSBNQVhfR1JPVVBfS0VZKSB7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICByZXR1cm4gKGZhbHNlKTsKICAgICB9CiAKICAgICBmb3IgKGk9MDsgaSA8IE1BWF9LRVlfVEFCTEUtMTsgaSsrKSB7Ci0gICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAvLyBmb3VuZCB0YWJsZSBhbHJlYWR5IGV4aXN0CiAgICAgICAgICAgICAvLyBHcm91cCBrZXkKICAgICAgICAgICAgIHBLZXkgPSAmKHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbZHdLZXlJbmRleCAmIDB4MDAwMDAwRkZdKTsKQEAgLTc4MSw3ICs3ODEsNyBAQAogCiAgICAgICAgICAgICBwVGFibGUtPktleVRhYmxlW2ldLndLZXlDdGwgfD0gMHg4MDAwOyAgICAgICAgICAgICAgLy8gZW5hYmxlIG9uLWZseQogCi0gICAgICAgICAgICBwS2V5LT5iS2V5VmFsaWQgPSBUUlVFOworICAgICAgICAgICAgcEtleS0+YktleVZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIHBLZXktPnVLZXlMZW5ndGggPSB1S2V5TGVuZ3RoOwogICAgICAgICAgICAgcEtleS0+ZHdLZXlJbmRleCA9IGR3S2V5SW5kZXg7CiAgICAgICAgICAgICBwS2V5LT5ieUNpcGhlclN1aXRlID0gYnlLZXlEZWNNb2RlOwpAQCAtNzkyLDcgKzc5Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHVLZXlMZW5ndGggPT0gV0xBTl9XRVAxMDRfS0VZTEVOKQogICAgICAgICAgICAgICAgICAgICBwS2V5LT5hYnlLZXlbMTVdIHw9IDB4ODA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgKFBEV09SRClwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisgICAgICAgICAgICBNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CiAKICAgICAgICAgICAgIGlmICgoZHdLZXlJbmRleCAmIFVTRV9LRVlSU0MpID09IDApIHsKICAgICAgICAgICAgICAgICAvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtODE3LDcgKzgxNyw3IEBACiAgICAgICAgICAgICAvL0RCR19QUk5fR1JQMTIoKCJwS2V5LT53VFNDMTVfMDogJVhcbiAiLCBwS2V5LT53VFNDMTVfMCkpOwogICAgICAgICAgICAgLy9EQkdfUFJOX0dSUDEyKCgicEtleS0+ZHdLZXlJbmRleDogJWxYXG4gIiwgcEtleS0+ZHdLZXlJbmRleCkpOwogCi0gICAgICAgIH0gLy8gKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IFRSVUUpCisgICAgICAgIH0gLy8gKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IHRydWUpCiAgICAgfQotICAgIHJldHVybiAoVFJVRSk7CisgICAgcmV0dXJuICh0cnVlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5oCmluZGV4IDM5NDAzZDkuLjZiMmRhZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaApAQCAtNTcsMzMgKzU3LDMzIEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NLZXlJdGVtCiB7Ci0gICAgQk9PTCAgICAgICAgYktleVZhbGlkOwotICAgIFVMT05HICAgICAgIHVLZXlMZW5ndGg7Ci0gICAgQllURSAgICAgICAgYWJ5S2V5W01BWF9LRVlfTEVOXTsKKyAgICBib29sIGJLZXlWYWxpZDsKKyAgICB1bnNpZ25lZCBsb25nIHVLZXlMZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciBhYnlLZXlbTUFYX0tFWV9MRU5dOwogICAgIFFXT1JEICAgICAgIEtleVJTQzsKLSAgICBEV09SRCAgICAgICBkd1RTQzQ3XzE2OwotICAgIFdPUkQgICAgICAgIHdUU0MxNV8wOwotICAgIEJZVEUgICAgICAgIGJ5Q2lwaGVyU3VpdGU7Ci0gICAgQllURSAgICAgICAgYnlSZXNlcnZlZDA7Ci0gICAgRFdPUkQgICAgICAgZHdLZXlJbmRleDsKKyAgICB1bnNpZ25lZCBsb25nIGR3VFNDNDdfMTY7CisgICAgdW5zaWduZWQgc2hvcnQgd1RTQzE1XzA7CisgICAgdW5zaWduZWQgY2hhciBieUNpcGhlclN1aXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlSZXNlcnZlZDA7CisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4OwogICAgIHZvaWQgKnB2S2V5VGFibGU7CiB9IFNLZXlJdGVtLCAqUFNLZXlJdGVtOyAvLzY0CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NLZXlUYWJsZQogewotICAgIEJZVEUgICAgICAgIGFieUJTU0lEW0VUSF9BTEVOXTsgIC8vNgotICAgIEJZVEUgICAgICAgIGJ5UmVzZXJ2ZWQwWzJdOyAgICAgICAgICAgICAgLy84CisgICAgdW5zaWduZWQgY2hhciBhYnlCU1NJRFtFVEhfQUxFTl07ICAvLzYKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UmVzZXJ2ZWQwWzJdOyAgICAgICAgICAgICAgLy84CiAgICAgU0tleUl0ZW0gICAgUGFpcndpc2VLZXk7CiAgICAgU0tleUl0ZW0gICAgR3JvdXBLZXlbTUFYX0dST1VQX0tFWV07IC8vNjQqNSA9IDMyMCwgMzIwKzg9MzI4Ci0gICAgRFdPUkQgICAgICAgZHdHVEtleUluZGV4OyAgICAgICAgICAgIC8vIEdyb3VwVHJhbnNtaXRLZXkgSW5kZXgKLSAgICBCT09MICAgICAgICBiSW5Vc2U7CisgICAgdW5zaWduZWQgbG9uZyBkd0dUS2V5SW5kZXg7ICAgICAgICAgICAgLy8gR3JvdXBUcmFuc21pdEtleSBJbmRleAorICAgIGJvb2wgYkluVXNlOwogICAgIC8vMjAwNi0xMTE2LTAxLDxNb2RpZnk+IGJ5IE5vbWFkWmhhbwotICAgIC8vV09SRCAgICAgIHdLZXlDdGw7Ci0gICAgLy9CT09MICAgICAgYlNvZnRXRVA7Ci0gICAgQk9PTCAgICAgICAgYlNvZnRXRVA7Ci0gICAgV09SRCAgICAgICAgd0tleUN0bDsgICAgICAvLyBmb3IgYWRkcmVzcyBvZiB3S2V5Q3RsIGF0IGFsaWduIDQKKyAgICAvL3Vuc2lnbmVkIHNob3J0IHdLZXlDdGw7CisgICAgLy9ib29sIGJTb2Z0V0VQOworICAgIGJvb2wgYlNvZnRXRVA7CisgICAgdW5zaWduZWQgc2hvcnQgd0tleUN0bDsgICAgICAvLyBmb3IgYWRkcmVzcyBvZiB3S2V5Q3RsIGF0IGFsaWduIDQKIAotICAgIEJZVEUgICAgICAgIGJ5UmVzZXJ2ZWQxWzZdOworICAgIHVuc2lnbmVkIGNoYXIgYnlSZXNlcnZlZDFbNl07CiB9IFNLZXlUYWJsZSwgKlBTS2V5VGFibGU7IC8vMzQ4CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NLZXlNYW5hZ2VtZW50CkBAIC0xMDEsODMgKzEwMSw4MyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIEtleXZJbml0VGFibGUoUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwgRFdPUkRfUFRSIGR3SW9CYXNlKTsKK3ZvaWQgS2V5dkluaXRUYWJsZShQU0tleU1hbmFnZW1lbnQgcFRhYmxlLCB1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKIAotQk9PTCBLZXliR2V0S2V5KAorYm9vbCBLZXliR2V0S2V5KAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgUEJZVEUgICAgICAgICAgIHBieUJTU0lELAotICAgIERXT1JEICAgICAgICAgICBkd0tleUluZGV4LAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lELAorICAgIHVuc2lnbmVkIGxvbmcgZHdLZXlJbmRleCwKICAgICBQU0tleUl0ZW0gICAgICAgKnBLZXkKICAgICApOwogCi1CT09MIEtleWJTZXRLZXkoCitib29sIEtleWJTZXRLZXkoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBQQllURSAgICAgICAgICAgcGJ5QlNTSUQsCi0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5SW5kZXgsCi0gICAgVUxPTkcgICAgICAgICAgIHVLZXlMZW5ndGgsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5QlNTSUQsCisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4LAorICAgIHVuc2lnbmVkIGxvbmcgdUtleUxlbmd0aCwKICAgICBQUVdPUkQgICAgICAgICAgcEtleVJTQywKLSAgICBQQllURSAgICAgICAgICAgcGJ5S2V5LAotICAgIEJZVEUgICAgICAgICAgICBieUtleURlY01vZGUsCi0gICAgRFdPUkRfUFRSICAgICAgIGR3SW9CYXNlLAotICAgIEJZVEUgICAgICAgICAgICBieUxvY2FsSUQKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlLZXksCisgICAgdW5zaWduZWQgY2hhciBieUtleURlY01vZGUsCisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRAogICAgICk7CiAKLUJPT0wgS2V5YlNldERlZmF1bHRLZXkoCitib29sIEtleWJTZXREZWZhdWx0S2V5KAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5SW5kZXgsCi0gICAgVUxPTkcgICAgICAgICAgIHVLZXlMZW5ndGgsCisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4LAorICAgIHVuc2lnbmVkIGxvbmcgdUtleUxlbmd0aCwKICAgICBQUVdPUkQgICAgICAgICAgcEtleVJTQywKLSAgICBQQllURSAgICAgICAgICAgcGJ5S2V5LAotICAgIEJZVEUgICAgICAgICAgICBieUtleURlY01vZGUsCi0gICAgRFdPUkRfUFRSICAgICAgIGR3SW9CYXNlLAotICAgIEJZVEUgICAgICAgICAgICBieUxvY2FsSUQKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlLZXksCisgICAgdW5zaWduZWQgY2hhciBieUtleURlY01vZGUsCisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRAogICAgICk7CiAKLUJPT0wgS2V5YlJlbW92ZUtleSgKK2Jvb2wgS2V5YlJlbW92ZUtleSgKICAgICBQU0tleU1hbmFnZW1lbnQgcFRhYmxlLAotICAgIFBCWVRFICAgICAgICAgICBwYnlCU1NJRCwKLSAgICBEV09SRCAgICAgICAgICAgZHdLZXlJbmRleCwKLSAgICBEV09SRF9QVFIgICAgICAgZHdJb0Jhc2UKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXgsCisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZQogICAgICk7CiAKLUJPT0wgS2V5YkdldFRyYW5zbWl0S2V5KAorYm9vbCBLZXliR2V0VHJhbnNtaXRLZXkoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBQQllURSAgICAgICAgICAgcGJ5QlNTSUQsCi0gICAgRFdPUkQgICAgICAgICAgIGR3S2V5VHlwZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5VHlwZSwKICAgICBQU0tleUl0ZW0gICAgICAgKnBLZXkKICAgICApOwogCi1CT09MIEtleWJDaGVja1BhaXJld2lzZUtleSgKK2Jvb2wgS2V5YkNoZWNrUGFpcmV3aXNlS2V5KAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCiAgICAgUFNLZXlJdGVtICAgICAgICpwS2V5CiAgICAgKTsKIAotQk9PTCBLZXliUmVtb3ZlQWxsS2V5KAorYm9vbCBLZXliUmVtb3ZlQWxsS2V5KAogICAgIFBTS2V5TWFuYWdlbWVudCBwVGFibGUsCi0gICAgUEJZVEUgICAgICAgICAgIHBieUJTU0lELAotICAgIERXT1JEX1BUUiAgICAgICBkd0lvQmFzZQorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lELAorICAgIHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UKICAgICApOwogCiB2b2lkIEtleXZSZW1vdmVXRVBLZXkoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBEV09SRCAgICAgICAgICAgZHdLZXlJbmRleCwKLSAgICBEV09SRF9QVFIgICAgICAgZHdJb0Jhc2UKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXgsCisgICAgdW5zaWduZWQgbG9uZyBkd0lvQmFzZQogICAgICk7CiAKIHZvaWQgS2V5dlJlbW92ZUFsbFdFUEtleSgKICAgICBQU0tleU1hbmFnZW1lbnQgcFRhYmxlLAotICAgIERXT1JEX1BUUiAgICAgICBkd0lvQmFzZQorICAgIHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UKICAgICApOwogCi1CT09MIEtleWJTZXRBbGxHcm91cEtleSAoCitib29sIEtleWJTZXRBbGxHcm91cEtleSAoCiAgICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSwKLSAgICBEV09SRCAgICAgICAgICAgZHdLZXlJbmRleCwKLSAgICBVTE9ORyAgICAgICAgICAgdUtleUxlbmd0aCwKKyAgICB1bnNpZ25lZCBsb25nIGR3S2V5SW5kZXgsCisgICAgdW5zaWduZWQgbG9uZyB1S2V5TGVuZ3RoLAogICAgIFBRV09SRCAgICAgICAgICBwS2V5UlNDLAotICAgIFBCWVRFICAgICAgICAgICBwYnlLZXksCi0gICAgQllURSAgICAgICAgICAgIGJ5S2V5RGVjTW9kZSwKLSAgICBEV09SRF9QVFIgICAgICAgZHdJb0Jhc2UsCi0gICAgQllURSAgICAgICAgICAgIGJ5TG9jYWxJRAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUtleSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5S2V5RGVjTW9kZSwKKyAgICB1bnNpZ25lZCBsb25nIGR3SW9CYXNlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElECiAgICAgKTsKIAogI2VuZGlmIC8vIF9fS0VZX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMKaW5kZXggZjFlZjdkYS4uZjhkMTY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jCkBAIC03Miw3ICs3Miw3IEBACiAjaW5jbHVkZSAidGV0aGVyLmgiCiAjaW5jbHVkZSAibWFjLmgiCiAKLVdPUkQgVHhSYXRlX2l3Y29uZmlnOy8vMjAwOC01LTggPGFkZD4gYnkgY2hlc3RlcgordW5zaWduZWQgc2hvcnQgVHhSYXRlX2l3Y29uZmlnOy8vMjAwOC01LTggPGFkZD4gYnkgY2hlc3RlcgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8vc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CkBAIC0xMDMsNyArMTAzLDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2UmVhZEFsbFJlZ3MgKERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5TWFjUmVncykKK3ZvaWQgTUFDdlJlYWRBbGxSZWdzICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlNYWNSZWdzKQogewogICAgIGludCBpaTsKIApAQCAtMTM3LDEyICsxMzcsMTIgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgYWxsIHRlc3QgYml0cyBPbjsgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgYWxsIHRlc3QgYml0cyBPbjsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIE1BQ2JJc1JlZ0JpdHNPbiAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5UmVnT2ZzLCBCWVRFIGJ5VGVzdEJpdHMpCitib29sIE1BQ2JJc1JlZ0JpdHNPbiAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVJlZ09mcywgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKQogewotICAgIEJZVEUgYnlEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlEYXRhOwogCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBieVJlZ09mcywgJmJ5RGF0YSk7CiAgICAgcmV0dXJuIChieURhdGEgJiBieVRlc3RCaXRzKSA9PSBieVRlc3RCaXRzOwpAQCAtMTYwLDEyICsxNjAsMTIgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgYWxsIHRlc3QgYml0cyBPZmY7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIGFsbCB0ZXN0IGJpdHMgT2ZmOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgTUFDYklzUmVnQml0c09mZiAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5UmVnT2ZzLCBCWVRFIGJ5VGVzdEJpdHMpCitib29sIE1BQ2JJc1JlZ0JpdHNPZmYgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlSZWdPZnMsIHVuc2lnbmVkIGNoYXIgYnlUZXN0Qml0cykKIHsKLSAgICBCWVRFIGJ5RGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKIAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgYnlSZWdPZnMsICZieURhdGEpOwogICAgIHJldHVybiAhKGJ5RGF0YSAmIGJ5VGVzdEJpdHMpOwpAQCAtMTgxLDE4ICsxODEsMTggQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgaW50ZXJydXB0IGlzIGRpc2FibGU7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIGludGVycnVwdCBpcyBkaXNhYmxlOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgTUFDYklzSW50RGlzYWJsZSAoRFdPUkRfUFRSIGR3SW9CYXNlKQorYm9vbCBNQUNiSXNJbnREaXNhYmxlICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewotICAgIERXT1JEIGR3RGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGR3RGF0YTsKIAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19JTVIsICZkd0RhdGEpOwogICAgIGlmIChkd0RhdGEgIT0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoKQEAgLTIwOSw5ICsyMDksOSBAQAogICogUmV0dXJuIFZhbHVlOiBNYXNrIFZhbHVlIHJlYWQKICAqCiAgKi8KLUJZVEUgTUFDYnlSZWFkTXVsdGlBZGRyIChEV09SRF9QVFIgZHdJb0Jhc2UsIFVJTlQgdUJ5dGVJZHgpCit1bnNpZ25lZCBjaGFyIE1BQ2J5UmVhZE11bHRpQWRkciAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVCeXRlSWR4KQogewotICAgIEJZVEUgYnlEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlEYXRhOwogCiAgICAgTUFDdlNlbGVjdFBhZ2UxKGR3SW9CYXNlKTsKICAgICBWTlN2SW5Qb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfTUFSMCArIHVCeXRlSWR4LCAmYnlEYXRhKTsKQEAgLTIzNCw3ICsyMzQsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZXcml0ZU11bHRpQWRkciAoRFdPUkRfUFRSIGR3SW9CYXNlLCBVSU5UIHVCeXRlSWR4LCBCWVRFIGJ5RGF0YSkKK3ZvaWQgTUFDdldyaXRlTXVsdGlBZGRyICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgdUJ5dGVJZHgsIHVuc2lnbmVkIGNoYXIgYnlEYXRhKQogewogICAgIE1BQ3ZTZWxlY3RQYWdlMShkd0lvQmFzZSk7CiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19NQVIwICsgdUJ5dGVJZHgsIGJ5RGF0YSk7CkBAIC0yNTUsMTEgKzI1NSwxMSBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZTZXRNdWx0aUFkZHJCeUhhc2ggKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUhhc2hJZHgpCit2b2lkIE1BQ3ZTZXRNdWx0aUFkZHJCeUhhc2ggKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlIYXNoSWR4KQogewotICAgIFVJTlQgdUJ5dGVJZHg7Ci0gICAgQllURSBieUJpdE1hc2s7Ci0gICAgQllURSBieU9yZ1ZhbHVlOworICAgIHVuc2lnbmVkIGludCB1Qnl0ZUlkeDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Qml0TWFzazsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnVmFsdWU7CiAKICAgICAvLyBjYWxjdWxhdGUgYnl0ZSBwb3NpdGlvbgogICAgIHVCeXRlSWR4ID0gYnlIYXNoSWR4IC8gODsKQEAgLTI2OSw3ICsyNjksNyBAQAogICAgIGJ5Qml0TWFzayA8PD0gKGJ5SGFzaElkeCAlIDgpOwogICAgIC8vIHR1cm4gb24gdGhlIGJpdAogICAgIGJ5T3JnVmFsdWUgPSBNQUNieVJlYWRNdWx0aUFkZHIoZHdJb0Jhc2UsIHVCeXRlSWR4KTsKLSAgICBNQUN2V3JpdGVNdWx0aUFkZHIoZHdJb0Jhc2UsIHVCeXRlSWR4LCAoQllURSkoYnlPcmdWYWx1ZSB8IGJ5Qml0TWFzaykpOworICAgIE1BQ3ZXcml0ZU11bHRpQWRkcihkd0lvQmFzZSwgdUJ5dGVJZHgsICh1bnNpZ25lZCBjaGFyKShieU9yZ1ZhbHVlIHwgYnlCaXRNYXNrKSk7CiB9CiAKIC8qCkBAIC0yODYsMTEgKzI4NiwxMSBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZSZXNldE11bHRpQWRkckJ5SGFzaCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5SGFzaElkeCkKK3ZvaWQgTUFDdlJlc2V0TXVsdGlBZGRyQnlIYXNoICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5SGFzaElkeCkKIHsKLSAgICBVSU5UIHVCeXRlSWR4OwotICAgIEJZVEUgYnlCaXRNYXNrOwotICAgIEJZVEUgYnlPcmdWYWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgdUJ5dGVJZHg7CisgICAgdW5zaWduZWQgY2hhciBieUJpdE1hc2s7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ1ZhbHVlOwogCiAgICAgLy8gY2FsY3VsYXRlIGJ5dGUgcG9zaXRpb24KICAgICB1Qnl0ZUlkeCA9IGJ5SGFzaElkeCAvIDg7CkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICBieUJpdE1hc2sgPDw9IChieUhhc2hJZHggJSA4KTsKICAgICAvLyB0dXJuIG9mZiB0aGUgYml0CiAgICAgYnlPcmdWYWx1ZSA9IE1BQ2J5UmVhZE11bHRpQWRkcihkd0lvQmFzZSwgdUJ5dGVJZHgpOwotICAgIE1BQ3ZXcml0ZU11bHRpQWRkcihkd0lvQmFzZSwgdUJ5dGVJZHgsIChCWVRFKShieU9yZ1ZhbHVlICYgKH5ieUJpdE1hc2spKSk7CisgICAgTUFDdldyaXRlTXVsdGlBZGRyKGR3SW9CYXNlLCB1Qnl0ZUlkeCwgKHVuc2lnbmVkIGNoYXIpKGJ5T3JnVmFsdWUgJiAofmJ5Qml0TWFzaykpKTsKIH0KIAogLyoKQEAgLTMxNyw5ICszMTcsOSBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZTZXRSeFRocmVzaG9sZCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5VGhyZXNob2xkKQordm9pZCBNQUN2U2V0UnhUaHJlc2hvbGQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlUaHJlc2hvbGQpCiB7Ci0gICAgQllURSBieU9yZ1ZhbHVlOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdWYWx1ZTsKIAogICAgIEFTU0VSVChieVRocmVzaG9sZCA8IDQpOwogCkBAIC0zNDIsNyArMzQyLDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2R2V0UnhUaHJlc2hvbGQgKERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5VGhyZXNob2xkKQordm9pZCBNQUN2R2V0UnhUaHJlc2hvbGQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieVRocmVzaG9sZCkKIHsKICAgICAvLyBnZXQgRkNSMAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19GQ1IwLCBwYnlUaHJlc2hvbGQpOwpAQCAtMzYzLDkgKzM2Myw5IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdlNldFR4VGhyZXNob2xkIChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlUaHJlc2hvbGQpCit2b2lkIE1BQ3ZTZXRUeFRocmVzaG9sZCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVRocmVzaG9sZCkKIHsKLSAgICBCWVRFIGJ5T3JnVmFsdWU7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ1ZhbHVlOwogCiAgICAgQVNTRVJUKGJ5VGhyZXNob2xkIDwgNCk7CiAKQEAgLTM4OCw3ICszODgsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZHZXRUeFRocmVzaG9sZCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlUaHJlc2hvbGQpCit2b2lkIE1BQ3ZHZXRUeFRocmVzaG9sZCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5VGhyZXNob2xkKQogewogICAgIC8vIGdldCBGQ1IwCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0ZDUjAsIHBieVRocmVzaG9sZCk7CkBAIC00MDksOSArNDA5LDkgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2U2V0RG1hTGVuZ3RoIChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlEbWFMZW5ndGgpCit2b2lkIE1BQ3ZTZXREbWFMZW5ndGggKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlEbWFMZW5ndGgpCiB7Ci0gICAgQllURSBieU9yZ1ZhbHVlOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdWYWx1ZTsKIAogICAgIEFTU0VSVChieURtYUxlbmd0aCA8IDQpOwogCkBAIC00MzQsNyArNDM0LDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2R2V0RG1hTGVuZ3RoIChEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieURtYUxlbmd0aCkKK3ZvaWQgTUFDdkdldERtYUxlbmd0aCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RG1hTGVuZ3RoKQogewogICAgIC8vIGdldCBGQ1IwCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0ZDUjAsIHBieURtYUxlbmd0aCk7CkBAIC00NTUsNyArNDU1LDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2U2V0U2hvcnRSZXRyeUxpbWl0IChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlSZXRyeUxpbWl0KQordm9pZCBNQUN2U2V0U2hvcnRSZXRyeUxpbWl0ICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UmV0cnlMaW1pdCkKIHsKICAgICAvLyBzZXQgU1JUCiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19TUlQsIGJ5UmV0cnlMaW1pdCk7CkBAIC00NzQsNyArNDc0LDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2R2V0U2hvcnRSZXRyeUxpbWl0IChEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieVJldHJ5TGltaXQpCit2b2lkIE1BQ3ZHZXRTaG9ydFJldHJ5TGltaXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieVJldHJ5TGltaXQpCiB7CiAgICAgLy8gZ2V0IFNSVAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19TUlQsIHBieVJldHJ5TGltaXQpOwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdlNldExvbmdSZXRyeUxpbWl0IChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlSZXRyeUxpbWl0KQordm9pZCBNQUN2U2V0TG9uZ1JldHJ5TGltaXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlSZXRyeUxpbWl0KQogewogICAgIC8vIHNldCBMUlQKICAgICBWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0xSVCwgYnlSZXRyeUxpbWl0KTsKQEAgLTUxMyw3ICs1MTMsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZHZXRMb25nUmV0cnlMaW1pdCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlSZXRyeUxpbWl0KQordm9pZCBNQUN2R2V0TG9uZ1JldHJ5TGltaXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieVJldHJ5TGltaXQpCiB7CiAgICAgLy8gZ2V0IExSVAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19MUlQsIHBieVJldHJ5TGltaXQpOwpAQCAtNTMzLDkgKzUzMyw5IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdlNldExvb3BiYWNrTW9kZSAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5TG9vcGJhY2tNb2RlKQordm9pZCBNQUN2U2V0TG9vcGJhY2tNb2RlICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5TG9vcGJhY2tNb2RlKQogewotICAgIEJZVEUgYnlPcmdWYWx1ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnVmFsdWU7CiAKICAgICBBU1NFUlQoYnlMb29wYmFja01vZGUgPCAzKTsKICAgICBieUxvb3BiYWNrTW9kZSA8PD0gNjsKQEAgLTU1NiwxNyArNTU2LDE3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIGluIExvb3BiYWNrIG1vZGU7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIGluIExvb3BiYWNrIG1vZGU7IG90aGVyd2lzZSBmYWxzZQogICoKICAqLwotQk9PTCBNQUNiSXNJbkxvb3BiYWNrTW9kZSAoRFdPUkRfUFRSIGR3SW9CYXNlKQorYm9vbCBNQUNiSXNJbkxvb3BiYWNrTW9kZSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKLSAgICBCWVRFIGJ5T3JnVmFsdWU7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ1ZhbHVlOwogCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RFU1QsICZieU9yZ1ZhbHVlKTsKICAgICBpZiAoYnlPcmdWYWx1ZSAmIChURVNUX0xCSU5UIHwgVEVTVF9MQkVYVCkpCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtNTgzLDEwICs1ODMsMTAgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2U2V0UGFja2V0RmlsdGVyIChEV09SRF9QVFIgZHdJb0Jhc2UsIFdPUkQgd0ZpbHRlclR5cGUpCit2b2lkIE1BQ3ZTZXRQYWNrZXRGaWx0ZXIgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIHNob3J0IHdGaWx0ZXJUeXBlKQogewotICAgIEJZVEUgICAgYnlPbGRSQ1I7Ci0gICAgQllURSAgICBieU5ld1JDUiA9IDA7CisgICAgdW5zaWduZWQgY2hhciBieU9sZFJDUjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TmV3UkNSID0gMDsKIAogICAgIC8vIGlmIG9ubHkgaW4gRElSRUNURUQgbW9kZSwgbXVsdGljYXN0LWFkZHJlc3Mgd2lsbCBzZXQgdG8gemVybywKICAgICAvLyBidXQgaWYgb3RoZXIgbW9kZSBleGlzdCAoZS5nLiBQUk9NSVNDVU9VUyksIG11bHRpY2FzdC1hZGRyZXNzCkBAIC01OTUsNyArNTk1LDcgQEAKICAgICAgICAgLy8gc2V0IG11bHRpY2FzdCBhZGRyZXNzIHRvIGFjY2VwdCBub25lCiAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMShkd0lvQmFzZSk7CiAgICAgICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUFSMCwgMEwpOwotICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX01BUjAgKyBzaXplb2YoRFdPUkQpLCAwTCk7CisgICAgICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUFSMCArIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMEwpOwogICAgICAgICBNQUN2U2VsZWN0UGFnZTAoZHdJb0Jhc2UpOwogICAgIH0KIApAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgICAgIC8vIHNldCBtdWx0aWNhc3QgYWRkcmVzcyB0byBhY2NlcHQgYWxsCiAgICAgICAgIE1BQ3ZTZWxlY3RQYWdlMShkd0lvQmFzZSk7CiAgICAgICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUFSMCwgMHhGRkZGRkZGRkwpOwotICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX01BUjAgKyBzaXplb2YoRFdPUkQpLCAweEZGRkZGRkZGTCk7CisgICAgICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUFSMCArIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMHhGRkZGRkZGRkwpOwogICAgICAgICBNQUN2U2VsZWN0UGFnZTAoZHdJb0Jhc2UpOwogICAgIH0KIApAQCAtNjQzLDcgKzY0Myw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdlNhdmVDb250ZXh0IChEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieUN4dEJ1ZikKK3ZvaWQgTUFDdlNhdmVDb250ZXh0ICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlDeHRCdWYpCiB7CiAgICAgaW50ICAgICAgICAgaWk7CiAKQEAgLTY3Niw3ICs2NzYsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZSZXN0b3JlQ29udGV4dCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlDeHRCdWYpCit2b2lkIE1BQ3ZSZXN0b3JlQ29udGV4dCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5Q3h0QnVmKQogewogICAgIGludCAgICAgICAgIGlpOwogCkBAIC03MDMsMTQgKzcwMywxNCBAQAogICAgIH0KIAogICAgIC8vIHJlc3RvcmUgQ1VSUl9SWF9ERVNDX0FERFIsIENVUlJfVFhfREVTQ19BRERSCi0gICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQVBUUjAsICooUERXT1JEKShwYnlDeHRCdWYgKyBNQUNfUkVHX1RYRE1BUFRSMCkpOwotICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfQUMwRE1BUFRSLCAqKFBEV09SRCkocGJ5Q3h0QnVmICsgTUFDX1JFR19BQzBETUFQVFIpKTsKLSAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0JDTkRNQVBUUiwgKihQRFdPUkQpKHBieUN4dEJ1ZiArIE1BQ19SRUdfQkNORE1BUFRSKSk7CisgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQVBUUjAsICoodW5zaWduZWQgbG9uZyAqKShwYnlDeHRCdWYgKyBNQUNfUkVHX1RYRE1BUFRSMCkpOworICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfQUMwRE1BUFRSLCAqKHVuc2lnbmVkIGxvbmcgKikocGJ5Q3h0QnVmICsgTUFDX1JFR19BQzBETUFQVFIpKTsKKyAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0JDTkRNQVBUUiwgKih1bnNpZ25lZCBsb25nICopKHBieUN4dEJ1ZiArIE1BQ19SRUdfQkNORE1BUFRSKSk7CiAKIAotICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFQVFIwLCAqKFBEV09SRCkocGJ5Q3h0QnVmICsgTUFDX1JFR19SWERNQVBUUjApKTsKKyAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BUFRSMCwgKih1bnNpZ25lZCBsb25nICopKHBieUN4dEJ1ZiArIE1BQ19SRUdfUlhETUFQVFIwKSk7CiAKLSAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BUFRSMSwgKihQRFdPUkQpKHBieUN4dEJ1ZiArIE1BQ19SRUdfUlhETUFQVFIxKSk7CisgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19SWERNQVBUUjEsICoodW5zaWduZWQgbG9uZyAqKShwYnlDeHRCdWYgKyBNQUNfUkVHX1JYRE1BUFRSMSkpOwogCiB9CiAKQEAgLTcyNSwzOSArNzI1LDM5IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIGFsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBhbGwgdmFsdWVzIGFyZSB0aGUgc2FtZTsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIE1BQ2JDb21wYXJlQ29udGV4dCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlDeHRCdWYpCitib29sIE1BQ2JDb21wYXJlQ29udGV4dCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5Q3h0QnVmKQogewotICAgIERXT1JEICAgICAgIGR3RGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGR3RGF0YTsKIAogICAgIC8vIGNvbXBhcmUgTUFDIGNvbnRleHQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBwb3dlciBsb3N0IGluaXQsCi0gICAgLy8gcmV0dXJuIFRSVUUgZm9yIHBvd2VyIHJlbWFpbmluZyBpbml0LCByZXR1cm4gRkFMU0UgZm9yIHBvd2VyIGxvc3QgaW5pdAorICAgIC8vIHJldHVybiB0cnVlIGZvciBwb3dlciByZW1haW5pbmcgaW5pdCwgcmV0dXJuIGZhbHNlIGZvciBwb3dlciBsb3N0IGluaXQKIAogICAgIC8vIGNvbXBhcmUgQ1VSUl9SWF9ERVNDX0FERFIsIENVUlJfVFhfREVTQ19BRERSCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1RYRE1BUFRSMCwgJmR3RGF0YSk7Ci0gICAgaWYgKGR3RGF0YSAhPSAqKFBEV09SRCkocGJ5Q3h0QnVmICsgTUFDX1JFR19UWERNQVBUUjApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZHdEYXRhICE9ICoodW5zaWduZWQgbG9uZyAqKShwYnlDeHRCdWYgKyBNQUNfUkVHX1RYRE1BUFRSMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19BQzBETUFQVFIsICZkd0RhdGEpOwotICAgIGlmIChkd0RhdGEgIT0gKihQRFdPUkQpKHBieUN4dEJ1ZiArIE1BQ19SRUdfQUMwRE1BUFRSKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGR3RGF0YSAhPSAqKHVuc2lnbmVkIGxvbmcgKikocGJ5Q3h0QnVmICsgTUFDX1JFR19BQzBETUFQVFIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFQVFIwLCAmZHdEYXRhKTsKLSAgICBpZiAoZHdEYXRhICE9ICooUERXT1JEKShwYnlDeHRCdWYgKyBNQUNfUkVHX1JYRE1BUFRSMCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChkd0RhdGEgIT0gKih1bnNpZ25lZCBsb25nICopKHBieUN4dEJ1ZiArIE1BQ19SRUdfUlhETUFQVFIwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BUFRSMSwgJmR3RGF0YSk7Ci0gICAgaWYgKGR3RGF0YSAhPSAqKFBEV09SRCkocGJ5Q3h0QnVmICsgTUFDX1JFR19SWERNQVBUUjEpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZHdEYXRhICE9ICoodW5zaWduZWQgbG9uZyAqKShwYnlDeHRCdWYgKyBNQUNfUkVHX1JYRE1BUFRSMSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qCkBAIC03NzAsMTMgKzc3MCwxMyBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBSZXNldCBTdWNjZXNzOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBSZXNldCBTdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgTUFDYlNvZnR3YXJlUmVzZXQgKERXT1JEX1BUUiBkd0lvQmFzZSkKK2Jvb2wgTUFDYlNvZnR3YXJlUmVzZXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpCiB7Ci0gICAgQllURSAgICBieURhdGE7Ci0gICAgV09SRCAgICB3dzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3dzsKIAogICAgIC8vIHR1cm4gb24gSE9TVENSX1NPRlRSU1QsIGp1c3Qgd3JpdGUgMHgwMSB0byByZXNldAogICAgIC8vTUFDdlJlZ0JpdHNPbihkd0lvQmFzZSwgTUFDX1JFR19IT1NUQ1IsIEhPU1RDUl9TT0ZUUlNUKTsKQEAgLTc4OCw4ICs3ODgsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmICh3dyA9PSBXX01BWF9USU1FT1VUKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIAogfQogCkBAIC04MDMsMTMgKzgwMywxMyBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgTUFDYlNhZmVTb2Z0d2FyZVJlc2V0IChEV09SRF9QVFIgZHdJb0Jhc2UpCitib29sIE1BQ2JTYWZlU29mdHdhcmVSZXNldCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKLSAgICBCWVRFICAgIGFieVRtcFJlZ0RhdGFbTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTArTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTFdOwotICAgIEJPT0wgICAgYlJldFZhbDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVRtcFJlZ0RhdGFbTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTArTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTFdOworICAgIGJvb2wgYlJldFZhbDsKIAogICAgIC8vIFBBVENILi4uLgogICAgIC8vIHNhdmUgc29tZSBpbXBvcnRhbnQgcmVnaXN0ZXIncyB2YWx1ZSwgdGhlbiBkbwpAQCAtODM2LDE0ICs4MzYsMTQgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2Vzczsgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIE1BQ2JTYWZlUnhPZmYgKERXT1JEX1BUUiBkd0lvQmFzZSkKK2Jvb2wgTUFDYlNhZmVSeE9mZiAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKLSAgICBXT1JEICAgIHd3OwotICAgIERXT1JEICAgZHdEYXRhOwotICAgIEJZVEUgICAgYnlEYXRhOworICAgIHVuc2lnbmVkIHNob3J0IHd3OworICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlEYXRhOwogCiAgICAgLy8gdHVybiBvZmYgd293IHRlbXAgZm9yIHR1cm4gb2ZmIFJ4IHNhZmVseQogCkBAIC04NTgsNyArODU4LDcgQEAKICAgICBpZiAod3cgPT0gV19NQVhfVElNRU9VVCkgewogICAgICAgICBEQkdfUE9SVDgwKDB4MTApOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBEQkdfUE9SVDgwKDB4MTApXG4iKTsKLSAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICB9CiAgICAgZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgewogICAgICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFDVEwxLCAmZHdEYXRhKTsKQEAgLTg2OCw3ICs4NjgsNyBAQAogICAgIGlmICh3dyA9PSBXX01BWF9USU1FT1VUKSB7CiAgICAgICAgIERCR19QT1JUODAoMHgxMSk7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIERCR19QT1JUODAoMHgxMSlcbiIpOwotICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgIH0KIAogICAgIC8vIHRyeSB0byBzYWZlIHNodXRkb3duIFJYCkBAIC04ODIsOSArODgyLDkgQEAKICAgICBpZiAod3cgPT0gV19NQVhfVElNRU9VVCkgewogICAgICAgICBEQkdfUE9SVDgwKDB4MTIpOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBEQkdfUE9SVDgwKDB4MTIpXG4iKTsKLSAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qCkBAIC04OTcsMTQgKzg5NywxNCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgTUFDYlNhZmVUeE9mZiAoRFdPUkRfUFRSIGR3SW9CYXNlKQorYm9vbCBNQUNiU2FmZVR4T2ZmICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewotICAgIFdPUkQgICAgd3c7Ci0gICAgRFdPUkQgICBkd0RhdGE7Ci0gICAgQllURSAgICBieURhdGE7CisgICAgdW5zaWduZWQgc2hvcnQgd3c7CisgICAgdW5zaWduZWQgbG9uZyBkd0RhdGE7CisgICAgdW5zaWduZWQgY2hhciBieURhdGE7CiAKICAgICAvLyBDbGVhciBUWCBETUEKICAgICAvL1R4MApAQCAtOTIxLDcgKzkyMSw3IEBACiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpIHsKICAgICAgICAgREJHX1BPUlQ4MCgweDIwKTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgREJHX1BPUlQ4MCgweDIwKVxuIik7Ci0gICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgfQogICAgIGZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKICAgICAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0FDMERNQUNUTCwgJmR3RGF0YSk7CkBAIC05MzEsNyArOTMxLDcgQEAKICAgICBpZiAod3cgPT0gV19NQVhfVElNRU9VVCkgewogICAgICAgICBEQkdfUE9SVDgwKDB4MjEpOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBEQkdfUE9SVDgwKDB4MjEpXG4iKTsKLSAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICB9CiAKICAgICAvLyB0cnkgdG8gc2FmZSBzaHV0ZG93biBUWApAQCAtOTQ2LDkgKzk0Niw5IEBACiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpIHsKICAgICAgICAgREJHX1BPUlQ4MCgweDI0KTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgREJHX1BPUlQ4MCgweDI0KVxuIik7Ci0gICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogCiAvKgpAQCAtOTYxLDI5ICs5NjEsMjkgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2Vzczsgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIE1BQ2JTYWZlU3RvcCAoRFdPUkRfUFRSIGR3SW9CYXNlKQorYm9vbCBNQUNiU2FmZVN0b3AgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpCiB7CiAgICAgTUFDdlJlZ0JpdHNPZmYoZHdJb0Jhc2UsIE1BQ19SRUdfVENSLCBUQ1JfQVVUT0JDTlRYKTsKIAotICAgIGlmIChNQUNiU2FmZVJ4T2ZmKGR3SW9CYXNlKSA9PSBGQUxTRSkgeworICAgIGlmIChNQUNiU2FmZVJ4T2ZmKGR3SW9CYXNlKSA9PSBmYWxzZSkgewogICAgICAgICBEQkdfUE9SVDgwKDB4QTEpOwotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBNQUNiU2FmZVJ4T2ZmID09IEZBTFNFKVxuIik7CisgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIE1BQ2JTYWZlUnhPZmYgPT0gZmFsc2UpXG4iKTsKICAgICAgICAgTUFDYlNhZmVTb2Z0d2FyZVJlc2V0KGR3SW9CYXNlKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmIChNQUNiU2FmZVR4T2ZmKGR3SW9CYXNlKSA9PSBGQUxTRSkgeworICAgIGlmIChNQUNiU2FmZVR4T2ZmKGR3SW9CYXNlKSA9PSBmYWxzZSkgewogICAgICAgICBEQkdfUE9SVDgwKDB4QTIpOwotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBNQUNiU2FmZVR4T2ZmID09IEZBTFNFKVxuIik7CisgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIE1BQ2JTYWZlVHhPZmYgPT0gZmFsc2UpXG4iKTsKICAgICAgICAgTUFDYlNhZmVTb2Z0d2FyZVJlc2V0KGR3SW9CYXNlKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgTUFDdlJlZ0JpdHNPZmYoZHdJb0Jhc2UsIE1BQ19SRUdfSE9TVENSLCBIT1NUQ1JfTUFDRU4pOwogCi0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qCkBAIC05OTYsMTAgKzk5NiwxMCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgTUFDYlNodXRkb3duIChEV09SRF9QVFIgZHdJb0Jhc2UpCitib29sIE1BQ2JTaHV0ZG93biAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKICAgICAvLyBkaXNhYmxlIE1BQyBJTVIKICAgICBNQUN2SW50RGlzYWJsZShkd0lvQmFzZSk7CkBAIC0xMDA3LDEwICsxMDA3LDEwIEBACiAgICAgLy8gc3RvcCB0aGUgYWRhcHRlcgogICAgIGlmICghTUFDYlNhZmVTdG9wKGR3SW9CYXNlKSkgewogICAgICAgICBNQUN2U2V0TG9vcGJhY2tNb2RlKGR3SW9CYXNlLCBNQUNfTEJfTk9ORSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBNQUN2U2V0TG9vcGJhY2tNb2RlKGR3SW9CYXNlLCBNQUNfTEJfTk9ORSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qCkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZJbml0aWFsaXplIChEV09SRF9QVFIgZHdJb0Jhc2UpCit2b2lkIE1BQ3ZJbml0aWFsaXplICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewogICAgIC8vIGNsZWFyIHN0aWNreSBiaXRzCiAgICAgTUFDdkNsZWFyU3Rja0RTKGR3SW9CYXNlKTsKQEAgLTEwNDUsOCArMTA0NSw4IEBACiAgICAgLy8gaXNzdWUgQVVUT0xEIGluIEVFQ1NSIHRvIHJlbG9hZCBlZXByb20KICAgICAvL01BQ3ZSZWdCaXRzT24oZHdJb0Jhc2UsIE1BQ19SRUdfSTJNQ1NSLCBJMk1DU1JfQVVUT0xEKTsKICAgICAvLyB3YWl0IHVudGlsIEVFUFJPTSBsb2FkaW5nIGNvbXBsZXRlCi0gICAgLy93aGlsZSAoVFJVRSkgewotICAgIC8vICAgIFU4IHU4RGF0YTsKKyAgICAvL3doaWxlICh0cnVlKSB7CisgICAgLy8gICAgdTggdThEYXRhOwogICAgIC8vICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19JMk1DU1IsICZ1OERhdGEpOwogICAgIC8vICAgIGlmICggISh1OERhdGEgJiBJMk1DU1JfQVVUT0xEKSkKICAgICAvLyAgICAgICAgYnJlYWs7CkBAIC0xMDc5LDExICsxMDc5LDExIEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdlNldEN1cnJSeDBEZXNjQWRkciAoRFdPUkRfUFRSIGR3SW9CYXNlLCBEV09SRCBkd0N1cnJEZXNjQWRkcikKK3ZvaWQgTUFDdlNldEN1cnJSeDBEZXNjQWRkciAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0N1cnJEZXNjQWRkcikKIHsKLVdPUkQgICAgd3c7Ci1CWVRFICAgIGJ5RGF0YTsKLUJZVEUgICAgYnlPcmdETUFDdGw7Cit1bnNpZ25lZCBzaG9ydCB3dzsKK3Vuc2lnbmVkIGNoYXIgYnlEYXRhOwordW5zaWduZWQgY2hhciBieU9yZ0RNQUN0bDsKIAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19SWERNQUNUTDAsICZieU9yZ0RNQUN0bCk7CiAgICAgaWYgKGJ5T3JnRE1BQ3RsICYgRE1BQ1RMX1JVTikgewpAQCAtMTExNywxMSArMTExNywxMSBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZTZXRDdXJyUngxRGVzY0FkZHIgKERXT1JEX1BUUiBkd0lvQmFzZSwgRFdPUkQgZHdDdXJyRGVzY0FkZHIpCit2b2lkIE1BQ3ZTZXRDdXJyUngxRGVzY0FkZHIgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgZHdDdXJyRGVzY0FkZHIpCiB7Ci1XT1JEICAgIHd3OwotQllURSAgICBieURhdGE7Ci1CWVRFICAgIGJ5T3JnRE1BQ3RsOwordW5zaWduZWQgc2hvcnQgd3c7Cit1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKK3Vuc2lnbmVkIGNoYXIgYnlPcmdETUFDdGw7CiAKICAgICBWTlN2SW5Qb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFDVEwxLCAmYnlPcmdETUFDdGwpOwogICAgIGlmIChieU9yZ0RNQUN0bCAmIERNQUNUTF9SVU4pIHsKQEAgLTExNTUsMTEgKzExNTUsMTEgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2U2V0Q3VyclR4MERlc2NBZGRyRXggKERXT1JEX1BUUiBkd0lvQmFzZSwgRFdPUkQgZHdDdXJyRGVzY0FkZHIpCit2b2lkIE1BQ3ZTZXRDdXJyVHgwRGVzY0FkZHJFeCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0N1cnJEZXNjQWRkcikKIHsKLVdPUkQgICAgd3c7Ci1CWVRFICAgIGJ5RGF0YTsKLUJZVEUgICAgYnlPcmdETUFDdGw7Cit1bnNpZ25lZCBzaG9ydCB3dzsKK3Vuc2lnbmVkIGNoYXIgYnlEYXRhOwordW5zaWduZWQgY2hhciBieU9yZ0RNQUN0bDsKIAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQUNUTDAsICZieU9yZ0RNQUN0bCk7CiAgICAgaWYgKGJ5T3JnRE1BQ3RsICYgRE1BQ1RMX1JVTikgewpAQCAtMTE5NCwxMSArMTE5NCwxMSBAQAogICoKICAqLwogIC8vVHhETUExID0gQUMwRE1BCi12b2lkIE1BQ3ZTZXRDdXJyQUMwRGVzY0FkZHJFeCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBEV09SRCBkd0N1cnJEZXNjQWRkcikKK3ZvaWQgTUFDdlNldEN1cnJBQzBEZXNjQWRkckV4ICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBsb25nIGR3Q3VyckRlc2NBZGRyKQogewotV09SRCAgICB3dzsKLUJZVEUgICAgYnlEYXRhOwotQllURSAgICBieU9yZ0RNQUN0bDsKK3Vuc2lnbmVkIHNob3J0IHd3OwordW5zaWduZWQgY2hhciBieURhdGE7Cit1bnNpZ25lZCBjaGFyIGJ5T3JnRE1BQ3RsOwogCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0FDMERNQUNUTCwgJmJ5T3JnRE1BQ3RsKTsKICAgICBpZiAoYnlPcmdETUFDdGwgJiBETUFDVExfUlVOKSB7CkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCiAKIAotdm9pZCBNQUN2U2V0Q3VyclRYRGVzY0FkZHIgKGludCBpVHhUeXBlLCBEV09SRF9QVFIgZHdJb0Jhc2UsIERXT1JEIGR3Q3VyckRlc2NBZGRyKQordm9pZCBNQUN2U2V0Q3VyclRYRGVzY0FkZHIgKGludCBpVHhUeXBlLCB1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBsb25nIGR3Q3VyckRlc2NBZGRyKQogewogICAgIGlmKGlUeFR5cGUgPT0gVFlQRV9BQzBETUEpewogICAgICAgICBNQUN2U2V0Q3VyckFDMERlc2NBZGRyRXgoZHdJb0Jhc2UsIGR3Q3VyckRlc2NBZGRyKTsKQEAgLTEyNDQsMTAgKzEyNDQsMTAgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2VGltZXIwTWljcm9TRGVsYXkgKERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1RGVsYXkpCit2b2lkIE1BQ3ZUaW1lcjBNaWNyb1NEZWxheSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVEZWxheSkKIHsKLUJZVEUgYnlWYWx1ZTsKLVVJTlQgdXUsaWk7Cit1bnNpZ25lZCBjaGFyIGJ5VmFsdWU7Cit1bnNpZ25lZCBpbnQgdXUsaWk7CiAKICAgICBWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RNQ1RMMCwgMCk7CiAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UTURBVEEwLCB1RGVsYXkpOwpAQCAtMTI4MCw3ICsxMjgwLDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBNQUN2T25lU2hvdFRpbWVyME1pY3JvU2VjIChEV09SRF9QVFIgZHdJb0Jhc2UsIFVJTlQgdURlbGF5VGltZSkKK3ZvaWQgTUFDdk9uZVNob3RUaW1lcjBNaWNyb1NlYyAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVEZWxheVRpbWUpCiB7CiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19UTUNUTDAsIDApOwogICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfVE1EQVRBMCwgdURlbGF5VGltZSk7CkBAIC0xMzAxLDcgKzEzMDEsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZPbmVTaG90VGltZXIxTWljcm9TZWMgKERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1RGVsYXlUaW1lKQordm9pZCBNQUN2T25lU2hvdFRpbWVyMU1pY3JvU2VjICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgdURlbGF5VGltZSkKIHsKICAgICBWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RNQ1RMMSwgMCk7CiAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UTURBVEExLCB1RGVsYXlUaW1lKTsKQEAgLTEzMDksNyArMTMwOSw3IEBACiB9CiAKIAotdm9pZCBNQUN2U2V0TUlTQ0ZpZm8gKERXT1JEX1BUUiBkd0lvQmFzZSwgV09SRCB3T2Zmc2V0LCBEV09SRCBkd0RhdGEpCit2b2lkIE1BQ3ZTZXRNSVNDRmlmbyAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgc2hvcnQgd09mZnNldCwgdW5zaWduZWQgbG9uZyBkd0RhdGEpCiB7CiAgICAgaWYgKHdPZmZzZXQgPiAyNzMpCiAgICAgICAgIHJldHVybjsKQEAgLTEzMTksMTAgKzEzMTksMTAgQEAKIH0KIAogCi1CT09MIE1BQ2JUeERNQU9mZiAoRFdPUkRfUFRSIGR3SW9CYXNlLCBVSU5UIGlkeCkKK2Jvb2wgTUFDYlR4RE1BT2ZmICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgaWR4KQogewotQllURSBieURhdGE7Ci1VSU5UIHd3ID0gMDsKK3Vuc2lnbmVkIGNoYXIgYnlEYXRhOwordW5zaWduZWQgaW50IHd3ID0gMDsKIAogICAgIGlmIChpZHggPT0gVFlQRV9UWERNQTApIHsKICAgICAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQUNUTDArMiwgRE1BQ1RMX1JVTik7CkBAIC0xMzQyLDE1ICsxMzQyLDE1IEBACiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpIHsKICAgICAgICAgREJHX1BPUlQ4MCgweDI5KTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgREJHX1BPUlQ4MCgweDI5KVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBNQUN2Q2xlYXJCdXNTdXNJbmQgKERXT1JEX1BUUiBkd0lvQmFzZSkKK3ZvaWQgTUFDdkNsZWFyQnVzU3VzSW5kICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewotICAgIERXT1JEIGR3T3JnVmFsdWU7Ci0gICAgVUlOVCB3dzsKKyAgICB1bnNpZ25lZCBsb25nIGR3T3JnVmFsdWU7CisgICAgdW5zaWduZWQgaW50IHd3OwogICAgIC8vIGNoZWNrIGlmIEJjblN1c0luZCBlbmFibGVkCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0VOQ0ZHICwgJmR3T3JnVmFsdWUpOwogICAgIGlmKCAhKGR3T3JnVmFsdWUgJiBFbkNGR19CY25TdXNJbmQpKQpAQCAtMTM2OSwxMSArMTM2OSwxMSBAQAogICAgIH0KIH0KIAotdm9pZCBNQUN2RW5hYmxlQnVzU3VzRW4gKERXT1JEX1BUUiBkd0lvQmFzZSkKK3ZvaWQgTUFDdkVuYWJsZUJ1c1N1c0VuICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewotICAgIEJZVEUgIGJ5T3JnVmFsdWU7Ci0gICAgRFdPUkQgZHdPcmdWYWx1ZTsKLSAgICBVSU5UIHd3OworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdWYWx1ZTsKKyAgICB1bnNpZ25lZCBsb25nIGR3T3JnVmFsdWU7CisgICAgdW5zaWduZWQgaW50IHd3OwogICAgIC8vIGNoZWNrIGlmIEJjblN1c0luZCBlbmFibGVkCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0NGRyAsICZieU9yZ1ZhbHVlKTsKIApAQCAtMTM5MSwxMCArMTM5MSwxMCBAQAogICAgIH0KIH0KIAotQk9PTCBNQUNiRmx1c2hTWU5DRmlmbyAoRFdPUkRfUFRSIGR3SW9CYXNlKQorYm9vbCBNQUNiRmx1c2hTWU5DRmlmbyAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKLSAgICBCWVRFICBieU9yZ1ZhbHVlOwotICAgIFVJTlQgd3c7CisgICAgdW5zaWduZWQgY2hhciBieU9yZ1ZhbHVlOworICAgIHVuc2lnbmVkIGludCB3dzsKICAgICAvLyBSZWFkIE1BQ0NSCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX01BQ0NSICwgJmJ5T3JnVmFsdWUpOwogCkBAIC0xNDEyLDE2ICsxNDEyLDE2IEBACiAgICAgICAgIERCR19QT1JUODAoMHgzNSk7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIERCR19QT1JUODAoMHgzMylcbiIpOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotQk9PTCBNQUNiUFNXYWtldXAgKERXT1JEX1BUUiBkd0lvQmFzZSkKK2Jvb2wgTUFDYlBTV2FrZXVwICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKQogewotICAgIEJZVEUgIGJ5T3JnVmFsdWU7Ci0gICAgVUlOVCB3dzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnVmFsdWU7CisgICAgdW5zaWduZWQgaW50IHd3OwogICAgIC8vIFJlYWQgUFNDVEwKICAgICBpZiAoTUFDYklzUmVnQml0c09mZihkd0lvQmFzZSwgTUFDX1JFR19QU0NUTCwgUFNDVExfUFMpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgLy8gRGlzYWJsZSBQUwogICAgIE1BQ3ZSZWdCaXRzT2ZmKGR3SW9CYXNlLCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9QU0VOKTsKQEAgLTE0MzUsOSArMTQzNSw5IEBACiAgICAgaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpIHsKICAgICAgICAgREJHX1BPUlQ4MCgweDM2KTsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgREJHX1BPUlQ4MCgweDMzKVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoKQEAgLTE0NTUsMTAgKzE0NTUsMTEgQEAKICAqCiAgKi8KIAotdm9pZCBNQUN2U2V0S2V5RW50cnkgKERXT1JEX1BUUiBkd0lvQmFzZSwgV09SRCB3S2V5Q3RsLCBVSU5UIHVFbnRyeUlkeCwgVUlOVCB1S2V5SWR4LCBQQllURSBwYnlBZGRyLCBQRFdPUkQgcGR3S2V5LCBCWVRFIGJ5TG9jYWxJRCkKK3ZvaWQgTUFDdlNldEtleUVudHJ5ICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3S2V5Q3RsLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4LAorCQl1bnNpZ25lZCBpbnQgdUtleUlkeCwgdW5zaWduZWQgY2hhciAqcGJ5QWRkciwgdW5zaWduZWQgbG9uZyAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCkKIHsKLVdPUkQgICAgd09mZnNldDsKLURXT1JEICAgZHdEYXRhOwordW5zaWduZWQgc2hvcnQgd09mZnNldDsKK3Vuc2lnbmVkIGxvbmcgZHdEYXRhOwogaW50ICAgICBpaTsKIAogICAgIGlmIChieUxvY2FsSUQgPD0gMSkKQEAgLTE1MjEsOSArMTUyMiw5IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdkRpc2FibGVLZXlFbnRyeSAoRFdPUkRfUFRSIGR3SW9CYXNlLCBVSU5UIHVFbnRyeUlkeCkKK3ZvaWQgTUFDdkRpc2FibGVLZXlFbnRyeSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCkKIHsKLVdPUkQgICAgd09mZnNldDsKK3Vuc2lnbmVkIHNob3J0IHdPZmZzZXQ7CiAKICAgICB3T2Zmc2V0ID0gTUlTQ0ZJRk9fS0VZRVRSWTA7CiAgICAgd09mZnNldCArPSAodUVudHJ5SWR4ICogTUlTQ0ZJRk9fS0VZRU5UUllTSVpFKTsKQEAgLTE1NDksMTAgKzE1NTAsMTEgQEAKICAqCiAgKi8KIAotdm9pZCBNQUN2U2V0RGVmYXVsdEtleUVudHJ5IChEV09SRF9QVFIgZHdJb0Jhc2UsIFVJTlQgdUtleUxlbiwgVUlOVCB1S2V5SWR4LCBQRFdPUkQgcGR3S2V5LCBCWVRFIGJ5TG9jYWxJRCkKK3ZvaWQgTUFDdlNldERlZmF1bHRLZXlFbnRyeSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVLZXlMZW4sCisJCXVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKQogewotV09SRCAgICB3T2Zmc2V0OwotRFdPUkQgICBkd0RhdGE7Cit1bnNpZ25lZCBzaG9ydCB3T2Zmc2V0OwordW5zaWduZWQgbG9uZyBkd0RhdGE7CiBpbnQgICAgIGlpOwogCiAgICAgaWYgKGJ5TG9jYWxJRCA8PSAxKQpAQCAtMTU5OSwxMCArMTYwMSwxMCBAQAogICoKICAqLwogLyoKLXZvaWQgTUFDdkVuYWJsZURlZmF1bHRLZXkgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUxvY2FsSUQpCit2b2lkIE1BQ3ZFbmFibGVEZWZhdWx0S2V5ICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCkKIHsKLVdPUkQgICAgd09mZnNldDsKLURXT1JEICAgZHdEYXRhOwordW5zaWduZWQgc2hvcnQgd09mZnNldDsKK3Vuc2lnbmVkIGxvbmcgZHdEYXRhOwogCiAKICAgICBpZiAoYnlMb2NhbElEIDw9IDEpCkBAIC0xNjM0LDEwICsxNjM2LDEwIEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdkRpc2FibGVEZWZhdWx0S2V5IChEV09SRF9QVFIgZHdJb0Jhc2UpCit2b2lkIE1BQ3ZEaXNhYmxlRGVmYXVsdEtleSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKLVdPUkQgICAgd09mZnNldDsKLURXT1JEICAgZHdEYXRhOwordW5zaWduZWQgc2hvcnQgd09mZnNldDsKK3Vuc2lnbmVkIGxvbmcgZHdEYXRhOwogCiAKICAgICB3T2Zmc2V0ID0gTUlTQ0ZJRk9fS0VZRVRSWTA7CkBAIC0xNjY0LDEwICsxNjY2LDExIEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgTUFDdlNldERlZmF1bHRUS0lQS2V5RW50cnkgKERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1S2V5TGVuLCBVSU5UIHVLZXlJZHgsIFBEV09SRCBwZHdLZXksIEJZVEUgYnlMb2NhbElEKQordm9pZCBNQUN2U2V0RGVmYXVsdFRLSVBLZXlFbnRyeSAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVLZXlMZW4sCisJCXVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKQogewotV09SRCAgICB3T2Zmc2V0OwotRFdPUkQgICBkd0RhdGE7Cit1bnNpZ25lZCBzaG9ydCB3T2Zmc2V0OwordW5zaWduZWQgbG9uZyBkd0RhdGE7CiBpbnQgICAgIGlpOwogCiAgICAgaWYgKGJ5TG9jYWxJRCA8PSAxKQpAQCAtMTcyMCwxMCArMTcyMywxMCBAQAogICoKICAqLwogCi12b2lkIE1BQ3ZTZXREZWZhdWx0S2V5Q3RsIChEV09SRF9QVFIgZHdJb0Jhc2UsIFdPUkQgd0tleUN0bCwgVUlOVCB1RW50cnlJZHgsIEJZVEUgYnlMb2NhbElEKQordm9pZCBNQUN2U2V0RGVmYXVsdEtleUN0bCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgc2hvcnQgd0tleUN0bCwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpCiB7Ci1XT1JEICAgIHdPZmZzZXQ7Ci1EV09SRCAgIGR3RGF0YTsKK3Vuc2lnbmVkIHNob3J0IHdPZmZzZXQ7Cit1bnNpZ25lZCBsb25nIGR3RGF0YTsKIAogICAgIGlmIChieUxvY2FsSUQgPD0gMSkKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmgKaW5kZXggNWViN2Y1Ny4uYjk2ZDI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5oCkBAIC02NjMsMjggKzY2MywyOCBAQAogCiAjZGVmaW5lIE1BQ3ZSZWdCaXRzT24oZHdJb0Jhc2UsIGJ5UmVnT2ZzLCBieUJpdHMpICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQllURSBieURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBieURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBieVJlZ09mcywgJmJ5RGF0YSk7ICAgICAgICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgYnlSZWdPZnMsIGJ5RGF0YSB8IChieUJpdHMpKTsgICBcCiB9CiAKICNkZWZpbmUgTUFDdldvcmRSZWdCaXRzT24oZHdJb0Jhc2UsIGJ5UmVnT2ZzLCB3Qml0cykgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBXT1JEIHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBzaG9ydCB3RGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0Vyhkd0lvQmFzZSArIGJ5UmVnT2ZzLCAmd0RhdGEpOyAgICAgICAgICAgICAgIFwKICAgICBWTlN2T3V0UG9ydFcoZHdJb0Jhc2UgKyBieVJlZ09mcywgd0RhdGEgfCAod0JpdHMpKTsgICAgIFwKIH0KIAogI2RlZmluZSBNQUN2RFdvcmRSZWdCaXRzT24oZHdJb0Jhc2UsIGJ5UmVnT2ZzLCBkd0JpdHMpICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERXT1JEIGR3RGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgYnlSZWdPZnMsICZkd0RhdGEpOyAgICAgICAgICAgICAgXAogICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIGJ5UmVnT2ZzLCBkd0RhdGEgfCAoZHdCaXRzKSk7ICAgXAogfQogCiAjZGVmaW5lIE1BQ3ZSZWdCaXRzT25FeChkd0lvQmFzZSwgYnlSZWdPZnMsIGJ5TWFzaywgYnlCaXRzKSBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQllURSBieURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBieURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBieVJlZ09mcywgJmJ5RGF0YSk7ICAgICAgICAgICAgICBcCiAgICAgYnlEYXRhICY9IGJ5TWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgYnlSZWdPZnMsIGJ5RGF0YSB8IChieUJpdHMpKTsgICBcCkBAIC02OTIsMjEgKzY5MiwyMSBAQAogCiAjZGVmaW5lIE1BQ3ZSZWdCaXRzT2ZmKGR3SW9CYXNlLCBieVJlZ09mcywgYnlCaXRzKSAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQllURSBieURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBieURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBieVJlZ09mcywgJmJ5RGF0YSk7ICAgICAgICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgYnlSZWdPZnMsIGJ5RGF0YSAmIH4oYnlCaXRzKSk7ICBcCiB9CiAKICNkZWZpbmUgTUFDdldvcmRSZWdCaXRzT2ZmKGR3SW9CYXNlLCBieVJlZ09mcywgd0JpdHMpICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBXT1JEIHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBzaG9ydCB3RGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0Vyhkd0lvQmFzZSArIGJ5UmVnT2ZzLCAmd0RhdGEpOyAgICAgICAgICAgICAgIFwKICAgICBWTlN2T3V0UG9ydFcoZHdJb0Jhc2UgKyBieVJlZ09mcywgd0RhdGEgJiB+KHdCaXRzKSk7ICAgIFwKIH0KIAogI2RlZmluZSBNQUN2RFdvcmRSZWdCaXRzT2ZmKGR3SW9CYXNlLCBieVJlZ09mcywgZHdCaXRzKSAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERXT1JEIGR3RGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgYnlSZWdPZnMsICZkd0RhdGEpOyAgICAgICAgICAgICAgXAogICAgIFZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIGJ5UmVnT2ZzLCBkd0RhdGEgJiB+KGR3Qml0cykpOyAgXAogfQpAQCAtNzE0LDM3ICs3MTQsMzcgQEAKICNkZWZpbmUgTUFDdkdldEN1cnJSeDBEZXNjQWRkcihkd0lvQmFzZSwgcGR3Q3VyckRlc2NBZGRyKSAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BUFRSMCwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKFBEV09SRClwZHdDdXJyRGVzY0FkZHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgKilwZHdDdXJyRGVzY0FkZHIpOyAgICAgICAgICBcCiB9CiAKICNkZWZpbmUgTUFDdkdldEN1cnJSeDFEZXNjQWRkcihkd0lvQmFzZSwgcGR3Q3VyckRlc2NBZGRyKSAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFQVFIxLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoUERXT1JEKXBkd0N1cnJEZXNjQWRkcik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyAqKXBkd0N1cnJEZXNjQWRkcik7ICAgICAgICAgIFwKIH0KIAogI2RlZmluZSBNQUN2R2V0Q3VyclR4MERlc2NBZGRyKGR3SW9CYXNlLCBwZHdDdXJyRGVzY0FkZHIpICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQVBUUjAsICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChQRFdPUkQpcGR3Q3VyckRlc2NBZGRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nICopcGR3Q3VyckRlc2NBZGRyKTsgICAgICAgICAgXAogfQogCiAjZGVmaW5lIE1BQ3ZHZXRDdXJyQUMwRGVzY0FkZHIoZHdJb0Jhc2UsIHBkd0N1cnJEZXNjQWRkcikgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0FDMERNQVBUUiwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKFBEV09SRClwZHdDdXJyRGVzY0FkZHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgKilwZHdDdXJyRGVzY0FkZHIpOyAgICAgICAgICBcCiB9CiAKICNkZWZpbmUgTUFDdkdldEN1cnJTeW5jRGVzY0FkZHIoZHdJb0Jhc2UsIHBkd0N1cnJEZXNjQWRkcikgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfU1lOQ0RNQVBUUiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoUERXT1JEKXBkd0N1cnJEZXNjQWRkcik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyAqKXBkd0N1cnJEZXNjQWRkcik7ICAgICAgICAgIFwKIH0KIAogI2RlZmluZSBNQUN2R2V0Q3VyckFUSU1EZXNjQWRkcihkd0lvQmFzZSwgcGR3Q3VyckRlc2NBZGRyKSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19BVElNRE1BUFRSLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChQRFdPUkQpcGR3Q3VyckRlc2NBZGRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nICopcGR3Q3VyckRlc2NBZGRyKTsgICAgICAgICAgXAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiAvLyBzZXQgdGhlIGNoaXAgd2l0aCBjdXJyZW50IEJDTiB0eCBkZXNjcmlwdG9yIGFkZHJlc3MKQEAgLTc2NSw3ICs3NjUsNyBAQAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfUEFHRTFTRUwsIDEpOyAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19CU1NJRDAsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChQQllURSlwYnlFdGhlckFkZHIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcGJ5RXRoZXJBZGRyKTsgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19CU1NJRDAgKyAxLCAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIHBieUV0aGVyQWRkciArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19CU1NJRDAgKyAyLCAgICAgICAgICAgICAgXApAQCAtODAxLDcgKzgwMSw3IEBACiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19QQUdFMVNFTCwgMSk7ICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1BBUjAsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKFBCWVRFKXBieUV0aGVyQWRkcik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwYnlFdGhlckFkZHIpOyAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1BBUjAgKyAxLCAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgcGJ5RXRoZXJBZGRyICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1BBUjAgKyAyLCAgICAgICAgICAgICAgICBcCkBAIC04NzMsNyArODczLDcgQEAKIAogI2RlZmluZSBNQUN2UmVjZWl2ZTAoZHdJb0Jhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRFdPUkQgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFDVEwwLCAmZHdEYXRhKTsgICAgICAgICBcCiAgICAgaWYgKGR3RGF0YSAmIERNQUNUTF9SVU4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BQ1RMMCwgRE1BQ1RMX1dBS0UpO1wKQEAgLTg4NSw3ICs4ODUsNyBAQAogCiAjZGVmaW5lIE1BQ3ZSZWNlaXZlMShkd0lvQmFzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFDVEwxLCAmZHdEYXRhKTsgICAgICAgICBcCiAgICAgaWYgKGR3RGF0YSAmIERNQUNUTF9SVU4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BQ1RMMSwgRE1BQ1RMX1dBS0UpO1wKQEAgLTkwMiw3ICs5MDIsNyBAQAogCiAjZGVmaW5lIE1BQ3ZUcmFuc21pdDAoZHdJb0Jhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfVFhETUFDVEwwLCAmZHdEYXRhKTsgICAgICAgICBcCiAgICAgaWYgKGR3RGF0YSAmIERNQUNUTF9SVU4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1RYRE1BQ1RMMCwgRE1BQ1RMX1dBS0UpO1wKQEAgLTkxNCw3ICs5MTQsNyBAQAogCiAjZGVmaW5lIE1BQ3ZUcmFuc21pdEFDMChkd0lvQmFzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfQUMwRE1BQ1RMLCAmZHdEYXRhKTsgICAgICAgICBcCiAgICAgaWYgKGR3RGF0YSAmIERNQUNUTF9SVU4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0FDMERNQUNUTCwgRE1BQ1RMX1dBS0UpO1wKQEAgLTkyNiw3ICs5MjYsNyBAQAogCiAjZGVmaW5lIE1BQ3ZUcmFuc21pdFNZTkMoZHdJb0Jhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERXT1JEIGR3RGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgZHdEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1NZTkNETUFDVEwsICZkd0RhdGEpOyAgICAgICAgIFwKICAgICBpZiAoZHdEYXRhICYgRE1BQ1RMX1JVTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1NZTkNETUFDVEwsIERNQUNUTF9XQUtFKTtcCkBAIC05MzgsNyArOTM4LDcgQEAKIAogI2RlZmluZSBNQUN2VHJhbnNtaXRBVElNKGR3SW9CYXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGR3RGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZOU3ZJblBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19BVElNRE1BQ1RMLCAmZHdEYXRhKTsgICAgICAgICBcCiAgICAgaWYgKGR3RGF0YSAmIERNQUNUTF9SVU4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19BVElNRE1BQ1RMLCBETUFDVExfV0FLRSk7XApAQCAtOTU1LDcgKzk1NSw3IEBACiAKICNkZWZpbmUgTUFDdkNsZWFyU3Rja0RTKGR3SW9CYXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCWVRFIGJ5T3JnVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfU1RJQ0tIVywgJmJ5T3JnVmFsdWUpOyAgIFwKICAgICBieU9yZ1ZhbHVlID0gYnlPcmdWYWx1ZSAmIDB4RkM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1NUSUNLSFcsIGJ5T3JnVmFsdWUpOyAgIFwKQEAgLTEwMDIsNyArMTAwMiw3IEBACiAKICNkZWZpbmUgTUFDdkVuYWJsZVByb3RlY3RNRChkd0lvQmFzZSkgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd09yZ1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGR3T3JnVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfRU5DRkcgLCAmZHdPcmdWYWx1ZSk7IFwKICAgICBkd09yZ1ZhbHVlID0gZHdPcmdWYWx1ZSB8IEVuQ0ZHX1Byb3RlY3RNZDsgICAgICAgICAgIFwKICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0VOQ0ZHLCBkd09yZ1ZhbHVlKTsgIFwKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAKICNkZWZpbmUgTUFDdkRpc2FibGVQcm90ZWN0TUQoZHdJb0Jhc2UpICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd09yZ1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBkd09yZ1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0VOQ0ZHICwgJmR3T3JnVmFsdWUpOyBcCiAgICAgZHdPcmdWYWx1ZSA9IGR3T3JnVmFsdWUgJiB+RW5DRkdfUHJvdGVjdE1kOyAgICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19FTkNGRywgZHdPcmdWYWx1ZSk7ICBcCkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCiAjZGVmaW5lIE1BQ3ZFbmFibGVCYXJrZXJQcmVhbWJsZU1kKGR3SW9CYXNlKSAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRFdPUkQgZHdPcmdWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBkd09yZ1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0VOQ0ZHICwgJmR3T3JnVmFsdWUpOyBcCiAgICAgZHdPcmdWYWx1ZSA9IGR3T3JnVmFsdWUgfCBFbkNGR19CYXJrZXJQcmVhbTsgICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19FTkNGRywgZHdPcmdWYWx1ZSk7ICBcCkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogCiAjZGVmaW5lIE1BQ3ZEaXNhYmxlQmFya2VyUHJlYW1ibGVNZChkd0lvQmFzZSkgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRFdPUkQgZHdPcmdWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBkd09yZ1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVk5TdkluUG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0VOQ0ZHICwgJmR3T3JnVmFsdWUpOyBcCiAgICAgZHdPcmdWYWx1ZSA9IGR3T3JnVmFsdWUgJiB+RW5DRkdfQmFya2VyUHJlYW07ICAgICAgICBcCiAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19FTkNGRywgZHdPcmdWYWx1ZSk7ICBcCkBAIC0xMDM0LDEwICsxMDM0LDEwIEBACiAKICNkZWZpbmUgTUFDdlNldEJCVHlwZShkd0lvQmFzZSwgYnlUeXApICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEV09SRCBkd09yZ1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGR3T3JnVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWTlN2SW5Qb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfRU5DRkcgLCAmZHdPcmdWYWx1ZSk7IFwKICAgICBkd09yZ1ZhbHVlID0gZHdPcmdWYWx1ZSAmIH5FbkNGR19CQlR5cGVfTUFTSzsgICAgICAgIFwKLSAgICBkd09yZ1ZhbHVlID0gZHdPcmdWYWx1ZSB8IChEV09SRCkgYnlUeXA7ICAgICAgICAgICAgIFwKKyAgICBkd09yZ1ZhbHVlID0gZHdPcmdWYWx1ZSB8ICh1bnNpZ25lZCBsb25nKSBieVR5cDsgICAgIFwKICAgICBWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0VOQ0ZHLCBkd09yZ1ZhbHVlKTsgIFwKIH0KIApAQCAtMTA3NCw3OCArMTA3NCw4MSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1leHRlcm4gV09SRCBUeFJhdGVfaXdjb25maWc7Ly8yMDA4LTUtOCA8YWRkPiBieSBjaGVzdGVyCi12b2lkIE1BQ3ZSZWFkQWxsUmVncyhEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieU1hY1JlZ3MpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IFR4UmF0ZV9pd2NvbmZpZzsvLzIwMDgtNS04IDxhZGQ+IGJ5IGNoZXN0ZXIKK3ZvaWQgTUFDdlJlYWRBbGxSZWdzKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieU1hY1JlZ3MpOwogCi1CT09MIE1BQ2JJc1JlZ0JpdHNPbihEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlSZWdPZnMsIEJZVEUgYnlUZXN0Qml0cyk7Ci1CT09MIE1BQ2JJc1JlZ0JpdHNPZmYoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5UmVnT2ZzLCBCWVRFIGJ5VGVzdEJpdHMpOworYm9vbCBNQUNiSXNSZWdCaXRzT24odW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVJlZ09mcywgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKTsKK2Jvb2wgTUFDYklzUmVnQml0c09mZih1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UmVnT2ZzLCB1bnNpZ25lZCBjaGFyIGJ5VGVzdEJpdHMpOwogCi1CT09MIE1BQ2JJc0ludERpc2FibGUoRFdPUkRfUFRSIGR3SW9CYXNlKTsKK2Jvb2wgTUFDYklzSW50RGlzYWJsZSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKIAotQllURSBNQUNieVJlYWRNdWx0aUFkZHIoRFdPUkRfUFRSIGR3SW9CYXNlLCBVSU5UIHVCeXRlSWR4KTsKLXZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1Qnl0ZUlkeCwgQllURSBieURhdGEpOwotdm9pZCBNQUN2U2V0TXVsdGlBZGRyQnlIYXNoKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUhhc2hJZHgpOwotdm9pZCBNQUN2UmVzZXRNdWx0aUFkZHJCeUhhc2goRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5SGFzaElkeCk7Cit1bnNpZ25lZCBjaGFyIE1BQ2J5UmVhZE11bHRpQWRkcih1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgdUJ5dGVJZHgpOwordm9pZCBNQUN2V3JpdGVNdWx0aUFkZHIodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVCeXRlSWR4LCB1bnNpZ25lZCBjaGFyIGJ5RGF0YSk7Cit2b2lkIE1BQ3ZTZXRNdWx0aUFkZHJCeUhhc2godW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUhhc2hJZHgpOwordm9pZCBNQUN2UmVzZXRNdWx0aUFkZHJCeUhhc2godW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUhhc2hJZHgpOwogCi12b2lkIE1BQ3ZTZXRSeFRocmVzaG9sZChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlUaHJlc2hvbGQpOwotdm9pZCBNQUN2R2V0UnhUaHJlc2hvbGQoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlUaHJlc2hvbGQpOwordm9pZCBNQUN2U2V0UnhUaHJlc2hvbGQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVRocmVzaG9sZCk7Cit2b2lkIE1BQ3ZHZXRSeFRocmVzaG9sZCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlUaHJlc2hvbGQpOwogCi12b2lkIE1BQ3ZTZXRUeFRocmVzaG9sZChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlUaHJlc2hvbGQpOwotdm9pZCBNQUN2R2V0VHhUaHJlc2hvbGQoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlUaHJlc2hvbGQpOwordm9pZCBNQUN2U2V0VHhUaHJlc2hvbGQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVRocmVzaG9sZCk7Cit2b2lkIE1BQ3ZHZXRUeFRocmVzaG9sZCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlUaHJlc2hvbGQpOwogCi12b2lkIE1BQ3ZTZXREbWFMZW5ndGgoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5RG1hTGVuZ3RoKTsKLXZvaWQgTUFDdkdldERtYUxlbmd0aChEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieURtYUxlbmd0aCk7Cit2b2lkIE1BQ3ZTZXREbWFMZW5ndGgodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieURtYUxlbmd0aCk7Cit2b2lkIE1BQ3ZHZXREbWFMZW5ndGgodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RG1hTGVuZ3RoKTsKIAotdm9pZCBNQUN2U2V0U2hvcnRSZXRyeUxpbWl0KERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieVJldHJ5TGltaXQpOwotdm9pZCBNQUN2R2V0U2hvcnRSZXRyeUxpbWl0KERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5UmV0cnlMaW1pdCk7Cit2b2lkIE1BQ3ZTZXRTaG9ydFJldHJ5TGltaXQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVJldHJ5TGltaXQpOwordm9pZCBNQUN2R2V0U2hvcnRSZXRyeUxpbWl0KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieVJldHJ5TGltaXQpOwogCi12b2lkIE1BQ3ZTZXRMb25nUmV0cnlMaW1pdChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlSZXRyeUxpbWl0KTsKLXZvaWQgTUFDdkdldExvbmdSZXRyeUxpbWl0KERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5UmV0cnlMaW1pdCk7Cit2b2lkIE1BQ3ZTZXRMb25nUmV0cnlMaW1pdCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UmV0cnlMaW1pdCk7Cit2b2lkIE1BQ3ZHZXRMb25nUmV0cnlMaW1pdCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlSZXRyeUxpbWl0KTsKIAotdm9pZCBNQUN2U2V0TG9vcGJhY2tNb2RlKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUxvb3BiYWNrTW9kZSk7Ci1CT09MIE1BQ2JJc0luTG9vcGJhY2tNb2RlKERXT1JEX1BUUiBkd0lvQmFzZSk7Cit2b2lkIE1BQ3ZTZXRMb29wYmFja01vZGUodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUxvb3BiYWNrTW9kZSk7Citib29sIE1BQ2JJc0luTG9vcGJhY2tNb2RlKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOwogCi12b2lkIE1BQ3ZTZXRQYWNrZXRGaWx0ZXIoRFdPUkRfUFRSIGR3SW9CYXNlLCBXT1JEIHdGaWx0ZXJUeXBlKTsKK3ZvaWQgTUFDdlNldFBhY2tldEZpbHRlcih1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3RmlsdGVyVHlwZSk7CiAKLXZvaWQgTUFDdlNhdmVDb250ZXh0KERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5Q3h0QnVmKTsKLXZvaWQgTUFDdlJlc3RvcmVDb250ZXh0KERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5Q3h0QnVmKTsKLUJPT0wgTUFDYkNvbXBhcmVDb250ZXh0KERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5Q3h0QnVmKTsKK3ZvaWQgTUFDdlNhdmVDb250ZXh0KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieUN4dEJ1Zik7Cit2b2lkIE1BQ3ZSZXN0b3JlQ29udGV4dCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlDeHRCdWYpOworYm9vbCBNQUNiQ29tcGFyZUNvbnRleHQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5Q3h0QnVmKTsKIAotQk9PTCBNQUNiU29mdHdhcmVSZXNldChEV09SRF9QVFIgZHdJb0Jhc2UpOwotQk9PTCBNQUNiU2FmZVNvZnR3YXJlUmVzZXQoRFdPUkRfUFRSIGR3SW9CYXNlKTsKLUJPT0wgTUFDYlNhZmVSeE9mZihEV09SRF9QVFIgZHdJb0Jhc2UpOwotQk9PTCBNQUNiU2FmZVR4T2ZmKERXT1JEX1BUUiBkd0lvQmFzZSk7Ci1CT09MIE1BQ2JTYWZlU3RvcChEV09SRF9QVFIgZHdJb0Jhc2UpOwotQk9PTCBNQUNiU2h1dGRvd24oRFdPUkRfUFRSIGR3SW9CYXNlKTsKLXZvaWQgTUFDdkluaXRpYWxpemUoRFdPUkRfUFRSIGR3SW9CYXNlKTsKLXZvaWQgTUFDdlNldEN1cnJSeDBEZXNjQWRkcihEV09SRF9QVFIgZHdJb0Jhc2UsIERXT1JEIGR3Q3VyckRlc2NBZGRyKTsKLXZvaWQgTUFDdlNldEN1cnJSeDFEZXNjQWRkcihEV09SRF9QVFIgZHdJb0Jhc2UsIERXT1JEIGR3Q3VyckRlc2NBZGRyKTsKLXZvaWQgTUFDdlNldEN1cnJUWERlc2NBZGRyKGludCBpVHhUeXBlLCBEV09SRF9QVFIgZHdJb0Jhc2UsIERXT1JEIGR3Q3VyckRlc2NBZGRyKTsKLXZvaWQgTUFDdlNldEN1cnJUeDBEZXNjQWRkckV4KERXT1JEX1BUUiBkd0lvQmFzZSwgRFdPUkQgZHdDdXJyRGVzY0FkZHIpOwotdm9pZCBNQUN2U2V0Q3VyckFDMERlc2NBZGRyRXgoRFdPUkRfUFRSIGR3SW9CYXNlLCBEV09SRCBkd0N1cnJEZXNjQWRkcik7Ci12b2lkIE1BQ3ZTZXRDdXJyU3luY0Rlc2NBZGRyRXgoRFdPUkRfUFRSIGR3SW9CYXNlLCBEV09SRCBkd0N1cnJEZXNjQWRkcik7Ci12b2lkIE1BQ3ZTZXRDdXJyQVRJTURlc2NBZGRyRXgoRFdPUkRfUFRSIGR3SW9CYXNlLCBEV09SRCBkd0N1cnJEZXNjQWRkcik7Ci12b2lkIE1BQ3ZUaW1lcjBNaWNyb1NEZWxheShEV09SRF9QVFIgZHdJb0Jhc2UsIFVJTlQgdURlbGF5KTsKLXZvaWQgTUFDdk9uZVNob3RUaW1lcjBNaWNyb1NlYyhEV09SRF9QVFIgZHdJb0Jhc2UsIFVJTlQgdURlbGF5VGltZSk7Ci12b2lkIE1BQ3ZPbmVTaG90VGltZXIxTWljcm9TZWMoRFdPUkRfUFRSIGR3SW9CYXNlLCBVSU5UIHVEZWxheVRpbWUpOworYm9vbCBNQUNiU29mdHdhcmVSZXNldCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKK2Jvb2wgTUFDYlNhZmVTb2Z0d2FyZVJlc2V0KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOworYm9vbCBNQUNiU2FmZVJ4T2ZmKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOworYm9vbCBNQUNiU2FmZVR4T2ZmKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOworYm9vbCBNQUNiU2FmZVN0b3AodW5zaWduZWQgbG9uZyBkd0lvQmFzZSk7Citib29sIE1BQ2JTaHV0ZG93bih1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKK3ZvaWQgTUFDdkluaXRpYWxpemUodW5zaWduZWQgbG9uZyBkd0lvQmFzZSk7Cit2b2lkIE1BQ3ZTZXRDdXJyUngwRGVzY0FkZHIodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0N1cnJEZXNjQWRkcik7Cit2b2lkIE1BQ3ZTZXRDdXJyUngxRGVzY0FkZHIodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0N1cnJEZXNjQWRkcik7Cit2b2lkIE1BQ3ZTZXRDdXJyVFhEZXNjQWRkcihpbnQgaVR4VHlwZSwgdW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0N1cnJEZXNjQWRkcik7Cit2b2lkIE1BQ3ZTZXRDdXJyVHgwRGVzY0FkZHJFeCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBsb25nIGR3Q3VyckRlc2NBZGRyKTsKK3ZvaWQgTUFDdlNldEN1cnJBQzBEZXNjQWRkckV4KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgZHdDdXJyRGVzY0FkZHIpOwordm9pZCBNQUN2U2V0Q3VyclN5bmNEZXNjQWRkckV4KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgZHdDdXJyRGVzY0FkZHIpOwordm9pZCBNQUN2U2V0Q3VyckFUSU1EZXNjQWRkckV4KHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgZHdDdXJyRGVzY0FkZHIpOwordm9pZCBNQUN2VGltZXIwTWljcm9TRGVsYXkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVEZWxheSk7Cit2b2lkIE1BQ3ZPbmVTaG90VGltZXIwTWljcm9TZWModW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVEZWxheVRpbWUpOwordm9pZCBNQUN2T25lU2hvdFRpbWVyMU1pY3JvU2VjKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGludCB1RGVsYXlUaW1lKTsKIAotdm9pZCBNQUN2U2V0TUlTQ0ZpZm8oRFdPUkRfUFRSIGR3SW9CYXNlLCBXT1JEIHdPZmZzZXQsIERXT1JEIGR3RGF0YSk7Cit2b2lkIE1BQ3ZTZXRNSVNDRmlmbyh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3T2Zmc2V0LCB1bnNpZ25lZCBsb25nIGR3RGF0YSk7CiAKLUJPT0wgTUFDYlR4RE1BT2ZmIChEV09SRF9QVFIgZHdJb0Jhc2UsIFVJTlQgaWR4KTsKK2Jvb2wgTUFDYlR4RE1BT2ZmICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBpbnQgaWR4KTsKIAotdm9pZCBNQUN2Q2xlYXJCdXNTdXNJbmQoRFdPUkRfUFRSIGR3SW9CYXNlKTsKLXZvaWQgTUFDdkVuYWJsZUJ1c1N1c0VuKERXT1JEX1BUUiBkd0lvQmFzZSk7Cit2b2lkIE1BQ3ZDbGVhckJ1c1N1c0luZCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKK3ZvaWQgTUFDdkVuYWJsZUJ1c1N1c0VuKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOwogCi1CT09MIE1BQ2JGbHVzaFNZTkNGaWZvKERXT1JEX1BUUiBkd0lvQmFzZSk7Ci1CT09MIE1BQ2JQU1dha2V1cChEV09SRF9QVFIgZHdJb0Jhc2UpOworYm9vbCBNQUNiRmx1c2hTWU5DRmlmbyh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKK2Jvb2wgTUFDYlBTV2FrZXVwKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpOwogCi12b2lkIE1BQ3ZTZXRLZXlFbnRyeShEV09SRF9QVFIgZHdJb0Jhc2UsIFdPUkQgd0tleUN0bCwgVUlOVCB1RW50cnlJZHgsIFVJTlQgdUtleUlkeCwgUEJZVEUgcGJ5QWRkciwgUERXT1JEIHBkd0tleSwgQllURSBieUxvY2FsSUQpOwotdm9pZCBNQUN2RGlzYWJsZUtleUVudHJ5KERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1RW50cnlJZHgpOwotdm9pZCBNQUN2U2V0RGVmYXVsdEtleUVudHJ5KERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1S2V5TGVuLCBVSU5UIHVLZXlJZHgsIFBEV09SRCBwZHdLZXksIEJZVEUgYnlMb2NhbElEKTsKLS8vdm9pZCBNQUN2RW5hYmxlRGVmYXVsdEtleShEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlMb2NhbElEKTsKLXZvaWQgTUFDdkRpc2FibGVEZWZhdWx0S2V5KERXT1JEX1BUUiBkd0lvQmFzZSk7Ci12b2lkIE1BQ3ZTZXREZWZhdWx0VEtJUEtleUVudHJ5KERXT1JEX1BUUiBkd0lvQmFzZSwgVUlOVCB1S2V5TGVuLCBVSU5UIHVLZXlJZHgsIFBEV09SRCBwZHdLZXksIEJZVEUgYnlMb2NhbElEKTsKLXZvaWQgTUFDdlNldERlZmF1bHRLZXlDdGwoRFdPUkRfUFRSIGR3SW9CYXNlLCBXT1JEIHdLZXlDdGwsIFVJTlQgdUVudHJ5SWR4LCBCWVRFIGJ5TG9jYWxJRCk7Cit2b2lkIE1BQ3ZTZXRLZXlFbnRyeSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3S2V5Q3RsLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4LAorCQl1bnNpZ25lZCBpbnQgdUtleUlkeCwgdW5zaWduZWQgY2hhciAqcGJ5QWRkciwgdW5zaWduZWQgbG9uZyAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7Cit2b2lkIE1BQ3ZEaXNhYmxlS2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCk7Cit2b2lkIE1BQ3ZTZXREZWZhdWx0S2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVLZXlMZW4sCisJCXVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKTsKKy8vdm9pZCBNQUN2RW5hYmxlRGVmYXVsdEtleSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7Cit2b2lkIE1BQ3ZEaXNhYmxlRGVmYXVsdEtleSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKK3ZvaWQgTUFDdlNldERlZmF1bHRUS0lQS2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVLZXlMZW4sCisJCXVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKTsKK3ZvaWQgTUFDdlNldERlZmF1bHRLZXlDdGwodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgc2hvcnQgd0tleUN0bCwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpOwogCiAjZW5kaWYgLy8gX19NQUNfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5jCmluZGV4IDRjYTc4NzcuLjFiOTFhODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuYwpAQCAtOTAsNyArOTAsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIFNUQXZVcGRhdGVJc3JTdGF0Q291bnRlciAoUFNTdGF0Q291bnRlciBwU3RhdGlzdGljLCBEV09SRCBkd0lzcikKK3ZvaWQgU1RBdlVwZGF0ZUlzclN0YXRDb3VudGVyIChQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMsIHVuc2lnbmVkIGxvbmcgZHdJc3IpCiB7CiAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCiAgICAgLyogQUJOT1JNQUwgaW50ZXJydXB0ICovCkBAIC0xNzcsOCArMTc3LDggQEAKICAqCiAgKi8KIHZvaWQgU1RBdlVwZGF0ZVJEU3RhdENvdW50ZXIgKFBTU3RhdENvdW50ZXIgcFN0YXRpc3RpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgYnlSU1IsIEJZVEUgYnlOZXdSU1IsIEJZVEUgYnlSeFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQllURSBwYnlCdWZmZXIsIFVJTlQgY2JGcmFtZUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnlSU1IsIHVuc2lnbmVkIGNoYXIgYnlOZXdSU1IsIHVuc2lnbmVkIGNoYXIgYnlSeFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoKQogewogICAgIC8vbmVlZCBjaGFuZ2UKICAgICBQUzgwMl8xMUhlYWRlciBwSGVhZGVyID0gKFBTODAyXzExSGVhZGVyKXBieUJ1ZmZlcjsKQEAgLTE5NCwxNSArMTk0LDE1IEBACiAgICAgICAgICAgICAvLyB1cGRhdGUgY291bnRlcnMgaW4gY2FzZSB0aGF0IHN1Y2Nlc3NmdWwgdHJhbnNtaXQKICAgICAgICAgICAgIGlmIChieVJTUiAmIFJTUl9BRERSQlJPQUQpIHsKICAgICAgICAgICAgICAgICBwU3RhdGlzdGljLT51bGxSeEJyb2FkY2FzdEZyYW1lcysrOwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWMtPnVsbFJ4QnJvYWRjYXN0Qnl0ZXMgKz0gKFVMT05HTE9ORyljYkZyYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWMtPnVsbFJ4QnJvYWRjYXN0Qnl0ZXMgKz0gKHVuc2lnbmVkIGxvbmcgbG9uZykgY2JGcmFtZUxlbmd0aDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGJ5UlNSICYgUlNSX0FERFJNVUxUSSkgewogICAgICAgICAgICAgICAgIHBTdGF0aXN0aWMtPnVsbFJ4TXVsdGljYXN0RnJhbWVzKys7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpYy0+dWxsUnhNdWx0aWNhc3RCeXRlcyArPSAoVUxPTkdMT05HKWNiRnJhbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpYy0+dWxsUnhNdWx0aWNhc3RCeXRlcyArPSAodW5zaWduZWQgbG9uZyBsb25nKSBjYkZyYW1lTGVuZ3RoOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgcFN0YXRpc3RpYy0+dWxsUnhEaXJlY3RlZEZyYW1lcysrOwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWMtPnVsbFJ4RGlyZWN0ZWRCeXRlcyArPSAoVUxPTkdMT05HKWNiRnJhbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpYy0+dWxsUnhEaXJlY3RlZEJ5dGVzICs9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGNiRnJhbWVMZW5ndGg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTIsODcgKzIxMiw4NyBAQAogICAgICAgICBpZihieVJTUiAmIFJTUl9DUkNPSykgewogICAgICAgICAgICAgcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IxMU1DUkNPaysrOwogICAgICAgICB9Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iMTFNOiBBTExbJWRdLCBPS1slZF06WyUwMnhdXG4iLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTFNLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTFNQ1JDT2ssIGJ5UlNSKTsKKyAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIxMU06IEFMTFslZF0sIE9LWyVkXTpbJTAyeF1cbiIsIChpbnQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IxMU0sIChpbnQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IxMU1DUkNPaywgYnlSU1IpOwogICAgIH0KICAgICBlbHNlIGlmKGJ5UnhSYXRlPT0xMSkgewogICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjVNKys7CiAgICAgICAgIGlmKGJ5UlNSICYgUlNSX0NSQ09LKSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjVNQ1JDT2srKzsKICAgICAgICAgfQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiA1TTogQUxMWyVkXSwgT0tbJWRdOlslMDJ4XVxuIiwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjVNLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNU1DUkNPaywgYnlSU1IpOworICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiA1TTogQUxMWyVkXSwgT0tbJWRdOlslMDJ4XVxuIiwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjVNLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNU1DUkNPaywgYnlSU1IpOwogICAgIH0KICAgICBlbHNlIGlmKGJ5UnhSYXRlPT00KSB7CiAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMk0rKzsKICAgICAgICAgaWYoYnlSU1IgJiBSU1JfQ1JDT0spIHsKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMk1DUkNPaysrOwogICAgICAgICB9Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIDJNOiBBTExbJWRdLCBPS1slZF06WyUwMnhdXG4iLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMk0sIChJTlQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyTUNSQ09rLCBieVJTUik7CisgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIDJNOiBBTExbJWRdLCBPS1slZF06WyUwMnhdXG4iLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMk0sIChpbnQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyTUNSQ09rLCBieVJTUik7CiAgICAgfQogICAgIGVsc2UgaWYoYnlSeFJhdGU9PTIpewogICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjFNKys7CiAgICAgICAgIGlmKGJ5UlNSICYgUlNSX0NSQ09LKSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjFNQ1JDT2srKzsKICAgICAgICAgfQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiAxTTogQUxMWyVkXSwgT0tbJWRdOlslMDJ4XVxuIiwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjFNLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMU1DUkNPaywgYnlSU1IpOworICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiAxTTogQUxMWyVkXSwgT0tbJWRdOlslMDJ4XVxuIiwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjFNLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMU1DUkNPaywgYnlSU1IpOwogICAgIH0KICAgICBlbHNlIGlmKGJ5UnhSYXRlPT0xMil7CiAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNk0rKzsKICAgICAgICAgaWYoYnlSU1IgJiBSU1JfQ1JDT0spIHsKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNk1DUkNPaysrOwogICAgICAgICB9Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIDZNOiBBTExbJWRdLCBPS1slZF1cbiIsIChJTlQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3I2TSwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjZNQ1JDT2spOworICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiA2TTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNk0sIChpbnQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3I2TUNSQ09rKTsKICAgICB9CiAgICAgZWxzZSBpZihieVJ4UmF0ZT09MTgpewogICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjlNKys7CiAgICAgICAgIGlmKGJ5UlNSICYgUlNSX0NSQ09LKSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjlNQ1JDT2srKzsKICAgICAgICAgfQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiA5TTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyOU0sIChJTlQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3I5TUNSQ09rKTsKKyAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgOU06IEFMTFslZF0sIE9LWyVkXVxuIiwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjlNLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyOU1DUkNPayk7CiAgICAgfQogICAgIGVsc2UgaWYoYnlSeFJhdGU9PTI0KXsKICAgICAgICAgcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IxMk0rKzsKICAgICAgICAgaWYoYnlSU1IgJiBSU1JfQ1JDT0spIHsKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTJNQ1JDT2srKzsKICAgICAgICAgfQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjEyTTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTJNLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTJNQ1JDT2spOworICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjEyTTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTJNLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMTJNQ1JDT2spOwogICAgIH0KICAgICBlbHNlIGlmKGJ5UnhSYXRlPT0zNil7CiAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMThNKys7CiAgICAgICAgIGlmKGJ5UlNSICYgUlNSX0NSQ09LKSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjE4TUNSQ09rKys7CiAgICAgICAgIH0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIxOE06IEFMTFslZF0sIE9LWyVkXVxuIiwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjE4TSwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjE4TUNSQ09rKTsKKyAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIxOE06IEFMTFslZF0sIE9LWyVkXVxuIiwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjE4TSwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjE4TUNSQ09rKTsKICAgICB9CiAgICAgZWxzZSBpZihieVJ4UmF0ZT09NDgpewogICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjI0TSsrOwogICAgICAgICBpZihieVJTUiAmIFJTUl9DUkNPSykgewogICAgICAgICAgICAgcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyNE1DUkNPaysrOwogICAgICAgICB9Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iMjRNOiBBTExbJWRdLCBPS1slZF1cbiIsIChJTlQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyNE0sIChJTlQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyNE1DUkNPayk7CisgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iMjRNOiBBTExbJWRdLCBPS1slZF1cbiIsIChpbnQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyNE0sIChpbnQpcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IyNE1DUkNPayk7CiAgICAgfQogICAgIGVsc2UgaWYoYnlSeFJhdGU9PTcyKXsKICAgICAgICAgcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3IzNk0rKzsKICAgICAgICAgaWYoYnlSU1IgJiBSU1JfQ1JDT0spIHsKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMzZNQ1JDT2srKzsKICAgICAgICAgfQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjM2TTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMzZNLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMzZNQ1JDT2spOworICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjM2TTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMzZNLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyMzZNQ1JDT2spOwogICAgIH0KICAgICBlbHNlIGlmKGJ5UnhSYXRlPT05Nil7CiAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNDhNKys7CiAgICAgICAgIGlmKGJ5UlNSICYgUlNSX0NSQ09LKSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjQ4TUNSQ09rKys7CiAgICAgICAgIH0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyI0OE06IEFMTFslZF0sIE9LWyVkXVxuIiwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjQ4TSwgKElOVClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjQ4TUNSQ09rKTsKKyAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyI0OE06IEFMTFslZF0sIE9LWyVkXVxuIiwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjQ4TSwgKGludClwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFJzcjQ4TUNSQ09rKTsKICAgICB9CiAgICAgZWxzZSBpZihieVJ4UmF0ZT09MTA4KXsKICAgICAgICAgcFN0YXRpc3RpYy0+Q3VzdG9tU3RhdC51bGxSc3I1NE0rKzsKICAgICAgICAgaWYoYnlSU1IgJiBSU1JfQ1JDT0spIHsKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNTRNQ1JDT2srKzsKICAgICAgICAgfQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjU0TTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNTRNLCAoSU5UKXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNTRNQ1JDT2spOworICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjU0TTogQUxMWyVkXSwgT0tbJWRdXG4iLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNTRNLCAoaW50KXBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsUnNyNTRNQ1JDT2spOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJVbmtub3duOiBUb3RhbFslZF0sIENSQ09LWyVkXVxuIiwgKElOVClwU3RhdGlzdGljLT5kd1JzclJ4UGFja2V0KzEsIChJTlQpcFN0YXRpc3RpYy0+ZHdSc3JDUkNPayk7CisgICAgCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iVW5rbm93bjogVG90YWxbJWRdLCBDUkNPS1slZF1cbiIsIChpbnQpcFN0YXRpc3RpYy0+ZHdSc3JSeFBhY2tldCsxLCAoaW50KXBTdGF0aXN0aWMtPmR3UnNyQ1JDT2spOwogICAgIH0KIAogICAgIGlmIChieVJTUiAmIFJTUl9CU1NJRE9LKQpAQCAtMzQxLDEwICszNDEsMTAgQEAKICAgICBpZiAoV0xBTl9HRVRfRkNfTU9SRUZSQUcocEhlYWRlci0+d0ZyYW1lQ3RsKSkKICAgICAgICAgcFN0YXRpc3RpYy0+ZHdSc3JSeEZyYWdtZW50Kys7CiAKLSAgICBpZiAoY2JGcmFtZUxlbmd0aCA8IE1JTl9QQUNLRVRfTEVOICsgNCkgeworICAgIGlmIChjYkZyYW1lTGVuZ3RoIDwgRVRIX1pMRU4gKyA0KSB7CiAgICAgICAgIHBTdGF0aXN0aWMtPmR3UnNyUnVudCsrOwogICAgIH0KLSAgICBlbHNlIGlmIChjYkZyYW1lTGVuZ3RoID09IE1JTl9QQUNLRVRfTEVOICsgNCkgeworICAgIGVsc2UgaWYgKGNiRnJhbWVMZW5ndGggPT0gRVRIX1pMRU4gKyA0KSB7CiAgICAgICAgIHBTdGF0aXN0aWMtPmR3UnNyUnhGcm1MZW42NCsrOwogICAgIH0KICAgICBlbHNlIGlmICgoNjUgPD0gY2JGcmFtZUxlbmd0aCkgJiYgKGNiRnJhbWVMZW5ndGggPD0gMTI3KSkgewpAQCAtMzg5LDExICszODksMTEgQEAKIHZvaWQKIFNUQXZVcGRhdGVSRFN0YXRDb3VudGVyRXggKAogICAgIFBTU3RhdENvdW50ZXIgICBwU3RhdGlzdGljLAotICAgIEJZVEUgICAgICAgICAgICBieVJTUiwKLSAgICBCWVRFICAgICAgICAgICAgYnlOZXdSU1IsCi0gICAgQllURSAgICAgICAgICAgIGJ5UnhSYXRlLAotICAgIFBCWVRFICAgICAgICAgICBwYnlCdWZmZXIsCi0gICAgVUlOVCAgICAgICAgICAgIGNiRnJhbWVMZW5ndGgKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UlNSLAorICAgIHVuc2lnbmVkIGNoYXIgYnlOZXdSU1IsCisgICAgdW5zaWduZWQgY2hhciBieVJ4UmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsCisgICAgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgKICAgICApCiB7CiAgICAgU1RBdlVwZGF0ZVJEU3RhdENvdW50ZXIoCkBAIC00MDgsNyArNDA4LDcgQEAKICAgICAvLyByeCBsZW5ndGgKICAgICBwU3RhdGlzdGljLT5kd0NudFJ4RnJtTGVuZ3RoID0gY2JGcmFtZUxlbmd0aDsKICAgICAvLyByeCBwYXR0ZXJuLCB3ZSBqdXN0IHNlZSAxMCBieXRlcyBmb3Igc2FtcGxlCi0gICAgbWVtY3B5KHBTdGF0aXN0aWMtPmFieUNudFJ4UGF0dGVybiwgKFBCWVRFKXBieUJ1ZmZlciwgMTApOworICAgIG1lbWNweShwU3RhdGlzdGljLT5hYnlDbnRSeFBhdHRlcm4sICh1bnNpZ25lZCBjaGFyICopcGJ5QnVmZmVyLCAxMCk7CiB9CiAKIApAQCAtNDMyLDE2ICs0MzIsMTYgQEAKIHZvaWQKIFNUQXZVcGRhdGVURFN0YXRDb3VudGVyICgKICAgICBQU1N0YXRDb3VudGVyICAgcFN0YXRpc3RpYywKLSAgICBCWVRFICAgICAgICAgICAgYnlUU1IwLAotICAgIEJZVEUgICAgICAgICAgICBieVRTUjEsCi0gICAgUEJZVEUgICAgICAgICAgIHBieUJ1ZmZlciwKLSAgICBVSU5UICAgICAgICAgICAgY2JGcmFtZUxlbmd0aCwKLSAgICBVSU5UICAgICAgICAgICAgdUlkeAorICAgIHVuc2lnbmVkIGNoYXIgYnlUU1IwLAorICAgIHVuc2lnbmVkIGNoYXIgYnlUU1IxLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlciwKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKyAgICB1bnNpZ25lZCBpbnQgdUlkeAogICAgICkKIHsKICAgICBQV0xBTl84MDIxMUhEUl9BNCAgIHBIZWFkZXI7Ci0gICAgUEJZVEUgICAgICAgICAgICAgICBwYnlEZXN0QWRkcjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5VFNSMF9OQ1IgPSBieVRTUjAgJiBUU1IwX05DUjsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlEZXN0QWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VFNSMF9OQ1IgPSBieVRTUjAgJiBUU1IwX05DUjsKIAogCiAKQEAgLTQ3MSwxNyArNDcxLDE3IEBACiAgICAgICAgIHBTdGF0aXN0aWMtPkN1c3RvbVN0YXQudWxsVHNyQWxsT0sgPQogICAgICAgICAgICAgKHBTdGF0aXN0aWMtPnVsbFRzck9LW1RZUEVfQUMwRE1BXSArIHBTdGF0aXN0aWMtPnVsbFRzck9LW1RZUEVfVFhETUEwXSk7CiAgICAgICAgIC8vIHVwZGF0ZSBjb3VudGVycyBpbiBjYXNlIHRoYXQgc3VjY2Vzc2Z1bCB0cmFuc21pdAotICAgICAgICBpZiAoSVNfQlJPQURDQVNUX0FERFJFU1MocGJ5RGVzdEFkZHIpKSB7CisgICAgICAgIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihwYnlEZXN0QWRkcikpIHsKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPnVsbFR4QnJvYWRjYXN0RnJhbWVzW3VJZHhdKys7Ci0gICAgICAgICAgICBwU3RhdGlzdGljLT51bGxUeEJyb2FkY2FzdEJ5dGVzW3VJZHhdICs9IChVTE9OR0xPTkcpY2JGcmFtZUxlbmd0aDsKKyAgICAgICAgICAgIHBTdGF0aXN0aWMtPnVsbFR4QnJvYWRjYXN0Qnl0ZXNbdUlkeF0gKz0gKHVuc2lnbmVkIGxvbmcgbG9uZykgY2JGcmFtZUxlbmd0aDsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChJU19NVUxUSUNBU1RfQUREUkVTUyhwYnlEZXN0QWRkcikpIHsKKyAgICAgICAgZWxzZSBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGJ5RGVzdEFkZHIpKSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT51bGxUeE11bHRpY2FzdEZyYW1lc1t1SWR4XSsrOwotICAgICAgICAgICAgcFN0YXRpc3RpYy0+dWxsVHhNdWx0aWNhc3RCeXRlc1t1SWR4XSArPSAoVUxPTkdMT05HKWNiRnJhbWVMZW5ndGg7CisgICAgICAgICAgICBwU3RhdGlzdGljLT51bGxUeE11bHRpY2FzdEJ5dGVzW3VJZHhdICs9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGNiRnJhbWVMZW5ndGg7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBwU3RhdGlzdGljLT51bGxUeERpcmVjdGVkRnJhbWVzW3VJZHhdKys7Ci0gICAgICAgICAgICBwU3RhdGlzdGljLT51bGxUeERpcmVjdGVkQnl0ZXNbdUlkeF0gKz0gKFVMT05HTE9ORyljYkZyYW1lTGVuZ3RoOworICAgICAgICAgICAgcFN0YXRpc3RpYy0+dWxsVHhEaXJlY3RlZEJ5dGVzW3VJZHhdICs9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGNiRnJhbWVMZW5ndGg7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CkBAIC00OTUsOSArNDk1LDkgQEAKICAgICAgICAgICAgIHBTdGF0aXN0aWMtPmR3VHNyQUNLRGF0YVt1SWR4XSsrOwogICAgIH0KIAotICAgIGlmIChJU19CUk9BRENBU1RfQUREUkVTUyhwYnlEZXN0QWRkcikpCisgICAgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBieURlc3RBZGRyKSkKICAgICAgICAgcFN0YXRpc3RpYy0+ZHdUc3JCcm9hZGNhc3RbdUlkeF0rKzsKLSAgICBlbHNlIGlmIChJU19NVUxUSUNBU1RfQUREUkVTUyhwYnlEZXN0QWRkcikpCisgICAgZWxzZSBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGJ5RGVzdEFkZHIpKQogICAgICAgICBwU3RhdGlzdGljLT5kd1Rzck11bHRpY2FzdFt1SWR4XSsrOwogICAgIGVsc2UKICAgICAgICAgcFN0YXRpc3RpYy0+ZHdUc3JEaXJlY3RlZFt1SWR4XSsrOwpAQCAtNTIyLDEzICs1MjIsMTMgQEAKIHZvaWQKIFNUQXZVcGRhdGVURFN0YXRDb3VudGVyRXggKAogICAgIFBTU3RhdENvdW50ZXIgICBwU3RhdGlzdGljLAotICAgIFBCWVRFICAgICAgICAgICBwYnlCdWZmZXIsCi0gICAgRFdPUkQgICAgICAgICAgIGNiRnJhbWVMZW5ndGgKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsCisgICAgdW5zaWduZWQgbG9uZyBjYkZyYW1lTGVuZ3RoCiAgICAgKQogewotICAgIFVJTlQgICAgdVBrdExlbmd0aDsKKyAgICB1bnNpZ25lZCBpbnQgdVBrdExlbmd0aDsKIAotICAgIHVQa3RMZW5ndGggPSAoVUlOVCljYkZyYW1lTGVuZ3RoOworICAgIHVQa3RMZW5ndGggPSAodW5zaWduZWQgaW50KWNiRnJhbWVMZW5ndGg7CiAKICAgICAvLyB0eCBsZW5ndGgKICAgICBwU3RhdGlzdGljLT5kd0NudFR4QnVmTGVuZ3RoID0gdVBrdExlbmd0aDsKQEAgLTU1NSwyNSArNTU1LDI1IEBACiBTVEF2VXBkYXRlODAyXzExQ291bnRlcigKICAgICBQU0RvdDExQ291bnRlcnMgICAgICAgICBwODAyXzExQ291bnRlciwKICAgICBQU1N0YXRDb3VudGVyICAgICAgICAgICBwU3RhdGlzdGljLAotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q291bnRlcgorICAgIHVuc2lnbmVkIGxvbmcgZHdDb3VudGVyCiAgICAgKQogewogICAgIC8vcDgwMl8xMUNvdW50ZXItPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudAotICAgIHA4MDJfMTFDb3VudGVyLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQgPSAoVUxPTkdMT05HKSAocFN0YXRpc3RpYy0+ZHdUc3JCcm9hZGNhc3RbVFlQRV9BQzBETUFdICsKKyAgICBwODAyXzExQ291bnRlci0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50ID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKHBTdGF0aXN0aWMtPmR3VHNyQnJvYWRjYXN0W1RZUEVfQUMwRE1BXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGlzdGljLT5kd1RzckJyb2FkY2FzdFtUWVBFX1RYRE1BMF0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YXRpc3RpYy0+ZHdUc3JNdWx0aWNhc3RbVFlQRV9BQzBETUFdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWMtPmR3VHNyTXVsdGljYXN0W1RZUEVfVFhETUEwXSk7Ci0gICAgcDgwMl8xMUNvdW50ZXItPkZhaWxlZENvdW50ID0gKFVMT05HTE9ORykgKHBTdGF0aXN0aWMtPmR3VHNyRXJyW1RZUEVfQUMwRE1BXSArIHBTdGF0aXN0aWMtPmR3VHNyRXJyW1RZUEVfVFhETUEwXSk7Ci0gICAgcDgwMl8xMUNvdW50ZXItPlJldHJ5Q291bnQgPSAoVUxPTkdMT05HKSAocFN0YXRpc3RpYy0+ZHdUc3JSZXRyeVtUWVBFX0FDMERNQV0gKyBwU3RhdGlzdGljLT5kd1RzclJldHJ5W1RZUEVfVFhETUEwXSk7Ci0gICAgcDgwMl8xMUNvdW50ZXItPk11bHRpcGxlUmV0cnlDb3VudCA9IChVTE9OR0xPTkcpIChwU3RhdGlzdGljLT5kd1Rzck1vcmVUaGFuT25jZVJldHJ5W1RZUEVfQUMwRE1BXSArCisgICAgcDgwMl8xMUNvdW50ZXItPkZhaWxlZENvdW50ID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKHBTdGF0aXN0aWMtPmR3VHNyRXJyW1RZUEVfQUMwRE1BXSArIHBTdGF0aXN0aWMtPmR3VHNyRXJyW1RZUEVfVFhETUEwXSk7CisgICAgcDgwMl8xMUNvdW50ZXItPlJldHJ5Q291bnQgPSAodW5zaWduZWQgbG9uZyBsb25nKSAocFN0YXRpc3RpYy0+ZHdUc3JSZXRyeVtUWVBFX0FDMERNQV0gKyBwU3RhdGlzdGljLT5kd1RzclJldHJ5W1RZUEVfVFhETUEwXSk7CisgICAgcDgwMl8xMUNvdW50ZXItPk11bHRpcGxlUmV0cnlDb3VudCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIChwU3RhdGlzdGljLT5kd1Rzck1vcmVUaGFuT25jZVJldHJ5W1RZUEVfQUMwRE1BXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YXRpc3RpYy0+ZHdUc3JNb3JlVGhhbk9uY2VSZXRyeVtUWVBFX1RYRE1BMF0pOwogICAgIC8vcDgwMl8xMUNvdW50ZXItPkZyYW1lRHVwbGljYXRlQ291bnQKLSAgICBwODAyXzExQ291bnRlci0+UlRTU3VjY2Vzc0NvdW50ICs9IChVTE9OR0xPTkcpICAoZHdDb3VudGVyICYgMHgwMDAwMDBmZik7Ci0gICAgcDgwMl8xMUNvdW50ZXItPlJUU0ZhaWx1cmVDb3VudCArPSAoVUxPTkdMT05HKSAoKGR3Q291bnRlciAmIDB4MDAwMGZmMDApID4+IDgpOwotICAgIHA4MDJfMTFDb3VudGVyLT5BQ0tGYWlsdXJlQ291bnQgKz0gKFVMT05HTE9ORykgKChkd0NvdW50ZXIgJiAweDAwZmYwMDAwKSA+PiAxNik7Ci0gICAgcDgwMl8xMUNvdW50ZXItPkZDU0Vycm9yQ291bnQgKz0gICAoVUxPTkdMT05HKSAoKGR3Q291bnRlciAmIDB4ZmYwMDAwMDApID4+IDI0KTsKKyAgICBwODAyXzExQ291bnRlci0+UlRTU3VjY2Vzc0NvdW50ICs9ICh1bnNpZ25lZCBsb25nIGxvbmcpICAoZHdDb3VudGVyICYgMHgwMDAwMDBmZik7CisgICAgcDgwMl8xMUNvdW50ZXItPlJUU0ZhaWx1cmVDb3VudCArPSAodW5zaWduZWQgbG9uZyBsb25nKSAoKGR3Q291bnRlciAmIDB4MDAwMGZmMDApID4+IDgpOworICAgIHA4MDJfMTFDb3VudGVyLT5BQ0tGYWlsdXJlQ291bnQgKz0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKChkd0NvdW50ZXIgJiAweDAwZmYwMDAwKSA+PiAxNik7CisgICAgcDgwMl8xMUNvdW50ZXItPkZDU0Vycm9yQ291bnQgKz0gICAodW5zaWduZWQgbG9uZyBsb25nKSAoKGR3Q291bnRlciAmIDB4ZmYwMDAwMDApID4+IDI0KTsKICAgICAvL3A4MDJfMTFDb3VudGVyLT5SZWNlaXZlZEZyYWdtZW50Q291bnQKLSAgICBwODAyXzExQ291bnRlci0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50ID0gKFVMT05HTE9ORykgKHBTdGF0aXN0aWMtPmR3UnNyQnJvYWRjYXN0ICsKKyAgICBwODAyXzExQ291bnRlci0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50ID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKHBTdGF0aXN0aWMtPmR3UnNyQnJvYWRjYXN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0aXN0aWMtPmR3UnNyTXVsdGljYXN0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmgKaW5kZXggMjMwODMxOS4uMDA5ZjNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5oCkBAIC0zOSwzMiArMzksMzIgQEAKIC8vCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NEb3QxMUNvdW50ZXJzIHsKLSAgICBVTE9ORyAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgICBVTE9OR0xPTkcgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0gICAgVUxPTkdMT05HICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotICAgIFVMT05HTE9ORyAgIEZhaWxlZENvdW50OwotICAgIFVMT05HTE9ORyAgIFJldHJ5Q291bnQ7Ci0gICAgVUxPTkdMT05HICAgTXVsdGlwbGVSZXRyeUNvdW50OwotICAgIFVMT05HTE9ORyAgIFJUU1N1Y2Nlc3NDb3VudDsKLSAgICBVTE9OR0xPTkcgICBSVFNGYWlsdXJlQ291bnQ7Ci0gICAgVUxPTkdMT05HICAgQUNLRmFpbHVyZUNvdW50OwotICAgIFVMT05HTE9ORyAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICAgVUxPTkdMT05HICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotICAgIFVMT05HTE9ORyAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLSAgICBVTE9OR0xPTkcgICBGQ1NFcnJvckNvdW50OwotICAgIFVMT05HTE9ORyAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOwotICAgIFVMT05HTE9ORyAgIFRLSVBSZW1vdGVNSUNGYWlsdXJlczsKLSAgICBVTE9OR0xPTkcgICBUS0lQSUNWRXJyb3JzOwotICAgIFVMT05HTE9ORyAgIFRLSVBDb3VudGVyTWVhc3VyZXNJbnZva2VkOwotICAgIFVMT05HTE9ORyAgIFRLSVBSZXBsYXlzOwotICAgIFVMT05HTE9ORyAgIENDTVBGb3JtYXRFcnJvcnM7Ci0gICAgVUxPTkdMT05HICAgQ0NNUFJlcGxheXM7Ci0gICAgVUxPTkdMT05HICAgQ0NNUERlY3J5cHRFcnJvcnM7Ci0gICAgVUxPTkdMT05HICAgRm91cldheUhhbmRzaGFrZUZhaWx1cmVzOwotLy8gICAgVUxPTkdMT05HICAgV0VQVW5kZWNyeXB0YWJsZUNvdW50OwotLy8gICAgVUxPTkdMT05HICAgV0VQSUNWRXJyb3JDb3VudDsKLS8vICAgIFVMT05HTE9ORyAgIERlY3J5cHRTdWNjZXNzQ291bnQ7Ci0vLyAgICBVTE9OR0xPTkcgICBEZWNyeXB0RmFpbHVyZUNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBGYWlsZWRDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBSZXRyeUNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIE11bHRpcGxlUmV0cnlDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBSVFNTdWNjZXNzQ291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgUlRTRmFpbHVyZUNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIEFDS0ZhaWx1cmVDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgRkNTRXJyb3JDb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBUS0lQTG9jYWxNSUNGYWlsdXJlczsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBUS0lQUmVtb3RlTUlDRmFpbHVyZXM7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgVEtJUElDVkVycm9yczsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBUS0lQUmVwbGF5czsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBDQ01QRm9ybWF0RXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIENDTVBSZXBsYXlzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIENDTVBEZWNyeXB0RXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKKy8vICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIFdFUFVuZGVjcnlwdGFibGVDb3VudDsKKy8vICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIFdFUElDVkVycm9yQ291bnQ7CisvLyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICBEZWNyeXB0U3VjY2Vzc0NvdW50OworLy8gICAgdW5zaWduZWQgbG9uZyBsb25nICAgRGVjcnlwdEZhaWx1cmVDb3VudDsKIH0gU0RvdDExQ291bnRlcnMsICpQU0RvdDExQ291bnRlcnM7CiAKIApAQCAtNzIsMjkgKzcyLDI5IEBACiAvLyBNSUIyIGNvdW50ZXIKIC8vCiB0eXBlZGVmIHN0cnVjdCB0YWdTTWliMkNvdW50ZXIgewotICAgIExPTkcgICAgaWZJbmRleDsKKyAgICBsb25nICAgIGlmSW5kZXg7CiAgICAgY2hhciAgICBpZkRlc2NyWzI1Nl07ICAgICAgICAgICAgICAgLy8gbWF4IHNpemUgMjU1IHBsdXMgemVybyBlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuICJpbnRlcmZhY2UgMSIKLSAgICBMT05HICAgIGlmVHlwZTsKLSAgICBMT05HICAgIGlmTXR1OwotICAgIERXT1JEICAgaWZTcGVlZDsKLSAgICBCWVRFICAgIGlmUGh5c0FkZHJlc3NbRVRIX0FMRU5dOwotICAgIExPTkcgICAgaWZBZG1pblN0YXR1czsKLSAgICBMT05HICAgIGlmT3BlclN0YXR1czsKLSAgICBEV09SRCAgIGlmTGFzdENoYW5nZTsKLSAgICBEV09SRCAgIGlmSW5PY3RldHM7Ci0gICAgRFdPUkQgICBpZkluVWNhc3RQa3RzOwotICAgIERXT1JEICAgaWZJbk5VY2FzdFBrdHM7Ci0gICAgRFdPUkQgICBpZkluRGlzY2FyZHM7Ci0gICAgRFdPUkQgICBpZkluRXJyb3JzOwotICAgIERXT1JEICAgaWZJblVua25vd25Qcm90b3M7Ci0gICAgRFdPUkQgICBpZk91dE9jdGV0czsKLSAgICBEV09SRCAgIGlmT3V0VWNhc3RQa3RzOwotICAgIERXT1JEICAgaWZPdXROVWNhc3RQa3RzOwotICAgIERXT1JEICAgaWZPdXREaXNjYXJkczsKLSAgICBEV09SRCAgIGlmT3V0RXJyb3JzOwotICAgIERXT1JEICAgaWZPdXRRTGVuOwotICAgIERXT1JEICAgaWZTcGVjaWZpYzsKKyAgICBsb25nICAgIGlmVHlwZTsKKyAgICBsb25nICAgIGlmTXR1OworICAgIHVuc2lnbmVkIGxvbmcgaWZTcGVlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGlmUGh5c0FkZHJlc3NbRVRIX0FMRU5dOworICAgIGxvbmcgICAgaWZBZG1pblN0YXR1czsKKyAgICBsb25nICAgIGlmT3BlclN0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIGlmTGFzdENoYW5nZTsKKyAgICB1bnNpZ25lZCBsb25nIGlmSW5PY3RldHM7CisgICAgdW5zaWduZWQgbG9uZyBpZkluVWNhc3RQa3RzOworICAgIHVuc2lnbmVkIGxvbmcgaWZJbk5VY2FzdFBrdHM7CisgICAgdW5zaWduZWQgbG9uZyBpZkluRGlzY2FyZHM7CisgICAgdW5zaWduZWQgbG9uZyBpZkluRXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgaWZJblVua25vd25Qcm90b3M7CisgICAgdW5zaWduZWQgbG9uZyBpZk91dE9jdGV0czsKKyAgICB1bnNpZ25lZCBsb25nIGlmT3V0VWNhc3RQa3RzOworICAgIHVuc2lnbmVkIGxvbmcgaWZPdXROVWNhc3RQa3RzOworICAgIHVuc2lnbmVkIGxvbmcgaWZPdXREaXNjYXJkczsKKyAgICB1bnNpZ25lZCBsb25nIGlmT3V0RXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgaWZPdXRRTGVuOworICAgIHVuc2lnbmVkIGxvbmcgaWZTcGVjaWZpYzsKIH0gU01pYjJDb3VudGVyLCAqUFNNaWIyQ291bnRlcjsKIAogLy8gVmFsdWUgaW4gdGhlIGlmVHlwZSBlbnRyeQpAQCAtMTExLDY0ICsxMTEsNjQgQEAKIC8vIFJNT04gY291bnRlcgogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1NSbW9uQ291bnRlciB7Ci0gICAgTE9ORyAgICBldGhlclN0YXRzSW5kZXg7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzRGF0YVNvdXJjZTsKLSAgICBEV09SRCAgIGV0aGVyU3RhdHNEcm9wRXZlbnRzOwotICAgIERXT1JEICAgZXRoZXJTdGF0c09jdGV0czsKLSAgICBEV09SRCAgIGV0aGVyU3RhdHNQa3RzOwotICAgIERXT1JEICAgZXRoZXJTdGF0c0Jyb2FkY2FzdFBrdHM7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzTXVsdGljYXN0UGt0czsKLSAgICBEV09SRCAgIGV0aGVyU3RhdHNDUkNBbGlnbkVycm9yczsKLSAgICBEV09SRCAgIGV0aGVyU3RhdHNVbmRlcnNpemVQa3RzOwotICAgIERXT1JEICAgZXRoZXJTdGF0c092ZXJzaXplUGt0czsKLSAgICBEV09SRCAgIGV0aGVyU3RhdHNGcmFnbWVudHM7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzSmFiYmVyczsKLSAgICBEV09SRCAgIGV0aGVyU3RhdHNDb2xsaXNpb25zOwotICAgIERXT1JEICAgZXRoZXJTdGF0c1BrdDY0T2N0ZXRzOwotICAgIERXT1JEICAgZXRoZXJTdGF0c1BrdDY1dG8xMjdPY3RldHM7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzUGt0MTI4dG8yNTVPY3RldHM7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzUGt0MjU2dG81MTFPY3RldHM7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzUGt0NTEydG8xMDIzT2N0ZXRzOwotICAgIERXT1JEICAgZXRoZXJTdGF0c1BrdDEwMjR0bzE1MThPY3RldHM7Ci0gICAgRFdPUkQgICBldGhlclN0YXRzT3duZXJzOwotICAgIERXT1JEICAgZXRoZXJTdGF0c1N0YXR1czsKKyAgICBsb25nICAgIGV0aGVyU3RhdHNJbmRleDsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNEYXRhU291cmNlOworICAgIHVuc2lnbmVkIGxvbmcgZXRoZXJTdGF0c0Ryb3BFdmVudHM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzT2N0ZXRzOworICAgIHVuc2lnbmVkIGxvbmcgZXRoZXJTdGF0c1BrdHM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzQnJvYWRjYXN0UGt0czsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNNdWx0aWNhc3RQa3RzOworICAgIHVuc2lnbmVkIGxvbmcgZXRoZXJTdGF0c0NSQ0FsaWduRXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgZXRoZXJTdGF0c1VuZGVyc2l6ZVBrdHM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzT3ZlcnNpemVQa3RzOworICAgIHVuc2lnbmVkIGxvbmcgZXRoZXJTdGF0c0ZyYWdtZW50czsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNKYWJiZXJzOworICAgIHVuc2lnbmVkIGxvbmcgZXRoZXJTdGF0c0NvbGxpc2lvbnM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzUGt0NjRPY3RldHM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzUGt0NjV0bzEyN09jdGV0czsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNQa3QxMjh0bzI1NU9jdGV0czsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNQa3QyNTZ0bzUxMU9jdGV0czsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNQa3Q1MTJ0bzEwMjNPY3RldHM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzUGt0MTAyNHRvMTUxOE9jdGV0czsKKyAgICB1bnNpZ25lZCBsb25nIGV0aGVyU3RhdHNPd25lcnM7CisgICAgdW5zaWduZWQgbG9uZyBldGhlclN0YXRzU3RhdHVzOwogfSBTUm1vbkNvdW50ZXIsICpQU1Jtb25Db3VudGVyOwogCiAvLwogLy8gQ3VzdG9tIGNvdW50ZXIKIC8vCiB0eXBlZGVmIHN0cnVjdCB0YWdTQ3VzdG9tQ291bnRlcnMgewotICAgIFVMT05HICAgICAgIExlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nIExlbmd0aDsKIAotICAgIFVMT05HTE9ORyAgIHVsbFRzckFsbE9LOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFRzckFsbE9LOwogCi0gICAgVUxPTkdMT05HICAgdWxsUnNyMTFNOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjVNOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjJNOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjFNOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJzcjExTTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3I1TTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3IyTTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3IxTTsKIAotICAgIFVMT05HTE9ORyAgIHVsbFJzcjExTUNSQ09rOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjVNQ1JDT2s7Ci0gICAgVUxPTkdMT05HICAgdWxsUnNyMk1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IxTUNSQ09rOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJzcjExTUNSQ09rOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJzcjVNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyMk1DUkNPazsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3IxTUNSQ09rOwogCi0gICAgVUxPTkdMT05HICAgdWxsUnNyNTRNOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjQ4TTsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IzNk07Ci0gICAgVUxPTkdMT05HICAgdWxsUnNyMjRNOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjE4TTsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IxMk07Ci0gICAgVUxPTkdMT05HICAgdWxsUnNyOU07Ci0gICAgVUxPTkdMT05HICAgdWxsUnNyNk07CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyNTRNOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJzcjQ4TTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3IzNk07CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyMjRNOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJzcjE4TTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3IxMk07CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyOU07CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyNk07CiAKLSAgICBVTE9OR0xPTkcgICB1bGxSc3I1NE1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3I0OE1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IzNk1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IyNE1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IxOE1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3IxMk1DUkNPazsKLSAgICBVTE9OR0xPTkcgICB1bGxSc3I5TUNSQ09rOwotICAgIFVMT05HTE9ORyAgIHVsbFJzcjZNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyNTRNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyNDhNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyMzZNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyMjRNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyMThNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyMTJNQ1JDT2s7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnNyOU1DUkNPazsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3I2TUNSQ09rOwogCiB9IFNDdXN0b21Db3VudGVycywgKlBTQ3VzdG9tQ291bnRlcnM7CiAKQEAgLTE3NywyOSArMTc3LDI5IEBACiAvLyBDdXN0b20gY291bnRlcgogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1NJU1JDb3VudGVycyB7Ci0gICAgVUxPTkcgICBMZW5ndGg7CisgICAgdW5zaWduZWQgbG9uZyBMZW5ndGg7CiAKLSAgICBEV09SRCAgIGR3SXNyVHgwT0s7Ci0gICAgRFdPUkQgICBkd0lzckFDMFR4T0s7Ci0gICAgRFdPUkQgICBkd0lzckJlYWNvblR4T0s7Ci0gICAgRFdPUkQgICBkd0lzclJ4ME9LOwotICAgIERXT1JEICAgZHdJc3JUQlRUSW50OwotICAgIERXT1JEICAgZHdJc3JTVElNRVJJbnQ7Ci0gICAgRFdPUkQgICBkd0lzcldhdGNoRG9nOwotICAgIERXT1JEICAgZHdJc3JVbnJlY292ZXJhYmxlRXJyb3I7Ci0gICAgRFdPUkQgICBkd0lzclNvZnRJbnRlcnJ1cHQ7Ci0gICAgRFdPUkQgICBkd0lzck1JQk5lYXJmdWxsOwotICAgIERXT1JEICAgZHdJc3JSeE5vQnVmOworICAgIHVuc2lnbmVkIGxvbmcgZHdJc3JUeDBPSzsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyQUMwVHhPSzsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyQmVhY29uVHhPSzsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyUngwT0s7CisgICAgdW5zaWduZWQgbG9uZyBkd0lzclRCVFRJbnQ7CisgICAgdW5zaWduZWQgbG9uZyBkd0lzclNUSU1FUkludDsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyV2F0Y2hEb2c7CisgICAgdW5zaWduZWQgbG9uZyBkd0lzclVucmVjb3ZlcmFibGVFcnJvcjsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyU29mdEludGVycnVwdDsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyTUlCTmVhcmZ1bGw7CisgICAgdW5zaWduZWQgbG9uZyBkd0lzclJ4Tm9CdWY7CiAKLSAgICBEV09SRCAgIGR3SXNyVW5rbm93bjsgICAgICAgICAgICAgICAvLyB1bmtub3duIGludGVycnVwdCBjb3VudAorICAgIHVuc2lnbmVkIGxvbmcgZHdJc3JVbmtub3duOyAgICAgICAgICAgICAgIC8vIHVua25vd24gaW50ZXJydXB0IGNvdW50CiAKLSAgICBEV09SRCAgIGR3SXNyUngxT0s7Ci0gICAgRFdPUkQgICBkd0lzckFUSU1UeE9LOwotICAgIERXT1JEICAgZHdJc3JTWU5DVHhPSzsKLSAgICBEV09SRCAgIGR3SXNyQ0ZQRW5kOwotICAgIERXT1JEICAgZHdJc3JBVElNRW5kOwotICAgIERXT1JEICAgZHdJc3JTWU5DRmx1c2hPSzsKLSAgICBEV09SRCAgIGR3SXNyU1RJTUVSMUludDsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyUngxT0s7CisgICAgdW5zaWduZWQgbG9uZyBkd0lzckFUSU1UeE9LOworICAgIHVuc2lnbmVkIGxvbmcgZHdJc3JTWU5DVHhPSzsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyQ0ZQRW5kOworICAgIHVuc2lnbmVkIGxvbmcgZHdJc3JBVElNRW5kOworICAgIHVuc2lnbmVkIGxvbmcgZHdJc3JTWU5DRmx1c2hPSzsKKyAgICB1bnNpZ25lZCBsb25nIGR3SXNyU1RJTUVSMUludDsKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiB9IFNJU1JDb3VudGVycywgKlBTSVNSQ291bnRlcnM7CiAKQEAgLTIyMiw5OSArMjIyLDk5IEBACiAKICAgICAvLyBSU1Igc3RhdHVzIGNvdW50CiAgICAgLy8KLSAgICBEV09SRCAgIGR3UnNyRnJtQWxnbkVycjsKLSAgICBEV09SRCAgIGR3UnNyRXJyOwotICAgIERXT1JEICAgZHdSc3JDUkNFcnI7Ci0gICAgRFdPUkQgICBkd1JzckNSQ09rOwotICAgIERXT1JEICAgZHdSc3JCU1NJRE9rOwotICAgIERXT1JEICAgZHdSc3JBRERST2s7Ci0gICAgRFdPUkQgICBkd1JzckJDTlNTSURPazsKLSAgICBEV09SRCAgIGR3UnNyTEVORXJyOwotICAgIERXT1JEICAgZHdSc3JUWVBFcnI7CisgICAgdW5zaWduZWQgbG9uZyBkd1JzckZybUFsZ25FcnI7CisgICAgdW5zaWduZWQgbG9uZyBkd1JzckVycjsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyQ1JDRXJyOworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JDUkNPazsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyQlNTSURPazsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyQUREUk9rOworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JCQ05TU0lET2s7CisgICAgdW5zaWduZWQgbG9uZyBkd1JzckxFTkVycjsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyVFlQRXJyOwogCi0gICAgRFdPUkQgICBkd05ld1JzckRFQ1JZUFRPSzsKLSAgICBEV09SRCAgIGR3TmV3UnNyQ0ZQOwotICAgIERXT1JEICAgZHdOZXdSc3JVVFNGOwotICAgIERXT1JEICAgZHdOZXdSc3JISVRBSUQ7Ci0gICAgRFdPUkQgICBkd05ld1JzckhJVEFJRDA7CisgICAgdW5zaWduZWQgbG9uZyBkd05ld1JzckRFQ1JZUFRPSzsKKyAgICB1bnNpZ25lZCBsb25nIGR3TmV3UnNyQ0ZQOworICAgIHVuc2lnbmVkIGxvbmcgZHdOZXdSc3JVVFNGOworICAgIHVuc2lnbmVkIGxvbmcgZHdOZXdSc3JISVRBSUQ7CisgICAgdW5zaWduZWQgbG9uZyBkd05ld1JzckhJVEFJRDA7CiAKLSAgICBEV09SRCAgIGR3UnNyTG9uZzsKLSAgICBEV09SRCAgIGR3UnNyUnVudDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyTG9uZzsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnVudDsKIAotICAgIERXT1JEICAgZHdSc3JSeENvbnRyb2w7Ci0gICAgRFdPUkQgICBkd1JzclJ4RGF0YTsKLSAgICBEV09SRCAgIGR3UnNyUnhNYW5hZ2U7CisgICAgdW5zaWduZWQgbG9uZyBkd1JzclJ4Q29udHJvbDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnhEYXRhOworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JSeE1hbmFnZTsKIAotICAgIERXT1JEICAgZHdSc3JSeFBhY2tldDsKLSAgICBEV09SRCAgIGR3UnNyUnhPY3RldDsKLSAgICBEV09SRCAgIGR3UnNyQnJvYWRjYXN0OwotICAgIERXT1JEICAgZHdSc3JNdWx0aWNhc3Q7Ci0gICAgRFdPUkQgICBkd1JzckRpcmVjdGVkOworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JSeFBhY2tldDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnhPY3RldDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyQnJvYWRjYXN0OworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JNdWx0aWNhc3Q7CisgICAgdW5zaWduZWQgbG9uZyBkd1JzckRpcmVjdGVkOwogICAgIC8vIDY0LWJpdCBPSUQKLSAgICBVTE9OR0xPTkcgICB1bGxSc3JPSzsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSc3JPSzsKIAogICAgIC8vIGZvciBzb21lIG9wdGlvbmFsIE9JRHMgKDY0IGJpdHMpIGFuZCBETUkgc3VwcG9ydAotICAgIFVMT05HTE9ORyAgIHVsbFJ4QnJvYWRjYXN0Qnl0ZXM7Ci0gICAgVUxPTkdMT05HICAgdWxsUnhNdWx0aWNhc3RCeXRlczsKLSAgICBVTE9OR0xPTkcgICB1bGxSeERpcmVjdGVkQnl0ZXM7Ci0gICAgVUxPTkdMT05HICAgdWxsUnhCcm9hZGNhc3RGcmFtZXM7Ci0gICAgVUxPTkdMT05HICAgdWxsUnhNdWx0aWNhc3RGcmFtZXM7Ci0gICAgVUxPTkdMT05HICAgdWxsUnhEaXJlY3RlZEZyYW1lczsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxSeEJyb2FkY2FzdEJ5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJ4TXVsdGljYXN0Qnl0ZXM7CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsUnhEaXJlY3RlZEJ5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJ4QnJvYWRjYXN0RnJhbWVzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJ4TXVsdGljYXN0RnJhbWVzOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFJ4RGlyZWN0ZWRGcmFtZXM7CiAKLSAgICBEV09SRCAgIGR3UnNyUnhGcmFnbWVudDsKLSAgICBEV09SRCAgIGR3UnNyUnhGcm1MZW42NDsKLSAgICBEV09SRCAgIGR3UnNyUnhGcm1MZW42NV8xMjc7Ci0gICAgRFdPUkQgICBkd1JzclJ4RnJtTGVuMTI4XzI1NTsKLSAgICBEV09SRCAgIGR3UnNyUnhGcm1MZW4yNTZfNTExOwotICAgIERXT1JEICAgZHdSc3JSeEZybUxlbjUxMl8xMDIzOwotICAgIERXT1JEICAgZHdSc3JSeEZybUxlbjEwMjRfMTUxODsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnhGcmFnbWVudDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnhGcm1MZW42NDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnhGcm1MZW42NV8xMjc7CisgICAgdW5zaWduZWQgbG9uZyBkd1JzclJ4RnJtTGVuMTI4XzI1NTsKKyAgICB1bnNpZ25lZCBsb25nIGR3UnNyUnhGcm1MZW4yNTZfNTExOworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JSeEZybUxlbjUxMl8xMDIzOworICAgIHVuc2lnbmVkIGxvbmcgZHdSc3JSeEZybUxlbjEwMjRfMTUxODsKIAogICAgIC8vIFRTUiBzdGF0dXMgY291bnQKICAgICAvLwotICAgIERXT1JEICAgZHdUc3JUb3RhbFJldHJ5W1RZUEVfTUFYVERdOyAgICAgICAgLy8gdG90YWwgY29sbGlzaW9uIHJldHJ5IGNvdW50Ci0gICAgRFdPUkQgICBkd1Rzck9uY2VSZXRyeVtUWVBFX01BWFREXTsgICAgICAgICAvLyB0aGlzIHBhY2tldCBvbmx5IG9jY3VyIG9uZSBjb2xsaXNpb24KLSAgICBEV09SRCAgIGR3VHNyTW9yZVRoYW5PbmNlUmV0cnlbVFlQRV9NQVhURF07IC8vIHRoaXMgcGFja2V0IG9jY3VyIG1vcmUgdGhhbiBvbmUgY29sbGlzaW9uCi0gICAgRFdPUkQgICBkd1RzclJldHJ5W1RZUEVfTUFYVERdOyAgICAgICAgICAgICAvLyB0aGlzIHBhY2tldCBoYXMgZXZlciBvY2N1ciBjb2xsaXNpb24sCisgICAgdW5zaWduZWQgbG9uZyBkd1RzclRvdGFsUmV0cnlbVFlQRV9NQVhURF07ICAgICAgICAvLyB0b3RhbCBjb2xsaXNpb24gcmV0cnkgY291bnQKKyAgICB1bnNpZ25lZCBsb25nIGR3VHNyT25jZVJldHJ5W1RZUEVfTUFYVERdOyAgICAgICAgIC8vIHRoaXMgcGFja2V0IG9ubHkgb2NjdXIgb25lIGNvbGxpc2lvbgorICAgIHVuc2lnbmVkIGxvbmcgZHdUc3JNb3JlVGhhbk9uY2VSZXRyeVtUWVBFX01BWFREXTsgLy8gdGhpcyBwYWNrZXQgb2NjdXIgbW9yZSB0aGFuIG9uZSBjb2xsaXNpb24KKyAgICB1bnNpZ25lZCBsb25nIGR3VHNyUmV0cnlbVFlQRV9NQVhURF07ICAgICAgICAgICAgIC8vIHRoaXMgcGFja2V0IGhhcyBldmVyIG9jY3VyIGNvbGxpc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBpcyAoZHdUc3JPbmNlQ29sbGlzaW9uMCArIGR3VHNyTW9yZVRoYW5PbmNlQ29sbGlzaW9uMCkKLSAgICBEV09SRCAgIGR3VHNyQUNLRGF0YVtUWVBFX01BWFREXTsKLSAgICBEV09SRCAgIGR3VHNyRXJyW1RZUEVfTUFYVERdOwotICAgIERXT1JEICAgZHdBbGxUc3JPS1tUWVBFX01BWFREXTsKLSAgICBEV09SRCAgIGR3VHNyUmV0cnlUaW1lb3V0W1RZUEVfTUFYVERdOwotICAgIERXT1JEICAgZHdUc3JUcmFuc21pdFRpbWVvdXRbVFlQRV9NQVhURF07CisgICAgdW5zaWduZWQgbG9uZyBkd1RzckFDS0RhdGFbVFlQRV9NQVhURF07CisgICAgdW5zaWduZWQgbG9uZyBkd1RzckVycltUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGR3QWxsVHNyT0tbVFlQRV9NQVhURF07CisgICAgdW5zaWduZWQgbG9uZyBkd1RzclJldHJ5VGltZW91dFtUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGR3VHNyVHJhbnNtaXRUaW1lb3V0W1RZUEVfTUFYVERdOwogCi0gICAgRFdPUkQgICBkd1RzclR4UGFja2V0W1RZUEVfTUFYVERdOwotICAgIERXT1JEICAgZHdUc3JUeE9jdGV0W1RZUEVfTUFYVERdOwotICAgIERXT1JEICAgZHdUc3JCcm9hZGNhc3RbVFlQRV9NQVhURF07Ci0gICAgRFdPUkQgICBkd1Rzck11bHRpY2FzdFtUWVBFX01BWFREXTsKLSAgICBEV09SRCAgIGR3VHNyRGlyZWN0ZWRbVFlQRV9NQVhURF07CisgICAgdW5zaWduZWQgbG9uZyBkd1RzclR4UGFja2V0W1RZUEVfTUFYVERdOworICAgIHVuc2lnbmVkIGxvbmcgZHdUc3JUeE9jdGV0W1RZUEVfTUFYVERdOworICAgIHVuc2lnbmVkIGxvbmcgZHdUc3JCcm9hZGNhc3RbVFlQRV9NQVhURF07CisgICAgdW5zaWduZWQgbG9uZyBkd1Rzck11bHRpY2FzdFtUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGR3VHNyRGlyZWN0ZWRbVFlQRV9NQVhURF07CiAKICAgICAvLyBSRC9URCBjb3VudAotICAgIERXT1JEICAgZHdDbnRSeEZybUxlbmd0aDsKLSAgICBEV09SRCAgIGR3Q250VHhCdWZMZW5ndGg7CisgICAgdW5zaWduZWQgbG9uZyBkd0NudFJ4RnJtTGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgZHdDbnRUeEJ1Zkxlbmd0aDsKIAotICAgIEJZVEUgICAgYWJ5Q250UnhQYXR0ZXJuWzE2XTsKLSAgICBCWVRFICAgIGFieUNudFR4UGF0dGVyblsxNl07CisgICAgdW5zaWduZWQgY2hhciBhYnlDbnRSeFBhdHRlcm5bMTZdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q250VHhQYXR0ZXJuWzE2XTsKIAogCiAKICAgICAvLyBTb2Z0d2FyZSBjaGVjay4uLi4KLSAgICBEV09SRCAgIGR3Q250UnhEYXRhRXJyOyAgICAgICAgICAgICAvLyByeCBidWZmZXIgZGF0YSBzb2Z0d2FyZSBjb21wYXJlIENSQyBlcnIgY291bnQKLSAgICBEV09SRCAgIGR3Q250RGVjcnlwdEVycjsgICAgICAgICAgICAvLyByeCBidWZmZXIgZGF0YSBzb2Z0d2FyZSBjb21wYXJlIENSQyBlcnIgY291bnQKLSAgICBEV09SRCAgIGR3Q250UnhJQ1ZFcnI7ICAgICAgICAgICAgICAvLyByeCBidWZmZXIgZGF0YSBzb2Z0d2FyZSBjb21wYXJlIENSQyBlcnIgY291bnQKLSAgICBVSU5UICAgIGlkeFJ4RXJyb3JEZXNjW1RZUEVfTUFYUkRdOyAvLyBpbmRleCBmb3IgcnggZGF0YSBlcnJvciBSRAorICAgIHVuc2lnbmVkIGxvbmcgZHdDbnRSeERhdGFFcnI7ICAgICAgICAgICAgIC8vIHJ4IGJ1ZmZlciBkYXRhIHNvZnR3YXJlIGNvbXBhcmUgQ1JDIGVyciBjb3VudAorICAgIHVuc2lnbmVkIGxvbmcgZHdDbnREZWNyeXB0RXJyOyAgICAgICAgICAgIC8vIHJ4IGJ1ZmZlciBkYXRhIHNvZnR3YXJlIGNvbXBhcmUgQ1JDIGVyciBjb3VudAorICAgIHVuc2lnbmVkIGxvbmcgZHdDbnRSeElDVkVycjsgICAgICAgICAgICAgIC8vIHJ4IGJ1ZmZlciBkYXRhIHNvZnR3YXJlIGNvbXBhcmUgQ1JDIGVyciBjb3VudAorICAgIHVuc2lnbmVkIGludCBpZHhSeEVycm9yRGVzY1tUWVBFX01BWFJEXTsgLy8gaW5kZXggZm9yIHJ4IGRhdGEgZXJyb3IgUkQKIAogICAgIC8vIDY0LWJpdCBPSUQKLSAgICBVTE9OR0xPTkcgICB1bGxUc3JPS1tUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxUc3JPS1tUWVBFX01BWFREXTsKIAogICAgIC8vIGZvciBzb21lIG9wdGlvbmFsIE9JRHMgKDY0IGJpdHMpIGFuZCBETUkgc3VwcG9ydAotICAgIFVMT05HTE9ORyAgIHVsbFR4QnJvYWRjYXN0RnJhbWVzW1RZUEVfTUFYVERdOwotICAgIFVMT05HTE9ORyAgIHVsbFR4TXVsdGljYXN0RnJhbWVzW1RZUEVfTUFYVERdOwotICAgIFVMT05HTE9ORyAgIHVsbFR4RGlyZWN0ZWRGcmFtZXNbVFlQRV9NQVhURF07Ci0gICAgVUxPTkdMT05HICAgdWxsVHhCcm9hZGNhc3RCeXRlc1tUWVBFX01BWFREXTsKLSAgICBVTE9OR0xPTkcgICB1bGxUeE11bHRpY2FzdEJ5dGVzW1RZUEVfTUFYVERdOwotICAgIFVMT05HTE9ORyAgIHVsbFR4RGlyZWN0ZWRCeXRlc1tUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxUeEJyb2FkY2FzdEZyYW1lc1tUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxUeE11bHRpY2FzdEZyYW1lc1tUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxUeERpcmVjdGVkRnJhbWVzW1RZUEVfTUFYVERdOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgIHVsbFR4QnJvYWRjYXN0Qnl0ZXNbVFlQRV9NQVhURF07CisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgdWxsVHhNdWx0aWNhc3RCeXRlc1tUWVBFX01BWFREXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgICB1bGxUeERpcmVjdGVkQnl0ZXNbVFlQRV9NQVhURF07CiAKLS8vICAgIERXT1JEICAgZHdUeFJldHJ5Q291bnRbOF07CisvLyAgICB1bnNpZ25lZCBsb25nIGR3VHhSZXRyeUNvdW50WzhdOwogICAgIC8vCiAgICAgLy8gSVNSIHN0YXR1cyBjb3VudAogICAgIC8vCkBAIC0zMjQsMTUgKzMyNCwxNSBAQAogCiAgICAjaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgICAgICAvL1R4IGNvdW50OgotICAgIFVMT05HIFR4Tm9SZXRyeU9rQ291bnQ7ICAgICAgICAgLy9zdWNjZXNzIHR4IG5vIHJldHJ5ICEKLSAgICBVTE9ORyBUeFJldHJ5T2tDb3VudDsgICAgICAgICAgICAgIC8vc3VjY2VzcyB0eCBidXQgcmV0cnkgIQotICAgIFVMT05HIFR4RmFpbENvdW50OyAgICAgICAgICAgICAgICAgICAgICAvL2ZhaWwgdHggPworICAgIHVuc2lnbmVkIGxvbmcgVHhOb1JldHJ5T2tDb3VudDsgICAgICAgICAvL3N1Y2Nlc3MgdHggbm8gcmV0cnkgIQorICAgIHVuc2lnbmVkIGxvbmcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2Nlc3MgdHggYnV0IHJldHJ5ICEKKyAgICB1bnNpZ25lZCBsb25nIFR4RmFpbENvdW50OyAgICAgICAgICAgICAgICAgICAgICAvL2ZhaWwgdHggPwogICAgICAgLy9SeCBjb3VudDoKLSAgICBVTE9ORyBSeE9rQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdWNjZXNzIHJ4ICEKLSAgICBVTE9ORyBSeEZjc0VyckNudDsgICAgICAgICAgICAgICAgICAgIC8vZmFpbCByeCA/CisgICAgdW5zaWduZWQgbG9uZyBSeE9rQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdWNjZXNzIHJ4ICEKKyAgICB1bnNpZ25lZCBsb25nIFJ4RmNzRXJyQ250OyAgICAgICAgICAgICAgICAgICAgLy9mYWlsIHJ4ID8KICAgICAgIC8vc3RhdGlzdGljCi0gICAgVUxPTkcgU2lnbmFsU3RyZW47Ci0gICAgVUxPTkcgTGlua1F1YWxpdHk7CisgICAgdW5zaWduZWQgbG9uZyBTaWduYWxTdHJlbjsKKyAgICB1bnNpZ25lZCBsb25nIExpbmtRdWFsaXR5OwogICAgI2VuZGlmCiB9IFNTdGF0Q291bnRlciwgKlBTU3RhdENvdW50ZXI7CiAKQEAgLTM0NCwzMCArMzQ0LDI5IEBACiAKIHZvaWQgU1RBdkNsZWFyQWxsQ291bnRlcihQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMpOwogCi12b2lkIFNUQXZVcGRhdGVJc3JTdGF0Q291bnRlcihQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMsIERXT1JEIGR3SXNyKTsKK3ZvaWQgU1RBdlVwZGF0ZUlzclN0YXRDb3VudGVyKFBTU3RhdENvdW50ZXIgcFN0YXRpc3RpYywgdW5zaWduZWQgbG9uZyBkd0lzcik7CiAKIHZvaWQgU1RBdlVwZGF0ZVJEU3RhdENvdW50ZXIoUFNTdGF0Q291bnRlciBwU3RhdGlzdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSBieVJTUiwgQllURSBieU5ld1JTUiwgQllURSBieVJ4UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCWVRFIHBieUJ1ZmZlciwgVUlOVCBjYkZyYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnlSU1IsIHVuc2lnbmVkIGNoYXIgYnlOZXdSU1IsIHVuc2lnbmVkIGNoYXIgYnlSeFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoKTsKIAogdm9pZCBTVEF2VXBkYXRlUkRTdGF0Q291bnRlckV4KFBTU3RhdENvdW50ZXIgcFN0YXRpc3RpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgYnlSU1IsIEJZVEUgYnlOZXdSc3IsIEJZVEUgYnlSeFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQllURSBwYnlCdWZmZXIsIFVJTlQgY2JGcmFtZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5UlNSLCB1bnNpZ25lZCBjaGFyIGJ5TmV3UnNyLCB1bnNpZ25lZCBjaGFyIGJ5UnhSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGJ5QnVmZmVyLCB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCk7CiAKLXZvaWQgU1RBdlVwZGF0ZVREU3RhdENvdW50ZXIoUFNTdGF0Q291bnRlciBwU3RhdGlzdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFIGJ5VFNSMCwgQllURSBieVRTUjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCWVRFIHBieUJ1ZmZlciwgVUlOVCBjYkZyYW1lTGVuZ3RoLCBVSU5UIHVJZHggKTsKK3ZvaWQgU1RBdlVwZGF0ZVREU3RhdENvdW50ZXIoUFNTdGF0Q291bnRlciBwU3RhdGlzdGljLCB1bnNpZ25lZCBjaGFyIGJ5VFNSMCwgdW5zaWduZWQgY2hhciBieVRTUjEsCisJCXVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlciwgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgsIHVuc2lnbmVkIGludCB1SWR4KTsKIAogdm9pZCBTVEF2VXBkYXRlVERTdGF0Q291bnRlckV4KAogICAgIFBTU3RhdENvdW50ZXIgICBwU3RhdGlzdGljLAotICAgIFBCWVRFICAgICAgICAgICBwYnlCdWZmZXIsCi0gICAgRFdPUkQgICAgICAgICAgIGNiRnJhbWVMZW5ndGgKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsCisgICAgdW5zaWduZWQgbG9uZyBjYkZyYW1lTGVuZ3RoCiAgICAgKTsKIAogdm9pZCBTVEF2VXBkYXRlODAyXzExQ291bnRlcigKICAgICBQU0RvdDExQ291bnRlcnMgcDgwMl8xMUNvdW50ZXIsCiAgICAgUFNTdGF0Q291bnRlciAgIHBTdGF0aXN0aWMsCi0gICAgRFdPUkQgICAgICAgICAgIGR3Q291bnRlcgorICAgIHVuc2lnbmVkIGxvbmcgZHdDb3VudGVyCiAgICAgKTsKIAogdm9pZCBTVEF2Q2xlYXI4MDJfMTFDb3VudGVyKFBTRG90MTFDb3VudGVycyBwODAyXzExQ291bnRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5jCmluZGV4IDBiZjU3ZWYuLjY3NjE4ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5jCkBAIC0yNiw4ICsyNiw4IEBACiAgKiBEYXRlOiBTZXAgNCwgMjAwMgogICoKICAqIEZ1bmN0aW9uczoKLSAqICAgICAgc19kd0dldFVJTlQzMiAtIENvbnZlcnQgZnJvbSBCWVRFW10gdG8gRFdPUkQgaW4gYSBwb3J0YWJsZSB3YXkKLSAqICAgICAgc192UHV0VUlOVDMyIC0gQ29udmVydCBmcm9tIERXT1JEIHRvIEJZVEVbXSBpbiBhIHBvcnRhYmxlIHdheQorICogICAgICBzX2R3R2V0VUlOVDMyIC0gQ29udmVydCBmcm9tIHVuc2lnbmVkIGNoYXIgW10gdG8gdW5zaWduZWQgbG9uZyBpbiBhIHBvcnRhYmxlIHdheQorICogICAgICBzX3ZQdXRVSU5UMzIgLSBDb252ZXJ0IGZyb20gdW5zaWduZWQgbG9uZyB0byB1bnNpZ25lZCBjaGFyIFtdIGluIGEgcG9ydGFibGUgd2F5CiAgKiAgICAgIHNfdkNsZWFyIC0gUmVzZXQgdGhlIHN0YXRlIHRvIHRoZSBlbXB0eSBtZXNzYWdlLgogICogICAgICBzX3ZTZXRLZXkgLSBTZXQgdGhlIGtleS4KICAqICAgICAgTUlDX3ZJbml0IC0gU2V0IHRoZSBrZXkuCkBAIC00OCwyOSArNDgsMjkgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi1zdGF0aWMgRFdPUkQgc19kd0dldFVJTlQzMihCWVRFICogcCk7ICAgICAgICAgLy8gR2V0IERXT1JEIGZyb20gNCBieXRlcyBMU0J5dGUgZmlyc3QKLXN0YXRpYyB2b2lkIHNfdlB1dFVJTlQzMihCWVRFKiBwLCBEV09SRCB2YWwpOyAvLyBQdXQgRFdPUkQgaW50byA0IGJ5dGVzIExTQnl0ZSBmaXJzdAorc3RhdGljIHVuc2lnbmVkIGxvbmcgc19kd0dldFVJTlQzMih1bnNpZ25lZCBjaGFyICpwKTsgICAgICAgICAvLyBHZXQgdW5zaWduZWQgbG9uZyBmcm9tIDQgYnl0ZXMgTFNCeXRlIGZpcnN0CitzdGF0aWMgdm9pZCBzX3ZQdXRVSU5UMzIodW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgbG9uZyB2YWwpOyAvLyBQdXQgdW5zaWduZWQgbG9uZyBpbnRvIDQgYnl0ZXMgTFNCeXRlIGZpcnN0CiAqLwogc3RhdGljIHZvaWQgc192Q2xlYXIodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJuYWwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldHMgdGhlIG9iamVjdCB0byB0aGUgc3RhdGUganVzdCBhZnRlciBjb25zdHJ1Y3Rpb24uCi1zdGF0aWMgdm9pZCBzX3ZTZXRLZXkoRFdPUkQgZHdLMCwgRFdPUkQgZHdLMSk7Ci1zdGF0aWMgdm9pZCBzX3ZBcHBlbmRCeXRlKEJZVEUgYik7ICAgICAgICAgICAgLy8gQWRkIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGludGVybmFsIG1lc3NhZ2UKK3N0YXRpYyB2b2lkIHNfdlNldEtleSh1bnNpZ25lZCBsb25nIGR3SzAsIHVuc2lnbmVkIGxvbmcgZHdLMSk7CitzdGF0aWMgdm9pZCBzX3ZBcHBlbmRCeXRlKHVuc2lnbmVkIGNoYXIgYik7ICAgICAgICAgICAgLy8gQWRkIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGludGVybmFsIG1lc3NhZ2UKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBEV09SRCAgTCwgUjsgICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEwsIFI7ICAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlCiAKLXN0YXRpYyBEV09SRCAgSzAsIEsxOyAgICAgICAgIC8vIEtleQotc3RhdGljIERXT1JEICBNOyAgICAgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciAoc2luZ2xlIHdvcmQpCi1zdGF0aWMgVUlOVCAgIG5CeXRlc0luTTsgICAgICAvLyAjIGJ5dGVzIGluIE0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIEswLCBLMTsgICAgICAgICAvLyBLZXkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIE07ICAgICAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIChzaW5nbGUgd29yZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbkJ5dGVzSW5NOyAgICAgIC8vICMgYnl0ZXMgaW4gTQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgotc3RhdGljIERXT1JEIHNfZHdHZXRVSU5UMzIgKEJZVEUgKiBwKQotLy8gQ29udmVydCBmcm9tIEJZVEVbXSB0byBEV09SRCBpbiBhIHBvcnRhYmxlIHdheQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc19kd0dldFVJTlQzMiAodW5zaWduZWQgY2hhciAqcCkKKy8vIENvbnZlcnQgZnJvbSB1bnNpZ25lZCBjaGFyIFtdIHRvIHVuc2lnbmVkIGxvbmcgaW4gYSBwb3J0YWJsZSB3YXkKIHsKLSAgICBEV09SRCByZXMgPSAwOwotICAgIFVJTlQgaTsKKyAgICB1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CiAgICAgZm9yKGk9MDsgaTw0OyBpKysgKQogICAgIHsKICAgICAgICAgcmVzIHw9ICgqcCsrKSA8PCAoOCppKTsKQEAgLTc4LDEzICs3OCwxMyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyB2b2lkIHNfdlB1dFVJTlQzMiAoQllURSogcCwgRFdPUkQgdmFsKQotLy8gQ29udmVydCBmcm9tIERXT1JEIHRvIEJZVEVbXSBpbiBhIHBvcnRhYmxlIHdheQorc3RhdGljIHZvaWQgc192UHV0VUlOVDMyICh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIHZhbCkKKy8vIENvbnZlcnQgZnJvbSB1bnNpZ25lZCBsb25nIHRvIHVuc2lnbmVkIGNoYXIgW10gaW4gYSBwb3J0YWJsZSB3YXkKIHsKLSAgICBVSU5UIGk7CisgICAgdW5zaWduZWQgaW50IGk7CiAgICAgZm9yKGk9MDsgaTw0OyBpKysgKQogICAgIHsKLSAgICAgICAgKnArKyA9IChCWVRFKSAodmFsICYgMHhmZik7CisgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikgKHZhbCAmIDB4ZmYpOwogICAgICAgICB2YWwgPj49IDg7CiAgICAgfQogfQpAQCAtOTksNyArOTksNyBAQAogICAgIE0gPSAwOwogfQogCi1zdGF0aWMgdm9pZCBzX3ZTZXRLZXkgKERXT1JEIGR3SzAsIERXT1JEIGR3SzEpCitzdGF0aWMgdm9pZCBzX3ZTZXRLZXkgKHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKQogewogICAgIC8vIFNldCB0aGUga2V5CiAgICAgSzAgPSBkd0swOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgc192Q2xlYXIoKTsKIH0KIAotc3RhdGljIHZvaWQgc192QXBwZW5kQnl0ZSAoQllURSBiKQorc3RhdGljIHZvaWQgc192QXBwZW5kQnl0ZSAodW5zaWduZWQgY2hhciBiKQogewogICAgIC8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKICAgICBNIHw9IGIgPDwgKDgqbkJ5dGVzSW5NKTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgIH0KIH0KIAotdm9pZCBNSUNfdkluaXQgKERXT1JEIGR3SzAsIERXT1JEIGR3SzEpCit2b2lkIE1JQ192SW5pdCAodW5zaWduZWQgbG9uZyBkd0swLCB1bnNpZ25lZCBsb25nIGR3SzEpCiB7CiAgICAgLy8gU2V0IHRoZSBrZXkKICAgICBzX3ZTZXRLZXkoZHdLMCwgZHdLMSk7CkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICBzX3ZDbGVhcigpOwogfQogCi12b2lkIE1JQ192QXBwZW5kIChQQllURSBzcmMsIFVJTlQgbkJ5dGVzKQordm9pZCBNSUNfdkFwcGVuZCAodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgbkJ5dGVzKQogewogICAgIC8vIFRoaXMgaXMgc2ltcGxlCiAgICAgd2hpbGUgKG5CeXRlcyA+IDApCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgTUlDX3ZHZXRNSUMgKFBEV09SRCBwZHdMLCBQRFdPUkQgcGR3UikKK3ZvaWQgTUlDX3ZHZXRNSUMgKHVuc2lnbmVkIGxvbmcgKnBkd0wsIHVuc2lnbmVkIGxvbmcgKnBkd1IpCiB7CiAgICAgLy8gQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcKICAgICBzX3ZBcHBlbmRCeXRlKDB4NWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuaAppbmRleCA5N2RlNzdiLi4zMTMxYjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuaApAQCAtMzUsMTYgKzM1LDE2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVHlwZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgTUlDX3ZJbml0KERXT1JEIGR3SzAsIERXT1JEIGR3SzEpOwordm9pZCBNSUNfdkluaXQodW5zaWduZWQgbG9uZyBkd0swLCB1bnNpZ25lZCBsb25nIGR3SzEpOwogCiB2b2lkIE1JQ192VW5Jbml0KHZvaWQpOwogCiAvLyBBcHBlbmQgYnl0ZXMgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgTUlDZWQKLXZvaWQgTUlDX3ZBcHBlbmQoUEJZVEUgc3JjLCBVSU5UIG5CeXRlcyk7Cit2b2lkIE1JQ192QXBwZW5kKHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgaW50IG5CeXRlcyk7CiAKIC8vIEdldCB0aGUgTUlDIHJlc3VsdC4gRGVzdGluYXRpb24gc2hvdWxkIGFjY2VwdCA4IGJ5dGVzIG9mIHJlc3VsdC4KIC8vIFRoaXMgYWxzbyByZXNldHMgdGhlIG1lc3NhZ2UgdG8gZW1wdHkuCi12b2lkIE1JQ192R2V0TUlDKFBEV09SRCBwZHdMLCBQRFdPUkQgcGR3Uik7Cit2b2lkIE1JQ192R2V0TUlDKHVuc2lnbmVkIGxvbmcgKnBkd0wsIHVuc2lnbmVkIGxvbmcgKnBkd1IpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmMKaW5kZXggNjRjMjJjMy4uNzIwN2FjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcG93ZXIuYwpAQCAtNzcsMTIgKzc3LDEyIEBACiB2b2lkCiBQU3ZFbmFibGVQb3dlclNhdmluZygKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBXT1JEIHdMaXN0ZW5JbnRlcnZhbAorICAgIHVuc2lnbmVkIHNob3J0IHdMaXN0ZW5JbnRlcnZhbAogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBXT1JEICAgICAgICAgICAgd0FJRCA9IHBNZ210LT53Q3VyckFJRCB8IEJJVDE0IHwgQklUMTU7CisgICAgdW5zaWduZWQgc2hvcnQgd0FJRCA9IHBNZ210LT53Q3VyckFJRCB8IEJJVDE0IHwgQklUMTU7CiAKICAgICAvLyBzZXQgcGVyaW9kIG9mIHBvd2VyIHVwIGJlZm9yZSBUQlRUCiAgICAgVk5Tdk91dFBvcnRXKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXQlQsIENfUFdCVCk7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAogICAgIC8vIGVuYWJsZSBwb3dlciBzYXZpbmcgaHcgZnVuY3Rpb24KICAgICBNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX1BTRU4pOwotICAgIHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPSBUUlVFOworICAgIHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPSB0cnVlOwogCiAgICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykgewogLy8gICAgICAgIGJNZ3JQcmVwYXJlQmVhY29uVG9TZW5kKCh2b2lkICopcERldmljZSwgcE1nbXQpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgZWxzZSBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKSB7CiAgICAgICAgIFBTYlNlbmROdWxsUGFja2V0KHBEZXZpY2UpOwogICAgIH0KLSAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IFRSVUU7CisgICAgcERldmljZS0+YlBXQml0T24gPSB0cnVlOwogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlBTOlBvd2VyIFNhdmluZyBNb2RlIEVuYWJsZS4uLiBcbiIpOwogICAgIHJldHVybjsKIH0KQEAgLTE2MSwxMiArMTYxLDEyIEBACiAgICAgLy8gc2V0IGFsd2F5cyBsaXN0ZW4gYmVhY29uCiAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9BTEJDTik7CiAKLSAgICBwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID0gRkFMU0U7CisgICAgcERldmljZS0+YkVuYWJsZVBTTW9kZSA9IGZhbHNlOwogCiAgICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkgewogICAgICAgICBQU2JTZW5kTnVsbFBhY2tldChwRGV2aWNlKTsKICAgICB9Ci0gICAgcERldmljZS0+YlBXQml0T24gPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IGZhbHNlOwogICAgIHJldHVybjsKIH0KIApAQCAtMTc3LDM1ICsxNzcsMzUgQEAKICAqIENvbnNpZGVyIHRvIHBvd2VyIGRvd24gd2hlbiBubyBtb3JlIHBhY2tldHMgdG8gdHggb3IgcnguCiAgKgogICogUmV0dXJuIFZhbHVlOgotICogICAgVFJVRSwgaWYgcG93ZXIgZG93biBzdWNjZXNzCi0gKiAgICBGQUxTRSwgaWYgZmFpbAorICogICAgdHJ1ZSwgaWYgcG93ZXIgZG93biBzdWNjZXNzCisgKiAgICBmYWxzZSwgaWYgZmFpbAogLSovCiAKIAotQk9PTAorYm9vbAogUFNiQ29uc2lkZXJQb3dlckRvd24oCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgQk9PTCBiQ2hlY2tSeERNQSwKLSAgICBCT09MIGJDaGVja0NvdW50VG9XYWtlVXAKKyAgICBib29sIGJDaGVja1J4RE1BLAorICAgIGJvb2wgYkNoZWNrQ291bnRUb1dha2VVcAogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBVSU5UICAgICAgICAgICAgdUlkeDsKKyAgICB1bnNpZ25lZCBpbnQgdUlkeDsKIAogICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgaW4gRG96ZSBtb2RlCiAgICAgaWYgKE1BQ2JJc1JlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9QUykpCi0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlICE9IFdNQUNfTU9ERV9JQlNTX1NUQSkgewogICAgICAgICAvLyBjaGVjayBpZiBpbiBUSU0gd2FrZSBwZXJpb2QKICAgICAgICAgaWYgKHBNZ210LT5iSW5USU1XYWtlKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIGNoZWNrIHNjYW4gc3RhdGUKICAgICBpZiAocERldmljZS0+YkNtZFJ1bm5pbmcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gRnJvY2UgUFNFTiBvbgogICAgIE1BQ3ZSZWdCaXRzT24ocERldmljZS0+UG9ydE9mZnNldCwgTUFDX1JFR19QU0NUTCwgUFNDVExfUFNFTik7CkBAIC0yMTMsMjcgKzIxMywyNyBAQAogICAgIC8vIGNoZWNrIGlmIGFsbCBURCBhcmUgZW1wdHksCiAgICAgZm9yICh1SWR4ID0gMDsgdUlkeCA8IFRZUEVfTUFYVEQ7IHVJZHggKyspIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmlURFVzZWRbdUlkeF0gIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBjaGVjayBpZiByeCBpc3IgaXMgY2xlYXIKICAgICBpZiAoYkNoZWNrUnhETUEgJiYKICAgICAgICAgKChwRGV2aWNlLT5kd0lzciYgSVNSX1JYRE1BMCkgIT0gMCkgJiYKICAgICAgICAgKChwRGV2aWNlLT5kd0lzciAmIElTUl9SWERNQTEpICE9IDApKXsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfTsKIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlICE9IFdNQUNfTU9ERV9JQlNTX1NUQSkgewogICAgICAgICBpZiAoYkNoZWNrQ291bnRUb1dha2VVcCAmJgogICAgICAgICAgICAocE1nbXQtPndDb3VudFRvV2FrZVVwID09IDAgfHwgcE1nbXQtPndDb3VudFRvV2FrZVVwID09IDEpKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIG5vIFR4LCBubyBSeCBpc3IsIG5vdyBnbyB0byBEb3plCiAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9HTzJET1pFKTsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJHbyB0byBEb3plIFpaWlpaWlpaWlpaWlpaWlxuIik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIApAQCAtMjYyLDcgKzI2Miw3IEBACiAKICAgICBtZW1zZXQocE1nbXQtPnBieVBTUGFja2V0UG9vbCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9IRFJfQUREUjJfTEVOKTsKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieVBTUGFja2V0UG9vbDsKLSAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwogICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIud0ZyYW1lQ3RsID0gY3B1X3RvX2xlMTYoCiAgICAgICAgICAoCiAgICAgICAgICBXTEFOX1NFVF9GQ19GVFlQRShXTEFOX1RZUEVfQ1RMKSB8CkBAIC0yOTYsNyArMjk2LDcgQEAKICAqICAgIE5vbmUuCiAgKgogLSovCi1CT09MCitib29sCiBQU2JTZW5kTnVsbFBhY2tldCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dAogICAgICkKQEAgLTMwNCwzMiArMzA0LDMyIEBACiAgICAgUFNEZXZpY2UgICAgICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwogICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0ID0gTlVMTDsKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1SWR4OworICAgIHVuc2lnbmVkIGludCB1SWR4OwogCiAKLSAgICBpZiAocERldmljZS0+YkxpbmtQYXNzID09IEZBTFNFKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAocERldmljZS0+YkxpbmtQYXNzID09IGZhbHNlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgI2lmZGVmIFR4SW5TbGVlcAotICAgICBpZiAoKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPT0gRkFMU0UpICYmCi0JICAocERldmljZS0+ZlR4RGF0YUluU2xlZXAgPT0gRkFMU0UpKXsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICBpZiAoKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPT0gZmFsc2UpICYmCisJICAocERldmljZS0+ZlR4RGF0YUluU2xlZXAgPT0gZmFsc2UpKXsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICNlbHNlCi0gICAgaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPT0gRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID09IGZhbHNlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAjZW5kaWYKICAgICBpZiAocERldmljZS0+YkVuYWJsZVBTTW9kZSkgewogICAgICAgICBmb3IgKHVJZHggPSAwOyB1SWR4IDwgVFlQRV9NQVhURDsgdUlkeCArKykgewogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmlURFVzZWRbdUlkeF0gIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgbWVtc2V0KHBNZ210LT5wYnlQU1BhY2tldFBvb2wsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fTlVMTERBVEFfRlJfTUFYTEVOKTsKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieVBTUGFja2V0UG9vbDsKLSAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwogCiAgICAgaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUpIHsKIApAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgfQogCiAgICAgaWYocE1nbXQtPmVDdXJyTW9kZSAhPSBXTUFDX01PREVfSUJTU19TVEEpIHsKLSAgICAgICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy53RnJhbWVDdGwgfD0gY3B1X3RvX2xlMTYoKFdPUkQpV0xBTl9TRVRfRkNfVE9EUygxKSk7CisgICAgICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMud0ZyYW1lQ3RsIHw9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClXTEFOX1NFVF9GQ19UT0RTKDEpKTsKICAgICB9CiAKICAgICBtZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9BRERSX0xFTik7CkBAIC0zNjEsNyArMzYxLDcgQEAKICAgICAvLyBzZW5kIHRoZSBmcmFtZQogICAgIGlmIChjc01nbXRfeG1pdChwRGV2aWNlLCBwVHhQYWNrZXQpICE9IENNRF9TVEFUVVNfUEVORElORykgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTZW5kIE51bGwgUGFja2V0IGZhaWxlZCAhXG4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGVsc2UgewogCkBAIC0zNjksNyArMzY5LDcgQEAKICAgICB9CiAKIAotICAgIHJldHVybiBUUlVFIDsKKyAgICByZXR1cm4gdHJ1ZSA7CiB9CiAKIC8qKwpAQCAtMzgyLDcgKzM4Miw3IEBACiAgKgogLSovCiAKLUJPT0wKK2Jvb2wKIFBTYklzTmV4dFRCVFRXYWtlVXAoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQKICAgICApCkBAIC0zOTAsNyArMzkwLDcgQEAKIAogICAgIFBTRGV2aWNlICAgICAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICBiV2FrZVVwID0gRkFMU0U7CisgICAgYm9vbCBiV2FrZVVwID0gZmFsc2U7CiAKICAgICBpZiAocE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA+PSAyKSB7CiAgICAgICAgIGlmIChwTWdtdC0+d0NvdW50VG9XYWtlVXAgPT0gMCkgewpAQCAtNDAyLDcgKzQwMiw3IEBACiAgICAgICAgIGlmIChwTWdtdC0+d0NvdW50VG9XYWtlVXAgPT0gMSkgewogICAgICAgICAgICAgLy8gVHVybiBvbiB3YWtlIHVwIHRvIGxpc3RlbiBuZXh0IGJlYWNvbgogICAgICAgICAgICAgTUFDdlJlZ0JpdHNPbihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9MTkJDTik7Ci0gICAgICAgICAgICBiV2FrZVVwID0gVFJVRTsKKyAgICAgICAgICAgIGJXYWtlVXAgPSB0cnVlOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmgKaW5kZXggYzBkYmUyMS4uMDEwMTNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcG93ZXIuaApAQCAtNDgsMTEgKzQ4LDExIEBACiAvLyBQU0RldmljZSBwRGV2aWNlCiAvLyBQU0RldmljZSBoRGV2aWNlQ29udGV4dAogCi1CT09MCitib29sCiBQU2JDb25zaWRlclBvd2VyRG93bigKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBCT09MIGJDaGVja1J4RE1BLAotICAgIEJPT0wgYkNoZWNrQ291bnRUb1dha2VVcAorICAgIGJvb2wgYkNoZWNrUnhETUEsCisgICAgYm9vbCBiQ2hlY2tDb3VudFRvV2FrZVVwCiAgICAgKTsKIAogdm9pZApAQCAtNjMsNyArNjMsNyBAQAogdm9pZAogUFN2RW5hYmxlUG93ZXJTYXZpbmcoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgV09SRCB3TGlzdGVuSW50ZXJ2YWwKKyAgICB1bnNpZ25lZCBzaG9ydCB3TGlzdGVuSW50ZXJ2YWwKICAgICApOwogCiB2b2lkCkBAIC03MSwxMiArNzEsMTIgQEAKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dAogICAgICk7CiAKLUJPT0wKK2Jvb2wKIFBTYlNlbmROdWxsUGFja2V0KAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0CiAgICAgKTsKIAotQk9PTAorYm9vbAogUFNiSXNOZXh0VEJUVFdha2VVcCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dAogICAgICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JjNC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yYzQuYwppbmRleCA0YTUzZjE1Li45ODU2YzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JjNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmM0LmMKQEAgLTMyLDM4ICszMiwzOCBAQAogCiAjaW5jbHVkZSAicmM0LmgiCiAKLXZvaWQgcmM0X2luaXQoUFJDNEV4dCBwUkM0LCBQQllURSBwYnlLZXksIFVJTlQgY2JLZXlfbGVuKQordm9pZCByYzRfaW5pdChQUkM0RXh0IHBSQzQsIHVuc2lnbmVkIGNoYXIgKnBieUtleSwgdW5zaWduZWQgaW50IGNiS2V5X2xlbikKIHsKLSAgICBVSU5UICB1c3QxLCB1c3QyOwotICAgIFVJTlQgIGtleWluZGV4OwotICAgIFVJTlQgIHN0YXRlaW5kZXg7Ci0gICAgUEJZVEUgcGJ5c3Q7Ci0gICAgVUlOVCAgaWR4OworICAgIHVuc2lnbmVkIGludCB1c3QxLCB1c3QyOworICAgIHVuc2lnbmVkIGludCBrZXlpbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgc3RhdGVpbmRleDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlzdDsKKyAgICB1bnNpZ25lZCBpbnQgaWR4OwogCiAgICAgcGJ5c3QgPSBwUkM0LT5hYnlzdGF0ZTsKICAgICBwUkM0LT51eCA9IDA7CiAgICAgcFJDNC0+dXkgPSAwOwogICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgMjU2OyBpZHgrKykKLSAgICAgICAgcGJ5c3RbaWR4XSA9IChCWVRFKWlkeDsKKyAgICAgICAgcGJ5c3RbaWR4XSA9ICh1bnNpZ25lZCBjaGFyKWlkeDsKICAgICBrZXlpbmRleCA9IDA7CiAgICAgc3RhdGVpbmRleCA9IDA7CiAgICAgZm9yIChpZHggPSAwOyBpZHggPCAyNTY7IGlkeCsrKSB7CiAgICAgICAgIHVzdDEgPSBwYnlzdFtpZHhdOwogICAgICAgICBzdGF0ZWluZGV4ID0gKHN0YXRlaW5kZXggKyBwYnlLZXlba2V5aW5kZXhdICsgdXN0MSkgJiAweGZmOwogICAgICAgICB1c3QyID0gcGJ5c3Rbc3RhdGVpbmRleF07Ci0gICAgICAgIHBieXN0W3N0YXRlaW5kZXhdID0gKEJZVEUpdXN0MTsKLSAgICAgICAgcGJ5c3RbaWR4XSA9IChCWVRFKXVzdDI7CisgICAgICAgIHBieXN0W3N0YXRlaW5kZXhdID0gKHVuc2lnbmVkIGNoYXIpdXN0MTsKKyAgICAgICAgcGJ5c3RbaWR4XSA9ICh1bnNpZ25lZCBjaGFyKXVzdDI7CiAgICAgICAgIGlmICgrK2tleWluZGV4ID49IGNiS2V5X2xlbikKICAgICAgICAgICAgIGtleWluZGV4ID0gMDsKICAgICB9CiB9CiAKLVVJTlQgcmM0X2J5dGUoUFJDNEV4dCBwUkM0KQordW5zaWduZWQgaW50IHJjNF9ieXRlKFBSQzRFeHQgcFJDNCkKIHsKLSAgICBVSU5UIHV4OwotICAgIFVJTlQgdXk7Ci0gICAgVUlOVCB1c3R4LCB1c3R5OwotICAgIFBCWVRFIHBieXN0OworICAgIHVuc2lnbmVkIGludCB1eDsKKyAgICB1bnNpZ25lZCBpbnQgdXk7CisgICAgdW5zaWduZWQgaW50IHVzdHgsIHVzdHk7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5c3Q7CiAKICAgICBwYnlzdCA9IHBSQzQtPmFieXN0YXRlOwogICAgIHV4ID0gKHBSQzQtPnV4ICsgMSkgJiAweGZmOwpAQCAtNzIsMTYgKzcyLDE2IEBACiAgICAgdXN0eSA9IHBieXN0W3V5XTsKICAgICBwUkM0LT51eCA9IHV4OwogICAgIHBSQzQtPnV5ID0gdXk7Ci0gICAgcGJ5c3RbdXldID0gKEJZVEUpdXN0eDsKLSAgICBwYnlzdFt1eF0gPSAoQllURSl1c3R5OworICAgIHBieXN0W3V5XSA9ICh1bnNpZ25lZCBjaGFyKXVzdHg7CisgICAgcGJ5c3RbdXhdID0gKHVuc2lnbmVkIGNoYXIpdXN0eTsKIAogICAgIHJldHVybiBwYnlzdFsodXN0eCArIHVzdHkpICYgMHhmZl07CiB9CiAKLXZvaWQgcmM0X2VuY3J5cHQoUFJDNEV4dCBwUkM0LCBQQllURSBwYnlEZXN0LAotICAgICAgICAgICAgICAgICAgICAgUEJZVEUgcGJ5U3JjLCBVSU5UIGNiRGF0YV9sZW4pCit2b2lkIHJjNF9lbmNyeXB0KFBSQzRFeHQgcFJDNCwgdW5zaWduZWQgY2hhciAqcGJ5RGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBieVNyYywgdW5zaWduZWQgaW50IGNiRGF0YV9sZW4pCiB7Ci0gICAgVUlOVCBpaTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAgICAgZm9yIChpaSA9IDA7IGlpIDwgY2JEYXRhX2xlbjsgaWkrKykKLSAgICAgICAgcGJ5RGVzdFtpaV0gPSAoQllURSkocGJ5U3JjW2lpXSBeIHJjNF9ieXRlKHBSQzQpKTsKKyAgICAgICAgcGJ5RGVzdFtpaV0gPSAodW5zaWduZWQgY2hhcikocGJ5U3JjW2lpXSBeIHJjNF9ieXRlKHBSQzQpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmM0LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JjNC5oCmluZGV4IGU2NWNhZTYuLmFkMDRlMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmM0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yYzQuaApAQCAtMzUsMTMgKzM1LDEzIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBUeXBlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBVSU5UIHV4OwotICAgIFVJTlQgdXk7Ci0gICAgQllURSBhYnlzdGF0ZVsyNTZdOworICAgIHVuc2lnbmVkIGludCB1eDsKKyAgICB1bnNpZ25lZCBpbnQgdXk7CisgICAgdW5zaWduZWQgY2hhciBhYnlzdGF0ZVsyNTZdOwogfSBSQzRFeHQsICpQUkM0RXh0OwogCi12b2lkIHJjNF9pbml0KFBSQzRFeHQgcFJDNCwgUEJZVEUgcGJ5S2V5LCBVSU5UIGNiS2V5X2xlbik7Ci1VSU5UIHJjNF9ieXRlKFBSQzRFeHQgcFJDNCk7Ci12b2lkIHJjNF9lbmNyeXB0KFBSQzRFeHQgcFJDNCwgUEJZVEUgcGJ5RGVzdCwgUEJZVEUgcGJ5U3JjLCBVSU5UIGNiRGF0YV9sZW4pOwordm9pZCByYzRfaW5pdChQUkM0RXh0IHBSQzQsIHVuc2lnbmVkIGNoYXIgKnBieUtleSwgdW5zaWduZWQgaW50IGNiS2V5X2xlbik7Cit1bnNpZ25lZCBpbnQgcmM0X2J5dGUoUFJDNEV4dCBwUkM0KTsKK3ZvaWQgcmM0X2VuY3J5cHQoUFJDNEV4dCBwUkM0LCB1bnNpZ25lZCBjaGFyICpwYnlEZXN0LCB1bnNpZ25lZCBjaGFyICpwYnlTcmMsIHVuc2lnbmVkIGludCBjYkRhdGFfbGVuKTsKIAogI2VuZGlmIC8vX19SQzRfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMKaW5kZXggN2NiODZmZS4uYjhlYzc4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmYuYwpAQCAtOTQsNyArOTQsNyBAQAogCiAKIAotY29uc3QgRFdPUkQgZHdBTDIyMzBJbml0VGFibGVbQ0JfQUwyMjMwX0lOSVRfU0VRXSA9IHsKK2NvbnN0IHVuc2lnbmVkIGxvbmcgZHdBTDIyMzBJbml0VGFibGVbQ0JfQUwyMjMwX0lOSVRfU0VRXSA9IHsKICAgICAweDAzRjc5MDAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8KICAgICAweDAzMzMzMTAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8KICAgICAweDAxQTAwMjAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8KQEAgLTExMiw3ICsxMTIsNyBAQAogICAgIDB4MDA1ODBGMDArKEJZX0FMMjIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXCiAgICAgfTsKIAotY29uc3QgRFdPUkQgZHdBTDIyMzBDaGFubmVsVGFibGUwW0NCX01BWF9DSEFOTkVMXSA9IHsKK2NvbnN0IHVuc2lnbmVkIGxvbmcgZHdBTDIyMzBDaGFubmVsVGFibGUwW0NCX01BWF9DSEFOTkVMXSA9IHsKICAgICAweDAzRjc5MDAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gY2hhbm5lbCA9IDEsIFRmID0gMjQxMk1IegogICAgIDB4MDNGNzkwMDArKEJZX0FMMjIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvLyBjaGFubmVsID0gMiwgVGYgPSAyNDE3TUh6CiAgICAgMHgwM0U3OTAwMCsoQllfQUwyMjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8vIGNoYW5uZWwgPSAzLCBUZiA9IDI0MjJNSHoKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIDB4MDNFN0MwMDArKEJZX0FMMjIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXICAvLyBjaGFubmVsID0gMTQsIFRmID0gMjQxMk0KICAgICB9OwogCi1jb25zdCBEV09SRCBkd0FMMjIzMENoYW5uZWxUYWJsZTFbQ0JfTUFYX0NIQU5ORUxdID0geworY29uc3QgdW5zaWduZWQgbG9uZyBkd0FMMjIzMENoYW5uZWxUYWJsZTFbQ0JfTUFYX0NIQU5ORUxdID0gewogICAgIDB4MDMzMzMxMDArKEJZX0FMMjIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvLyBjaGFubmVsID0gMSwgVGYgPSAyNDEyTUh6CiAgICAgMHgwQjMzMzEwMCsoQllfQUwyMjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8vIGNoYW5uZWwgPSAyLCBUZiA9IDI0MTdNSHoKICAgICAweDAzMzMzMTAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gY2hhbm5lbCA9IDMsIFRmID0gMjQyMk1IegpAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgMHgwNjY2NjEwMCsoQllfQUwyMjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1cgIC8vIGNoYW5uZWwgPSAxNCwgVGYgPSAyNDEyTQogICAgIH07CiAKLURXT1JEIGR3QUwyMjMwUG93ZXJUYWJsZVtBTDIyMzBfUFdSX0lEWF9MRU5dID0gewordW5zaWduZWQgbG9uZyBkd0FMMjIzMFBvd2VyVGFibGVbQUwyMjMwX1BXUl9JRFhfTEVOXSA9IHsKICAgICAweDA0MDQwOTAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywKICAgICAweDA0MDQxOTAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywKICAgICAweDA0MDQyOTAwKyhCWV9BTDIyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywKQEAgLTIxNiw3ICsyMTYsNyBAQAogLy97eyBSb2JlcnRZdToyMDA1MDEwNAogLy8gNDBNSHogcmVmZXJlbmNlIGZyZXF1ZW5jeQogLy8gTmVlZCB0byBQdWxsIFBMTE9OKFBFMykgbG93IHdoZW4gd3JpdGluZyBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoIDMtd2lyZS4KLWNvbnN0IERXT1JEIGR3QUw3MjMwSW5pdFRhYmxlW0NCX0FMNzIzMF9JTklUX1NFUV0gPSB7Citjb25zdCB1bnNpZ25lZCBsb25nIGR3QUw3MjMwSW5pdFRhYmxlW0NCX0FMNzIzMF9JTklUX1NFUV0gPSB7CiAgICAgMHgwMDM3OTAwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8vIENoYW5uZWwxIC8vIE5lZWQgbW9kaWZ5IGZvciAxMWEKICAgICAweDEzMzMzMTAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gQ2hhbm5lbDEgLy8gTmVlZCBtb2RpZnkgZm9yIDExYQogICAgIDB4ODQxRkYyMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvLyBOZWVkIG1vZGlmeSBmb3IgMTFhOiA0NTFGRTIKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgIDB4MUFCQThGMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXICAvLyBOZWVkIG1vZGlmeSBmb3IgMTFhOiAxMkJBQ0YKICAgICB9OwogCi1jb25zdCBEV09SRCBkd0FMNzIzMEluaXRUYWJsZUFNb2RlW0NCX0FMNzIzMF9JTklUX1NFUV0gPSB7Citjb25zdCB1bnNpZ25lZCBsb25nIGR3QUw3MjMwSW5pdFRhYmxlQU1vZGVbQ0JfQUw3MjMwX0lOSVRfU0VRXSA9IHsKICAgICAweDBGRjUyMDAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gQ2hhbm5lbDE4NCAvLyBOZWVkIG1vZGlmeSBmb3IgMTFiL2cKICAgICAweDAwMDAwMTAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gQ2hhbm5lbDE4NCAvLyBOZWVkIG1vZGlmeSBmb3IgMTFiL2cKICAgICAweDQ1MUZFMjAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gTmVlZCBtb2RpZnkgZm9yIDExYi9nCkBAIC0yNTksNyArMjU5LDcgQEAKICAgICB9OwogCiAKLWNvbnN0IERXT1JEIGR3QUw3MjMwQ2hhbm5lbFRhYmxlMFtDQl9NQVhfQ0hBTk5FTF0gPSB7Citjb25zdCB1bnNpZ25lZCBsb25nIGR3QUw3MjMwQ2hhbm5lbFRhYmxlMFtDQl9NQVhfQ0hBTk5FTF0gPSB7CiAgICAgMHgwMDM3OTAwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8vIGNoYW5uZWwgPSAgMSwgVGYgPSAyNDEyTUh6CiAgICAgMHgwMDM3OTAwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8vIGNoYW5uZWwgPSAgMiwgVGYgPSAyNDE3TUh6CiAgICAgMHgwMDM3OTAwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8vIGNoYW5uZWwgPSAgMywgVGYgPSAyNDIyTUh6CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAweDBGRjYxMDAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVyAgLy8gY2hhbm5lbCA9IDE2NSwgVGYgPSA1ODI1TUh6ICg1NikKICAgICB9OwogCi1jb25zdCBEV09SRCBkd0FMNzIzMENoYW5uZWxUYWJsZTFbQ0JfTUFYX0NIQU5ORUxdID0geworY29uc3QgdW5zaWduZWQgbG9uZyBkd0FMNzIzMENoYW5uZWxUYWJsZTFbQ0JfTUFYX0NIQU5ORUxdID0gewogICAgIDB4MTMzMzMxMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvLyBjaGFubmVsID0gIDEsIFRmID0gMjQxMk1IegogICAgIDB4MUIzMzMxMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvLyBjaGFubmVsID0gIDIsIFRmID0gMjQxN01IegogICAgIDB4MDMzMzMxMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvLyBjaGFubmVsID0gIDMsIFRmID0gMjQyMk1IegpAQCAtMzg5LDcgKzM4OSw3IEBACiAgICAgMHgwMkFBQTEwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1cgIC8vIGNoYW5uZWwgPSAxNjUsIFRmID0gNTgyNU1IeiAoNTYpCiAgICAgfTsKIAotY29uc3QgRFdPUkQgZHdBTDcyMzBDaGFubmVsVGFibGUyW0NCX01BWF9DSEFOTkVMXSA9IHsKK2NvbnN0IHVuc2lnbmVkIGxvbmcgZHdBTDcyMzBDaGFubmVsVGFibGUyW0NCX01BWF9DSEFOTkVMXSA9IHsKICAgICAweDdGRDc4NDAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gY2hhbm5lbCA9ICAxLCBUZiA9IDI0MTJNSHoKICAgICAweDdGRDc4NDAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gY2hhbm5lbCA9ICAyLCBUZiA9IDI0MTdNSHoKICAgICAweDdGRDc4NDAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLy8gY2hhbm5lbCA9ICAzLCBUZiA9IDI0MjJNSHoKQEAgLTQ3MSwxNSArNDcxLDE1IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwotQk9PTCBzX2JBTDcyMzBJbml0IChEV09SRF9QVFIgZHdJb0Jhc2UpCitib29sIHNfYkFMNzIzMEluaXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpCiB7CiAgICAgaW50ICAgICBpaTsKLSAgICBCT09MICAgIGJSZXN1bHQ7CisgICAgYm9vbCBiUmVzdWx0OwogCi0gICAgYlJlc3VsdCA9IFRSVUU7CisgICAgYlJlc3VsdCA9IHRydWU7CiAKICAgICAvLzMtd2lyZSBjb250cm9sIGZvciBub3JtYWwgbW9kZQogICAgIFZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfU09GVFBXUkNUTCwgMCk7CkBAIC01MTcsMTEgKzUxNywxMSBAQAogfQogCiAvLyBOZWVkIHRvIFB1bGwgUExMT04gbG93IHdoZW4gd3JpdGluZyBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoIDMtd2lyZSBpbnRlcmZhY2UKLUJPT0wgc19iQUw3MjMwU2VsZWN0Q2hhbm5lbCAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q2hhbm5lbCkKK2Jvb2wgc19iQUw3MjMwU2VsZWN0Q2hhbm5lbCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNoYW5uZWwpCiB7Ci0gICAgQk9PTCAgICBiUmVzdWx0OworICAgIGJvb2wgYlJlc3VsdDsKIAotICAgIGJSZXN1bHQgPSBUUlVFOworICAgIGJSZXN1bHQgPSB0cnVlOwogCiAgICAgLy8gUExMT04gT2ZmCiAgICAgTUFDdldvcmRSZWdCaXRzT2ZmKGR3SW9CYXNlLCBNQUNfUkVHX1NPRlRQV1JDVEwsIFNPRlRQV1JDVExfU1dQRTMpOwpAQCAtNTUyLDcgKzU1Miw3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwogCkBAIC01NjcsNyArNTY3LDcgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VlZGVkOyBGQUxTRSBpZiBmYWlsZWQuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VlZGVkOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogICovCiAKQEAgLTU4NSw3ICs1ODUsNyBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KIApAQCAtNTk5LDcgKzU5OSw3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwogCkBAIC02MTksMTMgKzYxOSwxMyBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KLUJPT0wgSUZSRmJXcml0ZUVtYmVkZWQgKERXT1JEX1BUUiBkd0lvQmFzZSwgRFdPUkQgZHdEYXRhKQorYm9vbCBJRlJGYldyaXRlRW1iZWRlZCAodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0RhdGEpCiB7Ci0gICAgV09SRCAgICB3dzsKLSAgICBEV09SRCAgIGR3VmFsdWU7CisgICAgdW5zaWduZWQgc2hvcnQgd3c7CisgICAgdW5zaWduZWQgbG9uZyBkd1ZhbHVlOwogCiAgICAgVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19JRlJFR0NUTCwgZHdEYXRhKTsKIApAQCAtNjM4LDkgKzYzOCw5IEBACiAKICAgICBpZiAod3cgPT0gV19NQVhfVElNRU9VVCkgewogLy8gICAgICAgIERCR19QT1JUODBfQUxXQVlTKDB4MzIpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIApAQCAtNjU0LDcgKzY1NCw3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwogCkBAIC02NjgsNyArNjY4LDcgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VlZGVkOyBGQUxTRSBpZiBmYWlsZWQuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VlZGVkOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogICovCiAKQEAgLTY4MSwxNSArNjgxLDE1IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwotQk9PTCBSRmJBTDIyMzBJbml0IChEV09SRF9QVFIgZHdJb0Jhc2UpCitib29sIFJGYkFMMjIzMEluaXQgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UpCiB7CiAgICAgaW50ICAgICBpaTsKLSAgICBCT09MICAgIGJSZXN1bHQ7CisgICAgYm9vbCBiUmVzdWx0OwogCi0gICAgYlJlc3VsdCA9IFRSVUU7CisgICAgYlJlc3VsdCA9IHRydWU7CiAKICAgICAvLzMtd2lyZSBjb250cm9sIGZvciBub3JtYWwgbW9kZQogICAgIFZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfU09GVFBXUkNUTCwgMCk7CkBAIC03MzQsMTEgKzczNCwxMSBAQAogICAgIHJldHVybiBiUmVzdWx0OwogfQogCi1CT09MIFJGYkFMMjIzMFNlbGVjdENoYW5uZWwgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUNoYW5uZWwpCitib29sIFJGYkFMMjIzMFNlbGVjdENoYW5uZWwgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsKQogewotICAgIEJPT0wgICAgYlJlc3VsdDsKKyAgICBib29sIGJSZXN1bHQ7CiAKLSAgICBiUmVzdWx0ID0gVFJVRTsKKyAgICBiUmVzdWx0ID0gdHJ1ZTsKIAogICAgIGJSZXN1bHQgJj0gSUZSRmJXcml0ZUVtYmVkZWQgKGR3SW9CYXNlLCBkd0FMMjIzMENoYW5uZWxUYWJsZTBbYnlDaGFubmVsLTFdKTsKICAgICBiUmVzdWx0ICY9IElGUkZiV3JpdGVFbWJlZGVkIChkd0lvQmFzZSwgZHdBTDIyMzBDaGFubmVsVGFibGUxW2J5Q2hhbm5lbC0xXSk7CkBAIC03NjEsNyArNzYxLDcgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VlZGVkOyBGQUxTRSBpZiBmYWlsZWQuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VlZGVkOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogICovCiAKQEAgLTc3Niw3ICs3NzYsNyBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KIApAQCAtNzkwLDcgKzc5MCw3IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwogCkBAIC04MDQsMTQgKzgwNCwxNCBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KLUJPT0wgUkZiSW5pdCAoCitib29sIFJGYkluaXQgKAogICAgIFBTRGV2aWNlICBwRGV2aWNlCiAgICAgKQogewotQk9PTCAgICBiUmVzdWx0ID0gVFJVRTsKK2Jvb2wgYlJlc3VsdCA9IHRydWU7CiAgICAgc3dpdGNoIChwRGV2aWNlLT5ieVJGVHlwZSkgewogICAgICAgICBjYXNlIFJGX0FJUk9IQSA6CiAgICAgICAgIGNhc2UgUkZfQUwyMjMwUzoKQEAgLTgyMywxMCArODIzLDEwIEBACiAgICAgICAgICAgICBiUmVzdWx0ID0gc19iQUw3MjMwSW5pdChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJGX05PVEhJTkcgOgotICAgICAgICAgICAgYlJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICBiUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGJSZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYlJlc3VsdDsKQEAgLTg0MiwyMSArODQyLDIxIEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwotQk9PTCBSRmJTaHV0RG93biAoCitib29sIFJGYlNodXREb3duICgKICAgICBQU0RldmljZSAgcERldmljZQogICAgICkKIHsKLUJPT0wgICAgYlJlc3VsdCA9IFRSVUU7Citib29sIGJSZXN1bHQgPSB0cnVlOwogCiAgICAgc3dpdGNoIChwRGV2aWNlLT5ieVJGVHlwZSkgewogICAgICAgICBjYXNlIFJGX0FJUk9IQTcyMzAgOgogICAgICAgICAgICAgYlJlc3VsdCA9IElGUkZiV3JpdGVFbWJlZGVkIChwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAweDFBQkFFRjAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBiUmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgIGJSZXN1bHQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBiUmVzdWx0OwpAQCAtODcyLDEyICs4NzIsMTIgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VlZGVkOyBGQUxTRSBpZiBmYWlsZWQuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VlZGVkOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogICovCi1CT09MIFJGYlNlbGVjdENoYW5uZWwgKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieVJGVHlwZSwgQllURSBieUNoYW5uZWwpCitib29sIFJGYlNlbGVjdENoYW5uZWwgKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlSRlR5cGUsIHVuc2lnbmVkIGNoYXIgYnlDaGFubmVsKQogewotQk9PTCAgICBiUmVzdWx0ID0gVFJVRTsKK2Jvb2wgYlJlc3VsdCA9IHRydWU7CiAgICAgc3dpdGNoIChieVJGVHlwZSkgewogCiAgICAgICAgIGNhc2UgUkZfQUlST0hBIDoKQEAgLTg5MCwxMCArODkwLDEwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgLy99fSBSb2JlcnRZdQogICAgICAgICBjYXNlIFJGX05PVEhJTkcgOgotICAgICAgICAgICAgYlJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICBiUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYlJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgYlJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBiUmVzdWx0OwpAQCAtOTExLDExICs5MTEsMTEgQEAKICAqIFJldHVybiBWYWx1ZTogTm9uZS4KICAqCiAgKi8KLUJPT0wgUkZ2V3JpdGVXYWtlUHJvZ1N5biAoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5UkZUeXBlLCBVSU5UIHVDaGFubmVsKQorYm9vbCBSRnZXcml0ZVdha2VQcm9nU3luICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UkZUeXBlLCB1bnNpZ25lZCBpbnQgdUNoYW5uZWwpCiB7CiAgICAgaW50ICAgaWk7Ci0gICAgQllURSAgYnlJbml0Q291bnQgPSAwOwotICAgIEJZVEUgIGJ5U2xlZXBDb3VudCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBieUluaXRDb3VudCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBieVNsZWVwQ291bnQgPSAwOwogCiAgICAgVk5Tdk91dFBvcnRXKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZOREVYLCAwKTsKICAgICBzd2l0Y2ggKGJ5UkZUeXBlKSB7CkBAIC05MjMsMjAgKzkyMywyMCBAQAogICAgICAgICBjYXNlIFJGX0FMMjIzMFM6CiAKICAgICAgICAgICAgIGlmICh1Q2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICBieUluaXRDb3VudCA9IENCX0FMMjIzMF9JTklUX1NFUSArIDI7IC8vIEluaXQgUmVnICsgQ2hhbm5lbCBSZWcgKDIpCiAgICAgICAgICAgICBieVNsZWVwQ291bnQgPSAwOwogICAgICAgICAgICAgaWYgKGJ5SW5pdENvdW50ID4gKE1JU0NGSUZPX1NZTkRBVEFTSVpFIC0gYnlTbGVlcENvdW50KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IENCX0FMMjIzMF9JTklUX1NFUTsgaWkrKyApIHsKLSAgICAgICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsIChXT1JEKShNSVNDRklGT19TWU5EQVRBX0lEWCArIGlpKSwgZHdBTDIyMzBJbml0VGFibGVbaWldKTsKKyAgICAgICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsICh1bnNpZ25lZCBzaG9ydCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUwyMjMwSW5pdFRhYmxlW2lpXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsIChXT1JEKShNSVNDRklGT19TWU5EQVRBX0lEWCArIGlpKSwgZHdBTDIyMzBDaGFubmVsVGFibGUwW3VDaGFubmVsLTFdKTsKKyAgICAgICAgICAgIE1BQ3ZTZXRNSVNDRmlmbyhkd0lvQmFzZSwgKHVuc2lnbmVkIHNob3J0KShNSVNDRklGT19TWU5EQVRBX0lEWCArIGlpKSwgZHdBTDIyMzBDaGFubmVsVGFibGUwW3VDaGFubmVsLTFdKTsKICAgICAgICAgICAgIGlpICsrOwotICAgICAgICAgICAgTUFDdlNldE1JU0NGaWZvKGR3SW9CYXNlLCAoV09SRCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUwyMjMwQ2hhbm5lbFRhYmxlMVt1Q2hhbm5lbC0xXSk7CisgICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsICh1bnNpZ25lZCBzaG9ydCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUwyMjMwQ2hhbm5lbFRhYmxlMVt1Q2hhbm5lbC0xXSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAvL3t7IFJvYmVydFl1OiAyMDA1MDEwNApAQCAtOTQ1LDQyICs5NDUsNDIgQEAKICAgICAgICAgICAgIGJ5SW5pdENvdW50ID0gQ0JfQUw3MjMwX0lOSVRfU0VRICsgMzsgLy8gSW5pdCBSZWcgKyBDaGFubmVsIFJlZyAoMykKICAgICAgICAgICAgIGJ5U2xlZXBDb3VudCA9IDA7CiAgICAgICAgICAgICBpZiAoYnlJbml0Q291bnQgPiAoTUlTQ0ZJRk9fU1lOREFUQVNJWkUgLSBieVNsZWVwQ291bnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHVDaGFubmVsIDw9IENCX01BWF9DSEFOTkVMXzI0RykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBDQl9BTDcyMzBfSU5JVF9TRVE7IGlpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1BQ3ZTZXRNSVNDRmlmbyhkd0lvQmFzZSwgKFdPUkQpKE1JU0NGSUZPX1NZTkRBVEFfSURYICsgaWkpLCBkd0FMNzIzMEluaXRUYWJsZVtpaV0pOworICAgICAgICAgICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsICh1bnNpZ25lZCBzaG9ydCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUw3MjMwSW5pdFRhYmxlW2lpXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IENCX0FMNzIzMF9JTklUX1NFUTsgaWkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgTUFDdlNldE1JU0NGaWZvKGR3SW9CYXNlLCAoV09SRCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUw3MjMwSW5pdFRhYmxlQU1vZGVbaWldKTsKKyAgICAgICAgICAgICAgICAgICAgTUFDdlNldE1JU0NGaWZvKGR3SW9CYXNlLCAodW5zaWduZWQgc2hvcnQpKE1JU0NGSUZPX1NZTkRBVEFfSURYICsgaWkpLCBkd0FMNzIzMEluaXRUYWJsZUFNb2RlW2lpXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsIChXT1JEKShNSVNDRklGT19TWU5EQVRBX0lEWCArIGlpKSwgZHdBTDcyMzBDaGFubmVsVGFibGUwW3VDaGFubmVsLTFdKTsKKyAgICAgICAgICAgIE1BQ3ZTZXRNSVNDRmlmbyhkd0lvQmFzZSwgKHVuc2lnbmVkIHNob3J0KShNSVNDRklGT19TWU5EQVRBX0lEWCArIGlpKSwgZHdBTDcyMzBDaGFubmVsVGFibGUwW3VDaGFubmVsLTFdKTsKICAgICAgICAgICAgIGlpICsrOwotICAgICAgICAgICAgTUFDdlNldE1JU0NGaWZvKGR3SW9CYXNlLCAoV09SRCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUw3MjMwQ2hhbm5lbFRhYmxlMVt1Q2hhbm5lbC0xXSk7CisgICAgICAgICAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsICh1bnNpZ25lZCBzaG9ydCkoTUlTQ0ZJRk9fU1lOREFUQV9JRFggKyBpaSksIGR3QUw3MjMwQ2hhbm5lbFRhYmxlMVt1Q2hhbm5lbC0xXSk7CiAgICAgICAgICAgICBpaSArKzsKLSAgICAgICAgICAgIE1BQ3ZTZXRNSVNDRmlmbyhkd0lvQmFzZSwgKFdPUkQpKE1JU0NGSUZPX1NZTkRBVEFfSURYICsgaWkpLCBkd0FMNzIzMENoYW5uZWxUYWJsZTJbdUNoYW5uZWwtMV0pOworICAgICAgICAgICAgTUFDdlNldE1JU0NGaWZvKGR3SW9CYXNlLCAodW5zaWduZWQgc2hvcnQpKE1JU0NGSUZPX1NZTkRBVEFfSURYICsgaWkpLCBkd0FMNzIzMENoYW5uZWxUYWJsZTJbdUNoYW5uZWwtMV0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8vfX0gUm9iZXJ0WXUKIAogICAgICAgICBjYXNlIFJGX05PVEhJTkcgOgotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBNQUN2U2V0TUlTQ0ZpZm8oZHdJb0Jhc2UsIE1JU0NGSUZPX1NZTklORk9fSURYLCAoRFdPUkQpTUFLRVdPUkQoYnlTbGVlcENvdW50LCBieUluaXRDb3VudCkpOworICAgIE1BQ3ZTZXRNSVNDRmlmbyhkd0lvQmFzZSwgTUlTQ0ZJRk9fU1lOSU5GT19JRFgsICh1bnNpZ25lZCBsb25nIClNQUtFV09SRChieVNsZWVwQ291bnQsIGJ5SW5pdENvdW50KSk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoKQEAgLTk5MywyNSArOTkzLDI1IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2NlZWRlZDsgRkFMU0UgaWYgZmFpbGVkLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2NlZWRlZDsgZmFsc2UgaWYgZmFpbGVkLgogICoKICAqLwotQk9PTCBSRmJTZXRQb3dlciAoCitib29sIFJGYlNldFBvd2VyICgKICAgICBQU0RldmljZSAgcERldmljZSwKLSAgICBVSU5UICAgICAgdVJBVEUsCi0gICAgVUlOVCAgICAgIHVDSAorICAgIHVuc2lnbmVkIGludCB1UkFURSwKKyAgICB1bnNpZ25lZCBpbnQgdUNICiAgICAgKQogewotQk9PTCAgICBiUmVzdWx0ID0gVFJVRTsKLUJZVEUgICAgYnlQd3IgPSAwOwotQllURSAgICBieURlYyA9IDA7Ci1CWVRFICAgIGJ5UHdyZEJtID0gMDsKK2Jvb2wgYlJlc3VsdCA9IHRydWU7Cit1bnNpZ25lZCBjaGFyIGJ5UHdyID0gMDsKK3Vuc2lnbmVkIGNoYXIgYnlEZWMgPSAwOwordW5zaWduZWQgY2hhciBieVB3cmRCbSA9IDA7CiAKICAgICBpZiAocERldmljZS0+ZHdEaWFnUmVmQ291bnQgIT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGlmICgodUNIIDwgMSkgfHwgKHVDSCA+IENCX01BWF9DSEFOTkVMKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBzd2l0Y2ggKHVSQVRFKSB7CkBAIC0xMDcwLDcgKzEwNzAsNyBAQAogI2lmIDAKIAogICAgIC8vIDgwMi4xMWggVFBDCi0gICAgaWYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSBUUlVFKSB7CisgICAgaWYgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSB7CiAgICAgICAgIC8vIGRvIG5vdCBvdmVyIGxvY2FsIGNvbnN0cmFpbnQKICAgICAgICAgaWYgKGJ5UHdyZEJtID4gcERldmljZS0+YWJ5TG9jYWxQd3JbdUNIXSkgewogICAgICAgICAgICAgcERldmljZS0+YnlDdXJQd3JkQm0gPSBwRGV2aWNlLT5hYnlMb2NhbFB3clt1Q0hdOwpAQCAtMTExMSwxMSArMTExMSwxMSBAQAogCiAvLyAgICBpZiAocERldmljZS0+YnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQjEpIHsKICAgICBpZiAocERldmljZS0+YnlDdXJQd3IgPT0gYnlQd3IpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBiUmVzdWx0ID0gUkZiUmF3U2V0UG93ZXIocERldmljZSwgYnlQd3IsIHVSQVRFKTsKIC8vICAgIH0KLSAgICBpZiAoYlJlc3VsdCA9PSBUUlVFKSB7CisgICAgaWYgKGJSZXN1bHQgPT0gdHJ1ZSkgewogICAgICAgIHBEZXZpY2UtPmJ5Q3VyUHdyID0gYnlQd3I7CiAgICAgfQogICAgIHJldHVybiBiUmVzdWx0OwpAQCAtMTEzMSwyMSArMTEzMSwyMSBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZWVkZWQ7IEZBTFNFIGlmIGZhaWxlZC4KKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZWVkZWQ7IGZhbHNlIGlmIGZhaWxlZC4KICAqCiAgKi8KIAotQk9PTCBSRmJSYXdTZXRQb3dlciAoCitib29sIFJGYlJhd1NldFBvd2VyICgKICAgICBQU0RldmljZSAgcERldmljZSwKLSAgICBCWVRFICAgICAgYnlQd3IsCi0gICAgVUlOVCAgICAgIHVSQVRFCisgICAgdW5zaWduZWQgY2hhciBieVB3ciwKKyAgICB1bnNpZ25lZCBpbnQgdVJBVEUKICAgICApCiB7Ci1CT09MICAgIGJSZXN1bHQgPSBUUlVFOwotRFdPUkQgICBkd01heDcyMzBQd3IgPSAwOworYm9vbCBiUmVzdWx0ID0gdHJ1ZTsKK3Vuc2lnbmVkIGxvbmcgZHdNYXg3MjMwUHdyID0gMDsKIAogICAgIGlmIChieVB3ciA+PSAgcERldmljZS0+YnlNYXhQd3JMZXZlbCkgewotICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgfQogICAgIHN3aXRjaCAocERldmljZS0+YnlSRlR5cGUpIHsKIApAQCAtMTIwNCwxNCArMTIwNCwxNCBAQAogdm9pZAogUkZ2UlNTSVRvZEJtICgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIEJZVEUgICAgIGJ5Q3VyclJTU0ksCisgICAgdW5zaWduZWQgY2hhciBieUN1cnJSU1NJLAogICAgIGxvbmcgKiAgICBwbGRCbQogICAgICkKIHsKLSAgICBCWVRFIGJ5SWR4ID0gKCgoYnlDdXJyUlNTSSAmIDB4QzApID4+IDYpICYgMHgwMyk7Ci0gICAgTE9ORyBiID0gKGJ5Q3VyclJTU0kgJiAweDNGKTsKLSAgICBMT05HIGEgPSAwOwotICAgIEJZVEUgYWJ5QUlST0hBUkZbNF0gPSB7MCwgMTgsIDAsIDQwfTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5SWR4ID0gKCgoYnlDdXJyUlNTSSAmIDB4QzApID4+IDYpICYgMHgwMyk7CisgICAgbG9uZyBiID0gKGJ5Q3VyclJTU0kgJiAweDNGKTsKKyAgICBsb25nIGEgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5QUlST0hBUkZbNF0gPSB7MCwgMTgsIDAsIDQwfTsKIAogICAgIHN3aXRjaCAocERldmljZS0+YnlSRlR5cGUpIHsKICAgICAgICAgY2FzZSBSRl9BSVJPSEE6CkBAIC0xMjMyLDExICsxMjMyLDExIEBACiAKIC8vIFBvc3QgcHJvY2Vzc2luZyBmb3IgdGhlIDExYi9nIGFuZCAxMWEuCiAvLyBmb3Igc2F2ZSB0aW1lIG9uIGNoYW5naW5nIFJlZzIsMyw1LDcsMTAsMTIsMTUKLUJPT0wgUkZiQUw3MjMwU2VsZWN0Q2hhbm5lbFBvc3RQcm9jZXNzIChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlPbGRDaGFubmVsLCBCWVRFIGJ5TmV3Q2hhbm5lbCkKK2Jvb2wgUkZiQUw3MjMwU2VsZWN0Q2hhbm5lbFBvc3RQcm9jZXNzICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5T2xkQ2hhbm5lbCwgdW5zaWduZWQgY2hhciBieU5ld0NoYW5uZWwpCiB7Ci0gICAgQk9PTCAgICBiUmVzdWx0OworICAgIGJvb2wgYlJlc3VsdDsKIAotICAgIGJSZXN1bHQgPSBUUlVFOworICAgIGJSZXN1bHQgPSB0cnVlOwogCiAgICAgLy8gaWYgY2hhbmdlIGJldHdlZW4gMTEgYi9nIGFuZCAxMWEgbmVlZCB0byB1cGRhdGUgdGhlIGZvbGxvd2luZyByZWdpc3RlcgogICAgIC8vIENoYW5uZWwgSW5kZXggMX4xNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5oCmluZGV4IDI1ZGZjNzkuLjFmOGQ4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmgKQEAgLTc2LDI4ICs3NiwyOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CT09MIElGUkZiV3JpdGVFbWJlZGVkKERXT1JEX1BUUiBkd0lvQmFzZSwgRFdPUkQgZHdEYXRhKTsKLUJPT0wgUkZiU2VsZWN0Q2hhbm5lbChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlSRlR5cGUsIEJZVEUgYnlDaGFubmVsKTsKLUJPT0wgUkZiSW5pdCAoCitib29sIElGUkZiV3JpdGVFbWJlZGVkKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgZHdEYXRhKTsKK2Jvb2wgUkZiU2VsZWN0Q2hhbm5lbCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UkZUeXBlLCB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbCk7Citib29sIFJGYkluaXQgKAogICAgIFBTRGV2aWNlICBwRGV2aWNlCiAgICAgKTsKLUJPT0wgUkZ2V3JpdGVXYWtlUHJvZ1N5bihEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlSRlR5cGUsIFVJTlQgdUNoYW5uZWwpOwotQk9PTCBSRmJTZXRQb3dlcihQU0RldmljZSBwRGV2aWNlLCBVSU5UIHVSQVRFLCBVSU5UIHVDSCk7Ci1CT09MIFJGYlJhd1NldFBvd2VyKAorYm9vbCBSRnZXcml0ZVdha2VQcm9nU3luKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlSRlR5cGUsIHVuc2lnbmVkIGludCB1Q2hhbm5lbCk7Citib29sIFJGYlNldFBvd2VyKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGludCB1UkFURSwgdW5zaWduZWQgaW50IHVDSCk7Citib29sIFJGYlJhd1NldFBvd2VyKAogICAgIFBTRGV2aWNlICBwRGV2aWNlLAotICAgIEJZVEUgICAgICBieVB3ciwKLSAgICBVSU5UICAgICAgdVJBVEUKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UHdyLAorICAgIHVuc2lnbmVkIGludCB1UkFURQogICAgICk7CiAKIHZvaWQKIFJGdlJTU0lUb2RCbSgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIEJZVEUgICAgIGJ5Q3VyclJTU0ksCisgICAgdW5zaWduZWQgY2hhciBieUN1cnJSU1NJLAogICAgIGxvbmcgICAgKnBsZEJtCiAgICAgKTsKIAogLy97eyBSb2JlcnRZdTogMjAwNTAxMDQKLUJPT0wgUkZiQUw3MjMwU2VsZWN0Q2hhbm5lbFBvc3RQcm9jZXNzKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieU9sZENoYW5uZWwsIEJZVEUgYnlOZXdDaGFubmVsKTsKK2Jvb2wgUkZiQUw3MjMwU2VsZWN0Q2hhbm5lbFBvc3RQcm9jZXNzKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlPbGRDaGFubmVsLCB1bnNpZ25lZCBjaGFyIGJ5TmV3Q2hhbm5lbCk7CiAvL319IFJvYmVydFl1CiAKICNlbmRpZiAvLyBfX1JGX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwppbmRleCBhMDQ0NWMzLi5jOTIwY2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwpAQCAtODAsMTYgKzgwLDE2IEBACiAjZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYgICAgLy8gaWYgcGFja2V0IHNpemUgPCAyNTYgLT4gaW4tZGlyZWN0IHNlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwYWNrZXQgc2l6ZSA+PSAyNTYgLT4gZGlyZWN0IHNlbmQKIAotY29uc3QgV09SRCB3VGltZVN0YW1wT2ZmWzJdW01BWF9SQVRFXSA9IHsKK2NvbnN0IHVuc2lnbmVkIHNob3J0IHdUaW1lU3RhbXBPZmZbMl1bTUFYX1JBVEVdID0gewogICAgICAgICB7Mzg0LCAyODgsIDIyNiwgMjA5LCA1NCwgNDMsIDM3LCAzMSwgMjgsIDI1LCAyNCwgMjN9LCAvLyBMb25nIFByZWFtYmxlCiAgICAgICAgIHszODQsIDE5MiwgMTMwLCAxMTMsIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8vIFNob3J0IFByZWFtYmxlCiAgICAgfTsKIAotY29uc3QgV09SRCB3RkJfT3B0MFsyXVs1XSA9IHsKK2NvbnN0IHVuc2lnbmVkIHNob3J0IHdGQl9PcHQwWzJdWzVdID0gewogICAgICAgICB7UkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8zNk0sIFJBVEVfNDhNfSwgLy8gZmFsbGJhY2tfcmF0ZTAKICAgICAgICAge1JBVEVfMTJNLCBSQVRFXzEyTSwgUkFURV8xOE0sIFJBVEVfMjRNLCBSQVRFXzM2TX0sIC8vIGZhbGxiYWNrX3JhdGUxCiAgICAgfTsKLWNvbnN0IFdPUkQgd0ZCX09wdDFbMl1bNV0gPSB7Citjb25zdCB1bnNpZ25lZCBzaG9ydCB3RkJfT3B0MVsyXVs1XSA9IHsKICAgICAgICAge1JBVEVfMTJNLCBSQVRFXzE4TSwgUkFURV8yNE0sIFJBVEVfMjRNLCBSQVRFXzM2TX0sIC8vIGZhbGxiYWNrX3JhdGUwCiAgICAgICAgIHtSQVRFXzZNICwgUkFURV82TSwgIFJBVEVfMTJNLCBSQVRFXzEyTSwgUkFURV8xOE19LCAvLyBmYWxsYmFja19yYXRlMQogICAgIH07CkBAIC0xMTgsMTIgKzExOCwxMiBAQAogdm9pZAogc192RmlsbFR4S2V5KAogICAgIFBTRGV2aWNlICAgcERldmljZSwKLSAgICBQQllURSAgICAgIHBieUJ1ZiwKLSAgICBQQllURSAgICAgIHBieUlWSGVhZCwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWYsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5SVZIZWFkLAogICAgIFBTS2V5SXRlbSAgcFRyYW5zbWl0S2V5LAotICAgIFBCWVRFICAgICAgcGJ5SGRyQnVmLAotICAgIFdPUkQgICAgICAgd1BheWxvYWRMZW4sCi0gICAgUEJZVEUgICAgICBwTUlDSERSCisgICAgdW5zaWduZWQgY2hhciAqcGJ5SGRyQnVmLAorICAgIHVuc2lnbmVkIHNob3J0IHdQYXlsb2FkTGVuLAorICAgIHVuc2lnbmVkIGNoYXIgKnBNSUNIRFIKICAgICApOwogCiAKQEAgLTEzMiw3NiArMTMyLDY1IEBACiB2b2lkCiBzX3ZGaWxsUlRTSGVhZCgKICAgICBQU0RldmljZSAgICAgICAgIHBEZXZpY2UsCi0gICAgQllURSAgICAgICAgICAgICBieVBrdFR5cGUsCisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCiAgICAgdm9pZCAqICAgICAgICAgICBwdlJUUywKLSAgICBVSU5UICAgICAgICAgICAgIGNiRnJhbWVMZW5ndGgsCi0gICAgQk9PTCAgICAgICAgICAgICBiTmVlZEFjaywKLSAgICBCT09MICAgICAgICAgICAgIGJEaXNDUkMsCisgICAgdW5zaWduZWQgaW50CWNiRnJhbWVMZW5ndGgsCisgICAgYm9vbCBiTmVlZEFjaywKKyAgICBib29sIGJEaXNDUkMsCiAgICAgUFNFdGhlcm5ldEhlYWRlciBwc0V0aEhlYWRlciwKLSAgICBXT1JEICAgICAgICAgICAgIHdDdXJyZW50UmF0ZSwKLSAgICBCWVRFICAgICAgICAgICAgIGJ5RkJPcHRpb24KKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VycmVudFJhdGUsCisgICAgdW5zaWduZWQgY2hhciBieUZCT3B0aW9uCiAgICAgKTsKIAogc3RhdGljCiB2b2lkCiBzX3ZHZW5lcmF0ZVR4UGFyYW1ldGVyKAogICAgIFBTRGV2aWNlICAgICAgICAgcERldmljZSwKLSAgICBCWVRFICAgICAgICAgICAgYnlQa3RUeXBlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAogICAgIHZvaWQgKiAgICAgICAgICAgcFR4QnVmSGVhZCwKICAgICB2b2lkICogICAgICAgICAgIHB2UnJ2VGltZSwKICAgICB2b2lkICogICAgICAgICAgIHB2UlRTLAogICAgIHZvaWQgKiAgICAgICAgICAgcHZDVFMsCi0gICAgVUlOVCAgICAgICAgICAgICBjYkZyYW1lU2l6ZSwKLSAgICBCT09MICAgICAgICAgICAgIGJOZWVkQUNLLAotICAgIFVJTlQgICAgICAgICAgICAgdURNQUlkeCwKKyAgICB1bnNpZ25lZCBpbnQJY2JGcmFtZVNpemUsCisgICAgYm9vbCBiTmVlZEFDSywKKyAgICB1bnNpZ25lZCBpbnQJdURNQUlkeCwKICAgICBQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyLAotICAgIFdPUkQgICAgICAgICAgICAgd0N1cnJlbnRSYXRlCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlCiAgICAgKTsKIAogCiAKIHN0YXRpYyB2b2lkIHNfdkZpbGxGcmFnUGFyYW1ldGVyKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgUEJZVEUgICAgcGJ5QnVmZmVyLAotICAgIFVJTlQgICAgIHVUeFR5cGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5QnVmZmVyLAorICAgIHVuc2lnbmVkIGludAl1VHhUeXBlLAogICAgIHZvaWQgKiAgIHB2dGRDdXJyLAotICAgIFdPUkQgICAgIHdGcmFnVHlwZSwKLSAgICBVSU5UICAgICBjYlJlcUNvdW50CisgICAgdW5zaWduZWQgc2hvcnQgd0ZyYWdUeXBlLAorICAgIHVuc2lnbmVkIGludAljYlJlcUNvdW50CiAgICAgKTsKIAogCi1zdGF0aWMKLVVJTlQKLXNfY2JGaWxsVHhCdWZIZWFkICgKLSAgICBQU0RldmljZSAgICAgICAgIHBEZXZpY2UsCi0gICAgQllURSAgICAgICAgICAgICBieVBrdFR5cGUsCi0gICAgUEJZVEUgICAgICAgICAgICBwYnlUeEJ1ZmZlckFkZHIsCi0gICAgVUlOVCAgICAgICAgICAgICBjYkZyYW1lQm9keVNpemUsCi0gICAgVUlOVCAgICAgICAgICAgICB1RE1BSWR4LAotICAgIFBTVHhEZXNjICAgICAgICAgcEhlYWRURCwKLSAgICBQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyLAotICAgIFBCWVRFICAgICAgICAgICAgcFBhY2tldCwKLSAgICBCT09MICAgICAgICAgICAgIGJOZWVkRW5jcnlwdCwKLSAgICBQU0tleUl0ZW0gICAgICAgIHBUcmFuc21pdEtleSwKLSAgICBVSU5UICAgICAgICAgICAgIHVOb2RlSW5kZXgsCi0gICAgUFVJTlQgICAgICAgICAgICBwdU1BQ2ZyYWdOdW0KLSAgICApOworc3RhdGljIHVuc2lnbmVkIGludAorc19jYkZpbGxUeEJ1ZkhlYWQoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgY2hhciBieVBrdFR5cGUsIHVuc2lnbmVkIGNoYXIgKnBieVR4QnVmZmVyQWRkciwKKwl1bnNpZ25lZCBpbnQgY2JGcmFtZUJvZHlTaXplLCB1bnNpZ25lZCBpbnQgdURNQUlkeCwgUFNUeERlc2MgcEhlYWRURCwKKwlQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyLCB1bnNpZ25lZCBjaGFyICpwUGFja2V0LCBib29sIGJOZWVkRW5jcnlwdCwKKwlQU0tleUl0ZW0gcFRyYW5zbWl0S2V5LCB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleCwgdW5zaWduZWQgaW50ICpwdU1BQ2ZyYWdOdW0pOwogCiAKIHN0YXRpYwotVUlOVAordW5zaWduZWQgaW50CiBzX3VGaWxsRGF0YUhlYWQgKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgQllURSAgICAgYnlQa3RUeXBlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAogICAgIHZvaWQgKiAgIHBUeERhdGFIZWFkLAotICAgIFVJTlQgICAgIGNiRnJhbWVMZW5ndGgsCi0gICAgVUlOVCAgICAgdURNQUlkeCwKLSAgICBCT09MICAgICBiTmVlZEFjaywKLSAgICBVSU5UICAgICB1RnJhZ0lkeCwKLSAgICBVSU5UICAgICBjYkxhc3RGcmFnbWVudFNpemUsCi0gICAgVUlOVCAgICAgdU1BQ2ZyYWdOdW0sCi0gICAgQllURSAgICAgYnlGQk9wdGlvbiwKLSAgICBXT1JEICAgICB3Q3VycmVudFJhdGUKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKyAgICB1bnNpZ25lZCBpbnQgdURNQUlkeCwKKyAgICBib29sIGJOZWVkQWNrLAorICAgIHVuc2lnbmVkIGludCB1RnJhZ0lkeCwKKyAgICB1bnNpZ25lZCBpbnQgY2JMYXN0RnJhZ21lbnRTaXplLAorICAgIHVuc2lnbmVkIGludCB1TUFDZnJhZ051bSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24sCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlCiAgICAgKTsKIAogCkBAIC0yMTMsMjAgKzIwMiwyMCBAQAogdm9pZAogc192RmlsbFR4S2V5ICgKICAgICBQU0RldmljZSAgIHBEZXZpY2UsCi0gICAgUEJZVEUgICAgICBwYnlCdWYsCi0gICAgUEJZVEUgICAgICBwYnlJVkhlYWQsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5QnVmLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUlWSGVhZCwKICAgICBQU0tleUl0ZW0gIHBUcmFuc21pdEtleSwKLSAgICBQQllURSAgICAgIHBieUhkckJ1ZiwKLSAgICBXT1JEICAgICAgIHdQYXlsb2FkTGVuLAotICAgIFBCWVRFICAgICAgcE1JQ0hEUgorICAgIHVuc2lnbmVkIGNoYXIgKnBieUhkckJ1ZiwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UGF5bG9hZExlbiwKKyAgICB1bnNpZ25lZCBjaGFyICpwTUlDSERSCiAgICAgKQogewotICAgIFBEV09SRCAgICAgICAgICBwZHdJViA9IChQRFdPUkQpIHBieUlWSGVhZDsKLSAgICBQRFdPUkQgICAgICAgICAgcGR3RXh0SVYgPSAoUERXT1JEKSAoKFBCWVRFKXBieUlWSGVhZCs0KTsKLSAgICBXT1JEICAgICAgICAgICAgd1ZhbHVlOworICAgIHVuc2lnbmVkIGxvbmcgKnBkd0lWID0gKHVuc2lnbmVkIGxvbmcgKikgcGJ5SVZIZWFkOworICAgIHVuc2lnbmVkIGxvbmcgKnBkd0V4dElWID0gKHVuc2lnbmVkIGxvbmcgKikgKCh1bnNpZ25lZCBjaGFyICopcGJ5SVZIZWFkKzQpOworICAgIHVuc2lnbmVkIHNob3J0IHdWYWx1ZTsKICAgICBQUzgwMl8xMUhlYWRlciAgcE1BQ0hlYWRlciA9IChQUzgwMl8xMUhlYWRlcilwYnlIZHJCdWY7Ci0gICAgRFdPUkQgICAgICAgICAgIGR3UmV2SVZDb3VudGVyOwotICAgIEJZVEUgICAgICAgICAgICBieUtleUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGR3UmV2SVZDb3VudGVyOworICAgIHVuc2lnbmVkIGNoYXIgYnlLZXlJbmRleCA9IDA7CiAKIAogCkBAIC0yNDAsMTMgKzIyOSwxMyBAQAogCiAgICAgaWYgKHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX1dFUCkgewogICAgICAgICBpZiAocFRyYW5zbWl0S2V5LT51S2V5TGVuZ3RoID09IFdMQU5fV0VQMjMyX0tFWUxFTiApewotICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPmFieVBSTkcsIChQQllURSkmKGR3UmV2SVZDb3VudGVyKSwgMyk7CisgICAgICAgICAgICBtZW1jcHkocERldmljZS0+YWJ5UFJORywgKHVuc2lnbmVkIGNoYXIgKikmKGR3UmV2SVZDb3VudGVyKSwgMyk7CiAgICAgICAgICAgICBtZW1jcHkocERldmljZS0+YWJ5UFJORyszLCBwVHJhbnNtaXRLZXktPmFieUtleSwgcFRyYW5zbWl0S2V5LT51S2V5TGVuZ3RoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWNweShwYnlCdWYsIChQQllURSkmKGR3UmV2SVZDb3VudGVyKSwgMyk7CisgICAgICAgICAgICBtZW1jcHkocGJ5QnVmLCAodW5zaWduZWQgY2hhciAqKSYoZHdSZXZJVkNvdW50ZXIpLCAzKTsKICAgICAgICAgICAgIG1lbWNweShwYnlCdWYrMywgcFRyYW5zbWl0S2V5LT5hYnlLZXksIHBUcmFuc21pdEtleS0+dUtleUxlbmd0aCk7CiAgICAgICAgICAgICBpZihwVHJhbnNtaXRLZXktPnVLZXlMZW5ndGggPT0gV0xBTl9XRVA0MF9LRVlMRU4pIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkocGJ5QnVmKzgsIChQQllURSkmKGR3UmV2SVZDb3VudGVyKSwgMyk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBieUJ1Zis4LCAodW5zaWduZWQgY2hhciAqKSYoZHdSZXZJVkNvdW50ZXIpLCAzKTsKICAgICAgICAgICAgICAgICBtZW1jcHkocGJ5QnVmKzExLCBwVHJhbnNtaXRLZXktPmFieUtleSwgcFRyYW5zbWl0S2V5LT51S2V5TGVuZ3RoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbWNweShwRGV2aWNlLT5hYnlQUk5HLCBwYnlCdWYsIDE2KTsKQEAgLTI3MCw3ICsyNTksNyBAQAogICAgICAgICAvLyBNYWtlIElWCiAgICAgICAgIG1lbWNweShwZHdJViwgcERldmljZS0+YWJ5UFJORywgMyk7CiAKLSAgICAgICAgKihwYnlJVkhlYWQrMykgPSAoQllURSkoKChieUtleUluZGV4IDw8IDYpICYgMHhjMCkgfCAweDIwKTsgLy8gMHgyMCBpcyBFeHRJVgorICAgICAgICAqKHBieUlWSGVhZCszKSA9ICh1bnNpZ25lZCBjaGFyKSgoKGJ5S2V5SW5kZXggPDwgNikgJiAweGMwKSB8IDB4MjApOyAvLyAweDIwIGlzIEV4dElWCiAgICAgICAgIC8vIEFwcGVuZCBJViZFeHRJViBhZnRlciBNYWMgSGVhZGVyCiAgICAgICAgICpwZHdFeHRJViA9IGNwdV90b19sZTMyKHBUcmFuc21pdEtleS0+ZHdUU0M0N18xNik7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8idkZpbGxUeEtleSgpLS0tLSBwZHdFeHRJVjogJWx4XG4iLCAqcGR3RXh0SVYpOwpAQCAtMjg0LDMzICsyNzMsMzMgQEAKIAogICAgICAgICAvLyBNYWtlIElWCiAgICAgICAgICpwZHdJViA9IDA7Ci0gICAgICAgICoocGJ5SVZIZWFkKzMpID0gKEJZVEUpKCgoYnlLZXlJbmRleCA8PCA2KSAmIDB4YzApIHwgMHgyMCk7IC8vIDB4MjAgaXMgRXh0SVYKLSAgICAgICAgKnBkd0lWIHw9IGNwdV90b19sZTE2KChXT1JEKShwVHJhbnNtaXRLZXktPndUU0MxNV8wKSk7CisgICAgICAgICoocGJ5SVZIZWFkKzMpID0gKHVuc2lnbmVkIGNoYXIpKCgoYnlLZXlJbmRleCA8PCA2KSAmIDB4YzApIHwgMHgyMCk7IC8vIDB4MjAgaXMgRXh0SVYKKyAgICAgICAgKnBkd0lWIHw9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydCkocFRyYW5zbWl0S2V5LT53VFNDMTVfMCkpOwogICAgICAgICAvL0FwcGVuZCBJViZFeHRJViBhZnRlciBNYWMgSGVhZGVyCiAgICAgICAgICpwZHdFeHRJViA9IGNwdV90b19sZTMyKHBUcmFuc21pdEtleS0+ZHdUU0M0N18xNik7CiAKICAgICAgICAgLy9GaWxsIE1JQ0hEUjAKICAgICAgICAgKnBNSUNIRFIgPSAweDU5OwotICAgICAgICAqKChQQllURSkocE1JQ0hEUisxKSkgPSAwOyAvLyBUeFByaW9yaXR5CisgICAgICAgICooKHVuc2lnbmVkIGNoYXIgKikocE1JQ0hEUisxKSkgPSAwOyAvLyBUeFByaW9yaXR5CiAgICAgICAgIG1lbWNweShwTUlDSERSKzIsICYocE1BQ0hlYWRlci0+YWJ5QWRkcjJbMF0pLCA2KTsKLSAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrOCkpID0gSElCWVRFKEhJV09SRChwVHJhbnNtaXRLZXktPmR3VFNDNDdfMTYpKTsKLSAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrOSkpID0gTE9CWVRFKEhJV09SRChwVHJhbnNtaXRLZXktPmR3VFNDNDdfMTYpKTsKLSAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrMTApKSA9IEhJQllURShMT1dPUkQocFRyYW5zbWl0S2V5LT5kd1RTQzQ3XzE2KSk7Ci0gICAgICAgICooKFBCWVRFKShwTUlDSERSKzExKSkgPSBMT0JZVEUoTE9XT1JEKHBUcmFuc21pdEtleS0+ZHdUU0M0N18xNikpOwotICAgICAgICAqKChQQllURSkocE1JQ0hEUisxMikpID0gSElCWVRFKHBUcmFuc21pdEtleS0+d1RTQzE1XzApOwotICAgICAgICAqKChQQllURSkocE1JQ0hEUisxMykpID0gTE9CWVRFKHBUcmFuc21pdEtleS0+d1RTQzE1XzApOwotICAgICAgICAqKChQQllURSkocE1JQ0hEUisxNCkpID0gSElCWVRFKHdQYXlsb2FkTGVuKTsKLSAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrMTUpKSA9IExPQllURSh3UGF5bG9hZExlbik7CisgICAgICAgICooKHVuc2lnbmVkIGNoYXIgKikocE1JQ0hEUis4KSkgPSBISUJZVEUoSElXT1JEKHBUcmFuc21pdEtleS0+ZHdUU0M0N18xNikpOworICAgICAgICAqKCh1bnNpZ25lZCBjaGFyICopKHBNSUNIRFIrOSkpID0gTE9CWVRFKEhJV09SRChwVHJhbnNtaXRLZXktPmR3VFNDNDdfMTYpKTsKKyAgICAgICAgKigodW5zaWduZWQgY2hhciAqKShwTUlDSERSKzEwKSkgPSBISUJZVEUoTE9XT1JEKHBUcmFuc21pdEtleS0+ZHdUU0M0N18xNikpOworICAgICAgICAqKCh1bnNpZ25lZCBjaGFyICopKHBNSUNIRFIrMTEpKSA9IExPQllURShMT1dPUkQocFRyYW5zbWl0S2V5LT5kd1RTQzQ3XzE2KSk7CisgICAgICAgICooKHVuc2lnbmVkIGNoYXIgKikocE1JQ0hEUisxMikpID0gSElCWVRFKHBUcmFuc21pdEtleS0+d1RTQzE1XzApOworICAgICAgICAqKCh1bnNpZ25lZCBjaGFyICopKHBNSUNIRFIrMTMpKSA9IExPQllURShwVHJhbnNtaXRLZXktPndUU0MxNV8wKTsKKyAgICAgICAgKigodW5zaWduZWQgY2hhciAqKShwTUlDSERSKzE0KSkgPSBISUJZVEUod1BheWxvYWRMZW4pOworICAgICAgICAqKCh1bnNpZ25lZCBjaGFyICopKHBNSUNIRFIrMTUpKSA9IExPQllURSh3UGF5bG9hZExlbik7CiAKICAgICAgICAgLy9GaWxsIE1JQ0hEUjEKLSAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrMTYpKSA9IDA7IC8vIEhMRU5bMTU6OF0KKyAgICAgICAgKigodW5zaWduZWQgY2hhciAqKShwTUlDSERSKzE2KSkgPSAwOyAvLyBITEVOWzE1OjhdCiAgICAgICAgIGlmIChwRGV2aWNlLT5iTG9uZ0hlYWRlcikgewotICAgICAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrMTcpKSA9IDI4OyAvLyBITEVOWzc6MF0KKyAgICAgICAgICAgICooKHVuc2lnbmVkIGNoYXIgKikocE1JQ0hEUisxNykpID0gMjg7IC8vIEhMRU5bNzowXQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKigoUEJZVEUpKHBNSUNIRFIrMTcpKSA9IDIyOyAvLyBITEVOWzc6MF0KKyAgICAgICAgICAgICooKHVuc2lnbmVkIGNoYXIgKikocE1JQ0hEUisxNykpID0gMjI7IC8vIEhMRU5bNzowXQogICAgICAgICB9CiAgICAgICAgIHdWYWx1ZSA9IGNwdV90b19sZTE2KHBNQUNIZWFkZXItPndGcmFtZUN0bCAmIDB4Qzc4Rik7Ci0gICAgICAgIG1lbWNweShwTUlDSERSKzE4LCAoUEJZVEUpJndWYWx1ZSwgMik7IC8vIE1TS0ZSQUNUTAorICAgICAgICBtZW1jcHkocE1JQ0hEUisxOCwgKHVuc2lnbmVkIGNoYXIgKikmd1ZhbHVlLCAyKTsgLy8gTVNLRlJBQ1RMCiAgICAgICAgIG1lbWNweShwTUlDSERSKzIwLCAmKHBNQUNIZWFkZXItPmFieUFkZHIxWzBdKSwgNik7CiAgICAgICAgIG1lbWNweShwTUlDSERSKzI2LCAmKHBNQUNIZWFkZXItPmFieUFkZHIyWzBdKSwgNik7CiAKQEAgLTMxOSw3ICszMDgsNyBAQAogICAgICAgICB3VmFsdWUgPSBwTUFDSGVhZGVyLT53U2VxQ3RsOwogICAgICAgICB3VmFsdWUgJj0gMHgwMDBGOwogICAgICAgICB3VmFsdWUgPSBjcHVfdG9fbGUxNih3VmFsdWUpOwotICAgICAgICBtZW1jcHkocE1JQ0hEUiszOCwgKFBCWVRFKSZ3VmFsdWUsIDIpOyAvLyBNU0tTRVFDVEwKKyAgICAgICAgbWVtY3B5KHBNSUNIRFIrMzgsICh1bnNpZ25lZCBjaGFyICopJndWYWx1ZSwgMik7IC8vIE1TS1NFUUNUTAogICAgICAgICBpZiAocERldmljZS0+YkxvbmdIZWFkZXIpIHsKICAgICAgICAgICAgIG1lbWNweShwTUlDSERSKzQwLCAmKHBNQUNIZWFkZXItPmFieUFkZHI0WzBdKSwgNik7CiAgICAgICAgIH0KQEAgLTMzMiwxMyArMzIxLDEzIEBACiBzX3ZTV2VuY3J5cHRpb24gKAogICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZSwKICAgICBQU0tleUl0ZW0gICAgICAgICAgIHBUcmFuc21pdEtleSwKLSAgICBQQllURSAgICAgICAgICAgICAgIHBieVBheWxvYWRIZWFkLAotICAgIFdPUkQgICAgICAgICAgICAgICAgd1BheWxvYWRTaXplCisgICAgdW5zaWduZWQgY2hhciAqcGJ5UGF5bG9hZEhlYWQsCisgICAgdW5zaWduZWQgc2hvcnQgd1BheWxvYWRTaXplCiAgICAgKQogewotICAgIFVJTlQgICBjYklDVmxlbiA9IDQ7Ci0gICAgRFdPUkQgIGR3SUNWID0gMHhGRkZGRkZGRkw7Ci0gICAgUERXT1JEIHBkd0lDVjsKKyAgICB1bnNpZ25lZCBpbnQgY2JJQ1ZsZW4gPSA0OworICAgIHVuc2lnbmVkIGxvbmcgZHdJQ1YgPSAweEZGRkZGRkZGTDsKKyAgICB1bnNpZ25lZCBsb25nICpwZHdJQ1Y7CiAKICAgICBpZiAocFRyYW5zbWl0S2V5ID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKQEAgLTM0Nyw3ICszMzYsNyBAQAogICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgIC8vIEFwcGVuZCBJQ1YgYWZ0ZXIgcGF5bG9hZAogICAgICAgICBkd0lDViA9IENSQ2R3R2V0Q3JjMzJFeChwYnlQYXlsb2FkSGVhZCwgd1BheWxvYWRTaXplLCBkd0lDVik7Ly9JQ1YoUGF5bG9hZCkKLSAgICAgICAgcGR3SUNWID0gKFBEV09SRCkocGJ5UGF5bG9hZEhlYWQgKyB3UGF5bG9hZFNpemUpOworICAgICAgICBwZHdJQ1YgPSAodW5zaWduZWQgbG9uZyAqKShwYnlQYXlsb2FkSGVhZCArIHdQYXlsb2FkU2l6ZSk7CiAgICAgICAgIC8vIGZpbmFsbHksIHdlIG11c3QgaW52ZXJ0IGR3Q1JDIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIKICAgICAgICAgKnBkd0lDViA9IGNwdV90b19sZTMyKH5kd0lDVik7CiAgICAgICAgIC8vIFJDNCBlbmNyeXB0aW9uCkBAIC0zNTgsNyArMzQ3LDcgQEAKICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAvL0FwcGVuZCBJQ1YgYWZ0ZXIgcGF5bG9hZAogICAgICAgICBkd0lDViA9IENSQ2R3R2V0Q3JjMzJFeChwYnlQYXlsb2FkSGVhZCwgd1BheWxvYWRTaXplLCBkd0lDVik7Ly9JQ1YoUGF5bG9hZCkKLSAgICAgICAgcGR3SUNWID0gKFBEV09SRCkocGJ5UGF5bG9hZEhlYWQgKyB3UGF5bG9hZFNpemUpOworICAgICAgICBwZHdJQ1YgPSAodW5zaWduZWQgbG9uZyAqKShwYnlQYXlsb2FkSGVhZCArIHdQYXlsb2FkU2l6ZSk7CiAgICAgICAgIC8vIGZpbmFsbHksIHdlIG11c3QgaW52ZXJ0IGR3Q1JDIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIKICAgICAgICAgKnBkd0lDViA9IGNwdV90b19sZTMyKH5kd0lDVik7CiAgICAgICAgIC8vIFJDNCBlbmNyeXB0aW9uCkBAIC0zNzcsMjUgKzM2NiwyNSBAQAogICAgICAgICAgICAgIFBLX1RZUEVfMTFHQSAgICAzCiAqLwogc3RhdGljCi1VSU5UCit1bnNpZ25lZCBpbnQKIHNfdUdldFR4UnN2VGltZSAoCiAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBCWVRFICAgICBieVBrdFR5cGUsCi0gICAgVUlOVCAgICAgY2JGcmFtZUxlbmd0aCwKLSAgICBXT1JEICAgICB3UmF0ZSwKLSAgICBCT09MICAgICBiTmVlZEFjaworICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoLAorICAgIHVuc2lnbmVkIHNob3J0IHdSYXRlLAorICAgIGJvb2wgYk5lZWRBY2sKICAgICApCiB7Ci0gICAgVUlOVCB1RGF0YVRpbWUsIHVBY2tUaW1lOworICAgIHVuc2lnbmVkIGludCB1RGF0YVRpbWUsIHVBY2tUaW1lOwogCiAgICAgdURhdGFUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIGNiRnJhbWVMZW5ndGgsIHdSYXRlKTsKICNpZmRlZglQTElDRV9ERUJVRwogCS8vcHJpbnRrKCJzX3VHZXRUeFJzdlRpbWUgaXMgJWRcbiIsdURhdGFUaW1lKTsKICNlbmRpZgogICAgIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUIpIHsvL2xsYixDQ0sgbW9kZQotICAgICAgICB1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKFdPUkQpcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOworICAgICAgICB1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKICAgICB9IGVsc2Ugey8vMTFnIDIuNEcgT0ZETSBtb2RlICYgMTFhIDVHIE9GRE0gbW9kZQotICAgICAgICB1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKFdPUkQpcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKKyAgICAgICAgdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsICh1bnNpZ25lZCBzaG9ydClwRGV2aWNlLT5ieVRvcE9GRE1CYXNpY1JhdGUpOwogICAgIH0KIAogICAgIGlmIChiTmVlZEFjaykgewpAQCAtNDA4LDE2ICszOTcsMTYgQEAKIAogLy9ieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWgogc3RhdGljCi1VSU5UCit1bnNpZ25lZCBpbnQKIHNfdUdldFJUU0NUU1JzdlRpbWUgKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgQllURSBieVJUU1JzdlR5cGUsCi0gICAgQllURSBieVBrdFR5cGUsCi0gICAgVUlOVCBjYkZyYW1lTGVuZ3RoLAotICAgIFdPUkQgd0N1cnJlbnRSYXRlCisgICAgdW5zaWduZWQgY2hhciBieVJUU1JzdlR5cGUsCisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCisgICAgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgsCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlCiAgICAgKQogewotICAgIFVJTlQgdVJydlRpbWUgICwgdVJUU1RpbWUsIHVDVFNUaW1lLCB1QWNrVGltZSwgdURhdGFUaW1lOworICAgIHVuc2lnbmVkIGludCB1UnJ2VGltZSAgLCB1UlRTVGltZSwgdUNUU1RpbWUsIHVBY2tUaW1lLCB1RGF0YVRpbWU7CiAKICAgICB1UnJ2VGltZSA9IHVSVFNUaW1lID0gdUNUU1RpbWUgPSB1QWNrVGltZSA9IHVEYXRhVGltZSA9IDA7CiAKQEAgLTQ1MCwyMiArNDM5LDIyIEBACiAKIC8vYnlGcmVxVHlwZSAwOiA1R0h6LCAxOjIuNEdoegogc3RhdGljCi1VSU5UCit1bnNpZ25lZCBpbnQKIHNfdUdldERhdGFEdXJhdGlvbiAoCiAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBCWVRFICAgICBieUR1clR5cGUsCi0gICAgVUlOVCAgICAgY2JGcmFtZUxlbmd0aCwKLSAgICBCWVRFICAgICBieVBrdFR5cGUsCi0gICAgV09SRCAgICAgd1JhdGUsCi0gICAgQk9PTCAgICAgYk5lZWRBY2ssCi0gICAgVUlOVCAgICAgdUZyYWdJZHgsCi0gICAgVUlOVCAgICAgY2JMYXN0RnJhZ21lbnRTaXplLAotICAgIFVJTlQgICAgIHVNQUNmcmFnTnVtLAotICAgIEJZVEUgICAgIGJ5RkJPcHRpb24KKyAgICB1bnNpZ25lZCBjaGFyIGJ5RHVyVHlwZSwKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UGt0VHlwZSwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZSwKKyAgICBib29sIGJOZWVkQWNrLAorICAgIHVuc2lnbmVkIGludCB1RnJhZ0lkeCwKKyAgICB1bnNpZ25lZCBpbnQgY2JMYXN0RnJhZ21lbnRTaXplLAorICAgIHVuc2lnbmVkIGludCB1TUFDZnJhZ051bSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24KICAgICApCiB7Ci0gICAgQk9PTCBiTGFzdEZyYWcgPSAwOwotICAgIFVJTlQgdUFja1RpbWUgPTAsIHVOZXh0UGt0VGltZSA9IDA7CisgICAgYm9vbCBiTGFzdEZyYWcgPSAwOworICAgIHVuc2lnbmVkIGludCB1QWNrVGltZSA9MCwgdU5leHRQa3RUaW1lID0gMDsKIAogCiAKQEAgLTYxNCwyNSArNjAzLDI1IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotCUFTU0VSVChGQUxTRSk7CisJQVNTRVJUKGZhbHNlKTsKIAlyZXR1cm4gMDsKIH0KIAogCiAvL2J5RnJlcVR5cGU6IDA9PjVHSFogMT0+Mi40R0haCiBzdGF0aWMKLVVJTlQKK3Vuc2lnbmVkIGludAogc191R2V0UlRTQ1RTRHVyYXRpb24gKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgQllURSBieUR1clR5cGUsCi0gICAgVUlOVCBjYkZyYW1lTGVuZ3RoLAotICAgIEJZVEUgYnlQa3RUeXBlLAotICAgIFdPUkQgd1JhdGUsCi0gICAgQk9PTCBiTmVlZEFjaywKLSAgICBCWVRFIGJ5RkJPcHRpb24KKyAgICB1bnNpZ25lZCBjaGFyIGJ5RHVyVHlwZSwKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UGt0VHlwZSwKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZSwKKyAgICBib29sIGJOZWVkQWNrLAorICAgIHVuc2lnbmVkIGNoYXIgYnlGQk9wdGlvbgogICAgICkKIHsKLSAgICBVSU5UIHVDVFNUaW1lID0gMCwgdUR1clRpbWUgPSAwOworICAgIHVuc2lnbmVkIGludCB1Q1RTVGltZSA9IDAsIHVEdXJUaW1lID0gMDsKIAogCiAgICAgc3dpdGNoIChieUR1clR5cGUpIHsKQEAgLTcxOSwyMiArNzA4LDIyIEBACiAKIAogc3RhdGljCi1VSU5UCit1bnNpZ25lZCBpbnQKIHNfdUZpbGxEYXRhSGVhZCAoCiAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBCWVRFICAgICBieVBrdFR5cGUsCisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCiAgICAgdm9pZCAqICAgcFR4RGF0YUhlYWQsCi0gICAgVUlOVCAgICAgY2JGcmFtZUxlbmd0aCwKLSAgICBVSU5UICAgICB1RE1BSWR4LAotICAgIEJPT0wgICAgIGJOZWVkQWNrLAotICAgIFVJTlQgICAgIHVGcmFnSWR4LAotICAgIFVJTlQgICAgIGNiTGFzdEZyYWdtZW50U2l6ZSwKLSAgICBVSU5UICAgICB1TUFDZnJhZ051bSwKLSAgICBCWVRFICAgICBieUZCT3B0aW9uLAotICAgIFdPUkQgICAgIHdDdXJyZW50UmF0ZQorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoLAorICAgIHVuc2lnbmVkIGludCB1RE1BSWR4LAorICAgIGJvb2wgYk5lZWRBY2ssCisgICAgdW5zaWduZWQgaW50IHVGcmFnSWR4LAorICAgIHVuc2lnbmVkIGludCBjYkxhc3RGcmFnbWVudFNpemUsCisgICAgdW5zaWduZWQgaW50IHVNQUNmcmFnTnVtLAorICAgIHVuc2lnbmVkIGNoYXIgYnlGQk9wdGlvbiwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VycmVudFJhdGUKICAgICApCiB7Ci0gICAgV09SRCAgd0xlbiA9IDB4MDAwMDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TGVuID0gMHgwMDAwOwogCiAgICAgaWYgKHBUeERhdGFIZWFkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC03NDUsMTkgKzczNCwxOSBAQAogICAgICAgICAgICAgUFNUeERhdGFIZWFkX2cgcEJ1ZiA9IChQU1R4RGF0YUhlYWRfZylwVHhEYXRhSGVhZDsKICAgICAgICAgICAgIC8vR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGgKICAgICAgICAgICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIGNiRnJhbWVMZW5ndGgsIHdDdXJyZW50UmF0ZSwgYnlQa3RUeXBlLAotICAgICAgICAgICAgICAgIChQV09SRCkmKHdMZW4pLCAoUEJZVEUpJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9hKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9hKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9hKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2lnbmFsRmllbGRfYSkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGhfYSA9IGNwdV90b19sZTE2KHdMZW4pOwogICAgICAgICAgICAgQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgY2JGcmFtZUxlbmd0aCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIFBLX1RZUEVfMTFCLAotICAgICAgICAgICAgICAgIChQV09SRCkmKHdMZW4pLCAoUEJZVEUpJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9iKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9iKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9iKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2lnbmFsRmllbGRfYikKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGhfYiA9IGNwdV90b19sZTE2KHdMZW4pOwogICAgICAgICAgICAgLy9HZXQgRHVyYXRpb24gYW5kIFRpbWVTdGFtcAotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2EgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9BLCBjYkZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2EgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQSwgY2JGcmFtZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgdUZyYWdJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYkxhc3RGcmFnbWVudFNpemUsIHVNQUNmcmFnTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnlGQk9wdGlvbikpOyAvLzE6IDIuNEdIegotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2IgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9CLCBjYkZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2IgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQiwgY2JGcmFtZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX1RZUEVfMTFCLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZWVkQWNrLCB1RnJhZ0lkeCwgY2JMYXN0RnJhZ21lbnRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdU1BQ2ZyYWdOdW0sIGJ5RkJPcHRpb24pKTsgLy8xOiAyLjQKQEAgLTc3MSwyMSArNzYwLDIxIEBACiAgICAgICAgICAgICBQU1R4RGF0YUhlYWRfZ19GQiBwQnVmID0gKFBTVHhEYXRhSGVhZF9nX0ZCKXBUeERhdGFIZWFkOwogICAgICAgICAgICAgLy9HZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aAogICAgICAgICAgICAgQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgY2JGcmFtZUxlbmd0aCwgd0N1cnJlbnRSYXRlLCBieVBrdFR5cGUsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2EpLCAoUEJZVEUpJihwQnVmLT5ieVNpZ25hbEZpZWxkX2EpCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0ICopJih3TGVuKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2EpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9hKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHBCdWYtPndUcmFuc21pdExlbmd0aF9hID0gY3B1X3RvX2xlMTYod0xlbik7CiAgICAgICAgICAgICBCQnZDYWN1bGF0ZVBhcmFtZXRlcihwRGV2aWNlLCBjYkZyYW1lTGVuZ3RoLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgUEtfVFlQRV8xMUIsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2IpLCAoUEJZVEUpJihwQnVmLT5ieVNpZ25hbEZpZWxkX2IpCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0ICopJih3TGVuKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2IpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9iKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHBCdWYtPndUcmFuc21pdExlbmd0aF9iID0gY3B1X3RvX2xlMTYod0xlbik7CiAgICAgICAgICAgICAvL0dldCBEdXJhdGlvbiBhbmQgVGltZVN0YW1wCi0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0EsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKKyAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9hID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0EsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgdUZyYWdJZHgsIGNiTGFzdEZyYWdtZW50U2l6ZSwgdU1BQ2ZyYWdOdW0sIGJ5RkJPcHRpb24pKTsgLy8xOiAyLjRHSHoKLSAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9iID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQiwgY2JGcmFtZUxlbmd0aCwgUEtfVFlQRV8xMUIsCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYiA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9CLCBjYkZyYW1lTGVuZ3RoLCBQS19UWVBFXzExQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQWNrLCB1RnJhZ0lkeCwgY2JMYXN0RnJhZ21lbnRTaXplLCB1TUFDZnJhZ051bSwgYnlGQk9wdGlvbikpOyAvLzE6IDIuNEdIegotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2FfZjAgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9BX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYV9mMCA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9BX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIHVGcmFnSWR4LCBjYkxhc3RGcmFnbWVudFNpemUsIHVNQUNmcmFnTnVtLCBieUZCT3B0aW9uKSk7IC8vMTogMi40R0h6Ci0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYV9mMSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0FfRjEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKKyAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9hX2YxID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0FfRjEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgdUZyYWdJZHgsIGNiTGFzdEZyYWdtZW50U2l6ZSwgdU1BQ2ZyYWdOdW0sIGJ5RkJPcHRpb24pKTsgLy8xOiAyLjRHSHoKIAogICAgICAgICAgICAgcEJ1Zi0+d1RpbWVTdGFtcE9mZl9hID0gY3B1X3RvX2xlMTYod1RpbWVTdGFtcE9mZltwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSUyXVt3Q3VycmVudFJhdGUlTUFYX1JBVEVdKTsKQEAgLTgwMCwxNiArNzg5LDE2IEBACiAgICAgICAgICAgICBQU1R4RGF0YUhlYWRfYV9GQiBwQnVmID0gKFBTVHhEYXRhSGVhZF9hX0ZCKXBUeERhdGFIZWFkOwogICAgICAgICAgICAgLy9HZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aAogICAgICAgICAgICAgQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgY2JGcmFtZUxlbmd0aCwgd0N1cnJlbnRSYXRlLCBieVBrdFR5cGUsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQgKikmKHdMZW4pLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTZXJ2aWNlRmllbGQpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGggPSBjcHVfdG9fbGUxNih3TGVuKTsKICAgICAgICAgICAgIC8vR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXBPZmYKIAotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAorICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0EsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCB1RnJhZ0lkeCwgY2JMYXN0RnJhZ21lbnRTaXplLCB1TUFDZnJhZ051bSwgYnlGQk9wdGlvbikpOyAvLzA6IDVHSHoKLSAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9mMCA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0FfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKKyAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9mMCA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9BX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgdUZyYWdJZHgsIGNiTGFzdEZyYWdtZW50U2l6ZSwgdU1BQ2ZyYWdOdW0sIGJ5RkJPcHRpb24pKTsgLy8wOiA1R0h6Ci0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fZjEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9BX0YxLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fZjEgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIHVGcmFnSWR4LCBjYkxhc3RGcmFnbWVudFNpemUsIHVNQUNmcmFnTnVtLCBieUZCT3B0aW9uKSk7IC8vMDogNUdIegogICAgICAgICAgICAgcEJ1Zi0+d1RpbWVTdGFtcE9mZiA9IGNwdV90b19sZTE2KHdUaW1lU3RhbXBPZmZbcERldmljZS0+YnlQcmVhbWJsZVR5cGUlMl1bd0N1cnJlbnRSYXRlJU1BWF9SQVRFXSk7CiAgICAgICAgICAgICByZXR1cm4gKHBCdWYtPndEdXJhdGlvbik7CkBAIC04MTcsMTIgKzgwNiwxMiBAQAogICAgICAgICAgICAgUFNUeERhdGFIZWFkX2FiIHBCdWYgPSAoUFNUeERhdGFIZWFkX2FiKXBUeERhdGFIZWFkOwogICAgICAgICAgICAgLy9HZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aAogICAgICAgICAgICAgQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgY2JGcmFtZUxlbmd0aCwgd0N1cnJlbnRSYXRlLCBieVBrdFR5cGUsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQgKikmKHdMZW4pLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTZXJ2aWNlRmllbGQpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGggPSBjcHVfdG9fbGUxNih3TGVuKTsKICAgICAgICAgICAgIC8vR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXBPZmYKIAotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAorICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0EsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCB1RnJhZ0lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYkxhc3RGcmFnbWVudFNpemUsIHVNQUNmcmFnTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5RkJPcHRpb24pKTsKQEAgLTgzNSwxMSArODI0LDExIEBACiAgICAgICAgICAgICBQU1R4RGF0YUhlYWRfYWIgcEJ1ZiA9IChQU1R4RGF0YUhlYWRfYWIpcFR4RGF0YUhlYWQ7CiAgICAgICAgICAgICAvL0dldCBTaWduYWxGaWVsZCxTZXJ2aWNlRmllbGQsTGVuZ3RoCiAgICAgICAgICAgICBCQnZDYWN1bGF0ZVBhcmFtZXRlcihwRGV2aWNlLCBjYkZyYW1lTGVuZ3RoLCB3Q3VycmVudFJhdGUsIGJ5UGt0VHlwZSwKLSAgICAgICAgICAgICAgICAoUFdPUkQpJih3TGVuKSwgKFBCWVRFKSYocEJ1Zi0+YnlTZXJ2aWNlRmllbGQpLCAoUEJZVEUpJihwQnVmLT5ieVNpZ25hbEZpZWxkKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZCksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNpZ25hbEZpZWxkKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHBCdWYtPndUcmFuc21pdExlbmd0aCA9IGNwdV90b19sZTE2KHdMZW4pOwogICAgICAgICAgICAgLy9HZXQgRHVyYXRpb24gYW5kIFRpbWVTdGFtcE9mZgotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQiwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAorICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0IsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCB1RnJhZ0lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYkxhc3RGcmFnbWVudFNpemUsIHVNQUNmcmFnTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5RkJPcHRpb24pKTsKQEAgLTg1NCwxOCArODQzLDE4IEBACiB2b2lkCiBzX3ZGaWxsUlRTSGVhZCAoCiAgICAgUFNEZXZpY2UgICAgICAgICBwRGV2aWNlLAotICAgIEJZVEUgICAgICAgICAgICAgYnlQa3RUeXBlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAogICAgIHZvaWQgKiAgICAgICAgICAgcHZSVFMsCi0gICAgVUlOVCAgICAgICAgICAgICBjYkZyYW1lTGVuZ3RoLAotICAgIEJPT0wgICAgICAgICAgICAgYk5lZWRBY2ssCi0gICAgQk9PTCAgICAgICAgICAgICBiRGlzQ1JDLAorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoLAorICAgIGJvb2wgYk5lZWRBY2ssCisgICAgYm9vbCBiRGlzQ1JDLAogICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIsCi0gICAgV09SRCAgICAgICAgICAgICB3Q3VycmVudFJhdGUsCi0gICAgQllURSAgICAgICAgICAgICBieUZCT3B0aW9uCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgYnlGQk9wdGlvbgogICAgICkKIHsKLSAgICBVSU5UIHVSVFNGcmFtZUxlbiA9IDIwOwotICAgIFdPUkQgIHdMZW4gPSAweDAwMDA7CisgICAgdW5zaWduZWQgaW50IHVSVFNGcmFtZUxlbiA9IDIwOworICAgIHVuc2lnbmVkIHNob3J0IHdMZW4gPSAweDAwMDA7CiAKICAgICBpZiAocHZSVFMgPT0gTlVMTCkKICAgICAJcmV0dXJuOwpAQCAtODgzLDE3ICs4NzIsMTcgQEAKICAgICAgICAgICAgIFBTUlRTX2cgcEJ1ZiA9IChQU1JUU19nKXB2UlRTOwogICAgICAgICAgICAgLy9HZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aAogICAgICAgICAgICAgQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgdVJUU0ZyYW1lTGVuLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgUEtfVFlQRV8xMUIsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2IpLCAoUEJZVEUpJihwQnVmLT5ieVNpZ25hbEZpZWxkX2IpCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0ICopJih3TGVuKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2IpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9iKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHBCdWYtPndUcmFuc21pdExlbmd0aF9iID0gY3B1X3RvX2xlMTYod0xlbik7CiAgICAgICAgICAgICBCQnZDYWN1bGF0ZVBhcmFtZXRlcihwRGV2aWNlLCB1UlRTRnJhbWVMZW4sIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgYnlQa3RUeXBlLAotICAgICAgICAgICAgICAgIChQV09SRCkmKHdMZW4pLCAoUEJZVEUpJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9hKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9hKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9hKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2lnbmFsRmllbGRfYSkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGhfYSA9IGNwdV90b19sZTE2KHdMZW4pOwogICAgICAgICAgICAgLy9HZXQgRHVyYXRpb24KLSAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9iYiA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIFJUU0RVUl9CQiwgY2JGcmFtZUxlbmd0aCwgUEtfVFlQRV8xMUIsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAgICAvLzA6UlRTRHVyYXRpb25fYmIsIDE6Mi40RywgMTpDQ0tEYXRhCi0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYWEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzI6UlRTRHVyYXRpb25fYWEsIDE6Mi40RywgMiwzOiAyLjRHIE9GRE1EYXRhCi0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQkEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzE6UlRTRHVyYXRpb25fYmEsIDE6Mi40RywgMiwzOjIuNEcgT0ZETSBEYXRhCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmIgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JCLCBjYkZyYW1lTGVuZ3RoLCBQS19UWVBFXzExQiwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7ICAgIC8vMDpSVFNEdXJhdGlvbl9iYiwgMToyLjRHLCAxOkNDS0RhdGEKKyAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9hYSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzI6UlRTRHVyYXRpb25fYWEsIDE6Mi40RywgMiwzOiAyLjRHIE9GRE1EYXRhCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmEgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8xOlJUU0R1cmF0aW9uX2JhLCAxOjIuNEcsIDIsMzoyLjRHIE9GRE0gRGF0YQogCiAgICAgICAgICAgICBwQnVmLT5EYXRhLndEdXJhdGlvbklEID0gcEJ1Zi0+d0R1cmF0aW9uX2FhOwogICAgICAgICAgICAgLy9HZXQgUlRTIEZyYW1lIGJvZHkKQEAgLTkxNiwyMiArOTA1LDIyIEBACiAgICAgICAgICAgIFBTUlRTX2dfRkIgcEJ1ZiA9IChQU1JUU19nX0ZCKXB2UlRTOwogICAgICAgICAgICAgLy9HZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aAogICAgICAgICAgICAgQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIocERldmljZSwgdVJUU0ZyYW1lTGVuLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgUEtfVFlQRV8xMUIsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2IpLCAoUEJZVEUpJihwQnVmLT5ieVNpZ25hbEZpZWxkX2IpCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0ICopJih3TGVuKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2VydmljZUZpZWxkX2IpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9iKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHBCdWYtPndUcmFuc21pdExlbmd0aF9iID0gY3B1X3RvX2xlMTYod0xlbik7CiAgICAgICAgICAgICBCQnZDYWN1bGF0ZVBhcmFtZXRlcihwRGV2aWNlLCB1UlRTRnJhbWVMZW4sIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgYnlQa3RUeXBlLAotICAgICAgICAgICAgICAgIChQV09SRCkmKHdMZW4pLCAoUEJZVEUpJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9hKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9hKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9hKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2lnbmFsRmllbGRfYSkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGhfYSA9IGNwdV90b19sZTE2KHdMZW4pOwogCiAgICAgICAgICAgICAvL0dldCBEdXJhdGlvbgotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2JiID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JCLCBjYkZyYW1lTGVuZ3RoLCBQS19UWVBFXzExQiwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7ICAgIC8vMDpSVFNEdXJhdGlvbl9iYiwgMToyLjRHLCAxOkNDS0RhdGEKLSAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9hYSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIFJUU0RVUl9BQSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7IC8vMjpSVFNEdXJhdGlvbl9hYSwgMToyLjRHLCAyLDM6Mi40RyBPRkRNRGF0YQotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2JhID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8xOlJUU0R1cmF0aW9uX2JhLCAxOjIuNEcsIDIsMzoyLjRHIE9GRE1EYXRhCi0gICAgICAgICAgICBwQnVmLT53UlRTRHVyYXRpb25fYmFfZjAgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQkFfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAgICAvLzQ6d1JUU0R1cmF0aW9uX2JhX2YwLCAxOjIuNEcsIDE6Q0NLRGF0YQotICAgICAgICAgICAgcEJ1Zi0+d1JUU0R1cmF0aW9uX2FhX2YwID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0FBX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgICAgLy81OndSVFNEdXJhdGlvbl9hYV9mMCwgMToyLjRHLCAxOkNDS0RhdGEKLSAgICAgICAgICAgIHBCdWYtPndSVFNEdXJhdGlvbl9iYV9mMSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIFJUU0RVUl9CQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7ICAgIC8vNjp3UlRTRHVyYXRpb25fYmFfZjEsIDE6Mi40RywgMTpDQ0tEYXRhCi0gICAgICAgICAgICBwQnVmLT53UlRTRHVyYXRpb25fYWFfZjEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUFfRjEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAgICAvLzc6d1JUU0R1cmF0aW9uX2FhX2YxLCAxOjIuNEcsIDE6Q0NLRGF0YQorICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2JiID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIFJUU0RVUl9CQiwgY2JGcmFtZUxlbmd0aCwgUEtfVFlQRV8xMUIsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAgICAvLzA6UlRTRHVyYXRpb25fYmIsIDE6Mi40RywgMTpDQ0tEYXRhCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYWEgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0FBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8yOlJUU0R1cmF0aW9uX2FhLCAxOjIuNEcsIDIsMzoyLjRHIE9GRE1EYXRhCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmEgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8xOlJUU0R1cmF0aW9uX2JhLCAxOjIuNEcsIDIsMzoyLjRHIE9GRE1EYXRhCisgICAgICAgICAgICBwQnVmLT53UlRTRHVyYXRpb25fYmFfZjAgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JBX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgICAgLy80OndSVFNEdXJhdGlvbl9iYV9mMCwgMToyLjRHLCAxOkNDS0RhdGEKKyAgICAgICAgICAgIHBCdWYtPndSVFNEdXJhdGlvbl9hYV9mMCA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUFfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAgICAvLzU6d1JUU0R1cmF0aW9uX2FhX2YwLCAxOjIuNEcsIDE6Q0NLRGF0YQorICAgICAgICAgICAgcEJ1Zi0+d1JUU0R1cmF0aW9uX2JhX2YxID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIFJUU0RVUl9CQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7ICAgIC8vNjp3UlRTRHVyYXRpb25fYmFfZjEsIDE6Mi40RywgMTpDQ0tEYXRhCisgICAgICAgICAgICBwQnVmLT53UlRTRHVyYXRpb25fYWFfZjEgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0FBX0YxLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgICAgLy83OndSVFNEdXJhdGlvbl9hYV9mMSwgMToyLjRHLCAxOkNDS0RhdGEKICAgICAgICAgICAgIHBCdWYtPkRhdGEud0R1cmF0aW9uSUQgPSBwQnVmLT53RHVyYXRpb25fYWE7CiAgICAgICAgICAgICAvL0dldCBSVFMgRnJhbWUgYm9keQogICAgICAgICAgICAgcEJ1Zi0+RGF0YS53RnJhbWVDb250cm9sID0gVFlQRV9DVExfUlRTOy8vMHgwMEI0CkBAIC05NTgsMTEgKzk0NywxMSBAQAogICAgICAgICAgICAgUFNSVFNfYWIgcEJ1ZiA9IChQU1JUU19hYilwdlJUUzsKICAgICAgICAgICAgIC8vR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGgKICAgICAgICAgICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVSVFNGcmFtZUxlbiwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlLCBieVBrdFR5cGUsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQgKikmKHdMZW4pLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTZXJ2aWNlRmllbGQpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGggPSBjcHVfdG9fbGUxNih3TGVuKTsKICAgICAgICAgICAgIC8vR2V0IER1cmF0aW9uCi0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb24gPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzA6UlRTRHVyYXRpb25fYWEsIDA6NUcsIDA6IDVHIE9GRE1EYXRhCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb24gPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0FBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8wOlJUU0R1cmF0aW9uX2FhLCAwOjVHLCAwOiA1RyBPRkRNRGF0YQogICAgIAkgICAgcEJ1Zi0+RGF0YS53RHVyYXRpb25JRCA9IHBCdWYtPndEdXJhdGlvbjsKICAgICAgICAgICAgIC8vR2V0IFJUUyBGcmFtZSBib2R5CiAgICAgICAgICAgICBwQnVmLT5EYXRhLndGcmFtZUNvbnRyb2wgPSBUWVBFX0NUTF9SVFM7Ly8weDAwQjQKQEAgLTk4NywxMyArOTc2LDEzIEBACiAgICAgICAgICAgICBQU1JUU19hX0ZCIHBCdWYgPSAoUFNSVFNfYV9GQilwdlJUUzsKICAgICAgICAgICAgIC8vR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGgKICAgICAgICAgICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVSVFNGcmFtZUxlbiwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlLCBieVBrdFR5cGUsCi0gICAgICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQgKikmKHdMZW4pLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTZXJ2aWNlRmllbGQpLCAodW5zaWduZWQgY2hhciAqKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGggPSBjcHVfdG9fbGUxNih3TGVuKTsKICAgICAgICAgICAgIC8vR2V0IER1cmF0aW9uCi0gICAgICAgICAgICBwQnVmLT53RHVyYXRpb24gPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzA6UlRTRHVyYXRpb25fYWEsIDA6NUcsIDA6IDVHIE9GRE1EYXRhCi0gICAgCSAgICBwQnVmLT53UlRTRHVyYXRpb25fZjAgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUFfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzU6UlRTRHVyYXRpb25fYWFfZjAsIDA6NUcsIDA6IDVHIE9GRE1EYXRhCi0gICAgCSAgICBwQnVmLT53UlRTRHVyYXRpb25fZjEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUFfRjEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzc6UlRTRHVyYXRpb25fYWFfZjEsIDA6NUcsIDA6CisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb24gPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0FBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8wOlJUU0R1cmF0aW9uX2FhLCAwOjVHLCAwOiA1RyBPRkRNRGF0YQorICAgIAkgICAgcEJ1Zi0+d1JUU0R1cmF0aW9uX2YwID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIFJUU0RVUl9BQV9GMCwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7IC8vNTpSVFNEdXJhdGlvbl9hYV9mMCwgMDo1RywgMDogNUcgT0ZETURhdGEKKyAgICAJICAgIHBCdWYtPndSVFNEdXJhdGlvbl9mMSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBSVFNEVVJfQUFfRjEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzc6UlRTRHVyYXRpb25fYWFfZjEsIDA6NUcsIDA6CiAgICAgCSAgICBwQnVmLT5EYXRhLndEdXJhdGlvbklEID0gcEJ1Zi0+d0R1cmF0aW9uOwogICAgIAkgICAgLy9HZXQgUlRTIEZyYW1lIGJvZHkKICAgICAgICAgICAgIHBCdWYtPkRhdGEud0ZyYW1lQ29udHJvbCA9IFRZUEVfQ1RMX1JUUzsvLzB4MDBCNApAQCAtMTAxNywxMSArMTAwNiwxMSBAQAogICAgICAgICBQU1JUU19hYiBwQnVmID0gKFBTUlRTX2FiKXB2UlRTOwogICAgICAgICAvL0dldCBTaWduYWxGaWVsZCxTZXJ2aWNlRmllbGQsTGVuZ3RoCiAgICAgICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVSVFNGcmFtZUxlbiwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIFBLX1RZUEVfMTFCLAotICAgICAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBCdWYtPmJ5U2VydmljZUZpZWxkKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZCkKKyAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZCksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNpZ25hbEZpZWxkKQogICAgICAgICApOwogICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGggPSBjcHVfdG9fbGUxNih3TGVuKTsKICAgICAgICAgLy9HZXQgRHVyYXRpb24KLSAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JCLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8wOlJUU0R1cmF0aW9uX2JiLCAxOjIuNEcsIDE6Q0NLRGF0YQorICAgICAgICBwQnVmLT53RHVyYXRpb24gPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgUlRTRFVSX0JCLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pKTsgLy8wOlJUU0R1cmF0aW9uX2JiLCAxOjIuNEcsIDE6Q0NLRGF0YQogICAgICAgICBwQnVmLT5EYXRhLndEdXJhdGlvbklEID0gcEJ1Zi0+d0R1cmF0aW9uOwogICAgICAgICAvL0dldCBSVFMgRnJhbWUgYm9keQogICAgICAgICBwQnVmLT5EYXRhLndGcmFtZUNvbnRyb2wgPSBUWVBFX0NUTF9SVFM7Ly8weDAwQjQKQEAgLTEwNDgsMTggKzEwMzcsMTggQEAKIHZvaWQKIHNfdkZpbGxDVFNIZWFkICgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIFVJTlQgICAgIHVETUFJZHgsCi0gICAgQllURSAgICAgYnlQa3RUeXBlLAorICAgIHVuc2lnbmVkIGludCB1RE1BSWR4LAorICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAogICAgIHZvaWQgKiAgIHB2Q1RTLAotICAgIFVJTlQgICAgIGNiRnJhbWVMZW5ndGgsCi0gICAgQk9PTCAgICAgYk5lZWRBY2ssCi0gICAgQk9PTCAgICAgYkRpc0NSQywKLSAgICBXT1JEICAgICB3Q3VycmVudFJhdGUsCi0gICAgQllURSAgICAgYnlGQk9wdGlvbgorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoLAorICAgIGJvb2wgYk5lZWRBY2ssCisgICAgYm9vbCBiRGlzQ1JDLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyZW50UmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24KICAgICApCiB7Ci0gICAgVUlOVCB1Q1RTRnJhbWVMZW4gPSAxNDsKLSAgICBXT1JEICB3TGVuID0gMHgwMDAwOworICAgIHVuc2lnbmVkIGludCB1Q1RTRnJhbWVMZW4gPSAxNDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TGVuID0gMHgwMDAwOwogCiAgICAgaWYgKHB2Q1RTID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTA3NywyMSArMTA2NiwyMSBAQAogICAgICAgICAgICAgUFNDVFNfRkIgcEJ1ZiA9IChQU0NUU19GQilwdkNUUzsKICAgICAgICAgICAgIC8vR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGgKICAgICAgICAgICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVDVFNGcmFtZUxlbiwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIFBLX1RZUEVfMTFCLAotICAgICAgICAgICAgICAgIChQV09SRCkmKHdMZW4pLCAoUEJZVEUpJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9iKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9iKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9iKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2lnbmFsRmllbGRfYikKICAgICAgICAgICAgICk7CiAKIAogICAgICAgICAgICAgcEJ1Zi0+d1RyYW5zbWl0TGVuZ3RoX2IgPSBjcHVfdG9fbGUxNih3TGVuKTsKIAotICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2JhID0gKFdPUkQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgQ1RTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pOyAvLzM6Q1RTRHVyYXRpb25fYmEsIDE6Mi40RywgMiwzOjIuNEcgT0ZETSBEYXRhCisgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmEgPSAodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgQ1RTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pOyAvLzM6Q1RTRHVyYXRpb25fYmEsIDE6Mi40RywgMiwzOjIuNEcgT0ZETSBEYXRhCiAgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmEgKz0gcERldmljZS0+d0NUU0R1cmF0aW9uOwogICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2JhID0gY3B1X3RvX2xlMTYocEJ1Zi0+d0R1cmF0aW9uX2JhKTsKICAgICAgICAgICAgIC8vR2V0IENUU0R1cmF0aW9uX2JhX2YwCi0gICAgICAgICAgICBwQnVmLT53Q1RTRHVyYXRpb25fYmFfZjAgPSAoV09SRClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBDVFNEVVJfQkFfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbik7IC8vODpDVFNEdXJhdGlvbl9iYV9mMCwgMToyLjRHLCAyLDM6Mi40RyBPRkRNIERhdGEKKyAgICAgICAgICAgIHBCdWYtPndDVFNEdXJhdGlvbl9iYV9mMCA9ICh1bnNpZ25lZCBzaG9ydClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBDVFNEVVJfQkFfRjAsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbik7IC8vODpDVFNEdXJhdGlvbl9iYV9mMCwgMToyLjRHLCAyLDM6Mi40RyBPRkRNIERhdGEKICAgICAgICAgICAgIHBCdWYtPndDVFNEdXJhdGlvbl9iYV9mMCArPSBwRGV2aWNlLT53Q1RTRHVyYXRpb247CiAgICAgICAgICAgICBwQnVmLT53Q1RTRHVyYXRpb25fYmFfZjAgPSBjcHVfdG9fbGUxNihwQnVmLT53Q1RTRHVyYXRpb25fYmFfZjApOwogICAgICAgICAgICAgLy9HZXQgQ1RTRHVyYXRpb25fYmFfZjEKLSAgICAgICAgICAgIHBCdWYtPndDVFNEdXJhdGlvbl9iYV9mMSA9IChXT1JEKXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIENUU0RVUl9CQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsgLy85OkNUU0R1cmF0aW9uX2JhX2YxLCAxOjIuNEcsIDIsMzoyLjRHIE9GRE0gRGF0YQorICAgICAgICAgICAgcEJ1Zi0+d0NUU0R1cmF0aW9uX2JhX2YxID0gKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIENUU0RVUl9CQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsgLy85OkNUU0R1cmF0aW9uX2JhX2YxLCAxOjIuNEcsIDIsMzoyLjRHIE9GRE0gRGF0YQogICAgICAgICAgICAgcEJ1Zi0+d0NUU0R1cmF0aW9uX2JhX2YxICs9IHBEZXZpY2UtPndDVFNEdXJhdGlvbjsKICAgICAgICAgICAgIHBCdWYtPndDVFNEdXJhdGlvbl9iYV9mMSA9IGNwdV90b19sZTE2KHBCdWYtPndDVFNEdXJhdGlvbl9iYV9mMSk7CiAgICAgICAgICAgICAvL0dldCBDVFMgRnJhbWUgYm9keQpAQCAtMTEwNCwxMSArMTA5MywxMSBAQAogICAgICAgICAgICAgUFNDVFMgcEJ1ZiA9IChQU0NUUylwdkNUUzsKICAgICAgICAgICAgIC8vR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGgKICAgICAgICAgICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVDVFNGcmFtZUxlbiwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIFBLX1RZUEVfMTFCLAotICAgICAgICAgICAgICAgIChQV09SRCkmKHdMZW4pLCAoUEJZVEUpJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9iKSwgKFBCWVRFKSYocEJ1Zi0+YnlTaWduYWxGaWVsZF9iKQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCAqKSYod0xlbiksICh1bnNpZ25lZCBjaGFyICopJihwQnVmLT5ieVNlcnZpY2VGaWVsZF9iKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBCdWYtPmJ5U2lnbmFsRmllbGRfYikKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBwQnVmLT53VHJhbnNtaXRMZW5ndGhfYiA9IGNwdV90b19sZTE2KHdMZW4pOwogICAgICAgICAgICAgLy9HZXQgQ1RTRHVyYXRpb25fYmEKLSAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9iYSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFJUU0NUU0R1cmF0aW9uKHBEZXZpY2UsIENUU0RVUl9CQSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLCB3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKSk7IC8vMzpDVFNEdXJhdGlvbl9iYSwgMToyLjRHLCAyLDM6Mi40RyBPRkRNIERhdGEKKyAgICAgICAgICAgIHBCdWYtPndEdXJhdGlvbl9iYSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBDVFNEVVJfQkEsIGNiRnJhbWVMZW5ndGgsIGJ5UGt0VHlwZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbikpOyAvLzM6Q1RTRHVyYXRpb25fYmEsIDE6Mi40RywgMiwzOjIuNEcgT0ZETSBEYXRhCiAgICAgICAgICAgICBwQnVmLT53RHVyYXRpb25fYmEgKz0gcERldmljZS0+d0NUU0R1cmF0aW9uOwogICAgICAgICAgICAgcEJ1Zi0+d0R1cmF0aW9uX2JhID0gY3B1X3RvX2xlMTYocEJ1Zi0+d0R1cmF0aW9uX2JhKTsKIApAQCAtMTE0OCwyOCArMTEzNywyOCBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogLSovCi0vLyBVSU5UICAgICAgICAgICAgY2JGcmFtZVNpemUsLy9IZHIrUGF5bG9hZCtGQ1MKKy8vIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwvL0hkcitQYXlsb2FkK0ZDUwogc3RhdGljCiB2b2lkCiBzX3ZHZW5lcmF0ZVR4UGFyYW1ldGVyICgKICAgICBQU0RldmljZSAgICAgICAgIHBEZXZpY2UsCi0gICAgQllURSAgICAgICAgICAgICBieVBrdFR5cGUsCisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCiAgICAgdm9pZCAqICAgICAgICAgICBwVHhCdWZIZWFkLAogICAgIHZvaWQgKiAgICAgICAgICAgcHZScnZUaW1lLAogICAgIHZvaWQgKiAgICAgICAgICAgcHZSVFMsCiAgICAgdm9pZCAqICAgICAgICAgICBwdkNUUywKLSAgICBVSU5UICAgICAgICAgICAgIGNiRnJhbWVTaXplLAotICAgIEJPT0wgICAgICAgICAgICAgYk5lZWRBQ0ssCi0gICAgVUlOVCAgICAgICAgICAgICB1RE1BSWR4LAorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwKKyAgICBib29sIGJOZWVkQUNLLAorICAgIHVuc2lnbmVkIGludCB1RE1BSWR4LAogICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIsCi0gICAgV09SRCAgICAgICAgICAgICB3Q3VycmVudFJhdGUKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VycmVudFJhdGUKICAgICApCiB7Ci0gICAgVUlOVCBjYk1BQ0hkTGVuID0gV0xBTl9IRFJfQUREUjNfTEVOOyAvLzI0Ci0gICAgV09SRCB3Rmlmb0N0bDsKLSAgICBCT09MIGJEaXNDUkMgPSBGQUxTRTsKLSAgICBCWVRFIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7Ci0vLyAgICBXT1JEIHdDdXJyZW50UmF0ZSA9IHBEZXZpY2UtPndDdXJyZW50UmF0ZTsKKyAgICB1bnNpZ25lZCBpbnQgY2JNQUNIZExlbiA9IFdMQU5fSERSX0FERFIzX0xFTjsgLy8yNAorICAgIHVuc2lnbmVkIHNob3J0IHdGaWZvQ3RsOworICAgIGJvb2wgYkRpc0NSQyA9IGZhbHNlOworICAgIHVuc2lnbmVkIGNoYXIgYnlGQk9wdGlvbiA9IEFVVE9fRkJfTk9ORTsKKy8vICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyZW50UmF0ZSA9IHBEZXZpY2UtPndDdXJyZW50UmF0ZTsKIAogICAgIC8vREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJzX3ZHZW5lcmF0ZVR4UGFyYW1ldGVyLi4uXG4iKTsKICAgICBQU1R4QnVmSGVhZCBwRmlmb0hlYWQgPSAoUFNUeEJ1ZkhlYWQpcFR4QnVmSGVhZDsKQEAgLTExNzcsNyArMTE2Niw3IEBACiAgICAgd0ZpZm9DdGwgPSBwRmlmb0hlYWQtPndGSUZPQ3RsOwogCiAgICAgaWYgKHdGaWZvQ3RsICYgRklGT0NUTF9DUkNESVMpIHsKLSAgICAgICAgYkRpc0NSQyA9IFRSVUU7CisgICAgICAgIGJEaXNDUkMgPSB0cnVlOwogICAgIH0KIAogICAgIGlmICh3Rmlmb0N0bCAmIEZJRk9DVExfQVVUT19GQl8wKSB7CkBAIC0xMTk2LDExICsxMTg1LDExIEBACiAgICAgICAgICAgICAvL0ZpbGwgUnN2VGltZQogICAgICAgICAgICAgaWYgKHB2UnJ2VGltZSkgewogICAgICAgICAgICAgICAgIFBTUnJ2VGltZV9nUlRTIHBCdWYgPSAoUFNScnZUaW1lX2dSVFMpcHZScnZUaW1lOwotICAgICAgICAgICAgICAgIHBCdWYtPndSVFNUeFJydlRpbWVfYWEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSkpOy8vMjpSVFNUeFJydlRpbWVfYWEsIDE6Mi40R0h6Ci0gICAgICAgICAgICAgICAgcEJ1Zi0+d1JUU1R4UnJ2VGltZV9iYSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKSk7Ly8xOlJUU1R4UnJ2VGltZV9iYSwgMToyLjRHSHoKLSAgICAgICAgICAgICAgICBwQnVmLT53UlRTVHhScnZUaW1lX2JiID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpKTsvLzA6UlRTVHhScnZUaW1lX2JiLCAxOjIuNEdIegotICAgICAgICAgICAgICAgIHBCdWYtPndUeFJydlRpbWVfYSA9IGNwdV90b19sZTE2KChXT1JEKSBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOy8vMi40RyBPRkRNCi0gICAgICAgICAgICAgICAgcEJ1Zi0+d1R4UnJ2VGltZV9iID0gY3B1X3RvX2xlMTYoKFdPUkQpIHNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBiTmVlZEFDSykpOy8vMTpDQ0sKKyAgICAgICAgICAgICAgICBwQnVmLT53UlRTVHhScnZUaW1lX2FhID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKSk7Ly8yOlJUU1R4UnJ2VGltZV9hYSwgMToyLjRHSHoKKyAgICAgICAgICAgICAgICBwQnVmLT53UlRTVHhScnZUaW1lX2JhID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKSk7Ly8xOlJUU1R4UnJ2VGltZV9iYSwgMToyLjRHSHoKKyAgICAgICAgICAgICAgICBwQnVmLT53UlRTVHhScnZUaW1lX2JiID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMCwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKSk7Ly8wOlJUU1R4UnJ2VGltZV9iYiwgMToyLjRHSHoKKyAgICAgICAgICAgICAgICBwQnVmLT53VHhScnZUaW1lX2EgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpIHNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKSk7Ly8yLjRHIE9GRE0KKyAgICAgICAgICAgICAgICBwQnVmLT53VHhScnZUaW1lX2IgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpIHNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBiTmVlZEFDSykpOy8vMTpDQ0sKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vRmlsbCBSVFMKICAgICAgICAgICAgIHNfdkZpbGxSVFNIZWFkKHBEZXZpY2UsIGJ5UGt0VHlwZSwgcHZSVFMsIGNiRnJhbWVTaXplLCBiTmVlZEFDSywgYkRpc0NSQywgcHNFdGhIZWFkZXIsIHdDdXJyZW50UmF0ZSwgYnlGQk9wdGlvbik7CkBAIC0xMjEwLDkgKzExOTksOSBAQAogICAgICAgICAgICAgLy9GaWxsIFJzdlRpbWUKICAgICAgICAgICAgIGlmIChwdlJydlRpbWUpIHsKICAgICAgICAgICAgICAgICBQU1JydlRpbWVfZ0NUUyBwQnVmID0gKFBTUnJ2VGltZV9nQ1RTKXB2UnJ2VGltZTsKLSAgICAgICAgICAgICAgICBwQnVmLT53VHhScnZUaW1lX2EgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOy8vMi40RyBPRkRNCi0gICAgICAgICAgICAgICAgcEJ1Zi0+d1R4UnJ2VGltZV9iID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKSk7Ly8xOkNDSwotICAgICAgICAgICAgICAgIHBCdWYtPndDVFNUeFJydlRpbWVfYmEgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDMsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSkpOy8vMzpDVFNUeFJydlRpbWVfQmEsIDE6Mi40R0h6CisgICAgICAgICAgICAgICAgcEJ1Zi0+d1R4UnJ2VGltZV9hID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKSk7Ly8yLjRHIE9GRE0KKyAgICAgICAgICAgICAgICBwQnVmLT53VHhScnZUaW1lX2IgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKSk7Ly8xOkNDSworICAgICAgICAgICAgICAgIHBCdWYtPndDVFNUeFJydlRpbWVfYmEgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAzLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpKTsvLzM6Q1RTVHhScnZUaW1lX0JhLCAxOjIuNEdIegogICAgICAgICAgICAgfQogCiAKQEAgLTEyMjYsOCArMTIxNSw4IEBACiAgICAgICAgICAgICAvL0ZpbGwgUnN2VGltZQogICAgICAgICAgICAgaWYgKHB2UnJ2VGltZSkgewogICAgICAgICAgICAgICAgIFBTUnJ2VGltZV9hYiBwQnVmID0gKFBTUnJ2VGltZV9hYilwdlJydlRpbWU7Ci0gICAgICAgICAgICAgICAgcEJ1Zi0+d1JUU1R4UnJ2VGltZSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKSk7Ly8yOlJUU1R4UnJ2VGltZV9hYSwgMDo1R0h6Ci0gICAgICAgICAgICAgICAgcEJ1Zi0+d1R4UnJ2VGltZSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKSk7Ly8wOk9GRE0KKyAgICAgICAgICAgICAgICBwQnVmLT53UlRTVHhScnZUaW1lID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KXNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKSk7Ly8yOlJUU1R4UnJ2VGltZV9hYSwgMDo1R0h6CisgICAgICAgICAgICAgICAgcEJ1Zi0+d1R4UnJ2VGltZSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOy8vMDpPRkRNCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvL0ZpbGwgUlRTCiAgICAgICAgICAgICBzX3ZGaWxsUlRTSGVhZChwRGV2aWNlLCBieVBrdFR5cGUsIHB2UlRTLCBjYkZyYW1lU2l6ZSwgYk5lZWRBQ0ssIGJEaXNDUkMsIHBzRXRoSGVhZGVyLCB3Q3VycmVudFJhdGUsIGJ5RkJPcHRpb24pOwpAQCAtMTIzNiw3ICsxMjI1LDcgQEAKICAgICAgICAgICAgIC8vRmlsbCBSc3ZUaW1lCiAgICAgICAgICAgICBpZiAocHZScnZUaW1lKSB7CiAgICAgICAgICAgICAgICAgUFNScnZUaW1lX2FiIHBCdWYgPSAoUFNScnZUaW1lX2FiKXB2UnJ2VGltZTsKLSAgICAgICAgICAgICAgICBwQnVmLT53VHhScnZUaW1lID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIFBLX1RZUEVfMTFBLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOyAvLzA6T0ZETQorICAgICAgICAgICAgICAgIHBCdWYtPndUeFJydlRpbWUgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIFBLX1RZUEVfMTFBLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOyAvLzA6T0ZETQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTI0Niw4ICsxMjM1LDggQEAKICAgICAgICAgICAgIC8vRmlsbCBSc3ZUaW1lCiAgICAgICAgICAgICBpZiAocHZScnZUaW1lKSB7CiAgICAgICAgICAgICAgICAgUFNScnZUaW1lX2FiIHBCdWYgPSAoUFNScnZUaW1lX2FiKXB2UnJ2VGltZTsKLSAgICAgICAgICAgICAgICBwQnVmLT53UlRTVHhScnZUaW1lID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpKTsvLzA6UlRTVHhScnZUaW1lX2JiLCAxOjIuNEdIegotICAgICAgICAgICAgICAgIHBCdWYtPndUeFJydlRpbWUgPSBjcHVfdG9fbGUxNigoV09SRClzX3VHZXRUeFJzdlRpbWUocERldmljZSwgUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKSk7Ly8xOkNDSworICAgICAgICAgICAgICAgIHBCdWYtPndSVFNUeFJydlRpbWUgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpKTsvLzA6UlRTVHhScnZUaW1lX2JiLCAxOjIuNEdIegorICAgICAgICAgICAgICAgIHBCdWYtPndUeFJydlRpbWUgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOy8vMTpDQ0sKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vRmlsbCBSVFMKICAgICAgICAgICAgIHNfdkZpbGxSVFNIZWFkKHBEZXZpY2UsIGJ5UGt0VHlwZSwgcHZSVFMsIGNiRnJhbWVTaXplLCBiTmVlZEFDSywgYkRpc0NSQywgcHNFdGhIZWFkZXIsIHdDdXJyZW50UmF0ZSwgYnlGQk9wdGlvbik7CkBAIC0xMjU2LDI2ICsxMjQ1LDI2IEBACiAgICAgICAgICAgICAvL0ZpbGwgUnN2VGltZQogICAgICAgICAgICAgaWYgKHB2UnJ2VGltZSkgewogICAgICAgICAgICAgICAgIFBTUnJ2VGltZV9hYiBwQnVmID0gKFBTUnJ2VGltZV9hYilwdlJydlRpbWU7Ci0gICAgICAgICAgICAgICAgcEJ1Zi0+d1R4UnJ2VGltZSA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spKTsgLy8xOkNDSworICAgICAgICAgICAgICAgIHBCdWYtPndUeFJydlRpbWUgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSykpOyAvLzE6Q0NLCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgLy9EQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfdkdlbmVyYXRlVHhQYXJhbWV0ZXIgRU5ELlxuIik7CiB9CiAvKgotICAgIFBCWVRFIHBieUJ1ZmZlciwvL3BvaW50IHRvIHBUeEJ1ZkhlYWQKLSAgICBXT1JEICB3RnJhZ1R5cGUsLy8wMDpOb24tRnJhZywgMDE6U3RhcnQsIDAyOk1pZCwgMDM6TGFzdAotICAgIFVJTlQgIGNiRnJhZ21lbnRTaXplLC8vSGRyK3BheW9hZCtGQ1MKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsLy9wb2ludCB0byBwVHhCdWZIZWFkCisgICAgdW5zaWduZWQgc2hvcnQgd0ZyYWdUeXBlLC8vMDA6Tm9uLUZyYWcsIDAxOlN0YXJ0LCAwMjpNaWQsIDAzOkxhc3QKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFnbWVudFNpemUsLy9IZHIrcGF5b2FkK0ZDUwogKi8KIHN0YXRpYwogdm9pZAogc192RmlsbEZyYWdQYXJhbWV0ZXIoCiAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICBQQllURSAgICBwYnlCdWZmZXIsCi0gICAgVUlOVCAgICAgdVR4VHlwZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIsCisgICAgdW5zaWduZWQgaW50IHVUeFR5cGUsCiAgICAgdm9pZCAqICAgcHZ0ZEN1cnIsCi0gICAgV09SRCAgICAgd0ZyYWdUeXBlLAotICAgIFVJTlQgICAgIGNiUmVxQ291bnQKKyAgICB1bnNpZ25lZCBzaG9ydCB3RnJhZ1R5cGUsCisgICAgdW5zaWduZWQgaW50IGNiUmVxQ291bnQKICAgICApCiB7CiAgICAgUFNUeEJ1ZkhlYWQgcFR4QnVmSGVhZCA9IChQU1R4QnVmSGVhZCkgcGJ5QnVmZmVyOwpAQCAtMTI4OSw3ICsxMjc4LDcgQEAKICAgICAgICAgcHRkQ3Vyci0+bV93RklGT0N0bCA9IHBUeEJ1ZkhlYWQtPndGSUZPQ3RsOwogICAgICAgICBwdGRDdXJyLT5tX3dUaW1lU3RhbXAgPSBwVHhCdWZIZWFkLT53VGltZVN0YW1wOwogICAgICAgICAvL1NldCBUU1IxICYgUmVxQ291bnQgaW4gVHhEZXNjSGVhZAotICAgICAgICBwdGRDdXJyLT5tX3RkMVREMS53UmVxQ291bnQgPSBjcHVfdG9fbGUxNigoV09SRCkoY2JSZXFDb3VudCkpOworICAgICAgICBwdGRDdXJyLT5tX3RkMVREMS53UmVxQ291bnQgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpKGNiUmVxQ291bnQpKTsKICAgICAgICAgaWYgKHdGcmFnVHlwZSA9PSBGUkFHQ1RMX0VOREZSQUcpIHsgLy9MYXN0IEZyYWdtZW50YXRpb24KICAgICAgICAgICAgIHB0ZEN1cnItPm1fdGQxVEQxLmJ5VENSIHw9IChUQ1JfU1RQIHwgVENSX0VEUCB8IEVETVNEVSk7CiAgICAgICAgIH0KQEAgLTEzMDEsNyArMTI5MCw3IEBACiAgICAgICAgIC8vUFNUeERlc2MgcHRkQ3VyciA9IChQU1R4RGVzYylzX3B2R2V0VHhEZXNjSGVhZChwRGV2aWNlLCB1VHhUeXBlLCB1Q3VySWR4KTsKICAgICAgICAgUFNUeERlc2MgcHRkQ3VyciA9IChQU1R4RGVzYylwdnRkQ3VycjsKICAgICAgICAgLy9TZXQgVFNSMSAmIFJlcUNvdW50IGluIFR4RGVzY0hlYWQKLSAgICAgICAgcHRkQ3Vyci0+bV90ZDFURDEud1JlcUNvdW50ID0gY3B1X3RvX2xlMTYoKFdPUkQpKGNiUmVxQ291bnQpKTsKKyAgICAgICAgcHRkQ3Vyci0+bV90ZDFURDEud1JlcUNvdW50ID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KShjYlJlcUNvdW50KSk7CiAgICAgICAgIGlmICh3RnJhZ1R5cGUgPT0gRlJBR0NUTF9FTkRGUkFHKSB7IC8vTGFzdCBGcmFnbWVudGF0aW9uCiAgICAgICAgICAgICBwdGRDdXJyLT5tX3RkMVREMS5ieVRDUiB8PSAoVENSX1NUUCB8IFRDUl9FRFAgfCBFRE1TRFUpOwogICAgICAgICB9CkBAIC0xMzEwLDgxICsxMjk5LDcwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwVHhCdWZIZWFkLT53RnJhZ0N0bCB8PSAoV09SRCl3RnJhZ1R5cGU7Ly8weDAwMDE7IC8vMDAwMCAwMDAwIDAwMDAgMDAwMQorICAgIHBUeEJ1ZkhlYWQtPndGcmFnQ3RsIHw9ICh1bnNpZ25lZCBzaG9ydCl3RnJhZ1R5cGU7Ly8weDAwMDE7IC8vMDAwMCAwMDAwIDAwMDAgMDAwMQogCiAgICAgLy9EQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfdkZpbGxGcmFnUGFyYW1ldGVyIEVORFxuIik7CiB9CiAKLXN0YXRpYwotVUlOVAotc19jYkZpbGxUeEJ1ZkhlYWQgKAotICAgIFBTRGV2aWNlICAgICAgICAgcERldmljZSwKLSAgICBCWVRFICAgICAgICAgICAgIGJ5UGt0VHlwZSwKLSAgICBQQllURSAgICAgICAgICAgIHBieVR4QnVmZmVyQWRkciwKLSAgICBVSU5UICAgICAgICAgICAgIGNiRnJhbWVCb2R5U2l6ZSwKLSAgICBVSU5UICAgICAgICAgICAgIHVETUFJZHgsCi0gICAgUFNUeERlc2MgICAgICAgICBwSGVhZFRELAotICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIsCi0gICAgUEJZVEUgICAgICAgICAgICBwUGFja2V0LAotICAgIEJPT0wgICAgICAgICAgICAgYk5lZWRFbmNyeXB0LAotICAgIFBTS2V5SXRlbSAgICAgICAgcFRyYW5zbWl0S2V5LAotICAgIFVJTlQgICAgICAgICAgICAgdU5vZGVJbmRleCwKLSAgICBQVUlOVCAgICAgICAgICAgIHB1TUFDZnJhZ051bQotICAgICkKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NfY2JGaWxsVHhCdWZIZWFkKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLCB1bnNpZ25lZCBjaGFyICpwYnlUeEJ1ZmZlckFkZHIsCisJdW5zaWduZWQgaW50IGNiRnJhbWVCb2R5U2l6ZSwgdW5zaWduZWQgaW50IHVETUFJZHgsIFBTVHhEZXNjIHBIZWFkVEQsCisJUFNFdGhlcm5ldEhlYWRlciBwc0V0aEhlYWRlciwgdW5zaWduZWQgY2hhciAqcFBhY2tldCwgYm9vbCBiTmVlZEVuY3J5cHQsCisJUFNLZXlJdGVtIHBUcmFuc21pdEtleSwgdW5zaWduZWQgaW50IHVOb2RlSW5kZXgsIHVuc2lnbmVkIGludCAqcHVNQUNmcmFnTnVtKQogewotICAgIFVJTlQgICAgICAgICAgIGNiTUFDSGRMZW47Ci0gICAgVUlOVCAgICAgICAgICAgY2JGcmFtZVNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgY2JGcmFnbWVudFNpemU7IC8vSGRyKyhJVikrcGF5b2FkKyhNSUMpKyhJQ1YpK0ZDUwotICAgIFVJTlQgICAgICAgICAgIGNiRnJhZ1BheWxvYWRTaXplOwotICAgIFVJTlQgICAgICAgICAgIGNiTGFzdEZyYWdtZW50U2l6ZTsgLy9IZHIrKElWKStwYXlvYWQrKE1JQykrKElDVikrRkNTCi0gICAgVUlOVCAgICAgICAgICAgY2JMYXN0RnJhZ1BheWxvYWRTaXplOwotICAgIFVJTlQgICAgICAgICAgIHVGcmFnSWR4OwotICAgIFBCWVRFICAgICAgICAgIHBieVBheWxvYWRIZWFkOwotICAgIFBCWVRFICAgICAgICAgIHBieUlWSGVhZDsKLSAgICBQQllURSAgICAgICAgICBwYnlNYWNIZHI7Ci0gICAgV09SRCAgICAgICAgICAgd0ZyYWdUeXBlOyAvLzAwOk5vbi1GcmFnLCAwMTpTdGFydCwgMTA6TWlkLCAxMTpMYXN0Ci0gICAgVUlOVCAgICAgICAgICAgdUR1cmF0aW9uOwotICAgIFBCWVRFICAgICAgICAgIHBieUJ1ZmZlcjsKLS8vICAgIFVJTlQgICAgICAgICAgIHVLZXlFbnRyeUlkeCA9IE5VTV9LRVlfRU5UUlkrMTsKLS8vICAgIEJZVEUgICAgICAgICAgIGJ5S2V5U2VsID0gMHhGRjsKLSAgICBVSU5UICAgICAgICAgICBjYklWbGVuID0gMDsKLSAgICBVSU5UICAgICAgICAgICBjYklDVmxlbiA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgY2JNSUNsZW4gPSAwOwotICAgIFVJTlQgICAgICAgICAgIGNiRkNTbGVuID0gNDsKLSAgICBVSU5UICAgICAgICAgICBjYjgwMl8xX0hfbGVuID0gMDsKLSAgICBVSU5UICAgICAgICAgICB1TGVuZ3RoID0gMDsKLSAgICBVSU5UICAgICAgICAgICB1VG1wTGVuID0gMDsKLS8vICAgIEJZVEUgICAgICAgICAgIGFieVRtcFs4XTsKLS8vICAgIERXT1JEICAgICAgICAgIGR3Q1JDOwotICAgIFVJTlQgICAgICAgICAgIGNiTUlDSERSID0gMDsKLSAgICBEV09SRCAgICAgICAgICBkd01JQ0tleTAsIGR3TUlDS2V5MTsKLSAgICBEV09SRCAgICAgICAgICBkd01JQ19Qcmlvcml0eTsKLSAgICBQRFdPUkQgICAgICAgICBwZHdNSUNfTDsKLSAgICBQRFdPUkQgICAgICAgICBwZHdNSUNfUjsKLSAgICBEV09SRCAgICAgICAgICBkd1NhZmVNSUNfTCwgZHdTYWZlTUlDX1I7IC8vRml4ICJMYXN0IEZyYWcgU2l6ZSIgPCAiTUlDIGxlbmd0aCIuCi0gICAgQk9PTCAgICAgICAgICAgYk1JQzJGcmFnID0gRkFMU0U7Ci0gICAgVUlOVCAgICAgICAgICAgdU1JQ0ZyYWdMZW4gPSAwOwotICAgIFVJTlQgICAgICAgICAgIHVNQUNmcmFnTnVtID0gMTsKLSAgICBVSU5UICAgICAgICAgICB1UGFkZGluZyA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgY2JSZXFDb3VudCA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiTUFDSGRMZW47CisgICAgdW5zaWduZWQgaW50IGNiRnJhbWVTaXplOworICAgIHVuc2lnbmVkIGludCBjYkZyYWdtZW50U2l6ZTsgLy9IZHIrKElWKStwYXlvYWQrKE1JQykrKElDVikrRkNTCisgICAgdW5zaWduZWQgaW50IGNiRnJhZ1BheWxvYWRTaXplOworICAgIHVuc2lnbmVkIGludCBjYkxhc3RGcmFnbWVudFNpemU7IC8vSGRyKyhJVikrcGF5b2FkKyhNSUMpKyhJQ1YpK0ZDUworICAgIHVuc2lnbmVkIGludCBjYkxhc3RGcmFnUGF5bG9hZFNpemU7CisgICAgdW5zaWduZWQgaW50IHVGcmFnSWR4OworICAgIHVuc2lnbmVkIGNoYXIgKnBieVBheWxvYWRIZWFkOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUlWSGVhZDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlNYWNIZHI7CisgICAgdW5zaWduZWQgc2hvcnQgd0ZyYWdUeXBlOyAvLzAwOk5vbi1GcmFnLCAwMTpTdGFydCwgMTA6TWlkLCAxMTpMYXN0CisgICAgdW5zaWduZWQgaW50IHVEdXJhdGlvbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXI7CisvLyAgICB1bnNpZ25lZCBpbnQgdUtleUVudHJ5SWR4ID0gTlVNX0tFWV9FTlRSWSsxOworLy8gICAgdW5zaWduZWQgY2hhciBieUtleVNlbCA9IDB4RkY7CisgICAgdW5zaWduZWQgaW50IGNiSVZsZW4gPSAwOworICAgIHVuc2lnbmVkIGludCBjYklDVmxlbiA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiTUlDbGVuID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgY2JGQ1NsZW4gPSA0OworICAgIHVuc2lnbmVkIGludCBjYjgwMl8xX0hfbGVuID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUxlbmd0aCA9IDA7CisgICAgdW5zaWduZWQgaW50IHVUbXBMZW4gPSAwOworLy8gICAgdW5zaWduZWQgY2hhciBhYnlUbXBbOF07CisvLyAgICB1bnNpZ25lZCBsb25nIGR3Q1JDOworICAgIHVuc2lnbmVkIGludCBjYk1JQ0hEUiA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBkd01JQ0tleTAsIGR3TUlDS2V5MTsKKyAgICB1bnNpZ25lZCBsb25nIGR3TUlDX1ByaW9yaXR5OworICAgIHVuc2lnbmVkIGxvbmcgKnBkd01JQ19MOworICAgIHVuc2lnbmVkIGxvbmcgKnBkd01JQ19SOworICAgIHVuc2lnbmVkIGxvbmcgZHdTYWZlTUlDX0wsIGR3U2FmZU1JQ19SOyAvL0ZpeCAiTGFzdCBGcmFnIFNpemUiIDwgIk1JQyBsZW5ndGgiLgorICAgIGJvb2wgYk1JQzJGcmFnID0gZmFsc2U7CisgICAgdW5zaWduZWQgaW50IHVNSUNGcmFnTGVuID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdU1BQ2ZyYWdOdW0gPSAxOworICAgIHVuc2lnbmVkIGludCB1UGFkZGluZyA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiUmVxQ291bnQgPSAwOwogCi0gICAgQk9PTCAgICAgICAgICAgYk5lZWRBQ0s7Ci0gICAgQk9PTCAgICAgICAgICAgYlJUUzsKLSAgICBCT09MICAgICAgICAgICBiSXNBZGhvYzsKLSAgICBQQllURSAgICAgICAgICBwYnlUeXBlOworICAgIGJvb2wgYk5lZWRBQ0s7CisgICAgYm9vbCBiUlRTOworICAgIGJvb2wgYklzQWRob2M7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5VHlwZTsKICAgICBQU1R4RGVzYyAgICAgICBwdGRDdXJyOwogICAgIFBTVHhCdWZIZWFkICAgIHBzVHhCdWZIZCA9IChQU1R4QnVmSGVhZCkgcGJ5VHhCdWZmZXJBZGRyOwotLy8gICAgVUlOVCAgICAgICAgICAgdG1wRGVzY0lkeDsKLSAgICBVSU5UICAgICAgICAgICBjYkhlYWRlckxlbmd0aCA9IDA7CisvLyAgICB1bnNpZ25lZCBpbnQgdG1wRGVzY0lkeDsKKyAgICB1bnNpZ25lZCBpbnQgY2JIZWFkZXJMZW5ndGggPSAwOwogICAgIHZvaWQgKiAgICAgICAgIHB2UnJ2VGltZTsKICAgICBQU01JQ0hEUkhlYWQgICBwTUlDSERSOwogICAgIHZvaWQgKiAgICAgICAgIHB2UlRTOwogICAgIHZvaWQgKiAgICAgICAgIHB2Q1RTOwogICAgIHZvaWQgKiAgICAgICAgIHB2VHhEYXRhSGQ7Ci0gICAgV09SRCAgICAgICAgICAgd1R4QnVmU2l6ZTsgICAvLyBGRmluZm8gc2l6ZQotICAgIFVJTlQgICAgICAgICAgIHVUb3RhbENvcHlMZW5ndGggPSAwOwotICAgIEJZVEUgICAgICAgICAgIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7Ci0gICAgQk9PTCAgICAgICAgICAgYklzV0VQMjU2ID0gRkFMU0U7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4QnVmU2l6ZTsgICAvLyBGRmluZm8gc2l6ZQorICAgIHVuc2lnbmVkIGludCB1VG90YWxDb3B5TGVuZ3RoID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7CisgICAgYm9vbCBiSXNXRVAyNTYgPSBmYWxzZTsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKIAogCkBAIC0xMzk0LDE5ICsxMzcyLDE2IEBACiAgICAgaWYgKChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQURIT0MpIHx8CiAgICAgICAgIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQVApKSB7CiAKLSAgICAgICAgaWYgKElTX01VTFRJQ0FTVF9BRERSRVNTKCYocHNFdGhIZWFkZXItPmFieURzdEFkZHJbMF0pKSB8fAotICAgICAgICAgICAgSVNfQlJPQURDQVNUX0FERFJFU1MoJihwc0V0aEhlYWRlci0+YWJ5RHN0QWRkclswXSkpKSB7Ci0gICAgICAgICAgICBiTmVlZEFDSyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYk5lZWRBQ0sgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGJJc0FkaG9jID0gVFJVRTsKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJihwc0V0aEhlYWRlci0+YWJ5RHN0QWRkclswXSkpKQorCQliTmVlZEFDSyA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiTmVlZEFDSyA9IHRydWU7CisgICAgICAgIGJJc0FkaG9jID0gdHJ1ZTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIC8vIE1TRFVzIGluIEluZnJhIG1vZGUgYWx3YXlzIG5lZWQgQUNLCi0gICAgICAgIGJOZWVkQUNLID0gVFJVRTsKLSAgICAgICAgYklzQWRob2MgPSBGQUxTRTsKKyAgICAgICAgYk5lZWRBQ0sgPSB0cnVlOworICAgICAgICBiSXNBZGhvYyA9IGZhbHNlOwogICAgIH0KIAogICAgIGlmIChwRGV2aWNlLT5iTG9uZ0hlYWRlcikKQEAgLTE0MTUsMTIgKzEzOTAsMTIgQEAKICAgICAgICAgY2JNQUNIZExlbiA9IFdMQU5fSERSX0FERFIzX0xFTjsKIAogCi0gICAgaWYgKChiTmVlZEVuY3J5cHQgPT0gVFJVRSkgJiYgKHBUcmFuc21pdEtleSAhPSBOVUxMKSkgeworICAgIGlmICgoYk5lZWRFbmNyeXB0ID09IHRydWUpICYmIChwVHJhbnNtaXRLZXkgIT0gTlVMTCkpIHsKICAgICAgICAgaWYgKHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX1dFUCkgewogICAgICAgICAgICAgY2JJVmxlbiA9IDQ7CiAgICAgICAgICAgICBjYklDVmxlbiA9IDQ7CiAgICAgICAgICAgICBpZiAocFRyYW5zbWl0S2V5LT51S2V5TGVuZ3RoID09IFdMQU5fV0VQMjMyX0tFWUxFTikgewotICAgICAgICAgICAgICAgIGJJc1dFUDI1NiA9IFRSVUU7CisgICAgICAgICAgICAgICAgYklzV0VQMjU2ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkgewpAQCAtMTQ0MywxNCArMTQxOCwxNCBAQAogCiAgICAgY2JGcmFtZVNpemUgPSBjYk1BQ0hkTGVuICsgY2JJVmxlbiArIChjYkZyYW1lQm9keVNpemUgKyBjYk1JQ2xlbikgKyBjYklDVmxlbiArIGNiRkNTbGVuOwogCi0gICAgaWYgKChiTmVlZEFDSyA9PSBGQUxTRSkgfHwKKyAgICBpZiAoKGJOZWVkQUNLID09IGZhbHNlKSB8fAogICAgICAgICAoY2JGcmFtZVNpemUgPCBwRGV2aWNlLT53UlRTVGhyZXNob2xkKSB8fAogICAgICAgICAoKGNiRnJhbWVTaXplID49IHBEZXZpY2UtPndGcmFnbWVudGF0aW9uVGhyZXNob2xkKSAmJiAocERldmljZS0+d0ZyYWdtZW50YXRpb25UaHJlc2hvbGQgPD0gcERldmljZS0+d1JUU1RocmVzaG9sZCkpCiAgICAgICAgICkgewotICAgICAgICBiUlRTID0gRkFMU0U7CisgICAgICAgIGJSVFMgPSBmYWxzZTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGJSVFMgPSBUUlVFOworICAgICAgICBiUlRTID0gdHJ1ZTsKICAgICAgICAgcHNUeEJ1ZkhkLT53RklGT0N0bCB8PSAoRklGT0NUTF9SVFMgfCBGSUZPQ1RMX0xSRVRSWSk7CiAgICAgfQogICAgIC8vCkBAIC0xNDY5LDcgKzE0NDQsNyBAQAogICAgIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsvLzgwMi4xMWcgcGFja2V0CiAKICAgICAgICAgaWYgKGJ5RkJPcHRpb24gPT0gQVVUT19GQl9OT05FKSB7Ci0gICAgICAgICAgICBpZiAoYlJUUyA9PSBUUlVFKSB7Ly9SVFNfbmVlZAorICAgICAgICAgICAgaWYgKGJSVFMgPT0gdHJ1ZSkgey8vUlRTX25lZWQKICAgICAgICAgICAgICAgICBwdlJydlRpbWUgPSAoUFNScnZUaW1lX2dSVFMpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplKTsKICAgICAgICAgICAgICAgICBwTUlDSERSID0gKFBTTUlDSERSSGVhZCkgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2YoU1JydlRpbWVfZ1JUUykpOwogICAgICAgICAgICAgICAgIHB2UlRTID0gKFBTUlRTX2cpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKFNScnZUaW1lX2dSVFMpICsgY2JNSUNIRFIpOwpAQCAtMTQ4Nyw3ICsxNDYyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEF1dG8gRmFsbCBCYWNrCi0gICAgICAgICAgICBpZiAoYlJUUyA9PSBUUlVFKSB7Ly9SVFNfbmVlZAorICAgICAgICAgICAgaWYgKGJSVFMgPT0gdHJ1ZSkgey8vUlRTX25lZWQKICAgICAgICAgICAgICAgICBwdlJydlRpbWUgPSAoUFNScnZUaW1lX2dSVFMpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplKTsKICAgICAgICAgICAgICAgICBwTUlDSERSID0gKFBTTUlDSERSSGVhZCkgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2YoU1JydlRpbWVfZ1JUUykpOwogICAgICAgICAgICAgICAgIHB2UlRTID0gKFBTUlRTX2dfRkIpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKFNScnZUaW1lX2dSVFMpICsgY2JNSUNIRFIpOwpAQCAtMTUwOCw3ICsxNDgzLDcgQEAKICAgICBlbHNlIHsvLzgwMi4xMWEvYiBwYWNrZXQKIAogICAgICAgICBpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCX05PTkUpIHsKLSAgICAgICAgICAgIGlmIChiUlRTID09IFRSVUUpIHsKKyAgICAgICAgICAgIGlmIChiUlRTID09IHRydWUpIHsKICAgICAgICAgICAgICAgICBwdlJydlRpbWUgPSAoUFNScnZUaW1lX2FiKSAocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgcE1JQ0hEUiA9IChQU01JQ0hEUkhlYWQpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKFNScnZUaW1lX2FiKSk7CiAgICAgICAgICAgICAgICAgcHZSVFMgPSAoUFNSVFNfYWIpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKFNScnZUaW1lX2FiKSArIGNiTUlDSERSKTsKQEAgLTE1MjYsNyArMTUwMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBBdXRvIEZhbGwgQmFjawotICAgICAgICAgICAgaWYgKGJSVFMgPT0gVFJVRSkgey8vUlRTX25lZWQKKyAgICAgICAgICAgIGlmIChiUlRTID09IHRydWUpIHsvL1JUU19uZWVkCiAgICAgICAgICAgICAgICAgcHZScnZUaW1lID0gKFBTUnJ2VGltZV9hYikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUpOwogICAgICAgICAgICAgICAgIHBNSUNIRFIgPSAoUFNNSUNIRFJIZWFkKSAocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihTUnJ2VGltZV9hYikpOwogICAgICAgICAgICAgICAgIHB2UlRTID0gKFBTUlRTX2FfRkIpIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKFNScnZUaW1lX2FiKSArIGNiTUlDSERSKTsKQEAgLTE1NDcsNDAgKzE1MjIsNDAgQEAKICAgICBtZW1zZXQoKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSksIDAsIChjYkhlYWRlckxlbmd0aCAtIHdUeEJ1ZlNpemUpKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgaWYgKChiTmVlZEVuY3J5cHQgPT0gVFJVRSkgJiYgKHBUcmFuc21pdEtleSAhPSBOVUxMKSAmJiAocFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKKyAgICBpZiAoKGJOZWVkRW5jcnlwdCA9PSB0cnVlKSAmJiAocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewogICAgICAgICBpZiAocERldmljZS0+cE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFOT05FKSB7Ci0gICAgICAgICAgICBkd01JQ0tleTAgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7Ci0gICAgICAgICAgICBkd01JQ0tleTEgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CisgICAgICAgICAgICBkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisgICAgICAgICAgICBkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoKHBUcmFuc21pdEtleS0+ZHdLZXlJbmRleCAmIEFVVEhFTlRJQ0FUT1JfS0VZKSAhPSAwKSB7Ci0gICAgICAgICAgICBkd01JQ0tleTAgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7Ci0gICAgICAgICAgICBkd01JQ0tleTEgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CisgICAgICAgICAgICBkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisgICAgICAgICAgICBkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkd01JQ0tleTAgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI0XSk7Ci0gICAgICAgICAgICBkd01JQ0tleTEgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI4XSk7CisgICAgICAgICAgICBkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI0XSk7CisgICAgICAgICAgICBkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI4XSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gRE8gU29mdHdhcmUgTWljaGFlbAogICAgICAgICBNSUNfdkluaXQoZHdNSUNLZXkwLCBkd01JQ0tleTEpOwotICAgICAgICBNSUNfdkFwcGVuZCgoUEJZVEUpJihwc0V0aEhlYWRlci0+YWJ5RHN0QWRkclswXSksIDEyKTsKKyAgICAgICAgTUlDX3ZBcHBlbmQoKHVuc2lnbmVkIGNoYXIgKikmKHBzRXRoSGVhZGVyLT5hYnlEc3RBZGRyWzBdKSwgMTIpOwogICAgICAgICBkd01JQ19Qcmlvcml0eSA9IDA7Ci0gICAgICAgIE1JQ192QXBwZW5kKChQQllURSkmZHdNSUNfUHJpb3JpdHksIDQpOworICAgICAgICBNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSZkd01JQ19Qcmlvcml0eSwgNCk7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iTUlDIEtFWTogJWxYLCAlbFhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKICAgICB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIHBieU1hY0hkciA9IChQQllURSkocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJMZW5ndGgpOwotICAgIHBieVBheWxvYWRIZWFkID0gKFBCWVRFKShwYnlNYWNIZHIgKyBjYk1BQ0hkTGVuICsgdVBhZGRpbmcgKyBjYklWbGVuKTsKLSAgICBwYnlJVkhlYWQgPSAoUEJZVEUpKHBieU1hY0hkciArIGNiTUFDSGRMZW4gKyB1UGFkZGluZyk7CisgICAgcGJ5TWFjSGRyID0gKHVuc2lnbmVkIGNoYXIgKikocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJMZW5ndGgpOworICAgIHBieVBheWxvYWRIZWFkID0gKHVuc2lnbmVkIGNoYXIgKikocGJ5TWFjSGRyICsgY2JNQUNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbik7CisgICAgcGJ5SVZIZWFkID0gKHVuc2lnbmVkIGNoYXIgKikocGJ5TWFjSGRyICsgY2JNQUNIZExlbiArIHVQYWRkaW5nKTsKIAotICAgIGlmICgoY2JGcmFtZVNpemUgPiBwRGV2aWNlLT53RnJhZ21lbnRhdGlvblRocmVzaG9sZCkgJiYgKGJOZWVkQUNLID09IFRSVUUpICYmIChiSXNXRVAyNTYgPT0gRkFMU0UpKSB7CisgICAgaWYgKChjYkZyYW1lU2l6ZSA+IHBEZXZpY2UtPndGcmFnbWVudGF0aW9uVGhyZXNob2xkKSAmJiAoYk5lZWRBQ0sgPT0gdHJ1ZSkgJiYgKGJJc1dFUDI1NiA9PSBmYWxzZSkpIHsKICAgICAgICAgLy8gRnJhZ21lbnRhdGlvbgogICAgICAgICAvLyBGcmFnVGhyZXNob2xkID0gRnJhZ21lbnQgc2l6ZShIZHIrKElWKStmcmFnbWVudCBwYXlsb2FkKyhNSUMpKyhJQ1YpK0ZDUykKICAgICAgICAgY2JGcmFnbWVudFNpemUgPSBwRGV2aWNlLT53RnJhZ21lbnRhdGlvblRocmVzaG9sZDsKICAgICAgICAgY2JGcmFnUGF5bG9hZFNpemUgPSBjYkZyYWdtZW50U2l6ZSAtIGNiTUFDSGRMZW4gLSBjYklWbGVuIC0gY2JJQ1ZsZW4gLSBjYkZDU2xlbjsKICAgICAgICAgLy9GcmFnTnVtID0gKEZyYW1lU2l6ZS0oSGRyK0ZDUykpLyhGcmFnbWVudCBTaXplIC0oSHJkK0ZDUykpKQotICAgICAgICB1TUFDZnJhZ051bSA9IChXT1JEKSAoKGNiRnJhbWVCb2R5U2l6ZSArIGNiTUlDbGVuKSAvIGNiRnJhZ1BheWxvYWRTaXplKTsKKyAgICAgICAgdU1BQ2ZyYWdOdW0gPSAodW5zaWduZWQgc2hvcnQpICgoY2JGcmFtZUJvZHlTaXplICsgY2JNSUNsZW4pIC8gY2JGcmFnUGF5bG9hZFNpemUpOwogICAgICAgICBjYkxhc3RGcmFnUGF5bG9hZFNpemUgPSAoY2JGcmFtZUJvZHlTaXplICsgY2JNSUNsZW4pICUgY2JGcmFnUGF5bG9hZFNpemU7CiAgICAgICAgIGlmIChjYkxhc3RGcmFnUGF5bG9hZFNpemUgPT0gMCkgewogICAgICAgICAgICAgY2JMYXN0RnJhZ1BheWxvYWRTaXplID0gY2JGcmFnUGF5bG9hZFNpemU7CkBAIC0xNjA2LDEzICsxNTgxLDEzIEBACiAgICAgICAgICAgICAgICAgdUR1cmF0aW9uID0gc191RmlsbERhdGFIZWFkKHBEZXZpY2UsIGJ5UGt0VHlwZSwgcHZUeERhdGFIZCwgY2JGcmFnbWVudFNpemUsIHVETUFJZHgsIGJOZWVkQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1RnJhZ0lkeCwgY2JMYXN0RnJhZ21lbnRTaXplLCB1TUFDZnJhZ051bSwgYnlGQk9wdGlvbiwgcERldmljZS0+d0N1cnJlbnRSYXRlKTsKICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBUWCBNQUMgSGVhZGVyCi0gICAgICAgICAgICAgICAgdkdlbmVyYXRlTUFDSGVhZGVyKHBEZXZpY2UsIHBieU1hY0hkciwgKFdPUkQpdUR1cmF0aW9uLCBwc0V0aEhlYWRlciwgYk5lZWRFbmNyeXB0LAorICAgICAgICAgICAgICAgIHZHZW5lcmF0ZU1BQ0hlYWRlcihwRGV2aWNlLCBwYnlNYWNIZHIsICh1bnNpZ25lZCBzaG9ydCl1RHVyYXRpb24sIHBzRXRoSGVhZGVyLCBiTmVlZEVuY3J5cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGcmFnVHlwZSwgdURNQUlkeCwgdUZyYWdJZHgpOwogCi0gICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vRmlsbCBUWEtFWQotICAgICAgICAgICAgICAgICAgICBzX3ZGaWxsVHhLZXkocERldmljZSwgKFBCWVRFKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlNYWNIZHIsIChXT1JEKWNiRnJhZ1BheWxvYWRTaXplLCAoUEJZVEUpcE1JQ0hEUik7CisgICAgICAgICAgICAgICAgICAgIHNfdkZpbGxUeEtleShwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlNYWNIZHIsICh1bnNpZ25lZCBzaG9ydCljYkZyYWdQYXlsb2FkU2l6ZSwgKHVuc2lnbmVkIGNoYXIgKilwTUlDSERSKTsKICAgICAgICAgICAgICAgICAgICAgLy9GaWxsIElWKEV4dElWLFJTTkhEUikKICAgICAgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJFbmFibGVIb3N0V0VQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3VFNDNDdfMTYgPSBwVHJhbnNtaXRLZXktPmR3VFNDNDdfMTY7CkBAIC0xNjI1LDEzICsxNjAwLDEzIEBACiAgICAgICAgICAgICAgICAgaWYgKG50b2hzKHBzRXRoSGVhZGVyLT53VHlwZSkgPiBFVEhfREFUQV9MRU4pIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChwc0V0aEhlYWRlci0+d1R5cGUgPT0gVFlQRV9QS1RfSVBYKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKHBzRXRoSGVhZGVyLT53VHlwZSA9PSBjcHVfdG9fbGUxNigweEYzODApKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KChQQllURSkgKHBieVBheWxvYWRIZWFkKSwgJnBEZXZpY2UtPmFieVNOQVBfQnJpZGdldHVubmVsWzBdLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKSAocGJ5UGF5bG9hZEhlYWQpLCAmcERldmljZS0+YWJ5U05BUF9CcmlkZ2V0dW5uZWxbMF0sIDYpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KChQQllURSkgKHBieVBheWxvYWRIZWFkKSwgJnBEZXZpY2UtPmFieVNOQVBfUkZDMTA0MlswXSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgKHBieVBheWxvYWRIZWFkKSwgJnBEZXZpY2UtPmFieVNOQVBfUkZDMTA0MlswXSwgNik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGJ5VHlwZSA9IChQQllURSkgKHBieVBheWxvYWRIZWFkICsgNik7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShwYnlUeXBlLCAmKHBzRXRoSGVhZGVyLT53VHlwZSksIHNpemVvZihXT1JEKSk7CisgICAgICAgICAgICAgICAgICAgIHBieVR5cGUgPSAodW5zaWduZWQgY2hhciAqKSAocGJ5UGF5bG9hZEhlYWQgKyA2KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBieVR5cGUsICYocHNFdGhIZWFkZXItPndUeXBlKSwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgICAgICAgICAgICAgICAgICAgIGNiODAyXzFfSF9sZW4gPSA4OwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTY0MSwxNSArMTYxNiwxNSBAQAogICAgICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgLy9GaWxsIE1JQ0hEUgogICAgICAgICAgICAgICAgIC8vaWYgKHBEZXZpY2UtPmJBRVMpIHsKLSAgICAgICAgICAgICAgICAvLyAgICBzX3ZGaWxsTUlDSERSKHBEZXZpY2UsIChQQllURSlwTUlDSERSLCBwYnlNYWNIZHIsIChXT1JEKWNiRnJhZ1BheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICAvLyAgICBzX3ZGaWxsTUlDSERSKHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyICopcE1JQ0hEUiwgcGJ5TWFjSGRyLCAodW5zaWduZWQgc2hvcnQpY2JGcmFnUGF5bG9hZFNpemUpOwogICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgIC8vY2JSZXFDb3VudCArPSBzX3VEb0VuY3J5cHRpb24ocERldmljZSwgcHNFdGhIZWFkZXIsICh2b2lkICopcHNUeEJ1ZkhkLCBieUtleVNlbCwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5UGF5bG9hZEhlYWQsIChXT1JEKWNiRnJhZ1BheWxvYWRTaXplLCB1RE1BSWR4KTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5UGF5bG9hZEhlYWQsICh1bnNpZ25lZCBzaG9ydCljYkZyYWdQYXlsb2FkU2l6ZSwgdURNQUlkeCk7CiAKIAogCi0gICAgICAgICAgICAgICAgLy9wYnlCdWZmZXIgPSAoUEJZVEUpcERldmljZS0+YWFtVHhCdWZbdURNQUlkeF1bdURlc2NJZHhdLnBieVZBZGRyOwotICAgICAgICAgICAgICAgIHBieUJ1ZmZlciA9IChQQllURSlwSGVhZFRELT5wVERJbmZvLT5idWY7CisgICAgICAgICAgICAgICAgLy9wYnlCdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKXBEZXZpY2UtPmFhbVR4QnVmW3VETUFJZHhdW3VEZXNjSWR4XS5wYnlWQWRkcjsKKyAgICAgICAgICAgICAgICBwYnlCdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKXBIZWFkVEQtPnBUREluZm8tPmJ1ZjsKIAogICAgICAgICAgICAgICAgIHVMZW5ndGggPSBjYkhlYWRlckxlbmd0aCArIGNiTUFDSGRMZW4gKyB1UGFkZGluZyArIGNiSVZsZW4gKyBjYjgwMl8xX0hfbGVuOwogICAgICAgICAgICAgICAgIC8vY29weSBUeEJ1ZmZlckhlYWRlciArIE1hY0hlYWRlciB0byBkZXNjCkBAIC0xNjYxLDcgKzE2MzYsNyBAQAogCiAgICAgICAgICAgICAgICAgdVRvdGFsQ29weUxlbmd0aCArPSBjYkZyYWdQYXlsb2FkU2l6ZSAtIGNiODAyXzFfSF9sZW47CiAKLSAgICAgICAgICAgICAgICBpZiAoKGJOZWVkRW5jcnlwdCA9PSBUUlVFKSAmJiAocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgeworICAgICAgICAgICAgICAgIGlmICgoYk5lZWRFbmNyeXB0ID09IHRydWUpICYmIChwVHJhbnNtaXRLZXkgIT0gTlVMTCkgJiYgKHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX1RLSVApKSB7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU3RhcnQgTUlDOiAlZFxuIiwgY2JGcmFnUGF5bG9hZFNpemUpOwogICAgICAgICAgICAgICAgICAgICBNSUNfdkFwcGVuZCgocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4pLCBjYkZyYWdQYXlsb2FkU2l6ZSk7CiAKQEAgLTE2NzIsNyArMTY0Nyw3IEBACiAgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJ5TG9jYWxJRCA8PSBSRVZfSURfVlQzMjUzX0ExKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZWRFbmNyeXB0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzX3ZTV2VuY3J5cHRpb24ocERldmljZSwgcFRyYW5zbWl0S2V5LCAocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4pLCAoV09SRCljYkZyYWdQYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzX3ZTV2VuY3J5cHRpb24ocERldmljZSwgcFRyYW5zbWl0S2V5LCAocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4pLCAodW5zaWduZWQgc2hvcnQpY2JGcmFnUGF5bG9hZFNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgY2JSZXFDb3VudCArPSBjYklDVmxlbjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE3MTEsMTMgKzE2ODYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUZyYWdJZHgsIGNiTGFzdEZyYWdtZW50U2l6ZSwgdU1BQ2ZyYWdOdW0sIGJ5RkJPcHRpb24sIHBEZXZpY2UtPndDdXJyZW50UmF0ZSk7CiAKICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBUWCBNQUMgSGVhZGVyCi0gICAgICAgICAgICAgICAgdkdlbmVyYXRlTUFDSGVhZGVyKHBEZXZpY2UsIHBieU1hY0hkciwgKFdPUkQpdUR1cmF0aW9uLCBwc0V0aEhlYWRlciwgYk5lZWRFbmNyeXB0LAorICAgICAgICAgICAgICAgIHZHZW5lcmF0ZU1BQ0hlYWRlcihwRGV2aWNlLCBwYnlNYWNIZHIsICh1bnNpZ25lZCBzaG9ydCl1RHVyYXRpb24sIHBzRXRoSGVhZGVyLCBiTmVlZEVuY3J5cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGcmFnVHlwZSwgdURNQUlkeCwgdUZyYWdJZHgpOwogCi0gICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vRmlsbCBUWEtFWQotICAgICAgICAgICAgICAgICAgICBzX3ZGaWxsVHhLZXkocERldmljZSwgKFBCWVRFKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlNYWNIZHIsIChXT1JEKWNiTGFzdEZyYWdQYXlsb2FkU2l6ZSwgKFBCWVRFKXBNSUNIRFIpOworICAgICAgICAgICAgICAgICAgICBzX3ZGaWxsVHhLZXkocERldmljZSwgKHVuc2lnbmVkIGNoYXIgKikocHNUeEJ1ZkhkLT5hZHdUeEtleSksIHBieUlWSGVhZCwgcFRyYW5zbWl0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5TWFjSGRyLCAodW5zaWduZWQgc2hvcnQpY2JMYXN0RnJhZ1BheWxvYWRTaXplLCAodW5zaWduZWQgY2hhciAqKXBNSUNIRFIpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5kd1RTQzQ3XzE2ID0gcFRyYW5zbWl0S2V5LT5kd1RTQzQ3XzE2OwpAQCAtMTczNCw4ICsxNzA5LDggQEAKIAogCiAKLSAgICAgICAgICAgICAgICBwYnlCdWZmZXIgPSAoUEJZVEUpcEhlYWRURC0+cFRESW5mby0+YnVmOwotICAgICAgICAgICAgICAgIC8vcGJ5QnVmZmVyID0gKFBCWVRFKXBEZXZpY2UtPmFhbVR4QnVmW3VETUFJZHhdW3RtcERlc2NJZHhdLnBieVZBZGRyOworICAgICAgICAgICAgICAgIHBieUJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopcEhlYWRURC0+cFRESW5mby0+YnVmOworICAgICAgICAgICAgICAgIC8vcGJ5QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilwRGV2aWNlLT5hYW1UeEJ1Zlt1RE1BSWR4XVt0bXBEZXNjSWR4XS5wYnlWQWRkcjsKIAogICAgICAgICAgICAgICAgIHVMZW5ndGggPSBjYkhlYWRlckxlbmd0aCArIGNiTUFDSGRMZW4gKyB1UGFkZGluZyArIGNiSVZsZW47CiAKQEAgLTE3NDMsNyArMTcxOCw3IEBACiAgICAgICAgICAgICAgICAgbWVtY3B5KHBieUJ1ZmZlciwgKHZvaWQgKilwc1R4QnVmSGQsIHVMZW5ndGgpOwogCiAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgUGFja2V0IGludG8gYSB0eCBCdWZmZXIKLSAgICAgICAgICAgICAgICBpZiAoYk1JQzJGcmFnID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJNSUMyRnJhZyA9PSBmYWxzZSkgewogCiAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgocGJ5QnVmZmVyICsgdUxlbmd0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGFja2V0ICsgMTQgKyB1VG90YWxDb3B5TGVuZ3RoKSwKQEAgLTE3NTMsMzYgKzE3MjgsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgdVRtcExlbiA9IGNiTGFzdEZyYWdQYXlsb2FkU2l6ZSAtIGNiTUlDbGVuOwogCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoYk5lZWRFbmNyeXB0ID09IFRSVUUpICYmIChwVHJhbnNtaXRLZXkgIT0gTlVMTCkgJiYgKHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX1RLSVApKSB7CisgICAgICAgICAgICAgICAgaWYgKChiTmVlZEVuY3J5cHQgPT0gdHJ1ZSkgJiYgKHBUcmFuc21pdEtleSAhPSBOVUxMKSAmJiAocFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJMQVNUOiB1TUlDRnJhZ0xlbjolZCwgY2JMYXN0RnJhZ1BheWxvYWRTaXplOiVkLCB1VG1wTGVuOiVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TUlDRnJhZ0xlbiwgY2JMYXN0RnJhZ1BheWxvYWRTaXplLCB1VG1wTGVuKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoYk1JQzJGcmFnID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiTUlDMkZyYWcgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1VG1wTGVuICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKHBieUJ1ZmZlciArIHVMZW5ndGgpLCB1VG1wTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkd01JQ19MID0gKFBEV09SRCkocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcGR3TUlDX1IgPSAoUERXT1JEKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGR3TUlDX0wgPSAodW5zaWduZWQgbG9uZyAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwZHdNSUNfUiA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuICsgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBNSUNfdkdldE1JQyhwZHdNSUNfTCwgcGR3TUlDX1IpOwogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJMYXN0IE1JQzolbFgsICVsWFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVNSUNGcmFnTGVuID49IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHBieUJ1ZmZlciArIHVMZW5ndGgpLCAoKFBCWVRFKSZkd1NhZmVNSUNfUiArICh1TUlDRnJhZ0xlbiAtIDQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHBieUJ1ZmZlciArIHVMZW5ndGgpLCAoKHVuc2lnbmVkIGNoYXIgKikmZHdTYWZlTUlDX1IgKyAodU1JQ0ZyYWdMZW4gLSA0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNiTUlDbGVuIC0gdU1JQ0ZyYWdMZW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkxBU1Q6IHVNSUNGcmFnTGVuID49IDQ6ICVYLCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFBCWVRFKSgoUEJZVEUpJmR3U2FmZU1JQ19SICsgKHVNSUNGcmFnTGVuIC0gNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgY2hhciAqKSZkd1NhZmVNSUNfUiArICh1TUlDRnJhZ0xlbiAtIDQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2JNSUNsZW4gLSB1TUlDRnJhZ0xlbikpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgocGJ5QnVmZmVyICsgdUxlbmd0aCksICgoUEJZVEUpJmR3U2FmZU1JQ19MICsgdU1JQ0ZyYWdMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgocGJ5QnVmZmVyICsgdUxlbmd0aCksICgodW5zaWduZWQgY2hhciAqKSZkd1NhZmVNSUNfTCArIHVNSUNGcmFnTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCAtIHVNSUNGcmFnTGVuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KChwYnlCdWZmZXIgKyB1TGVuZ3RoICsgKDQgLSB1TUlDRnJhZ0xlbikpLCAmZHdTYWZlTUlDX1IsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iTEFTVDogdU1JQ0ZyYWdMZW4gPCA0OiAlWCwgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihQQllURSkoKFBCWVRFKSZkd1NhZmVNSUNfUiArIHVNSUNGcmFnTGVuIC0gNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBjaGFyICopKCh1bnNpZ25lZCBjaGFyICopJmR3U2FmZU1JQ19SICsgdU1JQ0ZyYWdMZW4gLSA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2JNSUNsZW4gLSB1TUlDRnJhZ0xlbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGNiTGFzdEZyYWdQYXlsb2FkU2l6ZSArIDggKyAyNDsgaWkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iJTAyeCAiLCAqKChQQllURSkoKHBieUJ1ZmZlciArIHVMZW5ndGgpICsgaWkgLSA4IC0gMjQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIlMDJ4ICIsICooKHVuc2lnbmVkIGNoYXIgKikoKHBieUJ1ZmZlciArIHVMZW5ndGgpICsgaWkgLSA4IC0gMjQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlxuXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzk4LDcgKzE3NzMsNyBAQAogICAgICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5ieUxvY2FsSUQgPD0gUkVWX0lEX1ZUMzI1M19BMSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc192U1dlbmNyeXB0aW9uKHBEZXZpY2UsIHBUcmFuc21pdEtleSwgKHBieUJ1ZmZlciArIHVMZW5ndGgpLCAoV09SRCljYkxhc3RGcmFnUGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgc192U1dlbmNyeXB0aW9uKHBEZXZpY2UsIHBUcmFuc21pdEtleSwgKHBieUJ1ZmZlciArIHVMZW5ndGgpLCAodW5zaWduZWQgc2hvcnQpY2JMYXN0RnJhZ1BheWxvYWRTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNiUmVxQ291bnQgKz0gY2JJQ1ZsZW47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xODQxLDE0ICsxODE2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVGcmFnSWR4LCBjYkxhc3RGcmFnbWVudFNpemUsIHVNQUNmcmFnTnVtLCBieUZCT3B0aW9uLCBwRGV2aWNlLT53Q3VycmVudFJhdGUpOwogCiAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgVFggTUFDIEhlYWRlcgotICAgICAgICAgICAgICAgIHZHZW5lcmF0ZU1BQ0hlYWRlcihwRGV2aWNlLCBwYnlNYWNIZHIsIChXT1JEKXVEdXJhdGlvbiwgcHNFdGhIZWFkZXIsIGJOZWVkRW5jcnlwdCwKKyAgICAgICAgICAgICAgICB2R2VuZXJhdGVNQUNIZWFkZXIocERldmljZSwgcGJ5TWFjSGRyLCAodW5zaWduZWQgc2hvcnQpdUR1cmF0aW9uLCBwc0V0aEhlYWRlciwgYk5lZWRFbmNyeXB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RnJhZ1R5cGUsIHVETUFJZHgsIHVGcmFnSWR4KTsKIAogCi0gICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vRmlsbCBUWEtFWQotICAgICAgICAgICAgICAgICAgICBzX3ZGaWxsVHhLZXkocERldmljZSwgKFBCWVRFKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlNYWNIZHIsIChXT1JEKWNiRnJhZ1BheWxvYWRTaXplLCAoUEJZVEUpcE1JQ0hEUik7CisgICAgICAgICAgICAgICAgICAgIHNfdkZpbGxUeEtleShwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlNYWNIZHIsICh1bnNpZ25lZCBzaG9ydCljYkZyYWdQYXlsb2FkU2l6ZSwgKHVuc2lnbmVkIGNoYXIgKilwTUlDSERSKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAocERldmljZS0+YkVuYWJsZUhvc3RXRVApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uZHdUU0M0N18xNiA9IHBUcmFuc21pdEtleS0+ZHdUU0M0N18xNjsKQEAgLTE4NjIsMTQgKzE4MzcsMTQgQEAKICAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgIC8vRmlsbCBNSUNIRFIKICAgICAgICAgICAgICAgICAvL2lmIChwRGV2aWNlLT5iQUVTKSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgc192RmlsbE1JQ0hEUihwRGV2aWNlLCAoUEJZVEUpcE1JQ0hEUiwgcGJ5TWFjSGRyLCAoV09SRCljYkZyYWdQYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgLy8gICAgc192RmlsbE1JQ0hEUihwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKXBNSUNIRFIsIHBieU1hY0hkciwgKHVuc2lnbmVkIHNob3J0KWNiRnJhZ1BheWxvYWRTaXplKTsKICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAvL2NiUmVxQ291bnQgKz0gc191RG9FbmNyeXB0aW9uKHBEZXZpY2UsIHBzRXRoSGVhZGVyLCAodm9pZCAqKXBzVHhCdWZIZCwgYnlLZXlTZWwsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlQYXlsb2FkSGVhZCwgKFdPUkQpY2JGcmFnUGF5bG9hZFNpemUsIHVETUFJZHgpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5UGF5bG9hZEhlYWQsICh1bnNpZ25lZCBzaG9ydCljYkZyYWdQYXlsb2FkU2l6ZSwgdURNQUlkeCk7CiAKIAotICAgICAgICAgICAgICAgIHBieUJ1ZmZlciA9IChQQllURSlwSGVhZFRELT5wVERJbmZvLT5idWY7Ci0gICAgICAgICAgICAgICAgLy9wYnlCdWZmZXIgPSAoUEJZVEUpcERldmljZS0+YWFtVHhCdWZbdURNQUlkeF1bdG1wRGVzY0lkeF0ucGJ5VkFkZHI7CisgICAgICAgICAgICAgICAgcGJ5QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilwSGVhZFRELT5wVERJbmZvLT5idWY7CisgICAgICAgICAgICAgICAgLy9wYnlCdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKXBEZXZpY2UtPmFhbVR4QnVmW3VETUFJZHhdW3RtcERlc2NJZHhdLnBieVZBZGRyOwogCiAKICAgICAgICAgICAgICAgICB1TGVuZ3RoID0gY2JIZWFkZXJMZW5ndGggKyBjYk1BQ0hkTGVuICsgdVBhZGRpbmcgKyBjYklWbGVuOwpAQCAtMTg4NiwxNyArMTg2MSwxNyBAQAogCiAgICAgICAgICAgICAgICAgdVRvdGFsQ29weUxlbmd0aCArPSB1VG1wTGVuOwogCi0gICAgICAgICAgICAgICAgaWYgKChiTmVlZEVuY3J5cHQgPT0gVFJVRSkgJiYgKHBUcmFuc21pdEtleSAhPSBOVUxMKSAmJiAocFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJOZWVkRW5jcnlwdCA9PSB0cnVlKSAmJiAocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewogCiAgICAgICAgICAgICAgICAgICAgIE1JQ192QXBwZW5kKChwYnlCdWZmZXIgKyB1TGVuZ3RoKSwgdVRtcExlbik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHVUbXBMZW4gPCBjYkZyYWdQYXlsb2FkU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk1JQzJGcmFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJNSUMyRnJhZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB1TUlDRnJhZ0xlbiA9IGNiRnJhZ1BheWxvYWRTaXplIC0gdVRtcExlbjsKICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCh1TUlDRnJhZ0xlbiA8IGNiTUlDbGVuKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgcGR3TUlDX0wgPSAoUERXT1JEKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZHdNSUNfUiA9IChQRFdPUkQpKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuICsgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4gKyA0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIE1JQ192R2V0TUlDKHBkd01JQ19MLCBwZHdNSUNfUik7CiAgICAgICAgICAgICAgICAgICAgICAgICBkd1NhZmVNSUNfTCA9ICpwZHdNSUNfTDsKICAgICAgICAgICAgICAgICAgICAgICAgIGR3U2FmZU1JQ19SID0gKnBkd01JQ19SOwpAQCAtMTkwNiw3ICsxODgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRmlsbCBNSUMgaW4gTWlkZGxlIGZyYWcgWyVkXVxuIiwgdU1JQ0ZyYWdMZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHVNSUNGcmFnTGVuOyBpaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIlMDJ4ICIsICooKFBCWVRFKSgocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4pICsgaWkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIlMDJ4ICIsICooKHVuc2lnbmVkIGNoYXIgKikoKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKSArIGlpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE5MTUsNyArMTg5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iTWlkZGxlIGZyYWcgbGVuOiAlZFxuIiwgdVRtcExlbik7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHVUbXBMZW47IGlpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iJTAyeCAiLCAqKChQQllURSkoKHBieUJ1ZmZlciArIHVMZW5ndGgpICsgaWkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiUwMnggIiwgKigodW5zaWduZWQgY2hhciAqKSgocGJ5QnVmZmVyICsgdUxlbmd0aCkgKyBpaSkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlxuXG4iKTsKICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE5MjYsNyArMTkwMSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJ5TG9jYWxJRCA8PSBSRVZfSURfVlQzMjUzX0ExKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYk5lZWRFbmNyeXB0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzX3ZTV2VuY3J5cHRpb24ocERldmljZSwgcFRyYW5zbWl0S2V5LCAocGJ5QnVmZmVyICsgdUxlbmd0aCksIChXT1JEKWNiRnJhZ1BheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfdlNXZW5jcnlwdGlvbihwRGV2aWNlLCBwVHJhbnNtaXRLZXksIChwYnlCdWZmZXIgKyB1TGVuZ3RoKSwgKHVuc2lnbmVkIHNob3J0KWNiRnJhZ1BheWxvYWRTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNiUmVxQ291bnQgKz0gY2JJQ1ZsZW47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xOTYxLDcgKzE5MzYsNyBAQAogICAgICAgICB3RnJhZ1R5cGUgPSBGUkFHQ1RMX05PTkZSQUc7CiAKICAgICAgICAgLy9TZXQgRnJhZ0N0bCBpbiBUeEJ1ZmZlckhlYWQKLSAgICAgICAgcHNUeEJ1ZkhkLT53RnJhZ0N0bCB8PSAoV09SRCl3RnJhZ1R5cGU7CisgICAgICAgIHBzVHhCdWZIZC0+d0ZyYWdDdGwgfD0gKHVuc2lnbmVkIHNob3J0KXdGcmFnVHlwZTsKIAogICAgICAgICAvL0ZpbGwgRklGTyxScnZUaW1lLFJUUyxhbmQgQ1RTCiAgICAgICAgIHNfdkdlbmVyYXRlVHhQYXJhbWV0ZXIocERldmljZSwgYnlQa3RUeXBlLCAodm9pZCAqKXBzVHhCdWZIZCwgcHZScnZUaW1lLCBwdlJUUywgcHZDVFMsCkBAIC0xOTcxLDEzICsxOTQ2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCB1TUFDZnJhZ051bSwgYnlGQk9wdGlvbiwgcERldmljZS0+d0N1cnJlbnRSYXRlKTsKIAogICAgICAgICAvLyBHZW5lcmF0ZSBUWCBNQUMgSGVhZGVyCi0gICAgICAgIHZHZW5lcmF0ZU1BQ0hlYWRlcihwRGV2aWNlLCBwYnlNYWNIZHIsIChXT1JEKXVEdXJhdGlvbiwgcHNFdGhIZWFkZXIsIGJOZWVkRW5jcnlwdCwKKyAgICAgICAgdkdlbmVyYXRlTUFDSGVhZGVyKHBEZXZpY2UsIHBieU1hY0hkciwgKHVuc2lnbmVkIHNob3J0KXVEdXJhdGlvbiwgcHNFdGhIZWFkZXIsIGJOZWVkRW5jcnlwdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGcmFnVHlwZSwgdURNQUlkeCwgMCk7CiAKLSAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCA9PSBUUlVFKSB7CisgICAgICAgIGlmIChiTmVlZEVuY3J5cHQgPT0gdHJ1ZSkgewogICAgICAgICAgICAgLy9GaWxsIFRYS0VZCi0gICAgICAgICAgICBzX3ZGaWxsVHhLZXkocERldmljZSwgKFBCWVRFKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGJ5TWFjSGRyLCAoV09SRCljYkZyYW1lQm9keVNpemUsIChQQllURSlwTUlDSERSKTsKKyAgICAgICAgICAgIHNfdkZpbGxUeEtleShwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKShwc1R4QnVmSGQtPmFkd1R4S2V5KSwgcGJ5SVZIZWFkLCBwVHJhbnNtaXRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5TWFjSGRyLCAodW5zaWduZWQgc2hvcnQpY2JGcmFtZUJvZHlTaXplLCAodW5zaWduZWQgY2hhciAqKXBNSUNIRFIpOwogCiAgICAgICAgICAgICBpZiAocERldmljZS0+YkVuYWJsZUhvc3RXRVApIHsKICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3VFNDNDdfMTYgPSBwVHJhbnNtaXRLZXktPmR3VFNDNDdfMTY7CkBAIC0xOTg5LDEzICsxOTY0LDEzIEBACiAgICAgICAgIGlmIChudG9ocyhwc0V0aEhlYWRlci0+d1R5cGUpID4gRVRIX0RBVEFfTEVOKSB7CiAgICAgICAgICAgICBpZiAoKHBzRXRoSGVhZGVyLT53VHlwZSA9PSBUWVBFX1BLVF9JUFgpIHx8CiAgICAgICAgICAgICAgICAgKHBzRXRoSGVhZGVyLT53VHlwZSA9PSBjcHVfdG9fbGUxNigweEYzODApKSkgewotICAgICAgICAgICAgICAgIG1lbWNweSgoUEJZVEUpIChwYnlQYXlsb2FkSGVhZCksICZwRGV2aWNlLT5hYnlTTkFQX0JyaWRnZXR1bm5lbFswXSwgNik7CisgICAgICAgICAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopIChwYnlQYXlsb2FkSGVhZCksICZwRGV2aWNlLT5hYnlTTkFQX0JyaWRnZXR1bm5lbFswXSwgNik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKFBCWVRFKSAocGJ5UGF5bG9hZEhlYWQpLCAmcERldmljZS0+YWJ5U05BUF9SRkMxMDQyWzBdLCA2KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgKHBieVBheWxvYWRIZWFkKSwgJnBEZXZpY2UtPmFieVNOQVBfUkZDMTA0MlswXSwgNik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYnlUeXBlID0gKFBCWVRFKSAocGJ5UGF5bG9hZEhlYWQgKyA2KTsKLSAgICAgICAgICAgIG1lbWNweShwYnlUeXBlLCAmKHBzRXRoSGVhZGVyLT53VHlwZSksIHNpemVvZihXT1JEKSk7CisgICAgICAgICAgICBwYnlUeXBlID0gKHVuc2lnbmVkIGNoYXIgKikgKHBieVBheWxvYWRIZWFkICsgNik7CisgICAgICAgICAgICBtZW1jcHkocGJ5VHlwZSwgJihwc0V0aEhlYWRlci0+d1R5cGUpLCBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgICAgICAgICAgIGNiODAyXzFfSF9sZW4gPSA4OwogICAgICAgICB9CiAKQEAgLTIwMDYsMTEgKzE5ODEsMTEgQEAKICAgICAgICAgLy9GaWxsIE1JQ0hEUgogICAgICAgICAvL2lmIChwRGV2aWNlLT5iQUVTKSB7CiAgICAgICAgIC8vICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRmlsbCBNSUNIRFIuLi5cbiIpOwotICAgICAgICAvLyAgICBzX3ZGaWxsTUlDSERSKHBEZXZpY2UsIChQQllURSlwTUlDSERSLCBwYnlNYWNIZHIsIChXT1JEKWNiRnJhbWVCb2R5U2l6ZSk7CisgICAgICAgIC8vICAgIHNfdkZpbGxNSUNIRFIocERldmljZSwgKHVuc2lnbmVkIGNoYXIgKilwTUlDSERSLCBwYnlNYWNIZHIsICh1bnNpZ25lZCBzaG9ydCljYkZyYW1lQm9keVNpemUpOwogICAgICAgICAvL30KIAotICAgICAgICBwYnlCdWZmZXIgPSAoUEJZVEUpcEhlYWRURC0+cFRESW5mby0+YnVmOwotICAgICAgICAvL3BieUJ1ZmZlciA9IChQQllURSlwRGV2aWNlLT5hYW1UeEJ1Zlt1RE1BSWR4XVt1RGVzY0lkeF0ucGJ5VkFkZHI7CisgICAgICAgIHBieUJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopcEhlYWRURC0+cFRESW5mby0+YnVmOworICAgICAgICAvL3BieUJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopcERldmljZS0+YWFtVHhCdWZbdURNQUlkeF1bdURlc2NJZHhdLnBieVZBZGRyOwogCiAgICAgICAgIHVMZW5ndGggPSBjYkhlYWRlckxlbmd0aCArIGNiTUFDSGRMZW4gKyB1UGFkZGluZyArIGNiSVZsZW4gKyBjYjgwMl8xX0hfbGVuOwogCkBAIC0yMDIzLDI5ICsxOTk4LDI5IEBACiAgICAgICAgICAgICAgICAgIGNiRnJhbWVCb2R5U2l6ZSAtIGNiODAyXzFfSF9sZW4KICAgICAgICAgICAgICAgICAgKTsKIAotICAgICAgICBpZiAoKGJOZWVkRW5jcnlwdCA9PSBUUlVFKSAmJiAocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSl7CisgICAgICAgIGlmICgoYk5lZWRFbmNyeXB0ID09IHRydWUpICYmIChwVHJhbnNtaXRLZXkgIT0gTlVMTCkgJiYgKHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9PSBLRVlfQ1RMX1RLSVApKXsKIAogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJMZW5ndGg6JWQsICVkXG4iLCBjYkZyYW1lQm9keVNpemUgLSBjYjgwMl8xX0hfbGVuLCB1TGVuZ3RoKTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoY2JGcmFtZUJvZHlTaXplIC0gY2I4MDJfMV9IX2xlbik7IGlpKyspIHsKLSAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiUwMnggIiwgKigoUEJZVEUpKChwYnlCdWZmZXIgKyB1TGVuZ3RoKSArIGlpKSkpOworICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iJTAyeCAiLCAqKCh1bnNpZ25lZCBjaGFyICopKChwYnlCdWZmZXIgKyB1TGVuZ3RoKSArIGlpKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJcbiIpOwogICAgICAgICAgICAgKi8KIAogICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKHBieUJ1ZmZlciArIHVMZW5ndGggLSBjYjgwMl8xX0hfbGVuKSwgY2JGcmFtZUJvZHlTaXplKTsKIAotICAgICAgICAgICAgcGR3TUlDX0wgPSAoUERXT1JEKShwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiArIGNiRnJhbWVCb2R5U2l6ZSk7Ci0gICAgICAgICAgICBwZHdNSUNfUiA9IChQRFdPUkQpKHBieUJ1ZmZlciArIHVMZW5ndGggLSBjYjgwMl8xX0hfbGVuICsgY2JGcmFtZUJvZHlTaXplICsgNCk7CisgICAgICAgICAgICBwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggLSBjYjgwMl8xX0hfbGVuICsgY2JGcmFtZUJvZHlTaXplKTsKKyAgICAgICAgICAgIHBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4gKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKIAogICAgICAgICAgICAgTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKICAgICAgICAgICAgIE1JQ192VW5Jbml0KCk7CiAKIAotICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJUeE1JQ0ZhaWwgPT0gVFJVRSkgeworICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJUeE1JQ0ZhaWwgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICpwZHdNSUNfTCA9IDA7CiAgICAgICAgICAgICAgICAgKnBkd01JQ19SID0gMDsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5iVHhNSUNGYWlsID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcERldmljZS0+YlR4TUlDRmFpbCA9IGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInVMZW5ndGg6ICVkLCAlZFxuIiwgdUxlbmd0aCwgY2JGcmFtZUJvZHlTaXplKTsKQEAgLTIwNTMsNyArMjAyOCw3IEBACiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIk1JQzolbHgsICVseFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOwogLyoKICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IDg7IGlpKyspIHsKLSAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiUwMnggIiwgKigoKFBCWVRFKShwZHdNSUNfTCkgKyBpaSkpKTsKKyAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiUwMnggIiwgKigoKHVuc2lnbmVkIGNoYXIgKikocGR3TUlDX0wpICsgaWkpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlxuIik7CiAqLwpAQCAtMjA2NCw3ICsyMDM5LDcgQEAKICAgICAgICAgaWYgKChwRGV2aWNlLT5ieUxvY2FsSUQgPD0gUkVWX0lEX1ZUMzI1M19BMSkpewogICAgICAgICAgICAgaWYgKGJOZWVkRW5jcnlwdCkgewogICAgICAgICAgICAgICAgIHNfdlNXZW5jcnlwdGlvbihwRGV2aWNlLCBwVHJhbnNtaXRLZXksIChwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKShjYkZyYW1lQm9keVNpemUgKyBjYk1JQ2xlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpKGNiRnJhbWVCb2R5U2l6ZSArIGNiTUlDbGVuKSk7CiAgICAgICAgICAgICAgICAgY2JSZXFDb3VudCArPSBjYklDVmxlbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjA3OCw3ICsyMDUzLDcgQEAKICAgICAgICAgcHRkQ3Vyci0+YnVmZl9hZGRyID0gY3B1X3RvX2xlMzIocHRkQ3Vyci0+cFRESW5mby0+c2tiX2RtYSk7CiAgIAkgICAgLy9TZXQgVFNSMSAmIFJlcUNvdW50IGluIFR4RGVzY0hlYWQKICAgICAgICAgcHRkQ3Vyci0+bV90ZDFURDEuYnlUQ1IgfD0gKFRDUl9TVFAgfCBUQ1JfRURQIHwgRURNU0RVKTsKLSAgICAgICAgcHRkQ3Vyci0+bV90ZDFURDEud1JlcUNvdW50ID0gY3B1X3RvX2xlMTYoKFdPUkQpKGNiUmVxQ291bnQpKTsKKyAgICAgICAgcHRkQ3Vyci0+bV90ZDFURDEud1JlcUNvdW50ID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KShjYlJlcUNvdW50KSk7CiAKICAgICAgICAgcERldmljZS0+aVREVXNlZFt1RE1BSWR4XSsrOwogCkBAIC0yMDk0LDI2ICsyMDY5LDE2IEBACiAKIAogdm9pZAotdkdlbmVyYXRlRklGT0hlYWRlciAoCi0gICAgUFNEZXZpY2UgICAgICAgICBwRGV2aWNlLAotICAgIEJZVEUgICAgICAgICAgICAgYnlQa3RUeXBlLAotICAgIFBCWVRFICAgICAgICAgICAgcGJ5VHhCdWZmZXJBZGRyLAotICAgIEJPT0wgICAgICAgICAgICAgYk5lZWRFbmNyeXB0LAotICAgIFVJTlQgICAgICAgICAgICAgY2JQYXlsb2FkU2l6ZSwKLSAgICBVSU5UICAgICAgICAgICAgIHVETUFJZHgsCi0gICAgUFNUeERlc2MgICAgICAgICBwSGVhZFRELAotICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIsCi0gICAgUEJZVEUgICAgICAgICAgICBwUGFja2V0LAotICAgIFBTS2V5SXRlbSAgICAgICAgcFRyYW5zbWl0S2V5LAotICAgIFVJTlQgICAgICAgICAgICAgdU5vZGVJbmRleCwKLSAgICBQVUlOVCAgICAgICAgICAgIHB1TUFDZnJhZ051bSwKLSAgICBQVUlOVCAgICAgICAgICAgIHBjYkhlYWRlclNpemUKLSAgICApCit2R2VuZXJhdGVGSUZPSGVhZGVyKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLCB1bnNpZ25lZCBjaGFyICpwYnlUeEJ1ZmZlckFkZHIsCisJYm9vbCBiTmVlZEVuY3J5cHQsIHVuc2lnbmVkIGludCBjYlBheWxvYWRTaXplLCB1bnNpZ25lZCBpbnQgdURNQUlkeCwKKwlQU1R4RGVzYyBwSGVhZFRELCBQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyLCB1bnNpZ25lZCBjaGFyICpwUGFja2V0LAorCVBTS2V5SXRlbSBwVHJhbnNtaXRLZXksIHVuc2lnbmVkIGludCB1Tm9kZUluZGV4LCB1bnNpZ25lZCBpbnQgKnB1TUFDZnJhZ051bSwKKwl1bnNpZ25lZCBpbnQgKnBjYkhlYWRlclNpemUpCiB7Ci0gICAgVUlOVCAgICAgICAgICAgIHdUeEJ1ZlNpemU7ICAgICAgIC8vIEZGaW5mbyBzaXplCi0gICAgQk9PTCAgICAgICAgICAgIGJOZWVkQUNLOwotICAgIEJPT0wgICAgICAgICAgICBiSXNBZGhvYzsKLSAgICBXT1JEICAgICAgICAgICAgY2JNYWNIZExlbjsKKyAgICB1bnNpZ25lZCBpbnQgd1R4QnVmU2l6ZTsgICAgICAgLy8gRkZpbmZvIHNpemUKKyAgICBib29sIGJOZWVkQUNLOworICAgIGJvb2wgYklzQWRob2M7CisgICAgdW5zaWduZWQgc2hvcnQgY2JNYWNIZExlbjsKICAgICBQU1R4QnVmSGVhZCAgICAgcFR4QnVmSGVhZCA9IChQU1R4QnVmSGVhZCkgcGJ5VHhCdWZmZXJBZGRyOwogCiAgICAgd1R4QnVmU2l6ZSA9IHNpemVvZihTVHhCdWZIZWFkKTsKQEAgLTIxMjMsMjIgKzIwODgsMjEgQEAKIAogICAgIGlmICgocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DKSB8fAogICAgICAgICAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSkgewotICAgICAgICBpZiAoSVNfTVVMVElDQVNUX0FERFJFU1MoJihwc0V0aEhlYWRlci0+YWJ5RHN0QWRkclswXSkpIHx8Ci0gICAgICAgICAgICBJU19CUk9BRENBU1RfQUREUkVTUygmKHBzRXRoSGVhZGVyLT5hYnlEc3RBZGRyWzBdKSkpIHsKLSAgICAgICAgICAgIGJOZWVkQUNLID0gRkFMU0U7CisgICAgICAgIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcigmKHBzRXRoSGVhZGVyLT5hYnlEc3RBZGRyWzBdKSkpIHsKKyAgICAgICAgICAgIGJOZWVkQUNLID0gZmFsc2U7CiAgICAgICAgICAgICBwVHhCdWZIZWFkLT53RklGT0N0bCA9IHBUeEJ1ZkhlYWQtPndGSUZPQ3RsICYgKH5GSUZPQ1RMX05FRURBQ0spOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgYk5lZWRBQ0sgPSBUUlVFOworICAgICAgICAgICAgYk5lZWRBQ0sgPSB0cnVlOwogICAgICAgICAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgfD0gRklGT0NUTF9ORUVEQUNLOwogICAgICAgICB9Ci0gICAgICAgIGJJc0FkaG9jID0gVFJVRTsKKyAgICAgICAgYklzQWRob2MgPSB0cnVlOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgLy8gTVNEVXMgaW4gSW5mcmEgbW9kZSBhbHdheXMgbmVlZCBBQ0sKLSAgICAgICAgYk5lZWRBQ0sgPSBUUlVFOworICAgICAgICBiTmVlZEFDSyA9IHRydWU7CiAgICAgICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9IEZJRk9DVExfTkVFREFDSzsKLSAgICAgICAgYklzQWRob2MgPSBGQUxTRTsKKyAgICAgICAgYklzQWRob2MgPSBmYWxzZTsKICAgICB9CiAKIApAQCAtMjE2NSw3ICsyMTI5LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBjYk1hY0hkTGVuID0gV0xBTl9IRFJfQUREUjNfTEVOOwogICAgIH0KLSAgICBwVHhCdWZIZWFkLT53RnJhZ0N0bCB8PSBjcHVfdG9fbGUxNigoV09SRCkoY2JNYWNIZExlbiA8PCAxMCkpOworICAgIHBUeEJ1ZkhlYWQtPndGcmFnQ3RsIHw9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydCkoY2JNYWNIZExlbiA8PCAxMCkpOwogCiAgICAgLy9TZXQgcGFja2V0IHR5cGUKICAgICBpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFBKSB7Ly8wMDAwIDAwMDAgMDAwMCAwMDAwCkBAIC0yMTgxLDcgKzIxNDUsNyBAQAogICAgICAgICBwVHhCdWZIZWFkLT53RklGT0N0bCB8PSBGSUZPQ1RMXzExR0E7CiAgICAgfQogICAgIC8vU2V0IEZJRk9DVExfR3JwQWNrUG9saWN5Ci0gICAgaWYgKHBEZXZpY2UtPmJHcnBBY2tQb2xpY3kgPT0gVFJVRSkgey8vMDAwMCAwMTAwIDAwMDAgMDAwMAorICAgIGlmIChwRGV2aWNlLT5iR3JwQWNrUG9saWN5ID09IHRydWUpIHsvLzAwMDAgMDEwMCAwMDAwIDAwMDAKICAgICAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgfD0JRklGT0NUTF9HUlBBQ0s7CiAgICAgfQogCkBAIC0yMTk1LDcgKzIxNTksNyBAQAogICAgIH0KIAogICAgIC8vU2V0IEZSQUdDVExfV0VQVFlQCi0gICAgcERldmljZS0+YkFFUyA9IEZBTFNFOworICAgIHBEZXZpY2UtPmJBRVMgPSBmYWxzZTsKIAogICAgIC8vU2V0IEZSQUdDVExfV0VQVFlQCiAgICAgaWYgKHBEZXZpY2UtPmJ5TG9jYWxJRCA+IFJFVl9JRF9WVDMyNTNfQTEpIHsKQEAgLTIyNjcsMTMgKzIyMzEsMTMgQEAKIHZvaWQKIHZHZW5lcmF0ZU1BQ0hlYWRlciAoCiAgICAgUFNEZXZpY2UgICAgICAgICBwRGV2aWNlLAotICAgIFBCWVRFICAgICAgICAgICAgcGJ5QnVmZmVyQWRkciwKLSAgICBXT1JEICAgICAgICAgICAgIHdEdXJhdGlvbiwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXJBZGRyLAorICAgIHVuc2lnbmVkIHNob3J0IHdEdXJhdGlvbiwKICAgICBQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyLAotICAgIEJPT0wgICAgICAgICAgICAgYk5lZWRFbmNyeXB0LAotICAgIFdPUkQgICAgICAgICAgICAgd0ZyYWdUeXBlLAotICAgIFVJTlQgICAgICAgICAgICAgdURNQUlkeCwKLSAgICBVSU5UICAgICAgICAgICAgIHVGcmFnSWR4CisgICAgYm9vbCBiTmVlZEVuY3J5cHQsCisgICAgdW5zaWduZWQgc2hvcnQgd0ZyYWdUeXBlLAorICAgIHVuc2lnbmVkIGludCB1RE1BSWR4LAorICAgIHVuc2lnbmVkIGludCB1RnJhZ0lkeAogICAgICkKIHsKICAgICBQUzgwMl8xMUhlYWRlciAgcE1BQ0hlYWRlciA9IChQUzgwMl8xMUhlYWRlcilwYnlCdWZmZXJBZGRyOwpAQCAtMjMwNyw3ICsyMjcxLDcgQEAKICAgICB9CiAKICAgICBpZiAoYk5lZWRFbmNyeXB0KQotICAgICAgICBwTUFDSGVhZGVyLT53RnJhbWVDdGwgfD0gY3B1X3RvX2xlMTYoKFdPUkQpV0xBTl9TRVRfRkNfSVNXRVAoMSkpOworICAgICAgICBwTUFDSGVhZGVyLT53RnJhbWVDdGwgfD0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KVdMQU5fU0VUX0ZDX0lTV0VQKDEpKTsKIAogICAgIHBNQUNIZWFkZXItPndEdXJhdGlvbklEID0gY3B1X3RvX2xlMTYod0R1cmF0aW9uKTsKIApAQCAtMjMxOSw3ICsyMjgzLDcgQEAKICAgICBwTUFDSGVhZGVyLT53U2VxQ3RsID0gY3B1X3RvX2xlMTYocERldmljZS0+d1NlcUNvdW50ZXIgPDwgNCk7CiAKICAgICAvL1NldCBGcmFnTnVtYmVyIGluIFNlcXVlbmNlIENvbnRyb2wKLSAgICBwTUFDSGVhZGVyLT53U2VxQ3RsIHw9IGNwdV90b19sZTE2KChXT1JEKXVGcmFnSWR4KTsKKyAgICBwTUFDSGVhZGVyLT53U2VxQ3RsIHw9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydCl1RnJhZ0lkeCk7CiAKICAgICBpZiAoKHdGcmFnVHlwZSA9PSBGUkFHQ1RMX0VOREZSQUcpIHx8ICh3RnJhZ1R5cGUgPT0gRlJBR0NUTF9OT05GUkFHKSkgewogICAgICAgICBwRGV2aWNlLT53U2VxQ291bnRlcisrOwpAQCAtMjM0MCwzMiArMjMwNCwzMiBAQAogQ01EX1NUQVRVUyBjc01nbXRfeG1pdChQU0RldmljZSBwRGV2aWNlLCBQU1R4TWdtdFBhY2tldCBwUGFja2V0KSB7CiAKICAgICBQU1R4RGVzYyAgICAgICAgcEZyc3RURDsKLSAgICBCWVRFICAgICAgICAgICAgYnlQa3RUeXBlOwotICAgIFBCWVRFICAgICAgICAgICBwYnlUeEJ1ZmZlckFkZHI7CisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGU7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5VHhCdWZmZXJBZGRyOwogICAgIHZvaWQgKiAgICAgICAgICBwdlJUUzsKICAgICBQU0NUUyAgICAgICAgICAgcENUUzsKICAgICB2b2lkICogICAgICAgICAgcHZUeERhdGFIZDsKLSAgICBVSU5UICAgICAgICAgICAgdUR1cmF0aW9uOwotICAgIFVJTlQgICAgICAgICAgICBjYlJlcUNvdW50OworICAgIHVuc2lnbmVkIGludCB1RHVyYXRpb247CisgICAgdW5zaWduZWQgaW50IGNiUmVxQ291bnQ7CiAgICAgUFM4MDJfMTFIZWFkZXIgIHBNQUNIZWFkZXI7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSGVhZGVyU2l6ZTsKLSAgICBVSU5UICAgICAgICAgICAgY2JGcmFtZUJvZHlTaXplOwotICAgIEJPT0wgICAgICAgICAgICBiTmVlZEFDSzsKLSAgICBCT09MICAgICAgICAgICAgYklzUFNQT0xMID0gRkFMU0U7CisgICAgdW5zaWduZWQgaW50IGNiSGVhZGVyU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZUJvZHlTaXplOworICAgIGJvb2wgYk5lZWRBQ0s7CisgICAgYm9vbCBiSXNQU1BPTEwgPSBmYWxzZTsKICAgICBQU1R4QnVmSGVhZCAgICAgcFR4QnVmSGVhZDsKLSAgICBVSU5UICAgICAgICAgICAgY2JGcmFtZVNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSVZsZW4gPSAwOwotICAgIFVJTlQgICAgICAgICAgICBjYklDVmxlbiA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiTUlDbGVuID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgY2JGQ1NsZW4gPSA0OwotICAgIFVJTlQgICAgICAgICAgICB1UGFkZGluZyA9IDA7Ci0gICAgV09SRCAgICAgICAgICAgIHdUeEJ1ZlNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiTWFjSGRMZW47CisgICAgdW5zaWduZWQgaW50IGNiRnJhbWVTaXplOworICAgIHVuc2lnbmVkIGludCBjYklWbGVuID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgY2JJQ1ZsZW4gPSAwOworICAgIHVuc2lnbmVkIGludCBjYk1JQ2xlbiA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiRkNTbGVuID0gNDsKKyAgICB1bnNpZ25lZCBpbnQgdVBhZGRpbmcgPSAwOworICAgIHVuc2lnbmVkIHNob3J0IHdUeEJ1ZlNpemU7CisgICAgdW5zaWduZWQgaW50IGNiTWFjSGRMZW47CiAgICAgU0V0aGVybmV0SGVhZGVyIHNFdGhIZWFkZXI7CiAgICAgdm9pZCAqICAgICAgICAgIHB2UnJ2VGltZTsKICAgICB2b2lkICogICAgICAgICAgcE1JQ0hEUjsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBXT1JEICAgICAgICAgICAgd0N1cnJlbnRSYXRlID0gUkFURV8xTTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VycmVudFJhdGUgPSBSQVRFXzFNOwogCiAKICAgICBpZiAoQVZBSUxfVEQocERldmljZSwgVFlQRV9UWERNQTApIDw9IDApIHsKQEAgLTIzNzMsNyArMjMzNyw3IEBACiAgICAgfQogCiAgICAgcEZyc3RURCA9IHBEZXZpY2UtPmFwQ3VyclREW1RZUEVfVFhETUEwXTsKLSAgICBwYnlUeEJ1ZmZlckFkZHIgPSAoUEJZVEUpcEZyc3RURC0+cFRESW5mby0+YnVmOworICAgIHBieVR4QnVmZmVyQWRkciA9ICh1bnNpZ25lZCBjaGFyICopcEZyc3RURC0+cFRESW5mby0+YnVmOwogICAgIGNiRnJhbWVCb2R5U2l6ZSA9IHBQYWNrZXQtPmNiUGF5bG9hZExlbjsKICAgICBwVHhCdWZIZWFkID0gKFBTVHhCdWZIZWFkKSBwYnlUeEJ1ZmZlckFkZHI7CiAgICAgd1R4QnVmU2l6ZSA9IHNpemVvZihTVHhCdWZIZWFkKTsKQEAgLTI0MjQsMTIgKzIzODgsMTAgQEAKICAgICBwVHhCdWZIZWFkLT53VGltZVN0YW1wID0gY3B1X3RvX2xlMTYoREVGQVVMVF9NR05fTElGRVRJTUVfUkVTXzY0dXMpOwogCiAKLSAgICBpZiAoSVNfTVVMVElDQVNUX0FERFJFU1MoJihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMVswXSkpIHx8Ci0gICAgICAgIElTX0JST0FEQ0FTVF9BRERSRVNTKCYocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjFbMF0pKSkgewotICAgICAgICBiTmVlZEFDSyA9IEZBTFNFOwotICAgIH0KKyAgICBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMVswXSkpKQorICAgICAgICBiTmVlZEFDSyA9IGZhbHNlOwogICAgIGVsc2UgewotICAgICAgICBiTmVlZEFDSyA9IFRSVUU7CisgICAgICAgIGJOZWVkQUNLID0gdHJ1ZTsKICAgICAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgfD0gRklGT0NUTF9ORUVEQUNLOwogICAgIH07CiAKQEAgLTI0NDEsNyArMjQwMyw3IEBACiAgICAgICAgIC8vcERldmljZS0+YnlQcmVhbWJsZVR5cGUgPSBQUkVBTUJMRV9MT05HOwogICAgICAgICAvLyBwcm9iZS1yZXNwb25zZSBkb24ndCByZXRyeQogICAgICAgICAvL2lmICgocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTQud0ZyYW1lQ3RsICYgVFlQRV9TVUJUWVBFX01BU0spID09IFRZUEVfTUdNVF9QUk9CRV9SU1ApIHsKLSAgICAgICAgLy8gICAgIGJOZWVkQUNLID0gRkFMU0U7CisgICAgICAgIC8vICAgICBiTmVlZEFDSyA9IGZhbHNlOwogICAgICAgICAvLyAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgICY9ICh+RklGT0NUTF9ORUVEQUNLKTsKICAgICAgICAgLy99CiAgICAgfQpAQCAtMjQ0OSwxOSArMjQxMSwxOSBAQAogICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9IChGSUZPQ1RMX0dFTklOVCB8IEZJRk9DVExfSVNETUEwKTsKIAogICAgIGlmICgocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTQud0ZyYW1lQ3RsICYgVFlQRV9TVUJUWVBFX01BU0spID09IFRZUEVfQ1RMX1BTUE9MTCkgewotICAgICAgICBiSXNQU1BPTEwgPSBUUlVFOworICAgICAgICBiSXNQU1BPTEwgPSB0cnVlOwogICAgICAgICBjYk1hY0hkTGVuID0gV0xBTl9IRFJfQUREUjJfTEVOOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNiTWFjSGRMZW4gPSBXTEFOX0hEUl9BRERSM19MRU47CiAgICAgfQogCiAgICAgLy9TZXQgRlJBR0NUTF9NQUNIRENOVAotICAgIHBUeEJ1ZkhlYWQtPndGcmFnQ3RsIHw9IGNwdV90b19sZTE2KChXT1JEKShjYk1hY0hkTGVuIDw8IDEwKSk7CisgICAgcFR4QnVmSGVhZC0+d0ZyYWdDdGwgfD0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KShjYk1hY0hkTGVuIDw8IDEwKSk7CiAKICAgICAvLyBOb3RlczoKICAgICAvLyBBbHRob3VnaCBzcGVjIHNheXMgTU1QRFUgY2FuIGJlIGZyYWdtZW50ZWQ7IEluIG1vc3QgY2FzZSwKICAgICAvLyBubyBvbmUgd2lsbCBzZW5kIGEgTU1QRFUgdW5kZXIgZnJhZ21lbnRhdGlvbi4gV2l0aCBSVFMgbWF5IG9jY3VyLgotICAgIHBEZXZpY2UtPmJBRVMgPSBGQUxTRTsgIC8vU2V0IEZSQUdDVExfV0VQVFlQCisgICAgcERldmljZS0+YkFFUyA9IGZhbHNlOyAgLy9TZXQgRlJBR0NUTF9XRVBUWVAKIAogICAgIGlmIChXTEFOX0dFVF9GQ19JU1dFUChwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBNC53RnJhbWVDdGwpICE9IDApIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHsKQEAgLTI0ODIsNyArMjQ0NCw3IEBACiAgICAgICAgICAgICBjYklWbGVuID0gODsvL1JTTiBIZWFkZXIKICAgICAgICAgICAgIGNiSUNWbGVuID0gODsvL01JQwogICAgICAgICAgICAgcFR4QnVmSGVhZC0+d0ZyYWdDdGwgfD0gRlJBR0NUTF9BRVM7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iQUVTID0gVFJVRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJBRVMgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIC8vTUFDIEhlYWRlciBzaG91bGQgYmUgcGFkZGluZyAwIHRvIERXIGFsaWdubWVudC4KICAgICAgICAgdVBhZGRpbmcgPSA0IC0gKGNiTWFjSGRMZW4lNCk7CkBAIC0yNDkyLDcgKzI0NTQsNyBAQAogICAgIGNiRnJhbWVTaXplID0gY2JNYWNIZExlbiArIGNiRnJhbWVCb2R5U2l6ZSArIGNiSVZsZW4gKyBjYk1JQ2xlbiArIGNiSUNWbGVuICsgY2JGQ1NsZW47CiAKICAgICAvL1NldCBGSUZPQ1RMX0dycEFja1BvbGljeQotICAgIGlmIChwRGV2aWNlLT5iR3JwQWNrUG9saWN5ID09IFRSVUUpIHsvLzAwMDAgMDEwMCAwMDAwIDAwMDAKKyAgICBpZiAocERldmljZS0+YkdycEFja1BvbGljeSA9PSB0cnVlKSB7Ly8wMDAwIDAxMDAgMDAwMCAwMDAwCiAgICAgICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9CUZJRk9DVExfR1JQQUNLOwogICAgIH0KICAgICAvL3RoZSByZXN0IG9mIHBUeEJ1ZkhlYWQtPndGcmFnQ3RsOkZyYWdUeXAgd2lsbCBiZSBzZXQgbGF0ZXIgaW4gc192RmlsbEZyYWdQYXJhbWV0ZXIoKQpAQCAtMjUyMyw3ICsyNDg1LDcgQEAKICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAvLyAgICBObyBGcmFnbWVudGF0aW9uCiAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcFR4QnVmSGVhZC0+d0ZyYWdDdGwgfD0gKFdPUkQpRlJBR0NUTF9OT05GUkFHOworICAgIHBUeEJ1ZkhlYWQtPndGcmFnQ3RsIHw9ICh1bnNpZ25lZCBzaG9ydClGUkFHQ1RMX05PTkZSQUc7CiAKIAogICAgIC8vRmlsbCBGSUZPLFJydlRpbWUsUlRTLGFuZCBDVFMKQEAgLTI1MzksMTcgKzI1MDEsMTcgQEAKICAgICBjYlJlcUNvdW50ID0gY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbiArIGNiRnJhbWVCb2R5U2l6ZTsKIAogICAgIGlmIChXTEFOX0dFVF9GQ19JU1dFUChwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBNC53RnJhbWVDdGwpICE9IDApIHsKLSAgICAgICAgUEJZVEUgICAgICAgICAgIHBieUlWSGVhZDsKLSAgICAgICAgUEJZVEUgICAgICAgICAgIHBieVBheWxvYWRIZWFkOwotICAgICAgICBQQllURSAgICAgICAgICAgcGJ5QlNTSUQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBieUlWSGVhZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcGJ5UGF5bG9hZEhlYWQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBieUJTU0lEOwogICAgICAgICBQU0tleUl0ZW0gICAgICAgcFRyYW5zbWl0S2V5ID0gTlVMTDsKIAotICAgICAgICBwYnlJVkhlYWQgPSAoUEJZVEUpKHBieVR4QnVmZmVyQWRkciArIGNiSGVhZGVyU2l6ZSArIGNiTWFjSGRMZW4gKyB1UGFkZGluZyk7Ci0gICAgICAgIHBieVBheWxvYWRIZWFkID0gKFBCWVRFKShwYnlUeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcgKyBjYklWbGVuKTsKKyAgICAgICAgcGJ5SVZIZWFkID0gKHVuc2lnbmVkIGNoYXIgKikocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nKTsKKyAgICAgICAgcGJ5UGF5bG9hZEhlYWQgPSAodW5zaWduZWQgY2hhciAqKShwYnlUeEJ1ZmZlckFkZHIgKyBjYkhlYWRlclNpemUgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcgKyBjYklWbGVuKTsKIAogICAgICAgICAvL0ZpbGwgVFhLRVkKICAgICAgICAgLy9LeWxlOiBOZWVkIGZpeDogVEtJUCBhbmQgQUVTIGRpZCd0IGVuY3J5dCBNbnQgUGFja2V0LgotICAgICAgICAvL3NfdkZpbGxUeEtleShwRGV2aWNlLCAoUEJZVEUpcFR4QnVmSGVhZC0+YWR3VHhLZXksIE5VTEwpOworICAgICAgICAvL3NfdkZpbGxUeEtleShwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKXBUeEJ1ZkhlYWQtPmFkd1R4S2V5LCBOVUxMKTsKIAogICAgICAgICAvL0ZpbGwgSVYoRXh0SVYsUlNOSERSKQogICAgICAgICAvL3NfdkZpbGxQcmVQYXlsb2FkKHBEZXZpY2UsIHBieUlWSGVhZCwgTlVMTCk7CkBAIC0yNTU4LDE2ICsyNTIwLDE2IEBACiAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIC8vRmlsbCBNSUNIRFIKICAgICAgICAgLy9pZiAocERldmljZS0+YkFFUykgewotICAgICAgICAvLyAgICBzX3ZGaWxsTUlDSERSKHBEZXZpY2UsIChQQllURSlwTUlDSERSLCAoUEJZVEUpcE1BQ0hlYWRlciwgKFdPUkQpY2JGcmFtZUJvZHlTaXplKTsKKyAgICAgICAgLy8gICAgc192RmlsbE1JQ0hEUihwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKXBNSUNIRFIsICh1bnNpZ25lZCBjaGFyICopcE1BQ0hlYWRlciwgKHVuc2lnbmVkIHNob3J0KWNiRnJhbWVCb2R5U2l6ZSk7CiAgICAgICAgIC8vfQogICAgICAgICBkbyB7CiAgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYKLSAgICAgICAgICAgICAgICAocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpKSB7CisgICAgICAgICAgICAgICAgKHBEZXZpY2UtPmJMaW5rUGFzcyA9PSB0cnVlKSkgewogICAgICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QlNTSUQ7CiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBhaXJ3aXNlIGtleQotICAgICAgICAgICAgICAgIGlmIChLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIFBBSVJXSVNFX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBpZiAoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBQQUlSV0lTRV9LRVksICZwVHJhbnNtaXRLZXkpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBncm91cCBrZXkKLSAgICAgICAgICAgICAgICAgICAgaWYoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iR2V0IEdUSy5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI1NzgsMTkgKzI1NDAsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGdldCBncm91cCBrZXkKICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QnJvYWRjYXN0QWRkcjsKLSAgICAgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgR1JPVVBfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBGQUxTRSkgeworICAgICAgICAgICAgaWYoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgcFRyYW5zbWl0S2V5ID0gTlVMTDsKICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIktFWSBpcyBOVUxMLiBPUCBNb2RlWyVkXVxuIiwgcERldmljZS0+ZU9QTW9kZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iR2V0IEdUSy5cbiIpOwogICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKEZBTFNFKTsKKyAgICAgICAgfSB3aGlsZShmYWxzZSk7CiAgICAgICAgIC8vRmlsbCBUWEtFWQotICAgICAgICBzX3ZGaWxsVHhLZXkocERldmljZSwgKFBCWVRFKShwVHhCdWZIZWFkLT5hZHdUeEtleSksIHBieUlWSGVhZCwgcFRyYW5zbWl0S2V5LAotICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKXBNQUNIZWFkZXIsIChXT1JEKWNiRnJhbWVCb2R5U2l6ZSwgTlVMTCk7CisgICAgICAgIHNfdkZpbGxUeEtleShwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKShwVHhCdWZIZWFkLT5hZHdUeEtleSksIHBieUlWSGVhZCwgcFRyYW5zbWl0S2V5LAorICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwTUFDSGVhZGVyLCAodW5zaWduZWQgc2hvcnQpY2JGcmFtZUJvZHlTaXplLCBOVUxMKTsKIAogICAgICAgICBtZW1jcHkocE1BQ0hlYWRlciwgcFBhY2tldC0+cDgwMjExSGVhZGVyLCBjYk1hY0hkTGVuKTsKLSAgICAgICAgbWVtY3B5KHBieVBheWxvYWRIZWFkLCAoKFBCWVRFKShwUGFja2V0LT5wODAyMTFIZWFkZXIpICsgY2JNYWNIZExlbiksCisgICAgICAgIG1lbWNweShwYnlQYXlsb2FkSGVhZCwgKCh1bnNpZ25lZCBjaGFyICopKHBQYWNrZXQtPnA4MDIxMUhlYWRlcikgKyBjYk1hY0hkTGVuKSwKICAgICAgICAgICAgICAgICAgY2JGcmFtZUJvZHlTaXplKTsKICAgICB9CiAgICAgZWxzZSB7CkBAIC0yNjIyLDcgKzI1ODQsNyBAQAogICAgIC8vU2V0IFRTUjEgJiBSZXFDb3VudCBpbiBUeERlc2NIZWFkCiAgICAgcEZyc3RURC0+bV90ZDFURDEuYnlUQ1IgPSAoVENSX1NUUCB8IFRDUl9FRFAgfCBFRE1TRFUpOwogICAgIHBGcnN0VEQtPnBUREluZm8tPnNrYl9kbWEgPSBwRnJzdFRELT5wVERJbmZvLT5idWZfZG1hOwotICAgIHBGcnN0VEQtPm1fdGQxVEQxLndSZXFDb3VudCA9IGNwdV90b19sZTE2KChXT1JEKShjYlJlcUNvdW50KSk7CisgICAgcEZyc3RURC0+bV90ZDFURDEud1JlcUNvdW50ID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KShjYlJlcUNvdW50KSk7CiAgICAgcEZyc3RURC0+YnVmZl9hZGRyID0gY3B1X3RvX2xlMzIocEZyc3RURC0+cFRESW5mby0+c2tiX2RtYSk7CiAgICAgcEZyc3RURC0+cFRESW5mby0+YnlGbGFncyA9IDA7CiAKQEAgLTI2MzAsNyArMjU5Miw3IEBACiAgICAgICAgIC8vIERpc2FibGUgUFMKICAgICAgICAgTUFDYlBTV2FrZXVwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogICAgIH0KLSAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IEZBTFNFOworICAgIHBEZXZpY2UtPmJQV0JpdE9uID0gZmFsc2U7CiAKICAgICB3bWIoKTsKICAgICBwRnJzdFRELT5tX3RkMFREMC5mMU93bmVyID0gT1dORURfQllfTklDOwpAQCAtMjY2MSwxNiArMjYyMywxNiBAQAogCiBDTURfU1RBVFVTIGNzQmVhY29uX3htaXQoUFNEZXZpY2UgcERldmljZSwgUFNUeE1nbXRQYWNrZXQgcFBhY2tldCkgewogCi0gICAgQllURSAgICAgICAgICAgICBieVBrdFR5cGU7Ci0gICAgUEJZVEUgICAgICAgICAgICBwYnlCdWZmZXIgPSAoUEJZVEUpcERldmljZS0+dHhfYmVhY29uX2J1ZnM7Ci0gICAgVUlOVCAgICAgICAgICAgICBjYkZyYW1lU2l6ZSA9IHBQYWNrZXQtPmNiTVBEVUxlbiArIFdMQU5fRkNTX0xFTjsKLSAgICBVSU5UICAgICAgICAgICAgIGNiSGVhZGVyU2l6ZSA9IDA7Ci0gICAgV09SRCAgICAgICAgICAgICB3VHhCdWZTaXplID0gc2l6ZW9mKFNUeFNob3J0QnVmSGVhZCk7CisgICAgdW5zaWduZWQgY2hhciBieVBrdFR5cGU7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilwRGV2aWNlLT50eF9iZWFjb25fYnVmczsKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFtZVNpemUgPSBwUGFja2V0LT5jYk1QRFVMZW4gKyBXTEFOX0ZDU19MRU47CisgICAgdW5zaWduZWQgaW50IGNiSGVhZGVyU2l6ZSA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4QnVmU2l6ZSA9IHNpemVvZihTVHhTaG9ydEJ1ZkhlYWQpOwogICAgIFBTVHhTaG9ydEJ1ZkhlYWQgcFR4QnVmSGVhZCA9IChQU1R4U2hvcnRCdWZIZWFkKSBwYnlCdWZmZXI7CiAgICAgUFNUeERhdGFIZWFkX2FiICBwVHhEYXRhSGVhZCA9IChQU1R4RGF0YUhlYWRfYWIpIChwYnlCdWZmZXIgKyB3VHhCdWZTaXplKTsKICAgICBQUzgwMl8xMUhlYWRlciAgIHBNQUNIZWFkZXI7Ci0gICAgV09SRCAgICAgICAgICAgICB3Q3VycmVudFJhdGU7Ci0gICAgV09SRCAgICAgICAgICAgICB3TGVuID0gMHgwMDAwOworICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyZW50UmF0ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TGVuID0gMHgwMDAwOwogCiAKICAgICBtZW1zZXQocFR4QnVmSGVhZCwgMCwgd1R4QnVmU2l6ZSk7CkBAIC0yNjkzLDE3ICsyNjU1LDE3IEBACiAKICAgICAvL1NldCBwYWNrZXQgdHlwZSAmIEdldCBEdXJhdGlvbgogICAgIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUEpIHsvLzAwMDAgMDAwMCAwMDAwIDAwMDAKLSAgICAgICAgcFR4RGF0YUhlYWQtPndEdXJhdGlvbiA9IGNwdV90b19sZTE2KChXT1JEKXNfdUdldERhdGFEdXJhdGlvbihwRGV2aWNlLCBEQVRBRFVSX0EsIGNiRnJhbWVTaXplLCBieVBrdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0N1cnJlbnRSYXRlLCBGQUxTRSwgMCwgMCwgMSwgQVVUT19GQl9OT05FKSk7CisgICAgICAgIHBUeERhdGFIZWFkLT53RHVyYXRpb24gPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQSwgY2JGcmFtZVNpemUsIGJ5UGt0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VycmVudFJhdGUsIGZhbHNlLCAwLCAwLCAxLCBBVVRPX0ZCX05PTkUpKTsKICAgICB9CiAgICAgZWxzZSBpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFCKSB7Ly8wMDAwIDAwMDEgMDAwMCAwMDAwCiAgICAgICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9IEZJRk9DVExfMTFCOwotICAgICAgICBwVHhEYXRhSGVhZC0+d0R1cmF0aW9uID0gY3B1X3RvX2xlMTYoKFdPUkQpc191R2V0RGF0YUR1cmF0aW9uKHBEZXZpY2UsIERBVEFEVVJfQiwgY2JGcmFtZVNpemUsIGJ5UGt0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VycmVudFJhdGUsIEZBTFNFLCAwLCAwLCAxLCBBVVRPX0ZCX05PTkUpKTsKKyAgICAgICAgcFR4RGF0YUhlYWQtPndEdXJhdGlvbiA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydClzX3VHZXREYXRhRHVyYXRpb24ocERldmljZSwgREFUQURVUl9CLCBjYkZyYW1lU2l6ZSwgYnlQa3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDdXJyZW50UmF0ZSwgZmFsc2UsIDAsIDAsIDEsIEFVVE9fRkJfTk9ORSkpOwogICAgIH0KIAogICAgIEJCdkNhY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJ5UGt0VHlwZSwKLSAgICAgICAgKFBXT1JEKSYod0xlbiksIChQQllURSkmKHBUeERhdGFIZWFkLT5ieVNlcnZpY2VGaWVsZCksIChQQllURSkmKHBUeERhdGFIZWFkLT5ieVNpZ25hbEZpZWxkKQorICAgICAgICAodW5zaWduZWQgc2hvcnQgKikmKHdMZW4pLCAodW5zaWduZWQgY2hhciAqKSYocFR4RGF0YUhlYWQtPmJ5U2VydmljZUZpZWxkKSwgKHVuc2lnbmVkIGNoYXIgKikmKHBUeERhdGFIZWFkLT5ieVNpZ25hbEZpZWxkKQogICAgICk7CiAgICAgcFR4RGF0YUhlYWQtPndUcmFuc21pdExlbmd0aCA9IGNwdV90b19sZTE2KHdMZW4pOwogICAgIC8vR2V0IFRpbWVTdGFtcE9mZgpAQCAtMjczNiw0MSArMjY5OCwzOCBAQAogCiAKIAotVUlOVAordW5zaWduZWQgaW50CiBjYkdldEZyYWdDb3VudCAoCiAgICAgUFNEZXZpY2UgICAgICAgICBwRGV2aWNlLAogICAgIFBTS2V5SXRlbSAgICAgICAgcFRyYW5zbWl0S2V5LAotICAgIFVJTlQgICAgICAgICAgICAgY2JGcmFtZUJvZHlTaXplLAorICAgIHVuc2lnbmVkIGludCBjYkZyYW1lQm9keVNpemUsCiAgICAgUFNFdGhlcm5ldEhlYWRlciBwc0V0aEhlYWRlcgogICAgICkKIHsKLSAgICBVSU5UICAgICAgICAgICBjYk1BQ0hkTGVuOwotICAgIFVJTlQgICAgICAgICAgIGNiRnJhbWVTaXplOwotICAgIFVJTlQgICAgICAgICAgIGNiRnJhZ21lbnRTaXplOyAvL0hkcisoSVYpK3BheW9hZCsoTUlDKSsoSUNWKStGQ1MKLSAgICBVSU5UICAgICAgICAgICBjYkZyYWdQYXlsb2FkU2l6ZTsKLSAgICBVSU5UICAgICAgICAgICBjYkxhc3RGcmFnUGF5bG9hZFNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgY2JJVmxlbiA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgY2JJQ1ZsZW4gPSAwOwotICAgIFVJTlQgICAgICAgICAgIGNiTUlDbGVuID0gMDsKLSAgICBVSU5UICAgICAgICAgICBjYkZDU2xlbiA9IDQ7Ci0gICAgVUlOVCAgICAgICAgICAgdU1BQ2ZyYWdOdW0gPSAxOwotICAgIEJPT0wgICAgICAgICAgIGJOZWVkQUNLOworICAgIHVuc2lnbmVkIGludCBjYk1BQ0hkTGVuOworICAgIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgY2JGcmFnbWVudFNpemU7IC8vSGRyKyhJVikrcGF5b2FkKyhNSUMpKyhJQ1YpK0ZDUworICAgIHVuc2lnbmVkIGludCBjYkZyYWdQYXlsb2FkU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgY2JMYXN0RnJhZ1BheWxvYWRTaXplOworICAgIHVuc2lnbmVkIGludCBjYklWbGVuID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgY2JJQ1ZsZW4gPSAwOworICAgIHVuc2lnbmVkIGludCBjYk1JQ2xlbiA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiRkNTbGVuID0gNDsKKyAgICB1bnNpZ25lZCBpbnQgdU1BQ2ZyYWdOdW0gPSAxOworICAgIGJvb2wgYk5lZWRBQ0s7CiAKIAogCiAgICAgaWYgKChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQURIT0MpIHx8CiAgICAgICAgIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQVApKSB7Ci0gICAgICAgIGlmIChJU19NVUxUSUNBU1RfQUREUkVTUygmKHBzRXRoSGVhZGVyLT5hYnlEc3RBZGRyWzBdKSkgfHwKLSAgICAgICAgICAgIElTX0JST0FEQ0FTVF9BRERSRVNTKCYocHNFdGhIZWFkZXItPmFieURzdEFkZHJbMF0pKSkgewotICAgICAgICAgICAgYk5lZWRBQ0sgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkQUNLID0gVFJVRTsKLSAgICAgICAgfQorICAgICAgICBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJihwc0V0aEhlYWRlci0+YWJ5RHN0QWRkclswXSkpKQorICAgICAgICAgICAgYk5lZWRBQ0sgPSBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYk5lZWRBQ0sgPSB0cnVlOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgLy8gTVNEVXMgaW4gSW5mcmEgbW9kZSBhbHdheXMgbmVlZCBBQ0sKLSAgICAgICAgYk5lZWRBQ0sgPSBUUlVFOworICAgICAgICBiTmVlZEFDSyA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKHBEZXZpY2UtPmJMb25nSGVhZGVyKQpAQCAtMjc3OSw3ICsyNzM4LDcgQEAKICAgICAgICAgY2JNQUNIZExlbiA9IFdMQU5fSERSX0FERFIzX0xFTjsKIAogCi0gICAgaWYgKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID09IFRSVUUpIHsKKyAgICBpZiAocERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPT0gdHJ1ZSkgewogCiAgICAgICAgIGlmIChwVHJhbnNtaXRLZXkgPT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKChwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fApAQCAtMjgwOSwxMSArMjc2OCwxMSBAQAogCiAgICAgY2JGcmFtZVNpemUgPSBjYk1BQ0hkTGVuICsgY2JJVmxlbiArIChjYkZyYW1lQm9keVNpemUgKyBjYk1JQ2xlbikgKyBjYklDVmxlbiArIGNiRkNTbGVuOwogCi0gICAgaWYgKChjYkZyYW1lU2l6ZSA+IHBEZXZpY2UtPndGcmFnbWVudGF0aW9uVGhyZXNob2xkKSAmJiAoYk5lZWRBQ0sgPT0gVFJVRSkpIHsKKyAgICBpZiAoKGNiRnJhbWVTaXplID4gcERldmljZS0+d0ZyYWdtZW50YXRpb25UaHJlc2hvbGQpICYmIChiTmVlZEFDSyA9PSB0cnVlKSkgewogICAgICAgICAvLyBGcmFnbWVudGF0aW9uCiAgICAgICAgIGNiRnJhZ21lbnRTaXplID0gcERldmljZS0+d0ZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CiAgICAgICAgIGNiRnJhZ1BheWxvYWRTaXplID0gY2JGcmFnbWVudFNpemUgLSBjYk1BQ0hkTGVuIC0gY2JJVmxlbiAtIGNiSUNWbGVuIC0gY2JGQ1NsZW47Ci0gICAgICAgIHVNQUNmcmFnTnVtID0gKFdPUkQpICgoY2JGcmFtZUJvZHlTaXplICsgY2JNSUNsZW4pIC8gY2JGcmFnUGF5bG9hZFNpemUpOworICAgICAgICB1TUFDZnJhZ051bSA9ICh1bnNpZ25lZCBzaG9ydCkgKChjYkZyYW1lQm9keVNpemUgKyBjYk1JQ2xlbikgLyBjYkZyYWdQYXlsb2FkU2l6ZSk7CiAgICAgICAgIGNiTGFzdEZyYWdQYXlsb2FkU2l6ZSA9IChjYkZyYW1lQm9keVNpemUgKyBjYk1JQ2xlbikgJSBjYkZyYWdQYXlsb2FkU2l6ZTsKICAgICAgICAgaWYgKGNiTGFzdEZyYWdQYXlsb2FkU2l6ZSA9PSAwKSB7CiAgICAgICAgICAgICBjYkxhc3RGcmFnUGF5bG9hZFNpemUgPSBjYkZyYWdQYXlsb2FkU2l6ZTsKQEAgLTI4MjYsNTEgKzI3ODUsNTEgQEAKIAogCiB2b2lkCi12RE1BMF90eF84MDIxMShQU0RldmljZSAgcERldmljZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgUEJZVEUgcGJNUERVLCBVSU5UIGNiTVBEVUxlbikgewordkRNQTBfdHhfODAyMTEoUFNEZXZpY2UgIHBEZXZpY2UsIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKnBiTVBEVSwgdW5zaWduZWQgaW50IGNiTVBEVUxlbikgewogCiAgICAgUFNUeERlc2MgICAgICAgIHBGcnN0VEQ7Ci0gICAgQllURSAgICAgICAgICAgIGJ5UGt0VHlwZTsKLSAgICBQQllURSAgICAgICAgICAgcGJ5VHhCdWZmZXJBZGRyOworICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlOworICAgIHVuc2lnbmVkIGNoYXIgKnBieVR4QnVmZmVyQWRkcjsKICAgICB2b2lkICogICAgICAgICAgcHZSVFM7CiAgICAgdm9pZCAqICAgICAgICAgIHB2Q1RTOwogICAgIHZvaWQgKiAgICAgICAgICBwdlR4RGF0YUhkOwotICAgIFVJTlQgICAgICAgICAgICB1RHVyYXRpb247Ci0gICAgVUlOVCAgICAgICAgICAgIGNiUmVxQ291bnQ7CisgICAgdW5zaWduZWQgaW50IHVEdXJhdGlvbjsKKyAgICB1bnNpZ25lZCBpbnQgY2JSZXFDb3VudDsKICAgICBQUzgwMl8xMUhlYWRlciAgcE1BQ0hlYWRlcjsKLSAgICBVSU5UICAgICAgICAgICAgY2JIZWFkZXJTaXplOwotICAgIFVJTlQgICAgICAgICAgICBjYkZyYW1lQm9keVNpemU7Ci0gICAgQk9PTCAgICAgICAgICAgIGJOZWVkQUNLOwotICAgIEJPT0wgICAgICAgICAgICBiSXNQU1BPTEwgPSBGQUxTRTsKKyAgICB1bnNpZ25lZCBpbnQgY2JIZWFkZXJTaXplOworICAgIHVuc2lnbmVkIGludCBjYkZyYW1lQm9keVNpemU7CisgICAgYm9vbCBiTmVlZEFDSzsKKyAgICBib29sIGJJc1BTUE9MTCA9IGZhbHNlOwogICAgIFBTVHhCdWZIZWFkICAgICBwVHhCdWZIZWFkOwotICAgIFVJTlQgICAgICAgICAgICBjYkZyYW1lU2l6ZTsKLSAgICBVSU5UICAgICAgICAgICAgY2JJVmxlbiA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiSUNWbGVuID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgY2JNSUNsZW4gPSAwOwotICAgIFVJTlQgICAgICAgICAgICBjYkZDU2xlbiA9IDQ7Ci0gICAgVUlOVCAgICAgICAgICAgIHVQYWRkaW5nID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgY2JNSUNIRFIgPSAwOwotICAgIFVJTlQgICAgICAgICAgICB1TGVuZ3RoID0gMDsKLSAgICBEV09SRCAgICAgICAgICAgZHdNSUNLZXkwLCBkd01JQ0tleTE7Ci0gICAgRFdPUkQgICAgICAgICAgIGR3TUlDX1ByaW9yaXR5OwotICAgIFBEV09SRCAgICAgICAgICBwZHdNSUNfTDsKLSAgICBQRFdPUkQgICAgICAgICAgcGR3TUlDX1I7Ci0gICAgV09SRCAgICAgICAgICAgIHdUeEJ1ZlNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgIGNiTWFjSGRMZW47CisgICAgdW5zaWduZWQgaW50IGNiRnJhbWVTaXplOworICAgIHVuc2lnbmVkIGludCBjYklWbGVuID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgY2JJQ1ZsZW4gPSAwOworICAgIHVuc2lnbmVkIGludCBjYk1JQ2xlbiA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiRkNTbGVuID0gNDsKKyAgICB1bnNpZ25lZCBpbnQgdVBhZGRpbmcgPSAwOworICAgIHVuc2lnbmVkIGludCBjYk1JQ0hEUiA9IDA7CisgICAgdW5zaWduZWQgaW50IHVMZW5ndGggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZHdNSUNLZXkwLCBkd01JQ0tleTE7CisgICAgdW5zaWduZWQgbG9uZyBkd01JQ19Qcmlvcml0eTsKKyAgICB1bnNpZ25lZCBsb25nICpwZHdNSUNfTDsKKyAgICB1bnNpZ25lZCBsb25nICpwZHdNSUNfUjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHhCdWZTaXplOworICAgIHVuc2lnbmVkIGludCBjYk1hY0hkTGVuOwogICAgIFNFdGhlcm5ldEhlYWRlciBzRXRoSGVhZGVyOwogICAgIHZvaWQgKiAgICAgICAgICBwdlJydlRpbWU7CiAgICAgdm9pZCAqICAgICAgICAgIHBNSUNIRFI7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgV09SRCAgICAgICAgICAgIHdDdXJyZW50UmF0ZSA9IFJBVEVfMU07CisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlID0gUkFURV8xTTsKICAgICBQVVdMQU5fODAyMTFIRFIgIHA4MDIxMUhlYWRlcjsKLSAgICBVSU5UICAgICAgICAgICAgIHVOb2RlSW5kZXggPSAwOwotICAgIEJPT0wgICAgICAgICAgICBiTm9kZUV4aXN0ID0gRkFMU0U7CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXggPSAwOworICAgIGJvb2wgYk5vZGVFeGlzdCA9IGZhbHNlOwogICAgIFNLZXlJdGVtICAgICAgICBTVGVtcEtleTsKICAgICBQU0tleUl0ZW0gICAgICAgcFRyYW5zbWl0S2V5ID0gTlVMTDsKLSAgICBQQllURSAgICAgICAgICAgcGJ5SVZIZWFkOwotICAgIFBCWVRFICAgICAgICAgICBwYnlQYXlsb2FkSGVhZDsKLSAgICBQQllURSAgICAgICAgICAgcGJ5TWFjSGRyOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUlWSGVhZDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlQYXlsb2FkSGVhZDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlNYWNIZHI7CiAKLSAgICBVSU5UICAgICAgICAgICAgY2JFeHRTdXBwUmF0ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IGNiRXh0U3VwcFJhdGUgPSAwOwogLy8gICAgUFdMQU5fSUUgICAgICAgIHBJdGVtOwogCiAKQEAgLTI4ODYsNyArMjg0NSw3IEBACiAKIAogICAgIHBGcnN0VEQgPSBwRGV2aWNlLT5hcEN1cnJURFtUWVBFX1RYRE1BMF07Ci0gICAgcGJ5VHhCdWZmZXJBZGRyID0gKFBCWVRFKXBGcnN0VEQtPnBUREluZm8tPmJ1ZjsKKyAgICBwYnlUeEJ1ZmZlckFkZHIgPSAodW5zaWduZWQgY2hhciAqKXBGcnN0VEQtPnBUREluZm8tPmJ1ZjsKICAgICBwVHhCdWZIZWFkID0gKFBTVHhCdWZIZWFkKSBwYnlUeEJ1ZmZlckFkZHI7CiAgICAgd1R4QnVmU2l6ZSA9IHNpemVvZihTVHhCdWZIZWFkKTsKICAgICBtZW1zZXQocFR4QnVmSGVhZCwgMCwgd1R4QnVmU2l6ZSk7CkBAIC0yOTM4LDIwICsyODk3LDE5IEBACiAgICAgcFR4QnVmSGVhZC0+d1RpbWVTdGFtcCA9IGNwdV90b19sZTE2KERFRkFVTFRfTUdOX0xJRkVUSU1FX1JFU182NHVzKTsKIAogCi0gICAgaWYgKElTX01VTFRJQ0FTVF9BRERSRVNTKCYocDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjFbMF0pKSB8fAotICAgICAgICBJU19CUk9BRENBU1RfQUREUkVTUygmKHA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIxWzBdKSkpIHsKLSAgICAgICAgYk5lZWRBQ0sgPSBGQUxTRTsKKyAgICBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJihwODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMVswXSkpKSB7CisgICAgICAgIGJOZWVkQUNLID0gZmFsc2U7CiAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewogICAgICAgICAgICAgdU5vZGVJbmRleCA9IDA7Ci0gICAgICAgICAgICBiTm9kZUV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJOb2RlRXhpc3QgPSB0cnVlOwogICAgICAgICB9OwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmJFbmFibGVIb3N0V0VQKSB7Ci0gICAgICAgICAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwRGV2aWNlLT5wTWdtdCwgKFBCWVRFKShwODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSksICZ1Tm9kZUluZGV4KSkKLSAgICAgICAgICAgICAgICBiTm9kZUV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBEZXZpY2UtPnBNZ210LCAodW5zaWduZWQgY2hhciAqKShwODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSksICZ1Tm9kZUluZGV4KSkKKyAgICAgICAgICAgICAgICBiTm9kZUV4aXN0ID0gdHJ1ZTsKICAgICAgICAgfTsKLSAgICAgICAgYk5lZWRBQ0sgPSBUUlVFOworICAgICAgICBiTmVlZEFDSyA9IHRydWU7CiAgICAgICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9IEZJRk9DVExfTkVFREFDSzsKICAgICB9OwogCkBAIC0yOTY0LDcgKzI5MjIsNyBAQAogCiAgICAgICAgIC8vIHByb2JlLXJlc3BvbnNlIGRvbid0IHJldHJ5CiAgICAgICAgIC8vaWYgKChwODAyMTFIZWFkZXItPnNBNC53RnJhbWVDdGwgJiBUWVBFX1NVQlRZUEVfTUFTSykgPT0gVFlQRV9NR01UX1BST0JFX1JTUCkgewotICAgICAgICAvLyAgICAgYk5lZWRBQ0sgPSBGQUxTRTsKKyAgICAgICAgLy8gICAgIGJOZWVkQUNLID0gZmFsc2U7CiAgICAgICAgIC8vICAgICBwVHhCdWZIZWFkLT53RklGT0N0bCAgJj0gKH5GSUZPQ1RMX05FRURBQ0spOwogICAgICAgICAvL30KICAgICB9CkBAIC0yOTcyLDcgKzI5MzAsNyBAQAogICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9IChGSUZPQ1RMX0dFTklOVCB8IEZJRk9DVExfSVNETUEwKTsKIAogICAgIGlmICgocDgwMjExSGVhZGVyLT5zQTQud0ZyYW1lQ3RsICYgVFlQRV9TVUJUWVBFX01BU0spID09IFRZUEVfQ1RMX1BTUE9MTCkgewotICAgICAgICBiSXNQU1BPTEwgPSBUUlVFOworICAgICAgICBiSXNQU1BPTEwgPSB0cnVlOwogICAgICAgICBjYk1hY0hkTGVuID0gV0xBTl9IRFJfQUREUjJfTEVOOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNiTWFjSGRMZW4gPSBXTEFOX0hEUl9BRERSM19MRU47CkBAIC0yOTk2LDEyICsyOTU0LDEyIEBACiAKIAogICAgIC8vU2V0IEZSQUdDVExfTUFDSERDTlQKLSAgICBwVHhCdWZIZWFkLT53RnJhZ0N0bCB8PSBjcHVfdG9fbGUxNigoV09SRCljYk1hY0hkTGVuIDw8IDEwKTsKKyAgICBwVHhCdWZIZWFkLT53RnJhZ0N0bCB8PSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpY2JNYWNIZExlbiA8PCAxMCk7CiAKICAgICAvLyBOb3RlczoKICAgICAvLyBBbHRob3VnaCBzcGVjIHNheXMgTU1QRFUgY2FuIGJlIGZyYWdtZW50ZWQ7IEluIG1vc3QgY2FzZSwKICAgICAvLyBubyBvbmUgd2lsbCBzZW5kIGEgTU1QRFUgdW5kZXIgZnJhZ21lbnRhdGlvbi4gV2l0aCBSVFMgbWF5IG9jY3VyLgotICAgIHBEZXZpY2UtPmJBRVMgPSBGQUxTRTsgIC8vU2V0IEZSQUdDVExfV0VQVFlQCisgICAgcERldmljZS0+YkFFUyA9IGZhbHNlOyAgLy9TZXQgRlJBR0NUTF9XRVBUWVAKIAogCiAgICAgaWYgKFdMQU5fR0VUX0ZDX0lTV0VQKHA4MDIxMUhlYWRlci0+c0E0LndGcmFtZUN0bCkgIT0gMCkgewpAQCAtMzAyNCw3ICsyOTgyLDcgQEAKICAgICAgICAgICAgIGNiSUNWbGVuID0gODsvL01JQwogICAgICAgICAgICAgY2JNSUNIRFIgPSBzaXplb2YoU01JQ0hEUkhlYWQpOwogICAgICAgICAgICAgcFR4QnVmSGVhZC0+d0ZyYWdDdGwgfD0gRlJBR0NUTF9BRVM7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iQUVTID0gVFJVRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJBRVMgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIC8vTUFDIEhlYWRlciBzaG91bGQgYmUgcGFkZGluZyAwIHRvIERXIGFsaWdubWVudC4KICAgICAgICAgdVBhZGRpbmcgPSA0IC0gKGNiTWFjSGRMZW4lNCk7CkBAIC0zMDM0LDcgKzI5OTIsNyBAQAogICAgIGNiRnJhbWVTaXplID0gY2JNYWNIZExlbiArIGNiRnJhbWVCb2R5U2l6ZSArIGNiSVZsZW4gKyBjYk1JQ2xlbiArIGNiSUNWbGVuICsgY2JGQ1NsZW4gKyBjYkV4dFN1cHBSYXRlOwogCiAgICAgLy9TZXQgRklGT0NUTF9HcnBBY2tQb2xpY3kKLSAgICBpZiAocERldmljZS0+YkdycEFja1BvbGljeSA9PSBUUlVFKSB7Ly8wMDAwIDAxMDAgMDAwMCAwMDAwCisgICAgaWYgKHBEZXZpY2UtPmJHcnBBY2tQb2xpY3kgPT0gdHJ1ZSkgey8vMDAwMCAwMTAwIDAwMDAgMDAwMAogICAgICAgICBwVHhCdWZIZWFkLT53RklGT0N0bCB8PQlGSUZPQ1RMX0dSUEFDSzsKICAgICB9CiAgICAgLy90aGUgcmVzdCBvZiBwVHhCdWZIZWFkLT53RnJhZ0N0bDpGcmFnVHlwIHdpbGwgYmUgc2V0IGxhdGVyIGluIHNfdkZpbGxGcmFnUGFyYW1ldGVyKCkKQEAgLTMwNjcsNyArMzAyNSw3IEBACiAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgLy8gICAgTm8gRnJhZ21lbnRhdGlvbgogICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHBUeEJ1ZkhlYWQtPndGcmFnQ3RsIHw9IChXT1JEKUZSQUdDVExfTk9ORlJBRzsKKyAgICBwVHhCdWZIZWFkLT53RnJhZ0N0bCB8PSAodW5zaWduZWQgc2hvcnQpRlJBR0NUTF9OT05GUkFHOwogCiAKICAgICAvL0ZpbGwgRklGTyxScnZUaW1lLFJUUyxhbmQgQ1RTCkBAIC0zMDgyLDkgKzMwNDAsOSBAQAogCiAgICAgY2JSZXFDb3VudCA9IGNiSGVhZGVyU2l6ZSArIGNiTWFjSGRMZW4gKyB1UGFkZGluZyArIGNiSVZsZW4gKyAoY2JGcmFtZUJvZHlTaXplICsgY2JNSUNsZW4pICsgY2JFeHRTdXBwUmF0ZTsKIAotICAgIHBieU1hY0hkciA9IChQQllURSkocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKLSAgICBwYnlQYXlsb2FkSGVhZCA9IChQQllURSkocGJ5TWFjSGRyICsgY2JNYWNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbik7Ci0gICAgcGJ5SVZIZWFkID0gKFBCWVRFKShwYnlNYWNIZHIgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcpOworICAgIHBieU1hY0hkciA9ICh1bnNpZ25lZCBjaGFyICopKHBieVR4QnVmZmVyQWRkciArIGNiSGVhZGVyU2l6ZSk7CisgICAgcGJ5UGF5bG9hZEhlYWQgPSAodW5zaWduZWQgY2hhciAqKShwYnlNYWNIZHIgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcgKyBjYklWbGVuKTsKKyAgICBwYnlJVkhlYWQgPSAodW5zaWduZWQgY2hhciAqKShwYnlNYWNIZHIgKyBjYk1hY0hkTGVuICsgdVBhZGRpbmcpOwogCiAgICAgLy8gQ29weSB0aGUgUGFja2V0IGludG8gYSB0eCBCdWZmZXIKICAgICBtZW1jcHkocGJ5TWFjSGRyLCBwYk1QRFUsIGNiTWFjSGRMZW4pOwpAQCAtMzEyNywzMCArMzA4NSwzMCBAQAogCiAgICAgICAgIGlmICgocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewogCi0gICAgICAgICAgICBkd01JQ0tleTAgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7Ci0gICAgICAgICAgICBkd01JQ0tleTEgPSAqKFBEV09SRCkoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CisgICAgICAgICAgICBkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisgICAgICAgICAgICBkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CiAKICAgICAgICAgICAgIC8vIERPIFNvZnR3YXJlIE1pY2hhZWwKICAgICAgICAgICAgIE1JQ192SW5pdChkd01JQ0tleTAsIGR3TUlDS2V5MSk7Ci0gICAgICAgICAgICBNSUNfdkFwcGVuZCgoUEJZVEUpJihzRXRoSGVhZGVyLmFieURzdEFkZHJbMF0pLCAxMik7CisgICAgICAgICAgICBNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSYoc0V0aEhlYWRlci5hYnlEc3RBZGRyWzBdKSwgMTIpOwogICAgICAgICAgICAgZHdNSUNfUHJpb3JpdHkgPSAwOwotICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKFBCWVRFKSZkd01JQ19Qcmlvcml0eSwgNCk7CisgICAgICAgICAgICBNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSZkd01JQ19Qcmlvcml0eSwgNCk7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkRNQTBfdHhfODAyMTpNSUMgS0VZOiAlbFgsICVsWFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCiAgICAgICAgICAgICB1TGVuZ3RoID0gY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbjsKIAogICAgICAgICAgICAgTUlDX3ZBcHBlbmQoKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGgpLCBjYkZyYW1lQm9keVNpemUpOwogCi0gICAgICAgICAgICBwZHdNSUNfTCA9IChQRFdPUkQpKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUpOwotICAgICAgICAgICAgcGR3TUlDX1IgPSAoUERXT1JEKShwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoICsgY2JGcmFtZUJvZHlTaXplICsgNCk7CisgICAgICAgICAgICBwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUpOworICAgICAgICAgICAgcGR3TUlDX1IgPSAodW5zaWduZWQgbG9uZyAqKShwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoICsgY2JGcmFtZUJvZHlTaXplICsgNCk7CiAKICAgICAgICAgICAgIE1JQ192R2V0TUlDKHBkd01JQ19MLCBwZHdNSUNfUik7CiAgICAgICAgICAgICBNSUNfdlVuSW5pdCgpOwogCi0gICAgICAgICAgICBpZiAocERldmljZS0+YlR4TUlDRmFpbCA9PSBUUlVFKSB7CisgICAgICAgICAgICBpZiAocERldmljZS0+YlR4TUlDRmFpbCA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgKnBkd01JQ19MID0gMDsKICAgICAgICAgICAgICAgICAqcGR3TUlDX1IgPSAwOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJUeE1JQ0ZhaWwgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iVHhNSUNGYWlsID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8idUxlbmd0aDogJWQsICVkXG4iLCB1TGVuZ3RoLCBjYkZyYW1lQm9keVNpemUpOwpAQCAtMzE2MCw4ICszMTE4LDggQEAKICAgICAgICAgfQogCiAKLSAgICAgICAgc192RmlsbFR4S2V5KHBEZXZpY2UsIChQQllURSkocFR4QnVmSGVhZC0+YWR3VHhLZXkpLCBwYnlJVkhlYWQsIHBUcmFuc21pdEtleSwKLSAgICAgICAgICAgICAgICAgICAgIHBieU1hY0hkciwgKFdPUkQpY2JGcmFtZUJvZHlTaXplLCAoUEJZVEUpcE1JQ0hEUik7CisgICAgICAgIHNfdkZpbGxUeEtleShwRGV2aWNlLCAodW5zaWduZWQgY2hhciAqKShwVHhCdWZIZWFkLT5hZHdUeEtleSksIHBieUlWSGVhZCwgcFRyYW5zbWl0S2V5LAorICAgICAgICAgICAgICAgICAgICAgcGJ5TWFjSGRyLCAodW5zaWduZWQgc2hvcnQpY2JGcmFtZUJvZHlTaXplLCAodW5zaWduZWQgY2hhciAqKXBNSUNIRFIpOwogCiAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewogICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5kd1RTQzQ3XzE2ID0gcFRyYW5zbWl0S2V5LT5kd1RTQzQ3XzE2OwpAQCAtMzE2OSw3ICszMTI3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICgocERldmljZS0+YnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQTEpKSB7Ci0gICAgICAgICAgICBzX3ZTV2VuY3J5cHRpb24ocERldmljZSwgcFRyYW5zbWl0S2V5LCBwYnlQYXlsb2FkSGVhZCwgKFdPUkQpKGNiRnJhbWVCb2R5U2l6ZSArIGNiTUlDbGVuKSk7CisgICAgICAgICAgICBzX3ZTV2VuY3J5cHRpb24ocERldmljZSwgcFRyYW5zbWl0S2V5LCBwYnlQYXlsb2FkSGVhZCwgKHVuc2lnbmVkIHNob3J0KShjYkZyYW1lQm9keVNpemUgKyBjYk1JQ2xlbikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMjA4LDcgKzMxNjYsNyBAQAogICAgICAgICAvLyBEaXNhYmxlIFBTCiAgICAgICAgIE1BQ2JQU1dha2V1cChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICB9Ci0gICAgcERldmljZS0+YlBXQml0T24gPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IGZhbHNlOwogCiAgICAgd21iKCk7CiAgICAgcEZyc3RURC0+bV90ZDBURDAuZjFPd25lciA9IE9XTkVEX0JZX05JQzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmgKaW5kZXggYjAwOGZjMi4uZmE4MjdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmgKQEAgLTQwLDY3ICs0MCw0NyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKLXZvaWQgdkdlbmVyYXRlTUFDSGVhZGVyKAotICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgRFdPUkQgZHdUeEJ1ZmZlckFkZHIsCi0gICAgUEJZVEUgcGJ5U2tiRGF0YSwKLSAgICBVSU5UIGNiUGFja2V0U2l6ZSwKLSAgICBCT09MIGJETUEwVXNlZCwKLSAgICBQVUlOVCBwY2JIZWFkU2l6ZSwKLSAgICBQVUlOVCBwY2JBcHBlbmRQYXlsb2FkCi0gICAgICk7Cit2b2lkCit2R2VuZXJhdGVNQUNIZWFkZXIoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgbG9uZyBkd1R4QnVmZmVyQWRkciwgdW5zaWduZWQgY2hhciAqcGJ5U2tiRGF0YSwKKwl1bnNpZ25lZCBpbnQgY2JQYWNrZXRTaXplLCBib29sIGJETUEwVXNlZCwgdW5zaWduZWQgaW50ICpwY2JIZWFkU2l6ZSwKKwl1bnNpZ25lZCBpbnQgKnBjYkFwcGVuZFBheWxvYWQpOwogCi12b2lkIHZQcm9jZXNzUnhNQUNIZWFkZXIgKAotICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgRFdPUkQgZHdSeEJ1ZmZlckFkZHIsCi0gICAgVUlOVCBjYlBhY2tldFNpemUsCi0gICAgQk9PTCBiSXNXRVAsCi0gICAgUFVJTlQgcGNiSGVhZFNpemUKLSAgICApOwordm9pZAordlByb2Nlc3NSeE1BQ0hlYWRlcihQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBsb25nIGR3UnhCdWZmZXJBZGRyLCB1bnNpZ25lZCBpbnQgY2JQYWNrZXRTaXplLAorCWJvb2wgYklzV0VQLCB1bnNpZ25lZCBpbnQgKnBjYkhlYWRTaXplKTsKICovCiAKIAogdm9pZAogdkdlbmVyYXRlTUFDSGVhZGVyICgKICAgICBQU0RldmljZSAgICAgICAgIHBEZXZpY2UsCi0gICAgUEJZVEUgICAgICAgICAgICBwYnlCdWZmZXJBZGRyLAotICAgIFdPUkQgICAgICAgICAgICAgd0R1cmF0aW9uLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlckFkZHIsCisgICAgdW5zaWduZWQgc2hvcnQgd0R1cmF0aW9uLAogICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIsCi0gICAgQk9PTCAgICAgICAgICAgICBiTmVlZEVuY3J5cHQsCi0gICAgV09SRCAgICAgICAgICAgICB3RnJhZ1R5cGUsCi0gICAgVUlOVCAgICAgICAgICAgICB1RE1BSWR4LAotICAgIFVJTlQgICAgICAgICAgICAgdUZyYWdJZHgKKyAgICBib29sIGJOZWVkRW5jcnlwdCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3RnJhZ1R5cGUsCisgICAgdW5zaWduZWQgaW50IHVETUFJZHgsCisgICAgdW5zaWduZWQgaW50IHVGcmFnSWR4CiAgICAgKTsKIAogCi1VSU5UCit1bnNpZ25lZCBpbnQKIGNiR2V0RnJhZ0NvdW50KAogICAgIFBTRGV2aWNlICAgICAgICAgcERldmljZSwKICAgICBQU0tleUl0ZW0gICAgICAgIHBUcmFuc21pdEtleSwKLSAgICBVSU5UICAgICAgICAgICAgIGNiRnJhbWVCb2R5U2l6ZSwKKyAgICB1bnNpZ25lZCBpbnQJY2JGcmFtZUJvZHlTaXplLAogICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIKICAgICApOwogCiAKIHZvaWQKLXZHZW5lcmF0ZUZJRk9IZWFkZXIgKAotICAgIFBTRGV2aWNlICAgICAgICAgcERldmljZSwKLSAgICBCWVRFICAgICAgICAgICAgIGJ5UGt0VHlwLAotICAgIFBCWVRFICAgICAgICAgICAgcGJ5VHhCdWZmZXJBZGRyLAotICAgIEJPT0wgICAgICAgICAgICAgYk5lZWRFbmNyeXB0LAotICAgIFVJTlQgICAgICAgICAgICAgY2JQYXlsb2FkU2l6ZSwKLSAgICBVSU5UICAgICAgICAgICAgIHVETUFJZHgsCi0gICAgUFNUeERlc2MgICAgICAgICBwSGVhZFRELAotICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIsCi0gICAgUEJZVEUgICAgICAgICAgICBwUGFja2V0LAotICAgIFBTS2V5SXRlbSAgICAgICAgcFRyYW5zbWl0S2V5LAotICAgIFVJTlQgICAgICAgICAgICAgdU5vZGVJbmRleCwKLSAgICBQVUlOVCAgICAgICAgICAgIHB1TUFDZnJhZ051bSwKLSAgICBQVUlOVCAgICAgICAgICAgIHBjYkhlYWRlclNpemUKLSAgICApOwordkdlbmVyYXRlRklGT0hlYWRlcihQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBjaGFyIGJ5UGt0VHlwLCB1bnNpZ25lZCBjaGFyICpwYnlUeEJ1ZmZlckFkZHIsCisJYm9vbCBiTmVlZEVuY3J5cHQsIHVuc2lnbmVkIGludAljYlBheWxvYWRTaXplLCB1bnNpZ25lZCBpbnQgdURNQUlkeCwgUFNUeERlc2MgcEhlYWRURCwKKwlQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyLCB1bnNpZ25lZCBjaGFyICpwUGFja2V0LCBQU0tleUl0ZW0gcFRyYW5zbWl0S2V5LAorCXVuc2lnbmVkIGludCB1Tm9kZUluZGV4LCB1bnNpZ25lZCBpbnQgKnB1TUFDZnJhZ051bSwgdW5zaWduZWQgaW50ICpwY2JIZWFkZXJTaXplKTsKIAogCi12b2lkIHZETUEwX3R4XzgwMjExKFBTRGV2aWNlICBwRGV2aWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBQQllURSBwYk1QRFUsIFVJTlQgY2JNUERVTGVuKTsKK3ZvaWQgdkRNQTBfdHhfODAyMTEoUFNEZXZpY2UgIHBEZXZpY2UsIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKnBiTVBEVSwgdW5zaWduZWQgaW50IGNiTVBEVUxlbik7CiBDTURfU1RBVFVTIGNzTWdtdF94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIFBTVHhNZ210UGFja2V0IHBQYWNrZXQpOwogQ01EX1NUQVRVUyBjc0JlYWNvbl94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIFBTVHhNZ210UGFja2V0IHBQYWNrZXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Nyb20uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5jCmluZGV4IDQxODU3NWYuLjZhMGEyMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5jCkBAIC03NiwxMiArNzYsMTIgQEAKICAqIFJldHVybiBWYWx1ZTogZGF0YSByZWFkCiAgKgogICovCi1CWVRFIFNST01ieVJlYWRFbWJlZGRlZChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlDb250bnRPZmZzZXQpCit1bnNpZ25lZCBjaGFyIFNST01ieVJlYWRFbWJlZGRlZCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5Q29udG50T2Zmc2V0KQogewotICAgIFdPUkQgICAgd0RlbGF5LCB3Tm9BQ0s7Ci0gICAgQllURSAgICBieVdhaXQ7Ci0gICAgQllURSAgICBieURhdGE7Ci0gICAgQllURSAgICBieU9yZzsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RGVsYXksIHdOb0FDSzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5V2FpdDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnOwogCiAgICAgYnlEYXRhID0gMHhGRjsKICAgICBWTlN2SW5Qb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfSTJNQ0ZHLCAmYnlPcmcpOwpAQCAtMTIyLDE1ICsxMjIsMTUgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgc3VjY2VlZGVkOyBGQUxTRSBpZiBmYWlsZWQuCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgc3VjY2VlZGVkOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogICovCi1CT09MIFNST01iV3JpdGVFbWJlZGRlZChEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlDb250bnRPZmZzZXQsIEJZVEUgYnlEYXRhKQorYm9vbCBTUk9NYldyaXRlRW1iZWRkZWQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCwgdW5zaWduZWQgY2hhciBieURhdGEpCiB7Ci0gICAgV09SRCAgICB3RGVsYXksIHdOb0FDSzsKLSAgICBCWVRFICAgIGJ5V2FpdDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RGVsYXksIHdOb0FDSzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5V2FpdDsKIAotICAgIEJZVEUgICAgYnlPcmc7CisgICAgdW5zaWduZWQgY2hhciBieU9yZzsKIAogICAgIFZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19JMk1DRkcsICZieU9yZyk7CiAgICAgLyogdHVybiBvZmYgaGFyZHdhcmUgcmV0cnkgZm9yIGdldHRpbmcgTkFDSyAqLwpAQCAtMTU3LDEwICsxNTcsMTAgQEAKICAgICB9CiAgICAgaWYgKHdOb0FDSyA9PSBXX01BWF9JMkNSRVRSWSkgewogICAgICAgICBWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0kyTUNGRywgYnlPcmcpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19JMk1DRkcsIGJ5T3JnKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCkBAIC0xNzgsMTIgKzE3OCwxMiBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIFNST012UmVnQml0c09uKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUNvbnRudE9mZnNldCwgQllURSBieUJpdHMpCit2b2lkIFNST012UmVnQml0c09uKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlDb250bnRPZmZzZXQsIHVuc2lnbmVkIGNoYXIgYnlCaXRzKQogewotICAgIEJZVEUgICAgYnlPcmdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdEYXRhOwogCiAgICAgYnlPcmdEYXRhID0gU1JPTWJ5UmVhZEVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCk7Ci0gICAgU1JPTWJXcml0ZUVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCwoQllURSkoYnlPcmdEYXRhIHwgYnlCaXRzKSk7CisgICAgU1JPTWJXcml0ZUVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCwodW5zaWduZWQgY2hhcikoYnlPcmdEYXRhIHwgYnlCaXRzKSk7CiB9CiAKIApAQCAtMTk5LDEyICsxOTksMTIgQEAKICAqICAgICAgbm9uZQogICoKICAqLwotdm9pZCBTUk9NdlJlZ0JpdHNPZmYoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q29udG50T2Zmc2V0LCBCWVRFIGJ5Qml0cykKK3ZvaWQgU1JPTXZSZWdCaXRzT2ZmKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlDb250bnRPZmZzZXQsIHVuc2lnbmVkIGNoYXIgYnlCaXRzKQogewotICAgIEJZVEUgICAgYnlPcmdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdEYXRhOwogCiAgICAgYnlPcmdEYXRhID0gU1JPTWJ5UmVhZEVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCk7Ci0gICAgU1JPTWJXcml0ZUVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCwoQllURSkoYnlPcmdEYXRhICYgKH5ieUJpdHMpKSk7CisgICAgU1JPTWJXcml0ZUVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCwodW5zaWduZWQgY2hhcikoYnlPcmdEYXRhICYgKH5ieUJpdHMpKSk7CiB9CiAKIApAQCAtMjE5LDEyICsyMTksMTIgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgYWxsIHRlc3QgYml0cyBvbjsgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgYWxsIHRlc3QgYml0cyBvbjsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIFNST01iSXNSZWdCaXRzT24oRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q29udG50T2Zmc2V0LCBCWVRFIGJ5VGVzdEJpdHMpCitib29sIFNST01iSXNSZWdCaXRzT24odW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCwgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKQogewotICAgIEJZVEUgICAgYnlPcmdEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgYnlPcmdEYXRhOwogCiAgICAgYnlPcmdEYXRhID0gU1JPTWJ5UmVhZEVtYmVkZGVkKGR3SW9CYXNlLCBieUNvbnRudE9mZnNldCk7CiAgICAgcmV0dXJuIChieU9yZ0RhdGEgJiBieVRlc3RCaXRzKSA9PSBieVRlc3RCaXRzOwpAQCAtMjQyLDEyICsyNDIsMTIgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgYWxsIHRlc3QgYml0cyBvZmY7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIGFsbCB0ZXN0IGJpdHMgb2ZmOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgU1JPTWJJc1JlZ0JpdHNPZmYoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q29udG50T2Zmc2V0LCBCWVRFIGJ5VGVzdEJpdHMpCitib29sIFNST01iSXNSZWdCaXRzT2ZmKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlDb250bnRPZmZzZXQsIHVuc2lnbmVkIGNoYXIgYnlUZXN0Qml0cykKIHsKLSAgICBCWVRFICAgIGJ5T3JnRGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnRGF0YTsKIAogICAgIGJ5T3JnRGF0YSA9IFNST01ieVJlYWRFbWJlZGRlZChkd0lvQmFzZSwgYnlDb250bnRPZmZzZXQpOwogICAgIHJldHVybiAhKGJ5T3JnRGF0YSAmIGJ5VGVzdEJpdHMpOwpAQCAtMjY2LDEzICsyNjYsMTMgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBTUk9NdlJlYWRBbGxDb250ZW50cyhEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieUVlcHJvbVJlZ3MpCit2b2lkIFNST012UmVhZEFsbENvbnRlbnRzKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieUVlcHJvbVJlZ3MpCiB7CiAgICAgaW50ICAgICBpaTsKIAogICAgIC8qIGlpID0gUm9tIEFkZHJlc3MgKi8KICAgICBmb3IgKGlpID0gMDsgaWkgPCBFRVBfTUFYX0NPTlRFWFRfU0laRTsgaWkrKykgewotICAgICAgICAqcGJ5RWVwcm9tUmVncyA9IFNST01ieVJlYWRFbWJlZGRlZChkd0lvQmFzZSwoQllURSkgaWkpOworICAgICAgICAqcGJ5RWVwcm9tUmVncyA9IFNST01ieVJlYWRFbWJlZGRlZChkd0lvQmFzZSwodW5zaWduZWQgY2hhcikgaWkpOwogICAgICAgICBwYnlFZXByb21SZWdzKys7CiAgICAgfQogfQpAQCAtMjkxLDEzICsyOTEsMTMgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotdm9pZCBTUk9NdldyaXRlQWxsQ29udGVudHMoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlFZXByb21SZWdzKQordm9pZCBTUk9NdldyaXRlQWxsQ29udGVudHModW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RWVwcm9tUmVncykKIHsKICAgICBpbnQgICAgIGlpOwogCiAgICAgLyogaWkgPSBSb20gQWRkcmVzcyAqLwogICAgIGZvciAoaWkgPSAwOyBpaSA8IEVFUF9NQVhfQ09OVEVYVF9TSVpFOyBpaSsrKSB7Ci0gICAgICAgIFNST01iV3JpdGVFbWJlZGRlZChkd0lvQmFzZSwoQllURSkgaWksICpwYnlFZXByb21SZWdzKTsKKyAgICAgICAgU1JPTWJXcml0ZUVtYmVkZGVkKGR3SW9CYXNlLCh1bnNpZ25lZCBjaGFyKSBpaSwgKnBieUVlcHJvbVJlZ3MpOwogICAgICAgICBwYnlFZXByb21SZWdzKys7CiAgICAgfQogfQpAQCAtMzE1LDkgKzMxNSw5IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgU1JPTXZSZWFkRXRoZXJBZGRyZXNzKERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5RXRoZXJBZGRyZXNzKQordm9pZCBTUk9NdlJlYWRFdGhlckFkZHJlc3ModW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RXRoZXJBZGRyZXNzKQogewotICAgIEJZVEUgICAgIGlpOworICAgIHVuc2lnbmVkIGNoYXIgaWk7CiAKICAgICAvKiBpaSA9IFJvbSBBZGRyZXNzICovCiAgICAgZm9yIChpaSA9IDA7IGlpIDwgRVRIX0FMRU47IGlpKyspIHsKQEAgLTM0MCw5ICszNDAsOSBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIFNST012V3JpdGVFdGhlckFkZHJlc3MoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlFdGhlckFkZHJlc3MpCit2b2lkIFNST012V3JpdGVFdGhlckFkZHJlc3ModW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RXRoZXJBZGRyZXNzKQogewotICAgIEJZVEUgICAgIGlpOworICAgIHVuc2lnbmVkIGNoYXIgaWk7CiAKICAgICAvKiBpaSA9IFJvbSBBZGRyZXNzICovCiAgICAgZm9yIChpaSA9IDA7IGlpIDwgRVRIX0FMRU47IGlpKyspIHsKQEAgLTM2NCwxMSArMzY0LDExIEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUKICAqCiAgKi8KLXZvaWQgU1JPTXZSZWFkU3ViU3lzVmVuSWQoRFdPUkRfUFRSIGR3SW9CYXNlLCBQRFdPUkQgcGR3U3ViU3lzVmVuSWQpCit2b2lkIFNST012UmVhZFN1YlN5c1ZlbklkKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgKnBkd1N1YlN5c1ZlbklkKQogewotICAgIFBCWVRFICAgcGJ5RGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlEYXRhOwogCi0gICAgcGJ5RGF0YSA9IChQQllURSlwZHdTdWJTeXNWZW5JZDsKKyAgICBwYnlEYXRhID0gKHVuc2lnbmVkIGNoYXIgKilwZHdTdWJTeXNWZW5JZDsKICAgICAvKiBzdWIgdmVuZG9yICovCiAgICAgKnBieURhdGEgPSBTUk9NYnlSZWFkRW1iZWRkZWQoZHdJb0Jhc2UsIDYpOwogICAgICoocGJ5RGF0YSsxKSA9IFNST01ieVJlYWRFbWJlZGRlZChkd0lvQmFzZSwgNyk7CkBAIC0zODYsMTUgKzM4NiwxNSBAQAogICogIE91dDoKICAqICAgICAgbm9uZQogICoKLSAqIFJldHVybiBWYWx1ZTogVFJVRSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgRkFMU0UKKyAqIFJldHVybiBWYWx1ZTogdHJ1ZSBpZiBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgU1JPTWJBdXRvTG9hZChEV09SRF9QVFIgZHdJb0Jhc2UpCitib29sIFNST01iQXV0b0xvYWQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSkKIHsKLSAgICBCWVRFICAgIGJ5V2FpdDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5V2FpdDsKICAgICBpbnQgICAgIGlpOwogCi0gICAgQllURSAgICBieU9yZzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T3JnOwogCiAgICAgVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0kyTUNGRywgJmJ5T3JnKTsKICAgICAvKiB0dXJuIG9uIGhhcmR3YXJlIHJldHJ5ICovCkBAIC00MTMsOCArNDEzLDggQEAKICAgICBWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0kyTUNGRywgYnlPcmcpOwogCiAgICAgaWYgKGlpID09IEVFUF9NQVhfQ09OVEVYVF9TSVpFKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Nyb20uaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5oCmluZGV4IGRiYjNmNWUuLjRjMjYxZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5oCkBAIC05NywzNCArOTcsMzQgQEAKIC8vICAgICAgMjA0OCBiaXRzID0gMjU2IGJ5dGVzID0gMTI4IHdvcmRzCiAvLwogdHlwZWRlZiBzdHJ1Y3QgdGFnU1Nyb21SZWcgewotICAgIEJZVEUgICAgYWJ5UEFSWzZdOyAgICAgICAgICAgICAgICAgIC8vIDB4MDAgKFdPUkQpCisgICAgdW5zaWduZWQgY2hhciBhYnlQQVJbNl07ICAgICAgICAgICAgICAgICAgLy8gMHgwMCAodW5zaWduZWQgc2hvcnQpCiAKLSAgICBXT1JEICAgIHdTVUJfVklEOyAgICAgICAgICAgICAgICAgICAvLyAweDAzIChXT1JEKQotICAgIFdPUkQgICAgd1NVQl9TSUQ7CisgICAgdW5zaWduZWQgc2hvcnQgd1NVQl9WSUQ7ICAgICAgICAgICAgICAgICAgIC8vIDB4MDMgKHVuc2lnbmVkIHNob3J0KQorICAgIHVuc2lnbmVkIHNob3J0IHdTVUJfU0lEOwogCi0gICAgQllURSAgICBieUJDRkcwOyAgICAgICAgICAgICAgICAgICAgLy8gMHgwNSAoV09SRCkKLSAgICBCWVRFICAgIGJ5QkNGRzE7CisgICAgdW5zaWduZWQgY2hhciBieUJDRkcwOyAgICAgICAgICAgICAgICAgICAgLy8gMHgwNSAodW5zaWduZWQgc2hvcnQpCisgICAgdW5zaWduZWQgY2hhciBieUJDRkcxOwogCi0gICAgQllURSAgICBieUZDUjA7ICAgICAgICAgICAgICAgICAgICAgLy8gMHgwNiAoV09SRCkKLSAgICBCWVRFICAgIGJ5RkNSMTsKLSAgICBCWVRFICAgIGJ5UE1DMDsgICAgICAgICAgICAgICAgICAgICAvLyAweDA3IChXT1JEKQotICAgIEJZVEUgICAgYnlQTUMxOwotICAgIEJZVEUgICAgYnlNQVhMQVQ7ICAgICAgICAgICAgICAgICAgIC8vIDB4MDggKFdPUkQpCi0gICAgQllURSAgICBieU1JTkdOVDsKLSAgICBCWVRFICAgIGJ5Q0ZHMDsgICAgICAgICAgICAgICAgICAgICAvLyAweDA5IChXT1JEKQotICAgIEJZVEUgICAgYnlDRkcxOwotICAgIFdPUkQgICAgd0NJU1BUUjsgICAgICAgICAgICAgICAgICAgIC8vIDB4MEEgKFdPUkQpCi0gICAgV09SRCAgICB3UnN2MDsgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwQiAoV09SRCkKLSAgICBXT1JEICAgIHdSc3YxOyAgICAgICAgICAgICAgICAgICAgICAvLyAweDBDIChXT1JEKQotICAgIEJZVEUgICAgYnlCQlBBSVI7ICAgICAgICAgICAgICAgICAgIC8vIDB4MEQgKFdPUkQpCi0gICAgQllURSAgICBieVJGVFlQRTsKLSAgICBCWVRFICAgIGJ5TWluQ2hhbm5lbDsgICAgICAgICAgICAgICAvLyAweDBFIChXT1JEKQotICAgIEJZVEUgICAgYnlNYXhDaGFubmVsOwotICAgIEJZVEUgICAgYnlTaWduYXR1cmU7ICAgICAgICAgICAgICAgIC8vIDB4MEYgKFdPUkQpCi0gICAgQllURSAgICBieUNoZWNrU3VtOworICAgIHVuc2lnbmVkIGNoYXIgYnlGQ1IwOyAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDYgKHVuc2lnbmVkIHNob3J0KQorICAgIHVuc2lnbmVkIGNoYXIgYnlGQ1IxOworICAgIHVuc2lnbmVkIGNoYXIgYnlQTUMwOyAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDcgKHVuc2lnbmVkIHNob3J0KQorICAgIHVuc2lnbmVkIGNoYXIgYnlQTUMxOworICAgIHVuc2lnbmVkIGNoYXIgYnlNQVhMQVQ7ICAgICAgICAgICAgICAgICAgIC8vIDB4MDggKHVuc2lnbmVkIHNob3J0KQorICAgIHVuc2lnbmVkIGNoYXIgYnlNSU5HTlQ7CisgICAgdW5zaWduZWQgY2hhciBieUNGRzA7ICAgICAgICAgICAgICAgICAgICAgLy8gMHgwOSAodW5zaWduZWQgc2hvcnQpCisgICAgdW5zaWduZWQgY2hhciBieUNGRzE7CisgICAgdW5zaWduZWQgc2hvcnQgd0NJU1BUUjsgICAgICAgICAgICAgICAgICAgIC8vIDB4MEEgKHVuc2lnbmVkIHNob3J0KQorICAgIHVuc2lnbmVkIHNob3J0IHdSc3YwOyAgICAgICAgICAgICAgICAgICAgICAvLyAweDBCICh1bnNpZ25lZCBzaG9ydCkKKyAgICB1bnNpZ25lZCBzaG9ydCB3UnN2MTsgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwQyAodW5zaWduZWQgc2hvcnQpCisgICAgdW5zaWduZWQgY2hhciBieUJCUEFJUjsgICAgICAgICAgICAgICAgICAgLy8gMHgwRCAodW5zaWduZWQgc2hvcnQpCisgICAgdW5zaWduZWQgY2hhciBieVJGVFlQRTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWluQ2hhbm5lbDsgICAgICAgICAgICAgICAvLyAweDBFICh1bnNpZ25lZCBzaG9ydCkKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWF4Q2hhbm5lbDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5U2lnbmF0dXJlOyAgICAgICAgICAgICAgICAvLyAweDBGICh1bnNpZ25lZCBzaG9ydCkKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hlY2tTdW07CiAKLSAgICBCWVRFICAgIGFieVJlc2VydmVkMFs5Nl07ICAgICAgICAgICAvLyAweDEwIChXT1JEKQotICAgIEJZVEUgICAgYWJ5Q0lTWzEyOF07ICAgICAgICAgICAgICAgIC8vIDB4ODAgKFdPUkQpCisgICAgdW5zaWduZWQgY2hhciBhYnlSZXNlcnZlZDBbOTZdOyAgICAgICAgICAgLy8gMHgxMCAodW5zaWduZWQgc2hvcnQpCisgICAgdW5zaWduZWQgY2hhciBhYnlDSVNbMTI4XTsgICAgICAgICAgICAgICAgLy8gMHg4MCAodW5zaWduZWQgc2hvcnQpCiB9IFNTcm9tUmVnLCAqUFNTcm9tUmVnOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTM1LDIzICsxMzUsMjMgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQllURSBTUk9NYnlSZWFkRW1iZWRkZWQoRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q29udG50T2Zmc2V0KTsKLUJPT0wgU1JPTWJXcml0ZUVtYmVkZGVkKERXT1JEX1BUUiBkd0lvQmFzZSwgQllURSBieUNvbnRudE9mZnNldCwgQllURSBieURhdGEpOwordW5zaWduZWQgY2hhciBTUk9NYnlSZWFkRW1iZWRkZWQodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCk7Citib29sIFNST01iV3JpdGVFbWJlZGRlZCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5Q29udG50T2Zmc2V0LCB1bnNpZ25lZCBjaGFyIGJ5RGF0YSk7CiAKLXZvaWQgU1JPTXZSZWdCaXRzT24oRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q29udG50T2Zmc2V0LCBCWVRFIGJ5Qml0cyk7Ci12b2lkIFNST012UmVnQml0c09mZihEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlDb250bnRPZmZzZXQsIEJZVEUgYnlCaXRzKTsKK3ZvaWQgU1JPTXZSZWdCaXRzT24odW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCwgdW5zaWduZWQgY2hhciBieUJpdHMpOwordm9pZCBTUk9NdlJlZ0JpdHNPZmYodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCwgdW5zaWduZWQgY2hhciBieUJpdHMpOwogCi1CT09MIFNST01iSXNSZWdCaXRzT24oRFdPUkRfUFRSIGR3SW9CYXNlLCBCWVRFIGJ5Q29udG50T2Zmc2V0LCBCWVRFIGJ5VGVzdEJpdHMpOwotQk9PTCBTUk9NYklzUmVnQml0c09mZihEV09SRF9QVFIgZHdJb0Jhc2UsIEJZVEUgYnlDb250bnRPZmZzZXQsIEJZVEUgYnlUZXN0Qml0cyk7Citib29sIFNST01iSXNSZWdCaXRzT24odW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCwgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKTsKK2Jvb2wgU1JPTWJJc1JlZ0JpdHNPZmYodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCwgdW5zaWduZWQgY2hhciBieVRlc3RCaXRzKTsKIAotdm9pZCBTUk9NdlJlYWRBbGxDb250ZW50cyhEV09SRF9QVFIgZHdJb0Jhc2UsIFBCWVRFIHBieUVlcHJvbVJlZ3MpOwotdm9pZCBTUk9NdldyaXRlQWxsQ29udGVudHMoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlFZXByb21SZWdzKTsKK3ZvaWQgU1JPTXZSZWFkQWxsQ29udGVudHModW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RWVwcm9tUmVncyk7Cit2b2lkIFNST012V3JpdGVBbGxDb250ZW50cyh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlFZXByb21SZWdzKTsKIAotdm9pZCBTUk9NdlJlYWRFdGhlckFkZHJlc3MoRFdPUkRfUFRSIGR3SW9CYXNlLCBQQllURSBwYnlFdGhlckFkZHJlc3MpOwotdm9pZCBTUk9NdldyaXRlRXRoZXJBZGRyZXNzKERXT1JEX1BUUiBkd0lvQmFzZSwgUEJZVEUgcGJ5RXRoZXJBZGRyZXNzKTsKK3ZvaWQgU1JPTXZSZWFkRXRoZXJBZGRyZXNzKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgKnBieUV0aGVyQWRkcmVzcyk7Cit2b2lkIFNST012V3JpdGVFdGhlckFkZHJlc3ModW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RXRoZXJBZGRyZXNzKTsKIAotdm9pZCBTUk9NdlJlYWRTdWJTeXNWZW5JZChEV09SRF9QVFIgZHdJb0Jhc2UsIFBEV09SRCBwZHdTdWJTeXNWZW5JZCk7Cit2b2lkIFNST012UmVhZFN1YlN5c1ZlbklkKHVuc2lnbmVkIGxvbmcgZHdJb0Jhc2UsIHVuc2lnbmVkIGxvbmcgKnBkd1N1YlN5c1ZlbklkKTsKIAotQk9PTCBTUk9NYkF1dG9Mb2FkIChEV09SRF9QVFIgZHdJb0Jhc2UpOworYm9vbCBTUk9NYkF1dG9Mb2FkICh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKIAogI2VuZGlmIC8vIF9fRUVQUk9NX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90Y3JjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RjcmMuYwppbmRleCA1ZjBjNzQ3Li5mOWMyOGJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90Y3JjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90Y3JjLmMKQEAgLTQyLDcgKzQyLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8vIDMyLWJpdCBDUkMgdGFibGUKLXN0YXRpYyBjb25zdCBEV09SRCBzX2Fkd0NyYzMyVGFibGVbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHNfYWR3Q3JjMzJUYWJsZVsyNTZdID0gewogICAgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhFRTBFNjEyQ0wsIDB4OTkwOTUxQkFMLAogICAgIDB4MDc2REM0MTlMLCAweDcwNkFGNDhGTCwgMHhFOTYzQTUzNUwsIDB4OUU2NDk1QTNMLAogICAgIDB4MEVEQjg4MzJMLCAweDc5RENCOEE0TCwgMHhFMEQ1RTkxRUwsIDB4OTdEMkQ5ODhMLApAQCAtMTMyLDEzICsxMzIsMTMgQEAKICAqIFJldHVybiBWYWx1ZTogQ1JDLTMyCiAgKgogLSovCi1EV09SRCBDUkNkd0NyYzMyIChQQllURSBwYnlEYXRhLCBVSU5UIGNiQnl0ZSwgRFdPUkQgZHdDcmNTZWVkKQordW5zaWduZWQgbG9uZyBDUkNkd0NyYzMyICh1bnNpZ25lZCBjaGFyICpwYnlEYXRhLCB1bnNpZ25lZCBpbnQgY2JCeXRlLCB1bnNpZ25lZCBsb25nIGR3Q3JjU2VlZCkKIHsKLSAgICBEV09SRCBkd0NyYzsKKyAgICB1bnNpZ25lZCBsb25nIGR3Q3JjOwogCiAgICAgZHdDcmMgPSBkd0NyY1NlZWQ7CiAgICAgd2hpbGUgKGNiQnl0ZS0tKSB7Ci0gICAgICAgIGR3Q3JjID0gc19hZHdDcmMzMlRhYmxlWyhCWVRFKSgoZHdDcmMgXiAoKnBieURhdGEpKSAmIDB4RkYpXSBeIChkd0NyYyA+PiA4KTsKKyAgICAgICAgZHdDcmMgPSBzX2Fkd0NyYzMyVGFibGVbKHVuc2lnbmVkIGNoYXIpKChkd0NyYyBeICgqcGJ5RGF0YSkpICYgMHhGRildIF4gKGR3Q3JjID4+IDgpOwogICAgICAgICBwYnlEYXRhKys7CiAgICAgfQogCkBAIC0xNjQsNyArMTY0LDcgQEAKICAqIFJldHVybiBWYWx1ZTogQ1JDLTMyCiAgKgogLSovCi1EV09SRCBDUkNkd0dldENyYzMyIChQQllURSBwYnlEYXRhLCBVSU5UIGNiQnl0ZSkKK3Vuc2lnbmVkIGxvbmcgQ1JDZHdHZXRDcmMzMiAodW5zaWduZWQgY2hhciAqcGJ5RGF0YSwgdW5zaWduZWQgaW50IGNiQnl0ZSkKIHsKICAgICByZXR1cm4gfkNSQ2R3Q3JjMzIocGJ5RGF0YSwgY2JCeXRlLCAweEZGRkZGRkZGTCk7CiB9CkBAIC0xOTAsNyArMTkwLDcgQEAKICAqIFJldHVybiBWYWx1ZTogQ1JDLTMyCiAgKgogLSovCi1EV09SRCBDUkNkd0dldENyYzMyRXgoUEJZVEUgcGJ5RGF0YSwgVUlOVCBjYkJ5dGUsIERXT1JEIGR3UHJlQ1JDKQordW5zaWduZWQgbG9uZyBDUkNkd0dldENyYzMyRXgodW5zaWduZWQgY2hhciAqcGJ5RGF0YSwgdW5zaWduZWQgaW50IGNiQnl0ZSwgdW5zaWduZWQgbG9uZyBkd1ByZUNSQykKIHsKICAgICByZXR1cm4gQ1JDZHdDcmMzMihwYnlEYXRhLCBjYkJ5dGUsIGR3UHJlQ1JDKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdGNyYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90Y3JjLmgKaW5kZXggNWZhYTQ4Yi4uZDA0NDk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90Y3JjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90Y3JjLmgKQEAgLTQzLDkgKzQzLDkgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotRFdPUkQgQ1JDZHdDcmMzMihQQllURSBwYnlEYXRhLCBVSU5UIGNiQnl0ZSwgRFdPUkQgZHdDcmNTZWVkKTsKLURXT1JEIENSQ2R3R2V0Q3JjMzIoUEJZVEUgcGJ5RGF0YSwgVUlOVCBjYkJ5dGUpOwotRFdPUkQgQ1JDZHdHZXRDcmMzMkV4KFBCWVRFIHBieURhdGEsIFVJTlQgY2JCeXRlLCBEV09SRCBkd1ByZUNSQyk7Cit1bnNpZ25lZCBsb25nIENSQ2R3Q3JjMzIodW5zaWduZWQgY2hhciAqcGJ5RGF0YSwgdW5zaWduZWQgaW50IGNiQnl0ZSwgdW5zaWduZWQgbG9uZyBkd0NyY1NlZWQpOwordW5zaWduZWQgbG9uZyBDUkNkd0dldENyYzMyKHVuc2lnbmVkIGNoYXIgKnBieURhdGEsIHVuc2lnbmVkIGludCBjYkJ5dGUpOwordW5zaWduZWQgbG9uZyBDUkNkd0dldENyYzMyRXgodW5zaWduZWQgY2hhciAqcGJ5RGF0YSwgdW5zaWduZWQgaW50IGNiQnl0ZSwgdW5zaWduZWQgbG9uZyBkd1ByZUNSQyk7CiAKICNlbmRpZiAvLyBfX1RDUkNfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdGV0aGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RldGhlci5jCmluZGV4IGQ4YmE2NzMuLjFjZjg1MDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RldGhlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdGV0aGVyLmMKQEAgLTYxLDE0ICs2MSwxNCBAQAogICogUmV0dXJuIFZhbHVlOiBIYXNoIHZhbHVlCiAgKgogICovCi1CWVRFIEVUSGJ5R2V0SGFzaEluZGV4QnlDcmMzMiAoUEJZVEUgcGJ5TXVsdGlBZGRyKQordW5zaWduZWQgY2hhciBFVEhieUdldEhhc2hJbmRleEJ5Q3JjMzIgKHVuc2lnbmVkIGNoYXIgKnBieU11bHRpQWRkcikKIHsKICAgICBpbnQgICAgIGlpOwotICAgIEJZVEUgICAgYnlUbXBIYXNoOwotICAgIEJZVEUgICAgYnlIYXNoID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VG1wSGFzaDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5SGFzaCA9IDA7CiAKICAgICAvLyBnZXQgdGhlIGxlYXN0IDYtYml0cyBmcm9tIENSQyBnZW5lcmF0b3IKLSAgICBieVRtcEhhc2ggPSAoQllURSkoQ1JDZHdDcmMzMihwYnlNdWx0aUFkZHIsIEVUSF9BTEVOLAorICAgIGJ5VG1wSGFzaCA9ICh1bnNpZ25lZCBjaGFyKShDUkNkd0NyYzMyKHBieU11bHRpQWRkciwgRVRIX0FMRU4sCiAgICAgICAgICAgICAweEZGRkZGRkZGTCkgJiAweDNGKTsKICAgICAvLyByZXZlcnNlIG1vc3QgYml0IHRvIGxlYXN0IGJpdAogICAgIGZvciAoaWkgPSAwOyBpaSA8IChzaXplb2YoYnlUbXBIYXNoKSAqIDgpOyBpaSsrKSB7CkBAIC05MywxNyArOTMsMTcgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgb2s7IEZBTFNFIGlmIGVycm9yLgorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIG9rOyBmYWxzZSBpZiBlcnJvci4KICAqCiAgKi8KLUJPT0wgRVRIYklzQnVmZmVyQ3JjMzJPayAoUEJZVEUgcGJ5QnVmZmVyLCBVSU5UIGNiRnJhbWVMZW5ndGgpCitib29sIEVUSGJJc0J1ZmZlckNyYzMyT2sgKHVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlciwgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgpCiB7Ci0gICAgRFdPUkQgZHdDUkM7CisgICAgdW5zaWduZWQgbG9uZyBkd0NSQzsKIAogICAgIGR3Q1JDID0gQ1JDZHdHZXRDcmMzMihwYnlCdWZmZXIsIGNiRnJhbWVMZW5ndGggLSA0KTsKLSAgICBpZiAoY3B1X3RvX2xlMzIoKigoUERXT1JEKShwYnlCdWZmZXIgKyBjYkZyYW1lTGVuZ3RoIC0gNCkpKSAhPSBkd0NSQykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGNwdV90b19sZTMyKCooKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgY2JGcmFtZUxlbmd0aCAtIDQpKSkgIT0gZHdDUkMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90ZXRoZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdGV0aGVyLmgKaW5kZXggM2M5YWNkNy4uNzg3ZDg4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90ZXRoZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RldGhlci5oCkBAIC0yOSw3ICsyOSw3IEBACiAjaWZuZGVmIF9fVEVUSEVSX0hfXwogI2RlZmluZSBfX1RFVEhFUl9IX18KIAotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlICJ0dHlwZS5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzksMTIgKzM5LDYgQEAKICNkZWZpbmUgVV9FVEhFUl9BRERSX1NUUl9MRU4gKEVUSF9BTEVOICogMiArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXRoZXJuZXQgYWRkcmVzcyBzdHJpbmcgbGVuZ3RoCiAKLSNkZWZpbmUgTUlOX0RBVEFfTEVOICAgICAgICA0NiAgICAgICAgICAvLyBtaW4gZGF0YSBsZW5ndGgKLQotI2RlZmluZSBNSU5fUEFDS0VUX0xFTiAgICAgIChNSU5fREFUQV9MRU4gKyBFVEhfSExFTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbiB0b3RhbCBwYWNrZXQgbGVuZ3RoICh0eCkKLQogI2RlZmluZSBNQVhfTE9PS0FIRUFEX1NJWkUgIEVUSF9GUkFNRV9MRU4KIAogI2RlZmluZSBVX01VTFRJX0FERFJfTEVOICAgIDggICAgICAgICAgIC8vIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aApAQCAtMTYwLDkgKzE1NCw5IEBACiAvLyBFdGhlcm5ldCBwYWNrZXQKIC8vCiB0eXBlZGVmIHN0cnVjdCB0YWdTRXRoZXJuZXRIZWFkZXIgewotICAgIEJZVEUgICAgYWJ5RHN0QWRkcltFVEhfQUxFTl07Ci0gICAgQllURSAgICBhYnlTcmNBZGRyW0VUSF9BTEVOXTsKLSAgICBXT1JEICAgIHdUeXBlOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5RHN0QWRkcltFVEhfQUxFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlTcmNBZGRyW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3VHlwZTsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTRXRoZXJuZXRIZWFkZXIsICpQU0V0aGVybmV0SGVhZGVyOwogCkBAIC0xNzEsOSArMTY1LDkgQEAKIC8vIDgwMl8zIHBhY2tldAogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1M4MDJfM0hlYWRlciB7Ci0gICAgQllURSAgICBhYnlEc3RBZGRyW0VUSF9BTEVOXTsKLSAgICBCWVRFICAgIGFieVNyY0FkZHJbRVRIX0FMRU5dOwotICAgIFdPUkQgICAgd0xlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGFieURzdEFkZHJbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U3JjQWRkcltFVEhfQUxFTl07CisgICAgdW5zaWduZWQgc2hvcnQgd0xlbjsKIH1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTODAyXzNIZWFkZXIsICpQUzgwMl8zSGVhZGVyOwogCkBAIC0xODEsMzcgKzE3NSwxNyBAQAogLy8gODAyXzExIHBhY2tldAogLy8KIHR5cGVkZWYgc3RydWN0IHRhZ1M4MDJfMTFIZWFkZXIgewotICAgIFdPUkQgICAgd0ZyYW1lQ3RsOwotICAgIFdPUkQgICAgd0R1cmF0aW9uSUQ7Ci0gICAgQllURSAgICBhYnlBZGRyMVtFVEhfQUxFTl07Ci0gICAgQllURSAgICBhYnlBZGRyMltFVEhfQUxFTl07Ci0gICAgQllURSAgICBhYnlBZGRyM1tFVEhfQUxFTl07Ci0gICAgV09SRCAgICB3U2VxQ3RsOwotICAgIEJZVEUgICAgYWJ5QWRkcjRbRVRIX0FMRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdGcmFtZUN0bDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3RHVyYXRpb25JRDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIxW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIyW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUFkZHIzW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3U2VxQ3RsOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5QWRkcjRbRVRIX0FMRU5dOwogfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFM4MDJfMTFIZWFkZXIsICpQUzgwMl8xMUhlYWRlcjsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEZyYW1lIHR5cGUgbWFjcm8KLQotI2RlZmluZSBJU19NVUxUSUNBU1RfQUREUkVTUyhwYnlFdGhlckFkZHIpICAgICAgICAgIFwKLSAgICAoKCooUEJZVEUpKHBieUV0aGVyQWRkcikgJiAweDAxKSA9PSAxKQotCi0jZGVmaW5lIElTX0JST0FEQ0FTVF9BRERSRVNTKHBieUV0aGVyQWRkcikgKCAgICAgICAgXAotICAgICgqKFBEV09SRCkocGJ5RXRoZXJBZGRyKSA9PSAweEZGRkZGRkZGTCkgJiYgICAgIFwKLSAgICAoKihQV09SRCkoKFBCWVRFKShwYnlFdGhlckFkZHIpICsgNCkgPT0gMHhGRkZGKSBcCi0pCi0KLSNkZWZpbmUgSVNfTlVMTF9BRERSRVNTKHBieUV0aGVyQWRkcikgKCAgICAgICAgICAgICBcCi0gICAgKCooUERXT1JEKShwYnlFdGhlckFkZHIpID09IDBMKSAmJiAgICAgICAgICAgICAgXAotICAgICgqKFBXT1JEKSgoUEJZVEUpKHBieUV0aGVyQWRkcikgKyA0KSA9PSAwKSAgICAgIFwKLSkKLQotI2RlZmluZSBJU19FVEhfQUREUkVTU19FUVVBTChwYnlBZGRyMSwgcGJ5QWRkcjIpICggIFwKLSAgICAoKihQRFdPUkQpKHBieUFkZHIxKSA9PSAqKFBEV09SRCkocGJ5QWRkcjIpKSAmJiBcCi0gICAgKCooUFdPUkQpKChQQllURSkocGJ5QWRkcjEpICsgNCkgPT0gICAgICAgICAgICAgXAotICAgICooUFdPUkQpKChQQllURSkocGJ5QWRkcjIpICsgNCkpICAgICAgICAgICAgICAgIFwKLSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMjE5LDkgKzE5Myw5IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUJZVEUgRVRIYnlHZXRIYXNoSW5kZXhCeUNyYzMyKFBCWVRFIHBieU11bHRpQWRkcik7Ci0vL0JZVEUgRVRIYnlHZXRIYXNoSW5kZXhCeUNyYyhQQllURSBwYnlNdWx0aUFkZHIpOwotQk9PTCBFVEhiSXNCdWZmZXJDcmMzMk9rKFBCWVRFIHBieUJ1ZmZlciwgVUlOVCBjYkZyYW1lTGVuZ3RoKTsKK3Vuc2lnbmVkIGNoYXIgRVRIYnlHZXRIYXNoSW5kZXhCeUNyYzMyKHVuc2lnbmVkIGNoYXIgKnBieU11bHRpQWRkcik7CisvL3Vuc2lnbmVkIGNoYXIgRVRIYnlHZXRIYXNoSW5kZXhCeUNyYyh1bnNpZ25lZCBjaGFyICpwYnlNdWx0aUFkZHIpOworYm9vbCBFVEhiSXNCdWZmZXJDcmMzMk9rKHVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlciwgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgpOwogCiAjZW5kaWYgLy8gX19URVRIRVJfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90a2lwLmMKaW5kZXggZjgzYWY1OS4uZWQzZWFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90a2lwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90a2lwLmMKQEAgLTU1LDcgKzU1LDcgQEAKIC8qIFRoZSAybmQgdGFibGUgaXMgdGhlIHNhbWUgYXMgdGhlIDFzdCBidXQgd2l0aCB0aGUgdXBwZXIgYW5kIGxvd2VyICAgKi8KIC8qIGJ5dGVzIHN3YXBwZWQuIFRvIGFsbG93IGFuIGVuZGlhbiB0b2xlcmFudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGJ5dGUgKi8KIC8qIGhhbHZlcyBoYXZlIGJlZW4gZXhwcmVzc2VkIGluZGVwZW5kZW50bHkgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLWNvbnN0IEJZVEUgVEtJUF9TYm94X0xvd2VyWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBjaGFyIFRLSVBfU2JveF9Mb3dlclsyNTZdID0gewogICAgIDB4QTUsMHg4NCwweDk5LDB4OEQsMHgwRCwweEJELDB4QjEsMHg1NCwKICAgICAweDUwLDB4MDMsMHhBOSwweDdELDB4MTksMHg2MiwweEU2LDB4OUEsCiAgICAgMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLApAQCAtOTAsNyArOTAsNyBAQAogICAgIDB4QzMsMHhCMCwweDc3LDB4MTEsMHhDQiwweEZDLDB4RDYsMHgzQQogfTsKIAotY29uc3QgQllURSBUS0lQX1Nib3hfVXBwZXJbMjU2XSA9IHsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgVEtJUF9TYm94X1VwcGVyWzI1Nl0gPSB7CiAgICAgMHhDNiwweEY4LDB4RUUsMHhGNiwweEZGLDB4RDYsMHhERSwweDkxLAogICAgIDB4NjAsMHgwMiwweENFLDB4NTYsMHhFNywweEI1LDB4NEQsMHhFQywKICAgICAweDhGLDB4MUYsMHg4OSwweEZBLDB4RUYsMHhCMiwweDhFLDB4RkIsCkBAIC0xODQsMTEgKzE4NCwxMSBAQAogICoKICAqLwogdm9pZCBUS0lQdk1peEtleSgKLSAgICBQQllURSAgIHBieVRLZXksCi0gICAgUEJZVEUgICBwYnlUQSwKLSAgICBXT1JEICAgIHdUU0MxNV8wLAotICAgIERXT1JEICAgZHdUU0M0N18xNiwKLSAgICBQQllURSAgIHBieVJDNEtleQorICAgIHVuc2lnbmVkIGNoYXIgKnBieVRLZXksCisgICAgdW5zaWduZWQgY2hhciAqcGJ5VEEsCisgICAgdW5zaWduZWQgc2hvcnQgd1RTQzE1XzAsCisgICAgdW5zaWduZWQgbG9uZyBkd1RTQzQ3XzE2LAorICAgIHVuc2lnbmVkIGNoYXIgKnBieVJDNEtleQogICAgICkKIHsKICAgICB1bnNpZ25lZCBpbnQgcDFrWzVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90a2lwLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RraXAuaAppbmRleCAzZGZhN2Y1Li5lYjU5NTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RraXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RraXAuaApAQCAtNDcsMTEgKzQ3LDExIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiB2b2lkIFRLSVB2TWl4S2V5KAotICAgIFBCWVRFICAgcGJ5VEtleSwKLSAgICBQQllURSAgIHBieVRBLAotICAgIFdPUkQgICAgd1RTQzE1XzAsCi0gICAgRFdPUkQgICBkd1RTQzQ3XzE2LAotICAgIFBCWVRFICAgcGJ5UkM0S2V5CisgICAgdW5zaWduZWQgY2hhciAqcGJ5VEtleSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlUQSwKKyAgICB1bnNpZ25lZCBzaG9ydCB3VFNDMTVfMCwKKyAgICB1bnNpZ25lZCBsb25nIGR3VFNDNDdfMTYsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5UkM0S2V5CiAgICAgKTsKIAogI2VuZGlmIC8vIF9fVEtJUF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdG1hY3JvLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RtYWNyby5oCmluZGV4IGU5NmMxNDAuLmU4YjE3N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdG1hY3JvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90bWFjcm8uaApAQCAtMzQsMjcgKzM0LDI3IEBACiAvKioqKioqIENvbW1vbiBoZWxwZXIgbWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWYgIWRlZmluZWQoTE9CWVRFKQotI2RlZmluZSBMT0JZVEUodykgICAgICAgICAgICgoQllURSkodykpCisjZGVmaW5lIExPQllURSh3KSAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyKSh3KSkKICNlbmRpZgogI2lmICFkZWZpbmVkKEhJQllURSkKLSNkZWZpbmUgSElCWVRFKHcpICAgICAgICAgICAoKEJZVEUpKCgoV09SRCkodykgPj4gOCkgJiAweEZGKSkKKyNkZWZpbmUgSElCWVRFKHcpICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgc2hvcnQpKHcpID4+IDgpICYgMHhGRikpCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKExPV09SRCkKLSNkZWZpbmUgTE9XT1JEKGQpICAgICAgICAgICAoKFdPUkQpKGQpKQorI2RlZmluZSBMT1dPUkQoZCkgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpKGQpKQogI2VuZGlmCiAjaWYgIWRlZmluZWQoSElXT1JEKQotI2RlZmluZSBISVdPUkQoZCkgICAgICAgICAgICgoV09SRCkoKCgoRFdPUkQpKGQpKSA+PiAxNikgJiAweEZGRkYpKQorI2RlZmluZSBISVdPUkQoZCkgICAgICAgICAgICgodW5zaWduZWQgc2hvcnQpKCgoKHVuc2lnbmVkIGxvbmcpKGQpKSA+PiAxNikgJiAweEZGRkYpKQogI2VuZGlmCiAKICNkZWZpbmUgTE9EV09SRChxKSAgICAgICAgICAoKHEpLnUuZHdMb3dEd29yZCkKICNkZWZpbmUgSElEV09SRChxKSAgICAgICAgICAoKHEpLnUuZHdIaWdoRHdvcmQpCiAKICNpZiAhZGVmaW5lZChNQUtFV09SRCkKLSNkZWZpbmUgTUFLRVdPUkQobGIsIGhiKSAgICAoKFdPUkQpKCgoQllURSkobGIpKSB8ICgoKFdPUkQpKChCWVRFKShoYikpKSA8PCA4KSkpCisjZGVmaW5lIE1BS0VXT1JEKGxiLCBoYikgICAgKCh1bnNpZ25lZCBzaG9ydCkoKCh1bnNpZ25lZCBjaGFyKShsYikpIHwgKCgodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKShoYikpKSA8PCA4KSkpCiAjZW5kaWYKICNpZiAhZGVmaW5lZChNQUtFRFdPUkQpCi0jZGVmaW5lIE1BS0VEV09SRChsdywgaHcpICAgKChEV09SRCkoKChXT1JEKShsdykpIHwgKCgoRFdPUkQpKChXT1JEKShodykpKSA8PCAxNikpKQorI2RlZmluZSBNQUtFRFdPUkQobHcsIGh3KSAgICgodW5zaWduZWQgbG9uZykoKCh1bnNpZ25lZCBzaG9ydCkobHcpKSB8ICgoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBzaG9ydCkoaHcpKSkgPDwgMTYpKSkKICNlbmRpZgogCiAjZW5kaWYgLy8gX19UTUFDUk9fSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3R0eXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3R0eXBlLmgKaW5kZXggMjkyMTA4My4uMzdjOGZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90dHlwZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdHR5cGUuaApAQCAtMzMsMjMgKzMzLDEwIEBACiAKIC8qKioqKioqIENvbW1vbiBkZWZpbml0aW9ucyBhbmQgdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgT1VUCi0jZGVmaW5lIE9VVAotI2VuZGlmCi0KICNpZm5kZWYgVHhJblNsZWVwCiAjZGVmaW5lIFR4SW5TbGVlcAogI2VuZGlmCiAKLXR5cGVkZWYgaW50ICAgICAgICAgICAgIEJPT0w7Ci0KLSNpZiAhZGVmaW5lZChUUlVFKQotI2RlZmluZSBUUlVFICAgICAgICAgICAgMQotI2VuZGlmCi0jaWYgIWRlZmluZWQoRkFMU0UpCi0jZGVmaW5lIEZBTFNFICAgICAgICAgICAwCi0jZW5kaWYKLQogLy8yMDA3LTA4MDktMDE8QWRkPmJ5IE1pa2VMaXUKICNpZm5kZWYgIHVwZGF0ZV9Cc3NMaXN0CiAjZGVmaW5lIHVwZGF0ZV9Cc3NMaXN0CkBAIC02NSwxMCArNTIsNiBAQAogI2RlZmluZSBDYWxjdV9MaW5rUXVhbAogI2VuZGlmCiAKLSNpZm5kZWYgQ2FsY3VfTGlua1F1YWwKLSNkZWZpbmUgQ2FsY3VfTGlua1F1YWwKLSNlbmRpZgotCiAvKioqKioqIFNpbXBsZSB0eXBlZGVmcyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBUaGVzZSBsaW5lcyBhc3N1bWUgdGhhdCB5b3VyIGNvbXBpbGVyJ3MgbG9uZ3MgYXJlIDMyIGJpdHMgYW5kCkBAIC03NiwzNyArNTksMTMgQEAKICAqIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBpZiB0aGV5J3JlIHNpZ25lZCBvciB1bnNpZ25lZC4KICAqLwogCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgICAgICAgIEk4OyAgICAgLyogOC1iaXQgc2lnbmVkIGludGVnZXIgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICBVODsgICAgIC8qIDgtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICAgVTE2OyAgICAvKiAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgICBVMzI7ICAgIC8qIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCi0KLQotdHlwZWRlZiBjaGFyICAgICAgICAgICAgQ0hBUjsKLXR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIFNIT1JUOwotdHlwZWRlZiBzaWduZWQgaW50ICAgICAgSU5UOwotdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgTE9ORzsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVUNIQVI7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBVU0hPUlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSU5UOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxPTkc7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVTE9OR0xPTkc7IC8vNjQgYml0Ci0KLQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCWVRFOyAgICAgICAgICAgLy8gIDgtYml0Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBXT1JEOyAgICAgICAgICAgLy8gMTYtYml0Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBEV09SRDsgICAgICAgICAgLy8gMzItYml0Ci0KIC8vIFFXT1JEIGlzIGZvciB0aG9zZSBzaXR1YXRpb24gdGhhdCB3ZSB3YW50CiAvLyBhbiA4LWJ5dGUtYWxpZ25lZCA4IGJ5dGUgbG9uZyBzdHJ1Y3R1cmUKIC8vIHdoaWNoIGlzIE5PVCByZWFsbHkgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCiB0eXBlZGVmIHVuaW9uIHRhZ1VRdWFkV29yZCB7CiAgICAgc3RydWN0IHsKLSAgICAgICAgRFdPUkQgICBkd0xvd0R3b3JkOwotICAgICAgICBEV09SRCAgIGR3SGlnaER3b3JkOworICAgICAgICB1bnNpZ25lZCBpbnQgZHdMb3dEd29yZDsKKyAgICAgICAgdW5zaWduZWQgaW50IGR3SGlnaER3b3JkOwogICAgIH0gdTsKICAgICBkb3VibGUgICAgICBEb05vdFVzZVRoaXNGaWVsZDsKIH0gVVF1YWRXb3JkOwpAQCAtMTE0LDE4ICs3Myw2IEBACiAKIC8qKioqKiogQ29tbW9uIHBvaW50ZXIgdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFVMT05HX1BUUjsgICAgICAvLyAzMi1iaXQKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIERXT1JEX1BUUjsgICAgICAvLyAzMi1iaXQKLQotLy8gYm9vbGVhbiBwb2ludGVyCi10eXBlZGVmIHVuc2lnbmVkIGludCAqICAgUFVJTlQ7Ci0KLXR5cGVkZWYgQllURSAqICAgICAgICAgICBQQllURTsKLQotdHlwZWRlZiBXT1JEICogICAgICAgICAgIFBXT1JEOwotCi10eXBlZGVmIERXT1JEICogICAgICAgICAgUERXT1JEOwotCiB0eXBlZGVmIFFXT1JEICogICAgICAgICAgUFFXT1JEOwogCiAjZW5kaWYgLy8gX19UVFlQRV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdXBjLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3VwYy5oCmluZGV4IGFjZDFiNjYuLjk1OTZmZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdXBjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS91cGMuaApAQCAtNzYsMzYgKzc2LDM2IEBACiAKIAogI2RlZmluZSBWTlN2SW5Qb3J0Qihkd0lPQWRkcmVzcywgcGJ5RGF0YSkgeyAgICAgICAgICAgICAgICAgICAgIFwKLQl2b2xhdGlsZSBCWVRFKiBwYnlBZGRyID0gKChQQllURSkoZHdJT0FkZHJlc3MpKTsgICAgICAgICAgICBcCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqIHBieUFkZHIgPSAoKHVuc2lnbmVkIGNoYXIgKikoZHdJT0FkZHJlc3MpKTsgICAgICAgICAgICBcCiAJKihwYnlEYXRhKSA9IHJlYWRiKHBieUFkZHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogCiAjZGVmaW5lIFZOU3ZJblBvcnRXKGR3SU9BZGRyZXNzLCBwd0RhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgXAotCXZvbGF0aWxlIFdPUkQqIHB3QWRkciA9ICgoUFdPUkQpKGR3SU9BZGRyZXNzKSk7ICAgICAgICAgICAgIFwKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcHdBZGRyID0gKCh1bnNpZ25lZCBzaG9ydCAqKShkd0lPQWRkcmVzcykpOyAgICAgICAgICAgICBcCiAJKihwd0RhdGEpID0gcmVhZHcocHdBZGRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogI2RlZmluZSBWTlN2SW5Qb3J0RChkd0lPQWRkcmVzcywgcGR3RGF0YSkgeyAgICAgICAgICAgICAgICAgICAgIFwKLQl2b2xhdGlsZSBEV09SRCogcGR3QWRkciA9ICgoUERXT1JEKShkd0lPQWRkcmVzcykpOyAgICAgICAgICBcCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcGR3QWRkciA9ICgodW5zaWduZWQgbG9uZyAqKShkd0lPQWRkcmVzcykpOyAgICAgICAgICBcCiAJKihwZHdEYXRhKSA9IHJlYWRsKHBkd0FkZHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogCiAjZGVmaW5lIFZOU3ZPdXRQb3J0Qihkd0lPQWRkcmVzcywgYnlEYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZvbGF0aWxlIEJZVEUqIHBieUFkZHIgPSAoKFBCWVRFKShkd0lPQWRkcmVzcykpOyAgICAgICAgICAgIFwKLSAgICB3cml0ZWIoKEJZVEUpYnlEYXRhLCBwYnlBZGRyKTsJCQkJCQkJXAorICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiBwYnlBZGRyID0gKCh1bnNpZ25lZCBjaGFyICopKGR3SU9BZGRyZXNzKSk7ICAgICAgICAgICAgXAorICAgIHdyaXRlYigodW5zaWduZWQgY2hhcilieURhdGEsIHBieUFkZHIpOwkJCQkJCQlcCiB9CiAKIAogI2RlZmluZSBWTlN2T3V0UG9ydFcoZHdJT0FkZHJlc3MsIHdEYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2xhdGlsZSBXT1JEKiBwd0FkZHIgPSAoKFBXT1JEKShkd0lPQWRkcmVzcykpOyAgICAgICAgICAgICBcCi0gICAgd3JpdGV3KChXT1JEKXdEYXRhLCBwd0FkZHIpOwkJCQkJCQlcCisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnB3QWRkciA9ICgodW5zaWduZWQgc2hvcnQgKikoZHdJT0FkZHJlc3MpKTsgICAgICAgICAgICAgXAorICAgIHdyaXRldygodW5zaWduZWQgc2hvcnQpd0RhdGEsIHB3QWRkcik7CQkJCQkJCVwKIH0KIAogI2RlZmluZSBWTlN2T3V0UG9ydEQoZHdJT0FkZHJlc3MsIGR3RGF0YSkgeyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2xhdGlsZSBEV09SRCogcGR3QWRkciA9ICgoUERXT1JEKShkd0lPQWRkcmVzcykpOyAgICAgICAgICBcCi0gICAgd3JpdGVsKChEV09SRClkd0RhdGEsIHBkd0FkZHIpOwkJCQkJICAgIFwKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwZHdBZGRyID0gKCh1bnNpZ25lZCBsb25nICopKGR3SU9BZGRyZXNzKSk7ICAgICAgICAgIFwKKyAgICB3cml0ZWwoKHVuc2lnbmVkIGxvbmcpZHdEYXRhLCBwZHdBZGRyKTsJCQkJCSAgICBcCiB9CiAKICNlbmRpZgpAQCAtMTQwLDggKzE0MCw4IEBACiAKIAogI2RlZmluZSBQQ0F2RGVsYXlCeUlPKHVEZWxheVVuaXQpIHsgICAgICAgICAgICAgXAotICAgIEJZVEUgICAgYnlEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgYnlEYXRhOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmICh1RGVsYXlVbml0IDw9IDUwKSB7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB1ZGVsYXkodURlbGF5VW5pdCk7ICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS92bnR3aWZpLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3ZudHdpZmkuYwppbmRleCBiNTI3YTAxLi5mY2YyNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3ZudHdpZmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3ZudHdpZmkuYwpAQCAtMTAxLDkgKzEwMSw5IEBACiB2b2lkCiBWTlRXSUZJdlNldElCU1NQYXJhbWV0ZXIgKAogICAgIHZvaWQgKnBNZ210SGFuZGxlLAotICAgIFdPUkQgIHdCZWFjb25QZXJpb2QsCi0gICAgV09SRCAgd0FUSU1XaW5kb3csCi0gICAgVUlOVCAgdUNoYW5uZWwKKyAgICB1bnNpZ25lZCBzaG9ydCB3QmVhY29uUGVyaW9kLAorICAgIHVuc2lnbmVkIHNob3J0IHdBVElNV2luZG93LAorICAgIHVuc2lnbmVkIGludCB1Q2hhbm5lbAogICAgICkKIHsKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gKFBTTWdtdE9iamVjdClwTWdtdEhhbmRsZTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICogUmV0dXJuIFZhbHVlOiBjdXJyZW50IENoYW5uZWwuCiAgKgogLSovCi1VSU5UCit1bnNpZ25lZCBpbnQKIFZOVFdJRklwR2V0Q3VycmVudENoYW5uZWwgKAogICAgIHZvaWQgKnBNZ210SGFuZGxlCiAgICAgKQpAQCAtMTc2LDcgKzE3Niw3IEBACiAgKiBSZXR1cm4gVmFsdWU6IGN1cnJlbnQgQXNzb2MgSUQKICAqCiAtKi8KLVdPUkQKK3Vuc2lnbmVkIHNob3J0CiBWTlRXSUZJd0dldEFzc29jSUQgKAogICAgIHZvaWQgKnBNZ210SGFuZGxlCiAgICAgKQpAQCAtMjAyLDE1ICsyMDIsMTUgQEAKICAqIFJldHVybiBWYWx1ZTogbWF4IHN1cHBvcnQgcmF0ZQogICoKIC0qLwotQllURQordW5zaWduZWQgY2hhcgogVk5UV0lGSWJ5R2V0TWF4U3VwcG9ydFJhdGUgKAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcFN1cHBvcnRSYXRlSUVzLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEV4dFN1cHBvcnRSYXRlSUVzCiAgICAgKQogewotICAgIEJZVEUgICAgYnlNYXhTdXBwb3J0UmF0ZSA9IFJBVEVfMU07Ci0gICAgQllURSAgICBieVN1cHBvcnRSYXRlID0gUkFURV8xTTsKLSAgICBVSU5UICAgIGlpID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWF4U3VwcG9ydFJhdGUgPSBSQVRFXzFNOworICAgIHVuc2lnbmVkIGNoYXIgYnlTdXBwb3J0UmF0ZSA9IFJBVEVfMU07CisgICAgdW5zaWduZWQgaW50IGlpID0gMDsKIAogICAgIGlmIChwU3VwcG9ydFJhdGVJRXMpIHsKICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcFN1cHBvcnRSYXRlSUVzLT5sZW47IGlpKyspIHsKQEAgLTI0OCwxNiArMjQ4LDE2IEBACiAgKiBSZXR1cm4gVmFsdWU6IG1heCBzdXBwb3J0IHJhdGUKICAqCiAtKi8KLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIFZOVFdJRklieUdldEFDS1R4UmF0ZSAoCi0gICAgQllURSBieVJ4RGF0YVJhdGUsCisgICAgdW5zaWduZWQgY2hhciBieVJ4RGF0YVJhdGUsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwU3VwcG9ydFJhdGVJRXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwRXh0U3VwcG9ydFJhdGVJRXMKICAgICApCiB7Ci0gICAgQllURSAgICBieU1heEFja1JhdGU7Ci0gICAgQllURSAgICBieUJhc2ljUmF0ZTsKLSAgICBVSU5UICAgIGlpOworICAgIHVuc2lnbmVkIGNoYXIgYnlNYXhBY2tSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlCYXNpY1JhdGU7CisgICAgdW5zaWduZWQgaW50IGlpOwogCiAgICAgaWYgKGJ5UnhEYXRhUmF0ZSA8PSBSQVRFXzExTSkgewogICAgICAgICBieU1heEFja1JhdGUgPSBSQVRFXzFNOwpAQCAtMzE3LDkgKzMxNyw5IEBACiAgICAgcE1nbXQtPmVBdXRoZW5Nb2RlID0gZUF1dGhNb2RlOwogICAgIGlmICgoZUF1dGhNb2RlID09IFdNQUNfQVVUSF9TSEFSRUtFWSkgfHwKICAgICAgICAgKGVBdXRoTW9kZSA9PSBXTUFDX0FVVEhfQVVUTykpIHsKLSAgICAgICAgcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IFRSVUU7CisgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBGQUxTRTsKKyAgICAgICAgcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IGZhbHNlOwogICAgIH0KIH0KIApAQCAtMzUwLDE1ICszNTAsMTUgQEAKICAgICBpZiAoKGVFbmNyeXB0aW9uTW9kZSA9PSBXTUFDX0VOQ1JZUFRJT05fV0VQRW5hYmxlZCkgfHwKICAgICAgICAgKGVFbmNyeXB0aW9uTW9kZSA9PSBXTUFDX0VOQ1JZUFRJT05fVEtJUEVuYWJsZWQpIHx8CiAgICAgICAgIChlRW5jcnlwdGlvbk1vZGUgPT0gV01BQ19FTkNSWVBUSU9OX0FFU0VuYWJsZWQpICkgewotICAgICAgICBwTWdtdC0+YlByaXZhY3lJbnZva2VkID0gVFJVRTsKKyAgICAgICAgcE1nbXQtPmJQcml2YWN5SW52b2tlZCA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcE1nbXQtPmJQcml2YWN5SW52b2tlZCA9IEZBTFNFOworICAgICAgICBwTWdtdC0+YlByaXZhY3lJbnZva2VkID0gZmFsc2U7CiAgICAgfQogfQogCiAKIAotQk9PTAorYm9vbAogVk5UV0lGSWJDb25maWdQaHlNb2RlICgKICAgICB2b2lkICpwTWdtdEhhbmRsZSwKICAgICBDQVJEX1BIWV9UWVBFIGVQaHlUeXBlCkBAIC0zNjgsMTQgKzM2OCwxNCBAQAogCiAgICAgaWYgKChlUGh5VHlwZSAhPSBQSFlfVFlQRV9BVVRPKSAmJgogICAgICAgICAoZVBoeVR5cGUgIT0gcE1nbXQtPmVDdXJyZW50UEhZTW9kZSkpIHsKLSAgICAgICAgaWYgKENBUkRiU2V0UGh5UGFyYW1ldGVyKHBNZ210LT5wQWRhcHRlciwgZVBoeVR5cGUsIDAsIDAsIE5VTEwsIE5VTEwpPT1UUlVFKSB7CisgICAgICAgIGlmIChDQVJEYlNldFBoeVBhcmFtZXRlcihwTWdtdC0+cEFkYXB0ZXIsIGVQaHlUeXBlLCAwLCAwLCBOVUxMLCBOVUxMKT09dHJ1ZSkgewogICAgICAgICAgICAgcE1nbXQtPmVDdXJyZW50UEhZTW9kZSA9IGVQaHlUeXBlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcE1nbXQtPmVDb25maWdQSFlNb2RlID0gZVBoeVR5cGU7Ci0gICAgcmV0dXJuKFRSVUUpOworICAgIHJldHVybih0cnVlKTsKIH0KIAogCkBAIC00MjUsMTYgKzQyNSwxMiBAQAogLSovCiAKIHZvaWQKLVZOVFdJRkl2UXVlcnlCU1NMaXN0ICgKLSAgICB2b2lkICpwTWdtdEhhbmRsZSwKLSAgICBQVUlOVCAgIHB1QlNTQ291bnQsCi0gICAgdm9pZCAqKnB2Rmlyc3RCU1MKLSAgICApCitWTlRXSUZJdlF1ZXJ5QlNTTGlzdCh2b2lkICpwTWdtdEhhbmRsZSwgdW5zaWduZWQgaW50ICpwdUJTU0NvdW50LCB2b2lkICoqcHZGaXJzdEJTUykKIHsKLSAgICBVSU5UICAgICAgICAgICAgaWkgPSAwOworICAgIHVuc2lnbmVkIGludCBpaSA9IDA7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gKFBTTWdtdE9iamVjdClwTWdtdEhhbmRsZTsKICAgICBQS25vd25CU1MgICAgICAgcEJTUyA9IE5VTEw7Ci0gICAgVUlOVCAgICAgICAgICAgIHVDb3VudCA9IDA7CisgICAgdW5zaWduZWQgaW50IHVDb3VudCA9IDA7CiAKICAgICAqcHZGaXJzdEJTUyA9IE5VTEw7CiAKQEAgLTQ3MSw3ICs0NjcsNyBAQAogICAgICAgICBpZiAocEJTUyA+ICYocE1nbXQtPnNCU1NMaXN0W01BWF9CU1NfTlVNXSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAocEJTUy0+YkFjdGl2ZSA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwQlNTLT5iQWN0aXZlID09IHRydWUpIHsKICAgICAgICAgICAgICpwdk5leHRCU1MgPSBwQlNTOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC00OTcsMjQgKzQ5MywyNCBAQAogdm9pZAogVk5UV0lGSXZVcGRhdGVOb2RlVHhDb3VudGVyKAogICAgIHZvaWQgKnBNZ210SGFuZGxlLAotICAgIFBCWVRFICAgIHBieURlc3RBZGRyZXNzLAotICAgIEJPT0wgICAgIGJUeE9rLAotICAgIFdPUkQgICAgIHdSYXRlLAotICAgIFBCWVRFICAgIHBieVR4RmFpbENvdW50CisgICAgdW5zaWduZWQgY2hhciAqcGJ5RGVzdEFkZHJlc3MsCisgICAgYm9vbCBiVHhPaywKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlUeEZhaWxDb3VudAogICAgICkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KXBNZ210SGFuZGxlOwotICAgIFVJTlQgICAgICAgICAgICB1Tm9kZUluZGV4ID0gMDsKLSAgICBVSU5UICAgICAgICAgICAgaWk7CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXggPSAwOworICAgIHVuc2lnbmVkIGludCBpaTsKIAogICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpIHx8CiAgICAgICAgIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApKSB7Ci0gICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBwYnlEZXN0QWRkcmVzcywgJnVOb2RlSW5kZXgpID09IEZBTFNFKSB7CisgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBwYnlEZXN0QWRkcmVzcywgJnVOb2RlSW5kZXgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS51VHhBdHRlbXB0cysrOwotICAgIGlmIChiVHhPayA9PSBUUlVFKSB7CisgICAgaWYgKGJUeE9rID09IHRydWUpIHsKICAgICAgICAgLy8gdHJhbnNtaXQgc3VjY2VzcywgVHhBdHRlbXB0cyBhdCBsZWFzdCBwbHVzIG9uZQogICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLnVUeE9rW01BWF9SQVRFXSsrOwogICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLnVUeE9rW3dSYXRlXSsrOwpAQCAtNTMyLDE5ICs1MjgsMTkgQEAKIHZvaWQKIFZOVFdJRkl2R2V0VHhSYXRlKAogICAgIHZvaWQgKnBNZ210SGFuZGxlLAotICAgIFBCWVRFICAgIHBieURlc3RBZGRyZXNzLAotICAgIFBXT1JEICAgcHdUeERhdGFSYXRlLAotICAgIFBCWVRFICAgcGJ5QUNLUmF0ZSwKLSAgICBQQllURSAgIHBieUNDS0Jhc2ljUmF0ZSwKLSAgICBQQllURSAgIHBieU9GRE1CYXNpY1JhdGUKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlEZXN0QWRkcmVzcywKKyAgICB1bnNpZ25lZCBzaG9ydCAqcHdUeERhdGFSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUFDS1JhdGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q0NLQmFzaWNSYXRlLAorICAgIHVuc2lnbmVkIGNoYXIgKnBieU9GRE1CYXNpY1JhdGUKICAgICApCiB7CiAgICAgUFNNZ210T2JqZWN0ICAgICAgICBwTWdtdCA9IChQU01nbXRPYmplY3QpcE1nbXRIYW5kbGU7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1Tm9kZUluZGV4ID0gMDsKLSAgICBXT1JEICAgICAgICAgICAgICAgIHdUeERhdGFSYXRlID0gUkFURV8xTTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5QUNLUmF0ZSA9IFJBVEVfMU07Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUNDS0Jhc2ljUmF0ZSA9IFJBVEVfMU07Ci0gICAgQllURSAgICAgICAgICAgICAgICBieU9GRE1CYXNpY1JhdGUgPSBSQVRFXzI0TTsKKyAgICB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleCA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgd1R4RGF0YVJhdGUgPSBSQVRFXzFNOworICAgIHVuc2lnbmVkIGNoYXIgYnlBQ0tSYXRlID0gUkFURV8xTTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q0NLQmFzaWNSYXRlID0gUkFURV8xTTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5T0ZETUJhc2ljUmF0ZSA9IFJBVEVfMjRNOwogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcFN1cHBvcnRSYXRlSUVzID0gTlVMTDsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBFeHRTdXBwb3J0UmF0ZUlFcyA9IE5VTEw7CiAKQEAgLTU3OSwxMiArNTc1LDEyIEBACiAgICAgICAgIHBTdXBwb3J0UmF0ZUlFcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKSBwTWdtdC0+YWJ5Q3VyclN1cHBSYXRlczsKICAgICAgICAgcEV4dFN1cHBvcnRSYXRlSUVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpIHBNZ210LT5hYnlDdXJyRXh0U3VwcFJhdGVzOwogICAgIH0KLSAgICBieUFDS1JhdGUgPSBWTlRXSUZJYnlHZXRBQ0tUeFJhdGUoICAoQllURSkgd1R4RGF0YVJhdGUsCisgICAgYnlBQ0tSYXRlID0gVk5UV0lGSWJ5R2V0QUNLVHhSYXRlKCAgKHVuc2lnbmVkIGNoYXIpIHdUeERhdGFSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0UmF0ZUlFcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0U3VwcG9ydFJhdGVJRXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIGlmIChieUFDS1JhdGUgPiAoQllURSkgd1R4RGF0YVJhdGUpIHsKLSAgICAgICAgYnlBQ0tSYXRlID0gKEJZVEUpIHdUeERhdGFSYXRlOworICAgIGlmIChieUFDS1JhdGUgPiAodW5zaWduZWQgY2hhcikgd1R4RGF0YVJhdGUpIHsKKyAgICAgICAgYnlBQ0tSYXRlID0gKHVuc2lnbmVkIGNoYXIpIHdUeERhdGFSYXRlOwogICAgIH0KICAgICBieUNDS0Jhc2ljUmF0ZSA9IFZOVFdJRklieUdldEFDS1R4UmF0ZSggUkFURV8xMU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdXBwb3J0UmF0ZUlFcywKQEAgLTYwMSwxNSArNTk3LDE1IEBACiAgICAgcmV0dXJuOwogfQogCi1CWVRFCit1bnNpZ25lZCBjaGFyCiBWTlRXSUZJYnlHZXRLZXlDeXBoZXIoCiAgICAgdm9pZCAqcE1nbXRIYW5kbGUsCi0gICAgQk9PTCAgICAgYkdyb3VwS2V5CisgICAgYm9vbCBiR3JvdXBLZXkKICAgICApCiB7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gKFBTTWdtdE9iamVjdClwTWdtdEhhbmRsZTsKIAotICAgIGlmIChiR3JvdXBLZXkgPT0gVFJVRSkgeworICAgIGlmIChiR3JvdXBLZXkgPT0gdHJ1ZSkgewogICAgICAgICByZXR1cm4gKHBNZ210LT5ieUNTU0dLKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gKHBNZ210LT5ieUNTU1BLKTsKQEAgLTYxOCw3ICs2MTQsNyBAQAogCiAKIC8qCi1CT09MCitib29sCiBWTlRXSUZJYkluaXQoCiAgICAgdm9pZCAqcEFkYXB0ZXJIYW5kbGVyLAogICAgIHZvaWQgKipwTWdtdEhhbmRsZXIKQEAgLTYyNiwxMyArNjIyLDEzIEBACiB7CiAKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCBpaTsKIAogCiAgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KWttYWxsb2Moc2l6ZW9mKFNNZ210T2JqZWN0KSwgKGludClHRlBfQVRPTUlDKTsKICAgICBpZiAocE1nbXQgPT0gTlVMTCkgewogICAgICAgICAqcE1nbXRIYW5kbGVyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgbWVtc2V0KHBNZ210LCAwLCBzaXplb2YoU01nbXRPYmplY3QpKTsKQEAgLTY1Miw0MSArNjQ4LDQxIEBACiAgICAgcE1nbXQtPnVDbWREZXF1ZXVlSWR4ID0gMDsKICAgICBwTWdtdC0+dUNtZEVucXVldWVJZHggPSAwOwogICAgIHBNZ210LT5lQ29tbWFuZFN0YXRlID0gV0xBTl9DTURfU1RBVEVfSURMRTsKLSAgICBwTWdtdC0+YkNtZFN0b3AgPSBGQUxTRTsKLSAgICBwTWdtdC0+YkNtZFJ1bm5pbmcgPSBGQUxTRTsKKyAgICBwTWdtdC0+YkNtZFN0b3AgPSBmYWxzZTsKKyAgICBwTWdtdC0+YkNtZFJ1bm5pbmcgPSBmYWxzZTsKIAogICAgICpwTWdtdEhhbmRsZXIgPSBwTWdtdDsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KICovCiAKIAogCi1CT09MCitib29sCiBWTlRXSUZJYlNldFBNS0lEQ2FjaGUgKAogICAgIHZvaWQgKnBNZ210T2JqZWN0LAotICAgIFVMT05HIHVsQ291bnQsCisgICAgdW5zaWduZWQgbG9uZyB1bENvdW50LAogICAgIHZvaWQgKnBQTUtJREluZm8KICAgICApCiB7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gKFBTTWdtdE9iamVjdCkgcE1nbXRPYmplY3Q7CiAKICAgICBpZiAodWxDb3VudCA+IE1BWF9QTUtJRF9DQUNIRSkgewotICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CiAgICAgfQogICAgIHBNZ210LT5nc1BNS0lEQ2FjaGUuQlNTSURJbmZvQ291bnQgPSB1bENvdW50OwogICAgIG1lbWNweShwTWdtdC0+Z3NQTUtJRENhY2hlLkJTU0lESW5mbywgcFBNS0lESW5mbywgKHVsQ291bnQqc2l6ZW9mKFBNS0lESW5mbykpKTsKLSAgICByZXR1cm4gKFRSVUUpOworICAgIHJldHVybiAodHJ1ZSk7CiB9CiAKIAogCi1XT1JECit1bnNpZ25lZCBzaG9ydAogVk5UV0lGSXdHZXRNYXhTdXBwb3J0UmF0ZSgKICAgICB2b2lkICpwTWdtdE9iamVjdAogICAgICkKIHsKLSAgICBXT1JEIHdSYXRlID0gUkFURV81NE07CisgICAgdW5zaWduZWQgc2hvcnQgd1JhdGUgPSBSQVRFXzU0TTsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KSBwTWdtdE9iamVjdDsKIAogICAgIGZvcih3UmF0ZSA9IFJBVEVfNTRNOyB3UmF0ZSA+IFJBVEVfMU07IHdSYXRlLS0pIHsKQEAgLTcwNSw3ICs3MDEsNyBAQAogdm9pZAogVk5UV0lGSXZTZXQxMWggKAogICAgIHZvaWQgKnBNZ210T2JqZWN0LAotICAgIEJPT0wgIGIxMWhFbmFibGUKKyAgICBib29sIGIxMWhFbmFibGUKICAgICApCiB7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gKFBTTWdtdE9iamVjdCkgcE1nbXRPYmplY3Q7CkBAIC03MTMsMTkgKzcwOSwxOSBAQAogICAgIHBNZ210LT5iMTFoRW5hYmxlID0gYjExaEVuYWJsZTsKIH0KIAotQk9PTAorYm9vbAogVk5UV0lGSWJNZWFzdXJlUmVwb3J0KAogICAgIHZvaWQgKnBNZ210T2JqZWN0LAotICAgIEJPT0wgIGJFbmRPZlJlcG9ydCwKKyAgICBib29sIGJFbmRPZlJlcG9ydCwKICAgICB2b2lkICpwdk1lYXN1cmVFSUQsCi0gICAgQllURSAgYnlSZXBvcnRNb2RlLAotICAgIEJZVEUgIGJ5QmFzaWNNYXAsCi0gICAgQllURSAgYnlDQ0FGcmFjdGlvbiwKLSAgICBQQllURSBwYnlSUElzCisgICAgdW5zaWduZWQgY2hhciBieVJlcG9ydE1vZGUsCisgICAgdW5zaWduZWQgY2hhciBieUJhc2ljTWFwLAorICAgIHVuc2lnbmVkIGNoYXIgYnlDQ0FGcmFjdGlvbiwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlSUElzCiAgICAgKQogewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IChQU01nbXRPYmplY3QpIHBNZ210T2JqZWN0OwotICAgIFBCWVRFICAgICAgICAgICBwYnlDdXJyZW50RUlEID0gKFBCWVRFKSAocE1nbXQtPnBDdXJyTWVhc3VyZUVJRFJlcCk7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q3VycmVudEVJRCA9ICh1bnNpZ25lZCBjaGFyICopIChwTWdtdC0+cEN1cnJNZWFzdXJlRUlEUmVwKTsKIAogICAgIC8vc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgICAgaWYgKChwdk1lYXN1cmVFSUQgIT0gTlVMTCkgJiYKQEAgLTc2NSw0OSArNzYxLDQ5IEBACiAgICAgICAgIHBNZ210LT51TGVuZ3RoT2ZSZXBFSURzICs9ICgyICsgcE1nbXQtPnBDdXJyTWVhc3VyZUVJRFJlcC0+bGVuKTsKICAgICAgICAgcE1nbXQtPnBDdXJyTWVhc3VyZUVJRFJlcCA9IChQV0xBTl9JRV9NRUFTVVJFX1JFUCkgcGJ5Q3VycmVudEVJRDsKICAgICB9Ci0gICAgaWYgKGJFbmRPZlJlcG9ydCA9PSBUUlVFKSB7CisgICAgaWYgKGJFbmRPZlJlcG9ydCA9PSB0cnVlKSB7CiAgICAgICAgIElFRUUxMWhiTVNSUmVwVHgocE1nbXQpOwogICAgIH0KICAgICAvL3NwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgcmV0dXJuIChUUlVFKTsKKyAgICByZXR1cm4gKHRydWUpOwogfQogCiAKLUJPT0wKK2Jvb2wKIFZOVFdJRkliQ2hhbm5lbFN3aXRjaCgKICAgICB2b2lkICpwTWdtdE9iamVjdCwKLSAgICBCWVRFICBieU5ld0NoYW5uZWwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TmV3Q2hhbm5lbAogICAgICkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KSBwTWdtdE9iamVjdDsKIAogICAgIC8vc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgICAgcE1nbXQtPnVDdXJyQ2hhbm5lbCA9IGJ5TmV3Q2hhbm5lbDsKLSAgICBwTWdtdC0+YlN3aXRjaENoYW5uZWwgPSBGQUxTRTsKKyAgICBwTWdtdC0+YlN3aXRjaENoYW5uZWwgPSBmYWxzZTsKICAgICAvL3NwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qCi1CT09MCitib29sCiBWTlRXSUZJYlJhZGFyUHJlc2VudCgKICAgICB2b2lkICpwTWdtdE9iamVjdCwKLSAgICBCWVRFICBieUNoYW5uZWwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbAogICAgICkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KSBwTWdtdE9iamVjdDsKICAgICBpZiAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0lCU1NfU1RBKSAmJgotICAgICAgICAoYnlDaGFubmVsID09IChCWVRFKSBwTWdtdC0+dUN1cnJDaGFubmVsKSAmJgotICAgICAgICAocE1nbXQtPmJTd2l0Y2hDaGFubmVsICE9IFRSVUUpICYmCi0gICAgICAgIChwTWdtdC0+YjExaEVuYWJsZSA9PSBUUlVFKSkgewotICAgICAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwocE1nbXQtPmFieUlCU1NERlNPd25lciwgQ0FSRHBHZXRDdXJyZW50QWRkcmVzcyhwTWdtdC0+cEFkYXB0ZXIpKSkgewotICAgICAgICAgICAgcE1nbXQtPmJ5TmV3Q2hhbm5lbCA9IENBUkRieUF1dG9DaGFubmVsU2VsZWN0KHBNZ210LT5wQWRhcHRlciwoQllURSkgcE1nbXQtPnVDdXJyQ2hhbm5lbCk7Ci0gICAgICAgICAgICBwTWdtdC0+YlN3aXRjaENoYW5uZWwgPSBUUlVFOworICAgICAgICAoYnlDaGFubmVsID09ICh1bnNpZ25lZCBjaGFyKSBwTWdtdC0+dUN1cnJDaGFubmVsKSAmJgorICAgICAgICAocE1nbXQtPmJTd2l0Y2hDaGFubmVsICE9IHRydWUpICYmCisgICAgICAgIChwTWdtdC0+YjExaEVuYWJsZSA9PSB0cnVlKSkgeworICAgICAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwTWdtdC0+YWJ5SUJTU0RGU093bmVyLCBDQVJEcEdldEN1cnJlbnRBZGRyZXNzKHBNZ210LT5wQWRhcHRlcikpKSB7CisgICAgICAgICAgICBwTWdtdC0+YnlOZXdDaGFubmVsID0gQ0FSRGJ5QXV0b0NoYW5uZWxTZWxlY3QocE1nbXQtPnBBZGFwdGVyLCh1bnNpZ25lZCBjaGFyKSBwTWdtdC0+dUN1cnJDaGFubmVsKTsKKyAgICAgICAgICAgIHBNZ210LT5iU3dpdGNoQ2hhbm5lbCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgQkVBQ09OYlNlbmRCZWFjb24ocE1nbXQpOwogICAgICAgICBDQVJEYkNoYW5uZWxTd2l0Y2gocE1nbXQtPnBBZGFwdGVyLCAwLCBwTWdtdC0+YnlOZXdDaGFubmVsLCAxMCk7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiB0cnVlOwogfQogKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS92bnR3aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3ZudHdpZmkuaAppbmRleCBjOTFkZmQ3Li5mNDMyN2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3ZudHdpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3ZudHdpZmkuaApAQCAtMTQzLDkgKzE0Myw5IEBACiB2b2lkCiBWTlRXSUZJdlNldElCU1NQYXJhbWV0ZXIgKAogICAgIHZvaWQgKnBNZ210SGFuZGxlLAotICAgIFdPUkQgIHdCZWFjb25QZXJpb2QsCi0gICAgV09SRCAgd0FUSU1XaW5kb3csCi0gICAgVUlOVCAgdUNoYW5uZWwKKyAgICB1bnNpZ25lZCBzaG9ydCB3QmVhY29uUGVyaW9kLAorICAgIHVuc2lnbmVkIHNob3J0IHdBVElNV2luZG93LAorICAgIHVuc2lnbmVkIGludCB1Q2hhbm5lbAogICAgICk7CiAKIHZvaWQKQEAgLTE1OSwyNSArMTU5LDI1IEBACiAgICAgdm9pZCAqcE1nbXRIYW5kbGUKICAgICApOwogCi1VSU5UCit1bnNpZ25lZCBpbnQKIFZOVFdJRklwR2V0Q3VycmVudENoYW5uZWwoCiAgICAgdm9pZCAqcE1nbXRIYW5kbGUKICAgICApOwogCi1XT1JECit1bnNpZ25lZCBzaG9ydAogVk5UV0lGSXdHZXRBc3NvY0lEICgKICAgICB2b2lkICpwTWdtdEhhbmRsZQogICAgICk7CiAKLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIFZOVFdJRklieUdldE1heFN1cHBvcnRSYXRlICgKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBTdXBwb3J0UmF0ZUlFcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBFeHRTdXBwb3J0UmF0ZUlFcwogICAgICk7CiAKLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIFZOVFdJRklieUdldEFDS1R4UmF0ZSAoCi0gICAgQllURSBieVJ4RGF0YVJhdGUsCisgICAgdW5zaWduZWQgY2hhciBieVJ4RGF0YVJhdGUsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwU3VwcG9ydFJhdGVJRXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwRXh0U3VwcG9ydFJhdGVJRXMKICAgICApOwpAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgKTsKIAogCi1CT09MCitib29sCiBWTlRXSUZJYkNvbmZpZ1BoeU1vZGUoCiAgICAgdm9pZCAqcE1nbXRIYW5kbGUsCiAgICAgQ0FSRF9QSFlfVFlQRSBlUGh5VHlwZQpAQCAtMjA4LDE0ICsyMDgsOCBAQAogICAgICk7CiAKIHZvaWQKLVZOVFdJRkl2UXVlcnlCU1NMaXN0KAotICAgIHZvaWQgKnBNZ210SGFuZGxlLAotICAgIFBVSU5UICAgcHVCU1NDb3VudCwKLSAgICB2b2lkICoqcHZGaXJzdEJTUwotICAgICk7Ci0KLQotCitWTlRXSUZJdlF1ZXJ5QlNTTGlzdCh2b2lkICpwTWdtdEhhbmRsZSwgdW5zaWduZWQgaW50ICpwdUJTU0NvdW50LAorCQl2b2lkICoqcHZGaXJzdEJTUyk7CiAKIHZvaWQKIFZOVFdJRkl2R2V0TmV4dEJTUyAoCkBAIC0yMjksNTIgKzIyMyw1MiBAQAogdm9pZAogVk5UV0lGSXZVcGRhdGVOb2RlVHhDb3VudGVyKAogICAgIHZvaWQgKnBNZ210SGFuZGxlLAotICAgIFBCWVRFICAgIHBieURlc3RBZGRyZXNzLAotICAgIEJPT0wgICAgIGJUeE9rLAotICAgIFdPUkQgICAgIHdSYXRlLAotICAgIFBCWVRFICAgIHBieVR4RmFpbENvdW50CisgICAgdW5zaWduZWQgY2hhciAqcGJ5RGVzdEFkZHJlc3MsCisgICAgYm9vbCBiVHhPaywKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlUeEZhaWxDb3VudAogICAgICk7CiAKIAogdm9pZAogVk5UV0lGSXZHZXRUeFJhdGUoCiAgICAgdm9pZCAqcE1nbXRIYW5kbGUsCi0gICAgUEJZVEUgICAgcGJ5RGVzdEFkZHJlc3MsCi0gICAgUFdPUkQgICBwd1R4RGF0YVJhdGUsCi0gICAgUEJZVEUgICBwYnlBQ0tSYXRlLAotICAgIFBCWVRFICAgcGJ5Q0NLQmFzaWNSYXRlLAotICAgIFBCWVRFICAgcGJ5T0ZETUJhc2ljUmF0ZQorICAgIHVuc2lnbmVkIGNoYXIgKnBieURlc3RBZGRyZXNzLAorICAgIHVuc2lnbmVkIHNob3J0ICpwd1R4RGF0YVJhdGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5QUNLUmF0ZSwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlDQ0tCYXNpY1JhdGUsCisgICAgdW5zaWduZWQgY2hhciAqcGJ5T0ZETUJhc2ljUmF0ZQogICAgICk7CiAvKgotQk9PTAorYm9vbAogVk5UV0lGSWJJbml0KAogICAgIHZvaWQgKnBBZGFwdGVySGFuZGxlciwKICAgICB2b2lkICoqcE1nbXRIYW5kbGVyCiAgICAgKTsKICovCiAKLUJZVEUKK3Vuc2lnbmVkIGNoYXIKIFZOVFdJRklieUdldEtleUN5cGhlcigKICAgICB2b2lkICpwTWdtdEhhbmRsZSwKLSAgICBCT09MICAgICBiR3JvdXBLZXkKKyAgICBib29sIGJHcm91cEtleQogICAgICk7CiAKIAogCiAKLUJPT0wKK2Jvb2wKIFZOVFdJRkliU2V0UE1LSURDYWNoZSAoCiAgICAgdm9pZCAqcE1nbXRPYmplY3QsCi0gICAgVUxPTkcgdWxDb3VudCwKKyAgICB1bnNpZ25lZCBsb25nIHVsQ291bnQsCiAgICAgdm9pZCAqcFBNS0lESW5mbwogICAgICk7CiAKLUJPT0wKK2Jvb2wKIFZOVFdJRkliQ29tbWFuZFJ1bm5pbmcgKAogICAgIHZvaWQgKnBNZ210T2JqZWN0CiAgICAgKTsKIAotV09SRAordW5zaWduZWQgc2hvcnQKIFZOVFdJRkl3R2V0TWF4U3VwcG9ydFJhdGUoCiAgICAgdm9pZCAqcE1nbXRPYmplY3QKICAgICApOwpAQCAtMjgzLDMwICsyNzcsMzAgQEAKIHZvaWQKIFZOVFdJRkl2U2V0MTFoICgKICAgICB2b2lkICpwTWdtdE9iamVjdCwKLSAgICBCT09MICBiMTFoRW5hYmxlCisgICAgYm9vbCBiMTFoRW5hYmxlCiAgICAgKTsKIAotQk9PTAorYm9vbAogVk5UV0lGSWJNZWFzdXJlUmVwb3J0KAogICAgIHZvaWQgKnBNZ210T2JqZWN0LAotICAgIEJPT0wgIGJFbmRPZlJlcG9ydCwKKyAgICBib29sIGJFbmRPZlJlcG9ydCwKICAgICB2b2lkICpwdk1lYXN1cmVFSUQsCi0gICAgQllURSAgYnlSZXBvcnRNb2RlLAotICAgIEJZVEUgIGJ5QmFzaWNNYXAsCi0gICAgQllURSAgYnlDQ0FGcmFjdGlvbiwKLSAgICBQQllURSBwYnlSUElzCisgICAgdW5zaWduZWQgY2hhciBieVJlcG9ydE1vZGUsCisgICAgdW5zaWduZWQgY2hhciBieUJhc2ljTWFwLAorICAgIHVuc2lnbmVkIGNoYXIgYnlDQ0FGcmFjdGlvbiwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlSUElzCiAgICAgKTsKIAotQk9PTAorYm9vbAogVk5UV0lGSWJDaGFubmVsU3dpdGNoKAogICAgIHZvaWQgKnBNZ210T2JqZWN0LAotICAgIEJZVEUgIGJ5TmV3Q2hhbm5lbAorICAgIHVuc2lnbmVkIGNoYXIgYnlOZXdDaGFubmVsCiAgICAgKTsKIC8qCi1CT09MCitib29sCiBWTlRXSUZJYlJhZGFyUHJlc2VudCgKICAgICB2b2lkICpwTWdtdE9iamVjdCwKLSAgICBCWVRFICBieUNoYW5uZWwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbAogICAgICk7CiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5jCmluZGV4IDI4NjY1ZDguLmFiZDY3NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAicnh0eC5oIgogI2luY2x1ZGUgInJmLmgiCiAjaW5jbHVkZSAiaW93cGEuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTc3LDcgKzc4LDcgQEAKIHNfTWdyTWFrZVByb2JlUmVxdWVzdCgKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBQQllURSBwU2NhbkJTU0lELAorICAgIHVuc2lnbmVkIGNoYXIgKnBTY2FuQlNTSUQsCiAgICAgUFdMQU5fSUVfU1NJRCBwU1NJRCwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcwpAQCAtODUsNyArODYsNyBAQAogCiAKIHN0YXRpYwotQk9PTAorYm9vbAogc19iQ29tbWFuZENvbXBsZXRlICgKICAgICBQU0RldmljZSBwRGV2aWNlCiAgICAgKTsKQEAgLTExNiw3ICsxMTcsNyBAQAogewogCiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7Ci0gICAgQk9PTCAgICAgICAgICAgIGJTdG9wOworICAgIGJvb2wgYlN0b3A7CiAKICAgICAvKgogICAgICAqIHRlbXBvcmFyaWx5IHN0b3AgQmVhY29uIHBhY2tldCBmb3IgQWRIb2MgU2VydmVyCkBAIC0xMjksMTggKzEzMCwxOCBAQAogICAgICAqICAgICAgb3IKICAgICAgKiAgICAgICgzLjIpIEFkSG9jIGNoYW5uZWwgaXMgaW4gQSBtb2RlCiAgICAgICovCi0gICAgYlN0b3AgPSBGQUxTRTsKKyAgICBiU3RvcCA9IGZhbHNlOwogICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpICYmCiAgICAgKHBNZ210LT5lQ3VyclN0YXRlID49IFdNQUNfU1RBVEVfU1RBUlRFRCkpCiAgICAgewogICAgICAgICBpZiAoKHBNZ210LT51SUJTU0NoYW5uZWwgPD0gIENCX01BWF9DSEFOTkVMXzI0RykgJiYKICAgICAgICAgICAgICAocE1nbXQtPnVTY2FuQ2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJTdG9wID0gVFJVRTsKKyAgICAgICAgICAgIGJTdG9wID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAocE1nbXQtPnVJQlNTQ2hhbm5lbCA+ICBDQl9NQVhfQ0hBTk5FTF8yNEcpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJTdG9wID0gVFJVRTsKKyAgICAgICAgICAgIGJTdG9wID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjA4LDE1ICsyMDksMTUgQEAKICAgICApCiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMU0sICAgMk0sICAgNU0sICAgMTFNLCAgMThNLCAgMjRNLCAgMzZNLCAgNTRNCi0gICAgQllURSBhYnlDdXJyU3VwcFJhdGVzR1tdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDgsIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NkN9OwotICAgIEJZVEUgYWJ5Q3VyckV4dFN1cHBSYXRlc0dbXSA9IHtXTEFOX0VJRF9FWFRTVVBQX1JBVEVTLCA0LCAweDBDLCAweDEyLCAweDE4LCAweDYwfTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUN1cnJTdXBwUmF0ZXNHW10gPSB7V0xBTl9FSURfU1VQUF9SQVRFUywgOCwgMHgwMiwgMHgwNCwgMHgwQiwgMHgxNiwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2Q307CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyRXh0U3VwcFJhdGVzR1tdID0ge1dMQU5fRUlEX0VYVFNVUFBfUkFURVMsIDQsIDB4MEMsIDB4MTIsIDB4MTgsIDB4NjB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzZNLCAgIDlNLCAgIDEyTSwgIDQ4TQotICAgIEJZVEUgYWJ5Q3VyclN1cHBSYXRlc0FbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LCAweDBDLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDfTsKLSAgICBCWVRFIGFieUN1cnJTdXBwUmF0ZXNCW10gPSB7V0xBTl9FSURfU1VQUF9SQVRFUywgNCwgMHgwMiwgMHgwNCwgMHgwQiwgMHgxNn07Ci0gICAgUEJZVEUgICAgICAgICAgIHBieVJhdGU7CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyU3VwcFJhdGVzQVtdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDgsIDB4MEMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkN9OworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VyclN1cHBSYXRlc0JbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA0LCAweDAyLCAweDA0LCAweDBCLCAweDE2fTsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlSYXRlOwogICAgIFBTVHhNZ210UGFja2V0ICBwVHhQYWNrZXQ7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCBpaTsKIAogCiAgICAgaWYgKHBEZXZpY2UtPmVDdXJyZW50UEhZVHlwZSA9PSBQSFlfVFlQRV8xMUEpIHsKQEAgLTI2OSw3ICsyNzAsNyBAQAogc19NZ3JNYWtlUHJvYmVSZXF1ZXN0KAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAotICAgIFBCWVRFIHBTY2FuQlNTSUQsCisgICAgdW5zaWduZWQgY2hhciAqcFNjYW5CU1NJRCwKICAgICBQV0xBTl9JRV9TU0lEIHBTU0lELAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyRXh0U3VwcFJhdGVzCkBAIC0yODIsOCArMjgzLDggQEAKIAogICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9QUk9CRVJFUV9GUl9NQVhMRU4pOwotICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKFBCWVRFKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7Ci0gICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CisgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgIHNGcmFtZS5sZW4gPSBXTEFOX1BST0JFUkVRX0ZSX01BWExFTjsKICAgICB2TWdyRW5jb2RlUHJvYmVSZXF1ZXN0KCZzRnJhbWUpOwogICAgIHNGcmFtZS5wSGRyLT5zQTMud0ZyYW1lQ3RsID0gY3B1X3RvX2xlMTYoCkBAIC0zMjAsMTYgKzMyMSwxNiBAQAogdm9pZAogdkNvbW1hbmRUaW1lcldhaXQoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgVUlOVCBNU2Vjb25kCisgICAgdW5zaWduZWQgaW50IE1TZWNvbmQKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAKICAgICBpbml0X3RpbWVyKCZwRGV2aWNlLT5zVGltZXJDb21tYW5kKTsKLSAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmRhdGEgPSAoVUxPTkcpcERldmljZTsKKyAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmRhdGEgPSAodW5zaWduZWQgbG9uZykgcERldmljZTsKICAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmZ1bmN0aW9uID0gKFRpbWVyRnVuY3Rpb24pdkNvbW1hbmRUaW1lcjsKICAgICAvLyBSVU5fQVQgOjEgbXNlYyB+PSAoSFovMTAyNCkKLSAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmV4cGlyZXMgPSAoVUlOVClSVU5fQVQoKE1TZWNvbmQgKiBIWikgPj4gMTApOworICAgIHBEZXZpY2UtPnNUaW1lckNvbW1hbmQuZXhwaXJlcyA9ICh1bnNpZ25lZCBpbnQpUlVOX0FUKChNU2Vjb25kICogSFopID4+IDEwKTsKICAgICBhZGRfdGltZXIoJnBEZXZpY2UtPnNUaW1lckNvbW1hbmQpOwogICAgIHJldHVybjsKIH0KQEAgLTM0NywxNCArMzQ4LDE0IEBACiAgICAgUFdMQU5fSUVfU1NJRCAgIHBJdGVtU1NJRDsKICAgICBQV0xBTl9JRV9TU0lEICAgcEl0ZW1TU0lEQ3VycjsKICAgICBDTURfU1RBVFVTICAgICAgU3RhdHVzOwotICAgIFVJTlQgICAgICAgICAgICBpaTsKLSAgICBCWVRFICAgICAgICAgICAgYnlNYXNrWzhdID0gezEsIDIsIDQsIDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworICAgIHVuc2lnbmVkIGludCBpaTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5TWFza1s4XSA9IHsxLCAyLCA0LCA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwfTsKICAgICBzdHJ1Y3Qgc2tfYnVmZiAgKnNrYjsKIAogCiAgICAgaWYgKHBEZXZpY2UtPmR3RGlhZ1JlZkNvdW50ICE9IDApCiAgICAgICAgIHJldHVybjsKLSAgICBpZiAocERldmljZS0+YkNtZFJ1bm5pbmcgIT0gVFJVRSkKKyAgICBpZiAocERldmljZS0+YkNtZFJ1bm5pbmcgIT0gdHJ1ZSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CkBAIC0zNjQsNyArMzY1LDcgQEAKICAgICAgICAgY2FzZSBXTEFOX0NNRF9TQ0FOX1NUQVJUOgogCiAJcERldmljZS0+YnlSZUFzc29jQ291bnQgPSAwOwotICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSBUUlVFKSB7CisgICAgICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKICAgICAgICAgICAgICAgICBzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0zOTYsNyArMzk3LDcgQEAKIAogICAgICAgICAgICAgICAgIC8vIFNldCBCYXNlYmFuZCdzIHNlbnNpdGl2aXR5IGJhY2suCiAgICAgICAgICAgICAgICAgLy8gU2V0IGNoYW5uZWwgYmFjawotICAgICAgICAgICAgICAgIENBUkRiU2V0Q2hhbm5lbChwTWdtdC0+cEFkYXB0ZXIsIHBNZ210LT51Q3VyckNoYW5uZWwpOworICAgICAgICAgICAgICAgIHNldF9jaGFubmVsKHBNZ210LT5wQWRhcHRlciwgcE1nbXQtPnVDdXJyQ2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2Nhbm5pbmcsIHNldCBiYWNrIHRvIGNoYW5uZWw6IFslZF1cbiIsIHBNZ210LT51Q3VyckNoYW5uZWwpOwogICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkgewogICAgICAgICAgICAgICAgICAgICBDQVJEYlNldEJTU0lEKHBNZ210LT5wQWRhcHRlciwgcE1nbXQtPmFieUN1cnJCU1NJRCwgT1BfTU9ERV9BREhPQyk7CkBAIC00MDgsNyArNDA5LDcgQEAKIAogICAgICAgICAgICAgfSBlbHNlIHsKIC8vMjAwOC04LTQgPGFkZD4gYnkgY2hlc3RlcgotICAgICAgICAgICAgICAgICBpZiAoIUNoYW5uZWxWYWxpZChwRGV2aWNlLT5ieVpvbmVUeXBlLCBwTWdtdC0+dVNjYW5DaGFubmVsKSkgeworCQlpZiAoIWlzX2NoYW5uZWxfdmFsaWQocE1nbXQtPnVTY2FuQ2hhbm5lbCkpIHsKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiSW52YWxpZCBjaGFubmVsIHBNZ210LT51U2NhbkNoYW5uZWwgPSAlZCBcbiIscE1nbXQtPnVTY2FuQ2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgIHNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNDMxLDcgKzQzMiw3IEBACiAKICAgICAgICAgICAgICAgICB2QWRIb2NCZWFjb25TdG9wKHBEZXZpY2UpOwogCi0gICAgICAgICAgICAgICAgaWYgKENBUkRiU2V0Q2hhbm5lbChwTWdtdC0+cEFkYXB0ZXIsIHBNZ210LT51U2NhbkNoYW5uZWwpID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2NoYW5uZWwocE1nbXQtPnBBZGFwdGVyLCBwTWdtdC0+dVNjYW5DaGFubmVsKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU0NBTiBDaGFubmVsOiAlZFxuIiwgcE1nbXQtPnVTY2FuQ2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTRVQgU0NBTiBDaGFubmVsIEZhaWw6ICVkXG4iLCBwTWdtdC0+dVNjYW5DaGFubmVsKTsKQEAgLTQ0MSw3ICs0NDIsNyBAQAogICAgICAgLy8gICAgICAgICAgcHJpbnRrKCJjaGVzdGVyLWNoPSVkXG4iLHBNZ210LT51U2NhbkNoYW5uZWwpOwogCXBNZ210LT51U2NhbkNoYW5uZWwrKzsKIC8vMjAwOC04LTQgPG1vZGlmeT4gYnkgY2hlc3RlcgotCSBpZiAoIUNoYW5uZWxWYWxpZChwRGV2aWNlLT5ieVpvbmVUeXBlLCBwTWdtdC0+dVNjYW5DaGFubmVsKSAmJgorCQlpZiAoIWlzX2NoYW5uZWxfdmFsaWQocE1nbXQtPnVTY2FuQ2hhbm5lbCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT51U2NhbkNoYW5uZWwgPD0gcERldmljZS0+YnlNYXhDaGFubmVsICl7CiAgICAgICAgICAgICAgICAgICAgIHBNZ210LT51U2NhbkNoYW5uZWw9cERldmljZS0+YnlNYXhDaGFubmVsKzE7CiAJCSBwTWdtdC0+ZUNvbW1hbmRTdGF0ZSA9IFdMQU5fQ01EX1NDQU5fRU5EOwpAQCAtNDQ5LDcgKzQ1MCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBpZiAoKHBNZ210LT5iMTFoRW5hYmxlID09IEZBTFNFKSB8fAorICAgICAgICAgICAgICAgIGlmICgocE1nbXQtPmIxMWhFbmFibGUgPT0gZmFsc2UpIHx8CiAgICAgICAgICAgICAgICAgICAgIChwTWdtdC0+dVNjYW5DaGFubmVsIDwgQ0JfTUFYX0NIQU5ORUxfMjRHKSkgewogICAgICAgICAgICAgICAgICAgICBzX3ZQcm9iZUNoYW5uZWwocERldmljZSk7CiAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CkBAIC00NjksNyArNDcwLDcgQEAKIAogICAgICAgICAgICAgLy8gU2V0IEJhc2ViYW5kJ3Mgc2Vuc2l0aXZpdHkgYmFjay4KICAgICAgICAgICAgIC8vIFNldCBjaGFubmVsIGJhY2sKLSAgICAgICAgICAgIENBUkRiU2V0Q2hhbm5lbChwTWdtdC0+cEFkYXB0ZXIsIHBNZ210LT51Q3VyckNoYW5uZWwpOworICAgICAgICAgICAgc2V0X2NoYW5uZWwocE1nbXQtPnBBZGFwdGVyLCBwTWdtdC0+dUN1cnJDaGFubmVsKTsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlNjYW5uaW5nLCBzZXQgYmFjayB0byBjaGFubmVsOiBbJWRdXG4iLCBwTWdtdC0+dUN1cnJDaGFubmVsKTsKICAgICAgICAgICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkgewogICAgICAgICAgICAgICAgIENBUkRiU2V0QlNTSUQocE1nbXQtPnBBZGFwdGVyLCBwTWdtdC0+YWJ5Q3VyckJTU0lELCBPUF9NT0RFX0FESE9DKTsKQEAgLTUwMiwxNCArNTAzLDE0IEBACiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTZW5kIERpc2Fzc29jaWF0aW9uIFBhY2tldC4uXG4iKTsKICAgICAgICAgICAgICAgICAvLyByZWFzb24gPSA4IDogZGlzYXNzb2MgYmVjYXVzZSBzdGEgaGFzIGxlZnQKICAgICAgICAgICAgICAgICB2TWdyRGlzYXNzb2NCZWdpblN0YSgodm9pZCAqKXBEZXZpY2UsIHBNZ210LCBwTWdtdC0+YWJ5Q3VyckJTU0lELCAoOCksICZTdGF0dXMpOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIC8vIHVubG9jayBjb21tYW5kIGJ1c3kKICAgICAgICAgICAgICAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7CiAgICAgICAgICAgICAgICAgcEl0ZW1TU0lELT5sZW4gPSAwOwogICAgICAgICAgICAgICAgIG1lbXNldChwSXRlbVNTSUQtPmFieVNTSUQsIDAsIFdMQU5fU1NJRF9NQVhMRU4pOwogICAgICAgICAgICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwotICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYkFjdGl2ZSA9IEZBTFNFOwotLy8gICAgICAgICAgICAgICAgcERldmljZS0+YkJlYWNvbkJ1ZlJlYWR5ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gZmFsc2U7CisvLyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iQmVhY29uQnVmUmVhZHkgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKICAgICAgICAgICAgIHBEZXZpY2UtPmVDb21tYW5kU3RhdGUgPSBXTEFOX0RJU0FTU09DSUFURV9XQUlUOwpAQCAtNTM5LDcgKzU0MCw3IEBACiAKICAgICAgICAgY2FzZSBXTEFOX0NNRF9TU0lEX1NUQVJUOgogICAgICAgICAJcERldmljZS0+YnlSZUFzc29jQ291bnQgPSAwOwotICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSBUUlVFKSB7CisgICAgICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKICAgICAgICAgICAgICAgICBzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC01NzMsNyArNTc0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBzZXQgaW5pdGlhbCBzdGF0ZQogICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CkBAIC02MDcsOSArNjA4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocERldmljZS0+ZGV2KSl7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLnVJbkFjdGl2ZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgYkNsZWFyQlNTSURfU0NBTihwRGV2aWNlKTsKICAgICAgICAgICAgICAgICB9CkBAIC02MzUsMTIgKzYzNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwRGV2aWNlLT5kZXYpKXsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUocERldmljZS0+ZGV2KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRGlzY29ubmVjdCBTU0lEIG5vbmVcbiIpOwogCQkgICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgCXVuaW9uIGl3cmVxX2RhdGEgIHdycXU7CiAgICAgICAgICAgICAgICAgICAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2YgKHdycXUpKTsKQEAgLTY4NSw3ICs2ODYsNyBAQAogCSAgICAgICAgICBwRGV2aWNlLT5ieUxpbmtXYWl0Q291bnQgPSAwOwogCQkgI2lmIDAKICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgCXVuaW9uIGl3cmVxX2RhdGEgIHdycXU7CiAgICAgICAgICAgICAgICAgICAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2YgKHdycXUpKTsKQEAgLTcwNyw3ICs3MDgsNyBAQAogICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+ZUF1dGhlbk1vZGUgPj0gV01BQ19BVVRIX1dQQSkgewogICAgICAgICAgICAgICAgICAgICBLZXliUmVtb3ZlQWxsS2V5KCYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJTU0lELCBwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5TGlua1dhaXRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgcERldmljZS0+YnlSZUFzc29jQ291bnQgPSAwOwogICAgICAgICAgICAgICAgIGJDbGVhckJTU0lEX1NDQU4ocERldmljZSk7CkBAIC03MTksMjAgKzcyMCwyMCBAQAogICAgICAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAgICAgICAgICAgICAgICAgfQogCSAgICAgI2lmZGVmIFR4SW5TbGVlcAotCQkgaWYocERldmljZS0+SXNUeERhdGFUcmlnZ2VyICE9IEZBTFNFKSAgIHsgICAgLy9UeERhdGFUaW1lciBpcyBub3QgdHJpZ2dlcmVkIGF0IHRoZSBmaXJzdCB0aW1lCisJCSBpZihwRGV2aWNlLT5Jc1R4RGF0YVRyaWdnZXIgIT0gZmFsc2UpICAgeyAgICAvL1R4RGF0YVRpbWVyIGlzIG5vdCB0cmlnZ2VyZWQgYXQgdGhlIGZpcnN0IHRpbWUKICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50aygiUmUtaW5pdGlhbCBUeERhdGFUaW1lcioqKipcbiIpOwogCQkgICAgZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJUeERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgIGluaXRfdGltZXIoJnBEZXZpY2UtPnNUaW1lclR4RGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+c1RpbWVyVHhEYXRhLmRhdGEgPSAoVUxPTkcpcERldmljZTsKKyAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5zVGltZXJUeERhdGEuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwRGV2aWNlOwogICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPnNUaW1lclR4RGF0YS5mdW5jdGlvbiA9IChUaW1lckZ1bmN0aW9uKUJTU3ZTZWNvbmRUeERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+c1RpbWVyVHhEYXRhLmV4cGlyZXMgPSBSVU5fQVQoMTAqSFopOyAgICAgIC8vMTBzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+ZlR4RGF0YUluU2xlZXAgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5mVHhEYXRhSW5TbGVlcCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPm5UeERhdGFUaW1lQ291dCA9IDA7CiAJCSB9CiAJCSBlbHNlIHsKIAkJICAgLy8gcHJpbnRrKCJtaWtlOi0tPkZpcnN0IHRpbWUgdHJpZ2VyIFRpbWVyVHhEYXRhIEluU2xlZXBcbiIpOwogCQkgfQotCQlwRGV2aWNlLT5Jc1R4RGF0YVRyaWdnZXIgPSBUUlVFOworCQlwRGV2aWNlLT5Jc1R4RGF0YVRyaWdnZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgIGFkZF90aW1lcigmcERldmljZS0+c1RpbWVyVHhEYXRhKTsKICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgIH0KQEAgLTc0OSw3ICs3NTAsNyBAQAogCSAgICAgICAgICBwRGV2aWNlLT5ieUxpbmtXYWl0Q291bnQgPSAwOwogCQkjaWYgMAogICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAvLyBpZihwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID09IHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAJdW5pb24gaXdyZXFfZGF0YSAgd3JxdTsKICAgICAgICAgICAgICAgICAgIAltZW1zZXQoJndycXUsIDAsIHNpemVvZiAod3JxdSkpOwpAQCAtNzcwLDE0ICs3NzEsMTQgQEAKICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyTW9kZSA9IFdNQUNfTU9ERV9TVEFOREJZOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCA9PSB0cnVlKQogICAgICAgICAgICAgICAgICAgICBCU1N2Q2xlYXJOb2RlREJUYWJsZShwRGV2aWNlLCAxKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIEJTU3ZDbGVhck5vZGVEQlRhYmxlKHBEZXZpY2UsIDApOwogICAgICAgICAgICAgICAgIHBEZXZpY2UtPnVBc3NvY0NvdW50ID0gMDsKICAgICAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5iRml4UmF0ZSA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJGaXhSYXRlID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICB2TWdyQ3JlYXRlT3duSUJTUygodm9pZCAqKXBEZXZpY2UsICZTdGF0dXMpOwogICAgICAgICAgICAgICAgIGlmIChTdGF0dXMgIT0gQ01EX1NUQVRVU19TVUNDRVNTKXsKQEAgLTc5MSw3ICs3OTIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHBEZXZpY2UtPmRldikpewogICAgICAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHBEZXZpY2UtPmRldik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IFRSVUU7CisgICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBhZGRfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CkBAIC04MDMsMTAgKzgwNCwxMCBAQAogICAgICAgICAgICAgICAgIHdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnBNZ210LT5zTm9kZURCVGFibGVbMF0uc1R4UFNRdWV1ZSkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcE1nbXQtPnNOb2RlREJUYWJsZVswXS5zVHhQU1F1ZXVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieVBTVHhNYXBbMF0gJj0gfmJ5TWFza1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJNb3JlRGF0YSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Yk1vcmVEYXRhID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTW9yZURhdGEgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Yk1vcmVEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kbWEwX3htaXQocERldmljZSwgc2tiLCAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTXVsdGljYXN0IHBzIHR4IGZhaWwgXG4iKTsKQEAgLTgyNiwxMCArODI3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdHggbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieVBTVHhNYXBbcE1nbXQtPnNOb2RlREJUYWJsZVtpaV0ud0FJRCA+PiAzXSAmPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfmJ5TWFza1twTWdtdC0+c05vZGVEQlRhYmxlW2lpXS53QUlEICYgN107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Yk1vcmVEYXRhID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+Yk1vcmVEYXRhID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTW9yZURhdGEgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJNb3JlRGF0YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kbWEwX3htaXQocERldmljZSwgc2tiLCBpaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJzdGEgcHMgdHggZmFpbCBcbiIpOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+YnlNYXNrW3BNZ210LT5zTm9kZURCVGFibGVbaWldLndBSUQgJiA3XTsKICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkluZGV4PSVkIFBTIHF1ZXVlIGNsZWFyIFxuIiwgaWkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbaWldLmJSeFBTUG9sbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW2lpXS5iUnhQU1BvbGwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTg1Niw3ICs4NTcsNyBAQAogCiAgICAgICAgIGNhc2UgV0xBTl9DTURfUkFESU9fU1RBUlQgOgogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJlQ29tbWFuZFN0YXRlID09IFdMQU5fQ01EX1JBRElPX1NUQVJUXG4iKTsKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9DbWQgPT0gVFJVRSkKKyAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9DbWQgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPbihwRGV2aWNlKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7CkBAIC04OTYsMjMgKzg5NywyMyBAQAogCiAKIHN0YXRpYwotQk9PTAorYm9vbAogc19iQ29tbWFuZENvbXBsZXRlICgKICAgICBQU0RldmljZSBwRGV2aWNlCiAgICAgKQogewogICAgIFBXTEFOX0lFX1NTSUQgcFNTSUQ7Ci0gICAgQk9PTCAgICAgICAgICBiUmFkaW9DbWQgPSBGQUxTRTsKLSAgICAvL1dPUkQgICAgICAgICAgd0RlQXV0aGVuUmVhc29uID0gMDsKLSAgICBCT09MICAgICAgICAgIGJGb3JjZVNDQU4gPSBUUlVFOworICAgIGJvb2wgYlJhZGlvQ21kID0gZmFsc2U7CisgICAgLy91bnNpZ25lZCBzaG9ydCB3RGVBdXRoZW5SZWFzb24gPSAwOworICAgIGJvb2wgYkZvcmNlU0NBTiA9IHRydWU7CiAgICAgUFNNZ210T2JqZWN0ICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogCiAKICAgICBwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0gV0xBTl9DTURfSURMRTsKICAgICBpZiAocERldmljZS0+Y2JGcmVlQ21kUXVldWUgPT0gQ01EX1FfU0laRSkgewogICAgICAgICAvL0NvbW1hbmQgUXVldWUgRW1wdHkKLSAgICAgICAgcERldmljZS0+YkNtZFJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHBEZXZpY2UtPmJDbWRSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgcERldmljZS0+ZUNvbW1hbmQgPSBwRGV2aWNlLT5lQ21kUXVldWVbcERldmljZS0+dUNtZERlcXVldWVJZHhdLmVDbWQ7CkBAIC05MjEsNyArOTIyLDcgQEAKICAgICAgICAgYkZvcmNlU0NBTiA9IHBEZXZpY2UtPmVDbWRRdWV1ZVtwRGV2aWNlLT51Q21kRGVxdWV1ZUlkeF0uYkZvcmNlU0NBTjsKICAgICAgICAgQUREX09ORV9XSVRIX1dSQVBfQVJPVU5EKHBEZXZpY2UtPnVDbWREZXF1ZXVlSWR4LCBDTURfUV9TSVpFKTsKICAgICAgICAgcERldmljZS0+Y2JGcmVlQ21kUXVldWUrKzsKLSAgICAgICAgcERldmljZS0+YkNtZFJ1bm5pbmcgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5iQ21kUnVubmluZyA9IHRydWU7CiAgICAgICAgIHN3aXRjaCAoIHBEZXZpY2UtPmVDb21tYW5kICkgewogICAgICAgICAgICAgY2FzZSBXTEFOX0NNRF9CU1NJRF9TQ0FOOgogICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iZUNvbW1hbmRTdGF0ZT0gV0xBTl9DTURfQlNTSURfU0NBTlxuIik7CkBAIC05MzMsNyArOTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBNZ210LT5hYnlTY2FuU1NJRCwgMCwgV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMSk7CiAgICAgICAgICAgICAgICAgfQogLyoKLSAgICAgICAgICAgICAgICBpZiAoKGJGb3JjZVNDQU4gPT0gRkFMU0UpICYmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJGb3JjZVNDQU4gPT0gZmFsc2UpICYmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChwU1NJRC0+bGVuID09ICgoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQpLT5sZW4pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoICFtZW1jbXAocFNTSUQtPmFieVNTSUQsICgoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQpLT5hYnlTU0lELCBwU1NJRC0+bGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmVDb21tYW5kU3RhdGUgPSBXTEFOX0NNRF9JRExFOwpAQCAtOTc0LDI1ICs5NzUsMjUgQEAKICAgICAgICAgdkNvbW1hbmRUaW1lcldhaXQoKHZvaWQgKilwRGV2aWNlLCAwKTsKICAgICB9CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCiAKLUJPT0wgYlNjaGVkdWxlQ29tbWFuZCAoCitib29sIGJTY2hlZHVsZUNvbW1hbmQgKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAogICAgIENNRF9DT0RFICAgIGVDb21tYW5kLAotICAgIFBCWVRFICAgICAgIHBieUl0ZW0wCisgICAgdW5zaWduZWQgY2hhciAqcGJ5SXRlbTAKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAKIAogICAgIGlmIChwRGV2aWNlLT5jYkZyZWVDbWRRdWV1ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICByZXR1cm4gKGZhbHNlKTsKICAgICB9CiAgICAgcERldmljZS0+ZUNtZFF1ZXVlW3BEZXZpY2UtPnVDbWRFbnF1ZXVlSWR4XS5lQ21kID0gZUNvbW1hbmQ7Ci0gICAgcERldmljZS0+ZUNtZFF1ZXVlW3BEZXZpY2UtPnVDbWRFbnF1ZXVlSWR4XS5iRm9yY2VTQ0FOID0gVFJVRTsKKyAgICBwRGV2aWNlLT5lQ21kUXVldWVbcERldmljZS0+dUNtZEVucXVldWVJZHhdLmJGb3JjZVNDQU4gPSB0cnVlOwogICAgIG1lbXNldChwRGV2aWNlLT5lQ21kUXVldWVbcERldmljZS0+dUNtZEVucXVldWVJZHhdLmFieUNtZERlc2lyZVNTSUQsIDAgLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKIAogICAgIGlmIChwYnlJdGVtMCAhPSBOVUxMKSB7CkBAIC0xMDAxLDcgKzEwMDIsNyBAQAogICAgICAgICAgICAgY2FzZSBXTEFOX0NNRF9CU1NJRF9TQ0FOOgogICAgICAgICAgICAgICAgIG1lbWNweShwRGV2aWNlLT5lQ21kUXVldWVbcERldmljZS0+dUNtZEVucXVldWVJZHhdLmFieUNtZERlc2lyZVNTSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ5SXRlbTAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpOwotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmVDbWRRdWV1ZVtwRGV2aWNlLT51Q21kRW5xdWV1ZUlkeF0uYkZvcmNlU0NBTiA9IEZBTFNFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmVDbWRRdWV1ZVtwRGV2aWNlLT51Q21kRW5xdWV1ZUlkeF0uYkZvcmNlU0NBTiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIFdMQU5fQ01EX1NTSUQ6CkBAIC0xMDE0LDcgKzEwMTUsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogLyoKICAgICAgICAgICAgIGNhc2UgV0xBTl9DTURfREVBVVRIOgotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmVDbWRRdWV1ZVtwRGV2aWNlLT51Q21kRW5xdWV1ZUlkeF0ud0RlQXV0aGVuUmVhc29uID0gKigoUFdPUkQpcGJ5SXRlbTApOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmVDbWRRdWV1ZVtwRGV2aWNlLT51Q21kRW5xdWV1ZUlkeF0ud0RlQXV0aGVuUmVhc29uID0gKigodW5zaWduZWQgc2hvcnQgKilwYnlJdGVtMCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAqLwogCkBAIC0xMDM3LDEyICsxMDM4LDEyIEBACiAgICAgQUREX09ORV9XSVRIX1dSQVBfQVJPVU5EKHBEZXZpY2UtPnVDbWRFbnF1ZXVlSWR4LCBDTURfUV9TSVpFKTsKICAgICBwRGV2aWNlLT5jYkZyZWVDbWRRdWV1ZS0tOwogCi0gICAgaWYgKHBEZXZpY2UtPmJDbWRSdW5uaW5nID09IEZBTFNFKSB7CisgICAgaWYgKHBEZXZpY2UtPmJDbWRSdW5uaW5nID09IGZhbHNlKSB7CiAgICAgICAgIHNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgfQotICAgIHJldHVybiAoVFJVRSk7CisgICAgcmV0dXJuICh0cnVlKTsKIAogfQogCkBAIC0xMDU3LDE2ICsxMDU4LDE2IEBACiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgotICogUmV0dXJuIFZhbHVlOiBUUlVFIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZQogICoKICAqLwotQk9PTCBiQ2xlYXJCU1NJRF9TQ0FOICgKK2Jvb2wgYkNsZWFyQlNTSURfU0NBTiAoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQKICAgICApCiB7CiAgICAgUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7Ci0gICAgVUlOVCAgICAgICAgICAgIHVDbWREZXF1ZXVlSWR4ID0gcERldmljZS0+dUNtZERlcXVldWVJZHg7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCB1Q21kRGVxdWV1ZUlkeCA9IHBEZXZpY2UtPnVDbWREZXF1ZXVlSWR4OworICAgIHVuc2lnbmVkIGludCBpaTsKIAogICAgIGlmICgocERldmljZS0+Y2JGcmVlQ21kUXVldWUgPCBDTURfUV9TSVpFKSAmJiAodUNtZERlcXVldWVJZHggIT0gcERldmljZS0+dUNtZEVucXVldWVJZHgpKSB7CiAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChDTURfUV9TSVpFIC0gcERldmljZS0+Y2JGcmVlQ21kUXVldWUpOyBpaSArKykgewpAQCAtMTA3Nyw3ICsxMDc4LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy9taWtlIGFkZDpyZXNldCBjb21tYW5kIHRpbWVyCkBAIC0xMDkyLDE1ICsxMDkzLDE1IEBACiAgICAgICBkZWxfdGltZXIoJnBEZXZpY2UtPnNUaW1lckNvbW1hbmQpOwogICAvL2luaXQgdGltZXIKICAgICAgIGluaXRfdGltZXIoJnBEZXZpY2UtPnNUaW1lckNvbW1hbmQpOwotICAgIHBEZXZpY2UtPnNUaW1lckNvbW1hbmQuZGF0YSA9IChVTE9ORylwRGV2aWNlOworICAgIHBEZXZpY2UtPnNUaW1lckNvbW1hbmQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwRGV2aWNlOwogICAgIHBEZXZpY2UtPnNUaW1lckNvbW1hbmQuZnVuY3Rpb24gPSAoVGltZXJGdW5jdGlvbil2Q29tbWFuZFRpbWVyOwogICAgIHBEZXZpY2UtPnNUaW1lckNvbW1hbmQuZXhwaXJlcyA9IFJVTl9BVChIWik7CiAgICAgcERldmljZS0+Y2JGcmVlQ21kUXVldWUgPSBDTURfUV9TSVpFOwogICAgIHBEZXZpY2UtPnVDbWREZXF1ZXVlSWR4ID0gMDsKICAgICBwRGV2aWNlLT51Q21kRW5xdWV1ZUlkeCA9IDA7CiAgICAgcERldmljZS0+ZUNvbW1hbmRTdGF0ZSA9IFdMQU5fQ01EX0lETEU7Ci0gICAgcERldmljZS0+YkNtZFJ1bm5pbmcgPSBGQUxTRTsKLSAgICBwRGV2aWNlLT5iQ21kQ2xlYXIgPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5iQ21kUnVubmluZyA9IGZhbHNlOworICAgIHBEZXZpY2UtPmJDbWRDbGVhciA9IGZhbHNlOwogfQogCiAKQEAgLTExMjUsMTYgKzExMjYsMTYgQEAKIAogICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgI2lmIDEKLSAgaWYoKChwRGV2aWNlLT5iTGlua1Bhc3MgPT1UUlVFKSYmKHBNZ210LT5lQXV0aGVuTW9kZSA8IFdNQUNfQVVUSF9XUEEpKSB8fCAgLy9vcGVuICYmIHNoYXJla2V5IGxpbmtpbmcKLSAgICAgIChwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID09IFRSVUUpKSB7ICAgLy93cGEgbGlua2luZworICBpZigoKHBEZXZpY2UtPmJMaW5rUGFzcyA9PXRydWUpJiYocE1nbXQtPmVBdXRoZW5Nb2RlIDwgV01BQ19BVVRIX1dQQSkpIHx8ICAvL29wZW4gJiYgc2hhcmVrZXkgbGlua2luZworICAgICAgKHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPT0gdHJ1ZSkpIHsgICAvL3dwYSBsaW5raW5nCiAgI2Vsc2UKLSAgaWYocERldmljZS0+YkxpbmtQYXNzID09VFJVRSkgeworICBpZihwRGV2aWNlLT5iTGlua1Bhc3MgPT10cnVlKSB7CiAgI2VuZGlmCiAKICAgICAgICAgLy8gICBwcmludGsoIm1pa2U6JXMtLT5JblNsZWVwIFR4IERhdGEgUHJvY2VkdXJlXG4iLF9fRlVOQ1RJT05fXyk7Ci0JICBwRGV2aWNlLT5mVHhEYXRhSW5TbGVlcCA9IFRSVUU7CisJICBwRGV2aWNlLT5mVHhEYXRhSW5TbGVlcCA9IHRydWU7CiAJICBQU2JTZW5kTnVsbFBhY2tldChwRGV2aWNlKTsgICAgICAvL3NlbmQgbnVsbCBwYWNrZXQKLQkgIHBEZXZpY2UtPmZUeERhdGFJblNsZWVwID0gRkFMU0U7CisJICBwRGV2aWNlLT5mVHhEYXRhSW5TbGVlcCA9IGZhbHNlOwogICAJfQogICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5oCmluZGV4IGMzYzQxODAuLjY5ZDRmYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2NtZC5oCkBAIC03NSwxMSArNzUsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnQ01EX0lURU0gewogICAgIENNRF9DT0RFIGVDbWQ7Ci0gICAgQllURSAgICAgYWJ5Q21kRGVzaXJlU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKLSAgICBCT09MICAgICBiTmVlZFJhZGlvT0ZGOwotICAgIFdPUkQgICAgIHdEZUF1dGhlblJlYXNvbjsKLSAgICBCT09MICAgICBiUmFkaW9DbWQ7Ci0gICAgQk9PTCAgICAgYkZvcmNlU0NBTjsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUNtZERlc2lyZVNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgYm9vbCBiTmVlZFJhZGlvT0ZGOworICAgIHVuc2lnbmVkIHNob3J0IHdEZUF1dGhlblJlYXNvbjsKKyAgICBib29sIGJSYWRpb0NtZDsKKyAgICBib29sIGJGb3JjZVNDQU47CiB9IENNRF9JVEVNLCAqUENNRF9JVEVNOwogCiAvLyBDb21tYW5kIHN0YXRlCkBAIC0xMTksMjEgKzExOSwyMSBAQAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0CiAgICAgKTsKIAotQk9PTCBiQ2xlYXJCU1NJRF9TQ0FOKAorYm9vbCBiQ2xlYXJCU1NJRF9TQ0FOKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0CiAgICAgKTsKIAotQk9PTAorYm9vbAogYlNjaGVkdWxlQ29tbWFuZCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKICAgICBDTURfQ09ERSAgICBlQ29tbWFuZCwKLSAgICBQQllURSAgICAgICBwYnlJdGVtMAorICAgIHVuc2lnbmVkIGNoYXIgKnBieUl0ZW0wCiAgICAgKTsKIAogdm9pZAogdkNvbW1hbmRUaW1lcldhaXQoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCi0gICAgVUlOVCBNU2Vjb25kCisgICAgdW5zaWduZWQgaW50IE1TZWNvbmQKICAgICApOwogI2lmZGVmIFR4SW5TbGVlcAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djdGwuYwppbmRleCA2NGE2NmIyLi5jMDk2NTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djdGwuYwpAQCAtNTIsOCArNTIsOCBAQAogCiAvKgogICogRGVzY3JpcHRpb246Ci0gKiAgICAgIFNjYW4gUnggY2FjaGUuICBSZXR1cm4gVFJVRSBpZiBwYWNrZXQgaXMgZHVwbGljYXRlLCBlbHNlCi0gKiAgICAgIGluc2VydHMgaW4gcmVjZWl2ZSBjYWNoZSBhbmQgcmV0dXJucyBGQUxTRS4KKyAqICAgICAgU2NhbiBSeCBjYWNoZS4gIFJldHVybiB0cnVlIGlmIHBhY2tldCBpcyBkdXBsaWNhdGUsIGVsc2UKKyAqICAgICAgaW5zZXJ0cyBpbiByZWNlaXZlIGNhY2hlIGFuZCByZXR1cm5zIGZhbHNlLgogICoKICAqIFBhcmFtZXRlcnM6CiAgKiAgSW46CkBAIC02MiwxNCArNjIsMTQgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgcGFja2V0IGR1cGxpY2F0ZTsgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgcGFja2V0IGR1cGxpY2F0ZTsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCiAKLUJPT0wgV0NUTGJJc0R1cGxpY2F0ZSAoUFNDYWNoZSBwQ2FjaGUsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIpCitib29sIFdDVExiSXNEdXBsaWNhdGUgKFBTQ2FjaGUgcENhY2hlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyKQogewotICAgIFVJTlQgICAgICAgICAgICB1SW5kZXg7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOworICAgIHVuc2lnbmVkIGludCB1SW5kZXg7CisgICAgdW5zaWduZWQgaW50IGlpOwogICAgIFBTQ2FjaGVFbnRyeSAgICBwQ2FjaGVFbnRyeTsKIAogICAgIGlmIChJU19GQ19SRVRSWShwTUFDSGVhZGVyKSkgewpAQCAtNzgsMTAgKzc4LDEwIEBACiAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IERVUExJQ0FURV9SWF9DQUNIRV9MRU5HVEg7IGlpKyspIHsKICAgICAgICAgICAgIHBDYWNoZUVudHJ5ID0gJihwQ2FjaGUtPmFzQ2FjaGVFbnRyeVt1SW5kZXhdKTsKICAgICAgICAgICAgIGlmICgocENhY2hlRW50cnktPndGbVNlcXVlbmNlID09IHBNQUNIZWFkZXItPndTZXFDdGwpICYmCi0gICAgICAgICAgICAgICAgKElTX0VUSF9BRERSRVNTX0VRVUFMICgmKHBDYWNoZUVudHJ5LT5hYnlBZGRyMlswXSksICYocE1BQ0hlYWRlci0+YWJ5QWRkcjJbMF0pKSkKKyAgICAgICAgICAgICAgICAoIWNvbXBhcmVfZXRoZXJfYWRkcigmKHBDYWNoZUVudHJ5LT5hYnlBZGRyMlswXSksICYocE1BQ0hlYWRlci0+YWJ5QWRkcjJbMF0pKSkKICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAvKiBEdXBsaWNhdGUgbWF0Y2ggKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFERF9PTkVfV0lUSF9XUkFQX0FST1VORCh1SW5kZXgsIERVUExJQ0FURV9SWF9DQUNIRV9MRU5HVEgpOwogICAgICAgICB9CkBAIC05MSw3ICs5MSw3IEBACiAgICAgcENhY2hlRW50cnktPndGbVNlcXVlbmNlID0gcE1BQ0hlYWRlci0+d1NlcUN0bDsKICAgICBtZW1jcHkoJihwQ2FjaGVFbnRyeS0+YWJ5QWRkcjJbMF0pLCAmKHBNQUNIZWFkZXItPmFieUFkZHIyWzBdKSwgRVRIX0FMRU4pOwogICAgIEFERF9PTkVfV0lUSF9XUkFQX0FST1VORChwQ2FjaGUtPnVJblB0ciwgRFVQTElDQVRFX1JYX0NBQ0hFX0xFTkdUSCk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogLyoKQEAgLTEwOCwxMyArMTA4LDEzIEBACiAgKiBSZXR1cm4gVmFsdWU6IGluZGV4IG51bWJlciBpbiBEZWZyYWdtZW50IERhdGFiYXNlCiAgKgogICovCi1VSU5UIFdDVEx1U2VhcmNoREZDQiAoUFNEZXZpY2UgcERldmljZSwgUFM4MDJfMTFIZWFkZXIgcE1BQ0hlYWRlcikKK3Vuc2lnbmVkIGludCBXQ1RMdVNlYXJjaERGQ0IgKFBTRGV2aWNlIHBEZXZpY2UsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIpCiB7Ci1VSU5UIGlpOwordW5zaWduZWQgaW50IGlpOwogCiAgICAgZm9yKGlpPTA7aWk8cERldmljZS0+Y2JERkNCO2lpKyspIHsKLSAgICAgICAgaWYgKChwRGV2aWNlLT5zUnhERkNCW2lpXS5iSW5Vc2UgPT0gVFJVRSkgJiYKLSAgICAgICAgICAgIChJU19FVEhfQUREUkVTU19FUVVBTCAoJihwRGV2aWNlLT5zUnhERkNCW2lpXS5hYnlBZGRyMlswXSksICYocE1BQ0hlYWRlci0+YWJ5QWRkcjJbMF0pKSkKKyAgICAgICAgaWYgKChwRGV2aWNlLT5zUnhERkNCW2lpXS5iSW5Vc2UgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgICghY29tcGFyZV9ldGhlcl9hZGRyKCYocERldmljZS0+c1J4REZDQltpaV0uYWJ5QWRkcjJbMF0pLCAmKHBNQUNIZWFkZXItPmFieUFkZHIyWzBdKSkpCiAgICAgICAgICAgICApIHsKICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICByZXR1cm4oaWkpOwpAQCAtMTM4LDE3ICsxMzgsMTcgQEAKICAqIFJldHVybiBWYWx1ZTogaW5kZXggbnVtYmVyIGluIERlZnJhZ21lbnQgRGF0YWJhc2UKICAqCiAgKi8KLVVJTlQgV0NUTHVJbnNlcnRERkNCIChQU0RldmljZSBwRGV2aWNlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyKQordW5zaWduZWQgaW50IFdDVEx1SW5zZXJ0REZDQiAoUFNEZXZpY2UgcERldmljZSwgUFM4MDJfMTFIZWFkZXIgcE1BQ0hlYWRlcikKIHsKLVVJTlQgaWk7Cit1bnNpZ25lZCBpbnQgaWk7CiAKICAgICBpZiAocERldmljZS0+Y2JGcmVlREZDQiA9PSAwKQogICAgICAgICByZXR1cm4ocERldmljZS0+Y2JERkNCKTsKICAgICBmb3IoaWk9MDtpaTxwRGV2aWNlLT5jYkRGQ0I7aWkrKykgewotICAgICAgICBpZiAocERldmljZS0+c1J4REZDQltpaV0uYkluVXNlID09IEZBTFNFKSB7CisgICAgICAgIGlmIChwRGV2aWNlLT5zUnhERkNCW2lpXS5iSW5Vc2UgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIHBEZXZpY2UtPmNiRnJlZURGQ0ItLTsKICAgICAgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbaWldLnVMaWZldGltZSA9IHBEZXZpY2UtPmR3TWF4UmVjZWl2ZUxpZmV0aW1lOwotICAgICAgICAgICAgcERldmljZS0+c1J4REZDQltpaV0uYkluVXNlID0gVFJVRTsKKyAgICAgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbaWldLmJJblVzZSA9IHRydWU7CiAgICAgICAgICAgICBwRGV2aWNlLT5zUnhERkNCW2lpXS53U2VxdWVuY2UgPSAocE1BQ0hlYWRlci0+d1NlcUN0bCA+PiA0KTsKICAgICAgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbaWldLndGcmFnTnVtID0gKHBNQUNIZWFkZXItPndTZXFDdGwgJiAweDAwMEYpOwogICAgICAgICAgICAgbWVtY3B5KCYocERldmljZS0+c1J4REZDQltpaV0uYWJ5QWRkcjJbMF0pLCAmKHBNQUNIZWFkZXItPmFieUFkZHIyWzBdKSwgRVRIX0FMRU4pOwpAQCAtMTcyLDE1ICsxNzIsMTUgQEAKICAqICBPdXQ6CiAgKiAgICAgIG5vbmUKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgaXQgaXMgdmFsaWQgZnJhZ21lbnQgcGFja2V0IGFuZCB3ZSBoYXZlIHJlc291cmNlIHRvIGRlZnJhZ21lbnQ7IG90aGVyd2lzZSBGQUxTRQorICogUmV0dXJuIFZhbHVlOiB0cnVlIGlmIGl0IGlzIHZhbGlkIGZyYWdtZW50IHBhY2tldCBhbmQgd2UgaGF2ZSByZXNvdXJjZSB0byBkZWZyYWdtZW50OyBvdGhlcndpc2UgZmFsc2UKICAqCiAgKi8KLUJPT0wgV0NUTGJIYW5kbGVGcmFnbWVudCAoUFNEZXZpY2UgcERldmljZSwgUFM4MDJfMTFIZWFkZXIgcE1BQ0hlYWRlciwgVUlOVCBjYkZyYW1lTGVuZ3RoLCBCT09MIGJXRVAsIEJPT0wgYkV4dElWKQorYm9vbCBXQ1RMYkhhbmRsZUZyYWdtZW50IChQU0RldmljZSBwRGV2aWNlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyLCB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwgYm9vbCBiV0VQLCBib29sIGJFeHRJVikKIHsKLVVJTlQgICAgICAgICAgICB1SGVhZGVyU2l6ZTsKK3Vuc2lnbmVkIGludCB1SGVhZGVyU2l6ZTsKIAogCi0gICAgaWYgKGJXRVAgPT0gVFJVRSkgeworICAgIGlmIChiV0VQID09IHRydWUpIHsKICAgICAgICAgdUhlYWRlclNpemUgPSAyODsKICAgICAgICAgaWYgKGJFeHRJVikKICAgICAgICAgLy8gRXh0SVYKQEAgLTIwMSwxNyArMjAxLDE3IEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcERldmljZS0+dUN1cnJlbnRERkNCSWR4ID0gV0NUTHVJbnNlcnRERkNCKHBEZXZpY2UsIHBNQUNIZWFkZXIpOwogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPnVDdXJyZW50REZDQklkeCA9PSBwRGV2aWNlLT5jYkRGQ0IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gcmVzZXJ2ZSA0IGJ5dGUgdG8gbWF0Y2ggTUFDIFJYIEJ1ZmZlcgotICAgICAgICBwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0ucGJ5UnhCdWZmZXIgPSAoUEJZVEUpIChwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0uc2tiLT5kYXRhICsgNCk7CisgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS5wYnlSeEJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIChwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0uc2tiLT5kYXRhICsgNCk7CiAgICAgICAgIG1lbWNweShwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0ucGJ5UnhCdWZmZXIsIHBNQUNIZWFkZXIsIGNiRnJhbWVMZW5ndGgpOwogICAgICAgICBwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0uY2JGcmFtZUxlbmd0aCA9IGNiRnJhbWVMZW5ndGg7CiAgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS5wYnlSeEJ1ZmZlciArPSBjYkZyYW1lTGVuZ3RoOwogICAgICAgICBwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0ud0ZyYWdOdW0rKzsKICAgICAgICAgLy9EQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJGaXJzdCBwRGV2aWNlLT51Q3VycmVudERGQ0JJZHg9ICVkXG4iLCBwRGV2aWNlLT51Q3VycmVudERGQ0JJZHgpOwotICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICByZXR1cm4oZmFsc2UpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgcERldmljZS0+dUN1cnJlbnRERkNCSWR4ID0gV0NUTHVTZWFyY2hERkNCKHBEZXZpY2UsIHBNQUNIZWFkZXIpOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgKHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS53RnJhZ051bSA9PSAocE1BQ0hlYWRlci0+d1NlcUN0bCAmIDB4MDAwRikpICYmCiAgICAgICAgICAgICAgICAgKChwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0uY2JGcmFtZUxlbmd0aCArIGNiRnJhbWVMZW5ndGggLSB1SGVhZGVyU2l6ZSkgPCAyMzQ2KSkgewogCi0gICAgICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS5wYnlSeEJ1ZmZlciwgKChQQllURSkgKHBNQUNIZWFkZXIpICsgdUhlYWRlclNpemUpLCAoY2JGcmFtZUxlbmd0aCAtIHVIZWFkZXJTaXplKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS5wYnlSeEJ1ZmZlciwgKCh1bnNpZ25lZCBjaGFyICopIChwTUFDSGVhZGVyKSArIHVIZWFkZXJTaXplKSwgKGNiRnJhbWVMZW5ndGggLSB1SGVhZGVyU2l6ZSkpOwogICAgICAgICAgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS5jYkZyYW1lTGVuZ3RoICs9IChjYkZyYW1lTGVuZ3RoIC0gdUhlYWRlclNpemUpOwogICAgICAgICAgICAgICAgIHBEZXZpY2UtPnNSeERGQ0JbcERldmljZS0+dUN1cnJlbnRERkNCSWR4XS5wYnlSeEJ1ZmZlciArPSAoY2JGcmFtZUxlbmd0aCAtIHVIZWFkZXJTaXplKTsKICAgICAgICAgICAgICAgICBwRGV2aWNlLT5zUnhERkNCW3BEZXZpY2UtPnVDdXJyZW50REZDQklkeF0ud0ZyYWdOdW0rKzsKQEAgLTIyOSwyMSArMjI5LDIxIEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBzZXEgZXJyb3Igb3IgZnJhZyAjIGVycm9yIGZsdXNoIERGQ0IKICAgICAgICAgICAgICAgICBwRGV2aWNlLT5jYkZyZWVERkNCKys7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+c1J4REZDQltwRGV2aWNlLT51Q3VycmVudERGQ0JJZHhdLmJJblVzZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHJldHVybihGQUxTRSk7CisgICAgICAgICAgICAgICAgcERldmljZS0+c1J4REZDQltwRGV2aWNlLT51Q3VycmVudERGQ0JJZHhdLmJJblVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybihmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoSVNfTEFTVF9GUkFHTUVOVF9QS1QocE1BQ0hlYWRlcikpIHsKICAgICAgICAgICAgIC8vZW5xIGRlZnJhZ2NvbnRyb2xibG9jawogICAgICAgICAgICAgcERldmljZS0+Y2JGcmVlREZDQisrOwotICAgICAgICAgICAgcERldmljZS0+c1J4REZDQltwRGV2aWNlLT51Q3VycmVudERGQ0JJZHhdLmJJblVzZSA9IEZBTFNFOworICAgICAgICAgICAgcERldmljZS0+c1J4REZDQltwRGV2aWNlLT51Q3VycmVudERGQ0JJZHhdLmJJblVzZSA9IGZhbHNlOwogICAgICAgICAgICAgLy9EQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJMYXN0IHBEZXZpY2UtPnVDdXJyZW50REZDQklkeD0gJWRcbiIsIHBEZXZpY2UtPnVDdXJyZW50REZDQklkeCk7Ci0gICAgICAgICAgICByZXR1cm4oVFJVRSk7CisgICAgICAgICAgICByZXR1cm4odHJ1ZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuKGZhbHNlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y3RsLmgKaW5kZXggYTFhYzQ3OS4uYTkyYmI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y3RsLmgKQEAgLTk3LDEwICs5NywxMSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CT09MIFdDVExiSXNEdXBsaWNhdGUoUFNDYWNoZSBwQ2FjaGUsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIpOwotQk9PTCBXQ1RMYkhhbmRsZUZyYWdtZW50KFBTRGV2aWNlIHBEZXZpY2UsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIsIFVJTlQgY2JGcmFtZUxlbmd0aCwgQk9PTCBiV0VQLCBCT09MIGJFeHRJVik7Ci1VSU5UIFdDVEx1U2VhcmNoREZDQihQU0RldmljZSBwRGV2aWNlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyKTsKLVVJTlQgV0NUTHVJbnNlcnRERkNCKFBTRGV2aWNlIHBEZXZpY2UsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIpOworYm9vbCBXQ1RMYklzRHVwbGljYXRlKFBTQ2FjaGUgcENhY2hlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyKTsKK2Jvb2wgV0NUTGJIYW5kbGVGcmFnbWVudChQU0RldmljZSBwRGV2aWNlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyLAorCQl1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwgYm9vbCBiV0VQLCBib29sIGJFeHRJVik7Cit1bnNpZ25lZCBpbnQgV0NUTHVTZWFyY2hERkNCKFBTRGV2aWNlIHBEZXZpY2UsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIpOwordW5zaWduZWQgaW50IFdDVEx1SW5zZXJ0REZDQihQU0RldmljZSBwRGV2aWNlLCBQUzgwMl8xMUhlYWRlciBwTUFDSGVhZGVyKTsKIAogI2VuZGlmIC8vIF9fV0NUTF9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93bWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwppbmRleCA4YWYzNTZmLi5lNTQwMTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwpAQCAtNjUsNiArNjUsNyBAQAogI2luY2x1ZGUgImRlc2MuaCIKICNpbmNsdWRlICJkZXZpY2UuaCIKICNpbmNsdWRlICJjYXJkLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgogI2luY2x1ZGUgIjgwMjExaGRyLmgiCiAjaW5jbHVkZSAiODAyMTFtZ3IuaCIKICNpbmNsdWRlICJ3bWdyLmgiCkBAIC05Myw5ICs5NCw5IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvLzIwMDgtOC00IDxhZGQ+IGJ5IGNoZXN0ZXIKLXN0YXRpYyBCT09MIENoYW5uZWxFeGNlZWRab25lVHlwZSgKK3N0YXRpYyBib29sIENoYW5uZWxFeGNlZWRab25lVHlwZSgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIEJZVEUgYnlDdXJyQ2hhbm5lbAorICAgIHVuc2lnbmVkIGNoYXIgYnlDdXJyQ2hhbm5lbAogICAgICk7CiAKIC8vIEFzc29jaWF0aW9uL2RpYXNzb2NpYXRpb24gZnVuY3Rpb25zCkBAIC0xMDQsOSArMTA1LDkgQEAKIHNfTWdyTWFrZUFzc29jUmVxdWVzdCgKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBQQllURSBwREFkZHIsCi0gICAgV09SRCB3Q3VyckNhcEluZm8sCi0gICAgV09SRCB3TGlzdGVuSW50ZXJ2YWwsCisgICAgdW5zaWduZWQgY2hhciAqcERBZGRyLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCB3TGlzdGVuSW50ZXJ2YWwsCiAgICAgUFdMQU5fSUVfU1NJRCBwQ3VyclNTSUQsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyclJhdGVzLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJFeHRTdXBwUmF0ZXMKQEAgLTExOCw3ICsxMTksNyBAQAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAogICAgIFBTUnhNZ210UGFja2V0IHBSeFBhY2tldCwKLSAgICBVSU5UICB1Tm9kZUluZGV4CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXgKICAgICApOwogCiBzdGF0aWMKQEAgLTEyNiw5ICsxMjcsOSBAQAogc19NZ3JNYWtlUmVBc3NvY1JlcXVlc3QoCiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBQU01nbXRPYmplY3QgcE1nbXQsCi0gICAgUEJZVEUgcERBZGRyLAotICAgIFdPUkQgd0N1cnJDYXBJbmZvLAotICAgIFdPUkQgd0xpc3RlbkludGVydmFsLAorICAgIHVuc2lnbmVkIGNoYXIgKnBEQWRkciwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckNhcEluZm8sCisgICAgdW5zaWduZWQgc2hvcnQgd0xpc3RlbkludGVydmFsLAogICAgIFBXTEFOX0lFX1NTSUQgcEN1cnJTU0lELAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyRXh0U3VwcFJhdGVzCkBAIC0xNDAsNyArMTQxLDcgQEAKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKICAgICBQU1J4TWdtdFBhY2tldCBwUnhQYWNrZXQsCi0gICAgQk9PTCBiUmVBc3NvY1R5cGUKKyAgICBib29sIGJSZUFzc29jVHlwZQogICAgICk7CiAKIHN0YXRpYwpAQCAtMjI1LDcgKzIyNiw3IEBACiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBQU01nbXRPYmplY3QgcE1nbXQsCiAgICAgUFNSeE1nbXRQYWNrZXQgcFJ4UGFja2V0LAotICAgIEJPT0wgYkluU2NhbgorICAgIGJvb2wgYkluU2NhbgogICAgICk7CiAKIHN0YXRpYwpAQCAtMjQwLDEyICsyNDEsMTIgQEAKIHNfTWdyTWFrZUJlYWNvbigKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBXT1JEIHdDdXJyQ2FwSW5mbywKLSAgICBXT1JEIHdDdXJyQmVhY29uUGVyaW9kLAotICAgIFVJTlQgdUN1cnJDaGFubmVsLAotICAgIFdPUkQgd0N1cnJBVElNV2lub2R3LAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckJlYWNvblBlcmlvZCwKKyAgICB1bnNpZ25lZCBpbnQgdUN1cnJDaGFubmVsLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQVRJTVdpbm9kdywKICAgICBQV0xBTl9JRV9TU0lEIHBDdXJyU1NJRCwKLSAgICBQQllURSBwQ3VyckJTU0lELAorICAgIHVuc2lnbmVkIGNoYXIgKnBDdXJyQlNTSUQsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyclN1cHBSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyRXh0U3VwcFJhdGVzCiAgICAgKTsKQEAgLTI1NywxMCArMjU4LDEwIEBACiBzX01nck1ha2VBc3NvY1Jlc3BvbnNlKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAotICAgIFdPUkQgd0N1cnJDYXBJbmZvLAotICAgIFdPUkQgd0Fzc29jU3RhdHVzLAotICAgIFdPUkQgd0Fzc29jQUlELAotICAgIFBCWVRFIHBEc3RBZGRyLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCB3QXNzb2NTdGF0dXMsCisgICAgdW5zaWduZWQgc2hvcnQgd0Fzc29jQUlELAorICAgIHVuc2lnbmVkIGNoYXIgKnBEc3RBZGRyLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcwogICAgICk7CkBAIC0yNzEsMTAgKzI3MiwxMCBAQAogc19NZ3JNYWtlUmVBc3NvY1Jlc3BvbnNlKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAotICAgIFdPUkQgd0N1cnJDYXBJbmZvLAotICAgIFdPUkQgd0Fzc29jU3RhdHVzLAotICAgIFdPUkQgd0Fzc29jQUlELAotICAgIFBCWVRFIHBEc3RBZGRyLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCB3QXNzb2NTdGF0dXMsCisgICAgdW5zaWduZWQgc2hvcnQgd0Fzc29jQUlELAorICAgIHVuc2lnbmVkIGNoYXIgKnBEc3RBZGRyLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcwogICAgICk7CkBAIC0yODUsMTYgKzI4NiwxNiBAQAogc19NZ3JNYWtlUHJvYmVSZXNwb25zZSgKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBXT1JEIHdDdXJyQ2FwSW5mbywKLSAgICBXT1JEIHdDdXJyQmVhY29uUGVyaW9kLAotICAgIFVJTlQgdUN1cnJDaGFubmVsLAotICAgIFdPUkQgd0N1cnJBVElNV2lub2R3LAotICAgIFBCWVRFIHBEc3RBZGRyLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckJlYWNvblBlcmlvZCwKKyAgICB1bnNpZ25lZCBpbnQgdUN1cnJDaGFubmVsLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQVRJTVdpbm9kdywKKyAgICB1bnNpZ25lZCBjaGFyICpwRHN0QWRkciwKICAgICBQV0xBTl9JRV9TU0lEIHBDdXJyU1NJRCwKLSAgICBQQllURSBwQ3VyckJTU0lELAorICAgIHVuc2lnbmVkIGNoYXIgKnBDdXJyQlNTSUQsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyclN1cHBSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyRXh0U3VwcFJhdGVzLAotICAgIEJZVEUgYnlQSFlUeXBlCisgICAgdW5zaWduZWQgY2hhciBieVBIWVR5cGUKICAgICApOwogCiAvLyByZWNlaXZlZCBzdGF0dXMKQEAgLTMwMiw3ICszMDMsNyBAQAogdm9pZAogc192TWdyTG9nU3RhdHVzKAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBXT1JEIHdTdGF0dXMKKyAgICB1bnNpZ25lZCBzaG9ydCB3U3RhdHVzCiAgICAgKTsKIAogCkBAIC0zMTAsMTggKzMxMSwxOCBAQAogdm9pZAogc192TWdyU3luY2hCU1MgKAogICAgIFBTRGV2aWNlICAgICAgcERldmljZSwKLSAgICBVSU5UICAgICAgICAgIHVCU1NNb2RlLAorICAgIHVuc2lnbmVkIGludCB1QlNTTW9kZSwKICAgICBQS25vd25CU1MgICAgIHBDdXJyLAogICAgIFBDTURfU1RBVFVTICBwU3RhdHVzCiAgICAgKTsKIAogCi1zdGF0aWMgQk9PTAorc3RhdGljIGJvb2wKIHNfYkNpcGhlck1hdGNoICgKICAgICBQS25vd25CU1MgICAgICAgICAgICAgICAgICAgICAgICBwQlNTTm9kZSwKICAgICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAgICBFbmNTdGF0dXMsCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlDQ1NQSywKLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBieUNDU0dLCisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q0NTUEssCisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q0NTR0sKICAgICApOwogCiAgc3RhdGljIHZvaWQgIEVuY3lwdGlvbl9SZWJ1aWxkKApAQCAtMzY4LDcgKzM2OSw3IEBACiAgICAgcE1nbXQtPmJ5Q1NTUEsgPSBLRVlfQ1RMX05PTkU7CiAgICAgcE1nbXQtPmJ5Q1NTR0sgPSBLRVlfQ1RMX05PTkU7CiAgICAgcE1nbXQtPndJQlNTQmVhY29uUGVyaW9kID0gREVGQVVMVF9JQlNTX0JJOwotICAgIEJTU3ZDbGVhckJTU0xpc3QoKHZvaWQgKilwRGV2aWNlLCBGQUxTRSk7CisgICAgQlNTdkNsZWFyQlNTTGlzdCgodm9pZCAqKXBEZXZpY2UsIGZhbHNlKTsKIAogICAgIHJldHVybjsKIH0KQEAgLTM5MywyMiArMzk0LDIyIEBACiAKIAogICAgIGluaXRfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7Ci0gICAgcE1nbXQtPnNUaW1lclNlY29uZENhbGxiYWNrLmRhdGEgPSAoVUxPTkcpcERldmljZTsKKyAgICBwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwRGV2aWNlOwogICAgIHBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjay5mdW5jdGlvbiA9IChUaW1lckZ1bmN0aW9uKUJTU3ZTZWNvbmRDYWxsQmFjazsKICAgICBwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2suZXhwaXJlcyA9IFJVTl9BVChIWik7CiAKICAgICBpbml0X3RpbWVyKCZwRGV2aWNlLT5zVGltZXJDb21tYW5kKTsKLSAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmRhdGEgPSAoVUxPTkcpcERldmljZTsKKyAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmRhdGEgPSAodW5zaWduZWQgbG9uZykgcERldmljZTsKICAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmZ1bmN0aW9uID0gKFRpbWVyRnVuY3Rpb24pdkNvbW1hbmRUaW1lcjsKICAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmV4cGlyZXMgPSBSVU5fQVQoSFopOwogCiAgICAjaWZkZWYgVHhJblNsZWVwCiAgICAgaW5pdF90aW1lcigmcERldmljZS0+c1RpbWVyVHhEYXRhKTsKLSAgICBwRGV2aWNlLT5zVGltZXJUeERhdGEuZGF0YSA9IChVTE9ORylwRGV2aWNlOworICAgIHBEZXZpY2UtPnNUaW1lclR4RGF0YS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHBEZXZpY2U7CiAgICAgcERldmljZS0+c1RpbWVyVHhEYXRhLmZ1bmN0aW9uID0gKFRpbWVyRnVuY3Rpb24pQlNTdlNlY29uZFR4RGF0YTsKICAgICBwRGV2aWNlLT5zVGltZXJUeERhdGEuZXhwaXJlcyA9IFJVTl9BVCgxMCpIWik7ICAgICAgLy8xMHMgY2FsbGJhY2sKLSAgICBwRGV2aWNlLT5mVHhEYXRhSW5TbGVlcCA9IEZBTFNFOwotICAgIHBEZXZpY2UtPklzVHhEYXRhVHJpZ2dlciA9IEZBTFNFOworICAgIHBEZXZpY2UtPmZUeERhdGFJblNsZWVwID0gZmFsc2U7CisgICAgcERldmljZS0+SXNUeERhdGFUcmlnZ2VyID0gZmFsc2U7CiAgICAgcERldmljZS0+blR4RGF0YVRpbWVDb3V0ID0gMDsKICAgICNlbmRpZgogCkBAIC00NDEsNyArNDQyLDcgQEAKIAogICAgIHBNZ210LT5lQ3Vyck1vZGUgPSBXTUFDX01PREVfU1RBTkRCWTsKICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKLSAgICBwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID0gRkFMU0U7CisgICAgcERldmljZS0+YkVuYWJsZVBTTW9kZSA9IGZhbHNlOwogICAgIC8vIFRPRE86IHRpbWVyCiAKICAgICByZXR1cm47CkBAIC00ODcsMTUgKzQ4OCwxNSBAQAogICAgIC8vIEVSUCBQaHkgKDgwMi4xMWcpIHNob3VsZCBzdXBwb3J0IHNob3J0IHByZWFtYmxlLgogICAgIGlmIChwTWdtdC0+ZUN1cnJlbnRQSFlNb2RlID09IFBIWV9UWVBFXzExRykgewogICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX1NIT1JUUFJFQU1CTEUoMSk7Ci0gICAgICAgIGlmIChDQVJEYklzU2hvclNsb3RUaW1lKHBNZ210LT5wQWRhcHRlcikgPT0gVFJVRSkgeworICAgICAgICBpZiAoQ0FSRGJJc1Nob3JTbG90VGltZShwTWdtdC0+cEFkYXB0ZXIpID09IHRydWUpIHsKICAgICAgICAgICAgIHBNZ210LT53Q3VyckNhcEluZm8gfD0gV0xBTl9TRVRfQ0FQX0lORk9fU0hPUlRTTE9UVElNRSgxKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAocE1nbXQtPmVDdXJyZW50UEhZTW9kZSA9PSBQSFlfVFlQRV8xMUIpIHsKLSAgICAgICAgaWYgKENBUkRiSXNTaG9ydFByZWFtYmxlKHBNZ210LT5wQWRhcHRlcikgPT0gVFJVRSkgeworICAgICAgICBpZiAoQ0FSRGJJc1Nob3J0UHJlYW1ibGUocE1nbXQtPnBBZGFwdGVyKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX1NIT1JUUFJFQU1CTEUoMSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBNZ210LT5iMTFoRW5hYmxlID09IFRSVUUpCisgICAgaWYgKHBNZ210LT5iMTFoRW5hYmxlID09IHRydWUpCiAgICAgICAgIHBNZ210LT53Q3VyckNhcEluZm8gfD0gV0xBTl9TRVRfQ0FQX0lORk9fU1BFQ1RSVU1NTkcoMSk7CiAKICAgICAvKiBidWlsZCBhbiBhc3NvY3JlcSBmcmFtZSBhbmQgc2VuZCBpdCAqLwpAQCAtNTY2LDE1ICs1NjcsMTUgQEAKICAgICAvLyBFUlAgUGh5ICg4MDIuMTFnKSBzaG91bGQgc3VwcG9ydCBzaG9ydCBwcmVhbWJsZS4KICAgICBpZiAocE1nbXQtPmVDdXJyZW50UEhZTW9kZSA9PSBQSFlfVFlQRV8xMUcpIHsKICAgICAgICAgcE1nbXQtPndDdXJyQ2FwSW5mbyB8PSBXTEFOX1NFVF9DQVBfSU5GT19TSE9SVFBSRUFNQkxFKDEpOwotICAgICAgICBpZiAoQ0FSRGJJc1Nob3JTbG90VGltZShwTWdtdC0+cEFkYXB0ZXIpID09IFRSVUUpIHsKKyAgICAgICAgaWYgKENBUkRiSXNTaG9yU2xvdFRpbWUocE1nbXQtPnBBZGFwdGVyKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX1NIT1JUU0xPVFRJTUUoMSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHBNZ210LT5lQ3VycmVudFBIWU1vZGUgPT0gUEhZX1RZUEVfMTFCKSB7Ci0gICAgICAgIGlmIChDQVJEYklzU2hvcnRQcmVhbWJsZShwTWdtdC0+cEFkYXB0ZXIpID09IFRSVUUpIHsKKyAgICAgICAgaWYgKENBUkRiSXNTaG9ydFByZWFtYmxlKHBNZ210LT5wQWRhcHRlcikgPT0gdHJ1ZSkgewogICAgICAgICAgICAgcE1nbXQtPndDdXJyQ2FwSW5mbyB8PSBXTEFOX1NFVF9DQVBfSU5GT19TSE9SVFBSRUFNQkxFKDEpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwTWdtdC0+YjExaEVuYWJsZSA9PSBUUlVFKQorICAgIGlmIChwTWdtdC0+YjExaEVuYWJsZSA9PSB0cnVlKQogICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX1NQRUNUUlVNTU5HKDEpOwogCiAKQEAgLTYxOSw4ICs2MjAsOCBAQAogdk1nckRpc2Fzc29jQmVnaW5TdGEoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAotICAgIFBCWVRFICBhYnlEZXN0QWRkcmVzcywKLSAgICBXT1JEICAgIHdSZWFzb24sCisgICAgdW5zaWduZWQgY2hhciAqYWJ5RGVzdEFkZHJlc3MsCisgICAgdW5zaWduZWQgc2hvcnQgd1JlYXNvbiwKICAgICBQQ01EX1NUQVRVUyBwU3RhdHVzCiAgICAgKQogewpAQCAtNjMwLDEwICs2MzEsMTAgQEAKIAogICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9ESVNBU1NPQ19GUl9NQVhMRU4pOwotICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKFBCWVRFKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CisgICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CiAKICAgICAvLyBTZXR1cCB0aGUgc0ZyYW1lIHN0cnVjdHVyZQotICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICBzRnJhbWUubGVuID0gV0xBTl9ESVNBU1NPQ19GUl9NQVhMRU47CiAKICAgICAvLyBmb3JtYXQgZml4ZWQgZmllbGQgZnJhbWUgc3RydWN0dXJlCkBAIC02ODMsMTcgKzY4NCwxNyBAQAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAogICAgIFBTUnhNZ210UGFja2V0IHBSeFBhY2tldCwKLSAgICBVSU5UIHVOb2RlSW5kZXgKKyAgICB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleAogICAgICkKIHsKICAgICBXTEFOX0ZSX0FTU09DUkVRICAgIHNGcmFtZTsKICAgICBDTURfU1RBVFVTICAgICAgICAgIFN0YXR1czsKICAgICBQU1R4TWdtdFBhY2tldCAgICAgIHBUeFBhY2tldDsKLSAgICBXT1JEICAgICAgICAgICAgICAgIHdBc3NvY1N0YXR1cyA9IDA7Ci0gICAgV09SRCAgICAgICAgICAgICAgICB3QXNzb2NBSUQgPSAwOwotICAgIFVJTlQgICAgICAgICAgICAgICAgdVJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTjsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGFieUN1cnJTdXBwUmF0ZXNbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1JBVEVTX01BWExFTiArIDFdOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5Q3VyckV4dFN1cHBSYXRlc1tXTEFOX0lFSERSX0xFTiArIFdMQU5fUkFURVNfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgc2hvcnQgd0Fzc29jU3RhdHVzID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3QXNzb2NBSUQgPSAwOworICAgIHVuc2lnbmVkIGludCB1UmF0ZUxlbiA9IFdMQU5fUkFURVNfTUFYTEVOOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VyclN1cHBSYXRlc1tXTEFOX0lFSERSX0xFTiArIFdMQU5fUkFURVNfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyRXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKIAogCiAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgIT0gV01BQ19NT0RFX0VTU19BUCkKQEAgLTcwOCw3ICs3MDksNyBAQAogICAgIG1lbXNldChhYnlDdXJyU3VwcFJhdGVzLCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fUkFURVNfTUFYTEVOICsgMSk7CiAgICAgbWVtc2V0KGFieUN1cnJFeHRTdXBwUmF0ZXMsIDAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxKTsKICAgICBzRnJhbWUubGVuID0gcFJ4UGFja2V0LT5jYk1QRFVMZW47Ci0gICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogCiAgICAgdk1nckRlY29kZUFzc29jUmVxdWVzdCgmc0ZyYW1lKTsKIApAQCAtNzE3LDcgKzcxOCw3IEBACiAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud0NhcEluZm8gPSBjcHVfdG9fbGUxNigqc0ZyYW1lLnB3Q2FwSW5mbyk7CiAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud0xpc3RlbkludGVydmFsID0gY3B1X3RvX2xlMTYoKnNGcmFtZS5wd0xpc3RlbkludGVydmFsKTsKICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iUFNFbmFibGUgPQotICAgICAgICAgICAgICAgIFdMQU5fR0VUX0ZDX1BXUk1HVChzRnJhbWUucEhkci0+c0EzLndGcmFtZUN0bCkgPyBUUlVFIDogRkFMU0U7CisgICAgICAgICAgICAgICAgV0xBTl9HRVRfRkNfUFdSTUdUKHNGcmFtZS5wSGRyLT5zQTMud0ZyYW1lQ3RsKSA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgLy8gVG9kbzogY2hlY2sgc3RhIGJhc2ljIHJhdGUsIGlmIGFwIGNhbid0IHN1cHBvcnQsIHNldCBzdGF0dXMgY29kZQogICAgICAgICBpZiAocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQikgewogICAgICAgICAgICAgdVJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTl8xMUI7CkBAIC03MzksNyArNzQwLDcgQEAKICAgICAgICAgUkFURXZQYXJzZU1heFJhdGUoKHZvaWQgKilwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpYWJ5Q3VyclN1cHBSYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKWFieUN1cnJFeHRTdXBwUmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgLy8gZG8gbm90IGNoYW5nZSBvdXIgYmFzaWMgcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGRvIG5vdCBjaGFuZ2Ugb3VyIGJhc2ljIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4QmFzaWNSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4U3VwcFJhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndTdXBwUmF0ZSksCkBAIC03NTgsMjAgKzc1OSwyMCBAQAogICAgICAgICAgICAgICAgIFdMQU5fR0VUX0NBUF9JTkZPX1NIT1JUUFJFQU1CTEUoKnNGcmFtZS5wd0NhcEluZm8pOwogICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJTaG9ydFNsb3RUaW1lID0KICAgICAgICAgICAgICAgICBXTEFOX0dFVF9DQVBfSU5GT19TSE9SVFNMT1RUSU1FKCpzRnJhbWUucHdDYXBJbmZvKTsKLSAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53QUlEID0gKFdPUkQpdU5vZGVJbmRleDsKKyAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53QUlEID0gKHVuc2lnbmVkIHNob3J0KXVOb2RlSW5kZXg7CiAgICAgICAgIHdBc3NvY1N0YXR1cyA9IFdMQU5fTUdNVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICAgICAgd0Fzc29jQUlEID0gKFdPUkQpdU5vZGVJbmRleDsKKyAgICAgICAgd0Fzc29jQUlEID0gKHVuc2lnbmVkIHNob3J0KXVOb2RlSW5kZXg7CiAgICAgICAgIC8vIGNoZWNrIGlmIEVSUCBzdXBwb3J0CiAgICAgICAgIGlmKHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud01heFN1cHBSYXRlID4gUkFURV8xMU0pCi0gICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uYkVSUEV4aXN0ID0gVFJVRTsKKyAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iRVJQRXhpc3QgPSB0cnVlOwogCiAgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndNYXhTdXBwUmF0ZSA8PSBSQVRFXzExTSkgewogICAgICAgICAgICAgLy8gQiBvbmx5IFNUQSBqb2luCi0gICAgICAgICAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSBUUlVFOwotICAgICAgICAgICAgcERldmljZS0+Yk5vbkVSUFByZXNlbnQgPSBUUlVFOworICAgICAgICAgICAgcERldmljZS0+YlByb3RlY3RNb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJOb25FUlBQcmVzZW50ID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iU2hvcnRQcmVhbWJsZSA9PSBGQUxTRSkgewotICAgICAgICAgICAgcERldmljZS0+YkJhcmtlclByZWFtYmxlTWQgPSBUUlVFOworICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iU2hvcnRQcmVhbWJsZSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcERldmljZS0+YkJhcmtlclByZWFtYmxlTWQgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9JTkZPICJBc3NvY2lhdGUgQUlEPSAlZCBcbiIsIHdBc3NvY0FJRCk7CkBAIC04NDUsMTcgKzg0NiwxNyBAQAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAogICAgIFBTUnhNZ210UGFja2V0IHBSeFBhY2tldCwKLSAgICBVSU5UIHVOb2RlSW5kZXgKKyAgICB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleAogICAgICkKIHsKICAgICBXTEFOX0ZSX1JFQVNTT0NSRVEgICAgc0ZyYW1lOwogICAgIENNRF9TVEFUVVMgICAgICAgICAgU3RhdHVzOwogICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0OwotICAgIFdPUkQgICAgICAgICAgICAgICAgd0Fzc29jU3RhdHVzID0gMDsKLSAgICBXT1JEICAgICAgICAgICAgICAgIHdBc3NvY0FJRCA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1UmF0ZUxlbiA9IFdMQU5fUkFURVNfTUFYTEVOOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5Q3VyclN1cHBSYXRlc1tXTEFOX0lFSERSX0xFTiArIFdMQU5fUkFURVNfTUFYTEVOICsgMV07Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlDdXJyRXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3QXNzb2NTdGF0dXMgPSAwOworICAgIHVuc2lnbmVkIHNob3J0IHdBc3NvY0FJRCA9IDA7CisgICAgdW5zaWduZWQgaW50CXVSYXRlTGVuID0gV0xBTl9SQVRFU19NQVhMRU47CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUN1cnJFeHRTdXBwUmF0ZXNbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1JBVEVTX01BWExFTiArIDFdOwogCiAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgIT0gV01BQ19NT0RFX0VTU19BUCkKICAgICAgICAgcmV0dXJuOwpAQCAtODY2LDcgKzg2Nyw3IEBACiAgICAgLy9kZWNvZGUgdGhlIGZyYW1lCiAgICAgbWVtc2V0KCZzRnJhbWUsIDAsIHNpemVvZihXTEFOX0ZSX1JFQVNTT0NSRVEpKTsKICAgICBzRnJhbWUubGVuID0gcFJ4UGFja2V0LT5jYk1QRFVMZW47Ci0gICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgIHZNZ3JEZWNvZGVSZWFzc29jUmVxdWVzdCgmc0ZyYW1lKTsKIAogICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmVOb2RlU3RhdGUgPj0gTk9ERV9BVVRIKSB7CkBAIC04NzQsNyArODc1LDcgQEAKICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53Q2FwSW5mbyA9IGNwdV90b19sZTE2KCpzRnJhbWUucHdDYXBJbmZvKTsKICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TGlzdGVuSW50ZXJ2YWwgPSBjcHVfdG9fbGUxNigqc0ZyYW1lLnB3TGlzdGVuSW50ZXJ2YWwpOwogICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJQU0VuYWJsZSA9Ci0gICAgICAgICAgICAgICAgV0xBTl9HRVRfRkNfUFdSTUdUKHNGcmFtZS5wSGRyLT5zQTMud0ZyYW1lQ3RsKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgICAgICAgICBXTEFOX0dFVF9GQ19QV1JNR1Qoc0ZyYW1lLnBIZHItPnNBMy53RnJhbWVDdGwpID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAvLyBUb2RvOiBjaGVjayBzdGEgYmFzaWMgcmF0ZSwgaWYgYXAgY2FuJ3Qgc3VwcG9ydCwgc2V0IHN0YXR1cyBjb2RlCiAKICAgICAgICAgaWYgKHBEZXZpY2UtPmVDdXJyZW50UEhZVHlwZSA9PSBQSFlfVFlQRV8xMUIpIHsKQEAgLTg5OCw3ICs4OTksNyBAQAogICAgICAgICBSQVRFdlBhcnNlTWF4UmF0ZSgodm9pZCAqKXBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKWFieUN1cnJTdXBwUmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKWFieUN1cnJFeHRTdXBwUmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgLy8gZG8gbm90IGNoYW5nZSBvdXIgYmFzaWMgcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGRvIG5vdCBjaGFuZ2Ugb3VyIGJhc2ljIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4QmFzaWNSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4U3VwcFJhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndTdXBwUmF0ZSksCkBAIC05MTcsMjEgKzkxOCwyMSBAQAogICAgICAgICAgICAgICAgIFdMQU5fR0VUX0NBUF9JTkZPX1NIT1JUUFJFQU1CTEUoKnNGcmFtZS5wd0NhcEluZm8pOwogICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJTaG9ydFNsb3RUaW1lID0KICAgICAgICAgICAgICAgICBXTEFOX0dFVF9DQVBfSU5GT19TSE9SVFNMT1RUSU1FKCpzRnJhbWUucHdDYXBJbmZvKTsKLSAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53QUlEID0gKFdPUkQpdU5vZGVJbmRleDsKKyAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53QUlEID0gKHVuc2lnbmVkIHNob3J0KXVOb2RlSW5kZXg7CiAgICAgICAgIHdBc3NvY1N0YXR1cyA9IFdMQU5fTUdNVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICAgICAgd0Fzc29jQUlEID0gKFdPUkQpdU5vZGVJbmRleDsKKyAgICAgICAgd0Fzc29jQUlEID0gKHVuc2lnbmVkIHNob3J0KXVOb2RlSW5kZXg7CiAKICAgICAgICAgLy8gaWYgc3VwcHVydCBFUlAKICAgICAgICAgaWYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4U3VwcFJhdGUgPiBSQVRFXzExTSkKLSAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iRVJQRXhpc3QgPSBUUlVFOworICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJFUlBFeGlzdCA9IHRydWU7CiAKICAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud01heFN1cHBSYXRlIDw9IFJBVEVfMTFNKSB7CiAgICAgICAgICAgICAvLyBCIG9ubHkgU1RBIGpvaW4KLSAgICAgICAgICAgIHBEZXZpY2UtPmJQcm90ZWN0TW9kZSA9IFRSVUU7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iTm9uRVJQUHJlc2VudCA9IFRSVUU7CisgICAgICAgICAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSB0cnVlOworICAgICAgICAgICAgcERldmljZS0+Yk5vbkVSUFByZXNlbnQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJTaG9ydFByZWFtYmxlID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IFRSVUU7CisgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJTaG9ydFByZWFtYmxlID09IGZhbHNlKSB7CisgICAgICAgICAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8gIlJ4IFJlQXNzb2NpYXRlIEFJRD0gJWQgXG4iLCB3QXNzb2NBSUQpOwpAQCAtOTk1LDEyICs5OTYsMTIgQEAKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKICAgICBQU1J4TWdtdFBhY2tldCBwUnhQYWNrZXQsCi0gICAgQk9PTCBiUmVBc3NvY1R5cGUKKyAgICBib29sIGJSZUFzc29jVHlwZQogICAgICkKIHsKICAgICBXTEFOX0ZSX0FTU09DUkVTUCAgIHNGcmFtZTsKICAgICBQV0xBTl9JRV9TU0lEICAgcEl0ZW1TU0lEOwotICAgIFBCWVRFICAgcGJ5SUVzOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUlFczsKICAgICB2aWF3Z2V0X3dwYV9oZWFkZXIgKndwYWhkcjsKIAogCkBAIC0xMDA5LDcgKzEwMTAsNyBAQAogICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPT0gV01BQ19TVEFURV9BU1NPQykgewogCiAgICAgICAgIHNGcmFtZS5sZW4gPSBwUnhQYWNrZXQtPmNiTVBEVUxlbjsKLSAgICAgICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICAgICAgLy8gZGVjb2RlIHRoZSBmcmFtZQogICAgICAgICB2TWdyRGVjb2RlQXNzb2NSZXNwb25zZSgmc0ZyYW1lKTsKICAgICAgICAgaWYgKChzRnJhbWUucHdDYXBJbmZvID09IDApIHx8CkBAIC0xMDQ0LDcgKzEwNDUsNyBAQAogICAgICAgICAgICAgQlNTdlVwZGF0ZUFQTm9kZSgodm9pZCAqKXBEZXZpY2UsIHNGcmFtZS5wd0NhcEluZm8sIHNGcmFtZS5wU3VwcFJhdGVzLCBzRnJhbWUucEV4dFN1cHBSYXRlcyk7CiAgICAgICAgICAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8gIkxpbmsgd2l0aCBBUChTU0lEKTogJXNcbiIsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBUUlVFOworICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gdHJ1ZTsKICAgICAgICAgICAgIHBEZXZpY2UtPnVCQlZHQURpZmZDb3VudCA9IDA7CiAgICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJXUEFERVZVcCkgJiYgKHBEZXZpY2UtPnNrYiAhPSBOVUxMKSkgewogCSAgaWYoc2tiX3RhaWxyb29tKHBEZXZpY2UtPnNrYikgPChzaXplb2Yodmlhd2dldF93cGFfaGVhZGVyKStwTWdtdC0+c0Fzc29jSW5mby5Bc3NvY0luZm8uUmVzcG9uc2VJRUxlbmd0aCsKQEAgLTEwNzMsOSArMTA3NCw5IEBACiAKIC8vMjAwOC0wNDA5LTA3LCA8QWRkPiBieSBFaW5zbiBMaXUKICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0JLy9pZihwRGV2aWNlLT5iV1BBRGV2RW5hYmxlID09IFRSVUUpCisJLy9pZihwRGV2aWNlLT5iV1BBRGV2RW5hYmxlID09IHRydWUpCiAJCXsKLQkJQllURSBidWZbNTEyXTsKKwkJdW5zaWduZWQgY2hhciBidWZbNTEyXTsKIAkJc2l6ZV90IGxlbjsKIAkJdW5pb24gaXdyZXFfZGF0YSAgd3JxdTsKIAkJaW50IHdlX2V2ZW50OwpAQCAtMTEyOCw3ICsxMTI5LDcgQEAKIC8vbmVlZCBjbGVhciBmbGFncyByZWxhdGVkIHRvIE5ldHdvcmttYW5hZ2VyCiAKICAgICAgICAgICAgICAgcERldmljZS0+YndleHRjb3VudCA9IDA7Ci0gICAgICAgICAgICAgIHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgcERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9IGZhbHNlOwogI2VuZGlmCiAKIApAQCAtMTE2Myw4ICsxMTY0LDggQEAKIAogICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BVVRIRU5fRlJfTUFYTEVOKTsKLSAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwotICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICBzRnJhbWUubGVuID0gV0xBTl9BVVRIRU5fRlJfTUFYTEVOOwogICAgIHZNZ3JFbmNvZGVBdXRoZW4oJnNGcmFtZSk7CiAgICAgLyogaW5zZXJ0IHZhbHVlcyAqLwpAQCAtMTIxMiw4ICsxMjEzLDggQEAKIHZNZ3JEZUF1dGhlbkJlZ2luU3RhKAogICAgIHZvaWQgKmhEZXZpY2VDb250ZXh0LAogICAgIFBTTWdtdE9iamVjdCAgcE1nbXQsCi0gICAgUEJZVEUgIGFieURlc3RBZGRyZXNzLAotICAgIFdPUkQgICAgd1JlYXNvbiwKKyAgICB1bnNpZ25lZCBjaGFyICphYnlEZXN0QWRkcmVzcywKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmVhc29uLAogICAgIFBDTURfU1RBVFVTIHBTdGF0dXMKICAgICApCiB7CkBAIC0xMjI0LDggKzEyMjUsOCBAQAogCiAgICAgcFR4UGFja2V0ID0gKFBTVHhNZ210UGFja2V0KXBNZ210LT5wYnlNZ210UGFja2V0UG9vbDsKICAgICBtZW1zZXQocFR4UGFja2V0LCAwLCBzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX0RFQVVUSEVOX0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgoUEJZVEUpcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKLSAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKyAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgc0ZyYW1lLmxlbiA9IFdMQU5fREVBVVRIRU5fRlJfTUFYTEVOOwogICAgIHZNZ3JFbmNvZGVEZWF1dGhlbigmc0ZyYW1lKTsKICAgICAvKiBpbnNlcnQgdmFsdWVzICovCkBAIC0xMjgyLDcgKzEyODMsNyBAQAogCiAgICAgLy8gZGVjb2RlIHRoZSBmcmFtZQogICAgIHNGcmFtZS5sZW4gPSBwUnhQYWNrZXQtPmNiTVBEVUxlbjsKLSAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgdk1nckRlY29kZUF1dGhlbigmc0ZyYW1lKTsKICAgICBzd2l0Y2ggKGNwdV90b19sZTE2KCgqKHNGcmFtZS5wd0F1dGhTZXF1ZW5jZSApKSkpewogICAgICAgICBjYXNlIDE6CkBAIC0xMzMxLDcgKzEzMzIsNyBAQAogICAgICApCiB7CiAgICAgUFNUeE1nbXRQYWNrZXQgICAgICBwVHhQYWNrZXQgPSBOVUxMOwotICAgIFVJTlQgICAgICAgICAgICAgICAgdU5vZGVJbmRleDsKKyAgICB1bnNpZ25lZCBpbnQJdU5vZGVJbmRleDsKICAgICBXTEFOX0ZSX0FVVEhFTiAgICAgIHNGcmFtZTsKICAgICBQU0tleUl0ZW0gICAgICAgICAgIHBUcmFuc21pdEtleTsKIApAQCAtMTM1Myw4ICsxMzU0LDggQEAKICAgICAvLyBzZW5kIGF1dGggcmVwbHkKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieU1nbXRQYWNrZXRQb29sOwogICAgIG1lbXNldChwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQVVUSEVOX0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgoUEJZVEUpcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKLSAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKyAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgc0ZyYW1lLmxlbiA9IFdMQU5fQVVUSEVOX0ZSX01BWExFTjsKICAgICAvLyBmb3JtYXQgYnVmZmVyIHN0cnVjdHVyZQogICAgIHZNZ3JFbmNvZGVBdXRoZW4oJnNGcmFtZSk7CkBAIC0xMzkzLDcgKzEzOTQsNyBAQAogICAgICAgICBzRnJhbWUucENoYWxsZW5nZS0+bGVuID0gV0xBTl9DSEFMTEVOR0VfTEVOOwogICAgICAgICBtZW1zZXQocE1nbXQtPmFieUNoYWxsZW5nZSwgMCwgV0xBTl9DSEFMTEVOR0VfTEVOKTsKICAgICAgICAgLy8gZ2V0IGdyb3VwIGtleQotICAgICAgICBpZihLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcERldmljZS0+YWJ5QnJvYWRjYXN0QWRkciwgR1JPVVBfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBUUlVFKSB7CisgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwRGV2aWNlLT5hYnlCcm9hZGNhc3RBZGRyLCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IHRydWUpIHsKICAgICAgICAgICAgIHJjNF9pbml0KCZwRGV2aWNlLT5TQm94LCBwRGV2aWNlLT5hYnlQUk5HLCBwVHJhbnNtaXRLZXktPnVLZXlMZW5ndGgrMyk7CiAgICAgICAgICAgICByYzRfZW5jcnlwdCgmcERldmljZS0+U0JveCwgcE1nbXQtPmFieUNoYWxsZW5nZSwgcE1nbXQtPmFieUNoYWxsZW5nZSwgV0xBTl9DSEFMTEVOR0VfTEVOKTsKICAgICAgICAgfQpAQCAtMTQ2Niw4ICsxNDY3LDggQEAKICAgICAgICAgICAgIGlmIChjcHVfdG9fbGUxNigoKihwRnJhbWUtPnB3U3RhdHVzKSkpID09IFdMQU5fTUdNVF9TVEFUVVNfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgICAgICAgICAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BVVRIRU5fRlJfTUFYTEVOKTsKLSAgICAgICAgICAgICAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwotICAgICAgICAgICAgICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgICAgICAgICAgICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgICAgICAgICAgICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICAgICAgICAgICAgICBzRnJhbWUubGVuID0gV0xBTl9BVVRIRU5fRlJfTUFYTEVOOwogICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBidWZmZXIgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgdk1nckVuY29kZUF1dGhlbigmc0ZyYW1lKTsKQEAgLTE1MzksOCArMTU0MCw4IEBACiAgICAgKQogewogICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0ID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgICAgIHVTdGF0dXNDb2RlID0gMCA7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1Tm9kZUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdVN0YXR1c0NvZGUgPSAwIDsKKyAgICB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleCA9IDA7CiAgICAgV0xBTl9GUl9BVVRIRU4gICAgICBzRnJhbWU7CiAKICAgICBpZiAoIVdMQU5fR0VUX0ZDX0lTV0VQKHBGcmFtZS0+cEhkci0+c0EzLndGcmFtZUN0bCkpIHsKQEAgLTE1NzMsOCArMTU3NCw4IEBACiAgICAgLy8gc2VuZCBhdXRoIHJlcGx5CiAgICAgcFR4UGFja2V0ID0gKFBTVHhNZ210UGFja2V0KXBNZ210LT5wYnlNZ210UGFja2V0UG9vbDsKICAgICBtZW1zZXQocFR4UGFja2V0LCAwLCBzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX0FVVEhFTl9GUl9NQVhMRU4pOwotICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKFBCWVRFKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7Ci0gICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CisgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgIHNGcmFtZS5sZW4gPSBXTEFOX0FVVEhFTl9GUl9NQVhMRU47CiAgICAgLy8gZm9ybWF0IGJ1ZmZlciBzdHJ1Y3R1cmUKICAgICB2TWdyRW5jb2RlQXV0aGVuKCZzRnJhbWUpOwpAQCAtMTY2Niw3ICsxNjY3LDcgQEAKICAgICApCiB7CiAgICAgV0xBTl9GUl9ESVNBU1NPQyAgICBzRnJhbWU7Ci0gICAgVUlOVCAgICAgICAgdU5vZGVJbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXggPSAwOwogLy8gICAgQ01EX1NUQVRVUyAgICAgICAgICBDbWRTdGF0dXM7CiAgICAgdmlhd2dldF93cGFfaGVhZGVyICp3cGFoZHI7CiAKQEAgLTE2NzQsNyArMTY3NSw3IEBACiAgICAgICAgIC8vIGlmIGlzIGFjdGluZyBhbiBBUC4uCiAgICAgICAgIC8vIGEgU1RBIGlzIGxlYXZpbmcgdGhpcyBCU1MuLgogICAgICAgICBzRnJhbWUubGVuID0gcFJ4UGFja2V0LT5jYk1QRFVMZW47Ci0gICAgICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgICAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBwUnhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIyLCAmdU5vZGVJbmRleCkpIHsKICAgICAgICAgICAgIEJTU3ZSZW1vdmVPbmVOb2RlKHBEZXZpY2UsIHVOb2RlSW5kZXgpOwogICAgICAgICB9CkBAIC0xNjg0LDcgKzE2ODUsNyBAQAogICAgIH0KICAgICBlbHNlIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfU1RBICl7CiAgICAgICAgIHNGcmFtZS5sZW4gPSBwUnhQYWNrZXQtPmNiTVBEVUxlbjsKLSAgICAgICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICAgICAgdk1nckRlY29kZURpc2Fzc29jaWF0aW9uKCZzRnJhbWUpOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9OT1RJQ0UsIEtFUk5fSU5GTyAiQVAgZGlzYXNzb2NpYXRlZCBtZSwgcmVhc29uPSVkLlxuIiwgY3B1X3RvX2xlMTYoKihzRnJhbWUucHdSZWFzb24pKSk7CiAgICAgICAgIC8vVE9ETzogZG8gc29tZXRoaW5nIGxldCB1cHBlciBsYXllciBrbm93IG9yCkBAIC0xNzA5LDcgKzE3MTAsNyBAQAogICAgICAgICAgfTsKIAogICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0gIC8vIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT0gVFJVRSkKKyAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSB0cnVlKQogICAgICAgewogCXVuaW9uIGl3cmVxX2RhdGEgIHdycXU7CiAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2YgKHdycXUpKTsKQEAgLTE3NDUsNyArMTc0Niw3IEBACiAgICAgKQogewogICAgIFdMQU5fRlJfREVBVVRIRU4gICAgc0ZyYW1lOwotICAgIFVJTlQgICAgICAgIHVOb2RlSW5kZXggPSAwOworICAgIHVuc2lnbmVkIGludCB1Tm9kZUluZGV4ID0gMDsKICAgICB2aWF3Z2V0X3dwYV9oZWFkZXIgKndwYWhkcjsKIAogCkBAIC0xNzU0LDcgKzE3NTUsNyBAQAogICAgICAgICAvLyBpZiBpcyBhY3RpbmcgYW4gQVAuLgogICAgICAgICAvLyBhIFNUQSBpcyBsZWF2aW5nIHRoaXMgQlNTLi4KICAgICAgICAgc0ZyYW1lLmxlbiA9IHBSeFBhY2tldC0+Y2JNUERVTGVuOwotICAgICAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICAgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgICAgICBpZiAoQlNTREJiSXNTVEFJbk5vZGVEQihwTWdtdCwgcFJ4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMiwgJnVOb2RlSW5kZXgpKSB7CiAgICAgICAgICAgICBCU1N2UmVtb3ZlT25lTm9kZShwRGV2aWNlLCB1Tm9kZUluZGV4KTsKICAgICAgICAgfQpAQCAtMTc2NSwxNyArMTc2NiwxNyBAQAogICAgIGVsc2UgewogICAgICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX1NUQSApIHsKICAgICAgICAgICAgIHNGcmFtZS5sZW4gPSBwUnhQYWNrZXQtPmNiTVBEVUxlbjsKLSAgICAgICAgICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgICAgICAgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgICAgICAgICAgdk1nckRlY29kZURlYXV0aGVuKCZzRnJhbWUpOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfTk9USUNFLCBLRVJOX0lORk8gICJBUCBkZWF1dGhlZCBtZSwgcmVhc29uPSVkLlxuIiwgY3B1X3RvX2xlMTYoKCooc0ZyYW1lLnB3UmVhc29uKSkpKTsKICAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBCU1MgbGlzdCBmb3Igc3BlY2lmaWMgQlNTSUQgaWYgcHJlLWF1dGhlbnRpY2F0aW9uIGNhc2UKLSAgICAgICAgICAgIGlmIChJU19FVEhfQUREUkVTU19FUVVBTChzRnJhbWUucEhkci0+c0EzLmFieUFkZHIzLCBwTWdtdC0+YWJ5Q3VyckJTU0lEKSkgeworICAgICAgICAgICAgaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoc0ZyYW1lLnBIZHItPnNBMy5hYnlBZGRyMywgcE1nbXQtPmFieUN1cnJCU1NJRCkpIHsKICAgICAgICAgICAgICAgICBpZiAocE1nbXQtPmVDdXJyU3RhdGUgPj0gV01BQ19TVEFURV9BVVRIUEVORElORykgewotICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5lQ3Vyck1vZGUgPSBXTUFDX01PREVfU1RBTkRCWTsKICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAKQEAgLTE3OTUsNyArMTc5Niw3IEBACiAgICAgICAgICAgIH07CiAKICAgICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0gIC8vIGlmKHBEZXZpY2UtPmJXUEFTdXBwV2V4dEVuYWJsZWQgPT0gVFJVRSkKKyAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSB0cnVlKQogICAgICAgewogCXVuaW9uIGl3cmVxX2RhdGEgIHdycXU7CiAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2YgKHdycXUpKTsKQEAgLTE4MjUsMjMgKzE4MjYsMjMgQEAKICAqICAgICAgICAgICAgICAgVHJ1ZTpleGNlZWQ7CiAgKiAgICAgICAgICAgICAgICBGYWxzZTpub3JtYWwgY2FzZQogLSovCi1zdGF0aWMgQk9PTAorc3RhdGljIGJvb2wKIENoYW5uZWxFeGNlZWRab25lVHlwZSgKICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgIEJZVEUgYnlDdXJyQ2hhbm5lbAorICAgIHVuc2lnbmVkIGNoYXIgYnlDdXJyQ2hhbm5lbAogICAgICkKIHsKLSAgQk9PTCBleGNlZWQ9RkFMU0U7CisgIGJvb2wgZXhjZWVkPWZhbHNlOwogCiAgIHN3aXRjaChwRGV2aWNlLT5ieVpvbmVUeXBlKSB7CiAgIAljYXNlIDB4MDA6ICAgICAgICAgICAgICAgICAgLy9VU0E6MX4xMQogICAgICAgICAgICAgICAgICAgICAgaWYoKGJ5Q3VyckNoYW5uZWw8MSkgfHwoYnlDdXJyQ2hhbm5lbD4xMSkpCi0JICAgICAgICAgICAgICAgIGV4Y2VlZCA9IFRSVUU7CisJICAgICAgICAgICAgICAgIGV4Y2VlZCA9IHRydWU7CiAJICAgICAgICAgYnJlYWs7CiAJY2FzZSAweDAxOiAgICAgICAgICAgICAgICAgIC8vSmFwYW46MX4xMwogCWNhc2UgMHgwMjogICAgICAgICAgICAgICAgICAvL0V1cm9wZToxfjEzCiAgICAgICAgICAgICAgICAgICAgICBpZigoYnlDdXJyQ2hhbm5lbDwxKSB8fChieUN1cnJDaGFubmVsPjEzKSkKLQkgICAgICAgICAgICAgICAgZXhjZWVkID0gVFJVRTsKKwkgICAgICAgICAgICAgICAgZXhjZWVkID0gdHJ1ZTsKIAkgICAgICAgICBicmVhazsKIAlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgLy9yZXNlcnZlIGZvciBvdGhlciB6b25ldHlwZQogCQlicmVhazsKQEAgLTE4NjgsMzkgKzE4NjksMzkgQEAKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKICAgICBQU1J4TWdtdFBhY2tldCBwUnhQYWNrZXQsCi0gICAgQk9PTCBiSW5TY2FuCisgICAgYm9vbCBiSW5TY2FuCiAgICAgKQogewogCiAgICAgUEtub3duQlNTICAgICAgICAgICBwQlNTTGlzdDsKICAgICBXTEFOX0ZSX0JFQUNPTiAgICAgIHNGcmFtZTsKICAgICBRV09SRCAgICAgICAgICAgICAgIHF3VFNGT2Zmc2V0OwotICAgIEJPT0wgICAgICAgICAgICAgICAgYklzQlNTSURFcXVhbCA9IEZBTFNFOwotICAgIEJPT0wgICAgICAgICAgICAgICAgYklzU1NJREVxdWFsID0gRkFMU0U7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICBiVFNGTGFyZ2VEaWZmID0gRkFMU0U7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICBiVFNGT2Zmc2V0UG9zdGl2ZSA9IEZBTFNFOwotICAgIEJPT0wgICAgICAgICAgICAgICAgYlVwZGF0ZVRTRiA9IEZBTFNFOwotICAgIEJPT0wgICAgICAgICAgICAgICAgYklzQVBCZWFjb24gPSBGQUxTRTsKLSAgICBCT09MICAgICAgICAgICAgICAgIGJJc0NoYW5uZWxFcXVhbCA9IEZBTFNFOwotICAgIFVJTlQgICAgICAgICAgICAgICAgdUxvY2F0ZUJ5dGVJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5VElNQml0T24gPSAwOwotICAgIFdPUkQgICAgICAgICAgICAgICAgd0FJRE51bWJlciA9IDA7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1Tm9kZUluZGV4OworICAgIGJvb2wgYklzQlNTSURFcXVhbCA9IGZhbHNlOworICAgIGJvb2wgYklzU1NJREVxdWFsID0gZmFsc2U7CisgICAgYm9vbCBiVFNGTGFyZ2VEaWZmID0gZmFsc2U7CisgICAgYm9vbCBiVFNGT2Zmc2V0UG9zdGl2ZSA9IGZhbHNlOworICAgIGJvb2wgYlVwZGF0ZVRTRiA9IGZhbHNlOworICAgIGJvb2wgYklzQVBCZWFjb24gPSBmYWxzZTsKKyAgICBib29sIGJJc0NoYW5uZWxFcXVhbCA9IGZhbHNlOworICAgIHVuc2lnbmVkIGludCB1TG9jYXRlQnl0ZUluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgYnlUSU1CaXRPbiA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgd0FJRE51bWJlciA9IDA7CisgICAgdW5zaWduZWQgaW50IHVOb2RlSW5kZXg7CiAgICAgUVdPUkQgICAgICAgICAgICAgICBxd1RpbWVzdGFtcCwgcXdMb2NhbFRTRjsKICAgICBRV09SRCAgICAgICAgICAgICAgIHF3Q3VyclRTRjsKLSAgICBXT1JEICAgICAgICAgICAgICAgIHdTdGFydEluZGV4ID0gMDsKLSAgICBXT1JEICAgICAgICAgICAgICAgIHdBSURJbmRleCA9IDA7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieUN1cnJDaGFubmVsID0gcFJ4UGFja2V0LT5ieVJ4Q2hhbm5lbDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3U3RhcnRJbmRleCA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgd0FJREluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q3VyckNoYW5uZWwgPSBwUnhQYWNrZXQtPmJ5UnhDaGFubmVsOwogICAgIEVSUE9iamVjdCAgICAgICAgICAgc0VSUDsKLSAgICBVSU5UICAgICAgICAgICAgICAgIHVSYXRlTGVuID0gV0xBTl9SQVRFU19NQVhMRU47Ci0gICAgQk9PTCAgICAgICAgICAgICAgICBiQ2hhbm5lbEhpdCA9IEZBTFNFOwotICAgIEJPT0wgICAgICAgICAgICAgICAgYlVwZGF0ZVBoeVBhcmFtZXRlciA9IEZBTFNFOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlJRUNoYW5uZWwgPSAwOworICAgIHVuc2lnbmVkIGludCB1UmF0ZUxlbiA9IFdMQU5fUkFURVNfTUFYTEVOOworICAgIGJvb2wgYkNoYW5uZWxIaXQgPSBmYWxzZTsKKyAgICBib29sIGJVcGRhdGVQaHlQYXJhbWV0ZXIgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5SUVDaGFubmVsID0gMDsKIAogCiAgICAgbWVtc2V0KCZzRnJhbWUsIDAsIHNpemVvZihXTEFOX0ZSX0JFQUNPTikpOwogICAgIHNGcmFtZS5sZW4gPSBwUnhQYWNrZXQtPmNiTVBEVUxlbjsKLSAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAKICAgICAvLyBkZWNvZGUgdGhlIGJlYWNvbiBmcmFtZQogICAgIHZNZ3JEZWNvZGVCZWFjb24oJnNGcmFtZSk7CkBAIC0xOTE3LDI5ICsxOTE4LDI5IEBACiAgICAgaWYgKHNGcmFtZS5wRFNQYXJtcyAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChieUN1cnJDaGFubmVsID4gQ0JfTUFYX0NIQU5ORUxfMjRHKSB7CiAgICAgICAgICAgICAvLyBjaGFubmVsIHJlbWFwcGluZyB0bwotICAgICAgICAgICAgYnlJRUNoYW5uZWwgPSBDQVJEYnlHZXRDaGFubmVsTWFwcGluZyhwRGV2aWNlLCBzRnJhbWUucERTUGFybXMtPmJ5Q3VyckNoYW5uZWwsIFBIWV9UWVBFXzExQSk7CisgICAgICAgICAgICBieUlFQ2hhbm5lbCA9IGdldF9jaGFubmVsX21hcHBpbmcocERldmljZSwgc0ZyYW1lLnBEU1Bhcm1zLT5ieUN1cnJDaGFubmVsLCBQSFlfVFlQRV8xMUEpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnlJRUNoYW5uZWwgPSBzRnJhbWUucERTUGFybXMtPmJ5Q3VyckNoYW5uZWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5Q3VyckNoYW5uZWwgIT0gYnlJRUNoYW5uZWwpIHsKICAgICAgICAgICAgIC8vIGFkanVzdCBjaGFubmVsIGluZm8uIGJjcyB3ZSByY3YgYWRqY2VudCBjaGFubmVsIHBha2NrZXRzCi0gICAgICAgICAgICBiQ2hhbm5lbEhpdCA9IEZBTFNFOworICAgICAgICAgICAgYkNoYW5uZWxIaXQgPSBmYWxzZTsKICAgICAgICAgICAgIGJ5Q3VyckNoYW5uZWwgPSBieUlFQ2hhbm5lbDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIG5vIERTIGNoYW5uZWwgaW5mbwotICAgICAgICBiQ2hhbm5lbEhpdCA9IFRSVUU7CisgICAgICAgIGJDaGFubmVsSGl0ID0gdHJ1ZTsKICAgICB9CiAvLzIwMDgtMDczMC0wMTxBZGQ+YnkgTWlrZUxpdQotaWYoQ2hhbm5lbEV4Y2VlZFpvbmVUeXBlKHBEZXZpY2UsYnlDdXJyQ2hhbm5lbCk9PVRSVUUpCitpZihDaGFubmVsRXhjZWVkWm9uZVR5cGUocERldmljZSxieUN1cnJDaGFubmVsKT09dHJ1ZSkKICAgICAgIHJldHVybjsKIAogICAgIGlmIChzRnJhbWUucEVSUCAhPSBOVUxMKSB7CiAgICAgICAgIHNFUlAuYnlFUlAgPSBzRnJhbWUucEVSUC0+YnlDb250ZXh0OwotICAgICAgICBzRVJQLmJFUlBFeGlzdCA9IFRSVUU7CisgICAgICAgIHNFUlAuYkVSUEV4aXN0ID0gdHJ1ZTsKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNFUlAuYkVSUEV4aXN0ID0gRkFMU0U7CisgICAgICAgIHNFUlAuYkVSUEV4aXN0ID0gZmFsc2U7CiAgICAgICAgIHNFUlAuYnlFUlAgPSAwOwogICAgIH0KIApAQCAtMTk5Myw4ICsxOTk0LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmKGJ5Q3VyckNoYW5uZWwgPT0gKEJZVEUpcE1nbXQtPnVDdXJyQ2hhbm5lbCkKLSAgICAgICBiSXNDaGFubmVsRXF1YWwgPSBUUlVFOworICAgIGlmKGJ5Q3VyckNoYW5uZWwgPT0gKHVuc2lnbmVkIGNoYXIpcE1nbXQtPnVDdXJyQ2hhbm5lbCkKKyAgICAgICBiSXNDaGFubmVsRXF1YWwgPSB0cnVlOwogCiAgICAgaWYgKGJJc0NoYW5uZWxFcXVhbCAmJiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSkgewogCkBAIC0yMDIxLDcgKzIwMjIsNyBAQAogICAgICAgICBpZiAoV0xBTl9HRVRfRVJQX1VTRV9QUk9URUNUSU9OKHBEZXZpY2UtPmJ5RVJQRmxhZykpewogICAgICAgICAgICAgaWYgKCFwRGV2aWNlLT5iUHJvdGVjdE1vZGUpIHsKICAgICAgICAgICAgICAgICAgTUFDdkVuYWJsZVByb3RlY3RNRChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgcERldmljZS0+YlByb3RlY3RNb2RlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgcERldmljZS0+YlByb3RlY3RNb2RlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIwMzUsNyArMjAzNiw3IEBACiAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lELAogICAgICAgICAgICAgICAgV0xBTl9CU1NJRF9MRU4pID09IDApIHsKIAotICAgICAgICBiSXNCU1NJREVxdWFsID0gVFJVRTsKKyAgICAgICAgYklzQlNTSURFcXVhbCA9IHRydWU7CiAKIC8vIDIwMDgtMDUtMjEgPGFkZD4gYnkgUmljaGFyZHRhaQogICAgICAgICBwRGV2aWNlLT51Q3VyclJTU0kgPSBwUnhQYWNrZXQtPnVSU1NJOwpAQCAtMjA1MiwzMCArMjA1MywzMCBAQAogICAgICAgICAgICAgICAgICAgICgoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQpLT5hYnlTU0lELAogICAgICAgICAgICAgICAgICAgIHNGcmFtZS5wU1NJRC0+bGVuCiAgICAgICAgICAgICAgICAgICAgKSA9PSAwKSB7Ci0gICAgICAgICAgICBiSXNTU0lERXF1YWwgPSBUUlVFOworICAgICAgICAgICAgYklzU1NJREVxdWFsID0gdHJ1ZTsKICAgICAgICAgfTsKICAgICB9CiAKLSAgICBpZiAoKFdMQU5fR0VUX0NBUF9JTkZPX0VTUygqc0ZyYW1lLnB3Q2FwSW5mbyk9PSBUUlVFKSAmJgotICAgICAgICAoYklzQlNTSURFcXVhbCA9PSBUUlVFKSAmJgotICAgICAgICAoYklzU1NJREVxdWFsID09IFRSVUUpICYmCisgICAgaWYgKChXTEFOX0dFVF9DQVBfSU5GT19FU1MoKnNGcmFtZS5wd0NhcEluZm8pPT0gdHJ1ZSkgJiYKKyAgICAgICAgKGJJc0JTU0lERXF1YWwgPT0gdHJ1ZSkgJiYKKyAgICAgICAgKGJJc1NTSURFcXVhbCA9PSB0cnVlKSAmJgogICAgICAgICAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX1NUQSkgJiYKICAgICAgICAgKHBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfQVNTT0MpKSB7CiAgICAgICAgIC8vIGFkZCBzdGF0ZSBjaGVjayB0byBwcmV2ZW50IHJlY29ubmVjdCBmYWlsIHNpbmNlIHdlJ2xsIHJlY2VpdmUgQmVhY29uCiAKLSAgICAgICAgYklzQVBCZWFjb24gPSBUUlVFOworICAgICAgICBiSXNBUEJlYWNvbiA9IHRydWU7CiAKICAgICAgICAgaWYgKHBCU1NMaXN0ICE9IE5VTEwpIHsKIAogICAgICAgICAgICAgLy8gQ29tcGFyZSBQSFkgcGFyYW1hdGVyIHNldHRpbmcKICAgICAgICAgICAgIGlmIChwTWdtdC0+d0N1cnJDYXBJbmZvICE9IHBCU1NMaXN0LT53Q2FwSW5mbykgewotICAgICAgICAgICAgICAgIGJVcGRhdGVQaHlQYXJhbWV0ZXIgPSBUUlVFOworICAgICAgICAgICAgICAgIGJVcGRhdGVQaHlQYXJhbWV0ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBNZ210LT53Q3VyckNhcEluZm8gPSBwQlNTTGlzdC0+d0NhcEluZm87CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc0ZyYW1lLnBFUlAgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmICgoc0ZyYW1lLnBFUlAtPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0VSUCkgJiYKICAgICAgICAgICAgICAgICAgICAgKHBNZ210LT5ieUVSUENvbnRleHQgIT0gc0ZyYW1lLnBFUlAtPmJ5Q29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlVwZGF0ZVBoeVBhcmFtZXRlciA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJVcGRhdGVQaHlQYXJhbWV0ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YnlFUlBDb250ZXh0ID0gc0ZyYW1lLnBFUlAtPmJ5Q29udGV4dDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMDk0LDcgKzIwOTUsNyBAQAogICAgICAgICAgICAgUkFURXZQYXJzZU1heFJhdGUoICh2b2lkICopcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwTWdtdC0+YWJ5Q3VyclN1cHBSYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwTWdtdC0+YWJ5Q3VyckV4dFN1cHBSYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdLndNYXhCYXNpY1JhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVswXS53TWF4U3VwcFJhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVswXS53U3VwcFJhdGUpLApAQCAtMjEwNCw3ICsyMTA1LDcgQEAKICNpZmRlZglQTElDRV9ERUJVRwogCQkvL3ByaW50aygiUnhCZWFjb246TWF4U3VwcFJhdGUgaXMgJWRcbiIscE1nbXQtPnNOb2RlREJUYWJsZVswXS53TWF4U3VwcFJhdGUpOwogI2VuZGlmCi0JCQlpZiAoYlVwZGF0ZVBoeVBhcmFtZXRlciA9PSBUUlVFKSB7CisJCQlpZiAoYlVwZGF0ZVBoeVBhcmFtZXRlciA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgQ0FSRGJTZXRQaHlQYXJhbWV0ZXIoIHBNZ210LT5wQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyZW50UEhZTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPndDdXJyQ2FwSW5mbywKQEAgLTIxMTUsMTkgKzIxMTYsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzRnJhbWUucElFX1Bvd2VyQ29uc3RyYWludCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQ0FSRHZTZXRQb3dlckNvbnN0cmFpbnQocE1nbXQtPnBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKSBwQlNTTGlzdC0+dUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpIHBCU1NMaXN0LT51Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRnJhbWUucElFX1Bvd2VyQ29uc3RyYWludC0+YnlQb3dlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc0ZyYW1lLnBJRV9DSFNXICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBDQVJEYkNoYW5uZWxTd2l0Y2goIHBNZ210LT5wQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNGcmFtZS5wSUVfQ0hTVy0+YnlNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSRGJ5R2V0Q2hhbm5lbE1hcHBpbmcocE1nbXQtPnBBZGFwdGVyLCBzRnJhbWUucElFX0NIU1ctPmJ5TW9kZSwgcE1nbXQtPmVDdXJyZW50UEhZTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2hhbm5lbF9tYXBwaW5nKHBNZ210LT5wQWRhcHRlciwgc0ZyYW1lLnBJRV9DSFNXLT5ieU1vZGUsIHBNZ210LT5lQ3VycmVudFBIWU1vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0ZyYW1lLnBJRV9DSFNXLT5ieUNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGJJc0NoYW5uZWxFcXVhbCA9PSBGQUxTRSkgewotICAgICAgICAgICAgICAgIENBUkRiU2V0Q2hhbm5lbChwTWdtdC0+cEFkYXB0ZXIsIHBCU1NMaXN0LT51Q2hhbm5lbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc0NoYW5uZWxFcXVhbCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHNldF9jaGFubmVsKHBNZ210LT5wQWRhcHRlciwgcEJTU0xpc3QtPnVDaGFubmVsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIxNDgsMTcgKzIxNDksMTcgQEAKICAgICAvLyBjaGVjayBpZiBiZWFjb24gVFNGIGxhcmdlciBvciBzbWFsbCB0aGFuIG91ciBsb2NhbCBUU0YKICAgICBpZiAoSElEV09SRChxd1RpbWVzdGFtcCkgPT0gSElEV09SRChxd0xvY2FsVFNGKSkgewogICAgICAgICBpZiAoTE9EV09SRChxd1RpbWVzdGFtcCkgPj0gTE9EV09SRChxd0xvY2FsVFNGKSkgewotICAgICAgICAgICAgYlRTRk9mZnNldFBvc3RpdmUgPSBUUlVFOworICAgICAgICAgICAgYlRTRk9mZnNldFBvc3RpdmUgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgYlRTRk9mZnNldFBvc3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgIGJUU0ZPZmZzZXRQb3N0aXZlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAoSElEV09SRChxd1RpbWVzdGFtcCkgPiBISURXT1JEKHF3TG9jYWxUU0YpKSB7Ci0gICAgICAgIGJUU0ZPZmZzZXRQb3N0aXZlID0gVFJVRTsKKyAgICAgICAgYlRTRk9mZnNldFBvc3RpdmUgPSB0cnVlOwogICAgIH0KICAgICBlbHNlIGlmIChISURXT1JEKHF3VGltZXN0YW1wKSA8IEhJRFdPUkQocXdMb2NhbFRTRikpIHsKLSAgICAgICAgYlRTRk9mZnNldFBvc3RpdmUgPSBGQUxTRTsKKyAgICAgICAgYlRTRk9mZnNldFBvc3RpdmUgPSBmYWxzZTsKICAgICB9OwogCiAgICAgaWYgKGJUU0ZPZmZzZXRQb3N0aXZlKSB7CkBAIC0yMTcwLDIxICsyMTcxLDIxIEBACiAKICAgICBpZiAoSElEV09SRChxd1RTRk9mZnNldCkgIT0gMCB8fAogICAgICAgICAoTE9EV09SRChxd1RTRk9mZnNldCkgPiBUUklWSUFMX1NZTkNfRElGRkVSRU5DRSApKSB7Ci0gICAgICAgICBiVFNGTGFyZ2VEaWZmID0gVFJVRTsKKyAgICAgICAgIGJUU0ZMYXJnZURpZmYgPSB0cnVlOwogICAgIH0KIAogCiAgICAgLy8gaWYgaW5mcmEgbW9kZQotICAgIGlmIChiSXNBUEJlYWNvbiA9PSBUUlVFKSB7CisgICAgaWYgKGJJc0FQQmVhY29uID09IHRydWUpIHsKIAogICAgICAgICAvLyBJbmZyYSBtb2RlOiBMb2NhbCBUU0YgYWx3YXlzIGZvbGxvdyBBUCdzIFRTRiBpZiBEaWZmZXJlbmNlIGh1Z2UuCiAgICAgICAgIGlmIChiVFNGTGFyZ2VEaWZmKQotICAgICAgICAgICAgYlVwZGF0ZVRTRiA9IFRSVUU7CisgICAgICAgICAgICBiVXBkYXRlVFNGID0gdHJ1ZTsKIAotICAgICAgICBpZiAoKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPT0gVFJVRSkgJiYoc0ZyYW1lLnBUSU0gIT0gMCkpIHsKKyAgICAgICAgaWYgKChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID09IHRydWUpICYmKHNGcmFtZS5wVElNICE9IDApKSB7CiAKICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBEVElNLCBhbmFseXNpcyBUSU0KLSAgICAgICAgICAgIHBNZ210LT5iTXVsdGljYXN0VElNID0gV0xBTl9NR01UX0lTX01VTFRJQ0FTVF9USU0oc0ZyYW1lLnBUSU0tPmJ5Qml0TWFwQ3RsKSA/IFRSVUUgOiBGQUxTRSA7CisgICAgICAgICAgICBwTWdtdC0+Yk11bHRpY2FzdFRJTSA9IFdMQU5fTUdNVF9JU19NVUxUSUNBU1RfVElNKHNGcmFtZS5wVElNLT5ieUJpdE1hcEN0bCkgPyB0cnVlIDogZmFsc2UgOwogICAgICAgICAgICAgcE1nbXQtPmJ5RFRJTUNvdW50ID0gc0ZyYW1lLnBUSU0tPmJ5RFRJTUNvdW50OwogICAgICAgICAgICAgcE1nbXQtPmJ5RFRJTVBlcmlvZCA9IHNGcmFtZS5wVElNLT5ieURUSU1QZXJpb2Q7CiAgICAgICAgICAgICB3QUlETnVtYmVyID0gcE1nbXQtPndDdXJyQUlEICYgfihCSVQxNHxCSVQxNSk7CkBAIC0yMTk5LDE5ICsyMjAwLDE5IEBACiAgICAgICAgICAgICAgICAgLy8gbGVuID0gYnlEVElNQ291bnQgKyBieURUSU1QZXJpb2QgKyBieURUSU1QZXJpb2QgKyBieVZpcnRCaXRNYXBbMH4yNTBdCiAgICAgICAgICAgICAgICAgaWYgKHNGcmFtZS5wVElNLT5sZW4gPj0gKHVMb2NhdGVCeXRlSW5kZXggKyA0KSkgewogICAgICAgICAgICAgICAgICAgICBieVRJTUJpdE9uICA9ICgweDAxKSA8PCAoKHdBSUROdW1iZXIpICUgOCk7Ci0gICAgICAgICAgICAgICAgICAgIHBNZ210LT5iSW5USU0gPSBzRnJhbWUucFRJTS0+YnlWaXJ0Qml0TWFwW3VMb2NhdGVCeXRlSW5kZXhdICYgYnlUSU1CaXRPbiA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmJJblRJTSA9IHNGcmFtZS5wVElNLT5ieVZpcnRCaXRNYXBbdUxvY2F0ZUJ5dGVJbmRleF0gJiBieVRJTUJpdE9uID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmJJblRJTSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YkluVElNID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBNZ210LT5iSW5USU0gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBwTWdtdC0+YkluVElNID0gZmFsc2U7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICBpZiAocE1nbXQtPmJJblRJTSB8fAogICAgICAgICAgICAgICAgIChwTWdtdC0+Yk11bHRpY2FzdFRJTSAmJiAocE1nbXQtPmJ5RFRJTUNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgIHBNZ210LT5iSW5USU1XYWtlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwTWdtdC0+YkluVElNV2FrZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gc2VuZCBvdXQgcHMtcG9sbCBwYWNrZXQKIC8vICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJDTjpJbiBUSU1cbiIpOwogICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+YkluVElNKSB7CkBAIC0yMjIxLDE0ICsyMjIyLDE0IEBACiAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBNZ210LT5iSW5USU1XYWtlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcE1nbXQtPmJJblRJTVdha2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJCQ046IE5vdCBJbiBUSU0uLlxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJQV0JpdE9uID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJQV0JpdE9uID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJDTjogU2VuZCBOdWxsIFBhY2tldFxuIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChQU2JTZW5kTnVsbFBhY2tldChwRGV2aWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJQV0JpdE9uID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJQV0JpdE9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoUFNiQ29uc2lkZXJQb3dlckRvd24ocERldmljZSwgRkFMU0UsIEZBTFNFKSkgeworICAgICAgICAgICAgICAgIGlmKFBTYkNvbnNpZGVyUG93ZXJEb3duKHBEZXZpY2UsIGZhbHNlLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJCQ046IFBvd2VyIGRvd24gbm93Li4uXG4iKTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfQpAQCAtMjI0Niw3ICsyMjQ3LDcgQEAKICAgICAgICAgICAgIC8vIGFkaG9jIG1vZGU6VFNGIHVwZGF0ZWQgb25seSB3aGVuIGJlYWNvbiBsYXJnZXIgdGhlbiBsb2NhbCBUU0YKICAgICAgICAgICAgIGlmIChiVFNGTGFyZ2VEaWZmICYmIGJUU0ZPZmZzZXRQb3N0aXZlICYmCiAgICAgICAgICAgICAgICAgKHBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfSk9JTlRFRCkpCi0gICAgICAgICAgICAgICAgYlVwZGF0ZVRTRiA9IFRSVUU7CisgICAgICAgICAgICAgICAgYlVwZGF0ZVRTRiA9IHRydWU7CiAKICAgICAgICAgICAgIC8vIER1cmluZyBkcGMsIGFscmVhZHkgaW4gc3BpbmxvY2tlZC4KICAgICAgICAgICAgIGlmIChCU1NEQmJJc1NUQUluTm9kZURCKHBNZ210LCBzRnJhbWUucEhkci0+c0EzLmFieUFkZHIyLCAmdU5vZGVJbmRleCkpIHsKQEAgLTIyNTksNyArMjI2MCw3IEBACiAgICAgICAgICAgICAgICAgUkFURXZQYXJzZU1heFJhdGUoICh2b2lkICopcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJTdXBwUmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4QmFzaWNSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndNYXhTdXBwUmF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53U3VwcFJhdGUpLApAQCAtMjI4MCw3ICsyMjgxLDcgQEAKICAgICAgICAgICAgICAgICBSQVRFdlBhcnNlTWF4UmF0ZSggKHZvaWQgKilwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwTWdtdC0+YWJ5Q3VyclN1cHBSYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndNYXhCYXNpY1JhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0ud01heFN1cHBSYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLndTdXBwUmF0ZSksCkBAIC0yMzAwLDcgKzIzMDEsNyBAQAogLyoKICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJTaG9ydFNsb3RUaW1lID0gV0xBTl9HRVRfQ0FQX0lORk9fU0hPUlRTTE9UVElNRSgqc0ZyYW1lLnB3Q2FwSW5mbyk7CiAgICAgICAgICAgICAgICAgaWYocE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS53TWF4U3VwcFJhdGUgPiBSQVRFXzExTSkKLSAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVt1Tm9kZUluZGV4XS5iRVJQRXhpc3QgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJFUlBFeGlzdCA9IHRydWU7CiAqLwogICAgICAgICAgICAgfQogCkBAIC0yMzA4LDExICsyMzA5LDExIEBACiAgICAgICAgICAgICBpZiAocE1nbXQtPmVDdXJyU3RhdGUgPT0gV01BQ19TVEFURV9TVEFSVEVEKSB7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiQ3VycmVudCBJQlNTIFN0YXRlOiBbU3RhcnRlZF0uLi4uLi4uLnRvOiBbSm9pbnRlZF0gXG4iKTsKICAgICAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSk9JTlRFRDsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBUUlVFOworICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJMaW5rUGFzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocERldmljZS0+ZGV2KSl7CiAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUocERldmljZS0+ZGV2KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJBY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0udUluQWN0aXZlQ291bnQgPSAwOwogCiAgICAgICAgICAgICB9OwpAQCAtMjM5MiwxNiArMjM5MywxNiBAQAogewogICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZSA9IChQU0RldmljZSloRGV2aWNlQ29udGV4dDsKICAgICBQU01nbXRPYmplY3QgICAgICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7Ci0gICAgV09SRCAgICAgICAgICAgICAgICB3TWF4QmFzaWNSYXRlOwotICAgIFdPUkQgICAgICAgICAgICAgICAgd01heFN1cHBSYXRlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlUb3BDQ0tCYXNpY1JhdGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieVRvcE9GRE1CYXNpY1JhdGU7CisgICAgdW5zaWduZWQgc2hvcnQgd01heEJhc2ljUmF0ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TWF4U3VwcFJhdGU7CisgICAgdW5zaWduZWQgY2hhciBieVRvcENDS0Jhc2ljUmF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VG9wT0ZETUJhc2ljUmF0ZTsKICAgICBRV09SRCAgICAgICAgICAgICAgIHF3Q3VyclRTRjsKLSAgICBVSU5UICAgICAgICAgICAgICAgIGlpOwotICAgIEJZVEUgICAgYWJ5UkFURVtdID0gezB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NkMsIDB4MEMsIDB4MTIsIDB4MTgsIDB4NjB9OwotICAgIEJZVEUgICAgYWJ5Q0NLX1JBVEVbXSA9IHsweDgyLCAweDg0LCAweDhCLCAweDk2fTsKLSAgICBCWVRFICAgIGFieU9GRE1fUkFURVtdID0gezB4MEMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkN9OwotICAgIFdPUkQgICAgICAgICAgICAgICAgd1N1cHBSYXRlOworICAgIHVuc2lnbmVkIGludCBpaTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVJBVEVbXSA9IHsweDgyLCAweDg0LCAweDhCLCAweDk2LCAweDI0LCAweDMwLCAweDQ4LCAweDZDLCAweDBDLCAweDEyLCAweDE4LCAweDYwfTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUNDS19SQVRFW10gPSB7MHg4MiwgMHg4NCwgMHg4QiwgMHg5Nn07CisgICAgdW5zaWduZWQgY2hhciBhYnlPRkRNX1JBVEVbXSA9IHsweDBDLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDfTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3U3VwcFJhdGU7CiAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJDcmVhdGUgQmFzaWMgU2VydmljZSBTZXQgLi4uLi4uLlxuIik7CiAKQEAgLTI0ODYsNyArMjQ4Nyw3IEBACiAgICAgLy8gc2V0IGJhc2ljIHJhdGUKIAogICAgIFJBVEV2UGFyc2VNYXhSYXRlKCh2b2lkICopcERldmljZSwgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJTdXBwUmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJFeHRTdXBwUmF0ZXMsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJFeHRTdXBwUmF0ZXMsIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgJndNYXhCYXNpY1JhdGUsICZ3TWF4U3VwcFJhdGUsICZ3U3VwcFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgJmJ5VG9wQ0NLQmFzaWNSYXRlLCAmYnlUb3BPRkRNQmFzaWNSYXRlKTsKIApAQCAtMjUzMywxMiArMjUzNCwxMiBAQAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkgewogCiAgICAgICAgIC8vIEJTU0lEIHNlbGVjdGVkIG11c3QgYmUgcmFuZG9taXplZCBhcyBzcGVjIDExLjEuMwotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdID0gKEJZVEUpIChMT0RXT1JEKHF3Q3VyclRTRikmIDB4MDAwMDAwZmYpOwotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzRdID0gKEJZVEUpKChMT0RXT1JEKHF3Q3VyclRTRikmIDB4MDAwMGZmMDApID4+IDgpOwotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzNdID0gKEJZVEUpKChMT0RXT1JEKHF3Q3VyclRTRikmIDB4MDBmZjAwMDApID4+IDE2KTsKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsyXSA9IChCWVRFKSgoTE9EV09SRChxd0N1cnJUU0YpJiAweDAwMDAwZmYwKSA+PiA0KTsKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsxXSA9IChCWVRFKSgoTE9EV09SRChxd0N1cnJUU0YpJiAweDAwMGZmMDAwKSA+PiAxMik7Ci0gICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMF0gPSAoQllURSkoKExPRFdPUkQocXdDdXJyVFNGKSYgMHgwZmYwMDAwMCkgPj4gMjApOworICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdID0gKHVuc2lnbmVkIGNoYXIpIChMT0RXT1JEKHF3Q3VyclRTRikmIDB4MDAwMDAwZmYpOworICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzRdID0gKHVuc2lnbmVkIGNoYXIpKChMT0RXT1JEKHF3Q3VyclRTRikmIDB4MDAwMGZmMDApID4+IDgpOworICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzNdID0gKHVuc2lnbmVkIGNoYXIpKChMT0RXT1JEKHF3Q3VyclRTRikmIDB4MDBmZjAwMDApID4+IDE2KTsKKyAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoTE9EV09SRChxd0N1cnJUU0YpJiAweDAwMDAwZmYwKSA+PiA0KTsKKyAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoTE9EV09SRChxd0N1cnJUU0YpJiAweDAwMGZmMDAwKSA+PiAxMik7CisgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMF0gPSAodW5zaWduZWQgY2hhcikoKExPRFdPUkQocXdDdXJyVFNGKSYgMHgwZmYwMDAwMCkgPj4gMjApOwogICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdIF49IHBNZ210LT5hYnlNQUNBZGRyWzBdOwogICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzRdIF49IHBNZ210LT5hYnlNQUNBZGRyWzFdOwogICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzNdIF49IHBNZ210LT5hYnlNQUNBZGRyWzJdOwpAQCAtMjYxMSw3ICsyNjEyLDcgQEAKIAogICAgIENBUkRiU2V0QmVhY29uUGVyaW9kKHBNZ210LT5wQWRhcHRlciwgcE1nbXQtPndJQlNTQmVhY29uUGVyaW9kKTsKICAgICAvLyBzZXQgY2hhbm5lbCBhbmQgY2xlYXIgTkFWCi0gICAgQ0FSRGJTZXRDaGFubmVsKHBNZ210LT5wQWRhcHRlciwgcE1nbXQtPnVJQlNTQ2hhbm5lbCk7CisgICAgc2V0X2NoYW5uZWwocE1nbXQtPnBBZGFwdGVyLCBwTWdtdC0+dUlCU1NDaGFubmVsKTsKICAgICBwTWdtdC0+dUN1cnJDaGFubmVsID0gcE1nbXQtPnVJQlNTQ2hhbm5lbDsKIAogICAgIGlmIChDQVJEYklzU2hvcnRQcmVhbWJsZShwTWdtdC0+cEFkYXB0ZXIpKSB7CkBAIC0yNjIwLDcgKzI2MjEsNyBAQAogICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvICY9ICh+V0xBTl9TRVRfQ0FQX0lORk9fU0hPUlRQUkVBTUJMRSgxKSk7CiAgICAgfQogCi0gICAgaWYgKChwTWdtdC0+YjExaEVuYWJsZSA9PSBUUlVFKSAmJgorICAgIGlmICgocE1nbXQtPmIxMWhFbmFibGUgPT0gdHJ1ZSkgJiYKICAgICAgICAgKHBNZ210LT5lQ3VycmVudFBIWU1vZGUgPT0gUEhZX1RZUEVfMTFBKSkgewogICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX1NQRUNUUlVNTU5HKDEpOwogICAgIH0gZWxzZSB7CkBAIC0yNjYxLDIwICsyNjYyLDIwIEBACiAgICAgUFNEZXZpY2UgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7CiAgICAgUEtub3duQlNTICAgICAgIHBDdXJyID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgaWksIHV1OworICAgIHVuc2lnbmVkIGludCBpaSwgdXU7CiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwSXRlbVJhdGVzID0gTlVMTDsKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBJdGVtRXh0UmF0ZXMgPSBOVUxMOwogICAgIFBXTEFOX0lFX1NTSUQgICBwSXRlbVNTSUQ7Ci0gICAgVUlOVCAgICAgICAgICAgIHVSYXRlTGVuID0gV0xBTl9SQVRFU19NQVhMRU47Ci0gICAgV09SRCAgICAgICAgICAgIHdNYXhCYXNpY1JhdGUgPSBSQVRFXzFNOwotICAgIFdPUkQgICAgICAgICAgICB3TWF4U3VwcFJhdGUgPSBSQVRFXzFNOwotICAgIFdPUkQgICAgICAgICAgICB3U3VwcFJhdGU7Ci0gICAgQllURSAgICAgICAgICAgIGJ5VG9wQ0NLQmFzaWNSYXRlID0gUkFURV8xTTsKLSAgICBCWVRFICAgICAgICAgICAgYnlUb3BPRkRNQmFzaWNSYXRlID0gUkFURV8xTTsKKyAgICB1bnNpZ25lZCBpbnQgdVJhdGVMZW4gPSBXTEFOX1JBVEVTX01BWExFTjsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TWF4QmFzaWNSYXRlID0gUkFURV8xTTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3TWF4U3VwcFJhdGUgPSBSQVRFXzFNOworICAgIHVuc2lnbmVkIHNob3J0IHdTdXBwUmF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VG9wQ0NLQmFzaWNSYXRlID0gUkFURV8xTTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5VG9wT0ZETUJhc2ljUmF0ZSA9IFJBVEVfMU07CiAKIAogICAgIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7Ci0gICAgICAgIGlmIChwTWdtdC0+c0JTU0xpc3RbaWldLmJBY3RpdmUgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBNZ210LT5zQlNTTGlzdFtpaV0uYkFjdGl2ZSA9PSB0cnVlKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yNzA4LDE0ICsyNzA5LDE0IEBACiAgICAgLy8gcGF0Y2ggZm9yIENJU0NPIG1pZ3JhdGlvbiBtb2RlCiAvKgogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoV1BBX1NlYXJjaFJTTigwLCBXUEFfVEtJUCwgcEN1cnIpID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKFdQQV9TZWFyY2hSU04oMCwgV1BBX1RLSVAsIHBDdXJyKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIk5vIG1hdGNoIFJTTiBpbmZvLiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOwogICAgICAgICAgICAgICAgICAgICAvLyBlbmNyeXB0aW9uIG1vZGUgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoV1BBX1NlYXJjaFJTTigwLCBXUEFfQUVTQ0NNUCwgcEN1cnIpID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKFdQQV9TZWFyY2hSU04oMCwgV1BBX0FFU0NDTVAsIHBDdXJyKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIk5vIG1hdGNoIFJTTiBpbmZvLiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOwogICAgICAgICAgICAgICAgICAgICAvLyBlbmNyeXB0aW9uIG1vZGUgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CkBAIC0yNzI2LDcgKzI3MjcsNyBAQAogICAgICAgICB9CiAKICNpZmRlZiBXUEFfU1VQUExJQ0FOVF9EUklWRVJfV0VYVF9TVVBQT1JUCi0JLy9pZihwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID09IFRSVUUpCisJLy9pZihwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID09IHRydWUpCiAgICAgICAgICAgICBFbmN5cHRpb25fUmVidWlsZChwRGV2aWNlLCBwQ3Vycik7CiAjZW5kaWYKICAgICAgICAgLy8gSW5mcmFzdHJ1Y3R1cmUgQlNTCkBAIC0yNzY0LDE1ICsyNzY1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVSYXRlTGVuKTsKICAgICAgICAgICAgIC8vIFN0dWZmaW5nIFJhdGUgSUUKICAgICAgICAgICAgIGlmICgocEl0ZW1FeHRSYXRlcy0+bGVuID4gMCkgJiYgKHBJdGVtUmF0ZXMtPmxlbiA8IDgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKFVJTlQpKDggLSBwSXRlbVJhdGVzLT5sZW4pOyApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAodW5zaWduZWQgaW50KSg4IC0gcEl0ZW1SYXRlcy0+bGVuKTsgKSB7CiAgICAgICAgICAgICAgICAgICAgIHBJdGVtUmF0ZXMtPmFieVJhdGVzW3BJdGVtUmF0ZXMtPmxlbiArIGlpXSA9IHBJdGVtRXh0UmF0ZXMtPmFieVJhdGVzW2lpXTsKICAgICAgICAgICAgICAgICAgICAgaWkgKys7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwSXRlbUV4dFJhdGVzLT5sZW4gPD0gaWkpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEl0ZW1SYXRlcy0+bGVuICs9IChCWVRFKWlpOworICAgICAgICAgICAgICAgIHBJdGVtUmF0ZXMtPmxlbiArPSAodW5zaWduZWQgY2hhcilpaTsKICAgICAgICAgICAgICAgICBpZiAocEl0ZW1FeHRSYXRlcy0+bGVuIC0gaWkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJdGVtRXh0UmF0ZXMtPmxlbiAtPSAoQllURSlpaTsKKyAgICAgICAgICAgICAgICAgICAgcEl0ZW1FeHRSYXRlcy0+bGVuIC09ICh1bnNpZ25lZCBjaGFyKWlpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKHV1ID0gMDsgdXUgPCBwSXRlbUV4dFJhdGVzLT5sZW47IHV1ICsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbUV4dFJhdGVzLT5hYnlSYXRlc1t1dV0gPSBwSXRlbUV4dFJhdGVzLT5hYnlSYXRlc1t1dSArIGlpXTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjc4MSw3ICsyNzgyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFJBVEV2UGFyc2VNYXhSYXRlKCh2b2lkICopcERldmljZSwgcEl0ZW1SYXRlcywgcEl0ZW1FeHRSYXRlcywgVFJVRSwKKyAgICAgICAgICAgIFJBVEV2UGFyc2VNYXhSYXRlKCh2b2lkICopcERldmljZSwgcEl0ZW1SYXRlcywgcEl0ZW1FeHRSYXRlcywgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3TWF4QmFzaWNSYXRlLCAmd01heFN1cHBSYXRlLCAmd1N1cHBSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5VG9wQ0NLQmFzaWNSYXRlLCAmYnlUb3BPRkRNQmFzaWNSYXRlKTsKIApAQCAtMjgwMiw5ICsyODAzLDkgQEAKICAgICAgICAgICAgIC8vIEFkZCBjdXJyZW50IEJTUyB0byBDYW5kaWRhdGUgbGlzdAogICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSB3b3JrcyBmb3IgV1BBMiBCU1MsIGFuZCBXUEEyIEJTUyBjaGVjayBtdXN0IGJlIGRvbmUgYmVmb3JlLgogICAgICAgICAgICAgaWYgKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikgewotICAgICAgICAgICAgICAgIEJPT0wgYlJlc3VsdCA9IGJBZGRfUE1LSURfQ2FuZGlkYXRlKCh2b2lkICopcERldmljZSwgcE1nbXQtPmFieUN1cnJCU1NJRCwgJnBDdXJyLT5zUlNOQ2FwT2JqKTsKKyAgICAgICAgICAgICAgICBib29sIGJSZXN1bHQgPSBiQWRkX1BNS0lEX0NhbmRpZGF0ZSgodm9pZCAqKXBEZXZpY2UsIHBNZ210LT5hYnlDdXJyQlNTSUQsICZwQ3Vyci0+c1JTTkNhcE9iaik7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJiQWRkX1BNS0lEX0NhbmRpZGF0ZTogMSglZClcbiIsIGJSZXN1bHQpOwotICAgICAgICAgICAgICAgIGlmIChiUmVzdWx0ID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJSZXN1bHQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgdkZsdXNoX1BNS0lEX0NhbmRpZGF0ZSgodm9pZCAqKXBEZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInZGbHVzaF9QTUtJRF9DYW5kaWRhdGU6IDRcbiIpOwogICAgICAgICAgICAgICAgICAgICBiQWRkX1BNS0lEX0NhbmRpZGF0ZSgodm9pZCAqKXBEZXZpY2UsIHBNZ210LT5hYnlDdXJyQlNTSUQsICZwQ3Vyci0+c1JTTkNhcE9iaik7CkBAIC0yODMxLDEzICsyODMyLDEzIEBACiAgICAgICAgIGlmIChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQU5PTkUpIHsKIAogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoV1BBX1NlYXJjaFJTTigwLCBXUEFfVEtJUCwgcEN1cnIpID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKFdQQV9TZWFyY2hSU04oMCwgV1BBX1RLSVAsIHBDdXJyKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBlbmNyeXB0aW9uIG1vZGUgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoV1BBX1NlYXJjaFJTTigwLCBXUEFfQUVTQ0NNUCwgcEN1cnIpID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKFdQQV9TZWFyY2hSU04oMCwgV1BBX0FFU0NDTVAsIHBDdXJyKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBlbmNyeXB0aW9uIG1vZGUgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTI4NjgsNyArMjg2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9SQVRFU19NQVhMRU5fMTFCKTsKICAgICAgICAgICAgIC8vIHNldCBiYXNpYyByYXRlCiAgICAgICAgICAgICBSQVRFdlBhcnNlTWF4UmF0ZSgodm9pZCAqKXBEZXZpY2UsIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBNZ210LT5hYnlDdXJyU3VwcFJhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgVFJVRSwgJndNYXhCYXNpY1JhdGUsICZ3TWF4U3VwcFJhdGUsICZ3U3VwcFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0cnVlLCAmd01heEJhc2ljUmF0ZSwgJndNYXhTdXBwUmF0ZSwgJndTdXBwUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieVRvcENDS0Jhc2ljUmF0ZSwgJmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAKICAgICAgICAgICAgIHBNZ210LT53Q3VyckNhcEluZm8gPSBwQ3Vyci0+d0NhcEluZm87CkBAIC0yODgzLDcgKzI4ODQsNyBAQAogICAgICAgICAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX1NUQVJURUQ7CiAgICAgICAgICAgICAvLyBBZG9wdCBCU1Mgc3RhdGUgaW4gQWRhcHRlciBEZXZpY2UgT2JqZWN0CiAgICAgICAgICAgICAvL3BEZXZpY2UtPmJ5T3BNb2RlID0gT1BfTU9ERV9BREhPQzsKLS8vICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gVFJVRTsKKy8vICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gdHJ1ZTsKIC8vICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKIAogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJKb2luIElCU1Mgb2s6JTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnggXG4iLApAQCAtMjkyMyw3ICsyOTI0LDcgQEAKIHZvaWQKIHNfdk1nclN5bmNoQlNTICgKICAgICBQU0RldmljZSAgICAgIHBEZXZpY2UsCi0gICAgVUlOVCAgICAgICAgICB1QlNTTW9kZSwKKyAgICB1bnNpZ25lZCBpbnQgdUJTU01vZGUsCiAgICAgUEtub3duQlNTICAgICBwQ3VyciwKICAgICBQQ01EX1NUQVRVUyAgcFN0YXR1cwogICAgICkKQEAgLTI5MzIsMTEgKzI5MzMsMTEgQEAKICAgICBQU01nbXRPYmplY3QgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7CiAvLyAgICBpbnQgICAgIGlpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzFNLCAgIDJNLCAgIDVNLCAgIDExTSwgIDE4TSwgIDI0TSwgIDM2TSwgIDU0TQotICAgIEJZVEUgYWJ5Q3VyclN1cHBSYXRlc0dbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LCAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDI0LCAweDMwLCAweDQ4LCAweDZDfTsKLSAgICBCWVRFIGFieUN1cnJFeHRTdXBwUmF0ZXNHW10gPSB7V0xBTl9FSURfRVhUU1VQUF9SQVRFUywgNCwgMHgwQywgMHgxMiwgMHgxOCwgMHg2MH07CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyU3VwcFJhdGVzR1tdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDgsIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NkN9OworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VyckV4dFN1cHBSYXRlc0dbXSA9IHtXTEFOX0VJRF9FWFRTVVBQX1JBVEVTLCA0LCAweDBDLCAweDEyLCAweDE4LCAweDYwfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy82TSwgICA5TSwgICAxMk0sICA0OE0KLSAgICBCWVRFIGFieUN1cnJTdXBwUmF0ZXNBW10gPSB7V0xBTl9FSURfU1VQUF9SQVRFUywgOCwgMHgwQywgMHgxMiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwgMHg2Q307Ci0gICAgQllURSBhYnlDdXJyU3VwcFJhdGVzQltdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDQsIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTZ9OworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VyclN1cHBSYXRlc0FbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LCAweDBDLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZDfTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUN1cnJTdXBwUmF0ZXNCW10gPSB7V0xBTl9FSURfU1VQUF9SQVRFUywgNCwgMHgwMiwgMHgwNCwgMHgwQiwgMHgxNn07CiAKIAogICAgICpwU3RhdHVzID0gQ01EX1NUQVRVU19GQUlMVVJFOwpAQCAtMjk0NCw3ICsyOTQ1LDcgQEAKICAgICBpZiAoc19iQ2lwaGVyTWF0Y2gocEN1cnIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAmKHBNZ210LT5ieUNTU1BLKSwKLSAgICAgICAgICAgICAgICAgICAgICAgJihwTWdtdC0+YnlDU1NHSykpID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICYocE1nbXQtPmJ5Q1NTR0spKSA9PSBmYWxzZSkgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJzX2JDaXBoZXJNYXRjaCBGYWlsIC4uLi4uLi5cbiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjk1OCwxMiArMjk1OSwxMiBAQAogICAgIH0KIAogICAgIC8vIEluaXQgdGhlIEJTUyBpbmZvcm1hdGlvbnMKLSAgICBwRGV2aWNlLT5iQ0NLID0gVFJVRTsKLSAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5iQ0NLID0gdHJ1ZTsKKyAgICBwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPSBmYWxzZTsKICAgICBNQUN2RGlzYWJsZVByb3RlY3RNRChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICBwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9IEZBTFNFOworICAgIHBEZXZpY2UtPmJCYXJrZXJQcmVhbWJsZU1kID0gZmFsc2U7CiAgICAgTUFDdkRpc2FibGVCYXJrZXJQcmVhbWJsZU1kKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgIHBEZXZpY2UtPmJOb25FUlBQcmVzZW50ID0gRkFMU0U7CisgICAgcERldmljZS0+Yk5vbkVSUFByZXNlbnQgPSBmYWxzZTsKICAgICBwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSA9IDA7CiAgICAgcERldmljZS0+d0Jhc2ljUmF0ZSA9IDA7CiAgICAgLy8gU2V0IEJhc2ljIFJhdGUKQEAgLTMwNDYsMTIgKzMwNDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnItPnNFUlAuYnlFUlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyU3VwcFJhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckV4dFN1cHBSYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gdHJ1ZSkgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICI8LS0tLXNfYlN5bmNoQlNTIFNldCBQaHkgTW9kZSBGYWlsIFslZF1cbiIsIGVQaHlUeXBlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBzZXQgY2hhbm5lbCBhbmQgY2xlYXIgTkFWCi0gICAgaWYgKENBUkRiU2V0Q2hhbm5lbChwTWdtdC0+cEFkYXB0ZXIsIHBDdXJyLT51Q2hhbm5lbCkgPT0gRkFMU0UpIHsKKyAgICBpZiAoc2V0X2NoYW5uZWwocE1nbXQtPnBBZGFwdGVyLCBwQ3Vyci0+dUNoYW5uZWwpID09IGZhbHNlKSB7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjwtLS0tc19iU3luY2hCU1MgU2V0IENoYW5uZWwgWyVkXVxuIiwgcEN1cnItPnVDaGFubmVsKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTMwNzcsNyArMzA3OCw3IEBACiAgICAgcE1nbXQtPnVDdXJyQ2hhbm5lbCA9IHBDdXJyLT51Q2hhbm5lbDsKICAgICBwTWdtdC0+ZUN1cnJlbnRQSFlNb2RlID0gZVBoeVR5cGU7CiAgICAgcE1nbXQtPmJ5RVJQQ29udGV4dCA9IHBDdXJyLT5zRVJQLmJ5RVJQOwotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlN5bmM6U2V0IHRvIGNoYW5uZWwgPSBbJWRdXG4iLCAoSU5UKXBDdXJyLT51Q2hhbm5lbCk7CisgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU3luYzpTZXQgdG8gY2hhbm5lbCA9IFslZF1cbiIsIChpbnQpcEN1cnItPnVDaGFubmVsKTsKIAogCiAgICAgKnBTdGF0dXMgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CkBAIC0zMDk0LDE4ICszMDk1LDE4IEBACiAgKQogIHsKICAgUFNNZ210T2JqZWN0ICBwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwotIC8vIFVJTlQgICAgICAgICAgICBpaSAsIHVTYW1lQnNzaWROdW09MDsKKyAvLyB1bnNpZ25lZCBpbnQgaWkgLCB1U2FtZUJzc2lkTnVtPTA7CiAKICAgICAgICAgLy8gIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7CiAgICAgICAgICAgLy8gICBpZiAocE1nbXQtPnNCU1NMaXN0W2lpXS5iQWN0aXZlICYmCi0gICAgICAgICAgICAvLyAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5QlNTSUQsIHBDdXJyLT5hYnlCU1NJRCkpIHsKKyAgICAgICAgICAgIC8vICAgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwTWdtdC0+c0JTU0xpc3RbaWldLmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAgLy8gICAgICAgdVNhbWVCc3NpZE51bSsrOwogICAgICAgICAgICAgICAgLy8gICB9CiAgICAgICAgICAgIC8vIH0KICAgLy8gICBpZiggdVNhbWVCc3NpZE51bT49MikgewkgLy93ZSBvbmx5IGNoZWNrIEFQIGluIGhpZGRlbiBzc3NpZCAgbW9kZQogICAgICAgICBpZiAoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBUFNLKSB8fCAgICAgICAgICAgLy9uZXR3b3JrbWFuYWdlciAwLjcuMCBkb2VzIG5vdCBnaXZlIHRoZSBwYWlyd2lzZS1rZXkgc2Vsc2VjdGlvbiwKICAgICAgICAgICAgICAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEEyUFNLKSkgeyAgICAgICAgIC8vIHNvIHdlIG5lZWQgcmUtc2Vsc2VjdCBpdCBhY2NvcmRpbmcgdG8gcmVhbCBwYWlyd2lzZS1rZXkgaW5mby4KLSAgICAgICAgICAgICAgIGlmKHBDdXJyLT5iV1BBVmFsaWQgPT0gVFJVRSkgIHsgICAvL1dQQS1QU0sKKyAgICAgICAgICAgICAgIGlmKHBDdXJyLT5iV1BBVmFsaWQgPT0gdHJ1ZSkgIHsgICAvL1dQQS1QU0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVBdXRoZW5Nb2RlID0gV01BQ19BVVRIX1dQQVBTSzsKIAkJICAgIGlmKHBDdXJyLT5hYnlQS1R5cGVbMF0gPT0gV1BBX1RLSVApIHsKICAgICAgCQkgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsgICAgLy9US0lQCkBAIC0zMTE2LDcgKzMxMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVF9LKCJFbmN5cHRpb25fUmVidWlsZC0tLT5zc2lkIHJlc2V0IGNvbmZpZyB0byBbV1BBUFNLLUFFU11cbiIpOwogICAgICAJCSAgICAgfQogICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgIGVsc2UgaWYocEN1cnItPmJXUEEyVmFsaWQgPT0gVFJVRSkgeyAgLy9XUEEyLVBTSworICAgICAgICAgICAgICAgZWxzZSBpZihwQ3Vyci0+YldQQTJWYWxpZCA9PSB0cnVlKSB7ICAvL1dQQTItUFNLCiAgICAgICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmVBdXRoZW5Nb2RlID0gV01BQ19BVVRIX1dQQTJQU0s7CiAJCSAgICAgICBpZihwQ3Vyci0+YWJ5Q1NTUEtbMF0gPT0gV0xBTl8xMWlfQ1NTX1RLSVApIHsKICAgICAgIAkJICAgICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7ICAgICAvL1RLSVAKQEAgLTMxNTEsMTMgKzMxNTIsMTMgQEAKICAgICBQV0xBTl9JRV9USU0gcFRJTQogICAgICkKIHsKLSAgICBCWVRFICAgICAgICBieU1hc2tbOF0gPSB7MSwgMiwgNCwgOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci0gICAgQllURSAgICAgICAgYnlNYXA7Ci0gICAgVUlOVCAgICAgICAgaWksIGpqOwotICAgIEJPT0wgICAgICAgIGJTdGFydEZvdW5kID0gRkFMU0U7Ci0gICAgQk9PTCAgICAgICAgYk11bHRpY2FzdCA9IEZBTFNFOwotICAgIFdPUkQgICAgICAgIHdTdGFydEluZGV4ID0gMDsKLSAgICBXT1JEICAgICAgICB3RW5kSW5kZXggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYnlNYXNrWzhdID0gezEsIDIsIDQsIDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworICAgIHVuc2lnbmVkIGNoYXIgYnlNYXA7CisgICAgdW5zaWduZWQgaW50IGlpLCBqajsKKyAgICBib29sIGJTdGFydEZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBiTXVsdGljYXN0ID0gZmFsc2U7CisgICAgdW5zaWduZWQgc2hvcnQgd1N0YXJ0SW5kZXggPSAwOworICAgIHVuc2lnbmVkIHNob3J0IHdFbmRJbmRleCA9IDA7CiAKIAogICAgIC8vIEZpbmQgc2l6ZSBvZiBwYXJ0aWFsIHZpcnR1YWwgYml0bWFwCkBAIC0zMTY3LDEzICszMTY4LDEzIEBACiAgICAgICAgICAgICAvLyBNYXNrIG91dCB0aGUgYnJvYWRjYXN0IGJpdCB3aGljaCBpcyBpbmRpY2F0ZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgIGJNdWx0aWNhc3QgPSAoYnlNYXAgJiBieU1hc2tbMF0pICE9IDA7CiAgICAgICAgICAgICBpZihiTXVsdGljYXN0KSB7Ci0gICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJSeFBTUG9sbCA9IFRSVUU7CisgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJSeFBTUG9sbCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBieU1hcCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5TWFwKSB7CiAgICAgICAgICAgICBpZiAoIWJTdGFydEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgYlN0YXJ0Rm91bmQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJTdGFydEZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB3U3RhcnRJbmRleCA9IGlpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgd0VuZEluZGV4ID0gaWk7CkBAIC0zMjI0LDMwICszMjI1LDMwIEBACiBzX01nck1ha2VCZWFjb24oCiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBQU01nbXRPYmplY3QgcE1nbXQsCi0gICAgV09SRCB3Q3VyckNhcEluZm8sCi0gICAgV09SRCB3Q3VyckJlYWNvblBlcmlvZCwKLSAgICBVSU5UIHVDdXJyQ2hhbm5lbCwKLSAgICBXT1JEIHdDdXJyQVRJTVdpbm9kdywKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckNhcEluZm8sCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJCZWFjb25QZXJpb2QsCisgICAgdW5zaWduZWQgaW50IHVDdXJyQ2hhbm5lbCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckFUSU1XaW5vZHcsCiAgICAgUFdMQU5fSUVfU1NJRCBwQ3VyclNTSUQsCi0gICAgUEJZVEUgcEN1cnJCU1NJRCwKKyAgICB1bnNpZ25lZCBjaGFyICpwQ3VyckJTU0lELAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcwogICAgICkKIHsKICAgICBQU1R4TWdtdFBhY2tldCAgICAgIHBUeFBhY2tldCA9IE5VTEw7CiAgICAgV0xBTl9GUl9CRUFDT04gICAgICBzRnJhbWU7Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlCcm9hZGNhc3RBZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0gICAgUEJZVEUgICAgICAgICAgICAgICBwYnlCdWZmZXI7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICB1TGVuZ3RoID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUJyb2FkY2FzdEFkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXI7CisgICAgdW5zaWduZWQgaW50IHVMZW5ndGggPSAwOwogICAgIFBXTEFOX0lFX0lCU1NfREZTICAgcElCU1NERlMgPSBOVUxMOwotICAgIFVJTlQgICAgICAgICAgICAgICAgaWk7CisgICAgdW5zaWduZWQgaW50IGlpOwogCiAgICAgLy8gcHJlcGFyZSBiZWFjb24gZnJhbWUKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieU1nbXRQYWNrZXRQb29sOwogICAgIG1lbXNldChwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQkVBQ09OX0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgoUEJZVEUpcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKyAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKICAgICAvLyBTZXR1cCB0aGUgc0ZyYW1lIHN0cnVjdHVyZS4KLSAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgc0ZyYW1lLmxlbiA9IFdMQU5fQkVBQ09OX0ZSX01BWExFTjsKICAgICB2TWdyRW5jb2RlQmVhY29uKCZzRnJhbWUpOwogICAgIC8vIFNldHVwIHRoZSBoZWFkZXIKQEAgLTMyNTgsNyArMzI1OSw3IEBACiAgICAgICAgICkpOwogCiAgICAgaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUpIHsKLSAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy53RnJhbWVDdGwgfD0gY3B1X3RvX2xlMTYoKFdPUkQpV0xBTl9TRVRfRkNfUFdSTUdUKDEpKTsKKyAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy53RnJhbWVDdGwgfD0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KVdMQU5fU0VUX0ZDX1BXUk1HVCgxKSk7CiAgICAgfQogCiAgICAgbWVtY3B5KCBzRnJhbWUucEhkci0+c0EzLmFieUFkZHIxLCBhYnlCcm9hZGNhc3RBZGRyLCBXTEFOX0FERFJfTEVOKTsKQEAgLTMyODYsNyArMzI4Nyw3IEBACiAgICAgICAgIHNGcmFtZS5sZW4gKz0gKDEpICsgV0xBTl9JRUhEUl9MRU47CiAgICAgICAgIHNGcmFtZS5wRFNQYXJtcy0+YnlFbGVtZW50SUQgPSBXTEFOX0VJRF9EU19QQVJNUzsKICAgICAgICAgc0ZyYW1lLnBEU1Bhcm1zLT5sZW4gPSAxOwotICAgICAgICBzRnJhbWUucERTUGFybXMtPmJ5Q3VyckNoYW5uZWwgPSAoQllURSl1Q3VyckNoYW5uZWw7CisgICAgICAgIHNGcmFtZS5wRFNQYXJtcy0+YnlDdXJyQ2hhbm5lbCA9ICh1bnNpZ25lZCBjaGFyKXVDdXJyQ2hhbm5lbDsKICAgICB9CiAgICAgLy8gVElNIGZpZWxkCiAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgewpAQCAtMzMyOSwyMiArMzMzMCwyMiBAQAogICAgICAgICAgICAgLy8gUGFpcndpc2UgS2V5IENpcGhlciBTdWl0ZQogICAgICAgICAgICAgc0ZyYW1lLnBSU05XUEEtPndQS0NvdW50ID0gMDsKICAgICAgICAgICAgIC8vIEF1dGggS2V5IE1hbmFnZW1lbnQgU3VpdGUKLSAgICAgICAgICAgICooKFBXT1JEKShzRnJhbWUucEJ1ZiArIHNGcmFtZS5sZW4gKyBzRnJhbWUucFJTTldQQS0+bGVuKSk9MDsKKyAgICAgICAgICAgICooKHVuc2lnbmVkIHNob3J0ICopKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbiArIHNGcmFtZS5wUlNOV1BBLT5sZW4pKT0wOwogICAgICAgICAgICAgc0ZyYW1lLnBSU05XUEEtPmxlbiArPTI7CiAKICAgICAgICAgICAgIC8vIFJTTiBDYXBhYmlsaXRlcwotICAgICAgICAgICAgKigoUFdPUkQpKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbiArIHNGcmFtZS5wUlNOV1BBLT5sZW4pKT0wOworICAgICAgICAgICAgKigodW5zaWduZWQgc2hvcnQgKikoc0ZyYW1lLnBCdWYgKyBzRnJhbWUubGVuICsgc0ZyYW1lLnBSU05XUEEtPmxlbikpPTA7CiAgICAgICAgICAgICBzRnJhbWUucFJTTldQQS0+bGVuICs9MjsKICAgICAgICAgICAgIHNGcmFtZS5sZW4gKz0gc0ZyYW1lLnBSU05XUEEtPmxlbiArIFdMQU5fSUVIRFJfTEVOOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKChwTWdtdC0+YjExaEVuYWJsZSA9PSBUUlVFKSAmJgorICAgIGlmICgocE1nbXQtPmIxMWhFbmFibGUgPT0gdHJ1ZSkgJiYKICAgICAgICAgKHBNZ210LT5lQ3VycmVudFBIWU1vZGUgPT0gUEhZX1RZUEVfMTFBKSkgewogICAgICAgICAvLyBDb3VudHJ5IElFCi0gICAgICAgIHBieUJ1ZmZlciA9IChQQllURSkoc0ZyYW1lLnBCdWYgKyBzRnJhbWUubGVuKTsKLSAgICAgICAgQ0FSRHZTZXRDb3VudHJ5SUUocE1nbXQtPnBBZGFwdGVyLCBwYnlCdWZmZXIpOwotICAgICAgICBDQVJEdlNldENvdW50cnlJbmZvKHBNZ210LT5wQWRhcHRlciwgUEhZX1RZUEVfMTFBLCBwYnlCdWZmZXIpOworICAgICAgICBwYnlCdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKShzRnJhbWUucEJ1ZiArIHNGcmFtZS5sZW4pOworICAgICAgICBzZXRfY291bnRyeV9JRShwTWdtdC0+cEFkYXB0ZXIsIHBieUJ1ZmZlcik7CisgICAgICAgIHNldF9jb3VudHJ5X2luZm8ocE1nbXQtPnBBZGFwdGVyLCBQSFlfVFlQRV8xMUEsIHBieUJ1ZmZlcik7CiAgICAgICAgIHVMZW5ndGggKz0gKChQV0xBTl9JRV9DT1VOVFJZKSBwYnlCdWZmZXIpLT5sZW4gKyBXTEFOX0lFSERSX0xFTjsKICAgICAgICAgcGJ5QnVmZmVyICs9ICgoKFBXTEFOX0lFX0NPVU5UUlkpIHBieUJ1ZmZlciktPmxlbiArIFdMQU5fSUVIRFJfTEVOKTsKICAgICAgICAgLy8gUG93ZXIgQ29uc3RyYWluIElFCkBAIC0zMzUzLDEyICszMzU0LDEyIEBACiAgICAgICAgICgoUFdMQU5fSUVfUFdfQ09OU1QpIHBieUJ1ZmZlciktPmJ5UG93ZXIgPSAwOwogICAgICAgICBwYnlCdWZmZXIgKz0gKDEpICsgV0xBTl9JRUhEUl9MRU47CiAgICAgICAgIHVMZW5ndGggKz0gKDEpICsgV0xBTl9JRUhEUl9MRU47Ci0gICAgICAgIGlmIChwTWdtdC0+YlN3aXRjaENoYW5uZWwgPT0gVFJVRSkgeworICAgICAgICBpZiAocE1nbXQtPmJTd2l0Y2hDaGFubmVsID09IHRydWUpIHsKICAgICAgICAgICAgIC8vIENoYW5uZWwgU3dpdGNoIElFCiAgICAgICAgICAgICAoKFBXTEFOX0lFX0NIX1NXKSBwYnlCdWZmZXIpLT5ieUVsZW1lbnRJRCA9IFdMQU5fRUlEX0NIX1NXSVRDSDsKICAgICAgICAgICAgICgoUFdMQU5fSUVfQ0hfU1cpIHBieUJ1ZmZlciktPmxlbiA9IDM7CiAgICAgICAgICAgICAoKFBXTEFOX0lFX0NIX1NXKSBwYnlCdWZmZXIpLT5ieU1vZGUgPSAxOwotICAgICAgICAgICAgKChQV0xBTl9JRV9DSF9TVykgcGJ5QnVmZmVyKS0+YnlDaGFubmVsID0gQ0FSRGJ5R2V0Q2hhbm5lbE51bWJlcihwTWdtdC0+cEFkYXB0ZXIsIHBNZ210LT5ieU5ld0NoYW5uZWwpOworICAgICAgICAgICAgKChQV0xBTl9JRV9DSF9TVykgcGJ5QnVmZmVyKS0+YnlDaGFubmVsID0gZ2V0X2NoYW5uZWxfbnVtYmVyKHBNZ210LT5wQWRhcHRlciwgcE1nbXQtPmJ5TmV3Q2hhbm5lbCk7CiAgICAgICAgICAgICAoKFBXTEFOX0lFX0NIX1NXKSBwYnlCdWZmZXIpLT5ieUNvdW50ID0gMDsKICAgICAgICAgICAgIHBieUJ1ZmZlciArPSAoMykgKyBXTEFOX0lFSERSX0xFTjsKICAgICAgICAgICAgIHVMZW5ndGggKz0gKDMpICsgV0xBTl9JRUhEUl9MRU47CkBAIC0zMzgyLDcgKzMzODMsNyBAQAogICAgICAgICAgICAgcGJ5QnVmZmVyICs9ICg3KSArIFdMQU5fSUVIRFJfTEVOOwogICAgICAgICAgICAgdUxlbmd0aCArPSAoNykgKyBXTEFOX0lFSERSX0xFTjsKICAgICAgICAgICAgIGZvcihpaT1DQl9NQVhfQ0hBTk5FTF8yNEcrMTsgaWk8PUNCX01BWF9DSEFOTkVMOyBpaSsrICkgewotICAgICAgICAgICAgICAgIGlmIChDQVJEYkdldENoYW5uZWxNYXBJbmZvKHBNZ210LT5wQWRhcHRlciwgaWksIHBieUJ1ZmZlciwgcGJ5QnVmZmVyKzEpID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2NoYW5uZWxfbWFwX2luZm8ocE1nbXQtPnBBZGFwdGVyLCBpaSwgcGJ5QnVmZmVyLCBwYnlCdWZmZXIrMSkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICBwYnlCdWZmZXIgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgdUxlbmd0aCArPSAyOwogICAgICAgICAgICAgICAgICAgICBwSUJTU0RGUy0+bGVuICs9IDI7CkBAIC0zMzk4LDExICszMzk5LDExIEBACiAgICAgICAgIHNGcmFtZS5wRVJQLT5ieUVsZW1lbnRJRCA9IFdMQU5fRUlEX0VSUDsKICAgICAgICAgc0ZyYW1lLnBFUlAtPmxlbiA9IDE7CiAgICAgICAgIHNGcmFtZS5wRVJQLT5ieUNvbnRleHQgPSAwOwotICAgICAgICBpZiAocERldmljZS0+YlByb3RlY3RNb2RlID09IFRSVUUpCisgICAgICAgIGlmIChwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPT0gdHJ1ZSkKICAgICAgICAgICAgIHNGcmFtZS5wRVJQLT5ieUNvbnRleHQgfD0gV0xBTl9FSURfRVJQX1VTRV9QUk9URUNUSU9OOwotICAgICAgICBpZiAocERldmljZS0+Yk5vbkVSUFByZXNlbnQgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJOb25FUlBQcmVzZW50ID09IHRydWUpCiAgICAgICAgICAgICBzRnJhbWUucEVSUC0+YnlDb250ZXh0IHw9IFdMQU5fRUlEX0VSUF9OT05FUlBfUFJFU0VOVDsKLSAgICAgICAgaWYgKHBEZXZpY2UtPmJCYXJrZXJQcmVhbWJsZU1kID09IFRSVUUpCisgICAgICAgIGlmIChwRGV2aWNlLT5iQmFya2VyUHJlYW1ibGVNZCA9PSB0cnVlKQogICAgICAgICAgICAgc0ZyYW1lLnBFUlAtPmJ5Q29udGV4dCB8PSBXTEFOX0VJRF9FUlBfQkFSS0VSX01PREU7CiAgICAgfQogICAgIGlmICgoKFBXTEFOX0lFX1NVUFBfUkFURVMpcEN1cnJFeHRTdXBwUmF0ZXMpLT5sZW4gIT0gMCkgewpAQCAtMzQxNCw3ICszNDE1LDcgQEAKICAgICAgICAgICAgICApOwogICAgIH0KICAgICAvLyBob3N0YXBkIHdwYS93cGEyIElFCi0gICAgaWYgKChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApICYmIChwRGV2aWNlLT5iRW5hYmxlSG9zdGFwZCA9PSBUUlVFKSkgeworICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSAmJiAocERldmljZS0+YkVuYWJsZUhvc3RhcGQgPT0gdHJ1ZSkpIHsKICAgICAgICAgIGlmIChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQU5PTkUpIHsKICAgICAgICAgICAgICBpZiAocE1nbXQtPndXUEFJRUxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgIHNGcmFtZS5wUlNOID0gKFBXTEFOX0lFX1JTTikoc0ZyYW1lLnBCdWYgKyBzRnJhbWUubGVuKTsKQEAgLTM0NTMsMzEgKzM0NTQsMzEgQEAKIHNfTWdyTWFrZVByb2JlUmVzcG9uc2UoCiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBQU01nbXRPYmplY3QgcE1nbXQsCi0gICAgV09SRCB3Q3VyckNhcEluZm8sCi0gICAgV09SRCB3Q3VyckJlYWNvblBlcmlvZCwKLSAgICBVSU5UIHVDdXJyQ2hhbm5lbCwKLSAgICBXT1JEIHdDdXJyQVRJTVdpbm9kdywKLSAgICBQQllURSBwRHN0QWRkciwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckNhcEluZm8sCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJCZWFjb25QZXJpb2QsCisgICAgdW5zaWduZWQgaW50IHVDdXJyQ2hhbm5lbCwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckFUSU1XaW5vZHcsCisgICAgdW5zaWduZWQgY2hhciAqcERzdEFkZHIsCiAgICAgUFdMQU5fSUVfU1NJRCBwQ3VyclNTSUQsCi0gICAgUEJZVEUgcEN1cnJCU1NJRCwKKyAgICB1bnNpZ25lZCBjaGFyICpwQ3VyckJTU0lELAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcywKLSAgICBCWVRFIGJ5UEhZVHlwZQorICAgIHVuc2lnbmVkIGNoYXIgYnlQSFlUeXBlCiAgICAgKQogewogICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0ID0gTlVMTDsKICAgICBXTEFOX0ZSX1BST0JFUkVTUCAgIHNGcmFtZTsKLSAgICBQQllURSAgICAgICAgICAgICAgIHBieUJ1ZmZlcjsKLSAgICBVSU5UICAgICAgICAgICAgICAgIHVMZW5ndGggPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgdUxlbmd0aCA9IDA7CiAgICAgUFdMQU5fSUVfSUJTU19ERlMgICBwSUJTU0RGUyA9IE5VTEw7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICBpaTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAKIAogICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9QUk9CRVJFU1BfRlJfTUFYTEVOKTsKLSAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwogICAgIC8vIFNldHVwIHRoZSBzRnJhbWUgc3RydWN0dXJlLgotICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICBzRnJhbWUubGVuID0gV0xBTl9QUk9CRVJFU1BfRlJfTUFYTEVOOwogICAgIHZNZ3JFbmNvZGVQcm9iZVJlc3BvbnNlKCZzRnJhbWUpOwogICAgIC8vIFNldHVwIHRoZSBoZWFkZXIKQEAgLTM0OTMsNyArMzQ5NCw3IEBACiAgICAgKnNGcmFtZS5wd0NhcEluZm8gPSBjcHVfdG9fbGUxNih3Q3VyckNhcEluZm8pOwogCiAgICAgaWYgKGJ5UEhZVHlwZSA9PSBCQl9UWVBFXzExQikgewotICAgICAgICAqc0ZyYW1lLnB3Q2FwSW5mbyAmPSBjcHVfdG9fbGUxNigoV09SRCl+KFdMQU5fU0VUX0NBUF9JTkZPX1NIT1JUU0xPVFRJTUUoMSkpKTsKKyAgICAgICAgKnNGcmFtZS5wd0NhcEluZm8gJj0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIHNob3J0KX4oV0xBTl9TRVRfQ0FQX0lORk9fU0hPUlRTTE9UVElNRSgxKSkpOwogICAgIH0KIAogICAgIC8vIENvcHkgU1NJRApAQCAtMzUxOCw3ICszNTE5LDcgQEAKICAgICAgICAgc0ZyYW1lLmxlbiArPSAoMSkgKyBXTEFOX0lFSERSX0xFTjsKICAgICAgICAgc0ZyYW1lLnBEU1Bhcm1zLT5ieUVsZW1lbnRJRCA9IFdMQU5fRUlEX0RTX1BBUk1TOwogICAgICAgICBzRnJhbWUucERTUGFybXMtPmxlbiA9IDE7Ci0gICAgICAgIHNGcmFtZS5wRFNQYXJtcy0+YnlDdXJyQ2hhbm5lbCA9IChCWVRFKXVDdXJyQ2hhbm5lbDsKKyAgICAgICAgc0ZyYW1lLnBEU1Bhcm1zLT5ieUN1cnJDaGFubmVsID0gKHVuc2lnbmVkIGNoYXIpdUN1cnJDaGFubmVsOwogICAgIH0KIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlICE9IFdNQUNfTU9ERV9FU1NfQVApIHsKQEAgLTM1MzUsMjAgKzM1MzYsMjAgQEAKICAgICAgICAgc0ZyYW1lLnBFUlAtPmJ5RWxlbWVudElEID0gV0xBTl9FSURfRVJQOwogICAgICAgICBzRnJhbWUucEVSUC0+bGVuID0gMTsKICAgICAgICAgc0ZyYW1lLnBFUlAtPmJ5Q29udGV4dCA9IDA7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iUHJvdGVjdE1vZGUgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJQcm90ZWN0TW9kZSA9PSB0cnVlKQogICAgICAgICAgICAgc0ZyYW1lLnBFUlAtPmJ5Q29udGV4dCB8PSBXTEFOX0VJRF9FUlBfVVNFX1BST1RFQ1RJT047Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iTm9uRVJQUHJlc2VudCA9PSBUUlVFKQorICAgICAgICBpZiAocERldmljZS0+Yk5vbkVSUFByZXNlbnQgPT0gdHJ1ZSkKICAgICAgICAgICAgIHNGcmFtZS5wRVJQLT5ieUNvbnRleHQgfD0gV0xBTl9FSURfRVJQX05PTkVSUF9QUkVTRU5UOwotICAgICAgICBpZiAocERldmljZS0+YkJhcmtlclByZWFtYmxlTWQgPT0gVFJVRSkKKyAgICAgICAgaWYgKHBEZXZpY2UtPmJCYXJrZXJQcmVhbWJsZU1kID09IHRydWUpCiAgICAgICAgICAgICBzRnJhbWUucEVSUC0+YnlDb250ZXh0IHw9IFdMQU5fRUlEX0VSUF9CQVJLRVJfTU9ERTsKICAgICB9CiAKLSAgICBpZiAoKHBNZ210LT5iMTFoRW5hYmxlID09IFRSVUUpICYmCisgICAgaWYgKChwTWdtdC0+YjExaEVuYWJsZSA9PSB0cnVlKSAmJgogICAgICAgICAocE1nbXQtPmVDdXJyZW50UEhZTW9kZSA9PSBQSFlfVFlQRV8xMUEpKSB7CiAgICAgICAgIC8vIENvdW50cnkgSUUKLSAgICAgICAgcGJ5QnVmZmVyID0gKFBCWVRFKShzRnJhbWUucEJ1ZiArIHNGcmFtZS5sZW4pOwotICAgICAgICBDQVJEdlNldENvdW50cnlJRShwTWdtdC0+cEFkYXB0ZXIsIHBieUJ1ZmZlcik7Ci0gICAgICAgIENBUkR2U2V0Q291bnRyeUluZm8ocE1nbXQtPnBBZGFwdGVyLCBQSFlfVFlQRV8xMUEsIHBieUJ1ZmZlcik7CisgICAgICAgIHBieUJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbik7CisgICAgICAgIHNldF9jb3VudHJ5X0lFKHBNZ210LT5wQWRhcHRlciwgcGJ5QnVmZmVyKTsKKyAgICAgICAgc2V0X2NvdW50cnlfaW5mbyhwTWdtdC0+cEFkYXB0ZXIsIFBIWV9UWVBFXzExQSwgcGJ5QnVmZmVyKTsKICAgICAgICAgdUxlbmd0aCArPSAoKFBXTEFOX0lFX0NPVU5UUlkpIHBieUJ1ZmZlciktPmxlbiArIFdMQU5fSUVIRFJfTEVOOwogICAgICAgICBwYnlCdWZmZXIgKz0gKCgoUFdMQU5fSUVfQ09VTlRSWSkgcGJ5QnVmZmVyKS0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwogICAgICAgICAvLyBQb3dlciBDb25zdHJhaW4gSUUKQEAgLTM1NTcsMTIgKzM1NTgsMTIgQEAKICAgICAgICAgKChQV0xBTl9JRV9QV19DT05TVCkgcGJ5QnVmZmVyKS0+YnlQb3dlciA9IDA7CiAgICAgICAgIHBieUJ1ZmZlciArPSAoMSkgKyBXTEFOX0lFSERSX0xFTjsKICAgICAgICAgdUxlbmd0aCArPSAoMSkgKyBXTEFOX0lFSERSX0xFTjsKLSAgICAgICAgaWYgKHBNZ210LT5iU3dpdGNoQ2hhbm5lbCA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwTWdtdC0+YlN3aXRjaENoYW5uZWwgPT0gdHJ1ZSkgewogICAgICAgICAgICAgLy8gQ2hhbm5lbCBTd2l0Y2ggSUUKICAgICAgICAgICAgICgoUFdMQU5fSUVfQ0hfU1cpIHBieUJ1ZmZlciktPmJ5RWxlbWVudElEID0gV0xBTl9FSURfQ0hfU1dJVENIOwogICAgICAgICAgICAgKChQV0xBTl9JRV9DSF9TVykgcGJ5QnVmZmVyKS0+bGVuID0gMzsKICAgICAgICAgICAgICgoUFdMQU5fSUVfQ0hfU1cpIHBieUJ1ZmZlciktPmJ5TW9kZSA9IDE7Ci0gICAgICAgICAgICAoKFBXTEFOX0lFX0NIX1NXKSBwYnlCdWZmZXIpLT5ieUNoYW5uZWwgPSBDQVJEYnlHZXRDaGFubmVsTnVtYmVyKHBNZ210LT5wQWRhcHRlciwgcE1nbXQtPmJ5TmV3Q2hhbm5lbCk7CisgICAgICAgICAgICAoKFBXTEFOX0lFX0NIX1NXKSBwYnlCdWZmZXIpLT5ieUNoYW5uZWwgPSBnZXRfY2hhbm5lbF9udW1iZXIocE1nbXQtPnBBZGFwdGVyLCBwTWdtdC0+YnlOZXdDaGFubmVsKTsKICAgICAgICAgICAgICgoUFdMQU5fSUVfQ0hfU1cpIHBieUJ1ZmZlciktPmJ5Q291bnQgPSAwOwogICAgICAgICAgICAgcGJ5QnVmZmVyICs9ICgzKSArIFdMQU5fSUVIRFJfTEVOOwogICAgICAgICAgICAgdUxlbmd0aCArPSAoMykgKyBXTEFOX0lFSERSX0xFTjsKQEAgLTM1ODYsNyArMzU4Nyw3IEBACiAgICAgICAgICAgICBwYnlCdWZmZXIgKz0gKDcpICsgV0xBTl9JRUhEUl9MRU47CiAgICAgICAgICAgICB1TGVuZ3RoICs9ICg3KSArIFdMQU5fSUVIRFJfTEVOOwogICAgICAgICAgICAgZm9yKGlpPUNCX01BWF9DSEFOTkVMXzI0RysxOyBpaTw9Q0JfTUFYX0NIQU5ORUw7IGlpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENBUkRiR2V0Q2hhbm5lbE1hcEluZm8ocE1nbXQtPnBBZGFwdGVyLCBpaSwgcGJ5QnVmZmVyLCBwYnlCdWZmZXIrMSkgPT0gVFJVRSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRfY2hhbm5lbF9tYXBfaW5mbyhwTWdtdC0+cEFkYXB0ZXIsIGlpLCBwYnlCdWZmZXIsIHBieUJ1ZmZlcisxKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgIHBieUJ1ZmZlciArPSAyOwogICAgICAgICAgICAgICAgICAgICB1TGVuZ3RoICs9IDI7CiAgICAgICAgICAgICAgICAgICAgIHBJQlNTREZTLT5sZW4gKz0gMjsKQEAgLTM2MDcsNyArMzYwOCw3IEBACiAgICAgfQogCiAgICAgLy8gaG9zdGFwZCB3cGEvd3BhMiBJRQotICAgIGlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSAmJiAocERldmljZS0+YkVuYWJsZUhvc3RhcGQgPT0gVFJVRSkpIHsKKyAgICBpZiAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgJiYgKHBEZXZpY2UtPmJFbmFibGVIb3N0YXBkID09IHRydWUpKSB7CiAgICAgICAgICBpZiAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFOT05FKSB7CiAgICAgICAgICAgICAgaWYgKHBNZ210LT53V1BBSUVMZW4gIT0gMCkgewogICAgICAgICAgICAgICAgICBzRnJhbWUucFJTTiA9IChQV0xBTl9JRV9SU04pKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbik7CkBAIC0zNjQyLDkgKzM2NDMsOSBAQAogc19NZ3JNYWtlQXNzb2NSZXF1ZXN0KAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAotICAgIFBCWVRFIHBEQWRkciwKLSAgICBXT1JEIHdDdXJyQ2FwSW5mbywKLSAgICBXT1JEIHdMaXN0ZW5JbnRlcnZhbCwKKyAgICB1bnNpZ25lZCBjaGFyICpwREFkZHIsCisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJDYXBJbmZvLAorICAgIHVuc2lnbmVkIHNob3J0IHdMaXN0ZW5JbnRlcnZhbCwKICAgICBQV0xBTl9JRV9TU0lEIHBDdXJyU1NJRCwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcwpAQCAtMzY1MiwxNSArMzY1MywxNSBAQAogewogICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0ID0gTlVMTDsKICAgICBXTEFOX0ZSX0FTU09DUkVRICAgIHNGcmFtZTsKLSAgICBQQllURSAgICAgICAgICAgICAgIHBieUlFczsKLSAgICBQQllURSAgICAgICAgICAgICAgIHBieVJTTjsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlJRXM7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5UlNOOwogCiAKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieU1nbXRQYWNrZXRQb29sOwogICAgIG1lbXNldChwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQVNTT0NSRVFfRlJfTUFYTEVOKTsKLSAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwogICAgIC8vIFNldHVwIHRoZSBzRnJhbWUgc3RydWN0dXJlLgotICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICBzRnJhbWUubGVuID0gV0xBTl9BU1NPQ1JFUV9GUl9NQVhMRU47CiAgICAgLy8gZm9ybWF0IGZpeGVkIGZpZWxkIGZyYW1lIHN0cnVjdHVyZQogICAgIHZNZ3JFbmNvZGVBc3NvY1JlcXVlc3QoJnNGcmFtZSk7CkBAIC0zNzA5LDcgKzM3MTAsNyBAQAogICAgIHBieUlFcyArPSBwQ3VyclJhdGVzLT5sZW4gKyBXTEFOX0lFSERSX0xFTjsKIAogICAgIC8vIGZvciA4MDIuMTFoCi0gICAgaWYgKHBNZ210LT5iMTFoRW5hYmxlID09IFRSVUUpIHsKKyAgICBpZiAocE1nbXQtPmIxMWhFbmFibGUgPT0gdHJ1ZSkgewogICAgICAgICBpZiAoc0ZyYW1lLnBDdXJyUG93ZXJDYXAgPT0gTlVMTCkgewogICAgICAgICAgICAgc0ZyYW1lLnBDdXJyUG93ZXJDYXAgPSAoUFdMQU5fSUVfUFdfQ0FQKShzRnJhbWUucEJ1ZiArIHNGcmFtZS5sZW4pOwogICAgICAgICAgICAgc0ZyYW1lLmxlbiArPSAoMiArIFdMQU5fSUVIRFJfTEVOKTsKQEAgLTM3MjIsNyArMzcyMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHNGcmFtZS5wQ3VyclN1cHBDaCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBzRnJhbWUucEN1cnJTdXBwQ2ggPSAoUFdMQU5fSUVfU1VQUF9DSCkoc0ZyYW1lLnBCdWYgKyBzRnJhbWUubGVuKTsKLSAgICAgICAgICAgIHNGcmFtZS5sZW4gKz0gQ0FSRGJ5U2V0U3VwcG9ydENoYW5uZWxzKHBNZ210LT5wQWRhcHRlciwoUEJZVEUpc0ZyYW1lLnBDdXJyU3VwcENoKTsKKyAgICAgICAgICAgIHNGcmFtZS5sZW4gKz0gc2V0X3N1cHBvcnRfY2hhbm5lbHMocE1nbXQtPnBBZGFwdGVyLCh1bnNpZ25lZCBjaGFyICopc0ZyYW1lLnBDdXJyU3VwcENoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc2NSw3ICszNzY2LDcgQEAKICAgICAgICAgICAgIHNGcmFtZS5wUlNOV1BBLT5QS1NMaXN0WzBdLmFieU9VSVszXSA9IFdQQV9OT05FOwogICAgICAgICB9CiAgICAgICAgIC8vIEF1dGggS2V5IE1hbmFnZW1lbnQgU3VpdGUKLSAgICAgICAgcGJ5UlNOID0gKFBCWVRFKShzRnJhbWUucEJ1ZiArIHNGcmFtZS5sZW4gKyAyICsgc0ZyYW1lLnBSU05XUEEtPmxlbik7CisgICAgICAgIHBieVJTTiA9ICh1bnNpZ25lZCBjaGFyICopKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbiArIDIgKyBzRnJhbWUucFJTTldQQS0+bGVuKTsKICAgICAgICAgKnBieVJTTisrPTB4MDE7CiAgICAgICAgICpwYnlSU04rKz0weDAwOwogICAgICAgICAqcGJ5UlNOKys9MHgwMDsKQEAgLTM3OTksOCArMzgwMCw4IEBACiAgICAgfSBlbHNlIGlmICgoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikgfHwKICAgICAgICAgICAgICAgICAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEEyUFNLKSkgJiYKICAgICAgICAgICAgICAgIChwTWdtdC0+cEN1cnJCU1MgIT0gTlVMTCkpIHsKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBpaTsKLSAgICAgICAgUFdPUkQgICAgICAgICAgICAgICBwd1BNS0lEOworICAgICAgICB1bnNpZ25lZCBpbnQgaWk7CisgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwd1BNS0lEOwogCiAgICAgICAgIC8vIFdQQSBJRQogICAgICAgICBzRnJhbWUucFJTTiA9IChQV0xBTl9JRV9SU04pKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbik7CkBAIC0zODU0LDcgKzM4NTUsNyBAQAogICAgICAgICBzRnJhbWUucFJTTi0+bGVuICs9NjsKIAogICAgICAgICAvLyBSU04gQ2FwYWJpbGl0ZXMKLSAgICAgICAgaWYgKHBNZ210LT5wQ3VyckJTUy0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPT0gVFJVRSkgeworICAgICAgICBpZiAocE1nbXQtPnBDdXJyQlNTLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9PSB0cnVlKSB7CiAgICAgICAgICAgICBtZW1jcHkoJnNGcmFtZS5wUlNOLT5hYnlSU05bMTZdLCAmcE1nbXQtPnBDdXJyQlNTLT5zUlNOQ2FwT2JqLndSU05DYXAsIDIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc0ZyYW1lLnBSU04tPmFieVJTTlsxNl0gPSAwOwpAQCAtMzg2MiwxMCArMzg2MywxMCBAQAogICAgICAgICB9CiAgICAgICAgIHNGcmFtZS5wUlNOLT5sZW4gKz0yOwogCi0gICAgICAgIGlmICgocERldmljZS0+Z3NQTUtJRC5CU1NJREluZm9Db3VudCA+IDApICYmIChwRGV2aWNlLT5iUm9hbWluZyA9PSBUUlVFKSAmJiAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEEyKSkgeworICAgICAgICBpZiAoKHBEZXZpY2UtPmdzUE1LSUQuQlNTSURJbmZvQ291bnQgPiAwKSAmJiAocERldmljZS0+YlJvYW1pbmcgPT0gdHJ1ZSkgJiYgKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikpIHsKICAgICAgICAgICAgIC8vIFJTTiBQTUtJRAogICAgICAgICAgICAgcGJ5UlNOID0gJnNGcmFtZS5wUlNOLT5hYnlSU05bMThdOwotICAgICAgICAgICAgcHdQTUtJRCA9IChQV09SRClwYnlSU047IC8vIFBvaW50IHRvIFBNS0lEIGNvdW50CisgICAgICAgICAgICBwd1BNS0lEID0gKHVuc2lnbmVkIHNob3J0ICopcGJ5UlNOOyAvLyBQb2ludCB0byBQTUtJRCBjb3VudAogICAgICAgICAgICAgKnB3UE1LSUQgPSAwOyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgUE1LSUQgY291bnQKICAgICAgICAgICAgIHBieVJTTiArPSAyOyAgICAgICAgICAgICAvLyBQb2ludCB0byBQTUtJRCBsaXN0CiAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5nc1BNS0lELkJTU0lESW5mb0NvdW50OyBpaSsrKSB7CkBAIC0zOTE3LDkgKzM5MTgsOSBAQAogc19NZ3JNYWtlUmVBc3NvY1JlcXVlc3QoCiAgICAgUFNEZXZpY2UgcERldmljZSwKICAgICBQU01nbXRPYmplY3QgcE1nbXQsCi0gICAgUEJZVEUgcERBZGRyLAotICAgIFdPUkQgd0N1cnJDYXBJbmZvLAotICAgIFdPUkQgd0xpc3RlbkludGVydmFsLAorICAgIHVuc2lnbmVkIGNoYXIgKnBEQWRkciwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckNhcEluZm8sCisgICAgdW5zaWduZWQgc2hvcnQgd0xpc3RlbkludGVydmFsLAogICAgIFBXTEFOX0lFX1NTSUQgcEN1cnJTU0lELAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJSYXRlcywKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyRXh0U3VwcFJhdGVzCkBAIC0zOTI3LDE1ICszOTI4LDE1IEBACiB7CiAgICAgUFNUeE1nbXRQYWNrZXQgICAgICBwVHhQYWNrZXQgPSBOVUxMOwogICAgIFdMQU5fRlJfUkVBU1NPQ1JFUSAgc0ZyYW1lOwotICAgIFBCWVRFICAgICAgICAgICAgICAgcGJ5SUVzOwotICAgIFBCWVRFICAgICAgICAgICAgICAgcGJ5UlNOOworICAgIHVuc2lnbmVkIGNoYXIgKnBieUlFczsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlSU047CiAKIAogICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7CiAgICAgbWVtc2V0KCBwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fUkVBU1NPQ1JFUV9GUl9NQVhMRU4pOwotICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKFBCWVRFKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CisgICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CiAgICAgLyogU2V0dXAgdGhlIHNGcmFtZSBzdHJ1Y3R1cmUuICovCi0gICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgIHNGcmFtZS5sZW4gPSBXTEFOX1JFQVNTT0NSRVFfRlJfTUFYTEVOOwogCiAgICAgLy8gZm9ybWF0IGZpeGVkIGZpZWxkIGZyYW1lIHN0cnVjdHVyZQpAQCAtNDAyNCw3ICs0MDI1LDcgQEAKICAgICAgICAgICAgIHNGcmFtZS5wUlNOV1BBLT5QS1NMaXN0WzBdLmFieU9VSVszXSA9IFdQQV9OT05FOwogICAgICAgICB9CiAgICAgICAgIC8vIEF1dGggS2V5IE1hbmFnZW1lbnQgU3VpdGUKLSAgICAgICAgcGJ5UlNOID0gKFBCWVRFKShzRnJhbWUucEJ1ZiArIHNGcmFtZS5sZW4gKyAyICsgc0ZyYW1lLnBSU05XUEEtPmxlbik7CisgICAgICAgIHBieVJTTiA9ICh1bnNpZ25lZCBjaGFyICopKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbiArIDIgKyBzRnJhbWUucFJTTldQQS0+bGVuKTsKICAgICAgICAgKnBieVJTTisrPTB4MDE7CiAgICAgICAgICpwYnlSU04rKz0weDAwOwogICAgICAgICAqcGJ5UlNOKys9MHgwMDsKQEAgLTQwNTUsOCArNDA1Niw4IEBACiAgICAgfSBlbHNlIGlmICgoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikgfHwKICAgICAgICAgICAgICAgICAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEEyUFNLKSkgJiYKICAgICAgICAgICAgICAgIChwTWdtdC0+cEN1cnJCU1MgIT0gTlVMTCkpIHsKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBpaTsKLSAgICAgICAgUFdPUkQgICAgICAgICAgICAgICBwd1BNS0lEOworICAgICAgICB1bnNpZ25lZCBpbnQgaWk7CisgICAgICAgIHVuc2lnbmVkIHNob3J0ICpwd1BNS0lEOwogCiAgICAgICAgIC8qIFdQQSBJRSAqLwogICAgICAgICBzRnJhbWUucFJTTiA9IChQV0xBTl9JRV9SU04pKHNGcmFtZS5wQnVmICsgc0ZyYW1lLmxlbik7CkBAIC00MTEwLDcgKzQxMTEsNyBAQAogICAgICAgICBzRnJhbWUucFJTTi0+bGVuICs9NjsKIAogICAgICAgICAvLyBSU04gQ2FwYWJpbGl0ZXMKLSAgICAgICAgaWYgKHBNZ210LT5wQ3VyckJTUy0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPT0gVFJVRSkgeworICAgICAgICBpZiAocE1nbXQtPnBDdXJyQlNTLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9PSB0cnVlKSB7CiAgICAgICAgICAgICBtZW1jcHkoJnNGcmFtZS5wUlNOLT5hYnlSU05bMTZdLCAmcE1nbXQtPnBDdXJyQlNTLT5zUlNOQ2FwT2JqLndSU05DYXAsIDIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc0ZyYW1lLnBSU04tPmFieVJTTlsxNl0gPSAwOwpAQCAtNDExOCwxMCArNDExOSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIHNGcmFtZS5wUlNOLT5sZW4gKz0yOwogCi0gICAgICAgIGlmICgocERldmljZS0+Z3NQTUtJRC5CU1NJREluZm9Db3VudCA+IDApICYmIChwRGV2aWNlLT5iUm9hbWluZyA9PSBUUlVFKSAmJiAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEEyKSkgeworICAgICAgICBpZiAoKHBEZXZpY2UtPmdzUE1LSUQuQlNTSURJbmZvQ291bnQgPiAwKSAmJiAocERldmljZS0+YlJvYW1pbmcgPT0gdHJ1ZSkgJiYgKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikpIHsKICAgICAgICAgICAgIC8vIFJTTiBQTUtJRAogICAgICAgICAgICAgcGJ5UlNOID0gJnNGcmFtZS5wUlNOLT5hYnlSU05bMThdOwotICAgICAgICAgICAgcHdQTUtJRCA9IChQV09SRClwYnlSU047IC8vIFBvaW50IHRvIFBNS0lEIGNvdW50CisgICAgICAgICAgICBwd1BNS0lEID0gKHVuc2lnbmVkIHNob3J0ICopcGJ5UlNOOyAvLyBQb2ludCB0byBQTUtJRCBjb3VudAogICAgICAgICAgICAgKnB3UE1LSUQgPSAwOyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgUE1LSUQgY291bnQKICAgICAgICAgICAgIHBieVJTTiArPSAyOyAgICAgICAgICAgICAvLyBQb2ludCB0byBQTUtJRCBsaXN0CiAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5nc1BNS0lELkJTU0lESW5mb0NvdW50OyBpaSsrKSB7CkBAIC00MTY5LDEwICs0MTcwLDEwIEBACiBzX01nck1ha2VBc3NvY1Jlc3BvbnNlKAogICAgIFBTRGV2aWNlIHBEZXZpY2UsCiAgICAgUFNNZ210T2JqZWN0IHBNZ210LAotICAgIFdPUkQgd0N1cnJDYXBJbmZvLAotICAgIFdPUkQgd0Fzc29jU3RhdHVzLAotICAgIFdPUkQgd0Fzc29jQUlELAotICAgIFBCWVRFIHBEc3RBZGRyLAorICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbywKKyAgICB1bnNpZ25lZCBzaG9ydCB3QXNzb2NTdGF0dXMsCisgICAgdW5zaWduZWQgc2hvcnQgd0Fzc29jQUlELAorICAgIHVuc2lnbmVkIGNoYXIgKnBEc3RBZGRyLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJTdXBwUmF0ZXMsCiAgICAgUFdMQU5fSUVfU1VQUF9SQVRFUyBwQ3VyckV4dFN1cHBSYXRlcwogICAgICkKQEAgLTQxODMsOSArNDE4NCw5IEBACiAKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieU1nbXRQYWNrZXRQb29sOwogICAgIG1lbXNldChwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQVNTT0NSRVFfRlJfTUFYTEVOKTsKLSAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOworICAgIHBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwogICAgIC8vIFNldHVwIHRoZSBzRnJhbWUgc3RydWN0dXJlCi0gICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFR4UGFja2V0LT5wODAyMTFIZWFkZXI7CisgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgIHNGcmFtZS5sZW4gPSBXTEFOX1JFQVNTT0NSRVNQX0ZSX01BWExFTjsKICAgICB2TWdyRW5jb2RlQXNzb2NSZXNwb25zZSgmc0ZyYW1lKTsKICAgICAvLyBTZXR1cCB0aGUgaGVhZGVyCkBAIC00MjAwLDcgKzQyMDEsNyBAQAogCiAgICAgKnNGcmFtZS5wd0NhcEluZm8gPSBjcHVfdG9fbGUxNih3Q3VyckNhcEluZm8pOwogICAgICpzRnJhbWUucHdTdGF0dXMgPSBjcHVfdG9fbGUxNih3QXNzb2NTdGF0dXMpOwotICAgICpzRnJhbWUucHdBaWQgPSBjcHVfdG9fbGUxNigoV09SRCkod0Fzc29jQUlEIHwgQklUMTQgfCBCSVQxNSkpOworICAgICpzRnJhbWUucHdBaWQgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpKHdBc3NvY0FJRCB8IEJJVDE0IHwgQklUMTUpKTsKIAogICAgIC8vIENvcHkgdGhlIHJhdGUgc2V0CiAgICAgc0ZyYW1lLnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykoc0ZyYW1lLnBCdWYgKyBzRnJhbWUubGVuKTsKQEAgLTQyNDMsMTAgKzQyNDQsMTAgQEAKIHNfTWdyTWFrZVJlQXNzb2NSZXNwb25zZSgKICAgICBQU0RldmljZSBwRGV2aWNlLAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBXT1JEIHdDdXJyQ2FwSW5mbywKLSAgICBXT1JEIHdBc3NvY1N0YXR1cywKLSAgICBXT1JEIHdBc3NvY0FJRCwKLSAgICBQQllURSBwRHN0QWRkciwKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckNhcEluZm8sCisgICAgdW5zaWduZWQgc2hvcnQgd0Fzc29jU3RhdHVzLAorICAgIHVuc2lnbmVkIHNob3J0IHdBc3NvY0FJRCwKKyAgICB1bnNpZ25lZCBjaGFyICpwRHN0QWRkciwKICAgICBQV0xBTl9JRV9TVVBQX1JBVEVTIHBDdXJyU3VwcFJhdGVzLAogICAgIFBXTEFOX0lFX1NVUFBfUkFURVMgcEN1cnJFeHRTdXBwUmF0ZXMKICAgICApCkBAIC00MjU3LDkgKzQyNTgsOSBAQAogCiAgICAgcFR4UGFja2V0ID0gKFBTVHhNZ210UGFja2V0KXBNZ210LT5wYnlNZ210UGFja2V0UG9vbDsKICAgICBtZW1zZXQocFR4UGFja2V0LCAwLCBzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX0FTU09DUkVRX0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgoUEJZVEUpcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKyAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKICAgICAvLyBTZXR1cCB0aGUgc0ZyYW1lIHN0cnVjdHVyZQotICAgIHNGcmFtZS5wQnVmID0gKFBCWVRFKXBUeFBhY2tldC0+cDgwMjExSGVhZGVyOworICAgIHNGcmFtZS5wQnVmID0gKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKICAgICBzRnJhbWUubGVuID0gV0xBTl9SRUFTU09DUkVTUF9GUl9NQVhMRU47CiAgICAgdk1nckVuY29kZVJlYXNzb2NSZXNwb25zZSgmc0ZyYW1lKTsKICAgICAvLyBTZXR1cCB0aGUgaGVhZGVyCkBAIC00Mjc0LDcgKzQyNzUsNyBAQAogCiAgICAgKnNGcmFtZS5wd0NhcEluZm8gPSBjcHVfdG9fbGUxNih3Q3VyckNhcEluZm8pOwogICAgICpzRnJhbWUucHdTdGF0dXMgPSBjcHVfdG9fbGUxNih3QXNzb2NTdGF0dXMpOwotICAgICpzRnJhbWUucHdBaWQgPSBjcHVfdG9fbGUxNigoV09SRCkod0Fzc29jQUlEIHwgQklUMTQgfCBCSVQxNSkpOworICAgICpzRnJhbWUucHdBaWQgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpKHdBc3NvY0FJRCB8IEJJVDE0IHwgQklUMTUpKTsKIAogICAgIC8vIENvcHkgdGhlIHJhdGUgc2V0CiAgICAgc0ZyYW1lLnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykoc0ZyYW1lLnBCdWYgKyBzRnJhbWUubGVuKTsKQEAgLTQzMjIsMTYgKzQzMjMsMTYgQEAKIHsKICAgICBQS25vd25CU1MgICAgICAgICAgIHBCU1NMaXN0ID0gTlVMTDsKICAgICBXTEFOX0ZSX1BST0JFUkVTUCAgIHNGcmFtZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5Q3VyckNoYW5uZWwgPSBwUnhQYWNrZXQtPmJ5UnhDaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgYnlDdXJyQ2hhbm5lbCA9IHBSeFBhY2tldC0+YnlSeENoYW5uZWw7CiAgICAgRVJQT2JqZWN0ICAgICAgICAgICBzRVJQOwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlJRUNoYW5uZWwgPSAwOwotICAgIEJPT0wgICAgICAgICAgICAgICAgYkNoYW5uZWxIaXQgPSBUUlVFOworICAgIHVuc2lnbmVkIGNoYXIgYnlJRUNoYW5uZWwgPSAwOworICAgIGJvb2wgYkNoYW5uZWxIaXQgPSB0cnVlOwogCiAKICAgICBtZW1zZXQoJnNGcmFtZSwgMCwgc2l6ZW9mKFdMQU5fRlJfUFJPQkVSRVNQKSk7CiAgICAgLy8gZGVjb2RlIHRoZSBmcmFtZQogICAgIHNGcmFtZS5sZW4gPSBwUnhQYWNrZXQtPmNiTVBEVUxlbjsKLSAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICBzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgdk1nckRlY29kZVByb2JlUmVzcG9uc2UoJnNGcmFtZSk7CiAKICAgICBpZiAoKHNGcmFtZS5wcXdUaW1lc3RhbXAgPT0gMCkgfHwKQEAgLTQzNTAsMjkgKzQzNTEsMjkgQEAKICAgICBpZiAoc0ZyYW1lLnBEU1Bhcm1zICE9IDApIHsKICAgICAgICAgaWYgKGJ5Q3VyckNoYW5uZWwgPiBDQl9NQVhfQ0hBTk5FTF8yNEcpIHsKICAgICAgICAgICAgIC8vIGNoYW5uZWwgcmVtYXBwaW5nIHRvCi0gICAgICAgICAgICBieUlFQ2hhbm5lbCA9IENBUkRieUdldENoYW5uZWxNYXBwaW5nKHBNZ210LT5wQWRhcHRlciwgc0ZyYW1lLnBEU1Bhcm1zLT5ieUN1cnJDaGFubmVsLCBQSFlfVFlQRV8xMUEpOworICAgICAgICAgICAgYnlJRUNoYW5uZWwgPSBnZXRfY2hhbm5lbF9tYXBwaW5nKHBNZ210LT5wQWRhcHRlciwgc0ZyYW1lLnBEU1Bhcm1zLT5ieUN1cnJDaGFubmVsLCBQSFlfVFlQRV8xMUEpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnlJRUNoYW5uZWwgPSBzRnJhbWUucERTUGFybXMtPmJ5Q3VyckNoYW5uZWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5Q3VyckNoYW5uZWwgIT0gYnlJRUNoYW5uZWwpIHsKICAgICAgICAgICAgIC8vIGFkanVzdCBjaGFubmVsIGluZm8uIGJjcyB3ZSByY3YgYWRqY2VudCBjaGFubmVsIHBha2NrZXRzCi0gICAgICAgICAgICBiQ2hhbm5lbEhpdCA9IEZBTFNFOworICAgICAgICAgICAgYkNoYW5uZWxIaXQgPSBmYWxzZTsKICAgICAgICAgICAgIGJ5Q3VyckNoYW5uZWwgPSBieUlFQ2hhbm5lbDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIG5vIERTIGNoYW5uZWwgaW5mbwotICAgICAgICBiQ2hhbm5lbEhpdCA9IFRSVUU7CisgICAgICAgIGJDaGFubmVsSGl0ID0gdHJ1ZTsKICAgICB9CiAKIC8vMjAwOC0wNzMwLTAxPEFkZD5ieSBNaWtlTGl1Ci1pZihDaGFubmVsRXhjZWVkWm9uZVR5cGUocERldmljZSxieUN1cnJDaGFubmVsKT09VFJVRSkKK2lmKENoYW5uZWxFeGNlZWRab25lVHlwZShwRGV2aWNlLGJ5Q3VyckNoYW5uZWwpPT10cnVlKQogICAgICAgcmV0dXJuOwogCiAgICAgaWYgKHNGcmFtZS5wRVJQICE9IE5VTEwpIHsKICAgICAgICAgc0VSUC5ieUVSUCA9IHNGcmFtZS5wRVJQLT5ieUNvbnRleHQ7Ci0gICAgICAgIHNFUlAuYkVSUEV4aXN0ID0gVFJVRTsKKyAgICAgICAgc0VSUC5iRVJQRXhpc3QgPSB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNFUlAuYkVSUEV4aXN0ID0gRkFMU0U7CisgICAgICAgIHNFUlAuYkVSUEV4aXN0ID0gZmFsc2U7CiAgICAgICAgIHNFUlAuYnlFUlAgPSAwOwogICAgIH0KIApAQCAtNDQ0OCw3ICs0NDQ5LDcgQEAKICAgICBXTEFOX0ZSX1BST0JFUkVRICAgIHNGcmFtZTsKICAgICBDTURfU1RBVFVTICAgICAgICAgIFN0YXR1czsKICAgICBQU1R4TWdtdFBhY2tldCAgICAgIHBUeFBhY2tldDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5UEhZVHlwZSA9IEJCX1RZUEVfMTFCOworICAgIHVuc2lnbmVkIGNoYXIgYnlQSFlUeXBlID0gQkJfVFlQRV8xMUI7CiAKICAgICAvLyBTVEEgaW4gQWQtaG9jIG1vZGU6IHdoZW4gbGF0ZXN0IFRCVFQgYmVhY29uIHRyYW5zbWl0IHN1Y2Nlc3MsCiAgICAgLy8gU1RBIGhhdmUgdG8gcmVzcG9uc2UgdGhpcyByZXF1ZXN0LgpAQCAtNDQ1OCw3ICs0NDU5LDcgQEAKICAgICAgICAgbWVtc2V0KCZzRnJhbWUsIDAsIHNpemVvZihXTEFOX0ZSX1BST0JFUkVRKSk7CiAgICAgICAgIC8vIGRlY29kZSB0aGUgZnJhbWUKICAgICAgICAgc0ZyYW1lLmxlbiA9IHBSeFBhY2tldC0+Y2JNUERVTGVuOwotICAgICAgICBzRnJhbWUucEJ1ZiA9IChQQllURSlwUnhQYWNrZXQtPnA4MDIxMUhlYWRlcjsKKyAgICAgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgICAgICB2TWdyRGVjb2RlUHJvYmVSZXF1ZXN0KCZzRnJhbWUpOwogLyoKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJvYmUgcmVxdWVzdCByeDpNQUMgYWRkcjolMDJ4LSUwMngtJTAyeD0lMDJ4LSUwMngtJTAyeCBcbiIsCkBAIC00NDk1LDcgKzQ0OTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy5hYnlBZGRyMiwKICAgICAgICAgICAgICAgICAgICAgICAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQsCi0gICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKXBNZ210LT5hYnlDdXJyQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwTWdtdC0+YWJ5Q3VyckJTU0lELAogICAgICAgICAgICAgICAgICAgICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBNZ210LT5hYnlDdXJyU3VwcFJhdGVzLAogICAgICAgICAgICAgICAgICAgICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBNZ210LT5hYnlDdXJyRXh0U3VwcFJhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICBieVBIWVR5cGUKQEAgLTQ1NDIsOCArNDU0Myw4IEBACiAgICAgICkKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwotICAgIEJPT0wgICAgICAgIGJJblNjYW4gPSBGQUxTRTsKLSAgICBVSU5UICAgICAgICB1Tm9kZUluZGV4ID0gMDsKKyAgICBib29sIGJJblNjYW4gPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBpbnQgdU5vZGVJbmRleCA9IDA7CiAgICAgTk9ERV9TVEFURSAgZU5vZGVTdGF0ZSA9IDA7CiAgICAgQ01EX1NUQVRVUyAgU3RhdHVzOwogCkBAIC00NTc3LDcgKzQ1NzgsNyBAQAogICAgICAgICBjYXNlIFdMQU5fRlNUWVBFX0FTU09DUkVTUDoKICAgICAgICAgICAgIC8vIEZyYW1lIENsYXNlID0gMgogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicnggYXNzb2NyZXNwMVxuIik7Ci0gICAgICAgICAgICBzX3ZNZ3JSeEFzc29jUmVzcG9uc2UocERldmljZSwgcE1nbXQsIHBSeFBhY2tldCwgRkFMU0UpOworICAgICAgICAgICAgc192TWdyUnhBc3NvY1Jlc3BvbnNlKHBEZXZpY2UsIHBNZ210LCBwUnhQYWNrZXQsIGZhbHNlKTsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInJ4IGFzc29jcmVzcDJcbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTQ2MDMsNyArNDYwNCw3IEBACiAgICAgICAgIGNhc2UgV0xBTl9GU1RZUEVfUkVBU1NPQ1JFU1A6CiAgICAgICAgICAgICAvLyBGcmFtZSBDbGFzZSA9IDIKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInJ4IHJlYXNzb2NyZXNwXG4iKTsKLSAgICAgICAgICAgIHNfdk1nclJ4QXNzb2NSZXNwb25zZShwRGV2aWNlLCBwTWdtdCwgcFJ4UGFja2V0LCBUUlVFKTsKKyAgICAgICAgICAgIHNfdk1nclJ4QXNzb2NSZXNwb25zZShwRGV2aWNlLCBwTWdtdCwgcFJ4UGFja2V0LCB0cnVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgV0xBTl9GU1RZUEVfUFJPQkVSRVE6CkBAIC00NjIzLDcgKzQ2MjQsNyBAQAogICAgICAgICAgICAgLy8gRnJhbWUgQ2xhc2UgPSAwCiAgICAgICAgICAgICAvL0RCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInJ4IGJlYWNvblxuIik7CiAgICAgICAgICAgICBpZiAocE1nbXQtPmVTY2FuU3RhdGUgIT0gV01BQ19OT19TQ0FOTklORykgewotICAgICAgICAgICAgICAgIGJJblNjYW4gPSBUUlVFOworICAgICAgICAgICAgICAgIGJJblNjYW4gPSB0cnVlOwogICAgICAgICAgICAgfTsKICAgICAgICAgICAgIHNfdk1nclJ4QmVhY29uKHBEZXZpY2UsIHBNZ210LCBwUnhQYWNrZXQsIGJJblNjYW4pOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NjgwLDEwICs0NjgxLDEwIEBACiAgKiAgUHJlcGFyZSBiZWFjb24gdG8gc2VuZAogICoKICAqIFJldHVybiBWYWx1ZToKLSAqICAgIFRSVUUgaWYgc3VjY2VzczsgRkFMU0UgaWYgZmFpbGVkLgorICogICAgdHJ1ZSBpZiBzdWNjZXNzOyBmYWxzZSBpZiBmYWlsZWQuCiAgKgogLSovCi1CT09MCitib29sCiBiTWdyUHJlcGFyZUJlYWNvblRvU2VuZCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKICAgICBQU01nbXRPYmplY3QgcE1nbXQKQEAgLTQ2OTIsNyArNDY5Myw3IEBACiAgICAgUFNEZXZpY2UgICAgICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwogICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0OwogCi0vLyAgICBwRGV2aWNlLT5iQmVhY29uQnVmUmVhZHkgPSBGQUxTRTsKKy8vICAgIHBEZXZpY2UtPmJCZWFjb25CdWZSZWFkeSA9IGZhbHNlOwogICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSB8fCBwRGV2aWNlLT5iRW5hYmxlODAyMXgpewogICAgICAgICBwTWdtdC0+d0N1cnJDYXBJbmZvIHw9IFdMQU5fU0VUX0NBUF9JTkZPX1BSSVZBQ1koMSk7CiAgICAgfQpAQCAtNDcwOCwxOCArNDcwOSwxOCBAQAogICAgICAgICAgICAgICAgICAgcE1nbXQtPnVDdXJyQ2hhbm5lbCwKICAgICAgICAgICAgICAgICAgIHBNZ210LT53Q3VyckFUSU1XaW5kb3csIC8vMCwKICAgICAgICAgICAgICAgICAgIChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlDdXJyU1NJRCwKLSAgICAgICAgICAgICAgICAgIChQQllURSlwTWdtdC0+YWJ5Q3VyckJTU0lELAorICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwTWdtdC0+YWJ5Q3VyckJTU0lELAogICAgICAgICAgICAgICAgICAgKFBXTEFOX0lFX1NVUFBfUkFURVMpcE1nbXQtPmFieUN1cnJTdXBwUmF0ZXMsCiAgICAgICAgICAgICAgICAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwTWdtdC0+YWJ5Q3VyckV4dFN1cHBSYXRlcwogICAgICAgICAgICAgICAgICk7CiAKICAgICBpZiAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0lCU1NfU1RBKSAmJgogICAgICAgICAocE1nbXQtPmFieUN1cnJCU1NJRFswXSA9PSAwKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBjc0JlYWNvbl94bWl0KHBEZXZpY2UsIHBUeFBhY2tldCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCkBAIC00NzQxLDcgKzQ3NDIsNyBAQAogdm9pZAogc192TWdyTG9nU3RhdHVzKAogICAgIFBTTWdtdE9iamVjdCBwTWdtdCwKLSAgICBXT1JEICB3U3RhdHVzCisgICAgdW5zaWduZWQgc2hvcnQgd1N0YXR1cwogICAgICkKIHsKICAgICBzd2l0Y2goIHdTdGF0dXMgKXsKQEAgLTQ4MDcsMjQgKzQ4MDgsMjQgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZS4KICAqCiAtKi8KLUJPT0wKK2Jvb2wKIGJBZGRfUE1LSURfQ2FuZGlkYXRlICgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBQQllURSAgICAgICAgICBwYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwKICAgICBQU1JTTkNhcE9iamVjdCBwc1JTTkNhcE9iagogICAgICkKIHsKICAgICBQU0RldmljZSAgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CiAgICAgUFBNS0lEX0NBTkRJREFURSBwQ2FuZGlkYXRlTGlzdDsKLSAgICBVSU5UICAgICAgICAgICAgIGlpID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgaWkgPSAwOwogCiAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJiQWRkX1BNS0lEX0NhbmRpZGF0ZSBTVEFSVDogKCVkKVxuIiwgKGludClwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLk51bUNhbmRpZGF0ZXMpOwogCiAgICAgaWYgKChwRGV2aWNlID09IE5VTEwpIHx8IChwYnlCU1NJRCA9PSBOVUxMKSB8fCAocHNSU05DYXBPYmogPT0gTlVMTCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHBEZXZpY2UtPmdzUE1LSURDYW5kaWRhdGUuTnVtQ2FuZGlkYXRlcyA+PSBNQVhfUE1LSURMSVNUKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogCiAKQEAgLTQ4MzIsMTggKzQ4MzMsMTggQEAKICAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLk51bUNhbmRpZGF0ZXM7IGlpKyspIHsKICAgICAgICAgcENhbmRpZGF0ZUxpc3QgPSAmcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5DYW5kaWRhdGVMaXN0W2lpXTsKICAgICAgICAgaWYgKCAhbWVtY21wKHBDYW5kaWRhdGVMaXN0LT5CU1NJRCwgcGJ5QlNTSUQsIEVUSF9BTEVOKSkgewotICAgICAgICAgICAgaWYgKChwc1JTTkNhcE9iai0+YlJTTkNhcEV4aXN0ID09IFRSVUUpICYmIChwc1JTTkNhcE9iai0+d1JTTkNhcCAmIEJJVDApKSB7CisgICAgICAgICAgICBpZiAoKHBzUlNOQ2FwT2JqLT5iUlNOQ2FwRXhpc3QgPT0gdHJ1ZSkgJiYgKHBzUlNOQ2FwT2JqLT53UlNOQ2FwICYgQklUMCkpIHsKICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlTGlzdC0+RmxhZ3MgfD0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcENhbmRpZGF0ZUxpc3QtPkZsYWdzICY9IH4oTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gTmV3IENhbmRpZGF0ZQogICAgIHBDYW5kaWRhdGVMaXN0ID0gJnBEZXZpY2UtPmdzUE1LSURDYW5kaWRhdGUuQ2FuZGlkYXRlTGlzdFtwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLk51bUNhbmRpZGF0ZXNdOwotICAgIGlmICgocHNSU05DYXBPYmotPmJSU05DYXBFeGlzdCA9PSBUUlVFKSAmJiAocHNSU05DYXBPYmotPndSU05DYXAgJiBCSVQwKSkgeworICAgIGlmICgocHNSU05DYXBPYmotPmJSU05DYXBFeGlzdCA9PSB0cnVlKSAmJiAocHNSU05DYXBPYmotPndSU05DYXAgJiBCSVQwKSkgewogICAgICAgICBwQ2FuZGlkYXRlTGlzdC0+RmxhZ3MgfD0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRDsKICAgICB9IGVsc2UgewogICAgICAgICBwQ2FuZGlkYXRlTGlzdC0+RmxhZ3MgJj0gfihORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVEKTsKQEAgLTQ4NTEsNyArNDg1Miw3IEBACiAgICAgbWVtY3B5KHBDYW5kaWRhdGVMaXN0LT5CU1NJRCwgcGJ5QlNTSUQsIEVUSF9BTEVOKTsKICAgICBwRGV2aWNlLT5nc1BNS0lEQ2FuZGlkYXRlLk51bUNhbmRpZGF0ZXMrKzsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIk51bUNhbmRpZGF0ZXM6JWRcbiIsIChpbnQpcERldmljZS0+Z3NQTUtJRENhbmRpZGF0ZS5OdW1DYW5kaWRhdGVzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLyoKQEAgLTQ4ODEsMjAgKzQ4ODIsMjAgQEAKICAgICBtZW1zZXQoJnBEZXZpY2UtPmdzUE1LSURDYW5kaWRhdGUsIDAsIHNpemVvZihTUE1LSURDYW5kaWRhdGVFdmVudCkpOwogfQogCi1zdGF0aWMgQk9PTAorc3RhdGljIGJvb2wKIHNfYkNpcGhlck1hdGNoICgKICAgICBQS25vd25CU1MgICAgICAgICAgICAgICAgICAgICAgICBwQlNTTm9kZSwKICAgICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAgICBFbmNTdGF0dXMsCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBwYnlDQ1NQSywKLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBieUNDU0dLCisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q0NTUEssCisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q0NTR0sKICAgICApCiB7Ci0gICAgQllURSBieU11bHRpY2FzdENpcGhlciA9IEtFWV9DVExfSU5WQUxJRDsKLSAgICBCWVRFIGJ5Q2lwaGVyTWFzayA9IDB4MDA7CisgICAgdW5zaWduZWQgY2hhciBieU11bHRpY2FzdENpcGhlciA9IEtFWV9DVExfSU5WQUxJRDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q2lwaGVyTWFzayA9IDB4MDA7CiAgICAgaW50IGk7CiAKICAgICBpZiAocEJTU05vZGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBjaGVjayBjYXAuIG9mIEJTUwogICAgIGlmICgoV0xBTl9HRVRfQ0FQX0lORk9fUFJJVkFDWShwQlNTTm9kZS0+d0NhcEluZm8pICE9IDApICYmCkBAIC00OTA0LDcgKzQ5MDUsNyBAQAogICAgIH0KIAogICAgIGlmICgoV0xBTl9HRVRfQ0FQX0lORk9fUFJJVkFDWShwQlNTTm9kZS0+d0NhcEluZm8pICE9IDApICYmCi0gICAgICAgIChwQlNTTm9kZS0+YldQQTJWYWxpZCA9PSBUUlVFKSAmJgorICAgICAgICAocEJTU05vZGUtPmJXUEEyVmFsaWQgPT0gdHJ1ZSkgJiYKICAgICAgICAgICAvLzIwMDgwMTIzLTAxLDxBZGQ+IGJ5IEVpbnNuIExpdQogICAgICAgICAoKEVuY1N0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKXx8KEVuY1N0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkpIHsKICAgICAgICAgLy9XUEEyCkBAIC00OTM4LDcgKzQ5MzksNyBAQAogICAgICAgICB9CiAKICAgICB9IGVsc2UgaWYgKChXTEFOX0dFVF9DQVBfSU5GT19QUklWQUNZKHBCU1NOb2RlLT53Q2FwSW5mbykgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAocEJTU05vZGUtPmJXUEFWYWxpZCA9PSBUUlVFKSAmJgorICAgICAgICAgICAgICAgIChwQlNTTm9kZS0+YldQQVZhbGlkID09IHRydWUpICYmCiAgICAgICAgICAgICAgICAgKChFbmNTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKEVuY1N0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkpIHsKICAgICAgICAgLy9XUEEKICAgICAgICAgLy8gY2hlY2sgR3JvdXAgS2V5IENpcGhlcgpAQCAtNDk3OCw5ICs0OTc5LDkgQEAKICAgICAgICAgICAgIChieUNpcGhlck1hc2sgPT0gMCkpIHsKICAgICAgICAgICAgICpwYnlDQ1NHSyA9IEtFWV9DVExfV0VQOwogICAgICAgICAgICAgKnBieUNDU1BLID0gS0VZX0NUTF9OT05FOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgfSBlbHNlIGlmIChFbmNTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgewpAQCAtNDk4OCw0NSArNDk4OSw0NSBAQAogICAgICAgICAgICAgKGJ5Q2lwaGVyTWFzayA9PSAwKSkgewogICAgICAgICAgICAgKnBieUNDU0dLID0gS0VZX0NUTF9US0lQOwogICAgICAgICAgICAgKnBieUNDU1BLID0gS0VZX0NUTF9OT05FOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmICgoYnlNdWx0aWNhc3RDaXBoZXIgPT0gS0VZX0NUTF9XRVApICYmCiAgICAgICAgICAgICAgICAgICAgKChieUNpcGhlck1hc2sgJiAweDAyKSAhPSAwKSkgewogICAgICAgICAgICAgKnBieUNDU0dLID0gS0VZX0NUTF9XRVA7CiAgICAgICAgICAgICAqcGJ5Q0NTUEsgPSBLRVlfQ1RMX1RLSVA7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKChieU11bHRpY2FzdENpcGhlciA9PSBLRVlfQ1RMX1RLSVApICYmCiAgICAgICAgICAgICAgICAgICAgKChieUNpcGhlck1hc2sgJiAweDAyKSAhPSAwKSkgewogICAgICAgICAgICAgKnBieUNDU0dLID0gS0VZX0NUTF9US0lQOwogICAgICAgICAgICAgKnBieUNDU1BLID0gS0VZX0NUTF9US0lQOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoRW5jU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKICAgICAgICAgaWYgKChieU11bHRpY2FzdENpcGhlciA9PSBLRVlfQ1RMX0NDTVApICYmCiAgICAgICAgICAgICAoYnlDaXBoZXJNYXNrID09IDApKSB7CiAgICAgICAgICAgICAvLyBXaGVuIENDTVAgaXMgZW5hYmxlLCAiVXNlIGdyb3VwIGNpcGhlciBzdWl0ZSIgc2hhbGwgbm90IGJlIGEgdmFsaWQgb3B0aW9uLgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKChieU11bHRpY2FzdENpcGhlciA9PSBLRVlfQ1RMX1dFUCkgJiYKICAgICAgICAgICAgICAgICAgICAoKGJ5Q2lwaGVyTWFzayAmIDB4MDQpICE9IDApKSB7CiAgICAgICAgICAgICAqcGJ5Q0NTR0sgPSBLRVlfQ1RMX1dFUDsKICAgICAgICAgICAgICpwYnlDQ1NQSyA9IEtFWV9DVExfQ0NNUDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoKGJ5TXVsdGljYXN0Q2lwaGVyID09IEtFWV9DVExfVEtJUCkgJiYKICAgICAgICAgICAgICAgICAgICAoKGJ5Q2lwaGVyTWFzayAmIDB4MDQpICE9IDApKSB7CiAgICAgICAgICAgICAqcGJ5Q0NTR0sgPSBLRVlfQ1RMX1RLSVA7CiAgICAgICAgICAgICAqcGJ5Q0NTUEsgPSBLRVlfQ1RMX0NDTVA7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKChieU11bHRpY2FzdENpcGhlciA9PSBLRVlfQ1RMX0NDTVApICYmCiAgICAgICAgICAgICAgICAgICAgKChieUNpcGhlck1hc2sgJiAweDA0KSAhPSAwKSkgewogICAgICAgICAgICAgKnBieUNDU0dLID0gS0VZX0NUTF9DQ01QOwogICAgICAgICAgICAgKnBieUNDU1BLID0gS0VZX0NUTF9DQ01QOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd21nci5oCmluZGV4IDlhZTdlMGQuLjE0MWU4MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd21nci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd21nci5oCkBAIC04Myw0NyArODMsNDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBUeXBlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgdGltZXJfZXhwaXJlKHRpbWVyLG5leHRfdGljaykgICBtb2RfdGltZXIoJnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSkKLXR5cGVkZWYgdm9pZCAoKlRpbWVyRnVuY3Rpb24pKFVMT05HKTsKK3R5cGVkZWYgdm9pZCAoKlRpbWVyRnVuY3Rpb24pKHVuc2lnbmVkIGxvbmcpOwogCiAKIC8vKysrIE5ESVMgcmVsYXRlZAogCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07CiB0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKIHsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBDYXBhYmlsaXRpZXM7CisgICAgdW5zaWduZWQgc2hvcnQgTGlzdGVuSW50ZXJ2YWw7CiAgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgIEN1cnJlbnRBUEFkZHJlc3M7CiB9IE5ESVNfODAyXzExX0FJX1JFUUZJLCAqUE5ESVNfODAyXzExX0FJX1JFUUZJOwogCiB0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVTRkkKIHsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBTdGF0dXNDb2RlOwotICAgIFVTSE9SVCBBc3NvY2lhdGlvbklkOworICAgIHVuc2lnbmVkIHNob3J0IENhcGFiaWxpdGllczsKKyAgICB1bnNpZ25lZCBzaG9ydCBTdGF0dXNDb2RlOworICAgIHVuc2lnbmVkIHNob3J0IEFzc29jaWF0aW9uSWQ7CiB9IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOwogCiB0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KIHsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOworICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoOworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKICAgICBORElTXzgwMl8xMV9BSV9SRVFGSSAgICBSZXF1ZXN0Rml4ZWRJRXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVxdWVzdElFTGVuZ3RoOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlcXVlc3RJRXM7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKKyAgICB1bnNpZ25lZCBsb25nIFJlcXVlc3RJRUxlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nIE9mZnNldFJlcXVlc3RJRXM7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKICAgICBORElTXzgwMl8xMV9BSV9SRVNGSSAgICBSZXNwb25zZUZpeGVkSUVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlSUVMZW5ndGg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVzcG9uc2VJRXM7CisgICAgdW5zaWduZWQgbG9uZyBSZXNwb25zZUlFTGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgT2Zmc2V0UmVzcG9uc2VJRXM7CiB9IE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OLCAqUE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OOwogCiAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0Fzc29jSW5mbyB7CiAgICAgTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04gICAgIEFzc29jSW5mbzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJ5SUVzW1dMQU5fQkVBQ09OX0ZSX01BWExFTitXTEFOX0JFQUNPTl9GUl9NQVhMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5SUVzW1dMQU5fQkVBQ09OX0ZSX01BWExFTitXTEFOX0JFQUNPTl9GUl9NQVhMRU5dOwogICAgIC8vIHN0b3JlIFJlcUlFcyBzZXQgYnkgT0lEXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFieVJlcUlFc1tXTEFOX0JFQUNPTl9GUl9NQVhMRU5dOworICAgIHVuc2lnbmVkIGxvbmcgUmVxdWVzdElFTGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UmVxSUVzW1dMQU5fQkVBQ09OX0ZSX01BWExFTl07CiB9IFNBc3NvY0luZm8sICpQU0Fzc29jSW5mbzsKIC8vLS0tCiAKQEAgLTIyNCw4ICsyMjQsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1R4TWdtdFBhY2tldCB7CiAKICAgICBQVVdMQU5fODAyMTFIRFIgICAgIHA4MDIxMUhlYWRlcjsKLSAgICBVSU5UICAgICAgICAgICAgICAgIGNiTVBEVUxlbjsKLSAgICBVSU5UICAgICAgICAgICAgICAgIGNiUGF5bG9hZExlbjsKKyAgICB1bnNpZ25lZCBpbnQgY2JNUERVTGVuOworICAgIHVuc2lnbmVkIGludCBjYlBheWxvYWRMZW47CiAKIH0gU1R4TWdtdFBhY2tldCwgKlBTVHhNZ210UGFja2V0OwogCkBAIC0yMzUsMTIgKzIzNSwxMiBAQAogCiAgICAgUFVXTEFOXzgwMjExSERSICAgICBwODAyMTFIZWFkZXI7CiAgICAgUVdPUkQgICAgICAgICAgICAgICBxd0xvY2FsVFNGOwotICAgIFVJTlQgICAgICAgICAgICAgICAgY2JNUERVTGVuOwotICAgIFVJTlQgICAgICAgICAgICAgICAgY2JQYXlsb2FkTGVuOwotICAgIFVJTlQgICAgICAgICAgICAgICAgdVJTU0k7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieVNROwotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlSeFJhdGU7Ci0gICAgQllURSAgICAgICAgICAgICAgICBieVJ4Q2hhbm5lbDsKKyAgICB1bnNpZ25lZCBpbnQgY2JNUERVTGVuOworICAgIHVuc2lnbmVkIGludCBjYlBheWxvYWRMZW47CisgICAgdW5zaWduZWQgaW50IHVSU1NJOworICAgIHVuc2lnbmVkIGNoYXIgYnlTUTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5UnhSYXRlOworICAgIHVuc2lnbmVkIGNoYXIgYnlSeENoYW5uZWw7CiAKIH0gU1J4TWdtdFBhY2tldCwgKlBTUnhNZ210UGFja2V0OwogCkBAIC0yNTEsNyArMjUxLDcgQEAKIAogICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBwQWRhcHRlcjsKICAgICAvLyBNQUMgYWRkcmVzcwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieU1BQ0FkZHJbV0xBTl9BRERSX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlNQUNBZGRyW1dMQU5fQUREUl9MRU5dOwogCiAgICAgLy8gQ29uZmlndXJhdGlvbiBNb2RlCiAgICAgV01BQ19DT05GSUdfTU9ERSAgICAgICAgZUNvbmZpZ01vZGU7IC8vIE1BQyBwcmUtY29uZmlnZWQgbW9kZQpAQCAtMjY0LDg2ICsyNjQsODYgQEAKICAgICBXTUFDX0JTU19TVEFURSAgICAgICAgICBlQ3VyclN0YXRlOyAgLy8gTUFDIGN1cnJlbnQgQlNTIHN0YXRlCiAKICAgICBQS25vd25CU1MgICAgICAgICAgICAgICBwQ3VyckJTUzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUNTU0dLOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5Q1NTUEs7CisgICAgdW5zaWduZWQgY2hhciBieUNTU0dLOworICAgIHVuc2lnbmVkIGNoYXIgYnlDU1NQSzsKIAotLy8gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5TmV3U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU5dOwotLy8gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5TmV3RXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU5dOworLy8gICAgdW5zaWduZWQgY2hhciBhYnlOZXdTdXBwUmF0ZXNbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1JBVEVTX01BWExFTl07CisvLyAgICB1bnNpZ25lZCBjaGFyIGFieU5ld0V4dFN1cHBSYXRlc1tXTEFOX0lFSERSX0xFTiArIFdMQU5fUkFURVNfTUFYTEVOXTsKIAogICAgIC8vIEN1cnJlbnQgc3RhdGUgdmFycwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVDdXJyQ2hhbm5lbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlDdXJyU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlDdXJyRXh0U3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlDdXJyU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlDdXJyQlNTSURbV0xBTl9CU1NJRF9MRU5dOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgIHdDdXJyQ2FwSW5mbzsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3Q3VyckFJRDsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3Q3VyckFUSU1XaW5kb3c7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0N1cnJCZWFjb25QZXJpb2Q7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYklzRFM7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlFUlBDb250ZXh0OworICAgIHVuc2lnbmVkIGludAl1Q3VyckNoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUN1cnJFeHRTdXBwUmF0ZXNbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1JBVEVTX01BWExFTiArIDFdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VyclNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyQlNTSURbV0xBTl9CU1NJRF9MRU5dOworICAgIHVuc2lnbmVkIHNob3J0IHdDdXJyQ2FwSW5mbzsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckFJRDsKKyAgICB1bnNpZ25lZCBzaG9ydCB3Q3VyckFUSU1XaW5kb3c7CisgICAgdW5zaWduZWQgc2hvcnQgd0N1cnJCZWFjb25QZXJpb2Q7CisgICAgYm9vbCBiSXNEUzsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5RVJQQ29udGV4dDsKIAogICAgIENNRF9TVEFURSAgICAgICAgICAgICAgIGVDb21tYW5kU3RhdGU7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdVNjYW5DaGFubmVsOworICAgIHVuc2lnbmVkIGludAl1U2NhbkNoYW5uZWw7CiAKICAgICAvLyBEZXNpcmUgam9pbm5pbmcgQlNTIHZhcnMKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlEZXNpcmVTU0lEW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDFdOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieURlc2lyZUJTU0lEW1dMQU5fQlNTSURfTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieURlc2lyZVNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgY2hhciBhYnlEZXNpcmVCU1NJRFtXTEFOX0JTU0lEX0xFTl07CiAKICAgICAvLyBBZGhvYyBvciBBUCBjb25maWd1cmF0aW9uIHZhcnMKLSAgLy9CWVRFICAgICAgICAgICAgICAgICAgICBhYnlBZEhvY1NTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0lCU1NCZWFjb25QZXJpb2Q7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0lCU1NBVElNV2luZG93OwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVJQlNTQ2hhbm5lbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlJQlNTU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieUFQQkJUeXBlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieVdQQUlFW01BWF9XUEFfSUVfTEVOXTsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3V1BBSUVMZW47CisgIC8vdW5zaWduZWQgY2hhciBhYnlBZEhvY1NTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgc2hvcnQgd0lCU1NCZWFjb25QZXJpb2Q7CisgICAgdW5zaWduZWQgc2hvcnQgd0lCU1NBVElNV2luZG93OworICAgIHVuc2lnbmVkIGludAl1SUJTU0NoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBhYnlJQlNTU3VwcFJhdGVzW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9SQVRFU19NQVhMRU4gKyAxXTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5QVBCQlR5cGU7CisgICAgdW5zaWduZWQgY2hhciBhYnlXUEFJRVtNQVhfV1BBX0lFX0xFTl07CisgICAgdW5zaWduZWQgc2hvcnQgd1dQQUlFTGVuOwogCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdUFzc29jQ291bnQ7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYk1vcmVEYXRhOworICAgIHVuc2lnbmVkIGludAl1QXNzb2NDb3VudDsKKyAgICBib29sIGJNb3JlRGF0YTsKIAogICAgIC8vIFNjYW4gc3RhdGUgdmFycwogICAgIFdNQUNfU0NBTl9TVEFURSAgICAgICAgIGVTY2FuU3RhdGU7CiAgICAgV01BQ19TQ0FOX1RZUEUgICAgICAgICAgZVNjYW5UeXBlOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVTY2FuU3RhcnRDaDsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICB1U2NhbkVuZENoOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgIHdTY2FuU3RlcHM7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdVNjYW5CU1NUeXBlOworICAgIHVuc2lnbmVkIGludAl1U2NhblN0YXJ0Q2g7CisgICAgdW5zaWduZWQgaW50CXVTY2FuRW5kQ2g7CisgICAgdW5zaWduZWQgc2hvcnQgd1NjYW5TdGVwczsKKyAgICB1bnNpZ25lZCBpbnQJdVNjYW5CU1NUeXBlOwogICAgIC8vIERlc2lyZSBzY2FubmlnIHZhcnMKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlTY2FuU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlTY2FuQlNTSURbV0xBTl9CU1NJRF9MRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5U2NhblNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07CisgICAgdW5zaWduZWQgY2hhciBhYnlTY2FuQlNTSURbV0xBTl9CU1NJRF9MRU5dOwogCiAgICAgLy8gUHJpdmFjeQogICAgIFdNQUNfQVVUSEVOVElDQVRJT05fTU9ERSBlQXV0aGVuTW9kZTsKICAgICBXTUFDX0VOQ1JZUFRJT05fTU9ERSAgICBlRW5jcnlwdGlvbk1vZGU7Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYlNoYXJlS2V5QWxnb3JpdGhtOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieUNoYWxsZW5nZVtXTEFOX0NIQUxMRU5HRV9MRU5dOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJQcml2YWN5SW52b2tlZDsKKyAgICBib29sIGJTaGFyZUtleUFsZ29yaXRobTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUNoYWxsZW5nZVtXTEFOX0NIQUxMRU5HRV9MRU5dOworICAgIGJvb2wgYlByaXZhY3lJbnZva2VkOwogCiAgICAgLy8gUmVjZWl2ZWQgYmVhY29uIHN0YXRlIHZhcnMKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiSW5USU07Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYk11bHRpY2FzdFRJTTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieURUSU1Db3VudDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieURUSU1QZXJpb2Q7CisgICAgYm9vbCBiSW5USU07CisgICAgYm9vbCBiTXVsdGljYXN0VElNOworICAgIHVuc2lnbmVkIGNoYXIgYnlEVElNQ291bnQ7CisgICAgdW5zaWduZWQgY2hhciBieURUSU1QZXJpb2Q7CiAKICAgICAvLyBQb3dlciBzYXZpbmcgc3RhdGUgdmFycwogICAgIFdNQUNfUE9XRVJfTU9ERSAgICAgICAgIGVQU01vZGU7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0xpc3RlbkludGVydmFsOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgIHdDb3VudFRvV2FrZVVwOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJJblRJTVdha2U7Ci0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgcGJ5UFNQYWNrZXRQb29sOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5UFNQYWNrZXRQb29sW3NpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fTlVMTERBVEFfRlJfTUFYTEVOXTsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiUnhCZWFjb25JblRCVFRXYWtlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieVBTVHhNYXBbTUFYX05PREVfTlVNICsgMV07CisgICAgdW5zaWduZWQgc2hvcnQgd0xpc3RlbkludGVydmFsOworICAgIHVuc2lnbmVkIHNob3J0IHdDb3VudFRvV2FrZVVwOworICAgIGJvb2wgYkluVElNV2FrZTsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlQU1BhY2tldFBvb2w7CisgICAgdW5zaWduZWQgY2hhciBieVBTUGFja2V0UG9vbFtzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX05VTExEQVRBX0ZSX01BWExFTl07CisgICAgYm9vbCBiUnhCZWFjb25JblRCVFRXYWtlOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UFNUeE1hcFtNQVhfTk9ERV9OVU0gKyAxXTsKIAogICAgIC8vIG1hbmFnZW1lbnQgY29tbWFuZCByZWxhdGVkCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdUNtZEJ1c3k7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdUNtZEhvc3RBUEJ1c3k7CisgICAgdW5zaWduZWQgaW50CXVDbWRCdXN5OworICAgIHVuc2lnbmVkIGludAl1Q21kSG9zdEFQQnVzeTsKIAogICAgIC8vIG1hbmFnZW1lbnQgcGFja2V0IHBvb2wKLSAgICBQQllURSAgICAgICAgICAgICAgICAgICBwYnlNZ210UGFja2V0UG9vbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieU1nbXRQYWNrZXRQb29sW3NpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQTNGUl9NQVhMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgKnBieU1nbXRQYWNrZXRQb29sOworICAgIHVuc2lnbmVkIGNoYXIgYnlNZ210UGFja2V0UG9vbFtzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX0EzRlJfTUFYTEVOXTsKIAogCiAgICAgLy8gT25lIHNlY29uZCBjYWxsYmFjayB0aW1lcgpAQCAtMzY2LDcgKzM2Niw3IEBACiAKICAgICAvLyBXUEEyIFBNS0lEIENhY2hlCiAgICAgU1BNS0lEQ2FjaGUgICAgICAgICAgICAgZ3NQTUtJRENhY2hlOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGJSb2FtaW5nOworICAgIGJvb2wgYlJvYW1pbmc7CiAKICAgICAvLyByYXRlIGZhbGwgYmFjayB2YXJzCiAKQEAgLTM3NywxNiArMzc3LDE2IEBACiAKIAogICAgIC8vIGZvciA4MDIuMTFoCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYjExaEVuYWJsZTsKLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiU3dpdGNoQ2hhbm5lbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBieU5ld0NoYW5uZWw7CisgICAgYm9vbCBiMTFoRW5hYmxlOworICAgIGJvb2wgYlN3aXRjaENoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBieU5ld0NoYW5uZWw7CiAgICAgUFdMQU5fSUVfTUVBU1VSRV9SRVAgICAgcEN1cnJNZWFzdXJlRUlEUmVwOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVMZW5ndGhPZlJlcEVJRHM7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5Q3VycmVudE1TUlJlcVtzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX0EzRlJfTUFYTEVOXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlDdXJyZW50TVNSUmVwW3NpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQTNGUl9NQVhMRU5dOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFieUlFQ291bnRyeVtXTEFOX0EzRlJfTUFYTEVOXTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlJQlNTREZTT3duZXJbNl07Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlJQlNTREZTUmVjb3Zlcnk7CisgICAgdW5zaWduZWQgaW50CXVMZW5ndGhPZlJlcEVJRHM7CisgICAgdW5zaWduZWQgY2hhciBhYnlDdXJyZW50TVNSUmVxW3NpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQTNGUl9NQVhMRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5Q3VycmVudE1TUlJlcFtzaXplb2YoU1R4TWdtdFBhY2tldCkgKyBXTEFOX0EzRlJfTUFYTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUlFQ291bnRyeVtXTEFOX0EzRlJfTUFYTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUlCU1NERlNPd25lcls2XTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5SUJTU0RGU1JlY292ZXJ5OwogCiAgICAgc3RydWN0IHNrX2J1ZmYgIHNrYjsKIApAQCAtNDMyLDggKzQzMiw4IEBACiB2TWdyRGlzYXNzb2NCZWdpblN0YSgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKICAgICBQU01nbXRPYmplY3QgcE1nbXQsCi0gICAgUEJZVEUgIGFieURlc3RBZGRyZXNzLAotICAgIFdPUkQgICAgd1JlYXNvbiwKKyAgICB1bnNpZ25lZCBjaGFyICphYnlEZXN0QWRkcmVzcywKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmVhc29uLAogICAgIFBDTURfU1RBVFVTIHBTdGF0dXMKICAgICApOwogCkBAIC00NzUsMjIgKzQ3NSwyMiBAQAogdk1nckRlQXV0aGVuQmVnaW5TdGEoCiAgICAgdm9pZCAqaERldmljZUNvbnRleHQsCiAgICAgUFNNZ210T2JqZWN0ICBwTWdtdCwKLSAgICBQQllURSAgIGFieURlc3RBZGRyZXNzLAotICAgIFdPUkQgICAgd1JlYXNvbiwKKyAgICB1bnNpZ25lZCBjaGFyICphYnlEZXN0QWRkcmVzcywKKyAgICB1bnNpZ25lZCBzaG9ydCB3UmVhc29uLAogICAgIFBDTURfU1RBVFVTIHBTdGF0dXMKICAgICApOwogCi1CT09MCitib29sCiBiTWdyUHJlcGFyZUJlYWNvblRvU2VuZCgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKICAgICBQU01nbXRPYmplY3QgcE1nbXQKICAgICApOwogCiAKLUJPT0wKK2Jvb2wKIGJBZGRfUE1LSURfQ2FuZGlkYXRlICgKICAgICB2b2lkICpoRGV2aWNlQ29udGV4dCwKLSAgICBQQllURSAgICAgICAgICBwYnlCU1NJRCwKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRCwKICAgICBQU1JTTkNhcE9iamVjdCBwc1JTTkNhcE9iagogICAgICk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5jCmluZGV4IGRhNWM4MTQuLjYxYWM0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEuYwpAQCAtNDUsMTIgKzQ1LDEyIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CiAKLWNvbnN0IEJZVEUgYWJ5T1VJMDBbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJMDFbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJMDJbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJMDNbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDMgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJMDRbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJMDVbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDUgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJMDBbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJMDFbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJMDJbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJMDNbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDMgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJMDRbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJMDVbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDUgfTsKIAogCiAvKisKQEAgLTgzLDkgKzgzLDkgQEAKICAgICBwQlNTTGlzdC0+d0F1dGhDb3VudCA9IDA7CiAgICAgcEJTU0xpc3QtPmJ5RGVmYXVsdEtfYXNfUEsgPSAwOwogICAgIHBCU1NMaXN0LT5ieVJlcGxheUlkeCA9IDA7Ci0gICAgcEJTU0xpc3QtPnNSU05DYXBPYmouYlJTTkNhcEV4aXN0ID0gRkFMU0U7CisgICAgcEJTU0xpc3QtPnNSU05DYXBPYmouYlJTTkNhcEV4aXN0ID0gZmFsc2U7CiAgICAgcEJTU0xpc3QtPnNSU05DYXBPYmoud1JTTkNhcCA9IDA7Ci0gICAgcEJTU0xpc3QtPmJXUEFWYWxpZCA9IEZBTFNFOworICAgIHBCU1NMaXN0LT5iV1BBVmFsaWQgPSBmYWxzZTsKIH0KIAogCkBAIC0xMTIsNyArMTEyLDcgQEAKIHsKICAgICBQV0xBTl9JRV9SU05fQVVUSCAgcElFX1JTTl9BdXRoID0gTlVMTDsKICAgICBpbnQgICAgICAgICAgICAgICAgaSwgaiwgbSwgbiA9IDA7Ci0gICAgUEJZVEUgICAgICAgICAgICAgIHBieUNhcHM7CisgICAgdW5zaWduZWQgY2hhciAqcGJ5Q2FwczsKIAogICAgIFdQQV9DbGVhclJTTihwQlNTTGlzdCk7CiAKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id1BLQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSk6ICV6dVxuIiwgcFJTTi0+d1BLQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKSk7Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IChpIDwgcFJTTi0+d1BLQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgeworICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBSU04tPndQS0NvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKS9zaXplb2YodW5zaWduZWQgY2hhcikpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTIraSo0KzQpIHsgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpK1BLUyg0KmkpCiAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNtcChwUlNOLT5QS1NMaXN0W2ldLmFieU9VSSwgYWJ5T1VJMDAsIDQpKQogICAgICAgICAgICAgICAgICAgICAgICAgcEJTU0xpc3QtPmFieVBLVHlwZVtqKytdID0gV1BBX05PTkU7CkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgLy9EQkdfUFJOX0dSUDE0KCgiYWJ5UEtUeXBlWyVkXTogJVhcbiIsIGotMSwgcEJTU0xpc3QtPmFieVBLVHlwZVtqLTFdKSk7CiAgICAgICAgICAgICB9IC8vZm9yCi0gICAgICAgICAgICBwQlNTTGlzdC0+d1BLQ291bnQgPSAoV09SRClqOworICAgICAgICAgICAgcEJTU0xpc3QtPndQS0NvdW50ID0gKHVuc2lnbmVkIHNob3J0KWo7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndQS0NvdW50OiAlZFxuIiwgcEJTU0xpc3QtPndQS0NvdW50KTsKICAgICAgICAgfQogCkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QXV0aENvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSk6ICV6dVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcElFX1JTTl9BdXRoLT53QXV0aENvdW50LCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKSk7Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IChpIDwgcElFX1JTTl9BdXRoLT53QXV0aENvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgeworICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBJRV9SU05fQXV0aC0+d0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKS9zaXplb2YodW5zaWduZWQgY2hhcikpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTQrNCsobStpKSo0KSB7IC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKStQS1MoNCptKStBS0MoMikrQUtTKDQqaSkKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKHBJRV9SU05fQXV0aC0+QXV0aEtTTGlzdFtpXS5hYnlPVUksIGFieU9VSTAxLCA0KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHBCU1NMaXN0LT5hYnlBdXRoVHlwZVtqKytdID0gV1BBX0FVVEhfSUVFRTgwMl8xWDsKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgIC8vREJHX1BSTl9HUlAxNCgoImFieUF1dGhUeXBlWyVkXTogJVhcbiIsIGotMSwgcEJTU0xpc3QtPmFieUF1dGhUeXBlW2otMV0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKGogPiAwKQotICAgICAgICAgICAgICAgIHBCU1NMaXN0LT53QXV0aENvdW50ID0gKFdPUkQpajsKKyAgICAgICAgICAgICAgICBwQlNTTGlzdC0+d0F1dGhDb3VudCA9ICh1bnNpZ25lZCBzaG9ydClqOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QXV0aENvdW50OiAlZFxuIiwgcEJTU0xpc3QtPndBdXRoQ291bnQpOwogICAgICAgICB9CiAKQEAgLTIwNywxNyArMjA3LDE3IEBACiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjE0KzQrKG0rbikqNDogJWRcbiIsIDE0KzQrKG0rbikqNCk7CiAKICAgICAgICAgICAgIGlmKHBSU04tPmxlbisyID49IDE0KzQrKG0rbikqNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqbSkrQUtDKDIpK0FLUyg0Km4pK0NhcCgyKQotICAgICAgICAgICAgICAgIHBieUNhcHMgPSAoUEJZVEUpcElFX1JTTl9BdXRoLT5BdXRoS1NMaXN0W25dLmFieU9VSTsKKyAgICAgICAgICAgICAgICBwYnlDYXBzID0gKHVuc2lnbmVkIGNoYXIgKilwSUVfUlNOX0F1dGgtPkF1dGhLU0xpc3Rbbl0uYWJ5T1VJOwogICAgICAgICAgICAgICAgIHBCU1NMaXN0LT5ieURlZmF1bHRLX2FzX1BLID0gKCpwYnlDYXBzKSAmIFdQQV9HUk9VUEZMQUc7CiAgICAgICAgICAgICAgICAgcEJTU0xpc3QtPmJ5UmVwbGF5SWR4ID0gMiA8PCAoKCpwYnlDYXBzID4+IFdQQV9SRVBMQVlCSVRTU0hJRlQpICYgV1BBX1JFUExBWUJJVFMpOwotICAgICAgICAgICAgICAgIHBCU1NMaXN0LT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgcEJTU0xpc3QtPnNSU05DYXBPYmoud1JTTkNhcCA9ICooUFdPUkQpcGJ5Q2FwczsKKyAgICAgICAgICAgICAgICBwQlNTTGlzdC0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIHBCU1NMaXN0LT5zUlNOQ2FwT2JqLndSU05DYXAgPSAqKHVuc2lnbmVkIHNob3J0ICopcGJ5Q2FwczsKICAgICAgICAgICAgICAgICAvL0RCR19QUk5fR1JQMTQoKCJwYnlDYXBzOiAlWFxuIiwgKnBieUNhcHMpKTsKICAgICAgICAgICAgICAgICAvL0RCR19QUk5fR1JQMTQoKCJieURlZmF1bHRLX2FzX1BLOiAlWFxuIiwgcEJTU0xpc3QtPmJ5RGVmYXVsdEtfYXNfUEspKTsKICAgICAgICAgICAgICAgICAvL0RCR19QUk5fR1JQMTQoKCJieVJlcGxheUlkeDogJVhcbiIsIHBCU1NMaXN0LT5ieVJlcGxheUlkeCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHBCU1NMaXN0LT5iV1BBVmFsaWQgPSBUUlVFOworICAgICAgICBwQlNTTGlzdC0+YldQQVZhbGlkID0gdHJ1ZTsKICAgICB9CiB9CiAKQEAgLTIzNywyNCArMjM3LDI0IEBACiAgKiBSZXR1cm4gVmFsdWU6IG5vbmUuCiAgKgogLSovCi1CT09MCitib29sCiBXUEFfU2VhcmNoUlNOICgKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5Q21kLAotICAgIEJZVEUgICAgICAgICAgICAgICAgYnlFbmNyeXB0LAorICAgIHVuc2lnbmVkIGNoYXIgYnlDbWQsCisgICAgdW5zaWduZWQgY2hhciBieUVuY3J5cHQsCiAgICAgUEtub3duQlNTICAgICAgICBwQlNTTGlzdAogICAgICkKIHsKICAgICBpbnQgaWk7Ci0gICAgQllURSBieVBLVHlwZSA9IFdQQV9OT05FOworICAgIHVuc2lnbmVkIGNoYXIgYnlQS1R5cGUgPSBXUEFfTk9ORTsKIAotICAgIGlmIChwQlNTTGlzdC0+YldQQVZhbGlkID09IEZBTFNFKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKHBCU1NMaXN0LT5iV1BBVmFsaWQgPT0gZmFsc2UpCisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIHN3aXRjaChieUNtZCkgewogICAgIGNhc2UgMDoKIAogICAgICAgICBpZiAoYnlFbmNyeXB0ICE9IHBCU1NMaXN0LT5ieUdLVHlwZSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpZiAocEJTU0xpc3QtPndQS0NvdW50ID4gMCkgewogICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcEJTU0xpc3QtPndQS0NvdW50OyBpaSArKykgewpAQCAtMjY4LDkgKzI2OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICBieVBLVHlwZSA9IFdQQV9XRVAxMDQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnlFbmNyeXB0ICE9IGJ5UEtUeXBlKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogLy8gICAgICAgIGlmIChwQlNTTGlzdC0+d0F1dGhDb3VudCA+IDApCiAvLyAgICAgICAgICAgIGZvciAoaWk9MDsgaWkgPCBwQlNTTGlzdC0+d0F1dGhDb3VudDsgaWkgKyspCiAvLyAgICAgICAgICAgICAgICBpZiAoYnlBdXRoID09IHBCU1NMaXN0LT5hYnlBdXRoVHlwZVtpaV0pCkBAIC0yODAsNyArMjgwLDcgQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogLyorCkBAIC0yOTcsMjAgKzI5NywyMCBAQAogICogUmV0dXJuIFZhbHVlOiBub25lLgogICoKIC0qLwotQk9PTAorYm9vbAogV1BBYl9Jc19SU04gKAogICAgIFBXTEFOX0lFX1JTTl9FWFQgcFJTTgogICAgICkKIHsKICAgICBpZiAocFJTTiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICgocFJTTi0+bGVuID49IDYpICYmIC8vIG91aTEoNCkrdmVyKDIpCiAgICAgICAgIChwUlNOLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9SU05fV1BBKSAmJiAgIW1lbWNtcChwUlNOLT5hYnlPVUksIGFieU9VSTAxLCA0KSAmJgogICAgICAgICAocFJTTi0+d1ZlcnNpb24gPT0gMSkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEuaAppbmRleCA4MGQ5OTBiLi45MjFmZDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmgKQEAgLTY5LDE0ICs2OSwxNCBAQAogICAgIFBXTEFOX0lFX1JTTl9FWFQgcFJTTgogICAgICk7CiAKLUJPT0wKK2Jvb2wKIFdQQV9TZWFyY2hSU04oCi0gICAgQllURSAgICAgICAgICAgICAgICBieUNtZCwKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJ5RW5jcnlwdCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ5Q21kLAorICAgIHVuc2lnbmVkIGNoYXIgYnlFbmNyeXB0LAogICAgIFBLbm93bkJTUyAgICAgICAgcEJTU0xpc3QKICAgICApOwogCi1CT09MCitib29sCiBXUEFiX0lzX1JTTigKICAgICBQV0xBTl9JRV9SU05fRVhUIHBSU04KICAgICApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYTIuYwppbmRleCA3YTQyYTBhLi44MDUxNjRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKQEAgLTQyLDE0ICs0MiwxNCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1jb25zdCBCWVRFIGFieU9VSUdLWzRdICAgICAgPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDAgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJV0VQNDBbNF0gICA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwMSB9OwotY29uc3QgQllURSBhYnlPVUlXRVAxMDRbNF0gID0geyAweDAwLCAweDBGLCAweEFDLCAweDA1IH07Ci1jb25zdCBCWVRFIGFieU9VSVRLSVBbNF0gICAgPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfTsKLWNvbnN0IEJZVEUgYWJ5T1VJQ0NNUFs0XSAgICA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwNCB9OworY29uc3QgdW5zaWduZWQgY2hhciBhYnlPVUlHS1s0XSAgICAgID0geyAweDAwLCAweDBGLCAweEFDLCAweDAwIH07Citjb25zdCB1bnNpZ25lZCBjaGFyIGFieU9VSVdFUDQwWzRdICAgPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDEgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJV0VQMTA0WzRdICA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwNSB9OworY29uc3QgdW5zaWduZWQgY2hhciBhYnlPVUlUS0lQWzRdICAgID0geyAweDAwLCAweDBGLCAweEFDLCAweDAyIH07Citjb25zdCB1bnNpZ25lZCBjaGFyIGFieU9VSUNDTVBbNF0gICAgPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDQgfTsKIAotY29uc3QgQllURSBhYnlPVUk4MDIxWFs0XSAgID0geyAweDAwLCAweDBGLCAweEFDLCAweDAxIH07Ci1jb25zdCBCWVRFIGFieU9VSVBTS1s0XSAgICAgPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYWJ5T1VJODAyMVhbNF0gICA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwMSB9OworY29uc3QgdW5zaWduZWQgY2hhciBhYnlPVUlQU0tbNF0gICAgID0geyAweDAwLCAweDBGLCAweEFDLCAweDAyIH07CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTc5LDcgKzc5LDcgQEAKIHsKICAgICBpbnQgaWk7CiAKLSAgICBwQlNTTm9kZS0+YldQQTJWYWxpZCA9IEZBTFNFOworICAgIHBCU1NOb2RlLT5iV1BBMlZhbGlkID0gZmFsc2U7CiAKICAgICBwQlNTTm9kZS0+YnlDU1NHSyA9IFdMQU5fMTFpX0NTU19DQ01QOwogICAgIGZvciAoaWk9MDsgaWkgPCA0OyBpaSArKykKQEAgLTg4LDcgKzg4LDcgQEAKICAgICBmb3IgKGlpPTA7IGlpIDwgNDsgaWkgKyspCiAgICAgICAgIHBCU1NOb2RlLT5hYnlBS01TU0F1dGhUeXBlW2lpXSA9IFdMQU5fMTFpX0FLTVNTXzgwMl8xWDsKICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gMTsKLSAgICBwQlNTTm9kZS0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPSBGQUxTRTsKKyAgICBwQlNTTm9kZS0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPSBmYWxzZTsKICAgICBwQlNTTm9kZS0+c1JTTkNhcE9iai53UlNOQ2FwID0gMDsKIH0KIApAQCAtMTE0LDkgKzExNCw5IEBACiAgICAgKQogewogICAgIGludCAgICAgICAgICAgICAgICAgaSwgajsKLSAgICBXT1JEICAgICAgICAgICAgICAgIG0gPSAwLCBuID0gMDsKLSAgICBQQllURSAgICAgICAgICAgICAgIHBieU9VSTsKLSAgICBCT09MICAgICAgICAgICAgICAgIGJVc2VHSyA9IEZBTFNFOworICAgIHVuc2lnbmVkIHNob3J0IG0gPSAwLCBuID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlPVUk7CisgICAgYm9vbCBiVXNlR0sgPSBmYWxzZTsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iV1BBMl9QYXJzZVJTTjogWyVkXVxuIiwgcFJTTi0+bGVuKTsKIApAQCAtMTI0LDcgKzEyNCw3IEBACiAKICAgICBpZiAocFJTTi0+bGVuID09IDIpIHsgLy8gdmVyKDIpCiAgICAgICAgIGlmICgocFJTTi0+YnlFbGVtZW50SUQgPT0gV0xBTl9FSURfUlNOKSAmJiAocFJTTi0+d1ZlcnNpb24gPT0gMSkpIHsKLSAgICAgICAgICAgIHBCU1NOb2RlLT5iV1BBMlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgIHBCU1NOb2RlLT5iV1BBMlZhbGlkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTU5LDIxICsxNTksMjEgQEAKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyI4MDIuMTFpIENTUzogJVhcbiIsIHBCU1NOb2RlLT5ieUNTU0dLKTsKIAogICAgICAgICBpZiAocFJTTi0+bGVuID09IDYpIHsKLSAgICAgICAgICAgIHBCU1NOb2RlLT5iV1BBMlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgIHBCU1NOb2RlLT5iV1BBMlZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gOCkgeyAvLyB2ZXIoMikgKyBHSyg0KSArIFBLIGNvdW50KDIpCi0gICAgICAgICAgICBwQlNTTm9kZS0+d0NTU1BLQ291bnQgPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNF0pKTsKKyAgICAgICAgICAgIHBCU1NOb2RlLT53Q1NTUEtDb3VudCA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzRdKSk7CiAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgIHBieU9VSSA9ICYocFJTTi0+YWJ5UlNOWzZdKTsKIAotICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBwQlNTTm9kZS0+d0NTU1BLQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NOb2RlLT5hYnlDU1NQSykvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IHBCU1NOb2RlLT53Q1NTUEtDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU05vZGUtPmFieUNTU1BLKS9zaXplb2YodW5zaWduZWQgY2hhcikpOyBpKyspIHsKIAogICAgICAgICAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gOCtpKjQrNCkgeyAvLyB2ZXIoMikrR0soNCkrUEtDbnQoMikrUEtTKDQqaSkKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKHBieU9VSSwgYWJ5T1VJR0ssIDQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwQlNTTm9kZS0+YWJ5Q1NTUEtbaisrXSA9IFdMQU5fMTFpX0NTU19VU0VfR1JPVVA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVXNlR0sgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYlVzZUdLID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIW1lbWNtcChwYnlPVUksIGFieU9VSVdFUDQwLCA0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52aWFsaWQgQ1NTLCBjb250aW51ZSB0byBwYXJzaW5nCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICFtZW1jbXAocGJ5T1VJLCBhYnlPVUlUS0lQLCA0KSkgewpAQCAtMTk1LDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSAvL2ZvcgogCi0gICAgICAgICAgICBpZiAoYlVzZUdLID09IFRSVUUpIHsKKyAgICAgICAgICAgIGlmIChiVXNlR0sgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIGlmIChqICE9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBDU1MsIFRoaXMgc2hvdWxkIGJlIG9ubHkgUEsgQ1NTLgogICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0yMDksMTcgKzIwOSwxNyBAQAogICAgICAgICAgICAgICAgIC8vIGludmFsaWQgQ1NTLCBObyB2YWxpZCBQSy4KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQlNTTm9kZS0+d0NTU1BLQ291bnQgPSAoV09SRClqOworICAgICAgICAgICAgcEJTU05vZGUtPndDU1NQS0NvdW50ID0gKHVuc2lnbmVkIHNob3J0KWo7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndDU1NQS0NvdW50OiAlZFxuIiwgcEJTU05vZGUtPndDU1NQS0NvdW50KTsKICAgICAgICAgfQogCi0gICAgICAgIG0gPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNF0pKTsKKyAgICAgICAgbSA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzRdKSk7CiAKICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMCttKjQpIHsgLy8gdmVyKDIpICsgR0soNCkgKyBQSyBjb3VudCgyKSArIFBLUyg0Km0pICsgQUtNU1MgY291bnQoMikKLSAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7OworICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOzsKICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgcGJ5T1VJID0gJihwUlNOLT5hYnlSU05bOCs0Km1dKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU05vZGUtPmFieUFLTVNTQXV0aFR5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTm9kZS0+YWJ5QUtNU1NBdXRoVHlwZSkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMCsobStpKSo0KzQpIHsgLy8gdmVyKDIpK0dLKDQpK1BLQ250KDIpK1BLUyg0Km0pK0FLTVNTKDIpK0FLUyg0KmkpCiAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNtcChwYnlPVUksIGFieU9VSTgwMjFYLCA0KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5hYnlBS01TU0F1dGhUeXBlW2orK10gPSBXTEFOXzExaV9BS01TU184MDJfMVg7CkBAIC0yMzIsMTcgKzIzMiwxNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAoV09SRClqOworICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICh1bnNpZ25lZCBzaG9ydClqOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QUtNU1NBdXRoQ291bnQ6ICVkXG4iLCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KTsKIAotICAgICAgICAgICAgbiA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTs7CisgICAgICAgICAgICBuID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7OwogICAgICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMis0Km0rNCpuKSB7IC8vIHZlcigyKStHSyg0KStQS0NudCgyKStQS1MoNCptKStBS01TU0NudCgyKStBS01TUyg0Km4pK0NhcCgyKQotICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgcEJTU05vZGUtPnNSU05DYXBPYmoud1JTTkNhcCA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls4KzQqbSs0Km5dKSk7CisgICAgICAgICAgICAgICAgcEJTU05vZGUtPnNSU05DYXBPYmouYlJTTkNhcEV4aXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwQlNTTm9kZS0+c1JTTkNhcE9iai53UlNOQ2FwID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bOCs0Km0rNCpuXSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vaWdub3JlIFBNS0lEIGxpc3RzIGJjcyBvbmx5IChSZSlBc3NvY3JlcXVlc3QgaGFzIHRoaXMgZmllbGQKLSAgICAgICAgcEJTU05vZGUtPmJXUEEyVmFsaWQgPSBUUlVFOworICAgICAgICBwQlNTTm9kZS0+YldQQTJWYWxpZCA9IHRydWU7CiAgICAgfQogfQogCkBAIC0yNjEsMTYgKzI2MSwxNiBAQAogICogUmV0dXJuIFZhbHVlOiBsZW5ndGggb2YgSUVzLgogICoKIC0qLwotVUlOVAordW5zaWduZWQgaW50CiBXUEEydVNldElFcygKICAgICB2b2lkICpwTWdtdEhhbmRsZSwKICAgICBQV0xBTl9JRV9SU04gcFJTTklFcwogICAgICkKIHsKICAgICBQU01nbXRPYmplY3QgICAgcE1nbXQgPSAoUFNNZ210T2JqZWN0KSBwTWdtdEhhbmRsZTsKLSAgICBQQllURSAgICAgICAgICAgcGJ5QnVmZmVyID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgaWkgPSAwOwotICAgIFBXT1JEICAgICAgICAgICBwd1BNS0lEID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCdWZmZXIgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCBpaSA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgKnB3UE1LSUQgPSBOVUxMOwogCiAgICAgaWYgKHBSU05JRXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4oMCk7CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgIChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQTJQU0spKSAmJgogICAgICAgICAocE1nbXQtPnBDdXJyQlNTICE9IE5VTEwpKSB7CiAgICAgICAgIC8qIFdQQTIgSUUgKi8KLSAgICAgICAgcGJ5QnVmZmVyID0gKFBCWVRFKSBwUlNOSUVzOworICAgICAgICBwYnlCdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBwUlNOSUVzOwogICAgICAgICBwUlNOSUVzLT5ieUVsZW1lbnRJRCA9IFdMQU5fRUlEX1JTTjsKICAgICAgICAgcFJTTklFcy0+bGVuID0gNjsgLy9WZXJzaW9uKDIpK0dLKDQpCiAgICAgICAgIHBSU05JRXMtPndWZXJzaW9uID0gMTsKQEAgLTMzMCw3ICszMzAsNyBAQAogICAgICAgICBwUlNOSUVzLT5sZW4gKz02OwogCiAgICAgICAgIC8vIFJTTiBDYXBhYmlsaXRlcwotICAgICAgICBpZiAocE1nbXQtPnBDdXJyQlNTLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9PSBUUlVFKSB7CisgICAgICAgIGlmIChwTWdtdC0+cEN1cnJCU1MtPnNSU05DYXBPYmouYlJTTkNhcEV4aXN0ID09IHRydWUpIHsKICAgICAgICAgICAgIG1lbWNweSgmcFJTTklFcy0+YWJ5UlNOWzE2XSwgJnBNZ210LT5wQ3VyckJTUy0+c1JTTkNhcE9iai53UlNOQ2FwLCAyKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBSU05JRXMtPmFieVJTTlsxNl0gPSAwOwpAQCAtMzM5LDEwICszMzksMTAgQEAKICAgICAgICAgcFJTTklFcy0+bGVuICs9MjsKIAogICAgICAgICBpZiAoKHBNZ210LT5nc1BNS0lEQ2FjaGUuQlNTSURJbmZvQ291bnQgPiAwKSAmJgotICAgICAgICAgICAgKHBNZ210LT5iUm9hbWluZyA9PSBUUlVFKSAmJgorICAgICAgICAgICAgKHBNZ210LT5iUm9hbWluZyA9PSB0cnVlKSAmJgogICAgICAgICAgICAgKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBMikpIHsKICAgICAgICAgICAgIC8vIFJTTiBQTUtJRAotICAgICAgICAgICAgcHdQTUtJRCA9IChQV09SRCkoJnBSU05JRXMtPmFieVJTTlsxOF0pOyAgLy8gUG9pbnQgdG8gUE1LSUQgY291bnQKKyAgICAgICAgICAgIHB3UE1LSUQgPSAodW5zaWduZWQgc2hvcnQgKikoJnBSU05JRXMtPmFieVJTTlsxOF0pOyAgLy8gUG9pbnQgdG8gUE1LSUQgY291bnQKICAgICAgICAgICAgICpwd1BNS0lEID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBQTUtJRCBjb3VudAogICAgICAgICAgICAgcGJ5QnVmZmVyID0gJnBSU05JRXMtPmFieVJTTlsyMF07ICAgICAgICAgICAvLyBQb2ludCB0byBQTUtJRCBsaXN0CiAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBwTWdtdC0+Z3NQTUtJRENhY2hlLkJTU0lESW5mb0NvdW50OyBpaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYTIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5oCmluZGV4IDcyMDBkYjMuLjcxODIwOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5oCkBAIC00MCwxMiArNDAsMTIgQEAKICNkZWZpbmUgTUFYX1BNS0lEX0NBQ0hFICAgICAgICAgMTYKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnc1BNS0lESW5mbyB7Ci0gICAgQllURSAgICBhYnlCU1NJRFs2XTsKLSAgICBCWVRFICAgIGFieVBNS0lEWzE2XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUJTU0lEWzZdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5UE1LSURbMTZdOwogfSBQTUtJREluZm8sICpQUE1LSURJbmZvOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUE1LSURDYWNoZSB7Ci0gICAgVUxPTkcgICAgICAgQlNTSURJbmZvQ291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBCU1NJREluZm9Db3VudDsKICAgICBQTUtJREluZm8gICBCU1NJREluZm9bTUFYX1BNS0lEX0NBQ0hFXTsKIH0gU1BNS0lEQ2FjaGUsICpQU1BNS0lEQ2FjaGU7CiAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICBQV0xBTl9JRV9SU04gICAgIHBSU04KICAgICApOwogCi1VSU5UCit1bnNpZ25lZCBpbnQKIFdQQTJ1U2V0SUVzKAogICAgIHZvaWQgKnBNZ210SGFuZGxlLAogICAgIFBXTEFOX0lFX1JTTiBwUlNOSUVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYWN0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGFjdGwuYwppbmRleCAyMmMyZmFiLi4wMTQyMzM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGFjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYWN0bC5jCkBAIC0xOTksMTYgKzE5OSwxNiBAQAogICoKICAqLwogCi0gaW50IHdwYV9zZXRfa2V5cyhQU0RldmljZSBwRGV2aWNlLCB2b2lkICpjdHgsIEJPT0wgIGZjcGZrZXJuZWwpCisgaW50IHdwYV9zZXRfa2V5cyhQU0RldmljZSBwRGV2aWNlLCB2b2lkICpjdHgsIGJvb2wgZmNwZmtlcm5lbCkKIHsKICAgICBzdHJ1Y3Qgdmlhd2dldF93cGFfcGFyYW0gKnBhcmFtPWN0eDsKICAgICBQU01nbXRPYmplY3QgcE1nbXQgPSBwRGV2aWNlLT5wTWdtdDsKLSAgICBEV09SRCAgIGR3S2V5SW5kZXggPSAwOwotICAgIEJZVEUgICAgYWJ5S2V5W01BWF9LRVlfTEVOXTsKLSAgICBCWVRFICAgIGFieVNlcVtNQVhfS0VZX0xFTl07CisgICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGFieUtleVtNQVhfS0VZX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBhYnlTZXFbTUFYX0tFWV9MRU5dOwogICAgIFFXT1JEICAgS2V5UlNDOwogLy8gICAgTkRJU184MDJfMTFfS0VZX1JTQyBLZXlSU0M7Ci0gICAgQllURSAgICBieUtleURlY01vZGUgPSBLRVlfQ1RMX1dFUDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ5S2V5RGVjTW9kZSA9IEtFWV9DVExfV0VQOwogCWludCByZXQgPSAwOwogCWludCB1dSwgaWk7CiAKQEAgLTIxOSw5ICsyMTksOSBAQAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBhcmFtLT51LndwYV9rZXkuYWxnX25hbWUgPSAlZCBcbiIsIHBhcmFtLT51LndwYV9rZXkuYWxnX25hbWUpOwogCWlmIChwYXJhbS0+dS53cGFfa2V5LmFsZ19uYW1lID09IFdQQV9BTEdfTk9ORSkgewogICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0gICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gRkFMU0U7CisgICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gZmFsc2U7CiAgICAgICAgIHBEZXZpY2UtPmJ5S2V5SW5kZXggPSAwOwotICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSBGQUxTRTsKKyAgICAgICAgcERldmljZS0+YlRyYW5zbWl0S2V5ID0gZmFsc2U7CiAgICAgICAgIEtleXZSZW1vdmVBbGxXRVBLZXkoJihwRGV2aWNlLT5zS2V5KSwgcERldmljZS0+UG9ydE9mZnNldCk7CiAgICAgICAgIGZvciAodXU9MDsgdXU8TUFYX0tFWV9UQUJMRTsgdXUrKykgewogICAgICAgICAgICAgTUFDdkRpc2FibGVLZXlFbnRyeShwRGV2aWNlLT5Qb3J0T2Zmc2V0LCB1dSk7CkBAIC0yNDMsNyArMjQzLDcgQEAKIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogICAgIAl9CiAKLSAgICBkd0tleUluZGV4ID0gKERXT1JEKShwYXJhbS0+dS53cGFfa2V5LmtleV9pbmRleCk7CisgICAgZHdLZXlJbmRleCA9ICh1bnNpZ25lZCBsb25nKShwYXJhbS0+dS53cGFfa2V5LmtleV9pbmRleCk7CiAKIAlpZiAocGFyYW0tPnUud3BhX2tleS5hbGdfbmFtZSA9PSBXUEFfQUxHX1dFUCkgewogICAgICAgICBpZiAoZHdLZXlJbmRleCA+IDMpIHsKQEAgLTI1MSw4ICsyNTEsOCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaWYgKHBhcmFtLT51LndwYV9rZXkuc2V0X3R4KSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YnlLZXlJbmRleCA9IChCWVRFKWR3S2V5SW5kZXg7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+YlRyYW5zbWl0S2V5ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gKHVuc2lnbmVkIGNoYXIpZHdLZXlJbmRleDsKKyAgICAgICAgICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSB0cnVlOwogCQkgICAgICAgIGR3S2V5SW5kZXggfD0gKDEgPDwgMzEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgS2V5YlNldERlZmF1bHRLZXkoJihwRGV2aWNlLT5zS2V5KSwKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiAgICAgICAgIH0KICAgICAgICAgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IFRSVUU7CisgICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIHJldDsKIAl9CiAKQEAgLTM1MSwyNiArMzUxLDI2IEBACiAgICAgfQogCiAgICAvLyBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICBpZiAoSVNfQlJPQURDQVNUX0FERFJFU1MoJnBhcmFtLT5hZGRyWzBdKSB8fCAocGFyYW0tPmFkZHIgPT0gTlVMTCkpIHsKLSAgICAgICAgLy8gSWYgSVNfQlJPQURDQVNUX0FERFJFU1MsIHNldCB0aGUga2V5IGFzIGV2ZXJ5IGtleSBlbnRyeSdzIGdyb3VwIGtleS4KKyAgICBpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoJnBhcmFtLT5hZGRyWzBdKSB8fCAocGFyYW0tPmFkZHIgPT0gTlVMTCkpIHsKKyAgICAgICAgLy8gSWYgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIsIHNldCB0aGUga2V5IGFzIGV2ZXJ5IGtleSBlbnRyeSdzIGdyb3VwIGtleS4KICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiR3JvdXBlIEtleSBBc3NpZ24uXG4iKTsKIAogICAgICAgICBpZiAoKEtleWJTZXRBbGxHcm91cEtleSgmKHBEZXZpY2UtPnNLZXkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3S2V5SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnUud3BhX2tleS5rZXlfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQUVdPUkQpICYoS2V5UlNDKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEJZVEUpYWJ5S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopYWJ5S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5S2V5RGVjTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5TG9jYWxJRCkgPT0gVFJVRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUxvY2FsSUQpID09IHRydWUpICYmCiAgICAgICAgICAgICAoS2V5YlNldERlZmF1bHRLZXkoJihwRGV2aWNlLT5zS2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0tleUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT51LndwYV9rZXkua2V5X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFFXT1JEKSAmKEtleVJTQyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKWFieUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWFieUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieUtleURlY01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+UG9ydE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUxvY2FsSUQpID09IFRSVUUpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ5TG9jYWxJRCkgPT0gdHJ1ZSkgKSB7CiAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiR1JPVVAgS2V5IEFzc2lnbi5cbiIpOwogCiAgICAgICAgIH0gZWxzZSB7CkBAIC00MDAsMTUgKzQwMCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICBkd0tleUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dS53cGFfa2V5LmtleV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIChQUVdPUkQpICYoS2V5UlNDKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKFBCWVRFKWFieUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilhYnlLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICBieUtleURlY01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlMb2NhbElEKSA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5ieUxvY2FsSUQpID09IHRydWUpIHsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlBhaXJ3aXNlIEtleSBTZXRcbiIpOwogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBLZXkgVGFibGUgRnVsbAotICAgICAgICAgICAgaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMKCZwYXJhbS0+YWRkclswXSwgcERldmljZS0+YWJ5QlNTSUQpKSB7CisgICAgICAgICAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcigmcGFyYW0tPmFkZHJbMF0sIHBEZXZpY2UtPmFieUJTU0lEKSkgewogICAgICAgICAgICAgICAgIC8vREJHX1BSTl9XTEFOMDMoKCJyZXR1cm4gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBIC1LZXkgVGFibGUgRnVsbC4yXG4iKSk7CiAgICAgICAgICAgICAgICAgLy9zcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNDIyLDEwICs0MjIsMTAgQEAKICAgICAgICAgfQogICAgIH0gLy8gQlNTSUQgbm90IDB4ZmZmZmZmZmZmZmZmCiAgICAgaWYgKChyZXQgPT0gMCkgJiYgKChwYXJhbS0+dS53cGFfa2V5LnNldF90eCkgIT0gMCkpIHsKLSAgICAgICAgcERldmljZS0+YnlLZXlJbmRleCA9IChCWVRFKXBhcmFtLT51LndwYV9rZXkua2V5X2luZGV4OwotICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gKHVuc2lnbmVkIGNoYXIpcGFyYW0tPnUud3BhX2tleS5rZXlfaW5kZXg7CisgICAgICAgIHBEZXZpY2UtPmJUcmFuc21pdEtleSA9IHRydWU7CiAgICAgfQotICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gVFJVRTsKKyAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IHRydWU7CiAgICAgLy9zcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCiAvKgpAQCAtNDY1LDcgKzQ2NSw3IEBACiAJaW50IHJldCA9IDA7CiAKICAgICBwTWdtdC0+ZUF1dGhlbk1vZGUgPSBXTUFDX0FVVEhfT1BFTjsKLSAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gRkFMU0U7CisgICAgcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IGZhbHNlOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTYxMywxMyArNjEzLDEzIEBACiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gcERldmljZS0+cE1nbXQ7CiAgICAgUFdMQU5fSUVfU1NJRCAgIHBJdGVtU1NJRDsKICAgICBQS25vd25CU1MgcEJTUzsKLQlQQllURSAgcEJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpwQnVmOwogCWludCByZXQgPSAwOwogCXUxNiBjb3VudCA9IDA7CiAJdTE2IGlpLCBqajsKICNpZiAxCiAKLSAgICBQQllURSBwdGVtcEJTUzsKKyAgICB1bnNpZ25lZCBjaGFyICpwdGVtcEJTUzsKIAogCiAKQEAgLTYzOSw5ICs2MzksOSBAQAogCiAgICAgICAgICBmb3Ioamo9MDtqajxNQVhfQlNTX05VTS1paS0xO2pqKyspIHsKIAotICAgICAgICAgICBpZigocE1nbXQtPnNCU1NMaXN0W2pqXS5iQWN0aXZlIT1UUlVFKSB8fAorICAgICAgICAgICBpZigocE1nbXQtPnNCU1NMaXN0W2pqXS5iQWN0aXZlIT10cnVlKSB8fAogCi0gICAgICAgICAgICAgICAgKChwTWdtdC0+c0JTU0xpc3RbampdLnVSU1NJPnBNZ210LT5zQlNTTGlzdFtqaisxXS51UlNTSSkgJiYocE1nbXQtPnNCU1NMaXN0W2pqKzFdLmJBY3RpdmUhPUZBTFNFKSkpIHsKKyAgICAgICAgICAgICAgICAoKHBNZ210LT5zQlNTTGlzdFtqal0udVJTU0k+cE1nbXQtPnNCU1NMaXN0W2pqKzFdLnVSU1NJKSAmJihwTWdtdC0+c0JTU0xpc3RbamorMV0uYkFjdGl2ZSE9ZmFsc2UpKSkgewogCiAgICAgICAgICAgICAgICAgIG1lbWNweShwdGVtcEJTUywmcE1nbXQtPnNCU1NMaXN0W2pqXSxzaXplb2YoS25vd25CU1MpKTsKIApAQCAtNzEzLDcgKzcxMyw3IEBACiAgICAgICAgICAgICAgICAgc2Nhbl9idWYtPnJzbl9pZV9sZW4gPSBwQlNTLT53UlNOTGVuOwogICAgICAgICAgICAgICAgIG1lbWNweShzY2FuX2J1Zi0+cnNuX2llLCBwQlNTLT5ieVJTTklFLCBwQlNTLT53UlNOTGVuKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYW5fYnVmID0gKHN0cnVjdCB2aWF3Z2V0X3NjYW5fcmVzdWx0ICopKChQQllURSlzY2FuX2J1ZiArIHNpemVvZihzdHJ1Y3Qgdmlhd2dldF9zY2FuX3Jlc3VsdCkpOworICAgICAgICAgICAgc2Nhbl9idWYgPSAoc3RydWN0IHZpYXdnZXRfc2Nhbl9yZXN1bHQgKikoKHVuc2lnbmVkIGNoYXIgKilzY2FuX2J1ZiArIHNpemVvZihzdHJ1Y3Qgdmlhd2dldF9zY2FuX3Jlc3VsdCkpOwogICAgICAgICAgICAgamogKys7CiAgICAgICAgIH0KICAgICB9CkBAIC03NTIsMTAgKzc1MiwxMCBAQAogewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogICAgIFBXTEFOX0lFX1NTSUQgICBwSXRlbVNTSUQ7Ci0gICAgQllURSAgICBhYnlOdWxsQWRkcltdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICAgIEJZVEUgICAgYWJ5V1BBSUVbNjRdOworICAgIHVuc2lnbmVkIGNoYXIgYWJ5TnVsbEFkZHJbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKyAgICB1bnNpZ25lZCBjaGFyIGFieVdQQUlFWzY0XTsKICAgICBpbnQgcmV0ID0gMDsKLSAgICBCT09MIGJXZXBFbmFibGVkPUZBTFNFOworICAgIGJvb2wgYldlcEVuYWJsZWQ9ZmFsc2U7CiAKIAkvLyBzZXQga2V5IHR5cGUgJiBhbGdvcml0aG0KICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwYWlyd2lzZV9zdWl0ZSA9ICVkXG4iLCBwYXJhbS0+dS53cGFfYXNzb2NpYXRlLnBhaXJ3aXNlX3N1aXRlKTsKQEAgLTgxNyw3ICs4MTcsNyBAQAogCWNhc2UgQ0lQSEVSX1dFUDQwOgogCWNhc2UgQ0lQSEVSX1dFUDEwNDoKIAkJcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQliV2VwRW5hYmxlZD1UUlVFOworCQliV2VwRW5hYmxlZD10cnVlOwogCQlicmVhazsKIAljYXNlIENJUEhFUl9OT05FOgogCQlpZiAocGFyYW0tPnUud3BhX2Fzc29jaWF0ZS5ncm91cF9zdWl0ZSA9PSBDSVBIRVJfQ0NNUCkKQEAgLTgzNCwyNiArODM0LDI2IEBACiAgICAgICBpZiAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9TSEFSRUtFWSkgewogICAgICAgICAgICAgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwogICAgICAgICAgICAgLy9wTWdtdC0+ZUF1dGhlbk1vZGUgPSBXTUFDX0FVVEhfU0hBUkVLRVk7Ci0gICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gVFJVRTsKKyAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgZWxzZSBpZiAocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9PUEVOKSB7CiAgICAgICAgICAgaWYoIWJXZXBFbmFibGVkKSAgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwogCWVsc2UgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwogICAgICAgICAgICAgLy9wTWdtdC0+ZUF1dGhlbk1vZGUgPSBXTUFDX0FVVEhfT1BFTjsKLSAgICAgICAgICAgIC8vcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IEZBTFNFOyAvLzIwMDgwNzE3LTA2LDxNb2RpZnk+IGJ5IGNoZXN0ZXIvL0ZpeCBPcGVuIG1vZGUsIFdFUCBlbmNyeXRpb24KKyAgICAgICAgICAgIC8vcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IGZhbHNlOyAvLzIwMDgwNzE3LTA2LDxNb2RpZnk+IGJ5IGNoZXN0ZXIvL0ZpeCBPcGVuIG1vZGUsIFdFUCBlbmNyeXRpb24KICAgICAgICAgICAgfQogLy9taWtlIHNhdmUgb2xkIGVuY3J5cHRpb24gc3RhdHVzCiAJcERldmljZS0+ZU9sZEVuY3J5cHRpb25TdGF0dXMgPSBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1czsKIAogICAgIGlmIChwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyAhPSAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLSAgICAgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBUUlVFOworICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IHRydWU7CiAgICAgZWxzZQotICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IEZBTFNFOworICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IGZhbHNlOwogaWYgKCEoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfU0hBUkVLRVkpIHx8Ci0gICAgICAoKHBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfT1BFTikgJiYgKGJXZXBFbmFibGVkPT1UUlVFKSkpICkgIC8vRGF2aWRXYW5nICAvLzIwMDgwNzE3LTA2LDxNb2RpZnk+IGJ5IGNoZXN0ZXIvL05vdCB0byBpbml0aWFsIFdFUAorICAgICAgKChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX09QRU4pICYmIChiV2VwRW5hYmxlZD09dHJ1ZSkpKSApICAvL0RhdmlkV2FuZyAgLy8yMDA4MDcxNy0wNiw8TW9kaWZ5PiBieSBjaGVzdGVyLy9Ob3QgdG8gaW5pdGlhbCBXRVAKICAgICBLZXl2SW5pdFRhYmxlKCZwRGV2aWNlLT5zS2V5LCBwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBGQUxTRTsKKyAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBmYWxzZTsKICAgICBtZW1zZXQocE1nbXQtPmFieUN1cnJCU1NJRCwgMCwgNik7CiAgICAgcE1nbXQtPmVDdXJyU3RhdGUgPSBXTUFDX1NUQVRFX0lETEU7CiAgICAgbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJY2FzZSBWSUFXR0VUX1NFVF9LRVk6CiAJICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlZJQVdHRVRfU0VUX0tFWSBcbiIpOwogCSAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgcmV0ID0gd3BhX3NldF9rZXlzKHBEZXZpY2UsIHBhcmFtLCBGQUxTRSk7CisgICAgICAgIHJldCA9IHdwYV9zZXRfa2V5cyhwRGV2aWNlLCBwYXJhbSwgZmFsc2UpOwogICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGFjdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhY3RsLmgKaW5kZXggYjBkOTJkNS4uZGJlOGU4NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGFjdGwuaApAQCAtNTQsNyArNTQsNyBAQAogCiAKIAotdHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICBORElTXzgwMl8xMV9LRVlfUlNDOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC02NCw3ICs2NCw3IEBACiAKIGludCB3cGFfc2V0X3dwYWRldihQU0RldmljZSBwRGV2aWNlLCBpbnQgdmFsKTsKIGludCB3cGFfaW9jdGwoUFNEZXZpY2UgcERldmljZSwgc3RydWN0IGl3X3BvaW50ICpwKTsKLWludCB3cGFfc2V0X2tleXMoUFNEZXZpY2UgcERldmljZSwgdm9pZCAqY3R4LCBCT09MICBmY3Bma2VybmVsKTsKK2ludCB3cGFfc2V0X2tleXMoUFNEZXZpY2UgcERldmljZSwgdm9pZCAqY3R4LCBib29sIGZjcGZrZXJuZWwpOwogCiAjZW5kaWYgLy8gX19XUEFDTF9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3JvdXRlLmMKaW5kZXggYmY5MmZiOS4uNjZlMmVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5jCkBAIC01Myw0NSArNTMsNDUgQEAKIAogLyoKICAqIERlc2NyaXB0aW9uOgotICogICAgICBSZWxheSBwYWNrZXQuICBSZXR1cm4gVFJVRSBpZiBwYWNrZXQgaXMgY29weSB0byBETUExCisgKiAgICAgIFJlbGF5IHBhY2tldC4gIFJldHVybiB0cnVlIGlmIHBhY2tldCBpcyBjb3B5IHRvIERNQTEKICAqCiAgKiBQYXJhbWV0ZXJzOgogICogIEluOgogICogICAgICBwRGV2aWNlICAgICAgICAgICAgIC0KICAqICAgICAgcGJ5U2tiRGF0YSAgICAgICAgICAtIHJ4IHBhY2tldCBza2IgZGF0YQogICogIE91dDoKLSAqICAgICAgVFVSRSwgRkFMU0UKKyAqICAgICAgdHJ1ZSwgZmFsc2UKICAqCi0gKiBSZXR1cm4gVmFsdWU6IFRSVUUgaWYgcGFja2V0IGR1cGxpY2F0ZTsgb3RoZXJ3aXNlIEZBTFNFCisgKiBSZXR1cm4gVmFsdWU6IHRydWUgaWYgcGFja2V0IGR1cGxpY2F0ZTsgb3RoZXJ3aXNlIGZhbHNlCiAgKgogICovCi1CT09MIFJPVVRFYlJlbGF5IChQU0RldmljZSBwRGV2aWNlLCBQQllURSBwYnlTa2JEYXRhLCBVSU5UIHVEYXRhTGVuLCBVSU5UIHVOb2RlSW5kZXgpCitib29sIFJPVVRFYlJlbGF5IChQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBjaGFyICpwYnlTa2JEYXRhLCB1bnNpZ25lZCBpbnQgdURhdGFMZW4sIHVuc2lnbmVkIGludCB1Tm9kZUluZGV4KQogewogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwogICAgIFBTVHhEZXNjICAgICAgICBwSGVhZFRELCBwTGFzdFREOwotICAgIFVJTlQgICAgICAgICAgICBjYkZyYW1lQm9keVNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgIHVNQUNmcmFnTnVtOwotICAgIEJZVEUgICAgICAgICAgICBieVBrdFR5cGU7Ci0gICAgQk9PTCAgICAgICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IEZBTFNFOworICAgIHVuc2lnbmVkIGludCBjYkZyYW1lQm9keVNpemU7CisgICAgdW5zaWduZWQgaW50IHVNQUNmcmFnTnVtOworICAgIHVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlOworICAgIGJvb2wgYk5lZWRFbmNyeXB0aW9uID0gZmFsc2U7CiAgICAgU0tleUl0ZW0gICAgICAgIFNUZW1wS2V5OwogICAgIFBTS2V5SXRlbSAgICAgICBwVHJhbnNtaXRLZXkgPSBOVUxMOwotICAgIFVJTlQgICAgICAgICAgICBjYkhlYWRlclNpemU7Ci0gICAgVUlOVCAgICAgICAgICAgIGlpOwotICAgIFBCWVRFICAgICAgICAgICBwYnlCU1NJRDsKKyAgICB1bnNpZ25lZCBpbnQgY2JIZWFkZXJTaXplOworICAgIHVuc2lnbmVkIGludCBpaTsKKyAgICB1bnNpZ25lZCBjaGFyICpwYnlCU1NJRDsKIAogCiAKIAogICAgIGlmIChBVkFJTF9URChwRGV2aWNlLCBUWVBFX0FDMERNQSk8PTApIHsKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUmVsYXkgY2FuJ3QgYWxsb2NhdGUgVEQxLi5cbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwSGVhZFREID0gcERldmljZS0+YXBDdXJyVERbVFlQRV9BQzBETUFdOwogCiAgICAgcEhlYWRURC0+bV90ZDFURDEuYnlUQ1IgPSAoVENSX0VEUHxUQ1JfU1RQKTsKIAotICAgIG1lbWNweShwRGV2aWNlLT5zVHhFdGhIZWFkZXIuYWJ5RHN0QWRkciwgKFBCWVRFKXBieVNrYkRhdGEsIEVUSF9ITEVOKTsKKyAgICBtZW1jcHkocERldmljZS0+c1R4RXRoSGVhZGVyLmFieURzdEFkZHIsICh1bnNpZ25lZCBjaGFyICopcGJ5U2tiRGF0YSwgRVRIX0hMRU4pOwogCiAgICAgY2JGcmFtZUJvZHlTaXplID0gdURhdGFMZW4gLSBFVEhfSExFTjsKIApAQCAtOTksMTIgKzk5LDEyIEBACiAgICAgICAgIGNiRnJhbWVCb2R5U2l6ZSArPSA4OwogICAgIH0KIAotICAgIGlmIChwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9PSBUUlVFKSB7Ci0gICAgICAgIGJOZWVkRW5jcnlwdGlvbiA9IFRSVUU7CisgICAgaWYgKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID09IHRydWUpIHsKKyAgICAgICAgYk5lZWRFbmNyeXB0aW9uID0gdHJ1ZTsKIAogICAgICAgICAvLyBnZXQgZ3JvdXAga2V5CiAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QnJvYWRjYXN0QWRkcjsKLSAgICAgICAgaWYoS2V5YkdldFRyYW5zbWl0S2V5KCYocERldmljZS0+c0tleSksIHBieUJTU0lELCBHUk9VUF9LRVksICZwVHJhbnNtaXRLZXkpID09IEZBTFNFKSB7CisgICAgICAgIGlmKEtleWJHZXRUcmFuc21pdEtleSgmKHBEZXZpY2UtPnNLZXkpLCBwYnlCU1NJRCwgR1JPVVBfS0VZLCAmcFRyYW5zbWl0S2V5KSA9PSBmYWxzZSkgewogICAgICAgICAgICAgcFRyYW5zbWl0S2V5ID0gTlVMTDsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0RFQlVHIktFWSBpcyBOVUxMLiBbJWRdXG4iLCBwRGV2aWNlLT5wTWdtdC0+ZUN1cnJNb2RlKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEzMCwxNiArMTMwLDE2IEBACiAgICAgdU1BQ2ZyYWdOdW0gPSBjYkdldEZyYWdDb3VudChwRGV2aWNlLCBwVHJhbnNtaXRLZXksIGNiRnJhbWVCb2R5U2l6ZSwgJnBEZXZpY2UtPnNUeEV0aEhlYWRlcik7CiAKICAgICBpZiAodU1BQ2ZyYWdOdW0gPiBBVkFJTF9URChwRGV2aWNlLFRZUEVfQUMwRE1BKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgYnlQa3RUeXBlID0gKEJZVEUpcERldmljZS0+YnlQYWNrZXRUeXBlOworICAgIGJ5UGt0VHlwZSA9ICh1bnNpZ25lZCBjaGFyKXBEZXZpY2UtPmJ5UGFja2V0VHlwZTsKIAogICAgIGlmIChwRGV2aWNlLT5iRml4UmF0ZSkgewogICAgICAgICBpZiAocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQikgewogICAgICAgICAgICAgaWYgKHBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZSA+PSBSQVRFXzExTSkgewogICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IFJBVEVfMTFNOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSAoV09SRClwRGV2aWNlLT51Q29ubmVjdGlvblJhdGU7CisgICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPnVDb25uZWN0aW9uUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICgocERldmljZS0+ZUN1cnJlbnRQSFlUeXBlID09IFBIWV9UWVBFXzExQSkgJiYKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICAgICAgICAgIGlmIChwRGV2aWNlLT51Q29ubmVjdGlvblJhdGUgPj0gUkFURV81NE0pCiAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IFJBVEVfNTRNOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcERldmljZS0+d0N1cnJlbnRSYXRlID0gKFdPUkQpcERldmljZS0+dUNvbm5lY3Rpb25SYXRlOworICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT53Q3VycmVudFJhdGUgPSAodW5zaWduZWQgc2hvcnQpcERldmljZS0+dUNvbm5lY3Rpb25SYXRlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgICAgIE1BQ2JQU1dha2V1cChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKICAgICB9CiAKLSAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IEZBTFNFOworICAgIHBEZXZpY2UtPmJQV0JpdE9uID0gZmFsc2U7CiAKICAgICBwTGFzdFREID0gcEhlYWRURDsKICAgICBmb3IgKGlpID0gMDsgaWkgPCB1TUFDZnJhZ051bTsgaWkrKykgewpAQCAtMTkyLDcgKzE5Miw3IEBACiAKICAgICBNQUN2VHJhbnNtaXRBQzAocERldmljZS0+UG9ydE9mZnNldCk7CiAKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuaAppbmRleCAyOTVjZGM1Li4zNGY5ZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3JvdXRlLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQk9PTCBST1VURWJSZWxheSAoUFNEZXZpY2UgcERldmljZSwgUEJZVEUgcGJ5U2tiRGF0YSwgVUlOVCB1RGF0YUxlbiwgVUlOVCB1Tm9kZUluZGV4KTsKK2Jvb2wgUk9VVEViUmVsYXkgKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGNoYXIgKnBieVNrYkRhdGEsIHVuc2lnbmVkIGludCB1RGF0YUxlbiwgdW5zaWduZWQgaW50IHVOb2RlSW5kZXgpOwogCiAjZW5kaWYgLy8gX19XUk9VVEVfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFtZ3IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFtZ3IuYwppbmRleCBmMjRkYzU1Li5mY2VlYzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2LzgwMjExbWdyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni84MDIxMW1nci5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKgogICogRmlsZTogODAyMTFtZ3IuYwogICoKLSAqIFB1cnBvc2U6IEhhbmRsZXMgdGhlIDgwMi4xMSBtYW5hZ21lbnQgc3VwcG9ydCBmdW5jdGlvbnMKKyAqIFB1cnBvc2U6IEhhbmRsZXMgdGhlIDgwMi4xMSBtYW5hZ2VtZW50IHN1cHBvcnQgZnVuY3Rpb25zCiAgKgogICogQXV0aG9yOiBMeW5kb24gQ2hlbgogICoKQEAgLTY3LDggKzY3LDggQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87Ci0vL3N0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPU1TR19MRVZFTF9ERUJVRzsKK3N0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPSBNU0dfTEVWRUxfSU5GTzsKKy8qc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOyovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKQEAgLTk2LDcgKzk2LDcgQEAKIHsKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQkVBQ09OX09GRl9UUyk7CiAgICAgcEZyYW1lLT5wd0JlYWNvbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKLSAgICAvLyBGaXhlZCBGaWVsZHMKKyAgICAvKiBGaXhlZCBGaWVsZHMgKi8KICAgICBwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfVFMpOwogICAgIHBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC0xMzgsODggKzEzOCw4NyBAQAogICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTyk7CiAKLSAgICAvLyBJbmZvcm1hdGlvbiBlbGVtZW50cworICAgIC8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKChQQllURSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpKQogICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQkVBQ09OX09GRl9TU0lEKTsKLSAgICB3aGlsZSggKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pICl7CisgICAgd2hpbGUgKCgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgewogCiAgICAgICAgIHN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKSB7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFNTSUQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTdXBwUmF0ZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0ZIX1BBUk1TOgotICAgICAgICAgICAgICAgIC8vcEZyYW1lLT5wRkhQYXJtcyA9IChQV0xBTl9JRV9GSF9QQVJNUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfRFNfUEFSTVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cERTUGFybXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wRFNQYXJtcyA9IChQV0xBTl9JRV9EU19QQVJNUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfQ0ZfUEFSTVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cENGUGFybXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wQ0ZQYXJtcyA9IChQV0xBTl9JRV9DRl9QQVJNUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfSUJTU19QQVJNUzoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUJTU1Bhcm1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cElCU1NQYXJtcyA9IChQV0xBTl9JRV9JQlNTX1BBUk1TKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9USU06Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFRJTSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBUSU0gPSAoUFdMQU5fSUVfVElNKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wU1NJRCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cFNTSUQgPSAoUFdMQU5fSUVfU1NJRClwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9GSF9QQVJNUzoKKyAgICAgICAgICAgIC8qIHBGcmFtZS0+cEZIUGFybXMgPSAoUFdMQU5fSUVfRkhfUEFSTVMpcEl0ZW07ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9EU19QQVJNUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBEU1Bhcm1zID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wRFNQYXJtcyA9IChQV0xBTl9JRV9EU19QQVJNUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0NGX1BBUk1TOgorICAgICAgICAgICAgaWYgKHBGcmFtZS0+cENGUGFybXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBDRlBhcm1zID0gKFBXTEFOX0lFX0NGX1BBUk1TKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfSUJTU19QQVJNUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJQlNTUGFybXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBJQlNTUGFybXMgPSAoUFdMQU5fSUVfSUJTU19QQVJNUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1RJTToKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBUSU0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBUSU0gPSAoUFdMQU5fSUVfVElNKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfUlNOOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBSU04gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBSU04gPSAoUFdMQU5fSUVfUlNOKXBJdGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfUlNOX1dQQToKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSBUUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOV1BBID0gKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTjoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBSU04gPT0gTlVMTCkgCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOID0gKFBXTEFOX0lFX1JTTilwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfRVJQOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBFUlAgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wRVJQID0gKFBXTEFOX0lFX0VSUClwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0VSUDoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBFUlAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBFUlAgPSAoUFdMQU5fSUVfRVJQKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0NPVU5UUlk6ICAgICAgLy83Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX0NvdW50cnkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wSUVfQ291bnRyeSA9IChQV0xBTl9JRV9DT1VOVFJZKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0NPVU5UUlk6ICAgICAgLyogNyAqLworICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX0NvdW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9Db3VudHJ5ID0gKFBXTEFOX0lFX0NPVU5UUlkpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDogICAvLzMyCi0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPSAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQ6ICAgLyogMzIgKi8KKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPSAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9DSF9TV0lUQ0g6ICAgIC8vMzcKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUVfQ0hTVyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9DSFNXID0gKFBXTEFOX0lFX0NIX1NXKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0NIX1NXSVRDSDogICAgLyogMzcgKi8KKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9DSFNXID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wSUVfQ0hTVyA9IChQV0xBTl9JRV9DSF9TVylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1FVSUVUOiAgICAgICAgLy80MAotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9RdWlldCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9RdWlldCA9IChQV0xBTl9JRV9RVUlFVClwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9RVUlFVDogICAgICAgIC8qIDQwICovCisgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUVfUXVpZXQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9RdWlldCA9IChQV0xBTl9JRV9RVUlFVClwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0lCU1NfREZTOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9JQlNTREZTID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX0lCU1NERlMgPSAoUFdMQU5fSUVfSUJTU19ERlMpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfSUJTU19ERlM6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUVfSUJTU0RGUyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX0lCU1NERlMgPSAoUFdMQU5fSUVfSUJTU19ERlMpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBiZWFjb24gZGVjb2RlLlxuIiwgcEl0ZW0tPmJ5RWxlbWVudElEKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGJlYWNvbiBkZWNvZGUuXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIH0KQEAgLTI5NSw3ICsyOTQsNyBAQAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAKLSAgICAvLyBGaXhlZCBGaWVsZHMKKyAgICAvKiBGaXhlZCBGaWVsZHMgKi8KICAgICBwRnJhbWUtPnB3UmVhc29uID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTik7CiAgICAgcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04gKyBzaXplb2YoKihwRnJhbWUtPnB3UmVhc29uKSk7CkBAIC0zMjIsNyArMzIxLDcgQEAKIHsKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdSZWFzb24gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OKTsKIApAQCAtMzQ3LDcgKzM0Niw3IEBACiAgICAgKQogewogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7CiAgICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTM3Niw0NyArMzc1LDQ2IEBACiAgICAgUFdMQU5fSUUgICBwSXRlbTsKIAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9DQVBfSU5GTyk7CiAgICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKIAotICAgIC8vIEluZm9ybWF0aW9uIGVsZW1lbnRzCisgICAgLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KICAgICBwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVRX09GRl9TU0lEKTsKIAogICAgIHdoaWxlICgoKFBCWVRFKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikpIHsKLSAgICAgICAgc3dpdGNoIChwSXRlbS0+YnlFbGVtZW50SUQpewotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9TU0lEOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTU0lEID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFNTSUQgPSAoUFdMQU5fSUVfU1NJRClwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCkgeworICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wU1NJRCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cFNTSUQgPSAoUFdMQU5fSUVfU1NJRClwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9SU046Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFJTTiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTiA9IChQV0xBTl9JRV9SU04pcEl0ZW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9SU05fV1BBOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBSU05XUEEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9SU046CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOID0gKFBXTEFOX0lFX1JTTilwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGFzc29jcmVxIGRlY29kZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+YnlFbGVtZW50SUQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiVW5yZWNvZ25pemVkIEVJRD0lZGQgaW4gYXNzb2NyZXEgZGVjb2RlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPmJ5RWxlbWVudElEKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKFBCWVRFKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKICAgICB9CkBAIC00NDEsNyArNDM5LDcgQEAKIHsKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwogICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtNDc1LDcgKzQ3Myw3IEBACiAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwogICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtNDgzLDcgKzQ4MSw3IEBACiAgICAgcEZyYW1lLT5wd0FpZCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQUlEKTsKIAotICAgIC8vIEluZm9ybWF0aW9uIGVsZW1lbnRzCisgICAgLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KICAgICBwRnJhbWUtPnBTdXBwUmF0ZXMgID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CiAKQEAgLTQ5Myw4ICs0OTEsNyBAQAogICAgIGlmICgoKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSAmJiAocEl0ZW0tPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0VYVFNVUFBfUkFURVMpKSB7CiAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJwRnJhbWUtPnBFeHRTdXBwUmF0ZXM9WyVwXS5cbiIsIHBJdGVtKTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgICAgcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuOwpAQCAtNTE5LDcgKzUxNiw3IEBACiB7CiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKLSAgICAvLyBGaXhlZCBGaWVsZHMKKyAgICAvKiBGaXhlZCBGaWVsZHMgKi8KICAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7CiAgICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTU1Miw3ICs1NDksNyBAQAogICAgIFBXTEFOX0lFICAgcEl0ZW07CiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKLSAgICAvLyBGaXhlZCBGaWVsZHMKKyAgICAvKiBGaXhlZCBGaWVsZHMgKi8KICAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7CiAgICAgcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTU2MCw0MiArNTU3LDQxIEBACiAgICAgcEZyYW1lLT5wQWRkckN1cnJBUCA9IChQSUVFRV9BRERSKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKIAotICAgIC8vIEluZm9ybWF0aW9uIGVsZW1lbnRzCisgICAgLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KICAgICBwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9TU0lEKTsKIAotICAgIHdoaWxlKCgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgeworICAgIHdoaWxlICgoKFBCWVRFKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikpIHsKIAotICAgICAgICBzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCl7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFNTSUQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTdXBwUmF0ZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKSB7CisgICAgICAgIGNhc2UgV0xBTl9FSURfU1NJRDoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTU0lEID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTdXBwUmF0ZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTjoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOID0gKFBXTEFOX0lFX1JTTilwSXRlbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXUEFiX0lzX1JTTigoUFdMQU5fSUVfUlNOX0VYVClwSXRlbSkgPT0gVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9SU046CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOID0gKFBXTEFOX0lFX1JTTilwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiByZWFzc29jcmVxIGRlY29kZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPmJ5RWxlbWVudElEKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTOgorICAgICAgICAgICAgaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiByZWFzc29jcmVxIGRlY29kZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+YnlFbGVtZW50SUQpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKCgoUEJZVEUpcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOwogICAgIH0KQEAgLTY0NiwzMCArNjQyLDMwIEBACiAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEluZm9ybWF0aW9uIGVsZW1lbnRzCisgICAgLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KICAgICBwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpKTsKIAotICAgIHdoaWxlKCAoKFBCWVRFKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikgKSB7CisgICAgd2hpbGUgKCgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgewogCiAgICAgICAgIHN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKSB7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFNTSUQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wU1NJRCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cFNTSUQgPSAoUFdMQU5fSUVfU1NJRClwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJCYWQgRUlEPSVkZCBpbiBwcm9iZXJlcVxuIiwgcEl0ZW0tPmJ5RWxlbWVudElEKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVxXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBwSXRlbSA9IChQV0xBTl9JRSkoKChQQllURSlwSXRlbSkgKyAyICsgIHBJdGVtLT5sZW4pOwpAQCAtNjk3LDcgKzY5Myw3IEBACiB7CiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKLSAgICAvLyBGaXhlZCBGaWVsZHMKKyAgICAvKiBGaXhlZCBGaWVsZHMgKi8KICAgICBwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfVFMpOwogICAgIHBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC03MzQsNyArNzMwLDcgQEAKIAogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCi0gICAgLy8gRml4ZWQgRmllbGRzCisgICAgLyogRml4ZWQgRmllbGRzICovCiAgICAgcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX1RTKTsKICAgICBwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtNzQyLDgzICs3MzgsODIgQEAKICAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPKTsKIAotICAgIC8vIEluZm9ybWF0aW9uIGVsZW1lbnRzCisgICAgLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KICAgICBwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX1NTSUQpOwogCi0gICAgd2hpbGUoICgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSApIHsKKyAgICB3aGlsZSAoKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSB7CiAgICAgICAgIHN3aXRjaCAocEl0ZW0tPmJ5RWxlbWVudElEKSB7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1NTSUQ6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFNTSUQgPT0gTlVMTCkKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9TU0lEOgorICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFNTSUQgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBwRnJhbWUtPnBTU0lEID0gKFBXTEFOX0lFX1NTSUQpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBTdXBwUmF0ZXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBwRnJhbWUtPnBTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfRkhfUEFSTVM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0RTX1BBUk1TOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBEU1Bhcm1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cERTUGFybXMgPSAoUFdMQU5fSUVfRFNfUEFSTVMpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0NGX1BBUk1TOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBDRlBhcm1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cENGUGFybXMgPSAoUFdMQU5fSUVfQ0ZfUEFSTVMpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0lCU1NfUEFSTVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElCU1NQYXJtcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBJQlNTUGFybXMgPSAoUFdMQU5fSUVfSUJTU19QQVJNUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0ZIX1BBUk1TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfRFNfUEFSTVM6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wRFNQYXJtcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cERTUGFybXMgPSAoUFdMQU5fSUVfRFNfUEFSTVMpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9DRl9QQVJNUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBDRlBhcm1zID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wQ0ZQYXJtcyA9IChQV0xBTl9JRV9DRl9QQVJNUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX0lCU1NfUEFSTVM6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUJTU1Bhcm1zID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wSUJTU1Bhcm1zID0gKFBXTEFOX0lFX0lCU1NfUEFSTVMpcEl0ZW07CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9SU046Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cFJTTiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTiA9IChQV0xBTl9JRV9SU04pcEl0ZW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXTEFOX0VJRF9SU05fV1BBOgotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBSU05XUEEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0VSUDoKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wRVJQID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cEVSUCA9IChQV0xBTl9JRV9FUlApcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9SU046CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wUlNOID0gKFBXTEFOX0lFX1JTTilwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1JTTl9XUEE6CisgICAgICAgICAgICBpZiAocEZyYW1lLT5wUlNOV1BBID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoV1BBYl9Jc19SU04oKFBXTEFOX0lFX1JTTl9FWFQpcEl0ZW0pID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cFJTTldQQSA9IChQV0xBTl9JRV9SU05fRVhUKXBJdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfRVJQOgorICAgICAgICAgICAgaWYgKHBGcmFtZS0+cEVSUCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cEVSUCA9IChQV0xBTl9JRV9FUlApcEl0ZW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTOgorICAgICAgICAgICAgaWYgKHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfQ09VTlRSWTogICAgICAvLzcKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUVfQ291bnRyeSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9Db3VudHJ5ID0gKFBXTEFOX0lFX0NPVU5UUlkpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfQ09VTlRSWTogICAgICAvKiA3ICovCisgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUVfQ291bnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX0NvdW50cnkgPSAoUFdMQU5fSUVfQ09VTlRSWSlwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX1BXUl9DT05TVFJBSU5UOiAgIC8vMzIKLSAgICAgICAgICAgICAgICBpZiAocEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9IChQV0xBTl9JRV9QV19DT05TVClwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDogICAvKiAzMiAqLworICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9IChQV0xBTl9JRV9QV19DT05TVClwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIFdMQU5fRUlEX0NIX1NXSVRDSDogICAgLy8zNwotICAgICAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9DSFNXID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX0NIU1cgPSAoUFdMQU5fSUVfQ0hfU1cpcEl0ZW07Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0xBTl9FSURfQ0hfU1dJVENIOiAgICAvKiAzNyAqLworICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX0NIU1cgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwRnJhbWUtPnBJRV9DSFNXID0gKFBXTEFOX0lFX0NIX1NXKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfUVVJRVQ6ICAgICAgICAvLzQwCi0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX1F1aWV0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX1F1aWV0ID0gKFBXTEFOX0lFX1FVSUVUKXBJdGVtOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdMQU5fRUlEX1FVSUVUOiAgICAgICAgLyogNDAgKi8KKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9RdWlldCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBGcmFtZS0+cElFX1F1aWV0ID0gKFBXTEFOX0lFX1FVSUVUKXBJdGVtOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgV0xBTl9FSURfSUJTU19ERlM6Ci0gICAgICAgICAgICAgICAgaWYgKHBGcmFtZS0+cElFX0lCU1NERlMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcEZyYW1lLT5wSUVfSUJTU0RGUyA9IChQV0xBTl9JRV9JQlNTX0RGUylwSXRlbTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTEFOX0VJRF9JQlNTX0RGUzoKKyAgICAgICAgICAgIGlmIChwRnJhbWUtPnBJRV9JQlNTREZTID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEZyYW1lLT5wSUVfSUJTU0RGUyA9IChQV0xBTl9JRV9JQlNTX0RGUylwSXRlbTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVzcFxuIiwgcEl0ZW0tPmJ5RWxlbWVudElEKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVzcFxuIiwgcEl0ZW0tPmJ5RWxlbWVudElEKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgcEl0ZW0gPSAoUFdMQU5fSUUpKCgoUEJZVEUpcEl0ZW0pICsgMiArICBwSXRlbS0+bGVuKTsKQEAgLTg0NSw3ICs4NDAsNyBAQAogewogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCi0gICAgLy8gRml4ZWQgRmllbGRzCisgICAgLyogRml4ZWQgRmllbGRzICovCiAgICAgcEZyYW1lLT5wd0F1dGhBbGdvcml0aG0gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7CiAgICAgcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC04NTMsNyArODQ4LDYgQEAKICAgICBwRnJhbWUtPnB3U3RhdHVzID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9TVEFUVVMpOwogICAgIHBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyArIHNpemVvZigqKHBGcmFtZS0+cHdTdGF0dXMpKTsKLQogICAgIHJldHVybjsKIH0KIApAQCAtODc4LDcgKzg3Miw3IEBACiAKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOwogICAgIHBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtODg2LDE0ICs4ODAsMTIgQEAKICAgICBwRnJhbWUtPnB3U3RhdHVzID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fQVVUSEVOX09GRl9TVEFUVVMpOwogCi0gICAgLy8gSW5mb3JtYXRpb24gZWxlbWVudHMKKyAgICAvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwogICAgIHBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQ0hBTExFTkdFKTsKIAotICAgIGlmICgoKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSAmJiAocEl0ZW0tPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0NIQUxMRU5HRSkpIHsKKyAgICBpZiAoKCgoUEJZVEUpcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgJiYgKHBJdGVtLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9DSEFMTEVOR0UpKQogICAgICAgICBwRnJhbWUtPnBDaGFsbGVuZ2UgPSAoUFdMQU5fSUVfQ0hBTExFTkdFKXBJdGVtOwotICAgIH0KLQogICAgIHJldHVybjsKIH0KIApAQCAtOTE2LDExICs5MDgsMTAgQEAKIHsKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdSZWFzb24gPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OKTsKICAgICBwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fREVBVVRIRU5fT0ZGX1JFQVNPTiArIHNpemVvZigqKHBGcmFtZS0+cHdSZWFzb24pKTsKLQogICAgIHJldHVybjsKIH0KIApAQCAtOTQzLDEwICs5MzQsOSBAQAogewogICAgIHBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCi0gICAgLy8gRml4ZWQgRmllbGRzCisgICAgLyogRml4ZWQgRmllbGRzICovCiAgICAgcEZyYW1lLT5wd1JlYXNvbiA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOwotCiAgICAgcmV0dXJuOwogfQogCkBAIC05NjksNyArOTU5LDcgQEAKIHsKICAgICBwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAotICAgIC8vIEZpeGVkIEZpZWxkcworICAgIC8qIEZpeGVkIEZpZWxkcyAqLwogICAgIHBGcmFtZS0+cHdDYXBJbmZvID0gKFBXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7CiAgICAgcEZyYW1lLT5wd1N0YXR1cyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC05NzgsNyArOTY4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKICAgICBwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCArIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKLQogICAgIHJldHVybjsKIH0KIApAQCAtMTAwNCw3ICs5OTMsNyBAQAogCiAgICAgcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKLSAgICAvLyBGaXhlZCBGaWVsZHMKKyAgICAvKiBGaXhlZCBGaWVsZHMgKi8KICAgICBwRnJhbWUtPnB3Q2FwSW5mbyA9IChQV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwogICAgIHBGcmFtZS0+cHdTdGF0dXMgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtMTAxMiwxNSArMTAwMSwxNCBAQAogICAgIHBGcmFtZS0+cHdBaWQgPSAoUFdPUkQpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfQUlEKTsKIAotICAgIC8vSW5mb3JtYXRpb24gZWxlbWVudHMKKyAgICAvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwogICAgIHBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTKTsKIAogICAgIHBJdGVtID0gKFBXTEFOX0lFKShwRnJhbWUtPnBTdXBwUmF0ZXMpOwogICAgIHBJdGVtID0gKFBXTEFOX0lFKSgoKFBCWVRFKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKIAotICAgIGlmICgoKChQQllURSlwSXRlbSkgPCAocEZyYW1lLT5wQnVmICsgcEZyYW1lLT5sZW4pKSAmJiAocEl0ZW0tPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0VYVFNVUFBfUkFURVMpKSB7CisgICAgaWYgKCgoKFBCWVRFKXBJdGVtKSA8IChwRnJhbWUtPnBCdWYgKyBwRnJhbWUtPmxlbikpICYmIChwSXRlbS0+YnlFbGVtZW50SUQgPT0gV0xBTl9FSURfRVhUU1VQUF9SQVRFUykpCiAgICAgICAgIHBGcmFtZS0+cEV4dFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwotICAgIH0KICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2LzgwMjExbWdyLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2LzgwMjExbWdyLmgKaW5kZXggYzE0MGE5NS4uM2Q1N2Y3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni84MDIxMW1nci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFtZ3IuaApAQCAtMTksNyArMTksNyBAQAogICoKICAqIEZpbGU6IDgwMjExbWdyLmgKICAqCi0gKiBQdXJwb3NlOiA4MDIuMTEgbWFuYWdtZW50IGZyYW1lcyBwcmUtZGVmaW5lcy4KKyAqIFB1cnBvc2U6IDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcyBwcmUtZGVmaW5lcy4KICAqCiAgKgogICogQXV0aG9yOiBMeW5kb24gQ2hlbgpAQCAtMjIyLDQ2ICsyMjIsMzkgQEAKICNkZWZpbmUgTUVBU1VSRV9NT0RFX0lOQ0FQQUJMRSAgMHgwMgogI2RlZmluZSBNRUFTVVJFX01PREVfUkVGVVNFRCAgICAweDA0CiAKLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFR5cGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KIC8vIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMKIAogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0lFIHsKICAgICBCWVRFICAgYnlFbGVtZW50SUQ7CiAgICAgQllURSAgIGxlbjsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUUsICpQV0xBTl9JRTsKIAotCiAvLyBTZXJ2aWNlIFNldCBJZGVudGl0eSAoU1NJRCkKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRV9TU0lEIHsKICAgICBCWVRFICAgYnlFbGVtZW50SUQ7CiAgICAgQllURSAgIGxlbjsKICAgICBCWVRFICAgYWJ5U1NJRFsxXTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfU1NJRCwgKlBXTEFOX0lFX1NTSUQ7CiAKLQogLy8gU3VwcG9ydGVkIFJhdGVzCiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfU1VQUF9SQVRFUyB7CiAgICAgQllURSAgIGJ5RWxlbWVudElEOwogICAgIEJZVEUgICBsZW47CiAgICAgQllURSAgIGFieVJhdGVzWzFdOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl9JRV9TVVBQX1JBVEVTLCAgKlBXTEFOX0lFX1NVUFBfUkFURVM7CiAKLQotCiAvLyBGSCBQYXJhbWV0ZXIgU2V0CiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0lFX0ZIX1BBUk1TIHsKQEAgLTI3OSwxMCArMjcyLDkgQEAKICAgICBCWVRFICAgYnlFbGVtZW50SUQ7CiAgICAgQllURSAgIGxlbjsKICAgICBCWVRFICAgYnlDdXJyQ2hhbm5lbDsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfRFNfUEFSTVMsICAqUFdMQU5fSUVfRFNfUEFSTVM7CiAKLQogLy8gQ0YgUGFyYW1ldGVyIFNldAogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdXTEFOX0lFX0NGX1BBUk1TIHsKQEAgLTI5MiwxMCArMjg0LDkgQEAKICAgICBCWVRFICAgYnlDRlBQZXJpb2Q7CiAgICAgV09SRCAgIHdDRlBNYXhEdXJhdGlvbjsKICAgICBXT1JEICAgd0NGUER1clJlbWFpbmluZzsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfQ0ZfUEFSTVMsICAqUFdMQU5fSUVfQ0ZfUEFSTVM7CiAKLQogLy8gVElNCiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfVElNIHsKQEAgLTMwNSwzMCArMjk2LDI3IEBACiAgICAgQllURSAgIGJ5RFRJTVBlcmlvZDsKICAgICBCWVRFICAgYnlCaXRNYXBDdGw7CiAgICAgQllURSAgIGJ5VmlydEJpdE1hcFsxXTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFdMQU5fSUVfVElNLCAgKlBXTEFOX0lFX1RJTTsKIAotCiAvLyBJQlNTIFBhcmFtZXRlciBTZXQKICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRV9JQlNTX1BBUk1TIHsKICAgICBCWVRFICAgYnlFbGVtZW50SUQ7CiAgICAgQllURSAgIGxlbjsKICAgICBXT1JEICAgd0FUSU1XaW5kb3c7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBXTEFOX0lFX0lCU1NfUEFSTVMsICpQV0xBTl9JRV9JQlNTX1BBUk1TOwogCi0KIC8vIENoYWxsZW5nZSBUZXh0CiAjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0IHRhZ1dMQU5fSUVfQ0hBTExFTkdFIHsKICAgICBCWVRFICAgYnlFbGVtZW50SUQ7CiAgICAgQllURSAgIGxlbjsKICAgICBCWVRFICAgYWJ5Q2hhbGxlbmdlWzFdOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogV0xBTl9JRV9DSEFMTEVOR0UsICAqUFdMQU5fSUVfQ0hBTExFTkdFOwogCi0KICNwcmFnbWEgcGFjaygxKQogdHlwZWRlZiBzdHJ1Y3QgdGFnV0xBTl9JRV9SU05fRVhUIHsKICAgICBCWVRFIGJ5RWxlbWVudElEOwpAQCAtMzkxLDEwICszNzksOSBAQAogICAgIEJZVEUgICBieUVsZW1lbnRJRDsKICAgICBCWVRFICAgbGVuOwogICAgIEJZVEUgICBieUNvbnRleHQ7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBXTEFOX0lFX0VSUCwgICpQV0xBTl9JRV9FUlA7CiAKLQogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCBfTUVBU0VVUkVfUkVRIHsKICAgICBCWVRFICAgICAgICAgICAgICAgIGJ5Q2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYWVzX2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYWVzX2NjbXAuYwppbmRleCBiM2QzNjdiLi5mN2EzYjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Flc19jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9hZXNfY2NtcC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCB4b3JfMTI4KEJZVEUgKmEsIEJZVEUgKmIsIEJZVEUgKm91dCkKK3N0YXRpYyB2b2lkIHhvcl8xMjgoQllURSAqYSwgQllURSAqYiwgQllURSAqb3V0KQogewogCVBEV09SRCBkd1B0ckEgPSAoUERXT1JEKSBhOwogCVBEV09SRCBkd1B0ckIgPSAoUERXT1JEKSBiOwpAQCAtMTE5LDcgKzExOSw3IEBACiB9CiAKIAotdm9pZCB4b3JfMzIoQllURSAqYSwgQllURSAqYiwgQllURSAqb3V0KQorc3RhdGljIHZvaWQgeG9yXzMyKEJZVEUgKmEsIEJZVEUgKmIsIEJZVEUgKm91dCkKIHsKIAlQRFdPUkQgZHdQdHJBID0gKFBEV09SRCkgYTsKIAlQRFdPUkQgZHdQdHJCID0gKFBEV09SRCkgYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYwppbmRleCBkM2RlOTRmLi4yOTkwMjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCkBAIC05ODksMTAgKzk4OSwxMCBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi1CT09MCi1CQmJWVDMxODRJbml0IChQU0RldmljZSBwRGV2aWNlKQorCitCT09MIEJCYlZUMzE4NEluaXQoUFNEZXZpY2UgcERldmljZSkKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKKwlpbnQgbnRTdGF0dXM7CiAgICAgV09SRCAgICAgICAgICAgICAgICAgICAgd0xlbmd0aDsKICAgICBQQllURSAgICAgICAgICAgICAgICAgICBwYnlBZGRyOwogICAgIFBCWVRFICAgICAgICAgICAgICAgICAgIHBieUFnYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaAppbmRleCBiYzQ2MzNkLi44ZGI4Y2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5oCkBAIC0xMDQsMTYgKzEwNCwxMyBAQAogICAgICBXT1JEIHdSYXRlCiAgICAgKTsKIAotdm9pZAotQkJ2Q2FjdWxhdGVQYXJhbWV0ZXIgKAotICAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICAgIHVuc2lnbmVkIGludCBjYkZyYW1lTGVuZ3RoLAotICAgICAgV09SRCB3UmF0ZSwKLSAgICAgIEJZVEUgYnlQYWNrZXRUeXBlLAotICAgICBQV09SRCBwd1BoeUxlbiwKLSAgICAgUEJZVEUgcGJ5UGh5U3J2LAotICAgICBQQllURSBwYnlQaHlTZ24KLSAgICApOwordm9pZCBCQnZDYWN1bGF0ZVBhcmFtZXRlcihQU0RldmljZSBwRGV2aWNlLAorCQkJICB1bnNpZ25lZCBpbnQgY2JGcmFtZUxlbmd0aCwKKwkJCSAgV09SRCB3UmF0ZSwKKwkJCSAgQllURSBieVBhY2tldFR5cGUsCisJCQkgIFBXT1JEIHB3UGh5TGVuLAorCQkJICBQQllURSBwYnlQaHlTcnYsCisJCQkgIFBCWVRFIHBieVBoeVNnbik7CiAKIC8vIHRpbWVyIGZvciBhbnRlbm5hIGRpdmVyc2l0eQogCkBAIC0xMjgsNyArMTI1LDcgQEAKIHZvaWQgQkJ2U2V0U2hvcnRTbG90VGltZShQU0RldmljZSBwRGV2aWNlKTsKIHZvaWQgQkJ2U2V0VkdBR2Fpbk9mZnNldChQU0RldmljZSBwRGV2aWNlLCBCWVRFIGJ5RGF0YSk7CiB2b2lkIEJCdlNldEFudGVubmFNb2RlKFBTRGV2aWNlIHBEZXZpY2UsIEJZVEUgYnlBbnRlbm5hTW9kZSk7Ci1CT09MIEJCYlZUMzE4NEluaXQgKFBTRGV2aWNlIHBEZXZpY2UpOworQk9PTCBCQmJWVDMxODRJbml0KFBTRGV2aWNlIHBEZXZpY2UpOwogdm9pZCBCQnZTZXREZWVwU2xlZXAoUFNEZXZpY2UgcERldmljZSk7CiB2b2lkIEJCdkV4aXREZWVwU2xlZXAoUFNEZXZpY2UgcERldmljZSk7CiB2b2lkIEJCdlVwZGF0ZVByZUVEVGhyZXNob2xkKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ic3NkYi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ic3NkYi5jCmluZGV4IDM2ZWQ2MWIuLmE5ZjY4YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYnNzZGIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jzc2RiLmMKQEAgLTkzLDEwICs5Myw3IEBACiAKIHZvaWQgc192Q2hlY2tTZW5zaXRpdml0eSh2b2lkICpoRGV2aWNlQ29udGV4dCk7CiB2b2lkIHNfdkNoZWNrUHJlRURUaHJlc2hvbGQodm9pZCAqaERldmljZUNvbnRleHQpOwotCi0jaWZkZWYgQ2FsY3VfTGlua1F1YWwKIHZvaWQgc191Q2FsY3VsYXRlTGlua1F1YWwodm9pZCAqaERldmljZUNvbnRleHQpOwotI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTEzNSw3ICsxMzIsNyBAQAogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkJTU3BTZWFyY2hCU1NMaXN0IEJTU0lEWyUwMlggJTAyWCAlMDJYLSUwMlggJTAyWCAlMDJYXVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGJ5RGVzaXJlQlNTSUQsKihwYnlEZXNpcmVCU1NJRCsxKSwqKHBieURlc2lyZUJTU0lEKzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocGJ5RGVzaXJlQlNTSUQrMyksKihwYnlEZXNpcmVCU1NJRCs0KSwqKHBieURlc2lyZUJTU0lEKzUpKTsKLSAgICAgICAgaWYgKCghSVNfQlJPQURDQVNUX0FERFJFU1MocGJ5RGVzaXJlQlNTSUQpKSAmJgorCWlmICgoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBieURlc2lyZUJTU0lEKSkgJiYKIAkgICAgIChtZW1jbXAocGJ5RGVzaXJlQlNTSUQsIFplcm9CU1NJRCwgNikhPSAwKSl7CiAgICAgICAgICAgICBwYnlCU1NJRCA9IHBieURlc2lyZUJTU0lEOwogICAgICAgICB9CkBAIC0xNTYsNyArMTUzLDcgQEAKIAogICAgICAgICAgICAgaWYgKChwQ3VyckJTUy0+YkFjdGl2ZSkgJiYKICAgICAgICAgICAgICAgICAocEN1cnJCU1MtPmJTZWxlY3RlZCA9PSBGQUxTRSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwocEN1cnJCU1MtPmFieUJTU0lELCBwYnlCU1NJRCkpIHsKKwkJICAgIGlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBDdXJyQlNTLT5hYnlCU1NJRCwgcGJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwU1NJRCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHNzaWQKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNtcChwU1NJRC0+YWJ5U1NJRCwKQEAgLTI5Niw3ICsyOTMsOCBAQAogICAgIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7CiAgICAgICAgIGlmIChiS2VlcEN1cnJCU1NJRCkgewogICAgICAgICAgICAgaWYgKHBNZ210LT5zQlNTTGlzdFtpaV0uYkFjdGl2ZSAmJgotICAgICAgICAgICAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5QlNTSUQsIHBNZ210LT5hYnlDdXJyQlNTSUQpKSB7CisJCSFjb21wYXJlX2V0aGVyX2FkZHIocE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlCU1NJRCwKKwkJCQkgICAgcE1nbXQtPmFieUN1cnJCU1NJRCkpIHsKICAvL21pa2UgbWFyazogdGhlcmUgYXJlIHR3byBzYW1lIEJTU0lEIGluIGxpc3QgaWYgdGhhdCBBUCBpcyBpbiBoaWRkZW4gc3NpZCBtb2RlLG9uZSAncyBTU0lEIGlzIG51bGwsCiAgLy8gICAgICAgICAgICAgICAgIGJ1dCBvdGhlcidzIGlzIG9idmlvdXMsIHNvIGlmIGl0IGFjc3NvY2lhdGUgd2l0aCB5b3VyIFNUQSAgZXhhY3RseSx5b3UgbXVzdCBrZWVwIHR3bwogIC8vICAgICAgICAgICAgICAgICBvZiB0aGVtISEhISEhISEhCkBAIC0zNDEsNyArMzM5LDcgQEAKICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewogICAgICAgICBwQlNTTGlzdCA9ICYocE1nbXQtPnNCU1NMaXN0W2lpXSk7CiAgICAgICAgIGlmIChwQlNTTGlzdC0+YkFjdGl2ZSkgewotICAgICAgICAgICAgaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMKHBCU1NMaXN0LT5hYnlCU1NJRCwgYWJ5QlNTSUQpKSB7CisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBCU1NMaXN0LT5hYnlCU1NJRCwgYWJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBTU0lELT5sZW4gPT0gKChQV0xBTl9JRV9TU0lEKXBCU1NMaXN0LT5hYnlTU0lEKS0+bGVuKXsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChwU1NJRC0+YWJ5U1NJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBXTEFOX0lFX1NTSUQpcEJTU0xpc3QtPmFieVNTSUQpLT5hYnlTU0lELApAQCAtNjk5LDEyICs2OTcsMTQgQEAKICAgICAgICAgcEJTU0xpc3QtPmJ5UlNTSVN0YXRDbnQgJT0gUlNTSV9TVEFUX0NPVU5UOwogICAgICAgICBwQlNTTGlzdC0+bGRCbUF2ZXJhZ2VbcEJTU0xpc3QtPmJ5UlNTSVN0YXRDbnRdID0gbGRCbTsKICAgICAgICAgbGRCbVN1bSA9IDA7Ci0gICAgICAgIGZvcihpaT0wLCBqaj0wO2lpPFJTU0lfU1RBVF9DT1VOVDtpaSsrKSB7Ci0gICAgICAgICAgICBpZiAocEJTU0xpc3QtPmxkQm1BdmVyYWdlW2lpXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcEJTU0xpc3QtPmxkQm1NQVggPSBtYXgocEJTU0xpc3QtPmxkQm1BdmVyYWdlW2lpXSwgbGRCbSk7Ci0gICAgICAgICAgICAgICAgbGRCbVN1bSArPSBwQlNTTGlzdC0+bGRCbUF2ZXJhZ2VbaWldOwotICAgICAgICAgICAgICAgIGpqKys7Ci0gICAgICAgICAgICB9CisJZm9yIChpaSA9IDAsIGpqID0gMDsgaWkgPCBSU1NJX1NUQVRfQ09VTlQ7IGlpKyspIHsKKwkJaWYgKHBCU1NMaXN0LT5sZEJtQXZlcmFnZVtpaV0gIT0gMCkgeworCQkJcEJTU0xpc3QtPmxkQm1NQVggPQorCQkJCW1heChwQlNTTGlzdC0+bGRCbUF2ZXJhZ2VbaWldLCBsZEJtKTsKKwkJCWxkQm1TdW0gKz0KKwkJCQlwQlNTTGlzdC0+bGRCbUF2ZXJhZ2VbaWldOworCQkJamorKzsKKwkJfQogICAgICAgICB9CiAgICAgICAgIHBCU1NMaXN0LT5sZEJtQXZlclJhbmdlID0gbGRCbVN1bSAvamo7CiAgICAgfQpAQCAtNzE0LDI4ICs3MTQsNiBAQAogICAgICAgICBwQlNTTGlzdC0+dUlFTGVuZ3RoID0gV0xBTl9CRUFDT05fRlJfTUFYTEVOOwogICAgIG1lbWNweShwQlNTTGlzdC0+YWJ5SUVzLCBwYnlJRXMsIHBCU1NMaXN0LT51SUVMZW5ndGgpOwogCi0vL21pa2UgYWRkOiBpZiAgdGhlIEFQIGluIHRoaXMgcEJTU0xpc3QgaXMgaGlkZGVuIHNzaWQgYW5kIHdlIGNhbiBmaW5kIHR3byBvZiB0aGVtLAotLy8gICAgICAgICAgICAgICAgICB5b3UgbmVlZCB1cGdyYWRlIHRoZSBvdGhlciByZWxhdGVkIHBCU1NMaXN0IG9mIHdoaWNoIHNzaWQgaXMgb2J2aW91cywKLS8vICAgICAgICAgICAgICAgICAgZm9yIHRoZXNlIHR3byBBUCBpcyB0aGUgc2FtZSBvbmUhISEhCi0vKioqKioqKipqdWRnZSBieTpCU1NJRCBpcyB0aGUgc2FtZSxidXQgc3NpZCBpcyBkaWZmZXJlbnQhKioqKioqKioqKioqKioqKiovCi0jaWYgMAotICAgZm9yIChpaSA9IDA7IGlpIDwgTUFYX0JTU19OVU07IGlpKyspIHsKLSAgICAgIGlmIChJU19FVEhfQUREUkVTU19FUVVBTChwTWdtdC0+c0JTU0xpc3RbaWldLmFieUJTU0lELCBwQlNTTGlzdC0+YWJ5QlNTSUQpKSB7ICAgLy9CU1NJRCBpcyB0aGUgc2FtZSEKLSAgICAgICAgIGlmIChtZW1jbXAoKChQV0xBTl9JRV9TU0lEKXBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5U1NJRCktPmFieVNTSUQsICAgICAgICAgICAgICAgICAgLy9zc2lkIGlzIGRpZmZlcmVudD8/Ci0JCSAJICAgICAgKChQV0xBTl9JRV9TU0lEKXBCU1NMaXN0LT5hYnlTU0lEKS0+YWJ5U1NJRCwKLQkJIAkgICAgICAoKFBXTEFOX0lFX1NTSUQpcEJTU0xpc3QtPmFieVNTSUQpLT5sZW4pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgIC8vcmVzZXJ2ZSB0ZW1wCi0gICAgICAgICAgICAgICBtZW1zZXQoYWJ5VG1wU1NJRCwwLHNpemVvZihhYnlUbXBTU0lEKSk7Ci0JICAgICAgbWVtY3B5KGFieVRtcFNTSUQscE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlTU0lELHNpemVvZihhYnlUbXBTU0lEKSk7Ci0JCSAgLy91cGdyYWRlIHRoZSBvdGhlciBvbmUgcEJTU0xpc3QKLQkgICAgICBtZW1jcHkoJihwTWdtdC0+c0JTU0xpc3RbaWldKSxwQlNTTGlzdCxzaXplb2YoS25vd25CU1MpKTsKLQkJICAvL3JlY292ZXIgc3NpZCBpbmZvCi0JICAgICAgbWVtY3B5KHBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5U1NJRCxhYnlUbXBTU0lELHNpemVvZihhYnlUbXBTU0lEKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNzU1LDcgKzczMyw3IEBACiAKIEJPT0wgQlNTYklzU1RBSW5Ob2RlREIodm9pZCAqaERldmljZUNvbnRleHQsCiAJCSAgICAgICBQQllURSBhYnlEc3RBZGRyLAotCQkgICAgICAgUFVJTlQgcHVOb2RlSW5kZXgpCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1Tm9kZUluZGV4KQogewogICAgIFBTRGV2aWNlICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwpAQCAtNzY0LDcgKzc0Miw4IEBACiAgICAgLy8gSW5kZXggPSAwIHJlc2VydmVkIGZvciBBUCBOb2RlCiAgICAgZm9yIChpaSA9IDE7IGlpIDwgKE1BWF9OT0RFX05VTSArIDEpOyBpaSsrKSB7CiAgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlW2lpXS5iQWN0aXZlKSB7Ci0gICAgICAgICAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwoYWJ5RHN0QWRkciwgcE1nbXQtPnNOb2RlREJUYWJsZVtpaV0uYWJ5TUFDQWRkcikpIHsKKwkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoYWJ5RHN0QWRkciwKKwkJCQkJcE1nbXQtPnNOb2RlREJUYWJsZVtpaV0uYWJ5TUFDQWRkcikpIHsKICAgICAgICAgICAgICAgICAqcHVOb2RlSW5kZXggPSBpaTsKICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KQEAgLTc4Niw3ICs3NjUsNyBAQAogICogICAgTm9uZQogICoKIC0qLwotdm9pZCBCU1N2Q3JlYXRlT25lTm9kZSh2b2lkICpoRGV2aWNlQ29udGV4dCwgUFVJTlQgcHVOb2RlSW5kZXgpCit2b2lkIEJTU3ZDcmVhdGVPbmVOb2RlKHZvaWQgKmhEZXZpY2VDb250ZXh0LCB1bnNpZ25lZCBpbnQgKnB1Tm9kZUluZGV4KQogewogCiAgICAgUFNEZXZpY2UgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpaERldmljZUNvbnRleHQ7CkBAIC0xMDIzLDcgKzEwMDIsNiBAQAogICAgCXBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKIH0KIAotI2lmZGVmIFNuZEV2dF9Ub0FQSQogaWYoKHBNZ210LT5lQ3VyclN0YXRlIT1XTUFDX1NUQVRFX0FTU09DKSAmJgogICAgICAocE1nbXQtPmVMYXN0U3RhdGU9PVdNQUNfU1RBVEVfQVNTT0MpKQogewpAQCAtMTAzMywxMSArMTAxMSw4IEBACiAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocERldmljZS0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CiB9CiAgcE1nbXQtPmVMYXN0U3RhdGUgPSBwTWdtdC0+ZUN1cnJTdGF0ZSA7Ci0jZW5kaWYKIAotI2lmZGVmIENhbGN1X0xpbmtRdWFsCiAgICBzX3VDYWxjdWxhdGVMaW5rUXVhbCgodm9pZCAqKXBEZXZpY2UpOwotI2VuZGlmCiAKICAgICBmb3IgKGlpID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKIApAQCAtMTQyMiwyMSArMTM5NywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgKHdSYXRlIDwgUkFURV8xOE0pICkgewogICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLnVUeEZhaWxbd1JhdGVdKz1ieVR4UmV0cnk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieUZhbGxCYWNrID09IEFVVE9fRkJfMCkgewotICAgICAgICAgICAgICAgICAgICBmb3IoaWk9MDtpaTxieVR4UmV0cnk7aWkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlpIDwgNSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RmFsbEJhY2tSYXRlID0gYXdIV1JldHJ5MFt3UmF0ZS1SQVRFXzE4TV1baWldOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGYWxsQmFja1JhdGUgPSBhd0hXUmV0cnkwW3dSYXRlLVJBVEVfMThNXVs0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0udVR4RmFpbFt3RmFsbEJhY2tSYXRlXSsrOwotICAgICAgICAgICAgICAgICAgICB9CisJCQlmb3IgKGlpID0gMDsgaWkgPCBieVR4UmV0cnk7IGlpKyspIHsKKwkJCQlpZiAoaWkgPCA1KQorCQkJCQl3RmFsbEJhY2tSYXRlID0KKwkJCQkJCWF3SFdSZXRyeTBbd1JhdGUtUkFURV8xOE1dW2lpXTsKKwkJCQllbHNlCisJCQkJCXdGYWxsQmFja1JhdGUgPQorCQkJCQkJYXdIV1JldHJ5MFt3UmF0ZS1SQVRFXzE4TV1bNF07CisJCQkJcE1nbXQtPnNOb2RlREJUYWJsZVswXS51VHhGYWlsW3dGYWxsQmFja1JhdGVdKys7CisJCQl9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieUZhbGxCYWNrID09IEFVVE9fRkJfMSkgewotICAgICAgICAgICAgICAgICAgICBmb3IoaWk9MDtpaTxieVR4UmV0cnk7aWkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlpIDwgNSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RmFsbEJhY2tSYXRlID0gYXdIV1JldHJ5MVt3UmF0ZS1SQVRFXzE4TV1baWldOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGYWxsQmFja1JhdGUgPSBhd0hXUmV0cnkxW3dSYXRlLVJBVEVfMThNXVs0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0udVR4RmFpbFt3RmFsbEJhY2tSYXRlXSsrOwotICAgICAgICAgICAgICAgICAgICB9CisJCQlmb3IgKGlpID0gMDsgaWkgPCBieVR4UmV0cnk7IGlpKyspIHsKKwkJCQlpZiAoaWkgPCA1KQorCQkJCQl3RmFsbEJhY2tSYXRlID0KKwkJCQkJCWF3SFdSZXRyeTFbd1JhdGUtUkFURV8xOE1dW2lpXTsKKwkJCQllbHNlCisJCQkJCXdGYWxsQmFja1JhdGUgPQorCQkJCQkJYXdIV1JldHJ5MVt3UmF0ZS1SQVRFXzE4TV1bNF07CisJCQkJcE1nbXQtPnNOb2RlREJUYWJsZVswXS51VHhGYWlsW3dGYWxsQmFja1JhdGVdKys7CisJCQl9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtMTQ3NiwyMSArMTQ1NSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICh3UmF0ZSA8IFJBVEVfMThNKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0udVR4RmFpbFt3UmF0ZV0rPWJ5VHhSZXRyeTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieUZhbGxCYWNrID09IEFVVE9fRkJfMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGlpPTA7aWk8YnlUeFJldHJ5O2lpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPCA1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3RmFsbEJhY2tSYXRlID0gYXdIV1JldHJ5MFt3UmF0ZS1SQVRFXzE4TV1baWldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0ZhbGxCYWNrUmF0ZSA9IGF3SFdSZXRyeTBbd1JhdGUtUkFURV8xOE1dWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0udVR4RmFpbFt3RmFsbEJhY2tSYXRlXSsrOworCQkJZm9yIChpaSA9IDA7IGlpIDwgYnlUeFJldHJ5OyBpaSsrKSB7CisJCQkJaWYgKGlpIDwgNSkKKwkJCQkJd0ZhbGxCYWNrUmF0ZSA9CisJCQkJCQlhd0hXUmV0cnkwW3dSYXRlLVJBVEVfMThNXVtpaV07CisJCQkJZWxzZQorCQkJCQl3RmFsbEJhY2tSYXRlID0KKwkJCQkJCWF3SFdSZXRyeTBbd1JhdGUtUkFURV8xOE1dWzRdOworCQkJCXBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0udVR4RmFpbFt3RmFsbEJhY2tSYXRlXSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5RmFsbEJhY2sgPT0gQVVUT19GQl8xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaWk9MDtpaTxieVR4UmV0cnk7aWkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpaSA8IDUpCisJCSAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGJ5VHhSZXRyeTsgaWkrKykgeworCQkJaWYgKGlpIDwgNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0ZhbGxCYWNrUmF0ZSA9IGF3SFdSZXRyeTFbd1JhdGUtUkFURV8xOE1dW2lpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQllbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGYWxsQmFja1JhdGUgPSBhd0hXUmV0cnkxW3dSYXRlLVJBVEVfMThNXVs0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLnVUeEZhaWxbd0ZhbGxCYWNrUmF0ZV0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCXBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0udVR4RmFpbFt3RmFsbEJhY2tSYXRlXSsrOworCQkgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwpAQCAtMTU4Nyw3ICsxNTY4LDYgQEAKICAgICB9CiB9CiAKLSNpZmRlZiBDYWxjdV9MaW5rUXVhbAogdm9pZCBzX3VDYWxjdWxhdGVMaW5rUXVhbCh2b2lkICpoRGV2aWNlQ29udGV4dCkKIHsKICAgIFBTRGV2aWNlICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwpAQCAtMTYzMiw3ICsxNjEyLDYgQEAKICAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLlR4UmV0cnlPa0NvdW50ID0gMDsKICAgIHJldHVybjsKIH0KLSNlbmRpZgogCiB2b2lkIEJTU3ZDbGVhckFueUJTU0pvaW5SZWNvcmQodm9pZCAqaERldmljZUNvbnRleHQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jzc2RiLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jzc2RiLmgKaW5kZXggOTY4NmQ4Ni4uYThmOTdlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ic3NkYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYnNzZGIuaApAQCAtNDAsNyArNDAsNyBAQAogCiAjZGVmaW5lIE1BWF9OT0RFX05VTSAgICAgICAgICAgICA2NAogI2RlZmluZSBNQVhfQlNTX05VTSAgICAgICAgICAgICAgNDIKLSNkZWZpbmUgTE9TVF9CRUFDT05fQ09VTlQgICAgICAJIDEwICAgLy8gMTAgc2VjLCBYUCBkZWZpbmVkCisjZGVmaW5lIExPU1RfQkVBQ09OX0NPVU5UICAgICAgICAxMCAgIC8qIDEwIHNlYywgWFAgZGVmaW5lZCAqLwogI2RlZmluZSBNQVhfUFNfVFhfQlVGICAgICAgICAgICAgMzIgICAvLyBzdGEgbWF4IHBvd2VyIHNhdmluZyB0eCBidWYKICNkZWZpbmUgQURIT0NfTE9TVF9CRUFDT05fQ09VTlQgIDMwICAgLy8gMzAgc2VjLCBiZWFjb24gbG9zdCBmb3IgYWRob2Mgb25seQogI2RlZmluZSBNQVhfSU5BQ1RJVkVfQ09VTlQgICAgICAgMzAwICAvLyAzMDAgc2VjLCBpbmFjdGl2ZSBTVEEgbm9kZSByZWZyZXNoCkBAIC04MywxMyArODMsMTMgQEAKIHR5cGVkZWYgc3RydWN0IHRhZ1NFUlBPYmplY3QgewogICAgIEJPT0wgICAgYkVSUEV4aXN0OwogICAgIEJZVEUgICAgYnlFUlA7Ci19RVJQT2JqZWN0LCAqUEVSUE9iamVjdDsKK30gRVJQT2JqZWN0LCAqUEVSUE9iamVjdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlNOQ2FwT2JqZWN0IHsKICAgICBCT09MICAgIGJSU05DYXBFeGlzdDsKICAgICBXT1JEICAgIHdSU05DYXA7Ci19U1JTTkNhcE9iamVjdCwgKlBTUlNOQ2FwT2JqZWN0OworfSBTUlNOQ2FwT2JqZWN0LCAqUFNSU05DYXBPYmplY3Q7CiAKIC8vIEJTUyBpbmZvKEFQKQogI3ByYWdtYSBwYWNrKDEpCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICBTUlNOQ2FwT2JqZWN0ICAgc1JTTkNhcE9iajsKICAgICBCWVRFICAgICAgICAgICAgYWJ5SUVzWzEwMjRdOyAgIC8vIGRvbid0IG1vdmUgdGhpcyBmaWVsZCAhIQogCi19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBLbm93bkJTUyAsICpQS25vd25CU1M7CiAKIApAQCAtMjc4LDkgKzI3OCw5IEBACiAKIEJPT0wgQlNTYklzU1RBSW5Ob2RlREIodm9pZCAqaERldmljZUNvbnRleHQsCiAJCSAgICAgICBQQllURSBhYnlEc3RBZGRyLAotCQkgICAgICAgUFVJTlQgcHVOb2RlSW5kZXgpOworCQkgICAgICAgdW5zaWduZWQgaW50ICpwdU5vZGVJbmRleCk7CiAKLXZvaWQgQlNTdkNyZWF0ZU9uZU5vZGUodm9pZCAqaERldmljZUNvbnRleHQsIFBVSU5UIHB1Tm9kZUluZGV4KTsKK3ZvaWQgQlNTdkNyZWF0ZU9uZU5vZGUodm9pZCAqaERldmljZUNvbnRleHQsIHVuc2lnbmVkIGludCAqcHVOb2RlSW5kZXgpOwogCiB2b2lkIEJTU3ZVcGRhdGVBUE5vZGUodm9pZCAqaERldmljZUNvbnRleHQsCiAJCSAgICAgIFBXT1JEIHB3Q2FwSW5mbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmMKaW5kZXggZmU0ZWM5MS4uMzViZjRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmMKQEAgLTQ1NywxMiArNDU3LDExIEBACiAgICAgYWJ5RGF0YVsxNF0gPSBhYnlTaWduYWxbM107CiAgICAgYWJ5RGF0YVsxNV0gPSBhYnlTZXJ2WzNdOwogCi0gICAgZm9yKGk9MDtpPDk7aSsrKSB7Ci0gICAgICAgIGFieURhdGFbMTYraSoyXSA9IGFieVR4UmF0ZVtpXTsKLSAgICAgICAgYWJ5RGF0YVsxNitpKjIrMV0gPSBhYnlSc3ZUaW1lW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwlhYnlEYXRhWzE2K2kqMl0gPSBhYnlUeFJhdGVbaV07CisJYWJ5RGF0YVsxNitpKjIrMV0gPSBhYnlSc3ZUaW1lW2ldOwogICAgIH0KIAotCiAgICAgQ09OVFJPTG5zUmVxdWVzdE91dChwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9UWVBFX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1JFR19SU1BJTkZfQl8xLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYwppbmRleCBmNDliNmUxLi42YWQwM2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYwpAQCAtNDQxLDExICs0NDEsMTAgQEAKIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKICAgICBCT09MICAgICAgICBiTXVsdGlCYW5kID0gRkFMU0U7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICBpaTsKKyAgICB1bnNpZ25lZCBpbnQgaWk7CiAKLSAgICBmb3IoaWk9MTtpaTw9Q0JfTUFYX0NIQU5ORUw7aWkrKykgewotICAgICAgICBzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID0gRkFMU0U7Ci0gICAgfQorICAgIGZvciAoaWkgPSAxOyBpaSA8PSBDQl9NQVhfQ0hBTk5FTDsgaWkrKykKKwlzQ2hhbm5lbFRibFtpaV0uYlZhbGlkID0gRkFMU0U7CiAKICAgICBzd2l0Y2ggKHBEZXZpY2UtPmJ5UkZUeXBlKSB7CiAgICAgICAgIGNhc2UgUkZfQUwyMjMwOgpAQCAtNDY0LDQzICs0NjMsNDMgQEAKICAgICBpZiAoKHBEZXZpY2UtPmR3RGlhZ1JlZkNvdW50ICE9IDApIHx8CiAgICAgICAgIChwRGV2aWNlLT5iMTFoRWFibGUgPT0gVFJVRSkpIHsKICAgICAgICAgaWYgKGJNdWx0aUJhbmQgPT0gVFJVRSkgewotICAgICAgICAgICAgZm9yKGlpPTA7aWk8Q0JfTUFYX0NIQU5ORUw7aWkrKykgewotICAgICAgICAgICAgICAgIHNDaGFubmVsVGJsW2lpKzFdLmJWYWxpZCA9IFRSVUU7CisJCWZvciAoaWkgPSAwOyBpaSA8IENCX01BWF9DSEFOTkVMOyBpaSsrKSB7CisJCQlzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSBUUlVFOwogICAgICAgICAgICAgICAgIC8vcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gcERldmljZS0+YWJ5T0ZETURlZmF1bHRQd3JbaWkrMV07CiAgICAgICAgICAgICAgICAgLy9wRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IHBEZXZpY2UtPmFieU9GRE1EZWZhdWx0UHdyW2lpKzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGlpPTA7aWk8Q0JfTUFYX0NIQU5ORUxfMjRHO2lpKyspIHsKKwkJfQorCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9NQVhfQ0hBTk5FTF8yNEc7IGlpKyspIHsKICAgICAgICAgICAgICAgICAvL3BEZXZpY2UtPmFieVJlZ1B3cltpaSsxXSA9IHBEZXZpY2UtPmFieUNDS0RlZmF1bHRQd3JbaWkrMV07CiAgICAgICAgICAgICAgICAgLy9wRGV2aWNlLT5hYnlMb2NhbFB3cltpaSsxXSA9IHBEZXZpY2UtPmFieUNDS0RlZmF1bHRQd3JbaWkrMV07Ci0gICAgICAgICAgICB9CisJCX0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcihpaT0wO2lpPENCX01BWF9DSEFOTkVMXzI0RztpaSsrKSB7Ci0gICAgICAgICAgICAgICAgc0NoYW5uZWxUYmxbaWkrMV0uYlZhbGlkID0gVFJVRTsKKwkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfTUFYX0NIQU5ORUxfMjRHOyBpaSsrKSB7CisJCQlzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSBUUlVFOwogICAgICAgICAgICAgICAgIC8vcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gcERldmljZS0+YWJ5Q0NLRGVmYXVsdFB3cltpaSsxXTsKICAgICAgICAgICAgICAgICAvL3BEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gcERldmljZS0+YWJ5Q0NLRGVmYXVsdFB3cltpaSsxXTsKLSAgICAgICAgICAgIH0KKwkJfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChwRGV2aWNlLT5ieVpvbmVUeXBlIDw9IENDT0RFX01BWCkgewogICAgICAgICBpZiAoYk11bHRpQmFuZCA9PSBUUlVFKSB7Ci0gICAgICAgICAgICBmb3IoaWk9MDtpaTxDQl9NQVhfQ0hBTk5FTDtpaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSBUUlVFOworCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9NQVhfQ0hBTk5FTDsgaWkrKykgeworCQkJaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gIT0gMCkgeworCQkJCXNDaGFubmVsVGJsW2lpKzFdLmJWYWxpZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgIC8vcERldmljZS0+YWJ5UmVnUHdyW2lpKzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07CiAgICAgICAgICAgICAgICAgICAgIC8vcERldmljZS0+YWJ5TG9jYWxQd3JbaWkrMV0gPSBDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5ieVBvd2VyW2lpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisJCQl9CisJCX0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcihpaT0wO2lpPENCX01BWF9DSEFOTkVMXzI0RztpaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJDaGFubmVsSWR4TGlzdFtpaV0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSBUUlVFOworCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9NQVhfQ0hBTk5FTF8yNEc7IGlpKyspIHsKKwkJCWlmIChDaGFubmVsUnVsZVRhYltwRGV2aWNlLT5ieVpvbmVUeXBlXS5iQ2hhbm5lbElkeExpc3RbaWldICE9IDApIHsKKwkJCQlzQ2hhbm5lbFRibFtpaSsxXS5iVmFsaWQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAvL3BEZXZpY2UtPmFieVJlZ1B3cltpaSsxXSA9IENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmJ5UG93ZXJbaWldOwogICAgICAgICAgICAgICAgICAgICAvL3BEZXZpY2UtPmFieUxvY2FsUHdyW2lpKzFdID0gQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uYnlQb3dlcltpaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCQkJfQorCQl9CiAgICAgICAgIH0KICAgICB9CiAgICAgREJHX1BSVChNU0dfTEVWRUxfTk9USUNFLCBLRVJOX0lORk8iWm9uZT1bJWRdWyVjXVslY10hIVxuIixwRGV2aWNlLT5ieVpvbmVUeXBlLENoYW5uZWxSdWxlVGFiW3BEZXZpY2UtPmJ5Wm9uZVR5cGVdLmNoQ291bnRyeUNvZGVbMF0sQ2hhbm5lbFJ1bGVUYWJbcERldmljZS0+Ynlab25lVHlwZV0uY2hDb3VudHJ5Q29kZVsxXSk7Ci0gICAgZm9yKGlpPTA7aWk8Q0JfTUFYX0NIQU5ORUw7aWkrKykgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IENCX01BWF9DSEFOTkVMOyBpaSsrKSB7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQ2hhbm5lbFslZF0gaXMgWyVkXVxuIixzQ2hhbm5lbFRibFtpaV0uYnlDaGFubmVsTnVtYmVyLHNDaGFubmVsVGJsW2lpKzFdLmJWYWxpZCk7CiAgICAgICAgIC8qaWYgKHBEZXZpY2UtPmFieVJlZ1B3cltpaSsxXSA9PSAwKSB7CiAgICAgICAgICAgICBwRGV2aWNlLT5hYnlSZWdQd3JbaWkrMV0gPSBwRGV2aWNlLT5hYnlPRkRNRGVmYXVsdFB3cltpaSsxXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jaGFubmVsLmgKaW5kZXggOTFjMmZmYy4uZTdiM2MxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jaGFubmVsLmgKQEAgLTM1LDIzICszNSwyMSBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogdHlwZWRlZiBzdHJ1Y3QgdGFnU0NoYW5uZWxUYmxFbGVtZW50IHsKICAgICBCWVRFICAgIGJ5Q2hhbm5lbE51bWJlcjsKICAgICB1bnNpZ25lZCBpbnQgICAgdUZyZXF1ZW5jeTsKICAgICBCT09MICAgIGJWYWxpZDsKLX1TQ2hhbm5lbFRibEVsZW1lbnQsICpQU0NoYW5uZWxUYmxFbGVtZW50OworfSBTQ2hhbm5lbFRibEVsZW1lbnQsICpQU0NoYW5uZWxUYmxFbGVtZW50OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiBCT09MICAgIENoYW5uZWxWYWxpZCh1bnNpZ25lZCBpbnQgQ291bnRyeUNvZGUsIHVuc2lnbmVkIGludCBDaGFubmVsTnVtKTsKIHZvaWQgICAgQ0h2SW5pdENoYW5uZWxUYWJsZSh2b2lkICpwRGV2aWNlSGFuZGxlcik7CiBCWVRFICAgIENIYnlHZXRDaGFubmVsTWFwcGluZyhCWVRFIGJ5Q2hhbm5lbE51bWJlcik7CiAKLUJPT0wKLUNIdkNoYW5uZWxHZXRMaXN0ICgKLSAgICAgIHVuc2lnbmVkIGludCAgICAgICB1Q291bnRyeUNvZGVJZHgsCi0gICAgIFBCWVRFICAgICAgcGJ5Q2hhbm5lbFRhYmxlCi0gICAgKTsKK0JPT0wgQ0h2Q2hhbm5lbEdldExpc3QodW5zaWduZWQgaW50IHVDb3VudHJ5Q29kZUlkeCwgUEJZVEUgcGJ5Q2hhbm5lbFRhYmxlKTsKIAotI2VuZGlmICAvKiBfUkVHVUxBVEVfSF8gKi8KKyNlbmRpZiAgLyogX0NIQU5ORUxfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jb250cm9sLmMKaW5kZXggOGFhYjY3MS4uNWQ4YzU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jb250cm9sLmMKQEAgLTcyLDcgKzcyLDcgQEAKIHZvaWQgQ29udHJvbHZSZWFkQnl0ZShQU0RldmljZSBwRGV2aWNlLCBCWVRFIGJ5UmVnVHlwZSwgQllURSBieVJlZ09mcywKIAkJCVBCWVRFIHBieURhdGEpCiB7Ci0JTlRTVEFUVVMJbnRTdGF0dXM7CisJaW50IG50U3RhdHVzOwogCUJZVEUJYnlEYXRhMTsKIAludFN0YXR1cyA9IENPTlRST0xuc1JlcXVlc3RJbihwRGV2aWNlLAogCQkJCQlNRVNTQUdFX1RZUEVfUkVBRCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY29udHJvbC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jb250cm9sLmgKaW5kZXggMTQ2YjQ1MC4uYmJlNjEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jb250cm9sLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jb250cm9sLmgKQEAgLTM2LDE2ICszNiwxNCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjZGVmaW5lIENPTlRST0xuc1JlcXVlc3RPdXQoRGV2aWNlLCBSZXF1ZXN0LCBWYWx1ZSwgSW5kZXgsIExlbmd0aCwgQnVmZmVyKSBcCisJUElQRW5zQ29udHJvbE91dChEZXZpY2UsIFJlcXVlc3QsIFZhbHVlLCBJbmRleCwgTGVuZ3RoLCBCdWZmZXIpCiAKLSNkZWZpbmUgQ09OVFJPTG5zUmVxdWVzdE91dCggRGV2aWNlLFJlcXVlc3QsVmFsdWUsSW5kZXgsTGVuZ3RoLEJ1ZmZlcikgXAotICAgICAgICBQSVBFbnNDb250cm9sT3V0KCBEZXZpY2UsUmVxdWVzdCxWYWx1ZSxJbmRleCxMZW5ndGgsQnVmZmVyKQorI2RlZmluZSBDT05UUk9MbnNSZXF1ZXN0T3V0QXN5bihEZXZpY2UsIFJlcXVlc3QsIFZhbHVlLCBJbmRleCwgTGVuZ3RoLCBCdWZmZXIpIFwKKwlQSVBFbnNDb250cm9sT3V0QXN5bihEZXZpY2UsIFJlcXVlc3QsIFZhbHVlLCBJbmRleCwgTGVuZ3RoLCBCdWZmZXIpCiAKLSNkZWZpbmUgQ09OVFJPTG5zUmVxdWVzdE91dEFzeW4oIERldmljZSxSZXF1ZXN0LFZhbHVlLEluZGV4LExlbmd0aCxCdWZmZXIpIFwKLSAgICAgICAgUElQRW5zQ29udHJvbE91dEFzeW4oIERldmljZSxSZXF1ZXN0LFZhbHVlLEluZGV4LExlbmd0aCxCdWZmZXIpCi0KLSNkZWZpbmUgQ09OVFJPTG5zUmVxdWVzdEluKCBEZXZpY2UsUmVxdWVzdCxWYWx1ZSxJbmRleCxMZW5ndGgsQnVmZmVyKSBcCi0gICAgICAgIFBJUEVuc0NvbnRyb2xJbiggRGV2aWNlLFJlcXVlc3QsVmFsdWUsSW5kZXgsTGVuZ3RoLEJ1ZmZlcikKLQorI2RlZmluZSBDT05UUk9MbnNSZXF1ZXN0SW4oRGV2aWNlLCBSZXF1ZXN0LCBWYWx1ZSwgSW5kZXgsIExlbmd0aCwgQnVmZmVyKSBcCisJUElQRW5zQ29udHJvbEluKERldmljZSwgUmVxdWVzdCwgVmFsdWUsIEluZGV4LCBMZW5ndGgsIEJ1ZmZlcikKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kYXRhcmF0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kYXRhcmF0ZS5jCmluZGV4IDJlMTgzZGQuLjVjMjcxOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGF0YXJhdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RhdGFyYXRlLmMKQEAgLTcyLDcgKzcyLDcgQEAKICAgICBCWVRFICAgICAgICAgICAgaWk7CiAKICAgICAvLyBjbGVhciBzdGF0aXN0aWMgY291bnRlciBmb3IgYXV0b19yYXRlCi0gICAgZm9yKGlpPTA7aWk8PU1BWF9SQVRFO2lpKyspIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPD0gTUFYX1JBVEU7IGlpKyspIHsKICAgICAgICAgcHNOb2RlREJUYWJsZS0+dVR4T2tbaWldID0gMDsKICAgICAgICAgcHNOb2RlREJUYWJsZS0+dVR4RmFpbFtpaV0gPSAwOwogICAgIH0KQEAgLTMwOSw3ICszMDksNiBAQAogewogUFNEZXZpY2UgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpIHBEZXZpY2VIYW5kbGVyOwogUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7Ci0jaWYgMSAgLy9taWtlIGZpeGVkIG9sZDogdXNlIHBhY2tldCBsb3NlIHJhdGlvIGFsZ29yaXRobSB0byBjb250cm9sIHJhdGUKIFdPUkQgICAgICAgICAgICB3SWR4RG93blJhdGUgPSAwOwogdW5zaWduZWQgaW50ICAgICAgICAgICAgaWk7CiBCT09MICAgICAgICAgICAgYkF1dG9SYXRlW01BWF9SQVRFXSAgICA9IHtUUlVFLFRSVUUsVFJVRSxUUlVFLEZBTFNFLEZBTFNFLFRSVUUsVFJVRSxUUlVFLFRSVUUsVFJVRSxUUlVFfTsKQEAgLTMzNyw3ICszMzYsNyBAQAogICAgICAgICBwc05vZGVEQlRhYmxlLT51VGltZUNvdW50ID0gMDsKICAgICB9CiAKLSAgICBmb3IoaWk9MDtpaTxNQVhfUkFURTtpaSsrKSB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgTUFYX1JBVEU7IGlpKyspIHsKICAgICAgICAgaWYgKHBzTm9kZURCVGFibGUtPndTdXBwUmF0ZSAmICgweDAwMDE8PGlpKSkgewogICAgICAgICAgICAgaWYgKGJBdXRvUmF0ZVtpaV0gPT0gVFJVRSkgewogICAgICAgICAgICAgICAgIHdJZHhVcFJhdGUgPSAoV09SRCkgaWk7CkBAIC0zNDcsNyArMzQ2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGZvcihpaT0wO2lpPD1wc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZTtpaSsrKSB7CisgICAgZm9yIChpaSA9IDA7IGlpIDw9IHBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlOyBpaSsrKSB7CiAgICAgICAgIGlmICggKHBzTm9kZURCVGFibGUtPnVUeE9rW2lpXSAhPSAwKSB8fAogICAgICAgICAgICAgIChwc05vZGVEQlRhYmxlLT51VHhGYWlsW2lpXSAhPSAwKSApIHsKICAgICAgICAgICAgIGR3VGhyb3VnaHB1dFRibFtpaV0gKj0gcHNOb2RlREJUYWJsZS0+dVR4T2tbaWldOwpAQCAtMzYyLDcgKzM2MSw3IEBACiAgICAgZHdUaHJvdWdocHV0ID0gZHdUaHJvdWdocHV0VGJsW3BzTm9kZURCVGFibGUtPndUeERhdGFSYXRlXTsKIAogICAgIHdJZHhEb3duUmF0ZSA9IHBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlOwotICAgIGZvcihpaSA9IHBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlOyBpaSA+IDA7KSB7CisgICAgZm9yIChpaSA9IHBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlOyBpaSA+IDA7KSB7CiAgICAgICAgIGlpLS07CiAgICAgICAgIGlmICggKGR3VGhyb3VnaHB1dFRibFtpaV0gPiBkd1Rocm91Z2hwdXQpICYmCiAgICAgICAgICAgICAgKGJBdXRvUmF0ZVtpaV09PVRSVUUpICkgewpAQCAtMzg5LDY2ICszODgsNiBAQAogICAgIHNfdlJlc2V0Q291bnRlcihwc05vZGVEQlRhYmxlKTsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlJhdGU6ICVkLCBVOiVkLCBEOiVkXG4iLCAoaW50KXBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlLCAoaW50KXdJZHhVcFJhdGUsIChpbnQpd0lkeERvd25SYXRlKTsKICAgICByZXR1cm47Ci0jZWxzZSAgLy9taWtlIGZpeGVkIG5ldzogdXNlIGRpZmZlci1zaWduYWwgc3RyZW5ndGggdG8gY29udHJvbCByYXRlCi1XT1JEICAgICAgICAgICAgd0lkeFVwUmF0ZSA9IDA7Ci1CT09MICAgICAgICAgICAgYkF1dG9SYXRlW01BWF9SQVRFXSAgICA9IHtUUlVFLFRSVUUsVFJVRSxUUlVFLEZBTFNFLEZBTFNFLFRSVUUsVFJVRSxUUlVFLFRSVUUsVFJVRSxUUlVFfTsKLXVuc2lnbmVkIGludCAgICAgICAgICAgIGlpOwotbG9uZyAgbGRCbTsKLQotICAgIGlmIChwTWdtdC0+ZVNjYW5TdGF0ZSAhPSBXTUFDX05PX1NDQU5OSU5HKSB7Ci0gICAgICAgIC8vIERvbid0IGRvIEZhbGxiYWNrIHdoZW4gc2Nhbm5pbmcgQ2hhbm5lbAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yKGlpPTA7aWk8TUFYX1JBVEU7aWkrKykgewotICAgICAgICBpZiAocHNOb2RlREJUYWJsZS0+d1N1cHBSYXRlICYgKDB4MDAwMTw8aWkpKSB7Ci0gICAgICAgICAgICBpZiAoYkF1dG9SYXRlW2lpXSA9PSBUUlVFKSB7Ci0gICAgICAgICAgICAgICAgd0lkeFVwUmF0ZSA9IChXT1JEKSBpaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJBdXRvUmF0ZVtpaV0gPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICAgICAgUkZ2UlNTSVRvZEJtKHBEZXZpY2UsIChCWVRFKShwRGV2aWNlLT51Q3VyclJTU0kpLCAmbGRCbSk7Ci0KLQlpZiAobGRCbSA+IC01NSkgewotCQlpZiAoIHBzTm9kZURCVGFibGUtPndTdXBwUmF0ZSAmICgweDAwMDE8PFJBVEVfNTRNKSApICAvLzExYS9nCi0gICAgICAJCXsKLQkgIAkJcHNOb2RlREJUYWJsZS0+d1R4RGF0YVJhdGUgPSBSQVRFXzU0TTsKLQkJfQotCQllbHNleyAvLzExYgotCSAgCQlwc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZSA9IFJBVEVfMTFNOwotCQl9Ci0JfQotCi1pZiAod0lkeFVwUmF0ZSA9PSBSQVRFXzU0TSApIHsgICAgIC8vMTFhL2cKLQkJaWYgKGxkQm0gPiAtNTYgKQotCQkJcHNOb2RlREJUYWJsZS0+d1R4RGF0YVJhdGUgPSBSQVRFXzU0TTsKLQkJZWxzZSBpZiAobGRCbSA+IC02MSApCi0JCQlwc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZSA9IFJBVEVfNDhNOwotCQllbHNlIGlmIChsZEJtID4gLTY2ICkKLQkJCXBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlID0gUkFURV8zNk07Ci0JCWVsc2UgaWYgKGxkQm0gPiAtNzIgKQotCQkJcHNOb2RlREJUYWJsZS0+d1R4RGF0YVJhdGUgPSBSQVRFXzI0TTsKLQkJZWxzZSBpZiAobGRCbSA+IC04MCApCi0JCQlwc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZSA9IFJBVEVfNU07Ci0JCWVsc2UgewotCQkJcHNOb2RlREJUYWJsZS0+d1R4RGF0YVJhdGUgPSBSQVRFXzFNOwotCQkJLy9pbmNyZWFzaW5nVkdBID0gVFJVRTsKLQkJfQotCX0KLQllbHNlIHsgIC8vMTFiCi0JCWlmIChsZEJtID4gLTY1ICkKLQkJCXBzTm9kZURCVGFibGUtPndUeERhdGFSYXRlID0gUkFURV8xMU07Ci0JCWVsc2UgaWYgKGxkQm0gPiAtNzUgKQotCQkJcHNOb2RlREJUYWJsZS0+d1R4RGF0YVJhdGUgPSBSQVRFXzVNOwotCQllbHNlCi0JCQlwc05vZGVEQlRhYmxlLT53VHhEYXRhUmF0ZSA9IFJBVEVfMU07Ci0JfQotCi0gICByZXR1cm47Ci0jZW5kaWYKIH0KIAogLyorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Rlc2MuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGVzYy5oCmluZGV4IDA3Zjc5NGUuLjc2NzExMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGVzYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGVzYy5oCkBAIC01MSw3ICs1MSw2IEBACiAKICNkZWZpbmUgTUFYX0lOVEVSUlVQVF9TSVpFICAgICAgICAgICAgICAzMgogCi0KICNkZWZpbmUgUlhfQkxPQ0tTICAgICAgICAgICA2NCAgICAgICAgICAvLyBmb3JtIDB4NjAgdG8gMHhBMAogI2RlZmluZSBUWF9CTE9DS1MgICAgICAgICAgIDMyICAgICAgICAgIC8vIGZyb20gMHhBMCB0byAweEMwCiAKQEAgLTYzLDggKzYyLDYgQEAKICNkZWZpbmUgQ0JfUkRfTlVNICAgICAgICAgICA2NCAgICAgICAgICAvLyBkZWZhdWx0ICMgb2YgUkQKICNkZWZpbmUgQ0JfVERfTlVNICAgICAgICAgICA2NCAgICAgICAgICAvLyBkZWZhdWx0ICMgb2YgVEQKIAotCi0KIC8vCiAvLyBCaXRzIGluIHRoZSBSU1IgcmVnaXN0ZXIKIC8vCkBAIC04Nyw3ICs4NCw2IEBACiAjZGVmaW5lIE5FV1JTUl9CQ05ISVRBSUQgICAgMHgwMiAgICAgICAgLy8gMDAwMCAwMDEwCiAjZGVmaW5lIE5FV1JTUl9CQ05ISVRBSUQwICAgMHgwMSAgICAgICAgLy8gMDAwMCAwMDAxCiAKLQogLy8KIC8vIEJpdHMgaW4gdGhlIFRTUiByZWdpc3RlcgogLy8KQEAgLTk2LDE3ICs5MiwxMyBAQAogI2RlZmluZSBUU1JfQUNLREFUQSAgICAgICAgIDB4MDIgICAgICAgIC8vIDAwMDAgMDAxMAogI2RlZmluZSBUU1JfVkFMSUQgICAgICAgICAgIDB4MDEgICAgICAgIC8vIDAwMDAgMDAwMQogCi0KICNkZWZpbmUgQ0JfUFJPVE9DT0xfUkVTRVJWRURfU0VDVElPTiAgICAxNgogCi0KLQogLy8gaWYgcmV0cnlzIGV4Y2VzcyAxNSB0aW1lcyAsIHR4IHdpbGwgYWJvcnQsIGFuZAogLy8gaWYgdHggZmlmbyB1bmRlcmZsb3csIHR4IHdpbGwgZmFpbAogLy8gd2Ugc2hvdWxkIHRyeSB0byByZXNlbmQgaXQKICNkZWZpbmUgQ0JfTUFYX1RYX0FCT1JUX1JFVFJZICAgMwogCi0KICNkZWZpbmUgRklGT0NUTF9BVVRPX0ZCXzEgICAweDEwMDAgLy8gMDAwMSAwMDAwIDAwMDAgMDAwMAogI2RlZmluZSBGSUZPQ1RMX0FVVE9fRkJfMCAgIDB4MDgwMCAvLyAwMDAwIDEwMDAgMDAwMCAwMDAwCiAjZGVmaW5lIEZJRk9DVExfR1JQQUNLICAgICAgMHgwNDAwIC8vIDAwMDAgMDEwMCAwMDAwIDAwMDAKQEAgLTEzNyw3ICsxMjksNiBAQAogI2RlZmluZSBGUkFHQ1RMX1NUQUZSQUcgICAgIDB4MDAwMSAvLyAwMDAwIDAwMDAgMDAwMCAwMDAxCiAjZGVmaW5lIEZSQUdDVExfTk9ORlJBRyAgICAgMHgwMDAwIC8vIDAwMDAgMDAwMCAwMDAwIDAwMDAKIAotCiAvLyNkZWZpbmUgVFlQRV9BQzBETUEgICAgIDAKIC8vI2RlZmluZSBUWVBFX1RYRE1BMCAgICAgMQogI2RlZmluZSBUWVBFX1RYRE1BMCAgICAgMApAQCAtMTUyLDggKzE0Myw2IEBACiAjZGVmaW5lIFRZUEVfUlhETUExICAgICAxCiAjZGVmaW5lIFRZUEVfTUFYUkQgICAgICAyCiAKLQotCiAvLyBURF9JTkZPIGZsYWdzIGNvbnRyb2wgYml0CiAjZGVmaW5lIFREX0ZMQUdTX05FVElGX1NLQiAgICAgICAgICAgICAgIDB4MDEgICAgICAgLy8gY2hlY2sgaWYgbmVlZCByZWxlYXNlIHNrYgogI2RlZmluZSBURF9GTEFHU19QUklWX1NLQiAgICAgICAgICAgICAgICAweDAyICAgICAgIC8vIGNoZWNrIGlmIGNhbGxlZCBmcm9tIHByaXZhdGUgc2tiKGhvc3RhcCkKQEAgLTE2Miw3ICsxNTEsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFR5cGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KIC8vCiAvLyBSc3ZUaW1lIGJ1ZmZlciBoZWFkZXIKIC8vCkBAIC0xNzMsOCArMTYxLDkgQEAKICAgICBXT1JEICAgICAgICB3UmVzZXJ2ZWQ7CiAgICAgV09SRCAgICAgICAgd1R4UnJ2VGltZV9iOwogICAgIFdPUkQgICAgICAgIHdUeFJydlRpbWVfYTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNScnZUaW1lX2dSVFMsICpQU1JydlRpbWVfZ1JUUzsKKwogdHlwZWRlZiBjb25zdCBTUnJ2VGltZV9nUlRTICpQQ1NScnZUaW1lX2dSVFM7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NScnZUaW1lX2dDVFMgewpAQCAtMTgyLDIyICsxNzEsMjUgQEAKICAgICBXT1JEICAgICAgICB3UmVzZXJ2ZWQ7CiAgICAgV09SRCAgICAgICAgd1R4UnJ2VGltZV9iOwogICAgIFdPUkQgICAgICAgIHdUeFJydlRpbWVfYTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNScnZUaW1lX2dDVFMsICpQU1JydlRpbWVfZ0NUUzsKKwogdHlwZWRlZiBjb25zdCBTUnJ2VGltZV9nQ1RTICpQQ1NScnZUaW1lX2dDVFM7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NScnZUaW1lX2FiIHsKICAgICBXT1JEICAgICAgICB3UlRTVHhScnZUaW1lOwogICAgIFdPUkQgICAgICAgIHdUeFJydlRpbWU7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnJ2VGltZV9hYiwgKlBTUnJ2VGltZV9hYjsKKwogdHlwZWRlZiBjb25zdCBTUnJ2VGltZV9hYiAqUENTUnJ2VGltZV9hYjsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1JydlRpbWVfYXRpbSB7CiAgICAgV09SRCAgICAgICAgd0NUU1R4UnJ2VGltZV9iYTsKICAgICBXT1JEICAgICAgICB3VHhScnZUaW1lX2E7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnJ2VGltZV9hdGltLCAqUFNScnZUaW1lX2F0aW07CisKIHR5cGVkZWYgY29uc3QgU1JydlRpbWVfYXRpbSAqUENTUnJ2VGltZV9hdGltOwogCiAvLwpAQCAtMjA4LDggKzIwMCw5IEBACiAgICAgV09SRCAgICB3RHVyYXRpb25JRDsKICAgICBCWVRFICAgIGFieVJBW0VUSF9BTEVOXTsKICAgICBCWVRFICAgIGFieVRBW0VUSF9BTEVOXTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNSVFNEYXRhLCAqUFNSVFNEYXRhOworCiB0eXBlZGVmIGNvbnN0IFNSVFNEYXRhICpQQ1NSVFNEYXRhOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlRTX2cgewpAQCAtMjI0LDExICsyMTcsMTAgQEAKICAgICBXT1JEICAgICAgICB3RHVyYXRpb25fYmI7CiAgICAgV09SRCAgICAgICAgd1Jlc2VydmVkOwogICAgIFNSVFNEYXRhICAgIERhdGE7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUlRTX2csICpQU1JUU19nOwogdHlwZWRlZiBjb25zdCBTUlRTX2cgKlBDU1JUU19nOwogCi0KIHR5cGVkZWYgc3RydWN0IHRhZ1NSVFNfZ19GQiB7CiAgICAgQllURSAgICAgICAgYnlTaWduYWxGaWVsZF9iOwogICAgIEJZVEUgICAgICAgIGJ5U2VydmljZUZpZWxkX2I7CkBAIC0yNDUsMTAgKzIzNywxMCBAQAogICAgIFdPUkQgICAgICAgIHdSVFNEdXJhdGlvbl9iYV9mMTsKICAgICBXT1JEICAgICAgICB3UlRTRHVyYXRpb25fYWFfZjE7CiAgICAgU1JUU0RhdGEgICAgRGF0YTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNSVFNfZ19GQiwgKlBTUlRTX2dfRkI7Ci10eXBlZGVmIGNvbnN0IFNSVFNfZ19GQiAqUENTUlRTX2dfRkI7CiAKK3R5cGVkZWYgY29uc3QgU1JUU19nX0ZCICpQQ1NSVFNfZ19GQjsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU1JUU19hYiB7CiAgICAgQllURSAgICAgICAgYnlTaWduYWxGaWVsZDsKQEAgLTI1NywxMCArMjQ5LDEwIEBACiAgICAgV09SRCAgICAgICAgd0R1cmF0aW9uOwogICAgIFdPUkQgICAgICAgIHdSZXNlcnZlZDsKICAgICBTUlRTRGF0YSAgICBEYXRhOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1JUU19hYiwgKlBTUlRTX2FiOwotdHlwZWRlZiBjb25zdCBTUlRTX2FiICpQQ1NSVFNfYWI7CiAKK3R5cGVkZWYgY29uc3QgU1JUU19hYiAqUENTUlRTX2FiOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTUlRTX2FfRkIgewogICAgIEJZVEUgICAgICAgIGJ5U2lnbmFsRmllbGQ7CkBAIC0yNzEsOCArMjYzLDkgQEAKICAgICBXT1JEICAgICAgICB3UlRTRHVyYXRpb25fZjA7CiAgICAgV09SRCAgICAgICAgd1JUU0R1cmF0aW9uX2YxOwogICAgIFNSVFNEYXRhICAgIERhdGE7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUlRTX2FfRkIsICpQU1JUU19hX0ZCOworCiB0eXBlZGVmIGNvbnN0IFNSVFNfYV9GQiAqUENTUlRTX2FfRkI7CiAKIApAQCAtMjg0LDcgKzI3Nyw3IEBACiAgICAgV09SRCAgICB3RHVyYXRpb25JRDsKICAgICBCWVRFICAgIGFieVJBW0VUSF9BTEVOXTsKICAgICBXT1JEICAgIHdSZXNlcnZlZDsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNDVFNEYXRhLCAqUFNDVFNEYXRhOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTQ1RTIHsKQEAgLTI5NCw4ICsyODcsOSBAQAogICAgIFdPUkQgICAgICAgIHdEdXJhdGlvbl9iYTsKICAgICBXT1JEICAgICAgICB3UmVzZXJ2ZWQ7CiAgICAgU0NUU0RhdGEgICAgRGF0YTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNDVFMsICpQU0NUUzsKKwogdHlwZWRlZiBjb25zdCBTQ1RTICpQQ1NDVFM7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDVFNfRkIgewpAQCAtMzA3LDEwICszMDEsMTAgQEAKICAgICBXT1JEICAgICAgICB3Q1RTRHVyYXRpb25fYmFfZjA7CiAgICAgV09SRCAgICAgICAgd0NUU0R1cmF0aW9uX2JhX2YxOwogICAgIFNDVFNEYXRhICAgIERhdGE7Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTQ1RTX0ZCLCAqUFNDVFNfRkI7Ci10eXBlZGVmIGNvbnN0IFNDVFNfRkIgKlBDU0NUU19GQjsKIAordHlwZWRlZiBjb25zdCBTQ1RTX0ZCICpQQ1NDVFNfRkI7CiAKIC8vCiAvLyBUeCBGSUZPIGhlYWRlcgpAQCAtMzIxLDE0ICszMTUsMTQgQEAKICAgICBXT1JEICAgIHdUaW1lU3RhbXA7CiAgICAgV09SRCAgICB3RnJhZ0N0bDsKICAgICBXT1JEICAgIHdSZXNlcnZlZDsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeEJ1ZkhlYWQsICpQU1R4QnVmSGVhZDsKIHR5cGVkZWYgY29uc3QgU1R4QnVmSGVhZCAqUENTVHhCdWZIZWFkOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdTVHhTaG9ydEJ1ZkhlYWQgewogICAgIFdPUkQgICAgd0ZJRk9DdGw7CiAgICAgV09SRCAgICB3VGltZVN0YW1wOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1R4U2hvcnRCdWZIZWFkLCAqUFNUeFNob3J0QnVmSGVhZDsKIHR5cGVkZWYgY29uc3QgU1R4U2hvcnRCdWZIZWFkICpQQ1NUeFNob3J0QnVmSGVhZDsKIApAQCAtMzQ2LDggKzM0MCw5IEBACiAgICAgV09SRCAgICB3RHVyYXRpb25fYTsKICAgICBXT1JEICAgIHdUaW1lU3RhbXBPZmZfYjsKICAgICBXT1JEICAgIHdUaW1lU3RhbXBPZmZfYTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeERhdGFIZWFkX2csICpQU1R4RGF0YUhlYWRfZzsKKwogdHlwZWRlZiBjb25zdCBTVHhEYXRhSGVhZF9nICpQQ1NUeERhdGFIZWFkX2c7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NUeERhdGFIZWFkX2dfRkIgewpAQCAtMzYzLDIyICszNTgsMjAgQEAKICAgICBXT1JEICAgIHdEdXJhdGlvbl9hX2YxOwogICAgIFdPUkQgICAgd1RpbWVTdGFtcE9mZl9iOwogICAgIFdPUkQgICAgd1RpbWVTdGFtcE9mZl9hOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1R4RGF0YUhlYWRfZ19GQiwgKlBTVHhEYXRhSGVhZF9nX0ZCOwogdHlwZWRlZiBjb25zdCBTVHhEYXRhSGVhZF9nX0ZCICpQQ1NUeERhdGFIZWFkX2dfRkI7CiAKLQogdHlwZWRlZiBzdHJ1Y3QgdGFnU1R4RGF0YUhlYWRfYWIgewogICAgIEJZVEUgICAgYnlTaWduYWxGaWVsZDsKICAgICBCWVRFICAgIGJ5U2VydmljZUZpZWxkOwogICAgIFdPUkQgICAgd1RyYW5zbWl0TGVuZ3RoOwogICAgIFdPUkQgICAgd0R1cmF0aW9uOwogICAgIFdPUkQgICAgd1RpbWVTdGFtcE9mZjsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeERhdGFIZWFkX2FiLCAqUFNUeERhdGFIZWFkX2FiOwogdHlwZWRlZiBjb25zdCBTVHhEYXRhSGVhZF9hYiAqUENTVHhEYXRhSGVhZF9hYjsKIAotCiB0eXBlZGVmIHN0cnVjdCB0YWdTVHhEYXRhSGVhZF9hX0ZCIHsKICAgICBCWVRFICAgIGJ5U2lnbmFsRmllbGQ7CiAgICAgQllURSAgICBieVNlcnZpY2VGaWVsZDsKQEAgLTM4Nyw3ICszODAsNyBAQAogICAgIFdPUkQgICAgd1RpbWVTdGFtcE9mZjsKICAgICBXT1JEICAgIHdEdXJhdGlvbl9mMDsKICAgICBXT1JEICAgIHdEdXJhdGlvbl9mMTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNUeERhdGFIZWFkX2FfRkIsICpQU1R4RGF0YUhlYWRfYV9GQjsKIHR5cGVkZWYgY29uc3QgU1R4RGF0YUhlYWRfYV9GQiAqUENTVHhEYXRhSGVhZF9hX0ZCOwogCkBAIC0zOTgsMjMgKzM5MSwyMyBAQAogICAgIERXT1JEICAgYWR3SERSMFs0XTsKICAgICBEV09SRCAgIGFkd0hEUjFbNF07CiAgICAgRFdPUkQgICBhZHdIRFIyWzRdOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU01JQ0hEUkhlYWQsICpQU01JQ0hEUkhlYWQ7CisKIHR5cGVkZWYgY29uc3QgU01JQ0hEUkhlYWQgKlBDU01JQ0hEUkhlYWQ7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NCRUFDT05DdGwgewogICAgIERXT1JEICAgQnVmUmVhZHkgOiAxOwotICAgIERXT1JEICAgVFNGICAgICAgOiAxNTsKLSAgICBEV09SRCAgIEJ1ZkxlbiAgIDogMTE7CisgICAgRFdPUkQgICBUU0YgOiAxNTsKKyAgICBEV09SRCAgIEJ1ZkxlbiA6IDExOwogICAgIERXT1JEICAgUmVzZXJ2ZWQgOiA1OwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU0JFQUNPTkN0bDsKIAotCiB0eXBlZGVmIHN0cnVjdCB0YWdTU2VjcmV0S2V5IHsKICAgICBEV09SRCAgIGR3TG93RHdvcmQ7CiAgICAgQllURSAgICBieUhpZ2hCeXRlOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1NlY3JldEtleTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0tleUVudHJ5IHsKQEAgLTQyNiw3ICs0MTksNyBAQAogICAgIERXT1JEIGR3S2V5Mls0XTsKICAgICBEV09SRCBkd0tleTNbNF07CiAgICAgRFdPUkQgZHdLZXk0WzRdOwotfV9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU0tleUVudHJ5OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKaW5kZXggZWY5ZmQ5Ny4uYjk4NTJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCkBAIC03MSw5ICs3MSw2IEBACiAjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKICNlbmRpZgogCi0vLzIwMDctMDkyMC0wMTxBZGQ+YnkgTWlrZUxpdQotI2lmbmRlZiBTbmRFdnRfVG9BUEkKLSNkZWZpbmUgU25kRXZ0X1RvQVBJCiAvL3BsZWFzZSBjb3B5IGJlbG93IG1hY3JvIHRvIGRyaXZlcl9ldmVudC5jIGZvciBBUEkKICNkZWZpbmUgUlRfSU5TTU9EX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQogI2RlZmluZSBSVF9VUERFVl9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMgpAQCAtODEsNyArNzgsNiBAQAogI2RlZmluZSBSVF9XUEFDT05ORUNURURfRVZFTlRfRkxBRyAgICAgICAgICAgICAweDAxMDQKICNkZWZpbmUgUlRfRE9XTkRFVl9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA1CiAjZGVmaW5lIFJUX1JNTU9EX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKLSNlbmRpZgogCiAvLwogLy8gZGV2aWNlIHNwZWNpZmljCkBAIC0xMDksNyArMTA1LDYgQEAKICNkZWZpbmUgTUFYX01VTFRJQ0FTVF9BRERSRVNTX05VTSAgICAgICAzMgogI2RlZmluZSBNVUxUSUNBU1RfQUREUkVTU19MSVNUX1NJWkUgICAgIChNQVhfTVVMVElDQVNUX0FERFJFU1NfTlVNICogRVRIX0FMRU4pCiAKLQogLy8jZGVmaW5lIE9QX01PREVfSU5GUkFTVFJVQ1RVUkUgIDAKIC8vI2RlZmluZSBPUF9NT0RFX0FESE9DICAgICAgICAgICAxCiAvLyNkZWZpbmUgT1BfTU9ERV9BUCAgICAgICAgICAgICAgMgpAQCAtMTMwLDggKzEyNSw2IEBACiAjZGVmaW5lIEtFWVNFTF9US0lQICAgICAgICAgICAgICAgICAgICAgMgogI2RlZmluZSBLRVlTRUxfQ0NNUCAgICAgICAgICAgICAgICAgICAgIDMKIAotCi0KICNkZWZpbmUgQVVUT19GQl9OT05FICAgICAgICAgICAgMAogI2RlZmluZSBBVVRPX0ZCXzAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEFVVE9fRkJfMSAgICAgICAgICAgICAgIDIKQEAgLTE2Miw4ICsxNTUsNiBAQAogI2RlZmluZSBCQl9WR0FfTEVWRUwgICAgICAgICAgICA0CiAjZGVmaW5lIEJCX1ZHQV9DSEFOR0VfVEhSRVNIT0xEIDMKIAotCi0KICNpZm5kZWYgUlVOX0FUCiAjZGVmaW5lIFJVTl9BVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKGppZmZpZXMrKHgpKQogI2VuZGlmCkBAIC0xNzUsMjQgKzE2NiwyMyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFR5cGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lIERCR19QUlQobCwgcCwgYXJncy4uLikge2lmIChsPD1tc2dsZXZlbCkgcHJpbnRrKCBwICwjI2FyZ3MpO30KLSNkZWZpbmUgUFJJTlRfSyhwLCBhcmdzLi4uKSB7aWYgKFBSSVZBVEVfTWVzc2FnZSkgcHJpbnRrKCBwICwjI2FyZ3MpO30KKyNkZWZpbmUgREJHX1BSVChsLCBwLCBhcmdzLi4uKSB7IGlmIChsIDw9IG1zZ2xldmVsKSBwcmludGsocCwgIyNhcmdzKTsgfQorI2RlZmluZSBQUklOVF9LKHAsIGFyZ3MuLi4pIHsgaWYgKFBSSVZBVEVfTWVzc2FnZSkgcHJpbnRrKHAsICMjYXJncyk7IH0KIAogdHlwZWRlZiBlbnVtIF9fZGV2aWNlX21zZ19sZXZlbCB7Ci0gICAgTVNHX0xFVkVMX0VSUj0wLCAgICAgICAgICAgIC8vRXJyb3JzIHRoYXQgd2lsbCBjYXVzZSBhYm5vcm1hbCBvcGVyYXRpb24uCi0gICAgTVNHX0xFVkVMX05PVElDRT0xLCAgICAgICAgIC8vU29tZSBlcnJvcnMgbmVlZCB1c2VycyB0byBiZSBub3RpZmllZC4KLSAgICBNU0dfTEVWRUxfSU5GTz0yLCAgICAgICAgICAgLy9Ob3JtYWwgbWVzc2FnZS4KLSAgICBNU0dfTEVWRUxfVkVSQk9TRT0zLCAgICAgICAgLy9XaWxsIHJlcG9ydCBhbGwgdHJpdmFsIGVycm9ycy4KLSAgICBNU0dfTEVWRUxfREVCVUc9NCAgICAgICAgICAgLy9Pbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgorCU1TR19MRVZFTF9FUlIgPSAwLCAgICAgICAgICAgIC8qIEVycm9ycyBjYXVzaW5nIGFibm9ybWFsIG9wZXJhdGlvbiAqLworCU1TR19MRVZFTF9OT1RJQ0UgPSAxLCAgICAgICAgIC8qIEVycm9ycyBuZWVkaW5nIHVzZXIgbm90aWZpY2F0aW9uICovCisJTVNHX0xFVkVMX0lORk8gPSAyLCAgICAgICAgICAgLyogTm9ybWFsIG1lc3NhZ2UuICovCisJTVNHX0xFVkVMX1ZFUkJPU0UgPSAzLCAgICAgICAgLyogV2lsbCByZXBvcnQgYWxsIHRyaXZhbCBlcnJvcnMuICovCisJTVNHX0xFVkVMX0RFQlVHID0gNCAgICAgICAgICAgLyogT25seSBmb3IgZGVidWcgcHVycG9zZS4gKi8KIH0gREVWSUNFX01TR19MRVZFTCwgKlBERVZJQ0VfTVNHX0xFVkVMOwogCiB0eXBlZGVmIGVudW0gX19kZXZpY2VfaW5pdF90eXBlIHsKLSAgICBERVZJQ0VfSU5JVF9DT0xEPTAsICAgICAgICAgLy8gY29sZCBpbml0Ci0gICAgREVWSUNFX0lOSVRfUkVTRVQsICAgICAgICAgIC8vIHJlc2V0IGluaXQgb3IgRHggdG8gRDAgcG93ZXIgcmVtYWluIGluaXQKLSAgICBERVZJQ0VfSU5JVF9EWFBMICAgICAgICAgICAgLy8gRHggdG8gRDAgcG93ZXIgbG9zdCBpbml0CisJREVWSUNFX0lOSVRfQ09MRCA9IDAsICAgICAgIC8qIGNvbGQgaW5pdCAqLworCURFVklDRV9JTklUX1JFU0VULCAgICAgICAgICAvKiByZXNldCBpbml0IG9yIER4IHRvIEQwIHBvd2VyIHJlbWFpbiAqLworCURFVklDRV9JTklUX0RYUEwgICAgICAgICAgICAvKiBEeCB0byBEMCBwb3dlciBsb3N0IGluaXQgKi8KIH0gREVWSUNFX0lOSVRfVFlQRSwgKlBERVZJQ0VfSU5JVF9UWVBFOwogCi0KIC8vVVNCCiAKIC8vCkBAIC0yMDMsOSArMTkzLDYgQEAKICAgICBDT05URVhUX01HTVRfUEFDS0VUCiB9IENPTlRFWFRfVFlQRTsKIAotCi0KLQogLy8gUkNCIChSZWNlaXZlIENvbnRyb2wgQmxvY2spCiB0eXBlZGVmIHN0cnVjdCBfUkNCCiB7CkBAIC0yMTksNyArMjA2LDYgQEAKIAogfSBSQ0IsICpQUkNCOwogCi0KIC8vIHVzZWQgdG8gdHJhY2sgYnVsayBvdXQgaXJwcwogdHlwZWRlZiBzdHJ1Y3QgX1VTQl9TRU5EX0NPTlRFWFQgewogICAgIHZvaWQgKnBEZXZpY2U7CkBAIC0yMzMsNyArMjE5LDYgQEAKICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBEYXRhW01BWF9UT1RBTF9TSVpFX1dJVEhfQUxMX0hFQURFUlNdOwogfSBVU0JfU0VORF9DT05URVhULCAqUFVTQl9TRU5EX0NPTlRFWFQ7CiAKLQogLyogc3RydWN0dXJlIGdvdCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyB1c2VyLWRlc2lyZWQgZGVmYXVsdCBzZXR0aW5ncyAqLwogdHlwZWRlZiBzdHJ1Y3QgX0RFRkFVTFRfQ09ORklHIHsKIAlzaWduZWQgaW50ICAgIFpvbmVUeXBlOwpAQCAtMjU0LDEyICsyMzksMTAgQEAKICAgICBCT09MICAgICAgICAgICAgYkluVXNlOwogfSBJTlRfQlVGRkVSLCAqUElOVF9CVUZGRVI7CiAKLQotCiAvLzA6MTFBIDE6MTFCIDI6MTFHCiB0eXBlZGVmIGVudW0gX1ZJQV9CQl9UWVBFCiB7Ci0gICAgQkJfVFlQRV8xMUE9MCwKKyAgICBCQl9UWVBFXzExQSA9IDAsCiAgICAgQkJfVFlQRV8xMUIsCiAgICAgQkJfVFlQRV8xMUcKIH0gVklBX0JCX1RZUEUsICpQVklBX0JCX1RZUEU7CkBAIC0yNjcsMjIgKzI1MCwxOCBAQAogLy8wOjExYSwxOjExYiwyOjExZ2Iob25seSBDQ0sgaW4gQmFzaWNSYXRlKSwzOjExZ2EoT0ZETSBpbiBCYXNpYyBSYXRlKQogdHlwZWRlZiBlbnVtIF9WSUFfUEtUX1RZUEUKIHsKLSAgICBQS19UWVBFXzExQT0wLAorICAgIFBLX1RZUEVfMTFBID0gMCwKICAgICBQS19UWVBFXzExQiwKICAgICBQS19UWVBFXzExR0IsCiAgICAgUEtfVFlQRV8xMUdBCiB9IFZJQV9QS1RfVFlQRSwgKlBWSUFfUEtUX1RZUEU7CiAKLQotCi0KIC8vKysgTkRJUyByZWxhdGVkCiAKICNkZWZpbmUgTkRJU19TVEFUVVMgICAgIGludAotI2RlZmluZSBOVFNUQVRVUyAgICAgICAgaW50CiAKIHR5cGVkZWYgZW51bSBfX0RFVklDRV9ORElTX1NUQVRVUyB7Ci0gICAgU1RBVFVTX1NVQ0NFU1M9MCwKKyAgICBTVEFUVVNfU1VDQ0VTUyA9IDAsCiAgICAgU1RBVFVTX0ZBSUxVUkUsCiAgICAgU1RBVFVTX1JFU09VUkNFUywKICAgICBTVEFUVVNfUEVORElORywKQEAgLTgxMCwxNyArNzg5LDEyIEBACiAgICAgLy8gY29tbWFuZCB0aW1lcgogICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHNUaW1lckNvbW1hbmQ7CiAKLS8vMjAwNy0wMTE1LTAxPEFkZD5ieSBNaWtlTGl1Ci0jaWZkZWYgVHhJblNsZWVwCiAgICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHNUaW1lclR4RGF0YTsKICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgblR4RGF0YVRpbWVDb3V0OwogICAgICBCT09MICBmVHhEYXRhSW5TbGVlcDsKICAgICAgQk9PTCAgSXNUeERhdGFUcmlnZ2VyOwotI2VuZGlmCiAKLSNpZmRlZiBXUEFfU01fVHJhbnN0YXR1cwogICAgIEJPT0wgIGZXUEFfQXV0aGVuZWQ7ICAgICAgICAgICAvL2lzIFdQQS9XUEEtUFNLIG9yIFdQQTIvV1BBMi1QU0sgYXV0aGVuPz8KLSNlbmRpZgogICAgIEJZVEUgICAgICAgICAgICBieVJlQXNzb2NDb3VudDsgICAvL21pa2UgYWRkOnJlLWFzc29jaWF0aW9uIHJldHJ5IHRpbWVzIQogICAgIEJZVEUgICAgICAgICAgICBieUxpbmtXYWl0Q291bnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2VfY2ZnLmgKaW5kZXggYzgxNjkwMS4uYTBiODIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2VfY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2VfY2ZnLmgKQEAgLTc3LDI1ICs3NywyMCBAQAogLy9NYXg6IDIzNzg9MjMxMlBheWxvYWQgKyAzMEhEICs0Q1JDICsgMlBhZGRpbmcgKyA0TGVuICsgOFRTRiArIDRSU1IKICNkZWZpbmUgUEtUX0JVRl9TWiAgICAgICAgICAyMzkwCiAKLQogI2RlZmluZSBNQVhfVUlOVFMgICAgICAgICAgIDgKICNkZWZpbmUgT1BUSU9OX0RFRkFVTFQgICAgICB7IFswIC4uLiBNQVhfVUlOVFMtMV0gPSAtMX0KIAotCi0KLXR5cGVkZWYgZW51bSAgX2NoaXBfdHlwZXsKLSAgICBWVDMxODQ9MQordHlwZWRlZiBlbnVtICBfY2hpcF90eXBlIHsKKyAgICBWVDMxODQgPSAxCiB9IENISVBfVFlQRSwgKlBDSElQX1RZUEU7CiAKLQotCiAjaWZkZWYgVklBV0VUX0RFQlVHCiAjZGVmaW5lIEFTU0VSVCh4KSB7IFwKICAgICBpZiAoISh4KSkgeyBcCi0gICAgICAgIHByaW50ayhLRVJOX0VSUiAiYXNzZXJ0aW9uICVzIGZhaWxlZDogZmlsZSAlcyBsaW5lICVkXG4iLCAjeCxcCisJcHJpbnRrKEtFUk5fRVJSICJhc3NlcnRpb24gJXMgZmFpbGVkOiBmaWxlICVzIGxpbmUgJWRcbiIsICN4LCBcCiAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pO1wKLSAgICAgICAgKihpbnQqKSAwPTA7XAotICAgIH1cCisJKihpbnQgKikgMCA9IDA7CQlcCisgICAgfSBcCiB9CiAjZGVmaW5lIERCR19QT1JUODAodmFsdWUpICAgICAgICAgICAgICAgICAgIG91dGIodmFsdWUsIDB4ODApCiAjZWxzZQpAQCAtMTAzLDUgKzk4LDQgQEAKICNkZWZpbmUgREJHX1BPUlQ4MCh2YWx1ZSkKICNlbmRpZgogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKaW5kZXggOWFmZTc2Yy4uNWU4ODM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCkBAIC04MCw3ICs4MCw3IEBACiB2b2lkCiBzX3ZHZXREQVNBKAogICAgICAgUEJZVEUgcGJ5UnhCdWZmZXJBZGRyLAotICAgICBQVUlOVCBwY2JIZWFkZXJTaXplLAorICAgICB1bnNpZ25lZCBpbnQgKnBjYkhlYWRlclNpemUsCiAgICAgIFBTRXRoZXJuZXRIZWFkZXIgcHNFdGhIZWFkZXIKICAgICApOwogCkBAIC05Miw3ICs5Miw3IEBACiAgICAgICB1bnNpZ25lZCBpbnQgY2JQYWNrZXRTaXplLAogICAgICAgQk9PTCBiSXNXRVAsCiAgICAgICBCT09MIGJFeHRJViwKLSAgICAgUFVJTlQgcGNiSGVhZFNpemUKKyAgICAgdW5zaWduZWQgaW50ICpwY2JIZWFkU2l6ZQogICAgICk7CiAKIHN0YXRpYyBCT09MIHNfYkFQTW9kZVJ4Q3RsKApAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgICB1bnNpZ25lZCBpbnQgY2JQYWNrZXRTaXplLAogICAgICAgQk9PTCBiSXNXRVAsCiAgICAgICBCT09MIGJFeHRJViwKLSAgICAgUFVJTlQgcGNiSGVhZFNpemUKKyAgICAgdW5zaWduZWQgaW50ICpwY2JIZWFkU2l6ZQogICAgICkKIHsKICAgICBQQllURSAgICAgICAgICAgcGJ5UnhCdWZmZXI7CkBAIC0xOTUsMTAgKzE5NSw5IEBACiAgICAgfTsKIAogICAgIHBieVJ4QnVmZmVyID0gKFBCWVRFKSAocGJ5UnhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKLSAgICBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwocGJ5UnhCdWZmZXIsICZwRGV2aWNlLT5hYnlTTkFQX0JyaWRnZXR1bm5lbFswXSkpIHsKKyAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwYnlSeEJ1ZmZlciwgJnBEZXZpY2UtPmFieVNOQVBfQnJpZGdldHVubmVsWzBdKSkgewogICAgICAgICBjYkhlYWRlclNpemUgKz0gNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoSVNfRVRIX0FERFJFU1NfRVFVQUwocGJ5UnhCdWZmZXIsICZwRGV2aWNlLT5hYnlTTkFQX1JGQzEwNDJbMF0pKSB7CisgICAgfSBlbHNlIGlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBieVJ4QnVmZmVyLCAmcERldmljZS0+YWJ5U05BUF9SRkMxMDQyWzBdKSkgewogICAgICAgICBjYkhlYWRlclNpemUgKz0gNjsKICAgICAgICAgcHdUeXBlID0gKFBXT1JEKSAocGJ5UnhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplKTsKICAgICAgICAgaWYgKCgqcHdUeXBlIT0gVFlQRV9QS1RfSVBYKSAmJiAoKnB3VHlwZSAhPSBjcHVfdG9fbGUxNigweEYzODApKSkgewpAQCAtMjYyLDcgKzI2MSw3IEBACiB2b2lkCiBzX3ZHZXREQVNBICgKICAgICAgIFBCWVRFIHBieVJ4QnVmZmVyQWRkciwKLSAgICAgUFVJTlQgcGNiSGVhZGVyU2l6ZSwKKyAgICAgdW5zaWduZWQgaW50ICpwY2JIZWFkZXJTaXplLAogICAgICBQU0V0aGVybmV0SGVhZGVyIHBzRXRoSGVhZGVyCiAgICAgKQogewpAQCAtMzQzLDkgKzM0Miw3IEBACiAgICAgUEJZVEUgICAgICAgICAgIHBieVJ4U3RzOwogICAgIFBCWVRFICAgICAgICAgICBwYnlSeFJhdGU7CiAgICAgUEJZVEUgICAgICAgICAgIHBieVNROwotI2lmZGVmIENhbGN1X0xpbmtRdWFsCiAgICAgUEJZVEUgICAgICAgICAgIHBieTNTUTsKLSNlbmRpZgogICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGNiSGVhZGVyU2l6ZTsKICAgICBQU0tleUl0ZW0gICAgICAgcEtleSA9IE5VTEw7CiAgICAgV09SRCAgICAgICAgICAgIHdSeFRTQzE1XzAgPSAwOwpAQCAtNDE2LDcgKzQxMyw2IEBACiAgICAgd1BMQ1B3aXRoUGFkZGluZyA9ICggKCpwd1BMQ1BfTGVuZ3RoIC8gNCkgKyAoICgqcHdQTENQX0xlbmd0aCAlIDQpID8gMTowICkgKSAqNDsKIAogICAgIHBxd1RTRlRpbWUgPSAoUFFXT1JEKSAocGJ5REFkZHJlc3MgKyA4ICsgd1BMQ1B3aXRoUGFkZGluZyk7Ci0jaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgaWYocERldmljZS0+YnlCQlR5cGUgPT0gQkJfVFlQRV8xMUcpICB7CiAgICAgICBwYnkzU1EgPSBwYnlEQWRkcmVzcyArIDggKyB3UExDUHdpdGhQYWRkaW5nICsgMTI7CiAgICAgICBwYnlTUSA9IHBieTNTUTsKQEAgLTQyNSw5ICs0MjEsNiBAQAogICAgcGJ5U1EgPSBwYnlEQWRkcmVzcyArIDggKyB3UExDUHdpdGhQYWRkaW5nICsgODsKICAgIHBieTNTUSA9IHBieVNROwogICB9Ci0jZWxzZQotICAgIHBieVNRID0gcGJ5REFkZHJlc3MgKyA4ICsgd1BMQ1B3aXRoUGFkZGluZyArIDg7Ci0jZW5kaWYKICAgICBwYnlOZXdSc3IgPSBwYnlEQWRkcmVzcyArIDggKyB3UExDUHdpdGhQYWRkaW5nICsgOTsKICAgICBwYnlSU1NJID0gcGJ5REFkZHJlc3MgKyA4ICsgd1BMQ1B3aXRoUGFkZGluZyArIDEwOwogICAgIHBieVJzciA9IHBieURBZGRyZXNzICsgOCArIHdQTENQd2l0aFBhZGRpbmcgKyAxMTsKQEAgLTQ1MywyMSArNDQ2LDIyIEBACiAgICAgaWYgKChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9TVEFOREJZKSB8fAogICAgICAgICAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX1NUQSkpIHsKICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVswXS5iQWN0aXZlKSB7Ci0gICAgICAgICBpZihJU19FVEhfQUREUkVTU19FUVVBTCAocE1nbXQtPmFieUN1cnJCU1NJRCwgcE1BQ0hlYWRlci0+YWJ5QWRkcjIpICkgeworCSBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwTWdtdC0+YWJ5Q3VyckJTU0lELCBwTUFDSGVhZGVyLT5hYnlBZGRyMikpIHsKIAkgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbMF0udUluQWN0aXZlQ291bnQgIT0gMCkKICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0udUluQWN0aXZlQ291bnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghSVNfTVVMVElDQVNUX0FERFJFU1MocE1BQ0hlYWRlci0+YWJ5QWRkcjEpICYmICFJU19CUk9BRENBU1RfQUREUkVTUyhwTUFDSGVhZGVyLT5hYnlBZGRyMSkpIHsKKyAgICBpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBNQUNIZWFkZXItPmFieUFkZHIxKSAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIocE1BQ0hlYWRlci0+YWJ5QWRkcjEpKSB7CiAgICAgICAgIGlmICggV0NUTGJJc0R1cGxpY2F0ZSgmKHBEZXZpY2UtPnNEdXBSeENhY2hlKSwgKFBTODAyXzExSGVhZGVyKSBwYnlGcmFtZSkgKSB7CiAgICAgICAgICAgICBwRGV2aWNlLT5zODAyXzExQ291bnRlci5GcmFtZUR1cGxpY2F0ZUNvdW50Kys7CiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoICFJU19FVEhfQUREUkVTU19FUVVBTCAocERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIsIHBNQUNIZWFkZXItPmFieUFkZHIxKSApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyLAorCQkJICAgICAgIHBNQUNIZWFkZXItPmFieUFkZHIxKSkgeworCQlyZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3NSw3ICs0NjksOCBAQAogICAgIC8vIFVzZSBmb3IgVEtJUCBNSUMKICAgICBzX3ZHZXREQVNBKHBieUZyYW1lLCAmY2JIZWFkZXJTaXplLCAmcERldmljZS0+c1J4RXRoSGVhZGVyKTsKIAotICAgIGlmIChJU19FVEhfQUREUkVTU19FUVVBTCgoUEJZVEUpJihwRGV2aWNlLT5zUnhFdGhIZWFkZXIuYWJ5U3JjQWRkclswXSksIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyKSkKKyAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcigoUEJZVEUpJihwRGV2aWNlLT5zUnhFdGhIZWFkZXIuYWJ5U3JjQWRkclswXSksCisJCQkgICAgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIpKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgfHwgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0lCU1NfU1RBKSkgewpAQCAtNTY4LDggKzU2Myw4IEBACiAgICAgLy8KICAgICAvLyBSWCBPSwogICAgIC8vCi0gICAgLy9yZW1vdmUgdGhlIENSQyBsZW5ndGgKLSAgICBGcmFtZVNpemUgLT0gVV9DUkNfTEVOOworICAgIC8qIHJlbW92ZSB0aGUgRkNTL0NSQyBsZW5ndGggKi8KKyAgICBGcmFtZVNpemUgLT0gRVRIX0ZDU19MRU47CiAKICAgICBpZiAoICEoKnBieVJzciAmIChSU1JfQUREUkJST0FEIHwgUlNSX0FERFJNVUxUSSkpICYmIC8vIHVuaWNhc3QgYWRkcmVzcwogICAgICAgICAoSVNfRlJBR01FTlRfUEtUKChwYnlGcmFtZSkpKQpAQCAtNzU4LDEwICs3NTMsMTEgQEAKICAgICAgICAgcE1nbXQtPnBDdXJyQlNTLT5ieVJTU0lTdGF0Q250Kys7CiAgICAgICAgIHBNZ210LT5wQ3VyckJTUy0+YnlSU1NJU3RhdENudCAlPSBSU1NJX1NUQVRfQ09VTlQ7CiAgICAgICAgIHBNZ210LT5wQ3VyckJTUy0+bGRCbUF2ZXJhZ2VbcE1nbXQtPnBDdXJyQlNTLT5ieVJTU0lTdGF0Q250XSA9IGxkQm07Ci0gICAgICAgIGZvcihpaT0wO2lpPFJTU0lfU1RBVF9DT1VOVDtpaSsrKSB7Ci0gICAgICAgICAgICBpZiAocE1nbXQtPnBDdXJyQlNTLT5sZEJtQXZlcmFnZVtpaV0gIT0gMCkgewotICAgICAgICAgICAgcE1nbXQtPnBDdXJyQlNTLT5sZEJtTUFYID0gbWF4KHBNZ210LT5wQ3VyckJTUy0+bGRCbUF2ZXJhZ2VbaWldLCBsZEJtKTsKLSAgICAgICAgICAgIH0KKwlmb3IgKGlpID0gMDsgaWkgPCBSU1NJX1NUQVRfQ09VTlQ7IGlpKyspIHsKKwkJaWYgKHBNZ210LT5wQ3VyckJTUy0+bGRCbUF2ZXJhZ2VbaWldICE9IDApIHsKKwkJCXBNZ210LT5wQ3VyckJTUy0+bGRCbU1BWCA9CisJCQkJbWF4KHBNZ210LT5wQ3VyckJTUy0+bGRCbUF2ZXJhZ2VbaWldLCBsZEJtKTsKKwkJfQogICAgICAgICB9CiAgICAgfQogKi8KQEAgLTE0NDgsNyArMTQ0NCw3IEBACiAgICAgaWYgKEZyYW1lU2l6ZSA+IENCX01BWF9CVUZfU0laRSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIC8vIGNoZWNrIERBCi0gICAgaWYoSVNfTVVMVElDQVNUX0FERFJFU1MoKFBCWVRFKShza2ItPmRhdGErY2JIZWFkZXJPZmZzZXQpKSkgeworICAgIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcigoUEJZVEUpKHNrYi0+ZGF0YStjYkhlYWRlck9mZnNldCkpKSB7CiAgICAgICAgaWYgKHBNZ210LT5zTm9kZURCVGFibGVbMF0uYlBTRW5hYmxlKSB7CiAKICAgICAgICAgICAgc2tiY3B5ID0gZGV2X2FsbG9jX3NrYigoaW50KXBEZXZpY2UtPnJ4X2J1Zl9zeik7CkBAIC0xNTIzLDcgKzE1MTksNyBAQAogdm9pZCBSWHZXb3JrSXRlbSh2b2lkICpDb250ZXh0KQogewogICAgIFBTRGV2aWNlIHBEZXZpY2UgPSAoUFNEZXZpY2UpIENvbnRleHQ7Ci0gICAgTlRTVEFUVVMgICAgICAgIG50U3RhdHVzOworICAgIGludCBudFN0YXR1czsKICAgICBQUkNCICAgICAgICAgICAgcFJDQj1OVUxMOwogCiAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPlJ4IFBvbGxpbmcgVGhyZWFkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYwppbmRleCBlMWY5NmQ3Li5lYmI5Yzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jCkBAIC04NDgsNyArODQ4LDcgQEAKICAgICAgUFNEZXZpY2UgcERldmljZQogICAgICkKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKKwlpbnQgbnRTdGF0dXM7CiAKICAgICBudFN0YXR1cyA9IENPTlRST0xuc1JlcXVlc3RJbihwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9UWVBFX1JFQUQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuYwppbmRleCA4OWY1YjE4Li5jOTU4MzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmMKQEAgLTgyLDcgKzgyLDcgQEAKIHZvaWQgSU5UdldvcmtJdGVtKHZvaWQgKkNvbnRleHQpCiB7CiAJUFNEZXZpY2UgcERldmljZSA9IChQU0RldmljZSkgQ29udGV4dDsKLQlOVFNUQVRVUyBudFN0YXR1czsKKwlpbnQgbnRTdGF0dXM7CiAKIAlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+SW50ZXJydXB0IFBvbGxpbmcgVGhyZWFkXG4iKTsKIApAQCAtOTIsMTAgKzkyLDkgQEAKIAlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogfQogCi1OVFNUQVRVUwotSU5UbnNQcm9jZXNzRGF0YShQU0RldmljZSBwRGV2aWNlKQoraW50IElOVG5zUHJvY2Vzc0RhdGEoUFNEZXZpY2UgcERldmljZSkKIHsKLQlOVFNUQVRVUwlzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwlpbnQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJUFNJTlREYXRhCXBJTlREYXRhOwogCVBTTWdtdE9iamVjdAlwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSAmcERldmljZS0+c3RhdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuaAppbmRleCBjZGYzNTUxLi4zMTc2YzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmgKQEAgLTU3LDcgKzU3LDcgQEAKICAgICBCWVRFICAgIGJ5QUNLRmFpbDsKICAgICBCWVRFICAgIGJ5RkNTRXJyOwogICAgIEJZVEUgICAgYWJ5U1dbMl07Ci19X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTSU5URGF0YSwgKlBTSU5URGF0YTsKIAogCkBAIC02OCwxMCArNjgsNiBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogdm9pZCBJTlR2V29ya0l0ZW0odm9pZCAqQ29udGV4dCk7Ci0KLU5UU1RBVFVTCi1JTlRuc1Byb2Nlc3NEYXRhKAotICAgICAgUFNEZXZpY2UgcERldmljZQotICAgICk7CitpbnQgSU5UbnNQcm9jZXNzRGF0YShQU0RldmljZSBwRGV2aWNlKTsKIAogI2VuZGlmIC8qIF9fSU5UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2NtZC5oCmluZGV4IGZiYmExZDUuLjFjZTM5YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvY21kLmgKQEAgLTcwLDEwICs3MCwxMCBAQAogfSBXTUFDX0NNRCwgKlBXTUFDX0NNRDsKIAogdHlwZWRlZiBlbnVtIHRhZ1daT05FVFlQRSB7Ci0gIFpvbmVUeXBlX1VTQT0wLAotICBab25lVHlwZV9KYXBhbj0xLAotICBab25lVHlwZV9FdXJvcGU9MgotfVdaT05FVFlQRTsKKyAgWm9uZVR5cGVfVVNBID0gMCwKKyAgWm9uZVR5cGVfSmFwYW4gPSAxLAorICBab25lVHlwZV9FdXJvcGUgPSAyCit9IFdaT05FVFlQRTsKIAogI2RlZmluZSBBREhPQwkwCiAjZGVmaW5lIElORlJBCTEKQEAgLTgzLDkgKzgzLDkgQEAKICNkZWZpbmUgQURIT0NfU1RBUlRFRAkgICAxCiAjZGVmaW5lIEFESE9DX0pPSU5URUQJICAgMgogCi0jZGVmaW5lIFBIWTgwMjExYSAJICAgIDAKLSNkZWZpbmUgUEhZODAyMTFiICAgICAgIDEKLSNkZWZpbmUgUEhZODAyMTFnICAgICAgIDIKKyNkZWZpbmUgUEhZODAyMTFhIDAKKyNkZWZpbmUgUEhZODAyMTFiIDEKKyNkZWZpbmUgUEhZODAyMTFnIDIKIAogI2RlZmluZSBTU0lEX0lEICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgU1NJRF9NQVhMRU4gICAgICAgICAgICAzMgpAQCAtMTQzLDcgKzE0Myw2IEBACiAKIH0gU0NtZFpvbmVUeXBlU2V0LCAqUFNDbWRab25lVHlwZVNldDsKIAotI2lmZGVmIFdQQV9TTV9UcmFuc3RhdHVzCiB0eXBlZGVmIHN0cnVjdCB0YWdTV1BBUmVzdWx0IHsKICAgICAgICAgIGNoYXIJaWZuYW1lWzEwMF07CiAJdTggcHJvdG87CkBAIC0xNTEsNyArMTUwLDYgQEAKIAl1OCBlYXBfdHlwZTsKICAgICAgICAgIEJPT0wgYXV0aGVudGljYXRlZDsKIH0gU1dQQVJlc3VsdCwgKlBTV1BBUmVzdWx0OwotI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHRhZ1NDbWRTdGFydEFQIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jCmluZGV4IDE5YTg0YjYuLmQ1MzI2MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvY3RsLmMKQEAgLTQ4LDkgKzQ4LDcgQEAKIC8vc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CiAKLSNpZmRlZiBXUEFfU01fVHJhbnN0YXR1cwogICAgIFNXUEFSZXN1bHQgd3BhX1Jlc3VsdDsKLSNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0yMzIsMTAgKzIzMCwxMCBAQAogICAgICAgICAgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBGQUxTRTsKICAgICAgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKICAgICAgICAgICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICAgICAgZm9yKHV1PTA7dXU8TUFYX0tFWV9UQUJMRTt1dSsrKQotICAgICAgICAgICAgICAgIE1BQ3ZEaXNhYmxlS2V5RW50cnkocERldmljZSx1dSk7CisJICAgIGZvciAodXUgPSAwOyB1dSA8IE1BWF9LRVlfVEFCTEU7IHV1KyspCisJCU1BQ3ZEaXNhYmxlS2V5RW50cnkocERldmljZSwgdXUpOwogICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldFUCBmdW5jdGlvbiBkaXNhYmxlLiBcbiIpOworCSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXRVAgZnVuY3Rpb24gZGlzYWJsZS5cbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjU2LDcgKzY1NCw2IEBACiAgICAgICAgIHBSZXEtPndSZXN1bHQgPSAwOwogICAgICAgICBicmVhazsKIAotI2lmZGVmIFdQQV9TTV9UcmFuc3RhdHVzCiAgICAgY2FzZSAweEZGOgogICAgICAgICBtZW1zZXQod3BhX1Jlc3VsdC5pZm5hbWUsMCxzaXplb2Yod3BhX1Jlc3VsdC5pZm5hbWUpKTsKIAkgICAgd3BhX1Jlc3VsdC5wcm90byA9IDA7CkBAIC02NzYsNyArNjczLDYgQEAKIC8vRGF2aWRXYW5nCiAKIGlmKHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD09VFJVRSkgewotICAgI2lmZGVmIFNuZEV2dF9Ub0FQSQogICAgewogICAgICB1bmlvbiBpd3JlcV9kYXRhICAgICAgd3JxdTsKIApAQCAtNjg3LDcgKzY4Myw2IEBACiAgICAgIHdycXUuZGF0YS5sZW5ndGggPXBJdGVtU1NJRC0+bGVuOwogICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CiAgICB9Ci0gICAjZW5kaWYKICAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAgICAgICAgICAgLy9pcyBzdWNjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPwogfQogCkBAIC03MDAsNyArNjk1LDYgQEAKIAogCXBSZXEtPndSZXN1bHQgPSAwOwogICAgICAgICBicmVhazsKLSNlbmRpZgogCiAgICAgZGVmYXVsdDoKICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJpdmF0ZSBjb21tYW5kIG5vdCBzdXBwb3J0Li5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb3dwYS5oCmluZGV4IGRhMDNlZGMuLjk1OWM4ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW93cGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvd3BhLmgKQEAgLTMxLDEwICszMSw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQogI2RlZmluZSBXUEFfSUVfTEVOIDY0CiAKLQogLy9XUEEgcmVsYXRlZAogLyoKIHR5cGVkZWYgZW51bSB7IFdQQV9BTEdfTk9ORSwgV1BBX0FMR19XRVAsIFdQQV9BTEdfVEtJUCwgV1BBX0FMR19DQ01QIH0gd3BhX2FsZzsKQEAgLTU0LDcgKzUyLDcgQEAKIAlWSUFXR0VUX1NFVF9EUk9QX1VORU5DUllQVCA9IDcsCiAJVklBV0dFVF9TRVRfREVBVVRIRU5USUNBVEUgPSA4LAogCVZJQVdHRVRfU0VUX0FTU09DSUFURSA9IDksCi0JVklBV0dFVF9TRVRfRElTQVNTT0NJQVRFPSAxMAorCVZJQVdHRVRfU0VUX0RJU0FTU09DSUFURSA9IDEwCiB9OwogCiAKQEAgLTc2LDggKzc0LDYgQEAKIAl1MTYgcmVzcF9pZV9sZW47CiB9IHZpYXdnZXRfd3BhX2hlYWRlcjsKIAotCi0KIHN0cnVjdCB2aWF3Z2V0X3dwYV9wYXJhbSB7CiAJdTMyIGNtZDsKIAl1OCBhZGRyWzZdOwpAQCAtODYsNDMgKzgyLDM3IEBACiAJCQl1OCBsZW47CiAJCQl1OCBkYXRhWzBdOwogCQl9IGdlbmVyaWNfZWxlbTsKLQogCQlzdHJ1Y3QgewotICAgICAgICAJdTggYnNzaWRbNl07CisJCQl1OCBic3NpZFs2XTsKIAkJCXU4IHNzaWRbMzJdOwogCQkJdTggc3NpZF9sZW47Ci0gICAgICAgIAl1OCAqd3BhX2llOwotICAgICAgICAJdTE2IHdwYV9pZV9sZW47Ci0gICAgICAgIAlpbnQgcGFpcndpc2Vfc3VpdGU7Ci0gICAgICAgIAlpbnQgZ3JvdXBfc3VpdGU7Ci0gICAgICAgIAlpbnQga2V5X21nbXRfc3VpdGU7Ci0gICAgICAgIAlpbnQgYXV0aF9hbGc7Ci0gICAgICAgIAlpbnQgbW9kZTsKLSAgICAgICAgICAgICAgICB1OCByb2FtX2RibTsgIC8vRGF2aWRXYW5nCisJCQl1OCAqd3BhX2llOworCQkJdTE2IHdwYV9pZV9sZW47CisJCQlpbnQgcGFpcndpc2Vfc3VpdGU7CisJCQlpbnQgZ3JvdXBfc3VpdGU7CisJCQlpbnQga2V5X21nbXRfc3VpdGU7CisJCQlpbnQgYXV0aF9hbGc7CisJCQlpbnQgbW9kZTsKKwkJCXU4IHJvYW1fZGJtOwogCQl9IHdwYV9hc3NvY2lhdGU7Ci0KIAkJc3RydWN0IHsKLQkgICAgICAgIGludCBhbGdfbmFtZTsKLQkgICAgICAgIHUxNiBrZXlfaW5kZXg7Ci0JICAgICAgICB1MTYgc2V0X3R4OwotCSAgICAgICAgdTggKnNlcTsKLQkgICAgICAgIHUxNiBzZXFfbGVuOwotCSAgICAgICAgdTggKmtleTsKLQkgICAgICAgIHUxNiBrZXlfbGVuOworCQkJaW50IGFsZ19uYW1lOworCQkJdTE2IGtleV9pbmRleDsKKwkJCXUxNiBzZXRfdHg7CisJCQl1OCAqc2VxOworCQkJdTE2IHNlcV9sZW47CisJCQl1OCAqa2V5OworCQkJdTE2IGtleV9sZW47CiAJCX0gd3BhX2tleTsKLQogCQlzdHJ1Y3QgewogCQkJdTggc3NpZF9sZW47CiAJCQl1OCBzc2lkWzMyXTsKIAkJfSBzY2FuX3JlcTsKLQogCQlzdHJ1Y3QgewogCQkJdTE2IHNjYW5fY291bnQ7CiAJCQl1OCAqYnVmOwogCQl9IHNjYW5fcmVzdWx0czsKLQogCX0gdTsKLQogfTsKIAogI3ByYWdtYSBwYWNrKDEpCkBAIC0xNDIsMTUgKzEzMiwxMiBAQAogCWludCBtYXhyYXRlOwogfTsKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVHlwZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2VuZGlmIC8qIF9fSU9XUEFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKaW5kZXggZmE0MDUyMi4uMDE2YjhlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwpAQCAtODMsMzEgKzgzLDkgQEAKIAlsb25nIGxkQm07CiAKIAlwRGV2aWNlLT53c3RhdHMuc3RhdHVzID0gcERldmljZS0+ZU9QTW9kZTsKLQkjaWZkZWYgQ2FsY3VfTGlua1F1YWwKLQkgI2lmIDAKLQkgIGlmKHBEZXZpY2UtPmJ5QkJUeXBlID09IEJCX1RZUEVfMTFCKSB7Ci0JICAgICBpZihwRGV2aWNlLT5ieUN1cnJTUSA+IDEyMCkKLSAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID0gMTAwOwotCSAgICAgZWxzZQotCQkgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHkgPSBwRGV2aWNlLT5ieUN1cnJTUSoxMDAvMTIwOwotCSAgICB9Ci0JICBlbHNlIGlmKHBEZXZpY2UtPmJ5QkJUeXBlID09IEJCX1RZUEVfMTFHKSB7Ci0gICAgICAgICAgICAgICAgaWYocERldmljZS0+YnlDdXJyU1EgPCAyMCkKLQkJICAgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHkgPSAxMDA7Ci0JICAgICAgIGVsc2UgaWYocERldmljZS0+YnlDdXJyU1EgPjk2KQotCQkgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSAgPSAwOwotCSAgICAgICBlbHNlCi0JCSAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID0gKDk2LXBEZXZpY2UtPmJ5Q3VyclNRKSoxMDAvNzY7Ci0JICAgfQotCSAgIGlmKHBEZXZpY2UtPmJMaW5rUGFzcyAhPVRSVUUpCi0JICAgICAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID0gMDsKLQkgICNlbmRpZgogCSAgIGlmKHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID4gMTAwKQogICAgCSAgICAgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSA9IDEwMDsKICAgICAgICAgICAgICAgIHBEZXZpY2UtPndzdGF0cy5xdWFsLnF1YWwgPShCWVRFKSBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eTsKLQkjZWxzZQotCXBEZXZpY2UtPndzdGF0cy5xdWFsLnF1YWwgPSBwRGV2aWNlLT5ieUN1cnJTUTsKLQkjZW5kaWYKIAlSRnZSU1NJVG9kQm0ocERldmljZSwgKEJZVEUpKHBEZXZpY2UtPnVDdXJyUlNTSSksICZsZEJtKTsKIAlwRGV2aWNlLT53c3RhdHMucXVhbC5sZXZlbCA9IGxkQm07CiAJLy9wRGV2aWNlLT53c3RhdHMucXVhbC5sZXZlbCA9IDB4MTAwIC0gcERldmljZS0+dUN1cnJSU1NJOwpAQCAtMTMzLDE4ICsxMTEsOSBAQAogCQkJICAgICAgdm9pZCAqd3JxLAogCQkJICAgICAgY2hhciAqZXh0cmEpCiB7Ci0vLzIwMDgtMDQwOS0wMiwgPE1hcms+IGJ5IEVpbnNuIExpdQotLyoKLSNpZmRlZiBTYWZlX0Nsb3NlCi0gIFBTRGV2aWNlCSAgICAgICAgcERldmljZSA9IChQU0RldmljZSluZXRkZXZfcHJpdihkZXYpOwotICBpZiAoIShwRGV2aWNlLT5mbGFncyAmIERFVklDRV9GTEFHU19PUEVORUQpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotKi8KLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIgU0lPQ1NJV0NPTU1JVCBcbiIpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DU0lXQ09NTUlUXG4iKTsKIAogCXJldHVybiAwOwotCiB9CiAKIC8qCkBAIC0yMDksOSArMTc4LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCi0jaWZkZWYgdXBkYXRlX0Jzc0xpc3QKIAlCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopIHBEZXZpY2UsIHBEZXZpY2UtPmJMaW5rUGFzcyk7Ci0jZW5kaWYKIAogLy9taWtlIGFkZDogYWN0aXZlIHNjYW4gT1IgcGFzc2l2ZSBzY2FuIE9SIGRlc2lyZV9zc2lkIHNjYW4KICBpZih3cnEtPmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSkgewpAQCAtMjczLDE0ICsyNDAsNyBAQAogCWxvbmcgbGRCbTsKIAljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMF07CiAKLS8vMjAwOC0wNDA5LTAyLCA8TWFyaz4gYnkgRWluc24gTGl1Ci0vKgotI2lmZGVmIFNhZmVfQ2xvc2UKLSAgaWYgKCEocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKLSovCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiIFNJT0NHSVdTQ0FOIFxuIik7CisgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiIFNJT0NHSVdTQ0FOXG4iKTsKIAogICAgIGlmIChwTWdtdC0+ZVNjYW5TdGF0ZSA9PSAgV01BQ19JU19TQ0FOTklORykgewogICAgICAgICAvLyBJbiBzY2FubmluZy4uCkBAIC0zNDksMzkgKzMwOSw2IEBACiAJCQl9CiAJCQlpd2UudS5xdWFsLnVwZGF0ZWQ9NzsKIAotLy8yMDA4LTA0MDktMDEsIDxNYXJrPiBieSBFaW5zbiBMaXUKLS8qCi0vLzIwMDgtMDIyMC0wMywgPE1vZGlmeT4gIGJ5IEVpbnNuIExpdQotCWlmKHBEZXZpY2UtPmJMaW5rUGFzcz09IFRSVUUgJiYgSVNfRVRIX0FERFJFU1NfRVFVQUwocEJTUy0+YWJ5QlNTSUQsIHBNZ210LT5hYnlDdXJyQlNTSUQpKXsKLQkjaWZkZWYgQ2FsY3VfTGlua1F1YWwKLQkgI2lmIDAKLQkgIGlmKHBEZXZpY2UtPmJ5QkJUeXBlID09IEJCX1RZUEVfMTFCKSB7Ci0JICAgICBpZihwRGV2aWNlLT5ieUN1cnJTUSA+IDEyMCkKLSAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID0gMTAwOwotCSAgICAgZWxzZQotCQkgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHkgPSBwRGV2aWNlLT5ieUN1cnJTUSoxMDAvMTIwOwotCSAgICB9Ci0JICBlbHNlIGlmKHBEZXZpY2UtPmJ5QkJUeXBlID09IEJCX1RZUEVfMTFHKSB7Ci0gICAgICAgICAgICAgICAgaWYocERldmljZS0+YnlDdXJyU1EgPCAyMCkKLQkJICAgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHkgPSAxMDA7Ci0JICAgICAgIGVsc2UgaWYocERldmljZS0+YnlDdXJyU1EgPjk2KQotCQkgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSAgPSAwOwotCSAgICAgICBlbHNlCi0JCSAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID0gKDk2LXBEZXZpY2UtPmJ5Q3VyclNRKSoxMDAvNzY7Ci0JICAgfQotCSAgIGlmKHBEZXZpY2UtPmJMaW5rUGFzcyAhPVRSVUUpCi0JICAgICAgIHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID0gMDsKLQkgICNlbmRpZgotCSAgIGlmKHBEZXZpY2UtPnNjU3RhdGlzdGljLkxpbmtRdWFsaXR5ID4gMTAwKQotICAgCSAgICAgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5MaW5rUXVhbGl0eSA9IDEwMDsKLSAgICAgICAgICAgICAgaXdlLnUucXVhbC5xdWFsID0oQllURSkgcERldmljZS0+c2NTdGF0aXN0aWMuTGlua1F1YWxpdHk7Ci0JI2Vsc2UKLQlpd2UudS5xdWFsLnF1YWwgPSBwRGV2aWNlLT5ieUN1cnJTUTsKLQkjZW5kaWYKLQkJfWVsc2UgewotCSAgICAgICAgaXdlLnUucXVhbC5xdWFsID0gMDsKLQkJfQotKi8KICAgICAgICAgICAgICAgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwogICAgICAgIAkvL0FERCBlbmNyeXB0aW9uCiAgICAgICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwpAQCAtNjM0LDE2ICs1NjEsOCBAQAogCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOwogCWludAkJaSxrOwogICAgIEJZVEUgYWJ5U3VwcG9ydGVkUmF0ZXNbMTNdPSB7MHgwMiwgMHgwNCwgMHgwQiwgMHgxNiwgMHgwYywgMHgxMiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwgMHg2QywgMHg5MH07Ci0vLzIwMDgtMDQwOS0wMiwgPE1hcms+IGJ5IEVpbnNuIExpdQotLyoKLSAjaWZkZWYgU2FmZV9DbG9zZQotICBQU0RldmljZQkgICAgICAgIHBEZXZpY2UgPSAoUFNEZXZpY2UpbmV0ZGV2X3ByaXYoZGV2KTsKLSAgaWYgKCEocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKLSAqLwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiIFNJT0NHSVdSQU5HRSBcbiIpOworICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiBTSU9DR0lXUkFOR0VcbiIpOwogCWlmICh3cnEtPnBvaW50ZXIpIHsKIAkJd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKIAkJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CkBAIC02NTMsMjMgKzU3MiwxOSBAQAogCQkvLyBTaG91bGQgYmUgYmFzZWQgb24gY2FwX3JpZC5jb3VudHJ5IHRvIGdpdmUgb25seQogCQkvLyAgd2hhdCB0aGUgY3VycmVudCBjYXJkIHN1cHBvcnQKIAkJayA9IDA7Ci0JCWZvcihpID0gMDsgaSA8IDE0OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKIAkJCXJhbmdlLT5mcmVxW2tdLmkgPSBpICsgMTsgLy8gTGlzdCBpbmRleAogCQkJcmFuZ2UtPmZyZXFba10ubSA9IGZyZXF1ZW5jeV9saXN0W2ldICogMTAwMDAwOwogCQkJcmFuZ2UtPmZyZXFbaysrXS5lID0gMTsJLy8gVmFsdWVzIGluIHRhYmxlIGluIE1IeiAtPiAqIDEwXjUgKiAxMAogCQl9CiAJCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gazsKIAkJLy8gSHVtLi4uIFNob3VsZCBwdXQgdGhlIHJpZ2h0IHZhbHVlcyB0aGVyZQotCSAgICAgI2lmZGVmIENhbGN1X0xpbmtRdWFsCiAgICAgICAgICAgICAgICAgIHJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwotCSAgICAgI2Vsc2UKLQkJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAyNTU7Ci0JICAgICAjZW5kaWYKIAkJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKIAkJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKIAkJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMjU1OwogCi0JCWZvcihpID0gMCA7IGkgPCAxMyA7IGkrKykgeworCQlmb3IgKGkgPSAwIDsgaSA8IDEzIDsgaSsrKSB7CiAJCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IGFieVN1cHBvcnRlZFJhdGVzW2ldICogNTAwMDAwOwogCQkJaWYocmFuZ2UtPmJpdHJhdGVbaV0gPT0gMCkKIAkJCQlicmVhazsKQEAgLTc2MSw3ICs2NzYsNyBAQAogCQltZW1jcHkocE1nbXQtPmFieURlc2lyZUJTU0lELCB3cnEtPnNhX2RhdGEsIDYpOwogCiAJLy9taWtlIDphZGQKLQkgaWYgKChJU19CUk9BRENBU1RfQUREUkVTUyhwTWdtdC0+YWJ5RGVzaXJlQlNTSUQpKSB8fAorCSBpZiAoKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBNZ210LT5hYnlEZXNpcmVCU1NJRCkpIHx8CiAJICAgICAobWVtY21wKHBNZ210LT5hYnlEZXNpcmVCU1NJRCwgWmVyb0JTU0lELCA2KSA9PSAwKSl7CiAJICAgICAgUFJJTlRfSygiU0lPQ1NJV0FQOmludmFsaWQgZGVzaXJlZCBCU1NJRCByZXR1cm4hXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiByYzsKQEAgLTc3Miw3ICs2ODcsOCBAQAogCQl1bnNpZ25lZCBpbnQgaWksIHVTYW1lQnNzaWROdW0gPSAwOwogICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgTUFYX0JTU19OVU07IGlpKyspIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+c0JTU0xpc3RbaWldLmJBY3RpdmUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5QlNTSUQscE1nbXQtPmFieURlc2lyZUJTU0lEKSkgeworCQkJICFjb21wYXJlX2V0aGVyX2FkZHIocE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlCU1NJRCwKKwkJCQkJICAgICBwTWdtdC0+YWJ5RGVzaXJlQlNTSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1U2FtZUJzc2lkTnVtKys7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CkBAIC05NTcsNyArODczLDggQEAKICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgYnkgbWVhbnMgb2YganVkZ2luZyBpZiB0aGVyZSBhcmUgdHdvIHNhbWUgQlNTSUQgZXhpc3QgaW4gbGlzdCA/CiAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHBNZ210LT5zQlNTTGlzdFtpaV0uYkFjdGl2ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgSVNfRVRIX0FERFJFU1NfRVFVQUwocE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlCU1NJRCwgcEN1cnItPmFieUJTU0lEKSkgeworCQkJICFjb21wYXJlX2V0aGVyX2FkZHIocE1nbXQtPnNCU1NMaXN0W2lpXS5hYnlCU1NJRCwKKwkJCQkJICAgICBwQ3Vyci0+YWJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1U2FtZUJzc2lkTnVtKys7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CkBAIC0xMDU3LDcgKzk3NCw3IEBACiAJCXU4CW5vcm12YWx1ZSA9ICh1OCkgKHdycS0+dmFsdWUvNTAwMDAwKTsKIAogCQkvLyBDaGVjayBpZiByYXRlIGlzIHZhbGlkCi0JCWZvcihpID0gMCA7IGkgPCAxMyA7IGkrKykgeworCQlmb3IgKGkgPSAwIDsgaSA8IDEzIDsgaSsrKSB7CiAJCQlpZihub3JtdmFsdWUgPT0gYWJ5U3VwcG9ydGVkUmF0ZXNbaV0pIHsKIAkJCQlicmF0ZSA9IGk7CiAJCQkJYnJlYWs7CkBAIC0xMDY3LDcgKzk4NCw3IEBACiAJLy8gLTEgZGVzaWduZWQgdGhlIG1heCByYXRlIChtb3N0bHkgYXV0byBtb2RlKQogCWlmKHdycS0+dmFsdWUgPT0gLTEpIHsKIAkJLy8gR2V0IHRoZSBoaWdoZXN0IGF2YWlsYWJsZSByYXRlCi0JCWZvcihpID0gMCA7IGkgPCAxMyA7IGkrKykgeworCQlmb3IgKGkgPSAwIDsgaSA8IDEzIDsgaSsrKSB7CiAJCQlpZihhYnlTdXBwb3J0ZWRSYXRlc1tpXSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xNDA1LDggKzEzMjIsOCBAQAogICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CiAgICAgICAgIGlmIChwRGV2aWNlLT5mbGFncyAmIERFVklDRV9GTEFHU19PUEVORUQpIHsKICAgICAgICAgICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICAgICAgZm9yKHV1PTA7dXU8TUFYX0tFWV9UQUJMRTt1dSsrKQotICAgICAgICAgICAgICAgIE1BQ3ZEaXNhYmxlS2V5RW50cnkocERldmljZSx1dSk7CisJICAgIGZvciAodXUgPSAwOyB1dSA8IE1BWF9LRVlfVEFCTEU7IHV1KyspCisJCU1BQ3ZEaXNhYmxlS2V5RW50cnkocERldmljZSwgdXUpOwogICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICAgICAgfQogCX0KQEAgLTE5MjYsMjYgKzE4NDMsNiBAQAogcGFyYW0tPnUud3BhX2tleS5zZXEgPSAodTggKilzZXE7CiBwYXJhbS0+dS53cGFfa2V5LnNlcV9sZW4gPSBzZXFfbGVuOwogCi0jaWYgMAotcHJpbnRrKCJwYXJhbS0+dS53cGFfa2V5LmFsZ19uYW1lID0lZFxuIixwYXJhbS0+dS53cGFfa2V5LmFsZ19uYW1lKTsKLXByaW50aygicGFyYW0tPmFkZHI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JICAgICAgcGFyYW0tPmFkZHJbMF0scGFyYW0tPmFkZHJbMV0scGFyYW0tPmFkZHJbMl0sCi0JICAgICAgcGFyYW0tPmFkZHJbM10scGFyYW0tPmFkZHJbNF0scGFyYW0tPmFkZHJbNV0pOwotcHJpbnRrKCJwYXJhbS0+dS53cGFfa2V5LnNldF90eCA9JWRcbiIscGFyYW0tPnUud3BhX2tleS5zZXRfdHgpOwotcHJpbnRrKCJwYXJhbS0+dS53cGFfa2V5LmtleV9pbmRleCA9JWRcbiIscGFyYW0tPnUud3BhX2tleS5rZXlfaW5kZXgpOwotcHJpbnRrKCJwYXJhbS0+dS53cGFfa2V5LmtleV9sZW4gPSVkXG4iLHBhcmFtLT51LndwYV9rZXkua2V5X2xlbik7Ci1wcmludGsoInBhcmFtLT51LndwYV9rZXkua2V5ID0iKTsKLWZvcihpaT0wO2lpPHBhcmFtLT51LndwYV9rZXkua2V5X2xlbjtpaSsrKQotCXByaW50aygiJTAyeDoiLHBhcmFtLT51LndwYV9rZXkua2V5W2lpXSk7Ci0gICAgICAgICBwcmludGsoIlxuIik7Ci1wcmludGsoInBhcmFtLT51LndwYV9rZXkuc2VxX2xlbiA9JWRcbiIscGFyYW0tPnUud3BhX2tleS5zZXFfbGVuKTsKLXByaW50aygicGFyYW0tPnUud3BhX2tleS5zZXEgPSIpOwotZm9yKGlpPTA7aWk8cGFyYW0tPnUud3BhX2tleS5zZXFfbGVuO2lpKyspCi0JcHJpbnRrKCIlMDJ4OiIscGFyYW0tPnUud3BhX2tleS5zZXFbaWldKTsKLSAgICAgICAgIHByaW50aygiXG4iKTsKLQotcHJpbnRrKCIuLi4uLi4uLi4uLlxuIik7Ci0jZW5kaWYKIC8vKioqKnNldCBpZiBjdXJyZW50IGFjdGlvbiBpcyBOZXR3b3JrIE1hbmFnZXIgY291bnQ/PwogLy8qKioqdGhpcyBtZXRob2QgaXMgc28gZm9vbGlzaCxidXQgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Pz8/CiBpZihwYXJhbS0+dS53cGFfa2V5LmFsZ19uYW1lID09IFdQQV9BTEdfTk9ORSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5oCmluZGV4IGRmOWE0Y2YuLmQ2MDFlOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmgKQEAgLTMzLDE1ICszMywxMyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgQ2xhc3NlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0cnVjdCBpd19zdGF0aXN0aWNzICppd2N0bF9nZXRfd2lyZWxlc3Nfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaXdjdGxfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBpbnQgaXdjdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9rZXkuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYva2V5LmMKaW5kZXggYjA4OTBjMS4uZDE4MWEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9rZXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2tleS5jCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICAqcEtleSA9IE5VTEw7CiAgICAgZm9yIChpPTA7aTxNQVhfS0VZX1RBQkxFO2krKykgewogICAgICAgICBpZiAoKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IFRSVUUpICYmCi0gICAgICAgICAgICBJU19FVEhfQUREUkVTU19FUVVBTChwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELHBieUJTU0lEKSkgeworCSAgICAhY29tcGFyZV9ldGhlcl9hZGRyKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQsIHBieUJTU0lEKSkgewogICAgICAgICAgICAgaWYgKGR3S2V5SW5kZXggPT0gMHhGRkZGRkZGRikgewogICAgICAgICAgICAgICAgIGlmIChwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5LmJLZXlWYWxpZCA9PSBUUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICpwS2V5ID0gJihwVGFibGUtPktleVRhYmxlW2ldLlBhaXJ3aXNlS2V5KTsKQEAgLTI0NSw3ICsyNDUsNyBAQAogICAgICAgICAgICAgaiA9IGk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChwVGFibGUtPktleVRhYmxlW2ldLmJJblVzZSA9PSBUUlVFKSAmJgotICAgICAgICAgICAgSVNfRVRIX0FERFJFU1NfRVFVQUwocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCxwYnlCU1NJRCkpIHsKKwkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELCBwYnlCU1NJRCkpIHsKICAgICAgICAgICAgIC8vIGZvdW5kIHRhYmxlIGFscmVhZHkgZXhpc3QKICAgICAgICAgICAgIGlmICgoZHdLZXlJbmRleCAmIFBBSVJXSVNFX0tFWSkgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIFBhaXJ3aXNlIGtleQpAQCAtNDAyLDcgKzQwMiw3IEBACiAgICAgaW50ICAgICBpOwogICAgIEJPT0wgICAgYlJldHVyblZhbHVlID0gRkFMU0U7CiAKLSAgICBpZiAoSVNfQlJPQURDQVNUX0FERFJFU1MocGJ5QlNTSUQpKSB7CisgICAgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBieUJTU0lEKSkgewogICAgICAgICAvLyBkZWFsdGUgYWxsIGtleQogICAgICAgICBpZiAoKGR3S2V5SW5kZXggJiBQQUlSV0lTRV9LRVkpICE9IDApIHsKICAgICAgICAgICAgIGZvciAoaT0wO2k8TUFYX0tFWV9UQUJMRTtpKyspIHsKQEAgLTQyNyw3ICs0MjcsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoaT0wO2k8TUFYX0tFWV9UQUJMRTtpKyspIHsKICAgICAgICAgICAgIGlmICggKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IFRSVUUpICYmCi0gICAgICAgICAgICAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQscGJ5QlNTSUQpKSB7CisJCSAhY29tcGFyZV9ldGhlcl9hZGRyKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQsIHBieUJTU0lEKSkgewogCiAgICAgICAgICAgICAgICAgaWYgKChkd0tleUluZGV4ICYgUEFJUldJU0VfS0VZKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uUGFpcndpc2VLZXkuYktleVZhbGlkID0gRkFMU0U7CkBAIC00ODMsMTEgKzQ4MywxMSBAQAogCiAgICAgZm9yIChpPTA7aTxNQVhfS0VZX1RBQkxFO2krKykgewogICAgICAgICBpZiAoKHBUYWJsZS0+S2V5VGFibGVbaV0uYkluVXNlID09IFRSVUUpICYmCi0gICAgICAgICAgICBJU19FVEhfQUREUkVTU19FUVVBTChwVGFibGUtPktleVRhYmxlW2ldLmFieUJTU0lELHBieUJTU0lEKSkgeworCSAgICAhY29tcGFyZV9ldGhlcl9hZGRyKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQsIHBieUJTU0lEKSkgewogICAgICAgICAgICAgcFRhYmxlLT5LZXlUYWJsZVtpXS5QYWlyd2lzZUtleS5iS2V5VmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgIGZvcih1PTA7dTxNQVhfR1JPVVBfS0VZO3UrKykgewotICAgICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbdV0uYktleVZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICB9CisJICAgIGZvciAodSA9IDA7IHUgPCBNQVhfR1JPVVBfS0VZOyB1KyspCisJCXBUYWJsZS0+S2V5VGFibGVbaV0uR3JvdXBLZXlbdV0uYktleVZhbGlkID0gRkFMU0U7CisKICAgICAgICAgICAgIHBUYWJsZS0+S2V5VGFibGVbaV0uZHdHVEtleUluZGV4ID0gMDsKICAgICAgICAgICAgIHNfdkNoZWNrS2V5VGFibGVWYWxpZChwRGV2aWNlLCBwVGFibGUpOwogICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKQEAgLTUzMSwxOSArNTMxLDEzIEBACiAgICAgcmV0dXJuOwogfQogCi12b2lkIEtleXZSZW1vdmVBbGxXRVBLZXkoCi0gICAgdm9pZCAqcERldmljZUhhbmRsZXIsCi0gICAgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZQotICAgICkKK3ZvaWQgS2V5dlJlbW92ZUFsbFdFUEtleSh2b2lkICpwRGV2aWNlSGFuZGxlciwgUFNLZXlNYW5hZ2VtZW50IHBUYWJsZSkKIHsKLSAgICBQU0RldmljZSAgICBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKKwlQU0RldmljZSBwRGV2aWNlID0gKFBTRGV2aWNlKSBwRGV2aWNlSGFuZGxlcjsKKwlpbnQgaTsKIAotICAgIGludCBpOwotCi0gICAgZm9yKGk9MDtpPE1BWF9HUk9VUF9LRVk7aSsrKSB7Ci0gICAgICAgIEtleXZSZW1vdmVXRVBLZXkocERldmljZSxwVGFibGUsIGkpOwotICAgIH0KLQorCWZvciAoaSA9IDA7IGkgPCBNQVhfR1JPVVBfS0VZOyBpKyspCisJCUtleXZSZW1vdmVXRVBLZXkocERldmljZSwgcFRhYmxlLCBpKTsKIH0KIAogLyoKQEAgLTU2Nyw3ICs1NjEsNyBAQAogICAgICpwS2V5ID0gTlVMTDsKICAgICBmb3IgKGk9MDtpPE1BWF9LRVlfVEFCTEU7aSsrKSB7CiAgICAgICAgIGlmICgocFRhYmxlLT5LZXlUYWJsZVtpXS5iSW5Vc2UgPT0gVFJVRSkgJiYKLSAgICAgICAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBUYWJsZS0+S2V5VGFibGVbaV0uYWJ5QlNTSUQscGJ5QlNTSUQpKSB7CisJICAgICFjb21wYXJlX2V0aGVyX2FkZHIocFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgcGJ5QlNTSUQpKSB7CiAKICAgICAgICAgICAgIGlmIChkd0tleVR5cGUgPT0gUEFJUldJU0VfS0VZKSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCmluZGV4IDBhYjNkYjAuLjMzNjk4ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuYwpAQCAtMzA2LDggKzMwNiw4IEBACiAgICAgcGJ5RGF0YVs1XSA9IChCWVRFKShkd0RhdGEyPj44KTsKICAgICBwYnlEYXRhWzZdID0gKEJZVEUpKGR3RGF0YTI+PjE2KTsKICAgICBwYnlEYXRhWzddID0gKEJZVEUpKGR3RGF0YTI+PjI0KTsKLSAgICBmb3IoaWk9ODtpaTwyNDtpaSsrKQotICAgICAgICBwYnlEYXRhW2lpXSA9ICpwYnlLZXkrKzsKKyAgICBmb3IgKGlpID0gODsgaWkgPCAyNDsgaWkrKykKKwlwYnlEYXRhW2lpXSA9ICpwYnlLZXkrKzsKIAogICAgIENPTlRST0xuc1JlcXVlc3RPdXQocERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfVFlQRV9TRVRLRVksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuaAppbmRleCA3NzVjNzA5Li40OTFmZjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmgKQEAgLTQyMCwxMSArNDIwLDExIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgTUFDdlNldE11bHRpQWRkckJ5SGFzaCAoUFNEZXZpY2UgcERldmljZSwgQllURSBieUhhc2hJZHgpOwordm9pZCBNQUN2U2V0TXVsdGlBZGRyQnlIYXNoKFBTRGV2aWNlIHBEZXZpY2UsIEJZVEUgYnlIYXNoSWR4KTsKIHZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGludCB1Qnl0ZUlkeCwgQllURSBieURhdGEpOwotQk9PTCBNQUNiU2h1dGRvd24oUFNEZXZpY2UgcERldmljZSk7Owotdm9pZCBNQUN2U2V0QkJUeXBlKFBTRGV2aWNlIHBEZXZpY2UsQllURSBieVR5cGUpOwotdm9pZCBNQUN2U2V0TUlTQ0ZpZm8gKFBTRGV2aWNlIHBEZXZpY2UsIFdPUkQgd09mZnNldCwgRFdPUkQgZHdEYXRhKTsKK0JPT0wgTUFDYlNodXRkb3duKFBTRGV2aWNlIHBEZXZpY2UpOwordm9pZCBNQUN2U2V0QkJUeXBlKFBTRGV2aWNlIHBEZXZpY2UsIEJZVEUgYnlUeXBlKTsKK3ZvaWQgTUFDdlNldE1JU0NGaWZvKFBTRGV2aWNlIHBEZXZpY2UsIFdPUkQgd09mZnNldCwgRFdPUkQgZHdEYXRhKTsKIHZvaWQgTUFDdkRpc2FibGVLZXlFbnRyeShQU0RldmljZSBwRGV2aWNlLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4KTsKIHZvaWQgTUFDdlNldEtleUVudHJ5KFBTRGV2aWNlIHBEZXZpY2UsIFdPUkQgd0tleUN0bCwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCwKIAkJICAgICB1bnNpZ25lZCBpbnQgdUtleUlkeCwgUEJZVEUgcGJ5QWRkciwgUERXT1JEIHBkd0tleSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggMDk4YjA0NS4uYzUyOGVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgQllURSAgICAgICAgICAgIGJ5QW50ZW5uYTsKICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBpaTsKICAgICBDTURfQ0FSRF9JTklUICAgc0luaXRDbWQ7Ci0gICAgTlRTVEFUVVMgICAgICAgIG50U3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisgICAgaW50IG50U3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAgICAgUlNQX0NBUkRfSU5JVCAgIHNJbml0UnNwOwogICAgIFBTTWdtdE9iamVjdCAgICBwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwogICAgIEJZVEUgICAgICAgICAgICBieVRtcDsKQEAgLTQwNyw4ICs0MDcsOCBAQAogCiAgICAgc0luaXRDbWQuYnlJbml0Q2xhc3MgPSAoQllURSlJbml0VHlwZTsKICAgICBzSW5pdENtZC5iRXhpc3RTV05ldEFkZHIgPSAoQllURSkgcERldmljZS0+YkV4aXN0U1dOZXRBZGRyOwotICAgIGZvcihpaT0wO2lpPDY7aWkrKykKLSAgICAgICAgc0luaXRDbWQuYnlTV05ldEFkZHJbaWldID0gcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHJbaWldOworICAgIGZvciAoaWkgPSAwOyBpaSA8IDY7IGlpKyspCisJc0luaXRDbWQuYnlTV05ldEFkZHJbaWldID0gcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHJbaWldOwogICAgIHNJbml0Q21kLmJ5U2hvcnRSZXRyeUxpbWl0ID0gcERldmljZS0+YnlTaG9ydFJldHJ5TGltaXQ7CiAgICAgc0luaXRDbWQuYnlMb25nUmV0cnlMaW1pdCA9IHBEZXZpY2UtPmJ5TG9uZ1JldHJ5TGltaXQ7CiAKQEAgLTQ4NywxMCArNDg3LDEwIEBACiAgICAgICAgICAgaWYoKChwRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV0gPT0gWm9uZVR5cGVfSmFwYW4pIHx8CiAJICAgICAgICAocERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdID09IFpvbmVUeXBlX0V1cm9wZSkpJiYKIAkgICAgIChwRGV2aWNlLT5ieU9yaWdpbmFsWm9uZXR5cGUgPT0gWm9uZVR5cGVfVVNBKSkgewotCSAgICBmb3IoaWk9MTE7aWk8MTQ7aWkrKykgewotICAgICAgICAgICAgICAgIHBEZXZpY2UtPmFieUNDS1B3clRibFtpaV0gPSBwRGV2aWNlLT5hYnlDQ0tQd3JUYmxbMTBdOwotCSAgICAgICBwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpXSA9IHBEZXZpY2UtPmFieU9GRE1Qd3JUYmxbMTBdOwotCSAgICB9CisJCWZvciAoaWkgPSAxMTsgaWkgPCAxNDsgaWkrKykgeworCQkJcERldmljZS0+YWJ5Q0NLUHdyVGJsW2lpXSA9IHBEZXZpY2UtPmFieUNDS1B3clRibFsxMF07CisJCQlwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpXSA9IHBEZXZpY2UtPmFieU9GRE1Qd3JUYmxbMTBdOworCQl9CiAJICB9CiAKICAgICAgICAgLy97eyBSb2JlcnRZdTogMjAwNDExMjQKQEAgLTcxOCwzMyArNzE4LDMyIEBACiAKIHN0YXRpYyBpbnQgdnQ2NjU2X3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewotIFBTRGV2aWNlICBwRGV2aWNlID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcERldmljZS0+ZGV2OworCVBTRGV2aWNlIGRldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLSBwcmludGsoIlZOVFdVU0IgU3VzcGVuZCBTdGFydD09PT09PT5cbiIpOwotaWYoZGV2ICE9IE5VTEwpIHsKLSAgaWYocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKQotICAgICBkZXZpY2VfY2xvc2UoZGV2KTsKLX0KKwlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5kZXYpCisJCXJldHVybiAtRU5PREVWOwogCi0gdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7Ci0gcmV0dXJuIDA7CisJaWYgKGRldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKQorCQlkZXZpY2VfY2xvc2UoZGV2aWNlLT5kZXYpOworCisJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2dDY2NTZfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotIFBTRGV2aWNlICBwRGV2aWNlID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcERldmljZS0+ZGV2OworCVBTRGV2aWNlIGRldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLSBwcmludGsoIlZOVFdVU0IgUmVzdW1lIFN0YXJ0PT09PT09PlxuIik7Ci0gaWYoZGV2ICE9IE5VTEwpIHsKLSAgdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7Ci0gIGlmKCEocERldmljZS0+ZmxhZ3MgJiBERVZJQ0VfRkxBR1NfT1BFTkVEKSkgewotICAgIGlmKGRldmljZV9vcGVuKGRldikhPTApCi0gICAgICAgIHByaW50aygiVk5UV1VTQiBSZXN1bWUgU3RhcnQ9PT09PT0+b3BlbiBmYWlsXG4iKTsKLSAgIH0KLSB9Ci0gcmV0dXJuIDA7CisJaWYgKCFkZXZpY2UgfHwgIWRldmljZS0+ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZikpOworCisJaWYgKCEoZGV2aWNlLT5mbGFncyAmIERFVklDRV9GTEFHU19PUEVORUQpKQorCQlkZXZpY2Vfb3BlbihkZXZpY2UtPmRldik7CisKKwlyZXR1cm4gMDsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpAQCAtNzU4LDkzICs3NTcsNzUgQEAKICAgICAubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRldmljZV9zZXRfbXVsdGksCiB9OwogCi0KIHN0YXRpYyBpbnQgX19kZXZpbml0CiB2dDY2NTZfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAl1OCBmYWtlX21hY1tFVEhfQUxFTl0gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX07CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotICAgIGludCAgICAgICAgIHJjID0gMDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKLSAgICBQU0RldmljZSAgICBwRGV2aWNlID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBOVUxMOworCVBTRGV2aWNlIHBEZXZpY2UgPSBOVUxMOwogCisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBWZXIuICVzXG4iLCBERVZJQ0VfRlVMTF9EUlZfTkFNLCBERVZJQ0VfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fTk9USUNFICJDb3B5cmlnaHQgKGMpIDIwMDQgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuXG4iKTsKIAotICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMgVmVyLiAlc1xuIixERVZJQ0VfRlVMTF9EUlZfTkFNLCBERVZJQ0VfVkVSU0lPTik7Ci0gICAgcHJpbnRrKEtFUk5fTk9USUNFICJDb3B5cmlnaHQgKGMpIDIwMDQgVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuXG4iKTsKKwl1ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERFVklDRV9JTkZPKSk7CiAKLSAgdWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOworCWlmICghbmV0ZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZJQ0VfTkFNRSAiOiBhbGxvY2F0ZSBuZXQgZGV2aWNlIGZhaWxlZFxuIik7CisJCWtmcmVlKHBEZXZpY2UpOworCQlnb3RvIGVycl9ub21lbTsKKwl9CiAKLSAgICBuZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoREVWSUNFX0lORk8pKTsKKwlwRGV2aWNlID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwltZW1zZXQocERldmljZSwgMCwgc2l6ZW9mKERFVklDRV9JTkZPKSk7CiAKLSAgICBpZiAobmV0ZGV2ID09IE5VTEwpIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSIERFVklDRV9OQU1FICI6IGFsbG9jYXRlIG5ldCBkZXZpY2UgZmFpbGVkIFxuIik7Ci0gICAgICAgIGtmcmVlKHBEZXZpY2UpOwotCSAgICBnb3RvIGVycl9ub21lbTsKLSAgICB9CisJcERldmljZS0+ZGV2ID0gbmV0ZGV2OworCXBEZXZpY2UtPnVzYiA9IHVkZXY7CiAKLSAgICBwRGV2aWNlID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLSAgICBtZW1zZXQocERldmljZSwgMCwgc2l6ZW9mKERFVklDRV9JTkZPKSk7CisJZGV2aWNlX3NldF9vcHRpb25zKHBEZXZpY2UpOworCXNwaW5fbG9ja19pbml0KCZwRGV2aWNlLT5sb2NrKTsKIAotICAgIHBEZXZpY2UtPmRldiA9IG5ldGRldjsKLSAgICBwRGV2aWNlLT51c2IgPSB1ZGV2OworCXBEZXZpY2UtPnR4XzgwMjExID0gZGV2aWNlX2RtYTBfdHhfODAyMTE7CisJcERldmljZS0+c01nbXRPYmoucEFkYXB0ZXIgPSAodm9pZCAqKSBwRGV2aWNlOwogCi0gICAgLy8gU2V0IGluaXRpYWwgc2V0dGluZ3MKLSAgICBkZXZpY2Vfc2V0X29wdGlvbnMocERldmljZSk7Ci0gICAgc3Bpbl9sb2NrX2luaXQoJnBEZXZpY2UtPmxvY2spOworCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZkZXZpY2VfbmV0ZGV2X29wczsKKwluZXRkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0KKwkJKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmaXdjdGxfaGFuZGxlcl9kZWY7CiAKLSAgICBwRGV2aWNlLT50eF84MDIxMSA9IGRldmljZV9kbWEwX3R4XzgwMjExOwotICAgIHBEZXZpY2UtPnNNZ210T2JqLnBBZGFwdGVyID0gKHZvaWQgKilwRGV2aWNlOwotCi0gICAgbmV0ZGV2LT5uZXRkZXZfb3BzICAgICAgICAgPSAmZGV2aWNlX25ldGRldl9vcHM7Ci0KLQluZXRkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZpd2N0bF9oYW5kbGVyX2RlZjsKLQotICAgLy8yMDA4LTA2MjMtMDE8UmVtYXJrPmJ5IE1pa2VMaXUKLSAgLy8yMDA3LTA4MjEtMDE8QWRkPmJ5IE1pa2VMaXUKLSAgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcERldmljZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwRGV2aWNlKTsKIAlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZpbnRmLT5kZXYpOwotICAgIG1lbWNweShwRGV2aWNlLT5kZXYtPmRldl9hZGRyLCBmYWtlX21hYywgRVRIX0FMRU4pOwotICAgIHJjID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSIERFVklDRV9OQU1FICIgRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldlxuIik7CisJbWVtY3B5KHBEZXZpY2UtPmRldi0+ZGV2X2FkZHIsIGZha2VfbWFjLCBFVEhfQUxFTik7CisJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERFVklDRV9OQU1FICIgRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldlxuIik7CiAJCWZyZWVfbmV0ZGV2KG5ldGRldik7Ci0gICAgICAgIGtmcmVlKHBEZXZpY2UpOwotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9CisJCWtmcmVlKHBEZXZpY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKLS8vMjAwOC0wNy0yMS0wMTxBZGQ+YnkgTWlrZUxpdQotLy9yZWdpc3RlciB3cGFkZXYKLSNpZiAwCi0gICBpZih3cGFfc2V0X3dwYWRldihwRGV2aWNlLCAxKSE9MCkgewotICAgICBwcmludGsoIkZhaWwgdG8gUmVnaXN0ZXIgV1BBREVWP1xuIik7Ci0gICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2KHBEZXZpY2UtPmRldik7Ci0gICAgICAgIGZyZWVfbmV0ZGV2KG5ldGRldik7Ci0gICAgICAgIGtmcmVlKHBEZXZpY2UpOwotICAgfQotI2VuZGlmCi0gICAgICAgICB1c2JfZGV2aWNlX3Jlc2V0KHBEZXZpY2UpOworCXVzYl9kZXZpY2VfcmVzZXQocERldmljZSk7CiAKLSNpZmRlZiBTbmRFdnRfVG9BUEkKLXsKLSAgdW5pb24gaXdyZXFfZGF0YSAgICAgIHdycXU7Ci0gIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLSAgd3JxdS5kYXRhLmZsYWdzID0gUlRfSU5TTU9EX0VWRU5UX0ZMQUc7Ci0gIHdycXUuZGF0YS5sZW5ndGggPUlGTkFNU0laOwotICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBEZXZpY2UtPmRldi0+bmFtZSk7Ci19Ci0jZW5kaWYKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlNNT0RfRVZFTlRfRkxBRzsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IElGTkFNU0laOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwKKwkJCQkgICAgSVdFVkNVU1RPTSwKKwkJCQkgICAgJndycXUsCisJCQkJICAgIHBEZXZpY2UtPmRldi0+bmFtZSk7CisJfQogCiAJcmV0dXJuIDA7CiAKLQogZXJyX25vbWVtOgotIC8vMjAwOC0wOTIyLTAxPEFkZD5ieSBNaWtlTGl1LCBkZWNyZWFzZSB1c2IgY291bnRlci4KLSAgICB1c2JfcHV0X2Rldih1ZGV2KTsKKwl1c2JfcHV0X2Rldih1ZGV2KTsKIAotICAgIHJldHVybiAtRU5PTUVNOworCXJldHVybiAtRU5PTUVNOwogfQogCi0KIHN0YXRpYyB2b2lkIGRldmljZV9mcmVlX3R4X2J1ZnMoUFNEZXZpY2UgcERldmljZSkKIHsKICAgICBQVVNCX1NFTkRfQ09OVEVYVCBwVHhDb250ZXh0OwpAQCAtMTA2NSw3ICsxMDQ2LDYgQEAKIHN0YXRpYyBpbnQgIGRldmljZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKICAgICBQU0RldmljZSAgICBwRGV2aWNlPShQU0RldmljZSkgbmV0ZGV2X3ByaXYoZGV2KTsKIAotI2lmZGVmIFdQQV9TTV9UcmFuc3RhdHVzCiAgICAgIGV4dGVybiBTV1BBUmVzdWx0IHdwYV9SZXN1bHQ7CiAgICAgIG1lbXNldCh3cGFfUmVzdWx0LmlmbmFtZSwwLHNpemVvZih3cGFfUmVzdWx0LmlmbmFtZSkpOwogICAgICB3cGFfUmVzdWx0LnByb3RvID0gMDsKQEAgLTEwNzMsNyArMTA1Myw2IEBACiAgICAgIHdwYV9SZXN1bHQuZWFwX3R5cGUgPSAwOwogICAgICB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKICAgICAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IEZBTFNFOwotI2VuZGlmCiAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIgZGV2aWNlX29wZW4uLi5cbiIpOwogCkBAIC0xMTcyLDE0ICsxMTUxLDEyIEBACiAgICAgbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwogICAgIHBEZXZpY2UtPmZsYWdzIHw9IERFVklDRV9GTEFHU19PUEVORUQ7CiAKLSNpZmRlZiBTbmRFdnRfVG9BUEkKIHsKICAgdW5pb24gaXdyZXFfZGF0YSAgICAgIHdycXU7CiAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfVVBERVZfRVZFTlRfRkxBRzsKICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKIH0KLSNlbmRpZgogCiAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiZGV2aWNlX29wZW4gc3VjY2Vzcy4uIFxuIik7CiAgICAgcmV0dXJuIDA7CkBAIC0xMjExLDE0ICsxMTg4LDEyIEBACiAgICAgaWYgKHBEZXZpY2UgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAKLSNpZmRlZiBTbmRFdnRfVG9BUEkKIHsKICAgdW5pb24gaXdyZXFfZGF0YSAgICAgIHdycXU7CiAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRE9XTkRFVl9FVkVOVF9GTEFHOwogICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOwogfQotI2VuZGlmCiAKIC8vMjAwNy0xMTIxLTAyPEFkZD5ieSBFaW5zbkxpdQogICAgIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MpIHsKQEAgLTEyMzQsMTAgKzEyMDksMTAgQEAKICAgICAgICAgcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IEZBTFNFOwogICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IEZBTFNFOwogICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0gICAgICAgICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgICAgIGZvcih1dT0wO3V1PE1BWF9LRVlfVEFCTEU7dXUrKykKKwlzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwlmb3IgKHV1ID0gMDsgdXUgPCBNQVhfS0VZX1RBQkxFOyB1dSsrKQogICAgICAgICAgICAgICAgIE1BQ3ZEaXNhYmxlS2V5RW50cnkocERldmljZSx1dSk7Ci0gICAgICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAKICAgICBpZiAoKHBEZXZpY2UtPmZsYWdzICYgREVWSUNFX0ZMQUdTX1VOUExVRykgPT0gRkFMU0UpIHsKICAgICAgICAgTUFDYlNodXRkb3duKHBEZXZpY2UpOwpAQCAtMTI1MCwxMCArMTIyNSw3IEBACiAgICAgZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJDb21tYW5kKTsKICAgICBkZWxfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7CiAKLS8vMjAwNy0wMTE1LTAyPEFkZD5ieSBNaWtlTGl1Ci0jaWZkZWYgVHhJblNsZWVwCiAgICAgZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJUeERhdGEpOwotI2VuZGlmCiAKICAgICBpZiAocERldmljZS0+YkRpdmVyc2l0eVJlZ0N0bE9OKSB7CiAgICAgICAgIGRlbF90aW1lcigmcERldmljZS0+VGltZXJTUTNUbWF4MSk7CkBAIC0xMjkwLDExMiArMTI2Miw4MSBAQAogICAgIHJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2dDY2NTZfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKKwlQU0RldmljZSBkZXZpY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCi0JUFNEZXZpY2UgIHBEZXZpY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWlmICghZGV2aWNlKQorCQlyZXR1cm47CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkZXZpY2VfZGlzY29ubmVjdDEuLiBcbiIpOwotICAgIGlmIChwRGV2aWNlID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgcmVxOworCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCQlyZXEuZGF0YS5mbGFncyA9IFJUX1JNTU9EX0VWRU5UX0ZMQUc7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2aWNlLT5kZXYsIElXRVZDVVNUT00sICZyZXEsIE5VTEwpOworCX0KIAotI2lmZGVmIFNuZEV2dF9Ub0FQSQotewotICB1bmlvbiBpd3JlcV9kYXRhICAgICAgd3JxdTsKLSAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9STU1PRF9FVkVOVF9GTEFHOwotICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOwotfQotI2VuZGlmCi0KLS8vMjAwOC0wNzE0LTAxPEFkZD5ieSBNaWtlTGl1Ci1kZXZpY2VfcmVsZWFzZV9XUEFERVYocERldmljZSk7CisJZGV2aWNlX3JlbGVhc2VfV1BBREVWKGRldmljZSk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotLy8yMDA4LTA5MjItMDE8QWRkPmJ5IE1pa2VMaXUsIGRlY3JlYXNlIHVzYiBjb3VudGVyLgotICAgICB1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKKwl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKIAotICAgIHBEZXZpY2UtPmZsYWdzIHw9IERFVklDRV9GTEFHU19VTlBMVUc7Ci0gICAgaWYgKHBEZXZpY2UtPmRldiAhPSBOVUxMKSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInVucmVnaXN0ZXJfbmV0ZGV2Li5cbiIpOwotICAgICAgICB1bnJlZ2lzdGVyX25ldGRldihwRGV2aWNlLT5kZXYpOworCWRldmljZS0+ZmxhZ3MgfD0gREVWSUNFX0ZMQUdTX1VOUExVRzsKIAotLy8yMDA4LTA3LTIxLTAxPEFkZD5ieSBNaWtlTGl1Ci0vL3VucmVnaXN0ZXIgd3BhZGV2Ci0gICBpZih3cGFfc2V0X3dwYWRldihwRGV2aWNlLCAwKSE9MCkKLSAgICAgcHJpbnRrKCJ1bnJlZ2lzdGVyIHdwYWRldiBmYWlsP1xuIik7Ci0KLSAgICAgICAgZnJlZV9uZXRkZXYocERldmljZS0+ZGV2KTsKLSAgICB9Ci0KLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkZXZpY2VfZGlzY29ubmVjdDMuLiBcbiIpOworCWlmIChkZXZpY2UtPmRldikgeworCQl1bnJlZ2lzdGVyX25ldGRldihkZXZpY2UtPmRldik7CisJCXdwYV9zZXRfd3BhZGV2KGRldmljZSwgMCk7CisJCWZyZWVfbmV0ZGV2KGRldmljZS0+ZGV2KTsKKwl9CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2RtYTBfdHhfODAyMTEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlQU0RldmljZSBwRGV2aWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCisJaWYgKHVubGlrZWx5KHBEZXZpY2UtPmJTdG9wVHgwUGt0KSkKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwllbHNlCisJCXZETUEwX3R4XzgwMjExKHBEZXZpY2UsIHNrYik7CiAKLXN0YXRpYyBpbnQgZGV2aWNlX2RtYTBfdHhfODAyMTEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotICAgIFBTRGV2aWNlICAgICAgICBwRGV2aWNlPW5ldGRldl9wcml2KGRldik7Ci0gICAgUEJZVEUgICAgICAgICAgIHBiTVBEVTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjYk1QRFVMZW4gPSAwOworCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAKLQotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImRldmljZV9kbWEwX3R4XzgwMjExXG4iKTsKLSAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQotICAgIGlmIChwRGV2aWNlLT5iU3RvcFR4MFBrdCA9PSBUUlVFKSB7Ci0gICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH07Ci0KLQotICAgIGNiTVBEVUxlbiA9IHNrYi0+bGVuOwotICAgIHBiTVBEVSA9IHNrYi0+ZGF0YTsKLQotICAgIHZETUEwX3R4XzgwMjExKHBEZXZpY2UsIHNrYik7Ci0KLSAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCi0gICAgcmV0dXJuIDA7Ci0KKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCitzdGF0aWMgaW50IGRldmljZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUFNEZXZpY2UgcERldmljZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnBEZXZpY2UtPnN0YXRzOwogCi1zdGF0aWMgaW50ICBkZXZpY2VfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0gICAgUFNEZXZpY2UgICAgcERldmljZT1uZXRkZXZfcHJpdihkZXYpOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBwU3RhdHMgPSAmcERldmljZS0+c3RhdHM7CisJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKLSAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwlpZiAoIXBEZXZpY2UtPmJMaW5rUGFzcykgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CisJaWYgKHBEZXZpY2UtPmJTdG9wRGF0YVBrdCkgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBpZiAocERldmljZS0+YkxpbmtQYXNzID09IEZBTFNFKSB7Ci0gICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAocERldmljZS0+YlN0b3BEYXRhUGt0ID09IFRSVUUpIHsKLSAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKLSAgICAgICAgcFN0YXRzLT50eF9kcm9wcGVkKys7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlpZiAobnNETUFfdHhfcGFja2V0KHBEZXZpY2UsIFRZUEVfQUMwRE1BLCBza2IpKSB7CisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQogCi0gICAgaWYobnNETUFfdHhfcGFja2V0KHBEZXZpY2UsIFRZUEVfQUMwRE1BLCBza2IpICE9MCkgeyAgLy9taWtlIGFkZDp4bWl0IGZhaWwhCi0gICAgICAgICBpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwRGV2aWNlLT5kZXYpKQotICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHBEZXZpY2UtPmRldik7Ci0gICAgfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAKLSAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotCi0KIHN0YXRpYyB1bnNpZ25lZCBjb25zdCBldGhlcm5ldF9wb2x5bm9taWFsID0gMHgwNGMxMWRiN1U7CiBzdGF0aWMgaW5saW5lIHUzMiBldGhlcl9jcmMoaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKQEAgLTE0NDcsMTIgKzEzODgsMTIgQEAKIAlyZXR1cm4gRkFMU0U7CiAKIC8vY2hlY2sgaWYgY3VycmVudCBjb25maWcgbGluZSBpcyBtYXJrZWQgYnkgIiMiID8/Ci1mb3IoaWk9MTs7aWkrKykgewotICBpZihtZW1jbXAoc3RhcnRfcC1paSwiXG4iLDEpPT0wKQotICAgICAgYnJlYWs7Ci0gIGlmKG1lbWNtcChzdGFydF9wLWlpLCIjIiwxKT09MCkKLSAgICAgIHJldHVybiBGQUxTRTsKLX0KKyAgICBmb3IgKGlpID0gMTsgOyBpaSsrKSB7CisJaWYgKG1lbWNtcChzdGFydF9wIC0gaWksICJcbiIsIDEpID09IDApCisJCWJyZWFrOworCWlmIChtZW1jbXAoc3RhcnRfcCAtIGlpLCAiIyIsIDEpID09IDApCisJCXJldHVybiBGQUxTRTsKKyAgICB9CiAKIC8vZmluZCB0YXJnZXQgc3RyaW5nIGVuZCBwb2ludAogICAgICBlbmRfcCA9IGtzdHJzdHIoc3RhcnRfcCwiXG4iKTsKQEAgLTE1ODUsNyArMTUyNiw2IEBACiAgfQogfQogCi0jaWYgMQogLy9nZXQgb3RoZXIgcGFyYW1ldGVyCiAgIHsKIAltZW1zZXQodG1wYnVmZmVyLDAsc2l6ZW9mKHRtcGJ1ZmZlcikpOwpAQCAtMTU5OCw3ICsxNTM4LDYgQEAKIAkgcERldmljZS0+Y29uZmlnX2ZpbGUuZUVuY3J5cHRpb25TdGF0dXM9IChpbnQpIHNpbXBsZV9zdHJ0b2wodG1wYnVmZmVyLCBOVUxMLCAxMCk7CiAgICAgICAgfQogICB9Ci0jZW5kaWYKIAogICBrZnJlZShidWZmZXIpOwogICByZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWliLmMKaW5kZXggYjY5NGZjOC4uOGE2ZWU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5jCkBAIC0zNDcsMTAgKzM0Nyw5IEBACiAgICAgaWYgKFdMQU5fR0VUX0ZDX01PUkVGUkFHKHBIZWFkZXItPndGcmFtZUN0bCkpCiAgICAgICAgIHBTdGF0aXN0aWMtPmR3UnNyUnhGcmFnbWVudCsrOwogCi0gICAgaWYgKGNiRnJhbWVMZW5ndGggPCBNSU5fUEFDS0VUX0xFTiArIDQpIHsKKyAgICBpZiAoY2JGcmFtZUxlbmd0aCA8IEVUSF9aTEVOICsgNCkgewogICAgICAgICBwU3RhdGlzdGljLT5kd1JzclJ1bnQrKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2JGcmFtZUxlbmd0aCA9PSBNSU5fUEFDS0VUX0xFTiArIDQpIHsKKyAgICB9IGVsc2UgaWYgKGNiRnJhbWVMZW5ndGggPT0gRVRIX1pMRU4gKyA0KSB7CiAgICAgICAgIHBTdGF0aXN0aWMtPmR3UnNyUnhGcm1MZW42NCsrOwogICAgIH0KICAgICBlbHNlIGlmICgoNjUgPD0gY2JGcmFtZUxlbmd0aCkgJiYgKGNiRnJhbWVMZW5ndGggPD0gMTI3KSkgewpAQCAtMzY0LDE3ICszNjMsMTQgQEAKICAgICB9CiAgICAgZWxzZSBpZiAoKDUxMiA8PSBjYkZyYW1lTGVuZ3RoKSAmJiAoY2JGcmFtZUxlbmd0aCA8PSAxMDIzKSkgewogICAgICAgICBwU3RhdGlzdGljLT5kd1JzclJ4RnJtTGVuNTEyXzEwMjMrKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKDEwMjQgPD0gY2JGcmFtZUxlbmd0aCkgJiYgKGNiRnJhbWVMZW5ndGggPD0gTUFYX1BBQ0tFVF9MRU4gKyA0KSkgeworICAgIH0gZWxzZSBpZiAoKDEwMjQgPD0gY2JGcmFtZUxlbmd0aCkgJiYKKwkgICAgICAgKGNiRnJhbWVMZW5ndGggPD0gRVRIX0ZSQU1FX0xFTiArIDQpKSB7CiAgICAgICAgIHBTdGF0aXN0aWMtPmR3UnNyUnhGcm1MZW4xMDI0XzE1MTgrKzsKLSAgICB9IGVsc2UgaWYgKGNiRnJhbWVMZW5ndGggPiBNQVhfUEFDS0VUX0xFTiArIDQpIHsKKyAgICB9IGVsc2UgaWYgKGNiRnJhbWVMZW5ndGggPiBFVEhfRlJBTUVfTEVOICsgNCkgewogICAgICAgICBwU3RhdGlzdGljLT5kd1JzckxvbmcrKzsKICAgICB9Ci0KIH0KIAotCi0KIC8qCiAgKiBEZXNjcmlwdGlvbjogVXBkYXRlIFJ4IFN0YXRpc3RpYyBDb3VudGVyIGFuZCBjb3B5IFJ4IGJ1ZmZlcgogICoKQEAgLTQ2NywxMiArNDYzLDEwIEBACiAgICAgfQogICAgIGlmICggIShieVRTUiAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkpIHsKIAotI2lmZGVmIENhbGN1X0xpbmtRdWFsCiAgICBpZiAoYnlSZXR5Q250IDwgMikKICAgICAgICAgcFN0YXRpc3RpYy0+VHhOb1JldHJ5T2tDb3VudCArKzsKICAgIGVsc2UKICAgICAgICAgcFN0YXRpc3RpYy0+VHhSZXRyeU9rQ291bnQgKys7Ci0jZW5kaWYKIAogICAgICAgICBwU3RhdGlzdGljLT51bGxUc3JPSysrOwogICAgICAgICBwU3RhdGlzdGljLT5DdXN0b21TdGF0LnVsbFRzckFsbE9LKys7CkBAIC00OTMsOSArNDg3LDcgQEAKICAgICB9CiAgICAgZWxzZSB7CiAKLSNpZmRlZiBDYWxjdV9MaW5rUXVhbAogICAgICAgICBwU3RhdGlzdGljLT5UeEZhaWxDb3VudCArKzsKLSNlbmRpZgogCiAgICAgICAgIHBTdGF0aXN0aWMtPmR3VHNyRXJyKys7CiAgICAgICAgIGlmIChieVRTUiAmIFRTUl9SRVRSWVRNTykKQEAgLTU5MSwxMCArNTgzLDcgQEAKICAqCiAgKi8KIAotdm9pZAotU1RBdlVwZGF0ZVVTQkNvdW50ZXIoUFNVU0JDb3VudGVyIHBVc2JDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgTlRTVEFUVVMgbnRTdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICkKK3ZvaWQgU1RBdlVwZGF0ZVVTQkNvdW50ZXIoUFNVU0JDb3VudGVyIHBVc2JDb3VudGVyLCBpbnQgbnRTdGF0dXMpCiB7CiAKIC8vICAgIGlmICggbnRTdGF0dXMgPT0gVVNCRF9TVEFUVVNfQ1JDICkgewpAQCAtNjAyLDUgKzU5MSwzIEBACiAvLyAgICB9CiAKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuaAppbmRleCAwNDU1ZWM5Li5hODljY2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWliLmgKQEAgLTM1Niw3ICszNTYsNiBAQAogCiAgICAgU0N1c3RvbUNvdW50ZXJzIEN1c3RvbVN0YXQ7CiAKLSAgICNpZmRlZiBDYWxjdV9MaW5rUXVhbAogICAgICAgIC8vVHggY291bnQ6CiAgIHVuc2lnbmVkIGxvbmcgVHhOb1JldHJ5T2tDb3VudDsgICAgICAgICAvKiBzdWNjZXNzIHR4IG5vIHJldHJ5ICEgKi8KICAgdW5zaWduZWQgbG9uZyBUeFJldHJ5T2tDb3VudDsgICAgICAgICAgIC8qIHN1Y2Nlc3MgdHggYnV0IHJldHJ5ICEgKi8KQEAgLTM2NywxMiArMzY2LDkgQEAKICAgICAgIC8vc3RhdGlzdGljCiAgICAgdW5zaWduZWQgbG9uZyBTaWduYWxTdHJlbjsKICAgICB1bnNpZ25lZCBsb25nIExpbmtRdWFsaXR5OwotICAgI2VuZGlmCiAKIH0gU1N0YXRDb3VudGVyLCAqUFNTdGF0Q291bnRlcjsKIAotI2RlZmluZSBOVFNUQVRVUyAgICAgICAgaW50Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgQ2xhc3NlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zODEsNyArMzc3LDkgQEAKIAogdm9pZCBTVEF2Q2xlYXJBbGxDb3VudGVyKFBTU3RhdENvdW50ZXIgcFN0YXRpc3RpYyk7CiAKLXZvaWQgU1RBdlVwZGF0ZUlzclN0YXRDb3VudGVyIChQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMsIEJZVEUgYnlJc3IwLCBCWVRFIGJ5SXNyMSk7Cit2b2lkIFNUQXZVcGRhdGVJc3JTdGF0Q291bnRlcihQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMsCisJCQkgICAgICBCWVRFIGJ5SXNyMCwKKwkJCSAgICAgIEJZVEUgYnlJc3IxKTsKIAogdm9pZCBTVEF2VXBkYXRlUkRTdGF0Q291bnRlcihQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMsCiAJCQkgICAgIEJZVEUgYnlSU1IsIEJZVEUgYnlOZXdSU1IsIEJZVEUgYnlSeFN0cywKQEAgLTM5MywxNCArMzkxLDggQEAKIAkJCSAgICAgICBCWVRFIGJ5UnhSYXRlLCBQQllURSBwYnlCdWZmZXIsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGNiRnJhbWVMZW5ndGgpOwogCi12b2lkCi1TVEF2VXBkYXRlVERTdGF0Q291bnRlciAoCi0gICAgUFNTdGF0Q291bnRlciAgIHBTdGF0aXN0aWMsCi0gICAgQllURSAgICAgICAgICAgIGJ5UGt0TnVtLAotICAgIEJZVEUgICAgICAgICAgICBieVJhdGUsCi0gICAgQllURSAgICAgICAgICAgIGJ5VFNSCi0gICAgKTsKLQordm9pZCBTVEF2VXBkYXRlVERTdGF0Q291bnRlcihQU1N0YXRDb3VudGVyIHBTdGF0aXN0aWMsIEJZVEUgYnlQa3ROdW0sCisJCQkgICAgIEJZVEUgYnlSYXRlLCBCWVRFIGJ5VFNSKTsKIAogdm9pZAogU1RBdlVwZGF0ZTgwMl8xMUNvdW50ZXIoCkBAIC00MTMsMTEgKzQwNSw2IEBACiAgICAgKTsKIAogdm9pZCBTVEF2Q2xlYXI4MDJfMTFDb3VudGVyKFBTRG90MTFDb3VudGVycyBwODAyXzExQ291bnRlcik7Ci0KLXZvaWQKLVNUQXZVcGRhdGVVU0JDb3VudGVyKAotICAgIFBTVVNCQ291bnRlciAgICBwVXNiQ291bnRlciwKLSAgICBOVFNUQVRVUyAgICAgICAgbnRTdGF0dXMKLSAgICApOwordm9pZCBTVEF2VXBkYXRlVVNCQ291bnRlcihQU1VTQkNvdW50ZXIgcFVzYkNvdW50ZXIsIGludCBudFN0YXR1cyk7CiAKICNlbmRpZiAvKiBfX01JQl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWljaGFlbC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWNoYWVsLmMKaW5kZXggNjcxYThjZi4uNGQ0MTk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWNoYWVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWNoYWVsLmMKQEAgLTc0LDcgKzc0LDcgQEAKIHsKIAlEV09SRCByZXMgPSAwOwogCXVuc2lnbmVkIGludCBpOwotCWZvcihpPTA7IGk8NDsgaSsrICkKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlyZXMgfD0gKCpwKyspIDw8ICg4KmkpOwogCXJldHVybiByZXM7CiB9CkBAIC04Myw3ICs4Myw3IEBACiAvLyBDb252ZXJ0IGZyb20gRFdPUkQgdG8gQllURVtdIGluIGEgcG9ydGFibGUgd2F5CiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JZm9yKGk9MDsgaTw0OyBpKysgKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkqcCsrID0gKEJZVEUpICh2YWwgJiAweGZmKTsKIAkJdmFsID4+PSA4OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWljaGFlbC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWNoYWVsLmgKaW5kZXggM2FiNjA5Mi4uODEzNTFmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWNoYWVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWNoYWVsLmgKQEAgLTQ5LDggKzQ5LDggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCi0jZGVmaW5lIFJPTDMyKCBBLCBuICkgXAotICggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCi0jZGVmaW5lIFJPUjMyKCBBLCBuICkgUk9MMzIoIChBKSwgMzItKG4pICkKKyNkZWZpbmUgUk9MMzIoQSwgbikgXAorICgoKEEpIDw8IChuKSkgfCAoKChBKT4+KDMyLShuKSkpICAmICgoMVVMIDw8IChuKSkgLSAxKSkpCisjZGVmaW5lIFJPUjMyKEEsIG4pIFJPTDMyKChBKSwgMzItKG4pKQogCiAjZW5kaWYgLyogX19NSUNIQUVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCmluZGV4IDc2NmM1YmUuLjRkN2Q0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqCiAgKiBGaWxlOiBwb3dlci5jCiAgKgotICogUHVycG9zZTogSGFuZGxlcyA4MDIuMTEgcG93ZXIgbWFuYWdtZW50ICBmdW5jdGlvbnMKKyAqIFB1cnBvc2U6IEhhbmRsZXMgODAyLjExIHBvd2VyIG1hbmFnZW1lbnQgIGZ1bmN0aW9ucwogICoKICAqIEF1dGhvcjogTHluZG9uIENoZW4KICAqCkBAIC0yOTAsMTcgKzI5MCwxMSBAQAogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0vLzIwMDctMDExNS0wMzxBZGQ+YnkgTWlrZUxpdQotI2lmZGVmIFR4SW5TbGVlcAogICAgICBpZiAoKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPT0gRkFMU0UpICYmCiAJICAocERldmljZS0+ZlR4RGF0YUluU2xlZXAgPT0gRkFMU0UpKXsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSNlbHNlCi0gICAgaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUgPT0gRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSNlbmRpZgorCiAgICAgbWVtc2V0KHBNZ210LT5wYnlQU1BhY2tldFBvb2wsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fTlVMTERBVEFfRlJfTUFYTEVOKTsKICAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieVBTUGFja2V0UG9vbDsKICAgICBwVHhQYWNrZXQtPnA4MDIxMUhlYWRlciA9IChQVVdMQU5fODAyMTFIRFIpKChQQllURSlwVHhQYWNrZXQgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5oCmluZGV4IDUwNzkyYmIuLjQxYmZmZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBGaWxlOiBwb3dlci5oCiAgKgotICogUHVycG9zZTogSGFuZGxlcyA4MDIuMTEgcG93ZXIgbWFuYWdtZW50ICBmdW5jdGlvbnMKKyAqIFB1cnBvc2U6IEhhbmRsZXMgODAyLjExIHBvd2VyIG1hbmFnZW1lbnQgIGZ1bmN0aW9ucwogICoKICAqIEF1dGhvcjogTHluZG9uIENoZW4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3JmLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3JmLmgKaW5kZXggZDRmOGI5NC4uZjViYThmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcmYuaApAQCAtNjQsMTEgKzY0LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIEJPT0wgSUZSRmJXcml0ZUVtYmVkZWQoUFNEZXZpY2UgcERldmljZSwgRFdPUkQgZHdEYXRhKTsKLUJPT0wgUkZiU2V0UG93ZXIgKAotICAgICAgUFNEZXZpY2UgIHBEZXZpY2UsCi0gICAgICB1bnNpZ25lZCBpbnQgICAgICB1UkFURSwKLSAgICAgIHVuc2lnbmVkIGludCAgICAgIHVDSAotICAgICk7CitCT09MIFJGYlNldFBvd2VyKFBTRGV2aWNlIHBEZXZpY2UsIHVuc2lnbmVkIGludCB1UkFURSwgdW5zaWduZWQgaW50IHVDSCk7CiAKIEJPT0wgUkZiUmF3U2V0UG93ZXIoCiAgICAgICBQU0RldmljZSAgcERldmljZSwKQEAgLTc2LDE3ICs3Miw4IEBACiAgICAgICB1bnNpZ25lZCBpbnQgICAgICB1UkFURQogICAgICk7CiAKLXZvaWQKLVJGdlJTU0lUb2RCbSAoCi0gICAgICBQU0RldmljZSBwRGV2aWNlLAotICAgICAgQllURSAgICAgYnlDdXJyUlNTSSwKLSAgICBsb25nICogICAgcGxkQm0KLSAgICApOwotCi12b2lkCi1SRmJSRlRhYmxlRG93bmxvYWQgKAotICAgICAgUFNEZXZpY2UgcERldmljZQotICAgICk7Cit2b2lkIFJGdlJTU0lUb2RCbShQU0RldmljZSBwRGV2aWNlLCBCWVRFIGJ5Q3VyclJTU0ksIGxvbmcgKnBsZEJtKTsKK3ZvaWQgUkZiUkZUYWJsZURvd25sb2FkKFBTRGV2aWNlIHBEZXZpY2UpOwogCiBCT09MIHNfYlZUMzIyNkQwXzExYkxvQ3VycmVudEFkanVzdCgKICAgICAgIFBTRGV2aWNlICAgIHBEZXZpY2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3JuZGlzLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3JuZGlzLmgKaW5kZXggYWM4NDJkZC4uZmNjZjdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ybmRpcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcm5kaXMuaApAQCAtMTUyLDcgKzE1Miw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lIEVYQ0hfV09SRCh3KSAgICAgICAgKCAoV09SRCkoKFdPUkQpKHcpPDw4KSB8IChXT1JEKSgoV09SRCkodyk+PjgpICkKKyNkZWZpbmUgRVhDSF9XT1JEKHcpICgoV09SRCkoKFdPUkQpKHcpPDw4KSB8IChXT1JEKSgoV09SRCkodyk+PjgpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCmluZGV4IDNlN2U1NjYuLmRlY2EyMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCkBAIC02MSwxMCArNjEsNyBAQAogI2luY2x1ZGUgInJmLmgiCiAjaW5jbHVkZSAiZGF0YXJhdGUuaCIKICNpbmNsdWRlICJ1c2JwaXBlLmgiCi0KLSNpZmRlZiBXUEFfU01fVHJhbnN0YXR1cwogI2luY2x1ZGUgImlvY21kLmgiCi0jZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMzA0LDEwICszMDEsOSBAQAogewogICAgIFBTU3RhdENvdW50ZXIgICAgICAgICAgIHBTdGF0aXN0aWM9JihwRGV2aWNlLT5zY1N0YXRpc3RpYyk7CiAKLQotICAgIGlmIChJU19CUk9BRENBU1RfQUREUkVTUyhwYnlEZXN0QWRkcikpCisgICAgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBieURlc3RBZGRyKSkKICAgICAgICAgcFN0YXRpc3RpYy0+YWJ5VHhQa3RJbmZvW2J5UGt0TnVtXS5ieUJyb2FkTXVsdGlVbmkgPSBUWF9QS1RfQlJPQUQ7Ci0gICAgZWxzZSBpZiAoSVNfTVVMVElDQVNUX0FERFJFU1MocGJ5RGVzdEFkZHIpKQorICAgIGVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBieURlc3RBZGRyKSkKICAgICAgICAgcFN0YXRpc3RpYy0+YWJ5VHhQa3RJbmZvW2J5UGt0TnVtXS5ieUJyb2FkTXVsdGlVbmkgPSBUWF9QS1RfTVVMVEk7CiAgICAgZWxzZQogICAgICAgICBwU3RhdGlzdGljLT5hYnlUeFBrdEluZm9bYnlQa3ROdW1dLmJ5QnJvYWRNdWx0aVVuaSA9IFRYX1BLVF9VTkk7CkBAIC0zMTksOSArMzE1LDYgQEAKIAkgICBFVEhfQUxFTik7CiB9CiAKLQotCi0KIHN0YXRpYwogdm9pZAogc192RmlsbFR4S2V5ICgKQEAgLTE0NzMsNyArMTQ2Niw3IEBACiAgICAgbWVtc2V0KHBUeEJ1ZkhlYWQsIDAsIHNpemVvZihUWF9CVUZGRVIpKTsKIAogICAgIC8vIEdldCBwa3QgdHlwZQotICAgIGlmIChudG9ocyhwc0V0aEhlYWRlci0+d1R5cGUpID4gTUFYX0RBVEFfTEVOKSB7CisgICAgaWYgKG50b2hzKHBzRXRoSGVhZGVyLT53VHlwZSkgPiBFVEhfREFUQV9MRU4pIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmR3RGlhZ1JlZkNvdW50ID09IDApIHsKICAgICAgICAgICAgIGNiODAyXzFfSF9sZW4gPSA4OwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ5MiwxNyArMTQ4NSwxNiBAQAogICAgICAgICBiTmVlZEFDSyA9IEZBTFNFOwogICAgICAgICBwVHhCdWZIZWFkLT53RklGT0N0bCA9IHBUeEJ1ZkhlYWQtPndGSUZPQ3RsICYgKH5GSUZPQ1RMX05FRURBQ0spOwogICAgIH0gZWxzZSB7IC8vaWYgKHBEZXZpY2UtPmR3RGlhZ1JlZkNvdW50ICE9IDApIHsKLSAgICAgICAgaWYgKChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQURIT0MpIHx8Ci0gICAgICAgICAgICAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSkgewotICAgICAgICAgICAgaWYgKElTX01VTFRJQ0FTVF9BRERSRVNTKCYocHNFdGhIZWFkZXItPmFieURzdEFkZHJbMF0pKSB8fAotICAgICAgICAgICAgICAgIElTX0JST0FEQ0FTVF9BRERSRVNTKCYocHNFdGhIZWFkZXItPmFieURzdEFkZHJbMF0pKSkgewotICAgICAgICAgICAgICAgIGJOZWVkQUNLID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgPSBwVHhCdWZIZWFkLT53RklGT0N0bCAmICh+RklGT0NUTF9ORUVEQUNLKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJOZWVkQUNLID0gVFJVRTsKLSAgICAgICAgICAgICAgICBwVHhCdWZIZWFkLT53RklGT0N0bCB8PSBGSUZPQ1RMX05FRURBQ0s7Ci0gICAgICAgICAgICB9CisJaWYgKChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQURIT0MpIHx8CisJICAgIChwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQVApKSB7CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwc0V0aEhlYWRlci0+YWJ5RHN0QWRkcikpIHsKKwkJCWJOZWVkQUNLID0gRkFMU0U7CisJCQlwVHhCdWZIZWFkLT53RklGT0N0bCA9CisJCQkJcFR4QnVmSGVhZC0+d0ZJRk9DdGwgJiAofkZJRk9DVExfTkVFREFDSyk7CisJCX0gZWxzZSB7CisJCQliTmVlZEFDSyA9IFRSVUU7CisJCQlwVHhCdWZIZWFkLT53RklGT0N0bCB8PSBGSUZPQ1RMX05FRURBQ0s7CisJCX0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIC8vIE1TRFVzIGluIEluZnJhIG1vZGUgYWx3YXlzIG5lZWQgQUNLCkBAIC0xNzA4LDcgKzE3MDAsNyBAQAogICAgIH0KIAogICAgIC8vIDgwMi4xSAotICAgIGlmIChudG9ocyhwc0V0aEhlYWRlci0+d1R5cGUpID4gTUFYX0RBVEFfTEVOKSB7CisgICAgaWYgKG50b2hzKHBzRXRoSGVhZGVyLT53VHlwZSkgPiBFVEhfREFUQV9MRU4pIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmR3RGlhZ1JlZkNvdW50ID09IDApIHsKICAgICAgICAgICAgIGlmICggKHBzRXRoSGVhZGVyLT53VHlwZSA9PSBUWVBFX1BLVF9JUFgpIHx8CiAgICAgICAgICAgICAgICAgIChwc0V0aEhlYWRlci0+d1R5cGUgPT0gY3B1X3RvX2xlMTYoMHhGMzgwKSkpIHsKQEAgLTIwMzcsOSArMjAyOSw3IEBACiAgICAgcFR4QnVmSGVhZC0+d0ZJRk9DdGwgfD0gRklGT0NUTF9UTU9FTjsKICAgICBwVHhCdWZIZWFkLT53VGltZVN0YW1wID0gY3B1X3RvX2xlMTYoREVGQVVMVF9NR05fTElGRVRJTUVfUkVTXzY0dXMpOwogCi0KLSAgICBpZiAoSVNfTVVMVElDQVNUX0FERFJFU1MoJihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMVswXSkpIHx8Ci0gICAgICAgIElTX0JST0FEQ0FTVF9BRERSRVNTKCYocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjFbMF0pKSkgeworICAgIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSkpIHsKICAgICAgICAgYk5lZWRBQ0sgPSBGQUxTRTsKICAgICB9CiAgICAgZWxzZSB7CkBAIC0yNDQ2LDkgKzI0MzYsNyBAQAogICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9IEZJRk9DVExfVE1PRU47CiAgICAgcFR4QnVmSGVhZC0+d1RpbWVTdGFtcCA9IGNwdV90b19sZTE2KERFRkFVTFRfTUdOX0xJRkVUSU1FX1JFU182NHVzKTsKIAotCi0gICAgaWYgKElTX01VTFRJQ0FTVF9BRERSRVNTKCYocDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjFbMF0pKSB8fAotICAgICAgICBJU19CUk9BRENBU1RfQUREUkVTUygmKHA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIxWzBdKSkpIHsKKyAgICBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjEpKSB7CiAgICAgICAgIGJOZWVkQUNLID0gRkFMU0U7CiAgICAgICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewogICAgICAgICAgICAgdU5vZGVJbmRleCA9IDA7CkBAIC0yNzQxLDE0ICsyNzI5LDcgQEAKICAqIFJldHVybiBWYWx1ZTogTlVMTAogICovCiAKLQotCi1OVFNUQVRVUwotbnNETUFfdHhfcGFja2V0KAotICAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICAgIHVuc2lnbmVkIGludCAgICB1RE1BSWR4LAotICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYgotICAgICkKK2ludCBuc0RNQV90eF9wYWNrZXQoUFNEZXZpY2UgcERldmljZSwgdW5zaWduZWQgaW50IHVETUFJZHgsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAgICAgUFNNZ210T2JqZWN0ICAgIHBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7CiAgICAgdW5zaWduZWQgaW50IEJ5dGVzVG9Xcml0ZSA9IDAsIHVIZWFkZXJMZW4gPSAwOwpAQCAtMjc3MCw5ICsyNzUxLDYgQEAKICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBzdGF0dXM7CiAgICAgV09SRCAgICAgICAgICAgIHdLZWVwUmF0ZSA9IHBEZXZpY2UtPndDdXJyZW50UmF0ZTsKICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogcFN0YXRzID0gJnBEZXZpY2UtPnN0YXRzOwotLy8jaWZkZWYgV1BBX1NNX1RyYW5zdGF0dXMKLSAgLy8gIGV4dGVybiBTV1BBUmVzdWx0IHdwYV9SZXN1bHQ7Ci0vLyNlbmRpZgogICAgICBCT09MICAgICAgICAgICAgYlR4ZWFwb2xfa2V5ID0gRkFMU0U7CiAKIApAQCAtMjc4Myw3ICsyNzYxLDcgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKElTX01VTFRJQ0FTVF9BRERSRVNTKChQQllURSkoc2tiLT5kYXRhKSkpIHsKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoKFBCWVRFKShza2ItPmRhdGEpKSkgewogICAgICAgICAgICAgdU5vZGVJbmRleCA9IDA7CiAgICAgICAgICAgICBiTm9kZUV4aXN0ID0gVFJVRTsKICAgICAgICAgICAgIGlmIChwTWdtdC0+c05vZGVEQlRhYmxlWzBdLmJQU0VuYWJsZSkgewpAQCAtMjk3NSw3ICsyOTUzLDcgQEAKICAgICBlbHNlIHsKICAgICAgICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykgewogICAgICAgICAgICAgLy8gQWRob2MgVHggcmF0ZSBkZWNpZGVkIGZyb20gbm9kZSBEQgotICAgICAgICAgICAgaWYgKElTX01VTFRJQ0FTVF9BRERSRVNTKCYocERldmljZS0+c1R4RXRoSGVhZGVyLmFieURzdEFkZHJbMF0pKSkgeworCSAgICBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocERldmljZS0+c1R4RXRoSGVhZGVyLmFieURzdEFkZHIpKSB7CiAgICAgICAgICAgICAgICAgLy8gTXVsdGljYXN0IHVzZSBoaWdoZXN0IGRhdGEgcmF0ZQogICAgICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbMF0ud1R4RGF0YVJhdGU7CiAgICAgICAgICAgICAgICAgLy8gcHJlYW1ibGUgdHlwZQpAQCAtMzA3MSwyOCArMzA0OSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogCi0jaWYgMAotICAgICAgICAgICAgaWYoKHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPT0gRkFMU0UpICYmCi0JCSgocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFQU0spfHwocE1nbXQtPmVBdXRoZW5Nb2RlID0gV01BQ19BVVRIX1dQQTJQU0spKSl7Ci0gICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotICAgICAgICAgICAgICAgICAgcFN0YXRzLT50eF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmIChwVHJhbnNtaXRLZXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icmV0dXJuIG5vIHR4IGtleVxuIik7Ci0gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKLSAgICAgICAgICAgICAgICBwU3RhdHMtPnR4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0jZWxzZQogICAgICAgICAgICAgaWYgKHBUcmFuc21pdEtleSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJyZXR1cm4gbm8gdHgga2V5XG4iKTsKICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogICAgICAgICAgICAgICAgIHBTdGF0cy0+dHhfZHJvcHBlZCsrOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgIH0KLSNlbmRpZgotCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyNjEsNyArMzIyMyw4IEBACiAgICAgaWYgKHBEZXZpY2UtPndDdXJyZW50UmF0ZSA8PSBSQVRFXzExTSkKICAgICAgICAgYnlQa3RUeXBlID0gUEtfVFlQRV8xMUI7CiAKLSAgICBCeXRlc1RvV3JpdGUgPSB1RGF0YUxlbiArIFVfQ1JDX0xFTjsKKyAgICBCeXRlc1RvV3JpdGUgPSB1RGF0YUxlbiArIEVUSF9GQ1NfTEVOOworCiAgICAgLy8gQ29udmVydCB0aGUgcGFja2V0IHRvIGFuIHVzYiBmcmFtZSBhbmQgY29weSBpbnRvIG91ciBidWZmZXIKICAgICAvLyBhbmQgc2VuZCB0aGUgaXJwLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCmluZGV4IGY5MGRlNDIuLmY5OWFjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCkBAIC02ODMsOSArNjgzLDkgQEAKICAgICApOwogCiB2b2lkIHZETUEwX3R4XzgwMjExKFBTRGV2aWNlICBwRGV2aWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLU5UU1RBVFVTIG5zRE1BX3R4X3BhY2tldChQU0RldmljZSAgcERldmljZSwKLQkJCSB1bnNpZ25lZCBpbnQgdURNQUlkeCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBuc0RNQV90eF9wYWNrZXQoUFNEZXZpY2UgcERldmljZSwKKwkJICAgIHVuc2lnbmVkIGludCB1RE1BSWR4LAorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBDTURfU1RBVFVTIGNzTWdtdF94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIFBTVHhNZ210UGFja2V0IHBQYWNrZXQpOwogQ01EX1NUQVRVUyBjc0JlYWNvbl94bWl0KFBTRGV2aWNlIHBEZXZpY2UsIFBTVHhNZ210UGFja2V0IHBQYWNrZXQpOwogQk9PTCBiUmVsYXlQYWNrZXRTZW5kKFBTRGV2aWNlIHBEZXZpY2UsIFBCWVRFIHBieVNrYkRhdGEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RldGhlci5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90ZXRoZXIuaAppbmRleCBkNjM1ODZkLi5iZTg3MDIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RldGhlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdGV0aGVyLmgKQEAgLTM2LDI1ICszNiwxMCBAQAogLy8KIC8vIGNvbnN0YW50cwogLy8KLSNkZWZpbmUgVV9DUkNfTEVOICAgICAgICAgICA0ICAgICAgICAgICAvLwogI2RlZmluZSBVX0VUSEVSX0FERFJfU1RSX0xFTiAoRVRIX0FMRU4gKiAyICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFdGhlcm5ldCBhZGRyZXNzIHN0cmluZyBsZW5ndGgKLQotI2RlZmluZSBNSU5fREFUQV9MRU4gICAgICAgIDQ2ICAgICAgICAgIC8vIG1pbiBkYXRhIGxlbmd0aAotI2RlZmluZSBNQVhfREFUQV9MRU4gICAgICAgIDE1MDAgICAgICAgIC8vIG1heCBkYXRhIGxlbmd0aAotCi0jZGVmaW5lIE1JTl9QQUNLRVRfTEVOICAgICAgKE1JTl9EQVRBX0xFTiArIEVUSF9ITEVOKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDYwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWluIHRvdGFsIHBhY2tldCBsZW5ndGggKHR4KQotI2RlZmluZSBNQVhfUEFDS0VUX0xFTiAgICAgIChNQVhfREFUQV9MRU4gKyBFVEhfSExFTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNTE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4IHRvdGFsIHBhY2tldCBsZW5ndGggKHR4KQotCi0jZGVmaW5lIE1BWF9MT09LQUhFQURfU0laRSAgTUFYX1BBQ0tFVF9MRU4KLQogI2RlZmluZSBVX01VTFRJX0FERFJfTEVOICAgIDggICAgICAgICAgIC8vIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aAogCi0KICNpZmRlZiBfX0JJR19FTkRJQU4KIAogI2RlZmluZSBUWVBFX1BLVF9JUCAgICAgICAgIDB4MDgwMCAgICAgIC8vCkBAIC0xNjgsNyArMTUzLDcgQEAKICAgICBCWVRFICAgIGFieURzdEFkZHJbRVRIX0FMRU5dOwogICAgIEJZVEUgICAgYWJ5U3JjQWRkcltFVEhfQUxFTl07CiAgICAgV09SRCAgICB3VHlwZTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFNFdGhlcm5ldEhlYWRlciwgKlBTRXRoZXJuZXRIZWFkZXI7CiAKIApAQCAtMTc5LDcgKzE2NCw3IEBACiAgICAgQllURSAgICBhYnlEc3RBZGRyW0VUSF9BTEVOXTsKICAgICBCWVRFICAgIGFieVNyY0FkZHJbRVRIX0FMRU5dOwogICAgIFdPUkQgICAgd0xlbjsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFM4MDJfM0hlYWRlciwgKlBTODAyXzNIZWFkZXI7CiAKIC8vCkBAIC0xOTMsMzAgKzE3OCwxMCBAQAogICAgIEJZVEUgICAgYWJ5QWRkcjNbRVRIX0FMRU5dOwogICAgIFdPUkQgICAgd1NlcUN0bDsKICAgICBCWVRFICAgIGFieUFkZHI0W0VUSF9BTEVOXTsKLX1fX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIFM4MDJfMTFIZWFkZXIsICpQUzgwMl8xMUhlYWRlcjsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEZyYW1lIHR5cGUgbWFjcm8KLQotI2RlZmluZSBJU19NVUxUSUNBU1RfQUREUkVTUyhwYnlFdGhlckFkZHIpICAgICAgICAgIFwKLSAgICAoKCooUEJZVEUpKHBieUV0aGVyQWRkcikgJiAweDAxKSA9PSAxKQotCi0jZGVmaW5lIElTX0JST0FEQ0FTVF9BRERSRVNTKHBieUV0aGVyQWRkcikgKCAgICAgICAgXAotICAgICgqKFBEV09SRCkocGJ5RXRoZXJBZGRyKSA9PSAweEZGRkZGRkZGTCkgJiYgICAgIFwKLSAgICAoKihQV09SRCkoKFBCWVRFKShwYnlFdGhlckFkZHIpICsgNCkgPT0gMHhGRkZGKSBcCi0pCi0KLSNkZWZpbmUgSVNfTlVMTF9BRERSRVNTKHBieUV0aGVyQWRkcikgKCAgICAgICAgICAgICBcCi0gICAgKCooUERXT1JEKShwYnlFdGhlckFkZHIpID09IDBMKSAmJiAgICAgICAgICAgICAgXAotICAgICgqKFBXT1JEKSgoUEJZVEUpKHBieUV0aGVyQWRkcikgKyA0KSA9PSAwKSAgICAgIFwKLSkKLQotI2RlZmluZSBJU19FVEhfQUREUkVTU19FUVVBTChwYnlBZGRyMSwgcGJ5QWRkcjIpICggIFwKLSAgICAoKihQRFdPUkQpKHBieUFkZHIxKSA9PSAqKFBEV09SRCkocGJ5QWRkcjIpKSAmJiBcCi0gICAgKCooUFdPUkQpKChQQllURSkocGJ5QWRkcjEpICsgNCkgPT0gICAgICAgICAgICAgXAotICAgICooUFdPUkQpKChQQllURSkocGJ5QWRkcjIpICsgNCkpICAgICAgICAgICAgICAgIFwKLSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYwppbmRleCBmODNhZjU5Li5hNmJkNTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYwpAQCAtMTI5LDggKzEyOSw2IEBACiAvL1NUS0lQS2V5TWFuYWdlbWVudCAgc1RLSVBLZXlUYWJsZVtNQVhfVEtJUF9LRVldOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdW5zaWduZWQgaW50IHRraXBfc2JveCh1bnNpZ25lZCBpbnQgaW5kZXgpOwotdW5zaWduZWQgaW50IHJvdHIxKHVuc2lnbmVkIGludCBhKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTM5LDcgKzEzNyw3IEBACiAvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLwogLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBpbnQgdGtpcF9zYm94KHVuc2lnbmVkIGludCBpbmRleCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGtpcF9zYm94KHVuc2lnbmVkIGludCBpbmRleCkKIHsKICAgICB1bnNpZ25lZCBpbnQgaW5kZXhfbG93OwogICAgIHVuc2lnbmVkIGludCBpbmRleF9oaWdoOwpAQCAtMTU1LDcgKzE1Myw3IEBACiB9OwogCiAKLXVuc2lnbmVkIGludCByb3RyMSh1bnNpZ25lZCBpbnQgYSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm90cjEodW5zaWduZWQgaW50IGEpCiB7CiAgICAgdW5zaWduZWQgaW50IGI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdHR5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdHR5cGUuaAppbmRleCBjMjdmOTg1Li44ZTk0NTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3R0eXBlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90dHlwZS5oCkBAIC0zMSwyMyArMzEsNiBAQAogCiAvKioqKioqKiBDb21tb24gZGVmaW5pdGlvbnMgYW5kIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vLzIwMDctMDExNS0wNTxBZGQ+YnkgTWlrZUxpdQotI2lmbmRlZiBUeEluU2xlZXAKLSNkZWZpbmUgVHhJblNsZWVwCi0jZW5kaWYKLQotLy9EYXZpZFdhbmcKLQotLy8yMDA3LTA4MTQtMDE8QWRkPmJ5IE1pa2VMaXUKLSNpZm5kZWYgU2FmZV9DbG9zZQotI2RlZmluZSBTYWZlX0Nsb3NlCi0jZW5kaWYKLQotLy8yMDA4LTAxMzEtMDI8QWRkPmJ5IE1pa2VMaXUKLSNpZm5kZWYgQWRob2NfU1RBCi0jZGVmaW5lIEFkaG9jX1NUQQotI2VuZGlmCi0KIHR5cGVkZWYgaW50ICAgICAgICAgICAgIEJPT0w7CiAKICNpZiAhZGVmaW5lZChUUlVFKQpAQCAtNTcsMTkgKzQwLDYgQEAKICNkZWZpbmUgRkFMU0UgICAgICAgICAgIDAKICNlbmRpZgogCi0vLzIwMDctMDgwOS0wMTxBZGQ+YnkgTWlrZUxpdQotI2lmbmRlZiAgdXBkYXRlX0Jzc0xpc3QKLSNkZWZpbmUgdXBkYXRlX0Jzc0xpc3QKLSNlbmRpZgotCi0jaWZuZGVmIFdQQV9TTV9UcmFuc3RhdHVzCi0jZGVmaW5lIFdQQV9TTV9UcmFuc3RhdHVzCi0jZW5kaWYKLQotI2lmbmRlZiBDYWxjdV9MaW5rUXVhbAotI2RlZmluZSBDYWxjdV9MaW5rUXVhbAotI2VuZGlmCi0KIC8qKioqKiogU2ltcGxlIHR5cGVkZWZzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgIEJZVEU7ICAgICAgICAgICAvLyAgOC1iaXQKQEAgLTk0LDcgKzY0LDYgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIERXT1JEX1BUUjsgICAgICAvLyAzMi1iaXQKIAogLy8gYm9vbGVhbiBwb2ludGVyCi10eXBlZGVmIHVuc2lnbmVkIGludCAqICAgUFVJTlQ7CiAKIHR5cGVkZWYgQllURSAqICAgICAgICAgICBQQllURTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3VzYnBpcGUuYwppbmRleCBmZDIzNTVlLi5hMzI3ODVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3VzYnBpcGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3VzYnBpcGUuYwpAQCAtMTA3LDEwICsxMDcsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgRXhwb3J0IEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KLQotTlRTVEFUVVMKLVBJUEVuc0NvbnRyb2xPdXRBc3luKAoraW50IFBJUEVuc0NvbnRyb2xPdXRBc3luKAogICAgICBQU0RldmljZSAgICAgcERldmljZSwKICAgICAgQllURSAgICAgICAgIGJ5UmVxdWVzdCwKICAgICAgV09SRCAgICAgICAgIHdWYWx1ZSwKQEAgLTExOSw4ICsxMTYsNyBAQAogICAgICBQQllURSAgICAgICAgcGJ5QnVmZmVyCiAgICAgKQogewotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwotCisJaW50IG50U3RhdHVzOwogCiAgICAgaWYgKE1QX1RFU1RfRkxBRyhwRGV2aWNlLCBmTVBfRElTQ09OTkVDVEVEKSkKICAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOwpAQCAtMTU2LDEyICsxNTIsNyBAQAogICAgIHJldHVybiBudFN0YXR1czsKIH0KIAotCi0KLQotCi1OVFNUQVRVUwotUElQRW5zQ29udHJvbE91dCgKK2ludCBQSVBFbnNDb250cm9sT3V0KAogICAgICBQU0RldmljZSAgICAgcERldmljZSwKICAgICAgQllURSAgICAgICAgIGJ5UmVxdWVzdCwKICAgICAgV09SRCAgICAgICAgIHdWYWx1ZSwKQEAgLTE3MCwxMCArMTYxLDkgQEAKICAgICAgUEJZVEUgICAgICAgIHBieUJ1ZmZlcgogICAgICkKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgIG50U3RhdHVzID0gMDsKKwlpbnQgbnRTdGF0dXMgPSAwOwogICAgIGludCBpaTsKIAotCiAgICAgaWYgKE1QX1RFU1RfRkxBRyhwRGV2aWNlLCBmTVBfRElTQ09OTkVDVEVEKSkKICAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCkBAIC0yMTksMTEgKzIwOSw3IEBACiAgICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KLQotCi1OVFNUQVRVUwotUElQRW5zQ29udHJvbEluKAoraW50IFBJUEVuc0NvbnRyb2xJbigKICAgICAgUFNEZXZpY2UgICAgIHBEZXZpY2UsCiAgICAgIEJZVEUgICAgICAgICBieVJlcXVlc3QsCiAgICAgIFdPUkQgICAgICAgICB3VmFsdWUsCkBAIC0yMzIsNyArMjE4LDcgQEAKICAgICAgICBQQllURSAgIHBieUJ1ZmZlcgogICAgICkKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgIG50U3RhdHVzID0gMDsKKwlpbnQgbnRTdGF0dXMgPSAwOwogICAgIGludCBpaTsKIAogICAgIGlmIChNUF9URVNUX0ZMQUcocERldmljZSwgZk1QX0RJU0NPTk5FQ1RFRCkpCkBAIC0zNjAsMTMgKzM0Niw5IEBACiAgKiBSZXR1cm4gVmFsdWU6IFNUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIG9yIHJlc3VsdCBvZiBJb0NhbGxEcml2ZXIKICAqCiAgKi8KLU5UU1RBVFVTCi1QSVBFbnNJbnRlcnJ1cHRSZWFkKAotICAgICBQU0RldmljZSBwRGV2aWNlCi0gICAgKQoraW50IFBJUEVuc0ludGVycnVwdFJlYWQoUFNEZXZpY2UgcERldmljZSkKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgIG50U3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7Ci0KKyAgICBpbnQgbnRTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zU3RhcnRJbnRlcnJ1cHRVc2JSZWFkKClcbiIpOwogCkBAIC0zODEsMjkgKzM2Myw2IEBACiAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBjcmVhdGVkIHRoZSB1cmIsIHdlIHdpbGwgc2VuZCBhCiAgICAgLy8gcmVxdWVzdCB0byB0aGUgVVNCIGRldmljZSBvYmplY3QuCiAgICAgLy8KLSNpZiAwICAgICAgICAgICAgLy9yZXNlcnZlIGludCBVUkIgc3VibWl0Ci0JdXNiX2ZpbGxfaW50X3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLAotCSAgICAgICAgICAgICAgICAgcERldmljZS0+dXNiLAotCSAgICAgICAgICAgICAgICAgdXNiX3JjdmludHBpcGUocERldmljZS0+dXNiLCAxKSwKLQkJCSAodm9pZCAqKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYsCi0JICAgICAgICAgICAgICAgICBNQVhfSU5URVJSVVBUX1NJWkUsCi0JICAgICAgICAgICAgICAgICBzX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWQsCi0JICAgICAgICAgICAgICAgICBwRGV2aWNlLAotCSAgICAgICAgICAgICAgICAgcERldmljZS0+aW50X2ludGVydmFsCi0JICAgICAgICAgICAgICAgICApOwotI2Vsc2UgICAgICAgICAgICAvL3JlcGxhY2UgaW50IFVSQiBzdWJtaXQgYnkgYnVsayB0cmFuc2ZlcgotI2lmbmRlZiBTYWZlX0Nsb3NlCi0JdXNiX2ZpbGxfaW50X3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLAotCSAgICAgICAgICAgICAgICAgcERldmljZS0+dXNiLAotCSAgICAgICAgICAgICAgICAgdXNiX3JjdmludHBpcGUocERldmljZS0+dXNiLCAxKSwKLQkJCSAodm9pZCAqKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYsCi0JICAgICAgICAgICAgICAgICBNQVhfSU5URVJSVVBUX1NJWkUsCi0JICAgICAgICAgICAgICAgICBzX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWQsCi0JICAgICAgICAgICAgICAgICBwRGV2aWNlLAotCSAgICAgICAgICAgICAgICAgcERldmljZS0+aW50X2ludGVydmFsCi0JICAgICAgICAgICAgICAgICApOwotI2Vsc2UKLQogICAgIHBEZXZpY2UtPnBJbnRlcnJ1cHRVUkItPmludGVydmFsID0gcERldmljZS0+aW50X2ludGVydmFsOwogCiB1c2JfZmlsbF9idWxrX3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLApAQCAtNDEzLDggKzM3Miw2IEBACiAJCU1BWF9JTlRFUlJVUFRfU0laRSwKIAkJc19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkLAogCQlwRGV2aWNlKTsKLSNlbmRpZgotI2VuZGlmCiAKIAludFN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBEZXZpY2UtPnBJbnRlcnJ1cHRVUkIsIEdGUF9BVE9NSUMpOwogCWlmIChudFN0YXR1cyAhPSAwKSB7CkBAIC00NDgsOCArNDA1LDcgQEAKIAogewogICAgIFBTRGV2aWNlICAgICAgICBwRGV2aWNlOwotICAgIE5UU1RBVFVTICAgICAgICBudFN0YXR1czsKLQorICAgIGludCBudFN0YXR1czsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWRcbiIpOwogICAgIC8vCkBAIC00OTUsMTMgKzQ1MSw2IEBACiAKIAogICAgIGlmIChwRGV2aWNlLT5mS2lsbEV2ZW50UG9sbGluZ1RocmVhZCAhPSBUUlVFKSB7Ci0gICAjaWYgMCAgICAgICAgICAgICAgIC8vcmVzZXJ2ZSBpbnQgVVJCIHN1Ym1pdAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAobnRTdGF0dXMgIT0gMCkgewotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlJlLVN1Ym1pdCBpbnQgVVJCIGZhaWxlZCAlZFxuIiwgbnRTdGF0dXMpOwotICAgIH0KLSAgICNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVwbGFjZSBpbnQgVVJCIHN1Ym1pdCBieSBidWxrIHRyYW5zZmVyCi0gICAgI2lmZGVmIFNhZmVfQ2xvc2UKICAgICAgICB1c2JfZmlsbF9idWxrX3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLAogCQkgICAgICBwRGV2aWNlLT51c2IsCiAJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShwRGV2aWNlLT51c2IsIDEpLApAQCAtNTE0LDExICs0NjMsNiBAQAogCWlmIChudFN0YXR1cyAhPSAwKSB7CiAJICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU3VibWl0IGludCBVUkIgZmFpbGVkICVkXG4iLCBudFN0YXR1cyk7CiAgICAgICAgICAgIH0KLQotICAgICNlbHNlCi0gICAgICAgIHRhc2tsZXRfc2NoZWR1bGUoJnBEZXZpY2UtPkV2ZW50V29ya0l0ZW0pOwotICAgICNlbmRpZgotI2VuZGlmCiAgICAgfQogICAgIC8vCiAgICAgLy8gV2UgcmV0dXJuIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQgc28gdGhhdCB0aGUgY29tcGxldGlvbgpAQCAtNTQwLDEzICs0ODQsOSBAQAogICogUmV0dXJuIFZhbHVlOiBTVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyBvciByZXN1bHQgb2YgSW9DYWxsRHJpdmVyCiAgKgogICovCi1OVFNUQVRVUwotUElQRW5zQnVsa0luVXNiUmVhZCgKLSAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICAgUFJDQiAgICAgcFJDQgotICAgICkKK2ludCBQSVBFbnNCdWxrSW5Vc2JSZWFkKFBTRGV2aWNlIHBEZXZpY2UsIFBSQ0IgcFJDQikKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgIG50U3RhdHVzPSAwOworCWludCBudFN0YXR1cyA9IDA7CiAgICAgc3RydWN0IHVyYiAgICAgICAgICAqcFVyYjsKIAogCkBAIC02MTYsOSArNTU2LDcgQEAKICAgICB1bnNpZ25lZCBsb25nICAgYnl0ZXNSZWFkOwogICAgIEJPT0wgICAgYkluZGljYXRlUmVjZWl2ZSA9IEZBTFNFOwogICAgIEJPT0wgICAgYlJlQWxsb2NTa2IgPSBGQUxTRTsKLSAgICBOVFNUQVRVUyAgICBzdGF0dXM7Ci0KLQorICAgIGludCBzdGF0dXM7CiAKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0J1bGtJblVzYklvQ29tcGxldGVSZWFkXG4iKTsKICAgICBzdGF0dXMgPSB1cmItPnN0YXR1czsKQEAgLTYyOCw5ICs1NjYsNyBAQAogICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkVycm9yKys7CiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQlVMSyBJbiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CiAKLSAgICAgCSNpZmRlZiBDYWxjdV9MaW5rUXVhbAogICAgICAgICAgICBwRGV2aWNlLT5zY1N0YXRpc3RpYy5SeEZjc0VyckNudCArKzsKLQkjZW5kaWYKIC8vdG9kby4uLnh4eHh4eAogLy8gICAgICAgIGlmIChzdGF0dXMgPT0gVVNCRF9TVEFUVVNfQ1JDKSB7CiAvLyAgICAgICAgICAgIHBEZXZpY2UtPnVsQnVsa0luQ29udENSQ0Vycm9yKys7CkBAIC02NDQsOSArNTgwLDcgQEAKICAgICAgICAgcERldmljZS0+dWxCdWxrSW5Db250Q1JDRXJyb3IgPSAwOwogICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkJ5dGVzUmVhZCArPSBieXRlc1JlYWQ7CiAKLQkjaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgICAgICAgICAgcERldmljZS0+c2NTdGF0aXN0aWMuUnhPa0NudCArKzsKLQkjZW5kaWYKICAgICB9CiAKIApAQCAtNjkwLDcgKzYyNCw3IEBACiAgICAgICBQVVNCX1NFTkRfQ09OVEVYVCBwQ29udGV4dAogICAgICkKIHsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgc3RhdHVzOwogICAgIHN0cnVjdCB1cmIgICAgICAgICAgKnBVcmI7CiAKIApAQCAtNzcxLDcgKzcwNSw3IEBACiAgICAgKQogewogICAgIFBTRGV2aWNlICAgICAgICAgICAgcERldmljZTsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgc3RhdHVzOwogICAgIENPTlRFWFRfVFlQRSAgICAgICAgQ29udGV4dFR5cGU7CiAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIHVsQnVmTGVuOwogICAgIFBVU0JfU0VORF9DT05URVhUICAgcENvbnRleHQ7CkBAIC04MDMsMTAgKzczNyw3IEBACiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iV3JpdGUgJWQgYnl0ZXNcbiIsKGludCl1bEJ1Zkxlbik7CiAgICAgICAgIHBEZXZpY2UtPnVsQnVsa091dEJ5dGVzV3JpdGUgKz0gdWxCdWZMZW47CiAgICAgICAgIHBEZXZpY2UtPnVsQnVsa091dENvbnRDUkNFcnJvciA9IDA7Ci0JLy8yMDA3LTAxMTUtMDY8QWRkPmJ5IE1pa2VMaXUKLSAgICAgICAgICAgI2lmZGVmIFR4SW5TbGVlcAotICAgICAgICAgICAgIHBEZXZpY2UtPm5UeERhdGFUaW1lQ291dCA9IDA7Ci0gICAgICAgICAgICNlbmRpZgorCXBEZXZpY2UtPm5UeERhdGFUaW1lQ291dCA9IDA7CiAKICAgICB9IGVsc2UgewogICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkJVTEsgT3V0IGZhaWxlZCAlZFxuIiwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmgKaW5kZXggZjg1MmIzOS4uYjM2NzM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmgKQEAgLTQxLDggKzQxLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotTlRTVEFUVVMKLVBJUEVuc0NvbnRyb2xPdXQoCitpbnQgUElQRW5zQ29udHJvbE91dCgKICAgICAgUFNEZXZpY2UgICAgIHBEZXZpY2UsCiAgICAgIEJZVEUgICAgICAgICBieVJlcXVlc3QsCiAgICAgIFdPUkQgICAgICAgICB3VmFsdWUsCkBAIC01MSwxMCArNTAsNyBAQAogICAgICBQQllURSAgICAgICAgcGJ5QnVmZmVyCiAgICAgKTsKIAotCi0KLU5UU1RBVFVTCi1QSVBFbnNDb250cm9sT3V0QXN5bigKK2ludCBQSVBFbnNDb250cm9sT3V0QXN5bigKICAgICAgUFNEZXZpY2UgICAgIHBEZXZpY2UsCiAgICAgIEJZVEUgICAgICAgICBieVJlcXVlc3QsCiAgICAgIFdPUkQgICAgICAgICB3VmFsdWUsCkBAIC02Myw4ICs1OSw3IEBACiAgICAgIFBCWVRFICAgICAgICBwYnlCdWZmZXIKICAgICApOwogCi1OVFNUQVRVUwotUElQRW5zQ29udHJvbEluKAoraW50IFBJUEVuc0NvbnRyb2xJbigKICAgICAgUFNEZXZpY2UgICAgIHBEZXZpY2UsCiAgICAgIEJZVEUgICAgICAgICBieVJlcXVlc3QsCiAgICAgIFdPUkQgICAgICAgICB3VmFsdWUsCkBAIC03MywyNCArNjgsOCBAQAogICAgICAgIFBCWVRFICAgcGJ5QnVmZmVyCiAgICAgKTsKIAotCi0KLQotTlRTVEFUVVMKLVBJUEVuc0ludGVycnVwdFJlYWQoCi0gICAgIFBTRGV2aWNlIHBEZXZpY2UKLSAgICApOwotCi1OVFNUQVRVUwotUElQRW5zQnVsa0luVXNiUmVhZCgKLSAgICAgUFNEZXZpY2UgcERldmljZSwKLSAgICAgUFJDQiAgICAgcFJDQgotICAgICk7Ci0KLU5UU1RBVFVTCi1QSVBFbnNTZW5kQnVsa091dCgKLSAgICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgICBQVVNCX1NFTkRfQ09OVEVYVCBwQ29udGV4dAotICAgICk7CitpbnQgUElQRW5zSW50ZXJydXB0UmVhZChQU0RldmljZSBwRGV2aWNlKTsKK2ludCBQSVBFbnNCdWxrSW5Vc2JSZWFkKFBTRGV2aWNlIHBEZXZpY2UsIFBSQ0IgcFJDQik7CitpbnQgUElQRW5zU2VuZEJ1bGtPdXQoUFNEZXZpY2UgcERldmljZSwgUFVTQl9TRU5EX0NPTlRFWFQgcENvbnRleHQpOwogCiAjZW5kaWYgLyogX19VU0JQSVBFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYwppbmRleCA3MmUyMWI2Li42ODY3NDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuYwpAQCAtNTY1LDExICs1NjUsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotLy8yMDA4MDEzMS0wMyw8QWRkPiBieSBNaWtlIExpdQotCSNpZmRlZiBBZGhvY19TVEEKICAgICAgICAgICAgIG1lbWNweShwTWdtdC0+YWJ5QWRIb2NTU0lELHBNZ210LT5hYnlEZXNpcmVTU0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlEZXNpcmVTU0lEKS0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotCSNlbmRpZgorCiAgICAgICAgICAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5RGVzaXJlU1NJRDsKICAgICAgICAgICAgIHBJdGVtU1NJREN1cnIgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBjbWQ6IGRlc2lyZSBzc2lkID0gJXNcbiIsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CkBAIC03MTYsMTggKzcxNCw2IEBACiAJICAgICAgIHJldHVybjsKIAkgICB9CiAJICAgICAgICAgIHBEZXZpY2UtPmJ5TGlua1dhaXRDb3VudCA9IDA7Ci0JCSAjaWYgMAotICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYocERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9PSBUUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgCXVuaW9uIGl3cmVxX2RhdGEgIHdycXU7Ci0gICAgICAgICAgICAgICAgICAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2YgKHdycXUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLSAgICAgICAgICAgICAgICAgIAlwcmludGsoIndpcmVsZXNzX3NlbmRfZXZlbnQtLS0+U0lPQ0dJV0FQKGRpc2Fzc29jaWF0ZWQ6QVVUSEVOVElDQVRFX1dBSVRfdGltZW91dClcbiIpOwotICAgICAgICAgICAgICAgICAgCXdpcmVsZXNzX3NlbmRfZXZlbnQocERldmljZS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLQkgICAgICAgICAjZW5kaWYKIAogICAgICAgICAgICAgc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC03NTQsOCArNzQwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZShwRGV2aWNlLT5kZXYpOwogICAgICAgICAgICAgICAgIH0KIAotCS8vMjAwNy0wMTE1LTA3PEFkZD5ieSBNaWtlTGl1Ci0JICAgICAjaWZkZWYgVHhJblNsZWVwCiAJCSBpZihwRGV2aWNlLT5Jc1R4RGF0YVRyaWdnZXIgIT0gRkFMU0UpICAgeyAgICAvL1R4RGF0YVRpbWVyIGlzIG5vdCB0cmlnZ2VyZWQgYXQgdGhlIGZpcnN0IHRpbWUKICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50aygiUmUtaW5pdGlhbCBUeERhdGFUaW1lcioqKipcbiIpOwogCQkgICAgZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJUeERhdGEpOwpAQCAtNzcxLDcgKzc1NSw2IEBACiAJCSB9CiAJCXBEZXZpY2UtPklzVHhEYXRhVHJpZ2dlciA9IFRSVUU7CiAgICAgICAgICAgICAgICAgYWRkX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJUeERhdGEpOwotICAgICAgICAgICAgICNlbmRpZgogCiAgICAgICAgICAgICB9CiAJICAgZWxzZSBpZihwTWdtdC0+ZUN1cnJTdGF0ZSA8IFdNQUNfU1RBVEVfQVNTT0NQRU5ESU5HKSB7CkBAIC03ODUsMTggKzc2OCw2IEBACiAJICAgICAgIHJldHVybjsKIAkgICB9CiAJICAgICAgICAgIHBEZXZpY2UtPmJ5TGlua1dhaXRDb3VudCA9IDA7Ci0JCSNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAjaWZkZWYgV1BBX1NVUFBMSUNBTlRfRFJJVkVSX1dFWFRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICAvLyBpZihwRGV2aWNlLT5iV1BBU3VwcFdleHRFbmFibGVkID09IFRSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAJdW5pb24gaXdyZXFfZGF0YSAgd3JxdTsKLSAgICAgICAgICAgICAgICAgIAltZW1zZXQoJndycXUsIDAsIHNpemVvZiAod3JxdSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgICAgICAgICAgICAgICAgCXByaW50aygid2lyZWxlc3Nfc2VuZF9ldmVudC0tLT5TSU9DR0lXQVAoZGlzYXNzb2NpYXRlZDpBU1NPQ0lBVEVfV0FJVF90aW1lb3V0KVxuIik7Ci0gICAgICAgICAgICAgICAgICAJd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICNlbmRpZgotCQkjZW5kaWYKIAogICAgICAgICAgICAgc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC05MDcsNyArODc4LDcgQEAKICAgICAgICAvLyAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9mZihwRGV2aWNlKTsKICAgICAgICAvLzIwMDgtMDktMDk8QWRkPiBCWSBNaWtlOkhvdCBLZXkgZm9yIFJhZGlvIE9uL09mZgogICAgICAgIHsKLSAgICAgICAgTlRTVEFUVVMgICAgICAgIG50U3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJICAgICAgIGludCBudFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogICAgICAgICBCWVRFICAgICAgICAgICAgYnlUbXA7CiAKICAgICAgICAgbnRTdGF0dXMgPSBDT05UUk9MbnNSZXF1ZXN0SW4ocERldmljZSwKQEAgLTEzMDAsOCArMTI3MSw2IEBACiAgICAgcERldmljZS0+YkNtZENsZWFyID0gRkFMU0U7CiB9CiAKLS8vMjAwNy0wMTE1LTA4PEFkZD5ieSBNaWtlTGl1Ci0jaWZkZWYgVHhJblNsZWVwCiB2b2lkIEJTU3ZTZWNvbmRUeERhdGEodm9pZCAqaERldmljZUNvbnRleHQpCiB7CiAgIFBTRGV2aWNlICAgICAgICBwRGV2aWNlID0gKFBTRGV2aWNlKWhEZXZpY2VDb250ZXh0OwpAQCAtMTMyMCwxMiArMTI4OSw4IEBACiAKICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgIC8vaXMgd2FwX3N1cHBsaWNhbnQgcnVubmluZyBzdWNjZXNzZnVsIE9SIG9ubHkgb3BlbiAmJiBzaGFyZWtleSBtb2RlIQotICAjaWYgMQogICBpZigoKHBEZXZpY2UtPmJMaW5rUGFzcyA9PVRSVUUpJiYocE1nbXQtPmVBdXRoZW5Nb2RlIDwgV01BQ19BVVRIX1dQQSkpIHx8ICAvL29wZW4gJiYgc2hhcmVrZXkgbGlua2luZwogICAgICAgKHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPT0gVFJVRSkpIHsgICAvL3dwYSBsaW5raW5nCi0gI2Vsc2UKLSAgaWYocERldmljZS0+YkxpbmtQYXNzID09VFJVRSkgewotICNlbmRpZgogICAgICAgICAvLyAgIHByaW50aygibWlrZTolcy0tPkluU2xlZXAgVHggRGF0YSBQcm9jZWR1cmVcbiIsX19GVU5DVElPTl9fKTsKIAkgIHBEZXZpY2UtPmZUeERhdGFJblNsZWVwID0gVFJVRTsKIAkgIFBTYlNlbmROdWxsUGFja2V0KHBEZXZpY2UpOyAgICAgIC8vc2VuZCBudWxsIHBhY2tldApAQCAtMTMzNyw1ICsxMzAyLDMgQEAKICAgYWRkX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJUeERhdGEpOwogICByZXR1cm47CiB9Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuaAppbmRleCAwOWM0NDExLi5kMjRhNzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djbWQuaApAQCAtMTI4LDkgKzEyOCw2IEBACiAgICAgKTsKICovCiAKLS8vMjAwNy0wMTE1LTA5PEFkZD5ieSBNaWtlTGl1Ci0jaWZkZWYgVHhJblNsZWVwCiB2b2lkIEJTU3ZTZWNvbmRUeERhdGEodm9pZCAqaERldmljZUNvbnRleHQpOwotI2VuZGlmCiAKICNlbmRpZiAvKiBfX1dDTURfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3djdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2N0bC5jCmluZGV4IDg1N2NlMGIuLmMyMzFhZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2N0bC5jCkBAIC03OSw3ICs3OSw4IEBACiAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IERVUExJQ0FURV9SWF9DQUNIRV9MRU5HVEg7IGlpKyspIHsKICAgICAgICAgICAgIHBDYWNoZUVudHJ5ID0gJihwQ2FjaGUtPmFzQ2FjaGVFbnRyeVt1SW5kZXhdKTsKICAgICAgICAgICAgIGlmICgocENhY2hlRW50cnktPndGbVNlcXVlbmNlID09IHBNQUNIZWFkZXItPndTZXFDdGwpICYmCi0gICAgICAgICAgICAgICAgKElTX0VUSF9BRERSRVNTX0VRVUFMICgmKHBDYWNoZUVudHJ5LT5hYnlBZGRyMlswXSksICYocE1BQ0hlYWRlci0+YWJ5QWRkcjJbMF0pKSkgJiYKKwkJKCFjb21wYXJlX2V0aGVyX2FkZHIoJihwQ2FjaGVFbnRyeS0+YWJ5QWRkcjJbMF0pLAorCQkJCSAgICAgJihwTUFDSGVhZGVyLT5hYnlBZGRyMlswXSkpKSAmJgogICAgICAgICAgICAgICAgIChMT0JZVEUocENhY2hlRW50cnktPndGcmFtZUN0bCkgPT0gTE9CWVRFKHBNQUNIZWFkZXItPndGcmFtZUN0bCkpCiAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgLyogRHVwbGljYXRlIG1hdGNoICovCkBAIC0xMTEsMjIgKzExMiwyMSBAQAogICogUmV0dXJuIFZhbHVlOiBpbmRleCBudW1iZXIgaW4gRGVmcmFnbWVudCBEYXRhYmFzZQogICoKICAqLworCiB1bnNpZ25lZCBpbnQgV0NUTHVTZWFyY2hERkNCKFBTRGV2aWNlIHBEZXZpY2UsIFBTODAyXzExSGVhZGVyIHBNQUNIZWFkZXIpCiB7CiAJdW5zaWduZWQgaW50IGlpOwogCi0gICAgZm9yKGlpPTA7aWk8cERldmljZS0+Y2JERkNCO2lpKyspIHsKLSAgICAgICAgaWYgKChwRGV2aWNlLT5zUnhERkNCW2lpXS5iSW5Vc2UgPT0gVFJVRSkgJiYKLSAgICAgICAgICAgIChJU19FVEhfQUREUkVTU19FUVVBTCAoJihwRGV2aWNlLT5zUnhERkNCW2lpXS5hYnlBZGRyMlswXSksICYocE1BQ0hlYWRlci0+YWJ5QWRkcjJbMF0pKSkKLSAgICAgICAgICAgICkgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJldHVybihpaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuKHBEZXZpY2UtPmNiREZDQik7CisJZm9yIChpaSA9IDA7IGlpIDwgcERldmljZS0+Y2JERkNCOyBpaSsrKSB7CisJCWlmICgocERldmljZS0+c1J4REZDQltpaV0uYkluVXNlID09IFRSVUUpICYmCisJCSAgICAoIWNvbXBhcmVfZXRoZXJfYWRkcigmKHBEZXZpY2UtPnNSeERGQ0JbaWldLmFieUFkZHIyWzBdKSwKKwkJCQkJICAmKHBNQUNIZWFkZXItPmFieUFkZHIyWzBdKSkpKSB7CisJCQlyZXR1cm4gaWk7CisJCX0KKwl9CisJcmV0dXJuIHBEZXZpY2UtPmNiREZDQjsKIH0KIAotCiAvKgogICogRGVzY3JpcHRpb246CiAgKiAgICAgIEluc2VydCByZWNlaXZlZCBmcmFnbWVudCBwYWNrZXQgaW4gRGVmcmFnbWVudCBEYXRhYmFzZQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKICAgICBpZiAocERldmljZS0+Y2JGcmVlREZDQiA9PSAwKQogICAgICAgICByZXR1cm4ocERldmljZS0+Y2JERkNCKTsKLSAgICBmb3IoaWk9MDtpaTxwRGV2aWNlLT5jYkRGQ0I7aWkrKykgeworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiREZDQjsgaWkrKykgewogICAgICAgICBpZiAocERldmljZS0+c1J4REZDQltpaV0uYkluVXNlID09IEZBTFNFKSB7CiAgICAgICAgICAgICBwRGV2aWNlLT5jYkZyZWVERkNCLS07CiAgICAgICAgICAgICBwRGV2aWNlLT5zUnhERkNCW2lpXS51TGlmZXRpbWUgPSBwRGV2aWNlLT5kd01heFJlY2VpdmVMaWZldGltZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93bWdyLmMKaW5kZXggOTNjMTVmMC4uZTRlY2E5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93bWdyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93bWdyLmMKQEAgLTM1Myw5ICszNTMsOSBAQAogICAgIHBNZ210LT5wYnlQU1BhY2tldFBvb2wgPSAmcE1nbXQtPmJ5UFNQYWNrZXRQb29sWzBdOwogICAgIHBNZ210LT5wYnlNZ210UGFja2V0UG9vbCA9ICZwTWdtdC0+YnlNZ210UGFja2V0UG9vbFswXTsKICAgICBwTWdtdC0+dUN1cnJDaGFubmVsID0gcERldmljZS0+dUNoYW5uZWw7Ci0gICAgZm9yKGlpPTA7aWk8V0xBTl9CU1NJRF9MRU47aWkrKykgewotICAgICAgICBwTWdtdC0+YWJ5RGVzaXJlQlNTSURbaWldID0gMHhGRjsKLSAgICB9CisgICAgZm9yIChpaSA9IDA7IGlpIDwgV0xBTl9CU1NJRF9MRU47IGlpKyspCisJcE1nbXQtPmFieURlc2lyZUJTU0lEW2lpXSA9IDB4RkY7CisKICAgICBwTWdtdC0+c0Fzc29jSW5mby5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKICAgICAvL21lbXNldChwTWdtdC0+YWJ5RGVzaXJlU1NJRCwgMCwgV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsxKTsKICAgICBwTWdtdC0+YnlDU1NQSyA9IEtFWV9DVExfTk9ORTsKQEAgLTM3Myw4ICszNzMsNiBAQAogICAgIHBEZXZpY2UtPnNUaW1lckNvbW1hbmQuZnVuY3Rpb24gPSAoVGltZXJGdW5jdGlvbil2UnVuQ29tbWFuZDsKICAgICBwRGV2aWNlLT5zVGltZXJDb21tYW5kLmV4cGlyZXMgPSBSVU5fQVQoSFopOwogCi0vLzIwMDctMDExNS0xMDxBZGQ+YnkgTWlrZUxpdQotICAgI2lmZGVmIFR4SW5TbGVlcAogICAgIGluaXRfdGltZXIoJnBEZXZpY2UtPnNUaW1lclR4RGF0YSk7CiAgICAgcERldmljZS0+c1RpbWVyVHhEYXRhLmRhdGEgPSAodW5zaWduZWQgbG9uZylwRGV2aWNlOwogICAgIHBEZXZpY2UtPnNUaW1lclR4RGF0YS5mdW5jdGlvbiA9IChUaW1lckZ1bmN0aW9uKUJTU3ZTZWNvbmRUeERhdGE7CkBAIC0zODIsNyArMzgwLDYgQEAKICAgICBwRGV2aWNlLT5mVHhEYXRhSW5TbGVlcCA9IEZBTFNFOwogICAgIHBEZXZpY2UtPklzVHhEYXRhVHJpZ2dlciA9IEZBTFNFOwogICAgIHBEZXZpY2UtPm5UeERhdGFUaW1lQ291dCA9IDA7Ci0gICAjZW5kaWYKIAogICAgIHBEZXZpY2UtPmNiRnJlZUNtZFF1ZXVlID0gQ01EX1FfU0laRTsKICAgICBwRGV2aWNlLT51Q21kRGVxdWV1ZUlkeCA9IDA7CkBAIC0xMDU2LDcgKzEwNTMsNiBAQAogCiAgICAgfQogCi0jaWYgMQogI2lmZGVmIFdQQV9TVVBQTElDQU5UX0RSSVZFUl9XRVhUX1NVUFBPUlQKIC8vbmVlZCBjbGVhciBmbGFncyByZWxhdGVkIHRvIE5ldHdvcmttYW5hZ2VyCiAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ3ZXh0c3RlcDAgPSBGQUxTRTsKQEAgLTEwNjUsNyArMTA2MSw2IEBACiAgICAgICAgICAgICAgIHBEZXZpY2UtPmJ3ZXh0c3RlcDMgPSBGQUxTRTsKICAgICAgICAgICAgICAgcERldmljZS0+YldQQVN1cHBXZXh0RW5hYmxlZCA9IEZBTFNFOwogI2VuZGlmCi0jZW5kaWYKIAogaWYocE1nbXQtPmVDdXJyU3RhdGUgPT0gV01BQ19TVEFURV9BU1NPQykKICAgICAgIHRpbWVyX2V4cGlyZShwRGV2aWNlLT5zVGltZXJDb21tYW5kLCAwKTsKQEAgLTE3MDUsNyArMTcwMCw4IEBACiAJICAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IEZBTFNFOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfTk9USUNFLCBLRVJOX0lORk8gICJBUCBkZWF1dGhlZCBtZSwgcmVhc29uPSVkLlxuIiwgY3B1X3RvX2xlMTYoKCooc0ZyYW1lLnB3UmVhc29uKSkpKTsKICAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBCU1MgbGlzdCBmb3Igc3BlY2lmaWMgQlNTSUQgaWYgcHJlLWF1dGhlbnRpY2F0aW9uIGNhc2UKLSAgICAgICAgICAgIGlmIChJU19FVEhfQUREUkVTU19FUVVBTChzRnJhbWUucEhkci0+c0EzLmFieUFkZHIzLCBwTWdtdC0+YWJ5Q3VyckJTU0lEKSkgeworCSAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihzRnJhbWUucEhkci0+c0EzLmFieUFkZHIzLAorCQkJCSAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEKSkgewogICAgICAgICAgICAgICAgIGlmIChwTWdtdC0+ZUN1cnJTdGF0ZSA+PSBXTUFDX1NUQVRFX0FVVEhQRU5ESU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5zTm9kZURCVGFibGVbMF0uYkFjdGl2ZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJNb2RlID0gV01BQ19NT0RFX1NUQU5EQlk7CkBAIC0yNDcxLDExICsyNDY3LDggQEAKICAgICBwRGV2aWNlLT51Q3VyclJTU0kgPSAwOwogICAgIHBEZXZpY2UtPmJ5Q3VyclNRID0gMDsKIAotLy8yMDA4MDEzMS0wNCw8QWRkPiBieSBNaWtlIExpdQotI2lmZGVmIEFkaG9jX1NUQQogICAgIG1lbWNweShwTWdtdC0+YWJ5RGVzaXJlU1NJRCxwTWdtdC0+YWJ5QWRIb2NTU0lELAogICAgICAgICAgICAgICAgICAgICAgICgoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5QWRIb2NTU0lEKS0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotI2VuZGlmCiAKICAgICBtZW1zZXQocE1nbXQtPmFieUN1cnJTU0lELCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKICAgICBtZW1jcHkocE1nbXQtPmFieUN1cnJTU0lELApAQCAtMzA5OSwxMiArMzA5Miw2IEBACiAgIFBTTWdtdE9iamVjdCAgcE1nbXQgPSAmKHBEZXZpY2UtPnNNZ210T2JqKTsKICAgLyogdW5zaWduZWQgaW50IGlpLCB1U2FtZUJzc2lkTnVtPTA7ICovCiAKLSAgICAgICAgLy8gIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7Ci0gICAgICAgICAgLy8gICBpZiAocE1nbXQtPnNCU1NMaXN0W2lpXS5iQWN0aXZlICYmCi0gICAgICAgICAgICAvLyAgICAgIElTX0VUSF9BRERSRVNTX0VRVUFMKHBNZ210LT5zQlNTTGlzdFtpaV0uYWJ5QlNTSUQsIHBDdXJyLT5hYnlCU1NJRCkpIHsKLSAgICAgICAgICAgICAvLyAgICAgICB1U2FtZUJzc2lkTnVtKys7Ci0gICAgICAgICAgICAgICAvLyAgIH0KLSAgICAgICAgICAgLy8gfQogICAvLyAgIGlmKCB1U2FtZUJzc2lkTnVtPj0yKSB7CSAvL3dlIG9ubHkgY2hlY2sgQVAgaW4gaGlkZGVuIHNzc2lkICBtb2RlCiAgICAgICAgIGlmICgocE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFQU0spIHx8ICAgICAgICAgICAvL25ldHdvcmttYW5hZ2VyIDAuNy4wIGRvZXMgbm90IGdpdmUgdGhlIHBhaXJ3aXNlLWtleSBzZWxzZWN0aW9uLAogICAgICAgICAgICAgIChwTWdtdC0+ZUF1dGhlbk1vZGUgPT0gV01BQ19BVVRIX1dQQTJQU0spKSB7ICAgICAgICAgLy8gc28gd2UgbmVlZCByZS1zZWxzZWN0IGl0IGFjY29yZGluZyB0byByZWFsIHBhaXJ3aXNlLWtleSBpbmZvLgpAQCAtNDc5NSwyMSArNDc4MiwyMSBAQAogICAgICAgICAgICAgYnlNdWx0aWNhc3RDaXBoZXIgPSBLRVlfQ1RMX0lOVkFMSUQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBjaGVjayBQYWlyd2lzZSBLZXkgQ2lwaGVyCi0gICAgICAgIGZvcihpPTA7aTxwQlNTTm9kZS0+d0NTU1BLQ291bnQ7aSsrKSB7Ci0gICAgICAgICAgICBpZiAoKHBCU1NOb2RlLT5hYnlDU1NQS1tpXSA9PSBXTEFOXzExaV9DU1NfV0VQNDApIHx8Ci0gICAgICAgICAgICAgICAgKHBCU1NOb2RlLT5hYnlDU1NQS1tpXSA9PSBXTEFOXzExaV9DU1NfV0VQMTA0KSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYXMgZGVmaW5lZCA4MDIuMTFpCi0gICAgICAgICAgICAgICAgYnlDaXBoZXJNYXNrIHw9IDB4MDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBCU1NOb2RlLT5hYnlDU1NQS1tpXSA9PSBXTEFOXzExaV9DU1NfVEtJUCkgewotICAgICAgICAgICAgICAgIGJ5Q2lwaGVyTWFzayB8PSAweDAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwQlNTTm9kZS0+YWJ5Q1NTUEtbaV0gPT0gV0xBTl8xMWlfQ1NTX0NDTVApIHsKLSAgICAgICAgICAgICAgICBieUNpcGhlck1hc2sgfD0gMHgwNDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocEJTU05vZGUtPmFieUNTU1BLW2ldID09IFdMQU5fMTFpX0NTU19VU0VfR1JPVVApIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgZ3JvdXAga2V5IG9ubHkgaWdub3JlIGFsbCBvdGhlcnMKLSAgICAgICAgICAgICAgICBieUNpcGhlck1hc2sgPSAwOwotICAgICAgICAgICAgICAgIGkgPSBwQlNTTm9kZS0+d0NTU1BLQ291bnQ7Ci0gICAgICAgICAgICB9CisJLyogY2hlY2sgUGFpcndpc2UgS2V5IENpcGhlciAqLworCWZvciAoaSA9IDA7IGkgPCBwQlNTTm9kZS0+d0NTU1BLQ291bnQ7IGkrKykgeworCQlpZiAoKHBCU1NOb2RlLT5hYnlDU1NQS1tpXSA9PSBXTEFOXzExaV9DU1NfV0VQNDApIHx8CisJCSAgICAocEJTU05vZGUtPmFieUNTU1BLW2ldID09IFdMQU5fMTFpX0NTU19XRVAxMDQpKSB7CisJCQkvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGFzIGRlZmluZWQgODAyLjExaSAqLworCQkJYnlDaXBoZXJNYXNrIHw9IDB4MDE7CisJCX0gZWxzZSBpZiAocEJTU05vZGUtPmFieUNTU1BLW2ldID09IFdMQU5fMTFpX0NTU19US0lQKSB7CisJCQlieUNpcGhlck1hc2sgfD0gMHgwMjsKKwkJfSBlbHNlIGlmIChwQlNTTm9kZS0+YWJ5Q1NTUEtbaV0gPT0gV0xBTl8xMWlfQ1NTX0NDTVApIHsKKwkJCWJ5Q2lwaGVyTWFzayB8PSAweDA0OworCQl9IGVsc2UgaWYgKHBCU1NOb2RlLT5hYnlDU1NQS1tpXSA9PSBXTEFOXzExaV9DU1NfVVNFX0dST1VQKSB7CisJCQkvKiB1c2UgZ3JvdXAga2V5IG9ubHkgaWdub3JlIGFsbCBvdGhlcnMgKi8KKwkJCWJ5Q2lwaGVyTWFzayA9IDA7CisJCQlpID0gcEJTU05vZGUtPndDU1NQS0NvdW50OworCQl9CiAgICAgICAgIH0KIAogICAgIH0gZWxzZSBpZiAoKFdMQU5fR0VUX0NBUF9JTkZPX1BSSVZBQ1kocEJTU05vZGUtPndDYXBJbmZvKSAhPSAwKSAmJgpAQCAtNDgyOCwxNyArNDgxNSwxNyBAQAogICAgICAgICAgICAgYnlNdWx0aWNhc3RDaXBoZXIgPSBLRVlfQ1RMX0lOVkFMSUQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBjaGVjayBQYWlyd2lzZSBLZXkgQ2lwaGVyCi0gICAgICAgIGZvcihpPTA7aTxwQlNTTm9kZS0+d1BLQ291bnQ7aSsrKSB7Ci0gICAgICAgICAgICBpZiAocEJTU05vZGUtPmFieVBLVHlwZVtpXSA9PSBXUEFfVEtJUCkgewotICAgICAgICAgICAgICAgIGJ5Q2lwaGVyTWFzayB8PSAweDAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwQlNTTm9kZS0+YWJ5UEtUeXBlW2ldID09IFdQQV9BRVNDQ01QKSB7Ci0gICAgICAgICAgICAgICAgYnlDaXBoZXJNYXNrIHw9IDB4MDQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBCU1NOb2RlLT5hYnlQS1R5cGVbaV0gPT0gV1BBX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgZ3JvdXAga2V5IG9ubHkgaWdub3JlIGFsbCBvdGhlcnMKLSAgICAgICAgICAgICAgICBieUNpcGhlck1hc2sgPSAwOwotICAgICAgICAgICAgICAgIGkgPSBwQlNTTm9kZS0+d1BLQ291bnQ7Ci0gICAgICAgICAgICB9CisJLyogY2hlY2sgUGFpcndpc2UgS2V5IENpcGhlciAqLworCWZvciAoaSA9IDA7IGkgPCBwQlNTTm9kZS0+d1BLQ291bnQ7IGkrKykgeworCQlpZiAocEJTU05vZGUtPmFieVBLVHlwZVtpXSA9PSBXUEFfVEtJUCkgeworCQkJYnlDaXBoZXJNYXNrIHw9IDB4MDI7CisJCX0gZWxzZSBpZiAocEJTU05vZGUtPmFieVBLVHlwZVtpXSA9PSBXUEFfQUVTQ0NNUCkgeworCQkJYnlDaXBoZXJNYXNrIHw9IDB4MDQ7CisJCX0gZWxzZSBpZiAocEJTU05vZGUtPmFieVBLVHlwZVtpXSA9PSBXUEFfTk9ORSkgeworCQkJLyogdXNlIGdyb3VwIGtleSBvbmx5IGlnbm9yZSBhbGwgb3RoZXJzICovCisJCQlieUNpcGhlck1hc2sgPSAwOworCQkJaSA9IHBCU1NOb2RlLT53UEtDb3VudDsKKwkJfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dtZ3IuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5oCmluZGV4IDFlNWI5MTYuLjY4Mzg0MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5oCkBAIC04Miw3ICs4Miw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVHlwZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvL21pa2UgZGVmaW5lOiBtYWtlIHRpbWVyICB0byBleHBpcmUgYWZ0ZXIgZGVzaXJlZCB0aW1lcwotI2RlZmluZSB0aW1lcl9leHBpcmUodGltZXIsbmV4dF90aWNrKSAgIG1vZF90aW1lcigmdGltZXIsIFJVTl9BVChuZXh0X3RpY2spKQorI2RlZmluZSB0aW1lcl9leHBpcmUodGltZXIsIG5leHRfdGljaykgbW9kX3RpbWVyKCZ0aW1lciwgUlVOX0FUKG5leHRfdGljaykpCiAKIHR5cGVkZWYgdm9pZCAoKlRpbWVyRnVuY3Rpb24pKHVuc2lnbmVkIGxvbmcpOwogCkBAIC0yNTksOSArMjU5LDcgQEAKICAgICAvLyBPcGVyYXRpb24gc3RhdGUgdmFyaWFibGVzCiAgICAgV01BQ19DVVJSRU5UX01PREUgICAgICAgZUN1cnJNb2RlOyAgIC8vIE1BQyBjdXJyZW50IGNvbm5lY3Rpb24gbW9kZQogICAgIFdNQUNfQlNTX1NUQVRFICAgICAgICAgIGVDdXJyU3RhdGU7ICAvLyBNQUMgY3VycmVudCBCU1Mgc3RhdGUKLSAgICAjaWZkZWYgU25kRXZ0X1RvQVBJCiAgICAgV01BQ19CU1NfU1RBVEUgICAgICAgICAgZUxhc3RTdGF0ZTsgIC8vIE1BQyBsYXN0IEJTUyBzdGF0ZQotICAgICNlbmRpZgogCiAgICAgUEtub3duQlNTICAgICAgICAgICAgICAgcEN1cnJCU1M7CiAgICAgQllURSAgICAgICAgICAgICAgICAgICAgYnlDU1NHSzsKQEAgLTI5MywxMCArMjkxLDcgQEAKICAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlEZXNpcmVCU1NJRFtXTEFOX0JTU0lEX0xFTl07CiAKIC8vcmVzdG9yZSBCU1MgaW5mbyBmb3IgQWQtSG9jIG1vZGUKLS8vMjAwODAxMzEtMDUsPEFkZD4gYnkgTWlrZSBMaXUKLSNpZmRlZiBBZGhvY19TVEEKICAgICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJ5QWRIb2NTU0lEW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDFdOwotI2VuZGlmCiAKICAgICAvLyBBZGhvYyBvciBBUCBjb25maWd1cmF0aW9uIHZhcnMKICAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3SUJTU0JlYWNvblBlcmlvZDsKQEAgLTM0MywxMSArMzM4LDExIEBACiAgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgYlJ4QmVhY29uSW5UQlRUV2FrZTsKICAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYnlQU1R4TWFwW01BWF9OT0RFX05VTSArIDFdOwogCi0gICAgLy8gbWFuYWdtZW50IGNvbW1hbmQgcmVsYXRlZAorICAgIC8vIG1hbmFnZW1lbnQgY29tbWFuZCByZWxhdGVkCiAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICB1Q21kQnVzeTsKICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHVDbWRIb3N0QVBCdXN5OwogCi0gICAgLy8gbWFuYWdtZW50IHBhY2tldCBwb29sCisgICAgLy8gbWFuYWdlbWVudCBwYWNrZXQgcG9vbAogICAgIFBCWVRFICAgICAgICAgICAgICAgICAgIHBieU1nbXRQYWNrZXRQb29sOwogICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJ5TWdtdFBhY2tldFBvb2xbc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BM0ZSX01BWExFTl07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYS5jCmluZGV4IDFmYTZjOWIuLmY0OTI3NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEuYwpAQCAtMTQ4LDcgKzE0OCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3UEtDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKTogJXp1XG4iLCBwUlNOLT53UEtDb3VudCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpKTsKLSAgICAgICAgICAgIGZvcihpID0gMDsgKGkgPCBwUlNOLT53UEtDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CisJICAgIGZvciAoaSA9IDA7IChpIDwgcFJTTi0+d1BLQ291bnQpICYmCisJCSAgIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmKHBSU04tPmxlbiA+PSAxMitpKjQrNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqaSkKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKHBSU04tPlBLU0xpc3RbaV0uYWJ5T1VJLCBhYnlPVUkwMCwgNCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBwQlNTTGlzdC0+YWJ5UEtUeXBlW2orK10gPSBXUEFfTk9ORTsKQEAgLTE4MCw3ICsxODEsOCBAQAogICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBdXRoQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKTogJXp1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpKTsKLSAgICAgICAgICAgIGZvcihpID0gMDsgKGkgPCBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CisJICAgIGZvciAoaSA9IDA7IChpIDwgcElFX1JTTl9BdXRoLT53QXV0aENvdW50KSAmJgorCQkgICAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmKHBSU04tPmxlbiA+PSAxNCs0KyhtK2kpKjQpIHsgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpK1BLUyg0Km0pK0FLQygyKStBS1MoNCppKQogICAgICAgICAgICAgICAgICAgICBpZiAoICFtZW1jbXAocElFX1JTTl9BdXRoLT5BdXRoS1NMaXN0W2ldLmFieU9VSSwgYWJ5T1VJMDEsIDQpKQogICAgICAgICAgICAgICAgICAgICAgICAgcEJTU0xpc3QtPmFieUF1dGhUeXBlW2orK10gPSBXUEFfQVVUSF9JRUVFODAyXzFYOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEyLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuaAppbmRleCA0MjlhOTEwLi40NmMyOTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuaApAQCAtNTgsMjEgKzU4LDkgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZAotV1BBMl9DbGVhclJTTiAoCi0gICAgIFBLbm93bkJTUyAgICAgICAgcEJTU05vZGUKLSAgICApOwordm9pZCBXUEEyX0NsZWFyUlNOKFBLbm93bkJTUyBwQlNTTm9kZSk7Cit2b2lkIFdQQTJ2UGFyc2VSU04oUEtub3duQlNTIHBCU1NOb2RlLCBQV0xBTl9JRV9SU04gcFJTTik7CiAKLXZvaWQKLVdQQTJ2UGFyc2VSU04gKAotICAgICBQS25vd25CU1MgICAgICAgIHBCU1NOb2RlLAotICAgICBQV0xBTl9JRV9SU04gICAgIHBSU04KLSAgICApOwotCi11bnNpZ25lZCBpbnQKLVdQQTJ1U2V0SUVzKAotCXZvaWQgKnBNZ210SGFuZGxlLAotICAgICBQV0xBTl9JRV9SU04gcFJTTklFcwotICAgICk7Cit1bnNpZ25lZCBpbnQgV1BBMnVTZXRJRXModm9pZCAqcE1nbXRIYW5kbGUsIFBXTEFOX0lFX1JTTiBwUlNOSUVzKTsKIAogI2VuZGlmIC8qIF9fV1BBMl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYWN0bC5jCmluZGV4IDk2MWY1ODMuLmI0MDdhZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGFjdGwuYwpAQCAtMTg2LDcgKzE4Niw2IEBACiAJCXJldHVybiB3cGFfcmVsZWFzZV93cGFkZXYocERldmljZSk7CiB9CiAKLQogLyoKICAqIERlc2NyaXB0aW9uOgogICogICAgICBTZXQgV1BBIGFsZ29yaXRobSAmIGtleXMKQEAgLTM0OSw5ICszNDgsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLQotICAgIGlmIChJU19CUk9BRENBU1RfQUREUkVTUygmcGFyYW0tPmFkZHJbMF0pIHx8IChwYXJhbS0+YWRkciA9PSBOVUxMKSkgewotICAgICAgICAvLyBJZiBJU19CUk9BRENBU1RfQUREUkVTUywgc2V0IHRoZSBrZXkgYXMgZXZlcnkga2V5IGVudHJ5J3MgZ3JvdXAga2V5LgorICAgIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcigmcGFyYW0tPmFkZHJbMF0pIHx8IChwYXJhbS0+YWRkciA9PSBOVUxMKSkgeworCS8qIGlmIGJyb2FkY2FzdCwgc2V0IHRoZSBrZXkgYXMgZXZlcnkga2V5IGVudHJ5J3MgZ3JvdXAga2V5ICovCiAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkdyb3VwZSBLZXkgQXNzaWduLlxuIik7CiAKICAgICAgICAgaWYgKChLZXliU2V0QWxsR3JvdXBLZXkocERldmljZSwKQEAgLTQwNCw3ICs0MDIsNyBAQAogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBLZXkgVGFibGUgRnVsbAotICAgICAgICAgICAgaWYgKElTX0VUSF9BRERSRVNTX0VRVUFMKCZwYXJhbS0+YWRkclswXSwgcERldmljZS0+YWJ5QlNTSUQpKSB7CisJICAgIGlmICghY29tcGFyZV9ldGhlcl9hZGRyKCZwYXJhbS0+YWRkclswXSwgcERldmljZS0+YWJ5QlNTSUQpKSB7CiAgICAgICAgICAgICAgICAgLy9EQkdfUFJOX1dMQU4wMygoInJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEgLUtleSBUYWJsZSBGdWxsLjJcbiIpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIApAQCAtNjQ3LDkgKzY0NSw5IEBACiAKICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewogCi0gICAgICAgICBmb3Ioamo9MDtqajxNQVhfQlNTX05VTS1paS0xO2pqKyspIHsKKwlmb3IgKGpqID0gMDsgamogPCBNQVhfQlNTX05VTSAtIGlpIC0gMTsgamorKykgewogCi0gICAgICAgICAgIGlmKChwTWdtdC0+c0JTU0xpc3RbampdLmJBY3RpdmUhPVRSVUUpIHx8CisJCWlmICgocE1nbXQtPnNCU1NMaXN0W2pqXS5iQWN0aXZlICE9IFRSVUUpIHx8CiAKICAgICAgICAgICAgICAgICAoKHBNZ210LT5zQlNTTGlzdFtqal0udVJTU0k+cE1nbXQtPnNCU1NMaXN0W2pqKzFdLnVSU1NJKSAmJihwTWdtdC0+c0JTU0xpc3RbamorMV0uYkFjdGl2ZSE9RkFMU0UpKSkgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAppbmRleCA3NDQxMDE1Li40MTUyNTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKQEAgLTQxLDggKzQxLDEwIEBACiAjZGVmaW5lIERPVF8xMV9NQUNfSEVBREVSX1NJWkUJCTI0CiAjZGVmaW5lIERPVF8xMV9TTkFQX1NJWkUJCQk2CiAjZGVmaW5lIERPVF8xMV9EVVJBVElPTl9PRkZTRVQJCTIKLSNkZWZpbmUgRE9UXzExX1NFUVVFTkNFX09GRlNFVAkJMjIgLyogU2VxdWVuY2UgY29udHJvbCBvZmZzZXQgKi8KLSNkZWZpbmUgRE9UXzExX1RZUEVfT0ZGU0VUCQkJMzAgLyogVGhlIHN0YXJ0IG9mZnNldCBvZiA4MDIuMTEgRnJhbWUvLyAqLworLyogU2VxdWVuY2UgY29udHJvbCBvZmZzZXQgKi8KKyNkZWZpbmUgRE9UXzExX1NFUVVFTkNFX09GRlNFVAkJMjIKKy8qIFRoZSBzdGFydCBvZmZzZXQgb2YgODAyLjExIEZyYW1lLy8gKi8KKyNkZWZpbmUgRE9UXzExX1RZUEVfT0ZGU0VUCQkJMzAKICNkZWZpbmUgRE9UXzExX0RBVEFfT0ZGU0VUICAgICAgICAgIDI0CiAjZGVmaW5lIERPVF8xMV9EQV9PRkZTRVQJCQk0CiAjZGVmaW5lIERPVF8zX1RZUEVfQVJQCQkJCTB4ODBGMwpAQCAtOTgsMjggKzEwMCwyOCBAQAogI2RlZmluZSBFTEVNRU5UX0lEX0NGX1BBUkFNRVRFUl9TRVQgICAgICAgICA0CiAjZGVmaW5lIEVMRU1FTlRfSURfVElNICAgICAgICAgICAgICAgICAgICAgIDUKICNkZWZpbmUgRUxFTUVOVF9JRF9JQlNTX1BBUkFNRVRFUl9TRVQgICAgICAgNgotLy8gN34xNSByZXNlcnZlcmQKKy8qIDd+MTUgcmVzZXJ2ZXJkICovCiAjZGVmaW5lIEVMRU1FTlRfSURfQ0hBTExFTkdFX1RFWFQgICAgICAgICAgIDE2Ci0vLyAxN34zMSByZXNlcnZlZCBmb3IgY2hhbGxlbmdlIHRleHQgZXh0ZW5zaW9uCi0vLyAzMn4yNTUgcmVzZXJ2ZWQKLS8vLS0gIDExRyAgLS0KKy8qIDE3fjMxIHJlc2VydmVkIGZvciBjaGFsbGVuZ2UgdGV4dCBleHRlbnNpb24gKi8KKy8qIDMyfjI1NSByZXNlcnZlZCAqLworLyotLSAgMTFHICAtLSAqLwogI2RlZmluZSBFTEVNRU5UX0lEX0VSUF9JTkZPUk1BVElPTgkJCTQyCiAjZGVmaW5lIEVMRU1FTlRfSURfRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTIDUwCiAKLS8vLS0gIFdQQSAgLS0KKy8qIC0tICBXUEEgIC0tICovCiAKICNkZWZpbmUgRUxFTUVOVF9JRF9SU05fV1BBCQkJCQkyMjEKICNpZmRlZiBfV1BBMl8KICNkZWZpbmUgRUxFTUVOVF9JRF9SU05fV1BBMgkJCQkgICAgNDgKLSNlbmRpZiAvL2VuZGlmIFdQQTIKKyNlbmRpZiAvKiBlbmRpZiBXUEEyICovCiAKICNkZWZpbmUgV0xBTl9NQVhfUEFJUldJU0VfQ0lQSEVSX1NVSVRFX0NPVU5UICAgICgodTE2KSA2KQogI2RlZmluZSBXTEFOX01BWF9BVVRIX0tFWV9NR1RfU1VJVEVfTElTVF9DT1VOVCAgKCh1MTYpIDIpCiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIFJlYXNvbiBDb2RlIChUYWJsZSAxOCk6IGluZGljYXRlIHRoZSByZWFzb24gb2YgRGlzQXNzb2MsIERlQXV0aGVuCi0vLyAgbGVuZ3RoIG9mIFJlYXNvbkNvZGUgaXMgMiBPY3RzLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICBSZWFzb24gQ29kZSAoVGFibGUgMTgpOiBpbmRpY2F0ZSB0aGUgcmVhc29uIG9mIERpc0Fzc29jLCBEZUF1dGhlbgorKiAgbGVuZ3RoIG9mIFJlYXNvbkNvZGUgaXMgMiBPY3RzLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAjZGVmaW5lIFJFQVNPTl9SRUFTRVJFRCAgICAgICAgICAgICAwCiAjZGVmaW5lIFJFQVNPTl9VTlNQRUNJRElFRCAgICAgICAgICAxCiAjZGVmaW5lIFJFQVNPTl9QUkVBVVRIX0lOVkFMSUQgICAgICAyCkBAIC0zODUsOSArMzg3LDExIEBACiAjaWZkZWYgX1dQQTJfCiAjZGVmaW5lIFZFUlNJT05fV1BBMiAgICAgICAgICAgIDEKICNlbmRpZiAvKiBlbmQgZGVmICBfV1BBMl8gKi8KLSNkZWZpbmUgT1VJX1dQQQkJCQkJMHgwMEYyNTAwMAkvKiBXUEEyLjAgT1VJPTAwOjUwOkYyLCB0aGUgTVNCIGlzIHJlc2VydmVkIGZvciBzdWl0ZSB0eXBlICovCisvKiBXUEEyLjAgT1VJPTAwOjUwOkYyLCB0aGUgTVNCIGlzIHJlc2VydmVkIGZvciBzdWl0ZSB0eXBlICovCisjZGVmaW5lIE9VSV9XUEEJCQkJCTB4MDBGMjUwMDAKICNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgT1VJX1dQQTIJCQkJMHgwMEFDMEYwMAkvKiBmb3Igd3BhMiBjaGFuZ2UgdG8gMHgwMEFDT0YwNCBieSBXcyAyNi8wNC8wNCAqLworLyogZm9yIHdwYTIgY2hhbmdlIHRvIDB4MDBBQ09GMDQgYnkgV3MgMjYvMDQvMDQgKi8KKyNkZWZpbmUgT1VJX1dQQTIJCQkJMHgwMEFDMEYwMAogI2VuZGlmIC8qIGVuZCBkZWYgX1dQQTJfICovCiAKICNkZWZpbmUgT1VJX1dQQV9BRERJVElPTkFMCQkweDAxCkBAIC00MDAsOCArNDA0LDggQEAKIAogI2RlZmluZSBXUEFfT1VJX0JJRyAgICAoKHUzMikgMHgwMUYyNTAwMCkvKiBhZGRlZCBieSB3cyAwOS8yMy8wNCAqLwogI2RlZmluZSBXUEFfT1VJX0xJVFRMRSAgKCh1MzIpIDB4MDFGMjUwMDEpLyogYWRkZWQgYnkgd3MgMDkvMjMvMDQgKi8KLQotI2RlZmluZSBXUEFfV1BTX09VSQkJCQljcHVfdG9fbGUzMigweDA0RjI1MDAwKSAvKiAyMDA2MTEwOCBGb3IgV1BTLiBJdCdzIGxpdHRsZSBlbmRpYW4uIEJpZyBlbmRpYW4gaXMgMHgwMDUwRjIwNCAqLworLyogMjAwNjExMDggRm9yIFdQUy4gSXQncyBsaXR0bGUgZW5kaWFuLiBCaWcgZW5kaWFuIGlzIDB4MDA1MEYyMDQgKi8KKyNkZWZpbmUgV1BBX1dQU19PVUkJCQkJY3B1X3RvX2xlMzIoMHgwNEYyNTAwMCkKIAogLyogLS0tLS1XUEEyLS0tLS0gKi8KICNpZmRlZiBfV1BBMl8KQEAgLTQyMCw3NSArNDI0LDY1IEBACiAjZGVmaW5lIE9VSV9DSVBIRVJfQ0NNUAkJCQkweDA0CiAjZGVmaW5lIE9VSV9DSVBIRVJfV0VQXzEwNAkJCTB4MDUKIAotc3RydWN0IHN1aXRlX3NlbGVjdG9yCi17Ci0JdW5pb24KLQl7CitzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3J7CisJdW5pb257CiAJCXU4CVZhbHVlWzRdOwotCQlzdHJ1Y3QgX1NVSVRfCi0JCXsKKwkJc3RydWN0IF9TVUlUXyB7CiAJCQl1OAlPVUlbM107CiAJCQl1OAlUeXBlOwotCQl9U3VpdFNlbGVjdG9yOworCQl9IFN1aXRTZWxlY3RvcjsKIAl9OwogfTsKIAotLy8tLSAgV1BBICAtLQotc3RydWN0CVJTTl9JbmZvcm1hdGlvbl9FbGVtZW50Ci17CisvKiAtLSAgV1BBICAtLSAqLworc3RydWN0CVJTTl9JbmZvcm1hdGlvbl9FbGVtZW50ewogCXU4CQkJCQlFbGVtZW50X0lEOwogCXU4CQkJCQlMZW5ndGg7Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCU91aVdQQUFkZGl0aW9uYWw7IC8qIFdQQSB2ZXJzaW9uIDIuMCBhZGRpdGlvbmFsIGZpZWxkLCBhbmQgc2hvdWxkIGJlIDAwOjUwOkYyOjAxICovCisgLyogV1BBIHZlcnNpb24gMi4wIGFkZGl0aW9uYWwgZmllbGQsIGFuZCBzaG91bGQgYmUgMDA6NTA6RjI6MDEgKi8KKwlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJT3VpV1BBQWRkaXRpb25hbDsKIAl1MTYJCQkJCVZlcnNpb247CiAJc3RydWN0IHN1aXRlX3NlbGVjdG9yCQlHcm91cEtleVN1aXRlOwogCXUxNgkJCQkJUGFpcndpc2VLZXlTdWl0ZUNvdW50OwogCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcgkJUGFpcndpc2VLZXlTdWl0ZVsxXTsKLX1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci1zdHJ1Y3QgUlNOX0F1dGhfU3ViX0luZm9ybWF0aW9uX0VsZW1lbnQKLXsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworc3RydWN0IFJTTl9BdXRoX1N1Yl9JbmZvcm1hdGlvbl9FbGVtZW50IHsKIAl1MTYJCQkJQXV0aEtleU1uZ3RTdWl0ZUNvdW50OwogCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglBdXRoS2V5TW5ndFN1aXRlWzFdOwotfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiAtLSAgV1BBMiAgLS0gKi8KLXN0cnVjdCBSU05fQ2FwYWJpbGl0eV9FbGVtZW50Ci17Ci0gIHVuaW9uCi0gIHsKK3N0cnVjdCBSU05fQ2FwYWJpbGl0eV9FbGVtZW50IHsKKyAgdW5pb24gewogCXUxNglfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkJd1ZhbHVlOwogICAgICNpZmRlZiBfQklHX0VORElBTl8JIC8qIDIwMDYwOTI3IGFkZCBieSBhbnNvbidzIGVuZGlhbiAqLwotICAgIHN0cnVjdCBfUlNOX0NhcGFiaWxpdHkKLSAgICB7Ci0gICAgCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUmVzZXJ2ZWQyIDogODsgLyogMjAwNTEyMDEgKi8KLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMSA6IDI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBHVEtfUmVwbGF5X0NvdW50ZXIgOiAyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUFRLX1JlcGxheV9Db3VudGVyIDogMjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIE5vX1BhaXJ3aXNlIDogMTsKLSAgICAgICAgdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQcmVfQXV0aCA6IDE7Ci0gICAgfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUlNOX0NhcGFiaWxpdHk7CisgICAgc3RydWN0IF9SU05fQ2FwYWJpbGl0eSB7CisJdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDI6ODsgLyogMjAwNTEyMDEgKi8KKwl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMToyOworCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgR1RLX1JlcGxheV9Db3VudGVyOjI7CisJdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQVEtfUmVwbGF5X0NvdW50ZXI6MjsKKwl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIE5vX1BhaXJ3aXNlOjE7CisJdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQcmVfQXV0aDoxOworICAgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSU05fQ2FwYWJpbGl0eTsKICAgICAjZWxzZQotICAgIHN0cnVjdCBfUlNOX0NhcGFiaWxpdHkKLSAgICB7Ci0gICAgICAgIHUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUHJlX0F1dGggOiAxOwotICAgICAgICB1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIE5vX1BhaXJ3aXNlIDogMTsKLSAgICAgICAgdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQVEtfUmVwbGF5X0NvdW50ZXIgOiAyOwotCSAgICB1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIEdUS19SZXBsYXlfQ291bnRlciA6IDI7Ci0JICAgIHUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUmVzZXJ2ZWQxIDogMjsKLQkgICAgdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDIgOiA4OyAvKiAyMDA1MTIwMSAqLwotICAgIH1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJTTl9DYXBhYmlsaXR5OworICAgIHN0cnVjdCBfUlNOX0NhcGFiaWxpdHkgeworCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUHJlX0F1dGg6MTsKKwl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIE5vX1BhaXJ3aXNlOjE7CisJdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQVEtfUmVwbGF5X0NvdW50ZXI6MjsKKwl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIEdUS19SZXBsYXlfQ291bnRlcjoyOworCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUmVzZXJ2ZWQxOjI7CisJdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDI6ODsgLyogMjAwNTEyMDEgKi8KKyAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUlNOX0NhcGFiaWxpdHk7CiAgICAgI2VuZGlmCiAKLSAgfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Ci19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKKyAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwogCiAjaWZkZWYgX1dQQTJfCi1zdHJ1Y3QgcG1raWQKLXsKK3N0cnVjdCBwbWtpZCB7CiAgIHU4IHBWYWx1ZVsxNl07CiB9OwogCi1zdHJ1Y3QJV1BBMl9SU05fSW5mb3JtYXRpb25fRWxlbWVudAoteworc3RydWN0CVdQQTJfUlNOX0luZm9ybWF0aW9uX0VsZW1lbnQgewogCXU4CQkJCQlFbGVtZW50X0lEOwogCXU4CQkJCQlMZW5ndGg7CiAJdTE2CQkJCQlWZXJzaW9uOwpAQCAtNDk2LDI5ICs0OTAsMjggQEAKIAl1MTYJCQkJCVBhaXJ3aXNlS2V5U3VpdGVDb3VudDsKIAlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJCVBhaXJ3aXNlS2V5U3VpdGVbMV07CiAKLX1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IFdQQTJfUlNOX0F1dGhfU3ViX0luZm9ybWF0aW9uX0VsZW1lbnQKLXsKK3N0cnVjdCBXUEEyX1JTTl9BdXRoX1N1Yl9JbmZvcm1hdGlvbl9FbGVtZW50IHsKIAl1MTYJCQkJQXV0aEtleU1uZ3RTdWl0ZUNvdW50OwogCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglBdXRoS2V5TW5ndFN1aXRlWzFdOwotfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAKLXN0cnVjdCBQTUtJRF9JbmZvcm1hdGlvbl9FbGVtZW50Ci17CitzdHJ1Y3QgUE1LSURfSW5mb3JtYXRpb25fRWxlbWVudCB7CiAJdTE2CQkJCVBNS0lEX0NvdW50OwogCXN0cnVjdCBwbWtpZCBwbWtpZFsxNl07Ci19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKICNlbmRpZiAvKiBlbmRkZWYgX1dQQTJfICovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gTUFDIEZyYW1lIHN0cnVjdHVyZSAoZGlmZmVyZW50IHR5cGUpIGFuZCBzdWJmaWVsZCBzdHJ1Y3R1cmUKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0cnVjdCBNQUNfZnJhbWVfY29udHJvbAotewotICAgIHU4ICAgIG1hY19mcmFtZV9pbmZvOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBbUHJvdG9jb2wgVmVyc2lvbiwgQ29udHJvbCBUeXBlLCBDb250cm9sIFN1YnR5cGVdKi8KLSAgICAjaWZkZWYgX0JJR19FTkRJQU5fIC8qIDIwMDYwOTI3IGFkZCBieSBhbnNvbidzIGVuZGlhbiAqLworc3RydWN0IE1BQ19mcmFtZV9jb250cm9sIHsKKy8qIGEgY29tYmluYXRpb24gb2YgdGhlIFtQcm90b2NvbCBWZXJzaW9uLCBDb250cm9sIFR5cGUsIENvbnRyb2wgU3VidHlwZV0qLworICAgIHU4ICAgIG1hY19mcmFtZV9pbmZvOworLyogMjAwNjA5MjcgYWRkIGJ5IGFuc29uJ3MgZW5kaWFuICovCisgICAgI2lmZGVmIF9CSUdfRU5ESUFOXwogICAgIHU4ICAgIG9yZGVyOjE7CiAgICAgdTggICAgV0VQOjE7CiAgICAgdTggICAgbW9yZV9kYXRhOjE7CkBAIC01NDAsNyArNTMzLDggQEAKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgTWFuYWdlbWVudF9GcmFtZSB7Ci0gICAgc3RydWN0IE1BQ19mcmFtZV9jb250cm9sIGZyYW1lX2NvbnRyb2w7IC8qIDJCLCBUb0RTLEZyb21EUyxNb3JlRnJhZyxNb3JlRGF0YSxPcmRlcj0wICovCisvKiAyQiwgVG9EUyxGcm9tRFMsTW9yZUZyYWcsTW9yZURhdGEsT3JkZXI9MCAqLworICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwogICAgIHUxNgkJZHVyYXRpb247CiAgICAgdTgJCURBW01BQ19BRERSX0xFTkdUSF07CQkJLyogQWRkcjEgKi8KICAgICB1OAkJU0FbTUFDX0FERFJfTEVOR1RIXTsJCQkvKiBBZGRyMiAqLwpAQCAtNTUyLDcgKzU0Niw4IEBACiAKIC8qIFNXLU1BQyBkb24ndCBUeC9SeCBDb250cm9sLUZyYW1lLCBIVy1NQUMgZG8gaXQuICovCiBzdHJ1Y3QgQ29udHJvbF9GcmFtZSB7Ci0gICAgc3RydWN0IE1BQ19mcmFtZV9jb250cm9sIGZyYW1lX2NvbnRyb2w7IC8qIFRvRFMsRnJvbURTLE1vcmVGcmFnLFJldHJ5LE1vcmVEYXRhLFdFUCxPcmRlcj0wICovCisvKiBUb0RTLEZyb21EUyxNb3JlRnJhZyxSZXRyeSxNb3JlRGF0YSxXRVAsT3JkZXI9MCAqLworICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwogICAgIHUxNgkJZHVyYXRpb247CiAgICAgdTgJCVJBW01BQ19BRERSX0xFTkdUSF07CiAgICAgdTgJCVRBW01BQ19BRERSX0xFTkdUSF07CkBAIC02MjcsOCArNjIyLDkgQEAKICAgICB1MTYgICAgYWxnb3JpdGhtTnVtYmVyOwogICAgIHUxNiAgICBzZXF1ZW5jZU51bWJlcjsKICAgICB1MTYgICAgc3RhdHVzQ29kZTsKLSAgICAvKiBOQjogZG9uJ3QgaW5jbHVkZSBDaGFsbGVuZ2VUZXh0IGluIHRoaXMgc3RydWN0dXJlCi0JLy8gc3RydWN0IENoYWxsZW5nZV9UZXh0X0VsZW1lbnQgc0NoYWxsZW5nZVRleHRFbGVtZW50OyAvLyB3a2NoZW4gYWRkZWQgKi8KKwkvKiBOQjogZG9uJ3QgaW5jbHVkZSBDaGFsbGVuZ2VUZXh0IGluIHRoaXMgc3RydWN0dXJlCisJLy8gc3RydWN0IENoYWxsZW5nZV9UZXh0X0VsZW1lbnQgc0NoYWxsZW5nZVRleHRFbGVtZW50OworCS8vIHdrY2hlbiBhZGRlZCAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwppbmRleCA3ODkzNTg2Li41YzFmMDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwpAQCAtMTksMjMgKzE5LDI1IEBACiAKIC8qKioqKioqKioqKioqKioqKiogTE9DQUwgQ09OU1RBTlQgQU5EIE1BQ1JPIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBMT09QX1RJTUVTICAgICAgMjAKLSNkZWZpbmUgVVMgICAgICAgICAgICAgIDEwMDAvL01JQ1JPU0VDT05ECisjZGVmaW5lIFVTICAgICAgICAgICAgICAxMDAwLyogTUlDUk9TRUNPTkQqLwogCiAjZGVmaW5lIEFHX0NPTlNUICAgICAgICAwLjYwNzI1MjkzNTAKICNkZWZpbmUgRklYRUQoWCkgICAgICAgICgoczMyKSgoWCkgKiAzMjc2OC4wKSkKICNkZWZpbmUgREVHMlJBRChYKSAgICAgIDAuMDE3NDUzICogKFgpCiAKLXN0YXRpYyBjb25zdCBzMzIgQW5nbGVzW10gPQotewotICAgIEZJWEVEKERFRzJSQUQoNDUuMCkpLCAgICBGSVhFRChERUcyUkFEKDI2LjU2NSkpLCAgRklYRUQoREVHMlJBRCgxNC4wMzYyKSksCi0gICAgRklYRUQoREVHMlJBRCg3LjEyNTAyKSksIEZJWEVEKERFRzJSQUQoMy41NzYzMykpLCBGSVhFRChERUcyUkFEKDEuNzg5OTEpKSwKLSAgICBGSVhFRChERUcyUkFEKDAuODk1MTc0KSksRklYRUQoREVHMlJBRCgwLjQ0NzYxNCkpLEZJWEVEKERFRzJSQUQoMC4yMjM4MTEpKSwKLSAgICBGSVhFRChERUcyUkFEKDAuMTExOTA2KSksRklYRUQoREVHMlJBRCgwLjA1NTk1MykpLEZJWEVEKERFRzJSQUQoMC4wMjc5NzcpKQorc3RhdGljIGNvbnN0IHMzMiBBbmdsZXNbXSA9IHsKKyAgICBGSVhFRChERUcyUkFEKDQ1LjApKSwgICAgIEZJWEVEKERFRzJSQUQoMjYuNTY1KSksICAgRklYRUQoREVHMlJBRCgxNC4wMzYyKSksCisgICAgRklYRUQoREVHMlJBRCg3LjEyNTAyKSksICBGSVhFRChERUcyUkFEKDMuNTc2MzMpKSwgIEZJWEVEKERFRzJSQUQoMS43ODk5MSkpLAorICAgIEZJWEVEKERFRzJSQUQoMC44OTUxNzQpKSwgRklYRUQoREVHMlJBRCgwLjQ0NzYxNCkpLCBGSVhFRChERUcyUkFEKDAuMjIzODExKSksCisgICAgRklYRUQoREVHMlJBRCgwLjExMTkwNikpLCBGSVhFRChERUcyUkFEKDAuMDU1OTUzKSksIEZJWEVEKERFRzJSQUQoMC4wMjc5NzcpKQogfTsKIAogLyoqKioqKioqKioqKioqKioqKiBMT0NBTCBGVU5DVElPTiBERUNMQVJBVElPTiBTRUNUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCi0vL3ZvaWQgICAgX3BoeV9yZl93cml0ZV9kZWxheShzdHJ1Y3QgaHdfZGF0YSAqcGh3X2RhdGEpOwotLy92b2lkICAgIHBoeV9pbml0X3JmKHN0cnVjdCBod19kYXRhICpwaHdfZGF0YSk7CisKKy8qCisgKiB2b2lkICAgIF9waHlfcmZfd3JpdGVfZGVsYXkoc3RydWN0IGh3X2RhdGEgKnBod19kYXRhKTsKKyAqIHZvaWQgICAgcGh5X2luaXRfcmYoc3RydWN0IGh3X2RhdGEgKnBod19kYXRhKTsKKyAqLwogCiAvKioqKioqKioqKioqKioqKioqIEZVTkNUSU9OIERFRklOSVRJT04gU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDYsOSArNDgsNyBAQAogICAgIHZhbCA9IChkYXRhICYgMHgwRkZGKTsKIAogICAgIGlmICgoZGF0YSAmIEJJVCgxMikpICE9IDApCi0gICAgewogICAgICAgICB2YWwgfD0gMHhGRkZGRjAwMDsKLSAgICB9CiAKICAgICByZXR1cm4gKChzMzIpIHZhbCk7CiB9CkBAIC01OCwxMyArNTgsOSBAQAogICAgIHUzMiAgICAgdmFsOwogCiAgICAgaWYgKGRhdGEgPiA0MDk1KQotICAgIHsKICAgICAgICAgZGF0YSA9IDQwOTU7Ci0gICAgfQogICAgIGVsc2UgaWYgKGRhdGEgPCAtNDA5NikKLSAgICB7CiAgICAgICAgIGRhdGEgPSAtNDA5NjsKLSAgICB9CiAKICAgICB2YWwgPSBkYXRhICYgMHgxRkZGOwogCkBAIC03OSw5ICs3NSw3IEBACiAgICAgdmFsID0gKGRhdGEgJiAweDAwMDcpOwogCiAgICAgaWYgKChkYXRhICYgQklUKDMpKSAhPSAwKQotICAgIHsKICAgICAgICAgdmFsIHw9IDB4RkZGRkZGRjg7Ci0gICAgfQogCiAgICAgcmV0dXJuIHZhbDsKIH0KQEAgLTkxLDEzICs4NSw5IEBACiAgICAgdTMyICAgICB2YWw7CiAKICAgICBpZiAoZGF0YSA+IDcpCi0gICAgewogICAgICAgICBkYXRhID0gNzsKLSAgICB9CiAgICAgZWxzZSBpZiAoZGF0YSA8IC04KQotICAgIHsKICAgICAgICAgZGF0YSA9IC04OwotICAgIH0KIAogICAgIHZhbCA9IGRhdGEgJiAweDAwMEY7CiAKQEAgLTExMiw5ICsxMDIsNyBAQAogICAgIHZhbCA9IChkYXRhICYgMHgwMDBGKTsKIAogICAgIGlmICgoZGF0YSAmIEJJVCg0KSkgIT0gMCkKLSAgICB7CiAgICAgICAgIHZhbCB8PSAweEZGRkZGRkYwOwotICAgIH0KIAogICAgIHJldHVybiB2YWw7CiB9CkBAIC0xMjQsMTMgKzExMiw5IEBACiAgICAgdTMyICAgICB2YWw7CiAKICAgICBpZiAoZGF0YSA+IDE1KQotICAgIHsKICAgICAgICAgZGF0YSA9IDE1OwotICAgIH0KICAgICBlbHNlIGlmIChkYXRhIDwgLTE2KQotICAgIHsKICAgICAgICAgZGF0YSA9IC0xNjsKLSAgICB9CiAKICAgICB2YWwgPSBkYXRhICYgMHgwMDFGOwogCkBAIC0xNDUsOSArMTI5LDcgQEAKICAgICB2YWwgPSAoZGF0YSAmIDB4MDAxRik7CiAKICAgICBpZiAoKGRhdGEgJiBCSVQoNSkpICE9IDApCi0gICAgewogICAgICAgICB2YWwgfD0gMHhGRkZGRkZFMDsKLSAgICB9CiAKICAgICByZXR1cm4gdmFsOwogfQpAQCAtMTU3LDEzICsxMzksOSBAQAogICAgIHUzMiAgICAgdmFsOwogCiAgICAgaWYgKGRhdGEgPiAzMSkKLSAgICB7CiAgICAgICAgIGRhdGEgPSAzMTsKLSAgICB9CiAgICAgZWxzZSBpZiAoZGF0YSA8IC0zMikKLSAgICB7CiAgICAgICAgIGRhdGEgPSAtMzI7Ci0gICAgfQogCiAgICAgdmFsID0gZGF0YSAmIDB4MDAzRjsKIApAQCAtMTc4LDkgKzE1Niw3IEBACiAgICAgdmFsID0gZGF0YSAmIDB4MDBGRjsKIAogICAgIGlmICgoZGF0YSAmIEJJVCg4KSkgIT0gMCkKLSAgICB7CiAgICAgICAgIHZhbCB8PSAweEZGRkZGRjAwOwotICAgIH0KIAogICAgIHJldHVybiB2YWw7CiB9CkBAIC0xOTAsMTMgKzE2Niw5IEBACiAgICAgdTMyICAgICB2YWw7CiAKICAgICBpZiAoZGF0YSA+IDI1NSkKLSAgICB7CiAgICAgICAgIGRhdGEgPSAyNTU7Ci0gICAgfQogICAgIGVsc2UgaWYgKGRhdGEgPCAtMjU2KQotICAgIHsKICAgICAgICAgZGF0YSA9IC0yNTY7Ci0gICAgfQogCiAgICAgdmFsID0gZGF0YSAmIDB4MDFGRjsKIApAQCAtMjA3LDIxICsxNzksMTkgQEAKIHMzMiBfZmxvb3IoczMyIG4pCiB7CiAgICAgaWYgKG4gPiAwKQotICAgIHsKLSAgICAgICAgbiArPSA1OwotICAgIH0KKwluICs9IDU7CiAgICAgZWxzZQotICAgIHsKICAgICAgICAgbiAtPSA1OwotICAgIH0KIAogICAgIHJldHVybiAobi8xMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHNxYXJlLXJvb3QgZnVuY3Rpb24uCi0vLyBzcXN1bSBpcyB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgaXMgc3FfcnQ7Ci0vLyBUaGUgbWF4aW11bSBvZiBzcXN1bSA9IDJeMjcgLTE7CisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHNxYXJlLXJvb3QgZnVuY3Rpb24uCisgKiBzcXN1bSBpcyB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgaXMgc3FfcnQ7CisgKiBUaGUgbWF4aW11bSBvZiBzcXN1bSA9IDJeMjcgLTE7CisgKi8KIHUzMiBfc3FydCh1MzIgc3FzdW0pCiB7CiAgICAgdTMyICAgICBzcV9ydDsKQEAgLTIzMiwxOCArMjAyLDE3IEBACiAgICAgaW50ICAgICBzdGVwOwogCiAgICAgZzQgPSAgc3FzdW0gLyAxMDAwMDAwMDA7Ci0gICAgZzMgPSAoc3FzdW0gLSBnNCoxMDAwMDAwMDApIC8xMDAwMDAwOwotICAgIGcyID0gKHNxc3VtIC0gZzQqMTAwMDAwMDAwIC0gZzMqMTAwMDAwMCkgLzEwMDAwOwotICAgIGcxID0gKHNxc3VtIC0gZzQqMTAwMDAwMDAwIC0gZzMqMTAwMDAwMCAtIGcyKjEwMDAwKSAvMTAwOworICAgIGczID0gKHNxc3VtIC0gZzQqMTAwMDAwMDAwKSAvIDEwMDAwMDA7CisgICAgZzIgPSAoc3FzdW0gLSBnNCoxMDAwMDAwMDAgLSBnMyoxMDAwMDAwKSAvIDEwMDAwOworICAgIGcxID0gKHNxc3VtIC0gZzQqMTAwMDAwMDAwIC0gZzMqMTAwMDAwMCAtIGcyKjEwMDAwKSAvIDEwMDsKICAgICBnMCA9IChzcXN1bSAtIGc0KjEwMDAwMDAwMCAtIGczKjEwMDAwMDAgLSBnMioxMDAwMCAtIGcxKjEwMCk7CiAKICAgICBuZXh0ID0gZzQ7CiAgICAgc3RlcCA9IDA7CiAgICAgc2VlZCA9IDA7Ci0gICAgd2hpbGUgKCgoc2VlZCsxKSooc3RlcCsxKSkgPD0gbmV4dCkKLSAgICB7Ci0gICAgCXN0ZXArKzsKLSAgICAJc2VlZCsrOworICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpIHsKKyAgICAgICAgc3RlcCsrOworICAgICAgICBzZWVkKys7CiAgICAgfQogCiAgICAgc3FfcnQgPSBzZWVkICogMTAwMDA7CkBAIC0yNTEsMjAgKzIyMCwxOCBAQAogCiAgICAgc3RlcCA9IDA7CiAgICAgc2VlZCA9IDIgKiBzZWVkICogMTA7Ci0gICAgd2hpbGUgKCgoc2VlZCsxKSooc3RlcCsxKSkgPD0gbmV4dCkKLSAgICB7CisgICAgd2hpbGUgKCgoc2VlZCsxKSooc3RlcCsxKSkgPD0gbmV4dCkgewogICAgICAgICBzdGVwKys7Ci0gICAgCXNlZWQrKzsKKyAgICAgICAgc2VlZCsrOwogICAgIH0KIAogICAgIHNxX3J0ID0gc3FfcnQgKyBzdGVwICogMTAwMDsKICAgICBuZXh0ID0gKG5leHQgLSBzZWVkICogc3RlcCkgKiAxMDAgKyBnMjsKICAgICBzZWVkID0gKHNlZWQgKyBzdGVwKSAqIDEwOwogICAgIHN0ZXAgPSAwOwotICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpCi0gICAgeworICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpIHsKICAgICAgICAgc3RlcCsrOwotICAgIAlzZWVkKys7CisgICAgICAgIHNlZWQrKzsKICAgICB9CiAKICAgICBzcV9ydCA9IHNxX3J0ICsgc3RlcCAqIDEwMDsKQEAgLTI3MiwyMSArMjM5LDE5IEBACiAgICAgc2VlZCA9IChzZWVkICsgc3RlcCkgKiAxMDsKICAgICBzdGVwID0gMDsKIAotICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpCi0gICAgeworICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpIHsKICAgICAgICAgc3RlcCsrOwotICAgIAlzZWVkKys7CisgICAgICAgIHNlZWQrKzsKICAgICB9CiAKICAgICBzcV9ydCA9IHNxX3J0ICsgc3RlcCAqIDEwOwotICAgIG5leHQgPSAobmV4dCAtIHNlZWQqIHN0ZXApICogMTAwICsgZzA7CisgICAgbmV4dCA9IChuZXh0IC0gc2VlZCAqIHN0ZXApICogMTAwICsgZzA7CiAgICAgc2VlZCA9IChzZWVkICsgc3RlcCkgKiAxMDsKICAgICBzdGVwID0gMDsKIAotICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpCi0gICAgeworICAgIHdoaWxlICgoKHNlZWQrMSkqKHN0ZXArMSkpIDw9IG5leHQpIHsKICAgICAgICAgc3RlcCsrOwotICAgIAlzZWVkKys7CisgICAgICAgIHNlZWQrKzsKICAgICB9CiAKICAgICBzcV9ydCA9IHNxX3J0ICsgc3RlcDsKQEAgLTMwMCwzOCArMjY1LDMxIEBACiAgICAgczMyIFgsIFksIFRhcmdldEFuZ2xlLCBDdXJyQW5nbGU7CiAgICAgdW5zaWduZWQgICAgU3RlcDsKIAotICAgIFg9RklYRUQoQUdfQ09OU1QpOyAgICAgIC8vIEFHX0NPTlNUICogY29zKDApCi0gICAgWT0wOyAgICAgICAgICAgICAgICAgICAgLy8gQUdfQ09OU1QgKiBzaW4oMCkKLSAgICBUYXJnZXRBbmdsZT1hYnMoYW5nbGUpOwotICAgIEN1cnJBbmdsZT0wOworICAgIFggPSBGSVhFRChBR19DT05TVCk7ICAgICAgLyogQUdfQ09OU1QgKiBjb3MoMCkgKi8KKyAgICBZID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIEFHX0NPTlNUICogc2luKDApICovCisgICAgVGFyZ2V0QW5nbGUgPSBhYnMoYW5nbGUpOworICAgIEN1cnJBbmdsZSA9IDA7CiAKLSAgICBmb3IgKFN0ZXA9MDsgU3RlcCA8IDEyOyBTdGVwKyspCi0gICAgeworICAgIGZvciAoU3RlcCA9IDA7IFN0ZXAgPCAxMjsgU3RlcCsrKSB7CiAJczMyIE5ld1g7CiAKLSAgICAgICAgaWYoVGFyZ2V0QW5nbGUgPiBDdXJyQW5nbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5ld1g9WCAtIChZID4+IFN0ZXApOwotICAgICAgICAgICAgWT0oWCA+PiBTdGVwKSArIFk7Ci0gICAgICAgICAgICBYPU5ld1g7CisgICAgICAgIGlmIChUYXJnZXRBbmdsZSA+IEN1cnJBbmdsZSkgeworICAgICAgICAgICAgTmV3WCA9IFggLSAoWSA+PiBTdGVwKTsKKyAgICAgICAgICAgIFkgPSAoWCA+PiBTdGVwKSArIFk7CisgICAgICAgICAgICBYID0gTmV3WDsKICAgICAgICAgICAgIEN1cnJBbmdsZSArPSBBbmdsZXNbU3RlcF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBOZXdYPVggKyAoWSA+PiBTdGVwKTsKLSAgICAgICAgICAgIFk9LShYID4+IFN0ZXApICsgWTsKLSAgICAgICAgICAgIFg9TmV3WDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5ld1ggPSBYICsgKFkgPj4gU3RlcCk7CisgICAgICAgICAgICBZID0gLShYID4+IFN0ZXApICsgWTsKKyAgICAgICAgICAgIFggPSBOZXdYOwogICAgICAgICAgICAgQ3VyckFuZ2xlIC09IEFuZ2xlc1tTdGVwXTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChhbmdsZSA+IDApCi0gICAgeworICAgIGlmIChhbmdsZSA+IDApIHsKICAgICAgICAgKmNvcyA9IFg7CiAgICAgICAgICpzaW4gPSBZOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgICpjb3MgPSBYOwogICAgICAgICAqc2luID0gLVk7CiAgICAgfQpAQCAtMzQzLDcgKzMwMSw3IEBACiAJCW51bWJlciArPSAweDEwMDA7CiAJcmV0dXJuIFdiMzVSZWdfUmVhZFN5bmMocEh3RGF0YSwgbnVtYmVyLCBwVmFsdWUpOwogfQotI2RlZmluZSBod19nZXRfZHh4X3JlZyggX0EsIF9CLCBfQyApIGhhbF9nZXRfZHh4X3JlZyggX0EsIF9CLCAodTMyICopX0MgKQorI2RlZmluZSBod19nZXRfZHh4X3JlZyhfQSwgX0IsIF9DKSBoYWxfZ2V0X2R4eF9yZWcoX0EsIF9CLCAodTMyICopX0MpCiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGhhbF9zZXRfZHh4X3JlZyhzdHJ1Y3QgaHdfZGF0YSAqcEh3RGF0YSwgdTE2IG51bWJlciwgdTMyIHZhbHVlKQogewpAQCAtMzU0LDcgKzMxMiw3IEBACiAJcmV0ID0gV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgbnVtYmVyLCB2YWx1ZSk7CiAJcmV0dXJuIHJldDsKIH0KLSNkZWZpbmUgaHdfc2V0X2R4eF9yZWcoIF9BLCBfQiwgX0MgKSBoYWxfc2V0X2R4eF9yZWcoIF9BLCBfQiwgKHUzMilfQyApCisjZGVmaW5lIGh3X3NldF9keHhfcmVnKF9BLCBfQiwgX0MpIGhhbF9zZXRfZHh4X3JlZyhfQSwgX0IsICh1MzIpX0MpCiAKIAogdm9pZCBfcmVzZXRfcnhfY2FsKHN0cnVjdCBod19kYXRhICpwaHdfZGF0YSkKQEAgLTM2MywyNSArMzIxLDIwIEBACiAKIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgJnZhbCk7CiAKLQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLy8gMXN0LWN1dAotCXsKKwlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLyogMXN0LWN1dCAqLwogCQl2YWwgJj0gMHhGRkZGMDAwMDsKLQl9Ci0JZWxzZSAvLyAybmQtY3V0Ci0JeworCWVsc2UgLyogMm5kLWN1dCAqLwogCQl2YWwgJj0gMHgwMDAwMDNGRjsKLQl9CiAKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgdmFsKTsKIH0KIAogCi0vLyAqKioqKioqKioqKipmb3Igd2luYm9uZCBjYWxpYnJhdGlvbioqKioqKioqKgotLy8KKy8qKioqKioqKioqKioqKmZvciB3aW5ib25kIGNhbGlicmF0aW9uKioqKioqKioqLwogCi0vLwotLy8KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBfcnhhZGNfZGNfb2Zmc2V0X2NhbmNlbGxhdGlvbl93aW5ib25kKHN0cnVjdCBod19kYXRhICpwaHdfZGF0YSwgdTMyIGZyZXF1ZW5jeSkKIHsKICAgICB1MzIgICAgIHJlZ19hZ2NfY3RybDM7CkBAIC0zOTIsMzUgKzM0NSwzMSBAQAogICAgIFBIWV9ERUJVRygoIltDQUxdIC0+IFsxXV9yeGFkY19kY19vZmZzZXRfY2FuY2VsbGF0aW9uKClcbiIpKTsKICAgICBwaHlfaW5pdF9yZihwaHdfZGF0YSk7CiAKLSAgICAvLyBzZXQgY2FsaWJyYXRpb24gY2hhbm5lbAotICAgIGlmKCAoUkZfV0JfMjQyID09IHBod19kYXRhLT5waHlfdHlwZSkgfHwKLQkJKFJGX1dCXzI0Ml8xID09IHBod19kYXRhLT5waHlfdHlwZSkgKSAvLyAyMDA2MDYxOS41IEFkZAotICAgIHsKLSAgICAgICAgaWYgKChmcmVxdWVuY3kgPj0gMjQxMikgJiYgKGZyZXF1ZW5jeSA8PSAyNDg0KSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdzg5cmYyNDIgY2hhbmdlIGZyZXF1ZW5jeSB0byAyMzkwTWh6CisgICAgLyogc2V0IGNhbGlicmF0aW9uIGNoYW5uZWwgKi8KKyAgICBpZiAoKFJGX1dCXzI0MiA9PSBwaHdfZGF0YS0+cGh5X3R5cGUpIHx8CisJCShSRl9XQl8yNDJfMSA9PSBwaHdfZGF0YS0+cGh5X3R5cGUpKSAvKiAyMDA2MDYxOS41IEFkZCAqL3sKKyAgICAgICAgaWYgKChmcmVxdWVuY3kgPj0gMjQxMikgJiYgKGZyZXF1ZW5jeSA8PSAyNDg0KSkgeworICAgICAgICAgICAgLyogdzg5cmYyNDIgY2hhbmdlIGZyZXF1ZW5jeSB0byAyMzkwTWh6ICovCiAgICAgICAgICAgICBQSFlfREVCVUcoKCJbQ0FMXSBXODlSRjI0Mi8xMUcvQ2hhbm5lbD0yMzkwTWh6XG4iKSk7CiAJCQlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDMsICgzPDwyNCl8MHgwMjU1ODYpOwogCiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotCXsKKyAgICB9IGVsc2UgewogCiAJfQogCi0JLy8gcmVzZXQgY2FuY2VsX2RjX2lbOTo1XSBhbmQgY2FuY2VsX2RjX3FbNDowXSBpbiByZWdpc3RlciBEQ19DYW5jZWwKKwkvKiByZXNldCBjYW5jZWxfZGNfaVs5OjVdIGFuZCBjYW5jZWxfZGNfcVs0OjBdIGluIHJlZ2lzdGVyIERDX0NhbmNlbCAqLwogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCAmdmFsKTsKIAl2YWwgJj0gfigweDAzRkYpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCB2YWwpOwogCi0JLy8gcmVzZXQgdGhlIFRYIGFuZCBSWCBJUSBjYWxpYnJhdGlvbiBkYXRhCisJLyogcmVzZXQgdGhlIFRYIGFuZCBSWCBJUSBjYWxpYnJhdGlvbiBkYXRhICovCiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4M0MsIDApOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCAwKTsKIAotCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU4LCAweDMwMzAzMDMwKTsgLy8gSVFfQWxwaGEgQ2hhbmdlZAorCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU4LCAweDMwMzAzMDMwKTsgLyogSVFfQWxwaGEgQ2hhbmdlZCAqLwogCi0JLy8gYS4gRGlzYWJsZSBBR0MKKwkvKiBhLiBEaXNhYmxlIEFHQyAqLwogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkwzLCAmcmVnX2FnY19jdHJsMyk7CiAJcmVnX2FnY19jdHJsMyAmPSB+QklUKDIpOwogCXJlZ19hZ2NfY3RybDMgfD0gKE1BU0tfTE5BX0ZJWF9HQUlOfE1BU0tfQUdDX0ZJWCk7CkBAIC00MzAsNyArMzc5LDcgQEAKIAl2YWwgfD0gTUFTS19BR0NfRklYX0dBSU47CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BR0NfQ1RSTDUsIHZhbCk7CiAKLQkvLyBiLiBUdXJuIG9mZiBCQiBSWAorCS8qIGIuIFR1cm4gb2ZmIEJCIFJYICovCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BX0FDUV9DVFJMLCAmcmVnX2FfYWNxX2N0cmwpOwogCXJlZ19hX2FjcV9jdHJsIHw9IE1BU0tfQU1FUl9PRkZfUkVHOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQV9BQ1FfQ1RSTCwgcmVnX2FfYWNxX2N0cmwpOwpAQCAtNDM5LDkgKzM4OCw5IEBACiAJcmVnX2JfYWNxX2N0cmwgfD0gTUFTS19CTUVSX09GRl9SRUc7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19CX0FDUV9DVFJMLCByZWdfYl9hY3FfY3RybCk7CiAKLQkvLyBjLiBNYWtlIHN1cmUgTUFDIGlzIGluIHJlY2VpdmluZyBtb2RlCi0JLy8gZC4gVHVybiBPTiBBREMgY2FsaWJyYXRpb24KLQkvLyAgICAtIEFEQyBjYWxpYnJhdG9yIGlzIHRyaWdnZXJlZCBieSB0aGlzIHNpZ25hbCByaXNpbmcgZnJvbSAwIHRvIDEKKwkvKiBjLiBNYWtlIHN1cmUgTUFDIGlzIGluIHJlY2VpdmluZyBtb2RlCisJICogZC4gVHVybiBPTiBBREMgY2FsaWJyYXRpb24KKwkgKiAgICAtIEFEQyBjYWxpYnJhdG9yIGlzIHRyaWdnZXJlZCBieSB0aGlzIHNpZ25hbCByaXNpbmcgZnJvbSAwIHRvIDEgKi8KIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgJnZhbCk7CiAJdmFsICY9IH5NQVNLX0FEQ19EQ19DQUxfU1RSOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCB2YWwpOwpAQCAtNDQ5LDcgKzM5OCw3IEBACiAJdmFsIHw9IE1BU0tfQURDX0RDX0NBTF9TVFI7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHZhbCk7CiAKLQkvLyBlLiBUaGUgcmVzdWx0IGFyZSBzaG93biBpbiAiYWRjX2RjX2NhbF9pWzg6MF0gYW5kIGFkY19kY19jYWxfcVs4OjBdIgorCS8qIGUuIFRoZSByZXN1bHQgYXJlIHNob3duIGluICJhZGNfZGNfY2FsX2lbODowXSBhbmQgYWRjX2RjX2NhbF9xWzg6MF0iICovCiAjaWZkZWYgX0RFQlVHCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19PRkZTRVRfUkVBRCwgJnZhbCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgUkVHX09GRlNFVF9SRUFEID0gMHglMDhYXG4iLCB2YWwpKTsKQEAgLTQ2NCwyMyArNDEzLDIzIEBACiAJdmFsICY9IH5NQVNLX0FEQ19EQ19DQUxfU1RSOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCB2YWwpOwogCi0JLy8gZi4gVHVybiBvbiBCQiBSWAotCS8vaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BX0FDUV9DVFJMLCAmcmVnX2FfYWNxX2N0cmwpOworCS8qIGYuIFR1cm4gb24gQkIgUlggKi8KKwkvKiBod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0FfQUNRX0NUUkwsICZyZWdfYV9hY3FfY3RybCk7ICovCiAJcmVnX2FfYWNxX2N0cmwgJj0gfk1BU0tfQU1FUl9PRkZfUkVHOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQV9BQ1FfQ1RSTCwgcmVnX2FfYWNxX2N0cmwpOwogCi0JLy9od19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0JfQUNRX0NUUkwsICZyZWdfYl9hY3FfY3RybCk7CisJLyogaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19CX0FDUV9DVFJMLCAmcmVnX2JfYWNxX2N0cmwpOyAqLwogCXJlZ19iX2FjcV9jdHJsICY9IH5NQVNLX0JNRVJfT0ZGX1JFRzsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0JfQUNRX0NUUkwsIHJlZ19iX2FjcV9jdHJsKTsKIAotCS8vIGcuIEVuYWJsZSBBR0MKLQkvL2h3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkwzLCAmdmFsKTsKKwkvKiBnLiBFbmFibGUgQUdDICovCisJLyogaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BR0NfQ1RSTDMsICZ2YWwpOyAqLwogCXJlZ19hZ2NfY3RybDMgfD0gQklUKDIpOwogCXJlZ19hZ2NfY3RybDMgJj0gfihNQVNLX0xOQV9GSVhfR0FJTnxNQVNLX0FHQ19GSVgpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkwzLCByZWdfYWdjX2N0cmwzKTsKIH0KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBfdHhpZGFjX2RjX29mZnNldF9jYW5jZWxsYXRpb25fd2luYm9uZChzdHJ1Y3QgaHdfZGF0YSAqcGh3X2RhdGEpCiB7CiAJdTMyICAgICByZWdfYWdjX2N0cmwzOwpAQCAtNDk3LDIyICs0NDYsMjIgQEAKIAogCVBIWV9ERUJVRygoIltDQUxdIC0+IFsyXV90eGlkYWNfZGNfb2Zmc2V0X2NhbmNlbGxhdGlvbigpXG4iKSk7CiAKLQkvLyBhLiBTZXQgdG8gIlRYIGNhbGlicmF0aW9uIG1vZGUiCisJLyogYS4gU2V0IHRvICJUWCBjYWxpYnJhdGlvbiBtb2RlIiAqLwogCi0JLy8weDAxIDB4RUUzRkMyICA7IDNCOEZGICA7IENhbGlicmF0aW9uICg2YSkuIGVuYWJsZSBUWCBJUSBjYWxpYnJhdGlvbiBsb29wIGNpcmN1aXRzCisJLyogMHgwMSAweEVFM0ZDMiAgOyAzQjhGRiAgOyBDYWxpYnJhdGlvbiAoNmEpLiBlbmFibGUgVFggSVEgY2FsaWJyYXRpb24gbG9vcCBjaXJjdWl0cyAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMSwgKDE8PDI0KXwweEVFM0ZDMik7Ci0JLy8weDBCIDB4MTkwNUQ2ICA7IDA2NDE3ICA7IENhbGlicmF0aW9uICg2YikuIGVuYWJsZSBUWCBJL1EgY2FsIGxvb3Agc3F1YXJpbmcgY2lyY3VpdAorCS8qIDB4MEIgMHgxOTA1RDYgIDsgMDY0MTcgIDsgQ2FsaWJyYXRpb24gKDZiKS4gZW5hYmxlIFRYIEkvUSBjYWwgbG9vcCBzcXVhcmluZyBjaXJjdWl0ICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAxMSwgKDExPDwyNCl8MHgxOTAxRDYpOwotCS8vMHgwNSAweDI0QzYwQSAgOyAwOTMxOCAgOyBDYWxpYnJhdGlvbiAoNmMpLiBzZXR0aW5nIFRYLVZHQSBnYWluOiBUWEdDSD0yICYgR1BLPTExMCAtLT4gdG8gYmUgb3B0aW1pemVkCisJLyogMHgwNSAweDI0QzYwQSAgOyAwOTMxOCAgOyBDYWxpYnJhdGlvbiAoNmMpLiBzZXR0aW5nIFRYLVZHQSBnYWluOiBUWEdDSD0yICYgR1BLPTExMCAtLT4gdG8gYmUgb3B0aW1pemVkICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA1LCAoNTw8MjQpfDB4MjRDNDhBKTsKLSAgICAvLzB4MDYgMHgwNjg4MEMgIDsgMDFBMjAgIDsgQ2FsaWJyYXRpb24gKDZkKS4gUlhHQ0g9MDA7IFJYR0NMPTEwMCAwMDAgKFJYVkdBPTMyKSAtLT4gdG8gYmUgb3B0aW1pemVkCisgICAgICAgIC8qIDB4MDYgMHgwNjg4MEMgIDsgMDFBMjAgIDsgQ2FsaWJyYXRpb24gKDZkKS4gUlhHQ0g9MDA7IFJYR0NMPTEwMCAwMDAgKFJYVkdBPTMyKSAtLT4gdG8gYmUgb3B0aW1pemVkICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA2LCAoNjw8MjQpfDB4MDY4OTBDKTsKLQkvLzB4MDAgMHhGREYxQzAgIDsgM0Y3QzcgIDsgQ2FsaWJyYXRpb24gKDZlKS4gdHVybiBvbiBJUSBpbWJhbGFuY2UvVGVzdCBtb2RlCisJLyogMHgwMCAweEZERjFDMCAgOyAzRjdDNyAgOyBDYWxpYnJhdGlvbiAoNmUpLiB0dXJuIG9uIElRIGltYmFsYW5jZS9UZXN0IG1vZGUgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDAsICgwPDwyNCl8MHhGREYxQzApOwogCi0JaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTgsIDB4MzAzMDMwMzApOyAvLyBJUV9BbHBoYSBDaGFuZ2VkCisJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTgsIDB4MzAzMDMwMzApOyAvKiBJUV9BbHBoYSBDaGFuZ2VkICovCiAKLQkvLyBhLiBEaXNhYmxlIEFHQworCS8qIGEuIERpc2FibGUgQUdDICovCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BR0NfQ1RSTDMsICZyZWdfYWdjX2N0cmwzKTsKIAlyZWdfYWdjX2N0cmwzICY9IH5CSVQoMik7CiAJcmVnX2FnY19jdHJsMyB8PSAoTUFTS19MTkFfRklYX0dBSU58TUFTS19BR0NfRklYKTsKQEAgLTUyMiwxOSArNDcxLDE5IEBACiAJdmFsIHw9IE1BU0tfQUdDX0ZJWF9HQUlOOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkw1LCB2YWwpOwogCi0JLy8gYi4gc2V0IGlxY2FsX21vZGVbMTowXSB0byAweDIgYW5kIHNldCBpcWNhbF90b25lWzM6Ml0gdG8gMAorCS8qIGIuIHNldCBpcWNhbF9tb2RlWzE6MF0gdG8gMHgyIGFuZCBzZXQgaXFjYWxfdG9uZVszOjJdIHRvIDAgKi8KIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgJnJlZ19tb2RlX2N0cmwpOwogCiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMIChyZWFkKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCXJlZ19tb2RlX2N0cmwgJj0gfihNQVNLX0lRQ0FMX1RPTkVfU0VMfE1BU0tfSVFDQUxfTU9ERSk7CiAKLQkvLyBtb2RlPTIsIHRvbmU9MAotCS8vcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwyKTsKKwkvKiBtb2RlPTIsIHRvbmU9MCAqLworCS8qIHJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8Mik7ICovCiAKLQkvLyBtb2RlPTIsIHRvbmU9MQotCS8vcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwyfCgxPDwyKSk7CisJLyogbW9kZT0yLCB0b25lPTEgKi8KKwkvKiByZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDJ8KDE8PDIpKTsgKi8KIAotCS8vIG1vZGU9MiwgdG9uZT0yCisJLyogbW9kZT0yLCB0b25lPTIgKi8KIAlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDJ8KDI8PDIpKTsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKQEAgLTU0MiwxMiArNDkxLDEwIEBACiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsICZyZWdfZGNfY2FuY2VsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHJlYWQpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAKLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgTE9PUF9USU1FUzsgbG9vcCsrKQotCXsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgTE9PUF9USU1FUzsgbG9vcCsrKSB7CiAJCVBIWV9ERUJVRygoIltDQUxdIFslZC5dID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGxvb3ApKTsKIAotCQkvLyBjLgotCQkvLyByZXNldCBjYW5jZWxfZGNfaVs5OjVdIGFuZCBjYW5jZWxfZGNfcVs0OjBdIGluIHJlZ2lzdGVyIERDX0NhbmNlbAorCQkvKiBjLiByZXNldCBjYW5jZWxfZGNfaVs5OjVdIGFuZCBjYW5jZWxfZGNfcVs0OjBdIGluIHJlZ2lzdGVyIERDX0NhbmNlbCAqLwogCQlyZWdfZGNfY2FuY2VsICY9IH4oMHgwM0ZGKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwpAQCAtNTYyLDcgKzUwOSw3IEBACiAJCVBIWV9ERUJVRygoIltDQUxdICAgIG1hZ18wPSVkIChpcWNhbF9pbWFnZV9pPSVkLCBpcWNhbF9pbWFnZV9xPSVkKVxuIiwKIAkJCQkgICBtYWdfMCwgaXFjYWxfaW1hZ2VfaSwgaXFjYWxfaW1hZ2VfcSkpOwogCi0JCS8vIGQuCisJCS8qIGQuICovCiAJCXJlZ19kY19jYW5jZWwgfD0gKDEgPDwgQ0FOQ0VMX0RDX0lfU0hJRlQpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7CkBAIC01NzcsMTggKzUyNCwxMiBAQAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBtYWdfMT0lZCAoaXFjYWxfaW1hZ2VfaT0lZCwgaXFjYWxfaW1hZ2VfcT0lZClcbiIsCiAJCQkJICAgbWFnXzEsIGlxY2FsX2ltYWdlX2ksIGlxY2FsX2ltYWdlX3EpKTsKIAotCQkvLyBlLiBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgREMgb2Zmc2V0IGNhbmNlbGxhdGlvbiB2YWx1ZSBmb3IgSQorCQkvKiBlLiBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgREMgb2Zmc2V0IGNhbmNlbGxhdGlvbiB2YWx1ZSBmb3IgSSAqLwogCQlpZiAobWFnXzAgIT0gbWFnXzEpCi0JCXsKIAkJCWZpeF9jYW5jZWxfZGNfaSA9IChtYWdfMCoxMDAwMCkgLyAobWFnXzAqMTAwMDAgLSBtYWdfMSoxMDAwMCk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCWVsc2UgewogCQkJaWYgKG1hZ18wID09IG1hZ18xKQotCQkJewogCQkJCVBIWV9ERUJVRygoIltDQUxdICAgKioqKiogbWFnXzAgPSBtYWdfMSAhIVxuIikpOwotCQkJfQotCiAJCQlmaXhfY2FuY2VsX2RjX2kgPSAwOwogCQl9CiAKQEAgLTU5NiwxMiArNTM3LDEwIEBACiAJCQkJICAgZml4X2NhbmNlbF9kY19pLCBfczMyX3RvX3M1KGZpeF9jYW5jZWxfZGNfaSkpKTsKIAogCQlpZiAoKGFicyhtYWdfMS1tYWdfMCkqNikgPiBtYWdfMCkKLQkJewogCQkJYnJlYWs7Ci0JCX0KIAl9CiAKLQlpZiAoIGxvb3AgPj0gMTkgKQorCWlmIChsb29wID49IDE5KQogCSAgIGZpeF9jYW5jZWxfZGNfaSA9IDA7CiAKIAlyZWdfZGNfY2FuY2VsICY9IH4oMHgwM0ZGKTsKQEAgLTYwOSwxMyArNTQ4LDEzIEBACiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAKLQkvLyBnLgorCS8qIGcuICovCiAJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKIH0KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBfdHhxZGFjX2RjX29mZnNldF9jYWNlbGxhdGlvbl93aW5ib25kKHN0cnVjdCBod19kYXRhICpwaHdfZGF0YSkKIHsKIAl1MzIgICAgIHJlZ19hZ2NfY3RybDM7CkBAIC02MzEsMjAgKzU3MCwyMCBAQAogCWludCAgICAgbG9vcDsKIAogCVBIWV9ERUJVRygoIltDQUxdIC0+IFszXV90eHFkYWNfZGNfb2Zmc2V0X2NhY2VsbGF0aW9uKClcbiIpKTsKLQkvLzB4MDEgMHhFRTNGQzIgIDsgM0I4RkYgIDsgQ2FsaWJyYXRpb24gKDZhKS4gZW5hYmxlIFRYIElRIGNhbGlicmF0aW9uIGxvb3AgY2lyY3VpdHMKKwkvKjB4MDEgMHhFRTNGQzIgIDsgM0I4RkYgIDsgQ2FsaWJyYXRpb24gKDZhKS4gZW5hYmxlIFRYIElRIGNhbGlicmF0aW9uIGxvb3AgY2lyY3VpdHMgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDEsICgxPDwyNCl8MHhFRTNGQzIpOwotCS8vMHgwQiAweDE5MDVENiAgOyAwNjQxNyAgOyBDYWxpYnJhdGlvbiAoNmIpLiBlbmFibGUgVFggSS9RIGNhbCBsb29wIHNxdWFyaW5nIGNpcmN1aXQKKwkvKiAweDBCIDB4MTkwNUQ2ICA7IDA2NDE3ICA7IENhbGlicmF0aW9uICg2YikuIGVuYWJsZSBUWCBJL1EgY2FsIGxvb3Agc3F1YXJpbmcgY2lyY3VpdCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMTEsICgxMTw8MjQpfDB4MTkwMUQ2KTsKLQkvLzB4MDUgMHgyNEM2MEEgIDsgMDkzMTggIDsgQ2FsaWJyYXRpb24gKDZjKS4gc2V0dGluZyBUWC1WR0EgZ2FpbjogVFhHQ0g9MiAmIEdQSz0xMTAgLS0+IHRvIGJlIG9wdGltaXplZAorCS8qIDB4MDUgMHgyNEM2MEEgIDsgMDkzMTggIDsgQ2FsaWJyYXRpb24gKDZjKS4gc2V0dGluZyBUWC1WR0EgZ2FpbjogVFhHQ0g9MiAmIEdQSz0xMTAgLS0+IHRvIGJlIG9wdGltaXplZCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNSwgKDU8PDI0KXwweDI0QzQ4QSk7Ci0gICAgLy8weDA2IDB4MDY4ODBDICA7IDAxQTIwICA7IENhbGlicmF0aW9uICg2ZCkuIFJYR0NIPTAwOyBSWEdDTD0xMDAgMDAwIChSWFZHQT0zMikgLS0+IHRvIGJlIG9wdGltaXplZAorICAgICAgICAvKiAweDA2IDB4MDY4ODBDICA7IDAxQTIwICA7IENhbGlicmF0aW9uICg2ZCkuIFJYR0NIPTAwOyBSWEdDTD0xMDAgMDAwIChSWFZHQT0zMikgLS0+IHRvIGJlIG9wdGltaXplZCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNiwgKDY8PDI0KXwweDA2ODkwQyk7Ci0JLy8weDAwIDB4RkRGMUMwICA7IDNGN0M3ICA7IENhbGlicmF0aW9uICg2ZSkuIHR1cm4gb24gSVEgaW1iYWxhbmNlL1Rlc3QgbW9kZQorCS8qIDB4MDAgMHhGREYxQzAgIDsgM0Y3QzcgIDsgQ2FsaWJyYXRpb24gKDZlKS4gdHVybiBvbiBJUSBpbWJhbGFuY2UvVGVzdCBtb2RlICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAwLCAoMDw8MjQpfDB4RkRGMUMwKTsKIAotCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU4LCAweDMwMzAzMDMwKTsgLy8gSVFfQWxwaGEgQ2hhbmdlZAorCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU4LCAweDMwMzAzMDMwKTsgLyogSVFfQWxwaGEgQ2hhbmdlZCAqLwogCi0JLy8gYS4gRGlzYWJsZSBBR0MKKwkvKiBhLiBEaXNhYmxlIEFHQyAqLwogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkwzLCAmcmVnX2FnY19jdHJsMyk7CiAJcmVnX2FnY19jdHJsMyAmPSB+QklUKDIpOwogCXJlZ19hZ2NfY3RybDMgfD0gKE1BU0tfTE5BX0ZJWF9HQUlOfE1BU0tfQUdDX0ZJWCk7CkBAIC02NTQsMTEgKzU5MywxMSBAQAogCXZhbCB8PSBNQVNLX0FHQ19GSVhfR0FJTjsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0FHQ19DVFJMNSwgdmFsKTsKIAotCS8vIGEuIHNldCBpcWNhbF9tb2RlWzE6MF0gdG8gMHgzIGFuZCBzZXQgaXFjYWxfdG9uZVszOjJdIHRvIDAKKwkvKiBhLiBzZXQgaXFjYWxfbW9kZVsxOjBdIHRvIDB4MyBhbmQgc2V0IGlxY2FsX3RvbmVbMzoyXSB0byAwICovCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsICZyZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHJlYWQpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiAKLQkvL3JlZ19tb2RlX2N0cmwgJj0gfihNQVNLX0lRQ0FMX1RPTkVfU0VMfE1BU0tfSVFDQUxfTU9ERSk7CisJLyogcmVnX21vZGVfY3RybCAmPSB+KE1BU0tfSVFDQUxfVE9ORV9TRUx8TUFTS19JUUNBTF9NT0RFKTsgKi8KIAlyZWdfbW9kZV9jdHJsICY9IH4oTUFTS19JUUNBTF9NT0RFKTsKIAlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDMpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKQEAgLTY2NywxMiArNjA2LDEwIEBACiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsICZyZWdfZGNfY2FuY2VsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHJlYWQpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAKLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgTE9PUF9USU1FUzsgbG9vcCsrKQotCXsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgTE9PUF9USU1FUzsgbG9vcCsrKSB7CiAJCVBIWV9ERUJVRygoIltDQUxdIFslZC5dID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGxvb3ApKTsKIAotCQkvLyBiLgotCQkvLyByZXNldCBjYW5jZWxfZGNfcVs0OjBdIGluIHJlZ2lzdGVyIERDX0NhbmNlbAorCQkvKiBiLiByZXNldCBjYW5jZWxfZGNfcVs0OjBdIGluIHJlZ2lzdGVyIERDX0NhbmNlbCAqLwogCQlyZWdfZGNfY2FuY2VsICY9IH4oMHgwMDFGKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwpAQCAtNjg3LDcgKzYyNCw3IEBACiAJCVBIWV9ERUJVRygoIltDQUxdICAgIG1hZ18wPSVkIChpcWNhbF9pbWFnZV9pPSVkLCBpcWNhbF9pbWFnZV9xPSVkKVxuIiwKIAkJCQkgICBtYWdfMCwgaXFjYWxfaW1hZ2VfaSwgaXFjYWxfaW1hZ2VfcSkpOwogCi0JCS8vIGMuCisJCS8qIGMuICovCiAJCXJlZ19kY19jYW5jZWwgfD0gKDEgPDwgQ0FOQ0VMX0RDX1FfU0hJRlQpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7CkBAIC03MDIsMTggKzYzOSwxMiBAQAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBtYWdfMT0lZCAoaXFjYWxfaW1hZ2VfaT0lZCwgaXFjYWxfaW1hZ2VfcT0lZClcbiIsCiAJCQkJICAgbWFnXzEsIGlxY2FsX2ltYWdlX2ksIGlxY2FsX2ltYWdlX3EpKTsKIAotCQkvLyBkLiBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgREMgb2Zmc2V0IGNhbmNlbGxhdGlvbiB2YWx1ZSBmb3IgSQorCQkvKiBkLiBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgREMgb2Zmc2V0IGNhbmNlbGxhdGlvbiB2YWx1ZSBmb3IgSSAqLwogCQlpZiAobWFnXzAgIT0gbWFnXzEpCi0JCXsKIAkJCWZpeF9jYW5jZWxfZGNfcSA9IChtYWdfMCoxMDAwMCkgLyAobWFnXzAqMTAwMDAgLSBtYWdfMSoxMDAwMCk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCWVsc2UgewogCQkJaWYgKG1hZ18wID09IG1hZ18xKQotCQkJewogCQkJCVBIWV9ERUJVRygoIltDQUxdICAgKioqKiogbWFnXzAgPSBtYWdfMSAhIVxuIikpOwotCQkJfQotCiAJCQlmaXhfY2FuY2VsX2RjX3EgPSAwOwogCQl9CiAKQEAgLTcyMSwxMiArNjUyLDEwIEBACiAJCQkJICAgZml4X2NhbmNlbF9kY19xLCBfczMyX3RvX3M1KGZpeF9jYW5jZWxfZGNfcSkpKTsKIAogCQlpZiAoKGFicyhtYWdfMS1tYWdfMCkqNikgPiBtYWdfMCkKLQkJewogCQkJYnJlYWs7Ci0JCX0KIAl9CiAKLQlpZiAoIGxvb3AgPj0gMTkgKQorCWlmIChsb29wID49IDE5KQogCSAgIGZpeF9jYW5jZWxfZGNfcSA9IDA7CiAKIAlyZWdfZGNfY2FuY2VsICY9IH4oMHgwMDFGKTsKQEAgLTczNSwxMyArNjY0LDEzIEBACiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAogCi0JLy8gZi4KKwkvKiBmLiAqLwogCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiB9CiAKLS8vMjAwNjA2MTIuMS5hIDIwMDYwNzE4LjEgTW9kaWZ5CisvKiAyMDA2MDYxMi4xLmEgMjAwNjA3MTguMSBNb2RpZnkgKi8KIHU4IF90eF9pcV9jYWxpYnJhdGlvbl9sb29wX3dpbmJvbmQoc3RydWN0IGh3X2RhdGEgKnBod19kYXRhLAogCQkJCQkJICAgczMyIGFfMl90aHJlc2hvbGQsCiAJCQkJCQkgICBzMzIgYl8yX3RocmVzaG9sZCkKQEAgLTc2NSw3ICs2OTQsNyBAQAogCXMzMiAgICAgdGVtcDEsIHRlbXAyOwogCXUzMiAgICAgdmFsOwogCXUxNiAgICAgbG9vcDsKLQlzMzIgICAgIGlxY2FsX3RvbmVfaV9hdmcsaXFjYWxfdG9uZV9xX2F2ZzsKKwlzMzIgICAgIGlxY2FsX3RvbmVfaV9hdmcsIGlxY2FsX3RvbmVfcV9hdmc7CiAJdTggICAgICB2ZXJpZnlfY291bnQ7CiAJaW50IGNhcHR1cmVfdGltZTsKIApAQCAtNzgwLDE4ICs3MDksMTggQEAKIAogCWxvb3AgPSBMT09QX1RJTUVTOwogCi0Jd2hpbGUgKGxvb3AgPiAwKQotCXsKKwl3aGlsZSAobG9vcCA+IDApIHsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gWyVkLl0gPF90eF9pcV9jYWxpYnJhdGlvbl9sb29wPlxuIiwgKExPT1BfVElNRVMtbG9vcCsxKSkpOwogCi0JCWlxY2FsX3RvbmVfaV9hdmc9MDsKLQkJaXFjYWxfdG9uZV9xX2F2Zz0wOwotCQlpZiggIWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDNDLCAweDAwKSApIC8vIDIwMDYwNzE4LjEgbW9kaWZ5CisJCWlxY2FsX3RvbmVfaV9hdmcgPSAwOworCQlpcWNhbF90b25lX3FfYXZnID0gMDsKKwkJaWYgKCFod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgzQywgMHgwMCkpIC8qIDIwMDYwNzE4LjEgbW9kaWZ5ICovCiAJCQlyZXR1cm4gMDsKLQkJZm9yKGNhcHR1cmVfdGltZT0wO2NhcHR1cmVfdGltZTwxMDtjYXB0dXJlX3RpbWUrKykKLQkJewotCQkJLy8gYS4gU2V0IGlxY2FsX21vZGVbMTowXSB0byAweDIgYW5kIHNldCAiY2FsaWJfc3RhcnQiIHRvIDB4MSB0bwotCQkJLy8gICAgZW5hYmxlICJJUSBhbGlicmF0aW9uIE1vZGUgSUkiCisJCWZvciAoY2FwdHVyZV90aW1lID0gMDsgY2FwdHVyZV90aW1lIDwgMTA7IGNhcHR1cmVfdGltZSsrKSB7CisJCQkvKgorCQkJICogYS4gU2V0IGlxY2FsX21vZGVbMTowXSB0byAweDIgYW5kIHNldCAiY2FsaWJfc3RhcnQiIHRvIDB4MSB0bworCQkJICogICAgZW5hYmxlICJJUSBhbGlicmF0aW9uIE1vZGUgSUkiCisJCQkgKi8KIAkJCXJlZ19tb2RlX2N0cmwgJj0gfihNQVNLX0lRQ0FMX1RPTkVfU0VMfE1BU0tfSVFDQUxfTU9ERSk7CiAJCQlyZWdfbW9kZV9jdHJsICY9IH5NQVNLX0lRQ0FMX01PREU7CiAJCQlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDB4MDIpOwpAQCAtNzk5LDcgKzcyOCw3IEBACiAJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCi0JCQkvLyBiLgorCQkJLyogYi4gKi8KIAkJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDEsICZ2YWwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDEgPSAweCUwOFhcbiIsIHZhbCkpOwogCkBAIC04MTMsMjEgKzc0MiwyMyBAQAogCQkJaXFfbWFnXzBfdHggPSAoczMyKSBfc3FydChzcXN1bSk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiBpcV9tYWdfMF90eD0lZFxuIiwgaXFfbWFnXzBfdHgpKTsKIAotCQkJLy8gYy4gU2V0ICJjYWxpYl9zdGFydCIgdG8gMHgwCisJCQkvKiBjLiBTZXQgImNhbGliX3N0YXJ0IiB0byAweDAgKi8KIAkJCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7CiAJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCi0JCQkvLyBkLiBTZXQgaXFjYWxfbW9kZVsxOjBdIHRvIDB4MyBhbmQgc2V0ICJjYWxpYl9zdGFydCIgdG8gMHgxIHRvCi0JCQkvLyAgICBlbmFibGUgIklRIGFsaWJyYXRpb24gTW9kZSBJSSIKLQkJCS8vaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsICZ2YWwpOworCQkJLyoKKwkJCSAqIGQuIFNldCBpcWNhbF9tb2RlWzE6MF0gdG8gMHgzIGFuZCBzZXQgImNhbGliX3N0YXJ0IiB0byAweDEgdG8KKwkJCSAqICAgIGVuYWJsZSAiSVEgYWxpYnJhdGlvbiBNb2RlIElJIgorCQkJICovCisJCQkvKiBod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgJnZhbCk7ICovCiAJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgJnJlZ19tb2RlX2N0cmwpOwogCQkJcmVnX21vZGVfY3RybCAmPSB+TUFTS19JUUNBTF9NT0RFOwogCQkJcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwweDAzKTsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiAKLQkJCS8vIGUuCisJCQkvKiBlLiAqLwogCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMSA9IDB4JTA4WFxuIiwgdmFsKSk7CiAKQEAgLTgzNSwxNCArNzY2LDExIEBACiAJCQlpcWNhbF90b25lX3EgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgKiogaXFjYWxfdG9uZV9pID0gJWQsIGlxY2FsX3RvbmVfcSA9ICVkXG4iLAogCQkJaXFjYWxfdG9uZV9pLCBpcWNhbF90b25lX3EpKTsKLQkJCWlmKCBjYXB0dXJlX3RpbWUgPT0gMCkKLQkJCXsKKwkJCWlmIChjYXB0dXJlX3RpbWUgPT0gMCkKIAkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpcWNhbF90b25lX2lfYXZnPSggaXFjYWxfdG9uZV9pX2F2ZyooY2FwdHVyZV90aW1lLTEpICtpcWNhbF90b25lX2kpL2NhcHR1cmVfdGltZTsKLQkJCQlpcWNhbF90b25lX3FfYXZnPSggaXFjYWxfdG9uZV9xX2F2ZyooY2FwdHVyZV90aW1lLTEpICtpcWNhbF90b25lX3EpL2NhcHR1cmVfdGltZTsKKwkJCWVsc2UgeworCQkJCWlxY2FsX3RvbmVfaV9hdmcgPSAoaXFjYWxfdG9uZV9pX2F2ZyooY2FwdHVyZV90aW1lLTEpICsgaXFjYWxfdG9uZV9pKS9jYXB0dXJlX3RpbWU7CisJCQkJaXFjYWxfdG9uZV9xX2F2ZyA9IChpcWNhbF90b25lX3FfYXZnKihjYXB0dXJlX3RpbWUtMSkgKyBpcWNhbF90b25lX3EpL2NhcHR1cmVfdGltZTsKIAkJCX0KIAkJfQogCkBAIC04NTcsMTEgKzc4NSwxMCBAQAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiByb3RfaV9iID0gJWQsIHJvdF9xX2IgPSAlZFxuIiwKIAkJCQkgICByb3RfaV9iLCByb3RfcV9iKSk7CiAKLQkJLy8gZi4KKwkJLyogZi4gKi8KIAkJZGl2aXNvciA9ICgoaXFfbWFnXzBfdHggKiBpcV9tYWdfMF90eCAqIDIpLzEwMjQgLSByb3RfaV9iKSAqIDI7CiAKLQkJaWYgKGRpdmlzb3IgPT0gMCkKLQkJeworCQlpZiAoZGl2aXNvciA9PSAwKSB7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiA8X3R4X2lxX2NhbGlicmF0aW9uX2xvb3A+IEVSUk9SICoqKioqKipcbiIpKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICoqIGRpdmlzb3I9MCB0byBjYWxjdWxhdGUgRVBTIGFuZCBUSEVUQSAhIVxuIikpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CkBAIC04NzYsMTggKzgwMywxNiBAQAogCQlwaHdfZGF0YS0+aXFfcnNkbF9nYWluX3R4X2QyID0gYV8yOwogCQlwaHdfZGF0YS0+aXFfcnNkbF9waGFzZV90eF9kMiA9IGJfMjsKIAotCQkvL2lmICgoYWJzKGFfMikgPCAxNTApICYmIChhYnMoYl8yKSA8IDEwMCkpCi0JCS8vaWYgKChhYnMoYV8yKSA8IDIwMCkgJiYgKGFicyhiXzIpIDwgMjAwKSkKLQkJaWYgKChhYnMoYV8yKSA8IGFfMl90aHJlc2hvbGQpICYmIChhYnMoYl8yKSA8IGJfMl90aHJlc2hvbGQpKQotCQl7CisJCS8qIGlmICgoYWJzKGFfMikgPCAxNTApICYmIChhYnMoYl8yKSA8IDEwMCkpICovCisJCS8qIGlmICgoYWJzKGFfMikgPCAyMDApICYmIChhYnMoYl8yKSA8IDIwMCkpICovCisJCWlmICgoYWJzKGFfMikgPCBhXzJfdGhyZXNob2xkKSAmJiAoYWJzKGJfMikgPCBiXzJfdGhyZXNob2xkKSkgewogCQkJdmVyaWZ5X2NvdW50Kys7CiAKIAkJCVBIWV9ERUJVRygoIltDQUxdICoqIDxfdHhfaXFfY2FsaWJyYXRpb25fbG9vcD4gKioqKioqKioqKioqKlxuIikpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogVkVSSUZZIE9LICMgJWQgISFcbiIsIHZlcmlmeV9jb3VudCkpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CiAKLQkJCWlmICh2ZXJpZnlfY291bnQgPiAyKQotCQkJeworCQkJaWYgKHZlcmlmeV9jb3VudCA+IDIpIHsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiA8X3R4X2lxX2NhbGlicmF0aW9uX2xvb3A+ICoqKioqKioqKlxuIikpOwogCQkJCVBIWV9ERUJVRygoIltDQUxdICoqIFRYX0lRX0NBTElCUkFUSU9OIChFUFMsVEhFVEEpIE9LICEhXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKQEAgLTg5NSwzNyArODIwLDI5IEBACiAJCQl9CiAKIAkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UKIAkJCXZlcmlmeV9jb3VudCA9IDA7Ci0JCX0KIAogCQlfc2luX2NvcyhiXzIsICZzaW5fYiwgJmNvc19iKTsKIAkJX3Npbl9jb3MoYl8yKjIsICZzaW5fMmIsICZjb3NfMmIpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiBzaW4oYi8yKT0lZCwgY29zKGIvMik9JWRcbiIsIHNpbl9iLCBjb3NfYikpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiBzaW4oYik9JWQsIGNvcyhiKT0lZFxuIiwgc2luXzJiLCBjb3NfMmIpKTsKIAotCQlpZiAoY29zXzJiID09IDApCi0JCXsKKwkJaWYgKGNvc18yYiA9PSAwKSB7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiA8X3R4X2lxX2NhbGlicmF0aW9uX2xvb3A+IEVSUk9SICoqKioqKipcbiIpKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICoqIGNvcyhiKT0wICEhXG4iKSk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJLy8gMTI4MCAqIDMyNzY4ID0gNDE5NDMwNDAKKwkJLyogMTI4MCAqIDMyNzY4ID0gNDE5NDMwNDAgKi8KIAkJdGVtcDEgPSAoNDE5NDMwNDAvY29zXzJiKSpjb3NfYjsKIAotCQkvL3RlbXAyID0gKDQxOTQzMDQwL2Nvc18yYikqc2luX2IqKC0xKTsKLQkJaWYgKHBod19kYXRhLT5yZXZpc2lvbiA9PSAweDIwMDIpIC8vIDFzdC1jdXQKLQkJeworCQkvKiB0ZW1wMiA9ICg0MTk0MzA0MC9jb3NfMmIpKnNpbl9iKigtMSk7ICovCisJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvKiAxc3QtY3V0ICovCiAJCQl0ZW1wMiA9ICg0MTk0MzA0MC9jb3NfMmIpKnNpbl9iKigtMSk7Ci0JCX0KLQkJZWxzZSAvLyAybmQtY3V0Ci0JCXsKKwkJZWxzZSAvKiAybmQtY3V0ICovCiAJCQl0ZW1wMiA9ICg0MTk0MzA0MCo0L2Nvc18yYikqc2luX2IqKC0xKTsKLQkJfQogCiAJCXR4X2NhbF9mbHRfYlswXSA9IF9mbG9vcih0ZW1wMS8oMzI3NjgrYV8yKSk7CiAJCXR4X2NhbF9mbHRfYlsxXSA9IF9mbG9vcih0ZW1wMi8oMzI3NjgrYV8yKSk7CkBAIC05MzcsMzcgKzg1NCwzNCBAQAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAgICB0eF9jYWxfZmx0X2JbM10gPSAlZFxuIiwgdHhfY2FsX2ZsdF9iWzNdKSk7CiAKIAkJdHhfY2FsWzJdID0gdHhfY2FsX2ZsdF9iWzJdOwotCQl0eF9jYWxbMl0gPSB0eF9jYWxbMl0gKzM7CisJCXR4X2NhbFsyXSA9IHR4X2NhbFsyXSArIDM7CiAJCXR4X2NhbFsxXSA9IHR4X2NhbFsyXTsKIAkJdHhfY2FsWzNdID0gdHhfY2FsX2ZsdF9iWzNdIC0gMTI4OwotCQl0eF9jYWxbMF0gPSAtdHhfY2FsWzNdKzE7CisJCXR4X2NhbFswXSA9IC10eF9jYWxbM10gKyAxOwogCiAJCVBIWV9ERUJVRygoIltDQUxdICAgICAgIHR4X2NhbFswXSA9ICVkXG4iLCB0eF9jYWxbMF0pKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgICAgdHhfY2FsWzFdID0gJWRcbiIsIHR4X2NhbFsxXSkpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAgICB0eF9jYWxbMl0gPSAlZFxuIiwgdHhfY2FsWzJdKSk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgICAgIHR4X2NhbFszXSA9ICVkXG4iLCB0eF9jYWxbM10pKTsKIAotCQkvL2lmICgodHhfY2FsWzBdID09IDApICYmICh0eF9jYWxbMV0gPT0gMCkgJiYKLQkJLy8gICAgKHR4X2NhbFsyXSA9PSAwKSAmJiAodHhfY2FsWzNdID09IDApKQotCQkvL3sKLQkJLy8gICAgUEhZX0RFQlVHKCgiW0NBTF0gKiogPF90eF9pcV9jYWxpYnJhdGlvbl9sb29wPiAqKioqKioqKioqKioqXG4iKSk7Ci0JCS8vICAgIFBIWV9ERUJVRygoIltDQUxdICoqIFRYX0lRX0NBTElCUkFUSU9OIENPTVBMRVRFICEhXG4iKSk7Ci0JCS8vICAgIFBIWV9ERUJVRygoIltDQUxdICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwotCQkvLyAgICByZXR1cm4gMDsKLQkJLy99CisJCS8qIGlmICgodHhfY2FsWzBdID09IDApICYmICh0eF9jYWxbMV0gPT0gMCkgJiYKKwkJICAgICAgKHR4X2NhbFsyXSA9PSAwKSAmJiAodHhfY2FsWzNdID09IDApKQorCQkgIHsgKi8KKwkJLyogICAgUEhZX0RFQlVHKCgiW0NBTF0gKiogPF90eF9pcV9jYWxpYnJhdGlvbl9sb29wPiAqKioqKioqKioqKioqXG4iKSk7CisJCSAqICAgIFBIWV9ERUJVRygoIltDQUxdICoqIFRYX0lRX0NBTElCUkFUSU9OIENPTVBMRVRFICEhXG4iKSk7CisJCSAqICAgIFBIWV9ERUJVRygoIltDQUxdICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOworCQkgKiAgICByZXR1cm4gMDsKKwkJICB9ICovCiAKLQkJLy8gZy4KLQkJaWYgKHBod19kYXRhLT5yZXZpc2lvbiA9PSAweDIwMDIpIC8vIDFzdC1jdXQKLQkJeworCQkvKiBnLiAqLworCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLyogMXN0LWN1dCAqL3sKIAkJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCAmdmFsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIDB4NTQgPSAweCUwOFhcbiIsIHZhbCkpOwogCQkJdHhfY2FsX3JlZ1swXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4RjAwMDAwMDApID4+IDI4KTsKIAkJCXR4X2NhbF9yZWdbMV0gPSBfczRfdG9fczMyKCh2YWwgJiAweDBGMDAwMDAwKSA+PiAyNCk7CiAJCQl0eF9jYWxfcmVnWzJdID0gX3M0X3RvX3MzMigodmFsICYgMHgwMEYwMDAwMCkgPj4gMjApOwogCQkJdHhfY2FsX3JlZ1szXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwRjAwMDApID4+IDE2KTsKLQkJfQotCQllbHNlIC8vIDJuZC1jdXQKLQkJeworCQl9IGVsc2UgLyogMm5kLWN1dCAqL3sKIAkJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDNDLCAmdmFsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIDB4M0MgPSAweCUwOFhcbiIsIHZhbCkpOwogCQkJdHhfY2FsX3JlZ1swXSA9IF9zNV90b19zMzIoKHZhbCAmIDB4RjgwMDAwMDApID4+IDI3KTsKQEAgLTk4MiwyMiArODk2LDE3IEBACiAJCVBIWV9ERUJVRygoIltDQUxdICAgICAgIHR4X2NhbF9yZWdbMl0gPSAlZFxuIiwgdHhfY2FsX3JlZ1syXSkpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAgICB0eF9jYWxfcmVnWzNdID0gJWRcbiIsIHR4X2NhbF9yZWdbM10pKTsKIAotCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLy8gMXN0LWN1dAotCQl7Ci0JCQlpZiAoKCh0eF9jYWxfcmVnWzBdPT03KSB8fCAodHhfY2FsX3JlZ1swXT09KC04KSkpICYmCi0JCQkJKCh0eF9jYWxfcmVnWzNdPT03KSB8fCAodHhfY2FsX3JlZ1szXT09KC04KSkpKQotCQkJeworCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLyogMXN0LWN1dCAqL3sKKwkJCWlmICgoKHR4X2NhbF9yZWdbMF0gPT0gNykgfHwgKHR4X2NhbF9yZWdbMF0gPT0gKC04KSkpICYmCisJCQkJKCh0eF9jYWxfcmVnWzNdID09IDcpIHx8ICh0eF9jYWxfcmVnWzNdID09ICgtOCkpKSkgewogCQkJCVBIWV9ERUJVRygoIltDQUxdICoqIDxfdHhfaXFfY2FsaWJyYXRpb25fbG9vcD4gKioqKioqKioqXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogVFhfSVFfQ0FMSUJSQVRJT04gU0FUVUFUSU9OICEhXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJfQotCQllbHNlIC8vIDJuZC1jdXQKLQkJewotCQkJaWYgKCgodHhfY2FsX3JlZ1swXT09MzEpIHx8ICh0eF9jYWxfcmVnWzBdPT0oLTMyKSkpICYmCi0JCQkJKCh0eF9jYWxfcmVnWzNdPT0zMSkgfHwgKHR4X2NhbF9yZWdbM109PSgtMzIpKSkpCi0JCQl7CisJCX0gZWxzZSAvKiAybmQtY3V0ICoveworCQkJaWYgKCgodHhfY2FsX3JlZ1swXSA9PSAzMSkgfHwgKHR4X2NhbF9yZWdbMF0gPT0gKC0zMikpKSAmJgorCQkJCSgodHhfY2FsX3JlZ1szXSA9PSAzMSkgfHwgKHR4X2NhbF9yZWdbM10gPT0gKC0zMikpKSkgewogCQkJCVBIWV9ERUJVRygoIltDQUxdICoqIDxfdHhfaXFfY2FsaWJyYXRpb25fbG9vcD4gKioqKioqKioqXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogVFhfSVFfQ0FMSUJSQVRJT04gU0FUVUFUSU9OICEhXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKQEAgLTEwMTQsOCArOTIzLDcgQEAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgICAgYXBwbHkgdHhfY2FsWzJdID0gJWRcbiIsIHR4X2NhbFsyXSkpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAgICBhcHBseSB0eF9jYWxbM10gPSAlZFxuIiwgdHhfY2FsWzNdKSk7CiAKLQkJaWYgKHBod19kYXRhLT5yZXZpc2lvbiA9PSAweDIwMDIpIC8vIDFzdC1jdXQKLQkJeworCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLyogMXN0LWN1dCAqL3sKIAkJCXZhbCAmPSAweDAwMDBGRkZGOwogCQkJdmFsIHw9ICgoX3MzMl90b19zNCh0eF9jYWxbMF0pIDw8IDI4KXwKIAkJCQkJKF9zMzJfdG9fczQodHhfY2FsWzFdKSA8PCAyNCl8CkBAIC0xMDI0LDkgKzkzMiw3IEBACiAJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgdmFsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIENBTElCX0RBVEEgPSAweCUwOFhcbiIsIHZhbCkpOwogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSAvLyAybmQtY3V0Ci0JCXsKKwkJfSBlbHNlIC8qIDJuZC1jdXQgKi97CiAJCQl2YWwgJj0gMHgwMDAwMDNGRjsKIAkJCXZhbCB8PSAoKF9zMzJfdG9fczUodHhfY2FsWzBdKSA8PCAyNyl8CiAJCQkJCShfczMyX3RvX3M2KHR4X2NhbFsxXSkgPDwgMjEpfApAQCAtMTAzNyw3ICs5NDMsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQkvLyBpLiBTZXQgImNhbGliX3N0YXJ0IiB0byAweDAKKwkJLyogaS4gU2V0ICJjYWxpYl9zdGFydCIgdG8gMHgwICovCiAJCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKQEAgLTEwNjEsMjYgKzk2NywyNiBAQAogCiAJUEhZX0RFQlVHKCgiW0NBTF0gLT4gWzRdX3R4X2lxX2NhbGlicmF0aW9uKClcbiIpKTsKIAotCS8vMHgwMSAweEVFM0ZDMiAgOyAzQjhGRiAgOyBDYWxpYnJhdGlvbiAoNmEpLiBlbmFibGUgVFggSVEgY2FsaWJyYXRpb24gbG9vcCBjaXJjdWl0cworCS8qIDB4MDEgMHhFRTNGQzIgIDsgM0I4RkYgIDsgQ2FsaWJyYXRpb24gKDZhKS4gZW5hYmxlIFRYIElRIGNhbGlicmF0aW9uIGxvb3AgY2lyY3VpdHMgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDEsICgxPDwyNCl8MHhFRTNGQzIpOwotCS8vMHgwQiAweDE5MDVENiAgOyAwNjQxNyAgOyBDYWxpYnJhdGlvbiAoNmIpLiBlbmFibGUgVFggSS9RIGNhbCBsb29wIHNxdWFyaW5nIGNpcmN1aXQKLQlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDExLCAoMTE8PDI0KXwweDE5QkRENik7IC8vIDIwMDYwNjEyLjEuYSAweDE5MDVENik7Ci0JLy8weDA1IDB4MjRDNjBBICA7IDA5MzE4ICA7IENhbGlicmF0aW9uICg2YykuIHNldHRpbmcgVFgtVkdBIGdhaW46IFRYR0NIPTIgJiBHUEs9MTEwIC0tPiB0byBiZSBvcHRpbWl6ZWQKLQlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDUsICg1PDwyNCl8MHgyNEM2MEEpOyAvLzB4MjRDNjBBIChoaWdoIHRlbXBlcmF0dXJlKQotICAgIC8vMHgwNiAweDA2ODgwQyAgOyAwMUEyMCAgOyBDYWxpYnJhdGlvbiAoNmQpLiBSWEdDSD0wMDsgUlhHQ0w9MTAwIDAwMCAoUlhWR0E9MzIpIC0tPiB0byBiZSBvcHRpbWl6ZWQKLQlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDYsICg2PDwyNCl8MHgzNDg4MEMpOyAvLyAyMDA2MDYxMi4xLmEgMHgwNjg5MEMpOwotCS8vMHgwMCAweEZERjFDMCAgOyAzRjdDNyAgOyBDYWxpYnJhdGlvbiAoNmUpLiB0dXJuIG9uIElRIGltYmFsYW5jZS9UZXN0IG1vZGUKKwkvKiAweDBCIDB4MTkwNUQ2ICA7IDA2NDE3ICA7IENhbGlicmF0aW9uICg2YikuIGVuYWJsZSBUWCBJL1EgY2FsIGxvb3Agc3F1YXJpbmcgY2lyY3VpdCAqLworCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMTEsICgxMTw8MjQpfDB4MTlCREQ2KTsgLyogMjAwNjA2MTIuMS5hIDB4MTkwNUQ2KTsgKi8KKwkvKiAweDA1IDB4MjRDNjBBICA7IDA5MzE4ICA7IENhbGlicmF0aW9uICg2YykuIHNldHRpbmcgVFgtVkdBIGdhaW46IFRYR0NIPTIgJiBHUEs9MTEwIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KKwlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDUsICg1PDwyNCl8MHgyNEM2MEEpOyAvKiAweDI0QzYwQSAoaGlnaCB0ZW1wZXJhdHVyZSkgKi8KKyAgICAgICAgLyogMHgwNiAweDA2ODgwQyAgOyAwMUEyMCAgOyBDYWxpYnJhdGlvbiAoNmQpLiBSWEdDSD0wMDsgUlhHQ0w9MTAwIDAwMCAoUlhWR0E9MzIpIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KKwlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDYsICg2PDwyNCl8MHgzNDg4MEMpOyAvKiAyMDA2MDYxMi4xLmEgMHgwNjg5MEMpOyAqLworCS8qIDB4MDAgMHhGREYxQzAgIDsgM0Y3QzcgIDsgQ2FsaWJyYXRpb24gKDZlKS4gdHVybiBvbiBJUSBpbWJhbGFuY2UvVGVzdCBtb2RlICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAwLCAoMDw8MjQpfDB4RkRGMUMwKTsKLQkvLzsgW0JCLWNoaXBdOiBDYWxpYnJhdGlvbiAoNmYpLlNlbmQgdGVzdCBwYXR0ZXJuCi0JLy87IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDZnKS4gU2VhcmNoIFJYR0NMIG9wdGltYWwgdmFsdWUKLQkvLzsgW0JCLWNoaXBdOiBDYWxpYnJhdGlvbiAoNmgpLiBDYWN1bGF0ZSBUWC1wYXRoIElRIGltYmFsYW5jZSBhbmQgc2V0dGluZyBUWCBwYXRoIElRIGNvbXBlbnNhdGlvbiB0YWJsZQotCS8vcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAzLCAoMzw8MjQpfDB4MDI1NTg2KTsKKwkvKiA7IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDZmKS5TZW5kIHRlc3QgcGF0dGVybiAqLworCS8qIDsgW0JCLWNoaXBdOiBDYWxpYnJhdGlvbiAoNmcpLiBTZWFyY2ggUlhHQ0wgb3B0aW1hbCB2YWx1ZSAqLworCS8qIDsgW0JCLWNoaXBdOiBDYWxpYnJhdGlvbiAoNmgpLiBDYWN1bGF0ZSBUWC1wYXRoIElRIGltYmFsYW5jZSBhbmQgc2V0dGluZyBUWCBwYXRoIElRIGNvbXBlbnNhdGlvbiB0YWJsZSAqLworCS8qIHBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMywgKDM8PDI0KXwweDAyNTU4Nik7ICovCiAKLQltc2xlZXAoMzApOyAvLyAyMDA2MDYxMi4xLmEgMzBtcyBkZWxheS4gQWRkIHRoZSBmb2xsb3cgMiBsaW5lcwotCS8vVG8gYWRqdXN0IFRYVkdBIHRvIGZpdCBpcV9tYWdfMCByYW5nZSBmcm9tIDEyNTAgfiAxNzUwCi0JYWRqdXN0X1RYVkdBX2Zvcl9pcV9tYWcoIHBod19kYXRhICk7CisJbXNsZWVwKDMwKTsgLyogMjAwNjA2MTIuMS5hIDMwbXMgZGVsYXkuIEFkZCB0aGUgZm9sbG93IDIgbGluZXMgKi8KKwkvKiBUbyBhZGp1c3QgVFhWR0EgdG8gZml0IGlxX21hZ18wIHJhbmdlIGZyb20gMTI1MCB+IDE3NTAgKi8KKwlhZGp1c3RfVFhWR0FfZm9yX2lxX21hZyhwaHdfZGF0YSk7CiAKLQkvLyBhLiBEaXNhYmxlIEFHQworCS8qIGEuIERpc2FibGUgQUdDICovCiAJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BR0NfQ1RSTDMsICZyZWdfYWdjX2N0cmwzKTsKIAlyZWdfYWdjX2N0cmwzICY9IH5CSVQoMik7CiAJcmVnX2FnY19jdHJsMyB8PSAoTUFTS19MTkFfRklYX0dBSU58TUFTS19BR0NfRklYKTsKQEAgLTEwOTIsMTYgKzk5OCwxMiBAQAogCiAJcmVzdWx0ID0gX3R4X2lxX2NhbGlicmF0aW9uX2xvb3Bfd2luYm9uZChwaHdfZGF0YSwgMTUwLCAxMDApOwogCi0JaWYgKHJlc3VsdCA+IDApCi0JewotCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLy8gMXN0LWN1dAotCQl7CisJaWYgKHJlc3VsdCA+IDApIHsKKwkJaWYgKHBod19kYXRhLT5yZXZpc2lvbiA9PSAweDIwMDIpIC8qIDFzdC1jdXQgKi97CiAJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgJnZhbCk7CiAJCQl2YWwgJj0gMHgwMDAwRkZGRjsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCB2YWwpOwotCQl9Ci0JCWVsc2UgLy8gMm5kLWN1dAotCQl7CisJCX0gZWxzZSAvKiAybmQtY3V0Ki97CiAJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgzQywgJnZhbCk7CiAJCQl2YWwgJj0gMHgwMDAwMDNGRjsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDNDLCB2YWwpOwpAQCAtMTEwOSwzMiArMTAxMSwyNCBAQAogCiAJCXJlc3VsdCA9IF90eF9pcV9jYWxpYnJhdGlvbl9sb29wX3dpbmJvbmQocGh3X2RhdGEsIDMwMCwgMjAwKTsKIAotCQlpZiAocmVzdWx0ID4gMCkKLQkJewotCQkJaWYgKHBod19kYXRhLT5yZXZpc2lvbiA9PSAweDIwMDIpIC8vIDFzdC1jdXQKLQkJCXsKKwkJaWYgKHJlc3VsdCA+IDApIHsKKwkJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvKiAxc3QtY3V0ICovewogCQkJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCAmdmFsKTsKIAkJCQl2YWwgJj0gMHgwMDAwRkZGRjsKIAkJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgdmFsKTsKLQkJCX0KLQkJCWVsc2UgLy8gMm5kLWN1dAotCQkJeworCQkJfSBlbHNlIC8qIDJuZC1jdXQqL3sKIAkJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgzQywgJnZhbCk7CiAJCQkJdmFsICY9IDB4MDAwMDAzRkY7CiAJCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4M0MsIHZhbCk7CiAJCQl9CiAKIAkJCXJlc3VsdCA9IF90eF9pcV9jYWxpYnJhdGlvbl9sb29wX3dpbmJvbmQocGh3X2RhdGEsIDUwMCwgNDAwKTsKLQkJCWlmIChyZXN1bHQgPiAwKQotCQkJewotCQkJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvLyAxc3QtY3V0Ci0JCQkJeworCQkJaWYgKHJlc3VsdCA+IDApIHsKKwkJCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLyogMXN0LWN1dCAqL3sKIAkJCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTQsICZ2YWwpOwogCQkJCQl2YWwgJj0gMHgwMDAwRkZGRjsKIAkJCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTQsIHZhbCk7Ci0JCQkJfQotCQkJCWVsc2UgLy8gMm5kLWN1dAotCQkJCXsKKwkJCQl9IGVsc2UgLyogMm5kLWN1dCAqL3sKIAkJCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4M0MsICZ2YWwpOwogCQkJCQl2YWwgJj0gMHgwMDAwMDNGRjsKIAkJCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4M0MsIHZhbCk7CkBAIC0xMTQzLDIwICsxMDM3LDE2IEBACiAKIAkJCQlyZXN1bHQgPSBfdHhfaXFfY2FsaWJyYXRpb25fbG9vcF93aW5ib25kKHBod19kYXRhLCA3MDAsIDUwMCk7CiAKLQkJCQlpZiAocmVzdWx0ID4gMCkKLQkJCQl7CisJCQkJaWYgKHJlc3VsdCA+IDApIHsKIAkJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogPF90eF9pcV9jYWxpYnJhdGlvbj4gKioqKioqKioqKioqKipcbiIpKTsKIAkJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogVFhfSVFfQ0FMSUJSQVRJT04gRkFJTFVSRSAhIVxuIikpOwogCQkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwogCi0JCQkJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvLyAxc3QtY3V0Ci0JCQkJCXsKKwkJCQkJaWYgKHBod19kYXRhLT5yZXZpc2lvbiA9PSAweDIwMDIpIC8qIDFzdC1jdXQgKi97CiAJCQkJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgJnZhbCk7CiAJCQkJCQl2YWwgJj0gMHgwMDAwRkZGRjsKIAkJCQkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCB2YWwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgLy8gMm5kLWN1dAotCQkJCQl7CisJCQkJCX0gZWxzZSAvKiAybmQtY3V0ICovewogCQkJCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4M0MsICZ2YWwpOwogCQkJCQkJdmFsICY9IDB4MDAwMDAzRkY7CiAJCQkJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgzQywgdmFsKTsKQEAgLTExNjYsMzAgKzEwNTYsMjcgQEAKIAkJfQogCX0KIAotCS8vIGkuIFNldCAiY2FsaWJfc3RhcnQiIHRvIDB4MAorCS8qIGkuIFNldCAiY2FsaWJfc3RhcnQiIHRvIDB4MCAqLwogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCAmcmVnX21vZGVfY3RybCk7CiAJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKIAotCS8vIGcuIEVuYWJsZSBBR0MKLQkvL2h3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkwzLCAmdmFsKTsKKwkvKiBnLiBFbmFibGUgQUdDICovCisJLyogaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19BR0NfQ1RSTDMsICZ2YWwpOyAqLwogCXJlZ19hZ2NfY3RybDMgfD0gQklUKDIpOwogCXJlZ19hZ2NfY3RybDMgJj0gfihNQVNLX0xOQV9GSVhfR0FJTnxNQVNLX0FHQ19GSVgpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQUdDX0NUUkwzLCByZWdfYWdjX2N0cmwzKTsKIAogI2lmZGVmIF9ERUJVRwotCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvLyAxc3QtY3V0Ci0JeworCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvKiAxc3QtY3V0ICovewogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIDB4NTQgPSAweCUwOFhcbiIsIHZhbCkpOwogCQl0eF9jYWxfcmVnWzBdID0gX3M0X3RvX3MzMigodmFsICYgMHhGMDAwMDAwMCkgPj4gMjgpOwogCQl0eF9jYWxfcmVnWzFdID0gX3M0X3RvX3MzMigodmFsICYgMHgwRjAwMDAwMCkgPj4gMjQpOwogCQl0eF9jYWxfcmVnWzJdID0gX3M0X3RvX3MzMigodmFsICYgMHgwMEYwMDAwMCkgPj4gMjApOwogCQl0eF9jYWxfcmVnWzNdID0gX3M0X3RvX3MzMigodmFsICYgMHgwMDBGMDAwMCkgPj4gMTYpOwotCX0KLQllbHNlIC8vIDJuZC1jdXQKLQl7CisJfSBlbHNlIC8qIDJuZC1jdXQgKi8gewogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgzQywgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIDB4M0MgPSAweCUwOFhcbiIsIHZhbCkpOwogCQl0eF9jYWxfcmVnWzBdID0gX3M1X3RvX3MzMigodmFsICYgMHhGODAwMDAwMCkgPj4gMjcpOwpAQCAtMTIwNiwxMSArMTA5MywxMyBAQAogI2VuZGlmCiAKIAotCS8vIGZvciB0ZXN0IC0gQkVOCi0JLy8gUkYgQ29udHJvbCBPdmVycmlkZQorCS8qCisJICogZm9yIHRlc3QgLSBCRU4KKwkgKiBSRiBDb250cm9sIE92ZXJyaWRlCisJICovCiB9CiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1OCBfcnhfaXFfY2FsaWJyYXRpb25fbG9vcF93aW5ib25kKHN0cnVjdCBod19kYXRhICpwaHdfZGF0YSwgdTE2IGZhY3RvciwgdTMyIGZyZXF1ZW5jeSkKIHsKIAl1MzIgICAgIHJlZ19tb2RlX2N0cmw7CkBAIC0xMjM2LDUxICsxMTI1LDQ5IEBACiAJdTMyICAgICBwd3JfaW1hZ2U7CiAJdTggICAgICB2ZXJpZnlfY291bnQ7CiAKLQlzMzIgICAgIGlxY2FsX3RvbmVfaV9hdmcsaXFjYWxfdG9uZV9xX2F2ZzsKLQlzMzIgICAgIGlxY2FsX2ltYWdlX2lfYXZnLGlxY2FsX2ltYWdlX3FfYXZnOwotCXUxNgkJY2FwdHVyZV90aW1lOworCXMzMiAgICAgaXFjYWxfdG9uZV9pX2F2ZywgaXFjYWxfdG9uZV9xX2F2ZzsKKwlzMzIgICAgIGlxY2FsX2ltYWdlX2lfYXZnLCBpcWNhbF9pbWFnZV9xX2F2ZzsKKwl1MTYJY2FwdHVyZV90aW1lOwogCiAJUEhZX0RFQlVHKCgiW0NBTF0gLT4gWzVdX3J4X2lxX2NhbGlicmF0aW9uX2xvb3AoKVxuIikpOwogCVBIWV9ERUJVRygoIltDQUxdICoqIGZhY3RvciA9ICVkXG4iLCBmYWN0b3IpKTsKIAogCi0vLyBSRiBDb250cm9sIE92ZXJyaWRlCisvKiBSRiBDb250cm9sIE92ZXJyaWRlICovCiAJaHdfZ2V0X2N4eF9yZWcocGh3X2RhdGEsIDB4ODAsICZ2YWwpOwogCXZhbCB8PSBCSVQoMTkpOwogCWh3X3NldF9jeHhfcmVnKHBod19kYXRhLCAweDgwLCB2YWwpOwogCi0vLyBSRl9DdHJsCisvKiBSRl9DdHJsICovCiAJaHdfZ2V0X2N4eF9yZWcocGh3X2RhdGEsIDB4RTQsICZ2YWwpOwogCXZhbCB8PSBCSVQoMCk7CiAJaHdfc2V0X2N4eF9yZWcocGh3X2RhdGEsIDB4RTQsIHZhbCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gKiogUkZfQ1RSTCgweEU0KSA9IDB4JTA4WCIsIHZhbCkpOwogCi0JaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTgsIDB4NDQ0NDQ0NDQpOyAvLyBJUV9BbHBoYQorCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU4LCAweDQ0NDQ0NDQ0KTsgLyogSVFfQWxwaGEgKi8KIAotCS8vIGIuCisJLyogYi4gKi8KIAogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCAmcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMIChyZWFkKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCiAJdmVyaWZ5X2NvdW50ID0gMDsKIAotCS8vZm9yIChsb29wID0gMDsgbG9vcCA8IDE7IGxvb3ArKykKLQkvL2ZvciAobG9vcCA9IDA7IGxvb3AgPCBMT09QX1RJTUVTOyBsb29wKyspCisJLyogZm9yIChsb29wID0gMDsgbG9vcCA8IDE7IGxvb3ArKykgKi8KKwkvKiBmb3IgKGxvb3AgPSAwOyBsb29wIDwgTE9PUF9USU1FUzsgbG9vcCsrKSAqLwogCWxvb3AgPSBMT09QX1RJTUVTOwotCXdoaWxlIChsb29wID4gMCkKLQl7CisJd2hpbGUgKGxvb3AgPiAwKSB7CiAJCVBIWV9ERUJVRygoIltDQUxdIFslZC5dIDxfcnhfaXFfY2FsaWJyYXRpb25fbG9vcD5cbiIsIChMT09QX1RJTUVTLWxvb3ArMSkpKTsKLQkJaXFjYWxfdG9uZV9pX2F2Zz0wOwotCQlpcWNhbF90b25lX3FfYXZnPTA7Ci0JCWlxY2FsX2ltYWdlX2lfYXZnPTA7Ci0JCWlxY2FsX2ltYWdlX3FfYXZnPTA7Ci0JCWNhcHR1cmVfdGltZT0wOworCQlpcWNhbF90b25lX2lfYXZnID0gMDsKKwkJaXFjYWxfdG9uZV9xX2F2ZyA9IDA7CisJCWlxY2FsX2ltYWdlX2lfYXZnID0gMDsKKwkJaXFjYWxfaW1hZ2VfcV9hdmcgPSAwOworCQljYXB0dXJlX3RpbWUgPSAwOwogCi0JCWZvcihjYXB0dXJlX3RpbWU9MDsgY2FwdHVyZV90aW1lPDEwOyBjYXB0dXJlX3RpbWUrKykKLQkJewotCQkvLyBpLiBTZXQgImNhbGliX3N0YXJ0IiB0byAweDAKKwkJZm9yIChjYXB0dXJlX3RpbWUgPSAwOyBjYXB0dXJlX3RpbWUgPCAxMDsgY2FwdHVyZV90aW1lKyspIHsKKwkJLyogaS4gU2V0ICJjYWxpYl9zdGFydCIgdG8gMHgwICovCiAJCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfQ0FMSUJfU1RBUlQ7Ci0JCWlmKCAhaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpICkvLzIwMDYwNzE4LjEgbW9kaWZ5CisJCWlmICghaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpKS8qMjAwNjA3MTguMSBtb2RpZnkgKi8KIAkJCXJldHVybiAwOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCkBAIC0xMjg5LDcgKzExNzYsNyBAQAogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiAKLQkJLy8gYy4KKwkJLyogYy4gKi8KIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQxID0gMHglMDhYXG4iLCB2YWwpKTsKIApAQCAtMTMwNSwxNiArMTE5MiwxMyBAQAogCQlpcWNhbF9pbWFnZV9xID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgKiogaXFjYWxfaW1hZ2VfaSA9ICVkLCBpcWNhbF9pbWFnZV9xID0gJWRcbiIsCiAJCQkJICAgaXFjYWxfaW1hZ2VfaSwgaXFjYWxfaW1hZ2VfcSkpOwotCQkJaWYoIGNhcHR1cmVfdGltZSA9PSAwKQotCQkJeworCQkJaWYgKGNhcHR1cmVfdGltZSA9PSAwKQogCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlxY2FsX2ltYWdlX2lfYXZnPSggaXFjYWxfaW1hZ2VfaV9hdmcqKGNhcHR1cmVfdGltZS0xKSAraXFjYWxfaW1hZ2VfaSkvY2FwdHVyZV90aW1lOwotCQkJCWlxY2FsX2ltYWdlX3FfYXZnPSggaXFjYWxfaW1hZ2VfcV9hdmcqKGNhcHR1cmVfdGltZS0xKSAraXFjYWxfaW1hZ2VfcSkvY2FwdHVyZV90aW1lOwotCQkJCWlxY2FsX3RvbmVfaV9hdmc9KCBpcWNhbF90b25lX2lfYXZnKihjYXB0dXJlX3RpbWUtMSkgK2lxY2FsX3RvbmVfaSkvY2FwdHVyZV90aW1lOwotCQkJCWlxY2FsX3RvbmVfcV9hdmc9KCBpcWNhbF90b25lX3FfYXZnKihjYXB0dXJlX3RpbWUtMSkgK2lxY2FsX3RvbmVfcSkvY2FwdHVyZV90aW1lOworCQkJZWxzZSB7CisJCQkJaXFjYWxfaW1hZ2VfaV9hdmcgPSAoaXFjYWxfaW1hZ2VfaV9hdmcqKGNhcHR1cmVfdGltZS0xKSArIGlxY2FsX2ltYWdlX2kpL2NhcHR1cmVfdGltZTsKKwkJCQlpcWNhbF9pbWFnZV9xX2F2ZyA9IChpcWNhbF9pbWFnZV9xX2F2ZyooY2FwdHVyZV90aW1lLTEpICsgaXFjYWxfaW1hZ2VfcSkvY2FwdHVyZV90aW1lOworCQkJCWlxY2FsX3RvbmVfaV9hdmcgPSAoaXFjYWxfdG9uZV9pX2F2ZyooY2FwdHVyZV90aW1lLTEpICsgaXFjYWxfdG9uZV9pKS9jYXB0dXJlX3RpbWU7CisJCQkJaXFjYWxfdG9uZV9xX2F2ZyA9IChpcWNhbF90b25lX3FfYXZnKihjYXB0dXJlX3RpbWUtMSkgKyBpcWNhbF90b25lX3EpL2NhcHR1cmVfdGltZTsKIAkJCX0KIAkJfQogCkBAIC0xMzI0LDcgKzEyMDgsNyBAQAogCQlpcWNhbF90b25lX2kgPSBpcWNhbF90b25lX2lfYXZnOwogCQlpcWNhbF90b25lX3EgPSBpcWNhbF90b25lX3FfYXZnOwogCi0JCS8vIGQuCisJCS8qIGQuICovCiAJCXJvdF90b25lX2lfYiA9IChpcWNhbF90b25lX2kgKiBpcWNhbF90b25lX2kgKwogCQkJCQkJaXFjYWxfdG9uZV9xICogaXFjYWxfdG9uZV9xKSAvIDEwMjQ7CiAJCXJvdF90b25lX3FfYiA9IChpcWNhbF90b25lX2kgKiBpcWNhbF90b25lX3EgKiAoLTEpICsKQEAgLTEzMzksOSArMTIyMyw4IEBACiAJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIHJvdF9pbWFnZV9pX2IgPSAlZFxuIiwgcm90X2ltYWdlX2lfYikpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiByb3RfaW1hZ2VfcV9iID0gJWRcbiIsIHJvdF9pbWFnZV9xX2IpKTsKIAotCQkvLyBmLgotCQlpZiAocm90X3RvbmVfaV9iID09IDApCi0JCXsKKwkJLyogZi4gKi8KKwkJaWYgKHJvdF90b25lX2lfYiA9PSAwKSB7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiA8X3J4X2lxX2NhbGlicmF0aW9uX2xvb3A+IEVSUk9SICoqKioqKipcbiIpKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICoqIHJvdF90b25lX2lfYj0wIHRvIGNhbGN1bGF0ZSBFUFMgYW5kIFRIRVRBICEhXG4iKSk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKQEAgLTEzNjMsMjYgKzEyNDYsMjEgQEAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgKiogc2luKGIvMik9JWQsIGNvcyhiLzIpPSVkXG4iLCBzaW5fYiwgY29zX2IpKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgKiogc2luKGIpPSVkLCBjb3MoYik9JWRcbiIsIHNpbl8yYiwgY29zXzJiKSk7CiAKLQkJaWYgKGNvc18yYiA9PSAwKQotCQl7CisJCWlmIChjb3NfMmIgPT0gMCkgewogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogPF9yeF9pcV9jYWxpYnJhdGlvbl9sb29wPiBFUlJPUiAqKioqKioqXG4iKSk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiBjb3MoYik9MCAhIVxuIikpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCi0JCS8vIDEyODAgKiAzMjc2OCA9IDQxOTQzMDQwCisJCS8qIDEyODAgKiAzMjc2OCA9IDQxOTQzMDQwICovCiAJCXRlbXAxID0gKDQxOTQzMDQwL2Nvc18yYikqY29zX2I7CiAKLQkJLy90ZW1wMiA9ICg0MTk0MzA0MC9jb3NfMmIpKnNpbl9iKigtMSk7Ci0JCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvLyAxc3QtY3V0Ci0JCXsKKwkJLyogdGVtcDIgPSAoNDE5NDMwNDAvY29zXzJiKSpzaW5fYiooLTEpOyAqLworCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikvKiAxc3QtY3V0ICovCiAJCQl0ZW1wMiA9ICg0MTk0MzA0MC9jb3NfMmIpKnNpbl9iKigtMSk7Ci0JCX0KLQkJZWxzZSAvLyAybmQtY3V0Ci0JCXsKKwkJZWxzZS8qIDJuZC1jdXQgKi8KIAkJCXRlbXAyID0gKDQxOTQzMDQwKjQvY29zXzJiKSpzaW5fYiooLTEpOwotCQl9CiAKIAkJcnhfY2FsX2ZsdF9iWzBdID0gX2Zsb29yKHRlbXAxLygzMjc2OCthXzIpKTsKIAkJcnhfY2FsX2ZsdF9iWzFdID0gX2Zsb29yKHRlbXAyLygzMjc2OC1hXzIpKTsKQEAgLTE0MDMsMjMgKzEyODEsMjEgQEAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgICAgcnhfY2FsWzJdID0gJWRcbiIsIHJ4X2NhbFsyXSkpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAgICByeF9jYWxbM10gPSAlZFxuIiwgcnhfY2FsWzNdKSk7CiAKLQkJLy8gZS4KKwkJLyogZS4gKi8KIAkJcHdyX3RvbmUgPSAoaXFjYWxfdG9uZV9pKmlxY2FsX3RvbmVfaSArIGlxY2FsX3RvbmVfcSppcWNhbF90b25lX3EpOwogCQlwd3JfaW1hZ2UgPSAoaXFjYWxfaW1hZ2VfaSppcWNhbF9pbWFnZV9pICsgaXFjYWxfaW1hZ2VfcSppcWNhbF9pbWFnZV9xKSpmYWN0b3I7CiAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgKiogcHdyX3RvbmUgID0gJWRcbiIsIHB3cl90b25lKSk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgICoqIHB3cl9pbWFnZSAgPSAlZFxuIiwgcHdyX2ltYWdlKSk7CiAKLQkJaWYgKHB3cl90b25lID4gcHdyX2ltYWdlKQotCQl7CisJCWlmIChwd3JfdG9uZSA+IHB3cl9pbWFnZSkgewogCQkJdmVyaWZ5X2NvdW50Kys7CiAKIAkJCVBIWV9ERUJVRygoIltDQUxdICoqIDxfcnhfaXFfY2FsaWJyYXRpb25fbG9vcD4gKioqKioqKioqKioqKlxuIikpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogVkVSSUZZIE9LICMgJWQgISFcbiIsIHZlcmlmeV9jb3VudCkpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CiAKLQkJCWlmICh2ZXJpZnlfY291bnQgPiAyKQotCQkJeworCQkJaWYgKHZlcmlmeV9jb3VudCA+IDIpIHsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiA8X3J4X2lxX2NhbGlicmF0aW9uX2xvb3A+ICoqKioqKioqKlxuIikpOwogCQkJCVBIWV9ERUJVRygoIltDQUxdICoqIFJYX0lRX0NBTElCUkFUSU9OIE9LICEhXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKQEAgLTE0MjgsMTkgKzEzMDQsMTYgQEAKIAogCQkJY29udGludWU7CiAJCX0KLQkJLy8gZy4KKwkJLyogZy4gKi8KIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTQsICZ2YWwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiAweDU0ID0gMHglMDhYXG4iLCB2YWwpKTsKIAotCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLy8gMXN0LWN1dAotCQl7CisJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvKiAxc3QtY3V0ICovewogCQkJcnhfY2FsX3JlZ1swXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwMEYwMDApID4+IDEyKTsKIAkJCXJ4X2NhbF9yZWdbMV0gPSBfczRfdG9fczMyKCh2YWwgJiAweDAwMDAwRjAwKSA+PiAgOCk7CiAJCQlyeF9jYWxfcmVnWzJdID0gX3M0X3RvX3MzMigodmFsICYgMHgwMDAwMDBGMCkgPj4gIDQpOwogCQkJcnhfY2FsX3JlZ1szXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwMDAwMEYpKTsKLQkJfQotCQllbHNlIC8vIDJuZC1jdXQKLQkJeworCQl9IGVsc2UgLyogMm5kLWN1dCAqL3sKIAkJCXJ4X2NhbF9yZWdbMF0gPSBfczVfdG9fczMyKCh2YWwgJiAweEY4MDAwMDAwKSA+PiAyNyk7CiAJCQlyeF9jYWxfcmVnWzFdID0gX3M2X3RvX3MzMigodmFsICYgMHgwN0UwMDAwMCkgPj4gMjEpOwogCQkJcnhfY2FsX3JlZ1syXSA9IF9zNl90b19zMzIoKHZhbCAmIDB4MDAxRjgwMDApID4+IDE1KTsKQEAgLTE0NTIsMjIgKzEzMjUsMTcgQEAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgICAgcnhfY2FsX3JlZ1syXSA9ICVkXG4iLCByeF9jYWxfcmVnWzJdKSk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgICAgIHJ4X2NhbF9yZWdbM10gPSAlZFxuIiwgcnhfY2FsX3JlZ1szXSkpOwogCi0JCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvLyAxc3QtY3V0Ci0JCXsKLQkJCWlmICgoKHJ4X2NhbF9yZWdbMF09PTcpIHx8IChyeF9jYWxfcmVnWzBdPT0oLTgpKSkgJiYKLQkJCQkoKHJ4X2NhbF9yZWdbM109PTcpIHx8IChyeF9jYWxfcmVnWzNdPT0oLTgpKSkpCi0JCQl7CisJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvKiAxc3QtY3V0ICoveworCQkJaWYgKCgocnhfY2FsX3JlZ1swXSA9PSA3KSB8fCAocnhfY2FsX3JlZ1swXSA9PSAoLTgpKSkgJiYKKwkJCQkoKHJ4X2NhbF9yZWdbM10gPT0gNykgfHwgKHJ4X2NhbF9yZWdbM10gPT0gKC04KSkpKSB7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogPF9yeF9pcV9jYWxpYnJhdGlvbl9sb29wPiAqKioqKioqKipcbiIpKTsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiBSWF9JUV9DQUxJQlJBVElPTiBTQVRVQVRJT04gISFcbiIpKTsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwogCQkJCWJyZWFrOwogCQkJfQotCQl9Ci0JCWVsc2UgLy8gMm5kLWN1dAotCQl7Ci0JCQlpZiAoKChyeF9jYWxfcmVnWzBdPT0zMSkgfHwgKHJ4X2NhbF9yZWdbMF09PSgtMzIpKSkgJiYKLQkJCQkoKHJ4X2NhbF9yZWdbM109PTMxKSB8fCAocnhfY2FsX3JlZ1szXT09KC0zMikpKSkKLQkJCXsKKwkJfSBlbHNlIC8qIDJuZC1jdXQgKi97CisJCQlpZiAoKChyeF9jYWxfcmVnWzBdID09IDMxKSB8fCAocnhfY2FsX3JlZ1swXSA9PSAoLTMyKSkpICYmCisJCQkJKChyeF9jYWxfcmVnWzNdID09IDMxKSB8fCAocnhfY2FsX3JlZ1szXSA9PSAoLTMyKSkpKSB7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogPF9yeF9pcV9jYWxpYnJhdGlvbl9sb29wPiAqKioqKioqKipcbiIpKTsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiBSWF9JUV9DQUxJQlJBVElPTiBTQVRVQVRJT04gISFcbiIpKTsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwpAQCAtMTQ4NSwxNyArMTM1MywxNCBAQAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAgICBhcHBseSByeF9jYWxbM10gPSAlZFxuIiwgcnhfY2FsWzNdKSk7CiAKIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NTQsICZ2YWwpOwotCQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLy8gMXN0LWN1dAotCQl7CisJCWlmIChwaHdfZGF0YS0+cmV2aXNpb24gPT0gMHgyMDAyKSAvKiAxc3QtY3V0ICovewogCQkJdmFsICY9IDB4MDAwMEZGRkY7CiAJCQl2YWwgfD0gKChfczMyX3RvX3M0KHJ4X2NhbFswXSkgPDwgMTIpfAogCQkJCQkoX3MzMl90b19zNChyeF9jYWxbMV0pIDw8ICA4KXwKIAkJCQkJKF9zMzJfdG9fczQocnhfY2FsWzJdKSA8PCAgNCl8CiAJCQkJCShfczMyX3RvX3M0KHJ4X2NhbFszXSkpKTsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCB2YWwpOwotCQl9Ci0JCWVsc2UgLy8gMm5kLWN1dAotCQl7CisJCX0gZWxzZSAvKiAybmQtY3V0ICovewogCQkJdmFsICY9IDB4MDAwMDAzRkY7CiAJCQl2YWwgfD0gKChfczMyX3RvX3M1KHJ4X2NhbFswXSkgPDwgMjcpfAogCQkJCQkoX3MzMl90b19zNihyeF9jYWxbMV0pIDw8IDIxKXwKQEAgLTE1MDMsNyArMTM2OCw3IEBACiAJCQkJCShfczMyX3RvX3M1KHJ4X2NhbFszXSkgPDwgMTApKTsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDU0LCB2YWwpOwogCi0JCQlpZiggbG9vcCA9PSAzICkKKwkJCWlmIChsb29wID09IDMpCiAJCQlyZXR1cm4gMDsKIAkJfQogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiBDQUxJQl9EQVRBID0gMHglMDhYXG4iLCB2YWwpKTsKQEAgLTE1MTQsMTIgKzEzNzksMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBfcnhfaXFfY2FsaWJyYXRpb25fd2luYm9uZChzdHJ1Y3QgaHdfZGF0YSAqcGh3X2RhdGEsIHUzMiBmcmVxdWVuY3kpCiB7Ci0vLyBmaWdvIDIwMDUwNTIzIG1hcmtlZCB0aHNpIGZsYWcgZm9yIGNhbid0IGNvbXBpbGUgZm9yIHJlbGVzYXNlCisvKiBmaWdvIDIwMDUwNTIzIG1hcmtlZCB0aGlzIGZsYWcgZm9yIGNhbid0IGNvbXBpbGUgZm9yIHJlbGVzYXNlICovCiAjaWZkZWYgX0RFQlVHCiAJczMyICAgICByeF9jYWxfcmVnWzRdOwogCXUzMiAgICAgdmFsOwpAQCAtMTUyOCwzNyArMTM5MywzNCBAQAogCXU4ICAgICAgcmVzdWx0OwogCiAJUEhZX0RFQlVHKCgiW0NBTF0gLT4gWzVdX3J4X2lxX2NhbGlicmF0aW9uKClcbiIpKTsKLS8vIGEuIFNldCBSRklDIHRvICJSWCBjYWxpYnJhdGlvbiBtb2RlIgotCS8vOyAtLS0tLSBDYWxpYnJhdGlvbiAoNykuIFJYIHBhdGggSVEgaW1iYWxhbmNlIGNhbGlicmF0aW9uIGxvb3AKLQkvLwkweDAxIDB4RkZCRkMyICA7IDNGRUZGICA7IENhbGlicmF0aW9uICg3YSkuIGVuYWJsZSBSWCBJUSBjYWxpYnJhdGlvbiBsb29wIGNpcmN1aXRzCisvKiBhLiBTZXQgUkZJQyB0byAiUlggY2FsaWJyYXRpb24gbW9kZSIgKi8KKwkvKiA7IC0tLS0tIENhbGlicmF0aW9uICg3KS4gUlggcGF0aCBJUSBpbWJhbGFuY2UgY2FsaWJyYXRpb24gbG9vcCAqLworCS8qCTB4MDEgMHhGRkJGQzIgIDsgM0ZFRkYgIDsgQ2FsaWJyYXRpb24gKDdhKS4gZW5hYmxlIFJYIElRIGNhbGlicmF0aW9uIGxvb3AgY2lyY3VpdHMgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDEsICgxPDwyNCl8MHhFRkJGQzIpOwotCS8vCTB4MEIgMHgxQTAxRDYgIDsgMDY4MTcgIDsgQ2FsaWJyYXRpb24gKDdiKS4gZW5hYmxlIFJYIEkvUSBjYWwgbG9vcCBTVzEgY2lyY3VpdAorCS8qCTB4MEIgMHgxQTAxRDYgIDsgMDY4MTcgIDsgQ2FsaWJyYXRpb24gKDdiKS4gZW5hYmxlIFJYIEkvUSBjYWwgbG9vcCBTVzEgY2lyY3VpdHMgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDExLCAoMTE8PDI0KXwweDFBMDVENik7Ci0JLy8weDA1IDB4MjQ4NDhBICA7IDA5MjEyICA7IENhbGlicmF0aW9uICg3YykuIHNldHRpbmcgVFgtVkdBIGdhaW4gKFRYR0NIKSB0byAyIC0tPiB0byBiZSBvcHRpbWl6ZWQKLQlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDUsICg1PDwyNCl8IHBod19kYXRhLT50eHZnYV9zZXR0aW5nX2Zvcl9jYWwpOwotCS8vMHgwNiAweDA2ODQwQyAgOyAwMUExMCAgOyBDYWxpYnJhdGlvbiAoN2QpLiBSWEdDSD0wMDsgUlhHQ0w9MDEwIDAwMCAoUlhWR0EpIC0tPiB0byBiZSBvcHRpbWl6ZWQKKwkvKiAweDA1IDB4MjQ4NDhBICA7IDA5MjEyICA7IENhbGlicmF0aW9uICg3YykuIHNldHRpbmcgVFgtVkdBIGdhaW4gKFRYR0NIKSB0byAyIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KKwlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDUsICg1PDwyNCkgfCBwaHdfZGF0YS0+dHh2Z2Ffc2V0dGluZ19mb3JfY2FsKTsKKwkvKiAweDA2IDB4MDY4NDBDICA7IDAxQTEwICA7IENhbGlicmF0aW9uICg3ZCkuIFJYR0NIPTAwOyBSWEdDTD0wMTAgMDAwIChSWFZHQSkgLS0+IHRvIGJlIG9wdGltaXplZCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNiwgKDY8PDI0KXwweDA2ODM0Qyk7Ci0JLy8weDAwIDB4RkZGMUMwICA7IDNGN0M3ICA7IENhbGlicmF0aW9uICg3ZSkuIHR1cm4gb24gSVEgaW1iYWxhbmNlL1Rlc3QgbW9kZQorCS8qIDB4MDAgMHhGRkYxQzAgIDsgM0Y3QzcgIDsgQ2FsaWJyYXRpb24gKDdlKS4gdHVybiBvbiBJUSBpbWJhbGFuY2UvVGVzdCBtb2RlICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAwLCAoMDw8MjQpfDB4RkZGMUMwKTsKIAotCS8vICA7IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDdmKS4gU2VuZCB0ZXN0IHBhdHRlcm4KLQkvLwk7IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDdnKS4gU2VhcmNoIFJYR0NMIG9wdGltYWwgdmFsdWUKLQkvLwk7IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDdoKS4gQ2FjdWxhdGUgUlgtcGF0aCBJUSBpbWJhbGFuY2UgYW5kIHNldHRpbmcgUlggcGF0aCBJUSBjb21wZW5zYXRpb24gdGFibGUKKwkvKiAgOyBbQkItY2hpcF06IENhbGlicmF0aW9uICg3ZikuIFNlbmQgdGVzdCBwYXR0ZXJuICovCisJLyoJOyBbQkItY2hpcF06IENhbGlicmF0aW9uICg3ZykuIFNlYXJjaCBSWEdDTCBvcHRpbWFsIHZhbHVlICovCisJLyoJOyBbQkItY2hpcF06IENhbGlicmF0aW9uICg3aCkuIENhY3VsYXRlIFJYLXBhdGggSVEgaW1iYWxhbmNlIGFuZCBzZXR0aW5nIFJYIHBhdGggSVEgY29tcGVuc2F0aW9uIHRhYmxlICovCiAKIAlyZXN1bHQgPSBfcnhfaXFfY2FsaWJyYXRpb25fbG9vcF93aW5ib25kKHBod19kYXRhLCAxMjU4OSwgZnJlcXVlbmN5KTsKIAotCWlmIChyZXN1bHQgPiAwKQotCXsKKwlpZiAocmVzdWx0ID4gMCkgewogCQlfcmVzZXRfcnhfY2FsKHBod19kYXRhKTsKIAkJcmVzdWx0ID0gX3J4X2lxX2NhbGlicmF0aW9uX2xvb3Bfd2luYm9uZChwaHdfZGF0YSwgNzk0MywgZnJlcXVlbmN5KTsKIAotCQlpZiAocmVzdWx0ID4gMCkKLQkJeworCQlpZiAocmVzdWx0ID4gMCkgewogCQkJX3Jlc2V0X3J4X2NhbChwaHdfZGF0YSk7CiAJCQlyZXN1bHQgPSBfcnhfaXFfY2FsaWJyYXRpb25fbG9vcF93aW5ib25kKHBod19kYXRhLCA1MDExLCBmcmVxdWVuY3kpOwogCi0JCQlpZiAocmVzdWx0ID4gMCkKLQkJCXsKKwkJCWlmIChyZXN1bHQgPiAwKSB7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKiogPF9yeF9pcV9jYWxpYnJhdGlvbj4gKioqKioqKioqKioqKipcbiIpKTsKIAkJCQlQSFlfREVCVUcoKCJbQ0FMXSAqKiBSWF9JUV9DQUxJQlJBVElPTiBGQUlMVVJFICEhXG4iKSk7CiAJCQkJUEhZX0RFQlVHKCgiW0NBTF0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKQEAgLTE1NzEsMTUgKzE0MzMsMTIgQEAKIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1NCwgJnZhbCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgKiogMHg1NCA9IDB4JTA4WFxuIiwgdmFsKSk7CiAKLQlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLy8gMXN0LWN1dAotCXsKKwlpZiAocGh3X2RhdGEtPnJldmlzaW9uID09IDB4MjAwMikgLyogMXN0LWN1dCAqL3sKIAkJcnhfY2FsX3JlZ1swXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwMEYwMDApID4+IDEyKTsKIAkJcnhfY2FsX3JlZ1sxXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwMDBGMDApID4+ICA4KTsKIAkJcnhfY2FsX3JlZ1syXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwMDAwRjApID4+ICA0KTsKIAkJcnhfY2FsX3JlZ1szXSA9IF9zNF90b19zMzIoKHZhbCAmIDB4MDAwMDAwMEYpKTsKLQl9Ci0JZWxzZSAvLyAybmQtY3V0Ci0JeworCX0gZWxzZSAvKiAybmQtY3V0ICovewogCQlyeF9jYWxfcmVnWzBdID0gX3M1X3RvX3MzMigodmFsICYgMHhGODAwMDAwMCkgPj4gMjcpOwogCQlyeF9jYWxfcmVnWzFdID0gX3M2X3RvX3MzMigodmFsICYgMHgwN0UwMDAwMCkgPj4gMjEpOwogCQlyeF9jYWxfcmVnWzJdID0gX3M2X3RvX3MzMigodmFsICYgMHgwMDFGODAwMCkgPj4gMTUpOwpAQCAtMTU5NCw3ICsxNDUzLDcgQEAKIAogfQogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBwaHlfY2FsaWJyYXRpb25fd2luYm9uZChzdHJ1Y3QgaHdfZGF0YSAqcGh3X2RhdGEsIHUzMiBmcmVxdWVuY3kpCiB7CiAJdTMyICAgICByZWdfbW9kZV9jdHJsOwpAQCAtMTYwMiw3ICsxNDYxLDcgQEAKIAogCVBIWV9ERUJVRygoIltDQUxdIC0+IHBoeV9jYWxpYnJhdGlvbl93aW5ib25kKClcbiIpKTsKIAotCS8vIDIwMDQwNzAxIDEuMS4yNS4xMDAwIGtldmluCisJLyogMjAwNDA3MDEgMS4xLjI1LjEwMDAga2V2aW4gKi8KIAlod19nZXRfY3h4X3JlZyhwaHdfZGF0YSwgMHg4MCwgJm1hY19jdHJsKTsKIAlod19nZXRfY3h4X3JlZyhwaHdfZGF0YSwgMHhFNCwgJnJmX2N0cmwpOwogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDU4LCAmaXFfYWxwaGEpOwpAQCAtMTYxMCw3MiArMTQ2OSw3MSBAQAogCiAKIAlfcnhhZGNfZGNfb2Zmc2V0X2NhbmNlbGxhdGlvbl93aW5ib25kKHBod19kYXRhLCBmcmVxdWVuY3kpOwotCS8vX3R4aWRhY19kY19vZmZzZXRfY2FuY2VsbGF0aW9uX3dpbmJvbmQocGh3X2RhdGEpOwotCS8vX3R4cWRhY19kY19vZmZzZXRfY2FjZWxsYXRpb25fd2luYm9uZChwaHdfZGF0YSk7CisJLyogX3R4aWRhY19kY19vZmZzZXRfY2FuY2VsbGF0aW9uX3dpbmJvbmQocGh3X2RhdGEpOyAqLworCS8qIF90eHFkYWNfZGNfb2Zmc2V0X2NhY2VsbGF0aW9uX3dpbmJvbmQocGh3X2RhdGEpOyAqLwogCiAJX3R4X2lxX2NhbGlicmF0aW9uX3dpbmJvbmQocGh3X2RhdGEpOwogCV9yeF9pcV9jYWxpYnJhdGlvbl93aW5ib25kKHBod19kYXRhLCBmcmVxdWVuY3kpOwogCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCAmcmVnX21vZGVfY3RybCk7Ci0JcmVnX21vZGVfY3RybCAmPSB+KE1BU0tfSVFDQUxfVE9ORV9TRUx8TUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOyAvLyBzZXQgd2hlbiBmaW5pc2gKKwlyZWdfbW9kZV9jdHJsICY9IH4oTUFTS19JUUNBTF9UT05FX1NFTHxNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7IC8qIHNldCB3aGVuIGZpbmlzaCAqLwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCi0JLy8gaS4gU2V0IFJGSUMgdG8gIk5vcm1hbCBtb2RlIgorCS8qIGkuIFNldCBSRklDIHRvICJOb3JtYWwgbW9kZSIgKi8KIAlod19zZXRfY3h4X3JlZyhwaHdfZGF0YSwgMHg4MCwgbWFjX2N0cmwpOwogCWh3X3NldF9jeHhfcmVnKHBod19kYXRhLCAweEU0LCByZl9jdHJsKTsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1OCwgaXFfYWxwaGEpOwogCiAKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJcGh5X2luaXRfcmYocGh3X2RhdGEpOwogCiB9CiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIHBoeV9zZXRfcmZfZGF0YSggIHN0cnVjdCBod19kYXRhICogcEh3RGF0YSwgIHUzMiBpbmRleCwgIHUzMiB2YWx1ZSApCisvKioqKioqKioqKioqKioqKioqLwordm9pZCBwaHlfc2V0X3JmX2RhdGEoc3RydWN0IGh3X2RhdGEgKnBId0RhdGEsIHUzMiBpbmRleCwgdTMyIHZhbHVlKQogewotICAgdTMyIGx0bXA9MDsKKyAgIHUzMiBsdG1wID0gMDsKIAotICAgIHN3aXRjaCggcEh3RGF0YS0+cGh5X3R5cGUgKQotCXsKLQkJY2FzZSBSRl9NQVhJTV8yODI1OgotCQljYXNlIFJGX01BWElNX1YxOiAvLyAxMWcgV2luYm9uZCAybmQgQkIod2l0aCBQaHkgYm9hcmQgKHYxKSArIE1heGltIDMzMSkKLQkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMTggPDwgMjQpIHwgQml0UmV2ZXJzZSggdmFsdWUsIDE4ICk7Ci0JCQlicmVhazsKKyAgICBzd2l0Y2ggKHBId0RhdGEtPnBoeV90eXBlKSB7CisgICAgY2FzZSBSRl9NQVhJTV8yODI1OgorICAgIGNhc2UgUkZfTUFYSU1fVjE6IC8qIDExZyBXaW5ib25kIDJuZCBCQih3aXRoIFBoeSBib2FyZCAodjEpICsgTWF4aW0gMzMxKSAqLworICAgICAgICAgICAgbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgxOCA8PCAyNCkgfCBCaXRSZXZlcnNlKHZhbHVlLCAxOCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFJGX01BWElNXzI4Mjc6Ci0JCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDE4IDw8IDI0KSB8IEJpdFJldmVyc2UoIHZhbHVlLCAxOCApOwotCQkJYnJlYWs7CisgICAgY2FzZSBSRl9NQVhJTV8yODI3OgorICAgICAgICAgICAgbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgxOCA8PCAyNCkgfCBCaXRSZXZlcnNlKHZhbHVlLCAxOCk7CisJICAgIGJyZWFrOwogCi0JCWNhc2UgUkZfTUFYSU1fMjgyODoKLQkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMTggPDwgMjQpIHwgQml0UmV2ZXJzZSggdmFsdWUsIDE4ICk7Ci0JCQlicmVhazsKKyAgICBjYXNlIFJGX01BWElNXzI4Mjg6CisJICAgIGx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMTggPDwgMjQpIHwgQml0UmV2ZXJzZSh2YWx1ZSwgMTgpOworCSAgICBicmVhazsKIAotCQljYXNlIFJGX01BWElNXzI4Mjk6Ci0JCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDE4IDw8IDI0KSB8IEJpdFJldmVyc2UoIHZhbHVlLCAxOCApOwotCQkJYnJlYWs7CisgICAgY2FzZSBSRl9NQVhJTV8yODI5OgorCSAgICBsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDE4IDw8IDI0KSB8IEJpdFJldmVyc2UodmFsdWUsIDE4KTsKKwkgICAgYnJlYWs7CiAKLQkJY2FzZSBSRl9BSVJPSEFfMjIzMDoKLQkJY2FzZSBSRl9BSVJPSEFfMjIzMFM6IC8vIDIwMDYwNDIwIEFkZCB0aGlzCi0JCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoIHZhbHVlLCAyMCApOwotCQkJYnJlYWs7CisgICAgY2FzZSBSRl9BSVJPSEFfMjIzMDoKKyAgICBjYXNlIFJGX0FJUk9IQV8yMjMwUzogLyogMjAwNjA0MjAgQWRkIHRoaXMgKi8KKwkgICAgbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKHZhbHVlLCAyMCk7CisJICAgIGJyZWFrOwogCi0JCWNhc2UgUkZfQUlST0hBXzcyMzA6Ci0JCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8ICh2YWx1ZSYweGZmZmZmZik7Ci0JCQlicmVhazsKKyAgICBjYXNlIFJGX0FJUk9IQV83MjMwOgorCSAgICBsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8ICh2YWx1ZSYweGZmZmZmZik7CisJICAgIGJyZWFrOwogCi0JCWNhc2UgUkZfV0JfMjQyOgotCQljYXNlIFJGX1dCXzI0Ml8xOiAvLyAyMDA2MDYxOS41IEFkZAotCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCB2YWx1ZSwgMjQgKTsKLQkJCWJyZWFrOwotCX0KKyAgICBjYXNlIFJGX1dCXzI0MjoKKyAgICBjYXNlIFJGX1dCXzI0Ml8xOi8qIDIwMDYwNjE5LjUgQWRkICovCisJICAgIGx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSh2YWx1ZSwgMjQpOworCSAgICBicmVhazsKKyAgICB9CiAKLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CisJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgwODY0LCBsdG1wKTsKIH0KIAotLy8gMjAwNjA3MTcgbW9kaWZ5IGFzIEJydWNlJ3MgbWFpbAorLyogMjAwNjA3MTcgbW9kaWZ5IGFzIEJydWNlJ3MgbWFpbCAqLwogdW5zaWduZWQgY2hhciBhZGp1c3RfVFhWR0FfZm9yX2lxX21hZyhzdHJ1Y3QgaHdfZGF0YSAqcGh3X2RhdGEpCiB7CiAJaW50IGluaXRfdHh2Z2EgPSAwOwpAQCAtMTY4NSwyNiArMTU0MywyNyBAQAogCXMzMiAgICAgaXFjYWxfdG9uZV9xMDsKIAl1MzIgICAgIHNxc3VtOwogCXMzMiAgICAgaXFfbWFnXzBfdHg7Ci0JdTgJCXJlZ19zdGF0ZTsKLQlpbnQJCWN1cnJlbnRfdHh2Z2E7CisJdTgJcmVnX3N0YXRlOworCWludAljdXJyZW50X3R4dmdhOwogCiAKIAlyZWdfc3RhdGUgPSAwOwotCWZvciggaW5pdF90eHZnYT0wOyBpbml0X3R4dmdhPDEwOyBpbml0X3R4dmdhKyspCi0JewotCQljdXJyZW50X3R4dmdhID0gKCAweDI0QzQwQXwoaW5pdF90eHZnYTw8NikgKTsKLQkJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA1LCAoKDU8PDI0KXxjdXJyZW50X3R4dmdhKSApOworCWZvciAoaW5pdF90eHZnYSA9IDA7IGluaXRfdHh2Z2EgPCAxMDsgaW5pdF90eHZnYSsrKSB7CisJCWN1cnJlbnRfdHh2Z2EgPSAoMHgyNEM0MEF8KGluaXRfdHh2Z2E8PDYpKTsKKwkJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA1LCAoKDU8PDI0KXxjdXJyZW50X3R4dmdhKSk7CiAJCXBod19kYXRhLT50eHZnYV9zZXR0aW5nX2Zvcl9jYWwgPSBjdXJyZW50X3R4dmdhOwogCi0JCW1zbGVlcCgzMCk7IC8vIDIwMDYwNjEyLjEuYQorCQltc2xlZXAoMzApOy8qIDIwMDYwNjEyLjEuYSAqLwogCi0JCWlmKCAhaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsICZyZWdfbW9kZV9jdHJsKSApIC8vIDIwMDYwNzE4LjEgbW9kaWZ5CisJCWlmICghaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsICZyZWdfbW9kZV9jdHJsKSkvKiAyMDA2MDcxOC4xIG1vZGlmeSAqLwogCQkJcmV0dXJuIGZhbHNlOwogCiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAocmVhZCkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKIAotCQkvLyBhLiBTZXQgaXFjYWxfbW9kZVsxOjBdIHRvIDB4MiBhbmQgc2V0ICJjYWxpYl9zdGFydCIgdG8gMHgxIHRvCi0JCS8vICAgIGVuYWJsZSAiSVEgYWxpYnJhdGlvbiBNb2RlIElJIgorCQkvKgorCQkgKiBhLiBTZXQgaXFjYWxfbW9kZVsxOjBdIHRvIDB4MiBhbmQgc2V0ICJjYWxpYl9zdGFydCIgdG8gMHgxIHRvCisJCSAqICAgIGVuYWJsZSAiSVEgYWxpYnJhdGlvbiBNb2RlIElJIgorCQkgKi8KIAkJcmVnX21vZGVfY3RybCAmPSB+KE1BU0tfSVFDQUxfVE9ORV9TRUx8TUFTS19JUUNBTF9NT0RFKTsKIAkJcmVnX21vZGVfY3RybCAmPSB+TUFTS19JUUNBTF9NT0RFOwogCQlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDB4MDIpOwpAQCAtMTcxMiwxNSArMTU3MSwxNSBAQAogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiAKLQkJdWRlbGF5KDEpOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDEpOy8qIDIwMDYwNjEyLjEuYSAqLwogCi0JCXVkZWxheSgzMDApOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDMwMCk7LyogMjAwNjA2MTIuMS5hICovCiAKLQkJLy8gYi4KKwkJLyogYi4gKi8KIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDEgPSAweCUwOFhcbiIsIHZhbCkpOwotCQl1ZGVsYXkoMzAwKTsgLy8gMjAwNjA2MTIuMS5hCisJCXVkZWxheSgzMDApOy8qIDIwMDYwNjEyLjEuYSAqLwogCiAJCWlxY2FsX3RvbmVfaTAgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJaXFjYWxfdG9uZV9xMCA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC0xNzMxLDIzICsxNTkwLDE4IEBACiAJCWlxX21hZ18wX3R4ID0gKHMzMikgX3NxcnQoc3FzdW0pOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICAqKiBhdXRvX2FkanVzdF90eHZnYV9mb3JfaXFfbWFnXzBfdHg9JWRcbiIsIGlxX21hZ18wX3R4KSk7CiAKLQkJaWYoIGlxX21hZ18wX3R4Pj03MDAgJiYgaXFfbWFnXzBfdHg8PTE3NTAgKQorCQlpZiAoaXFfbWFnXzBfdHggPj0gNzAwICYmIGlxX21hZ18wX3R4IDw9IDE3NTApCiAJCQlicmVhazsKLQkJZWxzZSBpZihpcV9tYWdfMF90eCA+IDE3NTApCi0JCXsKLQkJCWluaXRfdHh2Z2E9LTI7CisJCWVsc2UgaWYgKGlxX21hZ18wX3R4ID4gMTc1MCkgeworCQkJaW5pdF90eHZnYSA9IC0yOwogCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCWNvbnRpbnVlOwogCiAJfQogCi0JaWYoIGlxX21hZ18wX3R4Pj03MDAgJiYgaXFfbWFnXzBfdHg8PTE3NTAgKQorCWlmIChpcV9tYWdfMF90eCA+PSA3MDAgJiYgaXFfbWFnXzBfdHggPD0gMTc1MCkKIAkJcmV0dXJuIHRydWU7CiAJZWxzZQogCQlyZXR1cm4gZmFsc2U7CiB9Ci0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCmluZGV4IGQ5YTgxMjguLjk5MGY5ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCkBAIC05NjYsNDIgKzk2Niw0MiBAQAogCXN3aXRjaCAocEh3RGF0YS0+cGh5X3R5cGUpIHsKIAljYXNlIFJGX01BWElNXzI4MjU6CiAJY2FzZSBSRl9NQVhJTV9WMTogLyogMTFnIFdpbmJvbmQgMm5kIEJCKHdpdGggUGh5IGJvYXJkICh2MSkgKyBNYXhpbSAzMzEpICovCi0JCW51bWJlciA9IHNpemVvZihtYXgyODI1X3JmX2RhdGEpIC8gc2l6ZW9mKG1heDI4MjVfcmZfZGF0YVswXSk7CisJCW51bWJlciA9IEFSUkFZX1NJWkUobWF4MjgyNV9yZl9kYXRhKTsKIAkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CiAJCQlwSHdEYXRhLT5waHlfcGFyYVtpXSA9IG1heDI4MjVfcmZfZGF0YVtpXTsgLyogQmFja3VwIFJmIHBhcmFtZXRlciAqLwogCQkJcGx0bXBbaV0gPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMTggPDwgMjQpIHwgQml0UmV2ZXJzZShtYXgyODI1X3JmX2RhdGFbaV0sIDE4KTsKIAkJfQogCQlicmVhazsKIAljYXNlIFJGX01BWElNXzI4Mjc6Ci0JCW51bWJlciA9IHNpemVvZihtYXgyODI3X3JmX2RhdGEpIC8gc2l6ZW9mKG1heDI4MjdfcmZfZGF0YVswXSk7CisJCW51bWJlciA9IEFSUkFZX1NJWkUobWF4MjgyN19yZl9kYXRhKTsKIAkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CiAJCQlwSHdEYXRhLT5waHlfcGFyYVtpXSA9IG1heDI4MjdfcmZfZGF0YVtpXTsKIAkJCXBsdG1wW2ldID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDE4IDw8IDI0KSB8IEJpdFJldmVyc2UobWF4MjgyN19yZl9kYXRhW2ldLCAxOCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBSRl9NQVhJTV8yODI4OgotCQludW1iZXIgPSBzaXplb2YobWF4MjgyOF9yZl9kYXRhKSAvIHNpemVvZihtYXgyODI4X3JmX2RhdGFbMF0pOworCQludW1iZXIgPSBBUlJBWV9TSVpFKG1heDI4MjhfcmZfZGF0YSk7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQkJcEh3RGF0YS0+cGh5X3BhcmFbaV0gPSBtYXgyODI4X3JmX2RhdGFbaV07CiAJCQlwbHRtcFtpXSA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgxOCA8PCAyNCkgfCBCaXRSZXZlcnNlKG1heDI4MjhfcmZfZGF0YVtpXSwgMTgpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkZfTUFYSU1fMjgyOToKLQkJbnVtYmVyID0gc2l6ZW9mKG1heDI4MjlfcmZfZGF0YSkgLyBzaXplb2YobWF4MjgyOV9yZl9kYXRhWzBdKTsKKwkJbnVtYmVyID0gQVJSQVlfU0laRShtYXgyODI5X3JmX2RhdGEpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJCXBId0RhdGEtPnBoeV9wYXJhW2ldID0gbWF4MjgyOV9yZl9kYXRhW2ldOwogCQkJcGx0bXBbaV0gPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMTggPDwgMjQpIHwgQml0UmV2ZXJzZShtYXgyODI5X3JmX2RhdGFbaV0sIDE4KTsKIAkJfQogCQlicmVhazsKIAljYXNlIFJGX0FJUk9IQV8yMjMwOgotCQludW1iZXIgPSBzaXplb2YoYWwyMjMwX3JmX2RhdGEpIC8gc2l6ZW9mKGFsMjIzMF9yZl9kYXRhWzBdKTsKKwkJbnVtYmVyID0gQVJSQVlfU0laRShhbDIyMzBfcmZfZGF0YSk7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQkJcEh3RGF0YS0+cGh5X3BhcmFbaV0gPSBhbDIyMzBfcmZfZGF0YVtpXTsKIAkJCXBsdG1wW2ldID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoYWwyMjMwX3JmX2RhdGFbaV0sIDIwKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFJGX0FJUk9IQV8yMjMwUzoKLQkJbnVtYmVyID0gc2l6ZW9mKGFsMjIzMHNfcmZfZGF0YSkgLyBzaXplb2YoYWwyMjMwc19yZl9kYXRhWzBdKTsKKwkJbnVtYmVyID0gQVJSQVlfU0laRShhbDIyMzBzX3JmX2RhdGEpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJCXBId0RhdGEtPnBoeV9wYXJhW2ldID0gYWwyMjMwc19yZl9kYXRhW2ldOwogCQkJcGx0bXBbaV0gPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZShhbDIyMzBzX3JmX2RhdGFbaV0sIDIwKTsKQEAgLTEwMTMsMTIgKzEwMTMsMTIgQEAKIAkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwogCQlwcmludGsoIiogUExMX09OICAgIGxvd1xuIik7CiAJCSNlbmRpZgotCQludW1iZXIgPSBzaXplb2YoYWw3MjMwX3JmX2RhdGFfMjQpIC8gc2l6ZW9mKGFsNzIzMF9yZl9kYXRhXzI0WzBdKTsKKwkJbnVtYmVyID0gQVJSQVlfU0laRShhbDcyMzBfcmZfZGF0YV8yNCk7CiAJCVNldF9DaGFuSW5kZXBfUmZEYXRhX2FsNzIzMF8yNChwSHdEYXRhLCBwbHRtcCwgbnVtYmVyKTsKIAkJYnJlYWs7CiAJY2FzZSBSRl9XQl8yNDI6CiAJY2FzZSBSRl9XQl8yNDJfMToKLQkJbnVtYmVyID0gc2l6ZW9mKHc4OXJmMjQyX3JmX2RhdGEpIC8gc2l6ZW9mKHc4OXJmMjQyX3JmX2RhdGFbMF0pOworCQludW1iZXIgPSBBUlJBWV9TSVpFKHc4OXJmMjQyX3JmX2RhdGEpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJCWx0bXAgPSB3ODlyZjI0Ml9yZl9kYXRhW2ldOwogCQkJaWYgKGkgPT0gNCkgeyAvKiBVcGRhdGUgdGhlIFZDTyB0cmltIGZyb20gRUVQUk9NICovCkBAIC0xMTE5LDcgKzExMTksNyBAQAogCQlwcmludGsoIiogUExMX09OICAgIGxvd1xuIik7CiAJCSNlbmRpZgogCi0JCW51bWJlciA9IHNpemVvZihhbDcyMzBfcmZfZGF0YV81MCkgLyBzaXplb2YoYWw3MjMwX3JmX2RhdGFfNTBbMF0pOworCQludW1iZXIgPSBBUlJBWV9TSVpFKGFsNzIzMF9yZl9kYXRhXzUwKTsKIAkJU2V0X0NoYW5JbmRlcF9SZkRhdGFfYWw3MjMwXzUwKHBId0RhdGEsIHBsdG1wLCBudW1iZXIpOwogCQkvKiBXcml0ZSB0byByZWdpc3Rlci4gbnVtYmVyIG11c3QgbGVzcyBhbmQgZXF1YWwgdGhhbiAxNiAqLwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCkBAIC0xNzQ3LDcgKzE3NDcsNyBAQAogCQkJCXBsdG1wW2ldID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDE4IDw8IDI0KSB8IEJpdFJldmVyc2UobWF4MjgyOV9jaGFubmVsX2RhdGFfMjRbQ2hhbm5lbC5DaGFuTm8tMV1baV0sIDE4KTsKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZShwSHdEYXRhLCAweDA4NjQsIHBsdG1wLCAzLCBOT19JTkNSRU1FTlQpOwogCQl9IGVsc2UgaWYgKENoYW5uZWwuYmFuZCA9PSBCQU5EX1RZUEVfT0ZETV81KSB7Ci0JCQljb3VudCA9IHNpemVvZihtYXgyODI5X2NoYW5uZWxfZGF0YV81MCkgLyBzaXplb2YobWF4MjgyOV9jaGFubmVsX2RhdGFfNTBbMF0pOworCQkJY291bnQgPSBBUlJBWV9TSVpFKG1heDI4MjlfY2hhbm5lbF9kYXRhXzUwKTsKIAogCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQlpZiAobWF4MjgyOV9jaGFubmVsX2RhdGFfNTBbaV1bMF0gPT0gQ2hhbm5lbC5DaGFuTm8pIHsKQEAgLTE3ODMsMTMgKzE3ODMsMTMgQEAKIAkJCQkvKiBVcGRhdGUgQkIgcmVnaXN0ZXIgKi8KIAkJCQlCQlByb2Nlc3Nvcl9BTDcyMzBfMjQwMChwSHdEYXRhKTsKIAotCQkJCW51bWJlciA9IHNpemVvZihhbDcyMzBfcmZfZGF0YV8yNCkgLyBzaXplb2YoYWw3MjMwX3JmX2RhdGFfMjRbMF0pOworCQkJCW51bWJlciA9IEFSUkFZX1NJWkUoYWw3MjMwX3JmX2RhdGFfMjQpOwogCQkJCVNldF9DaGFuSW5kZXBfUmZEYXRhX2FsNzIzMF8yNChwSHdEYXRhLCBwbHRtcCwgbnVtYmVyKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogVXBkYXRlIEJCIHJlZ2lzdGVyICovCiAJCQkJQkJQcm9jZXNzb3JfQUw3MjMwXzUwMDAocEh3RGF0YSk7CiAKLQkJCQludW1iZXIgPSBzaXplb2YoYWw3MjMwX3JmX2RhdGFfNTApIC8gc2l6ZW9mKGFsNzIzMF9yZl9kYXRhXzUwWzBdKTsKKwkJCQludW1iZXIgPSBBUlJBWV9TSVpFKGFsNzIzMF9yZl9kYXRhXzUwKTsKIAkJCQlTZXRfQ2hhbkluZGVwX1JmRGF0YV9hbDcyMzBfNTAocEh3RGF0YSwgcGx0bXAsIG51bWJlcik7CiAJCQl9CiAKQEAgLTE4MTQsNyArMTgxNCw3IEBACiAJCQkJV2IzNVJlZ19Xcml0ZShwSHdEYXRhLCAweDA4NjQsIGx0bXApOwogCQkJfQogCi0JCQljb3VudCA9IHNpemVvZihhbDcyMzBfY2hhbm5lbF9kYXRhXzUpIC8gc2l6ZW9mKGFsNzIzMF9jaGFubmVsX2RhdGFfNVswXSk7CisJCQljb3VudCA9IEFSUkFZX1NJWkUoYWw3MjMwX2NoYW5uZWxfZGF0YV81KTsKIAogCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQlpZiAoYWw3MjMwX2NoYW5uZWxfZGF0YV81W2ldWzBdID09IENoYW5uZWwuQ2hhbk5vKSB7CkBAIC0xOTc4LDcgKzE5NzgsNyBAQAogCXUzMglQb3dlckRhdGE7CiAJdTgJaSwgY291bnQ7CiAKLQljb3VudCA9IHNpemVvZihhbDIyMzBfdHh2Z2FfZGF0YSkgLyBzaXplb2YoYWwyMjMwX3R4dmdhX2RhdGFbMF0pOworCWNvdW50ID0gQVJSQVlfU0laRShhbDIyMzBfdHh2Z2FfZGF0YSk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaWYgKGFsMjIzMF90eHZnYV9kYXRhW2ldWzFdID49IGluZGV4KQogCQkJYnJlYWs7CkBAIC0xOTk2LDcgKzE5OTYsNyBAQAogCXUzMglQb3dlckRhdGE7CiAJdTgJaSwgY291bnQ7CiAKLQljb3VudCA9IHNpemVvZihhbDcyMzBfdHh2Z2FfZGF0YSkgLyBzaXplb2YoYWw3MjMwX3R4dmdhX2RhdGFbMF0pOworCWNvdW50ID0gQVJSQVlfU0laRShhbDcyMzBfdHh2Z2FfZGF0YSk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaWYgKGFsNzIzMF90eHZnYV9kYXRhW2ldWzFdID49IGluZGV4KQogCQkJYnJlYWs7CkBAIC0yMDEzLDcgKzIwMTMsNyBAQAogCXUzMglQb3dlckRhdGE7CiAJdTgJaSwgY291bnQ7CiAKLQljb3VudCA9IHNpemVvZih3ODlyZjI0Ml90eHZnYV9kYXRhKSAvIHNpemVvZih3ODlyZjI0Ml90eHZnYV9kYXRhWzBdKTsKKwljb3VudCA9IEFSUkFZX1NJWkUodzg5cmYyNDJfdHh2Z2FfZGF0YSk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaWYgKHc4OXJmMjQyX3R4dmdhX2RhdGFbaV1bMV0gPj0gaW5kZXgpCiAJCQlicmVhazsKQEAgLTIxODQsMTQgKzIxODQsMTQgQEAKIAkvKiBBZGp1c3QgV0JfMjQyIHRvIFdCXzI0Ml8xIFR4VmdhIHNjYWxlICovCiAJaWYgKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0MikgewogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7IC8qIE9ubHkgMjQxMiAyNDM3IDI0NjIgMjQ4NCBjYXNlIG11c3QgYmUgbW9kaWZpZWQgKi8KLQkJCWZvciAoaiA9IDA7IGogPCAoc2l6ZW9mKHc4OXJmMjQyX3R4dmdhX29sZF9tYXBwaW5nKSAvIHNpemVvZih3ODlyZjI0Ml90eHZnYV9vbGRfbWFwcGluZ1swXSkpOyBqKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHc4OXJmMjQyX3R4dmdhX29sZF9tYXBwaW5nKTsgaisrKSB7CiAJCQkJaWYgKHBjdG1wW2ldIDwgKHU4KSB3ODlyZjI0Ml90eHZnYV9vbGRfbWFwcGluZ1tqXVsxXSkgewogCQkJCQlwY3RtcFtpXSA9ICh1OCkgdzg5cmYyNDJfdHh2Z2Ffb2xkX21hcHBpbmdbal1bMF07CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKGogPT0gKHNpemVvZih3ODlyZjI0Ml90eHZnYV9vbGRfbWFwcGluZykgLyBzaXplb2Yodzg5cmYyNDJfdHh2Z2Ffb2xkX21hcHBpbmdbMF0pKSkKKwkJCWlmIChqID09IEFSUkFZX1NJWkUodzg5cmYyNDJfdHh2Z2Ffb2xkX21hcHBpbmcpKQogCQkJCXBjdG1wW2ldID0gKHU4KXc4OXJmMjQyX3R4dmdhX29sZF9tYXBwaW5nW2otMV1bMF07CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYwppbmRleCA2ODE0MTlkLi5hYmFhMDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IDIwMDggUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CiAgKgogICogRGlzdHJpYnV0ZSB1bmRlciBHUEx2Mi4KICAqCkBAIC03MDAsNyArNzAwLDcgQEAKIAlNZHNfaW5pdGlhbChwcml2KTsKIAogCS8qCi0JICogSWYgbm8gdXNlci1kZWZpbmVkIGFkZHJlc3MgaW4gdGhlIHJlZ2lzdHJ5LCB1c2UgdGhlIGFkZHJlc3NzCisJICogSWYgbm8gdXNlci1kZWZpbmVkIGFkZHJlc3MgaW4gdGhlIHJlZ2lzdHJ5LCB1c2UgdGhlIGFkZHJlc3MKIAkgKiAiYnVybmVkIiBvbiB0aGUgTklDIGluc3RlYWQuCiAJICovCiAJcE1hY0FkZHIgPSBwcml2LT5zTG9jYWxQYXJhLlRoaXNNYWNBZGRyZXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYwppbmRleCAzOTA2MjhjLi5jNGZlMGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuYwpAQCAtNTAyLDcgKzUwMiw3IEBACiAjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAogCU5VTEwJCQkJCQkJCQkvL2VuZHNlbnRpbmVsCiAgIH07Ci0jZGVmaW5lIHh4eHhfUFJJX0lERU5USVRZX09GRlNFVAkoc2l6ZW9mKHh4eHgpL3NpemVvZih4eHh4WzBdKSAtIDMpCisjZGVmaW5lIHh4eHhfUFJJX0lERU5USVRZX09GRlNFVAkoQVJSQVlfU0laRSh4eHh4KSAtIDMpCiAKICNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lEIC8gSENGX0VYVF9NQgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tZGQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oCmluZGV4IGI0NWM3ZGQuLmI1MGI3YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oCkBAIC03MjcsMTAgKzcyNywxMCBAQAogI2RlZmluZSBDRkdfRkNCRQkweEZDQkUJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PwogI2RlZmluZSBDRkdfRkNCRgkweEZDQkYJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PwogCi0jZGVmaW5lIENGR19IQU5ET1ZFUl9BRERSCQkJCTB4RkNDMAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkcnJlc3MgcmUtYXNzb2NpYXRlZCB3aXRoIG90aGVyIEFQCisjZGVmaW5lIENGR19IQU5ET1ZFUl9BRERSCQkJCTB4RkNDMAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkZHJlc3MgcmUtYXNzb2NpYXRlZCB3aXRoIG90aGVyIEFQCiAjZGVmaW5lIENGR19TQ0FOX0NIQU5ORUwJCQkJMHhGQ0MyCQkvL0NoYW5uZWwgc2V0IGZvciBob3N0IHJlcXVlc3RlZCBzY2FuCiAvLzs/I2RlZmluZSBDRkdfU0NBTl9DSEFOTkVMX01BU0sJCQkweEZDQzIJCS8vIGNvbnRhaW5zCi0jZGVmaW5lIENGR19ESVNBU1NPQ0lBVEVfQUREUgkJCTB4RkNDNAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkcnJlc3MgdG8gYmUgZGlzYXNzb2NpYXRlZAorI2RlZmluZSBDRkdfRElTQVNTT0NJQVRFX0FERFIJCQkweEZDQzQJCS8vW0FQXSBTdGF0aW9uIE1BQyBBZGRyZXNzIHRvIGJlIGRpc2Fzc29jaWF0ZWQKICNkZWZpbmUgQ0ZHX1BST0JFX0RBVEFfUkFURQkJCQkweEZDQzUJCS8vV0FSUCBjb25uZWN0aW9uIGNvbnRyb2wKICNkZWZpbmUgQ0ZHX0ZSQU1FX0JVUlNUX0xJTUlUCQkJMHhGQ0M2CQkvLwogI2RlZmluZSBDRkdfQ09FWElTVEVOU0VfQkVIQVZJT1VSCQkweEZDQzcJCS8vW0FQXQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMKaW5kZXggMTBhYmQ0MC4uMTljMzM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jCkBAIC0yMyw3ICsyMyw3IEBACiAgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCiAgKgotICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ0LDcgKzQ0LDcgQEAKICAqCiAgKiBEaXNjbGFpbWVyCiAgKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KQEAgLTgzLDcgKzgzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CkBAIC0xMzMsMzYgKzEzMiwzNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBpbnQgd2xfYWRhcHRlcl9hdHRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2OwotICAgIHN0cnVjdCB3bF9wcml2YXRlCSpscDsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2OworCXN0cnVjdCB3bF9wcml2YXRlICAgKmxwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2F0dGFjaCIgKTsKLSAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfRlVOQygid2xfYWRhcHRlcl9hdHRhY2giKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CiAKLSAgICBkZXYgPSB3bF9kZXZpY2VfYWxsb2MoKTsKLSAgICBpZihkZXYgPT0gTlVMTCkgewotICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9kZXZpY2VfYWxsb2MgcmV0dXJuZWQgTlVMTFxuIik7Ci0JcmV0dXJuIC1FTk9NRU07Ci0gICAgfQorCWRldiA9IHdsX2RldmljZV9hbGxvYygpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEQkdfRVJST1IoRGJnSW5mbywgIndsX2RldmljZV9hbGxvYyByZXR1cm5lZCBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0gICAgbGluay0+aW8uTnVtUG9ydHMxICAgICAgPSBIQ0ZfTlVNX0lPX1BPUlRTOwotICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxICAgID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotICAgIGxpbmstPmlvLklPQWRkckxpbmVzICAgID0gNjsKLSAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgICA9IENPTkZfRU5BQkxFX0lSUTsKLSAgICBsaW5rLT5jb25mLkludFR5cGUgICAgICA9IElOVF9NRU1PUllfQU5EX0lPOwotICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggID0gNTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgICAgICA9IFBSRVNFTlRfT1BUSU9OOworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgID0gSENGX05VTV9JT19QT1JUUzsKKwlsaW5rLT5yZXNvdXJjZVswXS0+ZmxhZ3M9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgICA9IENPTkZfRU5BQkxFX0lSUTsKKwlsaW5rLT5jb25mLkludFR5cGUgICAgICA9IElOVF9NRU1PUllfQU5EX0lPOworCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggID0gNTsKKwlsaW5rLT5jb25mLlByZXNlbnQgICAgICA9IFBSRVNFTlRfT1BUSU9OOwogCi0gICAgbGluay0+cHJpdiA9IGRldjsKLSAgICBscCA9IHdsX3ByaXYoZGV2KTsKLSAgICBscC0+bGluayA9IGxpbms7CisJbGluay0+cHJpdiA9IGRldjsKKwlscCA9IHdsX3ByaXYoZGV2KTsKKwlscC0+bGluayA9IGxpbms7CiAKLSAgICB3bF9hZGFwdGVyX2luc2VydChsaW5rKTsKKwl3bF9hZGFwdGVyX2luc2VydChsaW5rKTsKIAotICAgIERCR19MRUFWRSggRGJnSW5mbyApOwotICAgIHJldHVybiAwOwotfSAvLyB3bF9hZGFwdGVyX2F0dGFjaAorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gMDsKK30gLyogd2xfYWRhcHRlcl9hdHRhY2ggKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIApAQCAtMTkwLDI1ICsxODgsMjQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCB3bF9hZGFwdGVyX2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBsaW5rLT5wcml2OwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBsaW5rLT5wcml2OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisJREJHX0ZVTkMoIndsX2FkYXB0ZXJfZGV0YWNoIik7CisJREJHX0VOVEVSKERiZ0luZm8pOworCURCR19QQVJBTShEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayk7CiAKLSAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfZGV0YWNoIiApOwotICAgIERCR19FTlRFUiggRGJnSW5mbyApOwotICAgIERCR19QQVJBTSggRGJnSW5mbywgImxpbmsiLCAiMHglcCIsIGxpbmsgKTsKKwl3bF9hZGFwdGVyX3JlbGVhc2UobGluayk7CiAKLSAgICB3bF9hZGFwdGVyX3JlbGVhc2UobGluayk7CisJaWYgKGRldikgeworCQl1bnJlZ2lzdGVyX3dsYWdzX3N5c2ZzKGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJfQogCi0gICAgaWYgKGRldikgewotCXVucmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoZGV2KTsKLQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotICAgIH0KKwl3bF9kZXZpY2VfZGVhbGxvYyhkZXYpOwogCi0gICAgd2xfZGV2aWNlX2RlYWxsb2MoZGV2KTsKLQotICAgIERCR19MRUFWRSggRGJnSW5mbyApOwotfSAvLyB3bF9hZGFwdGVyX2RldGFjaAorCURCR19MRUFWRShEYmdJbmZvKTsKK30gLyogd2xfYWRhcHRlcl9kZXRhY2ggKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIApAQCAtMjMyLDMzICsyMjksMzMgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfYWRhcHRlcl9yZWxlYXNlKCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayApCit2b2lkIHdsX2FkYXB0ZXJfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLSAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfcmVsZWFzZSIgKTsKLSAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rKTsKKwlEQkdfRlVOQygid2xfYWRhcHRlcl9yZWxlYXNlIik7CisJREJHX0VOVEVSKERiZ0luZm8pOworCURCR19QQVJBTShEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayk7CiAKLSAgICAvKiBTdG9wIGhhcmR3YXJlICovCi0gICAgd2xfcmVtb3ZlKGxpbmstPnByaXYpOworCS8qIFN0b3AgaGFyZHdhcmUgKi8KKwl3bF9yZW1vdmUobGluay0+cHJpdik7CiAKLSAgICBwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CisJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwogCi0gICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Ci19IC8vIHdsX2FkYXB0ZXJfcmVsZWFzZQorCURCR19MRUFWRShEYmdJbmZvKTsKK30gLyogd2xfYWRhcHRlcl9yZWxlYXNlICovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdGF0aWMgaW50IHdsX2FkYXB0ZXJfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKIAotICAgIC8vaWYgKGxpbmstPm9wZW4pIHsKKwkvKiBpZiAobGluay0+b3BlbikgeyAqLwogCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKIAl3bF9zdXNwZW5kKGRldik7Ci0vLy8vIENIRUNLISAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLSAgICAvL30KKwkvKiBDSEVDSyEgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOyAqLworCS8qIH0gKi8KIAotICAgIHJldHVybiAwOwotfSAvLyB3bF9hZGFwdGVyX3N1c3BlbmQKKwlyZXR1cm4gMDsKK30gLyogd2xfYWRhcHRlcl9zdXNwZW5kICovCiAKIHN0YXRpYyBpbnQgd2xfYWRhcHRlcl9yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CkBAIC0yNjYsMTAgKzI2MywxMCBAQAogCiAJd2xfcmVzdW1lKGRldik7CiAKLQluZXRpZl9kZXZpY2VfYXR0YWNoKCBkZXYgKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAKIAlyZXR1cm4gMDsKLX0gLy8gd2xfYWRhcHRlcl9yZXN1bWUKK30gLyogd2xfYWRhcHRlcl9yZXN1bWUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCXdsX2FkYXB0ZXJfaW5zZXJ0KCkKQEAgLTI5MSw2MCArMjg4LDYwIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX2FkYXB0ZXJfaW5zZXJ0KCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayApCit2b2lkIHdsX2FkYXB0ZXJfaW5zZXJ0KHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7Ci0gICAgaW50IGk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmV0OwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCWludCByZXQ7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5zZXJ0IiApOwotICAgIERCR19FTlRFUiggRGJnSW5mbyApOwotICAgIERCR19QQVJBTSggRGJnSW5mbywgImxpbmsiLCAiMHglcCIsIGxpbmsgKTsKKwlEQkdfRlVOQygid2xfYWRhcHRlcl9pbnNlcnQiKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisJREJHX1BBUkFNKERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rKTsKIAotICAgIGRldiAgICAgPSBsaW5rLT5wcml2OworCWRldiAgICAgPSBsaW5rLT5wcml2OwogCi0gICAgLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0gICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKwkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCWxpbmstPmlvX2xpbmVzID0gNjsKIAotICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0gICAgaWYgKHJldCAhPSAwKQotICAgICAgICBnb3RvIGZhaWxlZDsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZmFpbGVkOwogCi0gICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICh2b2lkICopIHdsX2lzcik7Ci0gICAgaWYgKHJldCAhPSAwKQotICAgICAgICBnb3RvIGZhaWxlZDsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgKHZvaWQgKikgd2xfaXNyKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZmFpbGVkOwogCi0gICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZik7Ci0gICAgaWYgKHJldCAhPSAwKQotICAgICAgICBnb3RvIGZhaWxlZDsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZmFpbGVkOwogCi0gICAgZGV2LT5pcnEgICAgICAgID0gbGluay0+aXJxOwotICAgIGRldi0+YmFzZV9hZGRyICA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlkZXYtPmlycSAgICAgICAgPSBsaW5rLT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCi0gICAgU0VUX05FVERFVl9ERVYoZGV2LCAmbGluay0+ZGV2KTsKLSAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgewotCXByaW50aygiJXM6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIiwgTU9EVUxFX05BTUUpOwotCWdvdG8gZmFpbGVkOwotICAgIH0KKwlTRVRfTkVUREVWX0RFVihkZXYsICZsaW5rLT5kZXYpOworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJCXByaW50aygiJXM6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIiwgTU9EVUxFX05BTUUpOworCQlnb3RvIGZhaWxlZDsKKwl9CiAKLSAgICByZWdpc3Rlcl93bGFnc19zeXNmcyhkZXYpOworCXJlZ2lzdGVyX3dsYWdzX3N5c2ZzKGRldik7CiAKLSAgICBwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MsIGlvX2FkZHIgJSMwM2x4LCBpcnEgJWQsICIibWFjX2FkZHJlc3MgIiwKLSAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKLSAgICBmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKLSAgICAgICAgcHJpbnRrKCIlMDJYJWMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGkgPCAoRVRIX0FMRU4tMSkpID8gJzonIDogJ1xuJykpOwotICAgIH0KKwlwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MsIGlvX2FkZHIgJSMwM2x4LCBpcnEgJWQsICIibWFjX2FkZHJlc3MgIiwKKwkJZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlwcmludGsoIiUwMlglYyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaSA8IChFVEhfQUxFTi0xKSkgPyAnOicgOiAnXG4nKSk7CiAKLSAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKLSAgICByZXR1cm47CisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybjsKIAogZmFpbGVkOgotICAgIHdsX2FkYXB0ZXJfcmVsZWFzZSggbGluayApOworCXdsX2FkYXB0ZXJfcmVsZWFzZShsaW5rKTsKIAotICAgIERCR19MRUFWRShEYmdJbmZvKTsKLSAgICByZXR1cm47Ci19IC8vIHdsX2FkYXB0ZXJfaW5zZXJ0CisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybjsKK30gLyogd2xfYWRhcHRlcl9pbnNlcnQgKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIApAQCAtMzY3LDM4ICszNjQsMzYgQEAKICAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9hZGFwdGVyX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2FkYXB0ZXJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGxwLT5saW5rOwotICAgIGludCAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgaW50ICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBscC0+bGluazsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisJREJHX0ZVTkMoIndsX2FkYXB0ZXJfb3BlbiIpOworCURCR19FTlRFUihEYmdJbmZvKTsKKwlEQkdfUFJJTlQoIiVzXG4iLCBWRVJTSU9OX0lORk8pOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKIAotICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9vcGVuIiApOwotICAgIERCR19FTlRFUiggRGJnSW5mbyApOwotCURCR19QUklOVCggIiVzXG4iLCBWRVJTSU9OX0lORk8gKTsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKwlpZiAoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkgeworCQlEQkdfTEVBVkUoRGJnSW5mbyk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAotICAgIGlmKCFwY21jaWFfZGV2X3ByZXNlbnQobGluaykpCi0gICAgewotICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQorCWxpbmstPm9wZW4rKzsKIAotICAgIGxpbmstPm9wZW4rKzsKKwloY2Zfc3RhdHVzID0gd2xfb3BlbihkZXYpOwogCi0gICAgaGNmX3N0YXR1cyA9IHdsX29wZW4oIGRldiApOworCWlmIChoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTKSB7CisJCWxpbmstPm9wZW4tLTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwl9CiAKLSAgICBpZiggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKLSAgICAgICAgbGluay0+b3Blbi0tOwotICAgICAgICByZXN1bHQgPSAtRU5PREVWOwotICAgIH0KLQotICAgIERCR19MRUFWRSggRGJnSW5mbyApOwotICAgIHJldHVybiByZXN1bHQ7Ci19IC8vIHdsX2FkYXB0ZXJfb3BlbgorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvKiB3bF9hZGFwdGVyX29wZW4gKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIApAQCAtNDIxLDU2ICs0MTYsNTUgQEAKICAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9hZGFwdGVyX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF9hZGFwdGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGxwLT5saW5rOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisJREJHX0ZVTkMoIndsX2FkYXB0ZXJfY2xvc2UiKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2Nsb3NlIiApOwotICAgIERCR19FTlRFUiggRGJnSW5mbyApOwotICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCWlmIChsaW5rID09IE5VTEwpIHsKKwkJREJHX0xFQVZFKERiZ0luZm8pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKLSAgICBpZiggbGluayA9PSBOVUxMICkgewotICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQorCURCR19UUkFDRShEYmdJbmZvLCAiJXM6IFNodXR0aW5nIGRvd24gYWRhcHRlci5cbiIsIGRldi0+bmFtZSk7CisJd2xfY2xvc2UoZGV2KTsKIAotICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiBTaHV0dGluZyBkb3duIGFkYXB0ZXIuXG4iLCBkZXYtPm5hbWUgKTsKLSAgICB3bF9jbG9zZSggZGV2ICk7CisJbGluay0+b3Blbi0tOwogCi0gICAgbGluay0+b3Blbi0tOwotCi0gICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Ci0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2FkYXB0ZXJfY2xvc2UKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIDA7Cit9IC8qIHdsX2FkYXB0ZXJfY2xvc2UgKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB3bF9hZGFwdGVyX2lkc1tdID0gewotI2lmICEgKChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1KQorI2lmICEoKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUpCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDMpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBZ2VyZSBTeXN0ZW1zIiwgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIsCi0JCQkgICAgMHgzMzEwM2E5YiwgMHhlMTc1YjBkZCksCisJCQkJMHgzMzEwM2E5YiwgMHhlMTc1YjBkZCksCiAjZWxzZQogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDA0KSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGlua3N5cyIsICJXQ0Y1NEdfV2lyZWxlc3MtR19Db21wYWN0Rmxhc2hfQ2FyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzMzY2M4MSwgMHg5OGE1OTllMSksCi0jZW5kaWYgIC8vIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1CisJCQkJMHgwNzMzY2M4MSwgMHg5OGE1OTllMSksCisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICovCiAJUENNQ0lBX0RFVklDRV9OVUxMLAotCX07Cit9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHdsX2FkYXB0ZXJfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdsYWdzNDlfZHJpdmVyID0gewotICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAotICAgIC5kcnYgICAgICAgICAgICA9IHsKLQkubmFtZSAgID0gRFJJVkVSX05BTUUsCi0gICAgfSwKLSAgICAucHJvYmUJPSB3bF9hZGFwdGVyX2F0dGFjaCwKLSAgICAucmVtb3ZlCT0gd2xfYWRhcHRlcl9kZXRhY2gsCi0gICAgLmlkX3RhYmxlCT0gd2xfYWRhcHRlcl9pZHMsCi0gICAgLnN1c3BlbmQJPSB3bF9hZGFwdGVyX3N1c3BlbmQsCi0gICAgLnJlc3VtZQk9IHdsX2FkYXB0ZXJfcmVzdW1lLAorCS5vd25lcgkgICAgPSBUSElTX01PRFVMRSwKKwkuZHJ2CSAgICA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9LAorCS5wcm9iZQkgICAgPSB3bF9hZGFwdGVyX2F0dGFjaCwKKwkucmVtb3ZlCSAgICA9IHdsX2FkYXB0ZXJfZGV0YWNoLAorCS5pZF90YWJsZSAgID0gd2xfYWRhcHRlcl9pZHMsCisJLnN1c3BlbmQgICAgPSB3bF9hZGFwdGVyX3N1c3BlbmQsCisJLnJlc3VtZQkgICAgPSB3bF9hZGFwdGVyX3Jlc3VtZSwKIH07CiAKIApAQCAtNDkzLDIxICs0ODcsMjAgQEAKICAqICAgICAgLTEgb24gZXJyb3IKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKQoraW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUodm9pZCkKIHsKLSAgICBpbnQgcmV0OwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpbnQgcmV0OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisJREJHX0ZVTkMoIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUiKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisJREJHX1RSQUNFKERiZ0luZm8sICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkgLS0gUENNQ0lBXG4iKTsKIAotICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSIgKTsKLSAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKLSAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkgLS0gUENNQ0lBXG4iICk7CisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmd2xhZ3M0OV9kcml2ZXIpOwogCi0gICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmd2xhZ3M0OV9kcml2ZXIpOwotCi0gICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Ci0gICAgcmV0dXJuIHJldDsKLX0gLy8gd2xfYWRhcHRlcl9pbml0X21vZHVsZQorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gcmV0OworfSAvKiB3bF9hZGFwdGVyX2luaXRfbW9kdWxlICovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAKQEAgLTUyOCwxOCArNTIxLDE4IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoIHZvaWQgKQordm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0gICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIiApOwotICAgIERCR19FTlRFUiggRGJnSW5mbyApOwotICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKSAtLSBQQ01DSUFcbiIgKTsKKwlEQkdfRlVOQygid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSIpOworCURCR19FTlRFUihEYmdJbmZvKTsKKwlEQkdfVFJBQ0UoRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKSAtLSBQQ01DSUFcbiIpOwogCiAKLSAgICBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsYWdzNDlfZHJpdmVyKTsKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsYWdzNDlfZHJpdmVyKTsKIAotICAgIERCR19MRUFWRSggRGJnSW5mbyApOwotICAgIHJldHVybjsKLX0gLy8gd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZQorCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm47Cit9IC8qIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUgKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIApAQCAtNTYyLDE3ICs1NTUsMTYgQEAKICAqICAgICAgMCBvdGhlcndpc2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2FkYXB0ZXJfaXNfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfYWRhcHRlcl9pc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CiAKLSAgICBpZighcGNtY2lhX2Rldl9wcmVzZW50KGxpbmspKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlpZiAoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkKKwkJcmV0dXJuIDA7CiAKLSAgICByZXR1cm4oIGxpbmstPm9wZW4gKTsKLX0gLy8gd2xfYWRhcHRlcl9pc19vcGVuCisJcmV0dXJuIGxpbmstPm9wZW47Cit9IC8qIHdsX2FkYXB0ZXJfaXNfb3BlbiAqLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogCkBAIC01OTYsOTcgKzU4OCw5NSBAQAogICogICAgICBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IocykKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciogRGJnRXZlbnQoIGludCBtYXNrICkKK2NvbnN0IGNoYXIgKkRiZ0V2ZW50KGludCBtYXNrKQogewotICAgIHN0YXRpYyBjaGFyIERiZ0J1ZmZlclsyNTZdOwotICAgIGNoYXIgKnBCdWY7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXN0YXRpYyBjaGFyIERiZ0J1ZmZlclsyNTZdOworCWNoYXIgKnBCdWY7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlwQnVmICAgID0gRGJnQnVmZmVyOworCSpwQnVmICAgPSAnXDAnOwogCiAKLSAgICBwQnVmICAgID0gRGJnQnVmZmVyOwotICAgICpwQnVmICAgPSAnXDAnOworCWlmIChtYXNrICYgQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCkKKwkJc3RyY2F0KHBCdWYsICJXUklURV9QUk9URUNUICIpOworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9DQVJEX0xPQ0spCisJCXN0cmNhdChwQnVmLCAiQ0FSRF9MT0NLICIpOworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikKKwkJc3RyY2F0KHBCdWYsICJDQVJEX0lOU0VSVElPTiAiKTsKKworCWlmIChtYXNrICYgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMKQorCQlzdHJjYXQocEJ1ZiwgIkNBUkRfUkVNT1ZBTCAiKTsKKworCWlmIChtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9ERUFEKQorCQlzdHJjYXQocEJ1ZiwgIkJBVFRFUllfREVBRCAiKTsKKworCWlmIChtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9MT1cpCisJCXN0cmNhdChwQnVmLCAiQkFUVEVSWV9MT1cgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX1JFQURZX0NIQU5HRSkKKwkJc3RyY2F0KHBCdWYsICJSRUFEWV9DSEFOR0UgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX0NBUkRfREVURUNUKQorCQlzdHJjYXQocEJ1ZiwgIkNBUkRfREVURUNUICIpOworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9SRVFVRVNUKQorCQlzdHJjYXQocEJ1ZiwgIlJFU0VUX1JFUVVFU1QgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKQorCQlzdHJjYXQocEJ1ZiwgIlJFU0VUX1BIWVNJQ0FMICIpOworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9DQVJEX1JFU0VUKQorCQlzdHJjYXQocEJ1ZiwgIkNBUkRfUkVTRVQgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSkKKwkJc3RyY2F0KHBCdWYsICJSRUdJU1RSQVRJT05fQ09NUExFVEUgIik7CisKKwkvKiBpZiAobWFzayAmIENTX0VWRU5UX1JFU0VUX0NPTVBMRVRFKQorCQlzdHJjYXQocEJ1ZiwgIlJFU0VUX0NPTVBMRVRFICIpOyAqLworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9QTV9TVVNQRU5EKQorCQlzdHJjYXQocEJ1ZiwgIlBNX1NVU1BFTkQgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX1BNX1JFU1VNRSkKKwkJc3RyY2F0KHBCdWYsICJQTV9SRVNVTUUgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX0lOU0VSVElPTl9SRVFVRVNUKQorCQlzdHJjYXQocEJ1ZiwgIklOU0VSVElPTl9SRVFVRVNUICIpOworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9FSkVDVElPTl9SRVFVRVNUKQorCQlzdHJjYXQocEJ1ZiwgIkVKRUNUSU9OX1JFUVVFU1QgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX01URF9SRVFVRVNUKQorCQlzdHJjYXQocEJ1ZiwgIk1URF9SRVFVRVNUICIpOworCisJaWYgKG1hc2sgJiBDU19FVkVOVF9FUkFTRV9DT01QTEVURSkKKwkJc3RyY2F0KHBCdWYsICJFUkFTRV9DT01QTEVURSAiKTsKKworCWlmIChtYXNrICYgQ1NfRVZFTlRfUkVRVUVTVF9BVFRFTlRJT04pCisJCXN0cmNhdChwQnVmLCAiUkVRVUVTVF9BVFRFTlRJT04gIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX0NCX0RFVEVDVCkKKwkJc3RyY2F0KHBCdWYsICJDQl9ERVRFQ1QgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UXzNWQ0FSRCkKKwkJc3RyY2F0KHBCdWYsICIzVkNBUkQgIik7CisKKwlpZiAobWFzayAmIENTX0VWRU5UX1hWQ0FSRCkKKwkJc3RyY2F0KHBCdWYsICJYVkNBUkQgIik7CiAKIAotICAgIGlmKCBtYXNrICYgQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCApCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIldSSVRFX1BST1RFQ1QgIiApOworCWlmICgqcEJ1ZikgeworCQlwQnVmW3N0cmxlbihwQnVmKSAtIDFdID0gJ1wwJzsKKwl9IGVsc2UgeworCQlpZiAobWFzayAhPSAweDApCisJCQlzcHJpbnRmKHBCdWYsICI8PDB4JTA4eD4+IiwgbWFzayk7CisJfQogCi0gICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfTE9DSykKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9MT0NLICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9JTlNFUlRJT04gIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9SRU1PVkFMICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9CQVRURVJZX0RFQUQpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIkJBVFRFUllfREVBRCAiICk7Ci0KLSAgICBpZihtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9MT1cpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIkJBVFRFUllfTE9XICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRUFEWV9DSEFOR0UpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFQURZX0NIQU5HRSAiICk7Ci0KLSAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9ERVRFQ1QpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfREVURUNUICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9SRVFVRVNUKQotICAgICAgICBzdHJjYXQoIHBCdWYsICJSRVNFVF9SRVFVRVNUICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCkKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVTRVRfUEhZU0lDQUwgIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfUkVTRVQpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfUkVTRVQgIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSkKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVHSVNUUkFUSU9OX0NPTVBMRVRFICIgKTsKLQotICAgIC8vIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9DT01QTEVURSkKLSAgICAvLyAgICAgc3RyY2F0KCBwQnVmLCAiUkVTRVRfQ09NUExFVEUgIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX1BNX1NVU1BFTkQpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIlBNX1NVU1BFTkQgIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX1BNX1JFU1VNRSkKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiUE1fUkVTVU1FICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9JTlNFUlRJT05fUkVRVUVTVCkKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiSU5TRVJUSU9OX1JFUVVFU1QgIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX0VKRUNUSU9OX1JFUVVFU1QpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIkVKRUNUSU9OX1JFUVVFU1QgIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX01URF9SRVFVRVNUKQotICAgICAgICBzdHJjYXQoIHBCdWYsICJNVERfUkVRVUVTVCAiICk7Ci0KLSAgICBpZihtYXNrICYgQ1NfRVZFTlRfRVJBU0VfQ09NUExFVEUpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIkVSQVNFX0NPTVBMRVRFICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVFVRVNUX0FUVEVOVElPTikKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVRVUVTVF9BVFRFTlRJT04gIiApOwotCi0gICAgaWYobWFzayAmIENTX0VWRU5UX0NCX0RFVEVDVCkKLSAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0JfREVURUNUICIgKTsKLQotICAgIGlmKG1hc2sgJiBDU19FVkVOVF8zVkNBUkQpCi0gICAgICAgIHN0cmNhdCggcEJ1ZiwgIjNWQ0FSRCAiICk7Ci0KLSAgICBpZihtYXNrICYgQ1NfRVZFTlRfWFZDQVJEKQotICAgICAgICBzdHJjYXQoIHBCdWYsICJYVkNBUkQgIiApOwotCi0KLSAgICBpZiggKnBCdWYgKSB7Ci0gICAgICAgIHBCdWZbc3RybGVuKHBCdWYpIC0gMV0gPSAnXDAnOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCBtYXNrICE9IDB4MCApIHsKLSAgICAgICAgICAgIHNwcmludGYoIHBCdWYsICI8PDB4JTA4eD4+IiwgbWFzayApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHBCdWY7Ci19IC8vIERiZ0V2ZW50CisJcmV0dXJuIHBCdWY7Cit9IC8qIERiZ0V2ZW50ICovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAjZW5kaWYgIC8qIERCRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmgKaW5kZXggYTliODgyOC4uMjFmMTdiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5oCkBAIC03Miw4ICs3Miw2IEBACiAKIHZvaWQgd2xfYWRhcHRlcl9yZWxlYXNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKIAotaW50IHdsX2FkYXB0ZXJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MgKTsKLQogaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKTsKIAogdm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaAppbmRleCBkOWEwYWQwLi4wMmYwYTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2ludGVybmFsLmgKQEAgLTY5LDcgKzY5LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2lmZGVmIEJVU19QQ01DSUEKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwppbmRleCAxYWE2MWRiLi5lMmE3YWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwpAQCAtMTkwNSw4ICsxOTA1LDggQEAKICAgICBEQkdfRlVOQygid2xfcngiKQogICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKIAotICAgIGlmKCgoIGxwID0gKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2ICkgIT0gTlVMTCApICYmCi0gICAgICAgICAgISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKyAgICBpZigoKCBscCA9IGRldi0+cHJpdiApICE9IE5VTEwgKSAmJgorCSEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CiAKICNpZmRlZiBVU0VfUlRTCiAgICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jCmluZGV4IDY3NTFiNGIuLjAyMGIxN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jCkBAIC0xMTcsOSArMTE3LDEzIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgd2xfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JeyBXTF9MS01fUENJX1ZFTkRPUl9JRCwgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfQWdlcmVfU3lzdGVtc19NaW5pX1BDSV9WMSB9LAotICAgIHsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKLSAgICB7IFdMX0xLTV9QQ0lfVkVORE9SX0lELCBXTF9MS01fUENJX0RFVklDRV9JRF8yLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxIH0sCisJeyBQQ0lfVkVORE9SX0lEX1dMX0xLTSwgUENJX0RFVklDRV9JRF9XTF9MS01fMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKKwl7IFBDSV9WRU5ET1JfSURfV0xfTEtNLCBQQ0lfREVWSUNFX0lEX1dMX0xLTV8xLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfQWdlcmVfU3lzdGVtc19NaW5pX1BDSV9WMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9XTF9MS00sIFBDSV9ERVZJQ0VfSURfV0xfTEtNXzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxIH0sCisKIAl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtNDY1LDcgKzQ2OSw3IEBACiAgICAgZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKIAogI2lmZGVmIEVOQUJMRV9ETUEKLSAgICB3bF9wY2lfZG1hX2ZyZWUoIHBkZXYsIChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdiApOworICAgIHdsX3BjaV9kbWFfZnJlZSggcGRldiwgZGV2LT5wcml2ICk7CiAjZW5kaWYKIAogICAgIHdsX2RldmljZV9kZWFsbG9jKCBkZXYgKTsKQEAgLTUzNCw3ICs1MzgsNyBAQAogCiAjaWZkZWYgRU5BQkxFX0RNQQogICAgIC8qIEFsbG9jYXRlIERNQSBEZXNjcmlwdG9ycyAqLwotICAgIGlmKCB3bF9wY2lfZG1hX2FsbG9jKCBwZGV2LCAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXYgKSA8IDAgKSB7CisgICAgaWYoIHdsX3BjaV9kbWFfYWxsb2MoIHBkZXYsIGRldi0+cHJpdiApIDwgMCApIHsKICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jYXRlIERNQSBkZXNjcmlwdG9yIG1lbW9yeSEhIVxuIiApOwogICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CkBAIC01NzAsNyArNTc0LDcgQEAKIAl9CiAKICAgICAvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBwcm9wZXJseSBmb3IgQ2FyZEJ1cyAqLwotICAgIGxwID0gKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2OworICAgIGxwID0gZGV2LT5wcml2OwogCiAgICAgaWYoIGxwLT5oY2ZDdHguSUZCX0J1c1R5cGUgPT0gQ0ZHX05JQ19CVVNfVFlQRV9DQVJEQlVTIHx8CiAJICAgIGxwLT5oY2ZDdHguSUZCX0J1c1R5cGUgPT0gQ0ZHX05JQ19CVVNfVFlQRV9QQ0kgCQkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmgKaW5kZXggMThkN2I1MS4uY2VhMDRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmgKQEAgLTY3LDEwICs2NywxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBjb25zdGFudCBkZWZpbml0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgV0xfTEtNX1BDSV9WRU5ET1JfSUQgICAgMHgxMUMxICAvLyBMdWNlbnQgTWljcm9lbGVjdHJvbmljcwotI2RlZmluZSBXTF9MS01fUENJX0RFVklDRV9JRF8wICAweEFCMzAgIC8vIE1pbmkgUENJCi0jZGVmaW5lIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzEgIDB4QUIzNCAgLy8gTWluaSBQQ0kKLSNkZWZpbmUgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMiAgMHhBQjExICAvLyBXQVJQIENhcmRCdXMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRFdMX0xLTSAgICAgMHgxMUMxICAvKiBMdWNlbnQgTWljcm9lbGVjdHJvbmljcyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dMX0xLTV8wICAweEFCMzAgIC8qIE1pbmkgUENJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0xfTEtNXzEgIDB4QUIzNCAgLyogTWluaSBQQ0kgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9XTF9MS01fMiAgMHhBQjExICAvKiBXQVJQIENhcmRCdXMgKi8KIAogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYwppbmRleCAyOTJkNTc5Li43YTEzMzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlEQkdfRU5URVIoRGJnSW5mbyk7CiAKIAkvKiBHZXQgdGhlIHdhdmVsYW4gc3BlY2lmaWMgaW5mbyBmb3IgdGhpcyBkZXZpY2UgKi8KLQl3dmxhbl9jb25maWcgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJd3ZsYW5fY29uZmlnID0gZGV2LT5wcml2OwogCWlmICh3dmxhbl9jb25maWcgPT0gTlVMTCkgewogCQlEQkdfRVJST1IoRGJnSW5mbywgIldhdmVsYW4gc3BlY2lmaWMgaW5mbyBzdHJ1Y3Qgbm90IHByZXNlbnQ/XG4iKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jCmluZGV4IGJiZGI5OTcuLmNlOGVkNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMKQEAgLTI1OSw0MSArMjU5LDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJaGV4ZGlnaXQyaW50KCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIERFU0NSSVBUSU9OOgotICoKLSAqICAgICAgQ29udmVydHMgYSBoZXhhZGVjaW1hbCBkaWdpdCBjaGFyYWN0ZXIgdG8gYW4gaW50ZWdlcgotICoKLSAqICBQQVJBTUVURVJTOgotICoKLSAqICAgICAgYyAgIC0gdGhlIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlcgotICoKLSAqICBSRVRVUk5TOgotICoKLSAqICAgICAgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBoZXhkaWdpdDJpbnQoIGNoYXIgYyApCi17Ci0gICBpZiggYyA+PSAnMCcgJiYgYyA8PSAnOScgKQotICAgICAgIHJldHVybiBjIC0gJzAnOwotCi0gICBpZiggYyA+PSAnQScgJiYgYyA8PSAnRicgKQotICAgICAgIHJldHVybiBjIC0gJ0EnICsgMTA7Ci0KLSAgIGlmKCBjID49ICdhJyAmJiBjIDw9ICdmJyApCi0gICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLQotICAgcmV0dXJuIDA7Ci19IC8vIGhleGRpZ2l0MmludAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCWtleV9zdHJpbmcya2V5KCkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzI4LDcgKzI5Myw3IEBACiAgICAgICAgIHAgPSAoY2hhciAqKWtleS0+a2V5OwogCiAgICAgICAgIGZvciggaSA9IDI7IGkgPCBsOyBpKz0yICkgewotICAgICAgICAgICAqcCsrID0gKCBoZXhkaWdpdDJpbnQoIGtzW2ldICkgPDwgNCApICsgaGV4ZGlnaXQyaW50IChrc1tpKzFdICk7CisJCQkqcCsrID0gKGhleF90b19iaW4oa3NbaV0pIDw8IDQpICsgaGV4X3RvX2Jpbihrc1tpKzFdKTsKICAgICAgICAgICAgbisrOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuaAppbmRleCA1NjFlODViLi5iYTUzN2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5oCkBAIC03MSw4ICs3MSw2IEBACiAKIHZvaWQga2V5X3N0cmluZzJrZXkoIGNoYXIgKmtzLCBLRVlfU1RSQ1QgKmtleSApOwogCi1pbnQgaGV4ZGlnaXQyaW50KCBjaGFyIGMgKTsKLQogdm9pZCB3bF9oY2ZfZXJyb3IoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBoY2ZTdGF0dXMgKTsKIAogdm9pZCB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCBsdHZfdCAqcEx0diApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcKaW5kZXggODJmY2MxNi4uNDI2ZDRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFBSSVNNMl9VU0IKIAl0cmlzdGF0ZSAiUHJpc20yLjUvMyBVU0IgZHJpdmVyIgotCWRlcGVuZHMgb24gV0xBTiAmJiBVU0IKKwlkZXBlbmRzIG9uIFdMQU4gJiYgVVNCICYmIENGRzgwMjExCiAJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBXRVhUX1BSSVYKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKaW5kZXggNWVkYWM1Yy4uZGI1ZDU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKQEAgLTQsNSArNCw0IEBACiAJCXA4MDIxMWNvbnYubyBcCiAJCXA4MDIxMXJlcS5vIFwKIAkJcDgwMjExd2VwLm8gXAotCQlwODAyMTF3ZXh0Lm8gXAogCQlwODAyMTFuZXRkZXYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4YzMwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKQEAgLTAsMCArMSw3NjAgQEAKKy8qIGNmZzgwMjExIEludGVyZmFjZSBmb3IgcHJpc20yX3VzYiBtb2R1bGUgKi8KKworCisvKiBQcmlzbTIgY2hhbm5lbGwvZnJlcXVlbmN5L2JpdHJhdGUgZGVjbGFyYXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHByaXNtMl9jaGFubmVsc1tdID0geworCXsgLmNlbnRlcl9mcmVxID0gMjQxMiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQxNyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQyMiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQyNyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQzMiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQzNyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ0MiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ0NyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ1MiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ1NyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2MiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2NyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ3MiB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ4NCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBwcmlzbTJfcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gMTAgfSwKKwl7IC5iaXRyYXRlID0gMjAgfSwKKwl7IC5iaXRyYXRlID0gNTUgfSwKKwl7IC5iaXRyYXRlID0gMTEwIH0KK307CisKKyNkZWZpbmUgUFJJU00yX05VTV9DSVBIRVJfU1VJVEVTIDIKK3N0YXRpYyBjb25zdCB1MzIgcHJpc20yX2NpcGhlcl9zdWl0ZXNbUFJJU00yX05VTV9DSVBIRVJfU1VJVEVTXSA9IHsKKwlXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwKKwlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQKK307CisKKworLyogcHJpc20yIGRldmljZSBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSB7CisJd2xhbmRldmljZV90ICp3bGFuZGV2OworCisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsc1tBUlJBWV9TSVpFKHByaXNtMl9jaGFubmVscyldOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSByYXRlc1tBUlJBWV9TSVpFKHByaXNtMl9yYXRlcyldOworCisJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OworfTsKKworc3RhdGljIGNvbnN0IHZvaWQgKiBjb25zdCBwcmlzbTJfd2lwaHlfcHJpdmlkID0gJnByaXNtMl93aXBoeV9wcml2aWQ7CisKKworLyogSGVscGVyIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBwcmlzbTJfcmVzdWx0MmVycihpbnQgcHJpc20yX3Jlc3VsdCkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAocHJpc20yX3Jlc3VsdCkgeworCWNhc2UgUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ludmFsaWRfcGFyYW1ldGVyczoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZToKKwkJZXJyID0gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDoKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBkaWQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0IG1zZzsKKwlwODAyMTFpdGVtX3VpbnQzMl90ICptaWJpdGVtID0gKHA4MDIxMWl0ZW1fdWludDMyX3QgKikgJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKKworCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKKwltaWJpdGVtLT5kaWQgPSBkaWQ7CisJbWliaXRlbS0+ZGF0YSA9IGRhdGE7CisKKwlyZXR1cm4gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikgJm1zZyk7Cit9CisKK3N0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3BzdHIzMih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCisJCQkJICB1MzIgZGlkLCB1OCBsZW4sIHU4ICpkYXRhKQoreworCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0IG1zZzsKKwlwODAyMTFpdGVtX3BzdHIzMl90ICptaWJpdGVtID0gKHA4MDIxMWl0ZW1fcHN0cjMyX3QgKikgJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKKworCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKKwltaWJpdGVtLT5kaWQgPSBkaWQ7CisJbWliaXRlbS0+ZGF0YS5sZW4gPSBsZW47CisJbWVtY3B5KG1pYml0ZW0tPmRhdGEuZGF0YSwgZGF0YSwgbGVuKTsKKworCXJldHVybiBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKK30KKworCisvKiBUaGUgaW50ZXJmYWNlIGZ1bmN0aW9ucywgY2FsbGVkIGJ5IHRoZSBjZmc4MDIxMSBsYXllciAqLworaW50IHByaXNtMl9jaGFuZ2VfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCisJCQkgICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKK3sKKwl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJdTMyIGRhdGE7CisJaW50IHJlc3VsdDsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWlmICh3bGFuZGV2LT5tYWNtb2RlID09IFdMQU5fTUFDTU9ERV9JQlNTX1NUQSkKKwkJCWdvdG8gZXhpdDsKKwkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9JQlNTX1NUQTsKKwkJZGF0YSA9IDA7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJaWYgKHdsYW5kZXYtPm1hY21vZGUgPT0gV0xBTl9NQUNNT0RFX0VTU19TVEEpCisJCQlnb3RvIGV4aXQ7CisJCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfRVNTX1NUQTsKKwkJZGF0YSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9wZXJhdGlvbiBtb2RlOiAlZCBub3Qgc3VwcG9ydFxuIiwgdHlwZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBTZXQgT3BlcmF0aW9uIG1vZGUgdG8gdGhlIFBPUlQgVFlQRSBSSUQgKi8KKwlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfdWludDMyKHdsYW5kZXYsIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBvcnRUeXBlLCBkYXRhKTsKKworCWlmIChyZXN1bHQpCisJCWVyciA9IC1FRkFVTFQ7CisKKwlkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSA9IHR5cGU7CisKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IHByaXNtMl9hZGRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHU4IGtleV9pbmRleCwgY29uc3QgdTggKm1hY19hZGRyLAorCQkgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQoreworCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwl1MzIgZGlkOworCisJaW50IGVyciA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzd2l0Y2ggKHBhcmFtcy0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAorCQkJCQkJRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlELAorCQkJCQkJa2V5X2luZGV4KTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gZXhpdDsKKworCQkvKiBzZW5kIGtleSB0byBkcml2ZXIgKi8KKwkJc3dpdGNoIChrZXlfaW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkyOworCQkJYnJlYWs7CisKKwkJY2FzZSAzOgorCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXYsIGRpZCwgcGFyYW1zLT5rZXlfbGVuLCBwYXJhbXMtPmtleSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGV4aXQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIlVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZVxuIik7CisJCXJlc3VsdCA9IDE7CisJfQorCitleGl0OgorCWlmIChyZXN1bHQpCisJCWVyciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgcHJpc20yX2dldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgdTgga2V5X2luZGV4LCBjb25zdCB1OCAqbWFjX2FkZHIsIHZvaWQgKmNvb2tpZSwKKwkJICAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICpjb29raWUsIHN0cnVjdCBrZXlfcGFyYW1zKikpCit7CisJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBrZXlfcGFyYW1zIHBhcmFtczsKKwlpbnQgbGVuOworCisJaWYgKGtleV9pbmRleCA+PSBOVU1fV0VQS0VZUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSB3bGFuZGV2LT53ZXBfa2V5bGVuc1trZXlfaW5kZXhdOworCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisKKwlpZiAobGVuID09IDEzKQorCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OworCWVsc2UgaWYgKGxlbiA9PSA1KQorCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OworCWVsc2UKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcGFyYW1zLmtleV9sZW4gPSBsZW47CisJcGFyYW1zLmtleSA9IHdsYW5kZXYtPndlcF9rZXlzW2tleV9pbmRleF07CisKKwljYWxsYmFjayhjb29raWUsICZwYXJhbXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwcmlzbTJfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICB1OCBrZXlfaW5kZXgsIGNvbnN0IHU4ICptYWNfYWRkcikKK3sKKwl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJdTMyIGRpZDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIFRoZXJlIGlzIG5vIGRpcmVjdCB3YXkgaW4gdGhlIGhhcmR3YXJlIChBRkFJSykgb2YgcmVtb3ZpbmcKKwkgICBhIGtleSwgc28gd2Ugd2lsbCBjaGVhdCBieSBzZXR0aW5nIHRoZSBrZXkgdG8gYSBib2d1cyB2YWx1ZSAqLworCS8qIHNlbmQga2V5IHRvIGRyaXZlciAqLworCXN3aXRjaCAoa2V5X2luZGV4KSB7CisJY2FzZSAwOgorCQlkaWQgPQorCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOworCQlicmVhazsKKworCWNhc2UgMToKKwkJZGlkID0KKwkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWRpZCA9CisJCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlkaWQgPQorCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXYsIGRpZCwgMTMsICIwMDAwMDAwMDAwMDAwIik7CisKK2V4aXQ6CisJaWYgKHJlc3VsdCkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBwcmlzbTJfc2V0X2RlZmF1bHRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICB1OCBrZXlfaW5kZXgpCit7CisJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCisJaW50IGVyciA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfdWludDMyKHdsYW5kZXYsCisJCURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwKKwkJa2V5X2luZGV4KTsKKworCWlmIChyZXN1bHQpCisJCWVyciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gZXJyOworfQorCisKK2ludCBwcmlzbTJfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQoreworCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgcXVhbGl0eTsKKwlpbnQgcmVzdWx0OworCisJbWVtc2V0KHNpbmZvLCAwLCBzaXplb2YoKnNpbmZvKSk7CisKKwlpZiAoKHdsYW5kZXYgPT0gTlVMTCkgfHwgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX1JVTk5JTkcpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBidWlsZCByZXF1ZXN0IG1lc3NhZ2UgKi8KKwlxdWFsaXR5Lm1zZ2NvZGUgPSBESURtc2dfbG54cmVxX2NvbW1zcXVhbGl0eTsKKwlxdWFsaXR5LmRibS5kYXRhID0gUDgwMjExRU5VTV90cnV0aF90cnVlOworCXF1YWxpdHkuZGJtLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKKworCS8qIHNlbmQgbWVzc2FnZSB0byBuc2QgKi8KKwlpZiAod2xhbmRldi0+bWxtZXJlcXVlc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmVzdWx0ID0gd2xhbmRldi0+bWxtZXJlcXVlc3Qod2xhbmRldiwgKHN0cnVjdCBwODAyMTFtc2cgKikgJnF1YWxpdHkpOworCisKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJc2luZm8tPnR4cmF0ZS5sZWdhY3kgPSBxdWFsaXR5LnR4cmF0ZS5kYXRhOworCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CSVRSQVRFOworCQlzaW5mby0+c2lnbmFsID0gcXVhbGl0eS5sZXZlbC5kYXRhOworCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19TSUdOQUw7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHByaXNtMl9zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbiBtc2cxOworCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzIG1zZzI7CisJaW50IHJlc3VsdDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgbnVtYnNzID0gMDsKKwlpbnQgaSA9IDA7CisJdTggaWVfYnVmWzQ2XTsKKwlpbnQgaWVfbGVuOworCisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwcml2LT5zY2FuX3JlcXVlc3QgJiYgcHJpdi0+c2Nhbl9yZXF1ZXN0ICE9IHJlcXVlc3QpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAod2xhbmRldi0+bWFjbW9kZSA9PSBXTEFOX01BQ01PREVfRVNTX0FQKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc2NhbiBpbiBBUCBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcXVlc3Q7CisKKwltZW1zZXQoJm1zZzEsIDB4MDAsIHNpemVvZihzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW4pKTsKKwltc2cxLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfc2NhbjsKKwltc2cxLmJzc3R5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYnNzdHlwZV9hbnk7CisKKwltZW1zZXQoJihtc2cxLmJzc2lkLmRhdGEpLCAweEZGLCBzaXplb2YocDgwMjExaXRlbV9wc3RyNl90KSk7CisJbXNnMS5ic3NpZC5kYXRhLmxlbiA9IDY7CisKKwlpZiAocmVxdWVzdC0+bl9zc2lkcyA+IDApIHsKKwkJbXNnMS5zY2FudHlwZS5kYXRhID0gUDgwMjExRU5VTV9zY2FudHlwZV9hY3RpdmU7CisJCW1zZzEuc3NpZC5kYXRhLmxlbiA9IHJlcXVlc3QtPnNzaWRzLT5zc2lkX2xlbjsKKwkJbWVtY3B5KG1zZzEuc3NpZC5kYXRhLmRhdGEsIHJlcXVlc3QtPnNzaWRzLT5zc2lkLCByZXF1ZXN0LT5zc2lkcy0+c3NpZF9sZW4pOworCX0gZWxzZSB7CisJCW1zZzEuc2NhbnR5cGUuZGF0YSA9IDA7CisJfQorCW1zZzEucHJvYmVkZWxheS5kYXRhID0gMDsKKworCWZvciAoaSA9IDA7CisJCShpIDwgcmVxdWVzdC0+bl9jaGFubmVscykgJiYgaSA8IEFSUkFZX1NJWkUocHJpc20yX2NoYW5uZWxzKTsKKwkJaSsrKQorCQltc2cxLmNoYW5uZWxsaXN0LmRhdGEuZGF0YVtpXSA9CisJCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwocmVxdWVzdC0+Y2hhbm5lbHNbaV0tPmNlbnRlcl9mcmVxKTsKKwltc2cxLmNoYW5uZWxsaXN0LmRhdGEubGVuID0gcmVxdWVzdC0+bl9jaGFubmVsczsKKworCW1zZzEubWF4Y2hhbm5lbHRpbWUuZGF0YSA9IDI1MDsKKwltc2cxLm1pbmNoYW5uZWx0aW1lLmRhdGEgPSAyMDA7CisKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnMSk7CisJaWYgKHJlc3VsdCkgeworCQllcnIgPSBwcmlzbTJfcmVzdWx0MmVycihtc2cxLnJlc3VsdGNvZGUuZGF0YSk7CisJCWdvdG8gZXhpdDsKKwl9CisJLyogTm93IHJldHJpZXZlIHNjYW4gcmVzdWx0cyAqLworCW51bWJzcyA9IG1zZzEubnVtYnNzLmRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtYnNzOyBpKyspIHsKKwkJbWVtc2V0KCZtc2cyLCAwLCBzaXplb2YobXNnMikpOworCQltc2cyLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzOworCQltc2cyLmJzc2luZGV4LmRhdGEgPSBpOworCisJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4ICopICZtc2cyKTsKKwkJaWYgKChyZXN1bHQgIT0gMCkgfHwKKwkJICAgIChtc2cyLnJlc3VsdGNvZGUuZGF0YSAhPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzcykpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWVfYnVmWzBdID0gV0xBTl9FSURfU1NJRDsKKwkJaWVfYnVmWzFdID0gbXNnMi5zc2lkLmRhdGEubGVuOworCQlpZV9sZW4gPSBpZV9idWZbMV0gKyAyOworCQltZW1jcHkoJmllX2J1ZlsyXSwgJihtc2cyLnNzaWQuZGF0YS5kYXRhKSwgbXNnMi5zc2lkLmRhdGEubGVuKTsKKwkJY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwKKwkJCWllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgaWVlZTgwMjExX2Rzc3NfY2hhbl90b19mcmVxKG1zZzIuZHNjaGFubmVsLmRhdGEpKSwKKwkJCShjb25zdCB1OCAqKSAmKG1zZzIuYnNzaWQuZGF0YS5kYXRhKSwKKwkJCW1zZzIudGltZXN0YW1wLmRhdGEsIG1zZzIuY2FwaW5mby5kYXRhLAorCQkJbXNnMi5iZWFjb25wZXJpb2QuZGF0YSwKKwkJCWllX2J1ZiwKKwkJCWllX2xlbiwKKwkJCShtc2cyLnNpZ25hbC5kYXRhIC0gNjU1MzYpICogMTAwLCAvKiBDb252ZXJzaW9uIHRvIHNpZ25lZCB0eXBlICovCisJCQlHRlBfS0VSTkVMCisJCSk7CisJfQorCisJaWYgKHJlc3VsdCkKKwkJZXJyID0gcHJpc20yX3Jlc3VsdDJlcnIobXNnMi5yZXN1bHRjb2RlLmRhdGEpOworCitleGl0OgorCWNmZzgwMjExX3NjYW5fZG9uZShyZXF1ZXN0LCBlcnIgPyAxIDogMCk7CisJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgcHJpc20yX3NldF93aXBoeV9wYXJhbXMoc3RydWN0IHdpcGh5ICp3aXBoeSwgdTMyIGNoYW5nZWQpCit7CisJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKKwl1MzIgZGF0YTsKKwlpbnQgcmVzdWx0OworCWludCBlcnIgPSAwOworCisJaWYgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SVFNfVEhSRVNIT0xEKSB7CisJCWlmICh3aXBoeS0+cnRzX3RocmVzaG9sZCA9PSAtMSkKKwkJCWRhdGEgPSAyMzQ3OworCQllbHNlCisJCQlkYXRhID0gd2lwaHktPnJ0c190aHJlc2hvbGQ7CisKKwkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAorCQkJCQkJRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQsCisJCQkJCQlkYXRhKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VkICYgV0lQSFlfUEFSQU1fRlJBR19USFJFU0hPTEQpIHsKKwkJaWYgKHdpcGh5LT5mcmFnX3RocmVzaG9sZCA9PSAtMSkKKwkJCWRhdGEgPSAyMzQ2OworCQllbHNlCisJCQlkYXRhID0gd2lwaHktPmZyYWdfdGhyZXNob2xkOworCisJCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldiwKKwkJCQkJCURJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKKwkJCQkJCWRhdGEpOworCQlpZiAocmVzdWx0KSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBleGl0OworCQl9CisJfQorCitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK2ludCBwcmlzbTJfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnNtZSkKK3sKKwl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gc21lLT5jaGFubmVsOworCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIG1zZ19qb2luOworCXUzMiBkaWQ7CisJaW50IGxlbmd0aCA9IHNtZS0+c3NpZF9sZW47CisJaW50IGNoYW4gPSAtMTsKKwlpbnQgaXNfd2VwID0gKHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCkgfHwKKwkgICAgKHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpOworCWludCByZXN1bHQ7CisJaW50IGVyciA9IDA7CisKKwkvKiBTZXQgdGhlIGNoYW5uZWwgKi8KKwlpZiAoY2hhbm5lbCkgeworCQljaGFuID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAorCQkJCQkJRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWwsCisJCQkJCQljaGFuKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBTZXQgdGhlIGF1dGhvcmlzYXRpb24gKi8KKwlpZiAoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pIHx8CisJCSgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmICFpc193ZXApKQorCQkJbXNnX2pvaW4uYXV0aHR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYXV0aGFsZ19vcGVuc3lzdGVtOworCWVsc2UgaWYgKChzbWUtPmF1dGhfdHlwZSA9PSBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVkpIHx8CisJCSgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmIGlzX3dlcCkpCisJCQltc2dfam9pbi5hdXRodHlwZS5kYXRhID0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJVbmhhbmRsZWQgYXV0aG9yaXNhdGlvbiB0eXBlIGZvciBjb25uZWN0ICglZClcbiIsCisJCQlzbWUtPmF1dGhfdHlwZSk7CisKKwkvKiBTZXQgdGhlIGVuY3J5cHRpb24gLSB3ZSBvbmx5IHN1cHBvcnQgd2VwICovCisJaWYgKGlzX3dlcCkgeworCQlpZiAoc21lLT5rZXkpIHsKKwkJCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldiwKKwkJCQlESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsCisJCQkJc21lLT5rZXlfaWR4KTsKKwkJCWlmIChyZXN1bHQpCisJCQkJZ290byBleGl0OworCisJCQkvKiBzZW5kIGtleSB0byBkcml2ZXIgKi8KKwkJCXN3aXRjaCAoc21lLT5rZXlfaWR4KSB7CisJCQljYXNlIDA6CisJCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOworCQkJCWJyZWFrOworCisJCQljYXNlIDE6CisJCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkyOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXYsIGRpZCwgc21lLT5rZXlfbGVuLCAodTggKikgc21lLT5rZXkpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlnb3RvIGV4aXQ7CisKKwkJfQorCisJCS8qIEFzc3VtZSB3ZSBzaG91bGQgc2V0IHByaXZhY3kgaW52b2tlZCBhbmQgZXhjbHVkZSB1bmVuY3J5cHRlZAorCQkgICBXZSBjb3VsZCBwb3NzaWJseSB1c2Ugc21lLT5wcml2YWN5IGhlcmUsIGJ1dCB0aGUgYXNzdW1wdGlvbgorCQkgICBzZWVtcyByZWFzb25hYmxlIGFueXdheSAqLworCQlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfdWludDMyKHdsYW5kZXYsCisJCQkJCQlESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZCwKKwkJCQkJCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGV4aXQ7CisKKwkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAorCQkJCQkJRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkLAorCQkJCQkJUDgwMjExRU5VTV90cnV0aF90cnVlKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gZXhpdDsKKworCX0gZWxzZSB7CisJCS8qIEFzc3VtZSB3ZSBzaG91bGQgdW5zZXQgcHJpdmFjeSBpbnZva2VkCisJCSAgIGFuZCBleGNsdWRlIHVuZW5jcnlwdGVkICovCisJCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldiwKKwkJCQkJCURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLAorCQkJCQkJUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGV4aXQ7CisKKwkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAorCQkJCQkJRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkLAorCQkJCQkJUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGV4aXQ7CisKKwl9CisKKwkvKiBOb3cgZG8gdGhlIGFjdHVhbCBqb2luLiBOb3RlIHRoZXJlIGlzIG5vIHdheSB0aGF0IEkgY2FuCisJICAgc2VlIHRvIHJlcXVlc3QgYSBzcGVjaWZpYyBic3NpZCAqLworCW1zZ19qb2luLm1zZ2NvZGUgPSBESURtc2dfbG54cmVxX2F1dG9qb2luOworCisJbWVtY3B5KG1zZ19qb2luLnNzaWQuZGF0YS5kYXRhLCBzbWUtPnNzaWQsIGxlbmd0aCk7CisJbXNnX2pvaW4uc3NpZC5kYXRhLmxlbiA9IGxlbmd0aDsKKworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4ICopICZtc2dfam9pbik7CisKK2V4aXQ6CisJaWYgKHJlc3VsdCkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBwcmlzbTJfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICB1MTYgcmVhc29uX2NvZGUpCit7CisJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIG1zZ19qb2luOworCWludCByZXN1bHQ7CisJaW50IGVyciA9IDA7CisKKworCS8qIERvIGEgam9pbiwgd2l0aCBhIGJvZ3VzIHNzaWQuIFRoYXRzIHRoZSBvbmx5IHdheSBJIGNhbiB0aGluayBvZiAqLworCW1zZ19qb2luLm1zZ2NvZGUgPSBESURtc2dfbG54cmVxX2F1dG9qb2luOworCisJbWVtY3B5KG1zZ19qb2luLnNzaWQuZGF0YS5kYXRhLCAiLS0tIiwgMyk7CisJbXNnX2pvaW4uc3NpZC5kYXRhLmxlbiA9IDM7CisKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnX2pvaW4pOworCisJaWYgKHJlc3VsdCkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKKworaW50IHByaXNtMl9qb2luX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK2ludCBwcmlzbTJfbGVhdmVfaWJzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCitpbnQgcHJpc20yX3NldF90eF9wb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLAorCQkJaW50IG1ibSkKK3sKKwlzdHJ1Y3QgcHJpc20yX3dpcGh5X3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OworCXUzMiBkYXRhOworCWludCByZXN1bHQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAodHlwZSA9PSBOTDgwMjExX1RYX1BPV0VSX0FVVE9NQVRJQykKKwkJZGF0YSA9IDMwOworCWVsc2UKKwkJZGF0YSA9IE1CTV9UT19EQk0obWJtKTsKKworCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldiwKKwkJRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbCwKKwkJZGF0YSk7CisKKwlpZiAocmVzdWx0KSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IHByaXNtMl9nZXRfdHhfcG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgaW50ICpkYm0pCit7CisJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKKwlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCBtc2c7CisJcDgwMjExaXRlbV91aW50MzJfdCAqbWliaXRlbSA9IChwODAyMTFpdGVtX3VpbnQzMl90ICopICZtc2cubWliYXR0cmlidXRlLmRhdGE7CisJaW50IHJlc3VsdDsKKwlpbnQgZXJyID0gMDsKKworCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKKwltaWJpdGVtLT5kaWQgPQorCSAgICBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsOworCisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikgJm1zZyk7CisKKwlpZiAocmVzdWx0KSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkqZGJtID0gbWliaXRlbS0+ZGF0YTsKKworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCisKKworCisvKiBJbnRlcmZhY2UgY2FsbGJhY2sgZnVuY3Rpb25zLCBwYXNzaW5nIGRhdGEgYmFjayB1cCB0byB0aGUgY2ZnODAyMTEgbGF5ZXIgKi8KK3ZvaWQgcHJpc20yX2Nvbm5lY3RfcmVzdWx0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggZmFpbGVkKQoreworCXUxNiBzdGF0dXMgPSBmYWlsZWQgPyBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFIDogV0xBTl9TVEFUVVNfU1VDQ0VTUzsKKworCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHdsYW5kZXYtPm5ldGRldiwgd2xhbmRldi0+YnNzaWQsCisJCQkJTlVMTCwgMCwgTlVMTCwgMCwgc3RhdHVzLCBHRlBfS0VSTkVMKTsKK30KKwordm9pZCBwcmlzbTJfZGlzY29ubmVjdGVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3sKKwljZmc4MDIxMV9kaXNjb25uZWN0ZWQod2xhbmRldi0+bmV0ZGV2LCAwLCBOVUxMLAorCQkwLCBHRlBfS0VSTkVMKTsKK30KKwordm9pZCBwcmlzbTJfcm9hbWVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3sKKwljZmc4MDIxMV9yb2FtZWQod2xhbmRldi0+bmV0ZGV2LCB3bGFuZGV2LT5ic3NpZCwKKwkJTlVMTCwgMCwgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7Cit9CisKKworLyogU3RydWN0dXJlcyBmb3IgZGVjbGFyaW5nIHdpcGh5IGludGVyZmFjZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9vcHMgcHJpc20yX3VzYl9jZmdfb3BzID0geworCS5jaGFuZ2VfdmlydHVhbF9pbnRmID0gcHJpc20yX2NoYW5nZV92aXJ0dWFsX2ludGYsCisJLmFkZF9rZXkgPSBwcmlzbTJfYWRkX2tleSwKKwkuZ2V0X2tleSA9IHByaXNtMl9nZXRfa2V5LAorCS5kZWxfa2V5ID0gcHJpc20yX2RlbF9rZXksCisJLnNldF9kZWZhdWx0X2tleSA9IHByaXNtMl9zZXRfZGVmYXVsdF9rZXksCisJLmdldF9zdGF0aW9uID0gcHJpc20yX2dldF9zdGF0aW9uLAorCS5zY2FuID0gcHJpc20yX3NjYW4sCisJLnNldF93aXBoeV9wYXJhbXMgPSBwcmlzbTJfc2V0X3dpcGh5X3BhcmFtcywKKwkuY29ubmVjdCA9IHByaXNtMl9jb25uZWN0LAorCS5kaXNjb25uZWN0ID0gcHJpc20yX2Rpc2Nvbm5lY3QsCisJLmpvaW5faWJzcyA9IHByaXNtMl9qb2luX2lic3MsCisJLmxlYXZlX2lic3MgPSBwcmlzbTJfbGVhdmVfaWJzcywKKwkuc2V0X3R4X3Bvd2VyID0gcHJpc20yX3NldF90eF9wb3dlciwKKwkuZ2V0X3R4X3Bvd2VyID0gcHJpc20yX2dldF90eF9wb3dlciwKK307CisKKworLyogRnVuY3Rpb25zIHRvIGNyZWF0ZS9mcmVlIHdpcGh5IGludGVyZmFjZSAqLworc3RydWN0IHdpcGh5ICp3bGFuX2NyZWF0ZV93aXBoeShzdHJ1Y3QgZGV2aWNlICpkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3sKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdjsKKwl3aXBoeSA9IHdpcGh5X25ldygmcHJpc20yX3VzYl9jZmdfb3BzLCBzaXplb2Yoc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlKSk7CisJaWYgKCF3aXBoeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CisJcHJpdi0+d2xhbmRldiA9IHdsYW5kZXY7CisJbWVtY3B5KHByaXYtPmNoYW5uZWxzLCBwcmlzbTJfY2hhbm5lbHMsIHNpemVvZihwcmlzbTJfY2hhbm5lbHMpKTsKKwltZW1jcHkocHJpdi0+cmF0ZXMsIHByaXNtMl9yYXRlcywgc2l6ZW9mKHByaXNtMl9yYXRlcykpOworCXByaXYtPmJhbmQuY2hhbm5lbHMgPSBwcml2LT5jaGFubmVsczsKKwlwcml2LT5iYW5kLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHByaXNtMl9jaGFubmVscyk7CisJcHJpdi0+YmFuZC5iaXRyYXRlcyA9IHByaXYtPnJhdGVzOworCXByaXYtPmJhbmQubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUocHJpc20yX3JhdGVzKTsKKwl3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmcHJpdi0+YmFuZDsKKworCXNldF93aXBoeV9kZXYod2lwaHksIGRldik7CisJd2lwaHktPnByaXZpZCA9IHByaXNtMl93aXBoeV9wcml2aWQ7CisJd2lwaHktPm1heF9zY2FuX3NzaWRzID0gMTsKKwl3aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCQkJIHwgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKKwl3aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07CisJd2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IFBSSVNNMl9OVU1fQ0lQSEVSX1NVSVRFUzsKKwl3aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IHByaXNtMl9jaXBoZXJfc3VpdGVzOworCisJaWYgKHdpcGh5X3JlZ2lzdGVyKHdpcGh5KSA8IDApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHdpcGh5OworfQorCisKK3ZvaWQgd2xhbl9mcmVlX3dpcGh5KHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJd2lwaHlfdW5yZWdpc3Rlcih3aXBoeSk7CisJd2lwaHlfZnJlZSh3aXBoeSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKaW5kZXggMWZhNDJlMC4uZmE5NGE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaApAQCAtMTI4NCw2ICsxMjg0LDggQEAKIAl1MTYgbGlua19zdGF0dXNfbmV3OwogCXN0cnVjdCBza19idWZmX2hlYWQgYXV0aHE7CiAKKwl1MzIgdHhyYXRlOworCiAJLyogQW5kIGhlcmUgd2UgaGF2ZSBzdHVmZiB0aGF0IHVzZWQgdG8gYmUgaW4gcHJpdiAqLwogCiAJLyogU3RhdGUgdmFyaWFibGVzICovCkBAIC0xNDA3LDcgKzE0MDksNyBAQAogaW50IGhmYTM4NHhfZHJ2cl9zdG9wKGhmYTM4NHhfdCAqaHcpOwogaW50CiBoZmEzODR4X2RydnJfdHhmcmFtZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCk7CisJCSAgICAgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKTsKIHZvaWQgaGZhMzg0eF90eF90aW1lb3V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiAKIGludCBoZmEzODR4X2NtZF9pbml0aWFsaXplKGhmYTM4NHhfdCAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKaW5kZXggYTQxZGI1ZC4uZWE4MWNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCkBAIC0yNzA2LDggKzI3MDYsOCBAQAogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50IGhmYTM4NHhfZHJ2cl90eGZyYW1lKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLAotCQkJIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCisJCQkgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwKKwkJCSBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApCiB7CiAJaW50IHVzYnBrdGxlbiA9IHNpemVvZihoZmEzODR4X3R4X2ZyYW1lX3QpOwogCWludCByZXN1bHQ7CkBAIC0yNzUyLDcgKzI3NTIsNyBAQAogCiAJLyogY29weSB0aGUgaGVhZGVyIG92ZXIgdG8gdGhlIHR4ZGVzYyAqLwogCW1lbWNweSgmKGh3LT50eGJ1ZmYudHhmcm0uZGVzYy5mcmFtZV9jb250cm9sKSwgcDgwMjExX2hkciwKLQkgICAgICAgc2l6ZW9mKHA4MDIxMV9oZHJfdCkpOworCSAgICAgICBzaXplb2YodW5pb24gcDgwMjExX2hkcikpOwogCiAJLyogaWYgd2UncmUgdXNpbmcgaG9zdCBXRVAsIGluY3JlYXNlIHNpemUgYnkgSVYrSUNWICovCiAJaWYgKHA4MDIxMV93ZXAtPmRhdGEpIHsKQEAgLTI4MDUsMTEgKzI4MDUsMTMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwogCi0JaWYgKCFody0+d2xhbmRldi0+aHdyZW1vdmVkICYmCi0JICAgIC8qIE5vdGUgdGhlIGJpdHdpc2UgT1IsIG5vdCB0aGUgbG9naWNhbCBPUi4gKi8KLQkgICAgKCF0ZXN0X2FuZF9zZXRfYml0KFdPUktfVFhfSEFMVCwgJmh3LT51c2JfZmxhZ3MpIHwKLQkgICAgICF0ZXN0X2FuZF9zZXRfYml0KFdPUktfUlhfSEFMVCwgJmh3LT51c2JfZmxhZ3MpKSkgewotCQlzY2hlZHVsZV93b3JrKCZody0+dXNiX3dvcmspOworCWlmICghaHctPndsYW5kZXYtPmh3cmVtb3ZlZCkgeworCQlpbnQgc2NoZWQ7CisKKwkJc2NoZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChXT1JLX1RYX0hBTFQsICZody0+dXNiX2ZsYWdzKTsKKwkJc2NoZWQgfD0gIXRlc3RfYW5kX3NldF9iaXQoV09SS19SWF9IQUxULCAmaHctPnVzYl9mbGFncyk7CisJCWlmIChzY2hlZCkKKwkJCXNjaGVkdWxlX3dvcmsoJmh3LT51c2Jfd29yayk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKQEAgLTM0NzEsNyArMzQ3Myw3IEBACiAJaGZhMzg0eF91c2Jpbl90ICp1c2JpbiA9IChoZmEzODR4X3VzYmluX3QgKikgc2tiLT5kYXRhOwogCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCBoZHJsZW47Ci0JcDgwMjExX3J4bWV0YV90ICpyeG1ldGE7CisJc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YTsKIAl1MTYgZGF0YV9sZW47CiAJdTE2IGZjOwogCkBAIC0zNTg4LDE0ICszNTkwLDE0IEBACiAJZGF0YWxlbiA9IGxlMTZfdG9fY3B1KHJ4ZGVzYy0+ZGF0YV9sZW4pOwogCiAJLyogQWxsb2NhdGUgYW4gaW5kIG1lc3NhZ2UrZnJhbWVzaXplIHNrYiAqLwotCXNrYmxlbiA9IHNpemVvZihwODAyMTFfY2FwaGRyX3QpICsgaGRybGVuICsgZGF0YWxlbiArIFdMQU5fQ1JDX0xFTjsKKwlza2JsZW4gPSBzaXplb2Yoc3RydWN0IHA4MDIxMV9jYXBoZHIpICsgaGRybGVuICsgZGF0YWxlbiArIFdMQU5fQ1JDX0xFTjsKIAogCS8qIHNhbml0eSBjaGVjayB0aGUgbGVuZ3RoICovCiAJaWYgKHNrYmxlbiA+Ci0JICAgIChzaXplb2YocDgwMjExX2NhcGhkcl90KSArCisJICAgIChzaXplb2Yoc3RydWN0IHA4MDIxMV9jYXBoZHIpICsKIAkgICAgIFdMQU5fSERSX0E0X0xFTiArIFdMQU5fREFUQV9NQVhMRU4gKyBXTEFOX0NSQ19MRU4pKSB7CiAJCXByX2RlYnVnKCJvdmVybGVuIGZybTogbGVuPSV6ZFxuIiwKLQkJCSBza2JsZW4gLSBzaXplb2YocDgwMjExX2NhcGhkcl90KSk7CisJCQkgc2tibGVuIC0gc2l6ZW9mKHN0cnVjdCBwODAyMTFfY2FwaGRyKSk7CiAJfQogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihza2JsZW4pOwpAQCAtMzYwOSwxMyArMzYxMSwxMyBAQAogCS8qIG9ubHkgcHJlcGVuZCB0aGUgcHJpc20gaGVhZGVyIGlmIGluIHRoZSByaWdodCBtb2RlICovCiAJaWYgKCh3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSkgJiYKIAkgICAgKGh3LT5zbmlmZmhkciAhPSAwKSkgewotCQlwODAyMTFfY2FwaGRyX3QgKmNhcGhkcjsKKwkJc3RydWN0IHA4MDIxMV9jYXBoZHIgKmNhcGhkcjsKIAkJLyogVGhlIE5FVyBoZWFkZXIgZm9ybWF0ISAqLwotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBzaXplb2YocDgwMjExX2NhcGhkcl90KSk7Ci0JCWNhcGhkciA9IChwODAyMTFfY2FwaGRyX3QgKikgZGF0YXA7CisJCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgcDgwMjExX2NhcGhkcikpOworCQljYXBoZHIgPSAoc3RydWN0IHA4MDIxMV9jYXBoZHIgKikgZGF0YXA7CiAKIAkJY2FwaGRyLT52ZXJzaW9uID0gaHRvbmwoUDgwMjExQ0FQVFVSRV9WRVJTSU9OKTsKLQkJY2FwaGRyLT5sZW5ndGggPSBodG9ubChzaXplb2YocDgwMjExX2NhcGhkcl90KSk7CisJCWNhcGhkci0+bGVuZ3RoID0gaHRvbmwoc2l6ZW9mKHN0cnVjdCBwODAyMTFfY2FwaGRyKSk7CiAJCWNhcGhkci0+bWFjdGltZSA9IF9fY3B1X3RvX2JlNjQocnhkZXNjLT50aW1lKSAqIDEwMDA7CiAJCWNhcGhkci0+aG9zdHRpbWUgPSBfX2NwdV90b19iZTY0KGppZmZpZXMpOwogCQljYXBoZHItPnBoeXR5cGUgPSBodG9ubCg0KTsJLyogZHNzX2RvdDExX2IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwppbmRleCAwNTllMTUwLi44Mzg3OWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCkBAIC0xMDMsMTUgKzEwMywxNSBAQAogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50IHNrYl9ldGhlcl90b19wODAyMTEod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZXRoY29udiwKLQkJCXN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwKLQkJCXA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAorCQkJc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewogCiAJdTE2IGZjOwogCXUxNiBwcm90bzsKLQl3bGFuX2V0aGhkcl90IGVfaGRyOwotCXdsYW5fbGxjX3QgKmVfbGxjOwotCXdsYW5fc25hcF90ICplX3NuYXA7CisJc3RydWN0IHdsYW5fZXRoaGRyIGVfaGRyOworCXN0cnVjdCB3bGFuX2xsYyAqZV9sbGM7CisJc3RydWN0IHdsYW5fc25hcCAqZV9zbmFwOwogCWludCBmb287CiAKIAltZW1jcHkoJmVfaGRyLCBza2ItPmRhdGEsIHNpemVvZihlX2hkcikpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIAkJCS8qIHRhY2sgb24gU05BUCAqLwogCQkJZV9zbmFwID0KLQkJCSAgICAod2xhbl9zbmFwX3QgKikgc2tiX3B1c2goc2tiLCBzaXplb2Yod2xhbl9zbmFwX3QpKTsKKwkJCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSk7CiAJCQllX3NuYXAtPnR5cGUgPSBodG9ucyhwcm90byk7CiAJCQlpZiAoZXRoY29udiA9PSBXTEFOX0VUSENPTlZfODAyMWgKIAkJCSAgICAmJiBwODAyMTFfc3R0X2ZpbmRwcm90byhwcm90bykpIHsKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJCQkvKiB0YWNrIG9uIGxsYyAqLwogCQkJZV9sbGMgPQotCQkJICAgICh3bGFuX2xsY190ICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHdsYW5fbGxjX3QpKTsKKwkJCSAgICAoc3RydWN0IHdsYW5fbGxjICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykpOwogCQkJZV9sbGMtPmRzYXAgPSAweEFBOwkvKiBTTkFQLCBzZWUgSUVFRSA4MDIgKi8KIAkJCWVfbGxjLT5zc2FwID0gMHhBQTsKIAkJCWVfbGxjLT5jdGwgPSAweDAzOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIC8qIGprcmllZ2w6IGZyb20gb3Jpbm9jbywgbW9kaWZpZWQgKi8KIHN0YXRpYyB2b2lkIG9yaW5vY29fc3B5X2dhdGhlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGNoYXIgKm1hYywKLQkJCSAgICAgICBwODAyMTFfcnhtZXRhX3QgKnJ4bWV0YSkKKwkJCSAgICAgICBzdHJ1Y3QgcDgwMjExX3J4bWV0YSAqcnhtZXRhKQogewogCWludCBpOwogCkBAIC0yODAsMTcgKzI4MCwxNyBAQAogCXVuc2lnbmVkIGludCBwYXlsb2FkX29mZnNldDsKIAl1OCBkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKIAl1OCBzYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKLQlwODAyMTFfaGRyX3QgKndfaGRyOwotCXdsYW5fZXRoaGRyX3QgKmVfaGRyOwotCXdsYW5fbGxjX3QgKmVfbGxjOwotCXdsYW5fc25hcF90ICplX3NuYXA7CisJdW5pb24gcDgwMjExX2hkciAqd19oZHI7CisJc3RydWN0IHdsYW5fZXRoaGRyICplX2hkcjsKKwlzdHJ1Y3Qgd2xhbl9sbGMgKmVfbGxjOworCXN0cnVjdCB3bGFuX3NuYXAgKmVfc25hcDsKIAogCWludCBmb287CiAKIAlwYXlsb2FkX2xlbmd0aCA9IHNrYi0+bGVuIC0gV0xBTl9IRFJfQTNfTEVOIC0gV0xBTl9DUkNfTEVOOwogCXBheWxvYWRfb2Zmc2V0ID0gV0xBTl9IRFJfQTNfTEVOOwogCi0Jd19oZHIgPSAocDgwMjExX2hkcl90ICopIHNrYi0+ZGF0YTsKKwl3X2hkciA9ICh1bmlvbiBwODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAogCS8qIHNldHVwIHNvbWUgdmFycyBmb3IgY29udmVuaWVuY2UgKi8KIAlmYyA9IGxlMTZfdG9fY3B1KHdfaGRyLT5hMy5mYyk7CkBAIC0zNDUsMTQgKzM0NSwxNCBAQAogCQl3bGFuZGV2LT5yeC5kZWNyeXB0Kys7CiAJfQogCi0JZV9oZHIgPSAod2xhbl9ldGhoZHJfdCAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQpOworCWVfaGRyID0gKHN0cnVjdCB3bGFuX2V0aGhkciAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQpOwogCi0JZV9sbGMgPSAod2xhbl9sbGNfdCAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQpOworCWVfbGxjID0gKHN0cnVjdCB3bGFuX2xsYyAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQpOwogCWVfc25hcCA9Ci0JICAgICh3bGFuX3NuYXBfdCAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQgKyBzaXplb2Yod2xhbl9sbGNfdCkpOworCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CiAKIAkvKiBUZXN0IGZvciB0aGUgdmFyaW91cyBlbmNvZGluZ3MgKi8KLQlpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZih3bGFuX2V0aGhkcl90KSkgJiYKKwlpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9ldGhoZHIpKSAmJgogCSAgICAoZV9sbGMtPmRzYXAgIT0gMHhhYSB8fCBlX2xsYy0+c3NhcCAhPSAweGFhKSAmJgogCSAgICAoKG1lbWNtcChkYWRkciwgZV9oZHItPmRhZGRyLCBXTEFOX0VUSEFERFJfTEVOKSA9PSAwKSB8fAogCSAgICAgKG1lbWNtcChzYWRkciwgZV9oZHItPnNhZGRyLCBXTEFOX0VUSEFERFJfTEVOKSA9PSAwKSkpIHsKQEAgLTM3Miw3ICszNzIsNyBAQAogCQkvKiBjaG9wIG9mZiB0aGUgODAyLjExIENSQyAqLwogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gV0xBTl9DUkNfTEVOKTsKIAotCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZih3bGFuX2xsY190KSArIHNpemVvZih3bGFuX3NuYXBfdCkpCisJfSBlbHNlIGlmICgocGF5bG9hZF9sZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgKyBzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCiAJCSAgICYmIChlX2xsYy0+ZHNhcCA9PSAweGFhKSAmJiAoZV9sbGMtPnNzYXAgPT0gMHhhYSkKIAkJICAgJiYgKGVfbGxjLT5jdGwgPT0gMHgwMykKIAkJICAgJiYKQEAgLTM5OCw3ICszOTgsNyBAQAogCQlza2JfcHVsbChza2IsIHBheWxvYWRfb2Zmc2V0KTsKIAogCQkvKiBjcmVhdGUgODAyLjMgaGVhZGVyIGF0IGJlZ2lubmluZyBvZiBza2IuICovCi0JCWVfaGRyID0gKHdsYW5fZXRoaGRyX3QgKikgc2tiX3B1c2goc2tiLCBXTEFOX0VUSEhEUl9MRU4pOworCQllX2hkciA9IChzdHJ1Y3Qgd2xhbl9ldGhoZHIgKikgc2tiX3B1c2goc2tiLCBXTEFOX0VUSEhEUl9MRU4pOwogCQltZW1jcHkoZV9oZHItPmRhZGRyLCBkYWRkciwgV0xBTl9FVEhBRERSX0xFTik7CiAJCW1lbWNweShlX2hkci0+c2FkZHIsIHNhZGRyLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJZV9oZHItPnR5cGUgPSBodG9ucyhwYXlsb2FkX2xlbmd0aCk7CkBAIC00MDYsNyArNDA2LDcgQEAKIAkJLyogY2hvcCBvZmYgdGhlIDgwMi4xMSBDUkMgKi8KIAkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIFdMQU5fQ1JDX0xFTik7CiAKLQl9IGVsc2UgaWYgKChwYXlsb2FkX2xlbmd0aCA+PSBzaXplb2Yod2xhbl9sbGNfdCkgKyBzaXplb2Yod2xhbl9zbmFwX3QpKQorCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQogCQkgICAmJiAoZV9sbGMtPmRzYXAgPT0gMHhhYSkgJiYgKGVfbGxjLT5zc2FwID09IDB4YWEpCiAJCSAgICYmIChlX2xsYy0+Y3RsID09IDB4MDMpKSB7CiAJCXByX2RlYnVnKCI4MDIuMWgvUkZDMTA0MiBsZW46ICVkXG4iLCBwYXlsb2FkX2xlbmd0aCk7CkBAIC00MTQsMTMgKzQxNCwxMyBAQAogCQkvKiBidWlsZCBhIERJWElJICsgUkZDODk0ICovCiAKIAkJLyogVGVzdCBmb3IgYW4gb3Zlcmxlbmd0aCBmcmFtZSAqLwotCQlpZiAoKHBheWxvYWRfbGVuZ3RoIC0gc2l6ZW9mKHdsYW5fbGxjX3QpIC0gc2l6ZW9mKHdsYW5fc25hcF90KSkKKwkJaWYgKChwYXlsb2FkX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpIC0gc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQogCQkgICAgPiBuZXRkZXYtPm10dSkgewogCQkJLyogQSBib2d1cyBsZW5ndGggZXRoZnJtIGhhcyBiZWVuIHNlbnQuICovCiAJCQkvKiBJcyBzb21lb25lIHRyeWluZyBhbiBvZmxvdyBhdHRhY2s/ICovCiAJCQlwcmludGsoS0VSTl9FUlIgIkRJWElJIGZyYW1lIHRvbyBsYXJnZSAoJWxkID4gJWQpXG4iLAotCQkJICAgICAgIChsb25nIGludCkocGF5bG9hZF9sZW5ndGggLSBzaXplb2Yod2xhbl9sbGNfdCkgLQotCQkJCQkgIHNpemVvZih3bGFuX3NuYXBfdCkpLCBuZXRkZXYtPm10dSk7CisJCQkgICAgICAgKGxvbmcgaW50KShwYXlsb2FkX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpIC0KKwkJCQkJICBzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpLCBuZXRkZXYtPm10dSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCkBAIC00MjgsMTMgKzQyOCwxMyBAQAogCQlza2JfcHVsbChza2IsIHBheWxvYWRfb2Zmc2V0KTsKIAogCQkvKiBjaG9wIGxsYyBoZWFkZXIgZnJvbSBza2IuICovCi0JCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHdsYW5fbGxjX3QpKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CiAKIAkJLyogY2hvcCBzbmFwIGhlYWRlciBmcm9tIHNrYi4gKi8KLQkJc2tiX3B1bGwoc2tiLCBzaXplb2Yod2xhbl9zbmFwX3QpKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpOwogCiAJCS8qIGNyZWF0ZSA4MDIuMyBoZWFkZXIgYXQgYmVnaW5uaW5nIG9mIHNrYi4gKi8KLQkJZV9oZHIgPSAod2xhbl9ldGhoZHJfdCAqKSBza2JfcHVzaChza2IsIFdMQU5fRVRISERSX0xFTik7CisJCWVfaGRyID0gKHN0cnVjdCB3bGFuX2V0aGhkciAqKSBza2JfcHVzaChza2IsIFdMQU5fRVRISERSX0xFTik7CiAJCWVfaGRyLT50eXBlID0gZV9zbmFwLT50eXBlOwogCQltZW1jcHkoZV9oZHItPmRhZGRyLCBkYWRkciwgV0xBTl9FVEhBRERSX0xFTik7CiAJCW1lbWNweShlX2hkci0+c2FkZHIsIHNhZGRyLCBXTEFOX0VUSEFERFJfTEVOKTsKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCQlza2JfcHVsbChza2IsIHBheWxvYWRfb2Zmc2V0KTsKIAogCQkvKiBjcmVhdGUgODAyLjMgaGVhZGVyIGF0IGJlZ2lubmluZyBvZiBza2IuICovCi0JCWVfaGRyID0gKHdsYW5fZXRoaGRyX3QgKikgc2tiX3B1c2goc2tiLCBXTEFOX0VUSEhEUl9MRU4pOworCQllX2hkciA9IChzdHJ1Y3Qgd2xhbl9ldGhoZHIgKikgc2tiX3B1c2goc2tiLCBXTEFOX0VUSEhEUl9MRU4pOwogCQltZW1jcHkoZV9oZHItPmRhZGRyLCBkYWRkciwgV0xBTl9FVEhBRERSX0xFTik7CiAJCW1lbWNweShlX2hkci0+c2FkZHIsIHNhZGRyLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJZV9oZHItPnR5cGUgPSBodG9ucyhwYXlsb2FkX2xlbmd0aCk7CkBAIC01NDIsOCArNTQyLDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZCBwODAyMTFza2JfcnhtZXRhX2RldGFjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXA4MDIxMV9yeG1ldGFfdCAqcnhtZXRhOwotCXA4MDIxMV9mcm1tZXRhX3QgKmZybW1ldGE7CisJc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YTsKKwlzdHJ1Y3QgcDgwMjExX2ZybW1ldGEgKmZybW1ldGE7CiAKIAkvKiBTYW5pdHkgY2hlY2tzICovCiAJaWYgKHNrYiA9PSBOVUxMKSB7CS8qIGJhZCBza2IgKi8KQEAgLTU4OSw4ICs1ODksOCBAQAogaW50IHA4MDIxMXNrYl9yeG1ldGFfYXR0YWNoKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCByZXN1bHQgPSAwOwotCXA4MDIxMV9yeG1ldGFfdCAqcnhtZXRhOwotCXA4MDIxMV9mcm1tZXRhX3QgKmZybW1ldGE7CisJc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YTsKKwlzdHJ1Y3QgcDgwMjExX2ZybW1ldGEgKmZybW1ldGE7CiAKIAkvKiBJZiB0aGVzZSBhbHJlYWR5IGhhdmUgbWV0YWRhdGEsIHdlIGVycm9yIG91dCEgKi8KIAlpZiAoUDgwMjExU0tCX1JYTUVUQShza2IpICE9IE5VTEwpIHsKQEAgLTYwMSw3ICs2MDEsNyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIHRoZSByeG1ldGEgKi8KLQlyeG1ldGEgPSBremFsbG9jKHNpemVvZihwODAyMTFfcnhtZXRhX3QpLCBHRlBfQVRPTUlDKTsKKwlyeG1ldGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcDgwMjExX3J4bWV0YSksIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJ4bWV0YSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSByeG1ldGEuXG4iLApAQCAtNjE1LDggKzYxNSw4IEBACiAJcnhtZXRhLT5ob3N0dGltZSA9IGppZmZpZXM7CiAKIAkvKiBPdmVybGF5IGEgZnJtbWV0YV90IG9udG8gc2tiLT5jYiAqLwotCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2YocDgwMjExX2ZybW1ldGFfdCkpOwotCWZybW1ldGEgPSAocDgwMjExX2ZybW1ldGFfdCAqKSAoc2tiLT5jYik7CisJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihzdHJ1Y3QgcDgwMjExX2ZybW1ldGEpKTsKKwlmcm1tZXRhID0gKHN0cnVjdCBwODAyMTFfZnJtbWV0YSAqKSAoc2tiLT5jYik7CiAJZnJtbWV0YS0+bWFnaWMgPSBQODAyMTFfRlJNTUVUQV9NQUdJQzsKIAlmcm1tZXRhLT5yeCA9IHJ4bWV0YTsKIGV4aXQ6CkBAIC02NDEsNyArNjQxLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZCBwODAyMTFza2JfZnJlZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlwODAyMTFfZnJtbWV0YV90ICptZXRhOworCXN0cnVjdCBwODAyMTFfZnJtbWV0YSAqbWV0YTsKIAogCW1ldGEgPSBQODAyMTFTS0JfRlJNTUVUQShza2IpOwogCWlmIChtZXRhICYmIG1ldGEtPnJ4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCmluZGV4IDZmZTE2M2IuLmVjYTAzOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKQEAgLTYzLDE3ICs2MywxNyBAQAogCiAjZGVmaW5lIFA4MDIxMUNBUFRVUkVfVkVSU0lPTgkweDgwMjExMDAxCiAKLSNkZWZpbmUJUDgwMjExX0ZSTU1FVEFfTUFHSUMJCTB4ODAyMTEwCisjZGVmaW5lCVA4MDIxMV9GUk1NRVRBX01BR0lDCTB4ODAyMTEwCiAKICNkZWZpbmUgUDgwMjExU0tCX0ZSTU1FVEEocykgXAotCSgoKCgocDgwMjExX2ZybW1ldGFfdCAqKSgocyktPmNiKSktPm1hZ2ljKSA9PSBQODAyMTFfRlJNTUVUQV9NQUdJQykgPyBcCi0JCSgocDgwMjExX2ZybW1ldGFfdCAqKSgocyktPmNiKSkgOiBcCisJKCgoKChzdHJ1Y3QgcDgwMjExX2ZybW1ldGEgKikoKHMpLT5jYikpLT5tYWdpYykgPT0gUDgwMjExX0ZSTU1FVEFfTUFHSUMpID8gXAorCQkoKHN0cnVjdCBwODAyMTFfZnJtbWV0YSAqKSgocyktPmNiKSkgOiBcCiAJCShOVUxMKSkKIAogI2RlZmluZSBQODAyMTFTS0JfUlhNRVRBKHMpIFwKLQkoUDgwMjExU0tCX0ZSTU1FVEEoKHMpKSA/ICBQODAyMTFTS0JfRlJNTUVUQSgocykpLT5yeCA6ICgocDgwMjExX3J4bWV0YV90ICopKE5VTEwpKSkKKwkoUDgwMjExU0tCX0ZSTU1FVEEoKHMpKSA/ICBQODAyMTFTS0JfRlJNTUVUQSgocykpLT5yeCA6ICgoc3RydWN0IHA4MDIxMV9yeG1ldGEgKikoTlVMTCkpKQogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFfcnhtZXRhIHsKK3N0cnVjdCBwODAyMTFfcnhtZXRhIHsKIAlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKIAogCXU2NCBtYWN0aW1lOwkJLyogSGktcmV6IE1BQy1zdXBwbGllZCB0aW1lIHZhbHVlICovCkBAIC04NywxMiArODcsMTIgQEAKIAl1bnNpZ25lZCBpbnQgcHJlYW1ibGU7CS8qIFA4MDIxMUVOVU1fcHJlYW1ibGV0eXBlXyogKi8KIAl1bnNpZ25lZCBpbnQgZW5jb2Rpbmc7CS8qIFA4MDIxMUVOVU1fZW5jb2RpbmdfKiAqLwogCi19IHA4MDIxMV9yeG1ldGFfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMV9mcm1tZXRhIHsKK3N0cnVjdCBwODAyMTFfZnJtbWV0YSB7CiAJdW5zaWduZWQgaW50IG1hZ2ljOwotCXA4MDIxMV9yeG1ldGFfdCAqcng7Ci19IHA4MDIxMV9mcm1tZXRhX3Q7CisJc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4OworfTsKIAogdm9pZCBwODAyMTFza2JfZnJlZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgcDgwMjExc2tiX3J4bWV0YV9hdHRhY2goc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAvKgogICogRnJhbWUgY2FwdHVyZSBoZWFkZXIuICAoU2VlIGRvYy9jYXB0dXJlZnJtLnR4dCkKICAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2NhcGhkciB7CitzdHJ1Y3QgcDgwMjExX2NhcGhkciB7CiAJdTMyIHZlcnNpb247CiAJdTMyIGxlbmd0aDsKIAl1NjQgbWFjdGltZTsKQEAgLTExNiwzNiArMTE2LDM2IEBACiAJczMyIHNzaV9ub2lzZTsKIAl1MzIgcHJlYW1ibGU7CiAJdTMyIGVuY29kaW5nOwotfSBwODAyMTFfY2FwaGRyX3Q7Cit9OwogCiAvKiBidWZmZXIgZnJlZSBtZXRob2QgcG9pbnRlciB0eXBlICovCiB0eXBlZGVmIHZvaWQgKCpmcmVlYnVmX21ldGhvZF90KSAodm9pZCAqYnVmLCBpbnQgc2l6ZSk7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMV9tZXRhd2VwIHsKK3N0cnVjdCBwODAyMTFfbWV0YXdlcCB7CiAJdm9pZCAqZGF0YTsKIAl1OCBpdls0XTsKIAl1OCBpY3ZbNF07Ci19IHA4MDIxMV9tZXRhd2VwX3Q7Cit9OwogCiAvKiBsb2NhbCBldGhlciBoZWFkZXIgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9ldGhoZHIgeworc3RydWN0IHdsYW5fZXRoaGRyIHsKIAl1OCBkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKIAl1OCBzYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKIAl1MTYgdHlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHdsYW5fZXRoaGRyX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogbG9jYWwgbGxjIGhlYWRlciB0eXBlICovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2xsYyB7CitzdHJ1Y3Qgd2xhbl9sbGMgewogCXU4IGRzYXA7CiAJdTggc3NhcDsKIAl1OCBjdGw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB3bGFuX2xsY190OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIGxvY2FsIHNuYXAgaGVhZGVyIHR5cGUgKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fc25hcCB7CitzdHJ1Y3Qgd2xhbl9zbmFwIHsKIAl1OCBvdWlbV0xBTl9JRUVFX09VSV9MRU5dOwogCXUxNiB0eXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgd2xhbl9zbmFwX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogQ2lyY3VsYXIgaW5jbHVkZSB0cmljayAqLwogc3RydWN0IHdsYW5kZXZpY2U7CkBAIC0xNTMsOCArMTUzLDggQEAKIGludCBza2JfcDgwMjExX3RvX2V0aGVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MzIgZXRoY29udiwKIAkJCXN0cnVjdCBza19idWZmICpza2IpOwogaW50IHNrYl9ldGhlcl90b19wODAyMTEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBldGhjb252LAotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLAotCQkJcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCk7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAorCQkJc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKTsKIAogaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKHUxNiBwcm90byk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWhkci5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKaW5kZXggNDE5ZGU0ZC4uMWY2ZTRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKQEAgLTk0LDcgKzk0LDcgQEAKIAogLyogQ29udHJvbCAqLwogI2RlZmluZSBXTEFOX0ZTVFlQRV9CTE9DS0FDS1JFUQkJMHg4Ci0jZGVmaW5lIFdMQU5fRlNUWVBFX0JMT0NLQUNLICAJCTB4OQorI2RlZmluZSBXTEFOX0ZTVFlQRV9CTE9DS0FDSwkJMHg5CiAjZGVmaW5lIFdMQU5fRlNUWVBFX1BTUE9MTAkJMHgwYQogI2RlZmluZSBXTEFOX0ZTVFlQRV9SVFMJCQkweDBiCiAjZGVmaW5lIFdMQU5fRlNUWVBFX0NUUwkJCTB4MGMKQEAgLTEzMywxMyArMTMzLDEzIEBACiAKICNkZWZpbmUgV0xBTl9HRVRfRkNfRlRZUEUobikJKCgoKHUxNikobikpICYgKEJJVCgyKSB8IEJJVCgzKSkpID4+IDIpCiAjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKQkoKCgodTE2KShuKSkgJiAoQklUKDQpfEJJVCg1KXxCSVQoNil8QklUKDcpKSkgPj4gNCkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfVE9EUyhuKSAJKCgoKHUxNikobikpICYgKEJJVCg4KSkpID4+IDgpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1RPRFMobikJKCgoKHUxNikobikpICYgKEJJVCg4KSkpID4+IDgpCiAjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZST01EUyhuKQkoKCgodTE2KShuKSkgJiAoQklUKDkpKSkgPj4gOSkKICNkZWZpbmUgV0xBTl9HRVRfRkNfSVNXRVAobikJKCgoKHUxNikobikpICYgKEJJVCgxNCkpKSA+PiAxNCkKIAogI2RlZmluZSBXTEFOX1NFVF9GQ19GVFlQRShuKQkoKCh1MTYpKG4pKSA8PCAyKQogI2RlZmluZSBXTEFOX1NFVF9GQ19GU1RZUEUobikJKCgodTE2KShuKSkgPDwgNCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfVE9EUyhuKSAJKCgodTE2KShuKSkgPDwgOCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfVE9EUyhuKQkoKCh1MTYpKG4pKSA8PCA4KQogI2RlZmluZSBXTEFOX1NFVF9GQ19GUk9NRFMobikJKCgodTE2KShuKSkgPDwgOSkKICNkZWZpbmUgV0xBTl9TRVRfRkNfSVNXRVAobikJKCgodTE2KShuKSkgPDwgMTQpCiAKQEAgLTE0NywxNiArMTQ3LDE2IEBACiAKIC8qIEdlbmVyaWMgODAyLjExIEhlYWRlciB0eXBlcyAqLwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFfaGRyX2EzIHsKK3N0cnVjdCBwODAyMTFfaGRyX2EzIHsKIAl1MTYgZmM7CiAJdTE2IGR1cjsKIAl1OCBhMVtFVEhfQUxFTl07CiAJdTggYTJbRVRIX0FMRU5dOwogCXU4IGEzW0VUSF9BTEVOXTsKIAl1MTYgc2VxOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcDgwMjExX2hkcl9hM190OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMV9oZHJfYTQgeworc3RydWN0IHA4MDIxMV9oZHJfYTQgewogCXUxNiBmYzsKIAl1MTYgZHVyOwogCXU4IGExW0VUSF9BTEVOXTsKQEAgLTE2NCwxOCArMTY0LDE4IEBACiAJdTggYTNbRVRIX0FMRU5dOwogCXUxNiBzZXE7CiAJdTggYTRbRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcDgwMjExX2hkcl9hNF90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgdW5pb24gcDgwMjExX2hkciB7Ci0JcDgwMjExX2hkcl9hM190IGEzOwotCXA4MDIxMV9oZHJfYTRfdCBhNDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHA4MDIxMV9oZHJfdDsKK3VuaW9uIHA4MDIxMV9oZHIgeworCXN0cnVjdCBwODAyMTFfaGRyX2EzIGEzOworCXN0cnVjdCBwODAyMTFfaGRyX2E0IGE0OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIEZyYW1lIGFuZCBoZWFkZXIgbGVuZ3RoIG1hY3JvcyAqLwogCiAjZGVmaW5lIFdMQU5fQ1RMX0ZSQU1FTEVOKGZzdHlwZSkgKFwKIAkoZnN0eXBlKSA9PSBXTEFOX0ZTVFlQRV9CTE9DS0FDS1JFUQk/IDI0IDogXAotCShmc3R5cGUpID09IFdMQU5fRlNUWVBFX0JMT0NLQUNLICAgCT8gMTUyIDogXAorCShmc3R5cGUpID09IFdMQU5fRlNUWVBFX0JMT0NLQUNLCT8gMTUyIDogXAogCShmc3R5cGUpID09IFdMQU5fRlNUWVBFX1BTUE9MTAkJPyAyMCA6IFwKIAkoZnN0eXBlKSA9PSBXTEFOX0ZTVFlQRV9SVFMJCT8gMjAgOiBcCiAJKGZzdHlwZSkgPT0gV0xBTl9GU1RZUEVfQ1RTCQk/IDE0IDogXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWlvY3RsLmgKaW5kZXggNjRjYTdmOS4uMGQ0Nzc2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFpb2N0bC5oCkBAIC03OCwxMiArNzgsMTIgQEAKIC8qICBhcmd1bWVudCB0byB0aGUgaW9jdGwgc3lzdGVtIGNhbGwgd2hlbiBpc3N1aW5nIGEgcmVxdWVzdCB0byAqLwogLyogIHRoZSBwODAyMTEgbW9kdWxlLiAqLwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpb2N0bF9yZXEgeworc3RydWN0IHA4MDIxMWlvY3RsX3JlcSB7CiAJY2hhciBuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwogCWNhZGRyX3QgZGF0YTsKIAl1MzIgbWFnaWM7CiAJdTE2IGxlbjsKIAl1MzIgcmVzdWx0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcDgwMjExaW9jdGxfcmVxX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogI2VuZGlmIC8qIF9QODAyMTFJT0NUTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmgKaW5kZXggYjliYWRjZi4uYzVmMWE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaApAQCAtNjIsNyArNjIsNyBAQAogLyogcmVwcmVzZW50YXRpb24gb2YgY2F0ZWdvcnkgbGlzdCBtZXRhZGF0YSwgZ3JvdXAgbGlzdCBtZXRhZGF0YSwgKi8KIC8qIGFuZCBkYXRhIGl0ZW0gbWV0YWRhdGEgZm9yIGJvdGggTWliIGFuZCBNZXNzYWdlcy4gKi8KIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbWV0YSB7CitzdHJ1Y3QgcDgwMjExbWV0YSB7CiAJY2hhciAqbmFtZTsJCS8qIGRhdGEgaXRlbSBuYW1lICovCiAJdTMyIGRpZDsJCS8qIHBhcnRpYWwgZGlkICovCiAJdTMyIGZsYWdzOwkJLyogc2V0IG9mIHZhcmlvdXMgZmxhZyBiaXRzICovCkBAIC03NSwxNiArNzUsMTYgQEAKIAlwODAyMTFfdG90ZXh0X3QgdG90ZXh0cHRyOwkvKiBwdHIgdG8gdG90ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KIAlwODAyMTFfZnJvbXRleHRfdCBmcm9tdGV4dHB0cjsJLyogcHRyIHRvIHRvdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCiAJcDgwMjExX3ZhbGlkX3QgdmFsaWRmdW5wdHI7CS8qIHB0ciB0byB0b3RleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotfSBwODAyMTFtZXRhX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBncnBsaXN0aXRlbSB7CitzdHJ1Y3QgZ3JwbGlzdGl0ZW0gewogCWNoYXIgKm5hbWU7Ci0JcDgwMjExbWV0YV90ICppdGVtbGlzdDsKLX0gZ3JwbGlzdGl0ZW1fdDsKKwlzdHJ1Y3QgcDgwMjExbWV0YSAqaXRlbWxpc3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBjYXRsaXN0aXRlbSB7CitzdHJ1Y3QgY2F0bGlzdGl0ZW0gewogCWNoYXIgKm5hbWU7Ci0JZ3JwbGlzdGl0ZW1fdCAqZ3JwbGlzdDsKLX0gY2F0bGlzdGl0ZW1fdDsKKwlzdHJ1Y3QgZ3JwbGlzdGl0ZW0gKmdycGxpc3Q7Cit9OwogCiAjZW5kaWYgLyogX1A4MDIxMU1FVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCmluZGV4IGRiMTI3MTMuLmE4YTRlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKQEAgLTQ3LDIzICs0NywyMyBAQAogI2lmbmRlZiBfUDgwMjExTUtNRVRBU1RSVUNUX0gKICNkZWZpbmUgX1A4MDIxMU1LTUVUQVNUUlVDVF9ICiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgeworc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKIAlwODAyMTFpdGVtX3VuazM5Ml90IG1pYmF0dHJpYnV0ZTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0X3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCB7CitzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwogCXA4MDIxMWl0ZW1fdW5rMzkyX3QgbWliYXR0cmlidXRlOwogCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbiB7CitzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW4gewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKQEAgLTgxLDkgKzgxLDkgQEAKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CiAJcDgwMjExaXRlbV91aW50MzJfdCBudW1ic3M7CiAJcDgwMjExaXRlbV91aW50MzJfdCBhcHBlbmQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMgeworc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKQEAgLTExMyw2ICsxMTMsNyBAQAogCXA4MDIxMWl0ZW1fdWludDMyX3QgY2Zwb2xsYWJsZTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG9sbHJlcTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHByaXZhY3k7CisJcDgwMjExaXRlbV91aW50MzJfdCBjYXBpbmZvOwogCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTI7CiAJcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUzOwpAQCAtMTI5LDkgKzEzMCw5IEBACiAJcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTY7CiAJcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTc7CiAJcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTg7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0IHsKK3N0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnQgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKQEAgLTE2NywxNyArMTY4LDE3IEBACiAJcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU3OwogCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlODsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnRfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUgeworc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwogCXA4MDIxMWl0ZW1fdWludDMyX3QgaWZzdGF0ZTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGVfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX3dsYW5zbmlmZiB7CitzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmYgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKQEAgLTE4OSwxOCArMTkwLDE4IEBACiAJcDgwMjExaXRlbV91aW50MzJfdCBzdHJpcGZjczsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHBhY2tldF90cnVuYzsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfbG54cmVxX3dsYW5zbmlmZl90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCB7CitzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9ob3N0d2VwIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CiAJcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOwogCXA4MDIxMWl0ZW1fdWludDMyX3QgZGVjcnlwdDsKIAlwODAyMTFpdGVtX3VpbnQzMl90IGVuY3J5cHQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXBfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eSB7CitzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKQEAgLTIwOSw5ICsyMTAsMTAgQEAKIAlwODAyMTFpdGVtX3VpbnQzMl90IGxpbms7CiAJcDgwMjExaXRlbV91aW50MzJfdCBsZXZlbDsKIAlwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHlfdDsKKwlwODAyMTFpdGVtX3VpbnQzMl90IHR4cmF0ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIHsKK3N0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CkBAIC0yMTksMjYgKzIyMSwyNiBAQAogCXU4IHBhZF8xOURbM107CiAJcDgwMjExaXRlbV91aW50MzJfdCBhdXRodHlwZTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgeworc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CiAJcDgwMjExaXRlbV91bmsxMDI0X3QgcGRhOwogCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlIHsKK3N0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IGV4ZWFkZHI7CiAJcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlIHsKK3N0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKQEAgLTI0NiwxNyArMjQ4LDE3IEBACiAJcDgwMjExaXRlbV91aW50MzJfdCBsZW47CiAJcDgwMjExaXRlbV91bms0MDk2X3QgZGF0YTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGVfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF9zdGF0ZSB7CitzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF9zdGF0ZV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlIHsKK3N0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwpAQCAtMjY0LDYgKzI2Niw2IEBACiAJcDgwMjExaXRlbV91aW50MzJfdCBsZW47CiAJcDgwMjExaXRlbV91bms0MDk2X3QgZGF0YTsKIAlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCmluZGV4IGRlYjUyZjUuLjNiNWU4MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKQEAgLTI5OCw3ICsyOTgsNyBAQAogCXUxNiB0eXBlOwogCXUxNiBsZW47CQkvKiBET0VTIE5PVCBpbmNsdWRlIENSQyAhISEhICovCiAJdTggKmJ1ZjsKLQlwODAyMTFfaGRyX3QgKmhkcjsKKwl1bmlvbiBwODAyMTFfaGRyICpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQgKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwotCXA4MDIxMV9oZHJfdCAqaGRyOworCXVuaW9uIHA4MDIxMV9oZHIgKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZCAqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCkBAIC0zMzMsNyArMzMzLDcgQEAKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7Ci0JcDgwMjExX2hkcl90ICpoZHI7CisJdW5pb24gcDgwMjExX2hkciAqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkICpwcml2OwogCkBAIC0zNDksNyArMzQ5LDcgQEAKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7Ci0JcDgwMjExX2hkcl90ICpoZHI7CisJdW5pb24gcDgwMjExX2hkciAqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkICpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KQEAgLTM2NCw3ICszNjQsNyBAQAogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKLQlwODAyMTFfaGRyX3QgKmhkcjsKKwl1bmlvbiBwODAyMTFfaGRyICpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQgKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwotCXA4MDIxMV9oZHJfdCAqaGRyOworCXVuaW9uIHA4MDIxMV9oZHIgKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZCAqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCkBAIC0zOTgsNyArMzk4LDcgQEAKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7Ci0JcDgwMjExX2hkcl90ICpoZHI7CisJdW5pb24gcDgwMjExX2hkciAqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkICpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KQEAgLTQxNiw3ICs0MTYsNyBAQAogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKLQlwODAyMTFfaGRyX3QgKmhkcjsKKwl1bmlvbiBwODAyMTFfaGRyICpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQgKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwotCXA4MDIxMV9oZHJfdCAqaGRyOworCXVuaW9uIHA4MDIxMV9oZHIgKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZCAqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCkBAIC00NDgsNyArNDQ4LDcgQEAKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7Ci0JcDgwMjExX2hkcl90ICpoZHI7CisJdW5pb24gcDgwMjExX2hkciAqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkICpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KQEAgLTQ2OSw3ICs0NjksNyBAQAogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKLQlwODAyMTFfaGRyX3QgKmhkcjsKKwl1bmlvbiBwODAyMTFfaGRyICpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQgKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwotCXA4MDIxMV9oZHJfdCAqaGRyOworCXVuaW9uIHA4MDIxMV9oZHIgKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZCAqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oCmluZGV4IGM2OTFkM2UuLjhlMGY5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oCkBAIC01MCwxMCArNTAsMTAgQEAKIAogI2RlZmluZSBXTEFOX0RFVk5BTUVMRU5fTUFYCTE2CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZyB7CitzdHJ1Y3QgcDgwMjExbXNnIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwODAyMTFtc2dfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAjZW5kaWYgLyogX1A4MDIxMU1TR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCmluZGV4IDc2M2FiMTEuLmFhMTc5MmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwpAQCAtNzUsNiArNzUsNyBAQAogCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogCiAjaW5jbHVkZSAicDgwMjExdHlwZXMuaCIKICNpbmNsdWRlICJwODAyMTFoZHIuaCIKQEAgLTg3LDYgKzg4LDggQEAKICNpbmNsdWRlICJwODAyMTFtZXRhc3RydWN0LmgiCiAjaW5jbHVkZSAicDgwMjExbWV0YWRlZi5oIgogCisjaW5jbHVkZSAiY2ZnODAyMTEuYyIKKwogLyogU3VwcG9ydCBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIHA4MDIxMW5ldGRldl9yeF9iaCh1bnNpZ25lZCBsb25nIGFyZyk7CiAKQEAgLTI2MSw3ICsyNjQsNyBAQAogCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgYXJnOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCW5ldGRldmljZV90ICpkZXYgPSB3bGFuZGV2LT5uZXRkZXY7Ci0JcDgwMjExX2hkcl9hM190ICpoZHI7CisJc3RydWN0IHA4MDIxMV9oZHJfYTMgKmhkcjsKIAl1MTYgZmM7CiAKIAkvKiBMZXQncyBlbXB0eSBvdXIgb3VyIHF1ZXVlICovCkBAIC0yODUsNyArMjg4LDcgQEAKIAkJCQluZXRpZl9yeF9uaShza2IpOwogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIHsKLQkJCQloZHIgPSAocDgwMjExX2hkcl9hM190ICopIHNrYi0+ZGF0YTsKKwkJCQloZHIgPSAoc3RydWN0IHA4MDIxMV9oZHJfYTMgKikgc2tiLT5kYXRhOwogCQkJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mYyk7CiAJCQkJaWYgKHA4MDIxMV9yeF90eXBlZHJvcCh3bGFuZGV2LCBmYykpIHsKIAkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMzQ3LDggKzM1MCw4IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IHR4cmVzdWx0ID0gLTE7CiAJd2xhbmRldmljZV90ICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwotCXA4MDIxMV9oZHJfdCBwODAyMTFfaGRyOwotCXA4MDIxMV9tZXRhd2VwX3QgcDgwMjExX3dlcDsKKwl1bmlvbiBwODAyMTFfaGRyIHA4MDIxMV9oZHI7CisJc3RydWN0IHA4MDIxMV9tZXRhd2VwIHA4MDIxMV93ZXA7CiAKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC0zNTgsOCArMzYxLDggQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JbWVtc2V0KCZwODAyMTFfaGRyLCAwLCBzaXplb2YocDgwMjExX2hkcl90KSk7Ci0JbWVtc2V0KCZwODAyMTFfd2VwLCAwLCBzaXplb2YocDgwMjExX21ldGF3ZXBfdCkpOworCW1lbXNldCgmcDgwMjExX2hkciwgMCwgc2l6ZW9mKHVuaW9uIHA4MDIxMV9oZHIpKTsKKwltZW1zZXQoJnA4MDIxMV93ZXAsIDAsIHNpemVvZihzdHJ1Y3QgcDgwMjExX21ldGF3ZXApKTsKIAogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpIHsKIAkJcHJfZGVidWcoImNhbGxlZCB3aGVuIHF1ZXVlIHN0b3BwZWQuXG4iKTsKQEAgLTM5OCw4ICs0MDEsOCBAQAogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAkJLyogbW92ZSB0aGUgaGVhZGVyIG92ZXIgKi8KLQkJbWVtY3B5KCZwODAyMTFfaGRyLCBza2ItPmRhdGEsIHNpemVvZihwODAyMTFfaGRyX3QpKTsKLQkJc2tiX3B1bGwoc2tiLCBzaXplb2YocDgwMjExX2hkcl90KSk7CisJCW1lbWNweSgmcDgwMjExX2hkciwgc2tiLT5kYXRhLCBzaXplb2YodW5pb24gcDgwMjExX2hkcikpOworCQlza2JfcHVsbChza2IsIHNpemVvZih1bmlvbiBwODAyMTFfaGRyKSk7CiAJfSBlbHNlIHsKIAkJaWYgKHNrYl9ldGhlcl90b19wODAyMTEKIAkJICAgICh3bGFuZGV2LCB3bGFuZGV2LT5ldGhjb252LCBza2IsICZwODAyMTFfaGRyLApAQCAtNTU3LDcgKzU2MCw3IEBACiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfZG9faW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JcDgwMjExaW9jdGxfcmVxX3QgKnJlcSA9IChwODAyMTFpb2N0bF9yZXFfdCAqKSBpZnI7CisJc3RydWN0IHA4MDIxMWlvY3RsX3JlcSAqcmVxID0gKHN0cnVjdCBwODAyMTFpb2N0bF9yZXEgKikgaWZyOwogCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAl1OCAqbXNnYnVmOwogCkBAIC02MDQsNyArNjA3LDggQEAKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAl9CiBiYWlsOgotCXJldHVybiByZXN1bHQ7CQkvKiBJZiBhbGxvY2F0ZSxjb3B5ZnJvbSBvciBjb3B5dG8gZmFpbHMsIHJldHVybiBlcnJubyAqLworCS8qIElmIGFsbG9jYXRlLGNvcHlmcm9tIG9yIGNvcHl0byBmYWlscywgcmV0dXJuIGVycm5vICovCisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MzUsNyArNjM5LDcgQEAKIHN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3MobmV0ZGV2aWNlX3QgKmRldiwgdm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3Qgc29ja2FkZHIgKm5ld19hZGRyID0gYWRkcjsKLQlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgZG90MTFyZXE7CisJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgZG90MTFyZXE7CiAJcDgwMjExaXRlbV91bmszOTJfdCAqbWliYXR0cjsKIAlwODAyMTFpdGVtX3BzdHI2X3QgKm1hY2FkZHI7CiAJcDgwMjExaXRlbV91aW50MzJfdCAqcmVzdWx0Y29kZTsKQEAgLTY1MSw5ICs2NTUsOSBAQAogCXJlc3VsdGNvZGUgPSAmZG90MTFyZXEucmVzdWx0Y29kZTsKIAogCS8qIFNldCB1cCBhIGRvdDExcmVxX21pYnNldCAqLwotCW1lbXNldCgmZG90MTFyZXEsIDAsIHNpemVvZihwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QpKTsKKwltZW1zZXQoJmRvdDExcmVxLCAwLCBzaXplb2Yoc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQpKTsKIAlkb3QxMXJlcS5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKLQlkb3QxMXJlcS5tc2dsZW4gPSBzaXplb2YocDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90KTsKKwlkb3QxMXJlcS5tc2dsZW4gPSBzaXplb2Yoc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQpOwogCW1lbWNweShkb3QxMXJlcS5kZXZuYW1lLAogCSAgICAgICAoKHdsYW5kZXZpY2VfdCAqKSBkZXYtPm1sX3ByaXYpLT5uYW1lLCBXTEFOX0RFVk5BTUVMRU5fTUFYIC0gMSk7CiAKQEAgLTczMiw2ICs3MzYsNyBAQAogKiBBcmd1bWVudHM6CiAqCXdsYW5kZXYJCXB0ciB0byB0aGUgd2xhbmRldiBzdHJ1Y3R1cmUgZm9yIHRoZQogKgkJCWludGVyZmFjZS4KKyoJcGh5c2RldgkJcHRyIHRvIHVzYiBkZXZpY2UKICogUmV0dXJuczoKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCiAqIENhbGwgQ29udGV4dDoKQEAgLTc0MCwxMCArNzQ1LDEyIEBACiAqCWNvbXBpbGVkIGRyaXZlcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlCiAqCWNvbnRleHQgb2YgdGhlIGtlcm5lbCBzdGFydHVwIGNvZGUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCB3bGFuX3NldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK2ludCB3bGFuX3NldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IGRldmljZSAqcGh5c2RldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQluZXRkZXZpY2VfdCAqZGV2OworCW5ldGRldmljZV90ICpuZXRkZXY7CisJc3RydWN0IHdpcGh5ICp3aXBoeTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwogCiAJLyogU2V0IHVwIHRoZSB3bGFuZGV2ICovCiAJd2xhbmRldi0+c3RhdGUgPSBXTEFOX0RFVklDRV9DTE9TRUQ7CkBAIC03NTUsMjAgKzc2MiwzMCBAQAogCXRhc2tsZXRfaW5pdCgmd2xhbmRldi0+cnhfYmgsCiAJCSAgICAgcDgwMjExbmV0ZGV2X3J4X2JoLCAodW5zaWduZWQgbG9uZyl3bGFuZGV2KTsKIAorCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSB3aXBoeSBzdHJ1Y3QgKi8KKwl3aXBoeSA9IHdsYW5fY3JlYXRlX3dpcGh5KHBoeXNkZXYsIHdsYW5kZXYpOworCWlmICh3aXBoeSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jIHdpcGh5LlxuIik7CisJCXJldHVybiAxOworCX0KKwogCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdHJ1Y3QgZGV2aWNlICovCi0JZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJ3bGFuJWQiLCBldGhlcl9zZXR1cCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7CisJbmV0ZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgIndsYW4lZCIsIGV0aGVyX3NldHVwKTsKKwlpZiAobmV0ZGV2ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2MgbmV0ZGV2LlxuIik7CisJCXdsYW5fZnJlZV93aXBoeSh3aXBoeSk7CiAJCXJlc3VsdCA9IDE7CiAJfSBlbHNlIHsKLQkJd2xhbmRldi0+bmV0ZGV2ID0gZGV2OwotCQlkZXYtPm1sX3ByaXYgPSB3bGFuZGV2OwotCQlkZXYtPm5ldGRldl9vcHMgPSAmcDgwMjExX25ldGRldl9vcHM7CisJCXdsYW5kZXYtPm5ldGRldiA9IG5ldGRldjsKKwkJbmV0ZGV2LT5tbF9wcml2ID0gd2xhbmRldjsKKwkJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJnA4MDIxMV9uZXRkZXZfb3BzOworCQl3ZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwkJd2Rldi0+d2lwaHkgPSB3aXBoeTsKKwkJd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwkJbmV0ZGV2LT5pZWVlODAyMTFfcHRyID0gd2RldjsKIAotCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnA4MDIxMXdleHRfaGFuZGxlcl9kZWY7Ci0KLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTc5NywxNCArODE0LDE0IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludCB3bGFuX3Vuc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2KQogewotCWludCByZXN1bHQgPSAwOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAKIAl0YXNrbGV0X2tpbGwoJndsYW5kZXYtPnJ4X2JoKTsKIAotCWlmICh3bGFuZGV2LT5uZXRkZXYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbGxlZCB3aXRob3V0IHdsYW5kZXYtPm5ldGRldiBzZXQuXG4iKTsKLQkJcmVzdWx0ID0gMTsKLQl9IGVsc2UgeworCWlmICh3bGFuZGV2LT5uZXRkZXYpIHsKKwkJd2RldiA9IG5ldGRldl9wcml2KHdsYW5kZXYtPm5ldGRldik7CisJCWlmICh3ZGV2LT53aXBoeSkKKwkJCXdsYW5fZnJlZV93aXBoeSh3ZGV2LT53aXBoeSk7CiAJCWZyZWVfbmV0ZGV2KHdsYW5kZXYtPm5ldGRldik7CiAJCXdsYW5kZXYtPm5ldGRldiA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaAppbmRleCAzYzhjNjQ4Li4xZWMzMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaApAQCAtMTQ4LDYgKzE0OCw3IEBACiAjZGVmaW5lIE1BWF9LRVlMRU4gMzIKIAogI2RlZmluZSBIT1NUV0VQX0RFRkFVTFRLRVlfTUFTSyAoQklUKDEpfEJJVCgwKSkKKyNkZWZpbmUgSE9TVFdFUF9TSEFSRURLRVkgQklUKDMpCiAjZGVmaW5lIEhPU1RXRVBfREVDUllQVCAgQklUKDQpCiAjZGVmaW5lIEhPU1RXRVBfRU5DUllQVCAgQklUKDUpCiAjZGVmaW5lIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQgQklUKDYpCkBAIC0xODMsOSArMTg0LDkgQEAKIAlpbnQgKCpjbG9zZSkgKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKIAl2b2lkICgqcmVzZXQpIChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAJaW50ICgqdHhmcmFtZSkgKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLAotCQkJcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCk7Ci0JaW50ICgqbWxtZXJlcXVlc3QpIChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgcDgwMjExbXNnX3QgKm1zZyk7CisJCQl1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAorCQkJc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKTsKKwlpbnQgKCptbG1lcmVxdWVzdCkgKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpOwogCWludCAoKnNldF9tdWx0aWNhc3RfbGlzdCkgKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAogCQkJCSAgIG5ldGRldmljZV90ICpkZXYpOwogCXZvaWQgKCp0eF90aW1lb3V0KSAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwpAQCAtMjMzLDcgKzIzNCw3IEBACiBpbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLAogCQl1OCAqaXYsIHU4ICppY3YpOwogCi1pbnQgd2xhbl9zZXR1cCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOworaW50IHdsYW5fc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KTsKIGludCB3bGFuX3Vuc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2KTsKIGludCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiBpbnQgdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jCmluZGV4IDIwN2YwODBjLi4xNzkxOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYwpAQCAtNzIsOSArNzIsOSBAQAogI2luY2x1ZGUgInA4MDIxMW1ldGFzdHJ1Y3QuaCIKICNpbmNsdWRlICJwODAyMTFyZXEuaCIKIAotc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHA4MDIxMW1zZ190ICptc2cpOworc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZyk7CiBzdGF0aWMgaW50IHA4MDIxMXJlcV9taWJzZXRfbWliZ2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0X3QgKm1pYl9tc2csCisJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgKm1pYl9tc2csCiAJCQkJICAgaW50IGlzZ2V0KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05Niw3ICs5Niw3IEBACiBpbnQgcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX3QgKm1zZyA9IChwODAyMTFtc2dfdCAqKSBtc2didWY7CisJc3RydWN0IHA4MDIxMW1zZyAqbXNnID0gKHN0cnVjdCBwODAyMTFtc2cgKikgbXNnYnVmOwogCiAJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBNU0QgaXMgcnVubmluZyAqLwogCWlmICghKCh3bGFuZGV2LT5tc2RzdGF0ZSA9PSBXTEFOX01TRF9IV1BSRVNFTlQgJiYKQEAgLTE1MCwxMyArMTUwLDEzIEBACiAqIENhbGwgY29udGV4dDoKICoJUHJvY2VzcyB0aHJlYWQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHA4MDIxMW1zZ190ICptc2cpCitzdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlbXNnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQogewogCXN3aXRjaCAobXNnLT5tc2djb2RlKSB7CiAKIAljYXNlIERJRG1zZ19sbnhyZXFfaG9zdHdlcDp7Ci0JCQlwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXBfdCAqcmVxID0KLQkJCSAgICAocDgwMjExbXNnX2xueHJlcV9ob3N0d2VwX3QgKikgbXNnOworCQkJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCAqcmVxID0KKwkJCSAgICAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCAqKSBtc2c7CiAJCQl3bGFuZGV2LT5ob3N0d2VwICY9CiAJCQkgICAgfihIT1NUV0VQX0RFQ1JZUFQgfCBIT1NUV0VQX0VOQ1JZUFQpOwogCQkJaWYgKHJlcS0+ZGVjcnlwdC5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkKQEAgLTE2OSw4ICsxNjksOCBAQAogCWNhc2UgRElEbXNnX2RvdDExcmVxX21pYmdldDoKIAljYXNlIERJRG1zZ19kb3QxMXJlcV9taWJzZXQ6ewogCQkJaW50IGlzZ2V0ID0gKG1zZy0+bXNnY29kZSA9PSBESURtc2dfZG90MTFyZXFfbWliZ2V0KTsKLQkJCXA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXRfdCAqbWliX21zZyA9Ci0JCQkgICAgKHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXRfdCAqKSBtc2c7CisJCQlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqbWliX21zZyA9CisJCQkgICAgKHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0ICopIG1zZzsKIAkJCXA4MDIxMXJlcV9taWJzZXRfbWliZ2V0KHdsYW5kZXYsIG1pYl9tc2csIGlzZ2V0KTsKIAkJfQogCWRlZmF1bHQ6CkBAIC0xODEsNyArMTgxLDcgQEAKIH0KIAogc3RhdGljIGludCBwODAyMTFyZXFfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldF90ICptaWJfbXNnLAorCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0ICptaWJfbXNnLAogCQkJCSAgIGludCBpc2dldCkKIHsKIAlwODAyMTFpdGVtZF90ICptaWJpdGVtID0gKHA4MDIxMWl0ZW1kX3QgKikgbWliX21zZy0+bWliYXR0cmlidXRlLmRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzE5NGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2V4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MCArMCwwIEBACi0vKiBzcmMvcDgwMjExL3A4MDIxMXdleHQuYwotKgotKiBHbHVlIGNvZGUgdG8gbWFrZSBsaW51eC13bGFuLW5nIGEgaGFwcHkgd2lyZWxlc3MgZXh0ZW5zaW9uIGNhbXBlci4KLSoKLSogb3JpZ2luYWwgYXV0aG9yOiAgUmV5ayBGbG9ldGVyIDxyZXlrQHN5bmFjay5kZT4KLSogQ29tcGxldGVseSByZS13cml0dGVuIGJ5IFNvbG9tb24gUGVhY2h5IDxzb2xvbW9uQGxpbnV4LXdsYW4uY29tPgotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDIgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogU3lzdGVtIEluY2x1ZGVzICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotCi0jaW5jbHVkZSAicDgwMjExdHlwZXMuaCIKLSNpbmNsdWRlICJwODAyMTFoZHIuaCIKLSNpbmNsdWRlICJwODAyMTFjb252LmgiCi0jaW5jbHVkZSAicDgwMjExbWdtdC5oIgotI2luY2x1ZGUgInA4MDIxMW1zZy5oIgotI2luY2x1ZGUgInA4MDIxMW1ldGFzdHJ1Y3QuaCIKLSNpbmNsdWRlICJwODAyMTFtZXRhZGVmLmgiCi0jaW5jbHVkZSAicDgwMjExbmV0ZGV2LmgiCi0jaW5jbHVkZSAicDgwMjExaW9jdGwuaCIKLSNpbmNsdWRlICJwODAyMTFyZXEuaCIKLQotc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd3JhdGUobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpOwotc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2Vzc2lkKG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKTsKLQotc3RhdGljIHU4IHA4MDIxMV9taHpfdG9fY2hhbm5lbCh1MTYgbWh6KQotewotCWlmIChtaHogPj0gNTAwMCkKLQkJcmV0dXJuIChtaHogLSA1MDAwKSAvIDU7Ci0KLQlpZiAobWh6ID09IDI0ODQpCi0JCXJldHVybiAxNDsKLQotCWlmIChtaHogPj0gMjQwNykKLQkJcmV0dXJuIChtaHogLSAyNDA3KSAvIDU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUxNiBwODAyMTFfY2hhbm5lbF90b19taHoodTggY2gsIGludCBkb3QxMWEpCi17Ci0KLQlpZiAoY2ggPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNoID4gMjAwKQotCQlyZXR1cm4gMDsKLQotCS8qIDVHICovCi0JaWYgKGRvdDExYSkKLQkJcmV0dXJuIDUwMDAgKyAoNSAqIGNoKTsKLQotCS8qIDIuNEcgKi8KLQlpZiAoY2ggPT0gMTQpCi0JCXJldHVybiAyNDg0OwotCi0JaWYgKChjaCA8IDE0KSAmJiAoY2ggPiAwKSkKLQkJcmV0dXJuIDI0MDcgKyAoNSAqIGNoKTsKLQotCXJldHVybiAwOwotfQotCi0vKiB0YWtlbiBmcm9tIG9yaW5vY28uYyA7LSkgKi8KLXN0YXRpYyBjb25zdCBsb25nIHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxW10gPSB7Ci0JMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKLQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0Ci19OwotCi0jZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxKQotCi0vKiBzdGVhbCBhIHNwYXJlIGJpdCB0byBzdG9yZSB0aGUgc2hhcmVkL29wZW5zeXN0ZW1zIHN0YXRlLgotICAgc2hvdWxkIGRlZmF1bHQgdG8gb3BlbiBpZiBub3Qgc2V0ICovCi0jZGVmaW5lIEhPU1RXRVBfU0hBUkVES0VZIEJJVCgzKQotCi1zdGF0aWMgaW50IHF1YWxfYXNfcGVyY2VudChpbnQgc25yKQotewotCWlmIChzbnIgPD0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHNuciA8PSA0MCkKLQkJcmV0dXJuIHNuciAqIDUgLyAyOwotCXJldHVybiAxMDA7Ci19Ci0KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZGlkLCB1MzIgZGF0YSkKLXsKLQlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgbXNnOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgKm1pYml0ZW0gPQotCQkocDgwMjExaXRlbV91aW50MzJfdCAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7Ci0JaW50IHJlc3VsdDsKLQotCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKLQltZW1zZXQobWliaXRlbSwgMCwgc2l6ZW9mKCptaWJpdGVtKSk7Ci0JbWliaXRlbS0+ZGlkID0gZGlkOwotCW1pYml0ZW0tPmRhdGEgPSBkYXRhOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4ICopICZtc2cpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIGdldCBhIDMyIGJpdCBtaWIgdmFsdWUKLSAqLwotc3RhdGljIGludCBwODAyMTF3ZXh0X2dldG1pYih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBkaWQsIHUzMiAqZGF0YSkKLXsKLQlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgbXNnOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgKm1pYml0ZW0gPQotCQkocDgwMjExaXRlbV91aW50MzJfdCAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7Ci0JaW50IHJlc3VsdDsKLQotCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKLQltZW1zZXQobWliaXRlbSwgMCwgc2l6ZW9mKCptaWJpdGVtKSk7Ci0JbWliaXRlbS0+ZGlkID0gZGlkOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4ICopICZtc2cpOwotCWlmICghcmVzdWx0KQotCQkqZGF0YSA9IG1pYml0ZW0tPmRhdGE7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfYXV0b2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCXA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW5fdCBtc2c7Ci0Jc3RydWN0IGl3X3BvaW50IGRhdGE7Ci0JY2hhciBzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsKLQotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBHZXQgRVNTSUQgKi8KLQlyZXN1bHQgPSBwODAyMTF3ZXh0X2dpd2Vzc2lkKHdsYW5kZXYtPm5ldGRldiwgTlVMTCwgJmRhdGEsIHNzaWQpOwotCi0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1NIQVJFREtFWSkKLQkJbXNnLmF1dGh0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2F1dGhhbGdfc2hhcmVka2V5OwotCWVsc2UKLQkJbXNnLmF1dGh0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2F1dGhhbGdfb3BlbnN5c3RlbTsKLQotCW1zZy5tc2djb2RlID0gRElEbXNnX2xueHJlcV9hdXRvam9pbjsKLQotCS8qIFRyaW0gdGhlIGxhc3QgJ1wwJyB0byBmaXQgdGhlIFNTSUQgZm9ybWF0ICovCi0KLQlpZiAoZGF0YS5sZW5ndGggJiYgc3NpZFtkYXRhLmxlbmd0aCAtIDFdID09ICdcMCcpCi0JCWRhdGEubGVuZ3RoID0gZGF0YS5sZW5ndGggLSAxOwotCi0JbWVtY3B5KG1zZy5zc2lkLmRhdGEuZGF0YSwgc3NpZCwgZGF0YS5sZW5ndGgpOwotCW1zZy5zc2lkLmRhdGEubGVuID0gZGF0YS5sZW5ndGg7Ci0KLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQotCXJldHVybiBlcnI7Ci0KLX0KLQotLyogY2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcyAqLwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzKG5ldGRldmljZV90ICpkZXYpCi17Ci0JcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHlfdCBxdWFsaXR5OwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJndsYW5kZXYtPndzdGF0czsKLQlpbnQgcmV0dmFsOwotCi0JLyogQ2hlY2sgKi8KLQlpZiAoKHdsYW5kZXYgPT0gTlVMTCkgfHwgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX1JVTk5JTkcpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIFhYWCBPbmx5IHZhbGlkIGluIHN0YXRpb24gbW9kZSAqLwotCXdzdGF0cy0+c3RhdHVzID0gMDsKLQotCS8qIGJ1aWxkIHJlcXVlc3QgbWVzc2FnZSAqLwotCXF1YWxpdHkubXNnY29kZSA9IERJRG1zZ19sbnhyZXFfY29tbXNxdWFsaXR5OwotCXF1YWxpdHkuZGJtLmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX3RydWU7Ci0JcXVhbGl0eS5kYm0uc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JLyogc2VuZCBtZXNzYWdlIHRvIG5zZCAqLwotCWlmICh3bGFuZGV2LT5tbG1lcmVxdWVzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHZhbCA9IHdsYW5kZXYtPm1sbWVyZXF1ZXN0KHdsYW5kZXYsIChwODAyMTFtc2dfdCAqKSAmcXVhbGl0eSk7Ci0KLQl3c3RhdHMtPnF1YWwucXVhbCA9IHF1YWxfYXNfcGVyY2VudChxdWFsaXR5LmxpbmsuZGF0YSk7CS8qIG92ZXJhbGwgbGluayBxdWFsaXR5ICovCi0Jd3N0YXRzLT5xdWFsLmxldmVsID0gcXVhbGl0eS5sZXZlbC5kYXRhOwkvKiBpbnN0YW50IHNpZ25hbCBsZXZlbCAqLwotCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHF1YWxpdHkubm9pc2UuZGF0YTsJLyogaW5zdGFudCBub2lzZSBsZXZlbCAqLwotCi0Jd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07Ci0Jd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSB3bGFuZGV2LT5yeC5kZWNyeXB0X2VycjsKLQl3c3RhdHMtPmRpc2NhcmQubndpZCA9IDA7Ci0Jd3N0YXRzLT5kaXNjYXJkLm1pc2MgPSAwOwotCi0Jd3N0YXRzLT5kaXNjYXJkLmZyYWdtZW50ID0gMDsJLyogaW5jb21wbGV0ZSBmcmFnbWVudHMgKi8KLQl3c3RhdHMtPmRpc2NhcmQucmV0cmllcyA9IDA7CS8qIHR4IHJldHJpZXMuICovCi0Jd3N0YXRzLT5taXNzLmJlYWNvbiA9IDA7Ci0KLQlyZXR1cm4gd3N0YXRzOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3bmFtZShuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBpd19wYXJhbSByYXRlOwotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0KLQlyZXN1bHQgPSBwODAyMTF3ZXh0X2dpd3JhdGUoZGV2LCBOVUxMLCAmcmF0ZSwgTlVMTCk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKHJhdGUudmFsdWUpIHsKLQljYXNlIDEwMDAwMDA6Ci0JY2FzZSAyMDAwMDAwOgotCQlzdHJjcHkobmFtZSwgIklFRUUgODAyLjExLURTIik7Ci0JCWJyZWFrOwotCWNhc2UgNTUwMDAwMDoKLQljYXNlIDExMDAwMDAwOgotCQlzdHJjcHkobmFtZSwgIklFRUUgODAyLjExLWIiKTsKLQkJYnJlYWs7Ci0JfQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3ZnJlcShuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJlc3VsdDsKLQlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgdmFsdWU7Ci0KLQlyZXN1bHQgPSBwODAyMTF3ZXh0X2dldG1pYih3bGFuZGV2LAotCQkJCSAgIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsLAotCQkJCSAgICZ2YWx1ZSk7Ci0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHZhbHVlID4gTlVNX0NIQU5ORUxTKSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBjb252ZXJ0IGludG8gZnJlcXVlbmN5IGluc3RlYWQgb2YgYSBjaGFubmVsICovCi0JZnJlcS0+ZSA9IDE7Ci0JZnJlcS0+bSA9IHA4MDIxMV9jaGFubmVsX3RvX21oeih2YWx1ZSwgMCkgKiAxMDAwMDA7Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd2ZyZXEobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCi0JaWYgKCF3bGFuX3dleHRfd3JpdGUpIHsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCi0JCXZhbHVlID0gZnJlcS0+bTsKLQllbHNlCi0JCXZhbHVlID0gcDgwMjExX21oel90b19jaGFubmVsKGZyZXEtPm0pOwotCi0JcmVzdWx0ID0gcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCSAgICAgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWwsCi0JCQkgICAgIHZhbHVlKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3bW9kZShuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0KLQlzd2l0Y2ggKHdsYW5kZXYtPm1hY21vZGUpIHsKLQljYXNlIFdMQU5fTUFDTU9ERV9JQlNTX1NUQToKLQkJKm1vZGUgPSBJV19NT0RFX0FESE9DOwotCQlicmVhazsKLQljYXNlIFdMQU5fTUFDTU9ERV9FU1NfU1RBOgotCQkqbW9kZSA9IElXX01PREVfSU5GUkE7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9NQUNNT0RFX0VTU19BUDoKLQkJKm1vZGUgPSBJV19NT0RFX01BU1RFUjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogTm90IHNldCB5ZXQuICovCi0JCSptb2RlID0gSVdfTU9ERV9BVVRPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3bW9kZShuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJlc3VsdDsKLQlpbnQgZXJyID0gMDsKLQotCWlmICghd2xhbl93ZXh0X3dyaXRlKSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKCptb2RlICE9IElXX01PREVfQURIT0MgJiYgKm1vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgotCSAgICAqbW9kZSAhPSBJV19NT0RFX01BU1RFUikgewotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogT3BlcmF0aW9uIG1vZGUgaXMgdGhlIHNhbWUgd2l0aCBjdXJyZW50IG1vZGUgKi8KLQlpZiAoKm1vZGUgPT0gd2xhbmRldi0+bWFjbW9kZSkKLQkJZ290byBleGl0OwotCi0Jc3dpdGNoICgqbW9kZSkgewotCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9JQlNTX1NUQTsKLQkJYnJlYWs7Ci0JY2FzZSBJV19NT0RFX0lORlJBOgotCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX0VTU19TVEE7Ci0JCWJyZWFrOwotCWNhc2UgSVdfTU9ERV9NQVNURVI6Ci0JCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfRVNTX0FQOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBOb3Qgc2V0IHlldC4gKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiT3BlcmF0aW9uIG1vZGU6ICVkIG5vdCBzdXBwb3J0XG4iLCAqbW9kZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQkvKiBTZXQgT3BlcmF0aW9uIG1vZGUgdG8gdGhlIFBPUlQgVFlQRSBSSUQgKi8KLQlyZXN1bHQgPSBwODAyMTF3ZXh0X3NldG1pYih3bGFuZGV2LAotCQkJCURJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBvcnRUeXBlLAotCQkJCSgqbW9kZSA9PSBJV19NT0RFX0FESE9DKSA/IDAgOiAxKTsKLQlpZiAocmVzdWx0KQotCQllcnIgPSAtRUZBVUxUOwotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3cmFuZ2UobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKLQlpbnQgaSwgdmFsOwotCi0JLyogZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgc2V0IHNpemUgYW5kIHplcm8gZXZlcnl0aGluZyB3ZSBkb24ndCB1bmRlcnN0YW5kICovCi0JZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7Ci0KLQlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOwotCS8qIFhYWCB3aGF0IGFib3V0IG1pbi9tYXhfcG1wLCBtaW4vbWF4X3BtdCwgZXRjLiAqLwotCi0JcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7Ci0JcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTM7Ci0KLQlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5taW5fcmV0cnkgPSAwOwotCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0KLQlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8CS8qIG1vZGUvZnJlcS9zc2lkICovCi0JCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAotCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOwotCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CS8qIGVuY29kZSAqLwotCXJhbmdlLT5ldmVudF9jYXBhWzRdID0gKElXX0VWRU5UX0NBUEFfTUFTSyhJV0VWUVVBTCkgfAotCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhJV0VWQ1VTVE9NKSk7Ci0KLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOwotCi0JLyogWFhYIG5lZWQgdG8gZmlsdGVyIGFnYWluc3QgdGhlIHJlZ3VsYXRvcnkgZG9tYWluICZ8IGFjdGl2ZSBzZXQgKi8KLQl2YWwgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewotCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBpICsgMTsKLQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gcDgwMjExd2V4dF9jaGFubmVsX2ZyZXFbaV0gKiAxMDAwMDA7Ci0JCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7Ci0JCXZhbCsrOwotCX0KLQotCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOwotCi0JLyogTWF4IG9mIC9wcm9jL25ldC93aXJlbGVzcyAqLwotCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7Ci0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKLQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOwotCS8qIFhYWCB0aGVzZSBuZWVkIHRvIGJlIG5zZC1zcGVjaWZpYyEgKi8KLQotCXJhbmdlLT5taW5fcnRzID0gMDsKLQlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7Ci0JcmFuZ2UtPm1pbl9mcmFnID0gMjU2OwotCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7Ci0KLQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5VTV9XRVBLRVlTOwotCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOwotCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOwotCi0JLyogWFhYIHdoYXQgYWJvdXQgbnVtX2JpdHJhdGVzL3Rocm91Z2hwdXQ/ICovCi0JcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDA7Ci0KLQkvKiBlc3RpbWF0ZWQgbWF4IHRocm91Z2hwdXQgKi8KLQkvKiBYWFggbmVlZCB0byBjYXAgaXQgaWYgd2UncmUgcnVubmluZyBhdCB+Mk1icHMuLiAqLwotCXJhbmdlLT50aHJvdWdocHV0ID0gNTUwMDAwMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3YXAobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCi17Ci0KLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0KLQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgd2xhbmRldi0+YnNzaWQsIFdMQU5fQlNTSURfTEVOKTsKLQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2VuY29kZShuZXRkZXZpY2VfdCAqZGV2LAotCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7Ci0KLQlpID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQllcnEtPmZsYWdzID0gMDsKLQotCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9QUklWQUNZSU5WT0tFRCkKLQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKLQllbHNlCi0JCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwotCi0JaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCkKLQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKLQllbHNlCi0JCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47Ci0KLQlpID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQotCWlmIChpID09IC0xKQotCQlpID0gd2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVGQVVMVEtFWV9NQVNLOwotCi0JaWYgKChpIDwgMCkgfHwgKGkgPj0gTlVNX1dFUEtFWVMpKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQllcnEtPmZsYWdzIHw9IGkgKyAxOwotCi0JLyogY29weSB0aGUga2V5IGZyb20gdGhlIGRyaXZlciBjYWNoZSBhcyB0aGUga2V5cyBhcmUgcmVhZC1vbmx5IE1JQnMgKi8KLQllcnEtPmxlbmd0aCA9IHdsYW5kZXYtPndlcF9rZXlsZW5zW2ldOwotCW1lbWNweShrZXksIHdsYW5kZXYtPndlcF9rZXlzW2ldLCBlcnEtPmxlbmd0aCk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd2VuY29kZShuZXRkZXZpY2VfdCAqZGV2LAotCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90IG1zZzsKLQlwODAyMTFpdGVtX3BzdHIzMl90IHBzdHI7Ci0KLQlpbnQgZXJyID0gMDsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgaTsKLQotCWlmICghd2xhbl93ZXh0X3dyaXRlKSB7Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBDaGVjayB0aGUgS2V5IGluZGV4IGZpcnN0LiAqLwotCWkgPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCk7Ci0JaWYgKGkpIHsKLQkJaWYgKChpIDwgMSkgfHwgKGkgPiBOVU1fV0VQS0VZUykpIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0gZWxzZSB7Ci0JCQlpLS07Ci0JCX0KLQkJLyogU2V0IGN1cnJlbnQga2V5IG51bWJlciBvbmx5IGlmIG5vIGtleXMgYXJlIGdpdmVuICovCi0JCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSB7Ci0JCQlyZXN1bHQgPQotCQkJCXA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJCQkgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwKLQkJCQkJCSAgaSk7Ci0KLQkJCWlmIChyZXN1bHQpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCi0JfSBlbHNlIHsKLQkJLyogVXNlIGRlZmF1bHRrZXkgaWYgbm8gS2V5IEluZGV4ICovCi0JCWkgPSB3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9ERUZBVUxUS0VZX01BU0s7Ci0JfQotCi0JLyogQ2hlY2sgaWYgdGhlcmUgaXMgbm8ga2V5IGluZm9ybWF0aW9uIGluIHRoZSBpd2NvbmZpZyByZXF1ZXN0ICovCi0JaWYgKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSA9PSAwKSB7Ci0KLQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJICogSWYgdGhlcmUgaXMgV0VQIEtleSBmb3Igc2V0dGluZywgY2hlY2sgdGhlIEtleSBJbmZvcm1hdGlvbgotCQkgKiBhbmQgdGhlbiBzZXQgaXQgdG8gdGhlIGZpcm13YXJlLgotCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQkJaWYgKGVycS0+bGVuZ3RoID4gMCkgewotCQkJLyogY29weSB0aGUga2V5IGZyb20gdGhlIGRyaXZlciBjYWNoZSBhcyB0aGUga2V5cyBhcmUgcmVhZC1vbmx5IE1JQnMgKi8KLQkJCXdsYW5kZXYtPndlcF9rZXlsZW5zW2ldID0gZXJxLT5sZW5ndGg7Ci0JCQltZW1jcHkod2xhbmRldi0+d2VwX2tleXNbaV0sIGtleSwgZXJxLT5sZW5ndGgpOwotCi0JCQkvKiBQcmVwYXJlIGRhdGEgc3RydXR1cmUgZm9yIHA4MDIxMXJlcV9kb3JlcXVlc3QuICovCi0JCQltZW1jcHkocHN0ci5kYXRhLmRhdGEsIGtleSwgZXJxLT5sZW5ndGgpOwotCQkJcHN0ci5kYXRhLmxlbiA9IGVycS0+bGVuZ3RoOwotCi0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgMDoKLQkJCQlwc3RyLmRpZCA9Ci0JCQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOgotCQkJCXBzdHIuZGlkID0KLQkJCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDI6Ci0JCQkJcHN0ci5kaWQgPQotCQkJCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMzoKLQkJCQlwc3RyLmRpZCA9Ci0JCQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MzsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQotCQkJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwotCQkJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZwc3RyLCBzaXplb2YocHN0cikpOwotCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikgJm1zZyk7Ci0KLQkJCWlmIChyZXN1bHQpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyogQ2hlY2sgdGhlIFByaXZhY3lJbnZva2VkIGZsYWcgKi8KLQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewotCQlyZXN1bHQgPQotCQkgICAgcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCQkJIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLAotCQkJCQkgUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0KLQkJICAgIHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJCSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZCwKLQkJCQkJIFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSk7Ci0JfQotCi0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogIFRoZSAgc2VjdXJpdHkgIG1vZGUgIG1heSAgYmUgb3BlbiBvciByZXN0cmljdGVkLCBhbmQgaXRzIG1lYW5pbmcKLQkgICBkZXBlbmRzIG9uIHRoZSBjYXJkIHVzZWQuIFdpdGggIG1vc3QgIGNhcmRzLCAgaW4gIG9wZW4gIG1vZGUgIG5vCi0JICAgYXV0aGVudGljYXRpb24gIGlzICB1c2VkICBhbmQgIHRoZSAgY2FyZCAgbWF5ICBhbHNvICBhY2NlcHQgbm9uLQotCSAgIGVuY3J5cHRlZCBzZXNzaW9ucywgd2hlcmVhcyBpbiByZXN0cmljdGVkICBtb2RlICBvbmx5ICBlbmNyeXB0ZWQKLQkgICBzZXNzaW9ucyAgYXJlICBhY2NlcHRlZCAgYW5kIHRoZSBjYXJkIHdpbGwgdXNlIGF1dGhlbnRpY2F0aW9uIGlmCi0JICAgYXZhaWxhYmxlLgotCSAqLwotCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHsKLQkJcmVzdWx0ID0KLQkJICAgIHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJCSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQsCi0JCQkJCSBQODAyMTFFTlVNX3RydXRoX3RydWUpOwotCX0gZWxzZSBpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7Ci0JCXJlc3VsdCA9Ci0JCSAgICBwODAyMTF3ZXh0X3NldG1pYih3bGFuZGV2LAotCQkJCQkgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkLAotCQkJCQkgUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7Ci0JfQotCi0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2Vzc2lkKG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQotCWlmICh3bGFuZGV2LT5zc2lkLmxlbikgewotCQlkYXRhLT5sZW5ndGggPSB3bGFuZGV2LT5zc2lkLmxlbjsKLQkJZGF0YS0+ZmxhZ3MgPSAxOwotCQltZW1jcHkoZXNzaWQsIHdsYW5kZXYtPnNzaWQuZGF0YSwgZGF0YS0+bGVuZ3RoKTsKLQkJZXNzaWRbZGF0YS0+bGVuZ3RoXSA9IDA7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KGVzc2lkLCAwLCBzaXplb2Yod2xhbmRldi0+c3NpZC5kYXRhKSk7Ci0JCWRhdGEtPmxlbmd0aCA9IDA7Ci0JCWRhdGEtPmZsYWdzID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd2Vzc2lkKG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luX3QgbXNnOwotCi0JaW50IHJlc3VsdDsKLQlpbnQgZXJyID0gMDsKLQlpbnQgbGVuZ3RoID0gZGF0YS0+bGVuZ3RoOwotCi0JaWYgKCF3bGFuX3dleHRfd3JpdGUpIHsKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9TSEFSRURLRVkpCi0JCW1zZy5hdXRodHlwZS5kYXRhID0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleTsKLQllbHNlCi0JCW1zZy5hdXRodHlwZS5kYXRhID0gUDgwMjExRU5VTV9hdXRoYWxnX29wZW5zeXN0ZW07Ci0KLQltc2cubXNnY29kZSA9IERJRG1zZ19sbnhyZXFfYXV0b2pvaW47Ci0KLQkvKiBUcmltIHRoZSBsYXN0ICdcMCcgdG8gZml0IHRoZSBTU0lEIGZvcm1hdCAqLwotCWlmIChsZW5ndGggJiYgZXNzaWRbbGVuZ3RoIC0gMV0gPT0gJ1wwJykKLQkJbGVuZ3RoLS07Ci0KLQltZW1jcHkobXNnLnNzaWQuZGF0YS5kYXRhLCBlc3NpZCwgbGVuZ3RoKTsKLQltc2cuc3NpZC5kYXRhLmxlbiA9IGxlbmd0aDsKLQotCXByX2RlYnVnKCJhdXRvam9pbl9zc2lkIGZvciAlcyBcbiIsIGVzc2lkKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKLQlwcl9kZWJ1ZygiYXV0b2pvaW5fc3NpZCAlZFxuIiwgcmVzdWx0KTsKLQotCWlmIChyZXN1bHQpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3Y29tbWl0KG5ldGRldmljZV90ICpkZXYsCi0JCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlpbnQgZXJyID0gMDsKLQotCWlmICghd2xhbl93ZXh0X3dyaXRlKSB7Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBBdXRvIEpvaW4gKi8KLQllcnIgPSBwODAyMTF3ZXh0X2F1dG9qb2luKHdsYW5kZXYpOwotCi1leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdyYXRlKG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlpbnQgcmVzdWx0OwotCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCXJlc3VsdCA9IHA4MDIxMXdleHRfZ2V0bWliKHdsYW5kZXYsIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUsICZ2YWx1ZSk7Ci0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcnJxLT5maXhlZCA9IDA7CQkvKiBjYW4gaXQgY2hhbmdlPyAqLwotCXJycS0+ZGlzYWJsZWQgPSAwOwotCXJycS0+dmFsdWUgPSAwOwotCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMQkJCSgodTE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMgkJCSgodTE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfNWRvdDUJCQkoKHUxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzExCQkJKCh1MTYpOCkKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIEhGQTM4NHhfUkFURUJJVF8xOgotCQlycnEtPnZhbHVlID0gMTAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBIRkEzODR4X1JBVEVCSVRfMjoKLQkJcnJxLT52YWx1ZSA9IDIwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgSEZBMzg0eF9SQVRFQklUXzVkb3Q1OgotCQlycnEtPnZhbHVlID0gNTUwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBIRkEzODR4X1JBVEVCSVRfMTE6Ci0JCXJycS0+dmFsdWUgPSAxMTAwMDAwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQl9Ci1leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdydHMobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlpbnQgcmVzdWx0OwotCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCXJlc3VsdCA9IHA4MDIxMXdleHRfZ2V0bWliKHdsYW5kZXYsCi0JCQkJICAgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQsCi0JCQkJICAgJnZhbHVlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlydHMtPnZhbHVlID0gdmFsdWU7Ci0JcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IDIzNDcpOwotCXJ0cy0+Zml4ZWQgPSAxOwotCi1leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9zaXdydHMobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlpbnQgcmVzdWx0OwotCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCWlmICghd2xhbl93ZXh0X3dyaXRlKSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHJ0cy0+ZGlzYWJsZWQpCi0JCXZhbHVlID0gMjM0NzsKLQllbHNlCi0JCXZhbHVlID0gcnRzLT52YWx1ZTsKLQotCXJlc3VsdCA9IHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJICAgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQsCi0JCQkJICAgdmFsdWUpOwotCWlmIChyZXN1bHQpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3ZnJhZyhuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCi0JcmVzdWx0ID0gcDgwMjExd2V4dF9nZXRtaWIod2xhbmRldiwKLQkJCQkgICBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQsCi0JCQkJICAgJnZhbHVlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlmcmFnLT52YWx1ZSA9IHZhbHVlOwotCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IDIzNDYpOwotCWZyYWctPmZpeGVkID0gMTsKLQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3ZnJhZyhuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0JaW50IHZhbHVlOwotCi0JaWYgKCF3bGFuX3dleHRfd3JpdGUpIHsKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChmcmFnLT5kaXNhYmxlZCkKLQkJdmFsdWUgPSAyMzQ2OwotCWVsc2UKLQkJdmFsdWUgPSBmcmFnLT52YWx1ZTsKLQotCXJlc3VsdCA9IHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCSAgIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKLQkJCQkgICAgICB2YWx1ZSk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotI2lmbmRlZiBJV19SRVRSWV9MT05HCi0jZGVmaW5lIElXX1JFVFJZX0xPTkcgSVdfUkVUUllfTUFYCi0jZW5kaWYKLQotI2lmbmRlZiBJV19SRVRSWV9TSE9SVAotI2RlZmluZSBJV19SRVRSWV9TSE9SVCBJV19SRVRSWV9NSU4KLSNlbmRpZgotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3cmV0cnkobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IHJlc3VsdDsKLQlpbnQgZXJyID0gMDsKLQl1MTYgc2hvcnRyZXRyeSwgbG9uZ3JldHJ5LCBsaWZldGltZTsKLQl1bnNpZ25lZCBpbnQgdmFsdWU7Ci0KLQlyZXN1bHQgPSBwODAyMTF3ZXh0X2dldG1pYih3bGFuZGV2LAotCQkJCSAgIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRSZXRyeUxpbWl0LAotCQkJCSAgICZ2YWx1ZSk7Ci0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc2hvcnRyZXRyeSA9IHZhbHVlOwotCi0JcmVzdWx0ID0gcDgwMjExd2V4dF9nZXRtaWIod2xhbmRldiwKLQkJCQkgICBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUxvbmdSZXRyeUxpbWl0LAotCQkJCSAgICZ2YWx1ZSk7Ci0JaWYgKHJlc3VsdCkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JbG9uZ3JldHJ5ID0gdmFsdWU7Ci0KLQlyZXN1bHQgPSBwODAyMTF3ZXh0X2dldG1pYih3bGFuZGV2LAotCQkJCSAgIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4VHJhbnNtaXRNU0RVTGlmZXRpbWUsCi0JCQkJICAgJnZhbHVlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlsaWZldGltZSA9IHZhbHVlOwotCi0JcnJxLT5kaXNhYmxlZCA9IDA7Ci0KLQlpZiAoKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9UWVBFKSA9PSBJV19SRVRSWV9MSUZFVElNRSkgewotCQlycnEtPmZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7Ci0JCXJycS0+dmFsdWUgPSBsaWZldGltZSAqIDEwMjQ7Ci0JfSBlbHNlIHsKLQkJaWYgKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9MT05HKSB7Ci0JCQlycnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MT05HOwotCQkJcnJxLT52YWx1ZSA9IGxvbmdyZXRyeTsKLQkJfSBlbHNlIHsKLQkJCXJycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKLQkJCXJycS0+dmFsdWUgPSBzaG9ydHJldHJ5OwotCQkJaWYgKHNob3J0cmV0cnkgIT0gbG9uZ3JldHJ5KQotCQkJCXJycS0+ZmxhZ3MgfD0gSVdfUkVUUllfU0hPUlQ7Ci0JCX0KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLQotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3cmV0cnkobmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBtaWJpdGVtOwotCXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCBtc2c7Ci0JaW50IHJlc3VsdDsKLQlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgdmFsdWU7Ci0KLQlpZiAoIXdsYW5fd2V4dF93cml0ZSkgewotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHJycS0+ZGlzYWJsZWQpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKLQotCWlmICgocnJxLT5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09IElXX1JFVFJZX0xJRkVUSU1FKSB7Ci0KLQkJdmFsdWUgPSBycnEtPnZhbHVlIC89IDEwMjQ7Ci0JCXJlc3VsdCA9IHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJCSAgIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4VHJhbnNtaXRNU0RVTGlmZXRpbWUsCi0JCQkJCSAgIHZhbHVlKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChycnEtPmZsYWdzICYgSVdfUkVUUllfTE9ORykgewotCQkJcmVzdWx0ID0gcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCQkJCSAgIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTG9uZ1JldHJ5TGltaXQsCi0JCQkJCQkgICBycnEtPnZhbHVlKTsKLQotCQkJaWYgKHJlc3VsdCkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0KLQkJaWYgKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9TSE9SVCkgewotCQkJcmVzdWx0ID0gcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCQkJCSAgIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRSZXRyeUxpbWl0LAotCQkJCQkJICAgcnJxLT52YWx1ZSk7Ci0KLQkJCWlmIChyZXN1bHQpIHsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCX0KLQotZXhpdDoKLQlyZXR1cm4gZXJyOwotCi19Ci0KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9zaXd0eHBvdyhuZXRkZXZpY2VfdCAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG1pYml0ZW07Ci0JcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90IG1zZzsKLQlpbnQgcmVzdWx0OwotCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCWlmICghd2xhbl93ZXh0X3dyaXRlKSB7Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocnJxLT5maXhlZCA9PSAwKQotCQl2YWx1ZSA9IDMwOwotCWVsc2UKLQkJdmFsdWUgPSBycnEtPnZhbHVlOwotCXJlc3VsdCA9IHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJICAgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbCwKLQkJCQkgICB2YWx1ZSk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd3R4cG93KG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCi0JcmVzdWx0ID0gcDgwMjExd2V4dF9nZXRtaWIod2xhbmRldiwKLQkJCQkgICBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsLAotCQkJCSAgICZ2YWx1ZSk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBYWFggaGFuZGxlIE9GRiBieSBzZXR0aW5nIGRpc2FibGVkID0gMTsgKi8KLQotCXJycS0+ZmxhZ3MgPSAwOwkJLyogSVdfVFhQT1dfREJNOyAqLwotCXJycS0+ZGlzYWJsZWQgPSAwOwotCXJycS0+Zml4ZWQgPSAwOwotCXJycS0+dmFsdWUgPSB2YWx1ZTsKLQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3c3B5KG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHN0cnVjdCBpd19wb2ludCAqc3JxLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IHNvY2thZGRyIGFkZHJlc3NbSVdfTUFYX1NQWV07Ci0JaW50IG51bWJlciA9IHNycS0+bGVuZ3RoOwotCWludCBpOwotCi0JLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBidWZmZXIgKi8KLQltZW1jcHkoYWRkcmVzcywgZXh0cmEsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbnVtYmVyKTsKLQotCXdsYW5kZXYtPnNweV9udW1iZXIgPSAwOwotCi0JaWYgKG51bWJlciA+IDApIHsKLQotCQkvKiBleHRyYWN0IHRoZSBhZGRyZXNzZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0KLQkJCW1lbWNweSh3bGFuZGV2LT5zcHlfYWRkcmVzc1tpXSwgYWRkcmVzc1tpXS5zYV9kYXRhLAotCQkJICAgICAgIEVUSF9BTEVOKTsKLQkJfQotCi0JCS8qIHJlc2V0IHN0YXRzICovCi0JCW1lbXNldCh3bGFuZGV2LT5zcHlfc3RhdCwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKLQotCQkvKiBzZXQgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLwotCQl3bGFuZGV2LT5zcHlfbnVtYmVyID0gbnVtYmVyOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBqa3JpZWdsOiBmcm9tIG9yaW5vY28sIG1vZGlmaWVkICovCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3c3B5KG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHN0cnVjdCBpd19wb2ludCAqc3JxLCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0KLQlzdHJ1Y3Qgc29ja2FkZHIgYWRkcmVzc1tJV19NQVhfU1BZXTsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSBzcHlfc3RhdFtJV19NQVhfU1BZXTsKLQlpbnQgbnVtYmVyOwotCWludCBpOwotCi0JbnVtYmVyID0gd2xhbmRldi0+c3B5X251bWJlcjsKLQotCWlmIChudW1iZXIgPiAwKSB7Ci0KLQkJLyogcG9wdWxhdGUgYWRkcmVzcyBhbmQgc3B5IHN0cnVjdCdzICovCi0JCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQkJbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwgd2xhbmRldi0+c3B5X2FkZHJlc3NbaV0sCi0JCQkgICAgICAgRVRIX0FMRU4pOwotCQkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBRl9VTklYOwotCQkJbWVtY3B5KCZzcHlfc3RhdFtpXSwgJndsYW5kZXYtPnNweV9zdGF0W2ldLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOwotCQl9Ci0KLQkJLyogcmVzZXQgdXBkYXRlIGZsYWcgKi8KLQkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQkJd2xhbmRldi0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDA7Ci0JfQotCi0JLyogcHVzaCBzdHVmZiB0byB1c2VyIHNwYWNlICovCi0Jc3JxLT5sZW5ndGggPSBudW1iZXI7Ci0JbWVtY3B5KGV4dHJhLCBhZGRyZXNzLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlcik7Ci0JbWVtY3B5KGV4dHJhICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBudW1iZXIsIHNweV9zdGF0LAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogbnVtYmVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByaXNtMl9yZXN1bHQyZXJyKGludCBwcmlzbTJfcmVzdWx0KQotewotCWludCBlcnIgPSAwOwotCi0Jc3dpdGNoIChwcmlzbTJfcmVzdWx0KSB7Ci0JY2FzZSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOgotCQllcnIgPSAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOgotCQllcnIgPSAtRUlPOwotCQlicmVhazsKLQljYXNlIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOgotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd3NjYW4obmV0ZGV2aWNlX3QgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKnNycSwgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3QgbXNnOwotCWludCByZXN1bHQ7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGkgPSAwOwotCi0JaWYgKHdsYW5kZXYtPm1hY21vZGUgPT0gV0xBTl9NQUNNT0RFX0VTU19BUCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHNjYW4gaW4gQVAgbW9kZVxuIik7Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQltZW1zZXQoJm1zZywgMHgwMCwgc2l6ZW9mKHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3QpKTsKLQltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9zY2FuOwotCW1zZy5ic3N0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2Jzc3R5cGVfYW55OwotCi0JbWVtc2V0KCYobXNnLmJzc2lkLmRhdGEpLCAweEZGLCBzaXplb2YocDgwMjExaXRlbV9wc3RyNl90KSk7Ci0JbXNnLmJzc2lkLmRhdGEubGVuID0gNjsKLQotCW1zZy5zY2FudHlwZS5kYXRhID0gUDgwMjExRU5VTV9zY2FudHlwZV9hY3RpdmU7Ci0JbXNnLnByb2JlZGVsYXkuZGF0YSA9IDA7Ci0KLQlmb3IgKGkgPSAxOyBpIDw9IDE0OyBpKyspCi0JCW1zZy5jaGFubmVsbGlzdC5kYXRhLmRhdGFbaSAtIDFdID0gaTsKLQltc2cuY2hhbm5lbGxpc3QuZGF0YS5sZW4gPSAxNDsKLQotCW1zZy5tYXhjaGFubmVsdGltZS5kYXRhID0gMjUwOwotCW1zZy5taW5jaGFubmVsdGltZS5kYXRhID0gMjAwOwotCi0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikgJm1zZyk7Ci0JaWYgKHJlc3VsdCkKLQkJZXJyID0gcHJpc20yX3Jlc3VsdDJlcnIobXNnLnJlc3VsdGNvZGUuZGF0YSk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyogSGVscGVyIHRvIHRyYW5zbGF0ZSBzY2FuIGludG8gV2lyZWxlc3MgRXh0ZW5zaW9ucyBzY2FuIHJlc3VsdHMuCi0gKiBJbnNwaXJlZCBieSB0aGUgcHJpc201NCBjb2RlLCB3aGljaCB3YXMgaW4gdHVybiBpbnNwaXJlZCBieSB0aGUKLSAqIGFpcm8gZHJpdmVyIGNvZGUuCi0gKi8KLXN0YXRpYyBjaGFyICp3ZXh0X3RyYW5zbGF0ZV9ic3Moc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqY3VycmVudF9ldiwKLQkJCQljaGFyICplbmRfYnVmLAotCQkJCXA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHNfdCAqYnNzKQotewotCXN0cnVjdCBpd19ldmVudCBpd2U7CS8qIFRlbXBvcmFyeSBidWZmZXIgKi8KLQotCS8qIFRoZSBmaXJzdCBlbnRyeSBtdXN0IGJlIHRoZSBNQUMgYWRkcmVzcyAqLwotCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGJzcy0+YnNzaWQuZGF0YS5kYXRhLCBXTEFOX0JTU0lEX0xFTik7Ci0JaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JaXdlLmNtZCA9IFNJT0NHSVdBUDsKLQljdXJyZW50X2V2ID0KLQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKLQkJCQkgSVdfRVZfQUREUl9MRU4pOwotCi0JLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIG9yZGVyIHdlIGdpdmUgdGhlbSAqLwotCi0JLyogVGhlIEVTU0lELiAqLwotCWlmIChic3MtPnNzaWQuZGF0YS5sZW4gPiAwKSB7Ci0JCWNoYXIgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKLQkJaW50IHNpemU7Ci0KLQkJc2l6ZSA9Ci0JCSAgICBtaW5fdCh1bnNpZ25lZCBzaG9ydCwgSVdfRVNTSURfTUFYX1NJWkUsCi0JCQkgIGJzcy0+c3NpZC5kYXRhLmxlbik7Ci0JCW1lbXNldCgmZXNzaWQsIDAsIHNpemVvZihlc3NpZCkpOwotCQltZW1jcHkoJmVzc2lkLCBic3MtPnNzaWQuZGF0YS5kYXRhLCBzaXplKTsKLQkJcHJfZGVidWcoIiBlc3NpZCBzaXplID0gJWRcbiIsIHNpemUpOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IHNpemU7Ci0JCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOwotCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOwotCQljdXJyZW50X2V2ID0KLQkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCi0JCQkJCSAmZXNzaWRbMF0pOwotCQlwcl9kZWJ1ZygiIGVzc2lkIHNpemUgT0suXG4iKTsKLQl9Ci0KLQlzd2l0Y2ggKGJzcy0+YnNzdHlwZS5kYXRhKSB7Ci0JY2FzZSBQODAyMTFFTlVNX2Jzc3R5cGVfaW5mcmFzdHJ1Y3R1cmU6Ci0JCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKLQkJYnJlYWs7Ci0KLQljYXNlIFA4MDIxMUVOVU1fYnNzdHlwZV9pbmRlcGVuZGVudDoKLQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJaXdlLnUubW9kZSA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpd2UuY21kID0gU0lPQ0dJV01PREU7Ci0JaWYgKGl3ZS51Lm1vZGUpCi0JCWN1cnJlbnRfZXYgPQotCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKLQkJCQkJIElXX0VWX1VJTlRfTEVOKTsKLQotCS8qIEVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLwotCWlmIChic3MtPnByaXZhY3kuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpCi0JCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKLQllbHNlCi0JCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JaXdlLnUuZGF0YS5sZW5ndGggPSAwOwotCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOwotCWN1cnJlbnRfZXYgPQotCSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBOVUxMKTsKLQotCS8qIEFkZCBmcmVxdWVuY3kuIChzaG9ydCkgYnNzLT5jaGFubmVsIGlzIHRoZSBmcmVxdWVuY3kgaW4gTUh6ICovCi0JaXdlLnUuZnJlcS5tID0gYnNzLT5kc2NoYW5uZWwuZGF0YTsKLQlpd2UudS5mcmVxLmUgPSAwOwotCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKLQljdXJyZW50X2V2ID0KLQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKLQkJCQkgSVdfRVZfRlJFUV9MRU4pOwotCi0JLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLwotCWl3ZS51LnF1YWwubGV2ZWwgPSBic3MtPnNpZ25hbC5kYXRhOwotCWl3ZS51LnF1YWwubm9pc2UgPSBic3MtPm5vaXNlLmRhdGE7Ci0JLyogZG8gYSBzaW1wbGUgU05SIGZvciBxdWFsaXR5ICovCi0JaXdlLnUucXVhbC5xdWFsID0gcXVhbF9hc19wZXJjZW50KGJzcy0+c2lnbmFsLmRhdGEgLSBic3MtPm5vaXNlLmRhdGEpOwotCWl3ZS5jbWQgPSBJV0VWUVVBTDsKLQljdXJyZW50X2V2ID0KLQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKLQkJCQkgSVdfRVZfUVVBTF9MRU4pOwotCi0JcmV0dXJuIGN1cnJlbnRfZXY7Ci19Ci0KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdzY2FuKG5ldGRldmljZV90ICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpzcnEsIGNoYXIgKmV4dHJhKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzX3QgbXNnOwotCWludCByZXN1bHQgPSAwOwotCWludCBlcnIgPSAwOwotCWludCBpID0gMDsKLQlpbnQgc2Nhbl9nb29kID0gMDsKLQljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7Ci0KLQkvKiBTaW5jZSB3aXJlbGVzcyB0b29scyBkb2Vzbid0IHJlYWxseSBoYXZlIGEgd2F5IG9mIHBhc3NpbmcgaG93Ci0JICogbWFueSBzY2FuIHJlc3VsdHMgcmVzdWx0cyB0aGVyZSB3ZXJlIGJhY2sgaGVyZSwga2VlcCBncmFiYmluZyB0aGVtCi0JICogdW50aWwgd2UgZmFpbC4KLQkgKi8KLQlkbyB7Ci0JCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0JCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0czsKLQkJbXNnLmJzc2luZGV4LmRhdGEgPSBpOwotCi0JCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4ICopICZtc2cpOwotCQlpZiAoKHJlc3VsdCAhPSAwKSB8fAotCQkgICAgKG1zZy5yZXN1bHRjb2RlLmRhdGEgIT0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3MpKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCWN1cnJlbnRfZXYgPQotCQkgICAgd2V4dF90cmFuc2xhdGVfYnNzKGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJICAgICAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJm1zZyk7Ci0JCXNjYW5fZ29vZCA9IDE7Ci0JCWkrKzsKLQl9IHdoaWxlIChpIDwgSVdfTUFYX0FQKTsKLQotCXNycS0+bGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7Ci0Jc3JxLT5mbGFncyA9IDA7CQkvKiB0b2RvICovCi0KLQlpZiAocmVzdWx0ICYmICFzY2FuX2dvb2QpCi0JCWVyciA9IHByaXNtMl9yZXN1bHQyZXJyKG1zZy5yZXN1bHRjb2RlLmRhdGEpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyogZXh0cmEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBzdHVmZiB0byBzdXBwb3J0IE5ldHdvcmtNYW5hZ2VyIChJIGhvcGUpICovCi0KLS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7Ci0JcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90IG1zZzsKLQlwODAyMTFpdGVtX3BzdHIzMl90ICpwc3RyOwotCi0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKLQlpbnQgaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCi0JcHJfZGVidWcoInNldF9lbmNvZGVfZXh0IGZsYWdzWyVkXSBhbGdbJWRdIGtleWxlblslZF1cbiIsCi0JCSBleHQtPmV4dF9mbGFncywgKGludClleHQtPmFsZywgKGludClleHQtPmtleV9sZW4pOwotCi0JaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKLQkJLyogc2V0IGRlZmF1bHQga2V5ID8gSSdtIG5vdCBzdXJlIGlmIHRoaXMgdGhlIHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGhlcmUgKi8KLQotCQlpZiAoaWR4KSB7Ci0JCQlpZiAoaWR4IDwgMSB8fCBpZHggPiBOVU1fV0VQS0VZUykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQlpZHgtLTsKLQkJfQotCQlwcl9kZWJ1Zygic2V0dGluZyBkZWZhdWx0IGtleSAoJWQpXG4iLCBpZHgpOwotCQlyZXN1bHQgPQotCQkgICAgcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCQkJIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwKLQkJCQkJIGlkeCk7Ci0JCWlmIChyZXN1bHQpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKLQkJaWYgKGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKSB7Ci0JCQlwcl9kZWJ1ZygiYXNrZWQgdG8gc2V0IGEgbm9uIHdlcCBrZXkgOihcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKGlkeCkgewotCQkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gTlVNX1dFUEtFWVMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQllbHNlCi0JCQkJaWR4LS07Ci0JCX0KLQkJcHJfZGVidWcoIlNldCBXRVAga2V5ICglZClcbiIsIGlkeCk7Ci0JCXdsYW5kZXYtPndlcF9rZXlsZW5zW2lkeF0gPSBleHQtPmtleV9sZW47Ci0JCW1lbWNweSh3bGFuZGV2LT53ZXBfa2V5c1tpZHhdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKLQotCQltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwotCQlwc3RyID0gKHA4MDIxMWl0ZW1fcHN0cjMyX3QgKikgJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKLQkJbWVtY3B5KHBzdHItPmRhdGEuZGF0YSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7Ci0JCXBzdHItPmRhdGEubGVuID0gZXh0LT5rZXlfbGVuOwotCQlzd2l0Y2ggKGlkeCkgewotCQljYXNlIDA6Ci0JCQlwc3RyLT5kaWQgPQotCQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlwc3RyLT5kaWQgPQotCQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlwc3RyLT5kaWQgPQotCQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MjsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlwc3RyLT5kaWQgPQotCQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwotCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKLQkJcHJfZGVidWcoInJlc3VsdCAoJWQpXG4iLCByZXN1bHQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBTSU9DR0lXRU5DT0RFRVhUICovCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZ2V0X2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotCi0Jc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgbWF4X2xlbjsKLQlpbnQgaWR4OwotCi0JcHJfZGVidWcoImdldF9lbmNvZGVfZXh0IGZsYWdzWyVkXSBhbGdbJWRdIGtleWxlblslZF1cbiIsCi0JCSBleHQtPmV4dF9mbGFncywgKGludClleHQtPmFsZywgKGludClleHQtPmtleV9sZW4pOwotCi0JbWF4X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7Ci0JaWYgKG1heF9sZW4gPD0gMCkgewotCQlwcl9kZWJ1ZygiZ2V0X2VuY29kZWV4dCBtYXhfbGVuIFslZF0gaW52YWxpZFxuIiwgbWF4X2xlbik7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCi0JcHJfZGVidWcoImdldF9lbmNvZGVfZXh0IGluZGV4IFslZF1cbiIsIGlkeCk7Ci0KLQlpZiAoaWR4KSB7Ci0JCWlmIChpZHggPCAxIHx8IGlkeCA+IE5VTV9XRVBLRVlTKSB7Ci0JCQlwcl9kZWJ1ZygiZ2V0X2VuY29kZV9leHQgaW52YWxpZCBrZXkgaW5kZXggWyVkXVxuIiwKLQkJCQkgaWR4KTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJaWR4LS07Ci0JfSBlbHNlIHsKLQkJLyogZGVmYXVsdCBrZXkgPyBub3Qgc3VyZSB3aGF0IHRvIGRvICovCi0JCS8qIHdpbGwganVzdCB1c2Uga2V5WzBdIGZvciBub3cgISBGSVggTUUgKi8KLQl9Ci0KLQllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOwotCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7Ci0KLQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOwotCWV4dC0+a2V5X2xlbiA9IHdsYW5kZXYtPndlcF9rZXlsZW5zW2lkeF07Ci0JbWVtY3B5KGV4dC0+a2V5LCB3bGFuZGV2LT53ZXBfa2V5c1tpZHhdLCBleHQtPmtleV9sZW4pOwotCi0JZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwotZXhpdDoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBTSU9DU0lXQVVUSCAqLwotc3RhdGljIGludCBwODAyMTFfd2V4dF9zZXRfaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlwcl9kZWJ1Zygic2V0X2l3YXV0aCBmbGFnc1slZF1cbiIsIChpbnQpcGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCk7Ci0KLQlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLQljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLQkJcHJfZGVidWcoImRyb3BfdW5lbmNyeXB0ZWQgJWRcbiIsIHBhcmFtLT52YWx1ZSk7Ci0JCWlmIChwYXJhbS0+dmFsdWUpCi0JCQlyZXN1bHQgPQotCQkJICAgIHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJCQkgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkLAotCQkJCQkJIFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9Ci0JCQkgICAgcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCQkJCSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQsCi0JCQkJCQkgUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKLQkJcHJfZGVidWcoInByaXZhY3kgaW52b2tlZCAlZFxuIiwgcGFyYW0tPnZhbHVlKTsKLQkJaWYgKHBhcmFtLT52YWx1ZSkKLQkJCXJlc3VsdCA9Ci0JCQkgICAgcDgwMjExd2V4dF9zZXRtaWIod2xhbmRldiwKLQkJCQkJCSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZCwKLQkJCQkJCSBQODAyMTFFTlVNX3RydXRoX3RydWUpOwotCQllbHNlCi0JCQlyZXN1bHQgPQotCQkJICAgIHA4MDIxMXdleHRfc2V0bWliKHdsYW5kZXYsCi0JCQkJCQkgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQsCi0JCQkJCQkgUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkgewotCQkJcHJfZGVidWcoInNldCBvcGVuX3N5c3RlbVxuIik7Ci0JCQl3bGFuZGV2LT5ob3N0d2VwICY9IH5IT1NUV0VQX1NIQVJFREtFWTsKLQkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKSB7Ci0JCQlwcl9kZWJ1Zygic2V0IHNoYXJlZCBrZXlcbiIpOwotCQkJd2xhbmRldi0+aG9zdHdlcCB8PSBIT1NUV0VQX1NIQVJFREtFWTsKLQkJfSBlbHNlIHsKLQkJCS8qIGRvbid0IGtub3cgd2hhdCB0byBkbyBrbm93ICAqLwotCQkJcHJfZGVidWcoInVua25vd24gQVVUSF9BTEcgKCVkKVxuIiwgcGFyYW0tPnZhbHVlKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBTSU9DU0lXQVVUSCAqLwotc3RhdGljIGludCBwODAyMTFfd2V4dF9nZXRfaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlwcl9kZWJ1ZygiZ2V0X2l3YXV0aCBmbGFnc1slZF1cbiIsIChpbnQpcGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCk7Ci0KLQlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLQljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLQkJcGFyYW0tPnZhbHVlID0KLQkJICAgIHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCA/IDEgOiAwOwotCQlicmVhazsKLQotCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6Ci0JCXBhcmFtLT52YWx1ZSA9Ci0JCSAgICB3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9QUklWQUNZSU5WT0tFRCA/IDEgOiAwOwotCQlicmVhazsKLQotCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLQkJcGFyYW0tPnZhbHVlID0KLQkJICAgIHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1NIQVJFREtFWSA/Ci0JCSAgICBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotI2RlZmluZSBJV19JT0NUTCh4KSBbKHgpLVNJT0NTSVdDT01NSVRdCi0KLXN0YXRpYyBpd19oYW5kbGVyIHA4MDIxMXdleHRfaGFuZGxlcnNbXSA9IHsKLQlJV19JT0NUTChTSU9DU0lXQ09NTUlUKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd2NvbW1pdCwKLQlJV19JT0NUTChTSU9DR0lXTkFNRSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXduYW1lLAotLyogU0lPQ1NJV05XSUQsU0lPQ0dJV05XSUQgKi8KLQlJV19JT0NUTChTSU9DU0lXRlJFUSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdmcmVxLAotCUlXX0lPQ1RMKFNJT0NHSVdGUkVRKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2ZyZXEsCi0JSVdfSU9DVEwoU0lPQ1NJV01PREUpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3bW9kZSwKLQlJV19JT0NUTChTSU9DR0lXTU9ERSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdtb2RlLAotLyogU0lPQ1NJV1NFTlMsU0lPQ0dJV1NFTlMsU0lPQ1NJV1JBTkdFICovCi0JSVdfSU9DVEwoU0lPQ0dJV1JBTkdFKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd3JhbmdlLAotLyogU0lPQ1NJV1BSSVYsU0lPQ0dJV1BSSVYsU0lPQ1NJV1NUQVRTLFNJT0NHSVdTVEFUUyAqLwotCUlXX0lPQ1RMKFNJT0NTSVdTUFkpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3c3B5LAotCUlXX0lPQ1RMKFNJT0NHSVdTUFkpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3c3B5LAotLyogU0lPQ1NJV0FQICovCi0JSVdfSU9DVEwoU0lPQ0dJV0FQKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2FwLAotLyogU0lPQ0dJV0FQTElTVCAqLwotCUlXX0lPQ1RMKFNJT0NTSVdTQ0FOKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd3NjYW4sCi0JSVdfSU9DVEwoU0lPQ0dJV1NDQU4pID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3c2NhbiwKLQlJV19JT0NUTChTSU9DU0lXRVNTSUQpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3ZXNzaWQsCi0JSVdfSU9DVEwoU0lPQ0dJV0VTU0lEKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2Vzc2lkLAotLyogU0lPQ1NJV05JQ0tOICovCi0JSVdfSU9DVEwoU0lPQ0dJV05JQ0tOKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2Vzc2lkLAotLyogU0lPQ1NJV1JBVEUgKi8KLQlJV19JT0NUTChTSU9DR0lXUkFURSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdyYXRlLAotCUlXX0lPQ1RMKFNJT0NTSVdSVFMpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3cnRzLAotCUlXX0lPQ1RMKFNJT0NHSVdSVFMpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3cnRzLAotCUlXX0lPQ1RMKFNJT0NTSVdGUkFHKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd2ZyYWcsCi0JSVdfSU9DVEwoU0lPQ0dJV0ZSQUcpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3ZnJhZywKLQlJV19JT0NUTChTSU9DU0lXVFhQT1cpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3dHhwb3csCi0JSVdfSU9DVEwoU0lPQ0dJV1RYUE9XKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd3R4cG93LAotCUlXX0lPQ1RMKFNJT0NTSVdSRVRSWSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdyZXRyeSwKLQlJV19JT0NUTChTSU9DR0lXUkVUUlkpID0gKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3cmV0cnksCi0JSVdfSU9DVEwoU0lPQ1NJV0VOQ09ERSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdlbmNvZGUsCi0JSVdfSU9DVEwoU0lPQ0dJV0VOQ09ERSkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdlbmNvZGUsCi0vKiBTSU9DU0lXUE9XRVIsU0lPQ0dJV1BPV0VSICovCi0vKiBXUEEgb3BlcmF0aW9ucyAqLwotLyogU0lPQ1NJV0dFTklFLFNJT0NHSVdHRU5JRSBnZW5lcmljIElFICovCi0JSVdfSU9DVEwoU0lPQ1NJV0FVVEgpID0gKGl3X2hhbmRsZXIpIHA4MDIxMV93ZXh0X3NldF9pd2F1dGgsIC8qc2V0IGF1dGhlbnRpY2F0aW9uIG1vZGUgcGFyYW1zICovCi0JSVdfSU9DVEwoU0lPQ0dJV0FVVEgpID0gKGl3X2hhbmRsZXIpIHA4MDIxMV93ZXh0X2dldF9pd2F1dGgsIC8qZ2V0IGF1dGhlbnRpY2F0aW9uIG1vZGUgcGFyYW1zICovCi0JSVdfSU9DVEwoU0lPQ1NJV0VOQ09ERUVYVCkgPSAoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zZXRfZW5jb2RlZXh0LCAvKnNldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KLQlJV19JT0NUTChTSU9DR0lXRU5DT0RFRVhUKSA9IChpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dldF9lbmNvZGVleHQsIC8qZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLwotLyogU0lPQ1NJV1BNS1NBICAgICAgUE1LU0EgY2FjaGUgb3BlcmF0aW9uICovCi19OwotCi1zdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZiA9IHsKLQkubnVtX3N0YW5kYXJkID0gQVJSQVlfU0laRShwODAyMTF3ZXh0X2hhbmRsZXJzKSwKLQkuc3RhbmRhcmQgPSBwODAyMTF3ZXh0X2hhbmRsZXJzLAotCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBwODAyMTF3ZXh0X2dldF93aXJlbGVzc19zdGF0cwotfTsKLQotaW50IHA4MDIxMXdleHRfZXZlbnRfYXNzb2NpYXRlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBhc3NvYykKLXsKLQl1bmlvbiBpd3JlcV9kYXRhIGRhdGE7Ci0KLQkvKiBTZW5kIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBmaXJzdCAqLwotCWRhdGEuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JaWYgKGFzc29jKQotCQltZW1jcHkoZGF0YS5hcF9hZGRyLnNhX2RhdGEsIHdsYW5kZXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JZWxzZQotCQltZW1zZXQoZGF0YS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKLQotCWlmICh3bGFuX3dleHRfd3JpdGUpCi0JCXdpcmVsZXNzX3NlbmRfZXZlbnQod2xhbmRldi0+bmV0ZGV2LCBTSU9DR0lXQVAsICZkYXRhLCBOVUxMKTsKLQotCWlmICghYXNzb2MpCi0JCWdvdG8gZG9uZTsKLQotCS8qIFhYWCBzZW5kIGFzc29jaWF0aW9uIGRhdGEsIGxpa2UgSUVzLCBldGMgZXRjLiAqLwotCi1kb25lOgotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKaW5kZXggZDIwYzg3OS4uZmQ1ZGRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCkBAIC03MywyNiArNzMsMjYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBUeXBlcyAqLwogCi10eXBlZGVmIHN0cnVjdCBzM2RhdGFyZWMgeworc3RydWN0IHMzZGF0YXJlYyB7CiAJdTMyIGxlbjsKIAl1MzIgYWRkcjsKIAl1OCBjaGVja3N1bTsKIAl1OCAqZGF0YTsKLX0gczNkYXRhcmVjX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBzM3BsdWdyZWMgeworc3RydWN0IHMzcGx1Z3JlYyB7CiAJdTMyIGl0ZW1jb2RlOwogCXUzMiBhZGRyOwogCXUzMiBsZW47Ci19IHMzcGx1Z3JlY190OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgczNjcmNyZWMgeworc3RydWN0IHMzY3JjcmVjIHsKIAl1MzIgYWRkcjsKIAl1MzIgbGVuOwogCXVuc2lnbmVkIGludCBkb3dyaXRlOwotfSBzM2NyY3JlY190OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgczNpbmZvcmVjIHsKK3N0cnVjdCBzM2luZm9yZWMgewogCXUxNiBsZW47CiAJdTE2IHR5cGU7CiAJdW5pb24gewpAQCAtMTAxLDIwICsxMDEsMjAgQEAKIAkJdTE2IGJ1aWxkc2VxOwogCQloZmEzODR4X2NvbXBpZGVudF90IHBsYXRmb3JtOwogCX0gaW5mbzsKLX0gczNpbmZvcmVjX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBwZGEgeworc3RydWN0IHBkYSB7CiAJdTggYnVmW0hGQTM4NHhfUERBX0xFTl9NQVhdOwogCWhmYTM4NHhfcGRyZWNfdCAqcmVjW0hGQTM4NHhfUERBX1JFQ1NfTUFYXTsKIAl1bnNpZ25lZCBpbnQgbnJlYzsKLX0gcGRhX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBpbWdjaHVuayB7CitzdHJ1Y3QgaW1nY2h1bmsgewogCXUzMiBhZGRyOwkvKiBzdGFydCBhZGRyZXNzICovCiAJdTMyIGxlbjsJLyogaW4gYnl0ZXMgKi8KIAl1MTYgY3JjOwkvKiBDUkMgdmFsdWUgKGlmIGl0IGZhbGxzIGF0IGEgY2h1bmsgYm91bmRhcnkpICovCiAJdTggKmRhdGE7Ci19IGltZ2NodW5rX3Q7Cit9OwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCkBAIC0xMjQsMjYgKzEyNCwyNiBAQAogCiAvKiBEYXRhIHJlY29yZHMgKi8KIHVuc2lnbmVkIGludCBuczNkYXRhOwotczNkYXRhcmVjX3QgczNkYXRhW1MzREFUQV9NQVhdOworc3RydWN0IHMzZGF0YXJlYyBzM2RhdGFbUzNEQVRBX01BWF07CiAKIC8qIFBsdWcgcmVjb3JkcyAqLwogdW5zaWduZWQgaW50IG5zM3BsdWc7Ci1zM3BsdWdyZWNfdCBzM3BsdWdbUzNQTFVHX01BWF07CitzdHJ1Y3QgczNwbHVncmVjIHMzcGx1Z1tTM1BMVUdfTUFYXTsKIAogLyogQ1JDIHJlY29yZHMgKi8KIHVuc2lnbmVkIGludCBuczNjcmM7Ci1zM2NyY3JlY190IHMzY3JjW1MzQ1JDX01BWF07CitzdHJ1Y3QgczNjcmNyZWMgczNjcmNbUzNDUkNfTUFYXTsKIAogLyogSW5mbyByZWNvcmRzICovCiB1bnNpZ25lZCBpbnQgbnMzaW5mbzsKLXMzaW5mb3JlY190IHMzaW5mb1tTM0lORk9fTUFYXTsKK3N0cnVjdCBzM2luZm9yZWMgczNpbmZvW1MzSU5GT19NQVhdOwogCiAvKiBTNyByZWNvcmQgKHRoZXJlIF9iZXR0ZXJfIGJlIG9ubHkgb25lKSAqLwogdTMyIHN0YXJ0YWRkcjsKIAogLyogTG9hZCBpbWFnZSBjaHVua3MgKi8KIHVuc2lnbmVkIGludCBuZmNodW5rczsKLWltZ2NodW5rX3QgZmNodW5rW0NIVU5LU19NQVhdOworc3RydWN0IGltZ2NodW5rIGZjaHVua1tDSFVOS1NfTUFYXTsKIAogLyogTm90ZSB0aGF0IGZvciB0aGUgZm9sbG93aW5nIHBkcmVjX3QgYXJyYXlzLCB0aGUgbGVuIGFuZCBjb2RlICovCiAvKiAgIGZpZWxkcyBhcmUgc3RvcmVkIGluIEhPU1QgYnl0ZSBvcmRlci4gVGhlIG1rcGRybGlzdCgpIGZ1bmN0aW9uICovCkBAIC0xNTEsNyArMTUxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQREEsIGJ1aWx0IGZyb20gW2NhcmR8bmV3ZmlsZV0rW2FkZGZpbGUxK2FkZGZpbGUyLi4uXSAqLwogCi1wZGFfdCBwZGE7CitzdHJ1Y3QgcGRhIHBkYTsKIGhmYTM4NHhfY29tcGlkZW50X3QgbmljaWQ7CiBoZmEzODR4X2NhcGxldmVsX3QgcmZpZDsKIGhmYTM4NHhfY2FwbGV2ZWxfdCBtYWNpZDsKQEAgLTE2NSwyMSArMTY1LDIxIEBACiAKIHN0YXRpYyBpbnQgcmVhZF9md2ZpbGUoY29uc3Qgc3RydWN0IGloZXhfYmlucmVjICpyZnB0cik7CiAKLXN0YXRpYyBpbnQgbWtpbWFnZShpbWdjaHVua190ICpjbGlzdCwgdW5zaWduZWQgaW50ICpjY250KTsKK3N0YXRpYyBpbnQgbWtpbWFnZShzdHJ1Y3QgaW1nY2h1bmsgKmNsaXN0LCB1bnNpZ25lZCBpbnQgKmNjbnQpOwogCi1zdGF0aWMgaW50IHJlYWRfY2FyZHBkYShwZGFfdCAqcGRhLCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpOworc3RhdGljIGludCByZWFkX2NhcmRwZGEoc3RydWN0IHBkYSAqcGRhLCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwogCi1zdGF0aWMgaW50IG1rcGRybGlzdChwZGFfdCAqcGRhKTsKK3N0YXRpYyBpbnQgbWtwZHJsaXN0KHN0cnVjdCBwZGEgKnBkYSk7CiAKLXN0YXRpYyBpbnQgcGx1Z2ltYWdlKGltZ2NodW5rX3QgKmZjaHVuaywgdW5zaWduZWQgaW50IG5mY2h1bmtzLAotCSAgICAgIHMzcGx1Z3JlY190ICpzM3BsdWcsIHVuc2lnbmVkIGludCBuczNwbHVnLCBwZGFfdCAqIHBkYSk7CitzdGF0aWMgaW50IHBsdWdpbWFnZShzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywgdW5zaWduZWQgaW50IG5mY2h1bmtzLAorCSAgICAgIHN0cnVjdCBzM3BsdWdyZWMgKnMzcGx1ZywgdW5zaWduZWQgaW50IG5zM3BsdWcsIHN0cnVjdCBwZGEgKiBwZGEpOwogCi1zdGF0aWMgaW50IGNyY2ltYWdlKGltZ2NodW5rX3QgKmZjaHVuaywgdW5zaWduZWQgaW50IG5mY2h1bmtzLAotCSAgICAgczNjcmNyZWNfdCAqczNjcmMsIHVuc2lnbmVkIGludCBuczNjcmMpOworc3RhdGljIGludCBjcmNpbWFnZShzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywgdW5zaWduZWQgaW50IG5mY2h1bmtzLAorCSAgICAgc3RydWN0IHMzY3JjcmVjICpzM2NyYywgdW5zaWduZWQgaW50IG5zM2NyYyk7CiAKLXN0YXRpYyBpbnQgd3JpdGVpbWFnZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGltZ2NodW5rX3QgKmZjaHVuaywKK3N0YXRpYyBpbnQgd3JpdGVpbWFnZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLAogCSAgICAgICB1bnNpZ25lZCBpbnQgbmZjaHVua3MpOwotc3RhdGljIHZvaWQgZnJlZV9jaHVua3MoaW1nY2h1bmtfdCAqZmNodW5rLCB1bnNpZ25lZCBpbnQgKm5mY2h1bmtzKTsKK3N0YXRpYyB2b2lkIGZyZWVfY2h1bmtzKHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLCB1bnNpZ25lZCBpbnQgKm5mY2h1bmtzKTsKIAogc3RhdGljIHZvaWQgZnJlZV9zcmVjcyh2b2lkKTsKIApAQCAtMjM5LDcgKzIzOSw3IEBACiBpbnQgcHJpc20yX2Z3YXBwbHkoY29uc3Qgc3RydWN0IGloZXhfYmlucmVjICpyZnB0ciwgd2xhbmRldmljZV90ICp3bGFuZGV2KQogewogCXNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQlwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0X3QgZ2V0bXNnOworCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0IGdldG1zZzsKIAlwODAyMTFpdGVtZF90ICppdGVtOwogCXUzMiAqZGF0YTsKIApAQCAtMzc1LDggKzM3NSw4IEBACiAqCTAJc3VjY2VzcwogKgl+MAlmYWlsdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBjcmNpbWFnZShpbWdjaHVua190ICpmY2h1bmssIHVuc2lnbmVkIGludCBuZmNodW5rcywgczNjcmNyZWNfdCAqczNjcmMsCi0JICAgICB1bnNpZ25lZCBpbnQgbnMzY3JjKQoraW50IGNyY2ltYWdlKHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLCB1bnNpZ25lZCBpbnQgbmZjaHVua3MsCisJICAgICBzdHJ1Y3QgczNjcmNyZWMgKnMzY3JjLCB1bnNpZ25lZCBpbnQgbnMzY3JjKQogewogCWludCByZXN1bHQgPSAwOwogCWludCBpOwpAQCAtMzk3LDE1ICszOTcsMTQgQEAKIAkJZm9yIChjID0gMDsgYyA8IG5mY2h1bmtzOyBjKyspIHsKIAkJCWNzdGFydCA9IGZjaHVua1tjXS5hZGRyOwogCQkJY2VuZCA9IGZjaHVua1tjXS5hZGRyICsgZmNodW5rW2NdLmxlbjsKLQkJCS8qICB0aGUgbGluZSBiZWxvdyBkb2VzIGFuIGFkZHJlc3MgJiBsZW4gbWF0Y2ggc2VhcmNoICovCi0JCQkvKiAgdW5mb3J0dW5hdGVseSwgSSd2ZSBmb3VuZCB0aGF0IHRoZSBsZW4gZmllbGRzIG9mICovCi0JCQkvKiAgc29tZSBjcmMgcmVjb3JkcyBkb24ndCBtYXRjaCB3aXRoIHRoZSBsZW5ndGggb2YgKi8KLQkJCS8qICB0aGUgYWN0dWFsIGRhdGEsIHNvIHdlJ3JlIG5vdCBjaGVja2luZyByaWdodCAqLwotCQkJLyogIG5vdyAqLwotCQkJLyogaWYgKCBjcmNzdGFydC0yID49IGNzdGFydCAmJiBjcmNlbmQgPD0gY2VuZCApIGJyZWFrOyAqLworCQkJLyogdGhlIGxpbmUgYmVsb3cgZG9lcyBhbiBhZGRyZXNzICYgbGVuIG1hdGNoIHNlYXJjaCAqLworCQkJLyogdW5mb3J0dW5hdGVseSwgSSd2ZSBmb3VuZCB0aGF0IHRoZSBsZW4gZmllbGRzIG9mICovCisJCQkvKiBzb21lIGNyYyByZWNvcmRzIGRvbid0IG1hdGNoIHdpdGggdGhlIGxlbmd0aCBvZiAqLworCQkJLyogdGhlIGFjdHVhbCBkYXRhLCBzbyB3ZSdyZSBub3QgY2hlY2tpbmcgcmlnaHQgbm93ICovCisJCQkvKiBpZiAoY3Jjc3RhcnQtMiA+PSBjc3RhcnQgJiYgY3JjZW5kIDw9IGNlbmQpIGJyZWFrOyAqLwogCiAJCQkvKiBub3RlIHRoZSAtMiBiZWxvdywgaXQncyB0byBtYWtlIHN1cmUgdGhlIGNodW5rIGhhcyAqLwotCQkJLyogICBzcGFjZSBmb3IgdGhlIENSQyB2YWx1ZSAqLworCQkJLyogc3BhY2UgZm9yIHRoZSBDUkMgdmFsdWUgKi8KIAkJCWlmIChjcmNzdGFydCAtIDIgPj0gY3N0YXJ0ICYmIGNyY3N0YXJ0IDwgY2VuZCkKIAkJCQlicmVhazsKIAkJfQpAQCAtNDQwLDcgKzQzOSw3IEBACiAqIFJldHVybnM6CiAqCW5vdGhpbmcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBmcmVlX2NodW5rcyhpbWdjaHVua190ICpmY2h1bmssIHVuc2lnbmVkIGludCAqbmZjaHVua3MpCit2b2lkIGZyZWVfY2h1bmtzKHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLCB1bnNpZ25lZCBpbnQgKm5mY2h1bmtzKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCAqbmZjaHVua3M7IGkrKykgewpAQCAtNDkwLDcgKzQ4OSw3IEBACiAqCTAJLSBzdWNjZXNzCiAqCX4wCS0gZmFpbHVyZSAocHJvYmFibHkgYW4gZXJybm8pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBta2ltYWdlKGltZ2NodW5rX3QgKmNsaXN0LCB1bnNpZ25lZCBpbnQgKmNjbnQpCitpbnQgbWtpbWFnZShzdHJ1Y3QgaW1nY2h1bmsgKmNsaXN0LCB1bnNpZ25lZCBpbnQgKmNjbnQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IGk7CkBAIC01ODMsNyArNTgyLDcgQEAKICoJMAktIHN1Y2Nlc3MKICoJfjAJLSBmYWlsdXJlIChwcm9iYWJseSBhbiBlcnJubykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IG1rcGRybGlzdChwZGFfdCAqcGRhKQoraW50IG1rcGRybGlzdChzdHJ1Y3QgcGRhICpwZGEpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2ICpwZGExNiA9ICh1MTYgKikgcGRhLT5idWY7CkBAIC02NTYsOCArNjU1LDggQEAKICoJMAlzdWNjZXNzCiAqCX4wCWZhaWx1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHBsdWdpbWFnZShpbWdjaHVua190ICpmY2h1bmssIHVuc2lnbmVkIGludCBuZmNodW5rcywKLQkgICAgICBzM3BsdWdyZWNfdCAqczNwbHVnLCB1bnNpZ25lZCBpbnQgbnMzcGx1ZywgcGRhX3QgKiBwZGEpCitpbnQgcGx1Z2ltYWdlKHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLCB1bnNpZ25lZCBpbnQgbmZjaHVua3MsCisJICAgICAgc3RydWN0IHMzcGx1Z3JlYyAqczNwbHVnLCB1bnNpZ25lZCBpbnQgbnMzcGx1Zywgc3RydWN0IHBkYSAqIHBkYSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgaTsJCQkvKiBwbHVnIGluZGV4ICovCkBAIC02NzUsNyArNjc0LDcgQEAKIAkJcHN0YXJ0ID0gczNwbHVnW2ldLmFkZHI7CiAJCXBlbmQgPSBzM3BsdWdbaV0uYWRkciArIHMzcGx1Z1tpXS5sZW47CiAJCS8qIGZpbmQgdGhlIG1hdGNoaW5nIFBEUiAob3IgZmlsZW5hbWUpICovCi0JCWlmIChzM3BsdWdbaV0uaXRlbWNvZGUgIT0gMHhmZmZmZmZmZlVMKSB7CS8qIG5vdCBmaWxlbmFtZSAqLworCQlpZiAoczNwbHVnW2ldLml0ZW1jb2RlICE9IDB4ZmZmZmZmZmZVTCkgeyAvKiBub3QgZmlsZW5hbWUgKi8KIAkJCWZvciAoaiA9IDA7IGogPCBwZGEtPm5yZWM7IGorKykgewogCQkJCWlmIChzM3BsdWdbaV0uaXRlbWNvZGUgPT0KIAkJCQkgICAgbGUxNl90b19jcHUocGRhLT5yZWNbal0tPmNvZGUpKQpAQCAtNjg0LDcgKzY4Myw3IEBACiAJCX0gZWxzZSB7CiAJCQlqID0gLTE7CiAJCX0KLQkJaWYgKGogPj0gcGRhLT5ucmVjICYmIGogIT0gLTEpIHsJLyogIGlmIG5vIG1hdGNoaW5nIFBEUiwgZmFpbCAqLworCQlpZiAoaiA+PSBwZGEtPm5yZWMgJiYgaiAhPSAtMSkgeyAvKiAgaWYgbm8gbWF0Y2hpbmcgUERSLCBmYWlsICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIndhcm5pbmc6IEZhaWxlZCB0byBmaW5kIFBEUiBmb3IgIgogCQkJICAgICAgICJwbHVncmVjIDB4JTA0eC5cbiIsIHMzcGx1Z1tpXS5pdGVtY29kZSk7CkBAIC03NjQsMTAgKzc2MywxMCBAQAogKgkwCS0gc3VjY2VzcwogKgl+MAktIGZhaWx1cmUgKHByb2JhYmx5IGFuIGVycm5vKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcmVhZF9jYXJkcGRhKHBkYV90ICpwZGEsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK2ludCByZWFkX2NhcmRwZGEoc3RydWN0IHBkYSAqcGRhLCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX3AycmVxX3JlYWRwZGFfdCBtc2c7CisJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhIG1zZzsKIAogCS8qIHNldCB1cCB0aGUgbXNnICovCiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfcDJyZXFfcmVhZHBkYTsKQEAgLTgzOSw3ICs4MzgsNyBAQAogKiAgICAgICAgICAgICAgICBzc3NzdHR0dGRkLi5kZAogKiAgICAgICAgICAgICAgICBzIC0gU2l6ZSBpbiB3b3JkcyAobGl0dGxlIGVuZGlhbikKICogICAgICAgICAgICAgICAgdCAtIEluZm8gdHlwZSAobGl0dGxlIGVuZGlhbiksIHNlZSAjZGVmaW5lcyBhbmQKLSogICAgICAgICAgICAgICAgICAgIHMzaW5mb3JlY190IGZvciBkZXRhaWxzIGFib3V0IHR5cGVzLgorKiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHMzaW5mb3JlYyBmb3IgZGV0YWlscyBhYm91dCB0eXBlcy4KICogICAgICAgICAgICAgICAgZCAtIChzIC0gMSkgbGl0dGxlIGVuZGlhbiB3b3JkcyBnaXZpbmcgdGhlIGNvbnRlbnRzIG9mCiAqICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gaW5mbyB0eXBlLgogKgpAQCAtOTc4LDEzICs5NzcsMTMgQEAKICoJMAlzdWNjZXNzCiAqCX4wCWZhaWx1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHdyaXRlaW1hZ2Uod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbWdjaHVua190ICpmY2h1bmssCitpbnQgd3JpdGVpbWFnZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLAogCSAgICAgICB1bnNpZ25lZCBpbnQgbmZjaHVua3MpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlX3QgcnN0YXRlbXNnOwotCXA4MDIxMW1zZ19wMnJlcV9yYW1kbF93cml0ZV90IHJ3cml0ZW1zZzsKLQlwODAyMTFtc2dfdCAqbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlIHJzdGF0ZW1zZzsKKwlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlIHJ3cml0ZW1zZzsKKwlzdHJ1Y3QgcDgwMjExbXNnICptc2dwOwogCXUzMiByZXN1bHRjb2RlOwogCWludCBpOwogCWludCBqOwpAQCAtMTAzMCw3ICsxMDI5LDcgQEAKIAlyc3RhdGVtc2cuZW5hYmxlLmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX3RydWU7CiAJcnN0YXRlbXNnLmV4ZWFkZHIuZGF0YSA9IHN0YXJ0YWRkcjsKIAotCW1zZ3AgPSAocDgwMjExbXNnX3QgKikgJnJzdGF0ZW1zZzsKKwltc2dwID0gKHN0cnVjdCBwODAyMTFtc2cgKikgJnJzdGF0ZW1zZzsKIAlyZXN1bHQgPSBwcmlzbTJtZ210X3JhbWRsX3N0YXRlKHdsYW5kZXYsIG1zZ3ApOwogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC0xMDUyLDExICsxMDUxLDEyIEBACiAJCW53cml0ZXMgKz0gKGZjaHVua1tpXS5sZW4gJSBXUklURVNJWkVfTUFYKSA/IDEgOiAwOwogCQljdXJyb2ZmID0gMDsKIAkJZm9yIChqID0gMDsgaiA8IG53cml0ZXM7IGorKykgewotCQkJY3VycmxlbiA9Ci0JCQkgICAgKGZjaHVua1tpXS5sZW4gLSAoV1JJVEVTSVpFX01BWCAqIGopKSA+Ci0JCQkgICAgV1JJVEVTSVpFX01BWCA/IFdSSVRFU0laRV9NQVggOiAoZmNodW5rW2ldLmxlbiAtCi0JCQkJCQkJICAgICAoV1JJVEVTSVpFX01BWCAqCi0JCQkJCQkJICAgICAgaikpOworCQkJLyogVE9ETyBNb3ZlIHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiAqLworCQkJaW50IGxlbmxlZnQgPSBmY2h1bmtbaV0ubGVuIC0gKFdSSVRFU0laRV9NQVggKiBqKTsKKwkJCWlmIChmY2h1bmtbaV0ubGVuID4gV1JJVEVTSVpFX01BWCkKKwkJCQljdXJybGVuID0gV1JJVEVTSVpFX01BWDsKKwkJCWVsc2UKKwkJCQljdXJybGVuID0gbGVubGVmdDsKIAkJCWN1cnJvZmYgPSBqICogV1JJVEVTSVpFX01BWDsKIAkJCWN1cnJkYWRkciA9IGZjaHVua1tpXS5hZGRyICsgY3Vycm9mZjsKIAkJCS8qIFNldHVwIHRoZSBtZXNzYWdlICovCkBAIC0xMDcwLDcgKzEwNzAsNyBAQAogCQkJICAgICgiU2VuZGluZyB4eHhkbF93cml0ZSBtZXNzYWdlIGFkZHI9JTA2eCBsZW49JWQuXG4iLAogCQkJICAgICBjdXJyZGFkZHIsIGN1cnJsZW4pOwogCi0JCQltc2dwID0gKHA4MDIxMW1zZ190ICopICZyd3JpdGVtc2c7CisJCQltc2dwID0gKHN0cnVjdCBwODAyMTFtc2cgKikgJnJ3cml0ZW1zZzsKIAkJCXJlc3VsdCA9IHByaXNtMm1nbXRfcmFtZGxfd3JpdGUod2xhbmRldiwgbXNncCk7CiAKIAkJCS8qIENoZWNrIHRoZSByZXN1bHRzICovCkBAIC0xMDk3LDcgKzEwOTcsNyBAQAogCXJzdGF0ZW1zZy5lbmFibGUuZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7CiAJcnN0YXRlbXNnLmV4ZWFkZHIuZGF0YSA9IDA7CiAKLQltc2dwID0gKHA4MDIxMW1zZ190ICopICZyc3RhdGVtc2c7CisJbXNncCA9IChzdHJ1Y3QgcDgwMjExbXNnICopICZyc3RhdGVtc2c7CiAJcmVzdWx0ID0gcHJpc20ybWdtdF9yYW1kbF9zdGF0ZSh3bGFuZGV2LCBtc2dwKTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCmluZGV4IDRkMWNkZmMuLjA0NTE0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKQEAgLTExNyw3ICsxMTcsNyBAQAogewogCWludCByZXN1bHQgPSAwOwogCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3QgKm1zZyA9IG1zZ3A7CisJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuICptc2cgPSBtc2dwOwogCXUxNiByb2FtaW5nbW9kZSwgd29yZDsKIAlpbnQgaSwgdGltZW91dDsKIAlpbnQgaXN0bXBlbmFibGUgPSAwOwpAQCAtMzYxLDEzICszNjEsMTMgQEAKIGludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0c190ICpyZXE7CisJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMgKnJlcTsKIAloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKIAloZmEzODR4X0hTY2FuUmVzdWx0U3ViX3QgKml0ZW0gPSBOVUxMOwogCiAJaW50IGNvdW50OwogCi0JcmVxID0gKHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHNfdCAqKSBtc2dwOworCXJlcSA9IChzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0cyAqKSBtc2dwOwogCiAJcmVxLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIApAQCAtNDYzLDYgKzQ2Myw4IEBACiAKIAkvKiBjYXBpbmZvIGJpdHMgKi8KIAljb3VudCA9IGxlMTZfdG9fY3B1KGl0ZW0tPmNhcGluZm8pOworCXJlcS0+Y2FwaW5mby5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CisJcmVxLT5jYXBpbmZvLmRhdGEgPSBjb3VudDsKIAogCS8qIHByaXZhY3kgZmxhZyAqLwogCXJlcS0+cHJpdmFjeS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CkBAIC01MTEsNyArNTEzLDcgQEAKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfc3RhcnRfdCAqbXNnID0gbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0ICptc2cgPSBtc2dwOwogCiAJcDgwMjExcHN0cmRfdCAqcHN0cjsKIAl1OCBieXRlYnVmWzgwXTsKQEAgLTY4Nyw3ICs2ODksNyBAQAogaW50IHByaXNtMm1nbXRfcmVhZHBkYSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX3JlYWRwZGFfdCAqbXNnID0gbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgKm1zZyA9IG1zZ3A7CiAJaW50IHJlc3VsdDsKIAogCS8qIFdlIG9ubHkgc3VwcG9ydCBjb2xsZWN0aW5nIHRoZSBQREEgd2hlbiBpbiB0aGUgRldMT0FECkBAIC03NTMsNyArNzU1LDcgQEAKIGludCBwcmlzbTJtZ210X3JhbWRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKIAloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGVfdCAqbXNnID0gbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlICptc2cgPSBtc2dwOwogCiAJaWYgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX0ZXTE9BRCkgewogCQlwcmludGsoS0VSTl9FUlIKQEAgLTgwOSw3ICs4MTEsNyBAQAogaW50IHByaXNtMm1nbXRfcmFtZGxfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQogewogCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9yYW1kbF93cml0ZV90ICptc2cgPSBtc2dwOworCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGUgKm1zZyA9IG1zZ3A7CiAJdTMyIGFkZHI7CiAJdTMyIGxlbjsKIAl1OCAqYnVmOwpAQCAtODcyLDcgKzg3NCw3IEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGVfdCAqbXNnID0gbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGUgKm1zZyA9IG1zZ3A7CiAKIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfRldMT0FEKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtOTQyLDcgKzk0NCw3IEBACiBpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKIAloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZV90ICptc2cgPSBtc2dwOworCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZSAqbXNnID0gbXNncDsKIAl1MzIgYWRkcjsKIAl1MzIgbGVuOwogCXU4ICpidWY7CkBAIC0xMDA2LDcgKzEwMDgsNyBAQAogCWludCByZXN1bHQgPSAwOwogCXUxNiByZWc7CiAJdTE2IHBvcnRfdHlwZTsKLQlwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luX3QgKm1zZyA9IG1zZ3A7CisJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4gKm1zZyA9IG1zZ3A7CiAJcDgwMjExcHN0cmRfdCAqcHN0cjsKIAl1OCBieXRlYnVmWzI1Nl07CiAJaGZhMzg0eF9ieXRlc3RyX3QgKnAyYnl0ZXN0ciA9IChoZmEzODR4X2J5dGVzdHJfdCAqKSBieXRlYnVmOwpAQCAtMTA3NCw3ICsxMDc2LDcgQEAKIGludCBwcmlzbTJtZ210X3dsYW5zbmlmZih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmZfdCAqbXNnID0gbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmYgKm1zZyA9IG1zZ3A7CiAKIAloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MTYgd29yZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKaW5kZXggMGIwZWM5Yy4uZDNhMDZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKQEAgLTc5LDcgKzc5LDcgQEAKICNkZWZpbmUgIEZfUkVBRCAgICAgICAweDIJLyogTUlCIG1heSBiZSByZWFkLiAqLwogI2RlZmluZSAgRl9XUklURSAgICAgIDB4NAkvKiBNSUIgbWF5IGJlIHdyaXR0ZW4uICovCiAKLXR5cGVkZWYgc3RydWN0IG1pYnJlYyB7CitzdHJ1Y3QgbWlicmVjIHsKIAl1MzIgZGlkOwogCXUxNiBmbGFnOwogCXUxNiBwYXJtMTsKQEAgLTg5LDYzICs4OSw2MyBAQAogCQkgICAgIGludCBpc2dldCwKIAkJICAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCiAJCSAgICAgaGZhMzg0eF90ICpodywKLQkJICAgICBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywgdm9pZCAqZGF0YSk7Ci19IG1pYnJlY190OworCQkgICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOworfTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cihtaWJyZWNfdCAqbWliLAorc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgaW50IGlzZ2V0LAogCQkJCSAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKIAkJCQkgICBoZmEzODR4X3QgKmh3LAotCQkJCSAgIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnLAorCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgdm9pZCAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMihtaWJyZWNfdCAqbWliLAorc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgICBpbnQgaXNnZXQsCiAJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJICAgIGhmYTM4NHhfdCAqaHcsCi0JCQkgICAgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICptc2csIHZvaWQgKmRhdGEpOworCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9mbGFnKG1pYnJlY190ICptaWIsCitzdGF0aWMgaW50IHByaXNtMm1pYl9mbGFnKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgaW50IGlzZ2V0LAogCQkJICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCiAJCQkgIGhmYTM4NHhfdCAqaHcsCi0JCQkgIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnLCB2b2lkICpkYXRhKTsKKwkJCSAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkobWlicmVjX3QgKm1pYiwKK3N0YXRpYyBpbnQgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgIGludCBpc2dldCwKIAkJCQkgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCiAJCQkJICAgaGZhMzg0eF90ICpodywKLQkJCQkgICBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywKKwkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgIHZvaWQgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9wcml2YWN5aW52b2tlZChtaWJyZWNfdCAqbWliLAorc3RhdGljIGludCBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgICBpbnQgaXNnZXQsCiAJCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKIAkJCQkgICAgaGZhMzg0eF90ICpodywKLQkJCQkgICAgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICptc2csCisJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgIHZvaWQgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQobWlicmVjX3QgKm1pYiwKK3N0YXRpYyBpbnQgcHJpc20ybWliX2V4Y2x1ZGV1bmVuY3J5cHRlZChzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJCWludCBpc2dldCwKIAkJCQkJd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJCQloZmEzODR4X3QgKmh3LAotCQkJCQlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywKKwkJCQkJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJdm9pZCAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQobWlicmVjX3QgKm1pYiwKK3N0YXRpYyBpbnQgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQkgICAgaW50IGlzZ2V0LAogCQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJCQkgICAgaGZhMzg0eF90ICpodywKLQkJCQkJICAgIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnLAorCQkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJICAgIHZvaWQgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9wcml2KG1pYnJlY190ICptaWIsCitzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgaW50IGlzZ2V0LAogCQkJICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCiAJCQkgIGhmYTM4NHhfdCAqaHcsCi0JCQkgIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnLCB2b2lkICpkYXRhKTsKKwkJCSAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSk7CiAKLXN0YXRpYyBtaWJyZWNfdCBtaWJ0YWJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbWlicmVjIG1pYnRhYltdID0gewogCiAJLyogZG90MTFzbXQgTUlCJ3MgKi8KIAl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwLApAQCAtMjYxLDExICsyNjEsMTEgQEAKIHsKIAloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgcmVzdWx0LCBpc2dldDsKLQltaWJyZWNfdCAqbWliOworCXN0cnVjdCBtaWJyZWMgKm1pYjsKIAogCXUxNiB3aGljaDsKIAotCXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnID0gbXNncDsKKwlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnID0gbXNncDsKIAlwODAyMTFpdGVtZF90ICptaWJpdGVtOwogCiAJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKQEAgLTM3MSwxMSArMzcxLDExIEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cihtaWJyZWNfdCAqbWliLAorc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgaW50IGlzZ2V0LAogCQkJCSAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKIAkJCQkgICBoZmEzODR4X3QgKmh3LAotCQkJCSAgIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnLAorCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtNDIxLDExICs0MjEsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzIobWlicmVjX3QgKm1pYiwKK3N0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgICAgaW50IGlzZ2V0LAogCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKIAkJCSAgICBoZmEzODR4X3QgKmh3LAotCQkJICAgIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAqbXNnLCB2b2lkICpkYXRhKQorCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpCiB7CiAJaW50IHJlc3VsdDsKIAl1MzIgKnVpbnQzMiA9ICh1MzIgKikgZGF0YTsKQEAgLTQ2OCwxMSArNDY4LDExIEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBwcmlzbTJtaWJfZmxhZyhtaWJyZWNfdCAqbWliLAorc3RhdGljIGludCBwcmlzbTJtaWJfZmxhZyhzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKIAkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJICBoZmEzODR4X3QgKmh3LAotCQkJICBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywgdm9pZCAqZGF0YSkKKwkJCSAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwogCXUzMiAqdWludDMyID0gKHUzMiAqKSBkYXRhOwpAQCAtNTI1LDExICs1MjUsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5KG1pYnJlY190ICptaWIsCitzdGF0aWMgaW50IHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICBpbnQgaXNnZXQsCiAJCQkJICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJCSAgIGhmYTM4NHhfdCAqaHcsCi0JCQkJICAgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICptc2csCisJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7CkBAIC01NzUsMTEgKzU3NSwxMSBAQAogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkKG1pYnJlY190ICptaWIsCitzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2YWN5aW52b2tlZChzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgIGludCBpc2dldCwKIAkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJCSAgICBoZmEzODR4X3QgKmh3LAotCQkJCSAgICBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywKKwkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICAgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtNjIxLDExICs2MjEsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQobWlicmVjX3QgKm1pYiwKK3N0YXRpYyBpbnQgcHJpc20ybWliX2V4Y2x1ZGV1bmVuY3J5cHRlZChzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJCWludCBpc2dldCwKIAkJCQkJd2xhbmRldmljZV90ICp3bGFuZGV2LAogCQkJCQloZmEzODR4X3QgKmh3LAotCQkJCQlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywKKwkJCQkJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtNjYwLDExICs2NjAsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkKG1pYnJlY190ICptaWIsCitzdGF0aWMgaW50IHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkJICAgIGludCBpc2dldCwKIAkJCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKIAkJCQkJICAgIGhmYTM4NHhfdCAqaHcsCi0JCQkJCSAgICBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgKm1zZywKKwkJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCSAgICB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7CkBAIC03MDksMTEgKzcwOSwxMSBAQAogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXYobWlicmVjX3QgKm1pYiwKK3N0YXRpYyBpbnQgcHJpc20ybWliX3ByaXYoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJICBpbnQgaXNnZXQsCiAJCQkgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKIAkJCSAgaGZhMzg0eF90ICpodywKLQkJCSAgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICptc2csIHZvaWQgKmRhdGEpCisJCQkgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpCiB7CiAJcDgwMjExcHN0cmRfdCAqcHN0ciA9IChwODAyMTFwc3RyZF90ICopIGRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggNmNkMDkzNS4uZWQ3NTFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTgzLDggKzgzLDYgQEAKICNpbmNsdWRlICJoZmEzODR4LmgiCiAjaW5jbHVkZSAicHJpc20ybWdtdC5oIgogCi0jZGVmaW5lIHdsYW5faGV4Y2hhcih4KSAoKCh4KSA8IDB4MGEpID8gKCcwJyArICh4KSkgOiAoJ2EnICsgKCh4KSAtIDB4MGEpKSkKLQogLyogQ3JlYXRlIGEgc3RyaW5nIG9mIHByaW50YWJsZSBjaGFycyBmcm9tIHNvbWV0aGluZyB0aGF0IG1pZ2h0IG5vdCBiZSAqLwogLyogSXQncyByZWNvbW1lbmRlZCB0aGF0IHRoZSBzdHIgYmUgNCpsZW4gKyAxIGJ5dGVzIGxvbmcgKi8KICNkZWZpbmUgd2xhbl9ta3ByaW50c3RyKGJ1ZiwgYnVmbGVuLCBzdHIsIHN0cmxlbikgXApAQCAtOTksOCArOTcsOCBAQAogCQl9IGVsc2UgeyBcCiAJCQkoc3RyKVtqXSA9ICdcXCc7IFwKIAkJCShzdHIpW2orMV0gPSAneCc7IFwKLQkJCShzdHIpW2orMl0gPSB3bGFuX2hleGNoYXIoKChidWYpW2ldICYgMHhmMCkgPj4gNCk7IFwKLQkJCShzdHIpW2orM10gPSB3bGFuX2hleGNoYXIoKChidWYpW2ldICYgMHgwZikpOyBcCisJCQkoc3RyKVtqKzJdID0gaGV4X2FzY19oaSgoYnVmKVtpXSk7IFwKKwkJCShzdHIpW2orM10gPSBoZXhfYXNjX2xvKChidWYpW2ldKTsgXAogCQkJaiArPSA0OyBcCiAJCX0gXAogCX0gXApAQCAtMTI0LDEzICsxMjIsMTcgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOwogCit2b2lkIHByaXNtMl9jb25uZWN0X3Jlc3VsdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4IGZhaWxlZCk7Cit2b2lkIHByaXNtMl9kaXNjb25uZWN0ZWQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3ZvaWQgcHJpc20yX3JvYW1lZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOworCiBzdGF0aWMgaW50IHByaXNtMnN0YV9vcGVuKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiBzdGF0aWMgaW50IHByaXNtMnN0YV9jbG9zZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwogc3RhdGljIHZvaWQgcHJpc20yc3RhX3Jlc2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiBzdGF0aWMgaW50IHByaXNtMnN0YV90eGZyYW1lKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLAotCQkJICAgICBwODAyMTFfbWV0YXdlcF90ICpwODAyMTFfd2VwKTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgcDgwMjExbXNnX3QgKm1zZyk7CisJCQkgICAgIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCisJCQkgICAgIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCk7CitzdGF0aWMgaW50IHByaXNtMnN0YV9tbG1lcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZyk7CiBzdGF0aWMgaW50IHByaXNtMnN0YV9nZXRjYXJkaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwogc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2KTsKIHN0YXRpYyBpbnQgcHJpc20yc3RhX3NldG11bHRpY2FzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIG5ldGRldmljZV90ICpkZXYpOwpAQCAtMjY2LDggKzI2OCw4IEBACiAqCXByb2Nlc3MgdGhyZWFkCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgcHJpc20yc3RhX3R4ZnJhbWUod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsCi0JCQkgICAgIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCisJCQkgICAgIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCisJCQkgICAgIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCkKIHsKIAloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSB3bGFuZGV2LT5wcml2OwogCWludCByZXN1bHQ7CkBAIC0zMDcsNyArMzA5LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIHRocmVhZAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHByaXNtMnN0YV9tbG1lcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHA4MDIxMW1zZ190ICptc2cpCitzdGF0aWMgaW50IHByaXNtMnN0YV9tbG1lcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZykKIHsKIAloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSB3bGFuZGV2LT5wcml2OwogCkBAIC0zNjQsOSArMzY2LDkgQEAKIAkJYnJlYWs7CQkvKiBpZ25vcmUgbWUuICovCiAJY2FzZSBESURtc2dfbG54cmVxX2lmc3RhdGU6CiAJCXsKLQkJCXA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZV90ICppZnN0YXRlbXNnOworCQkJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSAqaWZzdGF0ZW1zZzsKIAkJCXByX2RlYnVnKCJSZWNlaXZlZCBtbG1lIGlmc3RhdGUgcmVxdWVzdFxuIik7Ci0JCQlpZnN0YXRlbXNnID0gKHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZV90ICopIG1zZzsKKwkJCWlmc3RhdGVtc2cgPSAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSAqKSBtc2c7CiAJCQlyZXN1bHQgPQogCQkJICAgIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsCiAJCQkJCSAgICAgIGlmc3RhdGVtc2ctPmlmc3RhdGUuZGF0YSk7CkBAIC0zODUsMTEgKzM4NywxMSBAQAogCQlyZXN1bHQgPSBwcmlzbTJtZ210X2F1dG9qb2luKHdsYW5kZXYsIG1zZyk7CiAJCWJyZWFrOwogCWNhc2UgRElEbXNnX2xueHJlcV9jb21tc3F1YWxpdHk6ewotCQkJcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHlfdCAqcXVhbG1zZzsKKwkJCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eSAqcXVhbG1zZzsKIAogCQkJcHJfZGVidWcoIlJlY2VpdmVkIGNvbW1zcXVhbGl0eSByZXF1ZXN0XG4iKTsKIAotCQkJcXVhbG1zZyA9IChwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eV90ICopIG1zZzsKKwkJCXF1YWxtc2cgPSAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5ICopIG1zZzsKIAogCQkJcXVhbG1zZy0+bGluay5zdGF0dXMgPQogCQkJICAgIFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKQEAgLTQwMSw2ICs0MDMsNyBAQAogCQkJcXVhbG1zZy0+bGluay5kYXRhID0gbGUxNl90b19jcHUoaHctPnF1YWwuQ1FfY3VyckJTUyk7CiAJCQlxdWFsbXNnLT5sZXZlbC5kYXRhID0gbGUxNl90b19jcHUoaHctPnF1YWwuQVNMX2N1cnJCU1MpOwogCQkJcXVhbG1zZy0+bm9pc2UuZGF0YSA9IGxlMTZfdG9fY3B1KGh3LT5xdWFsLkFOTF9jdXJyRkMpOworCQkJcXVhbG1zZy0+dHhyYXRlLmRhdGEgPSBody0+dHhyYXRlOwogCiAJCQlicmVhazsKIAkJfQpAQCAtMTMwMCw2ICsxMzAzLDkgQEAKIAkJCSAgICAocG9ydHN0YXR1cyA9PSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTKSA/CiAJCQkgICAgV0xBTl9NQUNNT0RFX0lCU1NfU1RBIDogV0xBTl9NQUNNT0RFX0VTU19TVEE7CiAKKwkJCS8qIHNpZ25hbCBiYWNrIHVwIHRvIGNmZzgwMjExIGxheWVyICovCisJCQlwcmlzbTJfY29ubmVjdF9yZXN1bHQod2xhbmRldiwgUDgwMjExRU5VTV90cnV0aF9mYWxzZSk7CisKIAkJCS8qIEdldCB0aGUgYmFsbCByb2xsaW5nIG9uIHRoZSBjb21tcyBxdWFsaXR5IHN0dWZmICovCiAJCQlwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKCZody0+Y29tbXNxdWFsX2JoKTsKIAkJfQpAQCAtMTMxNSwyNSArMTMyMSwxNiBAQAogCQkgKiBJbmRpY2F0ZSBEZWF1dGhlbnRpY2F0aW9uCiAJCSAqIEJsb2NrIFRyYW5zbWl0cywgSWdub3JlIHJlY2VpdmVzIG9mIGRhdGEgZnJhbWVzCiAJCSAqLwotCQlpZiAoaHctPmpvaW5fYXAgPT0gMikgewotCQkJaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3Qgam9pbnJlcTsKLQkJCWpvaW5yZXEgPSBody0+am9pbnJlcTsKLQkJCS8qIFNlbmQgdGhlIGpvaW4gcmVxdWVzdCAqLwotCQkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywKLQkJCQkJICAgICAgIEhGQTM4NHhfUklEX0pPSU5SRVFVRVNULAotCQkJCQkgICAgICAgJmpvaW5yZXEsCi0JCQkJCSAgICAgICBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4pOworCQlpZiAod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikKIAkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAibGlua3N0YXR1cz1ESVNDT05ORUNURUQgKHJlLXN1Ym1pdHRpbmcgam9pbilcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAgICAibGlua3N0YXR1cz1ESVNDT05ORUNURUQgKHVuaGFuZGxlZClcbiIpOwotCQl9CisJCQkgICAgICAgImxpbmtzdGF0dXM9RElTQ09OTkVDVEVEICh1bmhhbmRsZWQpXG4iKTsKIAkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9OT05FOwogCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHdsYW5kZXYtPm5ldGRldik7CiAKKwkJLyogc2lnbmFsIGJhY2sgdXAgdG8gY2ZnODAyMTEgbGF5ZXIgKi8KKwkJcHJpc20yX2Rpc2Nvbm5lY3RlZCh3bGFuZGV2KTsKKwogCQlicmVhazsKIAogCWNhc2UgSEZBMzg0eF9MSU5LX0FQX0NIQU5HRToKQEAgLTEzNzYsNiArMTM3Myw5IEBACiAJCWh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19DT05ORUNURUQ7CiAJCW5ldGlmX2NhcnJpZXJfb24od2xhbmRldi0+bmV0ZGV2KTsKIAorCQkvKiBzaWduYWwgYmFjayB1cCB0byBjZmc4MDIxMSBsYXllciAqLworCQlwcmlzbTJfcm9hbWVkKHdsYW5kZXYpOworCiAJCWJyZWFrOwogCiAJY2FzZSBIRkEzODR4X0xJTktfQVBfT1VUT0ZSQU5HRToKQEAgLTE0MzUsNiArMTQzNSw5IEBACiAKIAkJbmV0aWZfY2Fycmllcl9vZmYod2xhbmRldi0+bmV0ZGV2KTsKIAorCQkvKiBzaWduYWwgYmFjayB1cCB0byBjZmc4MDIxMSBsYXllciAqLworCQlwcmlzbTJfY29ubmVjdF9yZXN1bHQod2xhbmRldiwgUDgwMjExRU5VTV90cnV0aF90cnVlKTsKKwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xNDQ2LDcgKzE0NDksNiBAQAogCX0KIAogCXdsYW5kZXYtPmxpbmtzdGF0dXMgPSAoaHctPmxpbmtfc3RhdHVzID09IEhGQTM4NHhfTElOS19DT05ORUNURUQpOwotCXA4MDIxMXdleHRfZXZlbnRfYXNzb2NpYXRlZCh3bGFuZGV2LCB3bGFuZGV2LT5saW5rc3RhdHVzKTsKIAogZmFpbGVkOgogCXJldHVybjsKQEAgLTE5ODUsNiArMTk4Nyw5IEBACiAJaGZhMzg0eF90ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgY29tbXNxdWFsX2JoKTsKIAl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBody0+d2xhbmRldjsKIAloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgbXNnOworCXA4MDIxMWl0ZW1fdWludDMyX3QgKm1pYml0ZW0gPSAocDgwMjExaXRlbV91aW50MzJfdCAqKQorCQkJCQkJJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKIAlpbnQgcmVzdWx0ID0gMDsKIAogCWlmIChody0+d2xhbmRldi0+aHdyZW1vdmVkKQpAQCAtMjAxMyw2ICsyMDE4LDM0IEBACiAJCQkgbGUxNl90b19jcHUoaHctPnF1YWwuQU5MX2N1cnJGQykpOwogCX0KIAorCS8qIEdldCB0aGUgc2lnbmFsIHJhdGUgKi8KKwltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CisJbWliaXRlbS0+ZGlkID0gRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoImdldCBzaWduYWwgcmF0ZSBmYWlsZWQsIHJlc3VsdCA9ICVkXG4iLAorCQkJIHJlc3VsdCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKG1pYml0ZW0tPmRhdGEpIHsKKwljYXNlIEhGQTM4NHhfUkFURUJJVF8xOgorCQlody0+dHhyYXRlID0gMTA7CisJCWJyZWFrOworCWNhc2UgSEZBMzg0eF9SQVRFQklUXzI6CisJCWh3LT50eHJhdGUgPSAyMDsKKwkJYnJlYWs7CisJY2FzZSBIRkEzODR4X1JBVEVCSVRfNWRvdDU6CisJCWh3LT50eHJhdGUgPSA1NTsKKwkJYnJlYWs7CisJY2FzZSBIRkEzODR4X1JBVEVCSVRfMTE6CisJCWh3LT50eHJhdGUgPSAxMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJCYWQgcmF0ZWJpdCAoJWQpXG4iLCBtaWJpdGVtLT5kYXRhKTsKKwl9CisKIAkvKiBMYXN0bHksIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBCU1NJRCBkaWRuJ3QgY2hhbmdlIG9uIHVzICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywKIAkJCQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYwppbmRleCBmNWNmZjc1Li40ZWZhMDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJfQogCWh3ID0gd2xhbmRldi0+cHJpdjsKIAotCWlmICh3bGFuX3NldHVwKHdsYW5kZXYpICE9IDApIHsKKwlpZiAod2xhbl9zZXR1cCh3bGFuZGV2LCAmKGludGVyZmFjZS0+ZGV2KSkgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwogCQlyZXN1bHQgPSAtRUlPOwogCQlnb3RvIGZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0kuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4MDNkZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIF9YR0lfSAotI2RlZmluZSBfWEdJX0gKLQotI2lmIDEKLSNkZWZpbmUgVFdERUJVRyh4KQotI2Vsc2UKLSNkZWZpbmUgVFdERUJVRyh4KSBwcmludGsoS0VSTl9JTkZPIHggIlxuIik7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX2FjY2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX2FjY2VsLmMKaW5kZXggODZlYzM0Mi4uNzk1NDk3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9hY2NlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfYWNjZWwuYwpAQCAtMzcsMzcgKzM3LDE3IEBACiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0vKgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2luY2x1ZGUgPGxpbnV4L1hHSWZiLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZpZGVvL1hHSWZiLmg+Ci0jZW5kaWYKLSovCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpZmRlZiBDT05GSUdfTVRSUgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjZW5kaWYKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2luY2x1ZGUgPHZpZGVvL2ZiY29uLmg+Ci0jaW5jbHVkZSA8dmlkZW8vZmJjb24tY2ZiOC5oPgotI2luY2x1ZGUgPHZpZGVvL2ZiY29uLWNmYjE2Lmg+Ci0jaW5jbHVkZSA8dmlkZW8vZmJjb24tY2ZiMjQuaD4KLSNpbmNsdWRlIDx2aWRlby9mYmNvbi1jZmIzMi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJvc2RlZi5oIgogI2luY2x1ZGUgInZnYXR5cGVzLmgiCiAjaW5jbHVkZSAidmJfc3RydWN0LmgiCiAjaW5jbHVkZSAiWEdJZmIuaCIKICNpbmNsdWRlICJYR0lfYWNjZWwuaCIKIAotCi1leHRlcm4gc3RydWN0ICAgICB2aWRlb19pbmZvIHhnaV92aWRlb19pbmZvOwotZXh0ZXJuIGludCBYR0lmYl9hY2NlbDsKLQogc3RhdGljIGNvbnN0IGludCBYR0lBTFVDb252W10gPQogewogICAgIDB4MDAsICAgICAgIC8qIGRlc3QgPSAwOyAgICAgICAgICAgIDAsICAgICAgR1hjbGVhciwgICAgICAgIDAgKi8KQEAgLTEwOCwxMDkgKzg4LDE3IEBACiAgICAgMHhGRiwgICAgICAgLyogZGVzdCA9IDB4RkY7ICAgICAgICAgMSwgICAgICBHWHNldCwgICAgICAgICAgMHhGICovCiB9OwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwzNCkKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG15cm9wc1tdID0gewogICAgCTMsIDEwLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzCiAgICB9OwotI2VuZGlmCiAKIC8qIDMwMCBzZXJpZXMgKi8KLSNpZiAwCi1zdGF0aWMgdm9pZAotWEdJMzAwU3luYyh2b2lkKQotewotCVhHSTMwMElkbGUKLX0KLSNlbmRpZgogc3RhdGljIHZvaWQKIFhHSTMxMFN5bmModm9pZCkKIHsKIAlYR0kzMTBJZGxlCiB9Ci0jaWYgMAotc3RhdGljIHZvaWQKLVhHSTMwMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KGludCB4ZGlyLCBpbnQgeWRpciwgaW50IHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBsYW5lbWFzaywgaW50IHRyYW5zX2NvbG9yKQotewotCVhHSTMwMFNldHVwRFNUQ29sb3JEZXB0aCh4Z2lfdmlkZW9faW5mby5Ec3RDb2xvcik7Ci0JWEdJMzAwU2V0dXBTUkNQaXRjaCh4Z2lfdmlkZW9faW5mby52aWRlb19saW5lbGVuZ3RoKQotCVhHSTMwMFNldHVwRFNUUmVjdCh4Z2lfdmlkZW9faW5mby52aWRlb19saW5lbGVuZ3RoLCAweEZGRikKIAotCWlmKHRyYW5zX2NvbG9yICE9IC0xKSB7Ci0JCVhHSTMwMFNldHVwUk9QKDB4MEEpCi0JCVhHSTMwMFNldHVwU1JDVHJhbnModHJhbnNfY29sb3IpCi0JCVhHSTMwMFNldHVwQ01ERmxhZyhUUkFOU1BBUkVOVF9CSVRCTFQpCi0JfSBlbHNlIHsKLQkgICAgICAgIFhHSTMwMFNldHVwUk9QKFhHSUFMVUNvbnZbcm9wXSkKLQl9Ci0JaWYoeGRpciA+IDApIHsKLQkJWEdJMzAwU2V0dXBDTURGbGFnKFhfSU5DKQotCX0KLQlpZih5ZGlyID4gMCkgewotCQlYR0kzMDBTZXR1cENNREZsYWcoWV9JTkMpCi0JfQotfQotCi1zdGF0aWMgdm9pZAotWEdJMzAwU3Vic2VxdWVudFNjcmVlblRvU2NyZWVuQ29weShpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IGRzdF94LCBpbnQgZHN0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQlsb25nIHNyY2Jhc2UsIGRzdGJhc2U7Ci0KLQlzcmNiYXNlID0gZHN0YmFzZSA9IDA7Ci0JaWYgKHNyY195ID49IDIwNDgpIHsKLQkJc3JjYmFzZSA9IHhnaV92aWRlb19pbmZvLnZpZGVvX2xpbmVsZW5ndGggKiBzcmNfeTsKLQkJc3JjX3kgPSAwOwotCX0KLQlpZiAoZHN0X3kgPj0gMjA0OCkgewotCQlkc3RiYXNlID0geGdpX3ZpZGVvX2luZm8udmlkZW9fbGluZWxlbmd0aCAqIGRzdF95OwotCQlkc3RfeSA9IDA7Ci0JfQotCi0JWEdJMzAwU2V0dXBTUkNCYXNlKHNyY2Jhc2UpOwotCVhHSTMwMFNldHVwRFNUQmFzZShkc3RiYXNlKTsKLQotCWlmKCEoeGdpX3ZpZGVvX2luZm8uQ29tbWFuZFJlZyAmIFhfSU5DKSkgIHsKLQkJc3JjX3ggKz0gd2lkdGgtMTsKLQkJZHN0X3ggKz0gd2lkdGgtMTsKLQl9Ci0JaWYoISh4Z2lfdmlkZW9faW5mby5Db21tYW5kUmVnICYgWV9JTkMpKSAgewotCQlzcmNfeSArPSBoZWlnaHQtMTsKLQkJZHN0X3kgKz0gaGVpZ2h0LTE7Ci0JfQotCVhHSTMwMFNldHVwUmVjdCh3aWR0aCwgaGVpZ2h0KQotCVhHSTMwMFNldHVwU1JDWFkoc3JjX3gsIHNyY195KQotCVhHSTMwMFNldHVwRFNUWFkoZHN0X3gsIGRzdF95KQotCVhHSTMwMERvQ01ECi19Ci0KLXN0YXRpYyB2b2lkCi1YR0kzMDBTZXR1cEZvclNvbGlkRmlsbChpbnQgY29sb3IsIGludCByb3AsIHVuc2lnbmVkIGludCBwbGFuZW1hc2spCi17Ci0JWEdJMzAwU2V0dXBQQVRGRyhjb2xvcikKLQlYR0kzMDBTZXR1cERTVFJlY3QoeGdpX3ZpZGVvX2luZm8udmlkZW9fbGluZWxlbmd0aCwgMHhGRkYpCi0JWEdJMzAwU2V0dXBEU1RDb2xvckRlcHRoKHhnaV92aWRlb19pbmZvLkRzdENvbG9yKTsKLQlYR0kzMDBTZXR1cFJPUChYR0lQYXRBTFVDb252W3JvcF0pCi0JWEdJMzAwU2V0dXBDTURGbGFnKFBBVEZHKQotfQotCi1zdGF0aWMgdm9pZAotWEdJMzAwU3Vic2VxdWVudFNvbGlkRmlsbFJlY3QoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCi17Ci0JbG9uZyBkc3RiYXNlOwotCi0JZHN0YmFzZSA9IDA7Ci0JaWYoeSA+PSAyMDQ4KSB7Ci0JCWRzdGJhc2UgPSB4Z2lfdmlkZW9faW5mby52aWRlb19saW5lbGVuZ3RoICogeTsKLQkJeSA9IDA7Ci0JfQotCVhHSTMwMFNldHVwRFNUQmFzZShkc3RiYXNlKQotCVhHSTMwMFNldHVwRFNUWFkoeCx5KQotCVhHSTMwMFNldHVwUmVjdCh3LGgpCi0JWEdJMzAwU2V0dXBDTURGbGFnKFhfSU5DIHwgWV9JTkMgfCBCSVRCTFQpCi0JWEdJMzAwRG9DTUQKLX0KLSNlbmRpZgogLyogMzEwLzMyNSBzZXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkCkBAIC0zMjYsOCArMjE0LDYgQEAKIAogfQogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwzNCkgIC8qIC0tLSBLRVJORUwgMi41LjM0IGFuZCBsYXRlciAtLS0gKi8KLQogaW50IGZiY29uX1hHSV9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogICAgIGlmKCFYR0lmYl9hY2NlbCkgcmV0dXJuIDA7CkBAIC0zOTksMTk4ICsyODUsNSBAQAogCiB9CiAKLSNlbmRpZgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNSwzMykgIC8qIC0tLS0tLSBLRVJORUwgPDIuNS4zNCAtLS0tLS0gKi8KLQotdm9pZCBmYmNvbl9YR0lfYm1vdmUoc3RydWN0IGRpc3BsYXkgKnAsIGludCBzcmN5LCBpbnQgc3JjeCwKLQkJCSAgICBpbnQgZHN0eSwgaW50IGRzdHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKLXsKLSAgICAgICAgaW50IHhkaXIsIHlkaXI7Ci0JQ1JJVEZMQUdTCi0KLQlpZigheGdpX3ZpZGVvX2luZm8uYWNjZWwpIHsKLQkgICAgc3dpdGNoKHhnaV92aWRlb19pbmZvLnZpZGVvX2JwcCkgewotCSAgICBjYXNlIDg6Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLQkgICAgICAgZmJjb25fY2ZiOF9ibW92ZShwLCBzcmN5LCBzcmN4LCBkc3R5LCBkc3R4LCBoZWlnaHQsIHdpZHRoKTsKLSNlbmRpZgotCSAgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjoKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQkgICAgICAgZmJjb25fY2ZiMTZfYm1vdmUocCwgc3JjeSwgc3JjeCwgZHN0eSwgZHN0eCwgaGVpZ2h0LCB3aWR0aCk7Ci0jZW5kaWYKLQkgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzI6Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi0JICAgICAgIGZiY29uX2NmYjMyX2Jtb3ZlKHAsIHNyY3ksIHNyY3gsIGRzdHksIGRzdHgsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCSAgICByZXR1cm47Ci0JfQotCi0Jc3JjeCAqPSBmb250d2lkdGgocCk7Ci0Jc3JjeSAqPSBmb250aGVpZ2h0KHApOwotCWRzdHggKj0gZm9udHdpZHRoKHApOwotCWRzdHkgKj0gZm9udGhlaWdodChwKTsKLQl3aWR0aCAqPSBmb250d2lkdGgocCk7Ci0JaGVpZ2h0ICo9IGZvbnRoZWlnaHQocCk7Ci0KLQlpZihzcmN4IDwgZHN0eCkgeGRpciA9IDA7Ci0JZWxzZSAgICAgICAgICAgIHhkaXIgPSAxOwotCWlmKHNyY3kgPCBkc3R5KSB5ZGlyID0gMDsKLQllbHNlICAgICAgICAgICAgeWRpciA9IDE7Ci0KLQotCSAgIENSSVRCRUdJTgotCSAgIFhHSTMxMFNldHVwRm9yU2NyZWVuVG9TY3JlZW5Db3B5KHhkaXIsIHlkaXIsIDMsIDAsIC0xKTsKLQkgICBYR0kzMTBTdWJzZXF1ZW50U2NyZWVuVG9TY3JlZW5Db3B5KHNyY3gsIHNyY3ksIGRzdHgsIGRzdHksIHdpZHRoLCBoZWlnaHQpOwotCSAgIENSSVRFTkQKLQkgICBYR0kzMTBTeW5jKCk7Ci0jaWYgMAotCSAgIHByaW50ayhLRVJOX0lORk8gIlhHSV9ibW92ZSBzeCAlZCBzeSAlZCBkeCAlZCBkeSAlZCB3ICVkIGggJWRcbiIsCi0JCXNyY3gsIHNyY3ksIGRzdHgsIGRzdHksIHdpZHRoLCBoZWlnaHQpOwotI2VuZGlmCi0KLX0KLQotCi1zdGF0aWMgdm9pZCBmYmNvbl9YR0lfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJaW50IHNyY3ksIGludCBzcmN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBjb2xvcikKLXsKLQlDUklURkxBR1MKLQotCXNyY3ggKj0gZm9udHdpZHRoKHApOwotCXNyY3kgKj0gZm9udGhlaWdodChwKTsKLQl3aWR0aCAqPSBmb250d2lkdGgocCk7Ci0JaGVpZ2h0ICo9IGZvbnRoZWlnaHQocCk7Ci0KLQotCSAgIENSSVRCRUdJTgotCSAgIFhHSTMxMFNldHVwRm9yU29saWRGaWxsKGNvbG9yLCAzLCAwKTsKLQkgICBYR0kzMTBTdWJzZXF1ZW50U29saWRGaWxsUmVjdChzcmN4LCBzcmN5LCB3aWR0aCwgaGVpZ2h0KTsKLQkgICBDUklURU5ECi0JICAgWEdJMzEwU3luYygpOwotCi19Ci0KLXZvaWQgZmJjb25fWEdJX2NsZWFyOChzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCi0JCQlpbnQgc3JjeSwgaW50IHNyY3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKLXsKLQl1MzIgYmd4OwotCi0JaWYoIXhnaV92aWRlb19pbmZvLmFjY2VsKSB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLQkgICAgZmJjb25fY2ZiOF9jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoKTsKLSNlbmRpZgotCSAgICByZXR1cm47Ci0JfQotCi0JYmd4ID0gYXR0cl9iZ2NvbF9lYyhwLCBjb25wKTsKLQlmYmNvbl9YR0lfY2xlYXIoY29ucCwgcCwgc3JjeSwgc3JjeCwgaGVpZ2h0LCB3aWR0aCwgYmd4KTsKLX0KLQotdm9pZCBmYmNvbl9YR0lfY2xlYXIxNihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCi0JCQlpbnQgc3JjeSwgaW50IHNyY3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKLXsKLQl1MzIgYmd4OwotCWlmKCF4Z2lfdmlkZW9faW5mby5hY2NlbCkgewotI2lmZGVmIEZCQ09OX0hBU19DRkIxNgotCSAgICBmYmNvbl9jZmIxNl9jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoKTsKLSNlbmRpZgotCSAgICByZXR1cm47Ci0JfQotCi0JYmd4ID0gKCh1X2ludDE2X3QqKXAtPmRpc3Bzd19kYXRhKVthdHRyX2JnY29sX2VjKHAsIGNvbnApXTsKLQlmYmNvbl9YR0lfY2xlYXIoY29ucCwgcCwgc3JjeSwgc3JjeCwgaGVpZ2h0LCB3aWR0aCwgYmd4KTsKLX0KLQotdm9pZCBmYmNvbl9YR0lfY2xlYXIzMihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCi0JCQlpbnQgc3JjeSwgaW50IHNyY3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKLXsKLQl1MzIgYmd4OwotCi0JaWYoIXhnaV92aWRlb19pbmZvLmFjY2VsKSB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi0JICAgIGZiY29uX2NmYjMyX2NsZWFyKGNvbnAsIHAsIHNyY3ksIHNyY3gsIGhlaWdodCwgd2lkdGgpOwotI2VuZGlmCi0JICAgIHJldHVybjsKLQl9Ci0KLQliZ3ggPSAoKHVfaW50MzJfdCopcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2xfZWMocCwgY29ucCldOwotCWZiY29uX1hHSV9jbGVhcihjb25wLCBwLCBzcmN5LCBzcmN4LCBoZWlnaHQsIHdpZHRoLCBiZ3gpOwotfQotCi12b2lkIGZiY29uX1hHSV9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3JjeCwgaW50IHNyY3kpCi17Ci0JQ1JJVEZMQUdTCi0KLQlpZigheGdpX3ZpZGVvX2luZm8uYWNjZWwpIHsKLQkgICAgc3dpdGNoKHhnaV92aWRlb19pbmZvLnZpZGVvX2JwcCkgewotCSAgICBjYXNlIDE2OgotI2lmZGVmIEZCQ09OX0hBU19DRkIxNgotCSAgICAgICBmYmNvbl9jZmIxNl9yZXZjKHAsIHNyY3gsIHNyY3kpOwotI2VuZGlmCi0JICAgICAgIGJyZWFrOwotCSAgICBjYXNlIDMyOgotI2lmZGVmIEZCQ09OX0hBU19DRkIzMgotCSAgICAgICBmYmNvbl9jZmIzMl9yZXZjKHAsIHNyY3gsIHNyY3kpOwotI2VuZGlmCi0JICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCSAgICByZXR1cm47Ci0JfQotCi0Jc3JjeCAqPSBmb250d2lkdGgocCk7Ci0Jc3JjeSAqPSBmb250aGVpZ2h0KHApOwotCi0KLQkgICBDUklUQkVHSU4KLQkgICBYR0kzMTBTZXR1cEZvclNvbGlkRmlsbCgwLCAweDBhLCAwKTsKLQkgICBYR0kzMTBTdWJzZXF1ZW50U29saWRGaWxsUmVjdChzcmN4LCBzcmN5LCBmb250d2lkdGgocCksIGZvbnRoZWlnaHQocCkpOwotCSAgIENSSVRFTkQKLQkgICBYR0kzMTBTeW5jKCk7Ci0KLX0KLQotI2lmZGVmIEZCQ09OX0hBU19DRkI4Ci1zdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fWEdJOCA9IHsKLQlzZXR1cDoJCQlmYmNvbl9jZmI4X3NldHVwLAotCWJtb3ZlOgkJCWZiY29uX1hHSV9ibW92ZSwKLQljbGVhcjoJCQlmYmNvbl9YR0lfY2xlYXI4LAotCXB1dGM6CQkJZmJjb25fY2ZiOF9wdXRjLAotCXB1dGNzOgkJCWZiY29uX2NmYjhfcHV0Y3MsCi0JcmV2YzoJCQlmYmNvbl9jZmI4X3JldmMsCi0JY2xlYXJfbWFyZ2luczoJCWZiY29uX2NmYjhfY2xlYXJfbWFyZ2lucywKLQlmb250d2lkdGhtYXNrOgkJRk9OVFdJRFRIKDQpfEZPTlRXSURUSCg4KXxGT05UV0lEVEgoMTIpfEZPTlRXSURUSCgxNikKLX07Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLXN0cnVjdCBkaXNwbGF5X3N3aXRjaCBmYmNvbl9YR0kxNiA9IHsKLQlzZXR1cDoJCQlmYmNvbl9jZmIxNl9zZXR1cCwKLQlibW92ZToJCQlmYmNvbl9YR0lfYm1vdmUsCi0JY2xlYXI6CQkJZmJjb25fWEdJX2NsZWFyMTYsCi0JcHV0YzoJCQlmYmNvbl9jZmIxNl9wdXRjLAotCXB1dGNzOgkJCWZiY29uX2NmYjE2X3B1dGNzLAotCXJldmM6CQkJZmJjb25fWEdJX3JldmMsCi0JY2xlYXJfbWFyZ2luczoJCWZiY29uX2NmYjE2X2NsZWFyX21hcmdpbnMsCi0JZm9udHdpZHRobWFzazoJCUZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCi19OwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi1zdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fWEdJMzIgPSB7Ci0Jc2V0dXA6CQkJZmJjb25fY2ZiMzJfc2V0dXAsCi0JYm1vdmU6CQkJZmJjb25fWEdJX2Jtb3ZlLAotCWNsZWFyOgkJCWZiY29uX1hHSV9jbGVhcjMyLAotCXB1dGM6CQkJZmJjb25fY2ZiMzJfcHV0YywKLQlwdXRjczoJCQlmYmNvbl9jZmIzMl9wdXRjcywKLQlyZXZjOgkJCWZiY29uX1hHSV9yZXZjLAotCWNsZWFyX21hcmdpbnM6CQlmYmNvbl9jZmIzMl9jbGVhcl9tYXJnaW5zLAotCWZvbnR3aWR0aG1hc2s6CQlGT05UV0lEVEgoNCl8Rk9OVFdJRFRIKDgpfEZPTlRXSURUSCgxMil8Rk9OVFdJRFRIKDE2KQotfTsKLSNlbmRpZgotCi0jZW5kaWYgLyogS0VSTkVMIFZFUlNJT04gKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX2FjY2VsLmggYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX2FjY2VsLmgKaW5kZXggMDRlMTI2Ny4uMjhjMDU3OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfYWNjZWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX2FjY2VsLmgKQEAgLTQ5MSwyMSArNDkxLDkgQEAKIAogZXh0ZXJuIHN0cnVjdCB2aWRlb19pbmZvIHhnaV92aWRlb19pbmZvOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNSwzMykKLXZvaWQgZmJjb25fWEdJX2Jtb3ZlKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3JjeSwgaW50IHNyY3gsIGludCBkc3R5LAotICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHgsIGludCBoZWlnaHQsIGludCB3aWR0aCk7Ci12b2lkIGZiY29uX1hHSV9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3JjeSwgaW50IHNyY3gpOwotdm9pZCBmYmNvbl9YR0lfY2xlYXI4KHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHNyY3ksCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3gsIGludCBoZWlnaHQsIGludCB3aWR0aCk7Ci12b2lkIGZiY29uX1hHSV9jbGVhcjE2KHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHNyY3ksCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOwotdm9pZCBmYmNvbl9YR0lfY2xlYXIzMihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsIGludCBzcmN5LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKLSNlbmRpZgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMzQpCiBleHRlcm4gaW50IFhHSWZiX2FjY2VsOwogdm9pZCBmYmNvbl9YR0lfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CiB2b2lkIGZiY29uX1hHSV9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKTsKLSNlbmRpZgorCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW4uaAppbmRleCA0ZjQxNzFlLi5mZDExNTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW4uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW4uaApAQCAtNDIsMTcgKzQyLDEwIEBACiAKIAogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDgpCiAjZGVmaW5lIFhHSV9JT1RZUEUxIHZvaWQgX19pb21lbQogI2RlZmluZSBYR0lfSU9UWVBFMiBfX2lvbWVtCiAjZGVmaW5lIFhHSUlOSVRTVEFUSUMgc3RhdGljCi0jZWxzZQotI2RlZmluZSBYR0lfSU9UWVBFMSB1bnNpZ25lZCBjaGFyCi0jZGVmaW5lIFhHSV9JT1RZUEUyCi0jZGVmaW5lIFhHSUlOSVRTVEFUSUMKLSNlbmRpZgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9fZGV2aW5pdGRhdGEgeGdpZmJfcGNpX3RhYmxlW10gPSB7CiAKIAl7IFBDSV9WRU5ET1JfSURfWEcsIFBDSV9ERVZJQ0VfSURfWEdfMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LApAQCAtNjMsNyArNTYsNyBAQAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHhnaWZiX3BjaV90YWJsZSk7Ci0jZW5kaWYKKwogLyogVG8gYmUgaW5jbHVkZWQgaW4gZmIuaCAqLwogI2lmbmRlZiBGQl9BQ0NFTF9YR0lfR0xBTU9VUl8yCiAjZGVmaW5lIEZCX0FDQ0VMX1hHSV9HTEFNT1VSXzIgIDQwCS8qIFhHSSAzMTUsIDY1MCwgNzQwCQkqLwpAQCAtMjU1LDkgKzI0OCw2IEBACiAjZGVmaW5lIEJSSV9EUkFNX1NJWkVfMzJNQiAgICAgICAgMHgwNAogI2RlZmluZSBCUklfRFJBTV9TSVpFXzY0TUIgICAgICAgIDB4MDUKIAotI2RlZmluZSBIV19ERVZJQ0VfRVhURU5TSU9OCSAgWEdJX0hXX0RFVklDRV9JTkZPCi0jZGVmaW5lIFBIV19ERVZJQ0VfRVhURU5TSU9OICAgICAgUFhHSV9IV19ERVZJQ0VfSU5GTwotCiAjZGVmaW5lIFNSX0JVRkZFUl9TSVpFICAgICAgICAgICAgNQogI2RlZmluZSBDUl9CVUZGRVJfU0laRSAgICAgICAgICAgIDUKIApAQCAtMzAwLDExICsyOTAsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIEZiY29uIHZhcmlhYmxlcyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyogZmJfaW5mbzsKLSNlbHNlCi1zdGF0aWMgc3RydWN0IGZiX2luZm8gWEdJX2ZiX2luZm87Ci0jZW5kaWYKIAogCiBzdGF0aWMgaW50ICAgIHZpZGVvX3R5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CkBAIC0zMzYsMTIgKzMyMiw4IEBACiAJLnZzeW5jX2xlbgk9IDAsCiAJLnN5bmMJCT0gMCwKIAkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkucmVzZXJ2ZWQJPSB7MCwgMCwgMCwgMCwgMCwgMH0KLSNlbmRpZgogfTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gWEdJZmJfZml4ID0gewogCS5pZAkJPSAiWEdJIiwKIAkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCkBAIC0zNTAsMjggKzMzMiw3IEBACiB9Owogc3RhdGljIGNoYXIgbXlpZFsyMF07CiBzdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKLSNlbmRpZgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1zdGF0aWMgc3RydWN0IGRpc3BsYXkgWEdJX2Rpc3A7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggWEdJZmJfc3c7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCXUxNiBibHVlLCBncmVlbiwgcmVkLCBwYWQ7Ci19IFhHSV9wYWxldHRlWzI1Nl07Ci0KLXN0YXRpYyB1bmlvbiB7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JdTE2IGNmYjE2WzE2XTsKLSNlbmRpZgotI2lmZGVmIEZCQ09OX0hBU19DRkIzMgotCXUzMiBjZmIzMlsxNl07Ci0jZW5kaWYKLX0gWEdJX2ZiY29uX2NtYXA7Ci0KLXN0YXRpYyBpbnQgWEdJZmJfaW52ZXJzZSA9IDA7Ci0jZW5kaWYKIAogLyogZGlzcGxheSBzdGF0dXMgKi8KIHN0YXRpYyBpbnQgWEdJZmJfb2ZmID0gMDsKQEAgLTM4MCw5ICszNDEsNiBAQAogc3RhdGljIGludCBYR0l2Z2FfZW5hYmxlZCA9IDA7CiBzdGF0aWMgaW50IFhHSWZiX3VzZXJvbSA9IDA7CiAvL3N0YXRpYyBpbnQgWEdJZmJfdXNlb2VtID0gLTE7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi1zdGF0aWMgaW50IGN1cnJjb24gPSAwOwotI2VuZGlmCiAKIC8qIGdsb2JhbCBmbGFncyAqLwogc3RhdGljIGludCBYR0lmYl9yZWdpc3RlcmVkOwpAQCAtNDE1LDEwICszNzMsMTAgQEAKIC8qIFhHSWZiX2luZm8gWEdJZmJpbmZvOyAqLwogCiAvKiBUVzogSGFyZHdhcmUgZXh0ZW5zaW9uOyBjb250YWlucyBkYXRhIG9uIGhhcmR3YXJlICovCi1IV19ERVZJQ0VfRVhURU5TSU9OIFhHSWh3X2V4dDsKK3N0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gWEdJaHdfZXh0OwogCiAvKiBUVzogWEdJIHByaXZhdGUgc3RydWN0dXJlICovCi1WQl9ERVZJQ0VfSU5GTyAgWEdJX1ByOworc3RydWN0IHZiX2RldmljZV9pbmZvICBYR0lfUHI7CiAKIC8qIGNhcmQgcGFyYW1ldGVycyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgWEdJZmJfbW1pb19zaXplID0gMDsKQEAgLTUzMCwyOSArNDg4LDIxIEBACiAKIC8qIG1vZGUtcmVsYXRlZCB2YXJpYWJsZXMgKi8KICNpZmRlZiBNT0RVTEUKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCiBzdGF0aWMgaW50IHhnaWZiX21vZGVfaWR4ID0gMTsKICNlbHNlCi1zdGF0aWMgaW50IFhHSWZiX21vZGVfaWR4ID0gTU9ERV9JTkRFWF9OT05FOyAgLyogRG9uJ3QgdXNlIGEgbW9kZSBieSBkZWZhdWx0IGlmIHdlIGFyZSBhIG1vZHVsZSAqLwotI2VuZGlmCi0jZWxzZQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIHN0YXRpYyBpbnQgeGdpZmJfbW9kZV9pZHggPSAtMTsgICAgICAgICAgICAgICAvKiBVc2UgYSBkZWZhdWx0IG1vZGUgaWYgd2UgYXJlIGluc2lkZSB0aGUga2VybmVsICovCi0jZWxzZQotc3RhdGljIGludCBYR0lmYl9tb2RlX2lkeCA9IC0xOwotI2VuZGlmCiAjZW5kaWYKIHU4ICBYR0lmYl9tb2RlX25vICA9IDA7CiB1OCAgWEdJZmJfcmF0ZV9pZHggPSAwOwogCiAvKiBUVzogQ1IzNiBldmFsdWF0aW9uICovCi1jb25zdCBVU0hPUlQgWEdJMzAwcGFuZWx0eXBlW10gPQorY29uc3QgdW5zaWduZWQgc2hvcnQgWEdJMzAwcGFuZWx0eXBlW10gPQogICAgIHsgTENEX1VOS05PV04sICAgTENEXzgwMHg2MDAsICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAogICAgICAgTENEXzEyODB4OTYwLCAgTENEXzY0MHg0ODAsICBMQ0RfMTAyNHg2MDAsICBMQ0RfMTE1Mng3NjgsCiAgICAgICAgTENEXzEwMjR4NzY4LCBMQ0RfMTAyNHg3NjgsICBMQ0RfMTAyNHg3NjgsCiAgICAgICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTAyNHg3NjgsIExDRF8xMDI0eDc2OCwgIExDRF8xMDI0eDc2OCB9OwogCi1jb25zdCBVU0hPUlQgWEdJMzEwcGFuZWx0eXBlW10gPQorY29uc3QgdW5zaWduZWQgc2hvcnQgWEdJMzEwcGFuZWx0eXBlW10gPQogICAgIHsgTENEX1VOS05PV04sICAgTENEXzgwMHg2MDAsICBMQ0RfMTAyNHg3NjgsICBMQ0RfMTI4MHgxMDI0LAogICAgICAgTENEXzY0MHg0ODAsICAgTENEXzEwMjR4NjAwLCBMQ0RfMTE1Mng4NjQsICBMQ0RfMTI4MHg5NjAsCiAgICAgICBMQ0RfMTE1Mng3NjgsICBMQ0RfMTQwMHgxMDUwLExDRF8xMjgweDc2OCwgIExDRF8xNjAweDEyMDAsCkBAIC02NDgsMTcgKzU5OCw2IEBACiAJeyAwLCAgICAgIDAsICAgICAgIiIgICAgICAgLCAiIiAgICAgICB9CiB9OwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0vKiBPZmZzY3JlZW4gbGF5b3V0ICovCi10eXBlZGVmIHN0cnVjdCBfWEdJX0dMWUlORk8gewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JaW50IGZvbnR3aWR0aDsKLQlpbnQgZm9udGhlaWdodDsKLQl1OCBnbWFza1s3Ml07Ci0JaW50IG5nbWFzazsKLX0gWEdJX0dMWUlORk87Ci0jZW5kaWYKLQogdHlwZWRlZiBzdHJ1Y3QgX1hHSV9PSCB7CiAJc3RydWN0IF9YR0lfT0ggKnBvaF9uZXh0OwogCXN0cnVjdCBfWEdJX09IICpwb2hfcHJldjsKQEAgLTg1Miw1MCArNzkxLDYgQEAKIAogCiAvKiBmYmRldiByb3V0aW5lcyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgIGludAlYR0lmYl9pbml0KHZvaWQpOwotc3RhdGljIGludCAgICAgIFhHSWZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCi0JCQkgICAgICBpbnQgY29uLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIFhHSWZiX2dldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgICBpbnQgY29uLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCAgICAgIFhHSWZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgICBpbnQgY29uLAotCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIHZvaWQgICAgIFhHSWZiX2NydGNfdG9fdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKTsKLXN0YXRpYyBpbnQgICAgICBYR0lmYl9nZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwKLQkJCSAgICAgICBpbnQga3NwYywKLQkJCSAgICAgICBpbnQgY29uLAotCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBYR0lmYl9zZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwKLQkJCSAgICAgICBpbnQga3NwYywKLQkJCSAgICAgICBpbnQgY29uLAotCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBYR0lmYl91cGRhdGVfdmFyKGludCBjb24sCi0JCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgICAgICBYR0lmYl9zd2l0Y2goaW50IGNvbiwKLQkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIHZvaWQgICAgIFhHSWZiX2JsYW5rKGludCBibGFuaywKLQkJCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgdm9pZCAgICAgWEdJZmJfc2V0X2Rpc3AoaW50IGNvbiwKLQkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgICAgWEdJX2dldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgKnJlZCwgdW5zaWduZWQgKmdyZWVuLAotCQkJICAgICAgdW5zaWduZWQgKmJsdWUsIHVuc2lnbmVkICp0cmFuc3AsCi0JCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyk7Ci1zdGF0aWMgdm9pZCAgICAgWEdJZmJfZG9faW5zdGFsbF9jbWFwKGludCBjb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyB2b2lkICAgICBYR0lfZ2V0X2dseXBoKHN0cnVjdCBmYl9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEdJX0dMWUlORk8gKmdseSk7Ci1zdGF0aWMgaW50IAlYR0lmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci1zdGF0aWMgaW50ICAgICAgWEdJZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICAJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgY29uLAotCQkgICAgICAgCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKIFhHSUlOSVRTVEFUSUMgaW50IF9faW5pdCB4Z2lmYl9pbml0KHZvaWQpOwogc3RhdGljIGludCAgICAgIFhHSWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIGludCAgICAgIFhHSWZiX2JsYW5rKGludCBibGFuaywKQEAgLTkwNywzNiArODAyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CiBleHRlcm4gdm9pZCAgICAgZmJjb25fWEdJX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpOwotI2lmIDAKLWV4dGVybiB2b2lkICAgICBjZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7Ci0jZW5kaWYKIGV4dGVybiBpbnQgICAgICBmYmNvbl9YR0lfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQogc3RhdGljIGludCBYR0lmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGFyZyk7Ci0jZWxzZQotc3RhdGljIGludCAgICAgIFhHSWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JIAkJICAgIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgCSAgICB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkgICAgICAgCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci0jZW5kaWYKIAogLyoKIGV4dGVybiBpbnQJWEdJZmJfbW9kZV9yYXRlX3RvX2RjbG9jayhWQl9ERVZJQ0VfSU5GTyAqWEdJX1ByLAotCQkJICAgICAgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwKKwkJCSAgICAgIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAogCQkJICAgICAgdW5zaWduZWQgY2hhciBtb2Rlbm8sIHVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4KTsKLWV4dGVybiBpbnQgICAgICBYR0lmYl9tb2RlX3JhdGVfdG9fZGRhdGEoVkJfREVWSUNFX0lORk8gKlhHSV9QciwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwKK2V4dGVybiBpbnQgICAgICBYR0lmYl9tb2RlX3JhdGVfdG9fZGRhdGEoVkJfREVWSUNFX0lORk8gKlhHSV9Qciwgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCiAJCQkgdW5zaWduZWQgY2hhciBtb2Rlbm8sIHVuc2lnbmVkIGNoYXIgcmF0ZWluZGV4LAogCQkJIHVuc2lnbmVkIGludCAqbGVmdF9tYXJnaW4sIHVuc2lnbmVkIGludCAqcmlnaHRfbWFyZ2luLAogCQkJIHVuc2lnbmVkIGludCAqdXBwZXJfbWFyZ2luLCB1bnNpZ25lZCBpbnQgKmxvd2VyX21hcmdpbiwKIAkJCSB1bnNpZ25lZCBpbnQgKmhzeW5jX2xlbiwgdW5zaWduZWQgaW50ICp2c3luY19sZW4sCiAJCQkgdW5zaWduZWQgaW50ICpzeW5jLCB1bnNpZ25lZCBpbnQgKnZtb2RlKTsKICovCi0jZW5kaWYKLQkJCWV4dGVybiAgIEJPT0xFQU4gIFhHSV9TZWFyY2hNb2RlSUQoIFVTSE9SVCBNb2RlTm8sVVNIT1JUICAqTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyApOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgWEdJX1NlYXJjaE1vZGVJRCh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQkJdW5zaWduZWQgc2hvcnQgKk1vZGVJZEluZGV4LAorCQkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKIHN0YXRpYyBpbnQgICAgICBYR0lmYl9nZXRfZml4KHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCBpbnQgY29uLAogCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwogCkBAIC05NTYsMTAgKzg0MCwxMCBAQAogc3RhdGljIHZvaWQgICAgIFhHSWZiX3ByZV9zZXRtb2RlKHZvaWQpOwogc3RhdGljIHZvaWQgICAgIFhHSWZiX3Bvc3Rfc2V0bW9kZSh2b2lkKTsKIAotc3RhdGljIEJPT0xFQU4gIFhHSWZiX0NoZWNrVkJSZXRyYWNlKHZvaWQpOwotc3RhdGljIEJPT0xFQU4gIFhHSWZiY2hlY2t2cmV0cmFjZWNydDIodm9pZCk7Ci1zdGF0aWMgQk9PTEVBTiAgWEdJZmJjaGVja3ZyZXRyYWNlY3J0MSh2b2lkKTsKLXN0YXRpYyBCT09MRUFOICBYR0lmYl9icmlkZ2Vpc3NsYXZlKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgIFhHSWZiX0NoZWNrVkJSZXRyYWNlKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgIFhHSWZiY2hlY2t2cmV0cmFjZWNydDIodm9pZCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciAgWEdJZmJjaGVja3ZyZXRyYWNlY3J0MSh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICBYR0lmYl9icmlkZ2Vpc3NsYXZlKHZvaWQpOwogCiBzdHJ1Y3QgWEdJX21lbXJlcSB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CkBAIC05OTQsMzAgKzg3OCw0MCBAQAogc3RhdGljIHZvaWQgICAgIFhHSWZiX2ZyZWVfbm9kZShYR0lfT0ggKnBvaCk7CiAKIC8qIEludGVybmFsIHJvdXRpbmVzIHRvIGFjY2VzcyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAqLwotQk9PTEVBTiAgICAgICAgIFhHSWZiX3F1ZXJ5X1ZHQV9jb25maWdfc3BhY2UoUFhHSV9IV19ERVZJQ0VfSU5GTyBwWEdJaHdfZXh0LAotCSAgICAgICAgICAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2V0LCB1bnNpZ25lZCBsb25nICp2YWx1ZSk7Cit1bnNpZ25lZCBjaGFyIFhHSWZiX3F1ZXJ5X1ZHQV9jb25maWdfc3BhY2Uoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSWh3X2V4dCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2V0LAorCQkJCQkgICB1bnNpZ25lZCBsb25nICp2YWx1ZSk7CiAvL0JPT0xFQU4gICAgICAgICBYR0lmYl9xdWVyeV9ub3J0aF9icmlkZ2Vfc3BhY2UoUFhHSV9IV19ERVZJQ0VfSU5GTyBwWEdJaHdfZXh0LAogLy8JICAgICAgICAgCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNldCwgdW5zaWduZWQgbG9uZyAqdmFsdWUpOwogCiAKIC8qIFJvdXRpbmVzIGZyb20gaW5pdC5jL2luaXQzMDEuYyAqLwotZXh0ZXJuIHZvaWQgICAgIEluaXRUbzMzMFBvaW50ZXIoVUNIQVIsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotZXh0ZXJuIEJPT0xFQU4gIFhHSUluaXROZXcoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbik7Ci1leHRlcm4gQk9PTEVBTiAgWEdJU2V0TW9kZU5ldyhQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBVU0hPUlQgTW9kZU5vKTsKK2V4dGVybiB2b2lkICAgICBJbml0VG8zMzBQb2ludGVyKHVuc2lnbmVkIGNoYXIsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CitleHRlcm4gdW5zaWduZWQgY2hhciAgWEdJSW5pdE5ldyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbik7CitleHRlcm4gdW5zaWduZWQgY2hhciBYR0lTZXRNb2RlTmV3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJCSAgIHVuc2lnbmVkIHNob3J0IE1vZGVObyk7CiAvL2V4dGVybiB2b2lkICAgICBYR0lfU2V0RW5hYmxlRHN0bihWQl9ERVZJQ0VfSU5GTyAqWEdJX1ByKTsKLWV4dGVybiB2b2lkICAgICBYR0lfTG9uZ1dhaXQoVkJfREVWSUNFX0lORk8gKlhHSV9Qcik7Ci1leHRlcm4gVVNIT1JUICAgWEdJX0dldFJhdGVQdHJDUlQyKCBQWEdJX0hXX0RFVklDRV9JTkZPIHBYR0lIV0RFLCBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOworZXh0ZXJuIHZvaWQgICAgIFhHSV9Mb25nV2FpdChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKlhHSV9Qcik7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgWEdJX0dldFJhdGVQdHJDUlQyKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKnBYR0lIV0RFLAorCQkJCQkgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCQkgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkJCSBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwogLyogVFc6IENocm9udGVsIFRWIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIFVTSE9SVCAJWEdJX0dldENINzAweChWQl9ERVZJQ0VfSU5GTyAqWEdJX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLWV4dGVybiB2b2lkIAlYR0lfU2V0Q0g3MDB4KFZCX0RFVklDRV9JTkZPICpYR0lfUHIsIFVTSE9SVCB0ZW1wYngpOwotZXh0ZXJuIFVTSE9SVCAJWEdJX0dldENINzAxeChWQl9ERVZJQ0VfSU5GTyAqWEdJX1ByLCBVU0hPUlQgdGVtcGJ4KTsKLWV4dGVybiB2b2lkIAlYR0lfU2V0Q0g3MDF4KFZCX0RFVklDRV9JTkZPICpYR0lfUHIsIFVTSE9SVCB0ZW1wYngpOwotZXh0ZXJuIHZvaWQgICAgIFhHSV9TZXRDSDcweHhBTkRPUihWQl9ERVZJQ0VfSU5GTyAqWEdJX1ByLCBVU0hPUlQgdGVtcGF4LFVTSE9SVCB0ZW1wYmgpOwotZXh0ZXJuIHZvaWQgICAgIFhHSV9EREMyRGVsYXkoVkJfREVWSUNFX0lORk8gKlhHSV9QciwgVVNIT1JUIGRlbGF5dGltZSk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgWEdJX0dldENINzAweChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKlhHSV9QciwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4KTsKK2V4dGVybiB2b2lkIFhHSV9TZXRDSDcwMHgoc3RydWN0IHZiX2RldmljZV9pbmZvICpYR0lfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBieCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgWEdJX0dldENINzAxeChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKlhHSV9QciwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4KTsKK2V4dGVybiB2b2lkIFhHSV9TZXRDSDcwMXgoc3RydWN0IHZiX2RldmljZV9pbmZvICpYR0lfUHIsIHVuc2lnbmVkIHNob3J0IHRlbXBieCk7CitleHRlcm4gdm9pZCBYR0lfU2V0Q0g3MHh4QU5ET1Ioc3RydWN0IHZiX2RldmljZV9pbmZvICpYR0lfUHIsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgdGVtcGF4LAorCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHRlbXBiaCk7CitleHRlcm4gdm9pZCBYR0lfRERDMkRlbGF5KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqWEdJX1ByLCB1bnNpZ25lZCBzaG9ydCBkZWxheXRpbWUpOwogCiAvKiBUVzogU2Vuc2luZyByb3V0aW5lcyAqLwogdm9pZCAgICAgICAgICAgIFhHSV9TZW5zZTMweCh2b2lkKTsKIGludCAgICAgICAgICAgICBYR0lEb1NlbnNlKGludCB0ZW1wYmwsIGludCB0ZW1wYmgsIGludCB0ZW1wY2wsIGludCB0ZW1wY2gpOwogCi1leHRlcm4gWEdJMjFfTFZEU0NhcFN0cnVjdCBYR0kyMV9MQ0RDYXBMaXN0WzEzXTsKK2V4dGVybiBzdHJ1Y3QgWEdJMjFfTFZEU0NhcFN0cnVjdCBYR0kyMV9MQ0RDYXBMaXN0WzEzXTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCA4NjcwMTJiLi45NzZjMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtMjgsOSArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlICJvc2RlZi5oIgogCiAKICNpZm5kZWYgWEdJRkJfUEFOCkBAIC0xNjQsMTYgKzE2MSwxNSBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgQWNjZXNzIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBMSU5VWF9LRVJORUwKIGludAotWEdJZmJfbW9kZV9yYXRlX3RvX2RjbG9jayhWQl9ERVZJQ0VfSU5GTyAqWEdJX1ByLCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLAorWEdJZmJfbW9kZV9yYXRlX3RvX2RjbG9jayhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKlhHSV9Qciwgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCiAJCQkgIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCkKIHsKLSAgICBVU0hPUlQgTW9kZU5vID0gbW9kZW5vOwotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA9IDAsIENsb2NrSW5kZXggPSAwOwotICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSAwOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVObyA9IG1vZGVubzsKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCA9IDAsIENsb2NrSW5kZXggPSAwOworICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IDA7CiAKLSAgICAvKlVMT05HICB0ZW1wID0gMDsqLworICAgIC8qdW5zaWduZWQgbG9uZyAgdGVtcCA9IDA7Ki8KICAgICBpbnQgICAgQ2xvY2s7CiAgICAgWEdJX1ByLT5ST01BZGRyICA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlOwogICAgIEluaXRUbzMzMFBvaW50ZXIoIEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUsIFhHSV9QciApIDsKQEAgLTIwMSwxNiArMTk3LDE2IEBACiB9CiAKIGludAotWEdJZmJfbW9kZV9yYXRlX3RvX2RkYXRhKFZCX0RFVklDRV9JTkZPICpYR0lfUHIsIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sCitYR0lmYl9tb2RlX3JhdGVfdG9fZGRhdGEoc3RydWN0IHZiX2RldmljZV9pbmZvICpYR0lfUHIsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAogCQkJIHVuc2lnbmVkIGNoYXIgbW9kZW5vLCB1bnNpZ25lZCBjaGFyIHJhdGVpbmRleCwKIAkJCSB1MzIgKmxlZnRfbWFyZ2luLCB1MzIgKnJpZ2h0X21hcmdpbiwKIAkJCSB1MzIgKnVwcGVyX21hcmdpbiwgdTMyICpsb3dlcl9tYXJnaW4sCiAJCQkgdTMyICpoc3luY19sZW4sIHUzMiAqdnN5bmNfbGVuLAogCQkJIHUzMiAqc3luYywgdTMyICp2bW9kZSkKIHsKLSAgICBVU0hPUlQgTW9kZU5vID0gbW9kZW5vOwotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA9IDAsIGluZGV4ID0gMDsKLSAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8gPSBtb2Rlbm87CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXggPSAwLCBpbmRleCA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ID0gMDsKIAogICAgIHVuc2lnbmVkIHNob3J0IFZSRSwgVkJFLCBWUlMsIFZCUywgVkRFLCBWVDsKICAgICB1bnNpZ25lZCBzaG9ydCBIUkUsIEhCRSwgSFJTLCBIQlMsIEhERSwgSFQ7CkBAIC0zNzUsMjYgKzM3MSwxMyBAQAogICAgICAgfQogICAgIH0KIAotI2lmIDAgIC8qIFRoYXQncyBidWxsc2hpdCwgb25seSB0aGUgcmVzb2x1dGlvbiBuZWVkcyB0byBiZSBzaGlmdGVkICovCi0gICAgaWYoKCp2bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0lOVEVSTEFDRUQpIHsKLSAgICAgICAqdXBwZXJfbWFyZ2luIDw8PSAxOwotICAgICAgICpsb3dlcl9tYXJnaW4gPDw9IDE7Ci0gICAgICAgKnZzeW5jX2xlbiA8PD0gMTsKLSAgICB9IGVsc2UgaWYoKCp2bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0RPVUJMRSkgewotICAgICAgICp1cHBlcl9tYXJnaW4gPj49IDE7Ci0gICAgICAgKmxvd2VyX21hcmdpbiA+Pj0gMTsKLSAgICAgICAqdnN5bmNfbGVuID4+PSAxOwotICAgIH0KLSNlbmRpZgotCiAgICAgcmV0dXJuIDE7CiB9CiAKLSNlbmRpZgogCiAKIAotdm9pZCBYR0lSZWdJbml0KFZCX0RFVklDRV9JTkZPICpYR0lfUHIsIFVMT05HIEJhc2VBZGRyKQordm9pZCBYR0lSZWdJbml0KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqWEdJX1ByLCB1bnNpZ25lZCBsb25nIEJhc2VBZGRyKQogewogICAgWEdJX1ByLT5SZWxJTyA9IEJhc2VBZGRyOwogICAgWEdJX1ByLT5QM2M0ID0gQmFzZUFkZHIgKyAweDE0OwpAQCAtNDMyLDggKzQxNSw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLSBJbnRlcmZhY2UgZm9yIGluaXQgJiBtb2RlIHN3aXRjaGluZyBjb2RlIC0tLS0tLS0tLS0tLS0gKi8KIAotQk9PTEVBTgotWEdJZmJfcXVlcnlfVkdBX2NvbmZpZ19zcGFjZShQWEdJX0hXX0RFVklDRV9JTkZPIHBYR0lod19leHQsCit1bnNpZ25lZCBjaGFyCitYR0lmYl9xdWVyeV9WR0FfY29uZmlnX3NwYWNlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKnBYR0lod19leHQsCiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2V0LCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKIHsKIAlzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwpAQCAtNDQ1LDEwICs0MjgsMTAgQEAKIAkJRFBSSU5USygiWEdJZmI6IFNldCBvZmZzZXQgMHglbHggdG8gMHglbHhcbiIsIG9mZnNldCwgKnZhbHVlKTsKIAogCWlmICghaW5pdCkgewotCQlpbml0ID0gVFJVRTsKKwkJaW5pdCA9IDE7CiAJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1hHLCB4Z2lfdmlkZW9faW5mby5jaGlwX2lkLCBwZGV2KTsKIAkJaWYgKHBkZXYpIHsKLQkJCXZhbGlkX3BkZXYgPSBUUlVFOworCQkJdmFsaWRfcGRldiA9IDE7CiAJCQlwY2lfZGV2X3B1dChwZGV2KTsKIAkJfQogCX0KQEAgLTQ1Niw3ICs0MzksNyBAQAogCWlmICghdmFsaWRfcGRldikgewogCQlwcmludGsoS0VSTl9ERUJVRyAiWEdJZmI6IENhbid0IGZpbmQgWEdJICVkIFZHQSBkZXZpY2UuXG4iLAogCQkJCXhnaV92aWRlb19pbmZvLmNoaXBfaWQpOwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChzZXQgPT0gMCkKQEAgLTQ2NCwxMCArNDQ3LDEwIEBACiAJZWxzZQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIG9mZnNldCwgKHUzMikoKnZhbHVlKSk7CiAKLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gMTsKIH0KIAotLypCT09MRUFOIFhHSWZiX3F1ZXJ5X25vcnRoX2JyaWRnZV9zcGFjZShQWEdJX0hXX0RFVklDRV9JTkZPIHBYR0lod19leHQsCisvKnVuc2lnbmVkIGNoYXIgWEdJZmJfcXVlcnlfbm9ydGhfYnJpZGdlX3NwYWNlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKnBYR0lod19leHQsCiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2V0LCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKIHsKIAlzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwpAQCAtNDc1LDcgKzQ1OCw3IEBACiAJdTE2IG5icmlkZ2VfaWQgPSAwOwogCiAJaWYgKCFpbml0KSB7Ci0JCWluaXQgPSBUUlVFOworCQlpbml0ID0gMTsKIAkJc3dpdGNoICh4Z2lfdmlkZW9faW5mby5jaGlwKSB7CiAJCWNhc2UgWEdJXzU0MDoKIAkJCW5icmlkZ2VfaWQgPSBQQ0lfREVWSUNFX0lEX1hHXzU0MDsKQEAgLTUwMiwxMyArNDg1LDEzIEBACiAKIAkJcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlX2lkLCBwZGV2KTsKIAkJaWYgKHBkZXYpCi0JCQl2YWxpZF9wZGV2ID0gVFJVRTsKKwkJCXZhbGlkX3BkZXYgPSAxOwogCX0KIAogCWlmICghdmFsaWRfcGRldikgewogCQlwcmludGsoS0VSTl9ERUJVRyAiWEdJZmI6IENhbid0IGZpbmQgWEdJICVkIE5vcnRoIEJyaWRnZSBkZXZpY2UuXG4iLAogCQkJCW5icmlkZ2VfaWQpOwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChzZXQgPT0gMCkKQEAgLTUxNiw3ICs0OTksNyBAQAogCWVsc2UKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBvZmZzZXQsICh1MzIpKCp2YWx1ZSkpOwogCi0JcmV0dXJuIFRSVUU7CisJcmV0dXJuIDE7CiB9CiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEludGVybmFsIGhlbHBlciByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjI3LDcgKzYxMCw4IEBACiAgICAgICAgICAgICAgICAgaSArPSAyNTsKICAgICAgICAgICAgICAgICBqLS07CiAgICAgICAgICAgICAgICAgaysrOwotICAgICAgICB9IHdoaWxlICggKGo+MCkgJiYgKCBrIDwgKHNpemVvZihYR0kyMV9MQ0RDYXBMaXN0KS9zaXplb2YoWEdJMjFfTFZEU0NhcFN0cnVjdCkpICkgKTsKKwl9IHdoaWxlICgoaiA+IDApICYmCisJCSAoayA8IChzaXplb2YoWEdJMjFfTENEQ2FwTGlzdCkvc2l6ZW9mKHN0cnVjdCBYR0kyMV9MVkRTQ2FwU3RydWN0KSkpKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtOTU0LDQ2ICs5MzgsNTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBCT09MRUFOIFhHSWZiX2JyaWRnZWlzc2xhdmUodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSWZiX2JyaWRnZWlzc2xhdmUodm9pZCkKIHsKICAgIHVuc2lnbmVkIGNoYXIgdXNTY3JhdGNoUDFfMDA7CiAKLSAgIGlmKHhnaV92aWRlb19pbmZvLmhhc1ZCID09IEhBU1ZCX05PTkUpIHJldHVybiBGQUxTRTsKKyAgIGlmICh4Z2lfdmlkZW9faW5mby5oYXNWQiA9PSBIQVNWQl9OT05FKQorCSAgIHJldHVybiAwOwogCiAgICBpblhHSUlEWFJFRyhYR0lQQVJUMSwweDAwLHVzU2NyYXRjaFAxXzAwKTsKLSAgIGlmKCAodXNTY3JhdGNoUDFfMDAgJiAweDUwKSA9PSAweDEwKSAgewotCSAgIHJldHVybiBUUlVFOwotICAgfSBlbHNlIHsKLSAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgfQorICAgaWYgKCh1c1NjcmF0Y2hQMV8wMCAmIDB4NTApID09IDB4MTApCisJICAgcmV0dXJuIDE7CisgICBlbHNlCisJICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBCT09MRUFOIFhHSWZiY2hlY2t2cmV0cmFjZWNydDEodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSWZiY2hlY2t2cmV0cmFjZWNydDEodm9pZCkKIHsKICAgIHVuc2lnbmVkIGNoYXIgdGVtcDsKIAogICAgaW5YR0lJRFhSRUcoWEdJQ1IsMHgxNyx0ZW1wKTsKLSAgIGlmKCEodGVtcCAmIDB4ODApKSByZXR1cm4gRkFMU0U7CisgICBpZiAoISh0ZW1wICYgMHg4MCkpCisJICAgcmV0dXJuIDA7CiAKIAogICAgaW5YR0lJRFhSRUcoWEdJU1IsMHgxZix0ZW1wKTsKLSAgIGlmKHRlbXAgJiAweGMwKSByZXR1cm4gRkFMU0U7CisgICBpZiAodGVtcCAmIDB4YzApCisJICAgcmV0dXJuIDA7CiAKLQotICAgaWYoaW5YR0lSRUcoWEdJSU5QU1RBVCkgJiAweDA4KSByZXR1cm4gVFJVRTsKLSAgIGVsc2UgCQkJICAgcmV0dXJuIEZBTFNFOworICAgaWYgKGluWEdJUkVHKFhHSUlOUFNUQVQpICYgMHgwOCkKKwkgICByZXR1cm4gMTsKKyAgIGVsc2UKKwkgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIEJPT0xFQU4gWEdJZmJjaGVja3ZyZXRyYWNlY3J0Mih2b2lkKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJZmJjaGVja3ZyZXRyYWNlY3J0Mih2b2lkKQogewogICAgdW5zaWduZWQgY2hhciB0ZW1wOwotICAgaWYoeGdpX3ZpZGVvX2luZm8uaGFzVkIgPT0gSEFTVkJfTk9ORSkgcmV0dXJuIEZBTFNFOworICAgaWYgKHhnaV92aWRlb19pbmZvLmhhc1ZCID09IEhBU1ZCX05PTkUpCisJICAgcmV0dXJuIDA7CiAgICBpblhHSUlEWFJFRyhYR0lQQVJUMSwgMHgzMCwgdGVtcCk7Ci0gICBpZih0ZW1wICYgMHgwMikgcmV0dXJuIEZBTFNFOwotICAgZWxzZSAJICAgcmV0dXJuIFRSVUU7CisgICBpZiAodGVtcCAmIDB4MDIpCisJICAgcmV0dXJuIDA7CisgICBlbHNlCisJICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBCT09MRUFOIFhHSWZiX0NoZWNrVkJSZXRyYWNlKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgY2hhciBYR0lmYl9DaGVja1ZCUmV0cmFjZSh2b2lkKQogewogICAgaWYoeGdpX3ZpZGVvX2luZm8uZGlzcF9zdGF0ZSAmIERJU1BUWVBFX0RJU1AyKSB7CiAgICAgICBpZihYR0lmYl9icmlkZ2Vpc3NsYXZlKCkpIHsKQEAgLTEzNTAsMTEgKzEzNDAsNyBAQAogLy8JcHJpbnRrKCJYR0lmYjogaW5zaWRlIHNldF9wYXJcbiIpOwogICAgICAgICBpZigoZXJyID0gWEdJZmJfZG9fc2V0X3ZhcigmaW5mby0+dmFyLCAxLCBpbmZvKSkpCiAJCXJldHVybiBlcnI7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotCVhHSWZiX2dldF9maXgoJmluZm8tPmZpeCwgaW5mby0+Y3VycmNvbiwgaW5mbyk7Ci0jZWxzZQogCVhHSWZiX2dldF9maXgoJmluZm8tPmZpeCwgLTEsIGluZm8pOwotI2VuZGlmCiAvLwlwcmludGsoIlhHSWZiOmVuZCBvZiBzZXRfcGFyXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NDAsNTggKzE1MjYsNyBAQAogfQogI2VuZGlmCiAKLSNpZiAwCi1zdGF0aWMgaW50IFhHSWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgb2ZmOwotCXUzMiBsZW4sIG1taW9fb2ZmOwogCi0JREVCVUdQUk4oImluc2lkZSBtbWFwIik7Ci0JaWYodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQpKSAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlvZmYgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0KLQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKSB4Z2lfdmlkZW9faW5mby52aWRlb19iYXNlOwotCWxlbiA9IFBBR0VfQUxJR04oKHN0YXJ0ICYgflBBR0VfTUFTSykgKyB4Z2lfdmlkZW9faW5mby52aWRlb19zaXplKTsKLQlzdGFydCAmPSBQQUdFX01BU0s7Ci0jaWYgMAotCWlmIChvZmYgPj0gbGVuKSB7Ci0JCW9mZiAtPSBsZW47Ci0jZW5kaWYKLQkvKiBCeSBKYWtlIFBhZ2U6IFRyZWF0IG1tYXAgcmVxdWVzdCB3aXRoIG9mZnNldCBiZXlvbmQgaGVhcHN0YXJ0Ci0JICogICAgICAgICAgICAgICBhcyByZXF1ZXN0IGZvciBtYXBwaW5nIHRoZSBtbWlvIGFyZWEKLQkgKi8KLQkjaWYgMQotCW1taW9fb2ZmID0gUEFHRV9BTElHTigoc3RhcnQgJiB+UEFHRV9NQVNLKSArIHhnaV92aWRlb19pbmZvLmhlYXBzdGFydCk7Ci0JaWYob2ZmID49IG1taW9fb2ZmKSB7Ci0JCW9mZiAtPSBtbWlvX29mZjsKLQkJaWYoaW5mby0+dmFyLmFjY2VsX2ZsYWdzKSByZXR1cm4gLUVJTlZBTDsKLQotCQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKSB4Z2lfdmlkZW9faW5mby5tbWlvX2Jhc2U7Ci0JCWxlbiA9IFBBR0VfQUxJR04oKHN0YXJ0ICYgflBBR0VfTUFTSykgKyBYR0lmYl9tbWlvX3NpemUpOwotCX0KLQlzdGFydCAmPSBQQUdFX01BU0s7Ci0JI2VuZGlmCi0JaWYoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCArIG9mZikgPiBsZW4pCXJldHVybiAtRUlOVkFMOwotCi0Jb2ZmICs9IHN0YXJ0OwotCXZtYS0+dm1fcGdvZmYgPSBvZmYgPj4gUEFHRV9TSElGVDsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOyAgIC8qIGJ5IEpha2UgUGFnZTsgaXMgdGhhdCByZWFsbHkgbmVlZGVkPyAqLwotCi0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotCWlmIChib290X2NwdV9kYXRhLng4NiA+IDMpCi0JCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX1BDRDsKLSNlbmRpZgotCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBvZmYgPj4gUEFHRV9TSElGVCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAotCQkJCXZtYS0+dm1fcGFnZV9wcm90KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLSAgICAgICAgREVCVUdQUk4oImVuZCBvZiBtbWFwIik7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIHN0YXRpYyBpbnQgWEdJZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAl1OCByZWc7CkBAIC0xNjEwLDE1ICsxNTQ1LDggQEAKIH0KIAogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKIHN0YXRpYyBpbnQgWEdJZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCi0jZWxzZQotc3RhdGljIGludCBYR0lmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCi0jZW5kaWYKLQogewogCURFQlVHUFJOKCJpbnNpZGUgaW9jdGwiKTsKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMTY4Nyw3ICsxNjE1LDcgQEAKIAkJYnJlYWs7CiAJICAgY2FzZSBYR0lGQl9HRVRfSU5GTzogIC8qIFRXOiBOZXcgZm9yIGNvbW11bmljYXRpb24gd2l0aCBYIGRyaXZlciAqLwogCSAgICAgICAgewotCQkJWEdJZmJfaW5mbyAqeCA9IChYR0lmYl9pbmZvICopYXJnOworCQkJc3RydWN0IFhHSWZiX2luZm8gKnggPSAoc3RydWN0IFhHSWZiX2luZm8gKilhcmc7CiAKIAkJCS8veC0+WEdJZmJfaWQgPSBYR0lGQl9JRDsKIAkJCXgtPlhHSWZiX3ZlcnNpb24gPSBWRVJfTUFKT1I7CkBAIC0xNzg2LDkgKzE3MTQsNiBAQAogCS5mYl9maWxscmVjdCAgPSBmYmNvbl9YR0lfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhICA9IGZiY29uX1hHSV9jb3B5YXJlYSwKIAkuZmJfaW1hZ2VibGl0ID0gY2ZiX2ltYWdlYmxpdCwKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCi0JLmZiX2N1cnNvciAgICA9IHNvZnRfY3Vyc29yLAotI2VuZGlmCiAJLmZiX3N5bmMgICAgICA9IGZiY29uX1hHSV9zeW5jLAogCS5mYl9pb2N0bCAgICAgPQlYR0lmYl9pb2N0bCwKIC8vCS5mYl9tbWFwICAgICAgPQlYR0lmYl9tbWFwLApAQCAtMjAwOCw5ICsxOTMzLDkgQEAKIAkJYnJlYWs7CiAJICAgZGVmYXVsdDoKIAkJeGdpX3ZpZGVvX2luZm8uaGFzVkIgPSBIQVNWQl9OT05FOwotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gMTsKIH0KIAogCkBAIC0yNjY0LDEzICsyNTg5LDcgQEAKIHN0YXRpYyB2b2lkIFhHSWZiX3Bvc3Rfc2V0bW9kZSh2b2lkKQogewogCXU4IHJlZzsKLQlCT09MRUFOIGRvaXQgPSBUUlVFOwotI2lmIDAJLyogVFc6IFdyb25nOiBJcyBub3QgaW4gTU1JTyBzcGFjZSwgYnV0IGluIFJBTSAqLwotCS8qIEJhY2t1cCBtb2RlIG51bWJlciB0byBNTUlPIHNwYWNlICovCi0JaWYoeGdpX3ZpZGVvX2luZm8ubW1pb192YmFzZSkgewotCSAgKih2b2xhdGlsZSB1OCAqKSgoKHU4Kil4Z2lfdmlkZW9faW5mby5tbWlvX3ZiYXNlKSArIDB4NDQ5KSA9ICh1bnNpZ25lZCBjaGFyKVhHSWZiX21vZGVfbm87Ci0JfQotI2VuZGlmCisJdW5zaWduZWQgY2hhciBkb2l0ID0gMTsKIC8qCW91dFhHSUlEWFJFRyhYR0lTUixJTkRfWEdJX1BBU1NXT1JELFhHSV9QQVNTV09SRCk7CiAJb3V0WEdJSURYUkVHKFhHSUNSLDB4MTMsMHgwMCk7CiAJc2V0WEdJSURYUkVHKFhHSVNSLDB4MEUsMHhGMCwweDAxKTsKQEAgLTI2NzgsMTEgKzI1OTcsMTEgQEAKIAlpZiAoeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwID09IDgpIHsKIAkJLyogVFc6IFdlIGNhbid0IHN3aXRjaCBvZmYgQ1JUMSBvbiBMVkRTL0Nocm9udGVsIGluIDhicHAgTW9kZXMgKi8KIAkJaWYgKCh4Z2lfdmlkZW9faW5mby5oYXNWQiA9PSBIQVNWQl9MVkRTKSB8fCAoeGdpX3ZpZGVvX2luZm8uaGFzVkIgPT0gSEFTVkJfTFZEU19DSFJPTlRFTCkpIHsKLQkJCWRvaXQgPSBGQUxTRTsKKwkJCWRvaXQgPSAwOwogCQl9CiAJCS8qIFRXOiBXZSBjYW4ndCBzd2l0Y2ggb2ZmIENSVDEgb24gMzAxQi1ESCBpbiA4YnBwIE1vZGVzIGlmIHVzaW5nIExDRCAqLwogCQlpZiAgKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9MQ0QpICB7Ci0JICAgICAgICAJZG9pdCA9IEZBTFNFOworCQkJZG9pdCA9IDA7CiAJICAgICAgICB9CiAJfQogCkBAIC0yNjkxLDE0ICsyNjEwLDE1IEBACiAJCWluWEdJSURYUkVHKFhHSVBBUlQxLCAweDAwLCByZWcpOwogCiAKLQkJaWYoKHJlZyAmIDB4NTApID09IDB4MTApIHsKLQkJCWRvaXQgPSBGQUxTRTsKLQkJfQorCQlpZiAoKHJlZyAmIDB4NTApID09IDB4MTApCisJCQlkb2l0ID0gMDsKIAotCX0gZWxzZSBYR0lmYl9jcnQxb2ZmID0gMDsKKworCX0gZWxzZQorCQlYR0lmYl9jcnQxb2ZmID0gMDsKIAogCWluWEdJSURYUkVHKFhHSUNSLCAweDE3LCByZWcpOwotCWlmKChYR0lmYl9jcnQxb2ZmKSAmJiAoZG9pdCkpCisJaWYgKChYR0lmYl9jcnQxb2ZmKSAmJiAoZG9pdCkpCiAJCXJlZyAmPSB+MHg4MDsKIAllbHNlCiAJCXJlZyB8PSAweDgwOwpAQCAtMjkwNyw3ICsyODI3LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgVkJJT1NfQlVGWzY1NTM1XTsKIAotdW5zaWduZWQgY2hhciogYXR0ZW1wdF9tYXBfcm9tKHN0cnVjdCBwY2lfZGV2ICpkZXYsdm9pZCAqY29weV9hZGRyZXNzKQordW5zaWduZWQgY2hhciAqYXR0ZW1wdF9tYXBfcm9tKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKmNvcHlfYWRkcmVzcykKIHsKICAgICB1MzIgcm9tX3NpemUgICAgICA9IDA7CiAgICAgdTMyIHJvbV9hZGRyZXNzICAgPSAwOwpAQCAtMjk2MiwxNSArMjg4Miw5IEBACiAKIAlYR0lmYl9yZWdpc3RlcmVkID0gMDsKIAotCW1lbXNldCgmWEdJaHdfZXh0LCAwLCBzaXplb2YoSFdfREVWSUNFX0VYVEVOU0lPTikpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMpKQorCW1lbXNldCgmWEdJaHdfZXh0LCAwLCBzaXplb2Yoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbykpOwogCSAgZmJfaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZmJfaW5mbyksICZwZGV2LT5kZXYpOwogCSAgaWYoIWZiX2luZm8pIHJldHVybiAtRU5PTUVNOwotI2Vsc2UKLQkgIFhHSV9mYl9pbmZvID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JICBpZighWEdJX2ZiX2luZm8pIHJldHVybiAtRU5PTUVNOwotCSAgbWVtc2V0KFhHSV9mYl9pbmZvLCAwLCAgc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSk7Ci0jZW5kaWYKIAogICAJeGdpX3ZpZGVvX2luZm8uY2hpcF9pZCA9IHBkZXYtPmRldmljZTsKIAkgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwmeGdpX3ZpZGVvX2luZm8ucmV2aXNpb25faWQpOwpAQCAtMjk4OCwxNCArMjkwMiwxNSBAQAogCSAgeGdpX3ZpZGVvX2luZm8ubW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwogCSAgWEdJZmJfbW1pb19zaXplID0gIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CiAJICB4Z2lfdmlkZW9faW5mby52Z2FfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSArIDB4MzA7Ci0JICBYR0lod19leHQucGpJT0FkZHJlc3MgPSAoUFVDSEFSKXhnaV92aWRlb19pbmZvLnZnYV9iYXNlOworCSAgWEdJaHdfZXh0LnBqSU9BZGRyZXNzID0gKHVuc2lnbmVkIGNoYXIgKil4Z2lfdmlkZW9faW5mby52Z2FfYmFzZTsKIAkgIC8vWEdJX1ByLlJlbElPICA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLCAxMjgpICsgMHgzMDsKLQkgIHByaW50aygiWEdJZmI6IFJlbG9jYXRlIElPIGFkZHJlc3M6ICVseCBbJTA4bHhdIFxuIiwgKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLCBYR0lfUHIuUmVsSU8pOworCSAgcHJpbnRrKCJYR0lmYjogUmVsb2NhdGUgSU8gYWRkcmVzczogJWx4IFslMDhseF1cbiIsCisJCSAodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIFhHSV9Qci5SZWxJTyk7CiAKIAkgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKIAkgICAgICAgICAgcmV0dXJuIC1FSU87CiAKLSAgICBYR0lSZWdJbml0KCZYR0lfUHIsIChVTE9ORylYR0lod19leHQucGpJT0FkZHJlc3MpOworICAgIFhHSVJlZ0luaXQoJlhHSV9QciwgKHVuc2lnbmVkIGxvbmcpWEdJaHdfZXh0LnBqSU9BZGRyZXNzKTsKIAogICAgIG91dFhHSUlEWFJFRyhYR0lTUiwgSU5EX1hHSV9QQVNTV09SRCwgWEdJX1BBU1NXT1JEKTsKICAgICBpblhHSUlEWFJFRyhYR0lTUiwgSU5EX1hHSV9QQVNTV09SRCwgcmVnMSk7CkBAIC0zMDUyLDcgKzI5NjcsNyBAQAogCQkgICBjYXNlIFhHMjA6CiAJCSAgIGNhc2UgWEcyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIFhHMjc6Ci0gICAgICAgICAgICAgICAgICAgWEdJaHdfZXh0LmJJbnRlZ3JhdGVkTU1FbmFibGVkID0gVFJVRTsKKwkJCSAgIFhHSWh3X2V4dC5iSW50ZWdyYXRlZE1NRW5hYmxlZCA9IDE7CiAJCQlicmVhazsKIAogCQkgICBkZWZhdWx0OgpAQCAtMzA4MCw3ICsyOTk1LDcgQEAKIAkgIHN0cmNweShYR0lod19leHQuc3pWQklPU1ZlciwgIjAuODQiKTsKIAogCi0gICAgWEdJaHdfZXh0LnBTUiA9IHZtYWxsb2Moc2l6ZW9mKFhHSV9EU1JlZykgKiBTUl9CVUZGRVJfU0laRSk7CisgICAgWEdJaHdfZXh0LnBTUiA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBYR0lfRFNSZWcpICogU1JfQlVGRkVSX1NJWkUpOwogCSAgaWYgKFhHSWh3X2V4dC5wU1IgPT0gTlVMTCkKIAkgIHsKIAkJICAgIHByaW50ayhLRVJOX0VSUiAiWEdJZmI6IEZhdGFsIGVycm9yOiBBbGxvY2F0aW5nIFNSUmVnIHNwYWNlIGZhaWxlZC5cbiIpOwpAQCAtMzA4OCw3ICszMDAzLDcgQEAKIAkgIH0KIAkgIFhHSWh3X2V4dC5wU1JbMF0uaklkeCA9IFhHSWh3X2V4dC5wU1JbMF0ualZhbCA9IDB4RkY7CiAKLQkgIFhHSWh3X2V4dC5wQ1IgPSB2bWFsbG9jKHNpemVvZihYR0lfRFNSZWcpICogQ1JfQlVGRkVSX1NJWkUpOworCSAgWEdJaHdfZXh0LnBDUiA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBYR0lfRFNSZWcpICogQ1JfQlVGRkVSX1NJWkUpOwogCSAgaWYgKFhHSWh3X2V4dC5wQ1IgPT0gTlVMTCkKIAkgIHsKIAkgICAgICB2ZnJlZShYR0lod19leHQucFNSKTsKQEAgLTMyMTgsNyArMzEzMyw3IEBACiAJCSAgICB4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlID0gRElTUFRZUEVfTENEOwogICAgICAgICAJICAgIGlmICghWEdJZmJfR2V0WEcyMUxWRFNEYXRhKCkpIHsKIAkJCSAgICBpbnQgbTsKLQkJCSAgICBmb3IgKG09MDsgbSA8IHNpemVvZihYR0kyMV9MQ0RDYXBMaXN0KS9zaXplb2YoWEdJMjFfTFZEU0NhcFN0cnVjdCk7IG0rKykgeworCQkJICAgIGZvciAobSA9IDA7IG0gPCBzaXplb2YoWEdJMjFfTENEQ2FwTGlzdCkvc2l6ZW9mKHN0cnVjdCBYR0kyMV9MVkRTQ2FwU3RydWN0KTsgbSsrKSB7CiAJCQkJICAgIGlmICgoWEdJMjFfTENEQ2FwTGlzdFttXS5MVkRTSERFID09IFhHSWJpb3NfbW9kZVt4Z2lmYl9tb2RlX2lkeF0ueHJlcykgJiYKIAkJCQkJKFhHSTIxX0xDRENhcExpc3RbbV0uTFZEU1ZERSA9PSBYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLnlyZXMpKSB7CiAJCQkJCQlYR0lOZXdfU2V0UmVnMSggWEdJX1ByLlAzZDQgLCAweDM2LCBtKSA7CkBAIC0zMzQxLDE0ICszMjU2LDE0IEBACiAJICAgICAgICAgIGluWEdJSURYUkVHKFhHSUNSLDB4MzgsdG1wKTsKIAkJICAgICAgaWYoKHRtcCAmIDB4MDMpID09IDB4MDMpCiAJCSAgICAgIHsKLS8vCQkgICAgICAgICAgWEdJX1ByLlhHSV9Vc2VMQ0RBID0gVFJVRTsKKy8qCQkgICAgICAgICAgWEdJX1ByLlhHSV9Vc2VMQ0RBID0gMTsgKi8KIAkJICAgICAgfWVsc2UKIAkJICAgICAgewogCQkgICAgIC8vICBDdXJyZW50bHkgb24gTENEQT8gKFNvbWUgbmV3ZXIgQklPU2VzIHNldCBEMCBpbiBDUjM1KQogCQkgICAgICAgICBpblhHSUlEWFJFRyhYR0lDUiwweDM1LHRtcCk7CiAJCSAgICAgICAgIGlmKHRtcCAmIDB4MDEpCiAJCSAgICAgICAgIHsKLS8vCQkgICAgICAgICAgICAgIFhHSV9Qci5YR0lfVXNlTENEQSA9IFRSVUU7CisvKgkJICAgICAgICAgICAgICBYR0lfUHIuWEdJX1VzZUxDREEgPSAxOyAqLwogCQkgICAgICAgICAgIH1lbHNlCiAJCSAgICAgICAgICAgewogCQkgICAgICAgICAgICAgICBpblhHSUlEWFJFRyhYR0lDUiwweDMwLHRtcCk7CkBAIC0zMzU3LDcgKzMyNzIsNyBAQAogCQkgICAgICAgICAgICAgICAgICAgaW5YR0lJRFhSRUcoWEdJUEFSVDEsMHgxMyx0bXApOwogCQkJICAgICAgICAgICAgICAgaWYodG1wICYgMHgwNCkKIAkJCSAgICAgICAgICAgICAgIHsKLS8vCQkJICAgICAgICAgICAgICAgIFhHSV9Qci5YR0lfVXNlTENEQSA9IFRSVUU7CisvKgkJCSAgICAgICAgICAgICAgICBYR0lfUHIuWEdJX1VzZUxDREEgPSAxOyAqLwogCQkJICAgICAgICAgICAgICAgfQogCQkgICAgICAgICAgICAgICB9CiAJCSAgICAgICAgICAgfQpAQCAtMzQ2MiwyMCArMzM3Nyw2IEBACiAKIAkgICAgICAgIH0KIAotCi0jaWYgMAotI2lmZGVmIFhHSUZCX1BBTgotCQlpZihYR0lmYl95cGFuKSB7Ci0JICAgIAkJZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0KLQkJCQl4Z2lfdmlkZW9faW5mby5oZWFwc3RhcnQgLyAoZGVmYXVsdF92YXIueHJlcyAqIChkZWZhdWx0X3Zhci5iaXRzX3Blcl9waXhlbCA+PiAzKSk7Ci0JICAgIAkJaWYoZGVmYXVsdF92YXIueXJlc192aXJ0dWFsIDw9IGRlZmF1bHRfdmFyLnlyZXMpIHsKLQkgICAgICAgIAkJZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gZGVmYXVsdF92YXIueXJlczsKLQkgICAgCQl9Ci0JCX0KLSNlbmRpZgotI2VuZGlmCi0KLQogCQl4Z2lfdmlkZW9faW5mby5hY2NlbCA9IDA7CiAJCWlmKFhHSWZiX2FjY2VsKSB7CiAJCSAgIHhnaV92aWRlb19pbmZvLmFjY2VsID0gLTE7CkBAIC0zNTExLDcgKzM0MTIsOCBAQAogCiAJCVhHSWZiX3JlZ2lzdGVyZWQgPSAxOwogCi0JCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBJbnN0YWxsZWQgWEdJRkJfR0VUX0lORk8gaW9jdGwgKCV4KVxuIiwgWEdJRkJfR0VUX0lORk8pOworCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogSW5zdGFsbGVkIFhHSUZCX0dFVF9JTkZPIGlvY3RsICglbHgpXG4iLAorCQkgICAgICAgWEdJRkJfR0VUX0lORk8pOwogCiAvKgkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IDJEIGFjY2VsZXJhdGlvbiBpcyAlcywgc2Nyb2xsaW5nIG1vZGUgJXNcbiIsCiAJCSAgICAgWEdJZmJfYWNjZWwgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLApAQCAtMzUzOCwxMSArMzQ0MCw3IEBACiAJLyogVW5yZWdpc3RlciB0aGUgZnJhbWVidWZmZXIgKi8KIC8vCWlmKHhnaV92aWRlb19pbmZvLnJlZ2lzdGVyZWQpIHsKIAkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYl9pbmZvKTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzKSkKIAkJZnJhbWVidWZmZXJfcmVsZWFzZShmYl9pbmZvKTsKLSNlbHNlCi0JCWtmcmVlKGZiX2luZm8pOwotI2VuZGlmCiAvLwl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CkBAIC0zNTU4LDcgKzM0NTYsNiBAQAogCiBYR0lJTklUU1RBVElDIGludCBfX2luaXQgeGdpZmJfaW5pdCh2b2lkKQogewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQogI2lmbmRlZiBNT0RVTEUKIAljaGFyICpvcHRpb24gPSBOVUxMOwogCkBAIC0zNTY2LDE1ICszNDYzLDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCVhHSWZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKLSNlbmRpZgogCXJldHVybihwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ4Z2lmYl9kcml2ZXIpKTsKIH0KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiw4KQorCiAjaWZuZGVmIE1PRFVMRQogbW9kdWxlX2luaXQoeGdpZmJfaW5pdCk7CiAjZW5kaWYKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICBNT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJZmIuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lmYi5oCmluZGV4IDQxYmYxNjMuLmVmODZhNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lmYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lmYi5oCkBAIC0yNyw3ICsyNyw3IEBACiAjZGVmaW5lIFhHSUZCX0lEICAgICAgICAgIDB4NTM0OTUzNDYgICAgLyogSWRlbnRpZnkgbXlzZWxmIHdpdGggJ1hHSUYnICovCiAjZW5kaWYKIAotdHlwZWRlZiBlbnVtIF9YR0lfQ0hJUF9UWVBFIHsKK2VudW0gWEdJX0NISVBfVFlQRSB7CiAgICAgWEdJX1ZHQUxlZ2FjeSA9IDAsCiAgICAgWEdJXzMwMCwKICAgICBYR0lfNjMwLApAQCAtNTMsOSArNTMsOSBAQAogICAgIFhHMjEsCiAgICAgWEcyNywKICAgICBNQVhfWEdJX0NISVAKLX0gWEdJX0NISVBfVFlQRTsKK307CiAKLXR5cGVkZWYgZW51bSBfVFZUWVBFIHsKK2VudW0geGdpX3R2dHlwZSB7CiAJVFZNT0RFX05UU0MgPSAwLAogCVRWTU9ERV9QQUwsCiAJVFZNT0RFX0hJVklTSU9OLApAQCAtNjMsMTMgKzYzLDExIEBACiAgICAgCVRWVFlQRV9QQUxOLAkvLyB2aWNraUAwMzAyMjYKICAgICAJVFZUWVBFX05UU0NKLAkvLyB2aWNraUAwMzAyMjYKIAlUVk1PREVfVE9UQUwKLX0gWEdJX1RWX1RZUEU7Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9YR0lGQl9JTkZPIFhHSWZiX2luZm87Ci1zdHJ1Y3QgX1hHSUZCX0lORk8gewotCi11bnNpZ25lZCBsb25nIFhHSWZiX2lkOworc3RydWN0IFhHSWZiX2luZm8geworCXVuc2lnbmVkIGxvbmcgWEdJZmJfaWQ7CiAgCWludCAgICBjaGlwX2lkOwkJCS8qIFBDSSBJRCBvZiBkZXRlY3RlZCBjaGlwICovCiAJaW50ICAgIG1lbW9yeTsJCQkvKiB2aWRlbyBtZW1vcnkgaW4gS0Igd2hpY2ggWEdJZmIgbWFuYWdlcyAqLwogCWludCAgICBoZWFwc3RhcnQ7ICAgICAgICAgICAgICAgLyogaGVhcCBzdGFydCAoPSBYR0lmYiAibWVtIiBhcmd1bWVudCkgaW4gS0IgKi8KQEAgLTk3LDcgKzk1LDcgQEAKIAogCiAKLXR5cGVkZWYgZW51bSBfVFZQTFVHVFlQRSB7CS8vIHZpY2tpQDAzMDIyNgorZW51bSB4Z2lfdHZfcGx1ZyB7CS8qIHZpY2tpQDAzMDIyNiAqLwogLy8JVFZQTFVHX0xlZ2FjeSA9IDAsCiAvLwlUVlBMVUdfQ09NUE9TSVRFLAogLy8JVFZQTFVHX1NWSURFTywKQEAgLTExMyw3ICsxMTEsNyBAQAogICAgIAlUVlBMVUdfWVBCUFJfNzUwUCA9IDcsCiAgICAgCVRWUExVR19ZUEJQUl8xMDgwaSA9IDgsCiAJVFZQTFVHX1RPVEFMCi19IFhHSV9UVl9QTFVHOworfTsKIAogCiBzdHJ1Y3QgbW9kZV9pbmZvIHsKQEAgLTEzMiwxMCArMTMwLDEwIEBACiAJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CiAJdW5zaWduZWQgaW50ICBtZW1fc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGRpc3Bfc3RhdGU7Ci0JWEdJX0NISVBfVFlQRSBjaGlwOworCWVudW0gWEdJX0NISVBfVFlQRSBjaGlwOwogCXVuc2lnbmVkIGNoYXIgaGFzVkI7Ci0JWEdJX1RWX1RZUEUgVFZfdHlwZTsKLQlYR0lfVFZfUExVRyBUVl9wbHVnOworCWVudW0geGdpX3R2dHlwZSBUVl90eXBlOworCWVudW0geGdpX3R2X3BsdWcgVFZfcGx1ZzsKIAl1bnNpZ25lZCBsb25nIHZlcnNpb247CiAJY2hhciByZXNlcnZlZFsyNTZdOwogfTsKQEAgLTE4NCw3ICsxODIsNyBAQAogICAgICAgICB1bnNpZ25lZCBjaGFyIFRWX3R5cGU7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgVFZfcGx1ZzsKIAotICAgICAgICBYR0lfQ0hJUF9UWVBFIGNoaXA7CisJZW51bSBYR0lfQ0hJUF9UWVBFIGNoaXA7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmV2aXNpb25faWQ7CiAKICAgICAgICAgdW5zaWduZWQgc2hvcnQgRHN0Q29sb3I7CkBAIC0yMDcsOSArMjA1LDQgQEAKIAogZXh0ZXJuIHN0cnVjdCB2aWRlb19pbmZvIHhnaV92aWRlb19pbmZvOwogCi0jaWZkZWYgX19LRVJORUxfXwotLy9leHRlcm4gdm9pZCB4Z2lfbWFsbG9jKHN0cnVjdCB4Z2lfbWVtcmVxICpyZXEpOwotZXh0ZXJuIHZvaWQgeGdpX2ZyZWUodW5zaWduZWQgbG9uZyBiYXNlKTsKLWV4dGVybiB2b2lkIHhnaV9kaXNwaW5mbyhzdHJ1Y3QgYXBfZGF0YSAqcmVjKTsKLSNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvb3NkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9vc2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmM3ZDNhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9vc2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSNpZm5kZWYgX09TREVGX0hfCi0jZGVmaW5lIF9PU0RFRl9IXwotCi0vKiAjZGVmaW5lIFdJTkNFX0hFQURFUiovCi0vKiNkZWZpbmUgV0lOMjAwMCovCi0vKiAjZGVmaW5lIFRDICovCi0jZGVmaW5lIExJTlVYX0tFUk5FTAotLyogI2RlZmluZSBMSU5VWF9YRjg2ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIExJTlVYX0tFUk5FTAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBUQwotI2VuZGlmCi0jaWZkZWYgV0lOMjAwMAotI2VuZGlmCi0jaWZkZWYgV0lOQ0VfSEVBREVSCi0jZW5kaWYKLSNpZmRlZiBMSU5VWF9YRjg2Ci0jZGVmaW5lIExJTlVYCi0jZW5kaWYKLSNpZmRlZiBMSU5VWF9LRVJORUwKLSNkZWZpbmUgTElOVVgKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBUQwotI2RlZmluZSBYR0lfU2V0TWVtb3J5KE1lbW9yeUFkZHJlc3MsTWVtb3J5U2l6ZSx2YWx1ZSkgbWVtc2V0KE1lbW9yeUFkZHJlc3MsIHZhbHVlLCBNZW1vcnlTaXplKTsKLSNlbmRpZgotI2lmZGVmIFdJTjIwMDAKLSNkZWZpbmUgWEdJX1NldE1lbW9yeShNZW1vcnlBZGRyZXNzLE1lbW9yeVNpemUsdmFsdWUpIE1lbUZpbGwoKFBWT0lEKSBNZW1vcnlBZGRyZXNzLChVTE9ORykgTWVtb3J5U2l6ZSwoVUNIQVIpIHZhbHVlKTsKLSNlbmRpZgotI2lmZGVmIFdJTkNFX0hFQURFUgotI2RlZmluZSBYR0lfU2V0TWVtb3J5KE1lbW9yeUFkZHJlc3MsTWVtb3J5U2l6ZSx2YWx1ZSkgbWVtc2V0KE1lbW9yeUFkZHJlc3MsIHZhbHVlLCBNZW1vcnlTaXplKTsKLSNlbmRpZgotI2lmZGVmIExJTlVYX1hGODYKLSNkZWZpbmUgWEdJX1NldE1lbW9yeShNZW1vcnlBZGRyZXNzLE1lbW9yeVNpemUsdmFsdWUpIG1lbXNldChNZW1vcnlBZGRyZXNzLCB2YWx1ZSwgTWVtb3J5U2l6ZSkKLSNlbmRpZgotI2lmZGVmIExJTlVYX0tFUk5FTAotI2RlZmluZSBYR0lfU2V0TWVtb3J5KE1lbW9yeUFkZHJlc3MsTWVtb3J5U2l6ZSx2YWx1ZSkgbWVtc2V0KE1lbW9yeUFkZHJlc3MsIHZhbHVlLCBNZW1vcnlTaXplKQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBUQwotI2RlZmluZSBYR0lfTWVtb3J5Q29weShEZXN0aW5hdGlvbixTb3J1Y2UsTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3J1Y2UsIExlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBXSU4yMDAwCi0jZGVmaW5lIFhHSV9NZW1vcnlDb3B5KERlc3RpbmF0aW9uLFNvcnVjZSxMZW5ndGgpICAvKlZpZGVvUG9ydE1vdmVNZW1vcnkoKFBVQ0hBUilEZXN0aW5hdGlvbiAsIFNvcnVjZSxsZW5ndGgpOyovCi0jZW5kaWYKLSNpZmRlZiBXSU5DRV9IRUFERVIKLSNkZWZpbmUgWEdJX01lbW9yeUNvcHkoRGVzdGluYXRpb24sU29ydWNlLExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU29ydWNlLCBMZW5ndGgpOwotI2VuZGlmCi0jaWZkZWYgTElOVVhfWEY4NgotI2RlZmluZSBYR0lfTWVtb3J5Q29weShEZXN0aW5hdGlvbixTb3J1Y2UsTGVuZ3RoKSBtZW1jcHkoRGVzdGluYXRpb24sU29ydWNlLExlbmd0aCkKLSNlbmRpZgotI2lmZGVmIExJTlVYX0tFUk5FTAotI2RlZmluZSBYR0lfTWVtb3J5Q29weShEZXN0aW5hdGlvbixTb3J1Y2UsTGVuZ3RoKSBtZW1jcHkoRGVzdGluYXRpb24sU29ydWNlLExlbmd0aCkKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIE91dFBvcnRCeXRlCi0jdW5kZWYgT3V0UG9ydEJ5dGUKLSNlbmRpZiAvKiBPdXRQb3J0Qnl0ZSAqLwotCi0jaWZkZWYgT3V0UG9ydFdvcmQKLSN1bmRlZiBPdXRQb3J0V29yZAotI2VuZGlmIC8qIE91dFBvcnRXb3JkICovCi0KLSNpZmRlZiBPdXRQb3J0TG9uZwotI3VuZGVmIE91dFBvcnRMb25nCi0jZW5kaWYgLyogT3V0UG9ydExvbmcgKi8KLQotI2lmZGVmIEluUG9ydEJ5dGUKLSN1bmRlZiBJblBvcnRCeXRlCi0jZW5kaWYgLyogSW5Qb3J0Qnl0ZSAqLwotCi0jaWZkZWYgSW5Qb3J0V29yZAotI3VuZGVmIEluUG9ydFdvcmQKLSNlbmRpZiAvKiBJblBvcnRXb3JkICovCi0KLSNpZmRlZiBJblBvcnRMb25nCi0jdW5kZWYgSW5Qb3J0TG9uZwotI2VuZGlmIC8qIEluUG9ydExvbmcgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVEMKLSNkZWZpbmUgT3V0UG9ydEJ5dGUocCx2KSBvdXRwKCh1bnNpZ25lZCBzaG9ydCkocCksKHVuc2lnbmVkIGNoYXIpKHYpKQotI2RlZmluZSBPdXRQb3J0V29yZChwLHYpIG91dHAoKHVuc2lnbmVkIHNob3J0KShwKSwodW5zaWduZWQgc2hvcnQpKHYpKQotI2RlZmluZSBPdXRQb3J0TG9uZyhwLHYpIG91dHAoKHVuc2lnbmVkIHNob3J0KShwKSwodW5zaWduZWQgbG9uZykodikpCi0jZGVmaW5lIEluUG9ydEJ5dGUocCkgICAgaW5wKCh1bnNpZ25lZCBzaG9ydCkocCkpCi0jZGVmaW5lIEluUG9ydFdvcmQocCkgICAgaW5wKCh1bnNpZ25lZCBzaG9ydCkocCkpCi0jZGVmaW5lIEluUG9ydExvbmcocCkgICAgKChpbnAoKHVuc2lnbmVkIHNob3J0KShwKzIpKTw8MTYpIHwgaW5wKCh1bnNpZ25lZCBzaG9ydCkocCkpKQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIExJTlVYIFhGODYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIExJTlVYX1hGODYKLSNkZWZpbmUgT3V0UG9ydEJ5dGUocCx2KSBvdXRiKChDQVJEMTYpKHApLChDQVJEOCkodikpCi0jZGVmaW5lIE91dFBvcnRXb3JkKHAsdikgb3V0dygoQ0FSRDE2KShwKSwoQ0FSRDE2KSh2KSkKLSNkZWZpbmUgT3V0UG9ydExvbmcocCx2KSBvdXRsKChDQVJEMTYpKHApLChDQVJEMzIpKHYpKQotI2RlZmluZSBJblBvcnRCeXRlKHApICAgIGluYigoQ0FSRDE2KShwKSkKLSNkZWZpbmUgSW5Qb3J0V29yZChwKSAgICBpbncoKENBUkQxNikocCkpCi0jZGVmaW5lIEluUG9ydExvbmcocCkgICAgaW5sKChDQVJEMTYpKHApKQotI2VuZGlmCi0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLSNkZWZpbmUgT3V0UG9ydEJ5dGUocCx2KSBvdXRiKCh1OCkodiksKHApKQotI2RlZmluZSBPdXRQb3J0V29yZChwLHYpIG91dHcoKHUxNikodiksKHApKQotI2RlZmluZSBPdXRQb3J0TG9uZyhwLHYpIG91dGwoKHUzMikodiksKHApKQotI2RlZmluZSBJblBvcnRCeXRlKHApICAgIGluYihwKQotI2RlZmluZSBJblBvcnRXb3JkKHApICAgIGludyhwKQotI2RlZmluZSBJblBvcnRMb25nKHApICAgIGlubChwKQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIFdJTiAyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIFdJTjIwMDAKLSNkZWZpbmUgT3V0UG9ydEJ5dGUocCx2KSBWaWRlb1BvcnRXcml0ZVBvcnRVY2hhciAoKFBVQ0hBUikgKHApLCAoVUNIQVIpICh2KSkKLSNkZWZpbmUgT3V0UG9ydFdvcmQocCx2KSBWaWRlb1BvcnRXcml0ZVBvcnRVc2hvcnQoKFBVU0hPUlQpIChwKSwgKFVTSE9SVCkgKHYpKQotI2RlZmluZSBPdXRQb3J0TG9uZyhwLHYpIFZpZGVvUG9ydFdyaXRlUG9ydFVsb25nICgoUFVMT05HKSAocCksIChVTE9ORykgKHYpKQotI2RlZmluZSBJblBvcnRCeXRlKHApICAgIFZpZGVvUG9ydFJlYWRQb3J0VWNoYXIgICgoUFVDSEFSKSAocCkpCi0jZGVmaW5lIEluUG9ydFdvcmQocCkgICAgVmlkZW9Qb3J0UmVhZFBvcnRVc2hvcnQgKChQVVNIT1JUKSAocCkpCi0jZGVmaW5lIEluUG9ydExvbmcocCkgICAgVmlkZW9Qb3J0UmVhZFBvcnRVbG9uZyAgKChQVUxPTkcpIChwKSkKLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIFdJTiBDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBXSU5DRV9IRUFERVIKLSNkZWZpbmUgT3V0UG9ydEJ5dGUocCx2KSBXUklURV9QT1JUX1VDSEFSICgoUFVDSEFSKSAocCksIChVQ0hBUikgKHYpKQotI2RlZmluZSBPdXRQb3J0V29yZChwLHYpIFdSSVRFX1BPUlRfVVNIT1JUKChQVVNIT1JUKSAocCksIChVU0hPUlQpICh2KSkKLSNkZWZpbmUgT3V0UG9ydExvbmcocCx2KSBXUklURV9QT1JUX1VMT05HICgoUFVMT05HKSAocCksIChVTE9ORykgKHYpKQotI2RlZmluZSBJblBvcnRCeXRlKHApICAgIFJFQURfUE9SVF9VQ0hBUiAgKChQVUNIQVIpIChwKSkKLSNkZWZpbmUgSW5Qb3J0V29yZChwKSAgICBSRUFEX1BPUlRfVVNIT1JUICgoUFVTSE9SVCkgKHApKQotI2RlZmluZSBJblBvcnRMb25nKHApICAgIFJFQURfUE9SVF9VTE9ORyAgKChQVUxPTkcpIChwKSkKLSNlbmRpZgotI2VuZGlmIC8vIF9PU0RFRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2RlZi5oCmluZGV4IDE3YTdhZGEuLjRkZTE4MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9kZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfZGVmLmgKQEAgLTYsNyArNiw3IEBACiAjZGVmaW5lIE5ld1NjcmF0Y2gKICNlbmRpZgogLyogc2hhbXBvbyAqLwotI2lmZGVmIExJTlVYX0tFUk5FTAorCiAjZGVmaW5lIFNFUV9BRERSRVNTX1BPUlQJICAweDAwMTQKICNkZWZpbmUgU0VRX0RBVEFfUE9SVAkJICAweDAwMTUKICNkZWZpbmUgTUlTQ19PVVRQVVRfUkVHX1JFQURfUE9SVCAweDAwMUMKQEAgLTE3LDcgKzE3LDcgQEAKICNkZWZpbmUgQ1JUQ19BRERSRVNTX1BPUlRfQ09MT1IgICAweDAwMjQKICNkZWZpbmUgVklERU9fU1VCU1lTVEVNX0VOQUJMRV9QT1JUIDB4MDAxMwogI2RlZmluZSBQQ0lfQ09NTUFORAkJMHgwNAotI2VuZGlmCisKIC8qIH5zaGFtcG9vICovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2V4dC5jCmluZGV4IDQ5YjM5ZWUuLjFlY2Y5ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9leHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfZXh0LmMKQEAgLTEsNDAgKzEsNyBAQAotI2luY2x1ZGUgIm9zZGVmLmgiCi0KLQotCi0KLSNpZmRlZiBXSU4yMDAwCi0KLSNpbmNsdWRlIDxkZGVycm9yLmg+Ci0jaW5jbHVkZSA8ZGV2aW9jdGwuaD4KLSNpbmNsdWRlIDxtaW5pcG9ydC5oPgotI2luY2x1ZGUgPG50ZGR2ZGVvLmg+Ci0jaW5jbHVkZSA8dmlkZW8uaD4KLSNpbmNsdWRlICJ4Z2l2LmgiCi0jaW5jbHVkZSAiZGRfaTJjLmgiCi0jaW5jbHVkZSAidG9vbHMuaCIKLSNlbmRpZiAvKiBXSU4yMDAwICovCi0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0jaW5jbHVkZSAieGY4Ni5oIgotI2luY2x1ZGUgInhmODZQY2lJbmZvLmgiCi0jaW5jbHVkZSAieGdpLmgiCi0jaW5jbHVkZSAieGdpX3JlZ3MuaCIKLSNlbmRpZgotCi0jaWZkZWYgTElOVVhfS0VSTkVMCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSAiWEdJZmIuaCIKLS8qI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpbmNsdWRlIDx2aWRlby9YR0lmYi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9YR0lmYi5oPgotI2VuZGlmKi8KLSNlbmRpZgotCi0KIAogI2luY2x1ZGUgInZiX2RlZi5oIgogI2luY2x1ZGUgInZnYXR5cGVzLmgiCkBAIC00Miw0MyArOSwzMyBAQAogI2luY2x1ZGUgInZiX3V0aWwuaCIKICNpbmNsdWRlICJ2Yl9zZXRtb2RlLmgiCiAjaW5jbHVkZSAidmJfZXh0LmgiCi1leHRlcm4gICBVQ0hBUiBYR0kzMzBfU29mdFNldHRpbmc7Ci1leHRlcm4gICBVQ0hBUiBYR0kzMzBfT3V0cHV0U2VsZWN0OwotZXh0ZXJuICAgVVNIT1JUIFhHSTMzMF9SR0JTZW5zZURhdGEyOwotZXh0ZXJuICAgVVNIT1JUIFhHSTMzMF9ZQ1NlbnNlRGF0YTI7Ci1leHRlcm4gICBVU0hPUlQgWEdJMzMwX1ZpZGVvU2Vuc2VEYXRhMjsKLSNpZmRlZiBXSU4yMDAwCi1leHRlcm4gICBVQ0hBUiBTZW5zZUNIVFYoUEhXX0RFVklDRV9FWFRFTlNJT04gcEhXREUpOyAgICAgICAvKiAyMDA3LzA1LzE3IEJpbGx5ICovCi0jZW5kaWYKLXZvaWQgICAgIFhHSV9HZXRTZW5zZVN0YXR1cyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICk7Ci1CT09MRUFOICBYR0lOZXdfR2V0UGFuZWxJRChQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1VU0hPUlQgICBYR0lOZXdfU2Vuc2VMQ0QoUFhHSV9IV19ERVZJQ0VfSU5GTyxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1CT09MRUFOICBYR0lOZXdfR2V0TENERERDSW5mbyhQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgWEdJU2V0RFBNUyggUFhHSV9IV19ERVZJQ0VfSU5GTyBwWEdJSFdERSAsIFVMT05HIFZFU0FfUE9XRVJfU1RBVEUgKSA7Ci1CT09MRUFOICBYR0lOZXdfQnJpZGdlSXNFbmFibGUoUFhHSV9IV19ERVZJQ0VfSU5GTyxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotQk9PTEVBTiAgWEdJTmV3X1NlbnNlKFVTSE9SVCB0ZW1wYngsVVNIT1JUIHRlbXBjeCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotQk9PTEVBTiAgWEdJTmV3X1NlbnNlSGlUViggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkgOworZXh0ZXJuICAgdW5zaWduZWQgY2hhciBYR0kzMzBfU29mdFNldHRpbmc7CitleHRlcm4gICB1bnNpZ25lZCBjaGFyIFhHSTMzMF9PdXRwdXRTZWxlY3Q7CitleHRlcm4gICB1bnNpZ25lZCBzaG9ydCBYR0kzMzBfUkdCU2Vuc2VEYXRhMjsKK2V4dGVybiAgIHVuc2lnbmVkIHNob3J0IFhHSTMzMF9ZQ1NlbnNlRGF0YTI7CitleHRlcm4gICB1bnNpZ25lZCBzaG9ydCBYR0kzMzBfVmlkZW9TZW5zZURhdGEyOwordm9pZCAgICAgWEdJX0dldFNlbnNlU3RhdHVzKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciAgWEdJTmV3X0dldFBhbmVsSUQoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19TZW5zZUxDRChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosCisJCQkgICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIGNoYXIgWEdJTmV3X0dldExDREREQ0luZm8oc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkIFhHSVNldERQTVMoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsCisJCXVuc2lnbmVkIGxvbmcgVkVTQV9QT1dFUl9TVEFURSk7Cit1bnNpZ25lZCBjaGFyIFhHSU5ld19CcmlkZ2VJc0VuYWJsZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyIFhHSU5ld19TZW5zZSh1bnNpZ25lZCBzaG9ydCB0ZW1wYngsIHVuc2lnbmVkIHNob3J0IHRlbXBjeCwKKwkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciBYR0lOZXdfU2Vuc2VIaVRWKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJICAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCUR5bmFtaWMgU2Vuc2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQgWEdJX1dhaXREaXNwbGF5KHZvaWQpOwotQk9PTEVBTiBYR0lfSXMzMDFDKFBWQl9ERVZJQ0VfSU5GTyk7Ci1CT09MRUFOIFhHSV9JczMwMUxWKFBWQl9ERVZJQ0VfSU5GTyk7Cit1bnNpZ25lZCBjaGFyIFhHSV9JczMwMUMoc3RydWN0IHZiX2RldmljZV9pbmZvICopOwordW5zaWduZWQgY2hhciBYR0lfSXMzMDFMVihzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CiAKLSNpZmRlZiBXSU4yMDAwCi1VQ0hBUiBYR0lfU2Vuc2VMQ0QoUEhXX0RFVklDRV9FWFRFTlNJT04sIFBWQl9ERVZJQ0VfSU5GTyk7Ci1VQ0hBUiBYR0lfR2V0TENERERDSW5mbyhQSFdfREVWSUNFX0VYVEVOU0lPTixQVkJfREVWSUNFX0lORk8pOwotCi1leHRlcm4gQk9PTCBiR2V0RGRjSW5mbygKLVBIV19ERVZJQ0VfRVhURU5TSU9OICBwSFdERSwKLVVMT05HICAgICAgICAgICAgICAgICB1bFdoaWNoT25lLAotUFVDSEFSICAgICAgICAgICAgICAgIHBqUXVlcnlCdWZmZXIsCi1VTE9ORyAgICAgICAgICAgICAgICAgdWxCdWZmZXJTaXplCi0gICApOwotCi0jZW5kaWYKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg3LDkgKzQ0LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUJPT0xFQU4gWEdJTmV3X0lzMzAxQiggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordW5zaWduZWQgY2hhciBYR0lOZXdfSXMzMDFCKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZmxhZyA7CisgICAgdW5zaWduZWQgc2hvcnQgZmxhZyA7CiAKICAgICBmbGFnID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlBhcnQ0UG9ydCAsIDB4MDEgKSA7CiAKQEAgLTEwNSw3ICs2Miw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSV9JczMwMUMoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgWEdJX0lzMzAxQyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaWYgKCAoIFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDAxICkgJiAweEYwICkgPT0gMHhDMCApCiAgICAgICAgIHJldHVybiggMSApIDsKQEAgLTEyNiw3ICs4Myw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSV9JczMwMUxWKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSV9JczMwMUxWKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBpZiAoIFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDAxICkgPj0gMHhEMCApCiAgICAgewpAQCAtMTQ1LDkgKzEwMiwxMSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lOZXdfU2Vuc2UoICBVU0hPUlQgdGVtcGJ4ICwgVVNIT1JUIHRlbXBjeCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordW5zaWduZWQgY2hhciBYR0lOZXdfU2Vuc2UodW5zaWduZWQgc2hvcnQgdGVtcGJ4LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHRlbXBjeCwKKwkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXAgLCBpICwgdGVtcGNoIDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wLCBpLCB0ZW1wY2g7CiAKICAgICB0ZW1wID0gdGVtcGJ4ICYgMHhGRiA7CiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQ0UG9ydCAsIDB4MTEgLCB0ZW1wICkgOwpAQCAtMTY5LDI4NCArMTI4LDYgQEAKICAgICAgICAgcmV0dXJuKCAwICkgOwogfQogCi0jaWZkZWYgV0lOMjAwMAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGdW5jdGlvbiA6IFhHSV9TZW5zZUxDRCAqLwotLyogSW5wdXQgOiAqLwotLyogT3V0cHV0IDogKi8KLS8qIERlc2NyaXB0aW9uIDogKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUNIQVIgWEdJX1NlbnNlTENEKCBQSFdfREVWSUNFX0VYVEVOU0lPTiBwSFdERSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCi17Ci0gICAgVVNIT1JUIHRlbXBheCAsIHRlbXBieCAsIHRlbXBjeCA7Ci0gICAgVUNIQVIgU29mdFNldHRpbmcgPSBYR0kzMzBfU29mdFNldHRpbmcgOwotCi0gICAgaWYgKCBwVkJJbmZvLT5WQlR5cGUgJiAoIFZCX1hHSTMwMUxWIHwgVkJfWEdJMzAyTFYgKSApCi0gICAgICAgIHJldHVybiggMSApIDsKLQotCi0gICAgaWYgKCBTb2Z0U2V0dGluZyAmIEhvdFBsdWdGdW5jdGlvbiApCS8qIEhvdCBQbHVnIERldGVjdGlvbiAqLwotICAgIHsKLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORCggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgwRiAsIDB4M0YgKSA7Ci0gICAgICAgIHRlbXBieCA9IDAgOwotICAgICAgICB0ZW1wY3ggPSAweDkwMTAgOwotICAgICAgICBpZiAoIFhHSU5ld19TZW5zZSggdGVtcGJ4ICwgdGVtcGN4LCBwVkJJbmZvICkgKQotICAgICAgICAgICAgcmV0dXJuKCAxICkgOwotCi0gICAgICAgIHJldHVybiggMCApIDsKLSAgICB9Ci0gICAgZWxzZQkvKiBHZXQgTENEIEluZm8gZnJvbSBFRElEICovCi0gICAgICAgIHJldHVybihYR0lfR2V0TENERERDSW5mbyhwSFdERSwgcFZCSW5mbykpOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogRnVuY3Rpb24gOiBYR0lfR2V0TENERERDSW5mbyAqLwotLyogSW5wdXQgOiAqLwotLyogT3V0cHV0IDogKi8KLS8qIERlc2NyaXB0aW9uIDogKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUNIQVIgWEdJX0dldExDREREQ0luZm8oIFBIV19ERVZJQ0VfRVhURU5TSU9OIHBIV0RFICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCi17Ci0gICAgVUNIQVIgdGVtcGFoICwgdGVtcGJsICwgdGVtcGJoIDsKLSAgICBVU0hPUlQgdGVtcGJ4ICwgdGVtcCA7Ci0gICAgVUNIQVIgcGpFRElEQnVmWyAyNTYgXSA7Ci0gICAgVUxPTkcgdWxCdWZmZXJTaXplID0gMjU2IDsKLSAgICBVQ0hBUiBiTUFTS19PVVRQVVRTVEFURV9DUlQyTENEID0gMiA7IC8qIDA0MjMgc2hhbXBvbyAqLwotCi0gICAgYkdldERkY0luZm8oIHBIV0RFICwgTUFTS19PVVRQVVRTVEFURV9DUlQyTENEICwgcGpFRElEQnVmICwgdWxCdWZmZXJTaXplICkgOwotICAgIGlmICggKCAqKCAoIFBVTE9ORyApcGpFRElEQnVmICkgPT0gMHhGRkZGRkYwMCApICYmICggKiggKCBQVUxPTkcgKSggcGpFRElEQnVmICsgNCApICkgPT0gMHgwMEZGRkZGRiApICkKLSAgICB7Ci0gICAgICAgIHRlbXBhaCA9IFBhbmVsMTAyNHg3NjggOwotICAgICAgICB0ZW1wYmw9KCAqKCBwakVESURCdWYgKyAweDNBICkgKSAmIDB4ZjAgOwotCi0gICAgICAgIGlmICggdGVtcGJsICE9IDB4NDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wYWggPSBQYW5lbDE2MDB4MTIwMCA7Ci0gICAgICAgICAgICBpZiAoIHRlbXBibCAhPSAweDYwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wYWggPSBQYW5lbDEyODB4MTAyNCA7Ci0gICAgICAgICAgICAgICAgdGVtcGJoID0gKCAqKCBwakVESURCdWYgKyAweDNCICkgKSA7Ci0gICAgICAgICAgICAgICAgaWYgKCB0ZW1wYmggIT0gMHgwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wYWggPSBQYW5lbDEyODB4OTYwIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0ZW1wYmggIT0gMHgwQzAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wYnggPSAoICggKiggcGpFRElEQnVmICsgMHgyNCApICkgPDwgOCApIHwgKCAqKCBwakVESURCdWYgKyAweDIzICkgKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wYWggPSBQYW5lbDEyODB4MTAyNCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEoIHRlbXBieCAmIDB4MDEwMCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wYWggPSBQYW5lbDEwMjR4NzY4IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEoIHRlbXBieCAmIDB4MEUwMCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBhaCA9IFBhbmVsMTI4MHgxMDI0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIHRlbXBieCAmIDB4MDBGRiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBTY2FsaW5nTENEIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UDNkNCAsIDB4MzcgLCB0ZW1wICkgOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNkNCAsIDB4MzYgLCAoIH4weDA3ICkgLCB0ZW1wYWggKSA7Ci0gICAgICAgIHRlbXBhaCA9ICggKCAqKCBwakVESURCdWYgKyAweDQ3ICkgKSAmIDB4MDYgKSA7CQkvKiBQb2xhcml0eSAqLwotICAgICAgICB0ZW1wYWggPSAoIHRlbXBhaCBeIDB4MDYgKSA8PCA0IDsKLSAgICAgICAgdGVtcGFoIHw9IExDRFN5bmMgOwotICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDM3ICwgKCB+TENEU3luY0JpdCApICwgdGVtcGFoICkgOwotICAgICAgICB0ZW1wYmg9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgzNiApIDsKLSAgICAgICAgdGVtcGJoICY9IDB4MDcgOwotICAgICAgICBpZiAoIHRlbXBiaCA9PSBQYW5lbDEyODB4OTYwICkKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWdBTkQoIHBWQkluZm8tPlAzZDQgLCAweDM3ICwgMHgwRSApIDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICpwakVESURCdWYgPT0gMHgyMCApCi0gICAgewotICAgICAgICB0ZW1wYWggPSBQYW5lbDEwMjR4NzY4IDsKLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QM2Q0ICwgMHgzNiAsICggfjB4MDcgKSAsIHRlbXBhaCApIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuKCAwICkgOwotICAgIH0KLQotICAgIHJldHVybiggMSApIDsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIEZ1bmN0aW9uIDogWEdJX0R5U2Vuc2UgKi8KLS8qIElucHV0IDogKi8KLS8qIE91dHB1dCA6ICovCi0vKiBEZXNjcmlwdGlvbiA6ICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUJPT0xFQU4gWEdJX0R5U2Vuc2UoIFBIV19ERVZJQ0VfRVhURU5TSU9OIHBIV0RFICwgUFVDSEFSIHVqQ29ubmVjdFN0YXR1cykKLXsKLSAgICBVQ0hBUiBwcmVfQ1JELHByZV9TUjFFICwgcHJlX1BhcnQyXzAgLCBwcmVfUGFydDRfRCA7Ci0gICAgVVNIT1JUIHRlbXBheCAsIHRlbXBieCAsIHRlbXBjeCAsIHB1c2hheCAsIHRlbXAgOwotICAgIFZCX0RFVklDRV9JTkZPIFZCSU5GOwotICAgIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvID0gJlZCSU5GOwotICAgIFVDSEFSIE91dHB1dFNlbGVjdCA9IFhHSTMzMF9PdXRwdXRTZWxlY3QgOwotICAgIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb249IHBIV0RFLT5wWEdJSFdERSA7Ci0gICAgVUNIQVIgICBiQ29ubmVjdFN0YXR1cyA9IDAgOwotICAgIHBWQkluZm8tPkJhc2VBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKLSAgICBwVkJJbmZvLT5ST01BZGRyICA9IHBIV0RFLT5walZpcnR1YWxSb21CYXNlIDsKLQotICAgIHBWQkluZm8tPlAzYzIgPSBwVkJJbmZvLT5CYXNlQWRkciArIDB4MTIgOwotICAgIHBWQkluZm8tPlAzYzQgPSBwVkJJbmZvLT5CYXNlQWRkciArIDB4MTQgOwotICAgIHBWQkluZm8tPlAzZDQgPSBwVkJJbmZvLT5CYXNlQWRkciArIDB4MjQgOwotICAgIHBWQkluZm8tPlBhcnQyUG9ydCA9IHBWQkluZm8tPkJhc2VBZGRyICsgWEdJX0NSVDJfUE9SVF8xMCA7Ci0gICAgcFZCSW5mby0+UGFydDRQb3J0ID0gcFZCSW5mby0+QmFzZUFkZHIgKyBYR0lfQ1JUMl9QT1JUXzE0IDsKLSAgICBwdXNoYXggPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MTcgKSA7CS8qIDA1MTIgRml4IER5c2Vuc2UgaGFuZ2VkICovCi0gICAgdGVtcCA9ICggcHVzaGF4ICYgMHgwMEZGICkgfCAweDgwIDsKLSAgICBYR0lOZXdfU2V0UmVnT1IoIHBWQkluZm8tPlAzZDQgLCAweDE3ICwgdGVtcCApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MDUgLCAweDg2ICkgOwotICAgIC8qIGJlZ2lubmluZyBvZiBkeW5hbWljIHNlbnNlIENSVDEgKi8KLQotICAgIHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPSAwOwotICAgIGlmIChwSFdERS0+YkNINzAwNykKLSAgICB7Ci0gICAgCUluaXRUbzMzMFBvaW50ZXIoIHBIV0RFLT5wWEdJSFdERS0+akNoaXBUeXBlLCBwVkJJbmZvICkgOwotICAgICAgICBId0RldmljZUV4dGVuc2lvbi0+cERldmljZSA9IChQVk9JRClwSFdERTsKLSAgICAgICAgcFZCSW5mby0+SUZfREVGX0NINzAwNyA9IDE7Ci0gICAgICAgIC8qIFtCaWxseV0gMjAwNy8wNS8xNCBGb3IgQ0g3MDA3ICovCi0gICAgICAgIGlmICggcFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICBiQ29ubmVjdFN0YXR1cyA9IFNlbnNlQ0hUVihId0RldmljZUV4dGVuc2lvbi0+cERldmljZSkgOyAvKiAwNy8wNS8yOCAqLwotICAgICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDMyICwgfjB4MDMgLCAoVUNIQVIpYkNvbm5lY3RTdGF0dXMgKSA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoKCBwSFdERS0+akNoaXBJRCA+PSBYRzQwICkgfHwgKCBwSFdERS0+akNoaXBJRCA+PSBYRzIwICkpCi0gICAgewotCi0gICAgICAgIGlmICggcEhXREUtPmpDaGlwSUQgPj0gWEc0MCApCi0gICAgCSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NTcgLCAweDRBICkgOwkvKiB3cml0ZSBzZW5zZSBwYXR0ZXJuIDMwLT40YSAqLwotICAgIAllbHNlCi0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NTcgLCAweDVGICkgOwkvKiB3cml0ZSBzZW5zZSBwYXR0ZXJuICovCi0KLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QM2Q0ICwgMHg1MyAsIDB4RkYgLCAweDAyICkgOwkvKiBlbmFibGUgc2Vuc2UgREFDICovCi0gICAgICAgIFhHSV9XYWl0RGlzcGx5KHBWQkluZm8pIDsKLQotICAgICAgICBpZihYR0lOZXdfR2V0UmVnMiggcFZCSW5mby0+UDNjMiApICYgMHgxMCApCi0gICAgICAgICAgICBiQ29ubmVjdFN0YXR1cyB8PSBNb25pdG9yMVNlbnNlIDsKLQotICAgICAgICBYR0lOZXdfU2V0UmVnQU5EKCBwVkJJbmZvLT5QM2Q0ICwgMHg1MyAsIDB4RkQgKSA7CS8qIGRpc2FibGUgc2Vuc2UgREFDICovCi0gICAgICAgIFhHSU5ld19TZXRSZWdBTkQoIHBWQkluZm8tPlAzZDQgLCAweDU3ICwgMHgwMCApIDsJLyogY2xlYXIgc2Vuc2UgcGF0dGVybiAqLwotCi0KLSAgICAgICAgLyogLS0tLS0tLS0tLSBFbmQgb2YgZHluYW1pYyBzZW5zZSBDUlQxIC0tLS0tLS0tLS0tICovCi0KLSAgICAgICAgLyogLS0tLS0tLS0tLSBiZWdpbm5pbmcgb2YgZHluYW1pYyBzZW5zZSBWQiAtLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgcHJlX1NSMUUgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MUUgKSA7Ci0gICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UDNjNCAsIDB4MUUgLCAweDIwICkgOwkvKiBFbmFibGUgQ1JUMix3b3JrLWEtcm91bmQgZm9yIDMwMUIvMzAxTFYvMzAyTFYgKi8KLSAgICAgICAgcHJlX1BhcnQyXzAgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgwMCApIDsKLSAgICAgICAgcHJlX1BhcnQ0X0QgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgwRCApIDsKLQotICAgICAgICBpZiAoIFhHSV9JczMwMUMoIHBWQkluZm8gKSApCS8qIDMwMUMgb25seSAqLwotICAgICAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDBEICwgfjB4MDcgLCAweDAxICkgOwkvKiBTZXQgUGFydDQgMHgwRCBEWzI6MF0gdG8gMDAxYiAqLwotCi0gICAgICAgIC8qIHRlbXBheCA9IDAgOyAqLwotICAgICAgICBpZiAoICFYR0lfSXMzMDFMViggcFZCSW5mbyApICkKLSAgICAgICAgewotICAgICAgICAgICB0ZW1wYnggPSBYR0kzMzBfUkdCU2Vuc2VEYXRhMiA7Ci0gICAgICAgICAgICB0ZW1wY3ggPSAweDBFMDggOwotICAgICAgICAgICAgaWYoWEdJTmV3X1NlbnNlKCB0ZW1wYnggLCB0ZW1wY3gsIHBWQkluZm8gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkNvbm5lY3RTdGF0dXMgfD0gTW9uaXRvcjJTZW5zZSA7Ci0gICAgICAgICAgICAgICAgaWYgKCBPdXRwdXRTZWxlY3QgJiBTZXRTQ0FSVE91dHB1dCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiQ29ubmVjdFN0YXR1cyBePSAoIE1vbml0b3IyU2Vuc2UgfCBTQ0FSVFNlbnNlICkgOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIFhHSV9JczMwMUMoIHBWQkluZm8gKSApCS8qIDMwMUMgb25seSAqLwotICAgICAgICAgICAgWEdJTmV3X1NldFJlZ09SKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDBEICwgMHgwNCApIDsJLyogU2V0IFBhcnQ0IDB4MEQgRFsyXT0xIGZvciBkeW5hbWljIHNlbnNlICovCi0KLSAgICAgICAgaWYgKCAoIFhHSU5ld19JczMwMUIoIHBWQkluZm8gKSApICkKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgwMCAsIDB4MEMgKSA7ICAgIC8qID8/Pz8/Pz8/PyAqLwotCi0JaWYgKCBYR0lOZXdfU2Vuc2VIaVRWKCBId0RldmljZUV4dGVuc2lvbiAsIHBWQkluZm8pICkJCS8qIGFkZCBieSBrdWt1IGZvciBEeXNlbnNlIEhpVFYgLy9zdGFydCAqLwotCXsKLQkgICAgYkNvbm5lY3RTdGF0dXN8PSBZUGJQclNlbnNlIDsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgdGVtcGJ4ID0gWEdJMzMwX1lDU2Vuc2VEYXRhMiA7CS8qIFkvQyBTZW5zZSBEYXRhIFB0ciAqLwotICAgICAgICB0ZW1wY3ggPSAweDA2MDQgOwotICAgICAgICBpZiAoIFhHSU5ld19TZW5zZSggdGVtcGJ4ICwgdGVtcGN4ICwgcFZCSW5mbykgKQotICAgICAgICAgICAgYkNvbm5lY3RTdGF0dXMgfD0gU1ZJREVPU2Vuc2UgOwotCi0gICAgICAgIGlmICggT3V0cHV0U2VsZWN0ICYgQm9hcmRUVlR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wYnggPSBYR0kzMzBfVmlkZW9TZW5zZURhdGEyIDsKLSAgICAgICAgICAgIHRlbXBjeCA9IDB4MDgwNCA7Ci0gICAgICAgICAgICBpZiAoIFhHSU5ld19TZW5zZSh0ZW1wYnggLCB0ZW1wY3gsIHBWQkluZm8pICkKLSAgICAgICAgICAgICAgICBiQ29ubmVjdFN0YXR1c3w9IEFWSURFT1NlbnNlIDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggISggYkNvbm5lY3RTdGF0dXMgJiBTVklERU9TZW5zZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wYnggPSBYR0kzMzBfVmlkZW9TZW5zZURhdGEyIDsKLSAgICAgICAgICAgICAgICB0ZW1wY3ggPSAweDA4MDQgOwotICAgICAgICAgICAgICAgIGlmICggWEdJTmV3X1NlbnNlKCB0ZW1wYnggLCB0ZW1wY3gsIHBWQkluZm8gKSApCi0gICAgICAgICAgICAgICAgICAgIGJDb25uZWN0U3RhdHVzIHw9IEFWSURFT1NlbnNlIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAl9IC8qIGVuZCAqLwotICAgICAgICAvKiBEeVNlbnNlVkJDbnQgKi8KLQotICAgICAgICB0ZW1wYnggPSAwIDsKLSAgICAgICAgdGVtcGN4ID0gMCA7Ci0gICAgICAgIFhHSU5ld19TZW5zZSh0ZW1wYnggLCB0ZW1wY3gsIHBWQkluZm8gKSA7Ci0KLSAgICAgICAgaWYgKCAhKCBiQ29ubmVjdFN0YXR1cyAmIE1vbml0b3IyU2Vuc2UgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggWEdJX1NlbnNlTENEKCBwSFdERSAsIHBWQkluZm8gKSApCi0gICAgICAgICAgICAgICAgYkNvbm5lY3RTdGF0dXMgfD0gTENEU2Vuc2UgOwotICAgICAgICB9Ci0KLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QM2Q0ICwgMHgzMiAsIH4oIEFWSURFT1NlbnNlIHwgU1ZJREVPU2Vuc2UgfCBMQ0RTZW5zZSB8IE1vbml0b3IyU2Vuc2UgfCBNb25pdG9yMVNlbnNlICkgLCBiQ29ubmVjdFN0YXR1cyApIDsKLQotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgwRCAsIHByZV9QYXJ0NF9EICkgOwotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgwMCAsIHByZV9QYXJ0Ml8wICkgOwotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MUUgLCBwcmVfU1IxRSApIDsKLQotICAgICAgICBpZiAoIFhHSV9JczMwMUMoIHBWQkluZm8gKSApCS8qIDMwMUMgb25seSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wYXggPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgwMCApIDsKLSAgICAgICAgICAgIGlmICggdGVtcGF4ICYgMHgyMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUmVzZXQgVkJQcm8gKi8KLSAgICAgICAgICAgICAgICBmb3IoIHRlbXBjeCA9IDIgOyB0ZW1wY3ggPiAwIDsgdGVtcGN4LS0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcGF4IF49IDB4MjAgOwotICAgICAgICAgICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgwMCAsIHRlbXBheCApIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogRW5kIG9mIGR5bmFtaWMgc2Vuc2UgVkIgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgWEdJX1NlbnNlQ1JUMShwVkJJbmZvKSA7Ci0gICAgICAgIFhHSV9HZXRTZW5zZVN0YXR1cyggSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8gKSA7CS8qIHNlbnNlIENSVDIgKi8KLSAgICAgICAgYkNvbm5lY3RTdGF0dXMgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MzIgKSA7Ci0gICAgfQotICAgIHRlbXAgPSBwdXNoYXggJiAweDAwRkYgOwkJLyogMDUxMiBGaXggRHlzZW5zZSBoYW5nZWQgKi8KLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MTcgLCB0ZW1wICkgOwotICAgIGlmICggYkNvbm5lY3RTdGF0dXMgKQotICAgIHsKLSAgICAgICAgKnVqQ29ubmVjdFN0YXR1cyA9IGJDb25uZWN0U3RhdHVzIDsKLSAgICAgICAgcmV0dXJuKCAxICkgOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiggMCApIDsKLX0KLQotI2VuZGlmIC8qIFdJTjIwMDAgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBGdW5jdGlvbiA6IFhHSVNldERQTVMgKi8KQEAgLTQ1NCwxMyArMTM1LDE0IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1WT0lEIFhHSVNldERQTVMoIFBYR0lfSFdfREVWSUNFX0lORk8gcFhHSUhXREUgLCBVTE9ORyBWRVNBX1BPV0VSX1NUQVRFICkKK3ZvaWQgWEdJU2V0RFBNUyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpwWEdJSFdERSwKKwkJdW5zaWduZWQgbG9uZyBWRVNBX1BPV0VSX1NUQVRFKQogewotICAgIFVTSE9SVCBNb2RlTm8sIE1vZGVJZEluZGV4IDsKLSAgICBVQ0hBUiAgdGVtcCA7Ci0gICAgVkJfREVWSUNFX0lORk8gVkJJTkY7Ci0gICAgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gPSAmVkJJTkY7Ci0gICAgcFZCSW5mby0+QmFzZUFkZHIgPSAoVUxPTkcpcFhHSUhXREUtPnBqSU9BZGRyZXNzIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIE1vZGVJZEluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgdGVtcDsKKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gVkJJTkY7CisgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvID0gJlZCSU5GOworICAgIHBWQkluZm8tPkJhc2VBZGRyID0gKHVuc2lnbmVkIGxvbmcpcFhHSUhXREUtPnBqSU9BZGRyZXNzIDsKICAgICBwVkJJbmZvLT5ST01BZGRyICA9IHBYR0lIV0RFLT5walZpcnR1YWxSb21CYXNlIDsKIAogCkBAIC01MjcsMTggKzIwOSwxOCBAQAogICAgIH0KIAogICAgIGlmICggVkVTQV9QT1dFUl9TVEFURSA9PSAweDAwMDAwNDAwICkKLSAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDMxICwgKCBVQ0hBUiApKCBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgzMSApICYgMHhGRSApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MzEsICh1bnNpZ25lZCBjaGFyKShYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MzEpICYgMHhGRSkpOwogICAgIGVsc2UKLSAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDMxICwgKCBVQ0hBUiApKCBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgzMSApIHwgMHgwMSApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MzEsICh1bnNpZ25lZCBjaGFyKShYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MzEpIHwgMHgwMSkpOwogCi0gICAgdGVtcCA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxZiApIDsKKyAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNjNCwgMHgxZik7CiAgICAgdGVtcCAmPSAweDNmIDsKICAgICBzd2l0Y2ggKCBWRVNBX1BPV0VSX1NUQVRFICkKICAgICB7CiAgICAgICAgIGNhc2UgMHgwMDAwMDAwMDogLyogb24gKi8KICAgICAgICAgICAgIGlmICggKCBwWEdJSFdERS0+dWpWQkNoaXBJRCA9PSBWQl9DSElQXzMwMSApIHx8ICggcFhHSUhXREUtPnVqVkJDaGlwSUQgPT0gVkJfQ0hJUF8zMDIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDFmICwgKCBVQ0hBUiApKCB0ZW1wIHwgMHgwMCApICkgOworCQlYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDFmLCAodW5zaWduZWQgY2hhcikodGVtcCB8IDB4MDApKTsKICAgICAgICAgICAgICAgICBYR0lfRW5hYmxlQnJpZGdlKCBwWEdJSFdERSwgcFZCSW5mbyApIDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKQEAgLTU5Niw3ICsyNzgsNyBAQAogICAgICAgICAgICAgICAgIFhHSV9EaXNwbGF5T2ZmKCBwWEdJSFdERSwgcFZCSW5mbyApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MWYgLCAoIFVDSEFSICkoIHRlbXAgfCAweDQwICkgKSA7CisJICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MWYsICh1bnNpZ25lZCBjaGFyKSh0ZW1wIHwgMHg0MCkpOwogICAgICAgICAgICAgYnJlYWsgOwogICAgICAgICBjYXNlIDB4MDAwMDAyMDA6IC8qIHN1c3BlbmQgKi8KICAgICAgICAgICAgIGlmICggcFhHSUhXREUtPmpDaGlwVHlwZSA9PSBYRzIxICkKQEAgLTYwOSwxMiArMjkxLDEyIEBACiAgICAgICAgICAgICAgICAgWEdJX0Rpc3BsYXlPZmYoIHBYR0lIV0RFLCBwVkJJbmZvICk7CiAgICAgICAgICAgICAgICAgWEdJX1hHMjdCTFNpZ25hbFZERCggMHgyMCAsIDB4MDAsIHBWQkluZm8gKSA7IC8qIExWRFMgc2lnbmFsIG9mZiAqLwogICAgICAgICAgICAgfQotICAgICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDFmICwgKCBVQ0hBUiApKCB0ZW1wIHwgMHg4MCApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDFmLCAodW5zaWduZWQgY2hhcikodGVtcCB8IDB4ODApKTsKICAgICAgICAgICAgIGJyZWFrIDsKICAgICAgICAgY2FzZSAweDAwMDAwNDAwOiAvKiBvZmYgKi8KICAgICAgICAgICAgIGlmICggKHBYR0lIV0RFLT51alZCQ2hpcElEID09IFZCX0NISVBfMzAxICkgfHwgKCBwWEdJSFdERS0+dWpWQkNoaXBJRCA9PSBWQl9DSElQXzMwMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MWYgLCAoIFVDSEFSICkoIHRlbXAgfCAweGMwICkgKSA7CisJCVhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MWYsICh1bnNpZ25lZCBjaGFyKSh0ZW1wIHwgMHhjMCkpOwogICAgICAgICAgICAgICAgIFhHSV9EaXNhYmxlQnJpZGdlKCBwWEdJSFdERSwgcFZCSW5mbyApIDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKQEAgLTY3NywxMiArMzU5LDEyIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9HZXRTZW5zZVN0YXR1cyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfR2V0U2Vuc2VTdGF0dXMoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGF4ID0gMCAsIHRlbXBieCAsIHRlbXBjeCAsIHRlbXAgLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXBheCA9IDAgLCB0ZW1wYnggLCB0ZW1wY3ggLCB0ZW1wICwKICAgICAgICAgICAgUDJyZWcwID0gMCAsIFNlbnNlTW9kZU5vID0gMCAsIE91dHB1dFNlbGVjdCA9ICpwVkJJbmZvLT5wT3V0cHV0U2VsZWN0ICwKICAgICAgICAgICAgTW9kZUlkSW5kZXggLCBpIDsKLSAgICBwVkJJbmZvLT5CYXNlQWRkciA9IChVTE9ORylId0RldmljZUV4dGVuc2lvbi0+cGpJT0FkZHJlc3MgOworICAgIHBWQkluZm8tPkJhc2VBZGRyID0gKHVuc2lnbmVkIGxvbmcpSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKIAogICAgIGlmICggcFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMSApCiAgICAgewpAQCAtODc2LDEwICs1NTgsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVTSE9SVCBYR0lOZXdfU2Vuc2VMQ0QoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordW5zaWduZWQgc2hvcnQgWEdJTmV3X1NlbnNlTENEKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJICAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICAvKiBVU0hPUlQgU29mdFNldHRpbmcgOyAqLwotICAgIFVTSE9SVCB0ZW1wIDsKKyAgICAvKiB1bnNpZ25lZCBzaG9ydCBTb2Z0U2V0dGluZyA7ICovCisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCA7CiAKICAgICBpZiAoICggSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA+PSBYRzIwICkgfHwgKCBId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID49IFhHNDAgKSApCiAgICAgICAgIHRlbXAgPSAwIDsKQEAgLTg5OSw5ICs1ODIsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lOZXdfR2V0TENERERDSW5mbyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIGNoYXIgWEdJTmV3X0dldExDREREQ0luZm8oc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCA7CiAKICAgICAvKiBhZGQgbGNkIHNlbnNlICovCiAgICAgaWYgKCBId0RldmljZUV4dGVuc2lvbi0+dWxDUlQyTENEVHlwZSA9PSBMQ0RfVU5LTk9XTiApCkBAIC05MTAsNyArNTkzLDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgdGVtcCA9ICggVVNIT1JUIClId0RldmljZUV4dGVuc2lvbi0+dWxDUlQyTENEVHlwZSA7CisJICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpSHdEZXZpY2VFeHRlbnNpb24tPnVsQ1JUMkxDRFR5cGUgOwogICAgICAgICBzd2l0Y2goIEh3RGV2aWNlRXh0ZW5zaW9uLT51bENSVDJMQ0RUeXBlICkKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBMQ0RfSU5WQUxJRDoKQEAgLTk1MiwyNiArNjM1LDI3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSU5ld19HZXRQYW5lbElEKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgWEdJTmV3X0dldFBhbmVsSUQoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBQYW5lbFR5cGVUYWJsZVsgMTYgXSA9IHsgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsODAweDYwMCAgfCBfUGFuZWxUeXBlMDAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDEgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsODAweDYwMCAgfCBfUGFuZWxUeXBlMDIgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsNjQweDQ4MCAgfCBfUGFuZWxUeXBlMDMgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDQgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDUgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDYgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IyNEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDcgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsODAweDYwMCAgfCBfUGFuZWxUeXBlMDggLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDkgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsODAweDYwMCAgfCBfUGFuZWxUeXBlMEEgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMEIgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMEMgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IyNEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMEQgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMEUgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMEYgfSA7Ci0gICAgVVNIT1JUIHRlbXBheCAsIHRlbXBieCAsIHRlbXAgOwotICAgIC8qIFVTSE9SVCByZXR1cm5fZmxhZyA7ICovCisJdW5zaWduZWQgc2hvcnQgUGFuZWxUeXBlVGFibGVbMTZdID0geworCQlTeW5jTk4gfCBQYW5lbFJHQjE4Qml0IHwgUGFuZWw4MDB4NjAwICB8IF9QYW5lbFR5cGUwMCwKKwkJU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDEsCisJCVN5bmNOTiB8IFBhbmVsUkdCMThCaXQgfCBQYW5lbDgwMHg2MDAgIHwgX1BhbmVsVHlwZTAyLAorCQlTeW5jTk4gfCBQYW5lbFJHQjE4Qml0IHwgUGFuZWw2NDB4NDgwICB8IF9QYW5lbFR5cGUwMywKKwkJU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDQsCisJCVN5bmNOTiB8IFBhbmVsUkdCMThCaXQgfCBQYW5lbDEwMjR4NzY4IHwgX1BhbmVsVHlwZTA1LAorCQlTeW5jTk4gfCBQYW5lbFJHQjE4Qml0IHwgUGFuZWwxMDI0eDc2OCB8IF9QYW5lbFR5cGUwNiwKKwkJU3luY05OIHwgUGFuZWxSR0IyNEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMDcsCisJCVN5bmNOTiB8IFBhbmVsUkdCMThCaXQgfCBQYW5lbDgwMHg2MDAgIHwgX1BhbmVsVHlwZTA4LAorCQlTeW5jTk4gfCBQYW5lbFJHQjE4Qml0IHwgUGFuZWwxMDI0eDc2OCB8IF9QYW5lbFR5cGUwOSwKKwkJU3luY05OIHwgUGFuZWxSR0IxOEJpdCB8IFBhbmVsODAweDYwMCAgfCBfUGFuZWxUeXBlMEEsCisJCVN5bmNOTiB8IFBhbmVsUkdCMThCaXQgfCBQYW5lbDEwMjR4NzY4IHwgX1BhbmVsVHlwZTBCLAorCQlTeW5jTk4gfCBQYW5lbFJHQjE4Qml0IHwgUGFuZWwxMDI0eDc2OCB8IF9QYW5lbFR5cGUwQywKKwkJU3luY05OIHwgUGFuZWxSR0IyNEJpdCB8IFBhbmVsMTAyNHg3NjggfCBfUGFuZWxUeXBlMEQsCisJCVN5bmNOTiB8IFBhbmVsUkdCMThCaXQgfCBQYW5lbDEwMjR4NzY4IHwgX1BhbmVsVHlwZTBFLAorCQlTeW5jTk4gfCBQYW5lbFJHQjE4Qml0IHwgUGFuZWwxMDI0eDc2OCB8IF9QYW5lbFR5cGUwRiB9OworCXVuc2lnbmVkIHNob3J0IHRlbXBheCAsIHRlbXBieCwgdGVtcDsKKyAgICAvKiB1bnNpZ25lZCBzaG9ydCByZXR1cm5fZmxhZyA7ICovCiAKICAgICB0ZW1wYXggPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MUEgKSA7CiAgICAgdGVtcGJ4ID0gdGVtcGF4ICYgMHgxRSA7CkBAIC0xMDI0LDkgKzcwOCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSU5ld19CcmlkZ2VJc0VuYWJsZSggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBjaGFyIFhHSU5ld19CcmlkZ2VJc0VuYWJsZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBmbGFnIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBmbGFnIDsKIAogICAgIGlmICggWEdJX0JyaWRnZUlzT24oIHBWQkluZm8gKSA9PSAwICkKICAgICB7CkBAIC0xMDUxLDkgKzczNSw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSU5ld19TZW5zZUhpVFYoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSU5ld19TZW5zZUhpVFYoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4ICwgdGVtcGN4ICwgdGVtcCAsIGkgLCB0ZW1wY2g7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4ICwgdGVtcGN4ICwgdGVtcCAsIGkgLCB0ZW1wY2g7CiAKICAgICB0ZW1wYnggPSAqcFZCSW5mby0+cFlDU2Vuc2VEYXRhMiA7CiAKQEAgLTExMzIsMTQgKzgxNiwxNCBAQAogOwkJICAgICBEWDogUEFuZWwgVi4gcmVzb2x1dGlvbgogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotdm9pZCBYR0lfWEcyMUZ1bjE0U3ViNzAoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICwgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzICkKK3ZvaWQgWEdJX1hHMjFGdW4xNFN1YjcwKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzKQogewogCi0gICAgVVNIT1JUIE1vZGVJZEluZGV4OwotICAgIFVTSE9SVCBNb2RlTm87CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXg7CisgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vOwogCi0gICAgVVNIT1JUIEVNb2RlQ291bnQ7Ci0gICAgVVNIT1JUIGx2ZHN0YWJsZWluZGV4OworICAgIHVuc2lnbmVkIHNob3J0IEVNb2RlQ291bnQ7CisgICAgdW5zaWduZWQgc2hvcnQgbHZkc3RhYmxlaW5kZXg7CiAKICAgICBsdmRzdGFibGVpbmRleCA9IFhHSV9HZXRMVkRTT0VNVGFibGVJbmRleCggcFZCSW5mbyApOwogICAgIHBCaW9zQXJndW1lbnRzLT5oLmJsID0gMHg4MTsKQEAgLTExNTMsNyArODM3LDcgQEAKICAgICAgICAgTW9kZU5vID0gcFZCSW5mby0+RU1vZGVJRFRhYmxlWyBNb2RlSWRJbmRleCBdLkV4dF9Nb2RlSUQ7CiAgICAgICAgIGlmICggcFZCSW5mby0+RU1vZGVJRFRhYmxlWyBNb2RlSWRJbmRleCBdLkV4dF9Nb2RlSUQgPT0gMHhGRiApCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBCaW9zQXJndW1lbnRzLT5oLmJoID0gKFVDSEFSKSBFTW9kZUNvdW50OworCSAgICBwQmlvc0FyZ3VtZW50cy0+aC5iaCA9ICh1bnNpZ25lZCBjaGFyKSBFTW9kZUNvdW50OwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmICggIVhHSV9YRzIxQ2hlY2tMVkRTTW9kZSggTW9kZU5vICwgTW9kZUlkSW5kZXgsIHBWQkluZm8pICkKQEAgLTExNzUsMTMgKzg1OSwxMyBAQAogOwogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotdm9pZCBYR0lfWEcyMUZ1bjE0U3ViNzEoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICwgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzICkKK3ZvaWQgWEdJX1hHMjFGdW4xNFN1YjcxKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzKQogewogCi0gICAgVVNIT1JUIEVNb2RlQ291bnQ7Ci0gICAgVVNIT1JUIE1vZGVJZEluZGV4LHJlc2luZGV4OwotICAgIFVTSE9SVCBNb2RlTm87Ci0gICAgVVNIT1JUIEVNb2RlSW5kZXggPSBwQmlvc0FyZ3VtZW50cy0+aC5iaDsKKyAgICB1bnNpZ25lZCBzaG9ydCBFTW9kZUNvdW50OworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCByZXNpbmRleDsKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm87CisgICAgdW5zaWduZWQgc2hvcnQgRU1vZGVJbmRleCA9IHBCaW9zQXJndW1lbnRzLT5oLmJoOwogCiAgICAgRU1vZGVDb3VudCA9IDA7CiAgICAgZm9yKCBNb2RlSWRJbmRleCA9IDAgOyA7ICBNb2RlSWRJbmRleCArKyApCkBAIC0xMTk5LDcgKzg4Myw3IEBACiAgICAgICAgIGlmIChFTW9kZUNvdW50ID09IEVNb2RlSW5kZXgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlc2luZGV4ID0gWEdJX0dldFJlc0luZm8oIE1vZGVObyAsIE1vZGVJZEluZGV4LCBwVkJJbmZvICkgOwotICAgICAgICAgICAgcEJpb3NBcmd1bWVudHMtPmguYmwgPSAoVUNIQVIpIE1vZGVObzsKKwkgICAgcEJpb3NBcmd1bWVudHMtPmguYmwgPSAodW5zaWduZWQgY2hhcikgTW9kZU5vOwogICAgICAgICAgICAgcEJpb3NBcmd1bWVudHMtPnguY3ggPSBwVkJJbmZvLT5Nb2RlUmVzSW5mb1sgcmVzaW5kZXggXS5IVG90YWwgOwkJCSAgLyogeHJlcy0+YXggKi8KICAgICAgICAgICAgIHBCaW9zQXJndW1lbnRzLT54LmR4ID0gcFZCSW5mby0+TW9kZVJlc0luZm9bIHJlc2luZGV4IF0uVlRvdGFsIDsJCQkgIC8qIHlyZXMtPmJ4ICovCiAgICAgICAgICAgICBwQmlvc0FyZ3VtZW50cy0+eC5heCA9IDB4MDAxNDsKQEAgLTEyMjEsMTAgKzkwNSwxMCBAQAogOwogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotdm9pZCBYR0lfWEcyMUZ1bjE0U3ViNzIoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICwgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzICkKK3ZvaWQgWEdJX1hHMjFGdW4xNFN1YjcyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzKQogewotICAgIFVTSE9SVCBNb2RlSWRJbmRleCxyZXNpbmRleDsKLSAgICBVU0hPUlQgTW9kZU5vOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCByZXNpbmRleDsKKyAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm87CiAKIAogICAgIE1vZGVObyA9IHBCaW9zQXJndW1lbnRzLT5oLmJsIDsKQEAgLTEyODAsMTEgKzk2NCwxMSBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgQlhbNl06ICpWYWx1ZTEgRFs2XSBQYW5lbCBILiBQb2xhcml0eQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotdm9pZCBYR0lfWEcyMUZ1bjE0U3ViNzMoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICwgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzICkKK3ZvaWQgWEdJX1hHMjFGdW4xNFN1YjczKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzKQogewotICAgIFVDSEFSIFNlbGVjdDsKKyAgICB1bnNpZ25lZCBjaGFyIFNlbGVjdDsKIAotICAgIFVTSE9SVCBsdmRzdGFibGVpbmRleDsKKyAgICB1bnNpZ25lZCBzaG9ydCBsdmRzdGFibGVpbmRleDsKIAogICAgIGx2ZHN0YWJsZWluZGV4ID0gWEdJX0dldExWRFNPRU1UYWJsZUluZGV4KCBwVkJJbmZvICk7CiAgICAgU2VsZWN0ID0gcEJpb3NBcmd1bWVudHMtPmguYmw7CkBAIC0xMzE0LDEwICs5OTgsMTAgQEAKIH0KIAogCi12b2lkIFhHSV9YRzIxRnVuMTQoIFBYR0lfSFdfREVWSUNFX0lORk8gcFhHSUhXREUsIFBYODZfUkVHUyBwQmlvc0FyZ3VtZW50cykKK3ZvaWQgWEdJX1hHMjFGdW4xNChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpwWEdJSFdERSwgUFg4Nl9SRUdTIHBCaW9zQXJndW1lbnRzKQogewotICAgIFZCX0RFVklDRV9JTkZPIFZCSU5GOwotICAgIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvID0gJlZCSU5GOworICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyBWQklORjsKKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8gPSAmVkJJTkY7CiAKICAgICBwVkJJbmZvLT5JRl9ERUZfTFZEUyA9IDAgOwogICAgIHBWQkluZm8tPklGX0RFRl9DSDcwMDUgPSAwIDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9leHQuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9leHQuaAppbmRleCA5YTcyZjVlLi41Y2M0ZDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfZXh0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2V4dC5oCkBAIC0yLDE1ICsyLDE3IEBACiAjZGVmaW5lICBfVkJFWFRfCiAKIHN0cnVjdCBEV09SRFJFR1MgewotICAgIFVMT05HICAgIEVheCwgRWJ4LCBFY3gsIEVkeCwgRXNpLCBFZGksIEVicDsKKyAgICB1bnNpZ25lZCBsb25nICAgIEVheCwgRWJ4LCBFY3gsIEVkeCwgRXNpLCBFZGksIEVicDsKIH07CiAKIHN0cnVjdCBXT1JEUkVHUyB7Ci0gICAgVVNIT1JUICAgIGF4LCBoaV9heCwgYngsIGhpX2J4LCBjeCwgaGlfY3gsIGR4LCBoaV9keCwgc2ksIGhpX3NpLCBkaSAsaGlfZGksIGJwLCBoaV9icDsKKyAgICB1bnNpZ25lZCBzaG9ydCBheCwgaGlfYXgsIGJ4LCBoaV9ieCwgY3gsIGhpX2N4LCBkeCwgaGlfZHgsIHNpLAorCSAgICBoaV9zaSwgZGksIGhpX2RpLCBicCwgaGlfYnA7CiB9OwogCiBzdHJ1Y3QgQllURVJFR1MgewotICAgIFVDSEFSICAgYWwsIGFoLCBoaV9hbCwgaGlfYWgsIGJsLCBiaCwgaGlfYmwsIGhpX2JoLCBjbCwgY2gsIGhpX2NsLCBoaV9jaCwgZGwsIGRoLCBoaV9kbCwgaGlfZGg7CisgICAgIHVuc2lnbmVkIGNoYXIgYWwsIGFoLCBoaV9hbCwgaGlfYWgsIGJsLCBiaCwgaGlfYmwsIGhpX2JoLCBjbCwgY2gsCisJICAgICBoaV9jbCwgaGlfY2gsIGRsLCBkaCwgaGlfZGwsIGhpX2RoOwogfTsKIAogdHlwZWRlZiB1bmlvbiAgIF9YODZfUkVHUyAgICB7CkBAIC0xOSwxNCArMjEsMTQgQEAKICAgICBzdHJ1Y3QgIEJZVEVSRUdTIGg7CiB9IFg4Nl9SRUdTLCAqUFg4Nl9SRUdTOwogCi1leHRlcm4gICB2b2lkICAgICBYR0lfWEcyMUZ1bjE0KCBQWEdJX0hXX0RFVklDRV9JTkZPIHBYR0lIV0RFLCBQWDg2X1JFR1MgcEJpb3NBcmd1bWVudHMpOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJU2V0RFBNUyggUFhHSV9IV19ERVZJQ0VfSU5GTyBwWEdJSFdERSAsIFVMT05HIFZFU0FfUE9XRVJfU1RBVEUgKSA7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfR2V0U2Vuc2VTdGF0dXMoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJTmV3X1NldE1vZGVTY3JhdGNoICggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkgOwotZXh0ZXJuICAgdm9pZCAJICBSZWFkVkJJT1NUYWJsRGF0YSggVUNIQVIgQ2hpcFR5cGUgLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1leHRlcm4gICBVU0hPUlQgICBYR0lOZXdfU2Vuc2VMQ0QoUFhHSV9IV19ERVZJQ0VfSU5GTyxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci0jaWZkZWYgV0lOMjAwMAotZXh0ZXJuICAgQk9PTEVBTiAgWEdJX0R5U2Vuc2UoIFBIV19ERVZJQ0VfRVhURU5TSU9OIHBIV0RFICwgUFVDSEFSIHVqQ29ubmVjdFN0YXR1cyApOwotI2VuZGlmIC8qIFdJTjIwMDAgKi8KK2V4dGVybiAgIHZvaWQgICAgIFhHSV9YRzIxRnVuMTQoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsIFBYODZfUkVHUyBwQmlvc0FyZ3VtZW50cyk7CitleHRlcm4gdm9pZCBYR0lTZXREUE1TKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKnBYR0lIV0RFLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBWRVNBX1BPV0VSX1NUQVRFKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9HZXRTZW5zZVN0YXR1cyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSU5ld19TZXRNb2RlU2NyYXRjaChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKSA7CitleHRlcm4gdm9pZCBSZWFkVkJJT1NUYWJsRGF0YSh1bnNpZ25lZCBjaGFyIENoaXBUeXBlLAorCQkJICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBYR0lOZXdfU2Vuc2VMQ0Qoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqLAorCQkJCSAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9pbml0LmMKaW5kZXggYjg1Y2E5Yi4uZTAyNzIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfaW5pdC5jCkBAIC0xLDI5ICsxLDkgQEAKLSNpbmNsdWRlICJvc2RlZi5oIgogI2luY2x1ZGUgInZnYXR5cGVzLmgiCiAKLQotI2lmZGVmIExJTlVYX0tFUk5FTAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+IC8qIHVkZWxheSAqLwogI2luY2x1ZGUgIlhHSWZiLmgiCi0vKiNpZiBMSU5VWF9WRVJTeElPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2luY2x1ZGUgPHZpZGVvL1hHSWZiLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGxpbnV4L1hHSWZiLmg+Ci0jZW5kaWYgKi8KLSNlbmRpZgotCi0jaWZkZWYgV0lOMjAwMAotI2luY2x1ZGUgPGRkZXJyb3IuaD4KLSNpbmNsdWRlIDxkZXZpb2N0bC5oPgotI2luY2x1ZGUgPG1pbmlwb3J0Lmg+Ci0jaW5jbHVkZSA8bnRkZHZkZW8uaD4KLSNpbmNsdWRlIDx2aWRlby5oPgotI2luY2x1ZGUgInhnaXYuaCIKLSNpbmNsdWRlICJkZF9pMmMuaCIKLSNpbmNsdWRlICJ0b29scy5oIgotI2VuZGlmCiAKICNpbmNsdWRlICJ2Yl9kZWYuaCIKICNpbmNsdWRlICJ2Yl9zdHJ1Y3QuaCIKQEAgLTMyLDEyMyArMTIsMTA1IEBACiAjaW5jbHVkZSAidmJfaW5pdC5oIgogI2luY2x1ZGUgInZiX2V4dC5oIgogCi0jaWZkZWYgTElOVVhfWEY4NgotI2luY2x1ZGUgInhmODYuaCIKLSNpbmNsdWRlICJ4Zjg2UGNpSW5mby5oIgotI2luY2x1ZGUgInhnaS5oIgotI2luY2x1ZGUgInhnaV9yZWdzLmgiCi0jZW5kaWYKIAotI2lmZGVmIExJTlVYX0tFUk5FTAogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jZW5kaWYKIAogCiAKIAotVUNIQVIgICAgWEdJTmV3X0NoYW5uZWxBQixYR0lOZXdfRGF0YUJ1c1dpZHRoOwordW5zaWduZWQgY2hhciBYR0lOZXdfQ2hhbm5lbEFCLCBYR0lOZXdfRGF0YUJ1c1dpZHRoOwogCi1VU0hPUlQgWEdJTmV3X0RSQU1UeXBlWzE3XVs1XT17ezB4MEMsMHgwQSwweDAyLDB4NDAsMHgzOX0sezB4MEQsMHgwQSwweDAxLDB4NDAsMHg0OH0sCi0gICAgICAgICAgICAgICAgICAgICB7MHgwQywweDA5LDB4MDIsMHgyMCwweDM1fSx7MHgwRCwweDA5LDB4MDEsMHgyMCwweDQ0fSwKLSAgICAgICAgICAgICAgICAgICAgIHsweDBDLDB4MDgsMHgwMiwweDEwLDB4MzF9LHsweDBELDB4MDgsMHgwMSwweDEwLDB4NDB9LAotICAgICAgICAgICAgICAgICAgICAgezB4MEMsMHgwQSwweDAxLDB4MjAsMHgzNH0sezB4MEMsMHgwOSwweDAxLDB4MDgsMHgzMn0sCi0gICAgICAgICAgICAgICAgICAgICB7MHgwQiwweDA4LDB4MDIsMHgwOCwweDIxfSx7MHgwQywweDA4LDB4MDEsMHgwOCwweDMwfSwKLSAgICAgICAgICAgICAgICAgICAgIHsweDBBLDB4MDgsMHgwMiwweDA0LDB4MTF9LHsweDBCLDB4MEEsMHgwMSwweDEwLDB4Mjh9LAotICAgICAgICAgICAgICAgICAgICAgezB4MDksMHgwOCwweDAyLDB4MDIsMHgwMX0sezB4MEIsMHgwOSwweDAxLDB4MDgsMHgyNH0sCi0gICAgICAgICAgICAgICAgICAgICB7MHgwQiwweDA4LDB4MDEsMHgwNCwweDIwfSx7MHgwQSwweDA4LDB4MDEsMHgwMiwweDEwfSwKLSAgICAgICAgICAgICAgICAgICAgIHsweDA5LDB4MDgsMHgwMSwweDAxLDB4MDB9fTsKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19EUkFNVHlwZVsxN11bNV0gPSB7CisJezB4MEMsIDB4MEEsIDB4MDIsIDB4NDAsIDB4Mzl9LCB7MHgwRCwgMHgwQSwgMHgwMSwgMHg0MCwgMHg0OH0sCisJezB4MEMsIDB4MDksIDB4MDIsIDB4MjAsIDB4MzV9LCB7MHgwRCwgMHgwOSwgMHgwMSwgMHgyMCwgMHg0NH0sCisJezB4MEMsIDB4MDgsIDB4MDIsIDB4MTAsIDB4MzF9LCB7MHgwRCwgMHgwOCwgMHgwMSwgMHgxMCwgMHg0MH0sCisJezB4MEMsIDB4MEEsIDB4MDEsIDB4MjAsIDB4MzR9LCB7MHgwQywgMHgwOSwgMHgwMSwgMHgwOCwgMHgzMn0sCisJezB4MEIsIDB4MDgsIDB4MDIsIDB4MDgsIDB4MjF9LCB7MHgwQywgMHgwOCwgMHgwMSwgMHgwOCwgMHgzMH0sCisJezB4MEEsIDB4MDgsIDB4MDIsIDB4MDQsIDB4MTF9LCB7MHgwQiwgMHgwQSwgMHgwMSwgMHgxMCwgMHgyOH0sCisJezB4MDksIDB4MDgsIDB4MDIsIDB4MDIsIDB4MDF9LCB7MHgwQiwgMHgwOSwgMHgwMSwgMHgwOCwgMHgyNH0sCisJezB4MEIsIDB4MDgsIDB4MDEsIDB4MDQsIDB4MjB9LCB7MHgwQSwgMHgwOCwgMHgwMSwgMHgwMiwgMHgxMH0sCisJezB4MDksIDB4MDgsIDB4MDEsIDB4MDEsIDB4MDB9IH07CiAKLVVTSE9SVCBYR0lOZXdfU0RSRFJBTV9UWVBFWzEzXVs1XT0KLXsKLXsgMiwxMiwgOSw2NCwweDM1fSwKLXsgMSwxMywgOSw2NCwweDQ0fSwKLXsgMiwxMiwgOCwzMiwweDMxfSwKLXsgMiwxMSwgOSwzMiwweDI1fSwKLXsgMSwxMiwgOSwzMiwweDM0fSwKLXsgMSwxMywgOCwzMiwweDQwfSwKLXsgMiwxMSwgOCwxNiwweDIxfSwKLXsgMSwxMiwgOCwxNiwweDMwfSwKLXsgMSwxMSwgOSwxNiwweDI0fSwKLXsgMSwxMSwgOCwgOCwweDIwfSwKLXsgMiwgOSwgOCwgNCwweDAxfSwKLXsgMSwxMCwgOCwgNCwweDEwfSwKLXsgMSwgOSwgOCwgMiwweDAwfQotfTsKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19TRFJEUkFNX1RZUEVbMTNdWzVdID0geworCXsgMiwgMTIsIDksIDY0LCAweDM1fSwKKwl7IDEsIDEzLCA5LCA2NCwgMHg0NH0sCisJeyAyLCAxMiwgOCwgMzIsIDB4MzF9LAorCXsgMiwgMTEsIDksIDMyLCAweDI1fSwKKwl7IDEsIDEyLCA5LCAzMiwgMHgzNH0sCisJeyAxLCAxMywgOCwgMzIsIDB4NDB9LAorCXsgMiwgMTEsIDgsIDE2LCAweDIxfSwKKwl7IDEsIDEyLCA4LCAxNiwgMHgzMH0sCisJeyAxLCAxMSwgOSwgMTYsIDB4MjR9LAorCXsgMSwgMTEsIDgsICA4LCAweDIwfSwKKwl7IDIsICA5LCA4LCAgNCwgMHgwMX0sCisJeyAxLCAxMCwgOCwgIDQsIDB4MTB9LAorCXsgMSwgIDksIDgsICAyLCAweDAwfSB9OwogCi1VU0hPUlQgWEdJTmV3X0REUkRSQU1fVFlQRVs0XVs1XT0KLXsKLXsgMiwxMiwgOSw2NCwweDM1fSwKLXsgMiwxMiwgOCwzMiwweDMxfSwKLXsgMiwxMSwgOCwxNiwweDIxfSwKLXsgMiwgOSwgOCwgNCwweDAxfQotfTsKLVVTSE9SVCBYR0lOZXdfRERSRFJBTV9UWVBFMzQwWzRdWzVdPQotewoteyAyLDEzLCA5LDY0LDB4NDV9LAoteyAyLDEyLCA5LDMyLDB4MzV9LAoteyAyLDEyLCA4LDE2LDB4MzF9LAoteyAyLDExLCA4LCA4LDB4MjF9Ci19OwotVVNIT1JUIFhHSU5ld19ERFJEUkFNX1RZUEUyMFsxMl1bNV09Ci17Ci17IDIsMTQsMTEsMTI4LDB4NUR9LAoteyAyLDE0LDEwLDY0LDB4NTl9LAoteyAyLDEzLDExLDY0LDB4NER9LAoteyAyLDE0LCA5LDMyLDB4NTV9LAoteyAyLDEzLDEwLDMyLDB4NDl9LAoteyAyLDEyLDExLDMyLDB4M0R9LAoteyAyLDE0LCA4LDE2LDB4NTF9LAoteyAyLDEzLCA5LDE2LDB4NDV9LAoteyAyLDEyLDEwLDE2LDB4Mzl9LAoteyAyLDEzLCA4LCA4LDB4NDF9LAoteyAyLDEyLCA5LCA4LDB4MzV9LAoteyAyLDEyLCA4LCA0LDB4MzF9Ci19OwordW5zaWduZWQgc2hvcnQgWEdJTmV3X0REUkRSQU1fVFlQRVs0XVs1XSA9IHsKKwl7IDIsIDEyLCA5LCA2NCwgMHgzNX0sCisJeyAyLCAxMiwgOCwgMzIsIDB4MzF9LAorCXsgMiwgMTEsIDgsIDE2LCAweDIxfSwKKwl7IDIsICA5LCA4LCAgNCwgMHgwMX0gfTsKIAotdm9pZCAgICAgWEdJTmV3X1NldERSQU1TaXplXzM0MChQWEdJX0hXX0RFVklDRV9JTkZPLCBQVkJfREVWSUNFX0lORk8pOwotdm9pZCAgICAgWEdJTmV3X1NldERSQU1TaXplXzMxMChQWEdJX0hXX0RFVklDRV9JTkZPLCBQVkJfREVWSUNFX0lORk8pOwotdm9pZCAgICAgWEdJTmV3X1NldE1lbW9yeUNsb2NrKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyApOwotdm9pZCAgICAgWEdJTmV3X1NldERSQU1Nb2RlUmVnaXN0ZXIoUFZCX0RFVklDRV9JTkZPICk7Ci12b2lkICAgICBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3RlcjM0MCggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApOwotdm9pZCAJIFhHSU5ld19TZXREUkFNRGVmYXVsdFJlZ2lzdGVyMzQwKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFVMT05HLCBQVkJfREVWSUNFX0lORk8gKTsKLVVDSEFSICAgIFhHSU5ld19HZXRYRzIwRFJBTVR5cGUoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1CT09MRUFOICBYR0lJbml0TmV3KCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uKSA7Cit1bnNpZ25lZCBzaG9ydCBYR0lOZXdfRERSRFJBTV9UWVBFMzQwWzRdWzVdID0geworCXsgMiwgMTMsIDksIDY0LCAweDQ1fSwKKwl7IDIsIDEyLCA5LCAzMiwgMHgzNX0sCisJeyAyLCAxMiwgOCwgMTYsIDB4MzF9LAorCXsgMiwgMTEsIDgsICA4LCAweDIxfSB9OwogCi1pbnQgICAgICBYR0lOZXdfRERSU2l6aW5nMzQwKCBQWEdJX0hXX0RFVklDRV9JTkZPLCBQVkJfREVWSUNFX0lORk8gKTsKLXZvaWQgICAgIFhHSU5ld19EaXNhYmxlUmVmcmVzaCggUFhHSV9IV19ERVZJQ0VfSU5GTyAsUFZCX0RFVklDRV9JTkZPKSA7Ci12b2lkICAgICBYR0lOZXdfQ2hlY2tCdXNXaWR0aF8zMTAoIFBWQl9ERVZJQ0VfSU5GTykgOwotaW50ICAgICAgWEdJTmV3X1NEUlNpemluZyhQVkJfREVWSUNFX0lORk8pOwotaW50ICAgICAgWEdJTmV3X0REUlNpemluZyggUFZCX0RFVklDRV9JTkZPICk7Ci12b2lkICAgICBYR0lOZXdfRW5hYmxlUmVmcmVzaCggUFhHSV9IV19ERVZJQ0VfSU5GTywgUFZCX0RFVklDRV9JTkZPKTsKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19ERFJEUkFNX1RZUEUyMFsxMl1bNV0gPSB7CisJeyAyLCAxNCwgMTEsIDEyOCwgMHg1RH0sCisJeyAyLCAxNCwgMTAsIDY0LCAweDU5fSwKKwl7IDIsIDEzLCAxMSwgNjQsIDB4NER9LAorCXsgMiwgMTQsICA5LCAzMiwgMHg1NX0sCisJeyAyLCAxMywgMTAsIDMyLCAweDQ5fSwKKwl7IDIsIDEyLCAxMSwgMzIsIDB4M0R9LAorCXsgMiwgMTQsICA4LCAxNiwgMHg1MX0sCisJeyAyLCAxMywgIDksIDE2LCAweDQ1fSwKKwl7IDIsIDEyLCAxMCwgMTYsIDB4Mzl9LAorCXsgMiwgMTMsICA4LCAgOCwgMHg0MX0sCisJeyAyLCAxMiwgIDksICA4LCAweDM1fSwKKwl7IDIsIDEyLCAgOCwgIDQsIDB4MzF9IH07CisKK3ZvaWQgICAgIFhHSU5ld19TZXREUkFNU2l6ZV8zNDAoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7Cit2b2lkICAgICBYR0lOZXdfU2V0RFJBTVNpemVfMzEwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOwordm9pZCAgICAgWEdJTmV3X1NldE1lbW9yeUNsb2NrKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7Cit2b2lkICAgICBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3RlcihzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7Cit2b2lkICAgICBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3RlcjM0MChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbik7Cit2b2lkIFhHSU5ld19TZXREUkFNRGVmYXVsdFJlZ2lzdGVyMzQwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK3Vuc2lnbmVkIGNoYXIgWEdJTmV3X0dldFhHMjBEUkFNVHlwZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCQkgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyIFhHSUluaXROZXcoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24pOworCitpbnQgICAgICBYR0lOZXdfRERSU2l6aW5nMzQwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOwordm9pZCAgICAgWEdJTmV3X0Rpc2FibGVSZWZyZXNoKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopIDsKK3ZvaWQgICAgIFhHSU5ld19DaGVja0J1c1dpZHRoXzMxMChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKikgOworaW50ICAgICAgWEdJTmV3X1NEUlNpemluZyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CitpbnQgICAgICBYR0lOZXdfRERSU2l6aW5nKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK3ZvaWQgICAgIFhHSU5ld19FbmFibGVSZWZyZXNoKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOwogaW50ICAgICAgWEdJTmV3X1JBTVR5cGU7ICAgICAgICAgICAgICAgICAgLyppbnQgICAgICBNb2RlSURPZmZzZXQsU3RhbmRUYWJsZSxDUlQxVGFibGUsU2NyZWVuT2Zmc2V0LFJFRkluZGV4OyovCi1VTE9ORwkgVU5JUk9NOwkJCSAgLyogVU5JUk9NICovCi1CT09MRUFOICBDaGtMRkIoIFBWQl9ERVZJQ0VfSU5GTyApOwotdm9pZCAgICAgWEdJTmV3X0RlbGF5MTV1cyhVTE9ORyk7Ci12b2lkICAgICBTZXRQb3dlckNvbnN1bWUgKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sVUxPTkcgWEdJX1AzZDRQb3J0KTsKLXZvaWQgCSBSZWFkVkJJT1NUYWJsRGF0YSggVUNIQVIgQ2hpcFR5cGUgLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkIAkgWEdJTmV3X0REUjF4X01SU19YRzIwKCBVTE9ORyBQM2M0ICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJTmV3X1NldERSQU1Nb2RlUmVnaXN0ZXJfWEcyMCggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApOwotdm9pZCAgICAgWEdJTmV3X1NldERSQU1Nb2RlUmVnaXN0ZXJfWEcyNyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApOwotdm9pZCAJIFhHSU5ld19DaGtTZW5zZVN0YXR1cyAoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApIDsKLXZvaWQgICAgIFhHSU5ld19TZXRNb2RlU2NyYXRjaCAoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApIDsKLXZvaWQgICAgIFhHSU5ld19HZXRYRzIxU2Vuc2UoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pIDsKLVVDSEFSICAgIEdldFhHMjFGUEJpdHMoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJTmV3X0dldFhHMjdTZW5zZShQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykgOwotVUNIQVIgICAgR2V0WEcyN0ZQQml0cyhQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Cit1bnNpZ25lZCBsb25nCSBVTklST007CQkJICAvKiBVTklST00gKi8KK3Vuc2lnbmVkIGNoYXIgIENoa0xGQihzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7Cit2b2lkICAgICBYR0lOZXdfRGVsYXkxNXVzKHVuc2lnbmVkIGxvbmcpOwordm9pZCAgICAgU2V0UG93ZXJDb25zdW1lKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJIHVuc2lnbmVkIGxvbmcgWEdJX1AzZDRQb3J0KTsKK3ZvaWQgICAgIFJlYWRWQklPU1RhYmxEYXRhKHVuc2lnbmVkIGNoYXIgQ2hpcFR5cGUsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lOZXdfRERSMXhfTVJTX1hHMjAodW5zaWduZWQgbG9uZyBQM2M0LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJTmV3X1NldERSQU1Nb2RlUmVnaXN0ZXJfWEcyMChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbik7Cit2b2lkICAgICBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3Rlcl9YRzI3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uKTsKK3ZvaWQgICAgIFhHSU5ld19DaGtTZW5zZVN0YXR1cyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKSA7Cit2b2lkICAgICBYR0lOZXdfU2V0TW9kZVNjcmF0Y2goc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykgOwordm9pZCAgICAgWEdJTmV3X0dldFhHMjFTZW5zZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKSA7Cit1bnNpZ25lZCBjaGFyICAgIEdldFhHMjFGUEJpdHMoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSU5ld19HZXRYRzI3U2Vuc2Uoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykgOwordW5zaWduZWQgY2hhciAgICBHZXRYRzI3RlBCaXRzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CiAKLSNpZmRlZiBXSU4yMDAwCi0vKiBbQmlsbHldIDIwMDcvMDUvMjAgRm9yIENINzAwNyAqLwotZXh0ZXJuICBVQ0hBUiBDSDcwMDdUVlJlZ19VTlRTQ1tdWzhdLENINzAwN1RWUmVnX09OVFNDW11bOF0sQ0g3MDA3VFZSZWdfVVBBTFtdWzhdLENINzAwN1RWUmVnX09QQUxbXVs4XTsKLWV4dGVybiAgVUNIQVIgWEdJNzAwN19DSFRWVkNMS1VOVFNDW10sWEdJNzAwN19DSFRWVkNMS09OVFNDW10sWEdJNzAwN19DSFRWVkNMS1VQQUxbXSxYR0k3MDA3X0NIVFZWQ0xLT1BBTFtdOwotI2VuZGlmCi0KLSNpZmRlZiBMSU5VWF9LRVJORUwKLXZvaWQgRGVsYXlVUyhVTE9ORyBNaWNyb1NlY29uZHMpCit2b2lkIERlbGF5VVModW5zaWduZWQgbG9uZyBNaWNyb1NlY29uZHMpCiB7CiAJdWRlbGF5KE1pY3JvU2Vjb25kcyk7CiB9Ci0jZW5kaWYKKwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIEZ1bmN0aW9uIDogWEdJSW5pdE5ldyAqLwpAQCAtMTU2LDQ2ICsxMTgsNDQgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUJPT0xFQU4gWEdJSW5pdE5ldyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApCit1bnNpZ25lZCBjaGFyIFhHSUluaXROZXcoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24pCiB7CiAKLSAgICBWQl9ERVZJQ0VfSU5GTyBWQklORjsKLSAgICBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyA9ICZWQklORjsKLSAgICBVQ0hBUiAgIGkgLCB0ZW1wID0gMCAsIHRlbXAxIDsKKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gVkJJTkY7CisgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvID0gJlZCSU5GOworICAgIHVuc2lnbmVkIGNoYXIgICBpLCB0ZW1wID0gMCwgdGVtcDEgOwogICAgICAvLyAgICAgICBWQklPU1ZlcnNpb25bIDUgXSA7Ci0gICAgUFVDSEFSICB2b2xhdGlsZSBwVmlkZW9NZW1vcnk7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcFZpZGVvTWVtb3J5OwogCi0gICAgLyogVUxPTkcgaiwgayA7ICovCisgICAgLyogdW5zaWduZWQgbG9uZyBqLCBrIDsgKi8KIAotICAgIFBYR0lfRFNSZWcgcFNSIDsKKyAgICBzdHJ1Y3QgWEdJX0RTUmVnICpwU1IgOwogCi0gICAgVUxPTkcgVGVtcCA7CisgICAgdW5zaWduZWQgbG9uZyBUZW1wIDsKIAogICAgIHBWQkluZm8tPlJPTUFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaXJ0dWFsUm9tQmFzZSA7CiAKICAgICBwVkJJbmZvLT5GQkFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaWRlb01lbW9yeUFkZHJlc3MgOwogCi0gICAgcFZCSW5mby0+QmFzZUFkZHIgPSAoVUxPTkcpSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKKyAgICBwVkJJbmZvLT5CYXNlQWRkciA9ICh1bnNpZ25lZCBsb25nKUh3RGV2aWNlRXh0ZW5zaW9uLT5waklPQWRkcmVzcyA7CiAKLSAgICBwVmlkZW9NZW1vcnkgPSAoIFBVQ0hBUiApcFZCSW5mby0+Uk9NQWRkcjsKKyAgICBwVmlkZW9NZW1vcnkgPSAodW5zaWduZWQgY2hhciAqKXBWQkluZm8tPlJPTUFkZHI7CiAKIAogLy8gICAgTmV3ZGVidWdjb2RlKCAweDk5ICkgOwogCiAKICAgIC8qIGlmICggcFZCSW5mby0+Uk9NQWRkciA9PSAwICkgKi8KLSAgIC8qIHJldHVybiggRkFMU0UgKSA7ICovCisgICAvKiByZXR1cm4oIDAgKSA7ICovCiAKLSAgICBpZiAoIHBWQkluZm8tPkZCQWRkciA9PSAwICkKLXsKKyAgICBpZiAocFZCSW5mby0+RkJBZGRyID09IDApIHsKICAgICAgICBwcmludGsoIlxuIHBWQkluZm8tPkZCQWRkciA9PSAwICIpOwotICAgICAgIHJldHVybiggRkFMU0UgKSA7Ci19CisgICAgICAgcmV0dXJuIDA7CisgICAgfQogcHJpbnRrKCIxIik7Ci0gICAgaWYgKCBwVkJJbmZvLT5CYXNlQWRkciA9PSAwICkKLXsKLSAgICAgICBwcmludGsoIlxucFZCSW5mby0+QmFzZUFkZHIgPT0gMCAiKTsKLSAgICAgICAgcmV0dXJuKCBGQUxTRSApIDsKK2lmIChwVkJJbmZvLT5CYXNlQWRkciA9PSAwKSB7CisJcHJpbnRrKCJcbnBWQkluZm8tPkJhc2VBZGRyID09IDAgIik7CisJcmV0dXJuIDA7CiB9CiBwcmludGsoIjIiKTsKIApAQCAtMjA1LDEyICsxNjUsOSBAQAogcHJpbnRrKCIzIik7CiAKIGlmICggIUh3RGV2aWNlRXh0ZW5zaW9uLT5iSW50ZWdyYXRlZE1NRW5hYmxlZCApCi17Ci0gICAgICAgIHJldHVybiggRkFMU0UgKSA7CS8qIGFsYW4gKi8KLX0KLXByaW50aygiNCIpOworCXJldHVybiAwOwkvKiBhbGFuICovCiAKLS8vICAgIFhHSV9NZW1vcnlDb3B5KCBWQklPU1ZlcnNpb24gLCBId0RldmljZUV4dGVuc2lvbi0+c3pWQklPU1ZlciAsIDQgKSA7CitwcmludGsoIjQiKTsKIAogIC8vICAgVkJJT1NWZXJzaW9uWyA0IF0gPSAweDAgOwogCkBAIC00MDcsOCArMzY0LDggQEAKICAgICBYR0lfVW5Mb2NrQ1JUMiggSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8pIDsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlBhcnQwUG9ydCAsIDB4M0YgLCAweEVGICwgMHgwMCApIDsJLyogYWxhbiwgZGlzYWJsZSBWaWRlb0NhcHR1cmUgKi8KICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgwMCAsIDB4MDAgKSA7Ci0gICAgdGVtcDEgPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4N0IgKSA7CQkvKiBjaGsgaWYgQkNMSz49MTAwTUh6ICovCi0gICAgdGVtcCA9ICggVUNIQVIgKSggKCB0ZW1wMSA+PiA0ICkgJiAweDBGICkgOworICAgIHRlbXAxID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHg3Qik7CS8qIGNoayBpZiBCQ0xLPj0xMDBNSHogKi8KKyAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpKCh0ZW1wMSA+PiA0KSAmIDB4MEYpOwogCiAKICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MDIgLCAoICpwVkJJbmZvLT5wQ1JUMkRhdGFfMV8yICkgKSA7CkBAIC00NjAsMTUgKzQxNywxNCBAQAogICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4ODMgLCAweDAwICkgOwogcHJpbnRrKCIxODEiKTsKIAotICAgIGlmICggSHdEZXZpY2VFeHRlbnNpb24tPmJTa2lwU2Vuc2UgPT0gRkFMU0UgKQotICAgIHsKLXByaW50aygiMTgyIik7CitpZiAoSHdEZXZpY2VFeHRlbnNpb24tPmJTa2lwU2Vuc2UgPT0gMCkgeworCXByaW50aygiMTgyIik7CiAKICAgICAgICAgWEdJX1NlbnNlQ1JUMShwVkJJbmZvKSA7CiAKLXByaW50aygiMTgzIik7CisJcHJpbnRrKCIxODMiKTsKICAgICAgICAgLyogWEdJTmV3X0RldGVjdE1vbml0b3IoIEh3RGV2aWNlRXh0ZW5zaW9uICkgOyAqLwotcFZCSW5mby0+SUZfREVGX0NINzAwNyA9IDA7CisJcFZCSW5mby0+SUZfREVGX0NINzAwNyA9IDA7CiAgICAgICAgIGlmICggKCBId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHMjEgKSAmJiAocFZCSW5mby0+SUZfREVGX0NINzAwNykgKQogICAgICAgICB7CiBwcmludGsoIjE4NCIpOwpAQCAtNTA0LDggKzQ2MCw3IEBACiAKICAgICAgICAgWEdJTmV3X1NldERSQU1EZWZhdWx0UmVnaXN0ZXIzNDAoIEh3RGV2aWNlRXh0ZW5zaW9uICwgIHBWQkluZm8tPlAzZDQsICBwVkJJbmZvICkgOwogCi0gICAgICAgIGlmICggSHdEZXZpY2VFeHRlbnNpb24tPmJTa2lwRHJhbVNpemluZyA9PSBUUlVFICkKLSAgICAgICAgeworCWlmIChId0RldmljZUV4dGVuc2lvbi0+YlNraXBEcmFtU2l6aW5nID09IDEpIHsKICAgICAgICAgICAgIHBTUiA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5wU1IgOwogICAgICAgICAgICAgaWYgKCBwU1IhPU5VTEwgKQogICAgICAgICAgICAgewpAQCAtNTE5LDE1ICs0NzQsNiBAQAogICAgICAgICB9ICAgCS8qIFNraXBEcmFtU2l6aW5nICovCiAgICAgICAgIGVsc2UKICAgICAgICAgewotI2lmIDAKLSAgICAgICAgICAgaWYgKCBId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHMjAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCVhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxMyAsIHBWQkluZm8tPlNSMTVbMF1bWEdJTmV3X1JBTVR5cGVdICkgOwotICAgICAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxNCAsIHBWQkluZm8tPlNSMTVbMV1bWEdJTmV3X1JBTVR5cGVdICkgOwotICAgICAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgyMCAsIDB4MjAgKSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKIHsKIHByaW50aygiMjAiKTsKIApAQCAtNTQ0LDcgKzQ5MCw3IEBACiAgICAgLyogU2V0RGVmRXh0MlJlZ3MgYmVnaW4gKi8KIC8qCiAgICAgQUdQID0gMSA7Ci0gICAgdGVtcCA9KCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDNBICkgOworICAgIHRlbXAgPSh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4M0EpIDsKICAgICB0ZW1wICY9IDB4MzAgOwogICAgIGlmICggdGVtcCA9PSAweDMwICkKICAgICAgICAgQUdQID0gMCA7CkBAIC01NjMsNyArNTA5LDcgQEAKIC8vICAgIFRlbXAgPSAoIEluUG9ydExvbmcoIDB4Y2ZjICkgJiAweEZGRkYgKSA7CiAvLyAgICBpZiAoIFRlbXAgPT0gMHgxMDM5ICkKIC8vICAgIHsKLSAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDIyICwgKCBVQ0hBUiApKCAoICpwVkJJbmZvLT5wU1IyMiApICYgMHhGRSApICkgOworCVhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MjIsICh1bnNpZ25lZCBjaGFyKSgoKnBWQkluZm8tPnBTUjIyKSAmIDB4RkUpKTsKIC8vICAgIH0KIC8vICAgIGVsc2UKIC8vICAgIHsKQEAgLTU4NSw3ICs1MzEsNyBAQAogWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE0ICwgMHgzMSk7CiBwcmludGsoIjI1Iik7CiAKLSAgICByZXR1cm4oIFRSVUUgKSA7CityZXR1cm4gMTsKIH0gLyogZW5kIG9mIGluaXQgKi8KIAogCkBAIC02MDAsOSArNTQ2LDEwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VQ0hBUiBYR0lOZXdfR2V0WEcyMERSQU1UeXBlKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBjaGFyIFhHSU5ld19HZXRYRzIwRFJBTVR5cGUoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgZGF0YSwgdGVtcCA7CisgICAgdW5zaWduZWQgY2hhciBkYXRhLCB0ZW1wOwogCiAgICAgaWYgKCBId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlIDwgWEcyMCApCiAgICAgewpAQCAtNjcwLDkgKzYxNyw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VQ0hBUiBYR0lOZXdfR2V0MzEwRFJBTVR5cGUoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBjaGFyIFhHSU5ld19HZXQzMTBEUkFNVHlwZShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgZGF0YSA7CisgICAgdW5zaWduZWQgY2hhciBkYXRhIDsKIAogICAvKiBpbmRleCA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxQSApIDsgKi8KICAgLyogaW5kZXggJj0gMDcgOyAqLwpAQCAtNjk0LDcgKzY0MSw3IEBACiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCi12b2lkIFhHSU5ld19EZWxheTE1dXMoVUxPTkcgdWxNaWNyc29TZWMpCit2b2lkIFhHSU5ld19EZWxheTE1dXModW5zaWduZWQgbG9uZyB1bE1pY3Jzb1NlYykKIHsKIH0KICovCkBAIC03MDYsOSArNjUzLDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1NEUl9NUlMoICBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSU5ld19TRFJfTVJTKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZGF0YSA7CisgICAgdW5zaWduZWQgc2hvcnQgZGF0YSA7CiAKICAgICBkYXRhID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE2ICkgOwogICAgIGRhdGEgJj0gMHgzRiA7ICAgICAgICAgIC8qIFNSMTYgRDc9MCxENj0wICovCkBAIC03MjYsNyArNjczLDcgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0REUjF4X01SU18zNDAoIFVMT05HIFAzYzQgLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X0REUjF4X01SU18zNDAodW5zaWduZWQgbG9uZyBQM2M0LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgWEdJTmV3X1NldFJlZzEoIFAzYzQgLCAweDE4ICwgMHgwMSApIDsKICAgICBYR0lOZXdfU2V0UmVnMSggUDNjNCAsIDB4MTkgLCAweDIwICkgOwpAQCAtNzY0LDcgKzcxMSw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19ERFIyeF9NUlNfMzQwKCBVTE9ORyBQM2M0ICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19ERFIyeF9NUlNfMzQwKHVuc2lnbmVkIGxvbmcgUDNjNCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogICAgIFhHSU5ld19TZXRSZWcxKCBQM2M0ICwgMHgxOCAsIDB4MDAgKSA7CiAgICAgWEdJTmV3X1NldFJlZzEoIFAzYzQgLCAweDE5ICwgMHgyMCApIDsKQEAgLTc5Myw5ICs3NDAsMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0REUklJX0Jvb3R1cF9YRzI3KCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgIFVMT05HIFAzYzQgLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X0REUklJX0Jvb3R1cF9YRzI3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBQM2M0LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUxPTkcgUDNkNCA9IFAzYzQgKyAweDEwIDsKKyAgICB1bnNpZ25lZCBsb25nIFAzZDQgPSBQM2M0ICsgMHgxMCA7CiAgICAgWEdJTmV3X1JBTVR5cGUgPSAoIGludCApWEdJTmV3X0dldFhHMjBEUkFNVHlwZSggSHdEZXZpY2VFeHRlbnNpb24gLCBwVkJJbmZvICkgOwogICAgIFhHSU5ld19TZXRNZW1vcnlDbG9jayggSHdEZXZpY2VFeHRlbnNpb24gLCBwVkJJbmZvICkgOwogCkBAIC04NzEsOSArODE5LDEwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19ERFIyX01SU19YRzIwKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgIFVMT05HIFAzYzQgLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X0REUjJfTVJTX1hHMjAoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkgIHVuc2lnbmVkIGxvbmcgUDNjNCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVMT05HIFAzZDQgPSBQM2M0ICsgMHgxMCA7CisgICAgdW5zaWduZWQgbG9uZyBQM2Q0ID0gUDNjNCArIDB4MTAgOwogCiAgICAgWEdJTmV3X1JBTVR5cGUgPSAoIGludCApWEdJTmV3X0dldFhHMjBEUkFNVHlwZSggSHdEZXZpY2VFeHRlbnNpb24gLCBwVkJJbmZvICkgOwogICAgIFhHSU5ld19TZXRNZW1vcnlDbG9jayggSHdEZXZpY2VFeHRlbnNpb24gLCBwVkJJbmZvICkgOwpAQCAtOTIzLDkgKzg3MiwxMCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfRERSMl9NUlNfWEcyNyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsICBVTE9ORyBQM2M0ICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19ERFIyX01SU19YRzI3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJICB1bnNpZ25lZCBsb25nIFAzYzQsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVTE9ORyBQM2Q0ID0gUDNjNCArIDB4MTAgOworICAgIHVuc2lnbmVkIGxvbmcgUDNkNCA9IFAzYzQgKyAweDEwIDsKIAogICAgICBYR0lOZXdfUkFNVHlwZSA9ICggaW50IClYR0lOZXdfR2V0WEcyMERSQU1UeXBlKCBId0RldmljZUV4dGVuc2lvbiAsIHBWQkluZm8gKSA7CiAgICAgIFhHSU5ld19TZXRNZW1vcnlDbG9jayggSHdEZXZpY2VFeHRlbnNpb24gLCBwVkJJbmZvICkgOwpAQCAtMTAwMSw5ICs5NTEsMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0REUjF4X0RlZmF1bHRSZWdpc3RlciggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsICBVTE9ORyBQb3J0ICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19ERFIxeF9EZWZhdWx0UmVnaXN0ZXIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkJICB1bnNpZ25lZCBsb25nIFBvcnQsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVTE9ORyBQM2Q0ID0gUG9ydCAsCisgICAgdW5zaWduZWQgbG9uZyBQM2Q0ID0gUG9ydCAsCiAgICAgICAgICAgIFAzYzQgPSBQb3J0IC0gMHgxMCA7CiAKICAgICBpZiAoIEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPj0gWEcyMCApCkBAIC0xMDYxLDkgKzEwMTIsMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0REUjJ4X0RlZmF1bHRSZWdpc3RlciggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsICBVTE9ORyBQb3J0ICxQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X0REUjJ4X0RlZmF1bHRSZWdpc3RlcihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgUG9ydCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVMT05HIFAzZDQgPSBQb3J0ICwKKyAgICB1bnNpZ25lZCBsb25nIFAzZDQgPSBQb3J0ICwKICAgICAgICAgICAgUDNjNCA9IFBvcnQgLSAweDEwIDsKIAogICAgIFhHSU5ld19TZXRNZW1vcnlDbG9jayggSHdEZXZpY2VFeHRlbnNpb24gLCBwVkJJbmZvICkgOwpAQCAtMTExMiw5ICsxMDY0LDEwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19ERFIyX0RlZmF1bHRSZWdpc3RlciggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgVUxPTkcgUG9ydCAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfRERSMl9EZWZhdWx0UmVnaXN0ZXIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkJIHVuc2lnbmVkIGxvbmcgUG9ydCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVMT05HIFAzZDQgPSBQb3J0ICwKKyAgICB1bnNpZ25lZCBsb25nIFAzZDQgPSBQb3J0ICwKICAgICAgICAgICAgUDNjNCA9IFBvcnQgLSAweDEwIDsKIAogICAgIC8qIGtlZXAgZm9sbG93aW5nIHNldHRpbmcgc2VxdWVuY2UsIGVhY2ggc2V0dGluZyBpbiB0aGUgc2FtZSByZWcgaW5zZXJ0IGlkbGUgKi8KQEAgLTExNTAsMTIgKzExMDMsMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1NldERSQU1EZWZhdWx0UmVnaXN0ZXIzNDAoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCAgVUxPTkcgUG9ydCAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfU2V0RFJBTURlZmF1bHRSZWdpc3RlcjM0MChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIFBvcnQsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiB0ZW1wICwgdGVtcDEgLCB0ZW1wMiAsIHRlbXAzICwKKyAgICB1bnNpZ25lZCBjaGFyIHRlbXAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMgLAogICAgICAgICAgIGkgLCBqICwgayA7CiAKLSAgICBVTE9ORyBQM2Q0ID0gUG9ydCAsCisgICAgdW5zaWduZWQgbG9uZyBQM2Q0ID0gUG9ydCAsCiAgICAgICAgICAgIFAzYzQgPSBQb3J0IC0gMHgxMCA7CiAKICAgICBYR0lOZXdfU2V0UmVnMSggUDNkNCAsIDB4NkQgLCBwVkJJbmZvLT5DUjQwWyA4IF1bIFhHSU5ld19SQU1UeXBlIF0gKSA7CkBAIC0xMjkzLDExICsxMjQ3LDExIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19ERFJfTVJTKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfRERSX01SUyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGRhdGEgOworICAgIHVuc2lnbmVkIHNob3J0IGRhdGEgOwogCi0gICAgUFVDSEFSIHZvbGF0aWxlIHBWaWRlb01lbW9yeSA9ICggUFVDSEFSIClwVkJJbmZvLT5ST01BZGRyIDsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwVmlkZW9NZW1vcnkgPSAodW5zaWduZWQgY2hhciAqKXBWQkluZm8tPlJPTUFkZHI7CiAKICAgICAvKiBTUjE2IDwtIDFGLERGLDJGLEFGICovCiAgICAgLyogeXJpdmVyIG1vZGlmaWVkIFNSMTYgPC0gMEYsREYsMEYsQUYgKi8KQEAgLTEzNjEsMTEgKzEzMTUsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1ZlcmlmeU1jbGsoIFBYR0lfSFdfREVWSUNFX0lORk8gIEh3RGV2aWNlRXh0ZW5zaW9uICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19WZXJpZnlNY2xrKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgUFVDSEFSIHBWaWRlb01lbW9yeSA9IHBWQkluZm8tPkZCQWRkciA7Ci0gICAgVUNIQVIgaSAsIGogOwotICAgIFVTSE9SVCBUZW1wICwgU1IyMSA7CisgICAgdW5zaWduZWQgY2hhciAqcFZpZGVvTWVtb3J5ID0gcFZCSW5mby0+RkJBZGRyIDsKKyAgICB1bnNpZ25lZCBjaGFyIGksIGogOworICAgIHVuc2lnbmVkIHNob3J0IFRlbXAgLCBTUjIxIDsKIAogICAgIHBWaWRlb01lbW9yeVsgMCBdID0gMHhhYSA7IAkJLyogYWxhbiAqLwogICAgIHBWaWRlb01lbW9yeVsgMTYgXSA9IDB4NTUgOyAJLyogbm90ZTogUENJIHJlYWQgY2FjaGUgaXMgb2ZmICovCkBAIC0xNDA3LDkgKzEzNjEsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfU2V0RFJBTVNpemVfMzQwKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19TZXREUkFNU2l6ZV8zNDAoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgIGRhdGEgOworICAgIHVuc2lnbmVkIHNob3J0ICBkYXRhIDsKIAogICAgIHBWQkluZm8tPlJPTUFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaXJ0dWFsUm9tQmFzZSA7CiAgICAgcFZCSW5mby0+RkJBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlkZW9NZW1vcnlBZGRyZXNzIDsKQEAgLTE0MTgsNyArMTM3Miw3IEBACiAKIAogICAgIGRhdGEgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MjEgKSA7Ci0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDIxICwgKCBVU0hPUlQgKSggZGF0YSAmIDB4REYgKSApIDsJLyogZGlzYWJsZSByZWFkIGNhY2hlICovCisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgMHgyMSwgKHVuc2lnbmVkIHNob3J0KShkYXRhICYgMHhERikpOwkvKiBkaXNhYmxlIHJlYWQgY2FjaGUgKi8KICAgICBYR0lfRGlzcGxheU9mZiggSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8gKTsKIAogICAgIC8qZGF0YSA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxICkgOyovCkBAIC0xNDI2LDggKzEzODAsNyBAQAogICAgIC8qWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDAxICwgZGF0YSApIDsqLwkJCS8qIFR1cm4gT0ZGIERpc3BsYXkgKi8KICAgICBYR0lOZXdfRERSU2l6aW5nMzQwKCBId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyApIDsKICAgICBkYXRhPVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgyMSApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MjEgLCAoIFVTSE9SVCApKCBkYXRhIHwgMHgyMCApICkgOwkvKiBlbmFibGUgcmVhZCBjYWNoZSAqLwotCisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgMHgyMSwgKHVuc2lnbmVkIHNob3J0KShkYXRhIHwgMHgyMCkpOyAvKiBlbmFibGUgcmVhZCBjYWNoZSAqLwogfQogCiAKQEAgLTE0MzcsOSArMTM5MCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19TZXREUkFNU2l6ZV8zMTAoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X1NldERSQU1TaXplXzMxMChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBkYXRhIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRhIDsKICAgICBwVkJJbmZvLT5ST01BZGRyICA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlICwKICAgICBwVkJJbmZvLT5GQkFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaWRlb01lbW9yeUFkZHJlc3MgOwogI2lmZGVmIFhHSTMwMQpAQCAtMTQ1NSw3ICsxNDA4LDcgQEAKICAgICBYR0lTZXRNb2RlTmV3KCBId0RldmljZUV4dGVuc2lvbiAsIDB4MmUgKSA7CiAKICAgICBkYXRhID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDIxICkgOwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgyMSAsICggVVNIT1JUICkoIGRhdGEgJiAweERGICkgKSA7CS8qIGRpc2FibGUgcmVhZCBjYWNoZSAqLworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MjEsICh1bnNpZ25lZCBzaG9ydCkoZGF0YSAmIDB4REYpKTsJLyogZGlzYWJsZSByZWFkIGNhY2hlICovCiAKICAgICBkYXRhID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDEgKSA7CiAgICAgZGF0YSB8PSAweDIwIDsKQEAgLTE0NjQsNyArMTQxNyw3IEBACiAgICAgZGF0YSA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxNiApIDsKIAogCi0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE2ICwgKCBVU0hPUlQgKSggZGF0YSB8IDB4MEYgKSApIDsJCS8qIGFzc3VtZSBsb3dlc3Qgc3BlZWQgRFJBTSAqLworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MTYsICh1bnNpZ25lZCBzaG9ydCkoZGF0YSB8IDB4MEYpKTsJLyogYXNzdW1lIGxvd2VzdCBzcGVlZCBEUkFNICovCiAKICAgICBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3RlciggcFZCSW5mbyApIDsKICAgICBYR0lOZXdfRGlzYWJsZVJlZnJlc2goIEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvICkgOwpAQCAtMTQ4NSwxMSArMTQzOCwxMSBAQAogCiAKIAotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxNiAsIHBWQkluZm8tPlNSMTVbIDEgXVsgWEdJTmV3X1JBTVR5cGUgXSApIDsJLyogcmVzdG9yZSBTUjE2ICovCisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgMHgxNiwgcFZCSW5mby0+U1IxNVsxXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiByZXN0b3JlIFNSMTYgKi8KIAogICAgIFhHSU5ld19FbmFibGVSZWZyZXNoKCAgSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8gKSA7CiAgICAgZGF0YT1YR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsMHgyMSApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MjEgLCAoIFVTSE9SVCApKCBkYXRhIHwgMHgyMCApICkgOwkvKiBlbmFibGUgcmVhZCBjYWNoZSAqLworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MjEsICh1bnNpZ25lZCBzaG9ydCkoZGF0YSB8IDB4MjApKTsJLyogZW5hYmxlIHJlYWQgY2FjaGUgKi8KIH0KIAogCkBAIC0xNTAxLDE0ICsxNDU0LDE0IEBACiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3RlcjM0MCggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApCit2b2lkIFhHSU5ld19TZXREUkFNTW9kZVJlZ2lzdGVyMzQwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uKQogewotICAgIFVDSEFSIGRhdGEgOwotICAgIFZCX0RFVklDRV9JTkZPIFZCSU5GOwotICAgIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvID0gJlZCSU5GOworICAgIHVuc2lnbmVkIGNoYXIgZGF0YSA7CisgICAgc3RydWN0IHZiX2RldmljZV9pbmZvIFZCSU5GOworICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyA9ICZWQklORjsKICAgICBwVkJJbmZvLT5ST01BZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlydHVhbFJvbUJhc2UgOwogICAgIHBWQkluZm8tPkZCQWRkciA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpZGVvTWVtb3J5QWRkcmVzcyA7Ci0gICAgcFZCSW5mby0+QmFzZUFkZHIgPSAoVUxPTkcpSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKKyAgICBwVkJJbmZvLT5CYXNlQWRkciA9ICh1bnNpZ25lZCBsb25nKUh3RGV2aWNlRXh0ZW5zaW9uLT5waklPQWRkcmVzcyA7CiAgICAgcFZCSW5mby0+SVNYUERPUyA9IDAgOwogCiAgICAgcFZCSW5mby0+UDNjNCA9IHBWQkluZm8tPkJhc2VBZGRyICsgMHgxNCA7CkBAIC0xNTU1LDcgKzE1MDgsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3RlciggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19TZXREUkFNTW9kZVJlZ2lzdGVyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBpZiAoIFhHSU5ld19HZXQzMTBEUkFNVHlwZSggcFZCSW5mbyApIDwgMiApCiAgICAgewpAQCAtMTU3NSw5ICsxNTI4LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0Rpc2FibGVSZWZyZXNoKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19EaXNhYmxlUmVmcmVzaChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCAgZGF0YSA7CisgICAgdW5zaWduZWQgc2hvcnQgIGRhdGEgOwogCiAKICAgICBkYXRhID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDFCICkgOwpAQCAtMTU5Myw3ICsxNTQ2LDcgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0VuYWJsZVJlZnJlc2goIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X0VuYWJsZVJlZnJlc2goc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxQiAsIHBWQkluZm8tPlNSMTVbIDMgXVsgWEdJTmV3X1JBTVR5cGUgXSApIDsJLyogU1IxQiAqLwpAQCAtMTYwOCw5ICsxNTYxLDExIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19EaXNhYmxlQ2hhbm5lbEludGVybGVhdmluZyggaW50IGluZGV4ICwgVVNIT1JUIFhHSU5ld19ERFJEUkFNX1RZUEVbXVsgNSBdICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19EaXNhYmxlQ2hhbm5lbEludGVybGVhdmluZyhpbnQgaW5kZXgsCisJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IFhHSU5ld19ERFJEUkFNX1RZUEVbXVs1XSwKKwkJCQkgICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBkYXRhIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRhIDsKIAogICAgIGRhdGEgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MTUgKSA7CiAgICAgZGF0YSAmPSAweDFGIDsKQEAgLTE2NDIsOSArMTU5NywxMSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfU2V0RFJBTVNpemluZ1R5cGUoIGludCBpbmRleCAsIFVTSE9SVCBEUkFNVFlQRV9UQUJMRVtdWyA1IF0gLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfU2V0RFJBTVNpemluZ1R5cGUoaW50IGluZGV4LAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKKwkJCSAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZGF0YSA7CisgICAgdW5zaWduZWQgc2hvcnQgZGF0YTsKIAogICAgIGRhdGEgPSBEUkFNVFlQRV9UQUJMRVsgaW5kZXggXVsgNCBdIDsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzYzQgLCAweDEzICwgMHg4MCAsIGRhdGEgKSA7CkBAIC0xNjU5LDEyICsxNjE2LDEyIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19DaGVja0J1c1dpZHRoXzMxMCggIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfQ2hlY2tCdXNXaWR0aF8zMTAoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBkYXRhIDsKLSAgICBQVUxPTkcgdm9sYXRpbGUgcFZpZGVvTWVtb3J5IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRhIDsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwVmlkZW9NZW1vcnkgOwogCi0gICAgcFZpZGVvTWVtb3J5ID0gKFBVTE9ORykgcFZCSW5mby0+RkJBZGRyOworICAgIHBWaWRlb01lbW9yeSA9ICh1bnNpZ25lZCBsb25nICopIHBWQkluZm8tPkZCQWRkcjsKIAogICAgIGlmICggWEdJTmV3X0dldDMxMERSQU1UeXBlKCBwVkJJbmZvICkgPCAyICkKICAgICB7CkBAIC0xNjkwLDcgKzE2NDcsNyBAQAogICAgICAgICAgICAgWEdJTmV3X0RhdGFCdXNXaWR0aCA9IDY0IDsKICAgICAgICAgICAgIFhHSU5ld19DaGFubmVsQUIgPSAwIDsKICAgICAgICAgICAgIGRhdGE9WEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE0ICkgOwotICAgICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE0ICwgKCBVU0hPUlQgKSggZGF0YSAmIDB4RkQgKSApIDsKKwkgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgMHgxNCwgKHVuc2lnbmVkIHNob3J0KShkYXRhICYgMHhGRCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCAoIHBWaWRlb01lbW9yeVsgMSBdICE9IDB4NDU2Nzg5QUJMICkgfHwgKCBwVmlkZW9NZW1vcnlbIDAgXSAhPSAweDAxMjM0NTY3TCApICkKQEAgLTE2OTksNyArMTY1Niw4IEBACiAgICAgICAgICAgICBYR0lOZXdfRGF0YUJ1c1dpZHRoID0gNjQgOwogICAgICAgICAgICAgWEdJTmV3X0NoYW5uZWxBQiA9IDEgOwogICAgICAgICAgICAgZGF0YT1YR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MTQgKSA7Ci0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MTQgLCAoIFVTSE9SVCApKCAoIGRhdGEgJiAweEZEICkgfCAweDAxICkgKSA7CisJICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MTQsCisJCQkgICAodW5zaWduZWQgc2hvcnQpKChkYXRhICYgMHhGRCkgfCAweDAxKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gOwpAQCAtMTc5Miw5ICsxNzUwLDEzIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgWEdJTmV3X1NldFJhbmsoIGludCBpbmRleCAsIFVDSEFSIFJhbmtObyAsIFVDSEFSIFhHSU5ld19DaGFubmVsQUIgLCBVU0hPUlQgRFJBTVRZUEVfVEFCTEVbXVsgNSBdICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X1NldFJhbmsoaW50IGluZGV4LAorCQkgICB1bnNpZ25lZCBjaGFyIFJhbmtObywKKwkJICAgdW5zaWduZWQgY2hhciBYR0lOZXdfQ2hhbm5lbEFCLAorCQkgICB1bnNpZ25lZCBzaG9ydCBEUkFNVFlQRV9UQUJMRVtdWzVdLAorCQkgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGRhdGEgOworICAgIHVuc2lnbmVkIHNob3J0IGRhdGE7CiAgICAgaW50IFJhbmtTaXplIDsKIAogICAgIGlmICggKCBSYW5rTm8gPT0gMiApICYmICggRFJBTVRZUEVfVEFCTEVbIGluZGV4IF1bIDAgXSA9PSAyICkgKQpAQCAtMTgyOSw5ICsxNzkxLDEzIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgWEdJTmV3X1NldEREUkNoYW5uZWwoIGludCBpbmRleCAsIFVDSEFSIENoYW5uZWxObyAsIFVDSEFSIFhHSU5ld19DaGFubmVsQUIgLCBVU0hPUlQgRFJBTVRZUEVfVEFCTEVbXVsgNSBdICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X1NldEREUkNoYW5uZWwoaW50IGluZGV4LAorCQkJIHVuc2lnbmVkIGNoYXIgQ2hhbm5lbE5vLAorCQkJIHVuc2lnbmVkIGNoYXIgWEdJTmV3X0NoYW5uZWxBQiwKKwkJCSB1bnNpZ25lZCBzaG9ydCBEUkFNVFlQRV9UQUJMRVtdWzVdLAorCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgIGRhdGEgOworICAgIHVuc2lnbmVkIHNob3J0IGRhdGE7CiAgICAgaW50IFJhbmtTaXplIDsKIAogICAgIFJhbmtTaXplID0gRFJBTVRZUEVfVEFCTEVbaW5kZXhdWzNdLzIgKiBYR0lOZXdfRGF0YUJ1c1dpZHRoLzMyOwpAQCAtMTg2NSwzMCArMTgzMSwyOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFhHSU5ld19DaGVja0NvbHVtbiggaW50IGluZGV4ICwgVVNIT1JUIERSQU1UWVBFX1RBQkxFW11bIDUgXSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X0NoZWNrQ29sdW1uKGludCBpbmRleCwKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0IERSQU1UWVBFX1RBQkxFW11bNV0sCisJCSAgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaW50IGkgOwotICAgIFVMT05HIEluY3JlbWVudCAsIFBvc2l0aW9uIDsKKyAgICB1bnNpZ25lZCBsb25nIEluY3JlbWVudCAsIFBvc2l0aW9uIDsKIAogICAgIC8qIEluY3JlbWVudCA9IDEgPDwgKCBEUkFNVFlQRV9UQUJMRVsgaW5kZXggXVsgMiBdICsgWEdJTmV3X0RhdGFCdXNXaWR0aCAvIDY0ICsgMSApIDsgKi8KICAgICBJbmNyZW1lbnQgPSAxIDw8ICggMTAgKyBYR0lOZXdfRGF0YUJ1c1dpZHRoIC8gNjQgKSA7CiAKICAgICBmb3IoIGkgPSAwICwgUG9zaXRpb24gPSAwIDsgaSA8IDIgOyBpKysgKQogICAgIHsKLSAgICAgICAgKiggKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKSApID0gUG9zaXRpb24gOwotICAgICAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQgOworCSAgICAqKCh1bnNpZ25lZCBsb25nICopKHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uKSkgPSBQb3NpdGlvbjsKKwkgICAgUG9zaXRpb24gKz0gSW5jcmVtZW50IDsKICAgICB9CiAKLSNpZmRlZiBXSU4yMDAwICAvKiBjaGlhd2VuIGZvciBsaW51eCBzb2x1dGlvbiAqLwotICAgIERlbGF5VVMoIDEwMCApIDsKLSNlbmRpZgogCiAgICAgZm9yKCBpID0gMCAsIFBvc2l0aW9uID0gMCA7IGkgPCAyIDsgaSsrICkKICAgICB7CiAgICAgICAgIC8qIGlmICggcFZCSW5mby0+RkJBZGRyWyBQb3NpdGlvbiBdICE9IFBvc2l0aW9uICkgKi8KLSAgICAgICAgaWYgKCAoICooIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbiApICkgIT0gUG9zaXRpb24gKQotICAgICAgICAgICAgcmV0dXJuKCAwICkgOwotICAgICAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQgOworCSAgICBpZiAoKCoodW5zaWduZWQgbG9uZyAqKShwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbikpICE9IFBvc2l0aW9uKQorCQkgICAgcmV0dXJuIDA7CisJICAgIFBvc2l0aW9uICs9IEluY3JlbWVudDsKICAgICB9CiAgICAgcmV0dXJuKCAxICkgOwogfQpAQCAtMTkwMCwyNiArMTg2NSwyOCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFhHSU5ld19DaGVja0JhbmtzKCBpbnQgaW5kZXggLCBVU0hPUlQgRFJBTVRZUEVfVEFCTEVbXVsgNSBdLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK2ludCBYR0lOZXdfQ2hlY2tCYW5rcyhpbnQgaW5kZXgsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IERSQU1UWVBFX1RBQkxFW11bNV0sCisJCSAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBpbnQgaSA7Ci0gICAgVUxPTkcgSW5jcmVtZW50ICwgUG9zaXRpb24gOworICAgIHVuc2lnbmVkIGxvbmcgSW5jcmVtZW50ICwgUG9zaXRpb24gOwogCiAgICAgSW5jcmVtZW50ID0gMSA8PCAoIERSQU1UWVBFX1RBQkxFWyBpbmRleCBdWyAyIF0gKyBYR0lOZXdfRGF0YUJ1c1dpZHRoIC8gNjQgKyAyICkgOwogCiAgICAgZm9yKCBpID0gMCAsIFBvc2l0aW9uID0gMCA7IGkgPCA0IDsgaSsrICkKICAgICB7CiAgICAgICAgIC8qIHBWQkluZm8tPkZCQWRkclsgUG9zaXRpb24gXSA9IFBvc2l0aW9uIDsgKi8KLSAgICAgICAgKiggKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKSApID0gUG9zaXRpb24gOwotICAgICAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQgOworCSAgICAqKCh1bnNpZ25lZCBsb25nICopKHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uKSkgPSBQb3NpdGlvbjsKKwkgICAgUG9zaXRpb24gKz0gSW5jcmVtZW50IDsKICAgICB9CiAKICAgICBmb3IoIGkgPSAwICwgUG9zaXRpb24gPSAwIDsgaSA8IDQgOyBpKysgKQogICAgIHsKICAgICAgICAgLyogaWYgKHBWQkluZm8tPkZCQWRkclsgUG9zaXRpb24gXSAhPSBQb3NpdGlvbiApICovCi0gICAgICAgIGlmICggKCAqKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKSApICE9IFBvc2l0aW9uICkKLSAgICAgICAgICAgIHJldHVybiggMCApIDsKLSAgICAgICAgUG9zaXRpb24gKz0gSW5jcmVtZW50IDsKKwkgICAgaWYgKCgqKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSAhPSBQb3NpdGlvbikKKwkJICAgIHJldHVybiAwOworCSAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQ7CiAgICAgfQogICAgIHJldHVybiggMSApIDsKIH0KQEAgLTE5MzEsMTAgKzE4OTgsMTIgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBYR0lOZXdfQ2hlY2tSYW5rKCBpbnQgUmFua05vICwgaW50IGluZGV4ICwgVVNIT1JUIERSQU1UWVBFX1RBQkxFW11bIDUgXSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X0NoZWNrUmFuayhpbnQgUmFua05vLCBpbnQgaW5kZXgsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKKwkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaW50IGkgOwotICAgIFVMT05HIEluY3JlbWVudCAsIFBvc2l0aW9uIDsKKyAgICB1bnNpZ25lZCBsb25nIEluY3JlbWVudCAsIFBvc2l0aW9uIDsKIAogICAgIEluY3JlbWVudCA9IDEgPDwgKCBEUkFNVFlQRV9UQUJMRVsgaW5kZXggXVsgMiBdICsgRFJBTVRZUEVfVEFCTEVbIGluZGV4IF1bIDEgXSArCiAgICAgICAgICAgICAgICAgICBEUkFNVFlQRV9UQUJMRVsgaW5kZXggXVsgMCBdICsgWEdJTmV3X0RhdGFCdXNXaWR0aCAvIDY0ICsgUmFua05vICkgOwpAQCAtMTk0MiwxOCArMTkxMSwxOCBAQAogICAgIGZvciggaSA9IDAgLCBQb3NpdGlvbiA9IDAgOyBpIDwgMiA7IGkrKyApCiAgICAgewogICAgICAgICAvKiBwVkJJbmZvLT5GQkFkZHJbIFBvc2l0aW9uIF0gPSBQb3NpdGlvbiA7ICovCi0gICAgICAgIC8qICooICggUFVMT05HICkoIHBWQkluZm8tPkZCQWRkciApICkgPSBQb3NpdGlvbiA7ICovCi0gICAgICAgICooICggUFVMT05HICkoIHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uICkgKSA9IFBvc2l0aW9uIDsKLSAgICAgICAgUG9zaXRpb24gKz0gSW5jcmVtZW50IDsKKyAgICAgICAgLyogKiggKHVuc2lnbmVkIGxvbmcgKikoIHBWQkluZm8tPkZCQWRkciApICkgPSBQb3NpdGlvbiA7ICovCisJICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSA9IFBvc2l0aW9uOworCSAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQ7CiAgICAgfQogCiAgICAgZm9yKCBpID0gMCAsIFBvc2l0aW9uID0gMCA7IGkgPCAyIDsgaSsrICkKICAgICB7CiAgICAgICAgIC8qIGlmICggcFZCSW5mby0+RkJBZGRyWyBQb3NpdGlvbiBdICE9IFBvc2l0aW9uICkgKi8KLSAgICAgICAgLyogaWYgKCAoICooIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKSApICE9IFBvc2l0aW9uICkgKi8KLSAgICAgICAgaWYgKCAoICooIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbiApICkgIT0gUG9zaXRpb24gKQotICAgICAgICAgICAgcmV0dXJuKCAwICkgOwotICAgICAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQgOworICAgICAgICAvKiBpZiAoICggKih1bnNpZ25lZCBsb25nICopKCBwVkJJbmZvLT5GQkFkZHIgKSApICE9IFBvc2l0aW9uICkgKi8KKwkgICAgaWYgKCgqKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSAhPSBQb3NpdGlvbikKKwkJICAgIHJldHVybiAwOworCSAgICBQb3NpdGlvbiArPSBJbmNyZW1lbnQ7CiAgICAgfQogICAgIHJldHVybiggMSApOwogfQpAQCAtMTk2NSwxMCArMTkzNCwxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFhHSU5ld19DaGVja0REUlJhbmsoIGludCBSYW5rTm8gLCBpbnQgaW5kZXggLCBVU0hPUlQgRFJBTVRZUEVfVEFCTEVbXVsgNSBdLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK2ludCBYR0lOZXdfQ2hlY2tERFJSYW5rKGludCBSYW5rTm8sIGludCBpbmRleCwKKwkJCXVuc2lnbmVkIHNob3J0IERSQU1UWVBFX1RBQkxFW11bNV0sCisJCQlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUxPTkcgSW5jcmVtZW50ICwgUG9zaXRpb24gOwotICAgIFVTSE9SVCBkYXRhIDsKKyAgICB1bnNpZ25lZCBsb25nIEluY3JlbWVudCAsIFBvc2l0aW9uIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRhIDsKIAogICAgIEluY3JlbWVudCA9IDEgPDwgKCBEUkFNVFlQRV9UQUJMRVsgaW5kZXggXVsgMiBdICsgRFJBTVRZUEVfVEFCTEVbIGluZGV4IF1bIDEgXSArCiAgICAgICAgICAgICAgICAgICAgICAgIERSQU1UWVBFX1RBQkxFWyBpbmRleCBdWyAwIF0gKyBYR0lOZXdfRGF0YUJ1c1dpZHRoIC8gNjQgKyBSYW5rTm8gKSA7CkBAIC0xOTc2LDE4ICsxOTQ3LDE4IEBACiAgICAgSW5jcmVtZW50ICs9IEluY3JlbWVudCAvIDIgOwogCiAgICAgUG9zaXRpb24gPSAwOwotICAgICooICggUFVMT05HICkoIHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uICsgMCApICkgPSAweDAxMjM0NTY3IDsKLSAgICAqKCAoIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbiArIDEgKSApID0gMHg0NTY3ODlBQiA7Ci0gICAgKiggKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyAyICkgKSA9IDB4NTU1NTU1NTUgOwotICAgICooICggUFVMT05HICkoIHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uICsgMyApICkgPSAweDU1NTU1NTU1IDsKLSAgICAqKCAoIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbiArIDQgKSApID0gMHhBQUFBQUFBQSA7Ci0gICAgKiggKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyA1ICkgKSA9IDB4QUFBQUFBQUEgOworICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyAwKSkgPSAweDAxMjM0NTY3OworICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyAxKSkgPSAweDQ1Njc4OUFCOworICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyAyKSkgPSAweDU1NTU1NTU1OworICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyAzKSkgPSAweDU1NTU1NTU1OworICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyA0KSkgPSAweEFBQUFBQUFBOworICAgICooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKyA1KSkgPSAweEFBQUFBQUFBOwogCi0gICAgaWYgKCAoICooIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyAxICkgKSA9PSAweDQ1Njc4OUFCICkKLSAgICAgICAgcmV0dXJuKCAxICkgOworICAgIGlmICgoKih1bnNpZ25lZCBsb25nICopKHBWQkluZm8tPkZCQWRkciArIDEpKSA9PSAweDQ1Njc4OUFCKQorCSAgICByZXR1cm4gMTsKIAotICAgIGlmICggKCAqKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgMCApICkgPT0gMHgwMTIzNDU2NyApCi0gICAgICAgIHJldHVybiggMCApIDsKKyAgICBpZiAoKCoodW5zaWduZWQgbG9uZyAqKShwVkJJbmZvLT5GQkFkZHIgKyAwKSkgPT0gMHgwMTIzNDU2NykKKwkgICAgcmV0dXJuIDA7CiAKICAgICBkYXRhID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE0ICkgOwogICAgIGRhdGEgJj0gMHhGMyA7CkBAIC0yMDA3LDcgKzE5NzgsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFhHSU5ld19DaGVja1JhbmtzKCBpbnQgUmFua05vICwgaW50IGluZGV4ICwgVVNIT1JUIERSQU1UWVBFX1RBQkxFW11bIDUgXSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X0NoZWNrUmFua3MoaW50IFJhbmtObywgaW50IGluZGV4LAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBEUkFNVFlQRV9UQUJMRVtdWzVdLAorCQkgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaW50IHIgOwogCkBAIC0yMDMzLDcgKzIwMDYsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFhHSU5ld19DaGVja0REUlJhbmtzKCBpbnQgUmFua05vICwgaW50IGluZGV4ICwgVVNIT1JUIERSQU1UWVBFX1RBQkxFW11bIDUgXSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X0NoZWNrRERSUmFua3MoaW50IFJhbmtObywgaW50IGluZGV4LAorCQkJIHVuc2lnbmVkIHNob3J0IERSQU1UWVBFX1RBQkxFW11bNV0sCisJCQkgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogICAgIGludCByIDsKIApAQCAtMjA1OSwxMCArMjAzNCwxMCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFhHSU5ld19TRFJTaXppbmcoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X1NEUlNpemluZyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaW50ICAgIGkgOwotICAgIFVDSEFSICBqIDsKKyAgICB1bnNpZ25lZCBjaGFyICBqIDsKIAogICAgIGZvciggaSA9IDAgOyBpIDwgMTMgOyBpKysgKQogICAgIHsKQEAgLTIwNzAsNyArMjA0NSw4IEBACiAKICAgICAgICAgZm9yKCBqID0gMiA7IGogPiAwIDsgai0tICkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhWEdJTmV3X1NldFJhbmsoIGkgLCAoIFVDSEFSIClqICwgWEdJTmV3X0NoYW5uZWxBQiAsIFhHSU5ld19TRFJEUkFNX1RZUEUgLCBwVkJJbmZvKSApCisJICAgIGlmICghWEdJTmV3X1NldFJhbmsoaSwgKHVuc2lnbmVkIGNoYXIpaiwgWEdJTmV3X0NoYW5uZWxBQiwKKwkJCQkgWEdJTmV3X1NEUkRSQU1fVFlQRSwgcFZCSW5mbykpCiAgICAgICAgICAgICAgICAgY29udGludWUgOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMjA4OSwxMSArMjA2NSwxMyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVVNIT1JUIFhHSU5ld19TZXREUkFNU2l6ZVJlZyggaW50IGluZGV4ICwgVVNIT1JUIERSQU1UWVBFX1RBQkxFW11bIDUgXSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBzaG9ydCBYR0lOZXdfU2V0RFJBTVNpemVSZWcoaW50IGluZGV4LAorCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKKwkJCQkgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZGF0YSA9IDAgLCBtZW1zaXplID0gMCA7CisgICAgdW5zaWduZWQgc2hvcnQgZGF0YSA9IDAgLCBtZW1zaXplID0gMDsKICAgICBpbnQgUmFua1NpemUgOwotICAgIFVDSEFSIENoYW5uZWxObyA7CisgICAgdW5zaWduZWQgY2hhciBDaGFubmVsTm8gOwogCiAgICAgUmFua1NpemUgPSBEUkFNVFlQRV9UQUJMRVsgaW5kZXggXVsgMyBdICogWEdJTmV3X0RhdGFCdXNXaWR0aCAvIDMyIDsKICAgICBkYXRhID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDEzICkgOwpAQCAtMjEzOCwxMSArMjExNiwxMyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVVNIT1JUIFhHSU5ld19TZXREUkFNU2l6ZTIwUmVnKCBpbnQgaW5kZXggLCBVU0hPUlQgRFJBTVRZUEVfVEFCTEVbXVsgNSBdLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19TZXREUkFNU2l6ZTIwUmVnKGludCBpbmRleCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKKwkJCQkgICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBkYXRhID0gMCAsIG1lbXNpemUgPSAwIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRhID0gMCAsIG1lbXNpemUgPSAwOwogICAgIGludCBSYW5rU2l6ZSA7Ci0gICAgVUNIQVIgQ2hhbm5lbE5vIDsKKyAgICB1bnNpZ25lZCBjaGFyIENoYW5uZWxObyA7CiAKICAgICBSYW5rU2l6ZSA9IERSQU1UWVBFX1RBQkxFWyBpbmRleCBdWyAzIF0gKiBYR0lOZXdfRGF0YUJ1c1dpZHRoIC8gOCA7CiAgICAgZGF0YSA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxMyApIDsKQEAgLTIxODgsMzEgKzIxNjgsMzIgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBYR0lOZXdfUmVhZFdyaXRlUmVzdCggVVNIT1JUIFN0b3BBZGRyICwgVVNIT1JUIFN0YXJ0QWRkciwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCitpbnQgWEdJTmV3X1JlYWRXcml0ZVJlc3QodW5zaWduZWQgc2hvcnQgU3RvcEFkZHIsIHVuc2lnbmVkIHNob3J0IFN0YXJ0QWRkciwKKwkJCSBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaW50IGkgOwotICAgIFVMT05HIFBvc2l0aW9uID0gMCA7CisgICAgdW5zaWduZWQgbG9uZyBQb3NpdGlvbiA9IDAgOwogCi0gICAqKCAoIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbiApICkgPSBQb3NpdGlvbiA7CisgICAgKigodW5zaWduZWQgbG9uZyAqKShwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbikpID0gUG9zaXRpb247CiAKICAgICBmb3IoIGkgPSBTdGFydEFkZHIgOyBpIDw9IFN0b3BBZGRyIDsgaSsrICkKICAgICB7CiAgICAgICAgIFBvc2l0aW9uID0gMSA8PCBpIDsKLSAgICAgICAgKiggKCBQVUxPTkcgKSggcFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24gKSApID0gUG9zaXRpb24gOworCSooKHVuc2lnbmVkIGxvbmcgKikocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSA9IFBvc2l0aW9uOwogICAgIH0KIAogICAgIERlbGF5VVMoIDUwMCApIDsJLyogW1ZpY2VudF0gMjAwNC8wNC8xNi4gRml4ICMxNzU5IE1lbW9yeSBTaXplIGVycm9yIGluIE11bHRpLUFkYXB0ZXIuICovCiAKICAgICBQb3NpdGlvbiA9IDAgOwogCi0gICBpZiAoICggKiggUFVMT05HICkoIHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uICkgKSAhPSBQb3NpdGlvbiApCi0gICAgICAgIHJldHVybiggMCApIDsKKyAgIGlmICgoKih1bnNpZ25lZCBsb25nICopKHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uKSkgIT0gUG9zaXRpb24pCisJICAgcmV0dXJuIDA7CiAKICAgICBmb3IoIGkgPSBTdGFydEFkZHIgOyBpIDw9IFN0b3BBZGRyIDsgaSsrICkKICAgICB7CiAgICAgICAgIFBvc2l0aW9uID0gMSA8PCBpIDsKLSAgICAgICAgaWYgKCAoICooIFBVTE9ORyApKCBwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbiApICkgIT0gUG9zaXRpb24gKQotICAgICAgICAgICAgcmV0dXJuKCAwICkgOworCWlmICgoKih1bnNpZ25lZCBsb25nICopKHBWQkluZm8tPkZCQWRkciArIFBvc2l0aW9uKSkgIT0gUG9zaXRpb24pCisJCXJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4oIDEgKSA7CiB9CkBAIC0yMjI0LDkgKzIyMDUsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUNIQVIgWEdJTmV3X0NoZWNrRnJlcXVlbmNlKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSU5ld19DaGVja0ZyZXF1ZW5jZShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgZGF0YSA7CisgICAgdW5zaWduZWQgY2hhciBkYXRhIDsKIAogICAgIGRhdGEgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4OTcgKSA7CiAKQEAgLTIyNDcsOSArMjIyOCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19DaGVja0NoYW5uZWwoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfQ2hlY2tDaGFubmVsKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGE7CiAKICAgICBzd2l0Y2goIEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgKQogICAgIHsKQEAgLTI1MjgsMTAgKzI1MDksMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBYR0lOZXdfRERSU2l6aW5nMzQwKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK2ludCBYR0lOZXdfRERSU2l6aW5nMzQwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaW50IGkgOwotICAgIFVTSE9SVCBtZW1zaXplICwgYWRkciA7CisgICAgdW5zaWduZWQgc2hvcnQgbWVtc2l6ZSAsIGFkZHIgOwogCiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDE1ICwgMHgwMCApIDsJLyogbm9uaW50ZXJsZWF2aW5nICovCiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDFDICwgMHgwMCApIDsJLyogbm9udGlsaW5nICovCkBAIC0yNTQ4LDcgKzI1MjksNyBAQAogICAgICAgICAgICAgY29udGludWUgOwogCiAgICAgICAgIGFkZHIgPSBtZW1zaXplICsgKCBYR0lOZXdfQ2hhbm5lbEFCIC0gMiApICsgMjAgOwotICAgICAgICBpZiAoICggSHdEZXZpY2VFeHRlbnNpb24tPnVsVmlkZW9NZW1vcnlTaXplIC0gMSApIDwgKCBVTE9ORyApKCAxIDw8IGFkZHIgKSApCisJaWYgKChId0RldmljZUV4dGVuc2lvbi0+dWxWaWRlb01lbW9yeVNpemUgLSAxKSA8ICh1bnNpZ25lZCBsb25nKSgxIDw8IGFkZHIpKQogICAgICAgICAgICAgY29udGludWUgOwogCiAgICAgICAgIGlmICggWEdJTmV3X1JlYWRXcml0ZVJlc3QoIGFkZHIgLCA1LCBwVkJJbmZvICkgPT0gMSApCkBAIC0yNTY2LDcgKzI1NDcsNyBAQAogICAgICAgICAgICAgY29udGludWUgOwogCiAgICAgICAgIGFkZHIgPSBtZW1zaXplICsgKCBYR0lOZXdfQ2hhbm5lbEFCIC0gMiApICsgMjAgOwotICAgICAgICBpZiAoICggSHdEZXZpY2VFeHRlbnNpb24tPnVsVmlkZW9NZW1vcnlTaXplIC0gMSApIDwgKCBVTE9ORyApKCAxIDw8IGFkZHIgKSApCisJaWYgKChId0RldmljZUV4dGVuc2lvbi0+dWxWaWRlb01lbW9yeVNpemUgLSAxKSA8ICh1bnNpZ25lZCBsb25nKSgxIDw8IGFkZHIpKQogICAgICAgICAgICAgY29udGludWUgOwogCiAgICAgICAgIGlmICggWEdJTmV3X1JlYWRXcml0ZVJlc3QoIGFkZHIgLCA5LCBwVkJJbmZvICkgPT0gMSApCkBAIC0yNTgzLDEwICsyNTY0LDEwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgWEdJTmV3X0REUlNpemluZyhQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK2ludCBYR0lOZXdfRERSU2l6aW5nKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBpbnQgICAgaSA7Ci0gICAgVUNIQVIgIGogOworICAgIHVuc2lnbmVkIGNoYXIgIGogOwogCiAgICAgZm9yKCBpID0gMCA7IGkgPCA0IDsgaSsrICkKICAgICB7CkBAIC0yNTk1LDcgKzI1NzYsOCBAQAogICAgICAgICBmb3IoIGogPSAyIDsgaiA+IDAgOyBqLS0gKQogICAgICAgICB7CiAgICAgICAgICAgICBYR0lOZXdfU2V0RERSQ2hhbm5lbCggaSAsIGogLCBYR0lOZXdfQ2hhbm5lbEFCICwgWEdJTmV3X0REUkRSQU1fVFlQRSAsIHBWQkluZm8gKSA7Ci0gICAgICAgICAgICBpZiAoICFYR0lOZXdfU2V0UmFuayggaSAsICggVUNIQVIgKWogLCBYR0lOZXdfQ2hhbm5lbEFCICwgWEdJTmV3X0REUkRSQU1fVFlQRSwgcFZCSW5mbyApICkKKwkgICAgaWYgKCFYR0lOZXdfU2V0UmFuayhpLCAodW5zaWduZWQgY2hhcilqLCBYR0lOZXdfQ2hhbm5lbEFCLAorCQkJCVhHSU5ld19ERFJEUkFNX1RZUEUsIHBWQkluZm8pKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlIDsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTI2MTMsNyArMjU5NSw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19TZXRNZW1vcnlDbG9jayggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19TZXRNZW1vcnlDbG9jayhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCiAKQEAgLTI2MzQsOSArMjYxNiw3IEBACiAgICAgICBpZiAoICggcFZCSW5mby0+TUNMS0RhdGFbIFhHSU5ld19SQU1UeXBlIF0uU1IyOCA9PSAweDFDICkgJiYgKCBwVkJJbmZvLT5NQ0xLRGF0YVsgWEdJTmV3X1JBTVR5cGUgXS5TUjI5ID09IDB4MDEgKQogICAgICAgICAmJiAoICggKCBwVkJJbmZvLT5FQ0xLRGF0YVsgWEdJTmV3X1JBTVR5cGUgXS5TUjJFID09IDB4MUMgKSAmJiAoIHBWQkluZm8tPkVDTEtEYXRhWyBYR0lOZXdfUkFNVHlwZSBdLlNSMkYgPT0gMHgwMSApICkKICAgICAgICAgfHwgKCAoIHBWQkluZm8tPkVDTEtEYXRhWyBYR0lOZXdfUkFNVHlwZSBdLlNSMkUgPT0gMHgyMiApICYmICggcFZCSW5mby0+RUNMS0RhdGFbIFhHSU5ld19SQU1UeXBlIF0uU1IyRiA9PSAweDAxICkgKSApICkKLSAgICAgIHsKLSAgICAgIAlYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MzIgLCAoICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgzMiApICYgMHhGQyApIHwgMHgwMiApIDsKLSAgICAgIH0KKwkgICAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDMyLCAoKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNjNCwgMHgzMikgJiAweEZDKSB8IDB4MDIpOwogICAgIH0KIH0KIApAQCAtMjY0NywxMiArMjYyNywxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBDaGtMRkIoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgQ2hrTEZCKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBpZiAoIExGQkRSQU1UcmFwICYgWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDc4ICkgKQotICAgICAgICByZXR1cm4oIFRSVUUgKSA7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oIEZBTFNFICk7CisJaWYgKExGQkRSQU1UcmFwICYgWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCAsIDB4NzgpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOwogfQogCiAKQEAgLTI2NjQsMTcgKzI2NDQsMTggQEAKIC8qIGluIHNlY29uZCBjaGlwLCBhc3N1bWUgQ1IgQTEgRFs2XT0iMSIgaW4gdGhpcyBjYXNlICovCiAvKiBvdXRwdXQgOiBub25lICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0UG93ZXJDb25zdW1lICggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFVMT05HIFhHSV9QM2Q0UG9ydCApCit2b2lkIFNldFBvd2VyQ29uc3VtZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJICAgICB1bnNpZ25lZCBsb25nIFhHSV9QM2Q0UG9ydCkKIHsKLSAgICBVTE9ORyAgIGxUZW1wIDsKLSAgICBVQ0hBUiAgIGJUZW1wOworICAgIHVuc2lnbmVkIGxvbmcgICBsVGVtcCA7CisgICAgdW5zaWduZWQgY2hhciAgIGJUZW1wOwogCiAgICAgSHdEZXZpY2VFeHRlbnNpb24tPnBRdWVyeVZHQUNvbmZpZ1NwYWNlKCBId0RldmljZUV4dGVuc2lvbiAsIDB4MDggLCAwICwgJmxUZW1wICkgOyAvKiBHZXQgKi8KICAgICBpZiAoKGxUZW1wJjB4RkYpPT0wKQogICAgIHsKICAgICAgICAgLyogc2V0IENSNTggRFs1XT0wIERbM109MCAqLwogICAgICAgICBYR0lOZXdfU2V0UmVnQU5EKCBYR0lfUDNkNFBvcnQgLCAweDU4ICwgMHhENyApIDsKLSAgICAgICAgYlRlbXAgPSAoVUNIQVIpIFhHSU5ld19HZXRSZWcxKCBYR0lfUDNkNFBvcnQgLCAweENCICkgOworCWJUZW1wID0gKHVuc2lnbmVkIGNoYXIpIFhHSU5ld19HZXRSZWcxKFhHSV9QM2Q0UG9ydCwgMHhDQik7CiAgICAgCWlmIChiVGVtcCYweDIwKQogICAgIAl7CiAgICAgICAgICAgICBpZiAoIShiVGVtcCYweDEwKSkKQEAgLTI2OTIsMTUgKzI2NzMsMTMgQEAKIH0KIAogCi0KLSNpZiBkZWZpbmVkKExJTlVYX1hGODYpfHxkZWZpbmVkKExJTlVYX0tFUk5FTCkKLXZvaWQgWEdJTmV3X0luaXRWQklPU0RhdGEoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19Jbml0VkJJT1NEYXRhKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAKLQkvKiBVTE9ORyBST01BZGRyID0gKFVMT05HKUh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlOyAqLworCS8qIHVuc2lnbmVkIGxvbmcgUk9NQWRkciA9ICh1bnNpZ25lZCBsb25nKUh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlOyAqLwogICAgIHBWQkluZm8tPlJPTUFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaXJ0dWFsUm9tQmFzZSA7CiAgICAgcFZCSW5mby0+RkJBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlkZW9NZW1vcnlBZGRyZXNzIDsKLSAgICBwVkJJbmZvLT5CYXNlQWRkciA9IChVTE9ORylId0RldmljZUV4dGVuc2lvbi0+cGpJT0FkZHJlc3MgOworICAgIHBWQkluZm8tPkJhc2VBZGRyID0gKHVuc2lnbmVkIGxvbmcpSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKICAgICBwVkJJbmZvLT5JU1hQRE9TID0gMCA7CiAKICAgICBwVkJJbmZvLT5QM2M0ID0gcFZCSW5mby0+QmFzZUFkZHIgKyAweDE0IDsKQEAgLTI3MzYsNyArMjcxNSw2IEBACiAJfQogCiB9Ci0jZW5kaWYgLyogRm9yIExpbnV4ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogRnVuY3Rpb24gOiBSZWFkVkJJT1NUYWJsRGF0YSAqLwpAQCAtMjc0NCwyMDAgKzI3MjIsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgUmVhZFZCSU9TVGFibERhdGEoIFVDSEFSIENoaXBUeXBlICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFJlYWRWQklPU1RhYmxEYXRhKHVuc2lnbmVkIGNoYXIgQ2hpcFR5cGUsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBQVUNIQVIgIHZvbGF0aWxlIHBWaWRlb01lbW9yeSA9ICggUFVDSEFSIClwVkJJbmZvLT5ST01BZGRyIDsKLSAgICBVTE9ORyAgIGkgOwotICAgIFVDSEFSICAgaiAsIGsgOwotI2lmIDAKLSAgICBVTE9ORyAgIGlpICwgamogOwotICAgIGkgPSBwVmlkZW9NZW1vcnlbIDB4MUNGIF0gfCAoIHBWaWRlb01lbW9yeVsgMHgxRDAgXSA8PCA4ICkgOwkJLyogVW5pUk9NICovCi0gICAgaWYgKCBpICE9IDAgKQotICAgICAgICBVTklST00gPSAxIDsKLQotICAgIGlpID0gMHg5MCA7Ci0gICAgZm9yKCBqaiA9IDB4MDAgOyBqaiA8IDB4MDggOyBqaisrICkKLSAgICB7Ci0gICAgICAgIHBWQkluZm8tPk1DTEtEYXRhWyBqaiBdLlNSMjggPSBwVmlkZW9NZW1vcnlbIGlpIF0gOwotICAgICAgICBwVkJJbmZvLT5NQ0xLRGF0YVsgamogXS5TUjI5ID0gcFZpZGVvTWVtb3J5WyBpaSArIDFdIDsKLSAgICAgICAgcFZCSW5mby0+TUNMS0RhdGFbIGpqIF0uU1IyQSA9IHBWaWRlb01lbW9yeVsgaWkgKyAyXSA7Ci0gICAgICAgIHBWQkluZm8tPk1DTEtEYXRhWyBqaiBdLkNMT0NLID0gcFZpZGVvTWVtb3J5WyBpaSArIDMgXSB8ICggcFZpZGVvTWVtb3J5WyBpaSArIDQgXSA8PCA4ICkgOwotICAgICAgICBpaSArPSAweDA1IDsKLSAgICB9Ci0KLSAgICBpaSA9IDB4QjggOwotICAgIGZvciggamogPSAweDAwIDsgamogPCAweDA4IDsgamorKyApCi0gICAgewotICAgICAgICBwVkJJbmZvLT5FQ0xLRGF0YVsgamogXS5TUjJFID0gcFZpZGVvTWVtb3J5WyBpaSBdIDsKLSAgICAgICAgcFZCSW5mby0+RUNMS0RhdGFbIGpqIF0uU1IyRj1wVmlkZW9NZW1vcnlbIGlpICsgMSBdIDsKLSAgICAgICAgcFZCSW5mby0+RUNMS0RhdGFbIGpqIF0uU1IzMD0gcFZpZGVvTWVtb3J5WyBpaSArIDIgXSA7Ci0gICAgICAgIHBWQkluZm8tPkVDTEtEYXRhWyBqaiBdLkNMT0NLPSBwVmlkZW9NZW1vcnlbIGlpICsgMyBdIHwgKCBwVmlkZW9NZW1vcnlbIGlpICsgNCBdIDw8IDggKSA7Ci0gICAgICAgIGlpICs9IDB4MDUgOwotICAgIH0KLQotICAgIC8qIFZvbGFyaSBjdXN0b21pemUgZGF0YSBhcmVhIHN0YXJ0ICovCi0gICAgLyogaWYgKCBDaGlwVHlwZSA9PSBYRzQwICkgKi8KLSAgICBpZiAoIENoaXBUeXBlID49IFhHNDAgKQotICAgIHsKLSAgICAgICAgaWkgPSAweEUwIDsKLSAgICAgICAgZm9yKCBqaiA9IDB4MDAgOyBqaiA8IDB4MDMgOyBqaisrICkKLSAgICAgICAgewotICAgICAgICAgICAgcFZCSW5mby0+U1IxNVsgamogXVsgMCBdID0gcFZpZGVvTWVtb3J5WyBpaSBdIDsJCS8qIFNSMTMsIFNSMTQsIGFuZCBTUjE4ICovCi0gICAgICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyAxIF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgMSBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPlNSMTVbIGpqIF1bIDIgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyAyIF0gOwotICAgICAgICAgICAgcFZCSW5mby0+U1IxNVsgamogXVsgMyBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDMgXSA7Ci0gICAgICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyA0IF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgNCBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPlNSMTVbIGpqIF1bIDUgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyA1IF0gOwotICAgICAgICAgICAgcFZCSW5mby0+U1IxNVsgamogXVsgNiBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDYgXSA7Ci0gICAgICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyA3IF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgNyBdIDsKLSAgICAgICAgICAgIGlpICs9IDB4MDggOwotICAgICAgICB9Ci0gICAgICAgIGlpID0gMHgxMTAgOwotICAgICAgICBqaiA9IDB4MDMgOwotICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyAwIF0gPSBwVmlkZW9NZW1vcnlbIGlpIF0gOwkJLyogU1IxQiAqLwotICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyAxIF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgMSBdIDsKLSAgICAgICAgcFZCSW5mby0+U1IxNVsgamogXVsgMiBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDIgXSA7Ci0gICAgICAgIHBWQkluZm8tPlNSMTVbIGpqIF1bIDMgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyAzIF0gOwotICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyA0IF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgNCBdIDsKLSAgICAgICAgcFZCSW5mby0+U1IxNVsgamogXVsgNSBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDUgXSA7Ci0gICAgICAgIHBWQkluZm8tPlNSMTVbIGpqIF1bIDYgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyA2IF0gOwotICAgICAgICBwVkJJbmZvLT5TUjE1WyBqaiBdWyA3IF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgNyBdIDsKLQotICAgICAgICAqcFZCSW5mby0+cFNSMDcgPSBwVmlkZW9NZW1vcnlbIDB4NzQgXSA7Ci0gICAgICAgICpwVkJJbmZvLT5wU1IxRiA9IHBWaWRlb01lbW9yeVsgMHg3NSBdIDsKLSAgICAgICAgKnBWQkluZm8tPnBTUjIxID0gcFZpZGVvTWVtb3J5WyAweDc2IF0gOwotICAgICAgICAqcFZCSW5mby0+cFNSMjIgPSBwVmlkZW9NZW1vcnlbIDB4NzcgXSA7Ci0gICAgICAgICpwVkJJbmZvLT5wU1IyMyA9IHBWaWRlb01lbW9yeVsgMHg3OCBdIDsKLSAgICAgICAgKnBWQkluZm8tPnBTUjI0ID0gcFZpZGVvTWVtb3J5WyAweDc5IF0gOwotICAgICAgICBwVkJJbmZvLT5TUjI1WyAwIF0gPSBwVmlkZW9NZW1vcnlbIDB4N0EgXSA7Ci0gICAgICAgICpwVkJJbmZvLT5wU1IzMSA9IHBWaWRlb01lbW9yeVsgMHg3QiBdIDsKLSAgICAgICAgKnBWQkluZm8tPnBTUjMyID0gcFZpZGVvTWVtb3J5WyAweDdDIF0gOwotICAgICAgICAqcFZCSW5mby0+cFNSMzMgPSBwVmlkZW9NZW1vcnlbIDB4N0QgXSA7Ci0gICAgICAgIGlpID0gMHhGOCA7Ci0KLSAgICAgICAgZm9yKCBqaiA9IDAgOyBqaiA8IDMgOyBqaisrICkKLSAgICAgICAgewotICAgICAgICAgICAgcFZCSW5mby0+Q1I0MFsgamogXVsgMCBdID0gcFZpZGVvTWVtb3J5WyBpaSBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGpqIF1bIDEgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyAxIF0gOwotICAgICAgICAgICAgcFZCSW5mby0+Q1I0MFsgamogXVsgMiBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDIgXSA7Ci0gICAgICAgICAgICBwVkJJbmZvLT5DUjQwWyBqaiBdWyAzIF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgMyBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGpqIF1bIDQgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyA0IF0gOwotICAgICAgICAgICAgcFZCSW5mby0+Q1I0MFsgamogXVsgNSBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDUgXSA7Ci0gICAgICAgICAgICBwVkJJbmZvLT5DUjQwWyBqaiBdWyA2IF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgNiBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGpqIF1bIDcgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyA3IF0gOwotICAgICAgICAgICAgaWkgKz0gMHgwOCA7Ci0gICAgICAgIH0KLQotICAgICAgICBpaSA9IDB4MTE4IDsKLSAgICAgICAgZm9yKCBqID0gMyA7IGogPCAyNCA7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGogXVsgMCBdID0gcFZpZGVvTWVtb3J5WyBpaSBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGogXVsgMSBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDEgXSA7Ci0gICAgICAgICAgICBwVkJJbmZvLT5DUjQwWyBqIF1bIDIgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyAyIF0gOwotICAgICAgICAgICAgcFZCSW5mby0+Q1I0MFsgaiBdWyAzIF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgMyBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGogXVsgNCBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDQgXSA7Ci0gICAgICAgICAgICBwVkJJbmZvLT5DUjQwWyBqIF1bIDUgXSA9IHBWaWRlb01lbW9yeVsgaWkgKyA1IF0gOwotICAgICAgICAgICAgcFZCSW5mby0+Q1I0MFsgaiBdWyA2IF0gPSBwVmlkZW9NZW1vcnlbIGlpICsgNiBdIDsKLSAgICAgICAgICAgIHBWQkluZm8tPkNSNDBbIGogXVsgNyBdID0gcFZpZGVvTWVtb3J5WyBpaSArIDcgXSA7Ci0gICAgICAgICAgICBpaSArPSAweDA4IDsKLSAgICAgICAgfQotCi0gICAgICAgIGkgPSBwVmlkZW9NZW1vcnlbIDB4MUMwIF0gfCAoIHBWaWRlb01lbW9yeVsgMHgxQzEgXSA8PCA4ICkgOwotCi0gICAgICAgIGZvciggaiA9IDAgOyBqIDwgOCA7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggayA9IDAgOyBrIDwgNCA7IGsrKyApCi0gICAgICAgICAgICAgICAgcFZCSW5mby0+Q1I2QlsgaiBdWyBrIF0gPSBwVmlkZW9NZW1vcnlbIGkgKyA0ICogaiArIGsgXSA7Ci0gICAgICAgIH0KLQotICAgICAgICBpID0gcFZpZGVvTWVtb3J5WyAweDFDMiBdIHwgKCBwVmlkZW9NZW1vcnlbIDB4MUMzIF0gPDwgOCApIDsKLQotICAgICAgICBmb3IoIGogPSAwIDsgaiA8IDggOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIGsgPSAwIDsgayA8IDQgOyBrKysgKQotICAgICAgICAgICAgICAgIHBWQkluZm8tPkNSNkVbIGogXVsgayBdID0gcFZpZGVvTWVtb3J5WyBpICsgNCAqIGogKyBrIF0gOwotICAgICAgICB9Ci0KLSAgICAgICAgaSA9IHBWaWRlb01lbW9yeVsgMHgxQzQgXSB8ICggcFZpZGVvTWVtb3J5WyAweDFDNSBdIDw8IDggKSA7Ci0gICAgICAgIGZvciggaiA9IDAgOyBqIDwgOCA7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggayA9IDAgOyBrIDwgMzIgOyBrKysgKQotICAgICAgICAgICAgICAgIHBWQkluZm8tPkNSNkZbIGogXVsgayBdID0gcFZpZGVvTWVtb3J5WyBpICsgMzIgKiBqICsgayBdIDsKLSAgICAgICAgfQotCi0gICAgICAgIGkgPSBwVmlkZW9NZW1vcnlbIDB4MUM2IF0gfCAoIHBWaWRlb01lbW9yeVsgMHgxQzcgXSA8PCA4ICkgOwotCi0gICAgICAgIGZvciggaiA9IDAgOyBqIDwgOCA7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggayA9IDAgOyBrIDwgMiA7IGsrKyApCi0gICAgICAgICAgICAgICAgcFZCSW5mby0+Q1I4OVsgaiBdWyBrIF0gPSBwVmlkZW9NZW1vcnlbIGkgKyAyICogaiArIGsgXSA7Ci0gICAgICAgIH0KLQotICAgICAgICBpID0gcFZpZGVvTWVtb3J5WyAweDFDOCBdIHwgKCBwVmlkZW9NZW1vcnlbIDB4MUM5IF0gPDwgOCApIDsKLSAgICAgICAgZm9yKCBqID0gMCA7IGogPCAxMiA7IGorKyApCi0gICAgICAgICAgICBwVkJJbmZvLT5BR1BSZWdbIGogXSA9IHBWaWRlb01lbW9yeVsgaSArIGogXSA7Ci0KLSAgICAgICAgaSA9IHBWaWRlb01lbW9yeVsgMHgxQ0YgXSB8ICggcFZpZGVvTWVtb3J5WyAweDFEMCBdIDw8IDggKSA7Ci0gICAgICAgIGZvciggaiA9IDAgOyBqIDwgNCA7IGorKyApCi0gICAgICAgICAgICBwVkJJbmZvLT5TUjE2WyBqIF0gPSBwVmlkZW9NZW1vcnlbIGkgKyBqIF0gOwotCi0gICAgICAgIGlmICggQ2hpcFR5cGUgPT0gWEcyMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwVmlkZW9NZW1vcnlbIDB4NjcgXSAmIDB4ODApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBWQkluZm8tPnBEVk9TZXR0aW5nID0gcFZpZGVvTWVtb3J5WyAweDY3IF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIChwVmlkZW9NZW1vcnlbIDB4NjcgXSAmIDB4QzApID09IDB4QzAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVkJJbmZvLT5wQ1IyRSA9IHBWaWRlb01lbW9yeVsgaSArIDQgXSA7Ci0gICAgICAgICAgICAgICAgKnBWQkluZm8tPnBDUjJGID0gcFZpZGVvTWVtb3J5WyBpICsgNSBdIDsKLSAgICAgICAgICAgICAgICAqcFZCSW5mby0+cENSNDYgPSBwVmlkZW9NZW1vcnlbIGkgKyA2IF0gOwotICAgICAgICAgICAgICAgICpwVkJJbmZvLT5wQ1I0NyA9IHBWaWRlb01lbW9yeVsgaSArIDcgXSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIENoaXBUeXBlID09IFhHMjcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBqaiA9IGkrajsKLSAgICAgICAgICAgIGZvciggaSA9IDAgOyBpIDw9IDB4QiA7IGkrKyxqaisrICkKLSAgICAgICAgICAgICAgcFZCSW5mby0+cENSRDBbaV0gPSBwVmlkZW9NZW1vcnlbIGpqIF0gOwotICAgICAgICAgICAgZm9yKCBpID0gMHgwIDsgaSA8PSAweDEgOyBpKyssamorKyApCi0gICAgICAgICAgICAgIHBWQkluZm8tPnBDUkRFW2ldID0gcFZpZGVvTWVtb3J5WyBqaiBdIDsKLQotICAgICAgICAgICAgKnBWQkluZm8tPnBTUjQwID0gcFZpZGVvTWVtb3J5WyBqaiBdIDsKLSAgICAgICAgICAgIGpqKys7Ci0gICAgICAgICAgICAqcFZCSW5mby0+cFNSNDEgPSBwVmlkZW9NZW1vcnlbIGpqIF0gOwotCi0gICAgICAgICAgICBpZiAocFZpZGVvTWVtb3J5WyAweDY3IF0gJiAweDgwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVkJJbmZvLT5wRFZPU2V0dGluZyA9IHBWaWRlb01lbW9yeVsgMHg2NyBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCAocFZpZGVvTWVtb3J5WyAweDY3IF0gJiAweEMwKSA9PSAweEMwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqaisrOwotICAgICAgICAgICAgICAgICpwVkJJbmZvLT5wQ1IyRSA9IHBWaWRlb01lbW9yeVsgamogXSA7Ci0gICAgICAgICAgICAgICAgKnBWQkluZm8tPnBDUjJGID0gcFZpZGVvTWVtb3J5WyBqaiArIDEgXSA7Ci0gICAgICAgICAgICAgICAgKnBWQkluZm8tPnBDUjQ2ID0gcFZpZGVvTWVtb3J5WyBqaiArIDIgXSA7Ci0gICAgICAgICAgICAgICAgKnBWQkluZm8tPnBDUjQ3ID0gcFZpZGVvTWVtb3J5WyBqaiArIDMgXSA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgICpwVkJJbmZvLT5wQ1JDRiA9IHBWaWRlb01lbW9yeVsgMHgxQ0EgXSA7Ci0gICAgICAgICpwVkJJbmZvLT5wWEdJTmV3X0RSQU1UeXBlRGVmaW5pdGlvbiA9IHBWaWRlb01lbW9yeVsgMHgxQ0IgXSA7Ci0gICAgICAgICpwVkJJbmZvLT5wWEdJTmV3X0kyQ0RlZmluaXRpb24gPSBwVmlkZW9NZW1vcnlbIDB4MUQxIF0gOwotICAgICAgICBpZiAoIENoaXBUeXBlID49IFhHMjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICpwVkJJbmZvLT5wWEdJTmV3X0NSOTcgPSBwVmlkZW9NZW1vcnlbIDB4MUQyIF0gOwotICAgICAgICAgICBpZiAoIENoaXBUeXBlID09IFhHMjcgKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgKnBWQkluZm8tPnBTUjM2ID0gcFZpZGVvTWVtb3J5WyAweDFEMyBdIDsKLSAgICAgICAgICAgICAqcFZCSW5mby0+cENSOEYgPSBwVmlkZW9NZW1vcnlbIDB4MUQ1IF0gOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBWaWRlb01lbW9yeSA9ICh1bnNpZ25lZCBjaGFyICopcFZCSW5mby0+Uk9NQWRkcjsKKyAgICB1bnNpZ25lZCBsb25nICAgaSA7CisgICAgdW5zaWduZWQgY2hhciAgIGosIGsgOwogICAgIC8qIFZvbGFyaSBjdXN0b21pemUgZGF0YSBhcmVhIGVuZCAqLwogCiAgICAgaWYgKCBDaGlwVHlwZSA9PSBYRzIxICkKQEAgLTI5NzIsNyArMjc2MSw4IEBACiAgICAgICAgICAgICAgICAgaSArPSAyNTsKICAgICAgICAgICAgICAgICBqLS07CiAgICAgICAgICAgICAgICAgaysrOwotICAgICAgICAgICAgICB9IHdoaWxlICggKGo+MCkgJiYgKCBrIDwgKHNpemVvZihYR0kyMV9MQ0RDYXBMaXN0KS9zaXplb2YoWEdJMjFfTFZEU0NhcFN0cnVjdCkpICkgKTsKKwkgICAgICB9IHdoaWxlICgoaiA+IDApICYmCisJCSAgICAgICAoayA8IChzaXplb2YoWEdJMjFfTENEQ2FwTGlzdCkvc2l6ZW9mKHN0cnVjdCBYR0kyMV9MVkRTQ2FwU3RydWN0KSkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTMwMDMsNyArMjc5Myw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19ERFIxeF9NUlNfWEcyMCggVUxPTkcgUDNjNCAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfRERSMXhfTVJTX1hHMjAodW5zaWduZWQgbG9uZyBQM2M0LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAKICAgICBYR0lOZXdfU2V0UmVnMSggUDNjNCAsIDB4MTggLCAweDAxICkgOwpAQCAtMzAzOSwxMyArMjgyOSwxMyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3Rlcl9YRzIwKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICkKK3ZvaWQgWEdJTmV3X1NldERSQU1Nb2RlUmVnaXN0ZXJfWEcyMChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbikKIHsKLSAgICBWQl9ERVZJQ0VfSU5GTyBWQklORjsKLSAgICBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyA9ICZWQklORjsKKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gVkJJTkY7CisgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvID0gJlZCSU5GOwogICAgIHBWQkluZm8tPlJPTUFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaXJ0dWFsUm9tQmFzZSA7CiAgICAgcFZCSW5mby0+RkJBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlkZW9NZW1vcnlBZGRyZXNzIDsKLSAgICBwVkJJbmZvLT5CYXNlQWRkciA9IChVTE9ORylId0RldmljZUV4dGVuc2lvbi0+cGpJT0FkZHJlc3MgOworICAgIHBWQkluZm8tPkJhc2VBZGRyID0gKHVuc2lnbmVkIGxvbmcpSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKICAgICBwVkJJbmZvLT5JU1hQRE9TID0gMCA7CiAKICAgICBwVkJJbmZvLT5QM2M0ID0gcFZCSW5mby0+QmFzZUFkZHIgKyAweDE0IDsKQEAgLTMwNzgsMTMgKzI4NjgsMTMgQEAKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MUIgLCAweDAzICkgOwogfQogCi12b2lkIFhHSU5ld19TZXREUkFNTW9kZVJlZ2lzdGVyX1hHMjcoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gKQordm9pZCBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3Rlcl9YRzI3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uKQogewotICAgIFZCX0RFVklDRV9JTkZPIFZCSU5GOwotICAgIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvID0gJlZCSU5GOworICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyBWQklORjsKKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8gPSAmVkJJTkY7CiAgICAgcFZCSW5mby0+Uk9NQWRkciA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlIDsKICAgICBwVkJJbmZvLT5GQkFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaWRlb01lbW9yeUFkZHJlc3MgOwotICAgIHBWQkluZm8tPkJhc2VBZGRyID0gKFVMT05HKUh3RGV2aWNlRXh0ZW5zaW9uLT5waklPQWRkcmVzcyA7CisgICAgcFZCSW5mby0+QmFzZUFkZHIgPSAodW5zaWduZWQgbG9uZylId0RldmljZUV4dGVuc2lvbi0+cGpJT0FkZHJlc3MgOwogICAgIHBWQkluZm8tPklTWFBET1MgPSAwIDsKIAogICAgIHBWQkluZm8tPlAzYzQgPSBwVkJJbmZvLT5CYXNlQWRkciArIDB4MTQgOwpAQCAtMzEyMCwxMyArMjkxMCwxMiBAQAogCiB9CiAvKgotdm9pZCBYR0lOZXdfU2V0RFJBTU1vZGVSZWdpc3Rlcl9YRzI3KCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICkKK3ZvaWQgWEdJTmV3X1NldERSQU1Nb2RlUmVnaXN0ZXJfWEcyNyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbikKIHsKLSNpZm5kZWYgTElOVVhfWEY4NgotICAgIFVDSEFSIGRhdGEgOwotI2VuZGlmCi0gICAgVkJfREVWSUNFX0lORk8gVkJJTkY7Ci0gICAgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gPSAmVkJJTkY7CisKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGEgOworICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyBWQklORjsKKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8gPSAmVkJJTkY7CiAgICAgcFZCSW5mby0+Uk9NQWRkciA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlIDsKICAgICBwVkJJbmZvLT5GQkFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaWRlb01lbW9yeUFkZHJlc3MgOwogICAgIHBWQkluZm8tPkJhc2VBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKQEAgLTMxNjgsOSArMjk1Nyw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0Noa1NlbnNlU3RhdHVzICggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfQ2hrU2Vuc2VTdGF0dXMoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4PTAgLCB0ZW1wICwgdGVtcGN4ICwgQ1IzQ0RhdGE7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4ID0gMCwgdGVtcCwgdGVtcGN4LCBDUjNDRGF0YTsKIAogICAgIHRlbXAgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MzIgKSA7CiAKQEAgLTMyMjksOSArMzAxOCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1NldE1vZGVTY3JhdGNoICggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJTmV3X1NldE1vZGVTY3JhdGNoKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXAgLCB0ZW1wY2wgPSAwICwgdGVtcGNoID0gMCAsIENSMzFEYXRhICwgQ1IzOERhdGE7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCAsIHRlbXBjbCA9IDAgLCB0ZW1wY2ggPSAwICwgQ1IzMURhdGEgLCBDUjM4RGF0YTsKIAogICAgIHRlbXAgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4M2QgKSA7CiAgICAgdGVtcCB8PSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4M2UgKSA8PCA4IDsKQEAgLTMzMjYsMjMgKzMxMTUsMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfR2V0WEcyMVNlbnNlKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfR2V0WEcyMVNlbnNlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgVGVtcDsKLSAgICBQVUNIQVIgIHZvbGF0aWxlIHBWaWRlb01lbW9yeSA9ICggUFVDSEFSIClwVkJJbmZvLT5ST01BZGRyIDsKKyAgICB1bnNpZ25lZCBjaGFyIFRlbXA7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcFZpZGVvTWVtb3J5ID0gKHVuc2lnbmVkIGNoYXIgKilwVkJJbmZvLT5ST01BZGRyOwogCiAgICAgcFZCSW5mby0+SUZfREVGX0xWRFMgPSAwIDsKIAotI2lmZGVmIFdJTjIwMDAKLSAgIHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPSAwIDsKLSAgICBpZiAoICggcFZpZGVvTWVtb3J5WyAweDY1IF0gJiAweDAyICkgKQkJCS8qIEZvciBYRzIxIENINzAwNyAqLwotICAgIHsKLSAgICAgICAgLyogVmlkZW9EZWJ1Z1ByaW50KCgwLCAiUmVhZFZCSU9TVGFibERhdGE6IHBWaWRlb01lbW9yeVsgMHg2NSBdID0leFxuIixwVmlkZW9NZW1vcnlbIDB4NjUgXSkpOyAqLwotICAgICAgICBwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID0gMSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtCaWxseV0gMDcvMDUvMDMgKi8KLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QM2Q0ICwgMHgzOCAsIH4weEUwICwgMHg2MCApIDsgLyogQ0g3MDA3IG9uIGNoaXAgKi8KLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCiAjaWYgMQogICAgIGlmICgoIHBWaWRlb01lbW9yeVsgMHg2NSBdICYgMHgwMSApICkJCQkvKiBGb3IgWEcyMSBMVkRTICovCiAgICAgewpAQCAtMzM3OCw5ICszMTU3LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfR2V0WEcyN1NlbnNlKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lOZXdfR2V0WEcyN1NlbnNlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgVGVtcCxiQ1I0QTsKKwl1bnNpZ25lZCBjaGFyIFRlbXAsIGJDUjRBOwogCiAgICAgIHBWQkluZm8tPklGX0RFRl9MVkRTID0gMCA7CiAgICAgIGJDUjRBID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDRBICkgOwpAQCAtMzQwMiw5ICszMTgxLDkgQEAKIAogfQogCi1VQ0hBUiBHZXRYRzIxRlBCaXRzKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordW5zaWduZWQgY2hhciBHZXRYRzIxRlBCaXRzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiBDUjM4LENSNEEsdGVtcDsKKwl1bnNpZ25lZCBjaGFyIENSMzgsIENSNEEsIHRlbXA7CiAKICAgICBDUjRBID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDRBICkgOwogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNkNCAsIDB4NEEgLCB+MHgxMCAsIDB4MTAgKSA7IC8qIGVuYWJsZSBHUElPRSByZWFkICovCkBAIC0zNDIyLDkgKzMyMDEsOSBAQAogICAgIHJldHVybiB0ZW1wOwogfQogCi1VQ0hBUiBHZXRYRzI3RlBCaXRzKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordW5zaWduZWQgY2hhciBHZXRYRzI3RlBCaXRzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiBDUjRBLHRlbXA7CisJdW5zaWduZWQgY2hhciBDUjRBLCB0ZW1wOwogCiAgICAgQ1I0QSA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHg0QSApIDsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDRBICwgfjB4MDMgLCAweDAzICkgOyAvKiBlbmFibGUgR1BJT0EvQi9DIHJlYWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9pbml0LmggYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfaW5pdC5oCmluZGV4IDFmMzlkOWMuLmI0NzM1MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9pbml0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2luaXQuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgIF9WQklOSVRfCiAjZGVmaW5lICBfVkJJTklUXwotZXh0ZXJuICAgQk9PTEVBTiAgICBYR0lJbml0TmV3KCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICkgOwotZXh0ZXJuIFhHSTIxX0xWRFNDYXBTdHJ1Y3QgIFhHSTIxX0xDRENhcExpc3RbMTNdOworZXh0ZXJuICAgdW5zaWduZWQgY2hhciAgICBYR0lJbml0TmV3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uKSA7CitleHRlcm4gc3RydWN0IFhHSTIxX0xWRFNDYXBTdHJ1Y3QgIFhHSTIxX0xDRENhcExpc3RbMTNdOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKaW5kZXggYmQ3ZjczOC4uZDkwYmYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCkBAIC0xLDQzICsxLDkgQEAKLSNpbmNsdWRlICJvc2RlZi5oIgogCi0jaWZkZWYgVEMKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0jZW5kaWYKLQotCi0jaWZkZWYgTElOVVhfWEY4NgotI2luY2x1ZGUgInhmODYuaCIKLSNpbmNsdWRlICJ4Zjg2UGNpSW5mby5oIgotI2luY2x1ZGUgInhnaS5oIgotI2luY2x1ZGUgInhnaV9yZWdzLmgiCi0jZW5kaWYKLQotI2lmZGVmIExJTlVYX0tFUk5FTAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgIlhHSWZiLmgiCi0vKiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaW5jbHVkZSA8dmlkZW8vWEdJZmIuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvWEdJZmIuaD4KLSNlbmRpZiovCi0jZW5kaWYKIAotI2lmZGVmIFdJTjIwMDAKLSNpbmNsdWRlIDxkZGVycm9yLmg+Ci0jaW5jbHVkZSA8ZGV2aW9jdGwuaD4KLSNpbmNsdWRlIDxtaW5pcG9ydC5oPgotI2luY2x1ZGUgPG50ZGR2ZGVvLmg+Ci0jaW5jbHVkZSA8dmlkZW8uaD4KLQotI2luY2x1ZGUgInhnaXYuaCIKLSNpbmNsdWRlICJkZF9pMmMuaCIKLSNpbmNsdWRlICJ0b29scy5oIgotI2VuZGlmCiAKICNpbmNsdWRlICJ2Yl9kZWYuaCIKICNpbmNsdWRlICJ2Z2F0eXBlcy5oIgpAQCAtNTQsMTk0ICsyMCwyMTggQEAKIAogCiAKLUJPT0xFQU4gIFhHSV9Jc0xDRER1YWxMaW5rKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLUJPT0xFQU4gIFhHSV9TZXRDUlQyR3JvdXAzMDEoVVNIT1JUIE1vZGVObywgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1CT09MRUFOICBYR0lfQmFja2xpZ2h0QnlEcnYoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwordW5zaWduZWQgY2hhciAgWEdJX0lzTENERHVhbExpbmsoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIGNoYXIgIFhHSV9TZXRDUlQyR3JvdXAzMDEodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICAgICBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIGNoYXIgIFhHSV9CYWNrbGlnaHRCeURydihzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwogCi1CT09MRUFOICBYR0lfSXNMQ0RPTihQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1CT09MRUFOICBYR0lfRGlzYWJsZUNoSVNMQ0QoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotQk9PTEVBTiAgWEdJX0VuYWJsZUNoSVNMQ0QoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotQk9PTEVBTiAgWEdJX0FqdXN0Q1JUMlJhdGUoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxVU0hPUlQgKmksIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLUJPT0xFQU4gIFhHSV9TZWFyY2hNb2RlSUQoIFVTSE9SVCBNb2RlTm8sVVNIT1JUICAqTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLUJPT0xFQU4gIFhHSV9HZXRMQ0RJbmZvKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1CT09MRUFOICBYR0lTZXRNb2RlTmV3KCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgVVNIT1JUIE1vZGVObyApIDsKLUJPT0xFQU4gIFhHSV9CcmlkZ2VJc09uKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLVVDSEFSICAgIFhHSV9HZXRNb2RlUHRyKCBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1VU0hPUlQgICBYR0lfR2V0T2Zmc2V0KFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1VU0hPUlQgICBYR0lfR2V0UmF0ZVB0ckNSVDIoIFBYR0lfSFdfREVWSUNFX0lORk8gcFhHSUhXREUsIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICk7Ci1VU0hPUlQgICBYR0lfR2V0UmVzSW5mbyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotVVNIT1JUICAgWEdJX0dldENvbG9yRGVwdGgoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotVVNIT1JUICAgWEdJX0dldFZHQUhUMihQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1VU0hPUlQgICBYR0lfR2V0VkNMSzJQdHIoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9WQkxvbmdXYWl0KFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TYXZlQ1JUMkluZm8oVVNIT1JUIE1vZGVObywgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX0dldENSVDJEYXRhKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9HZXRDUlQyUmVzSW5mbyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1ByZVNldEdyb3VwMShVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0R3JvdXAxKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRMb2NrUmVncyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0TENEUmVncyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0R3JvdXAyKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldEdyb3VwMyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldEdyb3VwNChVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRHcm91cDUoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQqICAgIFhHSV9HZXRMY2RQdHIoVVNIT1JUIEJYLCAgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkKiAgICBYR0lfR2V0VFZQdHIoVVNIT1JUIEJYLCBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkIAkgWEdJX0ZpcmVQV0RFbmFibGUoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAJIFhHSV9FbmFibGVHYXRpbmdDUlQoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAJIFhHSV9EaXNhYmxlR2F0aW5nQ1JUKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgCSBYR0lfU2V0UGFuZWxEZWxheShVU0hPUlQgdGVtcGJsLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkIAkgWEdJX1NldFBhbmVsUG93ZXIoVVNIT1JUIHRlbXBhaCxVU0hPUlQgdGVtcGJsLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkIAkgWEdJX0VuYWJsZVBXRCggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAJIFhHSV9EaXNhYmxlUFdEKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfQXV0b1RocmVzaG9sZCggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldFRhcDRSZWdzKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyICBYR0lfSXNMQ0RPTihzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciAgWEdJX0Rpc2FibGVDaElTTENEKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyICBYR0lfRW5hYmxlQ2hJU0xDRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciAgWEdJX0FqdXN0Q1JUMlJhdGUodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCQkgICB1bnNpZ25lZCBzaG9ydCAqaSwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIGNoYXIgIFhHSV9TZWFyY2hNb2RlSUQodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICB1bnNpZ25lZCBzaG9ydCAqTW9kZUlkSW5kZXgsCisJCQkgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyICBYR0lfR2V0TENESW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyICBYR0lTZXRNb2RlTmV3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkgICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vKTsKK3Vuc2lnbmVkIGNoYXIgIFhHSV9CcmlkZ2VJc09uKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyICAgIFhHSV9HZXRNb2RlUHRyKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRPZmZzZXQodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCSAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkJICAgICBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRSYXRlUHRyQ1JUMihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpwWEdJSFdERSwKKwkJCQkgIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQkgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJCSAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRSZXNJbmZvKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRDb2xvckRlcHRoKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQkgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBzaG9ydCBYR0lfR2V0VkdBSFQyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBzaG9ydCBYR0lfR2V0VkNMSzJQdHIodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJCSAgICAgICBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCSAgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1ZCTG9uZ1dhaXQoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TYXZlQ1JUMkluZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0dldENSVDJEYXRhKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9HZXRDUlQyUmVzSW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1ByZVNldEdyb3VwMSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldEdyb3VwMSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldExvY2tSZWdzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0TENEUmVncyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldEdyb3VwMih1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldEdyb3VwMyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldEdyb3VwNCh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldEdyb3VwNSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgKlhHSV9HZXRMY2RQdHIodW5zaWduZWQgc2hvcnQgQlgsICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICAqWEdJX0dldFRWUHRyKHVuc2lnbmVkIHNob3J0IEJYLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfRmlyZVBXREVuYWJsZShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0VuYWJsZUdhdGluZ0NSVChzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9EaXNhYmxlR2F0aW5nQ1JUKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldFBhbmVsRGVsYXkodW5zaWduZWQgc2hvcnQgdGVtcGJsLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldFBhbmVsUG93ZXIodW5zaWduZWQgc2hvcnQgdGVtcGFoLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYmwsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfRW5hYmxlUFdEKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfRGlzYWJsZVBXRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0F1dG9UaHJlc2hvbGQoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRUYXA0UmVncyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwogCi12b2lkICAgICBYR0lfRGlzcGxheU9uKFBYR0lfSFdfREVWSUNFX0lORk8sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9EaXNwbGF5T2ZmKCBQWEdJX0hXX0RFVklDRV9JTkZPLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotdm9pZCAgICAgWEdJX1NldENSVDFHcm91cChQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRYRzIxQ1JUQyhVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRYRzIxTENEKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvLFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsVVNIT1JUIE1vZGVObyk7Ci12b2lkICAgICBYR0lfU2V0WEcyN0NSVEMoVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0WEcyN0xDRChQVkJfREVWSUNFX0lORk8gcFZCSW5mbyxVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFVTSE9SVCBNb2RlTm8pOwotdm9pZAkgWEdJX1VwZGF0ZVhHMjFDUlRDKFVTSE9SVCBNb2RlTm8sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4KTsKLXZvaWQgICAgIFhHSV9XYWl0RGlzcGx5KFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZW5zZUNSVDEoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldFNlcVJlZ3MoVVNIT1JUIE1vZGVObyxVU0hPUlQgU3RhbmRUYWJsZUluZGV4LFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0TWlzY1JlZ3MoVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldENSVENSZWdzKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldEFUVFJlZ3MoVVNIT1JUIE1vZGVObyxVU0hPUlQgU3RhbmRUYWJsZUluZGV4LFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotdm9pZCAgICAgWEdJX1NldEdSQ1JlZ3MoVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX0NsZWFyRXh0MVJlZ3MoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwordm9pZCAgICAgWEdJX0Rpc3BsYXlPbihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfRGlzcGxheU9mZihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0Q1JUMUdyb3VwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldFhHMjFDUlRDKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRYRzIxTENEKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pOwordm9pZCAgICAgWEdJX1NldFhHMjdDUlRDKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRYRzI3TENEKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pOwordm9pZAkgWEdJX1VwZGF0ZVhHMjFDUlRDKHVuc2lnbmVkIHNob3J0IE1vZGVObywgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvLCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgpOwordm9pZCAgICAgWEdJX1dhaXREaXNwbHkoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZW5zZUNSVDEoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRTZXFSZWdzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4LCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRNaXNjUmVncyh1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0Q1JUQ1JlZ3Moc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRBVFRSZWdzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4LCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRHUkNSZWdzKHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9DbGVhckV4dDFSZWdzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CiAKLXZvaWQgICAgIFhHSV9TZXRTeW5jKFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldENSVDFDUlRDKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8sUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbik7Ci12b2lkICAgICBYR0lfU2V0Q1JUMVRpbWluZ19IKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvLFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24pOwotdm9pZCAgICAgWEdJX1NldENSVDFUaW1pbmdfVihVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIE1vZGVObyxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0Q1JUMURFKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0Q1JUMVZDTEsoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0Q1JUMUZJRk8oVVNIT1JUIE1vZGVObyxQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0Q1JUMU1vZGVSZWdzKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0VkNMS1N0YXRlKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sVVNIT1JUIE1vZGVObyxVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRTeW5jKHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRDUlQxQ1JUQyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24pOwordm9pZCAgICAgWEdJX1NldENSVDFUaW1pbmdfSChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8sIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uKTsKK3ZvaWQgICAgIFhHSV9TZXRDUlQxVGltaW5nX1YodW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRDUlQxREUoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRDUlQxVkNMSyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldENSVDFGSUZPKHVuc2lnbmVkIHNob3J0IE1vZGVObywgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0Q1JUMU1vZGVSZWdzKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0VkNMS1N0YXRlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKIAotdm9pZCAgICAgWEdJX0xvYWREQUMoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1dyaXRlREFDKFVTSE9SVCBkbCwgVVNIT1JUIGFoLCBVU0hPUlQgYWwsIFVTSE9SVCBkaCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotLyp2b2lkICAgICBYR0lfQ2xlYXJCdWZmZXIoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgTW9kZU5vLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsqLwotdm9pZCAgICAgWEdJX1NldExDREFHcm91cChVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0TFZEU1Jlc0luZm8oIFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0TFZEU0RhdGEoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQVkJfREVWSUNFX0lORk8gIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX01vZENSVDFSZWdzKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixQVkJfREVWSUNFX0lORk8gIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldExWRFNSZWdzKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9VcGRhdGVNb2RlSW5mbyhQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0VkdBVHlwZShQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0VkJUeXBlKFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0VkJJbmZvKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9HZXRUVkluZm8oVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRDUlQyRUNMSyggVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQVkJfREVWSUNFX0lORk8gIHBWQkluZm8pOwotdm9pZCAgICAgSW5pdFRvMzMwUG9pbnRlcihVQ0hBUixQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0TENEU3luYyhVU0hPUlQqIEhTeW5jV2lkdGgsIFVTSE9SVCogVlN5bmNXaWR0aCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAJIFhHSV9EaXNhYmxlQnJpZGdlKFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgIAkgWEdJX0VuYWJsZUJyaWRnZShQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0Q1JUMlZDTEsoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX09FTTMxMFNldHRpbmcoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXREZWxheUNvbXAoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldExDRENhcChQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0TENEQ2FwX0EoVVNIT1JUIHRlbXBjeCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0TENEQ2FwX0IoVVNIT1JUIHRlbXBjeCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBTZXRTcGVjdHJ1bShQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0QW50aUZsaWNrZXIoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRFZGdlRW5oYW5jZShVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1NldFBoYXNlSW5jcihQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0WUZpbHRlcihVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX0dldFRWUHRySW5kZXgyKFVTSE9SVCogdGVtcGJ4LFVDSEFSKiB0ZW1wY2wsVUNIQVIqIHRlbXBjaCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotVVNIT1JUICAgWEdJX0dldFRWUHRySW5kZXgoICBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotdm9pZCAgICAgWEdJX1NldENSVDJNb2RlUmVncyhVU0hPUlQgTW9kZU5vLFBYR0lfSFdfREVWSUNFX0lORk8sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICk7Ci12b2lkICAgICBYR0lfQ2xvc2VDUlRDKFBYR0lfSFdfREVWSUNFX0lORk8sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9PcGVuQ1JUQyhQWEdJX0hXX0RFVklDRV9JTkZPLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0UkFNREFDMkRBVEEoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1VuTG9ja0NSVDIoUFhHSV9IV19ERVZJQ0VfSU5GTywgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX0xvY2tDUlQyKFBYR0lfSFdfREVWSUNFX0lORk8sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSU5ld19FbmFibGVDUlQyKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSU5ld19MQ0RfV2FpdF9UaW1lKFVDSEFSIERlbGF5VGltZSwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX0xvbmdXYWl0KFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9TZXRDUlQxT2Zmc2V0KCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCAsIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKTsKLXZvaWQgICAgIFhHSV9HZXRMQ0RWQ0xLUHRyKFVDSEFSKiBkaV8wLFVDSEFSICpkaV8xLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1VQ0hBUiAgICBYR0lfR2V0VkNMS1B0cihVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfR2V0VkNMS0xlbihVQ0hBUiB0ZW1wYWwsVUNIQVIqIGRpXzAsVUNIQVIqIGRpXzEsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLVVTSE9SVCAgIFhHSV9HZXRMQ0RDYXBQdHIoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotVVNIT1JUICAgWEdJX0dldExDRENhcFB0cjEoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0KiBYR0lfR2V0VGFwNFB0cihVU0hPUlQgdGVtcGN4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0WEcyMUZQQml0cyhQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfU2V0WEcyN0ZQQml0cyhQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1VQ0hBUiAgICBYR0lfWEcyMUdldFBTQ1ZhbHVlKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLVVDSEFSICAgIFhHSV9YRzI3R2V0UFNDVmFsdWUoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotdm9pZCAgICAgWEdJX1hHMjFCTFNpZ25hbFZERChVU0hPUlQgdGVtcGJoLFVTSE9SVCB0ZW1wYmwsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLXZvaWQgICAgIFhHSV9YRzI3QkxTaWduYWxWREQoVVNIT1JUIHRlbXBiaCxVU0hPUlQgdGVtcGJsLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci12b2lkICAgICBYR0lfWEcyMVNldFBhbmVsRGVsYXkoVVNIT1JUIHRlbXBibCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotQk9PTEVBTiAgWEdJX1hHMjFDaGVja0xWRFNNb2RlKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotdm9pZCAgICAgWEdJX1NldFhHMjFMVkRTUGFyYShVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKTsKLXZvaWQgICAgIFhHSV9TZXRYRzI3TFZEU1BhcmEoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICk7Ci1VQ0hBUiAgICBYR0lfU2V0RGVmYXVsdFZDTEsoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICk7Cit2b2lkICAgICBYR0lfTG9hZERBQyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1dyaXRlREFDKHVuc2lnbmVkIHNob3J0IGRsLCB1bnNpZ25lZCBzaG9ydCBhaCwgdW5zaWduZWQgc2hvcnQgYWwsIHVuc2lnbmVkIHNob3J0IGRoLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOworLyp2b2lkICAgICBYR0lfQ2xlYXJCdWZmZXIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHVuc2lnbmVkIHNob3J0IE1vZGVObywgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsqLwordm9pZCAgICAgWEdJX1NldExDREFHcm91cCh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9HZXRMVkRTUmVzSW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfR2V0TFZEU0RhdGEodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX01vZENSVDFSZWdzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkJIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0TFZEU1JlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1VwZGF0ZU1vZGVJbmZvKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0dldFZHQVR5cGUoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfR2V0VkJUeXBlKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfR2V0VkJJbmZvKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0dldFRWSW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldENSVDJFQ0xLKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIEluaXRUbzMzMFBvaW50ZXIodW5zaWduZWQgY2hhciwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9HZXRMQ0RTeW5jKHVuc2lnbmVkIHNob3J0ICpIU3luY1dpZHRoLCB1bnNpZ25lZCBzaG9ydCAqVlN5bmNXaWR0aCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9EaXNhYmxlQnJpZGdlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0VuYWJsZUJyaWRnZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRDUlQyVkNMSyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfT0VNMzEwU2V0dGluZyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldERlbGF5Q29tcChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldExDRENhcChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldExDRENhcF9BKHVuc2lnbmVkIHNob3J0IHRlbXBjeCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRMQ0RDYXBfQih1bnNpZ25lZCBzaG9ydCB0ZW1wY3gsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBTZXRTcGVjdHJ1bShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldEFudGlGbGlja2VyKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0RWRnZUVuaGFuY2UodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRQaGFzZUluY3Ioc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRZRmlsdGVyKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfR2V0VFZQdHJJbmRleDIodW5zaWduZWQgc2hvcnQgKnRlbXBieCwgdW5zaWduZWQgY2hhciogdGVtcGNsLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKnRlbXBjaCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0ICAgWEdJX0dldFRWUHRySW5kZXgoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRDUlQyTW9kZVJlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfQ2xvc2VDUlRDKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9PcGVuQ1JUQyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfR2V0UkFNREFDMkRBVEEodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1VuTG9ja0NSVDIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX0xvY2tDUlQyKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSU5ld19FbmFibGVDUlQyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lOZXdfTENEX1dhaXRfVGltZSh1bnNpZ25lZCBjaGFyIERlbGF5VGltZSwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9Mb25nV2FpdChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldENSVDFPZmZzZXQodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9HZXRMQ0RWQ0xLUHRyKHVuc2lnbmVkIGNoYXIgKmRpXzAsIHVuc2lnbmVkIGNoYXIgKmRpXzEsCisJCQkgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciAgICBYR0lfR2V0VkNMS1B0cih1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCQkJdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfR2V0VkNMS0xlbih1bnNpZ25lZCBjaGFyIHRlbXBhbCwgdW5zaWduZWQgY2hhciAqZGlfMCwKKwkJCXVuc2lnbmVkIGNoYXIgKmRpXzEsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBzaG9ydCAgIFhHSV9HZXRMQ0RDYXBQdHIoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIHNob3J0ICAgWEdJX0dldExDRENhcFB0cjEoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3N0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgKlhHSV9HZXRUYXA0UHRyKHVuc2lnbmVkIHNob3J0IHRlbXBjeCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9TZXRYRzIxRlBCaXRzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfU2V0WEcyN0ZQQml0cyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciAgICBYR0lfWEcyMUdldFBTQ1ZhbHVlKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit1bnNpZ25lZCBjaGFyICAgIFhHSV9YRzI3R2V0UFNDVmFsdWUoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3ZvaWQgICAgIFhHSV9YRzIxQkxTaWduYWxWREQodW5zaWduZWQgc2hvcnQgdGVtcGJoLCB1bnNpZ25lZCBzaG9ydCB0ZW1wYmwsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7Cit2b2lkICAgICBYR0lfWEcyN0JMU2lnbmFsVkREKHVuc2lnbmVkIHNob3J0IHRlbXBiaCwgdW5zaWduZWQgc2hvcnQgdGVtcGJsLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1hHMjFTZXRQYW5lbERlbGF5KHVuc2lnbmVkIHNob3J0IHRlbXBibCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK3Vuc2lnbmVkIGNoYXIgIFhHSV9YRzIxQ2hlY2tMVkRTTW9kZSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldFhHMjFMVkRTUGFyYSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordm9pZCAgICAgWEdJX1NldFhHMjdMVkRTUGFyYSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwordW5zaWduZWQgY2hhciAgWEdJX1NldERlZmF1bHRWQ0xLKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CiAKLWV4dGVybiAgIHZvaWQgCSAgUmVhZFZCSU9TVGFibERhdGEoIFVDSEFSIENoaXBUeXBlICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotI2lmZGVmIFdJTjIwMDAKLS8qIFtCaWxseV0gMjAwNy8wNS8xNyBGb3IgQ0g3MDA3ICovCi1leHRlcm4gIFVDSEFSIENINzAwN1RWUmVnX1VOVFNDW11bOF0sQ0g3MDA3VFZSZWdfT05UU0NbXVs4XSxDSDcwMDdUVlJlZ19VUEFMW11bOF0sQ0g3MDA3VFZSZWdfT1BBTFtdWzhdOwotZXh0ZXJuICBVQ0hBUiBDSDcwMDdUVkNSVDFVTlRTQ19IW11bMTBdLENINzAwN1RWQ1JUMU9OVFNDX0hbXVsxMF0sQ0g3MDA3VFZDUlQxVVBBTF9IW11bMTBdLENINzAwN1RWQ1JUMU9QQUxfSFtdWzEwXSA7Ci1leHRlcm4gIFVDSEFSIENINzAwN1RWQ1JUMVVOVFNDX1ZbXVsxMF0sQ0g3MDA3VFZDUlQxT05UU0NfVltdWzEwXSxDSDcwMDdUVkNSVDFVUEFMX1ZbXVsxMF0sQ0g3MDA3VFZDUlQxT1BBTF9WW11bMTBdIDsKLWV4dGVybiAgVUNIQVIgWEdJNzAwN19DSFRWVkNMS1VOVFNDW10sWEdJNzAwN19DSFRWVkNMS09OVFNDW10sWEdJNzAwN19DSFRWVkNMS1VQQUxbXSxYR0k3MDA3X0NIVFZWQ0xLT1BBTFtdOworZXh0ZXJuIHZvaWQgUmVhZFZCSU9TVGFibERhdGEodW5zaWduZWQgY2hhciBDaGlwVHlwZSwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKIAotZXh0ZXJuICBCT09MRUFOIFhHSV9YRzIxQ2hlY2tDSDcwMDdUVk1vZGUoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkgOwotZXh0ZXJuICB2b2lkIFNldENINzAwN1JlZ3MoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gIHBWQkluZm8gKSA7Ci1leHRlcm4gIFZQX1NUQVRVUyBUdXJuT25DSDcwMDcoUEhXX0RFVklDRV9FWFRFTlNJT04gcEhXREUpIDsKLWV4dGVybiAgVlBfU1RBVFVTIFR1cm5PZmZDSDcwMDcoUEhXX0RFVklDRV9FWFRFTlNJT04gcEhXREUpIDsKLWV4dGVybiAgQk9PTEVBTiBJc0NINzAwN1RWTW9kZShQVkJfREVWSUNFX0lORk8gcFZCSW5mbykgOwotI2VuZGlmCi0KLS8qIFVTSE9SVCBYR0lOZXdfZmxhZ19jbGVhcmJ1ZmZlcjsgMDogbm8gY2xlYXIgZnJhbWUgYnVmZmVyIDE6Y2xlYXIgZnJhbWUgYnVmZmVyICovCisvKiB1bnNpZ25lZCBzaG9ydCBYR0lOZXdfZmxhZ19jbGVhcmJ1ZmZlcjsgMDogbm8gY2xlYXIgZnJhbWUgYnVmZmVyIDE6Y2xlYXIgZnJhbWUgYnVmZmVyICovCiAKIAordW5zaWduZWQgc2hvcnQgWEdJTmV3X01EQV9EQUNbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsCisJMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwKKwkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwKKwkweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LAorCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0Z9OwogCit1bnNpZ25lZCBzaG9ydCBYR0lOZXdfQ0dBX0RBQ1tdID0geworCTB4MDAsIDB4MTAsIDB4MDQsIDB4MTQsIDB4MDEsIDB4MTEsIDB4MDksIDB4MTUsCisJMHgwMCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgxNSwKKwkweDJBLCAweDNBLCAweDJFLCAweDNFLCAweDJCLCAweDNCLCAweDJGLCAweDNGLAorCTB4MkEsIDB4M0EsIDB4MkUsIDB4M0UsIDB4MkIsIDB4M0IsIDB4MkYsIDB4M0YsCisJMHgwMCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgxNSwKKwkweDAwLCAweDEwLCAweDA0LCAweDE0LCAweDAxLCAweDExLCAweDA5LCAweDE1LAorCTB4MkEsIDB4M0EsIDB4MkUsIDB4M0UsIDB4MkIsIDB4M0IsIDB4MkYsIDB4M0YsCisJMHgyQSwgMHgzQSwgMHgyRSwgMHgzRSwgMHgyQiwgMHgzQiwgMHgyRiwgMHgzRn07CiAKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19FR0FfREFDW10gPSB7CisJMHgwMCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwMSwgMHgxMSwgMHgwNSwgMHgxNSwKKwkweDIwLCAweDMwLCAweDI0LCAweDM0LCAweDIxLCAweDMxLCAweDI1LCAweDM1LAorCTB4MDgsIDB4MTgsIDB4MEMsIDB4MUMsIDB4MDksIDB4MTksIDB4MEQsIDB4MUQsCisJMHgyOCwgMHgzOCwgMHgyQywgMHgzQywgMHgyOSwgMHgzOSwgMHgyRCwgMHgzRCwKKwkweDAyLCAweDEyLCAweDA2LCAweDE2LCAweDAzLCAweDEzLCAweDA3LCAweDE3LAorCTB4MjIsIDB4MzIsIDB4MjYsIDB4MzYsIDB4MjMsIDB4MzMsIDB4MjcsIDB4MzcsCisJMHgwQSwgMHgxQSwgMHgwRSwgMHgxRSwgMHgwQiwgMHgxQiwgMHgwRiwgMHgxRiwKKwkweDJBLCAweDNBLCAweDJFLCAweDNFLCAweDJCLCAweDNCLCAweDJGLCAweDNGfTsKIAotVVNIT1JUIFhHSU5ld19NREFfREFDW109ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgICAgICAgICAgIDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwKLSAgICAgICAgICAgICAgIDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwKLSAgICAgICAgICAgICAgIDB4M0YsMHgzRiwweDNGLDB4M0YsMHgzRiwweDNGLDB4M0YsMHgzRiwKLSAgICAgICAgICAgICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLSAgICAgICAgICAgICAgIDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwKLSAgICAgICAgICAgICAgIDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwKLSAgICAgICAgICAgICAgIDB4M0YsMHgzRiwweDNGLDB4M0YsMHgzRiwweDNGLDB4M0YsMHgzRn07Ci0KLVVTSE9SVCBYR0lOZXdfQ0dBX0RBQ1tdPXsweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA5LDB4MTUsCi0gICAgICAgICAgICAgICAweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA5LDB4MTUsCi0gICAgICAgICAgICAgICAweDJBLDB4M0EsMHgyRSwweDNFLDB4MkIsMHgzQiwweDJGLDB4M0YsCi0gICAgICAgICAgICAgICAweDJBLDB4M0EsMHgyRSwweDNFLDB4MkIsMHgzQiwweDJGLDB4M0YsCi0gICAgICAgICAgICAgICAweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA5LDB4MTUsCi0gICAgICAgICAgICAgICAweDAwLDB4MTAsMHgwNCwweDE0LDB4MDEsMHgxMSwweDA5LDB4MTUsCi0gICAgICAgICAgICAgICAweDJBLDB4M0EsMHgyRSwweDNFLDB4MkIsMHgzQiwweDJGLDB4M0YsCi0gICAgICAgICAgICAgICAweDJBLDB4M0EsMHgyRSwweDNFLDB4MkIsMHgzQiwweDJGLDB4M0Z9OwotCi1VU0hPUlQgWEdJTmV3X0VHQV9EQUNbXT17MHgwMCwweDEwLDB4MDQsMHgxNCwweDAxLDB4MTEsMHgwNSwweDE1LAotICAgICAgICAgICAgICAgMHgyMCwweDMwLDB4MjQsMHgzNCwweDIxLDB4MzEsMHgyNSwweDM1LAotICAgICAgICAgICAgICAgMHgwOCwweDE4LDB4MEMsMHgxQywweDA5LDB4MTksMHgwRCwweDFELAotICAgICAgICAgICAgICAgMHgyOCwweDM4LDB4MkMsMHgzQywweDI5LDB4MzksMHgyRCwweDNELAotICAgICAgICAgICAgICAgMHgwMiwweDEyLDB4MDYsMHgxNiwweDAzLDB4MTMsMHgwNywweDE3LAotICAgICAgICAgICAgICAgMHgyMiwweDMyLDB4MjYsMHgzNiwweDIzLDB4MzMsMHgyNywweDM3LAotICAgICAgICAgICAgICAgMHgwQSwweDFBLDB4MEUsMHgxRSwweDBCLDB4MUIsMHgwRiwweDFGLAotICAgICAgICAgICAgICAgMHgyQSwweDNBLDB4MkUsMHgzRSwweDJCLDB4M0IsMHgyRiwweDNGfTsKLQotVVNIT1JUIFhHSU5ld19WR0FfREFDW109ezB4MDAsMHgxMCwweDA0LDB4MTQsMHgwMSwweDExLDB4MDksMHgxNSwKLSAgICAgICAgICAgICAgIDB4MkEsMHgzQSwweDJFLDB4M0UsMHgyQiwweDNCLDB4MkYsMHgzRiwKLSAgICAgICAgICAgICAgIDB4MDAsMHgwNSwweDA4LDB4MEIsMHgwRSwweDExLDB4MTQsMHgxOCwKLSAgICAgICAgICAgICAgIDB4MUMsMHgyMCwweDI0LDB4MjgsMHgyRCwweDMyLDB4MzgsMHgzRiwKLQotICAgICAgICAgICAgICAgMHgwMCwweDEwLDB4MUYsMHgyRiwweDNGLDB4MUYsMHgyNywweDJGLAotICAgICAgICAgICAgICAgMHgzNywweDNGLDB4MkQsMHgzMSwweDM2LDB4M0EsMHgzRiwweDAwLAotICAgICAgICAgICAgICAgMHgwNywweDBFLDB4MTUsMHgxQywweDBFLDB4MTEsMHgxNSwweDE4LAotICAgICAgICAgICAgICAgMHgxQywweDE0LDB4MTYsMHgxOCwweDFBLDB4MUMsMHgwMCwweDA0LAotICAgICAgICAgICAgICAgMHgwOCwweDBDLDB4MTAsMHgwOCwweDBBLDB4MEMsMHgwRSwweDEwLAotICAgICAgICAgICAgICAgMHgwQiwweDBDLDB4MEQsMHgwRiwweDEwfTsKK3Vuc2lnbmVkIHNob3J0IFhHSU5ld19WR0FfREFDW10gPSB7CisJMHgwMCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgxNSwKKwkweDJBLCAweDNBLCAweDJFLCAweDNFLCAweDJCLCAweDNCLCAweDJGLCAweDNGLAorCTB4MDAsIDB4MDUsIDB4MDgsIDB4MEIsIDB4MEUsIDB4MTEsIDB4MTQsIDB4MTgsCisJMHgxQywgMHgyMCwgMHgyNCwgMHgyOCwgMHgyRCwgMHgzMiwgMHgzOCwgMHgzRiwKKwkweDAwLCAweDEwLCAweDFGLCAweDJGLCAweDNGLCAweDFGLCAweDI3LCAweDJGLAorCTB4MzcsIDB4M0YsIDB4MkQsIDB4MzEsIDB4MzYsIDB4M0EsIDB4M0YsIDB4MDAsCisJMHgwNywgMHgwRSwgMHgxNSwgMHgxQywgMHgwRSwgMHgxMSwgMHgxNSwgMHgxOCwKKwkweDFDLCAweDE0LCAweDE2LCAweDE4LCAweDFBLCAweDFDLCAweDAwLCAweDA0LAorCTB4MDgsIDB4MEMsIDB4MTAsIDB4MDgsIDB4MEEsIDB4MEMsIDB4MEUsIDB4MTAsCisJMHgwQiwgMHgwQywgMHgwRCwgMHgwRiwgMHgxMH07CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNTAsMzUgKzI0MCwzNSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBJbml0VG8zMzBQb2ludGVyKCBVQ0hBUiBDaGlwVHlwZSAsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIEluaXRUbzMzMFBvaW50ZXIodW5zaWduZWQgY2hhciBDaGlwVHlwZSwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIHBWQkluZm8tPlNNb2RlSURUYWJsZSA9IChYR0lfU3RTdHJ1Y3QgKikgWEdJMzMwX1NNb2RlSURUYWJsZSA7Ci0gICAgcFZCSW5mby0+U3RhbmRUYWJsZSA9IChYR0lfU3RhbmRUYWJsZVN0cnVjdCAqKSBYR0kzMzBfU3RhbmRUYWJsZSA7Ci0gICAgcFZCSW5mby0+RU1vZGVJRFRhYmxlID0gKFhHSV9FeHRTdHJ1Y3QgKikgWEdJMzMwX0VNb2RlSURUYWJsZSA7Ci0gICAgcFZCSW5mby0+UmVmSW5kZXggPSAoWEdJX0V4dDJTdHJ1Y3QgKikgWEdJMzMwX1JlZkluZGV4IDsKLSAgICBwVkJJbmZvLT5YR0lORVdVQl9DUlQxVGFibGUgPSAoWEdJX0NSVDFUYWJsZVN0cnVjdCAqKSBYR0lfQ1JUMVRhYmxlIDsKKyAgICBwVkJJbmZvLT5TTW9kZUlEVGFibGUgPSAoc3RydWN0IFhHSV9TdFN0cnVjdCAqKSBYR0kzMzBfU01vZGVJRFRhYmxlIDsKKyAgICBwVkJJbmZvLT5TdGFuZFRhYmxlID0gKHN0cnVjdCBYR0lfU3RhbmRUYWJsZVN0cnVjdCAqKSBYR0kzMzBfU3RhbmRUYWJsZSA7CisgICAgcFZCSW5mby0+RU1vZGVJRFRhYmxlID0gKHN0cnVjdCBYR0lfRXh0U3RydWN0ICopIFhHSTMzMF9FTW9kZUlEVGFibGUgOworICAgIHBWQkluZm8tPlJlZkluZGV4ID0gKHN0cnVjdCBYR0lfRXh0MlN0cnVjdCAqKSBYR0kzMzBfUmVmSW5kZXggOworICAgIHBWQkluZm8tPlhHSU5FV1VCX0NSVDFUYWJsZSA9IChzdHJ1Y3QgWEdJX0NSVDFUYWJsZVN0cnVjdCAqKSBYR0lfQ1JUMVRhYmxlIDsKIAogICAgIC8qIGFkZCBmb3IgbmV3IFVOSVZHQUJJT1MgKi8KLSAgICAvKiBYR0lOZXdfVUJMQ0REYXRhVGFibGUgPSAoWEdJX0xDRERhdGFUYWJsU3RydWN0ICopIFhHSV9MQ0REYXRhVGFibGUgOyAqLworICAgIC8qIFhHSU5ld19VQkxDRERhdGFUYWJsZSA9IChzdHJ1Y3QgWEdJX0xDRERhdGFUYWJsU3RydWN0ICopIFhHSV9MQ0REYXRhVGFibGUgOyAqLwogICAgIC8qIFhHSU5ld19VQlRWRGF0YVRhYmxlID0gKFhHSV9UVkRhdGFUYWJsU3RydWN0ICopIFhHSV9UVkRhdGFUYWJsZSA7ICovCiAKIAogICAgIGlmICggQ2hpcFR5cGUgPj0gWEc0MCApCiAgICAgewotICAgICAgICBwVkJJbmZvLT5NQ0xLRGF0YSA9IChYR0lfTUNMS0RhdGFTdHJ1Y3QgKikgWEdJMzQwTmV3X01DTEtEYXRhIDsKLSAgICAgICAgcFZCSW5mby0+RUNMS0RhdGEgPSAoWEdJX0VDTEtEYXRhU3RydWN0ICopIFhHSTM0MF9FQ0xLRGF0YSA7CisJcFZCSW5mby0+TUNMS0RhdGEgPSAoc3RydWN0IFhHSV9NQ0xLRGF0YVN0cnVjdCAqKSBYR0kzNDBOZXdfTUNMS0RhdGE7CisJcFZCSW5mby0+RUNMS0RhdGEgPSAoc3RydWN0IFhHSV9FQ0xLRGF0YVN0cnVjdCAqKSBYR0kzNDBfRUNMS0RhdGE7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIHBWQkluZm8tPk1DTEtEYXRhID0gKFhHSV9NQ0xLRGF0YVN0cnVjdCAqKSBYR0kzMzBOZXdfTUNMS0RhdGEgOwotICAgICAgICBwVkJJbmZvLT5FQ0xLRGF0YSA9IChYR0lfRUNMS0RhdGFTdHJ1Y3QgKikgWEdJMzMwX0VDTEtEYXRhIDsKKwlwVkJJbmZvLT5NQ0xLRGF0YSA9IChzdHJ1Y3QgWEdJX01DTEtEYXRhU3RydWN0ICopIFhHSTMzME5ld19NQ0xLRGF0YTsKKwlwVkJJbmZvLT5FQ0xLRGF0YSA9IChzdHJ1Y3QgWEdJX0VDTEtEYXRhU3RydWN0ICopIFhHSTMzMF9FQ0xLRGF0YTsKICAgICB9CiAKLSAgICBwVkJJbmZvLT5WQ0xLRGF0YSA9IChYR0lfVkNMS0RhdGFTdHJ1Y3QgKikgWEdJX1ZDTEtEYXRhIDsKLSAgICBwVkJJbmZvLT5WQlZDTEtEYXRhID0gKFhHSV9WQlZDTEtEYXRhU3RydWN0ICopIFhHSV9WQlZDTEtEYXRhIDsKKyAgICBwVkJJbmZvLT5WQ0xLRGF0YSA9IChzdHJ1Y3QgWEdJX1ZDTEtEYXRhU3RydWN0ICopIFhHSV9WQ0xLRGF0YSA7CisgICAgcFZCSW5mby0+VkJWQ0xLRGF0YSA9IChzdHJ1Y3QgWEdJX1ZCVkNMS0RhdGFTdHJ1Y3QgKikgWEdJX1ZCVkNMS0RhdGEgOwogICAgIHBWQkluZm8tPlNjcmVlbk9mZnNldCA9IFhHSTMzMF9TY3JlZW5PZmZzZXQgOwotICAgIHBWQkluZm8tPlN0UmVzSW5mbyA9IChYR0lfU3RSZXNJbmZvU3RydWN0ICopIFhHSTMzMF9TdFJlc0luZm8gOwotICAgIHBWQkluZm8tPk1vZGVSZXNJbmZvID0gKFhHSV9Nb2RlUmVzSW5mb1N0cnVjdCAqKSBYR0kzMzBfTW9kZVJlc0luZm8gOworICAgIHBWQkluZm8tPlN0UmVzSW5mbyA9IChzdHJ1Y3QgWEdJX1N0UmVzSW5mb1N0cnVjdCAqKSBYR0kzMzBfU3RSZXNJbmZvIDsKKyAgICBwVkJJbmZvLT5Nb2RlUmVzSW5mbyA9IChzdHJ1Y3QgWEdJX01vZGVSZXNJbmZvU3RydWN0ICopIFhHSTMzMF9Nb2RlUmVzSW5mbyA7CiAKICAgICBwVkJJbmZvLT5wT3V0cHV0U2VsZWN0ID0gJlhHSTMzMF9PdXRwdXRTZWxlY3QgOwogICAgIHBWQkluZm8tPnBTb2Z0U2V0dGluZyA9ICZYR0kzMzBfU29mdFNldHRpbmcgOwpAQCAtMzQyLDkgKzMzMiw5IEBACiAgICAgcFZCSW5mby0+UmVuNzUwcEdyb3VwMyA9IFhHSTMzMF9SZW43NTBwR3JvdXAzIDsKIAogCi0gICAgcFZCSW5mby0+VGltaW5nSCA9IChYR0lfVGltaW5nSFN0cnVjdCAqKSBYR0lfVGltaW5nSCA7Ci0gICAgcFZCSW5mby0+VGltaW5nViA9IChYR0lfVGltaW5nVlN0cnVjdCAqKSBYR0lfVGltaW5nViA7Ci0gICAgcFZCSW5mby0+VXBkYXRlQ1JUMSA9IChYR0lfWEcyMUNSVDFTdHJ1Y3QgKikgWEdJX1VwZGF0ZUNSVDFUYWJsZSA7CisgICAgcFZCSW5mby0+VGltaW5nSCA9IChzdHJ1Y3QgWEdJX1RpbWluZ0hTdHJ1Y3QgKikgWEdJX1RpbWluZ0ggOworICAgIHBWQkluZm8tPlRpbWluZ1YgPSAoc3RydWN0IFhHSV9UaW1pbmdWU3RydWN0ICopIFhHSV9UaW1pbmdWIDsKKyAgICBwVkJJbmZvLT5VcGRhdGVDUlQxID0gKHN0cnVjdCBYR0lfWEcyMUNSVDFTdHJ1Y3QgKikgWEdJX1VwZGF0ZUNSVDFUYWJsZSA7CiAKICAgICBwVkJJbmZvLT5DSFRWVkNMS1VOVFNDID0gWEdJMzMwX0NIVFZWQ0xLVU5UU0MgOwogICAgIHBWQkluZm8tPkNIVFZWQ0xLT05UU0MgPSBYR0kzMzBfQ0hUVlZDTEtPTlRTQyA7CkBAIC0zNzEsNyArMzYxLDcgQEAKIAogICAgIGlmICggQ2hpcFR5cGUgPT0gWEcyNyApCiAgICAgewotICAgICAgICBwVkJJbmZvLT5NQ0xLRGF0YSA9IChYR0lfTUNMS0RhdGFTdHJ1Y3QgKikgWEdJMjdOZXdfTUNMS0RhdGEgOworCXBWQkluZm8tPk1DTEtEYXRhID0gKHN0cnVjdCBYR0lfTUNMS0RhdGFTdHJ1Y3QgKikgWEdJMjdOZXdfTUNMS0RhdGE7CiAgICAgICAgIHBWQkluZm8tPkNSNDAgPSBYR0kyN19jcjQxIDsKICAgICAJcFZCSW5mby0+cFhHSU5ld19DUjk3ID0gJlhHMjdfQ1I5NyA7CiAgICAgCXBWQkluZm8tPnBTUjM2ID0gJlhHMjdfU1IzNiA7CkBAIC00MDUsMTQgKzM5NSwxNSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lTZXRNb2RlTmV3KCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgVVNIT1JUIE1vZGVObyApCit1bnNpZ25lZCBjaGFyIFhHSVNldE1vZGVOZXcoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQogewotICAgIFVTSE9SVCBNb2RlSWRJbmRleCA7Ci0gICAgICAgIC8qIFBVQ0hBUiBwVkJJbmZvLT5GQkFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaWRlb01lbW9yeUFkZHJlc3MgOyAqLwotICAgIFZCX0RFVklDRV9JTkZPIFZCSU5GOwotICAgIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvID0gJlZCSU5GOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4IDsKKyAgICAgICAgLyogdW5zaWduZWQgY2hhciAqcFZCSW5mby0+RkJBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlkZW9NZW1vcnlBZGRyZXNzIDsgKi8KKyAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gVkJJTkY7CisgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvID0gJlZCSU5GOwogICAgIHBWQkluZm8tPlJPTUFkZHIgPSBId0RldmljZUV4dGVuc2lvbi0+cGpWaXJ0dWFsUm9tQmFzZSA7Ci0gICAgcFZCSW5mby0+QmFzZUFkZHIgPSAoVUxPTkcpSHdEZXZpY2VFeHRlbnNpb24tPnBqSU9BZGRyZXNzIDsKKyAgICBwVkJJbmZvLT5CYXNlQWRkciA9ICh1bnNpZ25lZCBsb25nKUh3RGV2aWNlRXh0ZW5zaW9uLT5waklPQWRkcmVzcyA7CiAgICAgcFZCSW5mby0+SUZfREVGX0xWRFMgPSAwIDsKICAgICBwVkJJbmZvLT5JRl9ERUZfQ0g3MDA1ID0gMCA7CiAgICAgcFZCSW5mby0+SUZfREVGX0xDREEgPSAxIDsKQEAgLTQ4NSw5ICs0NzYsNiBAQAogICAgIFhHSV9HZXRWQlR5cGUoIHBWQkluZm8gKSA7CiAKICAgICBJbml0VG8zMzBQb2ludGVyKCBId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlLCBwVkJJbmZvICkgOwotI2lmZGVmIFdJTjIwMDAKLSAgICBSZWFkVkJJT1NUYWJsRGF0YSggSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSAsIHBWQkluZm8pIDsKLSNlbmRpZgogICAgIGlmICggTW9kZU5vICYgMHg4MCApCiAgICAgewogICAgICAgICBNb2RlTm8gPSBNb2RlTm8gJiAweDdGIDsKQEAgLTU2MCwzMCArNTQ4LDkgQEAKICAgICB9CS8qICFYRzIwICovCiAgICAgZWxzZQogICAgIHsKLSNpZmRlZiBXSU4yMDAwCi0gICAgICAgIGlmICggcFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBWaWRlb0RlYnVnUHJpbnQoKDAsICJYR0lTZXRNb2RlTmV3OiBwVkJJZm8tPklGX0RFRl9DSDcwMDc9PTFcbiIpKTsKLSAgICAgICAgICAgIHBWQkluZm8tPlZCVHlwZSA9IFZCX0NINzAwNyA7Ci0gICAgICAgICAgICBYR0lfR2V0VkJJbmZvKE1vZGVObyAsIE1vZGVJZEluZGV4ICwgSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8gKSA7Ci0gICAgICAgICAgICBYR0lfR2V0VFZJbmZvKE1vZGVObyAsIE1vZGVJZEluZGV4LCBwVkJJbmZvICkgOwotICAgICAgICAgICAgWEdJX0dldExDREluZm8oTW9kZU5vICwgTW9kZUlkSW5kZXgsIHBWQkluZm8gKSA7Ci0gICAgICAgICAgICBpZiggIShYR0lfWEcyMUNoZWNrQ0g3MDA3VFZNb2RlKE1vZGVObywgTW9kZUlkSW5kZXgsIHBWQkluZm8gKSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0KLSAgICAgICAgaWYgKCBwVkJJbmZvLT5JRl9ERUZfTFZEUyA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhWEdJX1hHMjFDaGVja0xWRFNNb2RlKE1vZGVObyAsIE1vZGVJZEluZGV4LCBwVkJJbmZvKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCSAgICBpZiAocFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMSkKKwkJICAgIGlmICghWEdJX1hHMjFDaGVja0xWRFNNb2RlKE1vZGVObyAsIE1vZGVJZEluZGV4LCBwVkJJbmZvKSkKKwkJCSAgICByZXR1cm4gMDsKIAogICAgICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICAgICAgewpAQCAtNjQyLDcgKzYwOSw3IEBACiAgICAgWEdJX0xvY2tDUlQyKCBId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyApIDsKIH0KIAotICAgIHJldHVybiggVFJVRSApIDsKKyAgICByZXR1cm4gMTsKIH0KIAogCkBAIC02NTIsMTQgKzYxOSwxNiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0Q1JUMUdyb3VwKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0Q1JUMUdyb3VwKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIFN0YW5kVGFibGVJbmRleCAsCisgICAgdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4ICwKICAgICAgICAgICAgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICwKICAgICAgICAgICAgYjNDQyAsCiAgICAgICAgICAgIHRlbXAgOwogCi0gICAgVVNIT1JUIFhHSU5ld19QM2NjID0gIHBWQkluZm8tPlAzY2M7CisgICAgdW5zaWduZWQgc2hvcnQgWEdJTmV3X1AzY2MgPSAgcFZCSW5mby0+UDNjYzsKIAogICAgIC8qIFhHSU5ld19DUlQxTW9kZSA9IE1vZGVObyA7IC8vIFNhdmVNb2RlSUQgKi8KICAgICBTdGFuZFRhYmxlSW5kZXggPSBYR0lfR2V0TW9kZVB0ciggTW9kZU5vICwgTW9kZUlkSW5kZXgsIHBWQkluZm8gKSA7CkBAIC03MTAsMTQgKzY3OSwxNCBAQAogICAgIAl7CiAgICAgCSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MkIgLCAweDRFKSA7CiAgICAgCSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MkMgLCAweEU5KSA7Ci0gICAgCSAgICBiM0NDID0oVUNIQVIpIFhHSU5ld19HZXRSZWcyKFhHSU5ld19QM2NjKSA7CisJICAgIGIzQ0MgPSAodW5zaWduZWQgY2hhcikgWEdJTmV3X0dldFJlZzIoWEdJTmV3X1AzY2MpIDsKICAgICAJICAgIFhHSU5ld19TZXRSZWczKFhHSU5ld19QM2NjICwgIChiM0NDIHw9IDB4MEMpICkgOwogICAgIAl9CiAgICAgCWVsc2UgaWYgKCAoIE1vZGVObyA9PSAweDA0KSB8ICggTW9kZU5vID09IDB4MDUpIHwgKCBNb2RlTm8gPT0gMHgwRCkgKQogICAgIAl7CiAgICAgCSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MkIgLCAweDFCKSA7CiAgICAgCSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MkMgLCAweEUzKSA7Ci0gICAgCSAgICBiM0NDID0gKFVDSEFSKVhHSU5ld19HZXRSZWcyKFhHSU5ld19QM2NjKSA7CisJICAgIGIzQ0MgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMihYR0lOZXdfUDNjYykgOwogICAgIAkgICAgWEdJTmV3X1NldFJlZzMoWEdJTmV3X1AzY2MgLCAgKGIzQ0MgfD0gMHgwQykgKSA7CiAgICAgCX0KICAgICB9CkBAIC03NjMsMTMgKzczMiw2IEBACiAKICAgICBYR0lfTG9hZERBQyggTW9kZU5vICwgTW9kZUlkSW5kZXgsIHBWQkluZm8gKSA7CiAgICAgLyogWEdJX0NsZWFyQnVmZmVyKCBId0RldmljZUV4dGVuc2lvbiAsIE1vZGVObywgcFZCSW5mbyApIDsgKi8KLSNpZmRlZiBXSU4yMDAwCi0gICBpZiAoIHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPT0gMSApICAvKiBbQmlsbHldICAyMDA3LzA1LzE0ICAqLwotICAgewotICAgICAgIFZpZGVvRGVidWdQcmludCgoMCwgIlhHSV9TZXRDUlQxR3JvdXA6IFZCSW5mby0+SUZfREVGX0NINzAwNz09MVxuIikpOwotICAgICAgIFNldENINzAwN1JlZ3MoSHdEZXZpY2VFeHRlbnNpb24sIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyApIDsgLyogMDcvMDUvMjggKi8KLSAgIH0KLSNlbmRpZgogfQogCiAKQEAgLTc3OSw5ICs3NDEsMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVDSEFSIFhHSV9HZXRNb2RlUHRyKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSV9HZXRNb2RlUHRyKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIGluZGV4IDsKKyAgICB1bnNpZ25lZCBjaGFyIGluZGV4IDsKIAogICAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQogICAgICAgICBpbmRleCA9IHBWQkluZm8tPlNNb2RlSURUYWJsZVsgTW9kZUlkSW5kZXggXS5TdF9TdFRhYmxlSW5kZXggOwpAQCAtODAyLDcgKzc2NSw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKlVDSEFSIFhHSV9TZXRCSU9TRGF0YSggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCApCisvKnVuc2lnbmVkIGNoYXIgWEdJX1NldEJJT1NEYXRhKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpCiB7CiAgICAgcmV0dXJuKCAwICkgOwogfQpAQCAtODE0LDcgKzc3Nyw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKlVDSEFSIFhHSV9DbGVhckJhbmtSZWdzKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICkKKy8qdW5zaWduZWQgY2hhciBYR0lfQ2xlYXJCYW5rUmVncyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4KQogewogICAgIHJldHVybiggMCApIDsKIH0KQEAgLTgyNiwxMiArNzg5LDEzIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRTZXFSZWdzKCAgVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBTdGFuZFRhYmxlSW5kZXggLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldFNlcVJlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgsCisJCSAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIHRlbXBhaCAsCisgICAgdW5zaWduZWQgY2hhciB0ZW1wYWggLAogICAgICAgICAgIFNSZGF0YSA7CiAKLSAgICBVU0hPUlQgaSAsCisgICAgdW5zaWduZWQgc2hvcnQgaSAsCiAgICAgICAgICAgIG1vZGVmbGFnIDsKIAogICAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQpAQCAtODczLDkgKzgzNyw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRNaXNjUmVncyggVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0TWlzY1JlZ3ModW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgTWlzY2RhdGEgOworICAgIHVuc2lnbmVkIGNoYXIgTWlzY2RhdGEgOwogCiAgICAgTWlzY2RhdGEgPSBwVkJJbmZvLT5TdGFuZFRhYmxlWyBTdGFuZFRhYmxlSW5kZXggXS5NSVNDIDsJLyogR2V0IE1pc2MgZnJvbSBmaWxlICovCiAvKgpAQCAtODk4LDEyICs4NjIsMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldENSVENSZWdzKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0Q1JUQ1JlZ3Moc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCSAgICAgdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgQ1JUQ2RhdGEgOwotICAgIFVTSE9SVCBpIDsKKyAgICB1bnNpZ25lZCBjaGFyIENSVENkYXRhIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpIDsKIAotICAgIENSVENkYXRhID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICkgOworICAgIENSVENkYXRhID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHgxMSk7CiAgICAgQ1JUQ2RhdGEgJj0gMHg3ZiA7CiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICwgQ1JUQ2RhdGEgKSA7CQkvKiBVbmxvY2sgQ1JUQyAqLwogCkBAIC05MzMsMTEgKzg5OCwxMSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0QVRUUmVncyggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBTdGFuZFRhYmxlSW5kZXggLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldEFUVFJlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgsCisJCSAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIEFSZGF0YSA7Ci0gICAgVVNIT1JUIGkgLAotICAgICAgICAgICBtb2RlZmxhZyA7CisgICAgdW5zaWduZWQgY2hhciBBUmRhdGEgOworICAgIHVuc2lnbmVkIHNob3J0IGksIG1vZGVmbGFnOwogCiAgICAgaWYgKCBNb2RlTm8gPD0gMHgxMyApCiAgICAgICAgIG1vZGVmbGFnID0gcFZCSW5mby0+U01vZGVJRFRhYmxlWyBNb2RlSWRJbmRleCBdLlN0X01vZGVGbGFnIDsKQEAgLTk4MywxMCArOTQ4LDEwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRHUkNSZWdzKCBVU0hPUlQgU3RhbmRUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9TZXRHUkNSZWdzKHVuc2lnbmVkIHNob3J0IFN0YW5kVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIEdSZGF0YSA7Ci0gICAgVVNIT1JUIGkgOworICAgIHVuc2lnbmVkIGNoYXIgR1JkYXRhIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpIDsKIAogICAgIGZvciggaSA9IDAgOyBpIDw9IDB4MDggOyBpKysgKQogICAgIHsKQEAgLTk5Niw3ICs5NjEsNyBAQAogCiAgICAgaWYgKCBwVkJJbmZvLT5Nb2RlVHlwZSA+IE1vZGVWR0EgKQogICAgIHsKLSAgICAgICAgR1JkYXRhID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzY2UgLCAweDA1ICkgOworCUdSZGF0YSA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzY2UsIDB4MDUpOwogICAgICAgICBHUmRhdGEgJj0gMHhCRiA7CQkJCQkJLyogMjU2IGNvbG9yIGRpc2FibGUgKi8KICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzY2UgLCAweDA1ICwgR1JkYXRhICkgOwogICAgIH0KQEAgLTEwMDksOSArOTc0LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0NsZWFyRXh0MVJlZ3MoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9DbGVhckV4dDFSZWdzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgaSA7CisgICAgdW5zaWduZWQgc2hvcnQgaSA7CiAKICAgICBmb3IoIGkgPSAweDBBIDsgaSA8PSAweDBFIDsgaSsrICkKICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCBpICwgMHgwMCApIDsJLyogQ2xlYXIgU1IwQS1TUjBFICovCkBAIC0xMDI0LDcgKzk4OSw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VQ0hBUiBYR0lfU2V0RGVmYXVsdFZDTEsoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgWEdJX1NldERlZmF1bHRWQ0xLKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNjNCAsIDB4MzEgLCB+MHgzMCAsIDB4MjAgKSA7CkBAIC0xMDQ2LDEzICsxMDExLDE1IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VU0hPUlQgWEdJX0dldFJhdGVQdHJDUlQyKCBQWEdJX0hXX0RFVklDRV9JTkZPIHBYR0lIV0RFLCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBzaG9ydCBYR0lfR2V0UmF0ZVB0ckNSVDIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsCisJCQkJICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQkJICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCQkgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBTSE9SVCAgTENEUmVmcmVzaEluZGV4W10gPSB7IDB4MDAgLCAweDAwICwgMHgwMyAsIDB4MDEgfSAsCisgICAgc2hvcnQgTENEUmVmcmVzaEluZGV4W10gPSB7IDB4MDAgLCAweDAwICwgMHgwMyAsIDB4MDEgfSAsCiAgICAgICAgICAgIExDREFSZWZyZXNoSW5kZXhbXSA9IHsgMHgwMCAsIDB4MDAgLCAweDAzICwgMHgwMSAsIDB4MDEgLCAweDAxICwgMHgwMSB9IDsKIAotICAgIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggLCBpICwKLSAgICAgICAgIG1vZGVmbGFnICwgaW5kZXggLCB0ZW1wIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIGksIG1vZGVmbGFnLCBpbmRleCwgdGVtcDsKIAogICAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQogICAgIHsKQEAgLTExODMsMTMgKzExNTAsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUJPT0xFQU4gWEdJX0FqdXN0Q1JUMlJhdGUoIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICwgVVNIT1JUICppLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSV9BanVzdENSVDJSYXRlKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkJdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkJCXVuc2lnbmVkIHNob3J0ICppLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBheCAsCi0gICAgICAgICAgIHRlbXBieCAsCi0gICAgICAgICAgIHJlc2luZm8gLAotICAgICAgICAgICBtb2RlZmxhZyAsCi0gICAgICAgICAgIGluZm9mbGFnIDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXgsIHRlbXBieCwgcmVzaW5mbywgbW9kZWZsYWcsIGluZm9mbGFnOwogCiAgICAgaWYgKCBNb2RlTm8gPD0gMHgxMyApCiAgICAgewpAQCAtMTM1OSw5ICsxMzI0LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldFN5bmMoVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0U3luYyh1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgc3luYyAsCisgICAgdW5zaWduZWQgc2hvcnQgc3luYyAsCiAgICAgICAgICAgIHRlbXAgOwogCiAgICAgc3luYyA9IHBWQkluZm8tPlJlZkluZGV4WyBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggXS5FeHRfSW5mb0ZsYWcgPj4gOCA7CS8qIGRpKzB4MDAgKi8KQEAgLTEzNzgsMTcgKzEzNDMsMTggQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldENSVDFDUlRDKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbywgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApCit2b2lkIFhHSV9TZXRDUlQxQ1JUQyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8sCisJCSAgICAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24pCiB7Ci0gICAgVUNIQVIgIGluZGV4ICwKLSAgICAgICAgICAgZGF0YSA7Ci0KLSAgICBVU0hPUlQgaSA7CisgICAgdW5zaWduZWQgY2hhciBpbmRleCwgZGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpOwogCiAgICAgaW5kZXggPSBwVkJJbmZvLT5SZWZJbmRleFsgUmVmcmVzaFJhdGVUYWJsZUluZGV4IF0uRXh0X0NSVDFDUlRDIDsJLyogR2V0IGluZGV4ICovCiAgICAgaW5kZXggPSBpbmRleCZJbmRleE1hc2sgOwogCi0gICAgZGF0YSA9KCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICkgOworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDExKTsKICAgICBkYXRhICY9IDB4N0YgOwogICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzZDQsMHgxMSxkYXRhKTsJCQkJLyogVW5sb2NrIENSVEMgKi8KIApAQCAtMTQxNiwxNiArMTM4MiwxNiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0Q1JUMVRpbWluZ19IKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbywgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiApCit2b2lkIFhHSV9TZXRDUlQxVGltaW5nX0goc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvLCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbikKIHsKLSAgICBVQ0hBUiBkYXRhICwgZGF0YTEsIHB1c2hheDsKLSAgICBVU0hPUlQgaSAsIGogOworICAgIHVuc2lnbmVkIGNoYXIgZGF0YSwgZGF0YTEsIHB1c2hheDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpLCBqOwogCiAgICAgLyogWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDUxICwgMCApIDsgKi8KICAgICAvKiBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NTYgLCAwICkgOyAqLwogICAgIC8qIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNkNCAsMHgxMSAsIDB4N2YgLCAweDAwICkgOyAqLwogCi0gICAgZGF0YSA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgxMSApIDsJCS8qIHVubG9jayBjcjAtNyAqLworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDExKTsgLyogdW5sb2NrIGNyMC03ICovCiAgICAgZGF0YSAmPSAweDdGIDsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MTEgLCBkYXRhICkgOwogCkBAIC0xNDM1LDE2ICsxNDAxLDE2IEBACiAgICAgZm9yKCBpID0gMHgwMSA7IGkgPD0gMHgwNCA7IGkrKyApCiAgICAgewogICAgICAgICBkYXRhID0gcFZCSW5mby0+VGltaW5nSFsgMCBdLmRhdGFbIGkgXSA7Ci0gICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgKCBVU0hPUlQgKSggaSArIDEgKSAsIGRhdGEgKSA7CisJWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQsICh1bnNpZ25lZCBzaG9ydCkoaSArIDEpLCBkYXRhKTsKICAgICB9CiAKICAgICBmb3IoIGkgPSAweDA1IDsgaSA8PSAweDA2IDsgaSsrICkKICAgICB7CiAgICAgICAgIGRhdGEgPSBwVkJJbmZvLT5UaW1pbmdIWyAwIF0uZGF0YVsgaSBdOwotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsKCBVU0hPUlQgKSggaSArIDYgKSAsIGRhdGEgKSA7CisJWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgKHVuc2lnbmVkIHNob3J0KShpICsgNiksIGRhdGEpOwogICAgIH0KIAotICAgIGogPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MGUgKSA7CisgICAgaiA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MGUpOwogICAgIGogJj0gMHgxRiA7CiAgICAgZGF0YSA9IHBWQkluZm8tPlRpbWluZ0hbIDAgXS5kYXRhWyA3IF0gOwogICAgIGRhdGEgJj0gMHhFMCA7CkBAIC0xNDUzLDE3ICsxNDE5LDE3IEBACiAKICAgICBpZiAoIEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPj0gWEcyMCApCiAgICAgewotICAgIAlkYXRhID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDA0ICkgOworCWRhdGEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDA0KTsKICAgICAJZGF0YSA9IGRhdGEgLSAxIDsKICAgICAJWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDA0ICwgZGF0YSApIDsKLSAgICAJZGF0YSA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgwNSApIDsKKwlkYXRhID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHgwNSk7CiAgICAgCWRhdGExID0gZGF0YSA7CiAgICAgCWRhdGExICY9IDB4RTAgOwogICAgIAlkYXRhICY9IDB4MUYgOwogICAgIAlpZiAoIGRhdGEgPT0gMCApCiAgICAgCXsKICAgICAJICAgIHB1c2hheCA9IGRhdGEgOwotICAgIAkgICAgZGF0YSA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwYyApIDsKKwkgICAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MGMpOwogICAgIAkgICAgZGF0YSAmPSAweEZCIDsKICAgICAJICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwYyAsIGRhdGEgKSA7CiAgICAgCSAgICBkYXRhID0gcHVzaGF4IDsKQEAgLTE0NzEsNyArMTQzNyw3IEBACiAgICAgCWRhdGEgPSBkYXRhIC0gMSA7CiAgICAgCWRhdGEgfD0gZGF0YTEgOwogICAgIAlYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MDUgLCBkYXRhICkgOwotICAgIAlkYXRhID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDBlICkgOworCWRhdGEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDBlKTsKICAgICAJZGF0YSA9IGRhdGEgPj4gNSA7CiAgICAgCWRhdGEgPSBkYXRhICsgMyA7CiAgICAgCWlmICggZGF0YSA+IDcgKQpAQCAtMTQ4OCwxMCArMTQ1NCwxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0Q1JUMVRpbWluZ19WKCBVU0hPUlQgTW9kZUlkSW5kZXggLCBVU0hPUlQgTW9kZU5vLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldENSVDFUaW1pbmdfVih1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCSB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQkgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIGRhdGEgOwotICAgIFVTSE9SVCBpICwgaiA7CisgICAgdW5zaWduZWQgY2hhciBkYXRhOworICAgIHVuc2lnbmVkIHNob3J0IGksIGo7CiAKICAgICAvKiBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NTEgLCAwICkgOyAqLwogICAgIC8qIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHg1NiAsIDAgKSA7ICovCkBAIC0xNTAwLDIyICsxNDY4LDIyIEBACiAgICAgZm9yKCBpID0gMHgwMCA7IGkgPD0gMHgwMSA7IGkrKyApCiAgICAgewogICAgICAgICBkYXRhID0gcFZCSW5mby0+VGltaW5nVlsgMCBdLmRhdGFbIGkgXSA7Ci0gICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgKCBVU0hPUlQgKSggaSArIDYgKSAsIGRhdGEgKSA7CisJWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNkNCwgKHVuc2lnbmVkIHNob3J0KShpICsgNiksIGRhdGEpOwogICAgIH0KIAogICAgIGZvciggaSA9IDB4MDIgOyBpIDw9IDB4MDMgOyBpKysgKQogICAgIHsKICAgICAgICAgZGF0YSA9IHBWQkluZm8tPlRpbWluZ1ZbIDAgXS5kYXRhWyBpIF0gOwotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsICggVVNIT1JUICkoIGkgKyAweDBlICkgLCBkYXRhICkgOworCVhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzZDQsICh1bnNpZ25lZCBzaG9ydCkoaSArIDB4MGUpLCBkYXRhKTsKICAgICB9CiAKICAgICBmb3IoIGkgPSAweDA0IDsgaSA8PSAweDA1IDsgaSsrICkKICAgICB7CiAgICAgICAgIGRhdGEgPSBwVkJJbmZvLT5UaW1pbmdWWyAwIF0uZGF0YVsgaSBdIDsKLSAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAoIFVTSE9SVCApKCBpICsgMHgxMSApICwgZGF0YSApIDsKKwlYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAodW5zaWduZWQgc2hvcnQpKGkgKyAweDExKSwgZGF0YSk7CiAgICAgfQogCi0gICAgaiA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwYSApIDsKKyAgICBqID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNjNCwgMHgwYSk7CiAgICAgaiAmPSAweEMwIDsKICAgICBkYXRhID0gcFZCSW5mby0+VGltaW5nVlsgMCBdLmRhdGFbIDYgXSA7CiAgICAgZGF0YSAmPSAweDNGIDsKQEAgLTE1MzUsNyArMTUwMyw3IEBACiAgICAgaWYgKCBpICkKICAgICAgICAgZGF0YSB8PSAweDgwIDsKIAotICAgIGogPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MDkgKSA7CisgICAgaiA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzZDQsIDB4MDkpOwogICAgIGogJj0gMHg1RiA7CiAgICAgZGF0YSB8PSBqIDsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MDkgLCBkYXRhICkgOwpAQCAtMTU0OCwxMCArMTUxNiwxMiBAQAogLyogT3V0cHV0IDogRmlsbCBDUlQgSHN5bmMvVnN5bmMgdG8gU1IyRS9TUjJGL1NSMzAvU1IzMy9TUjM0L1NSM0YgKi8KIC8qIERlc2NyaXB0aW9uIDogU2V0IExDRCB0aW1pbmcgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0WEcyMUNSVEMoVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX1NldFhHMjFDUlRDKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgVUNIQVIgU3RhbmRUYWJsZUluZGV4LCBpbmRleCwgVGVtcGF4LCBUZW1wYngsIFRlbXBjeCwgVGVtcGR4IDsKLSAgVVNIT1JUIFRlbXAxLCBUZW1wMiwgVGVtcDMgOworICB1bnNpZ25lZCBjaGFyIFN0YW5kVGFibGVJbmRleCwgaW5kZXgsIFRlbXBheCwgVGVtcGJ4LCBUZW1wY3gsIFRlbXBkeDsKKyAgdW5zaWduZWQgc2hvcnQgVGVtcDEsIFRlbXAyLCBUZW1wMzsKIAogICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgewpAQCAtMTU4MCw3ICsxNTUwLDcgQEAKICAgICBUZW1wZHggfD0gVGVtcGN4IDsJCQkJCQkJLyogVGVtcGR4OiBWUlNbODoxXSAqLwogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgzNCAsIFRlbXBkeCApIDsgICAgCQkvKiBTUjM0Wzc6MF06IFZSU1s4OjFdICovCiAKLSAgICBUZW1wMSA9IFRlbXBjeCA8PCAxIDsJCQkJCQkvKiBUZW1wMVs4XTogVlJTWzhdIFVDSEFSIC0+IFVTSE9SVCAqLworICAgIFRlbXAxID0gVGVtcGN4IDw8IDEgOwkJCQkJCS8qIFRlbXAxWzhdOiBWUlNbOF0gdW5zaWduZWQgY2hhciAtPiB1bnNpZ25lZCBzaG9ydCAqLwogICAgIFRlbXAxIHw9IFRlbXBieCA7CQkJCQkJCS8qIFRlbXAxWzg6MF06IFZSU1s4OjBdICovCiAgICAgVGVtcGF4ICY9IDB4ODAgOwkJCQkJCQkvKiBUZW1wYXhbN106IENSN1s3XSAqLwogICAgIFRlbXAyID0gVGVtcGF4IDw8IDIgOwkJCQkJCS8qIFRlbXAyWzldOiBWUlNbOV0gKi8KQEAgLTE1OTQsMTEgKzE1NjQsMTEgQEAKICAgICBpZiAoIFRlbXBheCA8IFRlbXAzICkJCQkJCQkvKiBWUkVbMzowXTxWUlNbMzowXSAqLwogICAgICAgVGVtcDIgfD0gMHgxMCA7CQkJCQkJCS8qIFRlbXAyOiBWUkUgKyAweDEwICovCiAgICAgVGVtcDIgJj0gMHhGRiA7CQkJCQkJCS8qIFRlbXAyWzc6MF06IFZSRVs3OjBdICovCi0gICAgVGVtcGF4ID0gKFVDSEFSKVRlbXAyIDsJCQkJCQkvKiBUZW1wYXhbNzowXTogVlJFWzc6MF0gKi8KKyAgICBUZW1wYXggPSAodW5zaWduZWQgY2hhcilUZW1wMjsJCQkJCS8qIFRlbXBheFs3OjBdOiBWUkVbNzowXSAqLwogICAgIFRlbXBheCA8PD0gMiA7CQkJCQkJCS8qIFRlbXBheCA8PCAyOiBWUkVbNTowXSAqLwogICAgIFRlbXAxICY9IDB4NjAwIDsJCQkJCQkJLyogVGVtcDFbMTA6OV06IFZSU1sxMDo5XSAqLwogICAgIFRlbXAxID4+PSA5IDsJCQkJCQkJLyogWzEwOjldLT5bMTowXSAqLwotICAgIFRlbXBieCA9IChVQ0hBUilUZW1wMSA7CQkJCQkJLyogVGVtcGJ4WzE6MF06IFZSU1sxMDo5XSAqLworICAgIFRlbXBieCA9ICh1bnNpZ25lZCBjaGFyKVRlbXAxOwkJCQkJLyogVGVtcGJ4WzE6MF06IFZSU1sxMDo5XSAqLwogICAgIFRlbXBheCB8PSBUZW1wYnggOwkJCQkJCQkvKiBWUkVbNTowXVZSU1sxMDo5XSAqLwogICAgIFRlbXBheCAmPSAweDdGIDsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4M0YgLCBUZW1wYXggKSA7ICAgCQkvKiBTUjNGIERbNzoyXS0+VlJFIERbMTowXS0+VlJTICovCkBAIC0xNjMyLDcgKzE2MDIsNyBAQAogICAgICAgVGVtcDIgfD0gMHg0MCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVtcDIgKyAweDQwICovCiAKICAgICBUZW1wMiAmPSAweEZGIDsKLSAgICBUZW1wYXggPSAoVUNIQVIpVGVtcDIgOwkJCQkJCS8qIFRlbXBheDogSFJFWzc6MF0gKi8KKyAgICBUZW1wYXggPSAodW5zaWduZWQgY2hhcilUZW1wMjsJCQkJCS8qIFRlbXBheDogSFJFWzc6MF0gKi8KICAgICBUZW1wYXggPDw9IDIgOwkJCQkJCQkvKiBUZW1wYXhbNzoyXTogSFJFWzU6MF0gKi8KICAgICBUZW1wZHggPj49IDYgOwkJCQkJCQkvKiBUZW1wZHhbNzo2XS0+WzE6MF0gSFJTWzk6OF0gKi8KICAgICBUZW1wYXggfD0gVGVtcGR4IDsJCQkJCQkJLyogSFJFWzU6MF1IUlNbOTo4XSAqLwpAQCAtMTY3NiwyMCArMTY0NiwyMiBAQAogICAgICAgVGVtcDIgfD0gMHgyMCA7CQkJCQkJCS8qIFZSRSArIDB4MjAgKi8KIAogICAgIFRlbXAyICY9IDB4RkYgOwotICAgIFRlbXBheCA9IChVQ0hBUilUZW1wMiA7CQkJCQkJLyogVGVtcGF4OiBWUkVbNzowXSAqLworICAgIFRlbXBheCA9ICh1bnNpZ25lZCBjaGFyKVRlbXAyOwkJCQkJLyogVGVtcGF4OiBWUkVbNzowXSAqLwogICAgIFRlbXBheCA8PD0gMiA7CQkJCQkJCS8qIFRlbXBheFs3OjBdOyBWUkVbNTowXTAwICovCiAgICAgVGVtcDEgJj0gMHg2MDAgOwkJCQkJCQkvKiBUZW1wMVsxMDo5XTogVlJTWzEwOjldICovCiAgICAgVGVtcDEgPj49IDkgOyAgCQkJCQkJCS8qIFRlbXAxWzE6MF06IFZSU1sxMDo5XSAqLwotICAgIFRlbXBieCA9IChVQ0hBUilUZW1wMSA7CisgICAgVGVtcGJ4ID0gKHVuc2lnbmVkIGNoYXIpVGVtcDE7CiAgICAgVGVtcGF4IHw9IFRlbXBieCA7CQkJCQkJCS8qIFRlbXBheFs3OjBdOiBWUkVbNTowXVZSU1sxMDo5XSAqLwogICAgIFRlbXBheCAmPSAweDdGIDsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4M0YgLCBUZW1wYXggKSA7ICAgCQkvKiBTUjNGIERbNzoyXS0+VlJFIERbMTowXS0+VlJTICovCiAgIH0KIH0KIAotdm9pZCBYR0lfU2V0WEcyN0NSVEMoVVNIT1JUIE1vZGVObywgVVNIT1JUIE1vZGVJZEluZGV4LCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX1NldFhHMjdDUlRDKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgVVNIT1JUIFN0YW5kVGFibGVJbmRleCwgaW5kZXgsIFRlbXBheCwgVGVtcGJ4LCBUZW1wY3gsIFRlbXBkeCA7CisJdW5zaWduZWQgc2hvcnQgU3RhbmRUYWJsZUluZGV4LCBpbmRleCwgVGVtcGF4LCBUZW1wYngsIFRlbXBjeCwgVGVtcGR4OwogCiAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQogICB7CkBAIC0xNzI2LDcgKzE2OTgsNyBAQAogICAgIFRlbXBieCB8PSBUZW1wYXggOwkJCQkJCQkvKiBUZW1wYnhbOTowXTogVlJFWzk6MF0gKi8KICAgICBpZiAoIFRlbXBheCA8PSAoVGVtcGN4ICYgMHgwRikgKQkJCQkJLyogVlJFWzM6MF08PVZSU1szOjBdICovCiAgICAgICBUZW1wYnggfD0gMHgxMCA7CQkJCQkJCS8qIFRlbXBieDogVlJFICsgMHgxMCAqLwotICAgIFRlbXBheCA9IChVQ0hBUilUZW1wYnggJiAweEZGOwkJCQkJLyogVGVtcGF4Wzc6MF06IFZSRVs3OjBdICovCisgICAgVGVtcGF4ID0gKHVuc2lnbmVkIGNoYXIpVGVtcGJ4ICYgMHhGRjsJCQkJLyogVGVtcGF4Wzc6MF06IFZSRVs3OjBdICovCiAgICAgVGVtcGF4IDw8PSAyIDsJCQkJCQkJLyogVGVtcGF4IDw8IDI6IFZSRVs1OjBdICovCiAgICAgVGVtcGN4ID0gKFRlbXBjeCYweDYwMCk+Pjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZW1wY3ggVlJTWzEwOjldICovCiAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QM2M0ICwgMHgzRiAsIH4weEZDLCBUZW1wYXggKSA7ICAgICAgICAvKiBTUjNGIERbNzoyXS0+VlJFIERbNTowXSAqLwpAQCAtMTgxMCwxMCArMTc4MiwxMiBAQAogLyogT3V0cHV0IDogRkNMSyBkdXR5IGN5Y2xlLCBGQ0xLIGRlbGF5IGNvbXBlbnNhdGlvbiAqLwogLyogRGVzY3JpcHRpb24gOiBBbGwgdmFsdWVzIHNldCB6ZXJvICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldFhHMjFMQ0QoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8sVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxVU0hPUlQgTW9kZU5vKQordm9pZCBYR0lfU2V0WEcyMUxDRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8sCisJCSAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pCiB7Ci0gIFVTSE9SVCBEYXRhICwgVGVtcCAsIGIzQ0MgOwotICBVU0hPUlQgWEdJX1AzY2MgOworCXVuc2lnbmVkIHNob3J0IERhdGEsIFRlbXAsIGIzQ0M7CisJdW5zaWduZWQgc2hvcnQgWEdJX1AzY2M7CiAKICAgWEdJX1AzY2MgPSBwVkJJbmZvLT5QM2NjIDsKIApAQCAtMTg0NCw3ICsxODE4LDcgQEAKIAogICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgewotICAgIGIzQ0MgPSAoVUNIQVIpIFhHSU5ld19HZXRSZWcyKCBYR0lfUDNjYyApIDsKKyAgICBiM0NDID0gKHVuc2lnbmVkIGNoYXIpIFhHSU5ld19HZXRSZWcyKFhHSV9QM2NjKTsKICAgICBpZiAoIGIzQ0MgJiAweDQwICkKICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UDNjNCAsIDB4MzAgLCAweDIwICkgOyAvKiBIc3luYyBwb2xhcml0eSAqLwogICAgIGlmICggYjNDQyAmIDB4ODAgKQpAQCAtMTg2MCwxMCArMTgzNCwxMiBAQAogICB9CiB9CiAKLXZvaWQgWEdJX1NldFhHMjdMQ0QoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8sVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxVU0hPUlQgTW9kZU5vKQordm9pZCBYR0lfU2V0WEcyN0xDRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8sCisJCSAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pCiB7Ci0gIFVTSE9SVCBEYXRhICwgVGVtcCAsIGIzQ0MgOwotICBVU0hPUlQgWEdJX1AzY2MgOworICB1bnNpZ25lZCBzaG9ydCBEYXRhICwgVGVtcCAsIGIzQ0MgOworICB1bnNpZ25lZCBzaG9ydCBYR0lfUDNjYyA7CiAKICAgWEdJX1AzY2MgPSBwVkJJbmZvLT5QM2NjIDsKIApAQCAtMTg5Niw3ICsxODcyLDcgQEAKIAogICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgewotICAgIGIzQ0MgPSAoVUNIQVIpIFhHSU5ld19HZXRSZWcyKCBYR0lfUDNjYyApIDsKKyAgICBiM0NDID0gKHVuc2lnbmVkIGNoYXIpIFhHSU5ld19HZXRSZWcyKFhHSV9QM2NjKTsKICAgICBpZiAoIGIzQ0MgJiAweDQwICkKICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UDNjNCAsIDB4MzAgLCAweDIwICkgOyAvKiBIc3luYyBwb2xhcml0eSAqLwogICAgIGlmICggYjNDQyAmIDB4ODAgKQpAQCAtMTkxOCw3ICsxODk0LDkgQEAKIC8qIE91dHB1dCA6IENSVDEgQ1JUQyAqLwogLyogRGVzY3JpcHRpb24gOiBNb2RpZnkgQ1JUMSBIc3luYy9Wc3luYyB0byBmaXggTENEIG1vZGUgdGltaW5nICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1VwZGF0ZVhHMjFDUlRDKCBVU0hPUlQgTW9kZU5vICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICkKK3ZvaWQgWEdJX1VwZGF0ZVhHMjFDUlRDKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbywKKwkJCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCkKIHsKICAgaW50IGkgLCBpbmRleCA9IC0xOwogCkBAIC0xOTYxLDE2ICsxOTM5LDE1IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRDUlQxREUoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCAsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldENSVDFERShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHJlc2luZGV4ICwKLSAgICAgICAgICAgdGVtcGF4ICwKLSAgICAgICAgICAgdGVtcGJ4ICwKLSAgICAgICAgICAgdGVtcGN4ICwKLSAgICAgICAgICAgdGVtcCAsCi0gICAgICAgICAgIG1vZGVmbGFnIDsKKwl1bnNpZ25lZCBzaG9ydCByZXNpbmRleCwgdGVtcGF4LCB0ZW1wYngsIHRlbXBjeCwgdGVtcCwgbW9kZWZsYWc7CiAKLSAgICBVQ0hBUiBkYXRhIDsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGE7CiAKICAgICByZXNpbmRleCA9IFhHSV9HZXRSZXNJbmZvKCBNb2RlTm8gLCBNb2RlSWRJbmRleCwgcFZCSW5mbyApIDsKIApAQCAtMjAxMywxMyArMTk5MCwxMyBAQAogICAgIHRlbXBheCAtPSAxIDsKICAgICB0ZW1wYnggLT0gMSA7CiAgICAgdGVtcGN4ID0gdGVtcGF4IDsKLSAgICB0ZW1wID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICkgOwotICAgIGRhdGEgPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MTEgKSA7CisgICAgdGVtcCA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzZDQsIDB4MTEpOworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDExKTsKICAgICBkYXRhICY9IDB4N0YgOwogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgxMSAsIGRhdGEgKSA7CQkvKiBVbmxvY2sgQ1JUQyAqLwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgwMSAsICggVVNIT1JUICkoIHRlbXBjeCAmIDB4ZmYgKSApIDsKLSAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDBiICwgfjB4MGMgLCAoIFVTSE9SVCApKCAoIHRlbXBjeCAmIDB4MGZmMDAgKSA+PiAxMCApICkgOwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgxMiAsICggVVNIT1JUICkoIHRlbXBieCAmIDB4ZmYgKSApIDsKKyAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDAxLCAodW5zaWduZWQgc2hvcnQpKHRlbXBjeCAmIDB4ZmYpKTsKKyAgICBYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UDNkNCwgMHgwYiwgfjB4MGMsICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBjeCAmIDB4MGZmMDApID4+IDEwKSk7CisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNkNCwgMHgxMiwgKHVuc2lnbmVkIHNob3J0KSh0ZW1wYnggJiAweGZmKSk7CiAgICAgdGVtcGF4ID0gMCA7CiAgICAgdGVtcGJ4ID0gdGVtcGJ4ID4+IDggOwogCkBAIC0yMDMwLDcgKzIwMDcsNyBAQAogICAgICAgICB0ZW1wYXggfD0gMHg0MCA7CiAKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDA3ICwgfjB4NDIgLCB0ZW1wYXggKSA7Ci0gICAgZGF0YSA9KCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDA3ICkgOworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDA3KTsKICAgICBkYXRhICY9IDB4RkYgOwogICAgIHRlbXBheCA9IDAgOwogCkBAIC0yMDQ4LDkgKzIwMjUsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVTSE9SVCAJWEdJX0dldFJlc0luZm8oVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordW5zaWduZWQgc2hvcnQgWEdJX0dldFJlc0luZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHJlc2luZGV4IDsKKwl1bnNpZ25lZCBzaG9ydCByZXNpbmRleDsKIAogICAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQogICAgIHsKQEAgLTIwNzAsOSArMjA0OSwxMyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0Q1JUMU9mZnNldCggIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0Q1JUMU9mZnNldCh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJICAgICAgIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkgICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wICwKICAgICAgICAgICAgYWggLAogICAgICAgICAgICBhbCAsCiAgICAgICAgICAgIHRlbXAyICwKQEAgLTIxMzEsNyArMjExNCw3IEBACiAgICAgaSB8PSB0ZW1wIDsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MEUgLCBpICkgOwogCi0gICAgdGVtcCA9KCBVQ0hBUiApdGVtcDIgOworICAgIHRlbXAgPSAodW5zaWduZWQgY2hhcil0ZW1wMjsKICAgICB0ZW1wICY9IDB4RkYgOwkJLyogYWwgKi8KICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4MTMgLCB0ZW1wICkgOwogCkBAIC0yMTYzLDExICsyMTQ2LDEzIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRDUlQxVkNMSyggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsCi0gICAgICAgICAgICAgICAgICAgICAgICBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0Q1JUMVZDTEsodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgICBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIGluZGV4ICwgZGF0YSA7Ci0gICAgVVNIT1JUIHZjbGtpbmRleCA7CisJdW5zaWduZWQgY2hhciBpbmRleCwgZGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2Y2xraW5kZXggOwogCiAgICAgaWYgKCBwVkJJbmZvLT5JRl9ERUZfTFZEUyA9PSAxICkKICAgICB7CkBAIC0yMjI0LDkgKzIyMDksMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldENSVDFGSUZPKCBVU0hPUlQgTW9kZU5vICwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9TZXRDUlQxRklGTyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCSAgICAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBkYXRhIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBkYXRhIDsKIAogICAgIGRhdGEgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4M0QgKSA7CiAgICAgZGF0YSAmPSAweGZlIDsKQEAgLTIyNzMsMTAgKzIyNjAsMTIgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldENSVDFNb2RlUmVncyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0Q1JUMU1vZGVSZWdzKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkJIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZGF0YSAsCisgICAgdW5zaWduZWQgc2hvcnQgZGF0YSAsCiAgICAgICAgICAgIGRhdGEyICwKICAgICAgICAgICAgZGF0YTMgLAogICAgICAgICAgICBpbmZvZmxhZyA9IDAgLApAQCAtMjQxMSwxMyArMjQwMCwxNiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0VkNMS1N0YXRlKCAgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldFZDTEtTdGF0ZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZGF0YSAsCisgICAgdW5zaWduZWQgc2hvcnQgZGF0YSAsCiAgICAgICAgICAgIGRhdGEyID0gMCA7Ci0gICAgU0hPUlQgIFZDTEsgOworICAgIHNob3J0IFZDTEsgOwogCi0gICAgVUNIQVIgIGluZGV4IDsKKyAgICB1bnNpZ25lZCBjaGFyIGluZGV4OwogCiAgICAgaWYgKCBNb2RlTm8gPD0gMHgxMyApCiAgICAgICAgIFZDTEsgPSAwIDsKQEAgLTI0NzUsOSArMjQ2Nyw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKnZvaWQgWEdJX1Zlc2FMb3dSZXNvbHV0aW9uKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICxQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKKy8qdm9pZCBYR0lfVmVzYUxvd1Jlc29sdXRpb24odW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBtb2RlZmxhZzsKKyAgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZzsKIAogICAgIGlmICggTW9kZU5vID4gMHgxMyApCiAgICAgICAgIG1vZGVmbGFnID0gcFZCSW5mby0+RU1vZGVJRFRhYmxlWyBNb2RlSWRJbmRleCBdLkV4dF9Nb2RlRmxhZyA7CkBAIC0yNTE4LDkgKzI1MTAsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0xvYWREQUMoIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXgsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfTG9hZERBQyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCSB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgZGF0YSAsIGRhdGEyICwgdGltZSAsCisgICAgdW5zaWduZWQgc2hvcnQgZGF0YSAsIGRhdGEyICwgdGltZSAsCiAgICAgICAgICAgIGkgICwgaiAsIGsgLCBtICwgbiAsIG8gLAogICAgICAgICAgICBzaSAsIGRpICwgYnggLCBkbCAsIGFsICwgYWggLCBkaCAsCiAgICAgICAgICAgICp0YWJsZSA9IE5VTEwgOwpAQCAtMjYyNyw5ICsyNjIxLDExIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9Xcml0ZURBQyggVVNIT1JUIGRsICwgVVNIT1JUIGFoICwgVVNIT1JUIGFsICwgVVNIT1JUIGRoLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1dyaXRlREFDKHVuc2lnbmVkIHNob3J0IGRsLCB1bnNpZ25lZCBzaG9ydCBhaCwKKwkJICB1bnNpZ25lZCBzaG9ydCBhbCwgdW5zaWduZWQgc2hvcnQgZGgsCisJCSAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wICwgYmggLCBibCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCAsIGJoICwgYmwgOwogCiAgICAgYmggPSBhaCA7CiAgICAgYmwgPSBhbCA7CkBAIC0yNjUyLDcwICsyNjQ4LDI0IEBACiAgICAgICAgICAgICBiaCA9IHRlbXAgOwogICAgICAgICB9CiAgICAgfQotICAgIFhHSU5ld19TZXRSZWczKCBwVkJJbmZvLT5QM2M5ICwgKCBVU0hPUlQgKWRoICkgOwotICAgIFhHSU5ld19TZXRSZWczKCBwVkJJbmZvLT5QM2M5ICwgKCBVU0hPUlQgKWJoICkgOwotICAgIFhHSU5ld19TZXRSZWczKCBwVkJJbmZvLT5QM2M5ICwgKCBVU0hPUlQgKWJsICkgOworICAgIFhHSU5ld19TZXRSZWczKHBWQkluZm8tPlAzYzksICh1bnNpZ25lZCBzaG9ydClkaCk7CisgICAgWEdJTmV3X1NldFJlZzMocFZCSW5mby0+UDNjOSwgKHVuc2lnbmVkIHNob3J0KWJoKTsKKyAgICBYR0lOZXdfU2V0UmVnMyhwVkJJbmZvLT5QM2M5LCAodW5zaWduZWQgc2hvcnQpYmwpOwogfQogCi0jaWYgMAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGdW5jdGlvbiA6IFhHSV9DbGVhckJ1ZmZlciAqLwotLyogSW5wdXQgOiAqLwotLyogT3V0cHV0IDogKi8KLS8qIERlc2NyaXB0aW9uIDogKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfQ2xlYXJCdWZmZXIoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBVU0hPUlQgTW9kZU5vLCBQVkJfREVWSUNFX0lORk8gIHBWQkluZm8pCi17Ci0gICAgUFZPSUQgVmlkZW9NZW1vcnlBZGRyZXNzID0gKCBQVk9JRCApSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlkZW9NZW1vcnlBZGRyZXNzIDsKLSAgICBVTE9ORyBBZGFwdGVyTWVtb3J5U2l6ZSAgPSAoIFVMT05HIClId0RldmljZUV4dGVuc2lvbi0+dWxWaWRlb01lbW9yeVNpemUgOwotICAgIFBVU0hPUlQgcEJ1ZmZlciA7Ci0jaWZuZGVmIExJTlVYX1hGODYKLSAgICBpbnQgaSA7Ci0jZW5kaWYKLQotICAgIGlmICggcFZCSW5mby0+TW9kZVR5cGUgPj0gTW9kZUVHQSApCi0gICAgewotICAgICAgICBpZiAoIE1vZGVObyA+IDB4MTMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGFwdGVyTWVtb3J5U2l6ZSA9IDB4NDAwMDAgOwkvKiBjbGVhciAyNTZrICovCi0gICAgICAgICAgICAvKiBHZXREUkFNU2l6ZSggSHdEZXZpY2VFeHRlbnNpb24gKSA7ICovCi0gICAgICAgICAgICBYR0lfU2V0TWVtb3J5KCBWaWRlb01lbW9yeUFkZHJlc3MgLCBBZGFwdGVyTWVtb3J5U2l6ZSAsIDAgKSA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0vKgotICAgICAgICAgICAgcEJ1ZmZlciA9IFZpZGVvTWVtb3J5QWRkcmVzcyA7Ci0gICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8IDB4NDAwMCA7IGkrKyApCi0gICAgICAgICAgICAgICAgcEJ1ZmZlclsgaSBdID0gMHgwMDAwIDsKLSovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEJ1ZmZlciA9IFZpZGVvTWVtb3J5QWRkcmVzcyA7Ci0gICAgICAgIGlmICggcFZCSW5mby0+TW9kZVR5cGUgPCBNb2RlQ0dBICkKLSAgICAgICAgewotLyoKLSAgICAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IDB4NDAwMCA7IGkrKyApCi0gICAgICAgICAgICAgICAgcEJ1ZmZlclsgaSBdID0gMHgwNzIwIDsKLSovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgWEdJX1NldE1lbW9yeSggVmlkZW9NZW1vcnlBZGRyZXNzICwgMHg4MDAwICwgMCApIDsKLSAgICB9Ci19Ci0KLSNlbmRpZgogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBGdW5jdGlvbiA6IFhHSV9TZXRMQ0RBR3JvdXAgKi8KIC8qIElucHV0IDogKi8KIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldExDREFHcm91cCggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyApCit2b2lkIFhHSV9TZXRMQ0RBR3JvdXAodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgICAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCSAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4IDsKLSAgICAvKiBVU0hPUlQgdGVtcCA7ICovCisgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4IDsKKyAgICAvKiB1bnNpZ25lZCBzaG9ydCB0ZW1wIDsgKi8KIAogICAgIC8qIHBWQkluZm8tPlNlbGVjdENSVDJSYXRlID0gMCA7ICovCiAKQEAgLTI3MzUsOSArMjY4NSwxMSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfR2V0TFZEU1Jlc0luZm8oIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXgsUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvICkKK3ZvaWQgWEdJX0dldExWRFNSZXNJbmZvKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCByZXNpbmRleCAsIHhyZXMgLCB5cmVzICwgbW9kZWZsYWcgOworICAgIHVuc2lnbmVkIHNob3J0IHJlc2luZGV4ICwgeHJlcyAsIHlyZXMgLCBtb2RlZmxhZyA7CiAKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICB7CkBAIC0yODAzLDE3ICsyNzU1LDIwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9HZXRMVkRTRGF0YSggIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gIHBWQkluZm8gKQordm9pZCBYR0lfR2V0TFZEU0RhdGEodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBieCA7Ci0gICAgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICpMQ0RQdHIgPSBOVUxMIDsKLSAgICBYR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgICpUVlB0ciA9IE5VTEwgOworICAgIHVuc2lnbmVkIHNob3J0IHRlbXBieCA7CisgICAgc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAqTENEUHRyID0gTlVMTCA7CisgICAgc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAgKlRWUHRyID0gTlVMTCA7CiAKICAgICB0ZW1wYnggPSAyIDsKIAogICAgIGlmICggcFZCSW5mby0+VkJJbmZvICYgKCBTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBICkgKQogICAgIHsKLSAgICAgICAgTENEUHRyID0gKCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgKiApWEdJX0dldExjZFB0ciggdGVtcGJ4LCBNb2RlTm8gLCBNb2RlSWRJbmRleCAsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbykgOworCUxDRFB0ciA9IChzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICopWEdJX0dldExjZFB0cih0ZW1wYngsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyk7CiAgICAgICAgIHBWQkluZm8tPlZHQUhUID0gTENEUHRyLT5WR0FIVCA7CiAgICAgICAgIHBWQkluZm8tPlZHQVZUID0gTENEUHRyLT5WR0FWVCA7CiAgICAgICAgIHBWQkluZm8tPkhUID0gTENEUHRyLT5MQ0RIVCA7CkBAIC0yODIzLDcgKzI3NzgsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UViApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFRWUHRyID0gKCBYR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgKiApWEdJX0dldFRWUHRyKCB0ZW1wYnggLCBNb2RlTm8gLCBNb2RlSWRJbmRleCAsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyApIDsKKwkgICAgVFZQdHIgPSAoc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAqKVhHSV9HZXRUVlB0cih0ZW1wYngsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyk7CiAgICAgICAgICAgICBwVkJJbmZvLT5WR0FIVCA9IFRWUHRyLT5WR0FIVCA7CiAgICAgICAgICAgICBwVkJJbmZvLT5WR0FWVCA9IFRWUHRyLT5WR0FWVCA7CiAgICAgICAgICAgICBwVkJJbmZvLT5IVCA9IFRWUHRyLT5MQ0RIVCA7CkBAIC0yODY2LDE2ICsyODIxLDE4IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9Nb2RDUlQxUmVncyggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixQVkJfREVWSUNFX0lORk8gIHBWQkluZm8gKQordm9pZCBYR0lfTW9kQ1JUMVJlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIGluZGV4IDsKLSAgICBVU0hPUlQgdGVtcGJ4ICwgaSA7Ci0gICAgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgICpMQ0RQdHIgPSBOVUxMIDsKLSAgICBYR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCAgKkxDRFB0cjEgPU5VTEwgOwotICAgIC8qIFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAqVFZQdHIgPSBOVUxMIDsgKi8KLSAgICBYR0lfQ0g3MDA3VFZfVGltaW5nSFN0cnVjdCAqQ0g3MDA3VFZfVGltaW5nSFB0ciA9IE5VTEw7Ci0gICAgWEdJX0NINzAwN1RWX1RpbWluZ1ZTdHJ1Y3QgKkNINzAwN1RWX1RpbWluZ1ZQdHIgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgaW5kZXg7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4ICwgaSA7CisgICAgc3RydWN0IFhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0ICAqTENEUHRyID0gTlVMTDsKKyAgICBzdHJ1Y3QgWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgICpMQ0RQdHIxID0gTlVMTDsKKyAgICAvKiBzdHJ1Y3QgWEdJMzMwX0NIVFZEYXRhU3RydWN0ICpUVlB0ciA9IE5VTEwgOyAqLworICAgIHN0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nSFN0cnVjdCAqQ0g3MDA3VFZfVGltaW5nSFB0ciA9IE5VTEw7CisgICAgc3RydWN0IFhHSV9DSDcwMDdUVl9UaW1pbmdWU3RydWN0ICpDSDcwMDdUVl9UaW1pbmdWUHRyID0gTlVMTDsKIAogICAgIGlmKCBNb2RlTm8gPD0gMHgxMyApCiAgICAgICAgIGluZGV4ID0gcFZCSW5mby0+U01vZGVJRFRhYmxlWyBNb2RlSWRJbmRleCBdLlN0X0NSVDJDUlRDIDsKQEAgLTI4OTAsNyArMjg0Nyw3IEBACiAKICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiAoIFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEgKSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIExDRFB0ciA9ICggWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgKiApWEdJX0dldExjZFB0ciggdGVtcGJ4ICwgTW9kZU5vICwgTW9kZUlkSW5kZXggLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHBWQkluZm8gKSA7CisJICAgIExDRFB0ciA9IChzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgKilYR0lfR2V0TGNkUHRyKHRlbXBieCwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKIAogICAgICAgICAgICAgZm9yKCBpID0gMCA7IGkgPCA4IDsgaSsrICkKICAgICAgICAgICAgICAgICBwVkJJbmZvLT5UaW1pbmdIWyAwIF0uZGF0YVsgaSBdID0gTENEUHRyWyAwIF0uUmVnWyBpIF0gOwpAQCAtMjkwMCw3ICsyODU3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UViApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0g3MDA3VFZfVGltaW5nSFB0ciA9ICggWEdJX0NINzAwN1RWX1RpbWluZ0hTdHJ1Y3QgKilYR0lfR2V0VFZQdHIoIHRlbXBieCAsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCQlDSDcwMDdUVl9UaW1pbmdIUHRyID0gKHN0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nSFN0cnVjdCAqKVhHSV9HZXRUVlB0cih0ZW1wYngsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyk7CiAKICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8IDggOyBpKysgKQogICAgICAgICAgICAgICAgICAgICBwVkJJbmZvLT5UaW1pbmdIWyAwIF0uZGF0YVsgaSBdID0gQ0g3MDA3VFZfVGltaW5nSFB0clsgMCBdLmRhdGFbIGkgXSA7CkBAIC0yOTEwLDcgKzI4NjcsNyBAQAogICAgICAgICAvKiBpZiAoIHBWQkluZm8tPklGX0RFRl9DSDcwMTcgPT0gMSApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggcFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvVFYgKQotICAgICAgICAgICAgICAgIFRWUHRyID0gKCBYR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgKilYR0lfR2V0VFZQdHIoIHRlbXBieCAsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCQlUVlB0ciA9ICggc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAqKVhHSV9HZXRUVlB0ciggdGVtcGJ4ICwgTW9kZU5vICwgTW9kZUlkSW5kZXggLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHBWQkluZm8gKSA7CiAgICAgICAgIH0gKi8KIAogICAgICAgICBYR0lfU2V0Q1JUMVRpbWluZ19IKHBWQkluZm8sSHdEZXZpY2VFeHRlbnNpb24pIDsKQEAgLTI5MjUsNyArMjg4Miw3IEBACiAKICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiAoIFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEgKSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIExDRFB0cjEgPSAoIFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0ICogKVhHSV9HZXRMY2RQdHIoIHRlbXBieCAsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCSAgICBMQ0RQdHIxID0gKHN0cnVjdCBYR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCAqKVhHSV9HZXRMY2RQdHIodGVtcGJ4LCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHBWQkluZm8pOwogICAgICAgICAgICAgZm9yKCBpID0gMCA7IGkgPCA3IDsgaSsrICkKICAgICAgICAgICAgICAgICBwVkJJbmZvLT5UaW1pbmdWWyAwIF0uZGF0YVsgaSBdID0gTENEUHRyMVsgMCBdLlJlZ1sgaSBdIDsKICAgICAgICAgfQpAQCAtMjkzNCw3ICsyODkxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UViApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0g3MDA3VFZfVGltaW5nVlB0ciA9ICggWEdJX0NINzAwN1RWX1RpbWluZ1ZTdHJ1Y3QgKilYR0lfR2V0VFZQdHIoIHRlbXBieCAsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCQlDSDcwMDdUVl9UaW1pbmdWUHRyID0gKHN0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nVlN0cnVjdCAqKVhHSV9HZXRUVlB0cih0ZW1wYngsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyk7CiAKICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8IDcgOyBpKysgKQogICAgICAgICAgICAgICAgICAgICBwVkJJbmZvLT5UaW1pbmdWWyAwIF0uZGF0YVsgaSBdID0gQ0g3MDA3VFZfVGltaW5nVlB0clsgMCBdLmRhdGFbIGkgXSA7CkBAIC0yOTQzLDcgKzI5MDAsNyBAQAogICAgICAgICAvKiBpZiAoIHBWQkluZm8tPklGX0RFRl9DSDcwMTcgPT0gMSApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggcFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvVFYgKQotICAgICAgICAgICAgICAgIFRWUHRyID0gKCBYR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgKilYR0lfR2V0VFZQdHIoIHRlbXBieCAsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCQlUVlB0ciA9ICggc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAqKVhHSV9HZXRUVlB0ciggdGVtcGJ4ICwgTW9kZU5vICwgTW9kZUlkSW5kZXggLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHBWQkluZm8gKSA7CiAgICAgICAgIH0gKi8KIAogICAgICAgICBYR0lfU2V0Q1JUMVRpbWluZ19WKCBNb2RlSWRJbmRleCAsIE1vZGVObyAsIHBWQkluZm8pIDsKQEAgLTI5NjYsMTIgKzI5MjMsMTQgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldExWRFNSZWdzKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldExWRFNSZWdzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4ICwgdGVtcGF4ICwgdGVtcGN4ICwgdGVtcGR4ICwgcHVzaDEgLCBwdXNoMiAsIG1vZGVmbGFnIDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYnggLCB0ZW1wYXggLCB0ZW1wY3ggLCB0ZW1wZHggLCBwdXNoMSAsIHB1c2gyICwgbW9kZWZsYWcgOwogICAgIHVuc2lnbmVkIGxvbmcgdGVtcCAsIHRlbXAxICwgdGVtcDIgLCB0ZW1wMyAsIHB1c2gzIDsKLSAgICBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgKkxDRFB0ciA9IE5VTEwgOwotICAgIFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0MiAgKkxDRFB0cjEgPSBOVUxMIDsKKyAgICBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgICpMQ0RQdHIgPSBOVUxMIDsKKyAgICBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QyICAqTENEUHRyMSA9IE5VTEwgOwogCiAgICAgaWYgKCBNb2RlTm8gPiAweDEzICkKICAgICAgICAgbW9kZWZsYWcgPSBwVkJJbmZvLT5FTW9kZUlEVGFibGVbIE1vZGVJZEluZGV4IF0uRXh0X01vZGVGbGFnIDsKQEAgLTI5ODUsMTYgKzI5NDQsMTYgQEAKICAgICAgICAgICAgIGlmICggcFZCSW5mby0+SUZfREVGX09FTVV0aWwgPT0gMSApCiAgICAgICAgICAgICB7CiAgICAgCSAgICAgICAgdGVtcGJ4ID0gOCA7Ci0gICAgCSAgICAgICAgTENEUHRyID0gKCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAqIClYR0lfR2V0TGNkUHRyKCB0ZW1wYnggLCBNb2RlTm8gLCBNb2RlSWRJbmRleCAsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyApIDsKKwkJTENEUHRyID0gKHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAqKVhHSV9HZXRMY2RQdHIodGVtcGJ4LCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHBWQkluZm8pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoICggcFZCSW5mby0+SUZfREVGX09FTVV0aWwgPT0gMCApIHx8ICggTENEUHRyID09IDAgKSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGVtcGJ4ID0gMyA7CiAgICAgICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCApCi0gICAgICAgICAgICAgICAgICAgIExDRFB0cjEgPSAoIFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0MiAqIClYR0lfR2V0TGNkUHRyKCB0ZW1wYnggLCBNb2RlTm8gLCBNb2RlSWRJbmRleCAsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyApIDsKKwkJICAgIExDRFB0cjEgPSAoc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0MiAqKVhHSV9HZXRMY2RQdHIodGVtcGJ4LCBNb2RlTm8sIE1vZGVJZEluZGV4LCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHBWQkluZm8pOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgTENEUHRyID0gKCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAqIClYR0lfR2V0TGNkUHRyKCB0ZW1wYnggLCBNb2RlTm8gLCBNb2RlSWRJbmRleCAsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyApIDsKKwkJICAgIExDRFB0ciA9IChzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgKilYR0lfR2V0TGNkUHRyKHRlbXBieCwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgWEdJX0dldExDRFN5bmMoICZ0ZW1wYXggLCAmdGVtcGJ4ICxwVkJJbmZvKSA7CkBAIC0zMDU2LDggKzMwMTUsOCBAQAogICAgICAgICAgICAgdGVtcGN4ID0gdGVtcGN4ID4+IDMgOwogICAgICAgICAgICAgdGVtcGJ4ID0gdGVtcGJ4ID4+IDMgOwogCi0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxNiAsICggVVNIT1JUICkoIHRlbXBieCAmIDB4ZmYgKSApIDsKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDE3ICwgKCBVU0hPUlQgKSggdGVtcGN4ICYgMHhmZiApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTYsICh1bnNpZ25lZCBzaG9ydCkodGVtcGJ4ICYgMHhmZikpOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTcsICh1bnNpZ25lZCBzaG9ydCkodGVtcGN4ICYgMHhmZikpOwogCiAgICAgICAgICAgICB0ZW1wYXggPSBwVkJJbmZvLT5IVCA7CiAKQEAgLTMwODUsNyArMzA0NCw3IEBACiAgICAgICAgICAgICB0ZW1wYXggfD0gdGVtcGN4IDsKIAogICAgICAgICAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MTUgLCB0ZW1wYXggKSA7Ci0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxNCAsICggVVNIT1JUICkoIHRlbXBieCAmIDB4ZmYgKSApIDsKKwkgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0LCAweDE0LCAodW5zaWduZWQgc2hvcnQpKHRlbXBieCAmIDB4ZmYpKTsKIAogICAgICAgICAgICAgdGVtcGF4ID0gcFZCSW5mby0+VlQgOwogICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCApCkBAIC0zMDk5LDEzICszMDU4LDEzIEBACiAgICAgICAgICAgICBpZiAoIHRlbXBjeCA+PSB0ZW1wYXggKQogICAgICAgICAgICAgICAgIHRlbXBjeCAtPSB0ZW1wYXggOwogCi0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxYiAsICggVVNIT1JUICkoIHRlbXBieCAmIDB4ZmYgKSApIDsKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDFjICwgKCBVU0hPUlQgKSggdGVtcGN4ICYgMHhmZiApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MWIsICh1bnNpZ25lZCBzaG9ydCkodGVtcGJ4ICYgMHhmZikpOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MWMsICh1bnNpZ25lZCBzaG9ydCkodGVtcGN4ICYgMHhmZikpOwogCiAgICAgICAgICAgICB0ZW1wYnggPSAoIHRlbXBieCA+PiA4ICkgJiAweDA3IDsKICAgICAgICAgICAgIHRlbXBjeCA9ICggdGVtcGN4ID4+IDggKSAmIDB4MDcgOwogCi0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxZCAsICggVVNIT1JUICkoICggdGVtcGN4IDw8IDMgKSB8IHRlbXBieCApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MWQsICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBjeCA8PCAzKSB8IHRlbXBieCkpOwogCiAgICAgICAgICAgICB0ZW1wYXggPSBwVkJJbmZvLT5WVCA7CiAgICAgICAgICAgICBpZiAoIHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEICkKQEAgLTMxMjMsOCArMzA4Miw4IEBACiAgICAgICAgICAgICBpZiAoIHRlbXBjeCA+PSB0ZW1wYXggKQogICAgICAgICAgICAgICAgIHRlbXBjeCAtPSB0ZW1wYXggOwogCi0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxOCAsICggVVNIT1JUICkoIHRlbXBieCAmIDB4ZmYgKSApIDsKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxOSAsIH4weDBmICwgKCBVU0hPUlQgKSggdGVtcGN4ICYgMHgwZiApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTgsICh1bnNpZ25lZCBzaG9ydCkodGVtcGJ4ICYgMHhmZikpOworCSAgICBYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UGFydDFQb3J0LCAweDE5LCB+MHgwZiwgKHVuc2lnbmVkIHNob3J0KSh0ZW1wY3ggJiAweDBmKSk7CiAKICAgICAgICAgICAgIHRlbXBheCA9ICggKCB0ZW1wYnggPj4gOCApICYgMHgwNyApIDw8IDMgOwogCkBAIC0zMTQ1LDcgKzMxMDQsNyBAQAogICAgICAgICAgICAgdGVtcCA9IHRlbXBheCA7ICAgICAgICAgICAgLyogMDQzMCB5bHNoaWVoICovCiAgICAgICAgICAgICB0ZW1wMSA9ICggdGVtcCA8PCAxOCApIC8gdGVtcGJ4IDsKIAotICAgICAgICAgICAgdGVtcGR4ID0gKCBVU0hPUlQgKSggKCB0ZW1wIDw8IDE4ICkgJSB0ZW1wYnggKSA7CisJICAgIHRlbXBkeCA9ICh1bnNpZ25lZCBzaG9ydCkoKHRlbXAgPDwgMTgpICUgdGVtcGJ4KTsKIAogICAgICAgICAgICAgaWYgKCB0ZW1wZHggIT0gMCApCiAgICAgICAgICAgICB0ZW1wMSArPSAxIDsKQEAgLTMxNTMsMTAgKzMxMTIsMTAgQEAKICAgICAgICAgICAgIHRlbXAyID0gdGVtcDEgOwogICAgICAgICAgICAgcHVzaDMgPSB0ZW1wMiA7CiAKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDM3ICwgKCBVU0hPUlQgKSggdGVtcDIgJiAweGZmICkgKSA7Ci0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgzNiAsICggVVNIT1JUICkoICggdGVtcDIgPj4gOCApICYgMHhmZiApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MzcsICh1bnNpZ25lZCBzaG9ydCkodGVtcDIgJiAweGZmKSk7CisJICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgzNiwgKHVuc2lnbmVkIHNob3J0KSgodGVtcDIgPj4gOCkgJiAweGZmKSk7CiAKLSAgICAgICAgICAgIHRlbXBieCA9ICggVVNIT1JUICkoIHRlbXAyID4+IDE2ICkgOworCSAgICB0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpKHRlbXAyID4+IDE2KTsKICAgICAgICAgICAgIHRlbXBheCA9IHRlbXBieCAmIDB4MDMgOwogCiAgICAgICAgICAgICB0ZW1wYnggPSBwVkJJbmZvLT5WR0FWREUgOwpAQCAtMzE2OCwxMCArMzEyNywxMCBAQAogICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQlR5cGUgJiBWQl9YR0kzMDFDICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0ZW1wMiA9IHB1c2gzIDsKLSAgICAgIAkgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDNjICwgKCBVU0hPUlQgKSggdGVtcDIgJiAweGZmICkgKSA7Ci0gICAgICAJICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgzYiAsICggVVNIT1JUICkoICggdGVtcDIgPj4gOCApICYgMHhmZiApICkgOwotICAgICAgCSAgICAgICAgdGVtcGJ4ID0gKCBVU0hPUlQgKSggdGVtcDIgPj4gMTYgKSA7Ci0gICAgICAJICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlBhcnQ0UG9ydCAsIDB4M2EgLCB+MHhjMCAsICggVVNIT1JUICkoICggdGVtcGJ4ICYgMHhmZiApIDw8IDYgKSApIDsKKwkJWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDRQb3J0LCAweDNjLCAodW5zaWduZWQgc2hvcnQpKHRlbXAyICYgMHhmZikpOworCQlYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4M2IsICh1bnNpZ25lZCBzaG9ydCkoKHRlbXAyID4+IDgpICYgMHhmZikpOworCQl0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpKHRlbXAyID4+IDE2KTsKKwkJWEdJTmV3X1NldFJlZ0FORE9SKHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgzYSwgfjB4YzAsICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBieCAmIDB4ZmYpIDw8IDYpKTsKIAogICAgICAgICAgICAgICAgIHRlbXBjeCA9IHBWQkluZm8tPlZHQVZERSA7CiAgICAgICAgICAgICAgICAgaWYgKCB0ZW1wY3ggPT0gcFZCSW5mby0+VkRFICkKQEAgLTMxODUsNyArMzE0NCw3IEBACiAKICAgICAgICAgICAgIHRlbXAxID0gdGVtcGN4IDw8IDE2IDsKIAotICAgICAgICAgICAgdGVtcGF4ID0gKCBVU0hPUlQgKSggdGVtcDEgLyB0ZW1wYnggKSA7CisJICAgIHRlbXBheCA9ICh1bnNpZ25lZCBzaG9ydCkodGVtcDEgLyB0ZW1wYngpOwogCiAgICAgICAgICAgICBpZiAoICggdGVtcGJ4ICYgMHhmZmZmICkgPT0gKCB0ZW1wY3ggJiAweGZmZmYgKSApCiAgICAgICAgICAgICAgICAgdGVtcGF4ID0gNjU1MzUgOwpAQCAtMzE5OSwyOCArMzE1OCwyOCBAQAogCiAgICAgICAgICAgICB0ZW1wMyA9ICggdGVtcDMgJiAweGZmZmYwMDAwICkgKyAoIHRlbXAxICYgMHhmZmZmICkgOwogCi0gICAgICAgICAgICB0ZW1wYXggPSAoIFVTSE9SVCApKCB0ZW1wMyAmIDB4ZmYgKSA7CisJICAgIHRlbXBheCA9ICh1bnNpZ25lZCBzaG9ydCkodGVtcDMgJiAweGZmKTsKICAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDFmICwgdGVtcGF4ICkgOwogCiAgICAgICAgICAgICB0ZW1wMSA9IHBWQkluZm8tPlZHQVZERSA8PCAxOCA7CiAgICAgICAgICAgICB0ZW1wMSA9IHRlbXAxIC8gcHVzaDMgOwotICAgICAgICAgICAgdGVtcGJ4ID0gKCBVU0hPUlQgKSggdGVtcDEgJiAweGZmZmYgKSA7CisJICAgIHRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkodGVtcDEgJiAweGZmZmYpOwogCiAgICAgICAgICAgICBpZiAoIHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMDI0eDc2OCApCiAgICAgICAgICAgICAgICAgdGVtcGJ4IC09IDEgOwogCiAgICAgICAgICAgICB0ZW1wYXggPSAoICggdGVtcGJ4ID4+IDggKSAmIDB4ZmYgKSA8PCAzIDsKLSAgICAgICAgICAgIHRlbXBheCB8PSAoIFVTSE9SVCApKCAoIHRlbXAzID4+IDggKSAmIDB4MDcgKSA7Ci0gICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgyMCAsICggVVNIT1JUICkoIHRlbXBheCAmIDB4ZmYgKSApIDsKLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDIxICwgKCBVU0hPUlQgKSggdGVtcGJ4ICYgMHhmZiApICkgOworCSAgICB0ZW1wYXggfD0gKHVuc2lnbmVkIHNob3J0KSgodGVtcDMgPj4gOCkgJiAweDA3KTsKKwkgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0LCAweDIwLCAodW5zaWduZWQgc2hvcnQpKHRlbXBheCAmIDB4ZmYpKTsKKwkgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0LCAweDIxLCAodW5zaWduZWQgc2hvcnQpKHRlbXBieCAmIDB4ZmYpKTsKIAogICAgICAgICAgICAgdGVtcDMgPSB0ZW1wMyA+PiAxNiA7CiAKICAgICAgICAgICAgIGlmICggbW9kZWZsYWcgJiBIYWxmRENMSyApCiAgICAgICAgICAgICAgICAgdGVtcDMgPSB0ZW1wMyA+PiAxIDsKIAotICAgICAgICAgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0ICwgMHgyMiAsICggVVNIT1JUICkoICggdGVtcDMgPj4gOCApICYgMHhmZiApICkgOwotICAgICAgICAgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0ICwgMHgyMyAsICggVVNIT1JUICkoIHRlbXAzICYgMHhmZiApICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDIyLCAodW5zaWduZWQgc2hvcnQpKCh0ZW1wMyA+PiA4KSAmIDB4ZmYpKTsKKwkgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0ICwgMHgyMywgKHVuc2lnbmVkIHNob3J0KSh0ZW1wMyAmIDB4ZmYpKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTMyMzIsOSArMzE5MSw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRDUlQyRUNMSyggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyApCit2b2lkIFhHSV9TZXRDUlQyRUNMSyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiBkaV8wICwgZGlfMSAsIHRlbXBhbCA7CisgICAgdW5zaWduZWQgY2hhciBkaV8wLCBkaV8xLCB0ZW1wYWw7CiAgICAgaW50IGkgOwogCiAgICAgdGVtcGFsID0gWEdJX0dldFZDTEtQdHIoIFJlZnJlc2hSYXRlVGFibGVJbmRleCAsIE1vZGVObyAsIE1vZGVJZEluZGV4LCBwVkJJbmZvICkgOwpAQCAtMzI0Myw3ICszMjAyLDcgQEAKIAogICAgIGZvciggaSA9IDAgOyBpIDwgNCA7IGkrKyApCiAgICAgewotICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDMxICwgfjB4MzAgLCAoIFVTSE9SVCApKCAweDEwICogaSApICkgOworCVhHSU5ld19TZXRSZWdBTkRPUihwVkJJbmZvLT5QM2Q0LCAweDMxLCB+MHgzMCwgKHVuc2lnbmVkIHNob3J0KSgweDEwICogaSkpOwogICAgICAgICBpZiAoIHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPT0gMSApCiAgICAgICAgIHsKICAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgyYiAsIGRpXzAgKSA7CkBAIC0zMjY5LDkgKzMyMjgsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfVXBkYXRlTW9kZUluZm8oIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvICkKK3ZvaWQgWEdJX1VwZGF0ZU1vZGVJbmZvKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBjbCAsCisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGNsICwKICAgICAgICAgICAgdGVtcGNoICwKICAgICAgICAgICAgdGVtcCAsCiAgICAgICAgICAgIHRlbXBibCAsCkBAIC0zMzc3LDcgKzMzMzYsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfR2V0VkdBVHlwZSggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvKQordm9pZCBYR0lfR2V0VkdBVHlwZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogICAgIC8qCiAgICAgaWYgKCBId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID49IFhHMjAgKQpAQCAtMzM5OSw5ICszMzU4LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0dldFZCVHlwZShQVkJfREVWSUNFX0lORk8gIHBWQkluZm8pCit2b2lkIFhHSV9HZXRWQlR5cGUoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBmbGFnICwgdGVtcGJ4ICwgdGVtcGFoIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBmbGFnICwgdGVtcGJ4ICwgdGVtcGFoIDsKIAogICAgIGlmICggcFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxICkKICAgICB7CkBAIC0zNDYyLDkgKzM0MjEsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfR2V0VkJJbmZvKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICBwVkJJbmZvICkKK3ZvaWQgWEdJX0dldFZCSW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYXggLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXBheCAsCiAgICAgICAgICAgIHB1c2ggLAogICAgICAgICAgICB0ZW1wYnggLAogICAgICAgICAgICB0ZW1wICwKQEAgLTM3MDMsOSArMzY2Miw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9HZXRUVkluZm8oIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLFBWQl9ERVZJQ0VfSU5GTyAgcFZCSW5mbyApCit2b2lkIFhHSV9HZXRUVkluZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wICwKICAgICAgICAgICAgdGVtcGJ4ID0gMCAsCiAgICAgICAgICAgIHJlc2luZm8gPSAwICwKICAgICAgICAgICAgbW9kZWZsYWcgLApAQCAtMzgzOCw5ICszNzk3LDEwIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSV9HZXRMQ0RJbmZvKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIGNoYXIgWEdJX0dldExDREluZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wICwKICAgICAgICAgICAgdGVtcGF4ICwKICAgICAgICAgICAgdGVtcGJ4ICwKICAgICAgICAgICAgbW9kZWZsYWcgLApAQCAtNDA0Nyw5NiArNDAwNywxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lfU2VhcmNoTW9kZUlEKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUICpNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordW5zaWduZWQgY2hhciBYR0lfU2VhcmNoTW9kZUlEKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqTW9kZUlkSW5kZXgsCisJCQkgICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCi0jaWZkZWYgVEMKIAotICAgIGlmICggTW9kZU5vIDw9IDUgKQotICAgICAgICBNb2RlTm8gfD0gMSA7Ci0KLSAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKLSAgICB7Ci0gICAgICAgIC8qIGZvciAoKk1vZGVJZEluZGV4PTA7Kk1vZGVJZEluZGV4PHNpemVvZihwVkJJbmZvLT5TTW9kZUlEVGFibGUpL3NpemVvZihYR0lfU3RTdHJ1Y3QpOygqTW9kZUlkSW5kZXgpKyspICovCi0gICAgICAgIGZvciggKk1vZGVJZEluZGV4ID0gMCA7IDsgKCAqTW9kZUlkSW5kZXggKSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5TTW9kZUlEVGFibGVbICpNb2RlSWRJbmRleCBdLlN0X01vZGVJRCA9PSBNb2RlTm8gKQotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIGlmICggcFZCSW5mby0+U01vZGVJRFRhYmxlWyAqTW9kZUlkSW5kZXggXS5TdF9Nb2RlSUQgPT0gMHhGRiApCi0gICAgICAgICAgICAgICAgcmV0dXJuKCBGQUxTRSApIDsKLSAgICAgICAgfQotCi0gICAgICAgIFZHQV9JTkZPID0gKCBQVUNIQVIgKU1LX0ZQKCAwICwgMHg0ODkgKSA7Ci0KLSAgICAgICAgaWYgKCBNb2RlTm8gPT0gMHgwNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKCAqVkdBX0lORk8gJiAweDEwICkgIT0gMCApCi0gICAgICAgICAgICAgICAgKCAqTW9kZUlkSW5kZXggKSsrIDsgLyogNDAwIGxpbmVzICovCi0gICAgICAgICAgICAvKiBlbHNlIDM1MCBsaW5lcyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBNb2RlTm8gPD0gMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKCAqVkdBX0lORk8gJiAweDgwICkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCAqTW9kZUlkSW5kZXggKSsrIDsKLSAgICAgICAgICAgICAgICBpZiAoICggKlZHQV9JTkZPICYgMHgxMCApICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAoICpNb2RlSWRJbmRleCApKysgOyAvKiA0MDAgbGluZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBlbHNlIDM1MCBsaW5lcyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZWxzZSAyMDAgbGluZXMgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBmb3IgKCpNb2RlSWRJbmRleD0wOypNb2RlSWRJbmRleDxzaXplb2YocFZCSW5mby0+RU1vZGVJRFRhYmxlKS9zaXplb2YoWEdJX0V4dFN0cnVjdCk7KCpNb2RlSWRJbmRleCkrKykgKi8KLSAgICAgICAgZm9yKCAqTW9kZUlkSW5kZXggPSAwIDsgOyAoICpNb2RlSWRJbmRleCApKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHBWQkluZm8tPkVNb2RlSURUYWJsZVsgKk1vZGVJZEluZGV4IF0uRXh0X01vZGVJRCA9PSBNb2RlTm8gKQotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIGlmICggcFZCSW5mby0+RU1vZGVJRFRhYmxlWyAqTW9kZUlkSW5kZXggXS5FeHRfTW9kZUlEID09IDB4RkYgKQotICAgICAgICAgICAgICAgIHJldHVybiggRkFMU0UgKSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotI2VuZGlmCi0KLSNpZmRlZiBXSU4yMDAwCi0KLSAgICBpZiAoIE1vZGVObyA8PSA1ICkKLSAgICAgICAgTW9kZU5vIHw9IDEgOwotICAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQotICAgIHsKLSAgICAgICAgLyogZm9yICgqTW9kZUlkSW5kZXg9MDsqTW9kZUlkSW5kZXg8c2l6ZW9mKHBWQkluZm8tPlNNb2RlSURUYWJsZSkvc2l6ZW9mKFhHSV9TdFN0cnVjdCk7KCpNb2RlSWRJbmRleCkrKykgKi8KLSAgICAgICAgZm9yKCAqTW9kZUlkSW5kZXggPSAwIDsgOyAoICpNb2RlSWRJbmRleCApKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHBWQkluZm8tPlNNb2RlSURUYWJsZVsgKk1vZGVJZEluZGV4IF0uU3RfTW9kZUlEID09IE1vZGVObyApCi0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5TTW9kZUlEVGFibGVbICpNb2RlSWRJbmRleCBdLlN0X01vZGVJRCA9PSAweEZGICkKLSAgICAgICAgICAgICAgICByZXR1cm4oIEZBTFNFICkgOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBNb2RlTm8gPT0gMHgwNyApCi0gICAgICAgICAgICAoICpNb2RlSWRJbmRleCApKysgOyAvKiA0MDAgbGluZXMgKi8KLQotICAgICAgICBpZiAoIE1vZGVObyA8PTMgKQotICAgICAgICAgICAgKCAqTW9kZUlkSW5kZXggKSArPSAyIDsgLyogNDAwIGxpbmVzICovCi0gICAgICAgIC8qIGVsc2UgMzUwIGxpbmVzICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGZvciAoKk1vZGVJZEluZGV4PTA7Kk1vZGVJZEluZGV4PHNpemVvZihwVkJJbmZvLT5FTW9kZUlEVGFibGUpL3NpemVvZihYR0lfRXh0U3RydWN0KTsoKk1vZGVJZEluZGV4KSsrKSAqLwotICAgICAgICBmb3IoICpNb2RlSWRJbmRleCA9IDAgOyA7ICggKk1vZGVJZEluZGV4ICkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcFZCSW5mby0+RU1vZGVJRFRhYmxlWyAqTW9kZUlkSW5kZXggXS5FeHRfTW9kZUlEID09IE1vZGVObyApCi0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5FTW9kZUlEVGFibGVbICpNb2RlSWRJbmRleCBdLkV4dF9Nb2RlSUQgPT0gMHhGRiApCi0gICAgICAgICAgICAgICAgcmV0dXJuKCBGQUxTRSApIDsKLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmCiAKICNpZmRlZiBMSU5VWCAvKiBjaGlhd2VuIGZvciBsaW51eCBzb2x1dGlvbiAqLwogCkBAIC00MTQ0LDEzICs0MDIwLDEzIEBACiAgICAgICAgIE1vZGVObyB8PSAxIDsKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICB7Ci0gICAgICAgIC8qIGZvciAoKk1vZGVJZEluZGV4PTA7Kk1vZGVJZEluZGV4PHNpemVvZihwVkJJbmZvLT5TTW9kZUlEVGFibGUpL3NpemVvZihYR0lfU3RTdHJ1Y3QpOygqTW9kZUlkSW5kZXgpKyspICovCisJLyogZm9yICgqTW9kZUlkSW5kZXg9MDsqTW9kZUlkSW5kZXg8c2l6ZW9mKHBWQkluZm8tPlNNb2RlSURUYWJsZSkvc2l6ZW9mKHN0cnVjdCBYR0lfU3RTdHJ1Y3QpOygqTW9kZUlkSW5kZXgpKyspICovCiAgICAgICAgIGZvciggKk1vZGVJZEluZGV4ID0gMCA7IDsgKCAqTW9kZUlkSW5kZXggKSsrICkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5TTW9kZUlEVGFibGVbICpNb2RlSWRJbmRleCBdLlN0X01vZGVJRCA9PSBNb2RlTm8gKQotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIGlmICggcFZCSW5mby0+U01vZGVJRFRhYmxlWyAqTW9kZUlkSW5kZXggXS5TdF9Nb2RlSUQgPT0gMHhGRiApCi0gICAgICAgICAgICAgICAgcmV0dXJuKCBGQUxTRSApIDsKKwkJaWYgKHBWQkluZm8tPlNNb2RlSURUYWJsZVsqTW9kZUlkSW5kZXhdLlN0X01vZGVJRCA9PSBNb2RlTm8pCisJCQlicmVhazsKKwkJaWYgKHBWQkluZm8tPlNNb2RlSURUYWJsZVsqTW9kZUlkSW5kZXhdLlN0X01vZGVJRCA9PSAweEZGKQorCQkJcmV0dXJuIDA7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIE1vZGVObyA9PSAweDA3ICkKQEAgLTQxNjIsMTkgKzQwMzgsMTkgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgLyogZm9yICgqTW9kZUlkSW5kZXg9MDsqTW9kZUlkSW5kZXg8c2l6ZW9mKHBWQkluZm8tPkVNb2RlSURUYWJsZSkvc2l6ZW9mKFhHSV9FeHRTdHJ1Y3QpOygqTW9kZUlkSW5kZXgpKyspICovCisJLyogZm9yICgqTW9kZUlkSW5kZXg9MDsqTW9kZUlkSW5kZXg8c2l6ZW9mKHBWQkluZm8tPkVNb2RlSURUYWJsZSkvc2l6ZW9mKHN0cnVjdCBYR0lfRXh0U3RydWN0KTsoKk1vZGVJZEluZGV4KSsrKSAqLwogICAgICAgICBmb3IoICpNb2RlSWRJbmRleCA9IDAgOyA7ICggKk1vZGVJZEluZGV4ICkrKyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcFZCSW5mby0+RU1vZGVJRFRhYmxlWyAqTW9kZUlkSW5kZXggXS5FeHRfTW9kZUlEID09IE1vZGVObyApCi0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5FTW9kZUlEVGFibGVbICpNb2RlSWRJbmRleCBdLkV4dF9Nb2RlSUQgPT0gMHhGRiApCi0gICAgICAgICAgICAgICAgcmV0dXJuKCBGQUxTRSApIDsKKwkJaWYgKHBWQkluZm8tPkVNb2RlSURUYWJsZVsqTW9kZUlkSW5kZXhdLkV4dF9Nb2RlSUQgPT0gTW9kZU5vKQorCQkJYnJlYWs7CisJCWlmIChwVkJJbmZvLT5FTW9kZUlEVGFibGVbKk1vZGVJZEluZGV4XS5FeHRfTW9kZUlEID09IDB4RkYpCisJCQlyZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KIAogI2VuZGlmCiAKLSAgICByZXR1cm4oIFRSVUUgKSA7CisgICAgcmV0dXJuIDE7CiB9CiAKIApAQCAtNDE4OCw5ICs0MDY0LDEyIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSU5ld19DaGVja01lbW9yeVNpemUoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIGNoYXIgWEdJTmV3X0NoZWNrTWVtb3J5U2l6ZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCQkgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQkgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJCSAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBtZW1vcnlzaXplICwKKyAgICB1bnNpZ25lZCBzaG9ydCBtZW1vcnlzaXplICwKICAgICAgICAgICAgbW9kZWZsYWcgLAogICAgICAgICAgICB0ZW1wICwKICAgICAgICAgICAgdGVtcDEgLApAQCAtNDE5OSw3ICs0MDc4LDcgQEAKIC8qICBpZiAoICggSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA9PSBYR0lfNjUwICkgfHwKICAgICAgICAgICggSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA9PSBYR0lfNjUwTSApICkKICAgICB7Ci0gICAgICAgIHJldHVybiggVFJVRSApIDsKKwlyZXR1cm4gMTsKICAgICB9ICovCiAKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKQEAgLTQyNTcsMTAgKzQxMzYsMTAgQEAKICAgICAgICAgICAgIHRlbXAgPDw9IDEgOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICggdGVtcCA8IG1lbW9yeXNpemUgKQotICAgICAgICByZXR1cm4oIEZBTFNFICkgOworICAgIGlmICh0ZW1wIDwgbWVtb3J5c2l6ZSkKKwkgICAgcmV0dXJuIDA7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4oIFRSVUUgKSA7CisJICAgIHJldHVybiAxOwogfQogCiAKQEAgLTQyNzAsMTAgKzQxNDksMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qdm9pZCBYR0lOZXdfSXNMb3dSZXNvbHV0aW9uKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4LCBCT09MRUFOIFhHSU5ld19DaGVja01lbW9yeVNpemUoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKKy8qdm9pZCBYR0lOZXdfSXNMb3dSZXNvbHV0aW9uKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIGNoYXIgWEdJTmV3X0NoZWNrTWVtb3J5U2l6ZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBkYXRhIDsKLSAgICBVU0hPUlQgTW9kZUZsYWcgOworICAgIHVuc2lnbmVkIHNob3J0IGRhdGEgOworICAgIHVuc2lnbmVkIHNob3J0IE1vZGVGbGFnIDsKIAogICAgIGRhdGEgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MEYgKSA7CiAgICAgZGF0YSAmPSAweDdGIDsKQEAgLTQzMDIsNyArNDE4MSw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9EaXNwbGF5T24oIFBYR0lfSFdfREVWSUNFX0lORk8gcFhHSUhXREUgLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9EaXNwbGF5T24oc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIFhHSU5ld19TZXRSZWdBTkRPUihwVkJJbmZvLT5QM2M0LDB4MDEsMHhERiwweDAwKTsKQEAgLTQzMzEsMTIgKzQyMTAsNiBAQAogCiAgICAgaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPT0gMSkgLyogW0JpbGx5XSAwNy8wNS8yMyBGb3IgQ0g3MDA3ICovCiAgICAgewotI2lmZGVmIFdJTjIwMDAKLSAgICAgICBpZiAoIElzQ0g3MDA3VFZNb2RlKCBwVkJJbmZvICkgKQotICAgICAgIHsKLSAgICAgICAgICAgVHVybk9uQ0g3MDA3KHBYR0lIV0RFLT5wRGV2aWNlKSA7IC8qIDA3LzA1LzI4ICovCi0gICAgICAgfQotI2VuZGlmCiAKICAgICB9CiAKQEAgLTQzNzIsNyArNDI0NSw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9EaXNwbGF5T2ZmKCBQWEdJX0hXX0RFVklDRV9JTkZPIHBYR0lIV0RFICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfRGlzcGxheU9mZihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpwWEdJSFdERSwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCiAgICAgaWYgKCBwWEdJSFdERS0+akNoaXBUeXBlID09IFhHMjEgKQpAQCAtNDM5Miw5ICs0MjY1LDYgQEAKICAgICB7CiAgICAgICAgLyogaWYoIElzQ0g3MDA3VFZNb2RlKCBwVkJJbmZvICkgPT0gMCApICovCiAgICAgICAgewotI2lmZGVmIFdJTjIwMDAKLSAgICAgICAgIFR1cm5PZmZDSDcwMDcocFhHSUhXREUtPnBEZXZpY2UpIDsgIC8qIDA3LzA1LzI4ICovCi0jZW5kaWYKICAgICAgICB9CiAgICAgfQogCkBAIC00NDIzLDcgKzQyOTMsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogY2hpYXdlbiBmb3Igc2Vuc2VjcnQxICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1dhaXREaXNwbHkoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1dhaXREaXNwbHkoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogICAgIHdoaWxlKCAoIFhHSU5ld19HZXRSZWcyKCBwVkJJbmZvLT5QM2RhICkgJiAweDAxICkgKQogICAgICAgICBicmVhayA7CkBAIC00NDM5LDU4ICs0MzA5LDU5IEBACiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBYR0lfU2Vuc2VDUlQxKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9TZW5zZUNSVDEoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIENSVENEYXRhWyAxNyBdID0geyAweDVGICwgMHg0RiAsIDB4NTAgLCAweDgyICwgMHg1NSAsIDB4ODEgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCICwgMHgzRSAsIDB4RTkgLCAweDBCICwgMHhERiAsIDB4RTcgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0ICwgMHgwMCAsIDB4MDAgLCAweDA1ICwgMHgwMCB9IDsKKwl1bnNpZ25lZCBjaGFyIENSVENEYXRhWzE3XSA9IHsKKwkJMHg1RiAsIDB4NEYgLCAweDUwICwgMHg4MiAsIDB4NTUgLCAweDgxICwKKwkJMHgwQiAsIDB4M0UgLCAweEU5ICwgMHgwQiAsIDB4REYgLCAweEU3ICwKKwkJMHgwNCAsIDB4MDAgLCAweDAwICwgMHgwNSAsIDB4MDAgfTsKIAotICAgIFVDSEFSIFNSMDEgPSAwICwgU1IxRiA9IDAgLCBTUjA3ID0gMCAsIFNSMDYgPSAwIDsKKwl1bnNpZ25lZCBjaGFyIFNSMDEgPSAwLCBTUjFGID0gMCwgU1IwNyA9IDAsIFNSMDYgPSAwOwogCi0gICAgVUNIQVIgQ1IxNyAsIENSNjMgLCBTUjMxIDsKLSAgICBVU0hPUlQgdGVtcCA7Ci0gICAgVUNIQVIgREFDX1RFU1RfUEFSTVNbIDMgXSA9IHsgMHgwRiAsIDB4MEYgLCAweDBGIH0gOworCXVuc2lnbmVkIGNoYXIgQ1IxNywgQ1I2MywgU1IzMTsKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wIDsKKwl1bnNpZ25lZCBjaGFyIERBQ19URVNUX1BBUk1TWzNdID0geyAweDBGLCAweDBGLCAweDBGIH0gOwogCiAgICAgaW50IGkgOwogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwNSAsIDB4ODYgKSA7CiAKICAgICAvKiBbMjAwNC8wNS8wNl0gVmljZW50IHRvIGZpeCBYRzQyIHNpbmdsZSBMQ0Qgc2Vuc2UgdG8gQ1JUK0xDRCAqLwogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHg1NyAsIDB4NEEgKSA7Ci0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDUzICwgKCBVQ0hBUiApKCBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NTMgKSB8IDB4MDIgKSApIDsKKyAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDUzLCAodW5zaWduZWQgY2hhcikoWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHg1MykgfCAweDAyKSk7CiAKLSAgICBTUjMxID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDMxICkgOwotICAgIENSNjMgPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NjMgKSA7Ci0gICAgU1IwMSA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwMSApIDsKKyAgICBTUjMxID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNjNCwgMHgzMSk7CisgICAgQ1I2MyA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzZDQsIDB4NjMpOworICAgIFNSMDEgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDAxKTsKIAotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwMSAsICggVUNIQVIgKSggU1IwMSAmIDB4REYgKSApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NjMgLCAoIFVDSEFSICkoIENSNjMgJiAweEJGICkgKSA7CisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgMHgwMSwgKHVuc2lnbmVkIGNoYXIpKFNSMDEgJiAweERGKSk7CisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNkNCwgMHg2MywgKHVuc2lnbmVkIGNoYXIpKENSNjMgJiAweEJGKSk7CiAKLSAgICBDUjE3ID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDE3ICkgOwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgxNyAsICggVUNIQVIgKSggQ1IxNyB8IDB4ODAgKSApIDsKKyAgICBDUjE3ID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHgxNyk7CisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNkNCwgMHgxNywgKHVuc2lnbmVkIGNoYXIpKENSMTcgfCAweDgwKSkgOwogCi0gICAgU1IxRiA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxRiApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MUYgLCAoIFVDSEFSICkoIFNSMUYgfCAweDA0ICkgKSA7CisgICAgU1IxRiA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MUYpOworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MUYsICh1bnNpZ25lZCBjaGFyKShTUjFGIHwgMHgwNCkpOwogCi0gICAgU1IwNyA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwNyApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MDcgLCAoIFVDSEFSICkoIFNSMDcgJiAweEZCICkgKSA7Ci0gICAgU1IwNiA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgwNiApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MDYgLCAoIFVDSEFSICkoIFNSMDYgJiAweEMzICkgKSA7CisgICAgU1IwNyA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MDcpOworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlAzYzQsIDB4MDcsICh1bnNpZ25lZCBjaGFyKShTUjA3ICYgMHhGQikpOworICAgIFNSMDYgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDA2KTsKKyAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDA2LCAodW5zaWduZWQgY2hhcikoU1IwNiAmIDB4QzMpKTsKIAogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgxMSAsIDB4MDAgKSA7CiAKICAgICBmb3IoIGkgPSAwIDsgaSA8IDggOyBpKysgKQotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsICggVVNIT1JUIClpICwgQ1JUQ0RhdGFbIGkgXSApIDsKKwkgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNkNCwgKHVuc2lnbmVkIHNob3J0KWksIENSVENEYXRhW2ldKTsKIAogICAgIGZvciggaSA9IDggOyBpIDwgMTEgOyBpKysgKQotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsICggVVNIT1JUICkoIGkgKyA4ICkgLCBDUlRDRGF0YVsgaSBdICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAodW5zaWduZWQgc2hvcnQpKGkgKyA4KSwgQ1JUQ0RhdGFbaV0pOwogCiAgICAgZm9yKCBpID0gMTEgOyBpIDwgMTMgOyBpKysgKQotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNkNCAsICggVVNIT1JUICkoIGkgKyA0ICkgLCBDUlRDRGF0YVsgaSBdICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAodW5zaWduZWQgc2hvcnQpKGkgKyA0KSwgQ1JUQ0RhdGFbaV0pOwogCiAgICAgZm9yKCBpID0gMTMgOyBpIDwgMTYgOyBpKysgKQotICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsICggVVNIT1JUICkoIGkgLSAzICkgLCBDUlRDRGF0YVsgaSBdICkgOworCSAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2M0LCAodW5zaWduZWQgc2hvcnQpKGkgLSAzKSwgQ1JUQ0RhdGFbaV0pOwogCi0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDBFICwgKCBVQ0hBUiApKCBDUlRDRGF0YVsgMTYgXSAmIDB4RTAgKSApIDsKKyAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2M0LCAweDBFLCAodW5zaWduZWQgY2hhcikoQ1JUQ0RhdGFbMTZdICYgMHhFMCkpOwogCiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzYzQgLCAweDMxICwgMHgwMCApIDsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MkIgLCAweDFCICkgOwpAQCAtNDUwMCw5ICs0MzcxLDkgQEAKIAogICAgIGZvciggaSA9IDAgOyBpIDwgMjU2IDsgaSsrICkKICAgICB7Ci0gICAgICAgIFhHSU5ld19TZXRSZWczKCAoIHBWQkluZm8tPlAzYzggKyAxICkgLCAoIFVDSEFSIClEQUNfVEVTVF9QQVJNU1sgMCBdICkgOwotICAgICAgICBYR0lOZXdfU2V0UmVnMyggKCBwVkJJbmZvLT5QM2M4ICsgMSApICwgKCBVQ0hBUiApREFDX1RFU1RfUEFSTVNbIDEgXSApIDsKLSAgICAgICAgWEdJTmV3X1NldFJlZzMoICggcFZCSW5mby0+UDNjOCArIDEgKSAsICggVUNIQVIgKURBQ19URVNUX1BBUk1TWyAyIF0gKSA7CisJWEdJTmV3X1NldFJlZzMoKHBWQkluZm8tPlAzYzggKyAxKSwgKHVuc2lnbmVkIGNoYXIpREFDX1RFU1RfUEFSTVNbMF0pOworCVhHSU5ld19TZXRSZWczKChwVkJJbmZvLT5QM2M4ICsgMSksICh1bnNpZ25lZCBjaGFyKURBQ19URVNUX1BBUk1TWzFdKTsKKwlYR0lOZXdfU2V0UmVnMygocFZCSW5mby0+UDNjOCArIDEpLCAodW5zaWduZWQgY2hhcilEQUNfVEVTVF9QQVJNU1syXSk7CiAgICAgfQogCiAgICAgWEdJX1ZCTG9uZ1dhaXQoIHBWQkluZm8gKSA7CkBAIC00NTM4LDE0OCArNDQwOSwxOCBAQAogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgzMSAsIFNSMzEgKSA7CiAKICAgICAvKiBbMjAwNC8wNS8xMV0gVmljZW50ICovCi0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDUzICwgKCBVQ0hBUiApKCBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NTMgKSAmIDB4RkQgKSApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MUYgLCAoIFVDSEFSICkgU1IxRiApIDsKKyAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDUzLAorCQkgICAodW5zaWduZWQgY2hhcikoWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHg1MykgJiAweEZEKSk7CisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UDNjNCwgMHgxRiwgKHVuc2lnbmVkIGNoYXIpU1IxRik7CiB9CiAKIAogCiAKIAotI2lmZGVmIFRDCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIEZ1bmN0aW9uIDogSU5UMUFSZXR1cm5Db2RlICovCi0vKiBJbnB1dCA6ICovCi0vKiBPdXRwdXQgOiAqLwotLyogRGVzY3JpcHRpb24gOiAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgSU5UMUFSZXR1cm5Db2RlKCB1bmlvbiBSRUdTIHJlZ3MgKQotewotICAgIGlmICggcmVncy54LmNmbGFnICkKLSAgICB7Ci0gICAgICAgIC8qIHByaW50ZiggIkVycm9yIHRvIGZpbmQgcGNpIGRldmljZSFcbiIgKSA7ICovCi0gICAgICAgIHJldHVybiggMSApIDsKLSAgICB9Ci0KLSAgICBzd2l0Y2gocmVncy5oLmFoKQotICAgIHsKLSAgICAgICAgY2FzZSAwOiByZXR1cm4gMDsKLSAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgY2FzZSAweDgxOgotICAgICAgICAgICAgcHJpbnRmKCAiRnVuY3Rpb24gbm90IHN1cHBvcnRcbiIgKSA7Ci0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGNhc2UgMHg4MzoKLSAgICAgICAgICAgIHByaW50ZiggImJhZCB2ZW5kb3IgaWRcbiIgKSA7Ci0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGNhc2UgMHg4NjoKLSAgICAgICAgICAgIHByaW50ZiggImRldmljZSBub3QgZm91bmRcbiIgKSA7Ci0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGNhc2UgMHg4NzoKLSAgICAgICAgICAgIHByaW50ZiggImJhZCByZWdpc3RlciBudW1iZXJcbiIgKSA7Ci0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGNhc2UgMHg4ODoKLSAgICAgICAgICAgIHByaW50ZiggInNldCBmYWlsZWRcbiIgKSA7Ci0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGNhc2UgMHg4OToKLSAgICAgICAgICAgIHByaW50ZiggImJ1ZmZlciB0b28gc21hbGwiICkgOwotICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWsgOwotICAgIH0KLSAgICByZXR1cm4oIDEgKSA7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGdW5jdGlvbiA6IEZpbmRQQ0lJT0Jhc2UgKi8KLS8qIElucHV0IDogKi8KLS8qIE91dHB1dCA6ICovCi0vKiBEZXNjcmlwdGlvbiA6ICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXVuc2lnbmVkIEZpbmRQQ0lJT0Jhc2UoIHVuc2lnbmVkIGluZGV4ICwgdW5zaWduZWQgZGV2aWNlaWQgKQotewotICAgIHVuaW9uIFJFR1MgcmVncyA7Ci0KLSAgICByZWdzLmguYWggPSAweGIxIDsJLyogUENJX0ZVTkNUSU9OX0lEICovCi0gICAgcmVncy5oLmFsID0gMHgwMiA7CS8qIEZJTkRfUENJX0RFVklDRSAqLwotICAgIHJlZ3MueC5jeCA9IGRldmljZWlkIDsKLSAgICByZWdzLnguZHggPSAweDEwMzkgOwotICAgIHJlZ3MueC5zaSA9IGluZGV4IDsJLyogZmluZCBuLXRoIGRldmljZSAqLwotCi0gICAgaW50ODYoIDB4MUEgLCAmcmVncyAsICZyZWdzICkgOwotCi0gICAgaWYgKCBJTlQxQVJldHVybkNvZGUoIHJlZ3MgKSAhPSAwICkKLSAgICAgICAgcmV0dXJuKCAwICkgOwotCi0gICAgLyogcmVncy5oLmJoIGJ1cyBudW1iZXIgKi8KLSAgICAvKiByZWdzLmguYmwgZGV2aWNlIG51bWJlciAqLwotICAgIHJlZ3MuaC5haCA9IDB4YjEgOyAgLyogUENJX0ZVTkNUSU9OX0lEICovCi0gICAgcmVncy5oLmFsID0gMHgwOSA7ICAvKiBSRUFEX0NPTkZJR19XT1JEICovCi0gICAgcmVncy54LmN4ID0gZGV2aWNlaWQgOwotICAgIHJlZ3MueC5keCA9IDB4MTAzOSA7Ci0gICAgcmVncy54LmRpID0gMHgxOCA7ICAvKiByZWdpc3RlciBudW1iZXIgKi8KLSAgICBpbnQ4NiggMHgxQSAsICZyZWdzICwgJnJlZ3MgKSA7Ci0KLSAgICBpZiAoIElOVDFBUmV0dXJuQ29kZSggcmVncyApICE9IDAgKQotICAgICAgICByZXR1cm4oIDAgKSA7Ci0KLSAgICByZXR1cm4oIHJlZ3MueC5jeCApIDsKLX0KLQotI2VuZGlmCiAKIAogCi0jaWZkZWYgVEMKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogRnVuY3Rpb24gOiBtYWluICovCi0vKiBJbnB1dCA6ICovCi0vKiBPdXRwdXQgOiAqLwotLyogRGVzY3JpcHRpb24gOiAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gOwotICAgIFVTSE9SVCB0ZW1wIDsKLSAgICBVU0hPUlQgTW9kZU5vIDsKLQotICAgIC8qIEh3RGV2aWNlRXh0ZW5zaW9uLnBqVmlydHVhbFJvbUJhc2UgPShQVUNIQVIpIE1LX0ZQKDB4QzAwMCwwKTsgKi8KLSAgICAvKiBId0RldmljZUV4dGVuc2lvbi5walZpZGVvTWVtb3J5QWRkcmVzcyA9IChQVUNIQVIpTUtfRlAoMHhBMDAwLDApOyAqLwotCi0KLSAgICBId0RldmljZUV4dGVuc2lvbi5waklPQWRkcmVzcyA9ICggRmluZFBDSUlPQmFzZSggMCAsMHg2MzAwICkgJiAweEZGODAgKSArIDB4MzAgOwotICAgIEh3RGV2aWNlRXh0ZW5zaW9uLmpDaGlwVHlwZSA9IFhHSV8zNDAgOwotCi0KLQotICAgIC8qIEh3RGV2aWNlRXh0ZW5zaW9uLnBqSU9BZGRyZXNzID0gKCBGaW5kUENJSU9CYXNlKCAwICwgMHg1MzE1ICkgJiAweEZGODAgKSArIDB4MzAgOyAqLwotCi0gICAgSHdEZXZpY2VFeHRlbnNpb24ucGpJT0FkZHJlc3MgPSAoIEZpbmRQQ0lJT0Jhc2UoIDAgLCAweDMzMCApICYgMHhGRjgwICkgKyAweDMwIDsKLSAgICBId0RldmljZUV4dGVuc2lvbi5qQ2hpcFR5cGUgPSBYR0lfMzQwIDsKLQotCi0gICAgSHdEZXZpY2VFeHRlbnNpb24udWpWQkNoaXBJRCA9IFZCX0NISVBfMzAxIDsKLSAgICBTdHJDcHkoSHdEZXZpY2VFeHRlbnNpb24uc3pWQklPU1ZlciAsICIwLjg0IiApIDsKLSAgICBId0RldmljZUV4dGVuc2lvbi5iU2tpcERyYW1TaXppbmcgPSBGQUxTRSA7Ci0gICAgSHdEZXZpY2VFeHRlbnNpb24udWxWaWRlb01lbW9yeVNpemUgPSAwIDsKLQotICAgIGlmICggYXJnYyA9PSAyICkKLSAgICB7Ci0gICAgICAgIE1vZGVObyA9IGF0b2koIGFyZ3ZbIDEgXSApIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTW9kZU5vID0gMHgyZSA7Ci0gICAgICAgIC8qIE1vZGVObyA9IDB4MzcgOyAxMDI0eDc2OHggNGJwcCAqLwotICAgICAgICAvKiBNb2RlTm8gPSAweDM4IDsgMTAyNHg3Njh4IDhicHAgKi8KLSAgICAgICAgLyogTW9kZU5vID0gMHg0QSA7IDEwMjR4NzY4eCAxNmJwcCAqLwotICAgICAgICAvKiBNb2RlTm8gPSAweDQ3IDsgODAweDYwMHggMTZicHAgKi8KLSAgICB9Ci0KLSAgICAvKiBYR0lJbml0TmV3KCAmSHdEZXZpY2VFeHRlbnNpb24gKSA7ICovCi0gICAgWEdJU2V0TW9kZU5ldyggJkh3RGV2aWNlRXh0ZW5zaW9uICwgTW9kZU5vICkgOwotfQotI2VuZGlmCiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00Njg4LDcgKzQ0MjksNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfV2FpdERpc3BsYXkoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1dhaXREaXNwbGF5KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICB3aGlsZSggISggWEdJTmV3X0dldFJlZzIoIHBWQkluZm8tPlAzZGEgKSAmIDB4MDEgKSApIDsKIApAQCAtNDcwNCw5ICs0NDQ1LDExIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSV9TZXRDUlQyR3JvdXAzMDEoIFVTSE9SVCBNb2RlTm8gLCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSV9TZXRDUlQyR3JvdXAzMDEodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCSAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkJICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBieCAsCisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4ICwKICAgICAgICAgICAgTW9kZUlkSW5kZXggLAogICAgICAgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggOwogCkBAIC00NzM5LDcgKzQ0ODIsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfQXV0b1RocmVzaG9sZCggIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX0F1dG9UaHJlc2hvbGQoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogICAgIGlmICggISggcFZCSW5mby0+U2V0RmxhZyAmIFdpbjl4RE9TTW9kZSApICkKICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgwMSAsIDB4NDAgKSA7CkBAIC00NzUyLDkgKzQ0OTUsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2F2ZUNSVDJJbmZvKCBVU0hPUlQgTW9kZU5vICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TYXZlQ1JUMkluZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXAxICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wMSAsCiAgICAgICAgICAgIHRlbXAyIDsKIAogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgzNCAsIE1vZGVObyApIDsgIC8qIHJlc2VydmUgQ1IzNCBmb3IgQ1JUMSBNb2RlIE5vICovCkBAIC00NzcwLDkgKzQ1MTMsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0dldENSVDJSZXNJbmZvKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9HZXRDUlQyUmVzSW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgeHJlcyAsCisgICAgdW5zaWduZWQgc2hvcnQgeHJlcyAsCiAgICAgICAgICAgIHlyZXMgLAogICAgICAgICAgICBtb2RlZmxhZyAsCiAgICAgICAgICAgIHJlc2luZGV4IDsKQEAgLTQ4NjcsNyArNDYxMiw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSV9Jc0xDRER1YWxMaW5rKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit1bnNpZ25lZCBjaGFyIFhHSV9Jc0xDRER1YWxMaW5rKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIGlmICggKCAoICggcFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvTENEICkgfCBTZXRDUlQyVG9MQ0RBICkgKSAmJiAoIHBWQkluZm8tPkxDREluZm8gJiBTZXRMQ0REdWFsTGluayApICkgLyogc2hhbXBvbzAxMjkgKi8KQEAgLTQ4ODMsMTUgKzQ2MjgsMTUgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0dldENSVDJEYXRhKCAgVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX0dldENSVDJEYXRhKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYXggPSAwLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXBheCA9IDAsCiAgICAgICAgICAgIHRlbXBieCAsCiAgICAgICAgICAgIG1vZGVmbGFnICwKICAgICAgICAgICAgcmVzaW5mbyA7CiAKLSAgICBYR0lfTENERGF0YVN0cnVjdCAqTENEUHRyID0gTlVMTCA7Ci0gICAgWEdJX1RWRGF0YVN0cnVjdCAgKlRWUHRyID0gTlVMTCA7CisgICAgc3RydWN0IFhHSV9MQ0REYXRhU3RydWN0ICpMQ0RQdHIgPSBOVUxMIDsKKyAgICBzdHJ1Y3QgWEdJX1RWRGF0YVN0cnVjdCAgKlRWUHRyID0gTlVMTCA7CiAKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICB7CkBAIC00OTE3LDcgKzQ2NjIsNyBAQAogCiAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiAoIFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEgKSApCiAgICAgewotICAgICAgICBMQ0RQdHIgPSAoWEdJX0xDRERhdGFTdHJ1Y3QqIClYR0lfR2V0TGNkUHRyKCB0ZW1wYngsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCUxDRFB0ciA9IChzdHJ1Y3QgWEdJX0xDRERhdGFTdHJ1Y3QgKilYR0lfR2V0TGNkUHRyKHRlbXBieCwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKIAogICAgICAgICBwVkJJbmZvLT5SVkJIQ01BWCA9IExDRFB0ci0+UlZCSENNQVggOwogICAgICAgICBwVkJJbmZvLT5SVkJIQ0ZBQ1QgPSBMQ0RQdHItPlJWQkhDRkFDVCA7CkBAIC01MDIxLDcgKzQ3NjYsNyBAQAogICAgIGlmICggcFZCSW5mby0+VkJJbmZvICYgKCBTZXRDUlQyVG9UViApICkKICAgICB7CiAgICAgICAgIHRlbXBieCA9IDQgOwotICAgICAgICBUVlB0ciA9ICggWEdJX1RWRGF0YVN0cnVjdCAqIClYR0lfR2V0VFZQdHIoIHRlbXBieCAsIE1vZGVObyAsIE1vZGVJZEluZGV4ICwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvICkgOworCVRWUHRyID0gKHN0cnVjdCBYR0lfVFZEYXRhU3RydWN0ICopWEdJX0dldFRWUHRyKHRlbXBieCwgTW9kZU5vLCBNb2RlSWRJbmRleCwgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKIAogICAgICAgICBwVkJJbmZvLT5SVkJIQ01BWCA9IFRWUHRyLT5SVkJIQ01BWCA7CiAgICAgICAgIHBWQkluZm8tPlJWQkhDRkFDVCA9IFRWUHRyLT5SVkJIQ0ZBQ1QgOwpAQCAtNTEwOSwxMSArNDg1NCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRDUlQyVkNMSyggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldENSVDJWQ0xLKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIGRpXzAgLAotICAgICAgICAgIGRpXzEgLAotICAgICAgICAgIHRlbXBhbCA7CisJdW5zaWduZWQgY2hhciBkaV8wLCBkaV8xLCB0ZW1wYWw7CiAKICAgICB0ZW1wYWwgPSBYR0lfR2V0VkNMS1B0ciggUmVmcmVzaFJhdGVUYWJsZUluZGV4ICwgTW9kZU5vICwgTW9kZUlkSW5kZXgsIHBWQkluZm8gKSA7CiAgICAgWEdJX0dldFZDTEtMZW4oIHRlbXBhbCwgJmRpXzAgLCAmZGlfMSwgcFZCSW5mbyApIDsKQEAgLTUxNDYsOSArNDg4OSwxMCBAQAogLyogT3V0cHV0IDogYWwgLT4gVkNMSyBJbmRleCAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9HZXRMQ0RWQ0xLUHRyKCBVQ0hBUiogZGlfMCAsIFVDSEFSICpkaV8xLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9HZXRMQ0RWQ0xLUHRyKHVuc2lnbmVkIGNoYXIgKmRpXzAsIHVuc2lnbmVkIGNoYXIgKmRpXzEsCisJCSAgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGluZGV4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbmRleCA7CiAKICAgICBpZiAoIHBWQkluZm8tPlZCSW5mbyAmICggU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSApICkKICAgICB7CkBAIC01MTgyLDE3ICs0OTI2LDE2IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VQ0hBUiBYR0lfR2V0VkNMS1B0cihVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIGNoYXIgWEdJX0dldFZDTEtQdHIodW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkJICAgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAKLSAgICBVU0hPUlQgaW5kZXggLAorICAgIHVuc2lnbmVkIHNob3J0IGluZGV4ICwKICAgICAgICAgICAgbW9kZWZsYWcgOwotI2lmbmRlZiBMSU5VWF9YRjg2Ci0gICAgVVNIT1JUIHRlbXBieCA7Ci0jZW5kaWYKLQotICAgIFVDSEFSIHRlbXBhbCA7Ci0gICAgVUNIQVIgKkNIVFZWQ0xLUHRyID0gTlVMTCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4IDsKKyAgICB1bnNpZ25lZCBjaGFyIHRlbXBhbDsKKyAgICB1bnNpZ25lZCBjaGFyICpDSFRWVkNMS1B0ciA9IE5VTEw7CiAKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICAgICAgbW9kZWZsYWcgPSBwVkJJbmZvLT5TTW9kZUlEVGFibGVbIE1vZGVJZEluZGV4IF0uU3RfTW9kZUZsYWcgOyAgICAgIC8qIHNpK1N0X1Jlc0luZm8gKi8KQEAgLTUzNDQsNyArNTA4Nyw3IEBACiAKICAgICB9CiAKLSAgICB0ZW1wYWwgPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMiggKCBwVkJJbmZvLT5QM2NhICsgMHgwMiApICkgOworICAgIHRlbXBhbCA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcyKChwVkJJbmZvLT5QM2NhICsgMHgwMikpOwogICAgIHRlbXBhbCA9IHRlbXBhbCA+PiAyIDsKICAgICB0ZW1wYWwgJj0gMHgwMyA7CiAKQEAgLTUzNjUsMTkgKzUxMDgsMjAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0dldFZDTEtMZW4oVUNIQVIgdGVtcGFsLFVDSEFSKiBkaV8wLFVDSEFSKiBkaV8xLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX0dldFZDTEtMZW4odW5zaWduZWQgY2hhciB0ZW1wYWwsIHVuc2lnbmVkIGNoYXIgKmRpXzAsCisJCSAgICB1bnNpZ25lZCBjaGFyICpkaV8xLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaWYgKCBwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEgKSAvKiBbQmlsbHldIDIwMDcvMDUvMTYgKi8KICAgICB7CiAgICAgICAgLyogVmlkZW9EZWJ1Z1ByaW50KCgwLCAiWEdJX0dldFZDTEtMZW46IHBWQkluZm8tPklGX0RFRl9DSDcwMDc9PTFcbiIpKTsgKi8KLSAgICAgICAgKmRpXzAgPSAoIFVDSEFSIClYR0lfQ0g3MDA3VkNMS0RhdGFbIHRlbXBhbCBdLlNSMkIgOwotICAgICAgICAqZGlfMSA9ICggVUNIQVIgKVhHSV9DSDcwMDdWQ0xLRGF0YVsgdGVtcGFsIF0uU1IyQyA7CisJKmRpXzAgPSAodW5zaWduZWQgY2hhcilYR0lfQ0g3MDA3VkNMS0RhdGFbdGVtcGFsXS5TUjJCOworCSpkaV8xID0gKHVuc2lnbmVkIGNoYXIpWEdJX0NINzAwN1ZDTEtEYXRhW3RlbXBhbF0uU1IyQzsKICAgICB9CiAgICAgZWxzZSBpZiAoIHBWQkluZm8tPlZCVHlwZSAmICggVkJfWEdJMzAxIHwgVkJfWEdJMzAxQiB8IFZCX1hHSTMwMkIgfCBWQl9YR0kzMDFMViB8IFZCX1hHSTMwMkxWIHwgVkJfWEdJMzAxQyApICkKICAgICB7CiAgICAgICAgIGlmICggKCAhKCBwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9MQ0RBICkgKSAmJiAoIHBWQkluZm8tPlNldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIgKSApCiAgICAgICAgIHsKLSAgICAgICAgICAgICpkaV8wID0gKCBVQ0hBUiApWEdJX1ZCVkNMS0RhdGFbIHRlbXBhbCBdLlNSMkIgOworCSAgICAqZGlfMCA9ICh1bnNpZ25lZCBjaGFyKVhHSV9WQlZDTEtEYXRhW3RlbXBhbF0uU1IyQjsKICAgICAgICAgICAgICpkaV8xID0gWEdJX1ZCVkNMS0RhdGFbIHRlbXBhbCBdLlNSMkMgOwogICAgICAgICB9CiAgICAgfQpAQCAtNTM5NSwxMSArNTEzOSwxNCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0Q1JUMk9mZnNldCggVVNIT1JUIE1vZGVObyAsCi0JCQkJICAgVVNIT1JUIE1vZGVJZEluZGV4ICwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCAsIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldENSVDJPZmZzZXQodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICAgICBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJICAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgb2Zmc2V0IDsKLSAgICBVQ0hBUiB0ZW1wIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBvZmZzZXQgOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcDsKIAogICAgIGlmICggcFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUgKQogICAgIHsKQEAgLTU0MDcsMTIgKzUxNTQsMTIgQEAKICAgICB9CiAKICAgICBvZmZzZXQgPSBYR0lfR2V0T2Zmc2V0KCAgTW9kZU5vICwgTW9kZUlkSW5kZXggLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggLCBId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyApIDsKLSAgICB0ZW1wID0gKCBVQ0hBUiApKCBvZmZzZXQgJiAweEZGICkgOworICAgIHRlbXAgPSAodW5zaWduZWQgY2hhcikob2Zmc2V0ICYgMHhGRik7CiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MDcgLCB0ZW1wICkgOwotICAgIHRlbXAgPSggVUNIQVIpKCAoIG9mZnNldCAmIDB4RkYwMCApID4+IDggKSA7Ci0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MDkgLCB0ZW1wICkgOwotICAgIHRlbXAgPSggVUNIQVIgKSggKCAoIG9mZnNldCA+PiAzICkgJiAweEZGICkgKyAxICkgOwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDAzICwgdGVtcCApIDsKKyAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpKChvZmZzZXQgJiAweEZGMDApID4+IDgpOworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MDkgLCB0ZW1wKTsKKyAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpKCgob2Zmc2V0ID4+IDMpICYgMHhGRikgKyAxKSA7CisgICAgWEdJTmV3X1NldFJlZzEocFZCSW5mby0+UGFydDFQb3J0LCAweDAzLCB0ZW1wKTsKIH0KIAogCkBAIC01NDIyLDkgKzUxNjksOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVVNIT1JUIFhHSV9HZXRPZmZzZXQoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCxQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordW5zaWduZWQgc2hvcnQgWEdJX0dldE9mZnNldCh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXAgLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXAgLAogICAgICAgICAgICBjb2xvcmRlcHRoICwKICAgICAgICAgICAgbW9kZWluZm8gLAogICAgICAgICAgICBpbmRleCAsCkBAIC01NDcxLDcgKzUyMTgsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0Q1JUMkZJRk8oIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfU2V0Q1JUMkZJRk8oc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDAxICwgMHgzQiApIDsJCQkvKiB0aHJlc2hvbGQgaGlnaCAsZGlzYWJsZSBhdXRvIHRocmVzaG9sZCAqLwogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgwMiAsIH4oIDB4M0YgKSAsIDB4MDQgKSA7CS8qIHRocmVzaG9sZCBsb3cgZGVmYXVsdCAwNGggKi8KQEAgLTU0ODQsMTAgKzUyMzEsMTIgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1ByZVNldEdyb3VwMShVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICxQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9QcmVTZXRHcm91cDEodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgICAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wY3ggPSAwICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wY3ggPSAwICwKICAgICAgICAgICAgQ1JUMUluZGV4ID0gMCAsCiAgICAgICAgICAgIHJlc2luZm8gPSAwIDsKIApAQCAtNTUxOCwxMCArNTI2NywxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0R3JvdXAxKCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgVVNIT1JUIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0R3JvdXAxKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAorCQkgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcCA9IDAgLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXAgPSAwICwKICAgICAgICAgICAgdGVtcGF4ID0gMCAsCiAgICAgICAgICAgIHRlbXBieCA9IDAgLAogICAgICAgICAgICB0ZW1wY3ggPSAwICwKQEAgLTU2OTQsMTAgKzU0NDUsMTIgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgIFhHSV9TZXRMb2NrUmVncyggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24gLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkICBYR0lfU2V0TG9ja1JlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgICAgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBwdXNoMSAsCisgICAgdW5zaWduZWQgc2hvcnQgcHVzaDEgLAogICAgICAgICAgICBwdXNoMiAsCiAgICAgICAgICAgIHRlbXBheCAsCiAgICAgICAgICAgIHRlbXBieCA9IDAgLApAQCAtNjE0MSwxMCArNTg5NCwxMCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0R3JvdXAyKCBVU0hPUlQgTW9kZU5vLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldEdyb3VwMih1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGkgLAorICAgIHVuc2lnbmVkIHNob3J0IGkgLAogICAgICAgICAgICBqICwKICAgICAgICAgICAgdGVtcGF4ICwKICAgICAgICAgICAgdGVtcGJ4ICwKQEAgLTYxNTUsOSArNTkwOCw5IEBACiAgICAgICAgICAgIG1vZGVmbGFnICwKICAgICAgICAgICAgcmVzaW5mbyAsCiAgICAgICAgICAgIGNydDJjcnRjIDsKLSAgICBVQ0hBUiAqVGltaW5nUG9pbnQgOworICAgIHVuc2lnbmVkIGNoYXIgKlRpbWluZ1BvaW50IDsKIAotICAgIFVMT05HIGxvbmd0ZW1wICwKKyAgICB1bnNpZ25lZCBsb25nIGxvbmd0ZW1wICwKICAgICAgICAgICB0ZW1wZWF4ICwKICAgICAgICAgICB0ZW1wZWJ4ICwKICAgICAgICAgICB0ZW1wMiAsCkBAIC02MjY2LDcgKzYwMTksNyBAQAogICAgICAgICB0ZW1wYXggPSAoIHRlbXBheCAmIDB4MDBGRiApIHwgKCAoIHRlbXBheCAmIDB4MDBGRiApIDw8IDggKSA7CiAgICAgICAgIHB1c2gxID0gdGVtcGF4IDsKICAgICAgICAgdGVtcCA9ICggdGVtcGF4ICYgMHhGRjAwICkgPj4gOCA7Ci0gICAgICAgIHRlbXAgKz0gKCBVU0hPUlQgKVRpbWluZ1BvaW50WyAwIF0gOworCXRlbXAgKz0gKHVuc2lnbmVkIHNob3J0KVRpbWluZ1BvaW50WzBdOwogCiAgICAgICAgIGlmICggcFZCSW5mby0+VkJUeXBlICYgKCBWQl9YR0kzMDFCIHwgVkJfWEdJMzAyQiB8IFZCX1hHSTMwMUxWIHwgVkJfWEdJMzAyTFYgfCBWQl9YR0kzMDFDICkgKQogICAgICAgICB7CkBAIC02NTQzLDcgKzYyOTYsNyBAQAogICAgICAgICAgICAgdGVtcGVheCArPSAxIDsKICAgICAgICAgfQogCi0gICAgICAgIHRlbXBheCA9ICggVVNIT1JUICl0ZW1wZWF4IDsKKwl0ZW1wYXggPSAodW5zaWduZWQgc2hvcnQpdGVtcGVheDsKIAogCS8qIDMwMWIgKi8KICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQlR5cGUgJiAoIFZCX1hHSTMwMUIgfCBWQl9YR0kzMDJCIHwgVkJfWEdJMzAxTFYgfCBWQl9YR0kzMDJMViB8IFZCX1hHSTMwMUMgKSApCkBAIC02NTUzLDggKzYzMDYsOCBAQAogICAgICAgICAvKiBlbmQgMzAxYiAqLwogCiAgICAgICAgIHRlbXBieCA9IHB1c2gxIDsKLSAgICAgICAgdGVtcGJ4ID0oIFVTSE9SVCApKCAoICggdGVtcGVheCAmIDB4MDAwMEZGMDAgKSAmIDB4MUYwMCApIHwgKCB0ZW1wYnggJiAweDAwRkYgKSApIDsKLSAgICAgICAgdGVtcGF4ID0oIFVTSE9SVCApKCAoICggdGVtcGVheCAmIDB4MDAwMDAwRkYgKSA8PCA4ICkgfCAoIHRlbXBheCAmIDB4MDBGRiApICkgOworCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkoKCh0ZW1wZWF4ICYgMHgwMDAwRkYwMCkgJiAweDFGMDApIHwgKHRlbXBieCAmIDB4MDBGRikpOworCXRlbXBheCA9ICh1bnNpZ25lZCBzaG9ydCkoKCh0ZW1wZWF4ICYgMHgwMDAwMDBGRikgPDwgOCkgfCAodGVtcGF4ICYgMHgwMEZGKSk7CiAgICAgICAgIHRlbXAgPSAoIHRlbXBheCAmIDB4RkYwMCApID4+IDggOwogICAgIH0KICAgICBlbHNlCkBAIC02NjA3LDcgKzYzNjAsNyBAQAogCiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQyUG9ydCAsIDB4NGQgLCB0ZW1wICkgOwogICAgIHRlbXA9WEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlBhcnQyUG9ydCAsIDB4NDMgKSA7CQkvKiAzMDFiIGNoYW5nZSAqLwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MlBvcnQgLCAweDQzICwgKCBVU0hPUlQgKSggdGVtcCAtIDMgKSApIDsKKyAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHg0MywgKHVuc2lnbmVkIHNob3J0KSggdGVtcCAtIDMgKSApIDsKIAogICAgIGlmICggISggcFZCSW5mby0+VFZJbmZvICYgKCBTZXRZUGJQck1vZGU1MjVwIHwgU2V0WVBiUHJNb2RlNzUwcCApICkgKQogICAgIHsKQEAgLTY2MzEsNyArNjM4NCw3IEBACiAKICAgICBpZiAoIHBWQkluZm8tPlRWSW5mbyAmIFNldFBBTE1UViApCiAgICAgewotICAgICAgICB0ZW1wYXggPSAoIFVDSEFSIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgwMSApIDsKKwl0ZW1wYXggPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MDEpOwogICAgICAgICB0ZW1wYXgtLSA7CiAgICAgICAgIFhHSU5ld19TZXRSZWdBTkQoIHBWQkluZm8tPlBhcnQyUG9ydCAsIDB4MDEgLCB0ZW1wYXggKSA7CiAKQEAgLTY2NjAsOSArNjQxMyw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkICBYR0lfU2V0TENEUmVncyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbixVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgIFhHSV9TZXRMQ0RSZWdzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgcHVzaDEgLAorICAgIHVuc2lnbmVkIHNob3J0IHB1c2gxICwKICAgICAgICAgICAgcHVzaDIgLAogICAgICAgICAgICBwdXNoYnggLAogICAgICAgICAgICB0ZW1wYXggLApAQCAtNjY3Niw3ICs2NDI5LDcgQEAKICAgICAgICAgICAgbW9kZWZsYWcgLAogICAgICAgICAgICBDUlQxSW5kZXggOwogCi0gICAgWEdJX0xDRERlc1N0cnVjdCAqTENEQkRlc1B0ciA9IE5VTEwgOworICAgIHN0cnVjdCBYR0lfTENERGVzU3RydWN0ICpMQ0RCRGVzUHRyID0gTlVMTCA7CiAKIAogICAgIGlmICggTW9kZU5vIDw9IDB4MTMgKQpAQCAtNjc0Niw3ICs2NDk5LDcgQEAKIAogICAgIC8qIEN1c3RvbWl6ZWQgTENEQiBEZXMgbm8gYWRkICovCiAgICAgdGVtcGJ4ID0gNSA7Ci0gICAgTENEQkRlc1B0ciA9ICggWEdJX0xDRERlc1N0cnVjdCAqIClYR0lfR2V0TGNkUHRyKCB0ZW1wYnggLCBNb2RlTm8gLCBNb2RlSWRJbmRleCAsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyApIDsKKyAgICBMQ0RCRGVzUHRyID0gKHN0cnVjdCBYR0lfTENERGVzU3RydWN0ICopWEdJX0dldExjZFB0cih0ZW1wYngsIE1vZGVObywgTW9kZUlkSW5kZXgsIFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyk7CiAgICAgdGVtcGFoID0gcFZCSW5mby0+TENEUmVzSW5mbyA7CiAgICAgdGVtcGFoICY9IFBhbmVsUmVzSW5mbyA7CiAKQEAgLTY5MTQsMTMgKzY2NjcsMTQgQEAKIC8qIE91dHB1dCA6IGRpIC0+IFRhcDQgUmVnLiBTZXR0aW5nIFBvaW50ZXIgKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0KiBYR0lfR2V0VGFwNFB0cihVU0hPUlQgdGVtcGN4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3N0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgKlhHSV9HZXRUYXA0UHRyKHVuc2lnbmVkIHNob3J0IHRlbXBjeCwKKwkJCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGF4ICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXggLAogICAgICAgICAgICB0ZW1wYnggLAogICAgICAgICAgICBpIDsKIAotICAgIFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCAqVGFwNFRpbWluZ1B0ciA7CisgICAgc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCAqVGFwNFRpbWluZ1B0ciA7CiAKICAgICBpZiAoIHRlbXBjeCA9PSAwICkKICAgICB7CkBAIC02OTc0LDEyICs2NzI4LDEyIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRUYXA0UmVncyggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRUYXA0UmVncyhzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGkgLAorICAgIHVuc2lnbmVkIHNob3J0IGkgLAogICAgICAgICAgICBqIDsKIAotICAgIFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCAqVGFwNFRpbWluZ1B0ciA7CisgICAgc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCAqVGFwNFRpbWluZ1B0ciA7CiAKICAgICBpZiAoICEoIHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMUMgKSApCiAgICAgICAgIHJldHVybiA7CkBAIC03MDEyLDExICs2NzY2LDExIEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRHcm91cDMoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfU2V0R3JvdXAzKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgaTsKLSAgICBVQ0hBUiAqdGVtcGRpOwotICAgIFVTSE9SVCAgbW9kZWZsYWc7CisgICAgdW5zaWduZWQgc2hvcnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyICp0ZW1wZGk7CisgICAgdW5zaWduZWQgc2hvcnQgIG1vZGVmbGFnOwogCiAgICAgaWYoTW9kZU5vPD0weDEzKQogICAgIHsKQEAgLTcwOTksMTYgKzY4NTMsMTYgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldEdyb3VwNChVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfU2V0R3JvdXA0KHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGF4ICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXggLAogICAgICAgICAgICB0ZW1wY3ggLAogICAgICAgICAgICB0ZW1wYnggLAogICAgICAgICAgICBtb2RlZmxhZyAsCiAgICAgICAgICAgIHRlbXAgLAogICAgICAgICAgICB0ZW1wMiA7CiAKLSAgICBVTE9ORyB0ZW1wZWJ4ICwKKyAgICB1bnNpZ25lZCBsb25nIHRlbXBlYnggLAogICAgICAgICAgIHRlbXBlYXggLAogICAgICAgICAgIHRlbXBsb25nIDsKIApAQCAtNzIzMCwxMiArNjk4NCwxMiBAQAogICAgIH0KIAogCi0gICAgdGVtcCA9ICggVVNIT1JUICkoIHRlbXBlYnggJiAweDAwMDAwMEZGICkgOworICAgIHRlbXAgPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYnggJiAweDAwMDAwMEZGKTsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgxQiAsIHRlbXAgKSA7CiAKLSAgICB0ZW1wID0gKCBVU0hPUlQgKSggKCB0ZW1wZWJ4ICYgMHgwMDAwRkYwMCApID4+IDggKSA7CisgICAgdGVtcCA9ICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBlYnggJiAweDAwMDBGRjAwKSA+PiA4KTsKICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDRQb3J0ICwgMHgxQSAsIHRlbXAgKSA7Ci0gICAgdGVtcGJ4ID0gKCBVU0hPUlQgKSggdGVtcGVieCA+PiAxNiApIDsKKyAgICB0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpKHRlbXBlYnggPj4gMTYpOwogICAgIHRlbXAgPSB0ZW1wYnggJiAweDAwRkYgOwogICAgIHRlbXAgPSB0ZW1wIDw8IDQgOwogICAgIHRlbXAgfD0gKCAoIHRlbXBjeCAmIDB4RkYwMCApID4+IDggKSA7CkBAIC03MzUwLDkgKzcxMDQsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0R3JvdXA1KCBVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4ICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRHcm91cDUodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBQaW5kZXggLAorICAgIHVuc2lnbmVkIHNob3J0IFBpbmRleCAsCiAgICAgICAgICAgIFBkYXRhIDsKIAogICAgIFBpbmRleCA9IHBWQkluZm8tPlBhcnQ1UG9ydCA7CkBAIC03Mzc1LDkgKzcxMjksMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQqIFhHSV9HZXRMY2RQdHIoIFVTSE9SVCBCWCAsIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkICpYR0lfR2V0TGNkUHRyKHVuc2lnbmVkIHNob3J0IEJYLAorCQkgICAgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCSAgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCSAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGkgLAorICAgIHVuc2lnbmVkIHNob3J0IGkgLAogICAgICAgICAgICB0ZW1wZHggLAogICAgICAgICAgICB0ZW1wY3ggLAogICAgICAgICAgICB0ZW1wYnggLApAQCAtNzM4NSw3ICs3MTQzLDcgQEAKICAgICAgICAgICAgbW9kZWZsYWcgLAogICAgICAgICAgICB0YWJsZSA7CiAKLSAgICBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgKnRlbXBkaSA9IDAgOworICAgIHN0cnVjdCBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgKnRlbXBkaSA9IDAgOwogCiAKICAgICB0ZW1wYnggPSBCWDsKQEAgLTc4NzcsMTAgKzc2MzUsMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQqIFhHSV9HZXRUVlB0ciAoVVNIT1JUIEJYLFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgKlhHSV9HZXRUVlB0cih1bnNpZ25lZCBzaG9ydCBCWCwgdW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJICAgdW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGkgLCB0ZW1wZHggLCB0ZW1wYnggLCB0ZW1wYWwgLCBtb2RlZmxhZyAsIHRhYmxlIDsKLSAgICBYR0kzMzBfVFZEYXRhVGFibFN0cnVjdCAqdGVtcGRpID0gMCA7CisgICAgdW5zaWduZWQgc2hvcnQgaSAsIHRlbXBkeCAsIHRlbXBieCAsIHRlbXBhbCAsIG1vZGVmbGFnICwgdGFibGUgOworICAgIHN0cnVjdCBYR0kzMzBfVFZEYXRhVGFibFN0cnVjdCAqdGVtcGRpID0gMCA7CiAKICAgICB0ZW1wYnggPSBCWCA7CiAKQEAgLTc5NTUsNTMgKzc3MTYsOSBAQAogCiAgICAgaWYgKCB0YWJsZSA9PSAweDAwICkgLyogMDcvMDUvMjIgKi8KICAgICB7Ci0jaWZkZWYgV0lOMjAwMAotICAgICAgICBpZiAoIHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2goIHRlbXBkaVsgaSBdLkRBVEFQVFIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gJkNINzAwN1RWQ1JUMVVOVFNDX0hbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZDSDcwMDdUVkNSVDFPTlRTQ19IWyB0ZW1wYWwgXSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiAmQ0g3MDA3VFZDUlQxVVBBTF9IWyB0ZW1wYWwgXSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiAmQ0g3MDA3VFZDUlQxT1BBTF9IWyB0ZW1wYWwgXSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKICAgICB9CiAgICAgZWxzZSBpZiAoIHRhYmxlID09IDB4MDEgKQogICAgIHsKLSNpZmRlZiBXSU4yMDAwCi0gICAgICAgIGlmICggcFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCggdGVtcGRpWyBpIF0uREFUQVBUUiApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiAmQ0g3MDA3VFZDUlQxVU5UU0NfVlsgdGVtcGFsIF0gOwotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gJkNINzAwN1RWQ1JUMU9OVFNDX1ZbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZDSDcwMDdUVkNSVDFVUEFMX1ZbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZDSDcwMDdUVkNSVDFPUEFMX1ZbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgogICAgIH0KICAgICBlbHNlIGlmICggdGFibGUgPT0gMHgwNCApCiAgICAgewpAQCAtODA3NSw0OSArNzc5Miw2IEBACiAgICAgfQogICAgIGVsc2UgaWYoIHRhYmxlID09IDB4MDYgKQogICAgIHsKLSNpZmRlZiBXSU4yMDAwCi0gICAgICAgIGlmICggcFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFZpZGVvRGVidWdQcmludCgoMCwgIlhHSV9HZXRUVlB0cjogcFZCSW5mby0+SUZfREVGX0NINzAwNz09MVxuIikpOyAqLwotICAgICAgICAgIHN3aXRjaCggdGVtcGRpWyBpIF0uREFUQVBUUiApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiAmQ0g3MDA3VFZSZWdfVU5UU0NbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZDSDcwMDdUVlJlZ19PTlRTQ1sgdGVtcGFsIF0gOwotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gJkNINzAwN1RWUmVnX1VQQUxbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZDSDcwMDdUVlJlZ19PUEFMWyB0ZW1wYWwgXSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCB0ZW1wZGlbIGkgXS5EQVRBUFRSICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiAmWEdJX0NIVFZSZWdVTlRTQ1sgdGVtcGFsIF0gOwotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJldHVybiAmWEdJX0NIVFZSZWdPTlRTQ1sgdGVtcGFsIF0gOwotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiAmWEdJX0NIVFZSZWdVUEFMWyB0ZW1wYWwgXSA7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZYR0lfQ0hUVlJlZ09QQUxbIHRlbXBhbCBdIDsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKICAgICB9CiAgICAgcmV0dXJuKCAwICkgOwogfQpAQCAtODEyNiwxOCArNzgwMCwxOCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBGdW5jdGlvbiA6IFhHSV9CYWNrbGlnaHRCeURydiAqLwogLyogSW5wdXQgOiAqLwotLyogT3V0cHV0IDogVFJVRSAtPiBTa2lwIGJhY2tsaWdodCBjb250cm9sICovCisvKiBPdXRwdXQgOiAxIC0+IFNraXAgYmFja2xpZ2h0IGNvbnRyb2wgKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lfQmFja2xpZ2h0QnlEcnYoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgWEdJX0JhY2tsaWdodEJ5RHJ2KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiB0ZW1wYWggOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcGFoIDsKIAotICAgIHRlbXBhaCA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgzQSApIDsKLSAgICBpZiAoIHRlbXBhaCAmIEJhY2tsaWdodENvbnRyb2xCaXQgKQotICAgICAgICByZXR1cm4gVFJVRSA7CisgICAgdGVtcGFoID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNkNCwgMHgzQSkgOworICAgIGlmICh0ZW1wYWggJiBCYWNrbGlnaHRDb250cm9sQml0KQorCSAgICByZXR1cm4gMTsKICAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRSA7CisJICAgIHJldHVybiAwOwogfQogCiAKQEAgLTgxNDgsNyArNzgyMiw3IEBACiAvKiBEZXNjcmlwdGlvbiA6IFR1cm4gb2ZmIFZERCAmIEJhY2tsaWdodCA6IEZpcmUgZGlzYWJsZSBwcm9jZWR1cmUgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoKLXZvaWQgWEdJX0ZpcmVQV0REaXNhYmxlKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9GaXJlUFdERGlzYWJsZShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDI2ICwgMHgwMCAsIDB4RkMgKSA7CiB9CkBAIC04MTYwLDcgKzc4MzQsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogVHVybiBvbiBWREQgJiBCYWNrbGlnaHQgOiBGaXJlIGVuYWJsZSBwcm9jZWR1cmUgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfRmlyZVBXREVuYWJsZShQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9GaXJlUFdERW5hYmxlKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MjYgLCAweDAzICwgMHhGQyApIDsKIH0KQEAgLTgxNzIsNyArNzg0Niw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9FbmFibGVHYXRpbmdDUlQoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9FbmFibGVHYXRpbmdDUlQoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzZDQgLCAweDYzICwgMHhCRiAsIDB4NDAgKSA7CiB9CkBAIC04MTg0LDcgKzc4NTgsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfRGlzYWJsZUdhdGluZ0NSVChQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX0Rpc2FibGVHYXRpbmdDUlQoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNkNCAsIDB4NjMgLCAweEJGICwgMHgwMCApIDsKQEAgLTgyMDEsOSArNzg3NSw5IEBACiAvKiA6IGJsIDogMyA7IFQzIDogdGhlIGR1cmF0aW9uIGJldHdlZW4gQ1BMIG9mZiBhbmQgc2lnbmFsIG9mZiAqLwogLyogOiBibCA6IDQgOyBUNCA6IHRoZSBkdXJhdGlvbiBzaWduYWwgb2ZmIGFuZCBWZGQgb2ZmICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldFBhbmVsRGVsYXkoVVNIT1JUIHRlbXBibCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRQYW5lbERlbGF5KHVuc2lnbmVkIHNob3J0IHRlbXBibCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBpbmRleCA7CisgICAgdW5zaWduZWQgc2hvcnQgaW5kZXggOwogCiAgICAgaW5kZXggPSBYR0lfR2V0TENEQ2FwUHRyKHBWQkluZm8pIDsKIApAQCAtODIzMSw3ICs3OTA1LDcgQEAKIC8qID0gMTAxMWIgPSAwQmggOyBCYWNrbGlnaHQgb2ZmLCBQb3dlciBvbiAqLwogLyogPSAxMTExYiA9IDBGaCA7IEJhY2tsaWdodCBvZmYsIFBvd2VyIG9mZiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRQYW5lbFBvd2VyKFVTSE9SVCB0ZW1wYWgsVVNIT1JUIHRlbXBibCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRQYW5lbFBvd2VyKHVuc2lnbmVkIHNob3J0IHRlbXBhaCwgdW5zaWduZWQgc2hvcnQgdGVtcGJsLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaWYgKCBwVkJJbmZvLT5WQlR5cGUgJiAoIFZCX1hHSTMwMUxWIHwgVkJfWEdJMzAyTFYgfCBWQl9YR0kzMDFDICkgKQogICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlBhcnQ0UG9ydCAsIDB4MjYgLCB0ZW1wYmwgLCB0ZW1wYWggKSA7CkBAIC04MjM5LDEwICs3OTEzLDEwIEBACiAgICAgICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNjNCAsIDB4MTEgLCB0ZW1wYmwgLCB0ZW1wYWggKSA7CiB9CiAKLVVDSEFSIFhHMjFHUElPRGF0YVRyYW5zZmVyKFVDSEFSIHVqRGF0ZSkKK3Vuc2lnbmVkIGNoYXIgWEcyMUdQSU9EYXRhVHJhbnNmZXIodW5zaWduZWQgY2hhciB1akRhdGUpCiB7Ci0gICAgVUNIQVIgIHVqUmV0ID0gMDsKLSAgICBVQ0hBUiAgaSA9IDA7CisgICAgdW5zaWduZWQgY2hhciAgdWpSZXQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgIGkgPSAwOwogCiAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQogCXsKQEAgLTgyNjAsOSArNzkzNCw5IEBACiAvKiAgICAgIGJsWzFdIDogTFZEUyBiYWNrbGlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICBibFswXSA6IExWRFMgVkREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1VQ0hBUiBYR0lfWEcyMUdldFBTQ1ZhbHVlKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordW5zaWduZWQgY2hhciBYR0lfWEcyMUdldFBTQ1ZhbHVlKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiBDUjRBLHRlbXA7CisgICAgdW5zaWduZWQgY2hhciBDUjRBLCB0ZW1wOwogCiAgICAgQ1I0QSA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHg0QSApIDsKICAgICBYR0lOZXdfU2V0UmVnQU5EKCBwVkJJbmZvLT5QM2Q0ICwgMHg0QSAsIH4weDIzICkgOyAvKiBlbmFibGUgR1BJTyB3cml0ZSAqLwpAQCAtODI4MSw5ICs3OTU1LDkgQEAKIC8qICAgICAgYmxbMV0gOiBMVkRTIGJhY2tsaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgIGJsWzBdIDogTFZEUyBWREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVVDSEFSIFhHSV9YRzI3R2V0UFNDVmFsdWUoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBjaGFyIFhHSV9YRzI3R2V0UFNDVmFsdWUoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIENSNEEsQ1JCNCx0ZW1wOworICAgIHVuc2lnbmVkIGNoYXIgQ1I0QSwgQ1JCNCwgdGVtcDsKIAogICAgIENSNEEgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAsIDB4NEEgKSA7CiAgICAgWEdJTmV3X1NldFJlZ0FORCggcFZCSW5mby0+UDNkNCAsIDB4NEEgLCB+MHgwQyApIDsgLyogZW5hYmxlIEdQSU8gd3JpdGUgKi8KQEAgLTgzMDYsOSArNzk4MCw5IEBACiAvKiAgICAgICAgICAwMDAwMTBiIDogY2xlYXIgYml0IDEsIHRvIHNldCBiaXQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgMDAwMDAxYiA6IGNsZWFyIGJpdCAwLCB0byBzZXQgYml0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFhHSV9YRzIxQkxTaWduYWxWREQoVVNIT1JUIHRlbXBiaCxVU0hPUlQgdGVtcGJsLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX1hHMjFCTFNpZ25hbFZERCh1bnNpZ25lZCBzaG9ydCB0ZW1wYmgsIHVuc2lnbmVkIHNob3J0IHRlbXBibCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIENSNEEsdGVtcDsKKyAgICB1bnNpZ25lZCBjaGFyIENSNEEsIHRlbXA7CiAKICAgICBDUjRBID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDRBICkgOwogICAgIHRlbXBiaCAmPSAweDIzOwpAQCAtODMzMSwxMCArODAwNSwxMCBAQAogICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHg0OCAsIHRlbXAgKSA7CiB9CiAKLXZvaWQgWEdJX1hHMjdCTFNpZ25hbFZERChVU0hPUlQgdGVtcGJoLFVTSE9SVCB0ZW1wYmwsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfWEcyN0JMU2lnbmFsVkREKHVuc2lnbmVkIHNob3J0IHRlbXBiaCwgdW5zaWduZWQgc2hvcnQgdGVtcGJsLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVUNIQVIgQ1I0QSx0ZW1wOwotICAgIFVTSE9SVCB0ZW1wYmgwLHRlbXBibDA7CisgICAgdW5zaWduZWQgY2hhciBDUjRBLCB0ZW1wOworICAgIHVuc2lnbmVkIHNob3J0IHRlbXBiaDAsIHRlbXBibDA7CiAKICAgICB0ZW1wYmgwID0gdGVtcGJoOwogICAgIHRlbXBibDAgPSB0ZW1wYmw7CkBAIC04MzYyLDE1ICs4MDM2LDEzIEBACiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVVNIT1JUIFhHSV9HZXRMVkRTT0VNVGFibGVJbmRleChQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRMVkRTT0VNVGFibGVJbmRleChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGluZGV4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbmRleCA7CiAKICAgICBpbmRleCA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICwgMHgzNiApIDsKLSAgICBpZiAoaW5kZXg8c2l6ZW9mKFhHSTIxX0xDRENhcExpc3QpL3NpemVvZihYR0kyMV9MVkRTQ2FwU3RydWN0KSkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQorICAgIGlmIChpbmRleCA8IHNpemVvZihYR0kyMV9MQ0RDYXBMaXN0KS9zaXplb2Yoc3RydWN0IFhHSTIxX0xWRFNDYXBTdHJ1Y3QpKQorCSAgICByZXR1cm4gaW5kZXg7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTgzODQsOSArODA1Niw5IEBACiAvKiA6IGJsIDogMyA7IFQzIDogdGhlIGR1cmF0aW9uIGJldHdlZW4gQ1BMIG9mZiBhbmQgc2lnbmFsIG9mZiAqLwogLyogOiBibCA6IDQgOyBUNCA6IHRoZSBkdXJhdGlvbiBzaWduYWwgb2ZmIGFuZCBWZGQgb2ZmICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1hHMjFTZXRQYW5lbERlbGF5KFVTSE9SVCB0ZW1wYmwsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfWEcyMVNldFBhbmVsRGVsYXkodW5zaWduZWQgc2hvcnQgdGVtcGJsLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGluZGV4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbmRleCA7CiAKICAgICBpbmRleCA9IFhHSV9HZXRMVkRTT0VNVGFibGVJbmRleCggcFZCSW5mbyApOwogICAgIGlmICggdGVtcGJsID09IDEgKQpAQCAtODQwMiw5ICs4MDc0LDExIEBACiAgICAgICAgIFhHSU5ld19MQ0RfV2FpdF9UaW1lKCBwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0WyBpbmRleCBdLlBTQ19TNCwgcFZCSW5mbyApIDsKIH0KIAotQk9PTEVBTiBYR0lfWEcyMUNoZWNrTFZEU01vZGUoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgWEdJX1hHMjFDaGVja0xWRFNNb2RlKHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCisJCQkJICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgeHJlcyAsCisgICAgdW5zaWduZWQgc2hvcnQgeHJlcyAsCiAgICAgICAgICAgIHlyZXMgLAogICAgICAgICAgICBjb2xvcmRlcHRoICwKICAgICAgICAgICAgbW9kZWZsYWcgLApAQCAtODQ0NSwxMCArODExOSwxMCBAQAogCiAgICAgbHZkc3RhYmxlaW5kZXggPSBYR0lfR2V0TFZEU09FTVRhYmxlSW5kZXgoIHBWQkluZm8gKTsKICAgICBpZiAoIHhyZXMgPiAocFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU0hERSkgKQotICAgICAgcmV0dXJuIEZBTFNFOworCSAgICByZXR1cm4gMDsKIAogICAgIGlmICggeXJlcyA+IChwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS5MVkRTVkRFKSApCi0gICAgICByZXR1cm4gRkFMU0U7CisJICAgIHJldHVybiAwOwogCiAgICAgaWYgKCBNb2RlTm8gPiAweDEzICkKICAgICB7CkBAIC04NDU2LDE4ICs4MTMwLDE3IEBACiAgICAgICAgICAgICggeXJlcyAhPSAocFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU1ZERSkpICkKICAgICAgIHsKICAgICAgICAgICBjb2xvcmRlcHRoID0gWEdJX0dldENvbG9yRGVwdGgoIE1vZGVObyAsIE1vZGVJZEluZGV4LCBwVkJJbmZvICkgOwotICAgICAgICAgIGlmICggY29sb3JkZXB0aCA+IDIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICB9CisJICBpZiAoY29sb3JkZXB0aCA+IDIpCisJCSAgcmV0dXJuIDA7CisKICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIDE7CiB9CiAKLXZvaWQgWEdJX1NldFhHMjFGUEJpdHMoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRYRzIxRlBCaXRzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiB0ZW1wOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcDsKIAogICAgIHRlbXAgPSBYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UDNkNCAgLCAweDM3ICkgOyAgLyogRFswXSAxOiAxOGJpdCAqLwogICAgIHRlbXAgPSAoIHRlbXAgJiAxICkgPDwgNjsKQEAgLTg0NzYsOSArODE0OSw5IEBACiAKIH0KIAotdm9pZCBYR0lfU2V0WEcyN0ZQQml0cyhQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX1NldFhHMjdGUEJpdHMoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIHRlbXA7CisgICAgdW5zaWduZWQgY2hhciB0ZW1wOwogCiAgICAgdGVtcCA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2Q0ICAsIDB4MzcgKSA7ICAvKiBEWzE6MF0gMDE6IDE4Yml0LCAwMDogZHVhbCAxMiwgMTA6IHNpbmdsZSAyNCAqLwogICAgIHRlbXAgPSAoIHRlbXAgJiAzICkgPDwgNjsKQEAgLTg0ODcsMjcgKzgxNjAsMjggQEAKIAogfQogCi12b2lkIFhHSV9TZXRYRzIxTFZEU1BhcmEoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldFhHMjFMVkRTUGFyYSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiB0ZW1wLE1pc2NkYXRhOwotICAgIFVTSE9SVCB4cmVzICwKKyAgICB1bnNpZ25lZCBjaGFyIHRlbXAsIE1pc2NkYXRhOworICAgIHVuc2lnbmVkIHNob3J0IHhyZXMgLAogICAgICAgICAgICB5cmVzICwKICAgICAgICAgICAgbW9kZWZsYWcgLAogICAgICAgICAgICByZXNpbmRleCAsCiAgICAgICAgICAgIGx2ZHN0YWJsZWluZGV4IDsKLSAgICBVU0hPUlQgTFZEU0hULExWRFNIQlMsTFZEU0hSUyxMVkRTSFJFLExWRFNIQkU7Ci0gICAgVVNIT1JUIExWRFNWVCxMVkRTVkJTLExWRFNWUlMsTFZEU1ZSRSxMVkRTVkJFOwotICAgIFVTSE9SVCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBMVkRTSFQsTFZEU0hCUyxMVkRTSFJTLExWRFNIUkUsTFZEU0hCRTsKKyAgICB1bnNpZ25lZCBzaG9ydCBMVkRTVlQsTFZEU1ZCUyxMVkRTVlJTLExWRFNWUkUsTFZEU1ZCRTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKIAogICAgIGx2ZHN0YWJsZWluZGV4ID0gWEdJX0dldExWRFNPRU1UYWJsZUluZGV4KCBwVkJJbmZvICk7CiAKLSAgICB0ZW1wID0gKFVDSEFSKSAoICggcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU19DYXBhYmlsaXR5ICYgKExDRFBvbGFyaXR5IDw8IDggKSApID4+IDggKTsKKyAgICB0ZW1wID0gKHVuc2lnbmVkIGNoYXIpICgocFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU19DYXBhYmlsaXR5ICYgKExDRFBvbGFyaXR5IDw8IDgpKSA+PiA4KTsKICAgICB0ZW1wICY9IExDRFBvbGFyaXR5OwotICAgIE1pc2NkYXRhID0oVUNIQVIpIFhHSU5ld19HZXRSZWcyKHBWQkluZm8tPlAzY2MpIDsKKyAgICBNaXNjZGF0YSA9ICh1bnNpZ25lZCBjaGFyKSBYR0lOZXdfR2V0UmVnMihwVkJJbmZvLT5QM2NjKSA7CiAKICAgICBYR0lOZXdfU2V0UmVnMyggcFZCSW5mby0+UDNjMiAsIChNaXNjZGF0YSAmIDB4M0YpIHwgdGVtcCApIDsKIAotICAgIHRlbXAgPSAoVUNIQVIpICggcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU19DYXBhYmlsaXR5ICYgTENEUG9sYXJpdHkgKSA7CisgICAgdGVtcCA9ICh1bnNpZ25lZCBjaGFyKSAocFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU19DYXBhYmlsaXR5ICYgTENEUG9sYXJpdHkpIDsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzYzQgLCAweDM1ICwgfjB4ODAgLCB0ZW1wJjB4ODAgKSA7ICAgICAgLyogU1IzNVs3XSBGUCBWU3luYyBwb2xhcml0eSAqLwogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNjNCAsIDB4MzAgLCB+MHgyMCAsICh0ZW1wJjB4NDApPj4xICkgOyAgIC8qIFNSMzBbNV0gRlAgSFN5bmMgcG9sYXJpdHkgKi8KIApAQCAtODU2Myw3ICs4MjM3LDcgQEAKIAogICAgIExWRFNWQkUgPSBMVkRTVkJTICsgTFZEU1ZUIC0gcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU1ZERSA7CiAKLSAgICB0ZW1wID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICkgOworICAgIHRlbXAgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDExKSA7CiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICwgdGVtcCAmIDB4N2YgKSA7CQkvKiBVbmxvY2sgQ1JUQyAqLwogCiAgICAgaWYgKCEoIG1vZGVmbGFnICYgQ2hhcng4RG90ICkpCkBAIC04NjcwLDI2ICs4MzQ0LDI3IEBACiB9CiAKIC8qIG5vIHNoYWRvdyBjYXNlICovCi12b2lkIFhHSV9TZXRYRzI3TFZEU1BhcmEoVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldFhHMjdMVkRTUGFyYSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVQ0hBUiB0ZW1wLE1pc2NkYXRhOwotICAgIFVTSE9SVCB4cmVzICwKKyAgICB1bnNpZ25lZCBjaGFyIHRlbXAsIE1pc2NkYXRhOworICAgIHVuc2lnbmVkIHNob3J0IHhyZXMgLAogICAgICAgICAgICB5cmVzICwKICAgICAgICAgICAgbW9kZWZsYWcgLAogICAgICAgICAgICByZXNpbmRleCAsCiAgICAgICAgICAgIGx2ZHN0YWJsZWluZGV4IDsKLSAgICBVU0hPUlQgTFZEU0hULExWRFNIQlMsTFZEU0hSUyxMVkRTSFJFLExWRFNIQkU7Ci0gICAgVVNIT1JUIExWRFNWVCxMVkRTVkJTLExWRFNWUlMsTFZEU1ZSRSxMVkRTVkJFOwotICAgIFVTSE9SVCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBMVkRTSFQsTFZEU0hCUyxMVkRTSFJTLExWRFNIUkUsTFZEU0hCRTsKKyAgICB1bnNpZ25lZCBzaG9ydCBMVkRTVlQsTFZEU1ZCUyxMVkRTVlJTLExWRFNWUkUsTFZEU1ZCRTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKIAogICAgIGx2ZHN0YWJsZWluZGV4ID0gWEdJX0dldExWRFNPRU1UYWJsZUluZGV4KCBwVkJJbmZvICk7Ci0gICAgdGVtcCA9IChVQ0hBUikgKCAoIHBWQkluZm8tPlhHMjFfTFZEU0NhcExpc3RbbHZkc3RhYmxlaW5kZXhdLkxWRFNfQ2FwYWJpbGl0eSAmIChMQ0RQb2xhcml0eSA8PCA4ICkgKSA+PiA4ICk7CisgICAgdGVtcCA9ICh1bnNpZ25lZCBjaGFyKSAoKHBWQkluZm8tPlhHMjFfTFZEU0NhcExpc3RbbHZkc3RhYmxlaW5kZXhdLkxWRFNfQ2FwYWJpbGl0eSAmIChMQ0RQb2xhcml0eSA8PCA4KSkgPj4gOCk7CiAgICAgdGVtcCAmPSBMQ0RQb2xhcml0eTsKLSAgICBNaXNjZGF0YSA9KFVDSEFSKSBYR0lOZXdfR2V0UmVnMihwVkJJbmZvLT5QM2NjKSA7CisgICAgTWlzY2RhdGEgPSAodW5zaWduZWQgY2hhcikgWEdJTmV3X0dldFJlZzIocFZCSW5mby0+UDNjYyk7CiAKICAgICBYR0lOZXdfU2V0UmVnMyggcFZCSW5mby0+UDNjMiAsIChNaXNjZGF0YSAmIDB4M0YpIHwgdGVtcCApIDsKIAotICAgIHRlbXAgPSAoVUNIQVIpICggcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU19DYXBhYmlsaXR5ICYgTENEUG9sYXJpdHkgKSA7CisgICAgdGVtcCA9ICh1bnNpZ25lZCBjaGFyKSAocFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU19DYXBhYmlsaXR5ICYgTENEUG9sYXJpdHkpIDsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzYzQgLCAweDM1ICwgfjB4ODAgLCB0ZW1wJjB4ODAgKSA7ICAgICAgLyogU1IzNVs3XSBGUCBWU3luYyBwb2xhcml0eSAqLwogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UDNjNCAsIDB4MzAgLCB+MHgyMCAsICh0ZW1wJjB4NDApPj4xICkgOyAgIC8qIFNSMzBbNV0gRlAgSFN5bmMgcG9sYXJpdHkgKi8KIApAQCAtODc0NSw3ICs4NDIwLDcgQEAKIAogICAgIExWRFNWQkUgPSBMVkRTVkJTICsgTFZEU1ZUIC0gcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU1ZERSA7CiAKLSAgICB0ZW1wID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICkgOworICAgIHRlbXAgPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QM2Q0LCAweDExKSA7CiAgICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDExICwgdGVtcCAmIDB4N2YgKSA7CQkvKiBVbmxvY2sgQ1JUQyAqLwogCiAgICAgaWYgKCEoIG1vZGVmbGFnICYgQ2hhcng4RG90ICkpCkBAIC04ODUzLDIxICs4NTI4LDIxIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIEZ1bmN0aW9uIDogWEdJX0lzTENET04gKi8KIC8qIElucHV0IDogKi8KLS8qIE91dHB1dCA6IEZBTFNFIDogU2tpcCBQU0MgQ29udHJvbCAqLwotLyogVFJVRTogRGlzYWJsZSBQU0MgKi8KKy8qIE91dHB1dCA6IDAgOiBTa2lwIFBTQyBDb250cm9sICovCisvKiAxOiBEaXNhYmxlIFBTQyAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1CT09MRUFOIFhHSV9Jc0xDRE9OKFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordW5zaWduZWQgY2hhciBYR0lfSXNMQ0RPTihzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBheCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGF4IDsKIAogICAgIHRlbXBheCA9IHBWQkluZm8tPlZCSW5mbyA7CiAgICAgaWYgKCB0ZW1wYXggJiBTZXRDUlQyVG9EdWFsRWRnZSApCi0gICAgICAgIHJldHVybiBGQUxTRSA7CisJICAgIHJldHVybiAwOwogICAgIGVsc2UgaWYgKCB0ZW1wYXggJiAoIERpc2FibGVDUlQyRGlzcGxheSB8IFN3aXRjaFRvQ1JUMiB8IFNldFNpbXVTY2FuTW9kZSApICkKLSAgICAgICAgcmV0dXJuIFRSVUUgOworCSAgICByZXR1cm4gMTsKIAotICAgIHJldHVybiBGQUxTRSA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtODg3Nyw5ICs4NTUyLDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0VuYWJsZVBXRCggIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX0VuYWJsZVBXRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGluZGV4ICwKKyAgICB1bnNpZ25lZCBzaG9ydCBpbmRleCAsCiAgICAgICAgICAgIHRlbXAgOwogCiAgICAgaW5kZXggPSBYR0lfR2V0TENEQ2FwUHRyKHBWQkluZm8pIDsKQEAgLTg4OTksNyArODU3NCw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9EaXNhYmxlUFdEKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9EaXNhYmxlUFdEKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBYR0lOZXdfU2V0UmVnQU5EKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDI3ICwgMHg3RiApIDsJLyogZGlzYWJsZSBQV0QgKi8KIH0KQEAgLTg5MDgsMzAgKzg1ODMsMzAgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogRnVuY3Rpb24gOiBYR0lfRGlzYWJsZUNoSVNMQ0QgKi8KIC8qIElucHV0IDogKi8KLS8qIE91dHB1dCA6IEZBTFNFIC0+IE5vdCBMQ0QgTW9kZSAqLworLyogT3V0cHV0IDogMCAtPiBOb3QgTENEIE1vZGUgKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lfRGlzYWJsZUNoSVNMQ0QoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBjaGFyIFhHSV9EaXNhYmxlQ2hJU0xDRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBieCAsCisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4ICwKICAgICAgICAgICAgdGVtcGFoIDsKIAogICAgIHRlbXBieCA9IHBWQkluZm8tPlNldEZsYWcgJiAoIERpc2FibGVDaEEgfCBEaXNhYmxlQ2hCICkgOwotICAgIHRlbXBhaCA9IH4oICggVVNIT1JUIClYR0lOZXdfR2V0UmVnMSggcFZCSW5mby0+UGFydDFQb3J0ICAsIDB4MkUgKSApIDsKKyAgICB0ZW1wYWggPSB+KCh1bnNpZ25lZCBzaG9ydCkgWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UGFydDFQb3J0LCAweDJFKSk7CiAKICAgICBpZiAoIHRlbXBieCAmICggRW5hYmxlQ2hBIHwgRGlzYWJsZUNoQSApICkKICAgICB7CiAgICAgICAgIGlmICggISggdGVtcGFoICYgMHgwOCApICkJCS8qIENoayBMQ0RBIE1vZGUgKi8KLSAgICAgICAgICAgIHJldHVybiBGQUxTRSA7CisJCXJldHVybiAwIDsKICAgICB9CiAKICAgICBpZiAoICEoIHRlbXBieCAmICggRW5hYmxlQ2hCIHwgRGlzYWJsZUNoQiApICkgKQotICAgICAgICByZXR1cm4gRkFMU0UgOworCSAgICByZXR1cm4gMDsKIAogICAgIGlmICggdGVtcGFoICYgMHgwMSApICAgICAgIC8qIENoayBMQ0RCIE1vZGUgKi8KLSAgICAgICAgcmV0dXJuIFRSVUUgOworCSAgICByZXR1cm4gMTsKIAotICAgIHJldHVybiBGQUxTRSA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtODk0MSwyOCArODYxNiwyOCBAQAogLyogT3V0cHV0IDogMCAtPiBOb3QgTENEIG1vZGUgKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQk9PTEVBTiBYR0lfRW5hYmxlQ2hJU0xDRChQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIGNoYXIgWEdJX0VuYWJsZUNoSVNMQ0Qoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYnggLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXBieCAsCiAgICAgICAgICAgIHRlbXBhaCA7CiAKIAogICAgIHRlbXBieCA9IHBWQkluZm8tPlNldEZsYWcgJiAoIEVuYWJsZUNoQSB8IEVuYWJsZUNoQiApIDsKLSAgICB0ZW1wYWggPSB+KCAoIFVTSE9SVCApWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MkUgKSApIDsKKyAgICB0ZW1wYWggPSB+KCAodW5zaWduZWQgc2hvcnQpWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MkUgKSApIDsKIAogICAgIGlmICggdGVtcGJ4ICYgKCBFbmFibGVDaEEgfCBEaXNhYmxlQ2hBICkgKQogICAgIHsKICAgICAgICAgaWYgKCAhKCB0ZW1wYWggJiAweDA4ICkgKQkJLyogQ2hrIExDREEgTW9kZSAqLwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFIDsKKwkJcmV0dXJuIDA7CiAgICAgfQogCiAgICAgaWYgKCAhKCB0ZW1wYnggJiAoIEVuYWJsZUNoQiB8IERpc2FibGVDaEIgKSApICkKLSAgICAgICAgcmV0dXJuIEZBTFNFIDsKKwkgICAgcmV0dXJuIDA7CiAKICAgICBpZiAoIHRlbXBhaCAmIDB4MDEgKSAgICAgICAvKiBDaGsgTENEQiBNb2RlICovCi0gICAgICAgIHJldHVybiBUUlVFIDsKKwkgICAgcmV0dXJuIDE7CiAKLSAgICByZXR1cm4gRkFMU0UgOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTg5NzIsOSArODY0Nyw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VU0hPUlQgWEdJX0dldExDRENhcFB0ciggIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRMQ0RDYXBQdHIoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVDSEFSIHRlbXBhbCAsCisgICAgdW5zaWduZWQgY2hhciB0ZW1wYWwgLAogICAgICAgICAgIHRlbXBhaCAsCiAgICAgICAgICAgdGVtcGJsICwKICAgICAgICAgICBpIDsKQEAgLTkwMTEsOSArODY4Niw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VU0hPUlQgWEdJX0dldExDRENhcFB0cjEoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRMQ0RDYXBQdHIxKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGFoICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYWggLAogICAgICAgICAgICB0ZW1wYWwgLAogICAgICAgICAgICB0ZW1wYmwgLAogICAgICAgICAgICBpIDsKQEAgLTkwNTYsOSArODczMSwxMCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfR2V0TENEU3luYyggVVNIT1JUKiBIU3luY1dpZHRoICwgVVNIT1JUKiBWU3luY1dpZHRoLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9HZXRMQ0RTeW5jKHVuc2lnbmVkIHNob3J0ICpIU3luY1dpZHRoICwgdW5zaWduZWQgc2hvcnQgKlZTeW5jV2lkdGgsCisJCSAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIEluZGV4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBJbmRleCA7CiAKICAgICBJbmRleCA9IFhHSV9HZXRMQ0RDYXBQdHIocFZCSW5mbykgOwogICAgICpIU3luY1dpZHRoID0gcFZCSW5mby0+TENEQ2FwTGlzdFsgSW5kZXggXS5MQ0RfSFN5bmNXaWR0aCA7CkBAIC05MDc1LDkgKzg3NTEsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfRW5hYmxlQnJpZGdlKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uICwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9FbmFibGVCcmlkZ2Uoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJsICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYmwgLAogICAgICAgICAgICB0ZW1wYWggOwogCiAgICAgaWYgKCBwVkJJbmZvLT5TZXRGbGFnID09IFdpbjl4RE9TTW9kZSApCkBAIC05MTQ2LDcgKzg4MjIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoICggcFZCSW5mby0+U2V0RmxhZyAmIEVuYWJsZUNoQiApIHx8ICggcFZCSW5mby0+VkJJbmZvICYgKCBTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9UViB8IFNldENSVDJUb1JBTURBQyApICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBhaCA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgzMiApIDsKKwkJdGVtcGFoID0gKHVuc2lnbmVkIGNoYXIpWEdJTmV3X0dldFJlZzEocFZCSW5mby0+UDNjNCwgMHgzMik7CiAgICAgICAgICAgICAgICAgdGVtcGFoICY9IDB4REY7CiAgICAgICAgICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQkluZm8gJiBTZXRJblNsYXZlTW9kZSApCiAgICAgICAgICAgICAgICAgewpAQCAtOTE1Niw4ICs4ODMyLDcgQEAKICAgICAgICAgICAgICAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UDNjNCAsIDB4MzIgLCB0ZW1wYWggKSA7CiAgICAgICAgICAgICAgICAgWEdJTmV3X1NldFJlZ09SKCBwVkJJbmZvLT5QM2M0ICwgMHgxRSAsIDB4MjAgKSA7CiAKLQotICAgICAgICAgICAgICAgIHRlbXBhaCA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDJFICkgOworCQl0ZW1wYWggPSAodW5zaWduZWQgY2hhcilYR0lOZXdfR2V0UmVnMShwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MkUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCAhKCB0ZW1wYWggJiAweDgwICkgKQogICAgICAgICAgICAgICAgICAgICBYR0lOZXdfU2V0UmVnT1IoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MkUgLCAweDgwICkgOyAgIAkvKiBCVkJET0VOQUJMRSA9IDEgKi8KQEAgLTkyMzgsNyArODkxMyw3IEBACiAKIAogCi0gICAgICAgIHRlbXBhaCA9ICggVUNIQVIgKVhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDJFICkgOworCXRlbXBhaCA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcxKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyRSk7CiAgICAgICAgIGlmICggISggdGVtcGFoICYgMHg4MCApICkKICAgICAgICAgICAgIFhHSU5ld19TZXRSZWdPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgyRSAsIDB4ODAgKSA7CS8qIEJWQkRPRU5BQkxFID0gMSAqLwogCkBAIC05Mjg5LDkgKzg5NjQsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfRGlzYWJsZUJyaWRnZShQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX0Rpc2FibGVCcmlkZ2Uoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGF4ICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYXggLAogICAgICAgICAgICB0ZW1wYnggLAogICAgICAgICAgICB0ZW1wYWggPSAwICwKICAgICAgICAgICAgdGVtcGJsID0gMCA7CkBAIC05NDcwLDkgKzkxNDUsOSBAQAogLyogQSA6IEV4dDc1MHAgKi8KIC8qIEIgOiBTdDc1MHAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVVNIT1JUIFhHSV9HZXRUVlB0ckluZGV4KCAgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordW5zaWduZWQgc2hvcnQgWEdJX0dldFRWUHRySW5kZXgoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYnggPSAwIDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYnggPSAwIDsKIAogICAgIGlmICggcFZCSW5mby0+VFZJbmZvICYgU2V0UEFMVFYgKQogICAgICAgICB0ZW1wYnggPSAyIDsKQEAgLTk0OTcsNyArOTE3Miw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiBDdXN0b21pemVkIFBhcmFtLiBmb3IgMzAxICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX09FTTMxMFNldHRpbmcoIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfT0VNMzEwU2V0dGluZyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAgICAgaWYgKCBwVkJJbmZvLT5TZXRGbGFnICYgV2luOXhET1NNb2RlICkKICAgICAgICAgcmV0dXJuIDsKQEAgLTk1MjcsMTEgKzkyMDIsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldERlbGF5Q29tcCggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0RGVsYXlDb21wKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgaW5kZXggOworICAgIHVuc2lnbmVkIHNob3J0IGluZGV4IDsKIAotICAgIFVDSEFSICB0ZW1wYWggLAorICAgIHVuc2lnbmVkIGNoYXIgIHRlbXBhaCAsCiAgICAgICAgICAgIHRlbXBibCAsCiAgICAgICAgICAgIHRlbXBiaCA7CiAKQEAgLTk2MDUsOSArOTI4MCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRMQ0RDYXAoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX1NldExDRENhcChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBjeCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGN4IDsKIAogICAgIHRlbXBjeCA9IHBWQkluZm8tPkxDRENhcExpc3RbIFhHSV9HZXRMQ0RDYXBQdHIocFZCSW5mbykgXS5MQ0RfQ2FwYWJpbGl0eSA7CiAKQEAgLTk2MTYsMTAgKzkyOTEsMTIgQEAKICAgICAgICAgaWYgKCBwVkJJbmZvLT5WQlR5cGUgJiAoIFZCX1hHSTMwMUxWIHwgVkJfWEdJMzAyTFYgfCBWQl9YR0kzMDFDICkgKQogICAgICAgICB7ICAgICAgICAJCQkJLyogMzAxTFYvMzAyTFYgb25seSAqLwogICAgICAgICAgICAgLyogU2V0IDMwMUxWIENhcGFiaWxpdHkgKi8KLSAgICAgICAgICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDI0ICwgKCBVQ0hBUiApKCB0ZW1wY3ggJiAweDFGICkgKSA7CisJCVhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgyNCwgKHVuc2lnbmVkIGNoYXIpKHRlbXBjeCAmIDB4MUYpKTsKIAl9CiAgICAgICAgIC8qIFZCIERyaXZpbmcgKi8KLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QYXJ0NFBvcnQgLCAweDBEICwgfiggKCBFbmFibGVWQkNMS0RSVkxPVyB8IEVuYWJsZVBMTFNQTE9XICkgPj4gOCApICwgKCBVU0hPUlQgKSggKCB0ZW1wY3ggJiAoIEVuYWJsZVZCQ0xLRFJWTE9XIHwgRW5hYmxlUExMU1BMT1cgKSApID4+IDggKSApIDsKKwlYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UGFydDRQb3J0LCAweDBELAorCQkJICAgfigoRW5hYmxlVkJDTEtEUlZMT1cgfCBFbmFibGVQTExTUExPVykgPj4gOCksCisJCQkgICAodW5zaWduZWQgc2hvcnQpKCh0ZW1wY3ggJiAoRW5hYmxlVkJDTEtEUlZMT1cgfCBFbmFibGVQTExTUExPVykpID4+IDgpKTsKICAgICB9CiAKICAgICBpZiAoIHBWQkluZm8tPlZCVHlwZSAmICggVkJfWEdJMzAxQiB8IFZCX1hHSTMwMkIgfCBWQl9YR0kzMDFMViB8IFZCX1hHSTMwMkxWIHwgVkJfWEdJMzAxQyApICkKQEAgLTk2NDYsMzIgKzkzMjMsMzQgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldExDRENhcF9BKFVTSE9SVCB0ZW1wY3gsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRMQ0RDYXBfQSh1bnNpZ25lZCBzaG9ydCB0ZW1wY3gsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCA7CiAKICAgICB0ZW1wID0gWEdJTmV3X0dldFJlZzEoIHBWQkluZm8tPlAzZDQgLCAweDM3ICkgOwogCiAgICAgaWYgKCB0ZW1wICYgTENEUkdCMThCaXQgKQogICAgIHsKLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDE5ICwgMHgwRiAsICggVVNIT1JUICkoIDB4MjAgfCAoIHRlbXBjeCAmIDB4MDBDMCApICkgKSA7IC8qIEVuYWJsZSBEaXRoZXIgKi8KKwlYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UGFydDFQb3J0LCAweDE5LCAweDBGLAorCQkJICAgKHVuc2lnbmVkIHNob3J0KSgweDIwIHwgKHRlbXBjeCAmIDB4MDBDMCkpKTsgLyogRW5hYmxlIERpdGhlciAqLwogICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MUEgLCAweDdGICwgMHg4MCApIDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QYXJ0MVBvcnQgLCAweDE5ICwgMHgwRiAsICggVVNIT1JUICkoIDB4MzAgfCAoIHRlbXBjeCAmIDB4MDBDMCApICkgKSA7CisJWEdJTmV3X1NldFJlZ0FORE9SKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxOSwgMHgwRiwKKwkJCSAgICh1bnNpZ25lZCBzaG9ydCkoMHgzMCB8ICh0ZW1wY3ggJiAweDAwQzApKSk7CiAgICAgICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgxQSAsIDB4N0YgLCAweDAwICkgOwogICAgIH0KIAogLyoKICAgICBpZiAoIHRlbXBjeCAmIEVuYWJsZUxDRDI0YnBwICkJLy8gMjRiaXRzCiAgICAgewotICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UGFydDFQb3J0LDB4MTksIDB4MEYsKFVTSE9SVCkoMHgzMHwodGVtcGN4JjB4MDBDMCkpICk7CisJWEdJTmV3X1NldFJlZ0FORE9SKHBWQkluZm8tPlBhcnQxUG9ydCwweDE5LCAweDBGLCh1bnNpZ25lZCBzaG9ydCkoMHgzMHwodGVtcGN4JjB4MDBDMCkpICk7CiAgICAgICAgIFhHSU5ld19TZXRSZWdBTkRPUihwVkJJbmZvLT5QYXJ0MVBvcnQsMHgxQSwweDdGLDB4MDApOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UGFydDFQb3J0LDB4MTksIDB4MEYsKFVTSE9SVCkoMHgyMHwodGVtcGN4JjB4MDBDMCkpICk7Ly9FbmFibGUgRGl0aGVyCisJWEdJTmV3X1NldFJlZ0FORE9SKHBWQkluZm8tPlBhcnQxUG9ydCwweDE5LCAweDBGLCh1bnNpZ25lZCBzaG9ydCkoMHgyMHwodGVtcGN4JjB4MDBDMCkpICk7IC8vIEVuYWJsZSBEaXRoZXIKICAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKHBWQkluZm8tPlBhcnQxUG9ydCwweDFBLDB4N0YsMHg4MCk7CiAgICAgfQogKi8KQEAgLTk2ODQsMTIgKzkzNjMsMTQgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldExDRENhcF9CKFVTSE9SVCB0ZW1wY3gsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9TZXRMQ0RDYXBfQih1bnNpZ25lZCBzaG9ydCB0ZW1wY3gsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBpZiAoIHRlbXBjeCAmIEVuYWJsZUxDRDI0YnBwICkJLyogMjRiaXRzICovCi0gICAgICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgxQSAsIDB4RTAgLCAoIFVTSE9SVCApKCAoICggdGVtcGN4ICYgMHgwMGZmICkgPj4gNiApIHwgMHgwYyApICkgOworCSAgICBYR0lOZXdfU2V0UmVnQU5ET1IocFZCSW5mby0+UGFydDJQb3J0LCAweDFBLCAweEUwLAorCQkJICAgICAgICh1bnNpZ25lZCBzaG9ydCkoKCh0ZW1wY3ggJiAweDAwZmYpID4+IDYpIHwgMHgwYykpOwogICAgIGVsc2UKLSAgICAgICAgWEdJTmV3X1NldFJlZ0FORE9SKCBwVkJJbmZvLT5QYXJ0MlBvcnQgLCAweDFBICwgMHhFMCAsICggVVNIT1JUICkoICggKCB0ZW1wY3ggJiAweDAwZmYgKSA+PiA2ICkgfCAweDE4ICkgKSA7IC8qIEVuYWJsZSBEaXRoZXIgKi8KKwkgICAgWEdJTmV3X1NldFJlZ0FORE9SKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgxQSwgMHhFMCwKKwkJCSAgICAgICAodW5zaWduZWQgc2hvcnQpKCgodGVtcGN4ICYgMHgwMGZmKSA+PiA2KSB8IDB4MTgpKTsgLyogRW5hYmxlIERpdGhlciAqLwogfQogCiAKQEAgLTk2OTksOSArOTM4MCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFNldFNwZWN0cnVtKCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFNldFNwZWN0cnVtKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgaW5kZXggOworICAgIHVuc2lnbmVkIHNob3J0IGluZGV4IDsKIAogICAgIGluZGV4ID0gWEdJX0dldExDRENhcFB0cihwVkJJbmZvKSA7CiAKQEAgLTk3MjUsMTIgKzk0MDYsMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6IFNldCBUViBDdXN0b21pemVkIFBhcmFtLiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRBbnRpRmxpY2tlciggVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0QW50aUZsaWNrZXIodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKKwkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4ICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYnggLAogICAgICAgICAgICBpbmRleCA7CiAKLSAgICBVQ0hBUiB0ZW1wYWggOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcGFoIDsKIAogICAgIGlmIChwVkJJbmZvLT5UVkluZm8gJiAoIFNldFlQYlByTW9kZTUyNXAgfCBTZXRZUGJQck1vZGU3NTBwICkgKQogICAgICAgICByZXR1cm4gOwpAQCAtOTc2MSwxMiArOTQ0MywxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfU2V0RWRnZUVuaGFuY2UoIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX1NldEVkZ2VFbmhhbmNlKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4ICwKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYnggLAogICAgICAgICAgICBpbmRleCA7CiAKLSAgICBVQ0hBUiB0ZW1wYWggOworICAgIHVuc2lnbmVkIGNoYXIgdGVtcGFoIDsKIAogCiAgICAgdGVtcGJ4ID0gWEdJX0dldFRWUHRySW5kZXgocFZCSW5mbyApIDsKQEAgLTk3OTUsMjIgKzk0NzcsMjYgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldFBoYXNlSW5jciggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfU2V0UGhhc2VJbmNyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYnggOwogCi0gICAgVUNIQVIgdGVtcGNsICwKKyAgICB1bnNpZ25lZCBjaGFyIHRlbXBjbCAsCiAgICAgICAgICAgdGVtcGNoIDsKIAotICAgIFVMT05HIHRlbXBEYXRhIDsKKyAgICB1bnNpZ25lZCBsb25nIHRlbXBEYXRhIDsKIAogICAgIFhHSV9HZXRUVlB0ckluZGV4MiggJnRlbXBieCAsICZ0ZW1wY2wgLCAmdGVtcGNoLCBwVkJJbmZvICkgOyAvKiBieCwgY2wsIGNoICovCiAgICAgdGVtcERhdGEgPSBUVlBoYXNlTGlzdFsgdGVtcGJ4IF0gOwogCi0gICAgWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQyUG9ydCAsIDB4MzEgLCAoIFVTSE9SVCApKCB0ZW1wRGF0YSAmIDB4MDAwMDAwRkYgKSApIDsKLSAgICBYR0lOZXdfU2V0UmVnMSggcFZCSW5mby0+UGFydDJQb3J0ICwgMHgzMiAsICggVVNIT1JUICkoICggdGVtcERhdGEgJiAweDAwMDBGRjAwICkgPj4gOCApICkgOwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MlBvcnQgLCAweDMzICwgKCBVU0hPUlQgKSggKCB0ZW1wRGF0YSAmIDB4MDBGRjAwMDAgKSA+PiAxNiApICkgOwotICAgIFhHSU5ld19TZXRSZWcxKCBwVkJJbmZvLT5QYXJ0MlBvcnQgLCAweDM0ICwgKCBVU0hPUlQgKSggKCB0ZW1wRGF0YSAmIDB4RkYwMDAwMDAgKSA+PiAyNCApICkgOworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgzMSwKKwkJICAgKHVuc2lnbmVkIHNob3J0KSh0ZW1wRGF0YSAmIDB4MDAwMDAwRkYpKTsKKyAgICBYR0lOZXdfU2V0UmVnMShwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MzIsCisJCSAgICh1bnNpZ25lZCBzaG9ydCkoKHRlbXBEYXRhICYgMHgwMDAwRkYwMCkgPj4gOCkpOworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgzMywKKwkJICAgKHVuc2lnbmVkIHNob3J0KSgodGVtcERhdGEgJiAweDAwRkYwMDAwKSA+PiAxNikpOworICAgIFhHSU5ld19TZXRSZWcxKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgzNCwKKwkJICAgKHVuc2lnbmVkIHNob3J0KSgodGVtcERhdGEgJiAweEZGMDAwMDAwKSA+PiAyNCkpOwogfQogCiAKQEAgLTk4MjAsMTIgKzk1MDYsMTMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX1NldFlGaWx0ZXIoIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKQordm9pZCBYR0lfU2V0WUZpbHRlcih1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYnggLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXBieCAsCiAgICAgICAgICAgIGluZGV4IDsKIAotICAgIFVDSEFSIHRlbXBjbCAsCisgICAgdW5zaWduZWQgY2hhciB0ZW1wY2wgLAogICAgICAgICAgIHRlbXBjaCAsCiAgICAgICAgICAgdGVtcGFsICwKICAgICAgICAgICAqZmlsdGVyUHRyIDsKQEAgLTk5MjQsNyArOTYxMSw4IEBACiAvKiAxIDogMzAxQi8zMDJCLzMwMUxWLzMwMkxWICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJX0dldFRWUHRySW5kZXgyKFVTSE9SVCogdGVtcGJ4LFVDSEFSKiB0ZW1wY2wsVUNIQVIqIHRlbXBjaCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9HZXRUVlB0ckluZGV4Mih1bnNpZ25lZCBzaG9ydCAqdGVtcGJ4LCB1bnNpZ25lZCBjaGFyICp0ZW1wY2wsCisJCQl1bnNpZ25lZCBjaGFyICp0ZW1wY2gsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICAqdGVtcGJ4ID0gMCA7CiAgICAgKnRlbXBjbCA9IDAgOwpAQCAtOTk2NiwxMiArOTY1NCwxNCBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogT3JpZ2luIGNvZGUgZm9yIGNydDJncm91cCAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9TZXRDUlQyTW9kZVJlZ3MoVVNIT1JUIE1vZGVObyxQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJX1NldENSVDJNb2RlUmVncyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCisJCQkgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCisJCQkgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYmwgOwotICAgIFNIT1JUICB0ZW1wY2wgOworICAgIHVuc2lnbmVkIHNob3J0IHRlbXBibCA7CisgICAgc2hvcnQgIHRlbXBjbCA7CiAKLSAgICBVQ0hBUiAgdGVtcGFoIDsKKyAgICB1bnNpZ25lZCBjaGFyICB0ZW1wYWggOwogCiAgICAgLyogWEdJTmV3X1NldFJlZzEoIHBWQkluZm8tPlBhcnQxUG9ydCAsIDB4MDMgLCAweDAwICkgOyAvLyBmaXggd3JpdGUgcGFydDEgaW5kZXggMCBCVERSQU0gYml0IEJ1ZyAqLwogICAgIHRlbXBhaD0wOwpAQCAtMTAxOTUsOSArOTg4NSw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9DbG9zZUNSVEMoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX0Nsb3NlQ1JUQyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYnggOworICAgIHVuc2lnbmVkIHNob3J0IHRlbXBieCA7CiAKICAgICB0ZW1wYnggPSAwIDsKIApAQCAtMTAyMTQsOSArOTkwNCw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9PcGVuQ1JUQyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfT3BlbkNSVEMoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgdGVtcGJ4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wYnggOwogCiAgICAgdGVtcGJ4ID0gMCA7CiAKQEAgLTEwMjMwLDkgKzk5MjAsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfR2V0UkFNREFDMkRBVEEoVVNIT1JUIE1vZGVObyAsIFVTSE9SVCBNb2RlSWRJbmRleCAsIFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3ZvaWQgWEdJX0dldFJBTURBQzJEQVRBKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCB0ZW1wYXggLAorICAgIHVuc2lnbmVkIHNob3J0IHRlbXBheCAsCiAgICAgICAgICAgIHRlbXBieCAsCiAgICAgICAgICAgIHRlbXAxICwKICAgICAgICAgICAgdGVtcDIgLApAQCAtMTAyNTcsMTUgKzk5NDcsMTUgQEAKICAgICAgICAgbW9kZWZsYWcgPSBwVkJJbmZvLT5FTW9kZUlEVGFibGVbIE1vZGVJZEluZGV4IF0uRXh0X01vZGVGbGFnIDsKICAgICAgICAgQ1JUMUluZGV4ID0gcFZCSW5mby0+UmVmSW5kZXhbIFJlZnJlc2hSYXRlVGFibGVJbmRleCBdLkV4dF9DUlQxQ1JUQyA7CiAgICAgICAgIENSVDFJbmRleCAmPSBJbmRleE1hc2sgOwotICAgICAgICB0ZW1wMSA9ICggVVNIT1JUIClwVkJJbmZvLT5YR0lORVdVQl9DUlQxVGFibGVbIENSVDFJbmRleCBdLkNSWyAwIF0gOwotICAgICAgICB0ZW1wMiA9ICggVVNIT1JUIClwVkJJbmZvLT5YR0lORVdVQl9DUlQxVGFibGVbIENSVDFJbmRleCBdLkNSWyA1IF0gOworCXRlbXAxID0gKHVuc2lnbmVkIHNob3J0KXBWQkluZm8tPlhHSU5FV1VCX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzBdOworCXRlbXAyID0gKHVuc2lnbmVkIHNob3J0KXBWQkluZm8tPlhHSU5FV1VCX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzVdOwogCXRlbXBheCA9ICggdGVtcDEgJiAweEZGICkgfCAoICggdGVtcDIgJiAweDAzICkgPDwgOCApIDsKLSAgICAgICAgdGVtcGJ4ID0gKCBVU0hPUlQgKXBWQkluZm8tPlhHSU5FV1VCX0NSVDFUYWJsZVsgQ1JUMUluZGV4IF0uQ1JbIDggXSA7Ci0gICAgICAgIHRlbXBjeCA9ICggVVNIT1JUIClwVkJJbmZvLT5YR0lORVdVQl9DUlQxVGFibGVbIENSVDFJbmRleCBdLkNSWyAxNCBdIDw8IDggOworCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydClwVkJJbmZvLT5YR0lORVdVQl9DUlQxVGFibGVbQ1JUMUluZGV4XS5DUls4XTsKKwl0ZW1wY3ggPSAodW5zaWduZWQgc2hvcnQpcFZCSW5mby0+WEdJTkVXVUJfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbMTRdIDw8IDg7CiAJdGVtcGN4ICY9IDB4MDEwMCA7CiAJdGVtcGN4ID0gdGVtcGN4IDw8IDIgOwogCXRlbXBieCB8PSB0ZW1wY3g7Ci0gICAgICAgIHRlbXAxID0gKCBVU0hPUlQgKXBWQkluZm8tPlhHSU5FV1VCX0NSVDFUYWJsZVsgQ1JUMUluZGV4IF0uQ1JbIDkgXSA7CisJdGVtcDEgPSAodW5zaWduZWQgc2hvcnQpcFZCSW5mby0+WEdJTkVXVUJfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbOV07CiAgICAgfQogCiAgICAgaWYgKCB0ZW1wMSAmIDB4MDEgKQpAQCAtMTAyOTUsMTEgKzk5ODUsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVTSE9SVCBYR0lfR2V0Q29sb3JEZXB0aChVU0hPUlQgTW9kZU5vICwgVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRDb2xvckRlcHRoKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgQ29sb3JEZXB0aFsgNiBdID0geyAxICwgMiAsIDQgLCA0ICwgNiAsIDggfSA7Ci0gICAgU0hPUlQgIGluZGV4IDsKLSAgICBVU0hPUlQgbW9kZWZsYWcgOworICAgIHVuc2lnbmVkIHNob3J0IENvbG9yRGVwdGhbIDYgXSA9IHsgMSAsIDIgLCA0ICwgNCAsIDYgLCA4IH0gOworICAgIHNob3J0IGluZGV4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZyA7CiAKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICB7CkBAIC0xMDMyNiw3ICsxMDAxNiw3IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSV9VbkxvY2tDUlQyKCBQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCAgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfVW5Mb2NrQ1JUMihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgyZiAsIDB4RkYgLCAweDAxICkgOwpAQCAtMTAzNDAsNyArMTAwMzAsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfTG9ja0NSVDIoIFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sICBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApCit2b2lkIFhHSV9Mb2NrQ1JUMihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAogICAgIFhHSU5ld19TZXRSZWdBTkRPUiggcFZCSW5mby0+UGFydDFQb3J0ICwgMHgyRiAsIDB4RkUgLCAweDAwICkgOwpAQCAtMTAzNTUsNyArMTAwNDUsNyBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfRW5hYmxlQ1JUMiggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSU5ld19FbmFibGVDUlQyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKICAgICBYR0lOZXdfU2V0UmVnQU5ET1IoIHBWQkluZm8tPlAzYzQgLCAweDFFICwgMHhGRiAsIDB4MjAgKSA7CiB9CkBAIC0xMDM2OCwxMiArMTAwNTgsMTIgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X0xDRF9XYWl0X1RpbWUoVUNIQVIgRGVsYXlUaW1lLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbykKK3ZvaWQgWEdJTmV3X0xDRF9XYWl0X1RpbWUodW5zaWduZWQgY2hhciBEZWxheVRpbWUsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLSAgICBVU0hPUlQgaSAsCisgICAgdW5zaWduZWQgc2hvcnQgaSAsCiAgICAgICAgICAgIGogOwogCi0gICAgVUxPTkcgdGVtcCAsCisgICAgdW5zaWduZWQgbG9uZyB0ZW1wICwKICAgICAgICAgICBmbGFnIDsKIAogICAgIGZsYWcgPSAwIDsKQEAgLTEwNDA1LDkgKzEwMDk1LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLUJPT0xFQU4gWEdJX0JyaWRnZUlzT24oIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIGNoYXIgWEdJX0JyaWRnZUlzT24oc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVTSE9SVCBmbGFnIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBmbGFnIDsKIAogICAgIGlmICggcFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMSApCiAgICAgewpAQCAtMTA0MzEsOSArMTAxMjEsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfTG9uZ1dhaXQoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit2b2lkIFhHSV9Mb25nV2FpdChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIGkgOworICAgIHVuc2lnbmVkIHNob3J0IGkgOwogCiAgICAgaSA9IFhHSU5ld19HZXRSZWcxKCBwVkJJbmZvLT5QM2M0ICwgMHgxRiApIDsKIApAQCAtMTA0NjAsOSArMTAxNTAsOSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lfVkJMb25nV2FpdCggUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKQordm9pZCBYR0lfVkJMb25nV2FpdChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBhbCAsCisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGFsICwKICAgICAgICAgICAgdGVtcCAsCiAgICAgICAgICAgIGkgLAogICAgICAgICAgICBqIDsKQEAgLTEwNTE5LDE2ICsxMDIwOSwxNiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVVNIT1JUIFhHSV9HZXRWR0FIVDIoIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvICkKK3Vuc2lnbmVkIHNob3J0IFhHSV9HZXRWR0FIVDIoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotICAgIFVMT05HIHRlbXBheCAsCisgICAgdW5zaWduZWQgbG9uZyB0ZW1wYXggLAogICAgICAgICAgIHRlbXBieCA7CiAKICAgICB0ZW1wYnggPSAoICggcFZCSW5mby0+VkdBVlQgLSBwVkJJbmZvLT5WR0FWREUgKSAqIHBWQkluZm8tPlJWQkhDTUFYICkgJiAweEZGRkYgOwogICAgIHRlbXBheCA9ICggcFZCSW5mby0+VlQgLSBwVkJJbmZvLT5WREUgKSAqIHBWQkluZm8tPlJWQkhDRkFDVCA7CiAgICAgdGVtcGF4ID0gKCB0ZW1wYXggKiBwVkJJbmZvLT5IVCApIC90ZW1wYnggOwogCi0gICAgcmV0dXJuKCAoIFVTSE9SVCApdGVtcGF4ICkgOworICAgIHJldHVybiggKHVuc2lnbmVkIHNob3J0KXRlbXBheCApIDsKIH0KIAogCkBAIC0xMDUzOCwxOSArMTAyMjgsMjMgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVTSE9SVCBYR0lfR2V0VkNMSzJQdHIoIFVTSE9SVCBNb2RlTm8gLCBVU0hPUlQgTW9kZUlkSW5kZXggLCBVU0hPUlQgUmVmcmVzaFJhdGVUYWJsZUluZGV4ICwgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pCit1bnNpZ25lZCBzaG9ydCBYR0lfR2V0VkNMSzJQdHIodW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwKKwkJCSAgICAgICBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKKwkJCSAgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0gICAgVVNIT1JUIHRlbXBieCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcGJ4IDsKIAotICAgIFVTSE9SVCBMQ0RYbGF0MVZDTEtbIDQgXSA9IHsgVkNMSzY1ICsgMiAsIFZDTEs2NSArIDIgLCBWQ0xLNjUgKyAyICwgVkNMSzY1ICsgMiB9IDsKLSAgICBVU0hPUlQgTENEWGxhdDJWQ0xLWyA0IF0gPSB7IFZDTEsxMDhfMiArIDUgLCBWQ0xLMTA4XzIgKyA1ICwgVkNMSzEwOF8yICsgNSAsIFZDTEsxMDhfMiArIDUgfSA7Ci0gICAgVVNIT1JUIExWRFNYbGF0MVZDTEtbIDQgXSA9IHsgVkNMSzQwICwgVkNMSzQwICwgVkNMSzQwICwgVkNMSzQwIH0gOwotICAgIFVTSE9SVCBMVkRTWGxhdDJWQ0xLWyA0IF0gPSB7IFZDTEs2NSArIDIgLCBWQ0xLNjUgKyAyICwgVkNMSzY1ICsgMiAsIFZDTEs2NSArIDIgfSA7Ci0gICAgVVNIT1JUIExWRFNYbGF0M1ZDTEtbIDQgXSA9IHsgVkNMSzY1ICsgMiAsIFZDTEs2NSArIDIgLCBWQ0xLNjUgKyAyICwgVkNMSzY1ICsgMiB9IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBMQ0RYbGF0MVZDTEtbIDQgXSA9IHsgVkNMSzY1ICsgMiAsIFZDTEs2NSArIDIgLCBWQ0xLNjUgKyAyICwgVkNMSzY1ICsgMiB9IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBMQ0RYbGF0MlZDTEtbIDQgXSA9IHsgVkNMSzEwOF8yICsgNSAsIFZDTEsxMDhfMiArIDUgLCBWQ0xLMTA4XzIgKyA1ICwgVkNMSzEwOF8yICsgNSB9IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBMVkRTWGxhdDFWQ0xLWyA0IF0gPSB7IFZDTEs0MCAsIFZDTEs0MCAsIFZDTEs0MCAsIFZDTEs0MCB9IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBMVkRTWGxhdDJWQ0xLWyA0IF0gPSB7IFZDTEs2NSArIDIgLCBWQ0xLNjUgKyAyICwgVkNMSzY1ICsgMiAsIFZDTEs2NSArIDIgfSA7CisgICAgdW5zaWduZWQgc2hvcnQgTFZEU1hsYXQzVkNMS1sgNCBdID0geyBWQ0xLNjUgKyAyICwgVkNMSzY1ICsgMiAsIFZDTEs2NSArIDIgLCBWQ0xLNjUgKyAyIH0gOwogCi0gICAgVVNIT1JUIENSVDJJbmRleCAsIFZDTEtJbmRleCA7Ci0gICAgVVNIT1JUIG1vZGVmbGFnICwgcmVzaW5mbyA7Ci0gICAgVUNIQVIgKkNIVFZWQ0xLUHRyID0gTlVMTCA7CisgICAgdW5zaWduZWQgc2hvcnQgQ1JUMkluZGV4ICwgVkNMS0luZGV4IDsKKyAgICB1bnNpZ25lZCBzaG9ydCBtb2RlZmxhZyAsIHJlc2luZm8gOworICAgIHVuc2lnbmVkIGNoYXIgKkNIVFZWQ0xLUHRyID0gTlVMTCA7CiAKICAgICBpZiAoIE1vZGVObyA8PSAweDEzICkKICAgICB7CkBAIC0xMDY2NSw3ICsxMDM1OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CS8qIGZvciBDUlQyICovCi0gICAgICAgICAgICAgICAgVkNMS0luZGV4ID0gKCBVQ0hBUiApWEdJTmV3X0dldFJlZzIoICggcFZCSW5mby0+UDNjYSArIDB4MDIgKSApIDsJLyogUG9ydCAzY2NoICovCisJCVZDTEtJbmRleCA9ICh1bnNpZ25lZCBjaGFyKVhHSU5ld19HZXRSZWcyKChwVkJJbmZvLT5QM2NhICsgMHgwMikpOwkvKiBQb3J0IDNjY2ggKi8KIAkJVkNMS0luZGV4ID0gKCAoIFZDTEtJbmRleCA+PiAyICkgJiAweDAzICkgOwogICAgICAgICAgICAgICAgIGlmICggTW9kZU5vID4gMHgxMyApCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmgKaW5kZXggMDk3NTNkNy4uMGRjYzI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5oCkBAIC0xLDQwICsxLDQyIEBACiAjaWZuZGVmICBfVkJTRVRNT0RFXwogI2RlZmluZSAgX1ZCU0VUTU9ERV8KIAotZXh0ZXJuICAgdm9pZCAgICAgSW5pdFRvMzMwUG9pbnRlcihVQ0hBUixQVkJfREVWSUNFX0lORk8pOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1VuTG9ja0NSVDIoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfTG9ja0NSVDIoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfTG9uZ1dhaXQoIFBWQl9ERVZJQ0VfSU5GTyApOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1NldENSVDJNb2RlUmVncyhVU0hPUlQgTW9kZU5vLFBYR0lfSFdfREVWSUNFX0lORk8sICBQVkJfREVWSUNFX0lORk8gICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfRGlzYWJsZUJyaWRnZShQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gKTsKLWV4dGVybiAgIHZvaWQgIAkgIFhHSV9FbmFibGVCcmlkZ2UoUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfRGlzcGxheU9mZiggUFhHSV9IV19ERVZJQ0VfSU5GTywgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfRGlzcGxheU9uKCBQWEdJX0hXX0RFVklDRV9JTkZPLCBQVkJfREVWSUNFX0lORk8gKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSV9HZXRWQlR5cGUoUFZCX0RFVklDRV9JTkZPKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSV9TZW5zZUNSVDEoUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfR2V0VkdBVHlwZShQWEdJX0hXX0RFVklDRV9JTkZPIEh3RGV2aWNlRXh0ZW5zaW9uLCBQVkJfREVWSUNFX0lORk8gKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSV9HZXRWQkluZm8oVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfR2V0VFZJbmZvKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSV9TZXRDUlQxT2Zmc2V0KFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFVTSE9SVCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfU2V0TENEQUdyb3VwKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LFBYR0lfSFdfREVWSUNFX0lORk8gSHdEZXZpY2VFeHRlbnNpb24sIFBWQl9ERVZJQ0VfSU5GTyApOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1dhaXREaXNwbHkoIFBWQl9ERVZJQ0VfSU5GTyApOwotZXh0ZXJuICAgVVNIT1JUICAgWEdJX0dldFJlc0luZm8oVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKK2V4dGVybiAgIHZvaWQgICAgIEluaXRUbzMzMFBvaW50ZXIodW5zaWduZWQgY2hhciwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX1VuTG9ja0NSVDIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9Mb2NrQ1JUMihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX0xvbmdXYWl0KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9TZXRDUlQyTW9kZVJlZ3ModW5zaWduZWQgc2hvcnQgTW9kZU5vLAorCQkJCSAgICAgIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwKKwkJCQkgICAgICBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CitleHRlcm4gICB2b2lkICAgICBYR0lfRGlzYWJsZUJyaWRnZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX0VuYWJsZUJyaWRnZShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX0Rpc3BsYXlPZmYoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CitleHRlcm4gICB2b2lkICAgICBYR0lfRGlzcGxheU9uKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX0dldFZCVHlwZShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CitleHRlcm4gICB2b2lkICAgICBYR0lfU2Vuc2VDUlQxKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9HZXRWR0FUeXBlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CitleHRlcm4gICB2b2lkICAgICBYR0lfR2V0VkJJbmZvKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKik7CitleHRlcm4gICB2b2lkICAgICBYR0lfR2V0VFZJbmZvKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9TZXRDUlQxT2Zmc2V0KHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9TZXRMQ0RBR3JvdXAodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9XYWl0RGlzcGx5KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHVuc2lnbmVkIHNob3J0ICAgWEdJX0dldFJlc0luZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKIAotZXh0ZXJuICAgQk9PTEVBTiAgWEdJU2V0TW9kZU5ldyggUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiAsIFVTSE9SVCBNb2RlTm8gKSA7CitleHRlcm4gICB1bnNpZ25lZCBjaGFyICBYR0lTZXRNb2RlTmV3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLCB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pIDsKIAotZXh0ZXJuICAgQk9PTEVBTiAgWEdJX1NlYXJjaE1vZGVJRCggVVNIT1JUIE1vZGVObyxVU0hPUlQgICpNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPICk7Ci1leHRlcm4gICBCT09MRUFOICBYR0lfR2V0TENESW5mbyhVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCxQVkJfREVWSUNFX0lORk8gKTsKLWV4dGVybiAgIEJPT0xFQU4gIFhHSV9CcmlkZ2VJc09uKCBQVkJfREVWSUNFX0lORk8gKTsKLWV4dGVybiAgIEJPT0xFQU4gIFhHSV9TZXRDUlQyR3JvdXAzMDEoVVNIT1JUIE1vZGVObywgUFhHSV9IV19ERVZJQ0VfSU5GTyBId0RldmljZUV4dGVuc2lvbiwgUFZCX0RFVklDRV9JTkZPKTsKLWV4dGVybiAgIFVTSE9SVCAgIFhHSV9HZXRSYXRlUHRyQ1JUMiggUFhHSV9IV19ERVZJQ0VfSU5GTyBwWEdJSFdERSwgVVNIT1JUIE1vZGVObyxVU0hPUlQgTW9kZUlkSW5kZXgsIFBWQl9ERVZJQ0VfSU5GTyApOworZXh0ZXJuICAgdW5zaWduZWQgY2hhciAgWEdJX1NlYXJjaE1vZGVJRCh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sIHVuc2lnbmVkIHNob3J0ICAqTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHVuc2lnbmVkIGNoYXIgIFhHSV9HZXRMQ0RJbmZvKHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHVuc2lnbmVkIGNoYXIgIFhHSV9CcmlkZ2VJc09uKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKK2V4dGVybiAgIHVuc2lnbmVkIGNoYXIgIFhHSV9TZXRDUlQyR3JvdXAzMDEodW5zaWduZWQgc2hvcnQgTW9kZU5vLCBzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwgc3RydWN0IHZiX2RldmljZV9pbmZvICopOworZXh0ZXJuICAgdW5zaWduZWQgc2hvcnQgICBYR0lfR2V0UmF0ZVB0ckNSVDIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsIHVuc2lnbmVkIHNob3J0IE1vZGVObywgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqKTsKIAotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1NldFhHMjFGUEJpdHMoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1NldFhHMjdGUEJpdHMoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1hHMjFCTFNpZ25hbFZERChVU0hPUlQgdGVtcGJoLFVTSE9SVCB0ZW1wYmwsIFBWQl9ERVZJQ0VfSU5GTyBwVkJJbmZvKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSV9YRzI3QkxTaWduYWxWREQoVVNIT1JUIHRlbXBiaCxVU0hPUlQgdGVtcGJsLCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lfWEcyMVNldFBhbmVsRGVsYXkoVVNIT1JUIHRlbXBibCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOwotZXh0ZXJuICAgQk9PTEVBTiAgWEdJX1hHMjFDaGVja0xWRFNNb2RlKFVTSE9SVCBNb2RlTm8sVVNIT1JUIE1vZGVJZEluZGV4LCBQVkJfREVWSUNFX0lORk8gcFZCSW5mbyApOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJX1NldFhHMjFMVkRTUGFyYShVU0hPUlQgTW9kZU5vLFVTSE9SVCBNb2RlSWRJbmRleCwgUFZCX0RFVklDRV9JTkZPIHBWQkluZm8gKTsKLWV4dGVybiAgIFVTSE9SVCBYR0lfR2V0TFZEU09FTVRhYmxlSW5kZXgoUFZCX0RFVklDRV9JTkZPIHBWQkluZm8pOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX1NldFhHMjFGUEJpdHMoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9TZXRYRzI3RlBCaXRzKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CitleHRlcm4gICB2b2lkICAgICBYR0lfWEcyMUJMU2lnbmFsVkREKHVuc2lnbmVkIHNob3J0IHRlbXBiaCwgdW5zaWduZWQgc2hvcnQgdGVtcGJsLCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOworZXh0ZXJuICAgdm9pZCAgICAgWEdJX1hHMjdCTFNpZ25hbFZERCh1bnNpZ25lZCBzaG9ydCB0ZW1wYmgsIHVuc2lnbmVkIHNob3J0IHRlbXBibCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9YRzIxU2V0UGFuZWxEZWxheSh1bnNpZ25lZCBzaG9ydCB0ZW1wYmwsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CitleHRlcm4gICB1bnNpZ25lZCBjaGFyICBYR0lfWEcyMUNoZWNrTFZEU01vZGUodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSV9TZXRYRzIxTFZEU1BhcmEodW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKTsKK2V4dGVybiAgIHVuc2lnbmVkIHNob3J0IFhHSV9HZXRMVkRTT0VNVGFibGVJbmRleChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zdHJ1Y3QuaAppbmRleCBiYjI1YzBlLi45YzZlMGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc3RydWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3N0cnVjdC5oCkBAIC0xMCw1MjUgKzEwLDUxOCBAQAogCiAKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9QYW5lbERlbGF5VGJsU3RydWN0CitzdHJ1Y3QgWEdJX1BhbmVsRGVsYXlUYmxTdHJ1Y3QKIHsKLSBVQ0hBUiB0aW1lclsyXTsKLX0gWEdJX1BhbmVsRGVsYXlUYmxTdHJ1Y3Q7CisgdW5zaWduZWQgY2hhciB0aW1lclsyXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0lfTENERGF0YVN0cnVjdAorc3RydWN0IFhHSV9MQ0REYXRhU3RydWN0CiB7Ci0gVVNIT1JUIFJWQkhDTUFYOwotIFVTSE9SVCBSVkJIQ0ZBQ1Q7Ci0gVVNIT1JUIFZHQUhUOwotIFVTSE9SVCBWR0FWVDsKLSBVU0hPUlQgTENESFQ7Ci0gVVNIT1JUIExDRFZUOwotfSBYR0lfTENERGF0YVN0cnVjdDsKKyB1bnNpZ25lZCBzaG9ydCBSVkJIQ01BWDsKKyB1bnNpZ25lZCBzaG9ydCBSVkJIQ0ZBQ1Q7CisgdW5zaWduZWQgc2hvcnQgVkdBSFQ7CisgdW5zaWduZWQgc2hvcnQgVkdBVlQ7CisgdW5zaWduZWQgc2hvcnQgTENESFQ7CisgdW5zaWduZWQgc2hvcnQgTENEVlQ7Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9YR0lfTFZEU0NSVDFIRGF0YVN0cnVjdAorc3RydWN0IFhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0CiB7Ci0gVUNIQVIgUmVnWzhdOwotfSBYR0lfTFZEU0NSVDFIRGF0YVN0cnVjdDsKLXR5cGVkZWYgc3RydWN0IF9YR0lfTFZEU0NSVDFWRGF0YVN0cnVjdAorIHVuc2lnbmVkIGNoYXIgUmVnWzhdOworfTsKKworc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0CiB7Ci0gVUNIQVIgUmVnWzddOwotfSBYR0lfTFZEU0NSVDFWRGF0YVN0cnVjdDsKKyB1bnNpZ25lZCBjaGFyIFJlZ1s3XTsKK307CiAKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9UVkRhdGFTdHJ1Y3QKK3N0cnVjdCBYR0lfVFZEYXRhU3RydWN0CiB7Ci0gVVNIT1JUIFJWQkhDTUFYOwotIFVTSE9SVCBSVkJIQ0ZBQ1Q7Ci0gVVNIT1JUIFZHQUhUOwotIFVTSE9SVCBWR0FWVDsKLSBVU0hPUlQgVFZIREU7Ci0gVVNIT1JUIFRWVkRFOwotIFVTSE9SVCBSVkJIUlM7Ci0gVUNIQVIgRmxpY2tlck1vZGU7Ci0gVVNIT1JUIEhBTEZSVkJIUlM7Ci0gVUNIQVIgUlkxQ09FOwotIFVDSEFSIFJZMkNPRTsKLSBVQ0hBUiBSWTNDT0U7Ci0gVUNIQVIgUlk0Q09FOwotfSBYR0lfVFZEYXRhU3RydWN0OworIHVuc2lnbmVkIHNob3J0IFJWQkhDTUFYOworIHVuc2lnbmVkIHNob3J0IFJWQkhDRkFDVDsKKyB1bnNpZ25lZCBzaG9ydCBWR0FIVDsKKyB1bnNpZ25lZCBzaG9ydCBWR0FWVDsKKyB1bnNpZ25lZCBzaG9ydCBUVkhERTsKKyB1bnNpZ25lZCBzaG9ydCBUVlZERTsKKyB1bnNpZ25lZCBzaG9ydCBSVkJIUlM7CisgdW5zaWduZWQgY2hhciBGbGlja2VyTW9kZTsKKyB1bnNpZ25lZCBzaG9ydCBIQUxGUlZCSFJTOworIHVuc2lnbmVkIGNoYXIgUlkxQ09FOworIHVuc2lnbmVkIGNoYXIgUlkyQ09FOworIHVuc2lnbmVkIGNoYXIgUlkzQ09FOworIHVuc2lnbmVkIGNoYXIgUlk0Q09FOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9MVkRTRGF0YVN0cnVjdAorc3RydWN0IFhHSV9MVkRTRGF0YVN0cnVjdAogewotIFVTSE9SVCBWR0FIVDsKLSBVU0hPUlQgVkdBVlQ7Ci0gVVNIT1JUIExDREhUOwotIFVTSE9SVCBMQ0RWVDsKLX0gWEdJX0xWRFNEYXRhU3RydWN0OworIHVuc2lnbmVkIHNob3J0IFZHQUhUOworIHVuc2lnbmVkIHNob3J0IFZHQVZUOworIHVuc2lnbmVkIHNob3J0IExDREhUOworIHVuc2lnbmVkIHNob3J0IExDRFZUOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9MVkRTRGVzU3RydWN0CitzdHJ1Y3QgWEdJX0xWRFNEZXNTdHJ1Y3QKIHsKLSBVU0hPUlQgTENESERFUzsKLSBVU0hPUlQgTENEVkRFUzsKLX0gWEdJX0xWRFNEZXNTdHJ1Y3Q7CisgdW5zaWduZWQgc2hvcnQgTENESERFUzsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RWREVTOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9MVkRTQ1JUMURhdGFTdHJ1Y3QKK3N0cnVjdCBYR0lfTFZEU0NSVDFEYXRhU3RydWN0CiB7Ci0gVUNIQVIgQ1JbMTVdOwotfSBYR0lfTFZEU0NSVDFEYXRhU3RydWN0OworIHVuc2lnbmVkIGNoYXIgQ1JbMTVdOworfTsKIAogLyphZGQgZm9yIExDREEqLwogCi0KLXR5cGVkZWYgc3RydWN0IF9YR0lfU3RTdHJ1Y3QKK3N0cnVjdCBYR0lfU3RTdHJ1Y3QKIHsKLSBVQ0hBUiBTdF9Nb2RlSUQ7Ci0gVVNIT1JUIFN0X01vZGVGbGFnOwotIFVDSEFSIFN0X1N0VGFibGVJbmRleDsKLSBVQ0hBUiBTdF9DUlQyQ1JUQzsKLSBVQ0hBUiBTdF9DUlQyQ1JUQzI7Ci0gVUNIQVIgU3RfUmVzSW5mbzsKLSBVQ0hBUiBWQl9TdFRWRmxpY2tlckluZGV4OwotIFVDSEFSIFZCX1N0VFZFZGdlSW5kZXg7Ci0gVUNIQVIgVkJfU3RUVllGaWx0ZXJJbmRleDsKLX0gWEdJX1N0U3RydWN0OworIHVuc2lnbmVkIGNoYXIgU3RfTW9kZUlEOworIHVuc2lnbmVkIHNob3J0IFN0X01vZGVGbGFnOworIHVuc2lnbmVkIGNoYXIgU3RfU3RUYWJsZUluZGV4OworIHVuc2lnbmVkIGNoYXIgU3RfQ1JUMkNSVEM7CisgdW5zaWduZWQgY2hhciBTdF9DUlQyQ1JUQzI7CisgdW5zaWduZWQgY2hhciBTdF9SZXNJbmZvOworIHVuc2lnbmVkIGNoYXIgVkJfU3RUVkZsaWNrZXJJbmRleDsKKyB1bnNpZ25lZCBjaGFyIFZCX1N0VFZFZGdlSW5kZXg7CisgdW5zaWduZWQgY2hhciBWQl9TdFRWWUZpbHRlckluZGV4OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9TdGFuZFRhYmxlU3RydWN0CitzdHJ1Y3QgWEdJX1N0YW5kVGFibGVTdHJ1Y3QKIHsKLSBVQ0hBUiBDUlRfQ09MUzsKLSBVQ0hBUiBST1dTOwotIFVDSEFSIENIQVJfSEVJR0hUOwotIFVTSE9SVCBDUlRfTEVOOwotIFVDSEFSIFNSWzRdOwotIFVDSEFSIE1JU0M7Ci0gVUNIQVIgQ1JUQ1sweDE5XTsKLSBVQ0hBUiBBVFRSWzB4MTRdOwotIFVDSEFSIEdSQ1s5XTsKLX0gWEdJX1N0YW5kVGFibGVTdHJ1Y3Q7CisgdW5zaWduZWQgY2hhciBDUlRfQ09MUzsKKyB1bnNpZ25lZCBjaGFyIFJPV1M7CisgdW5zaWduZWQgY2hhciBDSEFSX0hFSUdIVDsKKyB1bnNpZ25lZCBzaG9ydCBDUlRfTEVOOworIHVuc2lnbmVkIGNoYXIgU1JbNF07CisgdW5zaWduZWQgY2hhciBNSVNDOworIHVuc2lnbmVkIGNoYXIgQ1JUQ1sweDE5XTsKKyB1bnNpZ25lZCBjaGFyIEFUVFJbMHgxNF07CisgdW5zaWduZWQgY2hhciBHUkNbOV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX0V4dFN0cnVjdAorc3RydWN0IFhHSV9FeHRTdHJ1Y3QKIHsKLSBVQ0hBUiBFeHRfTW9kZUlEOwotIFVTSE9SVCBFeHRfTW9kZUZsYWc7Ci0gVVNIT1JUIEV4dF9Nb2RlSW5mbzsKLSBVU0hPUlQgRXh0X1BvaW50OwotIFVTSE9SVCBFeHRfVkVTQUlEOwotIFVDSEFSIEV4dF9WRVNBTUVNU2l6ZTsKLSBVQ0hBUiBFeHRfUkVTSU5GTzsKLSBVQ0hBUiBWQl9FeHRUVkZsaWNrZXJJbmRleDsKLSBVQ0hBUiBWQl9FeHRUVkVkZ2VJbmRleDsKLSBVQ0hBUiBWQl9FeHRUVllGaWx0ZXJJbmRleDsKLSBVQ0hBUiBSRUZpbmRleDsKLX0gWEdJX0V4dFN0cnVjdDsKKyB1bnNpZ25lZCBjaGFyIEV4dF9Nb2RlSUQ7CisgdW5zaWduZWQgc2hvcnQgRXh0X01vZGVGbGFnOworIHVuc2lnbmVkIHNob3J0IEV4dF9Nb2RlSW5mbzsKKyB1bnNpZ25lZCBzaG9ydCBFeHRfUG9pbnQ7CisgdW5zaWduZWQgc2hvcnQgRXh0X1ZFU0FJRDsKKyB1bnNpZ25lZCBjaGFyIEV4dF9WRVNBTUVNU2l6ZTsKKyB1bnNpZ25lZCBjaGFyIEV4dF9SRVNJTkZPOworIHVuc2lnbmVkIGNoYXIgVkJfRXh0VFZGbGlja2VySW5kZXg7CisgdW5zaWduZWQgY2hhciBWQl9FeHRUVkVkZ2VJbmRleDsKKyB1bnNpZ25lZCBjaGFyIFZCX0V4dFRWWUZpbHRlckluZGV4OworIHVuc2lnbmVkIGNoYXIgUkVGaW5kZXg7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX0V4dDJTdHJ1Y3QKK3N0cnVjdCBYR0lfRXh0MlN0cnVjdAogewotIFVTSE9SVCBFeHRfSW5mb0ZsYWc7Ci0gVUNIQVIgRXh0X0NSVDFDUlRDOwotIFVDSEFSIEV4dF9DUlRWQ0xLOwotIFVDSEFSIEV4dF9DUlQyQ1JUQzsKLSBVQ0hBUiBFeHRfQ1JUMkNSVEMyOwotIFVDSEFSICBNb2RlSUQ7Ci0gVVNIT1JUIFhSZXM7Ci0gVVNIT1JUIFlSZXM7Ci0gLyogVVNIT1JUIFJPTV9PRkZTRVQ7ICovCi19IFhHSV9FeHQyU3RydWN0OworIHVuc2lnbmVkIHNob3J0IEV4dF9JbmZvRmxhZzsKKyB1bnNpZ25lZCBjaGFyIEV4dF9DUlQxQ1JUQzsKKyB1bnNpZ25lZCBjaGFyIEV4dF9DUlRWQ0xLOworIHVuc2lnbmVkIGNoYXIgRXh0X0NSVDJDUlRDOworIHVuc2lnbmVkIGNoYXIgRXh0X0NSVDJDUlRDMjsKKyB1bnNpZ25lZCBjaGFyICBNb2RlSUQ7CisgdW5zaWduZWQgc2hvcnQgWFJlczsKKyB1bnNpZ25lZCBzaG9ydCBZUmVzOworIC8qIHVuc2lnbmVkIHNob3J0IFJPTV9PRkZTRVQ7ICovCit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9YR0lfTUNMS0RhdGFTdHJ1Y3QKK3N0cnVjdCBYR0lfTUNMS0RhdGFTdHJ1Y3QKIHsKLSBVQ0hBUiBTUjI4LFNSMjksU1IyQTsKLSBVU0hPUlQgQ0xPQ0s7Ci19IFhHSV9NQ0xLRGF0YVN0cnVjdDsKKyB1bnNpZ25lZCBjaGFyIFNSMjgsIFNSMjksIFNSMkE7CisgdW5zaWduZWQgc2hvcnQgQ0xPQ0s7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX0VDTEtEYXRhU3RydWN0CitzdHJ1Y3QgWEdJX0VDTEtEYXRhU3RydWN0CiB7Ci0gVUNIQVIgU1IyRSxTUjJGLFNSMzA7Ci0gVVNIT1JUIENMT0NLOwotfSBYR0lfRUNMS0RhdGFTdHJ1Y3Q7CisgdW5zaWduZWQgY2hhciBTUjJFLCBTUjJGLCBTUjMwOworIHVuc2lnbmVkIHNob3J0IENMT0NLOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9WQ0xLRGF0YVN0cnVjdAorc3RydWN0IFhHSV9WQ0xLRGF0YVN0cnVjdAogewotIFVDSEFSIFNSMkIsU1IyQzsKLSBVU0hPUlQgQ0xPQ0s7Ci19IFhHSV9WQ0xLRGF0YVN0cnVjdDsKKyB1bnNpZ25lZCBjaGFyIFNSMkIsIFNSMkM7CisgdW5zaWduZWQgc2hvcnQgQ0xPQ0s7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX1ZCVkNMS0RhdGFTdHJ1Y3QKK3N0cnVjdCBYR0lfVkJWQ0xLRGF0YVN0cnVjdAogewotIFVDSEFSIFBhcnQ0X0EsUGFydDRfQjsKLSBVU0hPUlQgQ0xPQ0s7Ci19IFhHSV9WQlZDTEtEYXRhU3RydWN0OworIHVuc2lnbmVkIGNoYXIgUGFydDRfQSwgUGFydDRfQjsKKyB1bnNpZ25lZCBzaG9ydCBDTE9DSzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0lfU3RSZXNJbmZvU3RydWN0CitzdHJ1Y3QgWEdJX1N0UmVzSW5mb1N0cnVjdAogewotIFVTSE9SVCBIVG90YWw7Ci0gVVNIT1JUIFZUb3RhbDsKLX0gWEdJX1N0UmVzSW5mb1N0cnVjdDsKKyB1bnNpZ25lZCBzaG9ydCBIVG90YWw7CisgdW5zaWduZWQgc2hvcnQgVlRvdGFsOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9Nb2RlUmVzSW5mb1N0cnVjdAorc3RydWN0IFhHSV9Nb2RlUmVzSW5mb1N0cnVjdAogewotIFVTSE9SVCBIVG90YWw7Ci0gVVNIT1JUIFZUb3RhbDsKLSBVQ0hBUiAgWENoYXI7Ci0gVUNIQVIgIFlDaGFyOwotfSBYR0lfTW9kZVJlc0luZm9TdHJ1Y3Q7CisgdW5zaWduZWQgc2hvcnQgSFRvdGFsOworIHVuc2lnbmVkIHNob3J0IFZUb3RhbDsKKyB1bnNpZ25lZCBjaGFyICBYQ2hhcjsKKyB1bnNpZ25lZCBjaGFyICBZQ2hhcjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0lfTENETkJEZXNTdHJ1Y3QKK3N0cnVjdCBYR0lfTENETkJEZXNTdHJ1Y3QKIHsKLSAgVUNIQVIgTkJbMTJdOwotfSBYR0lfTENETkJEZXNTdHJ1Y3Q7CisgIHVuc2lnbmVkIGNoYXIgTkJbMTJdOworfTsKICAvKmFkZCBmb3IgbmV3IFVOSVZHQUJJT1MqLwotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9MQ0REZXNTdHJ1Y3QKK3N0cnVjdCBYR0lfTENERGVzU3RydWN0CiB7Ci0gVVNIT1JUIExDREhERVM7Ci0gVVNIT1JUIExDREhSUzsKLSBVU0hPUlQgTENEVkRFUzsKLSBVU0hPUlQgTENEVlJTOwotfSBYR0lfTENERGVzU3RydWN0OworIHVuc2lnbmVkIHNob3J0IExDREhERVM7CisgdW5zaWduZWQgc2hvcnQgTENESFJTOworIHVuc2lnbmVkIHNob3J0IExDRFZERVM7CisgdW5zaWduZWQgc2hvcnQgTENEVlJTOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9MQ0REYXRhVGFibFN0cnVjdAorc3RydWN0IFhHSV9MQ0REYXRhVGFibFN0cnVjdAogewotIFVDSEFSICBQQU5FTElEOwotIFVTSE9SVCBNQVNLOwotIFVTSE9SVCBDQVA7Ci0gVVNIT1JUIERBVEFQVFI7Ci19IFhHSV9MQ0REYXRhVGFibFN0cnVjdDsKKyB1bnNpZ25lZCBjaGFyICBQQU5FTElEOworIHVuc2lnbmVkIHNob3J0IE1BU0s7CisgdW5zaWduZWQgc2hvcnQgQ0FQOworIHVuc2lnbmVkIHNob3J0IERBVEFQVFI7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX1RWVGFibERhdGFTdHJ1Y3QKK3N0cnVjdCBYR0lfVFZUYWJsRGF0YVN0cnVjdAogewotIFVTSE9SVCBNQVNLOwotIFVTSE9SVCBDQVA7Ci0gVVNIT1JUIERBVEFQVFI7Ci19IFhHSV9UVkRhdGFUYWJsU3RydWN0OworIHVuc2lnbmVkIHNob3J0IE1BU0s7CisgdW5zaWduZWQgc2hvcnQgQ0FQOworIHVuc2lnbmVkIHNob3J0IERBVEFQVFI7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJMzMwX0xDRERlc0RhdGFTdHJ1Y3QKK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdAogewotIFVTSE9SVCBMQ0RIREVTOwotIFVTSE9SVCBMQ0RIUlM7Ci0gVVNIT1JUIExDRFZERVM7Ci0gVVNIT1JUIExDRFZSUzsKLX0gWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3Q7CisgdW5zaWduZWQgc2hvcnQgTENESERFUzsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RIUlM7CisgdW5zaWduZWQgc2hvcnQgTENEVkRFUzsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RWUlM7Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QKK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QKIHsKLSBVU0hPUlQgVkdBSFQ7Ci0gVVNIT1JUIFZHQVZUOwotIFVTSE9SVCBMQ0RIVDsKLSBVU0hPUlQgTENEVlQ7Ci19IFhHSTMzMF9MVkRTRGF0YVN0cnVjdDsKKyB1bnNpZ25lZCBzaG9ydCBWR0FIVDsKKyB1bnNpZ25lZCBzaG9ydCBWR0FWVDsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RIVDsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RWVDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0kzMzBfTENERGVzRGF0YVN0cnVjdDIKK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdDIKIHsKLSBVU0hPUlQgTENESERFUzsKLSBVU0hPUlQgTENESFJTOwotIFVTSE9SVCBMQ0RWREVTOwotIFVTSE9SVCBMQ0RWUlM7Ci0gVVNIT1JUIExDREhTeW5jOwotIFVTSE9SVCBMQ0RWU3luYzsKLX0gWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QyOworIHVuc2lnbmVkIHNob3J0IExDREhERVM7CisgdW5zaWduZWQgc2hvcnQgTENESFJTOworIHVuc2lnbmVkIHNob3J0IExDRFZERVM7CisgdW5zaWduZWQgc2hvcnQgTENEVlJTOworIHVuc2lnbmVkIHNob3J0IExDREhTeW5jOworIHVuc2lnbmVkIHNob3J0IExDRFZTeW5jOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSTMzMF9MQ0REYXRhU3RydWN0CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QKIHsKLSBVU0hPUlQgUlZCSENNQVg7Ci0gVVNIT1JUIFJWQkhDRkFDVDsKLSBVU0hPUlQgVkdBSFQ7Ci0gVVNIT1JUIFZHQVZUOwotIFVTSE9SVCBMQ0RIVDsKLSBVU0hPUlQgTENEVlQ7Ci19IFhHSTMzMF9MQ0REYXRhU3RydWN0OworIHVuc2lnbmVkIHNob3J0IFJWQkhDTUFYOworIHVuc2lnbmVkIHNob3J0IFJWQkhDRkFDVDsKKyB1bnNpZ25lZCBzaG9ydCBWR0FIVDsKKyB1bnNpZ25lZCBzaG9ydCBWR0FWVDsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RIVDsKKyB1bnNpZ25lZCBzaG9ydCBMQ0RWVDsKK307CiAKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSTMzMF9UVkRhdGFTdHJ1Y3QKK3N0cnVjdCBYR0kzMzBfVFZEYXRhU3RydWN0CiB7Ci0gVVNIT1JUIFJWQkhDTUFYOwotIFVTSE9SVCBSVkJIQ0ZBQ1Q7Ci0gVVNIT1JUIFZHQUhUOwotIFVTSE9SVCBWR0FWVDsKLSBVU0hPUlQgVFZIREU7Ci0gVVNIT1JUIFRWVkRFOwotIFVTSE9SVCBSVkJIUlM7Ci0gVUNIQVIgRmxpY2tlck1vZGU7Ci0gVVNIT1JUIEhBTEZSVkJIUlM7Ci19IFhHSTMzMF9UVkRhdGFTdHJ1Y3Q7CisgdW5zaWduZWQgc2hvcnQgUlZCSENNQVg7CisgdW5zaWduZWQgc2hvcnQgUlZCSENGQUNUOworIHVuc2lnbmVkIHNob3J0IFZHQUhUOworIHVuc2lnbmVkIHNob3J0IFZHQVZUOworIHVuc2lnbmVkIHNob3J0IFRWSERFOworIHVuc2lnbmVkIHNob3J0IFRWVkRFOworIHVuc2lnbmVkIHNob3J0IFJWQkhSUzsKKyB1bnNpZ25lZCBjaGFyIEZsaWNrZXJNb2RlOworIHVuc2lnbmVkIHNob3J0IEhBTEZSVkJIUlM7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0CiB7Ci0gVUNIQVIgIFBBTkVMSUQ7Ci0gVVNIT1JUIE1BU0s7Ci0gVVNIT1JUIENBUDsKLSBVU0hPUlQgREFUQVBUUjsKLX0gWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0OworIHVuc2lnbmVkIGNoYXIgIFBBTkVMSUQ7CisgdW5zaWduZWQgc2hvcnQgTUFTSzsKKyB1bnNpZ25lZCBzaG9ydCBDQVA7CisgdW5zaWduZWQgc2hvcnQgREFUQVBUUjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0kzMzBfVFZEYXRhVGFibFN0cnVjdAorc3RydWN0IFhHSTMzMF9UVkRhdGFUYWJsU3RydWN0CiB7Ci0gVVNIT1JUIE1BU0s7Ci0gVVNIT1JUIENBUDsKLSBVU0hPUlQgREFUQVBUUjsKLX0gWEdJMzMwX1RWRGF0YVRhYmxTdHJ1Y3Q7CisgdW5zaWduZWQgc2hvcnQgTUFTSzsKKyB1bnNpZ25lZCBzaG9ydCBDQVA7CisgdW5zaWduZWQgc2hvcnQgREFUQVBUUjsKK307CiAKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSTMzMF9DSFRWRGF0YVN0cnVjdAorc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdAogewotIFVTSE9SVCBWR0FIVDsKLSBVU0hPUlQgVkdBVlQ7Ci0gVVNIT1JUIExDREhUOwotIFVTSE9SVCBMQ0RWVDsKLX0gWEdJMzMwX0NIVFZEYXRhU3RydWN0OworIHVuc2lnbmVkIHNob3J0IFZHQUhUOworIHVuc2lnbmVkIHNob3J0IFZHQVZUOworIHVuc2lnbmVkIHNob3J0IExDREhUOworIHVuc2lnbmVkIHNob3J0IExDRFZUOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9UaW1pbmdIU3RydWN0CitzdHJ1Y3QgWEdJX1RpbWluZ0hTdHJ1Y3QKIHsKLSAgVUNIQVIgZGF0YVs4XTsKLX0gWEdJX1RpbWluZ0hTdHJ1Y3Q7CisgIHVuc2lnbmVkIGNoYXIgZGF0YVs4XTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0lfVGltaW5nVlN0cnVjdAorc3RydWN0IFhHSV9UaW1pbmdWU3RydWN0CiB7Ci0gIFVDSEFSIGRhdGFbN107Ci19IFhHSV9UaW1pbmdWU3RydWN0OworICB1bnNpZ25lZCBjaGFyIGRhdGFbN107Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX0NINzAwN1RWX1RpbWluZ0hTdHJ1Y3QKK3N0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nSFN0cnVjdAogewotICBVQ0hBUiBkYXRhWzEwXTsKLX0gWEdJX0NINzAwN1RWX1RpbWluZ0hTdHJ1Y3Q7CisgIHVuc2lnbmVkIGNoYXIgZGF0YVsxMF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX0NINzAwN1RWX1RpbWluZ1ZTdHJ1Y3QKK3N0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nVlN0cnVjdAogewotICBVQ0hBUiBkYXRhWzEwXTsKLX0gWEdJX0NINzAwN1RWX1RpbWluZ1ZTdHJ1Y3Q7CisgIHVuc2lnbmVkIGNoYXIgZGF0YVsxMF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfWEdJX1hHMjFDUlQxU3RydWN0CitzdHJ1Y3QgWEdJX1hHMjFDUlQxU3RydWN0CiB7Ci0gVUNIQVIgTW9kZUlELENSMDIsQ1IwMyxDUjE1LENSMTY7Ci19IFhHSV9YRzIxQ1JUMVN0cnVjdDsKKyB1bnNpZ25lZCBjaGFyIE1vZGVJRCwgQ1IwMiwgQ1IwMywgQ1IxNSwgQ1IxNjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QKK3N0cnVjdCBYR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QKIHsKLSBVQ0hBUiBSZWdbMTZdOwotfSBYR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3Q7CisgdW5zaWduZWQgY2hhciBSZWdbMTZdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSTMzMF9MQ0RDYXBTdHJ1Y3QKK3N0cnVjdCBYR0kzMzBfTENEQ2FwU3RydWN0CiB7Ci0gCQlVQ0hBUiAgICAgIExDRF9JRDsKLSAgICAgICAgICAgICAgICBVU0hPUlQgICAgIExDRF9DYXBhYmlsaXR5OwotICAgICAgICAgICAgICAgIFVDSEFSICAgICAgTENEX1NldEZsYWc7Ci0gICAgICAgICAgICAgICAgVUNIQVIgICAgICBMQ0RfRGVsYXlDb21wZW5zYXRpb247Ci0gICAgICAgICAgICAgICAgVUNIQVIgICAgICBMQ0RfSFN5bmNXaWR0aDsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIExDRF9WU3luY1dpZHRoOwotICAgICAgICAgICAgICAgIFVDSEFSICAgICAgTENEX1ZDTEs7Ci0gICAgICAgICAgICAgICAgVUNIQVIgICAgICBMQ0RBX1ZDTEtEYXRhMTsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIExDREFfVkNMS0RhdGEyOwotICAgICAgICAgICAgICAgIFVDSEFSICAgICAgTENVQ0hBUl9WQ0xLRGF0YTE7Ci0gICAgICAgICAgICAgICAgVUNIQVIgICAgICBMQ1VDSEFSX1ZDTEtEYXRhMjsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TMTsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TMjsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TMzsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TNDsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TNTsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBXRF8yQjsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBXRF8yQzsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBXRF8yRDsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBXRF8yRTsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBXRF8yRjsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFNwZWN0cnVtXzMxOwotICAgICAgICAgICAgICAgIFVDSEFSICAgICAgU3BlY3RydW1fMzI7Ci0gICAgICAgICAgICAgICAgVUNIQVIgICAgICBTcGVjdHJ1bV8zMzsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFNwZWN0cnVtXzM0OwotfSBYR0kzMzBfTENEQ2FwU3RydWN0OworCQl1bnNpZ25lZCBjaGFyCSAgIExDRF9JRDsKKwkJdW5zaWduZWQgc2hvcnQJICAgTENEX0NhcGFiaWxpdHk7CisJCXVuc2lnbmVkIGNoYXIJICAgTENEX1NldEZsYWc7CisJCXVuc2lnbmVkIGNoYXIJICAgTENEX0RlbGF5Q29tcGVuc2F0aW9uOworCQl1bnNpZ25lZCBjaGFyCSAgIExDRF9IU3luY1dpZHRoOworCQl1bnNpZ25lZCBjaGFyCSAgIExDRF9WU3luY1dpZHRoOworCQl1bnNpZ25lZCBjaGFyCSAgIExDRF9WQ0xLOworCQl1bnNpZ25lZCBjaGFyCSAgIExDREFfVkNMS0RhdGExOworCQl1bnNpZ25lZCBjaGFyCSAgIExDREFfVkNMS0RhdGEyOworCQl1bnNpZ25lZCBjaGFyCSAgIExDVUNIQVJfVkNMS0RhdGExOworCQl1bnNpZ25lZCBjaGFyCSAgIExDVUNIQVJfVkNMS0RhdGEyOworCQl1bnNpZ25lZCBjaGFyCSAgIFBTQ19TMTsKKwkJdW5zaWduZWQgY2hhcgkgICBQU0NfUzI7CisJCXVuc2lnbmVkIGNoYXIJICAgUFNDX1MzOworCQl1bnNpZ25lZCBjaGFyCSAgIFBTQ19TNDsKKwkJdW5zaWduZWQgY2hhcgkgICBQU0NfUzU7CisJCXVuc2lnbmVkIGNoYXIJICAgUFdEXzJCOworCQl1bnNpZ25lZCBjaGFyCSAgIFBXRF8yQzsKKwkJdW5zaWduZWQgY2hhcgkgICBQV0RfMkQ7CisJCXVuc2lnbmVkIGNoYXIJICAgUFdEXzJFOworCQl1bnNpZ25lZCBjaGFyCSAgIFBXRF8yRjsKKwkJdW5zaWduZWQgY2hhcgkgICBTcGVjdHJ1bV8zMTsKKwkJdW5zaWduZWQgY2hhcgkgICBTcGVjdHJ1bV8zMjsKKwkJdW5zaWduZWQgY2hhcgkgICBTcGVjdHJ1bV8zMzsKKwkJdW5zaWduZWQgY2hhcgkgICBTcGVjdHJ1bV8zNDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9YR0kyMV9MVkRTQ2FwU3RydWN0CitzdHJ1Y3QgWEdJMjFfTFZEU0NhcFN0cnVjdAogewotICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgTFZEU19DYXBhYmlsaXR5OwotICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgTFZEU0hUOwotICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgTFZEU1ZUOwotICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgTFZEU0hERTsKLSAgICAgICAgICAgICAgICBVU0hPUlQgICAgIExWRFNWREU7Ci0gICAgICAgICAgICAgICAgVVNIT1JUICAgICBMVkRTSEZQOwotICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgTFZEU1ZGUDsKLSAgICAgICAgICAgICAgICBVU0hPUlQgICAgIExWRFNIU1lOQzsKLSAgICAgICAgICAgICAgICBVU0hPUlQgICAgIExWRFNWU1lOQzsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFZDTEtEYXRhMTsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFZDTEtEYXRhMjsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TMTsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TMjsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TMzsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TNDsKLSAgICAgICAgICAgICAgICBVQ0hBUiAgICAgIFBTQ19TNTsKLX0gWEdJMjFfTFZEU0NhcFN0cnVjdDsKKwkJdW5zaWduZWQgc2hvcnQJICAgTFZEU19DYXBhYmlsaXR5OworCQl1bnNpZ25lZCBzaG9ydAkgICBMVkRTSFQ7CisJCXVuc2lnbmVkIHNob3J0CSAgIExWRFNWVDsKKwkJdW5zaWduZWQgc2hvcnQJICAgTFZEU0hERTsKKwkJdW5zaWduZWQgc2hvcnQJICAgTFZEU1ZERTsKKwkJdW5zaWduZWQgc2hvcnQJICAgTFZEU0hGUDsKKwkJdW5zaWduZWQgc2hvcnQJICAgTFZEU1ZGUDsKKwkJdW5zaWduZWQgc2hvcnQJICAgTFZEU0hTWU5DOworCQl1bnNpZ25lZCBzaG9ydAkgICBMVkRTVlNZTkM7CisJCXVuc2lnbmVkIGNoYXIJICAgVkNMS0RhdGExOworCQl1bnNpZ25lZCBjaGFyCSAgIFZDTEtEYXRhMjsKKwkJdW5zaWduZWQgY2hhcgkgICBQU0NfUzE7CisJCXVuc2lnbmVkIGNoYXIJICAgUFNDX1MyOworCQl1bnNpZ25lZCBjaGFyCSAgIFBTQ19TMzsKKwkJdW5zaWduZWQgY2hhcgkgICBQU0NfUzQ7CisJCXVuc2lnbmVkIGNoYXIJICAgUFNDX1M1OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9DUlQxVGFibGVTdHJ1Y3QKK3N0cnVjdCBYR0lfQ1JUMVRhYmxlU3RydWN0CiB7Ci0gIFVDSEFSIENSWzE2XTsKLX0gWEdJX0NSVDFUYWJsZVN0cnVjdDsKKyAgdW5zaWduZWQgY2hhciBDUlsxNl07Cit9OwogCiAKLXR5cGVkZWYgc3RydWN0IF9YR0kzMzBfVkNMS0RhdGFTdHJ1Y3QKK3N0cnVjdCBYR0kzMzBfVkNMS0RhdGFTdHJ1Y3QKIHsKLSAgICBVQ0hBUiBTUjJCLFNSMkM7Ci0gICAgVVNIT1JUIENMT0NLOwotfSBYR0kzMzBfVkNMS0RhdGFTdHJ1Y3Q7CisgICAgdW5zaWduZWQgY2hhciBTUjJCLCBTUjJDOworICAgIHVuc2lnbmVkIHNob3J0IENMT0NLOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdAorc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdAogewotICAgIFVTSE9SVCBERTsKLSAgICBVQ0hBUiAgUmVnWzY0XTsgICAvKiBDMC1GRiAqLwotfSBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3Q7CisgICAgdW5zaWduZWQgc2hvcnQgREU7CisgICAgdW5zaWduZWQgY2hhciAgUmVnWzY0XTsgICAvKiBDMC1GRiAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1hHSV9OZXdfU3RhbmRUYWJsZVN0cnVjdAorc3RydWN0IFhHSV9OZXdfU3RhbmRUYWJsZVN0cnVjdAogewotCVVDSEFSICBDUlRfQ09MUzsKLQlVQ0hBUiAgUk9XUzsKLQlVQ0hBUiAgQ0hBUl9IRUlHSFQ7Ci0JVVNIT1JUIENSVF9MRU47Ci0JVUNIQVIgIFNSWzRdOwotCVVDSEFSICBNSVNDOwotCVVDSEFSICBDUlRDWzB4MTldOwotCVVDSEFSICBBVFRSWzB4MTRdOwotCVVDSEFSICBHUkNbOV07Ci19IFhHSV9OZXdfU3RhbmRUYWJsZVN0cnVjdDsKKwl1bnNpZ25lZCBjaGFyICBDUlRfQ09MUzsKKwl1bnNpZ25lZCBjaGFyICBST1dTOworCXVuc2lnbmVkIGNoYXIgIENIQVJfSEVJR0hUOworCXVuc2lnbmVkIHNob3J0IENSVF9MRU47CisJdW5zaWduZWQgY2hhciAgU1JbNF07CisJdW5zaWduZWQgY2hhciAgTUlTQzsKKwl1bnNpZ25lZCBjaGFyICBDUlRDWzB4MTldOworCXVuc2lnbmVkIGNoYXIgIEFUVFJbMHgxNF07CisJdW5zaWduZWQgY2hhciAgR1JDWzldOworfTsKIAotdHlwZWRlZiBVQ0hBUiBEUkFNOFR5cGVbOF07Ci10eXBlZGVmIFVDSEFSIERSQU00VHlwZVs0XTsKLXR5cGVkZWYgVUNIQVIgRFJBTTMyVHlwZVszMl07Ci10eXBlZGVmIFVDSEFSIERSQU0yVHlwZVsyXTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1ZCX0RFVklDRV9JTkZPICBWQl9ERVZJQ0VfSU5GTzsKLXR5cGVkZWYgVkJfREVWSUNFX0lORk8gKglQVkJfREVWSUNFX0lORk87Ci0KLXN0cnVjdCBfVkJfREVWSUNFX0lORk8KK3N0cnVjdCB2Yl9kZXZpY2VfaW5mbwogewotICAgIEJPT0xFQU4gIElTWFBET1M7Ci0gICAgVUxPTkcgICBQM2M0LFAzZDQsUDNjMCxQM2NlLFAzYzIsUDNjYzsKLSAgICBVTE9ORyAgIFAzY2EsUDNjNixQM2M3LFAzYzgsUDNjOSxQM2RhOwotICAgIFVMT05HICAgUGFydDBQb3J0LFBhcnQxUG9ydCxQYXJ0MlBvcnQ7Ci0gICAgVUxPTkcgICBQYXJ0M1BvcnQsUGFydDRQb3J0LFBhcnQ1UG9ydDsKLSAgICBVU0hPUlQgICBSVkJIQ0ZBQ1QsUlZCSENNQVgsUlZCSFJTOwotICAgIFVTSE9SVCAgIFZHQVZULFZHQUhULFZHQVZERSxWR0FIREU7Ci0gICAgVVNIT1JUICAgVlQsSFQsVkRFLEhERTsKLSAgICBVU0hPUlQgICBMQ0RIUlMsTENEVlJTLExDREhERVMsTENEVkRFUzsKKyAgICB1bnNpZ25lZCBjaGFyICBJU1hQRE9TOworICAgIHVuc2lnbmVkIGxvbmcgICBQM2M0LFAzZDQsUDNjMCxQM2NlLFAzYzIsUDNjYzsKKyAgICB1bnNpZ25lZCBsb25nICAgUDNjYSxQM2M2LFAzYzcsUDNjOCxQM2M5LFAzZGE7CisgICAgdW5zaWduZWQgbG9uZyAgIFBhcnQwUG9ydCxQYXJ0MVBvcnQsUGFydDJQb3J0OworICAgIHVuc2lnbmVkIGxvbmcgICBQYXJ0M1BvcnQsUGFydDRQb3J0LFBhcnQ1UG9ydDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIFJWQkhDRkFDVCxSVkJIQ01BWCxSVkJIUlM7CisgICAgdW5zaWduZWQgc2hvcnQgICBWR0FWVCxWR0FIVCxWR0FWREUsVkdBSERFOworICAgIHVuc2lnbmVkIHNob3J0ICAgVlQsSFQsVkRFLEhERTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIExDREhSUyxMQ0RWUlMsTENESERFUyxMQ0RWREVTOwogCi0gICAgVVNIT1JUICAgTW9kZVR5cGU7Ci0gICAgVVNIT1JUICAgSUZfREVGX0xWRFMsSUZfREVGX1RSVU1QSU9OLElGX0RFRl9EU1ROOy8qICxJRl9ERUZfRlNUTjsgYWRkIGZvciBkc3RuICovCi0gICAgVVNIT1JUICAgSUZfREVGX0NSVDJNb25pdG9yLElGX0RFRl9WaWRlb0NhcHR1cmU7Ci0gICAgVVNIT1JUICAgSUZfREVGX0xDREEsSUZfREVGX0NINzAxNyxJRl9ERUZfWVBiUHIsSUZfREVGX1NjYWxlTENELElGX0RFRl9PRU1VdGlsLElGX0RFRl9QV0Q7Ci0gICAgVVNIT1JUICAgSUZfREVGX0V4cExpbms7Ci0gICAgVVNIT1JUICAgSUZfREVGX0NINzAwNSxJRl9ERUZfSGlWaXNpb247Ci0gICAgVVNIT1JUICAgSUZfREVGX0NINzAwNzsgLyogQmlsbHkgMjAwNy8wNS8wMyAqLwotICAgIFVTSE9SVCAgIExDRFJlc0luZm8sTENEVHlwZUluZm8sIFZCVHlwZTsvKjMwMWIqLwotICAgIFVTSE9SVCAgIFZCSW5mbyxUVkluZm8sTENESW5mbywgU2V0X1ZHQVR5cGU7Ci0gICAgVVNIT1JUICAgVkJFeHRJbmZvOy8qMzAxbHYqLwotICAgIFVTSE9SVCAgIFNldEZsYWc7Ci0gICAgVVNIT1JUICAgTmV3RmxpY2tlck1vZGU7Ci0gICAgVVNIT1JUICAgU2VsZWN0Q1JUMlJhdGU7CisgICAgdW5zaWduZWQgc2hvcnQgICBNb2RlVHlwZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIElGX0RFRl9MVkRTLElGX0RFRl9UUlVNUElPTixJRl9ERUZfRFNUTjsvKiAsSUZfREVGX0ZTVE47IGFkZCBmb3IgZHN0biAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0NSVDJNb25pdG9yLElGX0RFRl9WaWRlb0NhcHR1cmU7CisgICAgdW5zaWduZWQgc2hvcnQgICBJRl9ERUZfTENEQSxJRl9ERUZfQ0g3MDE3LElGX0RFRl9ZUGJQcixJRl9ERUZfU2NhbGVMQ0QsSUZfREVGX09FTVV0aWwsSUZfREVGX1BXRDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgIElGX0RFRl9FeHBMaW5rOworICAgIHVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0NINzAwNSxJRl9ERUZfSGlWaXNpb247CisgICAgdW5zaWduZWQgc2hvcnQgICBJRl9ERUZfQ0g3MDA3OyAvKiBCaWxseSAyMDA3LzA1LzAzICovCisgICAgdW5zaWduZWQgc2hvcnQgICBMQ0RSZXNJbmZvLExDRFR5cGVJbmZvLCBWQlR5cGU7LyozMDFiKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgIFZCSW5mbyxUVkluZm8sTENESW5mbywgU2V0X1ZHQVR5cGU7CisgICAgdW5zaWduZWQgc2hvcnQgICBWQkV4dEluZm87LyozMDFsdiovCisgICAgdW5zaWduZWQgc2hvcnQgICBTZXRGbGFnOworICAgIHVuc2lnbmVkIHNob3J0ICAgTmV3RmxpY2tlck1vZGU7CisgICAgdW5zaWduZWQgc2hvcnQgICBTZWxlY3RDUlQyUmF0ZTsKIAotICAgIFBVQ0hBUiBST01BZGRyOwotICAgIFBVQ0hBUiBGQkFkZHI7Ci0gICAgVUxPTkcgQmFzZUFkZHI7Ci0gICAgVUxPTkcgUmVsSU87CisgICAgdW5zaWduZWQgY2hhciAqUk9NQWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyICpGQkFkZHI7CisgICAgdW5zaWduZWQgbG9uZyBCYXNlQWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIFJlbElPOwogCi0gICAgRFJBTTRUeXBlICAqQ1I2QjsKLSAgICBEUkFNNFR5cGUgICpDUjZFOwotICAgIERSQU0zMlR5cGUgKkNSNkY7Ci0gICAgRFJBTTJUeXBlICAqQ1I4OTsKKwl1bnNpZ25lZCBjaGFyICgqQ1I2QilbNF07CisJdW5zaWduZWQgY2hhciAoKkNSNkUpWzRdOworCXVuc2lnbmVkIGNoYXIgKCpDUjZGKVszMl07CisJdW5zaWduZWQgY2hhciAoKkNSODkpWzJdOwogCi0gICAgRFJBTThUeXBlICAqU1IxNTsgLyogcG9pbnRlciA6IHBvaW50IHRvIGFycmF5ICovCi0gICAgRFJBTThUeXBlICAqQ1I0MDsKLSAgICBVQ0hBUiAgKnBTb2Z0U2V0dGluZzsKLSAgICBVQ0hBUiAgKnBPdXRwdXRTZWxlY3Q7CisJdW5zaWduZWQgY2hhciAoKlNSMTUpWzhdOworCXVuc2lnbmVkIGNoYXIgKCpDUjQwKVs4XTsKIAotICAgIFVTSE9SVCAqcFJHQlNlbnNlRGF0YTsKLSAgICBVU0hPUlQgKnBSR0JTZW5zZURhdGEyOyAvKjMwMWIqLwotICAgIFVTSE9SVCAqcFZpZGVvU2Vuc2VEYXRhOwotICAgIFVTSE9SVCAqcFZpZGVvU2Vuc2VEYXRhMjsKLSAgICBVU0hPUlQgKnBZQ1NlbnNlRGF0YTsKLSAgICBVU0hPUlQgKnBZQ1NlbnNlRGF0YTI7CisgICAgdW5zaWduZWQgY2hhciAgKnBTb2Z0U2V0dGluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAqcE91dHB1dFNlbGVjdDsKIAotICAgIFVDSEFSICAqcFNSMDc7Ci0gICAgVUNIQVIgICpDUjQ5OwotICAgIFVDSEFSICAqcFNSMUY7Ci0gICAgVUNIQVIgICpBR1BSZWc7Ci0gICAgVUNIQVIgICpTUjE2OwotICAgIFVDSEFSICAqcFNSMjE7Ci0gICAgVUNIQVIgICpwU1IyMjsKLSAgICBVQ0hBUiAgKnBTUjIzOwotICAgIFVDSEFSICAqcFNSMjQ7Ci0gICAgVUNIQVIgICpTUjI1OwotICAgIFVDSEFSICAqcFNSMzE7Ci0gICAgVUNIQVIgICpwU1IzMjsKLSAgICBVQ0hBUiAgKnBTUjMzOwotICAgIFVDSEFSICAqcFNSMzY7ICAgICAgLyogYWxhbiAxMi8wNy8yMDA2ICovCi0gICAgVUNIQVIgICpwQ1JDRjsKLSAgICBVQ0hBUiAgKnBDUkQwOyAgICAgIC8qIGFsYW4gMTIvMDcvMjAwNiAqLwotICAgIFVDSEFSICAqcENSREU7ICAgICAgLyogYWxhbiAxMi8wNy8yMDA2ICovCi0gICAgVUNIQVIgICpwQ1I4RjsgICAgICAvKiBhbGFuIDEyLzA3LzIwMDYgKi8KLSAgICBVQ0hBUiAgKnBTUjQwOyAgICAgIC8qIGFsYW4gMTIvMDcvMjAwNiAqLwotICAgIFVDSEFSICAqcFNSNDE7ICAgICAgLyogYWxhbiAxMi8wNy8yMDA2ICovCi0gICAgVUNIQVIgICpwRFZPU2V0dGluZzsKLSAgICBVQ0hBUiAgKnBDUjJFOwotICAgIFVDSEFSICAqcENSMkY7Ci0gICAgVUNIQVIgICpwQ1I0NjsKLSAgICBVQ0hBUiAgKnBDUjQ3OwotICAgIFVDSEFSICAqcENSVDJEYXRhXzFfMjsKLSAgICBVQ0hBUiAgKnBDUlQyRGF0YV80X0Q7Ci0gICAgVUNIQVIgICpwQ1JUMkRhdGFfNF9FOwotICAgIFVDSEFSICAqcENSVDJEYXRhXzRfMTA7Ci0gICAgWEdJX01DTEtEYXRhU3RydWN0ICAqTUNMS0RhdGE7Ci0gICAgWEdJX0VDTEtEYXRhU3RydWN0ICAqRUNMS0RhdGE7CisgICAgdW5zaWduZWQgc2hvcnQgKnBSR0JTZW5zZURhdGE7CisgICAgdW5zaWduZWQgc2hvcnQgKnBSR0JTZW5zZURhdGEyOyAvKjMwMWIqLworICAgIHVuc2lnbmVkIHNob3J0ICpwVmlkZW9TZW5zZURhdGE7CisgICAgdW5zaWduZWQgc2hvcnQgKnBWaWRlb1NlbnNlRGF0YTI7CisgICAgdW5zaWduZWQgc2hvcnQgKnBZQ1NlbnNlRGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCAqcFlDU2Vuc2VEYXRhMjsKIAotICAgIFVDSEFSICAgKlhHSV9UVkRlbGF5TGlzdDsKLSAgICBVQ0hBUiAgICpYR0lfVFZEZWxheUxpc3QyOwotICAgIFVDSEFSICAgKkNIVFZWQ0xLVU5UU0M7Ci0gICAgVUNIQVIgICAqQ0hUVlZDTEtPTlRTQzsKLSAgICBVQ0hBUiAgICpDSFRWVkNMS1VQQUw7Ci0gICAgVUNIQVIgICAqQ0hUVlZDTEtPUEFMOwotICAgIFVDSEFSICAgKk5UU0NUaW1pbmc7Ci0gICAgVUNIQVIgICAqUEFMVGltaW5nOwotICAgIFVDSEFSICAgKkhpVFZFeHRUaW1pbmc7Ci0gICAgVUNIQVIgICAqSGlUVlN0MVRpbWluZzsKLSAgICBVQ0hBUiAgICpIaVRWU3QyVGltaW5nOwotICAgIFVDSEFSICAgKkhpVFZUZXh0VGltaW5nOwotICAgIFVDSEFSICAgKllQYlByNzUwcFRpbWluZzsKLSAgICBVQ0hBUiAgICpZUGJQcjUyNXBUaW1pbmc7Ci0gICAgVUNIQVIgICAqWVBiUHI1MjVpVGltaW5nOwotICAgIFVDSEFSICAgKkhpVFZHcm91cDNEYXRhOwotICAgIFVDSEFSICAgKkhpVFZHcm91cDNTaW11OwotICAgIFVDSEFSICAgKkhpVFZHcm91cDNUZXh0OwotICAgIFVDSEFSICAgKlJlbjUyNXBHcm91cDM7Ci0gICAgVUNIQVIgICAqUmVuNzUwcEdyb3VwMzsKLSAgICBVQ0hBUiAgICpTY3JlZW5PZmZzZXQ7Ci0gICAgVUNIQVIgICAqcFhHSU5ld19EUkFNVHlwZURlZmluaXRpb247Ci0gICAgVUNIQVIgICAqcFhHSU5ld19JMkNEZWZpbml0aW9uIDsKLSAgICBVQ0hBUiAgICpwWEdJTmV3X0NSOTcgOworICAgIHVuc2lnbmVkIGNoYXIgICpwU1IwNzsKKyAgICB1bnNpZ25lZCBjaGFyICAqQ1I0OTsKKyAgICB1bnNpZ25lZCBjaGFyICAqcFNSMUY7CisgICAgdW5zaWduZWQgY2hhciAgKkFHUFJlZzsKKyAgICB1bnNpZ25lZCBjaGFyICAqU1IxNjsKKyAgICB1bnNpZ25lZCBjaGFyICAqcFNSMjE7CisgICAgdW5zaWduZWQgY2hhciAgKnBTUjIyOworICAgIHVuc2lnbmVkIGNoYXIgICpwU1IyMzsKKyAgICB1bnNpZ25lZCBjaGFyICAqcFNSMjQ7CisgICAgdW5zaWduZWQgY2hhciAgKlNSMjU7CisgICAgdW5zaWduZWQgY2hhciAgKnBTUjMxOworICAgIHVuc2lnbmVkIGNoYXIgICpwU1IzMjsKKyAgICB1bnNpZ25lZCBjaGFyICAqcFNSMzM7CisgICAgdW5zaWduZWQgY2hhciAgKnBTUjM2OyAgICAgIC8qIGFsYW4gMTIvMDcvMjAwNiAqLworICAgIHVuc2lnbmVkIGNoYXIgICpwQ1JDRjsKKyAgICB1bnNpZ25lZCBjaGFyICAqcENSRDA7ICAgICAgLyogYWxhbiAxMi8wNy8yMDA2ICovCisgICAgdW5zaWduZWQgY2hhciAgKnBDUkRFOyAgICAgIC8qIGFsYW4gMTIvMDcvMjAwNiAqLworICAgIHVuc2lnbmVkIGNoYXIgICpwQ1I4RjsgICAgICAvKiBhbGFuIDEyLzA3LzIwMDYgKi8KKyAgICB1bnNpZ25lZCBjaGFyICAqcFNSNDA7ICAgICAgLyogYWxhbiAxMi8wNy8yMDA2ICovCisgICAgdW5zaWduZWQgY2hhciAgKnBTUjQxOyAgICAgIC8qIGFsYW4gMTIvMDcvMjAwNiAqLworICAgIHVuc2lnbmVkIGNoYXIgICpwRFZPU2V0dGluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAqcENSMkU7CisgICAgdW5zaWduZWQgY2hhciAgKnBDUjJGOworICAgIHVuc2lnbmVkIGNoYXIgICpwQ1I0NjsKKyAgICB1bnNpZ25lZCBjaGFyICAqcENSNDc7CisgICAgdW5zaWduZWQgY2hhciAgKnBDUlQyRGF0YV8xXzI7CisgICAgdW5zaWduZWQgY2hhciAgKnBDUlQyRGF0YV80X0Q7CisgICAgdW5zaWduZWQgY2hhciAgKnBDUlQyRGF0YV80X0U7CisgICAgdW5zaWduZWQgY2hhciAgKnBDUlQyRGF0YV80XzEwOworICAgIHN0cnVjdCBYR0lfTUNMS0RhdGFTdHJ1Y3QgICpNQ0xLRGF0YTsKKyAgICBzdHJ1Y3QgWEdJX0VDTEtEYXRhU3RydWN0ICAqRUNMS0RhdGE7CiAKLSAgICBYR0kzMzBfTENEQ2FwU3RydWN0ICAqTENEQ2FwTGlzdDsKLSAgICBYR0kyMV9MVkRTQ2FwU3RydWN0ICAqWEcyMV9MVkRTQ2FwTGlzdDsKKyAgICB1bnNpZ25lZCBjaGFyICAgKlhHSV9UVkRlbGF5TGlzdDsKKyAgICB1bnNpZ25lZCBjaGFyICAgKlhHSV9UVkRlbGF5TGlzdDI7CisgICAgdW5zaWduZWQgY2hhciAgICpDSFRWVkNMS1VOVFNDOworICAgIHVuc2lnbmVkIGNoYXIgICAqQ0hUVlZDTEtPTlRTQzsKKyAgICB1bnNpZ25lZCBjaGFyICAgKkNIVFZWQ0xLVVBBTDsKKyAgICB1bnNpZ25lZCBjaGFyICAgKkNIVFZWQ0xLT1BBTDsKKyAgICB1bnNpZ25lZCBjaGFyICAgKk5UU0NUaW1pbmc7CisgICAgdW5zaWduZWQgY2hhciAgICpQQUxUaW1pbmc7CisgICAgdW5zaWduZWQgY2hhciAgICpIaVRWRXh0VGltaW5nOworICAgIHVuc2lnbmVkIGNoYXIgICAqSGlUVlN0MVRpbWluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAgKkhpVFZTdDJUaW1pbmc7CisgICAgdW5zaWduZWQgY2hhciAgICpIaVRWVGV4dFRpbWluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAgKllQYlByNzUwcFRpbWluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAgKllQYlByNTI1cFRpbWluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAgKllQYlByNTI1aVRpbWluZzsKKyAgICB1bnNpZ25lZCBjaGFyICAgKkhpVFZHcm91cDNEYXRhOworICAgIHVuc2lnbmVkIGNoYXIgICAqSGlUVkdyb3VwM1NpbXU7CisgICAgdW5zaWduZWQgY2hhciAgICpIaVRWR3JvdXAzVGV4dDsKKyAgICB1bnNpZ25lZCBjaGFyICAgKlJlbjUyNXBHcm91cDM7CisgICAgdW5zaWduZWQgY2hhciAgICpSZW43NTBwR3JvdXAzOworICAgIHVuc2lnbmVkIGNoYXIgICAqU2NyZWVuT2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgICAqcFhHSU5ld19EUkFNVHlwZURlZmluaXRpb247CisgICAgdW5zaWduZWQgY2hhciAgICpwWEdJTmV3X0kyQ0RlZmluaXRpb24gOworICAgIHVuc2lnbmVkIGNoYXIgICAqcFhHSU5ld19DUjk3IDsKIAotICAgIFhHSV9UaW1pbmdIU3RydWN0ICAqVGltaW5nSDsKLSAgICBYR0lfVGltaW5nVlN0cnVjdCAgKlRpbWluZ1Y7CisgICAgc3RydWN0IFhHSTMzMF9MQ0RDYXBTdHJ1Y3QgICpMQ0RDYXBMaXN0OworICAgIHN0cnVjdCBYR0kyMV9MVkRTQ2FwU3RydWN0ICAqWEcyMV9MVkRTQ2FwTGlzdDsKIAotICAgIFhHSV9TdFN0cnVjdCAgICAgICAgICAqU01vZGVJRFRhYmxlOwotICAgIFhHSV9TdGFuZFRhYmxlU3RydWN0ICAqU3RhbmRUYWJsZTsKLSAgICBYR0lfRXh0U3RydWN0ICAgICAgICAgKkVNb2RlSURUYWJsZTsKLSAgICBYR0lfRXh0MlN0cnVjdCAgICAgICAgKlJlZkluZGV4OworICAgIHN0cnVjdCBYR0lfVGltaW5nSFN0cnVjdCAgKlRpbWluZ0g7CisgICAgc3RydWN0IFhHSV9UaW1pbmdWU3RydWN0ICAqVGltaW5nVjsKKworICAgIHN0cnVjdCBYR0lfU3RTdHJ1Y3QgICAgICAgICAgKlNNb2RlSURUYWJsZTsKKyAgICBzdHJ1Y3QgWEdJX1N0YW5kVGFibGVTdHJ1Y3QgICpTdGFuZFRhYmxlOworICAgIHN0cnVjdCBYR0lfRXh0U3RydWN0ICAgICAgICAgKkVNb2RlSURUYWJsZTsKKyAgICBzdHJ1Y3QgWEdJX0V4dDJTdHJ1Y3QgICAgICAgICpSZWZJbmRleDsKICAgICAvKiBYR0lOZXdfQ1JUMVRhYmxlU3RydWN0ICpDUlQxVGFibGU7ICovCi0gICAgWEdJX0NSVDFUYWJsZVN0cnVjdCAgICAqWEdJTkVXVUJfQ1JUMVRhYmxlOwotICAgIFhHSV9WQ0xLRGF0YVN0cnVjdCAgICAqVkNMS0RhdGE7Ci0gICAgWEdJX1ZCVkNMS0RhdGFTdHJ1Y3QgICpWQlZDTEtEYXRhOwotICAgIFhHSV9TdFJlc0luZm9TdHJ1Y3QgICAqU3RSZXNJbmZvOwotICAgIFhHSV9Nb2RlUmVzSW5mb1N0cnVjdCAqTW9kZVJlc0luZm87Ci0gICAgWEdJX1hHMjFDUlQxU3RydWN0CSAgKlVwZGF0ZUNSVDE7Ci19OyAgLyogX1ZCX0RFVklDRV9JTkZPICovCisgICAgc3RydWN0IFhHSV9DUlQxVGFibGVTdHJ1Y3QgICAgKlhHSU5FV1VCX0NSVDFUYWJsZTsKKyAgICBzdHJ1Y3QgWEdJX1ZDTEtEYXRhU3RydWN0ICAgICpWQ0xLRGF0YTsKKyAgICBzdHJ1Y3QgWEdJX1ZCVkNMS0RhdGFTdHJ1Y3QgICpWQlZDTEtEYXRhOworICAgIHN0cnVjdCBYR0lfU3RSZXNJbmZvU3RydWN0ICAgKlN0UmVzSW5mbzsKKyAgICBzdHJ1Y3QgWEdJX01vZGVSZXNJbmZvU3RydWN0ICpNb2RlUmVzSW5mbzsKKyAgICBzdHJ1Y3QgWEdJX1hHMjFDUlQxU3RydWN0CSAgKlVwZGF0ZUNSVDE7Cit9OyAgLyogX3N0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqLwogCiAKLXR5cGVkZWYgc3RydWN0CitzdHJ1Y3QgVGltaW5nSW5mbwogewotICAgIFVTSE9SVCAgICBIb3Jpem9udGFsX0FDVElWRTsKLSAgICBVU0hPUlQgICAgSG9yaXpvbnRhbF9GUDsKLSAgICBVU0hPUlQgICAgSG9yaXpvbnRhbF9TWU5DOwotICAgIFVTSE9SVCAgICBIb3Jpem9udGFsX0JQOwotICAgIFVTSE9SVCAgICBWZXJ0aWNhbF9BQ1RJVkU7Ci0gICAgVVNIT1JUICAgIFZlcnRpY2FsX0ZQOwotICAgIFVTSE9SVCAgICBWZXJ0aWNhbF9TWU5DOwotICAgIFVTSE9SVCAgICBWZXJ0aWNhbF9CUDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBIb3Jpem9udGFsX0FDVElWRTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBIb3Jpem9udGFsX0ZQOworICAgIHVuc2lnbmVkIHNob3J0ICAgIEhvcml6b250YWxfU1lOQzsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBIb3Jpem9udGFsX0JQOworICAgIHVuc2lnbmVkIHNob3J0ICAgIFZlcnRpY2FsX0FDVElWRTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBWZXJ0aWNhbF9GUDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBWZXJ0aWNhbF9TWU5DOworICAgIHVuc2lnbmVkIHNob3J0ICAgIFZlcnRpY2FsX0JQOwogICAgIGRvdWJsZSAgICBEQ0xLOwotICAgIFVDSEFSICAgICBGcmFtZVJhdGU7Ci0gICAgVUNIQVIgICAgIEludGVybGFjZTsKLSAgICBVU0hPUlQgICAgTWFyZ2luOwotfSBUaW1pbmdJbmZvOworICAgIHVuc2lnbmVkIGNoYXIgICAgIEZyYW1lUmF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyICAgICBJbnRlcmxhY2U7CisgICAgdW5zaWduZWQgc2hvcnQgICAgTWFyZ2luOworfTsKIAogI2RlZmluZSBfVkJfU1RSVUNUXwogI2VuZGlmIC8qIF9WQl9TVFJVQ1RfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdGFibGUuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl90YWJsZS5oCmluZGV4IDc4MWNhZWYuLjUxMGVmNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl90YWJsZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl90YWJsZS5oCkBAIC0xLDcgKzEsNyBAQAogI2RlZmluZSAgVGFwNAogCiAKLVhHSV9NQ0xLRGF0YVN0cnVjdCBYR0kzMzBOZXdfTUNMS0RhdGFbXT0KK3N0cnVjdCBYR0lfTUNMS0RhdGFTdHJ1Y3QgWEdJMzMwTmV3X01DTEtEYXRhW10gPQogewogIHsgMHg1YywweDIzLDB4MDEsMTY2fSwKICB7IDB4NWMsMHgyMywweDAxLDE2Nn0sCkBAIC0xMyw3ICsxMyw3IEBACiAgeyAweDI5LDB4MDEsMHg4MSwzMDB9CiB9OwogLy95aWxpbiBtb2RpZnkgZm9yIHhnaTIwCi1YR0lfTUNMS0RhdGFTdHJ1Y3QgWEdJMzQwTmV3X01DTEtEYXRhW109CitzdHJ1Y3QgWEdJX01DTEtEYXRhU3RydWN0IFhHSTM0ME5ld19NQ0xLRGF0YVtdID0KIHsKICB7IDB4MTYsMHgwMSwweDAxLDE2Nn0sCiAgeyAweDE5LDB4MDIsMHgwMSwxMjR9LApAQCAtMjUsNyArMjUsNyBAQAogIHsgMHg1YywweDIzLDB4MDEsMTY2fQogfTsKIAotWEdJX01DTEtEYXRhU3RydWN0IFhHSTI3TmV3X01DTEtEYXRhW109CitzdHJ1Y3QgWEdJX01DTEtEYXRhU3RydWN0IFhHSTI3TmV3X01DTEtEYXRhW10gPQogewogIHsgMHg1YywweDIzLDB4MDEsMTY2fSwKICB7IDB4MTksMHgwMiwweDAxLDEyNH0sCkBAIC0zNyw3ICszNyw3IEBACiAgeyAweDVjLDB4MjMsMHgwMSwxNjZ9CiB9OwogCi1YR0lfRUNMS0RhdGFTdHJ1Y3QgWEdJMzMwX0VDTEtEYXRhW109CitzdHJ1Y3QgWEdJX0VDTEtEYXRhU3RydWN0IFhHSTMzMF9FQ0xLRGF0YVtdID0KIHsKICB7IDB4N2MsMHgwOCwweDAxLDIwMH0sCiAgeyAweDdjLDB4MDgsMHgwMSwyMDB9LApAQCAtNDksNyArNDksNyBAQAogIHsgMHgyOSwweDAxLDB4ODEsMzAwfQogfTsKIC8veWlsaW4gbW9kaWZ5IGZvciB4Z2kyMAotWEdJX0VDTEtEYXRhU3RydWN0IFhHSTM0MF9FQ0xLRGF0YVtdPQorc3RydWN0IFhHSV9FQ0xLRGF0YVN0cnVjdCBYR0kzNDBfRUNMS0RhdGFbXSA9CiB7CiAgeyAweDVjLDB4MjMsMHgwMSwxNjZ9LAogIHsgMHg1NSwweDg0LDB4MDEsMTIzfSwKQEAgLTYzLDE0ICs2MywxNCBAQAogCiAKIAotVUNIQVIgWEdJMzQwX1NSMTNbNF1bOF09ewordW5zaWduZWQgY2hhciBYR0kzNDBfU1IxM1s0XVs4XSA9IHsKIHsweDM1LDB4NDUsMHhiMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIFNSMTMgKi8KIHsweDQxLDB4NTEsMHg1YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIFNSMTQgKi8KIHsweDMxLDB4NDIsMHg0MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIFNSMTggKi8KIHsweDAzLDB4MDMsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LyogU1IxQiAqLwogfTsKIAotVUNIQVIgWEdJMzQwX2NyNDFbMjRdWzhdPQordW5zaWduZWQgY2hhciBYR0kzNDBfY3I0MVsyNF1bOF0gPQoge3sweDIwLDB4NTAsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIDAgQ1I0MSAqLwogezB4YzQsMHg0MCwweDg0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMSBDUjhBICovCiB7MHhjNCwweDQwLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwvKiAyIENSOEIgKi8KQEAgLTk4LDcgKzk4LDcgQEAKIH07CiAKIAotVUNIQVIgWEdJMjdfY3I0MVsyNF1bOF09Cit1bnNpZ25lZCBjaGFyIFhHSTI3X2NyNDFbMjRdWzhdID0KIHsKIHsweDIwLDB4NDAsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIDAgQ1I0MSAqLwogezB4QzQsMHg0MCwweDg0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMSBDUjhBICovCkBAIC0xMjYsMzcgKzEyNiw3IEBACiB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfS8qIDIzIENSQzUgKi8KIH07CiAKLQotI2lmIDAKLVVDSEFSIFhHSTI3X2NyNDFbMjRdWzhdPQotewotezB4MjAsMHg2MCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMCBDUjQxICovCi17MHgwNCwweDQ0LDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwvKiAxIENSOEEgKi8KLXsweDA0LDB4NDAsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIDIgQ1I4QiAqLwotezB4YjUsMHgwMywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMyBDUjQwWzddLENSOTlbMjowXSxDUjQ1WzM6MF0qLwotezB4ZjAsMHhmNSwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogNCBDUjU5ICovCi17MHhhNCwweDFDLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwvKiA1IENSNjggKi8KLXsweDc3LDB4NzcsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIDYgQ1I2OSAqLwotezB4NzcsMHg3NywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogNyBDUjZBICovCi17MHhmZiwweGZmLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwvKiA4IENSNkQgKi8KLXsweDU1LDB4NTUsMHg1NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LC8qIDkgQ1I4MCAqLwotezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTAgQ1I4MSAqLwotezB4NDgsMHhhOCwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTEgQ1I4MiAqLwotezB4NzcsMHg4OCwweDc3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTIgQ1I4NSAqLwotezB4ODgsMHg4OCwweDg4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTMgQ1I4NiAqLwotezB4NDQsMHgzMiwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTQgQ1I5MCAqLwotezB4NDQsMHgzMywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTUgQ1I5MSAqLwotezB4MDcsMHgwNywweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTYgQ1I5MiAqLwotezB4NDQsMHg2MywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTcgQ1I5MyAqLwotezB4MEEsMHgxNCwweDBBLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTggQ1I5NCAqLwotezB4MEMsMHgwQiwweDBDLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMTkgQ1I5NSAqLwotezB4MDUsMHgyMiwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMjAgQ1I5NiAqLwotezB4ZjAsMHhmMCwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMjEgQ1JDMyAqLwotezB4MDMsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sLyogMjIgQ1JDNCAqLwotezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0vKiAyMyBDUkM1ICovCi19OwotI2VuZGlmCi1VQ0hBUiBYR0kzNDBfQ1I2Qls4XVs0XT17Cit1bnNpZ25lZCBjaGFyIFhHSTM0MF9DUjZCWzhdWzRdID0gewogezB4YWEsMHhhYSwweGFhLDB4YWF9LAogezB4YWEsMHhhYSwweGFhLDB4YWF9LAogezB4YWEsMHhhYSwweGFhLDB4YWF9LApAQCAtMTY3LDcgKzEzNyw3IEBACiB7MHgwMCwweDAwLDB4MDAsMHgwMH0KIH07CiAKLVVDSEFSIFhHSTM0MF9DUjZFWzhdWzRdPXsKK3Vuc2lnbmVkIGNoYXIgWEdJMzQwX0NSNkVbOF1bNF0gPSB7CiB7MHgwMCwweDAwLDB4MDAsMHgwMH0sCiB7MHgwMCwweDAwLDB4MDAsMHgwMH0sCiB7MHgwMCwweDAwLDB4MDAsMHgwMH0sCkBAIC0xNzgsNyArMTQ4LDcgQEAKIHsweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotVUNIQVIgWEdJMzQwX0NSNkZbOF1bMzJdPXsKK3Vuc2lnbmVkIGNoYXIgWEdJMzQwX0NSNkZbOF1bMzJdID0gewogezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sCiB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKIHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LApAQCAtMTg5LDcgKzE1OSw3IEBACiB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfQogfTsKIAotVUNIQVIgWEdJMzQwX0NSODlbOF1bMl09ewordW5zaWduZWQgY2hhciBYR0kzNDBfQ1I4OVs4XVsyXSA9IHsKIHsweDAwLDB4MDB9LAogezB4MDAsMHgwMH0sCiB7MHgwMCwweDAwfSwKQEAgLTIwMCwxMSArMTcwLDEyIEBACiB7MHgwMCwweDAwfQogfTsKIAkJCSAvKiBDUjQ3LENSNDgsQ1I0OSxDUjRBLENSNEIsQ1I0QyxDUjcwLENSNzEsQ1I3NCxDUjc1LENSNzYsQ1I3NyAqLwotVUNIQVIgWEdJMzQwX0FHUFJlZ1sxMl09ezB4MjgsMHgyMywweDAwLDB4MjAsMHgwMCwweDIwLDB4MDAsMHgwNSwweGQwLDB4MTAsMHgxMCwweDAwfTsKK3Vuc2lnbmVkIGNoYXIgWEdJMzQwX0FHUFJlZ1sxMl0gPSB7MHgyOCwgMHgyMywgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMCwgMHgwMCwKKwkJCQkgICAweDA1LCAweGQwLCAweDEwLCAweDEwLCAweDAwfTsKIAotVUNIQVIgWEdJMzQwX1NSMTZbNF09ezB4MDMsMHg4MywweDAzLDB4ODN9OwordW5zaWduZWQgY2hhciBYR0kzNDBfU1IxNls0XSA9IHsweDAzLCAweDgzLCAweDAzLCAweDgzfTsKIAotVUNIQVIgWEdJMzMwX1NSMTVfMVs4XVs4XT17Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjE1XzFbOF1bOF0gPSB7CiB7MHgwLDB4MCwweDAwLDB4MDAsMHgyMCwweDIwLDB4MDAsMHgwMH0sCiB7MHg1LDB4MTUsMHgxNSwweDE1LDB4MTUsMHgxNSwweDAwLDB4MDB9LAogezB4YmEsMHhiYSwweGJhLDB4YmEsMHhCQSwweEJBLDB4MDAsMHgwMH0sCkBAIC0yMTUsNyArMTg2LDcgQEAKIHsweDAsMHhhNSwweGZiLDB4ZjYsMHhGNiwweEY2LDB4MDAsMHgwMH0KIH07CiAKLVVDSEFSIFhHSTMzMF9jcjQwXzFbMTVdWzhdPXsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX2NyNDBfMVsxNV1bOF0gPSB7CiB7MHg2NiwweDQwLDB4NDAsMHgyOCwweDI0LDB4MjQsMHgwMCwweDAwfSwKIHsweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAogezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sCkBAIC0yMzMsMTQgKzIwNCwxNCBAQAogezB4MDAsMHhBMiwweDAwLDB4MDAsMHhBMiwweEEyLDB4MDAsMHgwMH0sCiB9OwogCi1VQ0hBUiBYR0kzMzBfc3IyNVtdPXsweDAwLDB4MH07Ci1VQ0hBUiBYR0kzMzBfc3IzMT0weGMwOwotVUNIQVIgWEdJMzMwX3NyMzI9MHgxMTsKLVVDSEFSIFhHSTMzMF9TUjMzPTB4MDA7Ci1VQ0hBUiBYRzQwX0NSQ0Y9MHgxMzsKLVVDSEFSIFhHNDBfRFJBTVR5cGVEZWZpbml0aW9uPTB4RkYgOwordW5zaWduZWQgY2hhciBYR0kzMzBfc3IyNVtdID0gezB4MDAsIDB4MH07Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9zcjMxID0gMHhjMDsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX3NyMzIgPSAweDExOwordW5zaWduZWQgY2hhciBYR0kzMzBfU1IzMyA9IDB4MDA7Cit1bnNpZ25lZCBjaGFyIFhHNDBfQ1JDRiA9IDB4MTM7Cit1bnNpZ25lZCBjaGFyIFhHNDBfRFJBTVR5cGVEZWZpbml0aW9uID0gMHhGRiA7CiAKLVhHSV9TdFN0cnVjdCBYR0kzMzBfU01vZGVJRFRhYmxlW109CitzdHJ1Y3QgWEdJX1N0U3RydWN0IFhHSTMzMF9TTW9kZUlEVGFibGVbXSA9CiB7CiAgezB4MDEsMHg5MjA4LDB4MDEsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAxLDB4MDB9LAogIHsweDAxLDB4MTIxMCwweDE0LDB4MDEsMHgwMCwweDAxLDB4MDAsMHgwMSwweDAwfSwKQEAgLTI2NSw3ICsyMzYsNyBAQAogfTsKIAogCi1YR0lfRXh0U3RydWN0ICBYR0kzMzBfRU1vZGVJRFRhYmxlW109CitzdHJ1Y3QgWEdJX0V4dFN0cnVjdCAgWEdJMzMwX0VNb2RlSURUYWJsZVtdID0KIHsKICB7MHg2YSwweDIyMTIsMHgwNDA3LDB4M2E4MSwweDAxMDIsMHgwOCwweDA3LDB4MDAsMHgwMCwweDA3LDB4MGV9LAogIHsweDJlLDB4MGExYiwweDAzMDYsMHgzYTU3LDB4MDEwMSwweDA4LDB4MDYsMHgwMCwweDAwLDB4MDUsMHgwNn0sCkBAIC0zMzcsNyArMzA4LDcgQEAKICB7MHhmZiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9CiB9OwogCi1YR0lfU3RhbmRUYWJsZVN0cnVjdCBYR0kzMzBfU3RhbmRUYWJsZVtdPQorc3RydWN0IFhHSV9TdGFuZFRhYmxlU3RydWN0IFhHSTMzMF9TdGFuZFRhYmxlW10gPQogewogLyogTURfMF8yMDAgKi8KICB7CkBAIC03NzUsMTMgKzc0NiwxMyBAQAogIH0KIH07CiAKLVhHSV9UaW1pbmdIU3RydWN0IFhHSV9UaW1pbmdIW109CitzdHJ1Y3QgWEdJX1RpbWluZ0hTdHJ1Y3QgWEdJX1RpbWluZ0hbXSA9CiB7e3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9fX07CiAKLVhHSV9UaW1pbmdWU3RydWN0IFhHSV9UaW1pbmdWW109CitzdHJ1Y3QgWEdJX1RpbWluZ1ZTdHJ1Y3QgWEdJX1RpbWluZ1ZbXSA9CiB7e3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfX19OwogCi1YR0lfWEcyMUNSVDFTdHJ1Y3QgWEdJX1VwZGF0ZUNSVDFUYWJsZVtdPQorc3RydWN0IFhHSV9YRzIxQ1JUMVN0cnVjdCBYR0lfVXBkYXRlQ1JUMVRhYmxlW10gPQogewogIHsweDAxLDB4MjcsMHg5MSwweDhmLDB4YzB9LAkvKiAwMCAqLwogIHsweDAzLDB4NGYsMHg4MywweDhmLDB4YzB9LAkvKiAwMSAqLwpAQCAtODAyLDcgKzc3Myw3IEBACiAgezB4NTksMHgyNywweDkxLDB4OGYsMHhjMH0JLyogMTYgKi8KIH07CiAKLVhHSV9DUlQxVGFibGVTdHJ1Y3QgWEdJX0NSVDFUYWJsZVtdPQorc3RydWN0IFhHSV9DUlQxVGFibGVTdHJ1Y3QgWEdJX0NSVDFUYWJsZVtdID0KIHsKICB7ezB4MmQsMHgyOCwweDkwLDB4MmMsMHg5MCwweDAwLDB4MDQsMHgwMCwKICAgICAweGJmLDB4MWYsMHg5YywweDhlLDB4OTYsMHhiOSwweDMwfX0sIC8qIDB4MCAqLwpAQCAtOTUwLDcgKzkyMSw3IEBACiAgICAgMHgwMywweERFLDB4QzAsMHg4NCwweEJGLDB4MDQsMHg5MH19ICAvKiAweDQ3ICovCiB9OwogCi1YR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QgWEdJX0NIVFZSZWdVTlRTQ1tdID0geworc3RydWN0IFhHSTMzMF9DSFRWUmVnRGF0YVN0cnVjdCBYR0lfQ0hUVlJlZ1VOVFNDW10gPSB7CiAgICAgICAgICAgICAgICAgLyogSW5kZXg6MDAwaCwwMDFoLDAwMmgsMDA0aCwwMDNoLDAwNWgsMDA2aCwwMDdoLDAwOGgsMDE1aCwwMUZoLDAwQ2gsMDBEaCwwMEVoLDAwRmgsMDEwaCAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHg0QSwweDc3LDB4QkIsMHg5NCwweDg0LDB4NDgsMHhGRSwweDUwLDB4MDQsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSAgfX0sLyogMDAgKDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NEEsMHg3NywweEJCLDB4OTQsMHg4NCwweDQ4LDB4RkUsMHg1MCwweDA0LDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEgIH19LC8qIDAxICg2NDB4MzUwKSAqLwpAQCAtOTYxLDcgKzkzMiw3IEBACiAgICAgICAgICAgICAgICAge3sgICAgICAweEVFLDB4NzcsMHhCQiwweDY2LDB4ODcsMHgzMiwweDAxLDB4NUEsMHgwNCwweDAwLDB4ODAsMHgxQiwweEQ0LDB4MkYsMHg2RiwweDAwICB9fS8qIDA2ICgxMDI0eDc2OCkgOzs1LzYvMDIgKi8KICAgICAgICAgICB9OwogCi1YR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QgWEdJX0NIVFZSZWdPTlRTQ1tdPSB7CitzdHJ1Y3QgWEdJMzMwX0NIVFZSZWdEYXRhU3RydWN0IFhHSV9DSFRWUmVnT05UU0NbXSA9IHsKICAgICAgICAgICAgICAgICAvKiBJbmRleDowMDBoLDAwMWgsMDAyaCwwMDRoLDAwM2gsMDA1aCwwMDZoLDAwN2gsMDA4aCwwMTVoLDAxRmgsMDBDaCwwMERoLDAwRWgsMDBGaCwwMTBoICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDQ5LDB4NzcsMHhCQiwweDdCLDB4ODQsMHgzNCwweDAwLDB4NTAsMHgwNCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxICB9fSwvKiAwMCAoNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHg0OSwweDc3LDB4QkIsMHg3QiwweDg0LDB4MzQsMHgwMCwweDUwLDB4MDQsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSAgfX0sLyogMDEgKDY0MHgzNTApICovCkBAIC05NzIsNyArOTQzLDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4RUQsMHg3NywweEJCLDB4NjYsMHg4QywweDIxLDB4MDIsMHg1QSwweDA0LDB4MDAsMHg4MCwweDFGLDB4QTAsMHg3RSwweDczLDB4MDAgIH19LyogMDYgKDEwMjR4NzY4KSA7OzUvNi8wMiAqLwogICAgICAgICAgIH07CiAKLVhHSTMzMF9DSFRWUmVnRGF0YVN0cnVjdCBYR0lfQ0hUVlJlZ1VQQUxbXT0gIHsKK3N0cnVjdCBYR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QgWEdJX0NIVFZSZWdVUEFMW10gPSB7CiAgICAgICAgICAgICAgICAgLyogSW5kZXg6MDAwaCwwMDFoLDAwMmgsMDA0aCwwMDNoLDAwNWgsMDA2aCwwMDdoLDAwOGgsMDE1aCwwMUZoLDAwQ2gsMDBEaCwwMEVoLDAwRmgsMDEwaCAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHg0MSwweDdGLDB4QjcsMHgzNCwweEFELDB4NTAsMHgzNCwweDgzLDB4MDUsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSAgfX0sLyogOyAwMCAoNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHg0MSwweDdGLDB4QjcsMHg4MCwweDg1LDB4NTAsMHgwMCwweDgzLDB4MDUsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSAgfX0sLyogOyAwMSAoNjQweDM1MCkgKi8KQEAgLTk4Myw3ICs5NTQsNyBAQAogICAgICAgICAgICAgICAgIHt7ICAgICAgMHhFNSwweDdGLDB4QjcsMHgxRCwweEE3LDB4M0UsMHgwNCwweDVBLDB4MDUsMHgwMCwweDgwLDB4MjAsMHgzRSwweEU0LDB4MjIsMHgwMCAgfX0vKiA7IDA2ICgxMDI0eDc2OCkgOzsxLzEyLzAyICovCiAJICB9OwogCi1YR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QgWEdJX0NIVFZSZWdPUEFMW109eworc3RydWN0IFhHSTMzMF9DSFRWUmVnRGF0YVN0cnVjdCBYR0lfQ0hUVlJlZ09QQUxbXSA9IHsKICAgICAgICAgICAgICAgICAvKiBJbmRleDowMDAsMHgwMSwweDAyLDB4MDQsMHgwMywweDA1LDB4MDYsMHgwNywweDA4LDB4MTUsMHgxRiwweDBDLDB4MEQsMHgwRSwweDBGLDB4MTBoICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDQxLDB4N0YsMHhCNywweDM2LDB4QUQsMHg1MCwweDM0LDB4ODMsMHgwNSwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxIH19LC8qIDAwICg2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDQxLDB4N0YsMHhCNywweDg2LDB4ODUsMHg1MCwweDAwLDB4ODMsMHgwNSwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxIH19LC8qIDAxICg2NDB4MzUwKSAqLwpAQCAtOTk0LDE0ICs5NjUsMTQgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4RTQsMHg3RiwweEI3LDB4MUUsMHhBRiwweDI5LDB4MzcsMHg1QSwweDA1LDB4MDAsMHg4MCwweDI1LDB4OEMsMHhCMiwweDJBLDB4MDAgfX0vKiAwNiAoMTAyNHg3NjgpIDs7MS8xMi8wMiAqLwogCSAgICAgfTsKIAotVUNIQVIgWEdJX0NINzAxN0xWMTAyNHg3NjhbXT17MHg2MCwweDAyLDB4MDAsMHgwNywweDQwLDB4RUQsMHhBMywKLSAgICAgICAgICAgICAgICAgICAJCQkweEM4LDB4QzcsMHhBQywweEUwLDB4MDJ9OwotVUNIQVIgWEdJX0NINzAxN0xWMTQwMHgxMDUwW109ezB4NjAsMHgwMywweDExLDB4MDAsMHg0MCwweEUzLDB4QUQsCi0gICAgICAgICAgICAgICAgICAgCQkJMHhEQiwweEY2LDB4QUMsMHhFMCwweDAyfTsKK3Vuc2lnbmVkIGNoYXIgWEdJX0NINzAxN0xWMTAyNHg3NjhbXSA9IHsweDYwLCAweDAyLCAweDAwLCAweDA3LCAweDQwLCAweEVELCAweEEzLAorCQkJCQkweEM4LCAweEM3LCAweEFDLCAweEUwLCAweDAyfTsKK3Vuc2lnbmVkIGNoYXIgWEdJX0NINzAxN0xWMTQwMHgxMDUwW10gPSB7MHg2MCwgMHgwMywgMHgxMSwgMHgwMCwgMHg0MCwgMHhFMywgMHhBRCwKKwkJCQkJIDB4REIsIDB4RjYsIDB4QUMsIDB4RTAsIDB4MDJ9OwogCiAKIC8qYWRkIGZvciBuZXcgVU5JVkdBQklPUyovCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0TENEMTAyNHg3NjhEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdExDRDEwMjR4NzY4RGF0YVtdID0KIHsKICB7ICAgNjIsICAyNSwgODAwLCA1NDYsMTM0NCwgODA2fSwKICB7ICAgMzIsICAxNSwgOTMwLCA1NDYsMTM0NCwgODA2fSwKQEAgLTEwMTIsNyArOTgzLDcgQEAKICB7ICAgIDEsICAgMSwxMzQ0LCA4MDYsMTM0NCwgODA2fQogfTsKIAotWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9FeHRMQ0QxMDI0eDc2OERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0V4dExDRDEwMjR4NzY4RGF0YVtdID0KIHsKICB7ICAgNDIsICAyNSwxNTM2LCA0MTksMTM0NCwgODA2fSwgLyogeyAxMiwgNSwgODk2LCA1MTIsMTM0NCwgODA2fSwgLy8gYWxhbiAwOS8xMi8yMDAzICovCiAgeyAgIDQ4LCAgMjUsMTUzNiwgMzY5LDEzNDQsIDgwNn0sIC8qIHsgMTIsIDUsIDg5NiwgNTEwLDEzNDQsIDgwNn0sIC8vIGFsYW4gMDkvMTIvMjAwMyAqLwpAQCAtMTAyOSw3ICsxMDAwLDcgQEAKICB7ICAgIDEsICAgMSwxMzQ0LCA4MDYsMTM0NCwgODA2fQogfTsKIAotLypYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0MkxDRDEwMjR4NzY4RGF0YVtdPQorLypzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdDJMQ0QxMDI0eDc2OERhdGFbXSA9CiB7CiAgeyAgIDYyLCAgMjUsIDgwMCwgNTQ2LDEzNDQsIDgwNn0sCiAgeyAgIDMyLCAgMTUsIDkzMCwgNTQ2LDEzNDQsIDgwNn0sCkBAIC0xMDQwLDcgKzEwMTEsNyBAQAogIHsgICAgMSwgICAxLDEzNDQsIDgwNiwxMzQ0LCA4MDZ9CiB9OyovCiAKLVhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfQ2V0TENEMTAyNHg3NjhEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9DZXRMQ0QxMDI0eDc2OERhdGFbXSA9CiB7CiAJeyAgICAgICAgIDEsMSwxMzQ0LDgwNiwxMzQ0LDgwNiAgICAgICAgICAgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgIDEsMSwxMzQ0LDgwNiwxMzQ0LDgwNiAgICAgICAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEwNTEsNyArMTAyMiw3IEBACiAgICAgICAgIHsgICAgICAgICAxLDEsMTM0NCw4MDYsMTM0NCw4MDYgICAgICAgICAgIH0gIC8qIDA2ICgxMDI0eDc2OHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdExDRDEyODB4MTAyNERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0TENEMTI4MHgxMDI0RGF0YVtdID0KIHsKICB7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKICB7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKQEAgLTEwNjMsNyArMTAzNCw3IEBACiAgeyAgICAxLCAgIDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0KIH07CiAKLVhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTI4MHgxMDI0RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTI4MHgxMDI0RGF0YVtdID0KIHsKICB7ICAyMTEsICA2MCwxMDI0LCA1MDEsMTY4OCwxMDY2fSwKICB7ICAyMTEsICA2MCwxMDI0LCA1MDgsMTY4OCwxMDY2fSwKQEAgLTEwNzUsNyArMTA0Niw3IEBACiAgeyAgICAxLCAgIDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0KIH07CiAKLVhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfU3QyTENEMTI4MHgxMDI0RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfU3QyTENEMTI4MHgxMDI0RGF0YVtdID0KIHsKICB7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKICB7ICAgMjIsICAgNSwgODAwLCA1MTAsMTY1MCwxMDg4fSwKQEAgLTEwODcsNyArMTA1OCw3IEBACiAgeyAgICAxLCAgIDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0KIH07CiAKLVhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfQ2V0TENEMTI4MHgxMDI0RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfQ2V0TENEMTI4MHgxMDI0RGF0YVtdID0KIHsKIAl7ICAgICAgICAgMSwxLDE2ODgsMTA2NiwxNjg4LDEwNjYgICAgICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgIDEsMSwxNjg4LDEwNjYsMTY4OCwxMDY2ICAgICAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTExMDAsNyArMTA3MSw3IEBACiAgICAgICAgIHsgICAgICAgICAxLDEsMTY4OCwxMDY2LDE2ODgsMTA2NiAgICAgICAgIH0gLyogMDggKDE0MDB4MTA1MHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdExDRDE0MDB4MTA1MERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0TENEMTQwMHgxMDUwRGF0YVtdID0KIHsKIAl7ICAgICAgICAgMjExLDEwMCwyMTAwLDQwOCwxNjg4LDEwNjYgICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgIDIxMSw2NCwxNTM2LDM1OCwxNjg4LDEwNjYgICAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTExMTMsNyArMTA4NCw3IEBACiAgICAgICAgIHsgICAgICAgICAxLDEsMTY4OCwxMDY2LDE2ODgsMTA2NiAgICAgICAgIH0gIC8qIDA4ICgxNDAweDEwNTB4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTQwMHgxMDUwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTQwMHgxMDUwRGF0YVtdID0KIHsKIAl7ICAgICAgICAgMjExLDEwMCwyMTAwLDQwOCwxNjg4LDEwNjYgICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgIDIxMSw2NCwxNTM2LDM1OCwxNjg4LDEwNjYgICAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTExMjYsNyArMTA5Nyw3IEBACiAgICAgICAgIHsgICAgICAgICAxLDEsMTY4OCwxMDY2LDE2ODgsMTA2NiAgICAgICAgIH0gIC8qIDA4ICgxNDAweDEwNTB4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTYwMHgxMjAwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTYwMHgxMjAwRGF0YVtdID0KIHsKICAgICAgICAgeyAgICAgICAgIDQsMSwxNjIwLDQyMCwyMTYwLDEyNTAgICAgICAgICAgfSwgLyogeyAzLDEsMjE2MCw0MjUsMjE2MCwxMjUwIH0sIC8vIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAvLyBhbGFuIDEwLzE0LzIwMDMgKi8KICAgICAgICAgeyAgICAgICAgIDI3LDcsMTkyMCwzNzUsMjE2MCwxMjUwICAgICAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTExNDAsNyArMTExMSw3IEBACiAgICAgICAgIHsgICAgICAgICAxLDEsMjE2MCwxMjUwLDIxNjAsMTI1MCAgICAgICAgIH0gIC8qIDA5ICgxNjAweDEyMDB4NjBIeikgOzMwMmx2ICovCiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0TENEMTYwMHgxMjAwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfU3RMQ0QxNjAweDEyMDBEYXRhW10gPQogewogICAgICAgICB7ICAgICAgICAgMjcsNCw4MDAsNTAwLDIxNjAsMTI1MCAgICAgICAgICB9LC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ICAgICAgICAgMjcsNCw4MDAsNTAwLDIxNjAsMTI1MCAgICAgICAgICB9LC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMTU0LDcgKzExMjUsNyBAQAogICAgICAgICB7ICAgICAgICAgMSwxLDIxNjAsMTI1MCwyMTYwLDEyNTAgICAgICAgICB9IC8qIDA5ICgxNjAweDEyMDApICovCiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDE0MDB4MTA1MERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDE0MDB4MTA1MERhdGFbXSA9CiB7CiAJeyAgICAgICAgIDEsMSwxNjg4LDEwNjYsMTY4OCwxMDY2ICAgICAgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAgICAxLDEsMTY4OCwxMDY2LDE2ODgsMTA2NiAgICAgICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMTY3LDcgKzExMzgsNyBAQAogICAgICAgICB7ICAgICAgICAgMSwxLDE2ODgsMTA2NiwxNjg4LDEwNjYgICAgICAgICB9ICAvKiAwOCAoMTQwMHgxMDUweDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX05vU2NhbGluZ0RhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX05vU2NhbGluZ0RhdGFbXSA9CiB7CiAgeyAgICAxLCAgIDEsIDgwMCwgNDQ5LCA4MDAsIDQ0OX0sCiAgeyAgICAxLCAgIDEsIDgwMCwgNDQ5LCA4MDAsIDQ0OX0sCkBAIC0xMTc5LDcgKzExNTAsNyBAQAogIHsgICAgMSwgICAxLDE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0V4dExDRDEwMjR4NzY4eDc1RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTAyNHg3Njh4NzVEYXRhW10gPQogewogICAgICAgICB7NDIsMjUsMTUzNiw0MTksMTM0NCw4MDYgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezQ4LDI1LDE1MzYsMzY5LDEzNDQsODA2IH0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTExOTAsNyArMTE2MSw3IEBACiAgICAgICAgIHsxLDEsMTMxMiw4MDAsMTMxMiw4MDAgICB9ICAvKiA7IDA2ICgxMDI0eDc2OHg3NUh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdExDRDEwMjR4NzY4eDc1RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfU3RMQ0QxMDI0eDc2OHg3NURhdGFbXSA9CiB7CiAgICAgICAgIHs0MiwyNSwxNTM2LDQxOSwxMzQ0LDgwNiB9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7NDgsMjUsMTUzNiwzNjksMTM0NCw4MDYgfSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTIwMSw3ICsxMTcyLDcgQEAKICAgICAgICAgezEsMSwxMzEyLDgwMCwxMzEyLDgwMCAgIH0gIC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDEwMjR4NzY4eDc1RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfQ2V0TENEMTAyNHg3Njh4NzVEYXRhW10gPQogewogICAgICAgICB7MSwxLDEzMTIsODAwLDEzMTIsODAwfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezEsMSwxMzEyLDgwMCwxMzEyLDgwMH0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEyMTIsNyArMTE4Myw3IEBACiAgICAgICAgIHsxLDEsMTMxMiw4MDAsMTMxMiw4MDB9IC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0V4dExDRDEyODB4MTAyNHg3NURhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0V4dExDRDEyODB4MTAyNHg3NURhdGFbXSA9CiB7CiAgICAgICAgIHsyMTEsNjAsMTAyNCw1MDEsMTY4OCwxMDY2ICAgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezIxMSw2MCwxMDI0LDUwOCwxNjg4LDEwNjYgICB9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMjI0LDcgKzExOTUsNyBAQAogICAgICAgICB7MSwxLDE2ODgsMTA2NiwxNjg4LDEwNjYgICAgIH0gIC8qIDsgMDcgKDEyODB4MTAyNHg3NUh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdExDRDEyODB4MTAyNHg3NURhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0TENEMTI4MHgxMDI0eDc1RGF0YVtdID0KIHsKICAgICAgICAgezIxMSw2MCwxMDI0LDUwMSwxNjg4LDEwNjYgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezIxMSw2MCwxMDI0LDUwOCwxNjg4LDEwNjYgfSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTIzNiw3ICsxMjA3LDcgQEAKICAgICAgICAgezEsMSwxNjg4LDEwNjYsMTY4OCwxMDY2ICAgfSAgLyogOyAwNyAoMTI4MHgxMDI0eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDEyODB4MTAyNHg3NURhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDEyODB4MTAyNHg3NURhdGFbXSA9CiB7CiAgICAgICAgIHsxLDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxLDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEyNDgsNyArMTIxOSw3IEBACiAgICAgICAgIHsxLDEsMTY4OCwxMDY2LDE2ODgsMTA2Nn0gIC8qIDsgMDcgKDEyODB4MTAyNHg3NUh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9Ob1NjYWxpbmdEYXRheDc1W109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9Ob1NjYWxpbmdEYXRheDc1W10gPQogewogICAgICAgICB7MSwxLDgwMCw0NDksODAwLDQ0OSAgICB9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7MSwxLDgwMCw0NDksODAwLDQ0OSAgICB9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMjYzLDcgKzEyMzQsNyBAQAogICAgICAgICB7MSwxLDE2ODgsODA2LDE2ODgsODA2ICB9ICAvKiA7IDBBICgxMjgweDc2OHg3NUh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxMDI0eDc2OERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERlczEwMjR4NzY4RGF0YVtdID0KIHsKICAgIHsgIDksMTA1NywwLCA3NzEgIH0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICB7ICA5LDEwNTcsMCwgNzcxICB9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMjc0LDcgKzEyNDUsNyBAQAogICAgeyAgOSwxMDU3LDgwNSwgNzcwICB9ICAvKiA7IDA2ICgxMDI0eDc2OHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9TdExDRERlczEwMjR4NzY4RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxMDI0eDc2OERhdGFbXSA9CiB7CiAgICAgICAgIHsgOSwxMDU3LDczNyw3MDMgICB9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7IDksMTA1Nyw2ODYsNjUxICAgfSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTI4NSw3ICsxMjU2LDcgQEAKICAgICAgICAgeyA5LDEwNTcsODA1LDc3MCAgIH0gIC8qIDsgMDYgKDEwMjR4NzY4eDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczEwMjR4NzY4RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfQ2V0TENERGVzMTAyNHg3NjhEYXRhW10gPQogewogICAgICAgIAl7ICAgICAgMTE1Miw4NTYsNjIyLDU4NyAgIH0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAxMTUyLDg1Niw1OTcsNTYyICAgfSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTI5Niw3ICsxMjY3LDcgQEAKICAgICAgICAgeyAgICAgIDAsMTA0OCw4MDUsNzcwICAgfSAgLyogOyAwNiAoMTAyNHg3Njh4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0IFhHSV9FeHRMQ0RETERlczEyODB4MTAyNERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCBYR0lfRXh0TENERExEZXMxMjgweDEwMjREYXRhW10gPQogewogICAgICAgICB7ICAgICAgMTgsMTM0Niw5ODEsOTQwICAgICB9LC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ICAgICAgMTgsMTM0Niw5MjYsODY1ICAgICB9LC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMzA4LDcgKzEyNzksNyBAQAogICAgICAgICB7ICAgICAgMTgsMTM0NiwxMDY1LDEwMjQgICAgIH0vKiAwNyAoMTI4MHgxMDI0eDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCBYR0lfU3RMQ0RETERlczEyODB4MTAyNERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCBYR0lfU3RMQ0RETERlczEyODB4MTAyNERhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAxOCwxMzQ2LDk3MCw5MDcgICAgIH0sLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAxOCwxMzQ2LDkxNyw4NTQgICAgIH0sLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEzMjAsNyArMTI5MSw3IEBACiAgICAgICAgIHsgICAgICAxOCwxMzQ2LDEwNjUsMTAyNCAgICAgfS8qIDA3ICgxMjgweDEwMjR4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfQ2V0TENERExEZXMxMjgweDEwMjREYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9DZXRMQ0RETERlczEyODB4MTAyNERhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAxMzY4LDEwMDgsNzUyLDcxMSAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDEzNjgsMTAwOCw3MjksNjg4ICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMzMyLDcgKzEzMDMsNyBAQAogICAgICAgICB7ICAgICAgMTgsMTM0NiwxMDY1LDEwMjQgICAgfSAgLyogMDcgKDEyODB4MTAyNHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxMjgweDEwMjREYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxMjgweDEwMjREYXRhW10gPQogewogICAgICAgICB7ICAgICAgOSwxMzM3LDk4MSw5NDAgICAgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDksMTMzNyw5MjYsODg0ICAgIH0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgYWxhbiwgMjAwMy8wOS8zMCAqLwpAQCAtMTM0NCw3ICsxMzE1LDcgQEAKICAgICAgICAgeyAgICAgIDksMTMzNywxMDY1LDEwMjQgICAgfSAgLyogOyAwNyAoMTI4MHgxMDI0eDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERGVzMTI4MHgxMDI0RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxMjgweDEwMjREYXRhW10gPQogewogICAgICAgICB7ICAgICAgOSwxMzM3LDk3MCw5MDcgICAgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDksMTMzNyw5MTcsODU0ICAgIH0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEzNTYsNyArMTMyNyw3IEBACiAgICAgICAgIHsgICAgICA5LDEzMzcsMTA2NSwxMDI0ICAgIH0gIC8qIDsgMDcgKDEyODB4MTAyNHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9DZXRMQ0REZXMxMjgweDEwMjREYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9DZXRMQ0REZXMxMjgweDEwMjREYXRhW10gPQogewogICAgICAgICB7ICAgICAgMTM2OCwxMDA4LDc1Miw3MTEgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAxMzY4LDEwMDgsNzI5LDY4OCAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTM2OCw3ICsxMzM5LDcgQEAKICAgICAgICAgeyAgICAgIDksMTMzNywxMDY1LDEwMjQgICAgfSAgLyogMDcgKDEyODB4MTAyNHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9TdExDRERMRGVzMTQwMHgxMDUwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0RETERlczE0MDB4MTA1MERhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAxOCwxNDY0LDAsMTA1MSAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDE4LDE0NjQsMCwxMDUxICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xMzgxLDcgKzEzNTIsNyBAQAogICAgICAgICB7ICAgICAgMTgsMTQ2NCwwLDEwNTEgICAgfSAgLyogMDggKDE0MDB4MTA1MHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0RETERlczE0MDB4MTA1MERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERMRGVzMTQwMHgxMDUwRGF0YVtdID0KIHsKICAgICAgICAgeyAgICAgIDE4LDE0NjQsMCwxMDUxICAgIH0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ICAgICAgMTgsMTQ2NCwwLDEwNTEgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEzOTQsNyArMTM2NSw3IEBACiAgICAgICAgIHsgICAgICAxOCwxNDY0LDAsMTA1MSAgICB9ICAvKiAwOCAoMTQwMHgxMDUweDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERGVzMTQwMHgxMDUwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxNDAweDEwNTBEYXRhW10gPQogewogICAgICAgICB7ICAgICAgOSwxNDU1LDAsMTA1MSAgICAgfSwvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDksMTQ1NSwwLDEwNTEgICAgIH0sLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE0MDcsNyArMTM3OCw3IEBACiAgICAgICAgIHsgICAgICA5LDE0NTUsMCwxMDUxICAgICB9IC8qIDA4ICgxNDAweDEwNTB4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERGVzMTQwMHgxMDUwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERGVzMTQwMHgxMDUwRGF0YVtdID0KIHsKICAgICAgICAgeyAgICAgIDksMTQ1NSwwLDEwNTEgICAgIH0sLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICA5LDE0NTUsMCwxMDUxICAgICB9LC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNDIwLDcgKzEzOTEsNyBAQAogICAgICAgICB7ICAgICAgOSwxNDU1LDAsMTA1MSAgICAgfSAvKiAwOCAoMTQwMHgxMDUweDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczE0MDB4MTA1MERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczE0MDB4MTA1MERhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAxMzA4LDEwNjgsNzgxLDc2NiAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDEzMDgsMTA2OCw3ODEsNzY2ICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNDMzLDcgKzE0MDQsNyBAQAogICAgICAgICB7ICAgICAgMTgsMTQ2NCwwLDEwNTEgICAgfSAvKiAwOCAoMTQwMHgxMDUweDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczE0MDB4MTA1MERhdGEyW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9DZXRMQ0REZXMxNDAweDEwNTBEYXRhMltdID0KIHsKICAgICAgICAgeyAgICAgIDAsMTQ0OCwwLDEwNTEgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAwLDE0NDgsMCwxMDUxICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNDQ0LDcgKzE0MTUsNyBAQAogCiAKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0RETERlczE2MDB4MTIwMERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERMRGVzMTYwMHgxMjAwRGF0YVtdID0KIHsKIAl7ICAgICAgMTgsMTY4MiwwLDEyMDEgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAxOCwxNjgyLDAsMTIwMSAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTQ1OCw3ICsxNDI5LDcgQEAKICAgICAgICAgeyAgICAgIDE4LDE2ODIsMCwxMjAxICAgIH0gIC8qIDA5ICgxNjAweDEyMDB4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0RETERlczE2MDB4MTIwMERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERExEZXMxNjAweDEyMDBEYXRhW10gPQogewogICAgICAgICB7ICAgICAgMTgsMTY4MiwxMTUwLDExMDEgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAxOCwxNjgyLDEwODMsMTAzNCAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTQ3Miw3ICsxNDQzLDcgQEAKICAgICAgICAgeyAgICAgIDE4LDE2ODIsMCwxMjAxICAgIH0gLyogMDkgKDE2MDB4MTIwMHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxNjAweDEyMDBEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxNjAweDEyMDBEYXRhW10gPQogewogICAgICAgICB7ICAgICAgOSwxNjczLDAsMTIwMSAgICAgfSwvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDksMTY3MywwLDEyMDEgICAgIH0sLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE0ODYsNyArMTQ1Nyw3IEBACiAgICAgICAgIHsgICAgICA5LDE2NzMsMCwxMjAxICAgICB9IC8qIDA5ICgxNjAweDEyMDB4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxNjAweDEyMDBEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9TdExDRERlczE2MDB4MTIwMERhdGFbXSA9CiB7CiAJeyAgICAgIDksMTY3MywxMTUwLDExMDEgICAgIH0sLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICA5LDE2NzMsMTA4MywxMDM0ICAgICB9LC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNTAwLDcgKzE0NzEsNyBAQAogICAgICAgICB7ICAgICAgOSwxNjczLDAsMTIwMSAgICAgfSAvKiAwOSAoMTYwMHgxMjAweDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdDIgIFhHSV9Ob1NjYWxpbmdEZXNEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QyICBYR0lfTm9TY2FsaW5nRGVzRGF0YVtdID0KIHsKICAgICAgICAgeyAgICAgOSw2NTcsNDQ4LDQwNSw5NiwyICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgOSw2NTcsNDQ4LDM1NSw5NiwyICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTUxNSw3ICsxNDg2LDcgQEAKICAgICAgICAgeyAgICAgOSwxMzM3LDAsNzcxLDExMiw2ICB9ICAvKiAwQSAoMTI4MHg3Njh4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERGVzMTAyNHg3Njh4NzVEYXRhW109CQkvKiA7OzEwMjR4NzY4eDc1SHogKi8KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERlczEwMjR4NzY4eDc1RGF0YVtdID0JCS8qIDs7MTAyNHg3Njh4NzVIeiAqLwogewogICAgICAgICB7OSwxMDQ5LDAsNzY5fSwgICAgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezksMTA0OSwwLDc2OX0sICAgIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE1MjYsNyArMTQ5Nyw3IEBACiAgICAgICAgIHs5LDEwNDksMCw3Njl9ICAgICAvKiA7IDA2ICgxMDI0eDc2OHg3NUh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9TdExDRERlczEwMjR4NzY4eDc1RGF0YVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxMDI0eDc2OHg3NURhdGFbXSA9CiB7CiAgICAgICAgIHs5LDEwNDksMCw3Njl9LCAgICAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7OSwxMDQ5LDAsNzY5fSwgICAgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTUzNyw3ICsxNTA4LDcgQEAKICAgICAgICAgezksMTA0OSwwLDc2OX0gICAgIC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczEwMjR4NzY4eDc1RGF0YVtdPQkvKiA7OzEwMjR4NzY4eDc1SHogKi8KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczEwMjR4NzY4eDc1RGF0YVtdID0JLyogOzsxMDI0eDc2OHg3NUh6ICovCiB7CiAgICAgICAgIHsxMTUyLDg1Niw2MjIsNTg3fSwgICAgIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxMTUyLDg1Niw1OTcsNTYyfSwgICAgIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE1NDgsNyArMTUxOSw3IEBACiAgICAgICAgIHs5LDEwNDksMCw3Njl9IAkgICAJLyogOyAwNiAoMTAyNHg3Njh4NzVIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERExEZXMxMjgweDEwMjR4NzVEYXRhW109ICAgICAgICAgLyogOzsxMjgweDEwMjR4NzVIeiAqLworc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERExEZXMxMjgweDEwMjR4NzVEYXRhW10gPSAgICAgICAgIC8qIDs7MTI4MHgxMDI0eDc1SHogKi8KIHsKICAgICAgICAgezE4LDEzMTQsMCwxMDI1ICAgICB9LC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxOCwxMzE0LDAsMTAyNSAgICAgfSwvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNTYwLDcgKzE1MzEsNyBAQAogICAgICAgICB7MTgsMTMxNCwwLDEwMjUgICAgIH0vKiA7IDA3ICgxMjgweDEwMjR4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0RETERlczEyODB4MTAyNHg3NURhdGFbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERExEZXMxMjgweDEwMjR4NzVEYXRhW10gPQogewogICAgICAgICB7MTgsMTMxNCwwLDEwMjUgICAgIH0sLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezE4LDEzMTQsMCwxMDI1ICAgICB9LC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE1NzIsNyArMTU0Myw3IEBACiAgICAgICAgIHsxOCwxMzE0LDAsMTAyNSAgICAgfS8qIDsgMDcgKDEyODB4MTAyNHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9DZXRMQ0RETERlczEyODB4MTAyNHg3NURhdGFbXT0JLyogMTI4MHgxMDI0eDc1SHogKi8KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERMRGVzMTI4MHgxMDI0eDc1RGF0YVtdID0JLyogMTI4MHgxMDI0eDc1SHogKi8KIHsKICAgICAgICAgezEzNjgsMTAwOCw3NTIsNzExfSwgICAgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezEzNjgsMTAwOCw3MjksNjg4fSwgICAgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTU4NCw3ICsxNTU1LDcgQEAKICAgICAgICAgezE4LDEzMTQsMCwxMDI1fSAgICAgCSAgLyogOyAwNyAoMTI4MHgxMDI0eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERlczEyODB4MTAyNHg3NURhdGFbXT0gICAgICAgICAvKiA7OzEyODB4MTAyNHg3NUh6ICovCitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxMjgweDEwMjR4NzVEYXRhW10gPSAgICAgICAgIC8qIDs7MTI4MHgxMDI0eDc1SHogKi8KIHsKIAl7OSwxMzA1LDAsMTAyNX0sLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezksMTMwNSwwLDEwMjV9LC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE1OTYsNyArMTU2Nyw3IEBACiAgICAgICAgIHs5LDEzMDUsMCwxMDI1fSAvKiA7IDA3ICgxMjgweDEwMjR4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxMjgweDEwMjR4NzVEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9TdExDRERlczEyODB4MTAyNHg3NURhdGFbXSA9CiB7CiAJezksMTMwNSwwLDEwMjV9LC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHs5LDEzMDUsMCwxMDI1fSwvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNjA4LDcgKzE1NzksNyBAQAogICAgICAgICB7OSwxMzA1LDAsMTAyNX0gLyogOyAwNyAoMTI4MHgxMDI0eDYwSHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczEyODB4MTAyNHg3NURhdGFbXT0JLyogMTI4MHgxMDI0eDc1SHogKi8KK3N0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0NldExDRERlczEyODB4MTAyNHg3NURhdGFbXSA9CS8qIDEyODB4MTAyNHg3NUh6ICovCiB7CiAgICAgICAgIHsxMzY4LDEwMDgsNzUyLDcxMX0sICAgIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxMzY4LDEwMDgsNzI5LDY4OH0sICAgIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE2MjAsNyArMTU5MSw3IEBACiAgICAgICAgIHs5LDEzMDUsMCwxMDI1fSAgICAgCSAgLyogOyAwNyAoMTI4MHgxMDI0eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdDIgWEdJX05vU2NhbGluZ0Rlc0RhdGF4NzVbXT0gLyogU2NhbGluZyBMQ0QgNzVIeiAqLworc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0MiBYR0lfTm9TY2FsaW5nRGVzRGF0YXg3NVtdID0gLyogU2NhbGluZyBMQ0QgNzVIeiAqLwogewogCXs5LDY1Nyw0NDgsNDA1LDk2LDJ9LCAgIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHs5LDY1Nyw0NDgsMzU1LDk2LDJ9LCAgIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE2MzUsNyArMTYwNiw3IEBACiAgICAgICAgIHs5LDEzMzcsMCw3NzEsMTEyLDZ9ICAgIC8qIDsgMEEgKDEyODB4NzY4eDYwSHopICovCiB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfU3RQQUxEYXRhW109CitzdHJ1Y3QgWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX1N0UEFMRGF0YVtdID0KIHsKICB7ICAgIDEsICAgMSwgODY0LCA1MjUsMTI3MCwgNDAwLCAxMDAsICAgMCwgNzYwfSwKICB7ICAgIDEsICAgMSwgODY0LCA1MjUsMTI3MCwgMzUwLCAxMDAsICAgMCwgNzYwfSwKQEAgLTE2NDUsNyArMTYxNiw3IEBACiAgeyAgICAxLCAgIDEsIDg2NCwgNTI1LDEyNzAsIDYwMCwgIDUwLCAgIDAsICAgMH0KIH07CiAKLVhHSTMzMF9UVkRhdGFTdHJ1Y3QgIFhHSV9FeHRQQUxEYXRhW109CitzdHJ1Y3QgWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX0V4dFBBTERhdGFbXSA9CiB7CiAgeyAgICAyLCAgIDEsMTA4MCwgNDYzLDEyNzAsIDUwMCwgIDUwLCAgIDAsICA1MH0sCiAgeyAgIDE1LCAgIDcsMTE1MiwgNDEzLDEyNzAsIDUwMCwgIDUwLCAgIDAsICA1MH0sCkBAIC0xNjU3LDcgKzE2MjgsNyBAQAogIHsgICAgMywgICAyLDEwODAsIDYxOSwxMjcwLCA1NDAsIDQzOCwgICAwLCA0Mzh9CiB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfU3ROVFNDRGF0YVtdPQorc3RydWN0IFhHSTMzMF9UVkRhdGFTdHJ1Y3QgIFhHSV9TdE5UU0NEYXRhW10gPQogewogIHsgICAgMSwgICAxLCA4NTgsIDUyNSwxMjcwLCA0MDAsICA1MCwgICAwLCA3NjB9LAogIHsgICAgMSwgICAxLCA4NTgsIDUyNSwxMjcwLCAzNTAsICA1MCwgICAwLCA2NDB9LApAQCAtMTY2Niw3ICsxNjM3LDcgQEAKICB7ICAgIDEsICAgMSwgODU4LCA1MjUsMTI3MCwgNDgwLCAgIDAsICAgMCwgNzYwfQogfTsKIAotWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX0V4dE5UU0NEYXRhW109CitzdHJ1Y3QgWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX0V4dE5UU0NEYXRhW10gPQogewogIHsgICAgOSwgIDUsIDEwMDEsIDQ1MywxMjcwLCA0MjAsIDE3MSwgICAwLCAxNzF9LAogIHsgICAxMiwgIDUsICA4NTgsIDQwMywxMjcwLCA0MjAsIDE3MSwgICAwLCAxNzF9LApAQCAtMTY3OSw3ICsxNjUwLDcgQEAKICB7ICAgIDMsICAgMiwxMDAxLCA1MzMsMTI3MCwgNDIwLCAgIDAsICAgMCwgICAwfQogfTsKIAotWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX1N0MUhpVFZEYXRhW109CitzdHJ1Y3QgWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX1N0MUhpVFZEYXRhW10gPQogewogICAgIAl7ICAgICAgICAxLDEsODkyLDU2Myw2OTAsODAwLDAsMCwwICAgICAgICAgICAgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAgIDEsMSw4OTIsNTYzLDY5MCw3MDAsMCwwLDAgICAgICAgICAgICAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMTY4OSw3ICsxNjYwLDcgQEAKICAgICAgICAgeyAgICAgICAgOCw1LDEwNTAsNjgzLDE2NDgsOTYwLDB4MTUwLDEsMCAgICAgICAgIH0gIC8qIDA1ICg0MDB4MzAwLDgwMHg2MDApICovCiB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfU3QySGlUVkRhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfU3QySGlUVkRhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAgIDMsMSw4NDAsNDgzLDE2NDgsOTYwLDB4MDMyLDAsMCAgICAgICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgMSwxLDg5Miw1NjMsNjkwLDcwMCwwLDAsMCAgICAgICAgICAgICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNzAwLDcgKzE2NzEsNyBAQAogCiB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfRXh0SGlUVkRhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfRXh0SGlUVkRhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAgIDYsMSw4NDAsNTYzLDE2MzIsOTYwLDAsMCwwICAgICAgICAgICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgMywxLDk2MCw1NjMsMTYzMiw5NjAsMCwwLDAgICAgICAgICAgICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNzE2LDcgKzE2ODcsNyBAQAogCiB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfRXh0WVBiUHI1MjVpRGF0YVtdPQorc3RydWN0IFhHSTMzMF9UVkRhdGFTdHJ1Y3QgIFhHSV9FeHRZUGJQcjUyNWlEYXRhW10gPQogewogIHsgICAgOSwgIDUsIDEwMDEsIDQ1MywxMjcwLCA0MjAsIDE3MSwgICAwLCAxNzF9LAogIHsgICAxMiwgIDUsICA4NTgsIDQwMywxMjcwLCA0MjAsIDE3MSwgICAwLCAxNzF9LApAQCAtMTcyOSw3ICsxNzAwLDcgQEAKICB7ICAgIDMsICAgMiwxMDAxLCA1MzMsMTI1MCwgNDIwLCAgIDAsICAgMCwgICAwfQogfTsKIAotWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX1N0WVBiUHI1MjVpRGF0YVtdPQorc3RydWN0IFhHSTMzMF9UVkRhdGFTdHJ1Y3QgIFhHSV9TdFlQYlByNTI1aURhdGFbXSA9CiB7CiAgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDQwMCwgIDUwLCAgIDAsIDc2MH0sCiAgeyAgICAxLCAgIDEsIDg1OCwgNTI1LDEyNzAsIDM1MCwgIDUwLCAgIDAsIDY0MH0sCkBAIC0xNzM4LDcgKzE3MDksNyBAQAogIHsgICAgMSwgICAxLCA4NTgsIDUyNSwxMjcwLCA0ODAsICAgMCwgICAwLCA3NjB9LAogfTsKIAotWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX0V4dFlQYlByNTI1cERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfRXh0WVBiUHI1MjVwRGF0YVtdID0KIHsKICB7ICAgIDksICA1LCAxMDAxLCA0NTMsMTI3MCwgNDIwLCAxNzEsICAgMCwgMTcxfSwKICB7ICAgMTIsICA1LCAgODU4LCA0MDMsMTI3MCwgNDIwLCAxNzEsICAgMCwgMTcxfSwKQEAgLTE3NTEsNyArMTcyMiw3IEBACiAgeyAgICAzLCAgIDIsMTAwMSwgNTMzLDEyNzAsIDQyMCwgICAwLCAgIDAsICAgMH0KICB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfU3RZUGJQcjUyNXBEYXRhW109CitzdHJ1Y3QgWEdJMzMwX1RWRGF0YVN0cnVjdCAgWEdJX1N0WVBiUHI1MjVwRGF0YVtdID0KIHsKICB7ICAgIDEsICAgMSwxNzE2LCA1MjUsMTI3MCwgNDAwLCAgNTAsICAgMCwgNzYwfSwKICB7ICAgIDEsICAgMSwxNzE2LCA1MjUsMTI3MCwgMzUwLCAgNTAsICAgMCwgNjQwfSwKQEAgLTE3NjAsNyArMTczMSw3IEBACiAgeyAgICAxLCAgIDEsMTcxNiwgNTI1LDEyNzAsIDQ4MCwgICAwLCAgIDAsIDc2MH0sCiB9OwogCi1YR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfRXh0WVBiUHI3NTBwRGF0YVtdPQorc3RydWN0IFhHSTMzMF9UVkRhdGFTdHJ1Y3QgIFhHSV9FeHRZUGJQcjc1MHBEYXRhW10gPQogewogIHsgICAgMywgICAxLCA5MzUsIDQ3MCwxMTMwLCA2ODAsICA1MCwgICAwLCAgIDB9LCAgICAgICAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICB7ICAgMjQsICAgNywgOTM1LCA0MjAsMTEzMCwgNjgwLCAgNTAsICAgMCwgICAwfSwgICAgICAgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTE3NzUsNyArMTc0Niw3IEBACiAgeyAgIDEwLCAgIDksMTMyMCwgODMwLDExMzAsIDY0MCwgIDUwLCAgIDAsICAgMH0KIH07CiAKLVhHSTMzMF9UVkRhdGFTdHJ1Y3QgIFhHSV9TdFlQYlByNzUwcERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVFZEYXRhU3RydWN0ICBYR0lfU3RZUGJQcjc1MHBEYXRhW10gPQogewogIHsgICAgMSwgICAxLDE2NTAsIDc1MCwxMjgwLCA0MDAsICA1MCwgICAwLCA3NjB9LAogIHsgICAgMSwgICAxLDE2NTAsIDc1MCwxMjgwLCAzNTAsICA1MCwgICAwLCA2NDB9LApAQCAtMTc4NCw3ICsxNzU1LDcgQEAKICB7ICAgIDEsICAgMSwxNjUwLCA3NTAsMTI4MCwgNDgwLCAgIDAsICAgMCwgNzYwfSwKIH07CiAKLVVDSEFSIFhHSTMzMF9OVFNDVGltaW5nW10gPSB7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9OVFNDVGltaW5nW10gPSB7CiAgIDB4MTcsMHgxZCwweDAzLDB4MDksMHgwNSwweDA2LDB4MGMsMHgwYywKICAgMHg5NCwweDQ5LDB4MDEsMHgwYSwweDA2LDB4MGQsMHgwNCwweDBhLAogICAweDA2LDB4MTQsMHgwZCwweDA0LDB4MGEsMHgwMCwweDg1LDB4MWIsCkBAIC0xNzk0LDcgKzE3NjUsNyBAQAogICAweDYwLDB4ODAsMHgxNCwweDkwLDB4OGMsMHg2MCwweDE0LDB4NTAsCiAgIDB4MDAsMHg0MCwweDQ0LDB4MDAsMHhkYiwweDAyLDB4M2IsMHgwMH07CiAKLVVDSEFSIFhHSTMzMF9QQUxUaW1pbmdbXSA9IHsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX1BBTFRpbWluZ1tdID0gewogICAweDIxLDB4NUEsMHgzNSwweDZlLDB4MDQsMHgzOCwweDNkLDB4NzAsCiAgIDB4OTQsMHg0OSwweDAxLDB4MTIsMHgwNiwweDNlLDB4MzUsMHg2ZCwKICAgMHgwNiwweDE0LDB4M2UsMHgzNSwweDZkLDB4MDAsMHg0NSwweDJiLApAQCAtMTgwNCw3ICsxNzc1LDcgQEAKICAgMHg2MCwweDgwLDB4MTQsMHg5MCwweDhjLDB4NjAsMHgxNCwweDYzLAogICAweDAwLDB4NDAsMHgzZSwweDAwLDB4ZTEsMHgwMiwweDI4LDB4MDB9OwogCi1VQ0hBUiBYR0kzMzBfSGlUVkV4dFRpbWluZ1tdID0KK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX0hpVFZFeHRUaW1pbmdbXSA9CiB7CiAgICAgICAweDJELDB4NjAsMHgyQywweDVGLDB4MDgsMHgzMSwweDNBLDB4NjQsCiAgICAgICAweDI4LDB4MDIsMHgwMSwweDNELDB4MDYsMHgzRSwweDM1LDB4NkQsCkBAIC0xODE4LDcgKzE3ODksNyBAQAogCiB9OwogCi1VQ0hBUiBYR0kzMzBfSGlUVlN0MVRpbWluZ1tdID0KK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX0hpVFZTdDFUaW1pbmdbXSA9CiB7CiAgICAgICAweDMyLDB4NjUsMHgyQywweDVGLDB4MDgsMHgzMSwweDNBLDB4NjUsCiAgICAgICAweDI4LDB4MDIsMHgwMSwweDNELDB4MDYsMHgzRSwweDM1LDB4NkQsCkBAIC0xODMxLDcgKzE4MDIsNyBAQAogICAgICAgMHgwRSwweDAwLDB4ZmMsMHhmZiwweDJkLDB4MDAKIH07CiAKLVVDSEFSIFhHSTMzMF9IaVRWU3QyVGltaW5nW10gPQordW5zaWduZWQgY2hhciBYR0kzMzBfSGlUVlN0MlRpbWluZ1tdID0KIHsKICAgICAgIDB4MzIsMHg2NSwweDJDLDB4NUYsMHgwOCwweDMxLDB4M0EsMHg2NCwKICAgICAgIDB4MjgsMHgwMiwweDAxLDB4M0QsMHgwNiwweDNFLDB4MzUsMHg2RCwKQEAgLTE4NDQsNyArMTgxNSw3IEBACiAgICAgICAweDI3LDB4MDAsMHhGQywweGZmLDB4NmEsMHgwMAogfTsKIAotVUNIQVIgWEdJMzMwX0hpVFZUZXh0VGltaW5nW10gPQordW5zaWduZWQgY2hhciBYR0kzMzBfSGlUVlRleHRUaW1pbmdbXSA9CiB7CiAgICAgICAweDMyLDB4NjUsMHgyQywweDVGLDB4MDgsMHgzMSwweDNBLDB4NjUsCiAgICAgICAweDI4LDB4MDIsMHgwMSwweDNELDB4MDYsMHgzRSwweDM1LDB4NkQsCkBAIC0xODU3LDcgKzE4MjgsNyBAQAogICAgICAgMHgxMSwweDAwLDB4RkMsMHhGRiwweDMyLDB4MDAKIH07CiAKLVVDSEFSIFhHSTMzMF9ZUGJQcjc1MHBUaW1pbmdbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9ZUGJQcjc1MHBUaW1pbmdbXSA9CiB7CiAgICAgICAweDMwLDB4MWQsMHhlOCwweDA5LDB4MDksMHhlZCwweDBjLDB4MGMsCiAgICAgICAweDk4LDB4MGEsMHgwMSwweDBjLDB4MDYsMHgwZCwweDA0LDB4MGEsCkBAIC0xODcwLDcgKzE4NDEsNyBAQAogICAgICAgMHgxMSwweDAwLDB4ZmMsMHhmZiwweDMyLDB4MDAKIH07CiAKLVVDSEFSIFhHSTMzMF9ZUGJQcjUyNXBUaW1pbmdbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9ZUGJQcjUyNXBUaW1pbmdbXSA9CiB7CiAgICAgICAweDNFLDB4MTEsMHgwNiwweDA5LDB4MGIsMHgwYywweDBjLDB4MGMsCiAgICAgICAweDk4LDB4MGEsMHgwMSwweDBkLDB4MDYsMHgwZCwweDA0LDB4MGEsCkBAIC0xODgzLDcgKzE4NTQsNyBAQAogICAgICAgMHgxMSwweDAwLDB4RkMsMHhGRiwweDMyLDB4MDAKIH07CiAKLVVDSEFSIFhHSTMzMF9ZUGJQcjUyNWlUaW1pbmdbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9ZUGJQcjUyNWlUaW1pbmdbXSA9CiB7CiAgICAgICAweDFCLDB4MjEsMHgwMywweDA5LDB4MDUsMHgwNiwweDBDLDB4MEMsCiAgICAgICAweDk0LDB4NDksMHgwMSwweDBBLDB4MDYsMHgwRCwweDA0LDB4MEEsCkBAIC0xODk3LDcgKzE4NjgsNyBAQAogCiB9OwogCi1VQ0hBUiBYR0kzMzBfSGlUVkdyb3VwM0RhdGFbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9IaVRWR3JvdXAzRGF0YVtdID0KIHsKICAgICAgIDB4MDAsMHgxQSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHg1RiwKICAgICAgIDB4MDUsMHgyMSwweEIyLDB4QjIsMHg1NSwweDc3LDB4MkEsMHhBNiwKQEAgLTE5MDksNyArMTg4MCw3IEBACiAgICAgICAweDE4LDB4MDUsMHgxOCwweDA1LDB4NEMsMHhBOCwweDAxCiB9OwogCi1VQ0hBUiBYR0kzMzBfSGlUVkdyb3VwM1NpbXVbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9IaVRWR3JvdXAzU2ltdVtdID0KIHsKICAgICAgIDB4MDAsMHgxQSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHg5NSwKICAgICAgIDB4REIsMHgyMCwweEI4LDB4QjgsMHg1NSwweDQ3LDB4MkEsMHhBNiwKQEAgLTE5MjEsNyArMTg5Miw3IEBACiAgICAgICAweDE4LDB4MDUsMHgxOCwweDA1LDB4NEMsMHhBOCwweDAxCiB9OwogCi1VQ0hBUiBYR0kzMzBfSGlUVkdyb3VwM1RleHRbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9IaVRWR3JvdXAzVGV4dFtdID0KIHsKICAgICAgIDB4MDAsMHgxQSwweDIyLDB4NjMsMHg2MiwweDIyLDB4MDgsMHhBNywKICAgICAgIDB4RjUsMHgyMCwweENFLDB4Q0UsMHg1NSwweDQ3LDB4MkEsMHhBNiwKQEAgLTE5MzMsNyArMTkwNCw3IEBACiAgICAgICAweDE4LDB4MDUsMHgxOCwweDA1LDB4NEMsMHhBOCwweDAxCiB9OwogCi1VQ0hBUiBYR0kzMzBfUmVuNTI1cEdyb3VwM1tdID0KK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX1JlbjUyNXBHcm91cDNbXSA9CiB7CiAgIDB4MDAsMHgxNCwweDE1LDB4MjUsMHg1NSwweDE1LDB4MGIsMHgxMywKICAgMHhCMSwweDQxLDB4NjIsMHg2MiwweEZGLDB4RjQsMHg0NSwweGE2LApAQCAtMTk0NSw3ICsxOTE2LDcgQEAKICAgMHgxYSwweDFGLDB4MjUsMHgyYSwweDRDLDB4QUEsMHgwMQogfTsKIAotVUNIQVIgWEdJMzMwX1Jlbjc1MHBHcm91cDNbXSA9Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9SZW43NTBwR3JvdXAzW10gPQogewogICAweDAwLDB4MTQsMHgxNSwweDI1LDB4NTUsMHgxNSwweDBiLDB4N2EsCiAgIDB4NTQsMHg0MSwweEU3LDB4RTcsMHhGRiwweEY0LDB4NDUsMHhhNiwKQEAgLTE5NTcsNyArMTkyOCw3IEBACiAgIDB4MTgsMHgxRCwweDIzLDB4MjgsMHg0QywweEFBLDB4MDEKIH07CiAKLVhHSV9QYW5lbERlbGF5VGJsU3RydWN0IFhHSTMzMF9QYW5lbERlbGF5VGJsW109CitzdHJ1Y3QgWEdJX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgWEdJMzMwX1BhbmVsRGVsYXlUYmxbXSA9CiB7CiB7ezB4MDAsMHgwMH19LAoge3sweDAwLDB4MDB9fSwKQEAgLTE5NzcsNyArMTk0OCw3IEBACiB7ezB4MDAsMHgwMH19CiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSTMzMF9MVkRTMzIweDQ4MERhdGFfMVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJMzMwX0xWRFMzMjB4NDgwRGF0YV8xW10gPQogewogIHs4NDgsIDQzMyw0MDAsNTI1fSwKICB7ODQ4LCAzODksNDAwLDUyNX0sCkBAIC0xOTkwLDcgKzE5NjEsNyBAQAogIHs4MDAsIDUyNSwxMDAwLCA2MzV9CiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSTMzMF9MVkRTODAweDYwMERhdGFfMVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJMzMwX0xWRFM4MDB4NjAwRGF0YV8xW10gPQogewogIHs4NDgsIDQzMywxMDYwLCA2Mjl9LAogIHs4NDgsIDM4OSwxMDYwLCA2Mjl9LApAQCAtMjAwMyw3ICsxOTc0LDcgQEAKICB7ODAwLCA1MjUsMTAwMCwgNjM1fQogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0kzMzBfTFZEUzgwMHg2MDBEYXRhXzJbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSTMzMF9MVkRTODAweDYwMERhdGFfMltdID0KIHsKICB7MTA1NiwgNjI4LDEwNTYsIDYyOH0sCiAgezEwNTYsIDYyOCwxMDU2LCA2Mjh9LApAQCAtMjAxNiw3ICsxOTg3LDcgQEAKICB7ODAwLCA1MjUsMTAwMCwgNjM1fQogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEwMjR4NzY4RGF0YV8xW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEwMjR4NzY4RGF0YV8xW10gPQogewogIHsgOTYwICwgNDM4ICwgMTM0NCAsIDgwNiB9ICwJLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgeyA5NjAgLCAzODggLCAxMzQ0ICwgODA2IH0gLAkvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjAyOCw3ICsxOTk5LDcgQEAKIH07CiAKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEwMjR4NzY4RGF0YV8yW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEwMjR4NzY4RGF0YV8yW10gPQogewogIHsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKICB7MTM0NCwgODA2LDEzNDQsIDgwNn0sCkBAIC0yMDQxLDcgKzIwMTIsNyBAQAogIHs4MDAsIDUyNSwxMjgwLCA4MTN9CiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHgxMDI0RGF0YV8xW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4MTAyNERhdGFfMVtdID0KIHsKICB7MTA0OCwgNDQyLDE2ODgsIDEwNjZ9LAogIHsxMDQ4LCAzOTIsMTY4OCwgMTA2Nn0sCkBAIC0yMDUzLDcgKzIwMjQsNyBAQAogIHsxNjg4LCAxMDY2LDE2ODgsIDEwNjZ9CiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHgxMDI0RGF0YV8yW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4MTAyNERhdGFfMltdID0KIHsKICB7MTM0NCwgODA2LDEzNDQsIDgwNn0sCiAgezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LApAQCAtMjA2Niw3ICsyMDM3LDcgQEAKICB7ODAwLCA1MjUsMTI4MCwgODEzfQogfTsKIC8qCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHg3NjhEYXRhXzFbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHg3NjhEYXRhXzFbXSA9CiB7CiAgezc2OCw0MzgsMTQwOCw4MDZ9LAogIHs3NjgsMzg4LDE0MDgsODA2fSwKQEAgLTIwNzksNyArMjA1MCw3IEBACiAgezE0MDgsODA2LDE0MDgsODA2fQogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4NzY4RGF0YV8yW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4NzY4RGF0YV8yW10gPQogewogIHsxNDA4LCA4MDYsMTQwOCwgODA2fSwKICB7MTQwOCwgODA2LDE0MDgsIDgwNn0sCkBAIC0yMDkyLDcgKzIwNjMsNyBAQAogIHsxNDA4LCA4MDYsMTQwOCwgODA2fQogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4NzY4TkRhdGFfMVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OE5EYXRhXzFbXSA9CiB7CiAgezcwNCwgNDM4LDEzNDQsIDgwNn0sCiAgezcwNCwgMzg4LDEzNDQsIDgwNn0sCkBAIC0yMTA1LDcgKzIwNzYsNyBAQAogIHsxMzQ0LCA4MDYsMTM0NCwgODA2fQogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4NzY4TkRhdGFfMltdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OE5EYXRhXzJbXSA9CiB7CiAgezEzNDQsIDgwNiwxMzQ0LCA4MDZ9LAogIHsxMzQ0LCA4MDYsMTM0NCwgODA2fSwKQEAgLTIxMTgsNyArMjA4OSw3IEBACiAgezEzNDQsIDgwNiwxMzQ0LCA4MDZ9CiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHg3NjhTRGF0YV8xW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4NzY4U0RhdGFfMVtdID0KIHsKICB7MTA0OCw0MzgsMTY4OCw4MDZ9LAogIHsxMDQ4LDM4OCwxNjg4LDgwNn0sCkBAIC0yMTMxLDcgKzIxMDIsNyBAQAogIHsxNjg4LDgwNiwxNjg4LDgwNn0KIH07CiAKLVhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OFNEYXRhXzJbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHg3NjhTRGF0YV8yW10gPQogewogIHsxNjg4LDgwNiwxNjg4LDgwNn0sCiAgezE2ODgsODA2LDE2ODgsODA2fSwKQEAgLTIxNDQsNyArMjExNSw3IEBACiAgezE2ODgsODA2LDE2ODgsODA2fQogfTsKICovCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTQwMHgxMDUwRGF0YV8xW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzE0MDB4MTA1MERhdGFfMVtdID0KIHsKICB7OTI4LDQxNiwxNjg4LDEwNjZ9LAogIHs5MjgsMzY2LDE2ODgsMTA2Nn0sCkBAIC0yMTU3LDcgKzIxMjgsNyBAQAogIHsxNjg4LDEwNjYsMTY4OCwxMDY2fQogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzE0MDB4MTA1MERhdGFfMltdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxNDAweDEwNTBEYXRhXzJbXSA9CiB7CiAgezE2ODgsMTA2NiwxNjg4LDEwNjZ9LAogIHsxNjg4LDEwNjYsMTY4OCwxMDY2fSwKQEAgLTIxNzAsNyArMjE0MSw3IEBACiAgezE2ODgsMTA2NiwxNjg4LDEwNjZ9CiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxNjAweDEyMDBEYXRhXzFbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxNjAweDEyMDBEYXRhXzFbXSA9CiB7ICAgICAgLyogOztbeWNjaGVuXSAxMi8wNS8wMiBMQ0RIVHhMQ0RWVD0yMDQ4eDEzMjAgKi8KICAgICAgICAgeyAgICAgICAgMTA4OCw1MjAsMjA0OCwxMzIwICAgICAgfSwvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgMTA4OCw0NzAsMjA0OCwxMzIwICAgICAgfSwvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjE4NCw3ICsyMTU1LDcgQEAKICAgICAgICAgeyAgICAgICAgMjA0OCwxMzIwLDIwNDgsMTMyMCAgICAgfSAvKiAwOSAoMTYwMHgxMjAwKSAqLwogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTTm9TY2FsaW5nRGF0YVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEU05vU2NhbGluZ0RhdGFbXSA9CiB7CiAgICAgICAgIHsgICAgICAgIDgwMCw0NDksODAwLDQ0OSAgICAgICAgICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgICAgODAwLDQ0OSw4MDAsNDQ5ICAgICAgICAgICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yMTk5LDcgKzIxNzAsNyBAQAogICAgICAgICB7ICAgICAgICAxNjg4LDgwNiwxNjg4LDgwNiAgICAgICAgICAgfSAgLyogMEEgKDEyODB4NzY4eDYwSHopICovCiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMDI0eDc2OERhdGFfMXg3NVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEwMjR4NzY4RGF0YV8xeDc1W10gPQogewogCXs5NjAsNDM4LDEzMTIsODAwICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezk2MCwzODgsMTMxMiw4MDAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yMjExLDcgKzIxODIsNyBAQAogfTsKIAogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMDI0eDc2OERhdGFfMng3NVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEwMjR4NzY4RGF0YV8yeDc1W10gPQogewogICAgICAgICB7MTMxMiw4MDAsMTMxMiw4MDB9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7MTMxMiw4MDAsMTMxMiw4MDB9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yMjIyLDcgKzIxOTMsNyBAQAogICAgICAgICB7MTMxMiw4MDAsMTMxMiw4MDB9LCAvKiA7IDA2ICg1MTJ4Mzg0LDEwMjR4NzY4KSAqLwogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTI4MHgxMDI0RGF0YV8xeDc1W109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTI4MHgxMDI0RGF0YV8xeDc1W10gPQogewogICAgICAgICB7MTA0OCw0NDIsMTY4OCwxMDY2ICB9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7MTA0OCwzOTIsMTY4OCwxMDY2ICB9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yMjM0LDcgKzIyMDUsNyBAQAogICAgICAgICB7MTY4OCwxMDY2LDE2ODgsMTA2NiB9LCAvKiA7IDA2OyAwNyAoNjQweDUxMiwxMjgweDEwMjQpICovCiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMjgweDEwMjREYXRhXzJ4NzVbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMjgweDEwMjREYXRhXzJ4NzVbXSA9CiB7CiAgICAgICAgIHsxNjg4LDEwNjYsMTY4OCwxMDY2IH0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxNjg4LDEwNjYsMTY4OCwxMDY2IH0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIyNDYsNyArMjIxNyw3IEBACiAgICAgICAgIHsxNjg4LDEwNjYsMTY4OCwxMDY2IH0sIC8qIDsgMDY7IDA3ICg2NDB4NTEyLDEyODB4MTAyNCkgKi8KIH07CiAKLVhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEU05vU2NhbGluZ0RhdGF4NzVbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFNOb1NjYWxpbmdEYXRheDc1W10gPQogewogICAgICAgICB7ODAwLDQ0OSw4MDAsNDQ5ICAgICB9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ODAwLDQ0OSw4MDAsNDQ5ICAgICB9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yMjYxLDcgKzIyMzIsNyBAQAogICAgICAgICB7MTY4OCw4MDYsMTY4OCw4MDYgICB9LCAvKiA7IDBBICgxMjgweDc2OHg3NUh6KSAqLwogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTAyNHg3NjhEZXNfMVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEwMjR4NzY4RGVzXzFbXSA9CiB7CiAJeyAgICAgIDAsMTA0OCwgICAwLCA3NzEgICAgIH0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ICAgICAgMCwxMDQ4LCAgIDAsIDc3MSAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIyNzIsNyArMjI0Myw3IEBACiAgICAgICAgIHsgICAgICAwLDEwNDgsIDgwNSwgNzcwICAgICB9ICAvKiAwNiAoMTAyNHg3Njh4NjBIeikgKi8KIH0gOwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMDI0eDc2OERlc18yW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTAyNHg3NjhEZXNfMltdID0KIHsKICAgICAJeyAgICAgIDExNDIsIDg1NiwgNjIyLCA1ODcgICAgIH0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ICAgICAgMTE0MiwgODU2LCA1OTcsIDU2MiAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIyODMsNyArMjI1NCw3IEBACiAgICAgICAgIHsgICAgICAgICAwLDEwNDgsIDgwNSwgNzcxICAgICB9ICAvKiAwNiAoMTAyNHg3Njh4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEwMjR4NzY4RGVzXzNbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMDI0eDc2OERlc18zW10gPQogewogICAgIAl7ICAgICAgIDMyMCwgIDI0LCA2MjIsIDU4NyAgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAgMzIwLCAgMjQsIDU5NywgNTYyICAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjI5Miw3ICsyMjYzLDcgQEAKICAgICAgICAgeyAgICAgICAzMjAsICAyNCwgNzIyLCA2ODcgICAgIH0gIC8qIDA0ICg2NDB4NDgweDYwSHopICovCiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMjgweDEwMjREZXNfMVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEyODB4MTAyNERlc18xW10gPQogewogICAgIAl7ICAgICAgMCwxMzI4LCAgICAwLCAxMDI1ICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDAsMTMyOCwgICAgMCwgMTAyNSAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIzMDUsNyArMjI3Niw3IEBACiB9OwogCiAgLyogVGhlIERpc3BsYXkgc2V0dGluZyBmb3IgREUgTW9kZSBQYW5lbCAqLwotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTI4MHgxMDI0RGVzXzJbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMjgweDEwMjREZXNfMltdID0KIHsKICAgICAJeyAgICAgIDEzNjgsMTAwOCw3NTIsNzExICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDEzNjgsMTAwOCw3MjksNjg4ICAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjMxNyw3ICsyMjg4LDcgQEAKICAgICAgICAgeyAgICAgIDAwMDAsMTMyOCwwLDEwMjUgICAgIH0gIC8qIDA3ICgxMjgweDEwMjR4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzE0MDB4MTA1MERlc18xW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTQwMHgxMDUwRGVzXzFbXSA9CiB7CiAgICAgCXsgICAgICAwLDE0NDgsMCwxMDUxICAgICB9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgeyAgICAgIDAsMTQ0OCwwLDEwNTEgICAgIH0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yMzMwLDcgKzIzMDEsNyBAQAogICAgICAgICB7ICAgICAgMCwxNDQ4LDAsMTA1MSAgICAgfSAgLyogMDggKDE0MDB4MTA1MHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTQwMHgxMDUwRGVzXzJbXT0KK3N0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxNDAweDEwNTBEZXNfMltdID0KIHsKICAgICAJeyAgICAgIDEzMDgsMTA2OCwgNzgxLCA3NjYgICAgIH0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogICAgICAgICB7ICAgICAgMTMwOCwxMDY4LCA3ODEsIDc2NiAgICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIzNDMsNyArMjMxNCw3IEBACiAgICAgICAgIHsgICAgICAwLDE0NDgsMCwxMDUxICAgICB9ICAvKiAwOCAoMTQwMHgxMDUweDYwSHopICovCiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxNjAweDEyMDBEZXNfMVtdPQorc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzE2MDB4MTIwMERlc18xW10gPQogewogICAgIAl7ICAgICAgMCwxNjY0LDAsMTIwMSAgICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgICAwLDE2NjQsMCwxMjAxICAgICB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjM1OSw3ICsyMzMwLDcgQEAKIAogCiAKLVhHSTMzMF9MQ0REYXRhRGVzU3RydWN0MiAgWEdJX0xWRFNOb1NjYWxpbmdEZXNEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QyICBYR0lfTFZEU05vU2NhbGluZ0Rlc0RhdGFbXSA9CiB7CiAgICAgCXsgICAgIDAsIDY0OCwgNDQ4LCA0MDUsICA5NiwgICAyICAgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsgICAgIDAsIDY0OCwgNDQ4LCAzNTUsICA5NiwgICAyICAgfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIzNzQsNyArMjM0NSw3IEBACiAgICAgICAgIHsgICAgIDAsMTMyOCwwLDA3NzEsIDExMiwgICA2ICAgfSAgLyogMEEgKDEyODB4NzY4eDYwSHopICovCiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMDI0eDc2OERlc18xeDc1W109CQkJLyogOyAxMDI0eDc2OCBGdWxsLXNjcmVlbiAqLworc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEwMjR4NzY4RGVzXzF4NzVbXSA9CQkJLyogOyAxMDI0eDc2OCBGdWxsLXNjcmVlbiAqLwogewogICAgICAgICB7MCwxMDQwLDAsNzY5fSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezAsMTA0MCwwLDc2OX0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIzODUsNyArMjM1Niw3IEBACiAgICAgICAgIHswLDEwNDAsMCw3Njl9IC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCiB9OwogCi1YR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgWEdJX0xWRFMxMDI0eDc2OERlc18yeDc1W109IC8qIDsgMTAyNHg3NjggY2VudGVyLXNjcmVlbiAoRW5oLiBNb2RlKSAqLworc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEwMjR4NzY4RGVzXzJ4NzVbXSA9IC8qIDsgMTAyNHg3NjggY2VudGVyLXNjcmVlbiAoRW5oLiBNb2RlKSAqLwogewogICAgICAgICB7MTE0MiwgODU2LDYyMiw1ODcgfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxMTQyLCA4NTYsNTk3LDU2MiB9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjM5Niw3ICsyMzY3LDcgQEAKICAgICAgICAgeyAgIDAsMTA0OCw4MDUsNzcxIH0gIC8qIDA2ICgxMDI0eDc2OHg2MEh6KSAqLwogfTsKIAotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTAyNHg3NjhEZXNfM3g3NVtdPSAvKiA7IDEwMjR4NzY4IGNlbnRlci1zY3JlZW4gKFN0Lk1vZGUpICovCitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTAyNHg3NjhEZXNfM3g3NVtdID0gLyogOyAxMDI0eDc2OCBjZW50ZXItc2NyZWVuIChTdC5Nb2RlKSAqLwogewogICAgICAgICB7MzIwLDI0LDYyMiw1ODcgIH0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHszMjAsMjQsNTk3LDU2MiAgfSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjQwNSw3ICsyMzc2LDcgQEAKICAgICAgICAgezMyMCwyNCw3MjIsNjg3ICB9IC8qIDsgMDQgKDY0MHg0ODB4NjBIeikgKi8KIH07CiAKLVhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEyODB4MTAyNERlc18xeDc1W109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTI4MHgxMDI0RGVzXzF4NzVbXSA9CiB7CiAgICAgICAgIHswLDEyOTYsMCwxMDI1fSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICAgezAsMTI5NiwwLDEwMjV9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0yNDE4LDcgKzIzODksNyBAQAogfTsKIAogLyogVGhlIERpc3BsYXkgc2V0dGluZyBmb3IgREUgTW9kZSBQYW5lbCAqLwotWEdJMzMwX0xWRFNEYXRhU3RydWN0IFhHSV9MVkRTMTI4MHgxMDI0RGVzXzJ4NzVbXT0gICAvKiBbeWNjaGVuXSAwMi8xOC8wMyBTZXQgREUgYXMgZGVmYXVsdCAqLworc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCBYR0lfTFZEUzEyODB4MTAyNERlc18yeDc1W10gPSAgIC8qIFt5Y2NoZW5dIDAyLzE4LzAzIFNldCBERSBhcyBkZWZhdWx0ICovCiB7CiAgICAgICAgIHsxMzY4LDk3Niw3NTIsNzExIH0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAgICAgICAgIHsxMzY4LDk3Niw3MjksNjg4IH0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTI0MzAsNyArMjQwMSw3IEBACiAgICAgICAgIHswLDEyOTYsMCwxMDI1ICAgIH0gLyogOyAwNyAoMTI4MHgxMDI0eDc1SHopICovCiB9OwogCi1YR0kzMzBfTENERGF0YURlc1N0cnVjdDIgWEdJX0xWRFNOb1NjYWxpbmdEZXNEYXRheDc1W109ICAvKiBTY2FsaW5nIExDRCA3NUh6ICovCitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QyIFhHSV9MVkRTTm9TY2FsaW5nRGVzRGF0YXg3NVtdID0gIC8qIFNjYWxpbmcgTENEIDc1SHogKi8KIHsKICAgICAgICB7IDAsNjQ4LDQ0OCw0MDUsOTYsMiAgfSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KICAgICAgICB7IDAsNjQ4LDQ0OCwzNTUsOTYsMiAgfSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwpAQCAtMjQ0NSw3ICsyNDE2LDcgQEAKICAgICAgICB7IDAsMTMyOCwwLDc3MSwxMTIsNiAgfSAgLyogOyAwQSAoMTI4MHg3Njh4NzVIeikgKi8KIH07CiAKLVhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJMzMwX0xWRFM2NDB4NDgwRGF0YV8xW109CitzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0kzMzBfTFZEUzY0MHg0ODBEYXRhXzFbXSA9CiB7CiAgezgwMCwgNDQ5LCA4MDAsIDQ0OX0sCiAgezgwMCwgNDQ5LCA4MDAsIDQ0OX0sCkBAIC0yNDU4LDcgKzI0MjksNyBAQAogIHsxMDU2LCA2MjgsMTA1NiwgNjI4fQogfTsKIAotWEdJMzMwX0NIVFZEYXRhU3RydWN0ICBYR0lfQ0hUVlVOVFNDRGF0YVtdPQorc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAgWEdJX0NIVFZVTlRTQ0RhdGFbXSA9CiB7CiAgezg0MCwgNjAwLCA4NDAsIDYwMH0sCiAgezg0MCwgNjAwLCA4NDAsIDYwMH0sCkBAIC0yNDY4LDcgKzI0MzksNyBAQAogIHsxMDY0LCA3NTAsMTA2NCwgNzUwfQogfTsKIAotWEdJMzMwX0NIVFZEYXRhU3RydWN0ICBYR0lfQ0hUVk9OVFNDRGF0YVtdPQorc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAgWEdJX0NIVFZPTlRTQ0RhdGFbXSA9CiB7CiAgezg0MCwgNTI1LCA4NDAsIDUyNX0sCiAgezg0MCwgNTI1LCA4NDAsIDUyNX0sCkBAIC0yNDc4LDcgKzI0NDksNyBAQAogIHsxMDQwLCA3MDAsMTA0MCwgNzAwfQogfTsKIAotWEdJMzMwX0NIVFZEYXRhU3RydWN0ICBYR0lfQ0hUVlVQQUxEYXRhW109CitzdHJ1Y3QgWEdJMzMwX0NIVFZEYXRhU3RydWN0ICBYR0lfQ0hUVlVQQUxEYXRhW10gPQogewogIHsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKICB7MTAwOCwgNjI1LDEwMDgsIDYyNX0sCkBAIC0yNDg4LDcgKzI0NTksNyBAQAogIHs5MzYsIDgzNiwgOTM2LCA4MzZ9CiB9OwogCi1YR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgIFhHSV9DSFRWT1BBTERhdGFbXT0KK3N0cnVjdCBYR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgIFhHSV9DSFRWT1BBTERhdGFbXSA9CiB7CiAgezEwMDgsIDYyNSwxMDA4LCA2MjV9LAogIHsxMDA4LCA2MjUsMTAwOCwgNjI1fSwKQEAgLTI0OTgsNyArMjQ2OSw3IEBACiAgezk2MCwgNzUwLCA5NjAsIDc1MH0KIH07CiAKLVhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0ICBYR0lfTFZEU0NSVDExMDI0eDc2OF8xX0hbXT0KK3N0cnVjdCBYR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCAgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMV9IW10gPQogewogCSAgICAgICAgLyogQ1IwMCxDUjAyLENSMDMsQ1IwNCxDUjA1LFNSMEIsU1IwQyxTUjBFICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDRCLDB4MjcsMHg4RiwweDMyLDB4MUIsMHgwMCwweDQ1LDB4MDAgfX0sIC8qIDAwICgzMjB4KSAqLwpAQCAtMjUxMSw3ICsyNDgyLDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4QTMsMHg3RiwweDg3LDB4ODYsMHg5NywweDAwLDB4MDIsMHgwMCB9fSAvKiAwNyAoMTAyNHgpICovCiB9OwogCi1YR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCAgWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzFfSFtdPQorc3RydWN0IFhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0ICBYR0lfTFZEU0NSVDExMjgweDEwMjRfMV9IW10gPQogewogCQkvKiBDUjAwLENSMDIsQ1IwMyxDUjA0LENSMDUsU1IwQixTUjBDLFNSMEUgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NTYsMHgyNywweDlBLDB4MzAsMHgxRSwweDAwLDB4MDUsMHgwMCB9fSwgLyogMDAgKDMyMHgpICovCkBAIC0yNTI1LDcgKzI0OTYsNyBAQAogICAgICAgICAgICAgICAgIHt7ICAgICAgMHhDRSwweDlGLDB4OTIsMHhBOCwweDE2LDB4MDAsMHgwNywweDAwIH19IC8qIDA4ICgxMjgweCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0ICBYR0lfTFZEU0NSVDExMDI0eDc2OF8yX0hbXT0KK3N0cnVjdCBYR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCAgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMl9IW10gPQogewogCQkvKiBDUjAwLENSMDIsQ1IwMyxDUjA0LENSMDUsU1IwQixTUjBDLFNSMEUgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NjMsMHgyNywweDg3LDB4M0IsMHg4QywweDAwLDB4MDEsMHgwMCB9fSwgLyogMDAgKDMyMHgpICovCkBAIC0yNTM4LDcgKzI1MDksNyBAQAogICAgICAgICAgICAgICAgIHt7ICAgICAgMHhBMywweDdGLDB4ODcsMHg4NiwweDk3LDB4MDAsMHgwMiwweDAwIH19IC8qIDA3ICgxMDI0eCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0ICBYR0lfTFZEU0NSVDExMjgweDEwMjRfMl9IW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgIFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yX0hbXSA9CiB7CiAgICAgICAgICAgICAgICAgLyogQ1IwMCxDUjAyLENSMDMsQ1IwNCxDUjA1LFNSMEIsU1IwQyxTUjBFICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDdFLDB4M0IsMHg5QSwweDQ0LDB4MTIsMHgwMCwweDAxLDB4MDAgfX0sIC8qIDAwICgzMjB4KSAqLwpAQCAtMjU1Miw3ICsyNTIzLDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4Q0UsMHg5RiwweDkyLDB4QTgsMHgxNiwweDAwLDB4MDcsMHgwMCB9fSAvKiAwOCAoMTI4MHgpICovCiB9OwogCi1YR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExNDAweDEwNTBfMV9IW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTQwMHgxMDUwXzFfSFtdID0KIHsgICAgICAgICAgICAgICAvKiBDUjAwLENSMDIsQ1IwMyxDUjA0LENSMDUsU1IwQixTUjBDLFNSMEUgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NDcsMHgyNywweDhCLDB4MkMsMHgxQSwweDAwLDB4MDUsMHgwMCB9fSwgLyogMDAgKDMyMHgpICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDQ3LDB4MjcsMHg4QiwweDMwLDB4MUUsMHgwMCwweDA1LDB4MDAgfX0sIC8qIDAxICgzNjB4KSAqLwpAQCAtMjU2Niw3ICsyNTM3LDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4Q0UsMHhBRSwweDkyLDB4QjMsMHgwMSwweDAwLDB4MDMsMHgwMCB9fSAvKiAwOSAoMTQwMHgpICovCiB9OwogCi1YR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExNDAweDEwNTBfMl9IW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTQwMHgxMDUwXzJfSFtdID0KIHsgICAgICAgICAgICAgICAvKiBDUjAwLENSMDIsQ1IwMyxDUjA0LENSMDUsU1IwQixTUjBDLFNSMEUgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NzYsMHgzRiwweDgzLDB4NDUsMHg4QywweDAwLDB4NDEsMHgwMCB9fSwgLyogMDAgKDMyMHgpICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDc2LDB4M0YsMHg4MywweDQ1LDB4OEMsMHgwMCwweDQxLDB4MDAgfX0sIC8qIDAxICgzNjB4KSAqLwpAQCAtMjU4MCw3ICsyNTUxLDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4Q0UsMHhBRSwweDkyLDB4QkMsMHgwQSwweDAwLDB4MDMsMHgwMCB9fSAvKiAwOSAoMTQwMHgpICovCiB9OwogCi1YR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExNjAweDEyMDBfMV9IW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTYwMHgxMjAwXzFfSFtdID0KIC8qIDszMDJsdiBjaGFubmVsQSBbeWNjaGVuXSAxMi8wNS8wMiBMQ0RIVD0yMDQ4ICovCiB7ICAgLyogOyBDUjAwLENSMDIsQ1IwMyxDUjA0LENSMDUsU1IwQixTUjBDLFNSMEUgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NUIsMHgyNywweDlGLDB4MzIsMHgwQSwweDAwLDB4MDEsMHgwMCB9fSwvKiAwMCAoMzIweCkgKi8KQEAgLTI1OTYsNyArMjU2Nyw3IEBACiAJCXt7ICAgICAgMHhGQiwweEM3LDB4OUYsMHhDOSwweDgxLDB4MDAsMHgwNywweDAwIH19IC8qIDBBICgxNjAweCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzFfVltdPQorc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzFfVltdID0KIHsgICAgICAgICAgICAgICAvKiBDUjA2LENSMDcsQ1IxMCxDUjExLENSMTUsQ1IxNixTUjBBK0NSMDkoNS0+NykgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4OTcsMHgxRiwweDYwLDB4ODcsMHg1RCwweDgzLDB4MTAgICAgICB9fSwgLyogMDAgKHgzNTApICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweEI0LDB4MUYsMHg5MiwweDg5LDB4OEYsMHhCNSwweDMwICAgICAgfX0sIC8qIDAxICh4NDAwKSAqLwpAQCAtMjYwNSw3ICsyNTc2LDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4MjQsMHhGNSwweDAyLDB4ODgsMHhGRiwweDI1LDB4OTAgICAgICB9fSAvKiAwNCAoeDc2OCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzJfVltdPQorc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzJfVltdID0KIHsgICAgICAgICAgICAgICAvKiBDUjA2LENSMDcsQ1IxMCxDUjExLENSMTUsQ1IxNixTUjBBICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDI0LDB4QkIsMHgzMSwweDg3LDB4NUQsMHgyNSwweDMwICAgICAgfX0sIC8qIDAwICh4MzUwKSAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHgyNCwweEJCLDB4NEEsMHg4MCwweDhGLDB4MjUsMHgzMCAgICAgIH19LCAvKiAwMSAoeDQwMCkgKi8KQEAgLTI2MTQsNyArMjU4NSw3IEBACiAgICAgICAgICAgICAgICAge3sgICAgICAweDI0LDB4RjUsMHgwMiwweDg4LDB4RkYsMHgyNSwweDkwICAgICAgfX0gLyogMDQgKHg3NjgpICovCiB9OwogCi1YR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExMjgweDEwMjRfMV9WW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzFfVltdID0KIHsgICAgICAgICAgICAgICAvKiBDUjA2LENSMDcsQ1IxMCxDUjExLENSMTUsQ1IxNixTUjBBICovCiAgICAgICAgICAgICAgICAge3sgICAgICAgMHg4NiwweDFGLDB4NUUsMHg4MiwweDVELDB4ODcsMHgwMCAgICAgfX0sIC8qIDAwICh4MzUwKSAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgIDB4QjgsMHgxRiwweDkwLDB4ODQsMHg4RiwweEI5LDB4MzAgICAgIH19LCAvKiAwMSAoeDQwMCkgKi8KQEAgLTI2MjQsNyArMjU5NSw3IEBACiAgICAgICAgICAgICAgICAge3sgICAgICAgMHgyOCwweDVBLDB4MTMsMHg4NywweEZGLDB4MjksMHhBOSAgICAgfX0gLyogMDUgKHgxMDI0KSAqLwogfTsKIAotWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzJfVltdPQorc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yX1ZbXSA9CiB7ICAgICAgICAgICAgICAgLyogQ1IwNixDUjA3LENSMTAsQ1IxMSxDUjE1LENSMTYsU1IwQSAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHgyOCwweEQyLDB4QUYsMHg4MywweEFFLDB4RDgsMHhBMSAgICAgIH19LCAvKiAwMCAoeDM1MCkgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4MjgsMHhEMiwweEM4LDB4OEMsMHhDNywweEYyLDB4ODEgICAgICB9fSwgLyogMDEgKHg0MDApICovCkBAIC0yNjM0LDcgKzI2MDUsNyBAQAogICAgICAgICAgICAgICAgIHt7ICAgICAgMHgyOCwweDVBLDB4MTMsMHg4NywweEZGLDB4MjksMHhBOSAgICAgIH19IC8qIDA1ICh4MTAyNCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTE0MDB4MTA1MF8xX1ZbXT0KK3N0cnVjdCBYR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExNDAweDEwNTBfMV9WW10gPQogeyAgICAgICAgICAgICAgIC8qIENSMDYsQ1IwNyxDUjEwLENSMTEsQ1IxNSxDUjE2LFNSMEEgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4NkMsMHgxRiwweDYwLDB4ODQsMHg1RCwweDZELDB4MTAgICAgICB9fSwgLyogMDAgKHgzNTApICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDlFLDB4MUYsMHg5MywweDg2LDB4OEYsMHg5RiwweDMwICAgICAgfX0sIC8qIDAxICh4NDAwKSAqLwpAQCAtMjY0NSw3ICsyNjE2LDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4MjgsMHgxMCwweDFBLDB4ODAsMHgxOSwweDI5LDB4MEYgICAgICB9fSAvKiAwNiAoeDEwNTApICovCiB9OwogCi1YR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExNDAweDEwNTBfMl9WW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTQwMHgxMDUwXzJfVltdID0KIHsgICAgICAgICAgICAgIC8qIENSMDYsQ1IwNyxDUjEwLENSMTEsQ1IxNSxDUjE2LFNSMEEgKi8KICAgICAgICAgICAgICAgICB7eyAgICAgIDB4MjgsMHg5MiwweEI2LDB4ODMsMHhCNSwweENGLDB4ODEgICAgICB9fSwgLyogMDAgKHgzNTApICovCiAgICAgICAgICAgICAgICAge3sgICAgICAweDI4LDB4OTIsMHhENSwweDgyLDB4RDQsMHhFRSwweDgxICAgICAgfX0sIC8qIDAxICh4NDAwKSAqLwpAQCAtMjY1Niw3ICsyNjI3LDcgQEAKICAgICAgICAgICAgICAgICB7eyAgICAgIDB4MjgsMHgxMCwweDFBLDB4ODcsMHgxOSwweDI5LDB4OEYgICAgICB9fSAvKiAwNiAoeDEwNTApICovCiB9OwogCi1YR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExNjAweDEyMDBfMV9WW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTYwMHgxMjAwXzFfVltdID0KIHsKICAgICAgICAgICAgICAgIC8qIENSMDYsQ1IwNyxDUjEwLENSMTEsQ1IxNSxDUjE2LFNSMEErQ1IwOSg1LT43KSAqLwogICAgICAgICAgICAgICAgIHt7ICAgICAgMHhkNCwweDFGLDB4ODEsMHg4NCwweDVELDB4ZDUsMHgxMCAgICAgIH19LCAvKiAwMCAoeDM1MCkgKi8KQEAgLTI2NjksNyArMjY0MCw3IEBACiAgICAgICAgICAgICAgICAge3sgICAgICAweDI2LDB4MTEsMHhkMywweDg2LDB4YUYsMHgyNywweDNmICAgICAgfX0gLyogMDcgKHgxMjAwKSAqLwogfTsKIAotWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMV9IeDc1W109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMV9IeDc1W10gPQogeyAJLyogQ1IwMCxDUjAyLENSMDMsQ1IwNCxDUjA1LFNSMEIsU1IwQyxTUjBFICovCiAgICAge3sgICAgICAweDRCLDB4MjcsMHg4RiwweDMyLDB4MUIsMHgwMCwweDQ1LDB4MDAgfX0sLyogOyAwMCAoMzIweCkgKi8KICAgICB7eyAgICAgIDB4NEIsMHgyNywweDhGLDB4MkIsMHgwMywweDAwLDB4NDQsMHgwMCB9fSwvKiA7IDAxICgzNjB4KSAqLwpAQCAtMjY4MSw3ICsyNjUyLDcgQEAKICAgICB7eyAgICAgIDB4OUYsMHg3RiwweDgzLDB4ODUsMHg5MSwweDAwLDB4MDIsMHgwMCB9fSAvKiA7IDA3ICgxMDI0eCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzFfVng3NVtdPQorc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzFfVng3NVtdID0KIHsJLyogQ1IwNixDUjA3LENSMTAsQ1IxMSxDUjE1LENSMTYsU1IwQStDUjA5KDUtPjcpICovCiAgICAge3sgICAgICAweDk3LDB4MUYsMHg2MCwweDg3LDB4NUQsMHg4MywweDEwICAgICAgfX0sLyogOyAwMCAoeDM1MCkgKi8KICAgICB7eyAgICAgIDB4QjQsMHgxRiwweDkyLDB4ODksMHg4RiwweEI1LDB4MzAgICAgICB9fSwvKiA7IDAxICh4NDAwKSAqLwpAQCAtMjY5MCw3ICsyNjYxLDcgQEAKICAgICB7eyAgICAgIDB4MUUsMHhGNSwweDAwLDB4ODMsMHhGRiwweDFGLDB4OTAgICAgICB9fSAvKiA7IDA0ICh4NzY4KSAqLwogfTsKIAotWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMl9IeDc1W109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMl9IeDc1W10gPQogeyAgICAgICAvKiBDUjAwLENSMDIsQ1IwMyxDUjA0LENSMDUsU1IwQixTUjBDLFNSMEUgKi8KICAgICB7eyAgICAgIDB4NjMsMHgyNywweDg3LDB4M0IsMHg4QywweDAwLDB4MDEsMHgwMCB9fSwvKiA7IDAwICgzMjB4KSAqLwogICAgIHt7ICAgICAgMHg2MywweDI3LDB4ODcsMHgzQiwweDhDLDB4MDAsMHgwMSwweDAwIH19LC8qIDsgMDEgKDM2MHgpICovCkBAIC0yNzAyLDcgKzI2NzMsNyBAQAogICAgIHt7ICAgICAgMHhBMywweDdGLDB4ODcsMHg4NiwweDk3LDB4MDAsMHgwMiwweDAwIH19IC8qIDsgMDcgKDEwMjR4KSAqLwogfTsKIAotWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMl9WeDc1W109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTAyNHg3NjhfMl9WeDc1W10gPQogeyAgICAgICAvKiBDUjA2LENSMDcsQ1IxMCxDUjExLENSMTUsQ1IxNixTUjBBICovCiAgICAge3sgICAgICAweDI0LDB4QkIsMHgzMSwweDg3LDB4NUQsMHgyNSwweDMwICAgICAgfX0sLyogOyAwMCAoeDM1MCkgKi8KICAgICB7eyAgICAgIDB4MjQsMHhCQiwweDRBLDB4ODAsMHg4RiwweDI1LDB4MzAgICAgICB9fSwvKiA7IDAxICh4NDAwKSAqLwpAQCAtMjcxMSw3ICsyNjgyLDcgQEAKICAgICB7eyAgICAgIDB4MjQsMHhGNSwweDAyLDB4ODgsMHhGRiwweDI1LDB4OTAgICAgICB9fSAvKiA7IDA0ICh4NzY4KSAqLwogfTsKIAotWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzFfSHg3NVtdPQorc3RydWN0IFhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8xX0h4NzVbXSA9CiB7ICAgICAgLyogQ1IwMCxDUjAyLENSMDMsQ1IwNCxDUjA1LFNSMEIsU1IwQyxTUjBFICovCiAgICAge3sgICAgICAweDU2LDB4MjcsMHg5QSwweDMwLDB4MUUsMHgwMCwweDA1LDB4MDAgfX0sLyogOyAwMCAoMzIweCkgKi8KICAgICB7eyAgICAgIDB4NTYsMHgyNywweDlBLDB4MzAsMHgxRSwweDAwLDB4MDUsMHgwMCB9fSwvKiA7IDAxICgzNjB4KSAqLwpAQCAtMjcyNCw3ICsyNjk1LDcgQEAKICAgICB7eyAgICAgIDB4Q0UsMHg5RiwweDkyLDB4QTUsMHgxNywweDAwLDB4MDcsMHgwMCB9fSAvKiA7IDA4ICgxMjgweCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8xX1Z4NzVbXT0KK3N0cnVjdCBYR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExMjgweDEwMjRfMV9WeDc1W10gPQogewkvKiBDUjA2LENSMDcsQ1IxMCxDUjExLENSMTUsQ1IxNixTUjBBICovCiAgICAge3sgICAgICAweDg2LDB4RDEsMHhCQywweDgwLDB4QkIsMHhFNSwweDAwICAgICAgfX0sLyogOyAwMCAoeDM1MCkgKi8KICAgICB7eyAgICAgIDB4QjgsMHgxRiwweDkwLDB4ODQsMHg4RiwweEI5LDB4MzAgICAgICB9fSwvKiA7IDAxICh4NDAwKSAqLwpAQCAtMjczNCw3ICsyNzA1LDcgQEAKICAgICB7eyAgICAgIDB4MjgsMHg1QSwweDEzLDB4ODcsMHhGRiwweDI5LDB4QTkgICAgICB9fSAvKiA7IDA1ICh4MTAyNCkgKi8KIH07CiAKLVhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yX0h4NzVbXT0KK3N0cnVjdCBYR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCBYR0lfTFZEU0NSVDExMjgweDEwMjRfMl9IeDc1W10gPQogewogCS8qIENSMDAsQ1IwMixDUjAzLENSMDQsQ1IwNSxTUjBCLFNSMEMsU1IwRSAqLwogICAgIHt7ICAgICAgMHg3RSwweDNCLDB4OUEsMHg0NCwweDEyLDB4MDAsMHgwMSwweDAwIH19LC8qIDsgMDAgKDMyMHgpICovCkBAIC0yNzQ4LDcgKzI3MTksNyBAQAogICAgIHt7ICAgICAgMHhDRSwweDlGLDB4OTIsMHhBOCwweDE2LDB4MDAsMHgwNywweDAwIH19IC8qIDsgMDggKDEyODB4KSAqLwogfTsKIAotWEdJX0xWRFNDUlQxVkRhdGFTdHJ1Y3QgWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzJfVng3NVtdPQorc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0IFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yX1Z4NzVbXSA9CiB7CiAgICAgICAgIC8qIENSMDYsQ1IwNyxDUjEwLENSMTEsQ1IxNSxDUjE2LFNSMEEgKi8KICAgICAge3sgICAgIDB4MjgsMHhEMiwweEFGLDB4ODMsMHhBRSwweEQ4LDB4QTEgICAgIH19LC8qIDsgMDAgKHgzNTApICovCkBAIC0yNzU5LDcgKzI3MzAsNyBAQAogICAgICB7eyAgICAgMHgyOCwweDVBLDB4MTMsMHg4NywweEZGLDB4MjksMHhBOSAgICAgfX0gLyogOyAwNSAoeDEwMjQpICovCiB9OwogCi1YR0lfTFZEU0NSVDFEYXRhU3RydWN0ICBYR0lfQ0hUVkNSVDFVTlRTQ1tdPQorc3RydWN0IFhHSV9MVkRTQ1JUMURhdGFTdHJ1Y3QgIFhHSV9DSFRWQ1JUMVVOVFNDW10gPQogewogIHt7MHg2NCwweDRmLDB4ODgsMHg1NiwweDlmLDB4NTYsMHgzZSwKICAgICAweGU4LDB4ODQsMHg4ZiwweDU3LDB4MjAsMHgwMCwweDAxLDB4MDAgfX0sCkBAIC0yNzc1LDcgKzI3NDYsNyBAQAogICAgMHg5MCwweDhjLDB4NTcsMHhlZCwweDIwLDB4MDAsMHgwNiwweDAxIH19CiB9OwogCi1YR0lfTFZEU0NSVDFEYXRhU3RydWN0ICBYR0lfQ0hUVkNSVDFPTlRTQ1tdPQorc3RydWN0IFhHSV9MVkRTQ1JUMURhdGFTdHJ1Y3QgIFhHSV9DSFRWQ1JUMU9OVFNDW10gPQogewogIHt7MHg2NCwweDRmLDB4ODgsMHg1YSwweDlmLDB4MGIsMHgzZSwKICAgICAweGMwLDB4ODQsMHg4ZiwweDBjLDB4MjAsMHgwMCwweDAxLDB4MDAgfX0sCkBAIC0yNzkxLDcgKzI3NjIsNyBAQAogICAgMHg3ZiwweDg2LDB4NTcsMHhiYiwweDAwLDB4MDAsMHgwNiwweDAxIH19CiB9OwogCi1YR0lfTFZEU0NSVDFEYXRhU3RydWN0ICBYR0lfQ0hUVkNSVDFVUEFMW109CitzdHJ1Y3QgWEdJX0xWRFNDUlQxRGF0YVN0cnVjdCAgWEdJX0NIVFZDUlQxVVBBTFtdID0KIHsKICB7ezB4NzksMHg0ZiwweDlkLDB4NWEsMHg5MCwweDZmLDB4M2UsCiAgICAgMHhmOCwweDgzLDB4OGYsMHg3MCwweDIwLDB4MDAsMHgwNSwweDAwIH19LApAQCAtMjgwNyw3ICsyNzc4LDcgQEAKICAgIDB4YzgsMHg4YywweDU3LDB4ZTksMHgyMCwweDAwLDB4MDUsMHgwMSB9fQogfTsKIAotWEdJX0xWRFNDUlQxRGF0YVN0cnVjdCAgWEdJX0NIVFZDUlQxT1BBTFtdPQorc3RydWN0IFhHSV9MVkRTQ1JUMURhdGFTdHJ1Y3QgIFhHSV9DSFRWQ1JUMU9QQUxbXSA9CiB7CiAge3sweDc5LDB4NGYsMHg5ZCwweDVhLDB4OTAsMHg2ZiwweDNlLAogICAgIDB4ZjAsMHg4MywweDhmLDB4NzAsMHgyMCwweDAwLDB4MDUsMHgwMCB9fSwKQEAgLTI4MjQsNyArMjc5NSw3IEBACiB9OwogCiAvKmFkZCBmb3IgbmV3IFVOSVZHQUJJT1MqLwotWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9MQ0REYXRhVGFibGVbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgWEdJX0xDRERhdGFUYWJsZVtdID0KIHsKICAge1BhbmVsMTAyNHg3NjgsMHgwMDE5LDB4MDAwMSwwfSwgIC8qIFhHSV9FeHRMQ0QxMDI0eDc2OERhdGEgKi8KICAge1BhbmVsMTAyNHg3NjgsMHgwMDE5LDB4MDAwMCwxfSwgIC8qIFhHSV9TdExDRDEwMjR4NzY4RGF0YSAqLwpAQCAtMjg0OCw3ICsyODE5LDcgQEAKICAgezB4RkYsMHgwMDAwLDB4MDAwMCwwfSAgIAkJLyogRW5kIG9mIHRhYmxlICovCiB9OwogCi1YR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgWEdJX0xDRERlc0RhdGFUYWJsZVtdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhVGFibFN0cnVjdCBYR0lfTENERGVzRGF0YVRhYmxlW10gPQogewogICB7UGFuZWwxMDI0eDc2OCwweDAwMTksMHgwMDAxLDB9LCAvKiBYR0lfRXh0TENERGVzMTAyNHg3NjhEYXRhICovCiAgIHtQYW5lbDEwMjR4NzY4LDB4MDAxOSwweDAwMDAsMX0sIC8qIFhHSV9TdExDRERlczEwMjR4NzY4RGF0YSAqLwpAQCAtMjg3Myw3ICsyODQ0LDcgQEAKICAgezB4RkYsMHgwMDAwLDB4MDAwMCwwfQogfTsKIAotWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9FUExMQ0RDUlQxUHRyX0hbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTExDRENSVDFQdHJfSFtdID0KIHsKICAge1BhbmVsMTAyNHg3NjgsMHgwMDE4LDB4MDAwMCwwfSwgLyogWEdJX0xWRFNDUlQxMTAyNHg3NjhfMV9IICovCiAgIHtQYW5lbDEwMjR4NzY4LDB4MDAxOCwweDAwMTAsMX0sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzJfSCAqLwpAQCAtMjg4OSw3ICsyODYwLDcgQEAKICAgezB4RkYsMHgwMDAwLDB4MDAwMCwwfQogfTsKIAotWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9FUExMQ0RDUlQxUHRyX1ZbXT0KK3N0cnVjdCBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTExDRENSVDFQdHJfVltdID0KIHsKICAge1BhbmVsMTAyNHg3NjgsMHgwMDE4LDB4MDAwMCwwfSwgLyogWEdJX0xWRFNDUlQxMTAyNHg3NjhfMV9WICovCiAgIHtQYW5lbDEwMjR4NzY4LDB4MDAxOCwweDAwMTAsMX0sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzJfViAqLwpAQCAtMjkwNSw3ICsyODc2LDcgQEAKICAgezB4RkYsMHgwMDAwLDB4MDAwMCwwfQogfTsKIAotWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9FUExMQ0REYXRhUHRyW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9FUExMQ0REYXRhUHRyW10gPQogewogICB7UGFuZWwxMDI0eDc2OCwweDAwMTgsMHgwMDAwLDB9LCAvKiBYR0lfTFZEUzEwMjR4NzY4RGF0YV8xICovCiAgIHtQYW5lbDEwMjR4NzY4LDB4MDAxOCwweDAwMTAsMX0sIC8qIFhHSV9MVkRTMTAyNHg3NjhEYXRhXzIgKi8KQEAgLTI5MjMsNyArMjg5NCw3IEBACiAgIHsweEZGLDB4MDAwMCwweDAwMDAsMH0KIH07CiAKLVhHSTMzMF9MQ0REYXRhVGFibFN0cnVjdCBYR0lfRVBMTENERGVzRGF0YVB0cltdPQorc3RydWN0IFhHSTMzMF9MQ0REYXRhVGFibFN0cnVjdCBYR0lfRVBMTENERGVzRGF0YVB0cltdID0KIHsKICAge1BhbmVsMTAyNHg3NjgsMHgwMDE4LDB4MDAwMCwwfSwgLyogWEdJX0xWRFMxMDI0eDc2OERlc18xICovCiAgIHtQYW5lbDEwMjR4NzY4LDB4MDYxOCwweDA0MTAsMX0sIC8qIFhHSV9MVkRTMTAyNHg3NjhEZXNfMyAqLwpAQCAtMjk0MywxNCArMjkxNCwxNCBAQAogICB7MHhGRiwweDAwMDAsMHgwMDAwLDB9CiB9OwogCi1YR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTENITENEUmVnUHRyW109CitzdHJ1Y3QgWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9FUExDSExDRFJlZ1B0cltdID0KIHsKICAge1BhbmVsMTAyNHg3NjgsMHgwMDAwLDB4MDAwMCwwfSwgLyogWEdJX0NINzAxN0xWMTAyNHg3NjggKi8KICAge1BhbmVsMTQwMHgxMDUwLDB4MDAwMCwweDAwMDAsMX0sIC8qIFhHSV9DSDcwMTdMVjE0MDB4MTA1MCAqLwogICB7MHhGRiwweDAwMDAsMHgwMDAwLDB9CiB9OwogCi1YR0kzMzBfVFZEYXRhVGFibFN0cnVjdCBYR0lfVFZEYXRhVGFibGVbXT0KK3N0cnVjdCBYR0kzMzBfVFZEYXRhVGFibFN0cnVjdCBYR0lfVFZEYXRhVGFibGVbXSA9CiB7CiAgezB4MDlFMSwweDAwMDEsMH0sCS8qIFhHSV9FeHRQQUxEYXRhICovCiAgezB4MDlFMSwweDAwMDAsMX0sCS8qIFhHSV9FeHROVFNDRGF0YSAqLwpAQCAtMjk2OCw3ICsyOTM5LDcgQEAKICB7MHhmZmZmLDB4MDAwMCwxMn0gIAkvKiBFTkQgKi8KIH07CiAKLVVTSE9SVCBUVkxlbkxpc3RbXT0KK3Vuc2lnbmVkIHNob3J0IFRWTGVuTGlzdFtdID0KIHsKICAgIExWRFNDUlQxTGVuX0gsCiAgICBMVkRTQ1JUMUxlbl9WLApAQCAtMjk4MSw3ICsyOTUyLDcgQEAKIH0gOwogCiAvKiBDaHJvbnRlbCA3MDE3IFRWIENSVDEgVGltaW5nIExpc3QgKi8KLVhHSTMzMF9UVkRhdGFUYWJsU3RydWN0IFhHSV9FUExDSFRWQ1JUMVB0cltdPQorc3RydWN0IFhHSTMzMF9UVkRhdGFUYWJsU3RydWN0IFhHSV9FUExDSFRWQ1JUMVB0cltdID0KIHsKICAgezB4MDAxMSwweDAwMDAsMH0sIC8qIFhHSV9DSFRWQ1JUMVVOVFNDICovCiAgIHsweDAwMTEsMHgwMDEwLDF9LCAvKiBYR0lfQ0hUVkNSVDFPTlRTQyAqLwpAQCAtMjk5MSw3ICsyOTYyLDcgQEAKIH07CiAKIC8qIDs7Q2hyb250ZWwgNzAxNyBUViBUaW1pbmcgTGlzdCAqLwotWEdJMzMwX1RWRGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTENIVFZEYXRhUHRyW109CitzdHJ1Y3QgWEdJMzMwX1RWRGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTENIVFZEYXRhUHRyW10gPQogewogICB7MHgwMDExLDB4MDAwMCwwfSwgLyogWEdJX0NIVFZVTlRTQ0RhdGEgKi8KICAgezB4MDAxMSwweDAwMTAsMX0sIC8qIFhHSV9DSFRWT05UU0NEYXRhICovCkBAIC0zMDAxLDcgKzI5NzIsNyBAQAogfTsKIAogLyogOztDaHJvbnRlbCA3MDE3IFRWIFJlZy4gTGlzdCAqLwotWEdJMzMwX1RWRGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTENIVFZSZWdQdHJbXT0KK3N0cnVjdCBYR0kzMzBfVFZEYXRhVGFibFN0cnVjdCBYR0lfRVBMQ0hUVlJlZ1B0cltdID0KIHsKICAgezB4MDAxMSwweDAwMDAsMH0sIC8qIFhHSV9DSFRWUmVnVU5UU0MgKi8KICAgezB4MDAxMSwweDAwMTAsMX0sIC8qIFhHSV9DSFRWUmVnT05UU0MgKi8KQEAgLTMwMTAsNyArMjk4MSw3IEBACiAgIHsweEZGRkYsMHgwMDAwLDR9CiB9OwogCi1VU0hPUlQgTENETGVuTGlzdFtdPQordW5zaWduZWQgc2hvcnQgTENETGVuTGlzdFtdID0KIHsKICAgIExWRFNDUlQxTGVuX0gsCiAgICBMVkRTQ1JUMUxlbl9WLApAQCAtMzAyNCw3ICsyOTk1LDcgQEAKICAgIDAKIH0gOwogCi1YR0kzMzBfTENEQ2FwU3RydWN0ICBYR0k2NjBfTENERExDYXBMaXN0W109ICAvKiA2NjAsIER1YWwgbGluayAqLworc3RydWN0IFhHSTMzMF9MQ0RDYXBTdHJ1Y3QgIFhHSTY2MF9MQ0RETENhcExpc3RbXSA9ICAvKiA2NjAsIER1YWwgbGluayAqLwogewogLyogTENEQ2FwMTAyNHg3NjggKi8KIAkJe1BhbmVsMTAyNHg3NjgsIERlZmF1bHRMQ0RDYXAsIDAsIDB4MDE0LCAweDg4LCAweDA2LCBWQ0xLNjUsCkBAIC0zMDU2LDcgKzMwMjcsNyBAQAogCQkweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDI4LCAweDEwfQogfTsKIAotWEdJMzMwX0xDRENhcFN0cnVjdCAgWEdJX0xDRERMQ2FwTGlzdFtdPSAgLyogRHVhbCBsaW5rIG9ubHkgKi8KK3N0cnVjdCBYR0kzMzBfTENEQ2FwU3RydWN0ICBYR0lfTENERExDYXBMaXN0W10gPSAgLyogRHVhbCBsaW5rIG9ubHkgKi8KIHsKIC8qIExDRENhcDEwMjR4NzY4ICovCiAJCXtQYW5lbDEwMjR4NzY4LCBEZWZhdWx0TENEQ2FwLCAwLCAweDAxMiwgMHg4OCwgMHgwNiwgVkNMSzY1LApAQCAtMzA4OCw3ICszMDU5LDcgQEAKIAkJMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgyOCwgMHgxMH0KIH07CiAKLVhHSTMzMF9MQ0RDYXBTdHJ1Y3QgIFhHSTY2MF9MQ0RDYXBMaXN0W109CitzdHJ1Y3QgWEdJMzMwX0xDRENhcFN0cnVjdCAgWEdJNjYwX0xDRENhcExpc3RbXSA9CiB7CiAvKiBMQ0RDYXAxMDI0eDc2OCAqLwogICAgICAgICAgICAgICAgIHtQYW5lbDEwMjR4NzY4LCBEZWZhdWx0TENEQ2FwLCAwLCAweDAxNCwgMHg4OCwgMHgwNiwgVkNMSzY1LApAQCAtMzEyMCw3ICszMDkxLDcgQEAKIAkJMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgyOCwgMHgxMH0KIH07CiAKLVhHSTMzMF9MQ0RDYXBTdHJ1Y3QgIFhHSV9MQ0RDYXBMaXN0W109CitzdHJ1Y3QgWEdJMzMwX0xDRENhcFN0cnVjdCAgWEdJX0xDRENhcExpc3RbXSA9CiB7CiAvKiBMQ0RDYXAxMDI0eDc2OCAqLwogCQl7UGFuZWwxMDI0eDc2OCwgRGVmYXVsdExDRENhcCwgMCwgMHgwMTIsIDB4ODgsIDB4MDYsIFZDTEs2NSwKQEAgLTMxNTIsNyArMzEyMyw3IEBACiAJCTB4MzAsIDB4MTAsIDB4NUEsIDB4MTAsIDB4MTAsIDB4MEEsIDB4QzAsIDB4MjgsIDB4MTB9CiB9OwogCi1YR0kyMV9MVkRTQ2FwU3RydWN0IFhHSTIxX0xDRENhcExpc3RbXT0KK3N0cnVjdCBYR0kyMV9MVkRTQ2FwU3RydWN0IFhHSTIxX0xDRENhcExpc3RbXSA9CiB7CiAgICAge0Rpc2FibGVMQ0QyNGJwcCArIExDRFBvbGFyaXR5LAogICAgICAyMTYwLDEyNTAsMTYwMCwxMjAwLCAgNjQsICAxLCAgMTkyLCAgIDMsCkBAIC0zMTgxLDcgKzMxNTIsNyBAQAogCiB9OwogCi1YR0lfRXh0MlN0cnVjdCBYR0kzMzBfUmVmSW5kZXhbXT0KK3N0cnVjdCBYR0lfRXh0MlN0cnVjdCBYR0kzMzBfUmVmSW5kZXhbXSA9CiB7CiB7U3VwcG9ydDMyQnBwICsgU3VwcG9ydEFsbENSVDIgKyBTeW5jUE4sCQkJUkVTMzIweDIwMCwJIFZDTEsyNV8xNzUsIDB4MDAsMHgxMCwweDU5LCAzMjAsIDIwMH0sLyogMDAgKi8KIHtTdXBwb3J0MzJCcHAgKyBTdXBwb3J0QWxsQ1JUMiArIFN5bmNQTiwJCQlSRVMzMjB4MjAwLAkgVkNMSzI1XzE3NSwgMHgwMCwweDEwLDB4MDAsIDMyMCwgNDAwfSwvKiAwMSAqLwpAQCAtMzI2MCw3ICszMjMxLDcgQEAKIAogCiAKLVhHSTMzMF9WQ0xLRGF0YVN0cnVjdCBYR0kzMzBfVkNMS0RhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVkNMS0RhdGFTdHJ1Y3QgWEdJMzMwX1ZDTEtEYXRhW10gPQogewogIHsgMHgxYiwweGUxLCAyNX0sIC8qIDB4MCAqLwogIHsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MSAqLwpAQCAtMzM0NCw3ICszMzE1LDcgQEAKICB7IDB4M2IsMHg2MSwxMDh9ICAvKiAweDRmICovCiB9OwogCi1YR0lfVkJWQ0xLRGF0YVN0cnVjdCBYR0kzMzBfVkJWQ0xLRGF0YVtdPQorc3RydWN0IFhHSV9WQlZDTEtEYXRhU3RydWN0IFhHSTMzMF9WQlZDTEtEYXRhW10gPQogewogIHsgMHgxYiwweGUxLCAyNX0sIC8qIDB4MCAqLwogIHsgMHg0ZSwweGU0LCAyOH0sIC8qIDB4MSAqLwpAQCAtMzQyMiw5ICszMzkzLDExIEBACiAgeyAweDcwLDB4NDQsMTA4fSwgLyogMHg0OSBjaGlhd2VuIGZvciAxNDAweDEwNTAqLwogfTsKIAotVUNIQVIgWEdJMzMwX1NjcmVlbk9mZnNldFtdPXsgMHgxNCwweDE5LDB4MjAsMHgyOCwweDMyLDB4NDAsMHg1MCwweDY0LDB4NzgsMHg4MCwweDJkLDB4MzUsMHg1NywweDQ4IH07Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9TY3JlZW5PZmZzZXRbXSA9IHsgMHgxNCwgMHgxOSwgMHgyMCwgMHgyOCwgMHgzMiwgMHg0MCwKKwkJCQkJMHg1MCwgMHg2NCwgMHg3OCwgMHg4MCwgMHgyZCwgMHgzNSwKKwkJCQkJMHg1NywgMHg0OH07CiAKLVhHSV9TdFJlc0luZm9TdHJ1Y3QgWEdJMzMwX1N0UmVzSW5mb1tdPQorc3RydWN0IFhHSV9TdFJlc0luZm9TdHJ1Y3QgWEdJMzMwX1N0UmVzSW5mb1tdID0KIHsKICB7IDY0MCw0MDB9LAogIHsgNjQwLDM1MH0sCkBAIC0zNDMzLDcgKzM0MDYsNyBAQAogIHsgNjQwLDQ4MH0KIH07CiAKLVhHSV9Nb2RlUmVzSW5mb1N0cnVjdCBYR0kzMzBfTW9kZVJlc0luZm9bXT0KK3N0cnVjdCBYR0lfTW9kZVJlc0luZm9TdHJ1Y3QgWEdJMzMwX01vZGVSZXNJbmZvW10gPQogewogIHsgIDMyMCwgMjAwLCA4LCA4fSwKICB7ICAzMjAsIDI0MCwgOCwgOH0sCkBAIC0zNDYwLDEwICszNDMzLDEwIEBACiAgeyAxMTUyLCA4NjQsIDgsMTZ9CiB9OwogCi1VQ0hBUiBYR0kzMzBfT3V0cHV0U2VsZWN0ID0weDQwOwotVUNIQVIgWEdJMzMwX1NvZnRTZXR0aW5nID0gMHgzMDsKLVVDSEFSIFhHSTMzMF9TUjA3PTB4MTg7Ci1VQ0hBUiBYR0kzMzBOZXdfU1IxNVs4XVs4XT17Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9PdXRwdXRTZWxlY3QgPSAweDQwOwordW5zaWduZWQgY2hhciBYR0kzMzBfU29mdFNldHRpbmcgPSAweDMwOwordW5zaWduZWQgY2hhciBYR0kzMzBfU1IwNyA9IDB4MTg7Cit1bnNpZ25lZCBjaGFyIFhHSTMzME5ld19TUjE1WzhdWzhdID0gewogezB4MCwweDQsMHg2MCwweDYwfSwKIHsweGYsMHhmLDB4ZiwweGZ9LAogezB4YmEsMHhiYSwweGJhLDB4YmF9LApAQCAtMzQ3NCw3ICszNDQ3LDcgQEAKIHsweDAsMHhhNSwweGZiLDB4ZjZ9CiB9OwogCi1VQ0hBUiBYR0kzMzBOZXdfQ1I0MFs1XVs4XT17Cit1bnNpZ25lZCBjaGFyIFhHSTMzME5ld19DUjQwWzVdWzhdID0gewogezB4NzcsMHg3NywweDQ0LDB4NDR9LAogezB4NzcsMHg3NywweDQ0LDB4NDR9LAogezB4MCwweDAsMHgwLDB4MH0sCkBAIC0zNDgyLDYzICszNDU1LDYzIEBACiB7MHgwLDB4MCwweGYwLDB4Zjh9CiB9OwogCi1VQ0hBUiBYR0kzMzBfQ1I0OVtdPXsweGFhLDB4ODh9OwotVUNIQVIgWEdJMzMwX1NSMUY9MHgwOwotVUNIQVIgWEdJMzMwX1NSMjE9MHhhMzsKLVVDSEFSIFhHSTMzMF82NTBfU1IyMT0weGE3OwotVUNIQVIgWEdJMzMwX1NSMjI9MHhmYjsKLVVDSEFSIFhHSTMzMF9TUjIzPTB4ZjY7Ci1VQ0hBUiBYR0kzMzBfU1IyND0weGQ7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUjQ5W10gPSB7MHhhYSwgMHg4OH07Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjFGID0gMHgwOwordW5zaWduZWQgY2hhciBYR0kzMzBfU1IyMSA9IDB4YTM7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF82NTBfU1IyMSA9IDB4YTc7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjIyID0gMHhmYjsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX1NSMjMgPSAweGY2OwordW5zaWduZWQgY2hhciBYR0kzMzBfU1IyNCA9IDB4ZDsKIAotVUNIQVIgWEdJNjYwX1NSMjE9MHhhMzsvKiAyMDAzLjAzMTIgKi8KLVVDSEFSIFhHSTY2MF9TUjIyPTB4ZjM7LyogMjAwMy4wMzEyICovCit1bnNpZ25lZCBjaGFyIFhHSTY2MF9TUjIxID0gMHhhMzsvKiAyMDAzLjAzMTIgKi8KK3Vuc2lnbmVkIGNoYXIgWEdJNjYwX1NSMjIgPSAweGYzOy8qIDIwMDMuMDMxMiAqLwogCi1VQ0hBUiBYR0kzMzBfTFZEU19TUjMyPTB4MDA7ICAgLyogeW5sYWkgZm9yIDY1MCBMVkRTICovCi1VQ0hBUiBYR0kzMzBfTFZEU19TUjMzPTB4MDA7CS8qIGNoaWF3ZW4gZm9yIDY1MCBMVkRTICovCi1VQ0hBUiBYR0kzMzBfNjUwX1NSMzE9MHg0MDsKLVVDSEFSIFhHSTMzMF82NTBfU1IzMz0weDA0OwotVUNIQVIgWEdJMzMwX0NSVDJEYXRhXzFfMiA9IDB4MDsKLVVDSEFSIFhHSTMzMF9DUlQyRGF0YV80X0QgPSAweDA7Ci1VQ0hBUiBYR0kzMzBfQ1JUMkRhdGFfNF9FID0gMHgwOwotVUNIQVIgWEdJMzMwX0NSVDJEYXRhXzRfMTAgPSAweDgwOwotVVNIT1JUIFhHSTMzMF9SR0JTZW5zZURhdGEgPSAweGQxOwotVVNIT1JUIFhHSTMzMF9WaWRlb1NlbnNlRGF0YSA9IDB4Yjk7Ci1VU0hPUlQgWEdJMzMwX1lDU2Vuc2VEYXRhID0gMHhiMzsKLVVTSE9SVCBYR0kzMzBfUkdCU2Vuc2VEYXRhMiA9IDB4MDE5MDsgICAgIC8qMzAxYiovCi1VU0hPUlQgWEdJMzMwX1ZpZGVvU2Vuc2VEYXRhMiA9IDB4MDExMDsKLVVTSE9SVCBYR0kzMzBfWUNTZW5zZURhdGEyID0gMHgwMTZCOwotVUNIQVIgWEdJMzMwX05UU0NQaGFzZVtdID0gezB4MjEsMHhlZCwweDhhLDB4OH07Ci1VQ0hBUiBYR0kzMzBfUEFMUGhhc2VbXSA9IHsweDJhLDB4NSwweGQzLDB4MH07Ci1VQ0hBUiBYR0kzMzBfTlRTQ1BoYXNlMltdID0gezB4MjEsMHhGMCwweDdCLDB4RDZ9Oy8qMzAxYiovCi1VQ0hBUiBYR0kzMzBfUEFMUGhhc2UyW10gPSB7MHgyYSwweDA5LDB4ODYsMHhlOX07Ci1VQ0hBUiBYR0kzMzBfUEFMTVBoYXNlW10gPSB7MHgyMSwweEU0LDB4MkUsMHg5Qn07ICAgLypwYWxtbiovCi1VQ0hBUiBYR0kzMzBfUEFMTlBoYXNlW10gPSB7MHgyMSwweEY0LDB4M0UsMHhCQX07Ci1VQ0hBUiBYRzQwX0kyQ0RlZmluaXRpb24gPSAweDAwIDsKLVVDSEFSIFhHMjBfQ1I5NyA9IDB4MTAgOwordW5zaWduZWQgY2hhciBYR0kzMzBfTFZEU19TUjMyID0gMHgwMDsgICAvKiB5bmxhaSBmb3IgNjUwIExWRFMgKi8KK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX0xWRFNfU1IzMyA9IDB4MDA7CS8qIGNoaWF3ZW4gZm9yIDY1MCBMVkRTICovCit1bnNpZ25lZCBjaGFyIFhHSTMzMF82NTBfU1IzMSA9IDB4NDA7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF82NTBfU1IzMyA9IDB4MDQ7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV8xXzIgPSAweDA7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV80X0QgPSAweDA7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV80X0UgPSAweDA7Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV80XzEwID0gMHg4MDsKK3Vuc2lnbmVkIHNob3J0IFhHSTMzMF9SR0JTZW5zZURhdGEgPSAweGQxOwordW5zaWduZWQgc2hvcnQgWEdJMzMwX1ZpZGVvU2Vuc2VEYXRhID0gMHhiOTsKK3Vuc2lnbmVkIHNob3J0IFhHSTMzMF9ZQ1NlbnNlRGF0YSA9IDB4YjM7Cit1bnNpZ25lZCBzaG9ydCBYR0kzMzBfUkdCU2Vuc2VEYXRhMiA9IDB4MDE5MDsgICAgIC8qMzAxYiovCit1bnNpZ25lZCBzaG9ydCBYR0kzMzBfVmlkZW9TZW5zZURhdGEyID0gMHgwMTEwOwordW5zaWduZWQgc2hvcnQgWEdJMzMwX1lDU2Vuc2VEYXRhMiA9IDB4MDE2QjsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX05UU0NQaGFzZVtdID0gezB4MjEsIDB4ZWQsIDB4OGEsIDB4OH07Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9QQUxQaGFzZVtdID0gezB4MmEsIDB4NSwgMHhkMywgMHgwfTsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX05UU0NQaGFzZTJbXSA9IHsweDIxLCAweEYwLCAweDdCLCAweEQ2fTsvKjMwMWIqLwordW5zaWduZWQgY2hhciBYR0kzMzBfUEFMUGhhc2UyW10gPSB7MHgyYSwgMHgwOSwgMHg4NiwgMHhlOX07Cit1bnNpZ25lZCBjaGFyIFhHSTMzMF9QQUxNUGhhc2VbXSA9IHsweDIxLCAweEU0LCAweDJFLCAweDlCfTsgICAvKnBhbG1uKi8KK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX1BBTE5QaGFzZVtdID0gezB4MjEsIDB4RjQsIDB4M0UsIDB4QkF9OwordW5zaWduZWQgY2hhciBYRzQwX0kyQ0RlZmluaXRpb24gPSAweDAwIDsKK3Vuc2lnbmVkIGNoYXIgWEcyMF9DUjk3ID0gMHgxMCA7CiAKLVVDSEFSIFhHMjFfRFZPU2V0dGluZyA9IDB4MDAgOwotVUNIQVIgWEcyMV9DUjJFID0gMHgwMCA7Ci1VQ0hBUiBYRzIxX0NSMkYgPSAweDAwIDsKLVVDSEFSIFhHMjFfQ1I0NiA9IDB4MDAgOwotVUNIQVIgWEcyMV9DUjQ3ID0gMHgwMCA7Cit1bnNpZ25lZCBjaGFyIFhHMjFfRFZPU2V0dGluZyA9IDB4MDAgOwordW5zaWduZWQgY2hhciBYRzIxX0NSMkUgPSAweDAwIDsKK3Vuc2lnbmVkIGNoYXIgWEcyMV9DUjJGID0gMHgwMCA7Cit1bnNpZ25lZCBjaGFyIFhHMjFfQ1I0NiA9IDB4MDAgOwordW5zaWduZWQgY2hhciBYRzIxX0NSNDcgPSAweDAwIDsKIAotVUNIQVIgWEcyN19DUjk3ID0gMHhDMSA7Ci1VQ0hBUiBYRzI3X1NSMzYgPSAweDMwIDsKLVVDSEFSIFhHMjdfQ1I4RiA9IDB4MEMgOwotVUNIQVIgWEcyN19DUkQwW10gPSB7MCwwLDAsMCwwLDAsMCwweDgyLDB4MDAsMHg2NiwweDAxLDB4MDB9IDsKLVVDSEFSIFhHMjdfQ1JERVtdID0gezAsMH0gOwotVUNIQVIgWEcyN19TUjQwID0gMHgwNCA7Ci1VQ0hBUiBYRzI3X1NSNDEgPSAweDAwIDsKK3Vuc2lnbmVkIGNoYXIgWEcyN19DUjk3ID0gMHhDMSA7Cit1bnNpZ25lZCBjaGFyIFhHMjdfU1IzNiA9IDB4MzAgOwordW5zaWduZWQgY2hhciBYRzI3X0NSOEYgPSAweDBDIDsKK3Vuc2lnbmVkIGNoYXIgWEcyN19DUkQwW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMHg4MiwgMHgwMCwgMHg2NiwgMHgwMSwgMHgwMH07Cit1bnNpZ25lZCBjaGFyIFhHMjdfQ1JERVtdID0gezAsIDB9OwordW5zaWduZWQgY2hhciBYRzI3X1NSNDAgPSAweDA0IDsKK3Vuc2lnbmVkIGNoYXIgWEcyN19TUjQxID0gMHgwMCA7CiAKLVVDSEFSIFhHSTMzMF9DSFRWVkNMS1VOVFNDW109ezB4MDAgfTsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX0NIVFZWQ0xLVU5UU0NbXSA9IHsweDAwfTsKIAotVUNIQVIgWEdJMzMwX0NIVFZWQ0xLT05UU0NbXT17MHgwMCB9OwordW5zaWduZWQgY2hhciBYR0kzMzBfQ0hUVlZDTEtPTlRTQ1tdID0gezB4MDB9OwogCi1VQ0hBUiBYR0kzMzBfQ0hUVlZDTEtVUEFMW109ezB4MDAgfTsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX0NIVFZWQ0xLVVBBTFtdID0gezB4MDB9OwogCi1VQ0hBUiBYR0kzMzBfQ0hUVlZDTEtPUEFMW109ezB4MDAgfTsKK3Vuc2lnbmVkIGNoYXIgWEdJMzMwX0NIVFZWQ0xLT1BBTFtdID0gezB4MDB9OwogCi1VQ0hBUiBYR0k3MDA3X0NIVFZWQ0xLVU5UU0NbXT17Q0g3MDA3VFZWQ0xLMzBfMiwKK3Vuc2lnbmVkIGNoYXIgWEdJNzAwN19DSFRWVkNMS1VOVFNDW10gPSB7Q0g3MDA3VFZWQ0xLMzBfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDcwMDdUVlZDTEszMF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENINzAwN1RWVkNMSzMwXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g3MDA3VFZWQ0xLMzBfMiwKQEAgLTM1NDYsNyArMzUxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g3MDA3VFZWQ0xLNDdfOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAotVUNIQVIgWEdJNzAwN19DSFRWVkNMS09OVFNDW109e0NINzAwN1RWVkNMSzI2XzQsCit1bnNpZ25lZCBjaGFyIFhHSTcwMDdfQ0hUVlZDTEtPTlRTQ1tdID0ge0NINzAwN1RWVkNMSzI2XzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g3MDA3VFZWQ0xLMjZfNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDcwMDdUVlZDTEsyNl80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENINzAwN1RWVkNMSzI2XzQsCkBAIC0zNTU0LDcgKzM1MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENINzAwN1RWVkNMSzQzXzYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKLVVDSEFSIFhHSTcwMDdfQ0hUVlZDTEtVUEFMW109e0NINzAwN1RWVkNMSzMxXzUsCit1bnNpZ25lZCBjaGFyIFhHSTcwMDdfQ0hUVlZDTEtVUEFMW10gPSB7Q0g3MDA3VFZWQ0xLMzFfNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENINzAwN1RWVkNMSzMxXzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDcwMDdUVlZDTEszMV81LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g3MDA3VFZWQ0xLMzFfNSwKQEAgLTM1NjIsNyArMzUzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDcwMDdUVlZDTEszOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCi1VQ0hBUiBYR0k3MDA3X0NIVFZWQ0xLT1BBTFtdPXtDSDcwMDdUVlZDTEszMV81LAordW5zaWduZWQgY2hhciBYR0k3MDA3X0NIVFZWQ0xLT1BBTFtdID0ge0NINzAwN1RWVkNMSzMxXzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDcwMDdUVlZDTEszMV81LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g3MDA3VFZWQ0xLMzFfNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENINzAwN1RWVkNMSzMxXzUsCkBAIC0zNTcwLDcgKzM1NDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0g3MDA3VFZWQ0xLMzYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAotWEdJMzMwX1ZDTEtEYXRhU3RydWN0IFhHSV9DSDcwMDdWQ0xLRGF0YVtdPQorc3RydWN0IFhHSTMzMF9WQ0xLRGF0YVN0cnVjdCBYR0lfQ0g3MDA3VkNMS0RhdGFbXSA9CiB7CiAgeyAweDYwLDB4MzYsMzB9LCAgLyogMCAzMC4yIE1IWiAqLwogIHsgMHg0MCwweDRBLDI4fSwgIC8qIDEgMjguMTkgTUhaICovCkBAIC0zNTg1LDcgKzM1NTgsNyBAQAogIHsgMHhGRiwweDAwLDAgfSAgIC8qIEVuZCBtYXJrICAgICAgKi8KIH07CiAKLVhHSTMzMF9WQ0xLRGF0YVN0cnVjdCBYR0lfVkNMS0RhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVkNMS0RhdGFTdHJ1Y3QgWEdJX1ZDTEtEYXRhW10gPQogewogICAgICAgICAgICAgICAgCS8qIFNSMkIsU1IyQyxTUjJEICovCiAgCQl7ICAgICAgMHgxQiwweEUxLDI1ICAgICAgICAgICAgICAgfSwvKiAwMCAoMjUuMTc1TUh6KSAqLwpAQCAtMzc4Niw3ICszNzU5LDcgQEAKICAgICAgICAgICAgICAgICB7ICAgICAgMHhGRiwweDAwLDAgICAgICAgICAgICAgICAgfS8qIEVuZCBtYXJrICovCiAgfSAgOwogCi1YR0kzMzBfVkNMS0RhdGFTdHJ1Y3QgWEdJX1ZCVkNMS0RhdGFbXT0KK3N0cnVjdCBYR0kzMzBfVkNMS0RhdGFTdHJ1Y3QgWEdJX1ZCVkNMS0RhdGFbXSA9CiB7CiAgICAgICAgICAgICAgICAgeyAgICAgIDB4MUIsMHhFMSwyNSAgICAgICAgICAgICAgIH0sLyogMDAgKDI1LjE3NU1IeikgKi8KIApAQCAtMzk4Nyw3ICszOTYwLDcgQEAKICAgICAgICAgICAgICAgICB7ICAgICAgMHhGRiwweDAwLDAgICAgICAgICAgICAgICAgfSAgICAgIC8qIEVuZCBtYXJrICovCiB9OwogCi1VQ0hBUiBYR0k2NjBfVFZEZWxheUxpc3RbXT0KK3Vuc2lnbmVkIGNoYXIgWEdJNjYwX1RWRGVsYXlMaXN0W10gPQogewogICAgICAgICAgIDB4NDQsICAgICAgICAgICAgLyogOyAwIEV4dE5UU0NEZWxheSAqLwogICAgICAgICAgIDB4NDQsICAgICAgICAgICAgLyogOyAxIFN0TlRTQ0RlbGF5ICovCkBAIC00MDAzLDcgKzM5NzYsNyBAQAogICAgICAgICAgIDB4NDQgICAgICAgICAgICAgLyogOyBCIFN0WVBiUHJEZWFseSg3NTBwKSAqLwogfTsKIAotVUNIQVIgWEdJNjYwX1RWRGVsYXlMaXN0MltdPQordW5zaWduZWQgY2hhciBYR0k2NjBfVFZEZWxheUxpc3QyW10gPQogewogICAgICAgICAgIDB4NDQsICAgICAgICAgICAvKiA7IDAgRXh0TlRTQ0RlbGF5ICovCiAgICAgICAgICAgMHg0NCwgICAgICAgICAgIC8qIDsgMSBTdE5UU0NEZWxheSAqLwpAQCAtNDAxOSw3ICszOTkyLDcgQEAKICAgICAgICAgICAweDQ0ICAgICAgICAgICAgLyogOyBCIFN0WVBiUHJEZWFseSg3NTBwKSAqLwogfTsKIAotVUNIQVIgWEdJMzAxVFZEZWxheUxpc3RbXT0KK3Vuc2lnbmVkIGNoYXIgWEdJMzAxVFZEZWxheUxpc3RbXSA9CiB7CiAJMHgyMiwgICAgICAgICAgICAvKiA7IDAgRXh0TlRTQ0RlbGF5ICovCiAJMHgyMiwgICAgICAgICAgICAvKiA7IDEgU3ROVFNDRGVsYXkgKi8KQEAgLTQwMzUsNyArNDAwOCw3IEBACiAJMHgyMiAgICAgICAgICAgIC8qIEIgU3RZUGJQckRlYWx5KDc1MHApICovCiB9OwogCi1VQ0hBUiBYR0kzMDFUVkRlbGF5TGlzdDJbXT0KK3Vuc2lnbmVkIGNoYXIgWEdJMzAxVFZEZWxheUxpc3QyW10gPQogewogCTB4MjIsICAgICAgICAgICAvKiA7IDAgRXh0TlRTQ0RlbGF5ICovCiAJMHgyMiwgICAgICAgICAgIC8qIDsgMSBTdE5UU0NEZWxheSAqLwpAQCAtNDA1Miw3ICs0MDI1LDcgQEAKIH07CiAKIAotVUNIQVIgVFZBbnRpRmxpY2tMaXN0W109Cit1bnNpZ25lZCBjaGFyIFRWQW50aUZsaWNrTGlzdFtdID0KIHsvKiBOVFNDQW50aUZsaWNrZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAweDA0LCAgICAgICAgICAgLyogOyAwIEFkYXB0aXZlICovCiAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgICAgICAgICAgIC8qIDsgMSBuZXcgYW50aS1mbGlja2VyID8gKi8KQEAgLTQwNjUsNyArNDAzOCw3IEBACiB9OwogCiAKLVVDSEFSIFRWRWRnZUxpc3RbXT0KK3Vuc2lnbmVkIGNoYXIgVFZFZGdlTGlzdFtdID0KIHsKICAgICAgIDB4MDAsICAgICAgICAgICAgLyogOyAwIE5UU0MgTm8gRWRnZSBlbmhhbmNlICovCiAgICAgICAweDA0LCAgICAgICAgICAgIC8qIDsgMSBOVFNDIEFkYXB0aXZlIEVkZ2UgZW5oYW5jZSAqLwpAQCAtNDA3NSw3ICs0MDQ4LDcgQEAKICAgICAgIDB4MDAgICAgICAgICAgICAgLyogOyAxIEhpVFYgKi8KIH07CiAKLVVMT05HIFRWUGhhc2VMaXN0W109Cit1bnNpZ25lZCBsb25nIFRWUGhhc2VMaXN0W10gPQogeyAgICAgIDB4MDhCQUVEMjEsIC8qIDsgMCBOVFNDIHBoYXNlICovCiAgICAgICAgMHgwMEUzMDUyQSwgLyogOyAxIFBBTCBwaGFzZSAqLwogICAgICAgIDB4OUIyRUU0MjEsIC8qIDsgMiBQQUwtTSBwaGFzZSAqLwpAQCAtNDA5Miw3ICs0MDY1LDcgQEAKICAgICAgICAweEUwMEE4MzFFICAvKiA7IEQgUEFMLU0gMTAyNHg3NjggKi8KIH07CiAKLVVDSEFSIE5UU0NZRmlsdGVyMVtdPQordW5zaWduZWQgY2hhciBOVFNDWUZpbHRlcjFbXSA9CiB7CiAJCSAgICAgIDB4MDAsMHhGNCwweDEwLDB4MzggICAgICwvKiAwIDogMzIweCB0ZXh0IG1vZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAweDAwLDB4RjQsMHgxMCwweDM4ICAgICAsLyogMSA6IDM2MHggdGV4dCBtb2RlICovCkBAIC00MTAzLDcgKzQwNzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDB4RUIsMHgxNSwweDI1LDB4RjYgICAgIC8qIDYgOiA4MDB4IGdyYS4gbW9kZSAqLwogfTsKIAotVUNIQVIgUEFMWUZpbHRlcjFbXT0KK3Vuc2lnbmVkIGNoYXIgUEFMWUZpbHRlcjFbXSA9CiB7CiAJCSAgICAgIDB4MDAsMHhGNCwweDEwLDB4MzgsIC8qIDAgOiAzMjB4IHRleHQgbW9kZSAqLwogICAgICAgICAgICAgICAgICAgICAgIDB4MDAsMHhGNCwweDEwLDB4MzggICAgICwvKiAxIDogMzYweCB0ZXh0IG1vZGUgKi8KQEAgLTQxMTQsNyArNDA4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMHhGQywweEZCLDB4MTQsMHgyQSAgICAgLyogNiA6IDgwMHggZ3JhLiBtb2RlICovCiB9OwogCi1VQ0hBUiBQQUxNWUZpbHRlcjFbXT0KK3Vuc2lnbmVkIGNoYXIgUEFMTVlGaWx0ZXIxW10gPQogewogCQkgICAgICAweDAwLDB4RjQsMHgxMCwweDM4LCAvKiAwIDogMzIweCB0ZXh0IG1vZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAweDAwLDB4RjQsMHgxMCwweDM4LCAvKiAxIDogMzYweCB0ZXh0IG1vZGUgKi8KQEAgLTQxMjYsNyArNDA5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMHhGRiwweEZGLDB4RkYsMHhGRiAgLyogRW5kIG9mIFRhYmxlICovCiB9OwogCi1VQ0hBUiBQQUxOWUZpbHRlcjFbXT0KK3Vuc2lnbmVkIGNoYXIgUEFMTllGaWx0ZXIxW10gPQogewogCQkgICAgICAweDAwLDB4RjQsMHgxMCwweDM4LCAvKiAwIDogMzIweCB0ZXh0IG1vZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAweDAwLDB4RjQsMHgxMCwweDM4LCAvKiAxIDogMzYweCB0ZXh0IG1vZGUgKi8KQEAgLTQxMzgsNyArNDExMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMHhGRiwweEZGLDB4RkYsMHhGRiAgLyogRW5kIG9mIFRhYmxlICovCiB9OwogCi1VQ0hBUiBOVFNDWUZpbHRlcjJbXT0KK3Vuc2lnbmVkIGNoYXIgTlRTQ1lGaWx0ZXIyW10gPQogewogCQkgICAgICAweEZGLDB4MDMsMHgwMiwweEY2LDB4RkMsMHgyNywweDQ2LCAvKiAwIDogMzIweCB0ZXh0IG1vZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAweDAxLDB4MDIsMHhGRSwweEY3LDB4MDMsMHgyNywweDNDLCAvKiAxIDogMzYweCB0ZXh0IG1vZGUgKi8KQEAgLTQxNTAsNyArNDEyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMHhGRiwweEZGLDB4RkMsMHgwMCwweDBGLDB4MjIsMHgyOCAgLyogNyA6IDEwMjR4Z3JhLiBtb2RlICovCiB9OwogCi1VQ0hBUiBQQUxZRmlsdGVyMltdPQordW5zaWduZWQgY2hhciBQQUxZRmlsdGVyMltdID0KIHsKIAkJICAgICAgMHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0NiwgLyogMCA6IDMyMHggdGV4dCBtb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQywgLyogMSA6IDM2MHggdGV4dCBtb2RlICovCkBAIC00MTYyLDcgKzQxMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDB4RkYsMHhGRiwweEZDLDB4MDAsMHgwRiwweDIyLDB4MjggIC8qIDcgOiAxMDI0eGdyYS4gbW9kZSAqLwogfTsKIAotVUNIQVIgUEFMTVlGaWx0ZXIyW109Cit1bnNpZ25lZCBjaGFyIFBBTE1ZRmlsdGVyMltdID0KIHsKIAkJICAgICAgMHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0NiwgLyogMCA6IDMyMHggdGV4dCBtb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQywgLyogMSA6IDM2MHggdGV4dCBtb2RlICovCkBAIC00MTc0LDcgKzQxNDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDB4RkYsMHhGRiwweEZDLDB4MDAsMHgwRiwweDIyLDB4MjggIC8qIDcgOiAxMDI0eGdyYS4gbW9kZSAqLwogfTsKIAotVUNIQVIgUEFMTllGaWx0ZXIyW109Cit1bnNpZ25lZCBjaGFyIFBBTE5ZRmlsdGVyMltdID0KIHsKIAkJICAgICAgMHhGRiwweDAzLDB4MDIsMHhGNiwweEZDLDB4MjcsMHg0NiwgLyogMCA6IDMyMHggdGV4dCBtb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwweDAyLDB4RkUsMHhGNywweDAzLDB4MjcsMHgzQywgLyogMSA6IDM2MHggdGV4dCBtb2RlICovCkBAIC00MTg2LDE0ICs0MTU5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgMHhGRiwweEZGLDB4RkMsMHgwMCwweDBGLDB4MjIsMHgyOCAgLyogNyA6IDEwMjR4Z3JhLiBtb2RlICovCiB9OwogCi1VQ0hBUiBYR0lfTlRTQzEwMjRBZGpUaW1lW109Cit1bnNpZ25lZCBjaGFyIFhHSV9OVFNDMTAyNEFkalRpbWVbXSA9CiB7CiAgICAgICAweGE3LDB4MDcsMHhmMiwweDZlLDB4MTcsMHg4YiwweDczLDB4NTMsCiAgICAgICAweDEzLDB4NDAsMHgzNCwweEY0LDB4NjMsMHhCQiwweENDLDB4N0EsCiAgICAgICAweDU4LDB4ZTQsMHg3MywweGQwLDB4MTMKIH07CiAKLVhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBIaVRWVGFwNFRpbWluZ1tdPQorc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBIaVRWVGFwNFRpbWluZ1tdID0KIHsKIAl7MCx7CiAJMHgwMCwweDIwLDB4MDAsMHgwMCwweDdGLDB4MjAsMHgwMiwweDdGLCAvKiA7IEMwLUM3ICovCkBAIC00MjA4LDcgKzQxODEsNyBAQAogCX0KIH07CiAKLVhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBFbmxhcmdlVGFwNFRpbWluZ1tdPQorc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBFbmxhcmdlVGFwNFRpbWluZ1tdID0KIHsKIAl7MCx7CiAJMHgwMCwweDIwLDB4MDAsMHgwMCwweDdGLDB4MjAsMHgwMiwweDdGLCAvKiA7IEMwLUM3ICovCkBAIC00MjIzLDcgKzQxOTYsNyBAQAogCX0KIH07CiAKLVhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBOb1NjYWxlVGFwNFRpbWluZ1tdPQorc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBOb1NjYWxlVGFwNFRpbWluZ1tdID0KIHsKIAl7MCx7CiAJMHgwMCwweDIwLDB4MDAsMHgwMCwweDdGLDB4MjAsMHgwMiwweDdGLCAvKiA7IEMwLUM3ICovCkBAIC00MjM4LDcgKzQyMTEsNyBAQAogCX0KIH07CiAKLVhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBQQUxUYXA0VGltaW5nW109CitzdHJ1Y3QgWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0IFBBTFRhcDRUaW1pbmdbXSA9CiB7CiAJezYwMCwgIHsKICAgICAgICAgICAgICAgICAweDA1LDB4MTksMHgwNSwweDdELDB4MDMsMHgxOSwweDA2LDB4N0UsIC8qIDsgQzAtQzcgKi8KQEAgLTQyNzYsNyArNDI0OSw3IEBACiAgICAgICAgIH0KIH07CiAKLVhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBOVFNDVGFwNFRpbWluZ1tdPQorc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBOVFNDVGFwNFRpbWluZ1tdID0KIHsKIAl7NDgwLAl7CiAgICAgICAgICAgICAgIAkweDA0LDB4MUEsMHgwNCwweDdFLDB4MDMsMHgxQSwweDA2LDB4N0QsIC8qIDsgQzAtQzcgKi8KQEAgLTQzMTQsNyArNDI4Nyw3IEBACiAgICAgICAgIH0KIH07CiAKLVhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBZUGJQcjUyNXBUYXA0VGltaW5nW109CitzdHJ1Y3QgWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0IFlQYlByNTI1cFRhcDRUaW1pbmdbXSA9CiB7CiAJezQ4MCwJewogICAgICAgICAgICAgICAJMHgwNCwweDFBLDB4MDQsMHg3RSwweDAzLDB4MUEsMHgwNiwweDdELCAvKiA7IEMwLUM3ICovCkBAIC00MzUyLDcgKzQzMjUsNyBAQAogICAgICAgICB9CiB9OwogCi1YR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgWVBiUHI1MjVpVGFwNFRpbWluZ1tdPQorc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBZUGJQcjUyNWlUYXA0VGltaW5nW10gPQogewogCXs0ODAsCXsKICAgICAgICAgICAgICAgCTB4MDQsMHgxQSwweDA0LDB4N0UsMHgwMywweDFBLDB4MDYsMHg3RCwgLyogOyBDMC1DNyAqLwpAQCAtNDM5MCw3ICs0MzYzLDcgQEAKICAgICAgICAgfQogfTsKIAotWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0IFlQYlByNzUwcFRhcDRUaW1pbmdbXT0KK3N0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgWVBiUHI3NTBwVGFwNFRpbWluZ1tdID0KIHsgICAgICAgIHsweEZGRkYsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAweDA1LDB4MTksMHgwNSwweDdELDB4MDMsMHgxOSwweDA2LDB4N0UsIC8qIDsgQzAtQzcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdXRpbC5jCmluZGV4IDg3NTMxYjQuLjJjNDAzNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3V0aWwuYwpAQCAtMSw1NCArMSwyNSBAQAotI2luY2x1ZGUgIm9zZGVmLmgiCiAjaW5jbHVkZSAidmJfZGVmLmgiCiAjaW5jbHVkZSAidmdhdHlwZXMuaCIKICNpbmNsdWRlICJ2Yl9zdHJ1Y3QuaCIKIAotI2lmZGVmIExJTlVYX0tFUk5FTAogI2luY2x1ZGUgIlhHSWZiLmgiCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNlbmRpZgogCi0jaWZkZWYgVEMKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFdJTjIwMDAKLSNpbmNsdWRlIDxkZGVycm9yLmg+Ci0jaW5jbHVkZSA8ZGV2aW9jdGwuaD4KLSNpbmNsdWRlIDxtaW5pcG9ydC5oPgotI2luY2x1ZGUgPG50ZGR2ZGVvLmg+Ci0jaW5jbHVkZSA8dmlkZW8uaD4KLQotI2luY2x1ZGUgInhnaXYuaCIKLSNpbmNsdWRlICJkZF9pMmMuaCIKLSNpbmNsdWRlICJ0b29scy5oIgotI2VuZGlmCi0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0jaW5jbHVkZSAieGY4Ni5oIgotI2luY2x1ZGUgInhmODZQY2lJbmZvLmgiCi0jaW5jbHVkZSAieGdpLmgiCi0jaW5jbHVkZSAieGdpX3JlZ3MuaCIKLSNlbmRpZgotCi0KLQotCi12b2lkIFhHSU5ld19TZXRSZWcxKCBVTE9ORyAsIFVTSE9SVCAsIFVTSE9SVCApIDsKLXZvaWQgWEdJTmV3X1NldFJlZzIoIFVMT05HICwgVVNIT1JUICwgVVNIT1JUICkgOwotdm9pZCBYR0lOZXdfU2V0UmVnMyggVUxPTkcgLCBVU0hPUlQgKSA7Ci12b2lkIFhHSU5ld19TZXRSZWc0KCBVTE9ORyAsIFVMT05HICkgOwotVUNIQVIgWEdJTmV3X0dldFJlZzEoIFVMT05HICwgVVNIT1JUKSA7Ci1VQ0hBUiBYR0lOZXdfR2V0UmVnMiggVUxPTkcgKSA7Ci1VTE9ORyBYR0lOZXdfR2V0UmVnMyggVUxPTkcgKSA7Ci12b2lkIFhHSU5ld19DbGVhckRBQyggUFVDSEFSICkgOwotdm9pZCAgICAgWEdJTmV3X1NldFJlZ0FORE9SKFVMT05HIFBvcnQsVVNIT1JUIEluZGV4LFVTSE9SVCBEYXRhQU5ELFVTSE9SVCBEYXRhT1IpOwotdm9pZCAgICAgWEdJTmV3X1NldFJlZ09SKFVMT05HIFBvcnQsVVNIT1JUIEluZGV4LFVTSE9SVCBEYXRhT1IpOwotdm9pZCAgICAgWEdJTmV3X1NldFJlZ0FORChVTE9ORyBQb3J0LFVTSE9SVCBJbmRleCxVU0hPUlQgRGF0YUFORCk7Cit2b2lkIFhHSU5ld19TZXRSZWcxKHVuc2lnbmVkIGxvbmcsdW5zaWduZWQgc2hvcnQsdW5zaWduZWQgc2hvcnQpOwordm9pZCBYR0lOZXdfU2V0UmVnMih1bnNpZ25lZCBsb25nLHVuc2lnbmVkIHNob3J0LHVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgWEdJTmV3X1NldFJlZzModW5zaWduZWQgbG9uZyx1bnNpZ25lZCBzaG9ydCk7Cit2b2lkIFhHSU5ld19TZXRSZWc0KHVuc2lnbmVkIGxvbmcsdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBjaGFyIFhHSU5ld19HZXRSZWcxKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0KTsKK3Vuc2lnbmVkIGNoYXIgWEdJTmV3X0dldFJlZzIodW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIFhHSU5ld19HZXRSZWczKHVuc2lnbmVkIGxvbmcpOwordm9pZCBYR0lOZXdfQ2xlYXJEQUModW5zaWduZWQgY2hhciAqKTsKK3ZvaWQgWEdJTmV3X1NldFJlZ0FORE9SKHVuc2lnbmVkIGxvbmcgUG9ydCx1bnNpZ25lZCBzaG9ydCBJbmRleCwKKwkJCXVuc2lnbmVkIHNob3J0IERhdGFBTkQsdW5zaWduZWQgc2hvcnQgRGF0YU9SKTsKK3ZvaWQgWEdJTmV3X1NldFJlZ09SKHVuc2lnbmVkIGxvbmcgUG9ydCx1bnNpZ25lZCBzaG9ydCBJbmRleCwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCBEYXRhT1IpOwordm9pZCBYR0lOZXdfU2V0UmVnQU5EKHVuc2lnbmVkIGxvbmcgUG9ydCx1bnNpZ25lZCBzaG9ydCBJbmRleCwKKwkJICAgICAgdW5zaWduZWQgc2hvcnQgRGF0YUFORCk7CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC01NywxNSArMjgsMTAgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6IFNSIENSVEMgR1IgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBYR0lOZXdfU2V0UmVnMSggVUxPTkcgcG9ydCAsIFVTSE9SVCBpbmRleCAsIFVTSE9SVCBkYXRhICkKK3ZvaWQgWEdJTmV3X1NldFJlZzEoIHVuc2lnbmVkIGxvbmcgcG9ydCAsIHVuc2lnbmVkIHNob3J0IGluZGV4ICwgdW5zaWduZWQgc2hvcnQgZGF0YSApCiB7Ci0jaWZkZWYgTElOVVhfWEY4NgotICAgIE91dFBvcnRCeXRlKCAoIFBVQ0hBUiApKFVMT05HKXBvcnQgLCBpbmRleCApIDsKLSAgICBPdXRQb3J0Qnl0ZSggKCBQVUNIQVIgKShVTE9ORylwb3J0ICsgMSAsIGRhdGEgKSA7Ci0jZWxzZQotICAgIE91dFBvcnRCeXRlKCBwb3J0ICwgaW5kZXggKSA7Ci0gICAgT3V0UG9ydEJ5dGUoIHBvcnQgKyAxICwgZGF0YSApIDsKLSNlbmRpZgorCW91dGIoaW5kZXgsIHBvcnQpOworCW91dGIoZGF0YSwgcG9ydCArIDEpOwogfQogCiAKQEAgLTc1LDkgKzQxLDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6IEFSKCAzQzAgKSAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKnZvaWQgWEdJTmV3X1NldFJlZzIoIFVMT05HIHBvcnQgLCBVU0hPUlQgaW5kZXggLCBVU0hPUlQgZGF0YSApCisvKnZvaWQgWEdJTmV3X1NldFJlZzIoIHVuc2lnbmVkIGxvbmcgcG9ydCAsIHVuc2lnbmVkIHNob3J0IGluZGV4ICwgdW5zaWduZWQgc2hvcnQgZGF0YSApCiB7Ci0gICAgSW5Qb3J0Qnl0ZSggKCBQVUNIQVIgKXBvcnQgKyAweDNkYSAtIDB4M2MwICkgOworICAgIEluUG9ydEJ5dGUoKFAgdW5zaWduZWQgY2hhciApcG9ydCArIDB4M2RhIC0gMHgzYzApIDsKICAgICBPdXRQb3J0Qnl0ZSggWEdJTmV3X1AzYzAgLCBpbmRleCApIDsKICAgICBPdXRQb3J0Qnl0ZSggWEdJTmV3X1AzYzAgLCBkYXRhICkgOwogICAgIE91dFBvcnRCeXRlKCBYR0lOZXdfUDNjMCAsIDB4MjAgKSA7CkBAIC05MCw5ICs1Niw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19TZXRSZWczKCBVTE9ORyBwb3J0ICwgVVNIT1JUIGRhdGEgKQordm9pZCBYR0lOZXdfU2V0UmVnMyggdW5zaWduZWQgbG9uZyBwb3J0ICwgdW5zaWduZWQgc2hvcnQgZGF0YSApCiB7Ci0gICAgT3V0UG9ydEJ5dGUoIHBvcnQgLCBkYXRhICkgOworCW91dGIoZGF0YSwgcG9ydCk7CiB9CiAKIApAQCAtMTAyLDkgKzY4LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1NldFJlZzQoIFVMT05HIHBvcnQgLCBVTE9ORyBkYXRhICkKK3ZvaWQgWEdJTmV3X1NldFJlZzQoIHVuc2lnbmVkIGxvbmcgcG9ydCAsIHVuc2lnbmVkIGxvbmcgZGF0YSApCiB7Ci0gICAgT3V0UG9ydExvbmcoIHBvcnQgLCBkYXRhICkgOworCW91dGwoZGF0YSwgcG9ydCk7CiB9CiAKIApAQCAtMTE0LDE4ICs4MCwxMiBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUNIQVIgWEdJTmV3X0dldFJlZzEoIFVMT05HIHBvcnQgLCBVU0hPUlQgaW5kZXggKQordW5zaWduZWQgY2hhciBYR0lOZXdfR2V0UmVnMSh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIHNob3J0IGluZGV4KQogewotICAgIFVDSEFSIGRhdGEgOworICAgIHVuc2lnbmVkIGNoYXIgZGF0YSA7CiAKLSNpZmRlZiBMSU5VWF9YRjg2Ci0gICAgT3V0UG9ydEJ5dGUoICggUFVDSEFSICkoVUxPTkcpcG9ydCAsIGluZGV4ICkgOwotICAgIGRhdGEgPSBJblBvcnRCeXRlKCAoIFBVQ0hBUiApKFVMT05HKXBvcnQgKyAxICkgOwotI2Vsc2UKLSAgICBPdXRQb3J0Qnl0ZSggcG9ydCAsIGluZGV4ICkgOwotICAgIGRhdGEgPSBJblBvcnRCeXRlKCBwb3J0ICsgMSApIDsKLSNlbmRpZgotCisgICAgb3V0YihpbmRleCwgcG9ydCk7CisgICAgZGF0YSA9IGluYihwb3J0ICsgMSkgOwogICAgIHJldHVybiggZGF0YSApIDsKIH0KIApAQCAtMTM2LDExICs5NiwxMSBAQAogLyogT3V0cHV0IDogKi8KIC8qIERlc2NyaXB0aW9uIDogKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUNIQVIgWEdJTmV3X0dldFJlZzIoIFVMT05HIHBvcnQgKQordW5zaWduZWQgY2hhciBYR0lOZXdfR2V0UmVnMih1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0gICAgVUNIQVIgZGF0YSA7CisgICAgdW5zaWduZWQgY2hhciBkYXRhIDsKIAotICAgIGRhdGEgPSBJblBvcnRCeXRlKCBwb3J0ICkgOworICAgIGRhdGEgPSBpbmIocG9ydCkgOwogCiAgICAgcmV0dXJuKCBkYXRhICkgOwogfQpAQCAtMTUyLDExICsxMTIsMTEgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVMT05HIFhHSU5ld19HZXRSZWczKCBVTE9ORyBwb3J0ICkKK3Vuc2lnbmVkIGxvbmcgWEdJTmV3X0dldFJlZzMoIHVuc2lnbmVkIGxvbmcgcG9ydCApCiB7Ci0gICAgVUxPTkcgZGF0YSA7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhIDsKIAotICAgIGRhdGEgPSBJblBvcnRMb25nKCBwb3J0ICkgOworICAgIGRhdGEgPSBpbmwocG9ydCkgOwogCiAgICAgcmV0dXJuKCBkYXRhICkgOwogfQpAQCAtMTY5LDkgKzEyOSw5IEBACiAvKiBPdXRwdXQgOiAqLwogLyogRGVzY3JpcHRpb24gOiAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIFhHSU5ld19TZXRSZWdBTkRPUiggVUxPTkcgUG9ydCAsIFVTSE9SVCBJbmRleCAsIFVTSE9SVCBEYXRhQU5EICwgVVNIT1JUIERhdGFPUiApCit2b2lkIFhHSU5ld19TZXRSZWdBTkRPUiggdW5zaWduZWQgbG9uZyBQb3J0ICwgdW5zaWduZWQgc2hvcnQgSW5kZXggLCB1bnNpZ25lZCBzaG9ydCBEYXRhQU5EICwgdW5zaWduZWQgc2hvcnQgRGF0YU9SICkKIHsKLSAgICBVU0hPUlQgdGVtcCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCA7CiAKICAgICB0ZW1wID0gWEdJTmV3X0dldFJlZzEoIFBvcnQgLCBJbmRleCApIDsJCS8qIFhHSU5ld19QYXJ0MVBvcnQgaW5kZXggMDIgKi8KICAgICB0ZW1wID0gKCB0ZW1wICYgKCBEYXRhQU5EICkgKSB8IERhdGFPUiA7CkBAIC0xODUsOSArMTQ1LDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1NldFJlZ0FORChVTE9ORyBQb3J0LFVTSE9SVCBJbmRleCxVU0hPUlQgRGF0YUFORCkKK3ZvaWQgWEdJTmV3X1NldFJlZ0FORCh1bnNpZ25lZCBsb25nIFBvcnQsdW5zaWduZWQgc2hvcnQgSW5kZXgsdW5zaWduZWQgc2hvcnQgRGF0YUFORCkKIHsKLSAgICBVU0hPUlQgdGVtcCA7CisgICAgdW5zaWduZWQgc2hvcnQgdGVtcCA7CiAKICAgICB0ZW1wID0gWEdJTmV3X0dldFJlZzEoIFBvcnQgLCBJbmRleCApIDsJLyogWEdJTmV3X1BhcnQxUG9ydCBpbmRleCAwMiAqLwogICAgIHRlbXAgJj0gRGF0YUFORCA7CkBAIC0yMDEsOSArMTYxLDkgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgWEdJTmV3X1NldFJlZ09SKCBVTE9ORyBQb3J0ICwgVVNIT1JUIEluZGV4ICwgVVNIT1JUIERhdGFPUiApCit2b2lkIFhHSU5ld19TZXRSZWdPUiggdW5zaWduZWQgbG9uZyBQb3J0ICwgdW5zaWduZWQgc2hvcnQgSW5kZXggLCB1bnNpZ25lZCBzaG9ydCBEYXRhT1IgKQogewotICAgIFVTSE9SVCB0ZW1wIDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0ZW1wIDsKIAogICAgIHRlbXAgPSBYR0lOZXdfR2V0UmVnMSggUG9ydCAsIEluZGV4ICkgOwkvKiBYR0lOZXdfUGFydDFQb3J0IGluZGV4IDAyICovCiAgICAgdGVtcCB8PSBEYXRhT1IgOwpAQCAtMjE5LDI5ICsxNzksMTQgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBOZXdEZWxheVNlY29uZHMoIGludCBzZWNvbmRzICkKIHsKLSNpZmRlZiBXSU4yMDAwCi0gICAgaW50IGogOwotI2VuZGlmCiAgICAgaW50IGkgOwogCiAKICAgICBmb3IoIGkgPSAwIDsgaSA8IHNlY29uZHMgOyBpKysgKQogICAgIHsKLSNpZmRlZiBUQwotICAgICAgICBkZWxheSggMTAwMCApIDsKLSNlbmRpZgogCi0jaWZkZWYgV0lOMjAwMAogCi0gICAgICAgIGZvciAoIGogPSAwIDsgaiA8IDIwMDAwIDsgaisrICkKLSAgICAgICAgICAgIFZpZGVvUG9ydFN0YWxsRXhlY3V0aW9uKCA1MCApIDsKLSNlbmRpZgogCi0jaWZkZWYgV0lOQ0VfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmIExJTlVYX0tFUk5FTAotI2VuZGlmCiAgICAgfQogfQogCkBAIC0yNTIsNyArMTk3LDcgQEAKIC8qIE91dHB1dCA6ICovCiAvKiBEZXNjcmlwdGlvbiA6ICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgTmV3ZGVidWdjb2RlKCBVQ0hBUiBjb2RlICkKK3ZvaWQgTmV3ZGVidWdjb2RlKHVuc2lnbmVkIGNoYXIgY29kZSkKIHsKIC8vICAgIE91dFBvcnRCeXRlICggMHg4MCAsIGNvZGUgKSA7CiAgICAgLyogT3V0UG9ydEJ5dGUgKCAweDMwMCAsIGNvZGUgKSA7ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdXRpbC5oIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3V0aWwuaAppbmRleCA5MTc3OWQ4Li4xNTZmNjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdXRpbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl91dGlsLmgKQEAgLTEsMTUgKzEsMTUgQEAKICNpZm5kZWYgX1ZCVVRJTF8KICNkZWZpbmUgX1ZCVVRJTF8KIGV4dGVybiAgIHZvaWQgICAgIE5ld0RlbGF5U2Vjb25kcyggaW50ICk7Ci1leHRlcm4gICB2b2lkICAgICBOZXdkZWJ1Z2NvZGUoIFVDSEFSICk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lOZXdfU2V0UmVnMShVTE9ORywgVVNIT1JULCBVU0hPUlQpOwotZXh0ZXJuICAgdm9pZCAgICAgWEdJTmV3X1NldFJlZzMoVUxPTkcsIFVTSE9SVCk7Ci1leHRlcm4gICBVQ0hBUiAgICBYR0lOZXdfR2V0UmVnMShVTE9ORywgVVNIT1JUKTsKLWV4dGVybiAgIFVDSEFSICAgIFhHSU5ld19HZXRSZWcyKFVMT05HKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSU5ld19TZXRSZWc0KFVMT05HLCBVTE9ORyk7Ci1leHRlcm4gICBVTE9ORyAgICBYR0lOZXdfR2V0UmVnMyhVTE9ORyk7Ci1leHRlcm4gICB2b2lkICAgICBYR0lOZXdfU2V0UmVnT1IoVUxPTkcgUG9ydCxVU0hPUlQgSW5kZXgsVVNIT1JUIERhdGFPUik7Ci1leHRlcm4gICB2b2lkICAgICBYR0lOZXdfU2V0UmVnQU5EKFVMT05HIFBvcnQsVVNIT1JUIEluZGV4LFVTSE9SVCBEYXRhQU5EKTsKLWV4dGVybiAgIHZvaWQgICAgIFhHSU5ld19TZXRSZWdBTkRPUihVTE9ORyBQb3J0LFVTSE9SVCBJbmRleCxVU0hPUlQgRGF0YUFORCxVU0hPUlQgRGF0YU9SKTsKK2V4dGVybiAgIHZvaWQgICAgIE5ld2RlYnVnY29kZSh1bnNpZ25lZCBjaGFyKTsKK2V4dGVybiAgIHZvaWQgICAgIFhHSU5ld19TZXRSZWcxKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7CitleHRlcm4gICB2b2lkICAgICBYR0lOZXdfU2V0UmVnMyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBzaG9ydCk7CitleHRlcm4gICAgdW5zaWduZWQgY2hhciAgICAgWEdJTmV3X0dldFJlZzEodW5zaWduZWQgbG9uZywgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuICAgIHVuc2lnbmVkIGNoYXIgICAgIFhHSU5ld19HZXRSZWcyKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuICAgdm9pZCAgICAgWEdJTmV3X1NldFJlZzQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gICB1bnNpZ25lZCBsb25nICAgIFhHSU5ld19HZXRSZWczKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuICAgdm9pZCAgICAgWEdJTmV3X1NldFJlZ09SKHVuc2lnbmVkIGxvbmcgUG9ydCx1bnNpZ25lZCBzaG9ydCBJbmRleCx1bnNpZ25lZCBzaG9ydCBEYXRhT1IpOworZXh0ZXJuICAgdm9pZCAgICAgWEdJTmV3X1NldFJlZ0FORCh1bnNpZ25lZCBsb25nIFBvcnQsdW5zaWduZWQgc2hvcnQgSW5kZXgsdW5zaWduZWQgc2hvcnQgRGF0YUFORCk7CitleHRlcm4gICB2b2lkICAgICBYR0lOZXdfU2V0UmVnQU5ET1IodW5zaWduZWQgbG9uZyBQb3J0LHVuc2lnbmVkIHNob3J0IEluZGV4LHVuc2lnbmVkIHNob3J0IERhdGFBTkQsdW5zaWduZWQgc2hvcnQgRGF0YU9SKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmdhdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Z2F0eXBlcy5oCmluZGV4IDI5NWVhODYuLmRmODM5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Z2F0eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Z2F0eXBlcy5oCkBAIC0yLDEzNiArMiwxNCBAQAogI2lmbmRlZiBfVkdBVFlQRVNfCiAjZGVmaW5lIF9WR0FUWVBFU18KIAotI2luY2x1ZGUgIm9zZGVmLmgiCi0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0jaW5jbHVkZSAieGY4NlZlcnNpb24uaCIKLSNpbmNsdWRlICJ4Zjg2UGNpLmgiCi0jZW5kaWYKLQotI2lmZGVmIExJTlVYX0tFUk5FTCAgLyogV2UgZG9uJ3Qgd2FudCB0aGUgWCBkcml2ZXIgdG8gZGVwZW5kIG9uIGtlcm5lbCBzb3VyY2UgKi8KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAwCi0jZW5kaWYKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLSNlbmRpZgotCi0jaWZuZGVmIENIQVIKLXR5cGVkZWYgY2hhciBDSEFSOwotI2VuZGlmCi0KLSNpZm5kZWYgU0hPUlQKLXR5cGVkZWYgc2hvcnQgU0hPUlQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBMT05HCi10eXBlZGVmIGxvbmcgIExPTkc7Ci0jZW5kaWYKLQotI2lmbmRlZiBVQ0hBUgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVDSEFSOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNIT1JUCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKLSNlbmRpZgotCi0jaWZuZGVmIFVMT05HCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Ci0jZW5kaWYKLQotI2lmbmRlZiBQVUNIQVIKLXR5cGVkZWYgVUNIQVIgKlBVQ0hBUjsKLSNlbmRpZgotCi0jaWZuZGVmIFBVU0hPUlQKLXR5cGVkZWYgVVNIT1JUICpQVVNIT1JUOwotI2VuZGlmCi0KLSNpZm5kZWYgUExPTkdVCi10eXBlZGVmIFVMT05HICpQVUxPTkc7Ci0jZW5kaWYKLQotI2lmbmRlZiBWT0lECi10eXBlZGVmIHZvaWQgVk9JRDsKLSNlbmRpZgotCi0jaWZuZGVmIFBWT0lECi10eXBlZGVmIHZvaWQgKlBWT0lEOwotI2VuZGlmCi0KLSNpZm5kZWYgQk9PTEVBTgotdHlwZWRlZiBVQ0hBUiBCT09MRUFOOwotI2VuZGlmCi0vKgotI2lmbmRlZiBib29sCi10eXBlZGVmIFVDSEFSIGJvb2w7Ci0jZW5kaWYKLSovCi0jaWZkZWYgTElOVVhfS0VSTkVMCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgWEdJSU9BRERSRVNTOwotI2VuZGlmCi0KLSNpZmRlZiBMSU5VWF9YRjg2Ci0jaWYgWEY4Nl9WRVJTSU9OX0NVUlJFTlQgPCBYRjg2X1ZFUlNJT05fTlVNRVJJQyg0LDIsMCwwLDApCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSU9BRERSRVNTOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFhHSUlPQUREUkVTUzsKLSNlbHNlCi10eXBlZGVmIElPQUREUkVTUyBYR0lJT0FERFJFU1M7Ci0jZW5kaWYKLSNlbmRpZgogCiAjaWZuZGVmIFZCSU9TX1ZFUl9NQVhfTEVOR1RICi0jZGVmaW5lIFZCSU9TX1ZFUl9NQVhfTEVOR1RIICAgIDQKLSNlbmRpZgotCi0jaWZuZGVmIFdJTjIwMDAKLQotI2lmbmRlZiBMSU5VWF9LRVJORUwgICAvKiBGb3IgdGhlIGxpbnV4IGtlcm5lbCwgdGhpcyBpcyBkZWZpbmVkIGluIHhnaWZiLmggKi8KLSNpZm5kZWYgWEdJX0NISVBfVFlQRQotdHlwZWRlZiBlbnVtIF9YR0lfQ0hJUF9UWVBFIHsKLSAgICBYR0lfVkdBTGVnYWN5ID0gMCwKLSNpZmRlZiBMSU5VWF9YRjg2Ci0gICAgWEdJXzUzMCwKLSAgICBYR0lfT0xELAotI2VuZGlmCi0gICAgWEdJXzMwMCwKLSAgICBYR0lfNjMwLAotICAgIFhHSV82NDAsCi0gICAgWEdJXzMxNUgsCi0gICAgWEdJXzMxNSwKLSAgICBYR0lfMzE1UFJPLAotICAgIFhHSV81NTAsCi0gICAgWEdJXzY1MCwKLSAgICBYR0lfNjUwTSwKLSAgICBYR0lfNzQwLAotICAgIFhHSV8zMzAsCi0gICAgWEdJXzY2MSwKLSAgICBYR0lfNjYwLAotICAgIFhHSV83NjAsCi0gICAgWEc0MCA9IDMyLAotICAgIFhHNDEsCi0gICAgWEc0MiwKLSAgICBYRzQ1LAotICAgIFhHMjAgPSA0OCwKLSAgICBYRzIxLAotICAgIFhHMjcsCi0gICAgTUFYX1hHSV9DSElQCi19IFhHSV9DSElQX1RZUEU7Ci0jZW5kaWYKKyNkZWZpbmUgVkJJT1NfVkVSX01BWF9MRU5HVEggICAgNQogI2VuZGlmCiAKICNpZm5kZWYgWEdJX1ZCX0NISVBfVFlQRQotdHlwZWRlZiBlbnVtIF9YR0lfVkJfQ0hJUF9UWVBFIHsKK2VudW0gWEdJX1ZCX0NISVBfVFlQRSB7CiAgICAgVkJfQ0hJUF9MZWdhY3kgPSAwLAogICAgIFZCX0NISVBfMzAxLAogICAgIFZCX0NISVBfMzAxQiwKQEAgLTE0MywxMSArMjEsMTEgQEAKICAgICBWQl9DSElQXzMwMkVMViwKICAgICBWQl9DSElQX1VOS05PV04sIC8qIG90aGVyIHZpZGVvIGJyaWRnZSBvciBubyB2aWRlbyBicmlkZ2UgKi8KICAgICBNQVhfVkJfQ0hJUAotfSBYR0lfVkJfQ0hJUF9UWVBFOworfTsKICNlbmRpZgogCiAjaWZuZGVmIFhHSV9MQ0RfVFlQRQotdHlwZWRlZiBlbnVtIF9YR0lfTENEX1RZUEUgeworZW51bSBYR0lfTENEX1RZUEUgewogICAgIExDRF9JTlZBTElEID0gMCwKICAgICBMQ0RfMzIweDQ4MCwgICAgICAgLyogRlNUTiwgRFNUTiAqLwogICAgIExDRF82NDB4NDgwLApAQCAtMTcxLDE1NSArNDksOTAgQEAKICAgICBMQ0RfMjA0OHgxNTM2LAogICAgIExDRF9DVVNUT00sCiAgICAgTENEX1VOS05PV04KLX0gWEdJX0xDRF9UWVBFOworfTsKICNlbmRpZgogCi0jZW5kaWYgICAvKiBub3QgV0lOMjAwMCAqLwotCi0jaWZuZGVmIFBYR0lfRFNSZWcKLXR5cGVkZWYgc3RydWN0IF9YR0lfRFNSZWcKK3N0cnVjdCBYR0lfRFNSZWcKIHsKLSAgVUNIQVIgIGpJZHg7Ci0gIFVDSEFSICBqVmFsOwotfSBYR0lfRFNSZWcsICpQWEdJX0RTUmVnOwotI2VuZGlmCisgIHVuc2lnbmVkIGNoYXIgIGpJZHg7CisgIHVuc2lnbmVkIGNoYXIgIGpWYWw7Cit9OwogCi0jaWZuZGVmIFhHSV9IV19ERVZJQ0VfSU5GTwotCi10eXBlZGVmIHN0cnVjdCBfWEdJX0hXX0RFVklDRV9JTkZPICBYR0lfSFdfREVWSUNFX0lORk8sICpQWEdJX0hXX0RFVklDRV9JTkZPOwotCi10eXBlZGVmIEJPT0xFQU4gKCpQWEdJX1FVRVJZU1BBQ0UpICAgKFBYR0lfSFdfREVWSUNFX0lORk8sIFVMT05HLCBVTE9ORywgVUxPTkcgKik7Ci0KLXN0cnVjdCBfWEdJX0hXX0RFVklDRV9JTkZPCitzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvCiB7Ci0gICAgVUxPTkcgIHVsRXh0ZXJuYWxDaGlwOyAgICAgICAvKiBOTyBWQiBvciBvdGhlciB2aWRlbyBicmlkZ2UqLworICAgIHVuc2lnbmVkIGxvbmcgIHVsRXh0ZXJuYWxDaGlwOyAgICAgICAvKiBOTyBWQiBvciBvdGhlciB2aWRlbyBicmlkZ2UqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdWpWQkNoaXBJRCA9IFZCX0NISVBfVU5LTk9XTiwgKi8KLSNpZmRlZiBMSU5VWF9YRjg2Ci0gICAgUENJVEFHIFBjaVRhZzsJCSAvKiBQQ0kgVGFnICovCi0jZW5kaWYKIAotICAgIFBVQ0hBUiAgcGpWaXJ0dWFsUm9tQmFzZTsgICAgLyogUk9NIGltYWdlICovCisgICAgdW5zaWduZWQgY2hhciAqcGpWaXJ0dWFsUm9tQmFzZTsgICAgLyogUk9NIGltYWdlICovCiAKLSAgICBCT09MRUFOIFVzZVJPTTsJCSAvKiBVc2UgdGhlIFJPTSBpbWFnZSBpZiBwcm92aWRlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgVXNlUk9NOwkJIC8qIFVzZSB0aGUgUk9NIGltYWdlIGlmIHByb3ZpZGVkICovCiAKLSAgICBQVk9JRCAgIHBEZXZpY2U7CisgICAgdm9pZCAqcERldmljZTsKIAotICAgIFBVQ0hBUiAgcGpWaWRlb01lbW9yeUFkZHJlc3M7LyogYmFzZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzICovCisgICAgdW5zaWduZWQgY2hhciAqcGpWaWRlb01lbW9yeUFkZHJlc3M7LyogYmFzZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZiBMaW5lYXIgVkdBIG1lbW9yeSAqLwogCi0gICAgVUxPTkcgIHVsVmlkZW9NZW1vcnlTaXplOyAgICAvKiBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1lbW9yeSBvbiB0aGUgYm9hcmQgKi8KKyAgICB1bnNpZ25lZCBsb25nICB1bFZpZGVvTWVtb3J5U2l6ZTsgICAgLyogc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBtZW1vcnkgb24gdGhlIGJvYXJkICovCiAKLSAgICBQVUNIQVIgcGpJT0FkZHJlc3M7ICAgICAgICAgIC8qIGJhc2UgSS9PIGFkZHJlc3Mgb2YgVkdBIHBvcnRzICgweDNCMCkgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwaklPQWRkcmVzczsgICAgICAgICAgLyogYmFzZSBJL08gYWRkcmVzcyBvZiBWR0EgcG9ydHMgKDB4M0IwKSAqLwogCi0gICAgUFVDSEFSIHBqQ3VzdG9taXplZFJPTUltYWdlOworICAgIHVuc2lnbmVkIGNoYXIgKnBqQ3VzdG9taXplZFJPTUltYWdlOwogCi0gICAgUFVDSEFSIHBqMm5kVmlkZW9NZW1vcnlBZGRyZXNzOwotICAgIFVMT05HICB1bDJuZFZpZGVvTWVtb3J5U2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICpwajJuZFZpZGVvTWVtb3J5QWRkcmVzczsKKyAgICB1bnNpZ25lZCBsb25nICB1bDJuZFZpZGVvTWVtb3J5U2l6ZTsKIAotICAgIFBVQ0hBUiBwajJuZElPQWRkcmVzczsKLS8qI2lmbmRlZiBXSU4yMDAwCi0gICAgWEdJSU9BRERSRVNTIHBqSU9BZGRyZXNzOyAgIC8vICBiYXNlIEkvTyBhZGRyZXNzIG9mIFZHQSBwb3J0cyAoMHgzQjApCi0jZW5kaWYgKi8KLSAgICBVQ0hBUiAgakNoaXBUeXBlOyAgICAgICAgICAgIC8qIFVzZWQgdG8gSWRlbnRpZnkgR3JhcGhpY3MgQ2hpcCAqLworICAgIHVuc2lnbmVkIGNoYXIgKnBqMm5kSU9BZGRyZXNzOworICAgIHVuc2lnbmVkIGNoYXIgIGpDaGlwVHlwZTsgICAgICAgICAgICAvKiBVc2VkIHRvIElkZW50aWZ5IEdyYXBoaWNzIENoaXAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlIHR5cGUgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiWEdJX0NISVBfVFlQRSIgKi8KIAotICAgIFVDSEFSICBqQ2hpcFJldmlzaW9uOyAgICAgICAgLyogVXNlZCB0byBJZGVudGlmeSBHcmFwaGljcyBDaGlwIFJldmlzaW9uICovCisgICAgdW5zaWduZWQgY2hhciAgakNoaXBSZXZpc2lvbjsgICAgICAgIC8qIFVzZWQgdG8gSWRlbnRpZnkgR3JhcGhpY3MgQ2hpcCBSZXZpc2lvbiAqLwogCi0gICAgVUNIQVIgIHVqVkJDaGlwSUQ7ICAgICAgICAgICAvKiB0aGUgSUQgb2YgdmlkZW8gYnJpZGdlICovCisgICAgdW5zaWduZWQgY2hhciAgdWpWQkNoaXBJRDsgICAgICAgICAgIC8qIHRoZSBJRCBvZiB2aWRlbyBicmlkZ2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmluZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlIHR5cGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJYR0lfVkJfQ0hJUF9UWVBFIiAqLwogCi0gICAgQk9PTEVBTiAgICBiTmV3U2NyYXRjaDsKKyAgICB1bnNpZ25lZCBjaGFyICAgIGJOZXdTY3JhdGNoOwogCi0gICAgVUxPTkcgIHVsQ1JUMkxDRFR5cGU7ICAgICAgICAvKiBkZWZpbmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZSB0eXBlICovCisgICAgdW5zaWduZWQgbG9uZyAgdWxDUlQyTENEVHlwZTsgICAgICAgIC8qIGRlZmluZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlIHR5cGUgKi8KIAotICAgIFVMT05HIHVzRXh0ZXJuYWxDaGlwOyAgICAgICAvKiBOTyBWQiBvciBvdGhlciB2aWRlbyBicmlkZ2UgKG90aGVyIHRoYW4gICovCisgICAgdW5zaWduZWQgbG9uZyB1c0V4dGVybmFsQ2hpcDsgICAgICAgLyogTk8gVkIgb3Igb3RoZXIgdmlkZW8gYnJpZGdlIChvdGhlciB0aGFuICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHZpZGVvIGJyaWRnZSkgKi8KIAotICAgIEJPT0xFQU4gYkludGVncmF0ZWRNTUVuYWJsZWQ7Lyogc3VwcG9ydGluZyBpbnRlZ3JhdGlvbiBNTSBlbmFibGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJJbnRlZ3JhdGVkTU1FbmFibGVkOy8qIHN1cHBvcnRpbmcgaW50ZWdyYXRpb24gTU0gZW5hYmxlICovCiAKLSAgICBCT09MRUFOIGJTa2lwRHJhbVNpemluZzsgICAgIC8qIFRydWU6IFNraXAgdmlkZW8gbWVtb3J5IHNpemluZy4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJTa2lwRHJhbVNpemluZzsgICAgIC8qIFRydWU6IFNraXAgdmlkZW8gbWVtb3J5IHNpemluZy4gKi8KIAotICAgIEJPT0xFQU4gYlNraXBTZW5zZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJTa2lwU2Vuc2U7CiAKLSAgICBCT09MRUFOIGJJc1Bvd2VyU2F2aW5nOyAgICAgLyogVHJ1ZTogWEdJSW5pdCgpIGlzIGludm9rZWQgYnkgcG93ZXIgbWFuYWdlbWVudCwKKyAgICB1bnNpZ25lZCBjaGFyIGJJc1Bvd2VyU2F2aW5nOyAgICAgLyogVHJ1ZTogWEdJSW5pdCgpIGlzIGludm9rZWQgYnkgcG93ZXIgbWFuYWdlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGJ5IDJuZCBhZGFwdGVyJ3MgaW5pdGlhbHphdGlvbiAqLwogCi0gICAgUFhHSV9EU1JlZyAgcFNSOyAgICAgICAgICAgICAvKiByZXN0b3JlIFNSIHJlZ2lzdGVycyBpbiBpbml0aWFsIGZ1bmN0aW9uLiAqLworICAgIHN0cnVjdCBYR0lfRFNSZWcgICpwU1I7ICAgICAgICAgICAgIC8qIHJlc3RvcmUgU1IgcmVnaXN0ZXJzIGluIGluaXRpYWwgZnVuY3Rpb24uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZGF0YSA6KGlkeCwgdmFsKSA9ICAoRkYsIEZGKS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGUgOiByZXN0b3JlIFNSIHJlZ2lzdGVycyBpZiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJTa2lwRHJhbVNpemluZyA9IFRSVUUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJTa2lwRHJhbVNpemluZyA9IDEgKi8KIAotICAgIFBYR0lfRFNSZWcgIHBDUjsgICAgICAgICAgICAgLyogcmVzdG9yZSBDUiByZWdpc3RlcnMgaW4gaW5pdGlhbCBmdW5jdGlvbi4gKi8KKyAgICBzdHJ1Y3QgWEdJX0RTUmVnICAqcENSOyAgICAgICAgICAgICAvKiByZXN0b3JlIENSIHJlZ2lzdGVycyBpbiBpbml0aWFsIGZ1bmN0aW9uLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGRhdGEgOihpZHgsIHZhbCkgPSAgKEZGLCBGRikgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGUgOiByZXN0b3JlIGNSIHJlZ2lzdGVycyBpZiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJTa2lwRHJhbVNpemluZyA9IFRSVUUgKi8KLS8qCi0jZW5kaWYKLSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiU2tpcERyYW1TaXppbmcgPSAxICovCiAKLSAgICBQWEdJX1FVRVJZU1BBQ0UgIHBRdWVyeVZHQUNvbmZpZ1NwYWNlOworCXVuc2lnbmVkIGNoYXIoKnBRdWVyeVZHQUNvbmZpZ1NwYWNlKShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosCisJCQkJCSAgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyAqKTsKIAotICAgIFBYR0lfUVVFUllTUEFDRSAgcFF1ZXJ5Tm9ydGhCcmlkZ2VTcGFjZTsKKwl1bnNpZ25lZCBjaGFyKCpwUXVlcnlOb3J0aEJyaWRnZVNwYWNlKShzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICosCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKik7CiAKLSAgICBVQ0hBUiAgc3pWQklPU1ZlcltWQklPU19WRVJfTUFYX0xFTkdUSF07CisgICAgdW5zaWduZWQgY2hhciBzelZCSU9TVmVyW1ZCSU9TX1ZFUl9NQVhfTEVOR1RIXTsKIAogfTsKLSNlbmRpZgogCiAvKiBBZGR0aW9uYWwgSU9DVEwgZm9yIGNvbW11bmljYXRpb24geGdpZmIgPD4gWCBkcml2ZXIgICAgICAgICovCiAvKiBJZiBjaGFuZ2luZyB0aGlzLCB4Z2lmYi5oIG11c3QgYWxzbyBiZSBjaGFuZ2VkIChmb3IgeGdpZmIpICovCiAKLSNpZmRlZiBMSU5VWF9YRjg2ICAvKiBXZSBkb24ndCB3YW50IHRoZSBYIGRyaXZlciB0byBkZXBlbmQgb24gdGhlIGtlcm5lbCBzb3VyY2UgKi8KLQotLyogaW9jdGwgZm9yIGlkZW50aWZ5aW5nIGFuZCBnaXZpbmcgc29tZSBpbmZvIChlc3AuIG1lbW9yeSBoZWFwIHN0YXJ0KSAqLwotI2RlZmluZSBYR0lGQl9HRVRfSU5GTyAgICAweDgwMDQ2ZWY4ICAvKiBXb3csIHdoYXQgYSB0ZXJyaWJsZSBoYWNrLi4uICovCi0KLS8qIFN0cnVjdHVyZSBhcmd1bWVudCBmb3IgWEdJRkJfR0VUX0lORk8gaW9jdGwgICovCi10eXBlZGVmIHN0cnVjdCBfWEdJRkJfSU5GTyB4Z2lmYl9pbmZvLCAqcHhnaWZiX2luZm87Ci0KLXN0cnVjdCBfWEdJRkJfSU5GTyB7Ci0JQ0FSRDMyIAl4Z2lmYl9pZDsgICAgICAgICAJLyogZm9yIGlkZW50aWZ5aW5nIHhnaWZiICovCi0jaWZuZGVmIFhHSUZCX0lECi0jZGVmaW5lIFhHSUZCX0lECSAgMHg1MzQ5NTM0NiAgICAvKiBJZGVudGlmeSBteXNlbGYgd2l0aCAnWEdJRicgKi8KLSNlbmRpZgotIAlDQVJEMzIgCWNoaXBfaWQ7CQkvKiBQQ0kgSUQgb2YgZGV0ZWN0ZWQgY2hpcCAqLwotCUNBUkQzMgltZW1vcnk7CQkJLyogdmlkZW8gbWVtb3J5IGluIEtCIHdoaWNoIHhnaWZiIG1hbmFnZXMgKi8KLQlDQVJEMzIJaGVhcHN0YXJ0OyAgICAgICAgICAgICAJLyogaGVhcCBzdGFydCAoPSB4Z2lmYiAibWVtIiBhcmd1bWVudCkgaW4gS0IgKi8KLQlDQVJEOCAJZmJ2aWRtb2RlOwkJLyogY3VycmVudCB4Z2lmYiBtb2RlICovCi0KLQlDQVJEOCAJeGdpZmJfdmVyc2lvbjsKLQlDQVJEOAl4Z2lmYl9yZXZpc2lvbjsKLQlDQVJEOCAJeGdpZmJfcGF0Y2hsZXZlbDsKLQotCUNBUkQ4IAl4Z2lmYl9jYXBzOwkJLyogeGdpZmIncyBjYXBhYmlsaXRpZXMgKi8KLQotCUNBUkQzMiAJeGdpZmJfdHFsZW47CQkvKiB0dXJibyBxdWV1ZSBsZW5ndGggKGluIEtCKSAqLwotCi0JQ0FSRDMyIAl4Z2lmYl9wY2lidXM7ICAgICAgCS8qIFRoZSBjYXJkJ3MgUENJIElEICovCi0JQ0FSRDMyIAl4Z2lmYl9wY2lzbG90OwotCUNBUkQzMiAJeGdpZmJfcGNpZnVuYzsKLQotCUNBUkQ4IAl4Z2lmYl9sY2RwZGM7Ci0KLQlDQVJEOAl4Z2lmYl9sY2RhOwotCi0JQ0FSRDMyCXhnaWZiX3ZiZmxhZ3M7Ci0JQ0FSRDMyCXhnaWZiX2N1cnJlbnR2YmZsYWdzOwotCi0JQ0FSRDMyIAl4Z2lmYl9zY2FsZWxjZDsKLQlDQVJEMzIgCXhnaWZiX3NwZWNpYWx0aW1pbmc7Ci0KLQlDQVJEOCAJeGdpZmJfaGF2ZWVtaTsKLQlDQVJEOCAJeGdpZmJfZW1pMzAseGdpZmJfZW1pMzEseGdpZmJfZW1pMzIseGdpZmJfZW1pMzM7Ci0JQ0FSRDggCXhnaWZiX2hhdmVlbWlsY2Q7Ci0KLQlDQVJEOCAJeGdpZmJfbGNkcGRjYTsKLQotCUNBUkQ4IHJlc2VydmVkWzIxMl07IAkJLyogZm9yIGZ1dHVyZSB1c2UgKi8KLX07Ci0jZW5kaWYKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTRhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnCkBAIC0wLDAgKzEsMjkgQEAKK2NvbmZpZyBaUkFNCisJdHJpc3RhdGUgIkNvbXByZXNzZWQgUkFNIGJsb2NrIGRldmljZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQkxPQ0sKKwlzZWxlY3QgTFpPX0NPTVBSRVNTCisJc2VsZWN0IExaT19ERUNPTVBSRVNTCisJZGVmYXVsdCBuCisJaGVscAorCSAgQ3JlYXRlcyB2aXJ0dWFsIGJsb2NrIGRldmljZXMgY2FsbGVkIC9kZXYvenJhbVggKFggPSAwLCAxLCAuLi4pLgorCSAgUGFnZXMgd3JpdHRlbiB0byB0aGVzZSBkaXNrcyBhcmUgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIG1lbW9yeQorCSAgaXRzZWxmLiBUaGVzZSBkaXNrcyBhbGxvdyB2ZXJ5IGZhc3QgSS9PIGFuZCBjb21wcmVzc2lvbiBwcm92aWRlcworCSAgZ29vZCBhbW91bnRzIG9mIG1lbW9yeSBzYXZpbmdzLgorCisJICBJdCBoYXMgc2V2ZXJhbCB1c2UgY2FzZXMsIGZvciBleGFtcGxlOiAvdG1wIHN0b3JhZ2UsIHVzZSBhcyBzd2FwCisJICBkaXNrcyBhbmQgbWF5YmUgbWFueSBtb3JlLgorCisJICBTZWUgenJhbS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJICBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20vCisKK2NvbmZpZyBaUkFNX1NUQVRTCisJYm9vbCAiRW5hYmxlIHN0YXRpc3RpY3MgZm9yIGNvbXByZXNzZWQgUkFNIGRpc2tzIgorCWRlcGVuZHMgb24gWlJBTQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIGNvbXByZXNzZWQgUkFNIGRldmljZXMuIFN0YXRpc3RpY3MKKwkgIGFyZSBleHBvcnRlZCB0aHJvdWdoIGlvY3RsIGludGVyZmFjZSwgc28geW91IGhhdmUgdG8gdXNlIHpyYW1jb25maWcKKwkgIHByb2dyYW0gdG8gZ2V0IHRoZW0uIFRoaXMgYWRkcyBvbmx5IGEgbWluaW1hbCBvdmVyaGVhZC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3pyYW0vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmMwODdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0vTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACit6cmFtLW9ianMJOj0JenJhbV9kcnYubyB4dm1hbGxvYy5vCisKK29iai0kKENPTkZJR19aUkFNKQkrPQl6cmFtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0veHZtYWxsb2MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0veHZtYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvY19pbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2NfaW50LmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jX2ludC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMGVkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtLnR4dApAQCAtMCwwICsxLDYyIEBACit6cmFtOiBDb21wcmVzc2VkIFJBTSBiYXNlZCBibG9jayBkZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Byb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbS8KKworKiBJbnRyb2R1Y3Rpb24KKworVGhlIHpyYW0gbW9kdWxlIGNyZWF0ZXMgUkFNIGJhc2VkIGJsb2NrIGRldmljZXM6IC9kZXYvcmFtWCAoWCA9IDAsIDEsIC4uLikuCitQYWdlcyB3cml0dGVuIHRvIHRoZXNlIGRpc2tzIGFyZSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gbWVtb3J5IGl0c2VsZi4KK1RoZXNlIGRpc2tzIGFsbG93IHZlcnkgZmFzdCBJL08gYW5kIGNvbXByZXNzaW9uIHByb3ZpZGVzIGdvb2QgYW1vdW50cyBvZgorbWVtb3J5IHNhdmluZ3MuCisKK1NlZSBwcm9qZWN0IGhvbWUgZm9yIHVzZSBjYXNlcywgcGVyZm9ybWFuY2UgbnVtYmVycyBhbmQgYSBsb3QgbW9yZS4KKworSW5kaXZpZHVhbCB6cmFtIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYW5kIGluaXRpYWxpemVkIHVzaW5nIHpyYW1jb25maWcKK3VzZXJzcGFjZSB1dGlsaXR5IGFzIHNob3duIGluIGV4YW1wbGVzIGJlbG93LiBTZWUgenJhbWNvbmZpZyBtYW4gcGFnZSBmb3IKK21vcmUgZGV0YWlscy4KKworKiBVc2FnZQorCitGb2xsb3dpbmcgc2hvd3MgYSB0eXBpY2FsIHNlcXVlbmNlIG9mIHN0ZXBzIGZvciB1c2luZyB6cmFtLgorCisxKSBMb2FkIE1vZHVsZXM6CisJbW9kcHJvYmUgenJhbSBudW1fZGV2aWNlcz00CisJVGhpcyBjcmVhdGVzIDQgKHVuaW5pdGlhbGl6ZWQpIGRldmljZXM6IC9kZXYvenJhbXswLDEsMiwzfQorCShudW1fZGV2aWNlcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIERlZmF1bHQ6IDEpCisKKzIpIEluaXRpYWxpemU6CisJVXNlIHpyYW1jb25maWcgdXRpbGl0eSB0byBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgaW5kaXZpZHVhbAorCXpyYW0gZGV2aWNlcy4gRm9yIGV4YW1wbGU6CisJenJhbWNvbmZpZyAvZGV2L3pyYW0wIC0taW5pdCAjIHVzZXMgZGVmYXVsdCB2YWx1ZSBvZiBkaXNrc2l6ZV9rYgorCXpyYW1jb25maWcgL2Rldi96cmFtMSAtLWRpc2tzaXplX2tiPTEwMjQwMCAjIDEwME1CIC9kZXYvenJhbTEKKworCSpTZWUgenJhbWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyoKKworMykgQWN0aXZhdGU6CisJbWtzd2FwIC9kZXYvenJhbTAKKwlzd2Fwb24gL2Rldi96cmFtMAorCisJbWtmcy5leHQ0IC9kZXYvenJhbTEKKwltb3VudCAvZGV2L3pyYW0xIC90bXAKKworNCkgU3RhdHM6CisJenJhbWNvbmZpZyAvZGV2L3pyYW0wIC0tc3RhdHMKKwl6cmFtY29uZmlnIC9kZXYvenJhbTEgLS1zdGF0cworCis1KSBEZWFjdGl2YXRlOgorCXN3YXBvZmYgL2Rldi96cmFtMAorCXVtb3VudCAvZGV2L3pyYW0xCisKKzYpIFJlc2V0OgorCXpyYW1jb25maWcgL2Rldi96cmFtMCAtLXJlc2V0CisJenJhbWNvbmZpZyAvZGV2L3pyYW0xIC0tcmVzZXQKKwkoVGhpcyBmcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gZGV2aWNlKS4KKworCitQbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBhdDoKKyAtIE1haWxpbmcgbGlzdDogbGludXgtbW0tY2MgYXQgbGFwdG9wIGRvdCBvcmcKKyAtIElzc3VlIHRyYWNrZXI6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jb21wY2FjaGUvaXNzdWVzL2xpc3QKKworTml0aW4gR3VwdGEKK25ndXB0YUB2ZmxhcmUub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Q0ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYwpAQCAtMCwwICsxLDgwNSBAQAorLyoKKyAqIENvbXByZXNzZWQgUkFNIGJsb2NrIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCAgTml0aW4gR3VwdGEKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKKyAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKyAqCisgKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KKyAqLworCisjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJ6cmFtIgorI2RlZmluZSBwcl9mbXQoZm10KSBLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbHpvLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAienJhbV9kcnYuaCIKKworLyogR2xvYmFscyAqLworc3RhdGljIGludCB6cmFtX21ham9yOworc3RhdGljIHN0cnVjdCB6cmFtICpkZXZpY2VzOworCisvKiBNb2R1bGUgcGFyYW1zIChkb2N1bWVudGF0aW9uIGF0IGVuZCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2RldmljZXM7CisKK3N0YXRpYyBpbnQgenJhbV90ZXN0X2ZsYWcoc3RydWN0IHpyYW0gKnpyYW0sIHUzMiBpbmRleCwKKwkJCWVudW0genJhbV9wYWdlZmxhZ3MgZmxhZykKK3sKKwlyZXR1cm4genJhbS0+dGFibGVbaW5kZXhdLmZsYWdzICYgQklUKGZsYWcpOworfQorCitzdGF0aWMgdm9pZCB6cmFtX3NldF9mbGFnKHN0cnVjdCB6cmFtICp6cmFtLCB1MzIgaW5kZXgsCisJCQllbnVtIHpyYW1fcGFnZWZsYWdzIGZsYWcpCit7CisJenJhbS0+dGFibGVbaW5kZXhdLmZsYWdzIHw9IEJJVChmbGFnKTsKK30KKworc3RhdGljIHZvaWQgenJhbV9jbGVhcl9mbGFnKHN0cnVjdCB6cmFtICp6cmFtLCB1MzIgaW5kZXgsCisJCQllbnVtIHpyYW1fcGFnZWZsYWdzIGZsYWcpCit7CisJenJhbS0+dGFibGVbaW5kZXhdLmZsYWdzICY9IH5CSVQoZmxhZyk7Cit9CisKK3N0YXRpYyBpbnQgcGFnZV96ZXJvX2ZpbGxlZCh2b2lkICpwdHIpCit7CisJdW5zaWduZWQgaW50IHBvczsKKwl1bnNpZ25lZCBsb25nICpwYWdlOworCisJcGFnZSA9ICh1bnNpZ25lZCBsb25nICopcHRyOworCisJZm9yIChwb3MgPSAwOyBwb3MgIT0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpwYWdlKTsgcG9zKyspIHsKKwkJaWYgKHBhZ2VbcG9zXSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB6cmFtX3NldF9kaXNrc2l6ZShzdHJ1Y3QgenJhbSAqenJhbSwgc2l6ZV90IHRvdGFscmFtX2J5dGVzKQoreworCWlmICghenJhbS0+ZGlza3NpemUpIHsKKwkJcHJfaW5mbygKKwkJImRpc2sgc2l6ZSBub3QgcHJvdmlkZWQuIFlvdSBjYW4gdXNlIGRpc2tzaXplX2tiIG1vZHVsZSAiCisJCSJwYXJhbSB0byBzcGVjaWZ5IHNpemUuXG5Vc2luZyBkZWZhdWx0OiAoJXUlJSBvZiBSQU0pLlxuIiwKKwkJZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbQorCQkpOworCQl6cmFtLT5kaXNrc2l6ZSA9IGRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0gKgorCQkJCQkodG90YWxyYW1fYnl0ZXMgLyAxMDApOworCX0KKworCWlmICh6cmFtLT5kaXNrc2l6ZSA+IDIgKiAodG90YWxyYW1fYnl0ZXMpKSB7CisJCXByX2luZm8oCisJCSJUaGVyZSBpcyBsaXR0bGUgcG9pbnQgY3JlYXRpbmcgYSB6cmFtIG9mIGdyZWF0ZXIgdGhhbiAiCisJCSJ0d2ljZSB0aGUgc2l6ZSBvZiBtZW1vcnkgc2luY2Ugd2UgZXhwZWN0IGEgMjoxIGNvbXByZXNzaW9uICIKKwkJInJhdGlvLiBOb3RlIHRoYXQgenJhbSB1c2VzIGFib3V0IDAuMSUlIG9mIHRoZSBzaXplIG9mICIKKwkJInRoZSBkaXNrIHdoZW4gbm90IGluIHVzZSBzbyBhIGh1Z2UgenJhbSBpcyAiCisJCSJ3YXN0ZWZ1bC5cbiIKKwkJIlx0TWVtb3J5IFNpemU6ICV6dSBrQlxuIgorCQkiXHRTaXplIHlvdSBzZWxlY3RlZDogJXp1IGtCXG4iCisJCSJDb250aW51aW5nIGFueXdheSAuLi5cbiIsCisJCXRvdGFscmFtX2J5dGVzID4+IDEwLCB6cmFtLT5kaXNrc2l6ZQorCQkpOworCX0KKworCXpyYW0tPmRpc2tzaXplICY9IFBBR0VfTUFTSzsKK30KKworc3RhdGljIHZvaWQgenJhbV9pb2N0bF9nZXRfc3RhdHMoc3RydWN0IHpyYW0gKnpyYW0sCisJCQlzdHJ1Y3QgenJhbV9pb2N0bF9zdGF0cyAqcykKK3sKKwlzLT5kaXNrc2l6ZSA9IHpyYW0tPmRpc2tzaXplOworCisjaWYgZGVmaW5lZChDT05GSUdfWlJBTV9TVEFUUykKKwl7CisJc3RydWN0IHpyYW1fc3RhdHMgKnJzID0gJnpyYW0tPnN0YXRzOworCXNpemVfdCBzdWNjX3dyaXRlcywgbWVtX3VzZWQ7CisJdW5zaWduZWQgaW50IGdvb2RfY29tcHJlc3NfcGVyYyA9IDAsIG5vX2NvbXByZXNzX3BlcmMgPSAwOworCisJbWVtX3VzZWQgPSB4dl9nZXRfdG90YWxfc2l6ZV9ieXRlcyh6cmFtLT5tZW1fcG9vbCkKKwkJCSsgKHJzLT5wYWdlc19leHBhbmQgPDwgUEFHRV9TSElGVCk7CisJc3VjY193cml0ZXMgPSB6cmFtX3N0YXQ2NF9yZWFkKHpyYW0sICZycy0+bnVtX3dyaXRlcykgLQorCQkJenJhbV9zdGF0NjRfcmVhZCh6cmFtLCAmcnMtPmZhaWxlZF93cml0ZXMpOworCisJaWYgKHN1Y2Nfd3JpdGVzICYmIHJzLT5wYWdlc19zdG9yZWQpIHsKKwkJZ29vZF9jb21wcmVzc19wZXJjID0gcnMtPmdvb2RfY29tcHJlc3MgKiAxMDAKKwkJCQkJLyBycy0+cGFnZXNfc3RvcmVkOworCQlub19jb21wcmVzc19wZXJjID0gcnMtPnBhZ2VzX2V4cGFuZCAqIDEwMAorCQkJCQkvIHJzLT5wYWdlc19zdG9yZWQ7CisJfQorCisJcy0+bnVtX3JlYWRzID0genJhbV9zdGF0NjRfcmVhZCh6cmFtLCAmcnMtPm51bV9yZWFkcyk7CisJcy0+bnVtX3dyaXRlcyA9IHpyYW1fc3RhdDY0X3JlYWQoenJhbSwgJnJzLT5udW1fd3JpdGVzKTsKKwlzLT5mYWlsZWRfcmVhZHMgPSB6cmFtX3N0YXQ2NF9yZWFkKHpyYW0sICZycy0+ZmFpbGVkX3JlYWRzKTsKKwlzLT5mYWlsZWRfd3JpdGVzID0genJhbV9zdGF0NjRfcmVhZCh6cmFtLCAmcnMtPmZhaWxlZF93cml0ZXMpOworCXMtPmludmFsaWRfaW8gPSB6cmFtX3N0YXQ2NF9yZWFkKHpyYW0sICZycy0+aW52YWxpZF9pbyk7CisJcy0+bm90aWZ5X2ZyZWUgPSB6cmFtX3N0YXQ2NF9yZWFkKHpyYW0sICZycy0+bm90aWZ5X2ZyZWUpOworCXMtPnBhZ2VzX3plcm8gPSBycy0+cGFnZXNfemVybzsKKworCXMtPmdvb2RfY29tcHJlc3NfcGN0ID0gZ29vZF9jb21wcmVzc19wZXJjOworCXMtPnBhZ2VzX2V4cGFuZF9wY3QgPSBub19jb21wcmVzc19wZXJjOworCisJcy0+cGFnZXNfc3RvcmVkID0gcnMtPnBhZ2VzX3N0b3JlZDsKKwlzLT5wYWdlc191c2VkID0gbWVtX3VzZWQgPj4gUEFHRV9TSElGVDsKKwlzLT5vcmlnX2RhdGFfc2l6ZSA9IHJzLT5wYWdlc19zdG9yZWQgPDwgUEFHRV9TSElGVDsKKwlzLT5jb21wcl9kYXRhX3NpemUgPSBycy0+Y29tcHJfc2l6ZTsKKwlzLT5tZW1fdXNlZF90b3RhbCA9IG1lbV91c2VkOworCX0KKyNlbmRpZiAvKiBDT05GSUdfWlJBTV9TVEFUUyAqLworfQorCitzdGF0aWMgdm9pZCB6cmFtX2ZyZWVfcGFnZShzdHJ1Y3QgenJhbSAqenJhbSwgc2l6ZV90IGluZGV4KQoreworCXUzMiBjbGVuOworCXZvaWQgKm9iajsKKworCXN0cnVjdCBwYWdlICpwYWdlID0genJhbS0+dGFibGVbaW5kZXhdLnBhZ2U7CisJdTMyIG9mZnNldCA9IHpyYW0tPnRhYmxlW2luZGV4XS5vZmZzZXQ7CisKKwlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCS8qCisJCSAqIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHplcm8gZmlsbGVkIHBhZ2VzLgorCQkgKiBTaW1wbHkgY2xlYXIgemVybyBwYWdlIGZsYWcuCisJCSAqLworCQlpZiAoenJhbV90ZXN0X2ZsYWcoenJhbSwgaW5kZXgsIFpSQU1fWkVSTykpIHsKKwkJCXpyYW1fY2xlYXJfZmxhZyh6cmFtLCBpbmRleCwgWlJBTV9aRVJPKTsKKwkJCXpyYW1fc3RhdF9kZWMoJnpyYW0tPnN0YXRzLnBhZ2VzX3plcm8pOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoenJhbV90ZXN0X2ZsYWcoenJhbSwgaW5kZXgsIFpSQU1fVU5DT01QUkVTU0VEKSkpIHsKKwkJY2xlbiA9IFBBR0VfU0laRTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXpyYW1fY2xlYXJfZmxhZyh6cmFtLCBpbmRleCwgWlJBTV9VTkNPTVBSRVNTRUQpOworCQl6cmFtX3N0YXRfZGVjKCZ6cmFtLT5zdGF0cy5wYWdlc19leHBhbmQpOworCQlnb3RvIG91dDsKKwl9CisKKwlvYmogPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgKyBvZmZzZXQ7CisJY2xlbiA9IHh2X2dldF9vYmplY3Rfc2l6ZShvYmopIC0gc2l6ZW9mKHN0cnVjdCB6b2JqX2hlYWRlcik7CisJa3VubWFwX2F0b21pYyhvYmosIEtNX1VTRVIwKTsKKworCXh2X2ZyZWUoenJhbS0+bWVtX3Bvb2wsIHBhZ2UsIG9mZnNldCk7CisJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKKwkJenJhbV9zdGF0X2RlYygmenJhbS0+c3RhdHMuZ29vZF9jb21wcmVzcyk7CisKK291dDoKKwl6cmFtLT5zdGF0cy5jb21wcl9zaXplIC09IGNsZW47CisJenJhbV9zdGF0X2RlYygmenJhbS0+c3RhdHMucGFnZXNfc3RvcmVkKTsKKworCXpyYW0tPnRhYmxlW2luZGV4XS5wYWdlID0gTlVMTDsKKwl6cmFtLT50YWJsZVtpbmRleF0ub2Zmc2V0ID0gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3plcm9fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl2b2lkICp1c2VyX21lbTsKKworCXVzZXJfbWVtID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldCh1c2VyX21lbSwgMCwgUEFHRV9TSVpFKTsKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3VuY29tcHJlc3NlZF9wYWdlKHN0cnVjdCB6cmFtICp6cmFtLAorCQkJCXN0cnVjdCBwYWdlICpwYWdlLCB1MzIgaW5kZXgpCit7CisJdW5zaWduZWQgY2hhciAqdXNlcl9tZW0sICpjbWVtOworCisJdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJY21lbSA9IGttYXBfYXRvbWljKHpyYW0tPnRhYmxlW2luZGV4XS5wYWdlLCBLTV9VU0VSMSkgKworCQkJenJhbS0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCW1lbWNweSh1c2VyX21lbSwgY21lbSwgUEFHRV9TSVpFKTsKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKK30KKworc3RhdGljIGludCB6cmFtX3JlYWQoc3RydWN0IHpyYW0gKnpyYW0sIHN0cnVjdCBiaW8gKmJpbykKK3sKKworCWludCBpOworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKworCXpyYW1fc3RhdDY0X2luYyh6cmFtLCAmenJhbS0+c3RhdHMubnVtX3JlYWRzKTsKKworCWluZGV4ID0gYmlvLT5iaV9zZWN0b3IgPj4gU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKKwkJaW50IHJldDsKKwkJc2l6ZV90IGNsZW47CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlzdHJ1Y3Qgem9ial9oZWFkZXIgKnpoZWFkZXI7CisJCXVuc2lnbmVkIGNoYXIgKnVzZXJfbWVtLCAqY21lbTsKKworCQlwYWdlID0gYnZlYy0+YnZfcGFnZTsKKworCQlpZiAoenJhbV90ZXN0X2ZsYWcoenJhbSwgaW5kZXgsIFpSQU1fWkVSTykpIHsKKwkJCWhhbmRsZV96ZXJvX3BhZ2UocGFnZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJlcXVlc3RlZCBwYWdlIGlzIG5vdCBwcmVzZW50IGluIGNvbXByZXNzZWQgYXJlYSAqLworCQlpZiAodW5saWtlbHkoIXpyYW0tPnRhYmxlW2luZGV4XS5wYWdlKSkgeworCQkJcHJfZGVidWcoIlJlYWQgYmVmb3JlIHdyaXRlOiBzZWN0b3I9JWx1LCBzaXplPSV1IiwKKwkJCQkodWxvbmcpKGJpby0+Ymlfc2VjdG9yKSwgYmlvLT5iaV9zaXplKTsKKwkJCS8qIERvIG5vdGhpbmcgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUGFnZSBpcyBzdG9yZWQgdW5jb21wcmVzc2VkIHNpbmNlIGl0J3MgaW5jb21wcmVzc2libGUgKi8KKwkJaWYgKHVubGlrZWx5KHpyYW1fdGVzdF9mbGFnKHpyYW0sIGluZGV4LCBaUkFNX1VOQ09NUFJFU1NFRCkpKSB7CisJCQloYW5kbGVfdW5jb21wcmVzc2VkX3BhZ2UoenJhbSwgcGFnZSwgaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJY2xlbiA9IFBBR0VfU0laRTsKKworCQljbWVtID0ga21hcF9hdG9taWMoenJhbS0+dGFibGVbaW5kZXhdLnBhZ2UsIEtNX1VTRVIxKSArCisJCQkJenJhbS0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCQlyZXQgPSBsem8xeF9kZWNvbXByZXNzX3NhZmUoCisJCQljbWVtICsgc2l6ZW9mKCp6aGVhZGVyKSwKKwkJCXh2X2dldF9vYmplY3Rfc2l6ZShjbWVtKSAtIHNpemVvZigqemhlYWRlciksCisJCQl1c2VyX21lbSwgJmNsZW4pOworCisJCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKKwkJa3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7CisKKwkJLyogU2hvdWxkIE5FVkVSIGhhcHBlbi4gUmV0dXJuIGJpbyBlcnJvciBpZiBpdCBkb2VzLiAqLworCQlpZiAodW5saWtlbHkocmV0ICE9IExaT19FX09LKSkgeworCQkJcHJfZXJyKCJEZWNvbXByZXNzaW9uIGZhaWxlZCEgZXJyPSVkLCBwYWdlPSV1XG4iLAorCQkJCXJldCwgaW5kZXgpOworCQkJenJhbV9zdGF0NjRfaW5jKHpyYW0sICZ6cmFtLT5zdGF0cy5mYWlsZWRfcmVhZHMpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJaW5kZXgrKzsKKwl9CisKKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworCitvdXQ6CisJYmlvX2lvX2Vycm9yKGJpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenJhbV93cml0ZShzdHJ1Y3QgenJhbSAqenJhbSwgc3RydWN0IGJpbyAqYmlvKQoreworCWludCBpOworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKworCXpyYW1fc3RhdDY0X2luYyh6cmFtLCAmenJhbS0+c3RhdHMubnVtX3dyaXRlcyk7CisKKwlpbmRleCA9IGJpby0+Ymlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKKwkJaW50IHJldDsKKwkJdTMyIG9mZnNldDsKKwkJc2l6ZV90IGNsZW47CisJCXN0cnVjdCB6b2JqX2hlYWRlciAqemhlYWRlcjsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsICpwYWdlX3N0b3JlOworCQl1bnNpZ25lZCBjaGFyICp1c2VyX21lbSwgKmNtZW0sICpzcmM7CisKKwkJcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CisJCXNyYyA9IHpyYW0tPmNvbXByZXNzX2J1ZmZlcjsKKworCQkvKgorCQkgKiBTeXN0ZW0gb3ZlcndyaXRlcyB1bnVzZWQgc2VjdG9ycy4gRnJlZSBtZW1vcnkgYXNzb2NpYXRlZAorCQkgKiB3aXRoIHRoaXMgc2VjdG9yIG5vdy4KKwkJICovCisJCWlmICh6cmFtLT50YWJsZVtpbmRleF0ucGFnZSB8fAorCQkJCXpyYW1fdGVzdF9mbGFnKHpyYW0sIGluZGV4LCBaUkFNX1pFUk8pKQorCQkJenJhbV9mcmVlX3BhZ2UoenJhbSwgaW5kZXgpOworCisJCW11dGV4X2xvY2soJnpyYW0tPmxvY2spOworCisJCXVzZXJfbWVtID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlpZiAocGFnZV96ZXJvX2ZpbGxlZCh1c2VyX21lbSkpIHsKKwkJCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKKwkJCW11dGV4X3VubG9jaygmenJhbS0+bG9jayk7CisJCQl6cmFtX3N0YXRfaW5jKCZ6cmFtLT5zdGF0cy5wYWdlc196ZXJvKTsKKwkJCXpyYW1fc2V0X2ZsYWcoenJhbSwgaW5kZXgsIFpSQU1fWkVSTyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IGx6bzF4XzFfY29tcHJlc3ModXNlcl9tZW0sIFBBR0VfU0laRSwgc3JjLCAmY2xlbiwKKwkJCQkJenJhbS0+Y29tcHJlc3Nfd29ya21lbSk7CisKKwkJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gTFpPX0VfT0spKSB7CisJCQltdXRleF91bmxvY2soJnpyYW0tPmxvY2spOworCQkJcHJfZXJyKCJDb21wcmVzc2lvbiBmYWlsZWQhIGVycj0lZFxuIiwgcmV0KTsKKwkJCXpyYW1fc3RhdDY0X2luYyh6cmFtLCAmenJhbS0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFBhZ2UgaXMgaW5jb21wcmVzc2libGUuIFN0b3JlIGl0IGFzLWlzICh1bmNvbXByZXNzZWQpCisJCSAqIHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIHJldHVybiB0b28gbWFueSBkaXNrIHdyaXRlCisJCSAqIGVycm9ycyB3aGljaCBoYXMgc2lkZSBlZmZlY3Qgb2YgaGFuZ2luZyB0aGUgc3lzdGVtLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGNsZW4gPiBtYXhfenBhZ2Vfc2l6ZSkpIHsKKwkJCWNsZW4gPSBQQUdFX1NJWkU7CisJCQlwYWdlX3N0b3JlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0pOworCQkJaWYgKHVubGlrZWx5KCFwYWdlX3N0b3JlKSkgeworCQkJCW11dGV4X3VubG9jaygmenJhbS0+bG9jayk7CisJCQkJcHJfaW5mbygiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yICIKKwkJCQkJImluY29tcHJlc3NpYmxlIHBhZ2U6ICV1XG4iLCBpbmRleCk7CisJCQkJenJhbV9zdGF0NjRfaW5jKHpyYW0sCisJCQkJCSZ6cmFtLT5zdGF0cy5mYWlsZWRfd3JpdGVzKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJb2Zmc2V0ID0gMDsKKwkJCXpyYW1fc2V0X2ZsYWcoenJhbSwgaW5kZXgsIFpSQU1fVU5DT01QUkVTU0VEKTsKKwkJCXpyYW1fc3RhdF9pbmMoJnpyYW0tPnN0YXRzLnBhZ2VzX2V4cGFuZCk7CisJCQl6cmFtLT50YWJsZVtpbmRleF0ucGFnZSA9IHBhZ2Vfc3RvcmU7CisJCQlzcmMgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQlnb3RvIG1lbXN0b3JlOworCQl9CisKKwkJaWYgKHh2X21hbGxvYyh6cmFtLT5tZW1fcG9vbCwgY2xlbiArIHNpemVvZigqemhlYWRlciksCisJCQkJJnpyYW0tPnRhYmxlW2luZGV4XS5wYWdlLCAmb2Zmc2V0LAorCQkJCUdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSkpIHsKKwkJCW11dGV4X3VubG9jaygmenJhbS0+bG9jayk7CisJCQlwcl9pbmZvKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgY29tcHJlc3NlZCAiCisJCQkJInBhZ2U6ICV1LCBzaXplPSV6dVxuIiwgaW5kZXgsIGNsZW4pOworCQkJenJhbV9zdGF0NjRfaW5jKHpyYW0sICZ6cmFtLT5zdGF0cy5mYWlsZWRfd3JpdGVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisKK21lbXN0b3JlOgorCQl6cmFtLT50YWJsZVtpbmRleF0ub2Zmc2V0ID0gb2Zmc2V0OworCisJCWNtZW0gPSBrbWFwX2F0b21pYyh6cmFtLT50YWJsZVtpbmRleF0ucGFnZSwgS01fVVNFUjEpICsKKwkJCQl6cmFtLT50YWJsZVtpbmRleF0ub2Zmc2V0OworCisjaWYgMAorCQkvKiBCYWNrLXJlZmVyZW5jZSBuZWVkZWQgZm9yIG1lbW9yeSBkZWZyYWdtZW50YXRpb24gKi8KKwkJaWYgKCF6cmFtX3Rlc3RfZmxhZyh6cmFtLCBpbmRleCwgWlJBTV9VTkNPTVBSRVNTRUQpKSB7CisJCQl6aGVhZGVyID0gKHN0cnVjdCB6b2JqX2hlYWRlciAqKWNtZW07CisJCQl6aGVhZGVyLT50YWJsZV9pZHggPSBpbmRleDsKKwkJCWNtZW0gKz0gc2l6ZW9mKCp6aGVhZGVyKTsKKwkJfQorI2VuZGlmCisKKwkJbWVtY3B5KGNtZW0sIHNyYywgY2xlbik7CisKKwkJa3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7CisJCWlmICh1bmxpa2VseSh6cmFtX3Rlc3RfZmxhZyh6cmFtLCBpbmRleCwgWlJBTV9VTkNPTVBSRVNTRUQpKSkKKwkJCWt1bm1hcF9hdG9taWMoc3JjLCBLTV9VU0VSMCk7CisKKwkJLyogVXBkYXRlIHN0YXRzICovCisJCXpyYW0tPnN0YXRzLmNvbXByX3NpemUgKz0gY2xlbjsKKwkJenJhbV9zdGF0X2luYygmenJhbS0+c3RhdHMucGFnZXNfc3RvcmVkKTsKKwkJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKKwkJCXpyYW1fc3RhdF9pbmMoJnpyYW0tPnN0YXRzLmdvb2RfY29tcHJlc3MpOworCisJCW11dGV4X3VubG9jaygmenJhbS0+bG9jayk7CisJCWluZGV4Kys7CisJfQorCisJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwliaW9fZW5kaW8oYmlvLCAwKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWJpb19pb19lcnJvcihiaW8pOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgcmVxdWVzdCBpcyB3aXRoaW4gYm91bmRzIGFuZCBwYWdlIGFsaWduZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2lvX3JlcXVlc3Qoc3RydWN0IHpyYW0gKnpyYW0sIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpZiAodW5saWtlbHkoCisJCShiaW8tPmJpX3NlY3RvciA+PSAoenJhbS0+ZGlza3NpemUgPj4gU0VDVE9SX1NISUZUKSkgfHwKKwkJKGJpby0+Ymlfc2VjdG9yICYgKFNFQ1RPUlNfUEVSX1BBR0UgLSAxKSkgfHwKKwkJKGJpby0+Ymlfc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpKSB7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSS9PIHJlcXVlc3QgaXMgdmFsaWQgKi8KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEhhbmRsZXIgZnVuY3Rpb24gZm9yIGFsbCB6cmFtIEkvTyByZXF1ZXN0cy4KKyAqLworc3RhdGljIGludCB6cmFtX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgenJhbSAqenJhbSA9IHF1ZXVlLT5xdWV1ZWRhdGE7CisKKwlpZiAodW5saWtlbHkoIXpyYW0tPmluaXRfZG9uZSkpIHsKKwkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmFsaWRfaW9fcmVxdWVzdCh6cmFtLCBiaW8pKSB7CisJCXpyYW1fc3RhdDY0X2luYyh6cmFtLCAmenJhbS0+c3RhdHMuaW52YWxpZF9pbyk7CisJCWJpb19pb19lcnJvcihiaW8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGJpb19kYXRhX2RpcihiaW8pKSB7CisJY2FzZSBSRUFEOgorCQlyZXQgPSB6cmFtX3JlYWQoenJhbSwgYmlvKTsKKwkJYnJlYWs7CisKKwljYXNlIFdSSVRFOgorCQlyZXQgPSB6cmFtX3dyaXRlKHpyYW0sIGJpbyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2RldmljZShzdHJ1Y3QgenJhbSAqenJhbSkKK3sKKwlzaXplX3QgaW5kZXg7CisKKwkvKiBEbyBub3QgYWNjZXB0IGFueSBuZXcgSS9PIHJlcXVlc3QgKi8KKwl6cmFtLT5pbml0X2RvbmUgPSAwOworCisJLyogRnJlZSB2YXJpb3VzIHBlci1kZXZpY2UgYnVmZmVycyAqLworCWtmcmVlKHpyYW0tPmNvbXByZXNzX3dvcmttZW0pOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpenJhbS0+Y29tcHJlc3NfYnVmZmVyLCAxKTsKKworCXpyYW0tPmNvbXByZXNzX3dvcmttZW0gPSBOVUxMOworCXpyYW0tPmNvbXByZXNzX2J1ZmZlciA9IE5VTEw7CisKKwkvKiBGcmVlIGFsbCBwYWdlcyB0aGF0IGFyZSBzdGlsbCBpbiB0aGlzIHpyYW0gZGV2aWNlICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgenJhbS0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsgaW5kZXgrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdTE2IG9mZnNldDsKKworCQlwYWdlID0genJhbS0+dGFibGVbaW5kZXhdLnBhZ2U7CisJCW9mZnNldCA9IHpyYW0tPnRhYmxlW2luZGV4XS5vZmZzZXQ7CisKKwkJaWYgKCFwYWdlKQorCQkJY29udGludWU7CisKKwkJaWYgKHVubGlrZWx5KHpyYW1fdGVzdF9mbGFnKHpyYW0sIGluZGV4LCBaUkFNX1VOQ09NUFJFU1NFRCkpKQorCQkJX19mcmVlX3BhZ2UocGFnZSk7CisJCWVsc2UKKwkJCXh2X2ZyZWUoenJhbS0+bWVtX3Bvb2wsIHBhZ2UsIG9mZnNldCk7CisJfQorCisJdmZyZWUoenJhbS0+dGFibGUpOworCXpyYW0tPnRhYmxlID0gTlVMTDsKKworCXh2X2Rlc3Ryb3lfcG9vbCh6cmFtLT5tZW1fcG9vbCk7CisJenJhbS0+bWVtX3Bvb2wgPSBOVUxMOworCisJLyogUmVzZXQgc3RhdHMgKi8KKwltZW1zZXQoJnpyYW0tPnN0YXRzLCAwLCBzaXplb2YoenJhbS0+c3RhdHMpKTsKKworCXpyYW0tPmRpc2tzaXplID0gMDsKK30KKworc3RhdGljIGludCB6cmFtX2lvY3RsX2luaXRfZGV2aWNlKHN0cnVjdCB6cmFtICp6cmFtKQoreworCWludCByZXQ7CisJc2l6ZV90IG51bV9wYWdlczsKKworCWlmICh6cmFtLT5pbml0X2RvbmUpIHsKKwkJcHJfaW5mbygiRGV2aWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl6cmFtX3NldF9kaXNrc2l6ZSh6cmFtLCB0b3RhbHJhbV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCXpyYW0tPmNvbXByZXNzX3dvcmttZW0gPSBremFsbG9jKExaTzFYX01FTV9DT01QUkVTUywgR0ZQX0tFUk5FTCk7CisJaWYgKCF6cmFtLT5jb21wcmVzc193b3JrbWVtKSB7CisJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyBjb21wcmVzc29yIHdvcmtpbmcgbWVtb3J5IVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwl6cmFtLT5jb21wcmVzc19idWZmZXIgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoX19HRlBfWkVSTywgMSk7CisJaWYgKCF6cmFtLT5jb21wcmVzc19idWZmZXIpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3IgYnVmZmVyIHNwYWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCW51bV9wYWdlcyA9IHpyYW0tPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7CisJenJhbS0+dGFibGUgPSB2bWFsbG9jKG51bV9wYWdlcyAqIHNpemVvZigqenJhbS0+dGFibGUpKTsKKwlpZiAoIXpyYW0tPnRhYmxlKSB7CisJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyB6cmFtIGFkZHJlc3MgdGFibGVcbiIpOworCQkvKiBUbyBwcmV2ZW50IGFjY2Vzc2luZyB0YWJsZSBlbnRyaWVzIGR1cmluZyBjbGVhbnVwICovCisJCXpyYW0tPmRpc2tzaXplID0gMDsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwltZW1zZXQoenJhbS0+dGFibGUsIDAsIG51bV9wYWdlcyAqIHNpemVvZigqenJhbS0+dGFibGUpKTsKKworCXNldF9jYXBhY2l0eSh6cmFtLT5kaXNrLCB6cmFtLT5kaXNrc2l6ZSA+PiBTRUNUT1JfU0hJRlQpOworCisJLyogenJhbSBkZXZpY2VzIHNvcnQgb2YgcmVzZW1ibGVzIG5vbi1yb3RhdGlvbmFsIGRpc2tzICovCisJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHpyYW0tPmRpc2stPnF1ZXVlKTsKKworCXpyYW0tPm1lbV9wb29sID0geHZfY3JlYXRlX3Bvb2woKTsKKwlpZiAoIXpyYW0tPm1lbV9wb29sKSB7CisJCXByX2VycigiRXJyb3IgY3JlYXRpbmcgbWVtb3J5IHBvb2xcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJenJhbS0+aW5pdF9kb25lID0gMTsKKworCXByX2RlYnVnKCJJbml0aWFsaXphdGlvbiBkb25lIVxuIik7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmVzZXRfZGV2aWNlKHpyYW0pOworCisJcHJfZXJyKCJJbml0aWFsaXphdGlvbiBmYWlsZWQ6IGVycj0lZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHpyYW1faW9jdGxfcmVzZXRfZGV2aWNlKHN0cnVjdCB6cmFtICp6cmFtKQoreworCWlmICh6cmFtLT5pbml0X2RvbmUpCisJCXJlc2V0X2RldmljZSh6cmFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpyYW1faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IDA7CisJc2l6ZV90IGRpc2tzaXplX2tiOworCisJc3RydWN0IHpyYW0gKnpyYW0gPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgWlJBTUlPX1NFVF9ESVNLU0laRV9LQjoKKwkJaWYgKHpyYW0tPmluaXRfZG9uZSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkaXNrc2l6ZV9rYiwgKHZvaWQgKilhcmcsCisJCQkJCQlfSU9DX1NJWkUoY21kKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQl6cmFtLT5kaXNrc2l6ZSA9IGRpc2tzaXplX2tiIDw8IDEwOworCQlwcl9pbmZvKCJEaXNrIHNpemUgc2V0IHRvICV6dSBrQlxuIiwgZGlza3NpemVfa2IpOworCQlicmVhazsKKworCWNhc2UgWlJBTUlPX0dFVF9TVEFUUzoKKwl7CisJCXN0cnVjdCB6cmFtX2lvY3RsX3N0YXRzICpzdGF0czsKKwkJaWYgKCF6cmFtLT5pbml0X2RvbmUpIHsKKwkJCXJldCA9IC1FTk9UVFk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzdGF0cyA9IGt6YWxsb2Moc2l6ZW9mKCpzdGF0cyksIEdGUF9LRVJORUwpOworCQlpZiAoIXN0YXRzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJenJhbV9pb2N0bF9nZXRfc3RhdHMoenJhbSwgc3RhdHMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpKSB7CisJCQlrZnJlZShzdGF0cyk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJa2ZyZWUoc3RhdHMpOworCQlicmVhazsKKwl9CisJY2FzZSBaUkFNSU9fSU5JVDoKKwkJcmV0ID0genJhbV9pb2N0bF9pbml0X2RldmljZSh6cmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFpSQU1JT19SRVNFVDoKKwkJLyogRG8gbm90IHJlc2V0IGFuIGFjdGl2ZSBkZXZpY2UhICovCisJCWlmIChiZGV2LT5iZF9ob2xkZXJzKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIE1ha2Ugc3VyZSBhbGwgcGVuZGluZyBJL08gaXMgZmluaXNoZWQgKi8KKwkJaWYgKGJkZXYpCisJCQlmc3luY19iZGV2KGJkZXYpOworCisJCXJldCA9IHpyYW1faW9jdGxfcmVzZXRfZGV2aWNlKHpyYW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2luZm8oIkludmFsaWQgaW9jdGwgJXVcbiIsIGNtZCk7CisJCXJldCA9IC1FTk9UVFk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB6cmFtX3Nsb3RfZnJlZV9ub3RpZnkoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3QgenJhbSAqenJhbTsKKworCXpyYW0gPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJenJhbV9mcmVlX3BhZ2UoenJhbSwgaW5kZXgpOworCXpyYW1fc3RhdDY0X2luYyh6cmFtLCAmenJhbS0+c3RhdHMubm90aWZ5X2ZyZWUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHpyYW1fZGV2b3BzID0geworCS5pb2N0bCA9IHpyYW1faW9jdGwsCisJLnN3YXBfc2xvdF9mcmVlX25vdGlmeSA9IHpyYW1fc2xvdF9mcmVlX25vdGlmeSwKKwkub3duZXIgPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBjcmVhdGVfZGV2aWNlKHN0cnVjdCB6cmFtICp6cmFtLCBpbnQgZGV2aWNlX2lkKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfaW5pdCgmenJhbS0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnpyYW0tPnN0YXQ2NF9sb2NrKTsKKworCXpyYW0tPnF1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOworCWlmICghenJhbS0+cXVldWUpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGRpc2sgcXVldWUgZm9yIGRldmljZSAlZFxuIiwKKwkJCWRldmljZV9pZCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QoenJhbS0+cXVldWUsIHpyYW1fbWFrZV9yZXF1ZXN0KTsKKwl6cmFtLT5xdWV1ZS0+cXVldWVkYXRhID0genJhbTsKKworCSAvKiBnZW5kaXNrIHN0cnVjdHVyZSAqLworCXpyYW0tPmRpc2sgPSBhbGxvY19kaXNrKDEpOworCWlmICghenJhbS0+ZGlzaykgeworCQlibGtfY2xlYW51cF9xdWV1ZSh6cmFtLT5xdWV1ZSk7CisJCXByX3dhcm5pbmcoIkVycm9yIGFsbG9jYXRpbmcgZGlzayBzdHJ1Y3R1cmUgZm9yIGRldmljZSAlZFxuIiwKKwkJCWRldmljZV9pZCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXpyYW0tPmRpc2stPm1ham9yID0genJhbV9tYWpvcjsKKwl6cmFtLT5kaXNrLT5maXJzdF9taW5vciA9IGRldmljZV9pZDsKKwl6cmFtLT5kaXNrLT5mb3BzID0gJnpyYW1fZGV2b3BzOworCXpyYW0tPmRpc2stPnF1ZXVlID0genJhbS0+cXVldWU7CisJenJhbS0+ZGlzay0+cHJpdmF0ZV9kYXRhID0genJhbTsKKwlzbnByaW50Zih6cmFtLT5kaXNrLT5kaXNrX25hbWUsIDE2LCAienJhbSVkIiwgZGV2aWNlX2lkKTsKKworCS8qIEFjdHVhbCBjYXBhY2l0eSBzZXQgdXNpbmcgWlJBTUlPX1NFVF9ESVNLU0laRV9LQiBpb2N0bCAqLworCXNldF9jYXBhY2l0eSh6cmFtLT5kaXNrLCAwKTsKKworCS8qCisJICogVG8gZW5zdXJlIHRoYXQgd2UgYWx3YXlzIGdldCBQQUdFX1NJWkUgYWxpZ25lZAorCSAqIGFuZCBuKlBBR0VfU0laRUQgc2l6ZWQgSS9PIHJlcXVlc3RzLgorCSAqLworCWJsa19xdWV1ZV9waHlzaWNhbF9ibG9ja19zaXplKHpyYW0tPmRpc2stPnF1ZXVlLCBQQUdFX1NJWkUpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoenJhbS0+ZGlzay0+cXVldWUsIFBBR0VfU0laRSk7CisJYmxrX3F1ZXVlX2lvX21pbih6cmFtLT5kaXNrLT5xdWV1ZSwgUEFHRV9TSVpFKTsKKwlibGtfcXVldWVfaW9fb3B0KHpyYW0tPmRpc2stPnF1ZXVlLCBQQUdFX1NJWkUpOworCisJYWRkX2Rpc2soenJhbS0+ZGlzayk7CisKKwl6cmFtLT5pbml0X2RvbmUgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9kZXZpY2Uoc3RydWN0IHpyYW0gKnpyYW0pCit7CisJaWYgKHpyYW0tPmRpc2spIHsKKwkJZGVsX2dlbmRpc2soenJhbS0+ZGlzayk7CisJCXB1dF9kaXNrKHpyYW0tPmRpc2spOworCX0KKworCWlmICh6cmFtLT5xdWV1ZSkKKwkJYmxrX2NsZWFudXBfcXVldWUoenJhbS0+cXVldWUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB6cmFtX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBkZXZfaWQ7CisKKwlpZiAobnVtX2RldmljZXMgPiBtYXhfbnVtX2RldmljZXMpIHsKKwkJcHJfd2FybmluZygiSW52YWxpZCB2YWx1ZSBmb3IgbnVtX2RldmljZXM6ICV1XG4iLAorCQkJCW51bV9kZXZpY2VzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJenJhbV9tYWpvciA9IHJlZ2lzdGVyX2Jsa2RldigwLCAienJhbSIpOworCWlmICh6cmFtX21ham9yIDw9IDApIHsKKwkJcHJfd2FybmluZygiVW5hYmxlIHRvIGdldCBtYWpvciBudW1iZXJcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbnVtX2RldmljZXMpIHsKKwkJcHJfaW5mbygibnVtX2RldmljZXMgbm90IHNwZWNpZmllZC4gVXNpbmcgZGVmYXVsdDogMVxuIik7CisJCW51bV9kZXZpY2VzID0gMTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgZGV2aWNlIGFycmF5IGFuZCBpbml0aWFsaXplIGVhY2ggb25lICovCisJcHJfaW5mbygiQ3JlYXRpbmcgJXUgZGV2aWNlcyAuLi5cbiIsIG51bV9kZXZpY2VzKTsKKwlkZXZpY2VzID0ga3phbGxvYyhudW1fZGV2aWNlcyAqIHNpemVvZihzdHJ1Y3QgenJhbSksIEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVucmVnaXN0ZXI7CisJfQorCisJZm9yIChkZXZfaWQgPSAwOyBkZXZfaWQgPCBudW1fZGV2aWNlczsgZGV2X2lkKyspIHsKKwkJcmV0ID0gY3JlYXRlX2RldmljZSgmZGV2aWNlc1tkZXZfaWRdLCBkZXZfaWQpOworCQlpZiAocmV0KQorCQkJZ290byBmcmVlX2RldmljZXM7CisJfQorCisJcmV0dXJuIDA7CisKK2ZyZWVfZGV2aWNlczoKKwl3aGlsZSAoZGV2X2lkKQorCQlkZXN0cm95X2RldmljZSgmZGV2aWNlc1stLWRldl9pZF0pOwordW5yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX2Jsa2Rldih6cmFtX21ham9yLCAienJhbSIpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6cmFtX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgenJhbSAqenJhbTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisJCXpyYW0gPSAmZGV2aWNlc1tpXTsKKworCQlkZXN0cm95X2RldmljZSh6cmFtKTsKKwkJaWYgKHpyYW0tPmluaXRfZG9uZSkKKwkJCXJlc2V0X2RldmljZSh6cmFtKTsKKwl9CisKKwl1bnJlZ2lzdGVyX2Jsa2Rldih6cmFtX21ham9yLCAienJhbSIpOworCisJa2ZyZWUoZGV2aWNlcyk7CisJcHJfZGVidWcoIkNsZWFudXAgZG9uZSFcbiIpOworfQorCittb2R1bGVfcGFyYW0obnVtX2RldmljZXMsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhudW1fZGV2aWNlcywgIk51bWJlciBvZiB6cmFtIGRldmljZXMiKTsKKworbW9kdWxlX2luaXQoenJhbV9pbml0KTsKK21vZHVsZV9leGl0KHpyYW1fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5pdGluIEd1cHRhIDxuZ3VwdGFAdmZsYXJlLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tcHJlc3NlZCBSQU0gQmxvY2sgRGV2aWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5oIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVmOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvbXByZXNzZWQgUkFNIGJsb2NrIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCAgTml0aW4gR3VwdGEKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKKyAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKyAqCisgKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KKyAqLworCisjaWZuZGVmIF9aUkFNX0RSVl9IXworI2RlZmluZSBfWlJBTV9EUlZfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2luY2x1ZGUgInpyYW1faW9jdGwuaCIKKyNpbmNsdWRlICJ4dm1hbGxvYy5oIgorCisvKgorICogU29tZSBhcmJpdHJhcnkgdmFsdWUuIFRoaXMgaXMganVzdCB0byBjYXRjaAorICogaW52YWxpZCB2YWx1ZSBmb3IgbnVtX2RldmljZXMgbW9kdWxlIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heF9udW1fZGV2aWNlcyA9IDMyOworCisvKgorICogU3RvcmVkIGF0IGJlZ2lubmluZyBvZiBlYWNoIGNvbXByZXNzZWQgb2JqZWN0LgorICoKKyAqIEl0IHN0b3JlcyBiYWNrLXJlZmVyZW5jZSB0byB0YWJsZSBlbnRyeSB3aGljaCBwb2ludHMgdG8gdGhpcworICogb2JqZWN0LiBUaGlzIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgbWVtb3J5IGRlZnJhZ21lbnRhdGlvbi4KKyAqLworc3RydWN0IHpvYmpfaGVhZGVyIHsKKyNpZiAwCisJdTMyIHRhYmxlX2lkeDsKKyNlbmRpZgorfTsKKworLyotLSBDb25maWd1cmFibGUgcGFyYW1ldGVycyAqLworCisvKiBEZWZhdWx0IHpyYW0gZGlzayBzaXplOiAyNSUgb2YgdG90YWwgUkFNICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbSA9IDI1OworCisvKgorICogUGFnZXMgdGhhdCBjb21wcmVzcyB0byBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzIGFyZSBzdG9yZWQKKyAqIHVuY29tcHJlc3NlZCBpbiBtZW1vcnkuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfenBhZ2Vfc2l6ZSA9IFBBR0VfU0laRSAvIDQgKiAzOworCisvKgorICogTk9URTogbWF4X3pwYWdlX3NpemUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG86CisgKiAgIFhWX01BWF9BTExPQ19TSVpFIC0gc2l6ZW9mKHN0cnVjdCB6b2JqX2hlYWRlcikKKyAqIG90aGVyd2lzZSwgeHZfbWFsbG9jKCkgd291bGQgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICovCisKKy8qLS0gRW5kIG9mIGNvbmZpZ3VyYWJsZSBwYXJhbXMgKi8KKworI2RlZmluZSBTRUNUT1JfU0hJRlQJCTkKKyNkZWZpbmUgU0VDVE9SX1NJWkUJCSgxIDw8IFNFQ1RPUl9TSElGVCkKKyNkZWZpbmUgU0VDVE9SU19QRVJfUEFHRV9TSElGVAkoUEFHRV9TSElGVCAtIFNFQ1RPUl9TSElGVCkKKyNkZWZpbmUgU0VDVE9SU19QRVJfUEFHRQkoMSA8PCBTRUNUT1JTX1BFUl9QQUdFX1NISUZUKQorCisvKiBGbGFncyBmb3IgenJhbSBwYWdlcyAodGFibGVbcGFnZV9ub10uZmxhZ3MpICovCitlbnVtIHpyYW1fcGFnZWZsYWdzIHsKKwkvKiBQYWdlIGlzIHN0b3JlZCB1bmNvbXByZXNzZWQgKi8KKwlaUkFNX1VOQ09NUFJFU1NFRCwKKworCS8qIFBhZ2UgY29uc2lzdHMgZW50aXJlbHkgb2YgemVyb3MgKi8KKwlaUkFNX1pFUk8sCisKKwlfX05SX1pSQU1fUEFHRUZMQUdTLAorfTsKKworLyotLSBEYXRhIHN0cnVjdHVyZXMgKi8KKworLyogQWxsb2NhdGVkIGZvciBlYWNoIGRpc2sgcGFnZSAqLworc3RydWN0IHRhYmxlIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1MTYgb2Zmc2V0OworCXU4IGNvdW50OwkvKiBvYmplY3QgcmVmIGNvdW50IChub3QgeWV0IHVzZWQpICovCisJdTggZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKKworc3RydWN0IHpyYW1fc3RhdHMgeworCS8qIGJhc2ljIHN0YXRzICovCisJc2l6ZV90IGNvbXByX3NpemU7CS8qIGNvbXByZXNzZWQgc2l6ZSBvZiBwYWdlcyBzdG9yZWQgLQorCQkJCSAqIG5lZWRlZCB0byBlbmZvcmNlIG1lbWxpbWl0ICovCisJLyogbW9yZSBzdGF0cyAqLworI2lmIGRlZmluZWQoQ09ORklHX1pSQU1fU1RBVFMpCisJdTY0IG51bV9yZWFkczsJCS8qIGZhaWxlZCArIHN1Y2Nlc3NmdWwgKi8KKwl1NjQgbnVtX3dyaXRlczsJCS8qIC0tZG8tLSAqLworCXU2NCBmYWlsZWRfcmVhZHM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCisJdTY0IGZhaWxlZF93cml0ZXM7CS8qIGNhbiBoYXBwZW4gd2hlbiBtZW1vcnkgaXMgdG9vIGxvdyAqLworCXU2NCBpbnZhbGlkX2lvOwkJLyogbm9uLXBhZ2UtYWxpZ25lZCBJL08gcmVxdWVzdHMgKi8KKwl1NjQgbm90aWZ5X2ZyZWU7CS8qIG5vLiBvZiBzd2FwIHNsb3QgZnJlZSBub3RpZmljYXRpb25zICovCisJdTMyIHBhZ2VzX3plcm87CQkvKiBuby4gb2YgemVybyBmaWxsZWQgcGFnZXMgKi8KKwl1MzIgcGFnZXNfc3RvcmVkOwkvKiBuby4gb2YgcGFnZXMgY3VycmVudGx5IHN0b3JlZCAqLworCXUzMiBnb29kX2NvbXByZXNzOwkvKiAlIG9mIHBhZ2VzIHdpdGggY29tcHJlc3Npb24gcmF0aW88PTUwJSAqLworCXUzMiBwYWdlc19leHBhbmQ7CS8qICUgb2YgaW5jb21wcmVzc2libGUgcGFnZXMgKi8KKyNlbmRpZgorfTsKKworc3RydWN0IHpyYW0geworCXN0cnVjdCB4dl9wb29sICptZW1fcG9vbDsKKwl2b2lkICpjb21wcmVzc193b3JrbWVtOworCXZvaWQgKmNvbXByZXNzX2J1ZmZlcjsKKwlzdHJ1Y3QgdGFibGUgKnRhYmxlOworCXNwaW5sb2NrX3Qgc3RhdDY0X2xvY2s7CS8qIHByb3RlY3QgNjQtYml0IHN0YXRzICovCisJc3RydWN0IG11dGV4IGxvY2s7CS8qIHByb3RlY3QgY29tcHJlc3Npb24gYnVmZmVycyBhZ2FpbnN0CisJCQkJICogY29uY3VycmVudCB3cml0ZXMgKi8KKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7CisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJaW50IGluaXRfZG9uZTsKKwkvKgorCSAqIFRoaXMgaXMgdGhlIGxpbWl0IG9uIGFtb3VudCBvZiAqdW5jb21wcmVzc2VkKiB3b3J0aCBvZiBkYXRhCisJICogd2UgY2FuIHN0b3JlIGluIGEgZGlzay4KKwkgKi8KKwlzaXplX3QgZGlza3NpemU7CS8qIGJ5dGVzICovCisKKwlzdHJ1Y3QgenJhbV9zdGF0cyBzdGF0czsKK307CisKKy8qLS0gKi8KKworLyogRGVidWdnaW5nIGFuZCBTdGF0cyAqLworI2lmIGRlZmluZWQoQ09ORklHX1pSQU1fU1RBVFMpCitzdGF0aWMgdm9pZCB6cmFtX3N0YXRfaW5jKHUzMiAqdikKK3sKKwkqdiA9ICp2ICsgMTsKK30KKworc3RhdGljIHZvaWQgenJhbV9zdGF0X2RlYyh1MzIgKnYpCit7CisJKnYgPSAqdiAtIDE7Cit9CisKK3N0YXRpYyB2b2lkIHpyYW1fc3RhdDY0X2luYyhzdHJ1Y3QgenJhbSAqenJhbSwgdTY0ICp2KQoreworCXNwaW5fbG9jaygmenJhbS0+c3RhdDY0X2xvY2spOworCSp2ID0gKnYgKyAxOworCXNwaW5fdW5sb2NrKCZ6cmFtLT5zdGF0NjRfbG9jayk7Cit9CisKK3N0YXRpYyB1NjQgenJhbV9zdGF0NjRfcmVhZChzdHJ1Y3QgenJhbSAqenJhbSwgdTY0ICp2KQoreworCXU2NCB2YWw7CisKKwlzcGluX2xvY2soJnpyYW0tPnN0YXQ2NF9sb2NrKTsKKwl2YWwgPSAqdjsKKwlzcGluX3VubG9jaygmenJhbS0+c3RhdDY0X2xvY2spOworCisJcmV0dXJuIHZhbDsKK30KKyNlbHNlCisjZGVmaW5lIHpyYW1fc3RhdF9pbmModikKKyNkZWZpbmUgenJhbV9zdGF0X2RlYyh2KQorI2RlZmluZSB6cmFtX3N0YXQ2NF9pbmMociwgdikKKyNkZWZpbmUgenJhbV9zdGF0NjRfcmVhZChyLCB2KQorI2VuZGlmIC8qIENPTkZJR19aUkFNX1NUQVRTICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDE1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2lvY3RsLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvbXByZXNzZWQgUkFNIGJsb2NrIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCAgTml0aW4gR3VwdGEKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKKyAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKyAqCisgKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KKyAqLworCisjaWZuZGVmIF9aUkFNX0lPQ1RMX0hfCisjZGVmaW5lIF9aUkFNX0lPQ1RMX0hfCisKK3N0cnVjdCB6cmFtX2lvY3RsX3N0YXRzIHsKKwl1NjQgZGlza3NpemU7CQkvKiBkaXNrc2l6ZSBpbiBieXRlcyAodXNlciBzcGVjaWZpZXMgaW4gS0IpICovCisJdTY0IG51bV9yZWFkczsJCS8qIGZhaWxlZCArIHN1Y2Nlc3NmdWwgKi8KKwl1NjQgbnVtX3dyaXRlczsJCS8qIC0tZG8tLSAqLworCXU2NCBmYWlsZWRfcmVhZHM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCisJdTY0IGZhaWxlZF93cml0ZXM7CS8qIGNhbiBoYXBwZW4gd2hlbiBtZW1vcnkgaXMgdG9vIGxvdyAqLworCXU2NCBpbnZhbGlkX2lvOwkJLyogbm9uLXBhZ2UtYWxpZ25lZCBJL08gcmVxdWVzdHMgKi8KKwl1NjQgbm90aWZ5X2ZyZWU7CS8qIG5vLiBvZiBzd2FwIHNsb3QgZnJlZSBub3RpZmljYXRpb25zICovCisJdTMyIHBhZ2VzX3plcm87CQkvKiBuby4gb2YgemVybyBmaWxsZWQgcGFnZXMgKi8KKwl1MzIgZ29vZF9jb21wcmVzc19wY3Q7CS8qIG5vLiBvZiBwYWdlcyB3aXRoIGNvbXByZXNzaW9uIHJhdGlvPD01MCUgKi8KKwl1MzIgcGFnZXNfZXhwYW5kX3BjdDsJLyogbm8uIG9mIGluY29tcHJlc3NpYmxlIHBhZ2VzICovCisJdTMyIHBhZ2VzX3N0b3JlZDsKKwl1MzIgcGFnZXNfdXNlZDsKKwl1NjQgb3JpZ19kYXRhX3NpemU7CisJdTY0IGNvbXByX2RhdGFfc2l6ZTsKKwl1NjQgbWVtX3VzZWRfdG90YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKKworI2RlZmluZSBaUkFNSU9fU0VUX0RJU0tTSVpFX0tCCV9JT1coJ3onLCAwLCBzaXplX3QpCisjZGVmaW5lIFpSQU1JT19HRVRfU1RBVFMJX0lPUigneicsIDEsIHN0cnVjdCB6cmFtX2lvY3RsX3N0YXRzKQorI2RlZmluZSBaUkFNSU9fSU5JVAkJX0lPKCd6JywgMikKKyNkZWZpbmUgWlJBTUlPX1JFU0VUCQlfSU8oJ3onLCAzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYyBiL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYwppbmRleCA5OWNiMjI0Li5hMTkwMGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCkBAIC04LDcgKzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgpAQCAtMzMsOSArMzIsOCBAQAogewogCWRldl9kYmcoJnBfZGV2LT5kZXYsICJpeGpfYXR0YWNoKClcbiIpOwogCS8qIENyZWF0ZSBuZXcgaXhqIGRldmljZSAqLwotCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCXBfZGV2LT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IDM7CisJcF9kZXYtPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlwX2Rldi0+cmVzb3VyY2VbMV0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCXBfZGV2LT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKIAlwX2Rldi0+cHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpeGpfaW5mb190KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX2Rldi0+cHJpdikgewpAQCAtMTIxLDEzICsxMTksMTQgQEAKIHsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKLQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPnN0YXJ0ID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IGlvLT53aW5bMF0ubGVuOworCQlwX2Rldi0+aW9fbGluZXMgPSAzOwogCQlpZiAoaW8tPm53aW4gPT0gMikgewotCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCXBfZGV2LT5yZXNvdXJjZVsxXS0+c3RhcnQgPSBpby0+d2luWzFdLmJhc2U7CisJCQlwX2Rldi0+cmVzb3VyY2VbMV0tPmVuZCA9IGlvLT53aW5bMV0ubGVuOwogCQl9Ci0JCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KSkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTE1MSw3ICsxNTAsOCBAQAogCS8qCiAgCSAqCVJlZ2lzdGVyIHRoZSBjYXJkIHdpdGggdGhlIGNvcmUuCiAJICovCi0JaiA9IGl4al9wY21jaWFfcHJvYmUobGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDEwKTsKKwlqID0gaXhqX3BjbWNpYV9wcm9iZShsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQsCisJCQkgICAgIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCArIDB4MTApOwogCiAJaW5mby0+bmRldiA9IDE7CiAJaXhqX2dldF9zZXJpYWwobGluaywgaik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fY2lmLmMgYi9kcml2ZXJzL3Vpby91aW9fY2lmLmMKaW5kZXggMzcxZjg3Zi4uYThlYTJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX2NpZi5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19jaWYuYwpAQCAtNzksNyArNzksNyBAQAogCX0KIAlpbmZvLT52ZXJzaW9uID0gIjAuMC4xIjsKIAlpbmZvLT5pcnEgPSBkZXYtPmlycTsKLQlpbmZvLT5pcnFfZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQ7CisJaW5mby0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7CiAJaW5mby0+aGFuZGxlciA9IGhpbHNjaGVyX2hhbmRsZXI7CiAKIAlpZiAodWlvX3JlZ2lzdGVyX2RldmljZSgmZGV2LT5kZXYsIGluZm8pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMgYi9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYwppbmRleCA2MWU1NjlkLi43MTc0ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYworKysgYi9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYwpAQCAtMTU1LDcgKzE1NSw2IEBACiAJICogSW50ZXJydXB0IHNoYXJpbmcgaXMgbm90IHN1cHBvcnRlZC4KIAkgKi8KIAotCXVpb2luZm8tPmlycV9mbGFncyB8PSBJUlFGX0RJU0FCTEVEOwogCXVpb2luZm8tPmhhbmRsZXIgPSB1aW9fcGRydl9nZW5pcnFfaGFuZGxlcjsKIAl1aW9pbmZvLT5pcnFjb250cm9sID0gdWlvX3BkcnZfZ2VuaXJxX2lycWNvbnRyb2w7CiAJdWlvaW5mby0+b3BlbiA9IHVpb19wZHJ2X2dlbmlycV9vcGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3NlcmNvczMuYyBiL2RyaXZlcnMvdWlvL3Vpb19zZXJjb3MzLmMKaW5kZXggM2Q0NjFjZC4uYTE4N2ZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX3NlcmNvczMuYworKysgYi9kcml2ZXJzL3Vpby91aW9fc2VyY29zMy5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAlpbmZvLT5uYW1lID0gIlNlcmNvc19JSUlfUENJIjsKIAlpbmZvLT52ZXJzaW9uID0gIjAuMC4xIjsKIAlpbmZvLT5pcnEgPSBkZXYtPmlycTsKLQlpbmZvLT5pcnFfZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQ7CisJaW5mby0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7CiAJaW5mby0+aGFuZGxlciA9IHNlcmNvczNfaGFuZGxlcjsKIAlpbmZvLT5pcnFjb250cm9sID0gc2VyY29zM19pcnFjb250cm9sOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCA2YTU4Y2IxLi40YWEwMGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTQ1LDcgKzQ1LDggQEAKIAlkZWZhdWx0IHkgaWYgU1RCMDN4eHgKIAlkZWZhdWx0IHkgaWYgUFBDX01QQzUyeHgKIAkjIE1JUFM6Ci0JZGVmYXVsdCB5IGlmIFNPQ19BVTFYMDAKKwlkZWZhdWx0IHkgaWYgTUlQU19BTENIRU1ZCisJZGVmYXVsdCB5IGlmIE1BQ0hfSlo0NzQwCiAJIyBTSDoKIAlkZWZhdWx0IHkgaWYgQ1BVX1NVQlRZUEVfU0g3NzIwCiAJZGVmYXVsdCB5IGlmIENQVV9TVUJUWVBFX1NINzcyMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCmluZGV4IGM4OTk5MGYuLjEwMWZmYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYworKysgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKQEAgLTg2Niw1MCArODY2LDUwIEBACiAJaW5zdGFuY2UtPmxpbmVfc3RhdHVzID0gYnVmW0NYSU5GX0xJTkVfU1RBVFVTXTsKIAlzd2l0Y2ggKGluc3RhbmNlLT5saW5lX3N0YXR1cykgewogCWNhc2UgMDoKLQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0xPU1QpOwogCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmU6IGRvd25cbiIpOwogCQlicmVhazsKIAogCWNhc2UgMToKLQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0xPU1QpOwogCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmU6IGF0dGVtcHRpbmcgdG8gYWN0aXZhdGVcbiIpOwogCQlicmVhazsKIAogCWNhc2UgMjoKLQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0xPU1QpOwogCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmU6IHRyYWluaW5nXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIDM6Ci0JCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCWF0bV9kZXZfc2lnbmFsX2NoYW5nZShhdG1fZGV2LCBBVE1fUEhZX1NJR19MT1NUKTsKIAkJYXRtX2luZm8odXNiYXRtLCAiQURTTCBsaW5lOiBjaGFubmVsIGFuYWx5c2lzXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIDQ6Ci0JCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCWF0bV9kZXZfc2lnbmFsX2NoYW5nZShhdG1fZGV2LCBBVE1fUEhZX1NJR19MT1NUKTsKIAkJYXRtX2luZm8odXNiYXRtLCAiQURTTCBsaW5lOiBleGNoYW5nZVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSA1OgogCQlhdG1fZGV2LT5saW5rX3JhdGUgPSBidWZbQ1hJTkZfRE9XTlNUUkVBTV9SQVRFXSAqIDEwMDAgLyA0MjQ7Ci0JCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0ZPVU5EOworCQlhdG1fZGV2X3NpZ25hbF9jaGFuZ2UoYXRtX2RldiwgQVRNX1BIWV9TSUdfRk9VTkQpOwogCiAJCWF0bV9pbmZvKHVzYmF0bSwgIkFEU0wgbGluZTogdXAgKCVkIGtiL3MgZG93biB8ICVkIGtiL3MgdXApXG4iLAogCQkgICAgIGJ1ZltDWElORl9ET1dOU1RSRUFNX1JBVEVdLCBidWZbQ1hJTkZfVVBTVFJFQU1fUkFURV0pOwogCQlicmVhazsKIAogCWNhc2UgNjoKLQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0xPU1QpOwogCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmU6IHdhaXRpbmdcbiIpOwogCQlicmVhazsKIAogCWNhc2UgNzoKLQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0xPU1QpOwogCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmU6IGluaXRpYWxpemluZ1xuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKKwkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX1VOS05PV04pOwogCQlhdG1faW5mbyh1c2JhdG0sICJVbmtub3duIGxpbmUgc3RhdGUgJTAyeFxuIiwgaW5zdGFuY2UtPmxpbmVfc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwppbmRleCAxMzM1NDU2Li44MGY5NjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYworKysgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwpAQCAtNTI1LDcgKzUyNSw3IEBACiAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSAwOgotCQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJCWF0bV9kZXZfc2lnbmFsX2NoYW5nZShhdG1fZGV2LCBBVE1fUEhZX1NJR19MT1NUKTsKIAkJCWlmIChpbnN0YW5jZS0+bGFzdF9zdGF0dXMpCiAJCQkJYXRtX2luZm8odXNiYXRtLCAiQURTTCBsaW5lIGlzIGRvd25cbiIpOwogCQkJLyogSXQgbWF5IG5ldmVyIHJlc3luYyBhZ2FpbiB1bmxlc3Mgd2UgYXNrIGl0IHRvLi4uICovCkBAIC01MzMsMTIgKzUzMywxMiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDA4OgotCQkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKKwkJCWF0bV9kZXZfc2lnbmFsX2NoYW5nZShhdG1fZGV2LCBBVE1fUEhZX1NJR19VTktOT1dOKTsKIAkJCWF0bV9pbmZvKHVzYmF0bSwgIkFEU0wgbGluZSBpcyBibG9ja2VkP1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIDB4MTA6Ci0JCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0xPU1QpOwogCQkJYXRtX2luZm8odXNiYXRtLCAiQURTTCBsaW5lIGlzIHN5bmNocm9uaXNpbmdcbiIpOwogCQkJYnJlYWs7CiAKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQkJfQogCiAJCQlhdG1fZGV2LT5saW5rX3JhdGUgPSBkb3duX3NwZWVkICogMTAwMCAvIDQyNDsKLQkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0ZPVU5EOworCQkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKGF0bV9kZXYsIEFUTV9QSFlfU0lHX0ZPVU5EKTsKIAogCQkJYXRtX2luZm8odXNiYXRtLAogCQkJCSAiQURTTCBsaW5lIGlzIHVwICglZCBrYi9zIGRvd24gfCAlZCBrYi9zIHVwKVxuIiwKQEAgLTU2Miw3ICs1NjIsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisJCQlhdG1fZGV2X3NpZ25hbF9jaGFuZ2UoYXRtX2RldiwgQVRNX1BIWV9TSUdfVU5LTk9XTik7CiAJCQlhdG1faW5mbyh1c2JhdG0sICJ1bmtub3duIGxpbmUgc3RhdGUgJTAyeFxuIiwgc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwppbmRleCBlMjEzZDNmLi5lYmFlOTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTU3NSw2ICs1NzUsMTMgQEAKIAkJCXNjLT51c2JhdG0tPmF0bV9kZXYtPnR5cGUgPSB2YWw7IFwKIAl9IHdoaWxlICgwKQogCisjZGVmaW5lIFVQREFURV9BVE1fU0lHTkFMKHZhbCkgXAorCWRvIHsgXAorCQlpZiAoc2MtPnVzYmF0bS0+YXRtX2RldikgXAorCQkJYXRtX2Rldl9zaWduYWxfY2hhbmdlKHNjLT51c2JhdG0tPmF0bV9kZXYsIHZhbCk7IFwKKwl9IHdoaWxlICgwKQorCisKIC8qIEZpcm13YXJlIGxvYWRpbmcgKi8KICNkZWZpbmUgTE9BRF9JTlRFUk5BTCAgICAgMHhBMAogI2RlZmluZSBGODA1MV9VU0JDUyAgICAgICAweDdmOTIKQEAgLTEzNTksNyArMTM2Niw3IEBACiAJLyogYWx3YXlzIHVwZGF0ZSBpdCBhcyBhdG0gbGF5ZXIgY291bGQgbm90IGJlIGluaXQgd2hlbiB3ZSBzd2l0Y2ggdG8KIAkgKiBvcGVyYXRpb25hbCBzdGF0ZQogCSAqLwotCVVQREFURV9BVE1fU1RBVChzaWduYWwsIEFUTV9QSFlfU0lHX0ZPVU5EKTsKKwlVUERBVEVfQVRNX1NJR05BTChBVE1fUEhZX1NJR19GT1VORCk7CiAKIAkvKiB3YWtlIHVwIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBzeW5jaHJvbml6YXRpb24gKi8KIAl3YWtlX3VwKCZzYy0+c3luY19xKTsKQEAgLTE0OTgsNyArMTUwNSw3IEBACiAJLyogYWx3YXlzIHVwZGF0ZSBpdCBhcyBhdG0gbGF5ZXIgY291bGQgbm90IGJlIGluaXQgd2hlbiB3ZSBzd2l0Y2ggdG8KIAkgKiBvcGVyYXRpb25hbCBzdGF0ZQogCSAqLwotCVVQREFURV9BVE1fU1RBVChzaWduYWwsIEFUTV9QSFlfU0lHX0ZPVU5EKTsKKwlVUERBVEVfQVRNX1NJR05BTChBVE1fUEhZX1NJR19GT1VORCk7CiAKIAkvKiB3YWtlIHVwIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBzeW5jaHJvbml6YXRpb24gKi8KIAl3YWtlX3VwKCZzYy0+c3luY19xKTsKQEAgLTE4MjUsNyArMTgzMiw3IEBACiAJICogU28gd2Ugd2lsbCBmYWlsZWQgdG8gd2FpdCBSZWFkeSBDTVYuCiAJICovCiAJc2MtPmNtdl9hY2sgPSAwOwotCVVQREFURV9BVE1fU1RBVChzaWduYWwsIEFUTV9QSFlfU0lHX0xPU1QpOworCVVQREFURV9BVE1fU0lHTkFMKEFUTV9QSFlfU0lHX0xPU1QpOwogCiAJLyogcmVzZXQgc3RhdGlzdGljcyAqLwogCW1lbXNldCgmc2MtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHVlYV9zdGF0cykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IDE2MmM5NWEuLjg5ZDI2MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTIsNyArMiw3IEBACiAgKiBjZGMtYWNtLmMKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQXJtaW4gRnVlcnN0CTxmdWVyc3RAaW4udHVtLmRlPgotICogQ29weXJpZ2h0IChjKSAxOTk5IFBhdmVsIE1hY2hlawk8cGF2ZWxAc3VzZS5jej4KKyAqIENvcHlyaWdodCAoYykgMTk5OSBQYXZlbCBNYWNoZWsJPHBhdmVsQHVjdy5jej4KICAqIENvcHlyaWdodCAoYykgMTk5OSBKb2hhbm5lcyBFcmRmZWx0CTxqb2hhbm5lc0BlcmRmZWx0LmNvbT4KICAqIENvcHlyaWdodCAoYykgMjAwMCBWb2p0ZWNoIFBhdmxpawk8dm9qdGVjaEBzdXNlLmN6PgogICogQ29weXJpZ2h0IChjKSAyMDA0IE9saXZlciBOZXVrdW0JPG9saXZlckBuZXVrdW0ubmFtZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCmluZGV4IDIyNTAwOTUuLjg0ZjllNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYwpAQCAtMiw3ICsyLDcgQEAKICAqIHVzYmxwLmMKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTWljaGFlbCBHZWUJPG1pY2hhZWxAbGludXhzcGVjaWZpYy5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgUGF2ZWwgTWFjaGVrCTxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChjKSAxOTk5IFBhdmVsIE1hY2hlawk8cGF2ZWxAdWN3LmN6PgogICogQ29weXJpZ2h0IChjKSAyMDAwIFJhbmR5IER1bmxhcAk8cmR1bmxhcEB4ZW5vdGltZS5uZXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVm9qdGVjaCBQYXZsaWsJPHZvanRlY2hAc3VzZS5jej4KICAjIENvcHlyaWdodCAoYykgMjAwMSBQZXRlIFphaXRjZXYJPHphaXRjZXZAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKaW5kZXggZWFhNzljOC4uOTNlYWQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKQEAgLTc2LDExICs3NiwxMiBAQAogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWUgW10gPSAiYXQ5MV91ZGMiOwogc3RhdGljIGNvbnN0IGNoYXIgZXAwbmFtZVtdID0gImVwMCI7CiAKKyNkZWZpbmUgVkJVU19QT0xMX1RJTUVPVVQJbXNlY3NfdG9famlmZmllcygxMDAwKQogCi0jZGVmaW5lIGF0OTFfdWRwX3JlYWQoZGV2LCByZWcpIFwKLQlfX3Jhd19yZWFkbCgoZGV2KS0+dWRwX2Jhc2VhZGRyICsgKHJlZykpCi0jZGVmaW5lIGF0OTFfdWRwX3dyaXRlKGRldiwgcmVnLCB2YWwpIFwKLQlfX3Jhd193cml0ZWwoKHZhbCksIChkZXYpLT51ZHBfYmFzZWFkZHIgKyAocmVnKSkKKyNkZWZpbmUgYXQ5MV91ZHBfcmVhZCh1ZGMsIHJlZykgXAorCV9fcmF3X3JlYWRsKCh1ZGMpLT51ZHBfYmFzZWFkZHIgKyAocmVnKSkKKyNkZWZpbmUgYXQ5MV91ZHBfd3JpdGUodWRjLCByZWcsIHZhbCkgXAorCV9fcmF3X3dyaXRlbCgodmFsKSwgKHVkYyktPnVkcF9iYXNlYWRkciArIChyZWcpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xMDIsOCArMTAzLDkgQEAKIAl1MzIJCQljc3I7CiAJc3RydWN0IGF0OTFfcmVxdWVzdAkqcmVxOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IGF0OTFfdWRjCSp1ZGMgPSBlcC0+dWRjOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAogCWNzciA9IF9fcmF3X3JlYWRsKGVwLT5jcmVnKTsKIApAQCAtMTQ3LDcgKzE0OSw3IEBACiAJCQkJJnJlcS0+cmVxLCBsZW5ndGgsCiAJCQkJcmVxLT5yZXEubGVuZ3RoLCByZXEtPnJlcS5idWYpOwogCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHByb2NfaXJxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIG1hc2spCkBAIC0yNzIsNyArMjc0LDkgQEAKIAkJVkRCRygiJXMgZG9uZSAlcCwgc3RhdHVzICVkXG4iLCBlcC0+ZXAubmFtZSwgcmVxLCBzdGF0dXMpOwogCiAJZXAtPnN0b3BwZWQgPSAxOworCXNwaW5fdW5sb2NrKCZ1ZGMtPmxvY2spOwogCXJlcS0+cmVxLmNvbXBsZXRlKCZlcC0+ZXAsICZyZXEtPnJlcSk7CisJc3Bpbl9sb2NrKCZ1ZGMtPmxvY2spOwogCWVwLT5zdG9wcGVkID0gc3RvcHBlZDsKIAogCS8qIGVwMCBpcyBhbHdheXMgcmVhZHk7IG90aGVyIGVuZHBvaW50cyBuZWVkIGEgbm9uLWVtcHR5IHF1ZXVlICovCkBAIC00NzIsNyArNDc2LDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCiB7CiAJc3RydWN0IGF0OTFfZXAJKmVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGF0OTFfZXAsIGVwKTsKLQlzdHJ1Y3QgYXQ5MV91ZGMJKmRldiA9IGVwLT51ZGM7CisJc3RydWN0IGF0OTFfdWRjCSp1ZGMgPSBlcC0+dWRjOwogCXUxNgkJbWF4cGFja2V0OwogCXUzMgkJdG1wOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CkBAIC00ODcsNyArNDkxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCWlmICghdWRjLT5kcml2ZXIgfHwgdWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKIAkJREJHKCJib2d1cyBkZXZpY2Ugc3RhdGVcbiIpOwogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAl9CkBAIC01MjEsNyArNTI1LDcgQEAKIAl9CiAKIG9rOgotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBpbml0aWFsaXplIGVuZHBvaW50IHRvIG1hdGNoIHRoaXMgZGVzY3JpcHRvciAqLwogCWVwLT5pc19pbiA9IHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYyk7CkBAIC01NDAsMTAgKzU0NCwxMCBAQAogCSAqIHJlc2V0L2luaXQgZW5kcG9pbnQgZmlmby4gIE5PVEU6ICBsZWF2ZXMgZmlmb19iYW5rIGFsb25lLAogCSAqIHNpbmNlIGVuZHBvaW50IHJlc2V0cyBkb24ndCByZXNldCBodyBwaW5ncG9uZyBzdGF0ZS4KIAkgKi8KLQlhdDkxX3VkcF93cml0ZShkZXYsIEFUOTFfVURQX1JTVF9FUCwgZXAtPmludF9tYXNrKTsKLQlhdDkxX3VkcF93cml0ZShkZXYsIEFUOTFfVURQX1JTVF9FUCwgMCk7CisJYXQ5MV91ZHBfd3JpdGUodWRjLCBBVDkxX1VEUF9SU1RfRVAsIGVwLT5pbnRfbWFzayk7CisJYXQ5MV91ZHBfd3JpdGUodWRjLCBBVDkxX1VEUF9SU1RfRVAsIDApOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC01NTYsNyArNTYwLDcgQEAKIAlpZiAoZXAgPT0gJmVwLT51ZGMtPmVwWzBdKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKIAludWtlKGVwLCAtRVNIVVRET1dOKTsKIApAQCAtNTcxLDcgKzU3NSw3IEBACiAJCV9fcmF3X3dyaXRlbCgwLCBlcC0+Y3JlZyk7CiAJfQogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC02MDcsNyArNjExLDcgQEAKIHsKIAlzdHJ1Y3QgYXQ5MV9yZXF1ZXN0CSpyZXE7CiAJc3RydWN0IGF0OTFfZXAJCSplcDsKLQlzdHJ1Y3QgYXQ5MV91ZGMJCSpkZXY7CisJc3RydWN0IGF0OTFfdWRjCQkqdWRjOwogCWludAkJCXN0YXR1czsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIApAQCAtNjI1LDkgKzYyOSw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldiA9IGVwLT51ZGM7CisJdWRjID0gZXAtPnVkYzsKIAotCWlmICghZGV2IHx8ICFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCWlmICghdWRjIHx8ICF1ZGMtPmRyaXZlciB8fCB1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgewogCQlEQkcoImludmFsaWQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjM1LDcgKzYzOSw3IEBACiAJX3JlcS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwogCV9yZXEtPmFjdHVhbCA9IDA7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCiAJLyogdHJ5IHRvIGtpY2tzdGFydCBhbnkgZW1wdHkgYW5kIGlkbGUgcXVldWUgKi8KIAlpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSAmJiAhZXAtPnN0b3BwZWQpIHsKQEAgLTY1Myw3ICs2NTcsNyBAQAogCQlpZiAoaXNfZXAwKSB7CiAJCQl1MzIJdG1wOwogCi0JCQlpZiAoIWRldi0+cmVxX3BlbmRpbmcpIHsKKwkJCWlmICghdWRjLT5yZXFfcGVuZGluZykgewogCQkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQkJZ290byBkb25lOwogCQkJfQpAQCAtNjYyLDExICs2NjYsMTEgQEAKIAkJCSAqIGRlZmVyIGNoYW5naW5nIENPTkZHIHVudGlsIGFmdGVyIHRoZSBnYWRnZXQgZHJpdmVyCiAJCQkgKiByZWNvbmZpZ3VyZXMgdGhlIGVuZHBvaW50cy4KIAkJCSAqLwotCQkJaWYgKGRldi0+d2FpdF9mb3JfY29uZmlnX2FjaykgewotCQkJCXRtcCA9IGF0OTFfdWRwX3JlYWQoZGV2LCBBVDkxX1VEUF9HTEJfU1RBVCk7CisJCQlpZiAodWRjLT53YWl0X2Zvcl9jb25maWdfYWNrKSB7CisJCQkJdG1wID0gYXQ5MV91ZHBfcmVhZCh1ZGMsIEFUOTFfVURQX0dMQl9TVEFUKTsKIAkJCQl0bXAgXj0gQVQ5MV9VRFBfQ09ORkc7CiAJCQkJVkRCRygidG9nZ2xlIGNvbmZpZ1xuIik7Ci0JCQkJYXQ5MV91ZHBfd3JpdGUoZGV2LCBBVDkxX1VEUF9HTEJfU1RBVCwgdG1wKTsKKwkJCQlhdDkxX3VkcF93cml0ZSh1ZGMsIEFUOTFfVURQX0dMQl9TVEFULCB0bXApOwogCQkJfQogCQkJaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSAwKSB7CiBlcDBfaW5fc3RhdHVzOgpAQCAtNjc2LDcgKzY4MCw3IEBACiAJCQkJdG1wICY9IH5TRVRfRlg7CiAJCQkJdG1wIHw9IENMUl9GWCB8IEFUOTFfVURQX1RYUEtUUkRZOwogCQkJCV9fcmF3X3dyaXRlbCh0bXAsIGVwLT5jcmVnKTsKLQkJCQlkZXYtPnJlcV9wZW5kaW5nID0gMDsKKwkJCQl1ZGMtPnJlcV9wZW5kaW5nID0gMDsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0KQEAgLTY5NSwzMSArNjk5LDQwIEBACiAKIAlpZiAocmVxICYmICFzdGF0dXMpIHsKIAkJbGlzdF9hZGRfdGFpbCAoJnJlcS0+cXVldWUsICZlcC0+cXVldWUpOwotCQlhdDkxX3VkcF93cml0ZShkZXYsIEFUOTFfVURQX0lFUiwgZXAtPmludF9tYXNrKTsKKwkJYXQ5MV91ZHBfd3JpdGUodWRjLCBBVDkxX1VEUF9JRVIsIGVwLT5pbnRfbWFzayk7CiAJfQogZG9uZToKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgYXQ5MV9lcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxKQogewotCXN0cnVjdCBhdDkxX2VwCSplcDsKKwlzdHJ1Y3QgYXQ5MV9lcAkJKmVwOwogCXN0cnVjdCBhdDkxX3JlcXVlc3QJKnJlcTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdHJ1Y3QgYXQ5MV91ZGMJCSp1ZGM7CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBhdDkxX2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgZXAtPmVwLm5hbWUgPT0gZXAwbmFtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwl1ZGMgPSBlcC0+dWRjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCiAJLyogbWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9uIHRoaXMgZW5kcG9pbnQgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CiAJCWlmICgmcmVxLT5yZXEgPT0gX3JlcSkKIAkJCWJyZWFrOwogCX0KLQlpZiAoJnJlcS0+cmVxICE9IF9yZXEpCisJaWYgKCZyZXEtPnJlcSAhPSBfcmVxKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlkb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzM2LDcgKzc0OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJY3JlZyA9IGVwLT5jcmVnOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKIAljc3IgPSBfX3Jhd19yZWFkbChjcmVnKTsKIApAQCAtNzYxLDcgKzc3NCw3IEBACiAJCV9fcmF3X3dyaXRlbChjc3IsIGNyZWcpOwogCX0KIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC03OTUsNyArODA4LDcgQEAKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJREJHKCIlc1xuIiwgX19mdW5jX18gKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCF1ZGMtPmNsb2NrZWQgfHwgIXVkYy0+c3VzcGVuZGVkKQogCQlnb3RvIGRvbmU7CkBAIC04MDksNyArODIyLDcgQEAKIAlhdDkxX3VkcF93cml0ZSh1ZGMsIEFUOTFfVURQX0dMQl9TVEFULCBnbGJzdGF0ZSk7CiAKIGRvbmU6Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTg1MSw4ICs4NjQsMTEgQEAKIAkJZXAtPnN0b3BwZWQgPSAxOwogCQludWtlKGVwLCAtRVNIVVRET1dOKTsKIAl9Ci0JaWYgKGRyaXZlcikKKwlpZiAoZHJpdmVyKSB7CisJCXNwaW5fdW5sb2NrKCZ1ZGMtPmxvY2spOwogCQlkcml2ZXItPmRpc2Nvbm5lY3QoJnVkYy0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZ1ZGMtPmxvY2spOworCX0KIAogCXVkY19yZWluaXQodWRjKTsKIH0KQEAgLTkzNSwxMyArOTUxLDEzIEBACiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCS8vIFZEQkcoInZidXMgJXNcbiIsIGlzX2FjdGl2ZSA/ICJvbiIgOiAib2ZmIik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAl1ZGMtPnZidXMgPSAoaXNfYWN0aXZlICE9IDApOwogCWlmICh1ZGMtPmRyaXZlcikKIAkJcHVsbHVwKHVkYywgaXNfYWN0aXZlKTsKIAllbHNlCiAJCXB1bGx1cCh1ZGMsIDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTUwLDEwICs5NjYsMTAgQEAKIAlzdHJ1Y3QgYXQ5MV91ZGMJKnVkYyA9IHRvX3VkYyhnYWRnZXQpOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXVkYy0+ZW5hYmxlZCA9IGlzX29uID0gISFpc19vbjsKIAlwdWxsdXAodWRjLCBpc19vbik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC05NjIsOSArOTc4LDkgQEAKIAlzdHJ1Y3QgYXQ5MV91ZGMJKnVkYyA9IHRvX3VkYyhnYWRnZXQpOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXVkYy0+c2VsZnBvd2VyZWQgPSAoaXNfb24gIT0gMCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjI2LDggKzEyNDIsMTEgQEAKICN1bmRlZiB3X2xlbmd0aAogCiAJLyogcGFzcyByZXF1ZXN0IHVwIHRvIHRoZSBnYWRnZXQgZHJpdmVyICovCi0JaWYgKHVkYy0+ZHJpdmVyKQorCWlmICh1ZGMtPmRyaXZlcikgeworCQlzcGluX3VubG9jaygmdWRjLT5sb2NrKTsKIAkJc3RhdHVzID0gdWRjLT5kcml2ZXItPnNldHVwKCZ1ZGMtPmdhZGdldCwgJnBrdC5yKTsKKwkJc3Bpbl9sb2NrKCZ1ZGMtPmxvY2spOworCX0KIAllbHNlCiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTEzNzgsNiArMTM5Nyw5IEBACiAJc3RydWN0IGF0OTFfdWRjCQkqdWRjID0gX3VkYzsKIAl1MzIJCQlyZXNjYW5zID0gNTsKIAlpbnQJCQlkaXNhYmxlX2Nsb2NrID0gMDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAogCWlmICghdWRjLT5jbG9ja2VkKSB7CiAJCWNsa19vbih1ZGMpOwpAQCAtMTQzMyw4ICsxNDU1LDExIEBACiAJCQkgKiBhbmQgdGhlbiBpbnRvIHN0YW5kYnkgdG8gYXZvaWQgZHJhd2luZyBtb3JlIHRoYW4KIAkJCSAqIDUwMHVBIHBvd2VyICgyNTAwdUEgZm9yIHNvbWUgaGlnaC1wb3dlciBjb25maWdzKS4KIAkJCSAqLwotCQkJaWYgKHVkYy0+ZHJpdmVyICYmIHVkYy0+ZHJpdmVyLT5zdXNwZW5kKQorCQkJaWYgKHVkYy0+ZHJpdmVyICYmIHVkYy0+ZHJpdmVyLT5zdXNwZW5kKSB7CisJCQkJc3Bpbl91bmxvY2soJnVkYy0+bG9jayk7CiAJCQkJdWRjLT5kcml2ZXItPnN1c3BlbmQoJnVkYy0+Z2FkZ2V0KTsKKwkJCQlzcGluX2xvY2soJnVkYy0+bG9jayk7CisJCQl9CiAKIAkJLyogaG9zdCBpbml0aWF0ZWQgcmVzdW1lICovCiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgQVQ5MV9VRFBfUlhSU00pIHsKQEAgLTE0NTEsOCArMTQ3NiwxMSBAQAogCQkJICogd291bGQgbm9ybWFsbHkgd2FudCB0byBzd2l0Y2ggb3V0IG9mIHNsb3cgY2xvY2sKIAkJCSAqIG1vZGUgaW50byBub3JtYWwgbW9kZS4KIAkJCSAqLwotCQkJaWYgKHVkYy0+ZHJpdmVyICYmIHVkYy0+ZHJpdmVyLT5yZXN1bWUpCisJCQlpZiAodWRjLT5kcml2ZXIgJiYgdWRjLT5kcml2ZXItPnJlc3VtZSkgeworCQkJCXNwaW5fdW5sb2NrKCZ1ZGMtPmxvY2spOwogCQkJCXVkYy0+ZHJpdmVyLT5yZXN1bWUoJnVkYy0+Z2FkZ2V0KTsKKwkJCQlzcGluX2xvY2soJnVkYy0+bG9jayk7CisJCQl9CiAKIAkJLyogZW5kcG9pbnQgSVJRcyBhcmUgY2xlYXJlZCBieSBoYW5kbGluZyB0aGVtICovCiAJCX0gZWxzZSB7CkBAIC0xNDc0LDYgKzE1MDIsOCBAQAogCWlmIChkaXNhYmxlX2Nsb2NrKQogCQljbGtfb2ZmKHVkYyk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTU1NiwyNCArMTU4Niw1MyBAQAogCS8qIGVwNiBhbmQgZXA3IGFyZSBhbHNvIHJlc2VydmVkIChjdXN0b20gc2lsaWNvbiBtaWdodCB1c2UgdGhlbSkgKi8KIH07CiAKK3N0YXRpYyB2b2lkIGF0OTFfdmJ1c191cGRhdGUoc3RydWN0IGF0OTFfdWRjICp1ZGMsIHVuc2lnbmVkIHZhbHVlKQoreworCXZhbHVlIF49IHVkYy0+Ym9hcmQudmJ1c19hY3RpdmVfbG93OworCWlmICh2YWx1ZSAhPSB1ZGMtPnZidXMpCisJCWF0OTFfdmJ1c19zZXNzaW9uKCZ1ZGMtPmdhZGdldCwgdmFsdWUpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV92YnVzX2lycShpbnQgaXJxLCB2b2lkICpfdWRjKQogewogCXN0cnVjdCBhdDkxX3VkYwkqdWRjID0gX3VkYzsKLQl1bnNpZ25lZAl2YWx1ZTsKIAogCS8qIHZidXMgbmVlZHMgYXQgbGVhc3QgYnJpZWYgZGVib3VuY2luZyAqLwogCXVkZWxheSgxMCk7Ci0JdmFsdWUgPSBncGlvX2dldF92YWx1ZSh1ZGMtPmJvYXJkLnZidXNfcGluKTsKLQlpZiAodmFsdWUgIT0gdWRjLT52YnVzKQotCQlhdDkxX3ZidXNfc2Vzc2lvbigmdWRjLT5nYWRnZXQsIHZhbHVlKTsKKwlhdDkxX3ZidXNfdXBkYXRlKHVkYywgZ3Bpb19nZXRfdmFsdWUodWRjLT5ib2FyZC52YnVzX3BpbikpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgdm9pZCBhdDkxX3ZidXNfdGltZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGF0OTFfdWRjICp1ZGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0OTFfdWRjLAorCQkJCQkgICAgdmJ1c190aW1lcl93b3JrKTsKKworCWF0OTFfdmJ1c191cGRhdGUodWRjLCBncGlvX2dldF92YWx1ZV9jYW5zbGVlcCh1ZGMtPmJvYXJkLnZidXNfcGluKSk7CisKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJnVkYy0+dmJ1c190aW1lcikpCisJCW1vZF90aW1lcigmdWRjLT52YnVzX3RpbWVyLCBqaWZmaWVzICsgVkJVU19QT0xMX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZCBhdDkxX3ZidXNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdDkxX3VkYyAqdWRjID0gKHN0cnVjdCBhdDkxX3VkYyAqKWRhdGE7CisKKwkvKgorCSAqIElmIHdlIGFyZSBwb2xsaW5nIHZidXMgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIGdwaW8gaXMgb24gYW4KKwkgKiBidXMgc3VjaCBhcyBpMmMgb3Igc3BpIHdoaWNoIG1heSBzbGVlcCwgc28gc2NoZWR1bGUgc29tZSB3b3JrCisJICogdG8gcmVhZCB0aGUgdmJ1cyBncGlvCisJICovCisJaWYgKCF3b3JrX3BlbmRpbmcoJnVkYy0+dmJ1c190aW1lcl93b3JrKSkKKwkJc2NoZWR1bGVfd29yaygmdWRjLT52YnVzX3RpbWVyX3dvcmspOworfQorCiBpbnQgdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXN0cnVjdCBhdDkxX3VkYwkqdWRjID0gJmNvbnRyb2xsZXI7CiAJaW50CQlyZXR2YWw7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCWlmICghZHJpdmVyCiAJCQl8fCBkcml2ZXItPnNwZWVkIDwgVVNCX1NQRUVEX0ZVTEwKQEAgLTE2MDUsOSArMTY2NCw5IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAJcHVsbHVwKHVkYywgMSk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCiAJREJHKCJib3VuZCB0byAlc1xuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJcmV0dXJuIDA7CkBAIC0xNjE3LDE1ICsxNjc2LDE2IEBACiBpbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlciAoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IGF0OTFfdWRjICp1ZGMgPSAmY29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJaWYgKCFkcml2ZXIgfHwgZHJpdmVyICE9IHVkYy0+ZHJpdmVyIHx8ICFkcml2ZXItPnVuYmluZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAl1ZGMtPmVuYWJsZWQgPSAwOwogCWF0OTFfdWRwX3dyaXRlKHVkYywgQVQ5MV9VRFBfSURSLCB+MCk7CiAJcHVsbHVwKHVkYywgMCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCiAJZHJpdmVyLT51bmJpbmQoJnVkYy0+Z2FkZ2V0KTsKIAl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKQEAgLTE2NDEsOCArMTcwMSwxMyBAQAogCiBzdGF0aWMgdm9pZCBhdDkxdWRjX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYXQ5MV91ZGMgKnVkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwogCS8qIGZvcmNlIGRpc2Nvbm5lY3Qgb24gcmVib290ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXB1bGx1cChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgYXQ5MXVkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTY4Myw2ICsxNzQ4LDcgQEAKIAl1ZGMtPmJvYXJkID0gKihzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSAqKSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAJdWRjLT5wZGV2ID0gcGRldjsKIAl1ZGMtPmVuYWJsZWQgPSAwOworCXNwaW5fbG9ja19pbml0KCZ1ZGMtPmxvY2spOwogCiAJLyogcm05MjAwIG5lZWRzIG1hbnVhbCBEKyBwdWxsdXA7IG9mZiBieSBkZWZhdWx0ICovCiAJaWYgKGNwdV9pc19hdDkxcm05MjAwKCkpIHsKQEAgLTE3NjMsMTMgKzE4MjksMjMgQEAKIAkJICogR2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIFZCVVMgLSB3ZSBjYW5ub3QgZXhwZWN0CiAJCSAqIGEgcGVuZGluZyBpbnRlcnJ1cHQuCiAJCSAqLwotCQl1ZGMtPnZidXMgPSBncGlvX2dldF92YWx1ZSh1ZGMtPmJvYXJkLnZidXNfcGluKTsKLQkJaWYgKHJlcXVlc3RfaXJxKHVkYy0+Ym9hcmQudmJ1c19waW4sIGF0OTFfdmJ1c19pcnEsCi0JCQkJSVJRRl9ESVNBQkxFRCwgZHJpdmVyX25hbWUsIHVkYykpIHsKLQkJCURCRygicmVxdWVzdCB2YnVzIGlycSAlZCBmYWlsZWRcbiIsCi0JCQkJCXVkYy0+Ym9hcmQudmJ1c19waW4pOwotCQkJcmV0dmFsID0gLUVCVVNZOwotCQkJZ290byBmYWlsMzsKKwkJdWRjLT52YnVzID0gZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAodWRjLT5ib2FyZC52YnVzX3BpbikgXgorCQkJdWRjLT5ib2FyZC52YnVzX2FjdGl2ZV9sb3c7CisKKwkJaWYgKHVkYy0+Ym9hcmQudmJ1c19wb2xsZWQpIHsKKwkJCUlOSVRfV09SSygmdWRjLT52YnVzX3RpbWVyX3dvcmssIGF0OTFfdmJ1c190aW1lcl93b3JrKTsKKwkJCXNldHVwX3RpbWVyKCZ1ZGMtPnZidXNfdGltZXIsIGF0OTFfdmJ1c190aW1lciwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpdWRjKTsKKwkJCW1vZF90aW1lcigmdWRjLT52YnVzX3RpbWVyLAorCQkJCSAgamlmZmllcyArIFZCVVNfUE9MTF9USU1FT1VUKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXF1ZXN0X2lycSh1ZGMtPmJvYXJkLnZidXNfcGluLCBhdDkxX3ZidXNfaXJxLAorCQkJCQlJUlFGX0RJU0FCTEVELCBkcml2ZXJfbmFtZSwgdWRjKSkgeworCQkJCURCRygicmVxdWVzdCB2YnVzIGlycSAlZCBmYWlsZWRcbiIsCisJCQkJICAgIHVkYy0+Ym9hcmQudmJ1c19waW4pOworCQkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCQlnb3RvIGZhaWwzOworCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJREJHKCJubyBWQlVTIGRldGVjdGlvbiwgYXNzdW1pbmcgYWx3YXlzLW9uXG4iKTsKQEAgLTE4MDQsMTMgKzE4ODAsMTYgQEAKIHsKIAlzdHJ1Y3QgYXQ5MV91ZGMgKnVkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKIAlEQkcoInJlbW92ZVxuIik7CiAKIAlpZiAodWRjLT5kcml2ZXIpCiAJCXJldHVybiAtRUJVU1k7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAJcHVsbHVwKHVkYywgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CiAJcmVtb3ZlX2RlYnVnX2ZpbGUodWRjKTsKQEAgLTE4NDAsNiArMTkxOSw3IEBACiB7CiAJc3RydWN0IGF0OTFfdWRjICp1ZGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQJCXdha2UgPSB1ZGMtPmRyaXZlciAmJiBkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJLyogVW5sZXNzIHdlIGNhbiBhY3Qgbm9ybWFsbHkgdG8gdGhlIGhvc3QgKGxldHRpbmcgaXQgd2FrZSB1cyB1cAogCSAqIHdoZW5ldmVyIGl0IGhhcyB3b3JrIGZvciB1cykgZm9yY2UgZGlzY29ubmVjdC4gIFdha2V1cCByZXF1aXJlcwpAQCAtMTg0OSwxMyArMTkyOSwxNSBAQAogCWlmICgoIXVkYy0+c3VzcGVuZGVkICYmIHVkYy0+YWRkcikKIAkJCXx8ICF3YWtlCiAJCQl8fCBhdDkxX3N1c3BlbmRfZW50ZXJpbmdfc2xvd19jbG9jaygpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAkJcHVsbHVwKHVkYywgMCk7CiAJCXdha2UgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAl9IGVsc2UKIAkJZW5hYmxlX2lycV93YWtlKHVkYy0+dWRwX2lycSk7CiAKIAl1ZGMtPmFjdGl2ZV9zdXNwZW5kID0gd2FrZTsKLQlpZiAodWRjLT5ib2FyZC52YnVzX3BpbiA+IDAgJiYgd2FrZSkKKwlpZiAodWRjLT5ib2FyZC52YnVzX3BpbiA+IDAgJiYgIXVkYy0+Ym9hcmQudmJ1c19wb2xsZWQgJiYgd2FrZSkKIAkJZW5hYmxlX2lycV93YWtlKHVkYy0+Ym9hcmQudmJ1c19waW4pOwogCXJldHVybiAwOwogfQpAQCAtMTg2MywxNSArMTk0NSwyMCBAQAogc3RhdGljIGludCBhdDkxdWRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBhdDkxX3VkYyAqdWRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotCWlmICh1ZGMtPmJvYXJkLnZidXNfcGluID4gMCAmJiB1ZGMtPmFjdGl2ZV9zdXNwZW5kKQorCWlmICh1ZGMtPmJvYXJkLnZidXNfcGluID4gMCAmJiAhdWRjLT5ib2FyZC52YnVzX3BvbGxlZCAmJgorCSAgICB1ZGMtPmFjdGl2ZV9zdXNwZW5kKQogCQlkaXNhYmxlX2lycV93YWtlKHVkYy0+Ym9hcmQudmJ1c19waW4pOwogCiAJLyogbWF5YmUgcmVjb25uZWN0IHRvIGhvc3Q7IGlmIHNvLCBjbG9ja3Mgb24gKi8KIAlpZiAodWRjLT5hY3RpdmVfc3VzcGVuZCkKIAkJZGlzYWJsZV9pcnFfd2FrZSh1ZGMtPnVkcF9pcnEpOwotCWVsc2UKKwllbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCQlwdWxsdXAodWRjLCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CisJfQogCXJldHVybiAwOwogfQogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmgKaW5kZXggYzY1ZDYyMi4uMTA4Y2E1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmgKQEAgLTE0NCw2ICsxNDQsOSBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkJKnBkZTsKIAl2b2lkIF9faW9tZW0JCQkqdWRwX2Jhc2VhZGRyOwogCWludAkJCQl1ZHBfaXJxOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCB0aW1lcl9saXN0CQl2YnVzX3RpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJdmJ1c190aW1lcl93b3JrOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYXQ5MV91ZGMgKnRvX3VkYyhzdHJ1Y3QgdXNiX2dhZGdldCAqZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3V2Yy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmMKaW5kZXggZGJlNmRiMC4uYmU0NDZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmMKQEAgLTYxLDEyICs2MSwxMiBAQAogI2RlZmluZSBVVkNfSU5URl9WSURFT19TVFJFQU1JTkcJCTEKIAogc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IgdXZjX2lhZCBfX2luaXRkYXRhID0gewotCS5iTGVuZ3RoCQk9IFVTQl9EVF9JTlRFUkZBQ0VfQVNTT0NJQVRJT05fU0laRSwKKwkuYkxlbmd0aAkJPSBzaXplb2YodXZjX2lhZCksCiAJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9JTlRFUkZBQ0VfQVNTT0NJQVRJT04sCiAJLmJGaXJzdEludGVyZmFjZQk9IDAsCiAJLmJJbnRlcmZhY2VDb3VudAk9IDIsCiAJLmJGdW5jdGlvbkNsYXNzCQk9IFVTQl9DTEFTU19WSURFTywKLQkuYkZ1bmN0aW9uU3ViQ2xhc3MJPSAweDAzLAorCS5iRnVuY3Rpb25TdWJDbGFzcwk9IFVWQ19TQ19WSURFT19JTlRFUkZBQ0VfQ09MTEVDVElPTiwKIAkuYkZ1bmN0aW9uUHJvdG9jb2wJPSAweDAwLAogCS5pRnVuY3Rpb24JCT0gMCwKIH07CkBAIC03OCw3ICs3OCw3IEBACiAJLmJBbHRlcm5hdGVTZXR0aW5nCT0gMCwKIAkuYk51bUVuZHBvaW50cwkJPSAxLAogCS5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDB4MDEsCisJLmJJbnRlcmZhY2VTdWJDbGFzcwk9IFVWQ19TQ19WSURFT0NPTlRST0wsCiAJLmJJbnRlcmZhY2VQcm90b2NvbAk9IDB4MDAsCiAJLmlJbnRlcmZhY2UJCT0gMCwKIH07CkBAIC0xMDYsNyArMTA2LDcgQEAKIAkuYkFsdGVybmF0ZVNldHRpbmcJPSAwLAogCS5iTnVtRW5kcG9pbnRzCQk9IDAsCiAJLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKLQkuYkludGVyZmFjZVN1YkNsYXNzCT0gMHgwMiwKKwkuYkludGVyZmFjZVN1YkNsYXNzCT0gVVZDX1NDX1ZJREVPU1RSRUFNSU5HLAogCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSAweDAwLAogCS5pSW50ZXJmYWNlCQk9IDAsCiB9OwpAQCAtMTE4LDcgKzExOCw3IEBACiAJLmJBbHRlcm5hdGVTZXR0aW5nCT0gMSwKIAkuYk51bUVuZHBvaW50cwkJPSAxLAogCS5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDB4MDIsCisJLmJJbnRlcmZhY2VTdWJDbGFzcwk9IFVWQ19TQ19WSURFT1NUUkVBTUlORywKIAkuYkludGVyZmFjZVByb3RvY29sCT0gMHgwMCwKIAkuaUludGVyZmFjZQkJPSAwLAogfTsKQEAgLTYwMywxNSArNjAzLDE1IEBACiAKIAkvKiBWYWxpZGF0ZSB0aGUgZGVzY3JpcHRvcnMuICovCiAJaWYgKGNvbnRyb2wgPT0gTlVMTCB8fCBjb250cm9sWzBdID09IE5VTEwgfHwKLQkgICAgY29udHJvbFswXS0+YkRlc2NyaXB0b3JTdWJUeXBlICE9IFVWQ19EVF9IRUFERVIpCisJICAgIGNvbnRyb2xbMF0tPmJEZXNjcmlwdG9yU3ViVHlwZSAhPSBVVkNfVkNfSEVBREVSKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKGZzX3N0cmVhbWluZyA9PSBOVUxMIHx8IGZzX3N0cmVhbWluZ1swXSA9PSBOVUxMIHx8Ci0JICAgIGZzX3N0cmVhbWluZ1swXS0+YkRlc2NyaXB0b3JTdWJUeXBlICE9IFVWQ19EVF9JTlBVVF9IRUFERVIpCisJICAgIGZzX3N0cmVhbWluZ1swXS0+YkRlc2NyaXB0b3JTdWJUeXBlICE9IFVWQ19WU19JTlBVVF9IRUFERVIpCiAJCWdvdG8gZXJyb3I7CiAKIAlpZiAoaHNfc3RyZWFtaW5nID09IE5VTEwgfHwgaHNfc3RyZWFtaW5nWzBdID09IE5VTEwgfHwKLQkgICAgaHNfc3RyZWFtaW5nWzBdLT5iRGVzY3JpcHRvclN1YlR5cGUgIT0gVVZDX0RUX0lOUFVUX0hFQURFUikKKwkgICAgaHNfc3RyZWFtaW5nWzBdLT5iRGVzY3JpcHRvclN1YlR5cGUgIT0gVVZDX1ZTX0lOUFVUX0hFQURFUikKIAkJZ290byBlcnJvcjsKIAogCXV2Yy0+ZGVzYy5jb250cm9sID0gY29udHJvbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3V2Yy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmgKaW5kZXggOGE1ZGI3Yy4uZTE4YTY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmgKQEAgLTE1LDM1NyArMTUsNyBAQAogI2RlZmluZSBfRl9VVkNfSF8KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KLQotI2RlZmluZSBVU0JfQ0xBU1NfVklERU9fQ09OVFJPTAkJMQotI2RlZmluZSBVU0JfQ0xBU1NfVklERU9fU1RSRUFNSU5HCTIKLQotc3RydWN0IHV2Y19kZXNjcmlwdG9yX2hlYWRlciB7Ci0JX191OCAgYkxlbmd0aDsKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Ci0JX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCB1dmNfaGVhZGVyX2Rlc2NyaXB0b3IgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3UxNiBiY2RVVkM7Ci0JX191MTYgd1RvdGFsTGVuZ3RoOwotCV9fdTMyIGR3Q2xvY2tGcmVxdWVuY3k7Ci0JX191OCAgYkluQ29sbGVjdGlvbjsKLQlfX3U4ICBiYUludGVyZmFjZU5yW107Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotI2RlZmluZSBVVkNfSEVBREVSX0RFU0NSSVBUT1IobikJdXZjX2hlYWRlcl9kZXNjcmlwdG9yXyMjbgotCi0jZGVmaW5lIERFQ0xBUkVfVVZDX0hFQURFUl9ERVNDUklQVE9SKG4pIAkJCVwKLXN0cnVjdCBVVkNfSEVBREVSX0RFU0NSSVBUT1IobikgewkJCQlcCi0JX191OCAgYkxlbmd0aDsJCQkJCQlcCi0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQkJXAotCV9fdTE2IGJjZFVWQzsJCQkJCQlcCi0JX191MTYgd1RvdGFsTGVuZ3RoOwkJCQkJXAotCV9fdTMyIGR3Q2xvY2tGcmVxdWVuY3k7CQkJCQlcCi0JX191OCAgYkluQ29sbGVjdGlvbjsJCQkJCVwKLQlfX3U4ICBiYUludGVyZmFjZU5yW25dOwkJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotc3RydWN0IHV2Y19pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yIHsKLQlfX3U4ICBiTGVuZ3RoOwotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7Ci0JX191OCAgYlRlcm1pbmFsSUQ7Ci0JX191MTYgd1Rlcm1pbmFsVHlwZTsKLQlfX3U4ICBiQXNzb2NUZXJtaW5hbDsKLQlfX3U4ICBpVGVybWluYWw7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotc3RydWN0IHV2Y19vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvciB7Ci0JX191OCAgYkxlbmd0aDsKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Ci0JX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwotCV9fdTggIGJUZXJtaW5hbElEOwotCV9fdTE2IHdUZXJtaW5hbFR5cGU7Ci0JX191OCAgYkFzc29jVGVybWluYWw7Ci0JX191OCAgYlNvdXJjZUlEOwotCV9fdTggIGlUZXJtaW5hbDsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi1zdHJ1Y3QgdXZjX2NhbWVyYV90ZXJtaW5hbF9kZXNjcmlwdG9yIHsKLQlfX3U4ICBiTGVuZ3RoOwotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7Ci0JX191OCAgYlRlcm1pbmFsSUQ7Ci0JX191MTYgd1Rlcm1pbmFsVHlwZTsKLQlfX3U4ICBiQXNzb2NUZXJtaW5hbDsKLQlfX3U4ICBpVGVybWluYWw7Ci0JX191MTYgd09iamVjdGl2ZUZvY2FsTGVuZ3RoTWluOwotCV9fdTE2IHdPYmplY3RpdmVGb2NhbExlbmd0aE1heDsKLQlfX3UxNiB3T2N1bGFyRm9jYWxMZW5ndGg7Ci0JX191OCAgYkNvbnRyb2xTaXplOwotCV9fdTggIGJtQ29udHJvbHNbM107Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotc3RydWN0IHV2Y19zZWxlY3Rvcl91bml0X2Rlc2NyaXB0b3IgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3U4ICBiVW5pdElEOwotCV9fdTggIGJOckluUGluczsKLQlfX3U4ICBiYVNvdXJjZUlEWzBdOwotCV9fdTggIGlTZWxlY3RvcjsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0jZGVmaW5lIFVWQ19TRUxFQ1RPUl9VTklUX0RFU0NSSVBUT1IobikJXAotCXV2Y19zZWxlY3Rvcl91bml0X2Rlc2NyaXB0b3JfIyNuCi0KLSNkZWZpbmUgREVDTEFSRV9VVkNfU0VMRUNUT1JfVU5JVF9ERVNDUklQVE9SKG4pIAkJXAotc3RydWN0IFVWQ19TRUxFQ1RPUl9VTklUX0RFU0NSSVBUT1IobikgewkJCVwKLQlfX3U4ICBiTGVuZ3RoOwkJCQkJCVwKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCQlcCi0JX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwkJCQlcCi0JX191OCAgYlVuaXRJRDsJCQkJCQlcCi0JX191OCAgYk5ySW5QaW5zOwkJCQkJXAotCV9fdTggIGJhU291cmNlSURbbl07CQkJCQlcCi0JX191OCAgaVNlbGVjdG9yOwkJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotc3RydWN0IHV2Y19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciB7Ci0JX191OCAgYkxlbmd0aDsKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Ci0JX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwotCV9fdTggIGJVbml0SUQ7Ci0JX191OCAgYlNvdXJjZUlEOwotCV9fdTE2IHdNYXhNdWx0aXBsaWVyOwotCV9fdTggIGJDb250cm9sU2l6ZTsKLQlfX3U4ICBibUNvbnRyb2xzWzJdOwotCV9fdTggIGlQcm9jZXNzaW5nOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLXN0cnVjdCB1dmNfZXh0ZW5zaW9uX3VuaXRfZGVzY3JpcHRvciB7Ci0JX191OCAgYkxlbmd0aDsKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Ci0JX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwotCV9fdTggIGJVbml0SUQ7Ci0JX191OCAgZ3VpZEV4dGVuc2lvbkNvZGVbMTZdOwotCV9fdTggIGJOdW1Db250cm9sczsKLQlfX3U4ICBiTnJJblBpbnM7Ci0JX191OCAgYmFTb3VyY2VJRFswXTsKLQlfX3U4ICBiQ29udHJvbFNpemU7Ci0JX191OCAgYm1Db250cm9sc1swXTsKLQlfX3U4ICBpRXh0ZW5zaW9uOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLSNkZWZpbmUgVVZDX0VYVEVOU0lPTl9VTklUX0RFU0NSSVBUT1IocCwgbikgXAotCXV2Y19leHRlbnNpb25fdW5pdF9kZXNjcmlwdG9yXyMjcF8jI24KLQotI2RlZmluZSBERUNMQVJFX1VWQ19FWFRFTlNJT05fVU5JVF9ERVNDUklQVE9SKHAsIG4pIAkJXAotc3RydWN0IFVWQ19FWFRFTlNJT05fVU5JVF9ERVNDUklQVE9SKHAsIG4pIHsJCQlcCi0JX191OCAgYkxlbmd0aDsJCQkJCQlcCi0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQkJXAotCV9fdTggIGJVbml0SUQ7CQkJCQkJXAotCV9fdTggIGd1aWRFeHRlbnNpb25Db2RlWzE2XTsJCQkJXAotCV9fdTggIGJOdW1Db250cm9sczsJCQkJCVwKLQlfX3U4ICBiTnJJblBpbnM7CQkJCQlcCi0JX191OCAgYmFTb3VyY2VJRFtwXTsJCQkJCVwKLQlfX3U4ICBiQ29udHJvbFNpemU7CQkJCQlcCi0JX191OCAgYm1Db250cm9sc1tuXTsJCQkJCVwKLQlfX3U4ICBpRXh0ZW5zaW9uOwkJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotc3RydWN0IHV2Y19jb250cm9sX2VuZHBvaW50X2Rlc2NyaXB0b3IgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3UxNiB3TWF4VHJhbnNmZXJTaXplOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLSNkZWZpbmUgVVZDX0RUX0hFQURFUgkJCQkxCi0jZGVmaW5lIFVWQ19EVF9JTlBVVF9URVJNSU5BTAkJCTIKLSNkZWZpbmUgVVZDX0RUX09VVFBVVF9URVJNSU5BTAkJCTMKLSNkZWZpbmUgVVZDX0RUX1NFTEVDVE9SX1VOSVQJCQk0Ci0jZGVmaW5lIFVWQ19EVF9QUk9DRVNTSU5HX1VOSVQJCQk1Ci0jZGVmaW5lIFVWQ19EVF9FWFRFTlNJT05fVU5JVAkJCTYKLQotI2RlZmluZSBVVkNfRFRfSEVBREVSX1NJWkUobikJCQkoMTIrKG4pKQotI2RlZmluZSBVVkNfRFRfSU5QVVRfVEVSTUlOQUxfU0laRQkJOAotI2RlZmluZSBVVkNfRFRfT1VUUFVUX1RFUk1JTkFMX1NJWkUJCTkKLSNkZWZpbmUgVVZDX0RUX0NBTUVSQV9URVJNSU5BTF9TSVpFKG4pCQkoMTUrKG4pKQotI2RlZmluZSBVVkNfRFRfU0VMRUNUT1JfVU5JVF9TSVpFKG4pCQkoNisobikpCi0jZGVmaW5lIFVWQ19EVF9QUk9DRVNTSU5HX1VOSVRfU0laRShuKQkJKDkrKG4pKQotI2RlZmluZSBVVkNfRFRfRVhURU5TSU9OX1VOSVRfU0laRShwLG4pCQkoMjQrKHApKyhuKSkKLSNkZWZpbmUgVVZDX0RUX0NPTlRST0xfRU5EUE9JTlRfU0laRQkJNQotCi1zdHJ1Y3QgdXZjX2lucHV0X2hlYWRlcl9kZXNjcmlwdG9yIHsKLQlfX3U4ICBiTGVuZ3RoOwotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7Ci0JX191OCAgYk51bUZvcm1hdHM7Ci0JX191MTYgd1RvdGFsTGVuZ3RoOwotCV9fdTggIGJFbmRwb2ludEFkZHJlc3M7Ci0JX191OCAgYm1JbmZvOwotCV9fdTggIGJUZXJtaW5hbExpbms7Ci0JX191OCAgYlN0aWxsQ2FwdHVyZU1ldGhvZDsKLQlfX3U4ICBiVHJpZ2dlclN1cHBvcnQ7Ci0JX191OCAgYlRyaWdnZXJVc2FnZTsKLQlfX3U4ICBiQ29udHJvbFNpemU7Ci0JX191OCAgYm1hQ29udHJvbHNbXTsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0jZGVmaW5lIFVWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSBcCi0JdXZjX2lucHV0X2hlYWRlcl9kZXNjcmlwdG9yXyMjbl8jI3AKLQotI2RlZmluZSBERUNMQVJFX1VWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKQkJXAotc3RydWN0IFVWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSB7CQkJXAotCV9fdTggIGJMZW5ndGg7CQkJCQkJXAotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJCVwKLQlfX3U4ICBiTnVtRm9ybWF0czsJCQkJCVwKLQlfX3UxNiB3VG90YWxMZW5ndGg7CQkJCQlcCi0JX191OCAgYkVuZHBvaW50QWRkcmVzczsJCQkJCVwKLQlfX3U4ICBibUluZm87CQkJCQkJXAotCV9fdTggIGJUZXJtaW5hbExpbms7CQkJCQlcCi0JX191OCAgYlN0aWxsQ2FwdHVyZU1ldGhvZDsJCQkJXAotCV9fdTggIGJUcmlnZ2VyU3VwcG9ydDsJCQkJCVwKLQlfX3U4ICBiVHJpZ2dlclVzYWdlOwkJCQkJXAotCV9fdTggIGJDb250cm9sU2l6ZTsJCQkJCVwKLQlfX3U4ICBibWFDb250cm9sc1twXVtuXTsJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotc3RydWN0IHV2Y19vdXRwdXRfaGVhZGVyX2Rlc2NyaXB0b3IgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3U4ICBiTnVtRm9ybWF0czsKLQlfX3UxNiB3VG90YWxMZW5ndGg7Ci0JX191OCAgYkVuZHBvaW50QWRkcmVzczsKLQlfX3U4ICBiVGVybWluYWxMaW5rOwotCV9fdTggIGJDb250cm9sU2l6ZTsKLQlfX3U4ICBibWFDb250cm9sc1tdOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLSNkZWZpbmUgVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSBcCi0JdXZjX291dHB1dF9oZWFkZXJfZGVzY3JpcHRvcl8jI25fIyNwCi0KLSNkZWZpbmUgREVDTEFSRV9VVkNfT1VUUFVUX0hFQURFUl9ERVNDUklQVE9SKG4sIHApCQlcCi1zdHJ1Y3QgVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSB7CQkJXAotCV9fdTggIGJMZW5ndGg7CQkJCQkJXAotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJCVwKLQlfX3U4ICBiTnVtRm9ybWF0czsJCQkJCVwKLQlfX3UxNiB3VG90YWxMZW5ndGg7CQkJCQlcCi0JX191OCAgYkVuZHBvaW50QWRkcmVzczsJCQkJCVwKLQlfX3U4ICBiVGVybWluYWxMaW5rOwkJCQkJXAotCV9fdTggIGJDb250cm9sU2l6ZTsJCQkJCVwKLQlfX3U4ICBibWFDb250cm9sc1twXVtuXTsJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotc3RydWN0IHV2Y19mb3JtYXRfdW5jb21wcmVzc2VkIHsKLQlfX3U4ICBiTGVuZ3RoOwotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7Ci0JX191OCAgYkZvcm1hdEluZGV4OwotCV9fdTggIGJOdW1GcmFtZURlc2NyaXB0b3JzOwotCV9fdTggIGd1aWRGb3JtYXRbMTZdOwotCV9fdTggIGJCaXRzUGVyUGl4ZWw7Ci0JX191OCAgYkRlZmF1bHRGcmFtZUluZGV4OwotCV9fdTggIGJBc3BlY3RSYXRpb1g7Ci0JX191OCAgYkFzcGVjdFJhdGlvWTsKLQlfX3U4ICBibUludGVyZmFjZUZsYWdzOwotCV9fdTggIGJDb3B5UHJvdGVjdDsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi1zdHJ1Y3QgdXZjX2ZyYW1lX3VuY29tcHJlc3NlZCB7Ci0JX191OCAgYkxlbmd0aDsKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Ci0JX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOwotCV9fdTggIGJGcmFtZUluZGV4OwotCV9fdTggIGJtQ2FwYWJpbGl0aWVzOwotCV9fdTE2IHdXaWR0aDsKLQlfX3UxNiB3SGVpZ2h0OwotCV9fdTMyIGR3TWluQml0UmF0ZTsKLQlfX3UzMiBkd01heEJpdFJhdGU7Ci0JX191MzIgZHdNYXhWaWRlb0ZyYW1lQnVmZmVyU2l6ZTsKLQlfX3UzMiBkd0RlZmF1bHRGcmFtZUludGVydmFsOwotCV9fdTggIGJGcmFtZUludGVydmFsVHlwZTsKLQlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWxbXTsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0jZGVmaW5lIFVWQ19GUkFNRV9VTkNPTVBSRVNTRUQobikgXAotCXV2Y19mcmFtZV91bmNvbXByZXNzZWRfIyNuCi0KLSNkZWZpbmUgREVDTEFSRV9VVkNfRlJBTUVfVU5DT01QUkVTU0VEKG4pIAkJCVwKLXN0cnVjdCBVVkNfRlJBTUVfVU5DT01QUkVTU0VEKG4pIHsJCQkJXAotCV9fdTggIGJMZW5ndGg7CQkJCQkJXAotCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKLQlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJCVwKLQlfX3U4ICBiRnJhbWVJbmRleDsJCQkJCVwKLQlfX3U4ICBibUNhcGFiaWxpdGllczsJCQkJCVwKLQlfX3UxNiB3V2lkdGg7CQkJCQkJXAotCV9fdTE2IHdIZWlnaHQ7CQkJCQkJXAotCV9fdTMyIGR3TWluQml0UmF0ZTsJCQkJCVwKLQlfX3UzMiBkd01heEJpdFJhdGU7CQkJCQlcCi0JX191MzIgZHdNYXhWaWRlb0ZyYW1lQnVmZmVyU2l6ZTsJCQlcCi0JX191MzIgZHdEZWZhdWx0RnJhbWVJbnRlcnZhbDsJCQkJXAotCV9fdTggIGJGcmFtZUludGVydmFsVHlwZTsJCQkJXAotCV9fdTMyIGR3RnJhbWVJbnRlcnZhbFtuXTsJCQkJXAotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotc3RydWN0IHV2Y19mb3JtYXRfbWpwZWcgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3U4ICBiRm9ybWF0SW5kZXg7Ci0JX191OCAgYk51bUZyYW1lRGVzY3JpcHRvcnM7Ci0JX191OCAgYm1GbGFnczsKLQlfX3U4ICBiRGVmYXVsdEZyYW1lSW5kZXg7Ci0JX191OCAgYkFzcGVjdFJhdGlvWDsKLQlfX3U4ICBiQXNwZWN0UmF0aW9ZOwotCV9fdTggIGJtSW50ZXJmYWNlRmxhZ3M7Ci0JX191OCAgYkNvcHlQcm90ZWN0OwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLXN0cnVjdCB1dmNfZnJhbWVfbWpwZWcgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3U4ICBiRnJhbWVJbmRleDsKLQlfX3U4ICBibUNhcGFiaWxpdGllczsKLQlfX3UxNiB3V2lkdGg7Ci0JX191MTYgd0hlaWdodDsKLQlfX3UzMiBkd01pbkJpdFJhdGU7Ci0JX191MzIgZHdNYXhCaXRSYXRlOwotCV9fdTMyIGR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemU7Ci0JX191MzIgZHdEZWZhdWx0RnJhbWVJbnRlcnZhbDsKLQlfX3U4ICBiRnJhbWVJbnRlcnZhbFR5cGU7Ci0JX191MzIgZHdGcmFtZUludGVydmFsW107Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotI2RlZmluZSBVVkNfRlJBTUVfTUpQRUcobikgXAotCXV2Y19mcmFtZV9tanBlZ18jI24KLQotI2RlZmluZSBERUNMQVJFX1VWQ19GUkFNRV9NSlBFRyhuKSAJCQkJXAotc3RydWN0IFVWQ19GUkFNRV9NSlBFRyhuKSB7CQkJCQlcCi0JX191OCAgYkxlbmd0aDsJCQkJCQlcCi0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQkJXAotCV9fdTggIGJGcmFtZUluZGV4OwkJCQkJXAotCV9fdTggIGJtQ2FwYWJpbGl0aWVzOwkJCQkJXAotCV9fdTE2IHdXaWR0aDsJCQkJCQlcCi0JX191MTYgd0hlaWdodDsJCQkJCQlcCi0JX191MzIgZHdNaW5CaXRSYXRlOwkJCQkJXAotCV9fdTMyIGR3TWF4Qml0UmF0ZTsJCQkJCVwKLQlfX3UzMiBkd01heFZpZGVvRnJhbWVCdWZmZXJTaXplOwkJCVwKLQlfX3UzMiBkd0RlZmF1bHRGcmFtZUludGVydmFsOwkJCQlcCi0JX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOwkJCQlcCi0JX191MzIgZHdGcmFtZUludGVydmFsW25dOwkJCQlcCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotCi1zdHJ1Y3QgdXZjX2NvbG9yX21hdGNoaW5nX2Rlc2NyaXB0b3IgewotCV9fdTggIGJMZW5ndGg7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKLQlfX3U4ICBiQ29sb3JQcmltYXJpZXM7Ci0JX191OCAgYlRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzOwotCV9fdTggIGJNYXRyaXhDb2VmZmljaWVudHM7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotI2RlZmluZSBVVkNfRFRfSU5QVVRfSEVBREVSCQkJMQotI2RlZmluZSBVVkNfRFRfT1VUUFVUX0hFQURFUgkJCTIKLSNkZWZpbmUgVVZDX0RUX0ZPUk1BVF9VTkNPTVBSRVNTRUQJCTQKLSNkZWZpbmUgVVZDX0RUX0ZSQU1FX1VOQ09NUFJFU1NFRAkJNQotI2RlZmluZSBVVkNfRFRfRk9STUFUX01KUEVHCQkJNgotI2RlZmluZSBVVkNfRFRfRlJBTUVfTUpQRUcJCQk3Ci0jZGVmaW5lIFVWQ19EVF9DT0xPUl9NQVRDSElORwkJCTEzCi0KLSNkZWZpbmUgVVZDX0RUX0lOUFVUX0hFQURFUl9TSVpFKG4sIHApCQkoMTMrKG4qcCkpCi0jZGVmaW5lIFVWQ19EVF9PVVRQVVRfSEVBREVSX1NJWkUobiwgcCkJCSg5KyhuKnApKQotI2RlZmluZSBVVkNfRFRfRk9STUFUX1VOQ09NUFJFU1NFRF9TSVpFCQkyNwotI2RlZmluZSBVVkNfRFRfRlJBTUVfVU5DT01QUkVTU0VEX1NJWkUobikJKDI2KzQqKG4pKQotI2RlZmluZSBVVkNfRFRfRk9STUFUX01KUEVHX1NJWkUJCTExCi0jZGVmaW5lIFVWQ19EVF9GUkFNRV9NSlBFR19TSVpFKG4pCQkoMjYrNCoobikpCi0jZGVmaW5lIFVWQ19EVF9DT0xPUl9NQVRDSElOR19TSVpFCQk2CisjaW5jbHVkZSA8bGludXgvdXNiL3ZpZGVvLmg+CiAKIGV4dGVybiBpbnQgdXZjX2JpbmRfY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywKIAkJCSAgIGNvbnN0IHN0cnVjdCB1dmNfZGVzY3JpcHRvcl9oZWFkZXIgKiBjb25zdCAqY29udHJvbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfbXhjX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9teGNfdWRjLmMKaW5kZXggZDBiOGJkZS4uZWFmYTZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9teGNfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9teGNfdWRjLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlpZiAoIWNwdV9pc19teDM1KCkpIHsKKwlpZiAoIWNwdV9pc19teDM1KCkgJiYgIWNwdV9pc19teDI1KCkpIHsKIAkJbXhjX2FoYl9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ1c2JfYWhiIik7CiAJCWlmIChJU19FUlIobXhjX2FoYl9jbGspKQogCQkJcmV0dXJuIFBUUl9FUlIobXhjX2FoYl9jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKaW5kZXggODI1MDZjYS4uOTY0OGI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYwppbmRleCA1YzBkMDZjLi4wMjBmYTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYwpAQCAtMTcxLDcgKzE3MSw4IEBACiAJaW50CQkJaSwgY291bnQ7CiAJcm5kaXNfcXVlcnlfY21wbHRfdHlwZQkqcmVzcDsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCSpzdGF0czsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKKwljb25zdCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzOwogCiAJaWYgKCFyKSByZXR1cm4gLUVOT01FTTsKIAlyZXNwID0gKHJuZGlzX3F1ZXJ5X2NtcGx0X3R5cGUgKikgci0+YnVmOwpAQCAtMTk0LDcgKzE5NSw3IEBACiAJcmVzcC0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBjcHVfdG9fbGUzMiAoMTYpOwogCiAJbmV0ID0gcm5kaXNfcGVyX2Rldl9wYXJhbXNbY29uZmlnTnJdLmRldjsKLQlzdGF0cyA9IGRldl9nZXRfc3RhdHMobmV0KTsKKwlzdGF0cyA9IGRldl9nZXRfc3RhdHMobmV0LCAmdGVtcCk7CiAKIAlzd2l0Y2ggKE9JRCkgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdXZjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvdXZjLmgKaW5kZXggZTkyNDU0Yy4uNWI3OTE5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3V2Yy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91dmMuaApAQCAtNDgsMzkgKzQ4LDYgQEAKICNkZWZpbmUgVVZDX0lOVEZfU1RSRUFNSU5HCQkxCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVVZDIGNvbnN0YW50cyAmIHN0cnVjdHVyZXMKLSAqLwotCi0vKiBWYWx1ZXMgZm9yIGJtSGVhZGVySW5mbyAoVmlkZW8gYW5kIFN0aWxsIEltYWdlIFBheWxvYWQgSGVhZGVycywgMi40LjMuMykgKi8KLSNkZWZpbmUgVVZDX1NUUkVBTV9FT0gJCQkJKDEgPDwgNykKLSNkZWZpbmUgVVZDX1NUUkVBTV9FUlIJCQkJKDEgPDwgNikKLSNkZWZpbmUgVVZDX1NUUkVBTV9TVEkJCQkJKDEgPDwgNSkKLSNkZWZpbmUgVVZDX1NUUkVBTV9SRVMJCQkJKDEgPDwgNCkKLSNkZWZpbmUgVVZDX1NUUkVBTV9TQ1IJCQkJKDEgPDwgMykKLSNkZWZpbmUgVVZDX1NUUkVBTV9QVFMJCQkJKDEgPDwgMikKLSNkZWZpbmUgVVZDX1NUUkVBTV9FT0YJCQkJKDEgPDwgMSkKLSNkZWZpbmUgVVZDX1NUUkVBTV9GSUQJCQkJKDEgPDwgMCkKLQotc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCB7Ci0JX191MTYgYm1IaW50OwotCV9fdTggIGJGb3JtYXRJbmRleDsKLQlfX3U4ICBiRnJhbWVJbmRleDsKLQlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWw7Ci0JX191MTYgd0tleUZyYW1lUmF0ZTsKLQlfX3UxNiB3UEZyYW1lUmF0ZTsKLQlfX3UxNiB3Q29tcFF1YWxpdHk7Ci0JX191MTYgd0NvbXBXaW5kb3dTaXplOwotCV9fdTE2IHdEZWxheTsKLQlfX3UzMiBkd01heFZpZGVvRnJhbWVTaXplOwotCV9fdTMyIGR3TWF4UGF5bG9hZFRyYW5zZmVyU2l6ZTsKLQlfX3UzMiBkd0Nsb2NrRnJlcXVlbmN5OwotCV9fdTggIGJtRnJhbWluZ0luZm87Ci0JX191OCAgYlByZWZlcmVkVmVyc2lvbjsKLQlfX3U4ICBiTWluVmVyc2lvbjsKLQlfX3U4ICBiTWF4VmVyc2lvbjsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERlYnVnZ2luZywgcHJpbnRpbmcgYW5kIGxvZ2dpbmcKICAqLwogCkBAIC0xMzcsOSArMTA0LDYgQEAKICNkZWZpbmUgVVZDX01BWF9SRVFVRVNUX1NJWkUJCQk2NAogI2RlZmluZSBVVkNfTUFYX0VWRU5UUwkJCQk0CiAKLSNkZWZpbmUgVVNCX0RUX0lOVEVSRkFDRV9BU1NPQ0lBVElPTl9TSVpFCTgKLSNkZWZpbmUgVVNCX0NMQVNTX01JU0MJCQkJMHhlZgotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFN0cnVjdHVyZXMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3dlYmNhbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3dlYmNhbS5jCmluZGV4IGY1ZjMwMzAuLjI4OGQyMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC93ZWJjYW0uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvd2ViY2FtLmMKQEAgLTkwLDcgKzkwLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgVVZDX0hFQURFUl9ERVNDUklQVE9SKDEpIHV2Y19jb250cm9sX2hlYWRlciA9IHsKIAkuYkxlbmd0aAkJPSBVVkNfRFRfSEVBREVSX1NJWkUoMSksCiAJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9DU19JTlRFUkZBQ0UsCi0JLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19EVF9IRUFERVIsCisJLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19WQ19IRUFERVIsCiAJLmJjZFVWQwkJCT0gY3B1X3RvX2xlMTYoMHgwMTAwKSwKIAkud1RvdGFsTGVuZ3RoCQk9IDAsIC8qIGR5bmFtaWMgKi8KIAkuZHdDbG9ja0ZyZXF1ZW5jeQk9IGNwdV90b19sZTMyKDQ4MDAwMDAwKSwKQEAgLTEwMSw3ICsxMDEsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB1dmNfY2FtZXJhX3Rlcm1pbmFsX2Rlc2NyaXB0b3IgdXZjX2NhbWVyYV90ZXJtaW5hbCA9IHsKIAkuYkxlbmd0aAkJPSBVVkNfRFRfQ0FNRVJBX1RFUk1JTkFMX1NJWkUoMyksCiAJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9DU19JTlRFUkZBQ0UsCi0JLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19EVF9JTlBVVF9URVJNSU5BTCwKKwkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX1ZDX0lOUFVUX1RFUk1JTkFMLAogCS5iVGVybWluYWxJRAkJPSAxLAogCS53VGVybWluYWxUeXBlCQk9IGNwdV90b19sZTE2KDB4MDIwMSksCiAJLmJBc3NvY1Rlcm1pbmFsCQk9IDAsCkBAIC0xMTgsNyArMTE4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXZjX3Byb2Nlc3NpbmdfdW5pdF9kZXNjcmlwdG9yIHV2Y19wcm9jZXNzaW5nID0gewogCS5iTGVuZ3RoCQk9IFVWQ19EVF9QUk9DRVNTSU5HX1VOSVRfU0laRSgyKSwKIAkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0NTX0lOVEVSRkFDRSwKLQkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX0RUX1BST0NFU1NJTkdfVU5JVCwKKwkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX1ZDX1BST0NFU1NJTkdfVU5JVCwKIAkuYlVuaXRJRAkJPSAyLAogCS5iU291cmNlSUQJCT0gMSwKIAkud01heE11bHRpcGxpZXIJCT0gY3B1X3RvX2xlMTYoMTYqMTAyNCksCkBAIC0xMzEsNyArMTMxLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXZjX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yIHV2Y19vdXRwdXRfdGVybWluYWwgPSB7CiAJLmJMZW5ndGgJCT0gVVZDX0RUX09VVFBVVF9URVJNSU5BTF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfQ1NfSU5URVJGQUNFLAotCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfRFRfT1VUUFVUX1RFUk1JTkFMLAorCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfVkNfT1VUUFVUX1RFUk1JTkFMLAogCS5iVGVybWluYWxJRAkJPSAzLAogCS53VGVybWluYWxUeXBlCQk9IGNwdV90b19sZTE2KDB4MDEwMSksCiAJLmJBc3NvY1Rlcm1pbmFsCQk9IDAsCkBAIC0xNDQsNyArMTQ0LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgVVZDX0lOUFVUX0hFQURFUl9ERVNDUklQVE9SKDEsIDIpIHV2Y19pbnB1dF9oZWFkZXIgPSB7CiAJLmJMZW5ndGgJCT0gVVZDX0RUX0lOUFVUX0hFQURFUl9TSVpFKDEsIDIpLAogCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfQ1NfSU5URVJGQUNFLAotCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfRFRfSU5QVVRfSEVBREVSLAorCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfVlNfSU5QVVRfSEVBREVSLAogCS5iTnVtRm9ybWF0cwkJPSAyLAogCS53VG90YWxMZW5ndGgJCT0gMCwgLyogZHluYW1pYyAqLwogCS5iRW5kcG9pbnRBZGRyZXNzCT0gMCwgLyogZHluYW1pYyAqLwpAQCAtMTYxLDcgKzE2MSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHV2Y19mb3JtYXRfdW5jb21wcmVzc2VkIHV2Y19mb3JtYXRfeXV2ID0gewogCS5iTGVuZ3RoCQk9IFVWQ19EVF9GT1JNQVRfVU5DT01QUkVTU0VEX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9DU19JTlRFUkZBQ0UsCi0JLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19EVF9GT1JNQVRfVU5DT01QUkVTU0VELAorCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfVlNfRk9STUFUX1VOQ09NUFJFU1NFRCwKIAkuYkZvcm1hdEluZGV4CQk9IDEsCiAJLmJOdW1GcmFtZURlc2NyaXB0b3JzCT0gMiwKIAkuZ3VpZEZvcm1hdAkJPQpAQCAtMTgxLDcgKzE4MSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IFVWQ19GUkFNRV9VTkNPTVBSRVNTRUQoMykgdXZjX2ZyYW1lX3l1dl8zNjBwID0gewogCS5iTGVuZ3RoCQk9IFVWQ19EVF9GUkFNRV9VTkNPTVBSRVNTRURfU0laRSgzKSwKIAkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0NTX0lOVEVSRkFDRSwKLQkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX0RUX0ZSQU1FX1VOQ09NUFJFU1NFRCwKKwkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX1ZTX0ZSQU1FX1VOQ09NUFJFU1NFRCwKIAkuYkZyYW1lSW5kZXgJCT0gMSwKIAkuYm1DYXBhYmlsaXRpZXMJCT0gMCwKIAkud1dpZHRoCQkJPSBjcHVfdG9fbGUxNig2NDApLApAQCAtMTk5LDcgKzE5OSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IFVWQ19GUkFNRV9VTkNPTVBSRVNTRUQoMSkgdXZjX2ZyYW1lX3l1dl83MjBwID0gewogCS5iTGVuZ3RoCQk9IFVWQ19EVF9GUkFNRV9VTkNPTVBSRVNTRURfU0laRSgxKSwKIAkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0NTX0lOVEVSRkFDRSwKLQkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX0RUX0ZSQU1FX1VOQ09NUFJFU1NFRCwKKwkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX1ZTX0ZSQU1FX1VOQ09NUFJFU1NFRCwKIAkuYkZyYW1lSW5kZXgJCT0gMiwKIAkuYm1DYXBhYmlsaXRpZXMJCT0gMCwKIAkud1dpZHRoCQkJPSBjcHVfdG9fbGUxNigxMjgwKSwKQEAgLTIxNSw3ICsyMTUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB1dmNfZm9ybWF0X21qcGVnIHV2Y19mb3JtYXRfbWpwZyA9IHsKIAkuYkxlbmd0aAkJPSBVVkNfRFRfRk9STUFUX01KUEVHX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9DU19JTlRFUkZBQ0UsCi0JLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19EVF9GT1JNQVRfTUpQRUcsCisJLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19WU19GT1JNQVRfTUpQRUcsCiAJLmJGb3JtYXRJbmRleAkJPSAyLAogCS5iTnVtRnJhbWVEZXNjcmlwdG9ycwk9IDIsCiAJLmJtRmxhZ3MJCT0gMCwKQEAgLTIzMiw3ICsyMzIsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBVVkNfRlJBTUVfTUpQRUcoMykgdXZjX2ZyYW1lX21qcGdfMzYwcCA9IHsKIAkuYkxlbmd0aAkJPSBVVkNfRFRfRlJBTUVfTUpQRUdfU0laRSgzKSwKIAkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0NTX0lOVEVSRkFDRSwKLQkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX0RUX0ZSQU1FX01KUEVHLAorCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfVlNfRlJBTUVfTUpQRUcsCiAJLmJGcmFtZUluZGV4CQk9IDEsCiAJLmJtQ2FwYWJpbGl0aWVzCQk9IDAsCiAJLndXaWR0aAkJCT0gY3B1X3RvX2xlMTYoNjQwKSwKQEAgLTI1MCw3ICsyNTAsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBVVkNfRlJBTUVfTUpQRUcoMSkgdXZjX2ZyYW1lX21qcGdfNzIwcCA9IHsKIAkuYkxlbmd0aAkJPSBVVkNfRFRfRlJBTUVfTUpQRUdfU0laRSgxKSwKIAkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0NTX0lOVEVSRkFDRSwKLQkuYkRlc2NyaXB0b3JTdWJUeXBlCT0gVVZDX0RUX0ZSQU1FX01KUEVHLAorCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfVlNfRlJBTUVfTUpQRUcsCiAJLmJGcmFtZUluZGV4CQk9IDIsCiAJLmJtQ2FwYWJpbGl0aWVzCQk9IDAsCiAJLndXaWR0aAkJCT0gY3B1X3RvX2xlMTYoMTI4MCksCkBAIC0yNjYsNyArMjY2LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXZjX2NvbG9yX21hdGNoaW5nX2Rlc2NyaXB0b3IgdXZjX2NvbG9yX21hdGNoaW5nID0gewogCS5iTGVuZ3RoCQk9IFVWQ19EVF9DT0xPUl9NQVRDSElOR19TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfQ1NfSU5URVJGQUNFLAotCS5iRGVzY3JpcHRvclN1YlR5cGUJPSBVVkNfRFRfQ09MT1JfTUFUQ0hJTkcsCisJLmJEZXNjcmlwdG9yU3ViVHlwZQk9IFVWQ19WU19DT0xPUkZPUk1BVCwKIAkuYkNvbG9yUHJpbWFyaWVzCT0gMSwKIAkuYlRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzCT0gMSwKIAkuYk1hdHJpeENvZWZmaWNpZW50cwk9IDQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbXhjLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbXhjLmMKaW5kZXggYmQ0MDI3Ny4uYThhZDhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW14Yy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1teGMuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJfQogCWNsa19lbmFibGUocHJpdi0+dXNiY2xrKTsKIAotCWlmICghY3B1X2lzX214MzUoKSkgeworCWlmICghY3B1X2lzX214MzUoKSAmJiAhY3B1X2lzX214MjUoKSkgewogCQlwcml2LT5haGJjbGsgPSBjbGtfZ2V0KGRldiwgInVzYl9haGIiKTsKIAkJaWYgKElTX0VSUihwcml2LT5haGJjbGspKSB7CiAJCQlyZXQgPSBQVFJfRVJSKHByaXYtPmFoYmNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1zY2hlZC5jCmluZGV4IDRmMmNiZGMuLmE0MmVmMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1zY2hlZC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIC8qCiAgKiBGbHVzaCBhbGwgdHJhbnNtaXR0ZWQgcGFja2V0cyBmcm9tIEJEcwogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGRpc2FibGluZyB0aGUgVVNCIHBvcnQgdG8gZmx1c2ggYWxsCi0gKiB0cmFuc21pc3Npb25zIHRoYXQgYXJlIGFsbHJlYWR5IHNjaGVkdWxlZCBpbiB0aGUgQkRzCisgKiB0cmFuc21pc3Npb25zIHRoYXQgYXJlIGFscmVhZHkgc2NoZWR1bGVkIGluIHRoZSBCRHMKICAqLwogdm9pZCBmaGNpX2ZsdXNoX2FsbF90cmFuc21pc3Npb25zKHN0cnVjdCBmaGNpX3VzYiAqdXNiKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCmluZGV4IGZjNTc2NTUuLjAyODY0YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKQEAgLTEwMzEsNyArMTAzMSw3IEBACiAjZGVmaW5lIFBMQVRGT1JNX0RSSVZFUgkJb2hjaV9oY2RfZXA5M3h4X2RyaXZlcgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMVgwMAorI2lmZGVmIENPTkZJR19NSVBTX0FMQ0hFTVkKICNpbmNsdWRlICJvaGNpLWF1MXh4eC5jIgogI2RlZmluZSBQTEFURk9STV9EUklWRVIJCW9oY2lfaGNkX2F1MXh4eF9kcml2ZXIKICNlbmRpZgpAQCAtMTA5NSw2ICsxMDk1LDExIEBACiAjZGVmaW5lIFRNSU9fT0hDSV9EUklWRVIJb2hjaV9oY2RfdG1pb19kcml2ZXIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01BQ0hfSlo0NzQwCisjaW5jbHVkZSAib2hjaS1qejQ3NDAuYyIKKyNkZWZpbmUgUExBVEZPUk1fRFJJVkVSCW9oY2lfaGNkX2p6NDc0MF9kcml2ZXIKKyNlbmRpZgorCiAjaWYJIWRlZmluZWQoUENJX0RSSVZFUikgJiYJCVwKIAkhZGVmaW5lZChQTEFURk9STV9EUklWRVIpICYmCVwKIAkhZGVmaW5lZChPTUFQMV9QTEFURk9STV9EUklWRVIpICYmCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1qejQ3NDAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1qejQ3NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUxODcyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1qejQ3NDAuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCitzdHJ1Y3Qgano0NzQwX29oY2lfaGNkIHsKKwlzdHJ1Y3Qgb2hjaV9oY2Qgb2hjaV9oY2Q7CisKKwlzdHJ1Y3QgcmVndWxhdG9yICp2YnVzOworCWJvb2wgdmJ1c19lbmFibGVkOworCXN0cnVjdCBjbGsgKmNsazsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGp6NDc0MF9vaGNpX2hjZCAqaGNkX3RvX2p6NDc0MF9oY2Qoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBqejQ3NDBfb2hjaV9oY2QgKikoaGNkLT5oY2RfcHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9oY2QgKmp6NDc0MF9oY2RfdG9faGNkKHN0cnVjdCBqejQ3NDBfb2hjaV9oY2QgKmp6NDc0MF9vaGNpKQoreworCXJldHVybiBjb250YWluZXJfb2YoKHZvaWQgKilqejQ3NDBfb2hjaSwgc3RydWN0IHVzYl9oY2QsIGhjZF9wcml2KTsKK30KKworc3RhdGljIGludCBvaGNpX2p6NDc0MF9zdGFydChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBvaGNpX2hjZCAqb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CisJaW50CXJldDsKKworCXJldCA9IG9oY2lfaW5pdChvaGNpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW9oY2ktPm51bV9wb3J0cyA9IDE7CisKKwlyZXQgPSBvaGNpX3J1bihvaGNpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiQ2FuIG5vdCBzdGFydCAlcyIsCisJCQloY2QtPnNlbGYuYnVzX25hbWUpOworCQlvaGNpX3N0b3AoaGNkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2hjaV9qejQ3NDBfc2V0X3ZidXNfcG93ZXIoc3RydWN0IGp6NDc0MF9vaGNpX2hjZCAqano0NzQwX29oY2ksCisJYm9vbCBlbmFibGVkKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFqejQ3NDBfb2hjaS0+dmJ1cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZW5hYmxlZCAmJiAhano0NzQwX29oY2ktPnZidXNfZW5hYmxlZCkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGp6NDc0MF9vaGNpLT52YnVzKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoano0NzQwX2hjZF90b19oY2Qoano0NzQwX29oY2kpLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJIkNvdWxkIG5vdCBwb3dlciB2YnVzXG4iKTsKKwl9IGVsc2UgaWYgKCFlbmFibGVkICYmIGp6NDc0MF9vaGNpLT52YnVzX2VuYWJsZWQpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUoano0NzQwX29oY2ktPnZidXMpOworCX0KKworCWlmIChyZXQgPT0gMCkKKwkJano0NzQwX29oY2ktPnZidXNfZW5hYmxlZCA9IGVuYWJsZWQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9oY2lfano0NzQwX2h1Yl9jb250cm9sKHN0cnVjdCB1c2JfaGNkICpoY2QsIHUxNiB0eXBlUmVxLCB1MTYgd1ZhbHVlLAorCXUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJc3RydWN0IGp6NDc0MF9vaGNpX2hjZCAqano0NzQwX29oY2kgPSBoY2RfdG9fano0NzQwX2hjZChoY2QpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHR5cGVSZXEpIHsKKwljYXNlIFNldEh1YkZlYXR1cmU6CisJCWlmICh3VmFsdWUgPT0gVVNCX1BPUlRfRkVBVF9QT1dFUikKKwkJCXJldCA9IG9oY2lfano0NzQwX3NldF92YnVzX3Bvd2VyKGp6NDc0MF9vaGNpLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBDbGVhckh1YkZlYXR1cmU6CisJCWlmICh3VmFsdWUgPT0gVVNCX1BPUlRfRkVBVF9QT1dFUikKKwkJCXJldCA9IG9oY2lfano0NzQwX3NldF92YnVzX3Bvd2VyKGp6NDc0MF9vaGNpLCBmYWxzZSk7CisJCWJyZWFrOworCX0KKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gb2hjaV9odWJfY29udHJvbChoY2QsIHR5cGVSZXEsIHdWYWx1ZSwgd0luZGV4LCBidWYsIHdMZW5ndGgpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIG9oY2lfano0NzQwX2hjX2RyaXZlciA9IHsKKwkuZGVzY3JpcHRpb24gPQkJaGNkX25hbWUsCisJLnByb2R1Y3RfZGVzYyA9CQkiSlo0NzQwIE9IQ0kiLAorCS5oY2RfcHJpdl9zaXplID0Jc2l6ZW9mKHN0cnVjdCBqejQ3NDBfb2hjaV9oY2QpLAorCisJLyoKKwkgKiBnZW5lcmljIGhhcmR3YXJlIGxpbmthZ2UKKwkgKi8KKwkuaXJxID0JCQlvaGNpX2lycSwKKwkuZmxhZ3MgPQkJSENEX1VTQjExIHwgSENEX01FTU9SWSwKKworCS8qCisJICogYmFzaWMgbGlmZWN5Y2xlIG9wZXJhdGlvbnMKKwkgKi8KKwkuc3RhcnQgPQkJb2hjaV9qejQ3NDBfc3RhcnQsCisJLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPQkJb2hjaV9zaHV0ZG93biwKKworCS8qCisJICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKKwkgKi8KKwkudXJiX2VucXVldWUgPQkJb2hjaV91cmJfZW5xdWV1ZSwKKwkudXJiX2RlcXVldWUgPQkJb2hjaV91cmJfZGVxdWV1ZSwKKwkuZW5kcG9pbnRfZGlzYWJsZSA9CW9oY2lfZW5kcG9pbnRfZGlzYWJsZSwKKworCS8qCisJICogc2NoZWR1bGluZyBzdXBwb3J0CisJICovCisJLmdldF9mcmFtZV9udW1iZXIgPQlvaGNpX2dldF9mcmFtZSwKKworCS8qCisJICogcm9vdCBodWIgc3VwcG9ydAorCSAqLworCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wgPQkJb2hjaV9qejQ3NDBfaHViX2NvbnRyb2wsCisjaWZkZWYJQ09ORklHX1BNCisJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCisJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLAorI2VuZGlmCisJLnN0YXJ0X3BvcnRfcmVzZXQgPQlvaGNpX3N0YXJ0X3BvcnRfcmVzZXQsCit9OworCisKK3N0YXRpYyBfX2RldmluaXQgaW50IGp6NDc0MF9vaGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkOworCXN0cnVjdCBqejQ3NDBfb2hjaV9oY2QgKmp6NDc0MF9vaGNpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpcnE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBpcnFcbiIpOworCQlyZXR1cm4gaXJxOworCX0KKworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZvaGNpX2p6NDc0MF9oY19kcml2ZXIsICZwZGV2LT5kZXYsICJqejQ3NDAiKTsKKwlpZiAoIWhjZCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIGhjZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlqejQ3NDBfb2hjaSA9IGhjZF90b19qejQ3NDBfaGNkKGhjZCk7CisKKwlyZXMgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBoY2RfbmFtZSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgbWVtIHJlZ2lvbi5cbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCWhjZC0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKworCWlmICghaGNkLT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIHJlZ2lzdGVycy5cbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOworCX0KKworCWp6NDc0MF9vaGNpLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ1aGMiKTsKKwlpZiAoSVNfRVJSKGp6NDc0MF9vaGNpLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoano0NzQwX29oY2ktPmNsayk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY2xvY2s6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCWp6NDc0MF9vaGNpLT52YnVzID0gcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAidmJ1cyIpOworCWlmIChJU19FUlIoano0NzQwX29oY2ktPnZidXMpKQorCQlqejQ3NDBfb2hjaS0+dmJ1cyA9IE5VTEw7CisKKworCWNsa19zZXRfcmF0ZShqejQ3NDBfb2hjaS0+Y2xrLCA0ODAwMDAwMCk7CisJY2xrX2VuYWJsZShqejQ3NDBfb2hjaS0+Y2xrKTsKKwlpZiAoano0NzQwX29oY2ktPnZidXMpCisJCW9oY2lfano0NzQwX3NldF92YnVzX3Bvd2VyKGp6NDc0MF9vaGNpLCB0cnVlKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhjZCk7CisKKwlvaGNpX2hjZF9pbml0KGhjZF90b19vaGNpKGhjZCkpOworCisJcmV0ID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBoY2Q6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpZiAoano0NzQwX29oY2ktPnZidXMpIHsKKwkJcmVndWxhdG9yX2Rpc2FibGUoano0NzQwX29oY2ktPnZidXMpOworCQlyZWd1bGF0b3JfcHV0KGp6NDc0MF9vaGNpLT52YnVzKTsKKwl9CisJY2xrX2Rpc2FibGUoano0NzQwX29oY2ktPmNsayk7CisKKwljbGtfcHV0KGp6NDc0MF9vaGNpLT5jbGspOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChoY2QtPnJlZ3MpOworZXJyX3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZXJyX2ZyZWU6CisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IGp6NDc0MF9vaGNpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgano0NzQwX29oY2lfaGNkICpqejQ3NDBfb2hjaSA9IGhjZF90b19qejQ3NDBfaGNkKGhjZCk7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpZiAoano0NzQwX29oY2ktPnZidXMpIHsKKwkJcmVndWxhdG9yX2Rpc2FibGUoano0NzQwX29oY2ktPnZidXMpOworCQlyZWd1bGF0b3JfcHV0KGp6NDc0MF9vaGNpLT52YnVzKTsKKwl9CisKKwljbGtfZGlzYWJsZShqejQ3NDBfb2hjaS0+Y2xrKTsKKwljbGtfcHV0KGp6NDc0MF9vaGNpLT5jbGspOworCisJaW91bm1hcChoY2QtPnJlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvaGNpX2hjZF9qejQ3NDBfZHJpdmVyID0geworCS5wcm9iZSA9IGp6NDc0MF9vaGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChqejQ3NDBfb2hjaV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImp6NDc0MC1vaGNpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK01PRFVMRV9BTElBUygicGxhdGZyb206ano0NzQwLW9oY2kiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYwppbmRleCA1OGNiNzNjLi4wZTEzYTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpAQCAtNDMsOCArNDIsNiBAQAogLyogVkFSSUFCTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbREVWX05BTUVfTEVOXSAgPSAic2w4MTFfY3MiOwotCiB0eXBlZGVmIHN0cnVjdCBsb2NhbF9pbmZvX3QgewogCXN0cnVjdCBwY21jaWFfZGV2aWNlCSpwX2RldjsKIH0gbG9jYWxfaW5mb190OwpAQCAtMTY1LDE2ICsxNjIsMTYgQEAKIAlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKIAogCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwlwX2Rldi0+cmVzb3VyY2VbMF0tPmVuZCA9IHBfZGV2LT5yZXNvdXJjZVsxXS0+ZW5kID0gMDsKIAlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKIAkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKKwkJcF9kZXYtPmlvX2xpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CiAKLQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZmxhZ3MgfD0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+c3RhcnQgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5yZXNvdXJjZVswXS0+ZW5kID0gaW8tPndpblswXS5sZW47CiAKLQkJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwkJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2KTsKIAl9CiAJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHBfZGV2KTsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTE5Miw3ICsxODksNyBAQAogCQlnb3RvIGZhaWxlZDsKIAogCS8qIHJlcXVpcmUgYW4gSVJRIGFuZCB0d28gcmVnaXN0ZXJzICovCi0JaWYgKCFsaW5rLT5pby5OdW1Qb3J0czEgfHwgbGluay0+aW8uTnVtUG9ydHMxIDwgMikKKwlpZiAocmVzb3VyY2Vfc2l6ZShsaW5rLT5yZXNvdXJjZVswXSkgPCAyKQogCQlnb3RvIGZhaWxlZDsKIAogCWlmICghbGluay0+aXJxKQpAQCAtMjA3LDExICsyMDQsMTAgQEAKIAlpZiAobGluay0+Y29uZi5WcHApCiAJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcC8xMCwgbGluay0+Y29uZi5WcHAlMTApOwogCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEpOwotCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAotCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDErbGluay0+aW8uTnVtUG9ydHMxLTEpOworCXByaW50aygiLCBpbyAlcFIiLCBsaW5rLT5yZXNvdXJjZVswXSk7CiAJcHJpbnRrKCJcbiIpOwogCi0JaWYgKHNsODExX2hjX2luaXQocGFyZW50LCBsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlycSkKKwlpZiAoc2w4MTFfaGNfaW5pdChwYXJlbnQsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwgbGluay0+aXJxKQogCQkJPCAwKSB7CiBmYWlsZWQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNsODExX2NzX2NvbmZpZyBmYWlsZWRcbiIpOwpAQCAtMjQ2LDcgKzI0Miw3IEBACiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc2w4MTFfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKLQkJLm5hbWUJPSAoY2hhciAqKWRyaXZlcl9uYW1lLAorCQkubmFtZQk9ICJzbDgxMV9jcyIsCiAJfSwKIAkucHJvYmUJCT0gc2w4MTFfY3NfcHJvYmUsCiAJLnJlbW92ZQkJPSBzbDgxMV9jc19kZXRhY2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBjZGJlOGJmLi5lOGE2NWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogCiAJCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAotCQkvKiBwcml2LT50ZXJtaW9zIGlzIGxlZnQgdW5pbml0YWxpemVkIHVudGlsIHBvcnQgb3BlbmluZyAqLworCQkvKiBwcml2LT50ZXJtaW9zIGlzIGxlZnQgdW5pbml0aWFsaXplZCB1bnRpbCBwb3J0IG9wZW5pbmcgKi8KIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VyaWFsLT5wb3J0W2ldLT53cml0ZV93YWl0KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3d1c2JoYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMKaW5kZXggZWFiODZlNC4uMjA1NGQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMKQEAgLTI2LDcgKzI2LDcgQEAKICAqIHRoZSBvbmUgdGhhdCByZXF1aXJlcyAocGhhc2UgQiwgd3VzYmhjX2Jfe2NyZWF0ZSxkZXN0cm95fSkuCiAgKgogICogVGhpcyBpcyBzbyBiZWNhdXNlIHVzYl9hZGRfaGNkKCkgd2lsbCBzdGFydCB0aGUgSEMsIGFuZCB0aHVzLCBhbGwKLSAqIHRoZSBIQyBzcGVjaWZpYyBzdHVmZiBoYXMgdG8gYmUgYWxyZWFkeSBpbml0aWFsaWF6ZWQgKGxpa2Ugc3lzZnMKKyAqIHRoZSBIQyBzcGVjaWZpYyBzdHVmZiBoYXMgdG8gYmUgYWxyZWFkeSBpbml0aWFsaXplZCAobGlrZSBzeXNmcwogICogdGhpbmdpZXMpLgogICovCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi93bHAvd3NzLWxjLmMgYi9kcml2ZXJzL3V3Yi93bHAvd3NzLWxjLmMKaW5kZXggOTBhY2NkZC4uYTAwNWQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2Ivd2xwL3dzcy1sYy5jCisrKyBiL2RyaXZlcnMvdXdiL3dscC93c3MtbGMuYwpAQCAtMTgwLDcgKzE4MCw3IEBACiAgKiBJZiBtZW1vcnkgd2FzIGFsbG9jYXRlZCBmb3IgdGhlIGtvYmplY3QncyBuYW1lIHRoZW4gaXQgd2lsbAogICogYmUgZnJlZWQgYnkgdGhlIGtvYmplY3Qgc3lzdGVtIGR1cmluZyB0aGlzIHRpbWUuCiAgKgotICogVGhlIEVEQSBjYWNoZSBpcyByZW1vdmVkIGFuZCByZWluaXRpbGl6ZWQgd2hlbiB0aGUgV1NTIGlzIHJlbW92ZWQuIFdlCisgKiBUaGUgRURBIGNhY2hlIGlzIHJlbW92ZWQgYW5kIHJlaW5pdGlhbGl6ZWQgd2hlbiB0aGUgV1NTIGlzIHJlbW92ZWQuIFdlCiAgKiB0aHVzIGxvb3NlIGtub3dsZWRnZSBvZiBtZW1iZXJzIG9mIHRoaXMgV1NTIGF0IHRoYXQgdGltZSBhbmQgbmVlZCBub3QgZG8KICAqIGl0IGhlcmUuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvbmV0LmMgYi9kcml2ZXJzL3Zob3N0L25ldC5jCmluZGV4IGQyMTkwNzAuLjI5ZTg1MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmMKKysrIGIvZHJpdmVycy92aG9zdC9uZXQuYwpAQCAtNzQsNiArNzQsMjIgQEAKIAl9CiAJcmV0dXJuIHNlZzsKIH0KKy8qIENvcHkgaW92ZWMgZW50cmllcyBmb3IgbGVuIGJ5dGVzIGZyb20gaW92ZWMuICovCitzdGF0aWMgdm9pZCBjb3B5X2lvdmVjX2hkcihjb25zdCBzdHJ1Y3QgaW92ZWMgKmZyb20sIHN0cnVjdCBpb3ZlYyAqdG8sCisJCQkgICBzaXplX3QgbGVuLCBpbnQgaW92Y291bnQpCit7CisJaW50IHNlZyA9IDA7CisJc2l6ZV90IHNpemU7CisJd2hpbGUgKGxlbiAmJiBzZWcgPCBpb3Zjb3VudCkgeworCQlzaXplID0gbWluKGZyb20tPmlvdl9sZW4sIGxlbik7CisJCXRvLT5pb3ZfYmFzZSA9IGZyb20tPmlvdl9iYXNlOworCQl0by0+aW92X2xlbiA9IHNpemU7CisJCWxlbiAtPSBzaXplOworCQkrK2Zyb207CisJCSsrdG87CisJCSsrc2VnOworCX0KK30KIAogLyogQ2FsbGVyIG11c3QgaGF2ZSBUWCBWUSBsb2NrICovCiBzdGF0aWMgdm9pZCB0eF9wb2xsX3N0b3Aoc3RydWN0IHZob3N0X25ldCAqbmV0KQpAQCAtMTI5LDcgKzE0NSw3IEBACiAKIAlpZiAod21lbSA8IHNvY2stPnNrLT5za19zbmRidWYgLyAyKQogCQl0eF9wb2xsX3N0b3AobmV0KTsKLQloZHJfc2l6ZSA9IHZxLT5oZHJfc2l6ZTsKKwloZHJfc2l6ZSA9IHZxLT52aG9zdF9obGVuOwogCiAJZm9yICg7OykgewogCQloZWFkID0gdmhvc3RfZ2V0X3ZxX2Rlc2MoJm5ldC0+ZGV2LCB2cSwgdnEtPmlvdiwKQEAgLTE3Miw3ICsxODgsNyBAQAogCQkvKiBUT0RPOiBDaGVjayBzcGVjaWZpYyBlcnJvciBhbmQgYm9tYiBvdXQgdW5sZXNzIEVOT0JVRlM/ICovCiAJCWVyciA9IHNvY2stPm9wcy0+c2VuZG1zZyhOVUxMLCBzb2NrLCAmbXNnLCBsZW4pOwogCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKLQkJCXZob3N0X2Rpc2NhcmRfdnFfZGVzYyh2cSk7CisJCQl2aG9zdF9kaXNjYXJkX3ZxX2Rlc2ModnEsIDEpOwogCQkJdHhfcG9sbF9zdGFydChuZXQsIHNvY2spOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE5MSw5ICsyMDcsODIgQEAKIAl1bnVzZV9tbShuZXQtPmRldi5tbSk7CiB9CiAKK3N0YXRpYyBpbnQgcGVla19oZWFkX2xlbihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CisJaW50IGxlbiA9IDA7CisKKwlsb2NrX3NvY2soc2spOworCWhlYWQgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCWlmIChoZWFkKQorCQlsZW4gPSBoZWFkLT5sZW47CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gbGVuOworfQorCisvKiBUaGlzIGlzIGEgbXVsdGktYnVmZmVyIHZlcnNpb24gb2Ygdmhvc3RfZ2V0X2Rlc2MsIHRoYXQgd29ya3MgaWYKKyAqCXZxIGhhcyByZWFkIGRlc2NyaXB0b3JzIG9ubHkuCisgKiBAdnEJCS0gdGhlIHJlbGV2YW50IHZpcnRxdWV1ZQorICogQGRhdGFsZW4JLSBkYXRhIGxlbmd0aCB3ZSdsbCBiZSByZWFkaW5nCisgKiBAaW92Y291bnQJLSByZXR1cm5lZCBjb3VudCBvZiBpbyB2ZWN0b3JzIHdlIGZpbGwKKyAqIEBsb2cJCS0gdmhvc3QgbG9nCisgKiBAbG9nX251bQktIGxvZyBvZmZzZXQKKyAqCXJldHVybnMgbnVtYmVyIG9mIGJ1ZmZlciBoZWFkcyBhbGxvY2F0ZWQsIG5lZ2F0aXZlIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3J4X2J1ZnMoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCisJCSAgICAgICBzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtICpoZWFkcywKKwkJICAgICAgIGludCBkYXRhbGVuLAorCQkgICAgICAgdW5zaWduZWQgKmlvdmNvdW50LAorCQkgICAgICAgc3RydWN0IHZob3N0X2xvZyAqbG9nLAorCQkgICAgICAgdW5zaWduZWQgKmxvZ19udW0pCit7CisJdW5zaWduZWQgaW50IG91dCwgaW47CisJaW50IHNlZyA9IDA7CisJaW50IGhlYWRjb3VudCA9IDA7CisJdW5zaWduZWQgZDsKKwlpbnQgciwgbmxvZ3MgPSAwOworCisJd2hpbGUgKGRhdGFsZW4gPiAwKSB7CisJCWlmICh1bmxpa2VseShoZWFkY291bnQgPj0gVkhPU1RfTkVUX01BWF9TRykpIHsKKwkJCXIgPSAtRU5PQlVGUzsKKwkJCWdvdG8gZXJyOworCQl9CisJCWQgPSB2aG9zdF9nZXRfdnFfZGVzYyh2cS0+ZGV2LCB2cSwgdnEtPmlvdiArIHNlZywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHZxLT5pb3YpIC0gc2VnLCAmb3V0LAorCQkJCSAgICAgICZpbiwgbG9nLCBsb2dfbnVtKTsKKwkJaWYgKGQgPT0gdnEtPm51bSkgeworCQkJciA9IDA7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAodW5saWtlbHkob3V0IHx8IGluIDw9IDApKSB7CisJCQl2cV9lcnIodnEsICJ1bmV4cGVjdGVkIGRlc2NyaXB0b3IgZm9ybWF0IGZvciBSWDogIgorCQkJCSJvdXQgJWQsIGluICVkXG4iLCBvdXQsIGluKTsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKHVubGlrZWx5KGxvZykpIHsKKwkJCW5sb2dzICs9ICpsb2dfbnVtOworCQkJbG9nICs9ICpsb2dfbnVtOworCQl9CisJCWhlYWRzW2hlYWRjb3VudF0uaWQgPSBkOworCQloZWFkc1toZWFkY291bnRdLmxlbiA9IGlvdl9sZW5ndGgodnEtPmlvdiArIHNlZywgaW4pOworCQlkYXRhbGVuIC09IGhlYWRzW2hlYWRjb3VudF0ubGVuOworCQkrK2hlYWRjb3VudDsKKwkJc2VnICs9IGluOworCX0KKwloZWFkc1toZWFkY291bnQgLSAxXS5sZW4gKz0gZGF0YWxlbjsKKwkqaW92Y291bnQgPSBzZWc7CisJaWYgKHVubGlrZWx5KGxvZykpCisJCSpsb2dfbnVtID0gbmxvZ3M7CisJcmV0dXJuIGhlYWRjb3VudDsKK2VycjoKKwl2aG9zdF9kaXNjYXJkX3ZxX2Rlc2ModnEsIGhlYWRjb3VudCk7CisJcmV0dXJuIHI7Cit9CisKIC8qIEV4cGVjdHMgdG8gYmUgYWx3YXlzIHJ1biBmcm9tIHdvcmtxdWV1ZSAtIHdoaWNoIGFjdHMgYXMKICAqIHJlYWQtc2l6ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBvdXIga2luZCBvZiBSQ1UuICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfcngoc3RydWN0IHZob3N0X25ldCAqbmV0KQorc3RhdGljIHZvaWQgaGFuZGxlX3J4X2JpZyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuZXQpCiB7CiAJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSAmbmV0LT5kZXYudnFzW1ZIT1NUX05FVF9WUV9SWF07CiAJdW5zaWduZWQgb3V0LCBpbiwgbG9nLCBzOwpAQCAtMjIzLDcgKzMxMiw3IEBACiAJdXNlX21tKG5ldC0+ZGV2Lm1tKTsKIAltdXRleF9sb2NrKCZ2cS0+bXV0ZXgpOwogCXZob3N0X2Rpc2FibGVfbm90aWZ5KHZxKTsKLQloZHJfc2l6ZSA9IHZxLT5oZHJfc2l6ZTsKKwloZHJfc2l6ZSA9IHZxLT52aG9zdF9obGVuOwogCiAJdnFfbG9nID0gdW5saWtlbHkodmhvc3RfaGFzX2ZlYXR1cmUoJm5ldC0+ZGV2LCBWSE9TVF9GX0xPR19BTEwpKSA/CiAJCXZxLT5sb2cgOiBOVUxMOwpAQCAtMjcwLDE0ICszNTksMTQgQEAKIAkJCQkJIGxlbiwgTVNHX0RPTlRXQUlUIHwgTVNHX1RSVU5DKTsKIAkJLyogVE9ETzogQ2hlY2sgc3BlY2lmaWMgZXJyb3IgYW5kIGJvbWIgb3V0IHVubGVzcyBFQUdBSU4/ICovCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQl2aG9zdF9kaXNjYXJkX3ZxX2Rlc2ModnEpOworCQkJdmhvc3RfZGlzY2FyZF92cV9kZXNjKHZxLCAxKTsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIFRPRE86IFNob3VsZCBjaGVjayBhbmQgaGFuZGxlIGNoZWNrc3VtLiAqLwogCQlpZiAoZXJyID4gbGVuKSB7CiAJCQlwcl9kZWJ1ZygiRGlzY2FyZGVkIHRydW5jYXRlZCByeCBwYWNrZXQ6ICIKIAkJCQkgIiBsZW4gJWQgPiAlemRcbiIsIGVyciwgbGVuKTsKLQkJCXZob3N0X2Rpc2NhcmRfdnFfZGVzYyh2cSk7CisJCQl2aG9zdF9kaXNjYXJkX3ZxX2Rlc2ModnEsIDEpOwogCQkJY29udGludWU7CiAJCX0KIAkJbGVuID0gZXJyOwpAQCAtMzAyLDU0ICszOTEsMTc1IEBACiAJdW51c2VfbW0obmV0LT5kZXYubW0pOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfdHhfa2ljayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisvKiBFeHBlY3RzIHRvIGJlIGFsd2F5cyBydW4gZnJvbSB3b3JrcXVldWUgLSB3aGljaCBhY3RzIGFzCisgKiByZWFkLXNpemUgY3JpdGljYWwgc2VjdGlvbiBmb3Igb3VyIGtpbmQgb2YgUkNVLiAqLworc3RhdGljIHZvaWQgaGFuZGxlX3J4X21lcmdlYWJsZShzdHJ1Y3Qgdmhvc3RfbmV0ICpuZXQpCiB7Ci0Jc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnE7Ci0Jc3RydWN0IHZob3N0X25ldCAqbmV0OwotCXZxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUsIHBvbGwud29yayk7Ci0JbmV0ID0gY29udGFpbmVyX29mKHZxLT5kZXYsIHN0cnVjdCB2aG9zdF9uZXQsIGRldik7CisJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSAmbmV0LT5kZXYudnFzW1ZIT1NUX05FVF9WUV9SWF07CisJdW5zaWduZWQgdW5pbml0aWFsaXplZF92YXIoaW4pLCBsb2c7CisJc3RydWN0IHZob3N0X2xvZyAqdnFfbG9nOworCXN0cnVjdCBtc2doZHIgbXNnID0geworCQkubXNnX25hbWUgPSBOVUxMLAorCQkubXNnX25hbWVsZW4gPSAwLAorCQkubXNnX2NvbnRyb2wgPSBOVUxMLCAvKiBGSVhNRTogZ2V0IGFuZCBoYW5kbGUgUlggYXV4IGRhdGEuICovCisJCS5tc2dfY29udHJvbGxlbiA9IDAsCisJCS5tc2dfaW92ID0gdnEtPmlvdiwKKwkJLm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCwKKwl9OworCisJc3RydWN0IHZpcnRpb19uZXRfaGRyX21yZ19yeGJ1ZiBoZHIgPSB7CisJCS5oZHIuZmxhZ3MgPSAwLAorCQkuaGRyLmdzb190eXBlID0gVklSVElPX05FVF9IRFJfR1NPX05PTkUKKwl9OworCisJc2l6ZV90IHRvdGFsX2xlbiA9IDA7CisJaW50IGVyciwgaGVhZGNvdW50OworCXNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW47CisJc2l6ZV90IHZob3N0X2xlbiwgc29ja19sZW47CisJc3RydWN0IHNvY2tldCAqc29jayA9IHJjdV9kZXJlZmVyZW5jZSh2cS0+cHJpdmF0ZV9kYXRhKTsKKwlpZiAoIXNvY2sgfHwgc2tiX3F1ZXVlX2VtcHR5KCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCisJCXJldHVybjsKKworCXVzZV9tbShuZXQtPmRldi5tbSk7CisJbXV0ZXhfbG9jaygmdnEtPm11dGV4KTsKKwl2aG9zdF9kaXNhYmxlX25vdGlmeSh2cSk7CisJdmhvc3RfaGxlbiA9IHZxLT52aG9zdF9obGVuOworCXNvY2tfaGxlbiA9IHZxLT5zb2NrX2hsZW47CisKKwl2cV9sb2cgPSB1bmxpa2VseSh2aG9zdF9oYXNfZmVhdHVyZSgmbmV0LT5kZXYsIFZIT1NUX0ZfTE9HX0FMTCkpID8KKwkJdnEtPmxvZyA6IE5VTEw7CisKKwl3aGlsZSAoKHNvY2tfbGVuID0gcGVla19oZWFkX2xlbihzb2NrLT5zaykpKSB7CisJCXNvY2tfbGVuICs9IHNvY2tfaGxlbjsKKwkJdmhvc3RfbGVuID0gc29ja19sZW4gKyB2aG9zdF9obGVuOworCQloZWFkY291bnQgPSBnZXRfcnhfYnVmcyh2cSwgdnEtPmhlYWRzLCB2aG9zdF9sZW4sCisJCQkJCSZpbiwgdnFfbG9nLCAmbG9nKTsKKwkJLyogT24gZXJyb3IsIHN0b3AgaGFuZGxpbmcgdW50aWwgdGhlIG5leHQga2ljay4gKi8KKwkJaWYgKHVubGlrZWx5KGhlYWRjb3VudCA8IDApKQorCQkJYnJlYWs7CisJCS8qIE9LLCBub3cgd2UgbmVlZCB0byBrbm93IGFib3V0IGFkZGVkIGRlc2NyaXB0b3JzLiAqLworCQlpZiAoIWhlYWRjb3VudCkgeworCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkodnEpKSkgeworCQkJCS8qIFRoZXkgaGF2ZSBzbGlwcGVkIG9uZSBpbiBhcyB3ZSB3ZXJlCisJCQkJICogZG9pbmcgdGhhdDogY2hlY2sgYWdhaW4uICovCisJCQkJdmhvc3RfZGlzYWJsZV9ub3RpZnkodnEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogTm90aGluZyBuZXc/ICBXYWl0IGZvciBldmVudGZkIHRvIHRlbGwgdXMKKwkJCSAqIHRoZXkgcmVmaWxsZWQuICovCisJCQlicmVhazsKKwkJfQorCQkvKiBXZSBkb24ndCBuZWVkIHRvIGJlIG5vdGlmaWVkIGFnYWluLiAqLworCQlpZiAodW5saWtlbHkoKHZob3N0X2hsZW4pKSkKKwkJCS8qIFNraXAgaGVhZGVyLiBUT0RPOiBzdXBwb3J0IFRTTy4gKi8KKwkJCW1vdmVfaW92ZWNfaGRyKHZxLT5pb3YsIHZxLT5oZHIsIHZob3N0X2hsZW4sIGluKTsKKwkJZWxzZQorCQkJLyogQ29weSB0aGUgaGVhZGVyIGZvciB1c2UgaW4gVklSVElPX05FVF9GX01SR19SWEJVRjoKKwkJCSAqIG5lZWRlZCBiZWNhdXNlIHNlbmRtc2cgY2FuIG1vZGlmeSBtc2dfaW92LiAqLworCQkJY29weV9pb3ZlY19oZHIodnEtPmlvdiwgdnEtPmhkciwgc29ja19obGVuLCBpbik7CisJCW1zZy5tc2dfaW92bGVuID0gaW47CisJCWVyciA9IHNvY2stPm9wcy0+cmVjdm1zZyhOVUxMLCBzb2NrLCAmbXNnLAorCQkJCQkgc29ja19sZW4sIE1TR19ET05UV0FJVCB8IE1TR19UUlVOQyk7CisJCS8qIFVzZXJzcGFjZSBtaWdodCBoYXZlIGNvbnN1bWVkIHRoZSBwYWNrZXQgbWVhbndoaWxlOgorCQkgKiBpdCdzIG5vdCBzdXBwb3NlZCB0byBkbyB0aGlzIHVzdWFsbHksIGJ1dCBtaWdodCBiZSBoYXJkCisJCSAqIHRvIHByZXZlbnQuIERpc2NhcmQgZGF0YSB3ZSBnb3QgKGlmIGFueSkgYW5kIGtlZXAgZ29pbmcuICovCisJCWlmICh1bmxpa2VseShlcnIgIT0gc29ja19sZW4pKSB7CisJCQlwcl9kZWJ1ZygiRGlzY2FyZGVkIHJ4IHBhY2tldDogIgorCQkJCSAiIGxlbiAlZCwgZXhwZWN0ZWQgJXpkXG4iLCBlcnIsIHNvY2tfbGVuKTsKKwkJCXZob3N0X2Rpc2NhcmRfdnFfZGVzYyh2cSwgaGVhZGNvdW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh1bmxpa2VseSh2aG9zdF9obGVuKSAmJgorCQkgICAgbWVtY3B5X3RvaW92ZWNlbmQodnEtPmhkciwgKHVuc2lnbmVkIGNoYXIgKikmaGRyLCAwLAorCQkJCSAgICAgIHZob3N0X2hsZW4pKSB7CisJCQl2cV9lcnIodnEsICJVbmFibGUgdG8gd3JpdGUgdm5ldF9oZHIgYXQgYWRkciAlcFxuIiwKKwkJCSAgICAgICB2cS0+aW92LT5pb3ZfYmFzZSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBUT0RPOiBTaG91bGQgY2hlY2sgYW5kIGhhbmRsZSBjaGVja3N1bS4gKi8KKwkJaWYgKHZob3N0X2hhc19mZWF0dXJlKCZuZXQtPmRldiwgVklSVElPX05FVF9GX01SR19SWEJVRikgJiYKKwkJICAgIG1lbWNweV90b2lvdmVjZW5kKHZxLT5oZHIsICh1bnNpZ25lZCBjaGFyICopJmhlYWRjb3VudCwKKwkJCQkgICAgICBvZmZzZXRvZih0eXBlb2YoaGRyKSwgbnVtX2J1ZmZlcnMpLAorCQkJCSAgICAgIHNpemVvZiBoZHIubnVtX2J1ZmZlcnMpKSB7CisJCQl2cV9lcnIodnEsICJGYWlsZWQgbnVtX2J1ZmZlcnMgd3JpdGUiKTsKKwkJCXZob3N0X2Rpc2NhcmRfdnFfZGVzYyh2cSwgaGVhZGNvdW50KTsKKwkJCWJyZWFrOworCQl9CisJCXZob3N0X2FkZF91c2VkX2FuZF9zaWduYWxfbigmbmV0LT5kZXYsIHZxLCB2cS0+aGVhZHMsCisJCQkJCSAgICBoZWFkY291bnQpOworCQlpZiAodW5saWtlbHkodnFfbG9nKSkKKwkJCXZob3N0X2xvZ193cml0ZSh2cSwgdnFfbG9nLCBsb2csIHZob3N0X2xlbik7CisJCXRvdGFsX2xlbiArPSB2aG9zdF9sZW47CisJCWlmICh1bmxpa2VseSh0b3RhbF9sZW4gPj0gVkhPU1RfTkVUX1dFSUdIVCkpIHsKKwkJCXZob3N0X3BvbGxfcXVldWUoJnZxLT5wb2xsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ2cS0+bXV0ZXgpOworCXVudXNlX21tKG5ldC0+ZGV2Lm1tKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3J4KHN0cnVjdCB2aG9zdF9uZXQgKm5ldCkKK3sKKwlpZiAodmhvc3RfaGFzX2ZlYXR1cmUoJm5ldC0+ZGV2LCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSkKKwkJaGFuZGxlX3J4X21lcmdlYWJsZShuZXQpOworCWVsc2UKKwkJaGFuZGxlX3J4X2JpZyhuZXQpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfdHhfa2ljayhzdHJ1Y3Qgdmhvc3Rfd29yayAqd29yaykKK3sKKwlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlLAorCQkJCQkJICBwb2xsLndvcmspOworCXN0cnVjdCB2aG9zdF9uZXQgKm5ldCA9IGNvbnRhaW5lcl9vZih2cS0+ZGV2LCBzdHJ1Y3Qgdmhvc3RfbmV0LCBkZXYpOworCiAJaGFuZGxlX3R4KG5ldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9yeF9raWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGhhbmRsZV9yeF9raWNrKHN0cnVjdCB2aG9zdF93b3JrICp3b3JrKQogewotCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxOwotCXN0cnVjdCB2aG9zdF9uZXQgKm5ldDsKLQl2cSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlLCBwb2xsLndvcmspOwotCW5ldCA9IGNvbnRhaW5lcl9vZih2cS0+ZGV2LCBzdHJ1Y3Qgdmhvc3RfbmV0LCBkZXYpOworCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUsCisJCQkJCQkgIHBvbGwud29yayk7CisJc3RydWN0IHZob3N0X25ldCAqbmV0ID0gY29udGFpbmVyX29mKHZxLT5kZXYsIHN0cnVjdCB2aG9zdF9uZXQsIGRldik7CisKIAloYW5kbGVfcngobmV0KTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlX3R4X25ldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBoYW5kbGVfdHhfbmV0KHN0cnVjdCB2aG9zdF93b3JrICp3b3JrKQogewotCXN0cnVjdCB2aG9zdF9uZXQgKm5ldDsKLQluZXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZob3N0X25ldCwgcG9sbFtWSE9TVF9ORVRfVlFfVFhdLndvcmspOworCXN0cnVjdCB2aG9zdF9uZXQgKm5ldCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdmhvc3RfbmV0LAorCQkJCQkgICAgIHBvbGxbVkhPU1RfTkVUX1ZRX1RYXS53b3JrKTsKIAloYW5kbGVfdHgobmV0KTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlX3J4X25ldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBoYW5kbGVfcnhfbmV0KHN0cnVjdCB2aG9zdF93b3JrICp3b3JrKQogewotCXN0cnVjdCB2aG9zdF9uZXQgKm5ldDsKLQluZXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZob3N0X25ldCwgcG9sbFtWSE9TVF9ORVRfVlFfUlhdLndvcmspOworCXN0cnVjdCB2aG9zdF9uZXQgKm5ldCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdmhvc3RfbmV0LAorCQkJCQkgICAgIHBvbGxbVkhPU1RfTkVUX1ZRX1JYXS53b3JrKTsKIAloYW5kbGVfcngobmV0KTsKIH0KIAogc3RhdGljIGludCB2aG9zdF9uZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKIHsKIAlzdHJ1Y3Qgdmhvc3RfbmV0ICpuID0ga21hbGxvYyhzaXplb2YgKm4sIEdGUF9LRVJORUwpOworCXN0cnVjdCB2aG9zdF9kZXYgKmRldjsKIAlpbnQgcjsKKwogCWlmICghbikKIAkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYgPSAmbi0+ZGV2OwogCW4tPnZxc1tWSE9TVF9ORVRfVlFfVFhdLmhhbmRsZV9raWNrID0gaGFuZGxlX3R4X2tpY2s7CiAJbi0+dnFzW1ZIT1NUX05FVF9WUV9SWF0uaGFuZGxlX2tpY2sgPSBoYW5kbGVfcnhfa2ljazsKLQlyID0gdmhvc3RfZGV2X2luaXQoJm4tPmRldiwgbi0+dnFzLCBWSE9TVF9ORVRfVlFfTUFYKTsKKwlyID0gdmhvc3RfZGV2X2luaXQoZGV2LCBuLT52cXMsIFZIT1NUX05FVF9WUV9NQVgpOwogCWlmIChyIDwgMCkgewogCQlrZnJlZShuKTsKIAkJcmV0dXJuIHI7CiAJfQogCi0Jdmhvc3RfcG9sbF9pbml0KG4tPnBvbGwgKyBWSE9TVF9ORVRfVlFfVFgsIGhhbmRsZV90eF9uZXQsIFBPTExPVVQpOwotCXZob3N0X3BvbGxfaW5pdChuLT5wb2xsICsgVkhPU1RfTkVUX1ZRX1JYLCBoYW5kbGVfcnhfbmV0LCBQT0xMSU4pOworCXZob3N0X3BvbGxfaW5pdChuLT5wb2xsICsgVkhPU1RfTkVUX1ZRX1RYLCBoYW5kbGVfdHhfbmV0LCBQT0xMT1VULCBkZXYpOworCXZob3N0X3BvbGxfaW5pdChuLT5wb2xsICsgVkhPU1RfTkVUX1ZRX1JYLCBoYW5kbGVfcnhfbmV0LCBQT0xMSU4sIGRldik7CiAJbi0+dHhfcG9sbF9zdGF0ZSA9IFZIT1NUX05FVF9QT0xMX0RJU0FCTEVEOwogCiAJZi0+cHJpdmF0ZV9kYXRhID0gbjsKQEAgLTUyNywxMyArNzM3LDEyIEBACiAKIAkvKiBzdGFydCBwb2xsaW5nIG5ldyBzb2NrZXQgKi8KIAlvbGRzb2NrID0gdnEtPnByaXZhdGVfZGF0YTsKLQlpZiAoc29jayA9PSBvbGRzb2NrKQotCQlnb3RvIGRvbmU7CisJaWYgKHNvY2sgIT0gb2xkc29jaykgeworICAgICAgICAgICAgICAgIHZob3N0X25ldF9kaXNhYmxlX3ZxKG4sIHZxKTsKKyAgICAgICAgICAgICAgICByY3VfYXNzaWduX3BvaW50ZXIodnEtPnByaXZhdGVfZGF0YSwgc29jayk7CisgICAgICAgICAgICAgICAgdmhvc3RfbmV0X2VuYWJsZV92cShuLCB2cSk7CisJfQogCi0Jdmhvc3RfbmV0X2Rpc2FibGVfdnEobiwgdnEpOwotCXJjdV9hc3NpZ25fcG9pbnRlcih2cS0+cHJpdmF0ZV9kYXRhLCBzb2NrKTsKLQl2aG9zdF9uZXRfZW5hYmxlX3ZxKG4sIHZxKTsKLWRvbmU6CiAJbXV0ZXhfdW5sb2NrKCZ2cS0+bXV0ZXgpOwogCiAJaWYgKG9sZHNvY2spIHsKQEAgLTU3NCw5ICs3ODMsMjEgQEAKIAogc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIHU2NCBmZWF0dXJlcykKIHsKLQlzaXplX3QgaGRyX3NpemUgPSBmZWF0dXJlcyAmICgxIDw8IFZIT1NUX05FVF9GX1ZJUlRJT19ORVRfSERSKSA/Ci0JCXNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpIDogMDsKKwlzaXplX3Qgdmhvc3RfaGxlbiwgc29ja19obGVuLCBoZHJfbGVuOwogCWludCBpOworCisJaGRyX2xlbiA9IChmZWF0dXJlcyAmICgxIDw8IFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpKSA/CisJCQlzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyX21yZ19yeGJ1ZikgOgorCQkJc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7CisJaWYgKGZlYXR1cmVzICYgKDEgPDwgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7CisJCS8qIHZob3N0IHByb3ZpZGVzIHZuZXRfaGRyICovCisJCXZob3N0X2hsZW4gPSBoZHJfbGVuOworCQlzb2NrX2hsZW4gPSAwOworCX0gZWxzZSB7CisJCS8qIHNvY2tldCBwcm92aWRlcyB2bmV0X2hkciAqLworCQl2aG9zdF9obGVuID0gMDsKKwkJc29ja19obGVuID0gaGRyX2xlbjsKKwl9CiAJbXV0ZXhfbG9jaygmbi0+ZGV2Lm11dGV4KTsKIAlpZiAoKGZlYXR1cmVzICYgKDEgPDwgVkhPU1RfRl9MT0dfQUxMKSkgJiYKIAkgICAgIXZob3N0X2xvZ19hY2Nlc3Nfb2soJm4tPmRldikpIHsKQEAgLTU4Nyw3ICs4MDgsOCBAQAogCXNtcF93bWIoKTsKIAlmb3IgKGkgPSAwOyBpIDwgVkhPU1RfTkVUX1ZRX01BWDsgKytpKSB7CiAJCW11dGV4X2xvY2soJm4tPnZxc1tpXS5tdXRleCk7Ci0JCW4tPnZxc1tpXS5oZHJfc2l6ZSA9IGhkcl9zaXplOworCQluLT52cXNbaV0udmhvc3RfaGxlbiA9IHZob3N0X2hsZW47CisJCW4tPnZxc1tpXS5zb2NrX2hsZW4gPSBzb2NrX2hsZW47CiAJCW11dGV4X3VubG9jaygmbi0+dnFzW2ldLm11dGV4KTsKIAl9CiAJdmhvc3RfbmV0X2ZsdXNoKG4pOwpAQCAtNjM5LDcgKzg2MSw3IEBACiB9CiAjZW5kaWYKIAotY29uc3Qgc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmhvc3RfbmV0X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aG9zdF9uZXRfZm9wcyA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkucmVsZWFzZSAgICAgICAgPSB2aG9zdF9uZXRfcmVsZWFzZSwKIAkudW5sb2NrZWRfaW9jdGwgPSB2aG9zdF9uZXRfaW9jdGwsCkBAIC02NTcsMjUgKzg3OSwxMyBAQAogCiBzdGF0aWMgaW50IHZob3N0X25ldF9pbml0KHZvaWQpCiB7Ci0JaW50IHIgPSB2aG9zdF9pbml0KCk7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyX2luaXQ7Ci0JciA9IG1pc2NfcmVnaXN0ZXIoJnZob3N0X25ldF9taXNjKTsKLQlpZiAocikKLQkJZ290byBlcnJfcmVnOwotCXJldHVybiAwOwotZXJyX3JlZzoKLQl2aG9zdF9jbGVhbnVwKCk7Ci1lcnJfaW5pdDoKLQlyZXR1cm4gcjsKLQorCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZ2aG9zdF9uZXRfbWlzYyk7CiB9CiBtb2R1bGVfaW5pdCh2aG9zdF9uZXRfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIHZob3N0X25ldF9leGl0KHZvaWQpCiB7CiAJbWlzY19kZXJlZ2lzdGVyKCZ2aG9zdF9uZXRfbWlzYyk7Ci0Jdmhvc3RfY2xlYW51cCgpOwogfQogbW9kdWxlX2V4aXQodmhvc3RfbmV0X2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKaW5kZXggMGI5OTc4My4uZTA1NTU3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5jCisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwpAQCAtMTcsMTIgKzE3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KQEAgLTM3LDggKzM4LDYgQEAKIAlWSE9TVF9NRU1PUllfRl9MT0cgPSAweDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnZob3N0X3dvcmtxdWV1ZTsKLQogc3RhdGljIHZvaWQgdmhvc3RfcG9sbF9mdW5jKHN0cnVjdCBmaWxlICpmaWxlLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoLAogCQkJICAgIHBvbGxfdGFibGUgKnB0KQogewpAQCAtNTIsMjMgKzUxLDMxIEBACiBzdGF0aWMgaW50IHZob3N0X3BvbGxfd2FrZXVwKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsCiAJCQkgICAgIHZvaWQgKmtleSkKIHsKLQlzdHJ1Y3Qgdmhvc3RfcG9sbCAqcG9sbDsKLQlwb2xsID0gY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCB2aG9zdF9wb2xsLCB3YWl0KTsKKwlzdHJ1Y3Qgdmhvc3RfcG9sbCAqcG9sbCA9IGNvbnRhaW5lcl9vZih3YWl0LCBzdHJ1Y3Qgdmhvc3RfcG9sbCwgd2FpdCk7CisKIAlpZiAoISgodW5zaWduZWQgbG9uZylrZXkgJiBwb2xsLT5tYXNrKSkKIAkJcmV0dXJuIDA7CiAKLQlxdWV1ZV93b3JrKHZob3N0X3dvcmtxdWV1ZSwgJnBvbGwtPndvcmspOworCXZob3N0X3BvbGxfcXVldWUocG9sbCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIEluaXQgcG9sbCBzdHJ1Y3R1cmUgKi8KLXZvaWQgdmhvc3RfcG9sbF9pbml0KHN0cnVjdCB2aG9zdF9wb2xsICpwb2xsLCB3b3JrX2Z1bmNfdCBmdW5jLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgbWFzaykKK3ZvaWQgdmhvc3RfcG9sbF9pbml0KHN0cnVjdCB2aG9zdF9wb2xsICpwb2xsLCB2aG9zdF93b3JrX2ZuX3QgZm4sCisJCSAgICAgdW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYpCiB7Ci0JSU5JVF9XT1JLKCZwb2xsLT53b3JrLCBmdW5jKTsKKwlzdHJ1Y3Qgdmhvc3Rfd29yayAqd29yayA9ICZwb2xsLT53b3JrOworCiAJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmcG9sbC0+d2FpdCwgdmhvc3RfcG9sbF93YWtldXApOwogCWluaXRfcG9sbF9mdW5jcHRyKCZwb2xsLT50YWJsZSwgdmhvc3RfcG9sbF9mdW5jKTsKIAlwb2xsLT5tYXNrID0gbWFzazsKKwlwb2xsLT5kZXYgPSBkZXY7CisKKwlJTklUX0xJU1RfSEVBRCgmd29yay0+bm9kZSk7CisJd29yay0+Zm4gPSBmbjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3b3JrLT5kb25lKTsKKwl3b3JrLT5mbHVzaGluZyA9IDA7CisJd29yay0+cXVldWVfc2VxID0gd29yay0+ZG9uZV9zZXEgPSAwOwogfQogCiAvKiBTdGFydCBwb2xsaW5nIGEgZmlsZS4gV2UgYWRkIG91cnNlbHZlcyB0byBmaWxlJ3Mgd2FpdCBxdWV1ZS4gVGhlIGNhbGxlciBtdXN0CkBAIC05MiwxMiArOTksNDAgQEAKICAqIGxvY2tzIHRoYXQgYXJlIGFsc28gdXNlZCBieSB0aGUgY2FsbGJhY2suICovCiB2b2lkIHZob3N0X3BvbGxfZmx1c2goc3RydWN0IHZob3N0X3BvbGwgKnBvbGwpCiB7Ci0JZmx1c2hfd29yaygmcG9sbC0+d29yayk7CisJc3RydWN0IHZob3N0X3dvcmsgKndvcmsgPSAmcG9sbC0+d29yazsKKwl1bnNpZ25lZCBzZXE7CisJaW50IGxlZnQ7CisJaW50IGZsdXNoaW5nOworCisJc3Bpbl9sb2NrX2lycSgmcG9sbC0+ZGV2LT53b3JrX2xvY2spOworCXNlcSA9IHdvcmstPnF1ZXVlX3NlcTsKKwl3b3JrLT5mbHVzaGluZysrOworCXNwaW5fdW5sb2NrX2lycSgmcG9sbC0+ZGV2LT53b3JrX2xvY2spOworCXdhaXRfZXZlbnQod29yay0+ZG9uZSwgKHsKKwkJICAgc3Bpbl9sb2NrX2lycSgmcG9sbC0+ZGV2LT53b3JrX2xvY2spOworCQkgICBsZWZ0ID0gc2VxIC0gd29yay0+ZG9uZV9zZXEgPD0gMDsKKwkJICAgc3Bpbl91bmxvY2tfaXJxKCZwb2xsLT5kZXYtPndvcmtfbG9jayk7CisJCSAgIGxlZnQ7CisJfSkpOworCXNwaW5fbG9ja19pcnEoJnBvbGwtPmRldi0+d29ya19sb2NrKTsKKwlmbHVzaGluZyA9IC0td29yay0+Zmx1c2hpbmc7CisJc3Bpbl91bmxvY2tfaXJxKCZwb2xsLT5kZXYtPndvcmtfbG9jayk7CisJQlVHX09OKGZsdXNoaW5nIDwgMCk7CiB9CiAKIHZvaWQgdmhvc3RfcG9sbF9xdWV1ZShzdHJ1Y3Qgdmhvc3RfcG9sbCAqcG9sbCkKIHsKLQlxdWV1ZV93b3JrKHZob3N0X3dvcmtxdWV1ZSwgJnBvbGwtPndvcmspOworCXN0cnVjdCB2aG9zdF9kZXYgKmRldiA9IHBvbGwtPmRldjsKKwlzdHJ1Y3Qgdmhvc3Rfd29yayAqd29yayA9ICZwb2xsLT53b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT53b3JrX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmd29yay0+bm9kZSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmd29yay0+bm9kZSwgJmRldi0+d29ya19saXN0KTsKKwkJd29yay0+cXVldWVfc2VxKys7CisJCXdha2VfdXBfcHJvY2VzcyhkZXYtPndvcmtlcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+d29ya19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHZob3N0X3ZxX3Jlc2V0KHN0cnVjdCB2aG9zdF9kZXYgKmRldiwKQEAgLTExNCw3ICsxNDksOCBAQAogCXZxLT51c2VkX2ZsYWdzID0gMDsKIAl2cS0+bG9nX3VzZWQgPSBmYWxzZTsKIAl2cS0+bG9nX2FkZHIgPSAtMXVsbDsKLQl2cS0+aGRyX3NpemUgPSAwOworCXZxLT52aG9zdF9obGVuID0gMDsKKwl2cS0+c29ja19obGVuID0gMDsKIAl2cS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAl2cS0+bG9nX2Jhc2UgPSBOVUxMOwogCXZxLT5lcnJvcl9jdHggPSBOVUxMOwpAQCAtMTI1LDEwICsxNjEsNTEgQEAKIAl2cS0+bG9nX2N0eCA9IE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgdmhvc3Rfd29ya2VyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHZob3N0X2RldiAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3Qgdmhvc3Rfd29yayAqd29yayA9IE5VTEw7CisJdW5zaWduZWQgdW5pbml0aWFsaXplZF92YXIoc2VxKTsKKworCWZvciAoOzspIHsKKwkJLyogbWIgcGFpcmVkIHcvIGt0aHJlYWRfc3RvcCAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCXNwaW5fbG9ja19pcnEoJmRldi0+d29ya19sb2NrKTsKKwkJaWYgKHdvcmspIHsKKwkJCXdvcmstPmRvbmVfc2VxID0gc2VxOworCQkJaWYgKHdvcmstPmZsdXNoaW5nKQorCQkJCXdha2VfdXBfYWxsKCZ3b3JrLT5kb25lKTsKKwkJfQorCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT53b3JrX2xvY2spOworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPndvcmtfbGlzdCkpIHsKKwkJCXdvcmsgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXYtPndvcmtfbGlzdCwKKwkJCQkJCXN0cnVjdCB2aG9zdF93b3JrLCBub2RlKTsKKwkJCWxpc3RfZGVsX2luaXQoJndvcmstPm5vZGUpOworCQkJc2VxID0gd29yay0+cXVldWVfc2VxOworCQl9IGVsc2UKKwkJCXdvcmsgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnEoJmRldi0+d29ya19sb2NrKTsKKworCQlpZiAod29yaykgeworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJd29yay0+Zm4od29yayk7CisJCX0gZWxzZQorCQkJc2NoZWR1bGUoKTsKKworCX0KK30KKwogbG9uZyB2aG9zdF9kZXZfaW5pdChzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsCiAJCSAgICBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cXMsIGludCBudnFzKQogewogCWludCBpOworCiAJZGV2LT52cXMgPSB2cXM7CiAJZGV2LT5udnFzID0gbnZxczsKIAltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKQEAgLTEzNiw2ICsyMTMsOSBAQAogCWRldi0+bG9nX2ZpbGUgPSBOVUxMOwogCWRldi0+bWVtb3J5ID0gTlVMTDsKIAlkZXYtPm1tID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT53b3JrX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPndvcmtfbGlzdCk7CisJZGV2LT53b3JrZXIgPSBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bnZxczsgKytpKSB7CiAJCWRldi0+dnFzW2ldLmRldiA9IGRldjsKQEAgLTE0Myw5ICsyMjMsOSBAQAogCQl2aG9zdF92cV9yZXNldChkZXYsIGRldi0+dnFzICsgaSk7CiAJCWlmIChkZXYtPnZxc1tpXS5oYW5kbGVfa2ljaykKIAkJCXZob3N0X3BvbGxfaW5pdCgmZGV2LT52cXNbaV0ucG9sbCwKLQkJCQkJZGV2LT52cXNbaV0uaGFuZGxlX2tpY2ssCi0JCQkJCVBPTExJTik7CisJCQkJCWRldi0+dnFzW2ldLmhhbmRsZV9raWNrLCBQT0xMSU4sIGRldik7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OSwxMiArMjM5LDM2IEBACiAvKiBDYWxsZXIgc2hvdWxkIGhhdmUgZGV2aWNlIG11dGV4ICovCiBzdGF0aWMgbG9uZyB2aG9zdF9kZXZfc2V0X293bmVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldikKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndvcmtlcjsKKwlpbnQgZXJyOwogCS8qIElzIHRoZXJlIGFuIG93bmVyIGFscmVhZHk/ICovCi0JaWYgKGRldi0+bW0pCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKGRldi0+bW0pIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl9tbTsKKwl9CiAJLyogTm8gb3duZXIsIGJlY29tZSBvbmUgKi8KIAlkZXYtPm1tID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CisJd29ya2VyID0ga3RocmVhZF9jcmVhdGUodmhvc3Rfd29ya2VyLCBkZXYsICJ2aG9zdC0lZCIsIGN1cnJlbnQtPnBpZCk7CisJaWYgKElTX0VSUih3b3JrZXIpKSB7CisJCWVyciA9IFBUUl9FUlIod29ya2VyKTsKKwkJZ290byBlcnJfd29ya2VyOworCX0KKworCWRldi0+d29ya2VyID0gd29ya2VyOworCWVyciA9IGNncm91cF9hdHRhY2hfdGFza19jdXJyZW50X2NnKHdvcmtlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJfY2dyb3VwOworCXdha2VfdXBfcHJvY2Vzcyh3b3JrZXIpOwkvKiBhdm9pZCBjb250cmlidXRpbmcgdG8gbG9hZGF2ZyAqLworCiAJcmV0dXJuIDA7CitlcnJfY2dyb3VwOgorCWt0aHJlYWRfc3RvcCh3b3JrZXIpOworZXJyX3dvcmtlcjoKKwlpZiAoZGV2LT5tbSkKKwkJbW1wdXQoZGV2LT5tbSk7CisJZGV2LT5tbSA9IE5VTEw7CitlcnJfbW06CisJcmV0dXJuIGVycjsKIH0KIAogLyogQ2FsbGVyIHNob3VsZCBoYXZlIGRldmljZSBtdXRleCAqLwpAQCAtMjE3LDYgKzMyMSw5IEBACiAJaWYgKGRldi0+bW0pCiAJCW1tcHV0KGRldi0+bW0pOwogCWRldi0+bW0gPSBOVUxMOworCisJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2LT53b3JrX2xpc3QpKTsKKwlrdGhyZWFkX3N0b3AoZGV2LT53b3JrZXIpOwogfQogCiBzdGF0aWMgaW50IGxvZ19hY2Nlc3Nfb2sodm9pZCBfX3VzZXIgKmxvZ19iYXNlLCB1NjQgYWRkciwgdW5zaWduZWQgbG9uZyBzeikKQEAgLTIzNyw4ICszNDQsOCBAQAogewogCWludCBpOwogCi0gICAgICAgIGlmICghbWVtKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworCWlmICghbWVtKQorCQlyZXR1cm4gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBtZW0tPm5yZWdpb25zOyArK2kpIHsKIAkJc3RydWN0IHZob3N0X21lbW9yeV9yZWdpb24gKm0gPSBtZW0tPnJlZ2lvbnMgKyBpOwpAQCAtOTk1LDkgKzExMDIsOSBAQAogfQogCiAvKiBSZXZlcnNlIHRoZSBlZmZlY3Qgb2Ygdmhvc3RfZ2V0X3ZxX2Rlc2MuIFVzZWZ1bCBmb3IgZXJyb3IgaGFuZGxpbmcuICovCi12b2lkIHZob3N0X2Rpc2NhcmRfdnFfZGVzYyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKK3ZvaWQgdmhvc3RfZGlzY2FyZF92cV9kZXNjKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBpbnQgbikKIHsKLQl2cS0+bGFzdF9hdmFpbF9pZHgtLTsKKwl2cS0+bGFzdF9hdmFpbF9pZHggLT0gbjsKIH0KIAogLyogQWZ0ZXIgd2UndmUgdXNlZCBvbmUgb2YgdGhlaXIgYnVmZmVycywgd2UgdGVsbCB0aGVtIGFib3V0IGl0LiAgV2UnbGwgdGhlbgpAQCAtMTA0Miw2ICsxMTQ5LDY3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX192aG9zdF9hZGRfdXNlZF9uKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLAorCQkJICAgIHN0cnVjdCB2cmluZ191c2VkX2VsZW0gKmhlYWRzLAorCQkJICAgIHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCB2cmluZ191c2VkX2VsZW0gX191c2VyICp1c2VkOworCWludCBzdGFydDsKKworCXN0YXJ0ID0gdnEtPmxhc3RfdXNlZF9pZHggJSB2cS0+bnVtOworCXVzZWQgPSB2cS0+dXNlZC0+cmluZyArIHN0YXJ0OworCWlmIChjb3B5X3RvX3VzZXIodXNlZCwgaGVhZHMsIGNvdW50ICogc2l6ZW9mICp1c2VkKSkgeworCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gd3JpdGUgdXNlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKHVubGlrZWx5KHZxLT5sb2dfdXNlZCkpIHsKKwkJLyogTWFrZSBzdXJlIGRhdGEgaXMgc2VlbiBiZWZvcmUgbG9nLiAqLworCQlzbXBfd21iKCk7CisJCS8qIExvZyB1c2VkIHJpbmcgZW50cnkgd3JpdGUuICovCisJCWxvZ193cml0ZSh2cS0+bG9nX2Jhc2UsCisJCQkgIHZxLT5sb2dfYWRkciArCisJCQkgICAoKHZvaWQgX191c2VyICopdXNlZCAtICh2b2lkIF9fdXNlciAqKXZxLT51c2VkKSwKKwkJCSAgY291bnQgKiBzaXplb2YgKnVzZWQpOworCX0KKwl2cS0+bGFzdF91c2VkX2lkeCArPSBjb3VudDsKKwlyZXR1cm4gMDsKK30KKworLyogQWZ0ZXIgd2UndmUgdXNlZCBvbmUgb2YgdGhlaXIgYnVmZmVycywgd2UgdGVsbCB0aGVtIGFib3V0IGl0LiAgV2UnbGwgdGhlbgorICogd2FudCB0byBub3RpZnkgdGhlIGd1ZXN0LCB1c2luZyBldmVudGZkLiAqLworaW50IHZob3N0X2FkZF91c2VkX24oc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsIHN0cnVjdCB2cmluZ191c2VkX2VsZW0gKmhlYWRzLAorCQkgICAgIHVuc2lnbmVkIGNvdW50KQoreworCWludCBzdGFydCwgbiwgcjsKKworCXN0YXJ0ID0gdnEtPmxhc3RfdXNlZF9pZHggJSB2cS0+bnVtOworCW4gPSB2cS0+bnVtIC0gc3RhcnQ7CisJaWYgKG4gPCBjb3VudCkgeworCQlyID0gX192aG9zdF9hZGRfdXNlZF9uKHZxLCBoZWFkcywgbik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCQloZWFkcyArPSBuOworCQljb3VudCAtPSBuOworCX0KKwlyID0gX192aG9zdF9hZGRfdXNlZF9uKHZxLCBoZWFkcywgY291bnQpOworCisJLyogTWFrZSBzdXJlIGJ1ZmZlciBpcyB3cml0dGVuIGJlZm9yZSB3ZSB1cGRhdGUgaW5kZXguICovCisJc21wX3dtYigpOworCWlmIChwdXRfdXNlcih2cS0+bGFzdF91c2VkX2lkeCwgJnZxLT51c2VkLT5pZHgpKSB7CisJCXZxX2Vycih2cSwgIkZhaWxlZCB0byBpbmNyZW1lbnQgdXNlZCBpZHgiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICh1bmxpa2VseSh2cS0+bG9nX3VzZWQpKSB7CisJCS8qIExvZyB1c2VkIGluZGV4IHVwZGF0ZS4gKi8KKwkJbG9nX3dyaXRlKHZxLT5sb2dfYmFzZSwKKwkJCSAgdnEtPmxvZ19hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZyaW5nX3VzZWQsIGlkeCksCisJCQkgIHNpemVvZiB2cS0+dXNlZC0+aWR4KTsKKwkJaWYgKHZxLT5sb2dfY3R4KQorCQkJZXZlbnRmZF9zaWduYWwodnEtPmxvZ19jdHgsIDEpOworCX0KKwlyZXR1cm4gcjsKK30KKwogLyogVGhpcyBhY3R1YWxseSBzaWduYWxzIHRoZSBndWVzdCwgdXNpbmcgZXZlbnRmZC4gKi8KIHZvaWQgdmhvc3Rfc2lnbmFsKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiB7CkBAIC0xMDc2LDYgKzEyNDQsMTUgQEAKIAl2aG9zdF9zaWduYWwoZGV2LCB2cSk7CiB9CiAKKy8qIG11bHRpLWJ1ZmZlciB2ZXJzaW9uIG9mIHZob3N0X2FkZF91c2VkX2FuZF9zaWduYWwgKi8KK3ZvaWQgdmhvc3RfYWRkX3VzZWRfYW5kX3NpZ25hbF9uKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwKKwkJCQkgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCisJCQkJIHN0cnVjdCB2cmluZ191c2VkX2VsZW0gKmhlYWRzLCB1bnNpZ25lZCBjb3VudCkKK3sKKwl2aG9zdF9hZGRfdXNlZF9uKHZxLCBoZWFkcywgY291bnQpOworCXZob3N0X3NpZ25hbChkZXYsIHZxKTsKK30KKwogLyogT0ssIG5vdyB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgYWRkZWQgZGVzY3JpcHRvcnMuICovCiBib29sIHZob3N0X2VuYWJsZV9ub3RpZnkoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiB7CkBAIC0xMTAwLDcgKzEyNzcsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIGF2YWlsX2lkeCAhPSB2cS0+bGFzdF9hdmFpbF9pZHg7CisJcmV0dXJuIGF2YWlsX2lkeCAhPSB2cS0+YXZhaWxfaWR4OwogfQogCiAvKiBXZSBkb24ndCBuZWVkIHRvIGJlIG5vdGlmaWVkIGFnYWluLiAqLwpAQCAtMTExNSwxNiArMTI5MiwzIEBACiAJCXZxX2Vycih2cSwgIkZhaWxlZCB0byBlbmFibGUgbm90aWZpY2F0aW9uIGF0ICVwOiAlZFxuIiwKIAkJICAgICAgICZ2cS0+dXNlZC0+ZmxhZ3MsIHIpOwogfQotCi1pbnQgdmhvc3RfaW5pdCh2b2lkKQotewotCXZob3N0X3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ2aG9zdCIpOwotCWlmICghdmhvc3Rfd29ya3F1ZXVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB2aG9zdF9jbGVhbnVwKHZvaWQpCi17Ci0JZGVzdHJveV93b3JrcXVldWUodmhvc3Rfd29ya3F1ZXVlKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaCBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAppbmRleCAxMWVlMTNkLi5hZmQ3NzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKKysrIGIvZHJpdmVycy92aG9zdC92aG9zdC5oCkBAIC01LDEzICs1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvdmhvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX3JpbmcuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIHN0cnVjdCB2aG9zdF9kZXZpY2U7CiAKQEAgLTIwLDE5ICsyMCwzMSBAQAogCVZIT1NUX05FVF9NQVhfU0cgPSBNQVhfU0tCX0ZSQUdTICsgMiwKIH07CiAKK3N0cnVjdCB2aG9zdF93b3JrOwordHlwZWRlZiB2b2lkICgqdmhvc3Rfd29ya19mbl90KShzdHJ1Y3Qgdmhvc3Rfd29yayAqd29yayk7CisKK3N0cnVjdCB2aG9zdF93b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSAgbm9kZTsKKwl2aG9zdF93b3JrX2ZuX3QJCSAgZm47CisJd2FpdF9xdWV1ZV9oZWFkX3QJICBkb25lOworCWludAkJCSAgZmx1c2hpbmc7CisJdW5zaWduZWQJCSAgcXVldWVfc2VxOworCXVuc2lnbmVkCQkgIGRvbmVfc2VxOworfTsKKwogLyogUG9sbCBhIGZpbGUgKGV2ZW50ZmQgb3Igc29ja2V0KSAqLwogLyogTm90ZTogdGhlcmUncyBub3RoaW5nIHZob3N0IHNwZWNpZmljIGFib3V0IHRoaXMgc3RydWN0dXJlLiAqLwogc3RydWN0IHZob3N0X3BvbGwgewogCXBvbGxfdGFibGUgICAgICAgICAgICAgICAgdGFibGU7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgICp3cWg7CiAJd2FpdF9xdWV1ZV90ICAgICAgICAgICAgICB3YWl0OwotCS8qIHN0cnVjdCB3aGljaCB3aWxsIGhhbmRsZSBhbGwgYWN0dWFsIHdvcmsuICovCi0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICB3b3JrOworCXN0cnVjdCB2aG9zdF93b3JrCSAgd29yazsKIAl1bnNpZ25lZCBsb25nCQkgIG1hc2s7CisJc3RydWN0IHZob3N0X2RldgkgKmRldjsKIH07CiAKLXZvaWQgdmhvc3RfcG9sbF9pbml0KHN0cnVjdCB2aG9zdF9wb2xsICpwb2xsLCB3b3JrX2Z1bmNfdCBmdW5jLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgbWFzayk7Cit2b2lkIHZob3N0X3BvbGxfaW5pdChzdHJ1Y3Qgdmhvc3RfcG9sbCAqcG9sbCwgdmhvc3Rfd29ya19mbl90IGZuLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgbWFzaywgc3RydWN0IHZob3N0X2RldiAqZGV2KTsKIHZvaWQgdmhvc3RfcG9sbF9zdGFydChzdHJ1Y3Qgdmhvc3RfcG9sbCAqcG9sbCwgc3RydWN0IGZpbGUgKmZpbGUpOwogdm9pZCB2aG9zdF9wb2xsX3N0b3Aoc3RydWN0IHZob3N0X3BvbGwgKnBvbGwpOwogdm9pZCB2aG9zdF9wb2xsX2ZsdXNoKHN0cnVjdCB2aG9zdF9wb2xsICpwb2xsKTsKQEAgLTYzLDcgKzc1LDcgQEAKIAlzdHJ1Y3Qgdmhvc3RfcG9sbCBwb2xsOwogCiAJLyogVGhlIHJvdXRpbmUgdG8gY2FsbCB3aGVuIHRoZSBHdWVzdCBwaW5ncyB1cywgb3IgdGltZW91dC4gKi8KLQl3b3JrX2Z1bmNfdCBoYW5kbGVfa2ljazsKKwl2aG9zdF93b3JrX2ZuX3QgaGFuZGxlX2tpY2s7CiAKIAkvKiBMYXN0IGF2YWlsYWJsZSBpbmRleCB3ZSBzYXcuICovCiAJdTE2IGxhc3RfYXZhaWxfaWR4OwpAQCAtODQsMTMgKzk2LDE1IEBACiAJc3RydWN0IGlvdmVjIGluZGlyZWN0W1ZIT1NUX05FVF9NQVhfU0ddOwogCXN0cnVjdCBpb3ZlYyBpb3ZbVkhPU1RfTkVUX01BWF9TR107CiAJc3RydWN0IGlvdmVjIGhkcltWSE9TVF9ORVRfTUFYX1NHXTsKLQlzaXplX3QgaGRyX3NpemU7CisJc2l6ZV90IHZob3N0X2hsZW47CisJc2l6ZV90IHNvY2tfaGxlbjsKKwlzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtIGhlYWRzW1ZIT1NUX05FVF9NQVhfU0ddOwogCS8qIFdlIHVzZSBhIGtpbmQgb2YgUkNVIHRvIGFjY2VzcyBwcml2YXRlIHBvaW50ZXIuCi0JICogQWxsIHJlYWRlcnMgYWNjZXNzIGl0IGZyb20gd29ya3F1ZXVlLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0bwotCSAqIGZsdXNoIHRoZSB3b3JrcXVldWUgaW5zdGVhZCBvZiBzeW5jaHJvbml6ZV9yY3UuIFRoZXJlZm9yZSByZWFkZXJzIGRvCisJICogQWxsIHJlYWRlcnMgYWNjZXNzIGl0IGZyb20gd29ya2VyLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0bworCSAqIGZsdXNoIHRoZSB2aG9zdF93b3JrIGluc3RlYWQgb2Ygc3luY2hyb25pemVfcmN1LiBUaGVyZWZvcmUgcmVhZGVycyBkbwogCSAqIG5vdCBuZWVkIHRvIGNhbGwgcmN1X3JlYWRfbG9jay9yY3VfcmVhZF91bmxvY2s6IHRoZSBiZWdpbm5pbmcgb2YKLQkgKiB3b3JrIGl0ZW0gZXhlY3V0aW9uIGFjdHMgaW5zdGVhZCBvZiByY3VfcmVhZF9sb2NrKCkgYW5kIHRoZSBlbmQgb2YKLQkgKiB3b3JrIGl0ZW0gZXhlY3V0aW9uIGFjdHMgaW5zdGVhZCBvZiByY3VfcmVhZF9sb2NrKCkuCisJICogdmhvc3Rfd29yayBleGVjdXRpb24gYWN0cyBpbnN0ZWFkIG9mIHJjdV9yZWFkX2xvY2soKSBhbmQgdGhlIGVuZCBvZgorCSAqIHZob3N0X3dvcmsgZXhlY3V0aW9uIGFjdHMgaW5zdGVhZCBvZiByY3VfcmVhZF9sb2NrKCkuCiAJICogV3JpdGVycyB1c2UgdmlydHF1ZXVlIG11dGV4LiAqLwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAkvKiBMb2cgd3JpdGUgZGVzY3JpcHRvcnMgKi8KQEAgLTExMCw2ICsxMjQsOSBAQAogCWludCBudnFzOwogCXN0cnVjdCBmaWxlICpsb2dfZmlsZTsKIAlzdHJ1Y3QgZXZlbnRmZF9jdHggKmxvZ19jdHg7CisJc3BpbmxvY2tfdCB3b3JrX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCB3b3JrX2xpc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0ICp3b3JrZXI7CiB9OwogCiBsb25nIHZob3N0X2Rldl9pbml0KHN0cnVjdCB2aG9zdF9kZXYgKiwgc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnFzLCBpbnQgbnZxcyk7CkBAIC0xMjQsMjEgKzE0MSwyMiBAQAogCQkgICAgICBzdHJ1Y3QgaW92ZWMgaW92W10sIHVuc2lnbmVkIGludCBpb3ZfY291bnQsCiAJCSAgICAgIHVuc2lnbmVkIGludCAqb3V0X251bSwgdW5zaWduZWQgaW50ICppbl9udW0sCiAJCSAgICAgIHN0cnVjdCB2aG9zdF9sb2cgKmxvZywgdW5zaWduZWQgaW50ICpsb2dfbnVtKTsKLXZvaWQgdmhvc3RfZGlzY2FyZF92cV9kZXNjKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKik7Cit2b2lkIHZob3N0X2Rpc2NhcmRfdnFfZGVzYyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICosIGludCBuKTsKIAogaW50IHZob3N0X2FkZF91c2VkKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKiwgdW5zaWduZWQgaW50IGhlYWQsIGludCBsZW4pOwotdm9pZCB2aG9zdF9zaWduYWwoc3RydWN0IHZob3N0X2RldiAqLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOworaW50IHZob3N0X2FkZF91c2VkX24oc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqLCBzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtICpoZWFkcywKKwkJICAgICB1bnNpZ25lZCBjb3VudCk7CiB2b2lkIHZob3N0X2FkZF91c2VkX2FuZF9zaWduYWwoc3RydWN0IHZob3N0X2RldiAqLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICosCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhlYWQsIGludCBsZW4pOworCQkJICAgICAgIHVuc2lnbmVkIGludCBpZCwgaW50IGxlbik7Cit2b2lkIHZob3N0X2FkZF91c2VkX2FuZF9zaWduYWxfbihzdHJ1Y3Qgdmhvc3RfZGV2ICosIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKiwKKwkJCSAgICAgICBzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtICpoZWFkcywgdW5zaWduZWQgY291bnQpOwordm9pZCB2aG9zdF9zaWduYWwoc3RydWN0IHZob3N0X2RldiAqLCBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOwogdm9pZCB2aG9zdF9kaXNhYmxlX25vdGlmeShzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICopOwogYm9vbCB2aG9zdF9lbmFibGVfbm90aWZ5KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKik7CiAKIGludCB2aG9zdF9sb2dfd3JpdGUoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsIHN0cnVjdCB2aG9zdF9sb2cgKmxvZywKIAkJICAgIHVuc2lnbmVkIGludCBsb2dfbnVtLCB1NjQgbGVuKTsKIAotaW50IHZob3N0X2luaXQodm9pZCk7Ci12b2lkIHZob3N0X2NsZWFudXAodm9pZCk7Ci0KICNkZWZpbmUgdnFfZXJyKHZxLCBmbXQsIC4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCXByX2RlYnVnKHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKTsgICAgICAgXAogCQlpZiAoKHZxKS0+ZXJyb3JfY3R4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNDksNyArMTY3LDggQEAKIAlWSE9TVF9GRUFUVVJFUyA9ICgxIDw8IFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSkgfAogCQkJICgxIDw8IFZJUlRJT19SSU5HX0ZfSU5ESVJFQ1RfREVTQykgfAogCQkJICgxIDw8IFZIT1NUX0ZfTE9HX0FMTCkgfAotCQkJICgxIDw8IFZIT1NUX05FVF9GX1ZJUlRJT19ORVRfSERSKSwKKwkJCSAoMSA8PCBWSE9TVF9ORVRfRl9WSVJUSU9fTkVUX0hEUikgfAorCQkJICgxIDw8IFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgdmhvc3RfaGFzX2ZlYXR1cmUoc3RydWN0IHZob3N0X2RldiAqZGV2LCBpbnQgYml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9LY29uZmlnCmluZGV4IDNkOTRhMTQuLjdiMTFlYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTE4NzEsNiArMTg3MSw3IEBACiBjb25maWcgRkJfRlNMX0RJVQogCXRyaXN0YXRlICJGcmVlc2NhbGUgRElVIGZyYW1lYnVmZmVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBGU0xfU09DCisJc2VsZWN0IEZCX01PREVfSEVMUEVSUwogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKQEAgLTIyMjksNiArMjIzMCwxNSBAQAogCSAgYW5kIGNvdWxkIGFsc28gaGF2ZSBiZWVuIGNhbGxlZCBieSBvdGhlciBuYW1lcyB3aGVuIGNvdXBsZWQgd2l0aAogCSAgYSBicmlkZ2UgYWRhcHRlci4KIAorY29uZmlnIEZCX0paNDc0MAorCXRyaXN0YXRlICJKWjQ3NDAgTENEIGZyYW1lYnVmZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQiAmJiBNQUNIX0paNDc0MAorCXNlbGVjdCBGQl9TWVNfRklMTFJFQ1QKKwlzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCisJc2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKKwloZWxwCisJICBGcmFtZWJ1ZmZlciBzdXBwb3J0IGZvciB0aGUgSlo0NzQwIFNvQy4KKwogc291cmNlICJkcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy92aWRlby9vbWFwMi9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQppbmRleCBkZGMyYWYyLi5mNTZhOWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKQEAgLTEzMSw2ICsxMzEsNyBAQAogb2JqLSQoQ09ORklHX0ZCX01CODYyWFgpCSAgKz0gbWI4NjJ4eC8KIG9iai0kKENPTkZJR19GQl9NU00pICAgICAgICAgICAgICArPSBtc20vCiBvYmotJChDT05GSUdfRkJfTlVDOTAwKSAgICAgICAgICAgKz0gbnVjOTAwZmIubworb2JqLSQoQ09ORklHX0ZCX0paNDc0MCkJCSAgKz0gano0NzQwX2ZiLm8KIAogIyBQbGF0Zm9ybSBvciBmYWxsYmFjayBkcml2ZXJzIGdvIGhlcmUKIG9iai0kKENPTkZJR19GQl9VVkVTQSkgICAgICAgICAgICArPSB1dmVzYWZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xvY29tb2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKaW5kZXggNzU3MWJjMi4uZDJmNTkwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKQEAgLTIsNyArMiw3IEBACiAgKiBCYWNrbGlnaHQgY29udHJvbCBjb2RlIGZvciBTaGFycCBaYXVydXMgU0wtNTUwMAogICoKICAqIENvcHlyaWdodCAyMDA1IEpvaG4gTGVueiA8bGVuekBjcy53aXNjLmVkdT4KLSAqIE1haW50YWluZXI6IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4gKHVubGVzcyBKb2huIHdhbnRzIHRvIDotKQorICogTWFpbnRhaW5lcjogUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+ICh1bmxlc3MgSm9obiB3YW50cyB0byA6LSkKICAqIEdQTCB2MgogICoKICAqIFRoaXMgZHJpdmVyIGFzc3VtZXMgc2luZ2xlIENQVS4gVGhhdCdzIG9rYXksIGJlY2F1c2UgY29sbGllIGlzCkBAIC0yNDYsNiArMjQ2LDYgQEAKIG1vZHVsZV9pbml0KGxvY29tb2xjZF9pbml0KTsKIG1vZHVsZV9leGl0KGxvY29tb2xjZF9leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiSm9obiBMZW56IDxsZW56QGNzLndpc2MuZWR1PiwgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PiIpOworTU9EVUxFX0FVVEhPUigiSm9obiBMZW56IDxsZW56QGNzLndpc2MuZWR1PiwgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbGxpZSBMQ0QgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2J3Mi5jIGIvZHJpdmVycy92aWRlby9idzIuYwppbmRleCAwOWYxYjliLi5jNzc5NjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2J3Mi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYncyLmMKQEAgLTM5MCwxMiArMzkwLDEyIEBACiAJaWYgKGZiX2dldF9vcHRpb25zKCJidzJmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmJ3Ml9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYncyX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBidzJfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZidzJfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmYncyX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGJ3Ml9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCmluZGV4IGQ4MzQ1ZmMuLjZiMTkxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYwpAQCAtNDMyLDcgKzQzMiw3IEBACiAJdTMyIGxvb3BzOwogCXUzMiByZXQ7CiAKLQkvKiBJbml0YWxpemUgQ2FybWluZSAqLworCS8qIEluaXRpYWxpemUgQ2FybWluZSAqLwogCS8qIFNldHMgaW50ZXJuYWwgY2xvY2sgKi8KIAljX3NldF9od19yZWcoaHcsIENBUk1JTkVfQ1RMX1JFRyArIENBUk1JTkVfQ1RMX1JFR19DTE9DS19FTkFCTEUsCiAJCQlDQVJNSU5FX0RGTFRfSVBfQ0xPQ0tfRU5BQkxFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2cxNC5jIGIvZHJpdmVycy92aWRlby9jZzE0LmMKaW5kZXggZTVkYzIyNC4uZDA5ZmRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzE0LmMKKysrIGIvZHJpdmVycy92aWRlby9jZzE0LmMKQEAgLTYxMCwxMiArNjEwLDEyIEBACiAJaWYgKGZiX2dldF9vcHRpb25zKCJjZzE0ZmIiLCBOVUxMKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZjZzE0X2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZjZzE0X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjZzE0X2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmY2cxNF9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZjZzE0X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGNnMTRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NnMy5jIGIvZHJpdmVycy92aWRlby9jZzMuYwppbmRleCA1NThkNzNhLi42NGFhMjk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NnMy5jCkBAIC00NzcsMTIgKzQ3NywxMiBAQAogCWlmIChmYl9nZXRfb3B0aW9ucygiY2czZmIiLCBOVUxMKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZjZzNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmNnM19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2czX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmY2czX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmNnM19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChjZzNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NnNi5jIGIvZHJpdmVycy92aWRlby9jZzYuYwppbmRleCA0ODBkNzYxLi4yMzg5YTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NnNi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2c2LmMKQEAgLTg3MCwxMiArODcwLDEyIEBACiAJaWYgKGZiX2dldF9vcHRpb25zKCJjZzZmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmNnNl9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY2c2X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjZzZfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZjZzZfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY2c2X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGNnNl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKaW5kZXggYjBhM2ZhMC4uM2IzZjU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKQEAgLTIzNDIsNiArMjM0MiwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGZiY29uX2RlYnVnX2VudGVyKHN0cnVjdCB2Y19kYXRhICp2YykKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHJlZ2lzdGVyZWRfZmJbY29uMmZiX21hcFt2Yy0+dmNfbnVtXV07CisJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOworCisJb3BzLT5zYXZlX2dyYXBoaWNzID0gb3BzLT5ncmFwaGljczsKKwlvcHMtPmdyYXBoaWNzID0gMDsKKwlpZiAoaW5mby0+ZmJvcHMtPmZiX2RlYnVnX2VudGVyKQorCQlpbmZvLT5mYm9wcy0+ZmJfZGVidWdfZW50ZXIoaW5mbyk7CisJZmJjb25fc2V0X3BhbGV0dGUodmMsIGNvbG9yX3RhYmxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYmNvbl9kZWJ1Z19sZWF2ZShzdHJ1Y3QgdmNfZGF0YSAqdmMpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbdmMtPnZjX251bV1dOworCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKKworCW9wcy0+Z3JhcGhpY3MgPSBvcHMtPnNhdmVfZ3JhcGhpY3M7CisJaWYgKGluZm8tPmZib3BzLT5mYl9kZWJ1Z19sZWF2ZSkKKwkJaW5mby0+ZmJvcHMtPmZiX2RlYnVnX2xlYXZlKGluZm8pOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGZiY29uX2dldF9mb250KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGNvbnNvbGVfZm9udCAqZm9udCkKIHsKIAl1OCAqZm9udGRhdGEgPSB2Yy0+dmNfZm9udC5kYXRhOwpAQCAtMzI3Niw2ICszMzAwLDggQEAKIAkuY29uX3NjcmVlbl9wb3MgCT0gZmJjb25fc2NyZWVuX3BvcywKIAkuY29uX2dldHh5IAkJPSBmYmNvbl9nZXR4eSwKIAkuY29uX3Jlc2l6ZSAgICAgICAgICAgICA9IGZiY29uX3Jlc2l6ZSwKKwkuY29uX2RlYnVnX2VudGVyCT0gZmJjb25fZGVidWdfZW50ZXIsCisJLmNvbl9kZWJ1Z19sZWF2ZQk9IGZiY29uX2RlYnVnX2xlYXZlLAogfTsKIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmYmNvbl9ldmVudF9ub3RpZmllciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKaW5kZXggODlhMzQ2ODguLjZiZDJlMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oCkBAIC03NCw2ICs3NCw3IEBACiAJaW50ICAgIGN1cnNvcl9yZXNldDsKIAlpbnQgICAgYmxhbmtfc3RhdGU7CiAJaW50ICAgIGdyYXBoaWNzOworCWludCAgICBzYXZlX2dyYXBoaWNzOyAvKiBmb3IgZGVidWcgZW50ZXIvbGVhdmUgKi8KIAlpbnQgICAgZmxhZ3M7CiAJaW50ICAgIHJvdGF0ZTsKIAlpbnQgICAgY3VyX3JvdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCmluZGV4IDQ5ZmNiZTguLmMyMjVkY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtNDAsNiArNDAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jIGIvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCmluZGV4IDNhNTYxZGYyLi4wYzFhZmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCkBAIC0zODgsNiArMzg4LDcgQEAKIAkJcHNldWRvX3ZhbCB8PSBjb252ZXJ0X2JpdGZpZWxkKHJlZCwgJnZhci0+cmVkKTsKIAkJcHNldWRvX3ZhbCB8PSBjb252ZXJ0X2JpdGZpZWxkKGdyZWVuLCAmdmFyLT5ncmVlbik7CiAJCXBzZXVkb192YWwgfD0gY29udmVydF9iaXRmaWVsZChibHVlLCAmdmFyLT5ibHVlKTsKKwkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJfQogCkBAIC00MzYsNiArNDM3LDggQEAKIAljeWJlcjIwMDBmYl93cml0ZWIoaSB8IDQsIDB4M2NmLCBjZmIpOwogCWN5YmVyMjAwMGZiX3dyaXRlYih2YWwsIDB4M2M2LCBjZmIpOwogCWN5YmVyMjAwMGZiX3dyaXRlYihpLCAweDNjZiwgY2ZiKTsKKwkvKiBwcmV2ZW50IGNhcmQgbG9jay11cCBvYnNlcnZlZCBvbiB4ODYgd2l0aCBDeWJlclBybyAyMDAwICovCisJY3liZXIyMDAwZmJfcmVhZGIoMHgzY2YsIGNmYik7CiB9CiAKIHN0YXRpYyB2b2lkIGN5YmVyMjAwMGZiX3NldF90aW1pbmcoc3RydWN0IGNmYl9pbmZvICpjZmIsIHN0cnVjdCBwYXJfaW5mbyAqaHcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZmYi5jIGIvZHJpdmVycy92aWRlby9mZmIuYwppbmRleCA5NWMwMjI3Li5mNmVjZmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmZiLmMKQEAgLTEwNjcsMTIgKzEwNjcsMTIgQEAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoImZmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmZmYl9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZmZiX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmZmJfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZmZmJfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZmZiX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGZmYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKaW5kZXggMjc0NTVjZS4uZTM4YWQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKQEAgLTM0LDcgKzM0LDggQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KLSNpbmNsdWRlICJmc2wtZGl1LWZiLmgiCisjaW5jbHVkZSA8bGludXgvZnNsLWRpdS1mYi5oPgorI2luY2x1ZGUgImVkaWQuaCIKIAogLyoKICAqIFRoZXNlIHBhcmFtZXRlcnMgZ2l2ZSBkZWZhdWx0IHBhcmFtZXRlcnMKQEAgLTIxNyw2ICsyMTgsNyBAQAogCWludCB4X2FvaV9kOwkJLyogYW9pIGRpc3BsYXkgeCBvZmZzZXQgdG8gcGh5c2ljYWwgc2NyZWVuICovCiAJaW50IHlfYW9pX2Q7CQkvKiBhb2kgZGlzcGxheSB5IG9mZnNldCB0byBwaHlzaWNhbCBzY3JlZW4gKi8KIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICpwYXJlbnQ7CisJdTggKmVkaWRfZGF0YTsKIH07CiAKIApAQCAtMzE3LDYgKzMxOSwxNyBAQAogCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpOwogfQogCisvKgorICogV29ya2Fyb3VuZCBmb3IgZmFpbGVkIHdyaXRpbmcgZGVzYyByZWdpc3RlciBvZiBwbGFuZXMuCisgKiBOZWVkZWQgd2l0aCBNUEM1MTIxIERJVSByZXYgMi4wIHNpbGljb24uCisgKi8KK3ZvaWQgd3JfcmVnX3dhKHUzMiAqcmVnLCB1MzIgdmFsKQoreworCWRvIHsKKwkJb3V0X2JlMzIocmVnLCB2YWwpOworCX0gd2hpbGUgKGluX2JlMzIocmVnKSAhPSB2YWwpOworfQorCiBzdGF0aWMgaW50IGZzbF9kaXVfZW5hYmxlX3BhbmVsKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBtZmJfaW5mbyAqcG1mYmksICpjbWZiaSwgKm1mYmkgPSBpbmZvLT5wYXI7CkBAIC0zMzAsNyArMzQzLDcgQEAKIAkJc3dpdGNoIChtZmJpLT5pbmRleCkgewogCQljYXNlIDA6CQkJCS8qIHBsYW5lIDAgKi8KIAkJCWlmIChody0+ZGVzY1swXSAhPSBhZC0+cGFkZHIpCi0JCQkJb3V0X2JlMzIoJmh3LT5kZXNjWzBdLCBhZC0+cGFkZHIpOworCQkJCXdyX3JlZ193YSgmaHctPmRlc2NbMF0sIGFkLT5wYWRkcik7CiAJCQlicmVhazsKIAkJY2FzZSAxOgkJCQkvKiBwbGFuZSAxIEFPSSAwICovCiAJCQljbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzJdLT5wYXI7CkBAIC0zNDAsNyArMzUzLDcgQEAKIAkJCQkJCWNwdV90b19sZTMyKGNtZmJpLT5hZC0+cGFkZHIpOwogCQkJCWVsc2UKIAkJCQkJYWQtPm5leHRfYWQgPSAwOwotCQkJCW91dF9iZTMyKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKKwkJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzFdLCBhZC0+cGFkZHIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMzoJCQkJLyogcGxhbmUgMiBBT0kgMCAqLwpAQCAtMzUxLDE0ICszNjQsMTQgQEAKIAkJCQkJCWNwdV90b19sZTMyKGNtZmJpLT5hZC0+cGFkZHIpOwogCQkJCWVsc2UKIAkJCQkJYWQtPm5leHRfYWQgPSAwOwotCQkJCW91dF9iZTMyKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKKwkJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzJdLCBhZC0+cGFkZHIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMjoJCQkJLyogcGxhbmUgMSBBT0kgMSAqLwogCQkJcG1mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1sxXS0+cGFyOwogCQkJYWQtPm5leHRfYWQgPSAwOwogCQkJaWYgKGh3LT5kZXNjWzFdID09IG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKQotCQkJCW91dF9iZTMyKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKKwkJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzFdLCBhZC0+cGFkZHIpOwogCQkJZWxzZQkJCQkJLyogQU9JMCBvcGVuICovCiAJCQkJcG1mYmktPmFkLT5uZXh0X2FkID0gY3B1X3RvX2xlMzIoYWQtPnBhZGRyKTsKIAkJCWJyZWFrOwpAQCAtMzY2LDcgKzM3OSw3IEBACiAJCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzNdLT5wYXI7CiAJCQlhZC0+bmV4dF9hZCA9IDA7CiAJCQlpZiAoaHctPmRlc2NbMl0gPT0gbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpCi0JCQkJb3V0X2JlMzIoJmh3LT5kZXNjWzJdLCBhZC0+cGFkZHIpOworCQkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIGFkLT5wYWRkcik7CiAJCQllbHNlCQkJCS8qIEFPSTAgd2FzIG9wZW4gKi8KIAkJCQlwbWZiaS0+YWQtPm5leHRfYWQgPSBjcHVfdG9fbGUzMihhZC0+cGFkZHIpOwogCQkJYnJlYWs7CkBAIC0zOTAsMjcgKzQwMywyNCBAQAogCXN3aXRjaCAobWZiaS0+aW5kZXgpIHsKIAljYXNlIDA6CQkJCQkvKiBwbGFuZSAwICovCiAJCWlmIChody0+ZGVzY1swXSAhPSBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcikKLQkJCW91dF9iZTMyKCZody0+ZGVzY1swXSwKLQkJCQltYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzBdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CiAJCWJyZWFrOwogCWNhc2UgMToJCQkJCS8qIHBsYW5lIDEgQU9JIDAgKi8KIAkJY21mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1syXS0+cGFyOwogCQlpZiAoY21mYmktPmNvdW50ID4gMCkJLyogQU9JMSBpcyBvcGVuICovCi0JCQlvdXRfYmUzMigmaHctPmRlc2NbMV0sIGNtZmJpLT5hZC0+cGFkZHIpOworCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgY21mYmktPmFkLT5wYWRkcik7CiAJCQkJCS8qIG1vdmUgQU9JMSB0byB0aGUgZmlyc3QgKi8KIAkJZWxzZQkJCS8qIEFPSTEgd2FzIGNsb3NlZCAqLwotCQkJb3V0X2JlMzIoJmh3LT5kZXNjWzFdLAotCQkJCW1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKKwkJCXdyX3JlZ193YSgmaHctPmRlc2NbMV0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkJLyogY2xvc2UgQU9JIDAgKi8KIAkJYnJlYWs7CiAJY2FzZSAzOgkJCQkJLyogcGxhbmUgMiBBT0kgMCAqLwogCQljbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzRdLT5wYXI7CiAJCWlmIChjbWZiaS0+Y291bnQgPiAwKQkvKiBBT0kxIGlzIG9wZW4gKi8KLQkJCW91dF9iZTMyKCZody0+ZGVzY1syXSwgY21mYmktPmFkLT5wYWRkcik7CisJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzJdLCBjbWZiaS0+YWQtPnBhZGRyKTsKIAkJCQkJLyogbW92ZSBBT0kxIHRvIHRoZSBmaXJzdCAqLwogCQllbHNlCQkJLyogQU9JMSB3YXMgY2xvc2VkICovCi0JCQlvdXRfYmUzMigmaHctPmRlc2NbMl0sCi0JCQkJbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOworCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOwogCQkJCQkvKiBjbG9zZSBBT0kgMCAqLwogCQlicmVhazsKIAljYXNlIDI6CQkJCQkvKiBwbGFuZSAxIEFPSSAxICovCkBAIC00MjEsNyArNDMxLDcgQEAKIAkJCQkJLyogQU9JMCBpcyBvcGVuLCBtdXN0IGJlIHRoZSBmaXJzdCAqLwogCQkJCXBtZmJpLT5hZC0+bmV4dF9hZCA9IDA7CiAJCX0gZWxzZQkJCS8qIEFPSTEgaXMgdGhlIGZpcnN0IGluIHRoZSBjaGFpbiAqLwotCQkJb3V0X2JlMzIoJmh3LT5kZXNjWzFdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzFdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CiAJCQkJCS8qIGNsb3NlIEFPSSAxICovCiAJCWJyZWFrOwogCWNhc2UgNDoJCQkJCS8qIHBsYW5lIDIgQU9JIDEgKi8KQEAgLTQzMiw3ICs0NDIsNyBAQAogCQkJCS8qIEFPSTAgaXMgb3BlbiwgbXVzdCBiZSB0aGUgZmlyc3QgKi8KIAkJCQlwbWZiaS0+YWQtPm5leHRfYWQgPSAwOwogCQl9IGVsc2UJCS8qIEFPSTEgaXMgdGhlIGZpcnN0IGluIHRoZSBjaGFpbiAqLwotCQkJb3V0X2JlMzIoJmh3LT5kZXNjWzJdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzJdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CiAJCQkJLyogY2xvc2UgQU9JIDEgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTExMDAsNiArMTExMCwxMCBAQAogCXN0cnVjdCBtZmJfaW5mbyAqbWZiaSA9IGluZm8tPnBhcjsKIAlpbnQgcmVzID0gMDsKIAorCS8qIGZyZWUgYm9vdCBzcGxhc2ggbWVtb3J5IG9uIGZpcnN0IC9kZXYvZmIwIG9wZW4gKi8KKwlpZiAoIW1mYmktPmluZGV4ICYmIGRpdV9vcHMucmVsZWFzZV9ib290bWVtKQorCQlkaXVfb3BzLnJlbGVhc2VfYm9vdG1lbSgpOworCiAJc3Bpbl9sb2NrKCZkaXVfbG9jayk7CiAJbWZiaS0+Y291bnQrKzsKIAlpZiAobWZiaS0+Y291bnQgPT0gMSkgewpAQCAtMTE3MywxOCArMTE4NywzMCBAQAogCWludCByYzsKIAlzdHJ1Y3QgbWZiX2luZm8gKm1mYmkgPSBpbmZvLT5wYXI7CiAJY29uc3QgY2hhciAqYW9pX21vZGUsICppbml0X2FvaV9tb2RlID0gIjMyMHgyNDAiOworCXN0cnVjdCBmYl92aWRlb21vZGUgKmRiID0gZnNsX2RpdV9tb2RlX2RiOworCXVuc2lnbmVkIGludCBkYnNpemUgPSBBUlJBWV9TSVpFKGZzbF9kaXVfbW9kZV9kYik7CisJaW50IGhhc19kZWZhdWx0X21vZGUgPSAxOwogCiAJaWYgKGluaXRfZmJpbmZvKGluZm8pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChtZmJpLT5pbmRleCA9PSAwKQkvKiBwbGFuZSAwICovCisJaWYgKG1mYmktPmluZGV4ID09IDApIHsJLyogcGxhbmUgMCAqLworCQlpZiAobWZiaS0+ZWRpZF9kYXRhKSB7CisJCQkvKiBOb3cgYnVpbGQgbW9kZWRiIGZyb20gRURJRCAqLworCQkJZmJfZWRpZF90b19tb25zcGVjcyhtZmJpLT5lZGlkX2RhdGEsICZpbmZvLT5tb25zcGVjcyk7CisJCQlmYl92aWRlb21vZGVfdG9fbW9kZWxpc3QoaW5mby0+bW9uc3BlY3MubW9kZWRiLAorCQkJCQkJIGluZm8tPm1vbnNwZWNzLm1vZGVkYl9sZW4sCisJCQkJCQkgJmluZm8tPm1vZGVsaXN0KTsKKwkJCWRiID0gaW5mby0+bW9uc3BlY3MubW9kZWRiOworCQkJZGJzaXplID0gaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbjsKKwkJfQogCQlhb2lfbW9kZSA9IGZiX21vZGU7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCWFvaV9tb2RlID0gaW5pdF9hb2lfbW9kZTsKKwl9CiAJcHJfZGVidWcoIm1vZGUgdXNlZCA9ICVzXG4iLCBhb2lfbW9kZSk7Ci0JcmMgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgYW9pX21vZGUsIGZzbF9kaXVfbW9kZV9kYiwKLQkgICAgIEFSUkFZX1NJWkUoZnNsX2RpdV9tb2RlX2RiKSwgJmZzbF9kaXVfZGVmYXVsdF9tb2RlLCBkZWZhdWx0X2JwcCk7Ci0KKwlyYyA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBhb2lfbW9kZSwgZGIsIGRic2l6ZSwKKwkJCSAgJmZzbF9kaXVfZGVmYXVsdF9tb2RlLCBkZWZhdWx0X2JwcCk7CiAJc3dpdGNoIChyYykgewogCWNhc2UgMToKIAkJcHJfZGVidWcoInVzaW5nIG1vZGUgc3BlY2lmaWVkIGluIEBtb2RlXG4iKTsKQEAgLTEyMDIsMTAgKzEyMjgsNTAgQEAKIAlkZWZhdWx0OgogCQlwcl9kZWJ1ZygicmMgPSAlZFxuIiwgcmMpOwogCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGZpbmQgbW9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBGb3IgcGxhbmUgMCB3ZSBjb250aW51ZSBhbmQgbG9vayBpbnRvCisJCSAqIGRyaXZlcidzIGludGVybmFsIG1vZGVkYi4KKwkJICovCisJCWlmIChtZmJpLT5pbmRleCA9PSAwICYmIG1mYmktPmVkaWRfZGF0YSkKKwkJCWhhc19kZWZhdWx0X21vZGUgPSAwOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCisJaWYgKCFoYXNfZGVmYXVsdF9tb2RlKSB7CisJCXJjID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIGFvaV9tb2RlLCBmc2xfZGl1X21vZGVfZGIsCisJCQkJICBBUlJBWV9TSVpFKGZzbF9kaXVfbW9kZV9kYiksCisJCQkJICAmZnNsX2RpdV9kZWZhdWx0X21vZGUsCisJCQkJICBkZWZhdWx0X2JwcCk7CisJCWlmIChyYyA+IDAgJiYgcmMgPCA1KQorCQkJaGFzX2RlZmF1bHRfbW9kZSA9IDE7CisJfQorCisJLyogU3RpbGwgbm90IGZvdW5kLCB1c2UgcHJlZmVycmVkIG1vZGUgZnJvbSBkYXRhYmFzZSBpZiBhbnkgKi8KKwlpZiAoIWhhc19kZWZhdWx0X21vZGUgJiYgaW5mby0+bW9uc3BlY3MubW9kZWRiKSB7CisJCXN0cnVjdCBmYl9tb25zcGVjcyAqc3BlY3MgPSAmaW5mby0+bW9uc3BlY3M7CisJCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGVkYiA9ICZzcGVjcy0+bW9kZWRiWzBdOworCisJCS8qCisJCSAqIEdldCBwcmVmZXJyZWQgdGltaW5nLiBJZiBub3QgZm91bmQsCisJCSAqIGZpcnN0IG1vZGUgaW4gZGF0YWJhc2Ugd2lsbCBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKHNwZWNzLT5taXNjICYgRkJfTUlTQ18xU1RfREVUQUlMKSB7CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IHNwZWNzLT5tb2RlZGJfbGVuOyBpKyspIHsKKwkJCQlpZiAoc3BlY3MtPm1vZGVkYltpXS5mbGFnICYgRkJfTU9ERV9JU19GSVJTVCkgeworCQkJCQltb2RlZGIgPSAmc3BlY3MtPm1vZGVkYltpXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID0gZGVmYXVsdF9icHA7CisJCWZiX3ZpZGVvbW9kZV90b192YXIoJmluZm8tPnZhciwgbW9kZWRiKTsKKwl9CisKIAlwcl9kZWJ1ZygieHJlc192aXJ0dWFsICVkXG4iLCBpbmZvLT52YXIueHJlc192aXJ0dWFsKTsKIAlwcl9kZWJ1ZygiYml0c19wZXJfcGl4ZWwgJWRcbiIsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CiAKQEAgLTEyNDQsNiArMTMxMCw5IEBACiAJaWYgKCFtZmJpLT5yZWdpc3RlcmVkKQogCQlyZXR1cm47CiAKKwlpZiAobWZiaS0+aW5kZXggPT0gMCkKKwkJa2ZyZWUobWZiaS0+ZWRpZF9kYXRhKTsKKwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAJdW5tYXBfdmlkZW9fbWVtb3J5KGluZm8pOwogCWlmICgmaW5mby0+Y21hcCkKQEAgLTE0MjcsNiArMTQ5Niw3IEBACiAJaW50IHJldCwgaSwgZXJyb3IgPSAwOwogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhOworCWludCBkaXVfbW9kZTsKIAogCW1hY2hpbmVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmc2xfZGl1X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1hY2hpbmVfZGF0YSkKQEAgLTE0NDMsNiArMTUxMywxNyBAQAogCQltZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0tPnBhcjsKIAkJbWVtY3B5KG1mYmksICZtZmJfdGVtcGxhdGVbaV0sIHNpemVvZihzdHJ1Y3QgbWZiX2luZm8pKTsKIAkJbWZiaS0+cGFyZW50ID0gbWFjaGluZV9kYXRhOworCisJCWlmIChtZmJpLT5pbmRleCA9PSAwKSB7CisJCQljb25zdCB1OCAqcHJvcDsKKwkJCWludCBsZW47CisKKwkJCS8qIEdldCBFRElEICovCisJCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZWRpZCIsICZsZW4pOworCQkJaWYgKHByb3AgJiYgbGVuID09IEVESURfTEVOR1RIKQorCQkJCW1mYmktPmVkaWRfZGF0YSA9IGttZW1kdXAocHJvcCwgRURJRF9MRU5HVEgsCisJCQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJfQogCX0KIAogCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwpAQCAtMTQ2Myw3ICsxNTQ0LDkgQEAKIAkJZ290byBlcnJvcjI7CiAJfQogCi0Jb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRpdV9tb2RlLCAwKTsJCS8qIGRpc2FibGUgRElVIGFueXdheSovCisJZGl1X21vZGUgPSBpbl9iZTMyKCZkci5kaXVfcmVnLT5kaXVfbW9kZSk7CisJaWYgKGRpdV9tb2RlICE9IE1GQl9NT0RFMSkKKwkJb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRpdV9tb2RlLCAwKTsJLyogZGlzYWJsZSBESVUgKi8KIAogCS8qIEdldCB0aGUgSVJRIG9mIHRoZSBESVUgKi8KIAltYWNoaW5lX2RhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKQEAgLTE1MTEsNyArMTU5NCwxMyBAQAogCW1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPm9mZnNldF94eWQgPSAwOwogCW1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPm5leHRfYWQgPSAwOwogCi0Jb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRlc2NbMF0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKKwkvKgorCSAqIExldCBESVUgZGlzcGxheSBzcGxhc2ggc2NyZWVuIGlmIGl0IHdhcyBwcmUtaW5pdGlhbGl6ZWQKKwkgKiBieSB0aGUgYm9vdGxvYWRlciwgc2V0IGR1bW15IGFyZWEgZGVzY3JpcHRvciBvdGhlcndpc2UuCisJICovCisJaWYgKGRpdV9tb2RlICE9IE1GQl9NT0RFMSkKKwkJb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRlc2NbMF0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKKwogCW91dF9iZTMyKCZkci5kaXVfcmVnLT5kZXNjWzFdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CiAJb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbXhmYi5jIGIvZHJpdmVycy92aWRlby9pbXhmYi5jCmluZGV4IGI0YjZkZWNlLi40M2YwNjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pbXhmYi5jCkBAIC0xNzUsNiArMTc1LDcgQEAKIAogCXN0cnVjdCBpbXhfZmJfdmlkZW9tb2RlICptb2RlOwogCWludAkJCW51bV9tb2RlczsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmw7CiAKIAl2b2lkICgqbGNkX3Bvd2VyKShpbnQpOwogCXZvaWQgKCpiYWNrbGlnaHRfcG93ZXIpKGludCk7CkBAIC00NDksNiArNDUwLDczIEBACiAJcmV0dXJuIDA7CiB9CiAKKworCitzdGF0aWMgaW50IGlteGZiX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3QgaW14ZmJfaW5mbyAqZmJpID0gYmxfZ2V0X2RhdGEoYmwpOworCisJcmV0dXJuIHJlYWRsKGZiaS0+cmVncyArIExDRENfUFdNUikgJiAweEZGOworfQorCitzdGF0aWMgaW50IGlteGZiX2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsKQoreworCXN0cnVjdCBpbXhmYl9pbmZvICpmYmkgPSBibF9nZXRfZGF0YShibCk7CisJaW50IGJyaWdodG5lc3MgPSBibC0+cHJvcHMuYnJpZ2h0bmVzczsKKworCWlmIChibC0+cHJvcHMucG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJYnJpZ2h0bmVzcyA9IDA7CisJaWYgKGJsLT5wcm9wcy5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlicmlnaHRuZXNzID0gMDsKKworCWZiaS0+cHdtciA9IChmYmktPnB3bXIgJiB+MHhGRikgfCBicmlnaHRuZXNzOworCisJaWYgKGJsLT5wcm9wcy5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQljbGtfZW5hYmxlKGZiaS0+Y2xrKTsKKwl3cml0ZWwoZmJpLT5wd21yLCBmYmktPnJlZ3MgKyBMQ0RDX1BXTVIpOworCWlmIChibC0+cHJvcHMuZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJY2xrX2Rpc2FibGUoZmJpLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBpbXhmYl9sY2RjX2JsX29wcyA9IHsKKwkudXBkYXRlX3N0YXR1cyA9IGlteGZiX2JsX3VwZGF0ZV9zdGF0dXMsCisJLmdldF9icmlnaHRuZXNzID0gaW14ZmJfYmxfZ2V0X2JyaWdodG5lc3MsCit9OworCitzdGF0aWMgdm9pZCBpbXhmYl9pbml0X2JhY2tsaWdodChzdHJ1Y3QgaW14ZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZQkqYmw7CisKKwlpZiAoZmJpLT5ibCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gMHhmZjsKKwl3cml0ZWwoZmJpLT5wd21yLCBmYmktPnJlZ3MgKyBMQ0RDX1BXTVIpOworCisJYmwgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJpbXhmYi1ibCIsICZmYmktPnBkZXYtPmRldiwgZmJpLAorCQkJCSAgICAgICAmaW14ZmJfbGNkY19ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihibCkpIHsKKwkJZGV2X2VycigmZmJpLT5wZGV2LT5kZXYsICJlcnJvciAlbGQgb24gYmFja2xpZ2h0IHJlZ2lzdGVyXG4iLAorCQkJCVBUUl9FUlIoYmwpKTsKKwkJcmV0dXJuOworCX0KKworCWZiaS0+YmwgPSBibDsKKwlibC0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWJsLT5wcm9wcy5mYl9ibGFuayA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmwtPnByb3BzLmJyaWdodG5lc3MgPSBpbXhmYl9ibF9nZXRfYnJpZ2h0bmVzcyhibCk7Cit9CisKK3N0YXRpYyB2b2lkIGlteGZiX2V4aXRfYmFja2xpZ2h0KHN0cnVjdCBpbXhmYl9pbmZvICpmYmkpCit7CisJaWYgKGZiaS0+YmwpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihmYmktPmJsKTsKK30KKwogc3RhdGljIHZvaWQgaW14ZmJfZW5hYmxlX2NvbnRyb2xsZXIoc3RydWN0IGlteGZiX2luZm8gKmZiaSkKIHsKIAlwcl9kZWJ1ZygiRW5hYmxpbmcgTENEIGNvbnRyb2xsZXJcbiIpOwpAQCAtNTc5LDcgKzY0Nyw2IEBACiAJCQlmYmktPnJlZ3MgKyBMQ0RDX1NJWkUpOwogCiAJd3JpdGVsKGZiaS0+cGNyLCBmYmktPnJlZ3MgKyBMQ0RDX1BDUik7Ci0Jd3JpdGVsKGZiaS0+cHdtciwgZmJpLT5yZWdzICsgTENEQ19QV01SKTsKIAl3cml0ZWwoZmJpLT5sc2NyMSwgZmJpLT5yZWdzICsgTENEQ19MU0NSMSk7CiAJd3JpdGVsKGZiaS0+ZG1hY3IsIGZiaS0+cmVncyArIExDRENfRE1BQ1IpOwogCkBAIC03NzksNiArODQ2LDggQEAKIAl9CiAKIAlpbXhmYl9lbmFibGVfY29udHJvbGxlcihmYmkpOworCWZiaS0+cGRldiA9IHBkZXY7CisJaW14ZmJfaW5pdF9iYWNrbGlnaHQoZmJpKTsKIAogCXJldHVybiAwOwogCkBAIC04MTYsNiArODg1LDcgQEAKIAogCWlteGZiX2Rpc2FibGVfY29udHJvbGxlcihmYmkpOwogCisJaW14ZmJfZXhpdF9iYWNrbGlnaHQoZmJpKTsKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vano0NzQwX2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2p6NDc0MF9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGVjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2p6NDc0MF9mYi5jCkBAIC0wLDAgKzEsODQ3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCUpaNDc0MCBTb0MgTENEIGZyYW1lYnVmZmVyIGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9qejQ3NDBfZmIuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvZ3Bpby5oPgorCisjZGVmaW5lIEpaX1JFR19MQ0RfQ0ZHCQkweDAwCisjZGVmaW5lIEpaX1JFR19MQ0RfVlNZTkMJMHgwNAorI2RlZmluZSBKWl9SRUdfTENEX0hTWU5DCTB4MDgKKyNkZWZpbmUgSlpfUkVHX0xDRF9WQVQJCTB4MEMKKyNkZWZpbmUgSlpfUkVHX0xDRF9EQUgJCTB4MTAKKyNkZWZpbmUgSlpfUkVHX0xDRF9EQVYJCTB4MTQKKyNkZWZpbmUgSlpfUkVHX0xDRF9QUwkJMHgxOAorI2RlZmluZSBKWl9SRUdfTENEX0NMUwkJMHgxQworI2RlZmluZSBKWl9SRUdfTENEX1NQTAkJMHgyMAorI2RlZmluZSBKWl9SRUdfTENEX1JFVgkJMHgyNAorI2RlZmluZSBKWl9SRUdfTENEX0NUUkwJCTB4MzAKKyNkZWZpbmUgSlpfUkVHX0xDRF9TVEFURQkweDM0CisjZGVmaW5lIEpaX1JFR19MQ0RfSUlECQkweDM4CisjZGVmaW5lIEpaX1JFR19MQ0RfREEwCQkweDQwCisjZGVmaW5lIEpaX1JFR19MQ0RfU0EwCQkweDQ0CisjZGVmaW5lIEpaX1JFR19MQ0RfRklEMAkJMHg0OAorI2RlZmluZSBKWl9SRUdfTENEX0NNRDAJCTB4NEMKKyNkZWZpbmUgSlpfUkVHX0xDRF9EQTEJCTB4NTAKKyNkZWZpbmUgSlpfUkVHX0xDRF9TQTEJCTB4NTQKKyNkZWZpbmUgSlpfUkVHX0xDRF9GSUQxCQkweDU4CisjZGVmaW5lIEpaX1JFR19MQ0RfQ01EMQkJMHg1QworCisjZGVmaW5lIEpaX0xDRF9DRkdfU0xDRAkJCUJJVCgzMSkKKyNkZWZpbmUgSlpfTENEX0NGR19QU19ESVNBQkxFCQlCSVQoMjMpCisjZGVmaW5lIEpaX0xDRF9DRkdfQ0xTX0RJU0FCTEUJCUJJVCgyMikKKyNkZWZpbmUgSlpfTENEX0NGR19TUExfRElTQUJMRQkJQklUKDIxKQorI2RlZmluZSBKWl9MQ0RfQ0ZHX1JFVl9ESVNBQkxFCQlCSVQoMjApCisjZGVmaW5lIEpaX0xDRF9DRkdfSFNZTkNNCQlCSVQoMTkpCisjZGVmaW5lIEpaX0xDRF9DRkdfUENMS00JCUJJVCgxOCkKKyNkZWZpbmUgSlpfTENEX0NGR19JTlYJCQlCSVQoMTcpCisjZGVmaW5lIEpaX0xDRF9DRkdfU1lOQ19ESVIJCUJJVCgxNikKKyNkZWZpbmUgSlpfTENEX0NGR19QU19QT0xBUklUWQkJQklUKDE1KQorI2RlZmluZSBKWl9MQ0RfQ0ZHX0NMU19QT0xBUklUWQkJQklUKDE0KQorI2RlZmluZSBKWl9MQ0RfQ0ZHX1NQTF9QT0xBUklUWQkJQklUKDEzKQorI2RlZmluZSBKWl9MQ0RfQ0ZHX1JFVl9QT0xBUklUWQkJQklUKDEyKQorI2RlZmluZSBKWl9MQ0RfQ0ZHX0hTWU5DX0FDVElWRV9MT1cJQklUKDExKQorI2RlZmluZSBKWl9MQ0RfQ0ZHX1BDTEtfRkFMTElOR19FREdFCUJJVCgxMCkKKyNkZWZpbmUgSlpfTENEX0NGR19ERV9BQ1RJVkVfTE9XCUJJVCg5KQorI2RlZmluZSBKWl9MQ0RfQ0ZHX1ZTWU5DX0FDVElWRV9MT1cJQklUKDgpCisjZGVmaW5lIEpaX0xDRF9DRkdfMThfQklUCQlCSVQoNykKKyNkZWZpbmUgSlpfTENEX0NGR19QRFcJCQkoQklUKDUpIHwgQklUKDQpKQorI2RlZmluZSBKWl9MQ0RfQ0ZHX01PREVfTUFTSyAweGYKKworI2RlZmluZSBKWl9MQ0RfQ1RSTF9CVVJTVF80CQkoMHgwIDw8IDI4KQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9CVVJTVF84CQkoMHgxIDw8IDI4KQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9CVVJTVF8xNgkJKDB4MiA8PCAyOCkKKyNkZWZpbmUgSlpfTENEX0NUUkxfUkdCNTU1CQlCSVQoMjcpCisjZGVmaW5lIEpaX0xDRF9DVFJMX09GVVAJCUJJVCgyNikKKyNkZWZpbmUgSlpfTENEX0NUUkxfRlJDX0dSQVlTQ0FMRV8xNgkoMHgwIDw8IDI0KQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9GUkNfR1JBWVNDQUxFXzQJKDB4MSA8PCAyNCkKKyNkZWZpbmUgSlpfTENEX0NUUkxfRlJDX0dSQVlTQ0FMRV8yCSgweDIgPDwgMjQpCisjZGVmaW5lIEpaX0xDRF9DVFJMX1BERF9NQVNLCQkoMHhmZiA8PCAxNikKKyNkZWZpbmUgSlpfTENEX0NUUkxfRU9GX0lSUQkJQklUKDEzKQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9TT0ZfSVJRCQlCSVQoMTIpCisjZGVmaW5lIEpaX0xDRF9DVFJMX09GVV9JUlEJCUJJVCgxMSkKKyNkZWZpbmUgSlpfTENEX0NUUkxfSUZVMF9JUlEJCUJJVCgxMCkKKyNkZWZpbmUgSlpfTENEX0NUUkxfSUZVMV9JUlEJCUJJVCg5KQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9ERF9JUlEJCUJJVCg4KQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9RRERfSVJRCQlCSVQoNykKKyNkZWZpbmUgSlpfTENEX0NUUkxfUkVWRVJTRV9FTkRJQU4JQklUKDYpCisjZGVmaW5lIEpaX0xDRF9DVFJMX0xTQl9GSVNSVAkJQklUKDUpCisjZGVmaW5lIEpaX0xDRF9DVFJMX0RJU0FCTEUJCUJJVCg0KQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9FTkFCTEUJCUJJVCgzKQorI2RlZmluZSBKWl9MQ0RfQ1RSTF9CUFBfMQkJMHgwCisjZGVmaW5lIEpaX0xDRF9DVFJMX0JQUF8yCQkweDEKKyNkZWZpbmUgSlpfTENEX0NUUkxfQlBQXzQJCTB4MgorI2RlZmluZSBKWl9MQ0RfQ1RSTF9CUFBfOAkJMHgzCisjZGVmaW5lIEpaX0xDRF9DVFJMX0JQUF8xNV8xNgkJMHg0CisjZGVmaW5lIEpaX0xDRF9DVFJMX0JQUF8xOF8yNAkJMHg1CisKKyNkZWZpbmUgSlpfTENEX0NNRF9TT0ZfSVJRIEJJVCgxNSkKKyNkZWZpbmUgSlpfTENEX0NNRF9FT0ZfSVJRIEJJVCgxNikKKyNkZWZpbmUgSlpfTENEX0NNRF9FTkFCTEVfUEFMIEJJVCgxMikKKworI2RlZmluZSBKWl9MQ0RfU1lOQ19NQVNLIDB4M2ZmCisKKyNkZWZpbmUgSlpfTENEX1NUQVRFX0RJU0FCTEVEIEJJVCgwKQorCitzdHJ1Y3QganpmYl9mcmFtZWRlc2MgeworCXVpbnQzMl90IG5leHQ7CisJdWludDMyX3QgYWRkcjsKKwl1aW50MzJfdCBpZDsKKwl1aW50MzJfdCBjbWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QganpmYiB7CisJc3RydWN0IGZiX2luZm8gKmZiOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXN0cnVjdCBqejQ3NDBfZmJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlzaXplX3QgdmlkbWVtX3NpemU7CisJdm9pZCAqdmlkbWVtOworCWRtYV9hZGRyX3QgdmlkbWVtX3BoeXM7CisJc3RydWN0IGp6ZmJfZnJhbWVkZXNjICpmcmFtZWRlc2M7CisJZG1hX2FkZHJfdCBmcmFtZWRlc2NfcGh5czsKKworCXN0cnVjdCBjbGsgKmxkY2xrOworCXN0cnVjdCBjbGsgKmxwY2xrOworCisJdW5zaWduZWQgaXNfZW5hYmxlZDoxOworCXN0cnVjdCBtdXRleCBsb2NrOworCisJdWludDMyX3QgcHNldWRvX3BhbGV0dGVbMTZdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBqemZiX2ZpeCBfX2RldmluaXRkYXRhID0geworCS5pZAkJPSAiSlo0NzQwIEZCIiwKKwkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnZpc3VhbAkJPSBGQl9WSVNVQUxfVFJVRUNPTE9SLAorCS54cGFuc3RlcAk9IDAsCisJLnlwYW5zdGVwCT0gMCwKKwkueXdyYXBzdGVwCT0gMCwKKwkuYWNjZWwJCT0gRkJfQUNDRUxfTk9ORSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QganpfbGNkX2N0cmxfcGluc1tdID0geworCUpaX0dQSU9fQlVMS19QSU4oTENEX1BDTEspLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0hTWU5DKSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9WU1lOQyksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfREUpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX1BTKSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9SRVYpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0NMUyksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfU1BMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QganpfbGNkX2RhdGFfcGluc1tdID0geworCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEEwKSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9EQVRBMSksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfREFUQTIpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEEzKSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9EQVRBNCksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfREFUQTUpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEE2KSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9EQVRBNyksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfREFUQTgpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEE5KSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9EQVRBMTApLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEExMSksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfREFUQTEyKSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9EQVRBMTMpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEExNCksCisJSlpfR1BJT19CVUxLX1BJTihMQ0RfREFUQTE1KSwKKwlKWl9HUElPX0JVTEtfUElOKExDRF9EQVRBMTYpLAorCUpaX0dQSU9fQlVMS19QSU4oTENEX0RBVEExNyksCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGp6ZmJfbnVtX2N0cmxfcGlucyhzdHJ1Y3QganpmYiAqanpmYikKK3sKKwl1bnNpZ25lZCBpbnQgbnVtOworCisJc3dpdGNoIChqemZiLT5wZGF0YS0+bGNkX3R5cGUpIHsKKwljYXNlIEpaX0xDRF9UWVBFX0dFTkVSSUNfMTZfQklUOgorCQludW0gPSA0OworCQlicmVhazsKKwljYXNlIEpaX0xDRF9UWVBFX0dFTkVSSUNfMThfQklUOgorCQludW0gPSA0OworCQlicmVhazsKKwljYXNlIEpaX0xDRF9UWVBFXzhCSVRfU0VSSUFMOgorCQludW0gPSAzOworCQlicmVhazsKKwljYXNlIEpaX0xDRF9UWVBFX1NQRUNJQUxfVEZUXzE6CisJY2FzZSBKWl9MQ0RfVFlQRV9TUEVDSUFMX1RGVF8yOgorCWNhc2UgSlpfTENEX1RZUEVfU1BFQ0lBTF9URlRfMzoKKwkJbnVtID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnVtID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBudW07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQganpmYl9udW1fZGF0YV9waW5zKHN0cnVjdCBqemZiICpqemZiKQoreworCXVuc2lnbmVkIGludCBudW07CisKKwlzd2l0Y2ggKGp6ZmItPnBkYXRhLT5sY2RfdHlwZSkgeworCWNhc2UgSlpfTENEX1RZUEVfR0VORVJJQ18xNl9CSVQ6CisJCW51bSA9IDE2OworCQlicmVhazsKKwljYXNlIEpaX0xDRF9UWVBFX0dFTkVSSUNfMThfQklUOgorCQludW0gPSAxODsKKwkJYnJlYWs7CisJY2FzZSBKWl9MQ0RfVFlQRV84QklUX1NFUklBTDoKKwkJbnVtID0gODsKKwkJYnJlYWs7CisJY2FzZSBKWl9MQ0RfVFlQRV9TUEVDSUFMX1RGVF8xOgorCWNhc2UgSlpfTENEX1RZUEVfU1BFQ0lBTF9URlRfMjoKKwljYXNlIEpaX0xDRF9UWVBFX1NQRUNJQUxfVEZUXzM6CisJCWlmIChqemZiLT5wZGF0YS0+YnBwID09IDE4KQorCQkJbnVtID0gMTg7CisJCWVsc2UKKwkJCW51bSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQludW0gPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIG51bTsKK30KKworLyogQmFzZWQgb24gQ05WVF9UT0hXIG1hY3JvIGZyb20gc2tlbGV0b25mYi5jICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGp6ZmJfY29udmVydF9jb2xvcl90b19odyh1bnNpZ25lZCB2YWwsCisJc3RydWN0IGZiX2JpdGZpZWxkICpiZikKK3sKKwlyZXR1cm4gKCgodmFsIDw8IGJmLT5sZW5ndGgpICsgMHg3RkZGIC0gdmFsKSA+PiAxNikgPDwgYmYtPm9mZnNldDsKK30KKworc3RhdGljIGludCBqemZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKKwkJCXVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmZiKQoreworCXVpbnQzMl90IGNvbG9yOworCisJaWYgKHJlZ25vID49IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvbG9yID0ganpmYl9jb252ZXJ0X2NvbG9yX3RvX2h3KHJlZCwgJmZiLT52YXIucmVkKTsKKwljb2xvciB8PSBqemZiX2NvbnZlcnRfY29sb3JfdG9faHcoZ3JlZW4sICZmYi0+dmFyLmdyZWVuKTsKKwljb2xvciB8PSBqemZiX2NvbnZlcnRfY29sb3JfdG9faHcoYmx1ZSwgJmZiLT52YXIuYmx1ZSk7CisJY29sb3IgfD0ganpmYl9jb252ZXJ0X2NvbG9yX3RvX2h3KHRyYW5zcCwgJmZiLT52YXIudHJhbnNwKTsKKworCSgodWludDMyX3QgKikoZmItPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gY29sb3I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqemZiX2dldF9jb250cm9sbGVyX2JwcChzdHJ1Y3QganpmYiAqanpmYikKK3sKKwlzd2l0Y2ggKGp6ZmItPnBkYXRhLT5icHApIHsKKwljYXNlIDE4OgorCWNhc2UgMjQ6CisJCXJldHVybiAzMjsKKwljYXNlIDE1OgorCQlyZXR1cm4gMTY7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGp6ZmItPnBkYXRhLT5icHA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSAqanpmYl9nZXRfbW9kZShzdHJ1Y3QganpmYiAqanpmYiwKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlID0ganpmYi0+cGRhdGEtPm1vZGVzOworCisJZm9yIChpID0gMDsgaSA8IGp6ZmItPnBkYXRhLT5udW1fbW9kZXM7ICsraSwgKyttb2RlKSB7CisJCWlmIChtb2RlLT54cmVzID09IHZhci0+eHJlcyAmJiBtb2RlLT55cmVzID09IHZhci0+eXJlcykKKwkJCXJldHVybiBtb2RlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGp6ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqZmIpCit7CisJc3RydWN0IGp6ZmIgKmp6ZmIgPSBmYi0+cGFyOworCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGU7CisKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCAhPSBqemZiX2dldF9jb250cm9sbGVyX2JwcChqemZiKSAmJgorCQl2YXItPmJpdHNfcGVyX3BpeGVsICE9IGp6ZmItPnBkYXRhLT5icHApCisJCXJldHVybiAtRUlOVkFMOworCisJbW9kZSA9IGp6ZmJfZ2V0X21vZGUoanpmYiwgdmFyKTsKKwlpZiAobW9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZiX3ZpZGVvbW9kZV90b192YXIodmFyLCBtb2RlKTsKKworCXN3aXRjaCAoanpmYi0+cGRhdGEtPmJwcCkgeworCWNhc2UgODoKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDU7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNjsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA1OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXZhci0+cmVkLm9mZnNldCA9IDExOworCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQlicmVhazsKKwljYXNlIDE4OgorCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT5yZWQubGVuZ3RoID0gNjsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gNjsKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOworCQlicmVhazsKKwljYXNlIDMyOgorCWNhc2UgMjQ6CisJCXZhci0+dHJhbnNwLm9mZnNldCA9IDI0OworCQl2YXItPnRyYW5zcC5sZW5ndGggPSA4OworCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqemZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGp6ZmIgKmp6ZmIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGp6NDc0MF9mYl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGp6ZmItPnBkYXRhOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlOworCXVpbnQxNl90IGhkcywgdmRzOworCXVpbnQxNl90IGhkZSwgdmRlOworCXVpbnQxNl90IGh0LCB2dDsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IGNmZzsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisKKwltb2RlID0ganpmYl9nZXRfbW9kZShqemZiLCB2YXIpOworCWlmIChtb2RlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1vZGUgPT0gaW5mby0+bW9kZSkKKwkJcmV0dXJuIDA7CisKKwlpbmZvLT5tb2RlID0gbW9kZTsKKworCWhkcyA9IG1vZGUtPmhzeW5jX2xlbiArIG1vZGUtPmxlZnRfbWFyZ2luOworCWhkZSA9IGhkcyArIG1vZGUtPnhyZXM7CisJaHQgPSBoZGUgKyBtb2RlLT5yaWdodF9tYXJnaW47CisKKwl2ZHMgPSBtb2RlLT52c3luY19sZW4gKyBtb2RlLT51cHBlcl9tYXJnaW47CisJdmRlID0gdmRzICsgbW9kZS0+eXJlczsKKwl2dCA9IHZkZSArIG1vZGUtPmxvd2VyX21hcmdpbjsKKworCWN0cmwgPSBKWl9MQ0RfQ1RSTF9PRlVQIHwgSlpfTENEX0NUUkxfQlVSU1RfMTY7CisKKwlzd2l0Y2ggKHBkYXRhLT5icHApIHsKKwljYXNlIDE6CisJCWN0cmwgfD0gSlpfTENEX0NUUkxfQlBQXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY3RybCB8PSBKWl9MQ0RfQ1RSTF9CUFBfMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljdHJsIHw9IEpaX0xDRF9DVFJMX0JQUF80OworCQlicmVhazsKKwljYXNlIDg6CisJCWN0cmwgfD0gSlpfTENEX0NUUkxfQlBQXzg7CisJYnJlYWs7CisJY2FzZSAxNToKKwkJY3RybCB8PSBKWl9MQ0RfQ1RSTF9SR0I1NTU7IC8qIEZhbGx0cm91Z2ggKi8KKwljYXNlIDE2OgorCQljdHJsIHw9IEpaX0xDRF9DVFJMX0JQUF8xNV8xNjsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCWN0cmwgfD0gSlpfTENEX0NUUkxfQlBQXzE4XzI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwljZmcgPSBwZGF0YS0+bGNkX3R5cGUgJiAweGY7CisKKwlpZiAoIShtb2RlLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpKQorCQljZmcgfD0gSlpfTENEX0NGR19IU1lOQ19BQ1RJVkVfTE9XOworCisJaWYgKCEobW9kZS0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkpCisJCWNmZyB8PSBKWl9MQ0RfQ0ZHX1ZTWU5DX0FDVElWRV9MT1c7CisKKwlpZiAocGRhdGEtPnBpeGNsa19mYWxsaW5nX2VkZ2UpCisJCWNmZyB8PSBKWl9MQ0RfQ0ZHX1BDTEtfRkFMTElOR19FREdFOworCisJaWYgKHBkYXRhLT5kYXRlX2VuYWJsZV9hY3RpdmVfbG93KQorCQljZmcgfD0gSlpfTENEX0NGR19ERV9BQ1RJVkVfTE9XOworCisJaWYgKHBkYXRhLT5sY2RfdHlwZSA9PSBKWl9MQ0RfVFlQRV9HRU5FUklDXzE4X0JJVCkKKwkJY2ZnIHw9IEpaX0xDRF9DRkdfMThfQklUOworCisJaWYgKG1vZGUtPnBpeGNsb2NrKSB7CisJCXJhdGUgPSBQSUNPUzJLSFoobW9kZS0+cGl4Y2xvY2spICogMTAwMDsKKwkJbW9kZS0+cmVmcmVzaCA9IHJhdGUgLyB2dCAvIGh0OworCX0gZWxzZSB7CisJCWlmIChwZGF0YS0+bGNkX3R5cGUgPT0gSlpfTENEX1RZUEVfOEJJVF9TRVJJQUwpCisJCQlyYXRlID0gbW9kZS0+cmVmcmVzaCAqICh2dCArIDIgKiBtb2RlLT54cmVzKSAqIGh0OworCQllbHNlCisJCQlyYXRlID0gbW9kZS0+cmVmcmVzaCAqIHZ0ICogaHQ7CisKKwkJbW9kZS0+cGl4Y2xvY2sgPSBLSFoyUElDT1MocmF0ZSAvIDEwMDApOworCX0KKworCW11dGV4X2xvY2soJmp6ZmItPmxvY2spOworCWlmICghanpmYi0+aXNfZW5hYmxlZCkKKwkJY2xrX2VuYWJsZShqemZiLT5sZGNsayk7CisJZWxzZQorCQljdHJsIHw9IEpaX0xDRF9DVFJMX0VOQUJMRTsKKworCXN3aXRjaCAocGRhdGEtPmxjZF90eXBlKSB7CisJY2FzZSBKWl9MQ0RfVFlQRV9TUEVDSUFMX1RGVF8xOgorCWNhc2UgSlpfTENEX1RZUEVfU1BFQ0lBTF9URlRfMjoKKwljYXNlIEpaX0xDRF9UWVBFX1NQRUNJQUxfVEZUXzM6CisJCXdyaXRlbChwZGF0YS0+c3BlY2lhbF90ZnRfY29uZmlnLnNwbCwganpmYi0+YmFzZSArIEpaX1JFR19MQ0RfU1BMKTsKKwkJd3JpdGVsKHBkYXRhLT5zcGVjaWFsX3RmdF9jb25maWcuY2xzLCBqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9DTFMpOworCQl3cml0ZWwocGRhdGEtPnNwZWNpYWxfdGZ0X2NvbmZpZy5wcywganpmYi0+YmFzZSArIEpaX1JFR19MQ0RfUFMpOworCQl3cml0ZWwocGRhdGEtPnNwZWNpYWxfdGZ0X2NvbmZpZy5wcywganpmYi0+YmFzZSArIEpaX1JFR19MQ0RfUkVWKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2ZnIHw9IEpaX0xDRF9DRkdfUFNfRElTQUJMRTsKKwkJY2ZnIHw9IEpaX0xDRF9DRkdfQ0xTX0RJU0FCTEU7CisJCWNmZyB8PSBKWl9MQ0RfQ0ZHX1NQTF9ESVNBQkxFOworCQljZmcgfD0gSlpfTENEX0NGR19SRVZfRElTQUJMRTsKKwkJYnJlYWs7CisJfQorCisJd3JpdGVsKG1vZGUtPmhzeW5jX2xlbiwganpmYi0+YmFzZSArIEpaX1JFR19MQ0RfSFNZTkMpOworCXdyaXRlbChtb2RlLT52c3luY19sZW4sIGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX1ZTWU5DKTsKKworCXdyaXRlbCgoaHQgPDwgMTYpIHwgdnQsIGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX1ZBVCk7CisKKwl3cml0ZWwoKGhkcyA8PCAxNikgfCBoZGUsIGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX0RBSCk7CisJd3JpdGVsKCh2ZHMgPDwgMTYpIHwgdmRlLCBqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9EQVYpOworCisJd3JpdGVsKGNmZywganpmYi0+YmFzZSArIEpaX1JFR19MQ0RfQ0ZHKTsKKworCXdyaXRlbChjdHJsLCBqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9DVFJMKTsKKworCWlmICghanpmYi0+aXNfZW5hYmxlZCkKKwkJY2xrX2Rpc2FibGUoanpmYi0+bGRjbGspOworCisJbXV0ZXhfdW5sb2NrKCZqemZiLT5sb2NrKTsKKworCWNsa19zZXRfcmF0ZShqemZiLT5scGNsaywgcmF0ZSk7CisJY2xrX3NldF9yYXRlKGp6ZmItPmxkY2xrLCByYXRlICogMyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQganpmYl9lbmFibGUoc3RydWN0IGp6ZmIgKmp6ZmIpCit7CisJdWludDMyX3QgY3RybDsKKworCWNsa19lbmFibGUoanpmYi0+bGRjbGspOworCisJanpfZ3Bpb19idWxrX3Jlc3VtZShqel9sY2RfY3RybF9waW5zLCBqemZiX251bV9jdHJsX3BpbnMoanpmYikpOworCWp6X2dwaW9fYnVsa19yZXN1bWUoanpfbGNkX2RhdGFfcGlucywganpmYl9udW1fZGF0YV9waW5zKGp6ZmIpKTsKKworCXdyaXRlbCgwLCBqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9TVEFURSk7CisKKwl3cml0ZWwoanpmYi0+ZnJhbWVkZXNjLT5uZXh0LCBqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9EQTApOworCisJY3RybCA9IHJlYWRsKGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX0NUUkwpOworCWN0cmwgfD0gSlpfTENEX0NUUkxfRU5BQkxFOworCWN0cmwgJj0gfkpaX0xDRF9DVFJMX0RJU0FCTEU7CisJd3JpdGVsKGN0cmwsIGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBqemZiX2Rpc2FibGUoc3RydWN0IGp6ZmIgKmp6ZmIpCit7CisJdWludDMyX3QgY3RybDsKKworCWN0cmwgPSByZWFkbChqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9DVFJMKTsKKwljdHJsIHw9IEpaX0xDRF9DVFJMX0RJU0FCTEU7CisJd3JpdGVsKGN0cmwsIGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX0NUUkwpOworCWRvIHsKKwkJY3RybCA9IHJlYWRsKGp6ZmItPmJhc2UgKyBKWl9SRUdfTENEX1NUQVRFKTsKKwl9IHdoaWxlICghKGN0cmwgJiBKWl9MQ0RfU1RBVEVfRElTQUJMRUQpKTsKKworCWp6X2dwaW9fYnVsa19zdXNwZW5kKGp6X2xjZF9jdHJsX3BpbnMsIGp6ZmJfbnVtX2N0cmxfcGlucyhqemZiKSk7CisJanpfZ3Bpb19idWxrX3N1c3BlbmQoanpfbGNkX2RhdGFfcGlucywganpmYl9udW1fZGF0YV9waW5zKGp6ZmIpKTsKKworCWNsa19kaXNhYmxlKGp6ZmItPmxkY2xrKTsKK30KKworc3RhdGljIGludCBqemZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QganpmYiAqanpmYiA9IGluZm8tPnBhcjsKKworCXN3aXRjaCAoYmxhbmtfbW9kZSkgeworCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKKwkJbXV0ZXhfbG9jaygmanpmYi0+bG9jayk7CisJCWlmIChqemZiLT5pc19lbmFibGVkKSB7CisJCQltdXRleF91bmxvY2soJmp6ZmItPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlqemZiX2VuYWJsZShqemZiKTsKKwkJanpmYi0+aXNfZW5hYmxlZCA9IDE7CisKKwkJbXV0ZXhfdW5sb2NrKCZqemZiLT5sb2NrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXV0ZXhfbG9jaygmanpmYi0+bG9jayk7CisJCWlmICghanpmYi0+aXNfZW5hYmxlZCkgeworCQkJbXV0ZXhfdW5sb2NrKCZqemZiLT5sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJanpmYl9kaXNhYmxlKGp6ZmIpOworCQlqemZiLT5pc19lbmFibGVkID0gMDsKKworCQltdXRleF91bmxvY2soJmp6ZmItPmxvY2spOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqemZiX2FsbG9jX2Rldm1lbShzdHJ1Y3QganpmYiAqanpmYikKK3sKKwlpbnQgbWF4X3ZpZGVvc2l6ZSA9IDA7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSA9IGp6ZmItPnBkYXRhLT5tb2RlczsKKwl2b2lkICpwYWdlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGp6ZmItPnBkYXRhLT5udW1fbW9kZXM7ICsrbW9kZSwgKytpKSB7CisJCWlmIChtYXhfdmlkZW9zaXplIDwgbW9kZS0+eHJlcyAqIG1vZGUtPnlyZXMpCisJCQltYXhfdmlkZW9zaXplID0gbW9kZS0+eHJlcyAqIG1vZGUtPnlyZXM7CisJfQorCisJbWF4X3ZpZGVvc2l6ZSAqPSBqemZiX2dldF9jb250cm9sbGVyX2JwcChqemZiKSA+PiAzOworCisJanpmYi0+ZnJhbWVkZXNjID0gZG1hX2FsbG9jX2NvaGVyZW50KCZqemZiLT5wZGV2LT5kZXYsCisJCQkJCXNpemVvZigqanpmYi0+ZnJhbWVkZXNjKSwKKwkJCQkJJmp6ZmItPmZyYW1lZGVzY19waHlzLCBHRlBfS0VSTkVMKTsKKworCWlmICghanpmYi0+ZnJhbWVkZXNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWp6ZmItPnZpZG1lbV9zaXplID0gUEFHRV9BTElHTihtYXhfdmlkZW9zaXplKTsKKwlqemZiLT52aWRtZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmp6ZmItPnBkZXYtPmRldiwKKwkJCQkJanpmYi0+dmlkbWVtX3NpemUsCisJCQkJCSZqemZiLT52aWRtZW1fcGh5cywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWp6ZmItPnZpZG1lbSkKKwkJZ290byBlcnJfZnJlZV9mcmFtZWRlc2M7CisKKwlmb3IgKHBhZ2UgPSBqemZiLT52aWRtZW07CisJCSBwYWdlIDwganpmYi0+dmlkbWVtICsgUEFHRV9BTElHTihqemZiLT52aWRtZW1fc2l6ZSk7CisJCSBwYWdlICs9IFBBR0VfU0laRSkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2UpKTsKKwl9CisKKwlqemZiLT5mcmFtZWRlc2MtPm5leHQgPSBqemZiLT5mcmFtZWRlc2NfcGh5czsKKwlqemZiLT5mcmFtZWRlc2MtPmFkZHIgPSBqemZiLT52aWRtZW1fcGh5czsKKwlqemZiLT5mcmFtZWRlc2MtPmlkID0gMHhkZWFmYmVhZDsKKwlqemZiLT5mcmFtZWRlc2MtPmNtZCA9IDA7CisJanpmYi0+ZnJhbWVkZXNjLT5jbWQgfD0gbWF4X3ZpZGVvc2l6ZSAvIDQ7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfZnJhbWVkZXNjOgorCWRtYV9mcmVlX2NvaGVyZW50KCZqemZiLT5wZGV2LT5kZXYsIHNpemVvZigqanpmYi0+ZnJhbWVkZXNjKSwKKwkJCQlqemZiLT5mcmFtZWRlc2MsIGp6ZmItPmZyYW1lZGVzY19waHlzKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQganpmYl9mcmVlX2Rldm1lbShzdHJ1Y3QganpmYiAqanpmYikKK3sKKwlkbWFfZnJlZV9jb2hlcmVudCgmanpmYi0+cGRldi0+ZGV2LCBqemZiLT52aWRtZW1fc2l6ZSwKKwkJCQlqemZiLT52aWRtZW0sIGp6ZmItPnZpZG1lbV9waHlzKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmanpmYi0+cGRldi0+ZGV2LCBzaXplb2YoKmp6ZmItPmZyYW1lZGVzYyksCisJCQkJanpmYi0+ZnJhbWVkZXNjLCBqemZiLT5mcmFtZWRlc2NfcGh5cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgIGZiX29wcyBqemZiX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZmJfY2hlY2tfdmFyID0ganpmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIgPSBqemZiX3NldF9wYXIsCisJLmZiX2JsYW5rID0ganpmYl9ibGFuaywKKwkuZmJfZmlsbHJlY3QJPSBzeXNfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gc3lzX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBzeXNfaW1hZ2VibGl0LAorCS5mYl9zZXRjb2xyZWcgPSBqemZiX3NldGNvbHJlZywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGp6ZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBqemZiICpqemZiOworCXN0cnVjdCBmYl9pbmZvICpmYjsKKwlzdHJ1Y3Qgano0NzQwX2ZiX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHJlZ2lzdGVyIG1lbW9yeSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwgcGRldi0+bmFtZSk7CisJaWYgKCFtZW0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgcmVnaXN0ZXIgbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZmIgPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGp6ZmIpLCAmcGRldi0+ZGV2KTsKKwlpZiAoIWZiKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJZmItPmZib3BzID0gJmp6ZmJfb3BzOworCWZiLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCisJanpmYiA9IGZiLT5wYXI7CisJanpmYi0+cGRldiA9IHBkZXY7CisJanpmYi0+cGRhdGEgPSBwZGF0YTsKKwlqemZiLT5tZW0gPSBtZW07CisKKwlqemZiLT5sZGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImxjZCIpOworCWlmIChJU19FUlIoanpmYi0+bGRjbGspKSB7CisJCXJldCA9IFBUUl9FUlIoanpmYi0+bGRjbGspOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGxjZCBjbG9jazogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2ZyYW1lYnVmZmVyX3JlbGVhc2U7CisJfQorCisJanpmYi0+bHBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJsY2RfcGNsayIpOworCWlmIChJU19FUlIoanpmYi0+bHBjbGspKSB7CisJCXJldCA9IFBUUl9FUlIoanpmYi0+bHBjbGspOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGxjZCBwaXhlbCBjbG9jazogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3B1dF9sZGNsazsKKwl9CisKKwlqemZiLT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmICghanpmYi0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCByZWdpc3RlciBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9wdXRfbHBjbGs7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwganpmYik7CisKKwltdXRleF9pbml0KCZqemZiLT5sb2NrKTsKKworCWZiX3ZpZGVvbW9kZV90b19tb2RlbGlzdChwZGF0YS0+bW9kZXMsIHBkYXRhLT5udW1fbW9kZXMsCisJCQkJICZmYi0+bW9kZWxpc3QpOworCWZiX3ZpZGVvbW9kZV90b192YXIoJmZiLT52YXIsIHBkYXRhLT5tb2Rlcyk7CisJZmItPnZhci5iaXRzX3Blcl9waXhlbCA9IHBkYXRhLT5icHA7CisJanpmYl9jaGVja192YXIoJmZiLT52YXIsIGZiKTsKKworCXJldCA9IGp6ZmJfYWxsb2NfZGV2bWVtKGp6ZmIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHZpZGVvIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCisJZmItPmZpeCA9IGp6ZmJfZml4OworCWZiLT5maXgubGluZV9sZW5ndGggPSBmYi0+dmFyLmJpdHNfcGVyX3BpeGVsICogZmItPnZhci54cmVzIC8gODsKKwlmYi0+Zml4Lm1taW9fc3RhcnQgPSBtZW0tPnN0YXJ0OworCWZiLT5maXgubW1pb19sZW4gPSByZXNvdXJjZV9zaXplKG1lbSk7CisJZmItPmZpeC5zbWVtX3N0YXJ0ID0ganpmYi0+dmlkbWVtX3BoeXM7CisJZmItPmZpeC5zbWVtX2xlbiA9ICBmYi0+Zml4LmxpbmVfbGVuZ3RoICogZmItPnZhci55cmVzOworCWZiLT5zY3JlZW5fYmFzZSA9IGp6ZmItPnZpZG1lbTsKKwlmYi0+cHNldWRvX3BhbGV0dGUgPSBqemZiLT5wc2V1ZG9fcGFsZXR0ZTsKKworCWZiX2FsbG9jX2NtYXAoJmZiLT5jbWFwLCAyNTYsIDApOworCisJY2xrX2VuYWJsZShqemZiLT5sZGNsayk7CisJanpmYi0+aXNfZW5hYmxlZCA9IDE7CisKKwl3cml0ZWwoanpmYi0+ZnJhbWVkZXNjLT5uZXh0LCBqemZiLT5iYXNlICsgSlpfUkVHX0xDRF9EQTApOworCisJZmItPm1vZGUgPSBOVUxMOworCWp6ZmJfc2V0X3BhcihmYik7CisKKwlqel9ncGlvX2J1bGtfcmVxdWVzdChqel9sY2RfY3RybF9waW5zLCBqemZiX251bV9jdHJsX3BpbnMoanpmYikpOworCWp6X2dwaW9fYnVsa19yZXF1ZXN0KGp6X2xjZF9kYXRhX3BpbnMsIGp6ZmJfbnVtX2RhdGFfcGlucyhqemZiKSk7CisKKwlyZXQgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXI6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX2Rldm1lbTsKKwl9CisKKwlqemZiLT5mYiA9IGZiOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2Rldm1lbToKKwlqel9ncGlvX2J1bGtfZnJlZShqel9sY2RfY3RybF9waW5zLCBqemZiX251bV9jdHJsX3BpbnMoanpmYikpOworCWp6X2dwaW9fYnVsa19mcmVlKGp6X2xjZF9kYXRhX3BpbnMsIGp6ZmJfbnVtX2RhdGFfcGlucyhqemZiKSk7CisKKwlmYl9kZWFsbG9jX2NtYXAoJmZiLT5jbWFwKTsKKwlqemZiX2ZyZWVfZGV2bWVtKGp6ZmIpOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChqemZiLT5iYXNlKTsKK2Vycl9wdXRfbHBjbGs6CisJY2xrX3B1dChqemZiLT5scGNsayk7CitlcnJfcHV0X2xkY2xrOgorCWNsa19wdXQoanpmYi0+bGRjbGspOworZXJyX2ZyYW1lYnVmZmVyX3JlbGVhc2U6CisJZnJhbWVidWZmZXJfcmVsZWFzZShmYik7CitlcnJfcmVsZWFzZV9tZW1fcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGp6ZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGp6ZmIgKmp6ZmIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWp6ZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBqemZiLT5mYik7CisKKwlqel9ncGlvX2J1bGtfZnJlZShqel9sY2RfY3RybF9waW5zLCBqemZiX251bV9jdHJsX3BpbnMoanpmYikpOworCWp6X2dwaW9fYnVsa19mcmVlKGp6X2xjZF9kYXRhX3BpbnMsIGp6ZmJfbnVtX2RhdGFfcGlucyhqemZiKSk7CisKKwlpb3VubWFwKGp6ZmItPmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihqemZiLT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGp6ZmItPm1lbSkpOworCisJZmJfZGVhbGxvY19jbWFwKCZqemZiLT5mYi0+Y21hcCk7CisJanpmYl9mcmVlX2Rldm1lbShqemZiKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJY2xrX3B1dChqemZiLT5scGNsayk7CisJY2xrX3B1dChqemZiLT5sZGNsayk7CisKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGp6ZmItPmZiKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQganpmYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QganpmYiAqanpmYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWZiX3NldF9zdXNwZW5kKGp6ZmItPmZiLCAxKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwltdXRleF9sb2NrKCZqemZiLT5sb2NrKTsKKwlpZiAoanpmYi0+aXNfZW5hYmxlZCkKKwkJanpmYl9kaXNhYmxlKGp6ZmIpOworCW11dGV4X3VubG9jaygmanpmYi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqemZiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGp6ZmIgKmp6ZmIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljbGtfZW5hYmxlKGp6ZmItPmxkY2xrKTsKKworCW11dGV4X2xvY2soJmp6ZmItPmxvY2spOworCWlmIChqemZiLT5pc19lbmFibGVkKQorCQlqemZiX2VuYWJsZShqemZiKTsKKwltdXRleF91bmxvY2soJmp6ZmItPmxvY2spOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWZiX3NldF9zdXNwZW5kKGp6ZmItPmZiLCAwKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGp6ZmJfcG1fb3BzID0geworCS5zdXNwZW5kCT0ganpmYl9zdXNwZW5kLAorCS5yZXN1bWUJCT0ganpmYl9yZXN1bWUsCisJLnBvd2Vyb2ZmCT0ganpmYl9zdXNwZW5kLAorCS5yZXN0b3JlCT0ganpmYl9yZXN1bWUsCit9OworCisjZGVmaW5lIEpaRkJfUE1fT1BTICgmanpmYl9wbV9vcHMpCisKKyNlbHNlCisjZGVmaW5lIEpaRkJfUE1fT1BTIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqemZiX2RyaXZlciA9IHsKKwkucHJvYmUgPSBqemZiX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChqemZiX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiano0NzQwLWZiIiwKKwkJLnBtID0gSlpGQl9QTV9PUFMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGp6ZmJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmp6ZmJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGp6ZmJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqemZiX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmanpmYl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoanpmYl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkpaNDc0MCBTb0MgTENEIGZyYW1lYnVmZmVyIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpqejQ3NDAtZmIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbGVvLmMgYi9kcml2ZXJzL3ZpZGVvL2xlby5jCmluZGV4IDllOGJmN2QuLmFkNjc3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbGVvLmMKKysrIGIvZHJpdmVycy92aWRlby9sZW8uYwpAQCAtNjc3LDEyICs2NzcsMTIgQEAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoImxlb2ZiIiwgTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmbGVvX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZsZW9fZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGxlb19leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmxlb19kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZsZW9fZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobGVvX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwppbmRleCA0NmRkYTdkLi5jYjE2M2E1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vZmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9vZmZiLmMKQEAgLTE5LDEzICsxOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogI2lmZGVmIENPTkZJR19QUEM2NAogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWFjeDU2NWFrbS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1hY3g1NjVha20uYwppbmRleCAxZjhlYjcwLi4wN2ZiYjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWFjeDU2NWFrbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtYWN4NTY1YWttLmMKQEAgLTU5Miw3ICs1OTIsNyBAQAogCXIgPSBvbWFwZHNzX3NkaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOwogCWlmIChyKSB7CiAJCXByX2VycigiJXMgc2RpIGVuYWJsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHI7CisJCWdvdG8gZmFpbF91bmxvY2s7CiAJfQogCiAJLypGSVhNRSB0d2VhayBtZSAqLwpAQCAtNjMzLDYgKzYzMyw4IEBACiAJcmV0dXJuIGFjeDU2NWFrbV9ibF91cGRhdGVfc3RhdHVzKG1kLT5ibF9kZXYpOwogZmFpbDoKIAlvbWFwZHNzX3NkaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKK2ZhaWxfdW5sb2NrOgorCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi92cmFtLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL3ZyYW0uYwppbmRleCAzYjEyMzdhLi5mNmZkYzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL3ZyYW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL3ZyYW0uYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KQEAgLTUyNSwxMCArNTI1LDggQEAKICAqIENhbGxlZCBmcm9tIG1hcF9pby4gV2UgbmVlZCB0byBjYWxsIHRvIHRoaXMgZWFybHkgZW5vdWdoIHNvIHRoYXQgd2UKICAqIGNhbiByZXNlcnZlIHRoZSBmaXhlZCBTRFJBTSByZWdpb25zIGJlZm9yZSBWTSBjb3VsZCBnZXQgaG9sZCBvZiB0aGVtLgogICovCi12b2lkIF9faW5pdCBvbWFwX3ZyYW1fcmVzZXJ2ZV9zZHJhbSh2b2lkKQordm9pZCBfX2luaXQgb21hcF92cmFtX3Jlc2VydmVfc2RyYW1fbWVtYmxvY2sodm9pZCkKIHsKLQlzdHJ1Y3QgYm9vdG1lbV9kYXRhCSpiZGF0YTsKLQl1bnNpZ25lZCBsb25nCQlzZHJhbV9zdGFydCwgc2RyYW1fc2l6ZTsKIAl1MzIgcGFkZHI7CiAJdTMyIHNpemUgPSAwOwogCkBAIC01NTUsMjkgKzU1MywyOCBAQAogCiAJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CiAKLQliZGF0YSA9IE5PREVfREFUQSgwKS0+YmRhdGE7Ci0Jc2RyYW1fc3RhcnQgPSBiZGF0YS0+bm9kZV9taW5fcGZuIDw8IFBBR0VfU0hJRlQ7Ci0Jc2RyYW1fc2l6ZSA9IChiZGF0YS0+bm9kZV9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpIC0gc2RyYW1fc3RhcnQ7Ci0KIAlpZiAocGFkZHIpIHsKLQkJaWYgKChwYWRkciAmIH5QQUdFX01BU0spIHx8IHBhZGRyIDwgc2RyYW1fc3RhcnQgfHwKLQkJCQlwYWRkciArIHNpemUgPiBzZHJhbV9zdGFydCArIHNkcmFtX3NpemUpIHsKKwkJc3RydWN0IG1lbWJsb2NrX3Byb3BlcnR5IHJlczsKKworCQlyZXMuYmFzZSA9IHBhZGRyOworCQlyZXMuc2l6ZSA9IHNpemU7CisJCWlmICgocGFkZHIgJiB+UEFHRV9NQVNLKSB8fCBtZW1ibG9ja19maW5kKCZyZXMpIHx8CisJCSAgICByZXMuYmFzZSAhPSBwYWRkciB8fCByZXMuc2l6ZSAhPSBzaXplKSB7CiAJCQlwcl9lcnIoIklsbGVnYWwgU0RSQU0gcmVnaW9uIGZvciBWUkFNXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWlmIChyZXNlcnZlX2Jvb3RtZW0ocGFkZHIsIHNpemUsIEJPT1RNRU1fRVhDTFVTSVZFKSA8IDApIHsKLQkJCXByX2VycigiRkI6IGZhaWxlZCB0byByZXNlcnZlIFZSQU1cbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHNpemUgPiBzZHJhbV9zaXplKSB7Ci0JCQlwcl9lcnIoIklsbGVnYWwgU0RSQU0gc2l6ZSBmb3IgVlJBTVxuIik7CisJCWlmIChtZW1ibG9ja19pc19yZWdpb25fcmVzZXJ2ZWQocGFkZHIsIHNpemUpKSB7CisJCQlwcl9lcnIoIkZCOiBmYWlsZWQgdG8gcmVzZXJ2ZSBWUkFNIC0gYnVzeVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlwYWRkciA9IHZpcnRfdG9fcGh5cyhhbGxvY19ib290bWVtX3BhZ2VzKHNpemUpKTsKLQkJQlVHX09OKHBhZGRyICYgflBBR0VfTUFTSyk7CisJCWlmIChtZW1ibG9ja19yZXNlcnZlKHBhZGRyLCBzaXplKSA8IDApIHsKKwkJCXByX2VycigiRkI6IGZhaWxlZCB0byByZXNlcnZlIFZSQU0gLSBubyBtZW1vcnlcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJcGFkZHIgPSBtZW1ibG9ja19hbGxvY19iYXNlKHNpemUsIFBBR0VfU0laRSwgTUVNQkxPQ0tfUkVBTF9MSU1JVCk7CiAJfQogCiAJb21hcF92cmFtX2FkZF9yZWdpb24ocGFkZHIsIHNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wOTEwMC5jIGIvZHJpdmVycy92aWRlby9wOTEwMC5jCmluZGV4IDY1NTI3NTEuLjY4OGIwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcDkxMDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL3A5MTAwLmMKQEAgLTM2NywxMiArMzY3LDEyIEBACiAJaWYgKGZiX2dldF9vcHRpb25zKCJwOTEwMGZiIiwgTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmcDkxMDBfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnA5MTAwX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwOTEwMF9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnA5MTAwX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnA5MTAwX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHA5MTAwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zdW54dnIxMDAwLmMgYi9kcml2ZXJzL3ZpZGVvL3N1bnh2cjEwMDAuYwppbmRleCA0ODliNDRlLi43Mjg4OTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3N1bnh2cjEwMDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL3N1bnh2cjEwMDAuYwpAQCAtMjEzLDEyICsyMTMsMTIgQEAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoImdmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmdmYl9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZ2ZiX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBnZmJfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZnZmJfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZ2ZiX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGdmYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdGN4LmMgYi9kcml2ZXJzL3ZpZGVvL3RjeC5jCmluZGV4IGNjMDM5YjMuLmYzNzVlMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdGN4LmMKKysrIGIvZHJpdmVycy92aWRlby90Y3guYwpAQCAtNTI2LDEyICs1MjYsMTIgQEAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoInRjeGZiIiwgTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmdGN4X2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ0Y3hfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHRjeF9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnRjeF9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ0Y3hfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodGN4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90ZGZ4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdGRmeGZiLmMKaW5kZXggOTgwNTQ4My4uM2VlNWU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90ZGZ4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RkZnhmYi5jCkBAIC0xNTcxLDggKzE1NzEsOCBAQAogCWlmIChkZWZhdWx0X3Bhci0+bXRycl9oYW5kbGUgPj0gMCkKIAkJbXRycl9kZWwoZGVmYXVsdF9wYXItPm10cnJfaGFuZGxlLCBpbmZvLT5maXguc21lbV9zdGFydCwKIAkJCSBpbmZvLT5maXguc21lbV9sZW4pOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCi0JCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKKwlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCisJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKIG91dF9lcnJfc2NyZWVuYmFzZToKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90Z2FmYi5jIGIvZHJpdmVycy92aWRlby90Z2FmYi5jCmluZGV4IDFiM2IxYzcuLmFiYTc2ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdGdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogCVRHQV9XUklURV9SRUcocGFyLCBodGltaW5ncywgVEdBX0hPUklaX1JFRyk7CiAJVEdBX1dSSVRFX1JFRyhwYXIsIHZ0aW1pbmdzLCBUR0FfVkVSVF9SRUcpOwogCi0JLyogSW5pdGFsaXNlIFJBTURBQy4gKi8KKwkvKiBJbml0aWFsaXNlIFJBTURBQy4gKi8KIAlpZiAodGdhX3R5cGUgPT0gVEdBX1RZUEVfOFBMQU5FICYmIHRnYV9idXNfcGNpKSB7CiAKIAkJLyogSW5pdCBCVDQ4NSBSQU1EQUMgcmVnaXN0ZXJzLiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwppbmRleCBmYTk3ZDNlLi43YzdmNDJhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYworKysgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKQEAgLTY4NCw3ICs2ODQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB4ZW5mYl9pbml0KHZvaWQpCiB7Ci0JaWYgKCF4ZW5fZG9tYWluKCkpCisJaWYgKCF4ZW5fcHZfZG9tYWluKCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogTm90aGluZyB0byBkbyBpZiBydW5uaW5nIGluIGRvbTAuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3hpbGlueGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3hpbGlueGZiLmMKaW5kZXggNTc0ZGM1NC4uMjliNWRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby94aWxpbnhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8veGlsaW54ZmIuYwpAQCAtNDg1LDYgKzQ4NSw4IEBACiAvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgeGlsaW54ZmJfb2ZfbWF0Y2hbXSBfX2RldmluaXRkYXRhID0gewogCXsgLmNvbXBhdGlibGUgPSAieGxueCx4cHMtdGZ0LTEuMDAuYSIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy10ZnQtMi4wMC5hIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLXRmdC0yLjAxLmEiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAieGxueCxwbGItdGZ0LWNudGxyLXJlZi0xLjAwLmEiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAieGxueCxwbGItZHZpLWNudGxyLXJlZi0xLjAwLmMiLCB9LAogCXt9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IGFmY2ZhY2MuLmIwNGIxODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTg3NSw2ICs4NzUsMjQgQEAKIAloZWxwCiAJICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBidWlsdC1pbiB3YXRjaGRvZyB0aW1lciBvbiBUWHg5IE1JUFMgU29Dcy4KIAorY29uZmlnIE9DVEVPTl9XRFQKKwl0cmlzdGF0ZSAiQ2F2aXVtIE9DVEVPTiBTT0MgZmFtaWx5IFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gQ1BVX0NBVklVTV9PQ1RFT04KKwlkZWZhdWx0IHkKKwlzZWxlY3QgRVhQT1JUX1VBU00gaWYgT0NURU9OX1dEVCA9IG0KKwloZWxwCisJICBIYXJkd2FyZSBkcml2ZXIgZm9yIE9DVEVPTidzIG9uIGNoaXAgd2F0Y2hkb2cgdGltZXIuCisJICBFbmFibGVzIHRoZSB3YXRjaGRvZyBmb3IgYWxsIGNvcmVzIHJ1bm5pbmcgTGludXguIEl0CisJICBpbnN0YWxscyBhIE5NSSBoYW5kbGVyIGFuZCBwb2tlcyB0aGUgd2F0Y2hkb2cgYmFzZWQgb24gYW4KKwkgIGludGVycnVwdC4gIE9uIGZpcnN0IGV4cGlyYXRpb24gb2YgdGhlIHdhdGNoZG9nLCB0aGUKKwkgIGludGVycnVwdCBoYW5kbGVyIHBva2VzIGl0LiAgVGhlIHNlY29uZCBleHBpcmF0aW9uIGNhdXNlcyBhbgorCSAgTk1JIHRoYXQgcHJpbnRzIGEgbWVzc2FnZS4gVGhlIHRoaXJkIGV4cGlyYXRpb24gY2F1c2VzIGEKKwkgIGdsb2JhbCBzb2Z0IHJlc2V0LgorCisJICBXaGVuIHVzZXJzcGFjZSBoYXMgL2Rldi93YXRjaGRvZyBvcGVuLCBubyBwb2tpbmcgaXMgZG9uZQorCSAgZnJvbSB0aGUgZmlyc3QgaW50ZXJydXB0LCBpdCBpcyB0aGVuIG9ubHkgcG9rZWQgd2hlbiB0aGUKKwkgIGRldmljZSBpcyB3cml0dGVuLgorCiAjIFBBUklTQyBBcmNoaXRlY3R1cmUKIAogIyBQT1dFUlBDIEFyY2hpdGVjdHVyZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggNzJmM2UyMC4uZTMwMjg5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCkBAIC0xMTQsNiArMTE0LDggQEAKIG9iai0kKENPTkZJR19TSUJZVEVfV0RPRykgKz0gc2Jfd2RvZy5vCiBvYmotJChDT05GSUdfQVI3X1dEVCkgKz0gYXI3X3dkdC5vCiBvYmotJChDT05GSUdfVFhYOV9XRFQpICs9IHR4eDl3ZHQubworb2JqLSQoQ09ORklHX09DVEVPTl9XRFQpICs9IG9jdGVvbi13ZHQubworb2N0ZW9uLXdkdC15IDo9IG9jdGVvbi13ZHQtbWFpbi5vIG9jdGVvbi13ZHQtbm1pLm8KIAogIyBQQVJJU0MgQXJjaGl0ZWN0dXJlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY3B3ZC5jIGIvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKaW5kZXggZDYyYjljZS4uMzBhMjUxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKQEAgLTU0NSw3ICs1NDUsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwLT5pcnEgPSBvcC0+aXJxc1swXTsKKwlwLT5pcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAogCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKIApAQCAtNjg4LDEyICs2ODgsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgY3B3ZF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmY3B3ZF9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY3B3ZF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3B3ZF9leGl0KHZvaWQpCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmNwd2RfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY3B3ZF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChjcHdkX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9vY3Rlb24td2R0LW1haW4uYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2N0ZW9uLXdkdC1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0MTAxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2N0ZW9uLXdkdC1tYWluLmMKQEAgLTAsMCArMSw3NDUgQEAKKy8qCisgKiBPY3Rlb24gV2F0Y2hkb2cgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIENhdml1bSBOZXR3b3JrcworICoKKyAqIFNvbWUgcGFydHMgZGVyaXZlZCBmcm9tIHdkdC5jCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2LTE5OTcgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4sCisgKgkJCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFRoZSBPQ1RFT04gd2F0Y2hkb2cgaGFzIGEgbWF4aW11bSB0aW1lb3V0IG9mIDJeMzIgKiBpb19jbG9jay4KKyAqIEZvciBtb3N0IHN5c3RlbXMgdGhpcyBpcyBsZXNzIHRoYW4gMTAgc2Vjb25kcywgc28gdG8gYWxsb3cgZm9yCisgKiBzb2Z0d2FyZSB0byByZXF1ZXN0IGxvbmdlciB3YXRjaGRvZyBoZWFydGJlYXRzLCB3ZSBtYWludGFpbiBzb2Z0d2FyZQorICogY291bnRlcnMgdG8gY291bnQgbXVsdGlwbGVzIG9mIHRoZSBiYXNlIHJhdGUuICBJZiB0aGUgc3lzdGVtIGxvY2tzCisgKiB1cCBpbiBzdWNoIGEgbWFubmVyIHRoYXQgd2UgY2FuIG5vdCBydW4gdGhlIHNvZnR3YXJlIGNvdW50ZXJzLCB0aGUKKyAqIG9ubHkgcmVzdWx0IGlzIGEgd2F0Y2hkb2cgcmVzZXQgc29vbmVyIHRoYW4gd2FzIHJlcXVlc3RlZC4gIEJ1dAorICogdGhhdCBpcyBPSywgYmVjYXVzZSBpbiB0aGlzIGNhc2UgdXNlcnNwYWNlIHdvdWxkIGxpa2VseSBub3QgYmUgYWJsZQorICogdG8gZG8gYW55dGhpbmcgYW55aG93LgorICoKKyAqIFRoZSBoYXJkd2FyZSB3YXRjaGRvZyBpbnRlcnZhbCB3ZSBjYWxsIHRoZSBwZXJpb2QuICBUaGUgT0NURU9OCisgKiB3YXRjaGRvZyBnb2VzIHRocm91Z2ggc2V2ZXJhbCBzdGFnZXMsIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QgYW4KKyAqIGlycSBpcyBhc3NlcnRlZCwgdGhlbiBpZiBpdCBpcyBub3QgcmVzZXQsIGFmdGVyIHRoZSBuZXh0IHBlcmlvZCBOTUkKKyAqIGlzIGFzc2VydGVkLCB0aGVuIGFmdGVyIGFuIGFkZGl0aW9uYWwgcGVyaW9kIGEgY2hpcCB3aWRlIHNvZnQgcmVzZXQuCisgKiBTbyBmb3IgdGhlIHNvZnR3YXJlIGNvdW50ZXJzLCB3ZSByZXNldCB3YXRjaGRvZyBhZnRlciBlYWNoIHBlcmlvZAorICogYW5kIGRlY3JlbWVudCB0aGUgY291bnRlci4gIEJ1dCBmb3IgdGhlIGxhc3QgdHdvIHBlcmlvZHMgd2UgbmVlZCB0bworICogbGV0IHRoZSB3YXRjaGRvZyBwcm9ncmVzcyB0byB0aGUgTk1JIHN0YWdlIHNvIHdlIGRpc2FibGUgdGhlIGlycQorICogYW5kIGxldCBpdCBwcm9jZWVkLiAgT25jZSBpbiB0aGUgTk1JLCB3ZSBwcmludCB0aGUgcmVnaXN0ZXIgc3RhdGUKKyAqIHRvIHRoZSBzZXJpYWwgcG9ydCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQuCisgKgorICogQSB3YXRjaGRvZyBpcyBtYWludGFpbmVkIGZvciBlYWNoIENQVSBpbiB0aGUgc3lzdGVtLCB0aGF0IHdheSBpZgorICogb25lIENQVSBzdWZmZXJzIGEgbG9ja3VwLCB3ZSBhbHNvIGdldCBhIHJlZ2lzdGVyIGR1bXAgYW5kIHJlc2V0LgorICogVGhlIHVzZXJzcGFjZSBwaW5nIHJlc2V0cyB0aGUgd2F0Y2hkb2cgb24gYWxsIENQVXMuCisgKgorICogQmVmb3JlIHVzZXJzcGFjZSBvcGVucyB0aGUgd2F0Y2hkb2cgZGV2aWNlLCB3ZSBzdGlsbCBydW4gdGhlCisgKiB3YXRjaGRvZ3MgdG8gY2F0Y2ggYW55IGxvY2t1cHMgdGhhdCBtYXkgYmUga2VybmVsIHJlbGF0ZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisjaW5jbHVkZSA8YXNtL3Vhc20uaD4KKworI2luY2x1ZGUgPGFzbS9vY3Rlb24vb2N0ZW9uLmg+CisKKy8qIFRoZSBjb3VudCBuZWVkZWQgdG8gYWNoaWV2ZSB0aW1lb3V0X3NlYy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZW91dF9jbnQ7CisKKy8qIFRoZSBtYXhpbXVtIHBlcmlvZCBzdXBwb3J0ZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF90aW1lb3V0X3NlYzsKKworLyogVGhlIGN1cnJlbnQgcGVyaW9kLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZW91dF9zZWM7CisKKy8qIFNldCB0byBub24temVybyB3aGVuIHVzZXJzcGFjZSBjb3VudGRvd24gbW9kZSBhY3RpdmUgKi8KK3N0YXRpYyBpbnQgZG9fY291bmRvd247CitzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ZG93bl9yZXNldDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVyX2NwdV9jb3VudGRvd25bTlJfQ1BVU107CisKK3N0YXRpYyBjcHVtYXNrX3QgaXJxX2VuYWJsZWRfY3B1czsKKworI2RlZmluZSBXRF9USU1PIDYwCQkJLyogRGVmYXVsdCBoZWFydGJlYXQgPSA2MCBzZWNvbmRzICovCisKK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0RfVElNTzsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwKKwkiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgwIDwgaGVhcnRiZWF0LCBkZWZhdWx0PSIKKwkJCQlfX01PRFVMRV9TVFJJTkcoV0RfVElNTykgIikiKTsKKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwKKwkiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9jdGVvbl93ZHRfaXNfb3BlbjsKK3N0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKKworc3RhdGljIHUzMiBfX2luaXRkYXRhIG5taV9zdGFnZTFfaW5zbnNbNjRdOworLyogV2UgbmVlZCBvbmUgYnJhbmNoIGFuZCB0aGVyZWZvcmUgb25lIHJlbG9jYXRpb24gcGVyIHRhcmdldCBsYWJlbC4gKi8KK3N0YXRpYyBzdHJ1Y3QgdWFzbV9sYWJlbCBfX2luaXRkYXRhIGxhYmVsc1s1XTsKK3N0YXRpYyBzdHJ1Y3QgdWFzbV9yZWxvYyBfX2luaXRkYXRhIHJlbG9jc1s1XTsKKworZW51bSBsYWJsZV9pZCB7CisJbGFiZWxfZW50ZXJfYm9vdGxvYWRlciA9IDEKK307CisKKy8qIFNvbWUgQ1AwIHJlZ2lzdGVycyAqLworI2RlZmluZSBLMAkJMjYKKyNkZWZpbmUgQzBfQ1ZNTUVNQ1RMIDExLCA3CisjZGVmaW5lIEMwX1NUQVRVUyAxMiwgMAorI2RlZmluZSBDMF9FQkFTRSAxNSwgMQorI2RlZmluZSBDMF9ERVNBVkUgMzEsIDAKKwordm9pZCBvY3Rlb25fd2R0X25taV9zdGFnZTIodm9pZCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvY3Rlb25fd2R0X2J1aWxkX3N0YWdlMSh2b2lkKQoreworCWludCBpOworCWludCBsZW47CisJdTMyICpwID0gbm1pX3N0YWdlMV9pbnNuczsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlzdHJ1Y3QgdWFzbV9sYWJlbCAqbCA9IGxhYmVsczsKKwlzdHJ1Y3QgdWFzbV9yZWxvYyAqciA9IHJlbG9jczsKKyNlbmRpZgorCisJLyoKKwkgKiBGb3IgdGhlIG5leHQgZmV3IGluc3RydWN0aW9ucyBydW5uaW5nIHRoZSBkZWJ1Z2dlciBtYXkKKwkgKiBjYXVzZSBjb3JydXB0aW9uIG9mIGswIGluIHRoZSBzYXZlZCByZWdpc3RlcnMuIFNpbmNlIHdlJ3JlCisJICogYWJvdXQgdG8gY3Jhc2gsIG5vYm9keSBwcm9iYWJseSBjYXJlcy4KKwkgKgorCSAqIFNhdmUgSzAgaW50byB0aGUgZGVidWcgc2NyYXRjaCByZWdpc3RlcgorCSAqLworCXVhc21faV9kbXRjMCgmcCwgSzAsIEMwX0RFU0FWRSk7CisKKwl1YXNtX2lfbWZjMCgmcCwgSzAsIEMwX1NUQVRVUyk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJdWFzbV9pbF9iYml0MCgmcCwgJnIsIEswLCBpbG9nMihTVDBfTk1JKSwgbGFiZWxfZW50ZXJfYm9vdGxvYWRlcik7CisjZW5kaWYKKwkvKiBGb3JjZSA2NC1iaXQgYWRkcmVzc2luZyBlbmFibGVkICovCisJdWFzbV9pX29yaSgmcCwgSzAsIEswLCBTVDBfVVggfCBTVDBfU1ggfCBTVDBfS1gpOworCXVhc21faV9tdGMwKCZwLCBLMCwgQzBfU1RBVFVTKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCXVhc21faV9tZmMwKCZwLCBLMCwgQzBfRUJBU0UpOworCS8qIENvcmVpZCBudW1iZXIgaW4gSzAgKi8KKwl1YXNtX2lfYW5kaSgmcCwgSzAsIEswLCAweGYpOworCS8qIDggKiBjb3JlaWQgaW4gYml0cyAxNi0zMSAqLworCXVhc21faV9kc2xsX3NhZmUoJnAsIEswLCBLMCwgMyArIDE2KTsKKwl1YXNtX2lfb3JpKCZwLCBLMCwgSzAsIDB4ODAwMSk7CisJdWFzbV9pX2RzbGxfc2FmZSgmcCwgSzAsIEswLCAxNik7CisJdWFzbV9pX29yaSgmcCwgSzAsIEswLCAweDA3MDApOworCXVhc21faV9kcm90cl9zYWZlKCZwLCBLMCwgSzAsIDMyKTsKKwkvKgorCSAqIFNob3VsZCByZXN1bHQgaW46IDB4ODAwMSwwNzAwLDAwMDAsOCpjb3JlaWQgd2hpY2ggaXMKKwkgKiBDVk1YX0NJVV9XRE9HWChjb3JlaWQpIC0gMHgwNTAwCisJICoKKwkgKiBOb3cgbGQgSzAsIENWTVhfQ0lVX1dET0dYKGNvcmVpZCkKKwkgKi8KKwl1YXNtX2lfbGQoJnAsIEswLCAweDUwMCwgSzApOworCS8qCisJICogSWYgYml0IG9uZSBzZXQgaGFuZGxlIHRoZSBOTUkgYXMgYSB3YXRjaGRvZyBldmVudC4KKwkgKiBvdGhlcndpc2UgdHJhbnNmZXIgY29udHJvbCB0byBib290bG9hZGVyLgorCSAqLworCXVhc21faWxfYmJpdDAoJnAsICZyLCBLMCwgMSwgbGFiZWxfZW50ZXJfYm9vdGxvYWRlcik7CisJdWFzbV9pX25vcCgmcCk7CisjZW5kaWYKKworCS8qIENsZWFyIERjYWNoZSBzbyBjdm1zZWcgd29ya3MgcmlnaHQuICovCisJdWFzbV9pX2NhY2hlKCZwLCAxLCAwLCAwKTsKKworCS8qIFVzZSBLMCB0byBkbyBhIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIENWTU1FTUNUTCAqLworCXVhc21faV9kbWZjMCgmcCwgSzAsIEMwX0NWTU1FTUNUTCk7CisJLyogQ2xlYXIgb3V0IHRoZSBzaXplIG9mIENWTVNFRwkqLworCXVhc21faV9kaW5zKCZwLCBLMCwgMCwgMCwgNik7CisJLyogU2V0IENWTVNFRyB0byBpdHMgbGFyZ2VzdCB2YWx1ZSAqLworCXVhc21faV9vcmkoJnAsIEswLCBLMCwgMHgxYzAgfCA1NCk7CisJLyogU3RvcmUgdGhlIENWTU1FTUNUTCB2YWx1ZSAqLworCXVhc21faV9kbXRjMCgmcCwgSzAsIEMwX0NWTU1FTUNUTCk7CisKKwkvKiBMb2FkIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWNvbmQgc3RhZ2UgaGFuZGxlciAqLworCVVBU01faV9MQSgmcCwgSzAsIChsb25nKW9jdGVvbl93ZHRfbm1pX3N0YWdlMik7CisJdWFzbV9pX2pyKCZwLCBLMCk7CisJdWFzbV9pX2RtZmMwKCZwLCBLMCwgQzBfREVTQVZFKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCXVhc21fYnVpbGRfbGFiZWwoJmwsIHAsIGxhYmVsX2VudGVyX2Jvb3Rsb2FkZXIpOworCS8qIEp1bXAgdG8gdGhlIGJvb3Rsb2FkZXIgYW5kIHJlc3RvcmUgSzAgKi8KKwlVQVNNX2lfTEEoJnAsIEswLCAobG9uZylvY3Rlb25fYm9vdGxvYWRlcl9lbnRyeV9hZGRyKTsKKwl1YXNtX2lfanIoJnAsIEswKTsKKwl1YXNtX2lfZG1mYzAoJnAsIEswLCBDMF9ERVNBVkUpOworI2VuZGlmCisJdWFzbV9yZXNvbHZlX3JlbG9jcyhyZWxvY3MsIGxhYmVscyk7CisKKwlsZW4gPSAoaW50KShwIC0gbm1pX3N0YWdlMV9pbnNucyk7CisJcHJfZGVidWcoIlN5bnRoZXNpemVkIE5NSSBzdGFnZSAxIGhhbmRsZXIgKCVkIGluc3RydWN0aW9ucykuXG4iLCBsZW4pOworCisJcHJfZGVidWcoIlx0LnNldCBwdXNoXG4iKTsKKwlwcl9kZWJ1ZygiXHQuc2V0IG5vcmVvcmRlclxuIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcl9kZWJ1ZygiXHQud29yZCAweCUwOHhcbiIsIG5taV9zdGFnZTFfaW5zbnNbaV0pOworCXByX2RlYnVnKCJcdC5zZXQgcG9wXG4iKTsKKworCWlmIChsZW4gPiAzMikKKwkJcGFuaWMoIk5NSSBzdGFnZSAxIGhhbmRsZXIgZXhjZWVkcyAzMiBpbnN0cnVjdGlvbnMsIHdhcyAlZFxuIiwgbGVuKTsKK30KKworc3RhdGljIGludCBjcHUyY29yZShpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19TTVAKKwlyZXR1cm4gY3B1X2xvZ2ljYWxfbWFwKGNwdSk7CisjZWxzZQorCXJldHVybiBjdm14X2dldF9jb3JlX251bSgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgY29yZTJjcHUoaW50IGNvcmVpZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIGNwdV9udW1iZXJfbWFwKGNvcmVpZCk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKy8qKgorICogUG9rZSB0aGUgd2F0Y2hkb2cgd2hlbiBhbiBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQKKyAqCisgKiBAY3BsOgorICogQGRldl9pZDoKKyAqCisgKiBSZXR1cm5zCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBvY3Rlb25fd2R0X3Bva2VfaXJxKGludCBjcGwsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY29yZSA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJaW50IGNwdSA9IGNvcmUyY3B1KGNvcmUpOworCisJaWYgKGRvX2NvdW5kb3duKSB7CisJCWlmIChwZXJfY3B1X2NvdW50ZG93bltjcHVdID4gMCkgeworCQkJLyogV2UncmUgYWxpdmUsIHBva2UgdGhlIHdhdGNoZG9nICovCisJCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9QUF9QT0tFWChjb3JlKSwgMSk7CisJCQlwZXJfY3B1X2NvdW50ZG93bltjcHVdLS07CisJCX0gZWxzZSB7CisJCQkvKiBCYWQgbmV3cywgeW91IGFyZSBhYm91dCB0byByZWJvb3QuICovCisJCQlkaXNhYmxlX2lycV9ub3N5bmMoY3BsKTsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJmlycV9lbmFibGVkX2NwdXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogTm90IG9wZW4sIGp1c3QgcGluZyBhd2F5Li4uICovCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1BQX1BPS0VYKGNvcmUpLCAxKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBGcm9tIHNldHVwLmMgKi8KK2V4dGVybiBpbnQgcHJvbV9wdXRjaGFyKGNoYXIgYyk7CisKKy8qKgorICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHVhcnQKKyAqCisgKiBAc3RyOiAgICAgICAgU3RyaW5nIHRvIHdyaXRlCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKK3sKKwkvKiBKdXN0IGxvb3Agd3JpdGluZyBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KKwl3aGlsZSAoKnN0cikKKwkJcHJvbV9wdXRjaGFyKCpzdHIrKyk7Cit9CisKKy8qKgorICogV3JpdGUgYSBoZXggbnVtYmVyIG91dCBvZiB0aGUgdWFydAorICoKKyAqIEB2YWx1ZTogICAgICBOdW1iZXIgdG8gZGlzcGxheQorICogQGRpZ2l0czogICAgIE51bWJlciBvZiBkaWdpdHMgdG8gcHJpbnQgKDEgdG8gMTYpCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl93ZHRfd3JpdGVfaGV4KHU2NCB2YWx1ZSwgaW50IGRpZ2l0cykKK3sKKwlpbnQgZDsKKwlpbnQgdjsKKwlmb3IgKGQgPSAwOyBkIDwgZGlnaXRzOyBkKyspIHsKKwkJdiA9ICh2YWx1ZSA+PiAoKGRpZ2l0cyAtIGQgLSAxKSAqIDQpKSAmIDB4ZjsKKwkJaWYgKHYgPj0gMTApCisJCQlwcm9tX3B1dGNoYXIoJ2EnICsgdiAtIDEwKTsKKwkJZWxzZQorCQkJcHJvbV9wdXRjaGFyKCcwJyArIHYpOworCX0KK30KKworY29uc3QgY2hhciAqcmVnX25hbWVbXSA9IHsKKwkiJDAiLCAiYXQiLCAidjAiLCAidjEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLAorCSJhNCIsICJhNSIsICJhNiIsICJhNyIsICJ0MCIsICJ0MSIsICJ0MiIsICJ0MyIsCisJInMwIiwgInMxIiwgInMyIiwgInMzIiwgInM0IiwgInM1IiwgInM2IiwgInM3IiwKKwkidDgiLCAidDkiLCAiazAiLCAiazEiLCAiZ3AiLCAic3AiLCAiczgiLCAicmEiCit9OworCisvKioKKyAqIE5NSSBzdGFnZSAzIGhhbmRsZXIuIE5NSXMgYXJlIGhhbmRsZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisgKiAxKSBUaGUgZmlyc3QgTk1JIGhhbmRsZXIgZW5hYmxlcyBDVk1TRUcgYW5kIHRyYW5zZmVycyBmcm9tCisgKiB0aGUgYm9vdGJ1cyByZWdpb24gaW50byBub3JtYWwgbWVtb3J5LiBJdCBpcyBjYXJlZnVsIHRvIG5vdAorICogZGVzdHJveSBhbnkgcmVnaXN0ZXJzLgorICogMikgVGhlIHNlY29uZCBzdGFnZSBoYW5kbGVyIHVzZXMgQ1ZNU0VHIHRvIHNhdmUgdGhlIHJlZ2lzdGVycworICogYW5kIGNyZWF0ZSBhIHN0YWNrIGZvciBDIGNvZGUuIEl0IHRoZW4gY2FsbHMgdGhlIHRoaXJkIGxldmVsCisgKiBoYW5kbGVyIHdpdGggb25lIGFyZ3VtZW50LCBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIHZhbHVlcy4KKyAqIDMpIFRoZSB0aGlyZCwgYW5kIGZpbmFsLCBsZXZlbCBoYW5kbGVyIGlzIHRoZSBmb2xsb3dpbmcgQworICogZnVuY3Rpb24gdGhhdCBwcmludHMgb3V0IHNvbWUgdXNlZnVsIGluZm9tcmF0aW9uLgorICoKKyAqIEByZWc6ICAgIFBvaW50ZXIgdG8gcmVnaXN0ZXIgc3RhdGUgYmVmb3JlIHRoZSBOTUkKKyAqLwordm9pZCBvY3Rlb25fd2R0X25taV9zdGFnZTModTY0IHJlZ1szMl0pCit7CisJdTY0IGk7CisKKwl1bnNpZ25lZCBpbnQgY29yZWlkID0gY3ZteF9nZXRfY29yZV9udW0oKTsKKwkvKgorCSAqIFNhdmUgc3RhdHVzIGFuZCBjYXVzZSBlYXJseSB0byBnZXQgdGhlbSBiZWZvcmUgYW55IGNoYW5nZXMKKwkgKiBtaWdodCBoYXBwZW4uCisJICovCisJdTY0IGNwMF9jYXVzZSA9IHJlYWRfYzBfY2F1c2UoKTsKKwl1NjQgY3AwX3N0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCk7CisJdTY0IGNwMF9lcnJvcl9lcGMgPSByZWFkX2MwX2Vycm9yZXBjKCk7CisJdTY0IGNwMF9lcGMgPSByZWFkX2MwX2VwYygpOworCisJLyogRGVsYXkgc28gb3V0cHV0IGZyb20gYWxsIGNvcmVzIG91dHB1dCBpcyBub3QganVtYmxlZCB0b2dldGhlci4gKi8KKwlfX2RlbGF5KDEwMDAwMDAwMHVsbCAqIGNvcmVpZCk7CisKKwlvY3Rlb25fd2R0X3dyaXRlX3N0cmluZygiXHJcbioqKiBOTUkgV2F0Y2hkb2cgaW50ZXJydXB0IG9uIENvcmUgMHgiKTsKKwlvY3Rlb25fd2R0X3dyaXRlX2hleChjb3JlaWQsIDEpOworCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCIgKioqXHJcbiIpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCJcdCIpOworCQlvY3Rlb25fd2R0X3dyaXRlX3N0cmluZyhyZWdfbmFtZVtpXSk7CisJCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCJcdDB4Iik7CisJCW9jdGVvbl93ZHRfd3JpdGVfaGV4KHJlZ1tpXSwgMTYpOworCQlpZiAoaSAmIDEpCisJCQlvY3Rlb25fd2R0X3dyaXRlX3N0cmluZygiXHJcbiIpOworCX0KKwlvY3Rlb25fd2R0X3dyaXRlX3N0cmluZygiXHRlcnJfZXBjXHQweCIpOworCW9jdGVvbl93ZHRfd3JpdGVfaGV4KGNwMF9lcnJvcl9lcGMsIDE2KTsKKworCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCJcdGVwY1x0MHgiKTsKKwlvY3Rlb25fd2R0X3dyaXRlX2hleChjcDBfZXBjLCAxNik7CisJb2N0ZW9uX3dkdF93cml0ZV9zdHJpbmcoIlxyXG4iKTsKKworCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCJcdHN0YXR1c1x0MHgiKTsKKwlvY3Rlb25fd2R0X3dyaXRlX2hleChjcDBfc3RhdHVzLCAxNik7CisJb2N0ZW9uX3dkdF93cml0ZV9zdHJpbmcoIlx0Y2F1c2VcdDB4Iik7CisJb2N0ZW9uX3dkdF93cml0ZV9oZXgoY3AwX2NhdXNlLCAxNik7CisJb2N0ZW9uX3dkdF93cml0ZV9zdHJpbmcoIlxyXG4iKTsKKworCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCJcdHN1bTBcdDB4Iik7CisJb2N0ZW9uX3dkdF93cml0ZV9oZXgoY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX1NVTTAoY29yZWlkICogMikpLCAxNik7CisJb2N0ZW9uX3dkdF93cml0ZV9zdHJpbmcoIlx0ZW4wXHQweCIpOworCW9jdGVvbl93ZHRfd3JpdGVfaGV4KGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMikpLCAxNik7CisJb2N0ZW9uX3dkdF93cml0ZV9zdHJpbmcoIlxyXG4iKTsKKworCW9jdGVvbl93ZHRfd3JpdGVfc3RyaW5nKCIqKiogQ2hpcCBzb2Z0IHJlc2V0IHNvb24gKioqXHJcbiIpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25fd2R0X2Rpc2FibGVfaW50ZXJydXB0KGludCBjcHUpCit7CisJdW5zaWduZWQgaW50IGNvcmU7CisJdW5zaWduZWQgaW50IGlycTsKKwl1bmlvbiBjdm14X2NpdV93ZG9neCBjaXVfd2RvZzsKKworCWNvcmUgPSBjcHUyY29yZShjcHUpOworCisJaXJxID0gT0NURU9OX0lSUV9XRE9HMCArIGNvcmU7CisKKwkvKiBQb2tlIHRoZSB3YXRjaGRvZyB0byBjbGVhciBvdXQgaXRzIHN0YXRlICovCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfUFBfUE9LRVgoY29yZSksIDEpOworCisJLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUuICovCisJY2l1X3dkb2cudTY0ID0gMDsKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9XRE9HWChjb3JlKSwgY2l1X3dkb2cudTY0KTsKKworCWZyZWVfaXJxKGlycSwgb2N0ZW9uX3dkdF9wb2tlX2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl93ZHRfc2V0dXBfaW50ZXJydXB0KGludCBjcHUpCit7CisJdW5zaWduZWQgaW50IGNvcmU7CisJdW5zaWduZWQgaW50IGlycTsKKwl1bmlvbiBjdm14X2NpdV93ZG9neCBjaXVfd2RvZzsKKworCWNvcmUgPSBjcHUyY29yZShjcHUpOworCisJLyogRGlzYWJsZSBpdCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgd2l0aCB0aGUgaW50ZXJydXB0cy4gKi8KKwljaXVfd2RvZy51NjQgPSAwOworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1dET0dYKGNvcmUpLCBjaXVfd2RvZy51NjQpOworCisJcGVyX2NwdV9jb3VudGRvd25bY3B1XSA9IGNvdW50ZG93bl9yZXNldDsKKworCWlycSA9IE9DVEVPTl9JUlFfV0RPRzAgKyBjb3JlOworCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgb2N0ZW9uX3dkdF9wb2tlX2lycSwKKwkJCUlSUUZfRElTQUJMRUQsICJvY3Rlb25fd2R0Iiwgb2N0ZW9uX3dkdF9wb2tlX2lycSkpCisJCXBhbmljKCJvY3Rlb25fd2R0OiBDb3VsZG4ndCBvYnRhaW4gaXJxICVkIiwgaXJxKTsKKworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZpcnFfZW5hYmxlZF9jcHVzKTsKKworCS8qIFBva2UgdGhlIHdhdGNoZG9nIHRvIGNsZWFyIG91dCBpdHMgc3RhdGUgKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9QUF9QT0tFWChjb3JlKSwgMSk7CisKKwkvKiBGaW5hbGx5IGVuYWJsZSB0aGUgd2F0Y2hkb2cgbm93IHRoYXQgYWxsIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQgKi8KKwljaXVfd2RvZy51NjQgPSAwOworCWNpdV93ZG9nLnMubGVuID0gdGltZW91dF9jbnQ7CisJY2l1X3dkb2cucy5tb2RlID0gMzsJLyogMyA9IEludGVycnVwdCArIE5NSSArIFNvZnQtUmVzZXQgKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9XRE9HWChjb3JlKSwgY2l1X3dkb2cudTY0KTsKK30KKworc3RhdGljIGludCBvY3Rlb25fd2R0X2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKKwkJb2N0ZW9uX3dkdF9kaXNhYmxlX2ludGVycnVwdChjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9PTkxJTkU6CisJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJCW9jdGVvbl93ZHRfc2V0dXBfaW50ZXJydXB0KGNwdSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25fd2R0X3Bpbmcodm9pZCkKK3sKKwlpbnQgY3B1OworCWludCBjb3JlaWQ7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljb3JlaWQgPSBjcHUyY29yZShjcHUpOworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9QUF9QT0tFWChjb3JlaWQpLCAxKTsKKwkJcGVyX2NwdV9jb3VudGRvd25bY3B1XSA9IGNvdW50ZG93bl9yZXNldDsKKwkJaWYgKChjb3VudGRvd25fcmVzZXQgfHwgIWRvX2NvdW5kb3duKSAmJgorCQkgICAgIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmaXJxX2VuYWJsZWRfY3B1cykpIHsKKwkJCS8qIFdlIGhhdmUgdG8gZW5hYmxlIHRoZSBpcnEgKi8KKwkJCWludCBpcnEgPSBPQ1RFT05fSVJRX1dET0cwICsgY29yZWlkOworCQkJZW5hYmxlX2lycShpcnEpOworCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgJmlycV9lbmFibGVkX2NwdXMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvY3Rlb25fd2R0X2NhbGNfcGFyYW1ldGVycyhpbnQgdCkKK3sKKwl1bnNpZ25lZCBpbnQgcGVyaW9kczsKKworCXRpbWVvdXRfc2VjID0gbWF4X3RpbWVvdXRfc2VjOworCisKKwkvKgorCSAqIEZpbmQgdGhlIGxhcmdlc3QgaW50ZXJydXB0IHBlcmlvZCwgdGhhdCBjYW4gZXZlbmx5IGRpdmlkZQorCSAqIHRoZSByZXF1ZXN0ZWQgaGVhcnRiZWF0IHRpbWUuCisJICovCisJd2hpbGUgKCh0ICUgdGltZW91dF9zZWMpICE9IDApCisJCXRpbWVvdXRfc2VjLS07CisKKwlwZXJpb2RzID0gdCAvIHRpbWVvdXRfc2VjOworCisJLyoKKwkgKiBUaGUgbGFzdCB0d28gcGVyaW9kcyBhcmUgYWZ0ZXIgdGhlIGlycSBpcyBkaXNhYmxlZCwgYW5kCisJICogdGhlbiB0byB0aGUgbm1pLCBzbyB3ZSBzdWJ0cmFjdCB0aGVtIG9mZi4KKwkgKi8KKworCWNvdW50ZG93bl9yZXNldCA9IHBlcmlvZHMgPiAyID8gcGVyaW9kcyAtIDIgOiAwOworCWhlYXJ0YmVhdCA9IHQ7CisJdGltZW91dF9jbnQgPSAoKG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpID4+IDgpICogdGltZW91dF9zZWMpID4+IDg7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3dkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWludCBjcHU7CisJaW50IGNvcmVpZDsKKwl1bmlvbiBjdm14X2NpdV93ZG9neCBjaXVfd2RvZzsKKworCWlmICh0IDw9IDApCisJCXJldHVybiAtMTsKKworCW9jdGVvbl93ZHRfY2FsY19wYXJhbWV0ZXJzKHQpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJY29yZWlkID0gY3B1MmNvcmUoY3B1KTsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfUFBfUE9LRVgoY29yZWlkKSwgMSk7CisJCWNpdV93ZG9nLnU2NCA9IDA7CisJCWNpdV93ZG9nLnMubGVuID0gdGltZW91dF9jbnQ7CisJCWNpdV93ZG9nLnMubW9kZSA9IDM7CS8qIDMgPSBJbnRlcnJ1cHQgKyBOTUkgKyBTb2Z0LVJlc2V0ICovCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1dET0dYKGNvcmVpZCksIGNpdV93ZG9nLnU2NCk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1BQX1BPS0VYKGNvcmVpZCksIDEpOworCX0KKwlvY3Rlb25fd2R0X3BpbmcoKTsgLyogR2V0IHRoZSBpcnFzIGJhY2sgb24uICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJb2N0ZW9uX3dkdF93cml0ZToKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqCUBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKKyAqCUBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqCUEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICoJd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCisKK3N0YXRpYyBzc2l6ZV90IG9jdGVvbl93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gMTsKKwkJCX0KKwkJfQorCQlvY3Rlb25fd2R0X3BpbmcoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqCW9jdGVvbl93ZHRfaW9jdGw6CisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICoJQGNtZDogd2F0Y2hkb2cgY29tbWFuZAorICoJQGFyZzogYXJndW1lbnQgcG9pbnRlcgorICoKKyAqCVRoZSB3YXRjaGRvZyBBUEkgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgZnVuY3Rpb25zIGZvciBhbGwKKyAqCXdhdGNoZG9ncyBhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLiBXZSBvbmx5CisgKglhY3R1YWxseSB1c2VmdWxseSBzdXBwb3J0IHF1ZXJ5aW5nIGNhcGFiaWxpdGllcyBhbmQgc2V0dGluZworICoJdGhlIHRpbWVvdXQuCisgKi8KKworc3RhdGljIGxvbmcgb2N0ZW9uX3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IG5ld19oZWFydGJlYXQ7CisKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX1NFVFRJTUVPVVR8CisJCQkJCVdESU9GX01BR0lDQ0xPU0V8CisJCQkJCVdESU9GX0tFRVBBTElWRVBJTkcsCisJCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKKwkJLmlkZW50aXR5ID0JCSJPQ1RFT04iLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCW9jdGVvbl93ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAob2N0ZW9uX3dkdF9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIEZhbGwgdGhyb3VnaC4gKi8KKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoqCisgKglvY3Rlb25fd2R0X29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqCVRoZSB3YXRjaGRvZyBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLiBUaGUgd2F0Y2hkb2cgZGV2aWNlIGlzIHNpbmdsZQorICoJb3BlbiBhbmQgb24gb3BlbmluZyB3ZSBkbyBhIHBpbmcgdG8gcmVzZXQgdGhlIGNvdW50ZXJzLgorICovCisKK3N0YXRpYyBpbnQgb2N0ZW9uX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZvY3Rlb25fd2R0X2lzX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJQWN0aXZhdGUKKwkgKi8KKwlvY3Rlb25fd2R0X3BpbmcoKTsKKwlkb19jb3VuZG93biA9IDE7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKioKKyAqCW9jdGVvbl93ZHRfcmVsZWFzZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqCVRoZSB3YXRjaGRvZyBoYXMgYSBjb25maWd1cmFibGUgQVBJLiBUaGVyZSBpcyBhIHJlbGlnaW91cyBkaXNwdXRlCisgKgliZXR3ZWVuIHBlb3BsZSB3aG8gd2FudCB0aGVpciB3YXRjaGRvZyB0byBiZSBhYmxlIHRvIHNodXQgZG93biBhbmQKKyAqCXRob3NlIHdobyB3YW50IHRvIGJlIHN1cmUgaWYgdGhlIHdhdGNoZG9nIG1hbmFnZXIgZGllcyB0aGUgbWFjaGluZQorICoJcmVib290cy4gSW4gdGhlIGZvcm1lciBjYXNlIHdlIGRpc2FibGUgdGhlIGNvdW50ZXJzLCBpbiB0aGUgbGF0dGVyCisgKgljYXNlIHlvdSBoYXZlIHRvIG9wZW4gaXQgYWdhaW4gdmVyeSBzb29uLgorICovCisKK3N0YXRpYyBpbnQgb2N0ZW9uX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UpIHsKKwkJZG9fY291bmRvd24gPSAwOworCQlvY3Rlb25fd2R0X3BpbmcoKTsKKwl9IGVsc2UgeworCQlwcl9jcml0KCJvY3Rlb25fd2R0OiBXRFQgZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkuICBXRFQgd2lsbCBub3Qgc3RvcCFcbiIpOworCX0KKwljbGVhcl9iaXQoMCwgJm9jdGVvbl93ZHRfaXNfb3Blbik7CisJZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2N0ZW9uX3dkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gb2N0ZW9uX3dkdF93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBvY3Rlb25fd2R0X2lvY3RsLAorCS5vcGVuCQk9IG9jdGVvbl93ZHRfb3BlbiwKKwkucmVsZWFzZQk9IG9jdGVvbl93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBvY3Rlb25fd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJPSAid2F0Y2hkb2ciLAorCS5mb3BzCT0gJm9jdGVvbl93ZHRfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb2N0ZW9uX3dkdF9jcHVfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBvY3Rlb25fd2R0X2NwdV9jYWxsYmFjaywKK307CisKKworLyoqCisgKiBNb2R1bGUvIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBSZXR1cm5zIFplcm8gb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IF9faW5pdCBvY3Rlb25fd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCBjcHU7CisJdTY0ICpwdHI7CisKKwkvKgorCSAqIFdhdGNoZG9nIHRpbWUgZXhwaXJhdGlvbiBsZW5ndGggPSBUaGUgMTYgYml0cyBvZiBMRU4KKwkgKiByZXByZXNlbnQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBhIDI0IGJpdCBkZWNyZW1lbnRlcgorCSAqIHRoYXQgZGVjcmVtZW50cyBldmVyeSAyNTYgY3ljbGVzLgorCSAqCisJICogVHJ5IGZvciBhIHRpbWVvdXQgb2YgNSBzZWMsIGlmIHRoYXQgZmFpbHMgYSBzbWFsbGVyIG51bWJlcgorCSAqIG9mIGV2ZW4gc2Vjb25kcywKKwkgKi8KKwltYXhfdGltZW91dF9zZWMgPSA2OworCWRvIHsKKwkJbWF4X3RpbWVvdXRfc2VjLS07CisJCXRpbWVvdXRfY250ID0gKChvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKSA+PiA4KSAqIG1heF90aW1lb3V0X3NlYykgPj4gODsKKwl9IHdoaWxlICh0aW1lb3V0X2NudCA+IDY1NTM1KTsKKworCUJVR19PTih0aW1lb3V0X2NudCA9PSAwKTsKKworCW9jdGVvbl93ZHRfY2FsY19wYXJhbWV0ZXJzKGhlYXJ0YmVhdCk7CisKKwlwcl9pbmZvKCJvY3Rlb25fd2R0OiBJbml0aWFsIGdyYW51bGFyaXR5ICVkIFNlYy5cbiIsIHRpbWVvdXRfc2VjKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJm9jdGVvbl93ZHRfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIm9jdGVvbl93ZHQ6IGNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEJ1aWxkIHRoZSBOTUkgaGFuZGxlciAuLi4gKi8KKwlvY3Rlb25fd2R0X2J1aWxkX3N0YWdlMSgpOworCisJLyogLi4uIGFuZCBpbnN0YWxsIGl0LiAqLworCXB0ciA9ICh1NjQgKikgbm1pX3N0YWdlMV9pbnNuczsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQljdm14X3dyaXRlX2NzcihDVk1YX01JT19CT09UX0xPQ19BRFIsIGkgKiA4KTsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9NSU9fQk9PVF9MT0NfREFULCBwdHJbaV0pOworCX0KKwljdm14X3dyaXRlX2NzcihDVk1YX01JT19CT09UX0xPQ19DRkdYKDApLCAweDgxZmMwMDAwKTsKKworCWNwdW1hc2tfY2xlYXIoJmlycV9lbmFibGVkX2NwdXMpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCW9jdGVvbl93ZHRfc2V0dXBfaW50ZXJydXB0KGNwdSk7CisKKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm9jdGVvbl93ZHRfY3B1X25vdGlmaWVyKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIE1vZHVsZSAvIGRyaXZlciBzaHV0ZG93bgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgb2N0ZW9uX3dkdF9jbGVhbnVwKHZvaWQpCit7CisJaW50IGNwdTsKKworCW1pc2NfZGVyZWdpc3Rlcigmb2N0ZW9uX3dkdF9taXNjZGV2KTsKKworCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZvY3Rlb25fd2R0X2NwdV9ub3RpZmllcik7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpbnQgY29yZSA9IGNwdTJjb3JlKGNwdSk7CisJCS8qIERpc2FibGUgdGhlIHdhdGNoZG9nICovCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1dET0dYKGNvcmUpLCAwKTsKKwkJLyogRnJlZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJZnJlZV9pcnEoT0NURU9OX0lSUV9XRE9HMCArIGNvcmUsIG9jdGVvbl93ZHRfcG9rZV9pcnEpOworCX0KKwkvKgorCSAqIERpc2FibGUgdGhlIGJvb3QtYnVzIG1lbW9yeSwgdGhlIGNvZGUgaXQgcG9pbnRzIHRvIGlzIHNvb24KKwkgKiB0byBnbyBtaXNzaW5nLgorCSAqLworCWN2bXhfd3JpdGVfY3NyKENWTVhfTUlPX0JPT1RfTE9DX0NGR1goMCksIDApOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDYXZpdW0gTmV0d29ya3MgPHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDYXZpdW0gTmV0d29ya3MgT2N0ZW9uIFdhdGNoZG9nIGRyaXZlci4iKTsKK21vZHVsZV9pbml0KG9jdGVvbl93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChvY3Rlb25fd2R0X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9vY3Rlb24td2R0LW5taS5TIGIvZHJpdmVycy93YXRjaGRvZy9vY3Rlb24td2R0LW5taS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTAwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL29jdGVvbi13ZHQtbm1pLlMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBDYXZpdW0gTmV0d29ya3MKKyAqLworI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CisKKyNkZWZpbmUgU0FWRV9SRUcocikJc2QgJHIsIC0zMjc2OCs2OTEyLSgzMi1yKSo4KCQwKQorCisgICAgICAgIE5FU1RFRChvY3Rlb25fd2R0X25taV9zdGFnZTIsIDAsIHNwKQorCS5zZXQgCXB1c2gKKwkuc2V0IAlub3Jlb3JkZXIKKwkuc2V0IAlub2F0CisJLyogU2F2ZSBhbGwgcmVnaXN0ZXJzIHRvIHRoZSB0b3AgQ1ZNU0VHLiBUaGlzIHNob3VsZG4ndAorCSAqIGNvcnJ1cHQgYW55IHN0YXRlIHVzZWQgYnkgdGhlIGtlcm5lbC4gQWxzbyBhbGwgcmVnaXN0ZXJzCisJICogc2hvdWxkIGhhdmUgdGhlIHZhbHVlIHJpZ2h0IGJlZm9yZSB0aGUgTk1JLiAqLworCVNBVkVfUkVHKDApCisJU0FWRV9SRUcoMSkKKwlTQVZFX1JFRygyKQorCVNBVkVfUkVHKDMpCisJU0FWRV9SRUcoNCkKKwlTQVZFX1JFRyg1KQorCVNBVkVfUkVHKDYpCisJU0FWRV9SRUcoNykKKwlTQVZFX1JFRyg4KQorCVNBVkVfUkVHKDkpCisJU0FWRV9SRUcoMTApCisJU0FWRV9SRUcoMTEpCisJU0FWRV9SRUcoMTIpCisJU0FWRV9SRUcoMTMpCisJU0FWRV9SRUcoMTQpCisJU0FWRV9SRUcoMTUpCisJU0FWRV9SRUcoMTYpCisJU0FWRV9SRUcoMTcpCisJU0FWRV9SRUcoMTgpCisJU0FWRV9SRUcoMTkpCisJU0FWRV9SRUcoMjApCisJU0FWRV9SRUcoMjEpCisJU0FWRV9SRUcoMjIpCisJU0FWRV9SRUcoMjMpCisJU0FWRV9SRUcoMjQpCisJU0FWRV9SRUcoMjUpCisJU0FWRV9SRUcoMjYpCisJU0FWRV9SRUcoMjcpCisJU0FWRV9SRUcoMjgpCisJU0FWRV9SRUcoMjkpCisJU0FWRV9SRUcoMzApCisJU0FWRV9SRUcoMzEpCisJLyogU2V0IHRoZSBzdGFjayB0byBiZWdpbiByaWdodCBiZWxvdyB0aGUgcmVnaXN0ZXJzICovCisJbGkJc3AsIC0zMjc2OCs2OTEyLTMyKjgKKwkvKiBMb2FkIHRoZSBhZGRyZXNzIG9mIHRoZSB0aGlyZCBzdGFnZSBoYW5kbGVyICovCisJZGxhCWEwLCBvY3Rlb25fd2R0X25taV9zdGFnZTMKKwkvKiBDYWxsIHRoZSB0aGlyZCBzdGFnZSBoYW5kbGVyICovCisJamFsCWEwCisJLyogYTAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyAqLworCSBtb3ZlCWEwLCBzcAorCS8qIExvb3AgZm9ydmV2ZXIgaWYgd2UgZ2V0IGhlcmUuICovCisxOgliCTFiCisJbm9wCisJLnNldCBwb3AKKwlFTkQob2N0ZW9uX3dkdF9ubWlfc3RhZ2UyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jIGIvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jCmluZGV4IDVkY2VlZGQuLjQwODJiNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMKQEAgLTI1MCwxMiArMjUwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHJpb3dkX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZyaW93ZF9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcmlvd2RfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHJpb3dkX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmcmlvd2RfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcmlvd2RfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQocmlvd2RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9LY29uZmlnIGIvZHJpdmVycy94ZW4vS2NvbmZpZwppbmRleCBmYWQzZGYyLi4wYTg4MjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMveGVuL0tjb25maWcKQEAgLTYyLDQgKzYyLDEzIEBACiAJIHZpcnR1YWwgZW52aXJvbm1lbnQsIC9zeXMvaHlwZXJ2aXNvciB3aWxsIHN0aWxsIGJlIHByZXNlbnQsCiAJIGJ1dCB3aWxsIGhhdmUgbm8geGVuIGNvbnRlbnRzLgogCitjb25maWcgWEVOX1BMQVRGT1JNX1BDSQorCXRyaXN0YXRlICJ4ZW4gcGxhdGZvcm0gcGNpIGRldmljZSBkcml2ZXIiCisJZGVwZW5kcyBvbiBYRU5fUFZIVk0KKwlkZWZhdWx0IG0KKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBYZW4gUENJIFBsYXRmb3JtIGRldmljZTogaXQgaXMgcmVzcG9uc2libGUgZm9yCisJICBpbml0aWFsaXppbmcgeGVuYnVzIGFuZCBncmFudF90YWJsZSB3aGVuIHJ1bm5pbmcgaW4gYSBYZW4gSFZNCisJICBkb21haW4uIEFzIGEgY29uc2VxdWVuY2UgdGhpcyBkcml2ZXIgaXMgcmVxdWlyZWQgdG8gcnVuIGFueSBYZW4gUFYKKwkgIGZyb250ZW5kIG9uIFhlbiBIVk0uCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9NYWtlZmlsZSBiL2RyaXZlcnMveGVuL01ha2VmaWxlCmluZGV4IDdjMjg0MzQuLmUzOTJmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMveGVuL01ha2VmaWxlCkBAIC05LDQgKzksNSBAQAogb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSBiYWxsb29uLm8KIG9iai0kKENPTkZJR19YRU5fREVWX0VWVENITikJKz0gZXZ0Y2huLm8KIG9iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLwotb2JqLSQoQ09ORklHX1hFTl9TWVNfSFlQRVJWSVNPUikJKz0gc3lzLWh5cGVydmlzb3IubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai0kKENPTkZJR19YRU5fU1lTX0hZUEVSVklTT1IpCSs9IHN5cy1oeXBlcnZpc29yLm8KK29iai0kKENPTkZJR19YRU5fUExBVEZPUk1fUENJKQkrPSBwbGF0Zm9ybS1wY2kubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCBkYjhmNTA2Li41ZTFmMzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KQEAgLTM2LDEwICszNywxNCBAQAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CisjaW5jbHVkZSA8eGVuL2h2bS5oPgogI2luY2x1ZGUgPHhlbi94ZW4tb3BzLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ldmVudF9jaGFubmVsLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9odm0vaHZtX29wLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9odm0vcGFyYW1zLmg+CiAKIC8qCiAgKiBUaGlzIGxvY2sgcHJvdGVjdHMgdXBkYXRlcyB0byB0aGUgZm9sbG93aW5nIG1hcHBpbmcgYW5kIHJlZmVyZW5jZS1jb3VudApAQCAtMzM1LDkgKzM0MCwxOCBAQAogCWludCBpcnE7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCi0JZm9yIChpcnEgPSAwOyBpcnEgPCBucl9pcnFzOyBpcnErKykKKwlmb3IgKGlycSA9IDA7IGlycSA8IG5yX2lycXM7IGlycSsrKSB7CisJCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCQkvKiBvbmx5IDAtPjE1IGhhdmUgaW5pdCdkIGRlc2M7IGhhbmRsZSBpcnEgPiAxNiAqLworCQlpZiAoZGVzYyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmIChkZXNjLT5jaGlwID09ICZub19pcnFfY2hpcCkKKwkJCWJyZWFrOworCQlpZiAoZGVzYy0+Y2hpcCAhPSAmeGVuX2R5bmFtaWNfY2hpcCkKKwkJCWNvbnRpbnVlOwogCQlpZiAoaXJxX2luZm9baXJxXS50eXBlID09IElSUVRfVU5CT1VORCkKIAkJCWJyZWFrOworCX0KIAogCWlmIChpcnEgPT0gbnJfaXJxcykKIAkJcGFuaWMoIk5vIGF2YWlsYWJsZSBJUlEgdG8gYmluZCB0bzogaW5jcmVhc2UgbnJfaXJxcyFcbiIpOwpAQCAtMzQ2LDcgKzM2MCw3IEBACiAJaWYgKFdBUk5fT04oZGVzYyA9PSBOVUxMKSkKIAkJcmV0dXJuIC0xOwogCi0JZHluYW1pY19pcnFfaW5pdChpcnEpOworCWR5bmFtaWNfaXJxX2luaXRfa2VlcF9jaGlwX2RhdGEoaXJxKTsKIAogCXJldHVybiBpcnE7CiB9CkBAIC02MTcsMTcgKzYzMSwxMyBAQAogICogYSBiaXRzZXQgb2Ygd29yZHMgd2hpY2ggY29udGFpbiBwZW5kaW5nIGV2ZW50IGJpdHMuICBUaGUgc2Vjb25kCiAgKiBsZXZlbCBpcyBhIGJpdHNldCBvZiBwZW5kaW5nIGV2ZW50cyB0aGVtc2VsdmVzLgogICovCi12b2lkIHhlbl9ldnRjaG5fZG9fdXBjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX194ZW5fZXZ0Y2huX2RvX3VwY2FsbCh2b2lkKQogewogCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwogCXN0cnVjdCBzaGFyZWRfaW5mbyAqcyA9IEhZUEVSVklTT1Jfc2hhcmVkX2luZm87CiAJc3RydWN0IHZjcHVfaW5mbyAqdmNwdV9pbmZvID0gX19nZXRfY3B1X3Zhcih4ZW5fdmNwdSk7CiAgCXVuc2lnbmVkIGNvdW50OwogCi0JZXhpdF9pZGxlKCk7Ci0JaXJxX2VudGVyKCk7Ci0KIAlkbyB7CiAJCXVuc2lnbmVkIGxvbmcgcGVuZGluZ193b3JkczsKIApAQCAtNjY0LDE1ICs2NzQsMzIgQEAKIAogCQljb3VudCA9IF9fZ2V0X2NwdV92YXIoeGVkX25lc3RpbmdfY291bnQpOwogCQlfX2dldF9jcHVfdmFyKHhlZF9uZXN0aW5nX2NvdW50KSA9IDA7Ci0JfSB3aGlsZShjb3VudCAhPSAxKTsKKwl9IHdoaWxlIChjb3VudCAhPSAxIHx8IHZjcHVfaW5mby0+ZXZ0Y2huX3VwY2FsbF9wZW5kaW5nKTsKIAogb3V0OgotCWlycV9leGl0KCk7Ci0Jc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIAogCXB1dF9jcHUoKTsKIH0KIAordm9pZCB4ZW5fZXZ0Y2huX2RvX3VwY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CisKKwlleGl0X2lkbGUoKTsKKwlpcnFfZW50ZXIoKTsKKworCV9feGVuX2V2dGNobl9kb191cGNhbGwoKTsKKworCWlycV9leGl0KCk7CisJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKK30KKwordm9pZCB4ZW5faHZtX2V2dGNobl9kb191cGNhbGwodm9pZCkKK3sKKwlfX3hlbl9ldnRjaG5fZG9fdXBjYWxsKCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5faHZtX2V2dGNobl9kb191cGNhbGwpOworCiAvKiBSZWJpbmQgYSBuZXcgZXZlbnQgY2hhbm5lbCB0byBhbiBleGlzdGluZyBpcnEuICovCiB2b2lkIHJlYmluZF9ldnRjaG5faXJxKGludCBldnRjaG4sIGludCBpcnEpCiB7CkBAIC03MDgsNyArNzM1LDEwIEBACiAJc3RydWN0IGV2dGNobl9iaW5kX3ZjcHUgYmluZF92Y3B1OwogCWludCBldnRjaG4gPSBldnRjaG5fZnJvbV9pcnEoaXJxKTsKIAotCWlmICghVkFMSURfRVZUQ0hOKGV2dGNobikpCisJLyogZXZlbnRzIGRlbGl2ZXJlZCB2aWEgcGxhdGZvcm0gUENJIGludGVycnVwdHMgYXJlIGFsd2F5cworCSAqIHJvdXRlZCB0byB2Y3B1IDAgKi8KKwlpZiAoIVZBTElEX0VWVENITihldnRjaG4pIHx8CisJCSh4ZW5faHZtX2RvbWFpbigpICYmICF4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2spKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBTZW5kIGZ1dHVyZSBpbnN0YW5jZXMgb2YgdGhpcyBpbnRlcnJ1cHQgdG8gb3RoZXIgdmNwdS4gKi8KQEAgLTkzMyw2ICs5NjMsNDQgQEAKIAkucmV0cmlnZ2VyCT0gcmV0cmlnZ2VyX2R5bmlycSwKIH07CiAKK2ludCB4ZW5fc2V0X2NhbGxiYWNrX3ZpYSh1aW50NjRfdCB2aWEpCit7CisJc3RydWN0IHhlbl9odm1fcGFyYW0gYTsKKwlhLmRvbWlkID0gRE9NSURfU0VMRjsKKwlhLmluZGV4ID0gSFZNX1BBUkFNX0NBTExCQUNLX0lSUTsKKwlhLnZhbHVlID0gdmlhOworCXJldHVybiBIWVBFUlZJU09SX2h2bV9vcChIVk1PUF9zZXRfcGFyYW0sICZhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhlbl9zZXRfY2FsbGJhY2tfdmlhKTsKKworI2lmZGVmIENPTkZJR19YRU5fUFZIVk0KKy8qIFZlY3RvciBjYWxsYmFja3MgYXJlIGJldHRlciB0aGFuIFBDSSBpbnRlcnJ1cHRzIHRvIHJlY2VpdmUgZXZlbnQKKyAqIGNoYW5uZWwgbm90aWZpY2F0aW9ucyBiZWNhdXNlIHdlIGNhbiByZWNlaXZlIHZlY3RvciBjYWxsYmFja3Mgb24gYW55CisgKiB2Y3B1IGFuZCB3ZSBkb24ndCBuZWVkIFBDSSBzdXBwb3J0IG9yIEFQSUMgaW50ZXJhY3Rpb25zLiAqLwordm9pZCB4ZW5fY2FsbGJhY2tfdmVjdG9yKHZvaWQpCit7CisJaW50IHJjOworCXVpbnQ2NF90IGNhbGxiYWNrX3ZpYTsKKwlpZiAoeGVuX2hhdmVfdmVjdG9yX2NhbGxiYWNrKSB7CisJCWNhbGxiYWNrX3ZpYSA9IEhWTV9DQUxMQkFDS19WRUNUT1IoWEVOX0hWTV9FVlRDSE5fQ0FMTEJBQ0spOworCQlyYyA9IHhlbl9zZXRfY2FsbGJhY2tfdmlhKGNhbGxiYWNrX3ZpYSk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGZvciBYZW4gSFZNIGNhbGxiYWNrIHZlY3RvciIKKwkJCQkJIiBmYWlsZWQuXG4iKTsKKwkJCXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiWGVuIEhWTSBjYWxsYmFjayB2ZWN0b3IgZm9yIGV2ZW50IGRlbGl2ZXJ5IGlzICIKKwkJCQkiZW5hYmxlZFxuIik7CisJCS8qIGluIHRoZSByZXN0b3JlIGNhc2UgdGhlIHZlY3RvciBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCAqLworCQlpZiAoIXRlc3RfYml0KFhFTl9IVk1fRVZUQ0hOX0NBTExCQUNLLCB1c2VkX3ZlY3RvcnMpKQorCQkJYWxsb2NfaW50cl9nYXRlKFhFTl9IVk1fRVZUQ0hOX0NBTExCQUNLLCB4ZW5faHZtX2NhbGxiYWNrX3ZlY3Rvcik7CisJfQorfQorI2Vsc2UKK3ZvaWQgeGVuX2NhbGxiYWNrX3ZlY3Rvcih2b2lkKSB7fQorI2VuZGlmCisKIHZvaWQgX19pbml0IHhlbl9pbml0X0lSUSh2b2lkKQogewogCWludCBpOwpAQCAtOTQ3LDUgKzEwMTUsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfRVZFTlRfQ0hBTk5FTFM7IGkrKykKIAkJbWFza19ldnRjaG4oaSk7CiAKLQlpcnFfY3R4X2luaXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAoeGVuX2h2bV9kb21haW4oKSkgeworCQl4ZW5fY2FsbGJhY2tfdmVjdG9yKCk7CisJCW5hdGl2ZV9pbml0X0lSUSgpOworCX0gZWxzZSB7CisJCWlycV9jdHhfaW5pdChzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCmluZGV4IGY2NmRiM2IuLjZjNDUzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKKysrIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwpAQCAtMzcsMTEgKzM3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAjaW5jbHVkZSA8eGVuL2dyYW50X3RhYmxlLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTU5LDYgKzYxLDggQEAKIHN0YXRpYyBpbnQgZ250dGFiX2ZyZWVfY291bnQ7CiBzdGF0aWMgZ3JhbnRfcmVmX3QgZ250dGFiX2ZyZWVfaGVhZDsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ250dGFiX2xpc3RfbG9jayk7Cit1bnNpZ25lZCBsb25nIHhlbl9odm1fcmVzdW1lX2ZyYW1lczsKK0VYUE9SVF9TWU1CT0xfR1BMKHhlbl9odm1fcmVzdW1lX2ZyYW1lcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgZ3JhbnRfZW50cnkgKnNoYXJlZDsKIApAQCAtNDMzLDcgKzQzNyw3IEBACiAJcmV0dXJuIHF1ZXJ5Lm1heF9ucl9mcmFtZXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1heF9ucl9ncmFudF9mcmFtZXModm9pZCkKK3Vuc2lnbmVkIGludCBnbnR0YWJfbWF4X2dyYW50X2ZyYW1lcyh2b2lkKQogewogCXVuc2lnbmVkIGludCB4ZW5fbWF4ID0gX19tYXhfbnJfZ3JhbnRfZnJhbWVzKCk7CiAKQEAgLTQ0MSw2ICs0NDUsNyBAQAogCQlyZXR1cm4gYm9vdF9tYXhfbnJfZ3JhbnRfZnJhbWVzOwogCXJldHVybiB4ZW5fbWF4OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZ250dGFiX21heF9ncmFudF9mcmFtZXMpOwogCiBzdGF0aWMgaW50IGdudHRhYl9tYXAodW5zaWduZWQgaW50IHN0YXJ0X2lkeCwgdW5zaWduZWQgaW50IGVuZF9pZHgpCiB7CkBAIC00NDksNiArNDU0LDMwIEBACiAJdW5zaWduZWQgaW50IG5yX2dmcmFtZXMgPSBlbmRfaWR4ICsgMTsKIAlpbnQgcmM7CiAKKwlpZiAoeGVuX2h2bV9kb21haW4oKSkgeworCQlzdHJ1Y3QgeGVuX2FkZF90b19waHlzbWFwIHhhdHA7CisJCXVuc2lnbmVkIGludCBpID0gZW5kX2lkeDsKKwkJcmMgPSAwOworCQkvKgorCQkgKiBMb29wIGJhY2t3YXJkcywgc28gdGhhdCB0aGUgZmlyc3QgaHlwZXJjYWxsIGhhcyB0aGUgbGFyZ2VzdAorCQkgKiBpbmRleCwgZW5zdXJpbmcgdGhhdCB0aGUgdGFibGUgd2lsbCBncm93IG9ubHkgb25jZS4KKwkJICovCisJCWRvIHsKKwkJCXhhdHAuZG9taWQgPSBET01JRF9TRUxGOworCQkJeGF0cC5pZHggPSBpOworCQkJeGF0cC5zcGFjZSA9IFhFTk1BUFNQQUNFX2dyYW50X3RhYmxlOworCQkJeGF0cC5ncGZuID0gKHhlbl9odm1fcmVzdW1lX2ZyYW1lcyA+PiBQQUdFX1NISUZUKSArIGk7CisJCQlyYyA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9hZGRfdG9fcGh5c21hcCwgJnhhdHApOworCQkJaWYgKHJjICE9IDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkiZ3JhbnQgdGFibGUgYWRkX3RvX3BoeXNtYXAgZmFpbGVkLCBlcnI9JWRcbiIsIHJjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoaS0tID4gc3RhcnRfaWR4KTsKKworCQlyZXR1cm4gcmM7CisJfQorCiAJZnJhbWVzID0ga21hbGxvYyhucl9nZnJhbWVzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWZyYW1lcykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00NjUsNyArNDk0LDcgQEAKIAogCUJVR19PTihyYyB8fCBzZXR1cC5zdGF0dXMpOwogCi0JcmMgPSBhcmNoX2dudHRhYl9tYXBfc2hhcmVkKGZyYW1lcywgbnJfZ2ZyYW1lcywgbWF4X25yX2dyYW50X2ZyYW1lcygpLAorCXJjID0gYXJjaF9nbnR0YWJfbWFwX3NoYXJlZChmcmFtZXMsIG5yX2dmcmFtZXMsIGdudHRhYl9tYXhfZ3JhbnRfZnJhbWVzKCksCiAJCQkJICAgICZzaGFyZWQpOwogCUJVR19PTihyYyk7CiAKQEAgLTQ3Niw5ICs1MDUsMjcgQEAKIAogaW50IGdudHRhYl9yZXN1bWUodm9pZCkKIHsKLQlpZiAobWF4X25yX2dyYW50X2ZyYW1lcygpIDwgbnJfZ3JhbnRfZnJhbWVzKQorCXVuc2lnbmVkIGludCBtYXhfbnJfZ2ZyYW1lczsKKworCW1heF9ucl9nZnJhbWVzID0gZ250dGFiX21heF9ncmFudF9mcmFtZXMoKTsKKwlpZiAobWF4X25yX2dmcmFtZXMgPCBucl9ncmFudF9mcmFtZXMpCiAJCXJldHVybiAtRU5PU1lTOwotCXJldHVybiBnbnR0YWJfbWFwKDAsIG5yX2dyYW50X2ZyYW1lcyAtIDEpOworCisJaWYgKHhlbl9wdl9kb21haW4oKSkKKwkJcmV0dXJuIGdudHRhYl9tYXAoMCwgbnJfZ3JhbnRfZnJhbWVzIC0gMSk7CisKKwlpZiAoIXNoYXJlZCkgeworCQlzaGFyZWQgPSBpb3JlbWFwKHhlbl9odm1fcmVzdW1lX2ZyYW1lcywgUEFHRV9TSVpFICogbWF4X25yX2dmcmFtZXMpOworCQlpZiAoc2hhcmVkID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIkZhaWxlZCB0byBpb3JlbWFwIGdudHRhYiBzaGFyZSBmcmFtZXMhIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWdudHRhYl9tYXAoMCwgbnJfZ3JhbnRfZnJhbWVzIC0gMSk7CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IGdudHRhYl9zdXNwZW5kKHZvaWQpCkBAIC00OTUsNyArNTQyLDcgQEAKIAljdXIgPSBucl9ncmFudF9mcmFtZXM7CiAJZXh0cmEgPSAoKHJlcV9lbnRyaWVzICsgKEdSRUZTX1BFUl9HUkFOVF9GUkFNRS0xKSkgLwogCQkgR1JFRlNfUEVSX0dSQU5UX0ZSQU1FKTsKLQlpZiAoY3VyICsgZXh0cmEgPiBtYXhfbnJfZ3JhbnRfZnJhbWVzKCkpCisJaWYgKGN1ciArIGV4dHJhID4gZ250dGFiX21heF9ncmFudF9mcmFtZXMoKSkKIAkJcmV0dXJuIC1FTk9TUEM7CiAKIAlyYyA9IGdudHRhYl9tYXAoY3VyLCBjdXIgKyBleHRyYSAtIDEpOwpAQCAtNTA1LDE1ICs1NTIsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGdudHRhYl9pbml0KHZvaWQpCitpbnQgZ250dGFiX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgbWF4X25yX2dsaXN0X2ZyYW1lcywgbnJfZ2xpc3RfZnJhbWVzOwogCXVuc2lnbmVkIGludCBucl9pbml0X2dyZWZzOwogCi0JaWYgKCF4ZW5fZG9tYWluKCkpCi0JCXJldHVybiAtRU5PREVWOwotCiAJbnJfZ3JhbnRfZnJhbWVzID0gMTsKIAlib290X21heF9ucl9ncmFudF9mcmFtZXMgPSBfX21heF9ucl9ncmFudF9mcmFtZXMoKTsKIApAQCAtNTU2LDUgKzYwMCwxOCBAQAogCWtmcmVlKGdudHRhYl9saXN0KTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGdudHRhYl9pbml0KTsKIAotY29yZV9pbml0Y2FsbChnbnR0YWJfaW5pdCk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBfX2dudHRhYl9pbml0KHZvaWQpCit7CisJLyogRGVsYXkgZ3JhbnQtdGFibGUgaW5pdGlhbGl6YXRpb24gaW4gdGhlIFBWIG9uIEhWTSBjYXNlICovCisJaWYgKHhlbl9odm1fZG9tYWluKCkpCisJCXJldHVybiAwOworCisJaWYgKCF4ZW5fcHZfZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGdudHRhYl9pbml0KCk7Cit9CisKK2NvcmVfaW5pdGNhbGwoX19nbnR0YWJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9tYW5hZ2UuYyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCmluZGV4IDA3ZTg1N2IuLjE3OTliZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL21hbmFnZS5jCisrKyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAjaW5jbHVkZSA8eGVuL2dyYW50X3RhYmxlLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgpAQCAtMTcsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KICNpbmNsdWRlIDxhc20veGVuL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KIAogZW51bSBzaHV0ZG93bl9zdGF0ZSB7CiAJU0hVVERPV05fSU5WQUxJRCA9IC0xLApAQCAtMzMsMTAgKzM1LDMwIEBACiBzdGF0aWMgZW51bSBzaHV0ZG93bl9zdGF0ZSBzaHV0dGluZ19kb3duID0gU0hVVERPV05fSU5WQUxJRDsKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB4ZW5faHZtX3N1c3BlbmQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfc2h1dGRvd24gciA9IHsgLnJlYXNvbiA9IFNIVVRET1dOX3N1c3BlbmQgfTsKKwlpbnQgKmNhbmNlbGxlZCA9IGRhdGE7CisKKwlCVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7CisKKwkqY2FuY2VsbGVkID0gSFlQRVJWSVNPUl9zY2hlZF9vcChTQ0hFRE9QX3NodXRkb3duLCAmcik7CisKKwl4ZW5faHZtX3Bvc3Rfc3VzcGVuZCgqY2FuY2VsbGVkKTsKKwlnbnR0YWJfcmVzdW1lKCk7CisKKwlpZiAoISpjYW5jZWxsZWQpIHsKKwkJeGVuX2lycV9yZXN1bWUoKTsKKwkJeGVuX3RpbWVyX3Jlc3VtZSgpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHhlbl9zdXNwZW5kKHZvaWQgKmRhdGEpCiB7Ci0JaW50ICpjYW5jZWxsZWQgPSBkYXRhOwogCWludCBlcnI7CisJaW50ICpjYW5jZWxsZWQgPSBkYXRhOwogCiAJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCkBAIC0xMDYsNyArMTI4LDEwIEBACiAJCWdvdG8gb3V0X3Jlc3VtZTsKIAl9CiAKLQllcnIgPSBzdG9wX21hY2hpbmUoeGVuX3N1c3BlbmQsICZjYW5jZWxsZWQsIGNwdW1hc2tfb2YoMCkpOworCWlmICh4ZW5faHZtX2RvbWFpbigpKQorCQllcnIgPSBzdG9wX21hY2hpbmUoeGVuX2h2bV9zdXNwZW5kLCAmY2FuY2VsbGVkLCBjcHVtYXNrX29mKDApKTsKKwllbHNlCisJCWVyciA9IHN0b3BfbWFjaGluZSh4ZW5fc3VzcGVuZCwgJmNhbmNlbGxlZCwgY3B1bWFza19vZigwKSk7CiAKIAlkcG1fcmVzdW1lX25vaXJxKFBNU0dfUkVTVU1FKTsKIApAQCAtMjU1LDcgKzI4MCwxOSBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc2V0dXBfc2h1dGRvd25fZXZlbnQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IF9fc2V0dXBfc2h1dGRvd25fZXZlbnQodm9pZCkKK3sKKwkvKiBEZWxheSBpbml0aWFsaXphdGlvbiBpbiB0aGUgUFYgb24gSFZNIGNhc2UgKi8KKwlpZiAoeGVuX2h2bV9kb21haW4oKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXhlbl9wdl9kb21haW4oKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4geGVuX3NldHVwX3NodXRkb3duX2V2ZW50KCk7Cit9CisKK2ludCB4ZW5fc2V0dXBfc2h1dGRvd25fZXZlbnQodm9pZCkKIHsKIAlzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHhlbnN0b3JlX25vdGlmaWVyID0gewogCQkubm90aWZpZXJfY2FsbCA9IHNodXRkb3duX2V2ZW50CkBAIC0yNjQsNSArMzAxLDYgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3NldHVwX3NodXRkb3duX2V2ZW50KTsKIAotc3Vic3lzX2luaXRjYWxsKHNldHVwX3NodXRkb3duX2V2ZW50KTsKK3N1YnN5c19pbml0Y2FsbChfX3NldHVwX3NodXRkb3duX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3BsYXRmb3JtLXBjaS5jIGIvZHJpdmVycy94ZW4vcGxhdGZvcm0tcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxYjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3BsYXRmb3JtLXBjaS5jCkBAIC0wLDAgKzEsMjA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwbGF0Zm9ybS1wY2kuYworICoKKyAqIFhlbiBwbGF0Zm9ybSBQQ0kgZGV2aWNlIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgWGVuU291cmNlIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgQ2l0cml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8eGVuL3BsYXRmb3JtX3BjaS5oPgorI2luY2x1ZGUgPHhlbi9ncmFudF90YWJsZS5oPgorI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KKyNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5jbHVkZSA8eGVuL2h2bS5oPgorI2luY2x1ZGUgPHhlbi94ZW4tb3BzLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgICAgInhlbi1wbGF0Zm9ybS1wY2kiCisKK01PRFVMRV9BVVRIT1IoInNzbWl0aEB4ZW5zb3VyY2UuY29tIGFuZCBzdGVmYW5vLnN0YWJlbGxpbmlAZXUuY2l0cml4LmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYZW4gcGxhdGZvcm0gUENJIGRldmljZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGF0Zm9ybV9tbWlvOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxhdGZvcm1fbW1pb19hbGxvYzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsYXRmb3JtX21taW9sZW47CitzdGF0aWMgdWludDY0X3QgY2FsbGJhY2tfdmlhOworCit1bnNpZ25lZCBsb25nIGFsbG9jX3hlbl9tbWlvKHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWFkZHIgPSBwbGF0Zm9ybV9tbWlvICsgcGxhdGZvcm1fbW1pb19hbGxvYzsKKwlwbGF0Zm9ybV9tbWlvX2FsbG9jICs9IGxlbjsKKwlCVUdfT04ocGxhdGZvcm1fbW1pb19hbGxvYyA+IHBsYXRmb3JtX21taW9sZW4pOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBnZXRfY2FsbGJhY2tfdmlhKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU4IHBpbjsKKwlpbnQgaXJxOworCisJaXJxID0gcGRldi0+aXJxOworCWlmIChpcnEgPCAxNikKKwkJcmV0dXJuIGlycTsgLyogSVNBIElSUSAqLworCisJcGluID0gcGRldi0+cGluOworCisJLyogV2UgZG9uJ3Qga25vdyB0aGUgR1NJLiBTcGVjaWZ5IHRoZSBQQ0kgSU5UeCBsaW5lIGluc3RlYWQuICovCisJcmV0dXJuICgodWludDY0X3QpMHgwMSA8PCA1NikgfCAvKiBQQ0kgSU5UeCBpZGVudGlmaWVyICovCisJCSgodWludDY0X3QpcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpIDw8IDMyKSB8CisJCSgodWludDY0X3QpcGRldi0+YnVzLT5udW1iZXIgPDwgMTYpIHwKKwkJKCh1aW50NjRfdCkocGRldi0+ZGV2Zm4gJiAweGZmKSA8PCA4KSB8CisJCSgodWludDY0X3QpKHBpbiAtIDEpICYgMyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19odm1fZXZ0Y2huX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXhlbl9odm1fZXZ0Y2huX2RvX3VwY2FsbCgpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB4ZW5fYWxsb2NhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGRvX2h2bV9ldnRjaG5faW50ciwKKwkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCSJ4ZW4tcGxhdGZvcm0tcGNpIiwgcGRldik7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgZXJyOworCWlmICh4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2spCisJCXJldHVybiAwOworCWVyciA9IHhlbl9zZXRfY2FsbGJhY2tfdmlhKGNhbGxiYWNrX3ZpYSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9wY2lfcmVzdW1lIGZhaWx1cmUhXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsYXRmb3JtX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBpLCByZXQ7CisJbG9uZyBpb2FkZHIsIGlvbGVuOworCWxvbmcgbW1pb19hZGRyLCBtbWlvX2xlbjsKKwl1bnNpZ25lZCBpbnQgbWF4X25yX2dmcmFtZXM7CisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlvbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCW1taW9fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisKKwlpZiAobW1pb19hZGRyID09IDAgfHwgaW9hZGRyID09IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcmVzb3VyY2VzIGZvdW5kXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBwY2lfb3V0OworCX0KKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24obW1pb19hZGRyLCBtbWlvX2xlbiwgRFJWX05BTUUpID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTUVNIEkvTyByZXNvdXJjZSAweCVseCBAIDB4JWx4IGJ1c3lcbiIsCisJCSAgICAgICBtbWlvX2FkZHIsIG1taW9fbGVuKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHBjaV9vdXQ7CisJfQorCisJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgaW9sZW4sIERSVl9OQU1FKSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkkvTyByZXNvdXJjZSAweCVseCBAIDB4JWx4IGJ1c3lcbiIsCisJCSAgICAgICBpb2xlbiwgaW9hZGRyKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG1lbV9vdXQ7CisJfQorCisJcGxhdGZvcm1fbW1pbyA9IG1taW9fYWRkcjsKKwlwbGF0Zm9ybV9tbWlvbGVuID0gbW1pb19sZW47CisKKwlpZiAoIXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykgeworCQlyZXQgPSB4ZW5fYWxsb2NhdGVfaXJxKHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkIGVycj0lZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWNhbGxiYWNrX3ZpYSA9IGdldF9jYWxsYmFja192aWEocGRldik7CisJCXJldCA9IHhlbl9zZXRfY2FsbGJhY2tfdmlhKGNhbGxiYWNrX3ZpYSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IHRoZSBldnRjaG4gY2FsbGJhY2sgIgorCQkJCQkgImVycj0lZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbWF4X25yX2dmcmFtZXMgPSBnbnR0YWJfbWF4X2dyYW50X2ZyYW1lcygpOworCXhlbl9odm1fcmVzdW1lX2ZyYW1lcyA9IGFsbG9jX3hlbl9tbWlvKFBBR0VfU0laRSAqIG1heF9ucl9nZnJhbWVzKTsKKwlyZXQgPSBnbnR0YWJfaW5pdCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXhlbmJ1c19wcm9iZShOVUxMKTsKKwlyZXQgPSB4ZW5fc2V0dXBfc2h1dGRvd25fZXZlbnQoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKKworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgaW9sZW4pOworbWVtX291dDoKKwlyZWxlYXNlX21lbV9yZWdpb24obW1pb19hZGRyLCBtbWlvX2xlbik7CitwY2lfb3V0OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGxhdGZvcm1fcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9WRU5ET1JfSURfWEVOLCBQQ0lfREVWSUNFX0lEX1hFTl9QTEFURk9STSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBsYXRmb3JtX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGxhdGZvcm1fZHJpdmVyID0geworCS5uYW1lID0gICAgICAgICAgIERSVl9OQU1FLAorCS5wcm9iZSA9ICAgICAgICAgIHBsYXRmb3JtX3BjaV9pbml0LAorCS5pZF90YWJsZSA9ICAgICAgIHBsYXRmb3JtX3BjaV90YmwsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZV9lYXJseSA9ICAgcGxhdGZvcm1fcGNpX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1fcGNpX21vZHVsZV9pbml0KHZvaWQpCit7CisJLyogbm8gdW5wbHVnIGhhcyBiZWVuIGRvbmUsIElHTk9SRSBoYXNuJ3QgYmVlbiBzcGVjaWZpZWQ6IGp1c3QKKwkgKiByZXR1cm4gbm93ICovCisJaWYgKCF4ZW5fcGxhdGZvcm1fcGNpX3VucGx1ZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGxhdGZvcm1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGxhdGZvcm1fcGNpX21vZHVsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwppbmRleCAzNDc5MzMyLi4yOWJhYzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCkBAIC01Niw2ICs1Niw5IEBACiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAKKyNpbmNsdWRlIDx4ZW4vcGxhdGZvcm1fcGNpLmg+CisjaW5jbHVkZSA8eGVuL2h2bS5oPgorCiAjaW5jbHVkZSAieGVuYnVzX2NvbW1zLmgiCiAjaW5jbHVkZSAieGVuYnVzX3Byb2JlLmgiCiAKQEAgLTc1MiwxMCArNzU1LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICh4ZW5zdG9yZWRfcmVhZHkgPiAwKQotCQlyZXQgPSBuYi0+bm90aWZpZXJfY2FsbChuYiwgMCwgTlVMTCk7Ci0JZWxzZQotCQlibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmeGVuc3RvcmVfY2hhaW4sIG5iKTsKKwlibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmeGVuc3RvcmVfY2hhaW4sIG5iKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03NzksOCArNzc5LDIzIEBACiAJLyogTm90aWZ5IG90aGVycyB0aGF0IHhlbnN0b3JlIGlzIHVwICovCiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmeGVuc3RvcmVfY2hhaW4sIDAsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuYnVzX3Byb2JlKTsKIAotc3RhdGljIGludCBfX2luaXQgeGVuYnVzX3Byb2JlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHhlbmJ1c19wcm9iZV9pbml0Y2FsbCh2b2lkKQoreworCWlmICgheGVuX2RvbWFpbigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSB8fCB4ZW5faHZtX2RvbWFpbigpKQorCQlyZXR1cm4gMDsKKworCXhlbmJ1c19wcm9iZShOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKHhlbmJ1c19wcm9iZV9pbml0Y2FsbCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbmJ1c19pbml0KHZvaWQpCiB7CiAJaW50IGVyciA9IDA7CiAKQEAgLTgwNSwxMSArODIwLDI0IEBACiAJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKSB7CiAJCS8qIGRvbTAgbm90IHlldCBzdXBwb3J0ZWQgKi8KIAl9IGVsc2UgeworCQlpZiAoeGVuX2h2bV9kb21haW4oKSkgeworCQkJdWludDY0X3QgdiA9IDA7CisJCQllcnIgPSBodm1fZ2V0X3BhcmFtZXRlcihIVk1fUEFSQU1fU1RPUkVfRVZUQ0hOLCAmdik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X2Vycm9yOworCQkJeGVuX3N0b3JlX2V2dGNobiA9IChpbnQpdjsKKwkJCWVyciA9IGh2bV9nZXRfcGFyYW1ldGVyKEhWTV9QQVJBTV9TVE9SRV9QRk4sICZ2KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfZXJyb3I7CisJCQl4ZW5fc3RvcmVfbWZuID0gKHVuc2lnbmVkIGxvbmcpdjsKKwkJCXhlbl9zdG9yZV9pbnRlcmZhY2UgPSBpb3JlbWFwKHhlbl9zdG9yZV9tZm4gPDwgUEFHRV9TSElGVCwgUEFHRV9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCXhlbl9zdG9yZV9ldnRjaG4gPSB4ZW5fc3RhcnRfaW5mby0+c3RvcmVfZXZ0Y2huOworCQkJeGVuX3N0b3JlX21mbiA9IHhlbl9zdGFydF9pbmZvLT5zdG9yZV9tZm47CisJCQl4ZW5fc3RvcmVfaW50ZXJmYWNlID0gbWZuX3RvX3ZpcnQoeGVuX3N0b3JlX21mbik7CisJCX0KIAkJeGVuc3RvcmVkX3JlYWR5ID0gMTsKLQkJeGVuX3N0b3JlX2V2dGNobiA9IHhlbl9zdGFydF9pbmZvLT5zdG9yZV9ldnRjaG47Ci0JCXhlbl9zdG9yZV9tZm4gPSB4ZW5fc3RhcnRfaW5mby0+c3RvcmVfbWZuOwogCX0KLQl4ZW5fc3RvcmVfaW50ZXJmYWNlID0gbWZuX3RvX3ZpcnQoeGVuX3N0b3JlX21mbik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBpbnRlcmZhY2UgdG8geGVuc3RvcmUuICovCiAJZXJyID0geHNfaW5pdCgpOwpAQCAtODE5LDkgKzg0Nyw2IEBACiAJCWdvdG8gb3V0X3VucmVnX2JhY2s7CiAJfQogCi0JaWYgKCF4ZW5faW5pdGlhbF9kb21haW4oKSkKLQkJeGVuYnVzX3Byb2JlKE5VTEwpOwotCiAjaWZkZWYgQ09ORklHX1hFTl9DT01QQVRfWEVORlMKIAkvKgogCSAqIENyZWF0ZSB4ZW5mcyBtb3VudHBvaW50IGluIC9wcm9jIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKQEAgLTg0Miw3ICs4NjcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXBvc3Rjb3JlX2luaXRjYWxsKHhlbmJ1c19wcm9iZV9pbml0KTsKK3Bvc3Rjb3JlX2luaXRjYWxsKHhlbmJ1c19pbml0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCkBAIC05NTAsNiArOTc1LDkgQEAKICNpZm5kZWYgTU9EVUxFCiBzdGF0aWMgaW50IF9faW5pdCBib290X3dhaXRfZm9yX2RldmljZXModm9pZCkKIHsKKwlpZiAoeGVuX2h2bV9kb21haW4oKSAmJiAheGVuX3BsYXRmb3JtX3BjaV91bnBsdWcpCisJCXJldHVybiAtRU5PREVWOworCiAJcmVhZHlfdG9fd2FpdF9mb3JfZGV2aWNlcyA9IDE7CiAJd2FpdF9mb3JfZGV2aWNlcyhOVUxMKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYwppbmRleCA3YjU0N2Y1Li41NTM0NjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC03Niw2ICs3NiwxNCBAQAogCS8qCiAJICogTXV0ZXggb3JkZXJpbmc6IHRyYW5zYWN0aW9uX211dGV4IC0+IHdhdGNoX211dGV4IC0+IHJlcXVlc3RfbXV0ZXguCiAJICogcmVzcG9uc2VfbXV0ZXggaXMgbmV2ZXIgdGFrZW4gc2ltdWx0YW5lb3VzbHkgd2l0aCB0aGUgb3RoZXIgdGhyZWUuCisJICoKKwkgKiB0cmFuc2FjdGlvbl9tdXRleCBtdXN0IGJlIGhlbGQgYmVmb3JlIGluY3JlbWVudGluZworCSAqIHRyYW5zYWN0aW9uX2NvdW50LiBUaGUgbXV0ZXggaXMgaGVsZCB3aGVuIGEgc3VzcGVuZCBpcyBpbgorCSAqIHByb2dyZXNzIHRvIHByZXZlbnQgbmV3IHRyYW5zYWN0aW9ucyBzdGFydGluZy4KKwkgKgorCSAqIFdoZW4gZGVjcmVtZW50aW5nIHRyYW5zYWN0aW9uX2NvdW50IHRvIHplcm8gdGhlIHdhaXQgcXVldWUKKwkgKiBzaG91bGQgYmUgd29rZW4gdXAsIHRoZSBzdXNwZW5kIGNvZGUgd2FpdHMgZm9yIGNvdW50IHRvCisJICogcmVhY2ggemVyby4KIAkgKi8KIAogCS8qIE9uZSByZXF1ZXN0IGF0IGEgdGltZS4gKi8KQEAgLTg1LDcgKzkzLDkgQEAKIAlzdHJ1Y3QgbXV0ZXggcmVzcG9uc2VfbXV0ZXg7CiAKIAkvKiBQcm90ZWN0IHRyYW5zYWN0aW9ucyBhZ2FpbnN0IHNhdmUvcmVzdG9yZS4gKi8KLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIHRyYW5zYWN0aW9uX211dGV4OworCXN0cnVjdCBtdXRleCB0cmFuc2FjdGlvbl9tdXRleDsKKwlhdG9taWNfdCB0cmFuc2FjdGlvbl9jb3VudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0cmFuc2FjdGlvbl93cTsKIAogCS8qIFByb3RlY3Qgd2F0Y2ggKGRlKXJlZ2lzdGVyIGFnYWluc3Qgc2F2ZS9yZXN0b3JlLiAqLwogCXN0cnVjdCByd19zZW1hcGhvcmUgd2F0Y2hfbXV0ZXg7CkBAIC0xNTcsNiArMTY3LDMxIEBACiAJcmV0dXJuIGJvZHk7CiB9CiAKK3N0YXRpYyB2b2lkIHRyYW5zYWN0aW9uX3N0YXJ0KHZvaWQpCit7CisJbXV0ZXhfbG9jaygmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOworCWF0b21pY19pbmMoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX2NvdW50KTsKKwltdXRleF91bmxvY2soJnhzX3N0YXRlLnRyYW5zYWN0aW9uX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNhY3Rpb25fZW5kKHZvaWQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX2NvdW50KSkKKwkJd2FrZV91cCgmeHNfc3RhdGUudHJhbnNhY3Rpb25fd3EpOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2FjdGlvbl9zdXNwZW5kKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOworCXdhaXRfZXZlbnQoeHNfc3RhdGUudHJhbnNhY3Rpb25fd3EsCisJCSAgIGF0b21pY19yZWFkKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9jb3VudCkgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zYWN0aW9uX3Jlc3VtZSh2b2lkKQoreworCW11dGV4X3VubG9jaygmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOworfQorCiB2b2lkICp4ZW5idXNfZGV2X3JlcXVlc3RfYW5kX3JlcGx5KHN0cnVjdCB4c2Rfc29ja21zZyAqbXNnKQogewogCXZvaWQgKnJldDsKQEAgLTE2NCw3ICsxOTksNyBAQAogCWludCBlcnI7CiAKIAlpZiAocmVxX21zZy50eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKQotCQlkb3duX3JlYWQoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX211dGV4KTsKKwkJdHJhbnNhY3Rpb25fc3RhcnQoKTsKIAogCW11dGV4X2xvY2soJnhzX3N0YXRlLnJlcXVlc3RfbXV0ZXgpOwogCkBAIC0xODAsNyArMjE1LDcgQEAKIAlpZiAoKG1zZy0+dHlwZSA9PSBYU19UUkFOU0FDVElPTl9FTkQpIHx8CiAJICAgICgocmVxX21zZy50eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKSAmJgogCSAgICAgKG1zZy0+dHlwZSA9PSBYU19FUlJPUikpKQotCQl1cF9yZWFkKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7CisJCXRyYW5zYWN0aW9uX2VuZCgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQzMiwxMSArNDY3LDExIEBACiB7CiAJY2hhciAqaWRfc3RyOwogCi0JZG93bl9yZWFkKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7CisJdHJhbnNhY3Rpb25fc3RhcnQoKTsKIAogCWlkX3N0ciA9IHhzX3NpbmdsZShYQlRfTklMLCBYU19UUkFOU0FDVElPTl9TVEFSVCwgIiIsIE5VTEwpOwogCWlmIChJU19FUlIoaWRfc3RyKSkgewotCQl1cF9yZWFkKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7CisJCXRyYW5zYWN0aW9uX2VuZCgpOwogCQlyZXR1cm4gUFRSX0VSUihpZF9zdHIpOwogCX0KIApAQCAtNDYxLDcgKzQ5Niw3IEBACiAKIAllcnIgPSB4c19lcnJvcih4c19zaW5nbGUodCwgWFNfVFJBTlNBQ1RJT05fRU5ELCBhYm9ydHN0ciwgTlVMTCkpOwogCi0JdXBfcmVhZCgmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOworCXRyYW5zYWN0aW9uX2VuZCgpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTY2Miw3ICs2OTcsNyBAQAogCiB2b2lkIHhzX3N1c3BlbmQodm9pZCkKIHsKLQlkb3duX3dyaXRlKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7CisJdHJhbnNhY3Rpb25fc3VzcGVuZCgpOwogCWRvd25fd3JpdGUoJnhzX3N0YXRlLndhdGNoX211dGV4KTsKIAltdXRleF9sb2NrKCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4KTsKIAltdXRleF9sb2NrKCZ4c19zdGF0ZS5yZXNwb25zZV9tdXRleCk7CkBAIC02NzcsNyArNzEyLDcgQEAKIAogCW11dGV4X3VubG9jaygmeHNfc3RhdGUucmVzcG9uc2VfbXV0ZXgpOwogCW11dGV4X3VubG9jaygmeHNfc3RhdGUucmVxdWVzdF9tdXRleCk7Ci0JdXBfd3JpdGUoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX211dGV4KTsKKwl0cmFuc2FjdGlvbl9yZXN1bWUoKTsKIAogCS8qIE5vIG5lZWQgZm9yIHdhdGNoZXNfbG9jazogdGhlIHdhdGNoX211dGV4IGlzIHN1ZmZpY2llbnQuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YXRjaCwgJndhdGNoZXMsIGxpc3QpIHsKQEAgLTY5Myw3ICs3MjgsNyBAQAogCW11dGV4X3VubG9jaygmeHNfc3RhdGUucmVzcG9uc2VfbXV0ZXgpOwogCW11dGV4X3VubG9jaygmeHNfc3RhdGUucmVxdWVzdF9tdXRleCk7CiAJdXBfd3JpdGUoJnhzX3N0YXRlLndhdGNoX211dGV4KTsKLQl1cF93cml0ZSgmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOworCW11dGV4X3VubG9jaygmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IHhlbndhdGNoX3RocmVhZCh2b2lkICp1bnVzZWQpCkBAIC04NDMsOCArODc4LDEwIEBACiAKIAltdXRleF9pbml0KCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4KTsKIAltdXRleF9pbml0KCZ4c19zdGF0ZS5yZXNwb25zZV9tdXRleCk7Ci0JaW5pdF9yd3NlbSgmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOworCW11dGV4X2luaXQoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX211dGV4KTsKIAlpbml0X3J3c2VtKCZ4c19zdGF0ZS53YXRjaF9tdXRleCk7CisJYXRvbWljX3NldCgmeHNfc3RhdGUudHJhbnNhY3Rpb25fY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX3dxKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHNoYXJlZCBtZW1vcnkgcmluZ3MgdG8gdGFsayB0byB4ZW5zdG9yZWQgKi8KIAllcnIgPSB4Yl9pbml0X2NvbW1zKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwppbmRleCA4OTI0ZDkzLi43OGJmYWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgeGVuZnNfaW5pdCh2b2lkKQogewotCWlmICh4ZW5fcHZfZG9tYWluKCkpCisJaWYgKHhlbl9kb21haW4oKSkKIAkJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnhlbmZzX3R5cGUpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiWEVORlM6IG5vdCByZWdpc3RlcmluZyBmaWxlc3lzdGVtIG9uIG5vbi14ZW4gcGxhdGZvcm1cbiIpOwpAQCAtNzQsNyArNzQsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgeGVuZnNfZXhpdCh2b2lkKQogewotCWlmICh4ZW5fcHZfZG9tYWluKCkpCisJaWYgKHhlbl9kb21haW4oKSkKIAkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZW5mc190eXBlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYwppbmRleCBmMjhlY2UzLi4zYjM5YzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYworKysgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYwpAQCAtMTI0LDYgKzEyNCw5IEBACiAJbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0ZXgpOwogCXdoaWxlIChsaXN0X2VtcHR5KCZ1LT5yZWFkX2J1ZmZlcnMpKSB7CiAJCW11dGV4X3VubG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKwogCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodS0+cmVhZF93YWl0cSwKIAkJCQkJICAgICAgICFsaXN0X2VtcHR5KCZ1LT5yZWFkX2J1ZmZlcnMpKTsKIAkJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL01ha2VmaWxlIGIvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggMDIwZTYyOS4uYjI3ZjA5ZiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTQyLDcgKzQyLDcgQEAKIGZ3LXNoaXBwZWQtJChDT05GSUdfQ09NUFVUT05FKSArPSBpbnRlbGxpcG9ydDIuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX0NIRUxTSU9fVDMpICs9IGN4Z2IzL3QzYl9wc3JhbS0xLjEuMC5iaW4gXAogCQkJCSAgIGN4Z2IzL3QzY19wc3JhbS0xLjEuMC5iaW4gXAotCQkJCSAgIGN4Z2IzL3QzZnctNy40LjAuYmluIFwKKwkJCQkgICBjeGdiMy90M2Z3LTcuMTAuMC5iaW4gXAogCQkJCSAgIGN4Z2IzL2FlbDIwMDVfb3B0X2VkYy5iaW4gXAogCQkJCSAgIGN4Z2IzL2FlbDIwMDVfdHd4X2VkYy5iaW4gXAogCQkJCSAgIGN4Z2IzL2FlbDIwMjBfdHd4X2VkYy5iaW4KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2N4Z2IzL3QzZnctNy4xMC4wLmJpbi5paGV4IGIvZmlybXdhcmUvY3hnYjMvdDNmdy03LjEwLjAuYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzOTlkOAotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2N4Z2IzL3QzZnctNy4xMC4wLmJpbi5paGV4CkBAIC0wLDAgKzEsMTkzNSBAQAorOjEwMDAwMDAwNjAwMDc0MDAyMDAzODAwMDIwMDM3MDAwMDAwMDEwMDBENgorOjEwMDAxMDAwMDAwMDIwMDBFMTAwMDI4NDAwMDcwMDAwRTEwMDAyODhFNworOjEwMDAyMDAwMDAwMTAwMDBFMDAwMDAwMEUwMDAwMEEwMDEwMDAwMDA2RQorOjEwMDAzMDAwNDQ0NDQ0NDBFMzAwMDE4MzIwMDIwMDAwMjAwMUUwMDAyQQorOjEwMDA0MDAwMjAwMUZGMTAxRkZGRDAwMDFGRkZDMDAwRTMwMDA0M0M5MQorOjEwMDA1MDAwMDIwMDAwMDAyMDAwNkM4NDFGRkZDMkEwMjAwMDZDQ0NCNgorOjEwMDA2MDAwMUZGRkMyQTQyMDAwNkQwQzFGRkZDMkE4MjAwMDZEODBERQorOjEwMDA3MDAwMUZGRkMyQUMyMDAwMDNDMEMwMDAwMEU0MzEwMEVBMzEyMQorOjEwMDA4MDAwMDBBMTMxMDBBMDMxMDMwMjAwMDJFRDMwNkUyQTA1MDAwQworOjEwMDA5MDAwRUQzMTAwMDIwMDAyMTYwMDEyRkZEQkMwMzAxNEZGREE1RgorOjEwMDBBMDAwRDMwRkQzMEZEMzBGMDM0MzFGMjQ0QzEwNzI0OUYwRDM0NworOjEwMDBCMDAwMEZEMzBGRDMwRjEyRkZENTIzMEEwMDI0MEEwMEQzMEY0QQorOjEwMDBDMDAwRDMwRkQzMEYwMzQzMUYyNDRDMTA3MjQ5RjBEMzBGRDMyNworOjEwMDBEMDAwMEZEMzBGMTRGRkNFMDM0MjFGMTRGRkNCMDM0MjFGMTI5NgorOjEwMDBFMDAwRkZDQ0MwMzAyRDM3MzAyRDM3MzQyRDM3MzgyRDM3M0NFRAorOjEwMDBGMDAwMjMzRDAxNzIzM0VEMDAwMjAwMTJGRkM0QzAzMDJGMzdFMAorOjEwMDEwMDAwMDAyRjM3MTAyRjM3MjAyRjM3MzAyMzNEMDE3MjMzRUQ2QQorOjEwMDExMDAwMDAwMjAwMTJGRkJFQzAzMDI3MzcwMDI3MzcxMDI3MzdGNAorOjEwMDEyMDAwMjAyNzM3MzAyMzNEMDE3MjMzRUQwMzAyMDAxMkZGQjk1RgorOjEwMDEzMDAwMTNGRkJBMEMwMjAwOTMyMDEyRkZCOTEzRkZCOTBDMDI4RgorOjEwMDE0MDAwMDA5MzIwMTJGRkI4QzAzMTkzMjA4MjIwMTJGRkI3MTMxMgorOjEwMDE1MDAwRkZCNzkzMjAxMkZGQjcxNUZGQjMxNkZGQjZDMDMwRDcxNQorOjEwMDE2MDAwMjAwNTY2MDE2MDAwMUIwMDAwMDAwMDAwMDAwMDAwMDA4OAorOjEwMDE3MDAwMDQzNjA1MDAwMjAwRDMwRkQzMEYwNTMzMEM2RTNCMTQ3OQorOjEwMDE4MDAwMDc0NzE0MDcwNDQzNzYzMUU2MDQzNjA1MDUzMzBDNkY0MAorOjEwMDE5MDAwM0JFRDAwMDIwMDEyRkZBNjE1RkZBMzIzMEEwMEQ3MjBBMworOjEwMDFBMDAwMDcwNDQzMDQzRTA1MDUzMzBDMDc0NzE0NkYzQkYwMDM3NworOjEwMDFCMDAwMDIwMDEyRkZBMUMwMzAxNEZGQTFEMzBGRDMwRkQzMEY0MQorOjEwMDFDMDAwOTM0MEI0NDQ3MjQ5RjJEMzBGRDMwRkQzMEYxNEZGOUI2MworOjEwMDFEMDAwODM0MDE0RkY5QjgzNDAxMkZGOUIyMzBBMDAxNEZGOUE2NQorOjEwMDFFMDAwRDMwRkQzMEZEMzBGOTM0MEI0NDQ3MjQ5RjJEMzBGRDMzQworOjEwMDFGMDAwMEZEMzBGMTRGRjk1ODM0MDEyRkY5NUM5MkY4MzIwODRERQorOjEwMDIwMDAwMjE4NTIyQkMyMjc0M0IwRjg2NTBCNDU1OTYzMEI0MzNGRQorOjEwMDIxMDAwNzQzM0Y0NjNGRkU2MDAwMDY1M0ZFMTY1NUZERTEyRkZDMworOjEwMDIyMDAwN0MyMzBBMDAyODM3NDAyODM3NDQyODM3NDgyODM3NEM5MQorOjEwMDIzMDAwMjMzRDAxNzIzM0VEMDMwMjAwMDAwMjAwMTJGRjdBQzA3OQorOjEwMDI0MDAwMzIwMzJFMDUwMzAyMDAxMkZGNzgxM0ZGODE5MzIwQzBCMgorOjEwMDI1MDAwMTEwMTQ5MzEwMDQ4MzEwMTAyMDBDMDAwMTRGRjdFMDQ0MQorOjEwMDI2MDAwRDIzMTE1RkY3RDk0NTAxNEZGN0QwNEQzMzExNUZGN0NFRQorOjEwMDI3MDAwOTQ1MDE0RkY3QzA0RDQzMTE1RkY3QzI0NTYwMDE0RkZFNQorOjEwMDI4MDAwN0IwNEQ1MzExNUZGN0IyNDU2MDAxMEZGN0EwMzAwMDA1NAorOjEwMDI5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1RQorOjEwMDJBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0RQorOjEwMDJCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRQorOjEwMDJDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyRQorOjEwMDJEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRQorOjEwMDJFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRQorOjEwMDJGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRQorOjEwMDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFRAorOjEwMDMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBERAorOjEwMDMyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDRAorOjEwMDMzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCRAorOjEwMDM0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBRAorOjEwMDM1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5RAorOjEwMDM2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4RAorOjEwMDM3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RAorOjEwMDM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2RAorOjEwMDM5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1RAorOjEwMDNBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0RAorOjEwMDNCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRAorOjEwMDNDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyRAorOjEwMDNEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRAorOjEwMDNFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRAorOjEwMDNGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRAorOjEwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFQworOjEwMDQxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBEQworOjEwMDQyMDAwNjNGRkZDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2RQorOjEwMDQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUZGQzAwMDBBMQorOjEwMDQ0MDAwMUZGQzAwMDBFMzAwMDVDODFGRkMwMDAwMUZGQzAwMDBBQgorOjEwMDQ1MDAwRTMwMDA1QzgxRkZDMDAwMDFGRkMwMDAwRTMwMDA1QzgwNgorOjEwMDQ2MDAwMUZGRkMwMDAxRkZGQzAwMEUzMDAwNUM4MUZGRkMwMDA0MgorOjEwMDQ3MDAwMUZGRkMwMThFMzAwMDVDODFGRkZDMDE4MUZGRkMwMThFQQorOjEwMDQ4MDAwRTMwMDA1RTAxRkZGQzAxODFGRkZDMjk0RTMwMDA1RTA3MgorOjEwMDQ5MDAwMUZGRkMyOTQxRkZGQzI5NEUzMDAwODVDMUZGRkMyQTBBRAorOjEwMDRBMDAwMUZGRkM1OUNFMzAwMDg1QzIwMDAwMDAwMjAwMDAxNkFEQgorOjEwMDRCMDAwRTMwMDBCNTgyMDAwMDE4MDIwMDAwMTgwRTMwMDBDQzQwMQorOjEwMDRDMDAwMjAwMDAyMDAyMDAwMDIwM0UzMDAwQ0M0MjAwMDAyMUNGNAorOjEwMDREMDAwMjAwMDAyMjBFMzAwMENDODIwMDAwMjIwMjAwMDAyMjY5OQorOjEwMDRFMDAwRTMwMDBDQ0MyMDAwMDIzQzIwMDAwMjQwRTMwMDBDRDRDRQorOjEwMDRGMDAwMjAwMDAyNDAyMDAwMDI0OUUzMDAwQ0Q4MjAwMDAyNENGQQorOjEwMDUwMDAwMjAwMDAyNTBFMzAwMENFNDIwMDAwMjUwMjAwMDAyNTlCOQorOjEwMDUxMDAwRTMwMDBDRTgyMDAwMDI1QzIwMDAwMjYwRTMwMDBDRjQyMQorOjEwMDUyMDAwMjAwMDAyNjAyMDAwMDI2OUUzMDAwQ0Y4MjAwMDAyNkM0OQorOjEwMDUzMDAwMjAwMDAyNzBFMzAwMEQwNDIwMDAwMjcwMjAwMDAyNzkwOAorOjEwMDU0MDAwRTMwMDBEMDgyMDAwMDI4QzIwMDAwMjhDRTMwMDBEMTQ1MworOjEwMDU1MDAwMjAwMDAyOTAyMDAwMDI5M0UzMDAwRDE0MjAwMDAyQUM2MgorOjEwMDU2MDAwMjAwMDAyQjBFMzAwMEQxODIwMDAwMkQwMjAwMDAyRjJBQgorOjEwMDU3MDAwRTMwMDBEMUMyMDAwMDNCMDIwMDAwM0IwRTMwMDBENDA5OQorOjEwMDU4MDAwMjAwMDAzQjAyMDAwMDNCMEUzMDAwRDQwMjAwMDAzQjBDMgorOjEwMDU5MDAwMjAwMDAzQjBFMzAwMEQ0MDIwMDAwM0IwMjAwMDAzQjBCMgorOjEwMDVBMDAwRTMwMDBENDAyMDAwMDNCMDIwMDA2RUE0RTMwMDBENDBFNgorOjEwMDVCMDAwMjAwMDZFQTQyMDAwNkVBNEUzMDA3ODM0MDAwMDAwMDA0OAorOjEwMDVDMDAwMDAwMDAwMDAwMDAwMDAwMDFGRkMwMDAwMUZGQzAwMDBGNQorOjEwMDVEMDAwMUZGRkM1QTAxRkZGQzY5MDIwMDA2RUE4MjAwMDZFQThCOAorOjEwMDVFMDAwREVGRkZFMDAwMDAwMDgwQ0RFQURCRUVGMUZGRkMyQjA1NAorOjEwMDVGMDAwMUZGQ0ZFMDAxRkZGQzBBNDFGRkZDNUQwMzAwMDAwMDA3RAorOjEwMDYwMDAwMDAzRkZGRkY4MDQwMDAwMDEwMDAwMDAwMDgwRkZGRkZDOAorOjEwMDYxMDAwMUZGRkMyN0QwMDBGRkZGRjgwNEZGRkZGODAwMDAwMDAyMworOjEwMDYyMDAwMDAwMDA4ODBCMDAwMDAwNTYwNTAwMDAwNjAwMDAwMDA3RAorOjEwMDYzMDAwNDAwMDAwMTEzNTAwMDAwMDQxMDAwMDAwMTAwMDAwMDFFMgorOjEwMDY0MDAwMjAwMDAwMDAwMDAwMTAwMDQwMDAwMDAwMDUwMDAwMDAzNQorOjEwMDY1MDAwODAwMDAwMTkwNDAwMDAwMDAwMDAwODAwRTEwMDAyMDAxMgorOjEwMDY2MDAwMTAwMDAwMDU4MDYwMDAwMDcwMDAwMDAwMjAwMDAwMDlGQworOjEwMDY3MDAwMDAxRkY4MDA4MDAwMDAxRUEwMDAwMDAwRjgwMDAwMDAyRAorOjEwMDY4MDAwMDdGRkZGRkYwODAwMDAwMDE4MDAwMDAwMDEwMDgwMDFDNAorOjEwMDY5MDAwNDIwMDAwMDAxRkZGQzIyRDFGRkZDMEVDMDAwMTAwODBDMAorOjEwMDZBMDAwNjA0MDAwMDAxQTAwMDAwMDBDMDAwMDAwMTAwMDAwMEE2QQorOjEwMDZCMDAwMDAwMDMwMDAwMDAxMDAwMDgwMDAwMDE4RkMwMDAwMDA3NQorOjEwMDZDMDAwODAwMDAwMDEwMDAwNDAwMDYwMDAwODAwODAwMDAwMUM2NQorOjEwMDZEMDAwODAwMDAwMUEwMzAwMDAwMDgwMDAwNDAwMDQwMzA0MDNFQgorOjEwMDZFMDAwNTAwMDAwMDNGRkZGQkZGRjFGRkZDM0U0MDAwMDBGRkYyOAorOjEwMDZGMDAwRkZGRkYwMDAwMDAwMTZEMDAwMDBGRkY3QTUwMDAwMDA4QgorOjEwMDcwMDAwMUZGRkM0QzAxRkZGQzQ3MTAwMDEwMDA4MDAwMDBCMjBDMAorOjEwMDcxMDAwMjAyRkZGODAxRkZGQzQ2NTAwMDAyQzAwRkZGRUZGRjhBNAorOjEwMDcyMDAwMDBGRkZGRkYxRkZGQzU4ODAwMDAyMDAwRkZGRkRGRkY2NQorOjEwMDczMDAwMDAwMEZGRUYwMTAwMTEwMDFGRkZDM0UyMUZGRkM1QTA3MworOjEwMDc0MDAwRkZGRkVGRkYwMDAwRkZGQjFGRkZDNjUwMUZGRkJFQjAwMworOjEwMDc1MDAwRkZGRkY3RkYxRkZGQzA3NDAwMDBGRkZEMUZGRkM2NDAzMworOjEwMDc2MDAwMDAwMUZCRDAxRkZGQzVDMDFGRkZDNjgwMUZGRkM1QTEzMgorOjEwMDc3MDAwRTBGRkZFMDAxRkZGQzVCMDAwMDA4MDAwMUZGRkM1NEM1QQorOjEwMDc4MDAwMUZGRkM1QzQxRkZGQzA3ODFGRkZDNEU0MUZGQ0ZGRDhCNAorOjEwMDc5MDAwMDAwMTAwODE3RkZGRkZGRkUxMDAwNjAwMDAwMDI3MTAzRAorOjEwMDdBMDAwMUZGQ0ZFMzAxRkZDRkU3MDFGRkZDNTQ4MUZGRkM1NjAwOQorOjEwMDdCMDAwMDAwM0QwOTAxRkZGQzU3NDJCNTA2MzgwMkI1MDc5ODBBRAorOjEwMDdDMDAwMkI1MDkwODAyQjUwQTY4MDFGRkZDNDc5MDEwMDExMEY4MQorOjEwMDdEMDAwMjAyRkZFMDAyMDMwMDA4MDIwMkZGRjAwMDAwMEZGRkZCMAorOjEwMDdFMDAwMDAwMUZGRjgyQjUwQjIwMDJCNTBCMjA4MDAwMTAwMTA5RQorOjEwMDdGMDAwMkI1MEIxODAyQjUwQjI4MDJCNTBCQTAwMDAwMTAwMTE1OQorOjEwMDgwMDAwMkI1MEJEMjgyQjUwQkM4MDJCNTBCREEwMjAzMDAwMDBBOQorOjEwMDgxMDAwREZGRkZFMDA1MDAwMDAwMjAwQzAwMDAwMDIwMDAwMDBFOAorOjEwMDgyMDAwRkZGRkY3RjQxRkZGQzA3QzAwMEZGODAwMDQ0MDAwMDAzQQorOjEwMDgzMDAwMDAxMDAwMDAwQzQwMDAwMDFDNDAwMDAwRTAwMDAwQTA4MAorOjEwMDg0MDAwMUZGRkM1NTAxRkZEMDAwODFGRkZDNTY0MUZGRkM1NzhBRgorOjEwMDg1MDAwMUZGRkM1OENFMTAwMDY5MEUxMDAwNkVDMDAwMDAwMDBERgorOjEwMDg2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDA4NworOjEwMDg3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAxMDAwNDAwOAorOjEwMDg4MDAwMjAxMDAwNDAyMDEwMDA0MDIwMTQwMDgwMjAwQzAwMDBBOAorOjEwMDg5MDAwMjAwQzAwMDAyMDBDMDAwMDIwMTAwMDQwMjAxNDAwODBEQworOjEwMDhBMDAwMjAxNDAwODAyMDE0MDA4MDIwMTgwMEMwMjAxQzAxMDBBQgorOjEwMDhCMDAwMjAxQzAxMDAyMDFDMDEwMDIwMjAwMTQwMjAxODAwQzA0NQorOjEwMDhDMDAwMjAxODAwQzAyMDE4MDBDMDIwMUMwMTAwMjAxODAwQzAwMworOjEwMDhEMDAwMjAxODAwQzAyMDE4MDBDMDIwMUMwMTAwMjAyMDAxNDA2QQorOjEwMDhFMDAwMjAyMDAxNDAyMDIwMDE0MDIwMjAwOTQwMjAyMDA5NDBGNAorOjEwMDhGMDAwMjAyMDA5NDAyMDIwMDk0MDIwMjQwOTgwRkZGRkZGRkYxRAorOjEwMDkwMDAwRkZGRkZGRkZGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBFRgorOjEwMDkxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDU1ODhEQQorOjEwMDkyMDAwMjAwMDU0NTgyMDAwNTU4ODIwMDA1NTg4MjAwMDUzOTRGQQorOjEwMDkzMDAwMjAwMDUzOTQyMDAwNTM5NDIwMDA1MUQ0MjAwMDUxRDQxRgorOjEwMDk0MDAwMjAwMDUxQ0MyMDAwNTEzODIwMDA0RkUwMjAwMDREQzA0NQorOjEwMDk1MDAwMjAwMDRCOTQwMDAwMDAwMDAwMDAwMDAwMjAwMDU1NThDQgorOjEwMDk2MDAwMjAwMDU0MjQyMDAwNTRDODIwMDA1NEM4MjAwMDUyN0M4OQorOjEwMDk3MDAwMjAwMDUyN0MyMDAwNTI3QzIwMDA1MjdDMjAwMDUyN0NCRgorOjEwMDk4MDAwMjAwMDUxQzQyMDAwNTI3QzIwMDA0RjAwMjAwMDRENzBGOAorOjEwMDk5MDAwMjAwMDRCNDAwMDAwMDAwMDAwMDAwMDAwMjAwMDBCRjA5MQorOjEwMDlBMDAwMjAwMDNBREMyMDAwMDRDMDIwMDA0NzMwMjAwMDBCRTg4MworOjEwMDlCMDAwMjAwMDQxRjQyMDAwMDNGMDIwMDA0NkYwMjAwMDRCMUNGMgorOjEwMDlDMDAwMjAwMDNGMDAyMDAwM0UxQzIwMDAzQTU4MjAwMDM4RTg1QworOjEwMDlEMDAwMjAwMDM2NTgyMDAwMzFCODIwMDAzQzc4MjAwMDJERDA2RgorOjEwMDlFMDAwMjAwMDI4NjQyMDAwNjgyODIwMDAyM0YwMjAwMDIwRDA2OAorOjEwMDlGMDAwMjAwMDIwN0MyMDAwMUQ2ODIwMDAxODYwMjAwMDE1ODg0MQorOjEwMEEwMDAwMjAwMDBFNTQyMDAwMEMzNDIwMDAxMTM0MjAwMDEzMjA0QworOjEwMEExMDAwMjAwMDQzRUMyMDAwM0VCNDIwMDAwQkY4MjAwMDA0QzA2RQorOjEwMEEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDNgorOjEwMEEzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBCNgorOjEwMEE0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBNgorOjEwMEE1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5NgorOjEwMEE2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4NgorOjEwMEE3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NgorOjEwMEE4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2NgorOjEwMEE5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1NgorOjEwMEFBMDAwMzI2NDAwMDAwMDAwMDAwMDMyNjQwMDAwNjQwMDY0MDA1MgorOjEwMEFCMDAwNjQwMDY0MDA2NDAwNjQwMDY0MDA2NDAwMDAwMDAwMDBERQorOjEwMEFDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNgorOjEwMEFEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNgorOjEwMEFFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNgorOjEwMEFGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGNgorOjEwMEIwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDBENQorOjEwMEIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDBDNQorOjEwMEIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDNQorOjEwMEIzMDAwMDA0MzIzODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDRgorOjEwMEI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBNQorOjEwMEI1MDAwMDAwMDAwMDAwMDAwMDAwMDAwNUM5NDAxNUQ5NDAyNUU1MworOjEwMEI2MDAwOTQwMzVGOTQwMDQzMDAwMDAwMDAwMDAwMDAwMDAwMDBCOAorOjEwMEI3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NQorOjEwMEI4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2NQorOjEwMEI5MDAwMDAwMDAwMDAwMDAwMDAwMDAwNUM5MDAxNUQ5MDAyNUUxQgorOjEwMEJBMDAwOTAwMzVGOTAwMDUzMDAwMDAwMDAwMDAwMDAwMDAwMDA3MAorOjEwMEJCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzNQorOjEwMEJDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNQorOjEwMEJEMDAwMDAwMDAwMDAwMDAwMDAwMDAwOUM5NDAwMUQ5MDAxOUQ5QQorOjEwMEJFMDAwOTQwMjlFOTQwMzlGOTQwNDA4OTQwNTA5OTQwNjBBOTQyMQorOjEwMEJGMDAwMDcwQjk0MDA0MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQworOjEwMEMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFNAorOjEwMEMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOUM5MDAxOUQ5MDAyOUVEQQorOjEwMEMyMDAwOTAwNzFEOTAwMzlGOTAwNDc4OTAwNTc5OTAwNjdBOTAyNAorOjEwMEMzMDAwMDc3QjkwMDA1MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0RgorOjEwMEM0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBNAorOjEwMEM1MDAwMDAwMDAwMDAwMDAwMDAwMDAwREM5NDAwMUQ5MDAxREQ5OQorOjEwMEM2MDAwOTQwMkRFOTQwM0RGOTQwNDA0OTQwNTA1OTQwNjA2OTQyQworOjEwMEM3MDAwMDcwNzk0MDgwODk0MDkwOTk0MEEwQTk0MEIwQjk0MDAzNgorOjEwMEM4MDAwNDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMQorOjEwMEM5MDAwMDAwMDAwMDAwMDAwMDAwMDAwREM5MDAxREQ5MDAyREU5QQorOjEwMENBMDAwOTAwQjFEOTAwM0RGOTAwNEI0OTAwNUI1OTAwNkI2OTBBQworOjEwMENCMDAwMDdCNzkwMDhCODkwMDlCOTkwMEFCQTkwMEJCQjkwMDA5QQorOjEwMENDMDAwNTMwMDAwMDA2M0ZGRkMwMDIwMDA2QzYwMTBGRkZGMEE2RgorOjEwMENEMDAwMDAwMDAwMDAyMDAwNkM4NDAwRDIzMTEwRkZGRTBBMDBFQQorOjEwMENFMDAwMDAwMDAwMDAyMDAwNkNDQzAwRDMzMTEwRkZGRTBBMDA5MQorOjEwMENGMDAwMDAwMDAwMDAyMDAwNkQwQzAwRDQzMTEwRkZGRTBBMDAzRgorOjEwMEQwMDAwMDAwMDAwMDAyMDAwNkQ4MDAwRDUzMTEwRkZGRTBBMDBCOQorOjEwMEQxMDAwMDAwMDAwMDA2M0ZGRkMwMEUwMDAwMEEwMTJGRkY3ODI2QgorOjEwMEQyMDAwMjAwMjgyNTdDODIxNjNGRkZDMTJGRkYzMDNFODMwMDQ1RQorOjEwMEQzMDAwRUUzMDA1QzAzMDkzMjA5NDIxOTUyMjYzRkZGQzAwMDAyMworOjEwMEQ0MDAwMUZGRkQwMDAwMDA0MDAyMDFGRkZDNUEwMUZGRkM2OTA5QQorOjEwMEQ1MDAwMjAwQTAwMTFGRkZCMTNGRkZCMDNFNjMxMDEwMjAwMTYxRQorOjEwMEQ2MDAwRkZGQTE3RkZGQUQzMEY3NzZCMDY5MDYwQjQ2Njc3NjNDQworOjEwMEQ3MDAwRjg1NDE1RjM1NDFBQTUwRjE0MDA2M0ZGRjkwMDAwMDA4RQorOjEwMEQ4MDAwNkMxMDA0QzAyMEQxMEYwMDZDMTAwNEMwQzcxQUVGMDYwRAorOjEwMEQ5MDAwRDgzMEJDMkJENzIwODU3MjBENDIxMTgzNzEwNTQ1MEJDRAorOjEwMERBMDAwOTU3MjAyMzMwQzIzNzYwMTdCM0IwNDIzM0QwODkzNzEzQgorOjEwMERCMDAwQTMyRDEyRUVGRTE5RUVGRUEyNzY3RDYzMkMyRTBBMDAwNAorOjEwMERDMDAwMDg4MjAyMjgwQTAxMDM4RTM4MEUwRTQyQzhFRTI5QTZCOAorOjEwMEREMDAwN0U2RDRBMDUwMDIwODgwMDMwOEM4MjcxRDEwRkMwRjBGMgorOjEwMERFMDAwMDI4RjM4N0ZDMEVBNjNGRkU0MDBDMEYxQzA1MDAzN0U4OQorOjEwMERGMDAwMENBMkVFMEUzRDEyMDg4MjAyMDNGNTM4MDUwNTQyQ0IyNworOjEwMEUwMDAwNTcyOUE2N0UyRkRDMTAwRjRGMzY2REZBMDUwMDIwODg3QgorOjEwMEUxMDAwMDAzMDhDQkM3NUMwMzAwOEUyMDgyODBBMDEwNTgzMzgxMAorOjEwMEUyMDAwMDMwMzQyQzkzRTI5QTY3RTBENDgwQ0QzMEY2RDhBMDVFNworOjEwMEUzMDAwMDAyMDg4MDBCMDhDODI3MUQxMEZDMDUwMDhGNTM4NzU0MQorOjEwMEU0MDAwQzBDMTYzRkZCQkMwNjAwMjg2Mzg3NkMwREE2M0ZGRDRERQorOjEwMEU1MDAwNkMxMDEyMTZFRUQ4QzFGOUMxRThDMUM3MkIyMjFFMjhBQQorOjEwMEU2MDAwMjIxREMwRDA3QjgxMzUyOTIwMDYwQkI3MDIyOTlDRkFCMAorOjEwMEU3MDAwNjU1MDA4MjgyMDcyMjg4Q0ZGMjgyNDcyNjQ5MTY0MkEwNworOjEwMEU4MDAwQjAwMDBDQTgwQzY0ODE2RjBFQTkwQzY0OTJCQjdGQTEwQQorOjEwMEU5MDAwM0ZDMUNFN0NBMTM2NjlBQzMzNjAwMDM3MDAyOTIwMDYwMworOjEwMEVBMDAwRDdEMDI5OUNGQUNDNTcyODIwNzIyODhDRkYyODI0NzI4RQorOjEwMEVCMDAwNjQ5MTM5MkFEMDAwMENBODBDNjQ4MTY4MEVBOTBDNjRENgorOjEwMEVDMDAwOTMxRjdGQTEwQkMxQ0U3Q0ExMDI2OEFDMDZDMDIwRDFDQworOjEwMEVEMDAwMEYyRDI1MDI4QTMyQzA5MDBBNkU1MDY1RTVCNTI5MjQ4RgorOjEwMEVFMDAwNjcwOTBGNDc2NUY1QjEyQzIwMEMxRkVFQjMwQ0NFMTEyRQorOjEwMEVGMDAwQUZFRTI5RTI4NkI0NDg3OTgzMDI2MDA1ODIxOUVFQUYyRAorOjEwMEYwMDAwMDlDOTBBMjk5MkEzNjg5MDA3OEYyMDA5RkYwQzY1RjU4QgorOjEwMEYxMDAwNkUyRkUyODU2NEY1Njg2NTU1OTYyODIyMUQ3QjgxMDU1NAorOjEwMEYyMDAwRDlCMDYwMDAwMjAwQzA5MDhCOTQxN0VFQTUwQjg4MTQxNgorOjEwMEYzMDAwODc3NDBCMEI0N0E4NzcxOEVFQTMwOUJCMTAwODc3MDIzQworOjEwMEY0MDAwOTdGMDE4RUVBMTE3RUVBMjA4QTgwMTBCODgwMjA3NDczOAorOjEwMEY1MDAwMDIxQkVFOUU5N0YxMEI4ODAyOThGMjI3OTAyMzJCOTBBQworOjEwMEY2MDAwMjIwNDc4MTAwNkJCMTAwNzQ3MTIwOEJCMDIyODkwMjEwNAorOjEwMEY3MDAwMDc3NzEwMEM4ODEwMDc4ODAyMEI4ODAyMTdFRTk2OEJGMworOjEwMEY4MDAwMzMwN0JCMDE4NzM0MEI4ODAyOThGMzk3OTk5N0Y0OEI0QQorOjEwMEY5MDAwOTU4NzM5OUJGNTg4OTY4QjM4OThGNjg4OTc5QkY4OTdCNAorOjEwMEZBMDAwRjk5OEY3MTdFRThEMjhFMjg1MDdDNzA4MkQ3NENGMDg0QQorOjEwMEZCMDAwNDgwQjI4RTY4NTY1NTUwRjJCMjIxRTI4MjIxRDdCODlBQworOjEwMEZDMDAwMDIyQjBBMDA2NEJGMDUyQ0IwMDcyOEIwMDBEQTIwMDYwNworOjEwMEZEMDAwODgwQTI4ODI0Q0MwRDEwQjgwMDBEQkEwNjVBRkU3NjM5NAorOjEwMEZFMDAwRkVFQTAwMDAyOTIwNzI2NTlFOTQ2MDA0RTcyQTIwNzJDMAorOjEwMEZGMDAwNjVBRUJGNjAwNERFMDAwMDJFQjAwMzJDMjA2N0Q0RTA5NQorOjEwMTAwMDAwNjVDMTA1OEEzMjhDMzMwQUZGNTAwQzQ1NTRCQzU1NjRDNworOjEwMTAxMDAwRjRFQjE5RUU3Mjg4MkEwOUE5MDEwOTg4MEM2NDgyMUY3MQorOjEwMTAyMDAwQzA5MjYwMDBERDJFRDAwMzJBMjA2N0Q0RTA2NUEwRDhFRQorOjEwMTAzMDAwOEEzMjhCMzMwQUZDNTAwQjQ1NTRCQzU1NjRDNEJFMTkyQworOjEwMTA0MDAwRUU2Nzg4MkEwOUE5MDE3OTg5RDUwQkVBNTA2NEE0RTNERgorOjEwMTA1MDAwMENFRTExQzBGMDJGMTYxMzJFMTYxNjhBRTc4Q0U4MkExNAorOjEwMTA2MDAwMTYxMjhFRTlERkMwQUFFQTdFQUIwMUIxQ0YwQkE4NTAwMQorOjEwMTA3MDAwNjU4MzQ2ODgzN0RCQzBBRTg5OTkxRTc4OUIwMjJCQ0NFRQorOjEwMTA4MDAwMDEyQjE2MUIyOTEyMEUyQjBBMDAyOTE2MUE3RkMzMDdFMworOjEwMTA5MDAwN0ZDOTAyN0VBQjAxQzBCMTY1QjQ5RDhCMzUyRjBBMDBCQworOjEwMTBBMDAwMkEwQTAwN0FDMzA1NjRDM0NCMkYwQTAxNjVGNDg5MkI5MQorOjEwMTBCMDAwMTIxNjJCMTYxOTAwNTEwNEMwQzEwMENDMUEyQ0NDRkZGQgorOjEwMTBDMDAwMkMxNjE3MENGQzEzMkMxNjE4MkIxMjFBMkExMjFCRENDOAorOjEwMTBEMDAwNTA1ODE5QjZDMEQwQzA5MDJFNUNGNDJDMTIxNzI4MTJBQworOjEwMTBFMDAwMTgyRjEyMUIyQTEyMUEwOEZGMDEwQ0FBMDE4ODM0MDdCNAorOjEwMTBGMDAwNEMwQUFCOEIyODEyMTkyQkM2MTYyRjg2MDgyQTg2MDk5NAorOjEwMTEwMDAwMkU3NDEwMjkyNDY3MkU3MDAzODk3NUIxRUEyQTc0MDM5RQorOjEwMTExMDAwQjA5OTA5NDkwQzY1OURCNDJCMjA2NzJEMjUwMjY1QjM1NAorOjEwMTEyMDAwRkEyQjIyMUUyQzIyMUQ3QkM5MDFDMEIwNjRCRDlEMkM1MAorOjEwMTEzMDAwQjAwNzI4QjAwMERBMjAwNjg4MEEyODgyNENDMEQxMEJGQworOjEwMTE0MDAwODAwMERCQTA2NUFGRTc2M0ZEODI4OUJBQjE5OTY1OTA0NQorOjEwMTE1MDAwOTc4ODM0MUNFRTIzOThCQThGMzMxRUVFMUMwRjRGNTQyMQorOjEwMTE2MDAwMkZCNDJDOEQyQThBMzIwRUREMDIwQ0FDMDE3REM5NjZBQgorOjEwMTE3MDAwMEE0OTUxNkY5MjYwOEEzMzc1QTY1QjJDQjAxMzBBRUQ1MQorOjEwMTE4MDAwNTEwRENEMDEwRDBENDEwQzBDNDE3REM5NDkyRUIwMTIwMAorOjEwMTE5MDAwQjBFRTY1RTNDNkMwRDA4RTM3OENCODhBMzY4RkI5N0M4NgorOjEwMTFBMDAwQTMwNzdBQzkwMjdFRkIwMUMwRDFDRUQ5ODgzNTBBQUQyQQorOjEwMTFCMDAwMDIwRThFMDg3OEVCMDIyREFDMDE4OUI3REFDMEFGOUIyNgorOjEwMTFDMDAwNzlCQjAxQjFDQURDQjBDMEIwN0RBMzA3N0FEOTAyN0M3QgorOjEwMTFEMDAwRUIwMUMwQjE2NEIxNjFDMDkxMjkyNDY3QzAyMEQxMEY3NworOjEwMTFFMDAwMDAwMDhBREFCMUFBNjRBMEMwMkMyMDY3MkQyNTAyNjUxMAorOjEwMTFGMDAwQzMxMTFERURGNjhBMzIxRUVERkIwREFEMDEwRUREMENBNworOjEwMTIwMDAwNjVEMjhBMEE0RTUxNkZFMjAyNjAwMjgxQzA5MDI5MjRBMQorOjEwMTIxMDAwNjcwOTBGNDc2NUYyRjgyODIyMUQ3Qjg5MDIyQjBBMDAxNworOjEwMTIyMDAwNjRCQ0E5MkNCMDA3MjhCMDAwREEyMDA2ODgwQTI4ODJGRQorOjEwMTIzMDAwNENDMEQxMEI4MDAwREJBMDY1QUZFNzYzRkM4RTAwMDBFMworOjEwMTI0MDAwMENFOTUwNjQ5MkVEMENFRjExQzA4MDI4MTYxMUFGQkY2RAorOjEwMTI1MDAwMkYxNjE5OEVGODhCRjdEQUUwOEZGOTJCMTYxMEFCRkJFRgorOjEwMTI2MDAwN0ZCQjAxQjFFQTBDQTg1MDY1ODBENjg4MzdEQ0UwQUZCRgorOjEwMTI3MDAwODk5OTFDNzg5QjAyMkNFQzAxMkMxNjFCMjkxMjBDMkMzMgorOjEwMTI4MDAwMEEwMDI5MTYxQTdBRTMwNzdBRTkwMjdGQkIwMUMwQzE3NgorOjEwMTI5MDAwNjVDMkE1OEIzNTJDMEEwMDJBMEEwMDdBRTMwNTY0RTFCMQorOjEwMTJBMDAwQ0EyQzBBMDE2NENFMEQ2MDAyOEU4ODM0MUJFRENEOThFNQorOjEwMTJCMDAwREE4RjMzMUVFREM2MEY0RjU0MkZENDJDOEMyQThBMzI2RQorOjEwMTJDMDAwMEVDQzAyMEJBQjAxMENCQjBDNjVCRjBBMEE0OTUxNkU3OAorOjEwMTJEMDAwOTIwMjYzRkYwMThBMzMwQUFCNTA2NEJFRjkyQ0QwMTMyQgorOjEwMTJFMDAwMEFFRTUxMEVDRTAxMEUwRTQxMEMwQzQxMEVDQzBDNjVENworOjEwMTJGMDAwQ0VFNDJGRDAxMkIwRkY2NUYyNkVDMEIwOEUzNzhDRDgxRQorOjEwMTMwMDAwOEEzNjJGRDIwOTdDQTMwNzdBQzkwMjdFRkIwMUMwQjFCRAorOjEwMTMxMDAwNjVCRUMzODgzNURCQTBBRThFNzhFQjAxQjFBQjg5RDc1MworOjEwMTMyMDAwREFDMEFGOUQ3OURCMDFCMUNBQzBDMDdCQTMwNzdBQjkyRgorOjEwMTMzMDAwMDI3REVCMDFDMEMxNjVDRTlEQzA5MDI5MjQ2N0MwMjAwRAorOjEwMTM0MDAwRDEwRjg4Mzc4QzM2OTgxNDBDRTkwQzI5MTYxNDA4RjgzQworOjEwMTM1MDAwMEM5ODFENzhGQjA3MjgxMjE0QjA4ODI4MTYxNDg5MURENAorOjEwMTM2MDAwOUYxNTlCMTZDMEYwMkIxMjE0MjkxNjFBMkIxNjFCOEJENworOjEwMTM3MDAwMTQ3QUUzMEI3QUU5MDY4ODE1OEUxNjc4RUIwMUMwRjEzMgorOjEwMTM4MDAwNjVGMUJBMjkxMjFBMkYxMjExOEEzNTJFMTIxQjlBMUFEOAorOjEwMTM5MDAwQUZFRTJGMTIxMEMwQTBBRjlGNzlGQjAxQjFFRTlGMTFFRAorOjEwMTNBMDAwODgxQUMwRjA5ODEwN0FFMzBBN0VBOTA1MkExMjAxN0FGOQorOjEwMTNCMDAwOEIwMUMwRjE2NEYwODE2MDAxODM4OTM2OEIzNzk5MTcwNgorOjEwMTNDMDAwMEJFODBDOTgxRjA5QzkwQzI5MTYxNTc4RUIwNzI4MTI5MQorOjEwMTNEMDAwMTVCMDg4MjgxNjE1RDlDMDlBMTk5RTE4OEExRjJFMTI4MgorOjEwMTNFMDAwMTUyQTE2MUEyRTE2MUJEQUMwQzBFMDhDMTc3RjkzMEIzNQorOjEwMTNGMDAwN0ZBOTA2ODgxODhGMTk3OEZCMDFDMEUxNjVFMTNFMjlCNQorOjEwMTQwMDAwMTIxQTJGMTIxMzhBMzUyRTEyMUI5QTFCQUZFRTJGMTJBRgorOjEwMTQxMDAwMTJDMEEwQUY5Rjc5RkIwMUIxRUU5RjEzODgxQkMwRjBGMworOjEwMTQyMDAwOTgxMjdBRTMwQTdFQTkwNTJBMTIwMzdBOEIwMUMwRjE4OQorOjEwMTQzMDAwNjVGMTBBMkUxMjE2MkUxNjE5MkExMjFCMDA1MTA0QzAyRAorOjEwMTQ0MDAwRTEwMEVFMUFCMEVFMkUxNjE3MEVGRjEzMkYxNjE4MEYyRQorOjEwMTQ1MDAwQ0MwMUFDQUEyRjEyMUEwRUJDMDFBQ0ZDN0ZDQjAxQjE5RgorOjEwMTQ2MDAwQUEyQTE2MUIyQzE2MUE2M0ZDNUUwMDAwN0ZCMzAyNjNDNworOjEwMTQ3MDAwRkUzMTYzRkUyQjdFQjMwMjYzRkMzMDYzRkMyQTAwMDA2NgorOjEwMTQ4MDAwNjQ1MEMwREEyMERCQzA1ODE2OEFDMDIwRDEwRkMwOTE0QQorOjEwMTQ5MDAwNjNGRDdBMDBDMDkxNjNGQTQ0REEyMERCNzBDMEQxMkU3QworOjEwMTRBMDAwMEE4MEMwOUEyOTI0NjgyQzcwMDc1ODE1NzVEMkEwRDFEQgorOjEwMTRCMDAwMEYwMzQ3MEIxOEVENEREQjcwQTgyODc4NzMwMjJCN0RDNgorOjEwMTRDMDAwRjhEOUIwNjNGQTYxMDAwMDJBMkM3NERCNDA1ODBFRUVBNAorOjEwMTREMDAwNjNGQUU0MDAwMDI5MjIxRDJEMjUwMjdCOTkwMUMwQjA4QQorOjEwMTRFMDAwQzlCNjJDQjAwNzI4QjAwMERBMjAwNjg4MEEyODgyNEMzQQorOjEwMTRGMDAwQzBEMTBCODAwMERCQTA2NUFGRTdDMDIwRDEwRkMwOTE0OQorOjEwMTUwMDAwNjNGQkZGMDAwMjJBMDI1ODAyNEMwQUEyMDIwNjAwMDBGNgorOjEwMTUxMDAwMDIyQTAyNTgwMjQ5MEFBMjAyMDYwMDAwREI3MERBMjAwMQorOjEwMTUyMDAwQzBEMTJFMEE4MEMwOUUyOTI0NjgyQzcwMDc1ODE1NTRGQgorOjEwMTUzMDAwQzAyMEQxMEZDMDk0NjNGQkM5QzA5NjYzRkJDNEMwOTZBMgorOjEwMTU0MDAwNjNGQkJGMDAyQTJDNzREQjMwREM0MDVCRkUwRkRCQTBBQQorOjEwMTU1MDAwQzJBMDJBQjQwMDJDMjAwQzYzRkYyNzAwOEQzNThDQjc2NQorOjEwMTU2MDAwN0RDQjAyNjNGREQyNjNGQzZEOEYzNThFRDc3RkVCMDI5RQorOjEwMTU3MDAwNjNGREM1NjNGQzYwMDAwMDZDMTAwNEMwMjBEMTBGMDA0NworOjEwMTU4MDAwNkMxMDA0QzAyMEQxMEYwMDZDMTAwNDJCMjIxRTI4MjJFNgorOjEwMTU5MDAwMURDMEEwQzA5NDI5MjQwNjJBMjUwMjdCODkwMURCQTA1NgorOjEwMTVBMDAwQzlCOTEzRUQwNERBMjAyOEIwMDAyQ0IwMDcwMzg4MEE2QgorOjEwMTVCMDAwMjg4MjRDQzBEMTBCODAwMERCQTA2NUFGRTdDMDIwRDFGMgorOjEwMTVDMDAwMEYwMDAwMDA2QzEwMDQyQzIwMDYyQTIxMDI2OEM4MDVCOAorOjEwMTVEMDAwMjhDQ0Y5NjU4MTJFMEEwOTRDNjU5MTA0OEYzMEMxQjg3OQorOjEwMTVFMDAwMEY4RjE0N0ZCMDA1MjgyMTIzNjU4MTI3MTZFQ0YzMjk3RQorOjEwMTVGMDAwNjI5RTZGOTgwMjYwMDBGODE5RUNFRjI5OTIyNjY4OTBCRAorOjEwMTYwMDAwMDc4QTIwMDlBQTBDNjVBMEU3MkE2MjlENjRBMEUxMkI0NQorOjEwMTYxMDAwMjAwQzBDQjkxMUE2OTkyRDkyODY2RkQ5MDI2MDAwREJCRgorOjEwMTYyMDAwMURFQ0U3MERCRDBBMkREMkEzNjhEMDA3OEUyMDBERUU2QworOjEwMTYzMDAwMEM2NUUwQzcyNzkyODVDMEUwNjQ3MEJGMURFQ0VDNjhDNAorOjEwMTY0MDAwNDM0RTFDRUNFQjhBMkIwQ0FBMDI5QTcwODkyMDA4OTk1NQorOjEwMTY1MDAwMTEwRDk5MDI5OTcxODgyQTk4NzQ4RjMyOUY3NTI4MjFFQgorOjEwMTY2MDAwMDQwODg4MTE5ODc3MThFQ0RDMENCRjExQTZGRjJERjI0NgorOjEwMTY3MDAwODVBOEI4MkU4NENGMkREQzI4MkRGNjg1Qzg1QTJBMkNCMworOjEwMTY4MDAwNzREQjQwNTgwRTgxRDJBMEQxMEZDMDIwRDEwRjAwMDBEMgorOjEwMTY5MDAwMDAyOUNDRjk2NDkwQjEyQzIwNjY4OTMxQjFDQzBDMENCNgorOjEwMTZBMDAwNDcyQzI0NjY2RUM2MDI2MDAwODUwOUY4NTA2NTgwN0Y2RAorOjEwMTZCMDAwMUNFQ0QxOEEyQjBGMDg0MDBCODgxMDA4QUEwMjBDQUEzOAorOjEwMTZDMDAwMDI5QTcwODkyMDA4OTkxMTBEOTkwMjk5NzE4ODMzOThBRQorOjEwMTZEMDAwNzM4QzMyOUM3MjhBMkE5QTc0ODkzNDk5NzU2M0ZGN0Q1RgorOjEwMTZFMDAwMDBDQzU3REEyMERCMzBEQzQwNTgxNTVGQzAyMEQxMEYyQQorOjEwMTZGMDAwMDBEQTIwQzBCNjU4MTVFRTYzRkZFNTAwREEyMDU4MTU3MQorOjEwMTcwMDAwRUM2M0ZGREMwMERBMjBEQjMwREM0MERENTA1ODE2N0E3OQorOjEwMTcxMDAwRDJBMEQxMEZDODU4REEyMERCMzA1ODE0QzcyQTIxMDJEMgorOjEwMTcyMDAwNjVBRkJEQzA5NDA5QTkwMjI5MjUwMjYzRkZCMjAwMDA3QworOjEwMTczMDAwMkIyMTA0NTgxNDczMURFQ0FEQzBFMDJFMjQ2NjhGMzBBRAorOjEwMTc0MDAwMkIyMDBDMEY4RjE0NjNGRjY2MjkyMTM4QzA4ODc5ODMwMgorOjEwMTc1MDAwMUY4QzMxMENGQzUwNjRDRjU2MkIyMTA0QzBDMDU4MTQ5MAorOjEwMTc2MDAwNjgxREVDQTJDMEUwOEYzMDJCMjAwQzBGOEYxNDYzRkY5QworOjEwMTc3MDAwM0UyQzIwNjYyQjIxMDRCMUNDMEMwQzQ3MkMyNDY2NTgzRgorOjEwMTc4MDAwMTQ2MDFERUM5QUMwRTAyRTI0NjY4RjMwMkIyMDBDMEZDNQorOjEwMTc5MDAwOEYxNDYzRkYxQTAwMDAwMDZDMTAwNEMwQjdDMEExMTZCQworOjEwMTdBMDAwRUM5NjE1RUM4OEQ3MjBEODQwQjgyMkMwNDAwNTM1MDIwOQorOjEwMTdCMDAwOTY3MTk1NzAwMkE0MzgwNDA0NDJDOTRCMUFFQzdCMTk0NworOjEwMTdDMDAwRUM3QzI5QTY3RUMxNDBEMzBGNkQ0QTA1MDA4MDg4MDBCRAorOjEwMTdEMDAwMjA4QzIyMEE4OEEyNzJEMTBGQzA1MDA4QTUzODc1QjA5QgorOjEwMTdFMDAwRTM2M0ZGRDc2QzEwMDY5MzEzOTQxMTI5MjAwNjY1NTIwQQorOjEwMTdGMDAwODhDMDcxNjg5ODA1MkE5Q0Y5NjVBMjk4MTZFQzZGMjkzMworOjEwMTgwMDAwMjEwMjhBMTMwOTA5NEM2NTkwQ0Q4QUEwMEE2QTUxMkFERgorOjEwMTgxMDAwQUNGRDY1QTBDMkNDNUZEQjMwREEyMDhDMTE1ODE1MTIwQworOjEwMTgyMDAwQzA1MTlBMTNDN0JGOUJBOThFMTMyRUUyMDk2OEUwNjBDRQorOjEwMTgzMDAwMkY2MjlFMURFQzYwNkZGODAyNjAwMDg0MkREMjI2NjgzNgorOjEwMTg0MDAwRDAwNTJGMjIwMDdERjk3ODJDNjI5REM3OTA2NEMwNzA2RQorOjEwMTg1MDAwOUMxMDhBMTMyQjIwMEMyQUEwMjAwQ0JEMTFBNkREMEE5NworOjEwMTg2MDAwNEYxNEJGQTgwOTg4MDEyOUQyODZBRjg4Mjg4QzA5NzkyRQorOjEwMTg3MDAwOEI1OTFGRUM1MjBGQkYwQTJGRjJBMzY4RjAwNTI4MjJFNAorOjEwMTg4MDAwMDA3Rjg5NDcyOUQyODVENDkwNjU5MDc1NjAwMDQzMDAxOAorOjEwMTg5MDAwMDAyQjIwMEMxRkVDNEEwQ0JEMTFBNkREMjlEMjg2MEZBRgorOjEwMThBMDAwQkYwQTZFOTYxMDJGRjJBMzY4RjAwNDg4MjA3Rjg5MDU4NgorOjEwMThCMDAwMjlEMjg1NjU5MTY1REEyMDU4MTU3REM5NUM2MDAxRkZFNAorOjEwMThDMDAwMDBEQTIwQzBCNjU4MTU3QTYwMDAwQzAwQzA5MDYzRkZBMworOjEwMThEMDAwQjUwMDAwREEyMDU4MTU3NjY1NTFFNDhEMTM4QzExREJDNAorOjEwMThFMDAwRDA4REQwMDIyQTAyMEQ2RDUxNTgxM0UzOUExMzY0QTFEMgorOjEwMThGMDAwQ0VDNzVGOEZBMTk1QTlDMDUxMEYwRjQ3OUYxMTYzRkVGRgorOjEwMTkwMDAwRkQwMEMwOTFDMEYxMjgyMDA2MkMyMDY2Mjg4Q0Y5QTc4NAorOjEwMTkxMDAwQ0MwQzBDNDcyQzI0NjY2RkM2MDk4RDEzOEREMTcwREU1QworOjEwMTkyMDAwMDIyOTBBMDAwOTlEMDI2NDgxNTlDOUQzOEExMDJCMjExQQorOjEwMTkzMDAwMDQ1ODEzRjM4QTEzQzBCMDJCMjQ2NjJFQTIwOTJBQTBFMAorOjEwMTk0MDAwMjAwRTI4MTQxQ0VDMjk4RDEzMTVFQzFEQzE3MDBBNzc4QworOjEwMTk1MDAwMzY4NTU2MkREQzI4QUMyQzlDMTJERUQwQTg1NTdDRDNDNQorOjEwMTk2MDAwMDIyRURERjhEM0UwREE0MDA1NUIwMkRDMzA1QkZGOEE1MworOjEwMTk3MDAwRDRBMDI4MjAwQ0I0NTVDMEQwMkIwQTg4MkYwQTgwMEM4NAorOjEwMTk4MDAwOEMxMUE2Q0MyOUMyODVBRjNGQUI5OTI5QzY4NTFDRUMyQQorOjEwMTk5MDAwMTJERUYwQUM4ODJEODRDRjI4MTIwMjI5MTIwMzc4RjNDRQorOjEwMTlBMDAwMDIyRUZERjgyODkwMjBEM0UwMDc4ODBDQzE3MDA4MDhBQgorOjEwMTlCMDAwNDcyODk0MjAwODc3MzY2NTdGQUI4OTEzMTNFQzEwODk4QworOjEwMTlDMDAwOTBDMEY0Nzc5NzQ5MUJFQzBFQzFDQTI4MjEwNDg1MTNGNworOjEwMTlEMDAwMDk5RTQwMDZFRTExODc1MzA0ODgxMTg1NTIwRTg4MDIzNQorOjEwMTlFMDAwMEM4ODAyOUJBMDlGQTE4RjJCOURBNTk4QTQ5N0E3OTVEQgorOjEwMTlGMDAwQTYwM0ZGMDI5RkEyMkMyMDBDMUVFQkY3QUVDRTBDQ0M1MAorOjEwMUEwMDAwMTEwNkNDMDgyQkMyODUyREU0Q0YyQkJDMjAyQkM2ODUxQworOjEwMUExMDAwMkEyQzc0OEIxMTU4MEQ5Q0QyQTBEMTBGMjgyMDNEQzBDOAorOjEwMUEyMDAwRTA3Qzg3N0YyRTI0NjcwRTBBNDc2NUEwN0IxQUVCRjVDMgorOjEwMUEzMDAwODgyMDFFRUJFMzhGMTM4RUU0OEZGNDA4ODgxMTBBODg0OAorOjEwMUE0MDAwMDIwRjhGMTRBRkVFMUZFQkYwOTg5MTBGRUUwMjlFOTBGNQorOjEwMUE1MDAwMUVFQkVGQzA4MDFBRUJFMDJDRDI4NUFBQkFCOENDMjhENgorOjEwMUE2MDAwQTRDRjJDRDY4NTJDMjEwMjJGMjA3MjBFQ0MwMkIxRkZFMAorOjEwMUE3MDAwMkYyNDcyMkMyNTAyQzAyMEQxMEY4NzEzODc3MDA3MDdFRgorOjEwMUE4MDAwNDc2M0ZENkUyODIxMzhDMDk5Nzk4QjAyNjNGRTlBREQ4OQorOjEwMUE5MDAwRjA2M0ZFOTUwMERBMjBEQjMwOEMxMURENTA1ODE1OTY4RQorOjEwMUFBMDAwRDJBMEQxMEZDMEUxNjNGRjdBOEIxMzhDMTFERDUwQzAzRgorOjEwMUFCMDAwQUEyRTBBODAyQTI0NjhEQTIwNTgxM0YxRDJBMEQxMEY2NgorOjEwMUFDMDAwQzAyMEQxMEY2QzEwMDYyOTIxMDJDMEQwNzU5NzEwMkFCMgorOjEwMUFEMDAwMzIwNDdGQTcwQThCMzU3RkJGMDUyRDI1MDIwREQ5MDI2MQorOjEwMUFFMDAwMDkwQzRDNjVDMTgyMTZFQkI0MUVFQkIyMjg2MjlFQzA5NQorOjEwMUFGMDAwRkE3OEYzMDI2MDAxODgyOUUyMjY2ODkwMDc4QTIwMDlCMworOjEwMUIwMDAwQUEwQzY1QTE3QTJBNjI5RERGQTA2NEExNzcyQjIwMEMyNAorOjEwMUIxMDAwMENCQzExQTZDQzI5QzI4NkMwOEM3OTgzMDI2MDAxNTcwNworOjEwMUIyMDAwMTlFQkE3MDlCOTBBMjk5MkEzNjg5MDA3ODgyMDA5ODhBOAorOjEwMUIzMDAwMEM2NTgxNDMyN0MyODUxQ0VCQTk2NDcxM0E4OTMxMDk4MAorOjEwMUI0MDAwOEIxNDBDQkIwMTZGQjExRDJDMjA2NjlGMTBCMUNDMEMwNworOjEwMUI1MDAwMEM0NzJDMjQ2NjZFQzYwMjYwMDE0MDA5RkY1MDY1RjFGNworOjEwMUI2MDAwM0E4QTEwMkFBQzE4ODkzNEMwQzQ3Rjk3M0MxOEVCQTk3NAorOjEwMUI3MDAwMUJFQkE4OEYzNTlDNzE5QjcwOEIyMDlENzQwOEJCMDI1QQorOjEwMUI4MDAwOUI3MkMwODI5ODc1MUJFQkE0MEYwODQwOUI3MzBGODg1MworOjEwMUI5MDAwMTE5ODc3N0ZGNzBCMkYyMTAyMjg0QTAwMDhGRjAyMkZBOAorOjEwMUJBMDAwMjUwMkMwQjQ2MDAwMDQwMDAwMDBDMEIwN0U5NzA0OEYxRQorOjEwMUJCMDAwMzYyRjI1MjI3RDk3MDQ4ODM3MjgyNTIxN0M5NzM2QzAyQgorOjEwMUJDMDAwRjFDMDkwMEFGOTM4MkYzQzIwMDkwOTQyNjQ5MDg2MTkyNworOjEwMUJEMDAwRUI3NjE4RUI3NzI4OTY3RTAwRjA4ODAwQTA4QzAwRjA1QQorOjEwMUJFMDAwODgwMEEwOEMwMEYwODgwMEEwOEMyQTYyOUQyREU0QTJDMQorOjEwMUJGMDAwMkFBQzE4MkE2NjlEODkzMDc3OTczODhGMzM4QTMyMTgzNQorOjEwMUMwMDAwRUI4MDA3QkUwQjJDMjEwNEI0QkIwNENDMTE5OEUwQzBDMAorOjEwMUMxMDAwODQ5OEUxODgyQjlERTU5QUU2OUZFNzFBRUI3ODA5OUY2NworOjEwMUMyMDAwNDAwNkZGMTEwRkNDMDIwQTg4MDI5OEUyQzFGQzBGQ0NEQgorOjEwMUMzMDAwMDIyQ0U2MDRDOUI4MkMyMDBDMUVFQjY3MENDQTExQUVBRQorOjEwMUM0MDAwQ0MwNkFBMDgyOUEyODUyREM0Q0YwOUI5MEIyOUE2ODVERgorOjEwMUM1MDAwQ0Y1Q0MwMjBEMTBGQzA4MUMwOTAwRjg5MzhDMDg3Nzk3OAorOjEwMUM2MDAwODgwMjYzRkY3MjYzRkY2NjAwQ0M1N0RBMjBEQjMwREM0QQorOjEwMUM3MDAwNDA1ODEzRkRDMDIwRDEwRkRBMjA1ODE0OEQ2M0ZGRThCRgorOjEwMUM4MDAwQzBBMDYzRkU4MkRBMjBDMEI2NTgxNDg5NjNGRkQ5MDA3MQorOjEwMUM5MDAwREI0MDJBMkM3NDU4MENGQ0QyQTBEMTBGOEExMDJCMjFDNworOjEwMUNBMDAwMDQ1ODEzMTcxRUVCNDRDMEQwMkQyNDY2NjNGRUIxMDAwOAorOjEwMUNCMDAwNkMxMDA2RDYyMDE5RUIzRjFFRUI0MTI4NjEwMjE3RUI5MgorOjEwMUNDMDAwM0UwODA4NEM2NTgwNUY4QTMwMEE2QTUxNjlBMzU3MkIyOQorOjEwMUNEMDAwNzI5RTZFQjgzRjJBOTIyNjY4QTAwNDhDNjA3QUM5MzQzRQorOjEwMUNFMDAwMkE3MjlEMkM0Q0ZFQ0FBQjJCNjAwQ0I2NEYwQ0JEMTE1QQorOjEwMUNGMDAwQTdERDI4RDI4NjBFQkUwQTc4RkIyNjlDMTEyRUUyQTMxMQorOjEwMUQwMDAwMkMxNjAwNjhFMDA1MkY2MjAwN0VGOTE1MjJEMjg1Q0ZERgorOjEwMUQxMDAwMjU2MDAwMEQwMERBNjBDMEI2NTgxNDY1Qzg1QTYwMDEyRAorOjEwMUQyMDAwMEYwMERBNjA1ODE0NjI2NTUxMDZEQzQwREIzMDhEMzBGQworOjEwMUQzMDAwREE2MDBENkQ1MTU4MTJEMEQzQTA2NEEwRjM4NEExQzAxNQorOjEwMUQ0MDAwNTEwNDA0NDc2M0ZGNkQwMEMwQjAyQzYwNjY4OTMxQjE1NworOjEwMUQ1MDAwQ0MwQzBDNDcyQzY0NjY2RkM2MDI3MDk2MEEyQjYxMDQ4QgorOjEwMUQ2MDAwNTgxMkU3QzBCMDJCNjQ2NjY1NTBCNDJBM0MxMEMwRTczNworOjEwMUQ3MDAwREMyMEMwRDFDMEYwMDJERjM4MEYwRjQyNjRGMDkwMTlCMAorOjEwMUQ4MDAwRUIwQTE4RUIwQjI4OTY3RThEMTA2RERBMDUwMEEwODgwMworOjEwMUQ5MDAwMDBDMDhDQzBBMDg5MzAxREVCMUE3Nzk3NTM4ODMyOEMxNQorOjEwMURBMDAwMTA4RjMzMDJDRTBCQzAyNDkyRTEyMjYxMDQ5REUwMDQyNworOjEwMURCMDAwMjIxMThENkI5QkU1OUZFNzk4RTYxRkVCMTAwOTk4NDA3OQorOjEwMURDMDAwMDY4ODExMDgyMjAyMEZERDAyQzE4RDlERTIwODIyMDI2MQorOjEwMUREMDAwOTJFNEI0QzIyRTYwMEMxRkVCMDAwQ0U4MTFBNzg4MkMxMworOjEwMURFMDAwODI4NUFGRUUwQzIyMEIyQkU0Q0YyMjg2ODVEMkEwRDFDOAorOjEwMURGMDAwMEYyODYwMENEMkEwOEMxMTE5RUFGODBDOEQxMUE5ODg1QgorOjEwMUUwMDAwQTdERDJFRDI4NTJCODRDRjBFQ0MwQjJDRDY4NUQxMEZGRgorOjEwMUUxMDAwQzBGMDBBREYzODdGRTgwMjYzRkY2QzYzRkY2MDAwMDBGOAorOjEwMUUyMDAwMkE2Qzc0QzBCMkRDMjBERDQwNTgxMkM1QzBCMDYzRkYxQworOjEwMUUzMDAwNjNDMDIwRDEwRjAwMDAwMDZDMTAwNDI5MjAwNjJBMjI2NAorOjEwMUU0MDAwMUVDMDM5MkMyMjFEMjMyNDY4QzAzMDdBQzEwN0REQTBCMgorOjEwMUU1MDAwNjAwMDA0MDAwMDAwQzBEMDZFOTczOEMwOEYyRTBBODA0QQorOjEwMUU2MDAwMkIyMDE0QzA5NjI5MjQwNjBFQkIwMjJFMjEwMjJCMjRGRgorOjEwMUU3MDAwMTQ3RTgwMDQyMzI1MDJERTMwN0FDMTBFQzhBQkRCRDA4RAorOjEwMUU4MDAwREEyMDJDMEEwMDU4MEIwNjJFMjEwMjBFMEY0Q0M4RkUzOQorOjEwMUU5MDAwNjAwMDY5MDA2ODk1NjUyODIxMDIwODA4NEM2NTgwNUMyRgorOjEwMUVBMDAwMUFFQUM2MUVFQUM0MkJBMjlFQzA5QTdCOUI1RTJCRTI1NgorOjEwMUVCMDAwMjY2OEIwMDQ4QzIwN0JDOTUzMjlBMjlEMUZFQUMxNjQwNworOjEwMUVDMDAwOTA0QTkzOTBDMEMzMURFQUQ1MkIyMTA0OUQ5NjA4QkI3MAorOjEwMUVEMDAwMTEwQ0JCMDI5Qjk3OUI5MTFDRUFEMkMwODUyM0U0QTIwNAorOjEwMUVFMDAwMkJBMjlEMjgyNDA2OERGQTI4MjEwMkIwREQyQkJDMzBDMAorOjEwMUVGMDAwMkJBNjlEOURGQTBDODgwMjI4MjUwMkM4RDJDMDIwRDFBRAorOjEwMUYwMDAwMEY4RUY5MTJFQUM4MkUyNjg5QzAyMEQxMEZEQTIwQzAyMAorOjEwMUYxMDAwQjY1ODEzRTdDMDIwRDEwRjZDMTAwNjJBMjAwNjk0MTA4MworOjEwMUYyMDAwNjhBODA1MjhBQ0Y5NjU4MjUwMjkyMTAyMDkwOTRDNjU4OQorOjEwMUYzMDAwOTIwQUNDNUZEQjMwREEyMDhDMTA1ODEzNEJDMDUxRDM5RgorOjEwMUY0MDAwQTBDN0FGOUEzQUMwRDAxQ0VBOUQxNEVBQTMxRUVBOUMyRgorOjEwMUY1MDAwOEYzQTE2RUE5OUIxRkI2NEIxMzEyODYyOUU2Rjg4MDIwQworOjEwMUY2MDAwNjAwMUVEMjk0QzMzMjk5MjI2Njg5MDA3OEEyMDA5QUEzRQorOjEwMUY3MDAwMEM2NUExREMyQTYyOURDMDhFNjRBMUQ0MkIyMDBDMENDMAorOjEwMUY4MDAwQjcxMTA2NzcwODI5NzI4Njc5ODMwMjYwMDFDRDBDQjlGMgorOjEwMUY5MDAwMEEyOTkyQTM2ODkwMDgyQzIyMDAwOUNDMEM2NUMxQkJDOQorOjEwMUZBMDAwMjc3Mjg1NjQ3MUI1MjgyMDA2Mjg4Q0Y5NjQ4MUU1MkM5OAorOjEwMUZCMDAwMjA2Njg5MzFCMUNDMEMwQzQ3MkMyNDY2NkVDNjAyNjBCOQorOjEwMUZDMDAwMDFBMTA5Rjg1MDY1ODE5QjJBMjEwNDhDRTQ4ODM2MUUwMgorOjEwMUZEMDAwRUE3RDA4ODkxNEE5Q0MwODA4NDcwOTg4MTAxOUVBOTJGMworOjEwMUZFMDAwMEVDQzAyOUM3MDk5NzE4QzJBMUVFQTkwMDhDQzAyMEVDRAorOjEwMUZGMDAwQ0MwMjlDNzIyRTMwMkMyOTMwMTMyODMwMTIwNDk5MTBGOAorOjEwMjAwMDAwMDY4ODEwMENFRTEwOUY3NDBFQUUwMjA5ODgwMjA4RUVDRQorOjEwMjAxMDAwMDI5RTczOEMzNzA0QUExMTlDNzU4OTM4QzBGNDk5NzY5NgorOjEwMjAyMDAwODgzOUMwQzE5ODc3MThFQTgyOEUzNTlDN0I5RTc4MEVERAorOjEwMjAzMDAwOEUxNDA4RUUwMjlFN0E4RTMwMUNFQTcxNzdFNzMwODhBMworOjEwMjA0MDAwMzI4OTMzOUM3QzlGN0QwRTlDNDAwNkNDMTE4RjJCMjlCRQorOjEwMjA1MDAwNzYxMzJENzYxMTI4NzYxMjBDQUEwMjE4RUE2OEMxQzlFNworOjEwMjA2MDAwMENBQTAyMkE3NjEwMDhGRjAyOUY3RUMwQUE2MDAwMDExNworOjEwMjA3MDAwQzBBNkE0QkMwQ0I5MTFBNjk5Mjg5Mjg1MkRDNENGMDg3RQorOjEwMjA4MDAwQTgwQjI4OTY4NTY1NTEwMEMwMjBEMTBGMkIyMDBDMEM4MQorOjEwMjA5MDAwQjcxMTA2NzcwODJBNzI4NjBDQjkwQTZGQTkwMjYwMDE4NworOjEwMjBBMDAwMTgyOTkyQTM2ODkwMDgyQTIyMDAwOUFBMEM2NUExMDlBMAorOjEwMjBCMDAwMkE3Mjg1NjRBMTAzMkMyMDNEMEMyQzQwNjRDMDhDOENCQQorOjEwMjBDMDAwMzUwQzhDMTQ2NEMwODQ4RkU1N0NGMzdGOEMzNjBDOENDQgorOjEwMjBEMDAwMTQ2NEMwNzc3Q0YzNzQyODMwMTNDMEZDNzhGODZDQzBBQgorOjEwMjBFMDAwOTAyOTI0NjcwOTBDNDc2NUMwRDcxOUVBNDcxOEVBNDVDMworOjEwMjBGMDAwOEYyMDhDMzUwOEZGMTEwQzhDMTQwOEZGMDI4OEU0OUY5OAorOjEwMjEwMDAwQTFBQzhDMDlDQzAyOUNBMDhDMzY5RkEzMEM4QzE0QUM4NworOjEwMjExMDAwODgwOTg4MDI5OEEyMThFQTNEQTRCQzJGNzI4NTJEQzRCNAorOjEwMjEyMDAwQ0YyRkZDMTAyRjc2ODUyRjIxMDIyOTIwNzIwOEZGMDI2NQorOjEwMjEzMDAwQjI5OTI5MjQ3MjJGMjUwMkMwMjBEMTBGMDBDQzU3REE4MgorOjEwMjE0MDAwMjBEQjMwOEMxMDU4MTJDOEMwMjBEMTBGQzA5MTYzRkYyMworOjEwMjE1MDAwOEZEQTIwQzBCNjU4MTM1NjYzRkZFMTAwREEyMDU4MTMxNworOjEwMjE2MDAwNTQ2M0ZGRDgyQjIxMDQ1ODExRTYxRUVBMTUyQjIwMENDRQorOjEwMjE3MDAwQzBEMDJEMjQ2NjhGM0E2M0ZFNEREQTIwREIzMERDNDA4MAorOjEwMjE4MDAwREQ1MDU4MTNEREQyQTBEMTBGMkEyQzc0OEIxMDU4MEJDMAorOjEwMjE5MDAwQkVEMkEwRDEwRjI5MjEzOEMwODg3OTgzMkU4QzMxMEM3MgorOjEwMjFBMDAwRkM1MDY0Q0UyMjJCMjEwNEMwQzA1ODExRDVDMEQwMUVEMworOjEwMjFCMDAwRUEwNDhGM0EyQjIwMEM2M0ZFMEREQTIwNTgxMzNDNjM5RgorOjEwMjFDMDAwRkY3QURBMjA1QkZGMUNEMkEwRDEwRjAwMkMyMDY2MkJGNworOjEwMjFEMDAwMjEwNEIxQ0MwQzBDNDcyQzI0NjY1ODExQzkxRUU5RjgxNworOjEwMjFFMDAwMkIyMDBDQzBEMDJEMjQ2NjhGM0E2M0ZEREEwMDAwMDA0RQorOjEwMjFGMDAwNkMxMDA4OTUxNEMwNjFDMUIwRDk0MDJBMjAzREMwNDA4MAorOjEwMjIwMDAwMEJBQTAxMEE2NDM4MkEyMDA2MjkxNjA1NjhBODA1MkM5RAorOjEwMjIxMDAwQUNGOTY1QzMzRjFERTlFQTY0NDAwNTJGMTIwNDY0RjI3RQorOjEwMjIyMDAwQTAyNjIxMDIxRUU5RTYwNjA2NEM2NTYyRTYxNUU5RTJGMworOjEwMjIzMDAwNjQ0MEQ5OEEzNTI5MzAwMzlBMTMwQTk5MEM2NDkwQ0NFQQorOjEwMjI0MDAwMkMyMDBDOEIxMzlDMTAwQ0NDMTFBNUNDOUMxMTJDQzJGNworOjEwMjI1MDAwODZCNEJCN0NCMzAyNjAwMkQ3OEYxMDBFRkUwQTJFRTI1QQorOjEwMjI2MDAwQTM2OEUwMDk4NjIwRDMwRjBFNjYwQzY1NjJDMjg4MTE1MAorOjEwMjI3MDAwMjg4Mjg1NjQ4MkJBODkxMzY0OTA1RURBODBEOTMwOENCMgorOjEwMjI4MDAwMjAxRUU5RTAxRkU5RTExREU5Q0U4QjEzOERENEQ0QjAwNworOjEwMjI5MDAwN0ZCNzE4Qjg4QTI5M0MxMDg1MzYwOEM2MTEwRTY2MDIyOQorOjEwMjJBMDAwOTY4MTA1ODUxNEE1RDUwRjU1MDI5NTgwMDQxODE0NkRFNworOjEwMjJCMDAwODkyNzg4OTYwOENCMTEwODg4MTQwRUJCMDJBOEQ4Mjk1NAorOjEwMjJDMDAwOUMyMDBGODgwMjlCQTE5OEEwODg5MjlCQTMwODg4MTQ0OQorOjEwMjJEMDAwQThEODBGODgwMjk4QTIyQUFDMTAxOUU5Q0NDMEMwOEZFOAorOjEwMjJFMDAwMTMxRUU5QkQ4NjExOEQxMDI4NjI4NUFFREQwOEZGMEIzNworOjEwMjJGMDAwMkNENENGMjgyMTAyMkY2Njg1OEIzNTJBMjA3MjA5ODg5RAorOjEwMjMwMDAwMDJBQkFBMjgyNTAyMkEyNDcyQzAyMEQxMEYyOTUyOUU4RQorOjEwMjMxMDAwMThFOUE5NkY5ODAyNjAwMjBCMjg4MjI2Njg4MDA4MjlCNAorOjEwMjMyMDAwMjIwMDA4OTkwQzY1OTFGQzJBNTI5REMxQ0U5QTEyNjQzNAorOjEwMjMzMDAwQTFGMjJCMjAwQzI2MjAwNjBDQjgxMTA1ODgwODJEODI0RQorOjEwMjM0MDAwODYwRUJFMEE3REMzMDI2MDAyMDUyRUUyQTM2OEUwMDg4NQorOjEwMjM1MDAwMkYyMjAwMEVGRjBDNjVGMUY2Mjg4Mjg1RDc4MERFODBFMworOjEwMjM2MDAwNjQ4MjAwOTgxNjI2NkNGOTY0NjIwMTJDMjA2Njg4MzExQworOjEwMjM3MDAwMkNDQzAxMEMwQzQ3MkMyNDY2NkVDNjAyNjAwMUJDMDhGNAorOjEwMjM4MDAwRkQ1MDY1RDFCNjFERTlBQjFDRTk4RjE5RTk5NjJBMjFFQworOjEwMjM5MDAwMDQ4QjJEMjgzMDEwMkYyMTFEMEM4ODEwMEJGQjA5MEFFRgorOjEwMjNBMDAwODgwMjA5ODgwMjBDQkIwMjY0NDE1MjlCNzA5RDcxOTg5RgorOjEwMjNCMDAwNzJDMDREOEQzNUQ5RTA2NEQwNkVENzMwREJEMEQ4MzBDNworOjEwMjNDMDAwN0ZENzE0MjczQzEwQkNFOTI2MzIxNjhDMzk5NkU2OUM0MAorOjEwMjNEMDAwRTc4QTM3QjQzODJBRTYwODBCMTMxNDY0MzA0QTJBODI5NQorOjEwMjNFMDAwMTY4Njc5OUE5Njk2OTc4Qzc3OEE3RDlDOTgyQjgyMTc3OQorOjEwMjNGMDAwMkM3QzIwOUE5QTJBOUMxODlCOTk4NjdCQjAzQjI5OEMyRQorOjEwMjQwMDAwMDg2REI5MjE4QkM5OTZBNTI2OTIxNjJBQUMxOEI4OTlFMQorOjEwMjQxMDAwOUJBMTk2QTA4QkM3ODZDRDlCQTIyQjkyMTU5NkE0OUJDMQorOjEwMjQyMDAwQTM4NkNCMkNDQzIwMjZBNjA1QzAzNDZCRDQyMDBEM0IzNAorOjEwMjQzMDAwMEMwREQ4MDkwRTg4MEE3RkI3MDVDMDkwOTk4OEJDODgxMgorOjEwMjQ0MDAwQzA5MDBCMUExMjZEQUEwNjk5ODg5OThCMjg4QzE4QzAxNworOjEwMjQ1MDAwRDAxQkU5N0ExQ0U5NzkxNkU5NkVCMUZGMkEyMTFDMjMwOQorOjEwMjQ2MDAwRTYxMzBGMEY0RjI2RTYxMjJGMjUxRDdGQTkwNkMwRjA5OQorOjEwMjQ3MDAwQzA4MDI4MjUxRDA1RjYxMTFBRTk2NzhGMjAyQkU2MTU2NworOjEwMjQ4MDAwMkNFNjE2MkRFNjE3MjZFNjE4MEFGQTAyMkFFNjE0Mjk4MworOjEwMjQ5MDAwMjAwNjI5OUNGOTY0OTBGODI5MjAwQzhEMTRDMDgwMUExQworOjEwMjRBMDAwRTk0RTBDOUMxMUFBOTlBNUNDREEyMDJCQzI4NTI4OTQ2MAorOjEwMjRCMDAwQ0YwQjRCMEIyQkM2ODVDMEIwOEMxNTU4MTFCQkQyQTBDRgorOjEwMjRDMDAwRDEwRjhBMzU2RkE1NDZEODMwOEJENTZEQTkwQzhBODY3OQorOjEwMjREMDAwMEE4QTE0Q0JBNzdBQjMzNTI4OEMxMEMwODAyODI0NjdDOQorOjEwMjRFMDAwMDgwQjQ3NjVCMTBCREEyMERCMzAyQzEyMDU1ODExREVFMgorOjEwMjRGMDAwRDNBMEMwQzFDMEQwMkRBNDAzOUMxNDYzRkQyMjg2MzY5NgorOjEwMjUwMDAwNjQ2MTA1OUI3MDlENzE5ODcyQzA0RDYzRkVBNEMwODE4QgorOjEwMjUxMDAwNjNGRkM5MDA4ODE0Q0M4N0RBMjBEQjMwOEMxNTU4MTE5MgorOjEwMjUyMDAwRDJDMDIwRDEwRkRBMjBDMEI2NTgxMjYxNjNGRkU0MDA5OAorOjEwMjUzMDAwMDBEQTIwOEIxMDU4MTI1RTYzRkZEODAwOUUxNzhBMTJCMworOjEwMjU0MDAwMkIyMTA0NTgxMEVGOEUxN0MwOTAyOTI0NjY2M0ZFMzRBNworOjEwMjU1MDAwQzA4MDYzRkUwNkRBMjBEQjMwOEMxNURENTA1ODEyRTZCMQorOjEwMjU2MDAwRDJBMEQxMEZEQTIwNTgxMjUyNjNGRkE3MDAyQjIxMzhENgorOjEwMjU3MDAwQzBBODdCQUIwMjYwMDEwNDhDMzEwQ0ZDNTA2NENFMDQxQgorOjEwMjU4MDAwOEExMjJCMjEwNEMwQzA5ODE3NTgxMEREOEUxNzYzRkRFNgorOjEwMjU5MDAwRjMyRDIxMzgyRERDRkYwRDBENEYyRDI1Mzg2NURFRjc4RAorOjEwMjVBMDAwMjgyMDZBN0Y4NzA1MDgyNjQxNjQ2MEEzQzA5MDE2RTk0OQorOjEwMjVCMDAwMTQxQ0U5MjMyQTIwMDcyM0U2MUJCMUFBMENGRDAyMjZERQorOjEwMjVDMDAwRTYxQTJCMjAwQTI5RTYxRDJERTYxRTBDQkIwMjJCRTY3RgorOjEwMjVEMDAwMUM4QjI2MEEwQTQ3MkJFNjIwOEIyODJBRTUzRTJCRTY5MQorOjEwMjVFMDAwMjEyOTI0MDcyODIwMDYyQTIwNjQ2ODgzNDZCNDQ0NjNFRQorOjEwMjVGMDAwRkVBNURCMzBEQTIwOEMxNThEMTQyRTBBODBDMDhFMjhDMworOjEwMjYwMDAwMjQ2ODU4MTExRkQyQTBEMTBGMkU3QzQ4MTlFOEVEMkE1QQorOjEwMjYxMDAwMzIxNjJCNzYxMjlENzEyRDc2MTMyODc2MTQ4OTk2MEEyMAorOjEwMjYyMDAwMkExNEFBOTkwQzk5MDI5OTcwNjlFRDcxQzE0NjYzRkQ0QgorOjEwMjYzMDAwODEwMDAwMDA2NEFGQjUxREU4RTIyQzIwMTY4REQyMEE5RgorOjEwMjY0MDAwQ0MwQzAwRDEwNDAwQ0MxQUFDQkM5QzI5NjNGRjlEMDBDQgorOjEwMjY1MDAwMkIyMTA0NkVCODFFMkMyMDY2QjhDQzBDMEM0NzJDMjQwMQorOjEwMjY2MDAwNjZDOUMwOUUxNzhBMTI1ODEwQTY4RTE3QzAzNDhGMjBENAorOjEwMjY3MDAwQzBEMDJEMjQ2NkMwNjgyNjI0MDY2M0ZGMkU4QTEyMkI0NAorOjEwMjY4MDAwMjEwNDJDMjA2Njk4MTdCMUNDMEMwQzQ3MkMyNDY2NThEQQorOjEwMjY5MDAwMTA5QzhFMTc4NzE2QzBEMDJEMjQ2NjYzRkNFNjhEMzVGRQorOjEwMjZBMDAwQzA4MDY0RDA0QUQ5RTBEQzMwREJFMERGMzAxQUU4RTVGNgorOjEwMjZCMDAwQjE4OEI0RkYxNkU4RTU4NEM5MkQ5REZGODdDODJDQ0NFRQorOjEwMjZDMDAwMTAyN0Q2MzAwNjQ2MDEyN0Q2MzIwQTQ0MDExN0U4REYyNAorOjEwMjZEMDAwMjRENjMxQTc0NzI3RDYzMzI0RjIxNTk2Qjc5NEI2OEQ2MgorOjEwMjZFMDAwQzNCQ0JCOURCNThEMzUyOTlDMTA3RDgzQzIyRjIxMUQ5OAorOjEwMjZGMDAwQzE0NjYzRkQzMzAwMDAwMDZDMTAwNjI5MjAwNjI4OUNBQgorOjEwMjcwMDAwRjg2NTgyQkYyOTIxMDIyQjIwMEMwOTA5NEM2NTkwRTE1NAorOjEwMjcxMDAwMTZFOEFBMENCQTExQTZBQTJEQTI4NjJDMEExMjdEQzMwRAorOjEwMjcyMDAwMDI2MDAyOEMxOUU4QTYwOUI5MEEyOTkyQTM2ODkwMDdFOQorOjEwMjczMDAwOEMyMDA5Q0MwQzY1QzI3ODI5QTI4NTY0OTI3MjJENjIyNgorOjEwMjc0MDAwOUUxQUU4OUM2RkQ4MDI2MDAyNkUyQUEyMjYyOTE2MDEwMgorOjEwMjc1MDAwNjhBMDA4MkIyMjAwMEFCQjBDNjVCMjVDMjk2MjlEQzFFRgorOjEwMjc2MDAwOEM2NDkyNTQyQTIxMjAwQTgwNjA5OTEwMkMyMDNDQzc0NgorOjEwMjc3MDAwRUYwMDBGM0UwMTBCM0VCMUJEMEZEQjM5MEJCQjA5OEZFNAorOjEwMjc4MDAwMjYwREJEMTEyRERDMUMwRDBENDEwRUREMDM4RTI3QjE3NAorOjEwMjc5MDAwREQwRDBENDEwRkVFMEMwREJCMEIyQkJDMUMwQkI3MDI1RQorOjEwMjdBMDAwN0VDNzFDMkMyMTI1N0JDQjE2MkQxQUZDMENCQTBDMEREOAorOjEwMjdCMDAwQTE2MDAwMDkzRTAxMDczRUIxNzgwOTg3MzkwQjc3MEEwRAorOjEwMjdDMDAwNzdFQjAyNjAwMjBBMkMyMTIzMjgyMTIxQjFDQzBDMENDQQorOjEwMjdEMDAwNEYyQzI1MjM3QzhCMjlCMENEMkQyNTIzQzg1NURBMjBGRAorOjEwMjdFMDAwREIzMDU4MTA5NTI5MjEwMkNDOTZDMEU4MEU5RTAyMkVBRgorOjEwMjdGMDAwMjUwMkNDNTdEQTIwREIzMERDNDA1ODExMUJDMDIwRDEzOQorOjEwMjgwMDAwMEYyQzIwNjY4OTMxQjFDQzBDMEM0NzJDMjQ2NjZFQzY4NworOjEwMjgxMDAwMDI2MDAxRDMwOUZENTA2NUQxQ0QyRjBBMDEyRTMwMTE4MAorOjEwMjgyMDAwMjkyMjE0NjRFMDExMjgyMjFCMDkwQzQ0MDBDMTA0MDA3MQorOjEwMjgzMDAwRkExQTBBODgwMjI4MjYxQjJFMzAxMEMwQTBDMEIwOTRCNQorOjEwMjg0MDAwMTI5NTEzMUNFODVGODgzMDJDQzAyMjA4OEQxNDc3ODdGRQorOjEwMjg1MDAwMDRDMEYxMENGQTM4QzA0MUMwRjIyNTIwM0NDMDg0MDgwNQorOjEwMjg2MDAwNTgwMTBGNUYwMTBGNEIzODA1MzU0MDA3QkIxMEMwRjAxMgorOjEwMjg3MDAwMDg0RjM4MDhGRjEwMEZCQjAyMjhFQ0ZFQzBGMDA4NEZDRAorOjEwMjg4MDAwMzg4NDJCMEJBODEwMEFGRjEwMkEyMTIwMEY4ODAyMEI3NgorOjEwMjg5MDAwODgwMjA4NDQwMjE4RTg2RThGMTEwODQ0MDIyODIxMjU5NgorOjEwMjhBMDAwMEEyQTE0MDgyODE0MDQ4ODExMEE4ODAyMkEyMTA0OTQ4OAorOjEwMjhCMDAwRjA4QjIwMDRFNDEwMDhCQjExMDRCQjAyQzA0QTA0QkIyNworOjEwMjhDMDAwMDI5QkYxODQyQTA4QUIxMTBCRUIwMjk0RjQwQTU0MTExOQorOjEwMjhEMDAwMEI0NDAyMDU1NTEwMEQxQjQwOTRGNzA3QkIxMDBCNTUxOAorOjEwMjhFMDAwMDIwODU1MDJDMDgxOTVGNjg0MzNDMDUwOTRGM0IxOTQyOAorOjEwMjhGMDAwOEIzMjk1Rjg5OEY5OUJGMkMwODBDMUJDMjQyNjE0OTlCQworOjEwMjkwMDAwRkE5QkY1OThGQjg1Mzg5NUZDODQzQTk0RkQ4QjNCOUJBQworOjEwMjkxMDAwRkU4ODM5OThGRjg1MzUyNUY2MTA4NDM2ODUxMzI0RjYxMAorOjEwMjkyMDAwMTE4QjM3ODQxMjJCRjYxMkMwQjA2NEMwN0U4OTMwNzdDOQorOjEwMjkzMDAwOTc0MzhEMzI4ODMzMkUzMDEwOEYxMTFDRTgzMTA5OTk1RQorOjEwMjk0MDAwNDAwNjk5MTEyQ0Y2MTRDMEM0MkNGNjE1OEMyQjJERjZDQworOjEwMjk1MDAwMUEyOEY2MUIyQkY2MTkwNEE4MTEwOTg4MDIwOEVFMDJBMgorOjEwMjk2MDAwMTlFODI3QzE4MDA4RUUwMjA5QzkwMjI5RjYxNjJFRjZEOQorOjEwMjk3MDAwMThDMDlFNjAwMDAxQzA5QTJGMjAwQzE4RTgxNzBDRkVBQQorOjEwMjk4MDAwMTFBOEZGQTZFRTJERTI4NTJCRjRDRjBEOUQwQjJERTZCMQorOjEwMjk5MDAwODVDODdGOEEyNjg5MjlBN0FBOUEyNjBBOTkwQzA5MDkzNworOjEwMjlBMDAwNDgyOTI1MjU2NTUwNTBDMDIwRDEwRjAwQzA5QTYzRkZFQgorOjEwMjlCMDAwQzZEQTIwNTgxMTNGNjNGRTM4REEyMEMwQjY1ODExM0MwMQorOjEwMjlDMDAwNjNGRTJFMDA2ODk3M0MyQjlDRkQ2NEJFMjRDMDIwRDE4MgorOjEwMjlEMDAwMEZEQTIwREI3MDU4MTBGOEMwQzBDMEQxMEFEQTM5MEEwQgorOjEwMjlFMDAwREMzODY1Q0RFMDYzRkUwOThBMTAyQjIxMDQ1ODBGQzQ0MgorOjEwMjlGMDAwQzBCMDJCMjQ2NjYzRkUyMURCNDAyQTJDNzQ1ODA5QTI0OAorOjEwMkEwMDAwRDJBMEQxMEZEQTIwNTgwRkM5NjNGQ0Y3NkMxMDA0QzBCNAorOjEwMkExMDAwMjBEMTBGMDA2QzEwMDQyOTBBODAxRUU4MEUxRkU4MEU1QQorOjEwMkEyMDAwMUNFN0U2MEMyQjExQUNCQjJDMkNGQzJEQjI4NTBGQ0M3QgorOjEwMkEzMDAwMDI5RUQxOUNEMEMwNTFDMDcwMTNFODBBMTRFODA5MTg1NgorOjEwMkE0MDAwRTgwNzJBQjI4NUE4MjgwNDI0MEEyMzQ2OTFBOTg2Qjg1MworOjEwMkE1MDAwQUEyQUI2ODVBOTg4Mjc4NDlGMjU2NDlGRDEwRjAwMDBFNAorOjEwMkE2MDAwNkMxMDBBRDYzMDI4MzAxMDI5MjAwNjI4OENGOTY0ODI5MAorOjEwMkE3MDAwOUI2ODk4MEIyQTlDRjk2NUExQjIwMjJBMDI1ODBGQUJGOQorOjEwMkE4MDAwODkzNzFCRTdDRkM4OTE2NDUyMEUyQTIxMDIwQTBDNENFOQorOjEwMkE5MDAwNjVDMjU4OEQzMDE5RTdDODc0RDcwNTJFMjEyMzY1RTIyOQorOjEwMkFBMDAwOUUyRjkyOUUxQUU3QzQ2RkY4MDI2MDAyNTMyQUEyMjY1NAorOjEwMkFCMDAwNjhBMDA4MkMyMjAwMEFDQzBDNjVDMjQ0MkE5MjlENjRBRQorOjEwMkFDMDAwQTIzRTlBMTUxRkU3QkU4RDY3QzFFNkM4REQyQjYyMDZFMAorOjEwMkFEMDAwMThFN0JDNjRCMDA1Mjg4MDIxN0I4QjQzMkIyMDBDMThBMQorOjEwMkFFMDAwRTdCNjBDQkMxMUE4Q0MyOUMyODY3OUVCNDYwRkJFMEEwQQorOjEwMkFGMDAwMkVFMkEzNjhFMDA1MkYyMjAwN0VGOTM3MkNDMjg1OUNDOAorOjEwMkIwMDAwMTg2NEMyMzMyQjIxMkY4NzY2MEI3QjM2MEI3OTBDNkYzMQorOjEwMkIxMDAwOUQyNjZFRDI0NjJDMjAzRDdCQzc0MENFNTU2MDAwMUVDMAorOjEwMkIyMDAwMkEyMDBDQzFCMjhDMjA1ODExMjI5QTE4NjRBMjQ1OEQxQgorOjEwMkIzMDAwNjc2M0ZGQ0ZDMEMwNjNGRkM1RDdCMDYzRkZEMzAwQzBEQQorOjEwMkI0MDAwRTA2MDAwMDIyRTYwMDMwRURCMEM2RUIyMEVEQzcwMEMzNworOjEwMkI1MDAwRUExMUFBNkEyQUFDMjA1ODAxOTlEN0EwREEyMERCNzBDMgorOjEwMkI2MDAwQzFDODJEMjEyMDU4MTBCQzhDMjY4QjI3OUExNjBDQkI2RgorOjEwMkI3MDAwMEM3QUIzMzQ4RjE4ODk2Mzk5RjM4ODYyOThGMjhFNjU2MgorOjEwMkI4MDAwOUVGODJENjAxMDhBMTg5RDE3NjhENzI5QzBEMDlEQTk3RQorOjEwMkI5MDAwMkMyMjE4MkIyMjEzOUNBQjlCQUE5N0E1OEU2NjdFNzNDMgorOjEwMkJBMDAwMDI2MDAwOTdDRjU4NjAwMDFGREEyMDhCMTY1ODEwODIwMQorOjEwMkJCMDAwNjVBMTM4NjNGRkJEQzA4MUMwOTA4RjE4QzBBMjlBRjk4QgorOjEwMkJDMDAwOTlGQjk4RkE5N0Y1NjNGRkQyREIzMERBMjBEQzQwNThBNgorOjEwMkJEMDAwMTAyNkMwNTFENkEwQzBDMDJCQTAxMDJDQTQwMzlCMTc1OAorOjEwMkJFMDAwMkMxMjA4MDIyQTAyMDY2QjAyREY3MDJENjAwMzhFMTc3QQorOjEwMkJGMDAwOUQxNDlFMTAwQ0REMTFDMEUwQUQ2RDJEREMyMDU4MDE0MAorOjEwMkMwMDAwMTg4QzE0OEIxNkFDQUMyQzY0MDM4QTI2ODkyOUFCQUFDOQorOjEwMkMxMDAwMEE5OTBDOUEyNjg4NjYwOTA5NDgyOTI1MjUwNzg4MENFRgorOjEwMkMyMDAwOTg2NjJGMjIxOEE3RkYyRjI2MTg2M0ZFOTZEQTIwREI1RQorOjEwMkMzMDAwMzBEQzQwREQ1MDU4MTEzMEQyQTBEMTBGQzAzMDJDMjBGNAorOjEwMkM0MDAwNjY4OTYxQjFDQzBDMEM0NzJDMjQ2NjZFQzYwMjYwMDAwQworOjEwMkM1MDAwRDJDMDMwMDlGRDUwNjVEMENBOEU2NzY0RTA2OTY0NzBFNworOjEwMkM2MDAwNjZEQjYwOEMxOERGNzBEQTIwMkQ2MDAzOEUxNzBDRERCOAorOjEwMkM3MDAwMTE5RTEwQUQ2RDJEREMyMDFFRTc3NTU4MDBGOTIzMjYzRQorOjEwMkM4MDAwMThEQTIwOEIxNkRDNDAyRjIyMTNERDUwQjFGRjJGMjZERgorOjEwMkM5MDAwMTM1ODBGQzVEMkEwRDEwRjAwMjgyMDNEMDg0ODQwNjUyOQorOjEwMkNBMDAwOERFNzZGOTUzRURBMzA4REI1NkQ5OTBDOENBODBDOEM0NAorOjEwMkNCMDAwMTRDQUNGN0NEMzJEMkFBQzEwQzA5MDI5MjQ2NzA5MERFQgorOjEwMkNDMDAwNDc2NEREQzU2MDAwOTIwMDJDMTIwODA2NkIwMjJENkM3MworOjEwMkNEMDAwMjAwNzdGMDI4RTE3REEyMDlFMTAxRUU3NUM1ODAwN0RDOQorOjEwMkNFMDAwNjNGRjlBMDBDMDkxNjNGRkQxMDAwMDAwNjU1MDgxREE1NAorOjEwMkNGMDAwMjBEQjYwREM0MDU4MEZEQ0MwMjBDMEYwMkZBNDAzRDFFMworOjEwMkQwMDAwMEZEQTIwQzBCNjU4MTA2QTYzRkZFMDAwMDA2Rjk1MDIyQQorOjEwMkQxMDAwNjNGRDZDREEyMERCMzBEQzQwREQ1MEM0RTA1ODBGNTgzNgorOjEwMkQyMDAwRDJBMEQxMEY4QTE1MkIyMTA0NTgwRUY1MjMyNDY2MjgzMgorOjEwMkQzMDAwNjAxMDk4MTc2M0ZGMjEwMERBMjA1ODEwNUQ2M0ZGQUIyNQorOjEwMkQ0MDAwQzg1OERCMzBEQTIwNTgwRjNDMkEyMTAyNjVBRjlDQzBGRQorOjEwMkQ1MDAwOTQwOUE5MDIyOTI1MDI2M0ZGOTFEQjMwREM0MERENTA5NAorOjEwMkQ2MDAwQzBBMzJFMEE4MDJBMjQ2OERBMjA1ODBGNDVEMkEwRDFBOQorOjEwMkQ3MDAwMEZDMDIwRDEwRkRBMjAyQjIwMEM1ODEwNzI2M0ZGNkI4QworOjEwMkQ4MDAwNkMxMDA0MjgyMDA2QzA2MjI4OENGODY1ODEyNUMwNTA4QworOjEwMkQ5MDAwQzdERjJCMjIxQkMwRTEyQTIwNkIyOTIxMjMwMEExMDRCRAorOjEwMkRBMDAwQjA5OTI5MjUyM0IxQUEwMEVDMUEwQkM0MDEwQTBBNDRFMAorOjEwMkRCMDAwMkEyNDZCMDRFNDM5MERDQzAzMENCQjAxMkIyNjFCNjRDNQorOjEwMkRDMDAwNDA2OTI5MjAwQzFCRTZGQzBDOUExMTBCQUEwODJGQTJDMworOjEwMkREMDAwODYxQkU2RkE2RkY5MDI2MDAwQjYwQjlCMEEyQkIyQTNDMgorOjEwMkRFMDAwNjhCMDA4MkMyMjAwMEJDQzBDNjVDMEE0MkJBMjg1MUQ1QQorOjEwMkRGMDAwRTcxRTY0QjA5QjhDMkIyNDIxMDQwRENDMDI5Q0IwODg3MAorOjEwMkUwMDAwMjBDMEM1MDg4ODExMEM4ODAyOThCMTg4MkEwODQ0MTE4RQorOjEwMkUxMDAwOThCNDhGMzQ5NEI3OUZCNUMwNDAxRUU2RUYyREEyODVCRAorOjEwMkUyMDAwMEU5RTA4MjVFNENGMkREQzI4MkRBNjg1MjkyMTAyMDkzOAorOjEwMkUzMDAwMDk0QzY4OTQxQTY4OTgyMEM5NDAyQTIxMDI2NUEwMEJBMQorOjEwMkU0MDAwMkEyMjFFMkIyMjFEN0FCMTAyNjVBMDc5QzAyMEQxMEY0MworOjEwMkU1MDAwMkMyMTIzNjVDRkRFNjAwMDA4MkUyMTIxMkQyMTIzN0UyOQorOjEwMkU2MDAwREJENTJCMjIxRTJGMjIxRDI1MjUwMjdCRjkwMUMwQjBBOAorOjEwMkU3MDAwNjRCRkM0MTNFNkQwMkNCMDA3MjhCMDAwREEyMDAzODg2MgorOjEwMkU4MDAwMEEyODgyNENDMEQxMEI4MDAwREJBMDY1QUZFNzYzRkY0RQorOjEwMkU5MDAwQTYyQTJDNzRDMEIwMkMwQTAyNTgwRTJGMUNFNkY0OUNGMworOjEwMkVBMDAwQTA4QjIwMDhCQjExMDZCQjAyOUJBMTg5MzQ5OUEyNjNBOQorOjEwMkVCMDAwRkY3OTAwMDAyNjI0NjhEQTIwREIzMERDNDBERDUwNTg0MgorOjEwMkVDMDAwMTA4RUQyQTBEMTBGREEyMDJCMjAwQzU4MEZGOUMwMjA4MQorOjEwMkVEMDAwRDEwRjAwMDA2QzEwMDYwNzNEMTRDMDgwREMzMERCNDBEMQorOjEwMkVFMDAwREEyMEMwNDdDMDIxMjNCQzMwMDMyODM4MDgwODQyNzdDNQorOjEwMkVGMDAwNDAwMUIxREQ2NDgxNUExRUU2QUMxOUU2QUQyOUU2N0VEQgorOjEwMkYwMDAwRDMwRjZEREEwNTAwNTA4ODAwMzA4Q0MwRTBDMDIwMjU1QQorOjEwMkYxMDAwQTAzQzE0RTZBQkI2RDM4RkMwQzBEMDBGODcxNDI0NDBCQQorOjEwMkYyMDAwMjIwRjg5NDA5NDEwNzdGNzA0QzA4MTA0ODIzOEMwRjFFMQorOjEwMkYzMDAwMEIyODEwQzA0NEMwMjIwNDU0MDEwNEZEMzgwMjUyMDE4MQorOjEwMkY0MDAwMDJGRTM4MDhERDEwODIxQzA3RUUxMDBFNkUwMjBFREQ0OAorOjEwMkY1MDAwMDIyNDJDRkVDMEUwMDRGRTM4MEFFRTEwMEU4ODAyMEQ5QQorOjEwMkY2MDAwODgwMjhEQUIxRUU2OUIwOEQ4MDIwRTg4MDI5OEIwQzA3RQorOjEwMkY3MDAwRTgwNDI4MTAwRTVFMDE4NEEwMjVBMTI1MDg0NDExMDg0QworOjEwMkY4MDAwNDQwMjA1MjUxNDA0NTUxMTA0MzQwMkMwODEwRThFMzkwMworOjEwMkY5MDAwOTRCMThGQUE4NDEwOUZCNDc1NjYwQzI2QTExRkMwRjI0RAorOjEwMkZBMDAwMDYyNjE0NjAwMDA5MDAwMDI2QTEyMEMwRjIwNjI2MTQ5RgorOjEwMkZCMDAwMDU2NTAyMEY3NzAxMDc4NzM5MDVFNjEwMDc3ODEwMDhDNQorOjEwMkZDMDAwNjYwMjA2NTUwMjk1QjYyNUExMDQwQUU2MTEwODU4MTFCNQorOjEwMkZEMDAwMDgyODAyMDg2NjAyOTZCN0MwNjA2NDQwNTY2NDkwNTNBMQorOjEwMkZFMDAwMDY3RTExQzBGNDg5QzI4OEMzMEIzNDBCOTY0NTk4NDdGRQorOjEwMkZGMDAwOTk0NjE4RTY4MjlGNDEwNDU5MTEwRTk5MDIxRkU2ODBGNgorOjEwMzAwMDAwMDIwRTQ3MDhEODAyOTg0MjBFOTkwMjlGNDBDMUUwMEU3NgorOjEwMzAxMDAwOTkwMjk5NDQyRkEwMENCNDM4MENGOTExMTRFNjZGMUVENAorOjEwMzAyMDAwRTY2NkE0RkZBRTk5MkU5Mjg1MjZGNENGMEU4ODBCMjg3MworOjEwMzAzMDAwOTY4NUQxMEYyQkEwMEMxRkU2NjAxQ0U2NjcwQ0JFMTExNQorOjEwMzA0MDAwQUNCQkFGRUUyREUyODUyNkI0Q0YwRDNEMEIyREU2ODU1MgorOjEwMzA1MDAwRDEwRkMwODAwNTI4Mzg3ODQ4MDI2M0ZFQTI2M0ZFOTYyRgorOjEwMzA2MDAwNkMxMDA2QzBDMDY1NzBGMTg4MzBDMDMwMDg4NzE0NzdENgorOjEwMzA3MDAwODcxMkMwQjBDMEE2MTlFNjUyMjk5MDIyQzAzMENDOTc2MgorOjEwMzA4MDAwQzAzMTYwMDAwM0MwQjBDMEE2QzBFMEMwOTFDMEQ0QzBEMQorOjEwMzA5MDAwODIyNTIwM0MwQjNGMTA5NzEyODMxQ0MwNzAwODU4MDFGQQorOjEwMzBBMDAwMEQ1RDAxMDg5NzM4QzA4MDBCOTgzODA3NzcxMDA0ODhBOQorOjEwMzBCMDAwMTAwODY4MDIwODc3MDJDMDgwMEQ5ODM4MkQzQ0ZFMDg4MQorOjEwMzBDMDAwODgxMDBEOUUzODhEMkIwQUVFMTAwOEVFMDIwN0VFMDJENgorOjEwMzBEMDAwMENCODEwMEZERDAyMDUzQjQwMEVERDAyOUQ0MDg5MjAzQgorOjEwMzBFMDAwMDQzRDEwMDg5OTExMEQ5OTAyMkQyMTA0MDlBOTAyMDgyNworOjEwMzBGMDAwREQxMTk5NDE4NzJBMDVCOTEwMEQzRDAyMEFCQjExMEQ1QQorOjEwMzEwMDAwQkIwMjA4NzcwMjk3NDQyODIxMjU4NzEyMDgyODE0MDQ1NworOjEwMzExMDAwODgxMTA3MUU0MDA3RUUxMDBFOTkwMjc1NjYwOTI2MjFEOAorOjEwMzEyMDAwMUYwNjI2MTQ2MDAwMDYwMDI2MjEyMDA2MjYxNDA4NjhDMworOjEwMzEzMDAwMDI5QjQ3MDk4ODAyOTg0NjI5MjAwQ0QyQzBDMDgwMEMwNworOjEwMzE0MDAwOUUxMTFCRTYyNTFGRTYxQ0FCOTlBRkVFMkRFMjg1MjhFQworOjEwMzE1MDAwOTRDRjBEQUQwQjJERTY4NUQxMEZERDQwQzBBNkMwQjBEQworOjEwMzE2MDAwOEU1MUNBRTBCMkFBQjFCQjJEREMxMDhGNTAwRTc4MzY1QQorOjEwMzE3MDAwOTgxMDA4NzcwQzlGRDg5OEQ5ODk1MzhGNTI5OTExOTkzNAorOjEwMzE4MDAwREI5RkRBN0U4MzA5QjFDQzI1NUMxMEM5Nzc2M0ZGQ0Y2MgorOjEwMzE5MDAwODgxMDhEMTEwOEU3MEM5NzUxQUQ4REQ3RjA3OERCMDFDMQorOjEwMzFBMDAwQjFGNzlENTM5NzUyODgzMEMwMzAwODg3MTQwODg4NDA4MworOjEwMzFCMDAwNjQ4RUQ1NjVCRUM5NjNGRUJDMDAwMDAwNkMxMDA0RDdFOAorOjEwMzFDMDAwMjBCMDNBODgyMEMwMzA4MjIxQ0FBMDc0MkIxRTI5NzJGOAorOjEwMzFEMDAwMDQ2RDA4MEZDOTgwQzk5MTg1NzVCMTMzQTI1MjdBM0IzRAorOjEwMzFFMDAwMEI3NDJCMDg2M0ZGRTkwMDY0OUZFQ0QxMEZEMjQwRDEzMAorOjEwMzFGMDAwMEYwMDAwMDA2QzEwMEFENjMwMkUzMDI3RDk1MERBNDA2QworOjEwMzIwMDAwMTVFNUYwMjQzMDI2OUExNTI5MTYwNDY0RTAwMjY0OTMyQgorOjEwMzIxMDAwNzMyOTIwMDYyQTlDRjg2NUEzQ0UyQTIxMDIyNzBBMDRENgorOjEwMzIyMDAwMEEwQjRDNjVCMzk3OEMzMDc0QzcwNTJEMjEyMzY1RDRFOAorOjEwMzIzMDAwQTBDMEE2MkIwQTAzMkMyMjAwNTgwRjM2NjRBM0I5MTc4RQorOjEwMzI0MDAwRTVERThFMzg5QTE2NjRFM0JBMkY2MDI3Mjg1MDIxQzkyQworOjEwMzI1MDAwRjM3RTgzMTFDMkIwOEMyMDJBMjAwQzU4MEY1NUQ3QTBDMgorOjEwMzI2MDAwQ0RBMTYwMDRBMjAwQzJCMDhDMjAyQTIwMEM1ODBGMjlFNgorOjEwMzI3MDAwRDdBMDY0QTQ4NjJGMjEyRThCNjgwRkJGMzYwRkI5MEMwMAorOjEwMzI4MDAwNkY5RDU0Mjk2MDI3RDVCMDZFOTIwNTI4MjAzRDdCOEYxNQorOjEwMzI5MDAwNENEQTIwREI1MEMxQzQyRDIxMUY1ODBFRUY4QjI2OUEyQgorOjEwMzJBMDAwMTg5QTE5ODkyNzJBQUMzODBCOTkwQzdBOTM1Mzg5NjM5OQorOjEwMzJCMDAwQzA4MDk5NzM4RjYyOTg3ODlGNzI4RTY1OUU3OThENjdCMgorOjEwMzJDMDAwOUQ3QjhDNjY5NTc1OUM3QThFNjg3RTUzMDI2MDAwQjFGQQorOjEwMzJEMDAwOEIxNDY1QjA1MDYwMDAzOERCRjA2M0ZGQTUwMDhBMTRFMgorOjEwMzJFMDAwQzlBOTJFNjAwMzBFOUIwQzZFQjJBNURDNTAwQ0VBMTEyRQorOjEwMzJGMDAwQUE2QTJBQUMyODVCRkZCMUQ1QTA2M0ZGOTNDMEUwNjM0NAorOjEwMzMwMDAwRkZFMkRBMjA4QjE4NTgwRUFDNjVBMkIxNjNGRjlFMDA3NQorOjEwMzMxMDAwMDBEQTIwREIzMDhDMTU1ODBFNTRENkEwQzBDMEMwRDFDNgorOjEwMzMyMDAwMkQxNjA0MkNBNDAzREM3MERBMjBEQjYwREY1MDJENjA0NgorOjEwMzMzMDAwMDNDMEUwOUUxMDlEMTcxRUU1QjkwQ0REMTEwRDZEMDg1MAorOjEwMzM0MDAwMkREQzI4NUJGRjQ3OEU2NjhGNjc4ODE3QUY1RkE4QThDNAorOjEwMzM1MDAwMjg2NDAzNzVGQjAxQjFFRThBMTg5RTY2OUY2Nzg5MjY3MworOjEwMzM2MDAwODgyOUFBOTkwOTg4MEM5OTI2OEU2ODA4MDg0ODA1RUVDQworOjEwMzM3MDAwMEMyODI1MjUxNUU1OTM5RTY4NjVFRUNDNjNGRUU2MDBENgorOjEwMzM4MDAwMDAwMEM5NDMyRjIxMjMyQjIxMjEyRkZDMDEwRjBGNEZCOAorOjEwMzM5MDAwMkYyNTIzN0ZCQjAyNjAwMzE0MkMyMDY2ODk2MUIxQ0NFQQorOjEwMzNBMDAwMEMwQzQ3MkMyNDY2NkVDNjAyNjAwMjI4MDlGRDUwNjU4RAorOjEwMzNCMDAwRDIyMjY0RTFCNjJFNjAyNzY0RTFCMERDNzBERjUwREExRgorOjEwMzNDMDAwMjBEQjYwMUVFNUFCMkQ2MDAzQzA4MDk4MTAwQ0REMTE4MgorOjEwMzNEMDAwQUQ2RDJEREMyODVCRkYyMjY0NDE4MUMwNDQyQjBBMDBDNworOjEwMzNFMDAwOEMyMDJBMjAwQzU4MEVDQjBBQTcwMjY1QTAwRkMwQjA3MworOjEwMzNGMDAwMkMyMjAwMkEyMDBDNTgwRUM3RDdBMDY0QUZFRkRBMjA4OQorOjEwMzQwMDAwQzFCQ0MxQzgyRDIxMjA4RjE4OEUyNjg5MjlBRkVFOUUwMAorOjEwMzQxMDAwMjYwRTk5MEMwOTA5NDgyOTI1MjU1ODBFOEZDMDkwQzAwMQorOjEwMzQyMDAwNTBDMEMyODg2MDlBMTkxRUU1NjZDMEExMkVFMDIyMDgyRAorOjEwMzQzMDAwOEYxNDc3ODcwNEMwODEwRTg5MzhDMDgwMEI5MzEwMkRCQworOjEwMzQ0MDAwMjAzQzI5MjEyMDBDREMwMTA0REIwMTA5MjkxNDBCQThGNAorOjEwMzQ1MDAwMzgwQ0E1MzgwRDNENDAxQ0U1N0U4QjJCMDg4ODEwMDdFNQorOjEwMzQ2MDAwNTUxMDA4NTUwMjA1MzMwMjI4MjEyNTBGMTU0MDAzQkJDRQorOjEwMzQ3MDAwMDIwQ0JCMDIwNzU1MTAwNUQzMTAwODI4MTQwQUREMTFGMQorOjEwMzQ4MDAwMDQ4ODExMDk4ODAyMDUzMzAyMjkyMTA0MDgzMzAyOUJBQworOjEwMzQ5MDAwNzBDMDgwOEEyMDFCRTU3NzA4QUExMTBCQUEwMjlBNzFENgorOjEwMzRBMDAwQzBBMTg1MkE5Mzc2OTU3NDA4OTMxMTAzREQwMjBBREQ4NQorOjEwMzRCMDAwMDI5RDc3OEM2M0MxREM5QzczOEI2Mjk4Nzg5QTc5OUJCMAorOjEwMzRDMDAwNzIyMzIyMTRDMEMwQjEzNTI1MjYxNDlDN0I5RDc1OTNCMAorOjEwMzREMDAwN0EyQjYyMUE5QjdDMkE2MjFDOUE3RDI4NjIxRDk4N0UzOAorOjEwMzRFMDAwMjU2MjFCOTU3RjIzNjIxNzIzNzYxMDJENjIxODJENzY5NworOjEwMzRGMDAwMTEyQzYyMTkyQzc2MTI2NEUwQjk4RTYwNzdFNzNEQzAxQQorOjEwMzUwMDAwRkUxM0U1M0UxREU1M0ZDMTgxOEE2MjhCNjMwNDk1MTE4MAorOjEwMzUxMDAwMEU5QzQwMDZDQzExMEM1NTAyMjQ3NjE1MDg1NTAyQzBBRAorOjEwMzUyMDAwODAyRDc2MTQ4RDJCMkI3NjFCMkE3NjFBMjg3NjE5MjU1QQorOjEwMzUzMDAwNzYxODAzREQwMjJENzYxNjYwMDAwMzAwMDBDMEZBMkUxNworOjEwMzU0MDAwMjAwQzE5RTUyNTE4RTUxQ0E5RTkwQ0VFMTFBOEVFQzAyMAorOjEwMzU1MDAwODAyREUyODUyODk0Q0YwREZEMEIyREU2ODVEQTIwOEI5QQorOjEwMzU2MDAwMTk4QzE1OEQxNDU4MEQ5MEQyQTBEMTBGREM3MERGNTAzRQorOjEwMzU3MDAwREI2MDJENkMyOEMwQTAxRUU1M0U5QTEwREEyMDVCRkVCMQorOjEwMzU4MDAwNTU2M0ZFNTMwMDJCMjAzRDBCNEI0MDY1QkM4MjZGRTUxRAorOjEwMzU5MDAwMjdEQTMwOEY1NTZERTkwQzhFQUEwRThFMTRDOUU4N0U5RAorOjEwMzVBMDAwRjMxNjJBQUMxMEMwOTAyOTI0NjcwOTBGNDc2NEZDNjAwOQorOjEwMzVCMDAwNjAwMTVGMDBDMEZBNjNGRjg1QzA5MTYzRkZFODg4MTQ3MworOjEwMzVDMDAwNjU4MTY4REEyMERCNjA4QzE1NTgwREE3QzAyMEMwOTA5QgorOjEwMzVEMDAwMjlBNDAzRDEwRjhBMTYyQjIxMDQ1ODBDQzlDMEEwMkE5NAorOjEwMzVFMDAwMjQ2NjhFNjg2M0ZEQ0EwMDAwMkI5Q0Y5NjVCMEZEREE4NQorOjEwMzVGMDAwMjA1ODBDQ0U2M0ZDMjIwMDAwREEyMEMwQjY1ODBFMkNGNgorOjEwMzYwMDAwNjNGRkJBMDAyQjIwMEMwQ0JFMTFBN0VFMkRFMjg2QzE4MQorOjEwMzYxMDAwQzI3REMzMDI2MDAxMTgxOUU0RTkwOUI5MEEyOTkyQTMxRAorOjEwMzYyMDAwNjg5MDA4MkEyMjAwMDlBQTBDNjVBMTAzMjZFMjg1NjQ5NQorOjEwMzYzMDAwNjBGRDJDMjA2Njg5MzFCMUNDMEMwQzQ3MkMyNDY2NkZDMAorOjEwMzY0MDAwQzYwMjcwOTYwQzhBMTYyQjIxMDQ1ODBDQURDMEQwMkRFMgorOjEwMzY1MDAwMjQ2NjhFMzA3N0U3NEQxQ0U0RTkxQkU0RTk4RjMyODg1RAorOjEwMzY2MDAwMzNDMEE0MkQyMTA0MEU5OTQwMDY5OTExMDRERDExMDlERgorOjEwMzY3MDAwREQwMjlBNjFDMTkwMDlERDAyOUI2MEMwOTA4QjJCOUQ5OQorOjEwMzY4MDAwNjQ5RjY2OTg2Nzk5NjUwQ0JCMDI5QjYyMjgyMDBDMUFBMAorOjEwMzY5MDAwRTREMkFBOEEwQzg4MTFBNzg4MkY4Mjg1MjlBNENGMkY2QgorOjEwMzZBMDAwRkMyMDJGODY4NThBMTQ2NUEwQTZDMDIwRDEwRkIwRkMwRgorOjEwMzZCMDAwOEIxNDJDMjUyM0M4QjcwMjJBMDIwNjZCMDI1ODBDREU5NQorOjEwMzZDMDAwMkEyMTAyNjVBRUY3QzBEODBEQUQwMjJEMjUwMjYzRkU5QQorOjEwMzZEMDAwRUMwMDhFMTRDOEU4REEyMERCMzA1ODBDRDcyQTIxMDIxRgorOjEwMzZFMDAwNjVBRURBMDdBRjAyMkYyNTAyNjNGRUQxMDBEQTIwREJEOAorOjEwMzZGMDAwMzA4QzE1OEQxNDU4MEU4MEQyQTBEMTBGREEyMDJCMjBEQgorOjEwMzcwMDAwMEM1ODBERUI2M0ZFQjYwMERBMjAyQjIwMEM1ODBFMEQ4MgorOjEwMzcxMDAwNjNGRUFBREEyMERCMzA4QzE1MkQxMjA0MkUwQTgwMjhENQorOjEwMzcyMDAwMEEwMDI4MjQ2ODU4MENENjYzRkFFNTAwQzAyMEQxMEY5RgorOjEwMzczMDAwREEyMDU4MERERjg5MTRDRDkyREEyMERCMzA4QzE1NTg1MQorOjEwMzc0MDAwMEQ0QURCQTBDMDIwQzBBMDJBQjQwM0QxMEZDMDIwRDFGNQorOjEwMzc1MDAwMEYyQTJDNzQ4QjE1NTgwNjRDRDJBMEQxMEYwMDAwMDBGNAorOjEwMzc2MDAwNkMxMDBFMjgyMTAyMjQxNjAxMDgwODRDNjU4M0E5MUYzRAorOjEwMzc3MDAwRTQ5MjI5RjI5RTZGOTgwMjYwMDNBRDFFRTQ4RTI5RTI2NgorOjEwMzc4MDAwMjY2ODkwMDgyQTIyMDAwOUFBMEM2NUEzOUIyNEYyOURCMgorOjEwMzc5MDAwNjQ0Mzk1MkEzMTE2MEE0QjQxMkIyNDBCQjRCQjBCMEIwNworOjEwMzdBMDAwNDcyQjI0MEMwQ0I2MTFBRjY2Mjg2Mjg2QzFDQzc4QzNCNworOjEwMzdCMDAwMDI2MDAzN0YxOUU0ODIwOUI5MEEyOTkyQTM2ODkwMDc3RAorOjEwMzdDMDAwOEMyMDA5Q0MwQzY1QzM2QjI3NjI4NTY0NzM2NTI5MzEzNQorOjEwMzdEMDAwMDlDMEQwMkQyNDY2OEMzNTk5MTM5QzJBODgzNjlDMTRGOAorOjEwMzdFMDAwOTgyQjhFMzc5ODE1OUUxNjlFMkM4QzM4QzBFMTBDNUM1OQorOjEwMzdGMDAwMTQ5QzE3OUMyRDg4MzkyOTI1MDQyRTI1MUQyODI1MUM0RAorOjEwMzgwMDAwMkMzMDI4QzA4MjJDMjQzQzI5MzAyOTBDMEM0NzA4QzhCNQorOjEwMzgxMDAwMDEyOTI0M0QyOTMxMTU5ODE4OTkxMjA5MDg0MTA4OTk2MAorOjEwMzgyMDAwMEMyOTlDRUMyOTI1MUY3RUM3MjU5MjFDODIxMjI4MkE3MAorOjEwMzgzMDAwMDAwODIwNjA5OTFCMDEwMjNFMDAwOTNFQjEyODA5ODI2MAorOjEwMzg0MDAwMzk4OTFCMEUyMjExMDI5OTBDODIxQzI5MjUxRjgyMUMwQQorOjEwMzg1MDAwOTQxRDk1MUUyNDIxMUYxNUU0ODgwNDUxNjA5QTEwQzFGRgorOjEwMzg2MDAwODAyQjE2MTAyNTIwMTQ5NjFGMDUwNTQzMDEwNjNFMDBFNworOjEwMzg3MDAwMEQzRUIxNkIwREI2Mzk4QjNDMkQ5Q0ZDMDg2NjM2MDZBRgorOjEwMzg4MDAwNDQxQzg5M0QyRTI2MTMyRTI2MTQyRTI2MTUyRTI0NkIxRAorOjEwMzg5MDAwMjUyNDE0MDZENjFDQzA1MDI1MjYxODI1MjYxQjI1MjRCMQorOjEwMzhBMDAwNjcyNTI0NjgyODMyMTEyNTI1MjMyNTI1MjQyNTI1MjU0QgorOjEwMzhCMDAwMjUyNTJDMjkyNTIyMkQyNTIwMkIyNTIxMjQyNTJFMjZBMgorOjEwMzhDMDAwMjUyRjE0RTQ2RjE2RTQ2RDFCRTQ1Mjk4MTkyRDIxMUM2QQorOjEwMzhEMDAwQzA4NDk4NzE5QjcwODkyMDk1NzU5NTc3OTU3Rjk2N0NBQgorOjEwMzhFMDAwOTY3RTk4Nzk5Qjc4OTQ3MzFCRTQ2NzE0RTQ2ODBDMzg4RgorOjEwMzhGMDAwNDAwMjg4MTAwQzA2NDAxNUU0NjQwMTY2MTA5NDdEOUIxQworOjEwMzkwMDAwNzQ4NDFEMUJFNDQ0MDg2NjAyOTU3QjE4RTQzMTg1MUUwRgorOjEwMzkxMDAwMEI5OTAyOTk3Mjk5N0EwODY2MDIyQjEyMTA5Njc2ODY5NAorOjEwMzkyMDAwMUY2RkQyMDI2MDAxQzhDMEEwOTkxQTZEMDgwQUIxQUExRgorOjEwMzkzMDAwMDBBMTA0MDBFODFBN0Q4QjAyNjNGRkVFODkxQUMwRTA0MworOjEwMzk0MDAwOTYxRjFERTQzRTJCMTYxMDk1MUU5NDFEMjgyMDNEMjkyMAorOjEwMzk1MDAwNzYxQTI5NzYxMkMwNDBDMDUxQzBCMjJENzYxMzA4MDZERgorOjEwMzk2MDAwNDA4RDE3MEI4ODAxMDY1RTM4MEFFRTEwMUJFNDRBMDhFQQorOjEwMzk3MDAwNTQzOEIwQTYwOTY2MTE4ODE0MEI0NDEwMkI3NjFCMDQyQQorOjEwMzk4MDAwRUUwMjhCMTYxNEU0NDMwOERBMTQwNkVFMDIwRDg4MTBEQQorOjEwMzk5MDAwMkE3NjFFODYxMzFBRTQxQzA0RUUwMjBENjYxMTA4NjZEMAorOjEwMzlBMDAwMDIyRTc2MTYwRDE0MTQxRUU0MUEwRDQ0MTEwQkQ4MTRCMQorOjEwMzlCMDAwMDg2NjAyMEE0NDAyMkU3NjE4MkU3NjEwMjQ3NjE3MjYwMAorOjEwMzlDMDAwNzYxRkMwODQyODc2MTkyODc2MTFDNzZGMEMyNDQwMEYwMworOjEwMzlEMDAwNDQxMTFDRTNGQjI2NzYxRDI2NzYxQzI2NzYxNTI2NzZEQQorOjEwMzlFMDAwMTQ4QTI2MjY3NjI0MjY3NjI1Mjk3NjIyMkU3NjIwMjhFNQorOjEwMzlGMDAwNzYyMThFMTg4ODE1MERCOTEwMTZFNDI3OEJDNzBEODgwRgorOjEwM0EwMDAwMTEwRTVFMzlBREJCODUxOTA0RUUwMjI2NzYyMzA5ODhCNgorOjEwM0ExMDAwMDI4NjFGODkxMDI4NzYyNjBBMDQ0ODA1NDQxMTA1MDVFOAorOjEwM0EyMDAwNDgwRTU1MTEwNTQ0MDIwNEVFMDI4NTFFODQxRDJFNzZCMworOjEwM0EzMDAwMjcyODIwMDY5QjJEMjkyNDZBMkUzMTE3MkIxMjEwMkVBMQorOjEwM0E0MDAwMjUzOENDODNDMEQwMkQyNDA3QzBENzA5MDg0MDY0ODAxNgorOjEwM0E1MDAwOEU5QTI5MDkyODQxNjQ4MEFBNjRFMEI0MkQyNDA2QzAwNgorOjEwM0E2MDAwOTgwOUU5MzYyRDBBQTAyQTYyODUwMUM0MDRBREFBMkQ2MQorOjEwM0E3MDAwMjEwNDJBNjY4NTA4REQxMTg4M0Y4RTNFMjczMjEwMDgxMgorOjEwM0E4MDAwRUExODAwQzQwNDA4RTgxODAwODgxMTBFQ0U1MzA4NzcxRAorOjEwM0E5MDAwMDJDMDgzMDhERDAyOUQ0MTE4RTQwMTA5MEQ0RTk4NDBFMworOjEwM0FBMDAwODgyMDlBNDM5NzQ0OUQ0NTE3RTNGRTFERTNDQjA1ODg4NAorOjEwM0FCMDAwMTEwOEVFMDJBREJEQzA4MDA3RUUwMjlFNDIyOEQ0Q0ZCMQorOjEwM0FDMDAwMkFGMjlEODdDQTJBQUMxOEIxNzcyQUY2OUQxQUUzQjk2MworOjEwM0FEMDAwOTdDQTI4QTRBMjY4NzExQzY1NTA2MEMwMjBEMTBGMDA0RAorOjEwM0FFMDAwMkQyNDA2QzA4MEMwOTgwOUU5MzYwRTg5Mzg2M0ZGNzMxQgorOjEwM0FGMDAwQzBBMDYzRkU0ODFCRTNDQjFBRTNFQjJBQjY4OTYzRkY0MQorOjEwM0IwMDAwRDYwMDAwMDA2NUVGNTRDMDk4QzBEODJEMjQwNjYzRkY4RQorOjEwM0IxMDAwNTIyRDI0MDZDMDkwNjNGRjRBQ0M1N0RBMjBEQjMwOEM0QworOjEwM0IyMDAwMTE1ODBDNTFDMDIwRDEwRjAwREEyMEMwQjY1ODBDRTA1QgorOjEwM0IzMDAwNjNGRkU1MDBEQTIwNTgwQ0RFNjNGRkRDMkEyQzc0OEI2RgorOjEwM0I0MDAwMTE1ODA1NTFEMkEwRDEwRjZDMTAwNjI4MjAwNjhBMzNENworOjEwM0I1MDAwNkY4MjAyNjAwMTYxQzA1MDEzRTM5NzI5MjEwMjE2RTNDRQorOjEwM0I2MDAwOTY2OTkyMDQyNTI1MDJEOTUwMkMyMDE1OUEyODE0RTMzMQorOjEwM0I3MDAwOTQ4RjI2MjcyMDBCMEFGRTBDMDQ3NzA5MkI3MTIwNjRGMgorOjEwM0I4MDAwRTEzOThFNDI4RDQzNkZCQzAyNjAwMTZGMDBFMTA0QjBFOQorOjEwM0I5MDAwQzgwMDg4MUEwOEE4MDgwOEQ4MDI5ODI3MkIyMDA2NjhBOQorOjEwM0JBMDAwQjMyRUNFOTcyQjIyMUUyQzIyMUQwMTExMDI3QkM5MDFBMAorOjEwM0JCMDAwQzBCMDY0QjAxNzJDQjAwNzI4QjAwMERBMjAwMzg4MEEyMAorOjEwM0JDMDAwMjg4MjRDQzBEMTBCODAwMERCQTA2NUFGRTdDMDIwRDFCQworOjEwM0JEMDAwMEYyRDIwNjQ2NERGQ0E4QjI5QzBGMTBCQUIwQzY2QkZDQworOjEwM0JFMDAwQzAyQjIwMEMwQ0JDMTFBNkNDMjhDMjg2MkUwQTA4Nzg0QgorOjEwM0JGMDAwRUI2MTFFRTM3MjBFQkUwQTJFRTJBMzY4RTAwNTI4MjJFNgorOjEwM0MwMDAwMDA3RTg5NEYyOUMyODUxRUUzN0U2NDkwNDYxRkUzOENBNworOjEwM0MxMDAwOUU5MEMwODQ5ODkxMjgyMDBBOTU5MzBGODgwMjk4OTJDQworOjEwM0MyMDAwOEUyMDBGRUUwMjlFOTQyRjIwMDc4ODI2MkY5NTBBOTg0QgorOjEwM0MzMDAwOTY5QTk3MkUyMDA2MjUyNDA3NjhFMzQzMjkyMTAyMkExNQorOjEwM0M0MDAwQzI4NTFERTM2NTJBQUMyMEFEQkQyNUQ0Q0YyQUM2ODUyQgorOjEwM0M1MDAwNjNGRjRFMDAyRTIwNjVDQkVEQzA4MjI4MjQ2NUM5RjY5NworOjEwM0M2MDAwMDVFNDMxMDAwMjAwMkE2MjgyMUJFMzZEMjk0MTAyMEI0OAorOjEwM0M3MDAwQUEwMjJBNjY4MjA5RTQzMTI5MjEwMjYzRkYyMzAwMDA5NworOjEwM0M4MDAwNjRERkI4OEY0MjJFMjAxNjAwRjEwNDBERUUwQzAwRUUxQQorOjEwM0M5MDAwMUFBRUFFOUUyOTYzRkZBMzhBMjAyQjMyMjFCMUFBOUFDNQorOjEwM0NBMDAwQjAyOTMyMjEyODMyMjNCNDk5MjkzNjIxNzk4OUE5MkJDOAorOjEwM0NCMDAwMzIyMjJCMzYyMTYzRkZBMEMwMjBEMTBGOUYyNzI1MjQ1RAorOjEwM0NDMDAwMTVBQ0I4Mjg3NTIwMkIyMDA2QzBDMTJFQkNGRTY0RTBDMAorOjEwM0NEMDAwQUI2OEI3NzcyREJDRkQ2NURFQzcyRDIwNjRDMEYwNjRFRQorOjEwM0NFMDAwRDA4NjhFMjkwRUFFMEM2NkUwODlDMEYxMjgyMDVBMjhCNQorOjEwM0NGMDAwOENGRTA4Q0YzODY1RkVFODYzRkY1ODAwMDBFMDA0OTNBRgorOjEwM0QwMDAwMTBDMDgxMEFGMzBDMDM4MzM5Qzc4RjA4RDgwMzA4QThCMQorOjEwM0QxMDAwMDEwOEY4MEMwODA4MTlBODMzMDNDODBDQThCODI4NzVCRQorOjEwM0QyMDAwMjAwMzBCNDcyQjI0MTU4MzEwQ0JCNzAwRTEwNEIwQkM1NAorOjEwM0QzMDAwMDBDQzFBQUNBQzBDREMwMjlDMjc2NTlFNUVDMEIyMEJCQQorOjEwM0Q0MDAwOTkwMjA5MDk0RjI5MjUwMjYzRkU1MDAwMkQyMDZBMERCMgorOjEwM0Q1MDAwMkQ0MTY1REY3RURBMjBDMEIwNTgwQ0E4NjRBRjE4QzBEMgorOjEwM0Q2MDAwRjE2M0ZFRUY5RjI3NjNGRkQwMkUyMjFGNjVFRTMyNjNDMworOjEwM0Q3MDAwRkY3OTAwMDAyODIyMUY2NThFMjc2M0ZGNkUyNTI0MDYyOQorOjEwM0Q4MDAwMjkyMTAyNjNGRTFCMDAwMDZDMTAwNjY1NzEzMzJCNEM2OQorOjEwM0Q5MDAwMThDMEM3MjkzQzE4QzBBMUMwODAwOUE4MzgwODA4NDIyQgorOjEwM0RBMDAwNjQ4MTEwMUNFMzAxMUFFMzAyMkFDNjdFMkE1Q0ZERDM1QgorOjEwM0RCMDAwMEY2REFBMDUwMEIwODgwMDkwOEM4OTQwQzBBMDA5ODhDQQorOjEwM0RDMDAwNDcxRkUzMkIwODBCNDcwOTRDNTAwOTBENTMwNEREMTAyNgorOjEwM0REMDAwQjRDQzA0Q0MxMDBENUQwMjlEMzEwQ0JCMDI5QjMwODgyRAorOjEwM0RFMDAwNDM4RTIwOTgzNTBGRUUwMjlFMzI4RDI2RDg1MEE2RERFOAorOjEwM0RGMDAwOUQyNjhFNDBDMDkwMEU1RTUwNjRFMDk3MUNFMzExMUUxRAorOjEwM0UwMDAwRTMwMDAzOEIwQkMwRjQ5RkIxOUVCMDJEMjAwQTk5QjM0MQorOjEwM0UxMDAwMENERDAyOURCMjhGMjAwQ0ZGMDI5RkI0OEUyNjJEMjA1OAorOjEwM0UyMDAwMDc5RUI2OEMyODJEQjUwQTlDQjcyOTI0MDcyRjIwMDY5QgorOjEwM0UzMDAwMkIyMDY0NjlGMzM5Q0JCNjFERTJFMjIzMjAxNjhERDIyNAorOjEwM0U0MDAwMEIzMzBDMDBEMTA0MDAzMzFBQjQ4REEzQzM5MzI5MjI4MQorOjEwM0U1MDAwMjAwQzEzRTJFMTFGRTJEODBDMkUxMUFGRUVBMzIyMjlCMQorOjEwM0U2MDAwMjRDRjJGRTI4NUQyQTAwRkREMEIyREU2ODVEMTBGMDBFOAorOjEwM0U3MDAwMkUyMDBDQjQ4QzBDRUIxMTFGRTJEODFERTJDRkFGRUU1QworOjEwM0U4MDAwQURCQjIyQjI4NTI5RTRDRjAyQzIwQjIyQjY4NUQyQTBGNworOjEwM0U5MDAwRDEwRjAwMDAyRTIwMEMxQ0UyQzgxRkUyQ0YwQ0VCMTE0QQorOjEwM0VBMDAwQUZFRUFDQkIyMkIyODUyOUU0Q0YwMjgyMEIyMkI2ODVFRAorOjEwM0VCMDAwRDJBMEQxMEZDMEQwMEJBRDM4N0RDODAyNjNGRUVDNjMzOQorOjEwM0VDMDAwRkVFMDhFNDAyNzJDNzQ3QkVFMTJEQTcwQzBCMzJDM0NERgorOjEwM0VEMDAwMThERDUwNTgwQTlCODk0MEMwODA2M0ZFRTMwNjZFMDJERAorOjEwM0VFMDAwMDIyQTAyREIzMERDNDBERDUwNTgwMDA0OUExMERCNTAxRgorOjEwM0VGMDAwREE3MDU4MDQ2NTg4MTA2M0ZFRjcwMDAwNkMxMDA2OTJCMworOjEwM0YwMDAwMTIxRUUyQjk4QzQwQUUyRDBDOEM0NzJFM0MxODA0Q0ExMAorOjEwM0YxMDAwMEJEOUEwN0RBMzAyMjlBREY4NzVDMzAyNjAwMDg0QzA0RgorOjEwM0YyMDAwQjBDMDIzQzBBMDlEMTA2RDA4NDRCODlGMEVCODBBOEQ4NAorOjEwM0YzMDAwOTAwRUI3MEJCODc3MEQ2RDM2QURBQTlEODAwRDY2MEM0RgorOjEwM0Y0MDAwRDhGMDAwODA4ODAwNzA4Qzg3OTA2OEIxMjRCMjIyNzcwNgorOjEwM0Y1MDAwRDMyNzg4OTFDMEQwQ0I4Nzk4OTAyNzlDMTAwMDcwODg3OQorOjEwM0Y2MDAwMDBGMDhDOUQ5MUNCNkZDMDgxMDhCQjAzNzVDQjM2NjM4RAorOjEwM0Y3MDAwRkZCNEIxMjIyRUVDMTg2M0ZGRDQ4NTkyMEQ3NzBDODYyNgorOjEwM0Y4MDAwOTM5NzkwQTZENjdENkIwMUIxNTU5NjkzOTU5MjYwMDA1QworOjEwM0Y5MDAwMTZCM0NDMkQ5QzE4ODgxMEQ5RDA3OEQzQzcyOURERjg1QQorOjEwM0ZBMDAwNjNGRkMxMDBDMDIzOEE0MjFCRTJDMDAwQ0QzMjJENDQxMgorOjEwM0ZCMDAwMDI5QjMwOTIzMTg5NDI4NTQzNzlBMTA1MUVFMkJDMEVGNQorOjEwM0ZDMDAwNTUwMTg3MTIxQkUyQUI4OTcwOTUzNTBCOTkwMjk5MzIyNgorOjEwM0ZEMDAwODg0MjBBODgwQzk4NDI4Njc2QTZBNjk2NzY4RjQ0QUZDOQorOjEwM0ZFMDAwQUY5RjQ0RDEwRjAwMDAwMDZDMTAwODkzMTFENjMwODhBOQorOjEwM0ZGMDAwMzBDMDkxMDg2MzUxMDgwODQ3MDU5ODM4OTgxMjI4MjE2NQorOjEwNDAwMDAwMDIyOTNDRkQwODA4NEM2NTgxNjU2NTkxNjI4QTYzMEE1NgorOjEwNDAxMDAwMkI1MDY1QjE4QjBBNkYxNDJFMEFGRjdDQTYwQTJDMjA0OAorOjEwNDAyMDAwNUFDQ0M0MkQwQTAyMkQyNDVBN0ZFMDAyNjAwMjE1ODk2MQorOjEwNDAzMDAwMjg4ODI2MUZFMjlGMDk4ODBDNjU4MjBGMkUyMDBCMEYwRgorOjEwNDA0MDAwRUUwQjJERTBGRTJFRTBGRjA4REQxMTBFREQwMjFFRTI3QworOjEwNDA1MDAwOTlBRUREMUVFMjk5MUNFMjk5MEVERDAxMERDQzM3QzE0RgorOjEwNDA2MDAwODAwODQ4MzdCODhEQjQ4ODk4MTA4OTYwMUFFMjU1N0I2QgorOjEwNDA3MDAwOTYyMThCNjIyQUEwMjE5QzE0N0JBMzE3OUQxMzJBMjBEMgorOjEwNDA4MDAwMEM4QjEwOEMyMDU4MEJDQThDMTQ4RDEzREJBMENFQUM3QgorOjEwNDA5MDAwNjAwMUM0MDAyRTIwMEMxQkUyNDgwQ0VBMTEwQkFBMDg5OAorOjEwNDBBMDAwMkJBMjg2MUZFMjQ2N0JEQjNCMEZFRjBBMkZGMkEzNjhCMQorOjEwNDBCMDAwRjAwNTI4MjIwMDdGODkyQzJCQTI4NTY0QjBBQTg3NjI5NAorOjEwNDBDMDAwODgyNkRFNzAwQzc5MzYwOTdBMEM2RkFEMUM4RjI3OUIyMQorOjEwNDBEMDAwMTUwOEZGMEM3N0YzMTk3RTdCNzI5RDEzOUMxNDlCMTVCQQorOjEwNDBFMDAwQ0Y1NjYwMDAyNUMwQjA2M0ZGRDBENzkwNjNGRkREMDBERQorOjEwNDBGMDAwMDA5RDEzOUMxNERBMjBEQjcwNTgwQjJGOEIxNThDMTQ0OQorOjEwNDEwMDAwOEQxMzY1QTA2QThFNjI2M0ZGQ0MwMERBMjA4QjExREMxMAorOjEwNDExMDAwNDA1ODBBRDVENkEwOEIxNUMwNTFERTcwREEyMERDNjA3RAorOjEwNDEyMDAwREQ0MDVCRkY3NjhEMTM4QzE0RDlBMDJFMjAwQzFCRTI5MgorOjEwNDEzMDAwMjIxRkUyMjkwQ0VBMTFBRkVGQzBFMEFCQUEyQkEyODU0NworOjEwNDE0MDAwMkVGNENGMEI5OTBCMjlBNjg1NjNGRjFEMDBEQTIwREMyNgorOjEwNDE1MDAwNjBERDQwREU3MDg5MTIyODIwMDdERjUwQTk4ODI4MjRGRQorOjEwNDE2MDAwMDc1QkZGMDlEMkEwRDEwRjAwREJFMERBMjA1ODBCNTAyQgorOjEwNDE3MDAwNjU1MEVGMkEyMDE0MEEzQTQwNjVBMEVCREI2MERDNDA3MgorOjEwNDE4MDAwREQzMDAyMkEwMjU4MDlCQ0Q2QTA2NEEwRDU4NEExODNFMAorOjEwNDE5MDAwQTAwNDA0NDcwMzA1NDc5NTEyMDM2MzUxQzA1MTYzRkUxMQorOjEwNDFBMDAwNUMyQzIwMDZEMzBGMjhDQ0ZENjQ4MEE1NjhDNzA0QzAxMgorOjEwNDFCMDAwOTMyOTI0MDYyQzIwMDZDMEIxOEQ2NDFGRTIwMTlEMjc5RgorOjEwNDFDMDAwOUQyODlEMjk4RkYyOUQyNjAwRjEwNDAwQkIxQTAwRjA2NgorOjEwNDFEMDAwMDRCMEJFMEVERDAxQzBGMEFEQkI4RDY1MkYyNDA3MEQxMAorOjEwNDFFMDAwMEU1RTAxRUUxMUFFQkIyRTBBRkVCMEJCMEIwQjE5MEUxQworOjEwNDFGMDAwQkIzNkMwRTIwQjBCNDcwRUJCMzcyQjI0MTYxOEUxRjk3OAorOjEwNDIwMDAwMEEwOTQ1MEQwQjQyMkIyNDBCMjkyNDBBQjRCRTJFMjQ4NworOjEwNDIxMDAwMEM3RDg4NTcyOTIwMTYyRkNDRkRCMDlEMEE1QzUyMERDRAorOjEwNDIyMDAwQ0MzNjJDMjQ2NDY1RkRFQzBDMEM0NzY0Q0RFNjE4RTExQgorOjEwNDIzMDAwRTQ4RTI4ODg4MjBDOUYwQzAwODEwNDAwRkYxQUFGRUVFOAorOjEwNDI0MDAwOUUyOTYzRkRDRjFDRTIxMTYzRkUxMzAwMUNFMjBCNjM4OQorOjEwNDI1MDAwRkUwQzhENjU2M0ZGQTUwMERBMjAyQjIwMEM1ODBCMzk2RQorOjEwNDI2MDAwNjQ1RjBGQzAyMEQxMEYwMEMwMjBEMTBGQzA5MzI5MjQ1QworOjEwNDI3MDAwMTZDMDkzNjNGRkEwMDAwMDZDMTAwNEMwNjAxN0UxQ0Q2RQorOjEwNDI4MDAwMURFMUQwQzM4MTI5MzEwMTJBMzAwODI5MjQwQTc4QTFFRgorOjEwNDI5MDAwMDhDM0IyN0JBMTcyRDI2MEQxMEZDMEMxNjU1MDUxMjY1NAorOjEwNDJBMDAwMjUwMjJBRDAyMDJGMjAwQjI5MEFGQjJCMjAxNDJFMjA5OAorOjEwNDJCMDAwMTUyNjI0MTUwOUJCMDEwREZGMDkyOEYxMjAyQjI0MTQxNAorOjEwNDJDMDAwQThFRTJFRjUyMDY0QTBBOTJCMjIxRTI4MjIxRDAxMTE4NAorOjEwNDJEMDAwMDI3Qjg5MDFEQjYwNjRCMDE3MkNCMDA3MjhCMDAwREFEQworOjEwNDJFMDAwMjAwNzg4MEEyODgyNENDMEQxMEI4MDAwREJBMDY1QUY3NAorOjEwNDJGMDAwRTdEQjMwREM0MERENTBEQTIwNTgwMERFMjkyMTAyMDlGRQorOjEwNDMwMDAwMEI0Q0NBQjJEMkEwRDEwRjAwQ0M1QTJDMzAwODdCQzFDMgorOjEwNDMxMDAwMzcyRUQwMjA2NEUwMkQwMjJBMDIwMzNCMDJEQzQwREQ3MAorOjEwNDMyMDAwNTA1ODAwRDREMkEwRDEwRjJCMjAxNEIwQkIyQjI0MTQ5MgorOjEwNDMzMDAwMEIwRjQxNjRGMDc5N0NCN0NBQzBDMTBDOUMwMjJDMjVEQworOjEwNDM0MDAwMDJEMkEwRDEwRkMwMjBEMTBGMkUyMDA2NjlFMkMxMjZEMworOjEwNDM1MDAwMjQwNjJCMjIxRTJGMjIxRDI5MjAwQjI4MjAxNTBEOTkwMworOjEwNDM2MDAwMDkyQTkxMjAyNjI0MTVBQTg4Mjg5NTIwN0JGMTQ5NjBFNgorOjEwNDM3MDAwMDA0OEIwQkIyQjI0MTQwQjBBNDE2NEEwNjI3Q0I3MDIzNgorOjEwNDM4MDAwMkMyNTAyMkIyMjFFMkMyMjFERDMwRjdCQzkwMUMwQjA2RAorOjEwNDM5MDAwQzlCNjJDQjAwNzI4QjAwMERBMjAwNzg4MEEyODgyNEM1QQorOjEwNDNBMDAwQzBEMTBCODAwMERCQTA2NUFGRTdDMDIwRDEwRjAwMDBCQgorOjEwNDNCMDAwMjYyNDA2RDJBMEQxMEYwMDAwREI2MDFERTE4MTY0QkY3RQorOjEwNDNDMDAwNEYyQ0IwMDcyOEIwMDBEQTIwMDc4ODBBMjg4MjRDQzA5QQorOjEwNDNEMDAwRDEwQjgwMDBEQkEwNjVBRkU3MURFMTc5NjNGRjMxMDAwMQorOjEwNDNFMDAwMjYyNDA2NjNGRjlDMDAwMDZDMTAwNDI4MjAwNjI2MEE4MQorOjEwNDNGMDAwMDQ2Rjg1NjM2NDUwMkEyOTIwMTQ3RDk3MjQwMjJBMDJDMQorOjEwNDQwMDAwREIzMERDNDBERDUwNTgwMDE5MjkyMTAyMDkwQTRDQzg3NAorOjEwNDQxMDAwQTJDMDIwRDEwRkMwQjEwQjlCMDIyQjI1MDJDMDIwRDExRQorOjEwNDQyMDAwMEYwMDAyMkEwMjAzM0IwMjJDMEEwMTU4MDBEMUM5QUEzQworOjEwNDQzMDAwREEyMERCMzBEQzQwNTgwQTBDMjlBMDExRDNBMDdFOTc4QgorOjEwNDQ0MDAwMDgyQzBBRkQwQzlDMDEyQ0E0MTFDMDUxMkQyMDE0MDYyRgorOjEwNDQ1MDAwREQwMjJEMjQxNDYzRkZBNERBMjBEQjMwREM0MERENTBDNAorOjEwNDQ2MDAwQzBFMDU4MDk4N0QyQTBEMTBGMDAwMDAwNkMxMDA2MTZEQQorOjEwNDQ3MDAwRTE1MjFDRTE1MjY1NTE1N0MwRTExN0UxNEUyODIxMDI3QgorOjEwNDQ4MDAwMkQyMjAwMDgwODRDNjU4MDkzMkIzMjAwMEI2OTUxMjlCRQorOjEwNDQ5MDAwOUNGRDY1OTA4NzJBNjI5RTZFQTg0QzJBNzIyNjY4QTBCMQorOjEwNDRBMDAwMDI3QUQ5NDMyQTYyOURDQkFEN0NCRTUwMkIyMDBDMENFNgorOjEwNDRCMDAwQkQxMUE2REQyOEQyODYyRjRDMDQ3OEZCMTYwQ0JGMEE0RQorOjEwNDRDMDAwMkZGMkEzNjhGMDA1MjgyMjAwN0Y4OTA3MkREMjg1RDMxQgorOjEwNDREMDAwMEY2NUQwNzQyQTIxMDQxOUUxN0FEMzBGN0E5QjJFREE2MgorOjEwNDRFMDAwMjA1ODA4ODM2MDAwMzUwMDJEMjEwNDFCRTE3NTdEQkIzOQorOjEwNDRGMDAwMjREQTIwQzBCNjU4MDg3RUNBNTQ2MDAxMDMwQjJCNTA0MgorOjEwNDUwMDAwMkIyNDBCQjRCQjBCMEI0NzJCMjQwQzYzRkZBMERBMjAyRQorOjEwNDUxMDAwNTgwQTY3NjAwMDA2REEyMEMwQjY1ODBBNjU2NTUwRTBBMAorOjEwNDUyMDAwREM0MERCMzAyRDMyMDAwMjJBMDIwRDZENTE1ODA4RDJEQQorOjEwNDUzMDAwMUNFMTIzRDNBMDY0QTBDOEMwNTE4NEExOEVBMDA0MDRCMAorOjEwNDU0MDAwNDcwRTBFNDc2M0ZGMzUwMDAwMkIyMTA0QzA4Qjg5MzFENQorOjEwNDU1MDAwQzA3MERGNzAwOUY5NTAwOThGMzg2RUI4MTcyQzIwNjZDQgorOjEwNDU2MDAwQUVDQzBDMEM0NzJDMjQ2NjdDRkIwOTlEMTA1ODA4RTQ0QgorOjEwNDU3MDAwOEQxMDI3MjQ2Njk0RDExRUUxMjZCOERDOUVEMDY1NTBBQworOjEwNDU4MDAwNTZDMEQ3QjgzQUMwQjFDMEYwMENCRjM4MEYwRjQyQ0JGRAorOjEwNDU5MDAwRjExOUUxMDUxOEUxMDcyODk2N0VCMDRCRDMwRjZEQkFFQgorOjEwNDVBMDAwMDUwMEEwODgwMEMwOEMyQzIwMENDMDIwMURFMTBCMEM0NQorOjEwNDVCMDAwQ0YxMUE2RkYyRUYyODVBRENDMjdDNENGMEU0RTBCMkUwOQorOjEwNDVDMDAwRjY4NUQxMEZDMDgwMEFCODM4NzhEMENENjNGRkMxMDAxRQorOjEwNDVEMDAwOEUzMDBFMEU0NzYzRkVBMTJBMkM3NDJCMEEwMTA0NEQ2NworOjEwNDVFMDAwMDI1ODA4RDcyRjIwMEMxMkUwRkMwQ0Y5MTFBNjk5QTI1MgorOjEwNDVGMDAwRkYyN0Y0Q0YyODkyODVEMkEwMDg0ODBCMjg5Njg1RDFCMgorOjEwNDYwMDAwMEZDMDIwRDEwRjAwMDAwMDZDMTAwNEMwNjBDQjU1REI0MAorOjEwNDYxMDAwMzBEQzQwMDU1RDAyMDIyQTAyNUJGRjk0MjkyMTAyMDk3OQorOjEwNDYyMDAwMDg0Q0M4ODJEMkEwRDEwRjJCMjAxNEIwQkIyQjI0MTQ2RAorOjEwNDYzMDAwMEIwQzQxQ0JDNTdEQjdFQkMwQzEwQzlDMDIyQzI1MDJGNQorOjEwNDY0MDAwRDJBMEQxMEYwMDAwMDIyQTAyMDMzQjAyMDY2QzAyQzA3NgorOjEwNDY1MDAwRDBDN0Y3MkUyMDE0MjgzMTAxMjYyNTAyMjgyNDBBMEY1RQorOjEwNDY2MDAwRUUwMTJFMjQxNDU4MDEwRTYzRkZBMzAwMjYyNDA2RDI2NworOjEwNDY3MDAwQTBEMTBGMDA2QzEwMDYyODIxMDJENjIwMDgwODRDNjUzNgorOjEwNDY4MDAwODA5RDJCMjAwQzEyRTBDQzBDQjgxMUEyODgyQTgyODZDNworOjEwNDY5MDAwQjU0OTdBOTMwMjYwMDA5NzE5RTBDOTA5QjkwQTI5OTJDRAorOjEwNDZBMDAwQTM2ODkwMDgyQTYyMDAwOUFBMEM2NUEwODIyODgyODU2NgorOjEwNDZCMDAwMUNFMEQ0NjQ4MDc5OUM4MEI4ODdCMTRCOUI4MTlCMTBBRgorOjEwNDZDMDAwNjU1MDc0QzBBN0Q5NzAyODBBMDFDMEQwMDc4RDM4MEQ3NQorOjEwNDZEMDAwMEQ0MkNCREUxRkUwQjUxRUUwQjYyRUY2N0VEODMwRDNGRAorOjEwNDZFMDAwMEY2RDRBMDUwMDgwODgwMDkwOEMyRTMwMDhDMEEwMDAxNQorOjEwNDZGMDAwRUUzMjJFNzQwMDI4NjAwQzE5RTBCODBDOEQxMUEyREQ4QQorOjEwNDcwMDAwQTk4OEMwMjAyQ0QyODUyMjg0Q0ZEMkEwMENCQzBCMkMyRgorOjEwNDcxMDAwRDY4NUQxMEZDMEYwMDM4RjM4N0ZBMEMwNjNGRkI0MDBFRgorOjEwNDcyMDAwQ0M1ODJBNkM3NERCMzBEQzQwNTgwODBCQzAyMEQxMEYwOQorOjEwNDczMDAwREE2MDU4MDlERjYzRkZFN0RENDAyQTZDNzRDMEIwREM0MworOjEwNDc0MDAwNzA1ODA4N0YyRTMwMDg4QjEwMDBFRTMyMkU3NDAwMjgyRgorOjEwNDc1MDAwNjAwQzE5RTBBMTBDOEQxMUEyRERBOTg4QzAyMDJDRDIxQgorOjEwNDc2MDAwODUyMjg0Q0ZEMkEwMENCQzBCMkNENjg1RDEwRjAwMDBBMworOjEwNDc3MDAwNkMxMDA0MjkyMDE0MjgyMDA2QjE5OTI5MjQxNDY4ODE3QQorOjEwNDc4MDAwMjRDMEFGMkMwQTAxMkIyMTAyMkMyNDA2N0JBMDA0QzBEQworOjEwNDc5MDAwRDAyRDI1MDIwMjJBMDIwMzNCMDIwNDRDMDJDMEQwNTg0RAorOjEwNDdBMDAwMDBDMEQyQTBEMTBGQzAyMEQxMEYwMDAwNkMxMDA0Mjk4RQorOjEwNDdCMDAwMzEwMUMyQjQyOTI0MEEyQTMwMTFDMjgzNzhBMTZDN0I0QQorOjEwNDdDMDAwQTE2OTY0NTA0NzJDMjAwNkMwNjg2RkM1NjJDQTU3MkQ4NgorOjEwNDdEMDAwMjAxNDdDRDcyMkRBMjBEQjMwREM0MERENTA1QkZGQTVFMworOjEwNDdFMDAwMjkyMTAyMDkwRTRDQzhFMkMwMjBEMTBGQzBGMTBGOUY1MQorOjEwNDdGMDAwMDIyRjI1MDJDMDIwRDEwRkRBMjBEQjMwQzBDMDVCRkZDMgorOjEwNDgwMDAwREMyODIwMTQwNjg4MDIyODI0MTQ2M0ZGQzcyOTIwMTVGOQorOjEwNDgxMDAwMUJFMDZDMkEyMDBCQzBDMDlDMjQwQkFBMDkyQkExMjBGMgorOjEwNDgyMDAwMkMyNDE1QUI5OTI5QTUyMDYzRkY5OTAwQzAyMEQxMEYzNgorOjEwNDgzMDAwREEyMERCMzBEQzQwREQ1MEMwRTA1ODA4OTFEMkEwRDE1NgorOjEwNDg0MDAwMEYwMDAwMDA2QzEwMDRDQjU1MTNFMDY3MjUyMjFGMERFQworOjEwNDg1MDAwNDYxMTA2NTUwQ0EzMjMyNjIyMUUyNTI2MUYwNjQ0MEJBRgorOjEwNDg2MDAwMjQyNjFFNzM0QjFEQzg1MkQyNDBEMTBGMjgwQTgwQzA4NworOjEwNDg3MDAwNDAyNDI2MUZBODI4MjgyNjFFMjgyNjFERDI0MEQxMEZGNgorOjEwNDg4MDAwQzAyMEQxMEYyNDRERjgyNDI2MUU2M0ZGRDgwMDAwMDA1RAorOjEwNDg5MDAwNkMxMDA0RDYyMDI4MjAwNkMwNzA2RTg1MDI2MDAwRDRGQgorOjEwNDhBMDAwMURFMDRFMTlFMDQ2MTJFMDQ0MkE4Q0ZDNjRBMTMwMkIzNgorOjEwNDhCMDAwNjEwMkI0NEMwQjBCNEM2NUIwQTIyQjYwMEM4QTYwMENFRgorOjEwNDhDMDAwQjgxMTAyODgwODJFODI4NjA5QjkwQTdFQzMwMjYwMDBFOAorOjEwNDhEMDAwOUEyOTkyQTM2ODkwMDUwOUFBMEM2NUEwOEUyODgyODU2MgorOjEwNDhFMDAwNjQ4MDg4Qjg4OTFCRTA0QTk0ODE5QjgwNjU1MTU1QzBEQgorOjEwNDhGMDAwQjdCODM4MkEwQTAxQzBDMDA5QUMzODBDMEM0MjY0QzBGMQorOjEwNDkwMDAwNDIxRkUwMjkxRUUwMkIyRUY2N0VCMDRBRDMwRjZEQUE3RgorOjEwNDkxMDAwMDUwMDgwODgwMDkwOENDMEEwMjk2MDBDMEM5QzExQTIxRQorOjEwNDkyMDAwQ0MyQkMyODVBRDk5MEI0QjBCMkJDNjg1Mjg2MDA2Mjc3NworOjEwNDkzMDAwOTRDRjY4ODEyMjJENjAxNUQyQTBDOUQyQzBFMjJFNjQyNgorOjEwNDk0MDAwMDZEMTBGMDBDMEYwMDhBRjM4N0ZCMEJENjNGRkIxMDBFMworOjEwNDk1MDAwMjc2NDA2RDJBMEQxMEYwMEQyQTBEMTBGMDBDQzU3REEyNQorOjEwNDk2MDAwNjBEQjMwREM0MDU4MDhDMEMwMjBEMTBGREE2MDU4MDk0NQorOjEwNDk3MDAwNTA2M0ZGRTgwMDI4MjIxRTI5MjIxREQzMEY3ODk5MDFEOQorOjEwNDk4MDAwQzA4MEMxRDZDMUMxMUJFMDE4QzEyMkFCNkI2NDgwNDI5QworOjEwNDk5MDAwNzg5MTNGMkE4MDAwMENBRTBDNjRFMEJCMDJBRjBDNjQzRgorOjEwNDlBMDAwRjBCNTJFQUNFQzY0RTBBRjBEQUYwQzY0RjBBOTJFQUMwQQorOjEwNDlCMDAwRTg2NEUwQTMyRkFDRTc2NEYwOUQyRUFDRTY2NEUwOTdEQQorOjEwNDlDMDAwMkY4MDA3MDhGODBCREE4MDdCODMwMjJBOERGOEQ4QTBBNQorOjEwNDlEMDAwNjVBRkJDMjg2MTIzMDhENzM5RDk3MDYwMDA3QjAwMDAxRgorOjEwNDlFMDAwMkI2MDBDMENCODExQTI4ODJDODI4NjJBMEEwODdDQUI5QQorOjEwNDlGMDAwN0UwOUJBMEEyQUEyQTM2OEEwMDUyQzYyMDA3QUM5NkZCMAorOjEwNEEwMDAwMkE4Mjg1NjRBMDY5MUZERkZFMjc2NTA0QzBFM0MwQzQ1NQorOjEwNEExMDAwMkU2NDA2OUNBMTFDRTAyQjlGQTAyRTYwMEE5N0EzMEM3RAorOjEwNEEyMDAwRUUwMjlFQTI4RjYwMENGRjAyOUZBNDJFNjAxNDdBRUYwQworOjEwNEEzMDAwNDYyN0E0MTdBREJDMkY4Mjg1MjdDNENGMkZGQzIwMkY3QgorOjEwNEE0MDAwODY4NTYzRkU2OTJBNkM3NEMwQjFEQzkwREQ0MDU4MDcyRQorOjEwNEE1MDAwQkMxRERGRTE2M0ZFQzEwMEQ5QTBEQTYwREIzMEMyRDA0QgorOjEwNEE2MDAwQzFFMERDNDAwOURFMzlERDUwNTgwODA1RDJBMEQxMEY4NQorOjEwNEE3MDAwREE2MDU4MDkwRjYzRkVFNDI5MEEwMTI5QTQxNzBEQkY2MworOjEwNEE4MDAwMDgyRTgyODUyN0Y0Q0YyRUVDMjAyRTg2ODU2NDUwMEJDRAorOjEwNEE5MDAwMkE2Qzc0REI0MDU4MDE3Q0QyQTBEMTBGQzAyMEQxMEYwQQorOjEwNEFBMDAwNkMxMDA2MkIyMjFFMjgyMjFEOTMxMDdCODkwMUMwQjA5QQorOjEwNEFCMDAwQzBDOUMwM0JDMUYyMDQwNjQwMURERkNCQzBFMkMwNzREOAorOjEwNEFDMDAwMDc0NzAxMEU0RTAxQUQyRDlFMTFDMDQwMkUwQTE0NjQwMQorOjEwNEFEMDAwQjA2RTZEMDg0NDI4MjIxRDdCODE2NTJBQjAwMDdFQTEzRQorOjEwNEFFMDAwM0I3RkExNDc3QjUxMjA3Q0ExNDk2OEE5MTc2OEFBMTQ4NAorOjEwNEFGMDAwNzNBMTExQzA5Rjc5QTEwQ0MxOEI3OEExMDdDMUFFMjkwOAorOjEwNEIwMDAwMEExRTI5QjQwMDdDQTEyQjJBQjAwNzBCQUIwQkRBQjAyQworOjEwNEIxMDAwN0RCMzAyMkFCREY4REJBMENBQTU2M0ZGQjQyOEIwMTA5QworOjEwNEIyMDAwODkxMTY5ODdCQjY0OUZCODYzRkZEQzAwNjQ3RkI0NjM0RAorOjEwNEIzMDAwRkZENTAwMDA2NDZGRDBDMDQxQzFBRTJBQjQwMDYzRkY0RQorOjEwNEI0MDAwQzYyQjIxMDJDRUJFMkEyMjFEMkIyMjFFN0FCMTJBOEMxMAorOjEwNEI1MDAwMTA3Q0IxMjE3QUI5MDFDMEIwQzlCOTEzREY5NkRBMjA0RgorOjEwNEI2MDAwMjhCMDAwMkNCMDA3MDM4ODBBMjg4MjRDQzBEMTBCODBFMworOjEwNEI3MDAwMDBEQkEwNjVBRkU3RDI0MEQxMEY4OTEwNjU5RkQ0NjNGOQorOjEwNEI4MDAwRkZGMzAwMDA2QzEwMDhDMEQwQzg1OThDMzAyOTIxMDJGNgorOjEwNEI5MDAwMEMwQzQ3NjAwMDBDOEUzMDBFMUU1MDY1RTE5RTI5MjFFMgorOjEwNEJBMDAwMDJDMEMxMTZERjg1MDkwQjRDNjVCMDkwOEEzMDBBNkVEMQorOjEwNEJCMDAwNTE2OEUzMDI2MDAwODUyRjYyOUUxQkRGN0U2RUY4NTMxMgorOjEwNEJDMDAwMkJCMjI2NjhCMDA1MkUyMjAwN0JFOTQ3Mjc2MjlEQjdFRAorOjEwNEJEMDAwNDhDQjdGOTcxMDJCMjAwQ0IwNEUwQ0JGMTFBNkZGMjk5RAorOjEwNEJFMDAwRjI4NjlFMTI3OThCNDExN0RGNzUwN0I3MEEyNzcyQTNFOQorOjEwNEJGMDAwNjg3MDA0ODgyMDc3ODkzMDI5RjI4NURGOTBENzkwNjUyNgorOjEwNEMwMDAwOTA2NTJBMjEwNDE5REZBRTdBOUIyMkRBMjA1ODA2Qjg3MworOjEwNEMxMDAwNjAwMDI5MDAyQzIxMDQxQkRGQUE3Q0JCMThEQTIwQzAwRAorOjEwNEMyMDAwQjY1ODA2QjNDOTU4NjAwMTRDQzA5MDYzRkZDQ0RBMjA3NworOjEwNEMzMDAwNTgwODlGNjAwMDA2REEyMEMwQjY1ODA4OUQ2NTUxMzVCNworOjEwNEM0MDAwREM0MERCMzA4RDMwREEyMDBENkQ1MTU4MDcwQkMwRDBDMQorOjEwNEM1MDAwRDNBMDY0QTEyMDI5MjEwMkMwNTE4NEExOENBMDA0MDQwNgorOjEwNEM2MDAwNDcwQzBDNDc2M0ZGM0UwMEMwOUI4ODMxREJEMDA4RjgzRgorOjEwNEM3MDAwNTAwODlCMzgyODIxMDQ5ODExNkU4ODIzMjgyMDY2QUNBMAorOjEwNEM4MDAwOEMwQzBDNDcyQzI0NjY3Q0JCMTU5RjEzOUUxNDhBMTAzOQorOjEwNEM5MDAwOEIxMTU4MDcxQjhFMTQ4RjEzQzBEMDJEMjQ2NjhBMzBCOQorOjEwNENBMDAwQzA5MkMxQzgxQkRGNUI3RkE2MDk5QkYwOTlGMTJDRjQ3MQorOjEwNENCMDAwMDgyN0ZDMTA2NTUwQTRCODNBREY3MEMwNTFDMDgwMDdDNworOjEwNENDMDAwNTgzODA4MDg0MjY0ODA2NzE4REYzODE5REYzOTI5ODZBOAorOjEwNENEMDAwN0U2QTQyMEFEMzBGNkRFOTA1MDBBMDg4MDBGMDhDQzBGRgorOjEwNENFMDAwQTA4OTMwQjRFMzdGOTYyOEMwRjIwN0U5MEIyQzk0MDgyMgorOjEwNENGMDAwOUI5MDlGOTEyRjIwMEMxMkRGMzgwQ0Y4MTFBNjg4Mjk2OQorOjEwNEQwMDAwODI4NUEyRkYyREY0Q0ZEMkEwMDkzMzBCMjM4Njg1RDE1MworOjEwNEQxMDAwMEYyMjIwMEM4OTEyMThERjMwMEMyQjExQTZCQkE4MjIwMQorOjEwNEQyMDAwMkQyNENGMkNCMjg1RDJBMDBDOTkwQjI5QjY4NUQxMEY5QQorOjEwNEQzMDAwQzA4N0MwOTAwQTU5Mzg3OTgwOTY2M0ZGOEFEQjMwREFFMQorOjEwNEQ0MDAwMjBDMEMxQzBEMDVCRkY1NjI5MjEwMkMwRDAyQTlDRkVFMgorOjEwNEQ1MDAwNjVBRTREMkQyNTAyQzA5MDYzRkU0NTAwOUUxNDJBMkNBMQorOjEwNEQ2MDAwNzRDMEIxREM3MERENDA1ODA2RjY4RTE0QzBEMDFCREY3NQorOjEwNEQ3MDAwMjhDMUM4NjNGRjZBQzAyMEQxMEYwMDAwNkMxMDA2Mjg0QworOjEwNEQ4MDAwMjEwMjE3REYwRDA4MDg0QzY1ODI0OTI5NzI5RTZGOTgzMQorOjEwNEQ5MDAwMDI2MDAyNTAxOURGMDgyQTkyMjY2OEEwMDc4QjIwMEFCOQorOjEwNERBMDAwQkIwQzY1QjIzRjJBNzI5REMwQ0I2NEEyMzcxRERGMDRFNQorOjEwNERCMDAwQzA2MDJCMzAwOEMwRjE2NEIwNzEyRTBBRkZCMEI4NjQzNworOjEwNERDMDAwODE1MTJEQkNGRTY0RDBGMzY0NTA1QzJBMkM3NDA0NEJEQQorOjEwNEREMDAwMDI1ODAwQUQwQUEyMDIwNjAwMDAwMDAwMDAxQURGMDgxNworOjEwNERFMDAwMkMyMDA3NkVCQjAyNjAwMjIyMThERUZFMTNERjA4MUJCOAorOjEwNERGMDAwREYzNkMwRTIyOTIwMEE5QUQwOUVEMUFCQ0IwMzk5MDJCQworOjEwNEUwMDAwOTlEMjIzQjA4MDI2QjQ4MEIxMzMwODMzMDI5M0QzMThFQgorOjEwNEUxMDAwREVGMjBDRkQxMUE3REQyQ0QyODVBOEY4MjY4NENGMEM3QworOjEwNEUyMDAwRUMwQjJDRDY4NTY1NUZBMkMwMjBEMTBGMkIyMTA0ODgwNgorOjEwNEUzMDAwMzFERTYwMDhGODUwMDhDRTM4NkVCODEwMkMyMDY2QjEwQworOjEwNEU0MDAwQ0MwQzBDNDcyQzI0NjY3Q0VCMDI2MDAxQUYyRTMwMTA5QQorOjEwNEU1MDAwMjkzMDExMkMzMDEzMDA5OTMyMDBDQjMyNjRFMTQ1MkFGRAorOjEwNEU2MDAwMzAxNDFFREYxQTAwQUEzMjc4Q0YwNTBFOUMwOTJCQzQxRAorOjEwNEU3MDAwN0YxQ0RGMTc2NkEwMDUwRTk4MDkyQTg0ODBCNEE3MTg0NgorOjEwNEU4MDAwREYxNUM3NkYwMDkxMDRBQzlDREJDMDAwQUUxQTAwRjNDNQorOjEwNEU5MDAwMUE2RUMxMDQ4QkQwMEJDQjBDMUNERjBGMDhCODFDMDY5QworOjEwNEVBMDAwMzMwM0FDODgyQTg0OEIyQ0QwMzYyNzg0OEMwM0NDMDEyNgorOjEwNEVCMDAwMEVDQzAyMkNENDM2NTgwMUFENjNGRjBCMkYyMDBDMEMwNgorOjEwNEVDMDAwRkIxMUE3QkIyREIyODZDMDk4N0Q5MzAyNjAwMTIxMTkwQQorOjEwNEVEMDAwREVCQjA5RjkwQTI5OTJBMzY4OTAwODJEMjIwMDA5REQ5QQorOjEwNEVFMDAwMEM2NUQxMEMyREIyODVERTYwNjREMTA0ODgzMTJCMjE5NAorOjEwNEVGMDAwMDQwOEY4NTAwOENFMzg2RkI4MDI2M0ZFREYyQzIwNjYzNQorOjEwNEYwMDAwQjFDQzBDMEM0NzJDMjQ2NjdDRTMwMjYzRkVDRTlEMTBEMgorOjEwNEYxMDAwNjAwMTMxMDAyOTMxMDgyOTI1MDQyODMwMTRCMDg4NjQ0MworOjEwNEYyMDAwODBBNjJCMzEwOTJCMjQwQUMwODEyQjMwMTYyRkQ0MjNDNQorOjEwNEYzMDAwMkIyNDBCQjRCQzJDMjQwQzhEMzc4QjM2MjkyNTA0REU5NgorOjEwNEY0MDAwRDAwRDhFMzlEQ0IwMEI4QzM5MEVDQzAyNjRDRTc4MDhEMworOjEwNEY1MDAwOUMxMTAxQzQwNDhGMzgwREJFMTgwMEM0MDQwREI4MTg4QworOjEwNEY2MDAwMDA4ODExMDhGRjAyQzA4MzA4Q0MwMjE4REVDQzlDQTE4NworOjEwNEY3MDAwOThBMDE4REVDQjhDMjA5RUEzOUZBNDA1Q0MxMTBCQ0Y0QworOjEwNEY4MDAwNTNDMUUwOUVBNTBDRkYwMjA4RkYwMjlGQTIxOERFODkxNAorOjEwNEY5MDAwMjYyNDY2MkM3MjlEMjY4NEEyMkNDQzE4MkM3NjlENjMyOAorOjEwNEZBMDAwRkUyNTAwMDAwMDJEMzAxMjFDREVDRDAwREEzMjc4REY0NQorOjEwNEZCMDAwMDUwQzlFMEIyQUU0N0Y2NkIwMDUwQzlGMEIyQkY0ODAzQQorOjEwNEZDMDAwMkEzMDExMDBBQTMyNjNGRUVDMkUyNDBBMkIzMTA5OUJGMQorOjEwNEZEMDAwMkI2M0ZGNTMwMENDNTdEQTIwREIzMERDNDA1ODA3MjIyQworOjEwNEZFMDAwQzAyMEQxMEYwMERBMjBDMEI2NTgwN0IxNjNGRkU1MDAzQQorOjEwNEZGMDAwMDBEQkYwREEyMDU4MDdBRTYzRkZEOTAwMDA1ODA2NDAwNgorOjEwNTAwMDAwMURERTcwQzBGMTI2MjQ2NjYzRkU0MTAwOEIyMDI4MEE1NQorOjEwNTAxMDAwRkZCMUNFMjMyMDBBMkMyMTA0MEUwRTQ3MkUyNDA3Nzg0MAorOjEwNTAyMDAwMzEzNTlBRDAyQ0Q1MEE5NkQzMTlERUE2MkVENDE2QzBDNworOjEwNTAzMDAwODM5OEQxQzBFMzA5QjgwMjk4RDQwOTM5MDI5OUQyMjZERAorOjEwNTA0MDAwMjQwNzYzRkRDOTU4MDYyRThEMTAyNjI0NjYyQjIxMDRFMworOjEwNTA1MDAwMkYyMDBDNjNGRDg2MDAwMDA4QjgxMTE5REU2ODA4RUVFOQorOjEwNTA2MDAwMDI4ODJCOUVENTlBRDBDMEVGMDk4ODAyOThEMjA0QzkzNQorOjEwNTA3MDAwMTEwRTk5MDI5OUQ0QzBFNDlFRDE2M0ZGQzEwMDAwMDBEMworOjEwNTA4MDAwNkMxMDA0QzAyMEQxMEYwMDZDMTAwNDg1MjEwRDM4MTE2NAorOjEwNTA5MDAwMTRERTQ3ODYyMkE0MjQwODY2MEM5NjIyMDUzMzBCOTM1RgorOjEwNTBBMDAwMjE3NDNCMTNDODYyRDIzMEQxMEZDMDMwQkMyOTk5MjE4MgorOjEwNTBCMDAwOTkyMDkzMjJEMjMwRDEwRjIzM0RGODkzMjE2M0ZGRTM0RgorOjEwNTBDMDAwNkMxMDBBRDYyMDk0MTgxN0RFM0NEOTMwQjgzODk4MTlERAorOjEwNTBEMDAwOTkxNDY1NTI1NkMwRTFEMkUwMkU2MTAyMURERTM5MEVGMAorOjEwNTBFMDAwMEU0QzY1RTE2MjhGMzA4RTE5MEY2RjUxMkZGQ0ZENjVGQworOjEwNTBGMDAwRjE1NThFRTEyOUQwMjMwRThGNTA3N0U2NkI4RjE4MUU2NQorOjEwNTEwMDAwREU3OEIwRkYwRkY0MTEwRjFGMTQ2NTkwQ0UxOERFNzUxNgorOjEwNTExMDAwOEM2MEE4Q0NDMEIxMTlERTI3Mjg2MDBCMDlDQzBCMEQyMAorOjEwNTEyMDAwODgwOTI5ODEyMDI4ODExRTJBMEEwMDA5ODgwQzA4QkFDQQorOjEwNTEzMDAwMzgxQkRFNkIwQ0E5MEEyOTkyOTQ3QjlCMDI2MDAwOENDMQorOjEwNTE0MDAwMkI2MDBDOTQxNjBDQkQxMUE3REQyOUQyODZCODQ4NzlDNgorOjEwNTE1MDAwODMwMjYwMDBEMjE5REUxOTA5QjgwQTI4ODJBMzk4MTdDMQorOjEwNTE2MDAwNjg4MDAyNjAwMEEzNjAwMEE1MUFERTVGODQxODBBRUU2MgorOjEwNTE3MDAwMDFDQTk4MUJERTEwOEMxOTJCQjAwMDhDQzA2RUIzMTNDMworOjEwNTE4MDAwMURERTBEMEMxQzUyMERDQzBCMkRDMjk1QzBBMTdFREI3QgorOjEwNTE5MDAwQUU2MDAwMzgwQzBDNTM2MDAwMDkwMDAwMDAxOERFNTFBRQorOjEwNTFBMDAwOEM2MEE4Q0NDMEIxMTlERTAzMjg2MDBCMDlDQzBCMERCNAorOjEwNTFCMDAwODgwOTI5ODEyMDI4ODExRTJBMEEwMDA5ODgwQzA4QkEzQQorOjEwNTFDMDAwMzgwQ0E5MEEyOTkyOTQ3RTkzMDI2M0ZGNzJEQTYwQzBCOAorOjEwNTFEMDAwQkE1ODA3Mzc2NDUwNzM2MDAyNkEwMDAwMUFEREY2OEMxMworOjEwNTFFMDAwMTkyQUEwMDA4Q0MwNkVBMzFBMThEREYyMEMxQzUyMDhGQworOjEwNTFGMDAwQ0MwQjE4REUzQjJCQzI5NUMwQTE3OEIzMDI2M0ZGM0ZGNgorOjEwNTIwMDAwNjNGRkM5MDAwQzBDNTM2M0ZGMDk4OTYwNzg5OTE4Mjk2MgorOjEwNTIxMDAwRDI4NUM5OTIyQjcyOUUxRERERTc2RUI4MjMyREQyMjY1MgorOjEwNTIyMDAwOTkxMzY5RDAwQjYwMDAwRERBNjA1ODA3MjE2MDAwMTdGMAorOjEwNTIzMDAwMDA4ODYwN0Q4OTBBOUExQTI5NzI5RDlDMTI5OTE1Q0Y1RgorOjEwNTI0MDAwOTVEQTYwQzBCNjU4MDcxQTY1NTFGOThEMTQ4QzE4REJEMQorOjEwNTI1MDAwRDA4REQwMDY2QTAyMEQ2RDUxNTgwNTg3RDNBMDlBMTRERgorOjEwNTI2MDAwNjRBMUUxODJBMDg1QTFCOEFGOUYxOTA1MDU0NzAyMDI5QworOjEwNTI3MDAwNDc5NTE4QzA1MTYzRkU2MDJCNjEwNEMwOEI4OTMxQzAxMworOjEwNTI4MDAwQTAwOUY5NTAwOThBMzg2RUI4MUYyQzYwNjZBMkNDMENCMAorOjEwNTI5MDAwMEM0NzJDNjQ2NjdDQUIxMTlGMTE5RTFCOEExNTU4MDUyOAorOjEwNTJBMDAwOTg4RTFCOEYxMUMwQTAyQTY0NjY5RjExNjRGMEU1ODk1NworOjEwNTJCMDAwMTM4ODE5MEZGRDAyMkUwQTAwNkREOTE3MkY4MTAzMDBFNAorOjEwNTJDMDAwOTA4REFFRkUwMDgwODg5RjkyMDA5MDhDMDA4MDg4QjgwMAorOjEwNTJEMDAwOTkwMDkwOEM2NTUxNEU4QTEwODUxQThCMzAxRkREQzg1RAorOjEwNTJFMDAwODgxMjI5NjAwNzA4NTgwQTJDODI5NDJENjEwNDBFQ0M3QworOjEwNTJGMDAwMEMyQzg2OTQ2RkRCM0MxQ0RERjRBQzlDMjlDMDgwMEIyRAorOjEwNTMwMDAwNUQ1MEEyOTkwOTA5NDcyOUM0ODA2NUQwREEyRTYwMEM0NgorOjEwNTMxMDAwQzBEMDFGRERCMTBDRTgxMUFGRUVBNzg4MjI4Mjg1MkQyOQorOjEwNTMyMDAwRTRDRjAyNDIwQjIyODY4NUQyQTBEMTBGOEUzMDBFMEUyMgorOjEwNTMzMDAwNDc2M0ZEQTJBMjlDMEMwQzQ3MkM2NDA3N0FCNkNEOEI2OAorOjEwNTM0MDAwNjAyRTYwMEEyODBBRkYwOEU4MEM2NDgxMEUxOEREREQ3MworOjEwNTM1MDAwODMxNjgyMTNCMzM5MDIzMzBCMkMzNDE2MkQzNTBBQzA1MQorOjEwNTM2MDAwMjM5MjMxOUYzMEMwMjA5MjMzMDhCMjAyMDhFODAyOTJBMworOjEwNTM3MDAwMzQ5ODMyQzA4MDI4NjQwNzJCNjAwQ0QyQTAxQ0REOTZDNAorOjEwNTM4MDAwMENCRTExQTdFRTJERTI4NUFDQkIyOEI0Q0YwRDlEMEI1MgorOjEwNTM5MDAwMkRFNjg1RDEwRjhCMTg4ODEzOEQzMEI4OEMwRDhGNDc3MworOjEwNTNBMDAwMEQ0OTUwQjQ5OTA0OTkxMDBEMEQ1RjA0REQxMDA5RkZFQgorOjEwNTNCMDAwMDI5RjgwMERCQjAyOUI4MTY1NTA4RDg1MUFCODNBQzA1MworOjEwNTNDMDAwRjFDMDgwMENGODM4MDgwODQyNjQ4MDZCMUJERDc3MTk0NworOjEwNTNEMDAwREQ3ODI5QjY3RThEMThCMERENkREQTA1MDBBMDg4MDA3NQorOjEwNTNFMDAwQzA4Q0MwQTA2M0ZFRjMwMDgyMTM4QjE2MURERDg4MjhERAorOjEwNTNGMDAwNjAwQUMwRTAyRUM0ODAwRDg4MDIwMkIyMEI5OTIzOUY4MAorOjEwNTQwMDAwMjBDMEQyOTgyMjlEMjEyMjYwMENCMkJCMEMyRDExQTc4NgorOjEwNTQxMDAwREQyOEQyODUwOEJCMEIxOERENzAyQkQ2ODVBODIyMkU3RgorOjEwNTQyMDAwMjRDRkQyQTBEMTBGOUUxQjg1MUEyQTZDNzQ4QjE4NUJENworOjEwNTQzMDAwRkYxNjhFMUI2M0ZFQTMwMEMwODdDMDkwMEFGOTM4Nzk1RgorOjEwNTQ0MDAwODA5MjYzRkY4NkMwMjBEMTBGOUUxQjJBNkM3NEMwQjE2RQorOjEwNTQ1MDAwOEQxODU4MDUzQjhFMUI4NTFBNjNGRTdFODg2QjgyMTM2MAorOjEwNTQ2MDAwODkxNjA4QkUxMTBFQ0UwMjAyOTIwQjlFMjVCNDk5MUUxQgorOjEwNTQ3MDAwREQ2MzlGMjAwRTg4MDI5ODIyQzBFRjA0RDgxMTBFODhBOQorOjEwNTQ4MDAwMDI5ODI0QzBFNDlFMjFDMDgwRDJBMDJCNjAwQzI4NjQyNgorOjEwNTQ5MDAwMDcxQ0RENTEwQ0JFMTFBN0VFMkRFMjg1QUNCQjI4QjQ3NAorOjEwNTRBMDAwQ0YwRDlEMEIyREU2ODVEMTBGMDAwMDAwNkMxMDA0QzBDMAorOjEwNTRCMDAwMjBEMTBGMDA2QzEwMDQ4NjMzQzA3MUMwMzA2MDAwMDEzMQorOjEwNTRDMDAwQjEzMzAwMzEwNDAwNzQxQTA0NjIwMTc0NjBGMUQxMEYyOQorOjEwNTREMDAwNkMxMDA0MDIyQTAyMDMzQjAyNUJGRkY2MUNERDM5MUI0MQorOjEwNTRFMDAwREQ4M0M3OUY4OEIwMDlBOTAzMDk4QTAxOUFCMDc5ODAzMgorOjEwNTRGMDAwMUVDMEYwMEZFNDMxMURERDMwMDAwMjAwMkJEMjgyMUVGMQorOjEwNTUwMDAwREQ3QzJBQzEwMjBFQkIwMjJCRDY4MjBBRTQzMUQxMEYwOAorOjEwNTUxMDAwMjhDMTAyQzE5MDA5ODgwMjA4MDg0RjI4QzUwMjA4RTQ4MgorOjEwNTUyMDAwMzFEMTBGMDA2QzEwMDRDMEMwMENFNDMxMTJERDI1MUExQgorOjEwNTUzMDAwREQyMjAwMDIwMDI5QTI4MjE4REQ3MDFCREQ2RTI2MjEwQgorOjEwNTU0MDAwMDIwQjk5MDEwODY2MDEyOUE2ODIyNjI1MDIwNkU0MzE4QworOjEwNTU1MDAwMTRERDZCMTVERDY2MjM2QTkwMjMyNjE2ODU1MDI0MjZGQworOjEwNTU2MDAwMTUyNTI2MTcyMjJDNTBEMTBGMDAwMDAwNkMxMDA4RDZFQworOjEwNTU3MDAwMTAyQjBBNjQyOTFBQjQxQUREMEYwRDIzMTExQ0REMTAzQgorOjEwNTU4MDAwMEYyNTExQjgxODk4MTMwRTU1MTExOERENURBQzU1QThFQworOjEwNTU5MDAwMzhBQTMzMkM4MEZGMkE4MEZFQTkzMzI4OEQwMTI5ODA2OAorOjEwNTVBMDAwMDEwOEFBMTEyODgwMDAwQ0FBMDIwODg4MTEwOTg4MDJBMworOjEwNTVCMDAwMDhBQTFDMjg4QzA4MjgxNjA0NTgwODY4MTRERDAxMEE1QgorOjEwNTVDMDAwQTcwMjI0NDExQTJBMzA4MDJCMTIwNDA3QUEyODU4MDg1RgorOjEwNTVEMDAwNjNCMTMzOEIxM0I0NTU5QTYwMDRBQzI4QjQ2NjJDNTY2RgorOjEwNTVFMDAwMkI3QjY5RTAxNkREM0E5NDEyQzA1MEMwRDAxN0RDRjQ3MgorOjEwNTVGMDAwOUQxNUQzNzBENDEwMkY2MDgwMkU2MDgyOUYxNjlFMTc0OQorOjEwNTYwMDAwODgxNjcyODkxQThEMTI4QzQwMkE2MDdGMERDQzI4MkI0NworOjEwNTYxMDAwM0EyMDBDQUEyODU4MDg1MUMwQjEwQUJFMzcyRTM1NDg4NgorOjEwNTYyMDAwOEYxNzcyRjkxQThEMTI4QzQwMkE2MDgxMERDQzI4MkJBRAorOjEwNTYzMDAwM0EyMDBDQUEyODU4MDg0OUMwQjEwQUJFMzcyRTM1NEE2QworOjEwNTY0MDAwQjIzM0I0NDRCMTU1Njk1MkI2QjQ2NkMwNTA4RjE1Qjg4MAorOjEwNTY1MDAwNzdEMzcwQjJGRjlGMTU2RUY4OTlEMTBGNkMxMDA0QzAwQworOjEwNTY2MDAwMjFEMTBGMDA2QzEwMDQyNzBBMDAxQ0RDRDMxRkRDRTRERQorOjEwNTY3MDAwMUVEQ0U3MUREQ0QwMUFERDE0MUJERDIyQzAyODI0QjA5RgorOjEwNTY4MDAwMDA2RDJBNzVBQTQ4Mjg4MDgwQzA5MTY0ODA2MTAwNDExRAorOjEwNTY5MDAwMDQxNURDQ0JDMDMxMjU1MDM2MDAzNjFBMDY1NTAxMDVGRAorOjEwNTZBMDAwOTUzOTBDNTYxMTBDNjYwODI5NjI5NjZFOTc0RDBENTk2NgorOjEwNTZCMDAwMEEyOTkyMjQ2ODkwMDgxMkREMDYwMjQyMDg3Mjk5M0I3QQorOjEwNTZDMDAwMjM2Mjk1MTJEQ0M4Q0IzNDlGMzAwMjgyMDIwRTQ0MDI2MgorOjEwNTZEMDAwQzA5Mjk5MzE5NDMyOTIzM0FENTIyNDYyOTVDMDkwMjQ5NQorOjEwNTZFMDAwNEMxMDI0NjY5NTI0QjAwMDI5MjRBMEFBNDIyOTI0ODBDNQorOjEwNTZGMDAwQjE3N0IxNDQwNDA0NDIyNEI0MDBEMTBGRDEwRkQxMEZDQgorOjEwNTcwMDAwNkMxMDA0MUFEQ0FDMkFBMDAwNTgwMjFDNUJGRkQ1MDIwNgorOjEwNTcxMDAwMkEwMjAzM0IwMjVCRkZEMTFCRENBQUM5QTEyQ0IxMDIwOAorOjEwNTcyMDAwQzBENDBEQ0MwMjBDMEM0RjJDQjUwMjBDRTQzMUQxMEZCRgorOjEwNTczMDAwQzBBMDBBRTQzMTE4RENBMDAwMDIwMDJGODI4MjE5REMyQworOjEwNTc0MDAwQjMyRUIxMDIwOUZGMDIyRjg2ODIwRUU0MzFEMTBGMDA4MQorOjEwNTc1MDAwNkMxMDA0QzAyMDAyRTQzMTE0REM5QTE2REM5NzAwMDJCRAorOjEwNTc2MDAwMDAyMjYyODIyMzQxMDI3MzJGMDYwM0U0MzFDMDIwRDE1QworOjEwNTc3MDAwMEYxOURDRTYxQURDRTUyODQxMDIwQTJBMDEwOTg4MDEzMgorOjEwNTc4MDAwMkE2NjgyMjg0NTAyMDhFNDMxMTVEQ0RDMTJEQ0UxMjVCQQorOjEwNTc5MDAwNDYyMUQxMEY2QzEwMDQyOTIwMDYyODlDRjk2NDgwQTBCMgorOjEwNTdBMDAwMkE5Q0ZENjVBMDk2OEEyODhEMjYyRjBBMDg3QUQ5MDQ5RQorOjEwNTdCMDAwMkIyMjFGQzhCRDJDMjA2NDY0QzA4MTJFMjIwOTBFQUU4RQorOjEwNTdDMDAwMEM2NkUwNzgyQjIwMEMxRURDN0MwQ0JDMTFBRUNDMjhDNworOjEwNTdEMDAwQzI4NjE5REM3QTc4RjMwMjYwMDBBRDA5QjkwQTI5OTIxMQorOjEwNTdFMDAwQTM2ODkwMDgyRTIyMDAwOUVFMEM2NUUwOUIyOUMyODU3MworOjEwNTdGMDAwMUZEQzg0NjQ5MDkyOUY5MEMwRTQxRkRDOTE5RTkxMjhFRQorOjEwNTgwMDAwMjAwQUMwRTA5RTkzMEY4ODAyOTg5Mjg4MjAwRjg4MDI5OQorOjEwNTgxMDAwOTg5NDJGMjAwNzlBOTc5RDk2MkY5NTBBMkUyNDA3Mjg1MworOjEwNTgyMDAwMjAwNjI5MjA2NDY4ODMzMzI4QzI4NTEyREM2QjI4OEMwQgorOjEwNTgzMDAwMjBBMkIyMkUyNENGMjhDNjg1QzAyMEQxMEZDMDIwRDFFRgorOjEwNTg0MDAwMEYyQTIwNkEwMTExMDIwQTJBNDE2NUFGNTJEQTIwQzBFQworOjEwNTg1MDAwQjA1ODA1RUE2NEFGRTVDMDIxRDEwRjAwNjQ5RkM4MUZBRQorOjEwNTg2MDAwREM1ODJEMjAxNjhGRjIwOUREMEMwMEYxMDQwMEREMUE0MgorOjEwNTg3MDAwQURBRDlEMjkxMkRDNTkyOEMyODVBMkIyMkUyNENGMjhCNQorOjEwNTg4MDAwOEMyMDI4QzY4NUMwMjBEMTBGQzAyMUQxMEYwMDAwMDA3OAorOjEwNTg5MDAwNkMxMDA0MjYwQTAwMUJEQzlGMTVEQzQ5MjgyMDY1MTdDNAorOjEwNThBMDAwREM0NjI4OENGRTY0ODA5NDBDNEQxMTBEQkQwODJDRDI3MgorOjEwNThCMDAwRjUyQkQyRjQyRUQyRjc3Q0IxM0RCNEJCMkJENkY0N0JDMgorOjEwNThDMDAwRTkwNTJCRDJGNjJCRDZGNDdDQjkyQzJBRDJGNjJBRDZBRgorOjEwNThEMDAwRjUyQUQ2RjQwNkU0MzEwMDAyMDAyODcyODIyQUZBRkY4MworOjEwNThFMDAwMDA0MTA0MjkwQTAxMkY1MTAyMDA5OTFBMEE5OTAzMDk1QgorOjEwNThGMDAwODgwMTI4NzY4MjBGRTQzMTI2MjQ2NTJCRDJGNDhFNUM1MQorOjEwNTkwMDAwMkNEMkY1QjBFRTlFNUM3QkNCMTYyOUQyRjYyRkQyRjdDNworOjEwNTkxMDAwMENCODBDMDlGRjBDMDhGRjBDMEYyRjE0QzhGOTYwMDAxRAorOjEwNTkyMDAwMzIwQkNBMEMwQTJBMTRDRUE5MkI1MTAyQzBDMjBDQkJERQorOjEwNTkzMDAwMDIwQjBCNEYyQjU1MDIwQkU0MzFEMTBGMDBEQjMwREE5OQorOjEwNTk0MDAwMjA1QkZGOTQxQkRDNzQ2NEFGNUQwQzREMTFBREJENjMzNworOjEwNTk1MDAwRkZBODAwMDAwNkU0MzEwMDAyMDAyRjcyODIxOERDMzAzQworOjEwNTk2MDAwMkU1MTAyMDhGRjAyMkY3NjgyMEVFNDMxRDEwRjAwMDA4MworOjEwNTk3MDAwNkMxMDA0QzAzMDAzRTQzMTE2REMxMDE1REMxMTAwMDI5OQorOjEwNTk4MDAwMDAyNDYyODI3NDQ3MjExOERDNjQ4NzVDMDg0ODAxMjg3RgorOjEwNTk5MDAwNjY4MkNENzMxOURDNjIwQzJBMTFBQTk5MjI5MjgzMjk5RQorOjEwNTlBMDAwOTI4NDcyOTEwMzgyMjBDQzI5MkI1MTAyMEJFNDMxQzBFNgorOjEwNTlCMDAwMjBEMTBGMDAxRkRDNUIyRTUxMDIwRkVFMDEyRTU1MDI4RAorOjEwNTlDMDAwMEVFNDMxQjAyREIxN0M5QzVDMTJEQzU2MDhERDExMkQ0QgorOjEwNTlEMDAwNTYxREQxMEY2QzEwMDYxQkRCRjcxRURCRjkyMkIwMDA0MQorOjEwNTlFMDAwMUFEQzUyNkYyMzcyMUREQzM5QzA0ODE4REM1MTFGRENGMQorOjEwNTlGMDAwNEZEQzEwRDVDMDgzRjAwMDgwODYwMDUwOEE2RDRBNEY3RQorOjEwNUEwMDAwMEYzNTExMEQzNDA5MjQ0MDgwMEI1NjBBMjk2Mjk0QjFEOAorOjEwNUExMDAwMzMwRTU1MDkyMjUxNDgwRjQ0MTEwQzQ0MEE4NzQwMDk5RQorOjEwNUEyMDAwQTgwQzAyODgzNjIyNTE0OTA3ODgzNjA4NzcwQ0E4OTlCNQorOjEwNUEzMDAwMjk2Njk0OTc0MDI5NjI5NTg3NDEwOUE4MEMwMjg4MzYwNworOjEwNUE0MDAwMDc4ODM2MDg3NzBDQTg5OTI5NjY5NTk3NDEwMzAzNDI4MQorOjEwNUE1MDAwQjEzODA4MDg0Mjk4RjBEMTBGMUNEQzM2MTNEQzM3MjcyOAorOjEwNUE2MDAwQjAwMDIzMzJCNTY0NzA1N0MwOTFDMEQwMTZEQzM1MTUzNAorOjEwNUE3MDAwREMzM0MwNDAyQUMwMDAwMzg4NDMyOEM0MDA2RDc5M0M1MQorOjEwNUE4MDAwMDA0MTA0QjE0NDAwOTcxQTc3ODAxNDhFNTAyRkIyOTVDQworOjEwNUE5MDAwMkRCNjk1QUZFRTJFRUQyMDA2RUUzNjlFNTA2MDAwMTgyNgorOjEwNUFBMDAwNzdBMDA5ODM1MDlENTAyM0I2OTU2MDAwMDIyM0IyOTVEQworOjEwNUFCMDAwMjIzRDIwMDYyMjM2MjJCNjk1QjQ1NUI4QkJEMTBGMDA0MAorOjEwNUFDMDAwMDM4ODQzMjhDNDAwRDEwRjZDMTAwNEMwNDAwNEU0MzFBMworOjEwNUFEMDAwMTVEQzFEMDAwMjAwODg1MDEzREMxQ0NCODE1QkZGQkQ3MAorOjEwNUFFMDAwMUNEQzFCMEMyRDExQURDQzJCQzI4MjJBQzI4Mzk0NTAxRQorOjEwNUFGMDAwN0JBQjE0MkVDMjg0MjlDMjg1MEFCRDBDMEU5OTBDMERGNQorOjEwNUIwMDAwOTkwQzA5MjkxNDYwMDAwNTBCQTkwQzA5MjkxNDk5MzA3NgorOjEwNUIxMDAwMTVEQkFDMkE1MTAyMEFFNDMxMkEyQ0ZDNTgwMDRCMkIyRAorOjEwNUIyMDAwMzIwMDBBQTIwMjJCQkNGRjlCMzBDQ0I2QzhBNEQyQTA4NAorOjEwNUIzMDAwRDEwRjAwMDAwNEU0MzExRURCQTAwMDAyMDAyREUyODI0MAorOjEwNUI0MDAwMkZCQUZGMkM1MTAyMEZERDAxMkRFNjgyMENFNDMxRDE3QQorOjEwNUI1MDAwMEYwMDAwMDA2QzEwMDREMTBGMDAwMDAwNkMxMDA0QzA5NgorOjEwNUI2MDAwMjBEMTBGMDA2QzEwMDQxM0RCRkFDMEQxMDMyMzA5MjNFQQorOjEwNUI3MDAwMzE4RkMwQTA2RjM0MDI2MDAwOEQxOURCOEYxQkRCOTA2QQorOjEwNUI4MDAwMTdEQkYzMEMyODExQTg3NzI2NzI4MzI1NzI4MjJDRkE3MgorOjEwNUI5MDAwRkY3NjUxNDc4ODUwMkU3Mjg1MjU1QzA0MjU3NjgyNzVFNAorOjEwNUJBMDAwRTkwNTI1NzI4NDI1NzY4Mjc2NTkyOTJFNzI4NDJFNzYwRgorOjEwNUJCMDAwODIyRTc2ODMwQUU0MzEwMDAyMDAyMzkyODIwMDIxMDRCRgorOjEwNUJDMDAwMkZCMTAyMDBENjFBMEM2NjAzMDYzMzAxMjM5NjgyMEYwQQorOjEwNUJEMDAwRTQzMTI2NzI4MzI1NzI4MjYwMDAwMjAwRDhBMDc2NTlEMworOjEwNUJFMDAwMjIwQUU0MzEwMDAyMDAyMzkyODIwMDIxMDQwMEQyMUEyQQorOjEwNUJGMDAwMkZCMTAyMEMyMjAzMDIzMjAxMjI5NjgyMEZFNDMxRDIyRAorOjEwNUMwMDAwODBEMTBGMDBEMjgwRDEwRkMwMjBEMTBGNkMxMDA0REJFNworOjEwNUMxMDAwMzA4NjIwMTVEQjY4MjgwQTAwMjgyNTAyREEyMDI4QjAwMworOjEwNUMyMDAwMDAyQ0IwMDcwNTg4MEEyODgyNEMyRDBBMDEwQjgwMDA0MQorOjEwNUMzMDAwREJBMDY1QUZFNjFBREI2MTBBNEEwQTI5QTJBM0M3QkY0NworOjEwNUM0MDAwNzY5MTAxRDEwRjJCQTZBM0QxMEYwMDAwNkMxMDA0QzBEOAorOjEwNUM1MDAwRDFDN0NGMUJEQjVCMTlEQjU4MTdEQjU2MEMyODExQTgwQgorOjEwNUM2MDAwNzc4Njc1ODU3NEMwQTA3NjUxNjI4ODUwOEU3N0I0NTU1QQorOjEwNUM3MDAwOTU3NDc1RTkwMzg1NzY5NTc0NzY1OTI3OEY3NjlGNzVBNworOjEwNUM4MDAwOUY3NDBBRTQzMTAwMDIwMDIzOTI4MkI0MkUyRkIxMDJFNQorOjEwNUM5MDAwMDBFMTA0MDBENjFBMEM2NjAzMDYzMzAxMjM5NjgyMEYzNgorOjEwNUNBMDAwRTQzMTg2NzU4Mzc0NzYzOTI4MEFFNDMxMDAwMjAwMkVDNworOjEwNUNCMDAwOTI4MkI0MjIwMDIxMDQyNEIxMDIwMERGMUEwQ0ZGMDNGNworOjEwNUNDMDAwMEZFRTAxMkU5NjgyMDRFNDMxRDI4MEQxMEZEOEEwNzY1NworOjEwNUNEMDAwNTFENkQyODBEMTBGMDAwMDZDMTAwNDI5MEE4MDFFREIzRgorOjEwNUNFMDAwNUQxRkRCNUQxQ0RCMzUwQzJCMTFBQ0JCMkMyQ0ZDMkRBNAorOjEwNUNGMDAwQjI4NTBGQ0MwMjlFRDE5Q0QwQzA1MUMwNzAxM0RCNTkyRAorOjEwNUQwMDAwMTREQjU4MThEQjU2MkFCMjg1QTgyODA0MjQwQTIzNDYzNworOjEwNUQxMDAwOTFBOTg2QjhBQTJBQjY4NUE5ODgyNzg0OUYyNTY0OUY1OQorOjEwNUQyMDAwRDEwRjAwMDA2QzEwMDQxOURCOEIwQzJBMTFBOUE5ODk3MgorOjEwNUQzMDAwOTBDNDg0Nzk4Qjc2MUJEQjc5QUJBQzJBQzI4MzJDQzJFRQorOjEwNUQ0MDAwODQ3QUMxNjg4QUEwMkJCQzMwRDNBMDY0QTA1RTBCMkJFMAorOjEwNUQ1MDAwMEEyQ0IyQTMxOURCNDI2OEMwMDcxRERCN0ZEMzBGN0Q3RAorOjEwNUQ2MDAwQzk0QUE5MjkyOTlEMDEyOTkwMUY2ODkxMzI3MEE2MDM2QgorOjEwNUQ3MDAwRDNBMENBOUU2ODkyMTBDN0FGMkFCNkEzMkEyQ0ZDNUI5OAorOjEwNUQ4MDAwRkZCM0QyMzBEMTBGMDAwMDEzREI3NTAzQTMwMThDMzFCOAorOjEwNUQ5MDAwMUREQjEzMEM4QzE0MERDQzAxMkNCNkEzNjNGRkRDMDBBRgorOjEwNURBMDAwQzAyMEQxMEZEQTIwNUJGRkNDQzAyMEQxMEZDMDIwRDFBMgorOjEwNURCMDAwMEYwMDAwMDA2QzEwMDREQjMwQzBEMDE5REFGRURBMjBDRQorOjEwNURDMDAwMjgzMDAwMjIzMDA3MDg0ODEyMDk4ODBBMjg4MjRDREM1MworOjEwNUREMDAwMjAwQjgwMDAxQkRBRjkwQzRBMTFBQkFBMjlBMjg0MDkxNgorOjEwNURFMDAwMjkwQjI5QTY4NEQxMEYwMDZDMTAwNEMwNDExOERBRjJFNworOjEwNURGMDAwMTdEQUY0MEMyNjExQTcyNzI3NzAzOEE4NjYyNTYyODZDMworOjEwNUUwMDAwMDA3MTA0QTM1NTAwNDQxQTc1NDE0ODIyNjI4NDE1REJEMQorOjEwNUUxMDAwMTUwMjMyMEJDOTIyODgyMTE3REFGMTA4ODQxNDA3NDRDRAorOjEwNUUyMDAwMDE3NTQ5MDVDODM0QzAyMEQxMEZEMTBGMDgwOTQ3MUQ5RAorOjEwNUUzMDAwREI0QUMwQjI4RTIwMUZEQURGMEUwRTQzQUZFQzJCQzQ1QworOjEwNUU0MDAwQTAwRkVFMEEyREU2MjQyQTYyODRDMDIwMEE5OTBCMjlBRAorOjEwNUU1MDAwNjY4NEQxMEZDMDIwRDEwRjZDMTAwNERCMzBDMEQwMTg4NQorOjEwNUU2MDAwREFENURBMjAyNTMwMDAyMjMwMDcwODU4MEEyODgyNEM3QgorOjEwNUU3MDAwREMyMDBCODAwMDg5MzE3MDlFMTIxQkRBQ0YwQzRBMTE5NgorOjEwNUU4MDAwQUJBQTI5QTI4NDA5MjkwQjI5QTY4NEQxMEYwOUM5NTJEQQorOjEwNUU5MDAwNjg1MzI2MDA5MTA0MThEQUNBQzBBMTJGODExNjAwQUFGRgorOjEwNUVBMDAwMUEwQUZGMDIyRjg1MTYxRURBQzQwQzREMTFBRUREMkMyNgorOjEwNUVCMDAwRDI4NDBDMkMwQjJDRDY4NEQxMEZDMDgxMUZEQUMxQjgzMAorOjEwNUVDMDAwOUEwQTBBNDcyRUYxMTYwMEExMDQwMDg4MUEwOEVFMDI2OQorOjEwNUVEMDAwMkVGNTE2MUREQUI5MEM0QzExQURDQzJCQzI4NDBCMkI1MAorOjEwNUVFMDAwMEIyQkM2ODREMTBGMDAwMDZDMTAwNERCMzBDMEQwMTkxRQorOjEwNUVGMDAwREFCMURBMjAyODMwMDAyMjMwMDcwOTg4MEEyODgyNENEQgorOjEwNUYwMDAwREMyMDBCODAwMDFDREFBQzBDNEIxMUFDQkIyQUIyODQzOQorOjEwNUYxMDAwMEEyQTBCMkFCNjg0RDEwRjZDMTAwNEMwNDExOERBQTZFNQorOjEwNUYyMDAwMTZEQUE4MEMyNzExQTYyNjI2NjAzOEE4NzIyNTIyODYyNAorOjEwNUYzMDAwMDA2MTA0QTM1NTAwNDQxQTc1NDEwODIyMjI4NDAyMzJFQworOjEwNUY0MDAwMEJEMTBGMDBDMDIwRDEwRjZDMTAwNDE1REIwNTAyNDlFNgorOjEwNUY1MDAwMTQyOTU2MTEyNDUyMTIwMjA4NDMwRjg4MTFDMDczMDBFRAorOjEwNUY2MDAwODEwNDAwMzYxQTAwODEwNEM3OEYwMDc3MUEwODc3MDM2RQorOjEwNUY3MDAwMDc0NDAxMDY0NDAyMjQ1NjEyRDEwRjAwNkMxMDA2NkUyRAorOjEwNUY4MDAwMjMwMjYwMDBBQzY0MjBBN0MwQTA4NTEwMTNEQUREMTZFMAorOjEwNUY5MDAwREFGNEMwNDBBNkFBMkJBMkFFMEIxOTQxNjQ5MDY2Njg0MQorOjEwNUZBMDAwOTE1RDY4OTI1MjY4OTMzQzJBQTJBQTI4M0M3RjI4OEM3MworOjEwNUZCMDAwN0YwQTBBNEQyOTgwMDEyODgwMDAyQUFDRjIwODg4MTE0NgorOjEwNUZDMDAwMDk4ODAyNzU4OTQ2MkIzRDAxMjlCMDAwMkJCMDAxMDhENAorOjEwNUZEMDAwOTkxMTBCOTkwMjdBOTkzNEI4MzMyQTJBMDBCMTQ0NzI4NAorOjEwNUZFMDAwNDlCMTYwMDA0QTdGQkYwNzE1REFERjYzRkZCOTAwMDBERgorOjEwNUZGMDAwMjUzQUU4NjNGRkIxMDAwMDI1M0FFODYzRkZBOTAwMDBGNQorOjEwNjAwMDAwMjUwQTY0NjNGRkExQzA1QTYzRkY5QzAwMDA3MDVGMDgwQgorOjEwNjAxMDAwMjUzNEZGMDU4QzE0MkMzNEZFNzBBRjBCMEE4RDE0MkUyMgorOjEwNjAyMDAwM0QwMTJBRTQwMTJERTQwMERBNDA1QkZENTA2M0ZGQTc0NworOjEwNjAzMDAwRDEwRkQxMEY2QzEwMDQxQURBNjIxOURBNUYxQ0RBQ0FCOAorOjEwNjA0MDAwMUJEQUNCQzA4MEMwNzE2MDAwMEQwMDAwMDAyMkE0MzhCNAorOjEwNjA1MDAwQjFBQTI5OUMxMDdCOTE1RjI2OTI4Njc5QzIxNTZFNjI0NworOjEwNjA2MDAwNjJDMDIwNkQwODBBQjEyMjAwMjEwNDAwNzQxQTc2NEIyOAorOjEwNjA3MDAwREI2M0ZGRUUyMjkyODUwRDYzMTEwMzI1MTQ2NDVGQ0Y2RAorOjEwNjA4MDAwRDY1MDAzMkQ0MzZERDkwMzk4MjBCNDIyMDY0NDE0NkRENQorOjEwNjA5MDAwNDkyMjk4MjA5ODIxOTgyMjk4MjM5ODI0OTgyNTk4MjY3OAorOjEwNjBBMDAwOTgyNzk4Mjg5ODI5OTgyQTk4MkI5ODJDOTgyRDk4MkVEQworOjEwNjBCMDAwOTgyRjIyMkM0MDYzRkY5NzFFREE0MDI3RTY4MDI3RTZDMAorOjEwNjBDMDAwODFEMTBGMDBDMDIwNjNGRjgzMDAwMDAwNkMxMDA0QzA2QQorOjEwNjBEMDAwNjJDMDQxMTJEQTNCMUFEQTM3MTNEQTUyMkFBMDAwMjNERgorOjEwNjBFMDAwMzIyRDE5REE5RjJCQUNGRTI5OTJBRTZFQTMwMjYwMDAwRQorOjEwNjBGMDAwOEUwOTBFNDAyRDFBQzJDMkNEMEVEQzM5MkMyNTFBNjQzMQorOjEwNjEwMDAwQjA4OTVCRkY5RTE1REE5QTFBREE5NTJCM0FFODBBM0FCQgorOjEwNjExMDAwMDE1ODA1OTIyQjIxMUEwQUJCMjhEM0EwOUI1MDU4MDU4MQorOjEwNjEyMDAwQTkyQjUyMDAwQUJCMDgyQTBBMDA1ODA1QTgxNURBOTFDMworOjEwNjEzMDAwMkQyMTAyMkMzQUU4MEMzQzI4MDRERDAyMkQyNTAyOUM3RQorOjEwNjE0MDAwNTA1ODA1QTA4QjUwQUFCQkMwQTE1ODA1QTAxQ0RBOEFFNAorOjEwNjE1MDAwMkQyMTAyMEMzQzI4MDZERDAyMTNEQTg4MkQyNTAyOUMzNQorOjEwNjE2MDAwMzA1ODA1OTg4QjMwQUFCQkMwQTI1ODA1OTgyQTIxMDI0NgorOjEwNjE3MDAwQzBCNDBCQUEwMjBBMEE0RjJBMjUwMjU4MDVBQ0QxMEY1NworOjEwNjE4MDAwMjQyNDIzQzNDQzJDMjUxQTYzRkY3NjAwMThEQTgwMUM0NAorOjEwNjE5MDAwREE3QzE5REE3RDFCREE3QjE3REE0Rjg1MjAyRTBBRkRBRgorOjEwNjFBMDAwMUZEQTdDMkQyMDM2MjRGNDdBMjRGNDdFMjRGNDgyMEUyNworOjEwNjFCMDAwREQwMTI0RjQ4NjJFMEFGNzA3NTUyODA2REQwMkMwNzU5NgorOjEwNjFDMDAwMEVERDAxMDUwNTA2QUI1QkE5NTlDMEU4QUM1QzI0QzQzMworOjEwNjFEMDAwQUIwRUREMDIyN0M0QUMyRTBBREZBODU1MjdCNEVDMEVBNworOjEwNjFFMDAwREQwMTI0QjRFQkMyRTAyNzk0MkMwRUREMDIyNDk0MkJCNQorOjEwNjFGMDAwMkUwQTgwMEQwRDQ2Mjc1NDZDMjQ1NDZCMEVERDAyMkRBMworOjEwNjIwMDAwMjQzNjYzRkVGQzAwMDAwMDZDMTAwNDJBMEEzMDJCMEFCRQorOjEwNjIxMDAwMDM1QkZGNEQxMkRBNTNDMzkwMjkyNjE2QzNBMUMwQjMwNgorOjEwNjIyMDAwQzA4QTI4MjYxNzVCRkY0OEMwM0NDM0IxMkIyNjE2MUEyQworOjEwNjIzMDAwRDlFNDJBQTAyMDIzMjYxNzY0QTA3OUMzQTJDMEIxNUJBOQorOjEwNjI0MDAwRkY0MkMzQTJDMEIxNUJGRjQwQzNDMjJDMjYxNkMyQUYzRgorOjEwNjI1MDAwQzBCMTIzMjYxNzVCRkYzQ0MyOEYyODI2MTZDMEZFMkYzNQorOjEwNjI2MDAwMjYxN0MyRTIyRTI2MTYyQTBBQTFDMEIxQzBEODJEMjZCMgorOjEwNjI3MDAwMTc1QkZGMzUyQTBBQTEyQTI2MTZDM0E2QzBCM0MxOTIwRQorOjEwNjI4MDAwMjkyNjE3NUJGRjMxQzNDNjJDMjYxNkMxQjMyQTBBQTJFMgorOjEwNjI5MDAwMkIyNjE3QzBCMzVCRkYyQzI5MEFBMjI5MjYxNkMxODUxRAorOjEwNjJBMDAwMjgyNjE3QzJGQjJGMjYxNkMwRTcyRTI2MTcxRERBMzkxRgorOjEwNjJCMDAwMkQyNjEwRDEwRkMzQTJDMEIzNUJGRjIzNjNGRjgyMDA2MgorOjEwNjJDMDAwNkMxMDA0MUNEQTAzMUJEOUVEMThEQTMzMTdEQTM0MTYxNAorOjEwNjJEMDAwREEzNDE1REEzNEMwRTBDMEQ0MTREOUZGMUZEOUI5QzBGQworOjEwNjJFMDAwMjg4RkYwNkQyQTM2REFDMEQ5QzA3QzVCMDIwRkM5MEM0QQorOjEwNjJGMDAwMUNEOUY5MEM5QzI4QThDM0E2QzIyQTM2ODAyQTI1ODQ1QQorOjEwNjMwMDAwQTRDMkE3Q0MyRDI0OEMyQjI0OEEyQjI0ODcyRTI0OEI0QgorOjEwNjMxMDAwQjFCQjJFMzY5RjJDMzY5RTJDMzY5REIxQUMxQ0Q5RDdFNgorOjEwNjMyMDAwMUJEQTIyQzAyODZEMkEzM0RBQzBEOUMwN0M1QjAyMEY4OQorOjEwNjMzMDAwQzkwQzFDRDlFODBDOUMyOEE4QzNBNkMyMkEzNjgwMkJGRAorOjEwNjM0MDAwMjU4NEE0QzJCMUJCQTdDQzJEMjQ4QzJFMjQ4QjJBMjQ1NworOjEwNjM1MDAwOEEyRTM2OUYyQzM2OUUyQzM2OURCMUFDQzA3OTE5RDkyOQorOjEwNjM2MDAwRDgxQkRBMTQxM0RBMTIxQURBMTIxOERBMTMxNEQ5RDk3QworOjEwNjM3MDAwMTZEQTEzMDRGNDI4MTJEQTEyMDQ2NjBDMDQwNTA2QTJENQorOjEwNjM4MDAwNTJBODU4QUE1QUEzNTM5QjMwMjlBNTAwMjc4NDhBQzAzMworOjEwNjM5MDAwOTFDMEE1MkE4NDhDMjk4NDhCMTdEQTBCMThEQTBBQTdGNgorOjEwNjNBMDAwNTcyNjM2MUQyNjM2MUUyRTM2MUYxNkRBMDgxM0RBMDgzMworOjEwNjNCMDAwQTY1NTA0MzMwQzI4MjZDODJFNzUwMDJENTRBQzJFNTQzNworOjEwNjNDMDAwQUIyRTU0QUEyMzI2RTYyMzI2RTUyRTI2RTdEMTBGMDA3RQorOjEwNjNEMDAwNkMxMDA2MTNEOTk0MTdEOUUyMjQ3MjNEMjIzMjkzN0ZCMAorOjEwNjNFMDAwMkYwQjZEMDgwNTI4MzI5MzdGOEYwMjYzRkZGM0MwQzQyMworOjEwNjNGMDAwQzBCMDFBRDk3M0MwNTFEOTQwMDQ1OTM5MjlBNDIwNkVBQworOjEwNjQwMDAwNDQwMjBCQjUwMkMzMjgxRUQ5NkVEREIwMjVFNDIyMDU3NworOjEwNjQxMDAwMkQzOTJERTQyMUMwNTAxRUQ5RUYxOUQ5REYxOEQ5REY0RAorOjEwNjQyMDAwMTZEOUUxMUREOUVEOTQxMDJBNzI0NTE3RDlBQjZEQTk4MworOjEwNjQzMDAwNEJENDUwQjM1NTdBNUIxN0RGNTA3NTZCMDcxRkQ5NjA4QgorOjEwNjQ0MDAwOEZGMDBGNUYwQzEyRDlBMzAyRjIyOEFFMjIyMkQ2ODE2MAorOjEwNjQ1MDAwRDU0MDEzRDlBMDc0NkIwNzE1RDk1QTg1NTAwNTQ1MEM0MgorOjEwNjQ2MDAwMDM1MzI4QjE0NUE3M0ZBODMyQTkzMzIyMzY5RDIyMzZDRgorOjEwNjQ3MDAwOUUyNDM2ODAyQjM2OUYyQkY0OEIyQ0Y0OEMxNEQ5NjlGOAorOjEwNjQ4MDAwMjQ0MjREQzAzMDA0MTQxNEM4NEM2RDA4MDZCMTMzMDRDNgorOjEwNjQ5MDAwMTQxNEM4NDI2M0ZGRjIwMDE1RDk0N0M0NDAwMDMxMDQwOAorOjEwNjRBMDAwMUFEOTQ4QzBEMTkzQTIwMEREMUFDMTM4QjBERDlEQTMyRQorOjEwNjRCMDAwMThEOTVEMkI4MjREMjk4MjRFMjlBNTIwMjg4MjUzN0EzNgorOjEwNjRDMDAwODcxRTJDNTQwMDhFMTA2RkU0NUQxMkQ5M0QyRjIxMjFDMAorOjEwNjREMDAwMjMyMTIwMkYyNTFGMDQzMzBDMjMyNTIwMjMyNTFFRDEwMworOjEwNjRFMDAwMEZDMDYyMThEOTlGODg4MDdFODdEOTg5MTAyNjU0MDBGMgorOjEwNjRGMDAwNkY5NDE5MUJEOTMzMkFCMTIwMEExQTE0MDRBQTBDMkE0MgorOjEwNjUwMDAwQjUyMDJBQjUyMTJBQjUxRTJBQjUxRkQxMEYxQkQ5MkNCQgorOjEwNjUxMDAwMkFCMTIwMEExQTE0MDNBQTBDMkFCNTIwMkFCNTIxMkE2NgorOjEwNjUyMDAwQjUxRTJBQjUxRkQxMEYwMDFDRDkyNjJCQzEyMTJEQzFBNAorOjEwNjUzMDAwMjAyQkM1MUYwM0REMEMyREM1MjAyREM1MUVEMTBGMDAzRQorOjEwNjU0MDAwNkMxMDA2MTlEOTFGMTREOTg2MTJEOTM2MTVEOUEzQzdDQworOjEwNjU1MDAwM0ZDMEUwMkU1NkE4MkU1NkE5MkU1NkFBMkU1NkFCMjM4MworOjEwNjU2MDAwMjYyOTE4RDk0NkRCMTAxQ0Q5OURDMEQ0MkE0MjQ1MkRCNgorOjEwNjU3MDAwMTYwMTJDMTYwMDAwQjA4OTBBODgwQzk4OTA1QkZGOTRENQorOjEwNjU4MDAwMkMyMkUzMThEOTBGMEM1QzE0OUM4NDJCMjJFNDhDODRGRAorOjEwNjU5MDAwQjFCQjBCNUIxNDBDQkIwQzlCODUyQTIyRTUwQTVBMTQ3OQorOjEwNjVBMDAwMkE4NjA2MjkyMkNEMDk1OTE0Mjk4NjA3MkYyMjg5MkZFOAorOjEwNjVCMDAwODYwOTVCRkY0MzVCRkYxNDIzNDYzQkMxQjAxRUQ5MDAzNQorOjEwNjVDMDAwMUREOTYwMkFFMTAyMkQ0NjNBMEJBQTAyMEEwQTRGMkE3NworOjEwNjVEMDAwRTUwMjU4MDQ5NjVCRkVCRDVCRkU5NkMwNTBDMEIwMTY0NworOjEwNjVFMDAwRDhGNjE0RDhGRTE3RDk2RkMwQzBDNzNFOTMxMjJDMjYxOAorOjEwNjVGMDAwMkRDMDMwNjAwMDQ0MDAwMDAwN0Y5RjBGQjE1NTA5MTk4NQorOjEwNjYwMDAwMTQ2NTlGRjRDMDUwMEFBOTAyN0ZBN0VGMThEOEVBREFGMAorOjEwNjYxMDAwNTAwODU4MEEyODgyMkMyQjBBMDAwQjgwMDAwMDUxMDRENQorOjEwNjYyMDAwRDJBMEMwOTFDN0FGMDA5OTFBMEE5OTAzOTkxMkNFMzgyNworOjEwNjYzMDAwNjQyMDZCRDMyMDJCMjAwNzI1MTYwMzJDMTIwMjJBNjIxQworOjEwNjY0MDAwODI3Q0E4NjMxOEQ4REMwMTExMDIwODU4MEEyODgyMkMyMQorOjEwNjY1MDAwREE1MDBCODAwMEQyQTA2NDNGRDU4QTMxMEE4QTE0MDQzNAorOjEwNjY2MDAwQUEwMUM4MkEyQjIyMDEwQjhCMTQwNEJCMDE3QkE5NDU2QworOjEwNjY3MDAwRERBMDdBN0IwODFERDhEMjJERDIwMDBEQUQwQ0RCMzAwOQorOjEwNjY4MDAwMTlEOENEMUFEOTE0ODgxMzBBREEyOERDODAxREQ5NTFGQgorOjEwNjY5MDAwMDk4ODBBMjg4MjNDMERBQTA4MEI4MDAwNjUyRjkzRDMzNQorOjEwNjZBMDAwMjBDMEIwNjNGRjk0MDAwMDdGQUYzNEIxNTUwMDUwMDRBOAorOjEwNjZCMDAwMEEwOTE5NjNGRjQyREFCMDdCN0IwODFBRDhDMTJBQTIwMworOjEwNjZDMDAwMDAwQUJBMEMxQkQ5MDQ4QzMxMEJBQjI4MEM4QTE0MUNBMQorOjEwNjZEMDAwRDk0MUFDQkIxQ0Q5NDEwNEFBMDEyQkM2ODE2M0ZGOEZGMQorOjEwNjZFMDAwNjQ1RjYwQzA1MEMwQjBDN0NFOUMxMjYzRkY1NTAwMDAwRAorOjEwNjZGMDAwNkMxMDA0MjcyMjFFQzA4MDA4RTQzMTFCRDhBRjAwMDJCMgorOjEwNjcwMDAwMDAyQUIyODIxOUQ4QUYwMDMxMDRDMDYxMDA2NjFBMjk4QworOjEwNjcxMDAwOTEwMjBBNkEwMjJBQjY4MjA5RTQzMTE1RDkwQzBDMzhCMgorOjEwNjcyMDAwMTFBODUzMjgzMjgyMjQzMjg0MkE4Q0ZDNzg0MTEwMjkwMworOjEwNjczMDAwMjEwMjJBMzY4Mjk3QTAwOTY5MDIyOTI1MDJEMTBGMDA3OQorOjEwNjc0MDAwMkIyMTAyMkMzMjg1MEI2QjAyMkNDQ0ZDMkMzNjgyOTczMQorOjEwNjc1MDAwQzAyQjI1MDJEMTBGMDAwMDZDMTAwNEMwRTcxREQ4OTI5OQorOjEwNjc2MDAwMUNEODk0MEQ0OTExRDcyMDhCMjI4QTIwMEI0QjBCRDJCOQorOjEwNjc3MDAwQTAwN0E4MEM5QjcyMjg4Q0Y0QzgzNDZGOEUwMjYwMDBBRQorOjEwNjc4MDAwQTMxRkQ4OEFBMjk4QUY3Qjc4QjMzNEM5M0RDMDgxQzAxQgorOjEwNjc5MDAwRjAwMjhGMzgwRjBGNDJDOUZBMkNENjdFRDUyMDZENEFGMQorOjEwNjdBMDAwMDUwMDMwODgwMDUwOEM4ODcwMDg5ODA4NzhCMTZERDI0OAorOjEwNjdCMDAwQTA5ODcwRDEwRkMwRjAwMzhGMzg3RkUwREU2M0ZGRDg2MAorOjEwNjdDMDAwMDI3QjBDQUZCQjBCOTkwQzY0MzA0N0Q4MzBDMEYxQzBEMgorOjEwNjdEMDAwNTAwMkY1MzgwNTA1NDI2NDUwNzkyQ0Q2N0UwQjM2MTJFRQorOjEwNjdFMDAwMkY2QzEwMEY0RjM2NkRGQTA1MDA4MDg4MDAyMDhDMDY0NAorOjEwNjdGMDAwNDQwQ0MwODFDMDUwMDNCMjA4MjM3QzBDMDM4NTM4MDVDQgorOjEwNjgwMDAwMDU0MjY0NTA1QTJDRDY3RUQzMEY2RDRBMDUwMDIwODg2RAorOjEwNjgxMDAwMDAzMDhDRDJBMEE3OThCQzg4OTg3MEQxMEZEMkEwQkNCMQorOjEwNjgyMDAwNzk5OTcwRDEwRkQyMzAyQkFEMDhDMEYxQzA1MDBCRjU2MworOjEwNjgzMDAwMzgwNTA1NDJDQjU0MkNENjdFMDgzRjE0MjYwQTEwMEY4QgorOjEwNjg0MDAwNjYwQzA2NDYzNjZENkEwNTAwMjA4ODAwQjA4QzgyNzBBMgorOjEwNjg1MDAwNjNGRjJEMDBDMDUwMDNGNTM4NzVFMDgwNjNGRjdBMDBCOAorOjEwNjg2MDAwQzA2MDAyODYzODc2RTA5RjYzRkY5OTAwQzA1MDAzRjU1MAorOjEwNjg3MDAwMzg3NUUwQzQ2M0ZGQkUwMDZDMTAwNEQ2MjA2ODUyMEY2OAorOjEwNjg4MDAwNjk1MzI0REEyMERCMzBEQzQwNTgwMEY3RDJBMEQxMEY2NgorOjEwNjg5MDAwREEyMERCMzBEQzQwNTgwMEY0OUEyNDI0MjQwRUMwMjE5NgorOjEwNjhBMDAwMjI2NDBGQzAyMEQxMEYwMEI4M0JCMDRDMkEyQzc0ODk1MQorOjEwNjhCMDAwMjQyRDIwMEUyRTIwMEZBNEREQjFFRTJFMjQwRkIwRERFRQorOjEwNjhDMDAwMkQyNDBFMjg5MDA3MkQ5MDAzQTQ4OEIwODhCMUREMkRDQgorOjEwNjhEMDAwOTQwMzI4OTQwNzVCRkZBMDY5NTExREMwRTA4MjI0MkExRAorOjEwNjhFMDAwNjAwRjE4RDhCRjJBMjQwMzI5NjAwRThGMjAyOTI0MDc5RgorOjEwNjhGMDAwMDhGRjAyOUYyMDlFNjREMTBGQzAyMEQxMEYwMDAwMDAyRQorOjEwNjkwMDAwNkMxMDA0OTQyMzE5RDhCN0MwQjMwODNBMTEwQkFBMDIyQgorOjEwNjkxMDAwOTkyMDE5RDgyOTlBMjExNkQ4MjdDMDUwMjg5MjlEMjU0OAorOjEwNjkyMDAwNjRBMjI4OEMxODI4OTY5REQxMEYwMDAwNkMxMDA0MjhCMgorOjEwNjkzMDAwMjA2NkMwMzgyMzI0MDZCNzg4MjgyNDY2RDEwRjAwMDBCQgorOjEwNjk0MDAwNkMxMDA2MEQzQzExMUFEODE5RDgyMDAzNUIwQzg2MjI1NgorOjEwNjk1MDAwMEQ1NTExODIyMUFBODkwMjMyMEI5MjgxMDU2MzBDOTM5NQorOjEwNjk2MDAwODIwQzU1MEM3OTJCNTRDQjUzMUNEODExMUREODBGQzA1OQorOjEwNjk3MDAwRjdBMjU2QzAzMUMwQTAwNDNBMzgwQTBBNDI3NjkzNDNCRgorOjEwNjk4MDAwMDQ0MzAyQzlBQjJDRDY3RUQzMEY2REJBMDUwMDIwODgxNAorOjEwNjk5MDAwMDAzMDhDODI4MUEyNTI3MjkxN0Q5MjgxODM4MkM4M0VBNgorOjEwNjlBMDAwRDEwRkMwNzFDMDYwMDI3NjM4NzZGMERCNjNGRkQ1MDA4RQorOjEwNjlCMDAwQzAyMEJDODk5OTgxOTk4MDkyODJEMTBGMjIyREY4OTJCMgorOjEwNjlDMDAwODE2M0ZGQTIxOUQ3RkEwMjg2MENBOTY2OTYxMUQ5NDBGNQorOjEwNjlEMDAwMDYzNjEyOTYxMDA2QkIwQzY0QTA0NDJDRDY3RThBMTA5NAorOjEwNjlFMDAwRDMwRjZEQUEwNTAwMjA4ODAwOTA4Q0JDODI4MzExQzA1MworOjEwNjlGMDAwRTBBNDMzMjQwQTAxMDM0RTM4MEUwRTQyQ0FFQzJDRDYxMgorOjEwNkEwMDAwN0U2REJBMDUwMDIwODgwMDMwOEM4MjExMDI1MjBDQTJFMworOjEwNkExMDAwODJCQzIyOTI4MTYzRkY4M0JDODI5MjgxNjNGRjdDMDBFRgorOjEwNkEyMDAwQzA2MDAyMzYzODc2RjBCNTYzRkZBRjAwQzA3MDAyNDczMQorOjEwNkEzMDAwMzg3N0YwQ0M2M0ZGQzYwMDZDMTAwNDE0RDdFQkMxNTI1QQorOjEwNkE0MDAwQTQyNENBMzEyODIyMUQ3MzgxMUMyOTIxMDI2NTkwMTZCNQorOjEwNkE1MDAwMkEzMDAwNzVBOTEyMDIyQTAyMDMzQjAyMkMzMDA3QzAxQgorOjEwNkE2MDAwRDI1ODAxRDU2NTNGRENEMTBGMkIzMDA3MDNCQjBCMEI5MAorOjEwNkE3MDAwQkEwMjc0QjMwMjJBQkRGOEQzQTA2M0ZGQzQwMDAwMDBCOQorOjEwNkE4MDAwNkMxMDA0MjkyMDA2QzA3MDZFOTc0MTI5MjEwMkMwOEYyNgorOjEwNkE5MDAwMkEyMDE0QzBCNjJCMjQwNjA2QUEwMjJBMjQxNDc5ODBDMAorOjEwNkFBMDAwMDIyNzI1MDIyQTIyMUUyQzIyMUQ3QUMxMEVDOEFCREEyQgorOjEwNkFCMDAwMjBEQjMwMkMwQTAwMDMzRDAyNUJGN0Y5NjQ1MDg5MkQ3RQorOjEwNkFDMDAwMjEwMjBEMEQ0Q0M5RDNDMDIwRDEwRjAwMDAyRTlDRkIxQworOjEwNkFEMDAwNjRFMDk2MkYyMTAyMEYwRjRDNjVGMEE1MUFEN0I3MUU2MAorOjEwNkFFMDAwRDdCNTI5QTI5RUMwOEE3OThCNzEyQkUyMjY2OEIwMDRBMworOjEwNkFGMDAwOEMyMDdCQzk2NjI5QTI5RDFGRDdCMjY0OTA1RDk3OTBCOAorOjEwNkIwMDAwQzBDMzFERDdDNjJCMjEwNDlEOTYwOEJCMTEwQ0JCMDIyOAorOjEwNkIxMDAwOUI5MTlCOTcxQ0Q3QzNDMDg1MjdFNEEyMkJBMjlEMjhERAorOjEwNkIyMDAwMjQwNjhERkEyODIxMDJCMEREMkJCQzMwMkJBNjlEOURCQQorOjEwNkIzMDAwRkEwQzg4MDIyODI1MDJDOEQyQzAyMEQxMEY4RUY5MTI4MworOjEwNkI0MDAwRDdCOTJFMjY4OUMwMjBEMTBGMjgzMDAwNjg4OTM4REFCRAorOjEwNkI1MDAwMjBEQjMwREM0MDU4MDA0NDYzRkY2MzAwMDIyQTAyMkIzNAorOjEwNkI2MDAwMEEwNjU4MDBEMzIyMEEwMEQxMEY2NTUwMTAyOTMwMDBDMAorOjEwNkI3MDAwNjg5OTI0MDIyQTAyMDMzQjAyREM0MDU4MDAzQkMwMjBGMworOjEwNkI4MDAwRDEwRkQyNzBEMTBGMDAwMDJBMkM3NDAzM0IwMjA0NENBOQorOjEwNkI5MDAwMDI1QkZFRjE2M0ZGMjcwMERCMzBEQzQwMkEyQzc0NUJENAorOjEwNkJBMDAwRkVFRUMwMjBEMTBGMDAwMDZDMTAwNEM4M0Y4OTI2ODg3QgorOjEwNkJCMDAwMjlBMzk5OTkyNjA5ODgwQzA4MDg0ODI4MjUyNUNDNTIyQworOjEwNkJDMDAwQzAyMEQxMEZEQjQwMkEyQzc0NUJGOTJGRDJBMEQxMEY0QgorOjEwNkJEMDAwNkMxMDA0RDgyMEQ3MzA4MjIyMEQ0NTExMDUyMjBDOTI2QQorOjEwNkJFMDAwODI2NDIwNzQwNzQyMEIxM0Q3NzFENDIwQTM4MzczMjNDQworOjEwNkJGMDAwMDIyNDJERjg4NTgwNzQ1MTRDQkM4MkMwOTA2RDA4MTYxQgorOjEwNkMwMDAwMDA0MDg4MDA3MDhDNzczOTAzRDcyMEMwOTE4NjgwNzQ0QgorOjEwNkMxMDAwMzkwMUQ0MjA3NDYxMDI2M0ZGRTJDQTk4QzA5N0MwNDE3MQorOjEwNkMyMDAwMUJEN0YyQzBBMDBCOEIwQzBCNEEzODBBMEE0MkM5QUEyOAorOjEwNkMzMDAwMURENzVFMUNENzVGMkNENjdFQzE0MEQzMEY2RDRBMDU5MQorOjEwNkM0MDAwMDAyMDg4MDAzMDhDOTc4MEQyNzBEMTBGQkM4RkMwRTBCQworOjEwNkM1MDAwMEY0RTM4N0U5MEUyNjNGRkQ2QkM4MjkyODE5MjgwQzA1NAorOjEwNkM2MDAwMjA5MjgyRDEwRjAwMDAwMDZDMTAwNkMwRDcxQ0Q3NEVCNgorOjEwNkM3MDAwMUJENzUwMEQ0OTExRDcyMDJFMjIxRjI4MjIxRDBFNEU0MgorOjEwNkM4MDAwMEJEMjgwMDc4QTBDMkU3NjFGMkFBQzgwQzgzNDZGQUVEOAorOjEwNkM5MDAwMDI2MDAwQ0IyRjBBODAxQUQ3NTRBMjlFQUE3QTdFQTM0NAorOjEwNkNBMDAwM0ZDOTNGQzBFMUMwNTAwMkU1MzgwNTA1NDJDQTU1MkIzNworOjEwNkNCMDAwQzY3RURCMjBEMzBGNkQ0QTA1MDAzMDg4MDBCMDhDMkVENQorOjEwNkNDMDAwNzIxREFFOUUwRUE1MEM2NDUwODZEMjgwMkU3NjFEQzAxRAorOjEwNkNEMDAwOTEyOTg0MDNEMTBGQzA1MDAzRTUzODc1RDBEMzYzRkZFOQorOjEwNkNFMDAwQ0QxNUQ3NDEwMjdFMENBNUVFNjQzMDUxQzBBMTI1MEExNgorOjEwNkNGMDAwMDAwMkE1MzgwMzNBMDIwNTA1NDI2NDUwOTIyQkM2N0U3NQorOjEwNkQwMDAwMEUzNTEyOTUxMDI1NUMxMDA1NDUzNkQzMEY2RDVBMDVDQQorOjEwNkQxMDAwMDBBMDg4MDAyMDhDQzBBMUEzRTJDMDUwMjNGQTgwMDMwOQorOjEwNkQyMDAwNzMwQzAzQTUzOEFGNzMwNTA1NDI2NDUwNzIyQkM2N0UwMQorOjEwNkQzMDAwODUxMDA1NDUwQzZENUEwNTAwMjA4ODAwMzA4Q0QyODBFNgorOjEwNkQ0MDAwQzBBMTBFOUIwQ0FCN0JBRkJCMkI3NjFEMkE4NDAzRDE1RAorOjEwNkQ1MDAwMEZEMjgwQzBDMUFGN0QyRDc2MUQyQzg0MDNEMTBGMDBEMgorOjEwNkQ2MDAwRDIzMDJFOEQwOEMwRjFDMDUwMEVGNTM4MDUwNTQyQ0I0QgorOjEwNkQ3MDAwNTkyQkM2N0UwQTNGMTRDMTYwMEY2NjBDMDY0NjM2RDNGNworOjEwNkQ4MDAwMEY2RDZBMDUwMDIwODgwMEUwOEMyMjcyMUQ2M0ZGMDNFRQorOjEwNkQ5MDAwQzA2MUMwNTAwMzY1Mzg3NUQ4MDI2M0ZGNjI2M0ZGNUM1MQorOjEwNkRBMDAwQzA1MDAyQTUzODc1RDA4NzYzRkY4MTAwQzA2MDAzRjYyQworOjEwNkRCMDAwMzg3NkQwQkY2M0ZGQjkwMDZDMTAwNDJBMjAxNTI5MjA1MworOjEwNkRDMDAwMTYxNEQ2RkYwQTk5MENDQjlEMkUyMDBCMDRFRDA5MkIyRgorOjEwNkREMDAwRDEyMDhGMjgwOUJDMzZBQ0FBMENCQjBDMkJENTIwMEFCRAorOjEwNkRFMDAwMEE0NzJBMjQxNUNBQUY4QjQzODk0MkIwQTgwMDkxMDRGMAorOjEwNkRGMDAwMDA4ODFBQThGRjBGQkIwMjlCMjc4RjI2MEZCODBDNzhCQworOjEwNkUwMDAwM0IxQUMwMjBEMTBGMDAwMDI5MjEwMkMwQTIwQTk5MDIxQQorOjEwNkUxMDAwMjkyNTAyQzAyMUQxMEYwMDhCMjc2M0ZGREMyQkQxMjA1NQorOjEwNkUyMDAwMENBQTBDMEEwQTQ3MkEyNDE1QUNCQjJCRDUyMEM5QUVFNAorOjEwNkUzMDAwOEI0MzhDMjg4RjQyQjBBRDAwRjEwNDAwREQxQUFEQ0MzRAorOjEwNkU0MDAwMENCQjAyOUIyN0RBMjBCN0VCNTgwMDE5QzAyMUQxMEZFOQorOjEwNkU1MDAwOUYyNzYzRkZFRjAwMDAwMDZDMTAwNDI4MjAzQzY0MzA4MworOjEwNkU2MDAwNDcwNTMwNjAwMDA3M0UwMTA1M0VCMTU2MDc2NTM5MDUwQworOjEwNkU3MDAwNDkyOEM3N0ZBOTMzMDMwNjQxMDc2NjAzQjE2NjA2MDZBMgorOjEwNkU4MDAwNDFBNjMzN0U4NzFFMjIyMTI1MjkxQUZDNzMyQjE1MDI2OQorOjEwNkU5MDAwMzgwQzA5ODE2MDAwMDYzRTAxMDIzRUIxMjQwNjQyMzlFOQorOjEwNkVBMDAwMDMyMjBBRDEwRkQyMzBEMTBGQzA1MTYzRkZDMDAwMDBCRQorOjEwNkVCMDAwNkMxMDA0MjcyMjFFQzA4MDA4RTQzMTFERDZCRjAwMDJEQQorOjEwNkVDMDAwMDAyQ0QyODIxQkQ2QkYwMDMxMDRDMDYxMDA2NjFBMkI5MQorOjEwNkVEMDAwQjEwMjBDNkMwMjJDRDY4MjBCRTQzMTE5RDc0NDBDM0E2NworOjEwNkVFMDAwMTFBQTkzMjgzMjgyOTc4MDI1MzI4MjI0MzI4NEI0NTVBNQorOjEwNkVGMDAwMjUzNjgyNzU0MTBBMjkyMTAyMDk2OTAyMjkyNTAyRDExNAorOjEwNkYwMDAwMEYyQTIxMDIyQjMyODMwQTZBMDIyQjM2ODIyQTI1MDI5QgorOjEwNkYxMDAwRDEwRjAwMDA2QzEwMDQxOEQ2QTgwQzI3MTEwODc3MDhCMAorOjEwNkYyMDAwMjY3Mjg2MjUzQzA0NzY1QjEzMTVENkE0MDUyMjBBMjIxOAorOjEwNkYzMDAwMjJBMzY4MjAwMjc0MjkwNDIyNzI4NUQxMEZDMDIwRDFCNworOjEwNkY0MDAwMEYwMDAwMDA2QzEwMDQxOUQ2QTcyNzIyMUVDMDgwMDk2QworOjEwNkY1MDAwNzcwMjA4RTQzMTFERDY5ODAwMDIwMDJDRDI4MjFCRDY5RAorOjEwNkY2MDAwOTgwMDMxMDRDMDYxMDA2NjFBMkJCMTAyMEM2QzAyMkMyRgorOjEwNkY3MDAwRDY4MjBCRTQzMTE5RDcxRDBDM0ExMUFBOTMyODMyODIxQworOjEwNkY4MDAwOTc4MDI1MzI4MjI0MzI4NEI0NTUyNTM2ODI3NTQxMEI5MAorOjEwNkY5MDAwMkEyMTAyMEE2QTAyMkEyNTAyRDEwRjAwMkIyMTAyMkM4MworOjEwNkZBMDAwMzI4MzBCNkIwMjJDMzY4MjJCMjUwMkQxMEYwMDAwMDA5RQorOjEwNkZCMDAwNkMxMDA0MUJENjgxMEMyQTExQUJBQTI5QTI4NkI0MzgwNgorOjEwNkZDMDAwNzk4QjIyMUJENjdFMTlENkE1MEIyQjBBMkJCMkEzMDlDRgorOjEwNkZEMDAwMjkwODY4QjAwMjc0QjkwRDI5OUQwMTI5OTAxRjZFOTI4RAorOjEwNkZFMDAwMDgyMkEyODVEMTBGQzAyMEQxMEZDODkyQzAyMEQxMEY5NgorOjEwNkZGMDAwREEyMDVCRUU4OEMwMjBEMTBGMDAwMDAwNkMxMDA0MTQ3MgorOjEwNzAwMDAwRDY2RTI4NDI5RTE5RDY2QjZGODgwMjYwMDBCQTI5OTIwQworOjEwNzAxMDAwMjY2ODkwMDc4QTIwMDlBQTBDNjVBMEFDMkE0MjlEQzA2OAorOjEwNzAyMDAwREM2NEEwQTQyQjIwMEMxOUQ2NjUwQ0JDMTFBNENDMkVCQQorOjEwNzAzMDAwQzI4NjA5QjkwQTdFRDMwMjYwMDA5QTI5OTJBMzY4OTA5OQorOjEwNzA0MDAwMDc4RDIwMDlERDBDNjVEMDhDMjVDMjg1NjQ1MDg2MkQwNgorOjEwNzA1MDAwMjEwNEMwMzA2RUQ4MEQyQzIwNjZCOENDMEMwQzQ3MkMwNworOjEwNzA2MDAwMjQ2NjY1QzA3QjFDRDZFMjE4RDY2QjFBRDY2MjE5RDY4OAorOjEwNzA3MDAwNzMxREQ2NjdDMEU0OUU1MTlENTA4RjIwOTM1NzkzNTU0MgorOjEwNzA4MDAwOTk1MzlBNTY5QTU0MDhGRjAyMUFENjgzOUY1Mjg4MjYxQgorOjEwNzA5MDAwOUY1QTlFNTk5RDU4OTM1RTlDNUQ5MzVDOUE1QjA4MDgyRAorOjEwNzBBMDAwNDgwNTg4MTE5ODVGQzBEODFGRDY0QzBDQjkxMUE0OTkxNworOjEwNzBCMDAwMjg5Mjg1QUZCRjIzRjRDRjI4OEM0MDI4OTY4NThFMjY1MgorOjEwNzBDMDAwMkQyNDA2OUUyOUMwMjBEMTBGQ0EzM0RBMjBDMEI2NUIxQQorOjEwNzBEMDAwRkY3OEM3MkZEMTBGQzkzQURBMjA1QkZGNzVDNzJGRDFEMAorOjEwNzBFMDAwMEZEQkQwNUJGRTA3MjMyNDY2MkIyMDBDNjNGRjc1MDBBQgorOjEwNzBGMDAwQzcyRkQxMEZDNzJGRDEwRjZDMTAwNEM4NUIyOTIwMDZGMgorOjEwNzEwMDAwNjg5NDFDNjg5NjA3QzAyMEQxMEZDMDIwRDEwRkRBMjBFOAorOjEwNzExMDAwREIzMERDNDBERDUwMkUwQTAwNUJGRTU5RDJBMEQxMEZERgorOjEwNzEyMDAwMkUyMDBDMThENjI1MENFRjExQThGRjI5RjI4NkMwODg1NgorOjEwNzEzMDAwNzk4Qjc5MUFENjIyMEFFQTBBMkFBMkEzNjhBMDA0OEJCQworOjEwNzE0MDAwMjA3QUI5NjgyM0YyODU2NDMwNjIxQkQ2MkMyOTBBODAyNAorOjEwNzE1MDAwMkMyMDY4MjgyMDY3MkQyMTA0MEI4ODExMDRERDExMDhEQworOjEwNzE2MDAwREQwMjBEQ0MwMkMwODQyRDRBMTAwRENDMDIxREQ2MjRBOAorOjEwNzE3MDAwOTgzMTlEMzA4QTJCOTkzNzlDMzQwQkFBMDJDMEMwOUM1MQorOjEwNzE4MDAwMzU5QzM2OUEzMjJBMkM3NERCNDAyOEYyODVDMEQzMjhFRAorOjEwNzE5MDAwOEMyMDI4RjY4NTJDMjUwNDJEMjQwNjFGRDYwRkRENDBEMworOjEwNzFBMDAwQUZFRTJDRTRDRjVCRkRFNkQyQTBEMTBGMDBEQTIwREJGRQorOjEwNzFCMDAwRTA1QkZGM0ZDMDIwRDEwRjZDMTAwQUQ2MzAyQTIwMDZCQQorOjEwNzFDMDAwMjQxNjAxMjhBQ0Y4NjU4Mzg2MkIyMTIyQzBGMjJBMjFERgorOjEwNzFEMDAwMjRDQzU3MkFBQzAxMEEwQTRGMkEyNTI0N0FCQjAyNjAyNAorOjEwNzFFMDAwMDM3RjJDMjEwMjBDMEM0QzY1QzMxOTJFMjIxNThEMzIwNQorOjEwNzFGMDAwQzA5MTBFREQwQzY1RDM5MDg4MzgxRUQ1RUY2NDgzNkI4QgorOjEwNzIwMDAwOEMzN0MwQjhDMDk2MENCOTM5OTkxNEI0OUE5QTEyMEQzQgorOjEwNzIxMDAwOTkxMTk5MTM4RjY3MThENUVBQzlGQjI4ODAyMTdGODNCQworOjEwNzIyMDAwMTY4QjE0MkMyMjAwMkEyMDBDNUJGRjYxRDRBMDY0QTNDRgorOjEwNzIzMDAwQjM4RjY3NjAwMDI4MDAwMDJCMjAwQzg5MTIwQ0JBMTE1NAorOjEwNzI0MDAwQUVBQTJDQTI4NjFERDVERDdDOUIzRTBEQkQwQTJERDI5QgorOjEwNzI1MDAwQTM2OEQwMDQ4ODIwN0Q4OTMwMjRBMjg1NjQ0MzY0MjdGNAorOjEwNzI2MDAwMjEyRTA3RjczNjA3RjkwQzZGOUQwMUQ3RjBEQTIwREJFNgorOjEwNzI3MDAwNzBDMUM0MkQyMTFGNUJGRUY4ODkyNjg4MjdEREEwMDk3NworOjEwNzI4MDAwODgwQzdBOEIxNzlBMTA2MDAwMDZDMDQwNjNGRkNDMDAxMAorOjEwNzI5MDAwMDBEQTIwOEIxMDVCRkVDODhEMTA2NUEyNjdDMEUwOUVFRgorOjEwNzJBMDAwNDg4QzY0OUM0OThCNjU4QTY2OUI0QTlBNEI5NzQ1OEZBQworOjEwNzJCMDAwNjc3RjczMDI2MDAxMjBDRDUyOUQxMERBMjBEQjMwMkNGNQorOjEwNzJDMDAwMTIwMTVCRkU2OThEMTBDMDUxRDZBMDhGQTdDMEMwOEE4NQorOjEwNzJEMDAwNjg5NzREOUE0Qzg4Njk4OTZBOTg0RTk5NEY4RTZBOEE0OAorOjEwNzJFMDAwNjlBRTdFNzdFQjAxQjFBQTlFNkE5QTY5OEI2MEMwQTBGNQorOjEwNzJGMDAwMEI4RTE0NzdCNzAxQzBBMUMwOTFDMDg0OTMxNTlEMTc2MAorOjEwNzMwMDAwOTUxNkMwRDAyNTIwM0NDMDMwMDg1ODAxMDg5MzM4QzBERAorOjEwNzMxMDAwODIwODMzMTAwODVCMDEwNTM1NDAwQjlEMzgwN0REMTBFRQorOjEwNzMyMDAwMEJBQjEwMEUxOTQwMkEyMTFGMDc5OTEwMDNERDAyMEQyNworOjEwNzMzMDAwQkIwMjA1NTMxMDA5MzMwMjBBNTUxMTI5MjEyNTBBMkFENworOjEwNzM0MDAwMTQwOTI5MTQwNDk5MTEwQTk5MDIwOTMzMDI4QTJCMjk3NAorOjEwNzM1MDAwMjEwNDBCQUEwMjFCRDYyNzA4OTkxMTA5NTUwMjA4NTVDQQorOjEwNzM2MDAwMDIwQkFBMDI5QTQwODkyMDg4MTQwODk5MTEwOTg4MDIwMAorOjEwNzM3MDAwMTlENUE2MURENjIxMDk4ODAyOTg0MThCMkE5MzQ2OTVENgorOjEwNzM4MDAwNDc4MzE1MERCQjAyODUxNjhEMTc5QjQ0OEE2NTg5NjY1OAorOjEwNzM5MDAwQUFDQUE5N0M3N0NCMDFCMUFBMDdGQjBDOUM2NjlBNjVBNworOjEwNzNBMDAwODgyNjhFMjlBRDg3OTcyNjA3RUUwQzBFMEU0ODJFMjVDRgorOjEwNzNCMDAwMjU5QjY3MkIyMDBDODcxMzFFRDU4MDBDQjkxMUFFOTkyNQorOjEwNzNDMDAwMjg5Mjg1QTc4ODI4OTY4NTE3RDU4NEMwOTBBN0JCMjlDMQorOjEwNzNEMDAwQjRDRjg3MTg2M0ZFM0MwMDhDNjBDMEUwQzA5MUMwRjA2MQorOjEwNzNFMDAwQzAzNEMwQjgyQTIxMDQyODIwM0MwOEFBMTEwQjhCMDEwNAorOjEwNzNGMDAwMDM4MzAxMDM5RjM4MEI5QjM5QzAzMjA4RkYxMDAzODhCOQorOjEwNzQwMDAwMDEwODlFMzgwQzg4MTQwN0VFMTAwRkVFMDIwMzg4MDE2NQorOjEwNzQxMDAwMDg5ODM5MDVCRjEwMjkyMTFGMEFCQjExMDc4ODEwMDhEOQorOjEwNzQyMDAwRkYwMjBCQUEwMjE4RDU3ODA5MjkxNDAzQUEwMjJCMjFGRQorOjEwNzQzMDAwMjU4MzIwMEIyQjE0MDRCQjExMDgzMzExMEZCQjAyMEI0NworOjEwNzQ0MDAwOTkwMjhCMTQ4RjJBMEIzMzAyMDgzMzAyOEIyQjY0NzA0MgorOjEwNzQ1MDAwODY4ODY4OTc0RDk4NEM4NzY5ODg2QTkzNDE5OTQ2OTdDMgorOjEwNzQ2MDAwNEU5ODRGQzA3MDc3QzcwMUMwNzE5QTQ3MThENUUzMEI4QgorOjEwNzQ3MDAwN0MxMDBDRUMwMjA4RjgwMjk4NDQxOEQ1RTAwQ0JDMDIxMQorOjEwNzQ4MDAwMDhDQzAyOUM0MDJBMjAwQzI5NUNGRUMwODAxRkQ1NEFGMworOjEwNzQ5MDAwMUNENTUyMENBRTExMkIyMTI0QUNBQUFGRUVCMEJCOEY4MQorOjEwNzRBMDAwMTMyQ0UyODUyOEE0Q0ZBRkNDMkNFNjg1MkEyMjE1MkJGRAorOjEwNzRCMDAwMjUyNEIxQUEyQTI2MTU2NDkwREJDOUQyOEYyNjJFMjI1NAorOjEwNzRDMDAwMDkwREZGMDgyRjI2MDYwRkVFMEMwRTBFNDgyRTI1MjU1RgorOjEwNzREMDAwNjU1MEU0QzAyMEQxMEYwMEMwNzA5MzQxOUY0NDk5NDY4RAorOjEwNzRFMDAwOUE0Nzc3QzcwQTFDRDUzNjJDQzAyMkMwODEwQzg3MzgzMgorOjEwNzRGMDAwMUNENUM0MEI3ODEwMDhFODAyMDhCODAyMEM4ODAyOTg2MgorOjEwNzUwMDAwNDA2M0ZGODAwMENDNTdEQTIwREI2MDhDMTE1QkZERDYzNgorOjEwNzUxMDAwMjkyMTAyNjg5ODA2Njg5NDAzQzAyMEQxMEYyQjIyMUVFRgorOjEwNzUyMDAwQzBBMDI5MjIxRDJBMjUwMjdCOTkwMUMwQjA2NEJGRThCMgorOjEwNzUzMDAwMTNENTIxMkNCMDA3MjhCMDAwREEyMDAzODgwQTI4ODI0RQorOjEwNzU0MDAwNENDMEQxMEI4MDAwREJBMDY1QUZFNzYzRkZDQTAwMDAzMQorOjEwNzU1MDAwNjhBNzc5REEyMERCMzBEQzQwREQ1MDVCRkVFN0QyQTBBMworOjEwNzU2MDAwRDEwRkMxNkRDMTlEMjkyNTJDNjAwMDA0MjkyNTJDRDY4MQorOjEwNzU3MDAwOTAyNjI0NjcyRjI0NjhEQTIwREIzMDhDMTFERDUwMkUxMgorOjEwNzU4MDAwMEE4MDVCRkQzRkQyQTBEMTBGQzE2OEMxQTgyQTI1MkM3QgorOjEwNzU5MDAwNjNGRkREMDAwMDAwQzhERjhDMjY4QjI5QURDQzlDMjY2NAorOjEwNzVBMDAwMENCQjBDMEIwQjQ4MkIyNTI1MkEyQzc0REI2MDJDMTJGMgorOjEwNzVCMDAwMDE1QkZEODdEMkEwRDEwRjJBMkM3NDhCMTE1QkY2QjIzMAorOjEwNzVDMDAwRDJBMEQxMEZEQTIwNUJGRTNBNjNGRjM4MDBEQTIwQzA4OAorOjEwNzVEMDAwQjE1QkZFOEE2NEFCRjE2NTVGMzUyRDIxMjRCMUREMkRGMQorOjEwNzVFMDAwMjUyNDYzRkYxRkRBMjAyQjIwMEM1QkZFNTY2M0ZGMTQ1QgorOjEwNzVGMDAwMTJENTg1ODIyMDAyODI1N0M4MjE2M0ZGRkMxMkQ1ODFGMworOjEwNzYwMDAwMDNFODMwMDRFRTMwMDVCMTMwOTMyMDk0MjE5NTIyNjNENQorOjEwNzYxMDAwRkZGQzAwMDAxMEQ1N0Q5MTAwOTIwMTkzMDI5NDAzMTFBQworOjEwNzYyMDAwRDU1NDgyMTAwMUVBMzBBMjExMDFGMDMxQzA0MDA0RTRDNworOjEwNzYzMDAwMTYwMDAyMDAxMUQ1NzY4MjEwMjM0QTAwMDMyMjAyOTIxRQorOjEwNzY0MDAwMTAxMUQ1NDBDMDIxOTIxMDA0RTQzMTg0MDM4MzAyODJEQQorOjEwNzY1MDAwMDE4MTAwMDBEMjMwMDEyMzAwMDAwMDAwMTBENTZEOTE5RgorOjEwNzY2MDAwMDA5MjAxOTMwMjk0MDMxMUQ1NDM4MjEwMDFFQTMwQTJFMworOjEwNzY3MDAwMTEwMUYxMzFDMDQwMDRFNDE2MDAwMjAwMTFENTY0ODIwQQorOjEwNzY4MDAwMTAxM0Q0RTcwMzIyMDI5MjEwMDRFNDMxODQwMzgzMDIyRQorOjEwNzY5MDAwODIwMTgxMDAwMEQzMzAwMTMzMDAwMDAwMTBENTVFOTFEQgorOjEwNzZBMDAwMDA4MTAxNjUxMDQ5ODEwMjY1MTA0NDgxMDNDRjFGOTI1QQorOjEwNzZCMDAwMDE5MzAyOTQwMzExRDUzMTgyMTAwMUVBMzBBMjExMDEyNQorOjEwNzZDMDAwRjIzMUMwNDAwNEU0MTYwMDAyMDAxMUQ1NTA4MjEwMTNCQworOjEwNzZEMDAwRDRDRjAzMjIwMjkyMTAwNEU0MzE4NDAzODMwMjgyMDE5NgorOjEwNzZFMDAwQzAxMDkxMDM5MTAyOTEwMTgxMDAwMEQ0MzAwMTQzMDA0OAorOjEwNzZGMDAwMTJENTAwQzAzMDI4Mzc0MDI4Mzc0NDI4Mzc0ODI4Mzc2QgorOjEwNzcwMDAwNEMyMzNEMDE3MjMzRUQwMzAyMDA2M0ZGRkMwMDAwMDBENworOjEwNzcxMDAwMTBENTQyOTEwMDkyMDE5MzAyOTQwMzExRDU0MDgyMTAzQQorOjEwNzcyMDAwOTIxMDExRDRGMjgzMTAwMzIyMDI5MjEwMTFENTNEMTI0RgorOjEwNzczMDAwRDUwNDkyMTBDMDQwMDRFNDE2MDAwMjAwMTFENTM0ODIzMgorOjEwNzc0MDAwMTAxM0Q0RUIwMzIyMDI5MjEwMDRFNDMxODQwMzgzMDI2OQorOjEwNzc1MDAwODIwMTgxMDAwMEQ1MzAwMTUzMDAwMDAwNkMxMDAyNkVFMAorOjEwNzc2MDAwMzIyRkQ2MjAwNTZGMDQwNDNGMDQ3NDVCMkEwNTQ0MENCNQorOjEwNzc3MDAwMDA0MTA0MDAzMzFBMjIwQTAwNkQ0OTBENzM2MzA0MDNBQgorOjEwNzc4MDAwNjYwQ0IxMjIwRjIyMTEwMzEzMTQ3MzYzMDIyMjJDMDEyMQorOjEwNzc5MDAwRDEwRkM4M0JEMTBGMDAwMDczNjMwQ0MwMjFEMTBGMDA4MworOjEwNzdBMDAwMDAwMDAwMDA0NDQ5NTYzMEMwMjBEMTBGNkMxMDAyMDA4OAorOjEwNzdCMDAwNDAwNDZCNEMwNzAzMjMxODAyMDIxOUQxMEYwMjAzMTk2RQorOjEwNzdDMDAwQzAyMEQxMEY2QzEwMDIwMkVBMzBEMTBGNkMxMDAyQ0MzNQorOjEwNzdEMDAwMjUwM0YwMzE2MDAwMEYwMDZGMjIwNTAzRjEzMTYwMDBENgorOjEwNzdFMDAwMDU2RjIzMDUwM0YyMzEwMDAyMDBEMTBGNkMxMDAyQ0NBQgorOjEwNzdGMDAwMjUwMkYwMzBEMTBGMDAwMDZGMjIwNDAyRjEzMEQxMEZDQQorOjEwNzgwMDAwNkYyMzA0MDJGMjMwRDEwRkMwMjBEMTBGNkMxMDAyMjI3RQorOjEwNzgxMDAwMEEyMDIzMEEwMDZEMjgwRTI4Mzc0MDI4Mzc0NDI4MzdDRAorOjEwNzgyMDAwNDgyODM3NEMyMzNEMDEwMzAyMDBEMTBGNkMxMDAyMDI5RgorOjEwNzgzMDAwRTQzMUQxMEYwQTAwMDAwMDQzNjg2NTZDNzM2OTZGMjA2MgorOjEwNzg0MDAwNDY1NzIwNDQ0NTQyNTU0NzNEMzAyMDI4NDI3NTY5NkNEMworOjEwNzg1MDAwNzQyMDRENkY2RTIwNEQ2MTcyMjAyMDM4MjAzMTM3M0FGMAorOjEwNzg2MDAwMzIzODNBMzEzNTIwNTA1MzU0MjAzMjMwMzEzMDIwNkY4NQorOjEwNzg3MDAwNkUyMDYzNkM2NTZGNzA2MTc0NzI2MTJFNjE3MzY5NjNGMQorOjEwNzg4MDAwNjQ2NTczNjk2NzZFNjU3MjczMkU2MzZGNkQzQTJGNjhGNgorOjEwNzg5MDAwNkY2RDY1MkY2NjY1NkM2OTc4MkY3NzJGNjY3NzVGMzcxOAorOjEwNzhBMDAwMkUzOTJENjk3NzYxNzI3MDI5MkMyMDU2NjU3MjczNjlBMworOjEwNzhCMDAwNkY2RTIwNTQzMzc4NzgyMDMwMzAzNzJFMzA2MTJFMzA4MAorOjEwNzhDMDAwMzAyMDJEMjAzMTMwMzAzNzMwNjEzMDMwMTAwNzBBMDA0MQorOjA0NzhEMDAwMEJERkU4NzU2RAorOjAwMDAwMDAxRkYKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2N4Z2IzL3QzZnctNy40LjAuYmluLmloZXggYi9maXJtd2FyZS9jeGdiMy90M2Z3LTcuNC4wLmJpbi5paGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGRkYTk0Li4wMDAwMDAwCi0tLSBhL2Zpcm13YXJlL2N4Z2IzL3QzZnctNy40LjAuYmluLmloZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTE3ICswLDAgQEAKLToxMDAwMDAwMDYwMDA3NDAwMjAwMzgwMDAyMDAzNzAwMDAwMDAxMDAwRDYKLToxMDAwMTAwMDAwMDAyMDAwRTEwMDAyODQwMDA3MDAwMEUxMDAwMjg4RTcKLToxMDAwMjAwMDAwMDEwMDAwRTAwMDAwMDBFMDAwMDBBMDAxMDAwMDAwNkUKLToxMDAwMzAwMDQ0NDQ0NDQwRTMwMDAxODMyMDAyMDAwMDIwMDFFMDAwMkEKLToxMDAwNDAwMDIwMDFGRjEwMUZGRkQwMDAxRkZGQzAwMEUzMDAwNDNDOTEKLToxMDAwNTAwMDAyMDAwMDAwMjAwMDZCNzQxRkZGQzI5MDIwMDA2QkJDRTgKLToxMDAwNjAwMDFGRkZDMjk0MjAwMDZCRkMxRkZGQzI5ODIwMDA2QzcwMjEKLToxMDAwNzAwMDFGRkZDMjlDMjAwMDAzQzBDMDAwMDBFNDMxMDBFQTMxMzEKLToxMDAwODAwMDAwQTEzMTAwQTAzMTAzMDIwMDAyRUQzMDZFMkEwNTAwMEMKLToxMDAwOTAwMEVEMzEwMDAyMDAwMjE2MDAxMkZGREJDMDMwMTRGRkRBNUYKLToxMDAwQTAwMEQzMEZEMzBGRDMwRjAzNDMxRjI0NEMxMDcyNDlGMEQzNDcKLToxMDAwQjAwMDBGRDMwRkQzMEYxMkZGRDUyMzBBMDAyNDBBMDBEMzBGNEEKLToxMDAwQzAwMEQzMEZEMzBGMDM0MzFGMjQ0QzEwNzI0OUYwRDMwRkQzMjcKLToxMDAwRDAwMDBGRDMwRjE0RkZDRTAzNDIxRjE0RkZDQjAzNDIxRjEyOTYKLToxMDAwRTAwMEZGQ0NDMDMwMkQzNzMwMkQzNzM0MkQzNzM4MkQzNzNDRUQKLToxMDAwRjAwMDIzM0QwMTcyMzNFRDAwMDIwMDEyRkZDNEMwMzAyRjM3RTAKLToxMDAxMDAwMDAwMkYzNzEwMkYzNzIwMkYzNzMwMjMzRDAxNzIzM0VENkEKLToxMDAxMTAwMDAwMDIwMDEyRkZCRUMwMzAyNzM3MDAyNzM3MTAyNzM3RjQKLToxMDAxMjAwMDIwMjczNzMwMjMzRDAxNzIzM0VEMDMwMjAwMTJGRkI5NUYKLToxMDAxMzAwMDEzRkZCQTBDMDIwMDkzMjAxMkZGQjkxM0ZGQjkwQzAyOEYKLToxMDAxNDAwMDAwOTMyMDEyRkZCOEMwMzE5MzIwODIyMDEyRkZCNzEzMTIKLToxMDAxNTAwMEZGQjc5MzIwMTJGRkI3MTVGRkIzMTZGRkI2QzAzMEQ3MTUKLToxMDAxNjAwMDIwMDU2NjAxNjAwMDFCMDAwMDAwMDAwMDAwMDAwMDAwODgKLToxMDAxNzAwMDA0MzYwNTAwMDIwMEQzMEZEMzBGMDUzMzBDNkUzQjE0NzkKLToxMDAxODAwMDA3NDcxNDA3MDQ0Mzc2MzFFNjA0MzYwNTA1MzMwQzZGNDAKLToxMDAxOTAwMDNCRUQwMDAyMDAxMkZGQTYxNUZGQTMyMzBBMDBENzIwQTMKLToxMDAxQTAwMDA3MDQ0MzA0M0UwNTA1MzMwQzA3NDcxNDZGM0JGMDAzNzcKLToxMDAxQjAwMDAyMDAxMkZGQTFDMDMwMTRGRkExRDMwRkQzMEZEMzBGNDEKLToxMDAxQzAwMDkzNDBCNDQ0NzI0OUYyRDMwRkQzMEZEMzBGMTRGRjlCNjMKLToxMDAxRDAwMDgzNDAxNEZGOUI4MzQwMTJGRjlCMjMwQTAwMTRGRjlBNjUKLToxMDAxRTAwMEQzMEZEMzBGRDMwRjkzNDBCNDQ0NzI0OUYyRDMwRkQzM0MKLToxMDAxRjAwMDBGRDMwRjE0RkY5NTgzNDAxMkZGOTVDOTJGODMyMDg0REUKLToxMDAyMDAwMDIxODUyMkJDMjI3NDNCMEY4NjUwQjQ1NTk2MzBCNDMzRkUKLToxMDAyMTAwMDc0MzNGNDYzRkZFNjAwMDA2NTNGRTE2NTVGREUxMkZGQzMKLToxMDAyMjAwMDdDMjMwQTAwMjgzNzQwMjgzNzQ0MjgzNzQ4MjgzNzRDOTEKLToxMDAyMzAwMDIzM0QwMTcyMzNFRDAzMDIwMDAwMDIwMDEyRkY3QUMwNzkKLToxMDAyNDAwMDMyMDMyRTA1MDMwMjAwMTJGRjc4MTNGRjgxOTMyMEMwQjIKLToxMDAyNTAwMDExMDE0OTMxMDA0ODMxMDEwMjAwQzAwMDE0RkY3RTA0NDEKLToxMDAyNjAwMEQyMzExNUZGN0Q5NDUwMTRGRjdEMDREMzMxMTVGRjdDRUUKLToxMDAyNzAwMDk0NTAxNEZGN0MwNEQ0MzExNUZGN0MyNDU2MDAxNEZGRTUKLToxMDAyODAwMDdCMDRENTMxMTVGRjdCMjQ1NjAwMTBGRjdBMDMwMDAwNTQKLToxMDAyOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNUUKLToxMDAyQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNEUKLToxMDAyQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0UKLToxMDAyQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMkUKLToxMDAyRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUKLToxMDAyRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUKLToxMDAyRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkUKLToxMDAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUQKLToxMDAzMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwREQKLToxMDAzMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQ0QKLToxMDAzMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQkQKLToxMDAzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQUQKLToxMDAzNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOUQKLToxMDAzNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEQKLToxMDAzNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN0QKLToxMDAzODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNkQKLToxMDAzOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNUQKLToxMDAzQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNEQKLToxMDAzQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QKLToxMDAzQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMkQKLToxMDAzRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUQKLToxMDAzRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEQKLToxMDAzRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkQKLToxMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUMKLToxMDA0MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwREMKLToxMDA0MjAwMDYzRkZGQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNkUKLToxMDA0MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFGRkMwMDAwQTEKLToxMDA0NDAwMDFGRkMwMDAwRTMwMDA1QzgxRkZDMDAwMDFGRkMwMDAwQUIKLToxMDA0NTAwMEUzMDAwNUM4MUZGQzAwMDAxRkZDMDAwMEUzMDAwNUM4MDYKLToxMDA0NjAwMDFGRkZDMDAwMUZGRkMwMDBFMzAwMDVDODFGRkZDMDAwNDIKLToxMDA0NzAwMDFGRkZDMDE4RTMwMDA1QzgxRkZGQzAxODFGRkZDMDE4RUEKLToxMDA0ODAwMEUzMDAwNUUwMUZGRkMwMTgxRkZGQzI5MEUzMDAwNUUwNzYKLToxMDA0OTAwMDFGRkZDMjkwMUZGRkMyOTBFMzAwMDg1ODFGRkZDMjkwQzkKLToxMDA0QTAwMDFGRkZDNThDRTMwMDA4NTgyMDAwMDAwMDIwMDAwMTZBRUYKLToxMDA0QjAwMEUzMDAwQjU0MjAwMDAxODAyMDAwMDE4MEUzMDAwQ0MwMDkKLToxMDA0QzAwMDIwMDAwMjAwMjAwMDAyMDNFMzAwMENDMDIwMDAwMjFDRjgKLToxMDA0RDAwMDIwMDAwMjIwRTMwMDBDQzQyMDAwMDIyMDIwMDAwMjI2OUQKLToxMDA0RTAwMEUzMDAwQ0M4MjAwMDAyM0MyMDAwMDI0MEUzMDAwQ0QwRDYKLToxMDA0RjAwMDIwMDAwMjQwMjAwMDAyNDlFMzAwMENENDIwMDAwMjRDRkUKLToxMDA1MDAwMDIwMDAwMjUwRTMwMDBDRTAyMDAwMDI1MDIwMDAwMjU5QkQKLToxMDA1MTAwMEUzMDAwQ0U0MjAwMDAyNUMyMDAwMDI2MEUzMDAwQ0YwMjkKLToxMDA1MjAwMDIwMDAwMjYwMjAwMDAyNjlFMzAwMENGNDIwMDAwMjZDNEQKLToxMDA1MzAwMDIwMDAwMjcwRTMwMDBEMDAyMDAwMDI3MDIwMDAwMjc5MEMKLToxMDA1NDAwMEUzMDAwRDA0MjAwMDAyOEMyMDAwMDI4Q0UzMDAwRDEwNUIKLToxMDA1NTAwMDIwMDAwMjkwMjAwMDAyOTNFMzAwMEQxMDIwMDAwMkFDNjYKLToxMDA1NjAwMDIwMDAwMkIwRTMwMDBEMTQyMDAwMDJEMDIwMDAwMkYyQUYKLToxMDA1NzAwMEUzMDAwRDE4MjAwMDAzQjAyMDAwMDNCMEUzMDAwRDNDQTEKLToxMDA1ODAwMDIwMDAwM0IwMjAwMDAzQjBFMzAwMEQzQzIwMDAwM0IwQzYKLToxMDA1OTAwMDIwMDAwM0IwRTMwMDBEM0MyMDAwMDNCMDIwMDAwM0IwQjYKLToxMDA1QTAwMEUzMDAwRDNDMjAwMDAzQjAyMDAwNkQ5NEUzMDAwRDNDRkYKLToxMDA1QjAwMDIwMDA2RDk0MjAwMDZEOTRFMzAwNzcyMDAwMDAwMDAwN0YKLToxMDA1QzAwMDAwMDAwMDAwMDAwMDAwMDAxRkZDMDAwMDFGRkMwMDAwRjUKLToxMDA1RDAwMDFGRkZDNTkwMUZGRkM2NzAyMDAwNkQ5ODIwMDA2RDk4MEEKLToxMDA1RTAwMERFRkZGRTAwMDAwMDA4MENERUFEQkVFRjFGRkZDMkEwNjQKLToxMDA1RjAwMDFGRkNGRTAwMUZGRkMwOTQxRkZGQzVDMDMwMDAwMDAwOUQKLToxMDA2MDAwMDAwM0ZGRkZGODA0MDAwMDAxMDAwMDAwMDA4MEZGRkZGQzgKLToxMDA2MTAwMDFGRkZDMjZEMDAwRkZGRkY4MDRGRkZGRjgwMDAwMDAwMzMKLToxMDA2MjAwMDAwMDAwODgwQjAwMDAwMDU2MDUwMDAwMDYwMDAwMDAwN0QKLToxMDA2MzAwMDQwMDAwMDExMzUwMDAwMDA0MTAwMDAwMDEwMDAwMDAxRTIKLToxMDA2NDAwMDIwMDAwMDAwMDAwMDEwMDA0MDAwMDAwMDA1MDAwMDAwMzUKLToxMDA2NTAwMDgwMDAwMDE5MDQwMDAwMDAwMDAwMDgwMDEwMDAwMDA1RTAKLToxMDA2NjAwMDgwNjAwMDAwNzAwMDAwMDAyMDAwMDAwOTAwMUZGODAwRkEKLToxMDA2NzAwMDgwMDAwMDFFQTAwMDAwMDBGODAwMDAwMDA3RkZGRkZGNDAKLToxMDA2ODAwMDA4MDAwMDAwMTgwMDAwMDAwMTAwODAwMTQyMDAwMDAwODYKLToxMDA2OTAwMDFGRkZDMjFEMUZGRkMwREMwMDAxMDA4MDYwNDAwMDAwODIKLToxMDA2QTAwMDFBMDAwMDAwMEMwMDAwMDAxMDAwMDAwQTAwMDAzMDAwREEKLToxMDA2QjAwMDYwMDAwODAwODAwMDAwMUMwMDAxMDAwMDgwMDAwMDFBOUIKLToxMDA2QzAwMDgwMDAwMDE4RkMwMDAwMDA4MDAwMDAwMTAwMDA0MDAwRDUKLToxMDA2RDAwMDAzMDAwMDAwODAwMDA0MDA1MDAwMDAwM0ZGRkZCRkZGODQKLToxMDA2RTAwMDFGRkZDM0Q0MDAwMDBGRkZGRkZGRjAwMDAwMDAxNkQwNzMKLToxMDA2RjAwMDAwMDBGRkY3QTUwMDAwMDAxRkZGQzRCMDFGRkZDNDYxOEEKLToxMDA3MDAwMDAwMDEwMDA4MDAwMDBCMjAyMDJGRkY4MDFGRkZDNDU1QjAKLToxMDA3MTAwMDAwMDAyQzAwRkZGRUZGRjgwMEZGRkZGRjFGRkZDNTc4NjEKLToxMDA3MjAwMDAwMDAyMDAwRkZGRkRGRkYwMDAwRkZFRjAxMDAxMTAwQ0QKLToxMDA3MzAwMDFGRkZDM0QyMUZGRkM1OTBGRkZGRUZGRjAwMDBGRkZCQUQKLToxMDA3NDAwMDFGRkZDNjMwMUZGRkJFQTBGRkZGRjdGRjFGRkZDMDY0RTMKLToxMDA3NTAwMDAwMDBGRkZEMUZGRkM2MjAwMDAxRkJEMDFGRkZDNUIwM0EKLToxMDA3NjAwMDFGRkZDNjYwMUZGRkM1OTFFMEZGRkUwMDFGRkZDNUEwNzEKLToxMDA3NzAwMDAwMDA4MDAwMUZGRkM1M0MxRkZGQzVCNDFGRkZDMDY4RkQKLToxMDA3ODAwMDFGRkZDNEQwMUZGQ0ZGRDgwMDAxMDA4MTdGRkZGRkZGQzcKLToxMDA3OTAwMEUxMDAwNjAwMDAwMDI3MTAxRkZDRkUzMDFGRkNGRTcwNjkKLToxMDA3QTAwMEUxMDAwMjAwMUZGRkM1MzgxRkZGQzU1MDAwMDNEMDkwQjUKLToxMDA3QjAwMDFGRkZDNTY0MkI1MDYzODAyQjUwNzk4MDJCNTA5MDgwOTUKLToxMDA3QzAwMDJCNTBBNjgwMUZGRkM0NjkwMTAwMTEwRjIwMkZGRTAwQ0YKLToxMDA3RDAwMDIwMzAwMDgwMjAyRkZGMDAwMDAwRkZGRjAwMDFGRkY4MDUKLToxMDA3RTAwMDJCNTBCMjAwMkI1MEIyMDgwMDAxMDAxMDJCNTBCMTgwRUEKLToxMDA3RjAwMDJCNTBCMjgwMkI1MEJBMDAwMDAxMDAxMTJCNTBCRDI4QTUKLToxMDA4MDAwMDJCNTBCQzgwMkI1MEJEQTAyMDMwMDAwMERGRkZGRTAwMkQKLToxMDA4MTAwMDUwMDAwMDAyMDBDMDAwMDAwMjAwMDAwMEZGRkZGN0Y0REIKLToxMDA4MjAwMDFGRkZDMDZDMDAwRkY4MDAwNDQwMDAwMDAwMTAwMDAwMjMKLToxMDA4MzAwMDBDNDAwMDAwMUM0MDAwMDBFMDAwMDBBMDFGRkZDNTQwNkQKLToxMDA4NDAwMDFGRkQwMDA4MUZGRkM1NTQxRkZGQzU2ODFGRkZDNTdDQTMKLToxMDA4NTAwMEUxMDAwNjkwRTEwMDA2RUMwMDAwMDAwMDAwMDAwMDAwNEUKLToxMDA4NjAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwODcKLToxMDA4NzAwMDAwMDAwMDAwMDAwMDAwMDAyMDEwMDA0MDIwMTAwMDQwOTgKLToxMDA4ODAwMDIwMTAwMDQwMjAxNDAwODAyMDBDMDAwMDIwMEMwMDAwRUMKLToxMDA4OTAwMDIwMEMwMDAwMjAxMDAwNDAyMDE0MDA4MDIwMTQwMDgwNTQKLToxMDA4QTAwMDIwMTQwMDgwMjAxODAwQzAyMDFDMDEwMDIwMUMwMTAwMjIKLToxMDA4QjAwMDIwMUMwMTAwMjAyMDAxNDAyMDE4MDBDMDIwMTgwMEMwOEEKLToxMDA4QzAwMDIwMTgwMEMwMjAxQzAxMDAyMDE4MDBDMDIwMTgwMEMwMDMKLToxMDA4RDAwMDIwMTgwMEMwMjAxQzAxMDAyMDIwMDE0MDIwMjAwMTQwRTEKLToxMDA4RTAwMDIwMjAwMTQwMjAyMDA5NDAyMDIwMDk0MDIwMjAwOTQwRUMKLToxMDA4RjAwMDIwMjAwOTQwMjAyNDA5ODBGRkZGRkZGRkZGRkZGRkZGQUEKLToxMDA5MDAwMEZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUIKLToxMDA5MTAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwNTQ5MDIwMDA1MzYwMDAKLToxMDA5MjAwMDIwMDA1NDkwMjAwMDU0OTAyMDAwNTI5QzIwMDA1MjlDQTMKLToxMDA5MzAwMDIwMDA1MjlDMjAwMDUwREMyMDAwNTBEQzIwMDA1MEQ0Q0QKLToxMDA5NDAwMDIwMDA1MDQwMjAwMDRFRTgyMDAwNENDODIwMDA0QTlDNjcKLToxMDA5NTAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwNTQ2MDIwMDA1MzJDMjQKLToxMDA5NjAwMDIwMDA1M0QwMjAwMDUzRDAyMDAwNTE4NDIwMDA1MTg0MTcKLToxMDA5NzAwMDIwMDA1MTg0MjAwMDUxODQyMDAwNTE4NDIwMDA1MENDNUMKLToxMDA5ODAwMDIwMDA1MTg0MjAwMDRFMDgyMDAwNEM3ODIwMDA0QTQ4NjYKLToxMDA5OTAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMEJFODIwMDAzQTMwQkEKLToxMDA5QTAwMDIwMDAwNEMwMjAwMDQ2M0MyMDAwMEJFMDIwMDA0MTQ4MEQKLToxMDA5QjAwMDIwMDAwM0YwMjAwMDQ1RkMyMDAwNEEyNDIwMDAzRTU0ODMKLToxMDA5QzAwMDIwMDAzRDcwMjAwMDM5QUMyMDAwMzgzQzIwMDAzNUFDQzAKLToxMDA5RDAwMDIwMDAzMTBDMjAwMDNCQ0MyMDAwMkQ2QzIwMDAyODAwOTIKLToxMDA5RTAwMDIwMDA2NzE4MjAwMDIzOEMyMDAwMjA2QzIwMDAyMDE4OTUKLToxMDA5RjAwMDIwMDAxRDA0MjAwMDE4MTgyMDAwMTU0ODIwMDAwRTJDOEYKLToxMDBBMDAwMDIwMDAwQzJDMjAwMDExMEMyMDAwMTJGODIwMDA0MzQwODQKLToxMDBBMTAwMDIwMDAzRTA4MjAwMDBCRjAyMDAwMDRDMDAwMDAwMDAwNzEKLToxMDBBMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzYKLToxMDBBMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQjYKLToxMDBBNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQTYKLToxMDBBNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTYKLToxMDBBNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODYKLToxMDBBNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzYKLToxMDBBODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjYKLToxMDBBOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMyNjQwMDAwQzAKLToxMDBBQTAwMDAwMDAwMDAwMzI2NDAwMDA2NDAwNjQwMDY0MDA2NDAwMjAKLToxMDBBQjAwMDY0MDA2NDAwNjQwMDY0MDAwMDAwMDAwMDAwMDAwMDAwQTYKLToxMDBBQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjYKLToxMDBBRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTYKLToxMDBBRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYKLToxMDBBRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRjYKLToxMDBCMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRDUKLToxMDBCMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwQzUKLToxMDBCMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDMyMzgwREYKLToxMDBCMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQjUKLToxMDBCNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQTUKLToxMDBCNTAwMDAwMDAwMDAwMDA1Qzk0MDE1RDk0MDI1RTk0MDM1Rjk0QzkKLToxMDBCNjAwMDAwNDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDIKLToxMDBCNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzUKLToxMDBCODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjUKLToxMDBCOTAwMDAwMDAwMDAwMDA1QzkwMDE1RDkwMDI1RTkwMDM1RjkwOTkKLToxMDBCQTAwMDAwNTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRjIKLToxMDBCQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzUKLToxMDBCQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjUKLToxMDBCRDAwMDAwMDAwMDAwMDA5Qzk0MDAxRDkwMDE5RDk0MDI5RTk0RDIKLToxMDBCRTAwMDAzOUY5NDA0MDg5NDA1MDk5NDA2MEE5NDA3MEI5NDAwNDMKLToxMDBCRjAwMDQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQjIKLToxMDBDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRTQKLToxMDBDMTAwMDAwMDAwMDAwMDA5QzkwMDE5RDkwMDI5RTkwMDcxRDkwOTYKLToxMDBDMjAwMDAzOUY5MDA0Nzg5MDA1Nzk5MDA2N0E5MDA3N0I5MDAwNTYKLToxMDBDMzAwMDUzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjEKLToxMDBDNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQTQKLToxMDBDNTAwMDAwMDAwMDAwMDBEQzk0MDAxRDkwMDFERDk0MDJERTk0OTEKLToxMDBDNjAwMDAzREY5NDA0MDQ5NDA1MDU5NDA2MDY5NDA3MDc5NDA4OEEKLToxMDBDNzAwMDA4OTQwOTA5OTQwQTBBOTQwQjBCOTQwMDQzMDAwMDAwOUQKLToxMDBDODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjQKLToxMDBDOTAwMDAwMDAwMDAwMDBEQzkwMDFERDkwMDJERTkwMEIxRDkwNTIKLToxMDBDQTAwMDAzREY5MDA0QjQ5MDA1QjU5MDA2QjY5MDA3Qjc5MDA4OUUKLToxMDBDQjAwMEI4OTAwOUI5OTAwQUJBOTAwQkJCOTAwMDUzMDAwMDAwOUQKLToxMDBDQzAwMDYzRkZGQzAwMjAwMDZCNTAxMEZGRkYwQTAwMDAwMDAwRDMKLToxMDBDRDAwMDIwMDA2Qjc0MDBEMjMxMTBGRkZFMEEwMDAwMDAwMDAwRkIKLToxMDBDRTAwMDIwMDA2QkJDMDBEMzMxMTBGRkZFMEEwMDAwMDAwMDAwQTIKLToxMDBDRjAwMDIwMDA2QkZDMDBENDMxMTBGRkZFMEEwMDAwMDAwMDAwNTEKLToxMDBEMDAwMDIwMDA2QzcwMDBENTMxMTBGRkZFMEEwMDAwMDAwMDAwQ0EKLToxMDBEMTAwMDYzRkZGQzAwRTAwMDAwQTAxMkZGRjc4MjIwMDI4MjU3NzAKLToxMDBEMjAwMEM4MjE2M0ZGRkMxMkZGRjMwM0U4MzAwNEVFMzAwNUMwNzYKLToxMDBEMzAwMDMwOTMyMDk0MjE5NTIyNjNGRkZDMDAwMDFGRkZEMDAwMTgKLToxMDBENDAwMDAwMDQwMDIwMUZGRkM1OTAxRkZGQzY3MDIwMEEwMDExN0QKLToxMDBENTAwMEZGRkIxM0ZGRkIwM0U2MzEwMTAyMDAxNkZGRkExN0ZGNEEKLToxMDBENjAwMEZBRDMwRjc3NkIwNjkwNjBCNDY2Nzc2M0Y4NTQxNUI1QzUKLToxMDBENzAwMDU0MUE2MTBGMTQwMDYzRkZGOTAwMDAwMDZDMTAwNEMwRTYKLToxMDBEODAwMDIwRDEwRjAwNkMxMDA0QzBDNzFBRUYwNkQ4MzBCQzJCNUUKLToxMDBEOTAwMEQ3MjA4NTcyMEQ0MjExODM3MTA1NDUwQjk1NzIwMjMzODAKLToxMDBEQTAwMDBDMjM3NjAxN0IzQjA0MjMzRDA4OTM3MUEzMkQxMkVFQTcKLToxMDBEQjAwMEZFMTlFRUZFQTI3NjdENjMyQzJFMEEwMDA4ODIwMjI4MjAKLToxMDBEQzAwMDBBMDEwMzhFMzgwRTBFNDJDOEVFMjlBNjdFNkQ0QTA1MzIKLToxMDBERDAwMDAwMjA4ODAwMzA4QzgyNzFEMTBGQzBGMDAyOEYzODdGRTQKLToxMDBERTAwMEMwRUE2M0ZGRTQwMEMwRjFDMDUwMDM3RTBDQTJFRTBFMjcKLToxMDBERjAwMDNEMTIwODgyMDIwM0Y1MzgwNTA1NDJDQjU3MjlBNjdFMkQKLToxMDBFMDAwMDJGREMxMDBGNEYzNjZERkEwNTAwMjA4ODAwMzA4Q0JDQTcKLToxMDBFMTAwMDc1QzAzMDA4RTIwODI4MEEwMTA1ODMzODAzMDM0MkM5NzcKLToxMDBFMjAwMDNFMjlBNjdFMEQ0ODBDRDMwRjZEOEEwNTAwMjA4ODAwNTAKLToxMDBFMzAwMEIwOEM4MjcxRDEwRkMwNTAwOEY1Mzg3NUMwQzE2M0ZGMDYKLToxMDBFNDAwMEJCQzA2MDAyODYzODc2QzBEQTYzRkZENDZDMTAxMjE2MUQKLToxMDBFNTAwMEVFRDhDMUY5QzFFOEMxQzcyQjIyMUUyODIyMURDMEQwN0YKLToxMDBFNjAwMDdCODEzMTI5MjAwNjBCQjcwMjI5OUNGQTY1NTAwODI4OUUKLToxMDBFNzAwMDIwNzIyODhDRkYyODI0NzI2NDkxNUMyQUIwMDAwQ0E4OTAKLToxMDBFODAwMDBDNjQ4MTY3MEVBOTBDNjQ5MkIzN0ZBMTM3NjlBQzJGMDMKLToxMDBFOTAwMDYwMDAzNDAwMDAyODIwMDZEN0QwMjg4Q0ZBQ0M1NzJBQ0UKLToxMDBFQTAwMDIwNzIyQUFDRkYyQTI0NzI2NDgxMzUyQUQwMDAwQ0E5NTIKLToxMDBFQjAwMDBDNjQ5MTY0MEVBQzBDNjRDMzFCN0ZBMTA3NjhBQzA3ODMKLToxMDBFQzAwMEMwMjBEMTBGMDAyRDI1MDI4QTMyQzA5MDBBNkU1MDY1RDUKLToxMDBFRDAwMEU1QjUyOTI0NjcwOTBGNDc2NUY1QjEyQzIwMEMxRkVFRjUKLToxMDBFRTAwMEI1MENDRTExQUZFRTI5RTI4NkI0NDg3OTgzMDI2MDA1RDUKLToxMDBFRjAwMDgyMTlFRUIxMDlDOTBBMjk5MkEzNjg5MDA3OEYyMDA5QzcKLToxMDBGMDAwMEZGMEM2NUY1NkUyRkUyODU2NEY1Njg2NTU1OTYyODIyMUQKLToxMDBGMTAwMDFEN0I4MTA1RDlCMDYwMDAwMjAwQzA5MDhCOTQxN0VFNTQKLToxMDBGMjAwMEE3MEI4ODE0ODc3NDBCMEI0N0E4NzcxOEVFQTUwOUJCOEQKLToxMDBGMzAwMDEwMDg3NzAyOTdGMDE4RUVBMzE3RUVBNDA4QTgwMTBCOEIKLToxMDBGNDAwMDg4MDIwNzQ3MDIxQkVFQTA5N0YxMEI4ODAyOThGMjI3NTAKLToxMDBGNTAwMDkwMjMyQjkwMjIwNDc4MTAwNkJCMTAwNzQ3MTIwOEJCODEKLToxMDBGNjAwMDAyMjg5MDIxMDc3NzEwMEM4ODEwMDc4ODAyMEI4ODAyNEUKLToxMDBGNzAwMDE3RUU5ODhCMzMwN0JCMDE4NzM0MEI4ODAyOThGMzk3RTEKLToxMDBGODAwMDk5OTdGNDhCOTU4NzM5OUJGNTg4OTY4QjM4OThGNjg4RDYKLToxMDBGOTAwMDk3OTdGOTlCRjg5OEY3MTdFRThGMjhFMjg1MDdDNzA4MEYKLToxMDBGQTAwMDJENzRDRjA4NDgwQjI4RTY4NTY1NTUwRjJCMjIxRTI4ODcKLToxMDBGQjAwMDIyMUQ3Qjg5MDIyQjBBMDA2NEJGMDQyQ0IwMDcyOEIwRDUKLToxMDBGQzAwMDAwREEyMDA2ODgwQTI4ODI0Q0MwRDEwQjgwMDBEQkEwMDIKLToxMDBGRDAwMDY1QUZFNzYzRkVFOTAwMDAyOTIwNzI2NTlFOUM2MDA0MEUKLToxMDBGRTAwMEU3MkEyMDcyNjVBRUMzNjAwNERFMDAwMDJFQjAwMzJDMzkKLToxMDBGRjAwMDIwNjdENEUwNjVDMTA1OEEzMjhDMzMwQUZGNTAwQzQ1NjYKLToxMDEwMDAwMDU0QkM1NTY0RjRFQjE5RUU3NDg4MkEwOUE5MDEwOTg4QzcKLToxMDEwMTAwMDBDNjQ4MjFGQzA5MjYwMDBERDJFRDAwMzJBMjA2N0Q0QUEKLToxMDEwMjAwMEUwNjVBMEQ4OEEzMjhCMzMwQUZDNTAwQjQ1NTRCQzU1N0UKLToxMDEwMzAwMDY0QzRCRTE5RUU2OTg4MkEwOUE5MDE3OTg5RDUwQkVBMjkKLToxMDEwNDAwMDUwNjRBNEUzMENFRTExQzBGMDJGMTYxMzJFMTYxNjhBNkUKLToxMDEwNTAwMEU3OENFODJBMTYxMjhFRTlERkMwQUFFQTdFQUIwMUIxNUUKLToxMDEwNjAwMENGMEJBODUwNjU4MzQ2ODgzN0RCQzBBRTg5OTkxRTc4QzAKLToxMDEwNzAwMDlCMDIyQkNDMDEyQjE2MUIyOTEyMEUyQjBBMDAyOTE2QzIKLToxMDEwODAwMDFBN0ZDMzA3N0ZDOTAyN0VBQjAxQzBCMTY1QjQ5RDhCRDcKLToxMDEwOTAwMDM1MkYwQTAwMkEwQTAwN0FDMzA1NjRDM0NCMkYwQTAxNDAKLToxMDEwQTAwMDY1RjQ4OTJCMTIxNjJCMTYxOTAwNTEwNEMwQzEwMENDMEYKLToxMDEwQjAwMDFBMkNDQ0ZGMkMxNjE3MENGQzEzMkMxNjE4MkIxMjFBRkEKLToxMDEwQzAwMDJBMTIxQkRDNTA1ODE5NzRDMEQwQzA5MDJFNUNGNDJDMkUKLToxMDEwRDAwMDEyMTcyODEyMTgyRjEyMUIyQTEyMUEwOEZGMDEwQ0FBMjUKLToxMDEwRTAwMDAxODgzNDA3NEMwQUFCOEIyODEyMTkyQkM2MTYyRjg2QTEKLToxMDEwRjAwMDA4MkE4NjA5MkU3NDEwMjkyNDY3MkU3MDAzODk3NUIxNzkKLToxMDExMDAwMEVBMkE3NDAzQjA5OTA5NDkwQzY1OURCMzJCMjA2NzJEMTkKLToxMDExMTAwMDI1MDI2NUIzRkEyQjIyMUUyQzIyMUQ3QkM5MDFDMEIwMEIKLToxMDExMjAwMDY0QkQ5QzJDQjAwNzI4QjAwMERBMjAwNjg4MEEyODgyMEIKLToxMDExMzAwMDRDQzBEMTBCODAwMERCQTA2NUFGRTc2M0ZEODE4OUJBQUQKLToxMDExNDAwMEIxOTk2NTkwOTc4ODM0MUNFRTI1OThCQThGMzMxRUVFQkUKLToxMDExNTAwMDFFMEY0RjU0MkZCNDJDOEQyQThBMzIwRUREMDIwQ0FDOTgKLToxMDExNjAwMDAxN0RDOTY2MEE0OTUxNkY5MjYwOEEzMzc1QTY1QjJDNkUKLToxMDExNzAwMEIwMTMwQUVENTEwRENEMDEwRDBENDEwQzBDNDE3REM5OEYKLToxMDExODAwMDQ5MkVCMDEyQjBFRTY1RTNDNkMwRDA4RTM3OENCODhBNTcKLToxMDExOTAwMDM2OEZCOTdDQTMwNzdBQzkwMjdFRkIwMUMwRDFDRUQ5QjQKLToxMDExQTAwMDg4MzUwQUFEMDIwRThFMDg3OEVCMDIyREFDMDE4OUI3QTYKLToxMDExQjAwMERBQzBBRjlCNzlCQjAxQjFDQURDQjBDMEIwN0RBMzA3NzgKLToxMDExQzAwMDdBRDkwMjdDRUIwMUMwQjE2NEIxNjFDMDkxMjkyNDY3NzYKLToxMDExRDAwMEMwMjBEMTBGMDAwMDhBREFCMUFBNjRBMEMwMkMyMDY3MTkKLToxMDExRTAwMDJEMjUwMjY1QzMxMTFERURGODhBMzIxRUVERkQwREFERjIKLToxMDExRjAwMDAxMEVERDBDNjVEMjhBMEE0RTUxNkZFMjAyNjAwMjgxNTcKLToxMDEyMDAwMEMwOTAyOTI0NjcwOTBGNDc2NUYyRjgyODIyMUQ3Qjg5QzEKLToxMDEyMTAwMDAyMkIwQTAwNjRCQ0E4MkNCMDA3MjhCMDAwREEyMDA2MTQKLToxMDEyMjAwMDg4MEEyODgyNENDMEQxMEI4MDAwREJBMDY1QUZFNzYzNDEKLToxMDEyMzAwMEZDOEQwMDAwMENFOTUwNjQ5MkVEMENFRjExQzA4MDI4ODkKLToxMDEyNDAwMDE2MTFBRkJGMkYxNjE5OEVGODhCRjdEQUUwOEZGOTJCMzYKLToxMDEyNTAwMDE2MTBBQkZCN0ZCQjAxQjFFQTBDQTg1MDY1ODBENjg4QTUKLToxMDEyNjAwMDM3RENFMEFGODk5OTFDNzg5QjAyMkNFQzAxMkMxNjFCMTMKLToxMDEyNzAwMDI5MTIwQzJDMEEwMDI5MTYxQTdBRTMwNzdBRTkwMjdGNTAKLToxMDEyODAwMEJCMDFDMEMxNjVDMkE1OEIzNTJDMEEwMDJBMEEwMDdBQjEKLToxMDEyOTAwMEUzMDU2NEUxQ0EyQzBBMDE2NENFMEQ2MDAyOEU4ODM0MzUKLToxMDEyQTAwMDFCRURDRjk4REE4RjMzMUVFREM4MEY0RjU0MkZENDJDN0YKLToxMDEyQjAwMDhDMkE4QTMyMEVDQzAyMEJBQjAxMENCQjBDNjVCRjBBMjgKLToxMDEyQzAwMDBBNDk1MTZFOTIwMjYzRkYwMThBMzMwQUFCNTA2NEJFMzEKLToxMDEyRDAwMEY5MkNEMDEzMEFFRTUxMEVDRTAxMEUwRTQxMEMwQzQxMkEKLToxMDEyRTAwMDBFQ0MwQzY1Q0VFNDJGRDAxMkIwRkY2NUYyNkVDMEIwMEMKLToxMDEyRjAwMDhFMzc4Q0Q4OEEzNjJGRDIwOTdDQTMwNzdBQzkwMjdFMTIKLToxMDEzMDAwMEZCMDFDMEIxNjVCRUMzODgzNURCQTBBRThFNzhFQjAxQjIKLToxMDEzMTAwMEIxQUI4OUQ3REFDMEFGOUQ3OURCMDFCMUNBQzBDMDdCNjAKLToxMDEzMjAwMEEzMDc3QUI5MDI3REVCMDFDMEMxNjVDRTlEQzA5MDI5QUIKLToxMDEzMzAwMDI0NjdDMDIwRDEwRjg4Mzc4QzM2OTgxNDBDRTkwQzI5MEIKLToxMDEzNDAwMDE2MTQwOEY4MEM5ODFENzhGQjA3MjgxMjE0QjA4ODI4OEEKLToxMDEzNTAwMDE2MTQ4OTFEOUYxNTlCMTZDMEYwMkIxMjE0MjkxNjFBRkUKLToxMDEzNjAwMDJCMTYxQjhCMTQ3QUUzMEI3QUU5MDY4ODE1OEUxNjc4RjgKLToxMDEzNzAwMEVCMDFDMEYxNjVGMUJBMjkxMjFBMkYxMjExOEEzNTJFMkMKLToxMDEzODAwMDEyMUI5QTFBQUZFRTJGMTIxMEMwQTBBRjlGNzlGQjAxNkIKLToxMDEzOTAwMEIxRUU5RjExODgxQUMwRjA5ODEwN0FFMzBBN0VBOTA1NzEKLToxMDEzQTAwMDJBMTIwMTdBOEIwMUMwRjE2NEYwODE2MDAxODM4OTM2RDEKLToxMDEzQjAwMDhCMzc5OTE3MEJFODBDOTgxRjA5QzkwQzI5MTYxNTc4NUIKLToxMDEzQzAwMEVCMDcyODEyMTVCMDg4MjgxNjE1RDlDMDlBMTk5RTE4NEYKLToxMDEzRDAwMDhBMUYyRTEyMTUyQTE2MUEyRTE2MUJEQUMwQzBFMDhDOTAKLToxMDEzRTAwMDE3N0Y5MzBCN0ZBOTA2ODgxODhGMTk3OEZCMDFDMEUxM0UKLToxMDEzRjAwMDY1RTEzRTI5MTIxQTJGMTIxMzhBMzUyRTEyMUI5QTFCRjEKLToxMDE0MDAwMEFGRUUyRjEyMTJDMEEwQUY5Rjc5RkIwMUIxRUU5RjEzNzgKLToxMDE0MTAwMDg4MUJDMEYwOTgxMjdBRTMwQTdFQTkwNTJBMTIwMzdBODMKLToxMDE0MjAwMDhCMDFDMEYxNjVGMTBBMkUxMjE2MkUxNjE5MkExMjFCMTUKLToxMDE0MzAwMDAwNTEwNEMwRTEwMEVFMUFCMEVFMkUxNjE3MEVGRjEzOTUKLToxMDE0NDAwMDJGMTYxODBGQ0MwMUFDQUEyRjEyMUEwRUJDMDFBQ0ZDM0YKLToxMDE0NTAwMDdGQ0IwMUIxQUEyQTE2MUIyQzE2MUE2M0ZDNUUwMDAwNzIKLToxMDE0NjAwMDdGQjMwMjYzRkUzMTYzRkUyQjdFQjMwMjYzRkMzMDYzMDUKLToxMDE0NzAwMEZDMkEwMDAwNjQ1MEMwREEyMERCQzA1ODE2NDhDMDIwQTcKLToxMDE0ODAwMEQxMEZDMDkxNjNGRDdBMDBDMDkxNjNGQTQ0REEyMERCOEEKLToxMDE0OTAwMDcwQzBEMTJFMEE4MEMwOUEyOTI0NjgyQzcwMDc1ODE1NzQKLToxMDE0QTAwMDM4RDJBMEQxMEYwMzQ3MEIxOEVENEZEQjcwQTgyODc4NzYKLToxMDE0QjAwMDczMDIyQjdERjhEOUIwNjNGQTYxMDAwMDJBMkM3NERCMkIKLToxMDE0QzAwMDQwNTgwRUIzNjNGQUU0MDAwMDI5MjIxRDJEMjUwMjdCNEIKLToxMDE0RDAwMDk5MDFDMEIwQzlCNjJDQjAwNzI4QjAwMERBMjAwNjg4NDAKLToxMDE0RTAwMDBBMjg4MjRDQzBEMTBCODAwMERCQTA2NUFGRTdDMDIwOEEKLToxMDE0RjAwMEQxMEZDMDkxNjNGQkZGMDAwMjJBMDI1ODAyNDQwQUEyRTYKLToxMDE1MDAwMDAyMDYwMDAwMDIyQTAyNTgwMjQxMEFBMjAyMDYwMDAwNTYKLToxMDE1MTAwMERCNzBEQTIwQzBEMTJFMEE4MEMwOUUyOTI0NjgyQzcwOEUKLToxMDE1MjAwMDA3NTgxNTE3QzAyMEQxMEZDMDk0NjNGQkM5QzA5NjYzM0MKLToxMDE1MzAwMEZCQzRDMDk2NjNGQkJGMDAyQTJDNzREQjMwREM0MDVCMkQKLToxMDE1NDAwMEZFMTFEQkEwQzJBMDJBQjQwMDJDMjAwQzYzRkYyNzAwRjAKLToxMDE1NTAwMDhEMzU4Q0I3N0RDQjAyNjNGREQyNjNGQzZEOEYzNThFRUMKLToxMDE1NjAwMEQ3N0ZFQjAyNjNGREM1NjNGQzYwMDAwMDZDMTAwNEMwMTQKLToxMDE1NzAwMDIwRDEwRjAwNkMxMDA0QzAyMEQxMEYwMDZDMTAwNDJCODAKLToxMDE1ODAwMDIyMUUyODIyMURDMEEwQzA5NDI5MjQwNjJBMjUwMjdCRTEKLToxMDE1OTAwMDg5MDFEQkEwQzlCOTEzRUQwNkRBMjAyOEIwMDAyQ0IwMTAKLToxMDE1QTAwMDA3MDM4ODBBMjg4MjRDQzBEMTBCODAwMERCQTA2NUFGRkUKLToxMDE1QjAwMEU3QzAyMEQxMEYwMDAwMDA2QzEwMDQyQzIwMDYyQTIxNjcKLToxMDE1QzAwMDAyNjhDODA1MjhDQ0Y5NjU4MTJFMEEwOTRDNjU5MTA0OEEKLToxMDE1RDAwMDhGMzBDMUI4MEY4RjE0N0ZCMDA1MjgyMTIzNjU4MTI3NzQKLToxMDE1RTAwMDE2RUNGNTI5NjI5RTZGOTgwMjYwMDBGODE5RUNGMTI5NUIKLToxMDE1RjAwMDkyMjY2ODkwMDc4QTIwMDlBQTBDNjVBMEU3MkE2MjlEQjYKLToxMDE2MDAwMDY0QTBFMTJCMjAwQzBDQjkxMUE2OTkyRDkyODY2RkQ5RkMKLToxMDE2MTAwMDAyNjAwMERCMURFQ0U5MERCRDBBMkREMkEzNjhEMDA3RTYKLToxMDE2MjAwMDhFMjAwREVFMEM2NUUwQzcyNzkyODVDMEUwNjQ3MEJGODgKLToxMDE2MzAwMDFERUNFRTY4NDM0RTFDRUNFRDhBMkIwQ0FBMDI5QTcwNEUKLToxMDE2NDAwMDg5MjAwODk5MTEwRDk5MDI5OTcxODgyQTk4NzQ4RjMyMEUKLToxMDE2NTAwMDlGNzUyODIxMDQwODg4MTE5ODc3MThFQ0RFMENCRjExQkIKLToxMDE2NjAwMEE2RkYyREYyODVBOEI4MkU4NENGMkREQzI4MkRGNjg1NzcKLToxMDE2NzAwMEM4NUEyQTJDNzREQjQwNTgwRTQ2RDJBMEQxMEZDMDIwODUKLToxMDE2ODAwMEQxMEYwMDAwMDAyOUNDRjk2NDkwQjEyQzIwNjY4OTMxN0IKLToxMDE2OTAwMEIxQ0MwQzBDNDcyQzI0NjY2RUM2MDI2MDAwODUwOUY4OUMKLToxMDE2QTAwMDUwNjU4MDdGMUNFQ0QzOEEyQjBGMDg0MDBCODgxMDA4RjQKLToxMDE2QjAwMEFBMDIwQ0FBMDI5QTcwODkyMDA4OTkxMTBEOTkwMjk5MjAKLToxMDE2QzAwMDcxODgzMzk4NzM4QzMyOUM3MjhBMkE5QTc0ODkzNDk5RkYKLToxMDE2RDAwMDc1NjNGRjdEMDBDQzU3REEyMERCMzBEQzQwNTgxNTFERTgKLToxMDE2RTAwMEMwMjBEMTBGMDBEQTIwQzBCNjU4MTVBQzYzRkZFNTAwNkEKLToxMDE2RjAwMERBMjA1ODE1QUE2M0ZGREMwMERBMjBEQjMwREM0MEREOUQKLToxMDE3MDAwMDUwNTgxNjM4RDJBMEQxMEZDODU4REEyMERCMzA1ODE0MDAKLToxMDE3MTAwMDhBMkEyMTAyNjVBRkJEQzA5NDA5QTkwMjI5MjUwMjYzNjYKLToxMDE3MjAwMEZGQjIwMDAwMkIyMTA0NTgxNDM1MURFQ0FGQzBFMDJFOTEKLToxMDE3MzAwMDI0NjY4RjMwMkIyMDBDMEY4RjE0NjNGRjY2MjkyMTM4MEQKLToxMDE3NDAwMEMwODg3OTgzMDI2M0ZGNUIyQzIwNjYyQjIxMDRCMUNDMTcKLToxMDE3NTAwMDBDMEM0NzJDMjQ2NjU4MTQyOTFERUNBM0MwRTAyRTI0NDEKLToxMDE3NjAwMDY2OEYzMDJCMjAwQzBGOEYxNDYzRkYzNzZDMTAwNEMwNzIKLToxMDE3NzAwMEI3QzBBMTE2RUNBMDE1RUM5MkQ3MjBEODQwQjgyMkMwNzMKLToxMDE3ODAwMDQwMDUzNTAyOTY3MTk1NzAwMkE0MzgwNDA0NDJDOTRCOTUKLToxMDE3OTAwMDFBRUM4NTE5RUM4NjI5QTY3RUMxNDBEMzBGNkQ0QTA1NDcKLToxMDE3QTAwMDAwODA4ODAwMjA4QzIyMEE4OEEyNzJEMTBGQzA1MDA4QzUKLToxMDE3QjAwMEE1Mzg3NUIwRTM2M0ZGRDc2QzEwMDY5MzEzOTQxMTI5MTUKLToxMDE3QzAwMDIwMDY2NTUyODhDMDcxNjg5ODA1MkE5Q0Y5NjVBMjk4MjAKLToxMDE3RDAwMDE2RUM3OTI5MjEwMjhBMTMwOTA5NEM2NTkwQ0Q4QUEwNUIKLToxMDE3RTAwMDBBNkE1MTJBQUNGRDY1QTBDMkNDNUZEQjMwREEyMDhDREUKLToxMDE3RjAwMDExNTgxNEQ4QzA1MTlBMTNDN0JGOUJBOThFMTMyRUUyNUIKLToxMDE4MDAwMDA5NjhFMDYwMkY2MjlFMURFQzZBNkZGODAyNjAwMDg0MzgKLToxMDE4MTAwMDJERDIyNjY4RDAwNTJGMjIwMDdERjk3ODJDNjI5REM3MzUKLToxMDE4MjAwMDkwNjRDMDcwOUMxMDhBMTMyQjIwMEMyQUEwMjAwQ0JENDEKLToxMDE4MzAwMDExQTZERDBBNEYxNEJGQTgwOTg4MDEyOUQyODZBRjg4RjYKLToxMDE4NDAwMDI4OEMwOTc5OEI1OTFGRUM1QzBGQkYwQTJGRjJBMzY4MTMKLToxMDE4NTAwMEYwMDUyODIyMDA3Rjg5NDcyOUQyODVENDkwNjU5MDc1QUMKLToxMDE4NjAwMDYwMDA0MzAwMDAyQjIwMEMxRkVDNTQwQ0JEMTFBNkREQzIKLToxMDE4NzAwMDI5RDI4NjBGQkYwQTZFOTYxMDJGRjJBMzY4RjAwNDg4NTMKLToxMDE4ODAwMDIwN0Y4OTA1MjlEMjg1NjU5MTY1REEyMDU4MTU0M0M5REQKLToxMDE4OTAwMDVDNjAwMUZGMDBEQTIwQzBCNjU4MTU0MDYwMDAwQzAwMDMKLToxMDE4QTAwMEMwOTA2M0ZGQjUwMDAwREEyMDU4MTUzQzY1NTFFNDhEMDcKLToxMDE4QjAwMDEzOEMxMURCRDA4REQwMDIyQTAyMEQ2RDUxNTgxM0FENUYKLToxMDE4QzAwMDlBMTM2NEExQ0VDNzVGOEZBMTk1QTlDMDUxMEYwRjQ3OEUKLToxMDE4RDAwMDlGMTE2M0ZFRkQwMEMwOTFDMEYxMjgyMDA2MkMyMDY2RjgKLToxMDE4RTAwMDI4OENGOUE3Q0MwQzBDNDcyQzI0NjY2RkM2MDk4RDEzRTUKLToxMDE4RjAwMDhERDE3MERFMDIyOTBBMDAwOTlEMDI2NDgxNTlDOUQzODUKLToxMDE5MDAwMDhBMTAyQjIxMDQ1ODEzQkQ4QTEzQzBCMDJCMjQ2NjJFRDUKLToxMDE5MTAwMEEyMDkyQUEwMjAwRTI4MTQxQ0VDMzM4RDEzMTVFQzI3RTUKLToxMDE5MjAwMEMxNzAwQTc3MzY4NTU2MkREQzI4QUMyQzlDMTJERUQwOEYKLToxMDE5MzAwMEE4NTU3Q0QzMDIyRURERjhEM0UwREE0MDA1NUIwMkRDNEIKLToxMDE5NDAwMDMwNUJGRjhBRDRBMDI4MjAwQ0I0NTVDMEQwMkIwQTg4NjUKLToxMDE5NTAwMDJGMEE4MDBDOEMxMUE2Q0MyOUMyODVBRjNGQUI5OTI5RTgKLToxMDE5NjAwMEM2ODUxQ0VDMUNERUYwQUM4ODJEODRDRjI4MTIwMjI5MjEKLToxMDE5NzAwMDEyMDM3OEYzMDIyRUZERjgyODkwMjBEM0UwMDc4ODBDOUMKLToxMDE5ODAwMEMxNzAwODA4NDcyODk0MjAwODc3MzY2NTdGQUI4OTEzMTMKLToxMDE5OTAwMDEzRUMxQTg5OTBDMEY0Nzc5NzQ5MUJFQzE4QzFDQTI4MzgKLToxMDE5QTAwMDIxMDQ4NTEzMDk5RTQwMDZFRTExODc1MzA0ODgxMTg1OTIKLToxMDE5QjAwMDUyMEU4ODAyMEM4ODAyOUJBMDlGQTE4RjJCOURBNTk4OTgKLToxMDE5QzAwMEE0OTdBNzk1QTYwM0ZGMDI5RkEyMkMyMDBDMUVFQzAxNTIKLToxMDE5RDAwMEFFQ0UwQ0NDMTEwNkNDMDgyQkMyODUyREU0Q0YyQkJDOEYKLToxMDE5RTAwMDIwMkJDNjg1MkEyQzc0OEIxMTU4MEQ2OUQyQTBEMTBGREIKLToxMDE5RjAwMDI4MjAzREMwRTA3Qzg3N0YyRTI0NjcwRTBBNDc2NUEwMjMKLToxMDFBMDAwMDdCMUFFQkZGODgyMDFFRUJFRDhGMTM4RUU0OEZGNDA4MUEKLToxMDFBMTAwMDg4MTEwQTg4MDIwRjhGMTRBRkVFMUZFQkZBOTg5MTBGMEUKLToxMDFBMjAwMEVFMDI5RTkwMUVFQkY5QzA4MDFBRUJFQTJDRDI4NUFBM0EKLToxMDFBMzAwMEJBQjhDQzI4QTRDRjJDRDY4NTJDMjEwMjJGMjA3MjBFMjgKLToxMDFBNDAwMENDMDJCMUZGMkYyNDcyMkMyNTAyQzAyMEQxMEY4NzEzQTYKLToxMDFBNTAwMDg3NzAwNzA3NDc2M0ZENkUyODIxMzhDMDk5Nzk4QjAyOEMKLToxMDFBNjAwMDYzRkU5QURERjA2M0ZFOTUwMERBMjBEQjMwOEMxMUREMzkKLToxMDFBNzAwMDUwNTgxNTVDRDJBMEQxMEZDMEUxNjNGRjdBOEIxMzhDNTQKLToxMDFBODAwMDExREQ1MEMwQUEyRTBBODAyQTI0NjhEQTIwNTgxM0JDMUYKLToxMDFBOTAwMEQyQTBEMTBGQzAyMEQxMEY2QzEwMDYyOTIxMDJDMEQwRDYKLToxMDFBQTAwMDc1OTcxMDJBMzIwNDdGQTcwQThCMzU3RkJGMDUyRDI1MzUKLToxMDFBQjAwMDAyMEREOTAyMDkwQzRDNjVDMTgyMTZFQkJFMUVFQkJDQUYKLToxMDFBQzAwMDI4NjI5RUMwRkE3OEYzMDI2MDAxODgyOUUyMjY2ODkwQjUKLToxMDFBRDAwMDA3OEEyMDA5QUEwQzY1QTE3QTJBNjI5RERGQTA2NEExNjkKLToxMDFBRTAwMDc3MkIyMDBDMENCQzExQTZDQzI5QzI4NkMwOEM3OTgzMjQKLToxMDFBRjAwMDAyNjAwMTU3MTlFQkIxMDlCOTBBMjk5MkEzNjg5MDA3NEUKLToxMDFCMDAwMDg4MjAwOTg4MEM2NTgxNDMyN0MyODUxQ0VCQjM2NDcxNkEKLToxMDFCMTAwMDNBODkzMTA5OEIxNDBDQkIwMTZGQjExRDJDMjA2NjlGRDMKLToxMDFCMjAwMDEwQjFDQzBDMEM0NzJDMjQ2NjZFQzYwMjYwMDE0MDA5MzMKLToxMDFCMzAwMEZGNTA2NUYxM0E4QTEwMkFBQzE4ODkzNEMwQzQ3Rjk3RTcKLToxMDFCNDAwMDNDMThFQkIzMUJFQkIyOEYzNTlDNzE5QjcwOEIyMDlEQzcKLToxMDFCNTAwMDc0MDhCQjAyOUI3MkMwODI5ODc1MUJFQkFFMEYwODQwRTUKLToxMDFCNjAwMDlCNzMwRjg4MTE5ODc3N0ZGNzBCMkYyMTAyMjg0QTAwNkIKLToxMDFCNzAwMDA4RkYwMjJGMjUwMkMwQjQ2MDAwMDQwMDAwMDBDMEIwQkUKLToxMDFCODAwMDdFOTcwNDhGMzYyRjI1MjI3RDk3MDQ4ODM3MjgyNTIxQkMKLToxMDFCOTAwMDdDOTczNkMwRjFDMDkwMEFGOTM4MkYzQzIwMDkwOTQyRTEKLToxMDFCQTAwMDY0OTA4NjE5RUI4MDE4RUI4MTI4OTY3RTAwRjA4ODAwRkYKLToxMDFCQjAwMEEwOEMwMEYwODgwMEEwOEMwMEYwODgwMEEwOEMyQTYyMjUKLToxMDFCQzAwMDlEMkRFNEEyMkFBQzE4MkE2NjlEODkzMDc3OTczODhGMUMKLToxMDFCRDAwMDMzOEEzMjE4RUI4QTA3QkUwQjJDMjEwNEI0QkIwNENDMjkKLToxMDFCRTAwMDExOThFMEMwODQ5OEUxODgyQjlERTU5QUU2OUZFNzFBNUEKLToxMDFCRjAwMEVCODIwOTlGNDAwNkZGMTEwRkNDMDIwQTg4MDI5OEUyOEYKLToxMDFDMDAwMEMxRkMwRkNDMDIyQ0U2MDRDOUI4MkMyMDBDMUVFQjcxRDEKLToxMDFDMTAwMDBDQ0ExMUFFQ0MwNkFBMDgyOUEyODUyREM0Q0YwOUI5RDkKLToxMDFDMjAwMDBCMjlBNjg1Q0Y1Q0MwMjBEMTBGQzA4MUMwOTAwRjg5NDEKLToxMDFDMzAwMDM4QzA4Nzc5ODgwMjYzRkY3MjYzRkY2NjAwQ0M1N0RBODkKLToxMDFDNDAwMDIwREIzMERDNDA1ODEzQzNDMDIwRDEwRkRBMjA1ODE0RjkKLToxMDFDNTAwMDUzNjNGRkU4QzBBMDYzRkU4MkRBMjBDMEI2NTgxNDRGNzkKLToxMDFDNjAwMDYzRkZEOTAwREI0MDJBMkM3NDU4MENDOUQyQTBEMTBGRDUKLToxMDFDNzAwMDhBMTAyQjIxMDQ1ODEyRTExRUVCNEVDMEQwMkQyNDY2OTEKLToxMDFDODAwMDYzRkVCMTAwNkMxMDA2RDYyMDE5RUI0OTFFRUI0QjI4MDEKLToxMDFDOTAwMDYxMDIxN0VCNDgwODA4NEM2NTgwNUY4QTMwMEE2QTUxNzgKLToxMDFDQTAwMDY5QTM1NzJCNzI5RTZFQjgzRjJBOTIyNjY4QTAwNDhDQjcKLToxMDFDQjAwMDYwN0FDOTM0MkE3MjlEMkM0Q0ZFQ0FBQjJCNjAwQ0I2REMKLToxMDFDQzAwMDRGMENCRDExQTdERDI4RDI4NjBFQkUwQTc4RkIyNjlDREMKLToxMDFDRDAwMDExMkVFMkEzMkMxNjAwNjhFMDA1MkY2MjAwN0VGOTE1OTQKLToxMDFDRTAwMDIyRDI4NUNGMjU2MDAwMEQwMERBNjBDMEI2NTgxNDJCRDMKLToxMDFDRjAwMEM4NUE2MDAxMEYwMERBNjA1ODE0Mjg2NTUxMDZEQzQwQUMKLToxMDFEMDAwMERCMzA4RDMwREE2MDBENkQ1MTU4MTI5QUQzQTA2NEEwOEIKLToxMDFEMTAwMEYzODRBMUMwNTEwNDA0NDc2M0ZGNkQwMEMwQjAyQzYwODAKLToxMDFEMjAwMDY2ODkzMUIxQ0MwQzBDNDcyQzY0NjY2RkM2MDI3MDk2ODQKLToxMDFEMzAwMDBBMkI2MTA0NTgxMkIxQzBCMDJCNjQ2NjY1NTBCNDJBRjYKLToxMDFENDAwMDNDMTBDMEU3REMyMEMwRDFDMEYwMDJERjM4MEYwRjQyRUEKLToxMDFENTAwMDY0RjA5MDE5RUIxNDE4RUIxNTI4OTY3RThEMTA2RERBNEYKLToxMDFENjAwMDA1MDBBMDg4MDBDMDhDQzBBMDg5MzAxREVCMjQ3Nzk3QTcKLToxMDFENzAwMDUzODgzMjhDMTA4RjMzMDJDRTBCQzAyNDkyRTEyMjYxNDMKLToxMDFEODAwMDA0OURFMDA0MjIxMThENkI5QkU1OUZFNzk4RTYxRkVCMTUKLToxMDFEOTAwMDFBMDk5ODQwMDY4ODExMDgyMjAyMEZERDAyQzE4RDlEQTQKLToxMDFEQTAwMEUyMDgyMjAyOTJFNEI0QzIyRTYwMEMxRkVCMEEwQ0U4OTcKLToxMDFEQjAwMDExQTc4ODJDODI4NUFGRUUwQzIyMEIyQkU0Q0YyMjg2NTQKLToxMDFEQzAwMDg1RDJBMEQxMEYyODYwMENEMkEwOEMxMTE5RUIwMjBDODcKLToxMDFERDAwMDhEMTFBOTg4QTdERDJFRDI4NTJCODRDRjBFQ0MwQjJDOUMKLToxMDFERTAwMEQ2ODVEMTBGQzBGMDBBREYzODdGRTgwMjYzRkY2QzYzNEQKLToxMDFERjAwMEZGNjAwMDAwMkE2Qzc0QzBCMkRDMjBERDQwNTgxMjhGRjYKLToxMDFFMDAwMEMwQjA2M0ZGNjNDMDIwRDEwRjAwMDAwMDZDMTAwNDJDMzEKLToxMDFFMTAwMDIyMUQyQTIyMUVDMDQ5RDMyMDI5MzAwNjI0MzQ2OEMwM0UKLToxMDFFMjAwMDQwN0FDMTA1RERBMDYwMDAwMjAwQzBEMDZFOTczOEMwQzYKLToxMDFFMzAwMDhGMkUwQTgwMkIzMDE0QzA5NjI5MzQwNjBFQkIwMjJFM0EKLToxMDFFNDAwMDMxMDIyQjM0MTQ3RTgwMDQyNDM1MDJERTQwN0FDMTBFMjgKLToxMDFFNTAwMEM4QUJEQkQwREEzMDJDMEEwMDU4MEFFNTJFMzEwMjBFNkUKLToxMDFFNjAwMDBGNENDOEZFQzAyMEQxMEY2ODk1RjgyODMxMDIwODA4MzEKLToxMDFFNzAwMDRDNjU4RkVGMUFFQUQwMUNFQUNFMkJBMjlFQzA5QTdCNEIKLToxMDFFODAwMDlCNDYyQkMyMjY2OEIwMDQ4RDMwN0JEOTNCMjlBMjlEOEUKLToxMDFFOTAwMEMwRTNDQjkzOTQ5MDFCRUFFMDJEMzEwNDlCOTYwOEREQzAKLToxMDFFQTAwMDExMEVERDAyOUQ5NzlEOTExMkVBRERDMEU1MjRDNEEyQ0EKLToxMDFFQjAwMDJFMzQwNjJGMzEwMjI4QTI5RDAyRkYwMjI4OEMzMDI4RTIKLToxMDFFQzAwMEE2OUQyRjM1MDJDMDIwRDEwRkRBMzBDMEI2NTgxM0IzMEIKLToxMDFFRDAwMEMwMjBEMTBGNkMxMDA2MjkyMDA2Njg5ODA1Mjg5Q0Y5QUYKLToxMDFFRTAwMDY1ODI1RDI5MjEwMjA5MDk0QzY1OTIxMENENTFEQjMwRDQKLToxMDFFRjAwMERBMjAwNDRDMDI1ODEzMTdDMDUxRDNBMEM3QUYyQTM2QkEKLToxMDFGMDAwMDBBQzBFMDE5RUFBRDFERUFCMzFGRUFBQzhBM0ExNkVBNDQKLToxMDFGMTAwMEE5QjFBQzY0QzEzNTI4NjI5RTZGODgwMjYwMDFGMTI5QzUKLToxMDFGMjAwMERDMzMyOTkyMjY2ODkwMDc4QjIwMDlCQjBDNjVCMUUwNTEKLToxMDFGMzAwMDI3NjI5REMwOEU2NDcxRDgyQjIwMEMwQ0JDMTFBNkNDREUKLToxMDFGNDAwMDI5QzI4Njc5ODMwMjYwMDFEMjE5RUE5QjA5QjkwQTI5NUMKLToxMDFGNTAwMDkyQTM5NzEwNjg5MDA4MjgyMjAwMDk4ODBDNjU4MUJCMUQKLToxMDFGNjAwMDI3QzI4NTY0NzFCNTI5MjAwNjI5OUNGOTY0OTFFQzJDNUYKLToxMDFGNzAwMDIwNjY4OTMxQjFDQzBDMEM0NzJDMjQ2NjZFQzYwMjYwRjkKLToxMDFGODAwMDAxQTEwOUY4NTA2NTgxOUI4ODM2ODlGNDA4OEMxNEFDNEUKLToxMDFGOTAwMDk5MUNFQThCMEM5OTAyMkMyMTA0OTk3MDE5RUFBMTA4NkEKLToxMDFGQTAwMDA4NDc5OTcxODkyQTA5ODgxMDA4OTkwMjE4RUE5RTA4MzkKLToxMDFGQjAwMDk5MDI5OTcyMjgzMDEzMjkzMDEyMDQ4ODEwMDY5OTEwNUEKLToxMDFGQzAwMDA4OTkwMjI4MzAyQzlBNzQwQzg4MTAwOEM4MDIwOTg4RDUKLToxMDFGRDAwMDAyOTg3Mzg5Mzc5OTc1ODgzODk4NzY4QTM5QzA4MTlBQkEKLToxMDFGRTAwMDc3MUFFQTkxODkzNTk4N0I5OTc4MDk4OTE0MEE5OTAyQjgKLToxMDFGRjAwMDk5N0E4QTMwODkzMjc3QTczNjE4RUE4MDhGMzM5ODdDQUQKLToxMDIwMDAwMEMwODQ5ODdEODgyQjJFNzYxMTI5NzYxMjJGNzYxMzE5OEQKLToxMDIwMTAwMEVBN0EwQTlGNDAwNkZGMTEwNENBMTEwOTg4MDIwRkFBMzIKLToxMDIwMjAwMDAyOTg3RUMxRjkwRkFBMDIyQTc2MTBDMEFBNjAwMDAxQTgKLToxMDIwMzAwMEMwQTZBREJGMENCQzExQTZDQzI5QzI4NTJFRjRDRjA5MTkKLToxMDIwNDAwMEE5MEIyOUM2ODU2NTUxMDdDMDIwRDEwRjJCMjAwQzBDODgKLToxMDIwNTAwMEJDMTEwNkNDMDgyOEMyODYwOUI5MEE2Rjg5MDI2MDAxNDIKLToxMDIwNjAwMDJFMjk5MkEzNjg5MDA4MkEyMjAwMDlBQTBDNjVBMTFGQjQKLToxMDIwNzAwMDJBQzI4NTY0QTExOTI4MjAzRDA4Mjg0MDY0ODA4Qzg0RTgKLToxMDIwODAwMDM1MDQ4NDE0NjQ0MDg0ODVGNTc0NTM3Rjg0MzYwNDg0NTUKLToxMDIwOTAwMDE0NjQ0MDc3NzQ1Mzc0MjkzMDEzQzA4Qzc5ODg2Q0MwRjEKLToxMDIwQTAwMDkwMjkyNDY3MDkwODQ3NjU4MEVEODgyMDg5RjQ4NDM1RTQKLToxMDIwQjAwMDFGRUE1NTA0ODQxNEE0OTQwRjQ0MDI5NEEwMTRFQTUwMTcKLToxMDIwQzAwMDA4ODgxMTA0ODgwMjk4QTE4NDM2OThBMzA0ODQxNEE0NzMKLToxMDIwRDAwMDk5MEY5OTAyOTlBMjE5RUE0Q0FEQjQyOEMyODUyRTQ0RjEKLToxMDIwRTAwMENGMjg4QzEwMjhDNjg1MjgyMTAyMkYyMDcyMDk4ODAyNEIKLToxMDIwRjAwMEIyRkYyRjI0NzIyODI1MDJDMDIwRDEwRjAwQ0M1N0RBNUUKLToxMDIxMDAwMDIwREIzMERDNDA1ODEyOTNDMDIwRDEwRkMwOTE2M0ZGMTgKLToxMDIxMTAwMDhGREEyMEMwQjY1ODEzMjE2M0ZGRTEwMERBMjA1ODEzOEMKLToxMDIxMjAwMDFGNjNGRkQ4OEExMDJCMjEwNDU4MTFCNDFERUEyQTFGRkYKLToxMDIxMzAwMEVBMjMyQjIwMENDMEUwMkUyNDY2OEEzQTYzRkU0ODAwNzYKLToxMDIxNDAwMDAwREEyMERCMzBEQzQwREQ1MDU4MTNBNkQyQTBEMTBGREUKLToxMDIxNTAwMDJBMkM3NERCNDA1ODBCOEVEMkEwRDEwRjI5MjEzOEMwMTUKLToxMDIxNjAwMDg4Nzk4MzAyNjNGRTIwMkExMjAwMkMyMDY2MkIyMTA0MkEKLToxMDIxNzAwMDJDQ0MwMTBDMEM0NzJDMjQ2NjU4MTFBMDFERUExNjFGMEMKLToxMDIxODAwMEVBMEYyQjIwMENDMEUwMkUyNDY2OEEzQTYzRkRGODAwOEIKLToxMDIxOTAwMERBMjA1ODEzMDI2M0ZGNjREQTIwNUJGRjFDRDJBMEQxNUYKLToxMDIxQTAwMDBGMDAwMDAwNkMxMDA4OTUxNUMwNjFDMUIwRDk0MDJBMUQKLToxMDIxQjAwMDIwM0RDMDQwMEJBQTAxMEE2NDM4MkEyMDA2MjkxNjA2RDEKLToxMDIxQzAwMDY4QTgwNTJDQUNGOTY1QzMzQjFERTlGQzY0NDAwNTJGRUMKLToxMDIxRDAwMDEyMDU2NEYyOUMyNjIxMDIxRUU5RjgwNjA2NEM2NTYyOEYKLToxMDIxRTAwMEUzMTVFOUY0NjQ0MEQ5OEEzNTI5MzAwMzlBMTQwQTk5MzEKLToxMDIxRjAwMDBDNjQ5MENDMkMyMDBDOEIxNDlDMTEwQ0NDMTFBNUNDMTUKLToxMDIyMDAwMDlDMTIyQ0MyODZCNEJCN0NCMzAyNjAwMkQzOEYxMTBFMjkKLToxMDIyMTAwMEZFMEEyRUUyQTM2OEUwMDk4NjIwRDMwRjBFNjYwQzY1NDUKLToxMDIyMjAwMDYyQkU4ODEyMjg4Mjg1NjQ4MkI2ODkxNDY0OTA1RURBNjAKLToxMDIyMzAwMDgwRDkzMDhDMjAxRUU5RjIxRkU5RjMxREU5RTA4QjE0RjAKLToxMDIyNDAwMDhERDRENEIwN0ZCNzE4Qjg4QTI5M0MxMDg1MzYwOEM2MUIKLToxMDIyNTAwMDExMEU2NjAyOTY4MTA1ODUxNEE1RDUwRjU1MDI5NTgwNEQKLToxMDIyNjAwMDA0MTgxNDZEODkyNzg4OTYwOENCMTEwODg4MTQwRUJCQjIKLToxMDIyNzAwMDAyQThEODI5OUMyMDBGODgwMjlCQTE5OEEwODg5MjlCMzUKLToxMDIyODAwMEEzMDg4ODE0QThEODBGODgwMjk4QTIyQUFDMTAxOUU5Q0MKLToxMDIyOTAwMERFQzBDMDhGMTQxRUU5Q0Y4NjEyOEQxMTI4NjI4NUFFNzQKLToxMDIyQTAwMEREMDhGRjBCMkNENENGMjgyMTAyMkY2Njg1OEIzNTJBMjEKLToxMDIyQjAwMDIwNzIwOTg4MDJBQkFBMjgyNTAyMkEyNDcyQzAyMEQxRTQKLToxMDIyQzAwMDBGMjk1MjlFMThFOUJCNkY5ODAyNjAwMjA4Mjg4MjI2RTcKLToxMDIyRDAwMDY4ODAwODI5MjIwMDA4OTkwQzY1OTFGOTJBNTI5REMxNEQKLToxMDIyRTAwMENBOUExMzY0QTFFRjJCMjAwQzI2MjAwNjBDQjgxMUE1NjYKLToxMDIyRjAwMDg4MkQ4Mjg2MEVCRTBBN0RDMzAyNjAwMjAyMkVFMkEzRjIKLToxMDIzMDAwMDY4RTAwODJGMjIwMDBFRkYwQzY1RjFGMzI4ODI4NURFQkQKLToxMDIzMTAwMDgwNjQ4MUZGOTgxMDI2NkNGOTY0NjFGRjJDMjA2Njg4MjgKLToxMDIzMjAwMDMxQjFDQzBDMEM0NzJDMjQ2NjZFQzYwMjYwMDFCQzA4OEYKLToxMDIzMzAwMEZENTA2NUQxQjYxN0U5QkQxOUU5QTIxQUU5QTkyQzIxMEEKLToxMDIzNDAwMDA0OEIyRDI4MzAxMDJGMjExRDBDODgxMDBCRkIwOTBDM0QKLToxMDIzNTAwMDg4MDIwQTg4MDIwOUJCMDI2NDQxNTI4OTEwQzA0RDlCNjEKLToxMDIzNjAwMDkwOTc5MTk4OTI4RDM1RDlFMDY0RDA2Q0Q3MzBEQkQwQkUKLToxMDIzNzAwMEQ4MzA3RkQ3MTMyNzNDMTBCQ0U5MjYzMjE2OEMzOTk2MEIKLToxMDIzODAwMEU2OUNFNzhBMzdCNDM4OUFFODBCMTMxNDY0MzA0OTJBN0MKLToxMDIzOTAwMDgyMTY4Njc5OUE5Njk2OTc4Qzc3OEE3RDlDOTgyQjgyNUUKLToxMDIzQTAwMDE3MkM3QzIwOUE5QTJBOUMxODlCOTk4NjdCQjAzQkI4NjQKLToxMDIzQjAwMDg5NkRCOTIxOEJDOTk2QTUyNjkyMTYyQUFDMThCODk5QjEKLToxMDIzQzAwMDlCQTE5NkEwOEJDNzg2Q0Q5QkEyMkI5MjE1OTZBNDlCMTIKLToxMDIzRDAwMEEzODZDQjJDQ0MyMDI2QTYwNUMwMzQ2QkQ0MjAwRDNCODUKLToxMDIzRTAwMDBDMEREODA5MEU4ODBBN0ZCNzA1QzA5MDk5ODhCQzg4NjMKLToxMDIzRjAwMEMwOTAwQjFBMTI2REFBMDY5OTg4OTk4QjI4OEMxOEMwNjgKLToxMDI0MDAwMEQwMUJFOThDMUNFOThCMTZFOTgxQjFGRjJBMjExQzIzMjIKLToxMDI0MTAwMEU2MTMwRjBGNEYyNkU2MTIyRjI1MUQ3RkE5MDZDMEYwRTkKLToxMDI0MjAwMEMwODAyODI1MUQwNUY2MTExQUU5N0E4RjIwMkJFNjE1QTQKLToxMDI0MzAwMDJDRTYxNjJERTYxNzI2RTYxODBBRkEwMjJBRTYxNDI5RDMKLToxMDI0NDAwMDIwMDYyOTlDRjk2NDkwRkYyOTIwMEM4RDE1QzA4MDFBNjQKLToxMDI0NTAwMEU5NjEwQzlDMTFBQTk5QTVDQ0RBMjAyQkMyODUyODk0OUQKLToxMDI0NjAwMENGMEI0QjBCMkJDNjg1QzBCMDhDMTY1ODExOEFEMkEwNEYKLToxMDI0NzAwMEQxMEY4QTM1NkZBNTQ4RDgzMDhCRDU2REE5MEM4QTg2QzcKLToxMDI0ODAwMDBBOEExNENCQTk3QUIzMzcyODhDMTBDMDgwMjgyNDY3MTUKLToxMDI0OTAwMDA4MEI0NzY1QjExMkRBMjBEQjMwMkMxMjA2NTgxMUFENUIKLToxMDI0QTAwMEQzQTBDMEMxQzBEMDJEQTQwMzlDMTU2M0ZEMjY4NjM2RTEKLToxMDI0QjAwMDY0NjEwQzg5MTBDMDREOUI5MDk3OTE5ODkyNjNGRUE0MjMKLToxMDI0QzAwMEMwODE2M0ZGQzc4QTE1Q0NBN0RBMjBEQjMwOEMxNjU4OTEKLToxMDI0RDAwMDExQTFDMDIwRDEwRkRBMjBDMEI2NTgxMjMwNjNGRkU0M0EKLToxMDI0RTAwMDAwREEyMDhCMTE1ODEyMkQ2M0ZGRDkwMDlFMTc4QTEzMzIKLToxMDI0RjAwMDJCMjEwNDU4MTBDMjhFMTdDMEIwMkIyNDY2NjNGRTM0MDMKLToxMDI1MDAwMEMwODA2M0ZFMDlEQTIwREIzMDhDMTZERDUwNTgxMkI1MkUKLToxMDI1MTAwMEQyQTBEMTBGREEyMDU4MTIyMTYzRkZBODJEMjEzOEMwOTQKLToxMDI1MjAwMEM4N0RDMzAyNjNGRTBEOEExMzJCMjEwNDJDMjA2Njk4RkMKLToxMDI1MzAwMDE3QjFDQzBDMEM0NzJDMjQ2NjU4MTBCMDhFMTdDMEQwQTUKLToxMDI1NDAwMDJEMjQ2NjYzRkRFRTAwMDAyNjIxMzhCMDY2MDYwNjRGOTYKLToxMDI1NTAwMDI2MjUzODY1NkVGMTI4MjA2QTdGODcwNTA4Mjk0MTY0QTEKLToxMDI1NjAwMDkwQTVDMEQwMUJFOTI2MTlFOTM0MjYyMDA3MjNFNjFCRDUKLToxMDI1NzAwMEIxNjYwOUZBMDIyQkU2MUEyODIwMEEyREU2MUQyQUU2ODIKLToxMDI1ODAwMDFFMDk4ODAyMjhFNjFDODgyNjA2MDY0NzI4RTYyMDJCMTYKLToxMDI1OTAwMDIyMDgyNkU1M0UyQkU2MjEyRDI0MDcyQzIwMDYyQTIwQTIKLToxMDI1QTAwMDY0NjhDMzQ3QjQ0NDYzRkU5RURCMzBEQTIwOEQxNUMwRjcKLToxMDI1QjAwMENFMkUwQTgwMkMyNDY4OEMxNjU4MTBGMUQyQTBEMTBGOTAKLToxMDI1QzAwMDhFMTAyQTMyMTYxNkU4RkQwQTJBMTQ4NjY2MkJFNjEyQTkKLToxMDI1RDAwMDk3RTEyN0U2MTMyOEU2MTRBQTY2MDk2NjAyOTZFMDJFMUMKLToxMDI1RTAwMEVDNDg2OUVENTBDMTQ2NjNGRDdBMDAwMDY0QUZCNDE5NTAKLToxMDI1RjAwMEU4RjMyODIwMTY4OTkyMEE4ODBDMDA5MTA0MDA4ODFBQjIKLToxMDI2MDAwMEE4Qjg5ODI5NjNGRjlDMDAyQjIxMDQ2RUI4MUUyQzIwQ0IKLToxMDI2MTAwMDY2QjhDQzBDMEM0NzJDMjQ2NkM5QzA5RTE3OEExMzU4ODgKLToxMDI2MjAwMDEwNzc4RTE3QzAzNDhGMjBDMEQwMkQyNDY2QzA2ODI2NDYKLToxMDI2MzAwMDI0MDY2M0ZGMkMwMDhEMzVDMDgwNjREMDRBRDlFMERDQ0QKLToxMDI2NDAwMDMwREJFMERGMzAxQUU4RkRCMTg4QjRGRjE3RThGRDg2MjMKLToxMDI2NTAwMEM5MjQ5REZGOERDODJDQ0MxMDJENDYzMDA3NjcwMTJENTUKLToxMDI2NjAwMDQ2MzIwQTY2MDExREU4RjcyNjQ2MzFBRDZEMkQ0NjMzMjgKLToxMDI2NzAwMDI2RjIxNTk3Qjc5NkI2ODRDM0JDQkI5NEI1OEQzNTI5QTEKLToxMDI2ODAwMDlDMTA3RDgzQzIyRjIxMURDMTQ2NjNGRDRCMDAwMDAwQkQKLToxMDI2OTAwMDZDMTAwNjI5MjAwNjI4OUNGODY1ODJCRjI5MjEwMjJCOTAKLToxMDI2QTAwMDIwMEMwOTA5NEM2NTkwRTExNkU4QzMwQ0JBMTFBNkFBRTIKLToxMDI2QjAwMDJEQTI4NjJDMEExMjdEQzMwMjYwMDI4QzE5RThCRjA5ODQKLToxMDI2QzAwMEI5MEEyOTkyQTM2ODkwMDc4QzIwMDlDQzBDNjVDMjc4QkUKLToxMDI2RDAwMDI5QTI4NTY0OTI3MjJENjI5RTFBRThCNTZGRDgwMjYwQjUKLToxMDI2RTAwMDAyNkUyQUEyMjYyOTE2MDE2OEEwMDgyQjIyMDAwQUJCMjYKLToxMDI2RjAwMDBDNjVCMjVDMjk2MjlEQzE4QzY0OTI1NDJBMjEyMDBBMjcKLToxMDI3MDAwMDgwNjA5OTEwMkMyMDNDQzdFRjAwMEYzRTAxMEIzRUIxQkEKLToxMDI3MTAwMEJEMEZEQjM5MEJCQjA5OEYyNjBEQkQxMTJEREMxQzBENDgKLToxMDI3MjAwMDBENDEwRUREMDM4RTI3QjFERDBEMEQ0MTBGRUUwQzBEQjkKLToxMDI3MzAwMEJCMEIyQkJDMUMwQkI3MDI3RUM3MUMyQzIxMjU3QkNCRjMKLToxMDI3NDAwMDE2MkQxQUZDMENCQTBDMERBMTYwMDAwOTNFMDEwNzNFQzMKLToxMDI3NTAwMEIxNzgwOTg3MzkwQjc3MEE3N0VCMDI2MDAyMEEyQzIxREUKLToxMDI3NjAwMDIzMjgyMTIxQjFDQzBDMEM0RjJDMjUyMzdDOEIyOUIwQTQKLToxMDI3NzAwMENEMkQyNTIzQzg1NURBMjBEQjMwNTgxMDZGMjkyMTAyRDIKLToxMDI3ODAwMENDOTZDMEU4MEU5RTAyMkUyNTAyQ0M1N0RBMjBEQjMwMTQKLToxMDI3OTAwMERDNDA1ODEwRjBDMDIwRDEwRjJDMjA2Njg5MzFCMUNDMUMKLToxMDI3QTAwMDBDMEM0NzJDMjQ2NjZFQzYwMjYwMDFEMzA5RkQ1MDY1RUYKLToxMDI3QjAwMEQxQ0QyRjBBMDEyRTMwMTEyOTIyMTQ2NEUwMTEyODIyRDQKLToxMDI3QzAwMDFCMDkwQzQ0MDBDMTA0MDBGQTFBMEE4ODAyMjgyNjFCQkYKLToxMDI3RDAwMDJFMzAxMEMwQTBDMEIwOTQxMjk1MTMxQ0U4Nzg4ODMwMzkKLToxMDI3RTAwMDJDQzAyMjA4OEQxNDc3ODcwNEMwRjEwQ0ZBMzhDMDQxNDAKLToxMDI3RjAwMEMwRjIyNTIwM0NDMDg0MDg1ODAxMEY1RjAxMEY0QjM4MDAKLToxMDI4MDAwMDA1MzU0MDA3QkIxMEMwRjAwODRGMzgwOEZGMTAwRkJCNUMKLToxMDI4MTAwMDAyMjhFQ0ZFQzBGMDA4NEYzODg0MkIwQkE4MTAwQUZGRUEKLToxMDI4MjAwMDEwMkEyMTIwMEY4ODAyMEI4ODAyMDg0NDAyMThFODg2MkIKLToxMDI4MzAwMDhGMTEwODQ0MDIyODIxMjUwQTJBMTQwODI4MTQwNDg4MjQKLToxMDI4NDAwMDExMEE4ODAyMkEyMTA0OTRGMDhCMjAwNEU0MTAwOEJCQUEKLToxMDI4NTAwMDExMDRCQjAyQzA0QTA0QkIwMjlCRjE4NDJBMDhBQjExREQKLToxMDI4NjAwMDBCRUIwMjk0RjQwQTU0MTEwQjQ0MDIwNTU1MTAwRDFCOTYKLToxMDI4NzAwMDQwOTRGNzA3QkIxMDBCNTUwMjA4NTUwMkMwODE5NUY2MkUKLToxMDI4ODAwMDg0MzNDMDUwOTRGM0IxOTQ4QjMyOTVGODk4Rjk5QkYyNEQKLToxMDI4OTAwMEMwODBDMUJDMjQyNjE0OTlGQTlCRjU5OEZCODUzODk1MTUKLToxMDI4QTAwMEZDODQzQTk0RkQ4QjNCOUJGRTg4Mzk5OEZGODUzNTI1NDcKLToxMDI4QjAwMEY2MTA4NDM2ODUxMzI0RjYxMThCMzc4NDEyMkJGNjEyMEEKLToxMDI4QzAwMEMwQjA2NEMwN0U4OTMwNzc5NzQzOEQzMjg4MzMyRTMwMTQKLToxMDI4RDAwMDEwOEYxMTFDRTg0QTA5OTk0MDA2OTkxMTJDRjYxNEMwNzIKLToxMDI4RTAwMEM0MkNGNjE1OEMyQjJERjYxQTI4RjYxQjJCRjYxOTA0ODIKLToxMDI4RjAwMEE4MTEwOTg4MDIwOEVFMDIxOUU4NDBDMTgwMDhFRTAyMUEKLToxMDI5MDAwMDA5QzkwMjI5RjYxNjJFRjYxOEMwOUU2MDAwMDFDMDlBNjkKLToxMDI5MTAwMDJGMjAwQzE4RTgzMDBDRkUxMUE4RkZBNkVFMkRFMjg1NDIKLToxMDI5MjAwMDJCRjRDRjBEOUQwQjJERTY4NUM4N0Y4QTI2ODkyOUE3MUMKLToxMDI5MzAwMEFBOUEyNjBBOTkwQzA5MDk0ODI5MjUyNTY1NTA1MEMwRUMKLToxMDI5NDAwMDIwRDEwRjAwQzA5QTYzRkZDNkRBMjA1ODExMTQ2M0ZFMkQKLToxMDI5NTAwMDM4REEyMEMwQjY1ODExMTE2M0ZFMkUwMDY4OTczQzJCNjAKLToxMDI5NjAwMDlDRkQ2NEJFMjRDMDIwRDEwRkRBMjBEQjcwNTgxMENENEUKLToxMDI5NzAwMEMwQzBDMEQxMEFEQTM5MEFEQzM4NjVDREUwNjNGRTA5OEYKLToxMDI5ODAwMDhBMTAyQjIxMDQ1ODBGOURDMEIwMkIyNDY2NjNGRTIxQjIKLToxMDI5OTAwMERCNDAyQTJDNzQ1ODA5N0VEMkEwRDEwRkRBMjA1ODBGQzAKLToxMDI5QTAwMEEyNjNGQ0Y3NkMxMDA0QzAyMEQxMEYwMDZDMTAwNDI5NDYKLToxMDI5QjAwMDBBODAxRUU4MjYxRkU4MjYxQ0U3RkYwQzJCMTFBQ0JCODMKLToxMDI5QzAwMDJDMkNGQzJEQjI4NTBGQ0MwMjlFRDE5Q0QwQzA1MUMwQzYKLToxMDI5RDAwMDcwMTNFODIyMTRFODIxMThFODFGMkFCMjg1QTgyODA0RjkKLToxMDI5RTAwMDI0MEEyMzQ2OTFBOTg2QjhBQTJBQjY4NUE5ODgyNzg0RUQKLToxMDI5RjAwMDlGMjU2NDlGRDEwRjAwMDA2QzEwMEFENjMwMjgzMDEwM0MKLToxMDJBMDAwMDI5MjAwNjI4OENGOTY0ODI5QjY4OTgwQjJBOUNGOTY1MUEKLToxMDJBMTAwMEExQjIwMjJBMDI1ODBGODQ4OTM3MUJFN0U4Qzg5MTY0RTMKLToxMDJBMjAwMDUyMEUyQTIxMDIwQTBDNEM2NUMyNTg4RDMwMTlFN0UxN0EKLToxMDJBMzAwMDc0RDcwNTJFMjEyMzY1RTI5RTJGOTI5RTFBRTdERDZGNDMKLToxMDJBNDAwMEY4MDI2MDAyNTMyQUEyMjY2OEEwMDgyQzIyMDAwQUNDQjEKLToxMDJBNTAwMDBDNjVDMjQ0MkE5MjlENjRBMjNFOUExNTFGRTdENzhENDkKLToxMDJBNjAwMDY3QzFFNkM4REQyQjYyMDYxOEU3RDU2NEIwMDUyODgwOEIKLToxMDJBNzAwMDIxN0I4QjQzMkIyMDBDMThFN0NGMENCQzExQThDQzI5NTEKLToxMDJBODAwMEMyODY3OUVCNDYwRkJFMEEyRUUyQTM2OEUwMDUyRjIyMkMKLToxMDJBOTAwMDAwN0VGOTM3MkNDMjg1OUMxODY0QzIzMzJCMjEyRjg3MDYKLToxMDJBQTAwMDY2MEI3QjM2MEI3OTBDNkY5RDI2NkVEMjQ2MkMyMDNEMzMKLToxMDJBQjAwMDdCQzc0MENFNTU2MDAwMUUyQTIwMENDMUIyOEMyMDU4MjYKLToxMDJBQzAwMDEwRjc5QTE4NjRBMjQ1OEQ2NzYzRkZDRkMwQzA2M0ZGRkIKLToxMDJBRDAwMEM1RDdCMDYzRkZEMzAwQzBFMDYwMDAwMjJFNjAwMzBFRDQKLToxMDJBRTAwMERCMEM2RUIyMEVEQzcwMENFQTExQUE2QTJBQUMyMDU4MUMKLToxMDJBRjAwMDAxOTlEN0EwREEyMERCNzBDMUM4MkQyMTIwNTgxMDkxOTAKLToxMDJCMDAwMDhDMjY4QjI3OUExNjBDQkIwQzdBQjMzNDhGMTg4OTYzRUEKLToxMDJCMTAwMDk5RjM4ODYyOThGMjhFNjU5RUY4MkQ2MDEwOEExODlENTAKLToxMDJCMjAwMDE3NjhENzI5QzBEMDlEQTkyQzIyMTgyQjIyMTM5Q0FCNDMKLToxMDJCMzAwMDlCQUE5N0E1OEU2NjdFNzMwMjYwMDA5N0NGNTg2MDAwQUYKLToxMDJCNDAwMDFGREEyMDhCMTY1ODEwNTc2NUExMzg2M0ZGQkRDMDgxNkUKLToxMDJCNTAwMEMwOTA4RjE4QzBBMjlBRjk5OUZCOThGQTk3RjU2M0ZGNzUKLToxMDJCNjAwMEQyREIzMERBMjBEQzQwNTgwRkZCQzA1MUQ2QTBDMEMwMDkKLToxMDJCNzAwMDJCQTAxMDJDQTQwMzlCMTcyQzEyMDgwMjJBMDIwNjZCMTAKLToxMDJCODAwMDAyREY3MDJENjAwMzhFMTc5RDE0OUUxMDBDREQxMUMwQTYKLToxMDJCOTAwMEUwQUQ2RDJEREMyMDU4MDExODhDMTQ4QjE2QUNBQzJDREMKLToxMDJCQTAwMDY0MDM4QTI2ODkyOUFCQUEwQTk5MEM5QTI2ODg2NjA5QTEKLToxMDJCQjAwMDA5NDgyOTI1MjUwNzg4MEM5ODY2MkYyMjE4QTdGRjJGN0EKLToxMDJCQzAwMDI2MTg2M0ZFOTZEQTIwREIzMERDNDBERDUwNTgxMTA1MTQKLToxMDJCRDAwMEQyQTBEMTBGQzAzMDJDMjA2Njg5NjFCMUNDMEMwQzQ3M0IKLToxMDJCRTAwMDJDMjQ2NjZFQzYwMjYwMDBEMkMwMzAwOUZENTA2NUQwNEMKLToxMDJCRjAwMENBOEU2NzY0RTA2OTY0NzA2NkRCNjA4QzE4REY3MERBMjcKLToxMDJDMDAwMDIwMkQ2MDAzOEUxNzBDREQxMTlFMTBBRDZEMkREQzIwODQKLToxMDJDMTAwMDFFRTc4RDU4MDBGOTIzMjYxOERBMjA4QjE2REM0MDJGOEEKLToxMDJDMjAwMDIyMTNERDUwQjFGRjJGMjYxMzU4MEY5QUQyQTBEMTBGRDcKLToxMDJDMzAwMDAwMjgyMDNEMDg0ODQwNjU4REU3NkY5NTNFREEzMDhEQ0QKLToxMDJDNDAwMEI1NkQ5OTBDOENBODBDOEMxNENBQ0Y3Q0QzMkQyQUFDRjIKLToxMDJDNTAwMDEwQzA5MDI5MjQ2NzA5MEQ0NzY0RERDNTYwMDA5MjAwMEIKLToxMDJDNjAwMDJDMTIwODA2NkIwMjJENkMyMDA3N0YwMjhFMTdEQTIwQ0IKLToxMDJDNzAwMDlFMTAxRUU3NzQ1ODAwN0Q2M0ZGOUEwMEMwOTE2M0ZGQTkKLToxMDJDODAwMEQxMDAwMDAwNjU1MDgxREEyMERCNjBEQzQwNTgwRkIxRDQKLToxMDJDOTAwMEMwMjBDMEYwMkZBNDAzRDEwRkRBMjBDMEI2NTgxMDNGRDcKLToxMDJDQTAwMDYzRkZFMDAwMDA2Rjk1MDI2M0ZENkNEQTIwREIzMERDMkYKLToxMDJDQjAwMDQwREQ1MEM0RTA1ODBGMzJEMkEwRDEwRjhBMTUyQjIxMkQKLToxMDJDQzAwMDA0NTgwRUNFMjMyNDY2Mjg2MDEwOTgxNzYzRkYyMTAwNTUKLToxMDJDRDAwMERBMjA1ODEwMzI2M0ZGQUJDODU4REIzMERBMjA1ODBGQzcKLToxMDJDRTAwMDE2MkEyMTAyNjVBRjlDQzA5NDA5QTkwMjI5MjUwMjYzMTYKLToxMDJDRjAwMEZGOTFEQjMwREM0MERENTBDMEEzMkUwQTgwMkEyNDY4MUYKLToxMDJEMDAwMERBMjA1ODBGMUZEMkEwRDEwRkMwMjBEMTBGREEyMDJCMEMKLToxMDJEMTAwMDIwMEM1ODEwNDc2M0ZGNkI2QzEwMDQyODIwMDZDMDYyMUIKLToxMDJEMjAwMDI4OENGODY1ODEyNUMwNTBDN0RGMkIyMjFCQzBFMTJBMDMKLToxMDJEMzAwMDIwNkIyOTIxMjMwMEExMDRCMDk5MjkyNTIzQjFBQTAwRTEKLToxMDJENDAwMEVDMUEwQkM0MDEwQTBBNDQyQTI0NkIwNEU0MzkwRENDQTIKLToxMDJENTAwMDAzMENCQjAxMkIyNjFCNjQ0MDY5MjkyMDBDMUJFNzE1QzMKLToxMDJENjAwMDBDOUExMTBCQUEwODJGQTI4NjFCRTcxMzZGRjkwMjYwQjkKLToxMDJENzAwMDAwQjYwQjlCMEEyQkIyQTM2OEIwMDgyQzIyMDAwQkNDMjgKLToxMDJEODAwMDBDNjVDMEE0MkJBMjg1MURFNzM2NjRCMDlCOEMyQjI0NTgKLToxMDJEOTAwMDIxMDQwRENDMDI5Q0IwODgyMEMwQzUwODg4MTEwQzg4ODUKLToxMDJEQTAwMDAyOThCMTg4MkEwODQ0MTE5OEI0OEYzNDk0Qjc5RkI1MUIKLToxMDJEQjAwMEMwNDAxRUU3MDgyREEyODUwRTlFMDgyNUU0Q0YyRERDMUQKLToxMDJEQzAwMDI4MkRBNjg1MjkyMTAyMDkwOTRDNjg5NDFBNjg5ODIwQTMKLToxMDJERDAwMEM5NDAyQTIxMDI2NUEwMEIyQTIyMUUyQjIyMUQ3QUIxOEUKLToxMDJERTAwMDAyNjVBMDc5QzAyMEQxMEYyQzIxMjM2NUNGREU2MDAwQzEKLToxMDJERjAwMDA4MkUyMTIxMkQyMTIzN0VEQkQ1MkIyMjFFMkYyMjFERTMKLToxMDJFMDAwMDI1MjUwMjdCRjkwMUMwQjA2NEJGQzQxM0U2RTkyQ0IwRUMKLToxMDJFMTAwMDA3MjhCMDAwREEyMDAzODgwQTI4ODI0Q0MwRDEwQjgwMzIKLToxMDJFMjAwMDAwREJBMDY1QUZFNzYzRkZBNjJBMkM3NEMwQjAyQzBBQjQKLToxMDJFMzAwMDAyNTgwRTA4MUNFNzBDOUNBMDhCMjAwOEJCMTEwNkJCOTcKLToxMDJFNDAwMDAyOUJBMTg5MzQ5OUEyNjNGRjc5MDAwMDI2MjQ2OERBRTUKLToxMDJFNTAwMDIwREIzMERDNDBERDUwNTgxMDYzRDJBMEQxMEZEQTIwRTcKLToxMDJFNjAwMDJCMjAwQzU4MEZDRUMwMjBEMTBGMDAwMDZDMTAwNjA3OEQKLToxMDJFNzAwMDNEMTRDMDgwREMzMERCNDBEQTIwQzA0N0MwMjEyM0JDRDkKLToxMDJFODAwMDMwMDMyODM4MDgwODQyNzc0MDAxQjFERDY0ODE1QTFFQkEKLToxMDJFOTAwMEU2QzUxOUU2QzYyOUU2N0VEMzBGNkREQTA1MDA1MDg4MkYKLToxMDJFQTAwMDAwMzA4Q0MwRTBDMDIwMjVBMDNDMTRFNkM0QjZEMzhGMEYKLToxMDJFQjAwMEMwQzBEMDBGODcxNDI0NDAyMjBGODk0MDk0MTA3N0Y3QTgKLToxMDJFQzAwMDA0QzA4MTA0ODIzOEMwRjEwQjI4MTBDMDQ0QzAyMjA0MjEKLToxMDJFRDAwMDU0MDEwNEZEMzgwMjUyMDEwMkZFMzgwOEREMTA4MjFDNDQKLToxMDJFRTAwMDA3RUUxMDBFNkUwMjBFREQwMjI0MkNGRUMwRTAwNEZFODIKLToxMDJFRjAwMDM4MEFFRTEwMEU4ODAyMEQ4ODAyOERBQjFFRTZCNDA4NkIKLToxMDJGMDAwMEQ4MDIwRTg4MDI5OEIwQzBFODA0MjgxMDBFNUUwMTg0MzIKLToxMDJGMTAwMEEwMjVBMTI1MDg0NDExMDg0NDAyMDUyNTE0MDQ1NTExRDMKLToxMDJGMjAwMDA0MzQwMkMwODEwRThFMzk5NEIxOEZBQTg0MTA5RkI0RUMKLToxMDJGMzAwMDc1NjYwQzI2QTExRkMwRjIwNjI2MTQ2MDAwMDkwMDAwNjkKLToxMDJGNDAwMDI2QTEyMEMwRjIwNjI2MTQwNTY1MDIwRjc3MDEwNzg3MjcKLToxMDJGNTAwMDM5MDVFNjEwMDc3ODEwMDg2NjAyMDY1NTAyOTVCNjI1NzEKLToxMDJGNjAwMEExMDQwQUU2MTEwODU4MTEwODI4MDIwODY2MDI5NkI3NUIKLToxMDJGNzAwMEMwNjA2NDQwNTY2NDkwNTMwNjdFMTFDMEY0ODlDMjg4RDQKLToxMDJGODAwMEMzMEIzNDBCOTY0NTk4NDc5OTQ2MThFNjlCOUY0MTA0MUUKLToxMDJGOTAwMDU5MTEwRTk5MDIxRkU2OTkwMjBFNDcwOEQ4MDI5ODQyNkQKLToxMDJGQTAwMDBFOTkwMjlGNDBDMUUwMEU5OTAyOTk0NDJGQTAwQ0I0RTMKLToxMDJGQjAwMDM4MENGOTExMTRFNjg4MUVFNjdGQTRGRkFFOTkyRTkyMTQKLToxMDJGQzAwMDg1MjZGNENGMEU4ODBCMjg5Njg1RDEwRjJCQTAwQzFGRDkKLToxMDJGRDAwMEU2NzkxQ0U2ODAwQ0JFMTFBQ0JCQUZFRTJERTI4NTI2NzcKLToxMDJGRTAwMEI0Q0YwRDNEMEIyREU2ODVEMTBGQzA4MDA1MjgzODc4NzQKLToxMDJGRjAwMDQ4MDI2M0ZFQTI2M0ZFOTY2QzEwMDZDMEMwNjU3MEYxQzUKLToxMDMwMDAwMDg4MzBDMDMwMDg4NzE0Nzc4NzEyQzBCMEMwQTYxOUU2OTAKLToxMDMwMTAwMDZCMjk5MDIyQzAzMENDOTdDMDMxNjAwMDAzQzBCMEMwOTMKLToxMDMwMjAwMEE2QzBFMEMwOTFDMEQ0QzA4MjI1MjAzQzBCM0YxMDk3QzEKLToxMDMwMzAwMDEyODMxQ0MwNzAwODU4MDEwRDVEMDEwODk3MzhDMDgwQ0MKLToxMDMwNDAwMDBCOTgzODA3NzcxMDA0ODgxMDA4NjgwMjA4NzcwMkMwQzgKLToxMDMwNTAwMDgwMEQ5ODM4MkQzQ0ZFMDg4ODEwMEQ5RTM4OEQyQjBBNjcKLToxMDMwNjAwMEVFMTAwOEVFMDIwN0VFMDIwQ0I4MTAwRkREMDIwNTNCNzEKLToxMDMwNzAwMDQwMEVERDAyOUQ0MDg5MjAwNDNEMTAwODk5MTEwRDk5RjQKLToxMDMwODAwMDAyMkQyMTA0MDlBOTAyMDhERDExOTk0MTg3MkEwNUI5RjkKLToxMDMwOTAwMDEwMEQzRDAyMEFCQjExMERCQjAyMDg3NzAyOTc0NDI4QjAKLToxMDMwQTAwMDIxMjU4NzEyMDgyODE0MDQ4ODExMDcxRTQwMDdFRTEwRjYKLToxMDMwQjAwMDBFOTkwMjc1NjYwOTI2MjExRjA2MjYxNDYwMDAwNjAwNzcKLToxMDMwQzAwMDI2MjEyMDA2MjYxNDA4NjgwMjlCNDcwOTg4MDI5ODQ2OTQKLToxMDMwRDAwMDI5MjAwQ0QyQzBDMDgwMEM5RTExMUJFNjNFMUZFNjM1OTUKLToxMDMwRTAwMEFCOTlBRkVFMkRFMjg1Mjg5NENGMERBRDBCMkRFNjg1ODMKLToxMDMwRjAwMEQxMEZERDQwQzBBNkMwQjA4RTUxQ0FFMEIyQUFCMUJCQUMKLToxMDMxMDAwMDJEREMxMDhGNTAwRTc4MzY5ODEwMDg3NzBDOUZEODk4QzkKLToxMDMxMTAwMEQ5ODk1MzhGNTI5OTExOTlEQjlGREE3RTgzMDlCMUNDRkIKLToxMDMxMjAwMDI1NUMxMEM5Nzc2M0ZGQ0Y4ODEwOEQxMTA4RTcwQzk3RDUKLToxMDMxMzAwMDUxQUQ4REQ3RjA3OERCMDFCMUY3OUQ1Mzk3NTI4ODMwQjAKLToxMDMxNDAwMEMwMzAwODg3MTQwODg4NDA2NDhFRDU2NUJFQzk2M0ZFMDgKLToxMDMxNTAwMEJDMDAwMDAwNkMxMDA0RDcyMEIwM0E4ODIwQzAzMDgyMzgKLToxMDMxNjAwMDIxQ0FBMDc0MkIxRTI5NzIwNDZEMDgwRkM5ODBDOTkxNTEKLToxMDMxNzAwMDg1NzVCMTMzQTI1MjdBM0IwQjc0MkIwODYzRkZFOTAwQ0IKLToxMDMxODAwMDY0OUZFQ0QxMEZEMjQwRDEwRjAwMDAwMDZDMTAwQUQ2MjIKLToxMDMxOTAwMDMwMkUzMDI3RDk1MERBNDAxNUU2MDkyNDMwMjY5QTE1MEEKLToxMDMxQTAwMDI5MTYwNDY0RTAwMjY0OTM3MzI5MjAwNjJBOUNGODY1QkEKLToxMDMxQjAwMEEzQ0UyQTIxMDIyNzBBMDQwQTBCNEM2NUIzOTc4QzMwNTAKLToxMDMxQzAwMDc0QzcwNTJEMjEyMzY1RDRBMEMwQTYyQjBBMDMyQzIyODkKLToxMDMxRDAwMDAwNTgwRjBCNjRBM0I5MTdFNUY3OEUzODlBMTY2NEUzMEQKLToxMDMxRTAwMEJBMkY2MDI3Mjg1MDIxQzlGMzdFODMxMUMyQjA4QzIwRUEKLToxMDMxRjAwMDJBMjAwQzU4MEYyQUQ3QTBDREExNjAwNEEyMDBDMkIwOEIKLToxMDMyMDAwMDhDMjAyQTIwMEM1ODBFRkVEN0EwNjRBNDg2MkYyMTJFRDUKLToxMDMyMTAwMDhCNjgwRkJGMzYwRkI5MEM2RjlENTQyOTYwMjdENUIwNEUKLToxMDMyMjAwMDZFOTIwNTI4MjAzRDdCOEY0Q0RBMjBEQjUwQzFDNDJERTcKLToxMDMyMzAwMDIxMUY1ODBFQzQ4QjI2OUExODlBMTk4OTI3MkFBQzM4NTAKLToxMDMyNDAwMDBCOTkwQzdBOTM1Mzg5NjNDMDgwOTk3MzhGNjI5ODc4MzUKLToxMDMyNTAwMDlGNzI4RTY1OUU3OThENjc5RDdCOEM2Njk1NzU5QzdBMzUKLToxMDMyNjAwMDhFNjg3RTUzMDI2MDAwQjE4QjE0NjVCMDUwNjAwMDM4RTgKLToxMDMyNzAwMERCRjA2M0ZGQTUwMDhBMTRDOUE5MkU2MDAzMEU5QjBDMjYKLToxMDMyODAwMDZFQjJBNURDNTAwQ0VBMTFBQTZBMkFBQzI4NUJGRkIxMjkKLToxMDMyOTAwMEQ1QTA2M0ZGOTNDMEUwNjNGRkUyREEyMDhCMTg1ODBFREQKLToxMDMyQTAwMDgxNjVBMkIxNjNGRjlFMDAwMERBMjBEQjMwOEMxNTU4RTcKLToxMDMyQjAwMDBFMjlENkEwQzBDMEMwRDEyRDE2MDQyQ0E0MDNEQzcwRUEKLToxMDMyQzAwMERBMjBEQjYwREY1MDJENjAwM0MwRTA5RTEwOUQxNzFFRUEKLToxMDMyRDAwMEU1RDIwQ0REMTEwRDZEMDgyRERDMjg1QkZGNDc4RTY2RjUKLToxMDMyRTAwMDhGNjc4ODE3QUY1RkE4QTgyODY0MDM3NUZCMDFCMUVFNEMKLToxMDMyRjAwMDhBMTg5RTY2OUY2Nzg5MjY4ODI5QUE5OTA5ODgwQzk5NDkKLToxMDMzMDAwMDI2OEU2ODA4MDg0ODA1RUUwQzI4MjUyNTE1RTVBQzlFOTQKLToxMDMzMTAwMDY4NjVFRUNDNjNGRUU2MDAwMDAwQzk0MzJGMjEyMzJCMzUKLToxMDMzMjAwMDIxMjEyRkZDMDEwRjBGNEYyRjI1MjM3RkJCMDI2MDAzQUMKLToxMDMzMzAwMDE0MkMyMDY2ODk2MUIxQ0MwQzBDNDcyQzI0NjY2RUM2MTcKLToxMDMzNDAwMDAyNjAwMjI4MDlGRDUwNjVEMjIyNjRFMUI2MkU2MDI3OTIKLToxMDMzNTAwMDY0RTFCMERDNzBERjUwREEyMERCNjAxRUU1QzMyRDYwNzUKLToxMDMzNjAwMDAzQzA4MDk4MTAwQ0REMTFBRDZEMkREQzI4NUJGRjIyQjEKLToxMDMzNzAwMDY0NDE4MUMwNDQyQjBBMDA4QzIwMkEyMDBDNTgwRUEwRTYKLToxMDMzODAwMDBBQTcwMjY1QTAwRkMwQjAyQzIyMDAyQTIwMEM1ODBFRkMKLToxMDMzOTAwMDlDRDdBMDY0QUZFRkRBMjBDMUJDQzFDODJEMjEyMDhGMUIKLToxMDMzQTAwMDE4OEUyNjg5MjlBRkVFOUUyNjBFOTkwQzA5MDk0ODI5MDgKLToxMDMzQjAwMDI1MjU1ODBFNjRDMDkwQzA1MEMwQzI4ODYwOUExOTFFNUUKLToxMDMzQzAwMEU1N0ZDMEExMkVFMDIyMDg4RjE0Nzc4NzA0QzA4MTBFMEMKLToxMDMzRDAwMDg5MzhDMDgwMEI5MzEwMkQyMDNDMjkyMTIwMENEQzAxNjIKLToxMDMzRTAwMDA0REIwMTA5MjkxNDBCQTgzODBDQTUzODBEM0Q0MDFDM0QKLToxMDMzRjAwMEU1OTY4QjJCMDg4ODEwMDc1NTEwMDg1NTAyMDUzMzAyRjcKLToxMDM0MDAwMDI4MjEyNTBGMTU0MDAzQkIwMjBDQkIwMjA3NTUxMDA1RjAKLToxMDM0MTAwMEQzMTAwODI4MTQwQUREMTEwNDg4MTEwOTg4MDIwNTMzMjUKLToxMDM0MjAwMDAyMjkyMTA0MDgzMzAyOUI3MEMwODA4QTIwMUJFNThGOEIKLToxMDM0MzAwMDA4QUExMTBCQUEwMjlBNzFDMEExODUyQTkzNzY5NTc0RTUKLToxMDM0NDAwMDA4OTMxMTAzREQwMjBBREQwMjlENzc4QzYzQzFEQzlDQzkKLToxMDM0NTAwMDczOEI2Mjk4Nzg5QTc5OUI3MjIzMjIxNEMwQzBCMTM1MUQKLToxMDM0NjAwMDI1MjYxNDlDN0I5RDc1OTM3QTJCNjIxQTlCN0MyQTYyN0QKLToxMDM0NzAwMDFDOUE3RDI4NjIxRDk4N0UyNTYyMUI5NTdGMjM2MjE3MEEKLToxMDM0ODAwMDIzNzYxMDJENjIxODJENzYxMTJDNjIxOTJDNzYxMjY0NzkKLToxMDM0OTAwMEUwQjk4RTYwNzdFNzNEQzBGRTEzRTU1NzFERTU1OEMxRTIKLToxMDM0QTAwMDgxOEE2MjhCNjMwNDk1MTEwRTlDNDAwNkNDMTEwQzU1RTkKLToxMDM0QjAwMDAyMjQ3NjE1MDg1NTAyQzA4MDJENzYxNDhEMkIyQjc2QUMKLToxMDM0QzAwMDFCMkE3NjFBMjg3NjE5MjU3NjE4MDNERDAyMkQ3NjE2MjIKLToxMDM0RDAwMDYwMDAwMzAwMDBDMEZBMkUyMDBDMTlFNTNFMThFNTM1MDcKLToxMDM0RTAwMEE5RTkwQ0VFMTFBOEVFQzA4MDJERTI4NTI4OTRDRjBEM0QKLToxMDM0RjAwMEZEMEIyREU2ODVEQTIwOEIxOThDMTU4RDE0NTgwRDY1ODIKLToxMDM1MDAwMEQyQTBEMTBGREM3MERGNTBEQjYwMkQ2QzI4QzBBMDFFNzQKLToxMDM1MTAwMEU1NTY5QTEwREEyMDVCRkU1NTYzRkU1MzAwMkIyMDNERTIKLToxMDM1MjAwMDBCNEI0MDY1QkM4MjZGRTUyN0RBMzA4RjU1NkRFOTBDOTcKLToxMDM1MzAwMDhFQUEwRThFMTRDOUU4N0VGMzE2MkFBQzEwQzA5MDI5MEMKLToxMDM1NDAwMDI0NjcwOTBGNDc2NEZDNjA2MDAxNUYwMEMwRkE2M0ZGRjUKLToxMDM1NTAwMDg1QzA5MTYzRkZFODg4MTQ2NTgxNjhEQTIwREI2MDhDQTAKLToxMDM1NjAwMDE1NTgwRDdDQzAyMEMwOTAyOUE0MDNEMTBGOEExNjJCQkEKLToxMDM1NzAwMDIxMDQ1ODBDQTJDMEEwMkEyNDY2OEU2ODYzRkRDQTAwRUMKLToxMDM1ODAwMDAwMkI5Q0Y5NjVCMEZEREEyMDU4MENBNzYzRkMyMjAwRTMKLToxMDM1OTAwMDAwREEyMEMwQjY1ODBFMDE2M0ZGQkEwMDJCMjAwQzBDRDUKLToxMDM1QTAwMEJFMTFBN0VFMkRFMjg2QzFDMjdEQzMwMjYwMDExODE5Q0IKLToxMDM1QjAwMEU1MDIwOUI5MEEyOTkyQTM2ODkwMDgyQTIyMDAwOUFBRkIKLToxMDM1QzAwMDBDNjVBMTAzMjZFMjg1NjQ2MEZEMkMyMDY2ODkzMUIxN0IKLToxMDM1RDAwMENDMEMwQzQ3MkMyNDY2NkZDNjAyNzA5NjBDOEExNjJCRjYKLToxMDM1RTAwMDIxMDQ1ODBDODZDMEQwMkQyNDY2OEUzMDc3RTc0RDFDMDAKLToxMDM1RjAwMEU1MDIxQkU1MDI4RjMyODgzM0MwQTQyRDIxMDQwRTk5MDkKLToxMDM2MDAwMDQwMDY5OTExMDRERDExMDlERDAyOUE2MUMxOTAwOUREQkUKLToxMDM2MTAwMDAyOUI2MEMwOTA4QjJCOUQ2NDlGNjY5ODY3OTk2NTBDOTgKLToxMDM2MjAwMEJCMDI5QjYyMjgyMDBDMUFFNEVCQUE4QTBDODgxMUE3MjMKLToxMDM2MzAwMDg4MkY4Mjg1MjlBNENGMkZGQzIwMkY4Njg1OEExNDY1QTgKLToxMDM2NDAwMEEwQTZDMDIwRDEwRkIwRkM4QjE0MkMyNTIzQzhCNzAyMzQKLToxMDM2NTAwMDJBMDIwNjZCMDI1ODBDQjgyQTIxMDI2NUFFRjdDMEQ4QzAKLToxMDM2NjAwMDBEQUQwMjJEMjUwMjYzRkVFQzAwOEUxNEM4RThEQTIwQjEKLToxMDM2NzAwMERCMzA1ODBDQjEyQTIxMDI2NUFFREEwN0FGMDIyRjI1RTQKLToxMDM2ODAwMDAyNjNGRUQxMDBEQTIwREIzMDhDMTU4RDE0NTgwRTU1MDQKLToxMDM2OTAwMEQyQTBEMTBGREEyMDJCMjAwQzU4MERDMDYzRkVCNjAwNEIKLToxMDM2QTAwMERBMjAyQjIwMEM1ODBERTI2M0ZFQUFEQTIwREIzMDhDRTYKLToxMDM2QjAwMDE1MkQxMjA0MkUwQTgwMjgwQTAwMjgyNDY4NTgwQ0IwMDAKLToxMDM2QzAwMDYzRkFFNTAwQzAyMEQxMEZEQTIwNTgwREI0ODkxNENEN0IKLToxMDM2RDAwMDkyREEyMERCMzA4QzE1NTgwRDFGREJBMEMwMjBDMEEwNzMKLToxMDM2RTAwMDJBQjQwM0QxMEZDMDIwRDEwRjJBMkM3NDhCMTU1ODA2OTEKLToxMDM2RjAwMDI4RDJBMEQxMEYwMDAwMDA2QzEwMEMyODIxMDI5NDEwRDkKLToxMDM3MDAwMDA4MDg0QzY1ODM2MjFGRTRBQjI5RjI5RTZGOTgwMjYwNDMKLToxMDM3MTAwMDAzNjYxREU0QTcyOUQyMjY2ODkwMDgyQTIyMDAwOUFBNzgKLToxMDM3MjAwMDBDNjVBMzU0MkNGMjlENjRDMzRFMkIyMDBDMENCNjExRDcKLToxMDM3MzAwMEFGNjYyODYyODZDMUVDNzhFMzAyNjAwMzQ2MTlFNDlFMTYKLToxMDM3NDAwMDA5QjkwQTI5OTJBMzY4OTAwNzhBMjAwOUFBMEM2NUEzREYKLToxMDM3NTAwMDMyMjQ2Mjg1NjQ0MzJDQzBFMTJBMzEwOUMwNzAyNzI0RDkKLToxMDM3NjAwMDY2ODkzNTlBMTE5OTJBODgzNjk5MTI5ODJCODkzNzk4NDMKLToxMDM3NzAwMDEzOTkyQzg4Mzg5OTE0MDg1ODE0OTgxNTk4MkQ4OTM5NUMKLToxMDM3ODAwMDJBMjUwNDJFMjUxRDI5MjUxQzI4MzAyOEMwOTIyODI0RUUKLToxMDM3OTAwMDNDMkEzMDI5MDgwODQ3OTgxNjA5ODkwMTJBMjQzRDJBMUQKLToxMDM3QTAwMDMxMTU5OTE3MEEwOTQxMDlBOTBDMjk5Q0VDMjkyNTFGRjMKLToxMDM3QjAwMDdFODcxOTJEMkEwMDBEQTA2MDAwMDgzRTAxMEEzRUIxNDcKLToxMDM3QzAwMEFEMDhEQTM5MEVBQTExMEE5OTBDMjkyNTFGMkEyMTFGRTIKLToxMDM3RDAwMDE4RTRBODBBODE2MEMxRDA5NDFBOTUxQjAxMDgzRTAwMjQKLToxMDM3RTAwMDA1M0VCMTg0MDU0ODM5ODQzQzI1OUNGQzBEODgzNjI5NkEKLToxMDM3RjAwMDIwMTQwOEFBMUM4RDNEMjcyNjE4MkUyNjEzMkUyNjE0QzkKLToxMDM4MDAwMDJFMjYxNTI3MjYxQjJFMjQ2QjI3MjQ2NzI3MjQ2ODA4QkQKLToxMDM4MTAwMDU4MUMwOTA5NDMyOTI0MTQyOTMyMTEyQTI1MkUyODI1NDgKLToxMDM4MjAwMDJGMjcyNTI0MjcyNTI1MjcyNTJDMjcyNTIzMjUyNTIwMzcKLToxMDM4MzAwMDI0MjUyMTJEMjUyMjg0MUEyRDIxMUM4NTFCNkZEMjAyQkYKLToxMDM4NDAwMDYwMDIwOUMwQTA5OTE4NkQwODBBQjFBQTAwQTEwNDAwN0QKLToxMDM4NTAwMEU5MUE3RDlCMDI2M0ZGRUU4OTE4QzA4MEMwRTFDMDcwNDkKLToxMDM4NjAwMEMwRDI5QjFEOTUxQjk2MUM5QzFFMTZFNDcyMkMyMDNERkQKLToxMDM4NzAwMDE1RTQ4MjBDMEI0MDBEQ0MwMTBCRTczODFERTQ2NDBBMDMKLToxMDM4ODAwMDc3MTAwQ0U4MzgwQjg4MTBDMEM0OUM0MTA4NzcwMjlENjMKLToxMDM4OTAwMDQwQjBBODA5ODgxMThCMjA5QzQ5OUQ0ODk1NEI5NjQzQzAKLToxMDM4QTAwMDA4NzcwMjg2MTQxOEU0NzMxNUU0NUEwODc3MDIwNUJCRkEKLToxMDM4QjAwMDAyOUI0QTlCNDI5NzQ2ODgxMjg3MTEwOERBMTQ5QTRFNTcKLToxMDM4QzAwMDBEODgxMDBENzcxMTA4NzcwMjFBRTQ0RTA2RDgxNDBERjIKLToxMDM4RDAwMDY2MTAwODc3MDI5NzRGQzc4Rjk4NEQ5ODRDOTg0NTg3ODgKLToxMDM4RTAwMDE1OTg0NDA3MTUxNDBENTUxMTBBNTUwMjk1NDcxNUU0MEUKLToxMDM4RjAwMDYzOEEyNjJENDYxMDJENDYxODJENDYyMDJDNDYxMTJDNjUKLToxMDM5MDAwMDQ2MTkyQzQ2MjEyQjQ2MTIyQjQ2MUEyODQ2MTQyODQ2QzcKLToxMDM5MTAwMDE1MkI0NjIyODgxNjI1NDYyNDI1NDYyNjhCMTcwQTBDODkKLToxMDM5MjAwMDQ4MDkwRDQ4ODUxMzBFREQxMTA1Q0MxMTA4Mzk0MDBCRUYKLToxMDM5MzAwMEVCMzkwMjk5MTAxRUU0NTIwRENDMDIwRDU1MTEwODJERTEKLToxMDM5NDAwMDQwMDY1NTAyMkU0NjEzMTZFNDFEMEZERDExMjU0NjE2QkUKLToxMDM5NTAwMDA4MDg0MDg1MUIwMTg4MTAwREJCMDI4NjY3MURFNDQ5REQKLToxMDM5NjAwMDA5ODgwMjBDQkIwMjE5RTQxOTFDRTQ0NzJCNDYxNzJERTkKLToxMDM5NzAwMDQ2MUJBNzY2MUJFNDQ2QzA3MDJDNDYxQzA5ODgwMjhDQjcKLToxMDM5ODAwMDFFMjg0NjFFMkI0NjIzQzA5MDhCMUQyOTQ2MUQyOTQ2MDYKLToxMDM5OTAwMDFGMThFNDNGMjk0NjI3Mjg0NjI1MjkzMTE2MkUyMDA2RTAKLToxMDM5QTAwMDI5MjQ2QTI0MzExNzk2MkQyNDI1Mzg4NjFDQ0NFMTI3M0EKLToxMDM5QjAwMDI0MDdDMEQ3MDkwRTQwNjRFMDgyOUEyOTA5Mjg0MTY0OEYKLToxMDM5QzAwMDgwOTE2NDQwOUIyRDI0MDZDMDk4MDk0OTM2MjgwQUEwOUUKLToxMDM5RDAwMDI0NjI4NTAxQzQwNEE4NDQyODIxMDQyNDY2ODUwODg4M0IKLToxMDM5RTAwMDExOEUzRjhBM0UyRDMyMTAwRUE0MTgwMEM0MDQwRUFFNzQKLToxMDM5RjAwMDE4MDBFRTExMEFDQTUzMEVERDAyQzBFMzBFODgwMjk4QzkKLToxMDNBMDAwMEMxMUVFNDI0MDkwODRFOUVDMDhFMjA5NEMzOThDNTlEMTMKLToxMDNBMTAwMEM0MThFM0YwMURFNDIxMDVFRTExMEVBQTAyMERBQTAyNUUKLToxMDNBMjAwMEE4QjgyNzg0Q0Y5QUMyMUVFM0UyMjRGMjlEMjdFNEEyMUQKLToxMDNBMzAwMDI0NEMxODI0RjY5RDY1NTA1MkMwMjBEMTBGMkQyNDA2MjkKLToxMDNBNDAwMEMwQTBDMDk4MDk0OTM2MDRBOTM4NjNGRjdGQzBBMDYzQUQKLToxMDNBNTAwMEZFMDcwMDAwNjU0RjZEQzA5OEMwQTgyQTI0MDY2M0ZGQ0EKLToxMDNBNjAwMDZCMkQyNDA2QzA5MDYzRkY2M0NDNTdEQTIwREIzMDhDQ0IKLToxMDNBNzAwMDEwNTgwQzM4QzAyMEQxMEYwMERBMjBDMEI2NTgwQ0M3M0YKLToxMDNBODAwMDYzRkZFNTAwREEyMDU4MENDNTYzRkZEQzJBMkM3NDhCMzkKLToxMDNBOTAwMDEwNTgwNTNGRDJBMEQxMEY2QzEwMDYyODIwMDY4QTMzOUIKLToxMDNBQTAwMDZGODIwMjYwMDE2MUMwNTAxM0UzQzIyOTIxMDIxNkUzNTQKLToxMDNBQjAwMEMxNjk5MjA0MjUyNTAyRDk1MDJDMjAxNTlBMjgxNEUzQjcKLToxMDNBQzAwMEJGOEYyNjI3MjAwQjBBRkUwQzA0NzcwOTJCNzExQzY0N0MKLToxMDNBRDAwMEUxMzk4RTQyOEQ0MzZGQkMwMjYwMDE2RjAwRTEwNEIwOUEKLToxMDNBRTAwMEM4MDA4ODFBMDhBODA4MDhEODAyOTgyNzJCMjAwNjY4NUEKLToxMDNBRjAwMEIzMkVDRTk3MkIyMjFFMkMyMjFEMDExMTAyN0JDOTAxNTEKLToxMDNCMDAwMEMwQjA2NEIwMTcyQ0IwMDcyOEIwMDBEQTIwMDM4ODBBRDAKLToxMDNCMTAwMDI4ODI0Q0MwRDEwQjgwMDBEQkEwNjVBRkU3QzAyMEQxNkMKLToxMDNCMjAwMDBGMkQyMDY0NjRERkNBOEIyOUMwRjEwQkFCMEM2NkJGN0MKLToxMDNCMzAwMEMwMkIyMDBDMENCQzExQTZDQzI4QzI4NjJFMEEwODc4RkIKLToxMDNCNDAwMEVCNjExRUUzOUQwRUJFMEEyRUUyQTM2OEUwMDUyODIyNkIKLToxMDNCNTAwMDAwN0U4OTRGMjlDMjg1MUVFM0E5NjQ5MDQ2MUZFM0I2MDMKLToxMDNCNjAwMDlFOTBDMDg0OTg5MTI4MjAwQTk1OTMwRjg4MDI5ODkyN0QKLToxMDNCNzAwMDhFMjAwRkVFMDI5RTk0MkYyMDA3ODgyNjJGOTUwQTk4RkMKLToxMDNCODAwMDk2OUE5NzJFMjAwNjI1MjQwNzY4RTM0MzI5MjEwMjJBQzYKLToxMDNCOTAwMEMyODUxREUzOTAyQUFDMjBBREJEMjVENENGMkFDNjg1QjEKLToxMDNCQTAwMDYzRkY0RTAwMkUyMDY1Q0JFREMwODIyODI0NjVDOUY2NDgKLToxMDNCQjAwMDA1RTQzMTAwMDIwMDJBNjI4MjFCRTM5ODI5NDEwMjBCQ0UKLToxMDNCQzAwMEFBMDIyQTY2ODIwOUU0MzEyOTIxMDI2M0ZGMjMwMDAwNDgKLToxMDNCRDAwMDY0REZCODhGNDIyRTIwMTYwMEYxMDQwREVFMEMwMEVFQ0IKLToxMDNCRTAwMDFBQUVBRTlFMjk2M0ZGQTM4QTIwMkIzMjIxQjFBQTlBNzYKLToxMDNCRjAwMEIwMjkzMjIxMjgzMjIzQjQ5OTI5MzYyMTc5ODlBOTJCNzkKLToxMDNDMDAwMDMyMjIyQjM2MjE2M0ZGQTBDMDIwRDEwRjlGMjcyNTI0MEQKLToxMDNDMTAwMDE1QUNCODI4NzUxQzJCMjAwNkMwQzEyRUJDRkU2NEUwNzQKLToxMDNDMjAwMEFCNjhCNzc3MkRCQ0ZENjVERUM3MkQyMDY0QzBGMDY0OUUKLToxMDNDMzAwMEQwODY4RTI5MEVBRTBDNjZFMDg5QzBGMTI4MjA1QTI4NjUKLToxMDNDNDAwMDhDRkUwOENGMzg2NUZFRTg2M0ZGNTgwMDAwRTAwNDkzNUYKLToxMDNDNTAwMDEwQzA4MTBBRjMwQzAzODMzOUM3OEYwOEQ4MDMwOEE4NjIKLToxMDNDNjAwMDAxMDhGODBDMDgwODE5QTgzMzAzQzgwQ0E4QjgyODc1NkYKLToxMDNDNzAwMDFDMDMwQjQ3MkIyNDE1ODMxMENCQjcwMEUxMDRCMEJDMDkKLToxMDNDODAwMDAwQ0MxQUFDQUMwQ0RDMDI5QzI3NjU5RTVFQzBCMjBCNkIKLToxMDNDOTAwMDk5MDIwOTA5NEYyOTI1MDI2M0ZFNTAwMDJEMjA2QTBENjMKLToxMDNDQTAwMDJENDE2NURGN0VEQTIwQzBCMDU4MEM4RjY0QUYxOEMwOUMKLToxMDNDQjAwMEYxNjNGRUVGOUYyNzYzRkZEMDJFMjIxRjY1RUUzMjYzNzQKLToxMDNDQzAwMEZGNzkwMDAwMjgyMjFGNjU4RTI3NjNGRjZFMjUyNDA2REEKLToxMDNDRDAwMDI5MjEwMjYzRkUxQjAwMDA2QzEwMDY2NTcxMzMyQjRDMUEKLToxMDNDRTAwMDE4QzBDNzI5M0MxOEMwQTFDMDgwMDlBODM4MDgwODQyREMKLToxMDNDRjAwMDY0ODExMDFDRTMyQzFBRTMyRDJBQzY3RTJBNUNGREQzQjYKLToxMDNEMDAwMDBGNkRBQTA1MDBCMDg4MDA5MDhDODk0MEMwQTAwOTg4N0EKLToxMDNEMTAwMDQ3MUZFMzU1MDgwQjQ3MDk0QzUwMDkwRDUzMDRERDEwQUMKLToxMDNEMjAwMEI0Q0MwNENDMTAwRDVEMDI5RDMxMENCQjAyOUIzMDg4REQKLToxMDNEMzAwMDQzOEUyMDk4MzUwRkVFMDI5RTMyOEQyNkQ4NTBBNkREOTgKLToxMDNENDAwMDlEMjY4RTQwQzA5MDBFNUU1MDY0RTA5NzFDRTMzQjFFQTMKLToxMDNENTAwMEUzMkIwMzhCMEJDMEY0OUZCMTlFQjAyRDIwMEE5OUIzQzcKLToxMDNENjAwMDBDREQwMjlEQjI4RjIwMENGRjAyOUZCNDhFMjYyRDIwMDkKLToxMDNENzAwMDA3OUVCNjhDMjgyREI1MEE5Q0I3MjkyNDA3MkYyMDA2NEMKLToxMDNEODAwMDJCMjA2NDY5RjMzOUNCQjYxREUzMEQyMzIwMTY4REQyQTkKLToxMDNEOTAwMDBCMzMwQzAwRDEwNDAwMzMxQUI0OERBM0MzOTMyOTIyMzIKLToxMDNEQTAwMDIwMEMxM0UzMEMxRkUzMDMwQzJFMTFBRkVFQTMyMjI5MEEKLToxMDNEQjAwMDI0Q0YyRkUyODVEMkEwMEZERDBCMkRFNjg1RDEwRjAwOTkKLToxMDNEQzAwMDJFMjAwQ0I0OEMwQ0VCMTExRkUzMDMxREUyRkFBRkVFQjYKLToxMDNERDAwMEFEQkIyMkIyODUyOUU0Q0YwMkMyMEIyMkI2ODVEMkEwQTgKLToxMDNERTAwMEQxMEYwMDAwMkUyMDBDMUNFMkYzMUZFMkZBMENFQjExQTUKLToxMDNERjAwMEFGRUVBQ0JCMjJCMjg1MjlFNENGMDI4MjBCMjJCNjg1OUUKLToxMDNFMDAwMEQyQTBEMTBGQzBEMDBCQUQzODdEQzgwMjYzRkVFQzYzRTkKLToxMDNFMTAwMEZFRTA4RTQwMjcyQzc0N0JFRTEyREE3MEMwQjMyQzNDOEYKLToxMDNFMjAwMDE4REQ1MDU4MEE4Njg5NDBDMDgwNjNGRUUzMDY2RTAyQTIKLToxMDNFMzAwMDAyMkEwMkRCMzBEQzQwREQ1MDU4MDAwNDlBMTBEQjUwQ0YKLToxMDNFNDAwMERBNzA1ODA0NTM4ODEwNjNGRUY3MDAwMDZDMTAwNjkyNzUKLToxMDNFNTAwMDEyMUVFMkU0OEM0MEFFMkQwQzhDNDcyRTNDMTgwNENBOTYKLToxMDNFNjAwMDBCRDlBMDdEQTMwMjI5QURGODc1QzMwMjYwMDA4NEMwMDAKLToxMDNFNzAwMEIwQzAyM0MwQTA5RDEwNkQwODQ0Qjg5RjBFQjgwQThEMzUKLToxMDNFODAwMDkwMEVCNzBCQjg3NzBENkQzNkFEQUE5RDgwMEQ2NjBDMDAKLToxMDNFOTAwMEQ4RjAwMDgwODgwMDcwOEM4NzkwNjhCMTI0QjIyMjc3QjcKLToxMDNFQTAwMEQzMjc4ODkxQzBEMENCODc5ODkwMjc5QzEwMDA3MDg4MkEKLToxMDNFQjAwMDAwRjA4QzlEOTFDQjZGQzA4MTA4QkIwMzc1Q0IzNjYzM0UKLToxMDNFQzAwMEZGQjRCMTIyMkVFQzE4NjNGRkQ0ODU5MjBENzcwQzg2RDcKLToxMDNFRDAwMDkzOTc5MEE2RDY3RDZCMDFCMTU1OTY5Mzk1OTI2MDAwMEQKLToxMDNFRTAwMDE2QjNDQzJEOUMxODg4MTBEOUQwNzhEM0M3MjlEREY4MEIKLToxMDNFRjAwMDYzRkZDMTAwQzAyMzhBNDIxQkUyRTkwMENEMzIyRDQ0OUEKLToxMDNGMDAwMDAyOUIzMDkyMzE4OTQyODU0Mzc5QTEwNTFFRTJFNTBFN0MKLToxMDNGMTAwMDU1MDE4NzEyMUJFMkQ1ODk3MDk1MzUwQjk5MDI5OTMyQUMKLToxMDNGMjAwMDg4NDIwQTg4MEM5ODQyODY3NkE2QTY5Njc2OEY0NEFGNzkKLToxMDNGMzAwMEFGOUY0NEQxMEYwMDAwMDA2QzEwMDg5MzExRDYzMDg4NTkKLToxMDNGNDAwMDMwQzA5MTA4NjM1MTA4MDg0NzA1OTgzODk4MTIyODIxMTUKLToxMDNGNTAwMDAyMjkzQ0ZEMDgwODRDNjU4MTY1NjU5MTYyOEE2MzBBMDcKLToxMDNGNjAwMDJCNTA2NUIxOEIwQTZGMTQyRTBBRkY3Q0E2MEEyQzIwRjkKLToxMDNGNzAwMDVBQ0NDNDJEMEEwMjJEMjQ1QTdGRTAwMjYwMDIxNTg5MTIKLToxMDNGODAwMDI4ODgyNjFGRTJDODA5ODgwQzY1ODIwRjJFMjAwQjBGOTcKLToxMDNGOTAwMEVFMEIyREUwRkUyRUUwRkYwOEREMTEwRUREMDIxRUUyMkQKLToxMDNGQTAwMEMyQUVERDFFRTJDMjFDRTJDMjBFREQwMTBEQ0MzN0MxODUKLToxMDNGQjAwMDgwMDg0ODM3Qjg4REI0ODg5ODEwODk2MDFBRTI4MDdCRjEKLToxMDNGQzAwMDk2MjE4QjYyMkFBMDIxOUMxNDdCQTMxNzlEMTMyQTIwODMKLToxMDNGRDAwMDBDOEIxMDhDMjA1ODBCQjE4QzE0OEQxM0RCQTBDRUFDNDUKLToxMDNGRTAwMDYwMDFDNDAwMkUyMDBDMUJFMjczMENFQTExMEJBQTA4MUUKLToxMDNGRjAwMDJCQTI4NjFGRTI3MTdCREIzQjBGRUYwQTJGRjJBMzY4MzcKLToxMDQwMDAwMEYwMDUyODIyMDA3Rjg5MkMyQkEyODU2NEIwQUE4NzYyNDQKLToxMDQwMTAwMDg4MjZERTcwMEM3OTM2MDk3QTBDNkZBRDFDOEYyNzlCRDEKLToxMDQwMjAwMDE1MDhGRjBDNzdGMzE5N0U3QjcyOUQxMzlDMTQ5QjE1NkEKLToxMDQwMzAwMENGNTY2MDAwMjVDMEIwNjNGRkQwRDc5MDYzRkZERDAwOEUKLToxMDQwNDAwMDAwOUQxMzlDMTREQTIwREI3MDU4MEIxNjhCMTU4QzE0MTIKLToxMDQwNTAwMDhEMTM2NUEwNkE4RTYyNjNGRkNDMDBEQTIwOEIxMURDQzEKLToxMDQwNjAwMDQwNTgwQUJDRDZBMDhCMTVDMDUxREU3MERBMjBEQzYwNDcKLToxMDQwNzAwMERENDA1QkZGNzY4RDEzOEMxNEQ5QTAyRTIwMEMxQkUyNDMKLToxMDQwODAwMDREMUZFMjU0MENFQTExQUZFRkMwRTBBQkFBMkJBMjg1QTIKLToxMDQwOTAwMDJFRjRDRjBCOTkwQjI5QTY4NTYzRkYxRDAwREEyMERDRDcKLToxMDQwQTAwMDYwREQ0MERFNzA4OTEyMjgyMDA3REY1MEE5ODgyODI0QUYKLToxMDQwQjAwMDA3NUJGRjA5RDJBMEQxMEYwMERCRTBEQTIwNTgwQjM3RjUKLToxMDQwQzAwMDY1NTBFRjJBMjAxNDBBM0E0MDY1QTBFQkRCNjBEQzQwMjMKLToxMDQwRDAwMEREMzAwMjJBMDI1ODA5QTdENkEwNjRBMEQ1ODRBMTgzQTYKLToxMDQwRTAwMEEwMDQwNDQ3MDMwNTQ3OTUxMjAzNjM1MUMwNTE2M0ZFQzIKLToxMDQwRjAwMDVDMkMyMDA2RDMwRjI4Q0NGRDY0ODBBNTY4QzcwNEMwQzMKLToxMDQxMDAwMDkzMjkyNDA2MkMyMDA2QzBCMThENjQxRkUyMkM5RDI3MjQKLToxMDQxMTAwMDlEMjg5RDI5OEZGMjlEMjYwMEYxMDQwMEJCMUEwMEYwMTYKLToxMDQxMjAwMDA0QjBCRTBFREQwMUMwRjBBREJCOEQ2NTJGMjQwNzBEQzAKLToxMDQxMzAwMDBFNUUwMUVFMTFBRUJCMkUwQUZFQjBCQjBCMEIxOTBFQ0MKLToxMDQxNDAwMEJCMzZDMEUyMEIwQjQ3MEVCQjM3MkIyNDE2MThFMjI0RkMKLToxMDQxNTAwMDBBMDk0NTBEMEI0MjJCMjQwQjI5MjQwQUI0QkUyRTI0MzgKLToxMDQxNjAwMDBDN0Q4ODU3MjkyMDE2MkZDQ0ZEQjA5RDBBNUM1MjBEN0UKLToxMDQxNzAwMENDMzYyQzI0NjQ2NUZERUMwQzBDNDc2NENERTYxOEUyQ0IKLToxMDQxODAwMDBGOEUyODg4ODIwQzlGMEMwMDgxMDQwMEZGMUFBRkVFNkUKLToxMDQxOTAwMDlFMjk2M0ZEQ0YxQ0UyM0U2M0ZFMTMwMDFDRTIzNTYzRTMKLToxMDQxQTAwMEZFMEM4RDY1NjNGRkE1MDBEQTIwMkIyMDBDNTgwQjIwMzgKLToxMDQxQjAwMDY0NUYwRkMwMjBEMTBGMDBDMDIwRDEwRkMwOTMyOTI0MEQKLToxMDQxQzAwMDE2QzA5MzYzRkZBMDAwMDA2QzEwMDRDMDYwMTdFMUY4RjQKLToxMDQxRDAwMDFERTFGQkMzODEyOTMxMDEyQTMwMDgyOTI0MEE3OEExNzUKLToxMDQxRTAwMDA4QzNCMjdCQTE3MkQyNjBEMTBGQzBDMTY1NTA1MTI2MDUKLToxMDQxRjAwMDI1MDIyQUQwMjAyRjIwMEIyOTBBRkIyQjIwMTQyRTIwNDkKLToxMDQyMDAwMDE1MjYyNDE1MDlCQjAxMERGRjA5MjhGMTFDMkIyNDE0QzgKLToxMDQyMTAwMEE4RUUyRUY1MUM2NEEwQTkyQjIyMUUyODIyMUQwMTExMzgKLToxMDQyMjAwMDAyN0I4OTAxREI2MDY0QjAxNzJDQjAwNzI4QjAwMERBOEMKLToxMDQyMzAwMDIwMDc4ODBBMjg4MjRDQzBEMTBCODAwMERCQTA2NUFGMjQKLToxMDQyNDAwMEU3REIzMERDNDBERDUwREEyMDU4MDBERTI5MjEwMjA5QUUKLToxMDQyNTAwMDBCNENDQUIyRDJBMEQxMEYwMENDNUEyQzMwMDg3QkMxNzMKLToxMDQyNjAwMDM3MkVEMDIwNjRFMDJEMDIyQTAyMDMzQjAyREM0MEREMjEKLToxMDQyNzAwMDUwNTgwMEQ0RDJBMEQxMEYyQjIwMTRCMEJCMkIyNDE0NDMKLToxMDQyODAwMDBCMEY0MTY0RjA3OTdDQjdDQUMwQzEwQzlDMDIyQzI1OEQKLToxMDQyOTAwMDAyRDJBMEQxMEZDMDIwRDEwRjJFMjAwNjY5RTJDMTI2ODQKLToxMDQyQTAwMDI0MDYyQjIyMUUyRjIyMUQyOTIwMEIyODIwMTUwRDk5QjQKLToxMDQyQjAwMDA5MkE5MTFDMjYyNDE1QUE4ODI4OTUxQzdCRjE0OTYwOUYKLToxMDQyQzAwMDAwNDhCMEJCMkIyNDE0MEIwQTQxNjRBMDYyN0NCNzAyRTcKLToxMDQyRDAwMDJDMjUwMjJCMjIxRTJDMjIxREQzMEY3QkM5MDFDMEIwMUUKLToxMDQyRTAwMEM5QjYyQ0IwMDcyOEIwMDBEQTIwMDc4ODBBMjg4MjRDMEIKLToxMDQyRjAwMEMwRDEwQjgwMDBEQkEwNjVBRkU3QzAyMEQxMEYwMDAwNkMKLToxMDQzMDAwMDI2MjQwNkQyQTBEMTBGMDAwMERCNjAxREUxQUM2NEJGMDMKLToxMDQzMTAwMDRGMkNCMDA3MjhCMDAwREEyMDA3ODgwQTI4ODI0Q0MwNEEKLToxMDQzMjAwMEQxMEI4MDAwREJBMDY1QUZFNzFERTFBNDYzRkYzMTAwODYKLToxMDQzMzAwMDI2MjQwNjYzRkY5QzAwMDA2QzEwMDQyODIwMDYyNjBBMzEKLToxMDQzNDAwMDA0NkY4NTYzNjQ1MDJBMjkyMDE0N0Q5NzI0MDIyQTAyNzEKLToxMDQzNTAwMERCMzBEQzQwREQ1MDU4MDAxOTI5MjEwMjA5MEE0Q0M4MjUKLToxMDQzNjAwMEEyQzAyMEQxMEZDMEIxMEI5QjAyMkIyNTAyQzAyMEQxQ0YKLToxMDQzNzAwMDBGMDAwMjJBMDIwMzNCMDIyQzBBMDE1ODAwRDFDOUFBRUQKLToxMDQzODAwMERBMjBEQjMwREM0MDU4MDlGMzI5QTAxMUQzQTA3RTk3NTYKLToxMDQzOTAwMDA4MkMwQUZEMEM5QzAxMkNBNDExQzA1MTJEMjAxNDA2RTAKLToxMDQzQTAwMEREMDIyRDI0MTQ2M0ZGQTREQTIwREIzMERDNDBERDUwNzUKLToxMDQzQjAwMEMwRTA1ODA5NzNEMkEwRDEwRjAwMDAwMDZDMTAwNjE2OUYKLToxMDQzQzAwMEUxN0QxQ0UxN0Q2NTUxNTdDMEUxMTdFMTc5MjgyMTAyQUIKLToxMDQzRDAwMDJEMjIwMDA4MDg0QzY1ODA5MzJCMzIwMDBCNjk1MTI5NkYKLToxMDQzRTAwMDlDRkQ2NTkwODcyQTYyOUU2RUE4NEMyQTcyMjY2OEEwNjIKLToxMDQzRjAwMDAyN0FEOTQzMkE2MjlEQ0JBRDdDQkU1MDJCMjAwQzBDOTcKLToxMDQ0MDAwMEJEMTFBNkREMjhEMjg2MkY0QzA0NzhGQjE2MENCRjBBRkUKLToxMDQ0MTAwMDJGRjJBMzY4RjAwNTI4MjIwMDdGODkwNzJERDI4NUQzQ0IKLToxMDQ0MjAwMDBGNjVEMDc0MkEyMTA0MTlFMUEzRDMwRjdBOUIyRURBRTkKLToxMDQ0MzAwMDIwNTgwODZFNjAwMDM1MDAyRDIxMDQxQkUxOUU3REJCRDUKLToxMDQ0NDAwMDI0REEyMEMwQjY1ODA4NjlDQTU0NjAwMTAzMEIyQjUwMDcKLToxMDQ0NTAwMDJCMjQwQkI0QkIwQjBCNDcyQjI0MEM2M0ZGQTBEQTIwREYKLToxMDQ0NjAwMDU4MEE0RTYwMDAwNkRBMjBDMEI2NTgwQTRDNjU1MEUwODMKLToxMDQ0NzAwMERDNDBEQjMwMkQzMjAwMDIyQTAyMEQ2RDUxNTgwOEJEQTAKLToxMDQ0ODAwMDFDRTE0RUQzQTA2NEEwQzhDMDUxODRBMThFQTAwNDA0MzYKLToxMDQ0OTAwMDQ3MEUwRTQ3NjNGRjM1MDAwMDJCMjEwNEMwOEM4OTMxODUKLToxMDQ0QTAwMEMwNzBERjcwMDlGOTUwMDk4RjM4NkVCODE3MkMyMDY2N0MKLToxMDQ0QjAwMEFFQ0MwQzBDNDcyQzI0NjY3Q0ZCMDk5RDEwNTgwOENGMTEKLToxMDQ0QzAwMDhEMTAyNzI0NjY5NEQxMUVFMTUxQjhEQzlFRDA2NTUwMzIKLToxMDQ0RDAwMDU2QzBEN0I4M0FDMEIxQzBGMDBDQkYzODBGMEY0MkNCQUUKLToxMDQ0RTAwMEYxMTlFMTMwMThFMTMyMjg5NjdFQjA0QkQzMEY2REJBNDYKLToxMDQ0RjAwMDA1MDBBMDg4MDBDMDhDMkMyMDBDQzAyMDFERTEzNjBDQ0IKLToxMDQ1MDAwMENGMTFBNkZGMkVGMjg1QURDQzI3QzRDRjBFNEUwQjJFQjkKLToxMDQ1MTAwMEY2ODVEMTBGQzA4MDBBQjgzODc4RDBDRDYzRkZDMTAwQ0UKLToxMDQ1MjAwMDhFMzAwRTBFNDc2M0ZFQTEyQTJDNzQyQjBBMDEwNDREMTcKLToxMDQ1MzAwMDAyNTgwOEMyMkYyMDBDMTJFMTI3MENGOTExQTY5OUEyRUIKLToxMDQ1NDAwMEZGMjdGNENGMjg5Mjg1RDJBMDA4NDgwQjI4OTY4NUQxNjIKLToxMDQ1NTAwMDBGQzAyMEQxMEYwMDAwMDA2QzEwMDRDMDYwQ0I1NURCRjEKLToxMDQ1NjAwMDMwREM0MDA1NUQwMjAyMkEwMjVCRkY5NDI5MjEwMjA5MkEKLToxMDQ1NzAwMDA4NENDODgyRDJBMEQxMEYyQjIwMTRCMEJCMkIyNDE0MUUKLToxMDQ1ODAwMDBCMEM0MUNCQzU3REI3RUJDMEMxMEM5QzAyMkMyNTAyQTYKLToxMDQ1OTAwMEQyQTBEMTBGMDAwMDAyMkEwMjAzM0IwMjA2NkMwMkMwMjcKLToxMDQ1QTAwMEQwQzdGNzJFMjAxNDI4MzEwMTI2MjUwMjI4MjQwQTBGMEYKLToxMDQ1QjAwMEVFMDEyRTI0MTQ1ODAxMEU2M0ZGQTMwMDI2MjQwNkQyMTgKLToxMDQ1QzAwMEEwRDEwRjAwNkMxMDA2MjgyMTAyRDYyMDA4MDg0QzY1RTcKLToxMDQ1RDAwMDgwOUQyQjIwMEMxMkUwRjcwQ0I4MTFBMjg4MkE4Mjg2NEQKLToxMDQ1RTAwMEI1NDk3QTkzMDI2MDAwOTcxOUUwRjQwOUI5MEEyOTkyNTMKLToxMDQ1RjAwMEEzNjg5MDA4MkE2MjAwMDlBQTBDNjVBMDgyMjg4Mjg1MTcKLToxMDQ2MDAwMDFDRTBGRjY0ODA3OTlDODBCODg3QjE0QjlCODE5QjEwMzQKLToxMDQ2MTAwMDY1NTA3NEMwQTdEOTcwMjgwQTAxQzBEMDA3OEQzODBEMjUKLToxMDQ2MjAwMDBENDJDQkRFMUZFMEUwMUVFMEUxMkVGNjdFRDgzMEQzNTcKLToxMDQ2MzAwMDBGNkQ0QTA1MDA4MDg4MDA5MDhDMkUzMDA4QzBBMDAwQzUKLToxMDQ2NDAwMEVFMzIyRTc0MDAyODYwMEMxOUUwRTMwQzhEMTFBMkREMEYKLToxMDQ2NTAwMEE5ODhDMDIwMkNEMjg1MjI4NENGRDJBMDBDQkMwQjJDRTAKLToxMDQ2NjAwMEQ2ODVEMTBGQzBGMDAzOEYzODdGQTBDMDYzRkZCNDAwQTAKLToxMDQ2NzAwMENDNTgyQTZDNzREQjMwREM0MDU4MDdGNkMwMjBEMTBGRDAKLToxMDQ2ODAwMERBNjA1ODA5QzY2M0ZGRTdERDQwMkE2Qzc0QzBCMERDMEQKLToxMDQ2OTAwMDcwNTgwODZBMkUzMDA4OEIxMDAwRUUzMjJFNzQwMDI4RjUKLToxMDQ2QTAwMDYwMEMxOUUwQ0MwQzhEMTFBMkREQTk4OEMwMjAyQ0QyQTEKLToxMDQ2QjAwMDg1MjI4NENGRDJBMDBDQkMwQjJDRDY4NUQxMEYwMDAwNTQKLToxMDQ2QzAwMDZDMTAwNDI5MjAxNDI4MjAwNkIxOTkyOTI0MTQ2ODgxMkIKLToxMDQ2RDAwMDI0QzBBRjJDMEEwMTJCMjEwMjJDMjQwNjdCQTAwNEMwOEQKLToxMDQ2RTAwMEQwMkQyNTAyMDIyQTAyMDMzQjAyMDQ0QzAyQzBEMDU4RkUKLToxMDQ2RjAwMDAwQzBEMkEwRDEwRkMwMjBEMTBGMDAwMDZDMTAwNDI5M0YKLToxMDQ3MDAwMDMxMDFDMkI0MjkyNDBBMkEzMDExQzI4Mzc4QTE2QzdCRkEKLToxMDQ3MTAwMEExNjk2NDUwNDcyQzIwMDZDMDY4NkZDNTYyQ0E1NzJEMzYKLToxMDQ3MjAwMDIwMTQ3Q0Q3MjJEQTIwREIzMERDNDBERDUwNUJGRkE1OTMKLToxMDQ3MzAwMDI5MjEwMjA5MEU0Q0M4RTJDMDIwRDEwRkMwRjEwRjlGMDEKLToxMDQ3NDAwMDAyMkYyNTAyQzAyMEQxMEZEQTIwREIzMEMwQzA1QkZGNzIKLToxMDQ3NTAwMERDMjgyMDE0MDY4ODAyMjgyNDE0NjNGRkM3MjkyMDE1QUEKLToxMDQ3NjAwMDFCRTA5NzJBMjAwQkMwQzA5QzI0MEJBQTA5MkJBMTFDN0MKLToxMDQ3NzAwMDJDMjQxNUFCOTkyOUE1MUM2M0ZGOTkwMEMwMjBEMTBGRUIKLToxMDQ3ODAwMERBMjBEQjMwREM0MERENTBDMEUwNTgwODdERDJBMEQxMUIKLToxMDQ3OTAwMDBGMDAwMDAwNkMxMDA0Q0I1NTEzRTA5MjI1MjIxRjBENzIKLToxMDQ3QTAwMDQ2MTEwNjU1MENBMzIzMjYyMjFFMjUyNjFGMDY0NDBCNjAKLToxMDQ3QjAwMDI0MjYxRTczNEIxREM4NTJEMjQwRDEwRjI4MEE4MEMwMzgKLToxMDQ3QzAwMDQwMjQyNjFGQTgyODI4MjYxRTI4MjYxREQyNDBEMTBGQTcKLToxMDQ3RDAwMEMwMjBEMTBGMjQ0REY4MjQyNjFFNjNGRkQ4MDAwMDAwMEUKLToxMDQ3RTAwMDZDMTAwNEQ2MjAyODIwMDZDMDcwNkU4NTAyNjAwMEQ0QUMKLToxMDQ3RjAwMDFERTA3OTE5RTA3MTEyRTA2RjJBOENGQzY0QTEzMDJCNjYKLToxMDQ4MDAwMDYxMDJCNDRDMEIwQjRDNjVCMEEyMkI2MDBDOEE2MDBDOUYKLToxMDQ4MTAwMEI4MTEwMjg4MDgyRTgyODYwOUI5MEE3RUMzMDI2MDAwOTgKLToxMDQ4MjAwMDlBMjk5MkEzNjg5MDA1MDlBQTBDNjVBMDhFMjg4Mjg1MTIKLToxMDQ4MzAwMDY0ODA4OEI4ODkxQkUwNzU5NDgxOUI4MDY1NTE1NUMwNjAKLToxMDQ4NDAwMEI3QjgzODJBMEEwMUMwQzAwOUFDMzgwQzBDNDI2NEMwQTEKLToxMDQ4NTAwMDQyMUZFMDU0MUVFMDU2MkVGNjdFQjA0QUQzMEY2REFBREEKLToxMDQ4NjAwMDA1MDA4MDg4MDA5MDhDQzBBMDI5NjAwQzBDOUMxMUEyQ0YKLToxMDQ4NzAwMENDMkJDMjg1QUQ5OTBCNEIwQjJCQzY4NTI4NjAwNjI3MjgKLToxMDQ4ODAwMDk0Q0Y2ODgxMjIyRDYwMTVEMkEwQzlEMkMwRTIyRTY0RDcKLToxMDQ4OTAwMDA2RDEwRjAwQzBGMDA4QUYzODdGQjBCRDYzRkZCMTAwOTQKLToxMDQ4QTAwMDI3NjQwNkQyQTBEMTBGMDBEMkEwRDEwRjAwQ0M1N0RBRDYKLToxMDQ4QjAwMDYwREIzMERDNDA1ODA4QTdDMDIwRDEwRkRBNjA1ODA5MEYKLToxMDQ4QzAwMDM3NjNGRkU4MDAyODIyMUUyOTIyMUREMzBGNzg5OTAxQTMKLToxMDQ4RDAwMEMwODBDMUQ2QzFDMTFCRTA0M0MxMjJBQjZCNjQ4MDQyMjIKLToxMDQ4RTAwMDc4OTEzRjJBODAwMDBDQUUwQzY0RTBCQjAyQUYwQzY0RjAKLToxMDQ4RjAwMEYwQjUyRUFDRUM2NEUwQUYwREFGMEM2NEYwQTkyRUFDQkIKLToxMDQ5MDAwMEU4NjRFMEEzMkZBQ0U3NjRGMDlEMkVBQ0U2NjRFMDk3OEEKLToxMDQ5MTAwMDJGODAwNzA4RjgwQkRBODA3QjgzMDIyQThERjhEOEEwNTUKLToxMDQ5MjAwMDY1QUZCQzI4NjEyMzA4RDczOUQ5NzA2MDAwN0IwMDAwQ0YKLToxMDQ5MzAwMDJCNjAwQzBDQjgxMUEyODgyQzgyODYyQTBBMDg3Q0FCNEEKLToxMDQ5NDAwMDdFMDlCQTBBMkFBMkEzNjhBMDA1MkM2MjAwN0FDOTZGNjAKLToxMDQ5NTAwMDJBODI4NTY0QTA2OTFGRTAyOTI3NjUwNEMwRTNDMEM0REEKLToxMDQ5NjAwMDJFNjQwNjlDQTExQ0UwNTQ5RkEwMkU2MDBBOTdBMzBDMDUKLToxMDQ5NzAwMEVFMDI5RUEyOEY2MDBDRkYwMjlGQTQyRTYwMTQ3QUVGQkQKLToxMDQ5ODAwMDQ2MjdBNDE3QURCQzJGODI4NTI3QzRDRjJGRkMyMDJGMkMKLToxMDQ5OTAwMDg2ODU2M0ZFNjkyQTZDNzRDMEIxREM5MERENDA1ODA3REYKLToxMDQ5QTAwMEE3MURFMDBDNjNGRUMxMDBEOUEwREE2MERCMzBDMkQwRTUKLToxMDQ5QjAwMEMxRTBEQzQwMDlERTM5REQ1MDU4MDdGMUQyQTBEMTBGNEIKLToxMDQ5QzAwMERBNjA1ODA4RjY2M0ZFRTQyOTBBMDEyOUE0MTcwREJGMkUKLToxMDQ5RDAwMDA4MkU4Mjg1MjdGNENGMkVFQzIwMkU4Njg1NjQ1MDBCN0UKLToxMDQ5RTAwMDJBNkM3NERCNDA1ODAxNkFEMkEwRDEwRkMwMjBEMTBGQ0QKLToxMDQ5RjAwMDZDMTAwNjJCMjIxRTI4MjIxRDkzMTA3Qjg5MDFDMEIwNEIKLToxMDRBMDAwMEMwQzlDMDNCQzFGMjA0MDY0MDFEREZGNkMwRTJDMDc0NUQKLToxMDRBMTAwMDA3NDcwMTBFNEUwMUFEMkQ5RTExQzA0MDJFMEExNDY0QjEKLToxMDRBMjAwMEIwNkU2RDA4NDQyODIyMUQ3QjgxNjUyQUIwMDA3RUExRUUKLToxMDRBMzAwMDNCN0ZBMTQ3N0I1MTIwN0NBMTQ5NjhBOTE3NjhBQTE0MzQKLToxMDRBNDAwMDczQTExMUMwOUY3OUExMENDMThCNzhBMTA3QzFBRTI5QjgKLToxMDRBNTAwMDBBMUUyOUI0MDA3Q0ExMkIyQUIwMDcwQkFCMEJEQUIwREQKLToxMDRBNjAwMDdEQjMwMjJBQkRGOERCQTBDQUE1NjNGRkI0MjhCMDEwNEQKLToxMDRBNzAwMDg5MTE2OTg3QkI2NDlGQjg2M0ZGREMwMDY0N0ZCNDYzRkUKLToxMDRBODAwMEZGRDUwMDAwNjQ2RkQwQzA0MUMxQUUyQUI0MDA2M0ZGRkYKLToxMDRBOTAwMEM2MkIyMTAyQ0VCRTJBMjIxRDJCMjIxRTdBQjEyQThDQzEKLToxMDRBQTAwMDEwN0NCMTIxN0FCOTAxQzBCMEM5QjkxM0RGQzFEQTIwRDUKLToxMDRBQjAwMDI4QjAwMDJDQjAwNzAzODgwQTI4ODI0Q0MwRDEwQjgwOTQKLToxMDRBQzAwMDAwREJBMDY1QUZFN0QyNDBEMTBGODkxMDY1OUZENDYzQUEKLToxMDRBRDAwMEZGRjMwMDAwNkMxMDA4QzBEMEM4NTk4QzMwMjkyMTAyQTcKLToxMDRBRTAwMDBDMEM0NzYwMDAwQzhFMzAwRTFFNTA2NUUxOUUyOTIxOTMKLToxMDRBRjAwMDAyQzBDMTE2REZCMDA5MEI0QzY1QjA5MDhBMzAwQTZFNTcKLToxMDRCMDAwMDUxNjhFMzAyNjAwMDg1MkY2MjlFMUJERkE5NkVGODUzOTcKLToxMDRCMTAwMDJCQjIyNjY4QjAwNTJFMjIwMDdCRTk0NzI3NjI5REI3OUQKLToxMDRCMjAwMDQ4Q0I3Rjk3MTAyQjIwMENCMDRFMENCRjExQTZGRjI5NEQKLToxMDRCMzAwMEYyODY5RTEyNzk4QjQxMTdERkEwMDdCNzBBMjc3MkEzNkUKLToxMDRCNDAwMDY4NzAwNDg4MjA3Nzg5MzAyOUYyODVERjkwRDc5MDY1RDYKLToxMDRCNTAwMDkwNjUyQTIxMDQxOURGRDc3QTlCMjJEQTIwNTgwNkEzMTAKLToxMDRCNjAwMDYwMDAyOTAwMkMyMTA0MUJERkQzN0NCQjE4REEyMEMwOTUKLToxMDRCNzAwMEI2NTgwNjlFQzk1ODYwMDE0Q0MwOTA2M0ZGQ0NEQTIwM0QKLToxMDRCODAwMDU4MDg4NjYwMDAwNkRBMjBDMEI2NTgwODg0NjU1MTM1OUEKLToxMDRCOTAwMERDNDBEQjMwOEQzMERBMjAwRDZENTE1ODA2RjZDMEQwODgKLToxMDRCQTAwMEQzQTA2NEExMjAyOTIxMDJDMDUxODRBMThDQTAwNDA0QjcKLToxMDRCQjAwMDQ3MEMwQzQ3NjNGRjNFMDBDMDlDODgzMURCRDAwOEY4RUYKLToxMDRCQzAwMDUwMDg5QjM4MjgyMTA0OTgxMTZFODgyMzI4MjA2NkFDNTEKLToxMDRCRDAwMDhDMEMwQzQ3MkMyNDY2N0NCQjE1OUYxMzlFMTQ4QTEwRUEKLToxMDRCRTAwMDhCMTE1ODA3MDY4RTE0OEYxM0MwRDAyRDI0NjY4QTMwN0YKLToxMDRCRjAwMEMwOTJDMUM4MUJERjg2N0ZBNjA5OUJGMDk5RjEyQ0Y0RjcKLToxMDRDMDAwMDA4MjdGQzEwNjU1MEE0QjgzQURGNzBDMDUxQzA4MDA3NzcKLToxMDRDMTAwMDU4MzgwODA4NDI2NDgwNjcxOERGNjMxOURGNjQyOTg2MDIKLToxMDRDMjAwMDdFNkE0MjBBRDMwRjZERTkwNTAwQTA4ODAwRjA4Q0MwQUYKLToxMDRDMzAwMEEwODkzMEI0RTM3Rjk2MjhDMEYyMDdFOTBCMkM5NDA4RDIKLToxMDRDNDAwMDlCOTA5RjkxMkYyMDBDMTJERjYzMENGODExQTY4ODI5RUUKLToxMDRDNTAwMDgyODVBMkZGMkRGNENGRDJBMDA5MzMwQjIzODY4NUQxMDQKLToxMDRDNjAwMDBGMjIyMDBDODkxMjE4REY1QjBDMkIxMUE2QkJBODIyODcKLToxMDRDNzAwMDJEMjRDRjJDQjI4NUQyQTAwQzk5MEIyOUI2ODVEMTBGNEIKLToxMDRDODAwMEMwODdDMDkwMEE1OTM4Nzk4MDk2NjNGRjhBREIzMERBOTIKLToxMDRDOTAwMDIwQzBDMUMwRDA1QkZGNTYyOTIxMDJDMEQwMkE5Q0ZFOTMKLToxMDRDQTAwMDY1QUU0RDJEMjUwMkMwOTA2M0ZFNDUwMDlFMTQyQTJDNTIKLToxMDRDQjAwMDc0QzBCMURDNzBERDQwNTgwNkUxOEUxNEMwRDAxQkRGM0IKLToxMDRDQzAwMDUzQzFDODYzRkY2QUMwMjBEMTBGMDAwMDZDMTAwNjI4RDIKLToxMDRDRDAwMDIxMDIxNkRGMzgwODA4NEM2NTgyMTkyOTYyOUU2Rjk4RjgKLToxMDRDRTAwMDAyNjAwMjIwMTlERjMzMjk5MjI2Njg5MDA3OEEyMDA5ODIKLToxMDRDRjAwMEFBMEM2NUEyMEYyNzYyOURDMENDNjQ3MjA3MkIyMTA0MDkKLToxMDREMDAwMDhFMzFDMEEwRERBMDBFRkU1MDBFQ0QzODZFQjgxMDJDMzYKLToxMDREMTAwMDIwNjZCMUNDMEMwQzQ3MkMyNDY2N0NEQjAyNjAwMUVGRDIKLToxMDREMjAwMEMwQzEyOTMwMDgxQkRGMjU2NDkwOUMyRjBBRkZDMEQzMjcKLToxMDREMzAwMEIwOUU2NEUxMDI2ODkyMTM2NDUwODgyQTJDNzQwNDRCN0MKLToxMDRENDAwMDAyNTgwMDkzMEFBMjAyMDYwMDAwMDAwMDJCMjAwQzI3NDQKLToxMDRENTAwMDIxMDQwQ0JDMTFBNkNDMjlDMjg2MjgwQTA4Nzk4MzAyM0EKLToxMDRENjAwMDYwMDFCOTE5REYxNTA5QjkwQTI5OTJBMzY4OTAwODJFQzQKLToxMDRENzAwMDIyMDAwOUVFMEM2NUUxQTQyRUMyODU2NEUxOUUyNjIwODYKLToxMDREODAwMDA3MTNERjFFNkU3QjAyNjAwMTlBMTdERjE1MUZERjFFRkYKLToxMDREOTAwMDE5REY0QkMwRDIyODIwMEE5M0UwOURFMUE5NjkwRjg4NTIKLToxMDREQTAwMDAyOThFMjJGOTA4MDJBOTQ4MEIxRkYwN0ZGMDI5RkUzRDAKLToxMDREQjAwMDJFQzI4NTFGREYwODBFREUwQkFGQkYyQUY0Q0YyRUM2MzIKLToxMDREQzAwMDg1NjU1Rjc2QzAyMEQxMEYyODMwMTAyOTMwMTEyRTMwMzQKLToxMDRERDAwMDEzMDA5OTMyMDBFRDMyNjQ4MEVFMkEzMDE0MUZERjM4NjAKLToxMDRERTAwMDAwQUEzMjc4RUYwNTBGOUUwOTJERTQ3RjFFREYzNjY2OUMKLToxMDRERjAwMEEwMDUwRjk4MDkyQTg0ODBCNEE3MThERjMzQzc2RjAwNzUKLToxMDRFMDAwMDkxMDRBRTlFRERFMDAwQUYxQTAwQzMxQTZFRTEwNTJEREQKLToxMDRFMTAwMEIyMDAwREVEMEMxRURGMkQwOEQ4MUMwNjMzMDNBRTg4NDIKLToxMDRFMjAwMDJBODQ4QjJFQjAyRTI3ODQ4QzAzRUUwMTBGRUUwMjJFRTcKLToxMDRFMzAwMEI0MkU1ODAxOEY2M0ZFRkYyOTMxMDgyOTI1MDQyODMwM0MKLToxMDRFNDAwMDE0MkUzMTA5QjA4ODY0ODBBMzJFMjQwQUMwODEyRTMwMkMKLToxMDRFNTAwMDE2MkNCNDIzMkUyNDBCQjRFRjJGMjQwQzhDMzc4QjM2NTYKLToxMDRFNjAwMDI5MjUwNERFQjBERkMwMEM4RjM5MEI4RTM5MEZFRTAyMUUKLToxMDRFNzAwMDY0RUVDNDA4OUYxMTAxQzQwNDhEMzgwQ0I4MTgwMEM0MzYKLToxMDRFODAwMDA0MENCRTE4MDBFRTExMEVERDAyQzBFMzBFRkYwMjFFODAKLToxMDRFOTAwMERGMDE5RjcxOUU3MDFFREYwMDhGMjA5ODczOUQ3NDA1NDcKLToxMDRFQTAwMEZGMTEwQkNENTNDMTgwOTg3NTBGREQwMjBFREQwMjlEMDEKLToxMDRFQjAwMDcyMUVERUJGMkEyNDY2MkY2MjlEMkFFNEEyMkZGQzE4RjAKLToxMDRFQzAwMDJGNjY5RDYzRkU3MTAwMDAwMDJGMzAxMjFCREYwMTAwNzIKLToxMDRFRDAwMEZBMzI3OEZGMDUwQjk4MEIyQTg0N0Y2NkQwMDUwQjlBNkYKLToxMDRFRTAwMDBCMkRBNDgwMkEzMDExMDBBQTMyNjNGRjQ0MkYyNDBBMUMKLToxMDRFRjAwMDlFMkI2M0ZGNTZDQzU3REEyMERCMzBEQzQwNTgwNzE1NzkKLToxMDRGMDAwMEMwMjBEMTBGMDBEQTIwQzBCNjU4MDdBNDYzRkZFNTAwMjcKLToxMDRGMTAwMERBNzA1ODA2M0FDMEEwMkEyNDY2NjNGRTAyREEyMDU4RTYKLToxMDRGMjAwMDA3OUY2M0ZGQ0ZCMTY5MjgyMDBBODYyMDA5MDk0Nzk5QTYKLToxMDRGMzAwMDExMjkyNDA3OTgxMDdGODEyNjkzRTAyN0U1MEE5QUUzMzgKLToxMDRGNDAwMDg4MTA5REUxMTlERUREOEQxMTA5NkYwMjlGRTQyREU0Q0IKLToxMDRGNTAwMDE2MDk4ODAyQzBEMzk4RTIyQTI0MDc2M0ZFNTEwMDAwOTQKLToxMDRGNjAwMDFEREVBNjA4NjgxMThGMTE4OTJCOTNFMDA4RkYwMkMwOEYKLToxMDRGNzAwMDhGOUZFNTBEOTkwMjk5RTIwNDdGMTFDMEQ0OURFMTA4NEQKLToxMDRGODAwMEZGMDI5RkU0NjNGRkQwMDA2QzEwMDRDMDIwRDEwRjAwMkIKLToxMDRGOTAwMDZDMTAwNDg1MjEwRDM4MTExNERFODQ4NjIyQTQyNDA4QTcKLToxMDRGQTAwMDY2MEM5NjIyMDUzMzBCOTMyMTc0M0IxM0M4NjJEMjMwRjIKLToxMDRGQjAwMEQxMEZDMDMwQkMyOTk5MjE5OTIwOTMyMkQyMzBEMTBGMzIKLToxMDRGQzAwMDIzM0RGODkzMjE2M0ZGRTM2QzEwMEFENjIwOTQxODE3NTEKLToxMDRGRDAwMERFNzlEOTMwQjgzODk4MTk5OTE0NjU1MjUyQzBFMUQyQTcKLToxMDRGRTAwMEUwMkU2MTAyMURERTc2MEUwRTRDNjVFMTYyOEYzMDhFODIKLToxMDRGRjAwMDE5MEY2RjUxMkZGQ0ZENjVGMTU1OEVFMTI5RDAyMzBFNUQKLToxMDUwMDAwMDhGNTA3N0U2NkI4RjE4MUVERUIzQjBGRjBGRjQxMTBGRDEKLToxMDUwMTAwMDFGMTQ2NTkwQ0UxOERFQjA4QzYwQThDQ0MwQjExOURFMkMKLToxMDUwMjAwMDY0Mjg2MDBCMDlDQzBCMEQ4ODA5Mjk4MTFDMjg4MTFBODIKLToxMDUwMzAwMDJBMEEwMDA5ODgwQzA4QkEzODFCREVBNjBDQTkwQTI5MUUKLToxMDUwNDAwMDkyOTQ3QjlCMDI2MDAwOEMyQjYwMEM5NDE2MENCRDExMUIKLToxMDUwNTAwMEE3REQyOUQyODZCODQ4Nzk4MzAyNjAwMEQyMTlERTU2Q0UKLToxMDUwNjAwMDA5QjgwQTI4ODJBMzk4MTc2ODgwMDI2MDAwQTM2MDAwMkMKLToxMDUwNzAwMEE1MUFERTlBODQxODBBRUUwMUNBOTgxQkRFNEQ4QzE5MTcKLToxMDUwODAwMDJCQjAwMDhDQzA2RUIzMTMxRERFNEEwQzFDNTIwRENDMkQKLToxMDUwOTAwMDBCMkRDMjk1QzBBMTdFREJBRTYwMDAzODBDMEM1MzYwQjYKLToxMDUwQTAwMDAwMDkwMDAwMDAxOERFOEM4QzYwQThDQ0MwQjExOURFQUQKLToxMDUwQjAwMDQwMjg2MDBCMDlDQzBCMEQ4ODA5Mjk4MTFDMjg4MTFBMTYKLToxMDUwQzAwMDJBMEEwMDA5ODgwQzA4QkEzODBDQTkwQTI5OTI5NDdFODkKLToxMDUwRDAwMDkzMDI2M0ZGNzJEQTYwQzBCQTU4MDczMDY0NTA3MzYwOUQKLToxMDUwRTAwMDAyNjYwMDAwMUFERTMzOEMxOTJBQTAwMDhDQzA2RUEzNjEKLToxMDUwRjAwMDFBMThERTJGMEMxQzUyMDhDQzBCMThERTc2MkJDMjk1MkEKLToxMDUxMDAwMEMwQTE3OEIzMDI2M0ZGM0Y2M0ZGQzkwMDBDMEM1MzYzNzcKLToxMDUxMTAwMEZGMDk4OTYwNzg5OTE4MjlEMjg1Qzk5MjJCNzI5RTFENDIKLToxMDUxMjAwMERFMjQ2RUI4MjMyREQyMjY5OTEzNjlEMDBCNjAwMDBEQjIKLToxMDUxMzAwMERBNjA1ODA3MUE2MDAwMTcwMDg4NjA3RDg5MEE5QTFBOTkKLToxMDUxNDAwMDI5NzI5RDlDMTI5OTE1Q0Y5NURBNjBDMEI2NTgwNzEzNDUKLToxMDUxNTAwMDY1NTFGNThEMTQ4QzE4REJEMDhERDAwNjZBMDIwRDZENkIKLToxMDUxNjAwMDUxNTgwNTg0RDNBMDlBMTQ2NEExREQ4MkEwODVBMUI4MEEKLToxMDUxNzAwMEFGOUYxOTA1MDU0NzAyMDI0Nzk1MThDMDUxNjNGRTYwQUQKLToxMDUxODAwMDJCNjEwNEMwOEM4OTMxQzBBMDA5Rjk1MDA5OEEzODZFOUUKLToxMDUxOTAwMEI4MUYyQzYwNjZBMkNDMEMwQzQ3MkM2NDY2N0NBQjExNEIKLToxMDUxQTAwMDlGMTE5RTFCOEExNTU4MDU5NThFMUI4RjExQzBBMDJBMzIKLToxMDUxQjAwMDY0NjY5RjExNjRGMEUxMjkxMjAzMjgxMjA5NkRGOTE3NDIKLToxMDUxQzAwMDJGODEwMzAwOTA4REFFRkUwMDgwODg5RjkyMDA5MDhDMEUKLToxMDUxRDAwMDAwODA4OEI4OTkwMDkwOEM2NTUxNEU4QTEwODUxQThCOTIKLToxMDUxRTAwMDMwMUZERTA2ODgxMjI5NjAwNzA4NTgwQTJDODI5NDJEODkKLToxMDUxRjAwMDYxMDQwRUNDMEMyQzg2OTQ2RkRCM0MxQ0RFMzBBQzlDMjYKLToxMDUyMDAwMDI5QzA4MDBCNUQ1MEEyOTkwOTA5NDcyOUM0ODA2NUQwNDcKLToxMDUyMTAwMERBMkU2MDBDQzBEMDFGRERFRjBDRTgxMUFGRUVBNzg4Q0UKLToxMDUyMjAwMDIyODI4NTJERTRDRjAyNDIwQjIyODY4NUQyQTBEMTBGQTcKLToxMDUyMzAwMDhFMzAwRTBFNDc2M0ZEQTZBMjlDMEMwQzQ3MkM2NDA3MTMKLToxMDUyNDAwMDdBQjZDRDhCNjAyRTYwMEEyODBBRkYwOEU4MEM2NDgxQ0MKLToxMDUyNTAwMDBFMThERTE5ODMxNjgyMTNCMzM5MDIzMzBCMkMzNDE2NjEKLToxMDUyNjAwMDJEMzUwQUMwMjM5MjMxOUYzMEMwMjA5MjMzMDhCMjAyRkMKLToxMDUyNzAwMDA4RTgwMjkyMzQ5ODMyQzA4MDI4NjQwNzJCNjAwQ0QyNzAKLToxMDUyODAwMEEwMUNEREQ0MENCRTExQTdFRTJERTI4NUFDQkIyOEI0NkEKLToxMDUyOTAwMENGMEQ5RDBCMkRFNjg1RDEwRjhCMTg4ODEzOEQzMEI4NUYKLToxMDUyQTAwMDhDMEQ4RjQ3MEQ0OTUwQjQ5OTA0OTkxMDBEMEQ1RjA0NzIKLToxMDUyQjAwMEREMTAwOUZGMDI5RjgwMERCQjAyOUI4MTY1NTA4RDg1MkIKLToxMDUyQzAwMDFBQjgzQUMwRjFDMDgwMENGODM4MDgwODQyNjQ4MDZCMDQKLToxMDUyRDAwMDFCRERCNTE5RERCNjI5QjY3RThEMThCMERENkREQTA1OUEKLToxMDUyRTAwMDAwQTA4ODAwQzA4Q0MwQTA2M0ZFRjMwMDgyMTM4QjE2NjAKLToxMDUyRjAwMDFERERDNjI4NjAwQUMwRTAyRUM0ODAwRDg4MDIwMkIyRkYKLToxMDUzMDAwMDBCOTkyMzlGMjBDMEQyOTgyMjlEMjEyMjYwMENCMkJCMTIKLToxMDUzMTAwMDBDMkQxMUE3REQyOEQyODUwOEJCMEIxOEREQUUyQkQ2Q0UKLToxMDUzMjAwMDg1QTgyMjJFMjRDRkQyQTBEMTBGOUUxQjg1MUEyQTZDQ0QKLToxMDUzMzAwMDc0OEIxODVCRkYxNzhFMUI2M0ZFQTMwMEMwODdDMDkwQTEKLToxMDUzNDAwMDBBRjkzODc5ODA5MjYzRkY4NkMwMjBEMTBGOUUxQjJBMEMKLToxMDUzNTAwMDZDNzRDMEIxOEQxODU4MDUzOThFMUI4NTFBNjNGRTdFOUEKLToxMDUzNjAwMDg4NkI4MjEzODkxNjA4QkUxMTBFQ0UwMjAyOTIwQjlFMjQKLToxMDUzNzAwMDI1QjQ5OTFFRERBMTlGMjAwRTg4MDI5ODIyQzBFRjA0NUIKLToxMDUzODAwMEQ4MTEwRTg4MDI5ODI0QzBFNDlFMjFDMDgwRDJBMDJCQTAKLToxMDUzOTAwMDYwMEMyODY0MDcxQ0REOEYwQ0JFMTFBN0VFMkRFMjg1ODIKLToxMDUzQTAwMEFDQkIyOEI0Q0YwRDlEMEIyREU2ODVEMTBGMDAwMDAwQkUKLToxMDUzQjAwMDZDMTAwNEMwMjBEMTBGMDA2QzEwMDQ4NjMzQzA3MUMwODMKLToxMDUzQzAwMDMwNjAwMDAxQjEzMzAwMzEwNDAwNzQxQTA0NjIwMTc0Q0EKLToxMDUzRDAwMDYwRjFEMTBGNkMxMDA0MDIyQTAyMDMzQjAyNUJGRkY2NUUKLToxMDUzRTAwMDFDREQ3NzFCRERCRkM3OUY4OEIwMDlBOTAzMDk4QTAxQUYKLToxMDUzRjAwMDlBQjA3OTgwMUVDMEYwMEZFNDMxMURERDZFMDAwMjAwMEUKLToxMDU0MDAwMDJCRDI4MjFFRERCODJBQzEwMjBFQkIwMjJCRDY4MjBBMjUKLToxMDU0MTAwMEU0MzFEMTBGMjhDMTAyQzE5MDA5ODgwMjA4MDg0RjI4NDEKLToxMDU0MjAwMEM1MDIwOEU0MzFEMTBGMDA2QzEwMDRDMEMwMENFNDMxOTcKLToxMDU0MzAwMDEyREQ2MzFBREQ2MDAwMDIwMDI5QTI4MjE4RERBQzFCQjgKLToxMDU0NDAwMEREQUEyNjIxMDIwQjk5MDEwODY2MDEyOUE2ODIyNjI1REMKLToxMDU0NTAwMDAyMDZFNDMxMTREREE3MTVEREEyMjM2QTkwMjMyNjEyOEIKLToxMDU0NjAwMDg1NTAyNDI2MTEyNTI2MTMyMjJDNDBEMTBGMDAwMDAwNDAKLToxMDU0NzAwMDZDMTAwOEQ2MTAyQjBBNjQyOTFBQjQxQURENEQwRDIzQkUKLToxMDU0ODAwMDExMUNERDRFMEYyNTExQjgxODk4MTMwRTU1MTExOEREOUIKLToxMDU0OTAwMDk5QUM1NUE4MzhBQTMzMkM4MEZGMkE4MEZFQTkzMzI4NUUKLToxMDU0QTAwMDhEMDEyOTgwMDEwOEFBMTEyODgwMDAwQ0FBMDIwODg4MTEKLToxMDU0QjAwMDExMDk4ODAyMDhBQTFDMjg4QzA4MjgxNjA0NTgwODYyQkEKLToxMDU0QzAwMDE0REQzRjBBQTcwMjI0NDExNjJBMzA4MDJCMTIwNDA3NUMKLToxMDU0RDAwMEFBMjg1ODA4NURCMTMzOEIxM0I0NTU5QTYwMDRBQzI4RTAKLToxMDU0RTAwMEI0NjYyQzU2Mjc3QjY5RTAxNkRENzY5NDEyQzA1MEMwNTYKLToxMDU0RjAwMEQwMTdERDMyOUQxNUQzNzBENDEwMkY2MDgwMkU2MDgyQkUKLToxMDU1MDAwMDlGMTY5RTE3ODgxNjcyODkxQThEMTI4QzQwMkE2MDdGMEEKLToxMDU1MTAwMDBEQ0MyODJCM0EyMDBDQUEyODU4MDg0QkMwQjEwQUJFNDMKLToxMDU1MjAwMDM3MkUzNTQwOEYxNzcyRjkxQThEMTI4QzQwMkE2MDgxMDAKLToxMDU1MzAwMDBEQ0MyODJCM0EyMDBDQUEyODU4MDg0M0MwQjEwQUJFMkIKLToxMDU1NDAwMDM3MkUzNTQyQjIzM0I0NDRCMTU1Njk1MkI2QjQ2NkMwNTEKLToxMDU1NTAwMDUwOEYxNUI4NzdEMzcwQjJGRjlGMTU2RUY4OTlEMTBGQTEKLToxMDU1NjAwMDZDMTAwNEMwMjFEMTBGMDA2QzEwMDQyNzBBMDAxQ0RENTAKLToxMDU1NzAwMDExMUZERDIyMUVERDI1MURERDBFMUFERDUwMUJERDVFMzcKLToxMDU1ODAwMEMwMjgyNEIwMDA2RDJBNzVBQTQ4Mjg4MDgwQzA5MTY0ODQKLToxMDU1OTAwMDgwNjEwMDQxMDQxNUREMDlDMDMxMjU1MDJFMDAzNjFBMDYKLToxMDU1QTAwMDA2NTUwMTA1OTUzOTBDNTYxMTBDNjYwODI5NjI5NjZFNTAKLToxMDU1QjAwMDk3NEQwRDU5MEEyOTkyMjQ2ODkwMDgxMkRENDIwMjQyNDMKLToxMDU1QzAwMDA4NzI5OTNCMjM2Mjk1MTJERDA2Q0IzNDlGMzAwMjgyMkMKLToxMDU1RDAwMDAyMEU0NDAyQzA5Mjk5MzE5NDMyOTIzM0FENTIyNDYyNDkKLToxMDU1RTAwMDk1QzA5MDI0NEMxMDI0NjY5NTI0QjAwMDI5MjRBMEFBQ0MKLToxMDU1RjAwMDQyMjkyNDgwQjE3N0IxNDQwNDA0NDIyNEI0MDBEMTBGN0QKLToxMDU2MDAwMEQxMEZEMTBGNkMxMDA0MUFEQ0VBMkFBMDAwNTgwMjFDM0EKLToxMDU2MTAwMDVCRkZENTAyMkEwMjAzM0IwMjVCRkZEMTFCRENFOEM5MUEKLToxMDU2MjAwMEExMkNCMTAyQzBENDBEQ0MwMjBDMEM0RjJDQjUwMjBDMzUKLToxMDU2MzAwMEU0MzFEMTBGQzBBMDBBRTQzMTE4RENERTAwMDIwMDJGRjMKLToxMDU2NDAwMDgyODIxOURDRjEyRUIxMDIwOUZGMDIyRjg2ODIwRUU0NUMKLToxMDU2NTAwMDMxRDEwRjAwNkMxMDA0QzAyMDAyRTQzMTE0RENEODE2RTQKLToxMDU2NjAwMERDRDUwMDAyMDAyMjYyODIyMzQxMDI3MzJGMDYwM0U0OEMKLToxMDU2NzAwMDMxQzAyMEQxMEYxOUREMjIxQUREMjEyODQxMDIwQTJBNkEKLToxMDU2ODAwMDAxMDk4ODAxMkE2NjgyMjg0NTAyMDhFNDMxMTVERDE4REYKLToxMDU2OTAwMDEyREQxRDI1NDYxREQxMEY2QzEwMDQyOTIwMDYyODlDMDMKLToxMDU2QTAwMEY5NjQ4MEEwMkE5Q0ZENjVBMDk2OEEyODhEMjYyRjBBODEKLToxMDU2QjAwMDA4N0FEOTA0MkIyMjFGQzhCRDJDMjA2NDY0QzA4MTJFMTcKLToxMDU2QzAwMDIyMDkwRUFFMEM2NkUwNzgyQjIwMEMxRURDQkEwQ0JDNTYKLToxMDU2RDAwMDExQUVDQzI4QzI4NjE5RENCODc4RjMwMjYwMDBBRDA5OUYKLToxMDU2RTAwMEI5MEEyOTkyQTM2ODkwMDgyRTIyMDAwOUVFMEM2NUUwMDEKLToxMDU2RjAwMDlCMjlDMjg1MUZEQ0MyNjQ5MDkyOUY5MEMwRTQxRkRDOEUKLToxMDU3MDAwMENFOUU5MTI4MjAwQUMwRTA5RTkzMEY4ODAyOTg5Mjg4MkUKLToxMDU3MTAwMDIwMEY4ODAyOTg5NDJGMjAwNzlBOTc5RDk2MkY5NTBBMUMKLToxMDU3MjAwMDJFMjQwNzI4MjAwNjI5MjA2NDY4ODMzMzI4QzI4NTEyODYKLToxMDU3MzAwMERDQTkyODhDMjBBMkIyMkUyNENGMjhDNjg1QzAyMEQxNzcKLToxMDU3NDAwMDBGQzAyMEQxMEYyQTIwNkEwMTExMDIwQTJBNDE2NUFGMzkKLToxMDU3NTAwMDUyREEyMEMwQjA1ODA1RTQ2NEFGRTVDMDIxRDEwRjAwOTMKLToxMDU3NjAwMDY0OUZDODFGREM5NjJEMjAxNjhGRjIwOUREMEMwMEYxMTYKLToxMDU3NzAwMDA0MDBERDFBQURBRDlEMjkxMkRDOTcyOEMyODVBMkIyQzYKLToxMDU3ODAwMDJFMjRDRjI4OEMyMDI4QzY4NUMwMjBEMTBGQzAyMUQxM0YKLToxMDU3OTAwMDBGMDAwMDAwNkMxMDA0MjYwQTAwMUJEQ0RCMTVEQzg3MDAKLToxMDU3QTAwMDI4MjA2NTE3REM4NDI4OENGRTY0ODA5NDBDNEQxMTBEMzQKLToxMDU3QjAwMEJEMDgyQ0QyRjUyQkQyRjQyRUQyRjc3Q0IxM0RCNEJCNzAKLToxMDU3QzAwMDJCRDZGNDdCRTkwNTJCRDJGNjJCRDZGNDdDQjkyQzJBMDgKLToxMDU3RDAwMEQyRjYyQUQ2RjUyQUQ2RjQwNkU0MzEwMDAyMDAyODcyNjEKLToxMDU3RTAwMDgyMkFGQUZGMDA0MTA0MjkwQTAxMkY1MTAyMDA5OTFBNjYKLToxMDU3RjAwMDBBOTkwMzA5ODgwMTI4NzY4MjBGRTQzMTI2MjQ2NTJCNTMKLToxMDU4MDAwMEQyRjQ4RTVBMkNEMkY1QjBFRTlFNUE3QkNCMTYyOUQyMEEKLToxMDU4MTAwMEY2MkZEMkY3MENCODBDMDlGRjBDMDhGRjBDMEYyRjE0NTEKLToxMDU4MjAwMEM4Rjk2MDAwMzIwQkNBMEMwQTJBMTRDRUE5MkI1MTAyMDcKLToxMDU4MzAwMEMwQzIwQ0JCMDIwQjBCNEYyQjU1MDIwQkU0MzFEMTBGMzYKLToxMDU4NDAwMDAwREIzMERBMjA1QkZGOTQxQkRDQjA2NEFGNUQwQzRERjUKLToxMDU4NTAwMDExQURCRDYzRkZBODAwMDAwNkU0MzEwMDAyMDAyRjcyMDUKLToxMDU4NjAwMDgyMThEQzZFMkU1MTAyMDhGRjAyMkY3NjgyMEVFNDMxODAKLToxMDU4NzAwMEQxMEYwMDAwNkMxMDA0QzAzMDAzRTQzMTE2REM0RTE1NkIKLToxMDU4ODAwMERDNEYwMDAyMDAyNDYyODI3NDQ3MjExOERDQTA4NzVBOTIKLToxMDU4OTAwMDA4NDgwMTI4NjY4MkNENzMxOURDOUUwQzJBMTFBQTk5NEEKLToxMDU4QTAwMDIyOTI4MzI5OTI4NDcyOTEwMzgyMjBDQzI5MkI1MTAyNjcKLToxMDU4QjAwMDBCRTQzMUMwMjBEMTBGMDAxRkRDOTcyRTUxMDIwRkVFRjgKLToxMDU4QzAwMDAxMkU1NTAyMEVFNDMxQjAyREIxN0M5QzVBMTJEQzkyQUYKLToxMDU4RDAwMDA4REQxMTJENTYxOUQxMEY2QzEwMDYxQkRDMzUxRURDQUUKLToxMDU4RTAwMDM3MjJCMDAwMUFEQzhFNkYyMzcyMUREQzc1QzA0ODE4OTkKLToxMDU4RjAwMERDOEQxRkRDOEJEQzEwRDVDMDgzRjAwMDgwODYwMDUwNkYKLToxMDU5MDAwMDhBNkQ0QTRGMEYzNTExMEQzNDA5MjQ0MDgwMEI1NjBBMTkKLToxMDU5MTAwMDI5NjI5NEIxMzMwRTU1MDkyMjUxNDAwRjQ0MTEwQzQ0QjEKLToxMDU5MjAwMDBBODc0MDA5QTgwQzAyODgzNjIyNTE0MTA3ODgzNjA4QTgKLToxMDU5MzAwMDc3MENBODk5Mjk2Njk0OTc0MDI5NjI5NTg3NDEwOUE4MTAKLToxMDU5NDAwMDBDMDI4ODM2MDc4ODM2MDg3NzBDQTg5OTI5NjY5NTk3M0YKLToxMDU5NTAwMDQxMDMwMzQyQjEzODA4MDg0Mjk4RjBEMTBGMUNEQzcyQjEKLToxMDU5NjAwMDEzREM3MzI3QjAwMDIzMzJCNTY0NzA1N0MwOTFDMEQwRTgKLToxMDU5NzAwMDE2REM3MTE1REM2RkMwNDAyQUMwMDAwMzg4NDMyOEM0QzAKLToxMDU5ODAwMDAwNkQ3OTNDMDA0MTA0QjE0NDAwOTcxQTc3ODAxNDhFNzEKLToxMDU5OTAwMDUwMkZCMjk1MkRCNjk1QUZFRTJFRUQyMDA2RUUzNjlFMjkKLToxMDU5QTAwMDUwNjAwMDE4NzdBMDA5ODM1MDlENTAyM0I2OTU2MDAwODEKLToxMDU5QjAwMDAyMjNCMjk1MjIzRDIwMDYyMjM2MjJCNjk1QjQ1NUI4NzAKLToxMDU5QzAwMEJCRDEwRjAwMDM4ODQzMjhDNDAwRDEwRjZDMTAwNEMwNjIKLToxMDU5RDAwMDQwMDRFNDMxMTVEQzU5MDAwMjAwODg1MDEzREM1OENCMzgKLToxMDU5RTAwMDgxNUJGRkJEMUNEQzU3MEMyRDExQURDQzJCQzI4MjJBNzQKLToxMDU5RjAwMEMyODM5NDUwN0JBQjE0MkVDMjg0MjlDMjg1MEFCRDBDOEQKLToxMDVBMDAwMDBFOTkwQzBEOTkwQzA5MjkxNDYwMDAwNTBCQTkwQzA5QkQKLToxMDVBMTAwMDI5MTQ5OTMwMTVEQkVBMkE1MTAyMEFFNDMxMkEyQ0ZDQjgKLToxMDVBMjAwMDU4MDA0QjJCMzIwMDBBQTIwMjJCQkNGRjlCMzBDQ0I2OTUKLToxMDVBMzAwMEM4QTREMkEwRDEwRjAwMDAwNEU0MzExRURCREUwMDAyQjYKLToxMDVBNDAwMDAwMkRFMjgyMkZCQUZGMkM1MTAyMEZERDAxMkRFNjgyREMKLToxMDVBNTAwMDBDRTQzMUQxMEYwMDAwMDA2QzEwMDREMTBGMDAwMDAwRTUKLToxMDVBNjAwMDZDMTAwNEMwMjBEMTBGMDA2QzEwMDQxM0RDMzZDMEQxQzAKLToxMDVBNzAwMDAzMjMwOTIzMzE4REMwQTA2RjM0MDI2MDAwOEQxOURCMzAKLToxMDVBODAwMENEMUJEQkNFMTdEQzJGMEMyODExQTg3NzI2NzI4MzI1QkYKLToxMDVBOTAwMDcyODIyQ0ZBRkY3NjUxNDc4ODUwMkU3Mjg1MjU1QzA0NUQKLToxMDVBQTAwMDI1NzY4Mjc1RTkwNTI1NzI4NDI1NzY4Mjc2NTkyOTJFMTgKLToxMDVBQjAwMDcyODQyRTc2ODIyRTc2ODMwQUU0MzEwMDAyMDAyMzkyQ0QKLToxMDVBQzAwMDgyMDAyMTA0MkZCMTAyMDBENjFBMEM2NjAzMDYzMzAxQUUKLToxMDVBRDAwMDIzOTY4MjBGRTQzMTI2NzI4MzI1NzI4MjYwMDAwMjAwRDEKLToxMDVBRTAwMEQ4QTA3NjU5MjIwQUU0MzEwMDAyMDAyMzkyODIwMDIxRDQKLToxMDVBRjAwMDA0MDBEMjFBMkZCMTAyMEMyMjAzMDIzMjAxMjI5NjgyMzQKLToxMDVCMDAwMDBGRTQzMUQyODBEMTBGMDBEMjgwRDEwRkMwMjBEMTBGNEQKLToxMDVCMTAwMDZDMTAwNERCMzA4NjIwMTVEQkE2MjgwQTAwMjgyNTAyM0QKLToxMDVCMjAwMERBMjAyOEIwMDAyQ0IwMDcwNTg4MEEyODgyNEMyRDBBRkMKLToxMDVCMzAwMDAxMEI4MDAwREJBMDY1QUZFNjFBREI5RjBBNEEwQTI5NDkKLToxMDVCNDAwMEEyQTNDN0JGNzY5MTAxRDEwRjJCQTZBM0QxMEYwMDAwNEUKLToxMDVCNTAwMDZDMTAwNEMwRDFDN0NGMUJEQjk5MTlEQjk2MTdEQjk0RkYKLToxMDVCNjAwMDBDMjgxMUE4Nzc4Njc1ODU3NEMwQTA3NjUxNjI4ODUwN0MKLToxMDVCNzAwMDhFNzdCNDU1OTU3NDc1RTkwMzg1NzY5NTc0NzY1OTI3QjMKLToxMDVCODAwMDhGNzY5Rjc1OUY3NDBBRTQzMTAwMDIwMDIzOTI4MkI0REQKLToxMDVCOTAwMDJFMkZCMTAyMDBFMTA0MDBENjFBMEM2NjAzMDYzMzAxNzEKLToxMDVCQTAwMDIzOTY4MjBGRTQzMTg2NzU4Mzc0NzYzOTI4MEFFNDMxQUUKLToxMDVCQjAwMDAwMDIwMDJFOTI4MkI0MjIwMDIxMDQyNEIxMDIwMERGRjAKLToxMDVCQzAwMDFBMENGRjAzMEZFRTAxMkU5NjgyMDRFNDMxRDI4MEQxMkQKLToxMDVCRDAwMDBGRDhBMDc2NTFENkQyODBEMTBGMDAwMDZDMTAwNDI5QzYKLToxMDVCRTAwMDBBODAxRURCOUExRkRCOUExQ0RCNzMwQzJCMTFBQ0JCRUIKLToxMDVCRjAwMDJDMkNGQzJEQjI4NTBGQ0MwMjlFRDE5Q0QwQzA1MUMwNjQKLToxMDVDMDAwMDcwMTNEQjk2MTREQjk1MThEQjkzMkFCMjg1QTgyODA0NjEKLToxMDVDMTAwMDI0MEEyMzQ2OTFBOTg2QjhBQTJBQjY4NUE5ODgyNzg0OEEKLToxMDVDMjAwMDlGMjU2NDlGRDEwRjAwMDA2QzEwMDQxOURCQzcwQzJBNUMKLToxMDVDMzAwMDExQTlBOTg5OTBDNDg0Nzk4Qjc2MUJEQkI1QUJBQzJBRkEKLToxMDVDNDAwMEMyODMyQ0MyODQ3QUMxNjg4QUEwMkJCQzMwRDNBMDY0RTIKLToxMDVDNTAwMEEwNUUwQjJCMEEyQ0IyQTMxOURCN0Y2OEMwMDcxRERCRUIKLToxMDVDNjAwMEJCRDMwRjdEQzk0QUE5MjkyOTlEMDEyOTkwMUY2ODkxOUQKLToxMDVDNzAwMDMyNzBBNjAzRDNBMENBOUU2ODkyMTBDN0FGMkFCNkEzRkIKLToxMDVDODAwMDJBMkNGQzVCRkZCM0QyMzBEMTBGMDAwMDEzREJCMTAzMzEKLToxMDVDOTAwMEEzMDE4QzMxMUREQjUxMEM4QzE0MERDQzAxMkNCNkEzNEYKLToxMDVDQTAwMDYzRkZEQzAwQzAyMEQxMEZEQTIwNUJGRkNDQzAyMEQxMjUKLToxMDVDQjAwMDBGQzAyMEQxMEYwMDAwMDA2QzEwMDREQjMwQzBEMDE5RTEKLToxMDVDQzAwMERCM0NEQTIwMjgzMDAwMjIzMDA3MDg0ODEyMDk4ODBBMTUKLToxMDVDRDAwMDI4ODI0Q0RDMjAwQjgwMDAxQkRCMzcwQzRBMTFBQkFBNUUKLToxMDVDRTAwMDI5QTI4NDA5MjkwQjI5QTY4NEQxMEYwMDZDMTAwNEMwQjUKLToxMDVDRjAwMDQxMThEQjMwMTdEQjMyMEMyNjExQTcyNzI3NzAzMEE4OUMKLToxMDVEMDAwMDY2MjU2Mjg2MDA3MTA0QTM1NTAwNDQxQTc1NDE0ODIyMzUKLToxMDVEMTAwMDYyODQxNURCNTIwMjMyMEJDOTIyODgyMTE3REIyRjA4NUYKLToxMDVEMjAwMDg0MTQwNzQ0MDE3NTQ5MDVDODM0QzAyMEQxMEZEMTBGMzAKLToxMDVEMzAwMDA4MDk0NzFEREI4NkMwQjI4RTIwMUZEQjFEMEUwRTQzRjcKLToxMDVENDAwMEFGRUMyQkM0QTAwRkVFMEEyREU2MjQyQTYyODRDMDIwRkIKLToxMDVENTAwMDBBOTkwQjI5NjY4NEQxMEZDMDIwRDEwRjZDMTAwNERCODcKLToxMDVENjAwMDMwQzBEMDE4REIxM0RBMjAyNTMwMDAyMjMwMDcwODU4NjUKLToxMDVENzAwMDBBMjg4MjRDREMyMDBCODAwMDg5MzE3MDlFMTIxQkRCQ0MKLToxMDVEODAwMDBEMEM0QTExQUJBQTI5QTI4NDA5MjkwQjI5QTY4NEQxOUEKLToxMDVEOTAwMDBGMDlDOTUyNjg1MzI2MDA5MTA0MThEQjA4QzBBMTJGQ0YKLToxMDVEQTAwMDgxMTIwMEFBMUEwQUZGMDIyRjg1MTIxRURCMDIwQzRENzcKLToxMDVEQjAwMDExQUVERDJDRDI4NDBDMkMwQjJDRDY4NEQxMEZDMDgxREIKLToxMDVEQzAwMDFGREFGRkI4OUEwQTBBNDcyRUYxMTIwMEExMDQwMDg4RDAKLToxMDVERDAwMDFBMDhFRTAyMkVGNTEyMUREQUY3MEM0QzExQURDQzJCODEKLToxMDVERTAwMEMyODQwQjJCMEIyQkM2ODREMTBGMDAwMDZDMTAwNERCN0MKLToxMDVERjAwMDMwQzBEMDE5REFFRkRBMjAyODMwMDAyMjMwMDcwOTg4QzUKLToxMDVFMDAwMDBBMjg4MjRDREMyMDBCODAwMDFDREFFQTBDNEIxMUFDMTcKLToxMDVFMTAwMEJCMkFCMjg0MEEyQTBCMkFCNjg0RDEwRjZDMTAwNEMwQTQKLToxMDVFMjAwMDQxMThEQUU0MTZEQUU2MEMyNzExQTYyNjI2NjAzMEE4MTcKLToxMDVFMzAwMDcyMjUyMjg2MDA2MTA0QTM1NTAwNDQxQTc1NDEwODIyODgKLToxMDVFNDAwMDIyODQwMjMyMEJEMTBGMDBDMDIwRDEwRjZDMTAwNDE1MzgKLToxMDVFNTAwMERCNDEwMjQ5MTQyOTU2MTEyNDUyMTIwMjA4NDMwRjg4Q0IKLToxMDVFNjAwMDExQzA3MzAwODEwNDAwMzYxQTAwODEwNEM3OEYwMDc3QzcKLToxMDVFNzAwMDFBMDg3NzAzMDc0NDAxMDY0NDAyMjQ1NjEyRDEwRjAwODIKLToxMDVFODAwMDZDMTAwNjZFMjMwMjYwMDBBQzY0MjBBN0MwQTA4NTEwRDEKLToxMDVFOTAwMDEzREIxOTE2REIzMEMwNDBBNkFBMkJBMkFFMEIxOTQxQUEKLToxMDVFQTAwMDY0OTA2NjY4OTE1RDY4OTI1MjY4OTMzQzJBQTJBQTI4MjEKLToxMDVFQjAwMDNDN0YyODhDN0YwQTBBNEQyOTgwMDEyODgwMDAyQUFDNkIKLToxMDVFQzAwMEYyMDg4ODExMDk4ODAyNzU4OTQ2MkIzRDAxMjlCMDAwMjYKLToxMDVFRDAwMDJCQjAwMTA4OTkxMTBCOTkwMjdBOTkzNEI4MzMyQTJBMDgKLToxMDVFRTAwMDAwQjE0NDcyNDlCMTYwMDA0QTdGQkYwNzE1REIxQjYzRjQKLToxMDVFRjAwMEZGQjkwMDAwMjUzQUU4NjNGRkIxMDAwMDI1M0FFODYzRTYKLToxMDVGMDAwMEZGQTkwMDAwMjUwQTY0NjNGRkExQzA1QTYzRkY5QzAwM0IKLToxMDVGMTAwMDAwNzA1RjA4MjUzNEZGMDU4QzE0MkMzNEZFNzBBRjBCMjUKLToxMDVGMjAwMDBBOEQxNDJFM0QwMTJBRTQwMTJERTQwMERBNDA1QkZEQzgKLToxMDVGMzAwMDUwNjNGRkE3RDEwRkQxMEY2QzEwMDQxQURBQTAxOURBNDEKLToxMDVGNDAwMDlEMUNEQjA2MUJEQjA3QzA4MEMwNzE2MDAwMEQwMDAwREMKLToxMDVGNTAwMDAwMjJBNDMwQjFBQTI5OUMxMDdCOTE1RjI2OTI4Njc5RjkKLToxMDVGNjAwMEMyMTU2RTYyNjJDMDIwNkQwODBBQjEyMjAwMjEwNDAwRDEKLToxMDVGNzAwMDc0MUE3NjRCREI2M0ZGRUUyMjkyODUwRDYzMTEwMzI1QzUKLToxMDVGODAwMDE0NjQ1RkNGRDY1MDAzMkQ0MzZERDkwMzk4MjBCNDIyRkIKLToxMDVGOTAwMDA2NDQxNDZENDkyMjk4MjA5ODIxOTgyMjk4MjM5ODI0MjkKLToxMDVGQTAwMDk4MjU5ODI2OTgyNzk4Mjg5ODI5OTgyQTk4MkI5ODJDRUQKLToxMDVGQjAwMDk4MkQ5ODJFOTgyRjIyMkM0MDYzRkY5NzFFREE3RTI3NkIKLToxMDVGQzAwMEU2ODAyN0U2ODFEMTBGMDBDMDIwNjNGRjgzMDAwMDAwMzgKLToxMDVGRDAwMDZDMTAwNEMwNjJDMDQxMTJEQTc5MUFEQTc1MTNEQUUxODIKLToxMDVGRTAwMDJBQTAwMDIzMzIyRDE5REFEQjJCQUNGRTI5OTJBRTZFRUIKLToxMDVGRjAwMEEzMDI2MDAwOEUwOTBFNDAyRDFBQzJDMkNEMEVEQzM5RkMKLToxMDYwMDAwMDJDMjUxNjY0QjA4OTVCRkY5RTE1REFENzFBREFEMTJCREUKLToxMDYwMTAwMDNBRTgwQTNBMDE1ODA1OEMyQjIxMTYwQUJCMjhEM0EwNkUKLToxMDYwMjAwMDlCNTA1ODA1QTMyQjUyMDAwQUJCMDgyQTBBMDA1ODA1QUEKLToxMDYwMzAwMEEyMTVEQUNFMkQyMTAyMkMzQUU4MEMzQzI4MDRERDAyMTAKLToxMDYwNDAwMDJEMjUwMjlDNTA1ODA1OUE4QjUwQUFCQkMwQTE1ODA1MUIKLToxMDYwNTAwMDlBMUNEQUM3MkQyMTAyMEMzQzI4MDZERDAyMTNEQUM1OTIKLToxMDYwNjAwMDJEMjUwMjlDMzA1ODA1OTI4QjMwQUFCQkMwQTI1ODA1NDIKLToxMDYwNzAwMDkyMkEyMTAyQzBCNDBCQUEwMjBBMEE0RjJBMjUwMjU4MEEKLToxMDYwODAwMDA1QTZEMTBGMjQyNDIzQzNDQzJDMjUxNjYzRkY3NjAwNEMKLToxMDYwOTAwMDE4REFCRDFDREFCOTE5REFCQTFCREFCODE3REE4Qjg1NDcKLToxMDYwQTAwMDIwMkUwQUZEMUZEQUI5MkQyMDJFMjRGNDdBMjRGNDdFNDYKLToxMDYwQjAwMDI0RjQ4MjBFREQwMTI0RjQ4NjJFMEFGNzA3NTUyODA2MDMKLToxMDYwQzAwMEREMDJDMDc1MEVERDAxMDUwNTA2QUI1QkE5NTlDMEU4MTAKLToxMDYwRDAwMEFDNUMyNEM0QUIwRUREMDIyN0M0QUMyRTBBREZBODU1OEQKLToxMDYwRTAwMDI3QjRFQzBFREQwMTI0QjRFQkMyRTAyNzk0MkMwRUREQzYKLToxMDYwRjAwMDAyMjQ5NDJCMkUwQTgwMEQwRDQ2Mjc1NDZDMjQ1NDZCRDkKLToxMDYxMDAwMDBFREQwMjJEMjQyRTYzRkVGQzAwMDAwMDZDMTAwNDJBMUMKLToxMDYxMTAwMDBBMzAyQjBBMDM1QkZGNEQxMkRBOEZDMzkwMjkyNjE2MzMKLToxMDYxMjAwMEMzQTFDMEIzQzA4QTI4MjYxNzVCRkY0OEMwM0NDM0IxRDcKLToxMDYxMzAwMDJCMjYxNjFBREEyMjJBQTAyMDIzMjYxNzY0QTA3OUMzNTgKLToxMDYxNDAwMEEyQzBCMTVCRkY0MkMzQTJDMEIxNUJGRjQwQzNDMjJDN0YKLToxMDYxNTAwMDI2MTZDMkFGQzBCMTIzMjYxNzVCRkYzQ0MyOEYyODI2OEMKLToxMDYxNjAwMDE2QzBGRTJGMjYxN0MyRTIyRTI2MTYyQTBBQTFDMEIxOUIKLToxMDYxNzAwMEMwRDgyRDI2MTc1QkZGMzUyQTBBQTEyQTI2MTZDM0E2RUEKLToxMDYxODAwMEMwQjNDMTkyMjkyNjE3NUJGRjMxQzNDNjJDMjYxNkMxQTYKLToxMDYxOTAwMEIzMkEwQUEyMkIyNjE3QzBCMzVCRkYyQzI5MEFBMjI5MTcKLToxMDYxQTAwMDI2MTZDMTg1MjgyNjE3QzJGQjJGMjYxNkMwRTcyRTI2RTUKLToxMDYxQjAwMDE3MUREQTc2MkQyNjEwRDEwRkMzQTJDMEIzNUJGRjIzQzMKLToxMDYxQzAwMDYzRkY4MjAwNkMxMDA0MUNEQTNGMUJEQTJDMThEQTcwQjMKLToxMDYxRDAwMDE3REE3MTE2REE3MTE1REE3MUMwRTBDMEQ0MTREQTNCM0YKLToxMDYxRTAwMDFGRDlGN0MwMjg4RkYwNkQyQTM2REFDMEQ5QzA3QzVCODIKLToxMDYxRjAwMDAyMEZDOTBDMUNEQTM1MEM5QzI4QThDM0E2QzIyQTM2OEIKLToxMDYyMDAwMDgwMkEyNTg0QTRDMkE3Q0MyRDI0OEMyQjI0OEEyQjI0NUQKLToxMDYyMTAwMDg3MkUyNDhCQjFCQjJFMzY5RjJDMzY5RTJDMzY5REIxRkIKLToxMDYyMjAwMEFDMUNEQTE2MUJEQTVGQzAyODZEMkEzM0RBQzBEOUMwN0QKLToxMDYyMzAwMDdDNUIwMjBGQzkwQzFDREEyNDBDOUMyOEE4QzNBNkMyRTQKLToxMDYyNDAwMDJBMzY4MDJCMjU4NEE0QzJCMUJCQTdDQzJEMjQ4QzJFNEEKLToxMDYyNTAwMDI0OEIyQTI0OEEyRTM2OUYyQzM2OUUyQzM2OURCMUFDNTgKLToxMDYyNjAwMEMwNzkxOURBMTQxQkRBNTExM0RBNEYxQURBNEYxOERBMzcKLToxMDYyNzAwMDUwMTREQTE1MTZEQTUwMDRGNDI4MTJEQTRGMDQ2NjBDQkEKLToxMDYyODAwMDA0MDUwNkEyNTJBODU4QUE1QUEzNTM5QjMwMjlBNTAwNzgKLToxMDYyOTAwMDI3ODQ4QUMwOTFDMEE1MkE4NDhDMjk4NDhCMTdEQTQ4NjgKLToxMDYyQTAwMDE4REE0N0E3NTcyNjM2MUQyNjM2MUUyRTM2MUYxNkRBNTEKLToxMDYyQjAwMDQ1MTNEQTQ1QTY1NTA0MzMwQzI4MjZDODJFNzUwMDJENDMKLToxMDYyQzAwMDU0QUMyRTU0QUIyRTU0QUEyMzI2RTYyMzI2RTUyRTI2QzQKLToxMDYyRDAwMEU3RDEwRjAwNkMxMDA2MTNEQTIzMTdEQTFFMjQ3MjNEODMKLToxMDYyRTAwMDIyMzI5MzdGMkYwQjZEMDgwNTI4MzI5MzdGOEYwMjYzMzQKLToxMDYyRjAwMEZGRjNDMEM0QzBCMDFBRDlCMUMwNTFEOTQwMDQ1OTM5NTQKLToxMDYzMDAwMDI5QTQyMDZFNDQwMjBCQjUwMkMzMjgxRUQ5QUNEREIwMEYKLToxMDYzMTAwMDI1RTQyMjA1MkQzOTJERTQyMUMwNTAxRURBMkMxOURBOEUKLToxMDYzMjAwMDFDMThEQTFDMTZEQTFFMUREQTJBOTQxMDJBNzI0NTE3NzgKLToxMDYzMzAwMEQ5RTc2REE5NEJENDUwQjM1NTdBNUIxN0RGNTA3NTZCMTUKLToxMDYzNDAwMDA3MUZEOTlFOEZGMDBGNUYwQzEyRDlERjAyRjIyOEFFMjMKLToxMDYzNTAwMDIyMjJENjgxRDU0MDEzRDlEQzc0NkIwNzE1RDk5ODg1RDQKLToxMDYzNjAwMDUwMDU0NTBDMDM1MzI4QjE0NUE3M0ZBODMyQTkzMzIyNTUKLToxMDYzNzAwMDM2OUQyMjM2OUUyNDM2ODAyQjM2OUYyQkY0OEIyQ0Y0QjAKLToxMDYzODAwMDhDMTREOUY4MjQ0MjREQzAzMDA0MTQxNEM4NEM2RDA4NDQKLToxMDYzOTAwMDA2QjEzMzA0MTQxNEM4NDI2M0ZGRjIwMDE1RDk4NUM0NTIKLToxMDYzQTAwMDQwMDAzMTA0MUFEOTg2QzBEMTkzQTIwMEREMUFDMTM4NDkKLToxMDYzQjAwMEIwREQ5REEzMThEOUVDMkI4MjREMjk4MjRFMjlBNTFDNTYKLToxMDYzQzAwMDI4ODI1MzdBODcxRTJDNTQwMDhFMTA2RkU0NUQxMkQ5RjgKLToxMDYzRDAwMDdCMkYyMTFEMjMyMTFDMkYyNTFCMDQzMzBDMjMyNTFDNUYKLToxMDYzRTAwMDIzMjUxQUQxMEZDMDYyMThEOURCODg4MDdFODdEOTg5MEUKLToxMDYzRjAwMDEwMjY1NDAwNkY5NDE5MUJEOTcxMkFCMTFDMEExQTE0NjMKLToxMDY0MDAwMDA0QUEwQzJBQjUxQzJBQjUxRDJBQjUxQTJBQjUxQkQxMTcKLToxMDY0MTAwMDBGMUJEOTZBMkFCMTFDMEExQTE0MDNBQTBDMkFCNTFDMkMKLToxMDY0MjAwMDJBQjUxRDJBQjUxQTJBQjUxQkQxMEYwMDFDRDk2NDJCMTkKLToxMDY0MzAwMEMxMUQyREMxMUMyQkM1MUIwM0REMEMyREM1MUMyREM1N0QKLToxMDY0NDAwMDFBRDEwRjAwNkMxMDA2MTlEOTVEMTREOUMyMTJEOUM1MjIKLToxMDY0NTAwMDE1RDlFMEM3M0ZDMEUwMkU1NkE4MkU1NkE5MkU1NkFBNDEKLToxMDY0NjAwMDJFNTZBQjIzMjYyOTE4RDk4NURCMTAxQ0Q5REFDMEQ0QzcKLToxMDY0NzAwMDJBNDI0NTJEMTYwMTlDMTAwMEIwODkwQTg4MEMyODk2RTYKLToxMDY0ODAwMDAwNUJGRjk0MkIyMkUzMThEOTREMEI1QjE0OUI4NDJBRUQKLToxMDY0OTAwMDIyRTQ4Qjg0QjFBQTBBNUExNDBCQUEwQzlBODUyOTIyRTkKLToxMDY0QTAwMEU1MDk1OTE0OTk4NjJGMjJDRDBGNUYxNDlGODc1QkZGNTIKLToxMDY0QjAwMDQ1NUJGRjE2MjM0NjNCQzFCMDFERDk0MDFDRDk5RTJBMUYKLToxMDY0QzAwMEQxMDIyQzQ2M0EwQkFBMDIwQTBBNEYyQUQ1MDI1ODA0RDYKLToxMDY0RDAwMDkyNUJGRUJGNUJGRTk4QzA1MEMwQjAxNkQ5MzYxNEQ5OEYKLToxMDY0RTAwMDNFMTdEOUFFQzBDMEM3M0U5MzEyMkMyNjJEQzAzMDYwRDcKLToxMDY0RjAwMDAwNDQwMDAwMDA3RjlGMEZCMTU1MDkxOTE0NjU5RkY0RjcKLToxMDY1MDAwMEMwNTAwQUE5MDI3RkE3RUYxOEQ5MkFEQTUwMDg1ODBBMDIKLToxMDY1MTAwMDI4ODIyQzJCMEEwMDBCODAwMDAwNTEwNEQyQTBDMDkxQ0QKLToxMDY1MjAwMEM3QUYwMDk5MUEwQTk5MDM5OTEyQ0UzODY0MjA2QkQzMjkKLToxMDY1MzAwMDIwMkIyMDA3MjUxNjAzMkMxMjAyMkE2MjgyN0NBODYzRDYKLToxMDY1NDAwMDE4RDkxQzAxMTEwMjA4NTgwQTI4ODIyQ0RBNTAwQjgwMzUKLToxMDY1NTAwMDAwRDJBMDY0M0ZENThBMzEwQThBMTQwNEFBMDFDODJBNEQKLToxMDY1NjAwMDJCMjIwMTBCOEIxNDA0QkIwMTdCQTk0NUREQTA3QTdCOTgKLToxMDY1NzAwMDA4MUREOTEyMkREMjAwMERBRDBDREIzMDE5RDkwRDFBMjIKLToxMDY1ODAwMEQ5NTI4ODEzMEFEQTI4REM4MDFERDk5MDA5ODgwQTI4OTQKLToxMDY1OTAwMDgyM0MwREFBMDgwQjgwMDA2NTJGOTNEMzIwQzBCMDYzMDYKLToxMDY1QTAwMEZGOTQwMDAwN0ZBRjM0QjE1NTAwNTAwNDBBMDkxOTYzMEQKLToxMDY1QjAwMEZGNDJEQUIwN0I3QjA4MUFEOTAxMkFBMjAwMEFCQTBDODIKLToxMDY1QzAwMDFCRDk0MjhDMzEwQkFCMjgwQzhBMTQxQ0Q5ODBBQ0JCNzQKLToxMDY1RDAwMDFDRDk4MDA0QUEwMTJCQzY4MTYzRkY4RjY0NUY2MEMwNTEKLToxMDY1RTAwMDUwQzBCMEM3Q0U5QzEyNjNGRjU1MDAwMDZDMTAwNDI3NEEKLToxMDY1RjAwMDIyMUVDMDgwMDhFNDMxMUJEOEVGMDAwMjAwMkFCMjgyQkMKLToxMDY2MDAwMDE5RDhFRjAwMzEwNEMwNjEwMDY2MUEyOTkxMDIwQTZBQTQKLToxMDY2MTAwMDAyMkFCNjgyMDlFNDMxMTVEOTRBMEMzODExQTg1MzI4NDgKLToxMDY2MjAwMDMyODIyNDMyODQyQThDRkM3ODQxMTAyOTIxMDIyQTM2QjUKLToxMDY2MzAwMDgyOTdBMDA5NjkwMjI5MjUwMkQxMEYwMDJCMjEwMjJDODMKLToxMDY2NDAwMDMyODUwQjZCMDIyQ0NDRkMyQzM2ODI5N0MwMkIyNTAyOUEKLToxMDY2NTAwMEQxMEYwMDAwNkMxMDA0QzBFNzFERDhEMjFDRDhENDBEOTcKLToxMDY2NjAwMDQ5MTFENzIwOEIyMjhBMjAwQjRCMEJEMkEwMDdBODBDRjQKLToxMDY2NzAwMDlCNzIyODhDRjRDODM0NkY4RTAyNjAwMEEzMUZEOENBQTYKLToxMDY2ODAwMEEyOThBRjdCNzhCMzM0QzkzREMwODFDMEYwMDI4RjM4ODcKLToxMDY2OTAwMDBGMEY0MkM5RkEyQ0Q2N0VENTIwNkQ0QTA1MDAzMDg4RUUKLToxMDY2QTAwMDAwNTA4Qzg4NzAwODk4MDg3OEIxNkREMkEwOTg3MEQxOEQKLToxMDY2QjAwMDBGQzBGMDAzOEYzODdGRTBERTYzRkZEODAyN0IwQ0FGQTIKLToxMDY2QzAwMEJCMEI5OTBDNjQzMDQ3RDgzMEMwRjFDMDUwMDJGNTM4OEMKLToxMDY2RDAwMDA1MDU0MjY0NTA3OTJDRDY3RTBCMzYxMjJGNkMxMDBGQjQKLToxMDY2RTAwMDRGMzY2REZBMDUwMDgwODgwMDIwOEMwNjQ0MENDMDgxNkUKLToxMDY2RjAwMEMwNTAwM0IyMDgyMzdDMEMwMzg1MzgwNTA1NDI2NDUwNjIKLToxMDY3MDAwMDVBMkNENjdFRDMwRjZENEEwNTAwMjA4ODAwMzA4Q0QyREIKLToxMDY3MTAwMEEwQTc5OEJDODg5ODcwRDEwRkQyQTBCQzc5OTk3MEQxRUQKLToxMDY3MjAwMDBGRDIzMDJCQUQwOEMwRjFDMDUwMEJGNTM4MDUwNTQyMzMKLToxMDY3MzAwMENCNTQyQ0Q2N0UwODNGMTQyNjBBMTAwRjY2MEMwNjQ2NTIKLToxMDY3NDAwMDM2NkQ2QTA1MDAyMDg4MDBCMDhDODI3MDYzRkYyRDAwRDIKLToxMDY3NTAwMEMwNTAwM0Y1Mzg3NUUwODA2M0ZGN0EwMEMwNjAwMjg2QTAKLToxMDY3NjAwMDM4NzZFMDlGNjNGRjk5MDBDMDUwMDNGNTM4NzVFMEM0QTgKLToxMDY3NzAwMDYzRkZCRTAwNkMxMDA0RDYyMDY4NTIwRjY5NTMyNERBMDAKLToxMDY3ODAwMDIwREIzMERDNDA1ODAwRjNEMkEwRDEwRkRBMjBEQjMwMjAKLToxMDY3OTAwMERDNDA1ODAwRjA5QTI0MjQyNDBFQzAyMTIyNjQwRkMwNEIKLToxMDY3QTAwMDIwRDEwRjAwQjgzQkIwNEMyQTJDNzQ4OTI0MkQyMDBFMjgKLToxMDY3QjAwMDJFMjAwRkE0RERCMUVFMkUyNDBGQjBERDJEMjQwRTI4RTcKLToxMDY3QzAwMDkwMDcyRDkwMDNBNDg4QjA4OEIxREQyRDk0MDMyODk0MDAKLToxMDY3RDAwMDA3NUJGRkEwNjk1MTFEQzBFMDgyMjQyQTYwMEYxOEQ4MTIKLToxMDY3RTAwMEZFMkEyNDAzMjk2MDBFOEYyMDI5MjQwNzA4RkYwMjlGMTgKLToxMDY3RjAwMDIwOUU2NEQxMEZDMDIwRDEwRjAwMDAwMDZDMTAwNDk0QzMKLToxMDY4MDAwMDIzMTlEOEY2QzBCMzA4M0ExMTBCQUEwMjk5MjAxOUQ4NTcKLToxMDY4MTAwMDY5OUEyMTE2RDg2N0MwNTAyODkyOUQyNTY0QTIyODhDQjkKLToxMDY4MjAwMDE4Mjg5NjlERDEwRjAwMDA2QzEwMDQyODIwNjZDMDM4RUYKLToxMDY4MzAwMDIzMjQwNkI3ODgyODI0NjZEMTBGMDAwMDZDMTAwNjAzQjUKLToxMDY4NDAwMDVBMEMwRDM2MTEwRDVDMTFEODIwOEIyMjgyMjEwQ0JCMDUKLToxMDY4NTAwMDBDMDY1NTBGOUI4MjAyMzIwQjkyODExM0Q4NTNEOTIwMUMKLToxMDY4NjAwMEEzOEY2NDUwNTYxQ0Q4NEZDMEQ3MUJEODUwQTI1NkMwMTcKLToxMDY4NzAwMEUxQzA5MDA0RTkzODA5MDk0Mjc2RjM0RjA0NDMwMkNBQTMKLToxMDY4ODAwMDkxMkJDNjdFRDMwRjZEQUEwNTAwMjA4ODAwMzA4Qzg5MUQKLToxMDY4OTAwMDgxQTk1OTA5RkEwQzY0QTA3RDk5ODE4QTgyNjRBMDBGQUMKLToxMDY4QTAwMEQyOTBEMTBGQzA2MDAyRTYzODc2RDBENzYzRkZEMTAwMTYKLToxMDY4QjAwMEMwMjBCQzg5OTk4MTk5ODA5MjgyRDEwRjdGMjMwNDI5QkQKLToxMDY4QzAwMDJERjg5OTgxNjVCRkQ4NjNGRkU1MDAwMDAyOEYwQ0EzMDYKLToxMDY4RDAwMEZGMEYzMzEyOTMxMDAzQUEwQ0QzNDA2NDkwNDAyQkM2RDEKLToxMDY4RTAwMDdFODYxMEQzMEY2RDZBMDUwMDIwODgwMDMwOENCQzgyMzQKLToxMDY4RjAwMEMwOTBBNEYzQzA0MTAzNDkzODA5MDk0MkNBOUIyQkM2ODIKLToxMDY5MDAwMDdFNkRBQTA1MDAyMDg4MDAzMDhDMEY1OTBDQTk4OUJDMjcKLToxMDY5MTAwMDk5OTk4MTYzRkY4NDAwQkM4OTk5ODE2M0ZGN0MwMEMwRTEKLToxMDY5MjAwMDYwMDJFNjM4NzZEMEI5NjNGRkIzMDBDMDcwMDI0NzM4MjIKLToxMDY5MzAwMDc3RDBDRDYzRkZDNzAwMDA2QzEwMDQxNEQ4MkFDMTUyNzEKLToxMDY5NDAwMEE0MjRDQTMxMjgyMjFENzM4MTFDMjkyMTAyNjU5MDE2QjYKLToxMDY5NTAwMDJBMzAwMDc1QTkxMjAyMkEwMjAzM0IwMjJDMzAwN0MwMUMKLToxMDY5NjAwMEQyNTgwMUQwNjUzRkRDRDEwRjJCMzAwNzAzQkIwQjBCOTYKLToxMDY5NzAwMEJBMDI3NEIzMDIyQUJERjhEM0EwNjNGRkM0MDAwMDAwQkEKLToxMDY5ODAwMDZDMTAwNDI5MjAwNkMwNzA2RTk3NDEyOTIxMDJDMDhGMjcKLToxMDY5OTAwMDJBMjAxNEMwQjYyQjI0MDYwNkFBMDIyQTI0MTQ3OTgwQzEKLToxMDY5QTAwMDAyMjcyNTAyMkEyMjFFMkMyMjFEN0FDMTBFQzhBQkRBMkMKLToxMDY5QjAwMDIwREIzMDJDMEEwMDAzM0QwMjVCRjgwRDY0NTA3NDJEN0YKLToxMDY5QzAwMDIxMDIwRDBENENDOUQzQzAyMEQxMEYwMDAwMkU5Q0ZCMUQKLToxMDY5RDAwMDY0RTA4MjJGMjEwMjBGMEY0QzY1RjA5MTFBRDdGNjFDNEMKLToxMDY5RTAwMEQ3RjQyOUEyOUVDMDhBNzk4QjVEMkJDMjI2NjhCMDA0OTkKLToxMDY5RjAwMDhEMjA3QkQ5NTIyOUEyOURDMEYzNjQ5MDRBOTc5MDFEQTcKLToxMDZBMDAwMEQ4MDYyRTIxMDQ5RDk2MDhFRTExMEZFRTAyOUU5NzlFNDkKLToxMDZBMTAwMDkxMThEODAyQzBFNTI3QzRBMjJFMjQwNjJCQTI5RDJGRDAKLToxMDZBMjAwMDIxMDIyQkJDMzAwOEZGMDIyRjI1MDIyQkE2OURDMDIwN0YKLToxMDZBMzAwMEQxMEYwMDAwMkYzMDAwNjhGOTM5REEyMERCMzAwNDRDMjgKLToxMDZBNDAwMDAyNTgwMDQ0NjNGRjc3MDAwMjJBMDIyQjBBMDY1ODAwMEUKLToxMDZBNTAwMEQzMjIwQTAwRDEwRjY1NTAxMDI4MzAwMDY4ODkyNDAyMjMKLToxMDZBNjAwMDJBMDIwMzNCMDJEQzQwNTgwMDNCQzAyMEQxMEZEMjcwMDkKLToxMDZBNzAwMEQxMEYwMDAwMkEyQzc0MDMzQjAyMDQ0QzAyNUJGRUY1OEMKLToxMDZBODAwMDYzRkYzQjAwREIzMERDNDAyQTJDNzQ1QkZFRjJDMDIwNEQKLToxMDZBOTAwMEQxMEYwMDAwNkMxMDA0QzgzRjg5MjY4ODI5QTM5OTk5NUEKLToxMDZBQTAwMDI2MDk4ODBDMDgwODQ4MjgyNTI1Q0M1MkMwMjBEMTBGN0IKLToxMDZBQjAwMERCNDAyQTJDNzQ1QkY5MzZEMkEwRDEwRjZDMTAwNEQ4QkQKLToxMDZBQzAwMDIwRDczMDgyMjIwRDQ1MTEwNTIyMEM5MjgyNjQyMDc0NTkKLToxMDZBRDAwMDA3NDIwQjEzRDdCNUQ0MjBBMzgzNzMyMzAyMjQyREY4QzgKLToxMDZBRTAwMDg1ODA3NDUxNENCQzgyQzA5MDZEMDgxNjAwNDA4ODAwQUYKLToxMDZBRjAwMDcwOEM3NzM5MDNENzIwQzA5MTg2ODA3NDM5MDFENDIwRjcKLToxMDZCMDAwMDc0NjEwMjYzRkZFMkNBOThDMDk3QzA0MTFCRDgzNUMwQzgKLToxMDZCMTAwMEEwMEI4QjBDMEI0QTM4MEEwQTQyQzlBQTFERDdBMjFDMkIKLToxMDZCMjAwMEQ3QTMyQ0Q2N0VDMTQwRDMwRjZENEEwNTAwMjA4ODAwMjQKLToxMDZCMzAwMDMwOEM5NzgwRDI3MEQxMEZCQzhGQzBFMDBGNEUzODdFNjIKLToxMDZCNDAwMDkwRTI2M0ZGRDZCQzgyOTI4MTkyODBDMDIwOTI4MkQxNzMKLToxMDZCNTAwMDBGMDAwMDAwNkMxMDA2QzBENzFDRDc5MjFCRDc5NDBERjUKLToxMDZCNjAwMDQ5MTFENzIwMkUyMjFGMjgyMjFEMEU0RTBCRDI4MDA3M0UKLToxMDZCNzAwMDhBMEMyRTc2MUYyQUFDODBDODM0NkZBRTAyNjAwMENCMjAKLToxMDZCODAwMDJGMEE4MDFBRDc5OEEyOUVBQTdBN0VBMzNGQzkzRkMwMzcKLToxMDZCOTAwMEUxQzA1MDAyRTUzODA1MDU0MkNBNTUyQkM2N0VEQjIwMTAKLToxMDZCQTAwMEQzMEY2RDRBMDUwMDMwODgwMEIwOEMyRTcyMURBRTlFNEEKLToxMDZCQjAwMDBFQTUwQzY0NTA4NkQyODAyRTc2MURDMDkxMjk4NDAzQzgKLToxMDZCQzAwMEQxMEZDMDUwMDNFNTM4NzVEMEQzNjNGRkNEMTVENzg1RkQKLToxMDZCRDAwMDAyN0UwQ0E1RUU2NDMwNTFDMEExMjUwQTAwMDJBNTM4NDIKLToxMDZCRTAwMDAzM0EwMjA1MDU0MjY0NTA5MjJCQzY3RTBFMzUxMjk1N0IKLToxMDZCRjAwMDEwMjU1QzEwMDU0NTM2RDMwRjZENUEwNTAwQTA4ODAwOUUKLToxMDZDMDAwMDIwOENDMEExQTNFMkMwNTAyM0ZBODAwMzczMEMwM0E1MUIKLToxMDZDMTAwMDM4QUY3MzA1MDU0MjY0NTA3MjJCQzY3RTg1MTAwNTQ1NUEKLToxMDZDMjAwMDBDNkQ1QTA1MDAyMDg4MDAzMDhDRDI4MEMwQTEwRTlCQ0MKLToxMDZDMzAwMDBDQUI3QkFGQkIyQjc2MUQyQTg0MDNEMTBGRDI4MEMwNTcKLToxMDZDNDAwMEMxQUY3RDJENzYxRDJDODQwM0QxMEYwMEQyMzAyRThENDcKLToxMDZDNTAwMDA4QzBGMUMwNTAwRUY1MzgwNTA1NDJDQjU5MkJDNjdFNTEKLToxMDZDNjAwMDBBM0YxNEMxNjAwRjY2MEMwNjQ2MzZEMzBGNkQ2QTA1RTUKLToxMDZDNzAwMDAwMjA4ODAwRTA4QzIyNzIxRDYzRkYwM0MwNjFDMDUwQjkKLToxMDZDODAwMDAzNjUzODc1RDgwMjYzRkY2MjYzRkY1Q0MwNTAwMkE1REMKLToxMDZDOTAwMDM4NzVEMDg3NjNGRjgxMDBDMDYwMDNGNjM4NzZEMEJGQjcKLToxMDZDQTAwMDYzRkZCOTAwNkMxMDA0MkEyMDE1MjkyMDE2MTRENzQzNUQKLToxMDZDQjAwMDBBOTkwQ0NCOUQyRTIwMEIwNEVEMDkyQkQxMUM4RjI4OUIKLToxMDZDQzAwMDA5QkMzNkFDQUEwQ0JCMEMyQkQ1MUMwQTBBNDcyQTI0REIKLToxMDZDRDAwMDE1Q0FBRjhCNDM4OTQyQjBBODAwOTEwNDAwODgxQUE4NTYKLToxMDZDRTAwMEZGMEZCQjAyOUIyNzhGMjYwRkI4MEM3ODNCMUFDMDIwRTIKLToxMDZDRjAwMEQxMEYwMDAwMjkyMTAyQzBBMjBBOTkwMjI5MjUwMkMwNTEKLToxMDZEMDAwMDIxRDEwRjAwOEIyNzYzRkZEQzJCRDExQzBDQUEwQzBBQUUKLToxMDZEMTAwMDBBNDcyQTI0MTVBQ0JCMkJENTFDQzlBRThCNDM4QzI4NDMKLToxMDZEMjAwMDhGNDJCMEFEMDBGMTA0MDBERDFBQURDQzBDQkIwMjlCNkMKLToxMDZEMzAwMDI3REEyMEI3RUI1ODAwMTlDMDIxRDEwRjlGMjc2M0ZGMzYKLToxMDZENDAwMEVGMDAwMDAwNkMxMDA0MjgyMDNDNjQzMDQ3MDUzMDYwRTAKLToxMDZENTAwMDAwMDczRTAxMDUzRUIxNTYwNzY1MzkwNTQ5MjhDNzdGNDIKLToxMDZENjAwMEE5MzMwMzA2NDEwNzY2MDNCMTY2MDYwNjQxQTYzMzdFRDIKLToxMDZENzAwMDg3MUUyMjIxMjUyOTFBRkM3MzJCMTUwMjM4MEMwOTgxNDQKLToxMDZEODAwMDYwMDAwNjNFMDEwMjNFQjEyNDA2NDIzOTAzMjIwQUQxQzgKLToxMDZEOTAwMDBGRDIzMEQxMEZDMDUxNjNGRkMwMDAwMDZDMTAwNDI3MjgKLToxMDZEQTAwMDIyMUVDMDgwMDhFNDMxMURENzAzMDAwMjAwMkNEMjgyQ0QKLToxMDZEQjAwMDFCRDcwMzAwMzEwNEMwNjEwMDY2MUEyQkIxMDIwQzZDQjIKLToxMDZEQzAwMDAyMkNENjgyMEJFNDMxMTlENzg3MEMzQTExQUE5MzI4RUEKLToxMDZERDAwMDMyODI5NzgwMjUzMjgyMjQzMjg0QjQ1NTI1MzY4Mjc1REEKLToxMDZERTAwMDQxMEEyOTIxMDIwOTY5MDIyOTI1MDJEMTBGMkEyMTAyMUIKLToxMDZERjAwMDJCMzI4MzBBNkEwMjJCMzY4MjJBMjUwMkQxMEYwMDAwMjkKLToxMDZFMDAwMDZDMTAwNDE4RDZFQzBDMjcxMTA4NzcwODI2NzI4NjI1MUEKLToxMDZFMTAwMDNDMDQ3NjVCMTMxNUQ2RTgwNTIyMEEyMjIyQTM2ODIwREIKLToxMDZFMjAwMDAyNzQyOTA0MjI3Mjg1RDEwRkMwMjBEMTBGMDAwMDAwMDYKLToxMDZFMzAwMDZDMTAwNDE5RDZFQjI3MjIxRUMwODAwOTc3MDIwOEU0RTMKLToxMDZFNDAwMDMxMURENkRDMDAwMjAwMkNEMjgyMUJENkRDMDAzMTA0QkUKLToxMDZFNTAwMEMwNjEwMDY2MUEyQkIxMDIwQzZDMDIyQ0Q2ODIwQkU0QzYKLToxMDZFNjAwMDMxMTlENzYwMEMzQTExQUE5MzI4MzI4Mjk3ODAyNTMyQzMKLToxMDZFNzAwMDgyMjQzMjg0QjQ1NTI1MzY4Mjc1NDEwQjJBMjEwMjBBQjgKLToxMDZFODAwMDZBMDIyQTI1MDJEMTBGMDAyQjIxMDIyQzMyODMwQjZCQzAKLToxMDZFOTAwMDAyMkMzNjgyMkIyNTAyRDEwRjAwMDAwMDZDMTAwNDFCM0YKLToxMDZFQTAwMEQ2QzUwQzJBMTFBQkFBMjlBMjg2QjQzODc5OEIyMjFCMkQKLToxMDZFQjAwMEQ2QzIxOUQ2RTgwQjJCMEEyQkIyQTMwOTI5MDg2OEIwNTEKLToxMDZFQzAwMDAyNzRCOTBEMjk5RDAxMjk5MDFGNkU5MjA4MjJBMjg1OTYKLToxMDZFRDAwMEQxMEZDMDIwRDEwRkM4OTJDMDIwRDEwRkRBMjA1QkVFQjUKLToxMDZFRTAwMEIzQzAyMEQxMEYwMDAwMDA2QzEwMDQxNEQ2QjIyODQyQTkKLToxMDZFRjAwMDlFMTlENkFGNkY4ODAyNjAwMEJBMjk5MjI2Njg5MDA3NjMKLToxMDZGMDAwMDhBMjAwOUFBMEM2NUEwQUMyQTQyOURDMERDNjRBMEE0MUEKLToxMDZGMTAwMDJCMjAwQzE5RDZBOTBDQkMxMUE0Q0MyRUMyODYwOUI5MDEKLToxMDZGMjAwMDBBN0VEMzAyNjAwMDlBMjk5MkEzNjg5MDA3OEQyMDA5RjcKLToxMDZGMzAwMEREMEM2NUQwOEMyNUMyODU2NDUwODYyRDIxMDRDMDMwQkYKLToxMDZGNDAwMDZFRDgwRDJDMjA2NkI4Q0MwQzBDNDcyQzI0NjY2NUMwN0UKLToxMDZGNTAwMDdCMUNENzI1MThENkFGMUFENkE2MTlENkI2MURENkFCMjgKLToxMDZGNjAwMEMwRTQ5RTUxOUQ1MDhGMjA5MzU3OTM1NTk5NTM5QTU2NDQKLToxMDZGNzAwMDlBNTQwOEZGMDIxQUQ2QzI5RjUyODgyNjlGNUE5RTU5RDkKLToxMDZGODAwMDlENTg5MzVFOUM1RDkzNUM5QTVCMDgwODQ4MDU4ODExNDgKLToxMDZGOTAwMDk4NUZDMEQ4MUZENjkwMENCOTExQTQ5OTI4OTI4NUFGREMKLToxMDZGQTAwMEJGMjNGNENGMjg4QzQwMjg5Njg1OEUyNjJEMjQwNjlFNUMKLToxMDZGQjAwMDI5QzAyMEQxMEZDQTMzREEyMEMwQjY1QkZGNzhDNzJGQjMKLToxMDZGQzAwMEQxMEZDOTNBREEyMDVCRkY3NUM3MkZEMTBGREJEMDVCMzkKLToxMDZGRDAwMEZFMEIyMzI0NjYyQjIwMEM2M0ZGNzUwMEM3MkZEMTBGRjcKLToxMDZGRTAwMEM3MkZEMTBGNkMxMDA0Qzg1QjI5MjAwNjY4OTQxQzY4NTkKLToxMDZGRjAwMDk2MDdDMDIwRDEwRkMwMjBEMTBGREEyMERCMzBEQzQwNTMKLToxMDcwMDAwMERENTAyRTBBMDA1QkZFNUVEMkEwRDEwRjJFMjAwQzE4QTAKLToxMDcwMTAwMEQ2NjkwQ0VGMTFBOEZGMjlGMjg2QzA4ODc5OEI3OTFBRkUKLToxMDcwMjAwMEQ2NjYwQUVBMEEyQUEyQTM2OEEwMDQ4QjIwN0FCOTY4NjUKLToxMDcwMzAwMDIzRjI4NTY0MzA2MjFCRDY3MDI5MEE4MDJDMjA2ODI4RDAKLToxMDcwNDAwMDIwNjcyRDIxMDQwQjg4MTEwNEREMTEwOEREMDIwRENDMTEKLToxMDcwNTAwMDAyQzA4NDJENEExMDBEQ0MwMjFERDY2ODk4MzE5RDMwOTcKLToxMDcwNjAwMDhBMkI5OTM3OUMzNDBCQUEwMkMwQzA5QzM1OUMzNjlBNTcKLToxMDcwNzAwMDMyMkEyQzc0REI0MDI4RjI4NUMwRDMyODhDMjAyOEY2RDUKLToxMDcwODAwMDg1MkMyNTA0MkQyNDA2MUZENjUzREQ0MEFGRUUyQ0U0QkQKLToxMDcwOTAwMENGNUJGREVBRDJBMEQxMEYwMERBMjBEQkUwNUJGRjNGM0YKLToxMDcwQTAwMEMwMjBEMTBGNkMxMDBBRDYzMDJBMjAwNjI0MTYwMTI4RTEKLToxMDcwQjAwMEFDRjg2NTgzODYyQjIxMjJDMEYyMkEyMTI0Q0M1NzJBRTIKLToxMDcwQzAwMEFDMDEwQTBBNEYyQTI1MjQ3QUJCMDI2MDAzN0YyQzIxRDcKLToxMDcwRDAwMDAyMEMwQzRDNjVDMzE5MkUyMjE1OEQzMkMwOTEwRUREQTkKLToxMDcwRTAwMDBDNjVEMzkwODgzODFFRDYzMzY0ODM2QjhDMzdDMEI4NTgKLToxMDcwRjAwMEMwOTYwQ0I5Mzk5OTE0QjQ5QTlBMTIwRDk5MTE5OTEzMzIKLToxMDcxMDAwMDhGNjcxOEQ2MkVDOUZCMjg4MDIxN0Y4MzE2OEIxNDJDRkQKLToxMDcxMTAwMDIyMDAyQTIwMEM1QkZGNjFENEEwNjRBM0IzOEY2NzYwQjgKLToxMDcxMjAwMDAwMjgwMDAwMkIyMDBDODkxMjBDQkExMUFFQUEyQ0EyNDgKLToxMDcxMzAwMDg2MURENjIxN0M5QjNFMERCRDBBMkREMkEzNjhEMDA0QUUKLToxMDcxNDAwMDg4MjA3RDg5MzAyNEEyODU2NDQzNjQyNzIxMkUwN0Y3OTcKLToxMDcxNTAwMDM2MDdGOTBDNkY5RDAxRDdGMERBMjBEQjcwQzFDNDJEMjIKLToxMDcxNjAwMDIxMUY1QkZFRjg4OTI2ODgyN0REQTAwOTg4MEM3QThCMTEKLToxMDcxNzAwMDE3OUExMDYwMDAwNkMwNDA2M0ZGQ0MwMDAwREEyMDhCMzUKLToxMDcxODAwMDEwNUJGRUM4OEQxMDY1QTI2N0MwRTA5RTQ4OEM2NDlDQjEKLToxMDcxOTAwMDQ5OEI2NThBNjY5QjRBOUE0Qjk3NDU4RjY3N0Y3MzAyMzYKLToxMDcxQTAwMDYwMDEyMENENTI5RDEwREEyMERCMzAyQzEyMDE1QkZFRjUKLToxMDcxQjAwMDY5OEQxMEMwNTFENkEwOEZBN0MwQzA4QTY4OTc0RDlBMUMKLToxMDcxQzAwMDRDODg2OTg5NkE5ODRFOTk0RjhFNkE4QTY5QUU3RTc3MzMKLToxMDcxRDAwMEVCMDFCMUFBOUU2QTlBNjk4QjYwQzBBMDBCOEUxNDc3RUUKLToxMDcxRTAwMEI3MDFDMEExQzA5MUMwODQ5MzE1OUQxNzk1MTZDMEQwNUEKLToxMDcxRjAwMDI1MjAzQ0MwMzAwODU4MDEwODkzMzhDMDgyMDgzMzEwNUQKLToxMDcyMDAwMDA4NUIwMTA1MzU0MDBCOUQzODA3REQxMDBCQUIxMDBFRjgKLToxMDcyMTAwMDE5NDAyQTIxMUYwNzk5MTAwM0REMDIwREJCMDIwNTUzRjcKLToxMDcyMjAwMDEwMDkzMzAyMEE1NTExMjkyMTI1MEEyQTE0MDkyOTE0QTMKLToxMDcyMzAwMDA0OTkxMTBBOTkwMjA5MzMwMjhBMkIyOTIxMDQwQkFBMDUKLToxMDcyNDAwMDAyMUJENjZBMDg5OTExMDk1NTAyMDg1NTAyMEJBQTAyQjkKLToxMDcyNTAwMDlBNDA4OTIwODgxNDA4OTkxMTA5ODgwMjE5RDVFQTFERDUKLToxMDcyNjAwMEQ2NjQwOTg4MDI5ODQxOEIyQTkzNDY5NTQ3ODMxNTBENjkKLToxMDcyNzAwMEJCMDI4NTE2OEQxNzlCNDQ4QTY1ODk2NkFBQ0FBOTdDQkMKLToxMDcyODAwMDc3Q0IwMUIxQUEwN0ZCMEM5QzY2OUE2NTg4MjY4RTI5RUMKLToxMDcyOTAwMEFEODc5NzI2MDdFRTBDMEUwRTQ4MkUyNTI1OUI2NzJCRjMKLToxMDcyQTAwMDIwMEM4NzEzMUVENUM0MENCOTExQUU5OTI4OTI4NUE3NUUKLToxMDcyQjAwMDg4Mjg5Njg1MTdENUM4QzA5MEE3QkIyOUI0Q0Y4NzE4NTIKLToxMDcyQzAwMDYzRkUzQzAwOEM2MEMwRTBDMDkxQzBGMEMwMzRDMEI4MjgKLToxMDcyRDAwMDJBMjEwNDI4MjAzQzA4QUExMTBCOEIwMTAzODMwMTAzRjcKLToxMDcyRTAwMDlGMzgwQjlCMzlDMDMyMDhGRjEwMDM4ODAxMDg5RTM4NzUKLToxMDcyRjAwMDBDODgxNDA3RUUxMDBGRUUwMjAzODgwMTA4OTgzOTA1NzgKLToxMDczMDAwMEJGMTAyOTIxMUYwQUJCMTEwNzg4MTAwOEZGMDIwQkFBMTIKLToxMDczMTAwMDAyMThENUJDMDkyOTE0MDNBQTAyMkIyMTI1ODMyMDBCQUUKLToxMDczMjAwMDJCMTQwNEJCMTEwODMzMTEwRkJCMDIwQjk5MDI4QjE0RjEKLToxMDczMzAwMDhGMkEwQjMzMDIwODMzMDI4QjJCNjQ3MDg2ODg2ODk3ODAKLToxMDczNDAwMDREOTg0Qzg3Njk4ODZBOTM0MTk5NDY5NzRFOTg0RkMwRUIKLToxMDczNTAwMDcwNzdDNzAxQzA3MTlBNDcxOEQ2MjYwQjdDMTAwQ0VDQzkKLToxMDczNjAwMDAyMDhGODAyOTg0NDE4RDYyMzBDQkMwMjA4Q0MwMjlDRjAKLToxMDczNzAwMDQwMkEyMDBDMjk1Q0ZFQzA4MDFGRDU4RTFDRDU5NjBDOUYKLToxMDczODAwMEFFMTEyQjIxMjRBQ0FBQUZFRUIwQkI4RjEzMkNFMjg1M0IKLToxMDczOTAwMDI4QTRDRkFGQ0MyQ0U2ODUyQTIyMTUyQjI1MjRCMUFBMTAKLToxMDczQTAwMDJBMjYxNTY0OTBEQkM5RDI4RjI2MkUyMjA5MERGRjA4RUMKLToxMDczQjAwMDJGMjYwNjBGRUUwQzBFMEU0ODJFMjUyNTY1NTBFNEMwMzQKLToxMDczQzAwMDIwRDEwRjAwQzA3MDkzNDE5RjQ0OTk0NjlBNDc3N0M3RDgKLToxMDczRDAwMDBBMUNENTdBMkNDMDIyQzA4MTBDODczODFDRDYwNzBCMUEKLToxMDczRTAwMDc4MTAwOEU4MDIwOEI4MDIwQzg4MDI5ODQwNjNGRjgwMTEKLToxMDczRjAwMDAwQ0M1N0RBMjBEQjYwOEMxMTVCRkRENjI5MjEwMjY4QjYKLToxMDc0MDAwMDk4MDY2ODk0MDNDMDIwRDEwRjJCMjIxRUMwQTAyOTIyMDkKLToxMDc0MTAwMDFEMkEyNTAyN0I5OTAxQzBCMDY0QkZFODEzRDU2NTJDRjUKLToxMDc0MjAwMEIwMDcyOEIwMDBEQTIwMDM4ODBBMjg4MjRDQzBEMTBCQUMKLToxMDc0MzAwMDgwMDBEQkEwNjVBRkU3NjNGRkNBMDAwMDY4QTc3OURBQzgKLToxMDc0NDAwMDIwREIzMERDNDBERDUwNUJGRUU3RDJBMEQxMEZDMTZEMDgKLToxMDc0NTAwMEMxOUQyOTI1MkM2MDAwMDQyOTI1MkNENjkwMjYyNDY3NUYKLToxMDc0NjAwMDJGMjQ2OERBMjBEQjMwOEMxMURENTAyRTBBODA1QkZEODIKLToxMDc0NzAwMDQ0RDJBMEQxMEZDMTY4QzFBODJBMjUyQzYzRkZERDAwMkEKLToxMDc0ODAwMDAwMDBDOERGOEMyNjhCMjlBRENDOUMyNjBDQkIwQzBCRDYKLToxMDc0OTAwMDBCNDgyQjI1MjUyQTJDNzREQjYwMkMxMjAxNUJGRDg3MDEKLToxMDc0QTAwMEQyQTBEMTBGMkEyQzc0OEIxMTVCRjZCOUQyQTBEMTBGQzgKLToxMDc0QjAwMERBMjA1QkZFM0E2M0ZGMzgwMERBMjBDMEIxNUJGRThBNTcKLToxMDc0QzAwMDY0QUJGMTY1NUYzNTJEMjEyNEIxREQyRDI1MjQ2M0ZGRUIKLToxMDc0RDAwMDFGREEyMDJCMjAwQzVCRkU1NjYzRkYxNDEyRDVDODgyRTYKLToxMDc0RTAwMDIwMDI4MjU3QzgyMTYzRkZGQzEyRDVDNDAzRTgzMDA0OTAKLToxMDc0RjAwMEVFMzAwNUIxMzA5MzIwOTQyMTk1MjI2M0ZGRkMwMDAwMEIKLToxMDc1MDAwMDEwRDVDMDkxMDA5MjAxOTMwMjk0MDMxMUQ1OTc4MjEwNzcKLToxMDc1MTAwMDAxRUEzMEEyMTEwMUYwMzFDMDQwMDRFNDE2MDAwMjAwN0IKLToxMDc1MjAwMDExRDVCOTgyMTAyMzRBMDAwMzIyMDI5MjEwMTFENTgyOEMKLToxMDc1MzAwMEMwMjE5MjEwMDRFNDMxODQwMzgzMDI4MjAxODEwMDAwOUYKLToxMDc1NDAwMEQyMzAwMTIzMDAwMDAwMDAxMEQ1QjA5MTAwOTIwMTkzQzkKLToxMDc1NTAwMDAyOTQwMzExRDU4NjgyMTAwMUVBMzBBMjExMDFGMTMxQTMKLToxMDc1NjAwMEMwNDAwNEU0MTYwMDAyMDAxMUQ1QTc4MjEwMTNENTJCRTkKLToxMDc1NzAwMDAzMjIwMjkyMTAwNEU0MzE4NDAzODMwMjgyMDE4MTAwMTkKLToxMDc1ODAwMDAwRDMzMDAxMzMwMDAwMDAxMEQ1QTE5MTAwODEwMTY1QzYKLToxMDc1OTAwMDEwNDk4MTAyNjUxMDQ0ODEwM0NGMUY5MjAxOTMwMjk0MjgKLToxMDc1QTAwMDAzMTFENTc0ODIxMDAxRUEzMEEyMTEwMUYyMzFDMDQwRkEKLToxMDc1QjAwMDA0RTQxNjAwMDIwMDExRDU5MzgyMTAxM0Q1MTMwMzIyQTAKLToxMDc1QzAwMDAyOTIxMDA0RTQzMTg0MDM4MzAyODIwMUMwMTA5MTAzMEIKLToxMDc1RDAwMDkxMDI5MTAxODEwMDAwRDQzMDAxNDMwMDEyRDU0MkMwRDQKLToxMDc1RTAwMDMwMjgzNzQwMjgzNzQ0MjgzNzQ4MjgzNzRDMjMzRDAxNzYKLToxMDc1RjAwMDcyMzNFRDAzMDIwMDYzRkZGQzAwMDAwMDEwRDU4NTkxOUIKLToxMDc2MDAwMDAwOTIwMTkzMDI5NDAzMTFENTgzODIxMDkyMTAxMUQ1MzgKLToxMDc2MTAwMDM0ODMxMDAzMjIwMjkyMTAxMUQ1ODAxMkQ1NDY5MjEwQTUKLToxMDc2MjAwMEMwNDAwNEU0MTYwMDAyMDAxMUQ1Nzc4MjEwMTNENTJENTYKLToxMDc2MzAwMDAzMjIwMjkyMTAwNEU0MzE4NDAzODMwMjgyMDE4MTAwNTgKLToxMDc2NDAwMDAwRDUzMDAxNTMwMDAwMDA2QzEwMDI2RTMyMkZENjIwOUUKLToxMDc2NTAwMDA1NkYwNDA0M0YwNDc0NUIyQTA1NDQwQzAwNDEwNDAwRDgKLToxMDc2NjAwMDMzMUEyMjBBMDA2RDQ5MEQ3MzYzMDQwMzY2MENCMTIyQkMKLToxMDc2NzAwMDBGMjIxMTAzMTMxNDczNjMwMjIyMkMwMUQxMEZDODNCOTQKLToxMDc2ODAwMEQxMEYwMDAwNzM2MzBDQzAyMUQxMEYwMDAwMDAwMDAwNzcKLToxMDc2OTAwMDQ0NDk1NjMwQzAyMEQxMEY2QzEwMDIwMDQwMDQ2QjRDOUUKLToxMDc2QTAwMDA3MDMyMzE4MDIwMjE5RDEwRjAyMDMxOUMwMjBEMTBGQkEKLToxMDc2QjAwMDZDMTAwMjAyRUEzMEQxMEY2QzEwMDJDQzI1MDNGMDMxQkQKLToxMDc2QzAwMDYwMDAwRjAwNkYyMjA1MDNGMTMxNjAwMDA1NkYyMzA1OTQKLToxMDc2RDAwMDAzRjIzMTAwMDIwMEQxMEY2QzEwMDJDQzI1MDJGMDMwMTEKLToxMDc2RTAwMEQxMEYwMDAwNkYyMjA0MDJGMTMwRDEwRjZGMjMwNDAyOEEKLToxMDc2RjAwMEYyMzBEMTBGQzAyMEQxMEY2QzEwMDIyMjBBMjAyMzBBRDEKLToxMDc3MDAwMDAwNkQyODBFMjgzNzQwMjgzNzQ0MjgzNzQ4MjgzNzRDNDIKLToxMDc3MTAwMDIzM0QwMTAzMDIwMEQxMEY2QzEwMDIwMkU0MzFEMTBGQUUKLToxMDc3MjAwMDBBMDA0MzY4NjU2QzczNjk2RjIwNDY1NzIwNDQ0NTQyRTAKLToxMDc3MzAwMDU1NDczRDMwMjAyODQyNzU2OTZDNzQyMDQ2NzI2OTIwOTcKLToxMDc3NDAwMDRENjE3OTIwMjAzODIwMzEzNjNBMzAzNzNBMzMzNjIwQUYKLToxMDc3NTAwMDUwNDQ1NDIwMzIzMDMwMzkyMDZGNkUyMDYzNkM2NTZGOTYKLToxMDc3NjAwMDcwNjE3NDcyNjEyRTYxNzM2OTYzNjQ2NTczNjk2NzZFQjkKLToxMDc3NzAwMDY1NzI3MzJFNjM2RjZEM0EyRjY4NkY2RDY1MkY2NjY1NDYKLToxMDc3ODAwMDZDNjk3ODJGNzcyRjY2Nzc1RjM3MkUzMTI5MkMyMDU2M0EKLToxMDc3OTAwMDY1NzI3MzY5NkY2RTIwNTQzMzc4NzgyMDMwMzAzNzJFREQKLToxMDc3QTAwMDMwMzQyRTMwMzAyMDJEMjAzMTMwMzAzNzMwMzQzMDMwRUUKLTowODc3QjAwMDEwMDcwNDAwMDA3MTQ4OTQ2OQotOjAwMDAwMDAxRkYKZGlmZiAtLWdpdCBhL2ZzLzlwL01ha2VmaWxlIGIvZnMvOXAvTWFrZWZpbGUKaW5kZXggMWE5NDBlYy4uOTFmYmEwMiAxMDA2NDQKLS0tIGEvZnMvOXAvTWFrZWZpbGUKKysrIGIvZnMvOXAvTWFrZWZpbGUKQEAgLTgsNiArOCw4IEBACiAJdmZzX2Rpci5vIFwKIAl2ZnNfZGVudHJ5Lm8gXAogCXY5ZnMubyBcCi0JZmlkLm8KKwlmaWQubyAgXAorCXhhdHRyLm8gXAorCXhhdHRyX3VzZXIubwogCiA5cC0kKENPTkZJR185UF9GU0NBQ0hFKSArPSBjYWNoZS5vCmRpZmYgLS1naXQgYS9mcy85cC9maWQuYyBiL2ZzLzlwL2ZpZC5jCmluZGV4IDczMTdiMzkuLjM1ODU2MzYgMTAwNjQ0Ci0tLSBhL2ZzLzlwL2ZpZC5jCisrKyBiL2ZzLzlwL2ZpZC5jCkBAIC05Nyw2ICs5NywzNCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBXZSBuZWVkIHRvIGhvbGQgdjlzZXMtPnJlbmFtZV9zZW0gYXMgbG9uZyBhcyB3ZSBob2xkIHJlZmVyZW5jZXMKKyAqIHRvIHJldHVybmVkIHBhdGggYXJyYXkuIEFycmF5IGVsZW1lbnQgY29udGFpbiBwb2ludGVycyB0bworICogZGVudHJ5IG5hbWVzLgorICovCitzdGF0aWMgaW50IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywKKwkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqKipuYW1lcykKK3sKKwlpbnQgbiA9IDAsIGk7CisJY2hhciAqKnduYW1lczsKKwlzdHJ1Y3QgZGVudHJ5ICpkczsKKworCWZvciAoZHMgPSBkZW50cnk7ICFJU19ST09UKGRzKTsgZHMgPSBkcy0+ZF9wYXJlbnQpCisJCW4rKzsKKworCXduYW1lcyA9IGttYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXduYW1lcykKKwkJZ290byBlcnJfb3V0OworCisJZm9yIChkcyA9IGRlbnRyeSwgaSA9IChuLTEpOyBpID49IDA7IGktLSwgZHMgPSBkcy0+ZF9wYXJlbnQpCisJCXduYW1lc1tpXSA9IChjaGFyICAqKWRzLT5kX25hbWUubmFtZTsKKworCSpuYW1lcyA9IHduYW1lczsKKwlyZXR1cm4gbjsKK2Vycl9vdXQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKIC8qKgogICogdjlmc19maWRfbG9va3VwIC0gbG9va3VwIGZvciBhIGZpZCwgdHJ5IHRvIHdhbGsgaWYgbm90IGZvdW5kCiAgKiBAZGVudHJ5OiBkZW50cnkgdG8gbG9vayBmb3IgZmlkIGluCkBAIC0xMTIsNyArMTQwLDcgQEAKIAlpbnQgaSwgbiwgbCwgY2xvbmUsIGFueSwgYWNjZXNzOwogCXUzMiB1aWQ7CiAJc3RydWN0IHA5X2ZpZCAqZmlkLCAqb2xkX2ZpZCA9IE5VTEw7Ci0Jc3RydWN0IGRlbnRyeSAqZCwgKmRzOworCXN0cnVjdCBkZW50cnkgKmRzOwogCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CiAJY2hhciAqKnduYW1lcywgKnVuYW1lOwogCkBAIC0xMzksNDkgKzE2Nyw2MiBAQAogCWZpZCA9IHY5ZnNfZmlkX2ZpbmQoZGVudHJ5LCB1aWQsIGFueSk7CiAJaWYgKGZpZCkKIAkJcmV0dXJuIGZpZDsKLQorCS8qCisJICogd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoaW5nIGZpZC4gVG8gZG8gYSBUV0FMSyB3ZSBuZWVkCisJICogcGFyZW50IGZpZC4gV2UgbmVlZCB0byBwcmV2ZW50IHJlbmFtZSB3aGVuIHdlIHdhbnQgdG8KKwkgKiBsb29rIGF0IHRoZSBwYXJlbnQuCisJICovCisJZG93bl9yZWFkKCZ2OXNlcy0+cmVuYW1lX3NlbSk7CiAJZHMgPSBkZW50cnktPmRfcGFyZW50OwogCWZpZCA9IHY5ZnNfZmlkX2ZpbmQoZHMsIHVpZCwgYW55KTsKLQlpZiAoIWZpZCkgeyAvKiB3YWxrIGZyb20gdGhlIHJvb3QgKi8KLQkJbiA9IDA7Ci0JCWZvciAoZHMgPSBkZW50cnk7ICFJU19ST09UKGRzKTsgZHMgPSBkcy0+ZF9wYXJlbnQpCi0JCQluKys7CisJaWYgKGZpZCkgeworCQkvKiBGb3VuZCB0aGUgcGFyZW50IGZpZCBkbyBhIGxvb2t1cCB3aXRoIHRoYXQgKi8KKwkJZmlkID0gcDlfY2xpZW50X3dhbGsoZmlkLCAxLCAoY2hhciAqKikmZGVudHJ5LT5kX25hbWUubmFtZSwgMSk7CisJCWdvdG8gZmlkX291dDsKKwl9CisJdXBfcmVhZCgmdjlzZXMtPnJlbmFtZV9zZW0pOwogCi0JCWZpZCA9IHY5ZnNfZmlkX2ZpbmQoZHMsIHVpZCwgYW55KTsKLQkJaWYgKCFmaWQpIHsgLyogdGhlIHVzZXIgaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBmcyB5ZXQgKi8KLQkJCWlmIChhY2Nlc3MgPT0gVjlGU19BQ0NFU1NfU0lOR0xFKQotCQkJCXJldHVybiBFUlJfUFRSKC1FUEVSTSk7CisJLyogc3RhcnQgZnJvbSB0aGUgcm9vdCBhbmQgdHJ5IHRvIGRvIGEgbG9va3VwICovCisJZmlkID0gdjlmc19maWRfZmluZChkZW50cnktPmRfc2ItPnNfcm9vdCwgdWlkLCBhbnkpOworCWlmICghZmlkKSB7CisJCS8qIHRoZSB1c2VyIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgZnMgeWV0ICovCisJCWlmIChhY2Nlc3MgPT0gVjlGU19BQ0NFU1NfU0lOR0xFKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKIAotCQkJaWYgKHY5ZnNfcHJvdG9fZG90dSh2OXNlcykpCisJCWlmICh2OWZzX3Byb3RvX2RvdHUodjlzZXMpIHx8IHY5ZnNfcHJvdG9fZG90bCh2OXNlcykpCiAJCQkJdW5hbWUgPSBOVUxMOwotCQkJZWxzZQotCQkJCXVuYW1lID0gdjlzZXMtPnVuYW1lOworCQllbHNlCisJCQl1bmFtZSA9IHY5c2VzLT51bmFtZTsKIAotCQkJZmlkID0gcDlfY2xpZW50X2F0dGFjaCh2OXNlcy0+Y2xudCwgTlVMTCwgdW5hbWUsIHVpZCwKLQkJCQl2OXNlcy0+YW5hbWUpOworCQlmaWQgPSBwOV9jbGllbnRfYXR0YWNoKHY5c2VzLT5jbG50LCBOVUxMLCB1bmFtZSwgdWlkLAorCQkJCSAgICAgICB2OXNlcy0+YW5hbWUpOworCQlpZiAoSVNfRVJSKGZpZCkpCisJCQlyZXR1cm4gZmlkOwogCi0JCQlpZiAoSVNfRVJSKGZpZCkpCi0JCQkJcmV0dXJuIGZpZDsKLQotCQkJdjlmc19maWRfYWRkKGRzLCBmaWQpOwotCQl9Ci0JfSBlbHNlIC8qIHdhbGsgZnJvbSB0aGUgcGFyZW50ICovCi0JCW4gPSAxOwotCi0JaWYgKGRzID09IGRlbnRyeSkKKwkJdjlmc19maWRfYWRkKGRlbnRyeS0+ZF9zYi0+c19yb290LCBmaWQpOworCX0KKwkvKiBJZiB3ZSBhcmUgcm9vdCBvdXJzZWxmIGp1c3QgcmV0dXJuIHRoYXQgKi8KKwlpZiAoZGVudHJ5LT5kX3NiLT5zX3Jvb3QgPT0gZGVudHJ5KQogCQlyZXR1cm4gZmlkOwotCi0Jd25hbWVzID0ga21hbGxvYyhzaXplb2YoY2hhciAqKSAqIG4sIEdGUF9LRVJORUwpOwotCWlmICghd25hbWVzKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWZvciAoZCA9IGRlbnRyeSwgaSA9IChuLTEpOyBpID49IDA7IGktLSwgZCA9IGQtPmRfcGFyZW50KQotCQl3bmFtZXNbaV0gPSAoY2hhciAqKSBkLT5kX25hbWUubmFtZTsKLQorCS8qCisJICogRG8gYSBtdWx0aXBhdGggd2FsayB3aXRoIGF0dGFjaGVkIHJvb3QuCisJICogV2hlbiB3YWxraW5nIHBhcmVudCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZQorCSAqIGRvbid0IGhhdmUgYSBwYXJhbGxlbCByZW5hbWUgaGFwcGVuaW5nCisJICovCisJZG93bl9yZWFkKCZ2OXNlcy0+cmVuYW1lX3NlbSk7CisJbiAgPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KHY5c2VzLCBkZW50cnksICZ3bmFtZXMpOworCWlmIChuIDwgMCkgeworCQlmaWQgPSBFUlJfUFRSKG4pOworCQlnb3RvIGVycl9vdXQ7CisJfQogCWNsb25lID0gMTsKIAlpID0gMDsKIAl3aGlsZSAoaSA8IG4pIHsKIAkJbCA9IG1pbihuIC0gaSwgUDlfTUFYV0VMRU0pOworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGhvbGQgcmVuYW1lIGxvY2sgd2hlbiBkb2luZyBhIG11bHRpcGF0aAorCQkgKiB3YWxrIHRvIGVuc3VyZSBub25lIG9mIHRoZSBwYXRjaCBjb21wb25lbnQgY2hhbmdlCisJCSAqLwogCQlmaWQgPSBwOV9jbGllbnRfd2FsayhmaWQsIGwsICZ3bmFtZXNbaV0sIGNsb25lKTsKIAkJaWYgKElTX0VSUihmaWQpKSB7CiAJCQlpZiAob2xkX2ZpZCkgewpAQCAtMTkzLDE1ICsyMzQsMTcgQEAKIAkJCQlwOV9jbGllbnRfY2x1bmsob2xkX2ZpZCk7CiAJCQl9CiAJCQlrZnJlZSh3bmFtZXMpOwotCQkJcmV0dXJuIGZpZDsKKwkJCWdvdG8gZXJyX291dDsKIAkJfQogCQlvbGRfZmlkID0gZmlkOwogCQlpICs9IGw7CiAJCWNsb25lID0gMDsKIAl9Ci0KIAlrZnJlZSh3bmFtZXMpOworZmlkX291dDoKIAl2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworZXJyX291dDoKKwl1cF9yZWFkKCZ2OXNlcy0+cmVuYW1lX3NlbSk7CiAJcmV0dXJuIGZpZDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5jIGIvZnMvOXAvdjlmcy5jCmluZGV4IGY4Yjg2ZTkuLjM4ZGMwZTAgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuYworKysgYi9mcy85cC92OWZzLmMKQEAgLTIzNyw2ICsyMzcsNyBAQAogCQlfX3B1dG5hbWUodjlzZXMtPnVuYW1lKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQorCWluaXRfcndzZW0oJnY5c2VzLT5yZW5hbWVfc2VtKTsKIAogCXJjID0gYmRpX3NldHVwX2FuZF9yZWdpc3RlcigmdjlzZXMtPmJkaSwgIjlwIiwgQkRJX0NBUF9NQVBfQ09QWSk7CiAJaWYgKHJjKSB7CkBAIC0yNzgsNyArMjc5LDcgQEAKIAl2OXNlcy0+bWF4ZGF0YSA9IHY5c2VzLT5jbG50LT5tc2l6ZSAtIFA5X0lPSERSU1o7CiAKIAkvKiBmb3IgbGVnYWN5IG1vZGUsIGZhbGwgYmFjayB0byBWOUZTX0FDQ0VTU19BTlkgKi8KLQlpZiAoIXY5ZnNfcHJvdG9fZG90dSh2OXNlcykgJiYKKwlpZiAoISh2OWZzX3Byb3RvX2RvdHUodjlzZXMpIHx8IHY5ZnNfcHJvdG9fZG90bCh2OXNlcykpICYmCiAJCSgodjlzZXMtPmZsYWdzJlY5RlNfQUNDRVNTX01BU0spID09IFY5RlNfQUNDRVNTX1VTRVIpKSB7CiAKIAkJdjlzZXMtPmZsYWdzICY9IH5WOUZTX0FDQ0VTU19NQVNLOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5oIGIvZnMvOXAvdjlmcy5oCmluZGV4IGJlYzRkMGIuLjRjOTYzYzkgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuaAorKysgYi9mcy85cC92OWZzLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CS8qIDlwIGNsaWVudCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgc2xpc3Q7IC8qIGxpc3Qgb2Ygc2Vzc2lvbnMgcmVnaXN0ZXJlZCB3aXRoIHY5ZnMgKi8KIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBiZGk7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSByZW5hbWVfc2VtOwogfTsKIAogc3RydWN0IHA5X2ZpZCAqdjlmc19zZXNzaW9uX2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICosIGNvbnN0IGNoYXIgKiwKZGlmZiAtLWdpdCBhL2ZzLzlwL3Y5ZnNfdmZzLmggYi9mcy85cC92OWZzX3Zmcy5oCmluZGV4IDMyZWY0MDAuLmY0N2M2YmIgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnNfdmZzLmgKKysrIGIvZnMvOXAvdjlmc192ZnMuaApAQCAtNTUsNiArNTUsNyBAQAogdm9pZCB2OWZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogaW5vX3Qgdjlmc19xaWQyaW5vKHN0cnVjdCBwOV9xaWQgKnFpZCk7CiB2b2lkIHY5ZnNfc3RhdDJpbm9kZShzdHJ1Y3QgcDlfd3N0YXQgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3ZvaWQgdjlmc19zdGF0Mmlub2RlX2RvdGwoc3RydWN0IHA5X3N0YXRfZG90bCAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgdjlmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBpbnQgdjlmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogdm9pZCB2OWZzX2lub2RlMnN0YXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHA5X3dzdGF0ICpzdGF0KTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19kaXIuYyBiL2ZzLzlwL3Zmc19kaXIuYwppbmRleCBkNjFlM2IyLi4xNmM4YTJhIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfZGlyLmMKKysrIGIvZnMvOXAvdmZzX2Rpci5jCkBAIC04Nyw2ICs4Nyw0MiBAQAogfQogCiAvKioKKyAqIHY5ZnNfYWxsb2NfcmRpcl9idWYgLSBBbGxvY2F0ZSBidWZmZXIgdXNlZCBmb3IgcmVhZCBhbmQgcmVhZGRpcgorICogQGZpbHA6IG9wZW5lZCBmaWxlIHN0cnVjdHVyZQorICogQGJ1ZmxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciB0byBhbGxvY2F0ZQorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfYWxsb2NfcmRpcl9idWYoc3RydWN0IGZpbGUgKmZpbHAsIGludCBidWZsZW4pCit7CisJc3RydWN0IHA5X3JkaXIgKnJkaXI7CisJc3RydWN0IHA5X2ZpZCAqZmlkOworCWludCBlcnIgPSAwOworCisJZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmICghZmlkLT5yZGlyKSB7CisJCXJkaXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcDlfcmRpcikgKyBidWZsZW4sIEdGUF9LRVJORUwpOworCisJCWlmIChyZGlyID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJc3Bpbl9sb2NrKCZmaWxwLT5mX2RlbnRyeS0+ZF9sb2NrKTsKKwkJaWYgKCFmaWQtPnJkaXIpIHsKKwkJCXJkaXItPmJ1ZiA9ICh1aW50OF90ICopcmRpciArIHNpemVvZihzdHJ1Y3QgcDlfcmRpcik7CisJCQltdXRleF9pbml0KCZyZGlyLT5tdXRleCk7CisJCQlyZGlyLT5oZWFkID0gcmRpci0+dGFpbCA9IDA7CisJCQlmaWQtPnJkaXIgPSAodm9pZCAqKSByZGlyOworCQkJcmRpciA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2xvY2spOworCQlrZnJlZShyZGlyKTsKKwl9CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKKy8qKgogICogdjlmc19kaXJfcmVhZGRpciAtIHJlYWQgYSBkaXJlY3RvcnkKICAqIEBmaWxwOiBvcGVuZWQgZmlsZSBzdHJ1Y3R1cmUKICAqIEBkaXJlbnQ6IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgPz8/CkBAIC0xMDksMjUgKzE0NSw5IEBACiAKIAlidWZsZW4gPSBmaWQtPmNsbnQtPm1zaXplIC0gUDlfSU9IRFJTWjsKIAotCS8qIGFsbG9jYXRlIHJkaXIgb24gZGVtYW5kICovCi0JaWYgKCFmaWQtPnJkaXIpIHsKLQkJcmRpciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwOV9yZGlyKSArIGJ1ZmxlbiwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHJkaXIgPT0gTlVMTCkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlzcGluX2xvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2xvY2spOwotCQlpZiAoIWZpZC0+cmRpcikgewotCQkJcmRpci0+YnVmID0gKHVpbnQ4X3QgKilyZGlyICsgc2l6ZW9mKHN0cnVjdCBwOV9yZGlyKTsKLQkJCW11dGV4X2luaXQoJnJkaXItPm11dGV4KTsKLQkJCXJkaXItPmhlYWQgPSByZGlyLT50YWlsID0gMDsKLQkJCWZpZC0+cmRpciA9ICh2b2lkICopIHJkaXI7Ci0JCQlyZGlyID0gTlVMTDsKLQkJfQotCQlzcGluX3VubG9jaygmZmlscC0+Zl9kZW50cnktPmRfbG9jayk7Ci0JCWtmcmVlKHJkaXIpOwotCX0KKwllcnIgPSB2OWZzX2FsbG9jX3JkaXJfYnVmKGZpbHAsIGJ1Zmxlbik7CisJaWYgKGVycikKKwkJZ290byBleGl0OwogCXJkaXIgPSAoc3RydWN0IHA5X3JkaXIgKikgZmlkLT5yZGlyOwogCiAJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZyZGlyLT5tdXRleCk7CkBAIC0xNDYsNyArMTY2LDcgQEAKIAkJd2hpbGUgKHJkaXItPmhlYWQgPCByZGlyLT50YWlsKSB7CiAJCQlwOXN0YXRfaW5pdCgmc3QpOwogCQkJZXJyID0gcDlzdGF0X3JlYWQocmRpci0+YnVmICsgcmRpci0+aGVhZCwKLQkJCQkJCWJ1ZmxlbiAtIHJkaXItPmhlYWQsICZzdCwKKwkJCQkJCXJkaXItPnRhaWwgLSByZGlyLT5oZWFkLCAmc3QsCiAJCQkJCQlmaWQtPmNsbnQtPnByb3RvX3ZlcnNpb24pOwogCQkJaWYgKGVycikgewogCQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicmV0dXJuZWQgJWRcbiIsIGVycik7CkBAIC0xNzYsNiArMTk2LDg4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyoqCisgKiB2OWZzX2Rpcl9yZWFkZGlyX2RvdGwgLSByZWFkIGEgZGlyZWN0b3J5CisgKiBAZmlscDogb3BlbmVkIGZpbGUgc3RydWN0dXJlCisgKiBAZGlyZW50OiBidWZmZXIgdG8gZmlsbCBkaXJlbnQgc3RydWN0dXJlcworICogQGZpbGxkaXI6IGZ1bmN0aW9uIHRvIHBvcHVsYXRlIGRpcmVudCBzdHJ1Y3R1cmVzCisgKgorICovCitzdGF0aWMgaW50IHY5ZnNfZGlyX3JlYWRkaXJfZG90bChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LAorCQkJCQkJZmlsbGRpcl90IGZpbGxkaXIpCit7CisJaW50IG92ZXI7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHA5X2ZpZCAqZmlkOworCWludCBidWZsZW47CisJc3RydWN0IHA5X3JkaXIgKnJkaXI7CisJc3RydWN0IHA5X2RpcmVudCBjdXJkaXJlbnQ7CisJdTY0IG9sZG9mZnNldCA9IDA7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIm5hbWUgJXNcbiIsIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKKwlmaWQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlidWZsZW4gPSBmaWQtPmNsbnQtPm1zaXplIC0gUDlfUkVBRERJUkhEUlNaOworCisJZXJyID0gdjlmc19hbGxvY19yZGlyX2J1ZihmaWxwLCBidWZsZW4pOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwlyZGlyID0gKHN0cnVjdCBwOV9yZGlyICopIGZpZC0+cmRpcjsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcmRpci0+bXV0ZXgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl3aGlsZSAoZXJyID09IDApIHsKKwkJaWYgKHJkaXItPnRhaWwgPT0gcmRpci0+aGVhZCkgeworCQkJZXJyID0gcDlfY2xpZW50X3JlYWRkaXIoZmlkLCByZGlyLT5idWYsIGJ1ZmxlbiwKKwkJCQkJCQkJZmlscC0+Zl9wb3MpOworCQkJaWYgKGVyciA8PSAwKQorCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCisJCQlyZGlyLT5oZWFkID0gMDsKKwkJCXJkaXItPnRhaWwgPSBlcnI7CisJCX0KKworCQl3aGlsZSAocmRpci0+aGVhZCA8IHJkaXItPnRhaWwpIHsKKworCQkJZXJyID0gcDlkaXJlbnRfcmVhZChyZGlyLT5idWYgKyByZGlyLT5oZWFkLAorCQkJCQkJYnVmbGVuIC0gcmRpci0+aGVhZCwgJmN1cmRpcmVudCwKKwkJCQkJCWZpZC0+Y2xudC0+cHJvdG9fdmVyc2lvbik7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicmV0dXJuZWQgJWRcbiIsIGVycik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJCX0KKworCQkJLyogZF9vZmYgaW4gZGlyZW50IHN0cnVjdHVyZSB0cmFja3MgdGhlIG9mZnNldCBpbnRvCisJCQkgKiB0aGUgbmV4dCBkaXJlbnQgaW4gdGhlIGRpci4gSG93ZXZlciwgZmlsbGRpcigpCisJCQkgKiBleHBlY3RzIG9mZnNldCBpbnRvIHRoZSBjdXJyZW50IGRpcmVudC4gSGVuY2UKKwkJCSAqIHdoaWxlIGNhbGxpbmcgZmlsbGRpciBzZW5kIHRoZSBvZmZzZXQgZnJvbSB0aGUKKwkJCSAqIHByZXZpb3VzIGRpcmVudCBzdHJ1Y3R1cmUuCisJCQkgKi8KKwkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgY3VyZGlyZW50LmRfbmFtZSwKKwkJCQkJc3RybGVuKGN1cmRpcmVudC5kX25hbWUpLAorCQkJCQlvbGRvZmZzZXQsIHY5ZnNfcWlkMmlubygmY3VyZGlyZW50LnFpZCksCisJCQkJCWN1cmRpcmVudC5kX3R5cGUpOworCQkJb2xkb2Zmc2V0ID0gY3VyZGlyZW50LmRfb2ZmOworCisJCQlpZiAob3ZlcikgeworCQkJCWVyciA9IDA7CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisKKwkJCWZpbHAtPmZfcG9zID0gY3VyZGlyZW50LmRfb2ZmOworCQkJcmRpci0+aGVhZCArPSBlcnI7CisJCX0KKwl9CisKK3VubG9ja19hbmRfZXhpdDoKKwltdXRleF91bmxvY2soJnJkaXItPm11dGV4KTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKwogCiAvKioKICAqIHY5ZnNfZGlyX3JlbGVhc2UgLSBjbG9zZSBhIGRpcmVjdG9yeQpAQCAtMjA3LDcgKzMwOSw3IEBACiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfZGlyX29wZXJhdGlvbnNfZG90bCA9IHsKIAkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWRkaXIgPSB2OWZzX2Rpcl9yZWFkZGlyLAorCS5yZWFkZGlyID0gdjlmc19kaXJfcmVhZGRpcl9kb3RsLAogCS5vcGVuID0gdjlmc19maWxlX29wZW4sCiAJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAogfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19maWxlLmMgYi9mcy85cC92ZnNfZmlsZS5jCmluZGV4IDJiZWRjNmMuLmU5N2M5MmIgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19maWxlLmMKKysrIGIvZnMvOXAvdmZzX2ZpbGUuYwpAQCAtNTksOSArNTksMTMgQEAKIAlzdHJ1Y3QgcDlfZmlkICpmaWQ7CiAJaW50IG9tb2RlOwogCi0JUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZTogJXAgZmlsZTogJXAgXG4iLCBpbm9kZSwgZmlsZSk7CisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZTogJXAgZmlsZTogJXBcbiIsIGlub2RlLCBmaWxlKTsKIAl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOwotCW9tb2RlID0gdjlmc191ZmxhZ3Myb21vZGUoZmlsZS0+Zl9mbGFncywgdjlmc19wcm90b19kb3R1KHY5c2VzKSk7CisJaWYgKHY5ZnNfcHJvdG9fZG90bCh2OXNlcykpCisJCW9tb2RlID0gZmlsZS0+Zl9mbGFnczsKKwllbHNlCisJCW9tb2RlID0gdjlmc191ZmxhZ3Myb21vZGUoZmlsZS0+Zl9mbGFncywKKwkJCQkJdjlmc19wcm90b19kb3R1KHY5c2VzKSk7CiAJZmlkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmICghZmlkKSB7CiAJCWZpZCA9IHY5ZnNfZmlkX2Nsb25lKGZpbGUtPmZfcGF0aC5kZW50cnkpOwpAQCAtNzMsMTEgKzc3LDEyIEBACiAJCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJaWYgKG9tb2RlICYgUDlfT1RSVU5DKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19UUlVOQykgewogCQkJaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKIAkJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCX0KLQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpICYmICghdjlmc19wcm90b19kb3R1KHY5c2VzKSkpCisJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSAmJgorCQkJKCF2OWZzX3Byb3RvX2RvdHUodjlzZXMpICYmICF2OWZzX3Byb3RvX2RvdGwodjlzZXMpKSkKIAkJCWdlbmVyaWNfZmlsZV9sbHNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOwogCX0KIApAQCAtMTM5LDcgKzE0NCw3IEBACiB2OWZzX2ZpbGVfcmVhZG4oc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgKmRhdGEsIGNoYXIgX191c2VyICp1ZGF0YSwgdTMyIGNvdW50LAogCSAgICAgICB1NjQgb2Zmc2V0KQogewotCWludCBuLCB0b3RhbDsKKwlpbnQgbiwgdG90YWwsIHNpemU7CiAJc3RydWN0IHA5X2ZpZCAqZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWQgJWQgb2Zmc2V0ICVsbHUgY291bnQgJWRcbiIsIGZpZC0+ZmlkLApAQCAtMTQ3LDYgKzE1Miw3IEBACiAKIAluID0gMDsKIAl0b3RhbCA9IDA7CisJc2l6ZSA9IGZpZC0+aW91bml0ID8gZmlkLT5pb3VuaXQgOiBmaWQtPmNsbnQtPm1zaXplIC0gUDlfSU9IRFJTWjsKIAlkbyB7CiAJCW4gPSBwOV9jbGllbnRfcmVhZChmaWQsIGRhdGEsIHVkYXRhLCBvZmZzZXQsIGNvdW50KTsKIAkJaWYgKG4gPD0gMCkKQEAgLTE2MCw3ICsxNjYsNyBAQAogCQlvZmZzZXQgKz0gbjsKIAkJY291bnQgLT0gbjsKIAkJdG90YWwgKz0gbjsKLQl9IHdoaWxlIChjb3VudCA+IDAgJiYgbiA9PSAoZmlkLT5jbG50LT5tc2l6ZSAtIFA5X0lPSERSU1opKTsKKwl9IHdoaWxlIChjb3VudCA+IDAgJiYgbiA9PSBzaXplKTsKIAogCWlmIChuIDwgMCkKIAkJdG90YWwgPSBuOwpAQCAtMTgzLDExICsxODksMTMgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBwOV9maWQgKmZpZDsKKwlzaXplX3Qgc2l6ZTsKIAogCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiY291bnQgJXp1IG9mZnNldCAlbGxkXG4iLCBjb3VudCwgKm9mZnNldCk7CiAJZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCi0JaWYgKGNvdW50ID4gKGZpZC0+Y2xudC0+bXNpemUgLSBQOV9JT0hEUlNaKSkKKwlzaXplID0gZmlkLT5pb3VuaXQgPyBmaWQtPmlvdW5pdCA6IGZpZC0+Y2xudC0+bXNpemUgLSBQOV9JT0hEUlNaOworCWlmIChjb3VudCA+IHNpemUpCiAJCXJldCA9IHY5ZnNfZmlsZV9yZWFkbihmaWxwLCBOVUxMLCB1ZGF0YSwgY291bnQsICpvZmZzZXQpOwogCWVsc2UKIAkJcmV0ID0gcDlfY2xpZW50X3JlYWQoZmlkLCBOVUxMLCB1ZGF0YSwgKm9mZnNldCwgY291bnQpOwpAQCAtMjI0LDkgKzIzMiw3IEBACiAJZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWNsbnQgPSBmaWQtPmNsbnQ7CiAKLQlyc2l6ZSA9IGZpZC0+aW91bml0OwotCWlmICghcnNpemUgfHwgcnNpemUgPiBjbG50LT5tc2l6ZS1QOV9JT0hEUlNaKQotCQlyc2l6ZSA9IGNsbnQtPm1zaXplIC0gUDlfSU9IRFJTWjsKKwlyc2l6ZSA9IGZpZC0+aW91bml0ID8gZmlkLT5pb3VuaXQgOiBjbG50LT5tc2l6ZSAtIFA5X0lPSERSU1o7CiAKIAlkbyB7CiAJCWlmIChjb3VudCA8IHJzaXplKQpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlLmMgYi9mcy85cC92ZnNfaW5vZGUuYwppbmRleCA0MzMxYjNiLi42ZTk0ZjMyIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGUuYworKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bmV0LzlwLzlwLmg+CiAjaW5jbHVkZSA8bmV0LzlwL2NsaWVudC5oPgogCkBAIC00Miw2ICs0Myw3IEBACiAjaW5jbHVkZSAidjlmc192ZnMuaCIKICNpbmNsdWRlICJmaWQuaCIKICNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZG90dTsKQEAgLTIzNiw2ICsyMzgsNDEgQEAKICNlbmRpZgogCiAvKioKKyAqIHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUgLSBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBnaWQgZm9yIGNyZWF0aW5nIGEKKyAqIG5ldyBmaWxlIHN5c3RlbSBvYmplY3QuIFRoaXMgY2hlY2tzIHRoZSBTX0lTR0lEIHRvIGRldGVybWluZSB0aGUgb3duaW5nCisgKiBncm91cCBvZiB0aGUgbmV3IGZpbGUgc3lzdGVtIG9iamVjdC4KKyAqLworCitzdGF0aWMgZ2lkX3Qgdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSkKK3sKKwlCVUdfT04oZGlyX2lub2RlID09IE5VTEwpOworCisJaWYgKGRpcl9pbm9kZS0+aV9tb2RlICYgU19JU0dJRCkgeworCQkvKiBzZXRfZ2lkIGJpdCBpcyBzZXQuKi8KKwkJcmV0dXJuIGRpcl9pbm9kZS0+aV9naWQ7CisJfQorCXJldHVybiBjdXJyZW50X2ZzZ2lkKCk7Cit9CisKKy8qKgorICogdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUgLSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkZW50cnkgZnJvbQorICogZGlyIGlub2RlLgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkvKiBEaXJlY3Rvcnkgc2hvdWxkIGhhdmUgb25seSBvbmUgZW50cnkuICovCisJQlVHX09OKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIWxpc3RfaXNfc2luZ3VsYXIoJmlub2RlLT5pX2RlbnRyeSkpOworCWRlbnRyeSA9IGxpc3RfZW50cnkoaW5vZGUtPmlfZGVudHJ5Lm5leHQsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworLyoqCiAgKiB2OWZzX2dldF9pbm9kZSAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCBhbiBpbm9kZQogICogQHNiOiBzdXBlcmJsb2NrCiAgKiBAbW9kZTogbW9kZSB0byBzZXR1cCBpbm9kZSB3aXRoCkBAIC0yNjcsNyArMzA0LDEzIEBACiAJY2FzZSBTX0lGQkxLOgogCWNhc2UgU19JRkNIUjoKIAljYXNlIFNfSUZTT0NLOgotCQlpZiAoIXY5ZnNfcHJvdG9fZG90dSh2OXNlcykpIHsKKwkJaWYgKHY5ZnNfcHJvdG9fZG90bCh2OXNlcykpIHsKKwkJCWlub2RlLT5pX29wID0gJnY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zX2RvdGw7CisJCQlpbm9kZS0+aV9mb3AgPSAmdjlmc19maWxlX29wZXJhdGlvbnNfZG90bDsKKwkJfSBlbHNlIGlmICh2OWZzX3Byb3RvX2RvdHUodjlzZXMpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZ2OWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZ2OWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJfSBlbHNlIHsKIAkJCVA5X0RQUklOVEsoUDlfREVCVUdfRVJST1IsCiAJCQkJICAgInNwZWNpYWwgZmlsZXMgd2l0aG91dCBleHRlbmRlZCBtb2RlXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CkBAIC0zOTYsMjMgKzQzOSwxNCBAQAogI2VuZGlmCiB9CiAKLS8qKgotICogdjlmc19pbm9kZV9mcm9tX2ZpZCAtIHBvcHVsYXRlIGFuIGlub2RlIGJ5IGlzc3VpbmcgYSBhdHRyaWJ1dGUgcmVxdWVzdAotICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCi0gKiBAZmlkOiBmaWQgdG8gaXNzdWUgYXR0cmlidXRlIHJlcXVlc3QgZm9yCi0gKiBAc2I6IHN1cGVyYmxvY2sgb24gd2hpY2ggdG8gY3JlYXRlIGlub2RlCi0gKgotICovCi0KIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgotdjlmc19pbm9kZV9mcm9tX2ZpZChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3QgcDlfZmlkICpmaWQsCit2OWZzX2lub2RlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCBwOV9maWQgKmZpZCwKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWludCBlcnIsIHVtb2RlOwotCXN0cnVjdCBpbm9kZSAqcmV0OworCXN0cnVjdCBpbm9kZSAqcmV0ID0gTlVMTDsKIAlzdHJ1Y3QgcDlfd3N0YXQgKnN0OwogCi0JcmV0ID0gTlVMTDsKIAlzdCA9IHA5X2NsaWVudF9zdGF0KGZpZCk7CiAJaWYgKElTX0VSUihzdCkpCiAJCXJldHVybiBFUlJfQ0FTVChzdCk7CkBAIC00MzMsMTUgKzQ2Nyw2MiBAQAogI2VuZGlmCiAJcDlzdGF0X2ZyZWUoc3QpOwogCWtmcmVlKHN0KTsKLQogCXJldHVybiByZXQ7Ci0KIGVycm9yOgogCXA5c3RhdF9mcmVlKHN0KTsKIAlrZnJlZShzdCk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAorc3RhdGljIHN0cnVjdCBpbm9kZSAqCit2OWZzX2lub2RlX2RvdGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICpyZXQgPSBOVUxMOworCWludCBlcnI7CisJc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7CisKKwlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19CQVNJQyk7CisJaWYgKElTX0VSUihzdCkpCisJCXJldHVybiBFUlJfQ0FTVChzdCk7CisKKwlyZXQgPSB2OWZzX2dldF9pbm9kZShzYiwgc3QtPnN0X21vZGUpOworCWlmIChJU19FUlIocmV0KSkgeworCQllcnIgPSBQVFJfRVJSKHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdjlmc19zdGF0Mmlub2RlX2RvdGwoc3QsIHJldCk7CisJcmV0LT5pX2lubyA9IHY5ZnNfcWlkMmlubygmc3QtPnFpZCk7CisjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKKwl2OWZzX3Zjb29raWVfc2V0X3FpZChyZXQsICZzdC0+cWlkKTsKKwl2OWZzX2NhY2hlX2lub2RlX2dldF9jb29raWUocmV0KTsKKyNlbmRpZgorCWtmcmVlKHN0KTsKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJa2ZyZWUoc3QpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qKgorICogdjlmc19pbm9kZV9mcm9tX2ZpZCAtIEhlbHBlciByb3V0aW5lIHRvIHBvcHVsYXRlIGFuIGlub2RlIGJ5CisgKiBpc3N1aW5nIGEgYXR0cmlidXRlIHJlcXVlc3QKKyAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgorICogQGZpZDogZmlkIHRvIGlzc3VlIGF0dHJpYnV0ZSByZXF1ZXN0IGZvcgorICogQHNiOiBzdXBlcmJsb2NrIG9uIHdoaWNoIHRvIGNyZWF0ZSBpbm9kZQorICoKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKgordjlmc19pbm9kZV9mcm9tX2ZpZChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3QgcDlfZmlkICpmaWQsCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmICh2OWZzX3Byb3RvX2RvdGwodjlzZXMpKQorCQlyZXR1cm4gdjlmc19pbm9kZV9kb3RsKHY5c2VzLCBmaWQsIHNiKTsKKwllbHNlCisJCXJldHVybiB2OWZzX2lub2RlKHY5c2VzLCBmaWQsIHNiKTsKK30KKwogLyoqCiAgKiB2OWZzX3JlbW92ZSAtIGhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCiAgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgdGhhdCBpcyBiZWluZyBkZWxldGVkCkBAIC01NjMsNiArNjQ0LDExOCBAQAogfQogCiAvKioKKyAqIHY5ZnNfdmZzX2NyZWF0ZV9kb3RsIC0gVkZTIGhvb2sgdG8gY3JlYXRlIGZpbGVzIGZvciA5UDIwMDAuTCBwcm90b2NvbC4KKyAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQKKyAqIEBkZW50cnk6ICBkZW50cnkgdGhhdCBpcyBiZWluZyBkZWxldGVkCisgKiBAbW9kZTogY3JlYXRlIHBlcm1pc3Npb25zCisgKiBAbmQ6IHBhdGggaW5mb3JtYXRpb24KKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfY3JlYXRlX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBlcnIgPSAwOworCWNoYXIgKm5hbWUgPSBOVUxMOworCWdpZF90IGdpZDsKKwlpbnQgZmxhZ3M7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMOworCXN0cnVjdCBwOV9maWQgKmRmaWQsICpvZmlkOworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBwOV9xaWQgcWlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKKwlpZiAobmQgJiYgbmQtPmZsYWdzICYgTE9PS1VQX09QRU4pCisJCWZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzIC0gMTsKKwllbHNlCisJCWZsYWdzID0gT19SRFdSOworCisJbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJ2OWZzX3Zmc19jcmVhdGVfZG90bDogbmFtZTolcyBmbGFnczoweCV4ICIKKwkJCSJtb2RlOjB4JXhcbiIsIG5hbWUsIGZsYWdzLCBtb2RlKTsKKworCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7CisJaWYgKElTX0VSUihkZmlkKSkgeworCQllcnIgPSBQVFJfRVJSKGRmaWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGNsb25lIGEgZmlkIHRvIHVzZSBmb3IgY3JlYXRpb24gKi8KKwlvZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMCwgTlVMTCwgMSk7CisJaWYgKElTX0VSUihvZmlkKSkgeworCQllcnIgPSBQVFJfRVJSKG9maWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7CisJZXJyID0gcDlfY2xpZW50X2NyZWF0ZV9kb3RsKG9maWQsIG5hbWUsIGZsYWdzLCBtb2RlLCBnaWQsICZxaWQpOworCWlmIChlcnIgPCAwKSB7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAorCQkJCSJwOV9jbGllbnRfb3Blbl9kb3RsIGZhaWxlZCBpbiBjcmVhdCAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIE5vIG5lZWQgdG8gcG9wdWxhdGUgdGhlIGlub2RlIGlmIHdlIGFyZSBub3Qgb3BlbmluZyB0aGUgZmlsZSBBTkQKKwkgKiBub3QgaW4gY2FjaGVkIG1vZGUuCisJICovCisJaWYgKCF2OXNlcy0+Y2FjaGUgJiYgIShuZCAmJiBuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikpIHsKKwkJLyogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlIGlub2RlIHdpdGggc3RhdCAqLworCQlkZW50cnktPmRfb3AgPSAmdjlmc19kZW50cnlfb3BlcmF0aW9uczsKKwkJcDlfY2xpZW50X2NsdW5rKG9maWQpOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgTlVMTCk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vdyB3YWxrIGZyb20gdGhlIHBhcmVudCBzbyB3ZSBjYW4gZ2V0IGFuIHVub3BlbmVkIGZpZC4gKi8KKwlmaWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAxLCAmbmFtZSwgMSk7CisJaWYgKElTX0VSUihmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsIGVycik7CisJCWZpZCA9IE5VTEw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIGRlbnRyeSAqLworCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGVudHJ5LT5kX29wID0gJnY5ZnNfY2FjaGVkX2RlbnRyeV9vcGVyYXRpb25zOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJZXJyID0gdjlmc19maWRfYWRkKGRlbnRyeSwgZmlkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIGlmIHdlIGFyZSBvcGVuaW5nIGEgZmlsZSwgYXNzaWduIHRoZSBvcGVuIGZpZCB0byB0aGUgZmlsZSAqLworCWlmIChuZCAmJiBuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikgeworCQlmaWxwID0gbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAobmQsIGRlbnRyeSwgdjlmc19vcGVuX2NyZWF0ZWQpOworCQlpZiAoSVNfRVJSKGZpbHApKSB7CisJCQlwOV9jbGllbnRfY2x1bmsob2ZpZCk7CisJCQlyZXR1cm4gUFRSX0VSUihmaWxwKTsKKwkJfQorCQlmaWxwLT5wcml2YXRlX2RhdGEgPSBvZmlkOworCX0gZWxzZQorCQlwOV9jbGllbnRfY2x1bmsob2ZpZCk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKG9maWQpCisJCXA5X2NsaWVudF9jbHVuayhvZmlkKTsKKwlpZiAoZmlkKQorCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKICAqIHY5ZnNfdmZzX2NyZWF0ZSAtIFZGUyBob29rIHRvIGNyZWF0ZSBmaWxlcwogICogQGRpcjogZGlyZWN0b3J5IGlub2RlIHRoYXQgaXMgYmVpbmcgY3JlYXRlZAogICogQGRlbnRyeTogIGRlbnRyeSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQKQEAgLTY1Miw2ICs4NDUsODMgQEAKIAlyZXR1cm4gZXJyOwogfQogCisKKy8qKgorICogdjlmc192ZnNfbWtkaXJfZG90bCAtIFZGUyBta2RpciBob29rIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeQorICogQGRpcjogIGlub2RlIHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKKyAqIEBkZW50cnk6IGRlbnRyeSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCisgKiBAbW9kZTogbW9kZSBmb3IgbmV3IGRpcmVjdG9yeQorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfdmZzX21rZGlyX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJaW50IG1vZGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKKwlnaWRfdCBnaWQ7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwOV9xaWQgcWlkOworCXN0cnVjdCBkZW50cnkgKmRpcl9kZW50cnk7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIm5hbWUgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWVyciA9IDA7CisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisKKwltb2RlIHw9IFNfSUZESVI7CisJZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7CisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZGZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCWRmaWQgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKKwlpZiAoZ2lkIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKwllcnIgPSBwOV9jbGllbnRfbWtkaXJfZG90bChkZmlkLCBuYW1lLCBtb2RlLCBnaWQsICZxaWQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIHRoZSBkZW50cnkgKi8KKwlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKSB7CisJCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKKwkJaWYgKElTX0VSUihmaWQpKSB7CisJCQllcnIgPSBQVFJfRVJSKGZpZCk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwKKwkJCQllcnIpOworCQkJZmlkID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpbm9kZSA9IHY5ZnNfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCisJCQkJZXJyKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGVudHJ5LT5kX29wID0gJnY5ZnNfY2FjaGVkX2RlbnRyeV9vcGVyYXRpb25zOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWZpZCA9IE5VTEw7CisJfQorZXJyb3I6CisJaWYgKGZpZCkKKwkJcDlfY2xpZW50X2NsdW5rKGZpZCk7CisJcmV0dXJuIGVycjsKK30KKwogLyoqCiAgKiB2OWZzX3Zmc19sb29rdXAgLSBWRlMgbG9va3VwIGhvb2sgdG8gIndhbGsiIHRvIGEgbmV3IGlub2RlCiAgKiBAZGlyOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB3YWxrZWQgZnJvbQpAQCAtNjc4LDYgKzk0OCw3IEBACiAKIAlzYiA9IGRpci0+aV9zYjsKIAl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKKwkvKiBXZSBjYW4gd2FsayBkX3BhcmVudCBiZWNhdXNlIHdlIGhvbGQgdGhlIGRpci0+aV9tdXRleCAqLwogCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7CiAJaWYgKElTX0VSUihkZmlkKSkKIAkJcmV0dXJuIEVSUl9DQVNUKGRmaWQpOwpAQCAtNzg1LDI3ICsxMDU2LDMzIEBACiAJCWdvdG8gY2x1bmtfb2xkZGlyOwogCX0KIAorCWRvd25fd3JpdGUoJnY5c2VzLT5yZW5hbWVfc2VtKTsKIAlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkgewogCQlyZXR2YWwgPSBwOV9jbGllbnRfcmVuYW1lKG9sZGZpZCwgbmV3ZGlyZmlkLAogCQkJCQkoY2hhciAqKSBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCWlmIChyZXR2YWwgIT0gLUVOT1NZUykKIAkJCWdvdG8gY2x1bmtfbmV3ZGlyOwogCX0KKwlpZiAob2xkX2RlbnRyeS0+ZF9wYXJlbnQgIT0gbmV3X2RlbnRyeS0+ZF9wYXJlbnQpIHsKKwkJLyoKKwkJICogOVAgLnUgY2FuIG9ubHkgaGFuZGxlIGZpbGUgcmVuYW1lIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorCQkgKi8KIAotCS8qIDlQIGNhbiBvbmx5IGhhbmRsZSBmaWxlIHJlbmFtZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgKi8KLQlpZiAobWVtY21wKCZvbGRkaXJmaWQtPnFpZCwgJm5ld2RpcmZpZC0+cWlkLCBzaXplb2YobmV3ZGlyZmlkLT5xaWQpKSkgewogCQlQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLAogCQkJCSJvbGQgZGlyIGFuZCBuZXcgZGlyIGFyZSBkaWZmZXJlbnRcbiIpOwogCQlyZXR2YWwgPSAtRVhERVY7CiAJCWdvdG8gY2x1bmtfbmV3ZGlyOwogCX0KLQogCXY5ZnNfYmxhbmtfd3N0YXQoJndzdGF0KTsKIAl3c3RhdC5tdWlkID0gdjlzZXMtPnVuYW1lOwogCXdzdGF0Lm5hbWUgPSAoY2hhciAqKSBuZXdfZGVudHJ5LT5kX25hbWUubmFtZTsKIAlyZXR2YWwgPSBwOV9jbGllbnRfd3N0YXQob2xkZmlkLCAmd3N0YXQpOwogCiBjbHVua19uZXdkaXI6CisJaWYgKCFyZXR2YWwpCisJCS8qIHN1Y2Nlc3NmdWwgcmVuYW1lICovCisJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwl1cF93cml0ZSgmdjlzZXMtPnJlbmFtZV9zZW0pOwogCXA5X2NsaWVudF9jbHVuayhuZXdkaXJmaWQpOwogCiBjbHVua19vbGRkaXI6CkBAIC04NTMsNiArMTEzMCw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50Cit2OWZzX3Zmc19nZXRhdHRyX2RvdGwoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHA5X2ZpZCAqZmlkOworCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0OworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJkZW50cnk6ICVwXG4iLCBkZW50cnkpOworCWVyciA9IC1FUEVSTTsKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKQorCQlyZXR1cm4gc2ltcGxlX2dldGF0dHIobW50LCBkZW50cnksIHN0YXQpOworCisJZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSk7CisJaWYgKElTX0VSUihmaWQpKQorCQlyZXR1cm4gUFRSX0VSUihmaWQpOworCisJLyogQXNrIGZvciBhbGwgdGhlIGZpZWxkcyBpbiBzdGF0IHN0cnVjdHVyZS4gU2VydmVyIHdpbGwgcmV0dXJuCisJICogd2hhdGV2ZXIgaXQgc3VwcG9ydHMKKwkgKi8KKworCXN0ID0gcDlfY2xpZW50X2dldGF0dHJfZG90bChmaWQsIFA5X1NUQVRTX0FMTCk7CisJaWYgKElTX0VSUihzdCkpCisJCXJldHVybiBQVFJfRVJSKHN0KTsKKworCXY5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0LCBkZW50cnktPmRfaW5vZGUpOworCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwkvKiBDaGFuZ2UgYmxvY2sgc2l6ZSB0byB3aGF0IHRoZSBzZXJ2ZXIgcmV0dXJuZWQgKi8KKwlzdGF0LT5ibGtzaXplID0gc3QtPnN0X2Jsa3NpemU7CisKKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogdjlmc192ZnNfc2V0YXR0ciAtIHNldCBmaWxlIG1ldGFkYXRhCiAgKiBAZGVudHJ5OiBmaWxlIHdob3NlIG1ldGFkYXRhIHRvIHNldApAQCAtOTAzLDYgKzEyMTYsNDkgQEAKIH0KIAogLyoqCisgKiB2OWZzX3Zmc19zZXRhdHRyX2RvdGwgLSBzZXQgZmlsZSBtZXRhZGF0YQorICogQGRlbnRyeTogZmlsZSB3aG9zZSBtZXRhZGF0YSB0byBzZXQKKyAqIEBpYXR0cjogbWV0YWRhdGEgYXNzaWdubWVudCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc19zZXRhdHRyX2RvdGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQ7CisJc3RydWN0IHA5X2lhdHRyX2RvdGwgcDlhdHRyOworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJcbiIpOworCisJcmV0dmFsID0gaW5vZGVfY2hhbmdlX29rKGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlwOWF0dHIudmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7CisJcDlhdHRyLm1vZGUgPSBpYXR0ci0+aWFfbW9kZTsKKwlwOWF0dHIudWlkID0gaWF0dHItPmlhX3VpZDsKKwlwOWF0dHIuZ2lkID0gaWF0dHItPmlhX2dpZDsKKwlwOWF0dHIuc2l6ZSA9IGlhdHRyLT5pYV9zaXplOworCXA5YXR0ci5hdGltZV9zZWMgPSBpYXR0ci0+aWFfYXRpbWUudHZfc2VjOworCXA5YXR0ci5hdGltZV9uc2VjID0gaWF0dHItPmlhX2F0aW1lLnR2X25zZWM7CisJcDlhdHRyLm10aW1lX3NlYyA9IGlhdHRyLT5pYV9tdGltZS50dl9zZWM7CisJcDlhdHRyLm10aW1lX25zZWMgPSBpYXR0ci0+aWFfbXRpbWUudHZfbnNlYzsKKworCXJldHZhbCA9IC1FUEVSTTsKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKKwlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGZpZCkpCisJCXJldHVybiBQVFJfRVJSKGZpZCk7CisKKwlyZXR2YWwgPSBwOV9jbGllbnRfc2V0YXR0cihmaWQsICZwOWF0dHIpOworCWlmIChyZXR2YWwgPj0gMCkKKwkJcmV0dmFsID0gaW5vZGVfc2V0YXR0cihkZW50cnktPmRfaW5vZGUsIGlhdHRyKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgogICogdjlmc19zdGF0Mmlub2RlIC0gcG9wdWxhdGUgYW4gaW5vZGUgc3RydWN0dXJlIHdpdGggbWlzdGF0IGluZm8KICAqIEBzdGF0OiBQbGFuIDkgbWV0YWRhdGEgKG1pc3RhdCkgc3RydWN0dXJlCiAgKiBAaW5vZGU6IGlub2RlIHRvIHBvcHVsYXRlCkBAIC05ODAsNiArMTMzNiw3NyBAQAogfQogCiAvKioKKyAqIHY5ZnNfc3RhdDJpbm9kZV9kb3RsIC0gcG9wdWxhdGUgYW4gaW5vZGUgc3RydWN0dXJlIHdpdGggc3RhdCBpbmZvCisgKiBAc3RhdDogc3RhdCBzdHJ1Y3R1cmUKKyAqIEBpbm9kZTogaW5vZGUgdG8gcG9wdWxhdGUKKyAqIEBzYjogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCisgKgorICovCisKK3ZvaWQKK3Y5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0YXQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisKKwlpZiAoKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQkFTSUMpID09IFA5X1NUQVRTX0JBU0lDKSB7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2F0aW1lX3NlYzsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2F0aW1lX25zZWM7CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHN0YXQtPnN0X210aW1lX3NlYzsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X210aW1lX25zZWM7CisJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2N0aW1lX3NlYzsKKwkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2N0aW1lX25zZWM7CisJCWlub2RlLT5pX3VpZCA9IHN0YXQtPnN0X3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gc3RhdC0+c3RfZ2lkOworCQlpbm9kZS0+aV9ubGluayA9IHN0YXQtPnN0X25saW5rOworCQlpbm9kZS0+aV9tb2RlID0gc3RhdC0+c3RfbW9kZTsKKwkJaW5vZGUtPmlfcmRldiA9IG5ld19kZWNvZGVfZGV2KHN0YXQtPnN0X3JkZXYpOworCisJCWlmICgoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgfHwgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpKQorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9yZGV2KTsKKworCQlpX3NpemVfd3JpdGUoaW5vZGUsIHN0YXQtPnN0X3NpemUpOworCQlpbm9kZS0+aV9ibG9ja3MgPSBzdGF0LT5zdF9ibG9ja3M7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQVRJTUUpIHsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2F0aW1lX3NlYzsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9hdGltZV9uc2VjOworCQl9CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX01USU1FKSB7CisJCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzdGF0LT5zdF9tdGltZV9zZWM7CisJCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gc3RhdC0+c3RfbXRpbWVfbnNlYzsKKwkJfQorCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19DVElNRSkgeworCQkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc3RhdC0+c3RfY3RpbWVfc2VjOworCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2N0aW1lX25zZWM7CisJCX0KKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfVUlEKQorCQkJaW5vZGUtPmlfdWlkID0gc3RhdC0+c3RfdWlkOworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19HSUQpCisJCQlpbm9kZS0+aV9naWQgPSBzdGF0LT5zdF9naWQ7CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX05MSU5LKQorCQkJaW5vZGUtPmlfbmxpbmsgPSBzdGF0LT5zdF9ubGluazsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTU9ERSkgeworCQkJaW5vZGUtPmlfbW9kZSA9IHN0YXQtPnN0X21vZGU7CisJCQlpZiAoKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHx8CisJCQkJCQkoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkpCisJCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCQkJCQlpbm9kZS0+aV9yZGV2KTsKKwkJfQorCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19SREVWKQorCQkJaW5vZGUtPmlfcmRldiA9IG5ld19kZWNvZGVfZGV2KHN0YXQtPnN0X3JkZXYpOworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19TSVpFKQorCQkJaV9zaXplX3dyaXRlKGlub2RlLCBzdGF0LT5zdF9zaXplKTsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQkxPQ0tTKQorCQkJaW5vZGUtPmlfYmxvY2tzID0gc3RhdC0+c3RfYmxvY2tzOworCX0KKwlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19HRU4pCisJCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gc3RhdC0+c3RfZ2VuOworCisJLyogQ3VycmVudGx5IHdlIGRvbid0IHN1cHBvcnQgUDlfU1RBVFNfQlRJTUUgYW5kIFA5X1NUQVRTX0RBVEFfVkVSU0lPTgorCSAqIGJlY2F1c2UgdGhlIGlub2RlIHN0cnVjdHVyZSBkb2VzIG5vdCBoYXZlIGZpZWxkcyBmb3IgdGhlbS4KKwkgKi8KK30KKworLyoqCiAgKiB2OWZzX3FpZDJpbm8gLSBjb252ZXJ0IHFpZCBpbnRvIGlub2RlIG51bWJlcgogICogQHFpZDogcWlkIHRvIGhhc2gKICAqCkBAIC0xMDIyLDcgKzE0NDksNyBAQAogCWlmIChJU19FUlIoZmlkKSkKIAkJcmV0dXJuIFBUUl9FUlIoZmlkKTsKIAotCWlmICghdjlmc19wcm90b19kb3R1KHY5c2VzKSkKKwlpZiAoIXY5ZnNfcHJvdG9fZG90dSh2OXNlcykgJiYgIXY5ZnNfcHJvdG9fZG90bCh2OXNlcykpCiAJCXJldHVybiAtRUJBREY7CiAKIAlzdCA9IHA5X2NsaWVudF9zdGF0KGZpZCk7CkBAIC0xMTI4LDYgKzE1NTUsOTkgQEAKIH0KIAogLyoqCisgKiB2OWZzX3Zmc19zeW1saW5rX2RvdGwgLSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHN5bWxpbmtzCisgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgY29udGFpbmluZyBzeW1saW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKKyAqIEBzeW1uYW1lOiBzeW1saW5rIGRhdGEKKyAqCisgKiBTZWUgQWxzbzogOVAyMDAwLkwgUkZDIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX3N5bWxpbmtfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQljb25zdCBjaGFyICpzeW1uYW1lKQoreworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHA5X2ZpZCAqZGZpZDsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHA5X3FpZCBxaWQ7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyOworCWdpZF90IGdpZDsKKworCW5hbWUgPSAoY2hhciAqKSBkZW50cnktPmRfbmFtZS5uYW1lOworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAidjlmc192ZnNfc3ltbGlua19kb3RsIDogJWx1LCVzLCVzXG4iLAorCQkJZGlyLT5pX2lubywgbmFtZSwgc3ltbmFtZSk7CisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisKKwlkZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeS0+ZF9wYXJlbnQpOworCWlmIChJU19FUlIoZGZpZCkpIHsKKwkJZXJyID0gUFRSX0VSUihkZmlkKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWQgbG9va3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7CisKKwlpZiAoZ2lkIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInY5ZnNfZ2V0X2VnaWQgZmFpbGVkICVkXG4iLCBnaWQpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFNlcnZlciBkb2Vzbid0IGFsdGVyIGZpZCBvbiBUU1lNTElOSy4gSGVuY2Ugbm8gbmVlZCB0byBjbG9uZSBpdC4gKi8KKwllcnIgPSBwOV9jbGllbnRfc3ltbGluayhkZmlkLCBuYW1lLCAoY2hhciAqKXN5bW5hbWUsIGdpZCwgJnFpZCk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF9zeW1saW5rIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAodjlzZXMtPmNhY2hlKSB7CisJCS8qIE5vdyB3YWxrIGZyb20gdGhlIHBhcmVudCBzbyB3ZSBjYW4gZ2V0IGFuIHVub3BlbmVkIGZpZC4gKi8KKwkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOworCQlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAorCQkJCQllcnIpOworCQkJZmlkID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gZGVudHJ5ICovCisJCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQkJZXJyKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGVudHJ5LT5kX29wID0gJnY5ZnNfY2FjaGVkX2RlbnRyeV9vcGVyYXRpb25zOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWZpZCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlIGlub2RlIHdpdGggc3RhdCAqLworCQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgU19JRkxOSyk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGVudHJ5LT5kX29wID0gJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJfQorCitlcnJvcjoKKwlpZiAoZmlkKQorCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgogICogdjlmc192ZnNfc3ltbGluayAtIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgc3ltbGlua3MKICAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSBjb250YWluaW5nIHN5bWxpbmsKICAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluawpAQCAtMTE4Niw2ICsxNzA2LDc2IEBACiB9CiAKIC8qKgorICogdjlmc192ZnNfbGlua19kb3RsIC0gY3JlYXRlIGEgaGFyZGxpbmsgZm9yIGRvdGwKKyAqIEBvbGRfZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUgdG8gbGluayB0bworICogQGRpcjogaW5vZGUgZGVzdGluYXRpb24gZm9yIG5ldyBsaW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIGxpbmsKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfbGlua19kb3RsKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcDlfZmlkICpkZmlkLCAqb2xkZmlkOworCWNoYXIgKm5hbWU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJkaXIgaW5vOiAlbHUsIG9sZF9uYW1lOiAlcywgbmV3X25hbWU6ICVzXG4iLAorCQkJZGlyLT5pX2lubywgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQlkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCWRpcl9kZW50cnkgPSB2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZShkaXIpOworCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGlyX2RlbnRyeSk7CisJaWYgKElTX0VSUihkZmlkKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGZpZCk7CisKKwlvbGRmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSk7CisJaWYgKElTX0VSUihvbGRmaWQpKQorCQlyZXR1cm4gUFRSX0VSUihvbGRmaWQpOworCisJbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwllcnIgPSBwOV9jbGllbnRfbGluayhkZmlkLCBvbGRmaWQsIChjaGFyICopZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF9saW5rIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKSB7CisJCS8qIEdldCB0aGUgbGF0ZXN0IHN0YXQgaW5mbyBmcm9tIHNlcnZlci4gKi8KKwkJc3RydWN0IHA5X2ZpZCAqZmlkOworCQlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdDsKKworCQlmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSk7CisJCWlmIChJU19FUlIoZmlkKSkKKwkJCXJldHVybiBQVFJfRVJSKGZpZCk7CisKKwkJc3QgPSBwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKGZpZCwgUDlfU1RBVFNfQkFTSUMpOworCQlpZiAoSVNfRVJSKHN0KSkKKwkJCXJldHVybiBQVFJfRVJSKHN0KTsKKworCQl2OWZzX3N0YXQyaW5vZGVfZG90bChzdCwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwkJa2ZyZWUoc3QpOworCX0gZWxzZSB7CisJCS8qIENhY2hpbmcgZGlzYWJsZWQuIE5vIG5lZWQgdG8gZ2V0IHVwdG8gZGF0ZSBzdGF0IGluZm8uCisJCSAqIFRoaXMgZGVudHJ5IHdpbGwgYmUgcmVsZWFzZWQgaW1tZWRpYXRlbHkuIFNvLCBqdXN0IGlfY291bnQrKworCQkgKi8KKwkJYXRvbWljX2luYygmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9jb3VudCk7CisJfQorCisJZGVudHJ5LT5kX29wID0gb2xkX2RlbnRyeS0+ZF9vcDsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKICAqIHY5ZnNfdmZzX21rbm9kIC0gY3JlYXRlIGEgc3BlY2lhbCBmaWxlCiAgKiBAZGlyOiBpbm9kZSBkZXN0aW5hdGlvbiBmb3IgbmV3IGxpbmsKICAqIEBkZW50cnk6IGRlbnRyeSBmb3IgZmlsZQpAQCAtMTIzMCw2ICsxODIwLDEwMCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKy8qKgorICogdjlmc192ZnNfbWtub2RfZG90bCAtIGNyZWF0ZSBhIHNwZWNpYWwgZmlsZQorICogQGRpcjogaW5vZGUgZGVzdGluYXRpb24gZm9yIG5ldyBsaW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUKKyAqIEBtb2RlOiBtb2RlIGZvciBjcmVhdGlvbgorICogQHJkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lhbCBmaWxlCisgKgorICovCitzdGF0aWMgaW50Cit2OWZzX3Zmc19ta25vZF9kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlkZXZfdCByZGV2KQoreworCWludCBlcnI7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWdpZF90IGdpZDsKKwlzdHJ1Y3QgcDlfcWlkIHFpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCisJCSIgJWx1LCVzIG1vZGU6ICV4IE1BSk9SOiAldSBNSU5PUjogJXVcbiIsIGRpci0+aV9pbm8sCisJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CisKKwlpZiAoIW5ld192YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7CisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZGZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCWRmaWQgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKKwlpZiAoZ2lkIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKworCWVyciA9IHA5X2NsaWVudF9ta25vZF9kb3RsKGRmaWQsIG5hbWUsIG1vZGUsIHJkZXYsIGdpZCwgJnFpZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gdGhlIGRlbnRyeSAqLworCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpIHsKKwkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOworCQlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAorCQkJCWVycik7CisJCQlmaWQgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQllcnIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkZW50cnktPmRfb3AgPSAmdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnM7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZmlkID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBOb3QgaW4gY2FjaGVkIG1vZGUuIE5vIG5lZWQgdG8gcG9wdWxhdGUgaW5vZGUgd2l0aCBzdGF0LgorCQkgKiBzb2NrZXQgc3lzY2FsbCByZXR1cm5zIGEgZmQsIHNvIHdlIG5lZWQgaW5zdGFudGlhdGUKKwkJICovCisJCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkZW50cnktPmRfb3AgPSAmdjlmc19kZW50cnlfb3BlcmF0aW9uczsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl9CisKK2Vycm9yOgorCWlmIChmaWQpCisJCXA5X2NsaWVudF9jbHVuayhmaWQpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2RvdHUgPSB7CiAJLmNyZWF0ZSA9IHY5ZnNfdmZzX2NyZWF0ZSwKIAkubG9va3VwID0gdjlmc192ZnNfbG9va3VwLApAQCAtMTIzOCwyNCArMTkyMiwyOSBAQAogCS51bmxpbmsgPSB2OWZzX3Zmc191bmxpbmssCiAJLm1rZGlyID0gdjlmc192ZnNfbWtkaXIsCiAJLnJtZGlyID0gdjlmc192ZnNfcm1kaXIsCi0JLm1rbm9kID0gdjlmc192ZnNfbWtub2QsCisJLm1rbm9kID0gdjlmc192ZnNfbWtub2RfZG90bCwKIAkucmVuYW1lID0gdjlmc192ZnNfcmVuYW1lLAogCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0ciwKIAkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uc19kb3RsID0gewotCS5jcmVhdGUgPSB2OWZzX3Zmc19jcmVhdGUsCisJLmNyZWF0ZSA9IHY5ZnNfdmZzX2NyZWF0ZV9kb3RsLAogCS5sb29rdXAgPSB2OWZzX3Zmc19sb29rdXAsCi0JLnN5bWxpbmsgPSB2OWZzX3Zmc19zeW1saW5rLAotCS5saW5rID0gdjlmc192ZnNfbGluaywKKwkubGluayA9IHY5ZnNfdmZzX2xpbmtfZG90bCwKKwkuc3ltbGluayA9IHY5ZnNfdmZzX3N5bWxpbmtfZG90bCwKIAkudW5saW5rID0gdjlmc192ZnNfdW5saW5rLAotCS5ta2RpciA9IHY5ZnNfdmZzX21rZGlyLAorCS5ta2RpciA9IHY5ZnNfdmZzX21rZGlyX2RvdGwsCiAJLnJtZGlyID0gdjlmc192ZnNfcm1kaXIsCi0JLm1rbm9kID0gdjlmc192ZnNfbWtub2QsCisJLm1rbm9kID0gdjlmc192ZnNfbWtub2RfZG90bCwKIAkucmVuYW1lID0gdjlmc192ZnNfcmVuYW1lLAotCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0ciwKLQkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCisJLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisJLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAorCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKQEAgLTEyNzYsOCArMTk2NSwxMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zX2RvdGwgPSB7Ci0JLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyLAotCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0ciwKKwkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHJfZG90bCwKKwkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHJfZG90bCwKKwkuc2V0eGF0dHIgPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKwkubGlzdHhhdHRyID0gdjlmc19saXN0eGF0dHIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CkBAIC0xMjkyLDYgKzE5ODUsMTAgQEAKIAkucmVhZGxpbmsgPSBnZW5lcmljX3JlYWRsaW5rLAogCS5mb2xsb3dfbGluayA9IHY5ZnNfdmZzX2ZvbGxvd19saW5rLAogCS5wdXRfbGluayA9IHY5ZnNfdmZzX3B1dF9saW5rLAotCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0ciwKLQkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCisJLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisJLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19zdXBlci5jIGIvZnMvOXAvdmZzX3N1cGVyLmMKaW5kZXggYmU3NGQwMi4uNGI5ZWRlMCAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX3N1cGVyLmMKKysrIGIvZnMvOXAvdmZzX3N1cGVyLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAidjlmc192ZnMuaCIKICNpbmNsdWRlICJmaWQuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdjlmc19zdXBlcl9vcHMsIHY5ZnNfc3VwZXJfb3BzX2RvdGw7CiAKQEAgLTc3LDkgKzc4LDEwIEBACiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBmbHModjlzZXMtPm1heGRhdGEgLSAxKTsKIAlzYi0+c19ibG9ja3NpemUgPSAxIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXNiLT5zX21hZ2ljID0gVjlGU19NQUdJQzsKLQlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkKKwlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkgewogCQlzYi0+c19vcCA9ICZ2OWZzX3N1cGVyX29wc19kb3RsOwotCWVsc2UKKwkJc2ItPnNfeGF0dHIgPSB2OWZzX3hhdHRyX2hhbmRsZXJzOworCX0gZWxzZQogCQlzYi0+c19vcCA9ICZ2OWZzX3N1cGVyX29wczsKIAlzYi0+c19iZGkgPSAmdjlzZXMtPmJkaTsKIApAQCAtMTA3LDcgKzEwOSw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeSAqcm9vdCA9IE5VTEw7CiAJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IE5VTEw7Ci0Jc3RydWN0IHA5X3dzdGF0ICpzdCA9IE5VTEw7CiAJaW50IG1vZGUgPSBTX0lSV1hVR08gfCBTX0lTVlRYOwogCXN0cnVjdCBwOV9maWQgKmZpZDsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTEyNCwxNiArMTI1LDEwIEBACiAJCWdvdG8gY2xvc2Vfc2Vzc2lvbjsKIAl9CiAKLQlzdCA9IHA5X2NsaWVudF9zdGF0KGZpZCk7Ci0JaWYgKElTX0VSUihzdCkpIHsKLQkJcmV0dmFsID0gUFRSX0VSUihzdCk7Ci0JCWdvdG8gY2x1bmtfZmlkOwotCX0KLQogCXNiID0gc2dldChmc190eXBlLCBOVUxMLCB2OWZzX3NldF9zdXBlciwgdjlzZXMpOwogCWlmIChJU19FUlIoc2IpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIoc2IpOwotCQlnb3RvIGZyZWVfc3RhdDsKKwkJZ290byBjbHVua19maWQ7CiAJfQogCXY5ZnNfZmlsbF9zdXBlcihzYiwgdjlzZXMsIGZsYWdzLCBkYXRhKTsKIApAQCAtMTUxLDIyICsxNDYsMzggQEAKIAl9CiAKIAlzYi0+c19yb290ID0gcm9vdDsKLQlyb290LT5kX2lub2RlLT5pX2lubyA9IHY5ZnNfcWlkMmlubygmc3QtPnFpZCk7CiAKLQl2OWZzX3N0YXQyaW5vZGUoc3QsIHJvb3QtPmRfaW5vZGUsIHNiKTsKKwlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkgeworCQlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdCA9IE5VTEw7CisJCXN0ID0gcDlfY2xpZW50X2dldGF0dHJfZG90bChmaWQsIFA5X1NUQVRTX0JBU0lDKTsKKwkJaWYgKElTX0VSUihzdCkpIHsKKwkJCXJldHZhbCA9IFBUUl9FUlIoc3QpOworCQkJZ290byBjbHVua19maWQ7CisJCX0KKworCQl2OWZzX3N0YXQyaW5vZGVfZG90bChzdCwgcm9vdC0+ZF9pbm9kZSk7CisJCWtmcmVlKHN0KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcDlfd3N0YXQgKnN0ID0gTlVMTDsKKwkJc3QgPSBwOV9jbGllbnRfc3RhdChmaWQpOworCQlpZiAoSVNfRVJSKHN0KSkgeworCQkJcmV0dmFsID0gUFRSX0VSUihzdCk7CisJCQlnb3RvIGNsdW5rX2ZpZDsKKwkJfQorCisJCXJvb3QtPmRfaW5vZGUtPmlfaW5vID0gdjlmc19xaWQyaW5vKCZzdC0+cWlkKTsKKwkJdjlmc19zdGF0Mmlub2RlKHN0LCByb290LT5kX2lub2RlLCBzYik7CisKKwkJcDlzdGF0X2ZyZWUoc3QpOworCQlrZnJlZShzdCk7CisJfQogCiAJdjlmc19maWRfYWRkKHJvb3QsIGZpZCk7Ci0JcDlzdGF0X2ZyZWUoc3QpOwotCWtmcmVlKHN0KTsKIAogUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICIgc2ltcGxlIHNldCBtb3VudCwgcmV0dXJuIDBcbiIpOwogCXNpbXBsZV9zZXRfbW50KG1udCwgc2IpOwogCXJldHVybiAwOwogCi1mcmVlX3N0YXQ6Ci0JcDlzdGF0X2ZyZWUoc3QpOwotCWtmcmVlKHN0KTsKLQogY2x1bmtfZmlkOgogCXA5X2NsaWVudF9jbHVuayhmaWQpOwogCkBAIC0xNzYsOCArMTg3LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogCiByZWxlYXNlX3NiOgotCXA5c3RhdF9mcmVlKHN0KTsKLQlrZnJlZShzdCk7CiAJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIoc2IpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC0yNzgsNCArMjg3LDUgQEAKIAkuZ2V0X3NiID0gdjlmc19nZXRfc2IsCiAJLmtpbGxfc2IgPSB2OWZzX2tpbGxfc3VwZXIsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZzX2ZsYWdzID0gRlNfUkVOQU1FX0RPRVNfRF9NT1ZFLAogfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3hhdHRyLmMgYi9mcy85cC94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGU1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC94YXR0ci5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAxMAorICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgPGFuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC85cC85cC5oPgorI2luY2x1ZGUgPG5ldC85cC9jbGllbnQuaD4KKworI2luY2x1ZGUgImZpZC5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisKKy8qCisgKiB2OWZzX3hhdHRyX2dldCgpCisgKgorICogQ29weSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byB0aGUgYnVmZmVyCisgKiBwcm92aWRlZCwgb3IgY29tcHV0ZSB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuCisgKiBCdWZmZXIgaXMgTlVMTCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLCBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB1c2VkIC8gcmVxdWlyZWQgb24gc3VjY2Vzcy4KKyAqLworc3NpemVfdCB2OWZzX3hhdHRyX2dldChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlzc2l6ZV90IHJldHZhbDsKKwlpbnQgbXNpemUsIHJlYWRfY291bnQ7CisJdTY0IG9mZnNldCA9IDAsIGF0dHJfc2l6ZTsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQsICphdHRyX2ZpZDsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiJXM6IG5hbWUgPSAlcyB2YWx1ZV9sZW4gPSAlenVcbiIsCisJCV9fZnVuY19fLCBuYW1lLCBidWZmZXJfc2l6ZSk7CisKKwlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGZpZCkpCisJCXJldHVybiBQVFJfRVJSKGZpZCk7CisKKwlhdHRyX2ZpZCA9IHA5X2NsaWVudF94YXR0cndhbGsoZmlkLCBuYW1lLCAmYXR0cl9zaXplKTsKKwlpZiAoSVNfRVJSKGF0dHJfZmlkKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGF0dHJfZmlkKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCisJCQkicDlfY2xpZW50X2F0dHJ3YWxrIGZhaWxlZCAlemRcbiIsIHJldHZhbCk7CisJCWF0dHJfZmlkID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKCFidWZmZXJfc2l6ZSkgeworCQkvKiByZXF1ZXN0IHRvIGdldCB0aGUgYXR0cl9zaXplICovCisJCXJldHZhbCA9IGF0dHJfc2l6ZTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGF0dHJfc2l6ZSA+IGJ1ZmZlcl9zaXplKSB7CisJCXJldHZhbCA9IC1FUkFOR0U7CisJCWdvdG8gZXJyb3I7CisJfQorCW1zaXplID0gYXR0cl9maWQtPmNsbnQtPm1zaXplOworCXdoaWxlIChhdHRyX3NpemUpIHsKKwkJaWYgKGF0dHJfc2l6ZSA+IChtc2l6ZSAtIFA5X0lPSERSU1opKQorCQkJcmVhZF9jb3VudCA9IG1zaXplIC0gUDlfSU9IRFJTWjsKKwkJZWxzZQorCQkJcmVhZF9jb3VudCA9IGF0dHJfc2l6ZTsKKwkJcmVhZF9jb3VudCA9IHA5X2NsaWVudF9yZWFkKGF0dHJfZmlkLCAoKGNoYXIgKilidWZmZXIpK29mZnNldCwKKwkJCQkJTlVMTCwgb2Zmc2V0LCByZWFkX2NvdW50KTsKKwkJaWYgKHJlYWRfY291bnQgPCAwKSB7CisJCQkvKiBlcnJvciBpbiB4YXR0ciByZWFkICovCisJCQlyZXR2YWwgPSByZWFkX2NvdW50OworCQkJZ290byBlcnJvcjsKKwkJfQorCQlvZmZzZXQgKz0gcmVhZF9jb3VudDsKKwkJYXR0cl9zaXplIC09IHJlYWRfY291bnQ7CisJfQorCS8qIFRvdGFsIHJlYWQgeGF0dHIgYnl0ZXMgKi8KKwlyZXR2YWwgPSBvZmZzZXQ7CitlcnJvcjoKKwlpZiAoYXR0cl9maWQpCisJCXA5X2NsaWVudF9jbHVuayhhdHRyX2ZpZCk7CisJcmV0dXJuIHJldHZhbDsKKworfQorCisvKgorICogdjlmc194YXR0cl9zZXQoKQorICoKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCisgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAorICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCisgKiBzcGVjaWZ5IHRoYXQgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG11c3QgZXhpc3QgYW5kIG11c3Qgbm90IGV4aXN0CisgKiBwcmV2aW91cyB0byB0aGUgY2FsbCwgcmVzcGVjdGl2ZWx5LgorICoKKyAqIFJldHVybnMgMCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50IHY5ZnNfeGF0dHJfc2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sIGludCBmbGFncykKK3sKKwl1NjQgb2Zmc2V0ID0gMDsKKwlpbnQgcmV0dmFsLCBtc2l6ZSwgd3JpdGVfY291bnQ7CisJc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTDsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiJXM6IG5hbWUgPSAlcyB2YWx1ZV9sZW4gPSAlenUgZmxhZ3MgPSAlZFxuIiwKKwkJX19mdW5jX18sIG5hbWUsIHZhbHVlX2xlbiwgZmxhZ3MpOworCisJZmlkID0gdjlmc19maWRfY2xvbmUoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihmaWQpOworCQlmaWQgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKwkvKgorCSAqIE9uIHN1Y2Nlc3MgZmlkIHBvaW50cyB0byB4YXR0cgorCSAqLworCXJldHZhbCA9IHA5X2NsaWVudF94YXR0cmNyZWF0ZShmaWQsIG5hbWUsIHZhbHVlX2xlbiwgZmxhZ3MpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAorCQkJInA5X2NsaWVudF94YXR0cmNyZWF0ZSBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gZXJyb3I7CisJfQorCW1zaXplID0gZmlkLT5jbG50LT5tc2l6ZTs7CisJd2hpbGUgKHZhbHVlX2xlbikgeworCQlpZiAodmFsdWVfbGVuID4gKG1zaXplIC0gUDlfSU9IRFJTWikpCisJCQl3cml0ZV9jb3VudCA9IG1zaXplIC0gUDlfSU9IRFJTWjsKKwkJZWxzZQorCQkJd3JpdGVfY291bnQgPSB2YWx1ZV9sZW47CisJCXdyaXRlX2NvdW50ID0gcDlfY2xpZW50X3dyaXRlKGZpZCwgKChjaGFyICopdmFsdWUpK29mZnNldCwKKwkJCQkJTlVMTCwgb2Zmc2V0LCB3cml0ZV9jb3VudCk7CisJCWlmICh3cml0ZV9jb3VudCA8IDApIHsKKwkJCS8qIGVycm9yIGluIHhhdHRyIHdyaXRlICovCisJCQlyZXR2YWwgPSB3cml0ZV9jb3VudDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJb2Zmc2V0ICs9IHdyaXRlX2NvdW50OworCQl2YWx1ZV9sZW4gLT0gd3JpdGVfY291bnQ7CisJfQorCS8qIFRvdGFsIHJlYWQgeGF0dHIgYnl0ZXMgKi8KKwlyZXR2YWwgPSBvZmZzZXQ7CitlcnJvcjoKKwlpZiAoZmlkKQorCQlyZXR2YWwgPSBwOV9jbGllbnRfY2x1bmsoZmlkKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzc2l6ZV90IHY5ZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJcmV0dXJuIHY5ZnNfeGF0dHJfZ2V0KGRlbnRyeSwgTlVMTCwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7Cit9CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICp2OWZzX3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJnY5ZnNfeGF0dHJfdXNlcl9oYW5kbGVyLAorCU5VTEwKK307CmRpZmYgLS1naXQgYS9mcy85cC94YXR0ci5oIGIvZnMvOXAveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRmNjcyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvOXAveGF0dHIuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAxMAorICogQXV0aG9yIEFuZWVzaCBLdW1hciBLLlYgPGFuZWVzaC5rdW1hckBsaW51eC52bmV0LmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworI2lmbmRlZiBGU185UF9YQVRUUl9ICisjZGVmaW5lIEZTXzlQX1hBVFRSX0gKKworI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqdjlmc194YXR0cl9oYW5kbGVyc1tdOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIHY5ZnNfeGF0dHJfdXNlcl9oYW5kbGVyOworCitleHRlcm4gc3NpemVfdCB2OWZzX3hhdHRyX2dldChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICAgIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgdjlmc194YXR0cl9zZXQoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICosCisJCQkgIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHNzaXplX3Qgdjlmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYgLyogRlNfOVBfWEFUVFJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvOXAveGF0dHJfdXNlci5jIGIvZnMvOXAveGF0dHJfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjcwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC94YXR0cl91c2VyLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMTAKKyAqIEF1dGhvciBBbmVlc2ggS3VtYXIgSy5WIDxhbmVlc2gua3VtYXJAbGludXgudm5ldC5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKworc3RhdGljIGludCB2OWZzX3hhdHRyX3VzZXJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCB0eXBlKQoreworCWludCByZXR2YWw7CisJY2hhciAqZnVsbF9uYW1lOworCXNpemVfdCBuYW1lX2xlbjsKKwlzaXplX3QgcHJlZml4X2xlbiA9IFhBVFRSX1VTRVJfUFJFRklYX0xFTjsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwlmdWxsX25hbWUgPSBrbWFsbG9jKHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDEgLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ1bGxfbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KGZ1bGxfbmFtZSwgWEFUVFJfVVNFUl9QUkVGSVgsIHByZWZpeF9sZW4pOworCW1lbWNweShmdWxsX25hbWUrcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCWZ1bGxfbmFtZVtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKworCXJldHZhbCA9IHY5ZnNfeGF0dHJfZ2V0KGRlbnRyeSwgZnVsbF9uYW1lLCBidWZmZXIsIHNpemUpOworCWtmcmVlKGZ1bGxfbmFtZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2OWZzX3hhdHRyX3VzZXJfc2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmV0dmFsOworCWNoYXIgKmZ1bGxfbmFtZTsKKwlzaXplX3QgbmFtZV9sZW47CisJc2l6ZV90IHByZWZpeF9sZW4gPSBYQVRUUl9VU0VSX1BSRUZJWF9MRU47CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJZnVsbF9uYW1lID0ga21hbGxvYyhwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxICwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmdWxsX25hbWUpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShmdWxsX25hbWUsIFhBVFRSX1VTRVJfUFJFRklYLCBwcmVmaXhfbGVuKTsKKwltZW1jcHkoZnVsbF9uYW1lICsgcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCWZ1bGxfbmFtZVtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKworCXJldHZhbCA9IHY5ZnNfeGF0dHJfc2V0KGRlbnRyeSwgZnVsbF9uYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCWtmcmVlKGZ1bGxfbmFtZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgdjlmc194YXR0cl91c2VyX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1VTRVJfUFJFRklYLAorCS5nZXQJPSB2OWZzX3hhdHRyX3VzZXJfZ2V0LAorCS5zZXQJPSB2OWZzX3hhdHRyX3VzZXJfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDVmODViNTkuLjNkMTg1MzAgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtNjQsNyArNjQsNyBAQAogc291cmNlICJmcy9mdXNlL0tjb25maWciCiAKIGNvbmZpZyBDVVNFCi0JdHJpc3RhdGUgIkNoYXJhY3RlciBkZXZpY2UgaW4gVXNlcnBhY2Ugc3VwcG9ydCIKKwl0cmlzdGF0ZSAiQ2hhcmFjdGVyIGRldmljZSBpbiBVc2Vyc3BhY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZVU0VfRlMKIAloZWxwCiAJICBUaGlzIEZVU0UgZXh0ZW5zaW9uIGFsbG93cyBjaGFyYWN0ZXIgZGV2aWNlcyB0byBiZQpkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCAxY2NmMjVjLi4zMDA2YjViIDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIC8qIHN5c19pb19kZXN0cm95OgogICoJRGVzdHJveSB0aGUgYWlvX2NvbnRleHQgc3BlY2lmaWVkLiAgTWF5IGNhbmNlbCBhbnkgb3V0c3RhbmRpbmcgCiAgKglBSU9zIGFuZCBibG9jayBvbiBjb21wbGV0aW9uLiAgV2lsbCBmYWlsIHdpdGggLUVOT1NZUyBpZiBub3QKLSAqCWltcGxlbWVudGVkLiAgTWF5IGZhaWwgd2l0aCAtRUZBVUxUIGlmIHRoZSBjb250ZXh0IHBvaW50ZWQgdG8KKyAqCWltcGxlbWVudGVkLiAgTWF5IGZhaWwgd2l0aCAtRUlOVkFMIGlmIHRoZSBjb250ZXh0IHBvaW50ZWQgdG8KICAqCWlzIGludmFsaWQuCiAgKi8KIFNZU0NBTExfREVGSU5FMShpb19kZXN0cm95LCBhaW9fY29udGV4dF90LCBjdHgpCkBAIC0xNzk1LDE1ICsxNzk1LDE2IEBACiAKIC8qIGlvX2dldGV2ZW50czoKICAqCUF0dGVtcHRzIHRvIHJlYWQgYXQgbGVhc3QgbWluX25yIGV2ZW50cyBhbmQgdXAgdG8gbnIgZXZlbnRzIGZyb20KLSAqCXRoZSBjb21wbGV0aW9uIHF1ZXVlIGZvciB0aGUgYWlvX2NvbnRleHQgc3BlY2lmaWVkIGJ5IGN0eF9pZC4gIE1heQotICoJZmFpbCB3aXRoIC1FSU5WQUwgaWYgY3R4X2lkIGlzIGludmFsaWQsIGlmIG1pbl9uciBpcyBvdXQgb2YgcmFuZ2UsCi0gKglpZiBuciBpcyBvdXQgb2YgcmFuZ2UsIGlmIHdoZW4gaXMgb3V0IG9mIHJhbmdlLiAgTWF5IGZhaWwgd2l0aAotICoJLUVGQVVMVCBpZiBhbnkgb2YgdGhlIG1lbW9yeSBzcGVjaWZpZWQgdG8gaXMgaW52YWxpZC4gIE1heSByZXR1cm4KLSAqCTAgb3IgPCBtaW5fbnIgaWYgbm8gZXZlbnRzIGFyZSBhdmFpbGFibGUgYW5kIHRoZSB0aW1lb3V0IHNwZWNpZmllZAotICoJYnkgd2hlbgloYXMgZWxhcHNlZCwgd2hlcmUgd2hlbiA9PSBOVUxMIHNwZWNpZmllcyBhbiBpbmZpbml0ZQotICoJdGltZW91dC4gIE5vdGUgdGhhdCB0aGUgdGltZW91dCBwb2ludGVkIHRvIGJ5IHdoZW4gaXMgcmVsYXRpdmUgYW5kCi0gKgl3aWxsIGJlIHVwZGF0ZWQgaWYgbm90IE5VTEwgYW5kIHRoZSBvcGVyYXRpb24gYmxvY2tzLiAgV2lsbCBmYWlsCi0gKgl3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgorICoJdGhlIGNvbXBsZXRpb24gcXVldWUgZm9yIHRoZSBhaW9fY29udGV4dCBzcGVjaWZpZWQgYnkgY3R4X2lkLiBJZgorICoJaXQgc3VjY2VlZHMsIHRoZSBudW1iZXIgb2YgcmVhZCBldmVudHMgaXMgcmV0dXJuZWQuIE1heSBmYWlsIHdpdGgKKyAqCS1FSU5WQUwgaWYgY3R4X2lkIGlzIGludmFsaWQsIGlmIG1pbl9uciBpcyBvdXQgb2YgcmFuZ2UsIGlmIG5yIGlzCisgKglvdXQgb2YgcmFuZ2UsIGlmIHRpbWVvdXQgaXMgb3V0IG9mIHJhbmdlLiAgTWF5IGZhaWwgd2l0aCAtRUZBVUxUCisgKglpZiBhbnkgb2YgdGhlIG1lbW9yeSBzcGVjaWZpZWQgaXMgaW52YWxpZC4gIE1heSByZXR1cm4gMCBvcgorICoJPCBtaW5fbnIgaWYgdGhlIHRpbWVvdXQgc3BlY2lmaWVkIGJ5IHRpbWVvdXQgaGFzIGVsYXBzZWQKKyAqCWJlZm9yZSBzdWZmaWNpZW50IGV2ZW50cyBhcmUgYXZhaWxhYmxlLCB3aGVyZSB0aW1lb3V0ID09IE5VTEwKKyAqCXNwZWNpZmllcyBhbiBpbmZpbml0ZSB0aW1lb3V0LiBOb3RlIHRoYXQgdGhlIHRpbWVvdXQgcG9pbnRlZCB0byBieQorICoJdGltZW91dCBpcyByZWxhdGl2ZSBhbmQgd2lsbCBiZSB1cGRhdGVkIGlmIG5vdCBOVUxMIGFuZCB0aGUKKyAqCW9wZXJhdGlvbiBibG9ja3MuIFdpbGwgZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgogICovCiBTWVNDQUxMX0RFRklORTUoaW9fZ2V0ZXZlbnRzLCBhaW9fY29udGV4dF90LCBjdHhfaWQsCiAJCWxvbmcsIG1pbl9uciwKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvbGludXh2ZnMuYyBiL2ZzL2JlZnMvbGludXh2ZnMuYwppbmRleCAzNGRkZGE4Li5kYzM5ZDI4IDEwMDY0NAotLS0gYS9mcy9iZWZzL2xpbnV4dmZzLmMKKysrIGIvZnMvYmVmcy9saW51eHZmcy5jCkBAIC00MzYsNyArNDM2LDcgQEAKIAkJCQkJICAgICAgaW5pdF9vbmNlKTsKIAlpZiAoYmVmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImJlZnNfaW5pdF9pbm9kZWNhY2hlOiAiCi0JCSAgICAgICAiQ291bGRuJ3QgaW5pdGFsaXplIGlub2RlIHNsYWJjYWNoZVxuIik7CisJCSAgICAgICAiQ291bGRuJ3QgaW5pdGlhbGl6ZSBpbm9kZSBzbGFiY2FjaGVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggOTlkNmFmOC4uYjMxNzFmYiAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTY4MSw4ICs2ODEsOCBAQAogCWlmICghYmRfbWF5X2NsYWltKGJkZXYsIHdob2xlLCBob2xkZXIpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JLyogaWYgc29tZW9uZSBlbHNlIGlzIGNsYWltaW5nLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggKi8KLQlpZiAod2hvbGUtPmJkX2NsYWltaW5nICYmIHdob2xlLT5iZF9jbGFpbWluZyAhPSBob2xkZXIpIHsKKwkvKiBpZiBjbGFpbWluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggKi8KKwlpZiAod2hvbGUtPmJkX2NsYWltaW5nKSB7CiAJCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IGJpdF93YWl0cXVldWUoJndob2xlLT5iZF9jbGFpbWluZywgMCk7CiAJCURFRklORV9XQUlUKHdhaXQpOwogCmRpZmYgLS1naXQgYS9mcy9jZXBoL0tjb25maWcgYi9mcy9jZXBoL0tjb25maWcKaW5kZXggMDRiODI4MC4uYmM4N2I5YyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9LY29uZmlnCisrKyBiL2ZzL2NlcGgvS2NvbmZpZwpAQCAtMiw3ICsyLDcgQEAKICAgICAgICAgdHJpc3RhdGUgIkNlcGggZGlzdHJpYnV0ZWQgZmlsZSBzeXN0ZW0gKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBMSUJDUkMzMkMKLQlzZWxlY3QgQ09ORklHX0NSWVBUT19BRVMKKwlzZWxlY3QgQ1JZUFRPX0FFUwogCWhlbHAKIAkgIENob29zZSBZIG9yIE0gaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIG1vdW50aW5nIHRoZQogCSAgZXhwZXJpbWVudGFsIENlcGggZGlzdHJpYnV0ZWQgZmlsZSBzeXN0ZW0uICBDZXBoIGlzIGFuIGV4dHJlbWVseQpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9jYXBzLmMgYi9mcy9jZXBoL2NhcHMuYwppbmRleCA3NDE0NGQ2Li5iODFiZTlhIDEwMDY0NAotLS0gYS9mcy9jZXBoL2NhcHMuYworKysgYi9mcy9jZXBoL2NhcHMuYwpAQCAtNjI3LDcgKzYyNyw3IEBACiAJaWYgKGZtb2RlID49IDApCiAJCV9fY2VwaF9nZXRfZm1vZGUoY2ksIGZtb2RlKTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0Jd2FrZV91cCgmY2ktPmlfY2FwX3dxKTsKKwl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4MSw3ICsxMTgxLDcgQEAKIAl9CiAKIAlpZiAod2FrZSkKLQkJd2FrZV91cCgmY2ktPmlfY2FwX3dxKTsKKwkJd2FrZV91cF9hbGwoJmNpLT5pX2NhcF93cSk7CiAKIAlyZXR1cm4gZGVsYXllZDsKIH0KQEAgLTIxNTMsNyArMjE1Myw3IEBACiAJZWxzZSBpZiAoZmx1c2hzbmFwcykKIAkJY2VwaF9mbHVzaF9zbmFwcyhjaSk7CiAJaWYgKHdha2UpCi0JCXdha2VfdXAoJmNpLT5pX2NhcF93cSk7CisJCXdha2VfdXBfYWxsKCZjaS0+aV9jYXBfd3EpOwogCWlmIChwdXQpCiAJCWlwdXQoaW5vZGUpOwogfQpAQCAtMjIyOSw3ICsyMjI5LDcgQEAKIAkJaXB1dChpbm9kZSk7CiAJfSBlbHNlIGlmIChjb21wbGV0ZV9jYXBzbmFwKSB7CiAJCWNlcGhfZmx1c2hfc25hcHMoY2kpOwotCQl3YWtlX3VwKCZjaS0+aV9jYXBfd3EpOworCQl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIAl9CiAJaWYgKGRyb3BfY2Fwc25hcCkKIAkJaXB1dChpbm9kZSk7CkBAIC0yNDA1LDcgKzI0MDUsNyBAQAogCWlmIChxdWV1ZV9pbnZhbGlkYXRlKQogCQljZXBoX3F1ZXVlX2ludmFsaWRhdGUoaW5vZGUpOwogCWlmICh3YWtlKQotCQl3YWtlX3VwKCZjaS0+aV9jYXBfd3EpOworCQl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIAogCWlmIChjaGVja19jYXBzID09IDEpCiAJCWNlcGhfY2hlY2tfY2FwcyhjaSwgQ0hFQ0tfQ0FQU19OT0RFTEFZfENIRUNLX0NBUFNfQVVUSE9OTFksCkBAIC0yNDYwLDcgKzI0NjAsNyBAQAogCQkJCQkgc3RydWN0IGNlcGhfaW5vZGVfaW5mbywKIAkJCQkJIGlfZmx1c2hpbmdfaXRlbSktPnZmc19pbm9kZSk7CiAJCW1kc2MtPm51bV9jYXBfZmx1c2hpbmctLTsKLQkJd2FrZV91cCgmbWRzYy0+Y2FwX2ZsdXNoaW5nX3dxKTsKKwkJd2FrZV91cF9hbGwoJm1kc2MtPmNhcF9mbHVzaGluZ193cSk7CiAJCWRvdXQoIiBpbm9kZSAlcCBub3cgIWZsdXNoaW5nXG4iLCBpbm9kZSk7CiAKIAkJaWYgKGNpLT5pX2RpcnR5X2NhcHMgPT0gMCkgewpAQCAtMjQ3Miw3ICsyNDcyLDcgQEAKIAkJfQogCX0KIAlzcGluX3VubG9jaygmbWRzYy0+Y2FwX2RpcnR5X2xvY2spOwotCXdha2VfdXAoJmNpLT5pX2NhcF93cSk7CisJd2FrZV91cF9hbGwoJmNpLT5pX2NhcF93cSk7CiAKIG91dDoKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CkBAIC0yOTg0LDYgKzI5ODQsNyBAQAogCQltZW1jcHkoKnAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbik7CiAJCSpwICs9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAkJcmVsLT5kbmFtZV9zZXEgPSBjcHVfdG9fbGUzMihkaS0+bGVhc2Vfc2VxKTsKKwkJX19jZXBoX21kc2NfZHJvcF9kZW50cnlfbGVhc2UoZGVudHJ5KTsKIAl9CiAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggZjg1NzE5My4uZjk0ZWQzYyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC0yNjYsNiArMjY2LDcgQEAKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCWlmICgoZmlscC0+Zl9wb3MgPT0gMiB8fCBmaS0+ZGVudHJ5KSAmJgogCSAgICAhY2VwaF90ZXN0X29wdChjbGllbnQsIE5PQVNZTkNSRUFERElSKSAmJgorCSAgICBjZXBoX3NuYXAoaW5vZGUpICE9IENFUEhfU05BUERJUiAmJgogCSAgICAoY2ktPmlfY2VwaF9mbGFncyAmIENFUEhfSV9DT01QTEVURSkgJiYKIAkgICAgX19jZXBoX2NhcHNfaXNzdWVkX21hc2soY2ksIENFUEhfQ0FQX0ZJTEVfU0hBUkVELCAxKSkgewogCQllcnIgPSBfX2RjYWNoZV9yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7CkBAIC0xMDEzLDE4ICsxMDE0LDIyIEBACiAKIC8qCiAgKiBXaGVuIGEgZGVudHJ5IGlzIHJlbGVhc2VkLCBjbGVhciB0aGUgZGlyIElfQ09NUExFVEUgaWYgaXQgd2FzIHBhcnQKLSAqIG9mIHRoZSBjdXJyZW50IGRpciBnZW4uCisgKiBvZiB0aGUgY3VycmVudCBkaXIgZ2VuIG9yIGlmIHRoaXMgaXMgaW4gdGhlIHNuYXBzaG90IG5hbWVzcGFjZS4KICAqLwogc3RhdGljIHZvaWQgY2VwaF9kZW50cnlfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGNlcGhfZGVudHJ5X2luZm8gKmRpID0gY2VwaF9kZW50cnkoZGVudHJ5KTsKIAlzdHJ1Y3QgaW5vZGUgKnBhcmVudF9pbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJdTY0IHNuYXBpZCA9IGNlcGhfc25hcChwYXJlbnRfaW5vZGUpOwogCi0JaWYgKHBhcmVudF9pbm9kZSkgeworCWRvdXQoImRlbnRyeV9yZWxlYXNlICVwIHBhcmVudCAlcFxuIiwgZGVudHJ5LCBwYXJlbnRfaW5vZGUpOworCisJaWYgKHBhcmVudF9pbm9kZSAmJiBzbmFwaWQgIT0gQ0VQSF9TTkFQRElSKSB7CiAJCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShwYXJlbnRfaW5vZGUpOwogCiAJCXNwaW5fbG9jaygmcGFyZW50X2lub2RlLT5pX2xvY2spOwotCQlpZiAoY2ktPmlfc2hhcmVkX2dlbiA9PSBkaS0+bGVhc2Vfc2hhcmVkX2dlbikgeworCQlpZiAoY2ktPmlfc2hhcmVkX2dlbiA9PSBkaS0+bGVhc2Vfc2hhcmVkX2dlbiB8fAorCQkgICAgc25hcGlkIDw9IENFUEhfTUFYU05BUCkgewogCQkJZG91dCgiIGNsZWFyaW5nICVwIGNvbXBsZXRlIChkX3JlbGVhc2UpXG4iLAogCQkJICAgICBwYXJlbnRfaW5vZGUpOwogCQkJY2ktPmlfY2VwaF9mbGFncyAmPSB+Q0VQSF9JX0NPTVBMRVRFOwpAQCAtMTI0MSw3ICsxMjQ2LDkgQEAKIAogc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfc25hcGRpcl9kZW50cnlfb3BzID0gewogCS5kX3JldmFsaWRhdGUgPSBjZXBoX3NuYXBkaXJfZF9yZXZhbGlkYXRlLAorCS5kX3JlbGVhc2UgPSBjZXBoX2RlbnRyeV9yZWxlYXNlLAogfTsKIAogc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfc25hcF9kZW50cnlfb3BzID0geworCS5kX3JlbGVhc2UgPSBjZXBoX2RlbnRyeV9yZWxlYXNlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvZmlsZS5jIGIvZnMvY2VwaC9maWxlLmMKaW5kZXggNjI1MWExNS4uN2MwODY5OCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9maWxlLmMKKysrIGIvZnMvY2VwaC9maWxlLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCWttZW1fY2FjaGVfZnJlZShjZXBoX2ZpbGVfY2FjaGVwLCBjZik7CiAKIAkvKiB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciBjYXBzIG9uIHRoaXMgaW5vZGUgKi8KLQl3YWtlX3VwKCZjaS0+aV9jYXBfd3EpOworCXdha2VfdXBfYWxsKCZjaS0+aV9jYXBfd3EpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9jZXBoL2lub2RlLmMgYi9mcy9jZXBoL2lub2RlLmMKaW5kZXggOGY5YjlmZS4uMzg5ZjlkYiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pbm9kZS5jCisrKyBiL2ZzL2NlcGgvaW5vZGUuYwpAQCAtMTE5OSw4ICsxMTk5LDEwIEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQllcnIgPSBjZXBoX2luaXRfZGVudHJ5KGRuKTsKLQkJCWlmIChlcnIgPCAwKQorCQkJaWYgKGVyciA8IDApIHsKKwkJCQlkcHV0KGRuKTsKIAkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfSBlbHNlIGlmIChkbi0+ZF9pbm9kZSAmJgogCQkJICAgKGNlcGhfaW5vKGRuLT5kX2lub2RlKSAhPSB2aW5vLmlubyB8fAogCQkJICAgIGNlcGhfc25hcChkbi0+ZF9pbm9kZSkgIT0gdmluby5zbmFwKSkgewpAQCAtMTQ5OSw3ICsxNTAxLDcgQEAKIAlpZiAod3JidWZmZXJfcmVmcyA9PSAwKQogCQljZXBoX2NoZWNrX2NhcHMoY2ksIENIRUNLX0NBUFNfQVVUSE9OTFksIE5VTEwpOwogCWlmICh3YWtlKQotCQl3YWtlX3VwKCZjaS0+aV9jYXBfd3EpOworCQl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcy9jZXBoL21kc19jbGllbnQuYyBiL2ZzL2NlcGgvbWRzX2NsaWVudC5jCmluZGV4IDQxNmMwOGQuLmRkNDQwYmQgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvbWRzX2NsaWVudC5jCisrKyBiL2ZzL2NlcGgvbWRzX2NsaWVudC5jCkBAIC04NjgsNyArODY4LDcgQEAKIHsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwogCi0Jd2FrZV91cCgmY2ktPmlfY2FwX3dxKTsKKwl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIAlpZiAoYXJnKSB7CiAJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWNpLT5pX3dhbnRlZF9tYXhfc2l6ZSA9IDA7CkBAIC0xNTY0LDcgKzE1NjQsNyBAQAogCWlmIChyZXEtPnJfY2FsbGJhY2spCiAJCXJlcS0+cl9jYWxsYmFjayhtZHNjLCByZXEpOwogCWVsc2UKLQkJY29tcGxldGUoJnJlcS0+cl9jb21wbGV0aW9uKTsKKwkJY29tcGxldGVfYWxsKCZyZXEtPnJfY29tcGxldGlvbik7CiB9CiAKIC8qCkBAIC0xOTMyLDcgKzE5MzIsNyBAQAogCWlmIChoZWFkLT5zYWZlKSB7CiAJCXJlcS0+cl9nb3Rfc2FmZSA9IHRydWU7CiAJCV9fdW5yZWdpc3Rlcl9yZXF1ZXN0KG1kc2MsIHJlcSk7Ci0JCWNvbXBsZXRlKCZyZXEtPnJfc2FmZV9jb21wbGV0aW9uKTsKKwkJY29tcGxldGVfYWxsKCZyZXEtPnJfc2FmZV9jb21wbGV0aW9uKTsKIAogCQlpZiAocmVxLT5yX2dvdF91bnNhZmUpIHsKIAkJCS8qCkBAIC0xOTQ3LDcgKzE5NDcsNyBAQAogCiAJCQkvKiBsYXN0IHVuc2FmZSByZXF1ZXN0IGR1cmluZyB1bW91bnQ/ICovCiAJCQlpZiAobWRzYy0+c3RvcHBpbmcgJiYgIV9fZ2V0X29sZGVzdF9yZXEobWRzYykpCi0JCQkJY29tcGxldGUoJm1kc2MtPnNhZmVfdW1vdW50X3dhaXRlcnMpOworCQkJCWNvbXBsZXRlX2FsbCgmbWRzYy0+c2FmZV91bW91bnRfd2FpdGVycyk7CiAJCQltdXRleF91bmxvY2soJm1kc2MtPm11dGV4KTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0yMTI2LDcgKzIxMjYsNyBAQAogCQkJcHJfaW5mbygibWRzJWQgcmVjb25uZWN0IGRlbmllZFxuIiwgc2Vzc2lvbi0+c19tZHMpOwogCQlyZW1vdmVfc2Vzc2lvbl9jYXBzKHNlc3Npb24pOwogCQl3YWtlID0gMTsgLyogZm9yIGdvb2QgbWVhc3VyZSAqLwotCQljb21wbGV0ZSgmbWRzYy0+c2Vzc2lvbl9jbG9zZV93YWl0ZXJzKTsKKwkJY29tcGxldGVfYWxsKCZtZHNjLT5zZXNzaW9uX2Nsb3NlX3dhaXRlcnMpOwogCQlraWNrX3JlcXVlc3RzKG1kc2MsIG1kcyk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9mcy9jZXBoL21vbl9jbGllbnQuYyBiL2ZzL2NlcGgvbW9uX2NsaWVudC5jCmluZGV4IGNjMTE1ZWEuLjU0ZmUwMWMgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvbW9uX2NsaWVudC5jCisrKyBiL2ZzL2NlcGgvbW9uX2NsaWVudC5jCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAogb3V0OgogCW11dGV4X3VubG9jaygmbW9uYy0+bXV0ZXgpOwotCXdha2VfdXAoJmNsaWVudC0+YXV0aF93cSk7CisJd2FrZV91cF9hbGwoJmNsaWVudC0+YXV0aF93cSk7CiB9CiAKIC8qCkBAIC00NjIsNyArNDYyLDcgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZtb25jLT5tdXRleCk7CiAJaWYgKHJlcSkgewotCQljb21wbGV0ZSgmcmVxLT5jb21wbGV0aW9uKTsKKwkJY29tcGxldGVfYWxsKCZyZXEtPmNvbXBsZXRpb24pOwogCQlwdXRfZ2VuZXJpY19yZXF1ZXN0KHJlcSk7CiAJfQogCXJldHVybjsKQEAgLTcxOCw3ICs3MTgsNyBAQAogCQkJCSAgICAgbW9uYy0+bV9hdXRoLT5mcm9udF9tYXgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1vbmMtPmNsaWVudC0+YXV0aF9lcnIgPSByZXQ7Ci0JCXdha2VfdXAoJm1vbmMtPmNsaWVudC0+YXV0aF93cSk7CisJCXdha2VfdXBfYWxsKCZtb25jLT5jbGllbnQtPmF1dGhfd3EpOwogCX0gZWxzZSBpZiAocmV0ID4gMCkgewogCQlfX3NlbmRfcHJlcGFyZWRfYXV0aF9yZXF1ZXN0KG1vbmMsIHJldCk7CiAJfSBlbHNlIGlmICghd2FzX2F1dGggJiYgbW9uYy0+YXV0aC0+b3BzLT5pc19hdXRoZW50aWNhdGVkKG1vbmMtPmF1dGgpKSB7CmRpZmYgLS1naXQgYS9mcy9jZXBoL29zZF9jbGllbnQuYyBiL2ZzL2NlcGgvb3NkX2NsaWVudC5jCmluZGV4IDkyYjcyNTEuLmUzODUyMjMgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvb3NkX2NsaWVudC5jCisrKyBiL2ZzL2NlcGgvb3NkX2NsaWVudC5jCkBAIC04NjIsMTIgKzg2MiwxMiBAQAogCWlmIChyZXEtPnJfY2FsbGJhY2spCiAJCXJlcS0+cl9jYWxsYmFjayhyZXEsIG1zZyk7CiAJZWxzZQotCQljb21wbGV0ZSgmcmVxLT5yX2NvbXBsZXRpb24pOworCQljb21wbGV0ZV9hbGwoJnJlcS0+cl9jb21wbGV0aW9uKTsKIAogCWlmIChmbGFncyAmIENFUEhfT1NEX0ZMQUdfT05ESVNLKSB7CiAJCWlmIChyZXEtPnJfc2FmZV9jYWxsYmFjaykKIAkJCXJlcS0+cl9zYWZlX2NhbGxiYWNrKHJlcSwgbXNnKTsKLQkJY29tcGxldGUoJnJlcS0+cl9zYWZlX2NvbXBsZXRpb24pOyAgLyogZnN5bmMgd2FpdGVyICovCisJCWNvbXBsZXRlX2FsbCgmcmVxLT5yX3NhZmVfY29tcGxldGlvbik7ICAvKiBmc3luYyB3YWl0ZXIgKi8KIAl9CiAKIGRvbmU6CkBAIC0xMDgzLDcgKzEwODMsNyBAQAogCWlmIChuZXdtYXApCiAJCWtpY2tfcmVxdWVzdHMob3NkYywgTlVMTCk7CiAJdXBfcmVhZCgmb3NkYy0+bWFwX3NlbSk7Ci0Jd2FrZV91cCgmb3NkYy0+Y2xpZW50LT5hdXRoX3dxKTsKKwl3YWtlX3VwX2FsbCgmb3NkYy0+Y2xpZW50LT5hdXRoX3dxKTsKIAlyZXR1cm47CiAKIGJhZDoKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvb3NkbWFwLmMgYi9mcy9jZXBoL29zZG1hcC5jCmluZGV4IDI3N2Y4YjMuLjQxNmQ0NmEgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvb3NkbWFwLmMKKysrIGIvZnMvY2VwaC9vc2RtYXAuYwpAQCAtODMxLDEyICs4MzEsMTMgQEAKIAkJLyogcmVtb3ZlIGFueT8gKi8KIAkJd2hpbGUgKHJicCAmJiBwZ2lkX2NtcChyYl9lbnRyeShyYnAsIHN0cnVjdCBjZXBoX3BnX21hcHBpbmcsCiAJCQkJCQlub2RlKS0+cGdpZCwgcGdpZCkgPD0gMCkgewotCQkJc3RydWN0IHJiX25vZGUgKmN1ciA9IHJicDsKKwkJCXN0cnVjdCBjZXBoX3BnX21hcHBpbmcgKmN1ciA9CisJCQkJcmJfZW50cnkocmJwLCBzdHJ1Y3QgY2VwaF9wZ19tYXBwaW5nLCBub2RlKTsKKwkJCQogCQkJcmJwID0gcmJfbmV4dChyYnApOwotCQkJZG91dCgiIHJlbW92ZWQgcGdfdGVtcCAlbGx4XG4iLAotCQkJICAgICAqKHU2NCAqKSZyYl9lbnRyeShjdXIsIHN0cnVjdCBjZXBoX3BnX21hcHBpbmcsCi0JCQkJCSAgICAgICBub2RlKS0+cGdpZCk7Ci0JCQlyYl9lcmFzZShjdXIsICZtYXAtPnBnX3RlbXApOworCQkJZG91dCgiIHJlbW92ZWQgcGdfdGVtcCAlbGx4XG4iLCAqKHU2NCAqKSZjdXItPnBnaWQpOworCQkJcmJfZXJhc2UoJmN1ci0+bm9kZSwgJm1hcC0+cGdfdGVtcCk7CisJCQlrZnJlZShjdXIpOwogCQl9CiAKIAkJaWYgKHBnbGVuKSB7CkBAIC04NTIsMTkgKzg1MywyMiBAQAogCQkJZm9yIChqID0gMDsgaiA8IHBnbGVuOyBqKyspCiAJCQkJcGctPm9zZHNbal0gPSBjZXBoX2RlY29kZV8zMihwKTsKIAkJCWVyciA9IF9faW5zZXJ0X3BnX21hcHBpbmcocGcsICZtYXAtPnBnX3RlbXApOwotCQkJaWYgKGVycikKKwkJCWlmIChlcnIpIHsKKwkJCQlrZnJlZShwZyk7CiAJCQkJZ290byBiYWQ7CisJCQl9CiAJCQlkb3V0KCIgYWRkZWQgcGdfdGVtcCAlbGx4IGxlbiAlZFxuIiwgKih1NjQgKikmcGdpZCwKIAkJCSAgICAgcGdsZW4pOwogCQl9CiAJfQogCXdoaWxlIChyYnApIHsKLQkJc3RydWN0IHJiX25vZGUgKmN1ciA9IHJicDsKKwkJc3RydWN0IGNlcGhfcGdfbWFwcGluZyAqY3VyID0KKwkJCXJiX2VudHJ5KHJicCwgc3RydWN0IGNlcGhfcGdfbWFwcGluZywgbm9kZSk7CisKIAkJcmJwID0gcmJfbmV4dChyYnApOwotCQlkb3V0KCIgcmVtb3ZlZCBwZ190ZW1wICVsbHhcbiIsCi0JCSAgICAgKih1NjQgKikmcmJfZW50cnkoY3VyLCBzdHJ1Y3QgY2VwaF9wZ19tYXBwaW5nLAotCQkJCSAgICAgICBub2RlKS0+cGdpZCk7Ci0JCXJiX2VyYXNlKGN1ciwgJm1hcC0+cGdfdGVtcCk7CisJCWRvdXQoIiByZW1vdmVkIHBnX3RlbXAgJWxseFxuIiwgKih1NjQgKikmY3VyLT5wZ2lkKTsKKwkJcmJfZXJhc2UoJmN1ci0+bm9kZSwgJm1hcC0+cGdfdGVtcCk7CisJCWtmcmVlKGN1cik7CiAJfQogCiAJLyogaWdub3JlIHRoZSByZXN0ICovCmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCBkNmRiOTMzLi5mODBhNGYyIDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9LY29uZmlnIGIvZnMvY2lmcy9LY29uZmlnCmluZGV4IDgwZjM1MjUuLjU3MzlmZDcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvS2NvbmZpZworKysgYi9mcy9jaWZzL0tjb25maWcKQEAgLTEzMSw2ICsxMzEsMTUgQEAKIAkgICAgSVAgYWRkcmVzc2VzKSB3aGljaCBpcyBuZWVkZWQgZm9yIGltcGxpY2l0IG1vdW50cyBvZiBERlMganVuY3Rpb24KIAkgICAgcG9pbnRzLiBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgQ0lGU19GU0NBQ0hFCisJICBib29sICJQcm92aWRlIENJRlMgY2xpZW50IGNhY2hpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwkgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJICBkZXBlbmRzIG9uIENJRlM9bSAmJiBGU0NBQ0hFIHx8IENJRlM9eSAmJiBGU0NBQ0hFPXkKKwkgIGhlbHAKKwkgICAgTWFrZXMgQ0lGUyBGUy1DYWNoZSBjYXBhYmxlLiBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHlvdXIgQ0lGUyBkYXRhCisJICAgIHRvIGJlIGNhY2hlZCBsb2NhbGx5IG9uIGRpc2sgdGhyb3VnaCB0aGUgZ2VuZXJhbCBmaWxlc3lzdGVtIGNhY2hlCisJICAgIG1hbmFnZXIuIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBDSUZTX0VYUEVSSU1FTlRBTAogCSAgYm9vbCAiQ0lGUyBFeHBlcmltZW50YWwgRmVhdHVyZXMgKEVYUEVSSU1FTlRBTCkiCiAJICBkZXBlbmRzIG9uIENJRlMgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9mcy9jaWZzL01ha2VmaWxlIGIvZnMvY2lmcy9NYWtlZmlsZQppbmRleCA5OTQ4YzAwMy4uYWRlZmE2MCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9NYWtlZmlsZQorKysgYi9mcy9jaWZzL01ha2VmaWxlCkBAIC0xMSwzICsxMSw1IEBACiBjaWZzLSQoQ09ORklHX0NJRlNfVVBDQUxMKSArPSBjaWZzX3NwbmVnby5vCiAKIGNpZnMtJChDT05GSUdfQ0lGU19ERlNfVVBDQUxMKSArPSBkbnNfcmVzb2x2ZS5vIGNpZnNfZGZzX3JlZi5vCisKK2NpZnMtJChDT05GSUdfQ0lGU19GU0NBQ0hFKSArPSBmc2NhY2hlLm8gY2FjaGUubwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jYWNoZS5jIGIvZnMvY2lmcy9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGQ3YmJkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jYWNoZS5jCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogICBmcy9jaWZzL2NhY2hlLmMgLSBDSUZTIGZpbGVzeXN0ZW0gY2FjaGUgaW5kZXggc3RydWN0dXJlIGRlZmluaXRpb25zCisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMTAgTm92ZWxsLCBJbmMuCisgKiAgIEF1dGhvcnMocyk6IFN1cmVzaCBKYXlhcmFtYW4gKHNqYXlhcmFtYW5Ac3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSAiZnNjYWNoZS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKworLyoKKyAqIENJRlMgZmlsZXN5c3RlbSBkZWZpbml0aW9uIGZvciBGUy1DYWNoZQorICovCitzdHJ1Y3QgZnNjYWNoZV9uZXRmcyBjaWZzX2ZzY2FjaGVfbmV0ZnMgPSB7CisJLm5hbWUgPSAiY2lmcyIsCisJLnZlcnNpb24gPSAwLAorfTsKKworLyoKKyAqIFJlZ2lzdGVyIENJRlMgZm9yIGNhY2hpbmcgd2l0aCBGUy1DYWNoZQorICovCitpbnQgY2lmc19mc2NhY2hlX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGZzY2FjaGVfcmVnaXN0ZXJfbmV0ZnMoJmNpZnNfZnNjYWNoZV9uZXRmcyk7Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIENJRlMgZm9yIGNhY2hpbmcKKyAqLwordm9pZCBjaWZzX2ZzY2FjaGVfdW5yZWdpc3Rlcih2b2lkKQoreworCWZzY2FjaGVfdW5yZWdpc3Rlcl9uZXRmcygmY2lmc19mc2NhY2hlX25ldGZzKTsKK30KKworLyoKKyAqIEtleSBsYXlvdXQgb2YgQ0lGUyBzZXJ2ZXIgY2FjaGUgaW5kZXggb2JqZWN0CisgKi8KK3N0cnVjdCBjaWZzX3NlcnZlcl9rZXkgeworCXVpbnQxNl90CWZhbWlseTsJCS8qIGFkZHJlc3MgZmFtaWx5ICovCisJdWludDE2X3QJcG9ydDsJCS8qIElQIHBvcnQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBpbl9hZGRyCWlwdjRfYWRkcjsKKwkJc3RydWN0IGluNl9hZGRyCWlwdjZfYWRkcjsKKwl9IGFkZHJbMF07Cit9OworCisvKgorICogU2VydmVyIG9iamVjdCBrZXllZCBieSB7SVBhZGRyZXNzLHBvcnQsZmFtaWx5fSB0dXBsZQorICovCitzdGF0aWMgdWludDE2X3QgY2lmc19zZXJ2ZXJfZ2V0X2tleShjb25zdCB2b2lkICpjb29raWVfbmV0ZnNfZGF0YSwKKwkJCQkgICB2b2lkICpidWZmZXIsIHVpbnQxNl90IG1heGJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSBjb29raWVfbmV0ZnNfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLT5hZGRyLnNvY2tBZGRyOworCXN0cnVjdCBjaWZzX3NlcnZlcl9rZXkgKmtleSA9IGJ1ZmZlcjsKKwl1aW50MTZfdCBrZXlfbGVuID0gc2l6ZW9mKHN0cnVjdCBjaWZzX3NlcnZlcl9rZXkpOworCisJbWVtc2V0KGtleSwgMCwga2V5X2xlbik7CisKKwkvKgorCSAqIFNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGFzIHNpbl9mYW1pbHkvc2luNl9mYW1pbHkgb3ZlcmxheXMKKwkgKiBzYV9mYW1pbHkgZmllbGQKKwkgKi8KKwlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWtleS0+ZmFtaWx5ID0gc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9mYW1pbHk7CisJCWtleS0+cG9ydCA9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fcG9ydDsKKwkJa2V5LT5hZGRyWzBdLmlwdjRfYWRkciA9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkcjsKKwkJa2V5X2xlbiArPSBzaXplb2Yoa2V5LT5hZGRyWzBdLmlwdjRfYWRkcik7CisJCWJyZWFrOworCisJY2FzZSBBRl9JTkVUNjoKKwkJa2V5LT5mYW1pbHkgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfZmFtaWx5OworCQlrZXktPnBvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydDsKKwkJa2V5LT5hZGRyWzBdLmlwdjZfYWRkciA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyOworCQlrZXlfbGVuICs9IHNpemVvZihrZXktPmFkZHJbMF0uaXB2Nl9hZGRyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQljRVJST1IoMSwgIkNJRlM6IFVua25vd24gbmV0d29yayBmYW1pbHkgJyVkJyIsIHNhLT5zYV9mYW1pbHkpOworCQlrZXlfbGVuID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGtleV9sZW47Cit9CisKKy8qCisgKiBTZXJ2ZXIgb2JqZWN0IGZvciBGUy1DYWNoZQorICovCitjb25zdCBzdHJ1Y3QgZnNjYWNoZV9jb29raWVfZGVmIGNpZnNfZnNjYWNoZV9zZXJ2ZXJfaW5kZXhfZGVmID0geworCS5uYW1lID0gIkNJRlMuc2VydmVyIiwKKwkudHlwZSA9IEZTQ0FDSEVfQ09PS0lFX1RZUEVfSU5ERVgsCisJLmdldF9rZXkgPSBjaWZzX3NlcnZlcl9nZXRfa2V5LAorfTsKKworLyoKKyAqIEF1eGlsaWFyeSBkYXRhIGF0dGFjaGVkIHRvIENJRlMgc3VwZXJibG9jayB3aXRoaW4gdGhlIGNhY2hlCisgKi8KK3N0cnVjdCBjaWZzX2ZzY2FjaGVfc3VwZXJfYXV4ZGF0YSB7CisJdTY0CXJlc291cmNlX2lkOwkJLyogdW5pcXVlIHNlcnZlciByZXNvdXJjZSBpZCAqLworfTsKKworc3RhdGljIGNoYXIgKmV4dHJhY3Rfc2hhcmVuYW1lKGNvbnN0IGNoYXIgKnRyZWVuYW1lKQoreworCWNvbnN0IGNoYXIgKnNyYzsKKwljaGFyICpkZWxpbSwgKmRzdDsKKwlpbnQgbGVuOworCisJLyogc2tpcCBkb3VibGUgY2hhcnMgYXQgdGhlIGJlZ2lubmluZyAqLworCXNyYyA9IHRyZWVuYW1lICsgMjsKKworCS8qIHNoYXJlIG5hbWUgaXMgYWx3YXlzIHByZWNlZGVkIGJ5ICdcXCcgbm93ICovCisJZGVsaW0gPSBzdHJjaHIoc3JjLCAnXFwnKTsKKwlpZiAoIWRlbGltKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlkZWxpbSsrOworCWxlbiA9IHN0cmxlbihkZWxpbSk7CisKKwkvKiBjYWxsZXIgaGFzIHRvIGZyZWUgdGhlIG1lbW9yeSAqLworCWRzdCA9IGtzdHJuZHVwKGRlbGltLCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghZHN0KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXJldHVybiBkc3Q7Cit9CisKKy8qCisgKiBTdXBlcmJsb2NrIG9iamVjdCBjdXJyZW50bHkga2V5ZWQgYnkgc2hhcmUgbmFtZQorICovCitzdGF0aWMgdWludDE2X3QgY2lmc19zdXBlcl9nZXRfa2V5KGNvbnN0IHZvaWQgKmNvb2tpZV9uZXRmc19kYXRhLCB2b2lkICpidWZmZXIsCisJCQkJICAgdWludDE2X3QgbWF4YnVmKQoreworCWNvbnN0IHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24gPSBjb29raWVfbmV0ZnNfZGF0YTsKKwljaGFyICpzaGFyZW5hbWU7CisJdWludDE2X3QgbGVuOworCisJc2hhcmVuYW1lID0gZXh0cmFjdF9zaGFyZW5hbWUodGNvbi0+dHJlZU5hbWUpOworCWlmIChJU19FUlIoc2hhcmVuYW1lKSkgeworCQljRllJKDEsICJDSUZTOiBjb3VsZG4ndCBleHRyYWN0IHNoYXJlbmFtZVxuIik7CisJCXNoYXJlbmFtZSA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWxlbiA9IHN0cmxlbihzaGFyZW5hbWUpOworCWlmIChsZW4gPiBtYXhidWYpCisJCXJldHVybiAwOworCisJbWVtY3B5KGJ1ZmZlciwgc2hhcmVuYW1lLCBsZW4pOworCisJa2ZyZWUoc2hhcmVuYW1lKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB1aW50MTZfdAorY2lmc19mc2NhY2hlX3N1cGVyX2dldF9hdXgoY29uc3Qgdm9pZCAqY29va2llX25ldGZzX2RhdGEsIHZvaWQgKmJ1ZmZlciwKKwkJCSAgIHVpbnQxNl90IG1heGJ1ZikKK3sKKwlzdHJ1Y3QgY2lmc19mc2NhY2hlX3N1cGVyX2F1eGRhdGEgYXV4ZGF0YTsKKwljb25zdCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uID0gY29va2llX25ldGZzX2RhdGE7CisKKwltZW1zZXQoJmF1eGRhdGEsIDAsIHNpemVvZihhdXhkYXRhKSk7CisJYXV4ZGF0YS5yZXNvdXJjZV9pZCA9IHRjb24tPnJlc291cmNlX2lkOworCisJaWYgKG1heGJ1ZiA+IHNpemVvZihhdXhkYXRhKSkKKwkJbWF4YnVmID0gc2l6ZW9mKGF1eGRhdGEpOworCisJbWVtY3B5KGJ1ZmZlciwgJmF1eGRhdGEsIG1heGJ1Zik7CisKKwlyZXR1cm4gbWF4YnVmOworfQorCitzdGF0aWMgZW51bQorZnNjYWNoZV9jaGVja2F1eCBjaWZzX2ZzY2FjaGVfc3VwZXJfY2hlY2tfYXV4KHZvaWQgKmNvb2tpZV9uZXRmc19kYXRhLAorCQkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgICB1aW50MTZfdCBkYXRhbGVuKQoreworCXN0cnVjdCBjaWZzX2ZzY2FjaGVfc3VwZXJfYXV4ZGF0YSBhdXhkYXRhOworCWNvbnN0IHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24gPSBjb29raWVfbmV0ZnNfZGF0YTsKKworCWlmIChkYXRhbGVuICE9IHNpemVvZihhdXhkYXRhKSkKKwkJcmV0dXJuIEZTQ0FDSEVfQ0hFQ0tBVVhfT0JTT0xFVEU7CisKKwltZW1zZXQoJmF1eGRhdGEsIDAsIHNpemVvZihhdXhkYXRhKSk7CisJYXV4ZGF0YS5yZXNvdXJjZV9pZCA9IHRjb24tPnJlc291cmNlX2lkOworCisJaWYgKG1lbWNtcChkYXRhLCAmYXV4ZGF0YSwgZGF0YWxlbikgIT0gMCkKKwkJcmV0dXJuIEZTQ0FDSEVfQ0hFQ0tBVVhfT0JTT0xFVEU7CisKKwlyZXR1cm4gRlNDQUNIRV9DSEVDS0FVWF9PS0FZOworfQorCisvKgorICogU3VwZXJibG9jayBvYmplY3QgZm9yIEZTLUNhY2hlCisgKi8KK2NvbnN0IHN0cnVjdCBmc2NhY2hlX2Nvb2tpZV9kZWYgY2lmc19mc2NhY2hlX3N1cGVyX2luZGV4X2RlZiA9IHsKKwkubmFtZSA9ICJDSUZTLnN1cGVyIiwKKwkudHlwZSA9IEZTQ0FDSEVfQ09PS0lFX1RZUEVfSU5ERVgsCisJLmdldF9rZXkgPSBjaWZzX3N1cGVyX2dldF9rZXksCisJLmdldF9hdXggPSBjaWZzX2ZzY2FjaGVfc3VwZXJfZ2V0X2F1eCwKKwkuY2hlY2tfYXV4ID0gY2lmc19mc2NhY2hlX3N1cGVyX2NoZWNrX2F1eCwKK307CisKKy8qCisgKiBBdXhpbGlhcnkgZGF0YSBhdHRhY2hlZCB0byBDSUZTIGlub2RlIHdpdGhpbiB0aGUgY2FjaGUKKyAqLworc3RydWN0IGNpZnNfZnNjYWNoZV9pbm9kZV9hdXhkYXRhIHsKKwlzdHJ1Y3QgdGltZXNwZWMJbGFzdF93cml0ZV90aW1lOworCXN0cnVjdCB0aW1lc3BlYwlsYXN0X2NoYW5nZV90aW1lOworCXU2NAkJZW9mOworfTsKKworc3RhdGljIHVpbnQxNl90IGNpZnNfZnNjYWNoZV9pbm9kZV9nZXRfa2V5KGNvbnN0IHZvaWQgKmNvb2tpZV9uZXRmc19kYXRhLAorCQkJCQkgICB2b2lkICpidWZmZXIsIHVpbnQxNl90IG1heGJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBjb29raWVfbmV0ZnNfZGF0YTsKKwl1aW50MTZfdCBrZXlsZW47CisKKwkvKiB1c2UgdGhlIFVuaXF1ZUlkIGFzIHRoZSBrZXkgKi8KKwlrZXlsZW4gPSBzaXplb2YoY2lmc2ktPnVuaXF1ZWlkKTsKKwlpZiAoa2V5bGVuID4gbWF4YnVmKQorCQlrZXlsZW4gPSAwOworCWVsc2UKKwkJbWVtY3B5KGJ1ZmZlciwgJmNpZnNpLT51bmlxdWVpZCwga2V5bGVuKTsKKworCXJldHVybiBrZXlsZW47Cit9CisKK3N0YXRpYyB2b2lkCitjaWZzX2ZzY2FjaGVfaW5vZGVfZ2V0X2F0dHIoY29uc3Qgdm9pZCAqY29va2llX25ldGZzX2RhdGEsIHVpbnQ2NF90ICpzaXplKQoreworCWNvbnN0IHN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGNvb2tpZV9uZXRmc19kYXRhOworCisJKnNpemUgPSBjaWZzaS0+dmZzX2lub2RlLmlfc2l6ZTsKK30KKworc3RhdGljIHVpbnQxNl90CitjaWZzX2ZzY2FjaGVfaW5vZGVfZ2V0X2F1eChjb25zdCB2b2lkICpjb29raWVfbmV0ZnNfZGF0YSwgdm9pZCAqYnVmZmVyLAorCQkJICAgdWludDE2X3QgbWF4YnVmKQoreworCXN0cnVjdCBjaWZzX2ZzY2FjaGVfaW5vZGVfYXV4ZGF0YSBhdXhkYXRhOworCWNvbnN0IHN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGNvb2tpZV9uZXRmc19kYXRhOworCisJbWVtc2V0KCZhdXhkYXRhLCAwLCBzaXplb2YoYXV4ZGF0YSkpOworCWF1eGRhdGEuZW9mID0gY2lmc2ktPnNlcnZlcl9lb2Y7CisJYXV4ZGF0YS5sYXN0X3dyaXRlX3RpbWUgPSBjaWZzaS0+dmZzX2lub2RlLmlfbXRpbWU7CisJYXV4ZGF0YS5sYXN0X2NoYW5nZV90aW1lID0gY2lmc2ktPnZmc19pbm9kZS5pX2N0aW1lOworCisJaWYgKG1heGJ1ZiA+IHNpemVvZihhdXhkYXRhKSkKKwkJbWF4YnVmID0gc2l6ZW9mKGF1eGRhdGEpOworCisJbWVtY3B5KGJ1ZmZlciwgJmF1eGRhdGEsIG1heGJ1Zik7CisKKwlyZXR1cm4gbWF4YnVmOworfQorCitzdGF0aWMgZW51bQorZnNjYWNoZV9jaGVja2F1eCBjaWZzX2ZzY2FjaGVfaW5vZGVfY2hlY2tfYXV4KHZvaWQgKmNvb2tpZV9uZXRmc19kYXRhLAorCQkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkgICAgICB1aW50MTZfdCBkYXRhbGVuKQoreworCXN0cnVjdCBjaWZzX2ZzY2FjaGVfaW5vZGVfYXV4ZGF0YSBhdXhkYXRhOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGNvb2tpZV9uZXRmc19kYXRhOworCisJaWYgKGRhdGFsZW4gIT0gc2l6ZW9mKGF1eGRhdGEpKQorCQlyZXR1cm4gRlNDQUNIRV9DSEVDS0FVWF9PQlNPTEVURTsKKworCW1lbXNldCgmYXV4ZGF0YSwgMCwgc2l6ZW9mKGF1eGRhdGEpKTsKKwlhdXhkYXRhLmVvZiA9IGNpZnNpLT5zZXJ2ZXJfZW9mOworCWF1eGRhdGEubGFzdF93cml0ZV90aW1lID0gY2lmc2ktPnZmc19pbm9kZS5pX210aW1lOworCWF1eGRhdGEubGFzdF9jaGFuZ2VfdGltZSA9IGNpZnNpLT52ZnNfaW5vZGUuaV9jdGltZTsKKworCWlmIChtZW1jbXAoZGF0YSwgJmF1eGRhdGEsIGRhdGFsZW4pICE9IDApCisJCXJldHVybiBGU0NBQ0hFX0NIRUNLQVVYX09CU09MRVRFOworCisJcmV0dXJuIEZTQ0FDSEVfQ0hFQ0tBVVhfT0tBWTsKK30KKworc3RhdGljIHZvaWQgY2lmc19mc2NhY2hlX2lub2RlX25vd191bmNhY2hlZCh2b2lkICpjb29raWVfbmV0ZnNfZGF0YSkKK3sKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBjb29raWVfbmV0ZnNfZGF0YTsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXBnb2ZmX3QgZmlyc3Q7CisJaW50IGxvb3AsIG5yX3BhZ2VzOworCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwlmaXJzdCA9IDA7CisKKwljRllJKDEsICJjaWZzIGlub2RlIDB4JXAgbm93IHVuY2FjaGVkIiwgY2lmc2kpOworCisJZm9yICg7OykgeworCQlucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwKCZwdmVjLAorCQkJCQkgIGNpZnNpLT52ZnNfaW5vZGUuaV9tYXBwaW5nLCBmaXJzdCwKKwkJCQkJICBQQUdFVkVDX1NJWkUgLSBwYWdldmVjX2NvdW50KCZwdmVjKSk7CisJCWlmICghbnJfcGFnZXMpCisJCQlicmVhazsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbnJfcGFnZXM7IGxvb3ArKykKKwkJCUNsZWFyUGFnZUZzQ2FjaGUocHZlYy5wYWdlc1tsb29wXSk7CisKKwkJZmlyc3QgPSBwdmVjLnBhZ2VzW25yX3BhZ2VzIC0gMV0tPmluZGV4ICsgMTsKKworCQlwdmVjLm5yID0gbnJfcGFnZXM7CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KK30KKworY29uc3Qgc3RydWN0IGZzY2FjaGVfY29va2llX2RlZiBjaWZzX2ZzY2FjaGVfaW5vZGVfb2JqZWN0X2RlZiA9IHsKKwkubmFtZQkJPSAiQ0lGUy51bmlxdWVpZCIsCisJLnR5cGUJCT0gRlNDQUNIRV9DT09LSUVfVFlQRV9EQVRBRklMRSwKKwkuZ2V0X2tleQk9IGNpZnNfZnNjYWNoZV9pbm9kZV9nZXRfa2V5LAorCS5nZXRfYXR0cgk9IGNpZnNfZnNjYWNoZV9pbm9kZV9nZXRfYXR0ciwKKwkuZ2V0X2F1eAk9IGNpZnNfZnNjYWNoZV9pbm9kZV9nZXRfYXV4LAorCS5jaGVja19hdXgJPSBjaWZzX2ZzY2FjaGVfaW5vZGVfY2hlY2tfYXV4LAorCS5ub3dfdW5jYWNoZWQJPSBjaWZzX2ZzY2FjaGVfaW5vZGVfbm93X3VuY2FjaGVkLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZnNfcmVmLmMgYi9mcy9jaWZzL2NpZnNfZGZzX3JlZi5jCmluZGV4IGFjMTlhNmYuLmRjMWVkNTAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc19kZnNfcmVmLmMKKysrIGIvZnMvY2lmcy9jaWZzX2Rmc19yZWYuYwpAQCAtMjMwLDI4ICsyMzAsMjIgQEAKIAlnb3RvIGNvbXBvc2VfbW91bnRfb3B0aW9uc19vdXQ7CiB9CiAKLQotc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqY2lmc19kZnNfZG9fcmVmbW91bnQoY29uc3Qgc3RydWN0IHZmc21vdW50ICptbnRfcGFyZW50LAotCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IHN0cnVjdCBkZnNfaW5mbzNfcGFyYW0gKnJlZikKKy8qKgorICogY2lmc19kZnNfZG9fcmVmbW91bnQgLSBtb3VudHMgc3BlY2lmaWVkIHBhdGggdXNpbmcgcHJvdmlkZWQgcmVmZmVyYWwKKyAqIEBjaWZzX3NiOgkJcGFyZW50L3Jvb3Qgc3VwZXJibG9jaworICogQGZ1bGxwYXRoOgkJZnVsbCBwYXRoIGluIFVOQyBmb3JtYXQKKyAqIEByZWY6CQlzZXJ2ZXIncyByZWZlcnJhbAorICovCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpjaWZzX2Rmc19kb19yZWZtb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQljb25zdCBjaGFyICpmdWxscGF0aCwgY29uc3Qgc3RydWN0IGRmc19pbmZvM19wYXJhbSAqcmVmKQogewotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CiAJc3RydWN0IHZmc21vdW50ICptbnQ7CiAJY2hhciAqbW91bnRkYXRhOwogCWNoYXIgKmRldm5hbWUgPSBOVUxMOwotCWNoYXIgKmZ1bGxwYXRoOwogCi0JY2lmc19zYiA9IENJRlNfU0IoZGVudHJ5LT5kX2lub2RlLT5pX3NiKTsKLQkvKgotCSAqIHRoaXMgZnVuY3Rpb24gZ2l2ZXMgdXMgYSBwYXRoIHdpdGggYSBkb3VibGUgYmFja3NsYXNoIHByZWZpeC4gV2UKLQkgKiByZXF1aXJlIGEgc2luZ2xlIGJhY2tzbGFzaCBmb3IgREZTLgotCSAqLwotCWZ1bGxwYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkZW50cnkpOwotCWlmICghZnVsbHBhdGgpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCisJLyogc3RyaXAgZmlyc3QgJ1wnIGZyb20gZnVsbHBhdGggKi8KIAltb3VudGRhdGEgPSBjaWZzX2NvbXBvc2VfbW91bnRfb3B0aW9ucyhjaWZzX3NiLT5tb3VudGRhdGEsCiAJCQlmdWxscGF0aCArIDEsIHJlZiwgJmRldm5hbWUpOwotCWtmcmVlKGZ1bGxwYXRoKTsKIAogCWlmIChJU19FUlIobW91bnRkYXRhKSkKIAkJcmV0dXJuIChzdHJ1Y3QgdmZzbW91bnQgKiltb3VudGRhdGE7CkBAIC0zNTcsOCArMzUxLDggQEAKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0X2VycjsKIAkJfQotCQltbnQgPSBjaWZzX2Rmc19kb19yZWZtb3VudChuZC0+cGF0aC5tbnQsCi0JCQkJbmQtPnBhdGguZGVudHJ5LCByZWZlcnJhbHMgKyBpKTsKKwkJbW50ID0gY2lmc19kZnNfZG9fcmVmbW91bnQoY2lmc19zYiwKKwkJCQlmdWxsX3BhdGgsIHJlZmVycmFscyArIGkpOwogCQljRllJKDEsICIlczogY2lmc19kZnNfZG9fcmVmbW91bnQ6JXMgLCBtbnQ6JXAiLCBfX2Z1bmNfXywKIAkJCQkJcmVmZXJyYWxzW2ldLm5vZGVfbmFtZSwgbW50KTsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2ZzX3NiLmggYi9mcy9jaWZzL2NpZnNfZnNfc2IuaAppbmRleCAyNDZhMTY3Li45ZTc3MTQ1IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfZnNfc2IuaAorKysgYi9mcy9jaWZzL2NpZnNfZnNfc2IuaApAQCAtMzUsNiArMzUsNyBAQAogI2RlZmluZSBDSUZTX01PVU5UX0RZTlBFUk0gICAgICAweDEwMDAgLyogYWxsb3cgaW4tbWVtb3J5IG9ubHkgbW9kZSBzZXR0aW5nICAgKi8KICNkZWZpbmUgQ0lGU19NT1VOVF9OT1BPU0lYQlJMICAgMHgyMDAwIC8qIG1hbmRhdG9yeSBub3QgcG9zaXggYnl0ZSByYW5nZSBsb2NrICovCiAjZGVmaW5lIENJRlNfTU9VTlRfTk9TU1lOQyAgICAgIDB4NDAwMCAvKiBkb24ndCBkbyBzbG93IFNNQmZsdXNoIG9uIGV2ZXJ5IHN5bmMqLworI2RlZmluZSBDSUZTX01PVU5UX0ZTQ0FDSEUJMHg4MDAwIC8qIGxvY2FsIGNhY2hpbmcgZW5hYmxlZCAqLwogCiBzdHJ1Y3QgY2lmc19zYl9pbmZvIHsKIAlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uOwkvKiBwcmltYXJ5IG1vdW50ICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNfc3BuZWdvLmMgYi9mcy9jaWZzL2NpZnNfc3BuZWdvLmMKaW5kZXggMzc5YmQ3ZC4uNmVmZmNjZiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzX3NwbmVnby5jCisrKyBiL2ZzL2NpZnMvY2lmc19zcG5lZ28uYwpAQCAtMTQ0LDYgKzE0NCw5IEBACiAJc3ByaW50ZihkcCwgIjt1aWQ9MHgleCIsIHNlc0luZm8tPmxpbnV4X3VpZCk7CiAKIAlkcCA9IGRlc2NyaXB0aW9uICsgc3RybGVuKGRlc2NyaXB0aW9uKTsKKwlzcHJpbnRmKGRwLCAiO2NyZWR1aWQ9MHgleCIsIHNlc0luZm8tPmNyZWRfdWlkKTsKKworCWRwID0gZGVzY3JpcHRpb24gKyBzdHJsZW4oZGVzY3JpcHRpb24pOwogCXNwcmludGYoZHAsICI7dXNlcj0lcyIsIHNlc0luZm8tPnVzZXJOYW1lKTsKIAogCWRwID0gZGVzY3JpcHRpb24gKyBzdHJsZW4oZGVzY3JpcHRpb24pOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggMmNiMWE3MC4uOGEyY2YxMiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgva2V5LXR5cGUuaD4KICNpbmNsdWRlICJkbnNfcmVzb2x2ZS5oIgogI2luY2x1ZGUgImNpZnNfc3BuZWdvLmgiCisjaW5jbHVkZSAiZnNjYWNoZS5oIgogI2RlZmluZSBDSUZTX01BR0lDX05VTUJFUiAweEZGNTM0RDQyCS8qIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIFNNQiBQRFVzICovCiAKIGludCBjaWZzRllJID0gMDsKQEAgLTMyOSw2ICszMzAsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKK2NpZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwljaWZzX2ZzY2FjaGVfcmVsZWFzZV9pbm9kZV9jb29raWUoaW5vZGUpOworfQorCitzdGF0aWMgdm9pZAogY2lmc19zaG93X2FkZHJlc3Moc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCiB7CiAJc2VxX3ByaW50ZihzLCAiLGFkZHI9Iik7CkBAIC00ODksNiArNDk2LDcgQEAKIAkuYWxsb2NfaW5vZGUgPSBjaWZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlID0gY2lmc19kZXN0cm95X2lub2RlLAogCS5kcm9wX2lub2RlCT0gY2lmc19kcm9wX2lub2RlLAorCS5jbGVhcl9pbm9kZQk9IGNpZnNfY2xlYXJfaW5vZGUsCiAvKgkuZGVsZXRlX2lub2RlCT0gY2lmc19kZWxldGVfaW5vZGUsICAqLyAgLyogRG8gbm90IG5lZWQgYWJvdmUKIAlmdW5jdGlvbiB1bmxlc3MgbGF0ZXIgd2UgYWRkIGxhenkgY2xvc2Ugb2YgaW5vZGVzIG9yIHVubGVzcyB0aGUKIAlrZXJuZWwgZm9yZ2V0cyB0byBjYWxsIHVzIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIHJlbGVhc2VzIChjbG9zZXMpCkBAIC05MDIsNiArOTEwLDEwIEBACiAJCWNGWUkoMSwgImNpZnNfbWF4X3BlbmRpbmcgc2V0IHRvIG1heCBvZiAyNTYiKTsKIAl9CiAKKwlyYyA9IGNpZnNfZnNjYWNoZV9yZWdpc3RlcigpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKIAlyYyA9IGNpZnNfaW5pdF9pbm9kZWNhY2hlKCk7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9jbGVhbl9wcm9jOwpAQCAtOTUxLDYgKzk2Myw4IEBACiAJY2lmc19kZXN0cm95X2lub2RlY2FjaGUoKTsKICBvdXRfY2xlYW5fcHJvYzoKIAljaWZzX3Byb2NfY2xlYW4oKTsKKwljaWZzX2ZzY2FjaGVfdW5yZWdpc3RlcigpOworIG91dDoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTk1OSw2ICs5NzMsNyBAQAogewogCWNGWUkoREJHMiwgImV4aXRfY2lmcyIpOwogCWNpZnNfcHJvY19jbGVhbigpOworCWNpZnNfZnNjYWNoZV91bnJlZ2lzdGVyKCk7CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogCWNpZnNfZGZzX3JlbGVhc2VfYXV0b21vdW50X3RpbWVyKCk7CiAJY2lmc19leGl0X2Ruc19yZXNvbHZlcigpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuaCBiL2ZzL2NpZnMvY2lmc2ZzLmgKaW5kZXggYTdlYjY1Yy4uZDgyZjVmYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuaAorKysgYi9mcy9jaWZzL2NpZnNmcy5oCkBAIC0xMTQsNSArMTE0LDUgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgY2lmc19leHBvcnRfb3BzOwogI2VuZGlmIC8qIEVYUEVSSU1FTlRBTCAqLwogCi0jZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjY0IgorI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS42NSIKICNlbmRpZgkJCQkvKiBfQ0lGU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2dsb2IuaCBiL2ZzL2NpZnMvY2lmc2dsb2IuaAppbmRleCBhODg0NzljLi41OTkwNjE0IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNnbG9iLmgKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC0xNiw2ICsxNiw5IEBACiAgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KKyNpZm5kZWYgX0NJRlNfR0xPQl9ICisjZGVmaW5lIF9DSUZTX0dMT0JfSAorCiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zNCw3ICszNyw3IEBACiAjZGVmaW5lIE1BWF9TSEFSRV9TSVpFICA2NAkvKiB1c2VkIHRvIGJlIDIwLCB0aGlzIHNob3VsZCBzdGlsbCBiZSBlbm91Z2ggKi8KICNkZWZpbmUgTUFYX1VTRVJOQU1FX1NJWkUgMzIJLyogMzIgaXMgdG8gYWxsb3cgZm9yIDE1IGNoYXIgbmFtZXMgKyBudWxsCiAJCQkJICAgdGVybWluYXRpb24gdGhlbiAqMiBmb3IgdW5pY29kZSB2ZXJzaW9ucyAqLwotI2RlZmluZSBNQVhfUEFTU1dPUkRfU0laRSAxNgorI2RlZmluZSBNQVhfUEFTU1dPUkRfU0laRSA1MTIgIC8qIG1heCBmb3Igd2luZG93cyBzZWVtcyB0byBiZSAyNTYgd2lkZSBjaGFycyAqLwogCiAjZGVmaW5lIENJRlNfTUlOX1JDVl9QT09MIDQKIApAQCAtODAsOCArODMsNyBAQAogfTsKIAogZW51bSBzZWN1cml0eUVudW0gewotCVBMQUlOVFhUID0gMCwgCQkvKiBMZWdhY3kgd2l0aCBQbGFpbnRleHQgcGFzc3dvcmRzICovCi0JTEFOTUFOLAkJCS8qIExlZ2FjeSBMQU5NQU4gYXV0aCAqLworCUxBTk1BTiA9IDAsCQkJLyogTGVnYWN5IExBTk1BTiBhdXRoICovCiAJTlRMTSwJCQkvKiBMZWdhY3kgTlRMTTAxMiBhdXRoIHdpdGggTlRMTSBoYXNoICovCiAJTlRMTXYyLAkJCS8qIExlZ2FjeSBOVExNIGF1dGggd2l0aCBOVExNdjIgaGFzaCAqLwogCVJhd05UTE1TU1AsCQkvKiBOVExNU1NQIHdpdGhvdXQgU1BORUdPLCBOVExNdjIgaGFzaCAqLwpAQCAtMTQyLDcgKzE0NCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX21pZF9xOwogCXZvaWQgKlNlcnZlcl9ObHNJbmZvOwkvKiBCQiAtIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgTkxTIGluZm8gICovCiAJdW5zaWduZWQgc2hvcnQgc2VydmVyX2NvZGVwYWdlOwkvKiBjb2RlcGFnZSBmb3IgdGhlIHNlcnZlciAgICAqLwotCXVuc2lnbmVkIGxvbmcgaXBfYWRkcmVzczsJLyogSVAgYWRkciBmb3IgdGhlIHNlcnZlciBpZiBrbm93biAqLwogCWVudW0gcHJvdG9jb2xFbnVtIHByb3RvY29sVHlwZTsKIAljaGFyIHZlcnNpb25NYWpvcjsKIAljaGFyIHZlcnNpb25NaW5vcjsKQEAgLTE5MCwxOSArMTkxLDkgQEAKIAlib29sCXNlY19tc2tlcmJlcm9zOwkJLyogc3VwcG9ydHMgbGVnYWN5IE1TIEtlcmJlcm9zICovCiAJYm9vbAlzZWNfa2VyYmVyb3N1MnU7CS8qIHN1cHBvcnRzIFUyVSBLZXJiZXJvcyAqLwogCWJvb2wJc2VjX250bG1zc3A7CQkvKiBzdXBwb3J0cyBOVExNU1NQICovCi19OwotCi0vKgotICogVGhlIGZvbGxvd2luZyBpcyBvdXIgc2hvcnRjdXQgdG8gdXNlciBpbmZvcm1hdGlvbi4gIFdlIHN1cmZhY2UgdGhlIHVpZCwKLSAqIGFuZCBuYW1lLiBXZSBhbHdheXMgZ2V0IHRoZSBwYXNzd29yZCBvbiB0aGUgZmx5IGluIGNhc2UgaXQKLSAqIGhhcyBjaGFuZ2VkLiBXZSBhbHNvIGhhbmcgYSBsaXN0IG9mIHNlc3Npb25zIG93bmVkIGJ5IHRoaXMgdXNlciBvZmYgaGVyZS4KLSAqLwotc3RydWN0IGNpZnNVaWRJbmZvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHVzZXJMaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgc2Vzc2lvbkxpc3Q7IC8qIFNNQiBzZXNzaW9ucyBmb3IgdGhpcyB1c2VyICovCi0JdWlkX3QgbGludXhfdWlkOwotCWNoYXIgdXNlcltNQVhfVVNFUk5BTUVfU0laRSArIDFdOwkvKiBhc2NpaSBuYW1lIG9mIHVzZXIgKi8KLQkvKiBCQiBtYXkgbmVlZCBwdHIgb3IgY2FsbGJhY2sgZm9yIFBBTSBvciBXaW5CaW5kIGluZm8gKi8KKyNpZmRlZiBDT05GSUdfQ0lGU19GU0NBQ0hFCisJc3RydWN0IGZzY2FjaGVfY29va2llICAgKmZzY2FjaGU7IC8qIGNsaWVudCBpbmRleCBjYWNoZSBjb29raWUgKi8KKyNlbmRpZgogfTsKIAogLyoKQEAgLTIxMiw5ICsyMDMsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgc21iX3Nlc19saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgdGNvbl9saXN0OwogCXN0cnVjdCBtdXRleCBzZXNzaW9uX211dGV4OwotI2lmIDAKLQlzdHJ1Y3QgY2lmc1VpZEluZm8gKnVpZEluZm87CS8qIHBvaW50ZXIgdG8gdXNlciBpbmZvICovCi0jZW5kaWYKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXI7CS8qIHBvaW50ZXIgdG8gc2VydmVyIGluZm8gKi8KIAlpbnQgc2VzX2NvdW50OwkJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KIAllbnVtIHN0YXR1c0VudW0gc3RhdHVzOwpAQCAtMjI2LDcgKzIxNCw4IEBACiAJY2hhciAqc2VydmVyTk9TOwkvKiBuYW1lIG9mIG5ldHdvcmsgb3BlcmF0aW5nIHN5c3RlbSBvZiBzZXJ2ZXIgKi8KIAljaGFyICpzZXJ2ZXJEb21haW47CS8qIHNlY3VyaXR5IHJlYWxtIG9mIHNlcnZlciAqLwogCWludCBTdWlkOwkJLyogcmVtb3RlIHNtYiB1aWQgICovCi0JdWlkX3QgbGludXhfdWlkOyAgICAgICAgLyogbG9jYWwgTGludXggdWlkICovCisJdWlkX3QgbGludXhfdWlkOyAgICAgICAgLyogb3ZlcnJpZGluZyBvd25lciBvZiBmaWxlcyBvbiB0aGUgbW91bnQgKi8KKwl1aWRfdCBjcmVkX3VpZDsJCS8qIG93bmVyIG9mIGNyZWRlbnRpYWxzICovCiAJaW50IGNhcGFiaWxpdGllczsKIAljaGFyIHNlcnZlck5hbWVbU0VSVkVSX05BTUVfTEVOX1dJVEhfTlVMTCAqIDJdOwkvKiBCQiBtYWtlIGJpZ2dlciBmb3IKIAkJCQlUQ1AgbmFtZXMgLSB3aWxsIGlwdjYgYW5kIHNjdHAgYWRkcmVzc2VzIGZpdD8gKi8KQEAgLTMxMSw2ICszMDAsMTAgQEAKIAlib29sIGxvY2FsX2xlYXNlOjE7IC8qIGNoZWNrIGxlYXNlcyAob25seSkgb24gbG9jYWwgc3lzdGVtIG5vdCByZW1vdGUgKi8KIAlib29sIGJyb2tlbl9wb3NpeF9vcGVuOyAvKiBlLmcuIFNhbWJhIHNlcnZlciB2ZXJzaW9ucyA8IDMuMy4yLCAzLjIuOSAqLwogCWJvb2wgbmVlZF9yZWNvbm5lY3Q6MTsgLyogY29ubmVjdGlvbiByZXNldCwgdGlkIG5vdyBpbnZhbGlkICovCisjaWZkZWYgQ09ORklHX0NJRlNfRlNDQUNIRQorCXU2NCByZXNvdXJjZV9pZDsJCS8qIHNlcnZlciByZXNvdXJjZSBpZCAqLworCXN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqZnNjYWNoZTsJLyogY29va2llIGZvciBzaGFyZSAqLworI2VuZGlmCiAJLyogQkIgYWRkIGZpZWxkIGZvciBiYWNrIHBvaW50ZXIgdG8gc2Igc3RydWN0KHMpPyAqLwogfTsKIApAQCAtMzk4LDYgKzM5MSw5IEBACiAJYm9vbCBpbnZhbGlkX21hcHBpbmc6MTsJCS8qIHBhZ2VjYWNoZSBpcyBpbnZhbGlkICovCiAJdTY0ICBzZXJ2ZXJfZW9mOwkJLyogY3VycmVudCBmaWxlIHNpemUgb24gc2VydmVyICovCiAJdTY0ICB1bmlxdWVpZDsJCQkvKiBzZXJ2ZXIgaW5vZGUgbnVtYmVyICovCisjaWZkZWYgQ09ORklHX0NJRlNfRlNDQUNIRQorCXN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqZnNjYWNoZTsKKyNlbmRpZgogCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CiB9OwogCkBAIC03MzMsMyArNzI5LDUgQEAKIEdMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IGNpZnNfbWF4X3BlbmRpbmc7IC8qIE1BWCByZXF1ZXN0cyBhdCBvbmNlIHRvIHNlcnZlciovCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2xvd193b3JrX29wcyBjaWZzX29wbG9ja19icmVha19vcHM7CisKKyNlbmRpZgkvKiBfQ0lGU19HTE9CX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IGZiNjMxOGIuLjJlYWViYmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtODYsNyArODYsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBzbWJDYWxjU2l6ZV9MRShzdHJ1Y3Qgc21iX2hkciAqcHRyKTsKIGV4dGVybiBpbnQgZGVjb2RlX25lZ1Rva2VuSW5pdCh1bnNpZ25lZCBjaGFyICpzZWN1cml0eV9ibG9iLCBpbnQgbGVuZ3RoLAogCQkJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKLWV4dGVybiBpbnQgY2lmc19jb252ZXJ0X2FkZHJlc3MoY2hhciAqc3JjLCB2b2lkICpkc3QpOworZXh0ZXJuIGludCBjaWZzX2NvbnZlcnRfYWRkcmVzcyhzdHJ1Y3Qgc29ja2FkZHIgKmRzdCwgY2hhciAqc3JjKTsKK2V4dGVybiBpbnQgY2lmc19maWxsX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqZHN0LCBjaGFyICpzcmMsCisJCQkJdW5zaWduZWQgc2hvcnQgaW50IHBvcnQpOwogZXh0ZXJuIGludCBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKHN0cnVjdCBzbWJfaGRyICpzbWIsIGludCBsb2dFcnIpOwogZXh0ZXJuIHZvaWQgaGVhZGVyX2Fzc2VtYmxlKHN0cnVjdCBzbWJfaGRyICosIGNoYXIgLyogY29tbWFuZCAqLyAsCiAJCQkgICAgY29uc3Qgc3RydWN0IGNpZnNUY29uSW5mbyAqLCBpbnQgLyogbGVuZ3RoIG9mCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDIyMDhmMDYuLjJhNDNhMGEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSAibnRlcnIuaCIKICNpbmNsdWRlICJyZmMxMDAycGR1LmgiCiAjaW5jbHVkZSAiY25fY2lmcy5oIgorI2luY2x1ZGUgImZzY2FjaGUuaCIKIAogI2RlZmluZSBDSUZTX1BPUlQgNDQ1CiAjZGVmaW5lIFJGQzEwMDFfUE9SVCAxMzkKQEAgLTY2LDYgKzY3LDcgQEAKIAljaGFyICppb2NoYXJzZXQ7ICAvKiBsb2NhbCBjb2RlIHBhZ2UgZm9yIG1hcHBpbmcgdG8gYW5kIGZyb20gVW5pY29kZSAqLwogCWNoYXIgc291cmNlX3JmYzEwMDFfbmFtZVsxNl07IC8qIG5ldGJpb3MgbmFtZSBvZiBjbGllbnQgKi8KIAljaGFyIHRhcmdldF9yZmMxMDAxX25hbWVbMTZdOyAvKiBuZXRiaW9zIG5hbWUgb2Ygc2VydmVyIGZvciBXaW45eC9NRSAqLworCXVpZF90IGNyZWRfdWlkOwogCXVpZF90IGxpbnV4X3VpZDsKIAlnaWRfdCBsaW51eF9naWQ7CiAJbW9kZV90IGZpbGVfbW9kZTsKQEAgLTk3LDYgKzk5LDcgQEAKIAlib29sIG5vYmxvY2tzbmQ6MTsKIAlib29sIG5vYXV0b3R1bmU6MTsKIAlib29sIG5vc3RyaWN0c3luYzoxOyAvKiBkbyBub3QgZm9yY2UgZXhwZW5zaXZlIFNNQmZsdXNoIG9uIGV2ZXJ5IHN5bmMgKi8KKwlib29sIGZzYzoxOwkvKiBlbmFibGUgZnNjYWNoZSAqLwogCXVuc2lnbmVkIGludCByc2l6ZTsKIAl1bnNpZ25lZCBpbnQgd3NpemU7CiAJYm9vbCBzb2Nrb3B0X3RjcF9ub2RlbGF5OjE7CkBAIC04MzAsNyArODMzLDggQEAKIAkvKiBudWxsIHRhcmdldCBuYW1lIGluZGljYXRlcyB0byB1c2UgKlNNQlNFUlZSIGRlZmF1bHQgY2FsbGVkIG5hbWUKIAkgICBpZiB3ZSBlbmQgdXAgc2VuZGluZyBSRkMxMDAxIHNlc3Npb24gaW5pdGlhbGl6ZSAqLwogCXZvbC0+dGFyZ2V0X3JmYzEwMDFfbmFtZVswXSA9IDA7Ci0Jdm9sLT5saW51eF91aWQgPSBjdXJyZW50X3VpZCgpOyAgLyogdXNlIGN1cnJlbnRfZXVpZCgpIGluc3RlYWQ/ICovCisJdm9sLT5jcmVkX3VpZCA9IGN1cnJlbnRfdWlkKCk7CisJdm9sLT5saW51eF91aWQgPSBjdXJyZW50X3VpZCgpOwogCXZvbC0+bGludXhfZ2lkID0gY3VycmVudF9naWQoKTsKIAogCS8qIGRlZmF1bHQgdG8gb25seSBhbGxvd2luZyB3cml0ZSBhY2Nlc3MgdG8gb3duZXIgb2YgdGhlIG1vdW50ICovCkBAIC0xMjU3LDYgKzEyNjEsMTIgQEAKIAkJfSBlbHNlIGlmICgoc3RybmljbXAoZGF0YSwgIm5vY2FzZSIsIDYpID09IDApIHx8CiAJCQkgICAoc3RybmljbXAoZGF0YSwgImlnbm9yZWNhc2UiLCAxMCkgID09IDApKSB7CiAJCQl2b2wtPm5vY2FzZSA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm1hbmQiLCA0KSA9PSAwKSB7CisJCQkvKiBpZ25vcmUgKi8KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9tYW5kIiwgNikgPT0gMCkgeworCQkJLyogaWdub3JlICovCisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIl9uZXRkZXYiLCA3KSA9PSAwKSB7CisJCQkvKiBpZ25vcmUgKi8KIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiYnJsIiwgMykgPT0gMCkgewogCQkJdm9sLT5ub2JybCA9ICAwOwogCQl9IGVsc2UgaWYgKChzdHJuaWNtcChkYXRhLCAibm9icmwiLCA1KSA9PSAwKSB8fApAQCAtMTMzMSw2ICsxMzQxLDggQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IE1vdW50IG9wdGlvbiBub2FjIG5vdCAiCiAJCQkJInN1cHBvcnRlZC4gSW5zdGVhZCBzZXQgIgogCQkJCSIvcHJvYy9mcy9jaWZzL0xvb2t1cENhY2hlRW5hYmxlZCB0byAwXG4iKTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZnNjIiwgMykgPT0gMCkgeworCQkJdm9sLT5mc2MgPSB0cnVlOwogCQl9IGVsc2UKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFVua25vd24gbW91bnQgb3B0aW9uICVzXG4iLAogCQkJCQkJZGF0YSk7CkBAIC0xMzgwLDE4ICsxMzkyLDkyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICoKLWNpZnNfZmluZF90Y3Bfc2Vzc2lvbihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgdW5zaWduZWQgc2hvcnQgaW50IHBvcnQpCitzdGF0aWMgYm9vbAorbWF0Y2hfYWRkcmVzcyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOworCisJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWlmIChhZGRyNC0+c2luX2FkZHIuc19hZGRyICE9CisJCSAgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYWRkcjQtPnNpbl9wb3J0ICYmCisJCSAgICBhZGRyNC0+c2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0KQorCQkJcmV0dXJuIGZhbHNlOworCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmYWRkcjYtPnNpbjZfYWRkciwKKwkJCQkgICAgICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfYWRkcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhZGRyNi0+c2luNl9zY29wZV9pZCAhPQorCQkgICAgc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3Njb3BlX2lkKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYWRkcjYtPnNpbjZfcG9ydCAmJgorCQkgICAgYWRkcjYtPnNpbjZfcG9ydCAhPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydCkKKwkJCXJldHVybiBmYWxzZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCittYXRjaF9zZWN1cml0eShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfdm9sICp2b2wpCit7CisJdW5zaWduZWQgaW50IHNlY0ZsYWdzOworCisJaWYgKHZvbC0+c2VjRmxnICYgKH4oQ0lGU1NFQ19NVVNUX1NJR04gfCBDSUZTU0VDX01VU1RfU0VBTCkpKQorCQlzZWNGbGFncyA9IHZvbC0+c2VjRmxnOworCWVsc2UKKwkJc2VjRmxhZ3MgPSBnbG9iYWxfc2VjZmxhZ3MgfCB2b2wtPnNlY0ZsZzsKKworCXN3aXRjaCAoc2VydmVyLT5zZWNUeXBlKSB7CisJY2FzZSBMQU5NQU46CisJCWlmICghKHNlY0ZsYWdzICYgKENJRlNTRUNfTUFZX0xBTk1BTnxDSUZTU0VDX01BWV9QTE5UWFQpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBOVExNdjI6CisJCWlmICghKHNlY0ZsYWdzICYgQ0lGU1NFQ19NQVlfTlRMTVYyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBOVExNOgorCQlpZiAoIShzZWNGbGFncyAmIENJRlNTRUNfTUFZX05UTE0pKQorCQkJcmV0dXJuIGZhbHNlOworCQlicmVhazsKKwljYXNlIEtlcmJlcm9zOgorCQlpZiAoIShzZWNGbGFncyAmIENJRlNTRUNfTUFZX0tSQjUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlicmVhazsKKwljYXNlIFJhd05UTE1TU1A6CisJCWlmICghKHNlY0ZsYWdzICYgQ0lGU1NFQ19NQVlfTlRMTVNTUCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIG5vdyBjaGVjayBpZiBzaWduaW5nIG1vZGUgaXMgYWNjZXB0aWJsZSAqLworCWlmICgoc2VjRmxhZ3MgJiBDSUZTU0VDX01BWV9TSUdOKSA9PSAwICYmCisJICAgIChzZXJ2ZXItPnNlY01vZGUgJiBTRUNNT0RFX1NJR05fUkVRVUlSRUQpKQorCQkJcmV0dXJuIGZhbHNlOworCWVsc2UgaWYgKCgoc2VjRmxhZ3MgJiBDSUZTU0VDX01VU1RfU0lHTikgPT0gQ0lGU1NFQ19NVVNUX1NJR04pICYmCisJCSAoc2VydmVyLT5zZWNNb2RlICYKKwkJICAoU0VDTU9ERV9TSUdOX0VOQUJMRUR8U0VDTU9ERV9TSUdOX1JFUVVJUkVEKSkgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqCitjaWZzX2ZpbmRfdGNwX3Nlc3Npb24oc3RydWN0IHNvY2thZGRyICphZGRyLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sKQorewogCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBhZGRyOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYWRkcjsKIAogCXdyaXRlX2xvY2soJmNpZnNfdGNwX3Nlc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNpZnNfdGNwX3Nlc19saXN0KSB7Ci0JCXNlcnZlciA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvLAotCQkJCSAgICB0Y3Bfc2VzX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2lmc190Y3Bfc2VzX2xpc3QsIHRjcF9zZXNfbGlzdCkgewogCQkvKgogCQkgKiB0aGUgZGVtdXggdGhyZWFkIGNhbiBleGl0IG9uIGl0cyBvd24gd2hpbGUgc3RpbGwgaW4gQ2lmc05ldwogCQkgKiBzbyBkb24ndCBhY2NlcHQgYW55IHNvY2tldHMgaW4gdGhhdCBzdGF0ZS4gU2luY2UgdGhlCkBAIC0xNDAxLDM3ICsxNDg3LDExIEBACiAJCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmV3KQogCQkJY29udGludWU7CiAKLQkJc3dpdGNoIChhZGRyLT5zc19mYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJaWYgKGFkZHI0LT5zaW5fYWRkci5zX2FkZHIgPT0KLQkJCSAgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKSB7Ci0JCQkJYWRkcjQtPnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCQkJLyogdXNlciBvdmVycm9kZSBkZWZhdWx0IHBvcnQ/ICovCi0JCQkJaWYgKGFkZHI0LT5zaW5fcG9ydCkgewotCQkJCQlpZiAoYWRkcjQtPnNpbl9wb3J0ICE9Ci0JCQkJCSAgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UKLQkJCQljb250aW51ZTsKKwkJaWYgKCFtYXRjaF9hZGRyZXNzKHNlcnZlciwgYWRkcikpCisJCQljb250aW51ZTsKIAotCQljYXNlIEFGX0lORVQ2OgotCQkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmYWRkcjYtPnNpbjZfYWRkciwKLQkJCSAgICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2FkZHIpICYmCi0JCQkgICAgKGFkZHI2LT5zaW42X3Njb3BlX2lkID09Ci0JCQkgICAgc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3Njb3BlX2lkKSkgewotCQkJCWFkZHI2LT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKLQkJCQkvKiB1c2VyIG92ZXJyb2RlIGRlZmF1bHQgcG9ydD8gKi8KLQkJCQlpZiAoYWRkcjYtPnNpbjZfcG9ydCkgewotCQkJCQlpZiAoYWRkcjYtPnNpbjZfcG9ydCAhPQotCQkJCQkgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gZWxzZQotCQkJCWNvbnRpbnVlOwotCQl9CisJCWlmICghbWF0Y2hfc2VjdXJpdHkoc2VydmVyLCB2b2wpKQorCQkJY29udGludWU7CiAKIAkJKytzZXJ2ZXItPnNydl9jb3VudDsKIAkJd3JpdGVfdW5sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CkBAIC0xNDYwLDYgKzE1MjAsOCBAQAogCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc0V4aXRpbmc7CiAJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAorCWNpZnNfZnNjYWNoZV9yZWxlYXNlX2NsaWVudF9jb29raWUoc2VydmVyKTsKKwogCXRhc2sgPSB4Y2hnKCZzZXJ2ZXItPnRzaywgTlVMTCk7CiAJaWYgKHRhc2spCiAJCWZvcmNlX3NpZyhTSUdLSUxMLCB0YXNrKTsKQEAgLTE0NzksNyArMTU0MSw5IEBACiAJY0ZZSSgxLCAiVU5DOiAlcyBpcDogJXMiLCB2b2x1bWVfaW5mby0+VU5DLCB2b2x1bWVfaW5mby0+VU5DaXApOwogCiAJaWYgKHZvbHVtZV9pbmZvLT5VTkNpcCAmJiB2b2x1bWVfaW5mby0+VU5DKSB7Ci0JCXJjID0gY2lmc19jb252ZXJ0X2FkZHJlc3Modm9sdW1lX2luZm8tPlVOQ2lwLCAmYWRkcik7CisJCXJjID0gY2lmc19maWxsX3NvY2thZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwKKwkJCQkJdm9sdW1lX2luZm8tPlVOQ2lwLAorCQkJCQl2b2x1bWVfaW5mby0+cG9ydCk7CiAJCWlmICghcmMpIHsKIAkJCS8qIHdlIGZhaWxlZCB0cmFuc2xhdGluZyBhZGRyZXNzICovCiAJCQlyYyA9IC1FSU5WQUw7CkBAIC0xNDk5LDcgKzE1NjMsNyBAQAogCX0KIAogCS8qIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBtYXRjaGluZyB0Y3Bfc2VzICovCi0JdGNwX3NlcyA9IGNpZnNfZmluZF90Y3Bfc2Vzc2lvbigmYWRkciwgdm9sdW1lX2luZm8tPnBvcnQpOworCXRjcF9zZXMgPSBjaWZzX2ZpbmRfdGNwX3Nlc3Npb24oKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCB2b2x1bWVfaW5mbyk7CiAJaWYgKHRjcF9zZXMpCiAJCXJldHVybiB0Y3Bfc2VzOwogCkBAIC0xNTQzLDEyICsxNjA3LDEwIEBACiAJCWNGWUkoMSwgImF0dGVtcHRpbmcgaXB2NiBjb25uZWN0Iik7CiAJCS8qIEJCIHNob3VsZCB3ZSBhbGxvdyBpcHY2IG9uIHBvcnQgMTM5PyAqLwogCQkvKiBvdGhlciBPUyBuZXZlciBvYnNlcnZlZCBpbiBXaWxkIGRvaW5nIDEzOSB3aXRoIHY2ICovCi0JCXNpbl9zZXJ2ZXI2LT5zaW42X3BvcnQgPSBodG9ucyh2b2x1bWVfaW5mby0+cG9ydCk7CiAJCW1lbWNweSgmdGNwX3Nlcy0+YWRkci5zb2NrQWRkcjYsIHNpbl9zZXJ2ZXI2LAogCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKIAkJcmMgPSBpcHY2X2Nvbm5lY3QodGNwX3Nlcyk7CiAJfSBlbHNlIHsKLQkJc2luX3NlcnZlci0+c2luX3BvcnQgPSBodG9ucyh2b2x1bWVfaW5mby0+cG9ydCk7CiAJCW1lbWNweSgmdGNwX3Nlcy0+YWRkci5zb2NrQWRkciwgc2luX3NlcnZlciwKIAkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKIAkJcmMgPSBpcHY0X2Nvbm5lY3QodGNwX3Nlcyk7CkBAIC0xNTc3LDYgKzE2MzksOCBAQAogCWxpc3RfYWRkKCZ0Y3Bfc2VzLT50Y3Bfc2VzX2xpc3QsICZjaWZzX3RjcF9zZXNfbGlzdCk7CiAJd3JpdGVfdW5sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CiAKKwljaWZzX2ZzY2FjaGVfZ2V0X2NsaWVudF9jb29raWUodGNwX3Nlcyk7CisKIAlyZXR1cm4gdGNwX3NlczsKIAogb3V0X2VycjoKQEAgLTE1OTEsMTcgKzE2NTUsMjcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjaWZzU2VzSW5mbyAqCi1jaWZzX2ZpbmRfc21iX3NlcyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKnVzZXJuYW1lKQorY2lmc19maW5kX3NtYl9zZXMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlczsKIAogCXdyaXRlX2xvY2soJmNpZnNfdGNwX3Nlc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnNlcnZlci0+c21iX3Nlc19saXN0KSB7Ci0JCXNlcyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Nlc0luZm8sIHNtYl9zZXNfbGlzdCk7Ci0JCWlmIChzdHJuY21wKHNlcy0+dXNlck5hbWUsIHVzZXJuYW1lLCBNQVhfVVNFUk5BTUVfU0laRSkpCi0JCQljb250aW51ZTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VzLCAmc2VydmVyLT5zbWJfc2VzX2xpc3QsIHNtYl9zZXNfbGlzdCkgeworCQlzd2l0Y2ggKHNlcnZlci0+c2VjVHlwZSkgeworCQljYXNlIEtlcmJlcm9zOgorCQkJaWYgKHZvbC0+Y3JlZF91aWQgIT0gc2VzLT5jcmVkX3VpZCkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogYW55dGhpbmcgZWxzZSB0YWtlcyB1c2VybmFtZS9wYXNzd29yZCAqLworCQkJaWYgKHN0cm5jbXAoc2VzLT51c2VyTmFtZSwgdm9sLT51c2VybmFtZSwKKwkJCQkgICAgTUFYX1VTRVJOQU1FX1NJWkUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHN0cmxlbih2b2wtPnVzZXJuYW1lKSAhPSAwICYmCisJCQkgICAgc3RybmNtcChzZXMtPnBhc3N3b3JkLCB2b2wtPnBhc3N3b3JkLAorCQkJCSAgICBNQVhfUEFTU1dPUkRfU0laRSkpCisJCQkJY29udGludWU7CisJCX0KIAkJKytzZXMtPnNlc19jb3VudDsKIAkJd3JpdGVfdW5sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CiAJCXJldHVybiBzZXM7CkBAIC0xNjQzLDcgKzE3MTcsNyBAQAogCiAJeGlkID0gR2V0WGlkKCk7CiAKLQlzZXMgPSBjaWZzX2ZpbmRfc21iX3NlcyhzZXJ2ZXIsIHZvbHVtZV9pbmZvLT51c2VybmFtZSk7CisJc2VzID0gY2lmc19maW5kX3NtYl9zZXMoc2VydmVyLCB2b2x1bWVfaW5mbyk7CiAJaWYgKHNlcykgewogCQljRllJKDEsICJFeGlzdGluZyBzbWIgc2VzcyBmb3VuZCAoc3RhdHVzPSVkKSIsIHNlcy0+c3RhdHVzKTsKIApAQCAtMTcwNiw2ICsxNzgwLDcgQEAKIAkJaWYgKHNlcy0+ZG9tYWluTmFtZSkKIAkJCXN0cmNweShzZXMtPmRvbWFpbk5hbWUsIHZvbHVtZV9pbmZvLT5kb21haW5uYW1lKTsKIAl9CisJc2VzLT5jcmVkX3VpZCA9IHZvbHVtZV9pbmZvLT5jcmVkX3VpZDsKIAlzZXMtPmxpbnV4X3VpZCA9IHZvbHVtZV9pbmZvLT5saW51eF91aWQ7CiAJc2VzLT5vdmVycmlkZVNlY0ZsZyA9IHZvbHVtZV9pbmZvLT5zZWNGbGc7CiAKQEAgLTE3NzMsNiArMTg0OCw3IEBACiAJQ0lGU1NNQlREaXMoeGlkLCB0Y29uKTsKIAlfRnJlZVhpZCh4aWQpOwogCisJY2lmc19mc2NhY2hlX3JlbGVhc2Vfc3VwZXJfY29va2llKHRjb24pOwogCXRjb25JbmZvRnJlZSh0Y29uKTsKIAljaWZzX3B1dF9zbWJfc2VzKHNlcyk7CiB9CkBAIC0xODQzLDYgKzE5MTksOCBAQAogCWxpc3RfYWRkKCZ0Y29uLT50Y29uX2xpc3QsICZzZXMtPnRjb25fbGlzdCk7CiAJd3JpdGVfdW5sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CiAKKwljaWZzX2ZzY2FjaGVfZ2V0X3N1cGVyX2Nvb2tpZSh0Y29uKTsKKwogCXJldHVybiB0Y29uOwogCiBvdXRfZmFpbDoKQEAgLTIzOTcsNiArMjQ3NSw4IEBACiAJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfT1ZFUlJfR0lEOwogCWlmIChwdm9sdW1lX2luZm8tPmR5bnBlcm0pCiAJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfRFlOUEVSTTsKKwlpZiAocHZvbHVtZV9pbmZvLT5mc2MpCisJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfRlNDQUNIRTsKIAlpZiAocHZvbHVtZV9pbmZvLT5kaXJlY3RfaW8pIHsKIAkJY0ZZSSgxLCAibW91bnRpbmcgc2hhcmUgdXNpbmcgZGlyZWN0IGkvbyIpOwogCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PSBDSUZTX01PVU5UX0RJUkVDVF9JTzsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IGU3YWU3OGIuLmE3ZGU1ZTkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMTMwLDEyICsxMzAsNiBAQAogCXJldHVybiBmdWxsX3BhdGg7CiB9CiAKLS8qCi0gKiBXaGVuIGNhbGxlZCB3aXRoIHN0cnVjdCBmaWxlIHBvaW50ZXIgc2V0IHRvIE5VTEwsIHRoZXJlIGlzIG5vIHdheSB3ZSBjb3VsZAotICogdXBkYXRlIGZpbGUtPnByaXZhdGVfZGF0YSwgYnV0IGdldHRpbmcgaXQgc3R1Y2sgb24gb3BlbkZpbGVMaXN0IHByb3ZpZGVzIGEKLSAqIHdheSB0byBhY2Nlc3MgaXQgZnJvbSBjaWZzX2ZpbGxfZmlsZWRhdGEgYW5kIHRoZXJlYnkgc2V0IGZpbGUtPnByaXZhdGVfZGF0YQotICogZnJvbSBjaWZzX29wZW4uCi0gKi8KIHN0cnVjdCBjaWZzRmlsZUluZm8gKgogY2lmc19uZXdfZmlsZWluZm8oc3RydWN0IGlub2RlICpuZXdpbm9kZSwgX191MTYgZmlsZUhhbmRsZSwKIAkJICBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZmc21vdW50ICptbnQsIHVuc2lnbmVkIGludCBvZmxhZ3MpCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Ruc19yZXNvbHZlLmMgYi9mcy9jaWZzL2Ruc19yZXNvbHZlLmMKaW5kZXggNDkzMTVjYi4uM2FkN2Y0MyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9kbnNfcmVzb2x2ZS5jCisrKyBiL2ZzL2NpZnMvZG5zX3Jlc29sdmUuYwpAQCAtNDQsNyArNDQsNyBAQAogewogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOwogCi0JcmV0dXJuIGNpZnNfY29udmVydF9hZGRyZXNzKG5hbWUsICZzcyk7CisJcmV0dXJuIGNpZnNfY29udmVydF9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmc3MsIG5hbWUpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yMjcsNyArMjI3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIF9fZXhpdCBjaWZzX2V4aXRfZG5zX3Jlc29sdmVyKHZvaWQpCit2b2lkIGNpZnNfZXhpdF9kbnNfcmVzb2x2ZXIodm9pZCkKIHsKIAlrZXlfcmV2b2tlKGRuc19yZXNvbHZlcl9jYWNoZS0+dGhyZWFkX2tleXJpbmcpOwogCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX2Ruc19yZXNvbHZlcik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Ruc19yZXNvbHZlLmggYi9mcy9jaWZzL2Ruc19yZXNvbHZlLmgKaW5kZXggMjZiOWVhYS4uNWQ3ZjI5MSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9kbnNfcmVzb2x2ZS5oCisrKyBiL2ZzL2NpZnMvZG5zX3Jlc29sdmUuaApAQCAtMjUsNyArMjUsNyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogZXh0ZXJuIGludCBfX2luaXQgY2lmc19pbml0X2Ruc19yZXNvbHZlcih2b2lkKTsKLWV4dGVybiB2b2lkIF9fZXhpdCBjaWZzX2V4aXRfZG5zX3Jlc29sdmVyKHZvaWQpOworZXh0ZXJuIHZvaWQgY2lmc19leGl0X2Ruc19yZXNvbHZlcih2b2lkKTsKIGV4dGVybiBpbnQgZG5zX3Jlc29sdmVfc2VydmVyX25hbWVfdG9faXAoY29uc3QgY2hhciAqdW5jLCBjaGFyICoqaXBfYWRkcik7CiAjZW5kaWYgLyogS0VSTkVMICovCiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggNDA5ZTRmNS4uZmEwNGEwMGQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgogI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJmc2NhY2hlLmgiCiAKIHN0YXRpYyBpbmxpbmUgaW50IGNpZnNfY29udmVydF9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CkBAIC0yODIsNiArMjgzLDkgQEAKIAkJCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOwogCQkJCXJjID0gLUVOT01FTTsKIAkJCX0KKworCQkJY2lmc19mc2NhY2hlX3NldF9pbm9kZV9jb29raWUoaW5vZGUsIGZpbGUpOworCiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIGlmICgocmMgPT0gLUVJTlZBTCkgfHwgKHJjID09IC1FT1BOT1RTVVBQKSkgewogCQkJaWYgKHRjb24tPnNlcy0+c2VydmVyTk9TKQpAQCAtMzczLDYgKzM3Nyw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWNpZnNfZnNjYWNoZV9zZXRfaW5vZGVfY29va2llKGlub2RlLCBmaWxlKTsKKwogCWlmIChvcGxvY2sgJiBDSUZTX0NSRUFURV9BQ1RJT04pIHsKIAkJLyogdGltZSB0byBzZXQgbW9kZSB3aGljaCB3ZSBjYW4gbm90IHNldCBlYXJsaWVyIGR1ZSB0bwogCQkgICBwcm9ibGVtcyBjcmVhdGluZyBuZXcgcmVhZC1vbmx5IGZpbGVzICovCkBAIC00MjcsNyArNDMzLDcgQEAKIAlfX3UxNiBuZXRmaWQ7CiAKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKQotCQlwQ2lmc0ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJcENpZnNGaWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWVsc2UKIAkJcmV0dXJuIC1FQkFERjsKIApAQCAtNTY1LDggKzU3MSw3IEBACiAJaW50IHhpZCwgdGltZW91dDsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOwotCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBTTUJGaWxlID0KLQkJKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqcFNNQkZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtNjQxLDggKzY0Niw3IEBACiB7CiAJaW50IHJjID0gMDsKIAlpbnQgeGlkOwotCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDRmlsZVN0cnVjdCA9Ci0JICAgIChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDRmlsZVN0cnVjdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyICpwdG1wOwogCiAJY0ZZSSgxLCAiQ2xvc2VkaXIgaW5vZGUgPSAweCVwIiwgaW5vZGUpOwpAQCAtODYzLDggKzg2Nyw3IEBACiAJCQkJICAgICAgbGVuZ3RoLCBwZkxvY2ssCiAJCQkJICAgICAgcG9zaXhfbG9ja190eXBlLCB3YWl0X2ZsYWcpOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBjaWZzRmlsZUluZm8gKmZpZCA9Ci0JCQkoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc3RydWN0IGNpZnNGaWxlSW5mbyAqZmlkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJCWlmIChudW1Mb2NrKSB7CiAJCQlyYyA9IENJRlNTTUJMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCBsZW5ndGgsCkBAIC05NjUsNyArOTY4LDcgQEAKIAogCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQkFERjsKLQlvcGVuX2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJb3Blbl9maWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJcmMgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCBwb2Zmc2V0LCAmd3JpdGVfc2l6ZSwgMCk7CiAJaWYgKHJjKQpAQCAtMTA2Nyw3ICsxMDcwLDcgQEAKIAogCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQkFERjsKLQlvcGVuX2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlvcGVuX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtMTY1MSw4ICsxNjU0LDcgQEAKIAlpbnQgeGlkOwogCWludCByYyA9IDA7CiAJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsKLQlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpzbWJmaWxlID0KLQkJKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqc21iZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCXhpZCA9IEdldFhpZCgpOwpAQCAtMTc1Niw3ICsxNzU4LDcgQEAKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gcmM7CiAJfQotCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCW9wZW5fZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkpCiAJCWNGWUkoMSwgImF0dGVtcHRpbmcgcmVhZCBvbiB3cml0ZSBvbmx5IGZpbGUgaW5zdGFuY2UiKTsKQEAgLTE4MzcsNyArMTgzOSw3IEBACiAJCUZyZWVYaWQoeGlkKTsKIAkJcmV0dXJuIHJjOwogCX0KLQlvcGVuX2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlvcGVuX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKQogCQljRllJKDEsICJhdHRlbXB0aW5nIHJlYWQgb24gd3JpdGUgb25seSBmaWxlIGluc3RhbmNlIik7CkBAIC0xOTQyLDYgKzE5NDQsOSBAQAogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlkYXRhICs9IFBBR0VfQ0FDSEVfU0laRTsKKworCQkvKiBhZGQgcGFnZSB0byBGUy1DYWNoZSAqLworCQljaWZzX3JlYWRwYWdlX3RvX2ZzY2FjaGUobWFwcGluZy0+aG9zdCwgcGFnZSk7CiAJfQogCXJldHVybjsKIH0KQEAgLTE5NjgsMTAgKzE5NzMsMTkgQEAKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gcmM7CiAJfQotCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCW9wZW5fZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3NiKTsKIAlwVGNvbiA9IGNpZnNfc2ItPnRjb247CiAKKwkvKgorCSAqIFJlYWRzIGFzIG1hbnkgcGFnZXMgYXMgcG9zc2libGUgZnJvbSBmc2NhY2hlLiBSZXR1cm5zIC1FTk9CVUZTCisJICogaW1tZWRpYXRlbHkgaWYgdGhlIGNvb2tpZSBpcyBuZWdhdGl2ZQorCSAqLworCXJjID0gY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKG1hcHBpbmctPmhvc3QsIG1hcHBpbmcsIHBhZ2VfbGlzdCwKKwkJCQkJICZudW1fcGFnZXMpOworCWlmIChyYyA9PSAwKQorCQlnb3RvIHJlYWRfY29tcGxldGU7CisKIAljRllJKERCRzIsICJycGFnZXM6IG51bSBwYWdlcyAlZCIsIG51bV9wYWdlcyk7CiAJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKSB7CiAJCXVuc2lnbmVkIGNvbnRpZ19wYWdlczsKQEAgLTIwODIsNiArMjA5Niw3IEBACiAJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOwogCX0KIAorcmVhZF9jb21wbGV0ZToKIAlGcmVlWGlkKHhpZCk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMjA5Miw2ICsyMTA3LDExIEBACiAJY2hhciAqcmVhZF9kYXRhOwogCWludCByYzsKIAorCS8qIElzIHRoZSBwYWdlIGNhY2hlZD8gKi8KKwlyYyA9IGNpZnNfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIHBhZ2UpOworCWlmIChyYyA9PSAwKQorCQlnb3RvIHJlYWRfY29tcGxldGU7CisKIAlwYWdlX2NhY2hlX2dldChwYWdlKTsKIAlyZWFkX2RhdGEgPSBrbWFwKHBhZ2UpOwogCS8qIGZvciByZWFkcyBvdmVyIGEgY2VydGFpbiBzaXplIGNvdWxkIGluaXRpYXRlIGFzeW5jIHJlYWQgYWhlYWQgKi8KQEAgLTIxMTEsMTEgKzIxMzEsMTcgQEAKIAogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKworCS8qIHNlbmQgdGhpcyBwYWdlIHRvIHRoZSBjYWNoZSAqLworCWNpZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBwYWdlKTsKKwogCXJjID0gMDsKIAogaW9fZXJyb3I6CiAJa3VubWFwKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworcmVhZF9jb21wbGV0ZToKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIyNjUsNiArMjI5MSwyMiBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBjaWZzX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwKQoreworCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2lmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShwYWdlLCBnZnApOworfQorCitzdGF0aWMgdm9pZCBjaWZzX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCisJaWYgKG9mZnNldCA9PSAwKQorCQljaWZzX2ZzY2FjaGVfaW52YWxpZGF0ZV9wYWdlKHBhZ2UsICZjaWZzaS0+dmZzX2lub2RlKTsKK30KKwogc3RhdGljIHZvaWQKIGNpZnNfb3Bsb2NrX2JyZWFrKHN0cnVjdCBzbG93X3dvcmsgKndvcmspCiB7CkBAIC0yMzM4LDYgKzIzODAsOCBAQAogCS53cml0ZV9iZWdpbiA9IGNpZnNfd3JpdGVfYmVnaW4sCiAJLndyaXRlX2VuZCA9IGNpZnNfd3JpdGVfZW5kLAogCS5zZXRfcGFnZV9kaXJ0eSA9IF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzLAorCS5yZWxlYXNlcGFnZSA9IGNpZnNfcmVsZWFzZV9wYWdlLAorCS5pbnZhbGlkYXRlcGFnZSA9IGNpZnNfaW52YWxpZGF0ZV9wYWdlLAogCS8qIC5zeW5jX3BhZ2UgPSBjaWZzX3N5bmNfcGFnZSwgKi8KIAkvKiAuZGlyZWN0X0lPID0gKi8KIH07CkBAIC0yMzU0LDYgKzIzOTgsOCBAQAogCS53cml0ZV9iZWdpbiA9IGNpZnNfd3JpdGVfYmVnaW4sCiAJLndyaXRlX2VuZCA9IGNpZnNfd3JpdGVfZW5kLAogCS5zZXRfcGFnZV9kaXJ0eSA9IF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzLAorCS5yZWxlYXNlcGFnZSA9IGNpZnNfcmVsZWFzZV9wYWdlLAorCS5pbnZhbGlkYXRlcGFnZSA9IGNpZnNfaW52YWxpZGF0ZV9wYWdlLAogCS8qIC5zeW5jX3BhZ2UgPSBjaWZzX3N5bmNfcGFnZSwgKi8KIAkvKiAuZGlyZWN0X0lPID0gKi8KIH07CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZzY2FjaGUuYyBiL2ZzL2NpZnMvZnNjYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmM2Y1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2ZzY2FjaGUuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqICAgZnMvY2lmcy9mc2NhY2hlLmMgLSBDSUZTIGZpbGVzeXN0ZW0gY2FjaGUgaW50ZXJmYWNlCisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMTAgTm92ZWxsLCBJbmMuCisgKiAgIEF1dGhvcihzKTogU3VyZXNoIEpheWFyYW1hbiAoc2pheWFyYW1hbkBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlICJmc2NhY2hlLmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc19mc19zYi5oIgorCit2b2lkIGNpZnNfZnNjYWNoZV9nZXRfY2xpZW50X2Nvb2tpZShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJc2VydmVyLT5mc2NhY2hlID0KKwkJZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZShjaWZzX2ZzY2FjaGVfbmV0ZnMucHJpbWFyeV9pbmRleCwKKwkJCQkmY2lmc19mc2NhY2hlX3NlcnZlcl9pbmRleF9kZWYsIHNlcnZlcik7CisJY0ZZSSgxLCAiQ0lGUzogZ2V0IGNsaWVudCBjb29raWUgKDB4JXAvMHglcCkiLCBzZXJ2ZXIsCisJCQkJc2VydmVyLT5mc2NhY2hlKTsKK30KKwordm9pZCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9jbGllbnRfY29va2llKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKK3sKKwljRllJKDEsICJDSUZTOiByZWxlYXNlIGNsaWVudCBjb29raWUgKDB4JXAvMHglcCkiLCBzZXJ2ZXIsCisJCQkJc2VydmVyLT5mc2NhY2hlKTsKKwlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHNlcnZlci0+ZnNjYWNoZSwgMCk7CisJc2VydmVyLT5mc2NhY2hlID0gTlVMTDsKK30KKwordm9pZCBjaWZzX2ZzY2FjaGVfZ2V0X3N1cGVyX2Nvb2tpZShzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uKQoreworCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHRjb24tPnNlcy0+c2VydmVyOworCisJdGNvbi0+ZnNjYWNoZSA9CisJCWZzY2FjaGVfYWNxdWlyZV9jb29raWUoc2VydmVyLT5mc2NhY2hlLAorCQkJCSZjaWZzX2ZzY2FjaGVfc3VwZXJfaW5kZXhfZGVmLCB0Y29uKTsKKwljRllJKDEsICJDSUZTOiBnZXQgc3VwZXJibG9jayBjb29raWUgKDB4JXAvMHglcCkiLAorCQkJCXNlcnZlci0+ZnNjYWNoZSwgdGNvbi0+ZnNjYWNoZSk7Cit9CisKK3ZvaWQgY2lmc19mc2NhY2hlX3JlbGVhc2Vfc3VwZXJfY29va2llKHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24pCit7CisJY0ZZSSgxLCAiQ0lGUzogcmVsZWFzaW5nIHN1cGVyYmxvY2sgY29va2llICgweCVwKSIsIHRjb24tPmZzY2FjaGUpOworCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUodGNvbi0+ZnNjYWNoZSwgMCk7CisJdGNvbi0+ZnNjYWNoZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNpZnNfZnNjYWNoZV9lbmFibGVfaW5vZGVfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKGlub2RlKTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisKKwlpZiAoY2lmc2ktPmZzY2FjaGUpCisJCXJldHVybjsKKworCWNpZnNpLT5mc2NhY2hlID0gZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZShjaWZzX3NiLT50Y29uLT5mc2NhY2hlLAorCQkJCSZjaWZzX2ZzY2FjaGVfaW5vZGVfb2JqZWN0X2RlZiwKKwkJCQljaWZzaSk7CisJY0ZZSSgxLCAiQ0lGUzogZ290IEZIIGNvb2tpZSAoMHglcC8weCVwKSIsCisJCQljaWZzX3NiLT50Y29uLT5mc2NhY2hlLCBjaWZzaS0+ZnNjYWNoZSk7Cit9CisKK3ZvaWQgY2lmc19mc2NhY2hlX3JlbGVhc2VfaW5vZGVfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKGlub2RlKTsKKworCWlmIChjaWZzaS0+ZnNjYWNoZSkgeworCQljRllJKDEsICJDSUZTIHJlbGVhc2luZyBpbm9kZSBjb29raWUgKDB4JXApIiwKKwkJCQljaWZzaS0+ZnNjYWNoZSk7CisJCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUoY2lmc2ktPmZzY2FjaGUsIDApOworCQljaWZzaS0+ZnNjYWNoZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBjaWZzX2ZzY2FjaGVfZGlzYWJsZV9pbm9kZV9jb29raWUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBDSUZTX0koaW5vZGUpOworCisJaWYgKGNpZnNpLT5mc2NhY2hlKSB7CisJCWNGWUkoMSwgIkNJRlMgZGlzYWJsaW5nIGlub2RlIGNvb2tpZSAoMHglcCkiLAorCQkJCWNpZnNpLT5mc2NhY2hlKTsKKwkJZnNjYWNoZV9yZWxpbnF1aXNoX2Nvb2tpZShjaWZzaS0+ZnNjYWNoZSwgMSk7CisJCWNpZnNpLT5mc2NhY2hlID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgY2lmc19mc2NhY2hlX3NldF9pbm9kZV9jb29raWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkKKwkJY2lmc19mc2NhY2hlX2Rpc2FibGVfaW5vZGVfY29va2llKGlub2RlKTsKKwllbHNlIHsKKwkJY2lmc19mc2NhY2hlX2VuYWJsZV9pbm9kZV9jb29raWUoaW5vZGUpOworCQljRllJKDEsICJDSUZTOiBmc2NhY2hlIGlub2RlIGNvb2tpZSBzZXQiKTsKKwl9Cit9CisKK3ZvaWQgY2lmc19mc2NhY2hlX3Jlc2V0X2lub2RlX2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IENJRlNfSShpbm9kZSk7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqb2xkID0gY2lmc2ktPmZzY2FjaGU7CisKKwlpZiAoY2lmc2ktPmZzY2FjaGUpIHsKKwkJLyogcmV0aXJlIHRoZSBjdXJyZW50IGZzY2FjaGUgY2FjaGUgYW5kIGdldCBhIG5ldyBvbmUgKi8KKwkJZnNjYWNoZV9yZWxpbnF1aXNoX2Nvb2tpZShjaWZzaS0+ZnNjYWNoZSwgMSk7CisKKwkJY2lmc2ktPmZzY2FjaGUgPSBmc2NhY2hlX2FjcXVpcmVfY29va2llKGNpZnNfc2ItPnRjb24tPmZzY2FjaGUsCisJCQkJCSZjaWZzX2ZzY2FjaGVfaW5vZGVfb2JqZWN0X2RlZiwKKwkJCQkJY2lmc2kpOworCQljRllJKDEsICJDSUZTOiBuZXcgY29va2llIDB4JXAgb2xkY29va2llIDB4JXAiLAorCQkJCWNpZnNpLT5mc2NhY2hlLCBvbGQpOworCX0KK30KKworaW50IGNpZnNfZnNjYWNoZV9yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IGdmcCkKK3sKKwlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IENJRlNfSShpbm9kZSk7CisKKwkJY0ZZSSgxLCAiQ0lGUzogZnNjYWNoZSByZWxlYXNlIHBhZ2UgKDB4JXAvMHglcCkiLAorCQkJCXBhZ2UsIGNpZnNpLT5mc2NhY2hlKTsKKwkJaWYgKCFmc2NhY2hlX21heWJlX3JlbGVhc2VfcGFnZShjaWZzaS0+ZnNjYWNoZSwgcGFnZSwgZ2ZwKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjaWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZV9jb21wbGV0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqY3R4LAorCQkJCQkJaW50IGVycm9yKQoreworCWNGWUkoMSwgIkNGUzogcmVhZHBhZ2VfZnJvbV9mc2NhY2hlX2NvbXBsZXRlICgweCVwLyVkKSIsCisJCQlwYWdlLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworfQorCisvKgorICogUmV0cmlldmUgYSBwYWdlIGZyb20gRlMtQ2FjaGUKKyAqLworaW50IF9fY2lmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaW50IHJldDsKKworCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZShmc2M6JXAsIHA6JXAsIGk6MHglcCIsCisJCQlDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCBwYWdlLCBpbm9kZSk7CisJcmV0ID0gZnNjYWNoZV9yZWFkX29yX2FsbG9jX3BhZ2UoQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgcGFnZSwKKwkJCQkJIGNpZnNfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlX2NvbXBsZXRlLAorCQkJCQkgTlVMTCwKKwkJCQkJIEdGUF9LRVJORUwpOworCXN3aXRjaCAocmV0KSB7CisKKwljYXNlIDA6IC8qIHBhZ2UgZm91bmQgaW4gZnNjYWNoZSwgcmVhZCBzdWJtaXR0ZWQgKi8KKwkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VfZnJvbV9mc2NhY2hlOiBzdWJtaXR0ZWQiKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIC1FTk9CVUZTOgkvKiBwYWdlIHdvbid0IGJlIGNhY2hlZCAqLworCWNhc2UgLUVOT0RBVEE6CS8qIHBhZ2Ugbm90IGluIGNhY2hlICovCisJCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZSAlZCIsIHJldCk7CisJCXJldHVybiAxOworCisJZGVmYXVsdDoKKwkJY0VSUk9SKDEsICJ1bmtub3duIGVycm9yIHJldCA9ICVkIiwgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJldHJpZXZlIGEgc2V0IG9mIHBhZ2VzIGZyb20gRlMtQ2FjaGUKKyAqLworaW50IF9fY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsCisJCQkJdW5zaWduZWQgKm5yX3BhZ2VzKQoreworCWludCByZXQ7CisKKwljRllJKDEsICJDSUZTOiBfX2NpZnNfcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZSAoMHglcC8ldS8weCVwKSIsCisJCQlDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCAqbnJfcGFnZXMsIGlub2RlKTsKKwlyZXQgPSBmc2NhY2hlX3JlYWRfb3JfYWxsb2NfcGFnZXMoQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgbWFwcGluZywKKwkJCQkJICBwYWdlcywgbnJfcGFnZXMsCisJCQkJCSAgY2lmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGVfY29tcGxldGUsCisJCQkJCSAgTlVMTCwKKwkJCQkJICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoJLyogcmVhZCBzdWJtaXR0ZWQgdG8gdGhlIGNhY2hlIGZvciBhbGwgcGFnZXMgKi8KKwkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZTogc3VibWl0dGVkIik7CisJCXJldHVybiByZXQ7CisKKwljYXNlIC1FTk9CVUZTOgkvKiBzb21lIHBhZ2VzIGFyZSBub3QgY2FjaGVkIGFuZCBjYW4ndCBiZSAqLworCWNhc2UgLUVOT0RBVEE6CS8qIHNvbWUgcGFnZXMgYXJlIG5vdCBjYWNoZWQgKi8KKwkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZTogbm8gcGFnZSIpOworCQlyZXR1cm4gMTsKKworCWRlZmF1bHQ6CisJCWNGWUkoMSwgInVua25vd24gZXJyb3IgcmV0ID0gJWQiLCByZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX19jaWZzX3JlYWRwYWdlX3RvX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaW50IHJldDsKKworCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX3RvX2ZzY2FjaGUoZnNjOiAlcCwgcDogJXAsIGk6ICVwIiwKKwkJCUNJRlNfSShpbm9kZSktPmZzY2FjaGUsIHBhZ2UsIGlub2RlKTsKKwlyZXQgPSBmc2NhY2hlX3dyaXRlX3BhZ2UoQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgcGFnZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCAhPSAwKQorCQlmc2NhY2hlX3VuY2FjaGVfcGFnZShDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCBwYWdlKTsKK30KKwordm9pZCBfX2NpZnNfZnNjYWNoZV9pbnZhbGlkYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKGlub2RlKTsKKwlzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSA9IGNpZnNpLT5mc2NhY2hlOworCisJY0ZZSSgxLCAiQ0lGUzogZnNjYWNoZSBpbnZhbGlkYXRlcGFnZSAoMHglcC8weCVwKSIsIHBhZ2UsIGNvb2tpZSk7CisJZnNjYWNoZV93YWl0X29uX3BhZ2Vfd3JpdGUoY29va2llLCBwYWdlKTsKKwlmc2NhY2hlX3VuY2FjaGVfcGFnZShjb29raWUsIHBhZ2UpOworfQorCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZzY2FjaGUuaCBiL2ZzL2NpZnMvZnNjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjg4ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9mc2NhY2hlLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiAgIGZzL2NpZnMvZnNjYWNoZS5oIC0gQ0lGUyBmaWxlc3lzdGVtIGNhY2hlIGludGVyZmFjZSBkZWZpbml0aW9ucworICoKKyAqICAgQ29weXJpZ2h0IChjKSAyMDEwIE5vdmVsbCwgSW5jLgorICogICBBdXRob3JzKHMpOiBTdXJlc2ggSmF5YXJhbWFuIChzamF5YXJhbWFuQHN1c2UuZGU+CisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfQ0lGU19GU0NBQ0hFX0gKKyNkZWZpbmUgX0NJRlNfRlNDQUNIRV9ICisKKyNpbmNsdWRlIDxsaW51eC9mc2NhY2hlLmg+CisKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorCisjaWZkZWYgQ09ORklHX0NJRlNfRlNDQUNIRQorCitleHRlcm4gc3RydWN0IGZzY2FjaGVfbmV0ZnMgY2lmc19mc2NhY2hlX25ldGZzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmc2NhY2hlX2Nvb2tpZV9kZWYgY2lmc19mc2NhY2hlX3NlcnZlcl9pbmRleF9kZWY7CitleHRlcm4gY29uc3Qgc3RydWN0IGZzY2FjaGVfY29va2llX2RlZiBjaWZzX2ZzY2FjaGVfc3VwZXJfaW5kZXhfZGVmOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmc2NhY2hlX2Nvb2tpZV9kZWYgY2lmc19mc2NhY2hlX2lub2RlX29iamVjdF9kZWY7CisKK2V4dGVybiBpbnQgY2lmc19mc2NhY2hlX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgY2lmc19mc2NhY2hlX3VucmVnaXN0ZXIodm9pZCk7CisKKy8qCisgKiBmc2NhY2hlLmMKKyAqLworZXh0ZXJuIHZvaWQgY2lmc19mc2NhY2hlX2dldF9jbGllbnRfY29va2llKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKik7CitleHRlcm4gdm9pZCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9jbGllbnRfY29va2llKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKik7CitleHRlcm4gdm9pZCBjaWZzX2ZzY2FjaGVfZ2V0X3N1cGVyX2Nvb2tpZShzdHJ1Y3QgY2lmc1Rjb25JbmZvICopOworZXh0ZXJuIHZvaWQgY2lmc19mc2NhY2hlX3JlbGVhc2Vfc3VwZXJfY29va2llKHN0cnVjdCBjaWZzVGNvbkluZm8gKik7CisKK2V4dGVybiB2b2lkIGNpZnNfZnNjYWNoZV9yZWxlYXNlX2lub2RlX2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBjaWZzX2ZzY2FjaGVfc2V0X2lub2RlX2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitleHRlcm4gdm9pZCBjaWZzX2ZzY2FjaGVfcmVzZXRfaW5vZGVfY29va2llKHN0cnVjdCBpbm9kZSAqKTsKKworZXh0ZXJuIHZvaWQgX19jaWZzX2ZzY2FjaGVfaW52YWxpZGF0ZV9wYWdlKHN0cnVjdCBwYWdlICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgY2lmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwKTsKK2V4dGVybiBpbnQgX19jaWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IF9fY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKHN0cnVjdCBpbm9kZSAqLAorCQkJCQkgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwKKwkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKiwKKwkJCQkJIHVuc2lnbmVkICopOworCitleHRlcm4gdm9pZCBfX2NpZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWZzX2ZzY2FjaGVfaW52YWxpZGF0ZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpCisJCV9fY2lmc19mc2NhY2hlX2ludmFsaWRhdGVfcGFnZShwYWdlLCBpbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNpZnNfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKENJRlNfSShpbm9kZSktPmZzY2FjaGUpCisJCXJldHVybiBfX2NpZnNfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlKGlub2RlLCBwYWdlKTsKKworCXJldHVybiAtRU5PQlVGUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywKKwkJCQkJICAgICAgdW5zaWduZWQgKm5yX3BhZ2VzKQoreworCWlmIChDSUZTX0koaW5vZGUpLT5mc2NhY2hlKQorCQlyZXR1cm4gX19jaWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUoaW5vZGUsIG1hcHBpbmcsIHBhZ2VzLAorCQkJCQkJICAgICBucl9wYWdlcyk7CisJcmV0dXJuIC1FTk9CVUZTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2lmc19yZWFkcGFnZV90b19mc2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpCisJCV9fY2lmc19yZWFkcGFnZV90b19mc2NhY2hlKGlub2RlLCBwYWdlKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0NJRlNfRlNDQUNIRSAqLworc3RhdGljIGlubGluZSBpbnQgY2lmc19mc2NhY2hlX3JlZ2lzdGVyKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWZzX2ZzY2FjaGVfdW5yZWdpc3Rlcih2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NpZnNfZnNjYWNoZV9nZXRfY2xpZW50X2Nvb2tpZShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQKK2NpZnNfZnNjYWNoZV9yZWxlYXNlX2NsaWVudF9jb29raWUoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGNpZnNfZnNjYWNoZV9nZXRfc3VwZXJfY29va2llKHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24pIHt9CitzdGF0aWMgaW5saW5lIHZvaWQKK2NpZnNfZnNjYWNoZV9yZWxlYXNlX3N1cGVyX2Nvb2tpZShzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2lmc19mc2NhY2hlX3JlbGVhc2VfaW5vZGVfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY2lmc19mc2NhY2hlX3NldF9pbm9kZV9jb29raWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlscCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWZzX2ZzY2FjaGVfcmVzZXRfaW5vZGVfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHt9CitzdGF0aWMgaW5saW5lIGludCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnApCit7CisJcmV0dXJuIDE7IC8qIE1heSByZWxlYXNlIHBhZ2UgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNpZnNfZnNjYWNoZV9pbnZhbGlkYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7fQorc3RhdGljIGlubGluZSBpbnQKK2NpZnNfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAtRU5PQlVGUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywKKwkJCQkJICAgICAgdW5zaWduZWQgKm5yX3BhZ2VzKQoreworCXJldHVybiAtRU5PQlVGUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNpZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJc3RydWN0IHBhZ2UgKnBhZ2UpIHt9CisKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19GU0NBQ0hFICovCisKKyNlbmRpZiAvKiBfQ0lGU19GU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwppbmRleCA2ZjA2ODNjLi5hMTViM2E5IDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgogI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJmc2NhY2hlLmgiCiAKIAogc3RhdGljIHZvaWQgY2lmc19zZXRfb3BzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGJvb2wgaXNfZGZzX3JlZmVycmFsKQpAQCAtMjg4LDcgKzI4OSw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24gPSBjaWZzX3NiLT50Y29uOwotCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKikgZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJeGlkID0gR2V0WGlkKCk7CiAJcmMgPSBDSUZTU01CVW5peFFGaWxlSW5mbyh4aWQsIHRjb24sIGNmaWxlLT5uZXRmaWQsICZmaW5kX2RhdGEpOwpAQCAtNTE1LDcgKzUxNiw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24gPSBjaWZzX3NiLT50Y29uOwotCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKikgZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJeGlkID0gR2V0WGlkKCk7CiAJcmMgPSBDSUZTU01CUUZpbGVJbmZvKHhpZCwgdGNvbiwgY2ZpbGUtPm5ldGZpZCwgJmZpbmRfZGF0YSk7CkBAIC03MjMsOSArNzI0LDE0IEBACiB7CiAJc3RydWN0IGNpZnNfZmF0dHIgKmZhdHRyID0gKHN0cnVjdCBjaWZzX2ZhdHRyICopIG9wYXF1ZTsKIAorCS8qIGRvbid0IG1hdGNoIGlub2RlIHdpdGggZGlmZmVyZW50IHVuaXF1ZWlkICovCiAJaWYgKENJRlNfSShpbm9kZSktPnVuaXF1ZWlkICE9IGZhdHRyLT5jZl91bmlxdWVpZCkKIAkJcmV0dXJuIDA7CiAKKwkvKiBkb24ndCBtYXRjaCBpbm9kZSBvZiBkaWZmZXJlbnQgdHlwZSAqLworCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKGZhdHRyLT5jZl9tb2RlICYgU19JRk1UKSkKKwkJcmV0dXJuIDA7CisKIAkvKgogCSAqIHVoIG9oIC0tIGl0J3MgYSBkaXJlY3RvcnkuIFdlIGNhbid0IHVzZSBpdCBzaW5jZSBoYXJkbGlua2VkIGRpcnMgYXJlCiAJICogdmVyYm90ZW4uIERpc2FibGUgc2VydmVyaW5vIGFuZCByZXR1cm4gaXQgYXMgaWYgaXQgd2VyZSBmb3VuZCwgdGhlCkBAIC03NzYsNiArNzgyLDEwIEBACiAJCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUUgfCBTX05PQ01USU1FOwogCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewogCQkJaW5vZGUtPmlfaW5vID0gaGFzaDsKKyNpZmRlZiBDT05GSUdfQ0lGU19GU0NBQ0hFCisJCQkvKiBpbml0aWFsaXplIHBlci1pbm9kZSBjYWNoZSBjb29raWUgcG9pbnRlciAqLworCQkJQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSA9IE5VTEw7CisjZW5kaWYKIAkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCQl9CiAJfQpAQCAtODA3LDYgKzgxNywxMSBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCisjaWZkZWYgQ09ORklHX0NJRlNfRlNDQUNIRQorCS8qIHBvcHVsYXRlIHRjb24tPnJlc291cmNlX2lkICovCisJY2lmc19zYi0+dGNvbi0+cmVzb3VyY2VfaWQgPSBDSUZTX0koaW5vZGUpLT51bmlxdWVpZDsKKyNlbmRpZgorCiAJaWYgKHJjICYmIGNpZnNfc2ItPnRjb24tPmlwYykgewogCQljRllJKDEsICJpcGMgY29ubmVjdGlvbiAtIGZha2UgcmVhZCBpbm9kZSIpOwogCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7CkBAIC0xNTY4LDYgKzE1ODMsNyBAQAogCQkJY2lmc19pLT53cml0ZV9iZWhpbmRfcmMgPSByYzsKIAl9CiAJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOworCWNpZnNfZnNjYWNoZV9yZXNldF9pbm9kZV9jb29raWUoaW5vZGUpOwogfQogCiBpbnQgY2lmc19yZXZhbGlkYXRlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHApCmRpZmYgLS1naXQgYS9mcy9jaWZzL2lvY3RsLmMgYi9mcy9jaWZzL2lvY3RsLmMKaW5kZXggNTA1OTI2Zi4uOWQzOGE3MSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9pb2N0bC5jCisrKyBiL2ZzL2NpZnMvaW9jdGwuYwpAQCAtNDEsOCArNDEsNyBAQAogCV9fdTY0CUV4dEF0dHJNYXNrID0gMDsKIAlfX3U2NCAgIGNhcHM7CiAJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsKLQlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwU01CRmlsZSA9Ci0JCShzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwU01CRmlsZSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7CiAjZW5kaWYgLyogQ09ORklHX0NJRlNfUE9TSVggKi8KIAogCXhpZCA9IEdldFhpZCgpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9uZXRtaXNjLmMgYi9mcy9jaWZzL25ldG1pc2MuYwppbmRleCBkMzVkNTI4Li5jNjcyMWVlIDEwMDY0NAotLS0gYS9mcy9jaWZzL25ldG1pc2MuYworKysgYi9mcy9jaWZzL25ldG1pc2MuYwpAQCAtNjEsNiArNjEsNyBAQAogCXtFUlJyZW1jZCwgLUVBQ0NFU30sCiAJe0VSUmRpZmZkZXZpY2UsIC1FWERFVn0sCiAJe0VSUm5vZmlsZXMsIC1FTk9FTlR9LAorCXtFUlJ3cml0ZXByb3QsIC1FUk9GU30sCiAJe0VSUmJhZHNoYXJlLCAtRVRYVEJTWX0sCiAJe0VSUmxvY2ssIC1FQUNDRVN9LAogCXtFUlJ1bnN1cCwgLUVJTlZBTH0sCkBAIC0xNjQsNyArMTY1LDcgQEAKICAqIFJldHVybnMgMCBvbiBmYWlsdXJlLgogICovCiBpbnQKLWNpZnNfY29udmVydF9hZGRyZXNzKGNoYXIgKnNyYywgdm9pZCAqZHN0KQorY2lmc19jb252ZXJ0X2FkZHJlc3Moc3RydWN0IHNvY2thZGRyICpkc3QsIGNoYXIgKnNyYykKIHsKIAlpbnQgcmM7CiAJY2hhciAqcGN0LCAqZW5kcDsKQEAgLTIwMSw2ICsyMDIsMjcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludAorY2lmc19maWxsX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqZHN0LCBjaGFyICpzcmMsCisJCSAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCBwb3J0KQoreworCWlmICghY2lmc19jb252ZXJ0X2FkZHJlc3MoZHN0LCBzcmMpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZHN0LT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCSgoc3RydWN0IHNvY2thZGRyX2luICopZHN0KS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopZHN0KS0+c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGNvbnZlcnQgYSBOVCBzdGF0dXMgY29kZSB0byBhIGRvcyBjbGFzcy9jb2RlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IGRhZjE3NTMuLmQ1ZTU5MWYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC04NDcsNiArODQ3LDExIEBACiAJCWVuZF9vZl9zbWIgPSBjaWZzRmlsZS0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0ICsgbWF4X2xlbjsKIAogCQl0bXBfYnVmID0ga21hbGxvYyhVTklDT0RFX05BTUVfTUFYLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRtcF9idWYgPT0gTlVMTCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwogCQlmb3IgKGkgPSAwOyAoaSA8IG51bV90b19maWxsKSAmJiAocmMgPT0gMCk7IGkrKykgewogCQkJaWYgKGN1cnJlbnRfZW50cnkgPT0gTlVMTCkgewogCQkJCS8qIGV2YWx1YXRlIHdoZXRoZXIgdGhpcyBjYXNlIGlzIGFuIGVycm9yICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVyci5oIGIvZnMvY2lmcy9zbWJlcnIuaAppbmRleCBjNTA4NGQyLi43ZjE2Y2I4IDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYmVyci5oCisrKyBiL2ZzL2NpZnMvc21iZXJyLmgKQEAgLTc2LDYgKzc2LDcgQEAKICNkZWZpbmUgRVJSbm9maWxlcwkJMTgJLyogQSBGaWxlIFNlYXJjaCBjb21tYW5kIGNhbiBmaW5kIG5vCiAJCQkJCSAgIG1vcmUgZmlsZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZAogCQkJCQkgICBjcml0ZXJpYS4gKi8KKyNkZWZpbmUgRVJSd3JpdGVwcm90CQkxOQkvKiBtZWRpYSBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KICNkZWZpbmUgRVJSZ2VuZXJhbAkJMzEKICNkZWZpbmUgRVJSYmFkc2hhcmUJCTMyCS8qIFRoZSBzaGFyaW5nIG1vZGUgc3BlY2lmaWVkIGZvciBhbgogCQkJCQkgICBPcGVuIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIEZJRHMgb24KZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNjQ5MGQyMS4uYzZmZGE5YSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTgsNyArOCw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgIEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQogICogIENvcHlyaWdodCAoQykgMTk5OCAgICAgICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAotICogIENvcHlyaWdodCAoQykgMjAwMyAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICAgICAgIFBhdmVsIE1hY2hlayAocGF2ZWxAdWN3LmN6KQogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCmRpZmYgLS1naXQgYS9mcy9jb21wYXRfaW9jdGwuYyBiL2ZzL2NvbXBhdF9pb2N0bC5jCmluZGV4IDY0MTY0MGQuLjYzYWU4NTggMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdF9pb2N0bC5jCisrKyBiL2ZzL2NvbXBhdF9pb2N0bC5jCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgIEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQogICogQ29weXJpZ2h0IChDKSAxOTk4ICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKICAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICBBbmRpIEtsZWVuLCBTdVNFIExhYnMgCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgICAgICAgUGF2ZWwgTWFjaGVrIChwYXZlbEBzdXNlLmN6KQorICogQ29weXJpZ2h0IChDKSAyMDAzICAgICAgIFBhdmVsIE1hY2hlayAocGF2ZWxAdWN3LmN6KQogICoKICAqIFRoZXNlIHJvdXRpbmVzIG1haW50YWluIGFyZ3VtZW50IHNpemUgY29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdAogICogaW9jdGxzLgpAQCAtNjAxLDggKzYwMSwxMSBAQAogfQogCiAvKiBCbHVldG9vdGggaW9jdGxzICovCi0jZGVmaW5lIEhDSVVBUlRTRVRQUk9UTwlfSU9XKCdVJywgMjAwLCBpbnQpCi0jZGVmaW5lIEhDSVVBUlRHRVRQUk9UTwlfSU9SKCdVJywgMjAxLCBpbnQpCisjZGVmaW5lIEhDSVVBUlRTRVRQUk9UTwkJX0lPVygnVScsIDIwMCwgaW50KQorI2RlZmluZSBIQ0lVQVJUR0VUUFJPVE8JCV9JT1IoJ1UnLCAyMDEsIGludCkKKyNkZWZpbmUgSENJVUFSVEdFVERFVklDRQlfSU9SKCdVJywgMjAyLCBpbnQpCisjZGVmaW5lIEhDSVVBUlRTRVRGTEFHUwkJX0lPVygnVScsIDIwMywgaW50KQorI2RlZmluZSBIQ0lVQVJUR0VURkxBR1MJCV9JT1IoJ1UnLCAyMDQsIGludCkKIAogI2RlZmluZSBCTkVQQ09OTkFERAlfSU9XKCdCJywgMjAwLCBpbnQpCiAjZGVmaW5lIEJORVBDT05OREVMCV9JT1coJ0InLCAyMDEsIGludCkKQEAgLTEzMjgsNiArMTMzMSw4IEBACiBDT01QQVRJQkxFX0lPQ1RMKEhDSVNFVExJTktNT0RFKQogQ09NUEFUSUJMRV9JT0NUTChIQ0lTRVRBQ0xNVFUpCiBDT01QQVRJQkxFX0lPQ1RMKEhDSVNFVFNDT01UVSkKK0NPTVBBVElCTEVfSU9DVEwoSENJQkxPQ0tBRERSKQorQ09NUEFUSUJMRV9JT0NUTChIQ0lVTkJMT0NLQUREUikKIENPTVBBVElCTEVfSU9DVEwoSENJSU5RVUlSWSkKIENPTVBBVElCTEVfSU9DVEwoSENJVUFSVFNFVFBST1RPKQogQ09NUEFUSUJMRV9JT0NUTChIQ0lVQVJUR0VUUFJPVE8pCmRpZmYgLS1naXQgYS9mcy9kaXJlY3QtaW8uYyBiL2ZzL2RpcmVjdC1pby5jCmluZGV4IDc2MDBhYWMuLmExMGNiOTEgMTAwNjQ0Ci0tLSBhL2ZzL2RpcmVjdC1pby5jCisrKyBiL2ZzL2RpcmVjdC1pby5jCkBAIC0yMTgsNyArMjE4LDcgQEAKICAqIGZpbGVzeXN0ZW1zIGNhbiB1c2UgaXQgdG8gaG9sZCBhZGRpdGlvbmFsIHN0YXRlIGJldHdlZW4gZ2V0X2Jsb2NrIGNhbGxzIGFuZAogICogZGlvX2NvbXBsZXRlLgogICovCi1zdGF0aWMgaW50IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIGxvZmZfdCBvZmZzZXQsIGludCByZXQpCitzdGF0aWMgaW50IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIGxvZmZfdCBvZmZzZXQsIGludCByZXQsIGJvb2wgaXNfYXN5bmMpCiB7CiAJc3NpemVfdCB0cmFuc2ZlcnJlZCA9IDA7CiAKQEAgLTIzOSwxNCArMjM5LDYgQEAKIAkJCXRyYW5zZmVycmVkID0gZGlvLT5pX3NpemUgLSBvZmZzZXQ7CiAJfQogCi0JaWYgKGRpby0+ZW5kX2lvICYmIGRpby0+cmVzdWx0KQotCQlkaW8tPmVuZF9pbyhkaW8tPmlvY2IsIG9mZnNldCwgdHJhbnNmZXJyZWQsCi0JCQkgICAgZGlvLT5tYXBfYmguYl9wcml2YXRlKTsKLQotCWlmIChkaW8tPmZsYWdzICYgRElPX0xPQ0tJTkcpCi0JCS8qIGxvY2tkZXA6IG5vbi1vd25lciByZWxlYXNlICovCi0JCXVwX3JlYWRfbm9uX293bmVyKCZkaW8tPmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0KIAlpZiAocmV0ID09IDApCiAJCXJldCA9IGRpby0+cGFnZV9lcnJvcnM7CiAJaWYgKHJldCA9PSAwKQpAQCAtMjU0LDYgKzI0NiwxNyBAQAogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gdHJhbnNmZXJyZWQ7CiAKKwlpZiAoZGlvLT5lbmRfaW8gJiYgZGlvLT5yZXN1bHQpIHsKKwkJZGlvLT5lbmRfaW8oZGlvLT5pb2NiLCBvZmZzZXQsIHRyYW5zZmVycmVkLAorCQkJICAgIGRpby0+bWFwX2JoLmJfcHJpdmF0ZSwgcmV0LCBpc19hc3luYyk7CisJfSBlbHNlIGlmIChpc19hc3luYykgeworCQlhaW9fY29tcGxldGUoZGlvLT5pb2NiLCByZXQsIDApOworCX0KKworCWlmIChkaW8tPmZsYWdzICYgRElPX0xPQ0tJTkcpCisJCS8qIGxvY2tkZXA6IG5vbi1vd25lciByZWxlYXNlICovCisJCXVwX3JlYWRfbm9uX293bmVyKCZkaW8tPmlub2RlLT5pX2FsbG9jX3NlbSk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNzcsOCArMjgwLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CiAKIAlpZiAocmVtYWluaW5nID09IDApIHsKLQkJaW50IHJldCA9IGRpb19jb21wbGV0ZShkaW8sIGRpby0+aW9jYi0+a2lfcG9zLCAwKTsKLQkJYWlvX2NvbXBsZXRlKGRpby0+aW9jYiwgcmV0LCAwKTsKKwkJZGlvX2NvbXBsZXRlKGRpbywgZGlvLT5pb2NiLT5raV9wb3MsIDAsIHRydWUpOwogCQlrZnJlZShkaW8pOwogCX0KIH0KQEAgLTExMjYsNyArMTEyOCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwogCiAJaWYgKHJldDIgPT0gMCkgewotCQlyZXQgPSBkaW9fY29tcGxldGUoZGlvLCBvZmZzZXQsIHJldCk7CisJCXJldCA9IGRpb19jb21wbGV0ZShkaW8sIG9mZnNldCwgcmV0LCBmYWxzZSk7CiAJCWtmcmVlKGRpbyk7CiAJfSBlbHNlCiAJCUJVR19PTihyZXQgIT0gLUVJT0NCUVVFVUVEKTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2NyeXB0by5jIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKaW5kZXggMWNjMDg3Ni4uYTJlM2I1NiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKKysrIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKQEAgLTc2Miw3ICs3NjIsNyBAQAogCiAvKioKICAqIGVjcnlwdGZzX2luaXRfY3J5cHRfY3R4Ci0gKiBAY3J5cHRfc3RhdDogVW5pbml0aWxpemVkIGNyeXB0IHN0YXRzIHN0cnVjdHVyZQorICogQGNyeXB0X3N0YXQ6IFVuaW5pdGlhbGl6ZWQgY3J5cHQgc3RhdHMgc3RydWN0dXJlCiAgKgogICogSW5pdGlhbGl6ZSB0aGUgY3J5cHRvIGNvbnRleHQuCiAgKgpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMgYi9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYwppbmRleCAyZDhkYmNlLi40NmM0ZGQ4IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYworKysgYi9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYwpAQCAtMzEsOSArMzEsOSBAQAogCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKmVjcnlwdGZzX2RhZW1vbl9oYXNoOwogc3RydWN0IG11dGV4IGVjcnlwdGZzX2RhZW1vbl9oYXNoX211eDsKLXN0YXRpYyBpbnQgZWNyeXB0ZnNfaGFzaF9idWNrZXRzOworc3RhdGljIGludCBlY3J5cHRmc19oYXNoX2JpdHM7CiAjZGVmaW5lIGVjcnlwdGZzX3VpZF9oYXNoKHVpZCkgXAotICAgICAgICBoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpdWlkLCBlY3J5cHRmc19oYXNoX2J1Y2tldHMpCisgICAgICAgIGhhc2hfbG9uZygodW5zaWduZWQgbG9uZyl1aWQsIGVjcnlwdGZzX2hhc2hfYml0cykKIAogc3RhdGljIHUzMiBlY3J5cHRmc19tc2dfY291bnRlcjsKIHN0YXRpYyBzdHJ1Y3QgZWNyeXB0ZnNfbXNnX2N0eCAqZWNyeXB0ZnNfbXNnX2N0eF9hcnI7CkBAIC00ODYsMTggKzQ4NiwxOSBAQAogCX0KIAltdXRleF9pbml0KCZlY3J5cHRmc19kYWVtb25faGFzaF9tdXgpOwogCW11dGV4X2xvY2soJmVjcnlwdGZzX2RhZW1vbl9oYXNoX211eCk7Ci0JZWNyeXB0ZnNfaGFzaF9idWNrZXRzID0gMTsKLQl3aGlsZSAoZWNyeXB0ZnNfbnVtYmVyX29mX3VzZXJzID4+IGVjcnlwdGZzX2hhc2hfYnVja2V0cykKLQkJZWNyeXB0ZnNfaGFzaF9idWNrZXRzKys7CisJZWNyeXB0ZnNfaGFzaF9iaXRzID0gMTsKKwl3aGlsZSAoZWNyeXB0ZnNfbnVtYmVyX29mX3VzZXJzID4+IGVjcnlwdGZzX2hhc2hfYml0cykKKwkJZWNyeXB0ZnNfaGFzaF9iaXRzKys7CiAJZWNyeXB0ZnNfZGFlbW9uX2hhc2ggPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpCi0JCQkJCSogZWNyeXB0ZnNfaGFzaF9idWNrZXRzKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSogKDEgPDwgZWNyeXB0ZnNfaGFzaF9iaXRzKSksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmICghZWNyeXB0ZnNfZGFlbW9uX2hhc2gpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCW11dGV4X3VubG9jaygmZWNyeXB0ZnNfZGFlbW9uX2hhc2hfbXV4KTsKIAkJZ290byBvdXQ7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBlY3J5cHRmc19oYXNoX2J1Y2tldHM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgZWNyeXB0ZnNfaGFzaF9iaXRzKTsgaSsrKQogCQlJTklUX0hMSVNUX0hFQUQoJmVjcnlwdGZzX2RhZW1vbl9oYXNoW2ldKTsKIAltdXRleF91bmxvY2soJmVjcnlwdGZzX2RhZW1vbl9oYXNoX211eCk7CiAJZWNyeXB0ZnNfbXNnX2N0eF9hcnIgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGVjcnlwdGZzX21zZ19jdHgpCkBAIC01NTQsNyArNTU1LDcgQEAKIAkJaW50IGk7CiAKIAkJbXV0ZXhfbG9jaygmZWNyeXB0ZnNfZGFlbW9uX2hhc2hfbXV4KTsKLQkJZm9yIChpID0gMDsgaSA8IGVjcnlwdGZzX2hhc2hfYnVja2V0czsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBlY3J5cHRmc19oYXNoX2JpdHMpOyBpKyspIHsKIAkJCWludCByYzsKIAogCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZGFlbW9uLCBlbGVtLApkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IGUxOWRlNmEuLjk3ZDkxYTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTY1Myw2ICs2NTMsNyBAQAogCWVsc2UKIAkJc3RhY2tfYmFzZSA9IHZtYS0+dm1fc3RhcnQgLSBzdGFja19leHBhbmQ7CiAjZW5kaWYKKwljdXJyZW50LT5tbS0+c3RhcnRfc3RhY2sgPSBicHJtLT5wOwogCXJldCA9IGV4cGFuZF9zdGFjayh2bWEsIHN0YWNrX2Jhc2UpOwogCWlmIChyZXQpCiAJCXJldCA9IC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IDM3NzMwOWMuLmJmMDI5YzcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0yOTM3LDcgKzI5MzcsNyBAQAogICogT25lIG9mIG1vcmUgaW5kZXggYmxvY2tzIG1heWJlIG5lZWRlZCBpZiB0aGUgZXh0ZW50IHRyZWUgZ3JvdyBhZnRlcgogICogdGhlIHVuaW50aWFsaXplZCBleHRlbnQgc3BsaXQuIFRvIHByZXZlbnQgRU5PU1BDIG9jY3VyIGF0IHRoZSBJTwogICogY29tcGxldGUsIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHVuaW5pdGlhbGl6ZWQgZXh0ZW50IGJlZm9yZSBESU8gc3VibWl0Ci0gKiB0aGUgSU8uIFRoZSB1bmluaXRpbGl6ZWQgZXh0ZW50IGNhbGxlZCBhdCB0aGlzIHRpbWUgd2lsbCBiZSBzcGxpdAorICogdGhlIElPLiBUaGUgdW5pbml0aWFsaXplZCBleHRlbnQgY2FsbGVkIGF0IHRoaXMgdGltZSB3aWxsIGJlIHNwbGl0CiAgKiBpbnRvIHRocmVlIHVuaW5pdGlhbGl6ZWQgZXh0ZW50KGF0IG1vc3QpLiBBZnRlciBJTyBjb21wbGV0ZSwgdGhlIHBhcnQKICAqIGJlaW5nIGZpbGxlZCB3aWxsIGJlIGNvbnZlcnQgdG8gaW5pdGlhbGl6ZWQgYnkgdGhlIGVuZF9pbyBjYWxsYmFjayBmdW5jdGlvbgogICogdmlhIGV4dDRfY29udmVydF91bndyaXR0ZW5fZXh0ZW50cygpLgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDQyMjcyZDYuLjBhZmM4YzEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTM3NzUsNyArMzc3NSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGV4dDRfZW5kX2lvX2RpbyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvZmZfdCBvZmZzZXQsCi0JCQkgICAgc3NpemVfdCBzaXplLCB2b2lkICpwcml2YXRlKQorCQkJICAgIHNzaXplX3Qgc2l6ZSwgdm9pZCAqcHJpdmF0ZSwgaW50IHJldCwKKwkJCSAgICBib29sIGlzX2FzeW5jKQogewogICAgICAgICBleHQ0X2lvX2VuZF90ICppb19lbmQgPSBpb2NiLT5wcml2YXRlOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKQEAgLTM3ODQsNyArMzc4NSw3IEBACiAKIAkvKiBpZiBub3QgYXN5bmMgZGlyZWN0IElPIG9yIGRpbyB3aXRoIDAgYnl0ZXMgd3JpdGUsIGp1c3QgcmV0dXJuICovCiAJaWYgKCFpb19lbmQgfHwgIXNpemUpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAlleHRfZGVidWcoImV4dDRfZW5kX2lvX2RpbygpOiBpb19lbmQgMHglcCIKIAkJICAiZm9yIGlub2RlICVsdSwgaW9jYiAweCVwLCBvZmZzZXQgJWxsdSwgc2l6ZSAlbGx1XG4iLApAQCAtMzc5NSw3ICszNzk2LDcgQEAKIAlpZiAoaW9fZW5kLT5mbGFnICE9IEVYVDRfSU9fVU5XUklUVEVOKXsKIAkJZXh0NF9mcmVlX2lvX2VuZChpb19lbmQpOwogCQlpb2NiLT5wcml2YXRlID0gTlVMTDsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAlpb19lbmQtPm9mZnNldCA9IG9mZnNldDsKQEAgLTM4MTIsNiArMzgxMyw5IEBACiAJbGlzdF9hZGRfdGFpbCgmaW9fZW5kLT5saXN0LCAmZWktPmlfY29tcGxldGVkX2lvX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CiAJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7CitvdXQ6CisJaWYgKGlzX2FzeW5jKQorCQlhaW9fY29tcGxldGUoaW9jYiwgcmV0LCAwKTsKIH0KIAogc3RhdGljIHZvaWQgZXh0NF9lbmRfaW9fYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggMTJiM2JjMC4uMGU4M2RmZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTI3MDQsNyArMjcwNCw3IEBACiAKIAogLyoKLSAqIENoZWNrIHF1b3RhIGFuZCBtYXJrIGNob29zZWQgc3BhY2UgKGFjLT5hY19iX2V4KSBub24tZnJlZSBpbiBiaXRtYXBzCisgKiBDaGVjayBxdW90YSBhbmQgbWFyayBjaG9zZW4gc3BhY2UgKGFjLT5hY19iX2V4KSBub24tZnJlZSBpbiBiaXRtYXBzCiAgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBjb2RlCiAgKi8KIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggNGU4OTgzYS4uZTcyZDMyMyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMzAxMCw3ICszMDEwLDcgQEAKIAlleHQ0X2V4dF9pbml0KHNiKTsKIAllcnIgPSBleHQ0X21iX2luaXQoc2IsIG5lZWRzX3JlY292ZXJ5KTsKIAlpZiAoZXJyKSB7Ci0JCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImZhaWxlZCB0byBpbml0YWxpemUgbWJhbGxvYyAoJWQpIiwKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgbWJhbGxvYyAoJWQpIiwKIAkJCSBlcnIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jCmluZGV4IDM0YmI3ZjcuLmNjY2FlYWQgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGUuYworKysgYi9mcy9maWxlLmMKQEAgLTE3OCw3ICsxNzgsNiBAQAogCWZkdC0+b3Blbl9mZHMgPSAoZmRfc2V0ICopZGF0YTsKIAlkYXRhICs9IG5yIC8gQklUU19QRVJfQllURTsKIAlmZHQtPmNsb3NlX29uX2V4ZWMgPSAoZmRfc2V0ICopZGF0YTsKLQlJTklUX1JDVV9IRUFEKCZmZHQtPnJjdSk7CiAJZmR0LT5uZXh0ID0gTlVMTDsKIAogCXJldHVybiBmZHQ7CkBAIC0zMTIsNyArMzExLDYgQEAKIAluZXdfZmR0LT5jbG9zZV9vbl9leGVjID0gKGZkX3NldCAqKSZuZXdmLT5jbG9zZV9vbl9leGVjX2luaXQ7CiAJbmV3X2ZkdC0+b3Blbl9mZHMgPSAoZmRfc2V0ICopJm5ld2YtPm9wZW5fZmRzX2luaXQ7CiAJbmV3X2ZkdC0+ZmQgPSAmbmV3Zi0+ZmRfYXJyYXlbMF07Ci0JSU5JVF9SQ1VfSEVBRCgmbmV3X2ZkdC0+cmN1KTsKIAluZXdfZmR0LT5uZXh0ID0gTlVMTDsKIAogCXNwaW5fbG9jaygmb2xkZi0+ZmlsZV9sb2NrKTsKQEAgLTQzMCw3ICs0MjgsNiBAQAogCQkuZmQJCT0gJmluaXRfZmlsZXMuZmRfYXJyYXlbMF0sCiAJCS5jbG9zZV9vbl9leGVjCT0gKGZkX3NldCAqKSZpbml0X2ZpbGVzLmNsb3NlX29uX2V4ZWNfaW5pdCwKIAkJLm9wZW5fZmRzCT0gKGZkX3NldCAqKSZpbml0X2ZpbGVzLm9wZW5fZmRzX2luaXQsCi0JCS5yY3UJCT0gUkNVX0hFQURfSU5JVCwKIAl9LAogCS5maWxlX2xvY2sJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChpbml0X3Rhc2suZmlsZV9sb2NrKSwKIH07CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKaW5kZXggMWU4YWY5My4uNTEzMmM5OSAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiB9CiAKIC8qKgotICogdnhmc19yZWFkX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0YWxpemUgZmlsZXN5c3RlbQorICogdnhmc19yZWFkX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0aWFsaXplIGZpbGVzeXN0ZW0KICAqIEBzYnA6CQlWRlMgc3VwZXJibG9jayAodG8gZmlsbCkKICAqIEBkcDoJCQlmcyBwcml2YXRlIG1vdW50IGRhdGEKICAqIEBzaWxlbnQ6CQlkbyBub3QgY29tcGxhaW4gbG91ZGx5IHdoZW4gc3RoIGlzIHdyb25nCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuYwppbmRleCAzY2RjNWY3Li40MzFiZTA3IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCisrKyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAJCSAgIGV4aXN0LiAgU28gaWYgcGVybWlzc2lvbnMgYXJlIHJldm9rZWQgdGhpcyB3b24ndCBiZQogCQkgICBub3RpY2VkIGltbWVkaWF0ZWx5LCBvbmx5IGFmdGVyIHRoZSBhdHRyaWJ1dGUKIAkJICAgdGltZW91dCBoYXMgZXhwaXJlZCAqLwotCX0gZWxzZSBpZiAobWFzayAmIE1BWV9BQ0NFU1MpIHsKKwl9IGVsc2UgaWYgKG1hc2sgJiAoTUFZX0FDQ0VTUyB8IE1BWV9DSERJUikpIHsKIAkJZXJyID0gZnVzZV9hY2Nlc3MoaW5vZGUsIG1hc2spOwogCX0gZWxzZSBpZiAoKG1hc2sgJiBNQVlfRVhFQykgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlpZiAoIShpbm9kZS0+aV9tb2RlICYgU19JWFVHTykpIHsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggOWY4YjUyNS4uNWU5NmNiZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTEzNiwxMCArMTM2LDcgQEAKIAlpZiAocmV0IDw9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBtcGFnZV93cml0ZXBhZ2UocGFnZSwgZ2ZzMl9nZXRfYmxvY2tfbm9hbGxvYywgd2JjKTsKLQlpZiAocmV0ID09IC1FQUdBSU4pCi0JCXJldCA9IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBnZnMyX2dldF9ibG9ja19ub2FsbG9jLCB3YmMpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIG5vYmhfd3JpdGVwYWdlKHBhZ2UsIGdmczJfZ2V0X2Jsb2NrX25vYWxsb2MsIHdiYyk7CiB9CiAKIC8qKgpAQCAtNjM3LDkgKzYzNCw3IEBACiAJCX0KIAl9CiAKLQllcnJvciA9IGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgbGVuLCAmYWxsb2NfcmVxdWlyZWQpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfdW5sb2NrOworCWFsbG9jX3JlcXVpcmVkID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgcG9zLCBsZW4pOwogCiAJaWYgKGFsbG9jX3JlcXVpcmVkIHx8IGdmczJfaXNfamRhdGEoaXApKQogCQlnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGlwLCBsZW4sICZkYXRhX2Jsb2NrcywgJmluZF9ibG9ja3MpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9ibWFwLmMgYi9mcy9nZnMyL2JtYXAuYwppbmRleCA4NGRhNjRiLi42ZjQ4MjgwIDEwMDY0NAotLS0gYS9mcy9nZnMyL2JtYXAuYworKysgYi9mcy9nZnMyL2JtYXAuYwpAQCAtMTA0MCw3ICsxMDQwLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkgewotCQl1NjQgZHNpemUgPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2lub2RlKTsKKwkJdTY0IGRzaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOwogCQlpcC0+aV9kaXNrc2l6ZSA9IHNpemU7CiAJCWlwLT5pX2lub2RlLmlfbXRpbWUgPSBpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7CkBAIC0xMjQ0LDEzICsxMjQ0LDEyIEBACiAgKiBAaXA6IHRoZSBmaWxlIGJlaW5nIHdyaXR0ZW4gdG8KICAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgdG8gd3JpdGUgdG8KICAqIEBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgd3JpdHRlbgotICogQGFsbG9jX3JlcXVpcmVkOiBzZXQgdG8gMSBpZiBhbiBhbGxvYyBpcyByZXF1aXJlZCwgMCBvdGhlcndpc2UKICAqCi0gKiBSZXR1cm5zOiBlcnJubworICogUmV0dXJuczogMSBpZiBhbiBhbGxvYyBpcyByZXF1aXJlZCwgMCBvdGhlcndpc2UKICAqLwogCiBpbnQgZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBvZmZzZXQsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgKmFsbG9jX3JlcXVpcmVkKQorCQkJICAgICAgdW5zaWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmg7CkBAIC0xMjU4LDI2ICsxMjU3LDIzIEBACiAJdTY0IGxibG9jaywgbGJsb2NrX3N0b3AsIHNpemU7CiAJdTY0IGVuZF9vZl9maWxlOwogCi0JKmFsbG9jX3JlcXVpcmVkID0gMDsKLQogCWlmICghbGVuKQogCQlyZXR1cm4gMDsKIAogCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApKSB7CiAJCWlmIChvZmZzZXQgKyBsZW4gPgogCQkgICAgc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKQotCQkJKmFsbG9jX3JlcXVpcmVkID0gMTsKKwkJCXJldHVybiAxOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkqYWxsb2NfcmVxdWlyZWQgPSAxOwogCXNoaWZ0ID0gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKIAlCVUdfT04oZ2ZzMl9pc19kaXIoaXApKTsKIAllbmRfb2ZfZmlsZSA9IChpcC0+aV9kaXNrc2l6ZSArIHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKSA+PiBzaGlmdDsKIAlsYmxvY2sgPSBvZmZzZXQgPj4gc2hpZnQ7CiAJbGJsb2NrX3N0b3AgPSAob2Zmc2V0ICsgbGVuICsgc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIDEpID4+IHNoaWZ0OwogCWlmIChsYmxvY2tfc3RvcCA+IGVuZF9vZl9maWxlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE7CiAKIAlzaXplID0gKGxibG9ja19zdG9wIC0gbGJsb2NrKSA8PCBzaGlmdDsKIAlkbyB7CkBAIC0xMjg1LDEyICsxMjgxLDExIEBACiAJCWJoLmJfc2l6ZSA9IHNpemU7CiAJCWdmczJfYmxvY2tfbWFwKCZpcC0+aV9pbm9kZSwgbGJsb2NrLCAmYmgsIDApOwogCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJmJoKSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIDE7CiAJCXNpemUgLT0gYmguYl9zaXplOwogCQlsYmxvY2sgKz0gKGJoLmJfc2l6ZSA+PiBpcC0+aV9pbm9kZS5pX2Jsa2JpdHMpOwogCX0gd2hpbGUoc2l6ZSA+IDApOwogCi0JKmFsbG9jX3JlcXVpcmVkID0gMDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9ibWFwLmggYi9mcy9nZnMyL2JtYXAuaAppbmRleCBjOTgzMTc3Li5hMjBhNTIxIDEwMDY0NAotLS0gYS9mcy9nZnMyL2JtYXAuaAorKysgYi9mcy9nZnMyL2JtYXAuaApAQCAtNTIsNiArNTIsNiBAQAogaW50IGdmczJfdHJ1bmNhdGVpX3Jlc3VtZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogaW50IGdmczJfZmlsZV9kZWFsbG9jKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiBpbnQgZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBvZmZzZXQsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgKmFsbG9jX3JlcXVpcmVkKTsKKwkJCSAgICAgIHVuc2lnbmVkIGludCBsZW4pOwogCiAjZW5kaWYgLyogX19CTUFQX0RPVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGlyLmMgYi9mcy9nZnMyL2Rpci5jCmluZGV4IDI2Y2EzMzYuLmI5ZGQ4OGEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZGlyLmMKKysrIGIvZnMvZ2ZzMi9kaXIuYwpAQCAtOTU1LDcgKzk1NSwxMiBAQAogCS8qIENoYW5nZSB0aGUgcG9pbnRlcnMuCiAJICAgRG9uJ3QgYm90aGVyIGRpc3Rpbmd1aXNoaW5nIHN0dWZmZWQgZnJvbSBub24tc3R1ZmZlZC4KIAkgICBUaGlzIGNvZGUgaXMgY29tcGxpY2F0ZWQgZW5vdWdoIGFscmVhZHkuICovCi0JbHAgPSBrbWFsbG9jKGhhbGZfbGVuICogc2l6ZW9mKF9fYmU2NCksIEdGUF9OT0ZTIHwgX19HRlBfTk9GQUlMKTsKKwlscCA9IGttYWxsb2MoaGFsZl9sZW4gKiBzaXplb2YoX19iZTY0KSwgR0ZQX05PRlMpOworCWlmICghbHApIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYnJlbHNlOworCX0KKwogCS8qICBDaGFuZ2UgdGhlIHBvaW50ZXJzICAqLwogCWZvciAoeCA9IDA7IHggPCBoYWxmX2xlbjsgeCsrKQogCQlscFt4XSA9IGNwdV90b19iZTY0KGJuKTsKQEAgLTEwNjMsNyArMTA2OCw5IEBACiAKIAkvKiAgQWxsb2NhdGUgYm90aCB0aGUgImZyb20iIGFuZCAidG8iIGJ1ZmZlcnMgaW4gb25lIGJpZyBjaHVuayAgKi8KIAotCWJ1ZiA9IGtjYWxsb2MoMywgc2RwLT5zZF9oYXNoX2JzaXplLCBHRlBfTk9GUyB8IF9fR0ZQX05PRkFJTCk7CisJYnVmID0ga2NhbGxvYygzLCBzZHAtPnNkX2hhc2hfYnNpemUsIEdGUF9OT0ZTKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGJsb2NrID0gZGlwLT5pX2Rpc2tzaXplID4+IHNkcC0+c2RfaGFzaF9ic2l6ZV9zaGlmdDsgYmxvY2stLTspIHsKIAkJZXJyb3IgPSBnZnMyX2Rpcl9yZWFkX2RhdGEoZGlwLCAoY2hhciAqKWJ1ZiwKQEAgLTEyMzEsNiArMTIzOCwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCAqZ2ZzMl9hbGxvY19zb3J0X2J1ZmZlcih1bnNpZ25lZCBzaXplKQoreworCXZvaWQgKnB0ciA9IE5VTEw7CisKKwlpZiAoc2l6ZSA8IEtNQUxMT0NfTUFYX1NJWkUpCisJCXB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX05PRlMgfCBfX0dGUF9OT1dBUk4pOworCWlmICghcHRyKQorCQlwdHIgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX05PRlMsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgdm9pZCBnZnMyX2ZyZWVfc29ydF9idWZmZXIodm9pZCAqcHRyKQoreworCWlmIChpc192bWFsbG9jX2FkZHIocHRyKSkKKwkJdmZyZWUocHRyKTsKKwllbHNlCisJCWtmcmVlKHB0cik7Cit9CisKIHN0YXRpYyBpbnQgZ2ZzMl9kaXJfcmVhZF9sZWFmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCAqb2Zmc2V0LCB2b2lkICpvcGFxdWUsCiAJCQkgICAgICBmaWxsZGlyX3QgZmlsbGRpciwgaW50ICpjb3BpZWQsIHVuc2lnbmVkICpkZXB0aCwKIAkJCSAgICAgIHU2NCBsZWFmX25vKQpAQCAtMTI3MSw3ICsxMjk3LDcgQEAKIAkgKiA5OSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0aGF0IGNhbiBmaXQgaW4gYSBzaW5nbGUKIAkgKiBsZWFmIGJsb2NrLgogCSAqLwotCWxhcnIgPSB2bWFsbG9jKChsZWF2ZXMgKyBlbnRyaWVzICsgOTkpICogc2l6ZW9mKHZvaWQgKikpOworCWxhcnIgPSBnZnMyX2FsbG9jX3NvcnRfYnVmZmVyKChsZWF2ZXMgKyBlbnRyaWVzICsgOTkpICogc2l6ZW9mKHZvaWQgKikpOwogCWlmICghbGFycikKIAkJZ290byBvdXQ7CiAJZGFyciA9IChjb25zdCBzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKiopKGxhcnIgKyBsZWF2ZXMpOwpAQCAtMTI4Miw3ICsxMzA4LDcgQEAKIAlkbyB7CiAJCWVycm9yID0gZ2V0X2xlYWYoaXAsIGxmbiwgJmJoKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBvdXRfa2ZyZWU7CisJCQlnb3RvIG91dF9mcmVlOwogCQlsZiA9IChzdHJ1Y3QgZ2ZzMl9sZWFmICopYmgtPmJfZGF0YTsKIAkJbGZuID0gYmU2NF90b19jcHUobGYtPmxmX25leHQpOwogCQlpZiAobGYtPmxmX2VudHJpZXMpIHsKQEAgLTEyOTEsNyArMTMxNyw3IEBACiAJCQkJCQlnZnMyX2RpcmVudF9nYXRoZXIsIE5VTEwsICZnKTsKIAkJCWVycm9yID0gUFRSX0VSUihkZW50KTsKIAkJCWlmIChJU19FUlIoZGVudCkpCi0JCQkJZ290byBvdXRfa2ZyZWU7CisJCQkJZ290byBvdXRfZnJlZTsKIAkJCWlmIChlbnRyaWVzMiAhPSBnLm9mZnNldCkgewogCQkJCWZzX3dhcm4oc2RwLCAiTnVtYmVyIG9mIGVudHJpZXMgY29ycnVwdCBpbiBkaXIgIgogCQkJCQkJImxlYWYgJWxsdSwgZW50cmllczIgKCV1KSAhPSAiCkBAIC0xMzAwLDcgKzEzMjYsNyBAQAogCQkJCQllbnRyaWVzMiwgZy5vZmZzZXQpOwogCQkJCQkKIAkJCQllcnJvciA9IC1FSU87Ci0JCQkJZ290byBvdXRfa2ZyZWU7CisJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KIAkJCWVycm9yID0gMDsKIAkJCWxhcnJbbGVhZisrXSA9IGJoOwpAQCAtMTMxMiwxMCArMTMzOCwxMCBAQAogCUJVR19PTihlbnRyaWVzMiAhPSBlbnRyaWVzKTsKIAllcnJvciA9IGRvX2ZpbGxkaXJfbWFpbihpcCwgb2Zmc2V0LCBvcGFxdWUsIGZpbGxkaXIsIGRhcnIsCiAJCQkJZW50cmllcywgY29waWVkKTsKLW91dF9rZnJlZToKK291dF9mcmVlOgogCWZvcihpID0gMDsgaSA8IGxlYWY7IGkrKykKIAkJYnJlbHNlKGxhcnJbaV0pOwotCXZmcmVlKGxhcnIpOworCWdmczJfZnJlZV9zb3J0X2J1ZmZlcihsYXJyKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9mcy9nZnMyL2ZpbGUuYyBiL2ZzL2dmczIvZmlsZS5jCmluZGV4IGVkOWE5NGYuLjRlZGQ2NjIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZmlsZS5jCisrKyBiL2ZzL2dmczIvZmlsZS5jCkBAIC0zNTEsNyArMzUxLDYgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CiAJdTY0IHBvcyA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJdW5zaWduZWQgaW50IGRhdGFfYmxvY2tzLCBpbmRfYmxvY2tzLCByYmxvY2tzOwotCWludCBhbGxvY19yZXF1aXJlZCA9IDA7CiAJc3RydWN0IGdmczJfaG9sZGVyIGdoOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbDsKIAlpbnQgcmV0OwpAQCAtMzY0LDggKzM2Myw3IEBACiAJc2V0X2JpdChHTEZfRElSVFksICZpcC0+aV9nbC0+Z2xfZmxhZ3MpOwogCXNldF9iaXQoR0lGX1NXX1BBR0VELCAmaXAtPmlfZmxhZ3MpOwogCi0JcmV0ID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgcG9zLCBQQUdFX0NBQ0hFX1NJWkUsICZhbGxvY19yZXF1aXJlZCk7Ci0JaWYgKHJldCB8fCAhYWxsb2NfcmVxdWlyZWQpCisJaWYgKCFnZnMyX3dyaXRlX2FsbG9jX3JlcXVpcmVkKGlwLCBwb3MsIFBBR0VfQ0FDSEVfU0laRSkpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlyZXQgPSAtRU5PTUVNOwogCWFsID0gZ2ZzMl9hbGxvY19nZXQoaXApOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9jay5jIGIvZnMvZ2ZzMi9nbG9jay5jCmluZGV4IDA4OThmM2UuLjlhZGY4ZjkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZ2xvY2suYworKysgYi9mcy9nZnMyL2dsb2NrLmMKQEAgLTMyOCw2ICszMjgsMzAgQEAKIH0KIAogLyoqCisgKiBkb19lcnJvciAtIFNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcyBoYXBwZW5lZCBkdXJpbmcgYSBsb2NrIHJlcXVlc3QKKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRvX2Vycm9yKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgY29uc3QgaW50IHJldCkKK3sKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGdoLCB0bXAsICZnbC0+Z2xfaG9sZGVycywgZ2hfbGlzdCkgeworCQlpZiAodGVzdF9iaXQoSElGX0hPTERFUiwgJmdoLT5naF9pZmxhZ3MpKQorCQkJY29udGludWU7CisJCWlmIChyZXQgJiBMTV9PVVRfRVJST1IpCisJCQlnaC0+Z2hfZXJyb3IgPSAtRUlPOworCQllbHNlIGlmIChnaC0+Z2hfZmxhZ3MgJiAoTE1fRkxBR19UUlkgfCBMTV9GTEFHX1RSWV8xQ0IpKQorCQkJZ2gtPmdoX2Vycm9yID0gR0xSX1RSWUZBSUxFRDsKKwkJZWxzZQorCQkJY29udGludWU7CisJCWxpc3RfZGVsX2luaXQoJmdoLT5naF9saXN0KTsKKwkJdHJhY2VfZ2ZzMl9nbG9ja19xdWV1ZShnaCwgMCk7CisJCWdmczJfaG9sZGVyX3dha2UoZ2gpOworCX0KK30KKworLyoqCiAgKiBkb19wcm9tb3RlIC0gcHJvbW90ZSBhcyBtYW55IHJlcXVlc3RzIGFzIHBvc3NpYmxlIG9uIHRoZSBjdXJyZW50IHF1ZXVlCiAgKiBAZ2w6IFRoZSBnbG9jawogICogCkBAIC0zNzUsMzYgKzM5OSwxMyBAQAogCQl9CiAJCWlmIChnaC0+Z2hfbGlzdC5wcmV2ID09ICZnbC0+Z2xfaG9sZGVycykKIAkJCXJldHVybiAxOworCQlkb19lcnJvcihnbCwgMCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBkb19lcnJvciAtIFNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcyBoYXBwZW5lZCBkdXJpbmcgYSBsb2NrIHJlcXVlc3QKLSAqCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGRvX2Vycm9yKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgY29uc3QgaW50IHJldCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGdoLCB0bXAsICZnbC0+Z2xfaG9sZGVycywgZ2hfbGlzdCkgewotCQlpZiAodGVzdF9iaXQoSElGX0hPTERFUiwgJmdoLT5naF9pZmxhZ3MpKQotCQkJY29udGludWU7Ci0JCWlmIChyZXQgJiBMTV9PVVRfRVJST1IpCi0JCQlnaC0+Z2hfZXJyb3IgPSAtRUlPOwotCQllbHNlIGlmIChnaC0+Z2hfZmxhZ3MgJiAoTE1fRkxBR19UUlkgfCBMTV9GTEFHX1RSWV8xQ0IpKQotCQkJZ2gtPmdoX2Vycm9yID0gR0xSX1RSWUZBSUxFRDsKLQkJZWxzZQotCQkJY29udGludWU7Ci0JCWxpc3RfZGVsX2luaXQoJmdoLT5naF9saXN0KTsKLQkJdHJhY2VfZ2ZzMl9nbG9ja19xdWV1ZShnaCwgMCk7Ci0JCWdmczJfaG9sZGVyX3dha2UoZ2gpOwotCX0KLX0KLQotLyoqCiAgKiBmaW5kX2ZpcnN0X3dhaXRlciAtIGZpbmQgdGhlIGZpcnN0IGdoIHRoYXQncyB3YWl0aW5nIGZvciB0aGUgZ2xvY2sKICAqIEBnbDogdGhlIGdsb2NrCiAgKi8KQEAgLTcwNiwxOCArNzA3LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdmczJfZ2xvY2ssIGdsX3dvcmsud29yayk7Ci0Jc3RydWN0IGdmczJfaG9sZGVyICpnaDsKIAlpbnQgZHJvcF9yZWYgPSAwOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KEdMRl9GUk9aRU4sICZnbC0+Z2xfZmxhZ3MpKSkgewotCQlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKLQkJZ2ggPSBmaW5kX2ZpcnN0X3dhaXRlcihnbCk7Ci0JCWlmIChnaCAmJiAoZ2gtPmdoX2ZsYWdzICYgTE1fRkxBR19OT0VYUCkgJiYKLQkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChHTEZfRlJPWkVOLCAmZ2wtPmdsX2ZsYWdzKSkKLQkJCXNldF9iaXQoR0xGX1JFUExZX1BFTkRJTkcsICZnbC0+Z2xfZmxhZ3MpOwotCQlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwotCX0KLQogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoR0xGX1JFUExZX1BFTkRJTkcsICZnbC0+Z2xfZmxhZ3MpKSB7CiAJCWZpbmlzaF94bW90ZShnbCwgZ2wtPmdsX3JlcGx5KTsKIAkJZHJvcF9yZWYgPSAxOwpAQCAtMTA3Miw2ICsxMDYzLDkgQEAKIAogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwogCWFkZF90b19xdWV1ZShnaCk7CisJaWYgKChMTV9GTEFHX05PRVhQICYgZ2gtPmdoX2ZsYWdzKSAmJgorCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoR0xGX0ZST1pFTiwgJmdsLT5nbF9mbGFncykpCisJCXNldF9iaXQoR0xGX1JFUExZX1BFTkRJTkcsICZnbC0+Z2xfZmxhZ3MpOwogCXJ1bl9xdWV1ZShnbCwgMSk7CiAJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKIApAQCAtMTMyOSw2ICsxMzIzLDM2IEBACiB9CiAKIC8qKgorICogZ2ZzMl9zaG91bGRfZnJlZXplIC0gRmlndXJlIG91dCBpZiBnbG9jayBzaG91bGQgYmUgZnJvemVuCisgKiBAZ2w6IFRoZSBnbG9jayBpbiBxdWVzdGlvbgorICoKKyAqIEdsb2NrcyBhcmUgbm90IGZyb3plbiBpZiAoYSkgdGhlIHJlc3VsdCBvZiB0aGUgZGxtIG9wZXJhdGlvbiBpcworICogYW4gZXJyb3IsIChiKSB0aGUgbG9ja2luZyBvcGVyYXRpb24gd2FzIGFuIHVubG9jayBvcGVyYXRpb24gb3IKKyAqIChjKSBpZiB0aGVyZSBpcyBhICJub2V4cCIgZmxhZ2dlZCByZXF1ZXN0IGFueXdoZXJlIGluIHRoZSBxdWV1ZQorICoKKyAqIFJldHVybnM6IDEgaWYgZnJlZXppbmcgc2hvdWxkIG9jY3VyLCAwIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9zaG91bGRfZnJlZXplKGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3sKKwljb25zdCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoOworCisJaWYgKGdsLT5nbF9yZXBseSAmIH5MTV9PVVRfU1RfTUFTSykKKwkJcmV0dXJuIDA7CisJaWYgKGdsLT5nbF90YXJnZXQgPT0gTE1fU1RfVU5MT0NLRUQpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShnaCwgJmdsLT5nbF9ob2xkZXJzLCBnaF9saXN0KSB7CisJCWlmICh0ZXN0X2JpdChISUZfSE9MREVSLCAmZ2gtPmdoX2lmbGFncykpCisJCQljb250aW51ZTsKKwkJaWYgKExNX0ZMQUdfTk9FWFAgJiBnaC0+Z2hfZmxhZ3MpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCiAgKiBnZnMyX2dsb2NrX2NvbXBsZXRlIC0gQ2FsbGJhY2sgdXNlZCBieSBsb2NraW5nCiAgKiBAZ2w6IFBvaW50ZXIgdG8gdGhlIGdsb2NrCiAgKiBAcmV0OiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGRsbQpAQCAtMTMzOCwxOCArMTM2MiwxNyBAQAogdm9pZCBnZnMyX2dsb2NrX2NvbXBsZXRlKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgaW50IHJldCkKIHsKIAlzdHJ1Y3QgbG1fbG9ja3N0cnVjdCAqbHMgPSAmZ2wtPmdsX3NiZC0+c2RfbG9ja3N0cnVjdDsKKwogCWdsLT5nbF9yZXBseSA9IHJldDsKKwogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChERkxfQkxPQ0tfTE9DS1MsICZscy0+bHNfZmxhZ3MpKSkgewotCQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoOwogCQlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKLQkJZ2ggPSBmaW5kX2ZpcnN0X3dhaXRlcihnbCk7Ci0JCWlmICgoIShnaCAmJiAoZ2gtPmdoX2ZsYWdzICYgTE1fRkxBR19OT0VYUCkpICYmCi0JCSAgICAgKGdsLT5nbF90YXJnZXQgIT0gTE1fU1RfVU5MT0NLRUQpKSB8fAotCQkgICAgKChyZXQgJiB+TE1fT1VUX1NUX01BU0spICE9IDApKQorCQlpZiAoZ2ZzMl9zaG91bGRfZnJlZXplKGdsKSkgewogCQkJc2V0X2JpdChHTEZfRlJPWkVOLCAmZ2wtPmdsX2ZsYWdzKTsKLQkJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKLQkJaWYgKHRlc3RfYml0KEdMRl9GUk9aRU4sICZnbC0+Z2xfZmxhZ3MpKQorCQkJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKIAkJCXJldHVybjsKKwkJfQorCQlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwogCX0KIAlzZXRfYml0KEdMRl9SRVBMWV9QRU5ESU5HLCAmZ2wtPmdsX2ZsYWdzKTsKIAlnZnMyX2dsb2NrX2hvbGQoZ2wpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbmNvcmUuaCBiL2ZzL2dmczIvaW5jb3JlLmgKaW5kZXggYjVkNzM2My4uOGZjYmNlNCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbmNvcmUuaAorKysgYi9mcy9nZnMyL2luY29yZS5oCkBAIC00NjAsNiArNDYwLDcgQEAKIAlTREZfTk9CQVJSSUVSUwkJPSAzLAogCVNERl9OT1JFQ09WRVJZCQk9IDQsCiAJU0RGX0RFTU9URQkJPSA1LAorCVNERl9OT0pPVVJOQUxJRAkJPSA2LAogfTsKIAogI2RlZmluZSBHRlMyX0ZTTkFNRV9MRU4JCTI1NgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuYwppbmRleCAzNTkzYjNhLi40NWE0YTM2IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19mc3R5cGUuYworKysgYi9mcy9nZnMyL29wc19mc3R5cGUuYwpAQCAtNzYsNyArNzYsNyBAQAogCiAJc2ItPnNfZnNfaW5mbyA9IHNkcDsKIAlzZHAtPnNkX3ZmcyA9IHNiOwotCisJc2V0X2JpdChTREZfTk9KT1VSTkFMSUQsICZzZHAtPnNkX2ZsYWdzKTsKIAlnZnMyX3R1bmVfaW5pdCgmc2RwLT5zZF90dW5lKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkcC0+c2RfZ2xvY2tfd2FpdCk7CkBAIC0xMDUwLDcgKzEwNTAsOCBAQAogCQkJcmV0ID0gbWF0Y2hfaW50KCZ0bXBbMF0sICZvcHRpb24pOwogCQkJaWYgKHJldCB8fCBvcHRpb24gPCAwKSAKIAkJCQlnb3RvIGhvc3RkYXRhX2Vycm9yOwotCQkJbHMtPmxzX2ppZCA9IG9wdGlvbjsKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCAmc2RwLT5zZF9mbGFncykpCisJCQkJbHMtPmxzX2ppZCA9IG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pZDoKIAkJCS8qIE9ic29sZXRlLCBidXQgbGVmdCBmb3IgYmFja3dhcmQgY29tcGF0IHB1cnBvc2VzICovCkBAIC0xMTAyLDYgKzExMDMsMjQgQEAKIAkJbG0tPmxtX3VubW91bnQoc2RwKTsKIH0KIAorc3RhdGljIGludCBnZnMyX2pvdXJuYWxpZF93YWl0KHZvaWQgKndvcmQpCit7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCXNjaGVkdWxlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9vbl9qb3VybmFsKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQoreworCWlmIChzZHAtPnNkX2FyZ3MuYXJfc3BlY3RhdG9yKQorCQlyZXR1cm4gMDsKKwlpZiAoc2RwLT5zZF9sb2Nrc3RydWN0LmxzX29wcy0+bG1fbW91bnQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gd2FpdF9vbl9iaXQoJnNkcC0+c2RfZmxhZ3MsIFNERl9OT0pPVVJOQUxJRCwgZ2ZzMl9qb3VybmFsaWRfd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKK30KKwogdm9pZCBnZnMyX29ubGluZV91ZXZlbnQoc3RydWN0IGdmczJfc2JkICpzZHApCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNkcC0+c2RfdmZzOwpAQCAtMTE5NCw2ICsxMjEzLDEwIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWxfbG9ja2luZzsKIAorCWVycm9yID0gd2FpdF9vbl9qb3VybmFsKHNkcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfc2I7CisKIAllcnJvciA9IGluaXRfaW5vZGVzKHNkcCwgRE8pOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsX3NiOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9xdW90YS5jIGIvZnMvZ2ZzMi9xdW90YS5jCmluZGV4IDhmMDJkM2QuLjhiYjY0M2MgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcXVvdGEuYworKysgYi9mcy9nZnMyL3F1b3RhLmMKQEAgLTc4NywxNSArNzg3LDkgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IgKHggPSAwOyB4IDwgbnVtX3FkOyB4KyspIHsKLQkJaW50IGFsbG9jX3JlcXVpcmVkOwotCiAJCW9mZnNldCA9IHFkMm9mZnNldChxZGFbeF0pOwotCQllcnJvciA9IGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIG9mZnNldCwKLQkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBnZnMyX3F1b3RhKSwKLQkJCQkJCSAgJmFsbG9jX3JlcXVpcmVkKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXRfZ3VubG9jazsKLQkJaWYgKGFsbG9jX3JlcXVpcmVkKQorCQlpZiAoZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgb2Zmc2V0LAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpKSkKIAkJCW5hbGxvYysrOwogCX0KIApAQCAtMTU4NCwxMCArMTU3OCw3IEBACiAJCWdvdG8gb3V0X2k7CiAKIAlvZmZzZXQgPSBxZDJvZmZzZXQocWQpOwotCWVycm9yID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgb2Zmc2V0LCBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpLAotCQkJCQkgICZhbGxvY19yZXF1aXJlZCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9pOworCWFsbG9jX3JlcXVpcmVkID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgb2Zmc2V0LCBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpKTsKIAlpZiAoYWxsb2NfcmVxdWlyZWQpIHsKIAkJYWwgPSBnZnMyX2FsbG9jX2dldChpcCk7CiAJCWlmIChhbCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5jIGIvZnMvZ2ZzMi9zdXBlci5jCmluZGV4IDRkMWFhZDMuLjQxNDA4MTEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuYworKysgYi9mcy9nZnMyL3N1cGVyLmMKQEAgLTM0Miw4ICszNDIsNiBAQAogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShqZC0+amRfaW5vZGUpOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihqZC0+amRfaW5vZGUpOwotCWludCBhcjsKLQlpbnQgZXJyb3I7CiAKIAlpZiAoaXAtPmlfZGlza3NpemUgPCAoOCA8PCAyMCkgfHwgaXAtPmlfZGlza3NpemUgPiAoMSA8PCAzMCkgfHwKIAkgICAgKGlwLT5pX2Rpc2tzaXplICYgKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKSkpIHsKQEAgLTM1MiwxMyArMzUwLDEyIEBACiAJfQogCWpkLT5qZF9ibG9ja3MgPSBpcC0+aV9kaXNrc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCi0JZXJyb3IgPSBnZnMyX3dyaXRlX2FsbG9jX3JlcXVpcmVkKGlwLCAwLCBpcC0+aV9kaXNrc2l6ZSwgJmFyKTsKLQlpZiAoIWVycm9yICYmIGFyKSB7CisJaWYgKGdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIDAsIGlwLT5pX2Rpc2tzaXplKSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwotCQllcnJvciA9IC1FSU87CisJCXJldHVybiAtRUlPOwogCX0KIAotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9nZnMyL3N5cy5jIGIvZnMvZ2ZzMi9zeXMuYwppbmRleCAzN2Y1MzkzLi5kMDE5ZDBkIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N5cy5jCisrKyBiL2ZzL2dmczIvc3lzLmMKQEAgLTMyNSw2ICszMjUsMzAgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbHMtPmxzX2ZpcnN0KTsKIH0KIAorc3RhdGljIHNzaXplX3QgbGtmaXJzdF9zdG9yZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGZpcnN0OworCWludCBydjsKKworCXJ2ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmZpcnN0KTsKKwlpZiAocnYgIT0gMSB8fCBmaXJzdCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CisJcnYgPSAtRUJVU1k7CisJaWYgKHRlc3RfYml0KFNERl9OT0pPVVJOQUxJRCwgJnNkcC0+c2RfZmxhZ3MpID09IDApCisJCWdvdG8gb3V0OworCXJ2ID0gLUVJTlZBTDsKKwlpZiAoc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikKKwkJZ290byBvdXQ7CisJaWYgKHNkcC0+c2RfbG9ja3N0cnVjdC5sc19vcHMtPmxtX21vdW50ID09IE5VTEwpCisJCWdvdG8gb3V0OworICAgICAgICBzZHAtPnNkX2xvY2tzdHJ1Y3QubHNfZmlyc3QgPSBmaXJzdDsKKyAgICAgICAgcnYgPSAwOworb3V0OgorICAgICAgICBzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CisgICAgICAgIHJldHVybiBydiA/IHJ2IDogbGVuOworfQorCiBzdGF0aWMgc3NpemVfdCBmaXJzdF9kb25lX3Nob3coc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbG1fbG9ja3N0cnVjdCAqbHMgPSAmc2RwLT5zZF9sb2Nrc3RydWN0OwpAQCAtMzc3LDE0ICs0MDEsNDEgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc2RwLT5zZF9sb2Nrc3RydWN0LmxzX2ppZCk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGppZF9zdG9yZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworICAgICAgICB1bnNpZ25lZCBqaWQ7CisJaW50IHJ2OworCisJcnYgPSBzc2NhbmYoYnVmLCAiJXUiLCAmamlkKTsKKwlpZiAocnYgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworCXJ2ID0gLUVJTlZBTDsKKwlpZiAoc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikKKwkJZ290byBvdXQ7CisJaWYgKHNkcC0+c2RfbG9ja3N0cnVjdC5sc19vcHMtPmxtX21vdW50ID09IE5VTEwpCisJCWdvdG8gb3V0OworCXJ2ID0gLUVCVVNZOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCAmc2RwLT5zZF9mbGFncykgPT0gMCkKKwkJZ290byBvdXQ7CisJc2RwLT5zZF9sb2Nrc3RydWN0LmxzX2ppZCA9IGppZDsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCXdha2VfdXBfYml0KCZzZHAtPnNkX2ZsYWdzLCBTREZfTk9KT1VSTkFMSUQpOworCXJ2ID0gMDsKK291dDoKKwlzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CisJcmV0dXJuIHJ2ID8gcnYgOiBsZW47Cit9CisKICNkZWZpbmUgR0RMTV9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkgXAogc3RhdGljIHN0cnVjdCBnZnMyX2F0dHIgZ2RsbV9hdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQogCiBHRExNX0FUVFIocHJvdG9fbmFtZSwJCTA0NDQsIHByb3RvX25hbWVfc2hvdywJCU5VTEwpOwogR0RMTV9BVFRSKGJsb2NrLAkJMDY0NCwgYmxvY2tfc2hvdywJCWJsb2NrX3N0b3JlKTsKIEdETE1fQVRUUih3aXRoZHJhdywJCTA2NDQsIHdpdGhkcmF3X3Nob3csCQl3aXRoZHJhd19zdG9yZSk7Ci1HRExNX0FUVFIoamlkLAkJCTA0NDQsIGppZF9zaG93LAkJCU5VTEwpOwotR0RMTV9BVFRSKGZpcnN0LAkJMDQ0NCwgbGtmaXJzdF9zaG93LAkJTlVMTCk7CitHRExNX0FUVFIoamlkLAkJCTA2NDQsIGppZF9zaG93LAkJCWppZF9zdG9yZSk7CitHRExNX0FUVFIoZmlyc3QsCQkwNjQ0LCBsa2ZpcnN0X3Nob3csCQlsa2ZpcnN0X3N0b3JlKTsKIEdETE1fQVRUUihmaXJzdF9kb25lLAkJMDQ0NCwgZmlyc3RfZG9uZV9zaG93LAkJTlVMTCk7CiBHRExNX0FUVFIocmVjb3ZlciwJCTA2MDAsIE5VTEwsCQkJcmVjb3Zlcl9zdG9yZSk7CiBHRExNX0FUVFIocmVjb3Zlcl9kb25lLAkJMDQ0NCwgcmVjb3Zlcl9kb25lX3Nob3csCU5VTEwpOwpAQCAtNTY0LDcgKzYxNSw3IEBACiAKIAlhZGRfdWV2ZW50X3ZhcihlbnYsICJMT0NLVEFCTEU9JXMiLCBzZHAtPnNkX3RhYmxlX25hbWUpOwogCWFkZF91ZXZlbnRfdmFyKGVudiwgIkxPQ0tQUk9UTz0lcyIsIHNkcC0+c2RfcHJvdG9fbmFtZSk7Ci0JaWYgKCFzZHAtPnNkX2FyZ3MuYXJfc3BlY3RhdG9yKQorCWlmICghdGVzdF9iaXQoU0RGX05PSk9VUk5BTElELCAmc2RwLT5zZF9mbGFncykpCiAJCWFkZF91ZXZlbnRfdmFyKGVudiwgIkpPVVJOQUxJRD0ldSIsIHNkcC0+c2RfbG9ja3N0cnVjdC5sc19qaWQpOwogCWlmIChnZnMyX3V1aWRfdmFsaWQodXVpZCkpCiAJCWFkZF91ZXZlbnRfdmFyKGVudiwgIlVVSUQ9JXBVQiIsIHV1aWQpOwpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKaW5kZXggODY4ZDBjYi4uNDJkMmQyOCAxMDA2NDQKLS0tIGEvZnMvbmFtZWkuYworKysgYi9mcy9uYW1laS5jCkBAIC0yODIsOCArMjgyLDcgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcmV0dXJuIHNlY3VyaXR5X2lub2RlX3Blcm1pc3Npb24oaW5vZGUsCi0JCQltYXNrICYgKE1BWV9SRUFEfE1BWV9XUklURXxNQVlfRVhFQ3xNQVlfQVBQRU5EKSk7CisJcmV0dXJuIHNlY3VyaXR5X2lub2RlX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogfQogCiAvKioKQEAgLTE0ODQsOCArMTQ4Myw3IEBACiAJICovCiAJZXJyb3IgPSBsb2Nrc192ZXJpZnlfbG9ja2VkKGlub2RlKTsKIAlpZiAoIWVycm9yKQotCQllcnJvciA9IHNlY3VyaXR5X3BhdGhfdHJ1bmNhdGUocGF0aCwgMCwKLQkJCQkgICAgICAgQVRUUl9NVElNRXxBVFRSX0NUSU1FfEFUVFJfT1BFTik7CisJCWVycm9yID0gc2VjdXJpdHlfcGF0aF90cnVuY2F0ZShwYXRoKTsKIAlpZiAoIWVycm9yKSB7CiAJCWVycm9yID0gZG9fdHJ1bmNhdGUocGF0aC0+ZGVudHJ5LCAwLAogCQkJCSAgICBBVFRSX01USU1FfEFUVFJfQ1RJTUV8QVRUUl9PUEVOLApkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW5vZGUuYyBiL2ZzL25jcGZzL2lub2RlLmMKaW5kZXggZmEzMzg1MS4uMWU2MzRkZSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW5vZGUuYworKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC03MjgsOCArNzI4LDggQEAKIG91dF9iZGk6CiAJLyogMjMvMTIvMTk5OCBNYXJjaW4gRGFsZWNraSA8ZGFsZWNraUBjcy5uZXQucGw+OgogCSAqIAotCSAqIFRoZSBwcmV2aW91c2x5IHVzZWQgcHV0X2ZpbHAobmNwX2ZpbHApOyB3YXMgYm9nb3VzLCBzaW5jZQotCSAqIGl0IGRvZXNuJ3QgcHJvcGVyIHVubG9ja2luZy4KKwkgKiBUaGUgcHJldmlvdXNseSB1c2VkIHB1dF9maWxwKG5jcF9maWxwKTsgd2FzIGJvZ3VzLCBzaW5jZQorCSAqIGl0IGRvZXNuJ3QgcGVyZm9ybSBwcm9wZXIgdW5sb2NraW5nLgogCSAqLwogCWZwdXQobmNwX2ZpbHApOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IGU2MDQxNmQuLjgzMmU5ZTIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTE5NTMsNyArMTk1Myw3IEBACiAJaWYgKChtYXNrICYgKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpKSA9PSAwKQogCQlnb3RvIG91dDsKIAkvKiBJcyB0aGlzIHN5c19hY2Nlc3MoKSA/ICovCi0JaWYgKG1hc2sgJiBNQVlfQUNDRVNTKQorCWlmIChtYXNrICYgKE1BWV9BQ0NFU1MgfCBNQVlfQ0hESVIpKQogCQlnb3RvIGZvcmNlX2xvb2t1cDsKIAogCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggMzZhNWU3NC4uZjAzNjE1MyAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNDkzLDExICs0OTQsMTkgQEAKICAqLwogc3RhdGljIGludCBuZnNfcmVsZWFzZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnApCiB7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCiAJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiByZWxlYXNlX3BhZ2UoJXApXG4iLCBwYWdlKTsKIAogCS8qIE9ubHkgZG8gSS9PIGlmIGdmcCBpcyBhIHN1cGVyc2V0IG9mIEdGUF9LRVJORUwgKi8KLQlpZiAoKGdmcCAmIEdGUF9LRVJORUwpID09IEdGUF9LRVJORUwpCi0JCW5mc193Yl9wYWdlKHBhZ2UtPm1hcHBpbmctPmhvc3QsIHBhZ2UpOworCWlmIChtYXBwaW5nICYmIChnZnAgJiBHRlBfS0VSTkVMKSA9PSBHRlBfS0VSTkVMKSB7CisJCWludCBob3cgPSBGTFVTSF9TWU5DOworCisJCS8qIERvbid0IGxldCBrc3dhcGQgZGVhZGxvY2sgd2FpdGluZyBmb3IgT09NIFJQQyBjYWxscyAqLworCQlpZiAoY3VycmVudF9pc19rc3dhcGQoKSkKKwkJCWhvdyA9IDA7CisJCW5mc19jb21taXRfaW5vZGUobWFwcGluZy0+aG9zdCwgaG93KTsKKwl9CiAJLyogSWYgUGFnZVByaXZhdGUoKSBpcyBzZXQsIHRoZW4gdGhlIHBhZ2UgaXMgbm90IGZyZWVhYmxlICovCiAJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnNyb290LmMgYi9mcy9uZnMvbmZzcm9vdC5jCmluZGV4IDZiZDE5ZDguLmRmMTAxZDkgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnNyb290LmMKKysrIGIvZnMvbmZzL25mc3Jvb3QuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiBzdGF0aWMgX19iZTMyIHNlcnZhZGRyIF9faW5pdGRhdGEgPSAwOwogCiAvKiBOYW1lIG9mIGRpcmVjdG9yeSB0byBtb3VudCAqLwotc3RhdGljIGNoYXIgbmZzX2V4cG9ydF9wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9Oworc3RhdGljIGNoYXIgbmZzX2V4cG9ydF9wYXRoW05GU19NQVhQQVRITEVOICsgMV0gX19pbml0ZGF0YSA9IHsgMCwgfTsKIAogLyogTkZTLXJlbGF0ZWQgZGF0YSAqLwogc3RhdGljIHN0cnVjdCBuZnNfbW91bnRfZGF0YSBuZnNfZGF0YSBfX2luaXRkYXRhID0geyAwLCB9Oy8qIE5GUyBtb3VudCBpbmZvICovCmRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jCmluZGV4IDkxNjc5ZTIuLjlmODFiZGQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy93cml0ZS5jCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJY2xlYXJfYmRpX2Nvbmdlc3RlZCgmbmZzcy0+YmFja2luZ19kZXZfaW5mbywgQkxLX1JXX0FTWU5DKTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZnNfcGFnZSAqbmZzX2ZpbmRfYW5kX2xvY2tfcmVxdWVzdChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBzdHJ1Y3QgbmZzX3BhZ2UgKm5mc19maW5kX2FuZF9sb2NrX3JlcXVlc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGJvb2wgbm9uYmxvY2spCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG5mc19wYWdlICpyZXE7CkBAIC0yNDEsNyArMjQxLDEwIEBACiAJCSAqCSByZXF1ZXN0IGFzIGRpcnR5IChpbiB3aGljaCBjYXNlIHdlIGRvbid0IGNhcmUpLgogCQkgKi8KIAkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCQlyZXQgPSBuZnNfd2FpdF9vbl9yZXF1ZXN0KHJlcSk7CisJCWlmICghbm9uYmxvY2spCisJCQlyZXQgPSBuZnNfd2FpdF9vbl9yZXF1ZXN0KHJlcSk7CisJCWVsc2UKKwkJCXJldCA9IC1FQUdBSU47CiAJCW5mc19yZWxlYXNlX3JlcXVlc3QocmVxKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKQEAgLTI1NiwxMiArMjU5LDEyIEBACiAgKiBNYXkgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSB1c2VyIHNpZ25hbGxlZCBuZnNfd2FpdF9vbl9yZXF1ZXN0KCkuCiAgKi8KIHN0YXRpYyBpbnQgbmZzX3BhZ2VfYXN5bmNfZmx1c2goc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqcGdpbywKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCBub25ibG9jaykKIHsKIAlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcTsKIAlpbnQgcmV0ID0gMDsKIAotCXJlcSA9IG5mc19maW5kX2FuZF9sb2NrX3JlcXVlc3QocGFnZSk7CisJcmVxID0gbmZzX2ZpbmRfYW5kX2xvY2tfcmVxdWVzdChwYWdlLCBub25ibG9jayk7CiAJaWYgKCFyZXEpCiAJCWdvdG8gb3V0OwogCXJldCA9IFBUUl9FUlIocmVxKTsKQEAgLTI4MywxMiArMjg2LDIwIEBACiBzdGF0aWMgaW50IG5mc19kb193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLCBzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICpwZ2lvKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCByZXQ7CiAKIAluZnNfaW5jX3N0YXRzKGlub2RlLCBORlNJT1NfVkZTV1JJVEVQQUdFKTsKIAluZnNfYWRkX3N0YXRzKGlub2RlLCBORlNJT1NfV1JJVEVQQUdFUywgMSk7CiAKIAluZnNfcGFnZWlvX2NvbmRfY29tcGxldGUocGdpbywgcGFnZS0+aW5kZXgpOwotCXJldHVybiBuZnNfcGFnZV9hc3luY19mbHVzaChwZ2lvLCBwYWdlKTsKKwlyZXQgPSBuZnNfcGFnZV9hc3luY19mbHVzaChwZ2lvLCBwYWdlLAorCQkJd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FIHx8CisJCQl3YmMtPm5vbmJsb2NraW5nICE9IDApOworCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTM3OSw3ICsxMzkwLDcgQEAKIAkucnBjX3JlbGVhc2UgPSBuZnNfY29tbWl0X3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgaW50IG5mc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGhvdykKK2ludCBuZnNfY29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBob3cpCiB7CiAJTElTVF9IRUFEKGhlYWQpOwogCWludCBtYXlfd2FpdCA9IGhvdyAmIEZMVVNIX1NZTkM7CkBAIC0xNDQzLDExICsxNDU0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogI2Vsc2UKLXN0YXRpYyBpbnQgbmZzX2NvbW1pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaG93KQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5mc19jb21taXRfdW5zdGFibGVfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJcmV0dXJuIDA7CkBAIC0xNTQ2LDcgKzE1NTIsNyBAQAogCiAJbmZzX2ZzY2FjaGVfcmVsZWFzZV9wYWdlKHBhZ2UsIEdGUF9LRVJORUwpOwogCi0JcmVxID0gbmZzX2ZpbmRfYW5kX2xvY2tfcmVxdWVzdChwYWdlKTsKKwlyZXEgPSBuZnNfZmluZF9hbmRfbG9ja19yZXF1ZXN0KHBhZ2UsIGZhbHNlKTsKIAlyZXQgPSBQVFJfRVJSKHJlcSk7CiAJaWYgKElTX0VSUihyZXEpKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCAzNTZlOTc2Li45NjMzN2E0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC01NzgsNyArNTc4LDkgQEAKIHN0YXRpYyB2b2lkIG9jZnMyX2Rpb19lbmRfaW8oc3RydWN0IGtpb2NiICppb2NiLAogCQkJICAgICBsb2ZmX3Qgb2Zmc2V0LAogCQkJICAgICBzc2l6ZV90IGJ5dGVzLAotCQkJICAgICB2b2lkICpwcml2YXRlKQorCQkJICAgICB2b2lkICpwcml2YXRlLAorCQkJICAgICBpbnQgcmV0LAorCQkJICAgICBib29sIGlzX2FzeW5jKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBsZXZlbDsKQEAgLTU5Miw2ICs1OTQsOSBAQAogCWlmICghbGV2ZWwpCiAJCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CiAJb2NmczJfcndfdW5sb2NrKGlub2RlLCBsZXZlbCk7CisKKwlpZiAoaXNfYXN5bmMpCisJCWFpb19jb21wbGV0ZShpb2NiLCByZXQsIDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYwppbmRleCAwY2QyNGNmLi41ZWZkZDM3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYwpAQCAtNDE5LDcgKzQxOSw3IEBACiAKIHN0YXRpYyBpbnQgZGVidWdfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGIgPSAoc3RydWN0IGRlYnVnX2J1ZmZlciAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCWlmIChkYikKIAkJa2ZyZWUoZGItPmJ1Zik7CkBAIC03MTUsNyArNzE1LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzZXEtPnByaXZhdGUgPSBkbDsKIAogCWRsbV9ncmFiKGRsbSk7CkBAIC03MzEsNyArNzMxLDcgQEAKIAogc3RhdGljIGludCBkZWJ1Z19sb2NrcmVzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHNlcV9maWxlICpzZXEgPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkZWJ1Z19sb2NrcmVzICpkbCA9IChzdHJ1Y3QgZGVidWdfbG9ja3JlcyAqKXNlcS0+cHJpdmF0ZTsKIAogCWlmIChkbC0+ZGxfcmVzKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZnMvZGxtZnMuYyBiL2ZzL29jZnMyL2RsbWZzL2RsbWZzLmMKaW5kZXggYjgzZDYxMC4uYmVmMzRkMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtZnMvZGxtZnMuYworKysgYi9mcy9vY2ZzMi9kbG1mcy9kbG1mcy5jCkBAIC0xODIsOCArMTgyLDcgQEAKIHsKIAlpbnQgbGV2ZWwsIHN0YXR1czsKIAlzdHJ1Y3QgZGxtZnNfaW5vZGVfcHJpdmF0ZSAqaXAgPSBETE1GU19JKGlub2RlKTsKLQlzdHJ1Y3QgZGxtZnNfZmlscF9wcml2YXRlICpmcCA9Ci0JCShzdHJ1Y3QgZGxtZnNfZmlscF9wcml2YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGxtZnNfZmlscF9wcml2YXRlICpmcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuYyBiL2ZzL29jZnMyL2RsbWdsdWUuYwppbmRleCAzOWViMTZhLi41ZTAyYTg5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmMKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCkBAIC0yOTY2LDcgKzI5NjYsNyBAQAogCiBzdGF0aWMgaW50IG9jZnMyX2RsbV9kZWJ1Z19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gKHN0cnVjdCBzZXFfZmlsZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG9jZnMyX2RsbV9zZXFfcHJpdiAqcHJpdiA9IHNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKnJlcyA9ICZwcml2LT5wX2l0ZXJfcmVzOwogCkBAIC0zMDAwLDcgKzMwMDAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzZXEgPSAoc3RydWN0IHNlcV9maWxlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc2VxLT5wcml2YXRlID0gcHJpdjsKIAogCW9jZnMyX2FkZF9sb2NrcmVzX3RyYWNraW5nKCZwcml2LT5wX2l0ZXJfcmVzLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggMGVhYTkyOS4uMDNhNzk5ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC0yNDcyLDcgKzI0NzIsNyBAQAogCWtmcmVlKG9zYi0+c2xvdF9yZWNvdmVyeV9nZW5lcmF0aW9ucyk7CiAJLyogRklYTUUKIAkgKiBUaGlzIGJlbG9uZ3MgaW4gam91cm5hbCBzaHV0ZG93biwgYnV0IGJlY2F1c2Ugd2UgaGF2ZSB0bwotCSAqIGFsbG9jYXRlIG9zYi0+am91cm5hbCBhdCB0aGUgc3RhcnQgb2Ygb2NmczJfaW5pdGFsaXplX29zYigpLAorCSAqIGFsbG9jYXRlIG9zYi0+am91cm5hbCBhdCB0aGUgc3RhcnQgb2Ygb2NmczJfaW5pdGlhbGl6ZV9vc2IoKSwKIAkgKiB3ZSBmcmVlIGl0IGhlcmUuCiAJICovCiAJa2ZyZWUob3NiLT5qb3VybmFsKTsKZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwppbmRleCA1NDYzMjY2Li4wZDFmYTNkIDEwMDY0NAotLS0gYS9mcy9vcGVuLmMKKysrIGIvZnMvb3Blbi5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogCWVycm9yID0gbG9ja3NfdmVyaWZ5X3RydW5jYXRlKGlub2RlLCBOVUxMLCBsZW5ndGgpOwogCWlmICghZXJyb3IpCi0JCWVycm9yID0gc2VjdXJpdHlfcGF0aF90cnVuY2F0ZSgmcGF0aCwgbGVuZ3RoLCAwKTsKKwkJZXJyb3IgPSBzZWN1cml0eV9wYXRoX3RydW5jYXRlKCZwYXRoKTsKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IGRvX3RydW5jYXRlKHBhdGguZGVudHJ5LCBsZW5ndGgsIDAsIE5VTEwpOwogCkBAIC0xNjUsOCArMTY1LDcgQEAKIAogCWVycm9yID0gbG9ja3NfdmVyaWZ5X3RydW5jYXRlKGlub2RlLCBmaWxlLCBsZW5ndGgpOwogCWlmICghZXJyb3IpCi0JCWVycm9yID0gc2VjdXJpdHlfcGF0aF90cnVuY2F0ZSgmZmlsZS0+Zl9wYXRoLCBsZW5ndGgsCi0JCQkJCSAgICAgICBBVFRSX01USU1FfEFUVFJfQ1RJTUUpOworCQllcnJvciA9IHNlY3VyaXR5X3BhdGhfdHJ1bmNhdGUoJmZpbGUtPmZfcGF0aCk7CiAJaWYgKCFlcnJvcikKIAkJZXJyb3IgPSBkb190cnVuY2F0ZShkZW50cnksIGxlbmd0aCwgQVRUUl9NVElNRXxBVFRSX0NUSU1FLCBmaWxlKTsKIG91dF9wdXRmOgpAQCAtMzY3LDcgKzM2Niw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gaW5vZGVfcGVybWlzc2lvbihwYXRoLmRlbnRyeS0+ZF9pbm9kZSwgTUFZX0VYRUMgfCBNQVlfQUNDRVNTKTsKKwllcnJvciA9IGlub2RlX3Blcm1pc3Npb24ocGF0aC5kZW50cnktPmRfaW5vZGUsIE1BWV9FWEVDIHwgTUFZX0NIRElSKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZHB1dF9hbmRfb3V0OwogCkBAIC0zOTYsNyArMzk1LDcgQEAKIAlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0X3B1dGY7CiAKLQllcnJvciA9IGlub2RlX3Blcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDIHwgTUFZX0FDQ0VTUyk7CisJZXJyb3IgPSBpbm9kZV9wZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQyB8IE1BWV9DSERJUik7CiAJaWYgKCFlcnJvcikKIAkJc2V0X2ZzX3B3ZChjdXJyZW50LT5mcywgJmZpbGUtPmZfcGF0aCk7CiBvdXRfcHV0ZjoKQEAgLTQxNCw3ICs0MTMsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQllcnJvciA9IGlub2RlX3Blcm1pc3Npb24ocGF0aC5kZW50cnktPmRfaW5vZGUsIE1BWV9FWEVDIHwgTUFZX0FDQ0VTUyk7CisJZXJyb3IgPSBpbm9kZV9wZXJtaXNzaW9uKHBhdGguZGVudHJ5LT5kX2lub2RlLCBNQVlfRVhFQyB8IE1BWV9DSERJUik7CiAJaWYgKGVycm9yKQogCQlnb3RvIGRwdXRfYW5kX291dDsKIApkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IDVkY2Q0YjAuLjcyYzUyNjUgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTQ1OSw3ICs0NTksNiBAQAogCX0KIAogCS8qIGV2ZXJ5dGhpbmcgaXMgdXAgYW5kIHJ1bm5pbmcsIGNvbW1lbmNlICovCi0JSU5JVF9SQ1VfSEVBRCgmcC0+cmN1X2hlYWQpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihwdGJsLT5wYXJ0W3BhcnRub10sIHApOwogCiAJLyogc3VwcHJlc3MgdWV2ZW50IGlmIHRoZSBkaXNrIHN1cHJlc3NlcyBpdCAqLwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCmluZGV4IDliNThkMzguLmZmZjY1NzIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYXJyYXkuYworKysgYi9mcy9wcm9jL2FycmF5LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlpZiAodHJhY2VyKQogCQkJdHBpZCA9IHRhc2tfcGlkX25yX25zKHRyYWNlciwgbnMpOwogCX0KLQljcmVkID0gZ2V0X2NyZWQoKHN0cnVjdCBjcmVkICopIF9fdGFza19jcmVkKHApKTsKKwljcmVkID0gZ2V0X3Rhc2tfY3JlZChwKTsKIAlzZXFfcHJpbnRmKG0sCiAJCSJTdGF0ZTpcdCVzXG4iCiAJCSJUZ2lkOlx0JWRcbiIKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCmluZGV4IDBmMjJmZGEuLjI5ZGI3MjIwMyAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCQlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsCiAJCQkJdG9fcmVhbF91c2VkX3NwYWNlKGlub2RlLCBpbm9kZS0+aV9ibG9ja3MsCiAJCQkJCQkgICBTRF9WMl9TSVpFKSk7Ci0JCS8qIHJlYWQgcGVyc2lzdGVudCBpbm9kZSBhdHRyaWJ1dGVzIGZyb20gc2QgYW5kIGluaXRhbGlzZQorCQkvKiByZWFkIHBlcnNpc3RlbnQgaW5vZGUgYXR0cmlidXRlcyBmcm9tIHNkIGFuZCBpbml0aWFsaXNlCiAJCSAgIGdlbmVyaWMgaW5vZGUgZmxhZ3MgZnJvbSB0aGVtICovCiAJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzID0gc2RfdjJfYXR0cnMoc2QpOwogCQlzZF9hdHRyc190b19pX2F0dHJzKHNkX3YyX2F0dHJzKHNkKSwgaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IDFiZWFhNzMuLjFiMjdiNTYgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTU5Myw3ICs1OTMsOCBAQAogICogQG1vZGU6IGZpbGUgcGVybWlzc2lvbnMuCiAgKgogICovCi1pbnQgc3lzZnNfY2htb2RfZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgbW9kZV90IG1vZGUpCitpbnQgc3lzZnNfY2htb2RfZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZDsKIAlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9scHQuYyBiL2ZzL3ViaWZzL2xwdC5jCmluZGV4IGFkN2Y2N2IuLjAwODRhMzMgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwdC5jCisrKyBiL2ZzL3ViaWZzL2xwdC5jCkBAIC0xNDU3LDEzICsxNDU3LDEzIEBACiAJCXNoZnQgLT0gVUJJRlNfTFBUX0ZBTk9VVF9TSElGVDsKIAkJbm5vZGUgPSB1Ymlmc19nZXRfbm5vZGUoYywgbm5vZGUsIGlpcCk7CiAJCWlmIChJU19FUlIobm5vZGUpKQotCQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihubm9kZSkpOworCQkJcmV0dXJuIEVSUl9DQVNUKG5ub2RlKTsKIAl9CiAJaWlwID0gKChpID4+IHNoZnQpICYgKFVCSUZTX0xQVF9GQU5PVVQgLSAxKSk7CiAJc2hmdCAtPSBVQklGU19MUFRfRkFOT1VUX1NISUZUOwogCXBub2RlID0gdWJpZnNfZ2V0X3Bub2RlKGMsIG5ub2RlLCBpaXApOwogCWlmIChJU19FUlIocG5vZGUpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHBub2RlKSk7CisJCXJldHVybiBFUlJfQ0FTVChwbm9kZSk7CiAJaWlwID0gKGkgJiAoVUJJRlNfTFBUX0ZBTk9VVCAtIDEpKTsKIAlkYmdfbHAoIkxFQiAlZCwgZnJlZSAlZCwgZGlydHkgJWQsIGZsYWdzICVkIiwgbG51bSwKIAkgICAgICAgcG5vZGUtPmxwcm9wc1tpaXBdLmZyZWUsIHBub2RlLT5scHJvcHNbaWlwXS5kaXJ0eSwKQEAgLTE1ODYsNyArMTU4Niw3IEBACiAJbm5vZGUgPSBjLT5ucm9vdDsKIAlubm9kZSA9IGRpcnR5X2Nvd19ubm9kZShjLCBubm9kZSk7CiAJaWYgKElTX0VSUihubm9kZSkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIobm5vZGUpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKG5ub2RlKTsKIAlpID0gbG51bSAtIGMtPm1haW5fZmlyc3Q7CiAJc2hmdCA9IGMtPmxwdF9oZ2h0ICogVUJJRlNfTFBUX0ZBTk9VVF9TSElGVDsKIAlmb3IgKGggPSAxOyBoIDwgYy0+bHB0X2hnaHQ7IGgrKykgewpAQCAtMTU5NCwxOSArMTU5NCwxOSBAQAogCQlzaGZ0IC09IFVCSUZTX0xQVF9GQU5PVVRfU0hJRlQ7CiAJCW5ub2RlID0gdWJpZnNfZ2V0X25ub2RlKGMsIG5ub2RlLCBpaXApOwogCQlpZiAoSVNfRVJSKG5ub2RlKSkKLQkJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIobm5vZGUpKTsKKwkJCXJldHVybiBFUlJfQ0FTVChubm9kZSk7CiAJCW5ub2RlID0gZGlydHlfY293X25ub2RlKGMsIG5ub2RlKTsKIAkJaWYgKElTX0VSUihubm9kZSkpCi0JCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKG5ub2RlKSk7CisJCQlyZXR1cm4gRVJSX0NBU1Qobm5vZGUpOwogCX0KIAlpaXAgPSAoKGkgPj4gc2hmdCkgJiAoVUJJRlNfTFBUX0ZBTk9VVCAtIDEpKTsKIAlzaGZ0IC09IFVCSUZTX0xQVF9GQU5PVVRfU0hJRlQ7CiAJcG5vZGUgPSB1Ymlmc19nZXRfcG5vZGUoYywgbm5vZGUsIGlpcCk7CiAJaWYgKElTX0VSUihwbm9kZSkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIocG5vZGUpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHBub2RlKTsKIAlwbm9kZSA9IGRpcnR5X2Nvd19wbm9kZShjLCBwbm9kZSk7CiAJaWYgKElTX0VSUihwbm9kZSkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIocG5vZGUpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHBub2RlKTsKIAlpaXAgPSAoaSAmIChVQklGU19MUFRfRkFOT1VUIC0gMSkpOwogCWRiZ19scCgiTEVCICVkLCBmcmVlICVkLCBkaXJ0eSAlZCwgZmxhZ3MgJWQiLCBsbnVtLAogCSAgICAgICBwbm9kZS0+bHByb3BzW2lpcF0uZnJlZSwgcG5vZGUtPmxwcm9wc1tpaXBdLmRpcnR5LApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvbHB0X2NvbW1pdC5jIGIvZnMvdWJpZnMvbHB0X2NvbW1pdC5jCmluZGV4IDEzY2I3YTQuLmQxMjUzNWIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwdF9jb21taXQuYworKysgYi9mcy91Ymlmcy9scHRfY29tbWl0LmMKQEAgLTY0Niw3ICs2NDYsNyBAQAogCQlzaGZ0IC09IFVCSUZTX0xQVF9GQU5PVVRfU0hJRlQ7CiAJCW5ub2RlID0gdWJpZnNfZ2V0X25ub2RlKGMsIG5ub2RlLCBpaXApOwogCQlpZiAoSVNfRVJSKG5ub2RlKSkKLQkJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIobm5vZGUpKTsKKwkJCXJldHVybiBFUlJfQ0FTVChubm9kZSk7CiAJfQogCWlpcCA9ICgoaSA+PiBzaGZ0KSAmIChVQklGU19MUFRfRkFOT1VUIC0gMSkpOwogCXJldHVybiB1Ymlmc19nZXRfcG5vZGUoYywgbm5vZGUsIGlpcCk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9yZWNvdmVyeS5jIGIvZnMvdWJpZnMvcmVjb3ZlcnkuYwppbmRleCAxMDljNmVhLi5kYWFlOWUxIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9yZWNvdmVyeS5jCisrKyBiL2ZzL3ViaWZzL3JlY292ZXJ5LmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyBuZWVkZWQgdG8gcmVjb3ZlciBmcm9tIHVuY2xlYW4gdW4tbW91bnRzLgogICogV2hlbiBVQklGUyBpcyBtb3VudGVkLCBpdCBjaGVja3MgYSBmbGFnIG9uIHRoZSBtYXN0ZXIgbm9kZSB0byBkZXRlcm1pbmUgaWYKICAqIGFuIHVuLW1vdW50IHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBJZiBub3QsIHRoZSBwcm9jZXNzIG9mIG1vdW50aW5nCi0gKiBpbmNvcnBhcmF0ZXMgYWRkaXRpb25hbCBjaGVja2luZyBhbmQgZml4aW5nIG9mIG9uLWZsYXNoIGRhdGEgc3RydWN0dXJlcy4KKyAqIGluY29ycG9yYXRlcyBhZGRpdGlvbmFsIGNoZWNraW5nIGFuZCBmaXhpbmcgb2Ygb24tZmxhc2ggZGF0YSBzdHJ1Y3R1cmVzLgogICogVUJJRlMgYWx3YXlzIGNsZWFucyBhd2F5IGFsbCByZW1uYW50cyBvZiBhbiB1bmNsZWFuIHVuLW1vdW50LCBzbyB0aGF0CiAgKiBlcnJvcnMgZG8gbm90IGFjY3VtdWxhdGUuIEhvd2V2ZXIgVUJJRlMgZGVmZXJzIHJlY292ZXJ5IGlmIGl0IGlzIG1vdW50ZWQKICAqIHJlYWQtb25seSwgYW5kIHRoZSBmbGFzaCBpcyBub3QgbW9kaWZpZWQgaW4gdGhhdCBjYXNlLgpAQCAtMTA2Myw4ICsxMDYzLDIxIEBACiAJfQogCWVyciA9IHViaWZzX2ZpbmRfZGlydHlfbGViKGMsICZscCwgd2J1Zi0+b2ZmcywgMik7CiAJaWYgKGVycikgewotCQlpZiAoZXJyID09IC1FTk9TUEMpCi0JCQlkYmdfZXJyKCJjb3VsZCBub3QgZmluZCBhIGRpcnR5IExFQiIpOworCQkvKgorCQkgKiBUaGVyZSBhcmUgbm8gZGlydHkgb3IgZW1wdHkgTEVCcyBzdWJqZWN0IHRvIGhlcmUgYmVpbmcKKwkJICogZW5vdWdoIGZvciB0aGUgaW5kZXguIFRyeSB0byB1c2UKKwkJICogJ3ViaWZzX2ZpbmRfZnJlZV9sZWJfZm9yX2lkeCgpJywgd2hpY2ggd2lsbCByZXR1cm4gYW55IGVtcHR5CisJCSAqIExFQnMgKGlnbm9yaW5nIGluZGV4IHJlcXVpcmVtZW50cykuIElmIHRoZSBpbmRleCB0aGVuCisJCSAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggTEVCcyB0aGUgcmVjb3ZlcnkgY29tbWl0IHdpbGwgZmFpbCAtCisJCSAqIHdoaWNoIGlzIHRoZSAgc2FtZSByZXN1bHQgYW55d2F5IGkuZS4gcmVjb3ZlcnkgZmFpbHMuIFNvCisJCSAqIHRoZXJlIGlzIG5vIHByb2JsZW0gaWdub3JpbmcgaW5kZXggIHJlcXVpcmVtZW50cyBhbmQganVzdAorCQkgKiBncmFiYmluZyBhIGZyZWUgTEVCIHNpbmNlIHdlIGhhdmUgYWxyZWFkeSBlc3RhYmxpc2hlZCB0aGVyZQorCQkgKiBpcyBub3QgYSBkaXJ0eSBMRUIgd2UgY291bGQgaGF2ZSB1c2VkIGluc3RlYWQuCisJCSAqLworCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKKwkJCWRiZ19yY3ZyeSgiY291bGQgbm90IGZpbmQgYSBkaXJ0eSBMRUIiKTsKKwkJCWdvdG8gZmluZF9mcmVlOworCQl9CiAJCXJldHVybiBlcnI7CiAJfQogCXViaWZzX2Fzc2VydCghKGxwLmZsYWdzICYgTFBST1BTX0lOREVYKSk7CkBAIC0xMTM5LDggKzExNTIsOCBAQAogZmluZF9mcmVlOgogCS8qCiAJICogVGhlcmUgaXMgbm8gR0MgaGVhZCBMRUIgb3IgdGhlIGZyZWUgc3BhY2UgaW4gdGhlIEdDIGhlYWQgTEVCIGlzIHRvbwotCSAqIHNtYWxsLiBBbGxvY2F0ZSBnY19sbnVtIGJ5IGNhbGxpbmcgJ3ViaWZzX2ZpbmRfZnJlZV9sZWJfZm9yX2lkeCgpJyBzbwotCSAqIEdDIGlzIG5vdCBydW4uCisJICogc21hbGwsIG9yIHRoZXJlIGFyZSBub3QgZGlydHkgTEVCcy4gQWxsb2NhdGUgZ2NfbG51bSBieSBjYWxsaW5nCisJICogJ3ViaWZzX2ZpbmRfZnJlZV9sZWJfZm9yX2lkeCgpJyBzbyBHQyBpcyBub3QgcnVuLgogCSAqLwogCWxudW0gPSB1Ymlmc19maW5kX2ZyZWVfbGViX2Zvcl9pZHgoYyk7CiAJaWYgKGxudW0gPCAwKSB7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zdXBlci5jIGIvZnMvdWJpZnMvc3VwZXIuYwppbmRleCA0ZDJmMjE1Li41ZmM1YTA5IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zdXBlci5jCisrKyBiL2ZzL3ViaWZzL3N1cGVyLmMKQEAgLTEzMDcsNiArMTMwNyw4IEBACiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0X29ycGhhbnM7CiAJCQllcnIgPSB1Ymlmc19yY3ZyeV9nY19jb21taXQoYyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X29ycGhhbnM7CiAJCX0gZWxzZSB7CiAJCQllcnIgPSB0YWtlX2djX2xudW0oYyk7CiAJCQlpZiAoZXJyKQpAQCAtMTMxOCw3ICsxMzIwLDcgQEAKIAkJCSAqLwogCQkJZXJyID0gdWJpZnNfbGViX3VubWFwKGMsIGMtPmdjX2xudW0pOwogCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOworCQkJCWdvdG8gb3V0X29ycGhhbnM7CiAJCX0KIAogCQllcnIgPSBkYmdfY2hlY2tfbHByb3BzKGMpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlIGIvZnMveGZzL01ha2VmaWxlCmluZGV4IGM4ZmIxM2YuLjBkY2U5NjkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9NYWtlZmlsZQorKysgYi9mcy94ZnMvTWFrZWZpbGUKQEAgLTg3LDExICs4Nyw5IEBACiAJCQkJICAgeGZzX3RyYW5zX2J1Zi5vIFwKIAkJCQkgICB4ZnNfdHJhbnNfZXh0ZnJlZS5vIFwKIAkJCQkgICB4ZnNfdHJhbnNfaW5vZGUubyBcCi0JCQkJICAgeGZzX3RyYW5zX2l0ZW0ubyBcCiAJCQkJICAgeGZzX3V0aWxzLm8gXAogCQkJCSAgIHhmc192bm9kZW9wcy5vIFwKLQkJCQkgICB4ZnNfcncubyBcCi0JCQkJICAgeGZzX2Rtb3BzLm8KKwkJCQkgICB4ZnNfcncubwogCiB4ZnMtJChDT05GSUdfWEZTX1RSQUNFKQkJKz0geGZzX2J0cmVlX3RyYWNlLm8KIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYWNsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYwppbmRleCA5Zjc2OWI1Li5iMjc3MTg2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCWludCBlcnJvciA9IC1FQUdBSU47CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKwl0cmFjZV94ZnNfY2hlY2tfYWNsKGlwKTsKIAogCS8qCiAJICogSWYgdGhlcmUgaXMgbm8gYXR0cmlidXRlIGZvcmsgbm8gQUNMIGV4aXN0cyBvbiB0aGlzIGlub2RlIGFuZApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IDM0NjQwZDYuLmQyNGU3OGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTIxLDE5ICsyMSwxMiBAQAogI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19pb21hcC5oIgpAQCAtOTIsMTggKzg1LDE1IEBACiB4ZnNfY291bnRfcGFnZV9zdGF0ZSgKIAlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCiAJaW50CQkJKmRlbGFsbG9jLAotCWludAkJCSp1bm1hcHBlZCwKIAlpbnQJCQkqdW53cml0dGVuKQogewogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOwogCi0JKmRlbGFsbG9jID0gKnVubWFwcGVkID0gKnVud3JpdHRlbiA9IDA7CisJKmRlbGFsbG9jID0gKnVud3JpdHRlbiA9IDA7CiAKIAliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJZG8gewotCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJiAhYnVmZmVyX21hcHBlZChiaCkpCi0JCQkoKnVubWFwcGVkKSA9IDE7Ci0JCWVsc2UgaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkpCiAJCQkoKnVud3JpdHRlbikgPSAxOwogCQllbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKQogCQkJKCpkZWxhbGxvYykgPSAxOwpAQCAtMjEyLDIzICsyMDIsMTcgQEAKIH0KIAogLyoKLSAqIFNjaGVkdWxlIElPIGNvbXBsZXRpb24gaGFuZGxpbmcgb24gYSB4ZnNkYXRhZCBpZiB0aGlzIHdhcwotICogdGhlIGZpbmFsIGhvbGQgb24gdGhpcyBpb2VuZC4gSWYgd2UgYXJlIGFza2VkIHRvIHdhaXQsCi0gKiBmbHVzaCB0aGUgd29ya3F1ZXVlLgorICogU2NoZWR1bGUgSU8gY29tcGxldGlvbiBoYW5kbGluZyBvbiB0aGUgZmluYWwgcHV0IG9mIGFuIGlvZW5kLgogICovCiBTVEFUSUMgdm9pZAogeGZzX2ZpbmlzaF9pb2VuZCgKLQl4ZnNfaW9lbmRfdAkqaW9lbmQsCi0JaW50CQl3YWl0KQorCXN0cnVjdCB4ZnNfaW9lbmQJKmlvZW5kKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpb2VuZC0+aW9fcmVtYWluaW5nKSkgewotCQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0KLQkJd3EgPSAoaW9lbmQtPmlvX3R5cGUgPT0gSU9fVU5XUklUVEVOKSA/Ci0JCQl4ZnNjb252ZXJ0ZF93b3JrcXVldWUgOiB4ZnNkYXRhZF93b3JrcXVldWU7Ci0JCXF1ZXVlX3dvcmsod3EsICZpb2VuZC0+aW9fd29yayk7Ci0JCWlmICh3YWl0KQotCQkJZmx1c2hfd29ya3F1ZXVlKHdxKTsKKwkJaWYgKGlvZW5kLT5pb190eXBlID09IElPX1VOV1JJVFRFTikKKwkJCXF1ZXVlX3dvcmsoeGZzY29udmVydGRfd29ya3F1ZXVlLCAmaW9lbmQtPmlvX3dvcmspOworCQllbHNlCisJCQlxdWV1ZV93b3JrKHhmc2RhdGFkX3dvcmtxdWV1ZSwgJmlvZW5kLT5pb193b3JrKTsKIAl9CiB9CiAKQEAgLTI3MiwxMSArMjU2LDI1IEBACiAJICovCiAJaWYgKGVycm9yID09IEVBR0FJTikgewogCQlhdG9taWNfaW5jKCZpb2VuZC0+aW9fcmVtYWluaW5nKTsKLQkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCwgMCk7CisJCXhmc19maW5pc2hfaW9lbmQoaW9lbmQpOwogCQkvKiBlbnN1cmUgd2UgZG9uJ3Qgc3BpbiBvbiBibG9ja2VkIGlvZW5kcyAqLwogCQlkZWxheSgxKTsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQlpZiAoaW9lbmQtPmlvX2lvY2IpCisJCQlhaW9fY29tcGxldGUoaW9lbmQtPmlvX2lvY2IsIGlvZW5kLT5pb19yZXN1bHQsIDApOwogCQl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CisJfQorfQorCisvKgorICogQ2FsbCBJTyBjb21wbGV0aW9uIGhhbmRsaW5nIGluIGNhbGxlciBjb250ZXh0IG9uIHRoZSBmaW5hbCBwdXQgb2YgYW4gaW9lbmQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZmluaXNoX2lvZW5kX3N5bmMoCisJc3RydWN0IHhmc19pb2VuZAkqaW9lbmQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvZW5kLT5pb19yZW1haW5pbmcpKQorCQl4ZnNfZW5kX2lvKCZpb2VuZC0+aW9fd29yayk7CiB9CiAKIC8qCkBAIC0zMDksNiArMzA3LDggQEAKIAlhdG9taWNfaW5jKCZYRlNfSShpb2VuZC0+aW9faW5vZGUpLT5pX2lvY291bnQpOwogCWlvZW5kLT5pb19vZmZzZXQgPSAwOwogCWlvZW5kLT5pb19zaXplID0gMDsKKwlpb2VuZC0+aW9faW9jYiA9IE5VTEw7CisJaW9lbmQtPmlvX3Jlc3VsdCA9IDA7CiAKIAlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2lvKTsKIAlyZXR1cm4gaW9lbmQ7CkBAIC0zNTgsNyArMzU4LDcgQEAKIAliaW8tPmJpX2VuZF9pbyA9IE5VTEw7CiAJYmlvX3B1dChiaW8pOwogCi0JeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCwgMCk7CisJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7CiB9CiAKIFNUQVRJQyB2b2lkCkBAIC01MDAsNyArNTAwLDcgQEAKIAkJfQogCQlpZiAoYmlvKQogCQkJeGZzX3N1Ym1pdF9pb2VuZF9iaW8od2JjLCBpb2VuZCwgYmlvKTsKLQkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCwgMCk7CisJCXhmc19maW5pc2hfaW9lbmQoaW9lbmQpOwogCX0gd2hpbGUgKChpb2VuZCA9IG5leHQpICE9IE5VTEwpOwogfQogCkBAIC02MTQsMzEgKzYxNCwzMCBAQAogU1RBVElDIHVuc2lnbmVkIGludAogeGZzX3Byb2JlX3BhZ2UoCiAJc3RydWN0IHBhZ2UJCSpwYWdlLAotCXVuc2lnbmVkIGludAkJcGdfb2Zmc2V0LAotCWludAkJCW1hcHBlZCkKKwl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCkKIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKIAlpbnQJCQlyZXQgPSAwOwogCiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCiAJCXJldHVybiAwOworCWlmICghUGFnZURpcnR5KHBhZ2UpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBhZ2UtPm1hcHBpbmcpCisJCXJldHVybiAwOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJcmV0dXJuIDA7CiAKLQlpZiAocGFnZS0+bWFwcGluZyAmJiBQYWdlRGlydHkocGFnZSkpIHsKLQkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKLQkJCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOwotCi0JCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ci0JCQlkbyB7Ci0JCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotCQkJCQlicmVhazsKLQkJCQlpZiAobWFwcGVkICE9IGJ1ZmZlcl9tYXBwZWQoYmgpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgKz0gYmgtPmJfc2l6ZTsKLQkJCQlpZiAocmV0ID49IHBnX29mZnNldCkKLQkJCQkJYnJlYWs7Ci0JCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwotCQl9IGVsc2UKLQkJCXJldCA9IG1hcHBlZCA/IDAgOiBQQUdFX0NBQ0hFX1NJWkU7Ci0JfQorCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlkbyB7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWJyZWFrOworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKQorCQkJYnJlYWs7CisJCXJldCArPSBiaC0+Yl9zaXplOworCQlpZiAocmV0ID49IHBnX29mZnNldCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQ4LDggKzY0Nyw3IEBACiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJc3RydWN0IHBhZ2UJCSpzdGFydHBhZ2UsCiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmhlYWQsCi0JaW50CQkJbWFwcGVkKQorCXN0cnVjdCBidWZmZXJfaGVhZAkqaGVhZCkKIHsKIAlzdHJ1Y3QgcGFnZXZlYwkJcHZlYzsKIAlwZ29mZl90CQkJdGluZGV4LCB0bGFzdCwgdGxvZmY7CkBAIC02NTgsNyArNjU2LDcgQEAKIAogCS8qIEZpcnN0IHN1bSBmb3J3YXJkcyBpbiB0aGlzIHBhZ2UgKi8KIAlkbyB7Ci0JCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSB8fCAobWFwcGVkICE9IGJ1ZmZlcl9tYXBwZWQoYmgpKSkKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpIHx8ICFidWZmZXJfbWFwcGVkKGJoKSkKIAkJCXJldHVybiB0b3RhbDsKIAkJdG90YWwgKz0gYmgtPmJfc2l6ZTsKIAl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwpAQCAtNjkyLDcgKzY5MCw3IEBACiAJCQkJcGdfb2Zmc2V0ID0gUEFHRV9DQUNIRV9TSVpFOwogCiAJCQlpZiAocGFnZS0+aW5kZXggPT0gdGluZGV4ICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgewotCQkJCXBnX2xlbiA9IHhmc19wcm9iZV9wYWdlKHBhZ2UsIHBnX29mZnNldCwgbWFwcGVkKTsKKwkJCQlwZ19sZW4gPSB4ZnNfcHJvYmVfcGFnZShwYWdlLCBwZ19vZmZzZXQpOwogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJfQogCkBAIC03NjEsNyArNzU5LDYgQEAKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqaW1hcCwKIAl4ZnNfaW9lbmRfdAkJKippb2VuZHAsCiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCi0JaW50CQkJc3RhcnRpbywKIAlpbnQJCQlhbGxfYmgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKmhlYWQ7CkBAIC04MzIsMTkgKzgyOSwxNCBAQAogCQkJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKIAogCQkJeGZzX21hcF9hdF9vZmZzZXQoaW5vZGUsIGJoLCBpbWFwLCBvZmZzZXQpOwotCQkJaWYgKHN0YXJ0aW8pIHsKLQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAotCQkJCQkJdHlwZSwgaW9lbmRwLCBkb25lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQkJdW5sb2NrX2J1ZmZlcihiaCk7Ci0JCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCQkJfQorCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwgdHlwZSwKKwkJCQkJIGlvZW5kcCwgZG9uZSk7CisKIAkJCXBhZ2VfZGlydHktLTsKIAkJCWNvdW50Kys7CiAJCX0gZWxzZSB7CiAJCQl0eXBlID0gSU9fTkVXOwotCQkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGFsbF9iaCAmJiBzdGFydGlvKSB7CisJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYWxsX2JoKSB7CiAJCQkJbG9ja19idWZmZXIoYmgpOwogCQkJCXhmc19hZGRfdG9faW9lbmQoaW5vZGUsIGJoLCBvZmZzZXQsCiAJCQkJCQl0eXBlLCBpb2VuZHAsIGRvbmUpOwpAQCAtODU5LDE0ICs4NTEsMTIgQEAKIAlpZiAodXB0b2RhdGUgJiYgYmggPT0gaGVhZCkKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCi0JaWYgKHN0YXJ0aW8pIHsKLQkJaWYgKGNvdW50KSB7Ci0JCQl3YmMtPm5yX3RvX3dyaXRlLS07Ci0JCQlpZiAod2JjLT5ucl90b193cml0ZSA8PSAwKQotCQkJCWRvbmUgPSAxOwotCQl9Ci0JCXhmc19zdGFydF9wYWdlX3dyaXRlYmFjayhwYWdlLCAhcGFnZV9kaXJ0eSwgY291bnQpOworCWlmIChjb3VudCkgeworCQl3YmMtPm5yX3RvX3dyaXRlLS07CisJCWlmICh3YmMtPm5yX3RvX3dyaXRlIDw9IDApCisJCQlkb25lID0gMTsKIAl9CisJeGZzX3N0YXJ0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UsICFwYWdlX2RpcnR5LCBjb3VudCk7CiAKIAlyZXR1cm4gZG9uZTsKICBmYWlsX3VubG9ja19wYWdlOgpAQCAtODg2LDcgKzg3Niw2IEBACiAJc3RydWN0IHhmc19ibWJ0X2lyZWMJKmltYXAsCiAJeGZzX2lvZW5kX3QJCSoqaW9lbmRwLAogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAotCWludAkJCXN0YXJ0aW8sCiAJaW50CQkJYWxsX2JoLAogCXBnb2ZmX3QJCQl0bGFzdCkKIHsKQEAgLTkwMiw3ICs4OTEsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CiAJCQlkb25lID0geGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcHZlYy5wYWdlc1tpXSwgdGluZGV4KyssCi0JCQkJCWltYXAsIGlvZW5kcCwgd2JjLCBzdGFydGlvLCBhbGxfYmgpOworCQkJCQlpbWFwLCBpb2VuZHAsIHdiYywgYWxsX2JoKTsKIAkJCWlmIChkb25lKQogCQkJCWJyZWFrOwogCQl9CkBAIC05ODEsNyArOTcwLDcgQEAKIAkJICovCiAJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBvZmZzZXRfZnNiLCAxLAogCQkJCVhGU19CTUFQSV9FTlRJUkUsICBOVUxMLCAwLCAmaW1hcCwKLQkJCQkmbmltYXBzLCBOVUxMLCBOVUxMKTsKKwkJCQkmbmltYXBzLCBOVUxMKTsKIAogCQlpZiAoZXJyb3IpIHsKIAkJCS8qIHNvbWV0aGluZyBzY3Jld2VkLCBqdXN0IGJhaWwgKi8KQEAgLTEwMDksNyArOTk4LDcgQEAKIAkJICovCiAJCXhmc19ibWFwX2luaXQoJmZsaXN0LCAmZmlyc3RibG9jayk7CiAJCWVycm9yID0geGZzX2J1bm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIDEsIDAsIDEsICZmaXJzdGJsb2NrLAotCQkJCQkmZmxpc3QsIE5VTEwsICZkb25lKTsKKwkJCQkJJmZsaXN0LCAmZG9uZSk7CiAKIAkJQVNTRVJUKCFmbGlzdC54YmZfY291bnQgJiYgIWZsaXN0LnhiZl9maXJzdCk7CiAJCWlmIChlcnJvcikgewpAQCAtMTAzMiw1MCArMTAyMSw2NiBAQAogfQogCiAvKgotICogQ2FsbGluZyB0aGlzIHdpdGhvdXQgc3RhcnRpbyBzZXQgbWVhbnMgd2UgYXJlIGJlaW5nIGFza2VkIHRvIG1ha2UgYSBkaXJ0eQotICogcGFnZSByZWFkeSBmb3IgZnJlZWluZyBpdCdzIGJ1ZmZlcnMuICBXaGVuIGNhbGxlZCB3aXRoIHN0YXJ0aW8gc2V0IHRoZW4KLSAqIHdlIGFyZSBjb21pbmcgZnJvbSB3cml0ZXBhZ2UuCisgKiBXcml0ZSBvdXQgYSBkaXJ0eSBwYWdlLgogICoKLSAqIFdoZW4gY2FsbGVkIHdpdGggc3RhcnRpbyBzZXQgaXQgaXMgaW1wb3J0YW50IHRoYXQgd2Ugd3JpdGUgdGhlIFdIT0xFCi0gKiBwYWdlIGlmIHBvc3NpYmxlLgotICogVGhlIGJoLT5iX3N0YXRlJ3MgY2Fubm90IGtub3cgaWYgYW55IG9mIHRoZSBibG9ja3Mgb3Igd2hpY2ggYmxvY2sgZm9yCi0gKiB0aGF0IG1hdHRlciBhcmUgZGlydHkgZHVlIHRvIG1tYXAgd3JpdGVzLCBhbmQgdGhlcmVmb3JlIGJoIHVwdG9kYXRlIGlzCi0gKiBvbmx5IHZhbGlkIGlmIHRoZSBwYWdlIGl0c2VsZiBpc24ndCBjb21wbGV0ZWx5IHVwdG9kYXRlLiAgU29tZSBsYXllcnMKLSAqIG1heSBjbGVhciB0aGUgcGFnZSBkaXJ0eSBmbGFnIHByaW9yIHRvIGNhbGxpbmcgd3JpdGUgcGFnZSwgdW5kZXIgdGhlCi0gKiBhc3N1bXB0aW9uIHRoZSBlbnRpcmUgcGFnZSB3aWxsIGJlIHdyaXR0ZW4gb3V0OyBieSBub3Qgd3JpdGluZyBvdXQgdGhlCi0gKiB3aG9sZSBwYWdlIHRoZSBwYWdlIGNhbiBiZSByZXVzZWQgYmVmb3JlIGFsbCB2YWxpZCBkaXJ0eSBkYXRhIGlzCi0gKiB3cml0dGVuIG91dC4gIE5vdGU6IGluIHRoZSBjYXNlIG9mIGEgcGFnZSB0aGF0IGhhcyBiZWVuIGRpcnR5J2QgYnkKLSAqIG1hcHdyaXRlIGFuZCBidXQgcGFydGlhbGx5IHNldHVwIGJ5IGJsb2NrX3ByZXBhcmVfd3JpdGUgdGhlCi0gKiBiaC0+Yl9zdGF0ZXMncyB3aWxsIG5vdCBhZ3JlZSBhbmQgb25seSBvbmVzIHNldHVwIGJ5IEJQVy9CQ1cgd2lsbCBoYXZlCi0gKiB2YWxpZCBzdGF0ZSwgdGh1cyB0aGUgd2hvbGUgcGFnZSBtdXN0IGJlIHdyaXR0ZW4gb3V0IHRoaW5nLgorICogRm9yIGRlbGFsbG9jIHNwYWNlIG9uIHRoZSBwYWdlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2UgYW5kIGZsdXNoIGl0LgorICogRm9yIHVud3JpdHRlbiBzcGFjZSBvbiB0aGUgcGFnZSB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBjb252ZXJzaW9uIHRvCisgKiByZWd1bGFyIGFsbG9jYXRlZCBzcGFjZS4KKyAqIEZvciBhbnkgb3RoZXIgZGlydHkgYnVmZmVyIGhlYWRzIG9uIHRoZSBwYWdlIHdlIHNob3VsZCBmbHVzaCB0aGVtLgorICoKKyAqIElmIHdlIGRldGVjdCB0aGF0IGEgdHJhbnNhY3Rpb24gd291bGQgYmUgcmVxdWlyZWQgdG8gZmx1c2ggdGhlIHBhZ2UsIHdlCisgKiBoYXZlIHRvIGNoZWNrIHRoZSBwcm9jZXNzIGZsYWdzIGZpcnN0LCBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uCisgKiBvciBkaXNrIEkvTyBkdXJpbmcgYWxsb2NhdGlvbnMgaXMgb2ZmLCB3ZSBuZWVkIHRvIGZhaWwgdGhlIHdyaXRlcGFnZSBhbmQKKyAqIHJlZGlydHkgdGhlIHBhZ2UuCiAgKi8KLQogU1RBVElDIGludAoteGZzX3BhZ2Vfc3RhdGVfY29udmVydCgKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlLAotCXN0cnVjdCBwYWdlCSpwYWdlLAotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAotCWludAkJc3RhcnRpbywKLQlpbnQJCXVubWFwcGVkKSAvKiBhbHNvIGltcGxpZXMgcGFnZSB1cHRvZGF0ZSAqLworeGZzX3ZtX3dyaXRlcGFnZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludAkJCWRlbGFsbG9jLCB1bndyaXR0ZW47CiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKmhlYWQ7CiAJc3RydWN0IHhmc19ibWJ0X2lyZWMJaW1hcDsKIAl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gTlVMTCwgKmlvaGVhZCA9IE5VTEw7CiAJbG9mZl90CQkJb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHBfb2Zmc2V0ID0gMDsKIAl1bnNpZ25lZCBpbnQJCXR5cGU7CiAJX191aW50NjRfdCAgICAgICAgICAgICAgZW5kX29mZnNldDsKIAlwZ29mZl90ICAgICAgICAgICAgICAgICBlbmRfaW5kZXgsIGxhc3RfaW5kZXg7CiAJc3NpemVfdAkJCXNpemUsIGxlbjsKIAlpbnQJCQlmbGFncywgZXJyLCBpbWFwX3ZhbGlkID0gMCwgdXB0b2RhdGUgPSAxOwotCWludAkJCXBhZ2VfZGlydHksIGNvdW50ID0gMDsKLQlpbnQJCQl0cnlsb2NrID0gMDsKLQlpbnQJCQlhbGxfYmggPSB1bm1hcHBlZDsKKwlpbnQJCQljb3VudCA9IDA7CisJaW50CQkJYWxsX2JoID0gMDsKIAotCWlmIChzdGFydGlvKSB7Ci0JCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX05PTkUgJiYgd2JjLT5ub25ibG9ja2luZykKLQkJCXRyeWxvY2sgfD0gQk1BUElfVFJZTE9DSzsKLQl9CisJdHJhY2VfeGZzX3dyaXRlcGFnZShpbm9kZSwgcGFnZSwgMCk7CisKKwlBU1NFUlQocGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CisKKwkvKgorCSAqIFJlZnVzZSB0byB3cml0ZSB0aGUgcGFnZSBvdXQgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIHJlY2xhaW0gY29udGV4dC4KKwkgKgorCSAqIFRoaXMgYXZvaWRzIHN0YWNrIG92ZXJmbG93cyB3aGVuIGNhbGxlZCBmcm9tIGRlZXBseSB1c2VkIHN0YWNrcyBpbgorCSAqIHJhbmRvbSBjYWxsZXJzIGZvciBkaXJlY3QgcmVjbGFpbSBvciBtZW1jZyByZWNsYWltLiAgV2UgZXhwbGljaXRseQorCSAqIGFsbG93IHJlY2xhaW0gZnJvbSBrc3dhcGQgYXMgdGhlIHN0YWNrIHVzYWdlIHRoZXJlIGlzIHJlbGF0aXZlbHkgbG93LgorCSAqCisJICogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGRvbmUgYnkgdGhlIGNvcmUgVk0sIGJ1dCB1bnRpbCB0aGF0IGhhcHBlbnMKKwkgKiBmaWxlc3lzdGVtcyBsaWtlIFhGUywgYnRyZnMgYW5kIGV4dDQgaGF2ZSB0byB0YWtlIGNhcmUgb2YgdGhpcworCSAqIGJ5IHRoZW1zZWx2ZXMuCisJICovCisJaWYgKChjdXJyZW50LT5mbGFncyAmIChQRl9NRU1BTExPQ3xQRl9LU1dBUEQpKSA9PSBQRl9NRU1BTExPQykKKwkJZ290byBvdXRfZmFpbDsKKworCS8qCisJICogV2UgbmVlZCBhIHRyYW5zYWN0aW9uIGlmIHRoZXJlIGFyZSBkZWxhbGxvYyBvciB1bndyaXR0ZW4gYnVmZmVycworCSAqIG9uIHRoZSBwYWdlLgorCSAqCisJICogSWYgd2UgbmVlZCBhIHRyYW5zYWN0aW9uIGFuZCB0aGUgcHJvY2VzcyBmbGFncyBzYXkgd2UgYXJlIGFscmVhZHkKKwkgKiBpbiBhIHRyYW5zYWN0aW9uLCBvciBubyBJTyBpcyBhbGxvd2VkIHRoZW4gbWFyayB0aGUgcGFnZSBkaXJ0eQorCSAqIGFnYWluIGFuZCBsZWF2ZSB0aGUgcGFnZSBhcyBpcy4KKwkgKi8KKwl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bndyaXR0ZW4pOworCWlmICgoY3VycmVudC0+ZmxhZ3MgJiBQRl9GU1RSQU5TKSAmJiAoZGVsYWxsb2MgfHwgdW53cml0dGVuKSkKKwkJZ290byBvdXRfZmFpbDsKIAogCS8qIElzIHRoaXMgcGFnZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZT8gKi8KIAlvZmZzZXQgPSBpX3NpemVfcmVhZChpbm9kZSk7CkBAIC0xMDg0LDUwICsxMDg5LDMzIEBACiAJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgewogCQlpZiAoKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCArIDEpIHx8CiAJCSAgICAhKGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkpIHsKLQkJCWlmIChzdGFydGlvKQotCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCS8qCi0JICogcGFnZV9kaXJ0eSBpcyBpbml0aWFsbHkgYSBjb3VudCBvZiBidWZmZXJzIG9uIHRoZSBwYWdlIGJlZm9yZQotCSAqIEVPRiBhbmQgaXMgZGVjcmVtZW50ZWQgYXMgd2UgbW92ZSBlYWNoIGludG8gYSBjbGVhbmFibGUgc3RhdGUuCi0JICoKLQkgKiBEZXJpdmF0aW9uOgotCSAqCi0JICogRW5kIG9mZnNldCBpcyB0aGUgaGlnaGVzdCBvZmZzZXQgdGhhdCB0aGlzIHBhZ2Ugc2hvdWxkIHJlcHJlc2VudC4KLQkgKiBJZiB3ZSBhcmUgb24gdGhlIGxhc3QgcGFnZSwgKGVuZF9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpCi0JICogd2lsbCBldmFsdWF0ZSBub24temVybyBhbmQgYmUgbGVzcyB0aGFuIFBBR0VfQ0FDSEVfU0laRSBhbmQKLQkgKiBoZW5jZSBnaXZlIHVzIHRoZSBjb3JyZWN0IHBhZ2VfZGlydHkgY291bnQuIE9uIGFueSBvdGhlciBwYWdlLAotCSAqIGl0IHdpbGwgYmUgemVybyBhbmQgaW4gdGhhdCBjYXNlIHdlIG5lZWQgcGFnZV9kaXJ0eSB0byBiZSB0aGUKLQkgKiBjb3VudCBvZiBidWZmZXJzIG9uIHRoZSBwYWdlLgotIAkgKi8KIAllbmRfb2Zmc2V0ID0gbWluX3QodW5zaWduZWQgbG9uZyBsb25nLAotCQkJKHhmc19vZmZfdCkocGFnZS0+aW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZULCBvZmZzZXQpOworCQkJKHhmc19vZmZfdCkocGFnZS0+aW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZULAorCQkJb2Zmc2V0KTsKIAlsZW4gPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7Ci0JcF9vZmZzZXQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBlbmRfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpLAotCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOwotCXBfb2Zmc2V0ID0gcF9vZmZzZXQgPyByb3VuZHVwKHBfb2Zmc2V0LCBsZW4pIDogUEFHRV9DQUNIRV9TSVpFOwotCXBhZ2VfZGlydHkgPSBwX29mZnNldCAvIGxlbjsKIAogCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAlvZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKTsKIAlmbGFncyA9IEJNQVBJX1JFQUQ7CiAJdHlwZSA9IElPX05FVzsKIAotCS8qIFRPRE86IGNsZWFudXAgY291bnQgYW5kIHBhZ2VfZGlydHkgKi8KLQogCWRvIHsKIAkJaWYgKG9mZnNldCA+PSBlbmRfb2Zmc2V0KQogCQkJYnJlYWs7CiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJCXVwdG9kYXRlID0gMDsKLQkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpICYmICFzdGFydGlvKSB7Ci0JCQkvKgotCQkJICogdGhlIGlvbWFwIGlzIGFjdHVhbGx5IHN0aWxsIHZhbGlkLCBidXQgdGhlIGlvZW5kCi0JCQkgKiBpc24ndC4gIHNob3VsZG4ndCBoYXBwZW4gdG9vIG9mdGVuLgotCQkJICovCisKKwkJLyoKKwkJICogQSBob2xlIG1heSBzdGlsbCBiZSBtYXJrZWQgdXB0b2RhdGUgYmVjYXVzZSBkaXNjYXJkX2J1ZmZlcgorCQkgKiBsZWF2ZXMgdGhlIGZsYWcgc2V0LgorCQkgKi8KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQlBU1NFUlQoIWJ1ZmZlcl9kaXJ0eShiaCkpOwogCQkJaW1hcF92YWxpZCA9IDA7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTEzNSwxOSArMTEyMyw3IEBACiAJCWlmIChpbWFwX3ZhbGlkKQogCQkJaW1hcF92YWxpZCA9IHhmc19pbWFwX3ZhbGlkKGlub2RlLCAmaW1hcCwgb2Zmc2V0KTsKIAotCQkvKgotCQkgKiBGaXJzdCBjYXNlLCBtYXAgYW4gdW53cml0dGVuIGV4dGVudCBhbmQgcHJlcGFyZSBmb3IKLQkJICogZXh0ZW50IHN0YXRlIGNvbnZlcnNpb24gdHJhbnNhY3Rpb24gb24gY29tcGxldGlvbi4KLQkJICoKLQkJICogU2Vjb25kIGNhc2UsIGFsbG9jYXRlIHNwYWNlIGZvciBhIGRlbGFsbG9jIGJ1ZmZlci4KLQkJICogV2UgY2FuIHJldHVybiBFQUdBSU4gaGVyZSBpbiB0aGUgcmVsZWFzZSBwYWdlIGNhc2UuCi0JCSAqCi0JCSAqIFRoaXJkIGNhc2UsIGFuIHVubWFwcGVkIGJ1ZmZlciB3YXMgZm91bmQsIGFuZCB3ZSBhcmUKLQkJICogaW4gYSBwYXRoIHdoZXJlIHdlIG5lZWQgdG8gd3JpdGUgdGhlIHdob2xlIHBhZ2Ugb3V0LgotCQkgKi8KLQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkgfHwKLQkJICAgICgoYnVmZmVyX3VwdG9kYXRlKGJoKSB8fCBQYWdlVXB0b2RhdGUocGFnZSkpICYmCi0JCSAgICAgIWJ1ZmZlcl9tYXBwZWQoYmgpICYmICh1bm1hcHBlZCB8fCBzdGFydGlvKSkpIHsKKwkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpIHsKIAkJCWludCBuZXdfaW9lbmQgPSAwOwogCiAJCQkvKgpAQCAtMTE2MSwxNSArMTEzNywxNiBAQAogCQkJCWZsYWdzID0gQk1BUElfV1JJVEUgfCBCTUFQSV9JR05TVEFURTsKIAkJCX0gZWxzZSBpZiAoYnVmZmVyX2RlbGF5KGJoKSkgewogCQkJCXR5cGUgPSBJT19ERUxBWTsKLQkJCQlmbGFncyA9IEJNQVBJX0FMTE9DQVRFIHwgdHJ5bG9jazsKLQkJCX0gZWxzZSB7Ci0JCQkJdHlwZSA9IElPX05FVzsKLQkJCQlmbGFncyA9IEJNQVBJX1dSSVRFIHwgQk1BUElfTU1BUDsKKwkJCQlmbGFncyA9IEJNQVBJX0FMTE9DQVRFOworCisJCQkJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSAmJgorCQkJCSAgICB3YmMtPm5vbmJsb2NraW5nKQorCQkJCQlmbGFncyB8PSBCTUFQSV9UUllMT0NLOwogCQkJfQogCiAJCQlpZiAoIWltYXBfdmFsaWQpIHsKIAkJCQkvKgotCQkJCSAqIGlmIHdlIGRpZG4ndCBoYXZlIGEgdmFsaWQgbWFwcGluZyB0aGVuIHdlCisJCQkJICogSWYgd2UgZGlkbid0IGhhdmUgYSB2YWxpZCBtYXBwaW5nIHRoZW4gd2UKIAkJCQkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCB0aGUgbmV3IG1hcHBpbmcKIAkJCQkgKiBpbiBhIG5ldyBpb2VuZCBzdHJ1Y3R1cmUuIFRoaXMgbmVlZHMgdG8gYmUKIAkJCQkgKiBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSBpb2VuZHMgY29ycmVjdGx5CkBAIC0xMTc3LDE0ICsxMTU0LDcgQEAKIAkJCQkgKiBmb3IgdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uLgogCQkJCSAqLwogCQkJCW5ld19pb2VuZCA9IDE7Ci0JCQkJaWYgKHR5cGUgPT0gSU9fTkVXKSB7Ci0JCQkJCXNpemUgPSB4ZnNfcHJvYmVfY2x1c3Rlcihpbm9kZSwKLQkJCQkJCQlwYWdlLCBiaCwgaGVhZCwgMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2l6ZSA9IGxlbjsKLQkJCQl9Ci0KLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBzaXplLAorCQkJCWVyciA9IHhmc19tYXBfYmxvY2tzKGlub2RlLCBvZmZzZXQsIGxlbiwKIAkJCQkJCSZpbWFwLCBmbGFncyk7CiAJCQkJaWYgKGVycikKIAkJCQkJZ290byBlcnJvcjsKQEAgLTExOTMsMTkgKzExNjMsMTEgQEAKIAkJCX0KIAkJCWlmIChpbWFwX3ZhbGlkKSB7CiAJCQkJeGZzX21hcF9hdF9vZmZzZXQoaW5vZGUsIGJoLCAmaW1hcCwgb2Zmc2V0KTsKLQkJCQlpZiAoc3RhcnRpbykgewotCQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAotCQkJCQkJCXR5cGUsICZpb2VuZCwKLQkJCQkJCQluZXdfaW9lbmQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOwotCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCQkJCX0KLQkJCQlwYWdlX2RpcnR5LS07CisJCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwgdHlwZSwKKwkJCQkJCSAmaW9lbmQsIG5ld19pb2VuZCk7CiAJCQkJY291bnQrKzsKIAkJCX0KLQkJfSBlbHNlIGlmIChidWZmZXJfdXB0b2RhdGUoYmgpICYmIHN0YXJ0aW8pIHsKKwkJfSBlbHNlIGlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CiAJCQkvKgogCQkJICogd2UgZ290IGhlcmUgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgbWFwcGVkLgogCQkJICogVGhhdCBtZWFucyBpdCBtdXN0IGFscmVhZHkgaGF2ZSBleHRlbnRzIGFsbG9jYXRlZApAQCAtMTIxMyw4ICsxMTc1LDcgQEAKIAkJCSAqLwogCQkJaWYgKCFpbWFwX3ZhbGlkIHx8IGZsYWdzICE9IEJNQVBJX1JFQUQpIHsKIAkJCQlmbGFncyA9IEJNQVBJX1JFQUQ7Ci0JCQkJc2l6ZSA9IHhmc19wcm9iZV9jbHVzdGVyKGlub2RlLCBwYWdlLCBiaCwKLQkJCQkJCQkJaGVhZCwgMSk7CisJCQkJc2l6ZSA9IHhmc19wcm9iZV9jbHVzdGVyKGlub2RlLCBwYWdlLCBiaCwgaGVhZCk7CiAJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgc2l6ZSwKIAkJCQkJCSZpbWFwLCBmbGFncyk7CiAJCQkJaWYgKGVycikKQEAgLTEyMzMsMTggKzExOTQsMTYgQEAKIAkJCSAqLwogCQkJdHlwZSA9IElPX05FVzsKIAkJCWlmICh0cnlsb2NrX2J1ZmZlcihiaCkpIHsKLQkJCQlBU1NFUlQoYnVmZmVyX21hcHBlZChiaCkpOwogCQkJCWlmIChpbWFwX3ZhbGlkKQogCQkJCQlhbGxfYmggPSAxOwogCQkJCXhmc19hZGRfdG9faW9lbmQoaW5vZGUsIGJoLCBvZmZzZXQsIHR5cGUsCiAJCQkJCQkmaW9lbmQsICFpbWFwX3ZhbGlkKTsKLQkJCQlwYWdlX2RpcnR5LS07CiAJCQkJY291bnQrKzsKIAkJCX0gZWxzZSB7CiAJCQkJaW1hcF92YWxpZCA9IDA7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoKGJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwgUGFnZVVwdG9kYXRlKHBhZ2UpKSAmJgotCQkJICAgKHVubWFwcGVkIHx8IHN0YXJ0aW8pKSB7CisJCX0gZWxzZSBpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlBU1NFUlQoYnVmZmVyX21hcHBlZChiaCkpOwogCQkJaW1hcF92YWxpZCA9IDA7CiAJCX0KIApAQCAtMTI1Niw4ICsxMjE1LDcgQEAKIAlpZiAodXB0b2RhdGUgJiYgYmggPT0gaGVhZCkKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCi0JaWYgKHN0YXJ0aW8pCi0JCXhmc19zdGFydF9wYWdlX3dyaXRlYmFjayhwYWdlLCAxLCBjb3VudCk7CisJeGZzX3N0YXJ0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UsIDEsIGNvdW50KTsKIAogCWlmIChpb2VuZCAmJiBpbWFwX3ZhbGlkKSB7CiAJCXhmc19vZmZfdAkJZW5kX2luZGV4OwpAQCAtMTI3NSwxMzEgKzEyMzMsMjcgQEAKIAkJCWVuZF9pbmRleCA9IGxhc3RfaW5kZXg7CiAKIAkJeGZzX2NsdXN0ZXJfd3JpdGUoaW5vZGUsIHBhZ2UtPmluZGV4ICsgMSwgJmltYXAsICZpb2VuZCwKLQkJCQkJd2JjLCBzdGFydGlvLCBhbGxfYmgsIGVuZF9pbmRleCk7CisJCQkJCXdiYywgYWxsX2JoLCBlbmRfaW5kZXgpOwogCX0KIAogCWlmIChpb2hlYWQpCiAJCXhmc19zdWJtaXRfaW9lbmQod2JjLCBpb2hlYWQpOwogCi0JcmV0dXJuIHBhZ2VfZGlydHk7CisJcmV0dXJuIDA7CiAKIGVycm9yOgogCWlmIChpb2hlYWQpCiAJCXhmc19jYW5jZWxfaW9lbmQoaW9oZWFkKTsKIAotCS8qCi0JICogSWYgaXQncyBkZWxhbGxvYyBhbmQgd2UgaGF2ZSBub3doZXJlIHRvIHB1dCBpdCwKLQkgKiB0aHJvdyBpdCBhd2F5LCB1bmxlc3MgdGhlIGxvd2VyIGxheWVycyB0b2xkCi0JICogdXMgdG8gdHJ5IGFnYWluLgotCSAqLwotCWlmIChlcnIgIT0gLUVBR0FJTikgewotCQlpZiAoIXVubWFwcGVkKQotCQkJeGZzX2FvcHNfZGlzY2FyZF9wYWdlKHBhZ2UpOwotCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQl9CisJeGZzX2FvcHNfZGlzY2FyZF9wYWdlKHBhZ2UpOworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiB3cml0ZXBhZ2U6IENhbGxlZCBmcm9tIG9uZSBvZiB0d28gcGxhY2VzOgotICoKLSAqIDEuIHdlIGFyZSBmbHVzaGluZyBhIGRlbGFsbG9jIGJ1ZmZlciBoZWFkLgotICoKLSAqIDIuIHdlIGFyZSB3cml0aW5nIG91dCBhIGRpcnR5IHBhZ2UuIFR5cGljYWxseSB0aGUgcGFnZSBkaXJ0eQotICogICAgc3RhdGUgaXMgY2xlYXJlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuIEluIHRoaXMgY2FzZSBpcyBpdAotICogICAgY29uY2VpdmFibGUgd2UgaGF2ZSBubyBidWZmZXIgaGVhZHMuCi0gKgotICogRm9yIGRlbGFsbG9jIHNwYWNlIG9uIHRoZSBwYWdlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2UgYW5kCi0gKiBmbHVzaCBpdC4gRm9yIHVubWFwcGVkIGJ1ZmZlciBoZWFkcyBvbiB0aGUgcGFnZSB3ZSBzaG91bGQKLSAqIGFsbG9jYXRlIHNwYWNlIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLiBGb3IgYW55IG90aGVyIGRpcnR5Ci0gKiBidWZmZXIgaGVhZHMgb24gdGhlIHBhZ2Ugd2Ugc2hvdWxkIGZsdXNoIHRoZW0uCi0gKgotICogSWYgd2UgZGV0ZWN0IHRoYXQgYSB0cmFuc2FjdGlvbiB3b3VsZCBiZSByZXF1aXJlZCB0byBmbHVzaAotICogdGhlIHBhZ2UsIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHByb2Nlc3MgZmxhZ3MgZmlyc3QsIGlmIHdlCi0gKiBhcmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uIG9yIGRpc2sgSS9PIGR1cmluZyBhbGxvY2F0aW9ucwotICogaXMgb2ZmLCB3ZSBuZWVkIHRvIGZhaWwgdGhlIHdyaXRlcGFnZSBhbmQgcmVkaXJ0eSB0aGUgcGFnZS4KLSAqLwotCi1TVEFUSUMgaW50Ci14ZnNfdm1fd3JpdGVwYWdlKAotCXN0cnVjdCBwYWdlCQkqcGFnZSwKLQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKLXsKLQlpbnQJCQllcnJvcjsKLQlpbnQJCQluZWVkX3RyYW5zOwotCWludAkJCWRlbGFsbG9jLCB1bm1hcHBlZCwgdW53cml0dGVuOwotCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQotCXRyYWNlX3hmc193cml0ZXBhZ2UoaW5vZGUsIHBhZ2UsIDApOwotCi0JLyoKLQkgKiBSZWZ1c2UgdG8gd3JpdGUgdGhlIHBhZ2Ugb3V0IGlmIHdlIGFyZSBjYWxsZWQgZnJvbSByZWNsYWltIGNvbnRleHQuCi0JICoKLQkgKiBUaGlzIGlzIHByaW1hcmlseSB0byBhdm9pZCBzdGFjayBvdmVyZmxvd3Mgd2hlbiBjYWxsZWQgZnJvbSBkZWVwCi0JICogdXNlZCBzdGFja3MgaW4gcmFuZG9tIGNhbGxlcnMgZm9yIGRpcmVjdCByZWNsYWltLCBidXQgZGlzYWJsaW5nCi0JICogcmVjbGFpbSBmb3Iga3N3YXAgaXMgYSBuaWNlIHNpZGUtZWZmZWN0IGFzIGtzd2FwZCBjYXVzZXMgcmF0aGVyCi0JICogc3Vib3B0aW1hbCBJL08gcGF0dGVycywgdG9vLgotCSAqCi0JICogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGRvbmUgYnkgdGhlIGNvcmUgVk0sIGJ1dCB1bnRpbCB0aGF0IGhhcHBlbnMKLQkgKiBmaWxlc3lzdGVtcyBsaWtlIFhGUywgYnRyZnMgYW5kIGV4dDQgaGF2ZSB0byB0YWtlIGNhcmUgb2YgdGhpcwotCSAqIGJ5IHRoZW1zZWx2ZXMuCi0JICovCi0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpCi0JCWdvdG8gb3V0X2ZhaWw7Ci0KLQkvKgotCSAqIFdlIG5lZWQgYSB0cmFuc2FjdGlvbiBpZjoKLQkgKiAgMS4gVGhlcmUgYXJlIGRlbGFsbG9jIGJ1ZmZlcnMgb24gdGhlIHBhZ2UKLQkgKiAgMi4gVGhlIHBhZ2UgaXMgdXB0b2RhdGUgYW5kIHdlIGhhdmUgdW5tYXBwZWQgYnVmZmVycwotCSAqICAzLiBUaGUgcGFnZSBpcyB1cHRvZGF0ZSBhbmQgd2UgaGF2ZSBubyBidWZmZXJzCi0JICogIDQuIFRoZXJlIGFyZSB1bndyaXR0ZW4gYnVmZmVycyBvbiB0aGUgcGFnZQotCSAqLwotCi0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JCXVubWFwcGVkID0gMTsKLQkJbmVlZF90cmFucyA9IDE7Ci0JfSBlbHNlIHsKLQkJeGZzX2NvdW50X3BhZ2Vfc3RhdGUocGFnZSwgJmRlbGFsbG9jLCAmdW5tYXBwZWQsICZ1bndyaXR0ZW4pOwotCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJCXVubWFwcGVkID0gMDsKLQkJbmVlZF90cmFucyA9IGRlbGFsbG9jICsgdW5tYXBwZWQgKyB1bndyaXR0ZW47Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBuZWVkIGEgdHJhbnNhY3Rpb24gYW5kIHRoZSBwcm9jZXNzIGZsYWdzIHNheQotCSAqIHdlIGFyZSBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIG9yIG5vIElPIGlzIGFsbG93ZWQKLQkgKiB0aGVuIG1hcmsgdGhlIHBhZ2UgZGlydHkgYWdhaW4gYW5kIGxlYXZlIHRoZSBwYWdlCi0JICogYXMgaXMuCi0JICovCi0JaWYgKGN1cnJlbnRfdGVzdF9mbGFncyhQRl9GU1RSQU5TKSAmJiBuZWVkX3RyYW5zKQotCQlnb3RvIG91dF9mYWlsOwotCi0JLyoKLQkgKiBEZWxheSBob29raW5nIHVwIGJ1ZmZlciBoZWFkcyB1bnRpbCB3ZSBoYXZlCi0JICogbWFkZSBvdXIgZ28vbm8tZ28gZGVjaXNpb24uCi0JICovCi0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMsIDApOwotCi0JLyoKLQkgKiBDb252ZXJ0IGRlbGF5ZWQgYWxsb2NhdGUsIHVud3JpdHRlbiBvciB1bm1hcHBlZCBzcGFjZQotCSAqIHRvIHJlYWwgc3BhY2UgYW5kIGZsdXNoIG91dCB0byBkaXNrLgotCSAqLwotCWVycm9yID0geGZzX3BhZ2Vfc3RhdGVfY29udmVydChpbm9kZSwgcGFnZSwgd2JjLCAxLCB1bm1hcHBlZCk7Ci0JaWYgKGVycm9yID09IC1FQUdBSU4pCi0JCWdvdG8gb3V0X2ZhaWw7Ci0JaWYgKHVubGlrZWx5KGVycm9yIDwgMCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCXJldHVybiAwOwogCiBvdXRfZmFpbDoKIAlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiAwOwotb3V0X3VubG9jazoKLQl1bmxvY2tfcGFnZShwYWdlKTsKLQlyZXR1cm4gZXJyb3I7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTE0MTMsNjUgKzEyNjcsMjcgQEAKIAogLyoKICAqIENhbGxlZCB0byBtb3ZlIGEgcGFnZSBpbnRvIGNsZWFuYWJsZSBzdGF0ZSAtIGFuZCBmcm9tIHRoZXJlCi0gKiB0byBiZSByZWxlYXNlZC4gUG9zc2libHkgdGhlIHBhZ2UgaXMgYWxyZWFkeSBjbGVhbi4gV2UgYWx3YXlzCisgKiB0byBiZSByZWxlYXNlZC4gVGhlIHBhZ2Ugc2hvdWxkIGFscmVhZHkgYmUgY2xlYW4uIFdlIGFsd2F5cwogICogaGF2ZSBidWZmZXIgaGVhZHMgaW4gdGhpcyBjYWxsLgogICoKLSAqIFJldHVybnMgMCBpZiB0aGUgcGFnZSBpcyBvayB0byByZWxlYXNlLCAxIG90aGVyd2lzZS4KLSAqCi0gKiBQb3NzaWJsZSBzY2VuYXJpb3MgYXJlOgotICoKLSAqIDEuIFdlIGFyZSBiZWluZyBjYWxsZWQgdG8gcmVsZWFzZSBhIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gd3JpdHRlbgotICogICAgdG8gdmlhIHJlZ3VsYXIgSS9PLiBidWZmZXIgaGVhZHMgd2lsbCBiZSBkaXJ0eSBhbmQgcG9zc2libHkKLSAqICAgIGRlbGFsbG9jLiBJZiBubyBkZWxhbGxvYyBidWZmZXIgaGVhZHMgaW4gdGhpcyBjYXNlIHRoZW4gd2UKLSAqICAgIGNhbiBqdXN0IHJldHVybiB6ZXJvLgotICoKLSAqIDIuIFdlIGFyZSBjYWxsZWQgdG8gcmVsZWFzZSBhIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gd3JpdHRlbiB2aWEKLSAqICAgIG1tYXAsIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGVuc3VyZSB0aGVyZSBpcyBubyBkZWxhbGxvYwotICogICAgc3RhdGUgaW4gdGhlIGJ1ZmZlciBoZWFkcywgaWYgbm90IHdlIGNhbiBsZXQgdGhlIGNhbGxlcgotICogICAgZnJlZSB0aGVtIGFuZCB3ZSBzaG91bGQgY29tZSBiYWNrIGxhdGVyIHZpYSB3cml0ZXBhZ2UuCisgKiBSZXR1cm5zIDEgaWYgdGhlIHBhZ2UgaXMgb2sgdG8gcmVsZWFzZSwgMCBvdGhlcndpc2UuCiAgKi8KIFNUQVRJQyBpbnQKIHhmc192bV9yZWxlYXNlcGFnZSgKIAlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCiAJZ2ZwX3QJCQlnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JaW50CQkJZGlydHksIGRlbGFsbG9jLCB1bm1hcHBlZCwgdW53cml0dGVuOwotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7Ci0JCS5zeW5jX21vZGUgPSBXQl9TWU5DX0FMTCwKLQkJLm5yX3RvX3dyaXRlID0gMSwKLQl9OworCWludAkJCWRlbGFsbG9jLCB1bndyaXR0ZW47CiAKLQl0cmFjZV94ZnNfcmVsZWFzZXBhZ2UoaW5vZGUsIHBhZ2UsIDApOworCXRyYWNlX3hmc19yZWxlYXNlcGFnZShwYWdlLT5tYXBwaW5nLT5ob3N0LCBwYWdlLCAwKTsKIAotCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bndyaXR0ZW4pOworCisJaWYgKFdBUk5fT04oZGVsYWxsb2MpKQorCQlyZXR1cm4gMDsKKwlpZiAoV0FSTl9PTih1bndyaXR0ZW4pKQogCQlyZXR1cm4gMDsKIAotCXhmc19jb3VudF9wYWdlX3N0YXRlKHBhZ2UsICZkZWxhbGxvYywgJnVubWFwcGVkLCAmdW53cml0dGVuKTsKLQlpZiAoIWRlbGFsbG9jICYmICF1bndyaXR0ZW4pCi0JCWdvdG8gZnJlZV9idWZmZXJzOwotCi0JaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCi0JCXJldHVybiAwOwotCi0JLyogSWYgd2UgYXJlIGFscmVhZHkgaW5zaWRlIGEgdHJhbnNhY3Rpb24gb3IgdGhlIHRocmVhZCBjYW5ub3QKLQkgKiBkbyBJL08sIHdlIGNhbm5vdCByZWxlYXNlIHRoaXMgcGFnZS4KLQkgKi8KLQlpZiAoY3VycmVudF90ZXN0X2ZsYWdzKFBGX0ZTVFJBTlMpKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogQ29udmVydCBkZWxhbGxvYyBzcGFjZSB0byByZWFsIHNwYWNlLCBkbyBub3QgZmx1c2ggdGhlCi0JICogZGF0YSBvdXQgdG8gZGlzaywgdGhhdCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNhbGxlci4KLQkgKiBOZXZlciBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGhlcmUgLSB3ZSB3aWxsIGFsd2F5cwotCSAqIGNvbWUgYmFjayB0byB3cml0ZXBhZ2UgaW4gdGhhdCBjYXNlLgotCSAqLwotCWRpcnR5ID0geGZzX3BhZ2Vfc3RhdGVfY29udmVydChpbm9kZSwgcGFnZSwgJndiYywgMCwgMCk7Ci0JaWYgKGRpcnR5ID09IDAgJiYgIXVud3JpdHRlbikKLQkJZ290byBmcmVlX2J1ZmZlcnM7Ci0JcmV0dXJuIDA7Ci0KLWZyZWVfYnVmZmVyczoKIAlyZXR1cm4gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKIH0KIApAQCAtMTQ4MSw5ICsxMjk3LDkgQEAKIAlzZWN0b3JfdAkJaWJsb2NrLAogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfcmVzdWx0LAogCWludAkJCWNyZWF0ZSwKLQlpbnQJCQlkaXJlY3QsCi0JYm1hcGlfZmxhZ3NfdAkJZmxhZ3MpCisJaW50CQkJZGlyZWN0KQogeworCWludAkJCWZsYWdzID0gY3JlYXRlID8gQk1BUElfV1JJVEUgOiBCTUFQSV9SRUFEOwogCXN0cnVjdCB4ZnNfYm1idF9pcmVjCWltYXA7CiAJeGZzX29mZl90CQlvZmZzZXQ7CiAJc3NpemVfdAkJCXNpemU7CkBAIC0xNDk4LDggKzEzMTQsMTEgQEAKIAlpZiAoIWNyZWF0ZSAmJiBkaXJlY3QgJiYgb2Zmc2V0ID49IGlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKLQllcnJvciA9IHhmc19pb21hcChYRlNfSShpbm9kZSksIG9mZnNldCwgc2l6ZSwKLQkJCSAgICAgY3JlYXRlID8gZmxhZ3MgOiBCTUFQSV9SRUFELCAmaW1hcCwgJm5pbWFwLCAmbmV3KTsKKwlpZiAoZGlyZWN0ICYmIGNyZWF0ZSkKKwkJZmxhZ3MgfD0gQk1BUElfRElSRUNUOworCisJZXJyb3IgPSB4ZnNfaW9tYXAoWEZTX0koaW5vZGUpLCBvZmZzZXQsIHNpemUsIGZsYWdzLCAmaW1hcCwgJm5pbWFwLAorCQkJICAmbmV3KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CiAJaWYgKG5pbWFwID09IDApCkBAIC0xNTc5LDggKzEzOTgsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfcmVzdWx0LAogCWludAkJCWNyZWF0ZSkKIHsKLQlyZXR1cm4gX194ZnNfZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLAotCQkJCWJoX3Jlc3VsdCwgY3JlYXRlLCAwLCBCTUFQSV9XUklURSk7CisJcmV0dXJuIF9feGZzX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUsIDApOwogfQogCiBTVEFUSUMgaW50CkBAIC0xNTkwLDU0ICsxNDA4LDMwIEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9yZXN1bHQsCiAJaW50CQkJY3JlYXRlKQogewotCXJldHVybiBfX3hmc19nZXRfYmxvY2tzKGlub2RlLCBpYmxvY2ssCi0JCQkJYmhfcmVzdWx0LCBjcmVhdGUsIDEsIEJNQVBJX1dSSVRFfEJNQVBJX0RJUkVDVCk7CisJcmV0dXJuIF9feGZzX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUsIDEpOwogfQogCisvKgorICogQ29tcGxldGUgYSBkaXJlY3QgSS9PIHdyaXRlIHJlcXVlc3QuCisgKgorICogSWYgdGhlIHByaXZhdGUgYXJndW1lbnQgaXMgbm9uLU5VTEwgX194ZnNfZ2V0X2Jsb2NrcyBzaWduYWxzIHVzIHRoYXQgd2UKKyAqIG5lZWQgdG8gaXNzdWUgYSB0cmFuc2FjdGlvbiB0byBjb252ZXJ0IHRoZSByYW5nZSBmcm9tIHVud3JpdHRlbiB0byB3cml0dGVuCisgKiBleHRlbnRzLiAgSW4gY2FzZSB0aGlzIGlzIHJlZ3VsYXIgc3luY2hyb25vdXMgSS9PIHdlIGp1c3QgY2FsbCB4ZnNfZW5kX2lvCisgKiB0byBkbyB0aGlzIGFuZCB3ZSBhcmUgZG9uZS4gIEJ1dCBpbiBjYXNlIHRoaXMgd2FzIGEgc3VjY2Vzc2Z1bGwgQUlPCisgKiByZXF1ZXN0IHRoaXMgaGFuZGxlciBpcyBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwgZnJvbSB3aGljaCB3ZQorICogY2FuJ3Qgc3RhcnQgdHJhbnNhY3Rpb25zLiAgSW4gdGhhdCBjYXNlIG9mZmxvYWQgdGhlIEkvTyBjb21wbGV0aW9uIHRvCisgKiB0aGUgd29ya3F1ZXVlcyB3ZSBhbHNvIHVzZSBmb3IgYnVmZmVyZWQgSS9PIGNvbXBsZXRpb24uCisgKi8KIFNUQVRJQyB2b2lkCi14ZnNfZW5kX2lvX2RpcmVjdCgKLQlzdHJ1Y3Qga2lvY2IJKmlvY2IsCi0JbG9mZl90CQlvZmZzZXQsCi0Jc3NpemVfdAkJc2l6ZSwKLQl2b2lkCQkqcHJpdmF0ZSkKK3hmc19lbmRfaW9fZGlyZWN0X3dyaXRlKAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJbG9mZl90CQkJb2Zmc2V0LAorCXNzaXplX3QJCQlzaXplLAorCXZvaWQJCQkqcHJpdmF0ZSwKKwlpbnQJCQlyZXQsCisJYm9vbAkJCWlzX2FzeW5jKQogewotCXhmc19pb2VuZF90CSppb2VuZCA9IGlvY2ItPnByaXZhdGU7Ci0KLQkvKgotCSAqIE5vbi1OVUxMIHByaXZhdGUgZGF0YSBtZWFucyB3ZSBuZWVkIHRvIGlzc3VlIGEgdHJhbnNhY3Rpb24gdG8KLQkgKiBjb252ZXJ0IGEgcmFuZ2UgZnJvbSB1bndyaXR0ZW4gdG8gd3JpdHRlbiBleHRlbnRzLiAgVGhpcyBuZWVkcwotCSAqIHRvIGhhcHBlbiBmcm9tIHByb2Nlc3MgY29udGV4dCBidXQgYWlvK2RpbyBJL08gY29tcGxldGlvbgotCSAqIGhhcHBlbnMgZnJvbSBpcnEgY29udGV4dCBzbyB3ZSBuZWVkIHRvIGRlZmVyIGl0IHRvIGEgd29ya3F1ZXVlLgotCSAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3Igc3luY2hyb25vdXMgZGlyZWN0IEkvTywgYnV0IHdlIGRvCi0JICogaXQgYW55d2F5IHRvIGtlZXAgdGhlIGNvZGUgdW5pZm9ybSBhbmQgc2ltcGxlci4KLQkgKgotCSAqIFdlbGwsIGlmIG9ubHkgaXQgd2VyZSB0aGF0IHNpbXBsZS4gQmVjYXVzZSBzeW5jaHJvbm91cyBkaXJlY3QgSS9PCi0JICogcmVxdWlyZXMgZXh0ZW50IGNvbnZlcnNpb24gdG8gb2NjdXIgKmJlZm9yZSogd2UgcmV0dXJuIHRvIHVzZXJzcGFjZSwKLQkgKiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGV4dGVudCBjb252ZXJzaW9uIHRvIGNvbXBsZXRlLiBMb29rIGF0IHRoZQotCSAqIGlvY2IgdGhhdCBoYXMgYmVlbiBwYXNzZWQgdG8gdXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgQUlPIG9yCi0JICogbm90LiBJZiBpdCBpcyBzeW5jaHJvbm91cywgdGVsbCB4ZnNfZmluaXNoX2lvZW5kKCkgdG8ga2ljayB0aGUKLQkgKiB3b3JrcXVldWUgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgotCSAqCi0JICogVGhlIGNvcmUgZGlyZWN0IEkvTyBjb2RlIG1pZ2h0IGJlIGNoYW5nZWQgdG8gYWx3YXlzIGNhbGwgdGhlCi0JICogY29tcGxldGlvbiBoYW5kbGVyIGluIHRoZSBmdXR1cmUsIGluIHdoaWNoIGNhc2UgYWxsIHRoaXMgY2FuCi0JICogZ28gYXdheS4KLQkgKi8KLQlpb2VuZC0+aW9fb2Zmc2V0ID0gb2Zmc2V0OwotCWlvZW5kLT5pb19zaXplID0gc2l6ZTsKLQlpZiAoaW9lbmQtPmlvX3R5cGUgPT0gSU9fUkVBRCkgewotCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kLCAwKTsKLQl9IGVsc2UgaWYgKHByaXZhdGUgJiYgc2l6ZSA+IDApIHsKLQkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCwgaXNfc3luY19raW9jYihpb2NiKSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQSBkaXJlY3QgSS9PIHdyaXRlIGlvZW5kIHN0YXJ0cyBpdCdzIGxpZmUgaW4gdW53cml0dGVuCi0JCSAqIHN0YXRlIGluIGNhc2UgdGhleSBtYXAgYW4gdW53cml0dGVuIGV4dGVudC4gIFRoaXMgd3JpdGUKLQkJICogZGlkbid0IG1hcCBhbiB1bndyaXR0ZW4gZXh0ZW50IHNvIHN3aXRjaCBpdCdzIGNvbXBsZXRpb24KLQkJICogaGFuZGxlci4KLQkJICovCi0JCWlvZW5kLT5pb190eXBlID0gSU9fTkVXOwotCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kLCAwKTsKLQl9CisJc3RydWN0IHhmc19pb2VuZAkqaW9lbmQgPSBpb2NiLT5wcml2YXRlOwogCiAJLyoKIAkgKiBibG9ja2Rldl9kaXJlY3RfSU8gY2FuIHJldHVybiBhbiBlcnJvciBldmVuIGFmdGVyIHRoZSBJL08KQEAgLTE2NDUsNiArMTQzOSwyOCBAQAogCSAqIGFnYWluc3QgZG91YmxlLWZyZWVpbmcuCiAJICovCiAJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7CisKKwlpb2VuZC0+aW9fb2Zmc2V0ID0gb2Zmc2V0OworCWlvZW5kLT5pb19zaXplID0gc2l6ZTsKKwlpZiAocHJpdmF0ZSAmJiBzaXplID4gMCkKKwkJaW9lbmQtPmlvX3R5cGUgPSBJT19VTldSSVRURU47CisKKwlpZiAoaXNfYXN5bmMpIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIGNvbnZlcnRpbmcgYW4gdW53cml0dGVuIGV4dGVudCB3ZSBuZWVkIHRvIGRlbGF5CisJCSAqIHRoZSBBSU8gY29tcGxldGlvbiB1bnRpbCBhZnRlciB0aGUgdW53cml0dGVudCBleHRlbnQKKwkJICogY29udmVyc2lvbiBoYXMgY29tcGxldGVkLCBvdGhlcndpc2UgZG8gaXQgQVNBUC4KKwkJICovCisJCWlmIChpb2VuZC0+aW9fdHlwZSA9PSBJT19VTldSSVRURU4pIHsKKwkJCWlvZW5kLT5pb19pb2NiID0gaW9jYjsKKwkJCWlvZW5kLT5pb19yZXN1bHQgPSByZXQ7CisJCX0gZWxzZSB7CisJCQlhaW9fY29tcGxldGUoaW9jYiwgcmV0LCAwKTsKKwkJfQorCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKKwl9IGVsc2UgeworCQl4ZnNfZmluaXNoX2lvZW5kX3N5bmMoaW9lbmQpOworCX0KIH0KIAogU1RBVElDIHNzaXplX3QKQEAgLTE2NTUsMjMgKzE0NzEsMjYgQEAKIAlsb2ZmX3QJCQlvZmZzZXQsCiAJdW5zaWduZWQgbG9uZwkJbnJfc2VncykKIHsKLQlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwotCXNzaXplX3QJCXJldDsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpiZGV2ID0geGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoaW5vZGUpOworCXNzaXplX3QJCQlyZXQ7CiAKLQliZGV2ID0geGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoaW5vZGUpOworCWlmIChydyAmIFdSSVRFKSB7CisJCWlvY2ItPnByaXZhdGUgPSB4ZnNfYWxsb2NfaW9lbmQoaW5vZGUsIElPX05FVyk7CiAKLQlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlLCBydyA9PSBXUklURSA/Ci0JCQkJCUlPX1VOV1JJVFRFTiA6IElPX1JFQUQpOworCQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU9fbm9fbG9ja2luZyhydywgaW9jYiwgaW5vZGUsIGJkZXYsIGlvdiwKKwkJCQkJCSAgICBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJCQkgICAgeGZzX2dldF9ibG9ja3NfZGlyZWN0LAorCQkJCQkJICAgIHhmc19lbmRfaW9fZGlyZWN0X3dyaXRlKTsKKwkJaWYgKHJldCAhPSAtRUlPQ0JRVUVVRUQgJiYgaW9jYi0+cHJpdmF0ZSkKKwkJCXhmc19kZXN0cm95X2lvZW5kKGlvY2ItPnByaXZhdGUpOworCX0gZWxzZSB7CisJCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JT19ub19sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwgYmRldiwgaW92LAorCQkJCQkJICAgIG9mZnNldCwgbnJfc2VncywKKwkJCQkJCSAgICB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCisJCQkJCQkgICAgTlVMTCk7CisJfQogCi0JcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPX25vX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLCBiZGV2LCBpb3YsCi0JCQkJCSAgICBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJCSAgICB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCi0JCQkJCSAgICB4ZnNfZW5kX2lvX2RpcmVjdCk7Ci0KLQlpZiAodW5saWtlbHkocmV0ICE9IC1FSU9DQlFVRVVFRCAmJiBpb2NiLT5wcml2YXRlKSkKLQkJeGZzX2Rlc3Ryb3lfaW9lbmQoaW9jYi0+cHJpdmF0ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTY4Niw4ICsxNTA1LDggQEAKIAl2b2lkCQkJKipmc2RhdGEpCiB7CiAJKnBhZ2VwID0gTlVMTDsKLQlyZXR1cm4gYmxvY2tfd3JpdGVfYmVnaW4oZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGZsYWdzLCBwYWdlcCwgZnNkYXRhLAotCQkJCQkJCQl4ZnNfZ2V0X2Jsb2Nrcyk7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2JlZ2luKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBmbGFncyB8IEFPUF9GTEFHX05PRlMsCisJCQkJIHBhZ2VwLCBmc2RhdGEsIHhmc19nZXRfYmxvY2tzKTsKIH0KIAogU1RBVElDIHNlY3Rvcl90CkBAIC0xNjk4LDcgKzE1MTcsNyBAQAogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gKHN0cnVjdCBpbm9kZSAqKW1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KFhGU19JKGlub2RlKSk7CisJdHJhY2VfeGZzX3ZtX2JtYXAoWEZTX0koaW5vZGUpKTsKIAl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKIAl4ZnNfZmx1c2hfcGFnZXMoaXAsICh4ZnNfb2ZmX3QpMCwgLTEsIDAsIEZJX1JFTUFQRik7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaAppbmRleCA0Y2ZjNmVhLi5jNTA1N2ZiIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCkBAIC0zNyw2ICszNyw4IEBACiAJc2l6ZV90CQkJaW9fc2l6ZTsJLyogc2l6ZSBvZiB0aGUgZXh0ZW50ICovCiAJeGZzX29mZl90CQlpb19vZmZzZXQ7CS8qIG9mZnNldCBpbiB0aGUgZmlsZSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlpb193b3JrOwkvKiB4ZnNkYXRhZCB3b3JrIHF1ZXVlICovCisJc3RydWN0IGtpb2NiCQkqaW9faW9jYjsKKwlpbnQJCQlpb19yZXN1bHQ7CiB9IHhmc19pb2VuZF90OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB4ZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwpAQCAtNDUsNiArNDcsNiBAQAogZXh0ZXJuIHZvaWQgeGZzX2lvZW5kX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCB4ZnNfaW9lbmRfd2FpdChzdHJ1Y3QgeGZzX2lub2RlICopOwogCi1leHRlcm4gdm9pZCB4ZnNfY291bnRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiB2b2lkIHhmc19jb3VudF9wYWdlX3N0YXRlKHN0cnVjdCBwYWdlICosIGludCAqLCBpbnQgKik7CiAKICNlbmRpZiAvKiBfX1hGU19BT1BTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCAyZWUzZjdhLi5lYTc5MDcyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCkBAIC01NzksOSArNTc4LDkgQEAKIAkJCVhCRl9SRUFEX0FIRUFEIHwgX1hCRl9SVU5fUVVFVUVTKTsKIAogCXN0YXR1cyA9IHhmc19idWZfaW9yZXF1ZXN0KGJwKTsKLQlpZiAoIXN0YXR1cyAmJiAhKGZsYWdzICYgWEJGX0FTWU5DKSkKLQkJc3RhdHVzID0geGZzX2J1Zl9pb3dhaXQoYnApOwotCXJldHVybiBzdGF0dXM7CisJaWYgKHN0YXR1cyB8fCBYRlNfQlVGX0lTRVJST1IoYnApIHx8IChmbGFncyAmIFhCRl9BU1lOQykpCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHhmc19idWZfaW93YWl0KGJwKTsKIH0KIAogeGZzX2J1Zl90ICoKQEAgLTg5NywzNiArODk2LDYgQEAKIAl0cmFjZV94ZnNfYnVmX3VubG9jayhicCwgX1JFVF9JUF8pOwogfQogCi0KLS8qCi0gKglQaW5uaW5nIEJ1ZmZlciBTdG9yYWdlIGluIE1lbW9yeQotICoJRW5zdXJlIHRoYXQgbm8gYXR0ZW1wdCB0byBmb3JjZSBhIGJ1ZmZlciB0byBkaXNrIHdpbGwgc3VjY2VlZC4KLSAqLwotdm9pZAoteGZzX2J1Zl9waW4oCi0JeGZzX2J1Zl90CQkqYnApCi17Ci0JdHJhY2VfeGZzX2J1Zl9waW4oYnAsIF9SRVRfSVBfKTsKLQlhdG9taWNfaW5jKCZicC0+Yl9waW5fY291bnQpOwotfQotCi12b2lkCi14ZnNfYnVmX3VucGluKAotCXhmc19idWZfdAkJKmJwKQotewotCXRyYWNlX3hmc19idWZfdW5waW4oYnAsIF9SRVRfSVBfKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZicC0+Yl9waW5fY291bnQpKQotCQl3YWtlX3VwX2FsbCgmYnAtPmJfd2FpdGVycyk7Ci19Ci0KLWludAoteGZzX2J1Zl9pc3BpbigKLQl4ZnNfYnVmX3QJCSpicCkKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCk7Ci19Ci0KIFNUQVRJQyB2b2lkCiB4ZnNfYnVmX3dhaXRfdW5waW4oCiAJeGZzX2J1Zl90CQkqYnApCkBAIC0xMDE4LDEzICs5ODcsMTIgQEAKIHsKIAlpbnQJCQllcnJvcjsKIAotCWJwLT5iX3N0cmF0ID0geGZzX2Jkc3RyYXRfY2I7CiAJYnAtPmJfbW91bnQgPSBtcDsKIAlicC0+Yl9mbGFncyB8PSBYQkZfV1JJVEU7CiAJYnAtPmJfZmxhZ3MgJj0gfihYQkZfQVNZTkMgfCBYQkZfUkVBRCk7CiAKIAl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKLQl4ZnNfYnVmX2lvc3RyYXRlZ3koYnApOworCXhmc19iZHN0cmF0X2NiKGJwKTsKIAogCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOwogCWlmIChlcnJvcikKQEAgLTEwNDAsNyArMTAwOCw2IEBACiB7CiAJdHJhY2VfeGZzX2J1Zl9iZHdyaXRlKGJwLCBfUkVUX0lQXyk7CiAKLQlicC0+Yl9zdHJhdCA9IHhmc19iZHN0cmF0X2NiOwogCWJwLT5iX21vdW50ID0gbXA7CiAKIAlicC0+Yl9mbGFncyAmPSB+WEJGX1JFQUQ7CkBAIC0xMDc1LDcgKzEwNDIsNiBAQAogCVhGU19CVUZfVU5ET05FKGJwKTsKIAlYRlNfQlVGX1NUQUxFKGJwKTsKIAotCVhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhicCk7CiAJeGZzX2Jpb2RvbmUoYnApOwogCiAJcmV0dXJuIEVJTzsKQEAgLTExMDUsNyArMTA3MSw2IEBACiAJWEZTX0JVRl9ET05FKGJwKTsKIAlYRlNfQlVGX1NUQUxFKGJwKTsKIAlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7Ci0JWEZTX0JVRl9DTFJfQkRTVFJBVF9GVU5DKGJwKTsKIAlpZiAoIShmbCAmIFhCRl9BU1lOQykpIHsKIAkJLyoKIAkJICogTWFyayBiX2Vycm9yIGFuZCBCX0VSUk9SIF9ib3RoXy4KQEAgLTEzMTEsOCArMTI3NiwxOSBAQAogCQlpZiAoc2l6ZSkKIAkJCWdvdG8gbmV4dF9jaHVuazsKIAl9IGVsc2UgewotCQliaW9fcHV0KGJpbyk7CisJCS8qCisJCSAqIGlmIHdlIGdldCBoZXJlLCBubyBwYWdlcyB3ZXJlIGFkZGVkIHRvIHRoZSBiaW8uIEhvd2V2ZXIsCisJCSAqIHdlIGNhbid0IGp1c3QgZXJyb3Igb3V0IGhlcmUgLSBpZiB0aGUgcGFnZXMgYXJlIGxvY2tlZCB0aGVuCisJCSAqIHdlIGhhdmUgdG8gdW5sb2NrIHRoZW0gb3RoZXJ3aXNlIHdlIGNhbiBoYW5nIG9uIGEgbGF0ZXIKKwkJICogYWNjZXNzIHRvIHRoZSBwYWdlLgorCQkgKi8KIAkJeGZzX2J1Zl9pb2Vycm9yKGJwLCBFSU8pOworCQlpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX1BBR0VfTE9DS0VEKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCisJCQkJdW5sb2NrX3BhZ2UoYnAtPmJfcGFnZXNbaV0pOworCQl9CisJCWJpb19wdXQoYmlvKTsKIAl9CiB9CiAKQEAgLTE4MDQsNyArMTc4MCw3IEBACiAJCXRyYWNlX3hmc19idWZfZGVsd3JpX3NwbGl0KGJwLCBfUkVUX0lQXyk7CiAJCUFTU0VSVChicC0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpOwogCi0JCWlmICgheGZzX2J1Zl9pc3BpbihicCkgJiYgIXhmc19idWZfY29uZF9sb2NrKGJwKSkgeworCQlpZiAoIVhGU19CVUZfSVNQSU5ORUQoYnApICYmICF4ZnNfYnVmX2NvbmRfbG9jayhicCkpIHsKIAkJCWlmICghZm9yY2UgJiYKIAkJCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCBicC0+Yl9xdWV1ZXRpbWUgKyBhZ2UpKSB7CiAJCQkJeGZzX2J1Zl91bmxvY2soYnApOwpAQCAtMTg4OSw3ICsxODY1LDcgQEAKIAkJCXN0cnVjdCB4ZnNfYnVmICpicDsKIAkJCWJwID0gbGlzdF9maXJzdF9lbnRyeSgmdG1wLCBzdHJ1Y3QgeGZzX2J1ZiwgYl9saXN0KTsKIAkJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xpc3QpOwotCQkJeGZzX2J1Zl9pb3N0cmF0ZWd5KGJwKTsKKwkJCXhmc19iZHN0cmF0X2NiKGJwKTsKIAkJCWNvdW50Kys7CiAJCX0KIAkJaWYgKGNvdW50KQpAQCAtMTkzNiw3ICsxOTEyLDcgQEAKIAkJCWJwLT5iX2ZsYWdzICY9IH5YQkZfQVNZTkM7CiAJCQlsaXN0X2FkZCgmYnAtPmJfbGlzdCwgJndhaXRfbGlzdCk7CiAJCX0KLQkJeGZzX2J1Zl9pb3N0cmF0ZWd5KGJwKTsKKwkJeGZzX2Jkc3RyYXRfY2IoYnApOwogCX0KIAogCWlmICh3YWl0KSB7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCmluZGV4IDVmYmVjZWYuLmQwNzJlNWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCkBAIC00NCw1NyArNDQsNTcgQEAKIAlYQlJXX1pFUk8gPSAzLAkJCS8qIFplcm8gdGFyZ2V0IG1lbW9yeSAqLwogfSB4ZnNfYnVmX3J3X3Q7CiAKLXR5cGVkZWYgZW51bSB7Ci0JWEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCi0JWEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLwotCVhCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKGJfYWRkciB2YWxpZCkgICAgICAgICAgICAqLwotCVhCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLwotCVhCRl9ET05FID0gKDEgPDwgNSksICAgIC8qIGFsbCBwYWdlcyBpbiB0aGUgYnVmZmVyIHVwdG9kYXRlCSAgICovCi0JWEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCi0JWEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLwotCVhCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLwotIAlYQkZfT1JERVJFRCA9ICgxIDw8IDExKSwgICAgLyogdXNlIG9yZGVyZWQgd3JpdGVzCQkgICAqLwotCVhCRl9SRUFEX0FIRUFEID0gKDEgPDwgMTIpLCAvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZAkJICAgKi8KLQlYQkZfTE9HX0JVRkZFUiA9ICgxIDw8IDEzKSwgLyogdGhpcyBpcyBhIGJ1ZmZlciB1c2VkIGZvciB0aGUgbG9nICAgKi8KKyNkZWZpbmUgWEJGX1JFQUQJKDEgPDwgMCkgLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCisjZGVmaW5lIFhCRl9XUklURQkoMSA8PCAxKSAvKiBidWZmZXIgaW50ZW5kZWQgZm9yIHdyaXRpbmcgdG8gZGV2aWNlICovCisjZGVmaW5lIFhCRl9NQVBQRUQJKDEgPDwgMikgLyogYnVmZmVyIG1hcHBlZCAoYl9hZGRyIHZhbGlkKSAqLworI2RlZmluZSBYQkZfQVNZTkMJKDEgPDwgNCkgLyogaW5pdGlhdG9yIHdpbGwgbm90IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgWEJGX0RPTkUJKDEgPDwgNSkgLyogYWxsIHBhZ2VzIGluIHRoZSBidWZmZXIgdXB0b2RhdGUgKi8KKyNkZWZpbmUgWEJGX0RFTFdSSQkoMSA8PCA2KSAvKiBidWZmZXIgaGFzIGRpcnR5IHBhZ2VzICovCisjZGVmaW5lIFhCRl9TVEFMRQkoMSA8PCA3KSAvKiBidWZmZXIgaGFzIGJlZW4gc3RhbGVkLCBkbyBub3QgZmluZCBpdCAqLworI2RlZmluZSBYQkZfRlNfTUFOQUdFRAkoMSA8PCA4KSAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICovCisjZGVmaW5lIFhCRl9PUkRFUkVECSgxIDw8IDExKS8qIHVzZSBvcmRlcmVkIHdyaXRlcyAqLworI2RlZmluZSBYQkZfUkVBRF9BSEVBRAkoMSA8PCAxMikvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZCAqLworI2RlZmluZSBYQkZfTE9HX0JVRkZFUgkoMSA8PCAxMykvKiB0aGlzIGlzIGEgYnVmZmVyIHVzZWQgZm9yIHRoZSBsb2cgKi8KIAotCS8qIGZsYWdzIHVzZWQgb25seSBhcyBhcmd1bWVudHMgdG8gYWNjZXNzIHJvdXRpbmVzICovCi0JWEJGX0xPQ0sgPSAoMSA8PCAxNCksICAgICAgIC8qIGxvY2sgcmVxdWVzdGVkCQkJICAgKi8KLQlYQkZfVFJZTE9DSyA9ICgxIDw8IDE1KSwgICAgLyogbG9jayByZXF1ZXN0ZWQsIGJ1dCBkbyBub3Qgd2FpdAkgICAqLwotCVhCRl9ET05UX0JMT0NLID0gKDEgPDwgMTYpLCAvKiBkbyBub3QgYmxvY2sgaW4gY3VycmVudCB0aHJlYWQJICAgKi8KKy8qIGZsYWdzIHVzZWQgb25seSBhcyBhcmd1bWVudHMgdG8gYWNjZXNzIHJvdXRpbmVzICovCisjZGVmaW5lIFhCRl9MT0NLCSgxIDw8IDE0KS8qIGxvY2sgcmVxdWVzdGVkICovCisjZGVmaW5lIFhCRl9UUllMT0NLCSgxIDw8IDE1KS8qIGxvY2sgcmVxdWVzdGVkLCBidXQgZG8gbm90IHdhaXQgKi8KKyNkZWZpbmUgWEJGX0RPTlRfQkxPQ0sJKDEgPDwgMTYpLyogZG8gbm90IGJsb2NrIGluIGN1cnJlbnQgdGhyZWFkICovCiAKLQkvKiBmbGFncyB1c2VkIG9ubHkgaW50ZXJuYWxseSAqLwotCV9YQkZfUEFHRV9DQUNIRSA9ICgxIDw8IDE3KSwvKiBiYWNrZWQgYnkgcGFnZWNhY2hlCQkgICAqLwotCV9YQkZfUEFHRVMgPSAoMSA8PCAxOCksCSAgICAvKiBiYWNrZWQgYnkgcmVmY291bnRlZCBwYWdlcwkgICAqLwotCV9YQkZfUlVOX1FVRVVFUyA9ICgxIDw8IDE5KSwvKiBydW4gYmxvY2sgZGV2aWNlIHRhc2sgcXVldWUJICAgKi8KLQlfWEJGX0RFTFdSSV9RID0gKDEgPDwgMjEpLCAgIC8qIGJ1ZmZlciBvbiBkZWx3cmkgcXVldWUJCSAgICovCisvKiBmbGFncyB1c2VkIG9ubHkgaW50ZXJuYWxseSAqLworI2RlZmluZSBfWEJGX1BBR0VfQ0FDSEUJKDEgPDwgMTcpLyogYmFja2VkIGJ5IHBhZ2VjYWNoZSAqLworI2RlZmluZSBfWEJGX1BBR0VTCSgxIDw8IDE4KS8qIGJhY2tlZCBieSByZWZjb3VudGVkIHBhZ2VzICovCisjZGVmaW5lCV9YQkZfUlVOX1FVRVVFUwkoMSA8PCAxOSkvKiBydW4gYmxvY2sgZGV2aWNlIHRhc2sgcXVldWUJKi8KKyNkZWZpbmUgX1hCRl9ERUxXUklfUQkoMSA8PCAyMSkvKiBidWZmZXIgb24gZGVsd3JpIHF1ZXVlICovCiAKLQkvKgotCSAqIFNwZWNpYWwgZmxhZyBmb3Igc3VwcG9ydGluZyBtZXRhZGF0YSBibG9ja3Mgc21hbGxlciB0aGFuIGEgRlNCLgotCSAqCi0JICogSW4gdGhpcyBjYXNlIHdlIGNhbiBoYXZlIG11bHRpcGxlIHhmc19idWZfdCBvbiBhIHNpbmdsZSBwYWdlIGFuZAotCSAqIG5lZWQgdG8gbG9jayBvdXQgY29uY3VycmVudCB4ZnNfYnVmX3QgcmVhZGVycyBhcyB0aGV5IG9ubHkKLQkgKiBzZXJpYWxpc2UgYWNjZXNzIHRvIHRoZSBidWZmZXIuCi0JICoKLQkgKiBJZiB0aGUgRlNCIHNpemUgPj0gUEFHRV9DQUNIRV9TSVpFIGNhc2UsIHdlIGhhdmUgbm8gc2VyaWFsaXNhdGlvbgotCSAqIGJldHdlZW4gcmVhZHMgb2YgdGhlIHBhZ2UuIEhlbmNlIHdlIGNhbiBoYXZlIG9uZSB0aHJlYWQgcmVhZCB0aGUKLQkgKiBwYWdlIGFuZCBtb2RpZnkgaXQsIGJ1dCB0aGVuIHJhY2Ugd2l0aCBhbm90aGVyIHRocmVhZCB0aGF0IHRoaW5rcwotCSAqIHRoZSBwYWdlIGlzIG5vdCB1cC10by1kYXRlIGFuZCBoZW5jZSByZWFkcyBpdCBhZ2Fpbi4KLQkgKgotCSAqIFRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZmlyc3QgbW9kaWZjYXRpb24gdG8gdGhlIHBhZ2UgaXMgbG9zdC4KLQkgKiBUaGlzIHNvcnQgb2YgQUdGL0FHSSByZWFkaW5nIHJhY2UgY2FuIGhhcHBlbiB3aGVuIHVubGlua2luZyBpbm9kZXMKLQkgKiB0aGF0IHJlcXVpcmUgdHJ1bmNhdGlvbiBhbmQgcmVzdWx0cyBpbiB0aGUgQUdJIHVubGlua2VkIGxpc3QKLQkgKiBtb2RpZmljYXRpb25zIGJlaW5nIGxvc3QuCi0JICovCi0JX1hCRl9QQUdFX0xPQ0tFRCA9ICgxIDw8IDIyKSwKKy8qCisgKiBTcGVjaWFsIGZsYWcgZm9yIHN1cHBvcnRpbmcgbWV0YWRhdGEgYmxvY2tzIHNtYWxsZXIgdGhhbiBhIEZTQi4KKyAqCisgKiBJbiB0aGlzIGNhc2Ugd2UgY2FuIGhhdmUgbXVsdGlwbGUgeGZzX2J1Zl90IG9uIGEgc2luZ2xlIHBhZ2UgYW5kCisgKiBuZWVkIHRvIGxvY2sgb3V0IGNvbmN1cnJlbnQgeGZzX2J1Zl90IHJlYWRlcnMgYXMgdGhleSBvbmx5CisgKiBzZXJpYWxpc2UgYWNjZXNzIHRvIHRoZSBidWZmZXIuCisgKgorICogSWYgdGhlIEZTQiBzaXplID49IFBBR0VfQ0FDSEVfU0laRSBjYXNlLCB3ZSBoYXZlIG5vIHNlcmlhbGlzYXRpb24KKyAqIGJldHdlZW4gcmVhZHMgb2YgdGhlIHBhZ2UuIEhlbmNlIHdlIGNhbiBoYXZlIG9uZSB0aHJlYWQgcmVhZCB0aGUKKyAqIHBhZ2UgYW5kIG1vZGlmeSBpdCwgYnV0IHRoZW4gcmFjZSB3aXRoIGFub3RoZXIgdGhyZWFkIHRoYXQgdGhpbmtzCisgKiB0aGUgcGFnZSBpcyBub3QgdXAtdG8tZGF0ZSBhbmQgaGVuY2UgcmVhZHMgaXQgYWdhaW4uCisgKgorICogVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBmaXJzdCBtb2RpZmNhdGlvbiB0byB0aGUgcGFnZSBpcyBsb3N0LgorICogVGhpcyBzb3J0IG9mIEFHRi9BR0kgcmVhZGluZyByYWNlIGNhbiBoYXBwZW4gd2hlbiB1bmxpbmtpbmcgaW5vZGVzCisgKiB0aGF0IHJlcXVpcmUgdHJ1bmNhdGlvbiBhbmQgcmVzdWx0cyBpbiB0aGUgQUdJIHVubGlua2VkIGxpc3QKKyAqIG1vZGlmaWNhdGlvbnMgYmVpbmcgbG9zdC4KKyAqLworI2RlZmluZSBfWEJGX1BBR0VfTE9DS0VECSgxIDw8IDIyKQogCi0JLyoKLQkgKiBJZiB3ZSB0cnkgYSBiYXJyaWVyIHdyaXRlLCBidXQgaXQgZmFpbHMgd2UgaGF2ZSB0byBjb21tdW5pY2F0ZQotCSAqIHRoaXMgdG8gdGhlIHVwcGVyIGxheWVycy4gIFVuZm9ydHVuYXRlbHkgYl9lcnJvciBnZXRzIG92ZXJ3cml0dGVuCi0JICogd2hlbiB0aGUgYnVmZmVyIGlzIHJlLWlzc3VlZCBzbyB3ZSBoYXZlIHRvIGFkZCBhbm90aGVyIGZsYWcgdG8KLQkgKiBrZWVwIHRoaXMgaW5mb3JtYXRpb24uCi0JICovCi0JX1hGU19CQVJSSUVSX0ZBSUxFRCA9ICgxIDw8IDIzKSwKLX0geGZzX2J1Zl9mbGFnc190OworLyoKKyAqIElmIHdlIHRyeSBhIGJhcnJpZXIgd3JpdGUsIGJ1dCBpdCBmYWlscyB3ZSBoYXZlIHRvIGNvbW11bmljYXRlCisgKiB0aGlzIHRvIHRoZSB1cHBlciBsYXllcnMuICBVbmZvcnR1bmF0ZWx5IGJfZXJyb3IgZ2V0cyBvdmVyd3JpdHRlbgorICogd2hlbiB0aGUgYnVmZmVyIGlzIHJlLWlzc3VlZCBzbyB3ZSBoYXZlIHRvIGFkZCBhbm90aGVyIGZsYWcgdG8KKyAqIGtlZXAgdGhpcyBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBfWEZTX0JBUlJJRVJfRkFJTEVECSgxIDw8IDIzKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCB4ZnNfYnVmX2ZsYWdzX3Q7CiAKICNkZWZpbmUgWEZTX0JVRl9GTEFHUyBcCiAJeyBYQkZfUkVBRCwJCSJSRUFEIiB9LCBcCkBAIC0xODcsNyArMTg3LDYgQEAKIAlhdG9taWNfdAkJYl9pb19yZW1haW5pbmc7CS8qICNvdXRzdGFuZGluZyBJL08gcmVxdWVzdHMgKi8KIAl4ZnNfYnVmX2lvZG9uZV90CWJfaW9kb25lOwkvKiBJL08gY29tcGxldGlvbiBmdW5jdGlvbiAqLwogCXhmc19idWZfcmVsc2VfdAkJYl9yZWxzZTsJLyogcmVsZWFzaW5nIGZ1bmN0aW9uICovCi0JeGZzX2J1Zl9iZHN0cmF0X3QJYl9zdHJhdDsJLyogcHJlLXdyaXRlIGZ1bmN0aW9uICovCiAJc3RydWN0IGNvbXBsZXRpb24JYl9pb3dhaXQ7CS8qIHF1ZXVlIGZvciBJL08gd2FpdGVycyAqLwogCXZvaWQJCQkqYl9mc3ByaXY7CiAJdm9pZAkJCSpiX2ZzcHJpdjI7CkBAIC0yNDUsMTEgKzI0NCw2IEBACiBleHRlcm4gdm9pZCB4ZnNfYnVmX2lvbW92ZSh4ZnNfYnVmX3QgKiwgc2l6ZV90LCBzaXplX3QsIHZvaWQgKiwKIAkJCQl4ZnNfYnVmX3J3X3QpOwogCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfYnVmX2lvc3RyYXRlZ3koeGZzX2J1Zl90ICpicCkKLXsKLQlyZXR1cm4gYnAtPmJfc3RyYXQgPyBicC0+Yl9zdHJhdChicCkgOiB4ZnNfYnVmX2lvcmVxdWVzdChicCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHhmc19idWZfZ2V0ZXJyb3IoeGZzX2J1Zl90ICpicCkKIHsKIAlyZXR1cm4gYnAgPyBicC0+Yl9lcnJvciA6IEVOT01FTTsKQEAgLTI1OCwxMSArMjUyLDYgQEAKIC8qIEJ1ZmZlciBVdGlsaXR5IFJvdXRpbmVzICovCiBleHRlcm4geGZzX2NhZGRyX3QgeGZzX2J1Zl9vZmZzZXQoeGZzX2J1Zl90ICosIHNpemVfdCk7CiAKLS8qIFBpbm5pbmcgQnVmZmVyIFN0b3JhZ2UgaW4gTWVtb3J5ICovCi1leHRlcm4gdm9pZCB4ZnNfYnVmX3Bpbih4ZnNfYnVmX3QgKik7Ci1leHRlcm4gdm9pZCB4ZnNfYnVmX3VucGluKHhmc19idWZfdCAqKTsKLWV4dGVybiBpbnQgeGZzX2J1Zl9pc3Bpbih4ZnNfYnVmX3QgKik7Ci0KIC8qIERlbGF5ZWQgV3JpdGUgQnVmZmVyIFJvdXRpbmVzICovCiBleHRlcm4gdm9pZCB4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKHhmc19idWZfdCAqKTsKIGV4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX3Byb21vdGUoeGZzX2J1Zl90ICopOwpAQCAtMzI2LDggKzMxNSw2IEBACiAjZGVmaW5lIFhGU19CVUZfSU9ET05FX0ZVTkMoYnApCQkJKChicCktPmJfaW9kb25lKQogI2RlZmluZSBYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgZnVuYykJKChicCktPmJfaW9kb25lID0gKGZ1bmMpKQogI2RlZmluZSBYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCkJCSgoYnApLT5iX2lvZG9uZSA9IE5VTEwpCi0jZGVmaW5lIFhGU19CVUZfU0VUX0JEU1RSQVRfRlVOQyhicCwgZnVuYykJKChicCktPmJfc3RyYXQgPSAoZnVuYykpCi0jZGVmaW5lIFhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhicCkJCSgoYnApLT5iX3N0cmF0ID0gTlVMTCkKIAogI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURShicCwgdHlwZSkJCSgodHlwZSkoYnApLT5iX2ZzcHJpdikKICNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCB2YWwpCQkoKGJwKS0+Yl9mc3ByaXYgPSAodm9pZCopKHZhbCkpCkBAIC0zNTEsNyArMzM4LDcgQEAKICNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEUoYnAsIHR5cGUpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFhGU19CVUZfU0VUX1JFRihicCwgcmVmKQkJZG8geyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFhGU19CVUZfSVNQSU5ORUQoYnApCXhmc19idWZfaXNwaW4oYnApCisjZGVmaW5lIFhGU19CVUZfSVNQSU5ORUQoYnApCWF0b21pY19yZWFkKCYoKGJwKS0+Yl9waW5fY291bnQpKQogCiAjZGVmaW5lIFhGU19CVUZfVkFMVVNFTUEoYnApCXhmc19idWZfbG9ja192YWx1ZShicCkKICNkZWZpbmUgWEZTX0JVRl9DUFNFTUEoYnApCSh4ZnNfYnVmX2NvbmRfbG9jayhicCkgPT0gMCkKQEAgLTM3MCw4ICszNTcsNiBAQAogCXhmc19idWZfcmVsZShicCk7CiB9CiAKLSNkZWZpbmUgeGZzX2JwaW4oYnApCQl4ZnNfYnVmX3BpbihicCkKLSNkZWZpbmUgeGZzX2J1bnBpbihicCkJCXhmc19idWZfdW5waW4oYnApCiAjZGVmaW5lIHhmc19iaW9kb25lKGJwKQkJeGZzX2J1Zl9pb2VuZChicCwgMCkKIAogI2RlZmluZSB4ZnNfYmlvbW92ZShicCwgb2ZmLCBsZW4sIGRhdGEsIHJ3KSBcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19kbWFwaV9wcml2LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19kbWFwaV9wcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjBiMTYuLjAwMDAwMDAKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZG1hcGlfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpZm5kZWYgX19YRlNfRE1BUElfUFJJVl9IX18KLSNkZWZpbmUgX19YRlNfRE1BUElfUFJJVl9IX18KLQotLyoKLSAqCUJhc2VkIG9uIElPX0lTRElSRUNULCBkZWNpZGUgd2hpY2ggaV8gZmxhZyBpcyBzZXQuCi0gKi8KLSNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCi0JCQkgICAgICBETV9GTEFHU19JTVVYIDogMCkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lNVVgpCi0KLSNlbmRpZiAvKl9fWEZTX0RNQVBJX1BSSVZfSF9fKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKaW5kZXggZTc4MzllZS4uMzc2NGQ3NCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKQEAgLTIzLDEzICsyMywxMyBAQAogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2V4cG9ydC5oIgogI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIAogLyoKICAqIE5vdGUgdGhhdCB3ZSBvbmx5IGFjY2VwdCBmaWxlaWRzIHdoaWNoIGFyZSBsb25nIGVub3VnaCByYXRoZXIgdGhhbiBhbGxvdwpAQCAtMTMyLDggKzEzMiw3IEBACiAJICogZmluZSBhbmQgbm90IGFuIGluZGljYXRpb24gb2YgYSBjb3JydXB0ZWQgZmlsZXN5c3RlbSBhcyBjbGllbnRzIGNhbgogCSAqIHNlbmQgaW52YWxpZCBmaWxlIGhhbmRsZXMgYW5kIHdlIGhhdmUgdG8gaGFuZGxlIGl0IGdyYWNlZnVsbHkuLgogCSAqLwotCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgWEZTX0lHRVRfVU5UUlVTVEVELAotCQkJIFhGU19JTE9DS19TSEFSRUQsICZpcCk7CisJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCBYRlNfSUdFVF9VTlRSVVNURUQsIDAsICZpcCk7CiAJaWYgKGVycm9yKSB7CiAJCS8qCiAJCSAqIEVJTlZBTCBtZWFucyB0aGUgaW5vZGUgY2x1c3RlciBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCkBAIC0xNDgsMTEgKzE0NywxMCBAQAogCX0KIAogCWlmIChpcC0+aV9kLmRpX2dlbiAhPSBnZW5lcmF0aW9uKSB7Ci0JCXhmc19pcHV0X25ldyhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCUlSRUxFKGlwKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAJfQogCi0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCXJldHVybiBWRlNfSShpcCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCAyNTdhNTZiLi5iYThhZDQyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0yMiwyMyArMjIsMTUgQEAKICNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX3Zub2Rlb3BzLmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lvY3RsLmgiCkBAIC0xMDgsNyArMTAwLDcgQEAKIAlpbnQJCQllcnJvciA9IDA7CiAJaW50CQkJbG9nX2ZsdXNoZWQgPSAwOwogCi0JeGZzX2l0cmFjZV9lbnRyeShpcCk7CisJdHJhY2VfeGZzX2ZpbGVfZnN5bmMoaXApOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwpAQCAtMTY2LDggKzE1OCw3IEBACiAJCSAqIHRyYW5zYWN0aW9uLgkgU28gd2UgcGxheSBpdCBzYWZlIGFuZCBmaXJlIG9mZiB0aGUKIAkJICogdHJhbnNhY3Rpb24gYW55d2F5LgogCQkgKi8KLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKIAkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKIAkJZXJyb3IgPSBfeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgJmxvZ19mbHVzaGVkKTsKQEAgLTI3NSwyMCArMjY2LDYgQEAKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCi0JaWYgKERNX0VWRU5UX0VOQUJMRUQoaXAsIERNX0VWRU5UX1JFQUQpICYmICEoaW9mbGFncyAmIElPX0lOVklTKSkgewotCQlpbnQgZG1mbGFncyA9IEZJTFBfREVMQVlfRkxBRyhmaWxlKSB8IERNX1NFTV9GTEFHX1JEKGlvZmxhZ3MpOwotCQlpbnQgaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0KLQkJcmV0ID0gLVhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1JFQUQsIGlwLCBpb2NiLT5raV9wb3MsIHNpemUsCi0JCQkJCWRtZmxhZ3MsICZpb2xvY2spOwotCQlpZiAocmV0KSB7Ci0JCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwotCQkJaWYgKHVubGlrZWx5KGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkpCi0JCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCiAJaWYgKHVubGlrZWx5KGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkpIHsKIAkJaWYgKGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMpIHsKIAkJCXJldCA9IC14ZnNfZmx1c2hpbnZhbF9wYWdlcyhpcCwKQEAgLTMyMSw3ICsyOTgsNiBAQAogCXVuc2lnbmVkIGludAkJZmxhZ3MpCiB7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbmZpbHAtPmZfbWFwcGluZy0+aG9zdCk7Ci0Jc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKIAlpbnQJCQlpb2ZsYWdzID0gMDsKIAlzc2l6ZV90CQkJcmV0OwogCkBAIC0zMzUsMTggKzMxMSw2IEBACiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKIAotCWlmIChETV9FVkVOVF9FTkFCTEVEKGlwLCBETV9FVkVOVF9SRUFEKSAmJiAhKGlvZmxhZ3MgJiBJT19JTlZJUykpIHsKLQkJaW50IGlvbG9jayA9IFhGU19JT0xPQ0tfU0hBUkVEOwotCQlpbnQgZXJyb3I7Ci0KLQkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9SRUFELCBpcCwgKnBwb3MsIGNvdW50LAotCQkJCQlGSUxQX0RFTEFZX0ZMQUcoaW5maWxwKSwgJmlvbG9jayk7Ci0JCWlmIChlcnJvcikgewotCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKLQkJCXJldHVybiAtZXJyb3I7Ci0JCX0KLQl9Ci0KIAl0cmFjZV94ZnNfZmlsZV9zcGxpY2VfcmVhZChpcCwgY291bnQsICpwcG9zLCBpb2ZsYWdzKTsKIAogCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChpbmZpbHAsIHBwb3MsIHBpcGUsIGNvdW50LCBmbGFncyk7CkBAIC0zNjcsNyArMzMxLDYgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IG91dGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19mc2l6ZV90CQlpc2l6ZSwgbmV3X3NpemU7CiAJaW50CQkJaW9mbGFncyA9IDA7CiAJc3NpemVfdAkJCXJldDsKQEAgLTM4MiwxOCArMzQ1LDYgQEAKIAogCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAotCWlmIChETV9FVkVOVF9FTkFCTEVEKGlwLCBETV9FVkVOVF9XUklURSkgJiYgIShpb2ZsYWdzICYgSU9fSU5WSVMpKSB7Ci0JCWludCBpb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7Ci0JCWludCBlcnJvcjsKLQotCQllcnJvciA9IFhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1dSSVRFLCBpcCwgKnBwb3MsIGNvdW50LAotCQkJCQlGSUxQX0RFTEFZX0ZMQUcob3V0ZmlscCksICZpb2xvY2spOwotCQlpZiAoZXJyb3IpIHsKLQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCQkJcmV0dXJuIC1lcnJvcjsKLQkJfQotCX0KLQogCW5ld19zaXplID0gKnBwb3MgKyBjb3VudDsKIAogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtNDYzLDcgKzQxNCw3IEBACiAJbGFzdF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBpc2l6ZSk7CiAJbmltYXBzID0gMTsKIAllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgbGFzdF9mc2IsIDEsIDAsIE5VTEwsIDAsICZpbWFwLAotCQkJICAmbmltYXBzLCBOVUxMLCBOVUxMKTsKKwkJCSAgJm5pbWFwcywgTlVMTCk7CiAJaWYgKGVycm9yKSB7CiAJCXJldHVybiBlcnJvcjsKIAl9CkBAIC01NTgsNyArNTA5LDcgQEAKIAkJbmltYXBzID0gMTsKIAkJemVyb19jb3VudF9mc2IgPSBlbmRfemVyb19mc2IgLSBzdGFydF96ZXJvX2ZzYiArIDE7CiAJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBzdGFydF96ZXJvX2ZzYiwgemVyb19jb3VudF9mc2IsCi0JCQkJICAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCwgTlVMTCk7CisJCQkJICAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CiAJCWlmIChlcnJvcikgewogCQkJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMfFhGU19JT0xPQ0tfRVhDTCkpOwogCQkJcmV0dXJuIGVycm9yOwpAQCAtNjI3LDcgKzU3OCw2IEBACiAJaW50CQkJaW9mbGFncyA9IDA7CiAJeGZzX2ZzaXplX3QJCWlzaXplLCBuZXdfc2l6ZTsKIAlpbnQJCQlpb2xvY2s7Ci0JaW50CQkJZXZlbnRzZW50ID0gMDsKIAlzaXplX3QJCQlvY291bnQgPSAwLCBjb3VudDsKIAlpbnQJCQluZWVkX2lfbXV0ZXg7CiAKQEAgLTY3MywzMyArNjIzLDYgQEAKIAkJZ290byBvdXRfdW5sb2NrX211dGV4OwogCX0KIAotCWlmICgoRE1fRVZFTlRfRU5BQkxFRChpcCwgRE1fRVZFTlRfV1JJVEUpICYmCi0JICAgICEoaW9mbGFncyAmIElPX0lOVklTKSAmJiAhZXZlbnRzZW50KSkgewotCQlpbnQJCWRtZmxhZ3MgPSBGSUxQX0RFTEFZX0ZMQUcoZmlsZSk7Ci0KLQkJaWYgKG5lZWRfaV9tdXRleCkKLQkJCWRtZmxhZ3MgfD0gRE1fRkxBR1NfSU1VWDsKLQotCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQllcnJvciA9IFhGU19TRU5EX0RBVEEoaXAtPmlfbW91bnQsIERNX0VWRU5UX1dSSVRFLCBpcCwKLQkJCQkgICAgICBwb3MsIGNvdW50LCBkbWZsYWdzLCAmaW9sb2NrKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlnb3RvIG91dF91bmxvY2tfaW50ZXJuYWw7Ci0JCX0KLQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCWV2ZW50c2VudCA9IDE7Ci0KLQkJLyoKLQkJICogVGhlIGlvbG9jayB3YXMgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZCBpbiBYRlNfU0VORF9EQVRBCi0JCSAqIHNvIHdlIGhhdmUgdG8gcmVjaGVjayB0aGUgc2l6ZSB3aGVuIGFwcGVuZGluZy4KLQkJICogV2Ugd2lsbCBvbmx5ICJnb3RvIHN0YXJ0OyIgb25jZSwgc2luY2UgaGF2aW5nIHNlbnQgdGhlCi0JCSAqIGV2ZW50IHByZXZlbnRzIGFub3RoZXIgY2FsbCB0byBYRlNfU0VORF9EQVRBLCB3aGljaCBpcwotCQkgKiB3aGF0IGFsbG93cyB0aGUgc2l6ZSB0byBjaGFuZ2UgaW4gdGhlIGZpcnN0IHBsYWNlLgotCQkgKi8KLQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpICYmIHBvcyAhPSBpcC0+aV9zaXplKQotCQkJZ290byBzdGFydDsKLQl9Ci0KIAlpZiAoaW9mbGFncyAmIElPX0lTRElSRUNUKSB7CiAJCXhmc19idWZ0YXJnX3QJKnRhcmdldCA9CiAJCQlYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApID8KQEAgLTgzMCwyMiArNzUzLDYgQEAKIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAl9CiAKLQlpZiAocmV0ID09IC1FTk9TUEMgJiYKLQkgICAgRE1fRVZFTlRfRU5BQkxFRChpcCwgRE1fRVZFTlRfTk9TUEFDRSkgJiYgIShpb2ZsYWdzICYgSU9fSU5WSVMpKSB7Ci0JCXhmc19pdW5sb2NrKGlwLCBpb2xvY2spOwotCQlpZiAobmVlZF9pX211dGV4KQotCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKGlwLT5pX21vdW50LCBETV9FVkVOVF9OT1NQQUNFLCBpcCwKLQkJCQlETV9SSUdIVF9OVUxMLCBpcCwgRE1fUklHSFRfTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkwLCAwLCAwKTsgLyogRGVsYXkgZmxhZyBpbnRlbnRpb25hbGx5ICB1bnVzZWQgKi8KLQkJaWYgKG5lZWRfaV9tdXRleCkKLQkJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQkJeGZzX2lsb2NrKGlwLCBpb2xvY2spOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF91bmxvY2tfaW50ZXJuYWw7Ci0JCWdvdG8gc3RhcnQ7Ci0JfQotCiAJZXJyb3IgPSAtcmV0OwogCWlmIChyZXQgPD0gMCkKIAkJZ290byBvdXRfdW5sb2NrX2ludGVybmFsOwpAQCAtMTAxNCw5ICs5MjEsNiBAQAogCS5vcGVuCQk9IHhmc19maWxlX29wZW4sCiAJLnJlbGVhc2UJPSB4ZnNfZmlsZV9yZWxlYXNlLAogCS5mc3luYwkJPSB4ZnNfZmlsZV9mc3luYywKLSNpZmRlZiBIQVZFX0ZPUF9PUEVOX0VYRUMKLQkub3Blbl9leGVjCT0geGZzX2ZpbGVfb3Blbl9leGVjLAotI2VuZGlmCiB9OwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhmc19kaXJfZmlsZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jCmluZGV4IGI2OTE4ZDcuLjFmMjc5YjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMKQEAgLTIxLDEwICsyMSw2IEBACiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX3RyYWNlLmgiCiAKLWludCAgZnNfbm9lcnIodm9pZCkgeyByZXR1cm4gMDsgfQotaW50ICBmc19ub3N5cyh2b2lkKSB7IHJldHVybiBFTk9TWVM7IH0KLXZvaWQgZnNfbm92YWwodm9pZCkgeyByZXR1cm47IH0KLQogLyoKICAqIG5vdGU6IGFsbCBmaWxlbWFwIGZ1bmN0aW9ucyByZXR1cm4gbmVnYXRpdmUgZXJyb3IgY29kZXMuIFRoZXNlCiAgKiBuZWVkIHRvIGJlIGludmVydGVkIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIHhmcyBjb3JlIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiYjE5Yi4uMDAwMDAwMAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmCV9fWEZTX0ZTX1NVQlJfSF9fCi0jZGVmaW5lIF9fWEZTX0ZTX1NVQlJfSF9fCi0KLWV4dGVybiBpbnQgIGZzX25vZXJyKHZvaWQpOwotZXh0ZXJuIGludCAgZnNfbm9zeXModm9pZCk7Ci1leHRlcm4gdm9pZCBmc19ub3ZhbCh2b2lkKTsKLQotI2VuZGlmCS8qIF9fWEZTX0ZTX1NVQlJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwppbmRleCBlNTlhODEwLi4yMzdmNWZmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKQEAgLTIzLDI0ICsyMywxNSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW9jdGwuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgpAQCAtOTA4LDcgKzg5OSw3IEBACiAJc3RydWN0IHhmc19kcXVvdAkqb2xkZHF1b3QgPSBOVUxMOwogCWludAkJCWNvZGU7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKwl0cmFjZV94ZnNfaW9jdGxfc2V0YXR0cihpcCk7CiAKIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKQEAgLTEwNDMsOCArMTAzNCw3IEBACiAJCX0KIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBsb2NrX2ZsYWdzKTsKLQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCS8qCiAJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KQEAgLTExMTYsMTYgKzExMDYsNyBAQAogCXhmc19xbV9kcXJlbGUodWRxcCk7CiAJeGZzX3FtX2RxcmVsZShnZHFwKTsKIAotCWlmIChjb2RlKQotCQlyZXR1cm4gY29kZTsKLQotCWlmIChETV9FVkVOVF9FTkFCTEVEKGlwLCBETV9FVkVOVF9BVFRSSUJVVEUpKSB7Ci0JCVhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfQVRUUklCVVRFLCBpcCwgRE1fUklHSFRfTlVMTCwKLQkJCQlOVUxMLCBETV9SSUdIVF9OVUxMLCBOVUxMLCBOVUxMLCAwLCAwLAotCQkJCShtYXNrICYgRlNYX05PTkJMT0NLKSA/IERNX0ZMQUdTX05ERUxBWSA6IDApOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiBjb2RlOwogCiAgZXJyb3JfcmV0dXJuOgogCXhmc19xbV9kcXJlbGUodWRxcCk7CkBAIC0xMzAxLDcgKzEyODIsNyBAQAogCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9OT0NNVElNRSkKIAkJaW9mbGFncyB8PSBJT19JTlZJUzsKIAotCXhmc19pdHJhY2VfZW50cnkoaXApOworCXRyYWNlX3hmc19maWxlX2lvY3RsKGlwKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBYRlNfSU9DX0FMTE9DU1A6CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKaW5kZXggNTJlZDQ5ZS4uNmM4M2Y3ZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwpAQCAtMjgsMTIgKzI4LDggQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc192bm9kZS5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKQEAgLTU0NCw3ICs1NDAsNyBAQAogCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9OT0NNVElNRSkKIAkJaW9mbGFncyB8PSBJT19JTlZJUzsKIAotCXhmc19pdHJhY2VfZW50cnkoaXApOworCXRyYWNlX3hmc19maWxlX2NvbXBhdF9pb2N0bChpcCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCS8qIE5vIHNpemUgb3IgYWxpZ25tZW50IGlzc3VlcyBvbiBhbnkgYXJjaCAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCmluZGV4IDQ0ZjBiMmQuLjUzNmI4MWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKQEAgLTI0LDIxICsyNCwxMyBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKQEAgLTQ5Niw3ICs0ODgsNyBAQAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOwogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKwl0cmFjZV94ZnNfZ2V0YXR0cihpcCk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCmluZGV4IGZhY2ZiMzIuLjk5OGE5ZDcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaApAQCAtODcsNyArODcsNiBAQAogI2luY2x1ZGUgPHhmc19hb3BzLmg+CiAjaW5jbHVkZSA8eGZzX3N1cGVyLmg+CiAjaW5jbHVkZSA8eGZzX2dsb2JhbHMuaD4KLSNpbmNsdWRlIDx4ZnNfZnNfc3Vici5oPgogI2luY2x1ZGUgPHhmc19idWYuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3F1b3Rhb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19xdW90YW9wcy5jCmluZGV4IDA2N2NhZmIuLmJmZDVhYzkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3F1b3Rhb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfcXVvdGFvcHMuYwpAQCAtMTYsNyArMTYsNiBAQAogICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KICNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDgwOTM4YzcuLjc1OGRmOTQ2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTI1LDE0ICsyNSwxMSBAQAogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKQEAgLTQzLDcgKzQwLDYgQEAKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKQEAgLTk0LDcgKzkwLDYgQEAKICNkZWZpbmUgTU5UT1BUX0JBUlJJRVIJImJhcnJpZXIiCS8qIHVzZSB3cml0ZXIgYmFycmllcnMgZm9yIGxvZyB3cml0ZSBhbmQKIAkJCQkJICogdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uICovCiAjZGVmaW5lIE1OVE9QVF9OT0JBUlJJRVIgIm5vYmFycmllciIJLyogLi4gZGlzYWJsZSAqLwotI2RlZmluZSBNTlRPUFRfT1NZTkNJU09TWU5DICJvc3luY2lzb3N5bmMiIC8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCiAjZGVmaW5lIE1OVE9QVF82NEJJVElOT0RFICAgImlub2RlNjQiCS8qIGlub2RlcyBjYW4gYmUgYWxsb2NhdGVkIGFueXdoZXJlICovCiAjZGVmaW5lIE1OVE9QVF9JS0VFUAkiaWtlZXAiCQkvKiBkbyBub3QgZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLwogI2RlZmluZSBNTlRPUFRfTk9JS0VFUAkibm9pa2VlcCIJLyogZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLwpAQCAtMTE2LDkgKzExMSw2IEBACiAjZGVmaW5lIE1OVE9QVF9HUVVPVEFOT0VORiAiZ3Fub2VuZm9yY2UiLyogZ3JvdXAgcXVvdGEgbGltaXQgZW5mb3JjZW1lbnQgKi8KICNkZWZpbmUgTU5UT1BUX1BRVU9UQU5PRU5GICJwcW5vZW5mb3JjZSIvKiBwcm9qZWN0IHF1b3RhIGxpbWl0IGVuZm9yY2VtZW50ICovCiAjZGVmaW5lIE1OVE9QVF9RVU9UQU5PRU5GICAicW5vZW5mb3JjZSIJLyogc2FtZSBhcyB1cW5vZW5mb3JjZSAqLwotI2RlZmluZSBNTlRPUFRfRE1BUEkJImRtYXBpIgkJLyogRE1JIGVuYWJsZWQgKERNQVBJIC8gWERTTSkgKi8KLSNkZWZpbmUgTU5UT1BUX1hEU00JInhkc20iCQkvKiBETUkgZW5hYmxlZCAoRE1BUEkgLyBYRFNNKSAqLwotI2RlZmluZSBNTlRPUFRfRE1JCSJkbWkiCQkvKiBETUkgZW5hYmxlZCAoRE1BUEkgLyBYRFNNKSAqLwogI2RlZmluZSBNTlRPUFRfREVMQVlMT0cgICAiZGVsYXlsb2ciCS8qIERlbGF5ZWQgbG9naW5nIGVuYWJsZWQgKi8KICNkZWZpbmUgTU5UT1BUX05PREVMQVlMT0cgIm5vZGVsYXlsb2ciCS8qIERlbGF5ZWQgbG9naW5nIGRpc2FibGVkICovCiAKQEAgLTE3MiwxNSArMTY0LDEzIEBACiBTVEFUSUMgaW50CiB4ZnNfcGFyc2VhcmdzKAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCWNoYXIJCQkqb3B0aW9ucywKLQljaGFyCQkJKiptdHB0KQorCWNoYXIJCQkqb3B0aW9ucykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiID0gbXAtPm1fc3VwZXI7CiAJY2hhcgkJCSp0aGlzX2NoYXIsICp2YWx1ZSwgKmVvdjsKIAlpbnQJCQlkc3VuaXQgPSAwOwogCWludAkJCWRzd2lkdGggPSAwOwogCWludAkJCWlvc2l6ZSA9IDA7Ci0JaW50CQkJZG1hcGlfaW1wbGllc19pa2VlcCA9IDE7CiAJX191aW50OF90CQlpb3NpemVsb2cgPSAwOwogCiAJLyoKQEAgLTI0MywxNSArMjMzLDEwIEBACiAJCQlpZiAoIW1wLT5tX2xvZ25hbWUpCiAJCQkJcmV0dXJuIEVOT01FTTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX01UUFQpKSB7Ci0JCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKLQkJCQljbW5fZXJyKENFX1dBUk4sCi0JCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCi0JCQkJCXRoaXNfY2hhcik7Ci0JCQkJcmV0dXJuIEVJTlZBTDsKLQkJCX0KLQkJCSptdHB0ID0ga3N0cm5kdXAodmFsdWUsIE1BWE5BTUVMRU4sIEdGUF9LRVJORUwpOwotCQkJaWYgKCEqbXRwdCkKLQkJCQlyZXR1cm4gRU5PTUVNOworCQkJY21uX2VycihDRV9XQVJOLAorCQkJCSJYRlM6ICVzIG9wdGlvbiBub3QgYWxsb3dlZCBvbiB0aGlzIHN5c3RlbSIsCisJCQkJdGhpc19jaGFyKTsKKwkJCXJldHVybiBFSU5WQUw7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9SVERFVikpIHsKIAkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewogCQkJCWNtbl9lcnIoQ0VfV0FSTiwKQEAgLTI4OCw4ICsyNzMsNiBAQAogCQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9HUlBJRDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1dTWU5DKSkgewogCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1dTWU5DOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfT1NZTkNJU09TWU5DKSkgewotCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX09TWU5DSVNPU1lOQzsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PUkVDT1ZFUlkpKSB7CiAJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9SRUNPVkVSWTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQUxJR04pKSB7CkBAIC0zMjksNyArMzEyLDYgQEAKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lLRUVQKSkgewogCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lLRUVQOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9JS0VFUCkpIHsKLQkJCWRtYXBpX2ltcGxpZXNfaWtlZXAgPSAwOwogCQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9JS0VFUDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xBUkdFSU8pKSB7CiAJCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0NPTVBBVF9JT1NJWkU7CkBAIC0zNzAsMTIgKzM1Miw2IEBACiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUVVPVEFOT0VORikpIHsKIAkJCW1wLT5tX3FmbGFncyB8PSAoWEZTX0dRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ1RJVkUpOwogCQkJbXAtPm1fcWZsYWdzICY9IH5YRlNfT1FVT1RBX0VORkQ7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ETUFQSSkpIHsKLQkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ETUFQSTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1hEU00pKSB7Ci0JCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRE1BUEk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ETUkpKSB7Ci0JCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRE1BUEk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ERUxBWUxPRykpIHsKIAkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ERUxBWUxPRzsKIAkJCWNtbl9lcnIoQ0VfV0FSTiwKQEAgLTM4Nyw5ICszNjMsMTEgQEAKIAkJCWNtbl9lcnIoQ0VfV0FSTiwKIAkiWEZTOiBpaGFzaHNpemUgbm8gbG9uZ2VyIHVzZWQsIG9wdGlvbiBpcyBkZXByZWNhdGVkLiIpOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib3N5bmNpc2RzeW5jIikpIHsKLQkJCS8qIG5vLW9wLCB0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCAqLwogCQkJY21uX2VycihDRV9XQVJOLAotCSJYRlM6IG9zeW5jaXNkc3luYyBpcyBub3cgdGhlIGRlZmF1bHQsIG9wdGlvbiBpcyBkZXByZWNhdGVkLiIpOworCSJYRlM6IG9zeW5jaXNkc3luYyBoYXMgbm8gZWZmZWN0LCBvcHRpb24gaXMgZGVwcmVjYXRlZC4iKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgIm9zeW5jaXNvc3luYyIpKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogb3N5bmNpc29zeW5jIGhhcyBubyBlZmZlY3QsIG9wdGlvbiBpcyBkZXByZWNhdGVkLiIpOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaXJpeHNnaWQiKSkgewogCQkJY21uX2VycihDRV9XQVJOLAogCSJYRlM6IGlyaXhzZ2lkIGlzIG5vdyBhIHN5c2N0bCgyKSB2YXJpYWJsZSwgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIik7CkBAIC00MzAsMTIgKzQwOCw2IEBACiAJCXJldHVybiBFSU5WQUw7CiAJfQogCi0JaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgJiYgKCEqbXRwdCB8fCAqbXRwdFswXSA9PSAnXDAnKSkgewotCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIG5lZWRzIHRoZSBtb3VudCBwb2ludCBvcHRpb24gYXMgd2VsbFxuIiwKLQkJCU1OVE9QVF9ETUFQSSk7Ci0JCXJldHVybiBFSU5WQUw7Ci0JfQotCiAJaWYgKChkc3VuaXQgJiYgIWRzd2lkdGgpIHx8ICghZHN1bml0ICYmIGRzd2lkdGgpKSB7CiAJCWNtbl9lcnIoQ0VfV0FSTiwKIAkJCSJYRlM6IHN1bml0IGFuZCBzd2lkdGggbXVzdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIiKTsKQEAgLTQ0OSwxOCArNDIxLDYgQEAKIAkJcmV0dXJuIEVJTlZBTDsKIAl9CiAKLQkvKgotCSAqIEFwcGxpY2F0aW9ucyB1c2luZyBETUkgZmlsZXN5c3RlbXMgb2Z0ZW4gZXhwZWN0IHRoZQotCSAqIGlub2RlIGdlbmVyYXRpb24gbnVtYmVyIHRvIGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KLQkgKiBJZiB3ZSBkZWxldGUgaW5vZGUgY2h1bmtzIHdlIGJyZWFrIHRoaXMgYXNzdW1wdGlvbiwgc28KLQkgKiBrZWVwIHVudXNlZCBpbm9kZSBjaHVua3Mgb24gZGlzayBmb3IgRE1JIGZpbGVzeXN0ZW1zCi0JICogdW50aWwgd2UgY29tZSB1cCB3aXRoIGEgYmV0dGVyIHNvbHV0aW9uLgotCSAqIE5vdGUgdGhhdCBpZiAiaWtlZXAiIG9yICJub2lrZWVwIiBtb3VudCBvcHRpb25zIGFyZQotCSAqIHN1cHBsaWVkLCB0aGVuIHRoZXkgYXJlIGhvbm9yZWQuCi0JICovCi0JaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgJiYgZG1hcGlfaW1wbGllc19pa2VlcCkKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lLRUVQOwotCiBkb25lOgogCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PQUxJR04pKSB7CiAJCS8qCkBAIC01MzksMTAgKzQ5OSw4IEBACiAJCXsgWEZTX01PVU5UX1NXQUxMT0MsCQkiLCIgTU5UT1BUX1NXQUxMT0MgfSwKIAkJeyBYRlNfTU9VTlRfTk9VVUlELAkJIiwiIE1OVE9QVF9OT1VVSUQgfSwKIAkJeyBYRlNfTU9VTlRfTk9SRUNPVkVSWSwJCSIsIiBNTlRPUFRfTk9SRUNPVkVSWSB9LAotCQl7IFhGU19NT1VOVF9PU1lOQ0lTT1NZTkMsCSIsIiBNTlRPUFRfT1NZTkNJU09TWU5DIH0sCiAJCXsgWEZTX01PVU5UX0FUVFIyLAkJIiwiIE1OVE9QVF9BVFRSMiB9LAogCQl7IFhGU19NT1VOVF9GSUxFU1RSRUFNUywJIiwiIE1OVE9QVF9GSUxFU1RSRUFNIH0sCi0JCXsgWEZTX01PVU5UX0RNQVBJLAkJIiwiIE1OVE9QVF9ETUFQSSB9LAogCQl7IFhGU19NT1VOVF9HUlBJRCwJCSIsIiBNTlRPUFRfR1JQSUQgfSwKIAkJeyBYRlNfTU9VTlRfREVMQVlMT0csCQkiLCIgTU5UT1BUX0RFTEFZTE9HIH0sCiAJCXsgMCwgTlVMTCB9CkBAIC05NDcsNyArOTA1LDcgQEAKIHsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKIAotCXhmc19pdHJhY2VfZW50cnkoaXApOworCXRyYWNlX3hmc19kZXN0cm95X2lub2RlKGlwKTsKIAogCVhGU19TVEFUU19JTkModm5fcmVjbGFpbSk7CiAKQEAgLTEwNjMsMTAgKzEwMjEsOCBAQAogCSAqIGFuIGlub2RlIGluIGFub3RoZXIgcmVjZW50IHRyYW5zYWN0aW9uLiAgU28gd2UgcGxheSBpdCBzYWZlIGFuZAogCSAqIGZpcmUgb2ZmIHRoZSB0cmFuc2FjdGlvbiBhbnl3YXkuCiAJICovCi0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXApOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKLQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwogCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAJeGZzX2lsb2NrX2RlbW90ZShpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCkBAIC0xMDgyLDI3ICsxMDM4LDE4IEBACiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKIAlpbnQJCQllcnJvciA9IEVBR0FJTjsKIAotCXhmc19pdHJhY2VfZW50cnkoaXApOworCXRyYWNlX3hmc193cml0ZV9pbm9kZShpcCk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkgewogCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlIGlub2RlIGhhcyBoaXQgc3RhYmxlIHN0b3JhZ2UuICBCeSB1c2luZyB0aGUKLQkJICogbG9nIGFuZCB0aGUgZnN5bmMgdHJhbnNhY3Rpb25zIHdlIHJlZHVjZSB0aGUgSU9zIHdlIGhhdmUKLQkJICogdG8gZG8gaGVyZSBmcm9tIHR3byAobG9nIGFuZCBpbm9kZSkgdG8ganVzdCB0aGUgbG9nLgotCQkgKgotCQkgKiBOb3RlOiBXZSBzdGlsbCBuZWVkIHRvIGRvIGEgZGVsd3JpIHdyaXRlIG9mIHRoZSBpbm9kZSBhZnRlcgotCQkgKiB0aGlzIHRvIGZsdXNoIGl0IHRvIHRoZSBiYWNraW5nIGJ1ZmZlciBzbyB0aGF0IGJ1bGtzdGF0Ci0JCSAqIHdvcmtzIHByb3Blcmx5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGlub2RlIGhhcyBiZWVuCi0JCSAqIHdyaXR0ZW4uICBCZWNhdXNlIHdlIGhvbGQgdGhlIGlsb2NrIGF0b21pY2FsbHkgb3ZlciB0aGUKLQkJICogdHJhbnNhY3Rpb24gY29tbWl0IGFuZCB0aGUgaW5vZGUgZmx1c2ggd2UgYXJlIGd1YXJhbnRlZWQKLQkJICogdGhhdCB0aGUgaW5vZGUgaXMgbm90IHBpbm5lZCB3aGVuIGl0IHJldHVybnMuIElmIHRoZSBmbHVzaAotCQkgKiBsb2NrIGlzIGFscmVhZHkgaGVsZCwgdGhlbiB0aGUgaW5vZGUgaGFzIGFscmVhZHkgYmVlbgotCQkgKiBmbHVzaGVkIG9uY2UgYW5kIHdlIGRvbid0IG5lZWQgdG8gZmx1c2ggaXQgYWdhaW4uICBIZW5jZQotCQkgKiB0aGUgY29kZSB3aWxsIG9ubHkgZmx1c2ggdGhlIGlub2RlIGlmIGl0IGlzbid0IGFscmVhZHkKLQkJICogYmVpbmcgZmx1c2hlZC4KKwkJICogTWFrZSBzdXJlIHRoZSBpbm9kZSBoYXMgbWFkZSBpdCBpdCBpbnRvIHRoZSBsb2cuICBJbnN0ZWFkCisJCSAqIG9mIGZvcmNpbmcgaXQgYWxsIHRoZSB3YXkgdG8gc3RhYmxlIHN0b3JhZ2UgdXNpbmcgYQorCQkgKiBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbiB3ZSBsZXQgdGhlIGxvZyBmb3JjZSBpbnNpZGUgdGhlCisJCSAqIC0+c3luY19mcyBjYWxsIGRvIHRoYXQgZm9yIHRodXMsIHdoaWNoIHJlZHVjZXMgdGhlIG51bWJlcgorCQkgKiBvZiBzeW5jaHJvbm91cyBsb2cgZm9jZXMgZHJhbWF0aWNhbGx5LgogCQkgKi8KIAkJeGZzX2lvZW5kX3dhaXQoaXApOwogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwpAQCAtMTExNiwyNyArMTA2MywyOSBAQAogCQkgKiBXZSBtYWtlIHRoaXMgbm9uLWJsb2NraW5nIGlmIHRoZSBpbm9kZSBpcyBjb250ZW5kZWQsIHJldHVybgogCQkgKiBFQUdBSU4gdG8gaW5kaWNhdGUgdG8gdGhlIGNhbGxlciB0aGF0IHRoZXkgZGlkIG5vdCBzdWNjZWVkLgogCQkgKiBUaGlzIHByZXZlbnRzIHRoZSBmbHVzaCBwYXRoIGZyb20gYmxvY2tpbmcgb24gaW5vZGVzIGluc2lkZQotCQkgKiBhbm90aGVyIG9wZXJhdGlvbiByaWdodCBub3csIHRoZXkgZ2V0IGNhdWdodCBsYXRlciBieSB4ZnNfc3luYy4KKwkJICogYW5vdGhlciBvcGVyYXRpb24gcmlnaHQgbm93LCB0aGV5IGdldCBjYXVnaHQgbGF0ZXIgYnkKKwkJICogeGZzX3N5bmMuCiAJCSAqLwogCQlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19TSEFSRUQpKQogCQkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKHhmc19pcGluY291bnQoaXApIHx8ICF4ZnNfaWZsb2NrX25vd2FpdChpcCkpCi0JCWdvdG8gb3V0X3VubG9jazsKKwkJaWYgKHhmc19pcGluY291bnQoaXApIHx8ICF4ZnNfaWZsb2NrX25vd2FpdChpcCkpCisJCQlnb3RvIG91dF91bmxvY2s7CiAKLQkvKgotCSAqIE5vdyB3ZSBoYXZlIHRoZSBmbHVzaCBsb2NrIGFuZCB0aGUgaW5vZGUgaXMgbm90IHBpbm5lZCwgd2UgY2FuIGNoZWNrCi0JICogaWYgdGhlIGlub2RlIGlzIHJlYWxseSBjbGVhbiBhcyB3ZSBrbm93IHRoYXQgdGhlcmUgYXJlIG5vIHBlbmRpbmcKLQkgKiB0cmFuc2FjdGlvbiBjb21wbGV0aW9ucywgaXQgaXMgbm90IHdhaXRpbmcgb24gdGhlIGRlbGF5ZWQgd3JpdGUKLQkgKiBxdWV1ZSBhbmQgdGhlcmUgaXMgbm8gSU8gaW4gcHJvZ3Jlc3MuCi0JICovCi0JaWYgKHhmc19pbm9kZV9jbGVhbihpcCkpIHsKLQkJeGZzX2lmdW5sb2NrKGlwKTsKLQkJZXJyb3IgPSAwOwotCQlnb3RvIG91dF91bmxvY2s7CisJCS8qCisJCSAqIE5vdyB3ZSBoYXZlIHRoZSBmbHVzaCBsb2NrIGFuZCB0aGUgaW5vZGUgaXMgbm90IHBpbm5lZCwgd2UKKwkJICogY2FuIGNoZWNrIGlmIHRoZSBpbm9kZSBpcyByZWFsbHkgY2xlYW4gYXMgd2Uga25vdyB0aGF0CisJCSAqIHRoZXJlIGFyZSBubyBwZW5kaW5nIHRyYW5zYWN0aW9uIGNvbXBsZXRpb25zLCBpdCBpcyBub3QKKwkJICogd2FpdGluZyBvbiB0aGUgZGVsYXllZCB3cml0ZSBxdWV1ZSBhbmQgdGhlcmUgaXMgbm8gSU8gaW4KKwkJICogcHJvZ3Jlc3MuCisJCSAqLworCQlpZiAoeGZzX2lub2RlX2NsZWFuKGlwKSkgeworCQkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJCWVycm9yID0gMDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQllcnJvciA9IHhmc19pZmx1c2goaXAsIDApOwogCX0KLQllcnJvciA9IHhmc19pZmx1c2goaXAsIDApOwogCiAgb3V0X3VubG9jazoKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CkBAIC0xMTU2LDcgKzExMDUsOCBAQAogewogCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpbm9kZSk7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKwl0cmFjZV94ZnNfY2xlYXJfaW5vZGUoaXApOworCiAJWEZTX1NUQVRTX0lOQyh2bl9yZWxlKTsKIAlYRlNfU1RBVFNfSU5DKHZuX3JlbW92ZSk7CiAJWEZTX1NUQVRTX0RFQyh2bl9hY3RpdmUpOwpAQCAtMTE5MywyMiArMTE0MywxMyBAQAogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oc2IpOwogCisJLyoKKwkgKiBVbnJlZ2lzdGVyIHRoZSBtZW1vcnkgc2hyaW5rZXIgYmVmb3JlIHdlIHRlYXIgZG93biB0aGUgbW91bnQKKwkgKiBzdHJ1Y3R1cmUgc28gd2UgZG9uJ3QgaGF2ZSBtZW1vcnkgcmVjbGFpbSByYWNpbmcgd2l0aCB1cyBoZXJlLgorCSAqLworCXhmc19pbm9kZV9zaHJpbmtlcl91bnJlZ2lzdGVyKG1wKTsKIAl4ZnNfc3luY2Rfc3RvcChtcCk7CiAKLQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLQkJLyoKLQkJICogWFhYKGhjaCk6IHRoaXMgc2hvdWxkIGJlIFNZTkNfV0FJVC4KLQkJICoKLQkJICogT3IgbW9yZSBsaWtlbHkgbm90IG5lZWRlZCBhdCBhbGwgYmVjYXVzZSB0aGUgVkZTIGlzIGFscmVhZHkKLQkJICogY2FsbGluZyAtPnN5bmNfZnMgYWZ0ZXIgc2h1dHRpbmcgZG93biBhbGwgZmlsZXN0ZW0KLQkJICogb3BlcmF0aW9ucyBhbmQganVzdCBiZWZvcmUgY2FsbGluZyAtPnB1dF9zdXBlci4KLQkJICovCi0JCXhmc19zeW5jX2RhdGEobXAsIDApOwotCQl4ZnNfc3luY19hdHRyKG1wLCAwKTsKLQl9Ci0KLQlYRlNfU0VORF9QUkVVTk1PVU5UKG1wKTsKLQogCS8qCiAJICogQmxvdyBhd2F5IGFueSByZWZlcmVuY2VkIGlub2RlIGluIHRoZSBmaWxlc3RyZWFtcyBjYWNoZS4KIAkgKiBUaGlzIGNhbiBhbmQgd2lsbCBjYXVzZSBsb2cgdHJhZmZpYyBhcyBpbm9kZXMgZ28gaW5hY3RpdmUKQEAgLTEyMTgsMTQgKzExNTksMTAgQEAKIAogCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CiAKLQlYRlNfU0VORF9VTk1PVU5UKG1wKTsKLQogCXhmc191bm1vdW50ZnMobXApOwogCXhmc19mcmVlc2IobXApOwotCXhmc19pbm9kZV9zaHJpbmtlcl91bnJlZ2lzdGVyKG1wKTsKIAl4ZnNfaWNzYl9kZXN0cm95X2NvdW50ZXJzKG1wKTsKIAl4ZnNfY2xvc2VfZGV2aWNlcyhtcCk7Ci0JeGZzX2Rtb3BzX3B1dChtcCk7CiAJeGZzX2ZyZWVfZnNuYW1lKG1wKTsKIAlrZnJlZShtcCk7CiB9CkBAIC0xNTQzLDcgKzE0ODAsNiBAQAogCXN0cnVjdCBpbm9kZQkJKnJvb3Q7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBOVUxMOwogCWludAkJCWZsYWdzID0gMCwgZXJyb3IgPSBFTk9NRU07Ci0JY2hhcgkJCSptdHB0ID0gTlVMTDsKIAogCW1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHhmc19tb3VudCksIEdGUF9LRVJORUwpOwogCWlmICghbXApCkBAIC0xNTU5LDcgKzE0OTUsNyBAQAogCW1wLT5tX3N1cGVyID0gc2I7CiAJc2ItPnNfZnNfaW5mbyA9IG1wOwogCi0JZXJyb3IgPSB4ZnNfcGFyc2VhcmdzKG1wLCAoY2hhciAqKWRhdGEsICZtdHB0KTsKKwllcnJvciA9IHhmc19wYXJzZWFyZ3MobXAsIChjaGFyICopZGF0YSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlX2ZzbmFtZTsKIApAQCAtMTU3MSwxNiArMTUwNywxMiBAQAogI2VuZGlmCiAJc2ItPnNfb3AgPSAmeGZzX3N1cGVyX29wZXJhdGlvbnM7CiAKLQllcnJvciA9IHhmc19kbW9wc19nZXQobXApOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfZnJlZV9mc25hbWU7Ci0KIAlpZiAoc2lsZW50KQogCQlmbGFncyB8PSBYRlNfTUZTSV9RVUlFVDsKIAogCWVycm9yID0geGZzX29wZW5fZGV2aWNlcyhtcCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dF9wdXRfZG1vcHM7CisJCWdvdG8gb3V0X2ZyZWVfZnNuYW1lOwogCiAJaWYgKHhmc19pY3NiX2luaXRfY291bnRlcnMobXApKQogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9fUEVSQ1BVX1NCOwpAQCAtMTYwOCw4ICsxNTQwLDYgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZpbGVzdHJlYW1fdW5tb3VudDsKIAotCVhGU19TRU5EX01PVU5UKG1wLCBETV9SSUdIVF9OVUxMLCBtdHB0LCBtcC0+bV9mc25hbWUpOwotCiAJc2ItPnNfbWFnaWMgPSBYRlNfU0JfTUFHSUM7CiAJc2ItPnNfYmxvY2tzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gZmZzKHNiLT5zX2Jsb2Nrc2l6ZSkgLSAxOwpAQCAtMTYzOCw3ICsxNTY4LDYgQEAKIAogCXhmc19pbm9kZV9zaHJpbmtlcl9yZWdpc3RlcihtcCk7CiAKLQlrZnJlZShtdHB0KTsKIAlyZXR1cm4gMDsKIAogIG91dF9maWxlc3RyZWFtX3VubW91bnQ6CkBAIC0xNjQ4LDExICsxNTc3LDggQEAKICBvdXRfZGVzdHJveV9jb3VudGVyczoKIAl4ZnNfaWNzYl9kZXN0cm95X2NvdW50ZXJzKG1wKTsKIAl4ZnNfY2xvc2VfZGV2aWNlcyhtcCk7Ci0gb3V0X3B1dF9kbW9wczoKLQl4ZnNfZG1vcHNfcHV0KG1wKTsKICBvdXRfZnJlZV9mc25hbWU6CiAJeGZzX2ZyZWVfZnNuYW1lKG1wKTsKLQlrZnJlZShtdHB0KTsKIAlrZnJlZShtcCk7CiAgb3V0OgogCXJldHVybiAtZXJyb3I7CkBAIC0xNzU5LDYgKzE2ODUsMTIgQEAKIAlpZiAoIXhmc190cmFuc196b25lKQogCQlnb3RvIG91dF9kZXN0cm95X2lmb3JrX3pvbmU7CiAKKwl4ZnNfbG9nX2l0ZW1fZGVzY196b25lID0KKwkJa21lbV96b25lX2luaXQoc2l6ZW9mKHN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyksCisJCQkgICAgICAgInhmc19sb2dfaXRlbV9kZXNjIik7CisJaWYgKCF4ZnNfbG9nX2l0ZW1fZGVzY196b25lKQorCQlnb3RvIG91dF9kZXN0cm95X3RyYW5zX3pvbmU7CisKIAkvKgogCSAqIFRoZSBzaXplIG9mIHRoZSB6b25lIGFsbG9jYXRlZCBidWYgbG9nIGl0ZW0gaXMgdGhlIG1heGltdW0KIAkgKiBzaXplIHBvc3NpYmxlIHVuZGVyIFhGUy4gIFRoaXMgd2FzdGVzIGEgbGl0dGxlIGJpdCBvZiBtZW1vcnksCkBAIC0xNzY4LDcgKzE3MDAsNyBAQAogCQkJCSgoKFhGU19NQVhfQkxPQ0tTSVpFIC8gWEZTX0JMRl9DSFVOSykgLwogCQkJCSAgTkJXT1JEKSAqIHNpemVvZihpbnQpKSksICJ4ZnNfYnVmX2l0ZW0iKTsKIAlpZiAoIXhmc19idWZfaXRlbV96b25lKQotCQlnb3RvIG91dF9kZXN0cm95X3RyYW5zX3pvbmU7CisJCWdvdG8gb3V0X2Rlc3Ryb3lfbG9nX2l0ZW1fZGVzY196b25lOwogCiAJeGZzX2VmZF96b25lID0ga21lbV96b25lX2luaXQoKHNpemVvZih4ZnNfZWZkX2xvZ19pdGVtX3QpICsKIAkJCSgoWEZTX0VGRF9NQVhfRkFTVF9FWFRFTlRTIC0gMSkgKgpAQCAtMTgwNSw2ICsxNzM3LDggQEAKIAlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfZWZkX3pvbmUpOwogIG91dF9kZXN0cm95X2J1Zl9pdGVtX3pvbmU6CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl9pdGVtX3pvbmUpOworIG91dF9kZXN0cm95X2xvZ19pdGVtX2Rlc2Nfem9uZToKKwlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfbG9nX2l0ZW1fZGVzY196b25lKTsKICBvdXRfZGVzdHJveV90cmFuc196b25lOgogCWttZW1fem9uZV9kZXN0cm95KHhmc190cmFuc196b25lKTsKICBvdXRfZGVzdHJveV9pZm9ya196b25lOgpAQCAtMTgzNSw2ICsxNzY5LDcgQEAKIAlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfZWZpX3pvbmUpOwogCWttZW1fem9uZV9kZXN0cm95KHhmc19lZmRfem9uZSk7CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl9pdGVtX3pvbmUpOworCWttZW1fem9uZV9kZXN0cm95KHhmc19sb2dfaXRlbV9kZXNjX3pvbmUpOwogCWttZW1fem9uZV9kZXN0cm95KHhmc190cmFuc196b25lKTsKIAlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfaWZvcmtfem9uZSk7CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2RhYnVmX3pvbmUpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKaW5kZXggNTE5NjE4ZS4uMWVmNGE0ZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCkBAIC01NiwxMiArNTYsNiBAQAogIyBkZWZpbmUgWEZTX0JJR0ZTX1NUUklORwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCi0jIGRlZmluZSBYRlNfRE1BUElfU1RSSU5HCSJkbWFwaSBzdXBwb3J0LCAiCi0jZWxzZQotIyBkZWZpbmUgWEZTX0RNQVBJX1NUUklORwotI2VuZGlmCi0KICNpZmRlZiBERUJVRwogIyBkZWZpbmUgWEZTX0RCR19TVFJJTkcJCSJkZWJ1ZyIKICNlbHNlCkBAIC03Miw3ICs2Niw2IEBACiAJCQkJWEZTX1NFQ1VSSVRZX1NUUklORyBcCiAJCQkJWEZTX1JFQUxUSU1FX1NUUklORyBcCiAJCQkJWEZTX0JJR0ZTX1NUUklORyBcCi0JCQkJWEZTX0RNQVBJX1NUUklORyBcCiAJCQkJWEZTX0RCR19TVFJJTkcgLyogREJHIG11c3QgYmUgbGFzdCAqLwogCiBzdHJ1Y3QgeGZzX2lub2RlOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCmluZGV4IGE1MWEwN2MuLmRmY2JkOTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKQEAgLTI0LDI1ICsyNCwxNCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfbXJ1X2NhY2hlLmgiCiAjaW5jbHVkZSAieGZzX2ZpbGVzdHJlYW0uaCIKICNpbmNsdWRlICJ4ZnNfdm5vZGVvcHMuaCIKLSNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKLSNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCkBAIC0zMTksNyArMzA4LDcgQEAKIC8qCiAgKiBXcml0ZSBvdXQgcGFnZWNhY2hlIGRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlc3lzdGVtLgogICovCi1pbnQKK1NUQVRJQyBpbnQKIHhmc19zeW5jX2RhdGEoCiAJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJaW50CQkJZmxhZ3MpCkBAIC0zNDAsNyArMzI5LDcgQEAKIC8qCiAgKiBXcml0ZSBvdXQgaW5vZGUgbWV0YWRhdGEgKGF0dHJpYnV0ZXMpIGZvciB0aGUgd2hvbGUgZmlsZXN5c3RlbS4KICAqLwotaW50CitTVEFUSUMgaW50CiB4ZnNfc3luY19hdHRyKAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCWludAkJCWZsYWdzKQpAQCAtMzczLDggKzM2Miw3IEBACiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtODY3LDcgKzg1NSwzNiBAQAogcmVjbGFpbToKIAl4ZnNfaWZ1bmxvY2soaXApOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX2lyZWNsYWltKGlwKTsKKworCVhGU19TVEFUU19JTkMoeHNfaWdfcmVjbGFpbXMpOworCS8qCisJICogUmVtb3ZlIHRoZSBpbm9kZSBmcm9tIHRoZSBwZXItQUcgcmFkaXggdHJlZS4KKwkgKgorCSAqIEJlY2F1c2UgcmFkaXhfdHJlZV9kZWxldGUgd29uJ3QgY29tcGxhaW4gZXZlbiBpZiB0aGUgaXRlbSB3YXMgbmV2ZXIKKwkgKiBhZGRlZCB0byB0aGUgdHJlZSBhc3NlcnQgdGhhdCBpdCdzIGJlZW4gdGhlcmUgYmVmb3JlIHRvIGNhdGNoCisJICogcHJvYmxlbXMgd2l0aCB0aGUgaW5vZGUgbGlmZSB0aW1lIGVhcmx5IG9uLgorCSAqLworCXdyaXRlX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlpZiAoIXJhZGl4X3RyZWVfZGVsZXRlKCZwYWctPnBhZ19pY2lfcm9vdCwKKwkJCQlYRlNfSU5PX1RPX0FHSU5PKGlwLT5pX21vdW50LCBpcC0+aV9pbm8pKSkKKwkJQVNTRVJUKDApOworCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCisJLyoKKwkgKiBIZXJlIHdlIGRvIGFuIChhbG1vc3QpIHNwdXJpb3VzIGlub2RlIGxvY2sgaW4gb3JkZXIgdG8gY29vcmRpbmF0ZQorCSAqIHdpdGggaW5vZGUgY2FjaGUgcmFkaXggdHJlZSBsb29rdXBzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBsb29rdXAKKwkgKiBjYW4gcmVmZXJlbmNlIHRoZSBpbm9kZXMgaW4gdGhlIGNhY2hlIHdpdGhvdXQgdGFraW5nIHJlZmVyZW5jZXMuCisJICoKKwkgKiBXZSBtYWtlIHRoYXQgT0sgaGVyZSBieSBlbnN1cmluZyB0aGF0IHdlIHdhaXQgdW50aWwgdGhlIGlub2RlIGlzCisJICogdW5sb2NrZWQgYWZ0ZXIgdGhlIGxvb2t1cCBiZWZvcmUgd2UgZ28gYWhlYWQgYW5kIGZyZWUgaXQuICBXZSBnZXQKKwkgKiBib3RoIHRoZSBpbG9jayBhbmQgdGhlIGlvbG9jayBiZWNhdXNlIHRoZSBjb2RlIG1heSBuZWVkIHRvIGRyb3AgdGhlCisJICogaWxvY2sgb25lIGJ1dCB3aWxsIHN0aWxsIGhvbGQgdGhlIGlvbG9jay4KKwkgKi8KKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfcW1fZHFkZXRhY2goaXApOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisKKwl4ZnNfaW5vZGVfZnJlZShpcCk7CiAJcmV0dXJuIGVycm9yOwogCiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmgKaW5kZXggZTI4MTM5YS4uZmU3ODcyNiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaApAQCAtMzUsOSArMzUsNiBAQAogaW50IHhmc19zeW5jZF9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKIHZvaWQgeGZzX3N5bmNkX3N0b3Aoc3RydWN0IHhmc19tb3VudCAqbXApOwogCi1pbnQgeGZzX3N5bmNfYXR0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IGZsYWdzKTsKLWludCB4ZnNfc3luY19kYXRhKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgZmxhZ3MpOwotCiBpbnQgeGZzX3F1aWVzY2VfZGF0YShzdHJ1Y3QgeGZzX21vdW50ICptcCk7CiB2b2lkIHhmc19xdWllc2NlX2F0dHIoc3RydWN0IHhmc19tb3VudCAqbXApOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuYwppbmRleCBkMTJiZTg0Li44OGQyNWQ0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3RyYWNlLmMKQEAgLTI0LDE3ICsyNCwxMyBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3RyYWNlLmgKaW5kZXggMzAyODIwNi4uYzY1N2NkYyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5oCkBAIC0zMTcsOCArMzE3LDYgQEAKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9mcmVlKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9ob2xkKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9yZWxlKTsKLURFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9waW4pOwotREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX3VucGluKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9pb2RvbmUpOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2lvcmVxdWVzdCk7CiBERUZJTkVfQlVGX0VWRU5UKHhmc19idWZfYmF3cml0ZSk7CkBAIC01NDEsNyArNTM5LDcgQEAKIERFRklORV9MT0NLX0VWRU5UKHhmc19pbG9ja19kZW1vdGUpOwogREVGSU5FX0xPQ0tfRVZFTlQoeGZzX2l1bmxvY2spOwogCi1ERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19pZ2V0X2NsYXNzLAorREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfaW5vZGVfY2xhc3MsCiAJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqaXApLAogCVRQX0FSR1MoaXApLAogCVRQX1NUUlVDVF9fZW50cnkoCkBAIC01NTcsMTYgKzU1NSwzOCBAQAogCQkgIF9fZW50cnktPmlubykKICkKIAotI2RlZmluZSBERUZJTkVfSUdFVF9FVkVOVChuYW1lKSBcCi1ERUZJTkVfRVZFTlQoeGZzX2lnZXRfY2xhc3MsIG5hbWUsIFwKKyNkZWZpbmUgREVGSU5FX0lOT0RFX0VWRU5UKG5hbWUpIFwKK0RFRklORV9FVkVOVCh4ZnNfaW5vZGVfY2xhc3MsIG5hbWUsIFwKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2lub2RlICppcCksIFwKIAlUUF9BUkdTKGlwKSkKLURFRklORV9JR0VUX0VWRU5UKHhmc19pZ2V0X3NraXApOwotREVGSU5FX0lHRVRfRVZFTlQoeGZzX2lnZXRfcmVjbGFpbSk7Ci1ERUZJTkVfSUdFVF9FVkVOVCh4ZnNfaWdldF9mb3VuZCk7Ci1ERUZJTkVfSUdFVF9FVkVOVCh4ZnNfaWdldF9hbGxvYyk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lnZXRfc2tpcCk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lnZXRfcmVjbGFpbSk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lnZXRfcmVjbGFpbV9mYWlsKTsKK0RFRklORV9JTk9ERV9FVkVOVCh4ZnNfaWdldF9oaXQpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19pZ2V0X21pc3MpOwogCi1ERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19pbm9kZV9jbGFzcywKK0RFRklORV9JTk9ERV9FVkVOVCh4ZnNfZ2V0YXR0cik7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX3NldGF0dHIpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19yZWFkbGluayk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2FsbG9jX2ZpbGVfc3BhY2UpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19mcmVlX2ZpbGVfc3BhY2UpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19yZWFkZGlyKTsKKyNpZmRlZiBDT05GSUdfWEZTX1BPU0lYX0FDTAorREVGSU5FX0lOT0RFX0VWRU5UKHhmc19jaGVja19hY2wpOworI2VuZGlmCitERUZJTkVfSU5PREVfRVZFTlQoeGZzX3ZtX2JtYXApOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19maWxlX2lvY3RsKTsKK0RFRklORV9JTk9ERV9FVkVOVCh4ZnNfZmlsZV9jb21wYXRfaW9jdGwpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19pb2N0bF9zZXRhdHRyKTsKK0RFRklORV9JTk9ERV9FVkVOVCh4ZnNfZmlsZV9mc3luYyk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2Rlc3Ryb3lfaW5vZGUpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc193cml0ZV9pbm9kZSk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2NsZWFyX2lub2RlKTsKKworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19kcXVvdF9kcWFsbG9jKTsKK0RFRklORV9JTk9ERV9FVkVOVCh4ZnNfZHF1b3RfZHFkZXRhY2gpOworCitERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19pcmVmX2NsYXNzLAogCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB1bnNpZ25lZCBsb25nIGNhbGxlcl9pcCksCiAJVFBfQVJHUyhpcCwgY2FsbGVyX2lwKSwKIAlUUF9TVFJVQ1RfX2VudHJ5KApAQCAtNTkxLDIwICs2MTEsNzEgQEAKIAkJICAoY2hhciAqKV9fZW50cnktPmNhbGxlcl9pcCkKICkKIAotI2RlZmluZSBERUZJTkVfSU5PREVfRVZFTlQobmFtZSkgXAotREVGSU5FX0VWRU5UKHhmc19pbm9kZV9jbGFzcywgbmFtZSwgXAorI2RlZmluZSBERUZJTkVfSVJFRl9FVkVOVChuYW1lKSBcCitERUZJTkVfRVZFTlQoeGZzX2lyZWZfY2xhc3MsIG5hbWUsIFwKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgdW5zaWduZWQgbG9uZyBjYWxsZXJfaXApLCBcCiAJVFBfQVJHUyhpcCwgY2FsbGVyX2lwKSkKLURFRklORV9JTk9ERV9FVkVOVCh4ZnNfaWhvbGQpOwotREVGSU5FX0lOT0RFX0VWRU5UKHhmc19pcmVsZSk7Ci1ERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lub2RlX3Bpbik7Ci1ERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lub2RlX3VucGluKTsKLURFRklORV9JTk9ERV9FVkVOVCh4ZnNfaW5vZGVfdW5waW5fbm93YWl0KTsKK0RFRklORV9JUkVGX0VWRU5UKHhmc19paG9sZCk7CitERUZJTkVfSVJFRl9FVkVOVCh4ZnNfaXJlbGUpOworREVGSU5FX0lSRUZfRVZFTlQoeGZzX2lub2RlX3Bpbik7CitERUZJTkVfSVJFRl9FVkVOVCh4ZnNfaW5vZGVfdW5waW4pOworREVGSU5FX0lSRUZfRVZFTlQoeGZzX2lub2RlX3VucGluX25vd2FpdCk7CiAKLS8qIHRoZSBvbGQgeGZzX2l0cmFjZV9lbnRyeSB0cmFjZXIgLSB0byBiZSByZXBsYWNlZCBieSBzLnRoLiBpbiB0aGUgVkZTICovCi1ERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lub2RlKTsKLSNkZWZpbmUgeGZzX2l0cmFjZV9lbnRyeShpcCkgICAgXAotCXRyYWNlX3hmc19pbm9kZShpcCwgX1RISVNfSVBfKQorREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfbmFtZXNwYWNlX2NsYXNzLAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgeGZzX25hbWUgKm5hbWUpLAorCVRQX0FSR1MoZHAsIG5hbWUpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh4ZnNfaW5vX3QsIGRwX2lubykKKwkJX19keW5hbWljX2FycmF5KGNoYXIsIG5hbWUsIG5hbWUtPmxlbikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYgPSBWRlNfSShkcCktPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5kcF9pbm8gPSBkcC0+aV9pbm87CisJCW1lbWNweShfX2dldF9zdHIobmFtZSksIG5hbWUtPm5hbWUsIG5hbWUtPmxlbik7CisJKSwKKwlUUF9wcmludGsoImRldiAlZDolZCBkcCBpbm8gMHglbGx4IG5hbWUgJXMiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+ZHBfaW5vLAorCQkgIF9fZ2V0X3N0cihuYW1lKSkKKykKKworI2RlZmluZSBERUZJTkVfTkFNRVNQQUNFX0VWRU5UKG5hbWUpIFwKK0RFRklORV9FVkVOVCh4ZnNfbmFtZXNwYWNlX2NsYXNzLCBuYW1lLCBcCisJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqZHAsIHN0cnVjdCB4ZnNfbmFtZSAqbmFtZSksIFwKKwlUUF9BUkdTKGRwLCBuYW1lKSkKK0RFRklORV9OQU1FU1BBQ0VfRVZFTlQoeGZzX3JlbW92ZSk7CitERUZJTkVfTkFNRVNQQUNFX0VWRU5UKHhmc19saW5rKTsKK0RFRklORV9OQU1FU1BBQ0VfRVZFTlQoeGZzX2xvb2t1cCk7CitERUZJTkVfTkFNRVNQQUNFX0VWRU5UKHhmc19jcmVhdGUpOworREVGSU5FX05BTUVTUEFDRV9FVkVOVCh4ZnNfc3ltbGluayk7CisKK1RSQUNFX0VWRU5UKHhmc19yZW5hbWUsCisJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqc3JjX2RwLCBzdHJ1Y3QgeGZzX2lub2RlICp0YXJnZXRfZHAsCisJCSBzdHJ1Y3QgeGZzX25hbWUgKnNyY19uYW1lLCBzdHJ1Y3QgeGZzX25hbWUgKnRhcmdldF9uYW1lKSwKKwlUUF9BUkdTKHNyY19kcCwgdGFyZ2V0X2RwLCBzcmNfbmFtZSwgdGFyZ2V0X25hbWUpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh4ZnNfaW5vX3QsIHNyY19kcF9pbm8pCisJCV9fZmllbGQoeGZzX2lub190LCB0YXJnZXRfZHBfaW5vKQorCQlfX2R5bmFtaWNfYXJyYXkoY2hhciwgc3JjX25hbWUsIHNyY19uYW1lLT5sZW4pCisJCV9fZHluYW1pY19hcnJheShjaGFyLCB0YXJnZXRfbmFtZSwgdGFyZ2V0X25hbWUtPmxlbikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYgPSBWRlNfSShzcmNfZHApLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+c3JjX2RwX2lubyA9IHNyY19kcC0+aV9pbm87CisJCV9fZW50cnktPnRhcmdldF9kcF9pbm8gPSB0YXJnZXRfZHAtPmlfaW5vOworCQltZW1jcHkoX19nZXRfc3RyKHNyY19uYW1lKSwgc3JjX25hbWUtPm5hbWUsIHNyY19uYW1lLT5sZW4pOworCQltZW1jcHkoX19nZXRfc3RyKHRhcmdldF9uYW1lKSwgdGFyZ2V0X25hbWUtPm5hbWUsIHRhcmdldF9uYW1lLT5sZW4pOworCSksCisJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgc3JjIGRwIGlubyAweCVsbHggdGFyZ2V0IGRwIGlubyAweCVsbHgiCisJCSAgIiBzcmMgbmFtZSAlcyB0YXJnZXQgbmFtZSAlcyIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT5zcmNfZHBfaW5vLAorCQkgIF9fZW50cnktPnRhcmdldF9kcF9pbm8sCisJCSAgX19nZXRfc3RyKHNyY19uYW1lKSwKKwkJICBfX2dldF9zdHIodGFyZ2V0X25hbWUpKQorKQogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19kcXVvdF9jbGFzcywKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2RxdW90ICpkcXApLApAQCAtNjg0LDkgKzc1NSw2IEBACiBERUZJTkVfRFFVT1RfRVZFTlQoeGZzX2RxZmx1c2gpOwogREVGSU5FX0RRVU9UX0VWRU5UKHhmc19kcWZsdXNoX2ZvcmNlKTsKIERFRklORV9EUVVPVF9FVkVOVCh4ZnNfZHFmbHVzaF9kb25lKTsKLS8qIG5vdCByZWFsbHkgaWdldCBldmVudHMsIGJ1dCB3ZSByZS11c2UgdGhlIGZvcm1hdCAqLwotREVGSU5FX0lHRVRfRVZFTlQoeGZzX2RxdW90X2RxYWxsb2MpOwotREVGSU5FX0lHRVRfRVZFTlQoeGZzX2RxdW90X2RxZGV0YWNoKTsKIAogREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfbG9nZ3JhbnRfY2xhc3MsCiAJVFBfUFJPVE8oc3RydWN0IGxvZyAqbG9nLCBzdHJ1Y3QgeGxvZ190aWNrZXQgKnRpYyksCkBAIC04MzQsMzMgKzkwMiwyOSBAQAogCQlfX2ZpZWxkKGxvZmZfdCwgc2l6ZSkKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBvZmZzZXQpCiAJCV9fZmllbGQoaW50LCBkZWxhbGxvYykKLQkJX19maWVsZChpbnQsIHVubWFwcGVkKQogCQlfX2ZpZWxkKGludCwgdW53cml0dGVuKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCi0JCWludCBkZWxhbGxvYyA9IC0xLCB1bm1hcHBlZCA9IC0xLCB1bndyaXR0ZW4gPSAtMTsKKwkJaW50IGRlbGFsbG9jID0gLTEsIHVud3JpdHRlbiA9IC0xOwogCiAJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCQkJeGZzX2NvdW50X3BhZ2Vfc3RhdGUocGFnZSwgJmRlbGFsbG9jLAotCQkJCQkgICAgICZ1bm1hcHBlZCwgJnVud3JpdHRlbik7CisJCQl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bndyaXR0ZW4pOwogCQlfX2VudHJ5LT5kZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJCV9fZW50cnktPmlubyA9IFhGU19JKGlub2RlKS0+aV9pbm87CiAJCV9fZW50cnktPnBnb2ZmID0gcGFnZV9vZmZzZXQocGFnZSk7CiAJCV9fZW50cnktPnNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCV9fZW50cnktPm9mZnNldCA9IG9mZjsKIAkJX19lbnRyeS0+ZGVsYWxsb2MgPSBkZWxhbGxvYzsKLQkJX19lbnRyeS0+dW5tYXBwZWQgPSB1bm1hcHBlZDsKIAkJX19lbnRyeS0+dW53cml0dGVuID0gdW53cml0dGVuOwogCSksCiAJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgaW5vIDB4JWxseCBwZ29mZiAweCVseCBzaXplIDB4JWxseCBvZmZzZXQgJWx4ICIKLQkJICAiZGVsYWxsb2MgJWQgdW5tYXBwZWQgJWQgdW53cml0dGVuICVkIiwKKwkJICAiZGVsYWxsb2MgJWQgdW53cml0dGVuICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5wZ29mZiwKIAkJICBfX2VudHJ5LT5zaXplLAogCQkgIF9fZW50cnktPm9mZnNldCwKIAkJICBfX2VudHJ5LT5kZWxhbGxvYywKLQkJICBfX2VudHJ5LT51bm1hcHBlZCwKIAkJICBfX2VudHJ5LT51bndyaXR0ZW4pCiApCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwppbmRleCA1ODVlNzYzLi5lMWEyZjY4IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCkBAIC0yMywyNSArMjMsMTUgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKQEAgLTY0LDggKzU0LDYgQEAKICAgIGZsdXNoIGxvY2sgLSBkaXR0by4KICovCiAKLVNUQVRJQyB2b2lkCQl4ZnNfcW1fZHFmbHVzaF9kb25lKHhmc19idWZfdCAqLCB4ZnNfZHFfbG9naXRlbV90ICopOwotCiAjaWZkZWYgREVCVUcKIHhmc19idWZ0YXJnX3QgKnhmc19kcWVycm9yX3RhcmdldDsKIGludCB4ZnNfZG9fZHFlcnJvcjsKQEAgLTM5MCwyMSArMzc4LDE0IEBACiAJCXJldHVybiAoRVNSQ0gpOwogCX0KIAotCS8qCi0JICogeGZzX3RyYW5zX2NvbW1pdCBub3JtYWxseSBkZWNyZW1lbnRzIHRoZSB2bm9kZSByZWYgY291bnQKLQkgKiB3aGVuIGl0IHVubG9ja3MgdGhlIGlub2RlLiBTaW5jZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHF1b3RhCi0JICogaW5vZGUgYXJvdW5kLCB3ZSBidW1wIHRoZSB2bm9kZSByZWYgY291bnQgbm93LgotCSAqLwotCUlIT0xEKHF1b3RpcCk7Ci0KLQl4ZnNfdHJhbnNfaWpvaW4odHAsIHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbl9yZWYodHAsIHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCW5tYXBzID0gMTsKIAlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBxdW90aXAsCiAJCQkgICAgICBvZmZzZXRfZnNiLCBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQiwKIAkJCSAgICAgIFhGU19CTUFQSV9NRVRBREFUQSB8IFhGU19CTUFQSV9XUklURSwKIAkJCSAgICAgICZmaXJzdGJsb2NrLAogCQkJICAgICAgWEZTX1FNX0RRQUxMT0NfU1BBQ0VfUkVTKG1wKSwKLQkJCSAgICAgICZtYXAsICZubWFwcywgJmZsaXN0LCBOVUxMKSkpIHsKKwkJCSAgICAgICZtYXAsICZubWFwcywgJmZsaXN0KSkpIHsKIAkJZ290byBlcnJvcjA7CiAJfQogCUFTU0VSVChtYXAuYnJfYmxvY2tjb3VudCA9PSBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQik7CkBAIC01MjAsNyArNTAxLDcgQEAKIAkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgcXVvdGlwLCBkcXAtPnFfZmlsZW9mZnNldCwKIAkJCQkgIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLAogCQkJCSAgWEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCSAgTlVMTCwgMCwgJm1hcCwgJm5tYXBzLCBOVUxMLCBOVUxMKTsKKwkJCQkgIE5VTEwsIDAsICZtYXAsICZubWFwcywgTlVMTCk7CiAKIAkJeGZzX2l1bmxvY2socXVvdGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAkJaWYgKGVycm9yKQpAQCAtMTE0MSw2ICsxMTIyLDQ2IEBACiAJeGZzX3FtX2RxcHV0KGRxcCk7CiB9CiAKKy8qCisgKiBUaGlzIGlzIHRoZSBkcXVvdCBmbHVzaGluZyBJL08gY29tcGxldGlvbiByb3V0aW5lLiAgSXQgaXMgY2FsbGVkCisgKiBmcm9tIGludGVycnVwdCBsZXZlbCB3aGVuIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZHF1b3QgaXMKKyAqIGZsdXNoZWQgdG8gZGlzay4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGUgZHF1b3QgbG9naXRlbQorICogZnJvbSB0aGUgQUlMIGlmIGl0IGhhcyBub3QgYmVlbiByZS1sb2dnZWQsIGFuZCB1bmxvY2tpbmcgdGhlIGRxdW90J3MKKyAqIGZsdXNoIGxvY2suIFRoaXMgYmVoYXZpb3IgaXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgaW5vZGVzLi4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcWZsdXNoX2RvbmUoCisJc3RydWN0IHhmc19idWYJCSpicCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCit7CisJeGZzX2RxX2xvZ2l0ZW1fdAkqcWlwID0gKHN0cnVjdCB4ZnNfZHFfbG9naXRlbSAqKWxpcDsKKwl4ZnNfZHF1b3RfdAkJKmRxcCA9IHFpcC0+cWxpX2RxdW90OworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGxpcC0+bGlfYWlscDsKKworCS8qCisJICogV2Ugb25seSB3YW50IHRvIHB1bGwgdGhlIGl0ZW0gZnJvbSB0aGUgQUlMIGlmIGl0cworCSAqIGxvY2F0aW9uIGluIHRoZSBsb2cgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHdlIHN0YXJ0ZWQgdGhlIGZsdXNoLgorCSAqIFRodXMsIHdlIG9ubHkgYm90aGVyIGlmIHRoZSBkcXVvdCdzIGxzbiBoYXMKKwkgKiBub3QgY2hhbmdlZC4gRmlyc3Qgd2UgY2hlY2sgdGhlIGxzbiBvdXRzaWRlIHRoZSBsb2NrCisJICogc2luY2UgaXQncyBjaGVhcGVyLCBhbmQgdGhlbiB3ZSByZWNoZWNrIHdoaWxlCisJICogaG9sZGluZyB0aGUgbG9jayBiZWZvcmUgcmVtb3ZpbmcgdGhlIGRxdW90IGZyb20gdGhlIEFJTC4KKwkgKi8KKwlpZiAoKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSAmJgorCSAgICBsaXAtPmxpX2xzbiA9PSBxaXAtPnFsaV9mbHVzaF9sc24pIHsKKworCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KKwkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJaWYgKGxpcC0+bGlfbHNuID09IHFpcC0+cWxpX2ZsdXNoX2xzbikKKwkJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CisJCWVsc2UKKwkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwl9CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGRxJ3MgZmx1c2ggbG9jayBzaW5jZSB3ZSdyZSBkb25lIHdpdGggaXQuCisJICovCisJeGZzX2RxZnVubG9jayhkcXApOworfQogCiAvKgogICogV3JpdGUgYSBtb2RpZmllZCBkcXVvdCB0byBkaXNrLgpAQCAtMTIyMiw4ICsxMjQzLDkgQEAKIAkgKiBBdHRhY2ggYW4gaW9kb25lIHJvdXRpbmUgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoaXMgZHF1b3QgZnJvbSB0aGUKIAkgKiBBSUwgYW5kIHJlbGVhc2UgdGhlIGZsdXNoIGxvY2sgb25jZSB0aGUgZHF1b3QgaXMgc3luY2VkIHRvIGRpc2suCiAJICovCi0JeGZzX2J1Zl9hdHRhY2hfaW9kb25lKGJwLCAodm9pZCgqKSh4ZnNfYnVmX3QgKiwgeGZzX2xvZ19pdGVtX3QgKikpCi0JCQkgICAgICB4ZnNfcW1fZHFmbHVzaF9kb25lLCAmKGRxcC0+cV9sb2dpdGVtLnFsaV9pdGVtKSk7CisJeGZzX2J1Zl9hdHRhY2hfaW9kb25lKGJwLCB4ZnNfcW1fZHFmbHVzaF9kb25lLAorCQkJCSAgJmRxcC0+cV9sb2dpdGVtLnFsaV9pdGVtKTsKKwogCS8qCiAJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28gd2Ugd29uJ3QKIAkgKiBnZXQgc3R1Y2sgd2FpdGluZyBpbiB0aGUgd3JpdGUgZm9yIHRvbyBsb25nLgpAQCAtMTI0Nyw1MCArMTI2OSw2IEBACiAKIH0KIAotLyoKLSAqIFRoaXMgaXMgdGhlIGRxdW90IGZsdXNoaW5nIEkvTyBjb21wbGV0aW9uIHJvdXRpbmUuICBJdCBpcyBjYWxsZWQKLSAqIGZyb20gaW50ZXJydXB0IGxldmVsIHdoZW4gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkcXVvdCBpcwotICogZmx1c2hlZCB0byBkaXNrLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBkcXVvdCBsb2dpdGVtCi0gKiBmcm9tIHRoZSBBSUwgaWYgaXQgaGFzIG5vdCBiZWVuIHJlLWxvZ2dlZCwgYW5kIHVubG9ja2luZyB0aGUgZHF1b3QncwotICogZmx1c2ggbG9jay4gVGhpcyBiZWhhdmlvciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiBpbm9kZXMuLgotICovCi0vKkFSR1NVU0VEKi8KLVNUQVRJQyB2b2lkCi14ZnNfcW1fZHFmbHVzaF9kb25lKAotCXhmc19idWZfdAkJKmJwLAotCXhmc19kcV9sb2dpdGVtX3QJKnFpcCkKLXsKLQl4ZnNfZHF1b3RfdAkJKmRxcDsKLQlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHA7Ci0KLQlkcXAgPSBxaXAtPnFsaV9kcXVvdDsKLQlhaWxwID0gcWlwLT5xbGlfaXRlbS5saV9haWxwOwotCi0JLyoKLQkgKiBXZSBvbmx5IHdhbnQgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgaWYgaXRzCi0JICogbG9jYXRpb24gaW4gdGhlIGxvZyBoYXMgbm90IGNoYW5nZWQgc2luY2Ugd2Ugc3RhcnRlZCB0aGUgZmx1c2guCi0JICogVGh1cywgd2Ugb25seSBib3RoZXIgaWYgdGhlIGRxdW90J3MgbHNuIGhhcwotCSAqIG5vdCBjaGFuZ2VkLiBGaXJzdCB3ZSBjaGVjayB0aGUgbHNuIG91dHNpZGUgdGhlIGxvY2sKLQkgKiBzaW5jZSBpdCdzIGNoZWFwZXIsIGFuZCB0aGVuIHdlIHJlY2hlY2sgd2hpbGUKLQkgKiBob2xkaW5nIHRoZSBsb2NrIGJlZm9yZSByZW1vdmluZyB0aGUgZHF1b3QgZnJvbSB0aGUgQUlMLgotCSAqLwotCWlmICgocWlwLT5xbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpICYmCi0JICAgIHFpcC0+cWxpX2l0ZW0ubGlfbHNuID09IHFpcC0+cWxpX2ZsdXNoX2xzbikgewotCi0JCS8qIHhmc190cmFuc19haWxfZGVsZXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLiAqLwotCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwotCQlpZiAocWlwLT5xbGlfaXRlbS5saV9sc24gPT0gcWlwLT5xbGlfZmx1c2hfbHNuKQotCQkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90KilxaXApOwotCQllbHNlCi0JCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7Ci0JfQotCi0JLyoKLQkgKiBSZWxlYXNlIHRoZSBkcSdzIGZsdXNoIGxvY2sgc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0LgotCSAqLwotCXhmc19kcWZ1bmxvY2soZHFwKTsKLX0KLQogaW50CiB4ZnNfcW1fZHFsb2NrX25vd2FpdCgKIAl4ZnNfZHF1b3RfdCAqZHFwKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwppbmRleCA4ZDg5YTI0Li4yYTFmM2RjIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwpAQCAtMjMsNDIgKzIzLDM2IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgotI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19hdHRyLmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfcW0uaCIKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2RxX2xvZ2l0ZW0gKkRRVU9UX0lURU0oc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwKQoreworCXJldHVybiBjb250YWluZXJfb2YobGlwLCBzdHJ1Y3QgeGZzX2RxX2xvZ2l0ZW0sIHFsaV9pdGVtKTsKK30KKwogLyoKICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gZHF1b3QgaXRlbS4KICAqLwotLyogQVJHU1VTRUQgKi8KIFNUQVRJQyB1aW50CiB4ZnNfcW1fZHF1b3RfbG9naXRlbV9zaXplKAotCXhmc19kcV9sb2dpdGVtX3QJKmxvZ2l0ZW0pCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewogCS8qCiAJICogd2UgbmVlZCBvbmx5IHR3byBpb3ZlY3MsIG9uZSBmb3IgdGhlIGZvcm1hdCwgb25lIGZvciB0aGUgcmVhbCB0aGluZwogCSAqLwotCXJldHVybiAoMik7CisJcmV0dXJuIDI7CiB9CiAKIC8qCkBAIC02NiwyMiArNjAsMjEgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19xbV9kcXVvdF9sb2dpdGVtX2Zvcm1hdCgKLQl4ZnNfZHFfbG9naXRlbV90CSpsb2dpdGVtLAotCXhmc19sb2dfaW92ZWNfdAkJKmxvZ3ZlYykKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJc3RydWN0IHhmc19sb2dfaW92ZWMJKmxvZ3ZlYykKIHsKLQlBU1NFUlQobG9naXRlbSk7Ci0JQVNTRVJUKGxvZ2l0ZW0tPnFsaV9kcXVvdCk7CisJc3RydWN0IHhmc19kcV9sb2dpdGVtCSpxbGlwID0gRFFVT1RfSVRFTShsaXApOwogCi0JbG9ndmVjLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmxvZ2l0ZW0tPnFsaV9mb3JtYXQ7CisJbG9ndmVjLT5pX2FkZHIgPSAmcWxpcC0+cWxpX2Zvcm1hdDsKIAlsb2d2ZWMtPmlfbGVuICA9IHNpemVvZih4ZnNfZHFfbG9nZm9ybWF0X3QpOwogCWxvZ3ZlYy0+aV90eXBlID0gWExPR19SRUdfVFlQRV9RRk9STUFUOwogCWxvZ3ZlYysrOwotCWxvZ3ZlYy0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZsb2dpdGVtLT5xbGlfZHF1b3QtPnFfY29yZTsKKwlsb2d2ZWMtPmlfYWRkciA9ICZxbGlwLT5xbGlfZHF1b3QtPnFfY29yZTsKIAlsb2d2ZWMtPmlfbGVuICA9IHNpemVvZih4ZnNfZGlza19kcXVvdF90KTsKIAlsb2d2ZWMtPmlfdHlwZSA9IFhMT0dfUkVHX1RZUEVfRFFVT1Q7CiAKLQlBU1NFUlQoMiA9PSBsb2dpdGVtLT5xbGlfaXRlbS5saV9kZXNjLT5saWRfc2l6ZSk7Ci0JbG9naXRlbS0+cWxpX2Zvcm1hdC5xbGZfc2l6ZSA9IDI7CisJQVNTRVJUKDIgPT0gbGlwLT5saV9kZXNjLT5saWRfc2l6ZSk7CisJcWxpcC0+cWxpX2Zvcm1hdC5xbGZfc2l6ZSA9IDI7CiAKIH0KIApAQCAtOTAsOSArODMsOSBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcGluKAotCXhmc19kcV9sb2dpdGVtX3QgKmxvZ2l0ZW0pCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewotCXhmc19kcXVvdF90ICpkcXAgPSBsb2dpdGVtLT5xbGlfZHF1b3Q7CisJc3RydWN0IHhmc19kcXVvdAkqZHFwID0gRFFVT1RfSVRFTShsaXApLT5xbGlfZHF1b3Q7CiAKIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKIAlhdG9taWNfaW5jKCZkcXAtPnFfcGluY291bnQpOwpAQCAtMTA0LDI3ICs5NywxOCBAQAogICogZHF1b3QgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBwaW5uZWQgd2l0aCBhIGNhbGwgdG8KICAqIHhmc19xbV9kcXVvdF9sb2dpdGVtX3BpbigpLgogICovCi0vKiBBUkdTVVNFRCAqLwogU1RBVElDIHZvaWQKIHhmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluKAotCXhmc19kcV9sb2dpdGVtX3QgKmxvZ2l0ZW0pCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCWludAkJCXJlbW92ZSkKIHsKLQl4ZnNfZHF1b3RfdCAqZHFwID0gbG9naXRlbS0+cWxpX2RxdW90OworCXN0cnVjdCB4ZnNfZHF1b3QJKmRxcCA9IERRVU9UX0lURU0obGlwKS0+cWxpX2RxdW90OwogCiAJQVNTRVJUKGF0b21pY19yZWFkKCZkcXAtPnFfcGluY291bnQpID4gMCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRxcC0+cV9waW5jb3VudCkpCiAJCXdha2VfdXAoJmRxcC0+cV9waW53YWl0KTsKIH0KIAotLyogQVJHU1VTRUQgKi8KLVNUQVRJQyB2b2lkCi14ZnNfcW1fZHF1b3RfbG9naXRlbV91bnBpbl9yZW1vdmUoCi0JeGZzX2RxX2xvZ2l0ZW1fdCAqbG9naXRlbSwKLQl4ZnNfdHJhbnNfdAkgKnRwKQotewotCXhmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluKGxvZ2l0ZW0pOwotfQotCiAvKgogICogR2l2ZW4gdGhlIGxvZ2l0ZW0sIHRoaXMgd3JpdGVzIHRoZSBjb3JyZXNwb25kaW5nIGRxdW90IGVudHJ5IHRvIGRpc2sKICAqIGFzeW5jaHJvbm91c2x5LiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSBkcXVvdCBlbnRyeSBzZWN1cmVseSBsb2NrZWQ7CkBAIC0xMzMsMTIgKzExNywxMCBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaCgKLQl4ZnNfZHFfbG9naXRlbV90CSpsb2dpdGVtKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfZHF1b3RfdAkqZHFwOwotCWludAkJZXJyb3I7Ci0KLQlkcXAgPSBsb2dpdGVtLT5xbGlfZHF1b3Q7CisJc3RydWN0IHhmc19kcXVvdAkqZHFwID0gRFFVT1RfSVRFTShsaXApLT5xbGlfZHF1b3Q7CisJaW50CQkJZXJyb3I7CiAKIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKIAlBU1NFUlQoIWNvbXBsZXRpb25fZG9uZSgmZHFwLT5xX2ZsdXNoKSk7CkBAIC0xNjAsMjcgKzE0MiwyNSBAQAogCXhmc19kcXVubG9jayhkcXApOwogfQogCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB4ZnNfbHNuX3QKIHhmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRlZCgKLQl4ZnNfZHFfbG9naXRlbV90CSpsLAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKIAl4ZnNfbHNuX3QJCWxzbikKIHsKIAkvKgogCSAqIFdlIGFsd2F5cyByZS1sb2cgdGhlIGVudGlyZSBkcXVvdCB3aGVuIGl0IGJlY29tZXMgZGlydHksCiAJICogc28sIHRoZSBsYXRlc3QgY29weSBfaXNfIHRoZSBvbmx5IG9uZSB0aGF0IG1hdHRlcnMuCiAJICovCi0JcmV0dXJuIChsc24pOworCXJldHVybiBsc247CiB9CiAKLQogLyoKICAqIFRoaXMgaXMgY2FsbGVkIHRvIHdhaXQgZm9yIHRoZSBnaXZlbiBkcXVvdCB0byBiZSB1bnBpbm5lZC4KICAqIE1vc3Qgb2YgdGhlc2UgcGluL3VucGluIHJvdXRpbmVzIGFyZSBwbGFnaWFyaXplZCBmcm9tIGlub2RlIGNvZGUuCiAgKi8KIHZvaWQKIHhmc19xbV9kcXVucGluX3dhaXQoCi0JeGZzX2RxdW90X3QJKmRxcCkKKwlzdHJ1Y3QgeGZzX2RxdW90CSpkcXApCiB7CiAJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CiAJaWYgKGF0b21pY19yZWFkKCZkcXAtPnFfcGluY291bnQpID09IDApCkBAIC0yMDYsMTMgKzE4NiwxMiBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaGJ1ZigKLQl4ZnNfZHFfbG9naXRlbV90ICAgICpxaXApCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewotCXhmc19kcXVvdF90CSpkcXA7Ci0JeGZzX21vdW50X3QJKm1wOwotCXhmc19idWZfdAkqYnA7CisJc3RydWN0IHhmc19kcV9sb2dpdGVtCSpxbGlwID0gRFFVT1RfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfZHF1b3QJKmRxcCA9IHFsaXAtPnFsaV9kcXVvdDsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOwogCi0JZHFwID0gcWlwLT5xbGlfZHF1b3Q7CiAJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CiAKIAkvKgpAQCAtMjIwLDIyICsxOTksMjAgQEAKIAkgKiBpbm9kZSBmbHVzaCBjb21wbGV0ZWQgYW5kIHRoZSBpbm9kZSB3YXMgdGFrZW4gb2ZmIHRoZSBBSUwuCiAJICogU28sIGp1c3QgZ2V0IG91dC4KIAkgKi8KLQlpZiAoY29tcGxldGlvbl9kb25lKCZkcXAtPnFfZmx1c2gpICB8fAotCSAgICAoKHFpcC0+cWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA9PSAwKSkgeworCWlmIChjb21wbGV0aW9uX2RvbmUoJmRxcC0+cV9mbHVzaCkgfHwKKwkgICAgIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpIHsKIAkJeGZzX2RxdW5sb2NrKGRxcCk7CiAJCXJldHVybjsKIAl9Ci0JbXAgPSBkcXAtPnFfbW91bnQ7Ci0JYnAgPSB4ZnNfaW5jb3JlKG1wLT5tX2RkZXZfdGFyZ3AsIHFpcC0+cWxpX2Zvcm1hdC5xbGZfYmxrbm8sCi0JCQltcC0+bV9xdW90YWluZm8tPnFpX2RxY2h1bmtsZW4sIFhCRl9UUllMT0NLKTsKKworCWJwID0geGZzX2luY29yZShkcXAtPnFfbW91bnQtPm1fZGRldl90YXJncCwgcWxpcC0+cWxpX2Zvcm1hdC5xbGZfYmxrbm8sCisJCQlkcXAtPnFfbW91bnQtPm1fcXVvdGFpbmZvLT5xaV9kcWNodW5rbGVuLCBYQkZfVFJZTE9DSyk7CiAJeGZzX2RxdW5sb2NrKGRxcCk7CiAJaWYgKCFicCkKIAkJcmV0dXJuOwogCWlmIChYRlNfQlVGX0lTREVMQVlXUklURShicCkpCiAJCXhmc19idWZfZGVsd3JpX3Byb21vdGUoYnApOwogCXhmc19idWZfcmVsc2UoYnApOwotCXJldHVybjsKLQogfQogCiAvKgpAQCAtMjUwLDE1ICsyMjcsMTQgQEAKICAqLwogU1RBVElDIHVpbnQKIHhmc19xbV9kcXVvdF9sb2dpdGVtX3RyeWxvY2soCi0JeGZzX2RxX2xvZ2l0ZW1fdAkqcWlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfZHF1b3RfdAkJKmRxcDsKKwlzdHJ1Y3QgeGZzX2RxdW90CSpkcXAgPSBEUVVPVF9JVEVNKGxpcCktPnFsaV9kcXVvdDsKIAotCWRxcCA9IHFpcC0+cWxpX2RxdW90OwogCWlmIChhdG9taWNfcmVhZCgmZHFwLT5xX3BpbmNvdW50KSA+IDApCiAJCXJldHVybiBYRlNfSVRFTV9QSU5ORUQ7CiAKLQlpZiAoISB4ZnNfcW1fZHFsb2NrX25vd2FpdChkcXApKQorCWlmICgheGZzX3FtX2RxbG9ja19ub3dhaXQoZHFwKSkKIAkJcmV0dXJuIFhGU19JVEVNX0xPQ0tFRDsKIAogCWlmICgheGZzX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKQEAgLTI2OSwxMSArMjQ1LDEwIEBACiAJCXJldHVybiBYRlNfSVRFTV9QVVNIQlVGOwogCX0KIAotCUFTU0VSVChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCk7CisJQVNTRVJUKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKTsKIAlyZXR1cm4gWEZTX0lURU1fU1VDQ0VTUzsKIH0KIAotCiAvKgogICogVW5sb2NrIHRoZSBkcXVvdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZyBpdGVtLgogICogQ2xlYXIgdGhlIGZpZWxkcyBvZiB0aGUgZHF1b3QgYW5kIGRxdW90IGxvZyBpdGVtIHRoYXQKQEAgLTI4MiwxMiArMjU3LDEwIEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfcW1fZHF1b3RfbG9naXRlbV91bmxvY2soCi0JeGZzX2RxX2xvZ2l0ZW1fdCAgICAqcWwpCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewotCXhmc19kcXVvdF90CSpkcXA7CisJc3RydWN0IHhmc19kcXVvdAkqZHFwID0gRFFVT1RfSVRFTShsaXApLT5xbGlfZHF1b3Q7CiAKLQlBU1NFUlQocWwgIT0gTlVMTCk7Ci0JZHFwID0gcWwtPnFsaV9kcXVvdDsKIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKIAogCS8qCkBAIC0zMDQsNDMgKzI3NywzMiBAQAogCXhmc19kcXVubG9jayhkcXApOwogfQogCi0KIC8qCiAgKiB0aGlzIG5lZWRzIHRvIHN0YW1wIGFuIGxzbiBpbnRvIHRoZSBkcXVvdCwgSSB0aGluay4KICAqIHJwYydzIHRoYXQgbG9vayBhdCB1c2VyIGRxdW90J3Mgd291bGQgdGhlbiBoYXZlIHRvCiAgKiBwdXNoIG9uIHRoZSBkZXBlbmRlbmN5IHJlY29yZGVkIGluIHRoZSBkcXVvdAogICovCi0vKiBBUkdTVVNFRCAqLwogU1RBVElDIHZvaWQKIHhmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRpbmcoCi0JeGZzX2RxX2xvZ2l0ZW1fdAkqbCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCiAJeGZzX2xzbl90CQlsc24pCiB7Ci0JcmV0dXJuOwogfQogCi0KIC8qCiAgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIGZvciBkcXVvdHMKICAqLwogc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2RxdW90X2l0ZW1fb3BzID0gewotCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fc2l6ZSwKLQkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCi0JCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX2Zvcm1hdCwKLQkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcGluLAotCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluLAotCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCopKQotCQkJCQl4ZnNfcW1fZHF1b3RfbG9naXRlbV91bnBpbl9yZW1vdmUsCi0JLmlvcF90cnlsb2NrCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSkKLQkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdHJ5bG9jaywKLQkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5sb2NrLAotCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCi0JCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRlZCwKLQkuaW9wX3B1c2gJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9kcXVvdF9sb2dpdGVtX3B1c2gsCi0JLmlvcF9wdXNoYnVmCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSkKLQkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaGJ1ZiwKLQkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCi0JCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRpbmcKKwkuaW9wX3NpemUJPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV9zaXplLAorCS5pb3BfZm9ybWF0CT0geGZzX3FtX2RxdW90X2xvZ2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0geGZzX3FtX2RxdW90X2xvZ2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV91bnBpbiwKKwkuaW9wX3RyeWxvY2sJPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0geGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0geGZzX3FtX2RxdW90X2xvZ2l0ZW1fY29tbWl0dGVkLAorCS5pb3BfcHVzaAk9IHhmc19xbV9kcXVvdF9sb2dpdGVtX3B1c2gsCisJLmlvcF9wdXNoYnVmCT0geGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaGJ1ZiwKKwkuaW9wX2NvbW1pdHRpbmcgPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV9jb21taXR0aW5nCiB9OwogCiAvKgpAQCAtMzUwLDEwICszMTIsOSBAQAogICovCiB2b2lkCiB4ZnNfcW1fZHF1b3RfbG9naXRlbV9pbml0KAotCXN0cnVjdCB4ZnNfZHF1b3QgKmRxcCkKKwlzdHJ1Y3QgeGZzX2RxdW90CSpkcXApCiB7Ci0JeGZzX2RxX2xvZ2l0ZW1fdCAgKmxwOwotCWxwID0gJmRxcC0+cV9sb2dpdGVtOworCXN0cnVjdCB4ZnNfZHFfbG9naXRlbQkqbHAgPSAmZHFwLT5xX2xvZ2l0ZW07CiAKIAl4ZnNfbG9nX2l0ZW1faW5pdChkcXAtPnFfbW91bnQsICZscC0+cWxpX2l0ZW0sIFhGU19MSV9EUVVPVCwKIAkJCQkJJnhmc19kcXVvdF9pdGVtX29wcyk7CkBAIC0zNzQsMTYgKzMzNSwyMiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLSAgUVVPVEFPRkYgTE9HIElURU1TICAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbSAqUU9GRl9JVEVNKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGxpcCwgc3RydWN0IHhmc19xb2ZmX2xvZ2l0ZW0sIHFxbF9pdGVtKTsKK30KKworCiAvKgogICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlIGdpdmVuIHF1b3Rhb2ZmIGl0ZW0uCiAgKiBXZSBvbmx5IG5lZWQgMSBpb3ZlYyBmb3IgYW4gcXVvdGFvZmYgaXRlbS4gIEl0IGp1c3QgbG9ncyB0aGUKICAqIHF1b3Rhb2ZmX2xvZ19mb3JtYXQgc3RydWN0dXJlLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB1aW50Ci14ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUoeGZzX3FvZmZfbG9naXRlbV90ICpxZikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fc2l6ZSgKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JcmV0dXJuICgxKTsKKwlyZXR1cm4gMTsKIH0KIAogLyoKQEAgLTM5NCw1MyArMzYxLDQ2IEBACiAgKiBzbG90cyBpbiB0aGUgcXVvdGFvZmYgaXRlbSBoYXZlIGJlZW4gZmlsbGVkLgogICovCiBTVEFUSUMgdm9pZAoteGZzX3FtX3FvZmZfbG9naXRlbV9mb3JtYXQoeGZzX3FvZmZfbG9naXRlbV90CSpxZiwKLQkJCSAgIHhmc19sb2dfaW92ZWNfdAkqbG9nX3ZlY3RvcikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fZm9ybWF0KAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKKwlzdHJ1Y3QgeGZzX2xvZ19pb3ZlYwkqbG9nX3ZlY3RvcikKIHsKLQlBU1NFUlQocWYtPnFxbF9mb3JtYXQucWZfdHlwZSA9PSBYRlNfTElfUVVPVEFPRkYpOworCXN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtCSpxZmxpcCA9IFFPRkZfSVRFTShsaXApOwogCi0JbG9nX3ZlY3Rvci0+aV9hZGRyID0gKHhmc19jYWRkcl90KSYocWYtPnFxbF9mb3JtYXQpOworCUFTU0VSVChxZmxpcC0+cXFsX2Zvcm1hdC5xZl90eXBlID09IFhGU19MSV9RVU9UQU9GRik7CisKKwlsb2dfdmVjdG9yLT5pX2FkZHIgPSAmcWZsaXAtPnFxbF9mb3JtYXQ7CiAJbG9nX3ZlY3Rvci0+aV9sZW4gPSBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KTsKIAlsb2dfdmVjdG9yLT5pX3R5cGUgPSBYTE9HX1JFR19UWVBFX1FVT1RBT0ZGOwotCXFmLT5xcWxfZm9ybWF0LnFmX3NpemUgPSAxOworCXFmbGlwLT5xcWxfZm9ybWF0LnFmX3NpemUgPSAxOwogfQogCi0KIC8qCiAgKiBQaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBxdW90YW9mZiBpdGVtLCBzbyBqdXN0IHJldHVybi4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgdm9pZAoteGZzX3FtX3FvZmZfbG9naXRlbV9waW4oeGZzX3FvZmZfbG9naXRlbV90ICpxZikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fcGluKAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQlyZXR1cm47CiB9CiAKLQogLyoKICAqIFNpbmNlIHBpbm5pbmcgaGFzIG5vIG1lYW5pbmcgZm9yIGFuIHF1b3Rhb2ZmIGl0ZW0sIHVucGlubmluZyBkb2VzCiAgKiBub3QgZWl0aGVyLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB2b2lkCi14ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYpCit4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluKAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKKwlpbnQJCQlyZW1vdmUpCiB7Ci0JcmV0dXJuOwotfQotCi0vKkFSR1NVU0VEKi8KLVNUQVRJQyB2b2lkCi14ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluX3JlbW92ZSh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmLCB4ZnNfdHJhbnNfdCAqdHApCi17Ci0JcmV0dXJuOwogfQogCiAvKgogICogUXVvdGFvZmYgaXRlbXMgaGF2ZSBubyBsb2NraW5nLCBzbyBqdXN0IHJldHVybiBzdWNjZXNzLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB1aW50Ci14ZnNfcW1fcW9mZl9sb2dpdGVtX3RyeWxvY2soeGZzX3FvZmZfbG9naXRlbV90ICpxZikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fdHJ5bG9jaygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7CiAJcmV0dXJuIFhGU19JVEVNX0xPQ0tFRDsKIH0KQEAgLTQ0OSw1MyArNDA5LDUxIEBACiAgKiBRdW90YW9mZiBpdGVtcyBoYXZlIG5vIGxvY2tpbmcgb3IgcHVzaGluZywgc28gcmV0dXJuIGZhaWx1cmUKICAqIHNvIHRoYXQgdGhlIGNhbGxlciBkb2Vzbid0IGJvdGhlciB3aXRoIHVzLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB2b2lkCi14ZnNfcW1fcW9mZl9sb2dpdGVtX3VubG9jayh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2soCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewotCXJldHVybjsKIH0KIAogLyoKICAqIFRoZSBxdW90YW9mZi1zdGFydC1pdGVtIGlzIGxvZ2dlZCBvbmx5IG9uY2UgYW5kIGNhbm5vdCBiZSBtb3ZlZCBpbiB0aGUgbG9nLAogICogc28gc2ltcGx5IHJldHVybiB0aGUgbHNuIGF0IHdoaWNoIGl0J3MgYmVlbiBsb2dnZWQuCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHhmc19sc25fdAoteGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0ZWQoeGZzX3FvZmZfbG9naXRlbV90ICpxZiwgeGZzX2xzbl90IGxzbikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fY29tbWl0dGVkKAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKKwl4ZnNfbHNuX3QJCWxzbikKIHsKLQlyZXR1cm4gKGxzbik7CisJcmV0dXJuIGxzbjsKIH0KIAogLyoKICAqIFRoZXJlIGlzbid0IG11Y2ggeW91IGNhbiBkbyB0byBwdXNoIG9uIGFuIHF1b3Rhb2ZmIGl0ZW0uICBJdCBpcyBzaW1wbHkKICAqIHN0dWNrIHdhaXRpbmcgZm9yIHRoZSBsb2cgdG8gYmUgZmx1c2hlZCB0byBkaXNrLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB2b2lkCi14ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2goeGZzX3FvZmZfbG9naXRlbV90ICpxZikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fcHVzaCgKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JcmV0dXJuOwogfQogCiAKLS8qQVJHU1VTRUQqLwogU1RBVElDIHhmc19sc25fdAogeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9jb21taXR0ZWQoCi0JeGZzX3FvZmZfbG9naXRlbV90ICpxZmUsCi0JeGZzX2xzbl90IGxzbikKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQlsc24pCiB7Ci0JeGZzX3FvZmZfbG9naXRlbV90CSpxZnM7Ci0Jc3RydWN0IHhmc19haWwJCSphaWxwOworCXN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtCSpxZmUgPSBRT0ZGX0lURU0obGlwKTsKKwlzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbQkqcWZzID0gcWZlLT5xcWxfc3RhcnRfbGlwOworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IHFmcy0+cXFsX2l0ZW0ubGlfYWlscDsKIAotCXFmcyA9IHFmZS0+cXFsX3N0YXJ0X2xpcDsKLQlhaWxwID0gcWZzLT5xcWxfaXRlbS5saV9haWxwOwotCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJLyoKIAkgKiBEZWxldGUgdGhlIHFvZmYtc3RhcnQgbG9naXRlbSBmcm9tIHRoZSBBSUwuCiAJICogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJICovCisJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAoeGZzX2xvZ19pdGVtX3QgKilxZnMpOworCiAJa21lbV9mcmVlKHFmcyk7CiAJa21lbV9mcmVlKHFmZSk7CiAJcmV0dXJuICh4ZnNfbHNuX3QpLTE7CkBAIC01MTUsNzEgKzQ3Myw1MiBAQAogICogKHRydWx5IG1ha2VzIHRoZSBxdW90YW9mZiBpcnJldm9jYWJsZSkuICBJZiB3ZSBkbyBzb21ldGhpbmcgZWxzZSwKICAqIHRoZW4gbWF5YmUgd2UgZG9uJ3QgbmVlZCB0d28uCiAgKi8KLS8qIEFSR1NVU0VEICovCiBTVEFUSUMgdm9pZAoteGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0aW5nKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWlwLCB4ZnNfbHNuX3QgY29tbWl0X2xzbikKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fY29tbWl0dGluZygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQljb21taXRfbHNuKQogewotCXJldHVybjsKLX0KLQotLyogQVJHU1VTRUQgKi8KLVNUQVRJQyB2b2lkCi14ZnNfcW1fcW9mZmVuZF9sb2dpdGVtX2NvbW1pdHRpbmcoeGZzX3FvZmZfbG9naXRlbV90ICpxaXAsIHhmc19sc25fdCBjb21taXRfbHNuKQotewotCXJldHVybjsKIH0KIAogc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9vcHMgPSB7Ci0JLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCi0JLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQotCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKLQkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9waW4sCi0JLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV91bnBpbiwKLQkuaW9wX3VucGluX3JlbW92ZSA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90Kix4ZnNfdHJhbnNfdCopKQotCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluX3JlbW92ZSwKLQkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdHJ5bG9jaywKLQkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2ssCi0JLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKLQkJCQkJeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9jb21taXR0ZWQsCi0JLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2gsCi0JLmlvcF9wdXNoYnVmCT0gTlVMTCwKLQkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCi0JCQkJCXhmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fY29tbWl0dGluZworCS5pb3Bfc2l6ZQk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0geGZzX3FtX3FvZmZfbG9naXRlbV9waW4sCisJLmlvcF91bnBpbgk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5waW4sCisJLmlvcF90cnlsb2NrCT0geGZzX3FtX3FvZmZfbG9naXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0geGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSB4ZnNfcW1fcW9mZmVuZF9sb2dpdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2gsCisJLmlvcF9jb21taXR0aW5nID0geGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0aW5nCiB9OwogCiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIHF1b3Rhb2ZmLXN0YXJ0IGxvZyBpdGVtcy4KICAqLwogc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZfbG9naXRlbV9vcHMgPSB7Ci0JLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCi0JLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQotCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKLQkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9waW4sCi0JLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV91bnBpbiwKLQkuaW9wX3VucGluX3JlbW92ZSA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90Kix4ZnNfdHJhbnNfdCopKQotCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluX3JlbW92ZSwKLQkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdHJ5bG9jaywKLQkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2ssCi0JLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKLQkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0ZWQsCi0JLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2gsCi0JLmlvcF9wdXNoYnVmCT0gTlVMTCwKLQkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCi0JCQkJCXhmc19xbV9xb2ZmX2xvZ2l0ZW1fY29tbWl0dGluZworCS5pb3Bfc2l6ZQk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0geGZzX3FtX3FvZmZfbG9naXRlbV9waW4sCisJLmlvcF91bnBpbgk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5waW4sCisJLmlvcF90cnlsb2NrCT0geGZzX3FtX3FvZmZfbG9naXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0geGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2gsCisJLmlvcF9jb21taXR0aW5nID0geGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0aW5nCiB9OwogCiAvKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gcXVvdGFvZmYgaXRlbSBvZiB0aGUgY29ycmVjdCBxdW90YSB0eXBlKHMpLgogICovCi14ZnNfcW9mZl9sb2dpdGVtX3QgKgorc3RydWN0IHhmc19xb2ZmX2xvZ2l0ZW0gKgogeGZzX3FtX3FvZmZfbG9naXRlbV9pbml0KAotCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAotCXhmc19xb2ZmX2xvZ2l0ZW1fdCAqc3RhcnQsCi0JdWludCBmbGFncykKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbQkqc3RhcnQsCisJdWludAkJCWZsYWdzKQogewotCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqcWY7CisJc3RydWN0IHhmc19xb2ZmX2xvZ2l0ZW0JKnFmOwogCi0JcWYgPSAoeGZzX3FvZmZfbG9naXRlbV90Kikga21lbV96YWxsb2Moc2l6ZW9mKHhmc19xb2ZmX2xvZ2l0ZW1fdCksIEtNX1NMRUVQKTsKKwlxZiA9IGttZW1femFsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbSksIEtNX1NMRUVQKTsKIAogCXhmc19sb2dfaXRlbV9pbml0KG1wLCAmcWYtPnFxbF9pdGVtLCBYRlNfTElfUVVPVEFPRkYsIHN0YXJ0ID8KIAkJCSZ4ZnNfcW1fcW9mZmVuZF9sb2dpdGVtX29wcyA6ICZ4ZnNfcW1fcW9mZl9sb2dpdGVtX29wcyk7CkBAIC01ODcsNSArNTI2LDUgQEAKIAlxZi0+cXFsX2Zvcm1hdC5xZl90eXBlID0gWEZTX0xJX1FVT1RBT0ZGOwogCXFmLT5xcWxfZm9ybWF0LnFmX2ZsYWdzID0gZmxhZ3M7CiAJcWYtPnFxbF9zdGFydF9saXAgPSBzdGFydDsKLQlyZXR1cm4gKHFmKTsKKwlyZXR1cm4gcWY7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKaW5kZXggNjdjMDE4My4uOWE5MjQwNyAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwpAQCAtMjMsMjUgKzIzLDE4IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19hdHRyLmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCkBAIC0xNDk3LDcgKzE0OTAsNyBAQAogCQkJCSAgbWF4bGJsa2NudCAtIGxibGtubywKIAkJCQkgIFhGU19CTUFQSV9NRVRBREFUQSwKIAkJCQkgIE5VTEwsCi0JCQkJICAwLCBtYXAsICZubWFwcywgTlVMTCwgTlVMTCk7CisJCQkJICAwLCBtYXAsICZubWFwcywgTlVMTCk7CiAJCXhmc19pdW5sb2NrKHFpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwpAQCAtMTY2OSw3ICsxNjYyLDggQEAKIAkgKiBtYWtpbmcgdXMgZGlzYWJsZSBxdW90YXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KIAkgKi8KIAlpZiAoKGVycm9yID0geGZzX3FtX2RxZ2V0X25vYXR0YWNoKGlwLCAmdWRxcCwgJmdkcXApKSkgewotCQl4ZnNfaXB1dChpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlJUkVMRShpcCk7CiAJCSpyZXMgPSBCVUxLU1RBVF9SVl9HSVZFVVA7CiAJCXJldHVybiBlcnJvcjsKIAl9CkBAIC0xNjgyLDcgKzE2NzYsOCBAQAogCQkgKiBXYWxrIHRocnUgdGhlIGV4dGVudCBsaXN0IGFuZCBjb3VudCB0aGUgcmVhbHRpbWUgYmxvY2tzLgogCQkgKi8KIAkJaWYgKChlcnJvciA9IHhmc19xbV9nZXRfcnRibGtzKGlwLCAmcnRibGtzKSkpIHsKLQkJCXhmc19pcHV0KGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJSVJFTEUoaXApOwogCQkJaWYgKHVkcXApCiAJCQkJeGZzX3FtX2RxcHV0KHVkcXApOwogCQkJaWYgKGdkcXApCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYwppbmRleCA5N2I0MTBjLi5iZWEwMmQ3IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKQEAgLTIzLDI1ICsyMywxNSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc19xbS5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5jCmluZGV4IDNkMWZjNzkuLjg2NzFhMGIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N0YXRzLmMKQEAgLTIzLDI1ICsyMywxNSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc19xbS5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IGI0NDg3NzYuLmQyNTdlYjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTI2LDI1ICsyNiwxNSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgpAQCAtMjQ4LDQwICsyMzgsNzQgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK1NUQVRJQyBpbnQKK3hmc19xbV9zY2FsbF90cnVuY19xZmlsZSgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwl4ZnNfaW5vX3QJCWlubykKK3sKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcDsKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cDsKKwlpbnQJCQllcnJvcjsKKworCWlmIChpbm8gPT0gTlVMTEZTSU5PKQorCQlyZXR1cm4gMDsKKworCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgMCwgJmlwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfVFJVTkNBVEVfRklMRSk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCk7CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXApOworCisJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLCAwLCBYRlNfREFUQV9GT1JLLCAxKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8CisJCQkJICAgICBYRlNfVFJBTlNfQUJPUlQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKKworb3V0X3VubG9jazoKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworb3V0X3B1dDoKKwlJUkVMRShpcCk7CisJcmV0dXJuIGVycm9yOworfQorCiBpbnQKIHhmc19xbV9zY2FsbF90cnVuY19xZmlsZXMoCiAJeGZzX21vdW50X3QJKm1wLAogCXVpbnQJCWZsYWdzKQogewogCWludAkJZXJyb3IgPSAwLCBlcnJvcjIgPSAwOwotCXhmc19pbm9kZV90CSpxaXA7CiAKIAlpZiAoIXhmc19zYl92ZXJzaW9uX2hhc3F1b3RhKCZtcC0+bV9zYikgfHwgZmxhZ3MgPT0gMCkgewogCQlxZHByaW50aygicXRydW5jIGZsYWdzPSV4IG1fcWZsYWdzPSV4XG4iLCBmbGFncywgbXAtPm1fcWZsYWdzKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCX0KIAotCWlmICgoZmxhZ3MgJiBYRlNfRFFfVVNFUikgJiYgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gIT0gTlVMTEZTSU5PKSB7Ci0JCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIG1wLT5tX3NiLnNiX3VxdW90aW5vLCAwLCAwLCAmcWlwKTsKLQkJaWYgKCFlcnJvcikgewotCQkJZXJyb3IgPSB4ZnNfdHJ1bmNhdGVfZmlsZShtcCwgcWlwKTsKLQkJCUlSRUxFKHFpcCk7Ci0JCX0KLQl9Ci0KLQlpZiAoKGZsYWdzICYgKFhGU19EUV9HUk9VUHxYRlNfRFFfUFJPSikpICYmCi0JICAgIG1wLT5tX3NiLnNiX2dxdW90aW5vICE9IE5VTExGU0lOTykgewotCQllcnJvcjIgPSB4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8sIDAsIDAsICZxaXApOwotCQlpZiAoIWVycm9yMikgewotCQkJZXJyb3IyID0geGZzX3RydW5jYXRlX2ZpbGUobXAsIHFpcCk7Ci0JCQlJUkVMRShxaXApOwotCQl9Ci0JfQorCWlmIChmbGFncyAmIFhGU19EUV9VU0VSKQorCQllcnJvciA9IHhmc19xbV9zY2FsbF90cnVuY19xZmlsZShtcCwgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8pOworCWlmIChmbGFncyAmIChYRlNfRFFfR1JPVVB8WEZTX0RRX1BST0opKQorCQllcnJvcjIgPSB4ZnNfcW1fc2NhbGxfdHJ1bmNfcWZpbGUobXAsIG1wLT5tX3NiLnNiX2dxdW90aW5vKTsKIAogCXJldHVybiBlcnJvciA/IGVycm9yIDogZXJyb3IyOwogfQogCi0KIC8qCiAgKiBTd2l0Y2ggb24gKGEgZ2l2ZW4pIHF1b3RhIGVuZm9yY2VtZW50IGZvciBhIGZpbGVzeXN0ZW0uICBUaGlzIHRha2VzCiAgKiBlZmZlY3QgaW1tZWRpYXRlbHkuCkBAIC04NzUsOCArODk5LDkgQEAKIAkJeGZzX3FtX2RxcmVsZShpcC0+aV9nZHF1b3QpOwogCQlpcC0+aV9nZHF1b3QgPSBOVUxMOwogCX0KLQl4ZnNfaXB1dChpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKKwlJUkVMRShpcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNDMsNyArMTE2OCw4IEBACiAJICogb2YgdGhvc2Ugbm93LgogCSAqLwogCWlmICghIGlwcmVsZWFzZWQpIHsKLQkJeGZzX2lwdXQoaXAsIGxvY2tfZmxhZ3MpOworCQl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7CisJCUlSRUxFKGlwKTsKIAkJaXByZWxlYXNlZCA9IEJfVFJVRTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0xMTYwLDcgKzExODYsOCBAQAogCQlBU1NFUlQoZ2QpOwogCQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFhZGp1c3QoaXAsIGdkKTsKIAl9Ci0JeGZzX2lwdXQoaXAsIGxvY2tfZmxhZ3MpOworCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwlJUkVMRShpcCk7CiAJKnJlcyA9IEJVTEtTVEFUX1JWX0RJRE9ORTsKIAlyZXR1cm4gKDApOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jCmluZGV4IDA2MWQ4MjcuLjdkZTkxZDEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfdHJhbnNfZHF1b3QuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3RyYW5zX2RxdW90LmMKQEAgLTIzLDI1ICsyMywxNSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCkBAIC01OSwxNiArNDksMTQgQEAKIAl4ZnNfdHJhbnNfdAkqdHAsCiAJeGZzX2RxdW90X3QJKmRxcCkKIHsKLQl4ZnNfZHFfbG9naXRlbV90ICAgICpscCA9ICZkcXAtPnFfbG9naXRlbTsKLQogCUFTU0VSVChkcXAtPnFfdHJhbnNwICE9IHRwKTsKIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKLQlBU1NFUlQobHAtPnFsaV9kcXVvdCA9PSBkcXApOworCUFTU0VSVChkcXAtPnFfbG9naXRlbS5xbGlfZHF1b3QgPT0gZHFwKTsKIAogCS8qCiAJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCiAJICovCi0JKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KikobHApKTsKKwl4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICZkcXAtPnFfbG9naXRlbS5xbGlfaXRlbSk7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgaV90cmFuc3Agc28gd2UgY2FuIGxhdGVyIGRldGVybWluZSBpZiB0aGlzIGRxdW90IGlzCkBAIC05MywxNiArODEsMTEgQEAKIAl4ZnNfdHJhbnNfdAkqdHAsCiAJeGZzX2RxdW90X3QJKmRxcCkKIHsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwotCiAJQVNTRVJUKGRxcC0+cV90cmFuc3AgPT0gdHApOwogCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOwogCi0JbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopKCZkcXAtPnFfbG9naXRlbSkpOwotCUFTU0VSVChsaWRwICE9IE5VTEwpOwotCiAJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOwotCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCWRxcC0+cV9sb2dpdGVtLnFsaV9pdGVtLmxpX2Rlc2MtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOwogfQogCiAvKgpAQCAtODc0LDkgKzg1Nyw4IEBACiAJLyoKIAkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KIAkgKi8KLQkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKXEpOwotCi0JcmV0dXJuIChxKTsKKwl4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICZxLT5xcWxfaXRlbSk7CisJcmV0dXJuIHE7CiB9CiAKIApAQCAtODkwLDEzICs4NzIsOCBAQAogCXhmc190cmFuc190CQkqdHAsCiAJeGZzX3FvZmZfbG9naXRlbV90CSpxbHApCiB7Ci0JeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKLQotCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKilxbHApOwotCUFTU0VSVChsaWRwICE9IE5VTEwpOwotCiAJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOwotCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCXFscC0+cXFsX2l0ZW0ubGlfZGVzYy0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7CiB9CiAKIFNUQVRJQyB2b2lkCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCAzZjM2MTBhLi45NzVhYTEwIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jLmMgYi9mcy94ZnMveGZzX2FsbG9jLmMKaW5kZXggYTdmYmU4YS4uYWYxNjhmYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2MuYwpAQCAtMjQsMTggKzI0LDEzIEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKQEAgLTY4OCw4ICs2ODMsNiBAQAogCXhmc19hZ2Jsb2NrX3QJbHRibm87CQkvKiBzdGFydCBibm8gb2YgbGVmdCBzaWRlIGVudHJ5ICovCiAJeGZzX2FnYmxvY2tfdAlsdGJub2E7CQkvKiBhbGlnbmVkIC4uLiAqLwogCXhmc19leHRsZW5fdAlsdGRpZmY7CQkvKiBkaWZmZXJlbmNlIHRvIGxlZnQgc2lkZSBlbnRyeSAqLwotCS8qUkVGRVJFTkNFRCovCi0JeGZzX2FnYmxvY2tfdAlsdGVuZDsJCS8qIGVuZCBibm8gb2YgbGVmdCBzaWRlIGVudHJ5ICovCiAJeGZzX2V4dGxlbl90CWx0bGVuOwkJLyogbGVuZ3RoIG9mIGxlZnQgc2lkZSBlbnRyeSAqLwogCXhmc19leHRsZW5fdAlsdGxlbmE7CQkvKiBhbGlnbmVkIC4uLiAqLwogCXhmc19hZ2Jsb2NrX3QJbHRuZXc7CQkvKiB1c2VmdWwgc3RhcnQgYm5vIG9mIGxlZnQgc2lkZSAqLwpAQCAtODE0LDggKzgwNyw3IEBACiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhjbnRfY3VyLCAmbHRibm8sICZsdGxlbiwgJmkpKSkKIAkJCWdvdG8gZXJyb3IwOwogCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCWx0ZW5kID0gbHRibm8gKyBsdGxlbjsKLQkJQVNTRVJUKGx0ZW5kIDw9IGJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoKSk7CisJCUFTU0VSVChsdGJubyArIGx0bGVuIDw9IGJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoKSk7CiAJCWFyZ3MtPmxlbiA9IGJsZW47CiAJCWlmICgheGZzX2FsbG9jX2ZpeF9taW5sZWZ0KGFyZ3MpKSB7CiAJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CkBAIC04MjgsNyArODIwLDcgQEAKIAkJICovCiAJCWFyZ3MtPmFnYm5vID0gYm5ldzsKIAkJQVNTRVJUKGJuZXcgPj0gbHRibm8pOwotCQlBU1NFUlQoYm5ldyArIGJsZW4gPD0gbHRlbmQpOworCQlBU1NFUlQoYm5ldyArIGJsZW4gPD0gbHRibm8gKyBsdGxlbik7CiAJCS8qCiAJCSAqIFNldCB1cCBhIGN1cnNvciBmb3IgdGhlIGJ5LWJubyB0cmVlLgogCQkgKi8KQEAgLTExNTcsNyArMTE0OSw2IEBACiAJLyoKIAkgKiBGaXggdXAgdGhlIGxlbmd0aCBhbmQgY29tcHV0ZSB0aGUgdXNlZnVsIGFkZHJlc3MuCiAJICovCi0JbHRlbmQgPSBsdGJubyArIGx0bGVuOwogCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGx0bGVuYSwgYXJncy0+bWF4bGVuKTsKIAl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKIAlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkgewpAQCAtMTE3MCw3ICsxMTYxLDcgQEAKIAkodm9pZCl4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBybGVuLCBhcmdzLT5hbGlnbm1lbnQsIGx0Ym5vLAogCQlsdGxlbiwgJmx0bmV3KTsKIAlBU1NFUlQobHRuZXcgPj0gbHRibm8pOwotCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gbHRlbmQpOworCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gbHRibm8gKyBsdGxlbik7CiAJQVNTRVJUKGx0bmV3ICsgcmxlbiA8PSBiZTMyX3RvX2NwdShYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2xlbmd0aCkpOwogCWFyZ3MtPmFnYm5vID0gbHRuZXc7CiAJaWYgKChlcnJvciA9IHhmc19hbGxvY19maXh1cF90cmVlcyhjbnRfY3VyLCBibm9fY3VyX2x0LCBsdGJubywgbHRsZW4sCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jLmggYi9mcy94ZnMveGZzX2FsbG9jLmgKaW5kZXggNmQwNTE5OS4uODk1MDA5YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvYy5oCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2MuaApAQCAtMjcsMTYgKzI3LDE2IEBACiAvKgogICogRnJlZXNwYWNlIGFsbG9jYXRpb24gdHlwZXMuICBBcmd1bWVudCB0byB4ZnNfYWxsb2NfW3ZdZXh0ZW50LgogICovCi10eXBlZGVmIGVudW0geGZzX2FsbG9jdHlwZQotewotCVhGU19BTExPQ1RZUEVfQU5ZX0FHLAkJLyogYWxsb2NhdGUgYW55d2hlcmUsIHVzZSByb3RvciAqLwotCVhGU19BTExPQ1RZUEVfRklSU1RfQUcsCQkvKiAuLi4gc3RhcnQgYXQgYWcgMCAqLwotCVhGU19BTExPQ1RZUEVfU1RBUlRfQUcsCQkvKiBhbnl3aGVyZSwgc3RhcnQgaW4gdGhpcyBhLmcuICovCi0JWEZTX0FMTE9DVFlQRV9USElTX0FHLAkJLyogYW55d2hlcmUgaW4gdGhpcyBhLmcuICovCi0JWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk8sCS8qIG5lYXIgdGhpcyBibG9jayBlbHNlIGFueXdoZXJlICovCi0JWEZTX0FMTE9DVFlQRV9ORUFSX0JOTywJCS8qIGluIHRoaXMgYS5nLiBhbmQgbmVhciB0aGlzIGJsb2NrICovCi0JWEZTX0FMTE9DVFlQRV9USElTX0JOTwkJLyogYXQgZXhhY3RseSB0aGlzIGJsb2NrICovCi19IHhmc19hbGxvY3R5cGVfdDsKKyNkZWZpbmUgWEZTX0FMTE9DVFlQRV9BTllfQUcJMHgwMQkvKiBhbGxvY2F0ZSBhbnl3aGVyZSwgdXNlIHJvdG9yICovCisjZGVmaW5lIFhGU19BTExPQ1RZUEVfRklSU1RfQUcJMHgwMgkvKiAuLi4gc3RhcnQgYXQgYWcgMCAqLworI2RlZmluZSBYRlNfQUxMT0NUWVBFX1NUQVJUX0FHCTB4MDQJLyogYW55d2hlcmUsIHN0YXJ0IGluIHRoaXMgYS5nLiAqLworI2RlZmluZSBYRlNfQUxMT0NUWVBFX1RISVNfQUcJMHgwOAkvKiBhbnl3aGVyZSBpbiB0aGlzIGEuZy4gKi8KKyNkZWZpbmUgWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk8JMHgxMAkvKiBuZWFyIHRoaXMgYmxvY2sgZWxzZSBhbnl3aGVyZSAqLworI2RlZmluZSBYRlNfQUxMT0NUWVBFX05FQVJfQk5PCTB4MjAJLyogaW4gdGhpcyBhLmcuIGFuZCBuZWFyIHRoaXMgYmxvY2sgKi8KKyNkZWZpbmUgWEZTX0FMTE9DVFlQRV9USElTX0JOTwkweDQwCS8qIGF0IGV4YWN0bHkgdGhpcyBibG9jayAqLworCisvKiB0aGlzIHNob3VsZCBiZWNvbWUgYW4gZW51bSBhZ2FpbiB3aGVuIHRoZSB0cmFjaW5nIGNvZGUgaXMgZml4ZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHhmc19hbGxvY3R5cGVfdDsKIAogI2RlZmluZSBYRlNfQUxMT0NfVFlQRVMgXAogCXsgWEZTX0FMTE9DVFlQRV9BTllfQUcsCQkiQU5ZX0FHIiB9LCBcCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMgYi9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMKaW5kZXggODNmNDk0Mi4uOTdmNzMyOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvY19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYwpAQCAtMjQsMTkgKzI0LDE0IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5jIGIvZnMveGZzL3hmc19hdHRyLmMKaW5kZXggYjljMTk2YS4uYzI1NjgyNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyLmMKKysrIGIvZnMveGZzL3hmc19hdHRyLmMKQEAgLTI1LDE5ICsyNSwxMyBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKQEAgLTMyNSw4ICszMTksNyBAQAogCQlyZXR1cm4gKGVycm9yKTsKIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWhvbGQoYXJncy50cmFucywgZHApOworCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCk7CiAKIAkvKgogCSAqIElmIHRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBub24tZXhpc3RlbnQgb3IgYSBzaG9ydGZvcm0gbGlzdCwKQEAgLTM5NiwxMCArMzg5LDggQEAKIAkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCi0JCWlmIChjb21taXR0ZWQpIHsKLQkJCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MudHJhbnMsIGRwKTsKLQkJfQorCQlpZiAoY29tbWl0dGVkKQorCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MudHJhbnMsIGRwKTsKIAogCQkvKgogCQkgKiBDb21taXQgdGhlIGxlYWYgdHJhbnNmb3JtYXRpb24uICBXZSdsbCBuZWVkIGFub3RoZXIgKGxpbmtlZCkKQEAgLTU0NCw4ICs1MzUsNyBAQAogCSAqIE5vIG5lZWQgdG8gbWFrZSBxdW90YSByZXNlcnZhdGlvbnMgaGVyZS4gV2UgZXhwZWN0IHRvIHJlbGVhc2Ugc29tZQogCSAqIGJsb2NrcyBub3QgYWxsb2NhdGUgaW4gdGhlIGNvbW1vbiBjYXNlLgogCSAqLwotCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19paG9sZChhcmdzLnRyYW5zLCBkcCk7CisJeGZzX3RyYW5zX2lqb2luKGFyZ3MudHJhbnMsIGRwKTsKIAogCS8qCiAJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgpAQCAtODIxLDggKzgxMSw3IEBACiAJICogTm8gbmVlZCB0byBtYWtlIHF1b3RhIHJlc2VydmF0aW9ucyBoZXJlLiBXZSBleHBlY3QgdG8gcmVsZWFzZSBzb21lCiAJICogYmxvY2tzLCBub3QgYWxsb2NhdGUsIGluIHRoZSBjb21tb24gY2FzZS4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW4odHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lob2xkKHRyYW5zLCBkcCk7CisJeGZzX3RyYW5zX2lqb2luKHRyYW5zLCBkcCk7CiAKIAkvKgogCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KQEAgLTk4MSwxMCArOTcwLDggQEAKIAkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCi0JCWlmIChjb21taXR0ZWQpIHsKLQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKLQkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOwotCQl9CisJCWlmIChjb21taXR0ZWQpCisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKIAogCQkvKgogCQkgKiBDb21taXQgdGhlIGN1cnJlbnQgdHJhbnMgKGluY2x1ZGluZyB0aGUgaW5vZGUpIGFuZCBzdGFydApAQCAtMTA4NSwxMCArMTA3Miw4IEBACiAJCQkgKiBhbmQgc3RhcnRlZCBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZQogCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJCSAqLwotCQkJaWYgKGNvbW1pdHRlZCkgewotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKLQkJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKLQkJCX0KKwkJCWlmIChjb21taXR0ZWQpCisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CiAJCX0gZWxzZQogCQkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKIApAQCAtMTE2MSwxMCArMTE0Niw4IEBACiAJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwotCQlpZiAoY29tbWl0dGVkKSB7Ci0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKLQkJfQorCQlpZiAoY29tbWl0dGVkKQorCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CiAJfSBlbHNlCiAJCXhmc19kYV9idWZfZG9uZShicCk7CiAJcmV0dXJuKDApOwpAQCAtMTMxNywxMCArMTMwMCw4IEBACiAJCQkgKiBhbmQgc3RhcnRlZCBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZQogCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJCSAqLwotCQkJaWYgKGNvbW1pdHRlZCkgewotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKLQkJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKLQkJCX0KKwkJCWlmIChjb21taXR0ZWQpCisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CiAKIAkJCS8qCiAJCQkgKiBDb21taXQgdGhlIG5vZGUgY29udmVyc2lvbiBhbmQgc3RhcnQgdGhlIG5leHQKQEAgLTEzNTYsMTAgKzEzMzcsOCBAQAogCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucyBhbmQgc3RhcnRlZAogCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkgKi8KLQkJaWYgKGNvbW1pdHRlZCkgewotCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBkcCk7Ci0JCX0KKwkJaWYgKGNvbW1pdHRlZCkKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEFkZGl0aW9uIHN1Y2NlZWRlZCwgdXBkYXRlIEJ0cmVlIGhhc2h2YWxzLgpAQCAtMTQ3MCwxMCArMTQ0OSw4IEBACiAJCQkgKiBhbmQgc3RhcnRlZCBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZQogCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJCSAqLwotCQkJaWYgKGNvbW1pdHRlZCkgewotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKLQkJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKLQkJCX0KKwkJCWlmIChjb21taXR0ZWQpCisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CiAJCX0KIAogCQkvKgpAQCAtMTYwNCwxMCArMTU4MSw4IEBACiAJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwotCQlpZiAoY29tbWl0dGVkKSB7Ci0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKLQkJfQorCQlpZiAoY29tbWl0dGVkKQorCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CiAKIAkJLyoKIAkJICogQ29tbWl0IHRoZSBCdHJlZSBqb2luIG9wZXJhdGlvbiBhbmQgc3RhcnQgYSBuZXcgdHJhbnMuCkBAIC0xNjU4LDEwICsxNjMzLDggQEAKIAkJCSAqIGFuZCBzdGFydGVkIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlCiAJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkJICovCi0JCQlpZiAoY29tbWl0dGVkKSB7Ci0JCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOwotCQkJfQorCQkJaWYgKGNvbW1pdHRlZCkKKwkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKIAkJfSBlbHNlCiAJCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBicCk7CiAJfQpAQCAtMjAwNCw3ICsxOTc3LDcgQEAKIAkJZXJyb3IgPSB4ZnNfYm1hcGkoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCiAJCQkJICBhcmdzLT5ybXRibGtjbnQsCiAJCQkJICBYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEsCi0JCQkJICBOVUxMLCAwLCBtYXAsICZubWFwLCBOVUxMLCBOVUxMKTsKKwkJCQkgIE5VTEwsIDAsIG1hcCwgJm5tYXAsIE5VTEwpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4oZXJyb3IpOwogCQlBU1NFUlQobm1hcCA+PSAxKTsKQEAgLTIwODMsNyArMjA1Niw3IEBACiAJCQkJICBYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEgfAogCQkJCQkJCVhGU19CTUFQSV9XUklURSwKIAkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLCAmbWFwLCAmbm1hcCwKLQkJCQkgIGFyZ3MtPmZsaXN0LCBOVUxMKTsKKwkJCQkgIGFyZ3MtPmZsaXN0KTsKIAkJaWYgKCFlcnJvcikgewogCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKIAkJCQkJCSZjb21taXR0ZWQpOwpAQCAtMjA5OSwxMCArMjA3Miw4IEBACiAJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwotCQlpZiAoY29tbWl0dGVkKSB7Ci0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKLQkJfQorCQlpZiAoY29tbWl0dGVkKQorCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CiAKIAkJQVNTRVJUKG5tYXAgPT0gMSk7CiAJCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgpAQCAtMjEzNiw3ICsyMTA3LDcgQEAKIAkJCQkgIGFyZ3MtPnJtdGJsa2NudCwKIAkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKIAkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIDAsICZtYXAsICZubWFwLAotCQkJCSAgTlVMTCwgTlVMTCk7CisJCQkJICBOVUxMKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlyZXR1cm4oZXJyb3IpOwogCQl9CkBAIC0yMjAxLDcgKzIxNzIsNyBAQAogCQkJCQlhcmdzLT5ybXRibGtjbnQsCiAJCQkJCVhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKIAkJCQkJYXJncy0+Zmlyc3RibG9jaywgMCwgJm1hcCwgJm5tYXAsCi0JCQkJCWFyZ3MtPmZsaXN0LCBOVUxMKTsKKwkJCQkJYXJncy0+Zmxpc3QpOwogCQlpZiAoZXJyb3IpIHsKIAkJCXJldHVybihlcnJvcik7CiAJCX0KQEAgLTIyMzksNyArMjIxMCw3IEBACiAJCWVycm9yID0geGZzX2J1bm1hcGkoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBsYmxrbm8sIGJsa2NudCwKIAkJCQkgICAgWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAogCQkJCSAgICAxLCBhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT5mbGlzdCwKLQkJCQkgICAgTlVMTCwgJmRvbmUpOworCQkJCSAgICAmZG9uZSk7CiAJCWlmICghZXJyb3IpIHsKIAkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywgYXJncy0+Zmxpc3QsCiAJCQkJCQkmY29tbWl0dGVkKTsKQEAgLTIyNTUsMTAgKzIyMjYsOCBAQAogCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucyBhbmQgc3RhcnRlZAogCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkgKi8KLQkJaWYgKGNvbW1pdHRlZCkgewotCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCk7Ci0JCX0KKwkJaWYgKGNvbW1pdHRlZCkKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgYXJncy0+ZHApOwogCiAJCS8qCiAJCSAqIENsb3NlIG91dCB0cmFucyBhbmQgc3RhcnQgdGhlIG5leHQgb25lIGluIHRoZSBjaGFpbi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCmluZGV4IGE5MGNlNzQuLmE2Y2ZmOGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKQEAgLTMzLDcgKzMxLDYgQEAKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKQEAgLTI5MzEsNyArMjkyOCw3IEBACiAJCW5tYXAgPSAxOwogCQllcnJvciA9IHhmc19ibWFwaSgqdHJhbnMsIGRwLCAoeGZzX2ZpbGVvZmZfdCl0Ymxrbm8sIHRibGtjbnQsCiAJCQkJCVhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkJTlVMTCwgMCwgJm1hcCwgJm5tYXAsIE5VTEwsIE5VTEwpOworCQkJCQlOVUxMLCAwLCAmbWFwLCAmbm1hcCwgTlVMTCk7CiAJCWlmIChlcnJvcikgewogCQkJcmV0dXJuKGVycm9yKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwppbmRleCA5OTU4N2RlLi4yM2YxNGU1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMveGZzX2JtYXAuYwpAQCAtMzAsMTMgKzMwLDEwIEBACiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgpAQCAtMTA0LDcgKzEwMSw2IEBACiAJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KIAl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCiAJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCXhmc19leHRkZWx0YV90CQkqZGVsdGEsIC8qIENoYW5nZSBtYWRlIHRvIGluY29yZSBleHRlbnRzICovCiAJaW50CQkJd2hpY2hmb3JrLCAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwogCWludAkJCXJzdmQpOwkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KIApAQCAtMTIyLDcgKzExOCw2IEBACiAJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KIAl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCiAJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCXhmc19leHRkZWx0YV90CQkqZGVsdGEsIC8qIENoYW5nZSBtYWRlIHRvIGluY29yZSBleHRlbnRzICovCiAJaW50CQkJcnN2ZCk7CS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLwogCiAvKgpAQCAtMTM1LDcgKzEzMCw2IEBACiAJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLwogCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogCWludAkJCSpsb2dmbGFnc3AsLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCXhmc19leHRkZWx0YV90CQkqZGVsdGEsIC8qIENoYW5nZSBtYWRlIHRvIGluY29yZSBleHRlbnRzICovCiAJaW50CQkJcnN2ZCk7CS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLwogCiAvKgpAQCAtMTQ5LDcgKzE0Myw2IEBACiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLwogCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhLCAvKiBDaGFuZ2UgbWFkZSB0byBpbmNvcmUgZXh0ZW50cyAqLwogCWludAkJCXdoaWNoZm9yayk7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCiAKIC8qCkBAIC0xNjIsOCArMTU1LDcgQEAKIAl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCiAJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCiAJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCXhmc19leHRkZWx0YV90CQkqZGVsdGEpOyAvKiBDaGFuZ2UgbWFkZSB0byBpbmNvcmUgZXh0ZW50cyAqLworCWludAkJCSpsb2dmbGFnc3ApOyAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCiAKIC8qCiAgKiB4ZnNfYm1hcF9hbGxvYyBpcyBjYWxsZWQgYnkgeGZzX2JtYXBpIHRvIGFsbG9jYXRlIGFuIGV4dGVudCBmb3IgYSBmaWxlLgpAQCAtMjAwLDcgKzE5Miw2IEBACiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLwogCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogCWludAkJCSpsb2dmbGFnc3AsLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCXhmc19leHRkZWx0YV90CQkqZGVsdGEsIC8qIENoYW5nZSBtYWRlIHRvIGluY29yZSBleHRlbnRzICovCiAJaW50CQkJd2hpY2hmb3JrLCAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwogCWludAkJCXJzdmQpOwkgLyogT0sgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgYmxvY2tzICovCiAKQEAgLTQ4OSw3ICs0ODAsNiBAQAogCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJLyogcG9pbnRlciB0byBmaXJzdGJsb2NrIHZhcmlhYmxlICovCiAJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLwogCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhLCAvKiBDaGFuZ2UgbWFkZSB0byBpbmNvcmUgZXh0ZW50cyAqLwogCWludAkJCXdoaWNoZm9yaywgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIAlpbnQJCQlyc3ZkKQkvKiBPSyB0byB1c2UgcmVzZXJ2ZWQgZGF0YSBibG9ja3MgKi8KIHsKQEAgLTUyNCwxNSArNTE0LDYgQEAKIAkJCWxvZ2ZsYWdzID0gWEZTX0lMT0dfQ09SRSB8IHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKTsKIAkJfSBlbHNlCiAJCQlsb2dmbGFncyA9IDA7Ci0JCS8qIERFTFRBOiBzaW5nbGUgbmV3IGV4dGVudCAqLwotCQlpZiAoZGVsdGEpIHsKLQkJCWlmIChkZWx0YS0+eGVkX3N0YXJ0b2ZmID4gbmV3LT5icl9zdGFydG9mZikKLQkJCQlkZWx0YS0+eGVkX3N0YXJ0b2ZmID0gbmV3LT5icl9zdGFydG9mZjsKLQkJCWlmIChkZWx0YS0+eGVkX2Jsb2NrY291bnQgPAotCQkJCQluZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50KQotCQkJCWRlbHRhLT54ZWRfYmxvY2tjb3VudCA9IG5ldy0+YnJfc3RhcnRvZmYgKwotCQkJCQkJbmV3LT5icl9ibG9ja2NvdW50OwotCQl9CiAJfQogCS8qCiAJICogQW55IGtpbmQgb2YgbmV3IGRlbGF5ZWQgYWxsb2NhdGlvbiBnb2VzIGhlcmUuCkBAIC01NDIsNyArNTIzLDcgQEAKIAkJCUFTU0VSVCgoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJgogCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfZGVsYXkoaXAsIGlkeCwgbmV3LAotCQkJCSZsb2dmbGFncywgZGVsdGEsIHJzdmQpKSkKKwkJCQkmbG9nZmxhZ3MsIHJzdmQpKSkKIAkJCWdvdG8gZG9uZTsKIAl9CiAJLyoKQEAgLTU1Myw3ICs1MzQsNyBAQAogCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyAmCiAJCQkJWEZTX0JUQ1VSX0JQUlZfV0FTREVMKSA9PSAwKTsKIAkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKGlwLCBpZHgsIGN1ciwgbmV3LAotCQkJCSZsb2dmbGFncywgZGVsdGEsIHdoaWNoZm9yaykpKQorCQkJCSZsb2dmbGFncywgd2hpY2hmb3JrKSkpCiAJCQlnb3RvIGRvbmU7CiAJfSBlbHNlIHsKIAkJeGZzX2JtYnRfaXJlY190CXByZXY7CS8qIG9sZCBleHRlbnQgYXQgb2Zmc2V0IGlkeCAqLwpAQCAtNTc4LDE3ICs1NTksMTcgQEAKIAkJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCk7CiAJCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbChpcCwKIAkJCQkJaWR4LCAmY3VyLCBuZXcsICZkYV9uZXcsIGZpcnN0LCBmbGlzdCwKLQkJCQkJJmxvZ2ZsYWdzLCBkZWx0YSwgcnN2ZCkpKQorCQkJCQkmbG9nZmxhZ3MsIHJzdmQpKSkKIAkJCQkJZ290byBkb25lOwogCQkJfSBlbHNlIGlmIChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkgewogCQkJCUFTU0VSVChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CiAJCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwoCi0JCQkJCWlwLCBpZHgsICZjdXIsIG5ldywgJmxvZ2ZsYWdzLCBkZWx0YSkpKQorCQkJCQlpcCwgaWR4LCAmY3VyLCBuZXcsICZsb2dmbGFncykpKQogCQkJCQlnb3RvIGRvbmU7CiAJCQl9IGVsc2UgewogCQkJCUFTU0VSVChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKIAkJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKLQkJCQkJaXAsIGlkeCwgJmN1ciwgbmV3LCAmbG9nZmxhZ3MsIGRlbHRhKSkpCisJCQkJCWlwLCBpZHgsICZjdXIsIG5ldywgJmxvZ2ZsYWdzKSkpCiAJCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAkJCUFTU0VSVCgqY3VycCA9PSBjdXIgfHwgKmN1cnAgPT0gTlVMTCk7CkBAIC02MDEsNyArNTgyLDcgQEAKIAkJCQlBU1NFUlQoKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKIAkJCQkJWEZTX0JUQ1VSX0JQUlZfV0FTREVMKSA9PSAwKTsKIAkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfcmVhbChpcCwgaWR4LCBjdXIsCi0JCQkJCW5ldywgJmxvZ2ZsYWdzLCBkZWx0YSwgd2hpY2hmb3JrKSkpCisJCQkJCW5ldywgJmxvZ2ZsYWdzLCB3aGljaGZvcmspKSkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CkBAIC02NjYsNyArNjQ3LDYgQEAKIAl4ZnNfZnNibG9ja190CQkqZmlyc3QsCS8qIHBvaW50ZXIgdG8gZmlyc3RibG9jayB2YXJpYWJsZSAqLwogCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZWQgKi8KIAlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCi0JeGZzX2V4dGRlbHRhX3QJCSpkZWx0YSwgLyogQ2hhbmdlIG1hZGUgdG8gaW5jb3JlIGV4dGVudHMgKi8KIAlpbnQJCQlyc3ZkKQkvKiBPSyB0byB1c2UgcmVzZXJ2ZWQgZGF0YSBibG9jayBhbGxvY2F0aW9uICovCiB7CiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkvKiBidHJlZSBjdXJzb3IgKi8KQEAgLTc5NywxMSArNzc3LDYgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJKmRuZXcgPSAwOwotCQkvKiBERUxUQTogVGhyZWUgaW4tY29yZSBleHRlbnRzIGFyZSByZXBsYWNlZCBieSBvbmUuICovCi0JCXRlbXAgPSBMRUZULmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IExFRlQuYnJfYmxvY2tjb3VudCArCi0JCQlQUkVWLmJyX2Jsb2NrY291bnQgKwotCQkJUklHSFQuYnJfYmxvY2tjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIEJNQVBfTEVGVF9GSUxMSU5HIHwgQk1BUF9SSUdIVF9GSUxMSU5HIHwgQk1BUF9MRUZUX0NPTlRJRzoKQEAgLTgzMiwxMCArODA3LDYgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJKmRuZXcgPSAwOwotCQkvKiBERUxUQTogVHdvIGluLWNvcmUgZXh0ZW50cyBhcmUgcmVwbGFjZWQgYnkgb25lLiAqLwotCQl0ZW1wID0gTEVGVC5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBMRUZULmJyX2Jsb2NrY291bnQgKwotCQkJUFJFVi5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX1JJR0hUX0ZJTExJTkcgfCBCTUFQX1JJR0hUX0NPTlRJRzoKQEAgLTg2NywxMCArODM4LDYgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJKmRuZXcgPSAwOwotCQkvKiBERUxUQTogVHdvIGluLWNvcmUgZXh0ZW50cyBhcmUgcmVwbGFjZWQgYnkgb25lLiAqLwotCQl0ZW1wID0gUFJFVi5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBQUkVWLmJyX2Jsb2NrY291bnQgKwotCQkJUklHSFQuYnJfYmxvY2tjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIEJNQVBfTEVGVF9GSUxMSU5HIHwgQk1BUF9SSUdIVF9GSUxMSU5HOgpAQCAtOTAwLDkgKzg2Nyw2IEBACiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9CiAJCSpkbmV3ID0gMDsKLQkJLyogREVMVEE6IFRoZSBpbi1jb3JlIGV4dGVudCBkZXNjcmliZWQgYnkgbmV3IGNoYW5nZWQgdHlwZS4gKi8KLQkJdGVtcCA9IG5ldy0+YnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gbmV3LT5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX0xFRlRfQ09OVElHOgpAQCAtOTQyLDEwICs5MDYsNiBAQAogCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbnVsbHN0YXJ0YmxvY2soKGludCl0ZW1wKSk7CiAJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCBpZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCQkqZG5ldyA9IHRlbXA7Ci0JCS8qIERFTFRBOiBUaGUgYm91bmRhcnkgYmV0d2VlbiB0d28gaW4tY29yZSBleHRlbnRzIG1vdmVkLiAqLwotCQl0ZW1wID0gTEVGVC5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBMRUZULmJyX2Jsb2NrY291bnQgKwotCQkJUFJFVi5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkc6CkBAIC05OTAsOSArOTUwLDYgQEAKIAkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOwogCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgaWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CiAJCSpkbmV3ID0gdGVtcDsKLQkJLyogREVMVEE6IE9uZSBpbi1jb3JlIGV4dGVudCBpcyBzcGxpdCBpbiB0d28uICovCi0JCXRlbXAgPSBQUkVWLmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IFBSRVYuYnJfYmxvY2tjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfUklHSFRfQ09OVElHOgpAQCAtMTAzMSwxMCArOTg4LDYgQEAKIAkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOwogCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAkJKmRuZXcgPSB0ZW1wOwotCQkvKiBERUxUQTogVGhlIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGluLWNvcmUgZXh0ZW50cyBtb3ZlZC4gKi8KLQkJdGVtcCA9IFBSRVYuYnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gUFJFVi5icl9ibG9ja2NvdW50ICsKLQkJCVJJR0hULmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX1JJR0hUX0ZJTExJTkc6CkBAIC0xMDc4LDkgKzEwMzEsNiBAQAogCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbnVsbHN0YXJ0YmxvY2soKGludCl0ZW1wKSk7CiAJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCBpZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCQkqZG5ldyA9IHRlbXA7Ci0JCS8qIERFTFRBOiBPbmUgaW4tY29yZSBleHRlbnQgaXMgc3BsaXQgaW4gdHdvLiAqLwotCQl0ZW1wID0gUFJFVi5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBQUkVWLmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSAwOgpAQCAtMTE2MSw5ICsxMTExLDYgQEAKIAkJCW51bGxzdGFydGJsb2NrKChpbnQpdGVtcDIpKTsKIAkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsIGlkeCArIDIsIHN0YXRlLCBfVEhJU19JUF8pOwogCQkqZG5ldyA9IHRlbXAgKyB0ZW1wMjsKLQkJLyogREVMVEE6IE9uZSBpbi1jb3JlIGV4dGVudCBpcyBzcGxpdCBpbiB0aHJlZS4gKi8KLQkJdGVtcCA9IFBSRVYuYnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gUFJFVi5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX0xFRlRfQ09OVElHIHwgQk1BUF9SSUdIVF9DT05USUc6CkBAIC0xMTc5LDEzICsxMTI2LDYgQEAKIAkJQVNTRVJUKDApOwogCX0KIAkqY3VycCA9IGN1cjsKLQlpZiAoZGVsdGEpIHsKLQkJdGVtcDIgKz0gdGVtcDsKLQkJaWYgKGRlbHRhLT54ZWRfc3RhcnRvZmYgPiB0ZW1wKQotCQkJZGVsdGEtPnhlZF9zdGFydG9mZiA9IHRlbXA7Ci0JCWlmIChkZWx0YS0+eGVkX2Jsb2NrY291bnQgPCB0ZW1wMikKLQkJCWRlbHRhLT54ZWRfYmxvY2tjb3VudCA9IHRlbXAyOwotCX0KIGRvbmU6CiAJKmxvZ2ZsYWdzcCA9IHJ2YWw7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTIwNCw4ICsxMTQ0LDcgQEAKIAl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCiAJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCiAJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCXhmc19leHRkZWx0YV90CQkqZGVsdGEpIC8qIENoYW5nZSBtYWRlIHRvIGluY29yZSBleHRlbnRzICovCisJaW50CQkJKmxvZ2ZsYWdzcCkgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwogewogCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yICovCiAJeGZzX2JtYnRfcmVjX2hvc3RfdAkqZXA7CS8qIGV4dGVudCBlbnRyeSBmb3IgaWR4ICovCkBAIC0xMjE5LDggKzExNTgsNiBAQAogCQkJCQkvKiBsZWZ0IGlzIDAsIHJpZ2h0IGlzIDEsIHByZXYgaXMgMiAqLwogCWludAkJCXJ2YWw9MDsJLyogcmV0dXJuIHZhbHVlIChsb2dnaW5nIGZsYWdzKSAqLwogCWludAkJCXN0YXRlID0gMDsvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLwotCXhmc19maWxibGtzX3QJCXRlbXA9MDsKLQl4ZnNfZmlsYmxrc190CQl0ZW1wMj0wOwogCiAjZGVmaW5lCUxFRlQJCXJbMF0KICNkZWZpbmUJUklHSFQJCXJbMV0KQEAgLTEzNDEsMTEgKzEyNzgsNiBAQAogCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJLyogREVMVEE6IFRocmVlIGluLWNvcmUgZXh0ZW50cyBhcmUgcmVwbGFjZWQgYnkgb25lLiAqLwotCQl0ZW1wID0gTEVGVC5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBMRUZULmJyX2Jsb2NrY291bnQgKwotCQkJUFJFVi5icl9ibG9ja2NvdW50ICsKLQkJCVJJR0hULmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfTEVGVF9DT05USUc6CkBAIC0xMzgyLDEwICsxMzE0LDYgQEAKIAkJCQlMRUZULmJyX3N0YXRlKSkpCiAJCQkJZ290byBkb25lOwogCQl9Ci0JCS8qIERFTFRBOiBUd28gaW4tY29yZSBleHRlbnRzIGFyZSByZXBsYWNlZCBieSBvbmUuICovCi0JCXRlbXAgPSBMRUZULmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IExFRlQuYnJfYmxvY2tjb3VudCArCi0JCQlQUkVWLmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfUklHSFRfQ09OVElHOgpAQCAtMTQyMiwxMCArMTM1MCw2IEBACiAJCQkJbmV3ZXh0KSkpCiAJCQkJZ290byBkb25lOwogCQl9Ci0JCS8qIERFTFRBOiBUd28gaW4tY29yZSBleHRlbnRzIGFyZSByZXBsYWNlZCBieSBvbmUuICovCi0JCXRlbXAgPSBQUkVWLmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IFBSRVYuYnJfYmxvY2tjb3VudCArCi0JCQlSSUdIVC5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX1JJR0hUX0ZJTExJTkc6CkBAIC0xNDUzLDkgKzEzNzcsNiBAQAogCQkJCW5ld2V4dCkpKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQkvKiBERUxUQTogVGhlIGluLWNvcmUgZXh0ZW50IGRlc2NyaWJlZCBieSBuZXcgY2hhbmdlZCB0eXBlLiAqLwotCQl0ZW1wID0gbmV3LT5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBuZXctPmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfTEVGVF9DT05USUc6CkBAIC0xNTAxLDEwICsxNDIyLDYgQEAKIAkJCQlMRUZULmJyX3N0YXRlKSkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJLyogREVMVEE6IFRoZSBib3VuZGFyeSBiZXR3ZWVuIHR3byBpbi1jb3JlIGV4dGVudHMgbW92ZWQuICovCi0JCXRlbXAgPSBMRUZULmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IExFRlQuYnJfYmxvY2tjb3VudCArCi0JCQlQUkVWLmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORzoKQEAgLTE1NDQsOSArMTQ2MSw2IEBACiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJfQotCQkvKiBERUxUQTogT25lIGluLWNvcmUgZXh0ZW50IGlzIHNwbGl0IGluIHR3by4gKi8KLQkJdGVtcCA9IFBSRVYuYnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gUFJFVi5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9SSUdIVF9GSUxMSU5HIHwgQk1BUF9SSUdIVF9DT05USUc6CkBAIC0xNTg3LDEwICsxNTAxLDYgQEAKIAkJCQluZXdleHQpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJLyogREVMVEE6IFRoZSBib3VuZGFyeSBiZXR3ZWVuIHR3byBpbi1jb3JlIGV4dGVudHMgbW92ZWQuICovCi0JCXRlbXAgPSBQUkVWLmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IFBSRVYuYnJfYmxvY2tjb3VudCArCi0JCQlSSUdIVC5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9SSUdIVF9GSUxMSU5HOgpAQCAtMTYzMCw5ICsxNTQwLDYgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9Ci0JCS8qIERFTFRBOiBPbmUgaW4tY29yZSBleHRlbnQgaXMgc3BsaXQgaW4gdHdvLiAqLwotCQl0ZW1wID0gUFJFVi5icl9zdGFydG9mZjsKLQkJdGVtcDIgPSBQUkVWLmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSAwOgpAQCAtMTY5Miw5ICsxNTk5LDYgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9Ci0JCS8qIERFTFRBOiBPbmUgaW4tY29yZSBleHRlbnQgaXMgc3BsaXQgaW4gdGhyZWUuICovCi0JCXRlbXAgPSBQUkVWLmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IFBSRVYuYnJfYmxvY2tjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIEJNQVBfTEVGVF9GSUxMSU5HIHwgQk1BUF9MRUZUX0NPTlRJRyB8IEJNQVBfUklHSFRfQ09OVElHOgpAQCAtMTcxMCwxMyArMTYxNCw2IEBACiAJCUFTU0VSVCgwKTsKIAl9CiAJKmN1cnAgPSBjdXI7Ci0JaWYgKGRlbHRhKSB7Ci0JCXRlbXAyICs9IHRlbXA7Ci0JCWlmIChkZWx0YS0+eGVkX3N0YXJ0b2ZmID4gdGVtcCkKLQkJCWRlbHRhLT54ZWRfc3RhcnRvZmYgPSB0ZW1wOwotCQlpZiAoZGVsdGEtPnhlZF9ibG9ja2NvdW50IDwgdGVtcDIpCi0JCQlkZWx0YS0+eGVkX2Jsb2NrY291bnQgPSB0ZW1wMjsKLQl9CiBkb25lOgogCSpsb2dmbGFnc3AgPSBydmFsOwogCXJldHVybiBlcnJvcjsKQEAgLTE3MzYsNyArMTYzMyw2IEBACiAJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLwogCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhLCAvKiBDaGFuZ2UgbWFkZSB0byBpbmNvcmUgZXh0ZW50cyAqLwogCWludAkJCXJzdmQpCQkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KIHsKIAl4ZnNfYm1idF9yZWNfaG9zdF90CSplcDsJLyogZXh0ZW50IHJlY29yZCBmb3IgaWR4ICovCkBAIC0xNzQ3LDcgKzE2NDMsNiBAQAogCXhmc19ibWJ0X2lyZWNfdAkJcmlnaHQ7CS8qIHJpZ2h0IG5laWdoYm9yIGV4dGVudCBlbnRyeSAqLwogCWludAkJCXN0YXRlOyAgLyogc3RhdGUgYml0cywgYWNjZXNzZWQgdGhydSBtYWNyb3MgKi8KIAl4ZnNfZmlsYmxrc190CQl0ZW1wPTA7CS8qIHRlbXAgZm9yIGluZGlyZWN0IGNhbGN1bGF0aW9ucyAqLwotCXhmc19maWxibGtzX3QJCXRlbXAyPTA7CiAKIAlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCBYRlNfREFUQV9GT1JLKTsKIAllcCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBpZHgpOwpAQCAtMTgxOSw5ICsxNzE0LDYgQEAKIAogCQl4ZnNfaWV4dF9yZW1vdmUoaXAsIGlkeCwgMSwgc3RhdGUpOwogCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOwotCQkvKiBERUxUQTogVHdvIGluLWNvcmUgZXh0ZW50cyB3ZXJlIHJlcGxhY2VkIGJ5IG9uZS4gKi8KLQkJdGVtcDIgPSB0ZW1wOwotCQl0ZW1wID0gbGVmdC5icl9zdGFydG9mZjsKIAkJYnJlYWs7CiAKIAljYXNlIEJNQVBfTEVGVF9DT05USUc6CkBAIC0xODQxLDkgKzE3MzMsNiBAQAogCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgaWR4IC0gMSwgc3RhdGUsIF9USElTX0lQXyk7CiAKIAkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4IC0gMTsKLQkJLyogREVMVEE6IE9uZSBpbi1jb3JlIGV4dGVudCBncmV3IGludG8gYSBob2xlLiAqLwotCQl0ZW1wMiA9IHRlbXA7Ci0JCXRlbXAgPSBsZWZ0LmJyX3N0YXJ0b2ZmOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9SSUdIVF9DT05USUc6CkBAIC0xODYyLDkgKzE3NTEsNiBAQAogCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAogCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHg7Ci0JCS8qIERFTFRBOiBPbmUgaW4tY29yZSBleHRlbnQgZ3JldyBpbnRvIGEgaG9sZS4gKi8KLQkJdGVtcDIgPSB0ZW1wOwotCQl0ZW1wID0gbmV3LT5icl9zdGFydG9mZjsKIAkJYnJlYWs7CiAKIAljYXNlIDA6CkBAIC0xODc2LDkgKzE3NjIsNiBAQAogCQlvbGRsZW4gPSBuZXdsZW4gPSAwOwogCQl4ZnNfaWV4dF9pbnNlcnQoaXAsIGlkeCwgMSwgbmV3LCBzdGF0ZSk7CiAJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKLQkJLyogREVMVEE6IEEgbmV3IGluLWNvcmUgZXh0ZW50IHdhcyBhZGRlZCBpbiBhIGhvbGUuICovCi0JCXRlbXAyID0gbmV3LT5icl9ibG9ja2NvdW50OwotCQl0ZW1wID0gbmV3LT5icl9zdGFydG9mZjsKIAkJYnJlYWs7CiAJfQogCWlmIChvbGRsZW4gIT0gbmV3bGVuKSB7CkBAIC0xODg5LDEzICsxNzcyLDYgQEAKIAkJICogTm90aGluZyB0byBkbyBmb3IgZGlzayBxdW90YSBhY2NvdW50aW5nIGhlcmUuCiAJCSAqLwogCX0KLQlpZiAoZGVsdGEpIHsKLQkJdGVtcDIgKz0gdGVtcDsKLQkJaWYgKGRlbHRhLT54ZWRfc3RhcnRvZmYgPiB0ZW1wKQotCQkJZGVsdGEtPnhlZF9zdGFydG9mZiA9IHRlbXA7Ci0JCWlmIChkZWx0YS0+eGVkX2Jsb2NrY291bnQgPCB0ZW1wMikKLQkJCWRlbHRhLT54ZWRfYmxvY2tjb3VudCA9IHRlbXAyOwotCX0KIAkqbG9nZmxhZ3NwID0gMDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MTEsNyArMTc4Nyw2IEBACiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLwogCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhLCAvKiBDaGFuZ2UgbWFkZSB0byBpbmNvcmUgZXh0ZW50cyAqLwogCWludAkJCXdoaWNoZm9yaykgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIHsKIAl4ZnNfYm1idF9yZWNfaG9zdF90CSplcDsJLyogcG9pbnRlciB0byBleHRlbnQgZW50cnkgaW5zLiBwb2ludCAqLwpAQCAtMTkyMiw4ICsxNzk3LDYgQEAKIAl4ZnNfYm1idF9pcmVjX3QJCXJpZ2h0OwkvKiByaWdodCBuZWlnaGJvciBleHRlbnQgZW50cnkgKi8KIAlpbnQJCQlydmFsPTA7CS8qIHJldHVybiB2YWx1ZSAobG9nZ2luZyBmbGFncykgKi8KIAlpbnQJCQlzdGF0ZTsJLyogc3RhdGUgYml0cywgYWNjZXNzZWQgdGhydSBtYWNyb3MgKi8KLQl4ZnNfZmlsYmxrc190CQl0ZW1wPTA7Ci0JeGZzX2ZpbGJsa3NfdAkJdGVtcDI9MDsKIAogCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CiAJQVNTRVJUKGlkeCA8PSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CkBAIC0yMDIwLDExICsxODkzLDYgQEAKIAkJCQkJbGVmdC5icl9zdGF0ZSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQkvKiBERUxUQTogVHdvIGluLWNvcmUgZXh0ZW50cyB3ZXJlIHJlcGxhY2VkIGJ5IG9uZS4gKi8KLQkJdGVtcCA9IGxlZnQuYnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gbGVmdC5icl9ibG9ja2NvdW50ICsKLQkJCW5ldy0+YnJfYmxvY2tjb3VudCArCi0JCQlyaWdodC5icl9ibG9ja2NvdW50OwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0NPTlRJRzoKQEAgLTIwNTYsMTAgKzE5MjQsNiBAQAogCQkJCQlsZWZ0LmJyX3N0YXRlKSkpCiAJCQkJZ290byBkb25lOwogCQl9Ci0JCS8qIERFTFRBOiBPbmUgaW4tY29yZSBleHRlbnQgZ3Jldy4gKi8KLQkJdGVtcCA9IGxlZnQuYnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gbGVmdC5icl9ibG9ja2NvdW50ICsKLQkJCW5ldy0+YnJfYmxvY2tjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIEJNQVBfUklHSFRfQ09OVElHOgpAQCAtMjA5MiwxMCArMTk1Niw2IEBACiAJCQkJCXJpZ2h0LmJyX3N0YXRlKSkpCiAJCQkJZ290byBkb25lOwogCQl9Ci0JCS8qIERFTFRBOiBPbmUgaW4tY29yZSBleHRlbnQgZ3Jldy4gKi8KLQkJdGVtcCA9IG5ldy0+YnJfc3RhcnRvZmY7Ci0JCXRlbXAyID0gbmV3LT5icl9ibG9ja2NvdW50ICsKLQkJCXJpZ2h0LmJyX2Jsb2NrY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSAwOgpAQCAtMjEyMywxOCArMTk4Myw4IEBACiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJfQotCQkvKiBERUxUQTogQSBuZXcgZXh0ZW50IHdhcyBhZGRlZCBpbiBhIGhvbGUuICovCi0JCXRlbXAgPSBuZXctPmJyX3N0YXJ0b2ZmOwotCQl0ZW1wMiA9IG5ldy0+YnJfYmxvY2tjb3VudDsKIAkJYnJlYWs7CiAJfQotCWlmIChkZWx0YSkgewotCQl0ZW1wMiArPSB0ZW1wOwotCQlpZiAoZGVsdGEtPnhlZF9zdGFydG9mZiA+IHRlbXApCi0JCQlkZWx0YS0+eGVkX3N0YXJ0b2ZmID0gdGVtcDsKLQkJaWYgKGRlbHRhLT54ZWRfYmxvY2tjb3VudCA8IHRlbXAyKQotCQkJZGVsdGEtPnhlZF9ibG9ja2NvdW50ID0gdGVtcDI7Ci0JfQogZG9uZToKIAkqbG9nZmxhZ3NwID0gcnZhbDsKIAlyZXR1cm4gZXJyb3I7CkBAIC0yOTU5LDcgKzI4MDksNiBAQAogCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaWYgbnVsbCwgbm90IGEgYnRyZWUgKi8KIAl4ZnNfYm1idF9pcmVjX3QJCSpkZWwsCS8qIGRhdGEgdG8gcmVtb3ZlIGZyb20gZXh0ZW50cyAqLwogCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhLCAvKiBDaGFuZ2UgbWFkZSB0byBpbmNvcmUgZXh0ZW50cyAqLwogCWludAkJCXdoaWNoZm9yaywgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIAlpbnQJCQlyc3ZkKQkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KIHsKQEAgLTMyNjUsMTQgKzMxMTQsNiBAQAogCWlmIChkYV9vbGQgPiBkYV9uZXcpCiAJCXhmc19tb2RfaW5jb3JlX3NiKG1wLCBYRlNfU0JTX0ZEQkxPQ0tTLCAoaW50NjRfdCkoZGFfb2xkIC0gZGFfbmV3KSwKIAkJCXJzdmQpOwotCWlmIChkZWx0YSkgewotCQkvKiBERUxUQTogcmVwb3J0IHRoZSBvcmlnaW5hbCBleHRlbnQuICovCi0JCWlmIChkZWx0YS0+eGVkX3N0YXJ0b2ZmID4gZ290LmJyX3N0YXJ0b2ZmKQotCQkJZGVsdGEtPnhlZF9zdGFydG9mZiA9IGdvdC5icl9zdGFydG9mZjsKLQkJaWYgKGRlbHRhLT54ZWRfYmxvY2tjb3VudCA8IGdvdC5icl9zdGFydG9mZitnb3QuYnJfYmxvY2tjb3VudCkKLQkJCWRlbHRhLT54ZWRfYmxvY2tjb3VudCA9IGdvdC5icl9zdGFydG9mZiArCi0JCQkJCQkJZ290LmJyX2Jsb2NrY291bnQ7Ci0JfQogZG9uZToKIAkqbG9nZmxhZ3NwID0gZmxhZ3M7CiAJcmV0dXJuIGVycm9yOwpAQCAtMzc1NCw5ICszNTk1LDEwIEBACiAJCWlwLT5pX2QuZGlfYWZvcm1hdCA9IFhGU19ESU5PREVfRk1UX0VYVEVOVFM7CiAJfQogCUFTU0VSVChpcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKTsKLQlJSE9MRChpcCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisKIAlzd2l0Y2ggKGlwLT5pX2QuZGlfZm9ybWF0KSB7CiAJY2FzZSBYRlNfRElOT0RFX0ZNVF9ERVY6CiAJCWlwLT5pX2QuZGlfZm9ya29mZiA9IHJvdW5kdXAoc2l6ZW9mKHhmc19kZXZfdCksIDgpID4+IDM7CkBAIC00NDgzLDggKzQzMjUsNyBAQAogCXhmc19leHRsZW5fdAl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KIAl4ZnNfYm1idF9pcmVjX3QJKm12YWwsCQkvKiBvdXRwdXQ6IG1hcCB2YWx1ZXMgKi8KIAlpbnQJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJKmZsaXN0LAkJLyogaS9vOiBsaXN0IGV4dGVudHMgdG8gZnJlZSAqLwotCXhmc19leHRkZWx0YV90CSpkZWx0YSkJCS8qIG86IGNoYW5nZSBtYWRlIHRvIGluY29yZSBleHRlbnRzICovCisJeGZzX2JtYXBfZnJlZV90CSpmbGlzdCkJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KIHsKIAl4ZnNfZnNibG9ja190CWFibm87CQkvKiBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyICovCiAJeGZzX2V4dGxlbl90CWFsZW47CQkvKiBhbGxvY2F0ZWQgZXh0ZW50IGxlbmd0aCAqLwpAQCAtNDU5NiwxMCArNDQzNyw3IEBACiAJZW5kID0gYm5vICsgbGVuOwogCW9ibm8gPSBibm87CiAJYm1hLmlwID0gTlVMTDsKLQlpZiAoZGVsdGEpIHsKLQkJZGVsdGEtPnhlZF9zdGFydG9mZiA9IE5VTExGSUxFT0ZGOwotCQlkZWx0YS0+eGVkX2Jsb2NrY291bnQgPSAwOwotCX0KKwogCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7CiAJCS8qCiAJCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKQEAgLTQ2MjAsMTkgKzQ0NTgsMTMgQEAKIAkJCSAqIGFsbG9jYXRlIHRoZSBzdHVmZiBhc2tlZCBmb3IgaW4gdGhpcyBibWFwIGNhbGwKIAkJCSAqIGJ1dCB0aGF0IHdvdWxkbid0IGJlIGFzIGdvb2QuCiAJCQkgKi8KLQkJCWlmICh3YXNkZWxheSAmJiAhKGZsYWdzICYgWEZTX0JNQVBJX0VYQUNUKSkgeworCQkJaWYgKHdhc2RlbGF5KSB7CiAJCQkJYWxlbiA9ICh4ZnNfZXh0bGVuX3QpZ290LmJyX2Jsb2NrY291bnQ7CiAJCQkJYW9mZiA9IGdvdC5icl9zdGFydG9mZjsKIAkJCQlpZiAobGFzdHggIT0gTlVMTEVYVE5VTSAmJiBsYXN0eCkgewogCQkJCQllcCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBsYXN0eCAtIDEpOwogCQkJCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmcHJldik7CiAJCQkJfQotCQkJfSBlbHNlIGlmICh3YXNkZWxheSkgewotCQkJCWFsZW4gPSAoeGZzX2V4dGxlbl90KQotCQkJCQlYRlNfRklMQkxLU19NSU4obGVuLAotCQkJCQkJKGdvdC5icl9zdGFydG9mZiArCi0JCQkJCQkgZ290LmJyX2Jsb2NrY291bnQpIC0gYm5vKTsKLQkJCQlhb2ZmID0gYm5vOwogCQkJfSBlbHNlIHsKIAkJCQlhbGVuID0gKHhmc19leHRsZW5fdCkKIAkJCQkJWEZTX0ZJTEJMS1NfTUlOKGxlbiwgTUFYRVhUTEVOKTsKQEAgLTQ4MzEsNyArNDY2Myw3IEBACiAJCQkJCWdvdC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOwogCQkJfQogCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KGlwLCBsYXN0eCwgJmN1ciwgJmdvdCwKLQkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJnRtcF9sb2dmbGFncywgZGVsdGEsCisJCQkJZmlyc3RibG9jaywgZmxpc3QsICZ0bXBfbG9nZmxhZ3MsCiAJCQkJd2hpY2hmb3JrLCAoZmxhZ3MgJiBYRlNfQk1BUElfUlNWQkxPQ0tTKSk7CiAJCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CiAJCQlpZiAoZXJyb3IpCkBAIC00OTI3LDcgKzQ3NTksNyBAQAogCQkJfQogCQkJbXZhbC0+YnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CiAJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsIGxhc3R4LCAmY3VyLCBtdmFsLAotCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmdG1wX2xvZ2ZsYWdzLCBkZWx0YSwKKwkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJnRtcF9sb2dmbGFncywKIAkJCQl3aGljaGZvcmssIChmbGFncyAmIFhGU19CTUFQSV9SU1ZCTE9DS1MpKTsKIAkJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKIAkJCWlmIChlcnJvcikKQEAgLTUwMTcsMTQgKzQ4NDksNiBAQAogCUFTU0VSVChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFIHx8CiAJICAgICAgIFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+IGlmcC0+aWZfZXh0X21heCk7CiAJZXJyb3IgPSAwOwotCWlmIChkZWx0YSAmJiBkZWx0YS0+eGVkX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGKSB7Ci0JCS8qIEEgY2hhbmdlIHdhcyBhY3R1YWxseSBtYWRlLgotCQkgKiBOb3RlIHRoYXQgZGVsdGEtPnhlZF9ibG9ja291bnQgaXMgYW4gb2Zmc2V0IGF0IHRoaXMKLQkJICogcG9pbnQgYW5kIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhIGJsb2NrIGNvdW50LgotCQkgKi8KLQkJQVNTRVJUKGRlbHRhLT54ZWRfYmxvY2tjb3VudCA+IGRlbHRhLT54ZWRfc3RhcnRvZmYpOwotCQlkZWx0YS0+eGVkX2Jsb2NrY291bnQgLT0gZGVsdGEtPnhlZF9zdGFydG9mZjsKLQl9CiBlcnJvcjA6CiAJLyoKIAkgKiBMb2cgZXZlcnl0aGluZy4gIERvIHRoaXMgYWZ0ZXIgY29udmVyc2lvbiwgdGhlcmUncyBubyBwb2ludCBpbgpAQCAtNTEzNiw4ICs0OTYwLDYgQEAKIAl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYWxsb2NhdGVkIGJsb2NrCiAJCQkJCQkgICBjb250cm9scyBhLmcuIGZvciBhbGxvY3MgKi8KIAl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhLAkJLyogbzogY2hhbmdlIG1hZGUgdG8gaW5jb3JlCi0JCQkJCQkgICBleHRlbnRzICovCiAJaW50CQkJKmRvbmUpCQkvKiBzZXQgaWYgbm90IGRvbmUgeWV0ICovCiB7CiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KQEAgLTUxOTYsMTAgKzUwMTgsNyBAQAogCWJubyA9IHN0YXJ0ICsgbGVuIC0gMTsKIAllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LAogCQkmcHJldik7Ci0JaWYgKGRlbHRhKSB7Ci0JCWRlbHRhLT54ZWRfc3RhcnRvZmYgPSBOVUxMRklMRU9GRjsKLQkJZGVsdGEtPnhlZF9ibG9ja2NvdW50ID0gMDsKLQl9CisKIAkvKgogCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYmxvY2sgbnVtYmVyIGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUKIAkgKiBmaWxlLCBiYWNrIHVwIHRvIHRoZSBsYXN0IGJsb2NrIGlmIHNvLi4uCkBAIC01Mjk3LDcgKzUxMTYsNyBAQAogCQkJfQogCQkJZGVsLmJyX3N0YXRlID0gWEZTX0VYVF9VTldSSVRURU47CiAJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsIGxhc3R4LCAmY3VyLCAmZGVsLAotCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsIGRlbHRhLAorCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsCiAJCQkJWEZTX0RBVEFfRk9SSywgMCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBlcnJvcjA7CkBAIC01MzUyLDcgKzUxNzEsNyBAQAogCQkJCXByZXYuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKIAkJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsIGxhc3R4IC0gMSwgJmN1ciwKIAkJCQkJJnByZXYsIGZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsCi0JCQkJCWRlbHRhLCBYRlNfREFUQV9GT1JLLCAwKTsKKwkJCQkJWEZTX0RBVEFfRk9SSywgMCk7CiAJCQkJaWYgKGVycm9yKQogCQkJCQlnb3RvIGVycm9yMDsKIAkJCQlnb3RvIG5vZGVsZXRlOwpAQCAtNTM2MSw3ICs1MTgwLDcgQEAKIAkJCQlkZWwuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKIAkJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsIGxhc3R4LCAmY3VyLAogCQkJCQkmZGVsLCBmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzLAotCQkJCQlkZWx0YSwgWEZTX0RBVEFfRk9SSywgMCk7CisJCQkJCVhGU19EQVRBX0ZPUkssIDApOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBlcnJvcjA7CiAJCQkJZ290byBub2RlbGV0ZTsKQEAgLTU0MTQsNyArNTIzMyw3IEBACiAJCQlnb3RvIGVycm9yMDsKIAkJfQogCQllcnJvciA9IHhmc19ibWFwX2RlbF9leHRlbnQoaXAsIHRwLCBsYXN0eCwgZmxpc3QsIGN1ciwgJmRlbCwKLQkJCQkmdG1wX2xvZ2ZsYWdzLCBkZWx0YSwgd2hpY2hmb3JrLCByc3ZkKTsKKwkJCQkmdG1wX2xvZ2ZsYWdzLCB3aGljaGZvcmssIHJzdmQpOwogCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwpAQCAtNTQ3MSwxNCArNTI5MCw2IEBACiAJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQogCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOwogCWVycm9yID0gMDsKLQlpZiAoZGVsdGEgJiYgZGVsdGEtPnhlZF9zdGFydG9mZiAhPSBOVUxMRklMRU9GRikgewotCQkvKiBBIGNoYW5nZSB3YXMgYWN0dWFsbHkgbWFkZS4KLQkJICogTm90ZSB0aGF0IGRlbHRhLT54ZWRfYmxvY2tvdW50IGlzIGFuIG9mZnNldCBhdCB0aGlzCi0JCSAqIHBvaW50IGFuZCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBibG9jayBjb3VudC4KLQkJICovCi0JCUFTU0VSVChkZWx0YS0+eGVkX2Jsb2NrY291bnQgPiBkZWx0YS0+eGVkX3N0YXJ0b2ZmKTsKLQkJZGVsdGEtPnhlZF9ibG9ja2NvdW50IC09IGRlbHRhLT54ZWRfc3RhcnRvZmY7Ci0JfQogZXJyb3IwOgogCS8qCiAJICogTG9nIGV2ZXJ5dGhpbmcuICBEbyB0aGlzIGFmdGVyIGNvbnZlcnNpb24sIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KQEAgLTU2MDUsMjggKzU0MTYsNiBAQAogCQlwcmVhbGxvY2VkID0gMDsKIAkJZml4bGVuID0gMUxMIDw8IDMyOwogCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBCTVZfSUZfTk9fRE1BUElfUkVBRCBpbnRlcmZhY2UgYml0IHNwZWNpZmllZCwgZG8KLQkJICogbm90IGdlbmVyYXRlIGEgRE1BUEkgcmVhZCBldmVudC4gIE90aGVyd2lzZSwgaWYgdGhlCi0JCSAqIERNX0VWRU5UX1JFQUQgYml0IGlzIHNldCBmb3IgdGhlIGZpbGUsIGdlbmVyYXRlIGEgcmVhZAotCQkgKiBldmVudCBpbiBvcmRlciB0aGF0IHRoZSBETUFQSSBhcHBsaWNhdGlvbiBtYXkgZG8gaXRzIHRoaW5nCi0JCSAqIGJlZm9yZSB3ZSByZXR1cm4gdGhlIGV4dGVudHMuICBVc3VhbGx5IHRoaXMgbWVhbnMgcmVzdG9yaW5nCi0JCSAqIHVzZXIgZmlsZSBkYXRhIHRvIHJlZ2lvbnMgb2YgdGhlIGZpbGUgdGhhdCBsb29rIGxpa2UgaG9sZXMuCi0JCSAqCi0JCSAqIFRoZSAib2xkIGJlaGF2aW9yIiAoZnJvbSBYRlNfSU9DX0dFVEJNQVApIGlzIHRvIG5vdCBzcGVjaWZ5Ci0JCSAqIEJNVl9JRl9OT19ETUFQSV9SRUFEIHNvIHRoYXQgcmVhZCBldmVudHMgYXJlIGdlbmVyYXRlZC4KLQkJICogSWYgdGhpcyB3ZXJlIG5vdCB0cnVlLCBjYWxsZXJzIG9mIGlvY3RsKFhGU19JT0NfR0VUQk1BUCkKLQkJICogY291bGQgbWlzaW50ZXJwcmV0IGhvbGVzIGluIGEgRE1BUEkgZmlsZSBhcyB0cnVlIGhvbGVzLAotCQkgKiB3aGVuIGluIGZhY3QgdGhleSBtYXkgcmVwcmVzZW50IG9mZmxpbmUgdXNlciBkYXRhLgotCQkgKi8KLQkJaWYgKERNX0VWRU5UX0VOQUJMRUQoaXAsIERNX0VWRU5UX1JFQUQpICYmCi0JCSAgICAhKGlmbGFncyAmIEJNVl9JRl9OT19ETUFQSV9SRUFEKSkgewotCQkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9SRUFELCBpcCwKLQkJCQkJICAgICAgMCwgMCwgMCwgTlVMTCk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7Ci0JCX0KLQogCQlpZiAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgogCQkgICAgaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKIAkJICAgIGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKQpAQCAtNTcxMyw3ICs1NTAyLDcgQEAKIAkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIFhGU19CQl9UT19GU0JUKG1wLCBibXYtPmJtdl9vZmZzZXQpLAogCQkJCSAgWEZTX0JCX1RPX0ZTQihtcCwgYm12LT5ibXZfbGVuZ3RoKSwKIAkJCQkgIGJtYXBpX2ZsYWdzLCBOVUxMLCAwLCBtYXAsICZubWFwLAotCQkJCSAgTlVMTCwgTlVMTCk7CisJCQkJICBOVUxMKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfZnJlZV9tYXA7CiAJCUFTU0VSVChubWFwIDw9IHN1Ym5leCk7CkBAIC01ODU5LDY2ICs1NjQ4LDM0IEBACiB9CiAKICNpZmRlZiBERUJVRwotU1RBVElDCi14ZnNfYnVmX3QgKgorU1RBVElDIHN0cnVjdCB4ZnNfYnVmICoKIHhmc19ibWFwX2dldF9icCgKLQl4ZnNfYnRyZWVfY3VyX3QgICAgICAgICAqY3VyLAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCiAJeGZzX2ZzYmxvY2tfdAkJYm5vKQogewotCWludCBpOwotCXhmc19idWZfdCAqYnA7CisJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICpsaWRwOworCWludAkJCWk7CiAKIAlpZiAoIWN1cikKLQkJcmV0dXJuKE5VTEwpOworCQlyZXR1cm4gTlVMTDsKIAotCWJwID0gTlVMTDsKLQlmb3IoaSA9IDA7IGkgPCBYRlNfQlRSRUVfTUFYTEVWRUxTOyBpKyspIHsKLQkJYnAgPSBjdXItPmJjX2J1ZnNbaV07Ci0JCWlmICghYnApIGJyZWFrOwotCQlpZiAoWEZTX0JVRl9BRERSKGJwKSA9PSBibm8pCi0JCQlicmVhazsJLyogRm91bmQgaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgWEZTX0JUUkVFX01BWExFVkVMUzsgaSsrKSB7CisJCWlmICghY3VyLT5iY19idWZzW2ldKQorCQkJYnJlYWs7CisJCWlmIChYRlNfQlVGX0FERFIoY3VyLT5iY19idWZzW2ldKSA9PSBibm8pCisJCQlyZXR1cm4gY3VyLT5iY19idWZzW2ldOwogCX0KLQlpZiAoaSA9PSBYRlNfQlRSRUVfTUFYTEVWRUxTKQotCQlicCA9IE5VTEw7CiAKLQlpZiAoIWJwKSB7IC8qIENoYXNlIGRvd24gYWxsIHRoZSBsb2cgaXRlbXMgdG8gc2VlIGlmIHRoZSBicCBpcyB0aGVyZSAqLwotCQl4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAgICAqbGljcDsKLQkJeGZzX3RyYW5zX3QJCSp0cDsKLQotCQl0cCA9IGN1ci0+YmNfdHA7Ci0JCWxpY3AgPSAmdHAtPnRfaXRlbXM7Ci0JCXdoaWxlICghYnAgJiYgbGljcCAhPSBOVUxMKSB7Ci0JCQlpZiAoeGZzX2xpY19hcmVfYWxsX2ZyZWUobGljcCkpIHsKLQkJCQlsaWNwID0gbGljcC0+bGljX25leHQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrKSB7Ci0JCQkJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKLQkJCQl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKLQkJCQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKLQkJCQl4ZnNfYnVmX3QJCSpsYnA7Ci0KLQkJCQlpZiAoeGZzX2xpY19pc2ZyZWUobGljcCwgaSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbGlkcCA9IHhmc19saWNfc2xvdChsaWNwLCBpKTsKLQkJCQlsaXAgPSBsaWRwLT5saWRfaXRlbTsKLQkJCQlpZiAobGlwLT5saV90eXBlICE9IFhGU19MSV9CVUYpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJYmlwID0gKHhmc19idWZfbG9nX2l0ZW1fdCAqKWxpcDsKLQkJCQlsYnAgPSBiaXAtPmJsaV9idWY7Ci0KLQkJCQlpZiAoWEZTX0JVRl9BRERSKGxicCkgPT0gYm5vKSB7Ci0JCQkJCWJwID0gbGJwOwotCQkJCQlicmVhazsgLyogRm91bmQgaXQgKi8KLQkJCQl9Ci0JCQl9Ci0JCQlsaWNwID0gbGljcC0+bGljX25leHQ7Ci0JCX0KKwkvKiBDaGFzZSBkb3duIGFsbCB0aGUgbG9nIGl0ZW1zIHRvIHNlZSBpZiB0aGUgYnAgaXMgdGhlcmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpZHAsICZjdXItPmJjX3RwLT50X2l0ZW1zLCBsaWRfdHJhbnMpIHsKKwkJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJpcDsKKwkJYmlwID0gKHN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtICopbGlkcC0+bGlkX2l0ZW07CisJCWlmIChiaXAtPmJsaV9pdGVtLmxpX3R5cGUgPT0gWEZTX0xJX0JVRiAmJgorCQkgICAgWEZTX0JVRl9BRERSKGJpcC0+YmxpX2J1ZikgPT0gYm5vKQorCQkJcmV0dXJuIGJpcC0+YmxpX2J1ZjsKIAl9Ci0JcmV0dXJuKGJwKTsKKworCXJldHVybiBOVUxMOwogfQogCiBTVEFUSUMgdm9pZApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmggYi9mcy94ZnMveGZzX2JtYXAuaAppbmRleCA0MTlkYWZiLi5iMTM1NjlhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuaAorKysgYi9mcy94ZnMveGZzX2JtYXAuaApAQCAtMjgsMjAgKzI4LDYgQEAKIGV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2JtYXBfZnJlZV9pdGVtX3pvbmU7CiAKIC8qCi0gKiBERUxUQTogZGVzY3JpYmUgYSBjaGFuZ2UgdG8gdGhlIGluLWNvcmUgZXh0ZW50IGxpc3QuCi0gKgotICogSW50ZXJuYWxseSB0aGUgdXNlIG9mIHhlZF9ibG9ja291bnQgaXMgc29tZXdoYXQgZnVua3kuCi0gKiB4ZWRfYmxvY2tjb3VudCBjb250YWlucyBhbiBvZmZzZXQgbXVjaCBvZiB0aGUgdGltZSBiZWNhdXNlIHRoaXMKLSAqIG1ha2VzIG1lcmdpbmcgY2hhbmdlcyBlYXNpZXIuICAoeGZzX2ZpbGVvZmZfdCBhbmQgeGZzX2ZpbGJsa3NfdCBhcmUKLSAqIHRoZSBzYW1lIHVuZGVybHlpbmcgdHlwZSkuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19leHRkZWx0YQotewotCXhmc19maWxlb2ZmX3QJCXhlZF9zdGFydG9mZjsJLyogb2Zmc2V0IG9mIHJhbmdlICovCi0JeGZzX2ZpbGJsa3NfdAkJeGVkX2Jsb2NrY291bnQ7CS8qIGJsb2NrcyBpbiByYW5nZSAqLwotfSB4ZnNfZXh0ZGVsdGFfdDsKLQotLyoKICAqIExpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlICJsYXRlciIuCiAgKiBUaGUgbGlzdCBpcyBrZXB0IHNvcnRlZCBvbiB4YmZfc3RhcnRibG9jay4KICAqLwpAQCAtODIsMTYgKzY4LDEzIEBACiAjZGVmaW5lIFhGU19CTUFQSV9ERUxBWQkJMHgwMDIJLyogZGVsYXllZCB3cml0ZSBvcGVyYXRpb24gKi8KICNkZWZpbmUgWEZTX0JNQVBJX0VOVElSRQkweDAwNAkvKiByZXR1cm4gZW50aXJlIGV4dGVudCwgbm90IHRyaW1tZWQgKi8KICNkZWZpbmUgWEZTX0JNQVBJX01FVEFEQVRBCTB4MDA4CS8qIG1hcHBpbmcgbWV0YWRhdGEgbm90IHVzZXIgZGF0YSAqLwotI2RlZmluZSBYRlNfQk1BUElfRVhBQ1QJCTB4MDEwCS8qIGFsbG9jYXRlIG9ubHkgdG8gc3BlYydkIGJvdW5kcyAqLwotI2RlZmluZSBYRlNfQk1BUElfQVRUUkZPUksJMHgwMjAJLyogdXNlIGF0dHJpYnV0ZSBmb3JrIG5vdCBkYXRhICovCi0jZGVmaW5lIFhGU19CTUFQSV9BU1lOQwkJMHgwNDAJLyogYnVubWFwaSB4YWN0aW9ucyBjYW4gYmUgYXN5bmMgKi8KLSNkZWZpbmUgWEZTX0JNQVBJX1JTVkJMT0NLUwkweDA4MAkvKiBPSyB0byBhbGxvYy4gcmVzZXJ2ZWQgZGF0YSBibG9ja3MgKi8KLSNkZWZpbmUJWEZTX0JNQVBJX1BSRUFMTE9DCTB4MTAwCS8qIHByZWFsbG9jYXRpb24gb3A6IHVud3JpdHRlbiBzcGFjZSAqLwotI2RlZmluZQlYRlNfQk1BUElfSUdTVEFURQkweDIwMAkvKiBJZ25vcmUgc3RhdGUgLSAqLworI2RlZmluZSBYRlNfQk1BUElfQVRUUkZPUksJMHgwMTAJLyogdXNlIGF0dHJpYnV0ZSBmb3JrIG5vdCBkYXRhICovCisjZGVmaW5lIFhGU19CTUFQSV9SU1ZCTE9DS1MJMHgwMjAJLyogT0sgdG8gYWxsb2MuIHJlc2VydmVkIGRhdGEgYmxvY2tzICovCisjZGVmaW5lCVhGU19CTUFQSV9QUkVBTExPQwkweDA0MAkvKiBwcmVhbGxvY2F0aW9uIG9wOiB1bndyaXR0ZW4gc3BhY2UgKi8KKyNkZWZpbmUJWEZTX0JNQVBJX0lHU1RBVEUJMHgwODAJLyogSWdub3JlIHN0YXRlIC0gKi8KIAkJCQkJLyogY29tYmluZSBjb250aWcuIHNwYWNlICovCi0jZGVmaW5lCVhGU19CTUFQSV9DT05USUcJMHg0MDAJLyogbXVzdCBhbGxvY2F0ZSBvbmx5IG9uZSBleHRlbnQgKi8KLS8qCVhGU19CTUFQSV9ESVJFQ1RfSU8JMHg4MDAJKi8KLSNkZWZpbmUgWEZTX0JNQVBJX0NPTlZFUlQJMHgxMDAwCS8qIHVud3JpdHRlbiBleHRlbnQgY29udmVyc2lvbiAtICovCisjZGVmaW5lCVhGU19CTUFQSV9DT05USUcJMHgxMDAJLyogbXVzdCBhbGxvY2F0ZSBvbmx5IG9uZSBleHRlbnQgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0NPTlZFUlQJMHgyMDAJLyogdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uIC0gKi8KIAkJCQkJLyogbmVlZCB3cml0ZSBjYWNoZSBmbHVzaGluZyBhbmQgbm8gKi8KIAkJCQkJLyogYWRkaXRpb25hbCBhbGxvY2F0aW9uIGFsaWdubWVudHMgKi8KIApAQCAtMTAwLDkgKzgzLDcgQEAKIAl7IFhGU19CTUFQSV9ERUxBWSwJIkRFTEFZIiB9LCBcCiAJeyBYRlNfQk1BUElfRU5USVJFLAkiRU5USVJFIiB9LCBcCiAJeyBYRlNfQk1BUElfTUVUQURBVEEsCSJNRVRBREFUQSIgfSwgXAotCXsgWEZTX0JNQVBJX0VYQUNULAkiRVhBQ1QiIH0sIFwKIAl7IFhGU19CTUFQSV9BVFRSRk9SSywJIkFUVFJGT1JLIiB9LCBcCi0JeyBYRlNfQk1BUElfQVNZTkMsCSJBU1lOQyIgfSwgXAogCXsgWEZTX0JNQVBJX1JTVkJMT0NLUywJIlJTVkJMT0NLUyIgfSwgXAogCXsgWEZTX0JNQVBJX1BSRUFMTE9DLAkiUFJFQUxMT0MiIH0sIFwKIAl7IFhGU19CTUFQSV9JR1NUQVRFLAkiSUdTVEFURSIgfSwgXApAQCAtMzEwLDkgKzI5MSw3IEBACiAJeGZzX2V4dGxlbl90CQl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLwogCWludAkJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQl4ZnNfZXh0ZGVsdGFfdAkJKmRlbHRhKTsJLyogbzogY2hhbmdlIG1hZGUgdG8gaW5jb3JlCi0JCQkJCQkgICBleHRlbnRzICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QpOwkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCiAKIC8qCiAgKiBNYXAgZmlsZSBibG9ja3MgdG8gZmlsZXN5c3RlbSBibG9ja3MsIHNpbXBsZSB2ZXJzaW9uLgpAQCAtMzQ2LDggKzMyNSw2IEBACiAJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jawogCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCiAJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCi0JeGZzX2V4dGRlbHRhX3QJCSpkZWx0YSwJCS8qIG86IGNoYW5nZSBtYWRlIHRvIGluY29yZQotCQkJCQkJICAgZXh0ZW50cyAqLwogCWludAkJCSpkb25lKTsJCS8qIHNldCBpZiBub3QgZG9uZSB5ZXQgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggNDE2ZTQ3ZS4uODdkM2MxMCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKQEAgLTI0LDIxICsyNCwxNiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYnRyZWUuYwppbmRleCA5NmJlNGIwLi44MjlhZjkyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19idHJlZS5jCkBAIC0yNCwyMCArMjQsMTUgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX3RyYWNlLmgiCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwppbmRleCAwMmE4MDk4Li4xYjA5ZDdhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKQEAgLTM0LDYgKzMzLDEyIEBACiAKIGttZW1fem9uZV90CSp4ZnNfYnVmX2l0ZW1fem9uZTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbSAqQlVGX0lURU0oc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwKQoreworCXJldHVybiBjb250YWluZXJfb2YobGlwLCBzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbSwgYmxpX2l0ZW0pOworfQorCisKICNpZmRlZiBYRlNfVFJBTlNfREVCVUcKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgYW4gYWx0ZXJuYXRlIHN0cmF0ZWd5IGZvciB0cmFja2luZyB0aGUgYnl0ZXMKQEAgLTE1MSwxMiArMTU2LDEzIEBACiAgKi8KIFNUQVRJQyB1aW50CiB4ZnNfYnVmX2l0ZW1fc2l6ZSgKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JdWludAkJbnZlY3M7Ci0JaW50CQluZXh0X2JpdDsKLQlpbnQJCWxhc3RfYml0OwotCXhmc19idWZfdAkqYnA7CisJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJpcCA9IEJVRl9JVEVNKGxpcCk7CisJc3RydWN0IHhmc19idWYJCSpicCA9IGJpcC0+YmxpX2J1ZjsKKwl1aW50CQkJbnZlY3M7CisJaW50CQkJbmV4dF9iaXQ7CisJaW50CQkJbGFzdF9iaXQ7CiAKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpIHsKQEAgLTE3MCw3ICsxNzYsNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlicCA9IGJpcC0+YmxpX2J1ZjsKIAlBU1NFUlQoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCk7CiAJbnZlY3MgPSAxOwogCWxhc3RfYml0ID0geGZzX25leHRfYml0KGJpcC0+YmxpX2Zvcm1hdC5ibGZfZGF0YV9tYXAsCkBAIC0yMTksMTMgKzIyNCwxMyBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX2J1Zl9pdGVtX2Zvcm1hdCgKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCwKLQl4ZnNfbG9nX2lvdmVjX3QJCSpsb2dfdmVjdG9yKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKKwlzdHJ1Y3QgeGZzX2xvZ19pb3ZlYwkqdmVjcCkKIHsKKwlzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbQkqYmlwID0gQlVGX0lURU0obGlwKTsKKwlzdHJ1Y3QgeGZzX2J1ZgkqYnAgPSBiaXAtPmJsaV9idWY7CiAJdWludAkJYmFzZV9zaXplOwogCXVpbnQJCW52ZWNzOwotCXhmc19sb2dfaW92ZWNfdAkqdmVjcDsKLQl4ZnNfYnVmX3QJKmJwOwogCWludAkJZmlyc3RfYml0OwogCWludAkJbGFzdF9iaXQ7CiAJaW50CQluZXh0X2JpdDsKQEAgLTIzNSw4ICsyNDAsNiBAQAogCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CiAJQVNTRVJUKChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKSB8fAogCSAgICAgICAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7Ci0JYnAgPSBiaXAtPmJsaV9idWY7Ci0JdmVjcCA9IGxvZ192ZWN0b3I7CiAKIAkvKgogCSAqIFRoZSBzaXplIG9mIHRoZSBiYXNlIHN0cnVjdHVyZSBpcyB0aGUgc2l6ZSBvZiB0aGUKQEAgLTI0OCw3ICsyNTEsNyBAQAogCWJhc2Vfc2l6ZSA9CiAJCSh1aW50KShzaXplb2YoeGZzX2J1Zl9sb2dfZm9ybWF0X3QpICsKIAkJICAgICAgICgoYmlwLT5ibGlfZm9ybWF0LmJsZl9tYXBfc2l6ZSAtIDEpICogc2l6ZW9mKHVpbnQpKSk7Ci0JdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZiaXAtPmJsaV9mb3JtYXQ7CisJdmVjcC0+aV9hZGRyID0gJmJpcC0+YmxpX2Zvcm1hdDsKIAl2ZWNwLT5pX2xlbiA9IGJhc2Vfc2l6ZTsKIAl2ZWNwLT5pX3R5cGUgPSBYTE9HX1JFR19UWVBFX0JGT1JNQVQ7CiAJdmVjcCsrOwpAQCAtMjYzLDcgKzI2Niw3IEBACiAJICovCiAJaWYgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9JTk9ERV9CVUYpIHsKIAkJaWYgKCEoKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9JTk9ERV9BTExPQ19CVUYpICYmCi0JCSAgICAgIHhmc19sb2dfaXRlbV9pbl9jdXJyZW50X2Noa3B0KCZiaXAtPmJsaV9pdGVtKSkpCisJCSAgICAgIHhmc19sb2dfaXRlbV9pbl9jdXJyZW50X2Noa3B0KGxpcCkpKQogCQkJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyB8PSBYRlNfQkxGX0lOT0RFX0JVRjsKIAkJYmlwLT5ibGlfZmxhZ3MgJj0gflhGU19CTElfSU5PREVfQlVGOwogCX0KQEAgLTM1Niw2NiArMzU5LDkwIEBACiAKIC8qCiAgKiBUaGlzIGlzIGNhbGxlZCB0byBwaW4gdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZiBsb2cgaXRlbSBpbiBtZW1vcnkKLSAqIHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIG91dC4gIFNpbXBseSBjYWxsIGJwaW4oKSBvbiB0aGUgYnVmZmVyIHRvIGRvIHRoaXMuCisgKiBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiBvdXQuCiAgKgogICogV2UgYWxzbyBhbHdheXMgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGxvZyBpdGVtIGhlcmUgc28gdGhhdCB0aGUgYmxpCiAgKiBpcyBoZWxkIHdoaWxlIHRoZSBpdGVtIGlzIHBpbm5lZCBpbiBtZW1vcnkuIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4KICAqIHVuY29uZGl0aW9uYWxseSBkcm9wIHRoZSByZWZlcmVuY2UgY291bnQgYSB0cmFuc2FjdGlvbiBob2xkcyB3aGVuIHRoZQogICogdHJhbnNhY3Rpb24gaXMgY29tcGxldGVkLgogICovCi0KIFNUQVRJQyB2b2lkCiB4ZnNfYnVmX2l0ZW1fcGluKAotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfYnVmX3QJKmJwOworCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBCVUZfSVRFTShsaXApOwogCi0JYnAgPSBiaXAtPmJsaV9idWY7Ci0JQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJpcC0+YmxpX2J1ZikpOwogCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CiAJQVNTRVJUKChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKSB8fAogCSAgICAgICAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7Ci0JYXRvbWljX2luYygmYmlwLT5ibGlfcmVmY291bnQpOwotCXRyYWNlX3hmc19idWZfaXRlbV9waW4oYmlwKTsKLQl4ZnNfYnBpbihicCk7Ci19CiAKKwl0cmFjZV94ZnNfYnVmX2l0ZW1fcGluKGJpcCk7CisKKwlhdG9taWNfaW5jKCZiaXAtPmJsaV9yZWZjb3VudCk7CisJYXRvbWljX2luYygmYmlwLT5ibGlfYnVmLT5iX3Bpbl9jb3VudCk7Cit9CiAKIC8qCiAgKiBUaGlzIGlzIGNhbGxlZCB0byB1bnBpbiB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmIGxvZwogICogaXRlbSB3aGljaCB3YXMgcHJldmlvdXNseSBwaW5uZWQgd2l0aCBhIGNhbGwgdG8geGZzX2J1Zl9pdGVtX3BpbigpLgotICogSnVzdCBjYWxsIGJ1bnBpbigpIG9uIHRoZSBidWZmZXIgdG8gZG8gdGhpcy4KICAqCiAgKiBBbHNvIGRyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgYnVmIGl0ZW0gZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgogICogSWYgdGhlIFhGU19CTElfU1RBTEUgZmxhZyBpcyBzZXQgYW5kIHdlIGFyZSB0aGUgbGFzdCByZWZlcmVuY2UsCiAgKiB0aGVuIGZyZWUgdXAgdGhlIGJ1ZiBsb2cgaXRlbSBhbmQgdW5sb2NrIHRoZSBidWZmZXIuCisgKgorICogSWYgdGhlIHJlbW92ZSBmbGFnIGlzIHNldCB3ZSBhcmUgY2FsbGVkIGZyb20gdW5jb21taXQgaW4gdGhlCisgKiBmb3JjZWQtc2h1dGRvd24gcGF0aC4gIElmIHRoYXQgaXMgdHJ1ZSBhbmQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbgorICogdGhlIGxvZyBpdGVtIGlzIGdvaW5nIHRvIGRyb3AgdG8gemVybyB3ZSBuZWVkIHRvIGZyZWUgdGhlIGl0ZW0ncworICogZGVzY3JpcHRvciBpbiB0aGUgdHJhbnNhY3Rpb24uCiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYnVmX2l0ZW1fdW5waW4oCi0JeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCWludAkJCXJlbW92ZSkKIHsKLQlzdHJ1Y3QgeGZzX2FpbAkqYWlscDsKLQl4ZnNfYnVmX3QJKmJwOwotCWludAkJZnJlZWQ7CisJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJpcCA9IEJVRl9JVEVNKGxpcCk7CisJeGZzX2J1Zl90CSpicCA9IGJpcC0+YmxpX2J1ZjsKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCA9IGxpcC0+bGlfYWlscDsKIAlpbnQJCXN0YWxlID0gYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFOworCWludAkJZnJlZWQ7CiAKLQlicCA9IGJpcC0+YmxpX2J1ZjsKLQlBU1NFUlQoYnAgIT0gTlVMTCk7CiAJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKikgPT0gYmlwKTsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCiAJdHJhY2VfeGZzX2J1Zl9pdGVtX3VucGluKGJpcCk7CiAKIAlmcmVlZCA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJmJpcC0+YmxpX3JlZmNvdW50KTsKLQlhaWxwID0gYmlwLT5ibGlfaXRlbS5saV9haWxwOwotCXhmc19idW5waW4oYnApOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJwLT5iX3Bpbl9jb3VudCkpCisJCXdha2VfdXBfYWxsKCZicC0+Yl93YWl0ZXJzKTsKKwogCWlmIChmcmVlZCAmJiBzdGFsZSkgewogCQlBU1NFUlQoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKTsKIAkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOwogCQlBU1NFUlQoIShYRlNfQlVGX0lTREVMQVlXUklURShicCkpKTsKIAkJQVNTRVJUKFhGU19CVUZfSVNTVEFMRShicCkpOwogCQlBU1NFUlQoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTEZfQ0FOQ0VMKTsKKwogCQl0cmFjZV94ZnNfYnVmX2l0ZW1fdW5waW5fc3RhbGUoYmlwKTsKIAorCQlpZiAocmVtb3ZlKSB7CisJCQkvKgorCQkJICogV2UgaGF2ZSB0byByZW1vdmUgdGhlIGxvZyBpdGVtIGZyb20gdGhlIHRyYW5zYWN0aW9uCisJCQkgKiBhcyB3ZSBhcmUgYWJvdXQgdG8gcmVsZWFzZSBvdXIgcmVmZXJlbmNlIHRvIHRoZQorCQkJICogYnVmZmVyLiAgSWYgd2UgZG9uJ3QsIHRoZSB1bmxvY2sgdGhhdCBvY2N1cnMgbGF0ZXIKKwkJCSAqIGluIHhmc190cmFuc191bmNvbW1pdCgpIHdpbGwgcnkgdG8gcmVmZXJlbmNlIHRoZQorCQkJICogYnVmZmVyIHdoaWNoIHdlIG5vIGxvbmdlciBoYXZlIGEgaG9sZCBvbi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2RlbF9pdGVtKGxpcCk7CisKKwkJCS8qCisJCQkgKiBTaW5jZSB0aGUgdHJhbnNhY3Rpb24gbm8gbG9uZ2VyIHJlZmVycyB0byB0aGUgYnVmZmVyLAorCQkJICogdGhlIGJ1ZmZlciBzaG91bGQgbm8gbG9uZ2VyIHJlZmVyIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkJCSAqLworCQkJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgTlVMTCk7CisJCX0KKwogCQkvKgogCQkgKiBJZiB3ZSBnZXQgY2FsbGVkIGhlcmUgYmVjYXVzZSBvZiBhbiBJTyBlcnJvciwgd2UgbWF5CiAJCSAqIG9yIG1heSBub3QgaGF2ZSB0aGUgaXRlbSBvbiB0aGUgQUlMLiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpCkBAIC00MzcsNDggKzQ2NCw2IEBACiB9CiAKIC8qCi0gKiB0aGlzIGlzIGNhbGxlZCBmcm9tIHVuY29tbWl0IGluIHRoZSBmb3JjZWQtc2h1dGRvd24gcGF0aC4KLSAqIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGxvZyBpdGVtCi0gKiBpcyBnb2luZyB0byBkcm9wIHRvIHplcm8uICBJZiBzbywgdW5waW4gd2lsbCBmcmVlIHRoZSBsb2cgaXRlbQotICogc28gd2UgbmVlZCB0byBmcmVlIHRoZSBpdGVtJ3MgZGVzY3JpcHRvciAodGhhdCBwb2ludHMgdG8gdGhlIGl0ZW0pCi0gKiBpbiB0aGUgdHJhbnNhY3Rpb24uCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfYnVmX2l0ZW1fdW5waW5fcmVtb3ZlKAotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwLAotCXhmc190cmFuc190CQkqdHApCi17Ci0JLyogd2lsbCB4ZnNfYnVmX2l0ZW1fdW5waW4oKSBjYWxsIHhmc19idWZfaXRlbV9yZWxzZSgpPyAqLwotCWlmICgoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA9PSAxKSAmJgotCSAgICAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSkgewotCQkvKgotCQkgKiB5ZXMgLS0gV2UgY2FuIHNhZmVseSBkbyBzb21lIHdvcmsgaGVyZSBhbmQgdGhlbiBjYWxsCi0JCSAqIGJ1Zl9pdGVtX3VucGluIHRvIGRvIHRoZSByZXN0IGJlY2F1c2Ugd2UgYXJlCi0JCSAqIGFyZSBob2xkaW5nIHRoZSBidWZmZXIgbG9ja2VkIHNvIG5vIG9uZSBlbHNlIHdpbGwgYmUKLQkJICogYWJsZSB0byBidW1wIHVwIHRoZSByZWZjb3VudC4gV2UgaGF2ZSB0byByZW1vdmUgdGhlCi0JCSAqIGxvZyBpdGVtIGZyb20gdGhlIHRyYW5zYWN0aW9uIGFzIHdlIGFyZSBhYm91dCB0byByZWxlYXNlCi0JCSAqIG91ciByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlci4gSWYgd2UgZG9uJ3QsIHRoZSB1bmxvY2sgdGhhdAotCQkgKiBvY2N1cnMgbGF0ZXIgaW4gdGhlIHhmc190cmFuc191bmNvbW1pdCgpIHdpbGwgdHJ5IHRvCi0JCSAqIHJlZmVyZW5jZSB0aGUgYnVmZmVyIHdoaWNoIHdlIG5vIGxvbmdlciBoYXZlIGEgaG9sZCBvbi4KLQkJICovCi0JCXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyAqbGlkcDsKLQotCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShiaXAtPmJsaV9idWYpIDw9IDApOwotCQl0cmFjZV94ZnNfYnVmX2l0ZW1fdW5waW5fc3RhbGUoYmlwKTsKLQotCQlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90ICopYmlwKTsKLQkJeGZzX3RyYW5zX2ZyZWVfaXRlbSh0cCwgbGlkcCk7Ci0KLQkJLyoKLQkJICogU2luY2UgdGhlIHRyYW5zYWN0aW9uIG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGJ1ZmZlciwgdGhlCi0JCSAqIGJ1ZmZlciBzaG91bGQgbm8gbG9uZ2VyIHJlZmVyIHRvIHRoZSB0cmFuc2FjdGlvbi4KLQkJICovCi0JCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYmlwLT5ibGlfYnVmLCBOVUxMKTsKLQl9Ci0JeGZzX2J1Zl9pdGVtX3VucGluKGJpcCk7Ci19Ci0KLS8qCiAgKiBUaGlzIGlzIGNhbGxlZCB0byBhdHRlbXB0IHRvIGxvY2sgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogYnVmIGxvZyBpdGVtLiAgRG9uJ3Qgc2xlZXAgb24gdGhlIGJ1ZmZlciBsb2NrLiAgSWYgd2UgY2FuJ3QgZ2V0CiAgKiB0aGUgbG9jayByaWdodCBhd2F5LCByZXR1cm4gMC4gIElmIHdlIGNhbiBnZXQgdGhlIGxvY2ssIHRha2UgYQpAQCAtNDg4LDExICs0NzMsMTEgQEAKICAqLwogU1RBVElDIHVpbnQKIHhmc19idWZfaXRlbV90cnlsb2NrKAotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfYnVmX3QJKmJwOworCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBCVUZfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfYnVmCQkqYnAgPSBiaXAtPmJsaV9idWY7CiAKLQlicCA9IGJpcC0+YmxpX2J1ZjsKIAlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpCiAJCXJldHVybiBYRlNfSVRFTV9QSU5ORUQ7CiAJaWYgKCFYRlNfQlVGX0NQU0VNQShicCkpCkBAIC01MjksMTMgKzUxNCwxMiBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX2J1Zl9pdGVtX3VubG9jaygKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JaW50CQlhYm9ydGVkOwotCXhmc19idWZfdAkqYnA7Ci0JdWludAkJaG9sZDsKLQotCWJwID0gYmlwLT5ibGlfYnVmOworCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBCVUZfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfYnVmCQkqYnAgPSBiaXAtPmJsaV9idWY7CisJaW50CQkJYWJvcnRlZDsKKwl1aW50CQkJaG9sZDsKIAogCS8qIENsZWFyIHRoZSBidWZmZXIncyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uICovCiAJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgTlVMTCk7CkBAIC01NDYsNyArNTMwLDcgQEAKIAkgKiAoY2FuY2VsbGVkKSBidWZmZXJzIGF0IHVucGluIHRpbWUsIGJ1dCB3ZSdsbCBuZXZlciBnbyB0aHJvdWdoIHRoZQogCSAqIHBpbi91bnBpbiBjeWNsZSBpZiB3ZSBhYm9ydCBpbnNpZGUgY29tbWl0LgogCSAqLwotCWFib3J0ZWQgPSAoYmlwLT5ibGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKSAhPSAwOworCWFib3J0ZWQgPSAobGlwLT5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKSAhPSAwOwogCiAJLyoKIAkgKiBCZWZvcmUgcG9zc2libHkgZnJlZWluZyB0aGUgYnVmIGl0ZW0sIGRldGVybWluZSBpZiB3ZSBzaG91bGQKQEAgLTYwNywxNiArNTkxLDE2IEBACiAgKi8KIFNUQVRJQyB4ZnNfbHNuX3QKIHhmc19idWZfaXRlbV9jb21taXR0ZWQoCi0JeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAogCXhmc19sc25fdAkJbHNuKQogeworCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBCVUZfSVRFTShsaXApOworCiAJdHJhY2VfeGZzX2J1Zl9pdGVtX2NvbW1pdHRlZChiaXApOwogCi0JaWYgKChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSU5PREVfQUxMT0NfQlVGKSAmJgotCSAgICAoYmlwLT5ibGlfaXRlbS5saV9sc24gIT0gMCkpIHsKLQkJcmV0dXJuIGJpcC0+YmxpX2l0ZW0ubGlfbHNuOwotCX0KLQlyZXR1cm4gKGxzbik7CisJaWYgKChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSU5PREVfQUxMT0NfQlVGKSAmJiBsaXAtPmxpX2xzbiAhPSAwKQorCQlyZXR1cm4gbGlwLT5saV9sc247CisJcmV0dXJuIGxzbjsKIH0KIAogLyoKQEAgLTYyNiwxNSArNjEwLDE2IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYnVmX2l0ZW1fcHVzaCgKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JeGZzX2J1Zl90CSpicDsKKwlzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbQkqYmlwID0gQlVGX0lURU0obGlwKTsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwID0gYmlwLT5ibGlfYnVmOwogCiAJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJQVNTRVJUKCFYRlNfQlVGX0lTREVMQVlXUklURShicCkpOworCiAJdHJhY2VfeGZzX2J1Zl9pdGVtX3B1c2goYmlwKTsKIAotCWJwID0gYmlwLT5ibGlfYnVmOwotCUFTU0VSVCghWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKTsKIAl4ZnNfYnVmX3JlbHNlKGJwKTsKIH0KIApAQCAtNjQ2LDIyICs2MzEsMjQgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19idWZfaXRlbV9wdXNoYnVmKAotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfYnVmX3QJKmJwOworCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBCVUZfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfYnVmCQkqYnAgPSBiaXAtPmJsaV9idWY7CiAKIAlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKKwlBU1NFUlQoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKTsKKwogCXRyYWNlX3hmc19idWZfaXRlbV9wdXNoYnVmKGJpcCk7CiAKLQlicCA9IGJpcC0+YmxpX2J1ZjsKLQlBU1NFUlQoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKTsKIAl4ZnNfYnVmX2RlbHdyaV9wcm9tb3RlKGJwKTsKIAl4ZnNfYnVmX3JlbHNlKGJwKTsKIH0KIAotLyogQVJHU1VTRUQgKi8KIFNUQVRJQyB2b2lkCi14ZnNfYnVmX2l0ZW1fY29tbWl0dGluZyh4ZnNfYnVmX2xvZ19pdGVtX3QgKmJpcCwgeGZzX2xzbl90IGNvbW1pdF9sc24pCit4ZnNfYnVmX2l0ZW1fY29tbWl0dGluZygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQljb21taXRfbHNuKQogewogfQogCkBAIC02NjksMjEgKzY1NiwxNiBAQAogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGJ1ZiBsb2cgaXRlbXMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19idWZfaXRlbV9vcHMgPSB7Ci0JLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fc2l6ZSwKLQkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCi0JCQkJCXhmc19idWZfaXRlbV9mb3JtYXQsCi0JLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV9waW4sCi0JLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2J1Zl9pdGVtX3VucGluLAotCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCAqKSkKLQkJCQkJeGZzX2J1Zl9pdGVtX3VucGluX3JlbW92ZSwKLQkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV90cnlsb2NrLAotCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fdW5sb2NrLAotCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCi0JCQkJCXhmc19idWZfaXRlbV9jb21taXR0ZWQsCi0JLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fcHVzaCwKLQkuaW9wX3B1c2hidWYJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV9wdXNoYnVmLAotCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKLQkJCQkJeGZzX2J1Zl9pdGVtX2NvbW1pdHRpbmcKKwkuaW9wX3NpemUJPSB4ZnNfYnVmX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9IHhmc19idWZfaXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSB4ZnNfYnVmX2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSB4ZnNfYnVmX2l0ZW1fdW5waW4sCisJLmlvcF90cnlsb2NrCT0geGZzX2J1Zl9pdGVtX3RyeWxvY2ssCisJLmlvcF91bmxvY2sJPSB4ZnNfYnVmX2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0geGZzX2J1Zl9pdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSB4ZnNfYnVmX2l0ZW1fcHVzaCwKKwkuaW9wX3B1c2hidWYJPSB4ZnNfYnVmX2l0ZW1fcHVzaGJ1ZiwKKwkuaW9wX2NvbW1pdHRpbmcgPSB4ZnNfYnVmX2l0ZW1fY29tbWl0dGluZwogfTsKIAogCkBAIC03MTIsNyArNjk0LDYgQEAKIAkgKi8KIAlpZiAoYnAtPmJfbW91bnQgIT0gbXApCiAJCWJwLT5iX21vdW50ID0gbXA7Ci0JWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4ZnNfYmRzdHJhdF9jYik7CiAJaWYgKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpIHsKIAkJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOwogCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9CVUYpIHsKQEAgLTEwOTgsMTUgKzEwNzksMTQgQEAKICAqIEl0IGlzIGNhbGxlZCBieSB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MoKSBhYm92ZSB3aGljaCB3aWxsIHRha2UKICAqIGNhcmUgb2YgY2xlYW5pbmcgdXAgdGhlIGJ1ZmZlciBpdHNlbGYuCiAgKi8KLS8qIEFSR1NVU0VEICovCiB2b2lkCiB4ZnNfYnVmX2lvZG9uZSgKLQl4ZnNfYnVmX3QJCSpicCwKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBiaXAtPmJsaV9pdGVtLmxpX2FpbHA7CisJc3RydWN0IHhmc19haWwJCSphaWxwID0gbGlwLT5saV9haWxwOwogCi0JQVNTRVJUKGJpcC0+YmxpX2J1ZiA9PSBicCk7CisJQVNTRVJUKEJVRl9JVEVNKGxpcCktPmJsaV9idWYgPT0gYnApOwogCiAJeGZzX2J1Zl9yZWxlKGJwKTsKIApAQCAtMTEyMCw2ICsxMTAwLDYgQEAKIAkgKiBFaXRoZXIgd2F5LCBBSUwgaXMgdXNlbGVzcyBpZiB3ZSdyZSBmb3JjaW5nIGEgc2h1dGRvd24uCiAJICovCiAJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOwotCXhmc19idWZfaXRlbV9mcmVlKGJpcCk7CisJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgbGlwKTsKKwl4ZnNfYnVmX2l0ZW1fZnJlZShCVUZfSVRFTShsaXApKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaCBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaAppbmRleCBmMjBiYjQ3Li4wZTJlZDQzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCSAgICAgIHZvaWQoKikoc3RydWN0IHhmc19idWYgKiwgeGZzX2xvZ19pdGVtX3QgKiksCiAJCQkgICAgICB4ZnNfbG9nX2l0ZW1fdCAqKTsKIHZvaWQJeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKHN0cnVjdCB4ZnNfYnVmICopOwotdm9pZAl4ZnNfYnVmX2lvZG9uZShzdHJ1Y3QgeGZzX2J1ZiAqLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7Cit2b2lkCXhmc19idWZfaW9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7CiAKICNpZmRlZiBYRlNfVFJBTlNfREVCVUcKIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYwppbmRleCAwY2E1NTZiLi4zMGZhMGUyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RhX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19kYV9idHJlZS5jCkBAIC0yNSwxOSArMjUsMTQgQEAKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19hdHRyLmgiCiAjaW5jbHVkZSAieGZzX2F0dHJfbGVhZi5oIgpAQCAtNTgxLDE2ICs1NzYsMTQgQEAKIAl4ZnNfZGFfaW50bm9kZV90ICpub2RlOwogCXhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlOwogCWludCB0bXA7Ci0JeGZzX21vdW50X3QgKm1wOwogCiAJbm9kZSA9IG9sZGJsay0+YnAtPmRhdGE7Ci0JbXAgPSBzdGF0ZS0+bXA7CiAJQVNTRVJUKGJlMTZfdG9fY3B1KG5vZGUtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CiAJQVNTRVJUKChvbGRibGstPmluZGV4ID49IDApICYmIChvbGRibGstPmluZGV4IDw9IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCkpKTsKIAlBU1NFUlQobmV3YmxrLT5ibGtubyAhPSAwKTsKIAlpZiAoc3RhdGUtPmFyZ3MtPndoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKQotCQlBU1NFUlQobmV3YmxrLT5ibGtubyA+PSBtcC0+bV9kaXJsZWFmYmxrICYmCi0JCSAgICAgICBuZXdibGstPmJsa25vIDwgbXAtPm1fZGlyZnJlZWJsayk7CisJCUFTU0VSVChuZXdibGstPmJsa25vID49IHN0YXRlLT5tcC0+bV9kaXJsZWFmYmxrICYmCisJCSAgICAgICBuZXdibGstPmJsa25vIDwgc3RhdGUtPm1wLT5tX2RpcmZyZWVibGspOwogCiAJLyoKIAkgKiBXZSBtYXkgbmVlZCB0byBtYWtlIHNvbWUgcm9vbSBiZWZvcmUgd2UgaW5zZXJ0IHRoZSBuZXcgbm9kZS4KQEAgLTE2MDEsNyArMTU5NCw3IEBACiAJCQl4ZnNfYm1hcGlfYWZsYWcodyl8WEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9NRVRBREFUQXwKIAkJCVhGU19CTUFQSV9DT05USUcsCiAJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwgJm1hcCwgJm5tYXAsCi0JCQlhcmdzLT5mbGlzdCwgTlVMTCkpKSB7CisJCQlhcmdzLT5mbGlzdCkpKSB7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAJQVNTRVJUKG5tYXAgPD0gMSk7CkBAIC0xNjIyLDggKzE2MTUsNyBAQAogCQkJCQl4ZnNfYm1hcGlfYWZsYWcodyl8WEZTX0JNQVBJX1dSSVRFfAogCQkJCQlYRlNfQk1BUElfTUVUQURBVEEsCiAJCQkJCWFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLAotCQkJCQkmbWFwcFttYXBpXSwgJm5tYXAsIGFyZ3MtPmZsaXN0LAotCQkJCQlOVUxMKSkpIHsKKwkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCkpKSB7CiAJCQkJa21lbV9mcmVlKG1hcHApOwogCQkJCXJldHVybiBlcnJvcjsKIAkJCX0KQEAgLTE4ODQsNyArMTg3Niw3IEBACiAJCSAqLwogCQlpZiAoKGVycm9yID0geGZzX2J1bm1hcGkodHAsIGRwLCBkZWFkX2Jsa25vLCBjb3VudCwKIAkJCQl4ZnNfYm1hcGlfYWZsYWcodyl8WEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCTAsIGFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPmZsaXN0LCBOVUxMLAorCQkJCTAsIGFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPmZsaXN0LAogCQkJCSZkb25lKSkgPT0gRU5PU1BDKSB7CiAJCQlpZiAodyAhPSBYRlNfREFUQV9GT1JLKQogCQkJCWJyZWFrOwpAQCAtMTk4OSw3ICsxOTgxLDcgQEAKIAkJCQkJbmZzYiwKIAkJCQkJWEZTX0JNQVBJX01FVEFEQVRBIHwKIAkJCQkJCXhmc19ibWFwaV9hZmxhZyh3aGljaGZvcmspLAotCQkJCQlOVUxMLCAwLCBtYXBwLCAmbm1hcCwgTlVMTCwgTlVMTCkpKQorCQkJCQlOVUxMLCAwLCBtYXBwLCAmbm1hcCwgTlVMTCkpKQogCQkJCWdvdG8gZXhpdDA7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kZnJhZy5jIGIvZnMveGZzL3hmc19kZnJhZy5jCmluZGV4IDdmMTU5ZDIuLjNiOTU4MmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGZyYWcuYworKysgYi9mcy94ZnMveGZzX2RmcmFnLmMKQEAgLTI0LDI0ICsyNCwxNSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfZGZyYWcuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfdm5vZGVvcHMuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIApAQCAtNDI1LDExICs0MTYsOCBAQAogCX0KIAogCi0JSUhPTEQoaXApOwotCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKLQotCUlIT0xEKHRpcCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCB0aXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwogCiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsICBpbGZfZmllbGRzKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCB0aXAsIHRpbGZfZmllbGRzKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMi5jIGIvZnMveGZzL3hmc19kaXIyLmMKaW5kZXggNDI1MjBmMC4uYTEzMjFiYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyLmMKKysrIGIvZnMveGZzL3hmc19kaXIyLmMKQEAgLTI1LDEzICsyNSwxMSBAQAogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCkBAIC0zODIsNyArMzgwLDcgQEAKIAlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KIAlpbnQJCXY7CQkvKiB0eXBlLWNoZWNraW5nIHZhbHVlICovCiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGRwKTsKKwl0cmFjZV94ZnNfcmVhZGRpcihkcCk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKQEAgLTU0OSw3ICs1NDcsNyBAQAogCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCBibm8sIGNvdW50LAogCQkJWEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9NRVRBREFUQXxYRlNfQk1BUElfQ09OVElHLAogCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsICZtYXAsICZubWFwLAotCQkJYXJncy0+Zmxpc3QsIE5VTEwpKSkKKwkJCWFyZ3MtPmZsaXN0KSkpCiAJCXJldHVybiBlcnJvcjsKIAlBU1NFUlQobm1hcCA8PSAxKTsKIAlpZiAobm1hcCA9PSAxKSB7CkBAIC01ODEsOCArNTc5LDcgQEAKIAkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCBiLCBjLAogCQkJCQlYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBLAogCQkJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwKLQkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCwKLQkJCQkJTlVMTCkpKSB7CisJCQkJCSZtYXBwW21hcGldLCAmbm1hcCwgYXJncy0+Zmxpc3QpKSkgewogCQkJCWttZW1fZnJlZShtYXBwKTsKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQl9CkBAIC03MTUsNyArNzEyLDcgQEAKIAkgKi8KIAlpZiAoKGVycm9yID0geGZzX2J1bm1hcGkodHAsIGRwLCBkYSwgbXAtPm1fZGlyYmxrZnNicywKIAkJCVhGU19CTUFQSV9NRVRBREFUQSwgMCwgYXJncy0+Zmlyc3RibG9jaywgYXJncy0+Zmxpc3QsCi0JCQlOVUxMLCAmZG9uZSkpKSB7CisJCQkmZG9uZSkpKSB7CiAJCS8qCiAJCSAqIEVOT1NQQyBhY3R1YWxseSBjYW4gaGFwcGVuIGlmIHdlJ3JlIGluIGEgcmVtb3ZlbmFtZSB3aXRoCiAJCSAqIG5vIHNwYWNlIHJlc2VydmF0aW9uLCBhbmQgdGhlIHJlc3VsdGluZyBibG9jayByZW1vdmFsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfYmxvY2suYyBiL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5jCmluZGV4IDc3OWEyNjcuLjU4MGQ5OWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5jCkBAIC0yNCwxMiArMjQsMTAgQEAKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgpAQCAtMTA3MywxMCArMTA3MSwxMCBAQAogCSAqLwogCiAJYnVmX2xlbiA9IGRwLT5pX2RmLmlmX2J5dGVzOwotCWJ1ZiA9IGttZW1fYWxsb2MoZHAtPmlfZGYuaWZfYnl0ZXMsIEtNX1NMRUVQKTsKKwlidWYgPSBrbWVtX2FsbG9jKGJ1Zl9sZW4sIEtNX1NMRUVQKTsKIAotCW1lbWNweShidWYsIHNmcCwgZHAtPmlfZGYuaWZfYnl0ZXMpOwotCXhmc19pZGF0YV9yZWFsbG9jKGRwLCAtZHAtPmlfZGYuaWZfYnl0ZXMsIFhGU19EQVRBX0ZPUkspOworCW1lbWNweShidWYsIHNmcCwgYnVmX2xlbik7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1idWZfbGVuLCBYRlNfREFUQV9GT1JLKTsKIAlkcC0+aV9kLmRpX3NpemUgPSAwOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGRwLCBYRlNfSUxPR19DT1JFKTsKIAkvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2RhdGEuYyBiL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmMKaW5kZXggNDk4ZjhkNi4uOTIxNTk1YiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2RhdGEuYworKysgYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5jCkBAIC0yNCwxMiArMjQsMTAgQEAKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwppbmRleCBlMmQ4OTg1Li41MDRiZTg2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKQEAgLTI1LDExICsyNSw5IEBACiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCkBAIC04NzUsNyArODczLDcgQEAKIAkJCQkJeGZzX2RpcjJfYnl0ZV90b19kYShtcCwKIAkJCQkJCVhGU19ESVIyX0xFQUZfT0ZGU0VUKSAtIG1hcF9vZmYsCiAJCQkJCVhGU19CTUFQSV9NRVRBREFUQSwgTlVMTCwgMCwKLQkJCQkJJm1hcFttYXBfdmFsaWRdLCAmbm1hcCwgTlVMTCwgTlVMTCk7CisJCQkJCSZtYXBbbWFwX3ZhbGlkXSwgJm5tYXAsIE5VTEwpOwogCQkJCS8qCiAJCQkJICogRG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgaWdub3JlIHRoaXMgb3IKIAkJCQkgKiB0cnkgdG8gcmV0dXJuIGFuIGVycm9yLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX25vZGUuYyBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMKaW5kZXggNzhmYzRkOS4uZjlhMDg2NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX25vZGUuYworKysgYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5jCkBAIC0yNCwxMiArMjQsMTAgQEAKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3NmLmMgYi9mcy94ZnMveGZzX2RpcjJfc2YuYwppbmRleCBjMWE1OTQ1Li5iMWJhZTZiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfc2YuYworKysgYi9mcy94ZnMveGZzX2RpcjJfc2YuYwpAQCAtMjQsMTIgKzI0LDEwIEBACiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1hcGkuaCBiL2ZzL3hmcy94ZnNfZG1hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxM2NkZC4uMDAwMDAwMAotLS0gYS9mcy94ZnMveGZzX2RtYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpZm5kZWYgX19YRlNfRE1BUElfSF9fCi0jZGVmaW5lIF9fWEZTX0RNQVBJX0hfXwotCi0vKglWYWx1ZXMgdXNlZCB0byBkZWZpbmUgdGhlIG9uLWRpc2sgdmVyc2lvbiBvZiBkbV9hdHRybmFtZV90LiBBbGwKLSAqCW9uLWRpc2sgYXR0cmlidXRlIG5hbWVzIHN0YXJ0IHdpdGggdGhlIDgtYnl0ZSBzdHJpbmcgIlNHSV9ETUlfIi4KLSAqCi0gKiAgICAgIEluIHRoZSBvbi1kaXNrIGlub2RlLCBETUFQSSBhdHRyaWJ1dGUgbmFtZXMgY29uc2lzdCBvZiB0aGUgdXNlci1wcm92aWRlZAotICogICAgICBuYW1lIHdpdGggdGhlIERNQVRUUl9QUkVGSVhTVFJJTkcgcHJlLXBlbmRlZC4gIFRoaXMgc3RyaW5nIG11c3QgTkVWRVIgYmUKLSAqICAgICAgY2hhbmdlZC4KLSAqLwotCi0jZGVmaW5lIERNQVRUUl9QUkVGSVhMRU4JOAotI2RlZmluZSBETUFUVFJfUFJFRklYU1RSSU5HCSJTR0lfRE1JXyIKLQotdHlwZWRlZiBlbnVtIHsKLQlETV9FVkVOVF9JTlZBTElECT0gLTEsCi0JRE1fRVZFTlRfQ0FOQ0VMCQk9IDAsCQkvKiBub3Qgc3VwcG9ydGVkICovCi0JRE1fRVZFTlRfTU9VTlQJCT0gMSwKLQlETV9FVkVOVF9QUkVVTk1PVU5UCT0gMiwKLQlETV9FVkVOVF9VTk1PVU5UCT0gMywKLQlETV9FVkVOVF9ERUJVVAkJPSA0LAkJLyogbm90IHN1cHBvcnRlZCAqLwotCURNX0VWRU5UX0NSRUFURQkJPSA1LAotCURNX0VWRU5UX0NMT1NFCQk9IDYsCQkvKiBub3Qgc3VwcG9ydGVkICovCi0JRE1fRVZFTlRfUE9TVENSRUFURQk9IDcsCi0JRE1fRVZFTlRfUkVNT1ZFCQk9IDgsCi0JRE1fRVZFTlRfUE9TVFJFTU9WRQk9IDksCi0JRE1fRVZFTlRfUkVOQU1FCQk9IDEwLAotCURNX0VWRU5UX1BPU1RSRU5BTUUJPSAxMSwKLQlETV9FVkVOVF9MSU5LCQk9IDEyLAotCURNX0VWRU5UX1BPU1RMSU5LCT0gMTMsCi0JRE1fRVZFTlRfU1lNTElOSwk9IDE0LAotCURNX0VWRU5UX1BPU1RTWU1MSU5LCT0gMTUsCi0JRE1fRVZFTlRfUkVBRAkJPSAxNiwKLQlETV9FVkVOVF9XUklURQkJPSAxNywKLQlETV9FVkVOVF9UUlVOQ0FURQk9IDE4LAotCURNX0VWRU5UX0FUVFJJQlVURQk9IDE5LAotCURNX0VWRU5UX0RFU1RST1kJPSAyMCwKLQlETV9FVkVOVF9OT1NQQUNFCT0gMjEsCi0JRE1fRVZFTlRfVVNFUgkJPSAyMiwKLQlETV9FVkVOVF9NQVgJCT0gMjMKLX0gZG1fZXZlbnR0eXBlX3Q7Ci0jZGVmaW5lIEhBVkVfRE1fRVZFTlRUWVBFX1QKLQotdHlwZWRlZiBlbnVtIHsKLQlETV9SSUdIVF9OVUxMLAotCURNX1JJR0hUX1NIQVJFRCwKLQlETV9SSUdIVF9FWENMCi19IGRtX3JpZ2h0X3Q7Ci0jZGVmaW5lIEhBVkVfRE1fUklHSFRfVAotCi0vKiBEZWZpbmVzIGZvciBkZXRlcm1pbmluZyBpZiBhbiBldmVudCBtZXNzYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI2lmZGVmIEhBVkVfRE1BUEkKLSNkZWZpbmUJRE1fRVZFTlRfRU5BQkxFRChpcCwgZXZlbnQpICggXAotCXVubGlrZWx5ICgoaXApLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX0RNQVBJKSAmJiBcCi0JCSggKChpcCktPmlfZC5kaV9kbWV2bWFzayAmICgxIDw8IGV2ZW50KSkgfHwgXAotCQkgICgoaXApLT5pX21vdW50LT5tX2RtZXZtYXNrICYgKDEgPDwgZXZlbnQpKSApIFwKLQkpCi0jZWxzZQotI2RlZmluZSBETV9FVkVOVF9FTkFCTEVEKGlwLCBldmVudCkJKDApCi0jZW5kaWYKLQotI2RlZmluZSBETV9YRlNfVkFMSURfRlNfRVZFTlRTCQkoIFwKLQkoMSA8PCBETV9FVkVOVF9QUkVVTk1PVU5UKQl8IFwKLQkoMSA8PCBETV9FVkVOVF9VTk1PVU5UKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfTk9TUEFDRSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX0RFQlVUKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfQ1JFQVRFKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfUE9TVENSRUFURSkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfUkVNT1ZFKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfUE9TVFJFTU9WRSkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfUkVOQU1FKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfUE9TVFJFTkFNRSkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfTElOSykJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RMSU5LKQl8IFwKLQkoMSA8PCBETV9FVkVOVF9TWU1MSU5LKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfUE9TVFNZTUxJTkspCXwgXAotCSgxIDw8IERNX0VWRU5UX0FUVFJJQlVURSkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfREVTVFJPWSkJCSkKLQotLyogRXZlbnRzIHZhbGlkIGluIGRtX3NldF9ldmVudGxpc3QoKSB3aGVuIGNhbGxlZCB3aXRoIGEgZmlsZSBoYW5kbGUgZm9yCi0gICBhIHJlZ3VsYXIgZmlsZSBvciBhIHN5bWxpbmsuICBUaGVzZSBldmVudHMgYXJlIHBlcnNpc3RlbnQuCi0qLwotCi0jZGVmaW5lCURNX1hGU19WQUxJRF9GSUxFX0VWRU5UUwkoIFwKLQkoMSA8PCBETV9FVkVOVF9BVFRSSUJVVEUpCXwgXAotCSgxIDw8IERNX0VWRU5UX0RFU1RST1kpCQkpCi0KLS8qIEV2ZW50cyB2YWxpZCBpbiBkbV9zZXRfZXZlbnRsaXN0KCkgd2hlbiBjYWxsZWQgd2l0aCBhIGZpbGUgaGFuZGxlIGZvcgotICAgYSBkaXJlY3RvcnkuICBUaGVzZSBldmVudHMgYXJlIHBlcnNpc3RlbnQuCi0qLwotCi0jZGVmaW5lCURNX1hGU19WQUxJRF9ESVJFQ1RPUllfRVZFTlRTCSggXAotCSgxIDw8IERNX0VWRU5UX0NSRUFURSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RDUkVBVEUpCXwgXAotCSgxIDw8IERNX0VWRU5UX1JFTU9WRSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RSRU1PVkUpCXwgXAotCSgxIDw8IERNX0VWRU5UX1JFTkFNRSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RSRU5BTUUpCXwgXAotCSgxIDw8IERNX0VWRU5UX0xJTkspCQl8IFwKLQkoMSA8PCBETV9FVkVOVF9QT1NUTElOSykJfCBcCi0JKDEgPDwgRE1fRVZFTlRfU1lNTElOSykJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RTWU1MSU5LKQl8IFwKLQkoMSA8PCBETV9FVkVOVF9BVFRSSUJVVEUpCXwgXAotCSgxIDw8IERNX0VWRU5UX0RFU1RST1kpCQkpCi0KLS8qIEV2ZW50cyBzdXBwb3J0ZWQgYnkgdGhlIFhGUyBmaWxlc3lzdGVtLiAqLwotI2RlZmluZQlETV9YRlNfU1VQUE9SVEVEX0VWRU5UUwkJKCBcCi0JKDEgPDwgRE1fRVZFTlRfTU9VTlQpCQl8IFwKLQkoMSA8PCBETV9FVkVOVF9QUkVVTk1PVU5UKQl8IFwKLQkoMSA8PCBETV9FVkVOVF9VTk1PVU5UKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfTk9TUEFDRSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX0NSRUFURSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RDUkVBVEUpCXwgXAotCSgxIDw8IERNX0VWRU5UX1JFTU9WRSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RSRU1PVkUpCXwgXAotCSgxIDw8IERNX0VWRU5UX1JFTkFNRSkJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RSRU5BTUUpCXwgXAotCSgxIDw8IERNX0VWRU5UX0xJTkspCQl8IFwKLQkoMSA8PCBETV9FVkVOVF9QT1NUTElOSykJfCBcCi0JKDEgPDwgRE1fRVZFTlRfU1lNTElOSykJCXwgXAotCSgxIDw8IERNX0VWRU5UX1BPU1RTWU1MSU5LKQl8IFwKLQkoMSA8PCBETV9FVkVOVF9SRUFEKQkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfV1JJVEUpCQl8IFwKLQkoMSA8PCBETV9FVkVOVF9UUlVOQ0FURSkJfCBcCi0JKDEgPDwgRE1fRVZFTlRfQVRUUklCVVRFKQl8IFwKLQkoMSA8PCBETV9FVkVOVF9ERVNUUk9ZKQkJKQotCi0KLS8qCi0gKglEZWZpbml0aW9ucyB1c2VkIGZvciB0aGUgZmxhZ3MgZmllbGQgb24gZG1fc2VuZF8qX2V2ZW50KCkuCi0gKi8KLQotI2RlZmluZSBETV9GTEFHU19OREVMQVkJCTB4MDAxCS8qIHJldHVybiBFQUdBSU4gYWZ0ZXIgZG1fcGVuZGluZygpICovCi0jZGVmaW5lIERNX0ZMQUdTX1VOV0FOVEVECTB4MDAyCS8qIGV2ZW50IG5vdCBpbiBmc3lzIGRtX2V2ZW50c2V0X3QgKi8KLSNkZWZpbmUgRE1fRkxBR1NfSU1VWAkJMHgwMDQJLyogdGhyZWFkIGhvbGRzIGlfbXV0ZXggKi8KLSNkZWZpbmUgRE1fRkxBR1NfSUFMTE9DU0VNX1JECTB4MDEwCS8qIHRocmVhZCBob2xkcyBpX2FsbG9jX3NlbSByZCAqLwotI2RlZmluZSBETV9GTEFHU19JQUxMT0NTRU1fV1IJMHgwMjAJLyogdGhyZWFkIGhvbGRzIGlfYWxsb2Nfc2VtIHdyICovCi0KLS8qCi0gKglQdWxsIGluIHBsYXRmb3JtIHNwZWNpZmljIGV2ZW50IGZsYWdzIGRlZmluZXMKLSAqLwotI2luY2x1ZGUgInhmc19kbWFwaV9wcml2LmgiCi0KLS8qCi0gKglNYWNyb3MgdG8gdHVybiBjYWxsZXIgc3BlY2lmaWVkIGRlbGF5L2Jsb2NrIGZsYWdzIGludG8KLSAqCWRtX3NlbmRfeHh4eF9ldmVudCBmbGFnIERNX0ZMQUdTX05ERUxBWS4KLSAqLwotCi0jZGVmaW5lIEZJTFBfREVMQVlfRkxBRyhmaWxwKSAoKGZpbHAtPmZfZmxhZ3MmKE9fTkRFTEFZfE9fTk9OQkxPQ0spKSA/IFwKLQkJCURNX0ZMQUdTX05ERUxBWSA6IDApCi0jZGVmaW5lIEFUX0RFTEFZX0ZMQUcoZikgKChmICYgWEZTX0FUVFJfTk9OQkxPQ0spID8gRE1fRkxBR1NfTkRFTEFZIDogMCkKLQotI2VuZGlmICAvKiBfX1hGU19ETUFQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1vcHMuYyBiL2ZzL3hmcy94ZnNfZG1vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZTI1OC4uMDAwMDAwMAotLS0gYS9mcy94ZnMveGZzX2Rtb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX2ZzLmgiCi0jaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2xvZy5oIgotI2luY2x1ZGUgInhmc190cmFucy5oIgotI2luY2x1ZGUgInhmc19zYi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCi0jaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX21vdW50LmgiCi0KLQotc3RhdGljIHN0cnVjdCB4ZnNfZG1vcHMgeGZzX2RtY29yZV9zdHViID0gewotCS54ZnNfc2VuZF9kYXRhCQk9ICh4ZnNfc2VuZF9kYXRhX3QpZnNfbm9zeXMsCi0JLnhmc19zZW5kX21tYXAJCT0gKHhmc19zZW5kX21tYXBfdClmc19ub2VyciwKLQkueGZzX3NlbmRfZGVzdHJveQk9ICh4ZnNfc2VuZF9kZXN0cm95X3QpZnNfbm9zeXMsCi0JLnhmc19zZW5kX25hbWVzcAk9ICh4ZnNfc2VuZF9uYW1lc3BfdClmc19ub3N5cywKLQkueGZzX3NlbmRfbW91bnQJCT0gKHhmc19zZW5kX21vdW50X3QpZnNfbm9zeXMsCi0JLnhmc19zZW5kX3VubW91bnQJPSAoeGZzX3NlbmRfdW5tb3VudF90KWZzX25vZXJyLAotfTsKLQotaW50Ci14ZnNfZG1vcHNfZ2V0KHN0cnVjdCB4ZnNfbW91bnQgKm1wKQotewotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgewotCQljbW5fZXJyKENFX1dBUk4sCi0JCQkiWEZTOiBkbWFwaSBzdXBwb3J0IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBrZXJuZWwuIik7Ci0JCXJldHVybiBFSU5WQUw7Ci0JfQotCi0JbXAtPm1fZG1fb3BzID0gJnhmc19kbWNvcmVfc3R1YjsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAoteGZzX2Rtb3BzX3B1dChzdHJ1Y3QgeGZzX21vdW50ICptcCkKLXsKLX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuYyBiL2ZzL3hmcy94ZnNfZXJyb3IuYwppbmRleCAwNDdiOGE4Li5lZDk5OTAyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Vycm9yLmMKKysrIGIvZnMveGZzL3hmc19lcnJvci5jCkBAIC0yMywxMiArMjMsOCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKaW5kZXggNDA5ZmU4MS4uYTU1ZTY4NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCkBAIC0zMywxOCArMzIsMTkgQEAKIGttZW1fem9uZV90CSp4ZnNfZWZpX3pvbmU7CiBrbWVtX3pvbmVfdAkqeGZzX2VmZF96b25lOwogCi1TVEFUSUMgdm9pZAl4ZnNfZWZpX2l0ZW1fdW5sb2NrKHhmc19lZmlfbG9nX2l0ZW1fdCAqKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0gKkVGSV9JVEVNKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGxpcCwgc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0sIGVmaV9pdGVtKTsKK30KIAogdm9pZAoteGZzX2VmaV9pdGVtX2ZyZWUoeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreGZzX2VmaV9pdGVtX2ZyZWUoCisJc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0JKmVmaXApCiB7Ci0JaW50IG5leHRzID0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7Ci0KLQlpZiAobmV4dHMgPiBYRlNfRUZJX01BWF9GQVNUX0VYVEVOVFMpIHsKKwlpZiAoZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMgPiBYRlNfRUZJX01BWF9GQVNUX0VYVEVOVFMpCiAJCWttZW1fZnJlZShlZmlwKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJa21lbV96b25lX2ZyZWUoeGZzX2VmaV96b25lLCBlZmlwKTsKLQl9CiB9CiAKIC8qCkBAIC01Miw5ICs1Miw5IEBACiAgKiBXZSBvbmx5IG5lZWQgMSBpb3ZlYyBmb3IgYW4gZWZpIGl0ZW0uICBJdCBqdXN0IGxvZ3MgdGhlIGVmaV9sb2dfZm9ybWF0CiAgKiBzdHJ1Y3R1cmUuCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHVpbnQKLXhmc19lZmlfaXRlbV9zaXplKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCkKK3hmc19lZmlfaXRlbV9zaXplKAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKIAlyZXR1cm4gMTsKIH0KQEAgLTY3LDEwICs2NywxMiBAQAogICogc2xvdHMgaW4gdGhlIGVmaSBpdGVtIGhhdmUgYmVlbiBmaWxsZWQuCiAgKi8KIFNUQVRJQyB2b2lkCi14ZnNfZWZpX2l0ZW1fZm9ybWF0KHhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCwKLQkJICAgIHhmc19sb2dfaW92ZWNfdAkqbG9nX3ZlY3RvcikKK3hmc19lZmlfaXRlbV9mb3JtYXQoCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCXN0cnVjdCB4ZnNfbG9nX2lvdmVjCSpsb2dfdmVjdG9yKQogewotCXVpbnQJc2l6ZTsKKwlzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbQkqZWZpcCA9IEVGSV9JVEVNKGxpcCk7CisJdWludAkJCXNpemU7CiAKIAlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID09IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKIApAQCAtODAsNyArODIsNyBAQAogCXNpemUgKz0gKGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KTsKIAllZmlwLT5lZmlfZm9ybWF0LmVmaV9zaXplID0gMTsKIAotCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmaXAtPmVmaV9mb3JtYXQpOworCWxvZ192ZWN0b3ItPmlfYWRkciA9ICZlZmlwLT5lZmlfZm9ybWF0OwogCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKIAlsb2dfdmVjdG9yLT5pX3R5cGUgPSBYTE9HX1JFR19UWVBFX0VGSV9GT1JNQVQ7CiAJQVNTRVJUKHNpemUgPj0gc2l6ZW9mKHhmc19lZmlfbG9nX2Zvcm1hdF90KSk7CkBAIC05MCw2MCArOTIsMzMgQEAKIC8qCiAgKiBQaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBlZmkgaXRlbSwgc28ganVzdCByZXR1cm4uCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmlfaXRlbV9waW4oeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreGZzX2VmaV9pdGVtX3BpbigKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JcmV0dXJuOwogfQogCi0KIC8qCiAgKiBXaGlsZSBFRklzIGNhbm5vdCByZWFsbHkgYmUgcGlubmVkLCB0aGUgdW5waW4gb3BlcmF0aW9uIGlzIHRoZQogICogbGFzdCBwbGFjZSBhdCB3aGljaCB0aGUgRUZJIGlzIG1hbmlwdWxhdGVkIGR1cmluZyBhIHRyYW5zYWN0aW9uLgogICogSGVyZSB3ZSBjb29yZGluYXRlIHdpdGggeGZzX2VmaV9jYW5jZWwoKSB0byBkZXRlcm1pbmUgd2hvIGdldHMgdG8KICAqIGZyZWUgdGhlIEVGSS4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgdm9pZAoteGZzX2VmaV9pdGVtX3VucGluKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCkKK3hmc19lZmlfaXRlbV91bnBpbigKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJaW50CQkJcmVtb3ZlKQogewotCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGVmaXAtPmVmaV9pdGVtLmxpX2FpbHA7CisJc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0JKmVmaXAgPSBFRklfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGxpcC0+bGlfYWlscDsKIAogCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ0FOQ0VMRUQpIHsKLQkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suICovCi0JCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXApOwotCQl4ZnNfZWZpX2l0ZW1fZnJlZShlZmlwKTsKLQl9IGVsc2UgewotCQllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7Ci0JCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQl9Ci19Ci0KLS8qCi0gKiBsaWtlIHVucGluIG9ubHkgd2UgaGF2ZSB0byBhbHNvIGNsZWFyIHRoZSB4YWN0aW9uIGRlc2NyaXB0b3IKLSAqIHBvaW50aW5nIHRoZSBsb2cgaXRlbSBpZiB3ZSBmcmVlIHRoZSBpdGVtLiAgVGhpcyByb3V0aW5lIGR1cGxpY2F0ZXMKLSAqIHVucGluIGJlY2F1c2UgZWZpX2ZsYWdzIGlzIHByb3RlY3RlZCBieSB0aGUgQUlMIGxvY2suICBGcmVlaW5nCi0gKiB0aGUgZGVzY3JpcHRvciBhbmQgdGhlbiBjYWxsaW5nIHVucGluIHdvdWxkIGZvcmNlIHVzIHRvIGRyb3AgdGhlIEFJTAotICogbG9jayB3aGljaCB3b3VsZCBvcGVuIHVwIGEgcmFjZSBjb25kaXRpb24uCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfZWZpX2l0ZW1fdW5waW5fcmVtb3ZlKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCwgeGZzX3RyYW5zX3QgKnRwKQotewotCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGVmaXAtPmVmaV9pdGVtLmxpX2FpbHA7Ci0JeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKLQotCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7Ci0JaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ0FOQ0VMRUQpIHsKLQkJLyoKLQkJICogZnJlZSB0aGUgeGFjdGlvbiBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHRoaXMgaXRlbQotCQkgKi8KLQkJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCAqKSBlZmlwKTsKLQkJeGZzX3RyYW5zX2ZyZWVfaXRlbSh0cCwgbGlkcCk7CisJCWlmIChyZW1vdmUpCisJCQl4ZnNfdHJhbnNfZGVsX2l0ZW0obGlwKTsKIAogCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KLQkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCk7CisJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CiAJCXhmc19lZmlfaXRlbV9mcmVlKGVmaXApOwogCX0gZWxzZSB7CiAJCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX0NPTU1JVFRFRDsKQEAgLTE1OCw5ICsxMzMsOSBAQAogICogWEZTX0lURU1fUElOTkVEIHNvIHRoYXQgdGhlIGNhbGxlciB3aWxsIGV2ZW50dWFsbHkgZmx1c2ggdGhlIGxvZy4KICAqIFRoaXMgc2hvdWxkIGhlbHAgaW4gZ2V0dGluZyB0aGUgRUZJIG91dCBvZiB0aGUgQUlMLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB1aW50Ci14ZnNfZWZpX2l0ZW1fdHJ5bG9jayh4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXApCit4ZnNfZWZpX2l0ZW1fdHJ5bG9jaygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7CiAJcmV0dXJuIFhGU19JVEVNX1BJTk5FRDsKIH0KQEAgLTE2OCwxMyArMTQzLDEyIEBACiAvKgogICogRWZpIGl0ZW1zIGhhdmUgbm8gbG9ja2luZywgc28ganVzdCByZXR1cm4uCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmlfaXRlbV91bmxvY2soeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreGZzX2VmaV9pdGVtX3VubG9jaygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JaWYgKGVmaXAtPmVmaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpCi0JCXhmc19lZmlfaXRlbV9mcmVlKGVmaXApOwotCXJldHVybjsKKwlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKQorCQl4ZnNfZWZpX2l0ZW1fZnJlZShFRklfSVRFTShsaXApKTsKIH0KIAogLyoKQEAgLTE4Myw5ICsxNTcsMTAgQEAKICAqIGZsYWcgaXMgbm90IHBhaWQgYW55IGF0dGVudGlvbiBoZXJlLiAgQ2hlY2tpbmcgZm9yIHRoYXQgaXMgZGVsYXllZAogICogdW50aWwgdGhlIEVGSSBpcyB1bnBpbm5lZC4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgeGZzX2xzbl90Ci14ZnNfZWZpX2l0ZW1fY29tbWl0dGVkKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCwgeGZzX2xzbl90IGxzbikKK3hmc19lZmlfaXRlbV9jb21taXR0ZWQoCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCXhmc19sc25fdAkJbHNuKQogewogCXJldHVybiBsc247CiB9CkBAIC0xOTUsMTEgKzE3MCwxMCBAQAogICogc3R1Y2sgd2FpdGluZyBmb3IgYWxsIG9mIGl0cyBjb3JyZXNwb25kaW5nIGVmZCBpdGVtcyB0byBiZQogICogY29tbWl0dGVkIHRvIGRpc2suCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmlfaXRlbV9wdXNoKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCkKK3hmc19lZmlfaXRlbV9wdXNoKAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQlyZXR1cm47CiB9CiAKIC8qCkBAIC0yMDksNjEgKzE4Myw1NSBAQAogICogZXhhbXBsZSwgZm9yIGlub2RlcywgdGhlIGlub2RlIGlzIGxvY2tlZCB0aHJvdWdob3V0IHRoZSBleHRlbnQgZnJlZWluZwogICogc28gdGhlIGRlcGVuZGVuY3kgc2hvdWxkIGJlIHJlY29yZGVkIHRoZXJlLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB2b2lkCi14ZnNfZWZpX2l0ZW1fY29tbWl0dGluZyh4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXAsIHhmc19sc25fdCBsc24pCit4ZnNfZWZpX2l0ZW1fY29tbWl0dGluZygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQlsc24pCiB7Ci0JcmV0dXJuOwogfQogCiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGVmaSBsb2cgaXRlbXMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmlfaXRlbV9vcHMgPSB7Ci0JLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fc2l6ZSwKLQkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCi0JCQkJCXhmc19lZmlfaXRlbV9mb3JtYXQsCi0JLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV9waW4sCi0JLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmaV9pdGVtX3VucGluLAotCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCAqKSkKLQkJCQkJeGZzX2VmaV9pdGVtX3VucGluX3JlbW92ZSwKLQkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV90cnlsb2NrLAotCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fdW5sb2NrLAotCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCi0JCQkJCXhmc19lZmlfaXRlbV9jb21taXR0ZWQsCi0JLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fcHVzaCwKLQkuaW9wX3B1c2hidWYJPSBOVUxMLAotCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKLQkJCQkJeGZzX2VmaV9pdGVtX2NvbW1pdHRpbmcKKwkuaW9wX3NpemUJPSB4ZnNfZWZpX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9IHhmc19lZmlfaXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSB4ZnNfZWZpX2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSB4ZnNfZWZpX2l0ZW1fdW5waW4sCisJLmlvcF90cnlsb2NrCT0geGZzX2VmaV9pdGVtX3RyeWxvY2ssCisJLmlvcF91bmxvY2sJPSB4ZnNfZWZpX2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0geGZzX2VmaV9pdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSB4ZnNfZWZpX2l0ZW1fcHVzaCwKKwkuaW9wX2NvbW1pdHRpbmcgPSB4ZnNfZWZpX2l0ZW1fY29tbWl0dGluZwogfTsKIAogCiAvKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZWZpIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGV4dGVudHMuCiAgKi8KLXhmc19lZmlfbG9nX2l0ZW1fdCAqCi14ZnNfZWZpX2luaXQoeGZzX21vdW50X3QJKm1wLAotCSAgICAgdWludAkJbmV4dGVudHMpCitzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbSAqCit4ZnNfZWZpX2luaXQoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJdWludAkJCW5leHRlbnRzKQogCiB7Ci0JeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwOworCXN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSplZmlwOwogCXVpbnQJCQlzaXplOwogCiAJQVNTRVJUKG5leHRlbnRzID4gMCk7CiAJaWYgKG5leHRlbnRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CiAJCXNpemUgPSAodWludCkoc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCkgKwogCQkJKChuZXh0ZW50cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCkpKTsKLQkJZWZpcCA9ICh4ZnNfZWZpX2xvZ19pdGVtX3QqKWttZW1femFsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwkJZWZpcCA9IGttZW1femFsbG9jKHNpemUsIEtNX1NMRUVQKTsKIAl9IGVsc2UgewotCQllZmlwID0gKHhmc19lZmlfbG9nX2l0ZW1fdCopa21lbV96b25lX3phbGxvYyh4ZnNfZWZpX3pvbmUsCi0JCQkJCQkJICAgICBLTV9TTEVFUCk7CisJCWVmaXAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19lZmlfem9uZSwgS01fU0xFRVApOwogCX0KIAogCXhmc19sb2dfaXRlbV9pbml0KG1wLCAmZWZpcC0+ZWZpX2l0ZW0sIFhGU19MSV9FRkksICZ4ZnNfZWZpX2l0ZW1fb3BzKTsKIAllZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50cyA9IG5leHRlbnRzOwogCWVmaXAtPmVmaV9mb3JtYXQuZWZpX2lkID0gKF9fcHNpbnRfdCkodm9pZCopZWZpcDsKIAotCXJldHVybiAoZWZpcCk7CisJcmV0dXJuIGVmaXA7CiB9CiAKIC8qCkBAIC0yNzYsNyArMjQ0LDcgQEAKIGludAogeGZzX2VmaV9jb3B5X2Zvcm1hdCh4ZnNfbG9nX2lvdmVjX3QgKmJ1ZiwgeGZzX2VmaV9sb2dfZm9ybWF0X3QgKmRzdF9lZmlfZm10KQogewotCXhmc19lZmlfbG9nX2Zvcm1hdF90ICpzcmNfZWZpX2ZtdCA9ICh4ZnNfZWZpX2xvZ19mb3JtYXRfdCAqKWJ1Zi0+aV9hZGRyOworCXhmc19lZmlfbG9nX2Zvcm1hdF90ICpzcmNfZWZpX2ZtdCA9IGJ1Zi0+aV9hZGRyOwogCXVpbnQgaTsKIAl1aW50IGxlbiA9IHNpemVvZih4ZnNfZWZpX2xvZ19mb3JtYXRfdCkgKyAKIAkJKHNyY19lZmlfZm10LT5lZmlfbmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOyAgCkBAIC0yODksOCArMjU3LDcgQEAKIAkJbWVtY3B5KChjaGFyICopZHN0X2VmaV9mbXQsIChjaGFyKilzcmNfZWZpX2ZtdCwgbGVuKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChidWYtPmlfbGVuID09IGxlbjMyKSB7Ci0JCXhmc19lZmlfbG9nX2Zvcm1hdF8zMl90ICpzcmNfZWZpX2ZtdF8zMiA9Ci0JCQkoeGZzX2VmaV9sb2dfZm9ybWF0XzMyX3QgKilidWYtPmlfYWRkcjsKKwkJeGZzX2VmaV9sb2dfZm9ybWF0XzMyX3QgKnNyY19lZmlfZm10XzMyID0gYnVmLT5pX2FkZHI7CiAKIAkJZHN0X2VmaV9mbXQtPmVmaV90eXBlICAgICA9IHNyY19lZmlfZm10XzMyLT5lZmlfdHlwZTsKIAkJZHN0X2VmaV9mbXQtPmVmaV9zaXplICAgICA9IHNyY19lZmlfZm10XzMyLT5lZmlfc2l6ZTsKQEAgLTMwNCw4ICsyNzEsNyBAQAogCQl9CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoYnVmLT5pX2xlbiA9PSBsZW42NCkgewotCQl4ZnNfZWZpX2xvZ19mb3JtYXRfNjRfdCAqc3JjX2VmaV9mbXRfNjQgPQotCQkJKHhmc19lZmlfbG9nX2Zvcm1hdF82NF90ICopYnVmLT5pX2FkZHI7CisJCXhmc19lZmlfbG9nX2Zvcm1hdF82NF90ICpzcmNfZWZpX2ZtdF82NCA9IGJ1Zi0+aV9hZGRyOwogCiAJCWRzdF9lZmlfZm10LT5lZmlfdHlwZSAgICAgPSBzcmNfZWZpX2ZtdF82NC0+ZWZpX3R5cGU7CiAJCWRzdF9lZmlfZm10LT5lZmlfc2l6ZSAgICAgPSBzcmNfZWZpX2ZtdF82NC0+ZWZpX3NpemU7CkBAIC0zNTYsMTYgKzMyMiwxOCBAQAogCX0KIH0KIAotU1RBVElDIHZvaWQKLXhmc19lZmRfaXRlbV9mcmVlKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhmc19lZmRfbG9nX2l0ZW0gKkVGRF9JVEVNKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKIHsKLQlpbnQgbmV4dHMgPSBlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50czsKKwlyZXR1cm4gY29udGFpbmVyX29mKGxpcCwgc3RydWN0IHhmc19lZmRfbG9nX2l0ZW0sIGVmZF9pdGVtKTsKK30KIAotCWlmIChuZXh0cyA+IFhGU19FRkRfTUFYX0ZBU1RfRVhURU5UUykgeworU1RBVElDIHZvaWQKK3hmc19lZmRfaXRlbV9mcmVlKHN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtICplZmRwKQoreworCWlmIChlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyA+IFhGU19FRkRfTUFYX0ZBU1RfRVhURU5UUykKIAkJa21lbV9mcmVlKGVmZHApOwotCX0gZWxzZSB7CisJZWxzZQogCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZWZkX3pvbmUsIGVmZHApOwotCX0KIH0KIAogLyoKQEAgLTM3Myw5ICszNDEsOSBAQAogICogV2Ugb25seSBuZWVkIDEgaW92ZWMgZm9yIGFuIGVmZCBpdGVtLiAgSXQganVzdCBsb2dzIHRoZSBlZmRfbG9nX2Zvcm1hdAogICogc3RydWN0dXJlLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB1aW50Ci14ZnNfZWZkX2l0ZW1fc2l6ZSh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHApCit4ZnNfZWZkX2l0ZW1fc2l6ZSgKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7CiAJcmV0dXJuIDE7CiB9CkBAIC0zODgsMTAgKzM1NiwxMiBAQAogICogc2xvdHMgaW4gdGhlIGVmZCBpdGVtIGhhdmUgYmVlbiBmaWxsZWQuCiAgKi8KIFNUQVRJQyB2b2lkCi14ZnNfZWZkX2l0ZW1fZm9ybWF0KHhmc19lZmRfbG9nX2l0ZW1fdAkqZWZkcCwKLQkJICAgIHhmc19sb2dfaW92ZWNfdAkqbG9nX3ZlY3RvcikKK3hmc19lZmRfaXRlbV9mb3JtYXQoCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCXN0cnVjdCB4ZnNfbG9nX2lvdmVjCSpsb2dfdmVjdG9yKQogewotCXVpbnQJc2l6ZTsKKwlzdHJ1Y3QgeGZzX2VmZF9sb2dfaXRlbQkqZWZkcCA9IEVGRF9JVEVNKGxpcCk7CisJdWludAkJCXNpemU7CiAKIAlBU1NFUlQoZWZkcC0+ZWZkX25leHRfZXh0ZW50ID09IGVmZHAtPmVmZF9mb3JtYXQuZWZkX25leHRlbnRzKTsKIApAQCAtNDAxLDQ4ICszNzEsMzggQEAKIAlzaXplICs9IChlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CiAJZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfc2l6ZSA9IDE7CiAKLQlsb2dfdmVjdG9yLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJihlZmRwLT5lZmRfZm9ybWF0KTsKKwlsb2dfdmVjdG9yLT5pX2FkZHIgPSAmZWZkcC0+ZWZkX2Zvcm1hdDsKIAlsb2dfdmVjdG9yLT5pX2xlbiA9IHNpemU7CiAJbG9nX3ZlY3Rvci0+aV90eXBlID0gWExPR19SRUdfVFlQRV9FRkRfRk9STUFUOwogCUFTU0VSVChzaXplID49IHNpemVvZih4ZnNfZWZkX2xvZ19mb3JtYXRfdCkpOwogfQogCi0KIC8qCiAgKiBQaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBlZmQgaXRlbSwgc28ganVzdCByZXR1cm4uCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmRfaXRlbV9waW4oeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwKQoreGZzX2VmZF9pdGVtX3BpbigKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JcmV0dXJuOwogfQogCi0KIC8qCiAgKiBTaW5jZSBwaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBlZmQgaXRlbSwgdW5waW5uaW5nIGRvZXMKICAqIG5vdCBlaXRoZXIuCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmRfaXRlbV91bnBpbih4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHApCit4ZnNfZWZkX2l0ZW1fdW5waW4oCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCWludAkJCXJlbW92ZSkKIHsKLQlyZXR1cm47Ci19Ci0KLS8qQVJHU1VTRUQqLwotU1RBVElDIHZvaWQKLXhmc19lZmRfaXRlbV91bnBpbl9yZW1vdmUoeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwLCB4ZnNfdHJhbnNfdCAqdHApCi17Ci0JcmV0dXJuOwogfQogCiAvKgogICogRWZkIGl0ZW1zIGhhdmUgbm8gbG9ja2luZywgc28ganVzdCByZXR1cm4gc3VjY2Vzcy4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgdWludAoteGZzX2VmZF9pdGVtX3RyeWxvY2soeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwKQoreGZzX2VmZF9pdGVtX3RyeWxvY2soCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewogCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7CiB9CkBAIC00NTEsMTMgKzQxMSwxMiBAQAogICogRWZkIGl0ZW1zIGhhdmUgbm8gbG9ja2luZyBvciBwdXNoaW5nLCBzbyByZXR1cm4gZmFpbHVyZQogICogc28gdGhhdCB0aGUgY2FsbGVyIGRvZXNuJ3QgYm90aGVyIHdpdGggdXMuCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmRfaXRlbV91bmxvY2soeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwKQoreGZzX2VmZF9pdGVtX3VubG9jaygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JaWYgKGVmZHAtPmVmZF9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpCi0JCXhmc19lZmRfaXRlbV9mcmVlKGVmZHApOwotCXJldHVybjsKKwlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKQorCQl4ZnNfZWZkX2l0ZW1fZnJlZShFRkRfSVRFTShsaXApKTsKIH0KIAogLyoKQEAgLTQ2NywxNSArNDI2LDE4IEBACiAgKiByZXR1cm4gLTEgdG8ga2VlcCB0aGUgdHJhbnNhY3Rpb24gY29kZSBmcm9tIGZ1cnRoZXIgcmVmZXJlbmNpbmcKICAqIHRoaXMgaXRlbS4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgeGZzX2xzbl90Ci14ZnNfZWZkX2l0ZW1fY29tbWl0dGVkKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCwgeGZzX2xzbl90IGxzbikKK3hmc19lZmRfaXRlbV9jb21taXR0ZWQoCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCXhmc19sc25fdAkJbHNuKQogeworCXN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtCSplZmRwID0gRUZEX0lURU0obGlwKTsKKwogCS8qCiAJICogSWYgd2UgZ290IGEgbG9nIEkvTyBlcnJvciwgaXQncyBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUgTFIgd2l0aCB0aGUKIAkgKiBFRkkgZ290IHVucGlubmVkIGFuZCBmcmVlZCBiZWZvcmUgdGhlIEVGRCBnb3QgYWJvcnRlZC4KIAkgKi8KLQlpZiAoKGVmZHAtPmVmZF9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpID09IDApCisJaWYgKCEobGlwLT5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKSkKIAkJeGZzX2VmaV9yZWxlYXNlKGVmZHAtPmVmZF9lZmlwLCBlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyk7CiAKIAl4ZnNfZWZkX2l0ZW1fZnJlZShlZmRwKTsKQEAgLTQ4NiwxMSArNDQ4LDEwIEBACiAgKiBUaGVyZSBpc24ndCBtdWNoIHlvdSBjYW4gZG8gdG8gcHVzaCBvbiBhbiBlZmQgaXRlbS4gIEl0IGlzIHNpbXBseQogICogc3R1Y2sgd2FpdGluZyBmb3IgdGhlIGxvZyB0byBiZSBmbHVzaGVkIHRvIGRpc2suCiAgKi8KLS8qQVJHU1VTRUQqLwogU1RBVElDIHZvaWQKLXhmc19lZmRfaXRlbV9wdXNoKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3hmc19lZmRfaXRlbV9wdXNoKAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQlyZXR1cm47CiB9CiAKIC8qCkBAIC01MDAsNTUgKzQ2MSw0OCBAQAogICogZXhhbXBsZSwgZm9yIGlub2RlcywgdGhlIGlub2RlIGlzIGxvY2tlZCB0aHJvdWdob3V0IHRoZSBleHRlbnQgZnJlZWluZwogICogc28gdGhlIGRlcGVuZGVuY3kgc2hvdWxkIGJlIHJlY29yZGVkIHRoZXJlLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB2b2lkCi14ZnNfZWZkX2l0ZW1fY29tbWl0dGluZyh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmaXAsIHhmc19sc25fdCBsc24pCit4ZnNfZWZkX2l0ZW1fY29tbWl0dGluZygKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQlsc24pCiB7Ci0JcmV0dXJuOwogfQogCiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGVmZCBsb2cgaXRlbXMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmRfaXRlbV9vcHMgPSB7Ci0JLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZkX2l0ZW1fc2l6ZSwKLQkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCi0JCQkJCXhmc19lZmRfaXRlbV9mb3JtYXQsCi0JLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmRfaXRlbV9waW4sCi0JLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmZF9pdGVtX3VucGluLAotCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCopKQotCQkJCQl4ZnNfZWZkX2l0ZW1fdW5waW5fcmVtb3ZlLAotCS5pb3BfdHJ5bG9jawk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmZF9pdGVtX3RyeWxvY2ssCi0JLmlvcF91bmxvY2sJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmRfaXRlbV91bmxvY2ssCi0JLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKLQkJCQkJeGZzX2VmZF9pdGVtX2NvbW1pdHRlZCwKLQkuaW9wX3B1c2gJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmRfaXRlbV9wdXNoLAotCS5pb3BfcHVzaGJ1Zgk9IE5VTEwsCi0JLmlvcF9jb21taXR0aW5nID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQotCQkJCQl4ZnNfZWZkX2l0ZW1fY29tbWl0dGluZworCS5pb3Bfc2l6ZQk9IHhmc19lZmRfaXRlbV9zaXplLAorCS5pb3BfZm9ybWF0CT0geGZzX2VmZF9pdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9IHhmc19lZmRfaXRlbV9waW4sCisJLmlvcF91bnBpbgk9IHhmc19lZmRfaXRlbV91bnBpbiwKKwkuaW9wX3RyeWxvY2sJPSB4ZnNfZWZkX2l0ZW1fdHJ5bG9jaywKKwkuaW9wX3VubG9jawk9IHhmc19lZmRfaXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSB4ZnNfZWZkX2l0ZW1fY29tbWl0dGVkLAorCS5pb3BfcHVzaAk9IHhmc19lZmRfaXRlbV9wdXNoLAorCS5pb3BfY29tbWl0dGluZyA9IHhmc19lZmRfaXRlbV9jb21taXR0aW5nCiB9OwogCi0KIC8qCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlZmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgZXh0ZW50cy4KICAqLwoteGZzX2VmZF9sb2dfaXRlbV90ICoKLXhmc19lZmRfaW5pdCh4ZnNfbW91bnRfdAkqbXAsCi0JICAgICB4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCi0JICAgICB1aW50CQluZXh0ZW50cykKK3N0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtICoKK3hmc19lZmRfaW5pdCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbQkqZWZpcCwKKwl1aW50CQkJbmV4dGVudHMpCiAKIHsKLQl4ZnNfZWZkX2xvZ19pdGVtX3QJKmVmZHA7CisJc3RydWN0IHhmc19lZmRfbG9nX2l0ZW0JKmVmZHA7CiAJdWludAkJCXNpemU7CiAKIAlBU1NFUlQobmV4dGVudHMgPiAwKTsKIAlpZiAobmV4dGVudHMgPiBYRlNfRUZEX01BWF9GQVNUX0VYVEVOVFMpIHsKIAkJc2l6ZSA9ICh1aW50KShzaXplb2YoeGZzX2VmZF9sb2dfaXRlbV90KSArCiAJCQkoKG5leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpOwotCQllZmRwID0gKHhmc19lZmRfbG9nX2l0ZW1fdCopa21lbV96YWxsb2Moc2l6ZSwgS01fU0xFRVApOworCQllZmRwID0ga21lbV96YWxsb2Moc2l6ZSwgS01fU0xFRVApOwogCX0gZWxzZSB7Ci0JCWVmZHAgPSAoeGZzX2VmZF9sb2dfaXRlbV90KilrbWVtX3pvbmVfemFsbG9jKHhmc19lZmRfem9uZSwKLQkJCQkJCQkgICAgIEtNX1NMRUVQKTsKKwkJZWZkcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2VmZF96b25lLCBLTV9TTEVFUCk7CiAJfQogCiAJeGZzX2xvZ19pdGVtX2luaXQobXAsICZlZmRwLT5lZmRfaXRlbSwgWEZTX0xJX0VGRCwgJnhmc19lZmRfaXRlbV9vcHMpOwpAQCAtNTU2LDUgKzUxMCw1IEBACiAJZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMgPSBuZXh0ZW50czsKIAllZmRwLT5lZmRfZm9ybWF0LmVmZF9lZmlfaWQgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9pZDsKIAotCXJldHVybiAoZWZkcCk7CisJcmV0dXJuIGVmZHA7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYyBiL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5jCmluZGV4IDM5MDg1MGUuLjliNzE1ZGMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5jCisrKyBiL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5jCkBAIC0xOCwxMyArMTgsOSBAQAogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2ludW0uaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgpAQCAtMTI3LDYgKzEyMyw4MiBAQAogCXhmc19pbm9kZV90CSpwaXA7CS8qIFBhcmVudCBkaXJlY3RvcnkgaW5vZGUgcG9pbnRlci4gKi8KIH0gZnN0cm1faXRlbV90OwogCisvKgorICogQWxsb2NhdGlvbiBncm91cCBmaWxlc3RyZWFtIGFzc29jaWF0aW9ucyBhcmUgdHJhY2tlZCB3aXRoIHBlci1hZyBhdG9taWMKKyAqIGNvdW50ZXJzLiAgVGhlc2UgY291bnRlcnMgYWxsb3cgX3hmc19maWxlc3RyZWFtX3BpY2tfYWcoKSB0byB0ZWxsIHdoZXRoZXIgYQorICogcGFydGljdWxhciBBRyBhbHJlYWR5IGhhcyBhY3RpdmUgZmlsZXN0cmVhbXMgYXNzb2NpYXRlZCB3aXRoIGl0LiBUaGUgbW91bnQKKyAqIHBvaW50J3MgbV9wZXJhZ2xvY2sgaXMgdXNlZCB0byBwcm90ZWN0IHRoZXNlIGNvdW50ZXJzIGZyb20gcGVyLWFnIGFycmF5CisgKiByZS1hbGxvY2F0aW9uIGR1cmluZyBhIGdyb3dmcyBvcGVyYXRpb24uICBXaGVuIHhmc19ncm93ZnNfZGF0YV9wcml2YXRlKCkgaXMKKyAqIGFib3V0IHRvIHJlYWxsb2NhdGUgdGhlIGFycmF5LCBpdCBjYWxscyB4ZnNfZmlsZXN0cmVhbV9mbHVzaCgpIHdpdGggdGhlCisgKiBtX3BlcmFnbG9jayBoZWxkIGluIHdyaXRlIG1vZGUuCisgKgorICogU2luY2UgeGZzX21ydV9jYWNoZV9mbHVzaCgpIGd1YXJhbnRlZXMgdGhhdCBhbGwgdGhlIGZyZWUgZnVuY3Rpb25zIGZvciBhbGwKKyAqIHRoZSBjYWNoZSBlbGVtZW50cyBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZyBiZWZvcmUgaXQgcmV0dXJucywgaXQncyBzYWZlIGZvcgorICogdGhlIGZyZWUgZnVuY3Rpb25zIHRvIHVzZSB0aGUgYXRvbWljIGNvdW50ZXJzIHdpdGhvdXQgbV9wZXJhZ2xvY2sgcHJvdGVjdGlvbi4KKyAqIFRoaXMgYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB4ZnNfZnN0cm1fZnJlZV9mdW5jKCkgdG8gYmUgYWdub3N0aWMgYWJvdXQKKyAqIHdoZXRoZXIgaXQgd2FzIGNhbGxlZCB3aXRoIHRoZSBtX3BlcmFnbG9jayBoZWxkIGluIHJlYWQgbW9kZSwgd3JpdGUgbW9kZSBvcgorICogbm90IGhlbGQgYXQgYWxsLiAgVGhlIHJhY2UgY29uZGl0aW9uIHRoaXMgYWRkcmVzc2VzIGlzIHRoZSBmb2xsb3dpbmc6CisgKgorICogIC0gVGhlIHdvcmsgcXVldWUgc2NoZWR1bGVyIGZpcmVzIGFuZCBwdWxscyBhIGZpbGVzdHJlYW0gZGlyZWN0b3J5IGNhY2hlCisgKiAgICBlbGVtZW50IG9mZiB0aGUgTFJVIGVuZCBvZiB0aGUgY2FjaGUgZm9yIGRlbGV0aW9uLCB0aGVuIGdldHMgcHJlLWVtcHRlZC4KKyAqICAtIEEgZ3Jvd2ZzIG9wZXJhdGlvbiBncmFicyB0aGUgbV9wZXJhZ2xvY2sgaW4gd3JpdGUgbW9kZSwgZmx1c2hlcyBhbGwgdGhlCisgKiAgICByZW1haW5pbmcgaXRlbXMgZnJvbSB0aGUgY2FjaGUgYW5kIHJlYWxsb2NhdGVzIHRoZSBtb3VudCBwb2ludCdzIHBlci1hZworICogICAgYXJyYXksIHJlc2V0dGluZyBhbGwgdGhlIGNvdW50ZXJzIHRvIHplcm8uCisgKiAgLSBUaGUgd29yayBxdWV1ZSB0aHJlYWQgcmVzdW1lcyBhbmQgY2FsbHMgdGhlIGZyZWUgZnVuY3Rpb24gZm9yIHRoZSBlbGVtZW50CisgKiAgICBpdCBzdGFydGVkIGNsZWFuaW5nIHVwIGVhcmxpZXIuICBJbiB0aGUgcHJvY2VzcyBpdCBkZWNyZW1lbnRzIHRoZQorICogICAgZmlsZXN0cmVhbXMgY291bnRlciBmb3IgYW4gQUcgdGhhdCBub3cgaGFzIG5vIHJlZmVyZW5jZXMuCisgKgorICogV2l0aCBhIHNocmlua2ZzIGZlYXR1cmUsIHRoZSBhYm92ZSBzY2VuYXJpbyBjb3VsZCBwYW5pYyB0aGUgc3lzdGVtLgorICoKKyAqIEFsbCBvdGhlciB1c2VzIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgZWl0aGVyIHRoZQorICogbV9wZXJhZ2xvY2sgaGVsZCBpbiByZWFkIG1vZGUsIG9yIHRoZSBjYWNoZSdzIGludGVybmFsIGxvY2tpbmcgZXhwb3NlZCBieSB0aGUKKyAqIGludGVydmFsIGJldHdlZW4gYSBjYWxsIHRvIHhmc19tcnVfY2FjaGVfbG9va3VwKCkgYW5kIGEgY2FsbCB0bworICogeGZzX21ydV9jYWNoZV9kb25lKCkuICBJbiBhZGRpdGlvbiwgdGhlIG1fcGVyYWdsb2NrIG11c3QgYmUgaGVsZCBpbiByZWFkIG1vZGUKKyAqIHdoZW4gbmV3IGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgY2FjaGUuCisgKgorICogQ29tYmluZWQsIHRoZXNlIGxvY2tpbmcgcnVsZXMgZW5zdXJlIHRoYXQgbm8gYXNzb2NpYXRpb25zIHdpbGwgZXZlciBleGlzdCBpbgorICogdGhlIGNhY2hlIHRoYXQgcmVmZXJlbmNlIHBlci1hZyBhcnJheSBlbGVtZW50cyB0aGF0IGhhdmUgc2luY2UgYmVlbgorICogcmVhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK3hmc19maWxlc3RyZWFtX3BlZWtfYWcoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19hZ251bWJlcl90CWFnbm8pCit7CisJc3RydWN0IHhmc19wZXJhZyAqcGFnOworCWludAkJcmV0OworCisJcGFnID0geGZzX3BlcmFnX2dldChtcCwgYWdubyk7CisJcmV0ID0gYXRvbWljX3JlYWQoJnBhZy0+cGFnZl9mc3RybXMpOworCXhmc19wZXJhZ19wdXQocGFnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit4ZnNfZmlsZXN0cmVhbV9nZXRfYWcoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19hZ251bWJlcl90CWFnbm8pCit7CisJc3RydWN0IHhmc19wZXJhZyAqcGFnOworCWludAkJcmV0OworCisJcGFnID0geGZzX3BlcmFnX2dldChtcCwgYWdubyk7CisJcmV0ID0gYXRvbWljX2luY19yZXR1cm4oJnBhZy0+cGFnZl9mc3RybXMpOworCXhmc19wZXJhZ19wdXQocGFnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoreGZzX2ZpbGVzdHJlYW1fcHV0X2FnKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfYWdudW1iZXJfdAlhZ25vKQoreworCXN0cnVjdCB4ZnNfcGVyYWcgKnBhZzsKKworCXBhZyA9IHhmc19wZXJhZ19nZXQobXAsIGFnbm8pOworCWF0b21pY19kZWMoJnBhZy0+cGFnZl9mc3RybXMpOworCXhmc19wZXJhZ19wdXQocGFnKTsKK30KIAogLyoKICAqIFNjYW4gdGhlIEFHcyBzdGFydGluZyBhdCBzdGFydGFnIGxvb2tpbmcgZm9yIGFuIEFHIHRoYXQgaXNuJ3QgaW4gdXNlIGFuZCBoYXMKQEAgLTM1NSwxNiArNDI3LDE0IEBACiB7CiAJZnN0cm1faXRlbV90CSppdGVtICA9IChmc3RybV9pdGVtX3QgKilkYXRhOwogCXhmc19pbm9kZV90CSppcCA9IGl0ZW0tPmlwOwotCWludCByZWY7CiAKIAlBU1NFUlQoaXAtPmlfaW5vID09IGlubyk7CiAKIAl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSUZJTEVTVFJFQU0pOwogCiAJLyogRHJvcCB0aGUgcmVmZXJlbmNlIHRha2VuIG9uIHRoZSBBRyB3aGVuIHRoZSBpdGVtIHdhcyBhZGRlZC4gKi8KLQlyZWYgPSB4ZnNfZmlsZXN0cmVhbV9wdXRfYWcoaXAtPmlfbW91bnQsIGl0ZW0tPmFnKTsKKwl4ZnNfZmlsZXN0cmVhbV9wdXRfYWcoaXAtPmlfbW91bnQsIGl0ZW0tPmFnKTsKIAotCUFTU0VSVChyZWYgPj0gMCk7CiAJVFJBQ0VfRlJFRShpcC0+aV9tb3VudCwgaXAsIGl0ZW0tPnBpcCwgaXRlbS0+YWcsCiAJCXhmc19maWxlc3RyZWFtX3BlZWtfYWcoaXAtPmlfbW91bnQsIGl0ZW0tPmFnKSk7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5oIGIvZnMveGZzL3hmc19maWxlc3RyZWFtLmgKaW5kZXggMjYwZjc1Ny4uMDlkZDlhZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmgKKysrIGIvZnMveGZzL3hmc19maWxlc3RyZWFtLmgKQEAgLTQyLDg4ICs0Miw2IEBACiAKICNlbmRpZgogCi0vKgotICogQWxsb2NhdGlvbiBncm91cCBmaWxlc3RyZWFtIGFzc29jaWF0aW9ucyBhcmUgdHJhY2tlZCB3aXRoIHBlci1hZyBhdG9taWMKLSAqIGNvdW50ZXJzLiAgVGhlc2UgY291bnRlcnMgYWxsb3cgX3hmc19maWxlc3RyZWFtX3BpY2tfYWcoKSB0byB0ZWxsIHdoZXRoZXIgYQotICogcGFydGljdWxhciBBRyBhbHJlYWR5IGhhcyBhY3RpdmUgZmlsZXN0cmVhbXMgYXNzb2NpYXRlZCB3aXRoIGl0LiBUaGUgbW91bnQKLSAqIHBvaW50J3MgbV9wZXJhZ2xvY2sgaXMgdXNlZCB0byBwcm90ZWN0IHRoZXNlIGNvdW50ZXJzIGZyb20gcGVyLWFnIGFycmF5Ci0gKiByZS1hbGxvY2F0aW9uIGR1cmluZyBhIGdyb3dmcyBvcGVyYXRpb24uICBXaGVuIHhmc19ncm93ZnNfZGF0YV9wcml2YXRlKCkgaXMKLSAqIGFib3V0IHRvIHJlYWxsb2NhdGUgdGhlIGFycmF5LCBpdCBjYWxscyB4ZnNfZmlsZXN0cmVhbV9mbHVzaCgpIHdpdGggdGhlCi0gKiBtX3BlcmFnbG9jayBoZWxkIGluIHdyaXRlIG1vZGUuCi0gKgotICogU2luY2UgeGZzX21ydV9jYWNoZV9mbHVzaCgpIGd1YXJhbnRlZXMgdGhhdCBhbGwgdGhlIGZyZWUgZnVuY3Rpb25zIGZvciBhbGwKLSAqIHRoZSBjYWNoZSBlbGVtZW50cyBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZyBiZWZvcmUgaXQgcmV0dXJucywgaXQncyBzYWZlIGZvcgotICogdGhlIGZyZWUgZnVuY3Rpb25zIHRvIHVzZSB0aGUgYXRvbWljIGNvdW50ZXJzIHdpdGhvdXQgbV9wZXJhZ2xvY2sgcHJvdGVjdGlvbi4KLSAqIFRoaXMgYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB4ZnNfZnN0cm1fZnJlZV9mdW5jKCkgdG8gYmUgYWdub3N0aWMgYWJvdXQKLSAqIHdoZXRoZXIgaXQgd2FzIGNhbGxlZCB3aXRoIHRoZSBtX3BlcmFnbG9jayBoZWxkIGluIHJlYWQgbW9kZSwgd3JpdGUgbW9kZSBvcgotICogbm90IGhlbGQgYXQgYWxsLiAgVGhlIHJhY2UgY29uZGl0aW9uIHRoaXMgYWRkcmVzc2VzIGlzIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogIC0gVGhlIHdvcmsgcXVldWUgc2NoZWR1bGVyIGZpcmVzIGFuZCBwdWxscyBhIGZpbGVzdHJlYW0gZGlyZWN0b3J5IGNhY2hlCi0gKiAgICBlbGVtZW50IG9mZiB0aGUgTFJVIGVuZCBvZiB0aGUgY2FjaGUgZm9yIGRlbGV0aW9uLCB0aGVuIGdldHMgcHJlLWVtcHRlZC4KLSAqICAtIEEgZ3Jvd2ZzIG9wZXJhdGlvbiBncmFicyB0aGUgbV9wZXJhZ2xvY2sgaW4gd3JpdGUgbW9kZSwgZmx1c2hlcyBhbGwgdGhlCi0gKiAgICByZW1haW5pbmcgaXRlbXMgZnJvbSB0aGUgY2FjaGUgYW5kIHJlYWxsb2NhdGVzIHRoZSBtb3VudCBwb2ludCdzIHBlci1hZwotICogICAgYXJyYXksIHJlc2V0dGluZyBhbGwgdGhlIGNvdW50ZXJzIHRvIHplcm8uCi0gKiAgLSBUaGUgd29yayBxdWV1ZSB0aHJlYWQgcmVzdW1lcyBhbmQgY2FsbHMgdGhlIGZyZWUgZnVuY3Rpb24gZm9yIHRoZSBlbGVtZW50Ci0gKiAgICBpdCBzdGFydGVkIGNsZWFuaW5nIHVwIGVhcmxpZXIuICBJbiB0aGUgcHJvY2VzcyBpdCBkZWNyZW1lbnRzIHRoZQotICogICAgZmlsZXN0cmVhbXMgY291bnRlciBmb3IgYW4gQUcgdGhhdCBub3cgaGFzIG5vIHJlZmVyZW5jZXMuCi0gKgotICogV2l0aCBhIHNocmlua2ZzIGZlYXR1cmUsIHRoZSBhYm92ZSBzY2VuYXJpbyBjb3VsZCBwYW5pYyB0aGUgc3lzdGVtLgotICoKLSAqIEFsbCBvdGhlciB1c2VzIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgZWl0aGVyIHRoZQotICogbV9wZXJhZ2xvY2sgaGVsZCBpbiByZWFkIG1vZGUsIG9yIHRoZSBjYWNoZSdzIGludGVybmFsIGxvY2tpbmcgZXhwb3NlZCBieSB0aGUKLSAqIGludGVydmFsIGJldHdlZW4gYSBjYWxsIHRvIHhmc19tcnVfY2FjaGVfbG9va3VwKCkgYW5kIGEgY2FsbCB0bwotICogeGZzX21ydV9jYWNoZV9kb25lKCkuICBJbiBhZGRpdGlvbiwgdGhlIG1fcGVyYWdsb2NrIG11c3QgYmUgaGVsZCBpbiByZWFkIG1vZGUKLSAqIHdoZW4gbmV3IGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgY2FjaGUuCi0gKgotICogQ29tYmluZWQsIHRoZXNlIGxvY2tpbmcgcnVsZXMgZW5zdXJlIHRoYXQgbm8gYXNzb2NpYXRpb25zIHdpbGwgZXZlciBleGlzdCBpbgotICogdGhlIGNhY2hlIHRoYXQgcmVmZXJlbmNlIHBlci1hZyBhcnJheSBlbGVtZW50cyB0aGF0IGhhdmUgc2luY2UgYmVlbgotICogcmVhbGxvY2F0ZWQuCi0gKi8KLS8qCi0gKiB4ZnNfZmlsZXN0cmVhbV9wZWVrX2FnIGlzIG9ubHkgdXNlZCBpbiB0cmFjaW5nIGNvZGUKLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXhmc19maWxlc3RyZWFtX3BlZWtfYWcoCi0JeGZzX21vdW50X3QJKm1wLAotCXhmc19hZ251bWJlcl90CWFnbm8pCi17Ci0Jc3RydWN0IHhmc19wZXJhZyAqcGFnOwotCWludAkJcmV0OwotCi0JcGFnID0geGZzX3BlcmFnX2dldChtcCwgYWdubyk7Ci0JcmV0ID0gYXRvbWljX3JlYWQoJnBhZy0+cGFnZl9mc3RybXMpOwotCXhmc19wZXJhZ19wdXQocGFnKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludAoteGZzX2ZpbGVzdHJlYW1fZ2V0X2FnKAotCXhmc19tb3VudF90CSptcCwKLQl4ZnNfYWdudW1iZXJfdAlhZ25vKQotewotCXN0cnVjdCB4ZnNfcGVyYWcgKnBhZzsKLQlpbnQJCXJldDsKLQotCXBhZyA9IHhmc19wZXJhZ19nZXQobXAsIGFnbm8pOwotCXJldCA9IGF0b21pY19pbmNfcmV0dXJuKCZwYWctPnBhZ2ZfZnN0cm1zKTsKLQl4ZnNfcGVyYWdfcHV0KHBhZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXhmc19maWxlc3RyZWFtX3B1dF9hZygKLQl4ZnNfbW91bnRfdAkqbXAsCi0JeGZzX2FnbnVtYmVyX3QJYWdubykKLXsKLQlzdHJ1Y3QgeGZzX3BlcmFnICpwYWc7Ci0JaW50CQlyZXQ7Ci0KLQlwYWcgPSB4ZnNfcGVyYWdfZ2V0KG1wLCBhZ25vKTsKLQlyZXQgPSBhdG9taWNfZGVjX3JldHVybigmcGFnLT5wYWdmX2ZzdHJtcyk7Ci0JeGZzX3BlcmFnX3B1dChwYWcpOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qIGFsbG9jYXRpb24gc2VsZWN0aW9uIGZsYWdzICovCiB0eXBlZGVmIGVudW0geGZzX2ZzdHJtX2FsbG9jIHsKIAlYRlNfUElDS19VU0VSREFUQSA9IDEsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Zzb3BzLmMgYi9mcy94ZnMveGZzX2Zzb3BzLmMKaW5kZXggMzdhNmY2Mi4uZGJjYTVmNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwpAQCAtMjQsMTQgKzI0LDEwIEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCkBAIC02MjYsOCArNjIyLDcgQEAKIAlpcCA9IG1wLT5tX3Jvb3RpcDsKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKIAllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2MuYyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKaW5kZXggYzcxNDJhMC4uYWJmODBhZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2lhbGxvYy5jCkBAIC0yNCwxNCArMjQsMTAgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYwppbmRleCBjMjgyYTlhLi5kMzUyODYyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmMKQEAgLTI0LDE0ICsyNCwxMCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggOGY4YjkxYi4uYjFlY2M2ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTI1LDE0ICsyNSwxMCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKQEAgLTk1LDcgKzkxLDcgQEAKIAlyZXR1cm4gaXA7CiB9CiAKLVNUQVRJQyB2b2lkCit2b2lkCiB4ZnNfaW5vZGVfZnJlZSgKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCkKIHsKQEAgLTIxMiw3ICsyMDgsNyBAQAogCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JTkVXOwogCQkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNQUJMRTsKIAkJCV9feGZzX2lub2RlX3NldF9yZWNsYWltX3RhZyhwYWcsIGlwKTsKLQkJCXRyYWNlX3hmc19pZ2V0X3JlY2xhaW0oaXApOworCQkJdHJhY2VfeGZzX2lnZXRfcmVjbGFpbV9mYWlsKGlwKTsKIAkJCWdvdG8gb3V0X2Vycm9yOwogCQl9CiAKQEAgLTIyNyw2ICsyMjMsNyBAQAogCX0gZWxzZSB7CiAJCS8qIElmIHRoZSBWRlMgaW5vZGUgaXMgYmVpbmcgdG9ybiBkb3duLCBwYXVzZSBhbmQgdHJ5IGFnYWluLiAqLwogCQlpZiAoIWlncmFiKGlub2RlKSkgeworCQkJdHJhY2VfeGZzX2lnZXRfc2tpcChpcCk7CiAJCQllcnJvciA9IEVBR0FJTjsKIAkJCWdvdG8gb3V0X2Vycm9yOwogCQl9CkBAIC0yMzQsNiArMjMxLDcgQEAKIAkJLyogV2UndmUgZ290IGEgbGl2ZSBvbmUuICovCiAJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJdHJhY2VfeGZzX2lnZXRfaGl0KGlwKTsKIAl9CiAKIAlpZiAobG9ja19mbGFncyAhPSAwKQpAQCAtMjQyLDcgKzI0MCw2IEBACiAJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lTVEFMRSk7CiAJWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7CiAKLQl0cmFjZV94ZnNfaWdldF9mb3VuZChpcCk7CiAJcmV0dXJuIDA7CiAKIG91dF9lcnJvcjoKQEAgLTI2NCw3ICsyNjEsNiBAQAogewogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwOwogCWludAkJCWVycm9yOwotCXVuc2lnbmVkIGxvbmcJCWZpcnN0X2luZGV4LCBtYXNrOwogCXhmc19hZ2lub190CQlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlubyk7CiAKIAlpcCA9IHhmc19pbm9kZV9hbGxvYyhtcCwgaW5vKTsKQEAgLTI3NSw3ICsyNzEsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZGVzdHJveTsKIAotCXhmc19pdHJhY2VfZW50cnkoaXApOworCXRyYWNlX3hmc19pZ2V0X21pc3MoaXApOwogCiAJaWYgKChpcC0+aV9kLmRpX21vZGUgPT0gMCkgJiYgIShmbGFncyAmIFhGU19JR0VUX0NSRUFURSkpIHsKIAkJZXJyb3IgPSBFTk9FTlQ7CkBAIC0zMDEsOCArMjk3LDYgQEAKIAkJCUJVRygpOwogCX0KIAotCW1hc2sgPSB+KCgoWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2cpKSAtIDEpOwotCWZpcnN0X2luZGV4ID0gYWdpbm8gJiBtYXNrOwogCXdyaXRlX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAogCS8qIGluc2VydCB0aGUgbmV3IGlub2RlICovCkBAIC0zMjEsNyArMzE1LDYgQEAKIAl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CiAKLQl0cmFjZV94ZnNfaWdldF9hbGxvYyhpcCk7CiAJKmlwcCA9IGlwOwogCXJldHVybiAwOwogCkBAIC00MjIsOTcgKzQxNSw2IEBACiB9CiAKIC8qCi0gKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIGFuIGlub2RlIHN0cnVjdHVyZSBhbmQgdW5sb2NrIGl0LgotICoKLSAqIGlwIC0tIHRoZSBpbm9kZSBiZWluZyByZWxlYXNlZAotICogbG9ja19mbGFncyAtLSB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGlub2RlJ3MgbG9ja3MgdG8gYmUKLSAqICAgICAgIHRvIGJlIHJlbGVhc2VkLiAgU2VlIHRoZSBjb21tZW50IG9uIHhmc19pdW5sb2NrKCkgZm9yIGEgbGlzdAotICoJIG9mIHZhbGlkIHZhbHVlcy4KLSAqLwotdm9pZAoteGZzX2lwdXQoeGZzX2lub2RlX3QJKmlwLAotCSB1aW50CQlsb2NrX2ZsYWdzKQotewotCXhmc19pdHJhY2VfZW50cnkoaXApOwotCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQlJUkVMRShpcCk7Ci19Ci0KLS8qCi0gKiBTcGVjaWFsIGlwdXQgZm9yIGJyYW5kLW5ldyBpbm9kZXMgdGhhdCBhcmUgc3RpbGwgbG9ja2VkCi0gKi8KLXZvaWQKLXhmc19pcHV0X25ldygKLQl4ZnNfaW5vZGVfdAkqaXAsCi0JdWludAkJbG9ja19mbGFncykKLXsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gVkZTX0koaXApOwotCi0JeGZzX2l0cmFjZV9lbnRyeShpcCk7Ci0KLQlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSkgewotCQlBU1NFUlQoIXhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkpOwotCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7Ci0JfQotCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKQotCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLQlpZiAobG9ja19mbGFncykKLQkJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCUlSRUxFKGlwKTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGZyZWUgYWxsIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGFuIGlub2RlLgotICogSXQgbXVzdCBmcmVlIHRoZSBpbm9kZSBpdHNlbGYgYW5kIGFueSBidWZmZXJzIGFsbG9jYXRlZCBmb3IKLSAqIGlmX2V4dGVudHMvaWZfZGF0YSBhbmQgaWZfYnJvb3QuICBJdCBtdXN0IGFsc28gZnJlZSB0aGUgbG9jawotICogYXNzb2NpYXRlZCB3aXRoIHRoZSBpbm9kZS4KLSAqCi0gKiBOb3RlOiBiZWNhdXNlIHdlIGRvbid0IGluaXRpYWxpc2UgZXZlcnl0aGluZyBvbiByZWFsbG9jYXRpb24gb3V0Ci0gKiBvZiB0aGUgem9uZSwgd2UgbXVzdCBlbnN1cmUgd2UgbnVsbGlmeSBldmVyeXRoaW5nIGNvcnJlY3RseSBiZWZvcmUKLSAqIGZyZWVpbmcgdGhlIHN0cnVjdHVyZS4KLSAqLwotdm9pZAoteGZzX2lyZWNsYWltKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKQotewotCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0Jc3RydWN0IHhmc19wZXJhZwkqcGFnOwotCXhmc19hZ2lub190CQlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubyk7Ci0KLQlYRlNfU1RBVFNfSU5DKHhzX2lnX3JlY2xhaW1zKTsKLQotCS8qCi0JICogUmVtb3ZlIHRoZSBpbm9kZSBmcm9tIHRoZSBwZXItQUcgcmFkaXggdHJlZS4KLQkgKgotCSAqIEJlY2F1c2UgcmFkaXhfdHJlZV9kZWxldGUgd29uJ3QgY29tcGxhaW4gZXZlbiBpZiB0aGUgaXRlbSB3YXMgbmV2ZXIKLQkgKiBhZGRlZCB0byB0aGUgdHJlZSBhc3NlcnQgdGhhdCBpdCdzIGJlZW4gdGhlcmUgYmVmb3JlIHRvIGNhdGNoCi0JICogcHJvYmxlbXMgd2l0aCB0aGUgaW5vZGUgbGlmZSB0aW1lIGVhcmx5IG9uLgotCSAqLwotCXBhZyA9IHhmc19wZXJhZ19nZXQobXAsIFhGU19JTk9fVE9fQUdOTyhtcCwgaXAtPmlfaW5vKSk7Ci0Jd3JpdGVfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCWlmICghcmFkaXhfdHJlZV9kZWxldGUoJnBhZy0+cGFnX2ljaV9yb290LCBhZ2lubykpCi0JCUFTU0VSVCgwKTsKLQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKLQl4ZnNfcGVyYWdfcHV0KHBhZyk7Ci0KLQkvKgotCSAqIEhlcmUgd2UgZG8gYW4gKGFsbW9zdCkgc3B1cmlvdXMgaW5vZGUgbG9jayBpbiBvcmRlciB0byBjb29yZGluYXRlCi0JICogd2l0aCBpbm9kZSBjYWNoZSByYWRpeCB0cmVlIGxvb2t1cHMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGxvb2t1cAotCSAqIGNhbiByZWZlcmVuY2UgdGhlIGlub2RlcyBpbiB0aGUgY2FjaGUgd2l0aG91dCB0YWtpbmcgcmVmZXJlbmNlcy4KLQkgKgotCSAqIFdlIG1ha2UgdGhhdCBPSyBoZXJlIGJ5IGVuc3VyaW5nIHRoYXQgd2Ugd2FpdCB1bnRpbCB0aGUgaW5vZGUgaXMKLQkgKiB1bmxvY2tlZCBhZnRlciB0aGUgbG9va3VwIGJlZm9yZSB3ZSBnbyBhaGVhZCBhbmQgZnJlZSBpdC4gIFdlIGdldAotCSAqIGJvdGggdGhlIGlsb2NrIGFuZCB0aGUgaW9sb2NrIGJlY2F1c2UgdGhlIGNvZGUgbWF5IG5lZWQgdG8gZHJvcCB0aGUKLQkgKiBpbG9jayBvbmUgYnV0IHdpbGwgc3RpbGwgaG9sZCB0aGUgaW9sb2NrLgotCSAqLwotCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCXhmc19xbV9kcWRldGFjaChpcCk7Ci0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKLQotCXhmc19pbm9kZV9mcmVlKGlwKTsKLX0KLQotLyoKICAqIFRoaXMgaXMgYSB3cmFwcGVyIHJvdXRpbmUgYXJvdW5kIHRoZSB4ZnNfaWxvY2soKSByb3V0aW5lCiAgKiB1c2VkIHRvIGNlbnRyYWxpemUgc29tZSBncnVuZ3kgY29kZS4gIEl0IGlzIHVzZWQgaW4gcGxhY2VzCiAgKiB0aGF0IHdpc2ggdG8gbG9jayB0aGUgaW5vZGUgc29sZWx5IGZvciByZWFkaW5nIHRoZSBleHRlbnRzLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5jIGIvZnMveGZzL3hmc19pbm9kZS5jCmluZGV4IGI3NmE4MjkuLjY4NDE1Y2IgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTI3LDEzICsyNywxMCBAQAogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgpAQCAtNDQsNyArNDEsNiBAQAogI2luY2x1ZGUgInhmc19hbGxvYy5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19ydy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgpAQCAtNDI2LDcgKzQyMiw3IEBACiAJaWYgKCFYRlNfREZPUktfUShkaXApKQogCQlyZXR1cm4gMDsKIAlBU1NFUlQoaXAtPmlfYWZwID09IE5VTEwpOwotCWlwLT5pX2FmcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2lmb3JrX3pvbmUsIEtNX1NMRUVQKTsKKwlpcC0+aV9hZnAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19pZm9ya196b25lLCBLTV9TTEVFUCB8IEtNX05PRlMpOwogCWlwLT5pX2FmcC0+aWZfZXh0X21heCA9CiAJCVhGU19JRk9SS19BU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwogCXN3aXRjaCAoZGlwLT5kaV9hZm9ybWF0KSB7CkBAIC01MDksNyArNTA1LDcgQEAKIAkJaWZwLT5pZl91MS5pZl9kYXRhID0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YTsKIAllbHNlIHsKIAkJcmVhbF9zaXplID0gcm91bmR1cChzaXplLCA0KTsKLQkJaWZwLT5pZl91MS5pZl9kYXRhID0ga21lbV9hbGxvYyhyZWFsX3NpemUsIEtNX1NMRUVQKTsKKwkJaWZwLT5pZl91MS5pZl9kYXRhID0ga21lbV9hbGxvYyhyZWFsX3NpemUsIEtNX1NMRUVQIHwgS01fTk9GUyk7CiAJfQogCWlmcC0+aWZfYnl0ZXMgPSBzaXplOwogCWlmcC0+aWZfcmVhbF9ieXRlcyA9IHJlYWxfc2l6ZTsKQEAgLTYzNiw3ICs2MzIsNyBAQAogCX0KIAogCWlmcC0+aWZfYnJvb3RfYnl0ZXMgPSBzaXplOwotCWlmcC0+aWZfYnJvb3QgPSBrbWVtX2FsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwlpZnAtPmlmX2Jyb290ID0ga21lbV9hbGxvYyhzaXplLCBLTV9TTEVFUCB8IEtNX05PRlMpOwogCUFTU0VSVChpZnAtPmlmX2Jyb290ICE9IE5VTEwpOwogCS8qCiAJICogQ29weSBhbmQgY29udmVydCBmcm9tIHRoZSBvbi1kaXNrIHN0cnVjdHVyZQpAQCAtOTIyLDcgKzkxOCw2IEBACiAJaW50CQllcnJvcjsKIAl4ZnNfaWZvcmtfdAkqaWZwOwogCXhmc19leHRudW1fdAluZXh0ZW50czsKLQlzaXplX3QJCXNpemU7CiAKIAlpZiAodW5saWtlbHkoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkpIHsKIAkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2lyZWFkX2V4dGVudHMiLCBYRlNfRVJSTEVWRUxfTE9XLApAQCAtOTMwLDcgKzkyNSw2IEBACiAJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKIAl9CiAJbmV4dGVudHMgPSBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yayk7Ci0Jc2l6ZSA9IG5leHRlbnRzICogc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKIAlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwogCiAJLyoKQEAgLTEyMjYsNyArMTIyMCw3IEBACiAJCQkJICAgICAgICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKSAtCiAJCQkgIG1hcF9maXJzdCksCiAJCQkgWEZTX0JNQVBJX0VOVElSRSwgTlVMTCwgMCwgaW1hcHMsICZuaW1hcHMsCi0JCQkgTlVMTCwgTlVMTCkpCisJCQkgTlVMTCkpCiAJICAgIHJldHVybjsKIAlBU1NFUlQobmltYXBzID09IDEpOwogCUFTU0VSVChpbWFwc1swXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKTsKQEAgLTE0NjAsNyArMTQ1NCw3IEBACiAJQVNTRVJUKCgqdHApLT50X2ZsYWdzICYgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUyk7CiAJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSAqdHApOwogCUFTU0VSVChpcC0+aV9pdGVtcCAhPSBOVUxMKTsKLQlBU1NFUlQoaXAtPmlfaXRlbXAtPmlsaV9mbGFncyAmIFhGU19JTElfSE9MRCk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wLT5pbGlfbG9ja19mbGFncyA9PSAwKTsKIAogCiAJbnRwID0gKnRwOwpAQCAtMTU4OSwxMSArMTU4MywxMCBAQAogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CiAJCWVycm9yID0geGZzX2J1bm1hcGkobnRwLCBpcCwKIAkJCQkgICAgZmlyc3RfdW5tYXBfYmxvY2ssIHVubWFwX2xlbiwKLQkJCQkgICAgeGZzX2JtYXBpX2FmbGFnKGZvcmspIHwKLQkJCQkgICAgICAoc3luYyA/IDAgOiBYRlNfQk1BUElfQVNZTkMpLAorCQkJCSAgICB4ZnNfYm1hcGlfYWZsYWcoZm9yayksCiAJCQkJICAgIFhGU19JVFJVTkNfTUFYX0VYVEVOVFMsCiAJCQkJICAgICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwKLQkJCQkgICAgTlVMTCwgJmRvbmUpOworCQkJCSAgICAmZG9uZSk7CiAJCWlmIChlcnJvcikgewogCQkJLyoKIAkJCSAqIElmIHRoZSBidW5tYXBpIGNhbGwgZW5jb3VudGVycyBhbiBlcnJvciwKQEAgLTE2MTIsMTIgKzE2MDUsOCBAQAogCQkgKi8KIAkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2godHAsICZmcmVlX2xpc3QsICZjb21taXR0ZWQpOwogCQludHAgPSAqdHA7Ci0JCWlmIChjb21taXR0ZWQpIHsKLQkJCS8qIGxpbmsgdGhlIGlub2RlIGludG8gdGhlIG5leHQgeGFjdCBpbiB0aGUgY2hhaW4gKi8KLQkJCXhmc190cmFuc19pam9pbihudHAsIGlwLAotCQkJCQlYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7Ci0JCQl4ZnNfdHJhbnNfaWhvbGQobnRwLCBpcCk7Ci0JCX0KKwkJaWYgKGNvbW1pdHRlZCkKKwkJCXhmc190cmFuc19pam9pbihudHAsIGlwKTsKIAogCQlpZiAoZXJyb3IpIHsKIAkJCS8qCkBAIC0xNjQ2LDkgKzE2MzUsNyBAQAogCQllcnJvciA9IHhmc190cmFuc19jb21taXQoKnRwLCAwKTsKIAkJKnRwID0gbnRwOwogCi0JCS8qIGxpbmsgdGhlIGlub2RlIGludG8gdGhlIG5leHQgdHJhbnNhY3Rpb24gaW4gdGhlIGNoYWluICovCi0JCXhmc190cmFuc19pam9pbihudHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7Ci0JCXhmc190cmFuc19paG9sZChudHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKG50cCwgaXApOwogCiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKQEAgLTE5ODUsNyArMTk3Miw3IEBACiAJCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9JTk9ERSkgewogCQkJCWlpcCA9ICh4ZnNfaW5vZGVfbG9nX2l0ZW1fdCAqKWxpcDsKIAkJCQlBU1NFUlQoaWlwLT5pbGlfbG9nZ2VkID09IDEpOwotCQkJCWxpcC0+bGlfY2IgPSAodm9pZCgqKSh4ZnNfYnVmX3QqLHhmc19sb2dfaXRlbV90KikpIHhmc19pc3RhbGVfZG9uZTsKKwkJCQlsaXAtPmxpX2NiID0geGZzX2lzdGFsZV9kb25lOwogCQkJCXhmc190cmFuc19haWxfY29weV9sc24obXAtPm1fYWlsLAogCQkJCQkJCSZpaXAtPmlsaV9mbHVzaF9sc24sCiAJCQkJCQkJJmlpcC0+aWxpX2l0ZW0ubGlfbHNuKTsKQEAgLTIwNTUsOSArMjA0Miw4IEBACiAJCQl4ZnNfdHJhbnNfYWlsX2NvcHlfbHNuKG1wLT5tX2FpbCwgJmlpcC0+aWxpX2ZsdXNoX2xzbiwKIAkJCQkJCSZpaXAtPmlsaV9pdGVtLmxpX2xzbik7CiAKLQkJCXhmc19idWZfYXR0YWNoX2lvZG9uZShicCwKLQkJCQkodm9pZCgqKSh4ZnNfYnVmX3QqLHhmc19sb2dfaXRlbV90KikpCi0JCQkJeGZzX2lzdGFsZV9kb25lLCAoeGZzX2xvZ19pdGVtX3QgKilpaXApOworCQkJeGZzX2J1Zl9hdHRhY2hfaW9kb25lKGJwLCB4ZnNfaXN0YWxlX2RvbmUsCisJCQkJCQkgICZpaXAtPmlsaV9pdGVtKTsKIAogCQkJaWYgKGlwICE9IGZyZWVfaXApCiAJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKQEAgLTIyMDMsNyArMjE4OSw3IEBACiAJCSAqLwogCQlpZiAoaWZwLT5pZl9icm9vdF9ieXRlcyA9PSAwKSB7CiAJCQluZXdfc2l6ZSA9IChzaXplX3QpWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhyZWNfZGlmZik7Ci0JCQlpZnAtPmlmX2Jyb290ID0ga21lbV9hbGxvYyhuZXdfc2l6ZSwgS01fU0xFRVApOworCQkJaWZwLT5pZl9icm9vdCA9IGttZW1fYWxsb2MobmV3X3NpemUsIEtNX1NMRUVQIHwgS01fTk9GUyk7CiAJCQlpZnAtPmlmX2Jyb290X2J5dGVzID0gKGludCluZXdfc2l6ZTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjIxOSw3ICsyMjA1LDcgQEAKIAkJbmV3X3NpemUgPSAoc2l6ZV90KVhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMobmV3X21heCk7CiAJCWlmcC0+aWZfYnJvb3QgPSBrbWVtX3JlYWxsb2MoaWZwLT5pZl9icm9vdCwgbmV3X3NpemUsCiAJCQkJKHNpemVfdClYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKGN1cl9tYXgpLCAvKiBvbGQgc2l6ZSAqLwotCQkJCUtNX1NMRUVQKTsKKwkJCQlLTV9TTEVFUCB8IEtNX05PRlMpOwogCQlvcCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIGlmcC0+aWZfYnJvb3QsIDEsCiAJCQkJCQkgICAgIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwogCQlucCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIGlmcC0+aWZfYnJvb3QsIDEsCkBAIC0yMjQ1LDcgKzIyMzEsNyBAQAogCWVsc2UKIAkJbmV3X3NpemUgPSAwOwogCWlmIChuZXdfc2l6ZSA+IDApIHsKLQkJbmV3X2Jyb290ID0ga21lbV9hbGxvYyhuZXdfc2l6ZSwgS01fU0xFRVApOworCQluZXdfYnJvb3QgPSBrbWVtX2FsbG9jKG5ld19zaXplLCBLTV9TTEVFUCB8IEtNX05PRlMpOwogCQkvKgogCQkgKiBGaXJzdCBjb3B5IG92ZXIgdGhlIGJ0cmVlIGJsb2NrIGhlYWRlci4KIAkJICovCkBAIC0yMzQ5LDcgKzIzMzUsOCBAQAogCQlyZWFsX3NpemUgPSByb3VuZHVwKG5ld19zaXplLCA0KTsKIAkJaWYgKGlmcC0+aWZfdTEuaWZfZGF0YSA9PSBOVUxMKSB7CiAJCQlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzID09IDApOwotCQkJaWZwLT5pZl91MS5pZl9kYXRhID0ga21lbV9hbGxvYyhyZWFsX3NpemUsIEtNX1NMRUVQKTsKKwkJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IGttZW1fYWxsb2MocmVhbF9zaXplLAorCQkJCQkJCUtNX1NMRUVQIHwgS01fTk9GUyk7CiAJCX0gZWxzZSBpZiAoaWZwLT5pZl91MS5pZl9kYXRhICE9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEpIHsKIAkJCS8qCiAJCQkgKiBPbmx5IGRvIHRoZSByZWFsbG9jIGlmIHRoZSB1bmRlcmx5aW5nIHNpemUKQEAgLTIzNjAsMTEgKzIzNDcsMTIgQEAKIAkJCQkJa21lbV9yZWFsbG9jKGlmcC0+aWZfdTEuaWZfZGF0YSwKIAkJCQkJCQlyZWFsX3NpemUsCiAJCQkJCQkJaWZwLT5pZl9yZWFsX2J5dGVzLAotCQkJCQkJCUtNX1NMRUVQKTsKKwkJCQkJCQlLTV9TTEVFUCB8IEtNX05PRlMpOwogCQkJfQogCQl9IGVsc2UgewogCQkJQVNTRVJUKGlmcC0+aWZfcmVhbF9ieXRlcyA9PSAwKTsKLQkJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IGttZW1fYWxsb2MocmVhbF9zaXplLCBLTV9TTEVFUCk7CisJCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBrbWVtX2FsbG9jKHJlYWxfc2l6ZSwKKwkJCQkJCQlLTV9TTEVFUCB8IEtNX05PRlMpOwogCQkJbWVtY3B5KGlmcC0+aWZfdTEuaWZfZGF0YSwgaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YSwKIAkJCQlpZnAtPmlmX2J5dGVzKTsKIAkJfQpAQCAtMjczMSw3ICsyNzE5LDYgQEAKIAkJICogbWFyayBpdCBhcyBzdGFsZSBhbmQgYnJlbHNlLgogCQkgKi8KIAkJaWYgKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApKSB7Ci0JCQlYRlNfQlVGX0NMUl9CRFNUUkFUX0ZVTkMoYnApOwogCQkJWEZTX0JVRl9VTkRPTkUoYnApOwogCQkJWEZTX0JVRl9TVEFMRShicCk7CiAJCQlYRlNfQlVGX0VSUk9SKGJwLEVJTyk7CkBAIC0zMDY5LDggKzMwNTYsNyBAQAogCQkgKiBhbmQgdW5sb2NrIHRoZSBpbm9kZSdzIGZsdXNoIGxvY2sgd2hlbiB0aGUgaW5vZGUgaXMKIAkJICogY29tcGxldGVseSB3cml0dGVuIHRvIGRpc2suCiAJCSAqLwotCQl4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoYnAsICh2b2lkKCopKHhmc19idWZfdCoseGZzX2xvZ19pdGVtX3QqKSkKLQkJCQkgICAgICB4ZnNfaWZsdXNoX2RvbmUsICh4ZnNfbG9nX2l0ZW1fdCAqKWlpcCk7CisJCXhmc19idWZfYXR0YWNoX2lvZG9uZShicCwgeGZzX2lmbHVzaF9kb25lLCAmaWlwLT5pbGlfaXRlbSk7CiAKIAkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOwogCQlBU1NFUlQoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgIT0gTlVMTCk7CkBAIC0zNTE0LDEzICszNTAwLDExIEBACiAJeGZzX2V4dG51bV90CWV4dF9kaWZmOwkvKiBleHRlbnRzIHRvIHJlbW92ZSBpbiBjdXJyZW50IGxpc3QgKi8KIAl4ZnNfZXh0bnVtX3QJbmV4MTsJCS8qIG51bWJlciBvZiBleHRlbnRzIGJlZm9yZSBpZHggKi8KIAl4ZnNfZXh0bnVtX3QJbmV4MjsJCS8qIGV4dGVudHMgYWZ0ZXIgaWR4ICsgY291bnQgKi8KLQlpbnQJCW5saXN0czsJCS8qIGVudHJpZXMgaW4gaW5kaXJlY3Rpb24gYXJyYXkgKi8KIAlpbnQJCXBhZ2VfaWR4ID0gaWR4OwkvKiBpbmRleCBpbiB0YXJnZXQgZXh0ZW50IGxpc3QgKi8KIAogCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhUSVJFQyk7CiAJZXJwID0geGZzX2lleHRfaWR4X3RvX2lyZWMoaWZwLCAgJnBhZ2VfaWR4LCAmZXJwX2lkeCwgMCk7CiAJQVNTRVJUKGVycCAhPSBOVUxMKTsKLQlubGlzdHMgPSBpZnAtPmlmX3JlYWxfYnl0ZXMgLyBYRlNfSUVYVF9CVUZTWjsKIAluZXgxID0gcGFnZV9pZHg7CiAJZXh0X2NudCA9IGNvdW50OwogCXdoaWxlIChleHRfY250KSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggNzg1NTBkZi4uMDg5OGM1NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtNDQzLDggKzQ0Myw2IEBACiAgKi8KIGludAkJeGZzX2lnZXQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKIAkJCSB1aW50LCB1aW50LCB4ZnNfaW5vZGVfdCAqKik7Ci12b2lkCQl4ZnNfaXB1dCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKLXZvaWQJCXhmc19pcHV0X25ldyh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKIHZvaWQJCXhmc19pbG9jayh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKIGludAkJeGZzX2lsb2NrX25vd2FpdCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKIHZvaWQJCXhmc19pdW5sb2NrKHhmc19pbm9kZV90ICosIHVpbnQpOwpAQCAtNDUyLDcgKzQ1MCw3IEBACiBpbnQJCXhmc19pc2lsb2NrZWQoeGZzX2lub2RlX3QgKiwgdWludCk7CiB1aW50CQl4ZnNfaWxvY2tfbWFwX3NoYXJlZCh4ZnNfaW5vZGVfdCAqKTsKIHZvaWQJCXhmc19pdW5sb2NrX21hcF9zaGFyZWQoeGZzX2lub2RlX3QgKiwgdWludCk7Ci12b2lkCQl4ZnNfaXJlY2xhaW0oeGZzX2lub2RlX3QgKik7Cit2b2lkCQl4ZnNfaW5vZGVfZnJlZShzdHJ1Y3QgeGZzX2lub2RlICppcCk7CiAKIC8qCiAgKiB4ZnNfaW5vZGUuYyBwcm90b3R5cGVzLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwppbmRleCBjZjgyNDlhLi5mZTAwNzc3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwpAQCAtMjIsMzAgKzIyLDI2IEBACiAjaW5jbHVkZSAieGZzX2xvZy5oIgogI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCi0jaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX3RyYWNlLmgiCiAKIAoga21lbV96b25lX3QJKnhmc19pbGlfem9uZTsJCS8qIGlub2RlIGxvZyBpdGVtIHpvbmUgKi8KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICpJTk9ERV9JVEVNKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGxpcCwgc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSwgaWxpX2l0ZW0pOworfQorCisKIC8qCiAgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gaW5vZGUgaXRlbS4KICAqCkBAIC01NSwxMyArNTEsMTEgQEAKICAqLwogU1RBVElDIHVpbnQKIHhmc19pbm9kZV9pdGVtX3NpemUoCi0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0JdWludAkJbnZlY3M7Ci0JeGZzX2lub2RlX3QJKmlwOwotCi0JaXAgPSBpaXAtPmlsaV9pbm9kZTsKLQludmVjcyA9IDI7CisJc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaWlwID0gSU5PREVfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gaWlwLT5pbGlfaW5vZGU7CisJdWludAkJCW52ZWNzID0gMjsKIAogCS8qCiAJICogT25seSBsb2cgdGhlIGRhdGEvZXh0ZW50cy9iLXRyZWUgcm9vdCBpZiB0aGVyZSBpcyBzb21ldGhpbmcKQEAgLTIxMiwyMSArMjA2LDE3IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfaW5vZGVfaXRlbV9mb3JtYXQoCi0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKLQl4ZnNfbG9nX2lvdmVjX3QJCSpsb2dfdmVjdG9yKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKKwlzdHJ1Y3QgeGZzX2xvZ19pb3ZlYwkqdmVjcCkKIHsKKwlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppaXAgPSBJTk9ERV9JVEVNKGxpcCk7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBpaXAtPmlsaV9pbm9kZTsKIAl1aW50CQkJbnZlY3M7Ci0JeGZzX2xvZ19pb3ZlY190CQkqdmVjcDsKLQl4ZnNfaW5vZGVfdAkJKmlwOwogCXNpemVfdAkJCWRhdGFfYnl0ZXM7CiAJeGZzX2JtYnRfcmVjX3QJCSpleHRfYnVmZmVyOwotCWludAkJCW5yZWNzOwogCXhmc19tb3VudF90CQkqbXA7CiAKLQlpcCA9IGlpcC0+aWxpX2lub2RlOwotCXZlY3AgPSBsb2dfdmVjdG9yOwotCi0JdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZpaXAtPmlsaV9mb3JtYXQ7CisJdmVjcC0+aV9hZGRyID0gJmlpcC0+aWxpX2Zvcm1hdDsKIAl2ZWNwLT5pX2xlbiAgPSBzaXplb2YoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCk7CiAJdmVjcC0+aV90eXBlID0gWExPR19SRUdfVFlQRV9JRk9STUFUOwogCXZlY3ArKzsKQEAgLTI3Nyw3ICsyNjcsNyBAQAogCSAqLwogCXhmc19zeW5jaHJvbml6ZV90aW1lcyhpcCk7CiAKLQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CisJdmVjcC0+aV9hZGRyID0gJmlwLT5pX2Q7CiAJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHN0cnVjdCB4ZnNfaWNkaW5vZGUpOwogCXZlY3AtPmlfdHlwZSA9IFhMT0dfUkVHX1RZUEVfSUNPUkU7CiAJdmVjcCsrOwpAQCAtMzIzLDE4ICszMTMsMTcgQEAKIAkJCUFTU0VSVChpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzICE9IE5VTEwpOwogCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKTsKIAkJCUFTU0VSVChpaXAtPmlsaV9leHRlbnRzX2J1ZiA9PSBOVUxMKTsKLQkJCW5yZWNzID0gaXAtPmlfZGYuaWZfYnl0ZXMgLwotCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7Ci0JCQlBU1NFUlQobnJlY3MgPiAwKTsKKwkJCUFTU0VSVCgoaXAtPmlfZGYuaWZfYnl0ZXMgLworCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpID4gMCk7CiAjaWZkZWYgWEZTX05BVElWRV9IT1NUCi0JCQlpZiAobnJlY3MgPT0gaXAtPmlfZC5kaV9uZXh0ZW50cykgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA9PSBpcC0+aV9kZi5pZl9ieXRlcyAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpIHsKIAkJCQkvKgogCQkJCSAqIFRoZXJlIGFyZSBubyBkZWxheWVkIGFsbG9jYXRpb24KIAkJCQkgKiBleHRlbnRzLCBzbyBqdXN0IHBvaW50IHRvIHRoZQogCQkJCSAqIHJlYWwgZXh0ZW50cyBhcnJheS4KIAkJCQkgKi8KLQkJCQl2ZWNwLT5pX2FkZHIgPQotCQkJCQkoY2hhciAqKShpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzKTsKKwkJCQl2ZWNwLT5pX2FkZHIgPSBpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzOwogCQkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnl0ZXM7CiAJCQkJdmVjcC0+aV90eXBlID0gWExPR19SRUdfVFlQRV9JRVhUOwogCQkJfSBlbHNlCkBAIC0zNTIsNyArMzQxLDcgQEAKIAkJCQlleHRfYnVmZmVyID0ga21lbV9hbGxvYyhpcC0+aV9kZi5pZl9ieXRlcywKIAkJCQkJS01fU0xFRVApOwogCQkJCWlpcC0+aWxpX2V4dGVudHNfYnVmID0gZXh0X2J1ZmZlcjsKLQkJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpZXh0X2J1ZmZlcjsKKwkJCQl2ZWNwLT5pX2FkZHIgPSBleHRfYnVmZmVyOwogCQkJCXZlY3AtPmlfbGVuID0geGZzX2lleHRlbnRzX2NvcHkoaXAsIGV4dF9idWZmZXIsCiAJCQkJCQlYRlNfREFUQV9GT1JLKTsKIAkJCQl2ZWNwLT5pX3R5cGUgPSBYTE9HX1JFR19UWVBFX0lFWFQ7CkBAIC0zNzEsNyArMzYwLDcgQEAKIAkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfREJST09UKSB7CiAJCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXMgPiAwKTsKIAkJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdCAhPSBOVUxMKTsKLQkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9kZi5pZl9icm9vdDsKKwkJCXZlY3AtPmlfYWRkciA9IGlwLT5pX2RmLmlmX2Jyb290OwogCQkJdmVjcC0+aV9sZW4gPSBpcC0+aV9kZi5pZl9icm9vdF9ieXRlczsKIAkJCXZlY3AtPmlfdHlwZSA9IFhMT0dfUkVHX1RZUEVfSUJST09UOwogCQkJdmVjcCsrOwpAQCAtMzg5LDcgKzM3OCw3IEBACiAJCQlBU1NFUlQoaXAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKIAkJCUFTU0VSVChpcC0+aV9kLmRpX3NpemUgPiAwKTsKIAotCQkJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KWlwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJCQl2ZWNwLT5pX2FkZHIgPSBpcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogCQkJLyoKIAkJCSAqIFJvdW5kIGlfYnl0ZXMgdXAgdG8gYSB3b3JkIGJvdW5kYXJ5LgogCQkJICogVGhlIHVuZGVybHlpbmcgbWVtb3J5IGlzIGd1YXJhbnRlZWQgdG8KQEAgLTQzNyw3ICs0MjYsNyBAQAogCSAqIEFzc2VydCB0aGF0IG5vIGF0dHJpYnV0ZS1yZWxhdGVkIGxvZyBmbGFncyBhcmUgc2V0LgogCSAqLwogCWlmICghWEZTX0lGT1JLX1EoaXApKSB7Ci0JCUFTU0VSVChudmVjcyA9PSBpaXAtPmlsaV9pdGVtLmxpX2Rlc2MtPmxpZF9zaXplKTsKKwkJQVNTRVJUKG52ZWNzID09IGxpcC0+bGlfZGVzYy0+bGlkX3NpemUpOwogCQlpaXAtPmlsaV9mb3JtYXQuaWxmX3NpemUgPSBudmVjczsKIAkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgogCQkJIChYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FCUk9PVCB8IFhGU19JTE9HX0FFWFQpKSk7CkBAIC00NDksMjEgKzQzOCwyMSBAQAogCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCiAJCQkgKFhGU19JTE9HX0FEQVRBIHwgWEZTX0lMT0dfQUJST09UKSkpOwogCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BRVhUKSB7CisjaWZkZWYgREVCVUcKKwkJCWludCBucmVjcyA9IGlwLT5pX2FmcC0+aWZfYnl0ZXMgLworCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJCQlBU1NFUlQobnJlY3MgPiAwKTsKKwkJCUFTU0VSVChucmVjcyA9PSBpcC0+aV9kLmRpX2FuZXh0ZW50cyk7CiAJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9ieXRlcyA+IDApOwogCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKTsKIAkJCUFTU0VSVChpcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApOwotI2lmZGVmIERFQlVHCi0JCQlucmVjcyA9IGlwLT5pX2FmcC0+aWZfYnl0ZXMgLwotCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CiAjZW5kaWYKLQkJCUFTU0VSVChucmVjcyA+IDApOwotCQkJQVNTRVJUKG5yZWNzID09IGlwLT5pX2QuZGlfYW5leHRlbnRzKTsKICNpZmRlZiBYRlNfTkFUSVZFX0hPU1QKIAkJCS8qCiAJCQkgKiBUaGVyZSBhcmUgbm90IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnRzCiAJCQkgKiBmb3IgYXR0cmlidXRlcywgc28ganVzdCBwb2ludCBhdCB0aGUgYXJyYXkuCiAJCQkgKi8KLQkJCXZlY3AtPmlfYWRkciA9IChjaGFyICopKGlwLT5pX2FmcC0+aWZfdTEuaWZfZXh0ZW50cyk7CisJCQl2ZWNwLT5pX2FkZHIgPSBpcC0+aV9hZnAtPmlmX3UxLmlmX2V4dGVudHM7CiAJCQl2ZWNwLT5pX2xlbiA9IGlwLT5pX2FmcC0+aWZfYnl0ZXM7CiAjZWxzZQogCQkJQVNTRVJUKGlpcC0+aWxpX2FleHRlbnRzX2J1ZiA9PSBOVUxMKTsKQEAgLTQ3Myw3ICs0NjIsNyBAQAogCQkJZXh0X2J1ZmZlciA9IGttZW1fYWxsb2MoaXAtPmlfYWZwLT5pZl9ieXRlcywKIAkJCQlLTV9TTEVFUCk7CiAJCQlpaXAtPmlsaV9hZXh0ZW50c19idWYgPSBleHRfYnVmZmVyOwotCQkJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KWV4dF9idWZmZXI7CisJCQl2ZWNwLT5pX2FkZHIgPSBleHRfYnVmZmVyOwogCQkJdmVjcC0+aV9sZW4gPSB4ZnNfaWV4dGVudHNfY29weShpcCwgZXh0X2J1ZmZlciwKIAkJCQkJWEZTX0FUVFJfRk9SSyk7CiAjZW5kaWYKQEAgLTQ5MCw3ICs0NzksNyBAQAogCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BQlJPT1QpIHsKIAkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzID4gMCk7CiAJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9icm9vdCAhPSBOVUxMKTsKLQkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9hZnAtPmlmX2Jyb290OworCQkJdmVjcC0+aV9hZGRyID0gaXAtPmlfYWZwLT5pZl9icm9vdDsKIAkJCXZlY3AtPmlfbGVuID0gaXAtPmlfYWZwLT5pZl9icm9vdF9ieXRlczsKIAkJCXZlY3AtPmlfdHlwZSA9IFhMT0dfUkVHX1RZUEVfSUFUVFJfQlJPT1Q7CiAJCQl2ZWNwKys7CkBAIC01MDYsNyArNDk1LDcgQEAKIAkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX2J5dGVzID4gMCk7CiAJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl91MS5pZl9kYXRhICE9IE5VTEwpOwogCi0JCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpaXAtPmlfYWZwLT5pZl91MS5pZl9kYXRhOworCQkJdmVjcC0+aV9hZGRyID0gaXAtPmlfYWZwLT5pZl91MS5pZl9kYXRhOwogCQkJLyoKIAkJCSAqIFJvdW5kIGlfYnl0ZXMgdXAgdG8gYSB3b3JkIGJvdW5kYXJ5LgogCQkJICogVGhlIHVuZGVybHlpbmcgbWVtb3J5IGlzIGd1YXJhbnRlZWQgdG8KQEAgLTUyOCw3ICs1MTcsNyBAQAogCQlicmVhazsKIAl9CiAKLQlBU1NFUlQobnZlY3MgPT0gaWlwLT5pbGlfaXRlbS5saV9kZXNjLT5saWRfc2l6ZSk7CisJQVNTRVJUKG52ZWNzID09IGxpcC0+bGlfZGVzYy0+bGlkX3NpemUpOwogCWlpcC0+aWxpX2Zvcm1hdC5pbGZfc2l6ZSA9IG52ZWNzOwogfQogCkBAIC01MzksMTIgKzUyOCwxNCBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX2lub2RlX2l0ZW1fcGluKAotCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewotCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlpcC0+aWxpX2lub2RlLCBYRlNfSUxPQ0tfRVhDTCkpOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gSU5PREVfSVRFTShsaXApLT5pbGlfaW5vZGU7CiAKLQl0cmFjZV94ZnNfaW5vZGVfcGluKGlpcC0+aWxpX2lub2RlLCBfUkVUX0lQXyk7Ci0JYXRvbWljX2luYygmaWlwLT5pbGlfaW5vZGUtPmlfcGluY291bnQpOworCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlwLCBYRlNfSUxPQ0tfRVhDTCkpOworCisJdHJhY2VfeGZzX2lub2RlX3BpbihpcCwgX1JFVF9JUF8pOworCWF0b21pY19pbmMoJmlwLT5pX3BpbmNvdW50KTsKIH0KIAogCkBAIC01NTQsMTIgKzU0NSwxMiBAQAogICoKICAqIEFsc28gd2FrZSB1cCBhbnlvbmUgaW4geGZzX2l1bnBpbl93YWl0KCkgaWYgdGhlIGNvdW50IGdvZXMgdG8gMC4KICAqLwotLyogQVJHU1VTRUQgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfaW5vZGVfaXRlbV91bnBpbigKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKKwlpbnQJCQlyZW1vdmUpCiB7Ci0Jc3RydWN0IHhmc19pbm9kZQkqaXAgPSBpaXAtPmlsaV9pbm9kZTsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IElOT0RFX0lURU0obGlwKS0+aWxpX2lub2RlOwogCiAJdHJhY2VfeGZzX2lub2RlX3VucGluKGlwLCBfUkVUX0lQXyk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkgPiAwKTsKQEAgLTU2NywxNSArNTU4LDYgQEAKIAkJd2FrZV91cCgmaXAtPmlfaXBpbl93YWl0KTsKIH0KIAotLyogQVJHU1VTRUQgKi8KLVNUQVRJQyB2b2lkCi14ZnNfaW5vZGVfaXRlbV91bnBpbl9yZW1vdmUoCi0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKLQl4ZnNfdHJhbnNfdAkJKnRwKQotewotCXhmc19pbm9kZV9pdGVtX3VucGluKGlpcCk7Ci19Ci0KIC8qCiAgKiBUaGlzIGlzIGNhbGxlZCB0byBhdHRlbXB0IHRvIGxvY2sgdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCiAgKiBpbm9kZSBsb2cgaXRlbSwgaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBwdXNoIHJvdXRpbmUgd2hpY2ggZG9lcyB0aGUgYWN0dWFsCkBAIC01OTEsMTkgKzU3MywxNiBAQAogICovCiBTVEFUSUMgdWludAogeGZzX2lub2RlX2l0ZW1fdHJ5bG9jaygKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQlyZWdpc3RlciB4ZnNfaW5vZGVfdAkqaXA7CisJc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaWlwID0gSU5PREVfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gaWlwLT5pbGlfaW5vZGU7CiAKLQlpcCA9IGlpcC0+aWxpX2lub2RlOwotCi0JaWYgKHhmc19pcGluY291bnQoaXApID4gMCkgeworCWlmICh4ZnNfaXBpbmNvdW50KGlwKSA+IDApCiAJCXJldHVybiBYRlNfSVRFTV9QSU5ORUQ7Ci0JfQogCi0JaWYgKCF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfU0hBUkVEKSkgeworCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX1NIQVJFRCkpCiAJCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7Ci0JfQogCiAJaWYgKCF4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKIAkJLyoKQEAgLTYyOSw3ICs2MDgsNyBAQAogCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpIHsKIAkJQVNTRVJUKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApOwogCQlBU1NFUlQoaWlwLT5pbGlfbG9nZ2VkID09IDApOwotCQlBU1NFUlQoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpOworCQlBU1NFUlQobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpOwogCX0KICNlbmRpZgogCXJldHVybiBYRlNfSVRFTV9TVUNDRVNTOwpAQCAtNjQzLDI2ICs2MjIsMTggQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19pbm9kZV9pdGVtX3VubG9jaygKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl1aW50CQlob2xkOwotCXVpbnQJCWlvbG9ja2VkOwotCXVpbnQJCWxvY2tfZmxhZ3M7Ci0JeGZzX2lub2RlX3QJKmlwOworCXN0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW0gKmlpcCA9IElOT0RFX0lURU0obGlwKTsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IGlpcC0+aWxpX2lub2RlOworCXVuc2lnbmVkIHNob3J0CQlsb2NrX2ZsYWdzOwogCi0JQVNTRVJUKGlpcCAhPSBOVUxMKTsKIAlBU1NFUlQoaWlwLT5pbGlfaW5vZGUtPmlfaXRlbXAgIT0gTlVMTCk7CiAJQVNTRVJUKHhmc19pc2lsb2NrZWQoaWlwLT5pbGlfaW5vZGUsIFhGU19JTE9DS19FWENMKSk7Ci0JQVNTRVJUKCghKGlpcC0+aWxpX2lub2RlLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJgotCQkgIFhGU19JTElfSU9MT0NLRURfRVhDTCkpIHx8Ci0JICAgICAgIHhmc19pc2lsb2NrZWQoaWlwLT5pbGlfaW5vZGUsIFhGU19JT0xPQ0tfRVhDTCkpOwotCUFTU0VSVCgoIShpaXAtPmlsaV9pbm9kZS0+aV9pdGVtcC0+aWxpX2ZsYWdzICYKLQkJICBYRlNfSUxJX0lPTE9DS0VEX1NIQVJFRCkpIHx8Ci0JICAgICAgIHhmc19pc2lsb2NrZWQoaWlwLT5pbGlfaW5vZGUsIFhGU19JT0xPQ0tfU0hBUkVEKSk7CisKIAkvKgogCSAqIENsZWFyIHRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGluIHRoZSBpbm9kZS4KIAkgKi8KLQlpcCA9IGlpcC0+aWxpX2lub2RlOwogCWlwLT5pX3RyYW5zcCA9IE5VTEw7CiAKIAkvKgpAQCAtNjg2LDM0ICs2NTcsMTEgQEAKIAkJaWlwLT5pbGlfYWV4dGVudHNfYnVmID0gTlVMTDsKIAl9CiAKLQkvKgotCSAqIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIHVubG9jayB0aGUgaW5vZGUgb3Igbm90LgotCSAqLwotCWhvbGQgPSBpaXAtPmlsaV9mbGFncyAmIFhGU19JTElfSE9MRDsKLQotCS8qCi0JICogQmVmb3JlIGNsZWFyaW5nIG91dCB0aGUgZmxhZ3MsIHJlbWVtYmVyIHdoZXRoZXIgd2UKLQkgKiBhcmUgaG9sZGluZyB0aGUgaW5vZGUncyBJTyBsb2NrLgotCSAqLwotCWlvbG9ja2VkID0gaWlwLT5pbGlfZmxhZ3MgJiBYRlNfSUxJX0lPTE9DS0VEX0FOWTsKLQotCS8qCi0JICogQ2xlYXIgb3V0IHRoZSBmaWVsZHMgb2YgdGhlIGlub2RlIGxvZyBpdGVtIHBhcnRpY3VsYXIKLQkgKiB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KLQkgKi8KLQlpaXAtPmlsaV9mbGFncyA9IDA7Ci0KLQkvKgotCSAqIFVubG9jayB0aGUgaW5vZGUgaWYgWEZTX0lMSV9IT0xEIHdhcyBub3Qgc2V0LgotCSAqLwotCWlmICghaG9sZCkgewotCQlsb2NrX2ZsYWdzID0gWEZTX0lMT0NLX0VYQ0w7Ci0JCWlmIChpb2xvY2tlZCAmIFhGU19JTElfSU9MT0NLRURfRVhDTCkgewotCQkJbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX0VYQ0w7Ci0JCX0gZWxzZSBpZiAoaW9sb2NrZWQgJiBYRlNfSUxJX0lPTE9DS0VEX1NIQVJFRCkgewotCQkJbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX1NIQVJFRDsKLQkJfQotCQl4ZnNfaXB1dChpaXAtPmlsaV9pbm9kZSwgbG9ja19mbGFncyk7CisJbG9ja19mbGFncyA9IGlpcC0+aWxpX2xvY2tfZmxhZ3M7CisJaWlwLT5pbGlfbG9ja19mbGFncyA9IDA7CisJaWYgKGxvY2tfZmxhZ3MpIHsKKwkJeGZzX2l1bmxvY2soaWlwLT5pbGlfaW5vZGUsIGxvY2tfZmxhZ3MpOworCQlJUkVMRShpaXAtPmlsaV9pbm9kZSk7CiAJfQogfQogCkBAIC03MjUsMTMgKzY3MywxMiBAQAogICogaXMgdGhlIG9ubHkgb25lIHRoYXQgbWF0dGVycy4gIFRoZXJlZm9yZSwgc2ltcGx5IHJldHVybiB0aGUKICAqIGdpdmVuIGxzbi4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgeGZzX2xzbl90CiB4ZnNfaW5vZGVfaXRlbV9jb21taXR0ZWQoCi0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCiAJeGZzX2xzbl90CQlsc24pCiB7Ci0JcmV0dXJuIChsc24pOworCXJldHVybiBsc247CiB9CiAKIC8qCkBAIC03NDMsMTMgKzY5MCwxMiBAQAogICovCiBTVEFUSUMgdm9pZAogeGZzX2lub2RlX2l0ZW1fcHVzaGJ1ZigKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfaW5vZGVfdAkqaXA7Ci0JeGZzX21vdW50X3QJKm1wOwotCXhmc19idWZfdAkqYnA7CisJc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaWlwID0gSU5PREVfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gaWlwLT5pbGlfaW5vZGU7CisJc3RydWN0IHhmc19idWYJCSpicDsKIAotCWlwID0gaWlwLT5pbGlfaW5vZGU7CiAJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19TSEFSRUQpKTsKIAogCS8qCkBAIC03NTcsMTQgKzcwMywxMyBAQAogCSAqIGlub2RlIHdhcyB0YWtlbiBvZmYgdGhlIEFJTC4gU28sIGp1c3QgZ2V0IG91dC4KIAkgKi8KIAlpZiAoY29tcGxldGlvbl9kb25lKCZpcC0+aV9mbHVzaCkgfHwKLQkgICAgKChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgPT0gMCkpIHsKKwkgICAgIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpIHsKIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCQlyZXR1cm47CiAJfQogCi0JbXAgPSBpcC0+aV9tb3VudDsKLQlicCA9IHhmc19pbmNvcmUobXAtPm1fZGRldl90YXJncCwgaWlwLT5pbGlfZm9ybWF0LmlsZl9ibGtubywKLQkJICAgIGlpcC0+aWxpX2Zvcm1hdC5pbGZfbGVuLCBYQkZfVFJZTE9DSyk7CisJYnAgPSB4ZnNfaW5jb3JlKGlwLT5pX21vdW50LT5tX2RkZXZfdGFyZ3AsIGlpcC0+aWxpX2Zvcm1hdC5pbGZfYmxrbm8sCisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2xlbiwgWEJGX1RSWUxPQ0spOwogCiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCWlmICghYnApCkBAIC03NzIsMTAgKzcxNyw4IEBACiAJaWYgKFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkKIAkJeGZzX2J1Zl9kZWx3cmlfcHJvbW90ZShicCk7CiAJeGZzX2J1Zl9yZWxzZShicCk7Ci0JcmV0dXJuOwogfQogCi0KIC8qCiAgKiBUaGlzIGlzIGNhbGxlZCB0byBhc3luY2hyb25vdXNseSB3cml0ZSB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKICAqIGlub2RlIGxvZyBpdGVtIG91dCB0byBkaXNrLiBUaGUgaW5vZGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBsb2NrZWQgYnkKQEAgLTc4MywxNCArNzI2LDE0IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfaW5vZGVfaXRlbV9wdXNoKAotCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogewotCXhmc19pbm9kZV90CSppcDsKLQotCWlwID0gaWlwLT5pbGlfaW5vZGU7CisJc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaWlwID0gSU5PREVfSVRFTShsaXApOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gaWlwLT5pbGlfaW5vZGU7CiAKIAlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX1NIQVJFRCkpOwogCUFTU0VSVCghY29tcGxldGlvbl9kb25lKCZpcC0+aV9mbHVzaCkpOworCiAJLyoKIAkgKiBTaW5jZSB3ZSB3ZXJlIGFibGUgdG8gbG9jayB0aGUgaW5vZGUncyBmbHVzaCBsb2NrIGFuZAogCSAqIHdlIGZvdW5kIGl0IG9uIHRoZSBBSUwsIHRoZSBpbm9kZSBtdXN0IGJlIGRpcnR5LiAgVGhpcwpAQCAtODEzLDQzICs3NTYsMzQgQEAKIAkgKi8KIAkodm9pZCkgeGZzX2lmbHVzaChpcCwgMCk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCi0JcmV0dXJuOwogfQogCiAvKgogICogWFhYIHJjYyAtIHRoaXMgb25lIHJlYWxseSBoYXMgdG8gZG8gc29tZXRoaW5nLiAgUHJvYmFibHkgbmVlZHMKICAqIHRvIHN0YW1wIGluIGEgbmV3IGZpZWxkIGluIHRoZSBpbmNvcmUgaW5vZGUuCiAgKi8KLS8qIEFSR1NVU0VEICovCiBTVEFUSUMgdm9pZAogeGZzX2lub2RlX2l0ZW1fY29tbWl0dGluZygKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwLAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKIAl4ZnNfbHNuX3QJCWxzbikKIHsKLQlpaXAtPmlsaV9sYXN0X2xzbiA9IGxzbjsKLQlyZXR1cm47CisJSU5PREVfSVRFTShsaXApLT5pbGlfbGFzdF9sc24gPSBsc247CiB9CiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIHNoYXJlZCBieSBhbGwgYnVmIGxvZyBpdGVtcy4KICAqLwogc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2lub2RlX2l0ZW1fb3BzID0gewotCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fc2l6ZSwKLQkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCi0JCQkJCXhmc19pbm9kZV9pdGVtX2Zvcm1hdCwKLQkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fcGluLAotCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3VucGluLAotCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCopKQotCQkJCQl4ZnNfaW5vZGVfaXRlbV91bnBpbl9yZW1vdmUsCi0JLmlvcF90cnlsb2NrCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfaW5vZGVfaXRlbV90cnlsb2NrLAotCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfaW5vZGVfaXRlbV91bmxvY2ssCi0JLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKLQkJCQkJeGZzX2lub2RlX2l0ZW1fY29tbWl0dGVkLAotCS5pb3BfcHVzaAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fcHVzaCwKLQkuaW9wX3B1c2hidWYJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3B1c2hidWYsCi0JLmlvcF9jb21taXR0aW5nID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQotCQkJCQl4ZnNfaW5vZGVfaXRlbV9jb21taXR0aW5nCisJLmlvcF9zaXplCT0geGZzX2lub2RlX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9IHhmc19pbm9kZV9pdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9IHhmc19pbm9kZV9pdGVtX3BpbiwKKwkuaW9wX3VucGluCT0geGZzX2lub2RlX2l0ZW1fdW5waW4sCisJLmlvcF90cnlsb2NrCT0geGZzX2lub2RlX2l0ZW1fdHJ5bG9jaywKKwkuaW9wX3VubG9jawk9IHhmc19pbm9kZV9pdGVtX3VubG9jaywKKwkuaW9wX2NvbW1pdHRlZAk9IHhmc19pbm9kZV9pdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSB4ZnNfaW5vZGVfaXRlbV9wdXNoLAorCS5pb3BfcHVzaGJ1Zgk9IHhmc19pbm9kZV9pdGVtX3B1c2hidWYsCisJLmlvcF9jb21taXR0aW5nID0geGZzX2lub2RlX2l0ZW1fY29tbWl0dGluZwogfTsKIAogCkBAIC04NTgsMTAgKzc5MiwxMCBAQAogICovCiB2b2lkCiB4ZnNfaW5vZGVfaXRlbV9pbml0KAotCXhmc19pbm9kZV90CSppcCwKLQl4ZnNfbW91bnRfdAkqbXApCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJc3RydWN0IHhmc19tb3VudAkqbXApCiB7Ci0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKwlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppaXA7CiAKIAlBU1NFUlQoaXAtPmlfaXRlbXAgPT0gTlVMTCk7CiAJaWlwID0gaXAtPmlfaXRlbXAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19pbGlfem9uZSwgS01fU0xFRVApOwpAQCAtODk5LDE0ICs4MzMsMTQgQEAKICAqIGZyb20gdGhlIEFJTCBpZiBpdCBoYXMgbm90IGJlZW4gcmUtbG9nZ2VkLCBhbmQgdW5sb2NraW5nIHRoZSBpbm9kZSdzCiAgKiBmbHVzaCBsb2NrLgogICovCi0vKkFSR1NVU0VEKi8KIHZvaWQKIHhmc19pZmx1c2hfZG9uZSgKLQl4ZnNfYnVmX3QJCSpicCwKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQorCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQogeworCXN0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW0gKmlpcCA9IElOT0RFX0lURU0obGlwKTsKIAl4ZnNfaW5vZGVfdAkJKmlwID0gaWlwLT5pbGlfaW5vZGU7Ci0Jc3RydWN0IHhmc19haWwJCSphaWxwID0gaWlwLT5pbGlfaXRlbS5saV9haWxwOworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGxpcC0+bGlfYWlscDsKIAogCS8qCiAJICogV2Ugb25seSB3YW50IHRvIHB1bGwgdGhlIGl0ZW0gZnJvbSB0aGUgQUlMIGlmIGl0IGlzCkBAIC05MTcsMTIgKzg1MSwxMSBAQAogCSAqIHRoZSBsb2NrIHNpbmNlIGl0J3MgY2hlYXBlciwgYW5kIHRoZW4gd2UgcmVjaGVjayB3aGlsZQogCSAqIGhvbGRpbmcgdGhlIGxvY2sgYmVmb3JlIHJlbW92aW5nIHRoZSBpbm9kZSBmcm9tIHRoZSBBSUwuCiAJICovCi0JaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJgotCSAgICAoaWlwLT5pbGlfaXRlbS5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSkgeworCWlmIChpaXAtPmlsaV9sb2dnZWQgJiYgbGlwLT5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSB7CiAJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7Ci0JCWlmIChpaXAtPmlsaV9pdGVtLmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pIHsKKwkJaWYgKGxpcC0+bGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikgewogCQkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suICovCi0JCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAoeGZzX2xvZ19pdGVtX3QqKWlpcCk7CisJCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCQl9CkBAIC05NDAsOCArODczLDYgQEAKIAkgKiBSZWxlYXNlIHRoZSBpbm9kZSdzIGZsdXNoIGxvY2sgc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0LgogCSAqLwogCXhmc19pZnVubG9jayhpcCk7Ci0KLQlyZXR1cm47CiB9CiAKIC8qCkBAIC05NTcsMTAgKzg4OCw4IEBACiAJeGZzX2lub2RlX3QJCSppcCkKIHsKIAl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwID0gaXAtPmlfaXRlbXA7Ci0JeGZzX21vdW50X3QJCSptcDsKIAogCWlpcCA9IGlwLT5pX2l0ZW1wOwotCW1wID0gaXAtPmlfbW91bnQ7CiAJaWYgKGlpcCkgewogCQlzdHJ1Y3QgeGZzX2FpbAkqYWlscCA9IGlpcC0+aWxpX2l0ZW0ubGlfYWlscDsKIAkJaWYgKGlpcC0+aWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7CkBAIC05OTEsMTAgKzkyMCwxMCBAQAogCiB2b2lkCiB4ZnNfaXN0YWxlX2RvbmUoCi0JeGZzX2J1Zl90CQkqYnAsCi0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQl4ZnNfaWZsdXNoX2Fib3J0KGlpcC0+aWxpX2lub2RlKTsKKwl4ZnNfaWZsdXNoX2Fib3J0KElOT0RFX0lURU0obGlwKS0+aWxpX2lub2RlKTsKIH0KIAogLyoKQEAgLTEwMDcsOSArOTM2LDggQEAKIAl4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90CSppbl9mKQogewogCWlmIChidWYtPmlfbGVuID09IHNpemVvZih4ZnNfaW5vZGVfbG9nX2Zvcm1hdF8zMl90KSkgewotCQl4ZnNfaW5vZGVfbG9nX2Zvcm1hdF8zMl90ICppbl9mMzI7CisJCXhmc19pbm9kZV9sb2dfZm9ybWF0XzMyX3QgKmluX2YzMiA9IGJ1Zi0+aV9hZGRyOwogCi0JCWluX2YzMiA9ICh4ZnNfaW5vZGVfbG9nX2Zvcm1hdF8zMl90ICopYnVmLT5pX2FkZHI7CiAJCWluX2YtPmlsZl90eXBlID0gaW5fZjMyLT5pbGZfdHlwZTsKIAkJaW5fZi0+aWxmX3NpemUgPSBpbl9mMzItPmlsZl9zaXplOwogCQlpbl9mLT5pbGZfZmllbGRzID0gaW5fZjMyLT5pbGZfZmllbGRzOwpAQCAtMTAyNSw5ICs5NTMsOCBAQAogCQlpbl9mLT5pbGZfYm9mZnNldCA9IGluX2YzMi0+aWxmX2JvZmZzZXQ7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoYnVmLT5pX2xlbiA9PSBzaXplb2YoeGZzX2lub2RlX2xvZ19mb3JtYXRfNjRfdCkpewotCQl4ZnNfaW5vZGVfbG9nX2Zvcm1hdF82NF90ICppbl9mNjQ7CisJCXhmc19pbm9kZV9sb2dfZm9ybWF0XzY0X3QgKmluX2Y2NCA9IGJ1Zi0+aV9hZGRyOwogCi0JCWluX2Y2NCA9ICh4ZnNfaW5vZGVfbG9nX2Zvcm1hdF82NF90ICopYnVmLT5pX2FkZHI7CiAJCWluX2YtPmlsZl90eXBlID0gaW5fZjY0LT5pbGZfdHlwZTsKIAkJaW5fZi0+aWxmX3NpemUgPSBpbl9mNjQtPmlsZl9zaXplOwogCQlpbl9mLT5pbGZfZmllbGRzID0gaW5fZjY0LT5pbGZfZmllbGRzOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmggYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaAppbmRleCA5YTQ2Nzk1Li5kM2RlZTYxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaAorKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaApAQCAtMTAzLDEyICsxMDMsNiBAQAogCQkJCSBYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FFWFQgfCBcCiAJCQkJIFhGU19JTE9HX0FCUk9PVCkKIAotI2RlZmluZQlYRlNfSUxJX0hPTEQJCTB4MQotI2RlZmluZQlYRlNfSUxJX0lPTE9DS0VEX0VYQ0wJMHgyCi0jZGVmaW5lCVhGU19JTElfSU9MT0NLRURfU0hBUkVECTB4NAotCi0jZGVmaW5lCVhGU19JTElfSU9MT0NLRURfQU5ZICAgKFhGU19JTElfSU9MT0NLRURfRVhDTCB8IFhGU19JTElfSU9MT0NLRURfU0hBUkVEKQotCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfaWxvZ19mYnJvb3QoaW50IHcpCiB7CiAJcmV0dXJuICh3ID09IFhGU19EQVRBX0ZPUksgPyBYRlNfSUxPR19EQlJPT1QgOiBYRlNfSUxPR19BQlJPT1QpOwpAQCAtMTM3LDcgKzEzMSw3IEBACiAJc3RydWN0IHhmc19pbm9kZQkqaWxpX2lub2RlOwkgICAvKiBpbm9kZSBwdHIgKi8KIAl4ZnNfbHNuX3QJCWlsaV9mbHVzaF9sc247CSAgIC8qIGxzbiBhdCBsYXN0IGZsdXNoICovCiAJeGZzX2xzbl90CQlpbGlfbGFzdF9sc247CSAgIC8qIGxzbiBhdCBsYXN0IHRyYW5zYWN0aW9uICovCi0JdW5zaWduZWQgc2hvcnQJCWlsaV9mbGFnczsJICAgLyogbWlzYyBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0CQlpbGlfbG9ja19mbGFnczsJICAgLyogbG9jayBmbGFncyAqLwogCXVuc2lnbmVkIHNob3J0CQlpbGlfbG9nZ2VkOwkgICAvKiBmbHVzaGVkIGxvZ2dlZCBkYXRhICovCiAJdW5zaWduZWQgaW50CQlpbGlfbGFzdF9maWVsZHM7ICAgLyogZmllbGRzIHdoZW4gZmx1c2hlZCAqLwogCXN0cnVjdCB4ZnNfYm1idF9yZWMJKmlsaV9leHRlbnRzX2J1ZjsgIC8qIGFycmF5IG9mIGxvZ2dlZApAQCAtMTYxLDggKzE1NSw4IEBACiAKIGV4dGVybiB2b2lkIHhmc19pbm9kZV9pdGVtX2luaXQoc3RydWN0IHhmc19pbm9kZSAqLCBzdHJ1Y3QgeGZzX21vdW50ICopOwogZXh0ZXJuIHZvaWQgeGZzX2lub2RlX2l0ZW1fZGVzdHJveShzdHJ1Y3QgeGZzX2lub2RlICopOwotZXh0ZXJuIHZvaWQgeGZzX2lmbHVzaF9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOwotZXh0ZXJuIHZvaWQgeGZzX2lzdGFsZV9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOworZXh0ZXJuIHZvaWQgeGZzX2lmbHVzaF9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7CitleHRlcm4gdm9pZCB4ZnNfaXN0YWxlX2RvbmUoc3RydWN0IHhmc19idWYgKiwgc3RydWN0IHhmc19sb2dfaXRlbSAqKTsKIGV4dGVybiB2b2lkIHhmc19pZmx1c2hfYWJvcnQoc3RydWN0IHhmc19pbm9kZSAqKTsKIGV4dGVybiBpbnQgeGZzX2lub2RlX2l0ZW1fZm9ybWF0X2NvbnZlcnQoeGZzX2xvZ19pb3ZlY190ICosCiAJCQkJCSB4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90ICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCmluZGV4IGVmMTQ5NDMuLjIwNTc2MTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuYworKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTIzLDE5ICsyMywxNCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgpAQCAtMTIzLDcgKzExOCw3IEBACiAJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsCiAJCQkoeGZzX2ZpbGJsa3NfdCkoZW5kX2ZzYiAtIG9mZnNldF9mc2IpLAogCQkJYm1hcGlfZmxhZ3MsICBOVUxMLCAwLCBpbWFwLAotCQkJbmltYXBzLCBOVUxMLCBOVUxMKTsKKwkJCW5pbWFwcywgTlVMTCk7CiAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwpAQCAtMTM4LDcgKzEzMyw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChmbGFncyAmIChCTUFQSV9ESVJFQ1R8Qk1BUElfTU1BUCkpIHsKKwkJaWYgKGZsYWdzICYgQk1BUElfRElSRUNUKSB7CiAJCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kaXJlY3QoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLAogCQkJCQkJICAgICAgIGltYXAsIG5pbWFwcyk7CiAJCX0gZWxzZSB7CkBAIC0yNDcsNyArMjQyLDcgQEAKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCiAJaW50CQlmbGFncywKLQl4ZnNfYm1idF9pcmVjX3QgKnJldF9pbWFwLAorCXhmc19ibWJ0X2lyZWNfdCAqaW1hcCwKIAlpbnQJCSpubWFwcykKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKQEAgLTI2MSw3ICsyNTYsNiBAQAogCWludAkJcXVvdGFfZmxhZzsKIAlpbnQJCXJ0OwogCXhmc190cmFuc190CSp0cDsKLQl4ZnNfYm1idF9pcmVjX3QgaW1hcDsKIAl4ZnNfYm1hcF9mcmVlX3QgZnJlZV9saXN0OwogCXVpbnQJCXFibG9ja3MsIHJlc2Jsa3MsIHJlc3J0ZXh0ZW50czsKIAlpbnQJCWNvbW1pdHRlZDsKQEAgLTI4NSwxMCArMjc5LDEwIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3Jfb3V0OwogCX0gZWxzZSB7Ci0JCWlmICgqbm1hcHMgJiYgKHJldF9pbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSkKKwkJaWYgKCpubWFwcyAmJiAoaW1hcC0+YnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykpCiAJCQlsYXN0X2ZzYiA9IE1JTihsYXN0X2ZzYiwgKHhmc19maWxlb2ZmX3QpCi0JCQkJCXJldF9pbWFwLT5icl9ibG9ja2NvdW50ICsKLQkJCQkJcmV0X2ltYXAtPmJyX3N0YXJ0b2ZmKTsKKwkJCQkJaW1hcC0+YnJfYmxvY2tjb3VudCArCisJCQkJCWltYXAtPmJyX3N0YXJ0b2ZmKTsKIAl9CiAJY291bnRfZnNiID0gbGFzdF9mc2IgLSBvZmZzZXRfZnNiOwogCUFTU0VSVChjb3VudF9mc2IgPiAwKTsKQEAgLTMzNCwyMCArMzI4LDIyIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yMTsKIAotCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEU7CiAJaWYgKChmbGFncyAmIEJNQVBJX0RJUkVDVCkgJiYgKG9mZnNldCA8IGlwLT5pX3NpemUgfHwgZXh0c3opKQogCQlibWFwaV9mbGFnIHw9IFhGU19CTUFQSV9QUkVBTExPQzsKIAogCS8qCi0JICogSXNzdWUgdGhlIHhmc19ibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2NrcworCSAqIElzc3VlIHRoZSB4ZnNfYm1hcGkoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBibG9ja3MuCisJICoKKwkgKiBGcm9tIHRoaXMgcG9pbnQgb253YXJkcyB3ZSBvdmVyd3JpdGUgdGhlIGltYXAgcG9pbnRlciB0aGF0IHRoZQorCSAqIGNhbGxlciBnYXZlIHRvIHVzLgogCSAqLwogCXhmc19ibWFwX2luaXQoJmZyZWVfbGlzdCwgJmZpcnN0ZnNiKTsKIAluaW1hcHMgPSAxOwogCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLCBibWFwaV9mbGFnLAotCQkmZmlyc3Rmc2IsIDAsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0LCBOVUxMKTsKKwkJJmZpcnN0ZnNiLCAwLCBpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwogCkBAIC0zNjksMTIgKzM2NSwxMSBAQAogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKLQlpZiAoIShpbWFwLmJyX3N0YXJ0YmxvY2sgfHwgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkpIHsKLQkJZXJyb3IgPSB4ZnNfY21uX2Vycl9mc2Jsb2NrX3plcm8oaXAsICZpbWFwKTsKKwlpZiAoIShpbWFwLT5icl9zdGFydGJsb2NrIHx8IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKSB7CisJCWVycm9yID0geGZzX2Ntbl9lcnJfZnNibG9ja196ZXJvKGlwLCBpbWFwKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCi0JKnJldF9pbWFwID0gaW1hcDsKIAkqbm1hcHMgPSAxOwogCXJldHVybiAwOwogCkBAIC00MjUsNyArNDIwLDcgQEAKIAkJaW1hcHMgPSBuaW1hcHM7CiAJCWZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKIAkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIHN0YXJ0X2ZzYiwgY291bnRfZnNiLCAwLAotCQkJCSAgJmZpcnN0YmxvY2ssIDAsIGltYXAsICZpbWFwcywgTlVMTCwgTlVMTCk7CisJCQkJICAmZmlyc3RibG9jaywgMCwgaW1hcCwgJmltYXBzLCBOVUxMKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCQlmb3IgKG4gPSAwOyBuIDwgaW1hcHM7IG4rKykgewpAQCAtNTAwLDcgKzQ5NSw3IEBACiAJCQkgICh4ZnNfZmlsYmxrc190KShsYXN0X2ZzYiAtIG9mZnNldF9mc2IpLAogCQkJICBYRlNfQk1BUElfREVMQVkgfCBYRlNfQk1BUElfV1JJVEUgfAogCQkJICBYRlNfQk1BUElfRU5USVJFLCAmZmlyc3RibG9jaywgMSwgaW1hcCwKLQkJCSAgJm5pbWFwcywgTlVMTCwgTlVMTCk7CisJCQkgICZuaW1hcHMsIE5VTEwpOwogCWlmIChlcnJvciAmJiAoZXJyb3IgIT0gRU5PU1BDKSkKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CiAKQEAgLTU0OCw3ICs1NDMsNyBAQAogCXhmc19pbm9kZV90CSppcCwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCi0JeGZzX2JtYnRfaXJlY190ICptYXAsCisJeGZzX2JtYnRfaXJlY190ICppbWFwLAogCWludAkJKnJldG1hcCkKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKQEAgLTU1Nyw3ICs1NTIsNiBAQAogCXhmc19mc2Jsb2NrX3QJZmlyc3RfYmxvY2s7CiAJeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKIAl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYjsKLQl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKIAl4ZnNfdHJhbnNfdAkqdHA7CiAJaW50CQluaW1hcHMsIGNvbW1pdHRlZDsKIAlpbnQJCWVycm9yID0gMDsKQEAgLTU3Myw4ICs1NjcsOCBAQAogCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAogCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwotCWNvdW50X2ZzYiA9IG1hcC0+YnJfYmxvY2tjb3VudDsKLQltYXBfc3RhcnRfZnNiID0gbWFwLT5icl9zdGFydG9mZjsKKwljb3VudF9mc2IgPSBpbWFwLT5icl9ibG9ja2NvdW50OworCW1hcF9zdGFydF9mc2IgPSBpbWFwLT5icl9zdGFydG9mZjsKIAogCVhGU19TVEFUU19BREQoeHNfeHN0cmF0X2J5dGVzLCBYRlNfRlNCX1RPX0IobXAsIGNvdW50X2ZzYikpOwogCkBAIC02MDIsOCArNTk2LDcgQEAKIAkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAkJCX0KIAkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCQkJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOwogCkBAIC02NTQsMTAgKzY0NywxNSBAQAogCQkJCX0KIAkJCX0KIAotCQkJLyogR28gZ2V0IHRoZSBhY3R1YWwgYmxvY2tzICovCisJCQkvKgorCQkJICogR28gZ2V0IHRoZSBhY3R1YWwgYmxvY2tzLgorCSAJIAkgKgorCQkJICogRnJvbSB0aGlzIHBvaW50IG9ud2FyZHMgd2Ugb3ZlcndyaXRlIHRoZSBpbWFwCisJCQkgKiBwb2ludGVyIHRoYXQgdGhlIGNhbGxlciBnYXZlIHRvIHVzLgorCQkJICovCiAJCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG1hcF9zdGFydF9mc2IsIGNvdW50X2ZzYiwKIAkJCQkJWEZTX0JNQVBJX1dSSVRFLCAmZmlyc3RfYmxvY2ssIDEsCi0JCQkJCSZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0LCBOVUxMKTsKKwkJCQkJaW1hcCwgJm5pbWFwcywgJmZyZWVfbGlzdCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byB0cmFuc19jYW5jZWw7CiAKQEAgLTY3NiwxMyArNjc0LDEyIEBACiAJCSAqIFNlZSBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYW4gZXh0ZW50IHRoYXQKIAkJICogY292ZXJzIGF0IGxlYXN0IHBhcnQgb2YgdGhlIGNhbGxlcnMgcmVxdWVzdAogCQkgKi8KLQkJaWYgKCEoaW1hcC5icl9zdGFydGJsb2NrIHx8IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKQotCQkJcmV0dXJuIHhmc19jbW5fZXJyX2ZzYmxvY2tfemVybyhpcCwgJmltYXApOworCQlpZiAoIShpbWFwLT5icl9zdGFydGJsb2NrIHx8IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKQorCQkJcmV0dXJuIHhmc19jbW5fZXJyX2ZzYmxvY2tfemVybyhpcCwgaW1hcCk7CiAKLQkJaWYgKChvZmZzZXRfZnNiID49IGltYXAuYnJfc3RhcnRvZmYpICYmCi0JCSAgICAob2Zmc2V0X2ZzYiA8IChpbWFwLmJyX3N0YXJ0b2ZmICsKLQkJCQkgICBpbWFwLmJyX2Jsb2NrY291bnQpKSkgewotCQkJKm1hcCA9IGltYXA7CisJCWlmICgob2Zmc2V0X2ZzYiA+PSBpbWFwLT5icl9zdGFydG9mZikgJiYKKwkJICAgIChvZmZzZXRfZnNiIDwgKGltYXAtPmJyX3N0YXJ0b2ZmICsKKwkJCQkgICBpbWFwLT5icl9ibG9ja2NvdW50KSkpIHsKIAkJCSpyZXRtYXAgPSAxOwogCQkJWEZTX1NUQVRTX0lOQyh4c194c3RyYXRfcXVpY2spOwogCQkJcmV0dXJuIDA7CkBAIC02OTIsOCArNjg5LDggQEAKIAkJICogU28gZmFyIHdlIGhhdmUgbm90IG1hcHBlZCB0aGUgcmVxdWVzdGVkIHBhcnQgb2YgdGhlCiAJCSAqIGZpbGUsIGp1c3Qgc3Vycm91bmRpbmcgZGF0YSwgdHJ5IGFnYWluLgogCQkgKi8KLQkJY291bnRfZnNiIC09IGltYXAuYnJfYmxvY2tjb3VudDsKLQkJbWFwX3N0YXJ0X2ZzYiA9IGltYXAuYnJfc3RhcnRvZmYgKyBpbWFwLmJyX2Jsb2NrY291bnQ7CisJCWNvdW50X2ZzYiAtPSBpbWFwLT5icl9ibG9ja2NvdW50OworCQltYXBfc3RhcnRfZnNiID0gaW1hcC0+YnJfc3RhcnRvZmYgKyBpbWFwLT5icl9ibG9ja2NvdW50OwogCX0KIAogdHJhbnNfY2FuY2VsOgpAQCAtNzY2LDggKzc2Myw3IEBACiAJCX0KIAogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKIAkJLyoKIAkJICogTW9kaWZ5IHRoZSB1bndyaXR0ZW4gZXh0ZW50IHN0YXRlIG9mIHRoZSBidWZmZXIuCkBAIC03NzYsNyArNzcyLDcgQEAKIAkJbmltYXBzID0gMTsKIAkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsCiAJCQkJICBYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX0NPTlZFUlQsICZmaXJzdGZzYiwKLQkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0LCBOVUxMKTsKKwkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5oIGIvZnMveGZzL3hmc19pb21hcC5oCmluZGV4IDgxYWM0YWYuLjc3NDhhNDMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuaAorKysgYi9mcy94ZnMveGZzX2lvbWFwLmgKQEAgLTE4LDE3ICsxOCwxNiBAQAogI2lmbmRlZiBfX1hGU19JT01BUF9IX18KICNkZWZpbmUgX19YRlNfSU9NQVBfSF9fCiAKLXR5cGVkZWYgZW51bSB7Ci0JLyogYmFzZSBleHRlbnQgbWFuaXB1bGF0aW9uIGNhbGxzICovCi0JQk1BUElfUkVBRCA9ICgxIDw8IDApLAkJLyogcmVhZCBleHRlbnRzICovCi0JQk1BUElfV1JJVEUgPSAoMSA8PCAxKSwJCS8qIGNyZWF0ZSBleHRlbnRzICovCi0JQk1BUElfQUxMT0NBVEUgPSAoMSA8PCAyKSwJLyogZGVsYXllZCBhbGxvY2F0ZSB0byByZWFsIGV4dGVudHMgKi8KLQkvKiBtb2RpZmllcnMgKi8KLQlCTUFQSV9JR05TVEFURSA9ICgxIDw8IDQpLAkvKiBpZ25vcmUgdW53cml0dGVuIHN0YXRlIG9uIHJlYWQgKi8KLQlCTUFQSV9ESVJFQ1QgPSAoMSA8PCA1KSwJLyogZGlyZWN0IGluc3RlYWQgb2YgYnVmZmVyZWQgd3JpdGUgKi8KLQlCTUFQSV9NTUFQID0gKDEgPDwgNiksCQkvKiBhbGxvY2F0ZSBmb3IgbW1hcCB3cml0ZSAqLwotCUJNQVBJX1RSWUxPQ0sgPSAoMSA8PCA3KSwJLyogbm9uLWJsb2NraW5nIHJlcXVlc3QgKi8KLX0gYm1hcGlfZmxhZ3NfdDsKKy8qIGJhc2UgZXh0ZW50IG1hbmlwdWxhdGlvbiBjYWxscyAqLworI2RlZmluZSBCTUFQSV9SRUFECSgxIDw8IDApCS8qIHJlYWQgZXh0ZW50cyAqLworI2RlZmluZSBCTUFQSV9XUklURQkoMSA8PCAxKQkvKiBjcmVhdGUgZXh0ZW50cyAqLworI2RlZmluZSBCTUFQSV9BTExPQ0FURQkoMSA8PCAyKQkvKiBkZWxheWVkIGFsbG9jYXRlIHRvIHJlYWwgZXh0ZW50cyAqLworCisvKiBtb2RpZmllcnMgKi8KKyNkZWZpbmUgQk1BUElfSUdOU1RBVEUJKDEgPDwgNCkJLyogaWdub3JlIHVud3JpdHRlbiBzdGF0ZSBvbiByZWFkICovCisjZGVmaW5lIEJNQVBJX0RJUkVDVAkoMSA8PCA1KQkvKiBkaXJlY3QgaW5zdGVhZCBvZiBidWZmZXJlZCB3cml0ZSAqLworI2RlZmluZSBCTUFQSV9NTUEJKDEgPDwgNikJLyogYWxsb2NhdGUgZm9yIG1tYXAgd3JpdGUgKi8KKyNkZWZpbmUgQk1BUElfVFJZTE9DSwkoMSA8PCA3KQkvKiBub24tYmxvY2tpbmcgcmVxdWVzdCAqLwogCiAjZGVmaW5lIEJNQVBJX0ZMQUdTIFwKIAl7IEJNQVBJX1JFQUQsCQkiUkVBRCIgfSwgXApAQCAtMzYsNyArMzUsNiBAQAogCXsgQk1BUElfQUxMT0NBVEUsCSJBTExPQ0FURSIgfSwgXAogCXsgQk1BUElfSUdOU1RBVEUsCSJJR05TVEFURSIgfSwgXAogCXsgQk1BUElfRElSRUNULAkJIkRJUkVDVCIgfSwgXAotCXsgQk1BUElfTU1BUCwJCSJNTUFQIiB9LCBcCiAJeyBCTUFQSV9UUllMT0NLLAkiVFJZTE9DSyIgfQogCiBzdHJ1Y3QgeGZzX2lub2RlOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pdGFibGUuYyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKaW5kZXggMmI4NmY4Ni4uN2UzNjI2ZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pdGFibGUuYworKysgYi9mcy94ZnMveGZzX2l0YWJsZS5jCkBAIC0yNCwyMCArMjQsMTcgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIAogU1RBVElDIGludAogeGZzX2ludGVybmFsX2ludW0oCkBAIC0xNDMsNyArMTQwLDggQEAKIAkJYnVmLT5ic19ibG9ja3MgPSBkaWMtPmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3M7CiAJCWJyZWFrOwogCX0KLQl4ZnNfaXB1dChpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCUlSRUxFKGlwKTsKIAogCWVycm9yID0gZm9ybWF0dGVyKGJ1ZmZlciwgdWJzaXplLCB1YnVzZWQsIGJ1Zik7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmMgYi9mcy94ZnMveGZzX2xvZy5jCmluZGV4IDUyMTVhYmMuLjkyNWQ1NzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmMKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCkBAIC0zNSw4ICszMyw2IEBACiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgogI2luY2x1ZGUgInhmc19sb2dfcmVjb3Zlci5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfcncuaCIKQEAgLTMzNyw3ICszMzMsNiBAQAogCWludAkJCXJldHZhbCA9IDA7CiAKIAlBU1NFUlQoY2xpZW50ID09IFhGU19UUkFOU0FDVElPTiB8fCBjbGllbnQgPT0gWEZTX0xPRyk7Ci0JQVNTRVJUKChmbGFncyAmIFhGU19MT0dfTk9TTEVFUCkgPT0gMCk7CiAKIAlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwpAQCAtNTUyLDcgKzU0Nyw3IEBACiAJCQkJLm1hZ2ljID0gWExPR19VTk1PVU5UX1RZUEUsCiAJCQl9OwogCQkJc3RydWN0IHhmc19sb2dfaW92ZWMgcmVnID0gewotCQkJCS5pX2FkZHIgPSAodm9pZCAqKSZtYWdpYywKKwkJCQkuaV9hZGRyID0gJm1hZ2ljLAogCQkJCS5pX2xlbiA9IHNpemVvZihtYWdpYyksCiAJCQkJLmlfdHlwZSA9IFhMT0dfUkVHX1RZUEVfVU5NT1VOVCwKIAkJCX07CkBAIC0xMDQ3LDcgKzEwNDIsNiBAQAogCXhsb2dfaW5fY29yZV90CQkqaWNsb2csICpwcmV2X2ljbG9nPU5VTEw7CiAJeGZzX2J1Zl90CQkqYnA7CiAJaW50CQkJaTsKLQlpbnQJCQlpY2xvZ3NpemU7CiAJaW50CQkJZXJyb3IgPSBFTk9NRU07CiAJdWludAkJCWxvZzJfc2l6ZSA9IDA7CiAKQEAgLTExMjcsNyArMTEyMSw2IEBACiAJICogd2l0aCBkaWZmZXJlbnQgYW1vdW50cyBvZiBtZW1vcnkuICBTZWUgdGhlIGRlZmluaXRpb24gb2YKIAkgKiB4bG9nX2luX2NvcmVfdCBpbiB4ZnNfbG9nX3ByaXYuaCBmb3IgZGV0YWlscy4KIAkgKi8KLQlpY2xvZ3NpemUgPSBsb2ctPmxfaWNsb2dfc2l6ZTsKIAlBU1NFUlQobG9nLT5sX2ljbG9nX3NpemUgPj0gNDA5Nik7CiAJZm9yIChpPTA7IGkgPCBsb2ctPmxfaWNsb2dfYnVmczsgaSsrKSB7CiAJCSppY2xvZ3AgPSBrbWVtX3phbGxvYyhzaXplb2YoeGxvZ19pbl9jb3JlX3QpLCBLTV9NQVlGQUlMKTsKQEAgLTE0MjgsMTEgKzE0MjEsOCBAQAogCVhGU19CVUZfQlVTWShicCk7CiAJWEZTX0JVRl9BU1lOQyhicCk7CiAJYnAtPmJfZmxhZ3MgfD0gWEJGX0xPR19CVUZGRVI7Ci0JLyoKLQkgKiBEbyBhbiBvcmRlcmVkIHdyaXRlIGZvciB0aGUgbG9nIGJsb2NrLgotCSAqIEl0cyB1bm5lY2Vzc2FyeSB0byBmbHVzaCB0aGUgZmlyc3Qgc3BsaXQgYmxvY2sgaW4gdGhlIGxvZyB3cmFwIGNhc2UuCi0JICovCi0JaWYgKCFzcGxpdCAmJiAobG9nLT5sX21wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpKQorCisJaWYgKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQogCQlYRlNfQlVGX09SREVSRUQoYnApOwogCiAJQVNTRVJUKFhGU19CVUZfQUREUihicCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZS0xKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmggYi9mcy94ZnMveGZzX2xvZy5oCmluZGV4IDA0Yzc4ZTYuLjkxNmViN2QgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmgKKysrIGIvZnMveGZzL3hmc19sb2cuaApAQCAtNTUsMTQgKzU1LDEwIEBACiAvKgogICogRmxhZ3MgdG8geGZzX2xvZ19yZXNlcnZlKCkKICAqCi0gKglYRlNfTE9HX1NMRUVQOgkgSWYgc3BhY2UgaXMgbm90IGF2YWlsYWJsZSwgc2xlZXAgKGRlZmF1bHQpCi0gKglYRlNfTE9HX05PU0xFRVA6IElmIHNwYWNlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBlcnJvcgogICoJWEZTX0xPR19QRVJNX1JFU0VSVjogUGVybWFuZW50IHJlc2VydmF0aW9uLiAgV2hlbiB3cml0ZXMgYXJlCiAgKgkJcGVyZm9ybWVkIGFnYWluc3QgdGhpcyB0eXBlIG9mIHJlc2VydmF0aW9uLCB0aGUgcmVzZXJ2YXRpb24KICAqCQlpcyBub3QgZGVjcmVhc2VkLiAgTG9uZyBydW5uaW5nIHRyYW5zYWN0aW9ucyBzaG91bGQgdXNlIHRoaXMuCiAgKi8KLSNkZWZpbmUgWEZTX0xPR19TTEVFUAkJMHgwCi0jZGVmaW5lIFhGU19MT0dfTk9TTEVFUAkJMHgxCiAjZGVmaW5lIFhGU19MT0dfUEVSTV9SRVNFUlYJMHgyCiAKIC8qCkBAIC0xMDQsNyArMTAwLDcgQEAKICNkZWZpbmUgWExPR19SRUdfVFlQRV9NQVgJCTE5CiAKIHR5cGVkZWYgc3RydWN0IHhmc19sb2dfaW92ZWMgewotCXhmc19jYWRkcl90CWlfYWRkcjsJCS8qIGJlZ2lubmluZyBhZGRyZXNzIG9mIHJlZ2lvbiAqLworCXZvaWQJCSppX2FkZHI7CS8qIGJlZ2lubmluZyBhZGRyZXNzIG9mIHJlZ2lvbiAqLwogCWludAkJaV9sZW47CQkvKiBsZW5ndGggaW4gYnl0ZXMgb2YgcmVnaW9uICovCiAJdWludAkJaV90eXBlOwkJLyogdHlwZSBvZiByZWdpb24gKi8KIH0geGZzX2xvZ19pb3ZlY190OwpAQCAtMjAxLDkgKzE5Nyw0IEBACiBib29sCXhmc19sb2dfaXRlbV9pbl9jdXJyZW50X2Noa3B0KHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCk7CiAKICNlbmRpZgotCi0KLWV4dGVybiBpbnQgeGxvZ19kZWJ1ZzsJCS8qIHNldCB0byAxIHRvIGVuYWJsZSByZWFsIGxvZyAqLwotCi0KICNlbmRpZgkvKiBfX1hGU19MT0dfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCmluZGV4IGJiMTdjYzAuLjMxZTRlYTIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKQEAgLTU1NCw3ICs1NTIsNyBAQAogCXRoZHIudGhfdHlwZSA9IFhGU19UUkFOU19DSEVDS1BPSU5UOwogCXRoZHIudGhfdGlkID0gdGljLT50X3RpZDsKIAl0aGRyLnRoX251bV9pdGVtcyA9IG51bV9pb3ZlY3M7Ci0JbGhkci5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJnRoZHI7CisJbGhkci5pX2FkZHIgPSAmdGhkcjsKIAlsaGRyLmlfbGVuID0gc2l6ZW9mKHhmc190cmFuc19oZWFkZXJfdCk7CiAJbGhkci5pX3R5cGUgPSBYTE9HX1JFR19UWVBFX1RSQU5TSERSOwogCXRpYy0+dF9jdXJyX3JlcyAtPSBsaGRyLmlfbGVuICsgc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IDlhYzVjZmEuLjZmM2Y1ZmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTI0LDE1ICsyNCwxMSBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgpAQCAtMTU2NSw5ICsxNTYxLDcgQEAKIAogCWxpc3Rfc3BsaWNlX2luaXQoJnRyYW5zLT5yX2l0ZW1xLCAmc29ydF9saXN0KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRlbSwgbiwgJnNvcnRfbGlzdCwgcmlfbGlzdCkgewotCQl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2Y7Ci0KLQkJYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3QgKilpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCQl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCiAJCXN3aXRjaCAoSVRFTV9UWVBFKGl0ZW0pKSB7CiAJCWNhc2UgWEZTX0xJX0JVRjoKQEAgLTE4OTIsOSArMTg4Niw4IEBACiAJCSAqIGN1cnJlbnQgZGlfbmV4dF91bmxpbmtlZCBmaWVsZC4gIEV4dHJhY3QgaXRzIHZhbHVlCiAJCSAqIGFuZCBjb3B5IGl0IHRvIHRoZSBidWZmZXIgY29weS4KIAkJICovCi0JCWxvZ2dlZF9uZXh0cCA9ICh4ZnNfYWdpbm9fdCAqKQotCQkJICAgICAgICgoY2hhciAqKShpdGVtLT5yaV9idWZbaXRlbV9pbmRleF0uaV9hZGRyKSArCi0JCQkJKG5leHRfdW5saW5rZWRfb2Zmc2V0IC0gcmVnX2J1Zl9vZmZzZXQpKTsKKwkJbG9nZ2VkX25leHRwID0gaXRlbS0+cmlfYnVmW2l0ZW1faW5kZXhdLmlfYWRkciArCisJCQkJbmV4dF91bmxpbmtlZF9vZmZzZXQgLSByZWdfYnVmX29mZnNldDsKIAkJaWYgKHVubGlrZWx5KCpsb2dnZWRfbmV4dHAgPT0gMCkpIHsKIAkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKIAkJCQkiYmFkIGlub2RlIGJ1ZmZlciBsb2cgcmVjb3JkIChwdHIgPSAweCVwLCBicCA9IDB4JXApLiAgWEZTIHRyeWluZyB0byByZXBsYXkgYmFkICgwKSBpbm9kZSBkaV9uZXh0X3VubGlua2VkIGZpZWxkIiwKQEAgLTE5NzMsOCArMTk2Niw3IEBACiAJCQkJCWl0ZW0tPnJpX2J1ZltpXS5pX2xlbiwgX19mdW5jX18pOwogCQkJCWdvdG8gbmV4dDsKIAkJCX0KLQkJCWVycm9yID0geGZzX3FtX2RxY2hlY2soKHhmc19kaXNrX2RxdW90X3QgKikKLQkJCQkJICAgICAgIGl0ZW0tPnJpX2J1ZltpXS5pX2FkZHIsCisJCQllcnJvciA9IHhmc19xbV9kcWNoZWNrKGl0ZW0tPnJpX2J1ZltpXS5pX2FkZHIsCiAJCQkJCSAgICAgICAtMSwgMCwgWEZTX1FNT1BUX0RPV0FSTiwKIAkJCQkJICAgICAgICJkcXVvdF9idWZfcmVjb3ZlciIpOwogCQkJaWYgKGVycm9yKQpAQCAtMjE4Nyw3ICsyMTc5LDcgQEAKIAl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAogCWludAkJCXBhc3MpCiB7Ci0JeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mOworCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZiA9IGl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CiAJeGZzX21vdW50X3QJCSptcDsKIAl4ZnNfYnVmX3QJCSpicDsKIAlpbnQJCQllcnJvcjsKQEAgLTIxOTcsOCArMjE4OSw2IEBACiAJdXNob3J0CQkJZmxhZ3M7CiAJdWludAkJCWJ1Zl9mbGFnczsKIAotCWJ1Zl9mID0gKHhmc19idWZfbG9nX2Zvcm1hdF90ICopaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKLQogCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgewogCQkvKgogCQkgKiBJbiB0aGlzIHBhc3Mgd2UncmUgb25seSBsb29raW5nIGZvciBidWYgaXRlbXMKQEAgLTIzMTksMTAgKzIzMDksOSBAQAogCX0KIAogCWlmIChpdGVtLT5yaV9idWZbMF0uaV9sZW4gPT0gc2l6ZW9mKHhmc19pbm9kZV9sb2dfZm9ybWF0X3QpKSB7Ci0JCWluX2YgPSAoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJCWluX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCX0gZWxzZSB7Ci0JCWluX2YgPSAoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCAqKWttZW1fYWxsb2MoCi0JCQlzaXplb2YoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCksIEtNX1NMRUVQKTsKKwkJaW5fZiA9IGttZW1fYWxsb2Moc2l6ZW9mKHhmc19pbm9kZV9sb2dfZm9ybWF0X3QpLCBLTV9TTEVFUCk7CiAJCW5lZWRfZnJlZSA9IDE7CiAJCWVycm9yID0geGZzX2lub2RlX2l0ZW1fZm9ybWF0X2NvbnZlcnQoJml0ZW0tPnJpX2J1ZlswXSwgaW5fZik7CiAJCWlmIChlcnJvcikKQEAgLTIzNzAsNyArMjM1OSw3IEBACiAJCWVycm9yID0gRUZTQ09SUlVQVEVEOwogCQlnb3RvIGVycm9yOwogCX0KLQlkaWNwID0gKHhmc19pY2Rpbm9kZV90ICopKGl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIpOworCWRpY3AgPSBpdGVtLT5yaV9idWZbMV0uaV9hZGRyOwogCWlmICh1bmxpa2VseShkaWNwLT5kaV9tYWdpYyAhPSBYRlNfRElOT0RFX01BR0lDKSkgewogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLApAQCAtMjQ2MSw3ICsyNDUwLDcgQEAKIAl9CiAKIAkvKiBUaGUgY29yZSBpcyBpbiBpbi1jb3JlIGZvcm1hdCAqLwotCXhmc19kaW5vZGVfdG9fZGlzayhkaXAsICh4ZnNfaWNkaW5vZGVfdCAqKWl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIpOworCXhmc19kaW5vZGVfdG9fZGlzayhkaXAsIGl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIpOwogCiAJLyogdGhlIHJlc3QgaXMgaW4gb24tZGlzayBmb3JtYXQgKi8KIAlpZiAoaXRlbS0+cmlfYnVmWzFdLmlfbGVuID4gc2l6ZW9mKHN0cnVjdCB4ZnNfaWNkaW5vZGUpKSB7CkBAIC0yNTc4LDcgKzI1NjcsNyBAQAogCQlyZXR1cm4gKDApOwogCX0KIAotCXFvZmZfZiA9ICh4ZnNfcW9mZl9sb2dmb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJcW9mZl9mID0gaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKIAlBU1NFUlQocW9mZl9mKTsKIAogCS8qCkBAIC0yNjIyLDkgKzI2MTEsOCBAQAogCWlmIChtcC0+bV9xZmxhZ3MgPT0gMCkKIAkJcmV0dXJuICgwKTsKIAotCXJlY2RkcSA9ICh4ZnNfZGlza19kcXVvdF90ICopaXRlbS0+cmlfYnVmWzFdLmlfYWRkcjsKLQotCWlmIChpdGVtLT5yaV9idWZbMV0uaV9hZGRyID09IE5VTEwpIHsKKwlyZWNkZHEgPSBpdGVtLT5yaV9idWZbMV0uaV9hZGRyOworCWlmIChyZWNkZHEgPT0gTlVMTCkgewogCQljbW5fZXJyKENFX0FMRVJULAogCQkJIlhGUzogTlVMTCBkcXVvdCBpbiAlcy4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKQEAgLTI2NTQsNyArMjY0Miw3IEBACiAJICogVGhlIG90aGVyIHBvc3NpYmlsaXR5LCBvZiBjb3Vyc2UsIGlzIHRoYXQgdGhlIHF1b3RhIHN1YnN5c3RlbSB3YXMKIAkgKiByZW1vdmVkIHNpbmNlIHRoZSBsYXN0IG1vdW50IC0gRU5PU1lTLgogCSAqLwotCWRxX2YgPSAoeGZzX2RxX2xvZ2Zvcm1hdF90ICopaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKKwlkcV9mID0gaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKIAlBU1NFUlQoZHFfZik7CiAJaWYgKChlcnJvciA9IHhmc19xbV9kcWNoZWNrKHJlY2RkcSwKIAkJCSAgIGRxX2YtPnFsZl9pZCwKQEAgLTI3MjEsNyArMjcwOSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWVmaV9mb3JtYXRwID0gKHhmc19lZmlfbG9nX2Zvcm1hdF90ICopaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKKwllZmlfZm9ybWF0cCA9IGl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CiAKIAltcCA9IGxvZy0+bF9tcDsKIAllZmlwID0geGZzX2VmaV9pbml0KG1wLCBlZmlfZm9ybWF0cC0+ZWZpX25leHRlbnRzKTsKQEAgLTI3NjcsNyArMjc1NSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQllZmRfZm9ybWF0cCA9ICh4ZnNfZWZkX2xvZ19mb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJZWZkX2Zvcm1hdHAgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCUFTU0VSVCgoaXRlbS0+cmlfYnVmWzBdLmlfbGVuID09IChzaXplb2YoeGZzX2VmZF9sb2dfZm9ybWF0XzMyX3QpICsKIAkJKChlZmRfZm9ybWF0cC0+ZWZkX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF8zMl90KSkpKSB8fAogCSAgICAgICAoaXRlbS0+cmlfYnVmWzBdLmlfbGVuID09IChzaXplb2YoeGZzX2VmZF9sb2dfZm9ybWF0XzY0X3QpICsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuYyBiL2ZzL3hmcy94ZnNfbW91bnQuYwppbmRleCA2OWY2MmQ4Li5hZWI5ZDcyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmMKKysrIGIvZnMveGZzL3hmc19tb3VudC5jCkBAIC0yNSwxMyArMjUsMTAgQEAKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmggYi9mcy94ZnMveGZzX21vdW50LmgKaW5kZXggNTc2MTA4Ny4uNjIyZGEyMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5oCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuaApAQCAtNjYsNjUgKzY2LDYgQEAKIHN0cnVjdCB4ZnNfYWlsOwogc3RydWN0IHhmc19xdW90YWluZm87CiAKLQotLyoKLSAqIFByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIERhdGEgTWlncmF0aW9uIHN1YnN5c3RlbS4KLSAqLwotCi10eXBlZGVmIGludAkoKnhmc19zZW5kX2RhdGFfdCkoaW50LCBzdHJ1Y3QgeGZzX2lub2RlICosCi0JCQl4ZnNfb2ZmX3QsIHNpemVfdCwgaW50LCBpbnQgKik7Ci10eXBlZGVmIGludAkoKnhmc19zZW5kX21tYXBfdCkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVpbnQpOwotdHlwZWRlZiBpbnQJKCp4ZnNfc2VuZF9kZXN0cm95X3QpKHN0cnVjdCB4ZnNfaW5vZGUgKiwgZG1fcmlnaHRfdCk7Ci10eXBlZGVmIGludAkoKnhmc19zZW5kX25hbWVzcF90KShkbV9ldmVudHR5cGVfdCwgc3RydWN0IHhmc19tb3VudCAqLAotCQkJc3RydWN0IHhmc19pbm9kZSAqLCBkbV9yaWdodF90LAotCQkJc3RydWN0IHhmc19pbm9kZSAqLCBkbV9yaWdodF90LAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosCi0JCQltb2RlX3QsIGludCwgaW50KTsKLXR5cGVkZWYgaW50CSgqeGZzX3NlbmRfbW91bnRfdCkoc3RydWN0IHhmc19tb3VudCAqLCBkbV9yaWdodF90LAotCQkJY2hhciAqLCBjaGFyICopOwotdHlwZWRlZiB2b2lkCSgqeGZzX3NlbmRfdW5tb3VudF90KShzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKLQkJCWRtX3JpZ2h0X3QsIG1vZGVfdCwgaW50LCBpbnQpOwotCi10eXBlZGVmIHN0cnVjdCB4ZnNfZG1vcHMgewotCXhmc19zZW5kX2RhdGFfdAkJeGZzX3NlbmRfZGF0YTsKLQl4ZnNfc2VuZF9tbWFwX3QJCXhmc19zZW5kX21tYXA7Ci0JeGZzX3NlbmRfZGVzdHJveV90CXhmc19zZW5kX2Rlc3Ryb3k7Ci0JeGZzX3NlbmRfbmFtZXNwX3QJeGZzX3NlbmRfbmFtZXNwOwotCXhmc19zZW5kX21vdW50X3QJeGZzX3NlbmRfbW91bnQ7Ci0JeGZzX3NlbmRfdW5tb3VudF90CXhmc19zZW5kX3VubW91bnQ7Ci19IHhmc19kbW9wc190OwotCi0jZGVmaW5lIFhGU19ETUFQSV9VTk1PVU5UX0ZMQUdTKG1wKSBcCi0JKCgobXApLT5tX2RtZXZtYXNrICYgKDEgPDwgRE1fRVZFTlRfVU5NT1VOVCkpID8gMCA6IERNX0ZMQUdTX1VOV0FOVEVEKQotCi0jZGVmaW5lIFhGU19TRU5EX0RBVEEobXAsIGV2LGlwLG9mZixsZW4sZmwsbG9jaykgXAotCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX2RhdGEpKGV2LGlwLG9mZixsZW4sZmwsbG9jaykKLSNkZWZpbmUgWEZTX1NFTkRfTU1BUChtcCwgdm1hLGZsKSBcCi0JKCoobXApLT5tX2RtX29wcy0+eGZzX3NlbmRfbW1hcCkodm1hLGZsKQotI2RlZmluZSBYRlNfU0VORF9ERVNUUk9ZKG1wLCBpcCxyaWdodCkgXAotCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX2Rlc3Ryb3kpKGlwLHJpZ2h0KQotI2RlZmluZSBYRlNfU0VORF9OQU1FU1AobXAsIGV2LGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkgXAotCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX25hbWVzcCkoZXYsTlVMTCxiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpCi0jZGVmaW5lIFhGU19TRU5EX01PVU5UKG1wLHJpZ2h0LHBhdGgsbmFtZSkgXAotCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX21vdW50KShtcCxyaWdodCxwYXRoLG5hbWUpCi0jZGVmaW5lIFhGU19TRU5EX1BSRVVOTU9VTlQobXApIFwKLWRvIHsgXAotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgeyBcCi0JCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX25hbWVzcCkoRE1fRVZFTlRfUFJFVU5NT1VOVCwgbXAsIFwKLQkJCShtcCktPm1fcm9vdGlwLCBETV9SSUdIVF9OVUxMLCBcCi0JCQkobXApLT5tX3Jvb3RpcCwgRE1fUklHSFRfTlVMTCwgXAotCQkJTlVMTCwgTlVMTCwgMCwgMCwgWEZTX0RNQVBJX1VOTU9VTlRfRkxBR1MobXApKTsgXAotCX0gXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX1NFTkRfVU5NT1VOVChtcCkgXAotZG8geyBcCi0JaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RNQVBJKSB7IFwKLQkJKCoobXApLT5tX2RtX29wcy0+eGZzX3NlbmRfdW5tb3VudCkobXAsIChtcCktPm1fcm9vdGlwLCBcCi0JCQlETV9SSUdIVF9OVUxMLCAwLCAwLCBYRlNfRE1BUElfVU5NT1VOVF9GTEFHUyhtcCkpOyBcCi0JfSBcCi19IHdoaWxlICgwKQotCi0KICNpZmRlZiBIQVZFX1BFUkNQVV9TQgogCiAvKgpAQCAtMjQxLDggKzE4Miw2IEBACiAJdWludAkJCW1fY2hzaXplOwkvKiBzaXplIG9mIG5leHQgZmllbGQgKi8KIAlzdHJ1Y3QgeGZzX2NoYXNoCSptX2NoYXNoOwkvKiBmcyBwcml2YXRlIGlub2RlIHBlci1jbHVzdGVyCiAJCQkJCQkgKiBoYXNoIHRhYmxlICovCi0Jc3RydWN0IHhmc19kbW9wcwkqbV9kbV9vcHM7CS8qIHZlY3RvciBvZiBETUkgb3BzICovCi0Jc3RydWN0IHhmc19xbW9wcwkqbV9xbV9vcHM7CS8qIHZlY3RvciBvZiBYUU0gb3BzICovCiAJYXRvbWljX3QJCW1fYWN0aXZlX3RyYW5zOwkvKiBudW1iZXIgdHJhbnMgZnJvemVuICovCiAjaWZkZWYgSEFWRV9QRVJDUFVfU0IKIAl4ZnNfaWNzYl9jbnRzX3QgX19wZXJjcHUgKm1fc2JfY250czsJLyogcGVyLWNwdSBzdXBlcmJsb2NrIGNvdW50ZXJzICovCkBAIC0yNjksNyArMjA4LDYgQEAKIAkJCQkJCSAgIG11c3QgYmUgc3luY2hyb25vdXMgZXhjZXB0CiAJCQkJCQkgICBmb3Igc3BhY2UgYWxsb2NhdGlvbnMgKi8KICNkZWZpbmUgWEZTX01PVU5UX0RFTEFZTE9HCSgxVUxMIDw8IDEpCS8qIGRlbGF5ZWQgbG9nZ2luZyBpcyBlbmFibGVkICovCi0jZGVmaW5lIFhGU19NT1VOVF9ETUFQSQkJKDFVTEwgPDwgMikJLyogZG1hcGkgaXMgZW5hYmxlZCAqLwogI2RlZmluZSBYRlNfTU9VTlRfV0FTX0NMRUFOCSgxVUxMIDw8IDMpCiAjZGVmaW5lIFhGU19NT1VOVF9GU19TSFVURE9XTgkoMVVMTCA8PCA0KQkvKiBhdG9taWMgc3RvcCBvZiBhbGwgZmlsZXN5c3RlbQogCQkJCQkJICAgb3BlcmF0aW9ucywgdHlwaWNhbGx5IGZvcgpAQCAtMjgyLDggKzIyMCw2IEBACiAjZGVmaW5lIFhGU19NT1VOVF9HUlBJRAkJKDFVTEwgPDwgOSkJLyogZ3JvdXAtSUQgYXNzaWduZWQgZnJvbSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgWEZTX01PVU5UX05PUkVDT1ZFUlkJKDFVTEwgPDwgMTApCS8qIG5vIHJlY292ZXJ5IC0gZGlydHkgZnMgKi8KICNkZWZpbmUgWEZTX01PVU5UX0RGTFRfSU9TSVpFCSgxVUxMIDw8IDEyKQkvKiBzZXQgZGVmYXVsdCBpL28gc2l6ZSAqLwotI2RlZmluZSBYRlNfTU9VTlRfT1NZTkNJU09TWU5DCSgxVUxMIDw8IDEzKQkvKiBvX3N5bmMgaXMgUkVBTExZIG9fc3luYyAqLwotCQkJCQkJLyogb3N5bmNpc2RzeW5jIGlzIG5vdyBkZWZhdWx0Ki8KICNkZWZpbmUgWEZTX01PVU5UXzMyQklUSU5PREVTCSgxVUxMIDw8IDE0KQkvKiBkbyBub3QgY3JlYXRlIGlub2RlcyBhYm92ZQogCQkJCQkJICogMzIgYml0cyBpbiBzaXplICovCiAjZGVmaW5lIFhGU19NT1VOVF9TTUFMTF9JTlVNUwkoMVVMTCA8PCAxNSkJLyogdXNlcnMgd2FudHMgMzJiaXQgaW5vZGVzICovCkBAIC00NDAsMTEgKzM3Niw2IEBACiAKIGV4dGVybiBpbnQJeGZzX2Rldl9pc19yZWFkX29ubHkoc3RydWN0IHhmc19tb3VudCAqLCBjaGFyICopOwogCi1leHRlcm4gaW50CXhmc19kbW9wc19nZXQoc3RydWN0IHhmc19tb3VudCAqKTsKLWV4dGVybiB2b2lkCXhmc19kbW9wc19wdXQoc3RydWN0IHhmc19tb3VudCAqKTsKLQotZXh0ZXJuIHN0cnVjdCB4ZnNfZG1vcHMgeGZzX2RtY29yZV94ZnM7Ci0KICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKIGV4dGVybiB2b2lkCXhmc19tb2Rfc2Ioc3RydWN0IHhmc190cmFucyAqLCBfX2ludDY0X3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19yZW5hbWUuYyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKaW5kZXggZmMxY2RhMi4uOGZjYTk1NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19yZW5hbWUuYworKysgYi9mcy94ZnMveGZzX3JlbmFtZS5jCkBAIC0yNCwxMiArMjQsOSBAQAogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCkBAIC0xMTYsMjAgKzExMyw3IEBACiAJaW50CQlzcGFjZXJlczsKIAlpbnQJCW51bV9pbm9kZXM7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KHNyY19kcCk7Ci0JeGZzX2l0cmFjZV9lbnRyeSh0YXJnZXRfZHApOwotCi0JaWYgKERNX0VWRU5UX0VOQUJMRUQoc3JjX2RwLCBETV9FVkVOVF9SRU5BTUUpIHx8Ci0JICAgIERNX0VWRU5UX0VOQUJMRUQodGFyZ2V0X2RwLCBETV9FVkVOVF9SRU5BTUUpKSB7Ci0JCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9SRU5BTUUsCi0JCQkJCXNyY19kcCwgRE1fUklHSFRfTlVMTCwKLQkJCQkJdGFyZ2V0X2RwLCBETV9SSUdIVF9OVUxMLAotCQkJCQlzcmNfbmFtZS0+bmFtZSwgdGFyZ2V0X25hbWUtPm5hbWUsCi0JCQkJCTAsIDAsIDApOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCS8qIFJldHVybiB0aHJvdWdoIHN0ZF9yZXR1cm4gYWZ0ZXIgdGhpcyBwb2ludC4gKi8KKwl0cmFjZV94ZnNfcmVuYW1lKHNyY19kcCwgdGFyZ2V0X2RwLCBzcmNfbmFtZSwgdGFyZ2V0X25hbWUpOwogCiAJbmV3X3BhcmVudCA9IChzcmNfZHAgIT0gdGFyZ2V0X2RwKTsKIAlzcmNfaXNfZGlyZWN0b3J5ID0gKChzcmNfaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKQEAgLTE4NCwyNiArMTY4LDE0IEBACiAJLyoKIAkgKiBKb2luIGFsbCB0aGUgaW5vZGVzIHRvIHRoZSB0cmFuc2FjdGlvbi4gRnJvbSB0aGlzIHBvaW50IG9uLAogCSAqIHdlIGNhbiByZWx5IG9uIGVpdGhlciB0cmFuc19jb21taXQgb3IgdHJhbnNfY2FuY2VsIHRvIHVubG9jawotCSAqIHRoZW0uICBOb3RlIHRoYXQgd2UgbmVlZCB0byBhZGQgYSB2bm9kZSByZWZlcmVuY2UgdG8gdGhlCi0JICogZGlyZWN0b3JpZXMgc2luY2UgdHJhbnNfY29tbWl0ICYgdHJhbnNfY2FuY2VsIHdpbGwgZGVjcmVtZW50Ci0JICogdGhlbSB3aGVuIHRoZXkgdW5sb2NrIHRoZSBpbm9kZXMuICBBbHNvLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwKLQkgKiBub3QgdG8gYWRkIGFuIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbiBtb3JlIHRoYW4gb25jZS4KKwkgKiB0aGVtLgogCSAqLwotCUlIT0xEKHNyY19kcCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBzcmNfZHAsIFhGU19JTE9DS19FWENMKTsKLQotCWlmIChuZXdfcGFyZW50KSB7Ci0JCUlIT0xEKHRhcmdldF9kcCk7Ci0JCXhmc190cmFuc19pam9pbih0cCwgdGFyZ2V0X2RwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JfQotCi0JSUhPTEQoc3JjX2lwKTsKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIHNyY19pcCwgWEZTX0lMT0NLX0VYQ0wpOwotCi0JaWYgKHRhcmdldF9pcCkgewotCQlJSE9MRCh0YXJnZXRfaXApOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIHRhcmdldF9pcCwgWEZTX0lMT0NLX0VYQ0wpOwotCX0KKwl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBzcmNfZHAsIFhGU19JTE9DS19FWENMKTsKKwlpZiAobmV3X3BhcmVudCkKKwkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgdGFyZ2V0X2RwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgc3JjX2lwLCBYRlNfSUxPQ0tfRVhDTCk7CisJaWYgKHRhcmdldF9pcCkKKwkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgdGFyZ2V0X2lwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKIAkvKgogCSAqIElmIHdlIGFyZSB1c2luZyBwcm9qZWN0IGluaGVyaXRhbmNlLCB3ZSBvbmx5IGFsbG93IHJlbmFtZXMKQEAgLTM2OSwyNiArMzQxLDEzIEBACiAJICogdHJhbnNfY29tbWl0IHdpbGwgdW5sb2NrIHNyY19pcCwgdGFyZ2V0X2lwICYgZGVjcmVtZW50CiAJICogdGhlIHZub2RlIHJlZmVyZW5jZXMuCiAJICovCi0JZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKLQotCS8qIEZhbGwgdGhyb3VnaCB0byBzdGRfcmV0dXJuIHdpdGggZXJyb3IgPSAwIG9yIGVycm5vIGZyb20KLQkgKiB4ZnNfdHJhbnNfY29tbWl0CSAqLwotc3RkX3JldHVybjoKLQlpZiAoRE1fRVZFTlRfRU5BQkxFRChzcmNfZHAsIERNX0VWRU5UX1BPU1RSRU5BTUUpIHx8Ci0JICAgIERNX0VWRU5UX0VOQUJMRUQodGFyZ2V0X2RwLCBETV9FVkVOVF9QT1NUUkVOQU1FKSkgewotCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQIChtcCwgRE1fRVZFTlRfUE9TVFJFTkFNRSwKLQkJCQkJc3JjX2RwLCBETV9SSUdIVF9OVUxMLAotCQkJCQl0YXJnZXRfZHAsIERNX1JJR0hUX05VTEwsCi0JCQkJCXNyY19uYW1lLT5uYW1lLCB0YXJnZXRfbmFtZS0+bmFtZSwKLQkJCQkJMCwgZXJyb3IsIDApOwotCX0KLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpOwogCiAgYWJvcnRfcmV0dXJuOgogCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7Ci0JLyogRkFMTFRIUk9VR0ggKi8KICBlcnJvcl9yZXR1cm46CiAJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOwogCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7Ci0JZ290byBzdGRfcmV0dXJuOworIHN0ZF9yZXR1cm46CisJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ydGFsbG9jLmMgYi9mcy94ZnMveGZzX3J0YWxsb2MuYwppbmRleCBhMmQzMmNlLi44OTEyNjBmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3J0YWxsb2MuYworKysgYi9mcy94ZnMveGZzX3J0YWxsb2MuYwpAQCAtMjUsMTcgKzI1LDEwIEBACiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCkBAIC0xMjksNyArMTIyLDcgQEAKIAkJY2FuY2VsZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOwogCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG9ibG9ja3MsIG5ibG9ja3MgLSBvYmxvY2tzLAogCQkJWEZTX0JNQVBJX1dSSVRFIHwgWEZTX0JNQVBJX01FVEFEQVRBLCAmZmlyc3RibG9jaywKLQkJCXJlc2Jsa3MsICZtYXAsICZubWFwLCAmZmxpc3QsIE5VTEwpOworCQkJcmVzYmxrcywgJm1hcCwgJm5tYXAsICZmbGlzdCk7CiAJCWlmICghZXJyb3IgJiYgbm1hcCA8IDEpCiAJCQllcnJvciA9IFhGU19FUlJPUihFTk9TUEMpOwogCQlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmMgYi9mcy94ZnMveGZzX3J3LmMKaW5kZXggZTMzNjc0Mi4uNTY4NjFkNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5jCisrKyBiL2ZzL3hmcy94ZnNfcncuYwpAQCAtMjQsMjcgKzI0LDEyIEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2l0YWJsZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19hbGxvYy5oIgotI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0ci5oIgotI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCi0jaW5jbHVkZSAieGZzX3RyYWNlLmgiCiAKIC8qCiAgKiBGb3JjZSBhIHNodXRkb3duIG9mIHRoZSBmaWxlc3lzdGVtIGluc3RhbnRseSB3aGlsZSBrZWVwaW5nCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmMgYi9mcy94ZnMveGZzX3RyYW5zLmMKaW5kZXggMjg1NDdkZi4uZmRjYTc0MSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTI0LDE2ICsyNSwxMiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKQEAgLTQ3LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIAoga21lbV96b25lX3QJKnhmc190cmFuc196b25lOwora21lbV96b25lX3QJKnhmc19sb2dfaXRlbV9kZXNjX3pvbmU7CiAKIAogLyoKQEAgLTU5Nyw4ICs1OTUsNyBAQAogCXRwLT50X21hZ2ljID0gWEZTX1RSQU5TX01BR0lDOwogCXRwLT50X3R5cGUgPSB0eXBlOwogCXRwLT50X21vdW50cCA9IG1wOwotCXRwLT50X2l0ZW1zX2ZyZWUgPSBYRlNfTElDX05VTV9TTE9UUzsKLQl4ZnNfbGljX2luaXQoJih0cC0+dF9pdGVtcykpOworCUlOSVRfTElTVF9IRUFEKCZ0cC0+dF9pdGVtcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnRwLT50X2J1c3kpOwogCXJldHVybiB0cDsKIH0KQEAgLTY0Myw4ICs2NDAsNyBAQAogCW50cC0+dF9tYWdpYyA9IFhGU19UUkFOU19NQUdJQzsKIAludHAtPnRfdHlwZSA9IHRwLT50X3R5cGU7CiAJbnRwLT50X21vdW50cCA9IHRwLT50X21vdW50cDsKLQludHAtPnRfaXRlbXNfZnJlZSA9IFhGU19MSUNfTlVNX1NMT1RTOwotCXhmc19saWNfaW5pdCgmKG50cC0+dF9pdGVtcykpOworCUlOSVRfTElTVF9IRUFEKCZudHAtPnRfaXRlbXMpOwogCUlOSVRfTElTVF9IRUFEKCZudHAtPnRfYnVzeSk7CiAKIAlBU1NFUlQodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKQEAgLTExMjQsNiArMTEyMCwxMDggQEAKIH0KIAogLyoKKyAqIEFkZCB0aGUgZ2l2ZW4gbG9nIGl0ZW0gdG8gdGhlIHRyYW5zYWN0aW9uJ3MgbGlzdCBvZiBsb2cgaXRlbXMuCisgKgorICogVGhlIGxvZyBpdGVtIHdpbGwgbm93IHBvaW50IHRvIGl0cyBuZXcgZGVzY3JpcHRvciB3aXRoIGl0cyBsaV9kZXNjIGZpZWxkLgorICovCit2b2lkCit4ZnNfdHJhbnNfYWRkX2l0ZW0oCisJc3RydWN0IHhmc190cmFucwkqdHAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQoreworCXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyAqbGlkcDsKKworCUFTU0VSVChsaXAtPmxpX21vdW50cCA9IHRwLT50X21vdW50cCk7CisJQVNTRVJUKGxpcC0+bGlfYWlscCA9IHRwLT50X21vdW50cC0+bV9haWwpOworCisJbGlkcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2xvZ19pdGVtX2Rlc2Nfem9uZSwgS01fU0xFRVAgfCBLTV9OT0ZTKTsKKworCWxpZHAtPmxpZF9pdGVtID0gbGlwOworCWxpZHAtPmxpZF9mbGFncyA9IDA7CisJbGlkcC0+bGlkX3NpemUgPSAwOworCWxpc3RfYWRkX3RhaWwoJmxpZHAtPmxpZF90cmFucywgJnRwLT50X2l0ZW1zKTsKKworCWxpcC0+bGlfZGVzYyA9IGxpZHA7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfZnJlZV9pdGVtX2Rlc2MoCisJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICpsaWRwKQoreworCWxpc3RfZGVsX2luaXQoJmxpZHAtPmxpZF90cmFucyk7CisJa21lbV96b25lX2ZyZWUoeGZzX2xvZ19pdGVtX2Rlc2Nfem9uZSwgbGlkcCk7Cit9CisKKy8qCisgKiBVbmxpbmsgYW5kIGZyZWUgdGhlIGdpdmVuIGRlc2NyaXB0b3IuCisgKi8KK3ZvaWQKK3hmc190cmFuc19kZWxfaXRlbSgKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCit7CisJeGZzX3RyYW5zX2ZyZWVfaXRlbV9kZXNjKGxpcC0+bGlfZGVzYyk7CisJbGlwLT5saV9kZXNjID0gTlVMTDsKK30KKworLyoKKyAqIFVubG9jayBhbGwgb2YgdGhlIGl0ZW1zIG9mIGEgdHJhbnNhY3Rpb24gYW5kIGZyZWUgYWxsIHRoZSBkZXNjcmlwdG9ycworICogb2YgdGhhdCB0cmFuc2FjdGlvbi4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19mcmVlX2l0ZW1zKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAorCXhmc19sc25fdAkJY29tbWl0X2xzbiwKKwlpbnQJCQlmbGFncykKK3sKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgKmxpZHAsICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpZHAsIG5leHQsICZ0cC0+dF9pdGVtcywgbGlkX3RyYW5zKSB7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCA9IGxpZHAtPmxpZF9pdGVtOworCisJCWxpcC0+bGlfZGVzYyA9IE5VTEw7CisKKwkJaWYgKGNvbW1pdF9sc24gIT0gTlVMTENPTU1JVExTTikKKwkJCUlPUF9DT01NSVRUSU5HKGxpcCwgY29tbWl0X2xzbik7CisJCWlmIChmbGFncyAmIFhGU19UUkFOU19BQk9SVCkKKwkJCWxpcC0+bGlfZmxhZ3MgfD0gWEZTX0xJX0FCT1JURUQ7CisJCUlPUF9VTkxPQ0sobGlwKTsKKworCQl4ZnNfdHJhbnNfZnJlZV9pdGVtX2Rlc2MobGlkcCk7CisJfQorfQorCisvKgorICogVW5sb2NrIHRoZSBpdGVtcyBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbi4KKyAqCisgKiBJdGVtcyB3aGljaCB3ZXJlIG5vdCBsb2dnZWQgc2hvdWxkIGJlIGZyZWVkLiAgVGhvc2Ugd2hpY2ggd2VyZSBsb2dnZWQgbXVzdAorICogc3RpbGwgYmUgdHJhY2tlZCBzbyB0aGV5IGNhbiBiZSB1bnBpbm5lZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX3VubG9ja19pdGVtcygKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKKwl4ZnNfbHNuX3QJCWNvbW1pdF9sc24pCit7CisJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICpsaWRwLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaWRwLCBuZXh0LCAmdHAtPnRfaXRlbXMsIGxpZF90cmFucykgeworCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAgPSBsaWRwLT5saWRfaXRlbTsKKworCQlsaXAtPmxpX2Rlc2MgPSBOVUxMOworCisJCWlmIChjb21taXRfbHNuICE9IE5VTExDT01NSVRMU04pCisJCQlJT1BfQ09NTUlUVElORyhsaXAsIGNvbW1pdF9sc24pOworCQlJT1BfVU5MT0NLKGxpcCk7CisKKwkJLyoKKwkJICogRnJlZSB0aGUgZGVzY3JpcHRvciBpZiB0aGUgaXRlbSBpcyBub3QgZGlydHkKKwkJICogd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uCisJCSAqLworCQlpZiAoIShsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKSkKKwkJCXhmc190cmFuc19mcmVlX2l0ZW1fZGVzYyhsaWRwKTsKKwl9Cit9CisKKy8qCiAgKiBUb3RhbCB1cCB0aGUgbnVtYmVyIG9mIGxvZyBpb3ZlY3MgbmVlZGVkIHRvIGNvbW1pdCB0aGlzCiAgKiB0cmFuc2FjdGlvbi4gIFRoZSB0cmFuc2FjdGlvbiBpdHNlbGYgbmVlZHMgb25lIGZvciB0aGUKICAqIHRyYW5zYWN0aW9uIGhlYWRlci4gIEFzayBlYWNoIGRpcnR5IGl0ZW0gaW4gdHVybiBob3cgbWFueQpAQCAtMTEzNCwzMCArMTIzMiwyNyBAQAogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwKQogewogCWludAkJCW52ZWNzOwotCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICpsaWRwOwogCiAJbnZlY3MgPSAxOwotCWxpZHAgPSB4ZnNfdHJhbnNfZmlyc3RfaXRlbSh0cCk7Ci0JQVNTRVJUKGxpZHAgIT0gTlVMTCk7CiAKIAkvKiBJbiB0aGUgbm9uLWRlYnVnIGNhc2Ugd2UgbmVlZCB0byBzdGFydCBiYWlsaW5nIG91dCBpZiB3ZQogCSAqIGRpZG4ndCBmaW5kIGEgbG9nX2l0ZW0gaGVyZSwgcmV0dXJuIHplcm8gYW5kIGxldCB0cmFuc19jb21taXQKIAkgKiBkZWFsIHdpdGggaXQuCiAJICovCi0JaWYgKGxpZHAgPT0gTlVMTCkKKwlpZiAobGlzdF9lbXB0eSgmdHAtPnRfaXRlbXMpKSB7CisJCUFTU0VSVCgwKTsKIAkJcmV0dXJuIDA7CisJfQogCi0Jd2hpbGUgKGxpZHAgIT0gTlVMTCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkobGlkcCwgJnRwLT50X2l0ZW1zLCBsaWRfdHJhbnMpIHsKIAkJLyoKIAkJICogU2tpcCBpdGVtcyB3aGljaCBhcmVuJ3QgZGlydHkgaW4gdGhpcyB0cmFuc2FjdGlvbi4KIAkJICovCi0JCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKSB7Ci0JCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKQogCQkJY29udGludWU7Ci0JCX0KIAkJbGlkcC0+bGlkX3NpemUgPSBJT1BfU0laRShsaWRwLT5saWRfaXRlbSk7CiAJCW52ZWNzICs9IGxpZHAtPmxpZF9zaXplOwotCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CiAJfQogCiAJcmV0dXJuIG52ZWNzOwpAQCAtMTE3Nyw3ICsxMjcyLDcgQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKIAlzdHJ1Y3QgeGZzX2xvZ19pb3ZlYwkqbG9nX3ZlY3RvcikKIHsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyAqbGlkcDsKIAlzdHJ1Y3QgeGZzX2xvZ19pb3ZlYwkqdmVjcDsKIAl1aW50CQkJbml0ZW1zOwogCkBAIC0xMTg4LDE0ICsxMjgzLDExIEBACiAJdmVjcCA9IGxvZ192ZWN0b3IgKyAxOwogCiAJbml0ZW1zID0gMDsKLQlsaWRwID0geGZzX3RyYW5zX2ZpcnN0X2l0ZW0odHApOwotCUFTU0VSVChsaWRwKTsKLQl3aGlsZSAobGlkcCkgeworCUFTU0VSVCghbGlzdF9lbXB0eSgmdHAtPnRfaXRlbXMpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpZHAsICZ0cC0+dF9pdGVtcywgbGlkX3RyYW5zKSB7CiAJCS8qIFNraXAgaXRlbXMgd2hpY2ggYXJlbid0IGRpcnR5IGluIHRoaXMgdHJhbnNhY3Rpb24uICovCi0JCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKSB7Ci0JCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKQogCQkJY29udGludWU7Ci0JCX0KIAogCQkvKgogCQkgKiBUaGUgaXRlbSBtYXkgYmUgbWFya2VkIGRpcnR5IGJ1dCBub3QgbG9nIGFueXRoaW5nLiAgVGhpcyBjYW4KQEAgLTEyMDYsNyArMTI5OCw2IEBACiAJCUlPUF9GT1JNQVQobGlkcC0+bGlkX2l0ZW0sIHZlY3ApOwogCQl2ZWNwICs9IGxpZHAtPmxpZF9zaXplOwogCQlJT1BfUElOKGxpZHAtPmxpZF9pdGVtKTsKLQkJbGlkcCA9IHhmc190cmFuc19uZXh0X2l0ZW0odHAsIGxpZHApOwogCX0KIAogCS8qCkBAIC0xMjg0LDcgKzEzNzUsNyBAQAogCSAqIGxvZyBpdGVtIGZsYWdzLCBpZiBhbnlvbmUgZWxzZSBzdGFsZXMgdGhlIGJ1ZmZlciB3ZSBkbyBub3Qgd2FudCB0bwogCSAqIHBheSBhbnkgYXR0ZW50aW9uIHRvIGl0LgogCSAqLwotCUlPUF9VTlBJTihsaXApOworCUlPUF9VTlBJTihsaXAsIDApOwogfQogCiAvKgpAQCAtMTMwMSwyNCArMTM5MiwxNSBAQAogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAogCWludAkJCWFib3J0ZmxhZykKIHsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwotCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOwotCXhmc19sb2dfaXRlbV9jaHVua190CSpuZXh0X2xpY3A7CisJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICpsaWRwLCAqbmV4dDsKIAogCS8qIENhbGwgdGhlIHRyYW5zYWN0aW9uJ3MgY29tcGxldGlvbiBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuICovCiAJaWYgKHRwLT50X2NhbGxiYWNrICE9IE5VTEwpCiAJCXRwLT50X2NhbGxiYWNrKHRwLCB0cC0+dF9jYWxsYXJnKTsKIAotCWZvciAobGlkcCA9IHhmc190cmFuc19maXJzdF9pdGVtKHRwKTsKLQkgICAgIGxpZHAgIT0gTlVMTDsKLQkgICAgIGxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaWRwLCBuZXh0LCAmdHAtPnRfaXRlbXMsIGxpZF90cmFucykgewogCQl4ZnNfdHJhbnNfaXRlbV9jb21taXR0ZWQobGlkcC0+bGlkX2l0ZW0sIHRwLT50X2xzbiwgYWJvcnRmbGFnKTsKLQl9Ci0KLQkvKiBmcmVlIHRoZSBpdGVtIGNodW5rcywgaWdub3JpbmcgdGhlIGVtYmVkZGVkIGNodW5rICovCi0JZm9yIChsaWNwID0gdHAtPnRfaXRlbXMubGljX25leHQ7IGxpY3AgIT0gTlVMTDsgbGljcCA9IG5leHRfbGljcCkgewotCQluZXh0X2xpY3AgPSBsaWNwLT5saWNfbmV4dDsKLQkJa21lbV9mcmVlKGxpY3ApOworCQl4ZnNfdHJhbnNfZnJlZV9pdGVtX2Rlc2MobGlkcCk7CiAJfQogCiAJeGZzX3RyYW5zX2ZyZWUodHApOwpAQCAtMTMzMywxNiArMTQxNSwxNCBAQAogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAogCXVpbnQJCQlmbGFncykKIHsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyAqbGlkcDsKIAotCWZvciAobGlkcCA9IHhmc190cmFuc19maXJzdF9pdGVtKHRwKTsKLQkgICAgIGxpZHAgIT0gTlVMTDsKLQkgICAgIGxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkobGlkcCwgJnRwLT50X2l0ZW1zLCBsaWRfdHJhbnMpIHsKIAkJLyoKIAkJICogVW5waW4gYWxsIGJ1dCB0aG9zZSB0aGF0IGFyZW4ndCBkaXJ0eS4KIAkJICovCiAJCWlmIChsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKQotCQkJSU9QX1VOUElOX1JFTU9WRShsaWRwLT5saWRfaXRlbSwgdHApOworCQkJSU9QX1VOUElOKGxpZHAtPmxpZF9pdGVtLCAxKTsKIAl9CiAKIAl4ZnNfdHJhbnNfdW5yZXNlcnZlX2FuZF9tb2Rfc2IodHApOwpAQCAtMTUwOCwzMyArMTU4OCwyOCBAQAogeGZzX3RyYW5zX2FsbG9jX2xvZ192ZWNzKAogCXhmc190cmFuc190CSp0cCkKIHsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyAqbGlkcDsKIAlzdHJ1Y3QgeGZzX2xvZ192ZWMJKmx2ID0gTlVMTDsKIAlzdHJ1Y3QgeGZzX2xvZ192ZWMJKnJldF9sdiA9IE5VTEw7CiAKLQlsaWRwID0geGZzX3RyYW5zX2ZpcnN0X2l0ZW0odHApOwogCiAJLyogQmFpbCBvdXQgaWYgd2UgZGlkbid0IGZpbmQgYSBsb2cgaXRlbS4gICovCi0JaWYgKCFsaWRwKSB7CisJaWYgKGxpc3RfZW1wdHkoJnRwLT50X2l0ZW1zKSkgewogCQlBU1NFUlQoMCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXdoaWxlIChsaWRwICE9IE5VTEwpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpZHAsICZ0cC0+dF9pdGVtcywgbGlkX3RyYW5zKSB7CiAJCXN0cnVjdCB4ZnNfbG9nX3ZlYyAqbmV3X2x2OwogCiAJCS8qIFNraXAgaXRlbXMgd2hpY2ggYXJlbid0IGRpcnR5IGluIHRoaXMgdHJhbnNhY3Rpb24uICovCi0JCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKSB7Ci0JCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKQogCQkJY29udGludWU7Ci0JCX0KIAogCQkvKiBTa2lwIGl0ZW1zIHRoYXQgZG8gbm90IGhhdmUgYW55IHZlY3RvcnMgZm9yIHdyaXRpbmcgKi8KIAkJbGlkcC0+bGlkX3NpemUgPSBJT1BfU0laRShsaWRwLT5saWRfaXRlbSk7Ci0JCWlmICghbGlkcC0+bGlkX3NpemUpIHsKLQkJCWxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKTsKKwkJaWYgKCFsaWRwLT5saWRfc2l6ZSkKIAkJCWNvbnRpbnVlOwotCQl9CiAKIAkJbmV3X2x2ID0ga21lbV96YWxsb2Moc2l6ZW9mKCpuZXdfbHYpICsKIAkJCQlsaWRwLT5saWRfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeGZzX2xvZ19pb3ZlYyksCkBAIC0xNTQ5LDcgKzE2MjQsNiBAQAogCQllbHNlCiAJCQlsdi0+bHZfbmV4dCA9IG5ld19sdjsKIAkJbHYgPSBuZXdfbHY7Ci0JCWxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKTsKIAl9CiAKIAlyZXR1cm4gcmV0X2x2OwpAQCAtMTcwOCwxMiArMTc4Miw2IEBACiAJaW50CQkJZmxhZ3MpCiB7CiAJaW50CQkJbG9nX2ZsYWdzOwotI2lmZGVmIERFQlVHCi0JeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7Ci0JeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKLQl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKLQlpbnQJCQlpOwotI2VuZGlmCiAJeGZzX21vdW50X3QJCSptcCA9IHRwLT50X21vdW50cDsKIAogCS8qCkBAIC0xNzMyLDIxICsxODAwLDExIEBACiAJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgU0hVVERPV05fQ09SUlVQVF9JTkNPUkUpOwogCX0KICNpZmRlZiBERUJVRwotCWlmICghKGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUKSkgewotCQlsaWNwID0gJih0cC0+dF9pdGVtcyk7Ci0JCXdoaWxlIChsaWNwICE9IE5VTEwpIHsKLQkJCWxpZHAgPSBsaWNwLT5saWNfZGVzY3M7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrLCBsaWRwKyspIHsKLQkJCQlpZiAoeGZzX2xpY19pc2ZyZWUobGljcCwgaSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQorCWlmICghKGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUKSAmJiAhWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICpsaWRwOwogCi0JCQkJbGlwID0gbGlkcC0+bGlkX2l0ZW07Ci0JCQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJCQkJQVNTRVJUKCEobGlwLT5saV90eXBlID09IFhGU19MSV9FRkQpKTsKLQkJCX0KLQkJCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKLQkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpZHAsICZ0cC0+dF9pdGVtcywgbGlkX3RyYW5zKQorCQkJQVNTRVJUKCEobGlkcC0+bGlkX2l0ZW0tPmxpX3R5cGUgPT0gWEZTX0xJX0VGRCkpOwogCX0KICNlbmRpZgogCXhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYih0cCk7CkBAIC0xODM0LDcgKzE4OTIsNiBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JeGZzX3RyYW5zX2lqb2luKHRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19paG9sZCh0cmFucywgZHApOworCXhmc190cmFuc19pam9pbih0cmFucywgZHApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5oIGIvZnMveGZzL3hmc190cmFucy5oCmluZGV4IGU2MzllOGUuLmMxM2MwZjkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zLmgKQEAgLTE2MSwxMDUgKzE2MSwxNCBAQAogICogdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gbG9nIHRoZSBpdGVtIGl0IGRlc2NyaWJlcwogICogb25jZSB3ZSBnZXQgdG8gY29tbWl0IHByb2Nlc3NpbmcgKHNlZSB4ZnNfdHJhbnNfY29tbWl0KCkpLgogICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyB7CitzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgewogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpZF9pdGVtOwotCXVzaG9ydAkJbGlkX3NpemU7Ci0JdW5zaWduZWQgY2hhcglsaWRfZmxhZ3M7Ci0JdW5zaWduZWQgY2hhcglsaWRfaW5kZXg7Ci19IHhmc19sb2dfaXRlbV9kZXNjX3Q7CisJdXNob3J0CQkJbGlkX3NpemU7CisJdW5zaWduZWQgY2hhcgkJbGlkX2ZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQJbGlkX3RyYW5zOworfTsKIAogI2RlZmluZSBYRlNfTElEX0RJUlRZCQkweDEKLSNkZWZpbmUgWEZTX0xJRF9QSU5ORUQJCTB4MgotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWludGFpbiBhIGNodW5rIGxpc3Qgb2YgbG9nX2l0ZW1fZGVzYwotICogc3RydWN0dXJlcy4gVGhlIGZyZWUgZmllbGQgaXMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggZGVzY3JpcHRvcnMKLSAqIGluIHRoaXMgY2h1bmsncyBhcnJheSBhcmUgZnJlZS4gIFRoZSB1bnVzZWQgZmllbGQgaXMgdGhlIGZpcnN0IHZhbHVlCi0gKiBub3QgdXNlZCBzaW5jZSB0aGlzIGNodW5rIHdhcyBhbGxvY2F0ZWQuCi0gKi8KLSNkZWZpbmUJWEZTX0xJQ19OVU1fU0xPVFMJMTUKLXR5cGVkZWYgc3RydWN0IHhmc19sb2dfaXRlbV9jaHVuayB7Ci0Jc3RydWN0IHhmc19sb2dfaXRlbV9jaHVuawkqbGljX25leHQ7Ci0JdXNob3J0CQkJCWxpY19mcmVlOwotCXVzaG9ydAkJCQlsaWNfdW51c2VkOwotCXhmc19sb2dfaXRlbV9kZXNjX3QJCWxpY19kZXNjc1tYRlNfTElDX05VTV9TTE9UU107Ci19IHhmc19sb2dfaXRlbV9jaHVua190OwotCi0jZGVmaW5lCVhGU19MSUNfTUFYX1NMT1QJKFhGU19MSUNfTlVNX1NMT1RTIC0gMSkKLSNkZWZpbmUJWEZTX0xJQ19GUkVFTUFTSwkoKDEgPDwgWEZTX0xJQ19OVU1fU0xPVFMpIC0gMSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgZ2l2ZW4gY2h1bmsuICBTZXQgdGhlIGNodW5rJ3MgZnJlZSBkZXNjcmlwdG9yIG1hc2sKLSAqIHRvIGluZGljYXRlIHRoYXQgYWxsIGRlc2NyaXB0b3JzIGFyZSBmcmVlLiAgVGhlIGNhbGxlciBnZXRzIHRvIHNldAotICogbGljX3VudXNlZCB0byB0aGUgcmlnaHQgdmFsdWUgKDAgbWF0Y2hlcyBhbGwgZnJlZSkuICBUaGUKLSAqIGxpY19kZXNjcy5saWRfaW5kZXggdmFsdWVzIGFyZSBzZXQgdXAgYXMgZWFjaCBkZXNjIGlzIGFsbG9jYXRlZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHhmc19saWNfaW5pdCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCi17Ci0JY3AtPmxpY19mcmVlID0gWEZTX0xJQ19GUkVFTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHhmc19saWNfaW5pdF9zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCi17Ci0JY3AtPmxpY19kZXNjc1tzbG90XS5saWRfaW5kZXggPSAodW5zaWduZWQgY2hhcikoc2xvdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHhmc19saWNfdmFjYW5jeSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCi17Ci0JcmV0dXJuIGNwLT5saWNfZnJlZSAmIFhGU19MSUNfRlJFRU1BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfbGljX2FsbF9mcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCkKLXsKLQljcC0+bGljX2ZyZWUgPSBYRlNfTElDX0ZSRUVNQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfbGljX2FyZV9hbGxfZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCi17Ci0JcmV0dXJuICgoY3AtPmxpY19mcmVlICYgWEZTX0xJQ19GUkVFTUFTSykgPT0gWEZTX0xJQ19GUkVFTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHhmc19saWNfaXNmcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCi17Ci0JcmV0dXJuIChjcC0+bGljX2ZyZWUgJiAoMSA8PCBzbG90KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfbGljX2NsYWltKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCi17Ci0JY3AtPmxpY19mcmVlICY9IH4oMSA8PCBzbG90KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHhmc19saWNfcmVsc2UoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKLXsKLQljcC0+bGljX2ZyZWUgfD0gMSA8PCBzbG90OwotfQotCi1zdGF0aWMgaW5saW5lIHhmc19sb2dfaXRlbV9kZXNjX3QgKgoteGZzX2xpY19zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCi17Ci0JcmV0dXJuICYoY3AtPmxpY19kZXNjc1tzbG90XSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHhmc19saWNfZGVzY190b19zbG90KHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKQotewotCXJldHVybiAodWludClkcC0+bGlkX2luZGV4OwotfQotCi0vKgotICogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIGEgY2h1bmsgZ2l2ZW4gYSBkZXNjcmlwdG9yIHBvaW50ZXI6Ci0gKiBkcCAtIGRwLT5saWRfaW5kZXggZ2l2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpY19kZXNjcyBhcnJheS4KLSAqIEZyb20gdGhpcyB3ZSBzdWJ0cmFjdCB0aGUgb2Zmc2V0IG9mIHRoZSBsaWNfZGVzY3MgZmllbGQgaW4gYSBjaHVuay4KLSAqIEFsbCBvZiB0aGlzIHlpZWxkcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2h1bmssIHdoaWNoIGlzCi0gKiBjYXN0IHRvIGEgY2h1bmsgcG9pbnRlci4KLSAqLwotc3RhdGljIGlubGluZSB4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqCi14ZnNfbGljX2Rlc2NfdG9fY2h1bmsoeGZzX2xvZ19pdGVtX2Rlc2NfdCAqZHApCi17Ci0JcmV0dXJuICh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCopIFwKLQkJKCgoeGZzX2NhZGRyX3QpKChkcCkgLSAoZHApLT5saWRfaW5kZXgpKSAtIFwKLQkJKHhmc19jYWRkcl90KSgoKHhmc19sb2dfaXRlbV9jaHVua190KikwKS0+bGljX2Rlc2NzKSk7Ci19CiAKICNkZWZpbmUJWEZTX1RSQU5TX01BR0lDCQkweDU0NTI0MTRFCS8qICdUUkFOJyAqLwogLyoKQEAgLTI3NSw4ICsxODQsNiBAQAogLyoKICAqIFZhbHVlcyBmb3IgY2FsbCBmbGFncyBwYXJhbWV0ZXIuCiAgKi8KLSNkZWZpbmUJWEZTX1RSQU5TX05PU0xFRVAJCTB4MQotI2RlZmluZQlYRlNfVFJBTlNfV0FJVAkJCTB4MgogI2RlZmluZQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTCTB4NAogI2RlZmluZQlYRlNfVFJBTlNfQUJPUlQJCQkweDgKIApAQCAtNDM4LDggKzM0NSw3IEBACiAJdWludCAoKmlvcF9zaXplKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKIAl2b2lkICgqaW9wX2Zvcm1hdCkoeGZzX2xvZ19pdGVtX3QgKiwgc3RydWN0IHhmc19sb2dfaW92ZWMgKik7CiAJdm9pZCAoKmlvcF9waW4pKHhmc19sb2dfaXRlbV90ICopOwotCXZvaWQgKCppb3BfdW5waW4pKHhmc19sb2dfaXRlbV90ICopOwotCXZvaWQgKCppb3BfdW5waW5fcmVtb3ZlKSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICopOworCXZvaWQgKCppb3BfdW5waW4pKHhmc19sb2dfaXRlbV90ICosIGludCByZW1vdmUpOwogCXVpbnQgKCppb3BfdHJ5bG9jaykoeGZzX2xvZ19pdGVtX3QgKik7CiAJdm9pZCAoKmlvcF91bmxvY2spKHhmc19sb2dfaXRlbV90ICopOwogCXhmc19sc25fdCAoKmlvcF9jb21taXR0ZWQpKHhmc19sb2dfaXRlbV90ICosIHhmc19sc25fdCk7CkBAIC00NTEsOCArMzU3LDcgQEAKICNkZWZpbmUgSU9QX1NJWkUoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3NpemUpKGlwKQogI2RlZmluZSBJT1BfRk9STUFUKGlwLHZwKQkoKihpcCktPmxpX29wcy0+aW9wX2Zvcm1hdCkoaXAsIHZwKQogI2RlZmluZSBJT1BfUElOKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9waW4pKGlwKQotI2RlZmluZSBJT1BfVU5QSU4oaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3VucGluKShpcCkKLSNkZWZpbmUgSU9QX1VOUElOX1JFTU9WRShpcCx0cCkgKCooaXApLT5saV9vcHMtPmlvcF91bnBpbl9yZW1vdmUpKGlwLCB0cCkKKyNkZWZpbmUgSU9QX1VOUElOKGlwLCByZW1vdmUpCSgqKGlwKS0+bGlfb3BzLT5pb3BfdW5waW4pKGlwLCByZW1vdmUpCiAjZGVmaW5lIElPUF9UUllMT0NLKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF90cnlsb2NrKShpcCkKICNkZWZpbmUgSU9QX1VOTE9DSyhpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfdW5sb2NrKShpcCkKICNkZWZpbmUgSU9QX0NPTU1JVFRFRChpcCwgbHNuKQkoKihpcCktPmxpX29wcy0+aW9wX2NvbW1pdHRlZCkoaXAsIGxzbikKQEAgLTUxNiw4ICs0MjEsNyBAQAogCWludDY0X3QJCQl0X3JibG9ja3NfZGVsdGE7Lyogc3VwZXJibG9jayByYmxvY2tzIGNoYW5nZSAqLwogCWludDY0X3QJCQl0X3JleHRlbnRzX2RlbHRhOy8qIHN1cGVyYmxvY2tzIHJleHRlbnRzIGNoZyAqLwogCWludDY0X3QJCQl0X3JleHRzbG9nX2RlbHRhOy8qIHN1cGVyYmxvY2tzIHJleHRzbG9nIGNoZyAqLwotCXVuc2lnbmVkIGludAkJdF9pdGVtc19mcmVlOwkvKiBsb2cgaXRlbSBkZXNjcyBmcmVlICovCi0JeGZzX2xvZ19pdGVtX2NodW5rX3QJdF9pdGVtczsJLyogZmlyc3QgbG9nIGl0ZW0gZGVzYyBjaHVuayAqLworCXN0cnVjdCBsaXN0X2hlYWQJdF9pdGVtczsJLyogbG9nIGl0ZW0gZGVzY3JpcHRvcnMgKi8KIAl4ZnNfdHJhbnNfaGVhZGVyX3QJdF9oZWFkZXI7CS8qIGhlYWRlciBmb3IgaW4tbG9nIHRyYW5zICovCiAJc3RydWN0IGxpc3RfaGVhZAl0X2J1c3k7CQkvKiBsaXN0IG9mIGJ1c3kgZXh0ZW50cyAqLwogCXVuc2lnbmVkIGxvbmcJCXRfcGZsYWdzOwkvKiBzYXZlZCBwcm9jZXNzIGZsYWdzIHN0YXRlICovCkBAIC01NjksOCArNDczLDggQEAKIHZvaWQJCXhmc190cmFuc19pbm9kZV9hbGxvY19idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiBpbnQJCXhmc190cmFuc19pZ2V0KHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX3RyYW5zX3QgKiwKIAkJCSAgICAgICB4ZnNfaW5vX3QgLCB1aW50LCB1aW50LCBzdHJ1Y3QgeGZzX2lub2RlICoqKTsKLXZvaWQJCXhmc190cmFuc19pam9pbih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2lub2RlICosIHVpbnQpOwotdm9pZAkJeGZzX3RyYW5zX2lob2xkKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfaW5vZGUgKik7Cit2b2lkCQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKK3ZvaWQJCXhmc190cmFuc19pam9pbihzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKik7CiB2b2lkCQl4ZnNfdHJhbnNfbG9nX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50LCB1aW50KTsKIHZvaWQJCXhmc190cmFuc19sb2dfaW5vZGUoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKIHN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZ2V0X2VmaSh4ZnNfdHJhbnNfdCAqLCB1aW50KTsKQEAgLTU5NSw2ICs0OTksNyBAQAogdm9pZAkJeGZzX3RyYW5zX2FpbF9kZXN0cm95KHN0cnVjdCB4ZnNfbW91bnQgKik7CiAKIGV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX3RyYW5zX3pvbmU7CitleHRlcm4ga21lbV96b25lX3QJKnhmc19sb2dfaXRlbV9kZXNjX3pvbmU7CiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCmluZGV4IGU3OTk4MjQuLmRjOTA2OTUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19haWwuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jIGIvZnMveGZzL3hmc190cmFuc19idWYuYwppbmRleCA2M2Q4MWEyLi45MGFmMDI1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKQEAgLTI0LDE0ICsyNCwxMCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKQEAgLTUxLDM2ICs0NywxNyBAQAogCXhmc19kYWRkcl90CQlibGtubywKIAlpbnQJCQlsZW4pCiB7Ci0JeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7Ci0JeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJsaXA7Ci0JaW50CQkJaTsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgKmxpZHA7CisJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJsaXA7CiAKIAlsZW4gPSBCQlRPQihsZW4pOwotCWZvciAobGljcCA9ICZ0cC0+dF9pdGVtczsgbGljcCAhPSBOVUxMOyBsaWNwID0gbGljcC0+bGljX25leHQpIHsKLQkJaWYgKHhmc19saWNfYXJlX2FsbF9mcmVlKGxpY3ApKSB7Ci0JCQlBU1NFUlQobGljcCA9PSAmdHAtPnRfaXRlbXMpOwotCQkJQVNTRVJUKGxpY3AtPmxpY19uZXh0ID09IE5VTEwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrKSB7Ci0JCQkvKgotCQkJICogU2tpcCB1bm9jY3VwaWVkIHNsb3RzLgotCQkJICovCi0JCQlpZiAoeGZzX2xpY19pc2ZyZWUobGljcCwgaSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWxpZHAgPSB4ZnNfbGljX3Nsb3QobGljcCwgaSk7Ci0JCQlibGlwID0gKHhmc19idWZfbG9nX2l0ZW1fdCAqKWxpZHAtPmxpZF9pdGVtOwotCQkJaWYgKGJsaXAtPmJsaV9pdGVtLmxpX3R5cGUgIT0gWEZTX0xJX0JVRikKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKFhGU19CVUZfVEFSR0VUKGJsaXAtPmJsaV9idWYpID09IHRhcmdldCAmJgotCQkJICAgIFhGU19CVUZfQUREUihibGlwLT5ibGlfYnVmKSA9PSBibGtubyAmJgotCQkJICAgIFhGU19CVUZfQ09VTlQoYmxpcC0+YmxpX2J1ZikgPT0gbGVuKQotCQkJCXJldHVybiBibGlwLT5ibGlfYnVmOwotCQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsaWRwLCAmdHAtPnRfaXRlbXMsIGxpZF90cmFucykgeworCQlibGlwID0gKHN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtICopbGlkcC0+bGlkX2l0ZW07CisJCWlmIChibGlwLT5ibGlfaXRlbS5saV90eXBlID09IFhGU19MSV9CVUYgJiYKKwkJICAgIFhGU19CVUZfVEFSR0VUKGJsaXAtPmJsaV9idWYpID09IHRhcmdldCAmJgorCQkgICAgWEZTX0JVRl9BRERSKGJsaXAtPmJsaV9idWYpID09IGJsa25vICYmCisJCSAgICBYRlNfQlVGX0NPVU5UKGJsaXAtPmJsaV9idWYpID09IGxlbikKKwkJCXJldHVybiBibGlwLT5ibGlfYnVmOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtMTI3LDcgKzEwNCw3IEBACiAJLyoKIAkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KIAkgKi8KLQkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOworCXhmc190cmFuc19hZGRfaXRlbSh0cCwgJmJpcC0+YmxpX2l0ZW0pOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIGJfZnNwcml2YXRlMiBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIGluY29yZV9tYXRjaCgpCkBAIC00ODMsNyArNDYwLDYgQEAKIHsKIAl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKIAl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwogCiAJLyoKIAkgKiBEZWZhdWx0IHRvIGEgbm9ybWFsIGJyZWxzZSgpIGNhbGwgaWYgdGhlIHRwIGlzIE5VTEwuCkBAIC01MTQsMTMgKzQ5MCw2IEBACiAJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAotCS8qCi0JICogRmluZCB0aGUgaXRlbSBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHRoaXMgYnVmZmVyJ3MKLQkgKiBsb2cgaXRlbS4gIEl0IG11c3QgYmUgdGhlcmUuCi0JICovCi0JbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopYmlwKTsKLQlBU1NFUlQobGlkcCAhPSBOVUxMKTsKLQogCXRyYWNlX3hmc190cmFuc19icmVsc2UoYmlwKTsKIAogCS8qCkBAIC01MzYsNyArNTA1LDcgQEAKIAkgKiBJZiB0aGUgYnVmZmVyIGlzIGRpcnR5IHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLCB3ZSBjYW4ndAogCSAqIHJlbGVhc2UgaXQgdW50aWwgd2UgY29tbWl0LgogCSAqLwotCWlmIChsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKQorCWlmIChiaXAtPmJsaV9pdGVtLmxpX2Rlc2MtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpCiAJCXJldHVybjsKIAogCS8qCkBAIC01NTMsNyArNTIyLDcgQEAKIAkvKgogCSAqIEZyZWUgdXAgdGhlIGxvZyBpdGVtIGRlc2NyaXB0b3IgdHJhY2tpbmcgdGhlIHJlbGVhc2VkIGl0ZW0uCiAJICovCi0JeGZzX3RyYW5zX2ZyZWVfaXRlbSh0cCwgbGlkcCk7CisJeGZzX3RyYW5zX2RlbF9pdGVtKCZiaXAtPmJsaV9pdGVtKTsKIAogCS8qCiAJICogQ2xlYXIgdGhlIGhvbGQgZmxhZyBpbiB0aGUgYnVmIGxvZyBpdGVtIGlmIGl0IGlzIHNldC4KQEAgLTY2NSw3ICs2MzQsNiBAQAogCQkgIHVpbnQJCWxhc3QpCiB7CiAJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7Ci0JeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwogCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKQEAgLTY5MCw3ICs2NTgsNyBAQAogCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKTsKLQliaXAtPmJsaV9pdGVtLmxpX2NiID0gKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaW9kb25lOworCWJpcC0+YmxpX2l0ZW0ubGlfY2IgPSB4ZnNfYnVmX2lvZG9uZTsKIAogCXRyYWNlX3hmc190cmFuc19sb2dfYnVmKGJpcCk7CiAKQEAgLTcwNywxMSArNjc1LDggQEAKIAkJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmPSB+WEZTX0JMRl9DQU5DRUw7CiAJfQogCi0JbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopYmlwKTsKLQlBU1NFUlQobGlkcCAhPSBOVUxMKTsKLQogCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKLQlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKKwliaXAtPmJsaV9pdGVtLmxpX2Rlc2MtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOwogCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfTE9HR0VEOwogCXhmc19idWZfaXRlbV9sb2coYmlwLCBmaXJzdCwgbGFzdCk7CiB9CkBAIC03NDAsNyArNzA1LDYgQEAKIAl4ZnNfdHJhbnNfdAkqdHAsCiAJeGZzX2J1Zl90CSpicCkKIHsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwogCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOwogCiAJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CkBAIC03NDgsOCArNzEyLDYgQEAKIAlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CiAKIAliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOwotCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWJpcCk7Ci0JQVNTRVJUKGxpZHAgIT0gTlVMTCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAogCXRyYWNlX3hmc190cmFuc19iaW52YWwoYmlwKTsKQEAgLTc2NCw3ICs3MjYsNyBAQAogCQlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIChYRlNfQkxJX0xPR0dFRCB8IFhGU19CTElfRElSVFkpKSk7CiAJCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxGX0lOT0RFX0JVRikpOwogCQlBU1NFUlQoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTEZfQ0FOQ0VMKTsKLQkJQVNTRVJUKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpOworCQlBU1NFUlQoYmlwLT5ibGlfaXRlbS5saV9kZXNjLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKTsKIAkJQVNTRVJUKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKTsKIAkJcmV0dXJuOwogCX0KQEAgLTc5Nyw3ICs3NTksNyBAQAogCWJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgfD0gWEZTX0JMRl9DQU5DRUw7CiAJbWVtc2V0KChjaGFyICopKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZGF0YV9tYXApLCAwLAogCSAgICAgIChiaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplICogc2l6ZW9mKHVpbnQpKSk7Ci0JbGlkcC0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7CisJYmlwLT5ibGlfaXRlbS5saV9kZXNjLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKIAl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfRElSVFk7CiB9CiAKQEAgLTg1MywxMiArODE1LDkgQEAKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCiAJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9TVEFMRV9JTk9ERTsKLQliaXAtPmJsaV9pdGVtLmxpX2NiID0gKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKQotCQl4ZnNfYnVmX2lvZG9uZTsKKwliaXAtPmJsaV9pdGVtLmxpX2NiID0geGZzX2J1Zl9pb2RvbmU7CiB9CiAKLQotCiAvKgogICogTWFyayB0aGUgYnVmZmVyIGFzIGJlaW5nIG9uZSB3aGljaCBjb250YWlucyBuZXdseSBhbGxvY2F0ZWQKICAqIGlub2Rlcy4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgZXZlbiBpZiB0aGlzIGJ1ZmZlciBpcwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwppbmRleCAyN2NjZTJhLi5mNzgzZDVlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kbWFwaS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCiAjaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgpAQCAtNDksOSArNDgsOCBAQAogCS8qCiAJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCiAJICovCi0JKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KillZmlwKTsKLQotCXJldHVybiAoZWZpcCk7CisJeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAmZWZpcC0+ZWZpX2l0ZW0pOworCXJldHVybiBlZmlwOwogfQogCiAvKgpAQCAtNjUsMTUgKzYzLDExIEBACiAJCQkgeGZzX2ZzYmxvY2tfdAkJc3RhcnRfYmxvY2ssCiAJCQkgeGZzX2V4dGxlbl90CQlleHRfbGVuKQogewotCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CiAJdWludAkJCW5leHRfZXh0ZW50OwogCXhmc19leHRlbnRfdAkJKmV4dHA7CiAKLQlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KillZmlwKTsKLQlBU1NFUlQobGlkcCAhPSBOVUxMKTsKLQogCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKLQlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKKwllZmlwLT5lZmlfaXRlbS5saV9kZXNjLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKIAogCW5leHRfZXh0ZW50ID0gZWZpcC0+ZWZpX25leHRfZXh0ZW50OwogCUFTU0VSVChuZXh0X2V4dGVudCA8IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKQEAgLTEwNiw5ICsxMDAsOCBAQAogCS8qCiAJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCiAJICovCi0JKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KillZmRwKTsKLQotCXJldHVybiAoZWZkcCk7CisJeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAmZWZkcC0+ZWZkX2l0ZW0pOworCXJldHVybiBlZmRwOwogfQogCiAvKgpAQCAtMTIyLDE1ICsxMTUsMTEgQEAKIAkJCSB4ZnNfZnNibG9ja190CQlzdGFydF9ibG9jaywKIAkJCSB4ZnNfZXh0bGVuX3QJCWV4dF9sZW4pCiB7Ci0JeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKIAl1aW50CQkJbmV4dF9leHRlbnQ7CiAJeGZzX2V4dGVudF90CQkqZXh0cDsKIAotCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWVmZHApOwotCUFTU0VSVChsaWRwICE9IE5VTEwpOwotCiAJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOwotCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCWVmZHAtPmVmZF9pdGVtLmxpX2Rlc2MtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOwogCiAJbmV4dF9leHRlbnQgPSBlZmRwLT5lZmRfbmV4dF9leHRlbnQ7CiAJQVNTRVJUKG5leHRfZXh0ZW50IDwgZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19pbm9kZS5jIGIvZnMveGZzL3hmc190cmFuc19pbm9kZS5jCmluZGV4IDI1NTlkZmUuLmNkYzUzYTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKQEAgLTI0LDIwICsyNCwxNiBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCiBTVEFUSUMgdm9pZApAQCAtNDcsNyArNDMsNiBAQAogI2RlZmluZQl4ZnNfdHJhbnNfaW5vZGVfYnJvb3RfZGVidWcoaXApCiAjZW5kaWYKIAotCiAvKgogICogR2V0IGFuIGlub2RlIGFuZCBqb2luIGl0IHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqLwpAQCAtNjMsNzcgKzU4LDY1IEBACiAJaW50CQkJZXJyb3I7CiAKIAllcnJvciA9IHhmc19pZ2V0KG1wLCB0cCwgaW5vLCBmbGFncywgbG9ja19mbGFncywgaXBwKTsKLQlpZiAoIWVycm9yICYmIHRwKQotCQl4ZnNfdHJhbnNfaWpvaW4odHAsICppcHAsIGxvY2tfZmxhZ3MpOworCWlmICghZXJyb3IgJiYgdHApIHsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCAqaXBwKTsKKwkJKCppcHApLT5pX2l0ZW1wLT5pbGlfbG9ja19mbGFncyA9IGxvY2tfZmxhZ3M7CisJfQogCXJldHVybiBlcnJvcjsKIH0KIAogLyoKLSAqIEFkZCB0aGUgbG9ja2VkIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KLSAqIFRoZSBpbm9kZSBtdXN0IGJlIGxvY2tlZCwgYW5kIGl0IGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55Ci0gKiB0cmFuc2FjdGlvbi4gIFRoZSBjYWxsZXIgbXVzdCBzcGVjaWZ5IHRoZSBsb2NrcyBhbHJlYWR5IGhlbGQKLSAqIG9uIHRoZSBpbm9kZS4KKyAqIEFkZCBhIGxvY2tlZCBpbm9kZSB0byB0aGUgdHJhbnNhY3Rpb24uCisgKgorICogVGhlIGlub2RlIG11c3QgYmUgbG9ja2VkLCBhbmQgaXQgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgdHJhbnNhY3Rpb24uCiAgKi8KIHZvaWQKIHhmc190cmFuc19pam9pbigKLQl4ZnNfdHJhbnNfdAkqdHAsCi0JeGZzX2lub2RlX3QJKmlwLAotCXVpbnQJCWxvY2tfZmxhZ3MpCisJc3RydWN0IHhmc190cmFucwkqdHAsCisJc3RydWN0IHhmc19pbm9kZQkqaXApCiB7CiAJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKIAogCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gTlVMTCk7CiAJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMKSk7Ci0JQVNTRVJUKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfRVhDTCk7CiAJaWYgKGlwLT5pX2l0ZW1wID09IE5VTEwpCiAJCXhmc19pbm9kZV9pdGVtX2luaXQoaXAsIGlwLT5pX21vdW50KTsKIAlpaXAgPSBpcC0+aV9pdGVtcDsKLQlBU1NFUlQoaWlwLT5pbGlfZmxhZ3MgPT0gMCk7CisJQVNTRVJUKGlpcC0+aWxpX2xvY2tfZmxhZ3MgPT0gMCk7CiAKIAkvKgogCSAqIEdldCBhIGxvZ19pdGVtX2Rlc2MgdG8gcG9pbnQgYXQgdGhlIG5ldyBpdGVtLgogCSAqLwotCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopKGlpcCkpOworCXhmc190cmFuc19hZGRfaXRlbSh0cCwgJmlpcC0+aWxpX2l0ZW0pOwogCiAJeGZzX3RyYW5zX2lub2RlX2Jyb290X2RlYnVnKGlwKTsKIAogCS8qCi0JICogSWYgdGhlIElPIGxvY2sgaXMgYWxyZWFkeSBoZWxkLCBtYXJrIHRoYXQgaW4gdGhlIGlub2RlIGxvZyBpdGVtLgotCSAqLwotCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSB7Ci0JCWlpcC0+aWxpX2ZsYWdzIHw9IFhGU19JTElfSU9MT0NLRURfRVhDTDsKLQl9IGVsc2UgaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX1NIQVJFRCkgewotCQlpaXAtPmlsaV9mbGFncyB8PSBYRlNfSUxJX0lPTE9DS0VEX1NIQVJFRDsKLQl9Ci0KLQkvKgogCSAqIEluaXRpYWxpemUgaV90cmFuc3Agc28gd2UgY2FuIGZpbmQgaXQgd2l0aCB4ZnNfaW5vZGVfaW5jb3JlKCkKIAkgKiBpbiB4ZnNfdHJhbnNfaWdldCgpIGFib3ZlLgogCSAqLwogCWlwLT5pX3RyYW5zcCA9IHRwOwogfQogCi0KLQogLyoKLSAqIE1hcmsgdGhlIGlub2RlIGFzIG5vdCBuZWVkaW5nIHRvIGJlIHVubG9ja2VkIHdoZW4gdGhlIGlub2RlIGl0ZW0ncwotICogSU9QX1VOTE9DSygpIHJvdXRpbmUgaXMgY2FsbGVkLiAgVGhlIGlub2RlIG11c3QgYWxyZWFkeSBiZSBsb2NrZWQKLSAqIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRyYW5zYWN0aW9uLgorICogQWRkIGEgbG9ja2VkIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KKyAqCisgKgorICogR3JhYnMgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHdoaWNoIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbgorICogaXMgY29tbWl0ZWQuICBUaGUgaW5vZGUgd2lsbCBhbHNvIGJlIHVubG9ja2VkIGF0IHRoYXQgcG9pbnQuICBUaGUgaW5vZGUKKyAqIG11c3QgYmUgbG9ja2VkLCBhbmQgaXQgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgdHJhbnNhY3Rpb24uCiAgKi8KLS8qQVJHU1VTRUQqLwogdm9pZAoteGZzX3RyYW5zX2lob2xkKAotCXhmc190cmFuc190CSp0cCwKLQl4ZnNfaW5vZGVfdAkqaXApCit4ZnNfdHJhbnNfaWpvaW5fcmVmKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXVpbnQJCQlsb2NrX2ZsYWdzKQogewotCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gdHApOwotCUFTU0VSVChpcC0+aV9pdGVtcCAhPSBOVUxMKTsKLQlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX0VYQ0wpKTsKLQotCWlwLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9IT0xEOworCXhmc190cmFuc19pam9pbih0cCwgaXApOworCUlIT0xEKGlwKTsKKwlpcC0+aV9pdGVtcC0+aWxpX2xvY2tfZmxhZ3MgPSBsb2NrX2ZsYWdzOwogfQogCi0KIC8qCiAgKiBUaGlzIGlzIGNhbGxlZCB0byBtYXJrIHRoZSBmaWVsZHMgaW5kaWNhdGVkIGluIGZpZWxkbWFzayBhcyBuZWVkaW5nCiAgKiB0byBiZSBsb2dnZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLiAgVGhlIGlub2RlIG11c3QKQEAgLTE0OSwxNyArMTMyLDEyIEBACiAJeGZzX2lub2RlX3QJKmlwLAogCXVpbnQJCWZsYWdzKQogewotCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7Ci0KIAlBU1NFUlQoaXAtPmlfdHJhbnNwID09IHRwKTsKIAlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CiAJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMKSk7CiAKLQlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KikoaXAtPmlfaXRlbXApKTsKLQlBU1NFUlQobGlkcCAhPSBOVUxMKTsKLQogCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKLQlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKKwlpcC0+aV9pdGVtcC0+aWxpX2l0ZW0ubGlfZGVzYy0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7CiAKIAkvKgogCSAqIEFsd2F5cyBPUiBpbiB0aGUgYml0cyBmcm9tIHRoZSBpbGlfbGFzdF9maWVsZHMgZmllbGQuCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFkMzdkLi4wMDAwMDAwCi0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfbG9nLmgiCi0jaW5jbHVkZSAieGZzX2ludW0uaCIKLSNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKLSNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgotLyogWFhYOiBmcm9tIGhlcmUgZG93biBuZWVkZWQgdW50aWwgc3RydWN0IHhmc190cmFucyBoYXMgaXRzIG93biBhaWxwICovCi0jaW5jbHVkZSAieGZzX2JpdC5oIgotI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgotI2luY2x1ZGUgInhmc19zYi5oIgotI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCi0jaW5jbHVkZSAieGZzX21vdW50LmgiCi0KLVNUQVRJQyBpbnQJeGZzX3RyYW5zX3VubG9ja19jaHVuayh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqLAotCQkJCQlpbnQsIGludCwgeGZzX2xzbl90KTsKLQotLyoKLSAqIFRoaXMgaXMgY2FsbGVkIHRvIGFkZCB0aGUgZ2l2ZW4gbG9nIGl0ZW0gdG8gdGhlIHRyYW5zYWN0aW9uJ3MKLSAqIGxpc3Qgb2YgbG9nIGl0ZW1zLiAgSXQgbXVzdCBmaW5kIGEgZnJlZSBsb2cgaXRlbSBkZXNjcmlwdG9yCi0gKiBvciBhbGxvY2F0ZSBhIG5ldyBvbmUgYW5kIGFkZCB0aGUgaXRlbSB0byB0aGF0IGRlc2NyaXB0b3IuCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gaXRlbSBkZXNjcmlwdG9yIHVzZWQgdG8gcG9pbnQKLSAqIHRvIHRoZSBuZXcgaXRlbS4gIFRoZSBsb2cgaXRlbSB3aWxsIG5vdyBwb2ludCB0byBpdHMgbmV3IGRlc2NyaXB0b3IKLSAqIHdpdGggaXRzIGxpX2Rlc2MgZmllbGQuCi0gKi8KLXhmc19sb2dfaXRlbV9kZXNjX3QgKgoteGZzX3RyYW5zX2FkZF9pdGVtKHhmc190cmFuc190ICp0cCwgeGZzX2xvZ19pdGVtX3QgKmxpcCkKLXsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwotCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOwotCWludAkJCWk9MDsKLQotCS8qCi0JICogSWYgdGhlcmUgYXJlIG5vIGZyZWUgZGVzY3JpcHRvcnMsIGFsbG9jYXRlIGEgbmV3IGNodW5rCi0JICogb2YgdGhlbSBhbmQgcHV0IGl0IGF0IHRoZSBmcm9udCBvZiB0aGUgY2h1bmsgbGlzdC4KLQkgKi8KLQlpZiAodHAtPnRfaXRlbXNfZnJlZSA9PSAwKSB7Ci0JCWxpY3AgPSAoeGZzX2xvZ19pdGVtX2NodW5rX3QqKQotCQkgICAgICAga21lbV9hbGxvYyhzaXplb2YoeGZzX2xvZ19pdGVtX2NodW5rX3QpLCBLTV9TTEVFUCk7Ci0JCUFTU0VSVChsaWNwICE9IE5VTEwpOwotCQkvKgotCQkgKiBJbml0aWFsaXplIHRoZSBjaHVuaywgYW5kIHRoZW4KLQkJICogY2xhaW0gdGhlIGZpcnN0IHNsb3QgaW4gdGhlIG5ld2x5IGFsbG9jYXRlZCBjaHVuay4KLQkJICovCi0JCXhmc19saWNfaW5pdChsaWNwKTsKLQkJeGZzX2xpY19jbGFpbShsaWNwLCAwKTsKLQkJbGljcC0+bGljX3VudXNlZCA9IDE7Ci0JCXhmc19saWNfaW5pdF9zbG90KGxpY3AsIDApOwotCQlsaWRwID0geGZzX2xpY19zbG90KGxpY3AsIDApOwotCi0JCS8qCi0JCSAqIExpbmsgaW4gdGhlIG5ldyBjaHVuayBhbmQgdXBkYXRlIHRoZSBmcmVlIGNvdW50LgotCQkgKi8KLQkJbGljcC0+bGljX25leHQgPSB0cC0+dF9pdGVtcy5saWNfbmV4dDsKLQkJdHAtPnRfaXRlbXMubGljX25leHQgPSBsaWNwOwotCQl0cC0+dF9pdGVtc19mcmVlID0gWEZTX0xJQ19OVU1fU0xPVFMgLSAxOwotCi0JCS8qCi0JCSAqIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgYW5kIHRoZSBnZW5lcmljIHBvcnRpb24KLQkJICogb2YgdGhlIGxvZyBpdGVtLgotCQkgKgotCQkgKiBQb2ludCB0aGUgbmV3IHNsb3QgYXQgdGhpcyBpdGVtIGFuZCByZXR1cm4gaXQuCi0JCSAqIEFsc28gcG9pbnQgdGhlIGxvZyBpdGVtIGF0IGl0cyBjdXJyZW50bHkgYWN0aXZlCi0JCSAqIGRlc2NyaXB0b3IgYW5kIHNldCB0aGUgaXRlbSdzIG1vdW50IHBvaW50ZXIuCi0JCSAqLwotCQlsaWRwLT5saWRfaXRlbSA9IGxpcDsKLQkJbGlkcC0+bGlkX2ZsYWdzID0gMDsKLQkJbGlkcC0+bGlkX3NpemUgPSAwOwotCQlsaXAtPmxpX2Rlc2MgPSBsaWRwOwotCQlsaXAtPmxpX21vdW50cCA9IHRwLT50X21vdW50cDsKLQkJbGlwLT5saV9haWxwID0gdHAtPnRfbW91bnRwLT5tX2FpbDsKLQkJcmV0dXJuIGxpZHA7Ci0JfQotCi0JLyoKLQkgKiBGaW5kIHRoZSBmcmVlIGRlc2NyaXB0b3IuIEl0IGlzIHNvbWV3aGVyZSBpbiB0aGUgY2h1bmtsaXN0Ci0JICogb2YgZGVzY3JpcHRvcnMuCi0JICovCi0JbGljcCA9ICZ0cC0+dF9pdGVtczsKLQl3aGlsZSAobGljcCAhPSBOVUxMKSB7Ci0JCWlmICh4ZnNfbGljX3ZhY2FuY3kobGljcCkpIHsKLQkJCWlmIChsaWNwLT5saWNfdW51c2VkIDw9IFhGU19MSUNfTUFYX1NMT1QpIHsKLQkJCQlpID0gbGljcC0+bGljX3VudXNlZDsKLQkJCQlBU1NFUlQoeGZzX2xpY19pc2ZyZWUobGljcCwgaSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZm9yIChpID0gMDsgaSA8PSBYRlNfTElDX01BWF9TTE9UOyBpKyspIHsKLQkJCQlpZiAoeGZzX2xpY19pc2ZyZWUobGljcCwgaSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJQVNTRVJUKGkgPD0gWEZTX0xJQ19NQVhfU0xPVCk7Ci0JCQlicmVhazsKLQkJfQotCQlsaWNwID0gbGljcC0+bGljX25leHQ7Ci0JfQotCUFTU0VSVChsaWNwICE9IE5VTEwpOwotCS8qCi0JICogSWYgd2UgZmluZCBhIGZyZWUgZGVzY3JpcHRvciwgY2xhaW0gaXQsCi0JICogaW5pdGlhbGl6ZSBpdCwgYW5kIHJldHVybiBpdC4KLQkgKi8KLQl4ZnNfbGljX2NsYWltKGxpY3AsIGkpOwotCWlmIChsaWNwLT5saWNfdW51c2VkIDw9IGkpIHsKLQkJbGljcC0+bGljX3VudXNlZCA9IGkgKyAxOwotCQl4ZnNfbGljX2luaXRfc2xvdChsaWNwLCBpKTsKLQl9Ci0JbGlkcCA9IHhmc19saWNfc2xvdChsaWNwLCBpKTsKLQl0cC0+dF9pdGVtc19mcmVlLS07Ci0JbGlkcC0+bGlkX2l0ZW0gPSBsaXA7Ci0JbGlkcC0+bGlkX2ZsYWdzID0gMDsKLQlsaWRwLT5saWRfc2l6ZSA9IDA7Ci0JbGlwLT5saV9kZXNjID0gbGlkcDsKLQlsaXAtPmxpX21vdW50cCA9IHRwLT50X21vdW50cDsKLQlsaXAtPmxpX2FpbHAgPSB0cC0+dF9tb3VudHAtPm1fYWlsOwotCXJldHVybiBsaWRwOwotfQotCi0vKgotICogRnJlZSB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4KLSAqCi0gKiBUaGlzIHJlcXVpcmVzIHNldHRpbmcgdGhlIGJpdCBpbiB0aGUgY2h1bmsncyBmcmVlIG1hc2sgY29ycmVzcG9uZGluZwotICogdG8gdGhlIGdpdmVuIHNsb3QuCi0gKi8KLXZvaWQKLXhmc190cmFuc19mcmVlX2l0ZW0oeGZzX3RyYW5zX3QJKnRwLCB4ZnNfbG9nX2l0ZW1fZGVzY190ICpsaWRwKQotewotCXVpbnQJCQlzbG90OwotCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOwotCXhmc19sb2dfaXRlbV9jaHVua190CSoqbGljcHA7Ci0KLQlzbG90ID0geGZzX2xpY19kZXNjX3RvX3Nsb3QobGlkcCk7Ci0JbGljcCA9IHhmc19saWNfZGVzY190b19jaHVuayhsaWRwKTsKLQl4ZnNfbGljX3JlbHNlKGxpY3AsIHNsb3QpOwotCWxpZHAtPmxpZF9pdGVtLT5saV9kZXNjID0gTlVMTDsKLQl0cC0+dF9pdGVtc19mcmVlKys7Ci0KLQkvKgotCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZWQgaXRlbXMgaW4gdGhlIGNodW5rIGFuZCB0aGlzIGlzIG5vdAotCSAqIHRoZSBjaHVuayBlbWJlZGRlZCBpbiB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLCB0aGVuIGZyZWUKLQkgKiB0aGUgY2h1bmsuIEZpcnN0IHB1bGwgaXQgZnJvbSB0aGUgY2h1bmsgbGlzdCBhbmQgdGhlbgotCSAqIGZyZWUgaXQgYmFjayB0byB0aGUgaGVhcC4gIFdlIGRpZG4ndCBib3RoZXIgd2l0aCBhIGRvdWJseQotCSAqIGxpbmtlZCBsaXN0IGhlcmUgYmVjYXVzZSB0aGUgbGlzdHMgc2hvdWxkIGJlIHZlcnkgc2hvcnQKLQkgKiBhbmQgdGhpcyBpcyBub3QgYSBwZXJmb3JtYW5jZSBwYXRoLiAgSXQncyBiZXR0ZXIgdG8gc2F2ZQotCSAqIHRoZSBtZW1vcnkgb2YgdGhlIGV4dHJhIHBvaW50ZXIuCi0JICoKLQkgKiBBbHNvIGRlY3JlbWVudCB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlJ3MgY291bnQgb2YgZnJlZSBpdGVtcwotCSAqIGJ5IHRoZSBudW1iZXIgaW4gYSBjaHVuayBzaW5jZSB3ZSBhcmUgZnJlZWluZyBhbiBlbXB0eSBjaHVuay4KLQkgKi8KLQlpZiAoeGZzX2xpY19hcmVfYWxsX2ZyZWUobGljcCkgJiYgKGxpY3AgIT0gJih0cC0+dF9pdGVtcykpKSB7Ci0JCWxpY3BwID0gJih0cC0+dF9pdGVtcy5saWNfbmV4dCk7Ci0JCXdoaWxlICgqbGljcHAgIT0gbGljcCkgewotCQkJQVNTRVJUKCpsaWNwcCAhPSBOVUxMKTsKLQkJCWxpY3BwID0gJigoKmxpY3BwKS0+bGljX25leHQpOwotCQl9Ci0JCSpsaWNwcCA9IGxpY3AtPmxpY19uZXh0OwotCQlrbWVtX2ZyZWUobGljcCk7Ci0JCXRwLT50X2l0ZW1zX2ZyZWUgLT0gWEZTX0xJQ19OVU1fU0xPVFM7Ci0JfQotfQotCi0vKgotICogVGhpcyBpcyBjYWxsZWQgdG8gZmluZCB0aGUgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotICogbG9nIGl0ZW0uICBJdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvci4KLSAqIFRoZSBsb2cgaXRlbSBNVVNUIGhhdmUgYSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3IgaW4gdGhlIGdpdmVuCi0gKiB0cmFuc2FjdGlvbi4gIFRoaXMgcm91dGluZSBkb2VzIG5vdCByZXR1cm4gTlVMTCwgaXQgcGFuaWNzLgotICoKLSAqIFRoZSBkZXNjcmlwdG9yIHBvaW50ZXIgaXMga2VwdCBpbiB0aGUgbG9nIGl0ZW0ncyBsaV9kZXNjIGZpZWxkLgotICogSnVzdCByZXR1cm4gaXQuCi0gKi8KLS8qQVJHU1VTRUQqLwoteGZzX2xvZ19pdGVtX2Rlc2NfdCAqCi14ZnNfdHJhbnNfZmluZF9pdGVtKHhmc190cmFuc190CSp0cCwgeGZzX2xvZ19pdGVtX3QgKmxpcCkKLXsKLQlBU1NFUlQobGlwLT5saV9kZXNjICE9IE5VTEwpOwotCi0JcmV0dXJuIGxpcC0+bGlfZGVzYzsKLX0KLQotCi0vKgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZGVzY3JpcHRvciBpbiB0aGUgY2h1bmsgbGlzdC4KLSAqIFRoaXMgZG9lcyBub3QgcmV0dXJuIE5VTEwgaWYgdGhlcmUgYXJlIG5vbmUsIGl0IHBhbmljcy4KLSAqCi0gKiBUaGUgZmlyc3QgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIGNodW5rLgotICogVGhpcyBpcyBiZWNhdXNlIHRoZSBvbmx5IGNodW5rIGFsbG93ZWQgdG8gYmUgZW1wdHkgaXMgdGhlIGZpcnN0LgotICogQWxsIG90aGVycyBhcmUgZnJlZWQgd2hlbiB0aGV5IGJlY29tZSBlbXB0eS4KLSAqCi0gKiBBdCBzb21lIHBvaW50IHRoaXMgYW5kIHhmc190cmFuc19uZXh0X2l0ZW0oKSBzaG91bGQgYmUgb3B0aW1pemVkCi0gKiB0byBxdWlja2x5IGxvb2sgYXQgdGhlIG1hc2sgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvCi0gKiBsb29rIGF0LgotICovCi14ZnNfbG9nX2l0ZW1fZGVzY190ICoKLXhmc190cmFuc19maXJzdF9pdGVtKHhmc190cmFuc190ICp0cCkKLXsKLQl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKLQlpbnQJCQlpOwotCi0JbGljcCA9ICZ0cC0+dF9pdGVtczsKLQkvKgotCSAqIElmIGl0J3Mgbm90IGluIHRoZSBmaXJzdCBjaHVuaywgc2tpcCB0byB0aGUgc2Vjb25kLgotCSAqLwotCWlmICh4ZnNfbGljX2FyZV9hbGxfZnJlZShsaWNwKSkgewotCQlsaWNwID0gbGljcC0+bGljX25leHQ7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IG5vbi1mcmVlIGRlc2NyaXB0b3IgaW4gdGhlIGNodW5rLgotCSAqLwotCUFTU0VSVCgheGZzX2xpY19hcmVfYWxsX2ZyZWUobGljcCkpOwotCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyspIHsKLQkJaWYgKHhmc19saWNfaXNmcmVlKGxpY3AsIGkpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJldHVybiB4ZnNfbGljX3Nsb3QobGljcCwgaSk7Ci0JfQotCWNtbl9lcnIoQ0VfV0FSTiwgInhmc190cmFuc19maXJzdF9pdGVtKCkgLS0gbm8gZmlyc3QgaXRlbSIpOwotCXJldHVybiBOVUxMOwotfQotCi0KLS8qCi0gKiBHaXZlbiBhIGRlc2NyaXB0b3IsIHJldHVybiB0aGUgbmV4dCBkZXNjcmlwdG9yIGluIHRoZSBjaHVuayBsaXN0LgotICogVGhpcyByZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlZCBkZXNjcmlwdG9ycyBpbiB0aGUgbGlzdC4KLSAqCi0gKiBXZSBkbyB0aGlzIGJ5IGZpcnN0IGxvY2F0aW5nIHRoZSBjaHVuayBpbiB3aGljaCB0aGUgZGVzY3JpcHRvciByZXNpZGVzLAotICogYW5kIHRoZW4gc2Nhbm5pbmcgZm9yd2FyZCBpbiB0aGUgY2h1bmsgYW5kIHRoZSBsaXN0IGZvciB0aGUgbmV4dAotICogdXNlZCBkZXNjcmlwdG9yLgotICovCi0vKkFSR1NVU0VEKi8KLXhmc19sb2dfaXRlbV9kZXNjX3QgKgoteGZzX3RyYW5zX25leHRfaXRlbSh4ZnNfdHJhbnNfdCAqdHAsIHhmc19sb2dfaXRlbV9kZXNjX3QgKmxpZHApCi17Ci0JeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7Ci0JaW50CQkJaTsKLQotCWxpY3AgPSB4ZnNfbGljX2Rlc2NfdG9fY2h1bmsobGlkcCk7Ci0KLQkvKgotCSAqIEZpcnN0IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgY2h1bmsuIFRoZSBmb3IgbG9vcCBrZWVwcyB1cwotCSAqIGZyb20gcmVmZXJlbmNpbmcgdGhpbmdzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KLQkgKi8KLQlmb3IgKGkgPSAoaW50KXhmc19saWNfZGVzY190b19zbG90KGxpZHApICsgMTsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKykgewotCQlpZiAoeGZzX2xpY19pc2ZyZWUobGljcCwgaSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcmV0dXJuIHhmc19saWNfc2xvdChsaWNwLCBpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdyBzZWFyY2ggdGhlIG5leHQgY2h1bmsuICBJdCBtdXN0IGJlIHRoZXJlLCBiZWNhdXNlIHRoZQotCSAqIG5leHQgY2h1bmsgd291bGQgaGF2ZSBiZWVuIGZyZWVkIGlmIGl0IHdlcmUgZW1wdHkuCi0JICogSWYgdGhlcmUgaXMgbm8gbmV4dCBjaHVuaywgcmV0dXJuIE5VTEwuCi0JICovCi0JaWYgKGxpY3AtPmxpY19uZXh0ID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbGljcCA9IGxpY3AtPmxpY19uZXh0OwotCUFTU0VSVCgheGZzX2xpY19hcmVfYWxsX2ZyZWUobGljcCkpOwotCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyspIHsKLQkJaWYgKHhmc19saWNfaXNmcmVlKGxpY3AsIGkpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJldHVybiB4ZnNfbGljX3Nsb3QobGljcCwgaSk7Ci0JfQotCUFTU0VSVCgwKTsKLQkvKiBOT1RSRUFDSEVEICovCi0JcmV0dXJuIE5VTEw7IC8qIGtlZXAgZ2NjIHF1aXRlICovCi19Ci0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCB0byB1bmxvY2sgYWxsIG9mIHRoZSBpdGVtcyBvZiBhIHRyYW5zYWN0aW9uIGFuZCB0byBmcmVlCi0gKiBhbGwgdGhlIGRlc2NyaXB0b3JzIG9mIHRoYXQgdHJhbnNhY3Rpb24uCi0gKgotICogSXQgd2Fsa3MgdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgYW5kIHVubG9ja3MgZWFjaCBpdGVtLiAgSXQgZnJlZXMKLSAqIGVhY2ggY2h1bmsgZXhjZXB0IHRoYXQgZW1iZWRkZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGFzIGl0IGdvZXMgYWxvbmcuCi0gKi8KLXZvaWQKLXhmc190cmFuc19mcmVlX2l0ZW1zKAotCXhmc190cmFuc190CSp0cCwKLQl4ZnNfbHNuX3QJY29tbWl0X2xzbiwKLQlpbnQJCWZsYWdzKQotewotCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOwotCXhmc19sb2dfaXRlbV9jaHVua190CSpuZXh0X2xpY3A7Ci0JaW50CQkJYWJvcnQ7Ci0KLQlhYm9ydCA9IGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUOwotCWxpY3AgPSAmdHAtPnRfaXRlbXM7Ci0JLyoKLQkgKiBTcGVjaWFsIGNhc2UgdGhlIGVtYmVkZGVkIGNodW5rIHNvIHdlIGRvbid0IGZyZWUgaXQgYmVsb3cuCi0JICovCi0JaWYgKCF4ZnNfbGljX2FyZV9hbGxfZnJlZShsaWNwKSkgewotCQkodm9pZCkgeGZzX3RyYW5zX3VubG9ja19jaHVuayhsaWNwLCAxLCBhYm9ydCwgY29tbWl0X2xzbik7Ci0JCXhmc19saWNfYWxsX2ZyZWUobGljcCk7Ci0JCWxpY3AtPmxpY191bnVzZWQgPSAwOwotCX0KLQlsaWNwID0gbGljcC0+bGljX25leHQ7Ci0KLQkvKgotCSAqIFVubG9jayBlYWNoIGl0ZW0gaW4gZWFjaCBjaHVuayBhbmQgZnJlZSB0aGUgY2h1bmtzLgotCSAqLwotCXdoaWxlIChsaWNwICE9IE5VTEwpIHsKLQkJQVNTRVJUKCF4ZnNfbGljX2FyZV9hbGxfZnJlZShsaWNwKSk7Ci0JCSh2b2lkKSB4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKGxpY3AsIDEsIGFib3J0LCBjb21taXRfbHNuKTsKLQkJbmV4dF9saWNwID0gbGljcC0+bGljX25leHQ7Ci0JCWttZW1fZnJlZShsaWNwKTsKLQkJbGljcCA9IG5leHRfbGljcDsKLQl9Ci0KLQkvKgotCSAqIFJlc2V0IHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUncyBmcmVlIGl0ZW0gY291bnQuCi0JICovCi0JdHAtPnRfaXRlbXNfZnJlZSA9IFhGU19MSUNfTlVNX1NMT1RTOwotCXRwLT50X2l0ZW1zLmxpY19uZXh0ID0gTlVMTDsKLX0KLQotCi0KLS8qCi0gKiBUaGlzIGlzIGNhbGxlZCB0byB1bmxvY2sgdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uLgotICogSXRlbXMgd2hpY2ggd2VyZSBub3QgbG9nZ2VkIHNob3VsZCBiZSBmcmVlZC4KLSAqIFRob3NlIHdoaWNoIHdlcmUgbG9nZ2VkIG11c3Qgc3RpbGwgYmUgdHJhY2tlZCBzbyB0aGV5IGNhbiBiZSB1bnBpbm5lZAotICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KLSAqLwotdm9pZAoteGZzX3RyYW5zX3VubG9ja19pdGVtcyh4ZnNfdHJhbnNfdCAqdHAsIHhmc19sc25fdCBjb21taXRfbHNuKQotewotCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOwotCXhmc19sb2dfaXRlbV9jaHVua190CSpuZXh0X2xpY3A7Ci0JeGZzX2xvZ19pdGVtX2NodW5rX3QJKipsaWNwcDsKLQlpbnQJCQlmcmVlZDsKLQotCWZyZWVkID0gMDsKLQlsaWNwID0gJnRwLT50X2l0ZW1zOwotCi0JLyoKLQkgKiBTcGVjaWFsIGNhc2UgdGhlIGVtYmVkZGVkIGNodW5rIHNvIHdlIGRvbid0IGZyZWUuCi0JICovCi0JaWYgKCF4ZnNfbGljX2FyZV9hbGxfZnJlZShsaWNwKSkgewotCQlmcmVlZCA9IHhmc190cmFuc191bmxvY2tfY2h1bmsobGljcCwgMCwgMCwgY29tbWl0X2xzbik7Ci0JfQotCWxpY3BwID0gJih0cC0+dF9pdGVtcy5saWNfbmV4dCk7Ci0JbGljcCA9IGxpY3AtPmxpY19uZXh0OwotCi0JLyoKLQkgKiBVbmxvY2sgZWFjaCBpdGVtIGluIGVhY2ggY2h1bmssIGZyZWUgbm9uLWRpcnR5IGRlc2NyaXB0b3JzLAotCSAqIGFuZCBmcmVlIGVtcHR5IGNodW5rcy4KLQkgKi8KLQl3aGlsZSAobGljcCAhPSBOVUxMKSB7Ci0JCUFTU0VSVCgheGZzX2xpY19hcmVfYWxsX2ZyZWUobGljcCkpOwotCQlmcmVlZCArPSB4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKGxpY3AsIDAsIDAsIGNvbW1pdF9sc24pOwotCQluZXh0X2xpY3AgPSBsaWNwLT5saWNfbmV4dDsKLQkJaWYgKHhmc19saWNfYXJlX2FsbF9mcmVlKGxpY3ApKSB7Ci0JCQkqbGljcHAgPSBuZXh0X2xpY3A7Ci0JCQlrbWVtX2ZyZWUobGljcCk7Ci0JCQlmcmVlZCAtPSBYRlNfTElDX05VTV9TTE9UUzsKLQkJfSBlbHNlIHsKLQkJCWxpY3BwID0gJihsaWNwLT5saWNfbmV4dCk7Ci0JCX0KLQkJQVNTRVJUKCpsaWNwcCA9PSBuZXh0X2xpY3ApOwotCQlsaWNwID0gbmV4dF9saWNwOwotCX0KLQotCS8qCi0JICogRml4IHRoZSBmcmVlIGRlc2NyaXB0b3IgY291bnQgaW4gdGhlIHRyYW5zYWN0aW9uLgotCSAqLwotCXRwLT50X2l0ZW1zX2ZyZWUgKz0gZnJlZWQ7Ci19Ci0KLS8qCi0gKiBVbmxvY2sgZWFjaCBpdGVtIHBvaW50ZWQgdG8gYnkgYSBkZXNjcmlwdG9yIGluIHRoZSBnaXZlbiBjaHVuay4KLSAqIFN0YW1wIHRoZSBjb21taXQgbHNuIGludG8gZWFjaCBpdGVtIGlmIG5lY2Vzc2FyeS4KLSAqIEZyZWUgZGVzY3JpcHRvcnMgcG9pbnRpbmcgdG8gaXRlbXMgd2hpY2ggYXJlIG5vdCBkaXJ0eSBpZiBmcmVlaW5nX2NodW5rCi0gKiBpcyB6ZXJvLiBJZiBmcmVlaW5nX2NodW5rIGlzIG5vbi16ZXJvLCB0aGVuIHdlIG5lZWQgdG8gdW5sb2NrIGFsbAotICogaXRlbXMgaW4gdGhlIGNodW5rLgotICogCi0gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBmcmVlZC4KLSAqLwotU1RBVElDIGludAoteGZzX3RyYW5zX3VubG9ja19jaHVuaygKLQl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcCwKLQlpbnQJCQlmcmVlaW5nX2NodW5rLAotCWludAkJCWFib3J0LAotCXhmc19sc25fdAkJY29tbWl0X2xzbikKLXsKLQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwotCXhmc19sb2dfaXRlbV90CQkqbGlwOwotCWludAkJCWk7Ci0JaW50CQkJZnJlZWQ7Ci0KLQlmcmVlZCA9IDA7Ci0JbGlkcCA9IGxpY3AtPmxpY19kZXNjczsKLQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrLCBsaWRwKyspIHsKLQkJaWYgKHhmc19saWNfaXNmcmVlKGxpY3AsIGkpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlsaXAgPSBsaWRwLT5saWRfaXRlbTsKLQkJbGlwLT5saV9kZXNjID0gTlVMTDsKLQotCQlpZiAoY29tbWl0X2xzbiAhPSBOVUxMQ09NTUlUTFNOKQotCQkJSU9QX0NPTU1JVFRJTkcobGlwLCBjb21taXRfbHNuKTsKLQkJaWYgKGFib3J0KQotCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKLQkJSU9QX1VOTE9DSyhsaXApOwotCi0JCS8qCi0JCSAqIEZyZWUgdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGl0ZW0gaXMgbm90IGRpcnR5Ci0JCSAqIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uIGFuZCB0aGUgY2FsbGVyIGlzIG5vdAotCQkgKiBnb2luZyB0byBqdXN0IGZyZWUgdGhlIGVudGlyZSB0aGluZyByZWdhcmRsZXNzLgotCQkgKi8KLQkJaWYgKCEoZnJlZWluZ19jaHVuaykgJiYKLQkJICAgICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpIHx8IGFib3J0KSkgewotCQkJeGZzX2xpY19yZWxzZShsaWNwLCBpKTsKLQkJCWZyZWVkKys7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZnJlZWQ7Ci19CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaCBiL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oCmluZGV4IGM2ZTRmMmM4Li5lMmQ5M2Q4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaApAQCAtMjMsMjIgKzIzLDggQEAKIHN0cnVjdCB4ZnNfbW91bnQ7CiBzdHJ1Y3QgeGZzX3RyYW5zOwogCi0vKgotICogRnJvbSB4ZnNfdHJhbnNfaXRlbS5jCi0gKi8KLXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYwkqeGZzX3RyYW5zX2FkZF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwKLQkJCQkJICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7Ci12b2lkCQkJCXhmc190cmFuc19mcmVlX2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAotCQkJCQkgICAgc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICopOwotc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfZmluZF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwKLQkJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwotc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfZmlyc3RfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICopOwotc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfbmV4dF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwKLQkJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgKik7Ci0KLXZvaWQJeGZzX3RyYW5zX3VubG9ja19pdGVtcyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgeGZzX2xzbl90IGNvbW1pdF9sc24pOwotdm9pZAl4ZnNfdHJhbnNfZnJlZV9pdGVtcyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgeGZzX2xzbl90IGNvbW1pdF9sc24sCi0JCQkJaW50IGZsYWdzKTsKK3ZvaWQJeGZzX3RyYW5zX2FkZF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19sb2dfaXRlbSAqKTsKK3ZvaWQJeGZzX3RyYW5zX2RlbF9pdGVtKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7CiAKIHZvaWQJeGZzX3RyYW5zX2l0ZW1fY29tbWl0dGVkKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCwKIAkJCQl4ZnNfbHNuX3QgY29tbWl0X2xzbiwgaW50IGFib3J0ZWQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc191dGlscy5jIGIvZnMveGZzL3hmc191dGlscy5jCmluZGV4IDRkODg2MTYuLmI3ZDU3NjkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdXRpbHMuYworKysgYi9mcy94ZnMveGZzX3V0aWxzLmMKQEAgLTI1LDE4ICsyNSwxNCBAQAogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCiAKQEAgLTMyNCw4NiArMzIwLDMgQEAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJcmV0dXJuIDA7CiB9Ci0KLS8qCi0gKiBUcnkgdG8gdHJ1bmNhdGUgdGhlIGdpdmVuIGZpbGUgdG8gMCBsZW5ndGguICBDdXJyZW50bHkgY2FsbGVkCi0gKiBvbmx5IG91dCBvZiB4ZnNfcmVtb3ZlIHdoZW4gaXQgaGFzIHRvIHRydW5jYXRlIGEgZmlsZSB0byBmcmVlCi0gKiB1cCBzcGFjZSBmb3IgdGhlIHJlbW92ZSB0byBwcm9jZWVkLgotICovCi1pbnQKLXhmc190cnVuY2F0ZV9maWxlKAotCXhmc19tb3VudF90CSptcCwKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0JeGZzX3RyYW5zX3QJKnRwOwotCWludAkJZXJyb3I7Ci0KLSNpZmRlZiBRVU9UQURFQlVHCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCB0byB0cnVuY2F0ZSB0aGUgcXVvdGFpbm9kZXMgdG9vLgotCSAqLwotCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkgewotCQlpZiAoaXAtPmlfaW5vICE9IG1wLT5tX3NiLnNiX3VxdW90aW5vKQotCQkJQVNTRVJUKGlwLT5pX3VkcXVvdCk7Ci0JfQotCWlmIChYRlNfSVNfT1FVT1RBX09OKG1wKSkgewotCQlpZiAoaXAtPmlfaW5vICE9IG1wLT5tX3NiLnNiX2dxdW90aW5vKQotCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCk7Ci0JfQotI2VuZGlmCi0JLyoKLQkgKiBNYWtlIHRoZSBjYWxsIHRvIHhmc19pdHJ1bmNhdGVfc3RhcnQgYmVmb3JlIHN0YXJ0aW5nIHRoZQotCSAqIHRyYW5zYWN0aW9uLCBiZWNhdXNlIHdlIGNhbm5vdCBtYWtlIHRoZSBjYWxsIHdoaWxlIHdlJ3JlCi0JICogaW4gYSB0cmFuc2FjdGlvbi4KLQkgKi8KLQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7Ci0JZXJyb3IgPSB4ZnNfaXRydW5jYXRlX3N0YXJ0KGlwLCBYRlNfSVRSVU5DX0RFRklOSVRFLCAoeGZzX2ZzaXplX3QpMCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19UUlVOQ0FURV9GSUxFKTsKLQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksIDAsCi0JCQkJICAgICAgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKLQkJCQkgICAgICBYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCkpKSB7Ci0JCXhmc190cmFuc19jYW5jZWwodHAsIDApOwotCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qCi0JICogRm9sbG93IHRoZSBub3JtYWwgdHJ1bmNhdGUgbG9ja2luZyBwcm90b2NvbC4gIFNpbmNlIHdlCi0JICogaG9sZCB0aGUgaW5vZGUgaW4gdGhlIHRyYW5zYWN0aW9uLCB3ZSBrbm93IHRoYXQgaXRzIG51bWJlcgotCSAqIG9mIHJlZmVyZW5jZXMgd2lsbCBzdGF5IGNvbnN0YW50LgotCSAqLwotCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKLQkvKgotCSAqIFNpZ25hbCBhIHN5bmMgeGFjdGlvbi4gIFRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhhdCBpc24ndAotCSAqIHRoZSBjYXNlIGlzIGlmIHdlJ3JlIHRydW5jYXRpbmcgYW4gYWxyZWFkeSB1bmxpbmtlZCBmaWxlCi0JICogb24gYSB3c3luYyBmcy4gIEluIHRoYXQgY2FzZSwgd2Uga25vdyB0aGUgYmxvY2tzIGNhbid0Ci0JICogcmVhcHBlYXIgaW4gdGhlIGZpbGUgYmVjYXVzZSB0aGUgbGlua3MgdG8gZmlsZSBhcmUKLQkgKiBwZXJtYW5lbnRseSB0b2FzdC4gIEN1cnJlbnRseSwgd2UncmUgYWx3YXlzIGdvaW5nIHRvCi0JICogd2FudCBhIHN5bmMgdHJhbnNhY3Rpb24gYmVjYXVzZSB0aGlzIGNvZGUgaXMgYmVpbmcKLQkgKiBjYWxsZWQgZnJvbSBwbGFjZXMgd2hlcmUgbmxpbmsgaXMgZ3VhcmFudGVlZCB0byBiZSAxCi0JICogYnV0IEknbSBsZWF2aW5nIHRoZSB0ZXN0cyBpbiB0byBwcm90ZWN0IGFnYWluc3QgZnV0dXJlCi0JICogY2hhbmdlcyAtLSByY2MuCi0JICovCi0JZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLCAoeGZzX2ZzaXplX3QpMCwKLQkJCQkgICAgIFhGU19EQVRBX0ZPUkssCi0JCQkJICAgICAoKGlwLT5pX2QuZGlfbmxpbmsgIT0gMCB8fAotCQkJCSAgICAgICAhKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkKLQkJCQkgICAgICA/IDEgOiAwKSk7Ci0JaWYgKGVycm9yKSB7Ci0JCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfAotCQkJCSBYRlNfVFJBTlNfQUJPUlQpOwotCX0gZWxzZSB7Ci0JCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOwotCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpOwotCX0KLQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCi0JcmV0dXJuIGVycm9yOwotfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc191dGlscy5oIGIvZnMveGZzL3hmc191dGlscy5oCmluZGV4IGVmMzIxMjIuLmY1NWI5NjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdXRpbHMuaAorKysgYi9mcy94ZnMveGZzX3V0aWxzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZm5kZWYgX19YRlNfVVRJTFNfSF9fCiAjZGVmaW5lIF9fWEZTX1VUSUxTX0hfXwogCi1leHRlcm4gaW50IHhmc190cnVuY2F0ZV9maWxlKHhmc19tb3VudF90ICosIHhmc19pbm9kZV90ICopOwogZXh0ZXJuIGludCB4ZnNfZGlyX2lhbGxvYyh4ZnNfdHJhbnNfdCAqKiwgeGZzX2lub2RlX3QgKiwgbW9kZV90LCB4ZnNfbmxpbmtfdCwKIAkJCQl4ZnNfZGV2X3QsIGNyZWRfdCAqLCBwcmlkX3QsIGludCwKIAkJCQl4ZnNfaW5vZGVfdCAqKiwgaW50ICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IGMxNjQ2ODMuLjNhYzEzN2QgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTI2LDE5ICsyNiwxNCBAQAogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgogI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKQEAgLTczLDcgKzY4LDcgQEAKIAlzdHJ1Y3QgeGZzX2RxdW90CSp1ZHFwLCAqZ2RxcCwgKm9sZGRxdW90MSwgKm9sZGRxdW90MjsKIAlpbnQJCQluZWVkX2lvbG9jayA9IDE7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKwl0cmFjZV94ZnNfc2V0YXR0cihpcCk7CiAKIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKQEAgLTE0MywxNiArMTM4LDYgQEAKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKERNX0VWRU5UX0VOQUJMRUQoaXAsIERNX0VWRU5UX1RSVU5DQVRFKSAmJgotCQkgICAgIShmbGFncyAmIFhGU19BVFRSX0RNSSkpIHsKLQkJCWludCBkbWZsYWdzID0gQVRfREVMQVlfRkxBRyhmbGFncykgfCBETV9TRU1fRkxBR19XUjsKLQkJCWNvZGUgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9UUlVOQ0FURSwgaXAsCi0JCQkJaWF0dHItPmlhX3NpemUsIDAsIGRtZmxhZ3MsIE5VTEwpOwotCQkJaWYgKGNvZGUpIHsKLQkJCQlsb2NrX2ZsYWdzID0gMDsKLQkJCQlnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQkJfQogCQlpZiAobmVlZF9pb2xvY2spCiAJCQlsb2NrX2ZsYWdzIHw9IFhGU19JT0xPQ0tfRVhDTDsKIAl9CkBAIC0yODMsOCArMjY4LDcgQEAKIAkJY29tbWl0X2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKIAkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgbG9ja19mbGFncyk7Ci0JCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCQkvKgogCQkgKiBPbmx5IGNoYW5nZSB0aGUgYy9tdGltZSBpZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUKQEAgLTMzNCw4ICszMTgsNyBAQAogCQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JVFJVTkNBVEVEKTsKIAkJfQogCX0gZWxzZSBpZiAodHApIHsKLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgbG9ja19mbGFncyk7Ci0JCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAl9CiAKIAkvKgpAQCAtNDcwLDE3ICs0NTMsMTAgQEAKIAkJCXJldHVybiBYRlNfRVJST1IoY29kZSk7CiAJfQogCi0JaWYgKERNX0VWRU5UX0VOQUJMRUQoaXAsIERNX0VWRU5UX0FUVFJJQlVURSkgJiYKLQkgICAgIShmbGFncyAmIFhGU19BVFRSX0RNSSkpIHsKLQkJKHZvaWQpIFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfQVRUUklCVVRFLCBpcCwgRE1fUklHSFRfTlVMTCwKLQkJCQkJTlVMTCwgRE1fUklHSFRfTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkJMCwgMCwgQVRfREVMQVlfRkxBRyhmbGFncykpOwotCX0KIAlyZXR1cm4gMDsKIAogIGFib3J0X3JldHVybjoKIAljb21taXRfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOwotCS8qIEZBTExUSFJPVUdIICovCiAgZXJyb3JfcmV0dXJuOgogCXhmc19xbV9kcXJlbGUodWRxcCk7CiAJeGZzX3FtX2RxcmVsZShnZHFwKTsKQEAgLTUxNiw3ICs0OTIsNyBAQAogCWludAkJZXJyb3IgPSAwOwogCiAJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIDAsIFhGU19CX1RPX0ZTQihtcCwgcGF0aGxlbiksIDAsIE5VTEwsIDAsCi0JCQltdmFsLCAmbm1hcHMsIE5VTEwsIE5VTEwpOworCQkJbXZhbCwgJm5tYXBzLCBOVUxMKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCkBAIC01NTcsNyArNTMzLDcgQEAKIAlpbnQJCXBhdGhsZW47CiAJaW50CQllcnJvciA9IDA7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKwl0cmFjZV94ZnNfcmVhZGxpbmsoaXApOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CkBAIC02MTMsMTQgKzU4OSwxNCBAQAogCSAqLwogCWVuZF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICgoeGZzX3Vmc2l6ZV90KWlwLT5pX3NpemUpKTsKIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClYRlNfTUFYSU9GRlNFVChtcCkpOwotCW1hcF9sZW4gPSBsYXN0X2ZzYiAtIGVuZF9mc2I7Ci0JaWYgKG1hcF9sZW4gPD0gMCkKKwlpZiAobGFzdF9mc2IgPD0gZW5kX2ZzYikKIAkJcmV0dXJuIDA7CisJbWFwX2xlbiA9IGxhc3RfZnNiIC0gZW5kX2ZzYjsKIAogCW5pbWFwcyA9IDE7CiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgZW5kX2ZzYiwgbWFwX2xlbiwgMCwKLQkJCSAgTlVMTCwgMCwgJmltYXAsICZuaW1hcHMsIE5VTEwsIE5VTEwpOworCQkJICBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCiAJaWYgKCFlcnJvciAmJiAobmltYXBzICE9IDApICYmCkBAIC02NzUsMTAgKzY1MSw3IEBACiAJCX0KIAogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwKLQkJCQlYRlNfSU9MT0NLX0VYQ0wgfAotCQkJCVhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJCXhmc190cmFuc19pam9pbih0cCwgaXApOwogCiAJCWVycm9yID0geGZzX2l0cnVuY2F0ZV9maW5pc2goJnRwLCBpcCwKIAkJCQkJICAgICBpcC0+aV9zaXplLApAQCAtNzUwLDggKzcyMyw3IEBACiAJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CiAJc2l6ZSA9IChpbnQpaXAtPmlfZC5kaV9zaXplOwogCWlwLT5pX2QuZGlfc2l6ZSA9IDA7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXApOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKIAkvKgogCSAqIEZpbmQgdGhlIGJsb2NrKHMpIHNvIHdlIGNhbiBpbnZhbCBhbmQgdW5tYXAgdGhlbS4KQEAgLTc2MSw3ICs3MzMsNyBAQAogCW5tYXBzID0gQVJSQVlfU0laRShtdmFsKTsKIAlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgMCwgWEZTX0JfVE9fRlNCKG1wLCBzaXplKSwKIAkJCVhGU19CTUFQSV9NRVRBREFUQSwgJmZpcnN0X2Jsb2NrLCAwLCBtdmFsLCAmbm1hcHMsCi0JCQkmZnJlZV9saXN0LCBOVUxMKSkpCisJCQkmZnJlZV9saXN0KSkpCiAJCWdvdG8gZXJyb3IwOwogCS8qCiAJICogSW52YWxpZGF0ZSB0aGUgYmxvY2socykuCkBAIC03NzYsNyArNzQ4LDcgQEAKIAkgKiBVbm1hcCB0aGUgZGVhZCBibG9jayhzKSB0byB0aGUgZnJlZV9saXN0LgogCSAqLwogCWlmICgoZXJyb3IgPSB4ZnNfYnVubWFwaSh0cCwgaXAsIDAsIHNpemUsIFhGU19CTUFQSV9NRVRBREFUQSwgbm1hcHMsCi0JCQkmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsIE5VTEwsICZkb25lKSkpCisJCQkmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsICZkb25lKSkpCiAJCWdvdG8gZXJyb3IxOwogCUFTU0VSVChkb25lKTsKIAkvKgpAQCAtNzk1LDggKzc2Nyw3IEBACiAJICogTWFyayBpdCBkaXJ0eSBzbyBpdCB3aWxsIGJlIGxvZ2dlZCBhbmQgbW92ZWQgZm9yd2FyZCBpbiB0aGUgbG9nIGFzCiAJICogcGFydCBvZiBldmVyeSBjb21taXQuCiAJICovCi0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXApOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKIAkvKgogCSAqIEdldCBhIG5ldywgZW1wdHkgdHJhbnNhY3Rpb24gdG8gcmV0dXJuIHRvIG91ciBjYWxsZXIuCkBAIC05MjksOCArOTAwLDcgQEAKIAkJZ290byBlcnJvcl9jYW5jZWw7CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19BVFRSX0ZPUkspOwogCiAJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOwpAQCAtMTAzNSw4ICsxMDA1LDYgQEAKIAlpbnQJCWVycm9yOwogCWludAkJdHJ1bmNhdGU7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKLQogCS8qCiAJICogSWYgdGhlIGlub2RlIGlzIGFscmVhZHkgZnJlZSwgdGhlbiB0aGVyZSBjYW4gYmUgbm90aGluZwogCSAqIHRvIGNsZWFuIHVwIGhlcmUuCkBAIC0xMDYwLDkgKzEwMjgsNiBAQAogCiAJbXAgPSBpcC0+aV9tb3VudDsKIAotCWlmIChpcC0+aV9kLmRpX25saW5rID09IDAgJiYgRE1fRVZFTlRfRU5BQkxFRChpcCwgRE1fRVZFTlRfREVTVFJPWSkpCi0JCVhGU19TRU5EX0RFU1RST1kobXAsIGlwLCBETV9SSUdIVF9OVUxMKTsKLQogCWVycm9yID0gMDsKIAogCS8qIElmIHRoaXMgaXMgYSByZWFkLW9ubHkgbW91bnQsIGRvbid0IGRvIHRoaXMgKHdvdWxkIGdlbmVyYXRlIEkvTykgKi8KQEAgLTExMjAsOCArMTA4NSw3IEBACiAJCX0KIAogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKIAkJLyoKIAkJICogbm9ybWFsbHksIHdlIGhhdmUgdG8gcnVuIHhmc19pdHJ1bmNhdGVfZmluaXNoIHN5bmMuCkBAIC0xMTU0LDggKzExMTgsNyBAQAogCQkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOwogCQl9CiAKLQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKIAkJCQkJICBYRlNfSUZSRUVfTE9HX1JFUyhtcCksCkBAIC0xMTY4LDggKzExMzEsNyBAQAogCQl9CiAKIAkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7Ci0JCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJCXhmc190cmFuc19pam9pbih0cCwgaXApOwogCX0KIAogCS8qCkBAIC0xMjU3LDcgKzEyMTksNyBAQAogCWludAkJCWVycm9yOwogCXVpbnQJCQlsb2NrX21vZGU7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGRwKTsKKwl0cmFjZV94ZnNfbG9va3VwKGRwLCBuYW1lKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwpAQCAtMTMwOSwyMSArMTI3MSwxMSBAQAogCXVpbnQJCQlsb2dfcmVzOwogCXVpbnQJCQlsb2dfY291bnQ7CiAKLQl4ZnNfaXRyYWNlX2VudHJ5KGRwKTsKKwl0cmFjZV94ZnNfY3JlYXRlKGRwLCBuYW1lKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCi0JaWYgKERNX0VWRU5UX0VOQUJMRUQoZHAsIERNX0VWRU5UX0NSRUFURSkpIHsKLQkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX0NSRUFURSwKLQkJCQlkcCwgRE1fUklHSFRfTlVMTCwgTlVMTCwKLQkJCQlETV9SSUdIVF9OVUxMLCBuYW1lLT5uYW1lLCBOVUxMLAotCQkJCW1vZGUsIDAsIDApOwotCi0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KIAlpZiAoZHAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUFJPSklOSEVSSVQpCiAJCXByaWQgPSBkcC0+aV9kLmRpX3Byb2ppZDsKIAllbHNlCkBAIC0xNDI3LDggKzEzNzksNyBAQAogCSAqIHRoZSB0cmFuc2FjdGlvbiBjYW5jZWwgdW5sb2NraW5nIGRwIHNvIGRvbid0IGRvIGl0IGV4cGxpY2l0bHkgaW4gdGhlCiAJICogZXJyb3IgcGF0aC4KIAkgKi8KLQlJSE9MRChkcCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbl9yZWYodHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJdW5sb2NrX2RwX29uX2Vycm9yID0gQl9GQUxTRTsKIAogCWVycm9yID0geGZzX2Rpcl9jcmVhdGVuYW1lKHRwLCBkcCwgbmFtZSwgaXAtPmlfaW5vLApAQCAtMTQ4NywxNiArMTQzOCw3IEBACiAJeGZzX3FtX2RxcmVsZShnZHFwKTsKIAogCSppcHAgPSBpcDsKLQotCS8qIEZhbGx0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgICovCi0gc3RkX3JldHVybjoKLQlpZiAoRE1fRVZFTlRfRU5BQkxFRChkcCwgRE1fRVZFTlRfUE9TVENSRUFURSkpIHsKLQkJWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUQ1JFQVRFLCBkcCwgRE1fUklHSFRfTlVMTCwKLQkJCQlpcCwgRE1fUklHSFRfTlVMTCwgbmFtZS0+bmFtZSwgTlVMTCwgbW9kZSwKLQkJCQllcnJvciwgMCk7Ci0JfQotCi0JcmV0dXJuIGVycm9yOworCXJldHVybiAwOwogCiAgb3V0X2JtYXBfY2FuY2VsOgogCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKQEAgLTE1MTAsOCArMTQ1Miw4IEBACiAKIAlpZiAodW5sb2NrX2RwX29uX2Vycm9yKQogCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOwotCi0JZ290byBzdGRfcmV0dXJuOworIHN0ZF9yZXR1cm46CisJcmV0dXJuIGVycm9yOwogCiAgb3V0X2Fib3J0X3JlbGU6CiAJLyoKQEAgLTE3MjYsMjAgKzE2NjgsMTEgQEAKIAl1aW50CQkJcmVzYmxrczsKIAl1aW50CQkJbG9nX2NvdW50OwogCi0JeGZzX2l0cmFjZV9lbnRyeShkcCk7Ci0JeGZzX2l0cmFjZV9lbnRyeShpcCk7CisJdHJhY2VfeGZzX3JlbW92ZShkcCwgbmFtZSk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAotCWlmIChETV9FVkVOVF9FTkFCTEVEKGRwLCBETV9FVkVOVF9SRU1PVkUpKSB7Ci0JCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9SRU1PVkUsIGRwLCBETV9SSUdIVF9OVUxMLAotCQkJCQlOVUxMLCBETV9SSUdIVF9OVUxMLCBuYW1lLT5uYW1lLCBOVUxMLAotCQkJCQlpcC0+aV9kLmRpX21vZGUsIDAsIDApOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCiAJZXJyb3IgPSB4ZnNfcW1fZHFhdHRhY2goZHAsIDApOwogCWlmIChlcnJvcikKIAkJZ290byBzdGRfcmV0dXJuOwpAQCAtMTc4MiwxNSArMTcxNSw4IEBACiAKIAl4ZnNfbG9ja190d29faW5vZGVzKGRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSBnb3R0ZW4gYm90aCB0aGUgZGlyZWN0b3J5IGFuZCB0aGUgZW50cnkKLQkgKiBpbm9kZXMgbG9ja2VkLgotCSAqLwotCUlIT0xEKGlwKTsKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0KLQlJSE9MRChkcCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbl9yZWYodHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAogCS8qCiAJICogSWYgd2UncmUgcmVtb3ZpbmcgYSBkaXJlY3RvcnkgcGVyZm9ybSBzb21lIGFkZGl0aW9uYWwgdmFsaWRhdGlvbi4KQEAgLTE4NzcsMjEgKzE4MDMsMTUgQEAKIAlpZiAoIWlzX2RpciAmJiBsaW5rX3plcm8gJiYgeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oaXApKQogCQl4ZnNfZmlsZXN0cmVhbV9kZWFzc29jaWF0ZShpcCk7CiAKLSBzdGRfcmV0dXJuOgotCWlmIChETV9FVkVOVF9FTkFCTEVEKGRwLCBETV9FVkVOVF9QT1NUUkVNT1ZFKSkgewotCQlYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1BPU1RSRU1PVkUsIGRwLCBETV9SSUdIVF9OVUxMLAotCQkJCU5VTEwsIERNX1JJR0hUX05VTEwsIG5hbWUtPm5hbWUsIE5VTEwsCi0JCQkJaXAtPmlfZC5kaV9tb2RlLCBlcnJvciwgMCk7Ci0JfQotCi0JcmV0dXJuIGVycm9yOworCXJldHVybiAwOwogCiAgb3V0X2JtYXBfY2FuY2VsOgogCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKIAljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOwogIG91dF90cmFuc19jYW5jZWw6CiAJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKLQlnb3RvIHN0ZF9yZXR1cm47Cisgc3RkX3JldHVybjoKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIGludApAQCAtMTkwOSwyNSArMTgyOSwxMyBAQAogCWludAkJCWNvbW1pdHRlZDsKIAlpbnQJCQlyZXNibGtzOwogCi0JeGZzX2l0cmFjZV9lbnRyeSh0ZHApOwotCXhmc19pdHJhY2VfZW50cnkoc2lwKTsKKwl0cmFjZV94ZnNfbGluayh0ZHAsIHRhcmdldF9uYW1lKTsKIAogCUFTU0VSVCghU19JU0RJUihzaXAtPmlfZC5kaV9tb2RlKSk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAotCWlmIChETV9FVkVOVF9FTkFCTEVEKHRkcCwgRE1fRVZFTlRfTElOSykpIHsKLQkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX0xJTkssCi0JCQkJCXRkcCwgRE1fUklHSFRfTlVMTCwKLQkJCQkJc2lwLCBETV9SSUdIVF9OVUxMLAotCQkJCQl0YXJnZXRfbmFtZS0+bmFtZSwgTlVMTCwgMCwgMCwgMCk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhyb3VnaCBzdGRfcmV0dXJuIGFmdGVyIHRoaXMgcG9pbnQuICovCi0KIAllcnJvciA9IHhmc19xbV9kcWF0dGFjaChzaXAsIDApOwogCWlmIChlcnJvcikKIAkJZ290byBzdGRfcmV0dXJuOwpAQCAtMTk1MywxNSArMTg2MSw4IEBACiAKIAl4ZnNfbG9ja190d29faW5vZGVzKHNpcCwgdGRwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKLQkvKgotCSAqIEluY3JlbWVudCB2bm9kZSByZWYgY291bnRzIHNpbmNlIHhmc190cmFuc19jb21taXQgJgotCSAqIHhmc190cmFuc19jYW5jZWwgd2lsbCBib3RoIHVubG9jayB0aGUgaW5vZGVzIGFuZAotCSAqIGRlY3JlbWVudCB0aGUgYXNzb2NpYXRlZCByZWYgY291bnRzLgotCSAqLwotCUlIT0xEKHNpcCk7Ci0JSUhPTEQodGRwKTsKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIHNpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbih0cCwgdGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgc2lwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgdGRwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKIAkvKgogCSAqIElmIHRoZSBzb3VyY2UgaGFzIHRvbyBtYW55IGxpbmtzLCB3ZSBjYW4ndCBtYWtlIGFueSBtb3JlIHRvIGl0LgpAQCAtMjAxNCwyNyArMTkxNSwxNCBAQAogCQlnb3RvIGFib3J0X3JldHVybjsKIAl9CiAKLQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpOwotCWlmIChlcnJvcikKLQkJZ290byBzdGRfcmV0dXJuOwotCi0JLyogRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAuICovCi1zdGRfcmV0dXJuOgotCWlmIChETV9FVkVOVF9FTkFCTEVEKHNpcCwgRE1fRVZFTlRfUE9TVExJTkspKSB7Ci0JCSh2b2lkKSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1BPU1RMSU5LLAotCQkJCXRkcCwgRE1fUklHSFRfTlVMTCwKLQkJCQlzaXAsIERNX1JJR0hUX05VTEwsCi0JCQkJdGFyZ2V0X25hbWUtPm5hbWUsIE5VTEwsIDAsIGVycm9yLCAwKTsKLQl9Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKIAogIGFib3J0X3JldHVybjoKIAljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOwotCS8qIEZBTExUSFJPVUdIICovCi0KICBlcnJvcl9yZXR1cm46CiAJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKLQlnb3RvIHN0ZF9yZXR1cm47Cisgc3RkX3JldHVybjoKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIGludApAQCAtMjA3NCw3ICsxOTYyLDcgQEAKIAlpcCA9IE5VTEw7CiAJdHAgPSBOVUxMOwogCi0JeGZzX2l0cmFjZV9lbnRyeShkcCk7CisJdHJhY2VfeGZzX3N5bWxpbmsoZHAsIGxpbmtfbmFtZSk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKQEAgLTIwODYsMTcgKzE5NzQsNiBAQAogCWlmIChwYXRobGVuID49IE1BWFBBVEhMRU4pICAgICAgLyogdG90YWwgc3RyaW5nIHRvbyBsb25nICovCiAJCXJldHVybiBYRlNfRVJST1IoRU5BTUVUT09MT05HKTsKIAotCWlmIChETV9FVkVOVF9FTkFCTEVEKGRwLCBETV9FVkVOVF9TWU1MSU5LKSkgewotCQllcnJvciA9IFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfU1lNTElOSywgZHAsCi0JCQkJCURNX1JJR0hUX05VTEwsIE5VTEwsIERNX1JJR0hUX05VTEwsCi0JCQkJCWxpbmtfbmFtZS0+bmFtZSwKLQkJCQkJKHVuc2lnbmVkIGNoYXIgKil0YXJnZXRfcGF0aCwgMCwgMCwgMCk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhyb3VnaCBzdGRfcmV0dXJuIGFmdGVyIHRoaXMgcG9pbnQuICovCi0KIAl1ZHFwID0gZ2RxcCA9IE5VTEw7CiAJaWYgKGRwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1BST0pJTkhFUklUKQogCQlwcmlkID0gZHAtPmlfZC5kaV9wcm9qaWQ7CkBAIC0yMTgwLDggKzIwNTcsNyBAQAogCSAqIHRyYW5zYWN0aW9uIGNhbmNlbCB1bmxvY2tpbmcgZHAgc28gZG9uJ3QgZG8gaXQgZXhwbGljaXRseSBpbiB0aGUKIAkgKiBlcnJvciBwYXRoLgogCSAqLwotCUlIT0xEKGRwKTsKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKIAl1bmxvY2tfZHBfb25fZXJyb3IgPSBCX0ZBTFNFOwogCiAJLyoKQEAgLTIyMTUsNyArMjA5MSw3IEBACiAJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgZmlyc3RfZnNiLCBmc19ibG9ja3MsCiAJCQkJICBYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsCiAJCQkJICAmZmlyc3RfYmxvY2ssIHJlc2Jsa3MsIG12YWwsICZubWFwcywKLQkJCQkgICZmcmVlX2xpc3QsIE5VTEwpOworCQkJCSAgJmZyZWVfbGlzdCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjE7CiAJCX0KQEAgLTIyNzgsMjEgKzIxNTQsOCBAQAogCXhmc19xbV9kcXJlbGUodWRxcCk7CiAJeGZzX3FtX2RxcmVsZShnZHFwKTsKIAotCS8qIEZhbGwgdGhyb3VnaCB0byBzdGRfcmV0dXJuIHdpdGggZXJyb3IgPSAwIG9yIGVycm5vIGZyb20KLQkgKiB4ZnNfdHJhbnNfY29tbWl0CSovCi1zdGRfcmV0dXJuOgotCWlmIChETV9FVkVOVF9FTkFCTEVEKGRwLCBETV9FVkVOVF9QT1NUU1lNTElOSykpIHsKLQkJKHZvaWQpIFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfUE9TVFNZTUxJTkssCi0JCQkJCWRwLCBETV9SSUdIVF9OVUxMLAotCQkJCQllcnJvciA/IE5VTEwgOiBpcCwKLQkJCQkJRE1fUklHSFRfTlVMTCwgbGlua19uYW1lLT5uYW1lLAotCQkJCQkodW5zaWduZWQgY2hhciAqKXRhcmdldF9wYXRoLAotCQkJCQkwLCBlcnJvciwgMCk7Ci0JfQotCi0JaWYgKCFlcnJvcikKLQkJKmlwcCA9IGlwOwotCXJldHVybiBlcnJvcjsKKwkqaXBwID0gaXA7CisJcmV0dXJuIDA7CiAKICBlcnJvcjI6CiAJSVJFTEUoaXApOwpAQCAtMjMwNiw4ICsyMTY5LDggQEAKIAogCWlmICh1bmxvY2tfZHBfb25fZXJyb3IpCiAJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0KLQlnb3RvIHN0ZF9yZXR1cm47Cisgc3RkX3JldHVybjoKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIGludApAQCAtMjMzMywxMyArMjE5NiwxMiBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJaXAtPmlfZC5kaV9kbWV2bWFzayA9IGV2bWFzazsKIAlpcC0+aV9kLmRpX2Rtc3RhdGUgID0gc3RhdGU7CiAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7Ci0JSUhPTEQoaXApOwogCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC0yMzkwLDcgKzIyNTIsNyBAQAogCWludAkJCWNvbW1pdHRlZDsKIAlpbnQJCQllcnJvcjsKIAotCXhmc19pdHJhY2VfZW50cnkoaXApOworCXRyYWNlX3hmc19hbGxvY19maWxlX3NwYWNlKGlwKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwpAQCAtMjQxMiwyNSArMjI3NCw5IEBACiAJc3RhcnRvZmZzZXRfZnNiCT0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAlhbGxvY2F0ZXNpemVfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBjb3VudCk7CiAKLQkvKglHZW5lcmF0ZSBhIERNQVBJIGV2ZW50IGlmIG5lZWRlZC4JKi8KLQlpZiAoYWxsb2NfdHlwZSAhPSAwICYmIG9mZnNldCA8IGlwLT5pX3NpemUgJiYKLQkJCShhdHRyX2ZsYWdzICYgWEZTX0FUVFJfRE1JKSA9PSAwICAmJgotCQkJRE1fRVZFTlRfRU5BQkxFRChpcCwgRE1fRVZFTlRfV1JJVEUpKSB7Ci0JCXhmc19vZmZfdCAgICAgICAgICAgZW5kX2RtaV9vZmZzZXQ7Ci0KLQkJZW5kX2RtaV9vZmZzZXQgPSBvZmZzZXQrbGVuOwotCQlpZiAoZW5kX2RtaV9vZmZzZXQgPiBpcC0+aV9zaXplKQotCQkJZW5kX2RtaV9vZmZzZXQgPSBpcC0+aV9zaXplOwotCQllcnJvciA9IFhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1dSSVRFLCBpcCwgb2Zmc2V0LAotCQkJCSAgICAgIGVuZF9kbWlfb2Zmc2V0IC0gb2Zmc2V0LCAwLCBOVUxMKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQogCS8qCiAJICogQWxsb2NhdGUgZmlsZSBzcGFjZSB1bnRpbCBkb25lIG9yIHVudGlsIHRoZXJlIGlzIGFuIGVycm9yCiAJICovCi1yZXRyeToKIAl3aGlsZSAoYWxsb2NhdGVzaXplX2ZzYiAmJiAhZXJyb3IpIHsKIAkJeGZzX2ZpbGVvZmZfdAlzLCBlOwogCkBAIC0yNDg4LDggKzIzMzQsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIAotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCQkvKgogCQkgKiBJc3N1ZSB0aGUgeGZzX2JtYXBpKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzCkBAIC0yNDk4LDcgKzIzNDMsNyBAQAogCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwKIAkJCQkgIGFsbG9jYXRlc2l6ZV9mc2IsIGJtYXBpX2ZsYWcsCiAJCQkJICAmZmlyc3Rmc2IsIDAsIGltYXBwLCAmbmltYXBzLAotCQkJCSAgJmZyZWVfbGlzdCwgTlVMTCk7CisJCQkJICAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKSB7CiAJCQlnb3RvIGVycm9yMDsKIAkJfQpAQCAtMjUyNywxNyArMjM3Miw2IEBACiAJCXN0YXJ0b2Zmc2V0X2ZzYiArPSBhbGxvY2F0ZWRfZnNiOwogCQlhbGxvY2F0ZXNpemVfZnNiIC09IGFsbG9jYXRlZF9mc2I7CiAJfQotZG1hcGlfZW5vc3BjX2NoZWNrOgotCWlmIChlcnJvciA9PSBFTk9TUEMgJiYgKGF0dHJfZmxhZ3MgJiBYRlNfQVRUUl9ETUkpID09IDAgJiYKLQkgICAgRE1fRVZFTlRfRU5BQkxFRChpcCwgRE1fRVZFTlRfTk9TUEFDRSkpIHsKLQkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX05PU1BBQ0UsCi0JCQkJaXAsIERNX1JJR0hUX05VTEwsCi0JCQkJaXAsIERNX1JJR0hUX05VTEwsCi0JCQkJTlVMTCwgTlVMTCwgMCwgMCwgMCk7IC8qIERlbGF5IGZsYWcgaW50ZW50aW9uYWxseSB1bnVzZWQgKi8KLQkJaWYgKGVycm9yID09IDApCi0JCQlnb3RvIHJldHJ5OwkvKiBNYXliZSBETUFQSSBhcHAuIGhhcyBtYWRlIHNwYWNlICovCi0JCS8qIGVsc2UgZmFsbCB0aHJvdWdoIHdpdGggZXJyb3IgZnJvbSBYRlNfU0VORF9EQVRBICovCi0JfQogCiAJcmV0dXJuIGVycm9yOwogCkBAIC0yNTQ4LDcgKzIzODIsNyBAQAogZXJyb3IxOgkvKiBKdXN0IGNhbmNlbCB0cmFuc2FjdGlvbiAqLwogCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfCBYRlNfVFJBTlNfQUJPUlQpOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JZ290byBkbWFwaV9lbm9zcGNfY2hlY2s7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtMjU5OCw3ICsyNDMyLDcgQEAKIAkJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CiAJCW5pbWFwID0gMTsKIAkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIDEsIDAsCi0JCQlOVUxMLCAwLCAmaW1hcCwgJm5pbWFwLCBOVUxMLCBOVUxMKTsKKwkJCU5VTEwsIDAsICZpbWFwLCAmbmltYXAsIE5VTEwpOwogCQlpZiAoZXJyb3IgfHwgbmltYXAgPCAxKQogCQkJYnJlYWs7CiAJCUFTU0VSVChpbWFwLmJyX2Jsb2NrY291bnQgPj0gMSk7CkBAIC0yNjYxLDcgKzI0OTUsNiBAQAogewogCWludAkJCWNvbW1pdHRlZDsKIAlpbnQJCQlkb25lOwotCXhmc19vZmZfdAkJZW5kX2RtaV9vZmZzZXQ7CiAJeGZzX2ZpbGVvZmZfdAkJZW5kb2Zmc2V0X2ZzYjsKIAlpbnQJCQllcnJvcjsKIAl4ZnNfZnNibG9ja190CQlmaXJzdGZzYjsKQEAgLTI2ODAsNyArMjUxMyw3IEBACiAKIAltcCA9IGlwLT5pX21vdW50OwogCi0JeGZzX2l0cmFjZV9lbnRyeShpcCk7CisJdHJhY2VfeGZzX2ZyZWVfZmlsZV9zcGFjZShpcCk7CiAKIAllcnJvciA9IHhmc19xbV9kcWF0dGFjaChpcCwgMCk7CiAJaWYgKGVycm9yKQpAQCAtMjY5MSwxOSArMjUyNCw3IEBACiAJCXJldHVybiBlcnJvcjsKIAlydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCk7CiAJc3RhcnRvZmZzZXRfZnNiCT0gWEZTX0JfVE9fRlNCKG1wLCBvZmZzZXQpOwotCWVuZF9kbWlfb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuOwotCWVuZG9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBlbmRfZG1pX29mZnNldCk7Ci0KLQlpZiAob2Zmc2V0IDwgaXAtPmlfc2l6ZSAmJiAoYXR0cl9mbGFncyAmIFhGU19BVFRSX0RNSSkgPT0gMCAmJgotCSAgICBETV9FVkVOVF9FTkFCTEVEKGlwLCBETV9FVkVOVF9XUklURSkpIHsKLQkJaWYgKGVuZF9kbWlfb2Zmc2V0ID4gaXAtPmlfc2l6ZSkKLQkJCWVuZF9kbWlfb2Zmc2V0ID0gaXAtPmlfc2l6ZTsKLQkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9XUklURSwgaXAsCi0JCQkJb2Zmc2V0LCBlbmRfZG1pX29mZnNldCAtIG9mZnNldCwKLQkJCQlBVF9ERUxBWV9GTEFHKGF0dHJfZmxhZ3MpLCBOVUxMKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KKwllbmRvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0ICsgbGVuKTsKIAogCWlmIChhdHRyX2ZsYWdzICYgWEZTX0FUVFJfTk9MT0NLKQogCQluZWVkX2lvbG9jayA9IDA7CkBAIC0yNzMxLDcgKzI1NTIsNyBAQAogCWlmIChydCAmJiAheGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KCZtcC0+bV9zYikpIHsKIAkJbmltYXAgPSAxOwogCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgc3RhcnRvZmZzZXRfZnNiLAotCQkJMSwgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCwgTlVMTCk7CisJCQkxLCAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwLCBOVUxMKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKIAkJQVNTRVJUKG5pbWFwID09IDAgfHwgbmltYXAgPT0gMSk7CkBAIC0yNzQ2LDcgKzI1NjcsNyBAQAogCQl9CiAJCW5pbWFwID0gMTsKIAkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZG9mZnNldF9mc2IgLSAxLAotCQkJMSwgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCwgTlVMTCk7CisJCQkxLCAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwLCBOVUxMKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKIAkJQVNTRVJUKG5pbWFwID09IDAgfHwgbmltYXAgPT0gMSk7CkBAIC0yODE0LDggKzI2MzUsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIAotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCQkvKgogCQkgKiBpc3N1ZSB0aGUgYnVubWFwaSgpIGNhbGwgdG8gZnJlZSB0aGUgYmxvY2tzCkBAIC0yODIzLDcgKzI2NDMsNyBAQAogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCWVycm9yID0geGZzX2J1bm1hcGkodHAsIGlwLCBzdGFydG9mZnNldF9mc2IsCiAJCQkJICBlbmRvZmZzZXRfZnNiIC0gc3RhcnRvZmZzZXRfZnNiLAotCQkJCSAgMCwgMiwgJmZpcnN0ZnNiLCAmZnJlZV9saXN0LCBOVUxMLCAmZG9uZSk7CisJCQkJICAwLCAyLCAmZmlyc3Rmc2IsICZmcmVlX2xpc3QsICZkb25lKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlnb3RvIGVycm9yMDsKIAkJfQpAQCAtMjg4Myw4ICsyNzAzLDYgQEAKIAl4ZnNfdHJhbnNfdAkqdHA7CiAJc3RydWN0IGlhdHRyCWlhdHRyOwogCi0JeGZzX2l0cmFjZV9lbnRyeShpcCk7Ci0KIAlpZiAoIVNfSVNSRUcoaXAtPmlfZC5kaV9tb2RlKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCkBAIC0yOTg1LDggKzI4MDMsNyBAQAogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKIAlpZiAoKGF0dHJfZmxhZ3MgJiBYRlNfQVRUUl9ETUkpID09IDApIHsKIAkJaXAtPmlfZC5kaV9tb2RlICY9IH5TX0lTVUlEOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAppbmRleCA0ZjNkNzVlLi5jNzM3NmJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IGRldmljZTsKIHN0cnVjdCBzZXFfZmlsZTsKIHN0cnVjdCBtb2R1bGU7CitzdHJ1Y3QgZGV2aWNlX25vZGU7CiAKIC8qKgogICogc3RydWN0IGdwaW9fY2hpcCAtIGFic3RyYWN0IGEgR1BJTyBjb250cm9sbGVyCkBAIC0xMDYsNiArMTA3LDE3IEBACiAJY29uc3QgY2hhcgkJKmNvbnN0ICpuYW1lczsKIAl1bnNpZ25lZAkJY2FuX3NsZWVwOjE7CiAJdW5zaWduZWQJCWV4cG9ydGVkOjE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9HUElPKQorCS8qCisJICogSWYgQ09ORklHX09GIGlzIGVuYWJsZWQsIHRoZW4gYWxsIEdQSU8gY29udHJvbGxlcnMgZGVzY3JpYmVkIGluIHRoZQorCSAqIGRldmljZSB0cmVlIGF1dG9tYXRpY2FsbHkgbWF5IGhhdmUgYW4gT0YgdHJhbnNsYXRpb24KKwkgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJaW50IG9mX2dwaW9fbl9jZWxsczsKKwlpbnQgKCpvZl94bGF0ZSkoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCSAgICAgICAgY29uc3Qgdm9pZCAqZ3Bpb19zcGVjLCB1MzIgKmZsYWdzKTsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKmdwaW9jaGlwX2lzX3JlcXVlc3RlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLApAQCAtMTE1LDYgKzEyNyw5IEBACiAvKiBhZGQvcmVtb3ZlIGNoaXBzICovCiBleHRlcm4gaW50IGdwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGdwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKTsKK2V4dGVybiBzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcF9maW5kKHZvaWQgKmRhdGEsCisJCQkJCWludCAoKm1hdGNoKShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICAgICB2b2lkICpkYXRhKSk7CiAKIAogLyogQWx3YXlzIHVzZSB0aGUgbGlicmFyeSBjb2RlIGZvciBHUElPIG1hbmFnZW1lbnQgY2FsbHMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsNjQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWw2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYWM3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsNjQuaApAQCAtMCwwICsxLDk2IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19MT0NBTDY0X0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0xPQ0FMNjRfSAorCisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKy8qCisgKiBBIHNpZ25lZCBsb25nIHR5cGUgZm9yIG9wZXJhdGlvbnMgd2hpY2ggYXJlIGF0b21pYyBmb3IgYSBzaW5nbGUgQ1BVLgorICogVXN1YWxseSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggcGVyLWNwdSB2YXJpYWJsZXMuCisgKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdXNlcyBhdG9taWM2NF90LiAgV2hpY2ggaXMKKyAqIHJhdGhlciBwb2ludGxlc3MuICBUaGUgd2hvbGUgcG9pbnQgYmVoaW5kIGxvY2FsNjRfdCBpcyB0aGF0IHNvbWUgcHJvY2Vzc29ycworICogY2FuIHBlcmZvcm0gYXRvbWljIGFkZHMgYW5kIHN1YnRyYWN0cyBpbiBhIG1hbm5lciB3aGljaCBpcyBhdG9taWMgd3J0IElSUXMKKyAqIHJ1bm5pbmcgb24gdGhpcyBDUFUuICBsb2NhbDY0X3QgYWxsb3dzIGV4cGxvaXRhdGlvbiBvZiBzdWNoIGNhcGFiaWxpdGllcy4KKyAqLworCisvKiBJbXBsZW1lbnQgaW4gdGVybXMgb2YgYXRvbWljcy4gKi8KKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKworI2luY2x1ZGUgPGFzbS9sb2NhbC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJbG9jYWxfdCBhOworfSBsb2NhbDY0X3Q7CisKKyNkZWZpbmUgTE9DQUw2NF9JTklUKGkpCXsgTE9DQUxfSU5JVChpKSB9CisKKyNkZWZpbmUgbG9jYWw2NF9yZWFkKGwpCQlsb2NhbF9yZWFkKCYobCktPmEpCisjZGVmaW5lIGxvY2FsNjRfc2V0KGwsaSkJbG9jYWxfc2V0KCgmKGwpLT5hKSwoaSkpCisjZGVmaW5lIGxvY2FsNjRfaW5jKGwpCQlsb2NhbF9pbmMoJihsKS0+YSkKKyNkZWZpbmUgbG9jYWw2NF9kZWMobCkJCWxvY2FsX2RlYygmKGwpLT5hKQorI2RlZmluZSBsb2NhbDY0X2FkZChpLGwpCWxvY2FsX2FkZCgoaSksKCYobCktPmEpKQorI2RlZmluZSBsb2NhbDY0X3N1YihpLGwpCWxvY2FsX3N1YigoaSksKCYobCktPmEpKQorCisjZGVmaW5lIGxvY2FsNjRfc3ViX2FuZF90ZXN0KGksIGwpIGxvY2FsX3N1Yl9hbmRfdGVzdCgoaSksICgmKGwpLT5hKSkKKyNkZWZpbmUgbG9jYWw2NF9kZWNfYW5kX3Rlc3QobCkgbG9jYWxfZGVjX2FuZF90ZXN0KCYobCktPmEpCisjZGVmaW5lIGxvY2FsNjRfaW5jX2FuZF90ZXN0KGwpIGxvY2FsX2luY19hbmRfdGVzdCgmKGwpLT5hKQorI2RlZmluZSBsb2NhbDY0X2FkZF9uZWdhdGl2ZShpLCBsKSBsb2NhbF9hZGRfbmVnYXRpdmUoKGkpLCAoJihsKS0+YSkpCisjZGVmaW5lIGxvY2FsNjRfYWRkX3JldHVybihpLCBsKSBsb2NhbF9hZGRfcmV0dXJuKChpKSwgKCYobCktPmEpKQorI2RlZmluZSBsb2NhbDY0X3N1Yl9yZXR1cm4oaSwgbCkgbG9jYWxfc3ViX3JldHVybigoaSksICgmKGwpLT5hKSkKKyNkZWZpbmUgbG9jYWw2NF9pbmNfcmV0dXJuKGwpCWxvY2FsX2luY19yZXR1cm4oJihsKS0+YSkKKworI2RlZmluZSBsb2NhbDY0X2NtcHhjaGcobCwgbywgbikgbG9jYWxfY21weGNoZygoJihsKS0+YSksIChvKSwgKG4pKQorI2RlZmluZSBsb2NhbDY0X3hjaGcobCwgbikJbG9jYWxfeGNoZygoJihsKS0+YSksIChuKSkKKyNkZWZpbmUgbG9jYWw2NF9hZGRfdW5sZXNzKGwsIF9hLCB1KSBsb2NhbF9hZGRfdW5sZXNzKCgmKGwpLT5hKSwgKF9hKSwgKHUpKQorI2RlZmluZSBsb2NhbDY0X2luY19ub3RfemVybyhsKQlsb2NhbF9pbmNfbm90X3plcm8oJihsKS0+YSkKKworLyogTm9uLWF0b21pYyB2YXJpYW50cywgaWUuIHByZWVtcHRpb24gZGlzYWJsZWQgYW5kIHdvbid0IGJlIHRvdWNoZWQKKyAqIGluIGludGVycnVwdCwgZXRjLiAgU29tZSBhcmNocyBjYW4gb3B0aW1pemUgdGhpcyBjYXNlIHdlbGwuICovCisjZGVmaW5lIF9fbG9jYWw2NF9pbmMobCkJbG9jYWw2NF9zZXQoKGwpLCBsb2NhbDY0X3JlYWQobCkgKyAxKQorI2RlZmluZSBfX2xvY2FsNjRfZGVjKGwpCWxvY2FsNjRfc2V0KChsKSwgbG9jYWw2NF9yZWFkKGwpIC0gMSkKKyNkZWZpbmUgX19sb2NhbDY0X2FkZChpLGwpCWxvY2FsNjRfc2V0KChsKSwgbG9jYWw2NF9yZWFkKGwpICsgKGkpKQorI2RlZmluZSBfX2xvY2FsNjRfc3ViKGksbCkJbG9jYWw2NF9zZXQoKGwpLCBsb2NhbDY0X3JlYWQobCkgLSAoaSkpCisKKyNlbHNlIC8qIEJJVFNfUEVSX0xPTkcgIT0gNjQgKi8KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworLyogRG9uJ3QgdXNlIHR5cGVkZWY6IGRvbid0IHdhbnQgdGhlbSB0byBiZSBtaXhlZCB3aXRoIGF0b21pY190J3MuICovCit0eXBlZGVmIHN0cnVjdCB7CisJYXRvbWljNjRfdCBhOworfSBsb2NhbDY0X3Q7CisKKyNkZWZpbmUgTE9DQUw2NF9JTklUKGkpCXsgQVRPTUlDX0xPTkdfSU5JVChpKSB9CisKKyNkZWZpbmUgbG9jYWw2NF9yZWFkKGwpCQlhdG9taWM2NF9yZWFkKCYobCktPmEpCisjZGVmaW5lIGxvY2FsNjRfc2V0KGwsaSkJYXRvbWljNjRfc2V0KCgmKGwpLT5hKSwoaSkpCisjZGVmaW5lIGxvY2FsNjRfaW5jKGwpCQlhdG9taWM2NF9pbmMoJihsKS0+YSkKKyNkZWZpbmUgbG9jYWw2NF9kZWMobCkJCWF0b21pYzY0X2RlYygmKGwpLT5hKQorI2RlZmluZSBsb2NhbDY0X2FkZChpLGwpCWF0b21pYzY0X2FkZCgoaSksKCYobCktPmEpKQorI2RlZmluZSBsb2NhbDY0X3N1YihpLGwpCWF0b21pYzY0X3N1YigoaSksKCYobCktPmEpKQorCisjZGVmaW5lIGxvY2FsNjRfc3ViX2FuZF90ZXN0KGksIGwpIGF0b21pYzY0X3N1Yl9hbmRfdGVzdCgoaSksICgmKGwpLT5hKSkKKyNkZWZpbmUgbG9jYWw2NF9kZWNfYW5kX3Rlc3QobCkgYXRvbWljNjRfZGVjX2FuZF90ZXN0KCYobCktPmEpCisjZGVmaW5lIGxvY2FsNjRfaW5jX2FuZF90ZXN0KGwpIGF0b21pYzY0X2luY19hbmRfdGVzdCgmKGwpLT5hKQorI2RlZmluZSBsb2NhbDY0X2FkZF9uZWdhdGl2ZShpLCBsKSBhdG9taWM2NF9hZGRfbmVnYXRpdmUoKGkpLCAoJihsKS0+YSkpCisjZGVmaW5lIGxvY2FsNjRfYWRkX3JldHVybihpLCBsKSBhdG9taWM2NF9hZGRfcmV0dXJuKChpKSwgKCYobCktPmEpKQorI2RlZmluZSBsb2NhbDY0X3N1Yl9yZXR1cm4oaSwgbCkgYXRvbWljNjRfc3ViX3JldHVybigoaSksICgmKGwpLT5hKSkKKyNkZWZpbmUgbG9jYWw2NF9pbmNfcmV0dXJuKGwpCWF0b21pYzY0X2luY19yZXR1cm4oJihsKS0+YSkKKworI2RlZmluZSBsb2NhbDY0X2NtcHhjaGcobCwgbywgbikgYXRvbWljNjRfY21weGNoZygoJihsKS0+YSksIChvKSwgKG4pKQorI2RlZmluZSBsb2NhbDY0X3hjaGcobCwgbikJYXRvbWljNjRfeGNoZygoJihsKS0+YSksIChuKSkKKyNkZWZpbmUgbG9jYWw2NF9hZGRfdW5sZXNzKGwsIF9hLCB1KSBhdG9taWM2NF9hZGRfdW5sZXNzKCgmKGwpLT5hKSwgKF9hKSwgKHUpKQorI2RlZmluZSBsb2NhbDY0X2luY19ub3RfemVybyhsKQlhdG9taWM2NF9pbmNfbm90X3plcm8oJihsKS0+YSkKKworLyogTm9uLWF0b21pYyB2YXJpYW50cywgaWUuIHByZWVtcHRpb24gZGlzYWJsZWQgYW5kIHdvbid0IGJlIHRvdWNoZWQKKyAqIGluIGludGVycnVwdCwgZXRjLiAgU29tZSBhcmNocyBjYW4gb3B0aW1pemUgdGhpcyBjYXNlIHdlbGwuICovCisjZGVmaW5lIF9fbG9jYWw2NF9pbmMobCkJbG9jYWw2NF9zZXQoKGwpLCBsb2NhbDY0X3JlYWQobCkgKyAxKQorI2RlZmluZSBfX2xvY2FsNjRfZGVjKGwpCWxvY2FsNjRfc2V0KChsKSwgbG9jYWw2NF9yZWFkKGwpIC0gMSkKKyNkZWZpbmUgX19sb2NhbDY0X2FkZChpLGwpCWxvY2FsNjRfc2V0KChsKSwgbG9jYWw2NF9yZWFkKGwpICsgKGkpKQorI2RlZmluZSBfX2xvY2FsNjRfc3ViKGksbCkJbG9jYWw2NF9zZXQoKGwpLCBsb2NhbDY0X3JlYWQobCkgLSAoaSkpCisKKyNlbmRpZiAvKiBCSVRTX1BFUl9MT05HICE9IDY0ICovCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfTE9DQUw2NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggMDMwYTk1NC4uOGE5MmExNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtMTU2LDEwICsxNTYsNiBAQAogCUNQVV9LRUVQKGV4aXQuZGF0YSkJCQkJCQlcCiAJTUVNX0tFRVAoaW5pdC5kYXRhKQkJCQkJCVwKIAlNRU1fS0VFUChleGl0LmRhdGEpCQkJCQkJXAotCS4gPSBBTElHTig4KTsJCQkJCQkJXAotCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfX19tYXJrZXJzKSA9IC47CQkJCVwKLQkqKF9fbWFya2VycykJCQkJCQkJXAotCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9fX21hcmtlcnMpID0gLjsJCQkJXAogCS4gPSBBTElHTigzMik7CQkJCQkJCVwKIAlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X19fdHJhY2Vwb2ludHMpID0gLjsJCQlcCiAJKihfX3RyYWNlcG9pbnRzKQkJCQkJCVwKQEAgLTY1Myw2ICs2NDksNyBAQAogCUVYSVRfREFUQQkJCQkJCQlcCiAJRVhJVF9DQUxMCQkJCQkJCVwKIAkqKC5kaXNjYXJkKQkJCQkJCQlcCisJKiguZGlzY2FyZC4qKQkJCQkJCQlcCiAJfQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybS5oIGIvaW5jbHVkZS9kcm0vZHJtLmgKaW5kZXggZTNmNDZlMC4uZTVmNzA2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtLmgKQEAgLTY2Myw2ICs2NjMsOCBAQAogI2RlZmluZSBEUk1fSU9DVExfVU5MT0NLCQlEUk1fSU9XKCAweDJiLCBzdHJ1Y3QgZHJtX2xvY2spCiAjZGVmaW5lIERSTV9JT0NUTF9GSU5JU0gJCURSTV9JT1coIDB4MmMsIHN0cnVjdCBkcm1fbG9jaykKIAorI2RlZmluZSBEUk1fSU9DVExfR0VNX1BSSU1FX09QRU4gICAgICAgIERSTV9JT1dSKDB4MmUsIHN0cnVjdCBkcm1fZ2VtX29wZW4pCisKICNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFCQlEUk1fSU8oICAweDMwKQogI2RlZmluZSBEUk1fSU9DVExfQUdQX1JFTEVBU0UJCURSTV9JTyggIDB4MzEpCiAjZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBzdHJ1Y3QgZHJtX2FncF9tb2RlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtUC5oIGIvaW5jbHVkZS9kcm0vZHJtUC5oCmluZGV4IGMxYjk4NzEuLmUyYTRkYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybVAuaAorKysgYi9pbmNsdWRlL2RybS9kcm1QLmgKQEAgLTksNiArOSw3IEBACiAvKgogICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpAQCAtNDgsOSArNDksOSBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgkvKiBGb3IgKHVuKWxvY2tfa2VybmVsICovCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KQEAgLTE0NCw2ICsxNDUsNyBAQAogI2RlZmluZSBEUklWRVJfSVJRX1ZCTDIgICAgMHg4MDAKICNkZWZpbmUgRFJJVkVSX0dFTSAgICAgICAgIDB4MTAwMAogI2RlZmluZSBEUklWRVJfTU9ERVNFVCAgICAgMHgyMDAwCisjZGVmaW5lIERSSVZFUl9VU0VfUExBVEZPUk1fREVWSUNFICAweDQwMDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqIFxuYW1lIEJlZ2luIHRoZSBEUk0uLi4gKi8KQEAgLTQwMyw2ICs0MDUsOCBAQAogCXN0cnVjdCBkcm1fZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKIAlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdjsKKwlwaWRfdCBwaWQ7IC8qIHBpZCBvZiByZXF1ZXN0ZXIsIG5vIGd1YXJhbnRlZSBpdCdzIHZhbGlkIGJ5IHRoZSB0aW1lCisJCSAgICAgIHdlIGRlbGl2ZXIgdGhlIGV2ZW50LCBmb3IgdHJhY2luZyBvbmx5ICovCiAJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBkcm1fcGVuZGluZ19ldmVudCAqZXZlbnQpOwogfTsKIApAQCAtODIzLDYgKzgyNyw3IEBACiAJaW50IG51bV9pb2N0bHM7CiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOwogCXN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXI7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlOwogCS8qIExpc3Qgb2YgZGV2aWNlcyBoYW5naW5nIG9mZiB0aGlzIGRyaXZlciAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlX2xpc3Q7CiB9OwpAQCAtMTAxNSwxMiArMTAyMCwxNiBAQAogCiAJc3RydWN0IGRybV9hZ3BfaGVhZCAqYWdwOwkvKio8IEFHUCBkYXRhICovCiAKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7ICAgICAgICAgICAgIC8qKjwgRGV2aWNlIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkJLyoqPCBQQ0kgZGV2aWNlIHN0cnVjdHVyZSAqLwogCWludCBwY2lfdmVuZG9yOwkJCS8qKjwgUENJIHZlbmRvciBpZCAqLwogCWludCBwY2lfZGV2aWNlOwkJCS8qKjwgUENJIGRldmljZSBpZCAqLwogI2lmZGVmIF9fYWxwaGFfXwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKICNlbmRpZgorCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1kZXY7IC8qKjwgUGxhdGZvcm0gZGV2aWNlIHN0cnV0dXJlICovCisKIAlzdHJ1Y3QgZHJtX3NnX21lbSAqc2c7CS8qKjwgU2NhdHRlciBnYXRoZXIgbWVtb3J5ICovCiAJaW50IG51bV9jcnRjczsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBDUlRDcyBvbiB0aGlzIGRldmljZSAqLwogCXZvaWQgKmRldl9wcml2YXRlOwkJLyoqPCBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCkBAIC0xMDYwLDE3ICsxMDY5LDIxIEBACiAKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRybV9kZXZfdG9faXJxKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldi0+cGRldi0+aXJxOwotfQotCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgIGludCBmZWF0dXJlKQogewogCXJldHVybiAoKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBmZWF0dXJlKSA/IDEgOiAwKTsKIH0KIAorCitzdGF0aWMgaW5saW5lIGludCBkcm1fZGV2X3RvX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1VTRV9QTEFURk9STV9ERVZJQ0UpKQorCQlyZXR1cm4gcGxhdGZvcm1fZ2V0X2lycShkZXYtPnBsYXRmb3JtZGV2LCAwKTsKKwllbHNlCisJCXJldHVybiBkZXYtPnBkZXYtPmlycTsKK30KKwogI2lmZGVmIF9fYWxwaGFfXwogI2RlZmluZSBkcm1fZ2V0X3BjaV9kb21haW4oZGV2KSBkZXYtPmhvc2UtPmluZGV4CiAjZWxzZQpAQCAtMTEzOCw2ICsxMTUxLDcgQEAKIGV4dGVybiBpbnQgZHJtX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCQkJCS8qIERldmljZSBzdXBwb3J0IChkcm1fZm9wcy5oKSAqLworZXh0ZXJuIHN0cnVjdCBtdXRleCBkcm1fZ2xvYmFsX211dGV4OwogZXh0ZXJuIGludCBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCBkcm1fZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbik7CkBAIC0xMjczLDEwICsxMjg3LDYgQEAKIGV4dGVybiBpbnQgZHJtX21hcGJ1ZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgZHJtX29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gcmVzb3VyY2Vfc2l6ZV90IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IHJlc291cmNlKTsKLWV4dGVybiByZXNvdXJjZV9zaXplX3QgZHJtX2dldF9yZXNvdXJjZV9sZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHVuc2lnbmVkIGludCByZXNvdXJjZSk7CiAKIAkJCQkvKiBETUEgc3VwcG9ydCAoZHJtX2RtYS5oKSAqLwogZXh0ZXJuIGludCBkcm1fZG1hX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTM1MSw4ICsxMzYxLDExIEBACiBzdHJ1Y3QgZHJtX21hc3RlciAqZHJtX21hc3Rlcl9jcmVhdGUoc3RydWN0IGRybV9taW5vciAqbWlub3IpOwogZXh0ZXJuIHN0cnVjdCBkcm1fbWFzdGVyICpkcm1fbWFzdGVyX2dldChzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIGV4dGVybiB2b2lkIGRybV9tYXN0ZXJfcHV0KHN0cnVjdCBkcm1fbWFzdGVyICoqbWFzdGVyKTsKLWV4dGVybiBpbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCi0JCSAgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiBpbnQgZHJtX2dldF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkJCSAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOworZXh0ZXJuIGludCBkcm1fZ2V0X3BsYXRmb3JtX2RldihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwogZXh0ZXJuIHZvaWQgZHJtX3B1dF9kZXYoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGRybV9wdXRfbWlub3Ioc3RydWN0IGRybV9taW5vciAqKm1pbm9yKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZHJtX2RlYnVnOwpAQCAtMTQ0MCw2ICsxNDUzLDggQEAKIHZvaWQgZHJtX2dlbV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBpbnQgZHJtX2dlbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKKyNpbmNsdWRlICJkcm1fZ2xvYmFsLmgiCisKIHN0YXRpYyBpbmxpbmUgdm9pZAogZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQogewpAQCAtMTUyOSw2ICsxNTQ0LDkgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfVVNFX1BMQVRGT1JNX0RFVklDRSkpCisJCXJldHVybiAwOworCiAJaWYgKGRldi0+ZHJpdmVyLT5kZXZpY2VfaXNfYWdwICE9IE5VTEwpIHsKIAkJaW50IGVyciA9ICgqZGV2LT5kcml2ZXItPmRldmljZV9pc19hZ3ApIChkZXYpOwogCkBAIC0xNTQyLDcgKzE1NjAsMTAgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfcGNpZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXJldHVybiBwY2lfZmluZF9jYXBhYmlsaXR5KGRldi0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1VTRV9QTEFURk9STV9ERVZJQ0UpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBwY2lfZmluZF9jYXBhYmlsaXR5KGRldi0+cGRldiwgUENJX0NBUF9JRF9FWFApOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGRybV9jb3JlX2Ryb3BtYXAoc3RydWN0IGRybV9sb2NhbF9tYXAgKm1hcCkKQEAgLTE1NTAsNiArMTU3MSwyMSBAQAogfQogCiAjaW5jbHVkZSAiZHJtX21lbV91dGlsLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZHJtX2dldF9kZXZpY2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9VU0VfUExBVEZPUk1fREVWSUNFKSkKKwkJcmV0dXJuIGRldi0+cGxhdGZvcm1kZXY7CisJZWxzZQorCQlyZXR1cm4gZGV2LT5wZGV2OworfQorCitleHRlcm4gaW50IGRybV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOworZXh0ZXJuIGludCBkcm1fcGNpX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CitleHRlcm4gaW50IGRybV9maWxsX2luX2RldihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKKwkJCSAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOworaW50IGRybV9nZXRfbWlub3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9taW5vciAqKm1pbm9yLCBpbnQgdHlwZSk7CiAvKkB9Ki8KIAogI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKaW5kZXggMTEyMWY3Ny4uNTliNzA3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKQEAgLTYwLDkgKzYwLDE0IEBACiAJLyogTW92ZSB0aGUgY3J0YyBvbiB0aGUgY3VycmVudCBmYiB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gKm9wdGlvbmFsKiAqLwogCWludCAoKm1vZGVfc2V0X2Jhc2UpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAogCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpOworCWludCAoKm1vZGVfc2V0X2Jhc2VfYXRvbWljKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLCBpbnQgeCwgaW50IHkpOwogCiAJLyogcmVsb2FkIHRoZSBjdXJyZW50IGNydGMgTFVUICovCiAJdm9pZCAoKmxvYWRfbHV0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworCisJLyogZGlzYWJsZSBjcnRjIHdoZW4gbm90IGluIHVzZSAtIG1vcmUgZXhwbGljaXQgdGhhbiBkcG1zIG9mZiAqLworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogfTsKIAogc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKaW5kZXggZjBhNmFmYy4uZjIyZTdmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaApAQCAtMzIsNiArMzIsOCBAQAogCiBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcjsKIAorI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KKwogc3RydWN0IGRybV9mYl9oZWxwZXJfY3J0YyB7CiAJdWludDMyX3QgY3J0Y19pZDsKIAlzdHJ1Y3QgZHJtX21vZGVfc2V0IG1vZGVfc2V0OwpAQCAtNzgsNiArODAsNyBAQAogCiBzdHJ1Y3QgZHJtX2ZiX2hlbHBlciB7CiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqc2F2ZWRfZmI7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKIAlpbnQgY3J0Y19jb3VudDsKQEAgLTEyNiw1ICsxMjksNyBAQAogYm9vbCBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcik7CiBib29sIGRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlciwgaW50IGJwcF9zZWwpOwogaW50IGRybV9mYl9oZWxwZXJfc2luZ2xlX2FkZF9hbGxfY29ubmVjdG9ycyhzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyKTsKK2ludCBkcm1fZmJfaGVscGVyX2RlYnVnX2VudGVyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK2ludCBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZ2xvYmFsLmggYi9pbmNsdWRlL2RybS9kcm1fZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2ODA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybV9nbG9iYWwuaApAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ryb20gPHRoZWxsc3Ryb20tYXQtdm13YXJlLWRvdC1jb20+CisgKi8KKworI2lmbmRlZiBfRFJNX0dMT0JBTF9IXworI2RlZmluZSBfRFJNX0dMT0JBTF9IXworZW51bSBkcm1fZ2xvYmFsX3R5cGVzIHsKKwlEUk1fR0xPQkFMX1RUTV9NRU0gPSAwLAorCURSTV9HTE9CQUxfVFRNX0JPLAorCURSTV9HTE9CQUxfVFRNX09CSkVDVCwKKwlEUk1fR0xPQkFMX05VTQorfTsKKworc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlIHsKKwllbnVtIGRybV9nbG9iYWxfdHlwZXMgZ2xvYmFsX3R5cGU7CisJc2l6ZV90IHNpemU7CisJdm9pZCAqb2JqZWN0OworCWludCAoKmluaXQpIChzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKik7CisJdm9pZCAoKnJlbGVhc2UpIChzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKik7Cit9OworCitleHRlcm4gdm9pZCBkcm1fZ2xvYmFsX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBkcm1fZ2xvYmFsX3JlbGVhc2Uodm9pZCk7CitleHRlcm4gaW50IGRybV9nbG9iYWxfaXRlbV9yZWYoc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpOworZXh0ZXJuIHZvaWQgZHJtX2dsb2JhbF9pdGVtX3VucmVmKHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fbW0uaCBiL2luY2x1ZGUvZHJtL2RybV9tbS5oCmluZGV4IDRjMTBiZTMuLmJmMDE1MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9tbS5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9tbS5oCkBAIC00MiwyMSArNDIsMzEgQEAKICNlbmRpZgogCiBzdHJ1Y3QgZHJtX21tX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtbF9lbnRyeTsKLQlpbnQgZnJlZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfc3RhY2s7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlX2xpc3Q7CisJdW5zaWduZWQgZnJlZSA6IDE7CisJdW5zaWduZWQgc2Nhbm5lZF9ibG9jayA6IDE7CisJdW5zaWduZWQgc2Nhbm5lZF9wcmV2X2ZyZWUgOiAxOworCXVuc2lnbmVkIHNjYW5uZWRfbmV4dF9mcmVlIDogMTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAlzdHJ1Y3QgZHJtX21tICptbTsKLQl2b2lkICpwcml2YXRlOwogfTsKIAogc3RydWN0IGRybV9tbSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmbF9lbnRyeTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG1sX2VudHJ5OworCS8qIExpc3Qgb2YgZnJlZSBtZW1vcnkgYmxvY2tzLCBtb3N0IHJlY2VudGx5IGZyZWVkIG9yZGVyZWQuICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3N0YWNrOworCS8qIExpc3Qgb2YgYWxsIG1lbW9yeSBub2Rlcywgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIChpbmNyZWFzaW5nKSBzdGFydAorCSAqIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBub2RlLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZV9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgdW51c2VkX25vZGVzOwogCWludCBudW1fdW51c2VkOwogCXNwaW5sb2NrX3QgdW51c2VkX2xvY2s7CisJdW5zaWduZWQgc2Nhbl9hbGlnbm1lbnQ7CisJdW5zaWduZWQgbG9uZyBzY2FuX3NpemU7CisJdW5zaWduZWQgbG9uZyBzY2FuX2hpdF9zdGFydDsKKwl1bnNpZ25lZCBzY2FuX2hpdF9zaXplOworCXVuc2lnbmVkIHNjYW5uZWRfYmxvY2tzOwogfTsKIAogLyoKQEAgLTEzMyw2ICsxNDMsMTEgQEAKIAlyZXR1cm4gYmxvY2stPm1tOwogfQogCit2b2lkIGRybV9tbV9pbml0X3NjYW4oc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJICAgICAgdW5zaWduZWQgYWxpZ25tZW50KTsKK2ludCBkcm1fbW1fc2Nhbl9hZGRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICpub2RlKTsKK2ludCBkcm1fbW1fc2Nhbl9yZW1vdmVfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICpub2RlKTsKKwogZXh0ZXJuIHZvaWQgZHJtX21tX2RlYnVnX3RhYmxlKHN0cnVjdCBkcm1fbW0gKm1tLCBjb25zdCBjaGFyICpwcmVmaXgpOwogI2lmZGVmIENPTkZJR19ERUJVR19GUwogaW50IGRybV9tbV9kdW1wX3RhYmxlKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGRybV9tbSAqbW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaCBiL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKaW5kZXggYzViYTE2My4uMGZjNzM5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCkBAIC03NCw2ICs3NCw3IEBACiAvKiBEaXRoZXJpbmcgbW9kZSBvcHRpb25zICovCiAjZGVmaW5lIERSTV9NT0RFX0RJVEhFUklOR19PRkYJMAogI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT04JMQorI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfQVVUTyAyCiAKIC8qIERpcnR5IGluZm8gb3B0aW9ucyAqLwogI2RlZmluZSBEUk1fTU9ERV9ESVJUWV9PRkYgICAgICAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmggYi9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggMmQ0MjhiMC4uM2E5OTQwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaApAQCAtMTQ2LDYgKzE0Niw4IEBACiAJezB4MTAwMiwgMHg2ODg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODg5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODhBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2ODhDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2ODhELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODk4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODk5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODljLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0hFTUxPQ0t8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC0xNjEsNiArMTYzLDcgQEAKIAl7MHgxMDAyLCAweDY4YmUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfSlVOSVBFUnxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4YzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUkVEV09PRHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2OGMxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JFRFdPT0R8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjhjNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SRURXT09EfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4YzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUkVEV09PRHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4YzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUkVEV09PRHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ZDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUkVEV09PRHxSQURFT05fTkVXX01FTU1BUH0sIFwKQEAgLTE3NCw2ICsxNzcsNyBAQAogCXsweDEwMDIsIDB4NjhlOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DRURBUnxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ZTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0VEQVJ8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2OGYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NFREFSfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjhmMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DRURBUnxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ZjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0VEQVJ8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2OGY5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NFREFSfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4NjhmZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DRURBUnxSQURFT05fTkVXX01FTU1BUH0sIFwKQEAgLTMxNCw2ICszMTgsNyBAQAogCXsweDEwMDIsIDB4OTQ1NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjc3MHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk0NUEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY3NzB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4OTQ1QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjc3MHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg5NDVFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNzcwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk0NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY3NzB8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg5NDYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNzcwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4OTQ2QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjc3MHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC0zMjQsNiArMzI5LDcgQEAKIAl7MHgxMDAyLCAweDk0ODcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY3MzB8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg5NDg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNzMwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk0ODksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY3MzB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4OTQ4QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjczMHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg5NDhGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNzMwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4OTQ5MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjczMHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk0OTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY3MzB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXApAQCAtMzY2LDYgKzM3Miw3IEBACiAJezB4MTAwMiwgMHg5NTUzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNzEwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk1NTUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY3MTB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4OTU1NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjcxMHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg5NTVmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNzEwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk1ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY2MzB8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg5NTgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNjMwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDk1ODMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY2MzB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vaTJjL3NpbDE2NC5oIGIvaW5jbHVkZS9kcm0vaTJjL3NpbDE2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWUyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9pMmMvc2lsMTY0LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBGcmFuY2lzY28gSmVyZXouCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fRFJNX0kyQ19TSUwxNjRfSF9fCisjZGVmaW5lIF9fRFJNX0kyQ19TSUwxNjRfSF9fCisKKy8qKgorICogc3RydWN0IHNpbDE2NF9lbmNvZGVyX3BhcmFtcworICoKKyAqIERlc2NyaWJlcyBob3cgdGhlIHNpbDE2NCBpcyBjb25uZWN0ZWQgdG8gdGhlIEdQVS4gSXQgc2hvdWxkIGJlIHVzZWQKKyAqIGFzIHRoZSBAcGFyYW1zIHBhcmFtZXRlciBvZiBpdHMgQHNldF9jb25maWcgbWV0aG9kLgorICoKKyAqIFNlZSAiaHR0cDovL3d3dy5zaWxpY29uaW1hZ2UuY29tL2RvY3MvU2lJLURTLTAwMjEtRS0xNjQucGRmIi4KKyAqLworc3RydWN0IHNpbDE2NF9lbmNvZGVyX3BhcmFtcyB7CisJZW51bSB7CisJCVNJTDE2NF9JTlBVVF9FREdFX0ZBTExJTkcgPSAwLAorCQlTSUwxNjRfSU5QVVRfRURHRV9SSVNJTkcKKwl9IGlucHV0X2VkZ2U7CisKKwllbnVtIHsKKwkJU0lMMTY0X0lOUFVUX1dJRFRIXzEyQklUID0gMCwKKwkJU0lMMTY0X0lOUFVUX1dJRFRIXzI0QklUCisJfSBpbnB1dF93aWR0aDsKKworCWVudW0geworCQlTSUwxNjRfSU5QVVRfU0lOR0xFX0VER0UgPSAwLAorCQlTSUwxNjRfSU5QVVRfRFVBTF9FREdFCisJfSBpbnB1dF9kdWFsOworCisJZW51bSB7CisJCVNJTDE2NF9QTExfRklMVEVSX09OID0gMCwKKwkJU0lMMTY0X1BMTF9GSUxURVJfT0ZGLAorCX0gcGxsX2ZpbHRlcjsKKworCWludCBpbnB1dF9za2V3OyAvKiogPCBBbGxvd2VkIHJhbmdlIFstNCwgM10sIHVzZSAwIGZvciBubyBkZS1za2V3LiAqLworCWludCBkdWFsbGlua19za2V3OyAvKiogPCBBbGxvd2VkIHJhbmdlIFstNCwgM10uICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmggYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCmluZGV4IDdmMDAyOGUuLjhmOGIwNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaApAQCAtMzMsNiArMzMsMTUgQEAKICAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHMuCiAgKi8KIAorI2lmZGVmIF9fS0VSTkVMX18KKy8qIEZvciB1c2UgYnkgSVBTIGRyaXZlciAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaTkxNV9yZWFkX21jaF92YWwodm9pZCk7CitleHRlcm4gYm9vbCBpOTE1X2dwdV9yYWlzZSh2b2lkKTsKK2V4dGVybiBib29sIGk5MTVfZ3B1X2xvd2VyKHZvaWQpOworZXh0ZXJuIGJvb2wgaTkxNV9ncHVfYnVzeSh2b2lkKTsKK2V4dGVybiBib29sIGk5MTVfZ3B1X3R1cmJvX2Rpc2FibGUodm9pZCk7CisjZW5kaWYKKwogLyogRWFjaCByZWdpb24gaXMgYSBtaW5pbXVtIG9mIDE2aywgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDI1NSBvZiB0aGVtLgogICovCiAjZGVmaW5lIEk5MTVfTlJfVEVYX1JFR0lPTlMgMjU1CS8qIHRhYmxlIHNpemUgMmsgLSBtYXhpbXVtIGR1ZSB0byB1c2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaCBiL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaAppbmRleCA1MzQ3MDYzLi4wYWNhZjhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oCkBAIC05MDQsNiArOTA0LDggQEAKICNkZWZpbmUgUkFERU9OX0lORk9fQUNDRUxfV09SS0lORwkweDAzCiAjZGVmaW5lIFJBREVPTl9JTkZPX0NSVENfRlJPTV9JRAkweDA0CiAjZGVmaW5lIFJBREVPTl9JTkZPX0FDQ0VMX1dPUktJTkcyCTB4MDUKKyNkZWZpbmUgUkFERU9OX0lORk9fVElMSU5HX0NPTkZJRwkweDA2CisjZGVmaW5lIFJBREVPTl9JTkZPX1dBTlRfSFlQRVJaCQkweDA3CiAKIHN0cnVjdCBkcm1fcmFkZW9uX2luZm8gewogCXVpbnQzMl90CQlyZXF1ZXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKaW5kZXggMGVhNjAyZC4uYjg3NTA0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAidHRtL3R0bV9tZW1vcnkuaCIKICNpbmNsdWRlICJ0dG0vdHRtX21vZHVsZS5oIgogI2luY2x1ZGUgImRybV9tbS5oIgorI2luY2x1ZGUgImRybV9nbG9iYWwuaCIKICNpbmNsdWRlICJsaW51eC93b3JrcXVldWUuaCIKICNpbmNsdWRlICJsaW51eC9mcy5oIgogI2luY2x1ZGUgImxpbnV4L3NwaW5sb2NrLmgiCkBAIC0zNjIsNyArMzYzLDcgQEAKICAqLwogCiBzdHJ1Y3QgdHRtX2JvX2dsb2JhbF9yZWYgewotCXN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSByZWY7CisJc3RydWN0IGRybV9nbG9iYWxfcmVmZXJlbmNlIHJlZjsKIAlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iOwogfTsKIApAQCAtNjg3LDggKzY4OCw4IEBACiBleHRlcm4gdm9pZCB0dG1fbWVtX2lvX2ZyZWUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCiAJCQkJc3RydWN0IHR0bV9tZW1fcmVnICptZW0pOwogCi1leHRlcm4gdm9pZCB0dG1fYm9fZ2xvYmFsX3JlbGVhc2Uoc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpOwotZXh0ZXJuIGludCB0dG1fYm9fZ2xvYmFsX2luaXQoc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpOworZXh0ZXJuIHZvaWQgdHRtX2JvX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKTsKK2V4dGVybiBpbnQgdHRtX2JvX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKTsKIAogZXh0ZXJuIGludCB0dG1fYm9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX21vZHVsZS5oIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9tb2R1bGUuaAppbmRleCBjZjQxNmFlLi40NWZhMzE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS90dG0vdHRtX21vZHVsZS5oCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fbW9kdWxlLmgKQEAgLTM1LDI2ICszNSw2IEBACiBzdHJ1Y3Qga29iamVjdDsKIAogI2RlZmluZSBUVE1fUEZYICJbVFRNXSAiCi0KLWVudW0gdHRtX2dsb2JhbF90eXBlcyB7Ci0JVFRNX0dMT0JBTF9UVE1fTUVNID0gMCwKLQlUVE1fR0xPQkFMX1RUTV9CTywKLQlUVE1fR0xPQkFMX1RUTV9PQkpFQ1QsCi0JVFRNX0dMT0JBTF9OVU0KLX07Ci0KLXN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSB7Ci0JZW51bSB0dG1fZ2xvYmFsX3R5cGVzIGdsb2JhbF90eXBlOwotCXNpemVfdCBzaXplOwotCXZvaWQgKm9iamVjdDsKLQlpbnQgKCppbml0KSAoc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICopOwotCXZvaWQgKCpyZWxlYXNlKSAoc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICopOwotfTsKLQotZXh0ZXJuIHZvaWQgdHRtX2dsb2JhbF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgdHRtX2dsb2JhbF9yZWxlYXNlKHZvaWQpOwotZXh0ZXJuIGludCB0dG1fZ2xvYmFsX2l0ZW1fcmVmKHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKTsKLWV4dGVybiB2b2lkIHR0bV9nbG9iYWxfaXRlbV91bnJlZihzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZik7CiBleHRlcm4gc3RydWN0IGtvYmplY3QgKnR0bV9nZXRfa29iaih2b2lkKTsKIAogI2VuZGlmIC8qIF9UVE1fTU9EVUxFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvS2J1aWxkCmluZGV4IDJmYzhlMTQuLjlhYTliY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvS2J1aWxkCkBAIC0yNzYsNiArMjc2LDcgQEAKIAkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtX3BhcmEuaCksKQogdW5pZmRlZi15ICs9IGt2bV9wYXJhLmgKIGVuZGlmCit1bmlmZGVmLXkgKz0gbDJ0cC5oCiB1bmlmZGVmLXkgKz0gbGxjLmgKIHVuaWZkZWYteSArPSBsb29wLmgKIHVuaWZkZWYteSArPSBscC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FoY2lfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvYWhjaV9wbGF0Zm9ybS5oCmluZGV4IGY3ZGQ1NzYuLmJlM2Q5YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWhjaV9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWhjaV9wbGF0Zm9ybS5oCkBAIC0xNSwxMSArMTUsMTMgQEAKICNpZm5kZWYgX0FIQ0lfUExBVEZPUk1fSAogI2RlZmluZSBfQUhDSV9QTEFURk9STV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiBzdHJ1Y3QgZGV2aWNlOwogc3RydWN0IGF0YV9wb3J0X2luZm87CiAKIHN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgewotCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqaW5pdCkoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpOwogCXZvaWQgKCpleGl0KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICphdGFfcG9ydF9pbmZvOwogCXVuc2lnbmVkIGludCBmb3JjZV9wb3J0X21hcDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaAppbmRleCA4YjEwMzg2Li5iMGMxNzQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvYnVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL2J1cy5oCkBAIC0xNCwxNCArMTQsMTkgQEAKICNpZm5kZWYgQVNNQVJNX0FNQkFfSAogI2RlZmluZSBBU01BUk1fQU1CQV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogCiAjZGVmaW5lIEFNQkFfTlJfSVJRUwkyCiAKK3N0cnVjdCBjbGs7CisKIHN0cnVjdCBhbWJhX2RldmljZSB7CiAJc3RydWN0IGRldmljZQkJZGV2OwogCXN0cnVjdCByZXNvdXJjZQkJcmVzOworCXN0cnVjdCBjbGsJCSpwY2xrOwogCXU2NAkJCWRtYV9tYXNrOwogCXVuc2lnbmVkIGludAkJcGVyaXBoaWQ7CiAJdW5zaWduZWQgaW50CQlpcnFbQU1CQV9OUl9JUlFTXTsKQEAgLTU5LDYgKzY0LDEyIEBACiBpbnQgYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoc3RydWN0IGFtYmFfZGV2aWNlICosIGNvbnN0IGNoYXIgKik7CiB2b2lkIGFtYmFfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCBhbWJhX2RldmljZSAqKTsKIAorI2RlZmluZSBhbWJhX3BjbGtfZW5hYmxlKGQpCVwKKwkoSVNfRVJSKChkKS0+cGNsaykgPyAwIDogY2xrX2VuYWJsZSgoZCktPnBjbGspKQorCisjZGVmaW5lIGFtYmFfcGNsa19kaXNhYmxlKGQpCVwKKwlkbyB7IGlmICghSVNfRVJSKChkKS0+cGNsaykpIGNsa19kaXNhYmxlKChkKS0+cGNsayk7IH0gd2hpbGUgKDApCisKICNkZWZpbmUgYW1iYV9jb25maWcoZCkJKCgoZCktPnBlcmlwaGlkID4+IDI0KSAmIDB4ZmYpCiAjZGVmaW5lIGFtYmFfcmV2KGQpCSgoKGQpLT5wZXJpcGhpZCA+PiAyMCkgJiAweDBmKQogI2RlZmluZSBhbWJhX21hbmYoZCkJKCgoZCktPnBlcmlwaGlkID4+IDEyKSAmIDB4ZmYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvbW1jaS5oIGIvaW5jbHVkZS9saW51eC9hbWJhL21tY2kuaAppbmRleCA3ZTQ2NmZlLi5jYTg0Y2U3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvbW1jaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9tbWNpLmgKQEAgLTE1LDkgKzE1LDEwIEBACiAgKiBAb2NyX21hc2s6IGF2YWlsYWJsZSB2b2x0YWdlcyBvbiB0aGUgNCBwaW5zIGZyb20gdGhlIGJsb2NrLCB0aGlzCiAgKiBpcyBpZ25vcmVkIGlmIGEgcmVndWxhdG9yIGlzIHVzZWQsIHNlZSB0aGUgTU1DX1ZERF8qIG1hc2tzIGluCiAgKiBtbWMvaG9zdC5oCi0gKiBAdHJhbnNsYXRlX3ZkZDogYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0cmFuc2xhdGUgYSBNTUNfVkREXyoKLSAqIG1hc2sgaW50byBhIHZhbHVlIHRvIGJlIGJpbmFyeSBvcjplZCBhbmQgd3JpdHRlbiBpbnRvIHRoZQotICogTU1DSVBXUiByZWdpc3RlciBvZiB0aGUgYmxvY2sKKyAqIEB2ZGRfaGFuZGxlcjogYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0cmFuc2xhdGUgYSBNTUNfVkREXyoKKyAqIG1hc2sgaW50byBhIHZhbHVlIHRvIGJlIGJpbmFyeSAob3Igc2V0IHNvbWUgb3RoZXIgY3VzdG9tIGJpdHMKKyAqIGluIE1NQ0lQV1IpIG9yOmVkIGFuZCB3cml0dGVuIGludG8gdGhlIE1NQ0lQV1IgcmVnaXN0ZXIgb2YgdGhlCisgKiBibG9jay4gIE1heSBhbHNvIGNvbnRyb2wgZXh0ZXJuYWwgcG93ZXIgYmFzZWQgb24gdGhlIHBvd2VyX21vZGUuCiAgKiBAc3RhdHVzOiBpZiBubyBHUElPIHJlYWQgZnVuY3Rpb24gd2FzIGdpdmVuIHRvIHRoZSBibG9jayBpbgogICogZ3Bpb193cCAoYmVsb3cpIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCiAgKiB3aGV0aGVyIGEgY2FyZCBpcyBwcmVzZW50IGluIHRoZSBNTUMgc2xvdCBvciBub3QKQEAgLTI5LDcgKzMwLDggQEAKIHN0cnVjdCBtbWNpX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGludCBmX21heDsKIAl1bnNpZ25lZCBpbnQgb2NyX21hc2s7Ci0JdTMyICgqdHJhbnNsYXRlX3ZkZCkoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBpbnQpOworCXUzMiAoKnZkZF9oYW5kbGVyKShzdHJ1Y3QgZGV2aWNlICosIHVuc2lnbmVkIGludCB2ZGQsCisJCQkgICB1bnNpZ25lZCBjaGFyIHBvd2VyX21vZGUpOwogCXVuc2lnbmVkIGludCAoKnN0YXR1cykoc3RydWN0IGRldmljZSAqKTsKIAlpbnQJZ3Bpb193cDsKIAlpbnQJZ3Bpb19jZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaAppbmRleCA1YTVhN2ZkLi5lMWI2MzRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oCkBAIC0zOCwxMCArMzgsMTIgQEAKICNkZWZpbmUgVUFSVDAxeF9GUgkJMHgxOAkvKiBGbGFnIHJlZ2lzdGVyIChSZWFkIG9ubHkpLiAqLwogI2RlZmluZSBVQVJUMDEwX0lJUgkJMHgxQwkvKiBJbnRlcnJ1cHQgaW5kZW50aWZpY2F0aW9uIHJlZ2lzdGVyIChSZWFkKS4gKi8KICNkZWZpbmUgVUFSVDAxMF9JQ1IJCTB4MUMJLyogSW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyIChXcml0ZSkuICovCisjZGVmaW5lIFNUX1VBUlQwMTFfTENSSF9SWAkweDFDICAgIC8qIFJ4IGxpbmUgY29udHJvbCByZWdpc3Rlci4gKi8KICNkZWZpbmUgVUFSVDAxeF9JTFBSCQkweDIwCS8qIElyREEgbG93IHBvd2VyIGNvdW50ZXIgcmVnaXN0ZXIuICovCiAjZGVmaW5lIFVBUlQwMTFfSUJSRAkJMHgyNAkvKiBJbnRlZ2VyIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBVQVJUMDExX0ZCUkQJCTB4MjgJLyogRnJhY3Rpb25hbCBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3Rlci4gKi8KICNkZWZpbmUgVUFSVDAxMV9MQ1JICQkweDJjCS8qIExpbmUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgU1RfVUFSVDAxMV9MQ1JIX1RYCTB4MmMgICAgLyogVHggTGluZSBjb250cm9sIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBVQVJUMDExX0NSCQkweDMwCS8qIENvbnRyb2wgcmVnaXN0ZXIuICovCiAjZGVmaW5lIFVBUlQwMTFfSUZMUwkJMHgzNAkvKiBJbnRlcnJ1cHQgZmlmbyBsZXZlbCBzZWxlY3QuICovCiAjZGVmaW5lIFVBUlQwMTFfSU1TQwkJMHgzOAkvKiBJbnRlcnJ1cHQgbWFzay4gKi8KQEAgLTg0LDYgKzg2LDcgQEAKICNkZWZpbmUgVUFSVDAxMF9DUl9USUUgCQkweDAwMjAKICNkZWZpbmUgVUFSVDAxMF9DUl9SSUUgCQkweDAwMTAKICNkZWZpbmUgVUFSVDAxMF9DUl9NU0lFCQkweDAwMDgKKyNkZWZpbmUgU1RfVUFSVDAxMV9DUl9PVlNGQUNUCTB4MDAwOAkvKiBPdmVyc2FtcGxpbmcgZmFjdG9yICovCiAjZGVmaW5lIFVBUlQwMXhfQ1JfSUlSTFAJMHgwMDA0CS8qIFNJUiBsb3cgcG93ZXIgbW9kZSAqLwogI2RlZmluZSBVQVJUMDF4X0NSX1NJUkVOCTB4MDAwMgkvKiBTSVIgZW5hYmxlICovCiAjZGVmaW5lIFVBUlQwMXhfQ1JfVUFSVEVOCTB4MDAwMQkvKiBVQVJUIGVuYWJsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1kZXYuaCBiL2luY2x1ZGUvbGludXgvYXRtZGV2LmgKaW5kZXggODE3YjIzNy4uZjY0ODFkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdG1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0bWRldi5oCkBAIC00MzEsNiArNDMxLDE0IEBACiAgICAgaW50IG51bWJlcix1bnNpZ25lZCBsb25nICpmbGFncyk7IC8qIG51bWJlciA9PSAtMTogcGljayBmaXJzdCBhdmFpbGFibGUgKi8KIHN0cnVjdCBhdG1fZGV2ICphdG1fZGV2X2xvb2t1cChpbnQgbnVtYmVyKTsKIHZvaWQgYXRtX2Rldl9kZXJlZ2lzdGVyKHN0cnVjdCBhdG1fZGV2ICpkZXYpOworCisvKiBhdG1fZGV2X3NpZ25hbF9jaGFuZ2UKKyAqCisgKiBQcm9wYWdhdGUgbG93ZXIgbGF5ZXIgc2lnbmFsIGNoYW5nZSBpbiBhdG1fZGV2LT5zaWduYWwgdG8gbmV0ZGV2aWNlLgorICogVGhlIGV2ZW50IHdpbGwgYmUgc2VudCB2aWEgYSBub3RpZmllciBjYWxsIGNoYWluLgorICovCit2b2lkIGF0bV9kZXZfc2lnbmFsX2NoYW5nZShzdHJ1Y3QgYXRtX2RldiAqZGV2LCBjaGFyIHNpZ25hbCk7CisKIHZvaWQgdmNjX2luc2VydF9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKTsKIAogCkBAIC01MTAsNiArNTE4LDE1IEBACiAgKi8KIHZvaWQgZGVyZWdpc3Rlcl9hdG1faW9jdGwoc3RydWN0IGF0bV9pb2N0bCAqKTsKIAorCisvKiByZWdpc3Rlcl9hdG1kZXZpY2Vfbm90aWZpZXIgLSByZWdpc3RlciBhdG1fZGV2IG5vdGlmeSBldmVudHMKKyAqCisgKiBDbGllbnRzIGxpa2UgYnIyNjg0IHdpbGwgcmVnaXN0ZXIgbm90aWZ5IGV2ZW50cworICogQ3VycmVudGx5IHdlIG5vdGlmeSBvZiBzaWduYWwgZm91bmQvbG9zdAorICovCitpbnQgcmVnaXN0ZXJfYXRtZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwordm9pZCB1bnJlZ2lzdGVyX2F0bWRldmljZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JyY21waHkuaCBiL2luY2x1ZGUvbGludXgvYnJjbXBoeS5oCmluZGV4IDdmNDM3Y2EuLmI4NDBhNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnJjbXBoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvYnJjbXBoeS5oCkBAIC0xLDYgKzEsMTMgQEAKICNkZWZpbmUgUEhZX0lEX0JDTTUwNjEwCQkJMHgwMTQzYmQ2MAogI2RlZmluZSBQSFlfSURfQkNNNTA2MTBNCQkweDAxNDNiZDcwCisjZGVmaW5lIFBIWV9JRF9CQ001MjQxCQkJMHgwMTQzYmMzMAogI2RlZmluZSBQSFlfSURfQkNNQUMxMzEJCQkweDAxNDNiYzcwCisjZGVmaW5lIFBIWV9JRF9CQ001NDgxCQkJMHgwMTQzYmNhMAorI2RlZmluZSBQSFlfSURfQkNNNTQ4MgkJCTB4MDE0M2JjYjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MTEJCQkweDAwMjA2MDcwCisjZGVmaW5lIFBIWV9JRF9CQ001NDIxCQkJMHgwMDIwNjBlMAorI2RlZmluZSBQSFlfSURfQkNNNTQ2NAkJCTB4MDAyMDYwYjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0NjEJCQkweDAwMjA2MGMwCiAjZGVmaW5lIFBIWV9JRF9CQ001Nzc4MAkJCTB4MDM2MjVkOTAKIAogI2RlZmluZSBQSFlfQkNNX09VSV9NQVNLCQkweGZmZmZmYzAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhaWYvY2FpZl9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvY2FpZi9jYWlmX3NvY2tldC5oCmluZGV4IDJhNjFlYjEuLmQ5Y2IxOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FpZi9jYWlmX3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FpZi9jYWlmX3NvY2tldC5oCkBAIC02Miw2ICs2Miw3IEBACiAgKiBAQ0FJRlBST1RPX0RBVEFHUkFNX0xPT1A6CURhdGFncmFtIGxvb3BiYWNrIGNoYW5uZWwsIHVzZWQgZm9yIHRlc3RpbmcuCiAgKiBAQ0FJRlBST1RPX1VUSUw6CQlVdGlsaXR5IChQc29jaykgY2hhbm5lbC4KICAqIEBDQUlGUFJPVE9fUkZNOgkJUmVtb3RlIEZpbGUgTWFuYWdlcgorICogQENBSUZQUk9UT19ERUJVRzoJCURlYnVnIGxpbmsKICAqCiAgKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQ0FJRiBDaGFubmVsIHR5cGUgdG8gYmUgdXNlZC4gVGhpcyBkZWZpbmVzCiAgKiB0aGUgc2VydmljZSB0byBjb25uZWN0IHRvIG9uIHRoZSBtb2RlbS4KQEAgLTcyLDYgKzczLDcgQEAKIAlDQUlGUFJPVE9fREFUQUdSQU1fTE9PUCwKIAlDQUlGUFJPVE9fVVRJTCwKIAlDQUlGUFJPVE9fUkZNLAorCUNBSUZQUk9UT19ERUJVRywKIAlfQ0FJRlBST1RPX01BWAogfTsKICNkZWZpbmUJQ0FJRlBST1RPX01BWCBfQ0FJRlBST1RPX01BWApAQCAtODMsNiArODUsMjggQEAKIGVudW0gY2FpZl9hdF90eXBlIHsKIAlDQUlGX0FUVFlQRV9QTEFJTiA9IDIKIH07CisgLyoqCisgKiBlbnVtIGNhaWZfZGVidWdfdHlwZSAtIENvbnRlbnQgc2VsZWN0aW9uIGZvciBkZWJ1ZyBjb25uZWN0aW9uCisgKiBAQ0FJRl9ERUJVR19UUkFDRV9JTlRFUkFDVElWRTogQ29ubmVjdGlvbiB3aWxsIGNvbnRhaW4KKyAqCQkJCWJvdGggdHJhY2UgYW5kIGludGVyYWN0aXZlIGRlYnVnLgorICogQENBSUZfREVCVUdfVFJBQ0U6CQlDb25uZWN0aW9uIGNvbnRhaW5zIHRyYWNlIG9ubHkuCisgKiBAQ0FJRl9ERUJVR19JTlRFUkFDVElWRToJQ29ubmVjdGlvbiB0byBpbnRlcmFjdGl2ZSBkZWJ1Zy4KKyAqLworZW51bSBjYWlmX2RlYnVnX3R5cGUgeworCUNBSUZfREVCVUdfVFJBQ0VfSU5URVJBQ1RJVkUgPSAwLAorCUNBSUZfREVCVUdfVFJBQ0UsCisJQ0FJRl9ERUJVR19JTlRFUkFDVElWRSwKK307CisKKy8qKgorICogZW51bSBjYWlmX2RlYnVnX3NlcnZpY2UgLSBEZWJ1ZyBTZXJ2aWNlIEVuZHBvaW50CisgKiBAQ0FJRl9SQURJT19ERUJVR19TRVJWSUNFOglEZWJ1ZyBzZXJ2aWNlIG9uIHRoZSBSYWRpbyBzdWItc3lzdGVtCisgKiBAQ0FJRl9BUFBfREVCVUdfU0VSVklDRToJRGVidWcgZm9yIHRoZSBhcHBsaWNhdGlvbnMgc3ViLXN5c3RlbQorICovCitlbnVtIGNhaWZfZGVidWdfc2VydmljZSB7CisJQ0FJRl9SQURJT19ERUJVR19TRVJWSUNFID0gMSwKKwlDQUlGX0FQUF9ERUJVR19TRVJWSUNFCit9OwogCiAvKioKICAqIHN0cnVjdCBzb2NrYWRkcl9jYWlmIC0gdGhlIHNvY2thZGRyIHN0cnVjdHVyZSBmb3IgQ0FJRiBzb2NrZXRzLgpAQCAtMTA5LDYgKzEzMywxMiBAQAogICoKICAqIEB1LnJmbS52b2x1bWU6ICAgICAgICAgICAgVm9sdW1lIHRvIG1vdW50LgogICoKKyAqIEB1LmRiZzoJCSAgICAgIEFwcGxpZXMgd2hlbiBmYW1pbHkgPSBDQUlGUFJPVE9fREVCVUcuCisgKgorICogQHUuZGJnLnR5cGU6CQkJICAgICBUeXBlIG9mIGRlYnVnIGNvbm5lY3Rpb24gdG8gc2V0IHVwCisgKgkJCSAgICAgIChjYWlmX2RlYnVnX3R5cGUpLgorICoKKyAqIEB1LmRiZy5zZXJ2aWNlOgkgICAgICBTZXJ2aWNlIHN1Yi1zeXN0ZW0gdG8gY29ubmVjdCAoY2FpZl9kZWJ1Z19zZXJ2aWNlCiAgKiBEZXNjcmlwdGlvbjoKICAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBjb25uZWN0IHBhcmFtZXRlcnMgdXNlZCBmb3Igc2V0dGluZyB1cCBhCiAgKiBDQUlGIENoYW5uZWwuIEl0IGRlZmluZXMgdGhlIHNlcnZpY2UgdG8gY29ubmVjdCB0byBvbiB0aGUgbW9kZW0uCkBAIC0xMzAsNiArMTYwLDEwIEBACiAJCQlfX3UzMiBjb25uZWN0aW9uX2lkOwogCQkJY2hhcgkgIHZvbHVtZVsxNl07CiAJCX0gcmZtOwkJCQkvKiBDQUlGUFJPVE9fUkZNICovCisJCXN0cnVjdCB7CisJCQlfX3U4ICB0eXBlOwkJLyogdHlwZTplbnVtIGNhaWZfZGVidWdfdHlwZSAqLworCQkJX191OCAgc2VydmljZTsJCS8qIHNlcnZpY2U6Y2FpZl9kZWJ1Z19zZXJ2aWNlICovCisJCX0gZGJnOwkJCQkvKiBDQUlGUFJPVE9fREVCVUcgKi8KIAl9IHU7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9mbGV4Y2FuLmggYi9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9mbGV4Y2FuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiNzEzYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL2ZsZXhjYW4uaApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmMgS2xlaW5lLUJ1ZGRlIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICoKKyAqLworCisjaWZuZGVmIF9fQ0FOX1BMQVRGT1JNX0ZMRVhDQU5fSAorI2RlZmluZSBfX0NBTl9QTEFURk9STV9GTEVYQ0FOX0gKKworLyoqCisgKiBzdHJ1Y3QgZmxleGNhbl9wbGF0Zm9ybV9kYXRhIC0gZmxleCBDQU4gY29udHJvbGxlciBwbGF0Zm9ybSBkYXRhCisgKiBAdHJhbnNjZWl2ZXJfZW5hYmxlOiAgICAgICAgIC0gY2FsbGVkIHRvIHBvd2VyIG9uL29mZiB0aGUgdHJhbnNjZWl2ZXIKKyAqCisgKi8KK3N0cnVjdCBmbGV4Y2FuX3BsYXRmb3JtX2RhdGEgeworCXZvaWQgKCp0cmFuc2NlaXZlcl9zd2l0Y2gpKGludCBlbmFibGUpOworfTsKKworI2VuZGlmIC8qIF9fQ0FOX1BMQVRGT1JNX0ZMRVhDQU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCAzOWU1ZmY1Li45MDAxMmI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtNDksOSArNDksNiBAQAogfSBfX3VzZXIgKmNhcF91c2VyX2RhdGFfdDsKIAogCi0jZGVmaW5lIFhBVFRSX0NBUFNfU1VGRklYICJjYXBhYmlsaXR5IgotI2RlZmluZSBYQVRUUl9OQU1FX0NBUFMgWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX0NBUFNfU1VGRklYCi0KICNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTl9NQVNLCTB4RkYwMDAwMDAKICNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTl9TSElGVAkyNAogI2RlZmluZSBWRlNfQ0FQX0ZMQUdTX01BU0sJflZGU19DQVBfUkVWSVNJT05fTUFTSwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggZTNkMDBmZC4uZWQzZTkyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC01NzgsNiArNTc4LDcgQEAKIHZvaWQgY2dyb3VwX2l0ZXJfZW5kKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZ3JvdXBfaXRlciAqaXQpOwogaW50IGNncm91cF9zY2FuX3Rhc2tzKHN0cnVjdCBjZ3JvdXBfc2Nhbm5lciAqc2Nhbik7CiBpbnQgY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKiwgc3RydWN0IHRhc2tfc3RydWN0ICopOworaW50IGNncm91cF9hdHRhY2hfdGFza19jdXJyZW50X2NnKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIAogLyoKICAqIENTUyBJRCBpcyBJRCBmb3IgY2dyb3VwX3N1YnN5c19zdGF0ZSBzdHJ1Y3RzIHVuZGVyIHN1YnN5cy4gVGhpcyBvbmx5IHdvcmtzCkBAIC02MzQsNiArNjM1LDEyIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qIE5vIGNncm91cHMgLSBub3RoaW5nIHRvIGRvICovCitzdGF0aWMgaW5saW5lIGludCBjZ3JvdXBfYXR0YWNoX3Rhc2tfY3VycmVudF9jZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiAhQ09ORklHX0NHUk9VUFMgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DR1JPVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCmluZGV4IGE1YTQ3MmIuLmMxYTYyYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKQEAgLTE2LDYgKzE2LDcgQEAKICMgZGVmaW5lIF9fcmVsZWFzZSh4KQlfX2NvbnRleHRfXyh4LC0xKQogIyBkZWZpbmUgX19jb25kX2xvY2soeCxjKQkoKGMpID8gKHsgX19hY3F1aXJlKHgpOyAxOyB9KSA6IDApCiAjIGRlZmluZSBfX3BlcmNwdQlfX2F0dHJpYnV0ZV9fKChub2RlcmVmLCBhZGRyZXNzX3NwYWNlKDMpKSkKKyMgZGVmaW5lIF9fcmN1CiBleHRlcm4gdm9pZCBfX2Noa191c2VyX3B0cihjb25zdCB2b2xhdGlsZSB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiB2b2lkIF9fY2hrX2lvX3B0cihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKik7CiAjZWxzZQpAQCAtMzQsNiArMzUsNyBAQAogIyBkZWZpbmUgX19yZWxlYXNlKHgpICh2b2lkKTAKICMgZGVmaW5lIF9fY29uZF9sb2NrKHgsYykgKGMpCiAjIGRlZmluZSBfX3BlcmNwdQorIyBkZWZpbmUgX19yY3UKICNlbmRpZgogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAppbmRleCBkY2NhNTMzLi5mNzZmYzI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaApAQCAtNTUsNiArNTUsMTYgQEAKIAl2b2lkCSgqY29uX2ludmVydF9yZWdpb24pKHN0cnVjdCB2Y19kYXRhICosIHUxNiAqLCBpbnQpOwogCXUxNiAgICAqKCpjb25fc2NyZWVuX3Bvcykoc3RydWN0IHZjX2RhdGEgKiwgaW50KTsKIAl1bnNpZ25lZCBsb25nICgqY29uX2dldHh5KShzdHJ1Y3QgdmNfZGF0YSAqLCB1bnNpZ25lZCBsb25nLCBpbnQgKiwgaW50ICopOworCS8qCisJICogUHJlcGFyZSB0aGUgY29uc29sZSBmb3IgdGhlIGRlYnVnZ2VyLiAgVGhpcyBpbmNsdWRlcywgYnV0IGlzIG5vdAorCSAqIGxpbWl0ZWQgdG8sIHVuYmxhbmtpbmcgdGhlIGNvbnNvbGUsIGxvYWRpbmcgYW4gYXBwcm9wcmlhdGUKKwkgKiBwYWxldHRlLCBhbmQgYWxsb3dpbmcgZGVidWdnZXIgZ2VuZXJhdGVkIG91dHB1dC4KKwkgKi8KKwlpbnQJKCpjb25fZGVidWdfZW50ZXIpKHN0cnVjdCB2Y19kYXRhICopOworCS8qCisJICogUmVzdG9yZSB0aGUgY29uc29sZSB0byBpdHMgcHJlLWRlYnVnIHN0YXRlIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuCisJICovCisJaW50CSgqY29uX2RlYnVnX2xlYXZlKShzdHJ1Y3QgdmNfZGF0YSAqKTsKIH07CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY29uc3cgKmNvbnN3aXRjaHA7CkBAIC02OSw2ICs3OSw5IEBACiBpbnQgdW5yZWdpc3Rlcl9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3KTsKIGludCB0YWtlX292ZXJfY29uc29sZShjb25zdCBzdHJ1Y3QgY29uc3cgKnN3LCBpbnQgZmlyc3QsIGludCBsYXN0LCBpbnQgZGVmbHQpOwogdm9pZCBnaXZlX3VwX2NvbnNvbGUoY29uc3Qgc3RydWN0IGNvbnN3ICpzdyk7CitpbnQgY29uX2RlYnVnX2VudGVyKHN0cnVjdCB2Y19kYXRhICp2Yyk7CitpbnQgY29uX2RlYnVnX2xlYXZlKHZvaWQpOworCiAvKiBzY3JvbGwgKi8KICNkZWZpbmUgU01fVVAgICAgICAgKDEpCiAjZGVmaW5lIFNNX0RPV04gICAgICgyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggZTI4Nzg2My4uZGU2YjE3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC00OCw2ICs0OCwzMSBAQAogI2VuZGlmCiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CiAKKy8qCisgKiBDUFUgbm90aWZpZXIgcHJpb3JpdGllcy4KKyAqLworZW51bSB7CisJLyoKKwkgKiBTQ0hFRF9BQ1RJVkUgbWFya3MgYSBjcHUgd2hpY2ggaXMgY29taW5nIHVwIGFjdGl2ZSBkdXJpbmcKKwkgKiBDUFVfT05MSU5FIGFuZCBDUFVfRE9XTl9GQUlMRUQgYW5kIG11c3QgYmUgdGhlIGZpcnN0CisJICogbm90aWZpZXIuICBDUFVTRVRfQUNUSVZFIGFkanVzdHMgY3B1c2V0IGFjY29yZGluZyB0bworCSAqIGNwdV9hY3RpdmUgbWFzayByaWdodCBhZnRlciBTQ0hFRF9BQ1RJVkUuICBEdXJpbmcKKwkgKiBDUFVfRE9XTl9QUkVQQVJFLCBTQ0hFRF9JTkFDVElWRSBhbmQgQ1BVU0VUX0lOQUNUSVZFIGFyZQorCSAqIG9yZGVyZWQgaW4gdGhlIHNpbWlsYXIgd2F5LgorCSAqCisJICogVGhpcyBvcmRlcmluZyBndWFyYW50ZWVzIGNvbnNpc3RlbnQgY3B1X2FjdGl2ZSBtYXNrIGFuZAorCSAqIG1pZ3JhdGlvbiBiZWhhdmlvciB0byBhbGwgY3B1IG5vdGlmaWVycy4KKwkgKi8KKwlDUFVfUFJJX1NDSEVEX0FDVElWRQk9IElOVF9NQVgsCisJQ1BVX1BSSV9DUFVTRVRfQUNUSVZFCT0gSU5UX01BWCAtIDEsCisJQ1BVX1BSSV9TQ0hFRF9JTkFDVElWRQk9IElOVF9NSU4gKyAxLAorCUNQVV9QUklfQ1BVU0VUX0lOQUNUSVZFCT0gSU5UX01JTiwKKworCS8qIG1pZ3JhdGlvbiBzaG91bGQgaGFwcGVuIGJlZm9yZSBvdGhlciBzdHVmZiBidXQgYWZ0ZXIgcGVyZiAqLworCUNQVV9QUklfUEVSRgkJPSAyMCwKKwlDUFVfUFJJX01JR1JBVElPTgk9IDEwLAorfTsKKwogI2lmZGVmIENPTkZJR19TTVAKIC8qIE5lZWQgdG8ga25vdyBhYm91dCBDUFVzIGdvaW5nIHVwL2Rvd24/ICovCiAjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpIHx8ICFkZWZpbmVkKE1PRFVMRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggOWYxNTE1MC4uYzNlOWRlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTE5NiwxMSArMTk2LDYgQEAKIGludCBjcHVmcmVxX3JlZ2lzdGVyX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpnb3Zlcm5vcik7CiB2b2lkIGNwdWZyZXFfdW5yZWdpc3Rlcl9nb3Zlcm5vcihzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqZ292ZXJub3IpOwogCi1pbnQgbG9ja19wb2xpY3lfcndzZW1fcmVhZChpbnQgY3B1KTsKLWludCBsb2NrX3BvbGljeV9yd3NlbV93cml0ZShpbnQgY3B1KTsKLXZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKGludCBjcHUpOwotdm9pZCB1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGludCBjcHUpOwotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgIENQVUZSRVEgRFJJVkVSIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmggYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCmluZGV4IDQ1N2VkNzYuLmYyMGViOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaApAQCAtMjAsNiArMjAsNyBAQAogCiBleHRlcm4gaW50IGNwdXNldF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgY3B1c2V0X2luaXRfc21wKHZvaWQpOworZXh0ZXJuIHZvaWQgY3B1c2V0X3VwZGF0ZV9hY3RpdmVfY3B1cyh2b2lkKTsKIGV4dGVybiB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiBleHRlcm4gaW50IGNwdXNldF9jcHVzX2FsbG93ZWRfZmFsbGJhY2soc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIGV4dGVybiBub2RlbWFza190IGNwdXNldF9tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKQEAgLTEzMiw2ICsxMzMsMTEgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdXNldF9pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfaW5pdF9zbXAodm9pZCkge30KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF91cGRhdGVfYWN0aXZlX2NwdXModm9pZCkKK3sKKwlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygxLCBOVUxMLCBOVUxMKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJCSAgICAgICBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3JlZC5oIGIvaW5jbHVkZS9saW51eC9jcmVkLmgKaW5kZXggNzVjMGZhOC4uNGQyYzM5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcmVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcmVkLmgKQEAgLTE1Myw2ICsxNTMsNyBAQAogZXh0ZXJuIHZvaWQgX19wdXRfY3JlZChzdHJ1Y3QgY3JlZCAqKTsKIGV4dGVybiB2b2lkIGV4aXRfY3JlZHMoc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIGludCBjb3B5X2NyZWRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY3JlZCAqZ2V0X3Rhc2tfY3JlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gc3RydWN0IGNyZWQgKmNyZWRfYWxsb2NfYmxhbmsodm9pZCk7CiBleHRlcm4gc3RydWN0IGNyZWQgKnByZXBhcmVfY3JlZHModm9pZCk7CiBleHRlcm4gc3RydWN0IGNyZWQgKnByZXBhcmVfZXhlY19jcmVkcyh2b2lkKTsKQEAgLTI3MywzMyArMjc0LDE4IEBACiAgKiBAdGFzazogVGhlIHRhc2sgdG8gcXVlcnkKICAqCiAgKiBBY2Nlc3MgdGhlIG9iamVjdGl2ZSBjcmVkZW50aWFscyBvZiBhIHRhc2suICBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVCi0gKiByZWFkbG9jay4KKyAqIHJlYWRsb2NrIG9yIHRoZSB0YXNrIG11c3QgYmUgZGVhZCBhbmQgdW5hYmxlIHRvIGNoYW5nZSBpdHMgb3duIGNyZWRlbnRpYWxzLgogICoKLSAqIFRoZSBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGFzayBkb2Vzbid0IGdvIGF3YXksIGVpdGhlciBieSBob2xkaW5nIGEgcmVmIG9uCi0gKiB0YXNrIG9yIGJ5IGhvbGRpbmcgdGFza2xpc3RfbG9jayB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdW5saW5rZWQuCisgKiBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gZ2V0X2NyZWQoKTsKKyAqIHJhdGhlciBnZXRfdGFza19jcmVkKCkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KICAqLwotI2RlZmluZSBfX3Rhc2tfY3JlZCh0YXNrKSBcCi0JKChjb25zdCBzdHJ1Y3QgY3JlZCAqKShyY3VfZGVyZWZlcmVuY2VfY2hlY2soKHRhc2spLT5yZWFsX2NyZWQsIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8IGxvY2tkZXBfdGFza2xpc3RfbG9ja19pc19oZWxkKCkpKSkKLQotLyoqCi0gKiBnZXRfdGFza19jcmVkIC0gR2V0IGFub3RoZXIgdGFzaydzIG9iamVjdGl2ZSBjcmVkZW50aWFscwotICogQHRhc2s6IFRoZSB0YXNrIHRvIHF1ZXJ5Ci0gKgotICogR2V0IHRoZSBvYmplY3RpdmUgY3JlZGVudGlhbHMgb2YgYSB0YXNrLCBwaW5uaW5nIHRoZW0gc28gdGhhdCB0aGV5IGNhbid0IGdvCi0gKiBhd2F5LiAgQWNjZXNzaW5nIGEgdGFzaydzIGNyZWRlbnRpYWxzIGRpcmVjdGx5IGlzIG5vdCBwZXJtaXR0ZWQuCi0gKgotICogVGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0YXNrIGRvZXNuJ3QgZ28gYXdheSwgZWl0aGVyIGJ5IGhvbGRpbmcgYSByZWYgb24KLSAqIHRhc2sgb3IgYnkgaG9sZGluZyB0YXNrbGlzdF9sb2NrIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyB1bmxpbmtlZC4KLSAqLwotI2RlZmluZSBnZXRfdGFza19jcmVkKHRhc2spCQkJCVwKLSh7CQkJCQkJCVwKLQlzdHJ1Y3QgY3JlZCAqX19jcmVkOwkJCQlcCi0JcmN1X3JlYWRfbG9jaygpOwkJCQlcCi0JX19jcmVkID0gKHN0cnVjdCBjcmVkICopIF9fdGFza19jcmVkKCh0YXNrKSk7CVwKLQlnZXRfY3JlZChfX2NyZWQpOwkJCQlcCi0JcmN1X3JlYWRfdW5sb2NrKCk7CQkJCVwKLQlfX2NyZWQ7CQkJCQkJXAotfSkKKyNkZWZpbmUgX190YXNrX2NyZWQodGFzaykJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpfX3QgPSAodGFzayk7CQkJXAorCQlyY3VfZGVyZWZlcmVuY2VfY2hlY2soX190LT5yZWFsX2NyZWQsCQkJXAorCQkJCSAgICAgIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8CQlcCisJCQkJICAgICAgdGFza19pc19kZWFkKF9fdCkpOwkJXAorCX0pCiAKIC8qKgogICogZ2V0X2N1cnJlbnRfY3JlZCAtIEdldCB0aGUgY3VycmVudCB0YXNrJ3Mgc3ViamVjdGl2ZSBjcmVkZW50aWFscwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZWxheS5oIGIvaW5jbHVkZS9saW51eC9kZWxheS5oCmluZGV4IGZkODMyYzYuLmE2ZWNiMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGVsYXkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RlbGF5LmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogdm9pZCBtc2xlZXAodW5zaWduZWQgaW50IG1zZWNzKTsKIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGUodW5zaWduZWQgaW50IG1zZWNzKTsKK3ZvaWQgdXNsZWVwX3JhbmdlKHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCAwNzEzZTEwLi41MTZmZWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTg0LDkgKzg0LDggQEAKIAkJCQkgICAgICAgc3RydWN0IGRldmljZSAqc3RhcnQsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCi1pbnQgX19tdXN0X2NoZWNrIGJ1c19mb3JfZWFjaF9kcnYoc3RydWN0IGJ1c190eXBlICpidXMsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqc3RhcnQsIHZvaWQgKmRhdGEsCi0JCQkJICBpbnQgKCpmbikoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgdm9pZCAqKSk7CitpbnQgYnVzX2Zvcl9lYWNoX2RydihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgc3RydWN0IGRldmljZV9kcml2ZXIgKnN0YXJ0LAorCQkgICAgIHZvaWQgKmRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqLCB2b2lkICopKTsKIAogdm9pZCBidXNfc29ydF9icmVhZHRoZmlyc3Qoc3RydWN0IGJ1c190eXBlICpidXMsCiAJCQkgICBpbnQgKCpjb21wYXJlKShjb25zdCBzdHJ1Y3QgZGV2aWNlICphLApAQCAtMTEwLDEwICsxMDksMTIgQEAKICAqLwogI2RlZmluZSBCVVNfTk9USUZZX0FERF9ERVZJQ0UJCTB4MDAwMDAwMDEgLyogZGV2aWNlIGFkZGVkICovCiAjZGVmaW5lIEJVU19OT1RJRllfREVMX0RFVklDRQkJMHgwMDAwMDAwMiAvKiBkZXZpY2UgcmVtb3ZlZCAqLwotI2RlZmluZSBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUgkJMHgwMDAwMDAwMyAvKiBkcml2ZXIgYm91bmQgdG8gZGV2aWNlICovCi0jZGVmaW5lIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUgkweDAwMDAwMDA0IC8qIGRyaXZlciBhYm91dCB0byBiZQorI2RlZmluZSBCVVNfTk9USUZZX0JJTkRfRFJJVkVSCQkweDAwMDAwMDAzIC8qIGRyaXZlciBhYm91dCB0byBiZQorCQkJCQkJICAgICAgYm91bmQgKi8KKyNkZWZpbmUgQlVTX05PVElGWV9CT1VORF9EUklWRVIJCTB4MDAwMDAwMDQgLyogZHJpdmVyIGJvdW5kIHRvIGRldmljZSAqLworI2RlZmluZSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIJMHgwMDAwMDAwNSAvKiBkcml2ZXIgYWJvdXQgdG8gYmUKIAkJCQkJCSAgICAgIHVuYm91bmQgKi8KLSNkZWZpbmUgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUgkweDAwMDAwMDA1IC8qIGRyaXZlciBpcyB1bmJvdW5kCisjZGVmaW5lIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVIJMHgwMDAwMDAwNiAvKiBkcml2ZXIgaXMgdW5ib3VuZAogCQkJCQkJICAgICAgZnJvbSB0aGUgZGV2aWNlICovCiAKIGV4dGVybiBzdHJ1Y3Qga3NldCAqYnVzX2dldF9rc2V0KHN0cnVjdCBidXNfdHlwZSAqYnVzKTsKQEAgLTU1MSw3ICs1NTIsNyBAQAogCQkgICAgIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICpkZXZpY2VfZmluZF9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJaW50ICgqbWF0Y2gpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkpOwotZXh0ZXJuIGludCBkZXZpY2VfcmVuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbmV3X25hbWUpOworZXh0ZXJuIGludCBkZXZpY2VfcmVuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogZXh0ZXJuIGludCBkZXZpY2VfbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm5ld19wYXJlbnQsCiAJCSAgICAgICBlbnVtIGRwbV9vcmRlciBkcG1fb3JkZXIpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmRldmljZV9nZXRfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC02MzgsNDMgKzYzOSwxMDMgQEAKIAogLyogZGVidWdnaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcvZGlhZ25vc3RpYyBoZWxwZXJzLiAqLwogZXh0ZXJuIGNvbnN0IGNoYXIgKmRldl9kcml2ZXJfc3RyaW5nKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldik7Ci0jZGVmaW5lIGRldl9wcmludGsobGV2ZWwsIGRldiwgZm9ybWF0LCBhcmcuLi4pCVwKLQlwcmludGsobGV2ZWwgIiVzICVzOiAiIGZvcm1hdCAsIGRldl9kcml2ZXJfc3RyaW5nKGRldikgLCBcCi0JICAgICAgIGRldl9uYW1lKGRldikgLCAjIyBhcmcpCiAKLSNkZWZpbmUgZGV2X2VtZXJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X3ByaW50ayhLRVJOX0VNRVJHICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQotI2RlZmluZSBkZXZfYWxlcnQoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKLQlkZXZfcHJpbnRrKEtFUk5fQUxFUlQgLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCi0jZGVmaW5lIGRldl9jcml0KGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X3ByaW50ayhLRVJOX0NSSVQgLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCi0jZGVmaW5lIGRldl9lcnIoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKLQlkZXZfcHJpbnRrKEtFUk5fRVJSICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQotI2RlZmluZSBkZXZfd2FybihkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9wcmludGsoS0VSTl9XQVJOSU5HICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQotI2RlZmluZSBkZXZfbm90aWNlKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X3ByaW50ayhLRVJOX05PVElDRSAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKLSNkZWZpbmUgZGV2X2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKLQlkZXZfcHJpbnRrKEtFUk5fSU5GTyAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKKworI2lmZGVmIENPTkZJR19QUklOVEsKKworZXh0ZXJuIGludCBkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBkZXZfYWxlcnQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gaW50IGRldl9jcml0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBkZXZfZXJyKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBkZXZfd2Fybihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBpbnQgZGV2X25vdGljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK3N0YXRpYyBpbmxpbmUgaW50IGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCisJIHsgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSBpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworc3RhdGljIGlubGluZSBpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGV2X2NyaXQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgaW5saW5lIGludCBkZXZfY3JpdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRldl9hbGVydChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK3N0YXRpYyBpbmxpbmUgaW50IGRldl9hbGVydChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRldl9lcnIoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgaW5saW5lIGludCBkZXZfZXJyKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGV2X3dhcm4oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgaW5saW5lIGludCBkZXZfd2Fybihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgaW5saW5lIGludCBkZXZfbm90aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworc3RhdGljIGlubGluZSBpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJeyByZXR1cm4gMDsgfQorCisjZW5kaWYKKworLyoKKyAqIFN0dXBpZCBoYWNrYXJvdW5kIGZvciBleGlzdGluZyB1c2VzIG9mIG5vbi1wcmludGsgdXNlcyBkZXZfaW5mbworICoKKyAqIE5vdGUgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiBkZXZfaW5mbyBiZWxvdyBpcyBhY3R1YWxseSBfZGV2X2luZm8KKyAqIGFuZCBhIG1hY3JvIGlzIHVzZWQgdG8gYXZvaWQgcmVkZWZpbmluZyBkZXZfaW5mbworICovCisKKyNkZWZpbmUgZGV2X2luZm8oZGV2LCBmbXQsIGFyZy4uLikgX2Rldl9pbmZvKGRldiwgZm10LCAjI2FyZykKIAogI2lmIGRlZmluZWQoREVCVUcpCiAjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcgLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCisJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsIGZvcm1hdCwgIyNhcmcpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX0RFQlVHKQotI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCAuLi4pIGRvIHsgXAorI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCAuLi4pCQkgICAgIFwKK2RvIHsJCQkJCQkgICAgIFwKIAlkeW5hbWljX2Rldl9kYmcoZGV2LCBmb3JtYXQsICMjX19WQV9BUkdTX18pOyBcCi0JfSB3aGlsZSAoMCkKK30gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JKHsgaWYgKDApIGRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCBmb3JtYXQsICMjYXJnKTsgMDsgfSkKKyNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJCQlcCisoewkJCQkJCQkJXAorCWlmICgwKQkJCQkJCQlcCisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCBmb3JtYXQsICMjYXJnKTsJXAorCTA7CQkJCQkJCVwKK30pCiAjZW5kaWYKIAogI2lmZGVmIFZFUkJPU0VfREVCVUcKICNkZWZpbmUgZGV2X3ZkYmcJZGV2X2RiZwogI2Vsc2UKLQotI2RlZmluZSBkZXZfdmRiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAotCSh7IGlmICgwKSBkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgZm9ybWF0LCAjI2FyZyk7IDA7IH0pCisjZGVmaW5lIGRldl92ZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQkJCVwKKyh7CQkJCQkJCQlcCisJaWYgKDApCQkJCQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsIGZvcm1hdCwgIyNhcmcpOwlcCisJMDsJCQkJCQkJXAorfSkKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWkuaCBiL2luY2x1ZGUvbGludXgvZG1pLmgKaW5kZXggYThhM2UxYS4uOTBlMDg3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtaS5oCkBAIC0yMCw2ICsyMCw3IEBACiAJRE1JX0RFVl9UWVBFX1NBUywKIAlETUlfREVWX1RZUEVfSVBNSSA9IC0xLAogCURNSV9ERVZfVFlQRV9PRU1fU1RSSU5HID0gLTIsCisJRE1JX0RFVl9UWVBFX0RFVl9PTkJPQVJEID0gLTMsCiB9OwogCiBzdHJ1Y3QgZG1pX2hlYWRlciB7CkBAIC0zNyw2ICszOCwxNCBAQAogCiAjaWZkZWYgQ09ORklHX0RNSQogCitzdHJ1Y3QgZG1pX2Rldl9vbmJvYXJkIHsKKwlzdHJ1Y3QgZG1pX2RldmljZSBkZXY7CisJaW50IGluc3RhbmNlOworCWludCBzZWdtZW50OworCWludCBidXM7CisJaW50IGRldmZuOworfTsKKwogZXh0ZXJuIGludCBkbWlfY2hlY2tfc3lzdGVtKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpsaXN0KTsKIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkbWlfZmlyc3RfbWF0Y2goY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmxpc3QpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKiBkbWlfZ2V0X3N5c3RlbV9pbmZvKGludCBmaWVsZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oIGIvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaAppbmRleCBiNmNiNTQyLi40OTNhMmJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKQEAgLTYyLDYgKzYyLDcgQEAKIAlGRV9DQU5fOFZTQgkJCT0gMHgyMDAwMDAsCiAJRkVfQ0FOXzE2VlNCCQkJPSAweDQwMDAwMCwKIAlGRV9IQVNfRVhURU5ERURfQ0FQUwkJPSAweDgwMDAwMCwgICAvKiBXZSBuZWVkIG1vcmUgYml0c3BhY2UgZm9yIG5ld2VyIEFQSXMsIGluZGljYXRlIHRoaXMuICovCisJRkVfQ0FOX1RVUkJPX0ZFQwkJPSAweDgwMDAwMDAsICAvKiBmcm9udGVuZCBzdXBwb3J0cyAidHVyYm8gZmVjIG1vZHVsYXRpb24iICovCiAJRkVfQ0FOXzJHX01PRFVMQVRJT04JCT0gMHgxMDAwMDAwMCwgLyogZnJvbnRlbmQgc3VwcG9ydHMgIjJuZCBnZW5lcmF0aW9uIG1vZHVsYXRpb24iIChEVkItUzIpICovCiAJRkVfTkVFRFNfQkVORElORwkJPSAweDIwMDAwMDAwLCAvKiBub3Qgc3VwcG9ydGVkIGFueW1vcmUsIGRvbid0IHVzZSAoZnJvbnRlbmQgcmVxdWlyZXMgZnJlcXVlbmN5IGJlbmRpbmcpICovCiAJRkVfQ0FOX1JFQ09WRVIJCQk9IDB4NDAwMDAwMDAsIC8qIGZyb250ZW5kIGNhbiByZWNvdmVyIGZyb20gYSBjYWJsZSB1bnBsdWcgYXV0b21hdGljYWxseSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oIGIvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCmluZGV4IDU0MGIwNTguLjVhNzU0NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKQEAgLTI0LDYgKzI0LDYgQEAKICNkZWZpbmUgX0RWQlZFUlNJT05fSF8KIAogI2RlZmluZSBEVkJfQVBJX1ZFUlNJT04gNQotI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMQorI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMgogCiAjZW5kaWYgLypfRFZCVkVSU0lPTl9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VlcHJvbV85M2N4Ni5oIGIvaW5jbHVkZS9saW51eC9lZXByb21fOTNjeDYuaAppbmRleCBhNTVjODczLi5jNDYyN2NiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VlcHJvbV85M2N4Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvZWVwcm9tXzkzY3g2LmgKQEAgLTMwLDYgKzMwLDcgQEAKICNkZWZpbmUgUENJX0VFUFJPTV9XSURUSF85M0M0Ngk2CiAjZGVmaW5lIFBDSV9FRVBST01fV0lEVEhfOTNDNTYJOAogI2RlZmluZSBQQ0lfRUVQUk9NX1dJRFRIXzkzQzY2CTgKKyNkZWZpbmUgUENJX0VFUFJPTV9XSURUSF85M0M4Ngk4CiAjZGVmaW5lIFBDSV9FRVBST01fV0lEVEhfT1BDT0RFCTMKICNkZWZpbmUgUENJX0VFUFJPTV9XUklURV9PUENPREUJMHgwNQogI2RlZmluZSBQQ0lfRUVQUk9NX1JFQURfT1BDT0RFCTB4MDYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaAppbmRleCAzZDdhNjY4Li44NDg0ODBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCkBAIC0xMjcsNiArMTI3LDIwIEBACiB9CiAKIC8qKgorICogZGV2X2h3X2FkZHJfcmFuZG9tIC0gQ3JlYXRlIHJhbmRvbSBNQUMgYW5kIHNldCBkZXZpY2UgZmxhZworICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogQGFkZHI6IFBvaW50ZXIgdG8gYSBzaXgtYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBFdGhlcm5ldCBhZGRyZXNzCisgKgorICogR2VuZXJhdGUgcmFuZG9tIE1BQyB0byBiZSB1c2VkIGJ5IGEgZGV2aWNlIGFuZCBzZXQgYWRkcl9hc3NpZ25fdHlwZQorICogc28gdGhlIHN0YXRlIGNhbiBiZSByZWFkIGJ5IHN5c2ZzIGFuZCBiZSB1c2VkIGJ5IHVkZXYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZfaHdfYWRkcl9yYW5kb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmh3YWRkcikKK3sKKwlkZXYtPmFkZHJfYXNzaWduX3R5cGUgfD0gTkVUX0FERFJfUkFORE9NOworCXJhbmRvbV9ldGhlcl9hZGRyKGh3YWRkcik7Cit9CisKKy8qKgogICogY29tcGFyZV9ldGhlcl9hZGRyIC0gQ29tcGFyZSB0d28gRXRoZXJuZXQgYWRkcmVzc2VzCiAgKiBAYWRkcjE6IFBvaW50ZXIgdG8gYSBzaXgtYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBFdGhlcm5ldCBhZGRyZXNzCiAgKiBAYWRkcjI6IFBvaW50ZXIgb3RoZXIgc2l4LWJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgRXRoZXJuZXQgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ldGh0b29sLmggYi9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaAppbmRleCBiNDIwN2NhLi45OTEyNjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaApAQCAtMzg2LDYgKzM4NiwxNSBAQAogCV9fdTMyCQkJCXJ1bGVfbG9jc1swXTsKIH07CiAKK3N0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgeworCV9fdTMyCWNtZDsKKwkvKiBPbiBlbnRyeSwgdGhpcyBpcyB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIuICBPbgorCSAqIHJldHVybiBmcm9tIEVUSFRPT0xfR1JYRkhJTkRJUiwgdGhpcyBpcyB0aGUgYXJyYXkgc2l6ZSBvZgorCSAqIHRoZSBoYXJkd2FyZSBpbmRpcmVjdGlvbiB0YWJsZS4gKi8KKwlfX3UzMglzaXplOworCV9fdTMyCXJpbmdfaW5kZXhbMF07CS8qIHJpbmcvcXVldWUgaW5kZXggZm9yIGVhY2ggaGFzaCB2YWx1ZSAqLworfTsKKwogc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYyB7CiAJX191MzIJCSBmbG93X3R5cGU7CiAJdW5pb24gewpAQCAtNDU5LDcgKzQ2OCw3IEBACiB1MzIgZXRodG9vbF9vcF9nZXRfdWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IGV0aHRvb2xfb3Bfc2V0X3VmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7CiB1MzIgZXRodG9vbF9vcF9nZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1pbnQgZXRodG9vbF9vcF9zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpOworaW50IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhLCB1MzIgc3VwcG9ydGVkKTsKIHZvaWQgZXRodG9vbF9udHVwbGVfZmx1c2goc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qKgpAQCAtNTc4LDYgKzU4NywxMCBAQAogCWludAkoKnNldF9yeF9udHVwbGUpKHN0cnVjdCBuZXRfZGV2aWNlICosCiAJCQkJIHN0cnVjdCBldGh0b29sX3J4X250dXBsZSAqKTsKIAlpbnQJKCpnZXRfcnhfbnR1cGxlKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgc3RyaW5nc2V0LCB2b2lkICopOworCWludAkoKmdldF9yeGZoX2luZGlyKShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCSAgc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAqKTsKKwlpbnQJKCpzZXRfcnhmaF9pbmRpcikoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKik7CiB9OwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApAQCAtNTg4LDI5ICs2MDEsMjkgQEAKICNkZWZpbmUgRVRIVE9PTF9HUkVHUwkJMHgwMDAwMDAwNCAvKiBHZXQgTklDIHJlZ2lzdGVycy4gKi8KICNkZWZpbmUgRVRIVE9PTF9HV09MCQkweDAwMDAwMDA1IC8qIEdldCB3YWtlLW9uLWxhbiBvcHRpb25zLiAqLwogI2RlZmluZSBFVEhUT09MX1NXT0wJCTB4MDAwMDAwMDYgLyogU2V0IHdha2Utb24tbGFuIG9wdGlvbnMuICovCi0jZGVmaW5lIEVUSFRPT0xfR01TR0xWTAkweDAwMDAwMDA3IC8qIEdldCBkcml2ZXIgbWVzc2FnZSBsZXZlbCAqLwotI2RlZmluZSBFVEhUT09MX1NNU0dMVkwJMHgwMDAwMDAwOCAvKiBTZXQgZHJpdmVyIG1zZyBsZXZlbC4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HTVNHTFZMCQkweDAwMDAwMDA3IC8qIEdldCBkcml2ZXIgbWVzc2FnZSBsZXZlbCAqLworI2RlZmluZSBFVEhUT09MX1NNU0dMVkwJCTB4MDAwMDAwMDggLyogU2V0IGRyaXZlciBtc2cgbGV2ZWwuICovCiAjZGVmaW5lIEVUSFRPT0xfTldBWV9SU1QJMHgwMDAwMDAwOSAvKiBSZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbi4gKi8KICNkZWZpbmUgRVRIVE9PTF9HTElOSwkJMHgwMDAwMDAwYSAvKiBHZXQgbGluayBzdGF0dXMgKGV0aHRvb2xfdmFsdWUpICovCi0jZGVmaW5lIEVUSFRPT0xfR0VFUFJPTQkweDAwMDAwMDBiIC8qIEdldCBFRVBST00gZGF0YSAqLwotI2RlZmluZSBFVEhUT09MX1NFRVBST00JMHgwMDAwMDAwYyAvKiBTZXQgRUVQUk9NIGRhdGEuICovCisjZGVmaW5lIEVUSFRPT0xfR0VFUFJPTQkJMHgwMDAwMDAwYiAvKiBHZXQgRUVQUk9NIGRhdGEgKi8KKyNkZWZpbmUgRVRIVE9PTF9TRUVQUk9NCQkweDAwMDAwMDBjIC8qIFNldCBFRVBST00gZGF0YS4gKi8KICNkZWZpbmUgRVRIVE9PTF9HQ09BTEVTQ0UJMHgwMDAwMDAwZSAvKiBHZXQgY29hbGVzY2UgY29uZmlnICovCiAjZGVmaW5lIEVUSFRPT0xfU0NPQUxFU0NFCTB4MDAwMDAwMGYgLyogU2V0IGNvYWxlc2NlIGNvbmZpZy4gKi8KICNkZWZpbmUgRVRIVE9PTF9HUklOR1BBUkFNCTB4MDAwMDAwMTAgLyogR2V0IHJpbmcgcGFyYW1ldGVycyAqLwogI2RlZmluZSBFVEhUT09MX1NSSU5HUEFSQU0JMHgwMDAwMDAxMSAvKiBTZXQgcmluZyBwYXJhbWV0ZXJzLiAqLwogI2RlZmluZSBFVEhUT09MX0dQQVVTRVBBUkFNCTB4MDAwMDAwMTIgLyogR2V0IHBhdXNlIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgRVRIVE9PTF9TUEFVU0VQQVJBTQkweDAwMDAwMDEzIC8qIFNldCBwYXVzZSBwYXJhbWV0ZXJzLiAqLwotI2RlZmluZSBFVEhUT09MX0dSWENTVU0JMHgwMDAwMDAxNCAvKiBHZXQgUlggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCi0jZGVmaW5lIEVUSFRPT0xfU1JYQ1NVTQkweDAwMDAwMDE1IC8qIFNldCBSWCBodyBjc3VtIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KLSNkZWZpbmUgRVRIVE9PTF9HVFhDU1VNCTB4MDAwMDAwMTYgLyogR2V0IFRYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLwotI2RlZmluZSBFVEhUT09MX1NUWENTVU0JMHgwMDAwMDAxNyAvKiBTZXQgVFggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1JYQ1NVTQkJMHgwMDAwMDAxNCAvKiBHZXQgUlggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU1JYQ1NVTQkJMHgwMDAwMDAxNSAvKiBTZXQgUlggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1RYQ1NVTQkJMHgwMDAwMDAxNiAvKiBHZXQgVFggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU1RYQ1NVTQkJMHgwMDAwMDAxNyAvKiBTZXQgVFggaHcgY3N1bSBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCiAjZGVmaW5lIEVUSFRPT0xfR1NHCQkweDAwMDAwMDE4IC8qIEdldCBzY2F0dGVyLWdhdGhlciBlbmFibGUKIAkJCQkJICAgICogKGV0aHRvb2xfdmFsdWUpICovCiAjZGVmaW5lIEVUSFRPT0xfU1NHCQkweDAwMDAwMDE5IC8qIFNldCBzY2F0dGVyLWdhdGhlciBlbmFibGUKIAkJCQkJICAgICogKGV0aHRvb2xfdmFsdWUpLiAqLwogI2RlZmluZSBFVEhUT09MX1RFU1QJCTB4MDAwMDAwMWEgLyogZXhlY3V0ZSBOSUMgc2VsZi10ZXN0LiAqLwogI2RlZmluZSBFVEhUT09MX0dTVFJJTkdTCTB4MDAwMDAwMWIgLyogZ2V0IHNwZWNpZmllZCBzdHJpbmcgc2V0ICovCi0jZGVmaW5lIEVUSFRPT0xfUEhZU19JRAkweDAwMDAwMDFjIC8qIGlkZW50aWZ5IHRoZSBOSUMgKi8KKyNkZWZpbmUgRVRIVE9PTF9QSFlTX0lECQkweDAwMDAwMDFjIC8qIGlkZW50aWZ5IHRoZSBOSUMgKi8KICNkZWZpbmUgRVRIVE9PTF9HU1RBVFMJCTB4MDAwMDAwMWQgLyogZ2V0IE5JQy1zcGVjaWZpYyBzdGF0aXN0aWNzICovCiAjZGVmaW5lIEVUSFRPT0xfR1RTTwkJMHgwMDAwMDAxZSAvKiBHZXQgVFNPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KICNkZWZpbmUgRVRIVE9PTF9TVFNPCQkweDAwMDAwMDFmIC8qIFNldCBUU08gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLwpAQCAtNjIxLDggKzYzNCw4IEBACiAjZGVmaW5lIEVUSFRPT0xfU0dTTwkJMHgwMDAwMDAyNCAvKiBTZXQgR1NPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KICNkZWZpbmUgRVRIVE9PTF9HRkxBR1MJCTB4MDAwMDAwMjUgLyogR2V0IGZsYWdzIGJpdG1hcChldGh0b29sX3ZhbHVlKSAqLwogI2RlZmluZSBFVEhUT09MX1NGTEFHUwkJMHgwMDAwMDAyNiAvKiBTZXQgZmxhZ3MgYml0bWFwKGV0aHRvb2xfdmFsdWUpICovCi0jZGVmaW5lIEVUSFRPT0xfR1BGTEFHUwkweDAwMDAwMDI3IC8qIEdldCBkcml2ZXItcHJpdmF0ZSBmbGFncyBiaXRtYXAgKi8KLSNkZWZpbmUgRVRIVE9PTF9TUEZMQUdTCTB4MDAwMDAwMjggLyogU2V0IGRyaXZlci1wcml2YXRlIGZsYWdzIGJpdG1hcCAqLworI2RlZmluZSBFVEhUT09MX0dQRkxBR1MJCTB4MDAwMDAwMjcgLyogR2V0IGRyaXZlci1wcml2YXRlIGZsYWdzIGJpdG1hcCAqLworI2RlZmluZSBFVEhUT09MX1NQRkxBR1MJCTB4MDAwMDAwMjggLyogU2V0IGRyaXZlci1wcml2YXRlIGZsYWdzIGJpdG1hcCAqLwogCiAjZGVmaW5lIEVUSFRPT0xfR1JYRkgJCTB4MDAwMDAwMjkgLyogR2V0IFJYIGZsb3cgaGFzaCBjb25maWd1cmF0aW9uICovCiAjZGVmaW5lIEVUSFRPT0xfU1JYRkgJCTB4MDAwMDAwMmEgLyogU2V0IFJYIGZsb3cgaGFzaCBjb25maWd1cmF0aW9uICovCkBAIC02MzksNiArNjUyLDggQEAKICNkZWZpbmUgRVRIVE9PTF9TUlhOVFVQTEUJMHgwMDAwMDAzNSAvKiBBZGQgYW4gbi10dXBsZSBmaWx0ZXIgdG8gZGV2aWNlICovCiAjZGVmaW5lIEVUSFRPT0xfR1JYTlRVUExFCTB4MDAwMDAwMzYgLyogR2V0IG4tdHVwbGUgZmlsdGVycyBmcm9tIGRldmljZSAqLwogI2RlZmluZSBFVEhUT09MX0dTU0VUX0lORk8JMHgwMDAwMDAzNyAvKiBHZXQgc3RyaW5nIHNldCBpbmZvICovCisjZGVmaW5lIEVUSFRPT0xfR1JYRkhJTkRJUgkweDAwMDAwMDM4IC8qIEdldCBSWCBmbG93IGhhc2ggaW5kaXInbiB0YWJsZSAqLworI2RlZmluZSBFVEhUT09MX1NSWEZISU5ESVIJMHgwMDAwMDAzOSAvKiBTZXQgUlggZmxvdyBoYXNoIGluZGlyJ24gdGFibGUgKi8KIAogLyogY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUgKi8KICNkZWZpbmUgU1BBUkNfRVRIX0dTRVQJCUVUSFRPT0xfR1NFVApAQCAtNjQ3LDE4ICs2NjIsMTggQEAKIC8qIEluZGljYXRlcyB3aGF0IGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGludGVyZmFjZS4gKi8KICNkZWZpbmUgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgkJKDEgPDwgMCkKICNkZWZpbmUgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAkJKDEgPDwgMSkKLSNkZWZpbmUgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYJKDEgPDwgMikKLSNkZWZpbmUgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwJKDEgPDwgMykKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYJCSgxIDw8IDIpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsCQkoMSA8PCAzKQogI2RlZmluZSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYJKDEgPDwgNCkKICNkZWZpbmUgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCSgxIDw8IDUpCiAjZGVmaW5lIFNVUFBPUlRFRF9BdXRvbmVnCQkoMSA8PCA2KQogI2RlZmluZSBTVVBQT1JURURfVFAJCQkoMSA8PCA3KQogI2RlZmluZSBTVVBQT1JURURfQVVJCQkJKDEgPDwgOCkKICNkZWZpbmUgU1VQUE9SVEVEX01JSQkJCSgxIDw8IDkpCi0jZGVmaW5lIFNVUFBPUlRFRF9GSUJSRQkJKDEgPDwgMTApCisjZGVmaW5lIFNVUFBPUlRFRF9GSUJSRQkJCSgxIDw8IDEwKQogI2RlZmluZSBTVVBQT1JURURfQk5DCQkJKDEgPDwgMTEpCiAjZGVmaW5lIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwJKDEgPDwgMTIpCi0jZGVmaW5lIFNVUFBPUlRFRF9QYXVzZQkJKDEgPDwgMTMpCisjZGVmaW5lIFNVUFBPUlRFRF9QYXVzZQkJCSgxIDw8IDEzKQogI2RlZmluZSBTVVBQT1JURURfQXN5bV9QYXVzZQkJKDEgPDwgMTQpCiAjZGVmaW5lIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbAkoMSA8PCAxNSkKICNkZWZpbmUgU1VQUE9SVEVEX0JhY2twbGFuZQkJKDEgPDwgMTYpCkBAIC02NjgsOCArNjgzLDggQEAKICNkZWZpbmUgU1VQUE9SVEVEXzEwMDAwYmFzZVJfRkVDCSgxIDw8IDIwKQogCiAvKiBJbmRpY2F0ZXMgd2hhdCBmZWF0dXJlcyBhcmUgYWR2ZXJ0aXNlZCBieSB0aGUgaW50ZXJmYWNlLiAqLwotI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZgkoMSA8PCAwKQotI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbAkoMSA8PCAxKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZgkJKDEgPDwgMCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwJCSgxIDw8IDEpCiAjZGVmaW5lIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZgkoMSA8PCAyKQogI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwJKDEgPDwgMykKICNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZgkoMSA8PCA0KQpAQCAtNzA4LDEyICs3MjMsMTIgQEAKICNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKIAogLyogV2hpY2ggY29ubmVjdG9yIHBvcnQuICovCi0jZGVmaW5lIFBPUlRfVFAJCTB4MDAKKyNkZWZpbmUgUE9SVF9UUAkJCTB4MDAKICNkZWZpbmUgUE9SVF9BVUkJCTB4MDEKICNkZWZpbmUgUE9SVF9NSUkJCTB4MDIKICNkZWZpbmUgUE9SVF9GSUJSRQkJMHgwMwogI2RlZmluZSBQT1JUX0JOQwkJMHgwNAotI2RlZmluZSBQT1JUX0RBCQkweDA1CisjZGVmaW5lIFBPUlRfREEJCQkweDA1CiAjZGVmaW5lIFBPUlRfTk9ORQkJMHhlZgogI2RlZmluZSBQT1JUX09USEVSCQkweGZmCiAKQEAgLTcyNyw3ICs3NDIsNyBAQAogLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b25lZ290aWF0aW9uLiAgSWYgdGhpcyBpcyBzZXQgdG8gZW5hYmxlLAogICogdGhlIGZvcmNlZCBsaW5rIG1vZGVzIGFib3ZlIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQuCiAgKi8KLSNkZWZpbmUgQVVUT05FR19ESVNBQkxFCTB4MDAKKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFCQkweDAwCiAjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCQkweDAxCiAKIC8qIE1vZGUgTURJIG9yIE1ESS1YICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggZTc0NDVkZi4uMGM1NjU5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtMyw2ICszLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIC8qIERlZmluaXRpb25zIG9mIGZyYW1lIGJ1ZmZlcnMJCQkJCQkqLwogCkBAIC02MDcsNiArNjEwLDEyIEBACiAgKiBMT0NLSU5HIE5PVEU6IHRob3NlIGZ1bmN0aW9ucyBtdXN0IF9BTExfIGJlIGNhbGxlZCB3aXRoIHRoZSBjb25zb2xlCiAgKiBzZW1hcGhvcmUgaGVsZCwgdGhpcyBpcyB0aGUgb25seSBzdWl0YWJsZSBsb2NraW5nIG1lY2hhbmlzbSB3ZSBoYXZlCiAgKiBpbiAyLjYuIFNvbWUgbWF5IGJlIGNhbGxlZCBhdCBpbnRlcnJ1cHQgdGltZSBhdCB0aGlzIHBvaW50IHRob3VnaC4KKyAqCisgKiBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgdGhlIGRlYnVnIHJlbGF0ZWQgaG9va3MuICBQdXR0aW5nIHRoZSBmYgorICogaW50byBhIGRlYnVnIHN0YXRlIChlLmcuIGZsaXBwaW5nIHRvIHRoZSBrZXJuZWwgY29uc29sZSkgYW5kIHJlc3RvcmluZworICogaXQgbXVzdCBiZSBkb25lIGluIGEgbG9jay1mcmVlIG1hbm5lciwgc28gbG93IGxldmVsIGRyaXZlcnMgc2hvdWxkCisgKiBrZWVwIHRyYWNrIG9mIHRoZSBpbml0aWFsIGNvbnNvbGUgKGlmIGFwcGxpY2FibGUpIGFuZCBtYXkgbmVlZCB0bworICogcGVyZm9ybSBkaXJlY3QsIHVubG9ja2VkIGhhcmR3YXJlIHdyaXRlcyBpbiB0aGVzZSBob29rcy4KICAqLwogCiBzdHJ1Y3QgZmJfb3BzIHsKQEAgLTY3Niw2ICs2ODUsMTAgQEAKIAogCS8qIHRlYXJkb3duIGFueSByZXNvdXJjZXMgdG8gZG8gd2l0aCB0aGlzIGZyYW1lYnVmZmVyICovCiAJdm9pZCAoKmZiX2Rlc3Ryb3kpKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworCS8qIGNhbGxlZCBhdCBLREIgZW50ZXIgYW5kIGxlYXZlIHRpbWUgdG8gcHJlcGFyZSB0aGUgY29uc29sZSAqLworCWludCAoKmZiX2RlYnVnX2VudGVyKShzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisJaW50ICgqZmJfZGVidWdfbGVhdmUpKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIH07CiAKICNpZmRlZiBDT05GSUdfRkJfVElMRUJMSVRUSU5HCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaCBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCmluZGV4IGQxNDc0NjEuLmY1OWVkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaAppbmRleCAxNTFmNWQ3Li42OWI0M2RiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTkxLDYgKzkxLDU0IEBACiAjZGVmaW5lICAgICAgICAgQlBGX1RBWCAgICAgICAgIDB4MDAKICNkZWZpbmUgICAgICAgICBCUEZfVFhBICAgICAgICAgMHg4MAogCitlbnVtIHsKKwlCUEZfU19SRVRfSyA9IDAsCisJQlBGX1NfUkVUX0EsCisJQlBGX1NfQUxVX0FERF9LLAorCUJQRl9TX0FMVV9BRERfWCwKKwlCUEZfU19BTFVfU1VCX0ssCisJQlBGX1NfQUxVX1NVQl9YLAorCUJQRl9TX0FMVV9NVUxfSywKKwlCUEZfU19BTFVfTVVMX1gsCisJQlBGX1NfQUxVX0RJVl9YLAorCUJQRl9TX0FMVV9BTkRfSywKKwlCUEZfU19BTFVfQU5EX1gsCisJQlBGX1NfQUxVX09SX0ssCisJQlBGX1NfQUxVX09SX1gsCisJQlBGX1NfQUxVX0xTSF9LLAorCUJQRl9TX0FMVV9MU0hfWCwKKwlCUEZfU19BTFVfUlNIX0ssCisJQlBGX1NfQUxVX1JTSF9YLAorCUJQRl9TX0FMVV9ORUcsCisJQlBGX1NfTERfV19BQlMsCisJQlBGX1NfTERfSF9BQlMsCisJQlBGX1NfTERfQl9BQlMsCisJQlBGX1NfTERfV19MRU4sCisJQlBGX1NfTERfV19JTkQsCisJQlBGX1NfTERfSF9JTkQsCisJQlBGX1NfTERfQl9JTkQsCisJQlBGX1NfTERfSU1NLAorCUJQRl9TX0xEWF9XX0xFTiwKKwlCUEZfU19MRFhfQl9NU0gsCisJQlBGX1NfTERYX0lNTSwKKwlCUEZfU19NSVNDX1RBWCwKKwlCUEZfU19NSVNDX1RYQSwKKwlCUEZfU19BTFVfRElWX0ssCisJQlBGX1NfTERfTUVNLAorCUJQRl9TX0xEWF9NRU0sCisJQlBGX1NfU1QsCisJQlBGX1NfU1RYLAorCUJQRl9TX0pNUF9KQSwKKwlCUEZfU19KTVBfSkVRX0ssCisJQlBGX1NfSk1QX0pFUV9YLAorCUJQRl9TX0pNUF9KR0VfSywKKwlCUEZfU19KTVBfSkdFX1gsCisJQlBGX1NfSk1QX0pHVF9LLAorCUJQRl9TX0pNUF9KR1RfWCwKKwlCUEZfU19KTVBfSlNFVF9LLAorCUJQRl9TX0pNUF9KU0VUX1gsCit9OworCiAjaWZuZGVmIEJQRl9NQVhJTlNOUwogI2RlZmluZSBCUEZfTUFYSU5TTlMgNDA5NgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggNjhjYTFiMC4uZTUxMDZlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtNTMsNiArNTMsNyBAQAogI2RlZmluZSBNQVlfQVBQRU5EIDgKICNkZWZpbmUgTUFZX0FDQ0VTUyAxNgogI2RlZmluZSBNQVlfT1BFTiAzMgorI2RlZmluZSBNQVlfQ0hESVIgNjQKIAogLyoKICAqIGZsYWdzIGluIGZpbGUuZl9tb2RlLiAgTm90ZSB0aGF0IEZNT0RFX1JFQUQgYW5kIEZNT0RFX1dSSVRFIG11c3QgY29ycmVzcG9uZApAQCAtNDE1LDcgKzQxNiw4IEBACiB0eXBlZGVmIGludCAoZ2V0X2Jsb2NrX3QpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKTsKIHR5cGVkZWYgdm9pZCAoZGlvX2lvZG9uZV90KShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvZmZfdCBvZmZzZXQsCi0JCQlzc2l6ZV90IGJ5dGVzLCB2b2lkICpwcml2YXRlKTsKKwkJCXNzaXplX3QgYnl0ZXMsIHZvaWQgKnByaXZhdGUsIGludCByZXQsCisJCQlib29sIGlzX2FzeW5jKTsKIAogLyoKICAqIEF0dHJpYnV0ZSBmbGFncy4gIFRoZXNlIHNob3VsZCBiZSBvci1lZCB0b2dldGhlciB0byBmaWd1cmUgb3V0IHdoYXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKaW5kZXggNTk1Y2U0OS4uZWMwZGFkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2NhY2hlLmgKQEAgLTg1LDcgKzg1LDcgQEAKIAogCS8qIGdldCBhbiBpbmRleCBrZXkKIAkgKiAtIHNob3VsZCBzdG9yZSB0aGUga2V5IGRhdGEgaW4gdGhlIGJ1ZmZlcgotCSAqIC0gc2hvdWxkIHJldHVybiB0aGUgYW1vdW50IG9mIGFtb3VudCBzdG9yZWQKKwkgKiAtIHNob3VsZCByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIHN0b3JlZAogCSAqIC0gbm90IHBlcm1pdHRlZCB0byByZXR1cm4gYW4gZXJyb3IKIAkgKiAtIHRoZSBuZXRmcyBkYXRhIGZyb20gdGhlIGNvb2tpZSBiZWluZyB1c2VkIGFzIHRoZSBzb3VyY2UgaXMKIAkgKiAgIHByZXNlbnRlZApAQCAtNDU0LDYgKzQ1NCw3IEBACiAgKiBAY29va2llOiBUaGUgY29va2llIHJlcHJlc2VudGluZyB0aGUgY2FjaGUgb2JqZWN0CiAgKiBAbWFwcGluZzogVGhlIG5ldGZzIGlub2RlIG1hcHBpbmcgdG8gd2hpY2ggdGhlIHBhZ2VzIHdpbGwgYmUgYXR0YWNoZWQKICAqIEBwYWdlczogQSBsaXN0IG9mIHBvdGVudGlhbCBuZXRmcyBwYWdlcyB0byBiZSBmaWxsZWQKKyAqIEBucl9wYWdlczogTnVtYmVyIG9mIHBhZ2VzIHRvIGJlIHJlYWQgYW5kL29yIGFsbG9jYXRlZAogICogQGVuZF9pb19mdW5jOiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYW5kIGlmIGVhY2ggcGFnZSBpcyBmaWxsZWQKICAqIEBjb250ZXh0OiBBbiBhcmJpdHJhcnkgcGllY2Ugb2YgZGF0YSB0byBwYXNzIG9uIHRvIGVuZF9pb19mdW5jKCkKICAqIEBnZnA6IFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZCBiZSBtYWRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZzbC1kaXUtZmIuaCBiL2luY2x1ZGUvbGludXgvZnNsLWRpdS1mYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3ZpZGVvL2ZzbC1kaXUtZmIuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCmluZGV4IDQxZTQ2MzMuLmRjZDZhN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaApAQCAtMSwzICsxLDggQEAKKy8qCisgKiBGdHJhY2UgaGVhZGVyLiAgRm9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYmV5b25kIHRoZSByYW5kb20gY29tbWVudHMKKyAqIHNjYXR0ZXJlZCBiZWxvdywgc2VlOiBEb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0CisgKi8KKwogI2lmbmRlZiBfTElOVVhfRlRSQUNFX0gKICNkZWZpbmUgX0xJTlVYX0ZUUkFDRV9ICiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCmluZGV4IDMxNjdmMmQuLjAyYjhiMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaApAQCAtMTEsOCArMTEsNiBAQAogc3RydWN0IHRyYWNlcjsKIHN0cnVjdCBkZW50cnk7CiAKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgdHJhY2Vfc2VxLCBmdHJhY2VfZXZlbnRfc2VxKTsKLQogc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzIHsKIAl1bnNpZ25lZCBsb25nCQltYXNrOwogCWNvbnN0IGNoYXIJCSpuYW1lOwpAQCAtNTgsNiArNTYsOSBAQAogCXN0cnVjdCByaW5nX2J1ZmZlcl9pdGVyCSpidWZmZXJfaXRlcltOUl9DUFVTXTsKIAl1bnNpZ25lZCBsb25nCQlpdGVyX2ZsYWdzOwogCisJLyogdHJhY2Vfc2VxIGZvciBfX3ByaW50X2ZsYWdzKCkgYW5kIF9fcHJpbnRfc3ltYm9saWMoKSBldGMuICovCisJc3RydWN0IHRyYWNlX3NlcQl0bXBfc2VxOworCiAJLyogVGhlIGJlbG93IGlzIHplcm9lZCBvdXQgaW4gcGlwZV9yZWFkICovCiAJc3RydWN0IHRyYWNlX3NlcQlzZXE7CiAJc3RydWN0IHRyYWNlX2VudHJ5CSplbnQ7CkBAIC0xNDYsMTQgKzE0NywxOSBAQAogCWludAkJCSgqcmF3X2luaXQpKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqKTsKIH07CiAKK2V4dGVybiBpbnQgZnRyYWNlX2V2ZW50X3JlZyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50LAorCQkJICAgIGVudW0gdHJhY2VfcmVnIHR5cGUpOworCiBlbnVtIHsKIAlUUkFDRV9FVkVOVF9GTF9FTkFCTEVEX0JJVCwKIAlUUkFDRV9FVkVOVF9GTF9GSUxURVJFRF9CSVQsCisJVFJBQ0VfRVZFTlRfRkxfUkVDT1JERURfQ01EX0JJVCwKIH07CiAKIGVudW0gewotCVRSQUNFX0VWRU5UX0ZMX0VOQUJMRUQJPSAoMSA8PCBUUkFDRV9FVkVOVF9GTF9FTkFCTEVEX0JJVCksCi0JVFJBQ0VfRVZFTlRfRkxfRklMVEVSRUQJPSAoMSA8PCBUUkFDRV9FVkVOVF9GTF9GSUxURVJFRF9CSVQpLAorCVRSQUNFX0VWRU5UX0ZMX0VOQUJMRUQJCT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfRU5BQkxFRF9CSVQpLAorCVRSQUNFX0VWRU5UX0ZMX0ZJTFRFUkVECQk9ICgxIDw8IFRSQUNFX0VWRU5UX0ZMX0ZJTFRFUkVEX0JJVCksCisJVFJBQ0VfRVZFTlRfRkxfUkVDT1JERURfQ01ECT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfUkVDT1JERURfQ01EX0JJVCksCiB9OwogCiBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgewpAQCAtMTcxLDYgKzE3Nyw3IEBACiAJICogMzIgYml0IGZsYWdzOgogCSAqICAgYml0IDE6CQllbmFibGVkCiAJICogICBiaXQgMjoJCWZpbHRlcl9hY3RpdmUKKwkgKiAgIGJpdCAzOgkJZW5hYmxlZCBjbWQgcmVjb3JkCiAJICoKIAkgKiBDaGFuZ2VzIHRvIGZsYWdzIG11c3QgaG9sZCB0aGUgZXZlbnRfbXV0ZXguCiAJICoKQEAgLTI1Nyw4ICsyNjQsNyBAQAogcGVyZl90cmFjZV9idWZfc3VibWl0KHZvaWQgKnJhd19kYXRhLCBpbnQgc2l6ZSwgaW50IHJjdHgsIHU2NCBhZGRyLAogCQkgICAgICAgdTY0IGNvdW50LCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqaGVhZCkKIHsKLQlwZXJmX3RwX2V2ZW50KGFkZHIsIGNvdW50LCByYXdfZGF0YSwgc2l6ZSwgcmVncywgaGVhZCk7Ci0JcGVyZl9zd2V2ZW50X3B1dF9yZWN1cnNpb25fY29udGV4dChyY3R4KTsKKwlwZXJmX3RwX2V2ZW50KGFkZHIsIGNvdW50LCByYXdfZGF0YSwgc2l6ZSwgcmVncywgaGVhZCwgcmN0eCk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQuaCBiL2luY2x1ZGUvbGludXgvaGlkLmgKaW5kZXggODk1MDAxZi4uNDJhMGYxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC0zMTEsNiArMzExLDcgQEAKICNkZWZpbmUgSElEX1FVSVJLX0hJRERFVl9GT1JDRQkJCTB4MDAwMDAwMTAKICNkZWZpbmUgSElEX1FVSVJLX0JBRFBBRAkJCTB4MDAwMDAwMjAKICNkZWZpbmUgSElEX1FVSVJLX01VTFRJX0lOUFVUCQkJMHgwMDAwMDA0MAorI2RlZmluZSBISURfUVVJUktfSElESU5QVVRfRk9SQ0UJCTB4MDAwMDAwODAKICNkZWZpbmUgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMJCTB4MDAwMTAwMDAKICNkZWZpbmUgSElEX1FVSVJLX0ZVTExTUEVFRF9JTlRFUlZBTAkJMHgxMDAwMDAwMAogI2RlZmluZSBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTCQkweDIwMDAwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9hZHA1NTg4LmggYi9pbmNsdWRlL2xpbnV4L2kyYy9hZHA1NTg4LmgKaW5kZXggMDJjOWFmMy4uMjY5MTgxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMvYWRwNTU4OC5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2FkcDU1ODguaApAQCAtNzgsNiArNzgsNDAgQEAKIAogI2RlZmluZSBBRFA1NTg4X0tFWU1BUFNJWkUJODAKIAorI2RlZmluZSBHUElfUElOX1JPVzAgOTcKKyNkZWZpbmUgR1BJX1BJTl9ST1cxIDk4CisjZGVmaW5lIEdQSV9QSU5fUk9XMiA5OQorI2RlZmluZSBHUElfUElOX1JPVzMgMTAwCisjZGVmaW5lIEdQSV9QSU5fUk9XNCAxMDEKKyNkZWZpbmUgR1BJX1BJTl9ST1c1IDEwMgorI2RlZmluZSBHUElfUElOX1JPVzYgMTAzCisjZGVmaW5lIEdQSV9QSU5fUk9XNyAxMDQKKyNkZWZpbmUgR1BJX1BJTl9DT0wwIDEwNQorI2RlZmluZSBHUElfUElOX0NPTDEgMTA2CisjZGVmaW5lIEdQSV9QSU5fQ09MMiAxMDcKKyNkZWZpbmUgR1BJX1BJTl9DT0wzIDEwOAorI2RlZmluZSBHUElfUElOX0NPTDQgMTA5CisjZGVmaW5lIEdQSV9QSU5fQ09MNSAxMTAKKyNkZWZpbmUgR1BJX1BJTl9DT0w2IDExMQorI2RlZmluZSBHUElfUElOX0NPTDcgMTEyCisjZGVmaW5lIEdQSV9QSU5fQ09MOCAxMTMKKyNkZWZpbmUgR1BJX1BJTl9DT0w5IDExNAorCisjZGVmaW5lIEdQSV9QSU5fUk9XX0JBU0UgR1BJX1BJTl9ST1cwCisjZGVmaW5lIEdQSV9QSU5fUk9XX0VORCBHUElfUElOX1JPVzcKKyNkZWZpbmUgR1BJX1BJTl9DT0xfQkFTRSBHUElfUElOX0NPTDAKKyNkZWZpbmUgR1BJX1BJTl9DT0xfRU5EIEdQSV9QSU5fQ09MOQorCisjZGVmaW5lIEdQSV9QSU5fQkFTRSBHUElfUElOX1JPV19CQVNFCisjZGVmaW5lIEdQSV9QSU5fRU5EIEdQSV9QSU5fQ09MX0VORAorCisjZGVmaW5lIEFEUDU1ODhfR1BJTUFQU0laRV9NQVggKEdQSV9QSU5fRU5EIC0gR1BJX1BJTl9CQVNFICsgMSkKKworc3RydWN0IGFkcDU1ODhfZ3BpX21hcCB7CisJdW5zaWduZWQgc2hvcnQgcGluOworCXVuc2lnbmVkIHNob3J0IHN3X2V2dDsKK307CisKIHN0cnVjdCBhZHA1NTg4X2twYWRfcGxhdGZvcm1fZGF0YSB7CiAJaW50IHJvd3M7CQkJLyogTnVtYmVyIG9mIHJvd3MgKi8KIAlpbnQgY29sczsJCQkvKiBOdW1iZXIgb2YgY29sdW1ucyAqLwpAQCAtODcsNiArMTIxLDkgQEAKIAl1bnNpZ25lZCBlbl9rZXlsb2NrOjE7CQkvKiBFbmFibGUgS2V5IExvY2sgZmVhdHVyZSAqLwogCXVuc2lnbmVkIHNob3J0IHVubG9ja19rZXkxOwkvKiBVbmxvY2sgS2V5IDEgKi8KIAl1bnNpZ25lZCBzaG9ydCB1bmxvY2tfa2V5MjsJLyogVW5sb2NrIEtleSAyICovCisJY29uc3Qgc3RydWN0IGFkcDU1ODhfZ3BpX21hcCAqZ3BpbWFwOworCXVuc2lnbmVkIHNob3J0IGdwaW1hcHNpemU7CisJY29uc3Qgc3RydWN0IGFkcDU1ODhfZ3Bpb19wbGF0Zm9ybV9kYXRhICpncGlvX2RhdGE7CiB9OwogCiBzdHJ1Y3QgYWRwNTU4OF9ncGlvX3BsYXRmb3JtX2RhdGEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvbWNzLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9tY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjVhZTdjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvbWNzLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICogQXV0aG9yOiBIZXVuZ0p1biBLaW0gPHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01DU19ICisjZGVmaW5lIF9fTElOVVhfTUNTX0gKKworI2RlZmluZSBNQ1NfS0VZX01BUCh2LCBjKQkoKCgodikgJiAweGZmKSA8PCAxNikgfCAoKGMpICYgMHhmZmZmKSkKKyNkZWZpbmUgTUNTX0tFWV9WQUwodikJCSgoKHYpID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIE1DU19LRVlfQ09ERSh2KQkJKCh2KSAmIDB4ZmZmZikKKworc3RydWN0IG1jc19wbGF0Zm9ybV9kYXRhIHsKKwl2b2lkICgqY2ZnX3Bpbikodm9pZCk7CisKKwkvKiB0b3VjaHNjcmVlbiAqLworCXVuc2lnbmVkIGludCB4X3NpemU7CisJdW5zaWduZWQgaW50IHlfc2l6ZTsKKworCS8qIHRvdWNoa2V5ICovCisJY29uc3QgdTMyICprZXltYXA7CisJdW5zaWduZWQgaW50IGtleW1hcF9zaXplOworCXVuc2lnbmVkIGludCBrZXlfbWF4dmFsOworCWJvb2wgbm9fYXV0b3JlcGVhdDsKK307CisKKyNlbmRpZgkvKiBfX0xJTlVYX01DU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9tY3M1MDAwX3RzLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9tY3M1MDAwX3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTE3YjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMvbWNzNTAwMF90cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIG1jczUwMDBfdHMuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpZm5kZWYgX19MSU5VWF9NQ1M1MDAwX1RTX0gKLSNkZWZpbmUgX19MSU5VWF9NQ1M1MDAwX1RTX0gKLQotLyogcGxhdGZvcm0gZGF0YSBmb3IgdGhlIE1FTEZBUyBNQ1MtNTAwMCB0b3VjaHNjcmVlbiBkcml2ZXIgKi8KLXN0cnVjdCBtY3M1MDAwX3RzX3BsYXRmb3JtX2RhdGEgewotCXZvaWQgKCpjZmdfcGluKSh2b2lkKTsKLQlpbnQgeF9zaXplOwotCWludCB5X3NpemU7Ci19OwotCi0jZW5kaWYJLyogX19MSU5VWF9NQ1M1MDAwX1RTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL3F0NjAyMjQwX3RzLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9xdDYwMjI0MF90cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MDMzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy9xdDYwMjI0MF90cy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBBVDQyUVQ2MDIyNDAvQVRNWFQyMjQgVG91Y2hzY3JlZW4gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9RVDYwMjI0MF9UU19ICisjZGVmaW5lIF9fTElOVVhfUVQ2MDIyNDBfVFNfSAorCisvKiBPcmllbnQgKi8KKyNkZWZpbmUgUVQ2MDIyNDBfTk9STUFMCQkJMHgwCisjZGVmaW5lIFFUNjAyMjQwX0RJQUdPTkFMCQkweDEKKyNkZWZpbmUgUVQ2MDIyNDBfSE9SSVpPTlRBTF9GTElQCTB4MgorI2RlZmluZSBRVDYwMjI0MF9ST1RBVEVEXzkwX0NPVU5URVIJMHgzCisjZGVmaW5lIFFUNjAyMjQwX1ZFUlRJQ0FMX0ZMSVAJCTB4NAorI2RlZmluZSBRVDYwMjI0MF9ST1RBVEVEXzkwCQkweDUKKyNkZWZpbmUgUVQ2MDIyNDBfUk9UQVRFRF8xODAJCTB4NgorI2RlZmluZSBRVDYwMjI0MF9ESUFHT05BTF9DT1VOVEVSCTB4NworCisvKiBUaGUgcGxhdGZvcm0gZGF0YSBmb3IgdGhlIEFUNDJRVDYwMjI0MC9BVE1YVDIyNCB0b3VjaHNjcmVlbiBkcml2ZXIgKi8KK3N0cnVjdCBxdDYwMjI0MF9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgeF9saW5lOworCXVuc2lnbmVkIGludCB5X2xpbmU7CisJdW5zaWduZWQgaW50IHhfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgeV9zaXplOworCXVuc2lnbmVkIGludCBibGVuOworCXVuc2lnbmVkIGludCB0aHJlc2hvbGQ7CisJdW5zaWduZWQgaW50IHZvbHRhZ2U7CisJdW5zaWduZWQgY2hhciBvcmllbnQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9RVDYwMjI0MF9UU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkZS5oIGIvaW5jbHVkZS9saW51eC9pZGUuaAppbmRleCA3YjAyYWE1Li4wNzJmZThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRlLmgKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCUlERV9ERkxBR19ET09STE9DS0lORwkJPSAoMSA8PCAxNSksCiAJLyogZGlzYWxsb3cgRE1BICovCiAJSURFX0RGTEFHX05PRE1BCQkJPSAoMSA8PCAxNiksCi0JLyogcG93ZXJtYW5hZ21lbnQgdG9sZCB1cyBub3QgdG8gZG8gYW55dGhpbmcsIHNvIHNsZWVwIG5pY2VseSAqLworCS8qIHBvd2VybWFuYWdlbWVudCB0b2xkIHVzIG5vdCB0byBkbyBhbnl0aGluZywgc28gc2xlZXAgbmljZWx5ICovCiAJSURFX0RGTEFHX0JMT0NLRUQJCT0gKDEgPDwgMTcpLAogCS8qIHNsZWVwaW5nICYgc2xlZXAgZmllbGQgdmFsaWQgKi8KIAlJREVfREZMQUdfU0xFRVBJTkcJCT0gKDEgPDwgMTgpLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZi5oIGIvaW5jbHVkZS9saW51eC9pZi5oCmluZGV4IGJlMzUwZTYuLjUzNTU4ZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmLmgKQEAgLTczLDYgKzczLDggQEAKICNkZWZpbmUgSUZGX0RPTlRfQlJJREdFIDB4ODAwCQkvKiBkaXNhbGxvdyBicmlkZ2luZyB0aGlzIGV0aGVyIGRldiAqLwogI2RlZmluZSBJRkZfSU5fTkVUUE9MTAkweDEwMDAJCS8qIHdoZXRoZXIgd2UgYXJlIHByb2Nlc3NpbmcgbmV0cG9sbCAqLwogI2RlZmluZSBJRkZfRElTQUJMRV9ORVRQT0xMCTB4MjAwMAkvKiBkaXNhYmxlIG5ldHBvbGwgYXQgcnVuLXRpbWUgKi8KKyNkZWZpbmUgSUZGX01BQ1ZMQU5fUE9SVAkweDQwMDAJLyogZGV2aWNlIHVzZWQgYXMgbWFjdmxhbiBwb3J0ICovCisjZGVmaW5lIElGRl9CUklER0VfUE9SVAkweDgwMDAJCS8qIGRldmljZSB1c2VkIGFzIGJyaWRnZSBwb3J0ICovCiAKICNkZWZpbmUgSUZfR0VUX0lGQUNFCTB4MDAwMQkJLyogZm9yIHF1ZXJ5aW5nIG9ubHkgKi8KICNkZWZpbmUgSUZfR0VUX1BST1RPCTB4MDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmggYi9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaAppbmRleCBjZDUyNWZhLi4yYzc5OTQzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmgKQEAgLTgzLDYgKzgzLDcgQEAKIAogI2RlZmluZSBCT05EX0RFRkFVTFRfTUFYX0JPTkRTICAxICAgLyogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHRvIHN1cHBvcnQgKi8KIAorI2RlZmluZSBCT05EX0RFRkFVTFRfVFhfUVVFVUVTIDE2ICAgLyogRGVmYXVsdCBudW1iZXIgb2YgdHggcXVldWVzIHBlciBkZXZpY2UgKi8KIC8qIGhhc2hpbmcgdHlwZXMgKi8KICNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIJCTAgLyogbGF5ZXIgMiAoTUFDIG9ubHkpLCBkZWZhdWx0ICovCiAjZGVmaW5lIEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIzNAkxIC8qIGxheWVyIDMrNCAoSVAgXiAoVENQIHx8IFVEUCkpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oIGIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaAppbmRleCA5MzhiN2U4Li4wZDI0MWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKQEAgLTEwMiw4ICsxMDIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCiBleHRlcm4gdm9pZCBicmlvY3RsX3NldChpbnQgKCppb2N0bF9ob29rKShzdHJ1Y3QgbmV0ICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKikpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICooKmJyX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50ICgqYnJfc2hvdWxkX3JvdXRlX2hvb2spKHN0cnVjdCBza19idWZmICpza2IpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaCBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaAppbmRleCBiZWQ3YTQ2Li5jODMxNDY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCkBAIC0xMTksNyArMTE5LDcgQEAKIAl1bnNpZ25lZCBjaGFyCWhfZGVzdFtFVEhfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aCBhZGRyCSovCiAJdW5zaWduZWQgY2hhcgloX3NvdXJjZVtFVEhfQUxFTl07CS8qIHNvdXJjZSBldGhlciBhZGRyCSovCiAJX19iZTE2CQloX3Byb3RvOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQJKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9mZGRpLmggYi9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaAppbmRleCA1NDU5YzVjLi45OTQ3YzM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaApAQCAtNjcsNyArNjcsNyBAQAogCV9fdTgJZHNhcDsJCQkJCS8qIGRlc3RpbmF0aW9uIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCiAJX191OAlzc2FwOwkJCQkJLyogc291cmNlIHNlcnZpY2UgYWNjZXNzIHBvaW50ICovCiAJX191OAljdHJsOwkJCQkJLyogY29udHJvbCBieXRlICMxICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIERlZmluZSA4MDIuMiBUeXBlIDIgaGVhZGVyICovCiBzdHJ1Y3QgZmRkaV84MDIyXzJfaGRyIHsKQEAgLTc1LDcgKzc1LDcgQEAKIAlfX3U4CXNzYXA7CQkJCQkvKiBzb3VyY2Ugc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KIAlfX3U4CWN0cmxfMTsJCQkJCS8qIGNvbnRyb2wgYnl0ZSAjMSAqLwogCV9fdTgJY3RybF8yOwkJCQkJLyogY29udHJvbCBieXRlICMyICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIERlZmluZSA4MDIuMiBTTkFQIGhlYWRlciAqLwogI2RlZmluZSBGRERJX0tfT1VJX0xFTgkzCkBAIC04NSw3ICs4NSw3IEBACiAJX191OAljdHJsOwkJCQkJLyogYWx3YXlzIDB4MDMgKi8KIAlfX3U4CW91aVtGRERJX0tfT1VJX0xFTl07CS8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLwogCV9fYmUxNglldGhlcnR5cGU7CQkJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIERlZmluZSBGRERJIExMQyBmcmFtZSBoZWFkZXIgKi8KIHN0cnVjdCBmZGRpaGRyIHsKQEAgLTk4LDcgKzk4LDcgQEAKIAkJc3RydWN0IGZkZGlfODAyMl8yX2hkcgkJbGxjXzgwMjJfMjsKIAkJc3RydWN0IGZkZGlfc25hcF9oZHIJCWxsY19zbmFwOwogCQl9IGhkcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfZnJhZC5oIGIvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKaW5kZXggODBiM2ExMC4uMTkxZWUwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgX19iZTE2IFBJRDsKIAogI2RlZmluZSBJUF9OTFBJRCBwYWQgCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogc2VlIFJGQyAxNDkwIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZm9sbG93aW5nICovCiAjZGVmaW5lIEZSQURfSV9VSQkJMHgwMwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9oaXBwaS5oIGIvaW5jbHVkZS9saW51eC9pZl9oaXBwaS5oCmluZGV4IDhkMDM4ZWIuLjVmZTVmMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmgKQEAgLTEwNCw3ICsxMDQsNyBAQAogCV9fYmUzMgkJZml4ZWQ7CiAjZW5kaWYKIAlfX2JlMzIJCWQyX3NpemU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBoaXBwaV9sZV9oZHIgewogI2lmIGRlZmluZWQgKF9fQklHX0VORElBTl9CSVRGSUVMRCkKQEAgLTEyOSw3ICsxMjksNyBAQAogCV9fdTgJCWRhZGRyW0hJUFBJX0FMRU5dOwogCV9fdTE2CQlsb2NhbGx5X2FkbWluaXN0ZXJlZDsKIAlfX3U4CQlzYWRkcltISVBQSV9BTEVOXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBISVBQSV9PVUlfTEVOCTMKIC8qCkBAIC0xNDIsMTIgKzE0MiwxMiBAQAogCV9fdTgJY3RybDsJCQkvKiBhbHdheXMgMHgwMyAqLwogCV9fdTgJb3VpW0hJUFBJX09VSV9MRU5dOwkvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKHplcm8pKi8KIAlfX2JlMTYJZXRoZXJ0eXBlOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhpcHBpX2hkciB7CiAJc3RydWN0IGhpcHBpX2ZwX2hkcglmcDsKIAlzdHJ1Y3QgaGlwcGlfbGVfaGRyCWxlOwogCXN0cnVjdCBoaXBwaV9zbmFwX2hkcglzbmFwOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZW5kaWYJLyogX0xJTlVYX0lGX0hJUFBJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKaW5kZXggODVjODEyZC4uMmZjNjZkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAKLS8qIFRoZSBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqLworLyogVGhpcyBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKi8KIHN0cnVjdCBydG5sX2xpbmtfc3RhdHMgewogCV9fdTMyCXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCiAJX191MzIJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KQEAgLTM3LDYgKzM3LDcgQEAKIAlfX3UzMgl0eF9jb21wcmVzc2VkOwogfTsKIAorLyogVGhlIG1haW4gZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCiBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgewogCV9fdTY0CXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCiAJX191NjQJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KQEAgLTIzMyw3ICsyMzQsNyBAQAogCU1BQ1ZMQU5fTU9ERV9CUklER0UgID0gNCwgLyogdGFsayB0byBicmlkZ2UgcG9ydHMgZGlyZWN0bHkgKi8KIH07CiAKLS8qIFNSLUlPViB2aXJ0dWFsIGZ1bmN0aW9uIG1hbmFnbWVudCBzZWN0aW9uICovCisvKiBTUi1JT1YgdmlydHVhbCBmdW5jdGlvbiBtYW5hZ2VtZW50IHNlY3Rpb24gKi8KIAogZW51bSB7CiAJSUZMQV9WRl9JTkZPX1VOU1BFQywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfbWFjdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl9tYWN2bGFuLmgKaW5kZXggOWVhMDQ3YS4uMzUyODBiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9tYWN2bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9tYWN2bGFuLmgKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvdTY0X3N0YXRzX3N5bmMuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX01BQ1ZUQVApIHx8IGRlZmluZWQoQ09ORklHX01BQ1ZUQVBfTU9EVUxFKQogc3RydWN0IHNvY2tldCAqbWFjdnRhcF9nZXRfc29ja2V0KHN0cnVjdCBmaWxlICopOwpAQCAtMjcsMTQgKzI4LDE2IEBACiAgKglzdHJ1Y3QgbWFjdmxhbl9yeF9zdGF0cyAtIE1BQ1ZMQU4gcGVyY3B1IHJ4IHN0YXRzCiAgKglAcnhfcGFja2V0czogbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMKICAqCUByeF9ieXRlczogbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzCi0gKglAbXVsdGljYXN0OiBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IHBhY2tldHMKKyAqCUByeF9tdWx0aWNhc3Q6IG51bWJlciBvZiByZWNlaXZlZCBtdWx0aWNhc3QgcGFja2V0cworICoJQHN5bmNwOiBzeW5jaHJvbml6YXRpb24gcG9pbnQgZm9yIDY0Yml0IGNvdW50ZXJzCiAgKglAcnhfZXJyb3JzOiBudW1iZXIgb2YgZXJyb3JzCiAgKi8KIHN0cnVjdCBtYWN2bGFuX3J4X3N0YXRzIHsKLQl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7Ci0JdW5zaWduZWQgbG9uZyByeF9ieXRlczsKLQl1bnNpZ25lZCBsb25nIG11bHRpY2FzdDsKLQl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsKKwl1NjQJCQlyeF9wYWNrZXRzOworCXU2NAkJCXJ4X2J5dGVzOworCXU2NAkJCXJ4X211bHRpY2FzdDsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMJc3luY3A7CisJdW5zaWduZWQgbG9uZwkJcnhfZXJyb3JzOwogfTsKIAogc3RydWN0IG1hY3ZsYW5fZGV2IHsKQEAgLTU2LDE3ICs1OSwyMSBAQAogewogCXN0cnVjdCBtYWN2bGFuX3J4X3N0YXRzICpyeF9zdGF0czsKIAotCXJ4X3N0YXRzID0gcGVyX2NwdV9wdHIodmxhbi0+cnhfc3RhdHMsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJcnhfc3RhdHMgPSB0aGlzX2NwdV9wdHIodmxhbi0+cnhfc3RhdHMpOwogCWlmIChsaWtlbHkoc3VjY2VzcykpIHsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfc3RhdHMtPnN5bmNwKTsKIAkJcnhfc3RhdHMtPnJ4X3BhY2tldHMrKzs7CiAJCXJ4X3N0YXRzLT5yeF9ieXRlcyArPSBsZW47CiAJCWlmIChtdWx0aWNhc3QpCi0JCQlyeF9zdGF0cy0+bXVsdGljYXN0Kys7CisJCQlyeF9zdGF0cy0+cnhfbXVsdGljYXN0Kys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9zdGF0cy0+c3luY3ApOwogCX0gZWxzZSB7CiAJCXJ4X3N0YXRzLT5yeF9lcnJvcnMrKzsKIAl9CiB9CiAKK2V4dGVybiB2b2lkIG1hY3ZsYW5fY29tbW9uX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCiBleHRlcm4gaW50IG1hY3ZsYW5fY29tbW9uX25ld2xpbmsoc3RydWN0IG5ldCAqc3JjX25ldCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSwKIAkJCQkgIGludCAoKnJlY2VpdmUpKHN0cnVjdCBza19idWZmICpza2IpLApAQCAtODQsOCArOTEsNCBAQAogZXh0ZXJuIG5ldGRldl90eF90IG1hY3ZsYW5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi0KLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqKCptYWN2bGFuX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbWFjdmxhbl9wb3J0ICosCi0JCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7Ci0KICNlbmRpZiAvKiBfTElOVVhfSUZfTUFDVkxBTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAppbmRleCA2YWMyM2VmLi43MmJmYTVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgUEFDS0VUX0xPU1MJCQkxNAogI2RlZmluZSBQQUNLRVRfVk5FVF9IRFIJCQkxNQogI2RlZmluZSBQQUNLRVRfVFhfVElNRVNUQU1QCQkxNgorI2RlZmluZSBQQUNLRVRfVElNRVNUQU1QCQkxNwogCiBzdHJ1Y3QgdHBhY2tldF9zdGF0cyB7CiAJdW5zaWduZWQgaW50CXRwX3BhY2tldHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmggYi9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKaW5kZXggYTY1NzdhZi4uMTkyNWUwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaApAQCAtNTksNyArNTksNyBAQAogICAgICAgIHVuaW9ueyAKICAgICAgICAgICAgICAgIHN0cnVjdCBwcHBvZV9hZGRyICAgICAgIHBwcG9lOyAKICAgICAgICB9c2FfYWRkcjsgCi19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAKK30gX19wYWNrZWQ7CiAKIC8qIFRoZSB1c2Ugb2YgdGhlIGFib3ZlIHVuaW9uIGlzbid0IHZpYWJsZSBiZWNhdXNlIHRoZSBzaXplIG9mIHRoaXMKICAqIHN0cnVjdCBtdXN0IHN0YXkgZml4ZWQgb3ZlciB0aW1lIC0tIGFwcGxpY2F0aW9ucyB1c2Ugc2l6ZW9mKHN0cnVjdApAQCAtNzAsNyArNzAsNyBAQAogCXNhX2ZhbWlseV90ICAgICBzYV9mYW1pbHk7ICAgICAgLyogYWRkcmVzcyBmYW1pbHksIEFGX1BQUE9YICovCiAJdW5zaWduZWQgaW50ICAgIHNhX3Byb3RvY29sOyAgICAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovCiAJc3RydWN0IHBwcG9sMnRwX2FkZHIgcHBwb2wydHA7Ci19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVGhlIEwyVFB2MyBwcm90b2NvbCBjaGFuZ2VzIHR1bm5lbCBhbmQgc2Vzc2lvbiBpZHMgZnJvbSAxNiB0byAzMgogICogYml0cy4gU28gd2UgbmVlZCBhIGRpZmZlcmVudCBzb2NrYWRkciBzdHJ1Y3R1cmUuCkBAIC03OSw3ICs3OSw3IEBACiAJc2FfZmFtaWx5X3QgICAgIHNhX2ZhbWlseTsgICAgICAvKiBhZGRyZXNzIGZhbWlseSwgQUZfUFBQT1ggKi8KIAl1bnNpZ25lZCBpbnQgICAgc2FfcHJvdG9jb2w7ICAgIC8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KIAlzdHJ1Y3QgcHBwb2wydHB2M19hZGRyIHBwcG9sMnRwOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTI5LDcgKzEyOSw3IEBACiAJX19iZTE2IHNpZDsKIAlfX2JlMTYgbGVuZ3RoOwogCXN0cnVjdCBwcHBvZV90YWcgdGFnWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBMZW5ndGggb2YgZW50aXJlIFBQUG9FICsgUFBQIGhlYWRlciAqLwogI2RlZmluZSBQUFBPRV9TRVNfSExFTgk4CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luLmggYi9pbmNsdWRlL2xpbnV4L2luLmgKaW5kZXggNTgzYzc2Zi4uNDFkODhhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW4uaApAQCAtODUsNiArODUsNyBAQAogI2RlZmluZSBJUF9SRUNWT1JJR0RTVEFERFIgICBJUF9PUklHRFNUQUREUgogCiAjZGVmaW5lIElQX01JTlRUTCAgICAgICAyMQorI2RlZmluZSBJUF9OT0RFRlJBRyAgICAgMjIKIAogLyogSVBfTVRVX0RJU0NPVkVSIHZhbHVlcyAqLwogI2RlZmluZSBJUF9QTVRVRElTQ19ET05UCQkwCS8qIE5ldmVyIHNlbmQgREYgZnJhbWVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKaW5kZXggNmZjYzkxMDEuLjMzOWQwNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTY5MSw5ICs2OTEsMTIgQEAKICNkZWZpbmUgQUJTX1RJTFRfWAkJMHgxYQogI2RlZmluZSBBQlNfVElMVF9ZCQkweDFiCiAjZGVmaW5lIEFCU19UT09MX1dJRFRICQkweDFjCisKICNkZWZpbmUgQUJTX1ZPTFVNRQkJMHgyMAorCiAjZGVmaW5lIEFCU19NSVNDCQkweDI4CiAKKyNkZWZpbmUgQUJTX01UX1NMT1QJCTB4MmYJLyogTVQgc2xvdCBiZWluZyBtb2RpZmllZCAqLwogI2RlZmluZSBBQlNfTVRfVE9VQ0hfTUFKT1IJMHgzMAkvKiBNYWpvciBheGlzIG9mIHRvdWNoaW5nIGVsbGlwc2UgKi8KICNkZWZpbmUgQUJTX01UX1RPVUNIX01JTk9SCTB4MzEJLyogTWlub3IgYXhpcyAob21pdCBpZiBjaXJjdWxhcikgKi8KICNkZWZpbmUgQUJTX01UX1dJRFRIX01BSk9SCTB4MzIJLyogTWFqb3IgYXhpcyBvZiBhcHByb2FjaGluZyBlbGxpcHNlICovCkBAIC03MDYsNiArNzA5LDEyIEBACiAjZGVmaW5lIEFCU19NVF9UUkFDS0lOR19JRAkweDM5CS8qIFVuaXF1ZSBJRCBvZiBpbml0aWF0ZWQgY29udGFjdCAqLwogI2RlZmluZSBBQlNfTVRfUFJFU1NVUkUJCTB4M2EJLyogUHJlc3N1cmUgb24gY29udGFjdCBhcmVhICovCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCB1c2Vyc3BhY2Ugc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZXNlICovCisjZGVmaW5lIEFCU19NVF9GSVJTVAkJQUJTX01UX1RPVUNIX01BSk9SCisjZGVmaW5lIEFCU19NVF9MQVNUCQlBQlNfTVRfUFJFU1NVUkUKKyNlbmRpZgorCiAjZGVmaW5lIEFCU19NQVgJCQkweDNmCiAjZGVmaW5lIEFCU19DTlQJCQkoQUJTX01BWCsxKQogCkBAIC0xMDQ4LDYgKzEwNTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KIAogLyoqCisgKiBzdHJ1Y3QgaW5wdXRfbXRfc2xvdCAtIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGFuIGlucHV0IE1UIHNsb3QKKyAqIEBhYnM6IGhvbGRzIGN1cnJlbnQgdmFsdWVzIG9mIEFCU19NVCBheGVzIGZvciB0aGlzIHNsb3QKKyAqLworc3RydWN0IGlucHV0X210X3Nsb3QgeworCWludCBhYnNbQUJTX01UX0xBU1QgLSBBQlNfTVRfRklSU1QgKyAxXTsKK307CisKKy8qKgogICogc3RydWN0IGlucHV0X2RldiAtIHJlcHJlc2VudHMgYW4gaW5wdXQgZGV2aWNlCiAgKiBAbmFtZTogbmFtZSBvZiB0aGUgZGV2aWNlCiAgKiBAcGh5czogcGh5c2ljYWwgcGF0aCB0byB0aGUgZGV2aWNlIGluIHRoZSBzeXN0ZW0gaGllcmFyY2h5CkBAIC0xMDYzLDYgKzEwODAsMTAgQEAKICAqIEBzbmRiaXQ6IGJpdG1hcCBvZiBzb3VuZCBlZmZlY3RzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlCiAgKiBAZmZiaXQ6IGJpdG1hcCBvZiBmb3JjZSBmZWVkYmFjayBlZmZlY3RzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlCiAgKiBAc3diaXQ6IGJpdG1hcCBvZiBzd2l0Y2hlcyBwcmVzZW50IG9uIHRoZSBkZXZpY2UKKyAqIEBoaW50X2V2ZW50c19wZXJfcGFja2V0OiBhdmVyYWdlIG51bWJlciBvZiBldmVudHMgZ2VuZXJhdGVkIGJ5IHRoZQorICoJZGV2aWNlIGluIGEgcGFja2V0IChiZXR3ZWVuIEVWX1NZTi9TWU5fUkVQT1JUIGV2ZW50cykuIFVzZWQgYnkKKyAqCWV2ZW50IGhhbmRsZXJzIHRvIGVzdGltYXRlIHNpemUgb2YgdGhlIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZAorICoJZXZlbnRzLgogICogQGtleWNvZGVtYXg6IHNpemUgb2Yga2V5Y29kZSB0YWJsZQogICogQGtleWNvZGVzaXplOiBzaXplIG9mIGVsZW1lbnRzIGluIGtleWNvZGUgdGFibGUKICAqIEBrZXljb2RlOiBtYXAgb2Ygc2NhbmNvZGVzIHRvIGtleWNvZGVzIGZvciB0aGlzIGRldmljZQpAQCAtMTA3OCw5ICsxMDk5LDEyIEBACiAgKiBAcmVwZWF0X2tleTogc3RvcmVzIGtleSBjb2RlIG9mIHRoZSBsYXN0IGtleSBwcmVzc2VkOyB1c2VkIHRvIGltcGxlbWVudAogICoJc29mdHdhcmUgYXV0b3JlcGVhdAogICogQHRpbWVyOiB0aW1lciBmb3Igc29mdHdhcmUgYXV0b3JlcGVhdAotICogQHN5bmM6IHNldCB0byAxIHdoZW4gdGhlcmUgd2VyZSBubyBuZXcgZXZlbnRzIHNpbmNlIGxhc3QgRVZfU1lOQwogICogQGFiczogY3VycmVudCB2YWx1ZXMgZm9yIHJlcG9ydHMgZnJvbSBhYnNvbHV0ZSBheGVzCiAgKiBAcmVwOiBjdXJyZW50IHZhbHVlcyBmb3IgYXV0b3JlcGVhdCBwYXJhbWV0ZXJzIChkZWxheSwgcmF0ZSkKKyAqIEBtdDogcG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgaW5wdXRfbXRfc2xvdCBob2xkaW5nIGN1cnJlbnQgdmFsdWVzCisgKglvZiB0cmFja2VkIGNvbnRhY3RzCisgKiBAbXRzaXplOiBudW1iZXIgb2YgTVQgc2xvdHMgdGhlIGRldmljZSB1c2VzCisgKiBAc2xvdDogTVQgc2xvdCBjdXJyZW50bHkgYmVpbmcgdHJhbnNtaXR0ZWQKICAqIEBrZXk6IHJlZmxlY3RzIGN1cnJlbnQgc3RhdGUgb2YgZGV2aWNlJ3Mga2V5cy9idXR0b25zCiAgKiBAbGVkOiByZWZsZWN0cyBjdXJyZW50IHN0YXRlIG9mIGRldmljZSdzIExFRHMKICAqIEBzbmQ6IHJlZmxlY3RzIGN1cnJlbnQgc3RhdGUgb2Ygc291bmQgZWZmZWN0cwpAQCAtMTExOSw2ICsxMTQzLDcgQEAKICAqCWxhc3QgdXNlciBjbG9zZXMgdGhlIGRldmljZQogICogQGdvaW5nX2F3YXk6IG1hcmtzIGRldmljZXMgdGhhdCBhcmUgaW4gYSBtaWRkbGUgb2YgdW5yZWdpc3RlcmluZyBhbmQKICAqCWNhdXNlcyBpbnB1dF9vcGVuX2RldmljZSooKSBmYWlsIHdpdGggLUVOT0RFVi4KKyAqIEBzeW5jOiBzZXQgdG8gJXRydWUgd2hlbiB0aGVyZSB3ZXJlIG5vIG5ldyBldmVudHMgc2luY2UgbGFzdCBFVl9TWU4KICAqIEBkZXY6IGRyaXZlciBtb2RlbCdzIHZpZXcgb2YgdGhpcyBkZXZpY2UKICAqIEBoX2xpc3Q6IGxpc3Qgb2YgaW5wdXQgaGFuZGxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4gV2hlbgogICoJYWNjZXNzaW5nIHRoZSBsaXN0IGRldi0+bXV0ZXggbXVzdCBiZSBoZWxkCkBAIC0xMTQwLDYgKzExNjUsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmZiaXRbQklUU19UT19MT05HUyhGRl9DTlQpXTsKIAl1bnNpZ25lZCBsb25nIHN3Yml0W0JJVFNfVE9fTE9OR1MoU1dfQ05UKV07CiAKKwl1bnNpZ25lZCBpbnQgaGludF9ldmVudHNfcGVyX3BhY2tldDsKKwogCXVuc2lnbmVkIGludCBrZXljb2RlbWF4OwogCXVuc2lnbmVkIGludCBrZXljb2Rlc2l6ZTsKIAl2b2lkICprZXljb2RlOwpAQCAtMTE1MywxMSArMTE4MCwxMyBAQAogCXVuc2lnbmVkIGludCByZXBlYXRfa2V5OwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCi0JaW50IHN5bmM7Ci0KIAlpbnQgYWJzW0FCU19DTlRdOwogCWludCByZXBbUkVQX01BWCArIDFdOwogCisJc3RydWN0IGlucHV0X210X3Nsb3QgKm10OworCWludCBtdHNpemU7CisJaW50IHNsb3Q7CisKIAl1bnNpZ25lZCBsb25nIGtleVtCSVRTX1RPX0xPTkdTKEtFWV9DTlQpXTsKIAl1bnNpZ25lZCBsb25nIGxlZFtCSVRTX1RPX0xPTkdTKExFRF9DTlQpXTsKIAl1bnNpZ25lZCBsb25nIHNuZFtCSVRTX1RPX0xPTkdTKFNORF9DTlQpXTsKQEAgLTExODIsNiArMTIxMSw4IEBACiAJdW5zaWduZWQgaW50IHVzZXJzOwogCWJvb2wgZ29pbmdfYXdheTsKIAorCWJvb2wgc3luYzsKKwogCXN0cnVjdCBkZXZpY2UgZGV2OwogCiAJc3RydWN0IGxpc3RfaGVhZAloX2xpc3Q7CkBAIC0xNDA2LDggKzE0MzcsMjggQEAKIAlpbnB1dF9ldmVudChkZXYsIEVWX1NZTiwgU1lOX01UX1JFUE9SVCwgMCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnB1dF9tdF9zbG90KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNsb3QpCit7CisJaW5wdXRfZXZlbnQoZGV2LCBFVl9BQlMsIEFCU19NVF9TTE9ULCBzbG90KTsKK30KKwogdm9pZCBpbnB1dF9zZXRfY2FwYWJpbGl0eShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSk7CiAKKy8qKgorICogaW5wdXRfc2V0X2V2ZW50c19wZXJfcGFja2V0IC0gdGVsbCBoYW5kbGVycyBhYm91dCB0aGUgZHJpdmVyIGV2ZW50IHJhdGUKKyAqIEBkZXY6IHRoZSBpbnB1dCBkZXZpY2UgdXNlZCBieSB0aGUgZHJpdmVyCisgKiBAbl9ldmVudHM6IHRoZSBhdmVyYWdlIG51bWJlciBvZiBldmVudHMgYmV0d2VlbiBjYWxscyB0byBpbnB1dF9zeW5jKCkKKyAqCisgKiBJZiB0aGUgZXZlbnQgcmF0ZSBzZW50IGZyb20gYSBkZXZpY2UgaXMgdW51c3VhbGx5IGxhcmdlLCB1c2UgdGhpcworICogZnVuY3Rpb24gdG8gc2V0IHRoZSBleHBlY3RlZCBldmVudCByYXRlLiBUaGlzIHdpbGwgYWxsb3cgaGFuZGxlcnMKKyAqIHRvIHNldCB1cCBhbiBhcHByb3ByaWF0ZSBidWZmZXIgc2l6ZSBmb3IgdGhlIGV2ZW50IHN0cmVhbSwgaW4gb3JkZXIKKyAqIHRvIG1pbmltaXplIGluZm9ybWF0aW9uIGxvc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnB1dF9zZXRfZXZlbnRzX3Blcl9wYWNrZXQoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgbl9ldmVudHMpCit7CisJZGV2LT5oaW50X2V2ZW50c19wZXJfcGFja2V0ID0gbl9ldmVudHM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnB1dF9zZXRfYWJzX3BhcmFtcyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBheGlzLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgZnV6eiwgaW50IGZsYXQpCiB7CiAJZGV2LT5hYnNtaW5bYXhpc10gPSBtaW47CkBAIC0xNDg1LDUgKzE1MzYsOCBAQAogaW50IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKIAkJaW50ICgqcGxheV9lZmZlY3QpKHN0cnVjdCBpbnB1dF9kZXYgKiwgdm9pZCAqLCBzdHJ1Y3QgZmZfZWZmZWN0ICopKTsKIAoraW50IGlucHV0X210X2NyZWF0ZV9zbG90cyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBudW1fc2xvdHMpOwordm9pZCBpbnB1dF9tdF9kZXN0cm95X3Nsb3RzKHN0cnVjdCBpbnB1dF9kZXYgKmRldik7CisKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0L2FkeGwzNHguaCBiL2luY2x1ZGUvbGludXgvaW5wdXQvYWR4bDM0eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDBkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0L2FkeGwzNHguaApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvaW5wdXQvYWR4bDM0eC5oCisgKgorICogRGlnaXRhbCBBY2NlbGVyb21ldGVyIGNoYXJhY3RlcmlzdGljcyBhcmUgaGlnaGx5IGFwcGxpY2F0aW9uIHNwZWNpZmljCisgKiBhbmQgbWF5IHZhcnkgYmV0d2VlbiBib2FyZHMgYW5kIG1vZGVscy4gVGhlIHBsYXRmb3JtX2RhdGEgZm9yIHRoZQorICogZGV2aWNlJ3MgInN0cnVjdCBkZXZpY2UiIGhvbGRzIHRoaXMgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSU5QVVRfQURYTDM0WF9IX18KKyNkZWZpbmUgX19MSU5VWF9JTlBVVF9BRFhMMzRYX0hfXworCitzdHJ1Y3QgYWR4bDM0eF9wbGF0Zm9ybV9kYXRhIHsKKworCS8qCisJICogWCxZLFogQXhpcyBPZmZzZXQ6CisJICogb2ZmZXIgdXNlciBvZmZzZXQgYWRqdXN0bWVudHMgaW4gdHdvc2NvbXBsaW1lbnQKKwkgKiBmb3JtIHdpdGggYSBzY2FsZSBmYWN0b3Igb2YgMTUuNiBtZy9MU0IgKGkuZS4gMHg3RiA9ICsyIGcpCisJICovCisKKwlzOCB4X2F4aXNfb2Zmc2V0OworCXM4IHlfYXhpc19vZmZzZXQ7CisJczggel9heGlzX29mZnNldDsKKworCS8qCisJICogVEFQX1gvWS9aIEVuYWJsZTogU2V0dGluZyBUQVBfWCwgWSwgb3IgWiBFbmFibGUgZW5hYmxlcyBYLAorCSAqIFksIG9yIFogcGFydGljaXBhdGlvbiBpbiBUYXAgZGV0ZWN0aW9uLiBBICcwJyBleGNsdWRlcyB0aGUKKwkgKiBzZWxlY3RlZCBheGlzIGZyb20gcGFydGljaXBhdGlvbiBpbiBUYXAgZGV0ZWN0aW9uLgorCSAqIFNldHRpbmcgdGhlIFNVUFBSRVNTIGJpdCBzdXBwcmVzc2VzIERvdWJsZSBUYXAgZGV0ZWN0aW9uIGlmCisJICogYWNjZWxlcmF0aW9uIGdyZWF0ZXIgdGhhbiB0YXBfdGhyZXNob2xkIGlzIHByZXNlbnQgYmV0d2VlbgorCSAqIHRhcHMuCisJICovCisKKyNkZWZpbmUgQURYTF9TVVBQUkVTUwkoMSA8PCAzKQorI2RlZmluZSBBRFhMX1RBUF9YX0VOCSgxIDw8IDIpCisjZGVmaW5lIEFEWExfVEFQX1lfRU4JKDEgPDwgMSkKKyNkZWZpbmUgQURYTF9UQVBfWl9FTgkoMSA8PCAwKQorCisJdTggdGFwX2F4aXNfY29udHJvbDsKKworCS8qCisJICogdGFwX3RocmVzaG9sZDoKKwkgKiBob2xkcyB0aGUgdGhyZXNob2xkIHZhbHVlIGZvciB0YXAgZGV0ZWN0aW9uL2ludGVycnVwdHMuCisJICogVGhlIGRhdGEgZm9ybWF0IGlzIHVuc2lnbmVkLiBUaGUgc2NhbGUgZmFjdG9yIGlzIDYyLjUgbWcvTFNCCisJICogKGkuZS4gMHhGRiA9ICsxNiBnKS4gQSB6ZXJvIHZhbHVlIG1heSByZXN1bHQgaW4gdW5kZXNpcmFibGUKKwkgKiBiZWhhdmlvciBpZiBUYXAvRG91YmxlIFRhcCBpcyBlbmFibGVkLgorCSAqLworCisJdTggdGFwX3RocmVzaG9sZDsKKworCS8qCisJICogdGFwX2R1cmF0aW9uOgorCSAqIGlzIGFuIHVuc2lnbmVkIHRpbWUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBtYXhpbXVtCisJICogdGltZSB0aGF0IGFuIGV2ZW50IG11c3QgYmUgYWJvdmUgdGhlIHRhcF90aHJlc2hvbGQgdGhyZXNob2xkCisJICogdG8gcXVhbGlmeSBhcyBhIHRhcCBldmVudC4gVGhlIHNjYWxlIGZhY3RvciBpcyA2MjUgdXMvTFNCLiBBIHplcm8KKwkgKiB2YWx1ZSB3aWxsIHByZXZlbnQgVGFwL0RvdWJsZSBUYXAgZnVuY3Rpb25zIGZyb20gd29ya2luZy4KKwkgKi8KKworCXU4IHRhcF9kdXJhdGlvbjsKKworCS8qCisJICogdGFwX2xhdGVuY3k6CisJICogaXMgYW4gdW5zaWduZWQgdGltZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHdhaXQgdGltZQorCSAqIGZyb20gdGhlIGRldGVjdGlvbiBvZiBhIHRhcCBldmVudCB0byB0aGUgb3BlbmluZyBvZiB0aGUgdGltZQorCSAqIHdpbmRvdyB0YXBfd2luZG93IGZvciBhIHBvc3NpYmxlIHNlY29uZCB0YXAgZXZlbnQuIFRoZSBzY2FsZQorCSAqIGZhY3RvciBpcyAxLjI1IG1zL0xTQi4gQSB6ZXJvIHZhbHVlIHdpbGwgZGlzYWJsZSB0aGUgRG91YmxlIFRhcAorCSAqIGZ1bmN0aW9uLgorCSAqLworCisJdTggdGFwX2xhdGVuY3k7CisKKwkvKgorCSAqIHRhcF93aW5kb3c6CisJICogaXMgYW4gdW5zaWduZWQgdGltZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGFtb3VudAorCSAqIG9mIHRpbWUgYWZ0ZXIgdGhlIGV4cGlyYXRpb24gb2YgdGFwX2xhdGVuY3kgZHVyaW5nIHdoaWNoIGEgc2Vjb25kCisJICogdGFwIGNhbiBiZWdpbi4gVGhlIHNjYWxlIGZhY3RvciBpcyAxLjI1IG1zL0xTQi4gQSB6ZXJvIHZhbHVlIHdpbGwKKwkgKiBkaXNhYmxlIHRoZSBEb3VibGUgVGFwIGZ1bmN0aW9uLgorCSAqLworCisJdTggdGFwX3dpbmRvdzsKKworCS8qCisJICogYWN0X2F4aXNfY29udHJvbDoKKwkgKiBYL1kvWiBFbmFibGU6IEEgJzEnIGVuYWJsZXMgWCwgWSwgb3IgWiBwYXJ0aWNpcGF0aW9uIGluIGFjdGl2aXR5CisJICogb3IgaW5hY3Rpdml0eSBkZXRlY3Rpb24uIEEgJzAnIGV4Y2x1ZGVzIHRoZSBzZWxlY3RlZCBheGlzIGZyb20KKwkgKiBwYXJ0aWNpcGF0aW9uLiBJZiBhbGwgb2YgdGhlIGF4ZXMgYXJlIGV4Y2x1ZGVkLCB0aGUgZnVuY3Rpb24gaXMKKwkgKiBkaXNhYmxlZC4KKwkgKiBBQy9EQzogQSAnMCcgPSBEQyBjb3VwbGVkIG9wZXJhdGlvbiBhbmQgYSAnMScgPSBBQyBjb3VwbGVkCisJICogb3BlcmF0aW9uLiBJbiBEQyBjb3VwbGVkIG9wZXJhdGlvbiwgdGhlIGN1cnJlbnQgYWNjZWxlcmF0aW9uIGlzCisJICogY29tcGFyZWQgd2l0aCBhY3Rpdml0eV90aHJlc2hvbGQgYW5kIGluYWN0aXZpdHlfdGhyZXNob2xkIGRpcmVjdGx5CisJICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYWN0aXZpdHkgb3IgaW5hY3Rpdml0eSBpcyBkZXRlY3RlZC4gSW4gQUMKKwkgKiBjb3VwbGVkIG9wZXJhdGlvbiBmb3IgYWN0aXZpdHkgZGV0ZWN0aW9uLCB0aGUgYWNjZWxlcmF0aW9uIHZhbHVlCisJICogYXQgdGhlIHN0YXJ0IG9mIGFjdGl2aXR5IGRldGVjdGlvbiBpcyB0YWtlbiBhcyBhIHJlZmVyZW5jZSB2YWx1ZS4KKwkgKiBOZXcgc2FtcGxlcyBvZiBhY2NlbGVyYXRpb24gYXJlIHRoZW4gY29tcGFyZWQgdG8gdGhpcworCSAqIHJlZmVyZW5jZSB2YWx1ZSBhbmQgaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBleGNlZWRzCisJICogYWN0aXZpdHlfdGhyZXNob2xkIHRoZSBkZXZpY2Ugd2lsbCB0cmlnZ2VyIGFuIGFjdGl2aXR5IGludGVycnVwdC4gSW4KKwkgKiBBQyBjb3VwbGVkIG9wZXJhdGlvbiBmb3IgaW5hY3Rpdml0eSBkZXRlY3Rpb24sIGEgcmVmZXJlbmNlIHZhbHVlCisJICogaXMgdXNlZCBhZ2FpbiBmb3IgY29tcGFyaXNvbiBhbmQgaXMgdXBkYXRlZCB3aGVuZXZlciB0aGUKKwkgKiBkZXZpY2UgZXhjZWVkcyB0aGUgaW5hY3Rpdml0eSB0aHJlc2hvbGQuIE9uY2UgdGhlIHJlZmVyZW5jZQorCSAqIHZhbHVlIGlzIHNlbGVjdGVkLCB0aGUgZGV2aWNlIGNvbXBhcmVzIHRoZSBtYWduaXR1ZGUgb2YgdGhlCisJICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgdmFsdWUgYW5kIHRoZSBjdXJyZW50CisJICogYWNjZWxlcmF0aW9uIHdpdGggaW5hY3Rpdml0eV90aHJlc2hvbGQuIElmIHRoZSBkaWZmZXJlbmNlIGlzIGJlbG93CisJICogaW5hY3Rpdml0eV90aHJlc2hvbGQgZm9yIGEgdG90YWwgb2YgaW5hY3Rpdml0eV90aW1lLCB0aGUgZGV2aWNlIGlzCisJICogY29uc2lkZXJlZCBpbmFjdGl2ZSBhbmQgdGhlIGluYWN0aXZpdHkgaW50ZXJydXB0IGlzIHRyaWdnZXJlZC4KKwkgKi8KKworI2RlZmluZSBBRFhMX0FDVF9BQ0RDCQkoMSA8PCA3KQorI2RlZmluZSBBRFhMX0FDVF9YX0VOCQkoMSA8PCA2KQorI2RlZmluZSBBRFhMX0FDVF9ZX0VOCQkoMSA8PCA1KQorI2RlZmluZSBBRFhMX0FDVF9aX0VOCQkoMSA8PCA0KQorI2RlZmluZSBBRFhMX0lOQUNUX0FDREMJCSgxIDw8IDMpCisjZGVmaW5lIEFEWExfSU5BQ1RfWF9FTgkJKDEgPDwgMikKKyNkZWZpbmUgQURYTF9JTkFDVF9ZX0VOCQkoMSA8PCAxKQorI2RlZmluZSBBRFhMX0lOQUNUX1pfRU4JCSgxIDw8IDApCisKKwl1OCBhY3RfYXhpc19jb250cm9sOworCisJLyoKKwkgKiBhY3Rpdml0eV90aHJlc2hvbGQ6CisJICogaG9sZHMgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgYWN0aXZpdHkgZGV0ZWN0aW9uLgorCSAqIFRoZSBkYXRhIGZvcm1hdCBpcyB1bnNpZ25lZC4gVGhlIHNjYWxlIGZhY3RvciBpcworCSAqIDYyLjUgbWcvTFNCLiBBIHplcm8gdmFsdWUgbWF5IHJlc3VsdCBpbiB1bmRlc2lyYWJsZSBiZWhhdmlvciBpZgorCSAqIEFjdGl2aXR5IGludGVycnVwdCBpcyBlbmFibGVkLgorCSAqLworCisJdTggYWN0aXZpdHlfdGhyZXNob2xkOworCisJLyoKKwkgKiBpbmFjdGl2aXR5X3RocmVzaG9sZDoKKwkgKiBob2xkcyB0aGUgdGhyZXNob2xkIHZhbHVlIGZvciBpbmFjdGl2aXR5CisJICogZGV0ZWN0aW9uLiBUaGUgZGF0YSBmb3JtYXQgaXMgdW5zaWduZWQuIFRoZSBzY2FsZQorCSAqIGZhY3RvciBpcyA2Mi41IG1nL0xTQi4gQSB6ZXJvIHZhbHVlIG1heSByZXN1bHQgaW4gdW5kZXNpcmFibGUKKwkgKiBiZWhhdmlvciBpZiBJbmFjdGl2aXR5IGludGVycnVwdCBpcyBlbmFibGVkLgorCSAqLworCisJdTggaW5hY3Rpdml0eV90aHJlc2hvbGQ7CisKKwkvKgorCSAqIGluYWN0aXZpdHlfdGltZToKKwkgKiBpcyBhbiB1bnNpZ25lZCB0aW1lIHZhbHVlIHJlcHJlc2VudGluZyB0aGUKKwkgKiBhbW91bnQgb2YgdGltZSB0aGF0IGFjY2VsZXJhdGlvbiBtdXN0IGJlIGJlbG93IHRoZSB2YWx1ZSBpbgorCSAqIGluYWN0aXZpdHlfdGhyZXNob2xkIGZvciBpbmFjdGl2aXR5IHRvIGJlIGRlY2xhcmVkLiBUaGUgc2NhbGUgZmFjdG9yCisJICogaXMgMSBzZWNvbmQvTFNCLiBVbmxpa2UgdGhlIG90aGVyIGludGVycnVwdCBmdW5jdGlvbnMsIHdoaWNoCisJICogb3BlcmF0ZSBvbiB1bmZpbHRlcmVkIGRhdGEsIHRoZSBpbmFjdGl2aXR5IGZ1bmN0aW9uIG9wZXJhdGVzIG9uIHRoZQorCSAqIGZpbHRlcmVkIG91dHB1dCBkYXRhLiBBdCBsZWFzdCBvbmUgb3V0cHV0IHNhbXBsZSBtdXN0IGJlCisJICogZ2VuZXJhdGVkIGZvciB0aGUgaW5hY3Rpdml0eSBpbnRlcnJ1cHQgdG8gYmUgdHJpZ2dlcmVkLiBUaGlzIHdpbGwKKwkgKiByZXN1bHQgaW4gdGhlIGZ1bmN0aW9uIGFwcGVhcmluZyB1bi1yZXNwb25zaXZlIGlmIHRoZQorCSAqIGluYWN0aXZpdHlfdGltZSByZWdpc3RlciBpcyBzZXQgd2l0aCBhIHZhbHVlIGxlc3MgdGhhbiB0aGUgdGltZQorCSAqIGNvbnN0YW50IG9mIHRoZSBPdXRwdXQgRGF0YSBSYXRlLiBBIHplcm8gdmFsdWUgd2lsbCByZXN1bHQgaW4gYW4KKwkgKiBpbnRlcnJ1cHQgd2hlbiB0aGUgb3V0cHV0IGRhdGEgaXMgYmVsb3cgaW5hY3Rpdml0eV90aHJlc2hvbGQuCisJICovCisKKwl1OCBpbmFjdGl2aXR5X3RpbWU7CisKKwkvKgorCSAqIGZyZWVfZmFsbF90aHJlc2hvbGQ6CisJICogaG9sZHMgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgRnJlZS1GYWxsIGRldGVjdGlvbi4KKwkgKiBUaGUgZGF0YSBmb3JtYXQgaXMgdW5zaWduZWQuIFRoZSByb290LXN1bS1zcXVhcmUoUlNTKSB2YWx1ZQorCSAqIG9mIGFsbCBheGVzIGlzIGNhbGN1bGF0ZWQgYW5kIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBpbgorCSAqIGZyZWVfZmFsbF90aHJlc2hvbGQgdG8gZGV0ZXJtaW5lIGlmIGEgZnJlZSBmYWxsIGV2ZW50IG1heSBiZQorCSAqIG9jY3VycmluZy4gIFRoZSBzY2FsZSBmYWN0b3IgaXMgNjIuNSBtZy9MU0IuIEEgemVybyB2YWx1ZSBtYXkKKwkgKiByZXN1bHQgaW4gdW5kZXNpcmFibGUgYmVoYXZpb3IgaWYgRnJlZS1GYWxsIGludGVycnVwdCBpcworCSAqIGVuYWJsZWQuIFZhbHVlcyBiZXR3ZWVuIDMwMCBhbmQgNjAwIG1nICgweDA1IHRvIDB4MDkpIGFyZQorCSAqIHJlY29tbWVuZGVkLgorCSAqLworCisJdTggZnJlZV9mYWxsX3RocmVzaG9sZDsKKworCS8qCisJICogZnJlZV9mYWxsX3RpbWU6CisJICogaXMgYW4gdW5zaWduZWQgdGltZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG1pbmltdW0KKwkgKiB0aW1lIHRoYXQgdGhlIFJTUyB2YWx1ZSBvZiBhbGwgYXhlcyBtdXN0IGJlIGxlc3MgdGhhbgorCSAqIGZyZWVfZmFsbF90aHJlc2hvbGQgdG8gZ2VuZXJhdGUgYSBGcmVlLUZhbGwgaW50ZXJydXB0LiBUaGUKKwkgKiBzY2FsZSBmYWN0b3IgaXMgNSBtcy9MU0IuIEEgemVybyB2YWx1ZSBtYXkgcmVzdWx0IGluCisJICogdW5kZXNpcmFibGUgYmVoYXZpb3IgaWYgRnJlZS1GYWxsIGludGVycnVwdCBpcyBlbmFibGVkLgorCSAqIFZhbHVlcyBiZXR3ZWVuIDEwMCB0byAzNTAgbXMgKDB4MTQgdG8gMHg0NikgYXJlIHJlY29tbWVuZGVkLgorCSAqLworCisJdTggZnJlZV9mYWxsX3RpbWU7CisKKwkvKgorCSAqIGRhdGFfcmF0ZToKKwkgKiBTZWxlY3RzIGRldmljZSBiYW5kd2lkdGggYW5kIG91dHB1dCBkYXRhIHJhdGUuCisJICogUkFURSA9IDMyMDAgSHogLyAoMl4oMTUgLSB4KSkuIERlZmF1bHQgdmFsdWUgaXMgMHgwQSwgb3IgMTAwIEh6CisJICogT3V0cHV0IERhdGEgUmF0ZS4gQW4gT3V0cHV0IERhdGEgUmF0ZSBzaG91bGQgYmUgc2VsZWN0ZWQgdGhhdAorCSAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBhbmQgZnJlcXVlbmN5CisJICogc2VsZWN0ZWQuIFNlbGVjdGluZyB0b28gaGlnaCBvZiBhbiBPdXRwdXQgRGF0YSBSYXRlIHdpdGggYSBsb3cKKwkgKiBjb21tdW5pY2F0aW9uIHNwZWVkIHdpbGwgcmVzdWx0IGluIHNhbXBsZXMgYmVpbmcgZGlzY2FyZGVkLgorCSAqLworCisJdTggZGF0YV9yYXRlOworCisJLyoKKwkgKiBkYXRhX3JhbmdlOgorCSAqIEZVTExfUkVTOiBXaGVuIHRoaXMgYml0IGlzIHNldCB3aXRoIHRoZSBkZXZpY2UgaXMKKwkgKiBpbiBGdWxsLVJlc29sdXRpb24gTW9kZSwgd2hlcmUgdGhlIG91dHB1dCByZXNvbHV0aW9uIGluY3JlYXNlcworCSAqIHdpdGggUkFOR0UgdG8gbWFpbnRhaW4gYSA0IG1nL0xTQiBzY2FsZSBmYWN0b3IuIFdoZW4gdGhpcworCSAqIGJpdCBpcyBjbGVhcmVkIHRoZSBkZXZpY2UgaXMgaW4gMTAtYml0IE1vZGUgYW5kIFJBTkdFIGRldGVybWluZSB0aGUKKwkgKiBtYXhpbXVtIGctUmFuZ2UgYW5kIHNjYWxlIGZhY3Rvci4KKwkgKi8KKworI2RlZmluZSBBRFhMX0ZVTExfUkVTCQkoMSA8PCAzKQorI2RlZmluZSBBRFhMX1JBTkdFX1BNXzJnCTAKKyNkZWZpbmUgQURYTF9SQU5HRV9QTV80ZwkxCisjZGVmaW5lIEFEWExfUkFOR0VfUE1fOGcJMgorI2RlZmluZSBBRFhMX1JBTkdFX1BNXzE2ZwkzCisKKwl1OCBkYXRhX3JhbmdlOworCisJLyoKKwkgKiBsb3dfcG93ZXJfbW9kZToKKwkgKiBBICcwJyA9IE5vcm1hbCBvcGVyYXRpb24gYW5kIGEgJzEnID0gUmVkdWNlZAorCSAqIHBvd2VyIG9wZXJhdGlvbiB3aXRoIHNvbWV3aGF0IGhpZ2hlciBub2lzZS4KKwkgKi8KKworCXU4IGxvd19wb3dlcl9tb2RlOworCisJLyoKKwkgKiBwb3dlcl9tb2RlOgorCSAqIExJTks6IEEgJzEnIHdpdGggYm90aCB0aGUgYWN0aXZpdHkgYW5kIGluYWN0aXZpdHkgZnVuY3Rpb25zCisJICogZW5hYmxlZCB3aWxsIGRlbGF5IHRoZSBzdGFydCBvZiB0aGUgYWN0aXZpdHkgZnVuY3Rpb24gdW50aWwKKwkgKiBpbmFjdGl2aXR5IGlzIGRldGVjdGVkLiBPbmNlIGFjdGl2aXR5IGlzIGRldGVjdGVkLCBpbmFjdGl2aXR5CisJICogZGV0ZWN0aW9uIHdpbGwgYmVnaW4gYW5kIHByZXZlbnQgdGhlIGRldGVjdGlvbiBvZiBhY3Rpdml0eS4gVGhpcworCSAqIGJpdCBzZXJpYWxseSBsaW5rcyB0aGUgYWN0aXZpdHkgYW5kIGluYWN0aXZpdHkgZnVuY3Rpb25zLiBXaGVuICcwJworCSAqIHRoZSBpbmFjdGl2aXR5IGFuZCBhY3Rpdml0eSBmdW5jdGlvbnMgYXJlIGNvbmN1cnJlbnQuIEFkZGl0aW9uYWwKKwkgKiBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIEFwcGxpY2F0aW9uIHNlY3Rpb24gdW5kZXIgTGluaworCSAqIE1vZGUuCisJICogQVVUT19TTEVFUDogQSAnMScgc2V0cyB0aGUgQURYTDM0eCB0byBzd2l0Y2ggdG8gU2xlZXAgTW9kZQorCSAqIHdoZW4gaW5hY3Rpdml0eSAoYWNjZWxlcmF0aW9uIGhhcyBiZWVuIGJlbG93IGluYWN0aXZpdHlfdGhyZXNob2xkCisJICogZm9yIGF0IGxlYXN0IGluYWN0aXZpdHlfdGltZSkgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBMSU5LIGJpdCBpcyBzZXQuCisJICogQSAnMCcgZGlzYWJsZXMgYXV0b21hdGljIHN3aXRjaGluZyB0byBTbGVlcCBNb2RlLiBTZWUgU0xFRVAKKwkgKiBmb3IgZnVydGhlciBkZXNjcmlwdGlvbi4KKwkgKi8KKworI2RlZmluZSBBRFhMX0xJTksJKDEgPDwgNSkKKyNkZWZpbmUgQURYTF9BVVRPX1NMRUVQCSgxIDw8IDQpCisKKwl1OCBwb3dlcl9tb2RlOworCisJLyoKKwkgKiBmaWZvX21vZGU6CisJICogQllQQVNTIFRoZSBGSUZPIGlzIGJ5cGFzc2VkCisJICogRklGTyAgIEZJRk8gY29sbGVjdHMgdXAgdG8gMzIgdmFsdWVzIHRoZW4gc3RvcHMgY29sbGVjdGluZyBkYXRhCisJICogU1RSRUFNIEZJRk8gaG9sZHMgdGhlIGxhc3QgMzIgZGF0YSB2YWx1ZXMuIE9uY2UgZnVsbCwgdGhlIEZJRk8ncworCSAqICAgICAgICBvbGRlc3QgZGF0YSBpcyBsb3N0IGFzIGl0IGlzIHJlcGxhY2VkIHdpdGggbmV3ZXIgZGF0YQorCSAqCisJICogREVGQVVMVCBzaG91bGQgYmUgQURYTF9GSUZPX1NUUkVBTQorCSAqLworCisjZGVmaW5lIEFEWExfRklGT19CWVBBU1MJMAorI2RlZmluZSBBRFhMX0ZJRk9fRklGTwkJMQorI2RlZmluZSBBRFhMX0ZJRk9fU1RSRUFNCTIKKworCXU4IGZpZm9fbW9kZTsKKworCS8qCisJICogd2F0ZXJtYXJrOgorCSAqIFRoZSBXYXRlcm1hcmsgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byByZWR1Y2UgdGhlIGludGVycnVwdCBsb2FkCisJICogb2YgdGhlIHN5c3RlbS4gVGhlIEZJRk8gZmlsbHMgdXAgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiB3YXRlcm1hcmsKKwkgKiBbMS4uMzJdIGFuZCB0aGVuIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuCisJICogQSAnMCcgZGlzYWJsZXMgdGhlIHdhdGVybWFyayBmZWF0dXJlLgorCSAqLworCisJdTggd2F0ZXJtYXJrOworCisJdTMyIGV2X3R5cGU7CS8qIEVWX0FCUyBvciBFVl9SRUwgKi8KKworCXUzMiBldl9jb2RlX3g7CS8qIEFCU19YLFksWiBvciBSRUxfWCxZLFogKi8KKwl1MzIgZXZfY29kZV95OwkvKiBBQlNfWCxZLFogb3IgUkVMX1gsWSxaICovCisJdTMyIGV2X2NvZGVfejsJLyogQUJTX1gsWSxaIG9yIFJFTF9YLFksWiAqLworCisJLyoKKwkgKiBBIHZhbGlkIEJUTiBvciBLRVkgQ29kZTsgdXNlIHRhcF9heGlzX2NvbnRyb2wgdG8gZGlzYWJsZQorCSAqIGV2ZW50IHJlcG9ydGluZworCSAqLworCisJdTMyIGV2X2NvZGVfdGFwWzNdOwkvKiBFVl9LRVkge1gtQXhpcywgWS1BeGlzLCBaLUF4aXN9ICovCisKKwkvKgorCSAqIEEgdmFsaWQgQlROIG9yIEtFWSBDb2RlIGZvciBGcmVlLUZhbGwgb3IgQWN0aXZpdHkgZW5hYmxlcworCSAqIGlucHV0IGV2ZW50IHJlcG9ydGluZy4gQSAnMCcgZGlzYWJsZXMgdGhlIEZyZWUtRmFsbCBvcgorCSAqIEFjdGl2aXR5IHJlcG9ydGluZy4KKwkgKi8KKworCXUzMiBldl9jb2RlX2ZmOwkvKiBFVl9LRVkgKi8KKwl1MzIgZXZfY29kZV9hY3RfaW5hY3Rpdml0eTsJLyogRVZfS0VZICovCisKKwkvKgorCSAqIFVzZSBBRFhMMzR4IElOVDIgaW5zdGVhZCBvZiBJTlQxCisJICovCisJdTggdXNlX2ludDI7CisKKwkvKgorCSAqIEFEWEwzNDYgb25seSBPUklFTlRBVElPTiBTRU5TSU5HIGZlYXR1cmUKKwkgKiBUaGUgb3JpZW50YXRpb24gZnVuY3Rpb24gb2YgdGhlIEFEWEwzNDYgcmVwb3J0cyBib3RoIDItRCBhbmQKKwkgKiAzLUQgb3JpZW50YXRpb24gY29uY3VycmVudGx5LgorCSAqLworCisjZGVmaW5lIEFEWExfRU5fT1JJRU5UQVRJT05fMkQJCTEKKyNkZWZpbmUgQURYTF9FTl9PUklFTlRBVElPTl8zRAkJMgorI2RlZmluZSBBRFhMX0VOX09SSUVOVEFUSU9OXzJEXzNECTMKKworCXU4IG9yaWVudGF0aW9uX2VuYWJsZTsKKworCS8qCisJICogVGhlIHdpZHRoIG9mIHRoZSBkZWFkem9uZSByZWdpb24gYmV0d2VlbiB0d28gb3IgbW9yZQorCSAqIG9yaWVudGF0aW9uIHBvc2l0aW9ucyBpcyBkZXRlcm1pbmVkIGJ5IHNldHRpbmcgdGhlIERlYWR6b25lCisJICogdmFsdWUuIFRoZSBkZWFkem9uZSByZWdpb24gc2l6ZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGggYQorCSAqIHJlc29sdXRpb24gb2YgMy42ZGVnLiBUaGUgZGVhZHpvbmUgYW5nbGUgcmVwcmVzZW50cyB0aGUgdG90YWwKKwkgKiBhbmdsZSB3aGVyZSB0aGUgb3JpZW50YXRpb24gaXMgY29uc2lkZXJlZCBpbnZhbGlkLgorCSAqLworCisjZGVmaW5lIEFEWExfREVBRFpPTkVfQU5HTEVfMHAwCQkwCS8qICEhITAuMCBbZGVnXSAqLworI2RlZmluZSBBRFhMX0RFQURaT05FX0FOR0xFXzNwNgkJMQkvKiAzLjYgW2RlZ10gKi8KKyNkZWZpbmUgQURYTF9ERUFEWk9ORV9BTkdMRV83cDIJCTIJLyogNy4yIFtkZWddICovCisjZGVmaW5lIEFEWExfREVBRFpPTkVfQU5HTEVfMTBwOAkzCS8qIDEwLjggW2RlZ10gKi8KKyNkZWZpbmUgQURYTF9ERUFEWk9ORV9BTkdMRV8xNHA0CTQJLyogMTQuNCBbZGVnXSAqLworI2RlZmluZSBBRFhMX0RFQURaT05FX0FOR0xFXzE4cDAJNQkvKiAxOC4wIFtkZWddICovCisjZGVmaW5lIEFEWExfREVBRFpPTkVfQU5HTEVfMjFwNgk2CS8qIDIxLjYgW2RlZ10gKi8KKyNkZWZpbmUgQURYTF9ERUFEWk9ORV9BTkdMRV8yNXAyCTcJLyogMjUuMiBbZGVnXSAqLworCisJdTggZGVhZHpvbmVfYW5nbGU7CisKKwkvKgorCSAqIFRvIGVsaW1pbmF0ZSBtb3N0IGh1bWFuIG1vdGlvbiBzdWNoIGFzIHdhbGtpbmcgb3Igc2hha2luZywKKwkgKiBhIERpdmlzb3IgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkIHRvIGVmZmVjdGl2ZWx5IGxpbWl0IHRoZQorCSAqIG9yaWVudGF0aW9uIGJhbmR3aWR0aC4gU2V0IHRoZSBkZXB0aCBvZiB0aGUgZmlsdGVyIHVzZWQgdG8KKwkgKiBsb3ctcGFzcyBmaWx0ZXIgdGhlIG1lYXN1cmVkIGFjY2VsZXJhdGlvbiBmb3Igc3RhYmxlCisJICogb3JpZW50YXRpb24gc2Vuc2luZworCSAqLworCisjZGVmaW5lIEFEWExfTFBfRklMVEVSX0RJVklTT1JfMgkwCisjZGVmaW5lIEFEWExfTFBfRklMVEVSX0RJVklTT1JfNAkxCisjZGVmaW5lIEFEWExfTFBfRklMVEVSX0RJVklTT1JfOAkyCisjZGVmaW5lIEFEWExfTFBfRklMVEVSX0RJVklTT1JfMTYJMworI2RlZmluZSBBRFhMX0xQX0ZJTFRFUl9ESVZJU09SXzMyCTQKKyNkZWZpbmUgQURYTF9MUF9GSUxURVJfRElWSVNPUl82NAk1CisjZGVmaW5lIEFEWExfTFBfRklMVEVSX0RJVklTT1JfMTI4CTYKKyNkZWZpbmUgQURYTF9MUF9GSUxURVJfRElWSVNPUl8yNTYJNworCisJdTggZGl2aXNvcl9sZW5ndGg7CisKKwl1MzIgZXZfY29kZXNfb3JpZW50XzJkWzRdOwkvKiBFVl9LRVkgeytYLCAtWCwgK1ksIC1ZfSAqLworCXUzMiBldl9jb2Rlc19vcmllbnRfM2RbNl07CS8qIEVWX0tFWSB7K1osICtZLCArWCwgLVgsIC1ZLCAtWn0gKi8KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQvY3k4Y3RtZzExMF9wZGF0YS5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC9jeThjdG1nMTEwX3BkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MjJjYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvY3k4Y3RtZzExMF9wZGF0YS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0xJTlVYX0NZOENUTUcxMTBfUERBVEFfSAorI2RlZmluZSBfTElOVVhfQ1k4Q1RNRzExMF9QREFUQV9ICisKK3N0cnVjdCBjeThjdG1nMTEwX3BkYXRhCit7CisJaW50IHJlc2V0X3BpbjsJCS8qIFJlc2V0IHBpbiBpcyB3aXJlZCB0byB0aGlzIEdQSU8gKG9wdGlvbmFsKSAqLworCWludCBpcnFfcGluOwkJLyogSVJRIHBpbiBpcyB3aXJlZCB0byB0aGlzIEdQSU8gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmggYi9pbmNsdWRlL2xpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaAppbmRleCBjOTY0Y2Q3Li44MDM1MmFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaApAQCAtNDEsNiArNDEsOSBAQAogICogQGNvbF9zY2FuX2RlbGF5X3VzOiBkZWxheSwgbWVhc3VyZWQgaW4gbWljcm9zZWNvbmRzLCB0aGF0IGlzCiAgKgluZWVkZWQgYmVmb3JlIHdlIGNhbiBrZXlwYWQgYWZ0ZXIgYWN0aXZhdGluZyBjb2x1bW4gZ3BpbwogICogQGRlYm91bmNlX21zOiBkZWJvdW5jZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMKKyAqIEBjbHVzdGVyZWRfaXJxOiBtYXkgYmUgc3BlY2lmaWVkIGlmIGludGVycnVwdHMgb2YgYWxsIHJvdy9jb2x1bW4gR1BJT3MKKyAqCWFyZSBidW5kbGVkIHRvIG9uZSBzaW5nbGUgaXJxCisgKiBAY2x1c3RlcmVkX2lycV9mbGFnczogZmxhZ3MgdGhhdCBhcmUgbmVlZGVkIGZvciB0aGUgY2x1c3RlcmVkIGlycQogICogQGFjdGl2ZV9sb3c6IGdwaW8gcG9sYXJpdHkKICAqIEB3YWtldXA6IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRldmljZSBzaG91bGQgYmUgc2V0IHVwIGFzIHdha2V1cAogICoJc291cmNlCkBAIC02Myw2ICs2Niw5IEBACiAJLyoga2V5IGRlYm91bmNlIGludGVydmFsIGluIG1pbGxpLXNlY29uZCAqLwogCXVuc2lnbmVkIGludAlkZWJvdW5jZV9tczsKIAorCXVuc2lnbmVkIGludAljbHVzdGVyZWRfaXJxOworCXVuc2lnbmVkIGludAljbHVzdGVyZWRfaXJxX2ZsYWdzOworCiAJYm9vbAkJYWN0aXZlX2xvdzsKIAlib29sCQl3YWtldXA7CiAJYm9vbAkJbm9fYXV0b3JlcGVhdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZWxfcG1pY19ncGlvLmggYi9pbmNsdWRlL2xpbnV4L2ludGVsX3BtaWNfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDEwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVsX3BtaWNfZ3Bpby5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgTElOVVhfSU5URUxfUE1JQ19ICisjZGVmaW5lIExJTlVYX0lOVEVMX1BNSUNfSAorCitzdHJ1Y3QgaW50ZWxfcG1pY19ncGlvX3BsYXRmb3JtX2RhdGEgeworCS8qIHRoZSBmaXJzdCBJUlEgb2YgdGhlIGNoaXAgKi8KKwl1bnNpZ25lZAlpcnFfYmFzZTsKKwkvKiBudW1iZXIgYXNzaWduZWQgdG8gdGhlIGZpcnN0IEdQSU8gKi8KKwl1bnNpZ25lZAlncGlvX2Jhc2U7CisJLyogc3JhbSBhZGRyZXNzIGZvciBncGlvaW50ciByZWdpc3RlciwgdGhlIGxhbmd3ZWxsIGNoaXAgd2lsbCBtYXAKKwkgKiB0aGUgUE1JQyBzcGkgR1BJTyBleHBhbmRlcidzIEdQSU9JTlRSIHJlZ2lzdGVyIGluIHNyYW0uCisJICovCisJdW5zaWduZWQJZ3Bpb2ludHI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8tbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKaW5kZXggMjUwODVkZC4uZTBlYTQwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKQEAgLTc5LDcgKzc5LDkgQEAKIAogLyogQXRvbWljIG1hcC91bm1hcCAqLwogc3RhdGljIGlubGluZSB2b2lkICoKLWlvX21hcHBpbmdfbWFwX2F0b21pY193YyhzdHJ1Y3QgaW9fbWFwcGluZyAqbWFwcGluZywgdW5zaWduZWQgbG9uZyBvZmZzZXQpCitpb19tYXBwaW5nX21hcF9hdG9taWNfd2Moc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCisJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgaW50IHNsb3QpCiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHBmbjsKQEAgLTg3LDEzICs4OSwxMyBAQAogCUJVR19PTihvZmZzZXQgPj0gbWFwcGluZy0+c2l6ZSk7CiAJcGh5c19hZGRyID0gbWFwcGluZy0+YmFzZSArIG9mZnNldDsKIAlwZm4gPSAodW5zaWduZWQgbG9uZykgKHBoeXNfYWRkciA+PiBQQUdFX1NISUZUKTsKLQlyZXR1cm4gaW9tYXBfYXRvbWljX3Byb3RfcGZuKHBmbiwgS01fVVNFUjAsIG1hcHBpbmctPnByb3QpOworCXJldHVybiBpb21hcF9hdG9taWNfcHJvdF9wZm4ocGZuLCBzbG90LCBtYXBwaW5nLT5wcm90KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1pb19tYXBwaW5nX3VubWFwX2F0b21pYyh2b2lkICp2YWRkcikKK2lvX21hcHBpbmdfdW5tYXBfYXRvbWljKHZvaWQgKnZhZGRyLCBpbnQgc2xvdCkKIHsKLQlpb3VubWFwX2F0b21pYyh2YWRkciwgS01fVVNFUjApOworCWlvdW5tYXBfYXRvbWljKHZhZGRyLCBzbG90KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICoKQEAgLTEzMywxMyArMTM1LDE1IEBACiAKIC8qIEF0b21pYyBtYXAvdW5tYXAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqCi1pb19tYXBwaW5nX21hcF9hdG9taWNfd2Moc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoraW9fbWFwcGluZ19tYXBfYXRvbWljX3djKHN0cnVjdCBpb19tYXBwaW5nICptYXBwaW5nLAorCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJIGludCBzbG90KQogewogCXJldHVybiAoKGNoYXIgKikgbWFwcGluZykgKyBvZmZzZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotaW9fbWFwcGluZ191bm1hcF9hdG9taWModm9pZCAqdmFkZHIpCitpb19tYXBwaW5nX3VubWFwX2F0b21pYyh2b2lkICp2YWRkciwgaW50IHNsb3QpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8uaCBiL2luY2x1ZGUvbGludXgvaW8uaAppbmRleCA2YzdmMGJhLi43ZmQyZDIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby5oCkBAIC0yOSwxMCArMjksMTAgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKIGludCBpb3JlbWFwX3BhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KTsKKwkJICAgICAgIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaW9yZW1hcF9wYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKKwkJCQkgICAgIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9tbXUuaCBiL2luY2x1ZGUvbGludXgvaW9tbXUuaAppbmRleCBiZTIyYWQ4Li4wYTJiYTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvbW11LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCkBAIC0zMCw2ICszMCw3IEBACiB9OwogCiAjZGVmaW5lIElPTU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1kJMHgxCisjZGVmaW5lIElPTU1VX0NBUF9JTlRSX1JFTUFQCQkweDIJLyogaXNvbGF0ZXMgZGV2aWNlIGludHJzICovCiAKIHN0cnVjdCBpb21tdV9vcHMgewogCWludCAoKmRvbWFpbl9pbml0KShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcF92cy5oIGIvaW5jbHVkZS9saW51eC9pcF92cy5oCmluZGV4IGRmYzE3MDMuLjk3MDhkZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBfdnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwX3ZzLmgKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogI2RlZmluZSBJUF9WU19TVkNfRl9QRVJTSVNURU5UCTB4MDAwMQkJLyogcGVyc2lzdGVudCBwb3J0ICovCiAjZGVmaW5lIElQX1ZTX1NWQ19GX0hBU0hFRAkweDAwMDIJCS8qIGhhc2hlZCBlbnRyeSAqLworI2RlZmluZSBJUF9WU19TVkNfRl9PTkVQQUNLRVQJMHgwMDA0CQkvKiBvbmUtcGFja2V0IHNjaGVkdWxpbmcgKi8KIAogLyoKICAqICAgICAgRGVzdGluYXRpb24gU2VydmVyIEZsYWdzCkBAIC04NSw2ICs4Niw3IEBACiAjZGVmaW5lIElQX1ZTX0NPTk5fRl9TRVFfTUFTSwkweDA2MDAJCS8qIGluL291dCBzZXF1ZW5jZSBtYXNrICovCiAjZGVmaW5lIElQX1ZTX0NPTk5fRl9OT19DUE9SVAkweDA4MDAJCS8qIG5vIGNsaWVudCBwb3J0IHNldCB5ZXQgKi8KICNkZWZpbmUgSVBfVlNfQ09OTl9GX1RFTVBMQVRFCTB4MTAwMAkJLyogdGVtcGxhdGUsIG5vdCBjb25uZWN0aW9uICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9PTkVfUEFDS0VUCTB4MjAwMAkJLyogZm9yd2FyZCBvbmx5IG9uZSBwYWNrZXQgKi8KIAogI2RlZmluZSBJUF9WU19TQ0hFRE5BTUVfTUFYTEVOCTE2CiAjZGVmaW5lIElQX1ZTX0lGTkFNRV9NQVhMRU4JMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXB2Ni5oIGIvaW5jbHVkZS9saW51eC9pcHY2LmgKaW5kZXggOTllMWFiNy4uYWI5ZTllOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9pcHY2LmgKQEAgLTU4LDcgKzU4LDcgQEAKIAkvKiAKIAkgKiBUTFYgZW5jb2RlZCBvcHRpb24gZGF0YSBmb2xsb3dzLgogCSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CS8qIHJlcXVpcmVkIGZvciBzb21lIGFyY2hzICovCit9IF9fcGFja2VkOwkvKiByZXF1aXJlZCBmb3Igc29tZSBhcmNocyAqLwogCiAjZGVmaW5lIGlwdjZfZGVzdG9wdF9oZHIgaXB2Nl9vcHRfaGRyCiAjZGVmaW5lIGlwdjZfaG9wb3B0X2hkciAgaXB2Nl9vcHRfaGRyCkBAIC05OSw3ICs5OSw3IEBACiAJX191OAkJCXR5cGU7CiAJX191OAkJCWxlbmd0aDsKIAlzdHJ1Y3QgaW42X2FkZHIJCWFkZHI7Ci19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAvKgogICoJSVB2NiBmaXhlZCBoZWFkZXIKQEAgLTI0Niw3ICsyNDYsNyBAQAogCV9fdTE2CQkJc3JjcnQ7CiAJX191MTYJCQlkc3QxOwogCV9fdTE2CQkJbGFzdG9wdDsKLQlfX3UzMgkJCW5ob2ZmOworCV9fdTE2CQkJbmhvZmY7CiAJX191MTYJCQlmbGFnczsKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2X01JUDYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTUlQNl9NT0RVTEUpCiAJX191MTYJCQlkc3RoYW87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lzY3NpX2Jvb3Rfc3lzZnMuaCBiL2luY2x1ZGUvbGludXgvaXNjc2lfYm9vdF9zeXNmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTZjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lzY3NpX2Jvb3Rfc3lzZnMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIEV4cG9ydCB0aGUgaVNDU0kgYm9vdCBpbmZvIHRvIHVzZXJsYW5kIHZpYSBzeXNmcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBNaWtlIENocmlzdGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9JU0NTSV9CT09UX1NZU0ZTXworI2RlZmluZSBfSVNDU0lfQk9PVF9TWVNGU18KKworLyoKKyAqIFRoZSB0ZXh0IGF0dHJpYnV0ZXMgbmFtZXMgZm9yIGVhY2ggb2YgdGhlIGtvYmplY3RzLgorKi8KK2VudW0gaXNjc2lfYm9vdF9ldGhfcHJvcGVydGllc19lbnVtIHsKKwlJU0NTSV9CT09UX0VUSF9JTkRFWCwKKwlJU0NTSV9CT09UX0VUSF9GTEFHUywKKwlJU0NTSV9CT09UX0VUSF9JUF9BRERSLAorCUlTQ1NJX0JPT1RfRVRIX1NVQk5FVF9NQVNLLAorCUlTQ1NJX0JPT1RfRVRIX09SSUdJTiwKKwlJU0NTSV9CT09UX0VUSF9HQVRFV0FZLAorCUlTQ1NJX0JPT1RfRVRIX1BSSU1BUllfRE5TLAorCUlTQ1NJX0JPT1RfRVRIX1NFQ09OREFSWV9ETlMsCisJSVNDU0lfQk9PVF9FVEhfREhDUCwKKwlJU0NTSV9CT09UX0VUSF9WTEFOLAorCUlTQ1NJX0JPT1RfRVRIX01BQywKKwkvKiBldGhfcGNpX2JkZiAtIHRoaXMgaXMgcmVwbGFjZWQgYnkgbGluayB0byB0aGUgZGV2aWNlIGl0c2VsZi4gKi8KKwlJU0NTSV9CT09UX0VUSF9IT1NUTkFNRSwKKwlJU0NTSV9CT09UX0VUSF9FTkRfTUFSS0VSLAorfTsKKworZW51bSBpc2NzaV9ib290X3RndF9wcm9wZXJ0aWVzX2VudW0geworCUlTQ1NJX0JPT1RfVEdUX0lOREVYLAorCUlTQ1NJX0JPT1RfVEdUX0ZMQUdTLAorCUlTQ1NJX0JPT1RfVEdUX0lQX0FERFIsCisJSVNDU0lfQk9PVF9UR1RfUE9SVCwKKwlJU0NTSV9CT09UX1RHVF9MVU4sCisJSVNDU0lfQk9PVF9UR1RfQ0hBUF9UWVBFLAorCUlTQ1NJX0JPT1RfVEdUX05JQ19BU1NPQywKKwlJU0NTSV9CT09UX1RHVF9OQU1FLAorCUlTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRSwKKwlJU0NTSV9CT09UX1RHVF9DSEFQX1NFQ1JFVCwKKwlJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9OQU1FLAorCUlTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVCwKKwlJU0NTSV9CT09UX1RHVF9FTkRfTUFSS0VSLAorfTsKKworZW51bSBpc2NzaV9ib290X2luaXRpYXRvcl9wcm9wZXJ0aWVzX2VudW0geworCUlTQ1NJX0JPT1RfSU5JX0lOREVYLAorCUlTQ1NJX0JPT1RfSU5JX0ZMQUdTLAorCUlTQ1NJX0JPT1RfSU5JX0lTTlNfU0VSVkVSLAorCUlTQ1NJX0JPT1RfSU5JX1NMUF9TRVJWRVIsCisJSVNDU0lfQk9PVF9JTklfUFJJX1JBRElVU19TRVJWRVIsCisJSVNDU0lfQk9PVF9JTklfU0VDX1JBRElVU19TRVJWRVIsCisJSVNDU0lfQk9PVF9JTklfSU5JVElBVE9SX05BTUUsCisJSVNDU0lfQk9PVF9JTklfRU5EX01BUktFUiwKK307CisKK3N0cnVjdCBhdHRyaWJ1dGVfZ3JvdXA7CisKK3N0cnVjdCBpc2NzaV9ib290X2tvYmogeworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKgorCSAqIFBvaW50ZXIgdG8gc3RvcmUgZHJpdmVyIHNwZWNpZmljIGluZm8uIElmIHNldCB0aGlzIHdpbGwKKwkgKiBiZSBmcmVlZCBmb3IgdGhlIExMRCB3aGVuIHRoZSBrb2JqIHJlbGVhc2UgZnVuY3Rpb24gaXMgY2FsbGVkLgorCSAqLworCXZvaWQgKmRhdGE7CisJLyoKKwkgKiBEcml2ZXIgc3BlY2lmaWMgc2hvdyBmdW5jdGlvbi4KKwkgKgorCSAqIFRoZSBlbnVtIG9mIHRoZSB0eXBlLiBUaGlzIGNhbiBiZSBhbnkgdmFsdWUgb2YgdGhlIGFib3ZlCisJICogcHJvcGVydGllcy4KKwkgKi8KKwlzc2l6ZV90ICgqc2hvdykgKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpOworCisJLyoKKwkgKiBEcml2ZXJzIHNwZWNpZmljIHZpc2liaWxpdHkgZnVuY3Rpb24uCisJICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaWYgdGhleSB0aGUgYXR0ciBzaG91bGQgYmUgcmVhZGFibGUKKwkgKiB3cml0YWJsZSBvciBzaG91bGQgbm90IGJlIHNob3duLgorCSAqCisJICogVGhlIGVudW0gb2YgdGhlIHR5cGUuIFRoaXMgY2FuIGJlIGFueSB2YWx1ZSBvZiB0aGUgYWJvdmUKKwkgKiBwcm9wZXJ0aWVzLgorCSAqLworCW1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSk7Cit9OworCitzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGtvYmpfbGlzdDsKKwlzdHJ1Y3Qga3NldCAqa3NldDsKK307CisKK3N0cnVjdCBpc2NzaV9ib290X2tvYmogKgoraXNjc2lfYm9vdF9jcmVhdGVfaW5pdGlhdG9yKHN0cnVjdCBpc2NzaV9ib290X2tzZXQgKmJvb3Rfa3NldCwgaW50IGluZGV4LAorCQkJICAgIHZvaWQgKmRhdGEsCisJCQkgICAgc3NpemVfdCAoKnNob3cpICh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKSwKKwkJCSAgICBtb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpKTsKKworc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqCitpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQsIGludCBpbmRleCwKKwkJCSAgIHZvaWQgKmRhdGEsCisJCQkgICBzc2l6ZV90ICgqc2hvdykgKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpLAorCQkJICAgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSk7CitzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICoKK2lzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldChzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQsIGludCBpbmRleCwKKwkJCSB2b2lkICpkYXRhLAorCQkJIHNzaXplX3QgKCpzaG93KSAodm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZiksCisJCQkgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSk7CisKK3N0cnVjdCBpc2NzaV9ib290X2tzZXQgKmlzY3NpX2Jvb3RfY3JlYXRlX2tzZXQoY29uc3QgY2hhciAqc2V0X25hbWUpOworc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqaXNjc2lfYm9vdF9jcmVhdGVfaG9zdF9rc2V0KHVuc2lnbmVkIGludCBob3N0bm8pOwordm9pZCBpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXNjc2lfaWJmdC5oIGIvaW5jbHVkZS9saW51eC9pc2NzaV9pYmZ0LmgKaW5kZXggZDJlNDA0Mi4uOGJhN2U1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pc2NzaV9pYmZ0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pc2NzaV9pYmZ0LmgKQEAgLTIxLDIxICsyMSwxMyBAQAogI2lmbmRlZiBJU0NTSV9JQkZUX0gKICNkZWZpbmUgSVNDU0lfSUJGVF9ICiAKLXN0cnVjdCBpYmZ0X3RhYmxlX2hlYWRlciB7Ci0JY2hhciBzaWduYXR1cmVbNF07Ci0JdTMyIGxlbmd0aDsKLQl1OCByZXZpc2lvbjsKLQl1OCBjaGVja3N1bTsKLQljaGFyIG9lbV9pZFs2XTsKLQljaGFyIG9lbV90YWJsZV9pZFs4XTsKLQljaGFyIHJlc2VydmVkWzI0XTsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCiAvKgogICogTG9naWNhbCBsb2NhdGlvbiBvZiBpU0NTSSBCb290IEZvcm1hdCBUYWJsZS4KICAqIElmIHRoZSB2YWx1ZSBpcyBOVUxMIHRoZXJlIGlzIG5vIGlCRlQgb24gdGhlIG1hY2hpbmUuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgaWJmdF90YWJsZV9oZWFkZXIgKmliZnRfYWRkcjsKK2V4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9pYmZ0ICppYmZ0X2FkZHI7CiAKIC8qCiAgKiBSb3V0aW5lIHVzZWQgdG8gZmluZCBhbmQgcmVzZXJ2ZSB0aGUgaVNDU0kgQm9vdCBGb3JtYXQgVGFibGUuIFRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pc2RuaWYuaCBiL2luY2x1ZGUvbGludXgvaXNkbmlmLmgKaW5kZXggYjliNWE2OC4uYjhjMjNmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pc2RuaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oCkBAIC0zMTcsNyArMzE3LDcgQEAKIAlfX3U4IHJfc2NhbnRpbWU7CiAJX191OCByX2lkW0ZBWElETEVOXTsKIAlfX3U4IHJfY29kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgVDMwX3M7Cit9IF9fcGFja2VkIFQzMF9zOwogCiAjZGVmaW5lIElTRE5fVFRZX0ZBWF9DT05OX0lOCTAKICNkZWZpbmUgSVNETl9UVFlfRkFYX0NPTk5fT1VUCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamZmczIuaCBiL2luY2x1ZGUvbGludXgvamZmczIuaAppbmRleCAwODc0YWI1Li5lZGI5MjMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2pmZnMyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qZmZzMi5oCkBAIC0xODUsNyArMTg1LDcgQEAKIAlqaW50MzJfdCBoZHJfY3JjOwogCWppbnQzMl90IGlubzsJCS8qIGlub2RlIG51bWJlciAqLwogCWppbnQzMl90IHhpZDsJCS8qIFhBVFRSIGlkZW50aWZpZXIgbnVtYmVyICovCi0JamludDMyX3QgeHNlcW5vOwkvKiB4cmVmIHNlcXVlbmNpYWwgbnVtYmVyICovCisJamludDMyX3QgeHNlcW5vOwkvKiB4cmVmIHNlcXVlbnRpYWwgbnVtYmVyICovCiAJamludDMyX3Qgbm9kZV9jcmM7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tkYi5oIGIvaW5jbHVkZS9saW51eC9rZGIuaAppbmRleCBjY2IyYjNlLi5lYTZlNTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tkYi5oCisrKyBiL2luY2x1ZGUvbGludXgva2RiLmgKQEAgLTExNCw0ICsxMTQsOCBAQAogCUtEQl9JTklUX0VBUkxZLAogCUtEQl9JTklUX0ZVTEwsCiB9OworCitleHRlcm4gaW50IGtkYmdldGludGVudihjb25zdCBjaGFyICosIGludCAqKTsKK2V4dGVybiBpbnQga2RiX3NldChpbnQsIGNvbnN0IGNoYXIgKiopOworCiAjZW5kaWYJLyogIV9LREJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggODMxN2VjNC4uMzhlNDYyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0xNzEsNiArMTcxLDExIEBACiB9CiAjZW5kaWYKIAorc3RydWN0IHZhX2Zvcm1hdCB7CisJY29uc3QgY2hhciAqZm10OworCXZhX2xpc3QgKnZhOworfTsKKwogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBwYW5pY19ub3RpZmllcl9saXN0OwogZXh0ZXJuIGxvbmcgKCpwYW5pY19ibGluaykobG9uZyB0aW1lKTsKIE5PUkVUX1RZUEUgdm9pZCBwYW5pYyhjb25zdCBjaGFyICogZm10LCAuLi4pCkBAIC01MDgsOSArNTEzLDYgQEAKIGV4dGVybiB2b2lkIHRyYWNpbmdfc3RvcCh2b2lkKTsKIGV4dGVybiB2b2lkIGZ0cmFjZV9vZmZfcGVybWFuZW50KHZvaWQpOwogCi1leHRlcm4gdm9pZAotZnRyYWNlX3NwZWNpYWwodW5zaWduZWQgbG9uZyBhcmcxLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMyk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKIF9fX190cmFjZV9wcmludGtfY2hlY2tfZm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewpAQCAtNTg2LDggKzU4OCw2IEBACiAKIGV4dGVybiB2b2lkIGZ0cmFjZV9kdW1wKGVudW0gZnRyYWNlX2R1bXBfbW9kZSBvb3BzX2R1bXBfbW9kZSk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkCi1mdHJhY2Vfc3BlY2lhbCh1bnNpZ25lZCBsb25nIGFyZzEsIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50CiB0cmFjZV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKIApAQCAtNzI4LDEyICs3MjgsNiBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0jaWZuZGVmIF9fRVhQT1JURURfSEVBREVSU19fCi0jaWZuZGVmIF9fS0VSTkVMX18KLSN3YXJuaW5nIEF0dGVtcHQgdG8gdXNlIGtlcm5lbCBoZWFkZXJzIGZyb20gdXNlciBzcGFjZSwgc2VlIGh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZy9LZXJuZWxIZWFkZXJzCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotI2VuZGlmIC8qIF9fRVhQT1JURURfSEVBREVSU19fICovCi0KICNkZWZpbmUgU0lfTE9BRF9TSElGVAkxNgogc3RydWN0IHN5c2luZm8gewogCWxvbmcgdXB0aW1lOwkJCS8qIFNlY29uZHMgc2luY2UgYm9vdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZ2RiLmggYi9pbmNsdWRlL2xpbnV4L2tnZGIuaAppbmRleCA5MzQwZjM0Li5jYzk2ZjBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tnZGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tnZGIuaApAQCAtOTAsNiArOTAsMTkgQEAKIAllbnVtIGtnZGJfYnBzdGF0ZQlzdGF0ZTsKIH07CiAKK3N0cnVjdCBkYmdfcmVnX2RlZl90IHsKKwljaGFyICpuYW1lOworCWludCBzaXplOworCWludCBvZmZzZXQ7Cit9OworCisjaWZuZGVmIERCR19NQVhfUkVHX05VTQorI2RlZmluZSBEQkdfTUFYX1JFR19OVU0gMAorI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgZGJnX3JlZ19kZWZfdCBkYmdfcmVnX2RlZltdOworZXh0ZXJuIGNoYXIgKmRiZ19nZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gaW50IGRiZ19zZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKICNpZm5kZWYgS0dEQl9NQVhfQlJFQUtQT0lOVFMKICMgZGVmaW5lIEtHREJfTUFYX0JSRUFLUE9JTlRTCTEwMDAKICNlbmRpZgpAQCAtMjgxLDcgKzI5NCw3IEBACiBleHRlcm4gc3RydWN0IGtnZGJfaW8gKmRiZ19pb19vcHM7CiAKIGV4dGVybiBpbnQga2dkYl9oZXgybG9uZyhjaGFyICoqcHRyLCB1bnNpZ25lZCBsb25nICpsb25nX3ZhbCk7Ci1leHRlcm4gaW50IGtnZGJfbWVtMmhleChjaGFyICptZW0sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK2V4dGVybiBjaGFyICprZ2RiX21lbTJoZXgoY2hhciAqbWVtLCBjaGFyICpidWYsIGludCBjb3VudCk7CiBleHRlcm4gaW50IGtnZGJfaGV4Mm1lbShjaGFyICpidWYsIGNoYXIgKm1lbSwgaW50IGNvdW50KTsKIAogZXh0ZXJuIGludCBrZ2RiX2lzcmVtb3ZlZGJyZWFrKHVuc2lnbmVkIGxvbmcgYWRkcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oIGIvaW5jbHVkZS9saW51eC9rbWVtdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxNmQzOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBFZHVhcmQgLSBHYWJyaWVsIE11bnRlYW51Ci0gKgotICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIEdQTCB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfS01FTVRSQUNFX0gKLSNkZWZpbmUgX0xJTlVYX0tNRU1UUkFDRV9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgotCi0jaWZkZWYgQ09ORklHX0tNRU1UUkFDRQotZXh0ZXJuIHZvaWQga21lbXRyYWNlX2luaXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGttZW10cmFjZV9pbml0KHZvaWQpCi17Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9MSU5VWF9LTUVNVFJBQ0VfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tzODg0Mi5oIGIvaW5jbHVkZS9saW51eC9rczg4NDIuaAppbmRleCBkYTAzNDFiLi4xNGJhNDQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tzODg0Mi5oCisrKyBiL2luY2x1ZGUvbGludXgva3M4ODQyLmgKQEAgLTI1LDEwICsyNSwxNCBAQAogICogc3RydWN0IGtzODg0Ml9wbGF0Zm9ybV9kYXRhIC0gUGxhdGZvcm0gZGF0YSBvZiB0aGUgS1M4ODQyIG5ldHdvcmsgZHJpdmVyCiAgKiBAbWFjYWRkcjoJVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UsIHNldCB0byBhbGwgMDpzIHRvIHVzZSB0aGUgb24gaW4KICAqCQl0aGUgY2hpcC4KKyAqIEByeF9kbWFfY2hhbm5lbDoJVGhlIERNQSBjaGFubmVsIHRvIHVzZSBmb3IgUlgsIC0xIGZvciBub25lLgorICogQHR4X2RtYV9jaGFubmVsOglUaGUgRE1BIGNoYW5uZWwgdG8gdXNlIGZvciBUWCwgLTEgZm9yIG5vbmUuCiAgKgogICovCiBzdHJ1Y3Qga3M4ODQyX3BsYXRmb3JtX2RhdGEgewogCXU4IG1hY2FkZHJbRVRIX0FMRU5dOworCWludCByeF9kbWFfY2hhbm5lbDsKKwlpbnQgdHhfZG1hX2NoYW5uZWw7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtLmggYi9pbmNsdWRlL2xpbnV4L2t2bS5oCmluZGV4IDIzZWEwMjIuLjYzNmZjMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdm0uaApAQCAtNTI0LDYgKzUyNCwxMiBAQAogI2RlZmluZSBLVk1fQ0FQX1BQQ19PU0kgNTIKICNkZWZpbmUgS1ZNX0NBUF9QUENfVU5TRVRfSVJRIDUzCiAjZGVmaW5lIEtWTV9DQVBfRU5BQkxFX0NBUCA1NAorI2lmZGVmIF9fS1ZNX0hBVkVfWFNBVkUKKyNkZWZpbmUgS1ZNX0NBUF9YU0FWRSA1NQorI2VuZGlmCisjaWZkZWYgX19LVk1fSEFWRV9YQ1JTCisjZGVmaW5lIEtWTV9DQVBfWENSUyA1NgorI2VuZGlmCiAKICNpZmRlZiBLVk1fQ0FQX0lSUV9ST1VUSU5HCiAKQEAgLTYxMyw2ICs2MTksNyBAQAogICovCiAjZGVmaW5lIEtWTV9DUkVBVEVfVkNQVSAgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4NDEpCiAjZGVmaW5lIEtWTV9HRVRfRElSVFlfTE9HICAgICAgICAgX0lPVyhLVk1JTywgIDB4NDIsIHN0cnVjdCBrdm1fZGlydHlfbG9nKQorLyogS1ZNX1NFVF9NRU1PUllfQUxJQVMgaXMgb2Jzb2xldGU6ICovCiAjZGVmaW5lIEtWTV9TRVRfTUVNT1JZX0FMSUFTICAgICAgX0lPVyhLVk1JTywgIDB4NDMsIHN0cnVjdCBrdm1fbWVtb3J5X2FsaWFzKQogI2RlZmluZSBLVk1fU0VUX05SX01NVV9QQUdFUyAgICAgIF9JTyhLVk1JTywgICAweDQ0KQogI2RlZmluZSBLVk1fR0VUX05SX01NVV9QQUdFUyAgICAgIF9JTyhLVk1JTywgICAweDQ1KQpAQCAtNzE0LDYgKzcyMSwxMiBAQAogI2RlZmluZSBLVk1fR0VUX0RFQlVHUkVHUyAgICAgICAgIF9JT1IoS1ZNSU8sICAweGExLCBzdHJ1Y3Qga3ZtX2RlYnVncmVncykKICNkZWZpbmUgS1ZNX1NFVF9ERUJVR1JFR1MgICAgICAgICBfSU9XKEtWTUlPLCAgMHhhMiwgc3RydWN0IGt2bV9kZWJ1Z3JlZ3MpCiAjZGVmaW5lIEtWTV9FTkFCTEVfQ0FQICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4YTMsIHN0cnVjdCBrdm1fZW5hYmxlX2NhcCkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfWFNBVkUgKi8KKyNkZWZpbmUgS1ZNX0dFVF9YU0FWRQkJICBfSU9SKEtWTUlPLCAgMHhhNCwgc3RydWN0IGt2bV94c2F2ZSkKKyNkZWZpbmUgS1ZNX1NFVF9YU0FWRQkJICBfSU9XKEtWTUlPLCAgMHhhNSwgc3RydWN0IGt2bV94c2F2ZSkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfWENSUyAqLworI2RlZmluZSBLVk1fR0VUX1hDUlMJCSAgX0lPUihLVk1JTywgIDB4YTYsIHN0cnVjdCBrdm1feGNycykKKyNkZWZpbmUgS1ZNX1NFVF9YQ1JTCQkgIF9JT1coS1ZNSU8sICAweGE3LCBzdHJ1Y3Qga3ZtX3hjcnMpCiAKICNkZWZpbmUgS1ZNX0RFVl9BU1NJR05fRU5BQkxFX0lPTU1VCSgxIDw8IDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAppbmRleCA3Y2IxMTZhLi5jMTNjYzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCkBAIC04MSwxMyArODEsMTQgQEAKIAlpbnQgdmNwdV9pZDsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJaW50ICAgY3B1OworCWF0b21pY190IGd1ZXN0X21vZGU7CiAJc3RydWN0IGt2bV9ydW4gKnJ1bjsKIAl1bnNpZ25lZCBsb25nIHJlcXVlc3RzOwogCXVuc2lnbmVkIGxvbmcgZ3Vlc3RfZGVidWc7CiAJaW50IHNyY3VfaWR4OwogCiAJaW50IGZwdV9hY3RpdmU7Ci0JaW50IGd1ZXN0X2ZwdV9sb2FkZWQ7CisJaW50IGd1ZXN0X2ZwdV9sb2FkZWQsIGd1ZXN0X3hjcjBfbG9hZGVkOwogCXdhaXRfcXVldWVfaGVhZF90IHdxOwogCWludCBzaWdzZXRfYWN0aXZlOwogCXNpZ3NldF90IHNpZ3NldDsKQEAgLTEyMyw2ICsxMjQsNyBAQAogCX0gKmxwYWdlX2luZm9bS1ZNX05SX1BBR0VfU0laRVMgLSAxXTsKIAl1bnNpZ25lZCBsb25nIHVzZXJzcGFjZV9hZGRyOwogCWludCB1c2VyX2FsbG9jOworCWludCBpZDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdm1fZGlydHlfYml0bWFwX2J5dGVzKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpCkBAIC0yNjYsNiArMjY4LDggQEAKIAogaW50IGlzX2Vycm9yX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogaW50IGlzX2Vycm9yX3BmbihwZm5fdCBwZm4pOworaW50IGlzX2h3cG9pc29uX3BmbihwZm5fdCBwZm4pOworaW50IGlzX2ZhdWx0X3BmbihwZm5fdCBwZm4pOwogaW50IGt2bV9pc19lcnJvcl9odmEodW5zaWduZWQgbG9uZyBhZGRyKTsKIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAogCQkJICBzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0sCkBAIC0yODQsOCArMjg4LDYgQEAKIAkJCQlpbnQgdXNlcl9hbGxvYyk7CiB2b2lkIGt2bV9kaXNhYmxlX2xhcmdlcGFnZXModm9pZCk7CiB2b2lkIGt2bV9hcmNoX2ZsdXNoX3NoYWRvdyhzdHJ1Y3Qga3ZtICprdm0pOwotZ2ZuX3QgdW5hbGlhc19nZm4oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pOwotZ2ZuX3QgdW5hbGlhc19nZm5faW5zdGFudGlhdGlvbihzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7CiAKIHN0cnVjdCBwYWdlICpnZm5fdG9fcGFnZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7CiB1bnNpZ25lZCBsb25nIGdmbl90b19odmEoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pOwpAQCAtNDQ1LDcgKzQ0Nyw4IEBACiAJCQkJICAgIHN0cnVjdCBrdm1faXJxX21hc2tfbm90aWZpZXIgKmtpbW4pOwogdm9pZCBrdm1fdW5yZWdpc3Rlcl9pcnFfbWFza19ub3RpZmllcihzdHJ1Y3Qga3ZtICprdm0sIGludCBpcnEsCiAJCQkJICAgICAgc3RydWN0IGt2bV9pcnFfbWFza19ub3RpZmllciAqa2ltbik7Ci12b2lkIGt2bV9maXJlX21hc2tfbm90aWZpZXJzKHN0cnVjdCBrdm0gKmt2bSwgaW50IGlycSwgYm9vbCBtYXNrKTsKK3ZvaWQga3ZtX2ZpcmVfbWFza19ub3RpZmllcnMoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpcnFjaGlwLCB1bnNpZ25lZCBwaW4sCisJCQkgICAgIGJvb2wgbWFzayk7CiAKICNpZmRlZiBfX0tWTV9IQVZFX0lPQVBJQwogdm9pZCBrdm1fZ2V0X2ludHJfZGVsaXZlcnlfYml0bWFzayhzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLApAQCAtNTYyLDEwICs1NjUsNiBAQAogfQogI2VuZGlmCiAKLSNpZm5kZWYgS1ZNX0FSQ0hfSEFTX1VOQUxJQVNfSU5TVEFOVElBVElPTgotI2RlZmluZSB1bmFsaWFzX2dmbl9pbnN0YW50aWF0aW9uIHVuYWxpYXNfZ2ZuCi0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19IQVZFX0tWTV9JUlFDSElQCiAKICNkZWZpbmUgS1ZNX01BWF9JUlFfUk9VVEVTIDEwMjQKQEAgLTYyOCw1ICs2MjcsMjUgQEAKIAogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fbWFrZV9yZXF1ZXN0KGludCByZXEsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzZXRfYml0KHJlcSwgJnZjcHUtPnJlcXVlc3RzKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGt2bV9tYWtlX2NoZWNrX3JlcXVlc3QoaW50IHJlcSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KHJlcSwgJnZjcHUtPnJlcXVlc3RzKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGt2bV9jaGVja19yZXF1ZXN0KGludCByZXEsIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAodGVzdF9iaXQocmVxLCAmdmNwdS0+cmVxdWVzdHMpKSB7CisJCWNsZWFyX2JpdChyZXEsICZ2Y3B1LT5yZXF1ZXN0cyk7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9rdm1fdHlwZXMuaAppbmRleCBmYjQ2ZWZiLi43YWMwZDRlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bV90eXBlcy5oCkBAIC0zMiwxMSArMzIsMTEgQEAKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nICBndmFfdDsKIHR5cGVkZWYgdTY0ICAgICAgICAgICAgZ3BhX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGdmbl90OwordHlwZWRlZiB1NjQgICAgICAgICAgICBnZm5fdDsKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nICBodmFfdDsKIHR5cGVkZWYgdTY0ICAgICAgICAgICAgaHBhX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGhmbl90OwordHlwZWRlZiB1NjQgICAgICAgICAgICBoZm5fdDsKIAogdHlwZWRlZiBoZm5fdCBwZm5fdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9scnVfY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvbHJ1X2NhY2hlLmgKaW5kZXggZGU0OGQxNi4uNzhmYmYyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9scnVfY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xydV9jYWNoZS5oCkBAIC0yNjIsNyArMjYyLDcgQEAKICAqIEBsYzogdGhlIGxydSBjYWNoZSB0byBvcGVyYXRlIG9uCiAgKgogICogTm90ZSB0aGF0IHRoZSByZWZlcmVuY2UgY291bnRzIGFuZCBvcmRlciBvbiB0aGUgYWN0aXZlIGFuZCBscnUgbGlzdHMgbWF5Ci0gKiBzdGlsbCBjaGFuZ2UuICBSZXR1cm5zIHRydWUgaWYgd2UgYXF1aXJlZCB0aGUgbG9jay4KKyAqIHN0aWxsIGNoYW5nZS4gIFJldHVybnMgdHJ1ZSBpZiB3ZSBhY3F1aXJlZCB0aGUgbG9jay4KICAqLwogc3RhdGljIGlubGluZSBpbnQgbGNfdHJ5X2xvY2soc3RydWN0IGxydV9jYWNoZSAqbGMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9sc21fYXVkaXQuaAppbmRleCA2OTA3MjUxLi4xMTJhNTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbHNtX2F1ZGl0LmgKQEAgLTkwLDEwICs5MCw0MiBAQAogCQkJdTMyIHJlcXVlc3RlZDsKIAkJCXUzMiBhdWRpdGVkOwogCQkJdTMyIGRlbmllZDsKKwkJCS8qCisJCQkgKiBhdWRpdGRlbnkgaXMgYSBiaXQgdHJpY2t5IGFuZCB1bmludHVpdGl2ZS4gIFNlZSB0aGUKKwkJCSAqIGNvbW1lbnRzIGluIGF2Yy5jIGZvciBpdCdzIG1lYW5pbmcgYW5kIHVzYWdlLgorCQkJICovCisJCQl1MzIgYXVkaXRkZW55OwogCQkJc3RydWN0IGF2X2RlY2lzaW9uICphdmQ7CiAJCQlpbnQgcmVzdWx0OwogCQl9IHNlbGludXhfYXVkaXRfZGF0YTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19TRUNVUklUWV9BUFBBUk1PUgorCQlzdHJ1Y3QgeworCQkJaW50IGVycm9yOworCQkJaW50IG9wOworCQkJaW50IHR5cGU7CisJCQl2b2lkICpwcm9maWxlOworCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCWNvbnN0IGNoYXIgKmluZm87CisJCQl1bmlvbiB7CisJCQkJdm9pZCAqdGFyZ2V0OworCQkJCXN0cnVjdCB7CisJCQkJCWxvbmcgcG9zOworCQkJCQl2b2lkICp0YXJnZXQ7CisJCQkJfSBpZmFjZTsKKwkJCQlzdHJ1Y3QgeworCQkJCQlpbnQgcmxpbTsKKwkJCQkJdW5zaWduZWQgbG9uZyBtYXg7CisJCQkJfSBybGltOworCQkJCXN0cnVjdCB7CisJCQkJCWNvbnN0IGNoYXIgKnRhcmdldDsKKwkJCQkJdTMyIHJlcXVlc3Q7CisJCQkJCXUzMiBkZW5pZWQ7CisJCQkJCXVpZF90IG91aWQ7CisJCQkJfSBmczsKKwkJCX07CisJCX0gYXBwYXJtb3JfYXVkaXRfZGF0YTsKKyNlbmRpZgogCX07CiAJLyogdGhlc2UgY2FsbGJhY2sgd2lsbCBiZSBpbXBsZW1lbnRlZCBieSBhIHNwZWNpZmljIExTTSAqLwogCXZvaWQgKCpsc21fcHJlX2F1ZGl0KShzdHJ1Y3QgYXVkaXRfYnVmZmVyICosIHZvaWQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21JU0ROaWYuaCBiL2luY2x1ZGUvbGludXgvbUlTRE5pZi5oCmluZGV4IDc4YzNiZWQuLmI1ZTdmMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbUlTRE5pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvbUlTRE5pZi5oCkBAIC0yNTEsNyArMjUxLDcgQEAKIHN0cnVjdCBtSVNETmhlYWQgewogCXVuc2lnbmVkIGludAlwcmltOwogCXVuc2lnbmVkIGludAlpZDsKLX0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSAgX19wYWNrZWQ7CiAKICNkZWZpbmUgTUlTRE5fSEVBREVSX0xFTglzaXplb2Yoc3RydWN0IG1JU0ROaGVhZCkKICNkZWZpbmUgTUFYX0RBVEFfU0laRQkJMjA0OApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYXJ2ZWxsX3BoeS5oIGIvaW5jbHVkZS9saW51eC9tYXJ2ZWxsX3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjA4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21hcnZlbGxfcGh5LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfTUFSVkVMTF9QSFlfSAorI2RlZmluZSBfTUFSVkVMTF9QSFlfSAorCisvKiBNYXNrIHVzZWQgZm9yIElEIGNvbXBhcmlzb25zICovCisjZGVmaW5lIE1BUlZFTExfUEhZX0lEX01BU0sJCTB4ZmZmZmZmZjAKKworLyogS25vd24gUEhZIElEcyAqLworI2RlZmluZSBNQVJWRUxMX1BIWV9JRF84OEUxMTAxCQkweDAxNDEwYzYwCisjZGVmaW5lIE1BUlZFTExfUEhZX0lEXzg4RTExMTIJCTB4MDE0MTBjOTAKKyNkZWZpbmUgTUFSVkVMTF9QSFlfSURfODhFMTExMQkJMHgwMTQxMGNjMAorI2RlZmluZSBNQVJWRUxMX1BIWV9JRF84OEUxMTE4CQkweDAxNDEwZTEwCisjZGVmaW5lIE1BUlZFTExfUEhZX0lEXzg4RTExMjFSCQkweDAxNDEwY2IwCisjZGVmaW5lIE1BUlZFTExfUEhZX0lEXzg4RTExNDUJCTB4MDE0MTBjZDAKKyNkZWZpbmUgTUFSVkVMTF9QSFlfSURfODhFMTI0MAkJMHgwMTQxMGUzMAorI2RlZmluZSBNQVJWRUxMX1BIWV9JRF84OEVDMDQ4CQkweDAxNDEwZTkwCisKKy8qIHN0cnVjdCBwaHlfZGV2aWNlIGRldl9mbGFncyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNQVJWRUxMX1BIWV9NMTE0NV9GTEFHU19SRVNJU1RBTkNFCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFSVkVMTF9QSFlfTTExMThfRE5TMzIzX0xFRFMJCTB4MDAwMDAwMDIKKworI2VuZGlmIC8qIF9NQVJWRUxMX1BIWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYTJiNDgwNC4uN2E5YWI3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTQ2NSw2ICsxNDY1LDE0IEBACiBleHRlcm4gdm9pZCBzaGFrZV9wYWdlKHN0cnVjdCBwYWdlICpwLCBpbnQgYWNjZXNzKTsKIGV4dGVybiBhdG9taWNfbG9uZ190IG1jZV9iYWRfcGFnZXM7CiBleHRlcm4gaW50IHNvZnRfb2ZmbGluZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgZmxhZ3MpOworI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQoraW50IGlzX2h3cG9pc29uX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpc19od3BvaXNvbl9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiBleHRlcm4gdm9pZCBkdW1wX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zaS5oIGIvaW5jbHVkZS9saW51eC9tc2kuaAppbmRleCA2OTkxYWI1Li45MWIwNWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNpLmgKQEAgLTE0LDggKzE0LDEwIEBACiBleHRlcm4gdm9pZCBtYXNrX21zaV9pcnEodW5zaWduZWQgaW50IGlycSk7CiBleHRlcm4gdm9pZCB1bm1hc2tfbXNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIHJlYWRfbXNpX21zZ19kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZyk7CitleHRlcm4gdm9pZCBnZXRfY2FjaGVkX21zaV9tc2dfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBtc2lfbXNnICptc2cpOwogZXh0ZXJuIHZvaWQgd3JpdGVfbXNpX21zZ19kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZyk7CiBleHRlcm4gdm9pZCByZWFkX21zaV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IG1zaV9tc2cgKm1zZyk7CitleHRlcm4gdm9pZCBnZXRfY2FjaGVkX21zaV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IG1zaV9tc2cgKm1zZyk7CiBleHRlcm4gdm9pZCB3cml0ZV9tc2lfbXNnKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBtc2lfbXNnICptc2cpOwogCiBzdHJ1Y3QgbXNpX2Rlc2MgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYmQuaCBiL2luY2x1ZGUvbGludXgvbmJkLmgKaW5kZXggMTU1NzE5ZC4uYmI1ODg1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25iZC5oCkBAIC04OCw3ICs4OCw3IEBACiAJY2hhciBoYW5kbGVbOF07CiAJX19iZTY0IGZyb207CiAJX19iZTMyIGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFRoaXMgaXMgdGhlIHJlcGx5IHBhY2tldCB0aGF0IG5iZC1zZXJ2ZXIgc2VuZHMgYmFjayB0byB0aGUgY2xpZW50IGFmdGVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25jcC5oIGIvaW5jbHVkZS9saW51eC9uY3AuaAppbmRleCA5OWYwYWRlLi4zYWNlODM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25jcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmNwLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAlfX3U4IGNvbm5faGlnaDsKIAlfX3U4IGZ1bmN0aW9uOwogCV9fdTggZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIE5DUF9SRVBMWSAgICAgICAgICAgICAgICAoMHgzMzMzKQogI2RlZmluZSBOQ1BfV0FUQ0hET0cJCSAoMHgzRTNFKQpAQCAtNDIsNyArNDIsNyBAQAogCV9fdTggY29tcGxldGlvbl9jb2RlOwogCV9fdTggY29ubmVjdGlvbl9zdGF0ZTsKIAlfX3U4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBOQ1BfVk9MTkFNRV9MRU4gKDE2KQogI2RlZmluZSBOQ1BfTlVNQkVSX09GX1ZPTFVNRVMgKDI1NikKQEAgLTE1OCw3ICsxNTgsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAlzdHJ1Y3QgbndfbmZzX2luZm8gbmZzOwogI2VuZGlmCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogbW9kaWZ5IG1hc2sgLSB1c2Ugd2l0aCBNT0RJRllfRE9TX0lORk8gc3RydWN0dXJlICovCiAjZGVmaW5lIERNX0FUVFJJQlVURVMJCSAgKGNwdV90b19sZTMyKDB4MDIpKQpAQCAtMTkwLDEyICsxOTAsMTIgQEAKIAlfX3UxNiBpbmhlcml0YW5jZUdyYW50TWFzazsKIAlfX3UxNiBpbmhlcml0YW5jZVJldm9rZU1hc2s7CiAJX191MzIgbWF4aW11bVNwYWNlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgewogCV9fdTggdm9sTnVtYmVyOwogCV9fdTMyIGRpckJhc2U7CiAJX191MzIgc2VxdWVuY2U7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2VuZGlmCQkJCS8qIF9MSU5VWF9OQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3BfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmNwX2ZzX3NiLmgKaW5kZXggNWVjOWNhNi4uOGRhMDViYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3BfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcF9mc19zYi5oCkBAIC0xMDQsMTMgKzEwNCwxMyBAQAogCiAJCXVuc2lnbmVkIGludCBzdGF0ZTsJCS8qIFNUUkVBTSBvbmx5OiByZWNlaXZlciBzdGF0ZSAqLwogCQlzdHJ1Y3QgewotCQkJX191MzIgbWFnaWMgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JCQlfX3UzMiBsZW4gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JCQlfX3UxNiB0eXBlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCQkJX191MTYgcDEgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JCQlfX3UxNiBwMiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQkJCV9fdTE2IHAzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCQkJX191MTYgdHlwZTIgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJCQlfX3UzMiBtYWdpYyBfX3BhY2tlZDsKKwkJCV9fdTMyIGxlbiBfX3BhY2tlZDsKKwkJCV9fdTE2IHR5cGUgX19wYWNrZWQ7CisJCQlfX3UxNiBwMSBfX3BhY2tlZDsKKwkJCV9fdTE2IHAyIF9fcGFja2VkOworCQkJX191MTYgcDMgX19wYWNrZWQ7CisJCQlfX3UxNiB0eXBlMiBfX3BhY2tlZDsKIAkJfSBidWY7CQkJCS8qIFNUUkVBTSBvbmx5OiB0ZW1wb3JhcnkgYnVmZmVyICovCiAJCXVuc2lnbmVkIGNoYXIqIHB0cjsJCS8qIFNUUkVBTSBvbmx5OiBwb2ludGVyIHRvIGRhdGEgKi8KIAkJc2l6ZV90IGxlbjsJCQkvKiBTVFJFQU0gb25seTogbGVuZ3RoIG9mIGRhdGEgdG8gcmVjZWl2ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggYjIxZTQwNS4uNDZjMzZmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC01NCw2ICs1NCw3IEBACiAKIHN0cnVjdCB2bGFuX2dyb3VwOwogc3RydWN0IG5ldHBvbGxfaW5mbzsKK3N0cnVjdCBwaHlfZGV2aWNlOwogLyogODAyLjExIHNwZWNpZmljICovCiBzdHJ1Y3Qgd2lyZWxlc3NfZGV2OwogCQkJCQkvKiBzb3VyY2UgYmFjay1jb21wYXQgaG9va3MgKi8KQEAgLTY1LDYgKzY2LDExIEBACiAjZGVmaW5lIEhBVkVfRlJFRV9ORVRERVYJCS8qIGZyZWVfbmV0ZGV2KCkgKi8KICNkZWZpbmUgSEFWRV9ORVRERVZfUFJJVgkJLyogbmV0ZGV2X3ByaXYoKSAqLwogCisvKiBoYXJkd2FyZSBhZGRyZXNzIGFzc2lnbm1lbnQgdHlwZXMgKi8KKyNkZWZpbmUgTkVUX0FERFJfUEVSTQkJMAkvKiBhZGRyZXNzIGlzIHBlcm1hbmVudCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgTkVUX0FERFJfUkFORE9NCQkxCS8qIGFkZHJlc3MgaXMgZ2VuZXJhdGVkIHJhbmRvbWx5ICovCisjZGVmaW5lIE5FVF9BRERSX1NUT0xFTgkJMgkvKiBhZGRyZXNzIGlzIHN0b2xlbiBmcm9tIG90aGVyIGRldmljZSAqLworCiAvKiBCYWNrbG9nIGNvbmdlc3Rpb24gbGV2ZWxzICovCiAjZGVmaW5lIE5FVF9SWF9TVUNDRVNTCQkwCS8qIGtlZXAgJ2VtIGNvbWluZywgYmFieSAqLwogI2RlZmluZSBORVRfUlhfRFJPUAkJMQkvKiBwYWNrZXQgZHJvcHBlZCAqLwpAQCAtMTU5LDQ1ICsxNjUsMzkgQEAKICNkZWZpbmUgTUFYX0hFQURFUiAoTExfTUFYX0hFQURFUiArIDQ4KQogI2VuZGlmCiAKLSNlbmRpZiAgLyogIF9fS0VSTkVMX18gICovCi0KIC8qCi0gKglOZXR3b3JrIGRldmljZSBzdGF0aXN0aWNzLiBBa2luIHRvIHRoZSAyLjAgZXRoZXIgc3RhdHMgYnV0Ci0gKgl3aXRoIGJ5dGUgY291bnRlcnMuCisgKglPbGQgbmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcy4gRmllbGRzIGFyZSBuYXRpdmUgd29yZHMKKyAqCSh1bnNpZ25lZCBsb25nKSBzbyB0aGV5IGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGF0b21pY2FsbHkuCiAgKi8KIAogc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcJcnhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQJKi8KLQl1bnNpZ25lZCBsb25nCXR4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkCSovCi0JdW5zaWduZWQgbG9uZwlyeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIAkqLwotCXVuc2lnbmVkIGxvbmcJdHhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZAkqLwotCXVuc2lnbmVkIGxvbmcJcnhfZXJyb3JzOwkJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCi0JdW5zaWduZWQgbG9uZwl0eF9lcnJvcnM7CQkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KLQl1bnNpZ25lZCBsb25nCXJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCi0JdW5zaWduZWQgbG9uZwl0eF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCi0JdW5zaWduZWQgbG9uZwltdWx0aWNhc3Q7CQkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCXVuc2lnbmVkIGxvbmcJcnhfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nCXR4X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZwlyeF9ieXRlczsKKwl1bnNpZ25lZCBsb25nCXR4X2J5dGVzOworCXVuc2lnbmVkIGxvbmcJcnhfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJdHhfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJcnhfZHJvcHBlZDsKKwl1bnNpZ25lZCBsb25nCXR4X2Ryb3BwZWQ7CisJdW5zaWduZWQgbG9uZwltdWx0aWNhc3Q7CiAJdW5zaWduZWQgbG9uZwljb2xsaXNpb25zOwotCi0JLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLwogCXVuc2lnbmVkIGxvbmcJcnhfbGVuZ3RoX2Vycm9yczsKLQl1bnNpZ25lZCBsb25nCXJ4X292ZXJfZXJyb3JzOwkJLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CSovCi0JdW5zaWduZWQgbG9uZwlyeF9jcmNfZXJyb3JzOwkJLyogcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvcgkqLwotCXVuc2lnbmVkIGxvbmcJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCi0JdW5zaWduZWQgbG9uZwlyeF9maWZvX2Vycm9yczsJCS8qIHJlY3YnciBmaWZvIG92ZXJydW4JCSovCi0JdW5zaWduZWQgbG9uZwlyeF9taXNzZWRfZXJyb3JzOwkvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0CSovCi0KLQkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nCXJ4X292ZXJfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJcnhfY3JjX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXJ4X2ZyYW1lX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXJ4X2ZpZm9fZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJcnhfbWlzc2VkX2Vycm9yczsKIAl1bnNpZ25lZCBsb25nCXR4X2Fib3J0ZWRfZXJyb3JzOwogCXVuc2lnbmVkIGxvbmcJdHhfY2Fycmllcl9lcnJvcnM7CiAJdW5zaWduZWQgbG9uZwl0eF9maWZvX2Vycm9yczsKIAl1bnNpZ25lZCBsb25nCXR4X2hlYXJ0YmVhdF9lcnJvcnM7CiAJdW5zaWduZWQgbG9uZwl0eF93aW5kb3dfZXJyb3JzOwotCQotCS8qIGZvciBjc2xpcCBldGMgKi8KIAl1bnNpZ25lZCBsb25nCXJ4X2NvbXByZXNzZWQ7CiAJdW5zaWduZWQgbG9uZwl0eF9jb21wcmVzc2VkOwogfTsKIAorI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwogCiAvKiBNZWRpYSBzZWxlY3Rpb24gb3B0aW9ucy4gKi8KIGVudW0gewpAQCAtMzgxLDYgKzM4MSw4IEBACiB9OwogdHlwZWRlZiBlbnVtIGdyb19yZXN1bHQgZ3JvX3Jlc3VsdF90OwogCit0eXBlZGVmIHN0cnVjdCBza19idWZmICpyeF9oYW5kbGVyX2Z1bmNfdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwogZXh0ZXJuIHZvaWQgX19uYXBpX3NjaGVkdWxlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5hcGlfZGlzYWJsZV9wZW5kaW5nKHN0cnVjdCBuYXBpX3N0cnVjdCAqbikKQEAgLTUwNCw5ICs1MDYsOSBAQAogCSAqIHBsZWFzZSB1c2UgdGhpcyBmaWVsZCBpbnN0ZWFkIG9mIGRldi0+dHJhbnNfc3RhcnQKIAkgKi8KIAl1bnNpZ25lZCBsb25nCQl0cmFuc19zdGFydDsKLQl1bnNpZ25lZCBsb25nCQl0eF9ieXRlczsKLQl1bnNpZ25lZCBsb25nCQl0eF9wYWNrZXRzOwotCXVuc2lnbmVkIGxvbmcJCXR4X2Ryb3BwZWQ7CisJdTY0CQkJdHhfYnl0ZXM7CisJdTY0CQkJdHhfcGFja2V0czsKKwl1NjQJCQl0eF9kcm9wcGVkOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiAjaWZkZWYgQ09ORklHX1JQUwpAQCAtNjYwLDEwICs2NjIsMTkgQEAKICAqCUNhbGxiYWNrIHVzZXMgd2hlbiB0aGUgdHJhbnNtaXR0ZXIgaGFzIG5vdCBtYWRlIGFueSBwcm9ncmVzcwogICoJZm9yIGRldi0+d2F0Y2hkb2cgdGlja3MuCiAgKgorICogc3RydWN0IHJ0bmxfbGlua19zdGF0czY0KiAoKm5kb19nZXRfc3RhdHM2NCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RvcmFnZSk7CiAgKiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogKCpuZG9fZ2V0X3N0YXRzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICAqCUNhbGxlZCB3aGVuIGEgdXNlciB3YW50cyB0byBnZXQgdGhlIG5ldHdvcmsgZGV2aWNlIHVzYWdlCi0gKglzdGF0aXN0aWNzLiBJZiBub3QgZGVmaW5lZCwgdGhlIGNvdW50ZXJzIGluIGRldi0+c3RhdHMgd2lsbAotICoJYmUgdXNlZC4KKyAqCXN0YXRpc3RpY3MuIERyaXZlcnMgbXVzdCBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqCTEuIERlZmluZSBAbmRvX2dldF9zdGF0czY0IHRvIGZpbGwgaW4gYSB6ZXJvLWluaXRpYWxpc2VkCisgKgkgICBydG5sX2xpbmtfc3RhdHM2NCBzdHJ1Y3R1cmUgcGFzc2VkIGJ5IHRoZSBjYWxsZXIuCisgKgkyLiBEZWZpbmUgQG5kb19nZXRfc3RhdHMgdG8gdXBkYXRlIGEgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUKKyAqCSAgICh3aGljaCBzaG91bGQgbm9ybWFsbHkgYmUgZGV2LT5zdGF0cykgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8KKyAqCSAgIGl0LiBUaGUgc3RydWN0dXJlIG1heSBiZSBjaGFuZ2VkIGFzeW5jaHJvbm91c2x5IG9ubHkgaWYgZWFjaAorICoJICAgZmllbGQgaXMgd3JpdHRlbiBhdG9taWNhbGx5LgorICoJMy4gVXBkYXRlIGRldi0+c3RhdHMgYXN5bmNocm9ub3VzbHkgYW5kIGF0b21pY2FsbHksIGFuZCBkZWZpbmUKKyAqCSAgIG5laXRoZXIgb3BlcmF0aW9uLgogICoKICAqIHZvaWQgKCpuZG9fdmxhbl9yeF9yZWdpc3Rlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCk7CiAgKglJZiBkZXZpY2Ugc3VwcG9ydCBWTEFOIHJlY2VpdmUgYWNjbGVyYXRpb24KQEAgLTcxOCw2ICs3MjksOCBAQAogCQkJCQkJICAgc3RydWN0IG5laWdoX3Bhcm1zICopOwogCXZvaWQJCQkoKm5kb190eF90aW1lb3V0KSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQqICgqbmRvX2dldF9zdGF0czY0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiAoKm5kb19nZXRfc3RhdHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAJdm9pZAkJCSgqbmRvX3ZsYW5fcnhfcmVnaXN0ZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC03MjgsNiArNzQxLDggQEAKIAkJCQkJCSAgICAgICAgdW5zaWduZWQgc2hvcnQgdmlkKTsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCXZvaWQgICAgICAgICAgICAgICAgICAgICgqbmRvX3BvbGxfY29udHJvbGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJaW50CQkJKCpuZG9fbmV0cG9sbF9zZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICAgc3RydWN0IG5ldHBvbGxfaW5mbyAqaW5mbyk7CiAJdm9pZAkJCSgqbmRvX25ldHBvbGxfY2xlYW51cCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjZW5kaWYKIAlpbnQJCQkoKm5kb19zZXRfdmZfbWFjKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNzc1LDExICs3OTAsMTEgQEAKIAkvKgogCSAqIFRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSAidmlzaWJsZSIgcGFydCBvZiB0aGlzIHN0cnVjdHVyZQogCSAqIChpLmUuIGFzIHNlZW4gYnkgdXNlcnMgaW4gdGhlICJTcGFjZS5jIiBmaWxlKS4gIEl0IGlzIHRoZSBuYW1lCi0JICogdGhlIGludGVyZmFjZS4KKwkgKiBvZiB0aGUgaW50ZXJmYWNlLgogCSAqLwogCWNoYXIJCQluYW1lW0lGTkFNU0laXTsKIAotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICpwbV9xb3NfcmVxOworCXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0IHBtX3Fvc19yZXE7CiAKIAkvKiBkZXZpY2UgbmFtZSBoYXNoIGNoYWluICovCiAJc3RydWN0IGhsaXN0X25vZGUJbmFtZV9obGlzdDsKQEAgLTg0Nyw3ICs4NjIsOCBAQAogI2RlZmluZSBORVRJRl9GX0ZTTwkJKFNLQl9HU09fRkNPRSA8PCBORVRJRl9GX0dTT19TSElGVCkKIAogCS8qIExpc3Qgb2YgZmVhdHVyZXMgd2l0aCBzb2Z0d2FyZSBmYWxsYmFja3MuICovCi0jZGVmaW5lIE5FVElGX0ZfR1NPX1NPRlRXQVJFCShORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTiB8IE5FVElGX0ZfVFNPNikKKyNkZWZpbmUgTkVUSUZfRl9HU09fU09GVFdBUkUJKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU09fRUNOIHwgXAorCQkJCSBORVRJRl9GX1RTTzYgfCBORVRJRl9GX1VGTykKIAogCiAjZGVmaW5lIE5FVElGX0ZfR0VOX0NTVU0JKE5FVElGX0ZfTk9fQ1NVTSB8IE5FVElGX0ZfSFdfQ1NVTSkKQEAgLTkwOCw2ICs5MjQsNyBAQAogCiAJLyogSW50ZXJmYWNlIGFkZHJlc3MgaW5mby4gKi8KIAl1bnNpZ25lZCBjaGFyCQlwZXJtX2FkZHJbTUFYX0FERFJfTEVOXTsgLyogcGVybWFuZW50IGh3IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyCQlhZGRyX2Fzc2lnbl90eXBlOyAvKiBodyBhZGRyZXNzIGFzc2lnbm1lbnQgdHlwZSAqLwogCXVuc2lnbmVkIGNoYXIJCWFkZHJfbGVuOwkvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aAkqLwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGRldl9pZDsJCS8qIGZvciBzaGFyZWQgbmV0d29yayBjYXJkcyAqLwogCkBAIC05NTcsNiArOTc0LDggQEAKICNlbmRpZgogCiAJc3RydWN0IG5ldGRldl9xdWV1ZQlyeF9xdWV1ZTsKKwlyeF9oYW5kbGVyX2Z1bmNfdAkqcnhfaGFuZGxlcjsKKwl2b2lkCQkJKnJ4X2hhbmRsZXJfZGF0YTsKIAogCXN0cnVjdCBuZXRkZXZfcXVldWUJKl90eCBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCkBAIC0xMDI0LDEwICsxMDQzLDYgQEAKIAkvKiBtaWQtbGF5ZXIgcHJpdmF0ZSAqLwogCXZvaWQJCQkqbWxfcHJpdjsKIAotCS8qIGJyaWRnZSBzdHVmZiAqLwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQJKmJyX3BvcnQ7Ci0JLyogbWFjdmxhbiAqLwotCXN0cnVjdCBtYWN2bGFuX3BvcnQJKm1hY3ZsYW5fcG9ydDsKIAkvKiBHQVJQICovCiAJc3RydWN0IGdhcnBfcG9ydAkqZ2FycF9wb3J0OwogCkBAIC0xMDU3LDYgKzEwNzIsOSBAQAogI2VuZGlmCiAJLyogbi10dXBsZSBmaWx0ZXIgbGlzdCBhdHRhY2hlZCB0byB0aGlzIGRldmljZSAqLwogCXN0cnVjdCBldGh0b29sX3J4X250dXBsZV9saXN0IGV0aHRvb2xfbnR1cGxlX2xpc3Q7CisKKwkvKiBwaHkgZGV2aWNlIG1heSBhdHRhY2ggaXRzZWxmIGZvciBoYXJkd2FyZSB0aW1lc3RhbXBpbmcgKi8KKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogfTsKICNkZWZpbmUgdG9fbmV0X2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG5ldF9kZXZpY2UsIGRldikKIApAQCAtMTA4NywxMSArMTEwNSw3IEBACiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3QgbmV0ICpkZXZfbmV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJldHVybiBkZXYtPm5kX25ldDsKLSNlbHNlCi0JcmV0dXJuICZpbml0X25ldDsKLSNlbmRpZgorCXJldHVybiByZWFkX3BuZXQoJmRldi0+bmRfbmV0KTsKIH0KIAogc3RhdGljIGlubGluZQpAQCAtMTI3Miw4ICsxMjg2LDggQEAKIGV4dGVybiB2b2lkCQlkZXZfcmVtb3ZlX3BhY2soc3RydWN0IHBhY2tldF90eXBlICpwdCk7CiBleHRlcm4gdm9pZAkJX19kZXZfcmVtb3ZlX3BhY2soc3RydWN0IHBhY2tldF90eXBlICpwdCk7CiAKLWV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2X2dldF9ieV9mbGFncyhzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAotCQkJCQkJICB1bnNpZ25lZCBzaG9ydCBtYXNrKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2X2dldF9ieV9mbGFnc19yY3Uoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBzaG9ydCBmbGFncywKKwkJCQkJCSAgICAgIHVuc2lnbmVkIHNob3J0IG1hc2spOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXZfZ2V0X2J5X25hbWUoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2X2dldF9ieV9uYW1lX3JjdShzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlCSpfX2Rldl9nZXRfYnlfbmFtZShzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMTY5Niw2ICsxNzEwLDExIEBACiAJbmFwaS0+c2tiID0gTlVMTDsKIH0KIAorZXh0ZXJuIGludCBuZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHJ4X2hhbmRsZXJfZnVuY190ICpyeF9oYW5kbGVyLAorCQkJCSAgICAgIHZvaWQgKnJ4X2hhbmRsZXJfZGF0YSk7CitleHRlcm4gdm9pZCBuZXRkZXZfcnhfaGFuZGxlcl91bnJlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCiBleHRlcm4gdm9pZAkJbmV0aWZfbml0X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CQlkZXZfdmFsaWRfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBpbnQJCWRldl9pb2N0bChzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICopOwpAQCAtMTc3NSw2ICsxNzk0LDggQEAKIAogZXh0ZXJuIHZvaWQgbmV0aWZfY2Fycmllcl9vZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKK2V4dGVybiB2b2lkIG5ldGlmX25vdGlmeV9wZWVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwogLyoqCiAgKgluZXRpZl9kb3JtYW50X29uIC0gbWFyayBkZXZpY2UgYXMgZG9ybWFudC4KICAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCkBAIC0yMTE5LDggKzIxNDAsMTAgQEAKIC8qIExvYWQgYSBkZXZpY2UgdmlhIHRoZSBrbW9kICovCiBleHRlcm4gdm9pZAkJZGV2X2xvYWQoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkCQlkZXZfbWNhc3RfaW5pdCh2b2lkKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGV2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkCQlkZXZfdHhxX3N0YXRzX2ZvbGQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzKTsKK2V4dGVybiBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RvcmFnZSk7CitleHRlcm4gdm9pZAkJZGV2X3R4cV9zdGF0c19mb2xkKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpOwogCiBleHRlcm4gaW50CQluZXRkZXZfbWF4X2JhY2tsb2c7CiBleHRlcm4gaW50CQluZXRkZXZfdHN0YW1wX3ByZXF1ZXVlOwpAQCAtMjIzMCwyNSArMjI1MywyMyBAQAogCXJldHVybiBkZXYtPm5hbWU7CiB9CiAKLSNkZWZpbmUgbmV0ZGV2X3ByaW50ayhsZXZlbCwgbmV0ZGV2LCBmb3JtYXQsIGFyZ3MuLi4pCQlcCi0JZGV2X3ByaW50ayhsZXZlbCwgKG5ldGRldiktPmRldi5wYXJlbnQsCQkJXAotCQkgICAiJXM6ICIgZm9ybWF0LAkJCQlcCi0JCSAgIG5ldGRldl9uYW1lKG5ldGRldiksICMjYXJncykKLQotI2RlZmluZSBuZXRkZXZfZW1lcmcoZGV2LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAotCW5ldGRldl9wcmludGsoS0VSTl9FTUVSRywgZGV2LCBmb3JtYXQsICMjYXJncykKLSNkZWZpbmUgbmV0ZGV2X2FsZXJ0KGRldiwgZm9ybWF0LCBhcmdzLi4uKQkJCVwKLQluZXRkZXZfcHJpbnRrKEtFUk5fQUxFUlQsIGRldiwgZm9ybWF0LCAjI2FyZ3MpCi0jZGVmaW5lIG5ldGRldl9jcml0KGRldiwgZm9ybWF0LCBhcmdzLi4uKQkJCVwKLQluZXRkZXZfcHJpbnRrKEtFUk5fQ1JJVCwgZGV2LCBmb3JtYXQsICMjYXJncykKLSNkZWZpbmUgbmV0ZGV2X2VycihkZXYsIGZvcm1hdCwgYXJncy4uLikJCQlcCi0JbmV0ZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCBmb3JtYXQsICMjYXJncykKLSNkZWZpbmUgbmV0ZGV2X3dhcm4oZGV2LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAotCW5ldGRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBkZXYsIGZvcm1hdCwgIyNhcmdzKQotI2RlZmluZSBuZXRkZXZfbm90aWNlKGRldiwgZm9ybWF0LCBhcmdzLi4uKQkJCVwKLQluZXRkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCBkZXYsIGZvcm1hdCwgIyNhcmdzKQotI2RlZmluZSBuZXRkZXZfaW5mbyhkZXYsIGZvcm1hdCwgYXJncy4uLikJCQlcCi0JbmV0ZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwgZm9ybWF0LCAjI2FyZ3MpCitleHRlcm4gaW50IG5ldGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuIGludCBuZXRkZXZfZW1lcmcoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBuZXRkZXZfYWxlcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBuZXRkZXZfY3JpdChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gaW50IG5ldGRldl9lcnIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBuZXRkZXZfd2Fybihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gaW50IG5ldGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIGludCBuZXRkZXZfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CiAKICNpZiBkZWZpbmVkKERFQlVHKQogI2RlZmluZSBuZXRkZXZfZGJnKF9fZGV2LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXApAQCAtMjI5NiwyMCArMjMxNywyNiBAQAogCQluZXRkZXZfcHJpbnRrKGxldmVsLCAoZGV2KSwgZm10LCAjI2FyZ3MpOwlcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIG5ldGlmX2xldmVsKGxldmVsLCBwcml2LCB0eXBlLCBkZXYsIGZtdCwgYXJncy4uLikJXAorZG8gewkJCQkJCQkJXAorCWlmIChuZXRpZl9tc2dfIyN0eXBlKHByaXYpKQkJCQlcCisJCW5ldGRldl8jI2xldmVsKGRldiwgZm10LCAjI2FyZ3MpOwkJXAorfSB3aGlsZSAoMCkKKwogI2RlZmluZSBuZXRpZl9lbWVyZyhwcml2LCB0eXBlLCBkZXYsIGZtdCwgYXJncy4uLikJCVwKLQluZXRpZl9wcmludGsocHJpdiwgdHlwZSwgS0VSTl9FTUVSRywgZGV2LCBmbXQsICMjYXJncykKKwluZXRpZl9sZXZlbChlbWVyZywgcHJpdiwgdHlwZSwgZGV2LCBmbXQsICMjYXJncykKICNkZWZpbmUgbmV0aWZfYWxlcnQocHJpdiwgdHlwZSwgZGV2LCBmbXQsIGFyZ3MuLi4pCQlcCi0JbmV0aWZfcHJpbnRrKHByaXYsIHR5cGUsIEtFUk5fQUxFUlQsIGRldiwgZm10LCAjI2FyZ3MpCisJbmV0aWZfbGV2ZWwoYWxlcnQsIHByaXYsIHR5cGUsIGRldiwgZm10LCAjI2FyZ3MpCiAjZGVmaW5lIG5ldGlmX2NyaXQocHJpdiwgdHlwZSwgZGV2LCBmbXQsIGFyZ3MuLi4pCQlcCi0JbmV0aWZfcHJpbnRrKHByaXYsIHR5cGUsIEtFUk5fQ1JJVCwgZGV2LCBmbXQsICMjYXJncykKKwluZXRpZl9sZXZlbChjcml0LCBwcml2LCB0eXBlLCBkZXYsIGZtdCwgIyNhcmdzKQogI2RlZmluZSBuZXRpZl9lcnIocHJpdiwgdHlwZSwgZGV2LCBmbXQsIGFyZ3MuLi4pCQlcCi0JbmV0aWZfcHJpbnRrKHByaXYsIHR5cGUsIEtFUk5fRVJSLCBkZXYsIGZtdCwgIyNhcmdzKQorCW5ldGlmX2xldmVsKGVyciwgcHJpdiwgdHlwZSwgZGV2LCBmbXQsICMjYXJncykKICNkZWZpbmUgbmV0aWZfd2Fybihwcml2LCB0eXBlLCBkZXYsIGZtdCwgYXJncy4uLikJCVwKLQluZXRpZl9wcmludGsocHJpdiwgdHlwZSwgS0VSTl9XQVJOSU5HLCBkZXYsIGZtdCwgIyNhcmdzKQorCW5ldGlmX2xldmVsKHdhcm4sIHByaXYsIHR5cGUsIGRldiwgZm10LCAjI2FyZ3MpCiAjZGVmaW5lIG5ldGlmX25vdGljZShwcml2LCB0eXBlLCBkZXYsIGZtdCwgYXJncy4uLikJCVwKLQluZXRpZl9wcmludGsocHJpdiwgdHlwZSwgS0VSTl9OT1RJQ0UsIGRldiwgZm10LCAjI2FyZ3MpCisJbmV0aWZfbGV2ZWwobm90aWNlLCBwcml2LCB0eXBlLCBkZXYsIGZtdCwgIyNhcmdzKQogI2RlZmluZSBuZXRpZl9pbmZvKHByaXYsIHR5cGUsIGRldiwgZm10LCBhcmdzLi4uKQkJXAotCW5ldGlmX3ByaW50ayhwcml2LCB0eXBlLCBLRVJOX0lORk8sIChkZXYpLCBmbXQsICMjYXJncykKKwluZXRpZl9sZXZlbChpbmZvLCBwcml2LCB0eXBlLCBkZXYsIGZtdCwgIyNhcmdzKQogCiAjaWYgZGVmaW5lZChERUJVRykKICNkZWZpbmUgbmV0aWZfZGJnKHByaXYsIHR5cGUsIGRldiwgZm9ybWF0LCBhcmdzLi4uKQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCmluZGV4IDQ4NzY3Y2QuLmVkZWVhYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKQEAgLTMsMTEgKzMsMTMgQEAKIGhlYWRlci15ICs9IG5mbmV0bGlua19jb25udHJhY2suaAogaGVhZGVyLXkgKz0gbmZuZXRsaW5rX2xvZy5oCiBoZWFkZXIteSArPSBuZm5ldGxpbmtfcXVldWUuaAoraGVhZGVyLXkgKz0geHRfQ0hFQ0tTVU0uaAogaGVhZGVyLXkgKz0geHRfQ0xBU1NJRlkuaAogaGVhZGVyLXkgKz0geHRfQ09OTk1BUksuaAogaGVhZGVyLXkgKz0geHRfQ09OTlNFQ01BUksuaAogaGVhZGVyLXkgKz0geHRfQ1QuaAogaGVhZGVyLXkgKz0geHRfRFNDUC5oCitoZWFkZXIteSArPSB4dF9JRExFVElNRVIuaAogaGVhZGVyLXkgKz0geHRfTEVELmgKIGhlYWRlci15ICs9IHh0X01BUksuaAogaGVhZGVyLXkgKz0geHRfTkZMT0cuaApAQCAtMTgsMTcgKzIwLDE5IEBACiBoZWFkZXIteSArPSB4dF9UQ1BPUFRTVFJJUC5oCiBoZWFkZXIteSArPSB4dF9URUUuaAogaGVhZGVyLXkgKz0geHRfVFBST1hZLmgKK2hlYWRlci15ICs9IHh0X2NsdXN0ZXIuaAogaGVhZGVyLXkgKz0geHRfY29tbWVudC5oCiBoZWFkZXIteSArPSB4dF9jb25uYnl0ZXMuaAogaGVhZGVyLXkgKz0geHRfY29ubmxpbWl0LmgKIGhlYWRlci15ICs9IHh0X2Nvbm5tYXJrLmgKIGhlYWRlci15ICs9IHh0X2Nvbm50cmFjay5oCi1oZWFkZXIteSArPSB4dF9jbHVzdGVyLmgKK2hlYWRlci15ICs9IHh0X2NwdS5oCiBoZWFkZXIteSArPSB4dF9kY2NwLmgKIGhlYWRlci15ICs9IHh0X2RzY3AuaAogaGVhZGVyLXkgKz0geHRfZXNwLmgKIGhlYWRlci15ICs9IHh0X2hhc2hsaW1pdC5oCiBoZWFkZXIteSArPSB4dF9pcHJhbmdlLmgKK2hlYWRlci15ICs9IHh0X2lwdnMuaAogaGVhZGVyLXkgKz0geHRfaGVscGVyLmgKIGhlYWRlci15ICs9IHh0X2xlbmd0aC5oCiBoZWFkZXIteSArPSB4dF9saW1pdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKaW5kZXggMTRlNmQzMi4uMWFmZDE4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApAQCAtNzYsNiArNzYsMTAgQEAKIAkvKiBDb25udHJhY2sgaXMgYSB0ZW1wbGF0ZSAqLwogCUlQU19URU1QTEFURV9CSVQgPSAxMSwKIAlJUFNfVEVNUExBVEUgPSAoMSA8PCBJUFNfVEVNUExBVEVfQklUKSwKKworCS8qIENvbm50cmFjayBpcyBhIGZha2UgdW50cmFja2VkIGVudHJ5ICovCisJSVBTX1VOVFJBQ0tFRF9CSVQgPSAxMiwKKwlJUFNfVU5UUkFDS0VEID0gKDEgPDwgSVBTX1VOVFJBQ0tFRF9CSVQpLAogfTsKIAogLyogQ29ubmVjdGlvbiB0cmFja2luZyBldmVudCB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oCmluZGV4IGQzYmFiN2EuLmVhOWI4ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmgKQEAgLTg5LDYgKzg5LDcgQEAKICNkZWZpbmUgTkZVTE5MX0NPUFlfTk9ORQkweDAwCiAjZGVmaW5lIE5GVUxOTF9DT1BZX01FVEEJMHgwMQogI2RlZmluZSBORlVMTkxfQ09QWV9QQUNLRVQJMHgwMgorLyogMHhmZiBpcyByZXNlcnZlZCwgZG9uJ3QgdXNlIGl0IGZvciBuZXcgY29weSBtb2Rlcy4gKi8KIAogI2RlZmluZSBORlVMTkxfQ0ZHX0ZfU0VRCTB4MDAwMQogI2RlZmluZSBORlVMTkxfQ0ZHX0ZfU0VRX0dMT0JBTAkweDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NIRUNLU1VNLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DSEVDS1NVTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMmU0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DSEVDS1NVTS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBpcHRhYmxlcyBpcHRfQ0hFQ0tTVU0gdGFyZ2V0CisgKgorICogKEMpIDIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIFJlZCBIYXQgSW5jCisgKiBBdXRob3I6IE1pY2hhZWwgUy4gVHNpcmtpbiA8bXN0QHJlZGhhdC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisqLworI2lmbmRlZiBfWFRfQ0hFQ0tTVU1fVEFSR0VUX0gKKyNkZWZpbmUgX1hUX0NIRUNLU1VNX1RBUkdFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX0NIRUNLU1VNX09QX0ZJTEwJMHgwMQkvKiBmaWxsIGluIGNoZWNrc3VtIGluIElQIGhlYWRlciAqLworCitzdHJ1Y3QgeHRfQ0hFQ0tTVU1faW5mbyB7CisJX191OCBvcGVyYXRpb247CS8qIGJpdHNldCBvZiBvcGVyYXRpb25zICovCit9OworCisjZW5kaWYgLyogX1hUX0NIRUNLU1VNX1RBUkdFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9JRExFVElNRVIuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWFhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9JRExFVElNRVIuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmgKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgWHRhYmxlcyB0aW1lciB0YXJnZXQgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICogV3JpdHRlbiBieSBUaW1vIFRlcmFzIDxleHQtdGltby50ZXJhc0Bub2tpYS5jb20+CisgKgorICogQ29udmVydGVkIHRvIHhfdGFibGVzIGFuZCBmb3J3YXJkLXBvcnRlZCB0byAyLjYuMzQKKyAqIGJ5IEx1Y2lhbm8gQ29lbGhvIDxsdWNpYW5vLmNvZWxob0Bub2tpYS5jb20+CisgKgorICogQ29udGFjdDogTHVjaWFubyBDb2VsaG8gPGx1Y2lhbm8uY29lbGhvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfWFRfSURMRVRJTUVSX0gKKyNkZWZpbmUgX1hUX0lETEVUSU1FUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE1BWF9JRExFVElNRVJfTEFCRUxfU0laRSAyOAorCitzdHJ1Y3QgaWRsZXRpbWVyX3RnX2luZm8geworCV9fdTMyIHRpbWVvdXQ7CisKKwljaGFyIGxhYmVsW01BWF9JRExFVElNRVJfTEFCRUxfU0laRV07CisKKwkvKiBmb3Iga2VybmVsIG1vZHVsZSBpbnRlcm5hbCB1c2Ugb25seSAqLworCXN0cnVjdCBpZGxldGltZXJfdGcgKnRpbWVyIF9fYXR0cmlidXRlKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NwdS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjN2YxMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NwdS5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX1hUX0NQVV9ICisjZGVmaW5lIF9YVF9DUFVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHh0X2NwdV9pbmZvIHsKKwlfX3UzMgljcHU7CisJX191MzIJaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX0NQVV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2lwdnMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2lwdnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY3YWViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaXB2cy5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX1hUX0lQVlNfSAorI2RlZmluZSBfWFRfSVBWU19ICisKK2VudW0geworCVhUX0lQVlNfSVBWU19QUk9QRVJUWSA9CTEgPDwgMCwgLyogYWxsIG90aGVyIG9wdGlvbnMgaW1wbHkgdGhpcyBvbmUgKi8KKwlYVF9JUFZTX1BST1RPID0JCTEgPDwgMSwKKwlYVF9JUFZTX1ZBRERSID0JCTEgPDwgMiwKKwlYVF9JUFZTX1ZQT1JUID0JCTEgPDwgMywKKwlYVF9JUFZTX0RJUiA9CQkxIDw8IDQsCisJWFRfSVBWU19NRVRIT0QgPQkxIDw8IDUsCisJWFRfSVBWU19WUE9SVENUTCA9CTEgPDwgNiwKKwlYVF9JUFZTX01BU0sgPQkJKDEgPDwgNykgLSAxLAorCVhUX0lQVlNfT05DRV9NQVNLID0JWFRfSVBWU19NQVNLICYgflhUX0lQVlNfSVBWU19QUk9QRVJUWQorfTsKKworc3RydWN0IHh0X2lwdnNfbXRpbmZvIHsKKwl1bmlvbiBuZl9pbmV0X2FkZHIJdmFkZHIsIHZtYXNrOworCV9fYmUxNgkJCXZwb3J0OworCV9fdTgJCQlsNHByb3RvOworCV9fdTgJCQlmd2RfbWV0aG9kOworCV9fYmUxNgkJCXZwb3J0Y3RsOworCisJX191OAkJCWludmVydDsKKwlfX3U4CQkJYml0bWFzazsKK307CisKKyNlbmRpZiAvKiBfWFRfSVBWU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdW90YS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEuaAppbmRleCA4ZGM4OWRmLi5iMGQyOGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdW90YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3F1b3RhLmgKQEAgLTExLDkgKzExLDkgQEAKIHN0cnVjdCB4dF9xdW90YV9pbmZvIHsKIAl1X2ludDMyX3QJCWZsYWdzOwogCXVfaW50MzJfdAkJcGFkOworCWFsaWduZWRfdTY0CQlxdW90YTsKIAogCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCi0JYWxpZ25lZF91NjQJCXF1b3RhOwogCXN0cnVjdCB4dF9xdW90YV9wcml2CSptYXN0ZXI7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9MT0cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCmluZGV4IDkwZmE2NTIuLmRjZGJhZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCkBAIC03LDcgKzcsOCBAQAogI2RlZmluZSBJUFRfTE9HX0lQT1BUCQkweDA0CS8qIExvZyBJUCBvcHRpb25zICovCiAjZGVmaW5lIElQVF9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLwogI2RlZmluZSBJUFRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCByZXVzZSAqLwotI2RlZmluZSBJUFRfTE9HX01BU0sJCTB4MWYKKyNkZWZpbmUgSVBUX0xPR19NQUNERUNPREUJMHgyMAkvKiBEZWNvZGUgTUFDIGhlYWRlciAqLworI2RlZmluZSBJUFRfTE9HX01BU0sJCTB4MmYKIAogc3RydWN0IGlwdF9sb2dfaW5mbyB7CiAJdW5zaWduZWQgY2hhciBsZXZlbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaAppbmRleCAwZDAxMTliLi45ZGQ1NTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oCkBAIC03LDcgKzcsOCBAQAogI2RlZmluZSBJUDZUX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLwogI2RlZmluZSBJUDZUX0xPR19VSUQJCTB4MDgJLyogTG9nIFVJRCBvd25pbmcgbG9jYWwgc29ja2V0ICovCiAjZGVmaW5lIElQNlRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCB1c2UgKi8KLSNkZWZpbmUgSVA2VF9MT0dfTUFTSwkJMHgxZgorI2RlZmluZSBJUDZUX0xPR19NQUNERUNPREUJMHgyMAkvKiBEZWNvZGUgTUFDIGhlYWRlciAqLworI2RlZmluZSBJUDZUX0xPR19NQVNLCQkweDJmCiAKIHN0cnVjdCBpcDZ0X2xvZ19pbmZvIHsKIAl1bnNpZ25lZCBjaGFyIGxldmVsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRwb2xsLmggYi9pbmNsdWRlL2xpbnV4L25ldHBvbGwuaAppbmRleCBlOWUyMzEyLi40MTM3NDJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldHBvbGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldHBvbGwuaApAQCAtNDYsOSArNDYsMTEgQEAKIHZvaWQgbmV0cG9sbF9zZW5kX3VkcChzdHJ1Y3QgbmV0cG9sbCAqbnAsIGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbik7CiB2b2lkIG5ldHBvbGxfcHJpbnRfb3B0aW9ucyhzdHJ1Y3QgbmV0cG9sbCAqbnApOwogaW50IG5ldHBvbGxfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgbmV0cG9sbCAqbnAsIGNoYXIgKm9wdCk7CitpbnQgX19uZXRwb2xsX3NldHVwKHN0cnVjdCBuZXRwb2xsICpucCk7CiBpbnQgbmV0cG9sbF9zZXR1cChzdHJ1Y3QgbmV0cG9sbCAqbnApOwogaW50IG5ldHBvbGxfdHJhcCh2b2lkKTsKIHZvaWQgbmV0cG9sbF9zZXRfdHJhcChpbnQgdHJhcCk7Cit2b2lkIF9fbmV0cG9sbF9jbGVhbnVwKHN0cnVjdCBuZXRwb2xsICpucCk7CiB2b2lkIG5ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0cG9sbCAqbnApOwogaW50IF9fbmV0cG9sbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgbmV0cG9sbF9zZW5kX3NrYihzdHJ1Y3QgbmV0cG9sbCAqbnAsIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtNTcsMTIgKzU5LDE1IEBACiAjaWZkZWYgQ09ORklHX05FVFBPTEwKIHN0YXRpYyBpbmxpbmUgYm9vbCBuZXRwb2xsX3J4KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvID0gc2tiLT5kZXYtPm5waW5mbzsKKwlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm87CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHJldCA9IGZhbHNlOwogCisJcmN1X3JlYWRfbG9ja19iaCgpOworCW5waW5mbyA9IHJjdV9kZXJlZmVyZW5jZV9iaChza2ItPmRldi0+bnBpbmZvKTsKKwogCWlmICghbnBpbmZvIHx8IChsaXN0X2VtcHR5KCZucGluZm8tPnJ4X25wKSAmJiAhbnBpbmZvLT5yeF9mbGFncykpCi0JCXJldHVybiBmYWxzZTsKKwkJZ290byBvdXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7CiAJLyogY2hlY2sgcnhfZmxhZ3MgYWdhaW4gd2l0aCB0aGUgbG9jayBoZWxkICovCkBAIC03MCwxMiArNzUsMTQgQEAKIAkJcmV0ID0gdHJ1ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucGluZm8tPnJ4X2xvY2ssIGZsYWdzKTsKIAorb3V0OgorCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5ldHBvbGxfcnhfb24oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm8gPSBza2ItPmRldi0+bnBpbmZvOworCXN0cnVjdCBuZXRwb2xsX2luZm8gKm5waW5mbyA9IHJjdV9kZXJlZmVyZW5jZV9iaChza2ItPmRldi0+bnBpbmZvKTsKIAogCXJldHVybiBucGluZm8gJiYgKCFsaXN0X2VtcHR5KCZucGluZm8tPnJ4X25wKSB8fCBucGluZm8tPnJ4X2ZsYWdzKTsKIH0KQEAgLTkxLDcgKzk4LDYgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmFwaS0+ZGV2OwogCi0JcmN1X3JlYWRfbG9jaygpOyAvKiBkZWFsIHdpdGggcmFjZSBvbiAtPm5waW5mbyAqLwogCWlmIChkZXYgJiYgZGV2LT5ucGluZm8pIHsKIAkJc3Bpbl9sb2NrKCZuYXBpLT5wb2xsX2xvY2spOwogCQluYXBpLT5wb2xsX293bmVyID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtMTA4LDcgKzExNCwxMSBAQAogCQluYXBpLT5wb2xsX293bmVyID0gLTE7CiAJCXNwaW5fdW5sb2NrKCZuYXBpLT5wb2xsX2xvY2spOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0cG9sbF90eF9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGlycXNfZGlzYWJsZWQoKTsKIH0KIAogI2Vsc2UKQEAgLTEzNCw2ICsxNDQsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXRwb2xsX25ldGRldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiB9CitzdGF0aWMgaW5saW5lIGludCBuZXRwb2xsX3R4X3J1bm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDc3YzJhZTUuLmJhZDRkMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtNDkzLDggKzQ5MywxNSBAQAogZXh0ZXJuIGludCBuZnNfd2JfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSogcGFnZSk7CiBleHRlcm4gaW50IG5mc193Yl9wYWdlX2NhbmNlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSogcGFnZSk7CiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCitleHRlcm4gaW50ICBuZnNfY29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqbmZzX2NvbW1pdGRhdGFfYWxsb2Modm9pZCk7CiBleHRlcm4gdm9pZCBuZnNfY29tbWl0X2ZyZWUoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK25mc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGhvdykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAppbmRleCBiN2M3N2Y5Li4yYzg3MDE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApAQCAtMTMyLDcgKzEzMiw3IEBACiAgKiAJJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9QT1dFUl9NQVhfQU5UX0dBSU4gYW5kCiAgKiAJJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9QT1dFUl9NQVhfRUlSUC4KICAqIEBOTDgwMjExX0NNRF9SRVFfU0VUX1JFRzogYXNrIHRoZSB3aXJlbGVzcyBjb3JlIHRvIHNldCB0aGUgcmVndWxhdG9yeSBkb21haW4KLSAqIAl0byB0aGUgdGhlIHNwZWNpZmllZCBJU08vSUVDIDMxNjYtMSBhbHBoYTIgY291bnRyeSBjb2RlLiBUaGUgY29yZSB3aWxsCisgKiAJdG8gdGhlIHNwZWNpZmllZCBJU08vSUVDIDMxNjYtMSBhbHBoYTIgY291bnRyeSBjb2RlLiBUaGUgY29yZSB3aWxsCiAgKiAJc3RvcmUgdGhpcyBhcyBhIHZhbGlkIHJlcXVlc3QgYW5kIHRoZW4gcXVlcnkgdXNlcnNwYWNlIGZvciBpdC4KICAqCiAgKiBATkw4MDIxMV9DTURfR0VUX01FU0hfUEFSQU1TOiBHZXQgbWVzaCBuZXR3b3JraW5nIHByb3BlcnRpZXMgZm9yIHRoZQpAQCAtNzI1LDYgKzcyNSwxMiBAQAogICogQE5MODAyMTFfQVRUUl9BUF9JU09MQVRFOiAoQVAgbW9kZSkgRG8gbm90IGZvcndhcmQgdHJhZmZpYyBiZXR3ZWVuIHN0YXRpb25zCiAgKgljb25uZWN0ZWQgdG8gdGhpcyBCU1MuCiAgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9TRVRUSU5HOiBUcmFuc21pdCBwb3dlciBzZXR0aW5nIHR5cGUuIFNlZQorICogICAgICAmZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgZm9yIHBvc3NpYmxlIHZhbHVlcy4KKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfVFhfUE9XRVJfTEVWRUw6IFRyYW5zbWl0IHBvd2VyIGxldmVsIGluIHNpZ25lZCBtQm0gdW5pdHMuCisgKiAgICAgIFRoaXMgaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiB3aXRoIEBOTDgwMjExX0FUVFJfV0lQSFlfVFhfUE9XRVJfU0VUVElORworICogICAgICBmb3Igbm9uLWF1dG9tYXRpYyBzZXR0aW5ncy4KKyAqCiAgKiBATkw4MDIxMV9BVFRSX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBAX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTg4Miw2ICs4ODgsOSBAQAogCiAJTkw4MDIxMV9BVFRSX0FQX0lTT0xBVEUsCiAKKwlOTDgwMjExX0FUVFJfV0lQSFlfVFhfUE9XRVJfU0VUVElORywKKwlOTDgwMjExX0FUVFJfV0lQSFlfVFhfUE9XRVJfTEVWRUwsCisKIAkvKiBhZGQgYXR0cmlidXRlcyBoZXJlLCB1cGRhdGUgdGhlIHBvbGljeSBpbiBubDgwMjExLmMgKi8KIAogCV9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCkBAIC0xNjU5LDQgKzE2NjgsMTcgQEAKIAlOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9ISUdILAogfTsKIAorCisvKioKKyAqIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIC0gVFggcG93ZXIgYWRqdXN0bWVudAorICogQE5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDOiBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0cmFuc21pdCBwb3dlcgorICogQE5MODAyMTFfVFhfUE9XRVJfTElNSVRFRDogbGltaXQgVFggcG93ZXIgYnkgdGhlIG1CbSBwYXJhbWV0ZXIKKyAqIEBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEOiBmaXggVFggcG93ZXIgdG8gdGhlIG1CbSBwYXJhbWV0ZXIKKyAqLworZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgeworCU5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDLAorCU5MODAyMTFfVFhfUE9XRVJfTElNSVRFRCwKKwlOTDgwMjExX1RYX1BPV0VSX0ZJWEVELAorfTsKKwogI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25taS5oIGIvaW5jbHVkZS9saW51eC9ubWkuaAppbmRleCBiNzUyZTgwLi4wNmFhYjVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25taS5oCisrKyBiL2luY2x1ZGUvbGludXgvbm1pLmgKQEAgLTIwLDEwICsyMCwxNCBAQAogZXh0ZXJuIHZvaWQgYWNwaV9ubWlfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiB2b2lkIGFjcGlfbm1pX2VuYWJsZSh2b2lkKTsKICNlbHNlCisjaWZuZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SCiBzdGF0aWMgaW5saW5lIHZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nKHZvaWQpCiB7CiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogfQorI2Vsc2UKK2V4dGVybiB2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKTsKKyNlbmRpZgogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbm1pX2Rpc2FibGUodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9ubWlfZW5hYmxlKHZvaWQpIHsgfQogI2VuZGlmCkBAIC00Nyw0ICs1MSwxMyBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTE9DS1VQX0RFVEVDVE9SCitpbnQgaHdfbm1pX2lzX2NwdV9zdHVjayhzdHJ1Y3QgcHRfcmVncyAqKTsKK3U2NCBod19ubWlfZ2V0X3NhbXBsZV9wZXJpb2Qodm9pZCk7CitleHRlcm4gaW50IHdhdGNoZG9nX2VuYWJsZWQ7CitzdHJ1Y3QgY3RsX3RhYmxlOworZXh0ZXJuIGludCBwcm9jX2Rvd2F0Y2hkb2dfZW5hYmxlZChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCAsCisJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ub3RpZmllci5oIGIvaW5jbHVkZS9saW51eC9ub3RpZmllci5oCmluZGV4IDU0MDcwM2IuLmIyZjFhNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbm90aWZpZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25vdGlmaWVyLmgKQEAgLTIxMCw2ICsyMTAsNyBAQAogI2RlZmluZSBORVRERVZfUE9TVF9JTklUCTB4MDAxMAogI2RlZmluZSBORVRERVZfVU5SRUdJU1RFUl9CQVRDSCAweDAwMTEKICNkZWZpbmUgTkVUREVWX0JPTkRJTkdfREVTTEFWRSAgMHgwMDEyCisjZGVmaW5lIE5FVERFVl9OT1RJRllfUEVFUlMJMHgwMDEzCiAKICNkZWZpbmUgU1lTX0RPV04JMHgwMDAxCS8qIE5vdGlmeSBvZiBzeXN0ZW0gZG93biAqLwogI2RlZmluZSBTWVNfUkVTVEFSVAlTWVNfRE9XTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZi5oIGIvaW5jbHVkZS9saW51eC9vZi5oCmluZGV4IGEzNjdlMTkuLmNhZDdjZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2YuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mLmgKQEAgLTcwLDYgKzcwLDExIEBACiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9jaG9zZW47CiBleHRlcm4gcndsb2NrX3QgZGV2dHJlZV9sb2NrOwogCitzdGF0aWMgaW5saW5lIGJvb2wgb2Zfbm9kZV9pc19yb290KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gbm9kZSAmJiAobm9kZS0+cGFyZW50ID09IE5VTEwpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9ub2RlX2NoZWNrX2ZsYWcoc3RydWN0IGRldmljZV9ub2RlICpuLCB1bnNpZ25lZCBsb25nIGZsYWcpCiB7CiAJcmV0dXJuIHRlc3RfYml0KGZsYWcsICZuLT5fZmxhZ3MpOwpAQCAtMTQxLDYgKzE0NiwxMSBAQAogCiAjZGVmaW5lIE9GX0JBRF9BRERSCSgodTY0KS0xKQogCisjaWZuZGVmIG9mX25vZGVfdG9fbmlkCitzdGF0aWMgaW5saW5lIGludCBvZl9ub2RlX3RvX25pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKSB7IHJldHVybiAtMTsgfQorI2RlZmluZSBvZl9ub2RlX3RvX25pZCBvZl9ub2RlX3RvX25pZAorI2VuZGlmCisKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9uYW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvbSwKIAljb25zdCBjaGFyICpuYW1lKTsKICNkZWZpbmUgZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRuLCBuYW1lKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaCBiL2luY2x1ZGUvbGludXgvb2ZfYWRkcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZWEwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9fT0ZfQUREUkVTU19ICisjZGVmaW5lIF9fT0ZfQUREUkVTU19ICisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworZXh0ZXJuIHU2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCB1MzIgKmFkZHIpOworZXh0ZXJuIGludCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCisJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworZXh0ZXJuIHZvaWQgX19pb21lbSAqb2ZfaW9tYXAoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCk7CisKKy8qIEV4dHJhY3QgYW4gYWRkcmVzcyBmcm9tIGEgZGV2aWNlLCByZXR1cm5zIHRoZSByZWdpb24gc2l6ZSBhbmQKKyAqIHRoZSBhZGRyZXNzIHNwYWNlIGZsYWdzIHRvby4gVGhlIFBDSSB2ZXJzaW9uIHVzZXMgYSBCQVIgbnVtYmVyCisgKiBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIGluZGV4CisgKi8KK2V4dGVybiBjb25zdCB1MzIgKm9mX2dldF9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCisJCQkgICB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpOworCisjaWZuZGVmIHBjaV9hZGRyZXNzX3RvX3Bpbworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyKSB7IHJldHVybiAtMTsgfQorI2RlZmluZSBwY2lfYWRkcmVzc190b19waW8gcGNpX2FkZHJlc3NfdG9fcGlvCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiBjb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywKKwkJCSAgICAgICB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpOworZXh0ZXJuIGludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKKwkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworI2Vsc2UgLyogQ09ORklHX1BDSSAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCisJCQkJICAgICAgICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcikKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBjb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJaW50IGJhcl9ubywgdTY0ICpzaXplLCB1bnNpZ25lZCBpbnQgKmZsYWdzKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCisjZW5kaWYgLyogX19PRl9BRERSRVNTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvb2ZfZGV2aWNlLmgKaW5kZXggMTE2NTFmYS4uMzVhYTQ0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2RldmljZS5oCkBAIC0xLDMyICsxLDc3IEBACiAjaWZuZGVmIF9MSU5VWF9PRl9ERVZJQ0VfSAogI2RlZmluZSBfTElOVVhfT0ZfREVWSUNFX0gKIAorLyoKKyAqIFRoZSBvZl9kZXZpY2UgKndhcyogYSBraW5kIG9mICJiYXNlIGNsYXNzIiB0aGF0IHdhcyBhIHN1cGVyc2V0IG9mCisgKiBzdHJ1Y3QgZGV2aWNlIGZvciB1c2UgYnkgZGV2aWNlcyBhdHRhY2hlZCB0byBhbiBPRiBub2RlIGFuZCBwcm9iZWQKKyAqIHVzaW5nIE9GIHByb3BlcnRpZXMuICBIb3dldmVyLCB0aGUgaW1wb3J0YW50IGJpdCBvZiBPRi1zdHlsZQorICogcHJvYmluZywgbmFtZWx5IHRoZSBkZXZpY2Ugbm9kZSBwb2ludGVyLCBoYXMgYmVlbiBtb3ZlZCBpbnRvIHRoZQorICogY29tbW9uIHN0cnVjdCBkZXZpY2Ugd2hlbiBDT05GSUdfT0YgaXMgc2V0IHRvIG1ha2UgT0Ytc3R5bGUgcHJvYmluZworICogYXZhaWxhYmxlIHRvIGFsbCBidXMgdHlwZXMuICBTbyBub3csIGp1c3QgbWFrZSBvZl9kZXZpY2UgYW5kCisgKiBwbGF0Zm9ybV9kZXZpY2UgZXF1aXZhbGVudCBzbyB0aGF0IGN1cnJlbnQgb2ZfcGxhdGZvcm0gYnVzIHVzZXJzCisgKiBjYW4gYmUgdHJhbnNwYXJlbnRseSBtaWdyYXRlZCBvdmVyIHRvIHVzaW5nIHRoZSBwbGF0Zm9ybSBidXMuCisgKgorICogVGhpcyBsaW5lIHdpbGwgZ28gYXdheSBvbmNlIGFsbCByZWZlcmVuY2VzIHRvIG9mX2RldmljZSBhcmUgcmVtb3ZlZAorICogZnJvbSB0aGUga2VybmVsLgorICovCisjZGVmaW5lIG9mX2RldmljZSBwbGF0Zm9ybV9kZXZpY2UKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPiAvKiB0ZW1wb3JhcnkgdW50aWwgbWVyZ2UgKi8KKwogI2lmZGVmIENPTkZJR19PRl9ERVZJQ0UKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogCi0jaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgotCiAjZGVmaW5lCXRvX29mX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG9mX2RldmljZSwgZGV2KQogCiBleHRlcm4gY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBvZl9kZXZpY2VfbWFrZV9idXNfaWQoc3RydWN0IGRldmljZSAqZGV2KTsKIAotZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX2Rldl9nZXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIG9mX2Rldl9wdXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKKy8qKgorICogb2ZfZHJpdmVyX21hdGNoX2RldmljZSAtIFRlbGwgaWYgYSBkcml2ZXIncyBvZl9tYXRjaF90YWJsZSBtYXRjaGVzIGEgZGV2aWNlLgorICogQGRydjogdGhlIGRldmljZV9kcml2ZXIgc3RydWN0dXJlIHRvIHRlc3QKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfZHJpdmVyX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBvZl9tYXRjaF9kZXZpY2UoZHJ2LT5vZl9tYXRjaF90YWJsZSwgZGV2KSAhPSBOVUxMOworfQogCi1leHRlcm4gaW50IG9mX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldik7Ci1leHRlcm4gdm9pZCBvZl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldik7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZfZGV2X2dldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgb2ZfZGV2X3B1dChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOworCitleHRlcm4gaW50IG9mX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldik7CitleHRlcm4gdm9pZCBvZl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldik7CiBleHRlcm4gdm9pZCBvZl9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgb2ZfZGV2aWNlX2ZyZWUoc3RydWN0IG9mX2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIG9mX2RldmljZV9mcmVlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlvZl9yZWxlYXNlX2RldigmZGV2LT5kZXYpOwogfQogCi1leHRlcm4gc3NpemVfdCBvZl9kZXZpY2VfZ2V0X21vZGFsaWFzKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorZXh0ZXJuIHNzaXplX3Qgb2ZfZGV2aWNlX2dldF9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCWNoYXIgKnN0ciwgc3NpemVfdCBsZW4pOworCitleHRlcm4gaW50IG9mX2RldmljZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOworCisKKyNlbHNlIC8qIENPTkZJR19PRl9ERVZJQ0UgKi8KKworc3RhdGljIGlubGluZSBpbnQgb2ZfZHJpdmVyX21hdGNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9kZXZpY2VfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfT0ZfREVWSUNFICovCiAKICNlbmRpZiAvKiBfTElOVVhfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKaW5kZXggZmMyNDcyYy4uNjU5OGMwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKQEAgLTMzLDM0ICszMywxNyBAQAogI2lmZGVmIENPTkZJR19PRl9HUElPCiAKIC8qCi0gKiBHZW5lcmljIE9GIEdQSU8gY2hpcAotICovCi1zdHJ1Y3Qgb2ZfZ3Bpb19jaGlwIHsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGdjOwotCWludCBncGlvX2NlbGxzOwotCWludCAoKnhsYXRlKShzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYywgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJICAgICBjb25zdCB2b2lkICpncGlvX3NwZWMsIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICp0b19vZl9ncGlvX2NoaXAoc3RydWN0IGdwaW9fY2hpcCAqZ2MpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG9mX2dwaW9fY2hpcCwgZ2MpOwotfQotCi0vKgogICogT0YgR1BJTyBjaGlwIGZvciBtZW1vcnkgbWFwcGVkIGJhbmtzCiAgKi8KIHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgewotCXN0cnVjdCBvZl9ncGlvX2NoaXAgb2ZfZ2M7CisJc3RydWN0IGdwaW9fY2hpcCBnYzsKIAl2b2lkICgqc2F2ZV9yZWdzKShzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyk7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICp0b19vZl9tbV9ncGlvX2NoaXAoc3RydWN0IGdwaW9fY2hpcCAqZ2MpCiB7Ci0Jc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2MgPSB0b19vZl9ncGlvX2NoaXAoZ2MpOwotCi0JcmV0dXJuIGNvbnRhaW5lcl9vZihvZl9nYywgc3RydWN0IG9mX21tX2dwaW9fY2hpcCwgb2ZfZ2MpOworCXJldHVybiBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAsIGdjKTsKIH0KIAogZXh0ZXJuIGludCBvZl9nZXRfZ3Bpb19mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgsCkBAIC02OSwxMSArNTIsMTIgQEAKIAogZXh0ZXJuIGludCBvZl9tbV9ncGlvY2hpcF9hZGQoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCSAgICAgIHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djKTsKLWV4dGVybiBpbnQgb2ZfZ3Bpb19zaW1wbGVfeGxhdGUoc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2MsCi0JCQkJc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQljb25zdCB2b2lkICpncGlvX3NwZWMsCi0JCQkJZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncyk7Ci0jZWxzZQorCitleHRlcm4gdm9pZCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpOworZXh0ZXJuIHZvaWQgb2ZfZ3Bpb2NoaXBfcmVtb3ZlKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKK2V4dGVybiBzdHJ1Y3QgZ3Bpb19jaGlwICpvZl9ub2RlX3RvX2dwaW9jaGlwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworCisjZWxzZSAvKiBDT05GSUdfT0ZfR1BJTyAqLwogCiAvKiBEcml2ZXJzIG1heSBub3Qgc3RyaWN0bHkgZGVwZW5kIG9uIHRoZSBHUElPIHN1cHBvcnQsIHNvIGxldCB0aGVtIGxpbmsuICovCiBzdGF0aWMgaW5saW5lIGludCBvZl9nZXRfZ3Bpb19mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgsCkBAIC04Nyw2ICs3MSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYykgeyB9CisKICNlbmRpZiAvKiBDT05GSUdfT0ZfR1BJTyAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfaTJjLmggYi9pbmNsdWRlL2xpbnV4L29mX2kyYy5oCmluZGV4IDM0OTc0YjUuLjBlZmU4ZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfaTJjLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9pMmMuaApAQCAtMTIsMTIgKzEyLDE5IEBACiAjaWZuZGVmIF9fTElOVVhfT0ZfSTJDX0gKICNkZWZpbmUgX19MSU5VWF9PRl9JMkNfSAogCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19PRl9JMkNfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogCi12b2lkIG9mX3JlZ2lzdGVyX2kyY19kZXZpY2VzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICphZGFwX25vZGUpOworZXh0ZXJuIHZvaWQgb2ZfaTJjX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKIAogLyogbXVzdCBjYWxsIHB1dF9kZXZpY2UoKSB3aGVuIGRvbmUgd2l0aCByZXR1cm5lZCBpMmNfY2xpZW50IGRldmljZSAqLwotc3RydWN0IGkyY19jbGllbnQgKm9mX2ZpbmRfaTJjX2RldmljZV9ieV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CitleHRlcm4gc3RydWN0IGkyY19jbGllbnQgKm9mX2ZpbmRfaTJjX2RldmljZV9ieV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb2ZfaTJjX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0ZfSTJDICovCiAKICNlbmRpZiAvKiBfX0xJTlVYX09GX0kyQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oIGIvaW5jbHVkZS9saW51eC9vZl9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTI5NzgxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vZl9pcnEuaApAQCAtMCwwICsxLDcwIEBACisjaWZuZGVmIF9fT0ZfSVJRX0gKKyNkZWZpbmUgX19PRl9JUlFfSAorCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCitzdHJ1Y3Qgb2ZfaXJxOworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisvKgorICogaXJxX29mX3BhcnNlX2FuZF9tYXAoKSBpcyB1c2VkIGJhIGFsbCBPRiBlbmFibGVkIHBsYXRmb3JtczsgYnV0IFNQQVJDCisgKiBpbXBsZW1lbnRzIGl0IGRpZmZlcmVudGx5LiAgSG93ZXZlciwgdGhlIHByb3RvdHlwZSBpcyB0aGUgc2FtZSBmb3IgYWxsLAorICogc28gZGVjbGFyZSBpdCBoZXJlIHJlZ2FyZGxlc3Mgb2YgdGhlIENPTkZJR19PRl9JUlEgc2V0dGluZy4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfb2ZfcGFyc2VfYW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBpbmRleCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9JUlEpCisvKioKKyAqIG9mX2lycSAtIGNvbnRhaW5lciBmb3IgZGV2aWNlX25vZGUvaXJxX3NwZWNpZmllciBwYWlyIGZvciBhbiBpcnEgY29udHJvbGxlcgorICogQGNvbnRyb2xsZXI6IHBvaW50ZXIgdG8gaW50ZXJydXB0IGNvbnRyb2xsZXIgZGV2aWNlIHRyZWUgbm9kZQorICogQHNpemU6IHNpemUgb2YgaW50ZXJydXB0IHNwZWNpZmllcgorICogQHNwZWNpZmllcjogYXJyYXkgb2YgY2VsbHMgQHNpemUgbG9uZyBzcGVjaWZpbmcgdGhlIHNwZWNpZmljIGludGVycnVwdAorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkIHdoZW4gYW4gaW50ZXJydXB0IGlzIG1hcHBlZC4gVGhlIGNvbnRyb2xsZXIKKyAqIGZpZWxkIG5lZWRzIHRvIGJlIHB1dCgpIGFmdGVyIHVzZQorICovCisjZGVmaW5lIE9GX01BWF9JUlFfU1BFQwkJNCAvKiBXZSBoYW5kbGUgc3BlY2lmaWVycyBvZiBhdCBtb3N0IDQgY2VsbHMgKi8KK3N0cnVjdCBvZl9pcnEgeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlcjsgLyogSW50ZXJydXB0IGNvbnRyb2xsZXIgbm9kZSAqLworCXUzMiBzaXplOyAvKiBTcGVjaWZpZXIgc2l6ZSAqLworCXUzMiBzcGVjaWZpZXJbT0ZfTUFYX0lSUV9TUEVDXTsgLyogU3BlY2lmaWVyIGNvcHkgKi8KK307CisKKy8qCisgKiBXb3JrYXJvdW5kcyBvbmx5IGFwcGxpZWQgdG8gMzJiaXQgcG93ZXJtYWMgbWFjaGluZXMKKyAqLworI2RlZmluZSBPRl9JTUFQX09MRFdPUkxEX01BQwkweDAwMDAwMDAxCisjZGVmaW5lIE9GX0lNQVBfTk9fUEhBTkRMRQkweDAwMDAwMDAyCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEMzMikgJiYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpCitleHRlcm4gdW5zaWduZWQgaW50IG9mX2lycV93b3JrYXJvdW5kczsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2lycV9kZmx0X3BpYzsKK2V4dGVybiBpbnQgb2ZfaXJxX21hcF9vbGR3b3JsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4LAorCQkJICAgICAgIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpOworI2Vsc2UgLyogQ09ORklHX1BQQzMyICYmIENPTkZJR19QUENfUE1BQyAqLworI2RlZmluZSBvZl9pcnFfd29ya2Fyb3VuZHMgKDApCisjZGVmaW5lIG9mX2lycV9kZmx0X3BpYyAoTlVMTCkKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2lycV9tYXBfb2xkd29ybGQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCwKKwkJCQkgICAgICBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKQoreworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmIC8qIENPTkZJR19QUEMzMiAmJiBDT05GSUdfUFBDX1BNQUMgKi8KKworCitleHRlcm4gaW50IG9mX2lycV9tYXBfcmF3KHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBjb25zdCB1MzIgKmludHNwZWMsCisJCQkgIHUzMiBvaW50c2l6ZSwgY29uc3QgdTMyICphZGRyLAorCQkJICBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKTsKK2V4dGVybiBpbnQgb2ZfaXJxX21hcF9vbmUoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCwKKwkJCSAgc3RydWN0IG9mX2lycSAqb3V0X2lycSk7CitleHRlcm4gdW5zaWduZWQgaW50IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCisJCQkJCSAgY29uc3QgdTMyICppbnRzcGVjLAorCQkJCQkgIHVuc2lnbmVkIGludCBpbnRzaXplKTsKK2V4dGVybiBpbnQgb2ZfaXJxX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCisJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworCisjZW5kaWYgLyogQ09ORklHX09GX0lSUSAqLworI2VuZGlmIC8qIENPTkZJR19PRiAqLworI2VuZGlmIC8qIF9fT0ZfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaAppbmRleCAxNjQzZDM3Li40ZTZkOTg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9wbGF0Zm9ybS5oCkBAIC0xNywyOSArMTcsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotCi0vKgotICogVGhlIG9mX3BsYXRmb3JtX2J1c190eXBlIGlzIGEgYnVzIHR5cGUgdXNlZCBieSBkcml2ZXJzIHRoYXQgZG8gbm90Ci0gKiBhdHRhY2ggdG8gYSBtYWNpbyBvciBzaW1pbGFyIGJ1cyBidXQgc3RpbGwgdXNlIE9GIHByb2JpbmcKLSAqIG1lY2hhbmlzbQotICovCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIG9mX3BsYXRmb3JtX2J1c190eXBlOworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAvKgogICogQW4gb2ZfcGxhdGZvcm1fZHJpdmVyIGRyaXZlciBpcyBhdHRhY2hlZCB0byBhIGJhc2ljIG9mX2RldmljZSBvbgotICogdGhlICJwbGF0Zm9ybSBidXMiIChvZl9wbGF0Zm9ybV9idXNfdHlwZSkuCisgKiB0aGUgInBsYXRmb3JtIGJ1cyIgKHBsYXRmb3JtX2J1c190eXBlKS4KICAqLwogc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlcgogewotCWludAkoKnByb2JlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsCisJaW50CSgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UqIGRldiwKIAkJCSBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCk7Ci0JaW50CSgqcmVtb3ZlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOworCWludAkoKnJlbW92ZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSogZGV2KTsKIAotCWludAkoKnN1c3BlbmQpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQlpbnQJKCpyZXN1bWUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7Ci0JaW50CSgqc2h1dGRvd24pKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CisJaW50CSgqc3VzcGVuZCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludAkoKnJlc3VtZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSogZGV2KTsKKwlpbnQJKCpzaHV0ZG93bikoc3RydWN0IHBsYXRmb3JtX2RldmljZSogZGV2KTsKIAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyCWRyaXZlcjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyCXBsYXRmb3JtX2RyaXZlcjsKIH07CiAjZGVmaW5lCXRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpIFwKIAljb250YWluZXJfb2YoZHJ2LHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIsIGRyaXZlcikKQEAgLTQ5LDIwICs0NCwzMCBAQAogZXh0ZXJuIHZvaWQgb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KTsKIAogLyogUGxhdGZvcm0gZHJpdmVycyByZWdpc3Rlci91bnJlZ2lzdGVyICovCi1zdGF0aWMgaW5saW5lIGludCBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KQotewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoZHJ2LCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOwotfQotc3RhdGljIGlubGluZSB2b2lkIG9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydikKLXsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcihkcnYpOwotfQorZXh0ZXJuIGludCBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KTsKK2V4dGVybiB2b2lkIG9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydik7CiAKLSNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KLQotZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZfZGV2aWNlX2FsbG9jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSBjb25zdCBjaGFyICpidXNfaWQsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAKIGV4dGVybiBpbnQgb2ZfYnVzX3R5cGVfaW5pdChzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY29uc3QgY2hhciAqbmFtZSk7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1BBUkMpIC8qIFNQQVJDIGhhcyBpdHMgb3duIGRldmljZSByZWdpc3RyYXRpb24gbWV0aG9kICovCisvKiBQbGF0Zm9ybSBkZXZpY2VzIGFuZCBidXNzZXMgY3JlYXRpb24gKi8KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQkgICBjb25zdCBjaGFyICpidXNfaWQsCisJCQkJCQkgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOworCisvKiBwc2V1ZG8gIm1hdGNoZXMiIHZhbHVlIHRvIG5vdCBkbyBkZWVwIHByb2JlICovCisjZGVmaW5lIE9GX05PX0RFRVBfUFJPQkUgKChzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICopLTEpCisKK2V4dGVybiBpbnQgb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCwKKwkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKKwkJCQkgc3RydWN0IGRldmljZSAqcGFyZW50KTsKKyNlbmRpZiAvKiAhQ09ORklHX1NQQVJDICovCisKICNlbmRpZiAvKiBDT05GSUdfT0ZfREVWSUNFICovCiAKICNlbmRpZgkvKiBfTElOVVhfT0ZfUExBVEZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9zcGkuaCBiL2luY2x1ZGUvbGludXgvb2Zfc3BpLmgKaW5kZXggNWY3MWVlOC4uOWUzZTcwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9zcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX3NwaS5oCkBAIC05LDEwICs5LDE1IEBACiAjaWZuZGVmIF9fTElOVVhfT0ZfU1BJX0gKICNkZWZpbmUgX19MSU5VWF9PRl9TUElfSAogCi0jaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKLWV4dGVybiB2b2lkIG9mX3JlZ2lzdGVyX3NwaV9kZXZpY2VzKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworI2lmIGRlZmluZWQoQ09ORklHX09GX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfT0ZfU1BJX01PRFVMRSkKK2V4dGVybiB2b2lkIG9mX3JlZ2lzdGVyX3NwaV9kZXZpY2VzKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0ZfU1BJICovCiAKICNlbmRpZiAvKiBfX0xJTlVYX09GX1NQSSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vbWFwZmIuaCBiL2luY2x1ZGUvbGludXgvb21hcGZiLmgKaW5kZXggOWJkZDkxNC4uN2U0Y2Q2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vbWFwZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L29tYXBmYi5oCkBAIC0yNTMsNyArMjUzLDcgQEAKIC8qIGluIGFyY2gvYXJtL3BsYXQtb21hcC9mYi5jICovCiBleHRlcm4gdm9pZCBvbWFwZmJfc2V0X3BsYXRmb3JtX2RhdGEoc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpkYXRhKTsKIGV4dGVybiB2b2lkIG9tYXBmYl9zZXRfY3RybF9wbGF0Zm9ybV9kYXRhKHZvaWQgKnBkYXRhKTsKLWV4dGVybiB2b2lkIG9tYXBmYl9yZXNlcnZlX3NkcmFtKHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW1fbWVtYmxvY2sodm9pZCk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oIGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaAppbmRleCA4ZDg0MDYyLi5iZGNkMWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFkYXRhLmgKQEAgLTI1LDYgKzI1LDExIEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKworI2RlZmluZSBQQURBVEFfQ1BVX1NFUklBTCAgIDB4MDEKKyNkZWZpbmUgUEFEQVRBX0NQVV9QQVJBTExFTCAweDAyCiAKIC8qKgogICogc3RydWN0IHBhZGF0YV9wcml2IC0gIEVtYmVkZGVkIHRvIHRoZSB1c2VycyBkYXRhIHN0cnVjdHVyZS4KQEAgLTU5LDcgKzY0LDIwIEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCBwYWRhdGFfcXVldWUgLSBUaGUgcGVyY3B1IHBhZGF0YSBxdWV1ZXMuCisqIHN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlIC0gVGhlIHBlcmNwdSBwYWRhdGEgc2VyaWFsIHF1ZXVlCisqCisqIEBzZXJpYWw6IExpc3QgdG8gd2FpdCBmb3Igc2VyaWFsaXphdGlvbiBhZnRlciByZW9yZGVyaW5nLgorKiBAd29yazogd29yayBzdHJ1Y3QgZm9yIHNlcmlhbGl6YXRpb24uCisqIEBwZDogQmFja3BvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLgorKi8KK3N0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlIHsKKyAgICAgICBzdHJ1Y3QgcGFkYXRhX2xpc3QgICAgc2VyaWFsOworICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICB3b3JrOworICAgICAgIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKK307CisKKy8qKgorICogc3RydWN0IHBhZGF0YV9wYXJhbGxlbF9xdWV1ZSAtIFRoZSBwZXJjcHUgcGFkYXRhIHBhcmFsbGVsIHF1ZXVlCiAgKgogICogQHBhcmFsbGVsOiBMaXN0IHRvIHdhaXQgZm9yIHBhcmFsbGVsaXphdGlvbi4KICAqIEByZW9yZGVyOiBMaXN0IHRvIHdhaXQgZm9yIHJlb3JkZXJpbmcgYWZ0ZXIgcGFyYWxsZWwgcHJvY2Vzc2luZy4KQEAgLTY3LDE4ICs4NSwyOCBAQAogICogQHB3b3JrOiB3b3JrIHN0cnVjdCBmb3IgcGFyYWxsZWxpemF0aW9uLgogICogQHN3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc2VyaWFsaXphdGlvbi4KICAqIEBwZDogQmFja3BvaW50ZXIgdG8gdGhlIGludGVybmFsIGNvbnRyb2wgc3RydWN0dXJlLgorICogQHdvcms6IHdvcmsgc3RydWN0IGZvciBwYXJhbGxlbGl6YXRpb24uCiAgKiBAbnVtX29iajogTnVtYmVyIG9mIG9iamVjdHMgdGhhdCBhcmUgcHJvY2Vzc2VkIGJ5IHRoaXMgY3B1LgogICogQGNwdV9pbmRleDogSW5kZXggb2YgdGhlIGNwdS4KICAqLwotc3RydWN0IHBhZGF0YV9xdWV1ZSB7Ci0Jc3RydWN0IHBhZGF0YV9saXN0CXBhcmFsbGVsOwotCXN0cnVjdCBwYWRhdGFfbGlzdAlyZW9yZGVyOwotCXN0cnVjdCBwYWRhdGFfbGlzdAlzZXJpYWw7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXB3b3JrOwotCXN0cnVjdCB3b3JrX3N0cnVjdAlzd29yazsKLQlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAgICAqcGQ7Ci0JYXRvbWljX3QJCW51bV9vYmo7Ci0JaW50CQkJY3B1X2luZGV4Oworc3RydWN0IHBhZGF0YV9wYXJhbGxlbF9xdWV1ZSB7CisgICAgICAgc3RydWN0IHBhZGF0YV9saXN0ICAgIHBhcmFsbGVsOworICAgICAgIHN0cnVjdCBwYWRhdGFfbGlzdCAgICByZW9yZGVyOworICAgICAgIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKKyAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgd29yazsKKyAgICAgICBhdG9taWNfdCAgICAgICAgICAgICAgbnVtX29iajsKKyAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgY3B1X2luZGV4OworfTsKKworLyoqCisgKiBzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sgLSBUaGUgY3B1bWFza3MgZm9yIHRoZSBwYXJhbGxlbC9zZXJpYWwgd29ya2VycworICoKKyAqIEBwY3B1OiBjcHVtYXNrIGZvciB0aGUgcGFyYWxsZWwgd29ya2Vycy4KKyAqIEBjYmNwdTogY3B1bWFzayBmb3IgdGhlIHNlcmlhbCAoY2FsbGJhY2spIHdvcmtlcnMuCisgKi8KK3N0cnVjdCBwYWRhdGFfY3B1bWFzayB7CisJY3B1bWFza192YXJfdAlwY3B1OworCWNwdW1hc2tfdmFyX3QJY2JjcHU7CiB9OwogCiAvKioKQEAgLTg2LDI1ICsxMTQsMjkgQEAKICAqIHRoYXQgZGVwZW5kcyBvbiB0aGUgY3B1bWFzayBpbiB1c2UuCiAgKgogICogQHBpbnN0OiBwYWRhdGEgaW5zdGFuY2UuCi0gKiBAcXVldWU6IHBlcmNwdSBwYWRhdGEgcXVldWVzLgorICogQHBxdWV1ZTogcGVyY3B1IHBhZGF0YSBxdWV1ZXMgdXNlZCBmb3IgcGFyYWxsZWxpemF0aW9uLgorICogQHNxdWV1ZTogcGVyY3B1IHBhZGF0YSBxdWV1ZXMgdXNlZCBmb3Igc2VyaWFsdXphdGlvbi4KICAqIEBzZXFfbnI6IFRoZSBzZXF1ZW5jZSBudW1iZXIgdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXh0IG9iamVjdC4KICAqIEByZW9yZGVyX29iamVjdHM6IE51bWJlciBvZiBvYmplY3RzIHdhaXRpbmcgaW4gdGhlIHJlb3JkZXIgcXVldWVzLgogICogQHJlZmNudDogTnVtYmVyIG9mIG9iamVjdHMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbiB0aGlzIHBhcmFsbGVsX2RhdGEuCiAgKiBAbWF4X3NlcV9ucjogIE1heGltYWwgdXNlZCBzZXF1ZW5jZSBudW1iZXIuCi0gKiBAY3B1bWFzazogY3B1bWFzayBpbiB1c2UuCisgKiBAY3B1bWFzazogVGhlIGNwdW1hc2tzIGluIHVzZSBmb3IgcGFyYWxsZWwgYW5kIHNlcmlhbCB3b3JrZXJzLgogICogQGxvY2s6IFJlb3JkZXIgbG9jay4KKyAqIEBwcm9jZXNzZWQ6IE51bWJlciBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLgogICogQHRpbWVyOiBSZW9yZGVyIHRpbWVyLgogICovCiBzdHJ1Y3QgcGFyYWxsZWxfZGF0YSB7Ci0Jc3RydWN0IHBhZGF0YV9pbnN0YW5jZQkqcGluc3Q7Ci0Jc3RydWN0IHBhZGF0YV9xdWV1ZQkqcXVldWU7Ci0JYXRvbWljX3QJCXNlcV9ucjsKLQlhdG9taWNfdAkJcmVvcmRlcl9vYmplY3RzOwotCWF0b21pY190ICAgICAgICAgICAgICAgIHJlZmNudDsKLQl1bnNpZ25lZCBpbnQJCW1heF9zZXFfbnI7Ci0JY3B1bWFza192YXJfdAkJY3B1bWFzazsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHRpbWVyOworCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UJCSpwaW5zdDsKKwlzdHJ1Y3QgcGFkYXRhX3BhcmFsbGVsX3F1ZXVlCSpwcXVldWU7CisJc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUJKnNxdWV1ZTsKKwlhdG9taWNfdAkJCXNlcV9ucjsKKwlhdG9taWNfdAkJCXJlb3JkZXJfb2JqZWN0czsKKwlhdG9taWNfdAkJCXJlZmNudDsKKwl1bnNpZ25lZCBpbnQJCQltYXhfc2VxX25yOworCXN0cnVjdCBwYWRhdGFfY3B1bWFzawkJY3B1bWFzazsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIGxvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXVuc2lnbmVkIGludAkJCXByb2Nlc3NlZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJdGltZXI7CiB9OwogCiAvKioKQEAgLTExMywzMSArMTQ1LDQ4IEBACiAgKiBAY3B1X25vdGlmaWVyOiBjcHUgaG90cGx1ZyBub3RpZmllci4KICAqIEB3cTogVGhlIHdvcmtxdWV1ZSBpbiB1c2UuCiAgKiBAcGQ6IFRoZSBpbnRlcm5hbCBjb250cm9sIHN0cnVjdHVyZS4KLSAqIEBjcHVtYXNrOiBVc2VyIHN1cHBsaWVkIGNwdW1hc2suCisgKiBAY3B1bWFzazogVXNlciBzdXBwbGllZCBjcHVtYXNrcyBmb3IgcGFyYWxsZWwgYW5kIHNlcmlhbCB3b3Jrcy4KKyAqIEBjcHVtYXNrX2NoYW5nZV9ub3RpZmllcjogTm90aWZpZXJzIGNoYWluIGZvciB1c2VyLWRlZmluZWQgbm90aWZ5CisgKiAgICAgICAgICAgIGNhbGxiYWNrcyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gZWl0aGVyIEBwY3B1IG9yIEBjYmNwdQorICogICAgICAgICAgICBvciBib3RoIGNwdW1hc2tzIGNoYW5nZS4KKyAqIEBrb2JqOiBwYWRhdGEgaW5zdGFuY2Uga2VybmVsIG9iamVjdC4KICAqIEBsb2NrOiBwYWRhdGEgaW5zdGFuY2UgbG9jay4KICAqIEBmbGFnczogcGFkYXRhIGZsYWdzLgogICovCiBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlIHsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgICBjcHVfbm90aWZpZXI7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwotCXN0cnVjdCBwYXJhbGxlbF9kYXRhCSpwZDsKLQljcHVtYXNrX3Zhcl90ICAgICAgICAgICBjcHVtYXNrOwotCXN0cnVjdCBtdXRleAkJbG9jazsKLQl1OAkJCWZsYWdzOwotI2RlZmluZQlQQURBVEFfSU5JVAkJMQotI2RlZmluZQlQQURBVEFfUkVTRVQJCTIKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJCSBjcHVfbm90aWZpZXI7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKKwlzdHJ1Y3QgcGFyYWxsZWxfZGF0YQkJKnBkOworCXN0cnVjdCBwYWRhdGFfY3B1bWFzawkJY3B1bWFzazsKKwlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZAkgY3B1bWFza19jaGFuZ2Vfbm90aWZpZXI7CisJc3RydWN0IGtvYmplY3QgICAgICAgICAgICAgICAgICAga29iajsKKwlzdHJ1Y3QgbXV0ZXgJCQkgbG9jazsKKwl1OAkJCQkgZmxhZ3M7CisjZGVmaW5lCVBBREFUQV9JTklUCTEKKyNkZWZpbmUJUEFEQVRBX1JFU0VUCTIKKyNkZWZpbmUJUEFEQVRBX0lOVkFMSUQJNAogfTsKIAotZXh0ZXJuIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywKLQkJCQkJICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSk7CitleHRlcm4gc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jX3Bvc3NpYmxlKAorCQkJCQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpOworZXh0ZXJuIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBhZGF0YV9hbGxvYyhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqcGNwdW1hc2ssCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY2JjcHVtYXNrKTsKIGV4dGVybiB2b2lkIHBhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KTsKIGV4dGVybiBpbnQgcGFkYXRhX2RvX3BhcmFsbGVsKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LAogCQkJICAgICAgc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEsIGludCBjYl9jcHUpOwogZXh0ZXJuIHZvaWQgcGFkYXRhX2RvX3NlcmlhbChzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSk7Ci1leHRlcm4gaW50IHBhZGF0YV9zZXRfY3B1bWFzayhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKK2V4dGVybiBpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAogCQkJICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKTsKLWV4dGVybiBpbnQgcGFkYXRhX2FkZF9jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpOwotZXh0ZXJuIGludCBwYWRhdGFfcmVtb3ZlX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSk7Ci1leHRlcm4gdm9pZCBwYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOworZXh0ZXJuIGludCBwYWRhdGFfc2V0X2NwdW1hc2tzKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LAorCQkJICAgICAgIGNwdW1hc2tfdmFyX3QgcGNwdW1hc2ssCisJCQkgICAgICAgY3B1bWFza192YXJfdCBjYmNwdW1hc2spOworZXh0ZXJuIGludCBwYWRhdGFfYWRkX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSwgaW50IG1hc2spOworZXh0ZXJuIGludCBwYWRhdGFfcmVtb3ZlX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSwgaW50IG1hc2spOworZXh0ZXJuIGludCBwYWRhdGFfc3RhcnQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOwogZXh0ZXJuIHZvaWQgcGFkYXRhX3N0b3Aoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpOworZXh0ZXJuIGludCBwYWRhdGFfcmVnaXN0ZXJfY3B1bWFza19ub3RpZmllcihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKwkJCQkJICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrKTsKK2V4dGVybiBpbnQgcGFkYXRhX3VucmVnaXN0ZXJfY3B1bWFza19ub3RpZmllcihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKwkJCQkJICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2spOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCmluZGV4IDViNTlmMzUuLjZmYTMxNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCkBAIC0xMjgsNyArMTI4LDYgQEAKIAogCS8qIFNMVUIgKi8KIAlQR19zbHViX2Zyb3plbiA9IFBHX2FjdGl2ZSwKLQlQR19zbHViX2RlYnVnID0gUEdfZXJyb3IsCiB9OwogCiAjaWZuZGVmIF9fR0VORVJBVElOR19CT1VORFNfSApAQCAtMjE1LDcgKzIxNCw2IEBACiBfX1BBR0VGTEFHKFNsb2JGcmVlLCBzbG9iX2ZyZWUpCiAKIF9fUEFHRUZMQUcoU2x1YkZyb3plbiwgc2x1Yl9mcm96ZW4pCi1fX1BBR0VGTEFHKFNsdWJEZWJ1Zywgc2x1Yl9kZWJ1ZykKIAogLyoKICAqIFByaXZhdGUgcGFnZSBtYXJraW5ncyB0aGF0IG1heSBiZSB1c2VkIGJ5IHRoZSBmaWxlc3lzdGVtIHRoYXQgb3ducyB0aGUgcGFnZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggZjI2ZmRhNy4uYjFkMTc5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0yNzAsNiArMjcwLDggQEAKIAl1bnNpZ25lZCBpbnQJZDFfc3VwcG9ydDoxOwkvKiBMb3cgcG93ZXIgc3RhdGUgRDEgaXMgc3VwcG9ydGVkICovCiAJdW5zaWduZWQgaW50CWQyX3N1cHBvcnQ6MTsJLyogTG93IHBvd2VyIHN0YXRlIEQyIGlzIHN1cHBvcnRlZCAqLwogCXVuc2lnbmVkIGludAlub19kMWQyOjE7CS8qIE9ubHkgYWxsb3cgRDAgYW5kIEQzICovCisJdW5zaWduZWQgaW50CW1taW9fYWx3YXlzX29uOjE7CS8qIGRpc2FsbG93IHR1cm5pbmcgb2ZmIGlvL21lbQorCQkJCQkJICAgZGVjb2RpbmcgZHVyaW5nIGJhciBzaXppbmcgKi8KIAl1bnNpZ25lZCBpbnQJd2FrZXVwX3ByZXBhcmVkOjE7CiAJdW5zaWduZWQgaW50CWQzX2RlbGF5OwkvKiBEMy0+RDAgdHJhbnNpdGlvbiB0aW1lIGluIG1zICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggM2JlZGNjMS4uYzgxZWVjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE0OTQsNiArMTQ5NCw5IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMTAwCTB4MDMwMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDIwMAkweDAzMDIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TQkVfV0FOWEw0MDAJMHgwMTA0CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfU0JFX1QzRTMJMHgwMDA5CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfU0JFXzJUM0UzX1AwCTB4MDkwMQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX1NCRV8yVDNFM19QMQkweDA5MDIKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RPU0hJQkEJCTB4MTE3OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfUElDQ09MT18xCTB4MDEwMQpAQCAtMjA1NCw3ICsyMDU3LDYgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc3MTFFCTB4MTY1MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1CTB4MTY1MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1XzIJMHgxNjU0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MjAJMHgxNjU4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MjEJMHgxNjU5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MjIJMHgxNjVhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MjMJMHgxNjViCkBAIC0yMDY4LDEzICsyMDcwLDExIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTRNCTB4MTY3MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzU1TQkweDE2NzMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1NgkweDE2NzQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MAkweDE2NzYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MQkweDE2NzcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcxNQkweDE2NzgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcxNVMJMHgxNjc5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTQJMHgxNjdhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTUJMHgxNjdiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTBNCTB4MTY3YwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUxTQkweDE2N2QKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MUYJMHgxNjdlCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODdGCTB4MTY3ZgpAQCAtMjI2NCw2ICsyMjY0LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9URElfRUhDSSAgICAgICAgICAweDAxMDEKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0ZSRUVTQ0FMRQkJMHgxOTU3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODMwOAkJMHhjMDA2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODMxNUUJCTB4MDBiNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzgzMTUJCTB4MDBiNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzgzMTRFCQkweDAwYjYKQEAgLTIzMjQsOSArMjMyNSwxMSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYxCTB4MjM2MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYyCTB4MjM2MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYzCTB4MjM2MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY0CTB4MjM2NAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY1CTB4MjM2NQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY2CTB4MjM2NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY4CTB4MjM2OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY5CTB4MjM2OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX1NECTB4MjM4MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQyAweDIzODIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NUwkweDIzODMKQEAgLTI3NzIsMyArMjc3NSw2IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUk1FX0RJR0kzMgkweDk4OTYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9STUVfRElHSTMyX1BSTwkweDk4OTcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9STUVfRElHSTMyXzgJMHg5ODk4CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YRU4JCTB4NTg1MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1hFTl9QTEFURk9STQkweDAwMDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1LmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCmluZGV4IGQzYTM4ZDYuLmI4YjkwODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaApAQCAtNDUsNiArNDUsMTYgQEAKICNkZWZpbmUgUENQVV9NSU5fVU5JVF9TSVpFCQlQRk5fQUxJR04oNjQgPDwgMTApCiAKIC8qCisgKiBQZXJjcHUgYWxsb2NhdG9yIGNhbiBzZXJ2ZSBwZXJjcHUgYWxsb2NhdGlvbnMgYmVmb3JlIHNsYWIgaXMKKyAqIGluaXRpYWxpemVkIHdoaWNoIGFsbG93cyBzbGFiIHRvIGRlcGVuZCBvbiB0aGUgcGVyY3B1IGFsbG9jYXRvci4KKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHBhcmFtZXRlcnMgZGVjaWRlIGhvdyBtdWNoIHJlc291cmNlIHRvCisgKiBwcmVhbGxvY2F0ZSBmb3IgdGhpcy4gIEtlZXAgUEVSQ1BVX0RZTkFNSUNfUkVTRVJWRSBlcXVhbCB0byBvcgorICogbGFyZ2VyIHRoYW4gUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0laRS4KKyAqLworI2RlZmluZSBQRVJDUFVfRFlOQU1JQ19FQVJMWV9TTE9UUwkxMjgKKyNkZWZpbmUgUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0laRQkoMTIgPDwgMTApCisKKy8qCiAgKiBQRVJDUFVfRFlOQU1JQ19SRVNFUlZFIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGZyZWUgYXJlYSB0byBwaWdneQogICogYmFjayBvbiB0aGUgZmlyc3QgY2h1bmsgZm9yIGR5bmFtaWMgcGVyY3B1IGFsbG9jYXRpb24gaWYgYXJjaCBpcwogICogbWFudWFsbHkgYWxsb2NhdGluZyBhbmQgbWFwcGluZyBpdCBmb3IgZmFzdGVyIGFjY2VzcyAoYXMgYSBwYXJ0IG9mCkBAIC0xMDQsMTYgKzExNCwxMSBAQAogCQkJCQkJCSAgICAgaW50IG5yX3VuaXRzKTsKIGV4dGVybiB2b2lkIF9faW5pdCBwY3B1X2ZyZWVfYWxsb2NfaW5mbyhzdHJ1Y3QgcGNwdV9hbGxvY19pbmZvICphaSk7CiAKLWV4dGVybiBzdHJ1Y3QgcGNwdV9hbGxvY19pbmZvICogX19pbml0IHBjcHVfYnVpbGRfYWxsb2NfaW5mbygKLQkJCQlzaXplX3QgcmVzZXJ2ZWRfc2l6ZSwgc3NpemVfdCBkeW5fc2l6ZSwKLQkJCQlzaXplX3QgYXRvbV9zaXplLAotCQkJCXBjcHVfZmNfY3B1X2Rpc3RhbmNlX2ZuX3QgY3B1X2Rpc3RhbmNlX2ZuKTsKLQogZXh0ZXJuIGludCBfX2luaXQgcGNwdV9zZXR1cF9maXJzdF9jaHVuayhjb25zdCBzdHJ1Y3QgcGNwdV9hbGxvY19pbmZvICphaSwKIAkJCQkJIHZvaWQgKmJhc2VfYWRkcik7CiAKICNpZmRlZiBDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LCi1leHRlcm4gaW50IF9faW5pdCBwY3B1X2VtYmVkX2ZpcnN0X2NodW5rKHNpemVfdCByZXNlcnZlZF9zaXplLCBzc2l6ZV90IGR5bl9zaXplLAorZXh0ZXJuIGludCBfX2luaXQgcGNwdV9lbWJlZF9maXJzdF9jaHVuayhzaXplX3QgcmVzZXJ2ZWRfc2l6ZSwgc2l6ZV90IGR5bl9zaXplLAogCQkJCXNpemVfdCBhdG9tX3NpemUsCiAJCQkJcGNwdV9mY19jcHVfZGlzdGFuY2VfZm5fdCBjcHVfZGlzdGFuY2VfZm4sCiAJCQkJcGNwdV9mY19hbGxvY19mbl90IGFsbG9jX2ZuLApAQCAtMTQwLDYgKzE0NSw3IEBACiAjaWZuZGVmIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQogZXh0ZXJuIHZvaWQgX19pbml0IHNldHVwX3Blcl9jcHVfYXJlYXModm9pZCk7CiAjZW5kaWYKK2V4dGVybiB2b2lkIF9faW5pdCBwZXJjcHVfaW5pdF9sYXRlKHZvaWQpOwogCiAjZWxzZSAvKiBDT05GSUdfU01QICovCiAKQEAgLTE1Myw2ICsxNTksOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHNldHVwX3Blcl9jcHVfYXJlYXModm9pZCkgeyB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGVyY3B1X2luaXRfbGF0ZSh2b2lkKSB7IH0KKwogc3RhdGljIGlubGluZSB2b2lkICpwY3B1X2xwYWdlX3JlbWFwcGVkKHZvaWQgKmthZGRyKQogewogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCA1ZDAyNjZkLi43MTZmOTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtMjE0LDggKzIxNCw5IEBACiAJCQkJICogIFNlZSBhbHNvIFBFUkZfUkVDT1JEX01JU0NfRVhBQ1RfSVAKIAkJCQkgKi8KIAkJCQlwcmVjaXNlX2lwICAgICA6ICAyLCAvKiBza2lkIGNvbnN0cmFpbnQgICAgICAgKi8KKwkJCQltbWFwX2RhdGEgICAgICA6ICAxLCAvKiBub24tZXhlYyBtbWFwIGRhdGEgICAgKi8KIAotCQkJCV9fcmVzZXJ2ZWRfMSAgIDogNDc7CisJCQkJX19yZXNlcnZlZF8xICAgOiA0NjsKIAogCXVuaW9uIHsKIAkJX191MzIJCXdha2V1cF9ldmVudHM7CSAgLyogd2FrZXVwIGV2ZXJ5IG4gZXZlbnRzICovCkBAIC00NjEsNiArNDYyLDcgQEAKIAogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUwogIyBpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgorIyBpbmNsdWRlIDxhc20vbG9jYWw2NC5oPgogI2VuZGlmCiAKIHN0cnVjdCBwZXJmX2d1ZXN0X2luZm9fY2FsbGJhY2tzIHsKQEAgLTUzMSwxNCArNTMzLDE2IEBACiAJCQlzdHJ1Y3QgaHJ0aW1lcglocnRpbWVyOwogCQl9OwogI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKLQkJLyogYnJlYWtwb2ludCAqLwotCQlzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50CWluZm87CisJCXN0cnVjdCB7IC8qIGJyZWFrcG9pbnQgKi8KKwkJCXN0cnVjdCBhcmNoX2h3X2JyZWFrcG9pbnQJaW5mbzsKKwkJCXN0cnVjdCBsaXN0X2hlYWQJCWJwX2xpc3Q7CisJCX07CiAjZW5kaWYKIAl9OwotCWF0b21pYzY0X3QJCQlwcmV2X2NvdW50OworCWxvY2FsNjRfdAkJCXByZXZfY291bnQ7CiAJdTY0CQkJCXNhbXBsZV9wZXJpb2Q7CiAJdTY0CQkJCWxhc3RfcGVyaW9kOwotCWF0b21pYzY0X3QJCQlwZXJpb2RfbGVmdDsKKwlsb2NhbDY0X3QJCQlwZXJpb2RfbGVmdDsKIAl1NjQJCQkJaW50ZXJydXB0czsKIAogCXU2NAkJCQlmcmVxX3RpbWVfc3RhbXA7CkBAIC01NDgsNyArNTUyLDEwIEBACiAKIHN0cnVjdCBwZXJmX2V2ZW50OwogCi0jZGVmaW5lIFBFUkZfRVZFTlRfVFhOX1NUQVJURUQgMQorLyoKKyAqIENvbW1vbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgcG11Ojp7c3RhcnQsY29tbWl0LGNhbmNlbH1fdHhuCisgKi8KKyNkZWZpbmUgUEVSRl9FVkVOVF9UWE4gMHgxCiAKIC8qKgogICogc3RydWN0IHBtdSAtIGdlbmVyaWMgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyB1bml0CkBAIC01NjIsMTQgKzU2OSwyOCBAQAogCXZvaWQgKCp1bnRocm90dGxlKQkJKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIAkvKgotCSAqIGdyb3VwIGV2ZW50cyBzY2hlZHVsaW5nIGlzIHRyZWF0ZWQgYXMgYSB0cmFuc2FjdGlvbiwKLQkgKiBhZGQgZ3JvdXAgZXZlbnRzIGFzIGEgd2hvbGUgYW5kIHBlcmZvcm0gb25lIHNjaGVkdWxhYmlsaXR5IHRlc3QuCi0JICogSWYgdGVzdCBmYWlscywgcm9sbCBiYWNrIHRoZSB3aG9sZSBncm91cAorCSAqIEdyb3VwIGV2ZW50cyBzY2hlZHVsaW5nIGlzIHRyZWF0ZWQgYXMgYSB0cmFuc2FjdGlvbiwgYWRkIGdyb3VwCisJICogZXZlbnRzIGFzIGEgd2hvbGUgYW5kIHBlcmZvcm0gb25lIHNjaGVkdWxhYmlsaXR5IHRlc3QuIElmIHRoZSB0ZXN0CisJICogZmFpbHMsIHJvbGwgYmFjayB0aGUgd2hvbGUgZ3JvdXAKIAkgKi8KIAorCS8qCisJICogU3RhcnQgdGhlIHRyYW5zYWN0aW9uLCBhZnRlciB0aGlzIC0+ZW5hYmxlKCkgZG9lc24ndCBuZWVkCisJICogdG8gZG8gc2NoZWR1bGFiaWxpdHkgdGVzdHMuCisJICovCiAJdm9pZCAoKnN0YXJ0X3R4bikJKGNvbnN0IHN0cnVjdCBwbXUgKnBtdSk7Ci0Jdm9pZCAoKmNhbmNlbF90eG4pCShjb25zdCBzdHJ1Y3QgcG11ICpwbXUpOworCS8qCisJICogSWYgLT5zdGFydF90eG4oKSBkaXNhYmxlZCB0aGUgLT5lbmFibGUoKSBzY2hlZHVsYWJpbGl0eSB0ZXN0CisJICogdGhlbiAtPmNvbW1pdF90eG4oKSBpcyByZXF1aXJlZCB0byBwZXJmb3JtIG9uZS4gT24gc3VjY2VzcworCSAqIHRoZSB0cmFuc2FjdGlvbiBpcyBjbG9zZWQuIE9uIGVycm9yIHRoZSB0cmFuc2FjdGlvbiBpcyBrZXB0CisJICogb3BlbiB1bnRpbCAtPmNhbmNlbF90eG4oKSBpcyBjYWxsZWQuCisJICovCiAJaW50ICAoKmNvbW1pdF90eG4pCShjb25zdCBzdHJ1Y3QgcG11ICpwbXUpOworCS8qCisJICogV2lsbCBjYW5jZWwgdGhlIHRyYW5zYWN0aW9uLCBhc3N1bWVzIC0+ZGlzYWJsZSgpIGlzIGNhbGxlZCBmb3IKKwkgKiBlYWNoIHN1Y2Nlc3NmdWxsIC0+ZW5hYmxlKCkgZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl2b2lkICgqY2FuY2VsX3R4bikJKGNvbnN0IHN0cnVjdCBwbXUgKnBtdSk7CiB9OwogCiAvKioKQEAgLTU4NCw3ICs2MDUsOSBAQAogCiBzdHJ1Y3QgZmlsZTsKIAotc3RydWN0IHBlcmZfbW1hcF9kYXRhIHsKKyNkZWZpbmUgUEVSRl9CVUZGRVJfV1JJVEFCTEUJCTB4MDEKKworc3RydWN0IHBlcmZfYnVmZmVyIHsKIAlhdG9taWNfdAkJCXJlZmNvdW50OwogCXN0cnVjdCByY3VfaGVhZAkJCXJjdV9oZWFkOwogI2lmZGVmIENPTkZJR19QRVJGX1VTRV9WTUFMTE9DCkBAIC02NTAsNyArNjczLDggQEAKIAogCWVudW0gcGVyZl9ldmVudF9hY3RpdmVfc3RhdGUJc3RhdGU7CiAJdW5zaWduZWQgaW50CQkJYXR0YWNoX3N0YXRlOwotCWF0b21pYzY0X3QJCQljb3VudDsKKwlsb2NhbDY0X3QJCQljb3VudDsKKwlhdG9taWM2NF90CQkJY2hpbGRfY291bnQ7CiAKIAkvKgogCSAqIFRoZXNlIGFyZSB0aGUgdG90YWwgdGltZSBpbiBuYW5vc2Vjb25kcyB0aGF0IHRoZSBldmVudApAQCAtNzA5LDcgKzczMyw3IEBACiAJYXRvbWljX3QJCQltbWFwX2NvdW50OwogCWludAkJCQltbWFwX2xvY2tlZDsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJCSptbWFwX3VzZXI7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhCQkqZGF0YTsKKwlzdHJ1Y3QgcGVyZl9idWZmZXIJCSpidWZmZXI7CiAKIAkvKiBwb2xsIHJlbGF0ZWQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAkJd2FpdHE7CkBAIC04MDcsNyArODMxLDcgQEAKIAogc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSB7CiAJc3RydWN0IHBlcmZfZXZlbnQJCSpldmVudDsKLQlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEJCSpkYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlcgkJKmJ1ZmZlcjsKIAl1bnNpZ25lZCBsb25nCQkJd2FrZXVwOwogCXVuc2lnbmVkIGxvbmcJCQlzaXplOwogCXZvaWQJCQkJKmFkZHI7CkBAIC05MTAsOCArOTM0LDEwIEBACiAKIGV4dGVybiB2b2lkIF9fcGVyZl9zd19ldmVudCh1MzIsIHU2NCwgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCB1NjQpOwogCi1leHRlcm4gdm9pZAotcGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGlwLCBpbnQgc2tpcCk7CisjaWZuZGVmIHBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncworc3RhdGljIGlubGluZSB2b2lkCitwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgaXApIHsgfQorI2VuZGlmCiAKIC8qCiAgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHJlZ3MuIFNraXAgaXAgYW5kIGZyYW1lIHBvaW50ZXIgdG8KQEAgLTkyMSwzMSArOTQ3LDExIEBACiAgKiAtIGJwIGZvciBjYWxsY2hhaW5zCiAgKiAtIGVmbGFncywgZm9yIGZ1dHVyZSBwdXJwb3NlcywganVzdCBpbiBjYXNlCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2ZldGNoX2NhbGxlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2tpcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2ZldGNoX2NhbGxlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGxvbmcgaXA7Ci0KIAltZW1zZXQocmVncywgMCwgc2l6ZW9mKCpyZWdzKSk7CiAKLQlzd2l0Y2ggKHNraXApIHsKLQljYXNlIDEgOgotCQlpcCA9IENBTExFUl9BRERSMDsKLQkJYnJlYWs7Ci0JY2FzZSAyIDoKLQkJaXAgPSBDQUxMRVJfQUREUjE7Ci0JCWJyZWFrOwotCWNhc2UgMyA6Ci0JCWlwID0gQ0FMTEVSX0FERFIyOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlwID0gQ0FMTEVSX0FERFIzOwotCQlicmVhazsKLQkvKiBObyBuZWVkIHRvIHN1cHBvcnQgZnVydGhlciBmb3Igbm93ICovCi0JZGVmYXVsdDoKLQkJaXAgPSAwOwotCX0KLQotCXJldHVybiBwZXJmX2FyY2hfZmV0Y2hfY2FsbGVyX3JlZ3MocmVncywgaXAsIHNraXApOworCXBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncyhyZWdzLCBDQUxMRVJfQUREUjApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTk1NSwyMSArOTYxLDE0IEBACiAJCXN0cnVjdCBwdF9yZWdzIGhvdF9yZWdzOwogCiAJCWlmICghcmVncykgewotCQkJcGVyZl9mZXRjaF9jYWxsZXJfcmVncygmaG90X3JlZ3MsIDEpOworCQkJcGVyZl9mZXRjaF9jYWxsZXJfcmVncygmaG90X3JlZ3MpOwogCQkJcmVncyA9ICZob3RfcmVnczsKIAkJfQogCQlfX3BlcmZfc3dfZXZlbnQoZXZlbnRfaWQsIG5yLCBubWksIHJlZ3MsIGFkZHIpOwogCX0KIH0KIAotZXh0ZXJuIHZvaWQgX19wZXJmX2V2ZW50X21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykKLQkJX19wZXJmX2V2ZW50X21tYXAodm1hKTsKLX0KLQorZXh0ZXJuIHZvaWQgcGVyZl9ldmVudF9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIGV4dGVybiBzdHJ1Y3QgcGVyZl9ndWVzdF9pbmZvX2NhbGxiYWNrcyAqcGVyZl9ndWVzdF9jYnM7CiBleHRlcm4gaW50IHBlcmZfcmVnaXN0ZXJfZ3Vlc3RfaW5mb19jYWxsYmFja3Moc3RydWN0IHBlcmZfZ3Vlc3RfaW5mb19jYWxsYmFja3MgKmNhbGxiYWNrcyk7CiBleHRlcm4gaW50IHBlcmZfdW5yZWdpc3Rlcl9ndWVzdF9pbmZvX2NhbGxiYWNrcyhzdHJ1Y3QgcGVyZl9ndWVzdF9pbmZvX2NhbGxiYWNrcyAqY2FsbGJhY2tzKTsKQEAgLTEwMDEsNyArMTAwMCw3IEBACiBleHRlcm4gdm9pZCBwZXJmX2V2ZW50X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBwZXJmX3RwX2V2ZW50KHU2NCBhZGRyLCB1NjQgY291bnQsIHZvaWQgKnJlY29yZCwKIAkJCSAgaW50IGVudHJ5X3NpemUsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCk7CisJCQkgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgcmN0eCk7CiBleHRlcm4gdm9pZCBwZXJmX2JwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdm9pZCAqZGF0YSk7CiAKICNpZm5kZWYgcGVyZl9taXNjX2ZsYWdzCkBAIC0xMDY4LDcgKzEwNjcsNyBAQAogI2RlZmluZSBwZXJmX2NwdV9ub3RpZmllcihmbikJCQkJCVwKIGRvIHsJCQkJCQkJCVwKIAlzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZuIyNfbmIgX19jcHVpbml0ZGF0YSA9CVwKLQkJeyAubm90aWZpZXJfY2FsbCA9IGZuLCAucHJpb3JpdHkgPSAyMCB9OwlcCisJCXsgLm5vdGlmaWVyX2NhbGwgPSBmbiwgLnByaW9yaXR5ID0gQ1BVX1BSSV9QRVJGIH07IFwKIAlmbigmZm4jI19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCQlcCiAJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsJXAogCWZuKCZmbiMjX25iLCAodW5zaWduZWQgbG9uZylDUFVfU1RBUlRJTkcsCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bob25ldC5oIGIvaW5jbHVkZS9saW51eC9waG9uZXQuaAppbmRleCBlNTEyNmNmLi4yNDQyNmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bob25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGhvbmV0LmgKQEAgLTU2LDcgKzU2LDcgQEAKIAlfX2JlMTYJcG5fbGVuZ3RoOwogCV9fdTgJcG5fcm9iajsKIAlfX3U4CXBuX3NvYmo7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQ29tbW9uIFBob25ldCBwYXlsb2FkIGhlYWRlciAqLwogc3RydWN0IHBob25ldG1zZyB7CkBAIC05OCw3ICs5OCw3IEBACiAJX191OCBzcG5fZGV2OwogCV9fdTggc3BuX3Jlc291cmNlOwogCV9fdTggc3BuX3plcm9bc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgLSBzaXplb2Yoc2FfZmFtaWx5X3QpIC0gM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFdlbGwga25vd24gYWRkcmVzcyAqLwogI2RlZmluZSBQTl9ERVZfUEMJMHgxMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5LmgKaW5kZXggOTg3ZTExMS4uNmIwYTc4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS5oCkBAIC0yMzQsNiArMjM0LDggQEAKIAlQSFlfUkVTVU1JTkcKIH07CiAKK3N0cnVjdCBza19idWZmOworCiAvKiBwaHlfZGV2aWNlOiBBbiBpbnN0YW5jZSBvZiBhIFBIWQogICoKICAqIGRydjogUG9pbnRlciB0byB0aGUgZHJpdmVyIGZvciB0aGlzIFBIWSBpbnN0YW5jZQpAQCAtNDAyLDYgKzQwNCwyNiBAQAogCS8qIENsZWFycyB1cCBhbnkgbWVtb3J5IGlmIG5lZWRlZCAqLwogCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogCisJLyogSGFuZGxlcyBTSU9DU0hXVFNUQU1QIGlvY3RsIGZvciBoYXJkd2FyZSB0aW1lIHN0YW1waW5nLiAqLworCWludCAgKCpod3RzdGFtcCkoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGlmcmVxICppZnIpOworCisJLyoKKwkgKiBSZXF1ZXN0cyBhIFJ4IHRpbWVzdGFtcCBmb3IgJ3NrYicuIElmIHRoZSBza2IgaXMgYWNjZXB0ZWQsCisJICogdGhlIHBoeSBkcml2ZXIgcHJvbWlzZXMgdG8gZGVsaXZlciBpdCB1c2luZyBuZXRpZl9yeCgpIGFzCisJICogc29vbiBhcyBhIHRpbWVzdGFtcCBiZWNvbWVzIGF2YWlsYWJsZS4gT25lIG9mIHRoZQorCSAqIFBUUF9DTEFTU18gdmFsdWVzIGlzIHBhc3NlZCBpbiAndHlwZScuIFRoZSBmdW5jdGlvbiBtdXN0CisJICogcmV0dXJuIHRydWUgaWYgdGhlIHNrYiBpcyBhY2NlcHRlZCBmb3IgZGVsaXZlcnkuCisJICovCisJYm9vbCAoKnJ4dHN0YW1wKShzdHJ1Y3QgcGh5X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdHlwZSk7CisKKwkvKgorCSAqIFJlcXVlc3RzIGEgVHggdGltZXN0YW1wIGZvciAnc2tiJy4gVGhlIHBoeSBkcml2ZXIgcHJvbWlzZXMKKwkgKiB0byBkZWxpdmVyIGl0IHRvIHRoZSBzb2NrZXQncyBlcnJvciBxdWV1ZSBhcyBzb29uIGFzIGEKKwkgKiB0aW1lc3RhbXAgYmVjb21lcyBhdmFpbGFibGUuIE9uZSBvZiB0aGUgUFRQX0NMQVNTXyB2YWx1ZXMKKwkgKiBpcyBwYXNzZWQgaW4gJ3R5cGUnLgorCSAqLworCXZvaWQgKCp0eHRzdGFtcCkoc3RydWN0IHBoeV9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUpOworCiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOwogfTsKICNkZWZpbmUgdG9fcGh5X2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHBoeV9kcml2ZXIsIGRyaXZlcikKQEAgLTQ5OCw3ICs1MjAsNyBAQAogaW50IHBoeV9ldGh0b29sX3NzZXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpOwogaW50IHBoeV9ldGh0b29sX2dzZXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpOwogaW50IHBoeV9taWlfaW9jdGwoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKLQkJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSwgaW50IGNtZCk7CisJCXN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKIGludCBwaHlfc3RhcnRfaW50ZXJydXB0cyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKIHZvaWQgcGh5X3ByaW50X3N0YXR1cyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKIHN0cnVjdCBwaHlfZGV2aWNlKiBwaHlfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgaW50IHBoeV9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAppbmRleCA1NDE3OTQ0Li5kN2VjYWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKQEAgLTQzLDEwICs0Myw2NCBAQAogZXh0ZXJuIGludCBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IHBsYXRmb3JtX2FkZF9kZXZpY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiosIGludCk7CiAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKGNvbnN0IGNoYXIgKiwgaW50IGlkLAotCQkJCQljb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShzdHJ1Y3QgZGV2aWNlICosCi0JCWNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKAorCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKKwkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW0sCisJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlIC0gYWRkIGEgcGxhdGZvcm0tbGV2ZWwgZGV2aWNlIGFuZCBpdHMgcmVzb3VyY2VzCisgKiBAbmFtZTogYmFzZSBuYW1lIG9mIHRoZSBkZXZpY2Ugd2UncmUgYWRkaW5nCisgKiBAaWQ6IGluc3RhbmNlIGlkCisgKiBAcmVzOiBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgZGV2aWNlCisgKiBAbnVtOiBudW1iZXIgb2YgcmVzb3VyY2VzCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc2ltcGxlIHBsYXRmb3JtIGRldmljZSB0aGF0IHJlcXVpcmVzIG1pbmltYWwKKyAqIHJlc291cmNlIGFuZCBtZW1vcnkgbWFuYWdlbWVudC4gQ2FubmVkIHJlbGVhc2UgZnVuY3Rpb24gZnJlZWluZyBtZW1vcnkKKyAqIGFsbG9jYXRlZCBmb3IgdGhlIGRldmljZSBhbGxvd3MgZHJpdmVycyB1c2luZyBzdWNoIGRldmljZXMgdG8gYmUKKyAqIHVubG9hZGVkIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdG8gYmUKKyAqIGRyb3BwZWQuCisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2Ugd2l0aCBsZWdhY3kgZHJpdmVycyB3aGljaAorICogcHJvYmUgaGFyZHdhcmUgZGlyZWN0bHkuICBCZWNhdXNlIHN1Y2ggZHJpdmVycyBjcmVhdGUgc3lzZnMgZGV2aWNlIG5vZGVzCisgKiB0aGVtc2VsdmVzLCByYXRoZXIgdGhhbiBsZXR0aW5nIHN5c3RlbSBpbmZyYXN0cnVjdHVyZSBoYW5kbGUgc3VjaCBkZXZpY2UKKyAqIGVudW1lcmF0aW9uIHRhc2tzLCB0aGV5IGRvbid0IGZ1bGx5IGNvbmZvcm0gdG8gdGhlIExpbnV4IGRyaXZlciBtb2RlbC4KKyAqIEluIHBhcnRpY3VsYXIsIHdoZW4gc3VjaCBkcml2ZXJzIGFyZSBidWlsdCBhcyBtb2R1bGVzLCB0aGV5IGNhbid0IGJlCisgKiAiaG90cGx1Z2dlZCIuCisgKgorICogUmV0dXJucyAmc3RydWN0IHBsYXRmb3JtX2RldmljZSBwb2ludGVyIG9uIHN1Y2Nlc3MsIG9yIEVSUl9QVFIoKSBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKAorCQljb25zdCBjaGFyICpuYW1lLCBpbnQgaWQsCisJCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEoTlVMTCwgbmFtZSwgaWQsCisJCQlyZXMsIG51bSwgTlVMTCwgMCk7Cit9CisKKy8qKgorICogcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEgLSBhZGQgYSBwbGF0Zm9ybS1sZXZlbCBkZXZpY2Ugd2l0aCBwbGF0Zm9ybS1zcGVjaWZpYyBkYXRhCisgKiBAcGFyZW50OiBwYXJlbnQgZGV2aWNlIGZvciB0aGUgZGV2aWNlIHdlJ3JlIGFkZGluZworICogQG5hbWU6IGJhc2UgbmFtZSBvZiB0aGUgZGV2aWNlIHdlJ3JlIGFkZGluZworICogQGlkOiBpbnN0YW5jZSBpZAorICogQGRhdGE6IHBsYXRmb3JtIHNwZWNpZmljIGRhdGEgZm9yIHRoaXMgcGxhdGZvcm0gZGV2aWNlCisgKiBAc2l6ZTogc2l6ZSBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc2ltcGxlIHBsYXRmb3JtIGRldmljZSB0aGF0IHJlcXVpcmVzIG1pbmltYWwKKyAqIHJlc291cmNlIGFuZCBtZW1vcnkgbWFuYWdlbWVudC4gQ2FubmVkIHJlbGVhc2UgZnVuY3Rpb24gZnJlZWluZyBtZW1vcnkKKyAqIGFsbG9jYXRlZCBmb3IgdGhlIGRldmljZSBhbGxvd3MgZHJpdmVycyB1c2luZyBzdWNoIGRldmljZXMgdG8gYmUKKyAqIHVubG9hZGVkIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdG8gYmUKKyAqIGRyb3BwZWQuCisgKgorICogUmV0dXJucyAmc3RydWN0IHBsYXRmb3JtX2RldmljZSBwb2ludGVyIG9uIHN1Y2Nlc3MsIG9yIEVSUl9QVFIoKSBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YSgKKwkJc3RydWN0IGRldmljZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaWQsCisJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEocGFyZW50LCBuYW1lLCBpZCwKKwkJCU5VTEwsIDAsIGRhdGEsIHNpemUpOworfQogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCk7CiBleHRlcm4gaW50IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsaXN0LmggYi9pbmNsdWRlL2xpbnV4L3BsaXN0LmgKaW5kZXggNjg5ODk4NS4uNzI1NGVkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxpc3QuaApAQCAtMjYwLDYgKzI2MCwyMyBAQAogI2VuZGlmCiAKIC8qKgorICogcGxpc3RfbGFzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGUgbGFzdCBlbnRyeQorICogQGhlYWQ6CXRoZSAmc3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlcgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0CisgKi8KKyNpZmRlZiBDT05GSUdfREVCVUdfUElfTElTVAorIyBkZWZpbmUgcGxpc3RfbGFzdF9lbnRyeShoZWFkLCB0eXBlLCBtZW1iZXIpCVwKKyh7IFwKKwlXQVJOX09OKHBsaXN0X2hlYWRfZW1wdHkoaGVhZCkpOyBcCisJY29udGFpbmVyX29mKHBsaXN0X2xhc3QoaGVhZCksIHR5cGUsIG1lbWJlcik7IFwKK30pCisjZWxzZQorIyBkZWZpbmUgcGxpc3RfbGFzdF9lbnRyeShoZWFkLCB0eXBlLCBtZW1iZXIpCVwKKwljb250YWluZXJfb2YocGxpc3RfbGFzdChoZWFkKSwgdHlwZSwgbWVtYmVyKQorI2VuZGlmCisKKy8qKgogICogcGxpc3RfZmlyc3QgLSByZXR1cm4gdGhlIGZpcnN0IG5vZGUgKGFuZCB0aHVzLCBoaWdoZXN0IHByaW9yaXR5KQogICogQGhlYWQ6CXRoZSAmc3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlcgogICoKQEAgLTI3MSw0ICsyODgsMTYgQEAKIAkJCSAgc3RydWN0IHBsaXN0X25vZGUsIHBsaXN0Lm5vZGVfbGlzdCk7CiB9CiAKKy8qKgorICogcGxpc3RfbGFzdCAtIHJldHVybiB0aGUgbGFzdCBub2RlIChhbmQgdGh1cywgbG93ZXN0IHByaW9yaXR5KQorICogQGhlYWQ6CXRoZSAmc3RydWN0IHBsaXN0X2hlYWQgcG9pbnRlcgorICoKKyAqIEFzc3VtZXMgdGhlIHBsaXN0IGlzIF9ub3RfIGVtcHR5LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbGlzdF9ub2RlICpwbGlzdF9sYXN0KGNvbnN0IHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBsaXN0X2VudHJ5KGhlYWQtPm5vZGVfbGlzdC5wcmV2LAorCQkJICBzdHJ1Y3QgcGxpc3Rfbm9kZSwgcGxpc3Qubm9kZV9saXN0KTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggOGUyNThjNy4uNTJlOGM1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDU3LDYgKzQ1Nyw3IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKIAlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0aW9uOworCXVuc2lnbmVkIGxvbmcJCXdha2V1cF9jb3VudDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiAJc3RydWN0IHRpbWVyX2xpc3QJc3VzcGVuZF90aW1lcjsKQEAgLTQ3Niw5ICs0NzcsMTUgQEAKIAllbnVtIHJwbV9yZXF1ZXN0CXJlcXVlc3Q7CiAJZW51bSBycG1fc3RhdHVzCQlydW50aW1lX3N0YXR1czsKIAlpbnQJCQlydW50aW1lX2Vycm9yOworCXVuc2lnbmVkIGxvbmcJCWFjdGl2ZV9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcJCXN1c3BlbmRlZF9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcJCWFjY291bnRpbmdfdGltZXN0YW1wOwogI2VuZGlmCiB9OwogCitleHRlcm4gdm9pZCB1cGRhdGVfcG1fcnVudGltZV9hY2NvdW50aW5nKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKwogLyoKICAqIFRoZSBQTV9FVkVOVF8gbWVzc2FnZXMgYXJlIGFsc28gdXNlZCBieSBkcml2ZXJzIGltcGxlbWVudGluZyB0aGUgbGVnYWN5CiAgKiBzdXNwZW5kIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIC0+c3VzcGVuZCgpIGFuZCAtPnJlc3VtZSgpIGNhbGxiYWNrcyBjb21tb24KQEAgLTU1Miw2ICs1NTksMTEgQEAKIAl9IHdoaWxlICgwKQogCiBleHRlcm4gdm9pZCBkZXZpY2VfcG1fd2FpdF9mb3JfZGV2KHN0cnVjdCBkZXZpY2UgKnN1Yiwgc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jICovCitleHRlcm4gdm9pZCBwbV93YWtldXBfZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbXNlYyk7CitleHRlcm4gdm9pZCBwbV9zdGF5X2F3YWtlKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBwbV9yZWxheCh2b2lkKTsKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIAogI2RlZmluZSBkZXZpY2VfcG1fbG9jaygpIGRvIHt9IHdoaWxlICgwKQpAQCAtNTY1LDYgKzU3NywxMCBAQAogI2RlZmluZSBzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZm4sIHJldCkJCWRvIHt9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX3BtX3dhaXRfZm9yX2RldihzdHJ1Y3QgZGV2aWNlICphLCBzdHJ1Y3QgZGV2aWNlICpiKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1fd2FrZXVwX2V2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG1zZWMpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcG1fc3RheV9hd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcG1fcmVsYXgodm9pZCkge30KICNlbmRpZiAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKIC8qIEhvdyB0byByZW9yZGVyIGRwbV9saXN0IGFmdGVyIGRldmljZV9tb3ZlKCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG1fcW9zX3BhcmFtcy5oIGIvaW5jbHVkZS9saW51eC9wbV9xb3NfcGFyYW1zLmgKaW5kZXggOGJhNDQwZS4uNzdjYmRkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbV9xb3NfcGFyYW1zLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbV9xb3NfcGFyYW1zLmgKQEAgLTEsOCArMSwxMCBAQAorI2lmbmRlZiBfTElOVVhfUE1fUU9TX1BBUkFNU19ICisjZGVmaW5lIF9MSU5VWF9QTV9RT1NfUEFSQU1TX0gKIC8qIGludGVyZmFjZSBmb3IgdGhlIHBtX3Fvc19wb3dlciBpbmZyYXN0cnVjdHVyZSBvZiB0aGUgbGludXgga2VybmVsLgogICoKICAqIE1hcmsgR3Jvc3MgPG1ncm9zc0BsaW51eC5pbnRlbC5jb20+CiAgKi8KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KIApAQCAtMTQsOSArMTYsMTIgQEAKICNkZWZpbmUgUE1fUU9TX05VTV9DTEFTU0VTIDQKICNkZWZpbmUgUE1fUU9TX0RFRkFVTFRfVkFMVUUgLTEKIAotc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3Q7CitzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCB7CisJc3RydWN0IHBsaXN0X25vZGUgbGlzdDsKKwlpbnQgcG1fcW9zX2NsYXNzOworfTsKIAotc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3QgKnBtX3Fvc19hZGRfcmVxdWVzdChpbnQgcG1fcW9zX2NsYXNzLCBzMzIgdmFsdWUpOwordm9pZCBwbV9xb3NfYWRkX3JlcXVlc3Qoc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3QgKmwsIGludCBwbV9xb3NfY2xhc3MsIHMzMiB2YWx1ZSk7CiB2b2lkIHBtX3Fvc191cGRhdGVfcmVxdWVzdChzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqcG1fcW9zX3JlcSwKIAkJczMyIG5ld192YWx1ZSk7CiB2b2lkIHBtX3Fvc19yZW1vdmVfcmVxdWVzdChzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqcG1fcW9zX3JlcSk7CkBAIC0yNCw0ICsyOSw2IEBACiBpbnQgcG1fcW9zX3JlcXVlc3QoaW50IHBtX3Fvc19jbGFzcyk7CiBpbnQgcG1fcW9zX2FkZF9ub3RpZmllcihpbnQgcG1fcW9zX2NsYXNzLCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTsKIGludCBwbV9xb3NfcmVtb3ZlX25vdGlmaWVyKGludCBwbV9xb3NfY2xhc3MsIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOworaW50IHBtX3Fvc19yZXF1ZXN0X2FjdGl2ZShzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqcmVxKTsKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX3dha2V1cC5oIGIvaW5jbHVkZS9saW51eC9wbV93YWtldXAuaAppbmRleCAyMmQ2NGMxLi43NmFjYTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX3dha2V1cC5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fd2FrZXVwLmgKQEAgLTI5LDggKzI5LDExIEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAotLyogY2hhbmdlcyB0byBkZXZpY2VfbWF5X3dha2V1cCB0YWtlIGVmZmVjdCBvbiB0aGUgbmV4dCBwbSBzdGF0ZSBjaGFuZ2UuCi0gKiBieSBkZWZhdWx0LCBkZXZpY2VzIHNob3VsZCB3YWtldXAgaWYgdGhleSBjYW4uCisvKiBDaGFuZ2VzIHRvIGRldmljZV9tYXlfd2FrZXVwIHRha2UgZWZmZWN0IG9uIHRoZSBuZXh0IHBtIHN0YXRlIGNoYW5nZS4KKyAqCisgKiBCeSBkZWZhdWx0LCBtb3N0IGRldmljZXMgc2hvdWxkIGxlYXZlIHdha2V1cCBkaXNhYmxlZC4gIFRoZSBleGNlcHRpb25zCisgKiBhcmUgZGV2aWNlcyB0aGF0IGV2ZXJ5b25lIGV4cGVjdHMgdG8gYmUgd2FrZXVwIHNvdXJjZXM6IGtleWJvYXJkcywKKyAqIHBvd2VyIGJ1dHRvbnMsIHBvc3NpYmx5IG5ldHdvcmsgaW50ZXJmYWNlcywgZXRjLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX2luaXRfd2FrZXVwKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCB2YWwpCiB7CkBAIC01OSw3ICs2Miw3IEBACiAKICNlbHNlIC8qICFDT05GSUdfUE0gKi8KIAotLyogRm9yIHNvbWUgcmVhc29uIHRoZSBuZXh0IHR3byByb3V0aW5lcyB3b3JrIGV2ZW4gd2l0aG91dCBDT05GSUdfUE0gKi8KKy8qIEZvciBzb21lIHJlYXNvbiB0aGUgZm9sbG93aW5nIHJvdXRpbmVzIHdvcmsgZXZlbiB3aXRob3V0IENPTkZJR19QTSAqLwogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9pbml0X3dha2V1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgdmFsKQogewogCWRldi0+cG93ZXIuY2FuX3dha2V1cCA9IHZhbDsKQEAgLTY3LDYgKzcwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGNhcGFibGUpCiB7CisJZGV2LT5wb3dlci5jYW5fd2FrZXVwID0gY2FwYWJsZTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGRldmljZV9jYW5fd2FrZXVwKHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG5wLmggYi9pbmNsdWRlL2xpbnV4L3BucC5oCmluZGV4IDdjNDE5M2UuLjFiYzEzMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG5wLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbnAuaApAQCAtNDE0LDYgKzQxNCw3IEBACiAJaW50ICgqZGlzYWJsZSkgKHN0cnVjdCBwbnBfZGV2ICpkZXYpOwogCiAJLyogcHJvdG9jb2wgc3BlY2lmaWMgc3VzcGVuZC9yZXN1bWUgKi8KKwlib29sICgqY2FuX3dha2V1cCkgKHN0cnVjdCBwbnBfZGV2ICpkZXYpOwogCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgcG5wX2RldiAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgcG5wX2RldiAqIGRldik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXIvano0NzQwLWJhdHRlcnkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvano0NzQwLWJhdHRlcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWM5NjEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9qejQ3NDAtYmF0dGVyeS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5LCBKaWVqaW5nIFpoYW5nIDxremplZWZAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fSlo0NzQwX0JBVFRFUllfSAorI2RlZmluZSBfX0paNDc0MF9CQVRURVJZX0gKKworc3RydWN0IGp6X2JhdHRlcnlfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvIGluZm87CisJaW50IGdwaW9fY2hhcmdlOwkvKiBHUElPIHBvcnQgb2YgQ2hhcmdlciBzdGF0ZSAqLworCWludCBncGlvX2NoYXJnZV9hY3RpdmVfbG93OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cF9jbGFzc2lmeS5oIGIvaW5jbHVkZS9saW51eC9wdHBfY2xhc3NpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNhODVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wdHBfY2xhc3NpZnkuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIFBUUCAxNTg4IHN1cHBvcnQKKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIEJQRiB0aGF0IHJlY29nbml6ZXMgUFRQIGV2ZW50IG1lc3NhZ2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBPTUlDUk9OIGVsZWN0cm9uaWNzIEdtYkgKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1BUUF9DTEFTU0lGWV9IXworI2RlZmluZSBfUFRQX0NMQVNTSUZZX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKyNkZWZpbmUgUFRQX0NMQVNTX05PTkUgIDB4MDAgLyogbm90IGEgUFRQIGV2ZW50IG1lc3NhZ2UgKi8KKyNkZWZpbmUgUFRQX0NMQVNTX1YxICAgIDB4MDEgLyogcHJvdG9jb2wgdmVyc2lvbiAxICovCisjZGVmaW5lIFBUUF9DTEFTU19WMiAgICAweDAyIC8qIHByb3RvY29sIHZlcnNpb24gMiAqLworI2RlZmluZSBQVFBfQ0xBU1NfVk1BU0sgMHgwZiAvKiBtYXggcHJvdG9jb2wgdmVyc2lvbiBpcyAxNSAqLworI2RlZmluZSBQVFBfQ0xBU1NfSVBWNCAgMHgxMCAvKiBldmVudCBpbiBhbiBJUFY0IFVEUCBwYWNrZXQgKi8KKyNkZWZpbmUgUFRQX0NMQVNTX0lQVjYgIDB4MjAgLyogZXZlbnQgaW4gYW4gSVBWNiBVRFAgcGFja2V0ICovCisjZGVmaW5lIFBUUF9DTEFTU19MMiAgICAweDMwIC8qIGV2ZW50IGluIGEgTDIgcGFja2V0ICovCisjZGVmaW5lIFBUUF9DTEFTU19WTEFOICAweDQwIC8qIGV2ZW50IGluIGEgVkxBTiB0YWdnZWQgTDIgcGFja2V0ICovCisjZGVmaW5lIFBUUF9DTEFTU19QTUFTSyAweGYwIC8qIG1hc2sgZm9yIHRoZSBwYWNrZXQgdHlwZSBmaWVsZCAqLworCisjZGVmaW5lIFBUUF9DTEFTU19WMV9JUFY0IChQVFBfQ0xBU1NfVjEgfCBQVFBfQ0xBU1NfSVBWNCkKKyNkZWZpbmUgUFRQX0NMQVNTX1YxX0lQVjYgKFBUUF9DTEFTU19WMSB8IFBUUF9DTEFTU19JUFY2KSAvKnByb2JhYmx5IERORSovCisjZGVmaW5lIFBUUF9DTEFTU19WMl9JUFY0IChQVFBfQ0xBU1NfVjIgfCBQVFBfQ0xBU1NfSVBWNCkKKyNkZWZpbmUgUFRQX0NMQVNTX1YyX0lQVjYgKFBUUF9DTEFTU19WMiB8IFBUUF9DTEFTU19JUFY2KQorI2RlZmluZSBQVFBfQ0xBU1NfVjJfTDIgICAoUFRQX0NMQVNTX1YyIHwgUFRQX0NMQVNTX0wyKQorI2RlZmluZSBQVFBfQ0xBU1NfVjJfVkxBTiAoUFRQX0NMQVNTX1YyIHwgUFRQX0NMQVNTX1ZMQU4pCisKKyNkZWZpbmUgUFRQX0VWX1BPUlQgMzE5CisKKyNkZWZpbmUgT0ZGX0VUWVBFCTEyCisjZGVmaW5lIE9GRl9JSEwJCTE0CisjZGVmaW5lIE9GRl9GUkFHCTIwCisjZGVmaW5lIE9GRl9QUk9UTzQJMjMKKyNkZWZpbmUgT0ZGX05FWFQJNgorI2RlZmluZSBPRkZfVURQX0RTVAkyCisKKyNkZWZpbmUgSVA2X0hMRU4JNDAKKyNkZWZpbmUgVURQX0hMRU4JOAorCisjZGVmaW5lIFJFTE9GRl9EU1Q0CShFVEhfSExFTiArIE9GRl9VRFBfRFNUKQorI2RlZmluZSBPRkZfRFNUNgkoRVRIX0hMRU4gKyBJUDZfSExFTiArIE9GRl9VRFBfRFNUKQorI2RlZmluZSBPRkZfUFRQNgkoRVRIX0hMRU4gKyBJUDZfSExFTiArIFVEUF9ITEVOKQorCisjZGVmaW5lIE9QX0FORAkoQlBGX0FMVSB8IEJQRl9BTkQgIHwgQlBGX0spCisjZGVmaW5lIE9QX0pFUQkoQlBGX0pNUCB8IEJQRl9KRVEgIHwgQlBGX0spCisjZGVmaW5lIE9QX0pTRVQJKEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LKQorI2RlZmluZSBPUF9MREIJKEJQRl9MRCAgfCBCUEZfQiAgICB8IEJQRl9BQlMpCisjZGVmaW5lIE9QX0xESAkoQlBGX0xEICB8IEJQRl9IICAgIHwgQlBGX0FCUykKKyNkZWZpbmUgT1BfTERISQkoQlBGX0xEICB8IEJQRl9IICAgIHwgQlBGX0lORCkKKyNkZWZpbmUgT1BfTERYCShCUEZfTERYIHwgQlBGX0IgICAgfCBCUEZfTVNIKQorI2RlZmluZSBPUF9PUgkoQlBGX0FMVSB8IEJQRl9PUiAgIHwgQlBGX0spCisjZGVmaW5lIE9QX1JFVEEJKEJQRl9SRVQgfCBCUEZfQSkKKyNkZWZpbmUgT1BfUkVUSwkoQlBGX1JFVCB8IEJQRl9LKQorCitzdGF0aWMgaW5saW5lIGludCBwdHBfZmlsdGVyX2luaXQoc3RydWN0IHNvY2tfZmlsdGVyICpmLCBpbnQgbGVuKQoreworCWlmIChPUF9MREggPT0gZlswXS5jb2RlKQorCQlyZXR1cm4gc2tfY2hrX2ZpbHRlcihmLCBsZW4pOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUFRQX0ZJTFRFUiBcCisJe09QX0xESCwJMCwgICAwLCBPRkZfRVRZUEUJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX0pFUSwJMCwgIDEyLCBFVEhfUF9JUAkJfSwgLyogZiBnb3RvIEwyMCAgICovIFwKKwl7T1BfTERCLAkwLCAgIDAsIE9GRl9QUk9UTzQJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX0pFUSwJMCwgICA5LCBJUFBST1RPX1VEUAkJfSwgLyogZiBnb3RvIEwxMCAgICovIFwKKwl7T1BfTERILAkwLCAgIDAsIE9GRl9GUkFHCQl9LCAvKiAgICAgICAgICAgICAgKi8gXAorCXtPUF9KU0VULAk3LCAgIDAsIDB4MWZmZgkJCX0sIC8qIHQgZ290byBMMTEgICAqLyBcCisJe09QX0xEWCwJMCwgICAwLCBPRkZfSUhMCQkJfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfTERISSwJMCwgICAwLCBSRUxPRkZfRFNUNAkJfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfSkVRLAkwLCAgIDQsIFBUUF9FVl9QT1JUCQl9LCAvKiBmIGdvdG8gTDEyICAgKi8gXAorCXtPUF9MREhJLAkwLCAgIDAsIEVUSF9ITEVOICsgVURQX0hMRU4JfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfQU5ELAkwLCAgIDAsIFBUUF9DTEFTU19WTUFTSwkJfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfT1IsCQkwLCAgIDAsIFBUUF9DTEFTU19JUFY0CQl9LCAvKiAgICAgICAgICAgICAgKi8gXAorCXtPUF9SRVRBLAkwLCAgIDAsIDAJCQl9LCAvKiAgICAgICAgICAgICAgKi8gXAorLypMMXgqLwl7T1BfUkVUSywJMCwgICAwLCBQVFBfQ0xBU1NfTk9ORQkJfSwgLyogICAgICAgICAgICAgICovIFwKKy8qTDIwKi8Je09QX0pFUSwJMCwgICA5LCBFVEhfUF9JUFY2CQl9LCAvKiBmIGdvdG8gTDQwICAgKi8gXAorCXtPUF9MREIsCTAsICAgMCwgRVRIX0hMRU4gKyBPRkZfTkVYVAl9LCAvKiAgICAgICAgICAgICAgKi8gXAorCXtPUF9KRVEsCTAsICAgNiwgSVBQUk9UT19VRFAJCX0sIC8qIGYgZ290byBMMzAgICAqLyBcCisJe09QX0xESCwJMCwgICAwLCBPRkZfRFNUNgkJfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfSkVRLAkwLCAgIDQsIFBUUF9FVl9QT1JUCQl9LCAvKiBmIGdvdG8gTDMxICAgKi8gXAorCXtPUF9MREgsCTAsICAgMCwgT0ZGX1BUUDYJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX0FORCwJMCwgICAwLCBQVFBfQ0xBU1NfVk1BU0sJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX09SLAkJMCwgICAwLCBQVFBfQ0xBU1NfSVBWNgkJfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfUkVUQSwJMCwgICAwLCAwCQkJfSwgLyogICAgICAgICAgICAgICovIFwKKy8qTDN4Ki8Je09QX1JFVEssCTAsICAgMCwgUFRQX0NMQVNTX05PTkUJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisvKkw0MCovCXtPUF9KRVEsCTAsICAgNiwgRVRIX1BfODAyMVEJCX0sIC8qIGYgZ290byBMNTAgICAqLyBcCisJe09QX0xESCwJMCwgICAwLCBPRkZfRVRZUEUgKyA0CQl9LCAvKiAgICAgICAgICAgICAgKi8gXAorCXtPUF9KRVEsCTAsICAgOSwgRVRIX1BfMTU4OAkJfSwgLyogZiBnb3RvIEw2MCAgICovIFwKKwl7T1BfTERILAkwLCAgIDAsIEVUSF9ITEVOICsgVkxBTl9ITEVOCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX0FORCwJMCwgICAwLCBQVFBfQ0xBU1NfVk1BU0sJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX09SLAkJMCwgICAwLCBQVFBfQ0xBU1NfVkxBTgkJfSwgLyogICAgICAgICAgICAgICovIFwKKwl7T1BfUkVUQSwJMCwgICAwLCAwCQkJfSwgLyogICAgICAgICAgICAgICovIFwKKy8qTDUwKi8Je09QX0pFUSwJMCwgICA0LCBFVEhfUF8xNTg4CQl9LCAvKiBmIGdvdG8gTDYxICAgKi8gXAorCXtPUF9MREgsCTAsICAgMCwgRVRIX0hMRU4JCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX0FORCwJMCwgICAwLCBQVFBfQ0xBU1NfVk1BU0sJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX09SLAkJMCwgICAwLCBQVFBfQ0xBU1NfTDIJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisJe09QX1JFVEEsCTAsICAgMCwgMAkJCX0sIC8qICAgICAgICAgICAgICAqLyBcCisvKkw2eCovCXtPUF9SRVRLLAkwLCAgIDAsIFBUUF9DTEFTU19OT05FCQl9LAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYXJfcmVnaXN0ZXIvcmFyX3JlZ2lzdGVyLmggYi9pbmNsdWRlL2xpbnV4L3Jhcl9yZWdpc3Rlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcmFyX3JlZ2lzdGVyL3Jhcl9yZWdpc3Rlci5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L3Jhcl9yZWdpc3Rlci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggYjY1M2I0YS4uOWZiYzU0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnb2JqZWN0cy5oPgogCiAjaWZkZWYgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QKIGV4dGVybiBpbnQgcmN1dG9ydHVyZV9ydW5uYWJsZTsgLyogZm9yIHN5c2N0bCAqLwpAQCAtNzksNiArODAsMTYgQEAKICAgICAgICAocHRyKS0+bmV4dCA9IE5VTEw7IChwdHIpLT5mdW5jID0gTlVMTDsgXAogfSB3aGlsZSAoMCkKIAorLyoKKyAqIGluaXRfcmN1X2hlYWRfb25fc3RhY2soKS9kZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCkgYXJlIG5lZWRlZCBmb3IgZHluYW1pYworICogaW5pdGlhbGl6YXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIHJjdV9oZWFkIG9uIHRoZSBzdGFjay4gcmN1X2hlYWQgc3RydWN0dXJlcworICogYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGluIHRoZSBoZWFwIG9yIGRlZmluZWQgc3RhdGljYWxseSBkb24ndCBuZWVkIGFueQorICogaW5pdGlhbGl6YXRpb24uCisgKi8KKyNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRAorZXh0ZXJuIHZvaWQgaW5pdF9yY3VfaGVhZF9vbl9zdGFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpOworZXh0ZXJuIHZvaWQgZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpOworI2Vsc2UgLyogIUNPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9yY3VfaGVhZF9vbl9zdGFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiB9CkBAIC04Niw2ICs5Nyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiB9CisjZW5kaWYJLyogI2Vsc2UgIUNPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwogCkBAIC01MTcsNCArNTI5LDc0IEBACiBleHRlcm4gdm9pZCBjYWxsX3JjdV9iaChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsCiAJCQl2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpoZWFkKSk7CiAKKy8qCisgKiBkZWJ1Z19yY3VfaGVhZF9xdWV1ZSgpL2RlYnVnX3JjdV9oZWFkX3VucXVldWUoKSBhcmUgdXNlZCBpbnRlcm5hbGx5CisgKiBieSBjYWxsX3JjdSgpIGFuZCByY3UgY2FsbGJhY2sgZXhlY3V0aW9uLCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgcGFydCBvZiB0aGUKKyAqIFJDVSBBUEkuIExlYXZpbmcgaW4gcmN1cGRhdGUuaCBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYnkgYWxsIFJDVSBmbGF2b3JzLgorICovCisKKyNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRAorIyBkZWZpbmUgU1RBVEVfUkNVX0hFQURfUkVBRFkJMAorIyBkZWZpbmUgU1RBVEVfUkNVX0hFQURfUVVFVUVECTEKKworZXh0ZXJuIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgcmN1aGVhZF9kZWJ1Z19kZXNjcjsKKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3JjdV9oZWFkX3F1ZXVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlkZWJ1Z19vYmplY3RfYWN0aXZhdGUoaGVhZCwgJnJjdWhlYWRfZGVidWdfZGVzY3IpOworCWRlYnVnX29iamVjdF9hY3RpdmVfc3RhdGUoaGVhZCwgJnJjdWhlYWRfZGVidWdfZGVzY3IsCisJCQkJICBTVEFURV9SQ1VfSEVBRF9SRUFEWSwKKwkJCQkgIFNUQVRFX1JDVV9IRUFEX1FVRVVFRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19yY3VfaGVhZF91bnF1ZXVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlkZWJ1Z19vYmplY3RfYWN0aXZlX3N0YXRlKGhlYWQsICZyY3VoZWFkX2RlYnVnX2Rlc2NyLAorCQkJCSAgU1RBVEVfUkNVX0hFQURfUVVFVUVELAorCQkJCSAgU1RBVEVfUkNVX0hFQURfUkVBRFkpOworCWRlYnVnX29iamVjdF9kZWFjdGl2YXRlKGhlYWQsICZyY3VoZWFkX2RlYnVnX2Rlc2NyKTsKK30KKyNlbHNlCS8qICFDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3JjdV9oZWFkX3F1ZXVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3JjdV9oZWFkX3VucXVldWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworfQorI2VuZGlmCS8qICNlbHNlICFDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLworCisjaWZuZGVmIENPTkZJR19QUk9WRV9SQ1UKKyNkZWZpbmUgX19kb19yY3VfZGVyZWZlcmVuY2VfY2hlY2soYykgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUFJPVkVfUkNVICovCisKKyNkZWZpbmUgX19yY3VfZGVyZWZlcmVuY2VfaW5kZXhfY2hlY2socCwgYykgXAorCSh7IFwKKwkJdHlwZW9mKHApIF9fX19fX19fX3AxID0gQUNDRVNTX09OQ0UocCk7IFwKKwkJX19kb19yY3VfZGVyZWZlcmVuY2VfY2hlY2soYyk7IFwKKwkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IFwKKwkJKF9fX19fX19fX3AxKTsgXAorCX0pCisKKy8qKgorICogcmN1X2RlcmVmZXJlbmNlX2luZGV4X2NoZWNrKCkgLSByY3VfZGVyZWZlcmVuY2UgZm9yIGluZGljZXMgd2l0aCBkZWJ1ZyBjaGVja2luZworICogQHA6IFRoZSBwb2ludGVyIHRvIHJlYWQsIHByaW9yIHRvIGRlcmVmZXJlbmNpbmcKKyAqIEBjOiBUaGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUgZGVyZWZlcmVuY2Ugd2lsbCB0YWtlIHBsYWNlCisgKgorICogU2ltaWxhciB0byByY3VfZGVyZWZlcmVuY2VfY2hlY2soKSwgYnV0IG9taXRzIHRoZSBzcGFyc2UgY2hlY2tpbmcuCisgKiBUaGlzIGFsbG93cyByY3VfZGVyZWZlcmVuY2VfaW5kZXhfY2hlY2soKSB0byBiZSB1c2VkIG9uIGludGVnZXJzLAorICogd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBhcyBhcnJheSBpbmRpY2VzLiAgQXR0ZW1wdGluZyB0byB1c2UKKyAqIHJjdV9kZXJlZmVyZW5jZV9jaGVjaygpIG9uIGFuIGludGVnZXIgd2lsbCBnaXZlIGNvbXBpbGVyIHdhcm5pbmdzCisgKiBiZWNhdXNlIHRoZSBzcGFyc2UgYWRkcmVzcy1zcGFjZSBtZWNoYW5pc20gcmVsaWVzIG9uIGRlcmVmZXJlbmNpbmcKKyAqIHRoZSBSQ1UtcHJvdGVjdGVkIHBvaW50ZXIuICBEZXJlZmVyZW5jaW5nIGludGVnZXJzIGlzIG5vdCBzb21ldGhpbmcKKyAqIHRoYXQgZXZlbiBnY2Mgd2lsbCBwdXQgdXAgd2l0aC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBsaWNpdGx5IGNoZWNrIGZvciBSQ1UgcmVhZC1zaWRlCisgKiBjcml0aWNhbCBzZWN0aW9ucy4gIElmIHRoaXMgZnVuY3Rpb24gZ2FpbnMgbG90cyBvZiB1c2VzLCBpdCBtaWdodAorICogbWFrZSBzZW5zZSB0byBwcm92aWRlIHZlcnNpb25zIGZvciBlYWNoIGZsYXZvciBvZiBSQ1UsIGJ1dCBpdCBkb2VzCisgKiBub3QgbWFrZSBzZW5zZSBhcyBvZiBlYXJseSAyMDEwLgorICovCisjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZV9pbmRleF9jaGVjayhwLCBjKSBcCisJX19yY3VfZGVyZWZlcmVuY2VfaW5kZXhfY2hlY2soKHApLCAoYykpCisKICNlbmRpZiAvKiBfX0xJTlVYX1JDVVBEQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmRzLmggYi9pbmNsdWRlL2xpbnV4L3Jkcy5oCmluZGV4IGNhYjQ5OTQuLjI0YmNlM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZHMuaApAQCAtMTAwLDcgKzEwMCw3IEBACiBzdHJ1Y3QgcmRzX2luZm9fY291bnRlciB7CiAJdV9pbnQ4X3QJbmFtZVszMl07CiAJdV9pbnQ2NF90CXZhbHVlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgUkRTX0lORk9fQ09OTkVDVElPTl9GTEFHX1NFTkRJTkcJMHgwMQogI2RlZmluZSBSRFNfSU5GT19DT05ORUNUSU9OX0ZMQUdfQ09OTkVDVElORwkweDAyCkBAIC0xMTUsNyArMTE1LDcgQEAKIAlfX2JlMzIJCWZhZGRyOwogCXVfaW50OF90CXRyYW5zcG9ydFtUUkFOU05BTVNJWl07CQkvKiBudWxsIHRlcm0gYXNjaWkgKi8KIAl1X2ludDhfdAlmbGFnczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcmRzX2luZm9fZmxvdyB7CiAJX19iZTMyCQlsYWRkcjsKQEAgLTEyMyw3ICsxMjMsNyBAQAogCXVfaW50MzJfdAlieXRlczsKIAlfX2JlMTYJCWxwb3J0OwogCV9fYmUxNgkJZnBvcnQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBSRFNfSU5GT19NRVNTQUdFX0ZMQUdfQUNLICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBSRFNfSU5GT19NRVNTQUdFX0ZMQUdfRkFTVF9BQ0sgICAgICAgICAgMHgwMgpAQCAtMTM2LDcgKzEzNiw3IEBACiAJX19iZTE2CQlscG9ydDsKIAlfX2JlMTYJCWZwb3J0OwogCXVfaW50OF90CWZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByZHNfaW5mb19zb2NrZXQgewogCXVfaW50MzJfdAlzbmRidWY7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlfX2JlMTYJCWNvbm5lY3RlZF9wb3J0OwogCXVfaW50MzJfdAlyY3ZidWY7CiAJdV9pbnQ2NF90CWludW07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJkc19pbmZvX3RjcF9zb2NrZXQgewogCV9fYmUzMiAgICAgICAgICBsb2NhbF9hZGRyOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJdV9pbnQzMl90ICAgICAgIGxhc3Rfc2VudF9ueHQ7CiAJdV9pbnQzMl90ICAgICAgIGxhc3RfZXhwZWN0ZWRfdW5hOwogCXVfaW50MzJfdCAgICAgICBsYXN0X3NlZW5fdW5hOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgUkRTX0lCX0dJRF9MRU4JMTYKIHN0cnVjdCByZHNfaW5mb19yZG1hX2Nvbm5lY3Rpb24gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvdHBzNjUwN3guaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL3RwczY1MDd4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MmY1OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL3RwczY1MDd4LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIHRwczY1MDd4LmggIC0tICBWb2x0YWdlIHJlZ3VsYXRpb24gZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUUFM2NTA3WAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBSRUdVTEFUT1JfVFBTNjUwN1gKKyNkZWZpbmUgUkVHVUxBVE9SX1RQUzY1MDdYCisKKy8qKgorICogdHBzNjUwN3hfcmVnX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciB0cHM2NTA3eAorICogQGRlZmRjZGNfZGVmYXVsdDogRGVmaW5lcyB3aGV0aGVyIERDREMgaGlnaCBvciB0aGUgbG93IHJlZ2lzdGVyIGNvbnRyb2xzCisgKglvdXRwdXQgdm9sdGFnZSBieSBkZWZhdWx0LiBWYWxpZCBmb3IgRENEQzIgYW5kIERDREMzIG91dHB1dHMgb25seS4KKyAqLworc3RydWN0IHRwczY1MDd4X3JlZ19wbGF0Zm9ybV9kYXRhIHsKKwlib29sIGRlZmRjZGNfZGVmYXVsdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCmluZGV4IDNiNjAzZjQuLmJhMzk0MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKQEAgLTM2MCw3ICszNjAsNyBAQAogLyogdGhlIHNwb3QgZm9yIHRoZSBzdXBlciBpbiB2ZXJzaW9ucyAzLjUgLSAzLjUuMTAgKGluY2x1c2l2ZSkgKi8KICNkZWZpbmUgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICg4ICogMTAyNCkKIAotLy8gcmVpc2VyZnMgaW50ZXJuYWwgZXJyb3IgY29kZSAodXNlZCBieSBzZWFyY2hfYnlfa2V5IGFkbiBmaXhfbm9kZXMpKQorLyogcmVpc2VyZnMgaW50ZXJuYWwgZXJyb3IgY29kZSAodXNlZCBieSBzZWFyY2hfYnlfa2V5IGFuZCBmaXhfbm9kZXMpKSAqLwogI2RlZmluZSBDQVJSWV9PTiAgICAgIDAKICNkZWZpbmUgUkVQRUFUX1NFQVJDSCAtMQogI2RlZmluZSBJT19FUlJPUiAgICAgIC0yCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAppbmRleCBmYmM4Y2IwLi41OGQ0NDQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKQEAgLTI4Miw2ICsyODIsNyBAQAogCVJUQV9TRVNTSU9OLCAvKiBubyBsb25nZXIgdXNlZCAqLwogCVJUQV9NUF9BTEdPLCAvKiBubyBsb25nZXIgdXNlZCAqLwogCVJUQV9UQUJMRSwKKwlSVEFfTUFSSywKIAlfX1JUQV9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA3NDdmY2FlLi45NTkxOTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0yMTQsNiArMjE0LDcgQEAKIAogI2RlZmluZSB0YXNrX2lzX3RyYWNlZCh0YXNrKQkoKHRhc2stPnN0YXRlICYgX19UQVNLX1RSQUNFRCkgIT0gMCkKICNkZWZpbmUgdGFza19pc19zdG9wcGVkKHRhc2spCSgodGFzay0+c3RhdGUgJiBfX1RBU0tfU1RPUFBFRCkgIT0gMCkKKyNkZWZpbmUgdGFza19pc19kZWFkKHRhc2spCSgodGFzayktPmV4aXRfc3RhdGUgIT0gMCkKICNkZWZpbmUgdGFza19pc19zdG9wcGVkX29yX3RyYWNlZCh0YXNrKQlcCiAJCQkoKHRhc2stPnN0YXRlICYgKF9fVEFTS19TVE9QUEVEIHwgX19UQVNLX1RSQUNFRCkpICE9IDApCiAjZGVmaW5lIHRhc2tfY29udHJpYnV0ZXNfdG9fbG9hZCh0YXNrKQlcCkBAIC0yNzEsMTkgKzI3MiwxMCBAQAogCiBleHRlcm4gY3B1bWFza192YXJfdCBub2h6X2NwdV9tYXNrOwogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFopCi1leHRlcm4gaW50IHNlbGVjdF9ub2h6X2xvYWRfYmFsYW5jZXIoaW50IGNwdSk7Ci1leHRlcm4gaW50IGdldF9ub2h6X2xvYWRfYmFsYW5jZXIodm9pZCk7Ci1leHRlcm4gaW50IG5vaHpfcmF0ZWxpbWl0KGludCBjcHUpOworZXh0ZXJuIHZvaWQgc2VsZWN0X25vaHpfbG9hZF9iYWxhbmNlcihpbnQgc3RvcF90aWNrKTsKK2V4dGVybiBpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHZvaWQpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHNlbGVjdF9ub2h6X2xvYWRfYmFsYW5jZXIoaW50IGNwdSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbm9oel9yYXRlbGltaXQoaW50IGNwdSkKLXsKLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxlY3Rfbm9oel9sb2FkX2JhbGFuY2VyKGludCBzdG9wX3RpY2spIHsgfQogI2VuZGlmCiAKIC8qCkBAIC0zMTUsMjAgKzMwNywxNiBAQAogCiBleHRlcm4gdm9pZCBzY2hlZF9zaG93X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAotI2lmZGVmIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUAotZXh0ZXJuIHZvaWQgc29mdGxvY2t1cF90aWNrKHZvaWQpOworI2lmZGVmIENPTkZJR19MT0NLVVBfREVURUNUT1IKIGV4dGVybiB2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCk7CiBleHRlcm4gdm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nX3N5bmModm9pZCk7CiBleHRlcm4gdm9pZCB0b3VjaF9hbGxfc29mdGxvY2t1cF93YXRjaGRvZ3Modm9pZCk7Ci1leHRlcm4gaW50IHByb2NfZG9zb2Z0bG9ja3VwX3RocmVzaChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLAotCQkJCSAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CitleHRlcm4gaW50IHByb2NfZG93YXRjaGRvZ190aHJlc2goc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCQkgIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkJICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CiBleHRlcm4gdW5zaWduZWQgaW50ICBzb2Z0bG9ja3VwX3BhbmljOwogZXh0ZXJuIGludCBzb2Z0bG9ja3VwX3RocmVzaDsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgc29mdGxvY2t1cF90aWNrKHZvaWQpCi17Ci19CiBzdGF0aWMgaW5saW5lIHZvaWQgdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZyh2b2lkKQogewogfQpAQCAtODA0LDcgKzc5Miw3IEBACiAjZGVmaW5lIFNEX1BPV0VSU0FWSU5HU19CQUxBTkNFCTB4MDEwMAkvKiBCYWxhbmNlIGZvciBwb3dlciBzYXZpbmdzICovCiAjZGVmaW5lIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMJMHgwMjAwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBwa2cgcmVzb3VyY2VzICovCiAjZGVmaW5lIFNEX1NFUklBTElaRQkJMHgwNDAwCS8qIE9ubHkgYSBzaW5nbGUgbG9hZCBiYWxhbmNpbmcgaW5zdGFuY2UgKi8KLQorI2RlZmluZSBTRF9BU1lNX1BBQ0tJTkcJCTB4MDgwMCAgLyogUGxhY2UgYnVzeSBncm91cHMgZWFybGllciBpbiB0aGUgZG9tYWluICovCiAjZGVmaW5lIFNEX1BSRUZFUl9TSUJMSU5HCTB4MTAwMAkvKiBQcmVmZXIgdG8gcGxhY2UgdGFza3MgaW4gYSBzaWJsaW5nIGRvbWFpbiAqLwogCiBlbnVtIHBvd2Vyc2F2aW5nc19iYWxhbmNlX2xldmVsIHsKQEAgLTgzOSw2ICs4MjcsOCBAQAogCXJldHVybiBTRF9QUkVGRVJfU0lCTElORzsKIH0KIAorZXh0ZXJuIGludCBfX3dlYWsgYXJjaF9zZF9zaWJpbGluZ19hc3ltX3BhY2tpbmcodm9pZCk7CisKIC8qCiAgKiBPcHRpbWlzZSBTRCBmbGFncyBmb3IgcG93ZXIgc2F2aW5nczoKICAqIFNEX0JBTEFOQ0VfTkVXSURMRSBoZWxwcyBhZ3Jlc3NpdmUgdGFzayBjb25zb2xpZGF0aW9uIGFuZCBwb3dlciBzYXZpbmdzLgpAQCAtODYwLDcgKzg1MCw3IEBACiAJICogQ1BVIHBvd2VyIG9mIHRoaXMgZ3JvdXAsIFNDSEVEX0xPQURfU0NBTEUgYmVpbmcgbWF4IHBvd2VyIGZvciBhCiAJICogc2luZ2xlIENQVS4KIAkgKi8KLQl1bnNpZ25lZCBpbnQgY3B1X3Bvd2VyOworCXVuc2lnbmVkIGludCBjcHVfcG93ZXIsIGNwdV9wb3dlcl9vcmlnOwogCiAJLyoKIAkgKiBUaGUgQ1BVcyB0aGlzIGdyb3VwIGNvdmVycy4KQEAgLTE2OTYsNiArMTY4Niw3IEBACiAjZGVmaW5lIFBGX0VYSVRJTkcJMHgwMDAwMDAwNAkvKiBnZXR0aW5nIHNodXQgZG93biAqLwogI2RlZmluZSBQRl9FWElUUElET05FCTB4MDAwMDAwMDgJLyogcGkgZXhpdCBkb25lIG9uIHNodXQgZG93biAqLwogI2RlZmluZSBQRl9WQ1BVCQkweDAwMDAwMDEwCS8qIEknbSBhIHZpcnR1YWwgQ1BVICovCisjZGVmaW5lIFBGX1dRX1dPUktFUgkweDAwMDAwMDIwCS8qIEknbSBhIHdvcmtxdWV1ZSB3b3JrZXIgKi8KICNkZWZpbmUgUEZfRk9SS05PRVhFQwkweDAwMDAwMDQwCS8qIGZvcmtlZCBidXQgZGlkbid0IGV4ZWMgKi8KICNkZWZpbmUgUEZfTUNFX1BST0NFU1MgIDB4MDAwMDAwODAgICAgICAvKiBwcm9jZXNzIHBvbGljeSBvbiBtY2UgZXJyb3JzICovCiAjZGVmaW5lIFBGX1NVUEVSUFJJVgkweDAwMDAwMTAwCS8qIHVzZWQgc3VwZXItdXNlciBwcml2aWxlZ2VzICovCkBAIC0xNzkwLDIwICsxNzgxLDIzIEBACiAjZW5kaWYKIAogLyoKLSAqIEFyY2hpdGVjdHVyZXMgY2FuIHNldCB0aGlzIHRvIDEgaWYgdGhleSBoYXZlIHNwZWNpZmllZAotICogQ09ORklHX0hBVkVfVU5TVEFCTEVfU0NIRURfQ0xPQ0sgaW4gdGhlaXIgYXJjaCBLY29uZmlnLAotICogYnV0IHRoZW4gZHVyaW5nIGJvb3R1cCBpdCB0dXJucyBvdXQgdGhhdCBzY2hlZF9jbG9jaygpCi0gKiBpcyByZWxpYWJsZSBhZnRlciBhbGw6CisgKiBEbyBub3QgdXNlIG91dHNpZGUgb2YgYXJjaGl0ZWN0dXJlIGNvZGUgd2hpY2gga25vd3MgaXRzIGxpbWl0YXRpb25zLgorICoKKyAqIHNjaGVkX2Nsb2NrKCkgaGFzIG5vIHByb21pc2Ugb2YgbW9ub3RvbmljaXR5IG9yIGJvdW5kZWQgZHJpZnQgYmV0d2VlbgorICogQ1BVcywgdXNlICh3aGljaCB5b3Ugc2hvdWxkIG5vdCkgcmVxdWlyZXMgZGlzYWJsaW5nIElSUXMuCisgKgorICogUGxlYXNlIHVzZSBvbmUgb2YgdGhlIHRocmVlIGludGVyZmFjZXMgYmVsb3cuCiAgKi8KLSNpZmRlZiBDT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSwotZXh0ZXJuIGludCBzY2hlZF9jbG9ja19zdGFibGU7Ci0jZW5kaWYKLQotLyogZnRyYWNlIGNhbGxzIHNjaGVkX2Nsb2NrKCkgZGlyZWN0bHkgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKTsKKy8qCisgKiBTZWUgdGhlIGNvbW1lbnQgaW4ga2VybmVsL3NjaGVkX2Nsb2NrLmMKKyAqLworZXh0ZXJuIHU2NCBjcHVfY2xvY2soaW50IGNwdSk7CitleHRlcm4gdTY0IGxvY2FsX2Nsb2NrKHZvaWQpOworZXh0ZXJuIHU2NCBzY2hlZF9jbG9ja19jcHUoaW50IGNwdSk7CisKIAogZXh0ZXJuIHZvaWQgc2NoZWRfY2xvY2tfaW5pdCh2b2lkKTsKLWV4dGVybiB1NjQgc2NoZWRfY2xvY2tfY3B1KGludCBjcHUpOwogCiAjaWZuZGVmIENPTkZJR19IQVZFX1VOU1RBQkxFX1NDSEVEX0NMT0NLCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2xvY2tfdGljayh2b2lkKQpAQCAtMTgxOCwxNyArMTgxMiwxOSBAQAogewogfQogI2Vsc2UKKy8qCisgKiBBcmNoaXRlY3R1cmVzIGNhbiBzZXQgdGhpcyB0byAxIGlmIHRoZXkgaGF2ZSBzcGVjaWZpZWQKKyAqIENPTkZJR19IQVZFX1VOU1RBQkxFX1NDSEVEX0NMT0NLIGluIHRoZWlyIGFyY2ggS2NvbmZpZywKKyAqIGJ1dCB0aGVuIGR1cmluZyBib290dXAgaXQgdHVybnMgb3V0IHRoYXQgc2NoZWRfY2xvY2soKQorICogaXMgcmVsaWFibGUgYWZ0ZXIgYWxsOgorICovCitleHRlcm4gaW50IHNjaGVkX2Nsb2NrX3N0YWJsZTsKKwogZXh0ZXJuIHZvaWQgc2NoZWRfY2xvY2tfdGljayh2b2lkKTsKIGV4dGVybiB2b2lkIHNjaGVkX2Nsb2NrX2lkbGVfc2xlZXBfZXZlbnQodm9pZCk7CiBleHRlcm4gdm9pZCBzY2hlZF9jbG9ja19pZGxlX3dha2V1cF9ldmVudCh1NjQgZGVsdGFfbnMpOwogI2VuZGlmCiAKLS8qCi0gKiBGb3Iga2VybmVsLWludGVybmFsIHVzZTogaGlnaC1zcGVlZCAoYnV0IHNsaWdodGx5IGluY29ycmVjdCkgcGVyLWNwdQotICogY2xvY2sgY29uc3RydWN0ZWQgZnJvbSBzY2hlZF9jbG9jaygpOgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGNwdV9jbG9jayhpbnQgY3B1KTsKLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZwogdGFza19zY2hlZF9ydW50aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHRocmVhZF9ncm91cF9zY2hlZF9ydW50aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CkBAIC0yNDM0LDE4ICsyNDMwLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2lmZGVmIENPTkZJR19UUkFDSU5HCi1leHRlcm4gdm9pZAotX190cmFjZV9zcGVjaWFsKHZvaWQgKl9fdHIsIHZvaWQgKl9fZGF0YSwKLQkJdW5zaWduZWQgbG9uZyBhcmcxLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkCi1fX3RyYWNlX3NwZWNpYWwodm9pZCAqX190ciwgdm9pZCAqX19kYXRhLAotCQl1bnNpZ25lZCBsb25nIGFyZzEsIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczKQotewotfQotI2VuZGlmCi0KIGV4dGVybiBsb25nIHNjaGVkX3NldGFmZmluaXR5KHBpZF90IHBpZCwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm5ld19tYXNrKTsKIGV4dGVybiBsb25nIHNjaGVkX2dldGFmZmluaXR5KHBpZF90IHBpZCwgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjdHAuaCBiL2luY2x1ZGUvbGludXgvc2N0cC5oCmluZGV4IGMyMGQzY2UuLmMxMWEyODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2N0cC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2N0cC5oCkBAIC02MSw3ICs2MSw3IEBACiAJX19iZTE2IGRlc3Q7CiAJX19iZTMyIHZ0YWc7CiAJX19sZTMyIGNoZWNrc3VtOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX3NjdHBoZHJfdDsKK30gX19wYWNrZWQgc2N0cF9zY3RwaGRyX3Q7CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC03Nyw3ICs3Nyw3IEBACiAJX191OCB0eXBlOwogCV9fdTggZmxhZ3M7CiAJX19iZTE2IGxlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9jaHVua2hkcl90OworfSBfX3BhY2tlZCBzY3RwX2NodW5raGRyX3Q7CiAKIAogLyogU2VjdGlvbiAzLjIuICBDaHVuayBUeXBlIFZhbHVlcy4KQEAgLTE2Nyw3ICsxNjcsNyBAQAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9wYXJhbWhkciB7CiAJX19iZTE2IHR5cGU7CiAJX19iZTE2IGxlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9wYXJhbWhkcl90OworfSBfX3BhY2tlZCBzY3RwX3BhcmFtaGRyX3Q7CiAKIHR5cGVkZWYgZW51bSB7CiAKQEAgLTIyOCwxMiArMjI4LDEyIEBACiAJX19iZTE2IHNzbjsKIAlfX2JlMzIgcHBpZDsKIAlfX3U4ICBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2RhdGFoZHJfdDsKK30gX19wYWNrZWQgc2N0cF9kYXRhaGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfZGF0YV9jaHVuayB7CiAgICAgICAgIHNjdHBfY2h1bmtoZHJfdCBjaHVua19oZHI7CiAgICAgICAgIHNjdHBfZGF0YWhkcl90ICBkYXRhX2hkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9kYXRhX2NodW5rX3Q7Cit9IF9fcGFja2VkIHNjdHBfZGF0YV9jaHVua190OwogCiAvKiBEQVRBIENodWNrIFNwZWNpZmljIEZsYWdzICovCiBlbnVtIHsKQEAgLTI1OSw3OCArMjU5LDc4IEBACiAJX19iZTE2IG51bV9pbmJvdW5kX3N0cmVhbXM7CiAJX19iZTMyIGluaXRpYWxfdHNuOwogCV9fdTggIHBhcmFtc1swXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9pbml0aGRyX3Q7Cit9IF9fcGFja2VkIHNjdHBfaW5pdGhkcl90OwogCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2luaXRfY2h1bmsgewogCXNjdHBfY2h1bmtoZHJfdCBjaHVua19oZHI7CiAJc2N0cF9pbml0aGRyX3QgaW5pdF9oZHI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfaW5pdF9jaHVua190OworfSBfX3BhY2tlZCBzY3RwX2luaXRfY2h1bmtfdDsKIAogCiAvKiBTZWN0aW9uIDMuMy4yLjEuIElQdjQgQWRkcmVzcyBQYXJhbWV0ZXIgKDUpICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2lwdjRhZGRyX3BhcmFtIHsKIAlzY3RwX3BhcmFtaGRyX3QgcGFyYW1faGRyOwogCXN0cnVjdCBpbl9hZGRyICBhZGRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2lwdjRhZGRyX3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfaXB2NGFkZHJfcGFyYW1fdDsKIAogLyogU2VjdGlvbiAzLjMuMi4xLiBJUHY2IEFkZHJlc3MgUGFyYW1ldGVyICg2KSAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9pcHY2YWRkcl9wYXJhbSB7CiAJc2N0cF9wYXJhbWhkcl90IHBhcmFtX2hkcjsKIAlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9pcHY2YWRkcl9wYXJhbV90OworfSBfX3BhY2tlZCBzY3RwX2lwdjZhZGRyX3BhcmFtX3Q7CiAKIC8qIFNlY3Rpb24gMy4zLjIuMSBDb29raWUgUHJlc2VydmF0aXZlICg5KSAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9jb29raWVfcHJlc2VydmVfcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdCBwYXJhbV9oZHI7CiAJX19iZTMyICAgICAgICAgIGxpZmVzcGFuX2luY3JlbWVudDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9jb29raWVfcHJlc2VydmVfcGFyYW1fdDsKK30gX19wYWNrZWQgc2N0cF9jb29raWVfcHJlc2VydmVfcGFyYW1fdDsKIAogLyogU2VjdGlvbiAzLjMuMi4xIEhvc3QgTmFtZSBBZGRyZXNzICgxMSkgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfaG9zdG5hbWVfcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdCBwYXJhbV9oZHI7CiAJdWludDhfdCBob3N0bmFtZVswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9ob3N0bmFtZV9wYXJhbV90OworfSBfX3BhY2tlZCBzY3RwX2hvc3RuYW1lX3BhcmFtX3Q7CiAKIC8qIFNlY3Rpb24gMy4zLjIuMSBTdXBwb3J0ZWQgQWRkcmVzcyBUeXBlcyAoMTIpICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX3N1cHBvcnRlZF9hZGRyc19wYXJhbSB7CiAJc2N0cF9wYXJhbWhkcl90IHBhcmFtX2hkcjsKIAlfX2JlMTYgdHlwZXNbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc3VwcG9ydGVkX2FkZHJzX3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfc3VwcG9ydGVkX2FkZHJzX3BhcmFtX3Q7CiAKIC8qIEFwcGVuZGl4IEEuIEVDTiBDYXBhYmxlICgzMjc2OCkgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfZWNuX2NhcGFibGVfcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdCBwYXJhbV9oZHI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfZWNuX2NhcGFibGVfcGFyYW1fdDsKK30gX19wYWNrZWQgc2N0cF9lY25fY2FwYWJsZV9wYXJhbV90OwogCiAvKiBBRERJUCBTZWN0aW9uIDMuMi42IEFkYXB0YXRpb24gTGF5ZXIgSW5kaWNhdGlvbiAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9hZGFwdGF0aW9uX2luZF9wYXJhbSB7CiAJc3RydWN0IHNjdHBfcGFyYW1oZHIgcGFyYW1faGRyOwogCV9fYmUzMiBhZGFwdGF0aW9uX2luZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hZGFwdGF0aW9uX2luZF9wYXJhbV90OworfSBfX3BhY2tlZCBzY3RwX2FkYXB0YXRpb25faW5kX3BhcmFtX3Q7CiAKIC8qIEFERElQIFNlY3Rpb24gNC4yLjcgU3VwcG9ydGVkIEV4dGVuc2lvbnMgUGFyYW1ldGVyICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX3N1cHBvcnRlZF9leHRfcGFyYW0gewogCXN0cnVjdCBzY3RwX3BhcmFtaGRyIHBhcmFtX2hkcjsKIAlfX3U4IGNodW5rc1swXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9zdXBwb3J0ZWRfZXh0X3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfc3VwcG9ydGVkX2V4dF9wYXJhbV90OwogCiAvKiBBVVRIIFNlY3Rpb24gMy4xIFJhbmRvbSAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9yYW5kb21fcGFyYW0gewogCXNjdHBfcGFyYW1oZHJfdCBwYXJhbV9oZHI7CiAJX191OCByYW5kb21fdmFsWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX3JhbmRvbV9wYXJhbV90OworfSBfX3BhY2tlZCBzY3RwX3JhbmRvbV9wYXJhbV90OwogCiAvKiBBVVRIIFNlY3Rpb24gMy4yIENodW5rIExpc3QgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfY2h1bmtzX3BhcmFtIHsKIAlzY3RwX3BhcmFtaGRyX3QgcGFyYW1faGRyOwogCV9fdTggY2h1bmtzWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2NodW5rc19wYXJhbV90OworfSBfX3BhY2tlZCBzY3RwX2NodW5rc19wYXJhbV90OwogCiAvKiBBVVRIIFNlY3Rpb24gMy4zIEhNQUMgQWxnb3JpdGhtICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2htYWNfYWxnb19wYXJhbSB7CiAJc2N0cF9wYXJhbWhkcl90IHBhcmFtX2hkcjsKIAlfX2JlMTYgaG1hY19pZHNbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfaG1hY19hbGdvX3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfaG1hY19hbGdvX3BhcmFtX3Q7CiAKIC8qIFJGQyAyOTYwLiAgU2VjdGlvbiAzLjMuMyBJbml0aWF0aW9uIEFja25vd2xlZGdlbWVudCAoSU5JVCBBQ0spICgyKToKICAqICAgVGhlIElOSVQgQUNLIGNodW5rIGlzIHVzZWQgdG8gYWNrbm93bGVkZ2UgdGhlIGluaXRpYXRpb24gb2YgYW4gU0NUUApAQCAtMzQyLDEzICszNDIsMTMgQEAKIHR5cGVkZWYgc3RydWN0IHNjdHBfY29va2llX3BhcmFtIHsKIAlzY3RwX3BhcmFtaGRyX3QgcDsKIAlfX3U4IGJvZHlbMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfY29va2llX3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfY29va2llX3BhcmFtX3Q7CiAKIC8qIFNlY3Rpb24gMy4zLjMuMSBVbnJlY29nbml6ZWQgUGFyYW1ldGVycyAoOCkgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfdW5yZWNvZ25pemVkX3BhcmFtIHsKIAlzY3RwX3BhcmFtaGRyX3QgcGFyYW1faGRyOwogCXNjdHBfcGFyYW1oZHJfdCB1bnJlY29nbml6ZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfdW5yZWNvZ25pemVkX3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfdW5yZWNvZ25pemVkX3BhcmFtX3Q7CiAKIAogCkBAIC0zNjMsNyArMzYzLDcgQEAKIHR5cGVkZWYgc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jayB7CiAJX19iZTE2IHN0YXJ0OwogCV9fYmUxNiBlbmQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfZ2FwX2Fja19ibG9ja190OworfSBfX3BhY2tlZCBzY3RwX2dhcF9hY2tfYmxvY2tfdDsKIAogdHlwZWRlZiBfX2JlMzIgc2N0cF9kdXBfdHNuX3Q7CiAKQEAgLTM3OCwxMiArMzc4LDEyIEBACiAJX19iZTE2IG51bV9nYXBfYWNrX2Jsb2NrczsKIAlfX2JlMTYgbnVtX2R1cF90c25zOwogCXNjdHBfc2Fja192YXJpYWJsZV90IHZhcmlhYmxlWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX3NhY2toZHJfdDsKK30gX19wYWNrZWQgc2N0cF9zYWNraGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfc2Fja19jaHVuayB7CiAJc2N0cF9jaHVua2hkcl90IGNodW5rX2hkcjsKIAlzY3RwX3NhY2toZHJfdCBzYWNrX2hkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9zYWNrX2NodW5rX3Q7Cit9IF9fcGFja2VkIHNjdHBfc2Fja19jaHVua190OwogCiAKIC8qIFJGQyAyOTYwLiAgU2VjdGlvbiAzLjMuNSBIZWFydGJlYXQgUmVxdWVzdCAoSEVBUlRCRUFUKSAoNCk6CkBAIC0zOTUsMTIgKzM5NSwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2hlYXJ0YmVhdGhkciB7CiAJc2N0cF9wYXJhbWhkcl90IGluZm87Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfaGVhcnRiZWF0aGRyX3Q7Cit9IF9fcGFja2VkIHNjdHBfaGVhcnRiZWF0aGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfaGVhcnRiZWF0X2NodW5rIHsKIAlzY3RwX2NodW5raGRyX3QgY2h1bmtfaGRyOwogCXNjdHBfaGVhcnRiZWF0aGRyX3QgaGJfaGRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2hlYXJ0YmVhdF9jaHVua190OworfSBfX3BhY2tlZCBzY3RwX2hlYXJ0YmVhdF9jaHVua190OwogCiAKIC8qIEZvciB0aGUgYWJvcnQgYW5kIHNodXRkb3duIEFDSyB3ZSBtdXN0IGNhcnJ5IHRoZSBpbml0IHRhZyBpbiB0aGUKQEAgLTQwOSw3ICs0MDksNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2Fib3J0X2NodW5rIHsKICAgICAgICAgc2N0cF9jaHVua2hkcl90IHVoOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2Fib3J0X2NodW5rX3Q7Cit9IF9fcGFja2VkIHNjdHBfYWJvcnRfY2h1bmtfdDsKIAogCiAvKiBGb3IgdGhlIGdyYWNlZnVsIHNodXRkb3duIHdlIG11c3QgY2FycnkgdGhlIHRhZyAoaW4gY29tbW9uIGhlYWRlcikKQEAgLTQxNywxMiArNDE3LDEyIEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfc2h1dGRvd25oZHIgewogCV9fYmUzMiBjdW1fdHNuX2FjazsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9zaHV0ZG93bmhkcl90OworfSBfX3BhY2tlZCBzY3RwX3NodXRkb3duaGRyX3Q7CiAKIHN0cnVjdCBzY3RwX3NodXRkb3duX2NodW5rX3QgewogICAgICAgICBzY3RwX2NodW5raGRyX3QgICAgY2h1bmtfaGRyOwogICAgICAgICBzY3RwX3NodXRkb3duaGRyX3Qgc2h1dGRvd25faGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBSRkMgMjk2MC4gIFNlY3Rpb24gMy4zLjEwIE9wZXJhdGlvbiBFcnJvciAoRVJST1IpICg5KSAqLwogCkBAIC00MzAsMTIgKzQzMCwxMiBAQAogCV9fYmUxNiBjYXVzZTsKIAlfX2JlMTYgbGVuZ3RoOwogCV9fdTggIHZhcmlhYmxlWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2Vycmhkcl90OworfSBfX3BhY2tlZCBzY3RwX2Vycmhkcl90OwogCiB0eXBlZGVmIHN0cnVjdCBzY3RwX29wZXJyX2NodW5rIHsKICAgICAgICAgc2N0cF9jaHVua2hkcl90IGNodW5rX2hkcjsKIAlzY3RwX2Vycmhkcl90ICAgZXJyX2hkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9vcGVycl9jaHVua190OworfSBfX3BhY2tlZCBzY3RwX29wZXJyX2NodW5rX3Q7CiAKIC8qIFJGQyAyOTYwIDMuMy4xMCAtIE9wZXJhdGlvbiBFcnJvcgogICoKQEAgLTUyNSw3ICs1MjUsNyBAQAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9lY25lX2NodW5rIHsKIAlzY3RwX2NodW5raGRyX3QgY2h1bmtfaGRyOwogCXNjdHBfZWNuZWhkcl90IGVuY2VfaGRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2VjbmVfY2h1bmtfdDsKK30gX19wYWNrZWQgc2N0cF9lY25lX2NodW5rX3Q7CiAKIC8qIFJGQyAyOTYwLiAgQXBwZW5kaXggQS4gIEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uLgogICogICBDb25nZXN0aW9uIFdpbmRvdyBSZWR1Y2VkIChDV1IpICgxMykKQEAgLTUzNyw3ICs1MzcsNyBAQAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9jd3JfY2h1bmsgewogCXNjdHBfY2h1bmtoZHJfdCBjaHVua19oZHI7CiAJc2N0cF9jd3JoZHJfdCBjd3JfaGRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2N3cl9jaHVua190OworfSBfX3BhY2tlZCBzY3RwX2N3cl9jaHVua190OwogCiAvKiBQUi1TQ1RQCiAgKiAzLjIgRm9yd2FyZCBDdW11bGF0aXZlIFRTTiBDaHVuayBEZWZpbml0aW9uIChGT1JXQVJEIFRTTikKQEAgLTU4OCwxNyArNTg4LDE3IEBACiBzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCB7CiAJX19iZTE2IHN0cmVhbTsKIAlfX2JlMTYgc3NuOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIgewogCV9fYmUzMiBuZXdfY3VtX3RzbjsKIAlzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCBza2lwWzBdOwotfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc2N0cF9md2R0c25fY2h1bmsgewogCXN0cnVjdCBzY3RwX2NodW5raGRyIGNodW5rX2hkcjsKIAlzdHJ1Y3Qgc2N0cF9md2R0c25faGRyIGZ3ZHRzbl9oZHI7Ci19IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyogQURESVAKQEAgLTYzNiwxNyArNjM2LDE3IEBACiB0eXBlZGVmIHN0cnVjdCBzY3RwX2FkZGlwX3BhcmFtIHsKIAlzY3RwX3BhcmFtaGRyX3QJcGFyYW1faGRyOwogCV9fYmUzMgkJY3JyX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2FkZGlwX3BhcmFtX3Q7Cit9IF9fcGFja2VkIHNjdHBfYWRkaXBfcGFyYW1fdDsKIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9hZGRpcGhkciB7CiAJX19iZTMyCXNlcmlhbDsKIAlfX3U4CXBhcmFtc1swXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hZGRpcGhkcl90OworfSBfX3BhY2tlZCBzY3RwX2FkZGlwaGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfYWRkaXBfY2h1bmsgewogCXNjdHBfY2h1bmtoZHJfdCBjaHVua19oZHI7CiAJc2N0cF9hZGRpcGhkcl90IGFkZGlwX2hkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hZGRpcF9jaHVua190OworfSBfX3BhY2tlZCBzY3RwX2FkZGlwX2NodW5rX3Q7CiAKIC8qIEFVVEgKICAqIFNlY3Rpb24gNC4xICBBdXRoZW50aWNhdGlvbiBDaHVuayAoQVVUSCkKQEAgLTcwMSwxMSArNzAxLDExIEBACiAJX19iZTE2IHNoa2V5X2lkOwogCV9fYmUxNiBobWFjX2lkOwogCV9fdTggICBobWFjWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2F1dGhoZHJfdDsKK30gX19wYWNrZWQgc2N0cF9hdXRoaGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfYXV0aF9jaHVuayB7CiAJc2N0cF9jaHVua2hkcl90IGNodW5rX2hkcjsKIAlzY3RwX2F1dGhoZHJfdCBhdXRoX2hkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hdXRoX2NodW5rX3Q7Cit9IF9fcGFja2VkIHNjdHBfYXV0aF9jaHVua190OwogCiAjZW5kaWYgLyogX19MSU5VWF9TQ1RQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDBjODgxOTEuLjcyM2E5M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTQ3MCw4ICs0NzAsNiBAQAogICogQHBhdGhfdHJ1bmNhdGU6CiAgKglDaGVjayBwZXJtaXNzaW9uIGJlZm9yZSB0cnVuY2F0aW5nIGEgZmlsZS4KICAqCUBwYXRoIGNvbnRhaW5zIHRoZSBwYXRoIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUuCi0gKglAbGVuZ3RoIGlzIHRoZSBuZXcgbGVuZ3RoIG9mIHRoZSBmaWxlLgotICoJQHRpbWVfYXR0cnMgaXMgdGhlIGZsYWdzIHBhc3NlZCB0byBkb190cnVuY2F0ZSgpLgogICoJUmV0dXJuIDAgaWYgcGVybWlzc2lvbiBpcyBncmFudGVkLgogICogQGlub2RlX2dldGF0dHI6CiAgKglDaGVjayBwZXJtaXNzaW9uIGJlZm9yZSBvYnRhaW5pbmcgZmlsZSBhdHRyaWJ1dGVzLgpAQCAtMTQxMiw4ICsxNDEwLDcgQEAKIAlpbnQgKCpwYXRoX3JtZGlyKSAoc3RydWN0IHBhdGggKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAlpbnQgKCpwYXRoX21rbm9kKSAoc3RydWN0IHBhdGggKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKIAkJCSAgIHVuc2lnbmVkIGludCBkZXYpOwotCWludCAoKnBhdGhfdHJ1bmNhdGUpIChzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9mZl90IGxlbmd0aCwKLQkJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lX2F0dHJzKTsKKwlpbnQgKCpwYXRoX3RydW5jYXRlKSAoc3RydWN0IHBhdGggKnBhdGgpOwogCWludCAoKnBhdGhfc3ltbGluaykgKHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCSAgICAgY29uc3QgY2hhciAqb2xkX25hbWUpOwogCWludCAoKnBhdGhfbGluaykgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBwYXRoICpuZXdfZGlyLApAQCAtMjgwNiw4ICsyODAzLDcgQEAKIGludCBzZWN1cml0eV9wYXRoX3JtZGlyKHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBpbnQgc2VjdXJpdHlfcGF0aF9ta25vZChzdHJ1Y3QgcGF0aCAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAogCQkJdW5zaWduZWQgaW50IGRldik7Ci1pbnQgc2VjdXJpdHlfcGF0aF90cnVuY2F0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9mZl90IGxlbmd0aCwKLQkJCSAgIHVuc2lnbmVkIGludCB0aW1lX2F0dHJzKTsKK2ludCBzZWN1cml0eV9wYXRoX3RydW5jYXRlKHN0cnVjdCBwYXRoICpwYXRoKTsKIGludCBzZWN1cml0eV9wYXRoX3N5bWxpbmsoc3RydWN0IHBhdGggKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICBjb25zdCBjaGFyICpvbGRfbmFtZSk7CiBpbnQgc2VjdXJpdHlfcGF0aF9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBwYXRoICpuZXdfZGlyLApAQCAtMjg0MSw4ICsyODM3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfcGF0aF90cnVuY2F0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9mZl90IGxlbmd0aCwKLQkJCQkJIHVuc2lnbmVkIGludCB0aW1lX2F0dHJzKQorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfcGF0aF90cnVuY2F0ZShzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IGY4OWU3ZmQuLmQyMGQ5ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMTY5LDYgKzE2OSw3IEBACiAgKiBAc29mdHdhcmU6CQlnZW5lcmF0ZSBzb2Z0d2FyZSB0aW1lIHN0YW1wCiAgKiBAaW5fcHJvZ3Jlc3M6CWRldmljZSBkcml2ZXIgaXMgZ29pbmcgdG8gcHJvdmlkZQogICoJCQloYXJkd2FyZSB0aW1lIHN0YW1wCisgKiBAcHJldmVudF9za19vcnBoYW46CW1ha2Ugc2sgcmVmZXJlbmNlIGF2YWlsYWJsZSBvbiBkcml2ZXIgbGV2ZWwKICAqIEBmbGFnczoJCWFsbCBzaGFyZWRfdHggZmxhZ3MKICAqCiAgKiBUaGVzZSBmbGFncyBhcmUgYXR0YWNoZWQgdG8gcGFja2V0cyBhcyBwYXJ0IG9mIHRoZQpAQCAtMTc4LDcgKzE3OSw4IEBACiAJc3RydWN0IHsKIAkJX191OAloYXJkd2FyZToxLAogCQkJc29mdHdhcmU6MSwKLQkJCWluX3Byb2dyZXNzOjE7CisJCQlpbl9wcm9ncmVzczoxLAorCQkJcHJldmVudF9za19vcnBoYW46MTsKIAl9OwogCV9fdTggZmxhZ3M7CiB9OwpAQCAtMjAyLDEwICsyMDQsMTEgQEAKIAkgKi8KIAlhdG9taWNfdAlkYXRhcmVmOwogCi0Jc2tiX2ZyYWdfdAlmcmFnc1tNQVhfU0tCX0ZSQUdTXTsKIAkvKiBJbnRlcm1lZGlhdGUgbGF5ZXJzIG11c3QgZW5zdXJlIHRoYXQgZGVzdHJ1Y3Rvcl9hcmcKIAkgKiByZW1haW5zIHZhbGlkIHVudGlsIHNrYiBkZXN0cnVjdG9yICovCiAJdm9pZCAqCQlkZXN0cnVjdG9yX2FyZzsKKwkvKiBtdXN0IGJlIGxhc3QgZmllbGQsIHNlZSBwc2tiX2V4cGFuZF9oZWFkKCkgKi8KKwlza2JfZnJhZ190CWZyYWdzW01BWF9TS0JfRlJBR1NdOwogfTsKIAogLyogV2UgZGl2aWRlIGRhdGFyZWYgaW50byB0d28gaGFsdmVzLiAgVGhlIGhpZ2hlciAxNiBiaXRzIGhvbGQgcmVmZXJlbmNlcwpAQCAtMTQxNCwxMiArMTQxNywxNCBAQAogICoKICAqIFZhcmlvdXMgcGFydHMgb2YgdGhlIG5ldHdvcmtpbmcgbGF5ZXIgZXhwZWN0IGF0IGxlYXN0IDMyIGJ5dGVzIG9mCiAgKiBoZWFkcm9vbSwgeW91IHNob3VsZCBub3QgcmVkdWNlIHRoaXMuCi0gKiBXaXRoIFJQUywgd2UgcmFpc2VkIE5FVF9TS0JfUEFEIHRvIDY0IHNvIHRoYXQgZ2V0X3Jwc19jcHVzKCkgZmV0Y2hlcyBzcGFuCi0gKiBhIDY0IGJ5dGVzIGFsaWduZWQgYmxvY2sgdG8gZml0IG1vZGVybiAoPj0gNjQgYnl0ZXMpIGNhY2hlIGxpbmUgc2l6ZXMKKyAqCisgKiBVc2luZyBtYXgoMzIsIEwxX0NBQ0hFX0JZVEVTKSBtYWtlcyBzZW5zZSAoZXNwZWNpYWxseSB3aXRoIFJQUykKKyAqIHRvIHJlZHVjZSBhdmVyYWdlIG51bWJlciBvZiBjYWNoZSBsaW5lcyBwZXIgcGFja2V0LgorICogZ2V0X3Jwc19jcHVzKCkgZm9yIGV4YW1wbGUgb25seSBhY2Nlc3Mgb25lIDY0IGJ5dGVzIGFsaWduZWQgYmxvY2sgOgogICogTkVUX0lQX0FMSUdOKDIpICsgZXRoZXJuZXRfaGVhZGVyKDE0KSArIElQX2hlYWRlcigyMC80MCkgKyBwb3J0cyg4KQogICovCiAjaWZuZGVmIE5FVF9TS0JfUEFECi0jZGVmaW5lIE5FVF9TS0JfUEFECTY0CisjZGVmaW5lIE5FVF9TS0JfUEFECW1heCgzMiwgTDFfQ0FDSEVfQllURVMpCiAjZW5kaWYKIAogZXh0ZXJuIGludCBfX19wc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbik7CkBAIC0xOTMxLDYgKzE5MzYsMzYgQEAKIAlyZXR1cm4ga3RpbWVfc2V0KDAsIDApOwogfQogCitleHRlcm4gdm9pZCBza2JfdGltZXN0YW1waW5nX2luaXQodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfTkVUV09SS19QSFlfVElNRVNUQU1QSU5HCisKK2V4dGVybiB2b2lkIHNrYl9jbG9uZV90eF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gYm9vbCBza2JfZGVmZXJfcnhfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpOworCisjZWxzZSAvKiBDT05GSUdfTkVUV09SS19QSFlfVElNRVNUQU1QSU5HICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfY2xvbmVfdHhfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZGVmZXJfcnhfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGZhbHNlOworfQorCisjZW5kaWYgLyogIUNPTkZJR19ORVRXT1JLX1BIWV9USU1FU1RBTVBJTkcgKi8KKworLyoqCisgKiBza2JfY29tcGxldGVfdHhfdGltZXN0YW1wKCkgLSBkZWxpdmVyIGNsb25lZCBza2Igd2l0aCB0eCB0aW1lc3RhbXBzCisgKgorICogQHNrYjogY2xvbmUgb2YgdGhlIHRoZSBvcmlnaW5hbCBvdXRnb2luZyBwYWNrZXQKKyAqIEBod3RzdGFtcHM6IGhhcmR3YXJlIHRpbWUgc3RhbXBzCisgKgorICovCit2b2lkIHNrYl9jb21wbGV0ZV90eF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tiX3NoYXJlZF9od3RzdGFtcHMgKmh3dHN0YW1wcyk7CisKIC8qKgogICogc2tiX3RzdGFtcF90eCAtIHF1ZXVlIGNsb25lIG9mIHNrYiB3aXRoIHNlbmQgdGltZSBzdGFtcHMKICAqIEBvcmlnX3NrYjoJdGhlIG9yaWdpbmFsIG91dGdvaW5nIHBhY2tldApAQCAtMTk0NSw2ICsxOTgwLDI4IEBACiBleHRlcm4gdm9pZCBza2JfdHN0YW1wX3R4KHN0cnVjdCBza19idWZmICpvcmlnX3NrYiwKIAkJCXN0cnVjdCBza2Jfc2hhcmVkX2h3dHN0YW1wcyAqaHd0c3RhbXBzKTsKIAorc3RhdGljIGlubGluZSB2b2lkIHN3X3R4X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuaW9uIHNrYl9zaGFyZWRfdHggKnNodHggPSBza2JfdHgoc2tiKTsKKwlpZiAoc2h0eC0+c29mdHdhcmUgJiYgIXNodHgtPmluX3Byb2dyZXNzKQorCQlza2JfdHN0YW1wX3R4KHNrYiwgTlVMTCk7Cit9CisKKy8qKgorICogc2tiX3R4X3RpbWVzdGFtcCgpIC0gRHJpdmVyIGhvb2sgZm9yIHRyYW5zbWl0IHRpbWVzdGFtcGluZworICoKKyAqIEV0aGVybmV0IE1BQyBEcml2ZXJzIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gdGhlaXIgaGFyZF94bWl0KCkKKyAqIGZ1bmN0aW9uIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgZ2l2aW5nIHRoZSBza19idWZmIHRvIHRoZSBNQUMKKyAqIGhhcmR3YXJlLCBidXQgYmVmb3JlIGZyZWVpbmcgdGhlIHNrX2J1ZmYuCisgKgorICogQHNrYjogQSBzb2NrZXQgYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3R4X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYl9jbG9uZV90eF90aW1lc3RhbXAoc2tiKTsKKwlzd190eF90aW1lc3RhbXAoc2tiKTsKK30KKwogZXh0ZXJuIF9fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGVfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKIGV4dGVybiBfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpOwogCkBAIC0yMTMyLDcgKzIxODksOCBAQAogCS8qIExSTyBzZXRzIGdzb19zaXplIGJ1dCBub3QgZ3NvX3R5cGUsIHdoZXJlYXMgaWYgR1NPIGlzIHJlYWxseQogCSAqIHdhbnRlZCB0aGVuIGdzb190eXBlIHdpbGwgYmUgc2V0LiAqLwogCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbyA9IHNrYl9zaGluZm8oc2tiKTsKLQlpZiAoc2hpbmZvLT5nc29fc2l6ZSAhPSAwICYmIHVubGlrZWx5KHNoaW5mby0+Z3NvX3R5cGUgPT0gMCkpIHsKKwlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpICYmIHNoaW5mby0+Z3NvX3NpemUgIT0gMCAmJgorCSAgICB1bmxpa2VseShzaGluZm8tPmdzb190eXBlID09IDApKSB7CiAJCV9fc2tiX3dhcm5fbHJvX2ZvcndhcmRpbmcoc2tiKTsKIAkJcmV0dXJuIHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCA0OWQxMjQ3Li41OTI2MGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWIuaApAQCAtMjY4LDcgKzI2OCw4IEBACiAgKiBhbGxvY2F0b3Igd2hlcmUgd2UgY2FyZSBhYm91dCB0aGUgcmVhbCBwbGFjZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24KICAqIHJlcXVlc3QgY29tZXMgZnJvbS4KICAqLwotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1NMQUIpIHx8IGRlZmluZWQoQ09ORklHX1NMVUIpCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfU0xBQikgfHwgZGVmaW5lZChDT05GSUdfU0xVQikgfHwgXAorCShkZWZpbmVkKENPTkZJR19TTEFCKSAmJiBkZWZpbmVkKENPTkZJR19UUkFDSU5HKSkKIGV4dGVybiB2b2lkICpfX2ttYWxsb2NfdHJhY2tfY2FsbGVyKHNpemVfdCwgZ2ZwX3QsIHVuc2lnbmVkIGxvbmcpOwogI2RlZmluZSBrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncykgXAogCV9fa21hbGxvY190cmFja19jYWxsZXIoc2l6ZSwgZmxhZ3MsIF9SRVRfSVBfKQpAQCAtMjg2LDcgKzI4Nyw4IEBACiAgKiBzdGFuZGFyZCBhbGxvY2F0b3Igd2hlcmUgd2UgY2FyZSBhYm91dCB0aGUgcmVhbCBwbGFjZSB0aGUgbWVtb3J5CiAgKiBhbGxvY2F0aW9uIHJlcXVlc3QgY29tZXMgZnJvbS4KICAqLwotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1NMQUIpIHx8IGRlZmluZWQoQ09ORklHX1NMVUIpCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfU0xBQikgfHwgZGVmaW5lZChDT05GSUdfU0xVQikgfHwgXAorCShkZWZpbmVkKENPTkZJR19TTEFCKSAmJiBkZWZpbmVkKENPTkZJR19UUkFDSU5HKSkKIGV4dGVybiB2b2lkICpfX2ttYWxsb2Nfbm9kZV90cmFja19jYWxsZXIoc2l6ZV90LCBnZnBfdCwgaW50LCB1bnNpZ25lZCBsb25nKTsKICNkZWZpbmUga21hbGxvY19ub2RlX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncywgbm9kZSkgXAogCV9fa21hbGxvY19ub2RlX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncywgbm9kZSwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDE4MTJkYWMuLjFhY2ZhNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTE0LDcgKzE0LDggQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgkJLyoga21hbGxvY19zaXplcy5oIG5lZWRzIFBBR0VfU0laRSAqLwogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgkJLyoga21hbGxvY19zaXplcy5oIG5lZWRzIEwxX0NBQ0hFX0JZVEVTICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9rbWVtdHJhY2UuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rbWVtLmg+CiAKICNpZm5kZWYgQVJDSF9LTUFMTE9DX01JTkFMSUdOCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCmluZGV4IDRiYTU5Y2YuLjY0NDdhNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKQEAgLTEwLDkgKzEwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttZW10cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgorCiBlbnVtIHN0YXRfaXRlbSB7CiAJQUxMT0NfRkFTVFBBVEgsCQkvKiBBbGxvY2F0aW9uIGZyb20gY3B1IHNsYWIgKi8KIAlBTExPQ19TTE9XUEFUSCwJCS8qIEFsbG9jYXRpb24gYnkgZ2V0dGluZyBhIG5ldyBjcHUgc2xhYiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbm1wLmggYi9pbmNsdWRlL2xpbnV4L3NubXAuaAppbmRleCA1Mjc5NzcxLi5lYmIwYzgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NubXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NubXAuaApAQCAtMjI5LDYgKzIyOSw3IEBACiAJTElOVVhfTUlCX1RDUEJBQ0tMT0dEUk9QLAogCUxJTlVYX01JQl9UQ1BNSU5UVExEUk9QLCAvKiBSRkMgNTA4MiAqLwogCUxJTlVYX01JQl9UQ1BERUZFUkFDQ0VQVERST1AsCisJTElOVVhfTUlCX0lQUlBGSUxURVIsIC8qIElQIFJldmVyc2UgUGF0aCBGaWx0ZXIgKHJwX2ZpbHRlcikgKi8KIAlfX0xJTlVYX01JQl9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ja2V0LmggYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCmluZGV4IDAzMmExOWUuLmEyZmFkYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkvKiBwaWRfdAkJCSovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4JCS8qIF9fdXNlcgkJCSovCiAKK3N0cnVjdCBwaWQ7CitzdHJ1Y3QgY3JlZDsKKwogI2RlZmluZSBfX3NvY2thZGRyX2NoZWNrX3NpemUoc2l6ZSkJXAogCUJVSUxEX0JVR19PTigoKHNpemUpID4gc2l6ZW9mKHN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlKSkpCiAKQEAgLTMwOSw2ICszMTIsOCBAQAogI2RlZmluZSBJUFhfVFlQRQkxCiAKICNpZmRlZiBfX0tFUk5FTF9fCitleHRlcm4gdm9pZCBjcmVkX3RvX3VjcmVkKHN0cnVjdCBwaWQgKnBpZCwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsIHN0cnVjdCB1Y3JlZCAqdWNyZWQpOworCiBleHRlcm4gaW50IG1lbWNweV9mcm9taW92ZWModW5zaWduZWQgY2hhciAqa2RhdGEsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgbWVtY3B5X2Zyb21pb3ZlY2VuZCh1bnNpZ25lZCBjaGFyICprZGF0YSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCiAJCQkgICAgICAgaW50IG9mZnNldCwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmggYi9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmgKaW5kZXggYjRhZTU3MC4uOTJiZDA4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvYWRzNzg0Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaApAQCAtNDgsMTEgKzQ4LDEyIEBACiAJCQkJCSAqIHN0YXRlIGlmIGdldF9wZW5kb3duX3N0YXRlID09IE5VTEwKIAkJCQkJICovCiAJaW50CSgqZ2V0X3BlbmRvd25fc3RhdGUpKHZvaWQpOwotCWludAkoKmZpbHRlcl9pbml0KQkoc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCisJaW50CSgqZmlsdGVyX2luaXQpCShjb25zdCBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhICpwZGF0YSwKIAkJCQkgdm9pZCAqKmZpbHRlcl9kYXRhKTsKIAlpbnQJKCpmaWx0ZXIpCSh2b2lkICpmaWx0ZXJfZGF0YSwgaW50IGRhdGFfaWR4LCBpbnQgKnZhbCk7CiAJdm9pZAkoKmZpbHRlcl9jbGVhbnVwKSh2b2lkICpmaWx0ZXJfZGF0YSk7CiAJdm9pZAkoKndhaXRfZm9yX3N5bmMpKHZvaWQpOwogCWJvb2wJd2FrZXVwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmggYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAppbmRleCBhMjYwOGJmLi42MjNiNzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJICogaXMgYW4gb3B0aW1pemF0aW9uLiAqLwogCWNvbnN0IHN0cnVjdCBzc2JfYnVzX29wcyAqb3BzOwogCi0Jc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiwgKmRtYV9kZXY7CiAKIAlzdHJ1Y3Qgc3NiX2J1cyAqYnVzOwogCXN0cnVjdCBzc2JfZGV2aWNlX2lkIGlkOwpAQCAtNDcwLDE0ICs0NzAsNiBAQAogI2RlZmluZSBTU0JfRE1BX1RSQU5TTEFUSU9OX01BU0sJMHhDMDAwMDAwMAogI2RlZmluZSBTU0JfRE1BX1RSQU5TTEFUSU9OX1NISUZUCTMwCiAKLWV4dGVybiBpbnQgc3NiX2RtYV9zZXRfbWFzayhzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2LCB1NjQgbWFzayk7Ci0KLWV4dGVybiB2b2lkICogc3NiX2RtYV9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJCSAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBnZnBfZmxhZ3MpOwotZXh0ZXJuIHZvaWQgc3NiX2RtYV9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IHNzYl9kZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkJICAgIGdmcF90IGdmcF9mbGFncyk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2NvbGQgX19zc2JfZG1hX25vdF9pbXBsZW1lbnRlZChzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2KQogewogI2lmZGVmIENPTkZJR19TU0JfREVCVUcKQEAgLTQ4NiwxNTUgKzQ3OCw2IEBACiAjZW5kaWYgLyogREVCVUcgKi8KIH0KIAotc3RhdGljIGlubGluZSBpbnQgc3NiX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkcikKLXsKLQlzd2l0Y2ggKGRldi0+YnVzLT5idXN0eXBlKSB7Ci0JY2FzZSBTU0JfQlVTVFlQRV9QQ0k6Ci0jaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCi0JCXJldHVybiBwY2lfZG1hX21hcHBpbmdfZXJyb3IoZGV2LT5idXMtPmhvc3RfcGNpLCBhZGRyKTsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIFNTQl9CVVNUWVBFX1NTQjoKLQkJcmV0dXJuIGRtYV9tYXBwaW5nX2Vycm9yKGRldi0+ZGV2LCBhZGRyKTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JX19zc2JfZG1hX25vdF9pbXBsZW1lbnRlZChkZXYpOwotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW5saW5lIGRtYV9hZGRyX3Qgc3NiX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsIHZvaWQgKnAsCi0JCQkJCSAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCXN3aXRjaCAoZGV2LT5idXMtPmJ1c3R5cGUpIHsKLQljYXNlIFNTQl9CVVNUWVBFX1BDSToKLSNpZmRlZiBDT05GSUdfU1NCX1BDSUhPU1QKLQkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKGRldi0+YnVzLT5ob3N0X3BjaSwgcCwgc2l6ZSwgZGlyKTsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIFNTQl9CVVNUWVBFX1NTQjoKLQkJcmV0dXJuIGRtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LCBwLCBzaXplLCBkaXIpOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlfX3NzYl9kbWFfbm90X2ltcGxlbWVudGVkKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzc2JfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAotCQkJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCXN3aXRjaCAoZGV2LT5idXMtPmJ1c3R5cGUpIHsKLQljYXNlIFNTQl9CVVNUWVBFX1BDSToKLSNpZmRlZiBDT05GSUdfU1NCX1BDSUhPU1QKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYtPmJ1cy0+aG9zdF9wY2ksIGRtYV9hZGRyLCBzaXplLCBkaXIpOwotCQlyZXR1cm47Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBTU0JfQlVTVFlQRV9TU0I6Ci0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LT5kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCV9fc3NiX2RtYV9ub3RfaW1wbGVtZW50ZWQoZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNzYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJCQkJICAgICAgIHNpemVfdCBzaXplLAotCQkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCXN3aXRjaCAoZGV2LT5idXMtPmJ1c3R5cGUpIHsKLQljYXNlIFNTQl9CVVNUWVBFX1BDSToKLSNpZmRlZiBDT05GSUdfU1NCX1BDSUhPU1QKLQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldi0+YnVzLT5ob3N0X3BjaSwgZG1hX2FkZHIsCi0JCQkJCSAgICBzaXplLCBkaXIpOwotCQlyZXR1cm47Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBTU0JfQlVTVFlQRV9TU0I6Ci0JCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldi0+ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlfX3NzYl9kbWFfbm90X2ltcGxlbWVudGVkKGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzc2JfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IHNzYl9kZXZpY2UgKmRldiwKLQkJCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJCQkJCSAgc2l6ZV90IHNpemUsCi0JCQkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlzd2l0Y2ggKGRldi0+YnVzLT5idXN0eXBlKSB7Ci0JY2FzZSBTU0JfQlVTVFlQRV9QQ0k6Ci0jaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCi0JCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYtPmJ1cy0+aG9zdF9wY2ksIGRtYV9hZGRyLAotCQkJCQkgICAgICAgc2l6ZSwgZGlyKTsKLQkJcmV0dXJuOwotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgU1NCX0JVU1RZUEVfU1NCOgotCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYtPmRldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JX19zc2JfZG1hX25vdF9pbXBsZW1lbnRlZChkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3NiX2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsCi0JCQkJCQkgICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkJICAgICBzaXplX3Qgc2l6ZSwKLQkJCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCXN3aXRjaCAoZGV2LT5idXMtPmJ1c3R5cGUpIHsKLQljYXNlIFNTQl9CVVNUWVBFX1BDSToKLSNpZmRlZiBDT05GSUdfU1NCX1BDSUhPU1QKLQkJLyogSnVzdCBzeW5jIGV2ZXJ5dGhpbmcuIFRoYXQncyBhbGwgdGhlIFBDSSBBUEkgY2FuIGRvLiAqLwotCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LT5idXMtPmhvc3RfcGNpLCBkbWFfYWRkciwKLQkJCQkJICAgIG9mZnNldCArIHNpemUsIGRpcik7Ci0JCXJldHVybjsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIFNTQl9CVVNUWVBFX1NTQjoKLQkJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoZGV2LT5kZXYsIGRtYV9hZGRyLCBvZmZzZXQsCi0JCQkJCSAgICAgIHNpemUsIGRpcik7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JX19zc2JfZG1hX25vdF9pbXBsZW1lbnRlZChkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3NiX2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsCi0JCQkJCQkJZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJCQlzaXplX3Qgc2l6ZSwKLQkJCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0Jc3dpdGNoIChkZXYtPmJ1cy0+YnVzdHlwZSkgewotCWNhc2UgU1NCX0JVU1RZUEVfUENJOgotI2lmZGVmIENPTkZJR19TU0JfUENJSE9TVAotCQkvKiBKdXN0IHN5bmMgZXZlcnl0aGluZy4gVGhhdCdzIGFsbCB0aGUgUENJIEFQSSBjYW4gZG8uICovCi0JCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYtPmJ1cy0+aG9zdF9wY2ksIGRtYV9hZGRyLAotCQkJCQkgICAgICAgb2Zmc2V0ICsgc2l6ZSwgZGlyKTsKLQkJcmV0dXJuOwotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgU1NCX0JVU1RZUEVfU1NCOgotCQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShkZXYtPmRldiwgZG1hX2FkZHIsIG9mZnNldCwKLQkJCQkJCSBzaXplLCBkaXIpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCV9fc3NiX2RtYV9ub3RfaW1wbGVtZW50ZWQoZGV2KTsKLX0KLQotCiAjaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCiAvKiBQQ0ktaG9zdCB3cmFwcGVyIGRyaXZlciAqLwogZXh0ZXJuIGludCBzc2JfcGNpaG9zdF9yZWdpc3RlcihzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKaW5kZXggYmM3ZDZiYi4uNGFmMjcwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKQEAgLTYxLDE0ICs2MSwxNSBAQAogICoJYmVmb3JlIGRldmljZSBkcml2ZXJzJyBsYXRlIHN1c3BlbmQgY2FsbGJhY2tzIGFyZSBleGVjdXRlZC4gIEl0IHJldHVybnMKICAqCTAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLCBpbiB3aGljaCBjYXNlIHRoZQogICoJc3lzdGVtIGNhbm5vdCBlbnRlciB0aGUgZGVzaXJlZCBzbGVlcCBzdGF0ZSAoQHByZXBhcmVfbGF0ZSgpLCBAZW50ZXIoKSwKLSAqCUB3YWtlKCksIGFuZCBAZmluaXNoKCkgd2lsbCBub3QgYmUgY2FsbGVkIGluIHRoYXQgY2FzZSkuCisgKglhbmQgQHdha2UoKSB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gdGhhdCBjYXNlKS4KICAqCiAgKiBAcHJlcGFyZV9sYXRlOiBGaW5pc2ggcHJlcGFyaW5nIHRoZSBwbGF0Zm9ybSBmb3IgZW50ZXJpbmcgdGhlIHN5c3RlbSBzbGVlcAogICoJc3RhdGUgaW5kaWNhdGVkIGJ5IEBiZWdpbigpLgogICoJQHByZXBhcmVfbGF0ZSBpcyBjYWxsZWQgYmVmb3JlIGRpc2FibGluZyBub25ib290IENQVXMgYW5kIGFmdGVyCiAgKglkZXZpY2UgZHJpdmVycycgbGF0ZSBzdXNwZW5kIGNhbGxiYWNrcyBoYXZlIGJlZW4gZXhlY3V0ZWQuICBJdCByZXR1cm5zCiAgKgkwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZSwgaW4gd2hpY2ggY2FzZSB0aGUKLSAqCXN5c3RlbSBjYW5ub3QgZW50ZXIgdGhlIGRlc2lyZWQgc2xlZXAgc3RhdGUgKEBlbnRlcigpIGFuZCBAd2FrZSgpKS4KKyAqCXN5c3RlbSBjYW5ub3QgZW50ZXIgdGhlIGRlc2lyZWQgc2xlZXAgc3RhdGUgKEBlbnRlcigpIHdpbGwgbm90IGJlCisgKglleGVjdXRlZCkuCiAgKgogICogQGVudGVyOiBFbnRlciB0aGUgc3lzdGVtIHNsZWVwIHN0YXRlIGluZGljYXRlZCBieSBAYmVnaW4oKSBvciByZXByZXNlbnRlZCBieQogICoJdGhlIGFyZ3VtZW50IGlmIEBiZWdpbigpIGlzIG5vdCBpbXBsZW1lbnRlZC4KQEAgLTgxLDE0ICs4MiwxNSBAQAogICoJcmVzdW1lIGNhbGxiYWNrcyBhcmUgZXhlY3V0ZWQuCiAgKglUaGlzIGNhbGxiYWNrIGlzIG9wdGlvbmFsLCBidXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBwbGF0Zm9ybXMKICAqCXRoYXQgaW1wbGVtZW50IEBwcmVwYXJlX2xhdGUoKS4gIElmIGltcGxlbWVudGVkLCBpdCBpcyBhbHdheXMgY2FsbGVkCi0gKglhZnRlciBAZW50ZXIoKSwgZXZlbiBpZiBAZW50ZXIoKSBmYWlscy4KKyAqCWFmdGVyIEBwcmVwYXJlX2xhdGUgYW5kIEBlbnRlcigpLCBldmVuIGlmIG9uZSBvZiB0aGVtIGZhaWxzLgogICoKICAqIEBmaW5pc2g6IEZpbmlzaCB3YWtlLXVwIG9mIHRoZSBwbGF0Zm9ybS4KICAqCUBmaW5pc2ggaXMgY2FsbGVkIHJpZ2h0IHByaW9yIHRvIGNhbGxpbmcgZGV2aWNlIGRyaXZlcnMnIHJlZ3VsYXIgc3VzcGVuZAogICoJY2FsbGJhY2tzLgogICoJVGhpcyBjYWxsYmFjayBpcyBvcHRpb25hbCwgYnV0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm1zCiAgKgl0aGF0IGltcGxlbWVudCBAcHJlcGFyZSgpLiAgSWYgaW1wbGVtZW50ZWQsIGl0IGlzIGFsd2F5cyBjYWxsZWQgYWZ0ZXIKLSAqCUBlbnRlcigpIGFuZCBAd2FrZSgpLCBpZiBpbXBsZW1lbnRlZCwgZXZlbiBpZiBhbnkgb2YgdGhlbSBmYWlscy4KKyAqCUBlbnRlcigpIGFuZCBAd2FrZSgpLCBldmVuIGlmIGFueSBvZiB0aGVtIGZhaWxzLiAgSXQgaXMgZXhlY3V0ZWQgYWZ0ZXIKKyAqCWEgZmFpbGluZyBAcHJlcGFyZS4KICAqCiAgKiBAZW5kOiBDYWxsZWQgYnkgdGhlIFBNIGNvcmUgcmlnaHQgYWZ0ZXIgcmVzdW1pbmcgZGV2aWNlcywgdG8gaW5kaWNhdGUgdG8KICAqCXRoZSBwbGF0Zm9ybSB0aGF0IHRoZSBzeXN0ZW0gaGFzIHJldHVybmVkIHRvIHRoZSB3b3JraW5nIHN0YXRlIG9yCkBAIC0yODYsNiArMjg4LDEzIEBACiAJCXsgLm5vdGlmaWVyX2NhbGwgPSBmbiwgLnByaW9yaXR5ID0gcHJpIH07CVwKIAlyZWdpc3Rlcl9wbV9ub3RpZmllcigmZm4jI19uYik7CQkJXAogfQorCisvKiBkcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMgKi8KK2V4dGVybiBib29sIGV2ZW50c19jaGVja19lbmFibGVkOworCitleHRlcm4gYm9vbCBwbV9jaGVja193YWtldXBfZXZlbnRzKHZvaWQpOworZXh0ZXJuIGJvb2wgcG1fZ2V0X3dha2V1cF9jb3VudCh1bnNpZ25lZCBsb25nICpjb3VudCk7CitleHRlcm4gYm9vbCBwbV9zYXZlX3dha2V1cF9jb3VudCh1bnNpZ25lZCBsb25nIGNvdW50KTsKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKaW5kZXggODFhNGUyMS4uOGMwZTM0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKQEAgLTIzLDYgKzIzLDI5IEBACiAjZGVmaW5lIElPX1RMQl9TSElGVCAxMQogCiBleHRlcm4gdm9pZCBzd2lvdGxiX2luaXQoaW50IHZlcmJvc2UpOworZXh0ZXJuIHZvaWQgc3dpb3RsYl9pbml0X3dpdGhfdGJsKGNoYXIgKnRsYiwgdW5zaWduZWQgbG9uZyBuc2xhYnMsIGludCB2ZXJib3NlKTsKKworLyoKKyAqIEVudW1lcmF0aW9uIGZvciBzeW5jIHRhcmdldHMKKyAqLworZW51bSBkbWFfc3luY190YXJnZXQgeworCVNZTkNfRk9SX0NQVSA9IDAsCisJU1lOQ19GT1JfREVWSUNFID0gMSwKK307CitleHRlcm4gdm9pZCAqc3dpb3RsYl90YmxfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCB0YmxfZG1hX2FkZHIsCisJCQkJICAgIHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplLAorCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpOworCitleHRlcm4gdm9pZCBzd2lvdGxiX3RibF91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGNoYXIgKmRtYV9hZGRyLAorCQkJCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CisKK2V4dGVybiB2b2lkIHN3aW90bGJfdGJsX3N5bmNfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFfYWRkciwKKwkJCQkgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgICAgZW51bSBkbWFfc3luY190YXJnZXQgdGFyZ2V0KTsKKworLyogQWNjZXNzb3J5IGZ1bmN0aW9ucy4gKi8KK2V4dGVybiB2b2lkIHN3aW90bGJfYm91bmNlKHBoeXNfYWRkcl90IHBoeXMsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CiAKIGV4dGVybiB2b2lkCiAqc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCkBAIC00MiwxMSArNjUsMTEgQEAKIAogZXh0ZXJuIGludAogc3dpb3RsYl9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkgICAgICAgaW50IGRpcmVjdGlvbik7CisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CiAKIGV4dGVybiB2b2lkCiBzd2lvdGxiX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JCSBpbnQgZGlyZWN0aW9uKTsKKwkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CiAKIGV4dGVybiBpbnQKIHN3aW90bGJfbWFwX3NnX2F0dHJzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbGVtcywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAxM2ViYjU0Li5hNmJmZDEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC0xNjcsNyArMTY3LDYgQEAKIAkJLmVudGVyX2V2ZW50CT0gJmV2ZW50X2VudGVyXyMjc25hbWUsCQlcCiAJCS5leGl0X2V2ZW50CT0gJmV2ZW50X2V4aXRfIyNzbmFtZSwJCVwKIAkJLmVudGVyX2ZpZWxkcwk9IExJU1RfSEVBRF9JTklUKF9fc3lzY2FsbF9tZXRhXyMjc25hbWUuZW50ZXJfZmllbGRzKSwgXAotCQkuZXhpdF9maWVsZHMJPSBMSVNUX0hFQURfSU5JVChfX3N5c2NhbGxfbWV0YV8jI3NuYW1lLmV4aXRfZmllbGRzKSwgXAogCX07CiAKICNkZWZpbmUgU1lTQ0FMTF9ERUZJTkUwKHNuYW1lKQkJCQkJXApAQCAtMTgyLDcgKzE4MSw2IEBACiAJCS5lbnRlcl9ldmVudAk9ICZldmVudF9lbnRlcl9fIyNzbmFtZSwJXAogCQkuZXhpdF9ldmVudAk9ICZldmVudF9leGl0X18jI3NuYW1lLAkJXAogCQkuZW50ZXJfZmllbGRzCT0gTElTVF9IRUFEX0lOSVQoX19zeXNjYWxsX21ldGFfXyMjc25hbWUuZW50ZXJfZmllbGRzKSwgXAotCQkuZXhpdF9maWVsZHMJPSBMSVNUX0hFQURfSU5JVChfX3N5c2NhbGxfbWV0YV9fIyNzbmFtZS5leGl0X2ZpZWxkcyksIFwKIAl9OwkJCQkJCQlcCiAJYXNtbGlua2FnZSBsb25nIHN5c18jI3NuYW1lKHZvaWQpCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNmcy5oIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCmluZGV4IGYyNjk0ZWIuLjNjOTIxMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKQEAgLTIyLDE0ICsyMiw4IEBACiBzdHJ1Y3QgbW9kdWxlOwogZW51bSBrb2JqX25zX3R5cGU7CiAKLS8qIEZJWE1FCi0gKiBUaGUgKm93bmVyIGZpZWxkIGlzIG5vIGxvbmdlciB1c2VkLgotICogeDg2IHRyZWUgaGFzIGJlZW4gY2xlYW5lZCB1cC4gVGhlIG93bmVyCi0gKiBhdHRyaWJ1dGUgaXMgc3RpbGwgbGVmdCBmb3Igb3RoZXIgYXJjaGVzLgotICovCiBzdHJ1Y3QgYXR0cmlidXRlIHsKIAljb25zdCBjaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAJbW9kZV90CQkJbW9kZTsKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwogCXN0cnVjdCBsb2NrX2NsYXNzX2tleQkqa2V5OwpAQCAtMTM2LDggKzEzMCw4IEBACiAJCQkJICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cik7CiBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cik7Ci1pbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2NobW9kX2ZpbGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICBtb2RlX3QgbW9kZSk7CitpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2NobW9kX2ZpbGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBtb2RlX3QgbW9kZSk7CiB2b2lkIHN5c2ZzX3JlbW92ZV9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKTsKIHZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cik7CiAKQEAgLTIyNSw3ICsyMTksNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBzeXNmc19jaG1vZF9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIG1vZGVfdCBtb2RlKQorCQkJCSAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIG1vZGVfdCBtb2RlKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lci5oIGIvaW5jbHVkZS9saW51eC90aW1lci5oCmluZGV4IGVhOTY1YjguLjM4Y2YwOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKQEAgLTEwMCw2ICsxMDAsMTMgQEAKIAkJc2V0dXBfdGltZXJfb25fc3RhY2tfa2V5KCh0aW1lciksICN0aW1lciwgJl9fa2V5LAlcCiAJCQkJCSAoZm4pLCAoZGF0YSkpOwkJCVwKIAl9IHdoaWxlICgwKQorI2RlZmluZSBzZXR1cF9kZWZlcnJhYmxlX3RpbWVyX29uX3N0YWNrKHRpbWVyLCBmbiwgZGF0YSkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgX19rZXk7CQkJXAorCQlzZXR1cF9kZWZlcnJhYmxlX3RpbWVyX29uX3N0YWNrX2tleSgodGltZXIpLCAjdGltZXIsCVwKKwkJCQkJCSAgICAmX19rZXksIChmbiksCVwKKwkJCQkJCSAgICAoZGF0YSkpOwkJXAorCX0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBpbml0X3RpbWVyKHRpbWVyKVwKIAlpbml0X3RpbWVyX2tleSgodGltZXIpLCBOVUxMLCBOVUxMKQpAQCAtMTExLDYgKzExOCw4IEBACiAJc2V0dXBfdGltZXJfa2V5KCh0aW1lciksIE5VTEwsIE5VTEwsIChmbiksIChkYXRhKSkKICNkZWZpbmUgc2V0dXBfdGltZXJfb25fc3RhY2sodGltZXIsIGZuLCBkYXRhKVwKIAlzZXR1cF90aW1lcl9vbl9zdGFja19rZXkoKHRpbWVyKSwgTlVMTCwgTlVMTCwgKGZuKSwgKGRhdGEpKQorI2RlZmluZSBzZXR1cF9kZWZlcnJhYmxlX3RpbWVyX29uX3N0YWNrKHRpbWVyLCBmbiwgZGF0YSlcCisJc2V0dXBfZGVmZXJyYWJsZV90aW1lcl9vbl9zdGFja19rZXkoKHRpbWVyKSwgTlVMTCwgTlVMTCwgKGZuKSwgKGRhdGEpKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19USU1FUlMKQEAgLTE1MCw2ICsxNTksMTIgQEAKIAlpbml0X3RpbWVyX29uX3N0YWNrX2tleSh0aW1lciwgbmFtZSwga2V5KTsKIH0KIAorZXh0ZXJuIHZvaWQgc2V0dXBfZGVmZXJyYWJsZV90aW1lcl9vbl9zdGFja19rZXkoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAorCQkJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCXN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5LAorCQkJCQkJdm9pZCAoKmZ1bmN0aW9uKSh1bnNpZ25lZCBsb25nKSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgZGF0YSk7CisKIC8qKgogICogdGltZXJfcGVuZGluZyAtIGlzIGEgdGltZXIgcGVuZGluZz8KICAqIEB0aW1lcjogdGhlIHRpbWVyIGluIHF1ZXN0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmggYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKaW5kZXggYzQ0ZGY1MC4uYjU3MmU0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaApAQCAtMTAzLDYgKzEwMyw3IEBACiAJCQkJfCAxKlNEX1NIQVJFX1BLR19SRVNPVVJDRVMJCVwKIAkJCQl8IDAqU0RfU0VSSUFMSVpFCQkJXAogCQkJCXwgMCpTRF9QUkVGRVJfU0lCTElORwkJCVwKKwkJCQl8IGFyY2hfc2Rfc2libGluZ19hc3ltX3BhY2tpbmcoKQlcCiAJCQkJLAkJCQkJXAogCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCQkJXAogCS5iYWxhbmNlX2ludGVydmFsCT0gMSwJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5LmggYi9pbmNsdWRlL2xpbnV4L3R0eS5oCmluZGV4IDkzMTA3OGIuLjc4MDJhMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5LmgKKysrIGIvaW5jbHVkZS9saW51eC90dHkuaApAQCAtNTUyLDYgKzU1Miw5IEBACiB9CiAjZW5kaWYKIAorLyogdHR5X2lvLmMgKi8KK2V4dGVybiBpbnQgX19pbml0IHR0eV9pbml0KHZvaWQpOworCiAvKiB0dHlfaW9jdGwuYyAqLwogZXh0ZXJuIGludCBuX3R0eV9pb2N0bF9oZWxwZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKaW5kZXggMjNkMjM3YS4uMzMxZDhiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtOCw3ICs4LDEwIEBACiAKICNkZWZpbmUgREVDTEFSRV9CSVRNQVAobmFtZSxiaXRzKSBcCiAJdW5zaWduZWQgbG9uZyBuYW1lW0JJVFNfVE9fTE9OR1MoYml0cyldCi0KKyNlbHNlCisjaWZuZGVmIF9fRVhQT1JURURfSEVBREVSU19fCisjd2FybmluZyAiQXR0ZW1wdCB0byB1c2Uga2VybmVsIGhlYWRlcnMgZnJvbSB1c2VyIHNwYWNlLCBzZWUgaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnL0tlcm5lbEhlYWRlcnMiCisjZW5kaWYgLyogX19FWFBPUlRFRF9IRUFERVJTX18gKi8KICNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaCBiL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI2MWEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91NjRfc3RhdHNfc3luYy5oCkBAIC0wLDAgKzEsMTQwIEBACisjaWZuZGVmIF9MSU5VWF9VNjRfU1RBVFNfU1lOQ19ICisjZGVmaW5lIF9MSU5VWF9VNjRfU1RBVFNfU1lOQ19ICisKKy8qCisgKiBUbyBwcm9wZXJseSBpbXBsZW1lbnQgNjRiaXRzIG5ldHdvcmsgc3RhdGlzdGljcyBvbiAzMmJpdCBhbmQgNjRiaXQgaG9zdHMsCisgKiB3ZSBwcm92aWRlIGEgc3luY2hyb25pemF0aW9uIHBvaW50LCB0aGF0IGlzIGEgbm9vcCBvbiA2NGJpdCBvciBVUCBrZXJuZWxzLgorICoKKyAqIEtleSBwb2ludHMgOgorICogMSkgVXNlIGEgc2VxY291bnQgb24gU01QIDMyYml0cywgd2l0aCBsb3cgb3ZlcmhlYWQuCisgKiAyKSBXaG9sZSB0aGluZyBpcyBhIG5vb3Agb24gNjRiaXQgYXJjaGVzIG9yIFVQIGtlcm5lbHMuCisgKiAzKSBXcml0ZSBzaWRlIG11c3QgZW5zdXJlIG11dHVhbCBleGNsdXNpb24gb3Igb25lIHNlcWNvdW50IHVwZGF0ZSBjb3VsZAorICogICAgYmUgbG9zdCwgdGh1cyBibG9ja2luZyByZWFkZXJzIGZvcmV2ZXIuCisgKiAgICBJZiB0aGlzIHN5bmNocm9uaXphdGlvbiBwb2ludCBpcyBub3QgYSBtdXRleCwgYnV0IGEgc3BpbmxvY2sgb3IKKyAqICAgIHNwaW5sb2NrX2JoKCkgb3IgZGlzYWJsZV9iaCgpIDoKKyAqIDMuMSkgV3JpdGUgc2lkZSBzaG91bGQgbm90IHNsZWVwLgorICogMy4yKSBXcml0ZSBzaWRlIHNob3VsZCBub3QgYWxsb3cgcHJlZW1wdGlvbi4KKyAqIDMuMykgSWYgYXBwbGljYWJsZSwgaW50ZXJydXB0cyBzaG91bGQgYmUgZGlzYWJsZWQuCisgKgorICogNCkgSWYgcmVhZGVyIGZldGNoZXMgc2V2ZXJhbCBjb3VudGVycywgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSB3aG9sZSB2YWx1ZXMKKyAqICAgIGFyZSBjb25zaXN0ZW50IChyZW1lbWJlciBwb2ludCAxKSA6IHRoaXMgaXMgYSBub29wIG9uIDY0Yml0IGFyY2hlcyBhbnl3YXkpCisgKgorICogNSkgcmVhZGVycyBhcmUgYWxsb3dlZCB0byBzbGVlcCBvciBiZSBwcmVlbXB0ZWQvaW50ZXJydXB0ZWQgOiBUaGV5IHBlcmZvcm0KKyAqICAgIHB1cmUgcmVhZHMuIEJ1dCBpZiB0aGV5IGhhdmUgdG8gZmV0Y2ggbWFueSB2YWx1ZXMsIGl0J3MgYmV0dGVyIHRvIG5vdCBhbGxvdworICogICAgcHJlZW1wdGlvbnMvaW50ZXJydXB0aW9ucyB0byBhdm9pZCBtYW55IHJldHJpZXMuCisgKgorICogNikgSWYgY291bnRlciBtaWdodCBiZSB3cml0dGVuIGJ5IGFuIGludGVycnVwdCwgcmVhZGVycyBzaG91bGQgYmxvY2sgaW50ZXJydXB0cy4KKyAqICAgIChPbiBVUCwgdGhlcmUgaXMgbm8gc2VxY291bnRfdCBwcm90ZWN0aW9uLCBhIHJlYWRlciBhbGxvd2luZyBpbnRlcnJ1cHRzIGNvdWxkCisgKiAgICAgcmVhZCBwYXJ0aWFsIHZhbHVlcykKKyAqCisgKiA3KSBGb3Igc29mdGlycSB1c2VzLCByZWFkZXJzIGNhbiB1c2UgdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKCkgYW5kCisgKiAgICB1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfYmgoKSBoZWxwZXJzCisgKgorICogVXNhZ2UgOgorICoKKyAqIFN0YXRzIHByb2R1Y2VyICh3cml0ZXIpIHNob3VsZCB1c2UgZm9sbG93aW5nIHRlbXBsYXRlIGdyYW50ZWQgaXQgYWxyZWFkeSBnb3QKKyAqIGFuIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gY291bnRlcnMgKGEgbG9jayBpcyBhbHJlYWR5IHRha2VuLCBvciBwZXIgY3B1CisgKiBkYXRhIGlzIHVzZWQgW2luIGEgbm9uIHByZWVtcHRhYmxlIGNvbnRleHRdKQorICoKKyAqICAgc3Bpbl9sb2NrX2JoKC4uLikgb3Igb3RoZXIgc3luY2hyb25pemF0aW9uIHRvIGdldCBleGNsdXNpdmUgYWNjZXNzCisgKiAgIC4uLgorICogICB1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luY3ApOworICogICBzdGF0cy0+Ynl0ZXM2NCArPSBsZW47IC8vIG5vbiBhdG9taWMgb3BlcmF0aW9uCisgKiAgIHN0YXRzLT5wYWNrZXRzNjQrKzsgICAgLy8gbm9uIGF0b21pYyBvcGVyYXRpb24KKyAqICAgdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzLT5zeW5jcCk7CisgKgorICogV2hpbGUgYSBjb25zdW1lciAocmVhZGVyKSBzaG91bGQgdXNlIGZvbGxvd2luZyB0ZW1wbGF0ZSB0byBnZXQgY29uc2lzdGVudAorICogc25hcHNob3QgZm9yIGVhY2ggdmFyaWFibGUgKGJ1dCBubyBndWFyYW50ZWUgb24gc2V2ZXJhbCBvbmVzKQorICoKKyAqIHU2NCB0Ynl0ZXMsIHRwYWNrZXRzOworICogdW5zaWduZWQgaW50IHN0YXJ0OworICoKKyAqIGRvIHsKKyAqICAgICAgICAgc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oJnN0YXRzLT5zeW5jcCk7CisgKiAgICAgICAgIHRieXRlcyA9IHN0YXRzLT5ieXRlczY0OyAvLyBub24gYXRvbWljIG9wZXJhdGlvbgorICogICAgICAgICB0cGFja2V0cyA9IHN0YXRzLT5wYWNrZXRzNjQ7IC8vIG5vbiBhdG9taWMgb3BlcmF0aW9uCisgKiB9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoJnN0YXRzLT5zeW5jcCwgc3RhcnQpKTsKKyAqCisgKgorICogRXhhbXBsZSBvZiB1c2UgaW4gZHJpdmVycy9uZXQvbG9vcGJhY2suYywgdXNpbmcgcGVyX2NwdSBjb250YWluZXJzLAorICogaW4gQkggZGlzYWJsZWQgY29udGV4dC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KKworc3RydWN0IHU2NF9zdGF0c19zeW5jIHsKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJc2VxY291bnRfdAlzZXE7CisjZW5kaWYKK307CisKK3N0YXRpYyB2b2lkIGlubGluZSB1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCit7CisjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCXdyaXRlX3NlcWNvdW50X2JlZ2luKCZzeW5jcC0+c2VxKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgdTY0X3N0YXRzX3VwZGF0ZV9lbmQoc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKK3sKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJd3JpdGVfc2VxY291bnRfZW5kKCZzeW5jcC0+c2VxKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKK3sKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJnN5bmNwLT5zZXEpOworI2Vsc2UKKyNpZiBCSVRTX1BFUl9MT05HPT0zMgorCXByZWVtcHRfZGlzYWJsZSgpOworI2VuZGlmCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGJvb2wgaW5saW5lIHU2NF9zdGF0c19mZXRjaF9yZXRyeShjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAorCQkJCQkgdW5zaWduZWQgaW50IHN0YXJ0KQoreworI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlyZXR1cm4gcmVhZF9zZXFjb3VudF9yZXRyeSgmc3luY3AtPnNlcSwgc3RhcnQpOworI2Vsc2UKKyNpZiBCSVRTX1BFUl9MT05HPT0zMgorCXByZWVtcHRfZW5hYmxlKCk7CisjZW5kaWYKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworLyoKKyAqIEluIGNhc2Ugc29mdGlycSBoYW5kbGVycyBjYW4gdXBkYXRlIHU2NCBjb3VudGVycywgcmVhZGVycyBjYW4gdXNlIGZvbGxvd2luZyBoZWxwZXJzCisgKiAtIFNNUCAzMmJpdCBhcmNoZXMgdXNlIHNlcWNvdW50IHByb3RlY3Rpb24sIGlycSBzYWZlLgorICogLSBVUCAzMmJpdCBtdXN0IGRpc2FibGUgQkguCisgKiAtIDY0Yml0IGhhdmUgbm8gcHJvYmxlbSBhdG9taWNhbGx5IHJlYWRpbmcgdTY0IHZhbHVlcywgaXJxIHNhZmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIHU2NF9zdGF0c19mZXRjaF9iZWdpbl9iaChjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQoreworI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlyZXR1cm4gcmVhZF9zZXFjb3VudF9iZWdpbigmc3luY3AtPnNlcSk7CisjZWxzZQorI2lmIEJJVFNfUEVSX0xPTkc9PTMyCisJbG9jYWxfYmhfZGlzYWJsZSgpOworI2VuZGlmCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGJvb2wgaW5saW5lIHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaChjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAorCQkJCQkgdW5zaWduZWQgaW50IHN0YXJ0KQoreworI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlyZXR1cm4gcmVhZF9zZXFjb3VudF9yZXRyeSgmc3luY3AtPnNlcSwgc3RhcnQpOworI2Vsc2UKKyNpZiBCSVRTX1BFUl9MT05HPT0zMgorCWxvY2FsX2JoX2VuYWJsZSgpOworI2VuZGlmCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBfTElOVVhfVTY0X1NUQVRTX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvdmlkZW8uaCBiL2luY2x1ZGUvbGludXgvdXNiL3ZpZGVvLmgKaW5kZXggYmU0MzZkOS4uM2IzYjk1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvdmlkZW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi92aWRlby5oCkBAIC0xNjAsNSArMTYwLDQwOSBAQAogI2RlZmluZSBVVkNfU1RBVFVTX1RZUEVfQ09OVFJPTAkJCQkxCiAjZGVmaW5lIFVWQ19TVEFUVVNfVFlQRV9TVFJFQU1JTkcJCQkyCiAKKy8qIDIuNC4zLjMuIFBheWxvYWQgSGVhZGVyIEluZm9ybWF0aW9uICovCisjZGVmaW5lIFVWQ19TVFJFQU1fRU9ICQkJCQkoMSA8PCA3KQorI2RlZmluZSBVVkNfU1RSRUFNX0VSUgkJCQkJKDEgPDwgNikKKyNkZWZpbmUgVVZDX1NUUkVBTV9TVEkJCQkJCSgxIDw8IDUpCisjZGVmaW5lIFVWQ19TVFJFQU1fUkVTCQkJCQkoMSA8PCA0KQorI2RlZmluZSBVVkNfU1RSRUFNX1NDUgkJCQkJKDEgPDwgMykKKyNkZWZpbmUgVVZDX1NUUkVBTV9QVFMJCQkJCSgxIDw8IDIpCisjZGVmaW5lIFVWQ19TVFJFQU1fRU9GCQkJCQkoMSA8PCAxKQorI2RlZmluZSBVVkNfU1RSRUFNX0ZJRAkJCQkJKDEgPDwgMCkKKworLyogNC4xLjIuIENvbnRyb2wgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFVWQ19DT05UUk9MX0NBUF9HRVQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgVVZDX0NPTlRST0xfQ0FQX1NFVAkJCQkoMSA8PCAxKQorI2RlZmluZSBVVkNfQ09OVFJPTF9DQVBfRElTQUJMRUQJCQkoMSA8PCAyKQorI2RlZmluZSBVVkNfQ09OVFJPTF9DQVBfQVVUT1VQREFURQkJCSgxIDw8IDMpCisjZGVmaW5lIFVWQ19DT05UUk9MX0NBUF9BU1lOQ0hST05PVVMJCQkoMSA8PCA0KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFVWQyBzdHJ1Y3R1cmVzCisgKi8KKworLyogQWxsIFVWQyBkZXNjcmlwdG9ycyBoYXZlIHRoZXNlIDMgZmllbGRzIGF0IHRoZSBiZWdpbm5pbmcgKi8KK3N0cnVjdCB1dmNfZGVzY3JpcHRvcl9oZWFkZXIgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIDMuNy4yLiBWaWRlbyBDb250cm9sIEludGVyZmFjZSBIZWFkZXIgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTE2IGJjZFVWQzsKKwlfX3UxNiB3VG90YWxMZW5ndGg7CisJX191MzIgZHdDbG9ja0ZyZXF1ZW5jeTsKKwlfX3U4ICBiSW5Db2xsZWN0aW9uOworCV9fdTggIGJhSW50ZXJmYWNlTnJbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9IRUFERVJfU0laRShuKQkJCQkoMTIrKG4pKQorCisjZGVmaW5lIFVWQ19IRUFERVJfREVTQ1JJUFRPUihuKSBcCisJdXZjX2hlYWRlcl9kZXNjcmlwdG9yXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX0hFQURFUl9ERVNDUklQVE9SKG4pCQlcCitzdHJ1Y3QgVVZDX0hFQURFUl9ERVNDUklQVE9SKG4pIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTE2IGJjZFVWQzsJCQkJCVwKKwlfX3UxNiB3VG90YWxMZW5ndGg7CQkJCVwKKwlfX3UzMiBkd0Nsb2NrRnJlcXVlbmN5OwkJCQlcCisJX191OCAgYkluQ29sbGVjdGlvbjsJCQkJXAorCV9fdTggIGJhSW50ZXJmYWNlTnJbbl07CQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuNy4yLjEuIElucHV0IFRlcm1pbmFsIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJUZXJtaW5hbElEOworCV9fdTE2IHdUZXJtaW5hbFR5cGU7CisJX191OCAgYkFzc29jVGVybWluYWw7CisJX191OCAgaVRlcm1pbmFsOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0lOUFVUX1RFUk1JTkFMX1NJWkUJCQk4CisKKy8qIDMuNy4yLjIuIE91dHB1dCBUZXJtaW5hbCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlRlcm1pbmFsSUQ7CisJX191MTYgd1Rlcm1pbmFsVHlwZTsKKwlfX3U4ICBiQXNzb2NUZXJtaW5hbDsKKwlfX3U4ICBiU291cmNlSUQ7CisJX191OCAgaVRlcm1pbmFsOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX09VVFBVVF9URVJNSU5BTF9TSVpFCQkJOQorCisvKiAzLjcuMi4zLiBDYW1lcmEgVGVybWluYWwgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19jYW1lcmFfdGVybWluYWxfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJUZXJtaW5hbElEOworCV9fdTE2IHdUZXJtaW5hbFR5cGU7CisJX191OCAgYkFzc29jVGVybWluYWw7CisJX191OCAgaVRlcm1pbmFsOworCV9fdTE2IHdPYmplY3RpdmVGb2NhbExlbmd0aE1pbjsKKwlfX3UxNiB3T2JqZWN0aXZlRm9jYWxMZW5ndGhNYXg7CisJX191MTYgd09jdWxhckZvY2FsTGVuZ3RoOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibUNvbnRyb2xzWzNdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0NBTUVSQV9URVJNSU5BTF9TSVpFKG4pCQkJKDE1KyhuKSkKKworLyogMy43LjIuNC4gU2VsZWN0b3IgVW5pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX3NlbGVjdG9yX3VuaXRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJVbml0SUQ7CisJX191OCAgYk5ySW5QaW5zOworCV9fdTggIGJhU291cmNlSURbMF07CisJX191OCAgaVNlbGVjdG9yOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX1NFTEVDVE9SX1VOSVRfU0laRShuKQkJCSg2KyhuKSkKKworI2RlZmluZSBVVkNfU0VMRUNUT1JfVU5JVF9ERVNDUklQVE9SKG4pCVwKKwl1dmNfc2VsZWN0b3JfdW5pdF9kZXNjcmlwdG9yXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX1NFTEVDVE9SX1VOSVRfREVTQ1JJUFRPUihuKQlcCitzdHJ1Y3QgVVZDX1NFTEVDVE9SX1VOSVRfREVTQ1JJUFRPUihuKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJVbml0SUQ7CQkJCQlcCisJX191OCAgYk5ySW5QaW5zOwkJCQlcCisJX191OCAgYmFTb3VyY2VJRFtuXTsJCQkJXAorCV9fdTggIGlTZWxlY3RvcjsJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogMy43LjIuNS4gUHJvY2Vzc2luZyBVbml0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiVW5pdElEOworCV9fdTggIGJTb3VyY2VJRDsKKwlfX3UxNiB3TWF4TXVsdGlwbGllcjsKKwlfX3U4ICBiQ29udHJvbFNpemU7CisJX191OCAgYm1Db250cm9sc1syXTsKKwlfX3U4ICBpUHJvY2Vzc2luZzsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9QUk9DRVNTSU5HX1VOSVRfU0laRShuKQkJCSg5KyhuKSkKKworLyogMy43LjIuNi4gRXh0ZW5zaW9uIFVuaXQgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19leHRlbnNpb25fdW5pdF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlVuaXRJRDsKKwlfX3U4ICBndWlkRXh0ZW5zaW9uQ29kZVsxNl07CisJX191OCAgYk51bUNvbnRyb2xzOworCV9fdTggIGJOckluUGluczsKKwlfX3U4ICBiYVNvdXJjZUlEWzBdOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibUNvbnRyb2xzWzBdOworCV9fdTggIGlFeHRlbnNpb247Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfRVhURU5TSU9OX1VOSVRfU0laRShwLCBuKQkJKDI0KyhwKSsobikpCisKKyNkZWZpbmUgVVZDX0VYVEVOU0lPTl9VTklUX0RFU0NSSVBUT1IocCwgbikgXAorCXV2Y19leHRlbnNpb25fdW5pdF9kZXNjcmlwdG9yXyMjcF8jI24KKworI2RlZmluZSBERUNMQVJFX1VWQ19FWFRFTlNJT05fVU5JVF9ERVNDUklQVE9SKHAsIG4pCVwKK3N0cnVjdCBVVkNfRVhURU5TSU9OX1VOSVRfREVTQ1JJUFRPUihwLCBuKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJVbml0SUQ7CQkJCQlcCisJX191OCAgZ3VpZEV4dGVuc2lvbkNvZGVbMTZdOwkJCVwKKwlfX3U4ICBiTnVtQ29udHJvbHM7CQkJCVwKKwlfX3U4ICBiTnJJblBpbnM7CQkJCVwKKwlfX3U4ICBiYVNvdXJjZUlEW3BdOwkJCQlcCisJX191OCAgYkNvbnRyb2xTaXplOwkJCQlcCisJX191OCAgYm1Db250cm9sc1tuXTsJCQkJXAorCV9fdTggIGlFeHRlbnNpb247CQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuOC4yLjIuIFZpZGVvIENvbnRyb2wgSW50ZXJydXB0IEVuZHBvaW50IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfY29udHJvbF9lbmRwb2ludF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191MTYgd01heFRyYW5zZmVyU2l6ZTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9DT05UUk9MX0VORFBPSU5UX1NJWkUJCQk1CisKKy8qIDMuOS4yLjEuIElucHV0IEhlYWRlciBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2lucHV0X2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYk51bUZvcm1hdHM7CisJX191MTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJFbmRwb2ludEFkZHJlc3M7CisJX191OCAgYm1JbmZvOworCV9fdTggIGJUZXJtaW5hbExpbms7CisJX191OCAgYlN0aWxsQ2FwdHVyZU1ldGhvZDsKKwlfX3U4ICBiVHJpZ2dlclN1cHBvcnQ7CisJX191OCAgYlRyaWdnZXJVc2FnZTsKKwlfX3U4ICBiQ29udHJvbFNpemU7CisJX191OCAgYm1hQ29udHJvbHNbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9JTlBVVF9IRUFERVJfU0laRShuLCBwKQkJCSgxMysobipwKSkKKworI2RlZmluZSBVVkNfSU5QVVRfSEVBREVSX0RFU0NSSVBUT1IobiwgcCkgXAorCXV2Y19pbnB1dF9oZWFkZXJfZGVzY3JpcHRvcl8jI25fIyNwCisKKyNkZWZpbmUgREVDTEFSRV9VVkNfSU5QVVRfSEVBREVSX0RFU0NSSVBUT1IobiwgcCkJXAorc3RydWN0IFVWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJOdW1Gb3JtYXRzOwkJCQlcCisJX191MTYgd1RvdGFsTGVuZ3RoOwkJCQlcCisJX191OCAgYkVuZHBvaW50QWRkcmVzczsJCQkJXAorCV9fdTggIGJtSW5mbzsJCQkJCVwKKwlfX3U4ICBiVGVybWluYWxMaW5rOwkJCQlcCisJX191OCAgYlN0aWxsQ2FwdHVyZU1ldGhvZDsJCQlcCisJX191OCAgYlRyaWdnZXJTdXBwb3J0OwkJCQlcCisJX191OCAgYlRyaWdnZXJVc2FnZTsJCQkJXAorCV9fdTggIGJDb250cm9sU2l6ZTsJCQkJXAorCV9fdTggIGJtYUNvbnRyb2xzW3BdW25dOwkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuOS4yLjIuIE91dHB1dCBIZWFkZXIgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19vdXRwdXRfaGVhZGVyX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiTnVtRm9ybWF0czsKKwlfX3UxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYkVuZHBvaW50QWRkcmVzczsKKwlfX3U4ICBiVGVybWluYWxMaW5rOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibWFDb250cm9sc1tdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX09VVFBVVF9IRUFERVJfU0laRShuLCBwKQkJCSg5KyhuKnApKQorCisjZGVmaW5lIFVWQ19PVVRQVVRfSEVBREVSX0RFU0NSSVBUT1IobiwgcCkgXAorCXV2Y19vdXRwdXRfaGVhZGVyX2Rlc2NyaXB0b3JfIyNuXyMjcAorCisjZGVmaW5lIERFQ0xBUkVfVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKQlcCitzdHJ1Y3QgVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJOdW1Gb3JtYXRzOwkJCQlcCisJX191MTYgd1RvdGFsTGVuZ3RoOwkJCQlcCisJX191OCAgYkVuZHBvaW50QWRkcmVzczsJCQkJXAorCV9fdTggIGJUZXJtaW5hbExpbms7CQkJCVwKKwlfX3U4ICBiQ29udHJvbFNpemU7CQkJCVwKKwlfX3U4ICBibWFDb250cm9sc1twXVtuXTsJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiAzLjkuMi42LiBDb2xvciBtYXRjaGluZyBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2NvbG9yX21hdGNoaW5nX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiQ29sb3JQcmltYXJpZXM7CisJX191OCAgYlRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzOworCV9fdTggIGJNYXRyaXhDb2VmZmljaWVudHM7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfQ09MT1JfTUFUQ0hJTkdfU0laRQkJCTYKKworLyogNC4zLjEuMS4gVmlkZW8gUHJvYmUgYW5kIENvbW1pdCBDb250cm9scyAqLworc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCB7CisJX191MTYgYm1IaW50OworCV9fdTggIGJGb3JtYXRJbmRleDsKKwlfX3U4ICBiRnJhbWVJbmRleDsKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWw7CisJX191MTYgd0tleUZyYW1lUmF0ZTsKKwlfX3UxNiB3UEZyYW1lUmF0ZTsKKwlfX3UxNiB3Q29tcFF1YWxpdHk7CisJX191MTYgd0NvbXBXaW5kb3dTaXplOworCV9fdTE2IHdEZWxheTsKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVTaXplOworCV9fdTMyIGR3TWF4UGF5bG9hZFRyYW5zZmVyU2l6ZTsKKwlfX3UzMiBkd0Nsb2NrRnJlcXVlbmN5OworCV9fdTggIGJtRnJhbWluZ0luZm87CisJX191OCAgYlByZWZlcmVkVmVyc2lvbjsKKwlfX3U4ICBiTWluVmVyc2lvbjsKKwlfX3U4ICBiTWF4VmVyc2lvbjsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBVbmNvbXByZXNzZWQgUGF5bG9hZCAtIDMuMS4xLiBVbmNvbXByZXNzZWQgVmlkZW8gRm9ybWF0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfZm9ybWF0X3VuY29tcHJlc3NlZCB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJGb3JtYXRJbmRleDsKKwlfX3U4ICBiTnVtRnJhbWVEZXNjcmlwdG9yczsKKwlfX3U4ICBndWlkRm9ybWF0WzE2XTsKKwlfX3U4ICBiQml0c1BlclBpeGVsOworCV9fdTggIGJEZWZhdWx0RnJhbWVJbmRleDsKKwlfX3U4ICBiQXNwZWN0UmF0aW9YOworCV9fdTggIGJBc3BlY3RSYXRpb1k7CisJX191OCAgYm1JbnRlcmZhY2VGbGFnczsKKwlfX3U4ICBiQ29weVByb3RlY3Q7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfRk9STUFUX1VOQ09NUFJFU1NFRF9TSVpFCQkJMjcKKworLyogVW5jb21wcmVzc2VkIFBheWxvYWQgLSAzLjEuMi4gVW5jb21wcmVzc2VkIFZpZGVvIEZyYW1lIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfZnJhbWVfdW5jb21wcmVzc2VkIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYkZyYW1lSW5kZXg7CisJX191OCAgYm1DYXBhYmlsaXRpZXM7CisJX191MTYgd1dpZHRoOworCV9fdTE2IHdIZWlnaHQ7CisJX191MzIgZHdNaW5CaXRSYXRlOworCV9fdTMyIGR3TWF4Qml0UmF0ZTsKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVCdWZmZXJTaXplOworCV9fdTMyIGR3RGVmYXVsdEZyYW1lSW50ZXJ2YWw7CisJX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOworCV9fdTMyIGR3RnJhbWVJbnRlcnZhbFtdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0ZSQU1FX1VOQ09NUFJFU1NFRF9TSVpFKG4pCQkoMjYrNCoobikpCisKKyNkZWZpbmUgVVZDX0ZSQU1FX1VOQ09NUFJFU1NFRChuKSBcCisJdXZjX2ZyYW1lX3VuY29tcHJlc3NlZF8jI24KKworI2RlZmluZSBERUNMQVJFX1VWQ19GUkFNRV9VTkNPTVBSRVNTRUQobikJCVwKK3N0cnVjdCBVVkNfRlJBTUVfVU5DT01QUkVTU0VEKG4pIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJGcmFtZUluZGV4OwkJCQlcCisJX191OCAgYm1DYXBhYmlsaXRpZXM7CQkJCVwKKwlfX3UxNiB3V2lkdGg7CQkJCQlcCisJX191MTYgd0hlaWdodDsJCQkJCVwKKwlfX3UzMiBkd01pbkJpdFJhdGU7CQkJCVwKKwlfX3UzMiBkd01heEJpdFJhdGU7CQkJCVwKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVCdWZmZXJTaXplOwkJXAorCV9fdTMyIGR3RGVmYXVsdEZyYW1lSW50ZXJ2YWw7CQkJXAorCV9fdTggIGJGcmFtZUludGVydmFsVHlwZTsJCQlcCisJX191MzIgZHdGcmFtZUludGVydmFsW25dOwkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIE1KUEVHIFBheWxvYWQgLSAzLjEuMS4gTUpQRUcgVmlkZW8gRm9ybWF0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfZm9ybWF0X21qcGVnIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYkZvcm1hdEluZGV4OworCV9fdTggIGJOdW1GcmFtZURlc2NyaXB0b3JzOworCV9fdTggIGJtRmxhZ3M7CisJX191OCAgYkRlZmF1bHRGcmFtZUluZGV4OworCV9fdTggIGJBc3BlY3RSYXRpb1g7CisJX191OCAgYkFzcGVjdFJhdGlvWTsKKwlfX3U4ICBibUludGVyZmFjZUZsYWdzOworCV9fdTggIGJDb3B5UHJvdGVjdDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9GT1JNQVRfTUpQRUdfU0laRQkJCTExCisKKy8qIE1KUEVHIFBheWxvYWQgLSAzLjEuMi4gTUpQRUcgVmlkZW8gRnJhbWUgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19mcmFtZV9tanBlZyB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJGcmFtZUluZGV4OworCV9fdTggIGJtQ2FwYWJpbGl0aWVzOworCV9fdTE2IHdXaWR0aDsKKwlfX3UxNiB3SGVpZ2h0OworCV9fdTMyIGR3TWluQml0UmF0ZTsKKwlfX3UzMiBkd01heEJpdFJhdGU7CisJX191MzIgZHdNYXhWaWRlb0ZyYW1lQnVmZmVyU2l6ZTsKKwlfX3UzMiBkd0RlZmF1bHRGcmFtZUludGVydmFsOworCV9fdTggIGJGcmFtZUludGVydmFsVHlwZTsKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWxbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9GUkFNRV9NSlBFR19TSVpFKG4pCQkJKDI2KzQqKG4pKQorCisjZGVmaW5lIFVWQ19GUkFNRV9NSlBFRyhuKSBcCisJdXZjX2ZyYW1lX21qcGVnXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX0ZSQU1FX01KUEVHKG4pCQkJXAorc3RydWN0IFVWQ19GUkFNRV9NSlBFRyhuKSB7CQkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYkZyYW1lSW5kZXg7CQkJCVwKKwlfX3U4ICBibUNhcGFiaWxpdGllczsJCQkJXAorCV9fdTE2IHdXaWR0aDsJCQkJCVwKKwlfX3UxNiB3SGVpZ2h0OwkJCQkJXAorCV9fdTMyIGR3TWluQml0UmF0ZTsJCQkJXAorCV9fdTMyIGR3TWF4Qml0UmF0ZTsJCQkJXAorCV9fdTMyIGR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemU7CQlcCisJX191MzIgZHdEZWZhdWx0RnJhbWVJbnRlcnZhbDsJCQlcCisJX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOwkJCVwKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWxbbl07CQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKwogI2VuZGlmIC8qIF9fTElOVVhfVVNCX1ZJREVPX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCmluZGV4IGNjNGY0NTMuLjgxNzgxNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKQEAgLTM2LDYgKzM2LDkgQEAKIAkJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX3VzZXJfbnMpOwogfQogCit1aWRfdCB1c2VyX25zX21hcF91aWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICp0bywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsIHVpZF90IHVpZCk7CitnaWRfdCB1c2VyX25zX21hcF9naWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICp0bywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsIGdpZF90IGdpZCk7CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpnZXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQpAQCAtNTIsNiArNTUsMTcgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSB1aWRfdCB1c2VyX25zX21hcF91aWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICp0bywKKwljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwgdWlkX3QgdWlkKQoreworCXJldHVybiB1aWQ7Cit9CitzdGF0aWMgaW5saW5lIGdpZF90IHVzZXJfbnNfbWFwX2dpZChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnRvLAorCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLCBnaWRfdCBnaWQpCit7CisJcmV0dXJuIGdpZDsKK30KKwogI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfVVNFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaAppbmRleCA1Y2YxMTc2Li4zOTVjMzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmgKQEAgLTQsNiArNCw3IEBACiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4gKi8KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIFRoZSBmZWF0dXJlIGJpdG1hcCBmb3IgdmlydGlvIDlQICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKaW5kZXggMjI3YzJhNS4uZGUwNWU5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKQEAgLTMwLDcgKzMwLDcgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlzdHJ1Y3QgcGFnZQkJKipwYWdlczsKIAl1bnNpZ25lZCBpbnQJCW5yX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcJCXBoeXNfYWRkcjsKKwlwaHlzX2FkZHJfdAkJcGh5c19hZGRyOwogCXZvaWQJCQkqY2FsbGVyOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93bHAuaCBiL2luY2x1ZGUvbGludXgvd2xwLmgKaW5kZXggYWM5NWNlNi4uYzc2ZmUyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93bHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dscC5oCkBAIC0zMDAsNyArMzAwLDcgQEAKIAlfX2xlMTYgY3ljbGVfcGFyYW07CiAJX19sZTE2IGFjd19hbmNob3JfYWRkcjsKIAl1OCB3c3NpZF9oYXNoX2xpc3RbXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIGludCB3bHBfaWVfaGFzaF9sZW5ndGgoc3RydWN0IHdscF9pZSAqaWUpCiB7CkBAIC0zMjQsNyArMzI0LDcgQEAKICAqLwogc3RydWN0IHdscF9ub25jZSB7CiAJdTggZGF0YVsxNl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBXTFAgVVVJRApAQCAtMzM2LDcgKzMzNiw3IEBACiAgKi8KIHN0cnVjdCB3bHBfdXVpZCB7CiAJdTggZGF0YVsxNl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKioKQEAgLTM0OCw3ICszNDgsNyBAQAogCXU4IE9VSVszXTsKIAl1OCBPVUlzdWJkaXY7CiAJX19sZTE2IHN1YklEOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogV0xQIGZyYW1lIGhlYWRlcgpAQCAtMzU3LDcgKzM1Nyw3IEBACiBzdHJ1Y3Qgd2xwX2ZyYW1lX2hkciB7CiAJX19sZTE2IG11eF9oZHI7CQkJLyogV0xQX1BST1RPQ09MX0lEICovCiAJZW51bSB3bHBfZnJhbWVfdHlwZSB0eXBlOjg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBXTFAgYXR0cmlidXRlIGZpZWxkIGhlYWRlcgpAQCAtMzY4LDcgKzM2OCw3IEBACiBzdHJ1Y3Qgd2xwX2F0dHJfaGRyIHsKIAlfX2xlMTYgdHlwZTsKIAlfX2xlMTYgbGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogRGV2aWNlIGluZm9ybWF0aW9uIGNvbW1vbmx5IHVzZWQgdG9nZXRoZXIKQEAgLTQwMSwxMyArNDAxLDEzIEBACiBzdHJ1Y3Qgd2xwX2F0dHJfIyNuYW1lIHsJCQkJCQlcCiAJc3RydWN0IHdscF9hdHRyX2hkciBoZHI7CQkJCQlcCiAJdHlwZSBuYW1lOwkJCQkJCQlcCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSB3bHBfYXR0cl9hcnJheSh0eXBlLCBuYW1lKQkJCQkJXAogc3RydWN0IHdscF9hdHRyXyMjbmFtZSB7CQkJCQkJXAogCXN0cnVjdCB3bHBfYXR0cl9oZHIgaGRyOwkJCQkJXAogCXR5cGUgbmFtZVtdOwkJCQkJCQlcCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBXTFAgYXNzb2NpYXRpb24gYXR0cmlidXRlIGZpZWxkcwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAJc3RydWN0IHdscF9hdHRyX2FjY2VwdF9lbnJsIGFjY2VwdDsKIAlzdHJ1Y3Qgd2xwX2F0dHJfd3NzX3NlY19zdGF0dXMgc2VjX3N0YXQ7CiAJc3RydWN0IHdscF9hdHRyX3dzc19iY2FzdCBiY2FzdDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBXTFAgV1NTIEluZm9ybWF0aW9uICovCiB3bHBfYXR0cl9hcnJheShzdHJ1Y3Qgd2xwX3dzc19pbmZvLCB3c3NfaW5mbykKQEAgLTUyMCw3ICs1MjAsNyBAQAogc3RydWN0IHdscF9mcmFtZV9zdGRfYWJicnZfaGRyIHsKIAlzdHJ1Y3Qgd2xwX2ZyYW1lX2hkciBoZHI7CiAJdTggdGFnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKgogICogV0xQIGFzc29jaWF0aW9uIGZyYW1lcwpAQCAtNTMzLDcgKzUzMyw3IEBACiAJc3RydWN0IHdscF9hdHRyX3ZlcnNpb24gdmVyc2lvbjsKIAlzdHJ1Y3Qgd2xwX2F0dHJfbXNnX3R5cGUgbXNnX3R5cGU7CiAJdTggYXR0cltdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIEV0aGVybmV0IHRvIGRldiBhZGRyZXNzIG1hcHBpbmcgKi8KIHN0cnVjdCB3bHBfZWRhIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCmluZGV4IDk0NjZlODYuLmQwZjdjODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaApAQCAtMjk3LDQgKzI5Nyw4IEBACiAjZWxzZQogbG9uZyB3b3JrX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBsb25nICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZyk7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisjaWZkZWYgQ09ORklHX0xPQ0tERVAKK2ludCBpbl93b3JrcXVldWVfY29udGV4dChzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpOworI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgveGF0dHIuaCBiL2luY2x1ZGUvbGludXgveGF0dHIuaAppbmRleCAwY2ZhMWU5Li5mMWU1YmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKKysrIGIvaW5jbHVkZS9saW51eC94YXR0ci5oCkBAIC0zMyw2ICszMywyMCBAQAogI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWCAidXNlci4iCiAjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9VU0VSX1BSRUZJWCkgLSAxKQogCisvKiBTZWN1cml0eSBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgWEFUVFJfU0VMSU5VWF9TVUZGSVggInNlbGludXgiCisjZGVmaW5lIFhBVFRSX05BTUVfU0VMSU5VWCBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU0VMSU5VWF9TVUZGSVgKKworI2RlZmluZSBYQVRUUl9TTUFDS19TVUZGSVggIlNNQUNLNjQiCisjZGVmaW5lIFhBVFRSX1NNQUNLX0lQSU4gIlNNQUNLNjRJUElOIgorI2RlZmluZSBYQVRUUl9TTUFDS19JUE9VVCAiU01BQ0s2NElQT1VUIgorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19TVUZGSVgKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQSU4JWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0lQSU4KKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQT1VUCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUE9VVAorCisjZGVmaW5lIFhBVFRSX0NBUFNfU1VGRklYICJjYXBhYmlsaXR5IgorI2RlZmluZSBYQVRUUl9OQU1FX0NBUFMgWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX0NBUFNfU1VGRklYCisKIHN0cnVjdCBpbm9kZTsKIHN0cnVjdCBkZW50cnk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXItY29yZS5oIGIvaW5jbHVkZS9tZWRpYS9pci1jb3JlLmgKaW5kZXggYWQxMzAzZi4uNTEzZTYwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9pci1jb3JlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1jb3JlLmgKQEAgLTQ3LDE1ICs0NywyMSBAQAogICoJaXMgb3BlbmVkLgogICogQGNsb3NlOiBjYWxsYmFjayB0byBhbGxvdyBkcml2ZXJzIHRvIGRpc2FibGUgcG9sbGluZy9pcnEgd2hlbiBJUiBpbnB1dCBkZXZpY2UKICAqCWlzIG9wZW5lZC4KKyAqIEBzX3R4X21hc2s6IHNldCB0cmFuc21pdHRlciBtYXNrIChmb3IgZGV2aWNlcyB3aXRoIG11bHRpcGxlIHR4IG91dHB1dHMpCisgKiBAc190eF9jYXJyaWVyOiBzZXQgdHJhbnNtaXQgY2FycmllciBmcmVxdWVuY3kKKyAqIEB0eF9pcjogdHJhbnNtaXQgSVIKICAqLwogc3RydWN0IGlyX2Rldl9wcm9wcyB7CiAJZW51bSByY19kcml2ZXJfdHlwZQlkcml2ZXJfdHlwZTsKIAl1bnNpZ25lZCBsb25nCQlhbGxvd2VkX3Byb3RvczsKIAl1MzIJCQlzY2FubWFzazsKLQl2b2lkIAkJCSpwcml2OworCXZvaWQJCQkqcHJpdjsKIAlpbnQJCQkoKmNoYW5nZV9wcm90b2NvbCkodm9pZCAqcHJpdiwgdTY0IGlyX3R5cGUpOwogCWludAkJCSgqb3Blbikodm9pZCAqcHJpdik7CiAJdm9pZAkJCSgqY2xvc2UpKHZvaWQgKnByaXYpOworCWludAkJCSgqc190eF9tYXNrKSh2b2lkICpwcml2LCB1MzIgbWFzayk7CisJaW50CQkJKCpzX3R4X2NhcnJpZXIpKHZvaWQgKnByaXYsIHUzMiBjYXJyaWVyKTsKKwlpbnQJCQkoKnR4X2lyKSh2b2lkICpwcml2LCBpbnQgKnR4YnVmLCB1MzIgbik7CiB9OwogCiBzdHJ1Y3QgaXJfaW5wdXRfZGV2IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXIta2JkLWkyYy5oIGIvaW5jbHVkZS9tZWRpYS9pci1rYmQtaTJjLmgKaW5kZXggMDUwNmU0NS4uNWU5NmQ3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9pci1rYmQtaTJjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1rYmQtaTJjLmgKQEAgLTExLDcgKzExLDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICpjOwogCXN0cnVjdCBpbnB1dF9kZXYgICAgICAgKmlucHV0OwogCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAgaXI7Ci0KKwl1NjQgICAgICAgICAgICAgICAgICAgIGlyX3R5cGU7CiAJLyogVXNlZCB0byBhdm9pZCBmYXN0IHJlcGVhdGluZyAqLwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgb2xkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2xpcmMuaCBiL2luY2x1ZGUvbWVkaWEvbGlyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzQ2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2xpcmMuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIGxpcmMuaCAtIGxpbnV4IGluZnJhcmVkIHJlbW90ZSBjb250cm9sIGhlYWRlciBmaWxlCisgKiBsYXN0IG1vZGlmaWVkIDIwMTAvMDcvMTMgYnkgSmFyb2QgV2lsc29uCisgKi8KKworI2lmbmRlZiBfTElOVVhfTElSQ19ICisjZGVmaW5lIF9MSU5VWF9MSVJDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBQVUxTRV9CSVQgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBQVUxTRV9NQVNLICAgICAgMHgwMEZGRkZGRgorCisjZGVmaW5lIExJUkNfTU9ERTJfU1BBQ0UgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTElSQ19NT0RFMl9QVUxTRSAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBMSVJDX01PREUyX0ZSRVFVRU5DWSAweDAyMDAwMDAwCisjZGVmaW5lIExJUkNfTU9ERTJfVElNRU9VVCAgIDB4MDMwMDAwMDAKKworI2RlZmluZSBMSVJDX1ZBTFVFX01BU0sgICAgICAweDAwRkZGRkZGCisjZGVmaW5lIExJUkNfTU9ERTJfTUFTSyAgICAgIDB4RkYwMDAwMDAKKworI2RlZmluZSBMSVJDX1NQQUNFKHZhbCkgKCgodmFsKSZMSVJDX1ZBTFVFX01BU0spIHwgTElSQ19NT0RFMl9TUEFDRSkKKyNkZWZpbmUgTElSQ19QVUxTRSh2YWwpICgoKHZhbCkmTElSQ19WQUxVRV9NQVNLKSB8IExJUkNfTU9ERTJfUFVMU0UpCisjZGVmaW5lIExJUkNfRlJFUVVFTkNZKHZhbCkgKCgodmFsKSZMSVJDX1ZBTFVFX01BU0spIHwgTElSQ19NT0RFMl9GUkVRVUVOQ1kpCisjZGVmaW5lIExJUkNfVElNRU9VVCh2YWwpICgoKHZhbCkmTElSQ19WQUxVRV9NQVNLKSB8IExJUkNfTU9ERTJfVElNRU9VVCkKKworI2RlZmluZSBMSVJDX1ZBTFVFKHZhbCkgKCh2YWwpJkxJUkNfVkFMVUVfTUFTSykKKyNkZWZpbmUgTElSQ19NT0RFMih2YWwpICgodmFsKSZMSVJDX01PREUyX01BU0spCisKKyNkZWZpbmUgTElSQ19JU19TUEFDRSh2YWwpIChMSVJDX01PREUyKHZhbCkgPT0gTElSQ19NT0RFMl9TUEFDRSkKKyNkZWZpbmUgTElSQ19JU19QVUxTRSh2YWwpIChMSVJDX01PREUyKHZhbCkgPT0gTElSQ19NT0RFMl9QVUxTRSkKKyNkZWZpbmUgTElSQ19JU19GUkVRVUVOQ1kodmFsKSAoTElSQ19NT0RFMih2YWwpID09IExJUkNfTU9ERTJfRlJFUVVFTkNZKQorI2RlZmluZSBMSVJDX0lTX1RJTUVPVVQodmFsKSAoTElSQ19NT0RFMih2YWwpID09IExJUkNfTU9ERTJfVElNRU9VVCkKKworLyogdXNlZCBoZWF2aWx5IGJ5IGxpcmMgdXNlcnNwYWNlICovCisjZGVmaW5lIGxpcmNfdCBpbnQKKworLyoqKiBsaXJjIGNvbXBhdGlibGUgaGFyZHdhcmUgZmVhdHVyZXMgKioqLworCisjZGVmaW5lIExJUkNfTU9ERTJTRU5EKHgpICh4KQorI2RlZmluZSBMSVJDX1NFTkQyTU9ERSh4KSAoeCkKKyNkZWZpbmUgTElSQ19NT0RFMlJFQyh4KSAoKHgpIDw8IDE2KQorI2RlZmluZSBMSVJDX1JFQzJNT0RFKHgpICgoeCkgPj4gMTYpCisKKyNkZWZpbmUgTElSQ19NT0RFX1JBVyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTElSQ19NT0RFX1BVTFNFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTElSQ19NT0RFX01PREUyICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTElSQ19NT0RFX0xJUkNDT0RFICAgICAgICAgICAgIDB4MDAwMDAwMTAKKworCisjZGVmaW5lIExJUkNfQ0FOX1NFTkRfUkFXICAgICAgICAgICAgICBMSVJDX01PREUyU0VORChMSVJDX01PREVfUkFXKQorI2RlZmluZSBMSVJDX0NBTl9TRU5EX1BVTFNFICAgICAgICAgICAgTElSQ19NT0RFMlNFTkQoTElSQ19NT0RFX1BVTFNFKQorI2RlZmluZSBMSVJDX0NBTl9TRU5EX01PREUyICAgICAgICAgICAgTElSQ19NT0RFMlNFTkQoTElSQ19NT0RFX01PREUyKQorI2RlZmluZSBMSVJDX0NBTl9TRU5EX0xJUkNDT0RFICAgICAgICAgTElSQ19NT0RFMlNFTkQoTElSQ19NT0RFX0xJUkNDT0RFKQorCisjZGVmaW5lIExJUkNfQ0FOX1NFTkRfTUFTSyAgICAgICAgICAgICAweDAwMDAwMDNmCisKKyNkZWZpbmUgTElSQ19DQU5fU0VUX1NFTkRfQ0FSUklFUiAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTElSQ19DQU5fU0VUX1NFTkRfRFVUWV9DWUNMRSAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTElSQ19DQU5fU0VUX1RSQU5TTUlUVEVSX01BU0sgIDB4MDAwMDA0MDAKKworI2RlZmluZSBMSVJDX0NBTl9SRUNfUkFXICAgICAgICAgICAgICAgTElSQ19NT0RFMlJFQyhMSVJDX01PREVfUkFXKQorI2RlZmluZSBMSVJDX0NBTl9SRUNfUFVMU0UgICAgICAgICAgICAgTElSQ19NT0RFMlJFQyhMSVJDX01PREVfUFVMU0UpCisjZGVmaW5lIExJUkNfQ0FOX1JFQ19NT0RFMiAgICAgICAgICAgICBMSVJDX01PREUyUkVDKExJUkNfTU9ERV9NT0RFMikKKyNkZWZpbmUgTElSQ19DQU5fUkVDX0xJUkNDT0RFICAgICAgICAgIExJUkNfTU9ERTJSRUMoTElSQ19NT0RFX0xJUkNDT0RFKQorCisjZGVmaW5lIExJUkNfQ0FOX1JFQ19NQVNLICAgICAgICAgICAgICBMSVJDX01PREUyUkVDKExJUkNfQ0FOX1NFTkRfTUFTSykKKworI2RlZmluZSBMSVJDX0NBTl9TRVRfUkVDX0NBUlJJRVIgICAgICAgKExJUkNfQ0FOX1NFVF9TRU5EX0NBUlJJRVIgPDwgMTYpCisjZGVmaW5lIExJUkNfQ0FOX1NFVF9SRUNfRFVUWV9DWUNMRSAgICAoTElSQ19DQU5fU0VUX1NFTkRfRFVUWV9DWUNMRSA8PCAxNikKKworI2RlZmluZSBMSVJDX0NBTl9TRVRfUkVDX0RVVFlfQ1lDTEVfUkFOR0UgMHg0MDAwMDAwMAorI2RlZmluZSBMSVJDX0NBTl9TRVRfUkVDX0NBUlJJRVJfUkFOR0UgICAgMHg4MDAwMDAwMAorI2RlZmluZSBMSVJDX0NBTl9HRVRfUkVDX1JFU09MVVRJT04gICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBMSVJDX0NBTl9TRVRfUkVDX1RJTUVPVVQgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBMSVJDX0NBTl9TRVRfUkVDX0ZJTFRFUiAgICAgICAgICAgMHgwODAwMDAwMAorCisjZGVmaW5lIExJUkNfQ0FOX01FQVNVUkVfQ0FSUklFUiAgICAgICAgICAweDAyMDAwMDAwCisKKyNkZWZpbmUgTElSQ19DQU5fU0VORCh4KSAoKHgpJkxJUkNfQ0FOX1NFTkRfTUFTSykKKyNkZWZpbmUgTElSQ19DQU5fUkVDKHgpICgoeCkmTElSQ19DQU5fUkVDX01BU0spCisKKyNkZWZpbmUgTElSQ19DQU5fTk9USUZZX0RFQ09ERSAgICAgICAgICAgIDB4MDEwMDAwMDAKKworLyoqKiBJT0NUTCBjb21tYW5kcyBmb3IgbGlyYyBkcml2ZXIgKioqLworCisjZGVmaW5lIExJUkNfR0VUX0ZFQVRVUkVTICAgICAgICAgICAgICBfSU9SKCdpJywgMHgwMDAwMDAwMCwgX191MzIpCisKKyNkZWZpbmUgTElSQ19HRVRfU0VORF9NT0RFICAgICAgICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDAxLCBfX3UzMikKKyNkZWZpbmUgTElSQ19HRVRfUkVDX01PREUgICAgICAgICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDAyLCBfX3UzMikKKyNkZWZpbmUgTElSQ19HRVRfU0VORF9DQVJSSUVSICAgICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDAzLCBfX3UzMikKKyNkZWZpbmUgTElSQ19HRVRfUkVDX0NBUlJJRVIgICAgICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDA0LCBfX3UzMikKKyNkZWZpbmUgTElSQ19HRVRfU0VORF9EVVRZX0NZQ0xFICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDA1LCBfX3UzMikKKyNkZWZpbmUgTElSQ19HRVRfUkVDX0RVVFlfQ1lDTEUgICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDA2LCBfX3UzMikKKyNkZWZpbmUgTElSQ19HRVRfUkVDX1JFU09MVVRJT04gICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDA3LCBfX3UzMikKKworI2RlZmluZSBMSVJDX0dFVF9NSU5fVElNRU9VVCAgICAgICAgICAgX0lPUignaScsIDB4MDAwMDAwMDgsIF9fdTMyKQorI2RlZmluZSBMSVJDX0dFVF9NQVhfVElNRU9VVCAgICAgICAgICAgX0lPUignaScsIDB4MDAwMDAwMDksIF9fdTMyKQorCisjZGVmaW5lIExJUkNfR0VUX01JTl9GSUxURVJfUFVMU0UgICAgICBfSU9SKCdpJywgMHgwMDAwMDAwYSwgX191MzIpCisjZGVmaW5lIExJUkNfR0VUX01BWF9GSUxURVJfUFVMU0UgICAgICBfSU9SKCdpJywgMHgwMDAwMDAwYiwgX191MzIpCisjZGVmaW5lIExJUkNfR0VUX01JTl9GSUxURVJfU1BBQ0UgICAgICBfSU9SKCdpJywgMHgwMDAwMDAwYywgX191MzIpCisjZGVmaW5lIExJUkNfR0VUX01BWF9GSUxURVJfU1BBQ0UgICAgICBfSU9SKCdpJywgMHgwMDAwMDAwZCwgX191MzIpCisKKy8qIGNvZGUgbGVuZ3RoIGluIGJpdHMsIGN1cnJlbnRseSBvbmx5IGZvciBMSVJDX01PREVfTElSQ0NPREUgKi8KKyNkZWZpbmUgTElSQ19HRVRfTEVOR1RIICAgICAgICAgICAgICAgIF9JT1IoJ2knLCAweDAwMDAwMDBmLCBfX3UzMikKKworI2RlZmluZSBMSVJDX1NFVF9TRU5EX01PREUgICAgICAgICAgICAgX0lPVygnaScsIDB4MDAwMDAwMTEsIF9fdTMyKQorI2RlZmluZSBMSVJDX1NFVF9SRUNfTU9ERSAgICAgICAgICAgICAgX0lPVygnaScsIDB4MDAwMDAwMTIsIF9fdTMyKQorLyogTm90ZTogdGhlc2UgY2FuIHJlc2V0IHRoZSBhY2NvcmRpbmcgcHVsc2Vfd2lkdGggKi8KKyNkZWZpbmUgTElSQ19TRVRfU0VORF9DQVJSSUVSICAgICAgICAgIF9JT1coJ2knLCAweDAwMDAwMDEzLCBfX3UzMikKKyNkZWZpbmUgTElSQ19TRVRfUkVDX0NBUlJJRVIgICAgICAgICAgIF9JT1coJ2knLCAweDAwMDAwMDE0LCBfX3UzMikKKyNkZWZpbmUgTElSQ19TRVRfU0VORF9EVVRZX0NZQ0xFICAgICAgIF9JT1coJ2knLCAweDAwMDAwMDE1LCBfX3UzMikKKyNkZWZpbmUgTElSQ19TRVRfUkVDX0RVVFlfQ1lDTEUgICAgICAgIF9JT1coJ2knLCAweDAwMDAwMDE2LCBfX3UzMikKKyNkZWZpbmUgTElSQ19TRVRfVFJBTlNNSVRURVJfTUFTSyAgICAgIF9JT1coJ2knLCAweDAwMDAwMDE3LCBfX3UzMikKKworLyoKKyAqIHdoZW4gYSB0aW1lb3V0ICE9IDAgaXMgc2V0IHRoZSBkcml2ZXIgd2lsbCBzZW5kIGEKKyAqIExJUkNfTU9ERTJfVElNRU9VVCBkYXRhIHBhY2tldCwgb3RoZXJ3aXNlIExJUkNfTU9ERTJfVElNRU9VVCBpcworICogbmV2ZXIgc2VudCwgdGltZW91dCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgKi8KKyNkZWZpbmUgTElSQ19TRVRfUkVDX1RJTUVPVVQgICAgICAgICAgIF9JT1coJ2knLCAweDAwMDAwMDE4LCBfX3UzMikKKworLyogMSBlbmFibGVzLCAwIGRpc2FibGVzIHRpbWVvdXQgcmVwb3J0cyBpbiBNT0RFMiAqLworI2RlZmluZSBMSVJDX1NFVF9SRUNfVElNRU9VVF9SRVBPUlRTICAgX0lPVygnaScsIDB4MDAwMDAwMTksIF9fdTMyKQorCisvKgorICogcHVsc2VzIHNob3J0ZXIgdGhhbiB0aGlzIGFyZSBmaWx0ZXJlZCBvdXQgYnkgaGFyZHdhcmUgKHNvZnR3YXJlCisgKiBlbXVsYXRpb24gaW4gbGlyY19kZXY/KQorICovCisjZGVmaW5lIExJUkNfU0VUX1JFQ19GSUxURVJfUFVMU0UgICAgICBfSU9XKCdpJywgMHgwMDAwMDAxYSwgX191MzIpCisvKgorICogc3BhY2VzIHNob3J0ZXIgdGhhbiB0aGlzIGFyZSBmaWx0ZXJlZCBvdXQgYnkgaGFyZHdhcmUgKHNvZnR3YXJlCisgKiBlbXVsYXRpb24gaW4gbGlyY19kZXY/KQorICovCisjZGVmaW5lIExJUkNfU0VUX1JFQ19GSUxURVJfU1BBQ0UgICAgICBfSU9XKCdpJywgMHgwMDAwMDAxYiwgX191MzIpCisvKgorICogaWYgZmlsdGVyIGNhbm5vdCBiZSBzZXQgaW5kZXBlbmRhbnRseSBmb3IgcHVsc2Uvc3BhY2UsIHRoaXMgc2hvdWxkCisgKiBiZSB1c2VkCisgKi8KKyNkZWZpbmUgTElSQ19TRVRfUkVDX0ZJTFRFUiAgICAgICAgICAgIF9JT1coJ2knLCAweDAwMDAwMDFjLCBfX3UzMikKKworLyoKKyAqIGlmIGVuYWJsZWQgZnJvbSB0aGUgbmV4dCBrZXkgcHJlc3Mgb24gdGhlIGRyaXZlciB3aWxsIHNlbmQKKyAqIExJUkNfTU9ERTJfRlJFUVVFTkNZIHBhY2tldHMKKyAqLworI2RlZmluZSBMSVJDX1NFVF9NRUFTVVJFX0NBUlJJRVJfTU9ERSAgX0lPVygnaScsIDB4MDAwMDAwMWQsIF9fdTMyKQorCisvKgorICogdG8gc2V0IGEgcmFuZ2UgdXNlCisgKiBMSVJDX1NFVF9SRUNfRFVUWV9DWUNMRV9SQU5HRS9MSVJDX1NFVF9SRUNfQ0FSUklFUl9SQU5HRSB3aXRoIHRoZQorICogbG93ZXIgYm91bmQgZmlyc3QgYW5kIGxhdGVyCisgKiBMSVJDX1NFVF9SRUNfRFVUWV9DWUNMRS9MSVJDX1NFVF9SRUNfQ0FSUklFUiB3aXRoIHRoZSB1cHBlciBib3VuZAorICovCisKKyNkZWZpbmUgTElSQ19TRVRfUkVDX0RVVFlfQ1lDTEVfUkFOR0UgIF9JT1coJ2knLCAweDAwMDAwMDFlLCBfX3UzMikKKyNkZWZpbmUgTElSQ19TRVRfUkVDX0NBUlJJRVJfUkFOR0UgICAgIF9JT1coJ2knLCAweDAwMDAwMDFmLCBfX3UzMikKKworI2RlZmluZSBMSVJDX05PVElGWV9ERUNPREUgICAgICAgICAgICAgX0lPKCdpJywgMHgwMDAwMDAyMCkKKworI2RlZmluZSBMSVJDX1NFVFVQX1NUQVJUICAgICAgICAgICAgICAgX0lPKCdpJywgMHgwMDAwMDAyMSkKKyNkZWZpbmUgTElSQ19TRVRVUF9FTkQgICAgICAgICAgICAgICAgIF9JTygnaScsIDB4MDAwMDAwMjIpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9saXJjX2Rldi5oIGIvaW5jbHVkZS9tZWRpYS9saXJjX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjYwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2xpcmNfZGV2LmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBMSVJDIGJhc2UgZHJpdmVyCisgKgorICogYnkgQXJ0dXIgTGlwb3dza2kgPGFsaXBvd3NraUBpbnRlcmlhLnBsPgorICogICAgICAgIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBHTlUgR1BMCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0xJUkNfREVWX0gKKyNkZWZpbmUgX0xJTlVYX0xJUkNfREVWX0gKKworI2RlZmluZSBNQVhfSVJDVExfREVWSUNFUyA0CisjZGVmaW5lIEJVRkxFTiAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgbW9kKG4sIGRpdikgKChuKSAlIChkaXYpKQorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9saXJjLmg+CisKK3N0cnVjdCBsaXJjX2J1ZmZlciB7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9wb2xsOworCXNwaW5sb2NrX3QgZmlmb19sb2NrOworCXVuc2lnbmVkIGludCBjaHVua19zaXplOworCXVuc2lnbmVkIGludCBzaXplOyAvKiBpbiBjaHVua3MgKi8KKwkvKiBVc2luZyBjaHVua3MgaW5zdGVhZCBvZiBieXRlcyBwcmV0ZW5kcyB0byBzaW1wbGlmeSBib3VuZGFyeSBjaGVja2luZworCSAqIEFuZCBzaG91bGQgYWxsb3cgZm9yIHNvbWUgcGVyZm9ybWFuY2UgZmluZSB0dW5uaW5nIGxhdGVyICovCisJc3RydWN0IGtmaWZvIGZpZm87CisJdTggZmlmb19pbml0aWFsaXplZDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXJjX2J1ZmZlcl9jbGVhcihzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJ1Zi0+Zmlmb19pbml0aWFsaXplZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnVmLT5maWZvX2xvY2ssIGZsYWdzKTsKKwkJa2ZpZm9fcmVzZXQoJmJ1Zi0+Zmlmbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1Zi0+Zmlmb19sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCVdBUk4oMSwgImNhbGxpbmcgJXMgb24gYW4gdW5pbml0aWFsaXplZCBsaXJjX2J1ZmZlclxuIiwKKwkJICAgICBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpcmNfYnVmZmVyX2luaXQoc3RydWN0IGxpcmNfYnVmZmVyICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGludCBjaHVua19zaXplLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYnVmLT53YWl0X3BvbGwpOworCXNwaW5fbG9ja19pbml0KCZidWYtPmZpZm9fbG9jayk7CisJYnVmLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKKwlidWYtPnNpemUgPSBzaXplOworCXJldCA9IGtmaWZvX2FsbG9jKCZidWYtPmZpZm8sIHNpemUgKiBjaHVua19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0ID09IDApCisJCWJ1Zi0+Zmlmb19pbml0aWFsaXplZCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlyY19idWZmZXJfZnJlZShzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwlpZiAoYnVmLT5maWZvX2luaXRpYWxpemVkKSB7CisJCWtmaWZvX2ZyZWUoJmJ1Zi0+Zmlmbyk7CisJCWJ1Zi0+Zmlmb19pbml0aWFsaXplZCA9IDA7CisJfSBlbHNlCisJCVdBUk4oMSwgImNhbGxpbmcgJXMgb24gYW4gdW5pbml0aWFsaXplZCBsaXJjX2J1ZmZlclxuIiwKKwkJICAgICBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpcmNfYnVmZmVyX2xlbihzdHJ1Y3QgbGlyY19idWZmZXIgKmJ1ZikKK3sKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnVmLT5maWZvX2xvY2ssIGZsYWdzKTsKKwlsZW4gPSBrZmlmb19sZW4oJmJ1Zi0+Zmlmbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVmLT5maWZvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpcmNfYnVmZmVyX2Z1bGwoc3RydWN0IGxpcmNfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIGxpcmNfYnVmZmVyX2xlbihidWYpID09IGJ1Zi0+c2l6ZSAqIGJ1Zi0+Y2h1bmtfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlyY19idWZmZXJfZW1wdHkoc3RydWN0IGxpcmNfYnVmZmVyICpidWYpCit7CisJcmV0dXJuICFsaXJjX2J1ZmZlcl9sZW4oYnVmKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlyY19idWZmZXJfYXZhaWxhYmxlKHN0cnVjdCBsaXJjX2J1ZmZlciAqYnVmKQoreworCXJldHVybiBidWYtPnNpemUgLSAobGlyY19idWZmZXJfbGVuKGJ1ZikgLyBidWYtPmNodW5rX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsaXJjX2J1ZmZlcl9yZWFkKHN0cnVjdCBsaXJjX2J1ZmZlciAqYnVmLAorCQkJCQkgICAgdW5zaWduZWQgY2hhciAqZGVzdCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKworCWlmIChsaXJjX2J1ZmZlcl9sZW4oYnVmKSA+PSBidWYtPmNodW5rX3NpemUpCisJCXJldCA9IGtmaWZvX291dF9sb2NrZWQoJmJ1Zi0+ZmlmbywgZGVzdCwgYnVmLT5jaHVua19zaXplLAorCQkJCSAgICAgICAmYnVmLT5maWZvX2xvY2spOworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbGlyY19idWZmZXJfd3JpdGUoc3RydWN0IGxpcmNfYnVmZmVyICpidWYsCisJCQkJCSAgICAgdW5zaWduZWQgY2hhciAqb3JpZykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJcmV0ID0ga2ZpZm9faW5fbG9ja2VkKCZidWYtPmZpZm8sIG9yaWcsIGJ1Zi0+Y2h1bmtfc2l6ZSwKKwkJCSAgICAgICZidWYtPmZpZm9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgbGlyY19kcml2ZXIgeworCWNoYXIgbmFtZVs0MF07CisJaW50IG1pbm9yOworCXVuc2lnbmVkIGxvbmcgY29kZV9sZW5ndGg7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOyAvKiBpbiBjaHVua3MgaG9sZGluZyBvbmUgY29kZSBlYWNoICovCisJaW50IHNhbXBsZV9yYXRlOworCXVuc2lnbmVkIGxvbmcgZmVhdHVyZXM7CisKKwl1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZTsKKworCXZvaWQgKmRhdGE7CisJaW50IG1pbl90aW1lb3V0OworCWludCBtYXhfdGltZW91dDsKKwlpbnQgKCphZGRfdG9fYnVmKSAodm9pZCAqZGF0YSwgc3RydWN0IGxpcmNfYnVmZmVyICpidWYpOworCXN0cnVjdCBsaXJjX2J1ZmZlciAqcmJ1ZjsKKwlpbnQgKCpzZXRfdXNlX2luYykgKHZvaWQgKmRhdGEpOworCXZvaWQgKCpzZXRfdXNlX2RlYykgKHZvaWQgKmRhdGEpOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworLyogbmFtZToKKyAqIHRoaXMgc3RyaW5nIHdpbGwgYmUgdXNlZCBmb3IgbG9ncworICoKKyAqIG1pbm9yOgorICogaW5kaWNhdGVzIG1pbm9yIGRldmljZSAoL2Rldi9saXJjKSBudW1iZXIgZm9yIHJlZ2lzdGVyZWQgZHJpdmVyCisgKiBpZiBjYWxsZXIgZmlsbHMgaXQgd2l0aCBuZWdhdGl2ZSB2YWx1ZSwgdGhlbiB0aGUgZmlyc3QgZnJlZSBtaW5vcgorICogbnVtYmVyIHdpbGwgYmUgdXNlZCAoaWYgYXZhaWxhYmxlKQorICoKKyAqIGNvZGVfbGVuZ3RoOgorICogbGVuZ3RoIG9mIHRoZSByZW1vdGUgY29udHJvbCBrZXkgY29kZSBleHByZXNzZWQgaW4gYml0cworICoKKyAqIHNhbXBsZV9yYXRlOgorICoKKyAqIGRhdGE6CisgKiBpdCBtYXkgcG9pbnQgdG8gYW55IGRyaXZlciBkYXRhIGFuZCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBwYXNzZWQgdG8KKyAqIGFsbCBjYWxsYmFjayBmdW5jdGlvbnMKKyAqCisgKiBhZGRfdG9fYnVmOgorICogYWRkX3RvX2J1ZiB3aWxsIGJlIGNhbGxlZCBhZnRlciBzcGVjaWZpZWQgcGVyaW9kIG9mIHRoZSB0aW1lIG9yCisgKiB0cmlnZ2VyZWQgYnkgdGhlIGV4dGVybmFsIGV2ZW50LCB0aGlzIGJlaGF2aW9yIGRlcGVuZHMgb24gdmFsdWUgb2YKKyAqIHRoZSBzYW1wbGVfcmF0ZSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHVzZXIgY29udGV4dC4gVGhpcworICogcm91dGluZSBzaG91bGQgcmV0dXJuIDAgaWYgZGF0YSB3YXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhbmQKKyAqIC1FTk9EQVRBIGlmIG5vbmUgd2FzIGF2YWlsYWJsZS4gVGhpcyBzaG91bGQgYWRkIHNvbWUgbnVtYmVyIG9mIGJpdHMKKyAqIGV2ZW5seSBkaXZpc2libGUgYnkgY29kZV9sZW5ndGggdG8gdGhlIGJ1ZmZlcgorICoKKyAqIHJidWY6CisgKiBpZiBub3QgTlVMTCwgaXQgd2lsbCBiZSB1c2VkIGFzIGEgcmVhZCBidWZmZXIsIHlvdSB3aWxsIGhhdmUgdG8KKyAqIHdyaXRlIHRvIHRoZSBidWZmZXIgYnkgb3RoZXIgbWVhbnMsIGxpa2UgaXJxJ3MgKHNlZSBhbHNvCisgKiBsaXJjX3NlcmlhbC5jKS4KKyAqCisgKiBzZXRfdXNlX2luYzoKKyAqIHNldF91c2VfaW5jIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGRldmljZSBpcyBvcGVuZWQKKyAqCisgKiBzZXRfdXNlX2RlYzoKKyAqIHNldF91c2VfZGVjIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGRldmljZSBpcyBjbG9zZWQKKyAqCisgKiBmb3BzOgorICogZmlsZV9vcGVyYXRpb25zIGZvciBkcml2ZXJzIHdoaWNoIGRvbid0IGZpdCB0aGUgY3VycmVudCBkcml2ZXIgbW9kZWwuCisgKgorICogU29tZSBpb2N0bCdzIGNhbiBiZSBkaXJlY3RseSBoYW5kbGVkIGJ5IGxpcmNfZGV2IGlmIHRoZSBkcml2ZXIncworICogaW9jdGwgZnVuY3Rpb24gaXMgTlVMTCBvciBpZiBpdCByZXR1cm5zIC1FTk9JT0NUTENNRCAoc2VlIGFsc28KKyAqIGxpcmNfc2VyaWFsLmMpLgorICoKKyAqIG93bmVyOgorICogdGhlIG1vZHVsZSBvd25pbmcgdGhpcyBzdHJ1Y3QKKyAqCisgKi8KKworCisvKiBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgT05MWSBmcm9tIHVzZXIgY29udGV4dAorICoKKyAqIHJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3Igb3IgbWlub3IgbnVtYmVyCisgKiBvZiB0aGUgcmVnaXN0ZXJlZCBkZXZpY2UgaWYgc3VjY2VzcworICogY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZSBwb2ludGVkIGJ5IHAgaXMgY29waWVkCisgKi8KK2V4dGVybiBpbnQgbGlyY19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGxpcmNfZHJpdmVyICpkKTsKKworLyogcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciBvciAwIGlmIHN1Y2Nlc3MKKyovCitleHRlcm4gaW50IGxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIoaW50IG1pbm9yKTsKKworLyogUmV0dXJucyB0aGUgcHJpdmF0ZSBkYXRhIHN0b3JlZCBpbiB0aGUgbGlyY19kcml2ZXIKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGV2aWNlIGZpbGUgcG9pbnRlci4KKyAqLwordm9pZCAqbGlyY19nZXRfcGRhdGEoc3RydWN0IGZpbGUgKmZpbGUpOworCisvKiBkZWZhdWx0IGZpbGUgb3BlcmF0aW9ucworICogdXNlZCBieSBkcml2ZXJzIGlmIHRoZXkgb3ZlcnJpZGUgb25seSBzb21lIG9wZXJhdGlvbnMKKyAqLworaW50IGxpcmNfZGV2X2ZvcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBsaXJjX2Rldl9mb3BfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwordW5zaWduZWQgaW50IGxpcmNfZGV2X2ZvcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK2xvbmcgbGlyY19kZXZfZm9wX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Citzc2l6ZV90IGxpcmNfZGV2X2ZvcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgsCisJCQkgIGxvZmZfdCAqcHBvcyk7Citzc2l6ZV90IGxpcmNfZGV2X2ZvcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAorCQkJICAgbG9mZl90ICpwcG9zKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3JjLW1hcC5oIGIvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaAppbmRleCBjNzhlOTlhLi45NTY5ZDA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKQEAgLTE3LDggKzE3LDEzIEBACiAjZGVmaW5lIElSX1RZUEVfUkM2CSgxICA8PCAyKQkvKiBQaGlsaXBzIFJDNiBwcm90b2NvbCAqLwogI2RlZmluZSBJUl9UWVBFX0pWQwkoMSAgPDwgMykJLyogSlZDIHByb3RvY29sICovCiAjZGVmaW5lIElSX1RZUEVfU09OWQkoMSAgPDwgNCkJLyogU29ueTEyLzE1LzIwIHByb3RvY29sICovCisjZGVmaW5lIElSX1RZUEVfTElSQwkoMSAgPDwgMzApCS8qIFBhc3MgcmF3IElSIHRvIGxpcmMgdXNlcnNwYWNlICovCiAjZGVmaW5lIElSX1RZUEVfT1RIRVIJKDF1IDw8IDMxKQogCisjZGVmaW5lIElSX1RZUEVfQUxMIChJUl9UWVBFX1JDNSB8IElSX1RZUEVfTkVDICB8IElSX1RZUEVfUkM2ICB8IFwKKwkJICAgICBJUl9UWVBFX0pWQyB8IElSX1RZUEVfU09OWSB8IElSX1RZUEVfTElSQyB8IFwKKwkJICAgICBJUl9UWVBFX09USEVSKQorCiBzdHJ1Y3QgaXJfc2NhbmNvZGUgewogCXUzMglzY2FuY29kZTsKIAl1MzIJa2V5Y29kZTsKQEAgLTY0LDYgKzY5LDggQEAKICNkZWZpbmUgUkNfTUFQX0JVREdFVF9DSV9PTEQgICAgICAgICAgICAgInJjLWJ1ZGdldC1jaS1vbGQiCiAjZGVmaW5lIFJDX01BUF9DSU5FUkdZXzE0MDAgICAgICAgICAgICAgICJyYy1jaW5lcmd5LTE0MDAiCiAjZGVmaW5lIFJDX01BUF9DSU5FUkdZICAgICAgICAgICAgICAgICAgICJyYy1jaW5lcmd5IgorI2RlZmluZSBSQ19NQVBfRElCMDcwMF9ORUNfVEFCTEUgICAgICAgICAicmMtZGliMDcwMC1uZWMiCisjZGVmaW5lIFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSAgICAgICAgICJyYy1kaWIwNzAwLXJjNSIKICNkZWZpbmUgUkNfTUFQX0RNMTEwNV9ORUMgICAgICAgICAgICAgICAgInJjLWRtMTEwNS1uZWMiCiAjZGVmaW5lIFJDX01BUF9ETlRWX0xJVkVfRFZCVF9QUk8gICAgICAgICJyYy1kbnR2LWxpdmUtZHZidC1wcm8iCiAjZGVmaW5lIFJDX01BUF9ETlRWX0xJVkVfRFZCX1QgICAgICAgICAgICJyYy1kbnR2LWxpdmUtZHZiLXQiCkBAIC04Nyw2ICs5NCw3IEBACiAjZGVmaW5lIFJDX01BUF9LQUlPTVkgICAgICAgICAgICAgICAgICAgICJyYy1rYWlvbXkiCiAjZGVmaW5lIFJDX01BUF9LV09STERfMzE1VSAgICAgICAgICAgICAgICJyYy1rd29ybGQtMzE1dSIKICNkZWZpbmUgUkNfTUFQX0tXT1JMRF9QTFVTX1RWX0FOQUxPRyAgICAgInJjLWt3b3JsZC1wbHVzLXR2LWFuYWxvZyIKKyNkZWZpbmUgUkNfTUFQX0xJUkMgICAgICAgICAgICAgICAgICAgICAgInJjLWxpcmMiCiAjZGVmaW5lIFJDX01BUF9NQU5MSSAgICAgICAgICAgICAgICAgICAgICJyYy1tYW5saSIKICNkZWZpbmUgUkNfTUFQX01TSV9UVkFOWVdIRVJFX1BMVVMgICAgICAgInJjLW1zaS10dmFueXdoZXJlLXBsdXMiCiAjZGVmaW5lIFJDX01BUF9NU0lfVFZBTllXSEVSRSAgICAgICAgICAgICJyYy1tc2ktdHZhbnl3aGVyZSIKQEAgLTEwNyw2ICsxMTUsNyBAQAogI2RlZmluZSBSQ19NQVBfUFY5NTEgICAgICAgICAgICAgICAgICAgICAicmMtcHY5NTEiCiAjZGVmaW5lIFJDX01BUF9SQzVfSEFVUFBBVUdFX05FVyAgICAgICAgICJyYy1yYzUtaGF1cHBhdWdlLW5ldyIKICNkZWZpbmUgUkNfTUFQX1JDNV9UViAgICAgICAgICAgICAgICAgICAgInJjLXJjNS10diIKKyNkZWZpbmUgUkNfTUFQX1JDNl9NQ0UgICAgICAgICAgICAgICAgICAgInJjLXJjNi1tY2UiCiAjZGVmaW5lIFJDX01BUF9SRUFMX0FVRElPXzIyMF8zMl9LRVlTICAgICJyYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzIgogI2RlZmluZSBSQ19NQVBfVEJTX05FQyAgICAgICAgICAgICAgICAgICAicmMtdGJzLW5lYyIKICNkZWZpbmUgUkNfTUFQX1RFUlJBVEVDX0NJTkVSR1lfWFMgICAgICAgInJjLXRlcnJhdGVjLWNpbmVyZ3kteHMiCkBAIC0xMTYsNiArMTI1LDcgQEAKICNkZWZpbmUgUkNfTUFQX1ZJREVPTUFURV9UVl9QVlIgICAgICAgICAgInJjLXZpZGVvbWF0ZS10di1wdnIiCiAjZGVmaW5lIFJDX01BUF9XSU5GQVNUICAgICAgICAgICAgICAgICAgICJyYy13aW5mYXN0IgogI2RlZmluZSBSQ19NQVBfV0lORkFTVF9VU0JJSV9ERUxVWEUgICAgICAicmMtd2luZmFzdC11c2JpaS1kZWx1eGUiCisKIC8qCiAgKiBQbGVhc2UsIGRvIG5vdCBqdXN0IGFwcGVuZCBuZXdlciBSZW1vdGUgQ29udHJvbGxlciBuYW1lcyBhdCB0aGUgZW5kLgogICogVGhlIG5hbWVzIHNob3VsZCBiZSBvcmRlcmVkIGluIGFscGhhYmV0aWNhbCBvcmRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY2V1LmggYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaAppbmRleCBiNjc3NDc4Li44MDM0NmE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaAorKysgYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaApAQCAtNiw4ICs2LDExIEBACiAjZGVmaW5lIFNIX0NFVV9GTEFHX0hTWU5DX0xPVwkJKDEgPDwgMikgLyogZGVmYXVsdCBIaWdoIGlmIHBvc3NpYmxlICovCiAjZGVmaW5lIFNIX0NFVV9GTEFHX1ZTWU5DX0xPVwkJKDEgPDwgMykgLyogZGVmYXVsdCBIaWdoIGlmIHBvc3NpYmxlICovCiAKK3N0cnVjdCBkZXZpY2U7CisKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2luZm8gewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRldmljZSAqY3NpMl9kZXY7CiB9OwogCiAjZW5kaWYgLyogX19BU01fU0hfTU9CSUxFX0NFVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NzaTIuaCBiL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NzaTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI2MTUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY3NpMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBEcml2ZXIgaGVhZGVyIGZvciB0aGUgU0gtTW9iaWxlIE1JUEkgQ1NJLTIgdW5pdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFNIX01JUElfQ1NJCisjZGVmaW5lIFNIX01JUElfQ1NJCisKK2VudW0gc2hfY3NpMl9waHkgeworCVNIX0NTSTJfUEhZX01BSU4sCisJU0hfQ1NJMl9QSFlfU1VCLAorfTsKKworZW51bSBzaF9jc2kyX3R5cGUgeworCVNIX0NTSTJDLAorCVNIX0NTSTJJLAorfTsKKworI2RlZmluZSBTSF9DU0kyX0NSQwkoMSA8PCAwKQorI2RlZmluZSBTSF9DU0kyX0VDQwkoMSA8PCAxKQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworCitzdHJ1Y3Qgc2hfY3NpMl9jbGllbnRfY29uZmlnIHsKKwllbnVtIHNoX2NzaTJfcGh5IHBoeTsKKwl1bnNpZ25lZCBjaGFyIGxhbmVzOwkJLyogYml0bWFza1szOjBdICovCisJdW5zaWduZWQgY2hhciBjaGFubmVsOwkJLyogMC4uMyAqLworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CS8qIGNsaWVudCBwbGF0Zm9ybSBkZXZpY2UgKi8KK307CisKK3N0cnVjdCBzaF9jc2kyX3BkYXRhIHsKKwllbnVtIHNoX2NzaTJfdHlwZSB0eXBlOworCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3Qgc2hfY3NpMl9jbGllbnRfY29uZmlnICpjbGllbnRzOworCWludCBudW1fY2xpZW50czsKK307CisKK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgdjRsMl9kZXZpY2U7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmggYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaAppbmRleCBiODI4OWMyLi4yY2U5NTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaAorKysgYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaApAQCAtMTIsMTIgKzEyLDE1IEBACiAjaWZuZGVmIFNPQ19DQU1FUkFfSAogI2RlZmluZSBTT0NfQ0FNRVJBX0gKIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1jb3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAorZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBzb2NfY2FtZXJhX2J1c190eXBlOworCiBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmgKaW5kZXggODY1Y2RhNy4uZjBjZjJlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmgKQEAgLTI0LDEwICsyNCwxMCBAQAogICovCiBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgewogCVY0TDJfTUJVU19GTVRfRklYRUQgPSAxLAotCVY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0xFLAotCVY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0xFLAotCVY0TDJfTUJVU19GTVRfWVVZVjhfMlg4X0JFLAotCVY0TDJfTUJVU19GTVRfWVZZVThfMlg4X0JFLAorCVY0TDJfTUJVU19GTVRfWVVZVjhfMlg4LAorCVY0TDJfTUJVU19GTVRfWVZZVThfMlg4LAorCVY0TDJfTUJVU19GTVRfVVlWWThfMlg4LAorCVY0TDJfTUJVU19GTVRfVllVWThfMlg4LAogCVY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9MRSwKIAlWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfQkUsCiAJVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLApAQCAtNDEsNiArNDEsMTEgQEAKIAlWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBREhJX0JFLAogCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8yWDhfUEFETE9fQkUsCiAJVjRMMl9NQlVTX0ZNVF9TR1JCRzhfMVg4LAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMl8xWDEyLAorCVY0TDJfTUJVU19GTVRfWVVZVjhfMV81WDgsCisJVjRMMl9NQlVTX0ZNVF9ZVllVOF8xXzVYOCwKKwlWNEwyX01CVVNfRk1UX1VZVlk4XzFfNVg4LAorCVY0TDJfTUJVU19GTVRfVllVWThfMV81WDgsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtY29yZS5oIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1jb3JlLmgKaW5kZXggZjkxYTczNi4uZjJjNDFjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1jb3JlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1jb3JlLmgKQEAgLTU0LDggKzU0LDYgQEAKIAogc3RydWN0IHZpZGVvYnVmX21hcHBpbmcgewogCXVuc2lnbmVkIGludCBjb3VudDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZW5kOwogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcTsKIH07CiAKQEAgLTEyNyw3ICsxMjUsNyBAQAogc3RydWN0IHZpZGVvYnVmX3F0eXBlX29wcyB7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgbWFnaWM7CiAKLQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICooKmFsbG9jKShzaXplX3Qgc2l6ZSk7CisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqKCphbGxvY192Yikoc2l6ZV90IHNpemUpOwogCXZvaWQgKigqdmFkZHIpCQkoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmKTsKIAlpbnQgKCppb2xvY2spCQkoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAogCQkJCSBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKQEAgLTE3Myw3ICsxNzEsNyBAQAogaW50IHZpZGVvYnVmX2lvbG9jayhzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAogCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmJ1Zik7CiAKLXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZpZGVvYnVmX2FsbG9jKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSk7CitzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2aWRlb2J1Zl9hbGxvY192YihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEpOwogCiAvKiBVc2VkIG9uIHZpZGVvYnVmLWR2YiAqLwogdm9pZCAqdmlkZW9idWZfcXVldWVfdG9fdmFkZHIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1kbWEtc2cuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtZG1hLXNnLmgKaW5kZXggYTE5NWYzYi4uOTdlMDdmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1Zi1kbWEtc2cuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oCkBAIC0yNSwyMyArMjUsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qCi0gKiBSZXR1cm4gYSBzY2F0dGVybGlzdCBmb3Igc29tZSBwYWdlLWFsaWduZWQgdm1hbGxvYygpJ2VkIG1lbW9yeQotICogYmxvY2sgKE5VTEwgb24gZXJyb3JzKS4gIE1lbW9yeSBmb3IgdGhlIHNjYXR0ZXJsaXN0IGlzIGFsbG9jYXRlZAotICogdXNpbmcga21hbGxvYy4gIFRoZSBjYWxsZXIgbXVzdCBmcmVlIHRoZSBtZW1vcnkuCi0gKi8KLXN0cnVjdCBzY2F0dGVybGlzdCAqdmlkZW9idWZfdm1hbGxvY190b19zZyh1bnNpZ25lZCBjaGFyICp2aXJ0LCBpbnQgbnJfcGFnZXMpOwotCi0vKgotICogUmV0dXJuIGEgc2NhdHRlcmxpc3QgZm9yIGEgYW4gYXJyYXkgb2YgdXNlcnBhZ2VzIChOVUxMIG9uIGVycm9ycykuCi0gKiBNZW1vcnkgZm9yIHRoZSBzY2F0dGVybGlzdCBpcyBhbGxvY2F0ZWQgdXNpbmcga21hbGxvYy4gIFRoZSBjYWxsZXIKLSAqIG11c3QgZnJlZSB0aGUgbWVtb3J5LgotICovCi1zdHJ1Y3Qgc2NhdHRlcmxpc3QgKnZpZGVvYnVmX3BhZ2VzX3RvX3NnKHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBucl9wYWdlcywKLQkJCQkJIGludCBvZmZzZXQpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKICAqIEEgc21hbGwgc2V0IG9mIGhlbHBlciBmdW5jdGlvbnMgdG8gbWFuYWdlIGJ1ZmZlcnMgKGJvdGggdXNlcmxhbmQKICAqIGFuZCBrZXJuZWwpIGZvciBETUEuCiAgKgpAQCAtNjgsNyArNTEsNyBAQAogCXN0cnVjdCBwYWdlICAgICAgICAgKipwYWdlczsKIAogCS8qIGZvciBrZXJuZWwgYnVmZmVycyAqLwotCXZvaWQgICAgICAgICAgICAgICAgKnZtYWxsb2M7CisJdm9pZCAgICAgICAgICAgICAgICAqdmFkZHI7CiAKIAkvKiBmb3Igb3ZlcmxheSBidWZmZXJzIChwY2ktcGNpIGRtYSkgKi8KIAlkbWFfYWRkcl90ICAgICAgICAgIGJ1c19hZGRyOwpAQCAtODcsNiArNzAsMTYgQEAKIAlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICBkbWE7CiB9OwogCisvKgorICogU2NhdHRlci1nYXRoZXIgRE1BIGJ1ZmZlciBBUEkuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYSBzaW1wbGUgd2F5IHRvIGNyZWF0ZSBhIHBhZ2UgbGlzdCBhbmQgYQorICogc2NhdHRlci1nYXRoZXIgbGlzdCBmcm9tIGEga2VybmVsLCB1c2Vyc3BhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyBhbmQgbWFwIHRoZQorICogbWVtb3J5IGZvciBETUEgb3BlcmF0aW9uLgorICoKKyAqIERlc3BpdGUgdGhlIG5hbWUsIHRoaXMgaXMgdG90YWxseSB1bnJlbGF0ZWQgdG8gdmlkZW9idWYsIGV4Y2VwdCB0aGF0CisgKiB2aWRlb2J1Zi1kbWEtc2cgdXNlcyB0aGUgc2FtZSBBUEkgaW50ZXJuYWxseS4KKyAqLwogdm9pZCB2aWRlb2J1Zl9kbWFfaW5pdChzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpOwogaW50IHZpZGVvYnVmX2RtYV9pbml0X3VzZXIoc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hLCBpbnQgZGlyZWN0aW9uLAogCQkJICAgdW5zaWduZWQgbG9uZyBkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOwpAQCAtOTYsOCArODksOCBAQAogCQkJICAgICAgZG1hX2FkZHJfdCBhZGRyLCBpbnQgbnJfcGFnZXMpOwogaW50IHZpZGVvYnVmX2RtYV9mcmVlKHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSk7CiAKLWludCB2aWRlb2J1Zl9kbWFfbWFwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hKTsKLWludCB2aWRlb2J1Zl9kbWFfdW5tYXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpOworaW50IHZpZGVvYnVmX2RtYV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEpOworaW50IHZpZGVvYnVmX2RtYV91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSk7CiBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2aWRlb2J1Zl90b19kbWEoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmKTsKIAogdm9pZCAqdmlkZW9idWZfc2dfYWxsb2Moc2l6ZV90IHNpemUpOwpAQCAtMTExLDExICsxMDQsNSBAQAogCQkJIHVuc2lnbmVkIGludCBtc2l6ZSwKIAkJCSB2b2lkICpwcml2KTsKIAotLypGSVhNRTogdGhlc2UgdmFyaWFudHMgYXJlIHVzZWQgb25seSBvbiAqLWFsc2EgY29kZSwgd2hlcmUgdmlkZW9idWYgaXMKLSAqIHVzZWQgd2l0aG91dCBxdWV1ZQotICovCi1pbnQgdmlkZW9idWZfc2dfZG1hX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSk7Ci1pbnQgdmlkZW9idWZfc2dfZG1hX3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hKTsKLQogI2VuZGlmIC8qIF9WSURFT0JVRl9ETUFfU0dfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmLXZtYWxsb2MuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtdm1hbGxvYy5oCmluZGV4IDg1MWViMWEuLmUxOTQwM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYtdm1hbGxvYy5oCkBAIC0yMiw3ICsyMiw3IEBACiBzdHJ1Y3QgdmlkZW9idWZfdm1hbGxvY19tZW1vcnkgewogCXUzMiAgICAgICAgICAgICAgICAgbWFnaWM7CiAKLQl2b2lkICAgICAgICAgICAgICAgICp2bWFsbG9jOworCXZvaWQgICAgICAgICAgICAgICAgKnZhZGRyOwogCiAJLyogcmVtYXBfdm1hbGxvY19yYW5nZSBzZWVtcyB0byBuZWVkIHRvIHJ1bgogCSAqIGFmdGVyIG1tYXAoKSBvbiBzb21lIGNhc2VzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC85cC85cC5oIGIvaW5jbHVkZS9uZXQvOXAvOXAuaAppbmRleCAxNTZjMjZiLi5hOGRlODEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC85cC85cC5oCisrKyBiL2luY2x1ZGUvbmV0LzlwLzlwLmgKQEAgLTg4LDggKzg4LDE2IEBACiAgKiBlbnVtIHA5X21zZ190IC0gOVAgbWVzc2FnZSB0eXBlcwogICogQFA5X1RTVEFURlM6IGZpbGUgc3lzdGVtIHN0YXR1cyByZXF1ZXN0CiAgKiBAUDlfUlNUQVRGUzogZmlsZSBzeXN0ZW0gc3RhdHVzIHJlc3BvbnNlCisgKiBAUDlfVFNZTUxJTks6IG1ha2Ugc3ltbGluayByZXF1ZXN0CisgKiBAUDlfUlNZTUxJTks6IG1ha2Ugc3ltbGluayByZXNwb25zZQorICogQFA5X1RNS05PRDogY3JlYXRlIGEgc3BlY2lhbCBmaWxlIG9iamVjdCByZXF1ZXN0CisgKiBAUDlfUk1LTk9EOiBjcmVhdGUgYSBzcGVjaWFsIGZpbGUgb2JqZWN0IHJlc3BvbnNlCisgKiBAUDlfVExDUkVBVEU6IHByZXBhcmUgYSBoYW5kbGUgZm9yIEkvTyBvbiBhbiBuZXcgZmlsZSBmb3IgOVAyMDAwLkwKKyAqIEBQOV9STENSRUFURTogcmVzcG9uc2Ugd2l0aCBmaWxlIGFjY2VzcyBpbmZvcm1hdGlvbiBmb3IgOVAyMDAwLkwKICAqIEBQOV9UUkVOQU1FOiByZW5hbWUgcmVxdWVzdAogICogQFA5X1JSRU5BTUU6IHJlbmFtZSByZXNwb25zZQorICogQFA5X1RNS0RJUjogY3JlYXRlIGEgZGlyZWN0b3J5IHJlcXVlc3QKKyAqIEBQOV9STUtESVI6IGNyZWF0ZSBhIGRpcmVjdG9yeSByZXNwb25zZQogICogQFA5X1RWRVJTSU9OOiB2ZXJzaW9uIGhhbmRzaGFrZSByZXF1ZXN0CiAgKiBAUDlfUlZFUlNJT046IHZlcnNpb24gaGFuZHNoYWtlIHJlc3BvbnNlCiAgKiBAUDlfVEFVVEg6IHJlcXVlc3QgdG8gZXN0YWJsaXNoIGF1dGhlbnRpY2F0aW9uIGNoYW5uZWwKQEAgLTEzMSw4ICsxMzksMzAgQEAKIGVudW0gcDlfbXNnX3QgewogCVA5X1RTVEFURlMgPSA4LAogCVA5X1JTVEFURlMsCisJUDlfVExPUEVOID0gMTIsCisJUDlfUkxPUEVOLAorCVA5X1RMQ1JFQVRFID0gMTQsCisJUDlfUkxDUkVBVEUsCisJUDlfVFNZTUxJTksgPSAxNiwKKwlQOV9SU1lNTElOSywKKwlQOV9UTUtOT0QgPSAxOCwKKwlQOV9STUtOT0QsCiAJUDlfVFJFTkFNRSA9IDIwLAogCVA5X1JSRU5BTUUsCisJUDlfVEdFVEFUVFIgPSAyNCwKKwlQOV9SR0VUQVRUUiwKKwlQOV9UU0VUQVRUUiA9IDI2LAorCVA5X1JTRVRBVFRSLAorCVA5X1RYQVRUUldBTEsgPSAzMCwKKwlQOV9SWEFUVFJXQUxLLAorCVA5X1RYQVRUUkNSRUFURSA9IDMyLAorCVA5X1JYQVRUUkNSRUFURSwKKwlQOV9UUkVBRERJUiA9IDQwLAorCVA5X1JSRUFERElSLAorCVA5X1RMSU5LID0gNzAsCisJUDlfUkxJTkssCisJUDlfVE1LRElSID0gNzIsCisJUDlfUk1LRElSLAogCVA5X1RWRVJTSU9OID0gMTAwLAogCVA5X1JWRVJTSU9OLAogCVA5X1RBVVRIID0gMTAyLApAQCAtMjc1LDYgKzMwNSw5IEBACiAvKiBhbXBsZSByb29tIGZvciBUd3JpdGUvUnJlYWQgaGVhZGVyICovCiAjZGVmaW5lIFA5X0lPSERSU1oJMjQKIAorLyogUm9vbSBmb3IgcmVhZGRpciBoZWFkZXIgKi8KKyNkZWZpbmUgUDlfUkVBRERJUkhEUlNaCTI0CisKIC8qKgogICogc3RydWN0IHA5X3N0ciAtIGxlbmd0aCBwcmVmaXhlZCBzdHJpbmcgdHlwZQogICogQGxlbjogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKQEAgLTM1Nyw2ICszOTAsNzQgQEAKIAl1MzIgbl9tdWlkOwkJLyogOXAyMDAwLnUgZXh0ZW5zaW9ucyAqLwogfTsKIAorc3RydWN0IHA5X3N0YXRfZG90bCB7CisJdTY0IHN0X3Jlc3VsdF9tYXNrOworCXN0cnVjdCBwOV9xaWQgcWlkOworCXUzMiBzdF9tb2RlOworCXUzMiBzdF91aWQ7CisJdTMyIHN0X2dpZDsKKwl1NjQgc3Rfbmxpbms7CisJdTY0IHN0X3JkZXY7CisJdTY0IHN0X3NpemU7CisJdTY0IHN0X2Jsa3NpemU7CisJdTY0IHN0X2Jsb2NrczsKKwl1NjQgc3RfYXRpbWVfc2VjOworCXU2NCBzdF9hdGltZV9uc2VjOworCXU2NCBzdF9tdGltZV9zZWM7CisJdTY0IHN0X210aW1lX25zZWM7CisJdTY0IHN0X2N0aW1lX3NlYzsKKwl1NjQgc3RfY3RpbWVfbnNlYzsKKwl1NjQgc3RfYnRpbWVfc2VjOworCXU2NCBzdF9idGltZV9uc2VjOworCXU2NCBzdF9nZW47CisJdTY0IHN0X2RhdGFfdmVyc2lvbjsKK307CisKKyNkZWZpbmUgUDlfU1RBVFNfTU9ERQkJMHgwMDAwMDAwMVVMTAorI2RlZmluZSBQOV9TVEFUU19OTElOSwkJMHgwMDAwMDAwMlVMTAorI2RlZmluZSBQOV9TVEFUU19VSUQJCTB4MDAwMDAwMDRVTEwKKyNkZWZpbmUgUDlfU1RBVFNfR0lECQkweDAwMDAwMDA4VUxMCisjZGVmaW5lIFA5X1NUQVRTX1JERVYJCTB4MDAwMDAwMTBVTEwKKyNkZWZpbmUgUDlfU1RBVFNfQVRJTUUJCTB4MDAwMDAwMjBVTEwKKyNkZWZpbmUgUDlfU1RBVFNfTVRJTUUJCTB4MDAwMDAwNDBVTEwKKyNkZWZpbmUgUDlfU1RBVFNfQ1RJTUUJCTB4MDAwMDAwODBVTEwKKyNkZWZpbmUgUDlfU1RBVFNfSU5PCQkweDAwMDAwMTAwVUxMCisjZGVmaW5lIFA5X1NUQVRTX1NJWkUJCTB4MDAwMDAyMDBVTEwKKyNkZWZpbmUgUDlfU1RBVFNfQkxPQ0tTCQkweDAwMDAwNDAwVUxMCisKKyNkZWZpbmUgUDlfU1RBVFNfQlRJTUUJCTB4MDAwMDA4MDBVTEwKKyNkZWZpbmUgUDlfU1RBVFNfR0VOCQkweDAwMDAxMDAwVUxMCisjZGVmaW5lIFA5X1NUQVRTX0RBVEFfVkVSU0lPTgkweDAwMDAyMDAwVUxMCisKKyNkZWZpbmUgUDlfU1RBVFNfQkFTSUMJCTB4MDAwMDA3ZmZVTEwgLyogTWFzayBmb3IgZmllbGRzIHVwIHRvIEJMT0NLUyAqLworI2RlZmluZSBQOV9TVEFUU19BTEwJCTB4MDAwMDNmZmZVTEwgLyogTWFzayBmb3IgQWxsIGZpZWxkcyBhYm92ZSAqLworCisvKioKKyAqIHN0cnVjdCBwOV9pYXR0cl9kb3RsIC0gUDkgaW5vZGUgYXR0cmlidXRlIGZvciBzZXRhdHRyCisgKiBAdmFsaWQ6IGJpdGZpZWxkIHNwZWNpZnlpbmcgd2hpY2ggZmllbGRzIGFyZSB2YWxpZAorICogICAgICAgICBzYW1lIGFzIGluIHN0cnVjdCBpYXR0cgorICogQG1vZGU6IEZpbGUgcGVybWlzc2lvbiBiaXRzCisgKiBAdWlkOiB1c2VyIGlkIG9mIG93bmVyCisgKiBAZ2lkOiBncm91cCBpZAorICogQHNpemU6IEZpbGUgc2l6ZQorICogQGF0aW1lX3NlYzogTGFzdCBhY2Nlc3MgdGltZSwgc2Vjb25kcworICogQGF0aW1lX25zZWM6IExhc3QgYWNjZXNzIHRpbWUsIG5hbm9zZWNvbmRzCisgKiBAbXRpbWVfc2VjOiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lLCBzZWNvbmRzCisgKiBAbXRpbWVfbnNlYzogTGFzdCBtb2RpZmljYXRpb24gdGltZSwgbmFub3NlY29uZHMKKyAqLworCitzdHJ1Y3QgcDlfaWF0dHJfZG90bCB7CisJdTMyIHZhbGlkOworCXUzMiBtb2RlOworCXUzMiB1aWQ7CisJdTMyIGdpZDsKKwl1NjQgc2l6ZTsKKwl1NjQgYXRpbWVfc2VjOworCXU2NCBhdGltZV9uc2VjOworCXU2NCBtdGltZV9zZWM7CisJdTY0IG10aW1lX25zZWM7Cit9OworCiAvKiBTdHJ1Y3R1cmVzIGZvciBQcm90b2NvbCBPcGVyYXRpb25zICovCiBzdHJ1Y3QgcDlfdHN0YXRmcyB7CiAJdTMyIGZpZDsKQEAgLTQ4NSw2ICs1ODYsMTggQEAKIAl1MzIgY291bnQ7CiB9OwogCitzdHJ1Y3QgcDlfdHJlYWRkaXIgeworCXUzMiBmaWQ7CisJdTY0IG9mZnNldDsKKwl1MzIgY291bnQ7Cit9OworCitzdHJ1Y3QgcDlfcnJlYWRkaXIgeworCXUzMiBjb3VudDsKKwl1OCAqZGF0YTsKK307CisKKwogc3RydWN0IHA5X3RjbHVuayB7CiAJdTMyIGZpZDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC85cC9jbGllbnQuaCBiL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oCmluZGV4IDdkZDNlZDguLmQxYWEyY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oCisrKyBiL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oCkBAIC0xOTUsNiArMTk1LDIxIEBACiAJc3RydWN0IGxpc3RfaGVhZCBkbGlzdDsJLyogbGlzdCBvZiBhbGwgZmlkcyBhdHRhY2hlZCB0byBhIGRlbnRyeSAqLwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgcDlfZGlyZW50IC0gZGlyZWN0b3J5IGVudHJ5IHN0cnVjdHVyZQorICogQHFpZDogVGhlIHA5IHNlcnZlciBxaWQgZm9yIHRoaXMgZGlyZW50CisgKiBAZF9vZmY6IG9mZnNldCB0byB0aGUgbmV4dCBkaXJlbnQKKyAqIEBkX3R5cGU6IHR5cGUgb2YgZmlsZQorICogQGRfbmFtZTogZmlsZSBuYW1lCisgKi8KKworc3RydWN0IHA5X2RpcmVudCB7CisJc3RydWN0IHA5X3FpZCBxaWQ7CisJdTY0IGRfb2ZmOworCXVuc2lnbmVkIGNoYXIgZF90eXBlOworCWNoYXIgZF9uYW1lWzI1Nl07Cit9OworCiBpbnQgcDlfY2xpZW50X3N0YXRmcyhzdHJ1Y3QgcDlfZmlkICpmaWQsIHN0cnVjdCBwOV9yc3RhdGZzICpzYik7CiBpbnQgcDlfY2xpZW50X3JlbmFtZShzdHJ1Y3QgcDlfZmlkICpmaWQsIHN0cnVjdCBwOV9maWQgKm5ld2RpcmZpZCwgY2hhciAqbmFtZSk7CiBpbnQgcDlfY2xpZW50X3ZlcnNpb24oc3RydWN0IHA5X2NsaWVudCAqKTsKQEAgLTIxMSwxNSArMjI2LDMxIEBACiBpbnQgcDlfY2xpZW50X29wZW4oc3RydWN0IHA5X2ZpZCAqZmlkLCBpbnQgbW9kZSk7CiBpbnQgcDlfY2xpZW50X2ZjcmVhdGUoc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpuYW1lLCB1MzIgcGVybSwgaW50IG1vZGUsCiAJCQkJCQkJY2hhciAqZXh0ZW5zaW9uKTsKK2ludCBwOV9jbGllbnRfbGluayhzdHJ1Y3QgcDlfZmlkICpmaWQsIHN0cnVjdCBwOV9maWQgKm9sZGZpZCwgY2hhciAqbmV3bmFtZSk7CitpbnQgcDlfY2xpZW50X3N5bWxpbmsoc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpuYW1lLCBjaGFyICpzeW1uYW1lLCBnaWRfdCBnaWQsCisJCQkJCQkJc3RydWN0IHA5X3FpZCAqcWlkKTsKK2ludCBwOV9jbGllbnRfY3JlYXRlX2RvdGwoc3RydWN0IHA5X2ZpZCAqb2ZpZCwgY2hhciAqbmFtZSwgdTMyIGZsYWdzLCB1MzIgbW9kZSwKKwkJZ2lkX3QgZ2lkLCBzdHJ1Y3QgcDlfcWlkICpxaWQpOwogaW50IHA5X2NsaWVudF9jbHVuayhzdHJ1Y3QgcDlfZmlkICpmaWQpOwogaW50IHA5X2NsaWVudF9yZW1vdmUoc3RydWN0IHA5X2ZpZCAqZmlkKTsKIGludCBwOV9jbGllbnRfcmVhZChzdHJ1Y3QgcDlfZmlkICpmaWQsIGNoYXIgKmRhdGEsIGNoYXIgX191c2VyICp1ZGF0YSwKIAkJCQkJCQl1NjQgb2Zmc2V0LCB1MzIgY291bnQpOwogaW50IHA5X2NsaWVudF93cml0ZShzdHJ1Y3QgcDlfZmlkICpmaWQsIGNoYXIgKmRhdGEsIGNvbnN0IGNoYXIgX191c2VyICp1ZGF0YSwKIAkJCQkJCQl1NjQgb2Zmc2V0LCB1MzIgY291bnQpOworaW50IHA5X2NsaWVudF9yZWFkZGlyKHN0cnVjdCBwOV9maWQgKmZpZCwgY2hhciAqZGF0YSwgdTMyIGNvdW50LCB1NjQgb2Zmc2V0KTsKK2ludCBwOWRpcmVudF9yZWFkKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHA5X2RpcmVudCAqZGlyZW50LAorCQkJCQkJCWludCBwcm90b192ZXJzaW9uKTsKIHN0cnVjdCBwOV93c3RhdCAqcDlfY2xpZW50X3N0YXQoc3RydWN0IHA5X2ZpZCAqZmlkKTsKIGludCBwOV9jbGllbnRfd3N0YXQoc3RydWN0IHA5X2ZpZCAqZmlkLCBzdHJ1Y3QgcDlfd3N0YXQgKndzdCk7CitpbnQgcDlfY2xpZW50X3NldGF0dHIoc3RydWN0IHA5X2ZpZCAqZmlkLCBzdHJ1Y3QgcDlfaWF0dHJfZG90bCAqYXR0cik7CiAKK3N0cnVjdCBwOV9zdGF0X2RvdGwgKnA5X2NsaWVudF9nZXRhdHRyX2RvdGwoc3RydWN0IHA5X2ZpZCAqZmlkLAorCQkJCQkJCXU2NCByZXF1ZXN0X21hc2spOworCitpbnQgcDlfY2xpZW50X21rbm9kX2RvdGwoc3RydWN0IHA5X2ZpZCAqb2xkZmlkLCBjaGFyICpuYW1lLCBpbnQgbW9kZSwKKwkJCWRldl90IHJkZXYsIGdpZF90IGdpZCwgc3RydWN0IHA5X3FpZCAqKTsKK2ludCBwOV9jbGllbnRfbWtkaXJfZG90bChzdHJ1Y3QgcDlfZmlkICpmaWQsIGNoYXIgKm5hbWUsIGludCBtb2RlLAorCQkJCWdpZF90IGdpZCwgc3RydWN0IHA5X3FpZCAqKTsKIHN0cnVjdCBwOV9yZXFfdCAqcDlfdGFnX2xvb2t1cChzdHJ1Y3QgcDlfY2xpZW50ICosIHUxNik7CiB2b2lkIHA5X2NsaWVudF9jYihzdHJ1Y3QgcDlfY2xpZW50ICpjLCBzdHJ1Y3QgcDlfcmVxX3QgKnJlcSk7CiAKQEAgLTIyOSw1ICsyNjAsNyBAQAogCiBpbnQgcDlfaXNfcHJvdG9fZG90dShzdHJ1Y3QgcDlfY2xpZW50ICpjbG50KTsKIGludCBwOV9pc19wcm90b19kb3RsKHN0cnVjdCBwOV9jbGllbnQgKmNsbnQpOworc3RydWN0IHA5X2ZpZCAqcDlfY2xpZW50X3hhdHRyd2FsayhzdHJ1Y3QgcDlfZmlkICosIGNvbnN0IGNoYXIgKiwgdTY0ICopOworaW50IHA5X2NsaWVudF94YXR0cmNyZWF0ZShzdHJ1Y3QgcDlfZmlkICosIGNvbnN0IGNoYXIgKiwgdTY0LCBpbnQpOwogCiAjZW5kaWYgLyogTkVUXzlQX0NMSUVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hY3RfYXBpLmggYi9pbmNsdWRlL25ldC9hY3RfYXBpLmgKaW5kZXggYzA1ZmQ3MS4uYmFiMzg1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYWN0X2FwaS5oCisrKyBiL2luY2x1ZGUvbmV0L2FjdF9hcGkuaApAQCAtMjAsNiArMjAsNyBAQAogCXN0cnVjdCBnbmV0X3N0YXRzX3F1ZXVlCQl0Y2ZjX3FzdGF0czsKIAlzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdAl0Y2ZjX3JhdGVfZXN0OwogCXNwaW5sb2NrX3QJCQl0Y2ZjX2xvY2s7CisJc3RydWN0IHJjdV9oZWFkCQkJdGNmY19yY3U7CiB9OwogI2RlZmluZSB0Y2ZfbmV4dAljb21tb24udGNmY19uZXh0CiAjZGVmaW5lIHRjZl9pbmRleAljb21tb24udGNmY19pbmRleApAQCAtMzIsNiArMzMsNyBAQAogI2RlZmluZSB0Y2ZfcXN0YXRzCWNvbW1vbi50Y2ZjX3FzdGF0cwogI2RlZmluZSB0Y2ZfcmF0ZV9lc3QJY29tbW9uLnRjZmNfcmF0ZV9lc3QKICNkZWZpbmUgdGNmX2xvY2sJY29tbW9uLnRjZmNfbG9jaworI2RlZmluZSB0Y2ZfcmN1CQljb21tb24udGNmY19yY3UKIAogc3RydWN0IHRjZl9wb2xpY2UgewogCXN0cnVjdCB0Y2ZfY29tbW9uCWNvbW1vbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FmX3VuaXguaCBiL2luY2x1ZGUvbmV0L2FmX3VuaXguaAppbmRleCAyMDcyNWUyLi45MGM5ZTI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZl91bml4LmgKKysrIGIvaW5jbHVkZS9uZXQvYWZfdW5peC5oCkBAIC0yMyw3ICsyMyw4IEBACiB9OwogCiBzdHJ1Y3QgdW5peF9za2JfcGFybXMgewotCXN0cnVjdCB1Y3JlZAkJY3JlZHM7CQkvKiBTa2IgY3JlZGVudGlhbHMJKi8KKwlzdHJ1Y3QgcGlkCQkqcGlkOwkJLyogU2tiIGNyZWRlbnRpYWxzCSovCisJY29uc3Qgc3RydWN0IGNyZWQJKmNyZWQ7CiAJc3RydWN0IHNjbV9mcF9saXN0CSpmcDsJCS8qIFBhc3NlZCBmaWxlcwkJKi8KICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSwogCXUzMgkJCXNlY2lkOwkJLyogU2VjdXJpdHkgSUQJCSovCkBAIC0zMSw3ICszMiw2IEBACiB9OwogCiAjZGVmaW5lIFVOSVhDQihza2IpIAkoKihzdHJ1Y3QgdW5peF9za2JfcGFybXMgKikmKChza2IpLT5jYikpCi0jZGVmaW5lIFVOSVhDUkVEUyhza2IpCSgmVU5JWENCKChza2IpKS5jcmVkcykKICNkZWZpbmUgVU5JWFNJRChza2IpCSgmVU5JWENCKChza2IpKS5zZWNpZCkKIAogI2RlZmluZSB1bml4X3N0YXRlX2xvY2socykJc3Bpbl9sb2NrKCZ1bml4X3NrKHMpLT5sb2NrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCmluZGV4IGZmNzdlOGYuLjI3YTkwMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKQEAgLTg0LDcgKzg0LDcgQEAKIC8qIEJEIEFkZHJlc3MgKi8KIHR5cGVkZWYgc3RydWN0IHsKIAlfX3U4IGJbNl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGJkYWRkcl90OworfSBfX3BhY2tlZCBiZGFkZHJfdDsKIAogI2RlZmluZSBCREFERFJfQU5ZICAgKCYoYmRhZGRyX3QpIHt7MCwgMCwgMCwgMCwgMCwgMH19KQogI2RlZmluZSBCREFERFJfTE9DQUwgKCYoYmRhZGRyX3QpIHt7MCwgMCwgMCwgMHhmZiwgMHhmZiwgMHhmZn19KQpAQCAtMTM4LDYgKzEzOCw3IEBACiBzdHJ1Y3QgYnRfc2tiX2NiIHsKIAlfX3U4IHBrdF90eXBlOwogCV9fdTggaW5jb21pbmc7CisJX191MTYgZXhwZWN0OwogCV9fdTggdHhfc2VxOwogCV9fdTggcmV0cmllczsKIAlfX3U4IHNhcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAppbmRleCBmYzBjNTAyLi5iY2JkZDZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCkBAIC0xMDAsNiArMTAwLDkgQEAKICNkZWZpbmUgSENJU0VUQUNMTVRVCV9JT1coJ0gnLCAyMjcsIGludCkKICNkZWZpbmUgSENJU0VUU0NPTVRVCV9JT1coJ0gnLCAyMjgsIGludCkKIAorI2RlZmluZSBIQ0lCTE9DS0FERFIJX0lPVygnSCcsIDIzMCwgaW50KQorI2RlZmluZSBIQ0lVTkJMT0NLQUREUglfSU9XKCdIJywgMjMxLCBpbnQpCisKICNkZWZpbmUgSENJSU5RVUlSWQlfSU9SKCdIJywgMjQwLCBpbnQpCiAKIC8qIEhDSSB0aW1lb3V0cyAqLwpAQCAtMjI3LDcgKzIzMCw3IEBACiAJX191OCAgICAgbGFwWzNdOwogCV9fdTggICAgIGxlbmd0aDsKIAlfX3U4ICAgICBudW1fcnNwOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9JTlFVSVJZX0NBTkNFTAkJMHgwNDAyCiAKQEAgLTI0MSw4MSArMjQ0LDgxIEBACiAJX191OCAgICAgcHNjYW5fbW9kZTsKIAlfX2xlMTYgICBjbG9ja19vZmZzZXQ7CiAJX191OCAgICAgcm9sZV9zd2l0Y2g7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX0RJU0NPTk5FQ1QJCTB4MDQwNgogc3RydWN0IGhjaV9jcF9kaXNjb25uZWN0IHsKIAlfX2xlMTYgICBoYW5kbGU7CiAJX191OCAgICAgcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9BRERfU0NPCQkJMHgwNDA3CiBzdHJ1Y3QgaGNpX2NwX2FkZF9zY28gewogCV9fbGUxNiAgIGhhbmRsZTsKIAlfX2xlMTYgICBwa3RfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfQ1JFQVRFX0NPTk5fQ0FOQ0VMCTB4MDQwOAogc3RydWN0IGhjaV9jcF9jcmVhdGVfY29ubl9jYW5jZWwgewogCWJkYWRkcl90IGJkYWRkcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfQUNDRVBUX0NPTk5fUkVRCQkweDA0MDkKIHN0cnVjdCBoY2lfY3BfYWNjZXB0X2Nvbm5fcmVxIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgcm9sZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfUkVKRUNUX0NPTk5fUkVRCQkweDA0MGEKIHN0cnVjdCBoY2lfY3BfcmVqZWN0X2Nvbm5fcmVxIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9MSU5LX0tFWV9SRVBMWQkJMHgwNDBiCiBzdHJ1Y3QgaGNpX2NwX2xpbmtfa2V5X3JlcGx5IHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgbGlua19rZXlbMTZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9MSU5LX0tFWV9ORUdfUkVQTFkJMHgwNDBjCiBzdHJ1Y3QgaGNpX2NwX2xpbmtfa2V5X25lZ19yZXBseSB7CiAJYmRhZGRyX3QgYmRhZGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9QSU5fQ09ERV9SRVBMWQkJMHgwNDBkCiBzdHJ1Y3QgaGNpX2NwX3Bpbl9jb2RlX3JlcGx5IHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgcGluX2xlbjsKIAlfX3U4ICAgICBwaW5fY29kZVsxNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1BJTl9DT0RFX05FR19SRVBMWQkweDA0MGUKIHN0cnVjdCBoY2lfY3BfcGluX2NvZGVfbmVnX3JlcGx5IHsKIAliZGFkZHJfdCBiZGFkZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX0NIQU5HRV9DT05OX1BUWVBFCTB4MDQwZgogc3RydWN0IGhjaV9jcF9jaGFuZ2VfY29ubl9wdHlwZSB7CiAJX19sZTE2ICAgaGFuZGxlOwogCV9fbGUxNiAgIHBrdF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9BVVRIX1JFUVVFU1RFRAkJMHgwNDExCiBzdHJ1Y3QgaGNpX2NwX2F1dGhfcmVxdWVzdGVkIHsKIAlfX2xlMTYgICBoYW5kbGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1NFVF9DT05OX0VOQ1JZUFQJCTB4MDQxMwogc3RydWN0IGhjaV9jcF9zZXRfY29ubl9lbmNyeXB0IHsKIAlfX2xlMTYgICBoYW5kbGU7CiAJX191OCAgICAgZW5jcnlwdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfQ0hBTkdFX0NPTk5fTElOS19LRVkJMHgwNDE1CiBzdHJ1Y3QgaGNpX2NwX2NoYW5nZV9jb25uX2xpbmtfa2V5IHsKIAlfX2xlMTYgICBoYW5kbGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFTU9URV9OQU1FX1JFUQkJMHgwNDE5CiBzdHJ1Y3QgaGNpX2NwX3JlbW90ZV9uYW1lX3JlcSB7CkBAIC0zMjMsMjggKzMyNiwyOCBAQAogCV9fdTggICAgIHBzY2FuX3JlcF9tb2RlOwogCV9fdTggICAgIHBzY2FuX21vZGU7CiAJX19sZTE2ICAgY2xvY2tfb2Zmc2V0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRU1PVEVfTkFNRV9SRVFfQ0FOQ0VMCTB4MDQxYQogc3RydWN0IGhjaV9jcF9yZW1vdGVfbmFtZV9yZXFfY2FuY2VsIHsKIAliZGFkZHJfdCBiZGFkZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfUkVNT1RFX0ZFQVRVUkVTCTB4MDQxYgogc3RydWN0IGhjaV9jcF9yZWFkX3JlbW90ZV9mZWF0dXJlcyB7CiAJX19sZTE2ICAgaGFuZGxlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRUFEX1JFTU9URV9FWFRfRkVBVFVSRVMJMHgwNDFjCiBzdHJ1Y3QgaGNpX2NwX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyB7CiAJX19sZTE2ICAgaGFuZGxlOwogCV9fdTggICAgIHBhZ2U7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfUkVNT1RFX1ZFUlNJT04JMHgwNDFkCiBzdHJ1Y3QgaGNpX2NwX3JlYWRfcmVtb3RlX3ZlcnNpb24gewogCV9fbGUxNiAgIGhhbmRsZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfU0VUVVBfU1lOQ19DT05OCQkweDA0MjgKIHN0cnVjdCBoY2lfY3Bfc2V0dXBfc3luY19jb25uIHsKQEAgLTM1NSw3ICszNTgsNyBAQAogCV9fbGUxNiAgIHZvaWNlX3NldHRpbmc7CiAJX191OCAgICAgcmV0cmFuc19lZmZvcnQ7CiAJX19sZTE2ICAgcGt0X3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX0FDQ0VQVF9TWU5DX0NPTk5fUkVRCTB4MDQyOQogc3RydWN0IGhjaV9jcF9hY2NlcHRfc3luY19jb25uX3JlcSB7CkBAIC0zNjYsMTMgKzM2OSwxMyBAQAogCV9fbGUxNiAgIGNvbnRlbnRfZm9ybWF0OwogCV9fdTggICAgIHJldHJhbnNfZWZmb3J0OwogCV9fbGUxNiAgIHBrdF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRUpFQ1RfU1lOQ19DT05OX1JFUQkweDA0MmEKIHN0cnVjdCBoY2lfY3BfcmVqZWN0X3N5bmNfY29ubl9yZXEgewogCWJkYWRkcl90IGJkYWRkcjsKIAlfX3U4ICAgICByZWFzb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1NOSUZGX01PREUJCTB4MDgwMwogc3RydWN0IGhjaV9jcF9zbmlmZl9tb2RlIHsKQEAgLTM4MSw1OSArMzg0LDU5IEBACiAJX19sZTE2ICAgbWluX2ludGVydmFsOwogCV9fbGUxNiAgIGF0dGVtcHQ7CiAJX19sZTE2ICAgdGltZW91dDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfRVhJVF9TTklGRl9NT0RFCQkweDA4MDQKIHN0cnVjdCBoY2lfY3BfZXhpdF9zbmlmZl9tb2RlIHsKIAlfX2xlMTYgICBoYW5kbGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JPTEVfRElTQ09WRVJZCQkweDA4MDkKIHN0cnVjdCBoY2lfY3Bfcm9sZV9kaXNjb3ZlcnkgewogCV9fbGUxNiAgIGhhbmRsZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIHN0cnVjdCBoY2lfcnBfcm9sZV9kaXNjb3ZlcnkgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBoYW5kbGU7CiAJX191OCAgICAgcm9sZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfU1dJVENIX1JPTEUJCTB4MDgwYgogc3RydWN0IGhjaV9jcF9zd2l0Y2hfcm9sZSB7CiAJYmRhZGRyX3QgYmRhZGRyOwogCV9fdTggICAgIHJvbGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfTElOS19QT0xJQ1kJCTB4MDgwYwogc3RydWN0IGhjaV9jcF9yZWFkX2xpbmtfcG9saWN5IHsKIAlfX2xlMTYgICBoYW5kbGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbGlua19wb2xpY3kgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBoYW5kbGU7CiAJX19sZTE2ICAgcG9saWN5OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9XUklURV9MSU5LX1BPTElDWQkweDA4MGQKIHN0cnVjdCBoY2lfY3Bfd3JpdGVfbGlua19wb2xpY3kgewogCV9fbGUxNiAgIGhhbmRsZTsKIAlfX2xlMTYgICBwb2xpY3k7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiBzdHJ1Y3QgaGNpX3JwX3dyaXRlX2xpbmtfcG9saWN5IHsKIAlfX3U4ICAgICBzdGF0dXM7CiAJX19sZTE2ICAgaGFuZGxlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRUFEX0RFRl9MSU5LX1BPTElDWQkweDA4MGUKIHN0cnVjdCBoY2lfcnBfcmVhZF9kZWZfbGlua19wb2xpY3kgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBwb2xpY3k7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1dSSVRFX0RFRl9MSU5LX1BPTElDWQkweDA4MGYKIHN0cnVjdCBoY2lfY3Bfd3JpdGVfZGVmX2xpbmtfcG9saWN5IHsKIAlfX2xlMTYgICBwb2xpY3k7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1NOSUZGX1NVQlJBVEUJCTB4MDgxMQogc3RydWN0IGhjaV9jcF9zbmlmZl9zdWJyYXRlIHsKQEAgLTQ0MSwxMiArNDQ0LDEyIEBACiAJX19sZTE2ICAgbWF4X2xhdGVuY3k7CiAJX19sZTE2ICAgbWluX3JlbW90ZV90aW1lb3V0OwogCV9fbGUxNiAgIG1pbl9sb2NhbF90aW1lb3V0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9TRVRfRVZFTlRfTUFTSwkJMHgwYzAxCiBzdHJ1Y3QgaGNpX2NwX3NldF9ldmVudF9tYXNrIHsKIAlfX3U4ICAgICBtYXNrWzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRVNFVAkJCTB4MGMwMwogCkBAIC00NTUsNyArNDU4LDcgQEAKIAlfX3U4ICAgICBmbHRfdHlwZTsKIAlfX3U4ICAgICBjb25kX3R5cGU7CiAJX191OCAgICAgY29uZGl0aW9uWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBGaWx0ZXIgdHlwZXMgKi8KICNkZWZpbmUgSENJX0ZMVF9DTEVBUl9BTEwJMHgwMApAQCAtNDc0LDEzICs0NzcsMTMgQEAKICNkZWZpbmUgSENJX09QX1dSSVRFX0xPQ0FMX05BTUUJCTB4MGMxMwogc3RydWN0IGhjaV9jcF93cml0ZV9sb2NhbF9uYW1lIHsKIAlfX3U4ICAgICBuYW1lWzI0OF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfTE9DQUxfTkFNRQkJMHgwYzE0CiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfbmFtZSB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fdTggICAgIG5hbWVbMjQ4XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfV1JJVEVfQ0FfVElNRU9VVAkJMHgwYzE2CiAKQEAgLTUwOCwyMyArNTExLDIzIEBACiBzdHJ1Y3QgaGNpX3JwX3JlYWRfY2xhc3Nfb2ZfZGV2IHsKIAlfX3U4ICAgICBzdGF0dXM7CiAJX191OCAgICAgZGV2X2NsYXNzWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9XUklURV9DTEFTU19PRl9ERVYJMHgwYzI0CiBzdHJ1Y3QgaGNpX2NwX3dyaXRlX2NsYXNzX29mX2RldiB7CiAJX191OCAgICAgZGV2X2NsYXNzWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRUFEX1ZPSUNFX1NFVFRJTkcJMHgwYzI1CiBzdHJ1Y3QgaGNpX3JwX3JlYWRfdm9pY2Vfc2V0dGluZyB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fbGUxNiAgIHZvaWNlX3NldHRpbmc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1dSSVRFX1ZPSUNFX1NFVFRJTkcJMHgwYzI2CiBzdHJ1Y3QgaGNpX2NwX3dyaXRlX3ZvaWNlX3NldHRpbmcgewogCV9fbGUxNiAgIHZvaWNlX3NldHRpbmc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX0hPU1RfQlVGRkVSX1NJWkUJCTB4MGMzMwogc3RydWN0IGhjaV9jcF9ob3N0X2J1ZmZlcl9zaXplIHsKQEAgLTUzMiwxOCArNTM1LDE4IEBACiAJX191OCAgICAgc2NvX210dTsKIAlfX2xlMTYgICBhY2xfbWF4X3BrdDsKIAlfX2xlMTYgICBzY29fbWF4X3BrdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfUkVBRF9TU1BfTU9ERQkJMHgwYzU1CiBzdHJ1Y3QgaGNpX3JwX3JlYWRfc3NwX21vZGUgewogCV9fdTggICAgIHN0YXR1czsKIAlfX3U4ICAgICBtb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9XUklURV9TU1BfTU9ERQkJMHgwYzU2CiBzdHJ1Y3QgaGNpX2NwX3dyaXRlX3NzcF9tb2RlIHsKIAlfX3U4ICAgICBtb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04JMHgxMDAxCiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbiB7CkBAIC01NTMsMTkgKzU1NiwxOSBAQAogCV9fdTggICAgIGxtcF92ZXI7CiAJX19sZTE2ICAgbWFudWZhY3R1cmVyOwogCV9fbGUxNiAgIGxtcF9zdWJ2ZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfTE9DQUxfQ09NTUFORFMJMHgxMDAyCiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfY29tbWFuZHMgewogCV9fdTggICAgIHN0YXR1czsKIAlfX3U4ICAgICBjb21tYW5kc1s2NF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfTE9DQUxfRkVBVFVSRVMJMHgxMDAzCiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfZmVhdHVyZXMgewogCV9fdTggICAgIHN0YXR1czsKIAlfX3U4ICAgICBmZWF0dXJlc1s4XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfUkVBRF9MT0NBTF9FWFRfRkVBVFVSRVMJMHgxMDA0CiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfZXh0X2ZlYXR1cmVzIHsKQEAgLTU3Myw3ICs1NzYsNyBAQAogCV9fdTggICAgIHBhZ2U7CiAJX191OCAgICAgbWF4X3BhZ2U7CiAJX191OCAgICAgZmVhdHVyZXNbOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX09QX1JFQURfQlVGRkVSX1NJWkUJCTB4MTAwNQogc3RydWN0IGhjaV9ycF9yZWFkX2J1ZmZlcl9zaXplIHsKQEAgLTU4MiwxMyArNTg1LDEzIEBACiAJX191OCAgICAgc2NvX210dTsKIAlfX2xlMTYgICBhY2xfbWF4X3BrdDsKIAlfX2xlMTYgICBzY29fbWF4X3BrdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfT1BfUkVBRF9CRF9BRERSCQkweDEwMDkKIHN0cnVjdCBoY2lfcnBfcmVhZF9iZF9hZGRyIHsKIAlfX3U4ICAgICBzdGF0dXM7CiAJYmRhZGRyX3QgYmRhZGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiAtLS0tIEhDSSBFdmVudHMgLS0tLSAqLwogI2RlZmluZSBIQ0lfRVZfSU5RVUlSWV9DT01QTEVURQkJMHgwMQpAQCAtNjAxLDcgKzYwNCw3IEBACiAJX191OCAgICAgcHNjYW5fbW9kZTsKIAlfX3U4ICAgICBkZXZfY2xhc3NbM107CiAJX19sZTE2ICAgY2xvY2tfb2Zmc2V0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9DT05OX0NPTVBMRVRFCQkweDAzCiBzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgewpAQCAtNjEwLDU0ICs2MTMsNTQgQEAKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgbGlua190eXBlOwogCV9fdTggICAgIGVuY3JfbW9kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfQ09OTl9SRVFVRVNUCQkweDA0CiBzdHJ1Y3QgaGNpX2V2X2Nvbm5fcmVxdWVzdCB7CiAJYmRhZGRyX3QgYmRhZGRyOwogCV9fdTggICAgIGRldl9jbGFzc1szXTsKIAlfX3U4ICAgICBsaW5rX3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX0RJU0NPTk5fQ09NUExFVEUJCTB4MDUKIHN0cnVjdCBoY2lfZXZfZGlzY29ubl9jb21wbGV0ZSB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fbGUxNiAgIGhhbmRsZTsKIAlfX3U4ICAgICByZWFzb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX0FVVEhfQ09NUExFVEUJCTB4MDYKIHN0cnVjdCBoY2lfZXZfYXV0aF9jb21wbGV0ZSB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fbGUxNiAgIGhhbmRsZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfUkVNT1RFX05BTUUJCTB4MDcKIHN0cnVjdCBoY2lfZXZfcmVtb3RlX25hbWUgewogCV9fdTggICAgIHN0YXR1czsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgbmFtZVsyNDhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9FTkNSWVBUX0NIQU5HRQkJMHgwOAogc3RydWN0IGhjaV9ldl9lbmNyeXB0X2NoYW5nZSB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fbGUxNiAgIGhhbmRsZTsKIAlfX3U4ICAgICBlbmNyeXB0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9DSEFOR0VfTElOS19LRVlfQ09NUExFVEUJMHgwOQogc3RydWN0IGhjaV9ldl9jaGFuZ2VfbGlua19rZXlfY29tcGxldGUgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBoYW5kbGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX1JFTU9URV9GRUFUVVJFUwkJMHgwYgogc3RydWN0IGhjaV9ldl9yZW1vdGVfZmVhdHVyZXMgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBoYW5kbGU7CiAJX191OCAgICAgZmVhdHVyZXNbOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX1JFTU9URV9WRVJTSU9OCQkweDBjCiBzdHJ1Y3QgaGNpX2V2X3JlbW90ZV92ZXJzaW9uIHsKQEAgLTY2Niw3ICs2NjksNyBAQAogCV9fdTggICAgIGxtcF92ZXI7CiAJX19sZTE2ICAgbWFudWZhY3R1cmVyOwogCV9fbGUxNiAgIGxtcF9zdWJ2ZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX1FPU19TRVRVUF9DT01QTEVURQkweDBkCiBzdHJ1Y3QgaGNpX3FvcyB7CkBAIC02NzUsMzggKzY3OCwzOCBAQAogCV9fdTMyICAgIHBlYWtfYmFuZHdpZHRoOwogCV9fdTMyICAgIGxhdGVuY3k7CiAJX191MzIgICAgZGVsYXlfdmFyaWF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogc3RydWN0IGhjaV9ldl9xb3Nfc2V0dXBfY29tcGxldGUgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBoYW5kbGU7CiAJc3RydWN0ICAgaGNpX3FvcyBxb3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX0NNRF9DT01QTEVURQkJMHgwZQogc3RydWN0IGhjaV9ldl9jbWRfY29tcGxldGUgewogCV9fdTggICAgIG5jbWQ7CiAJX19sZTE2ICAgb3Bjb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9DTURfU1RBVFVTCQkweDBmCiBzdHJ1Y3QgaGNpX2V2X2NtZF9zdGF0dXMgewogCV9fdTggICAgIHN0YXR1czsKIAlfX3U4ICAgICBuY21kOwogCV9fbGUxNiAgIG9wY29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfUk9MRV9DSEFOR0UJCTB4MTIKIHN0cnVjdCBoY2lfZXZfcm9sZV9jaGFuZ2UgewogCV9fdTggICAgIHN0YXR1czsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgcm9sZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfTlVNX0NPTVBfUEtUUwkJMHgxMwogc3RydWN0IGhjaV9ldl9udW1fY29tcF9wa3RzIHsKIAlfX3U4ICAgICBudW1faG5kbDsKIAkvKiB2YXJpYWJsZSBsZW5ndGggcGFydCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9NT0RFX0NIQU5HRQkJMHgxNAogc3RydWN0IGhjaV9ldl9tb2RlX2NoYW5nZSB7CkBAIC03MTQsNDQgKzcxNyw0NCBAQAogCV9fbGUxNiAgIGhhbmRsZTsKIAlfX3U4ICAgICBtb2RlOwogCV9fbGUxNiAgIGludGVydmFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9QSU5fQ09ERV9SRVEJCTB4MTYKIHN0cnVjdCBoY2lfZXZfcGluX2NvZGVfcmVxIHsKIAliZGFkZHJfdCBiZGFkZHI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX0xJTktfS0VZX1JFUQkJMHgxNwogc3RydWN0IGhjaV9ldl9saW5rX2tleV9yZXEgewogCWJkYWRkcl90IGJkYWRkcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfTElOS19LRVlfTk9USUZZCQkweDE4CiBzdHJ1Y3QgaGNpX2V2X2xpbmtfa2V5X25vdGlmeSB7CiAJYmRhZGRyX3QgYmRhZGRyOwogCV9fdTggICAgIGxpbmtfa2V5WzE2XTsKIAlfX3U4ICAgICBrZXlfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfQ0xPQ0tfT0ZGU0VUCQkweDFjCiBzdHJ1Y3QgaGNpX2V2X2Nsb2NrX29mZnNldCB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fbGUxNiAgIGhhbmRsZTsKIAlfX2xlMTYgICBjbG9ja19vZmZzZXQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX1BLVF9UWVBFX0NIQU5HRQkJMHgxZAogc3RydWN0IGhjaV9ldl9wa3RfdHlwZV9jaGFuZ2UgewogCV9fdTggICAgIHN0YXR1czsKIAlfX2xlMTYgICBoYW5kbGU7CiAJX19sZTE2ICAgcGt0X3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX1BTQ0FOX1JFUF9NT0RFCQkweDIwCiBzdHJ1Y3QgaGNpX2V2X3BzY2FuX3JlcF9tb2RlIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgcHNjYW5fcmVwX21vZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX0lOUVVJUllfUkVTVUxUX1dJVEhfUlNTSQkweDIyCiBzdHJ1Y3QgaW5xdWlyeV9pbmZvX3dpdGhfcnNzaSB7CkBAIC03NjEsNyArNzY0LDcgQEAKIAlfX3U4ICAgICBkZXZfY2xhc3NbM107CiAJX19sZTE2ICAgY2xvY2tfb2Zmc2V0OwogCV9fczggICAgIHJzc2k7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiBzdHJ1Y3QgaW5xdWlyeV9pbmZvX3dpdGhfcnNzaV9hbmRfcHNjYW5fbW9kZSB7CiAJYmRhZGRyX3QgYmRhZGRyOwogCV9fdTggICAgIHBzY2FuX3JlcF9tb2RlOwpAQCAtNzcwLDcgKzc3Myw3IEBACiAJX191OCAgICAgZGV2X2NsYXNzWzNdOwogCV9fbGUxNiAgIGNsb2NrX29mZnNldDsKIAlfX3M4ICAgICByc3NpOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9SRU1PVEVfRVhUX0ZFQVRVUkVTCTB4MjMKIHN0cnVjdCBoY2lfZXZfcmVtb3RlX2V4dF9mZWF0dXJlcyB7CkBAIC03NzksNyArNzgyLDcgQEAKIAlfX3U4ICAgICBwYWdlOwogCV9fdTggICAgIG1heF9wYWdlOwogCV9fdTggICAgIGZlYXR1cmVzWzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9TWU5DX0NPTk5fQ09NUExFVEUJMHgyYwogc3RydWN0IGhjaV9ldl9zeW5jX2Nvbm5fY29tcGxldGUgewpAQCAtNzkyLDcgKzc5NSw3IEBACiAJX19sZTE2ICAgcnhfcGt0X2xlbjsKIAlfX2xlMTYgICB0eF9wa3RfbGVuOwogCV9fdTggICAgIGFpcl9tb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9TWU5DX0NPTk5fQ0hBTkdFRAkweDJkCiBzdHJ1Y3QgaGNpX2V2X3N5bmNfY29ubl9jaGFuZ2VkIHsKQEAgLTgwMiw3ICs4MDUsNyBAQAogCV9fdTggICAgIHJldHJhbnNfd2luZG93OwogCV9fbGUxNiAgIHJ4X3BrdF9sZW47CiAJX19sZTE2ICAgdHhfcGt0X2xlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfU05JRkZfU1VCUkFURQkJMHgyZQogc3RydWN0IGhjaV9ldl9zbmlmZl9zdWJyYXRlIHsKQEAgLTgxMiw3ICs4MTUsNyBAQAogCV9fbGUxNiAgIG1heF9yeF9sYXRlbmN5OwogCV9fbGUxNiAgIG1heF9yZW1vdGVfdGltZW91dDsKIAlfX2xlMTYgICBtYXhfbG9jYWxfdGltZW91dDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfRVhURU5ERURfSU5RVUlSWV9SRVNVTFQJMHgyZgogc3RydWN0IGV4dGVuZGVkX2lucXVpcnlfaW5mbyB7CkBAIC04MjMsMzcgKzgyNiwzNyBAQAogCV9fbGUxNiAgIGNsb2NrX29mZnNldDsKIAlfX3M4ICAgICByc3NpOwogCV9fdTggICAgIGRhdGFbMjQwXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIQ0lfRVZfSU9fQ0FQQV9SRVFVRVNUCQkweDMxCiBzdHJ1Y3QgaGNpX2V2X2lvX2NhcGFfcmVxdWVzdCB7CiAJYmRhZGRyX3QgYmRhZGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9TSU1QTEVfUEFJUl9DT01QTEVURQkweDM2CiBzdHJ1Y3QgaGNpX2V2X3NpbXBsZV9wYWlyX2NvbXBsZXRlIHsKIAlfX3U4ICAgICBzdGF0dXM7CiAJYmRhZGRyX3QgYmRhZGRyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9SRU1PVEVfSE9TVF9GRUFUVVJFUwkweDNkCiBzdHJ1Y3QgaGNpX2V2X3JlbW90ZV9ob3N0X2ZlYXR1cmVzIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCAgICAgZmVhdHVyZXNbOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIEludGVybmFsIGV2ZW50cyBnZW5lcmF0ZWQgYnkgQmx1ZXRvb3RoIHN0YWNrICovCiAjZGVmaW5lIEhDSV9FVl9TVEFDS19JTlRFUk5BTAkweGZkCiBzdHJ1Y3QgaGNpX2V2X3N0YWNrX2ludGVybmFsIHsKIAlfX3UxNiAgICB0eXBlOwogCV9fdTggICAgIGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX1NJX0RFVklDRQkweDAxCiBzdHJ1Y3QgaGNpX2V2X3NpX2RldmljZSB7CiAJX191MTYgICAgZXZlbnQ7CiAJX191MTYgICAgZGV2X2lkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9TSV9TRUNVUklUWQkweDAyCiBzdHJ1Y3QgaGNpX2V2X3NpX3NlY3VyaXR5IHsKQEAgLTg2MSw3ICs4NjQsNyBAQAogCV9fdTE2ICAgIHByb3RvOwogCV9fdTE2ICAgIHN1YnByb3RvOwogCV9fdTggICAgIGluY29taW5nOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiAtLS0tIEhDSSBQYWNrZXQgc3RydWN0dXJlcyAtLS0tICovCiAjZGVmaW5lIEhDSV9DT01NQU5EX0hEUl9TSVpFIDMKQEAgLTg3MiwyMiArODc1LDIyIEBACiBzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyIHsKIAlfX2xlMTYJb3Bjb2RlOwkJLyogT0NGICYgT0dGICovCiAJX191OCAJcGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhjaV9ldmVudF9oZHIgewogCV9fdTgJZXZ0OwogCV9fdTgJcGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhjaV9hY2xfaGRyIHsKIAlfX2xlMTYJaGFuZGxlOwkJLyogSGFuZGxlICYgRmxhZ3MoUEIsIEJDKSAqLwogCV9fbGUxNglkbGVuOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaGNpX3Njb19oZHIgewogCV9fbGUxNgloYW5kbGU7CiAJX191OAlkbGVuOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAppbmRleCBlNDJmNmVkLi44YjI4OTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtMSw2ICsxLDYgQEAKLS8qIAorLyoKICAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSwgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KIApAQCAtMTIsMTMgKzEyLDEzIEBACiAgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgogICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQotICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCi0gICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCi0gICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogCi0gICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAotICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTCiAgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgogKi8KIApAQCAtNjIsNiArNjIsMTEgQEAKIAl1bnNpZ25lZCBpbnQgICAgIHNjb19udW07CiB9OwogCitzdHJ1Y3QgYmRhZGRyX2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwliZGFkZHJfdCBiZGFkZHI7Cit9OworI2RlZmluZSBOVU1fUkVBU1NFTUJMWSA0CiBzdHJ1Y3QgaGNpX2RldiB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXNwaW5sb2NrX3QJbG9jazsKQEAgLTExOCw3ICsxMjMsNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQJY21kX3E7CiAKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNlbnRfY21kOwotCXN0cnVjdCBza19idWZmCQkqcmVhc3NlbWJseVszXTsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnJlYXNzZW1ibHlbTlVNX1JFQVNTRU1CTFldOwogCiAJc3RydWN0IG11dGV4CQlyZXFfbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlyZXFfd2FpdF9xOwpAQCAtMTI3LDYgKzEzMiw3IEBACiAKIAlzdHJ1Y3QgaW5xdWlyeV9jYWNoZQlpbnFfY2FjaGU7CiAJc3RydWN0IGhjaV9jb25uX2hhc2gJY29ubl9oYXNoOworCXN0cnVjdCBiZGFkZHJfbGlzdAlibGFja2xpc3Q7CiAKIAlzdHJ1Y3QgaGNpX2Rldl9zdGF0cwlzdGF0OwogCkBAIC0yNTAsNiArMjU2LDcgQEAKIAlIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsCiAJSENJX0NPTk5fUlNXSVRDSF9QRU5ELAogCUhDSV9DT05OX01PREVfQ0hBTkdFX1BFTkQsCisJSENJX0NPTk5fU0NPX1NFVFVQX1BFTkQsCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2Nvbm5faGFzaF9pbml0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQpAQCAtMzMwLDYgKzMzNyw3IEBACiB2b2lkIGhjaV9hY2xfZGlzY29ubihzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcmVhc29uKTsKIHZvaWQgaGNpX2FkZF9zY28oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3UxNiBoYW5kbGUpOwogdm9pZCBoY2lfc2V0dXBfc3luYyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTE2IGhhbmRsZSk7Cit2b2lkIGhjaV9zY29fc2V0dXAoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cyk7CiAKIHN0cnVjdCBoY2lfY29ubiAqaGNpX2Nvbm5fYWRkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCk7CiBpbnQgaGNpX2Nvbm5fZGVsKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CkBAIC0zODAsNyArMzg4LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9kZXZfcHV0KHN0cnVjdCBoY2lfZGV2ICpkKQoteyAKK3sKIAlfX2hjaV9kZXZfcHV0KGQpOwogCW1vZHVsZV9wdXQoZC0+b3duZXIpOwogfQpAQCAtNDI0LDEwICs0MzIsMTQgQEAKIGludCBoY2lfZ2V0X2F1dGhfaW5mbyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCBfX3VzZXIgKmFyZyk7CiBpbnQgaGNpX2lucXVpcnkodm9pZCBfX3VzZXIgKmFyZyk7CiAKK3N0cnVjdCBiZGFkZHJfbGlzdCAqaGNpX2JsYWNrbGlzdF9sb29rdXAoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpOworaW50IGhjaV9ibGFja2xpc3RfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworCiB2b2lkIGhjaV9ldmVudF9wYWNrZXQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogCiBpbnQgaGNpX3JlY3ZfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgaGNpX3JlY3ZfZnJhZ21lbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgY291bnQpOworaW50IGhjaV9yZWN2X3N0cmVhbV9mcmFnbWVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwgaW50IGNvdW50KTsKIAogaW50IGhjaV9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIGhjaV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9sMmNhcC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKaW5kZXggN2M2OTViZi4uNjM2NzI0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKQEAgLTEsNiArMSw4IEBACiAvKiAKICAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAogICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHdXN0YXZvIEYuIFBhZG92YW4gPGd1c3Rhdm9AcGFkb3Zhbi5vcmc+CisgICBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KIAogICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgogCkBAIC0xMjksMzEgKzEzMSwzMSBAQAogc3RydWN0IGwyY2FwX2hkciB7CiAJX19sZTE2ICAgICBsZW47CiAJX19sZTE2ICAgICBjaWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAjZGVmaW5lIEwyQ0FQX0hEUl9TSVpFCQk0CiAKIHN0cnVjdCBsMmNhcF9jbWRfaGRyIHsKIAlfX3U4ICAgICAgIGNvZGU7CiAJX191OCAgICAgICBpZGVudDsKIAlfX2xlMTYgICAgIGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKICNkZWZpbmUgTDJDQVBfQ01EX0hEUl9TSVpFCTQKIAogc3RydWN0IGwyY2FwX2NtZF9yZWogewogCV9fbGUxNiAgICAgcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgewogCV9fbGUxNiAgICAgcHNtOwogCV9fbGUxNiAgICAgc2NpZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGwyY2FwX2Nvbm5fcnNwIHsKIAlfX2xlMTYgICAgIGRjaWQ7CiAJX19sZTE2ICAgICBzY2lkOwogCV9fbGUxNiAgICAgcmVzdWx0OwogCV9fbGUxNiAgICAgc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBjaGFubmVsIGluZGVudGlmaWVyICovCiAjZGVmaW5lIEwyQ0FQX0NJRF9TSUdOQUxJTkcJMHgwMDAxCkBAIC0xNzcsMTQgKzE3OSwxNCBAQAogCV9fbGUxNiAgICAgZGNpZDsKIAlfX2xlMTYgICAgIGZsYWdzOwogCV9fdTggICAgICAgZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGwyY2FwX2NvbmZfcnNwIHsKIAlfX2xlMTYgICAgIHNjaWQ7CiAJX19sZTE2ICAgICBmbGFnczsKIAlfX2xlMTYgICAgIHJlc3VsdDsKIAlfX3U4ICAgICAgIGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTDJDQVBfQ09ORl9TVUNDRVNTCTB4MDAwMAogI2RlZmluZSBMMkNBUF9DT05GX1VOQUNDRVBUCTB4MDAwMQpAQCAtMTk1LDcgKzE5Nyw3IEBACiAJX191OCAgICAgICB0eXBlOwogCV9fdTggICAgICAgbGVuOwogCV9fdTggICAgICAgdmFsWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogI2RlZmluZSBMMkNBUF9DT05GX09QVF9TSVpFCTIKIAogI2RlZmluZSBMMkNBUF9DT05GX0hJTlQJCTB4ODAKQEAgLTIxNiw3ICsyMTgsNyBAQAogCV9fbGUxNiAgICAgcmV0cmFuc190aW1lb3V0OwogCV9fbGUxNiAgICAgbW9uaXRvcl90aW1lb3V0OwogCV9fbGUxNiAgICAgbWF4X3BkdV9zaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEwyQ0FQX01PREVfQkFTSUMJMHgwMAogI2RlZmluZSBMMkNBUF9NT0RFX1JFVFJBTlMJMHgwMQpAQCAtMjI3LDIyICsyMjksMjIgQEAKIHN0cnVjdCBsMmNhcF9kaXNjb25uX3JlcSB7CiAJX19sZTE2ICAgICBkY2lkOwogCV9fbGUxNiAgICAgc2NpZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcnNwIHsKIAlfX2xlMTYgICAgIGRjaWQ7CiAJX19sZTE2ICAgICBzY2lkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbDJjYXBfaW5mb19yZXEgewogCV9fbGUxNiAgICAgIHR5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBsMmNhcF9pbmZvX3JzcCB7CiAJX19sZTE2ICAgICAgdHlwZTsKIAlfX2xlMTYgICAgICByZXN1bHQ7CiAJX191OCAgICAgICAgZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogaW5mbyB0eXBlICovCiAjZGVmaW5lIEwyQ0FQX0lUX0NMX01UVSAgICAgMHgwMDAxCkBAIC0yODcsNiArMjg5LDExIEBACiAJc3RydWN0IGwyY2FwX2NoYW5fbGlzdCBjaGFuX2xpc3Q7CiB9OwogCitzdHJ1Y3Qgc29ja19kZWxfbGlzdCB7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKICNkZWZpbmUgTDJDQVBfSU5GT19DTF9NVFVfUkVRX1NFTlQJMHgwMQogI2RlZmluZSBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfU0VOVAkweDA0CiAjZGVmaW5lIEwyQ0FQX0lORk9fRkVBVF9NQVNLX1JFUV9ET05FCTB4MDgKQEAgLTM1Myw3ICszNjAsNiBAQAogCiAJX19sZTE2CQlzcG9ydDsKIAotCXNwaW5sb2NrX3QJCXNlbmRfbG9jazsKIAlzdHJ1Y3QgdGltZXJfbGlzdAlyZXRyYW5zX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0CW1vbml0b3JfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJYWNrX3RpbWVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oCmluZGV4IDkyMWQ3YjMuLmExNDA4NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9yZmNvbW0uaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvcmZjb21tLmgKQEAgLTEwNiwxOSArMTA2LDE5IEBACiAJdTggYWRkcjsKIAl1OCBjdHJsOwogCXU4IGxlbjsgICAgLy8gQWN0dWFsIHNpemUgY2FuIGJlIDIgYnl0ZXMKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJmY29tbV9jbWQgewogCXU4IGFkZHI7CiAJdTggY3RybDsKIAl1OCBsZW47CiAJdTggZmNzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcmZjb21tX21jYyB7CiAJdTggdHlwZTsKIAl1OCBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByZmNvbW1fcG4gewogCXU4ICBkbGNpOwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJX19sZTE2IG10dTsKIAl1OCAgbWF4X3JldHJhbnM7CiAJdTggIGNyZWRpdHM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByZmNvbW1fcnBuIHsKIAl1OCAgZGxjaTsKQEAgLTEzOCwxNyArMTM4LDE3IEBACiAJdTggIHhvbl9jaGFyOwogCXU4ICB4b2ZmX2NoYXI7CiAJX19sZTE2IHBhcmFtX21hc2s7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCByZmNvbW1fcmxzIHsKIAl1OCAgZGxjaTsKIAl1OCAgc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcmZjb21tX21zYyB7CiAJdTggIGRsY2k7CiAJdTggIHYyNF9zaWc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIC0tLS0gQ29yZSBzdHJ1Y3R1cmVzLCBmbGFncyBldGMgLS0tLSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jYWlmL2NhaWZfZGV2LmggYi9pbmNsdWRlL25ldC9jYWlmL2NhaWZfZGV2LmgKaW5kZXggMzE4YWI5NC4uNmRhNTczYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2Rldi5oCisrKyBiL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9kZXYuaApAQCAtNTAsNiArNTAsOSBAQAogICogQGNsaWVudF9sYXllcjoJVXNlciBpbXBsZW1lbnRhdGlvbiBvZiBjbGllbnQgbGF5ZXIuIFRoaXMgbGF5ZXIKICAqCQkJTVVTVCBoYXZlIHJlY2VpdmUgYW5kIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb25zCiAgKgkJCWltcGxlbWVudGVkLgorICogQGlmaW5kZXg6CQlMaW5rIGxheWVyIGludGVyZmFjZSBpbmRleCB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgKiBAaGVhZHJvb206CQlIZWFkIHJvb20gbmVlZGVkIGJ5IENBSUYgcHJvdG9jb2wuCisgKiBAdGFpbHJvb206CQlUYWlsIHJvb20gbmVlZGVkIGJ5IENBSUYgcHJvdG9jb2wuCiAgKgogICogVGhpcyBmdW5jdGlvbiBjb25uZWN0cyBhIENBSUYgY2hhbm5lbC4gVGhlIENsaWVudCBtdXN0IGltcGxlbWVudAogICogdGhlIHN0cnVjdCBjZmxheWVyLiBUaGlzIGxheWVyIHJlcHJlc2VudHMgdGhlIENsaWVudCBsYXllciBhbmQgaG9sZHMKQEAgLTU5LDggKzYyLDkgQEAKICAqIEUuZy4gQ0FJRiBTb2NrZXQgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGVhY2ggc29ja2V0IGl0IGNvbm5lY3RzCiAgKiBhbmQgaGF2ZSBvbmUgY2xpZW50X2xheWVyIGluc3RhbmNlIGZvciBlYWNoIHNvY2tldC4KICAqLwotaW50IGNhaWZfY29ubmVjdF9jbGllbnQoc3RydWN0IGNhaWZfY29ubmVjdF9yZXF1ZXN0ICpjb25maWcsCi0JCQkgICBzdHJ1Y3QgY2ZsYXllciAqY2xpZW50X2xheWVyKTsKK2ludCBjYWlmX2Nvbm5lY3RfY2xpZW50KHN0cnVjdCBjYWlmX2Nvbm5lY3RfcmVxdWVzdCAqY29ubl9yZXEsCisJCQlzdHJ1Y3QgY2ZsYXllciAqY2xpZW50X2xheWVyLCBpbnQgKmlmaW5kZXgsCisJCQlpbnQgKmhlYWRyb29tLCBpbnQgKnRhaWxyb29tKTsKIAogLyoqCiAgKiBjYWlmX2Rpc2Nvbm5lY3RfY2xpZW50IC0gRGlzY29ubmVjdHMgYSBjbGllbnQgZnJvbSB0aGUgQ0FJRiBzdGFjay4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9sYXllci5oIGIvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2xheWVyLmgKaW5kZXggMjVjNDcyZi4uYzhiMDdhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2xheWVyLmgKKysrIGIvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2xheWVyLmgKQEAgLTE1LDE0ICsxNSw4IEBACiBzdHJ1Y3QgY2FpZl9wYXlsb2FkX2luZm87CiBzdHJ1Y3QgY2FpZl9wYWNrZXRfZnVuY3M7CiAKLSNkZWZpbmUgQ0FJRl9NQVhfRlJBTUVTSVpFIDQwOTYKLSNkZWZpbmUgQ0FJRl9NQVhfUEFZTE9BRF9TSVpFICg0MDk2IC0gNjQpCi0jZGVmaW5lIENBSUZfTkVFREVEX0hFQURST09NICgxMCkKLSNkZWZpbmUgQ0FJRl9ORUVERURfVEFJTFJPT00gKDIpCiAKICNkZWZpbmUgQ0FJRl9MQVlFUl9OQU1FX1NaIDE2Ci0jZGVmaW5lIENBSUZfU1VDQ0VTUwkxCi0jZGVmaW5lIENBSUZfRkFJTFVSRQkwCiAKIC8qKgogICogY2FpZl9hc3NlcnQoKSAtIEFzc2VydCBmdW5jdGlvbiBmb3IgQ0FJRi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9zcGkuaCBiL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ1NzBkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX3NwaS5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBBQiAyMDEwCisgKiBBdXRob3I6CURhbmllbCBNYXJ0ZW5zc29uIC8gRGFuaWVsLk1hcnRlbnNzb25Ac3Rlcmljc3Nvbi5jb20KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpZm5kZWYgQ0FJRl9TUElfSF8KKyNkZWZpbmUgQ0FJRl9TUElfSF8KKworI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfZGV2aWNlLmg+CisKKyNkZWZpbmUgU1BJX0NNRF9XUgkJCTB4MDAKKyNkZWZpbmUgU1BJX0NNRF9SRAkJCTB4MDEKKyNkZWZpbmUgU1BJX0NNRF9FT1QJCQkweDAyCisjZGVmaW5lIFNQSV9DTURfSU5ECQkJMHgwNAorCisjZGVmaW5lIFNQSV9ETUFfQlVGX0xFTgkJCTgxOTIKKworI2RlZmluZSBXTF9TWgkJCQkyCS8qIDE2IGJpdHMuICovCisjZGVmaW5lIFNQSV9DTURfU1oJCQk0CS8qIDMyIGJpdHMuICovCisjZGVmaW5lIFNQSV9JTkRfU1oJCQk0CS8qIDMyIGJpdHMuICovCisKKyNkZWZpbmUgU1BJX1hGRVIJCQkwCisjZGVmaW5lIFNQSV9TU19PTgkJCTEKKyNkZWZpbmUgU1BJX1NTX09GRgkJCTIKKyNkZWZpbmUgU1BJX1RFUk1JTkFURQkJCTMKKworLyogTWluaW11bSB0aW1lIGJldHdlZW4gZGlmZmVyZW50IGxldmVscyBpcyA1MCBtaWNyb3NlY29uZHMuICovCisjZGVmaW5lIE1JTl9UUkFOU0lUSU9OX1RJTUVfVVNFQwk1MAorCisvKiBEZWZpbmVzIGZvciBjYWxjdWxhdGluZyBkdXJhdGlvbiBvZiBTUEkgdHJhbnNmZXJzIGZvciBhIHBhcnRpY3VsYXIKKyAqIG51bWJlciBvZiBieXRlcy4KKyAqLworI2RlZmluZSBTUElfTUFTVEVSX0NMS19NSFoJCTEzCisjZGVmaW5lIFNQSV9YRkVSX1RJTUVfVVNFQyhieXRlcywgY2xrKSAoKChieXRlcykgKiA4KSAvIGNsaykKKworLyogTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiB0aGUgbW9kZW0gaW4gb3JkZXIgdG8gYmVuZWZpdCBmcm9tIGZ1bGwKKyAqIGR1cGxleCB0cmFuc2ZlcnMuIEhvd2V2ZXIgYSBzaXplIG9mIDgxODggcHJvdm9rZXMgZXJyb3JzIHdoZW4gcnVubmluZyB3aXRoCisgKiB0aGUgbW9kZW0uIFRoZXNlIGVycm9ycyBvY2N1ciB3aGVuIHBhY2tldCBzaXplcyBhcHByb2FjaGVzIDQga0Igb2YgZGF0YS4KKyAqLworI2RlZmluZSBDQUlGX01BWF9TUElfRlJBTUUgNDA5MgorCisvKiBNYXhpbXVtIG51bWJlciBvZiB1cGxpbmsgQ0FJRiBmcmFtZXMgdGhhdCBjYW4gcmVzaWRlIGluIHRoZSBzYW1lIFNQSSBmcmFtZS4KKyAqIFRoaXMgbnVtYmVyIHNob3VsZCBjb3JyZXNwb25kIHdpdGggdGhlIG1vZGVtIHNldHRpbmcuIFRoZSBhcHBsaWNhdGlvbiBzaWRlCisgKiBDQUlGIGFjY2VwdHMgYW55IG51bWJlciBvZiBlbWJlZGRlZCBkb3dubGluayBDQUlGIGZyYW1lcy4KKyAqLworI2RlZmluZSBDQUlGX01BWF9TUElfUEtUUyA5CisKKy8qIERlY2lkZXMgaWYgU1BJIGJ1ZmZlcnMgc2hvdWxkIGJlIHByZWZpbGxlZCB3aXRoIDB4RkYgcGF0dGVybiBmb3IgZWFzaWVyCisgKiBkZWJ1Z2dpbmcuIEJvdGggVFggYW5kIFJYIGJ1ZmZlcnMgd2lsbCBiZSBmaWxsZWQgYmVmb3JlIHRoZSB0cmFuc2Zlci4KKyAqLworI2RlZmluZSBDRlNQSV9EQkdfUFJFRklMTAkJMAorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIFNQSSB0cmFuc2Zlci4gKi8KK3N0cnVjdCBjZnNwaV94ZmVyIHsKKwl1MTYgdHhfZG1hX2xlbjsKKwl1MTYgcnhfZG1hX2xlbjsKKwl2b2lkICp2YV90eDsKKwlkbWFfYWRkcl90IHBhX3R4OworCXZvaWQgKnZhX3J4OworCWRtYV9hZGRyX3QgcGFfcng7Cit9OworCisvKiBTdHJ1Y3R1cmUgaW1wbGVtZW50ZWQgYnkgdGhlIFNQSSBpbnRlcmZhY2UuICovCitzdHJ1Y3QgY2ZzcGlfaWZjIHsKKwl2b2lkICgqc3NfY2IpIChib29sIGFzc2VydCwgc3RydWN0IGNmc3BpX2lmYyAqaWZjKTsKKwl2b2lkICgqeGZlcl9kb25lX2NiKSAoc3RydWN0IGNmc3BpX2lmYyAqaWZjKTsKKwl2b2lkICpwcml2OworfTsKKworLyogU3RydWN0dXJlIGltcGxlbWVudGVkIGJ5IFNQSSBjbGllbnRzLiAqLworc3RydWN0IGNmc3BpX2RldiB7CisJaW50ICgqaW5pdF94ZmVyKSAoc3RydWN0IGNmc3BpX3hmZXIgKnhmZXIsIHN0cnVjdCBjZnNwaV9kZXYgKmRldik7CisJdm9pZCAoKnNpZ194ZmVyKSAoYm9vbCB4ZmVyLCBzdHJ1Y3QgY2ZzcGlfZGV2ICpkZXYpOworCXN0cnVjdCBjZnNwaV9pZmMgKmlmYzsKKwljaGFyICpuYW1lOworCXUzMiBjbGtfbWh6OworCXZvaWQgKnByaXY7Cit9OworCisvKiBFbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBDQUlGIFNQSSBzdGF0ZS4gKi8KK2VudW0gY2ZzcGlfc3RhdGUgeworCUNGU1BJX1NUQVRFX1dBSVRJTkcgPSAwLAorCUNGU1BJX1NUQVRFX0FXQUtFLAorCUNGU1BJX1NUQVRFX0ZFVENIX1BLVCwKKwlDRlNQSV9TVEFURV9HRVRfTkVYVCwKKwlDRlNQSV9TVEFURV9JTklUX1hGRVIsCisJQ0ZTUElfU1RBVEVfV0FJVF9BQ1RJVkUsCisJQ0ZTUElfU1RBVEVfU0lHX0FDVElWRSwKKwlDRlNQSV9TVEFURV9XQUlUX1hGRVJfRE9ORSwKKwlDRlNQSV9TVEFURV9YRkVSX0RPTkUsCisJQ0ZTUElfU1RBVEVfV0FJVF9JTkFDVElWRSwKKwlDRlNQSV9TVEFURV9TSUdfSU5BQ1RJVkUsCisJQ0ZTUElfU1RBVEVfREVMSVZFUl9QS1QsCisJQ0ZTUElfU1RBVEVfTUFYLAorfTsKKworLyogU3RydWN0dXJlIGltcGxlbWVudGVkIGJ5IFNQSSBwaHlzaWNhbCBpbnRlcmZhY2VzLiAqLworc3RydWN0IGNmc3BpIHsKKwlzdHJ1Y3QgY2FpZl9kZXZfY29tbW9uIGNmZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBxaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNoZWFkOworCXUxNiBjbWQ7CisJdTE2IHR4X2NwY2tfbGVuOworCXUxNiB0eF9ucGNrX2xlbjsKKwl1MTYgcnhfY3Bja19sZW47CisJdTE2IHJ4X25wY2tfbGVuOworCXN0cnVjdCBjZnNwaV9pZmMgaWZjOworCXN0cnVjdCBjZnNwaV94ZmVyIHhmZXI7CisJc3RydWN0IGNmc3BpX2RldiAqZGV2OworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgICAgZmxvd19vZmZfc2VudDsKKwl1MzIgcWRfbG93X21hcms7CisJdTMyIHFkX2hpZ2hfbWFyazsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3BpbmxvY2tfdCBsb2NrOworCWJvb2wgZmxvd19zdG9wOworI2lmZGVmIENPTkZJR19ERUJVR19GUworCWVudW0gY2ZzcGlfc3RhdGUgZGJnX3N0YXRlOworCXUxNiBwY21kOworCXUxNiB0eF9wcGNrX2xlbjsKKwl1MTYgcnhfcHBja19sZW47CisJc3RydWN0IGRlbnRyeSAqZGJnZnNfZGlyOworCXN0cnVjdCBkZW50cnkgKmRiZ2ZzX3N0YXRlOworCXN0cnVjdCBkZW50cnkgKmRiZ2ZzX2ZyYW1lOworI2VuZGlmCQkJCS8qIENPTkZJR19ERUJVR19GUyAqLworfTsKKworZXh0ZXJuIGludCBzcGlfZnJtX2FsaWduOworZXh0ZXJuIGludCBzcGlfdXBfaGVhZF9hbGlnbjsKK2V4dGVybiBpbnQgc3BpX3VwX3RhaWxfYWxpZ247CitleHRlcm4gaW50IHNwaV9kb3duX2hlYWRfYWxpZ247CitleHRlcm4gaW50IHNwaV9kb3duX3RhaWxfYWxpZ247CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjZnNwaV9zcGlfZHJpdmVyOworCit2b2lkIGNmc3BpX2RiZ19zdGF0ZShzdHJ1Y3QgY2ZzcGkgKmNmc3BpLCBpbnQgc3RhdGUpOworaW50IGNmc3BpX3htaXRmcm0oc3RydWN0IGNmc3BpICpjZnNwaSwgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQgY2ZzcGlfeG1pdGxlbihzdHJ1Y3QgY2ZzcGkgKmNmc3BpKTsKK2ludCBjZnNwaV9yeGZybShzdHJ1Y3QgY2ZzcGkgKmNmc3BpLCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKK2ludCBjZnNwaV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworaW50IGNmc3BpX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK2ludCBjZnNwaV94bWl0ZnJtKHN0cnVjdCBjZnNwaSAqY2ZzcGksIHU4ICpidWYsIHNpemVfdCBsZW4pOworaW50IGNmc3BpX3htaXRsZW4oc3RydWN0IGNmc3BpICpjZnNwaSk7CitpbnQgY2ZzcGlfcnhmcm0oc3RydWN0IGNmc3BpICpjZnNwaSwgdTggKmJ1Ziwgc2l6ZV90IGxlbik7Cit2b2lkIGNmc3BpX3hmZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworI2VuZGlmCQkJCS8qIENBSUZfU1BJX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jYWlmL2NmY25mZy5oIGIvaW5jbHVkZS9uZXQvY2FpZi9jZmNuZmcuaAppbmRleCA5ZmMyZmMyLi5iZDY0NmZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jYWlmL2NmY25mZy5oCisrKyBiL2luY2x1ZGUvbmV0L2NhaWYvY2ZjbmZnLmgKQEAgLTcsNiArNyw3IEBACiAjaWZuZGVmIENGQ05GR19IXwogI2RlZmluZSBDRkNORkdfSF8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfbGF5ZXIuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jZmN0cmwuaD4KIApAQCAtNzMsOCArNzQsOCBAQAogCiB2b2lkCiBjZmNuZmdfYWRkX3BoeV9sYXllcihzdHJ1Y3QgY2ZjbmZnICpjbmZnLCBlbnVtIGNmY25mZ19waHlfdHlwZSBwaHlfdHlwZSwKLQkJICAgICB2b2lkICpkZXYsIHN0cnVjdCBjZmxheWVyICpwaHlfbGF5ZXIsIHUxNiAqcGh5aWQsCi0JCSAgICAgZW51bSBjZmNuZmdfcGh5X3ByZWZlcmVuY2UgcHJlZiwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2ZsYXllciAqcGh5X2xheWVyLAorCQkgICAgIHUxNiAqcGh5aWQsIGVudW0gY2ZjbmZnX3BoeV9wcmVmZXJlbmNlIHByZWYsCiAJCSAgICAgYm9vbCBmY3MsIGJvb2wgc3R4KTsKIAogLyoqCkBAIC0xMTQsMTEgKzExNSwxOCBAQAogICogQHBhcmFtOgkJTGluayBzZXR1cCBwYXJhbWV0ZXJzLgogICogQGFkYXBfbGF5ZXI6CQlTcGVjaWZ5IHRoZSBhZGFwdGF0aW9uIGxheWVyOyB0aGUgcmVjZWl2ZSBhbmQKICAqCQkJZmxvdy1jb250cm9sIGZ1bmN0aW9ucyBNVVNUIGJlIHNldCBpbiB0aGUgc3RydWN0dXJlLgotICoKKyAqIEBpZmluZGV4OgkJTGluayBsYXllciBpbnRlcmZhY2UgaW5kZXggdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLgorICogQHByb3RvX2hlYWQ6CQlQcm90b2NvbCBoZWFkLXNwYWNlIG5lZWRlZCBieSBDQUlGIHByb3RvY29sLAorICoJCQlleGNsdWRpbmcgbGluayBsYXllci4KKyAqIEBwcm90b190YWlsOgkJUHJvdG9jb2wgdGFpbC1zcGFjZSBuZWVkZWQgYnkgQ0FJRiBwcm90b2NvbCwKKyAqCQkJZXhjbHVkaW5nIGxpbmsgbGF5ZXIuCiAgKi8KIGludCBjZmNuZmdfYWRkX2FkYXB0YXRpb25fbGF5ZXIoc3RydWN0IGNmY25mZyAqY25mZywKIAkJCSAgICBzdHJ1Y3QgY2ZjdHJsX2xpbmtfcGFyYW0gKnBhcmFtLAotCQkJICAgIHN0cnVjdCBjZmxheWVyICphZGFwX2xheWVyKTsKKwkJCSAgICBzdHJ1Y3QgY2ZsYXllciAqYWRhcF9sYXllciwKKwkJCSAgICBpbnQgKmlmaW5kZXgsCisJCQkgICAgaW50ICpwcm90b19oZWFkLAorCQkJICAgIGludCAqcHJvdG9fdGFpbCk7CiAKIC8qKgogICogY2ZjbmZnX2dldF9waHlpZCgpIC0gR2V0IHBoeXNpY2FsIElELCBnaXZlbiB0eXBlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2FpZi9jZnNydmwuaCBiL2luY2x1ZGUvbmV0L2NhaWYvY2ZzcnZsLmgKaW5kZXggMmRjOWViMS4uYjFmYTg3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2FpZi9jZnNydmwuaAorKysgYi9pbmNsdWRlL25ldC9jYWlmL2Nmc3J2bC5oCkBAIC0xNiw2ICsxNiw4IEBACiAJYm9vbCBvcGVuOwogCWJvb2wgcGh5X2Zsb3dfb247CiAJYm9vbCBtb2RlbV9mbG93X29uOworCWJvb2wgc3VwcG9ydHNfZmxvd2N0cmw7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBrcmVmICopOwogCXN0cnVjdCBkZXZfaW5mbyBkZXZfaW5mbzsKIAlzdHJ1Y3Qga3JlZiByZWY7CiB9OwpAQCAtMjUsMTMgKzI3LDE1IEBACiBzdHJ1Y3QgY2ZsYXllciAqY2ZkZ21sX2NyZWF0ZSh1OCBsaW5raWQsIHN0cnVjdCBkZXZfaW5mbyAqZGV2X2luZm8pOwogc3RydWN0IGNmbGF5ZXIgKmNmdXRpbGxfY3JlYXRlKHU4IGxpbmtpZCwgc3RydWN0IGRldl9pbmZvICpkZXZfaW5mbyk7CiBzdHJ1Y3QgY2ZsYXllciAqY2Z2aWRsX2NyZWF0ZSh1OCBsaW5raWQsIHN0cnVjdCBkZXZfaW5mbyAqZGV2X2luZm8pOwotc3RydWN0IGNmbGF5ZXIgKmNmcmZtbF9jcmVhdGUodTggbGlua2lkLCBzdHJ1Y3QgZGV2X2luZm8gKmRldl9pbmZvKTsKK3N0cnVjdCBjZmxheWVyICpjZnJmbWxfY3JlYXRlKHU4IGxpbmtpZCwgc3RydWN0IGRldl9pbmZvICpkZXZfaW5mbywKKwkJCQlpbnQgbXR1X3NpemUpOwogc3RydWN0IGNmbGF5ZXIgKmNmZGJnbF9jcmVhdGUodTggbGlua2lkLCBzdHJ1Y3QgZGV2X2luZm8gKmRldl9pbmZvKTsKIGJvb2wgY2ZzcnZsX3BoeWlkX21hdGNoKHN0cnVjdCBjZmxheWVyICpsYXllciwgaW50IHBoeWlkKTsKIHZvaWQgY2ZzZXJ2bF9kZXN0cm95KHN0cnVjdCBjZmxheWVyICpsYXllcik7CiB2b2lkIGNmc3J2bF9pbml0KHN0cnVjdCBjZnNydmwgKnNlcnZpY2UsCi0JCSB1OCBjaGFubmVsX2lkLAotCQkgc3RydWN0IGRldl9pbmZvICpkZXZfaW5mbyk7CisJCQl1OCBjaGFubmVsX2lkLAorCQkJc3RydWN0IGRldl9pbmZvICpkZXZfaW5mbywKKwkJCWJvb2wgc3VwcG9ydHNfZmxvd2N0cmwpOwogYm9vbCBjZnNydmxfcmVhZHkoc3RydWN0IGNmc3J2bCAqc2VydmljZSwgaW50ICplcnIpOwogdTggY2ZzcnZsX2dldHBoeWlkKHN0cnVjdCBjZmxheWVyICpsYXllcik7CiAKQEAgLTUwLDcgKzU0LDEwIEBACiAJaWYgKGxheXIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXMgPSBjb250YWluZXJfb2YobGF5ciwgc3RydWN0IGNmc3J2bCwgbGF5ZXIpOwotCWtyZWZfcHV0KCZzLT5yZWYsIGNmc3J2bF9yZWxlYXNlKTsKKworCVdBUk5fT04oIXMtPnJlbGVhc2UpOworCWlmIChzLT5yZWxlYXNlKQorCQlrcmVmX3B1dCgmcy0+cmVmLCBzLT5yZWxlYXNlKTsKIH0KIAogI2VuZGlmCQkJCS8qIENGU1JWTF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKaW5kZXggYjQ0YTJlNS4uMmZkMDZjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCkBAIC0zNyw2ICszNyw3IEBACiAgKgogICogQElFRUU4MDIxMV9CQU5EXzJHSFo6IDIuNEdIeiBJU00gYmFuZAogICogQElFRUU4MDIxMV9CQU5EXzVHSFo6IGFyb3VuZCA1R0h6IGJhbmQgKDQuOS01LjcpCisgKiBASUVFRTgwMjExX05VTV9CQU5EUzogbnVtYmVyIG9mIGRlZmluZWQgYmFuZHMKICAqLwogZW51bSBpZWVlODAyMTFfYmFuZCB7CiAJSUVFRTgwMjExX0JBTkRfMkdIWiA9IE5MODAyMTFfQkFORF8yR0haLApAQCAtODksNyArOTAsNyBAQAogICogQG1heF9wb3dlcjogbWF4aW11bSB0cmFuc21pc3Npb24gcG93ZXIgKGluIGRCbSkKICAqIEBiZWFjb25fZm91bmQ6IGhlbHBlciB0byByZWd1bGF0b3J5IGNvZGUgdG8gaW5kaWNhdGUgd2hlbiBhIGJlYWNvbgogICoJaGFzIGJlZW4gZm91bmQgb24gdGhpcyBjaGFubmVsLiBVc2UgcmVndWxhdG9yeV9oaW50X2ZvdW5kX2JlYWNvbigpCi0gKgl0byBlbmFibGUgdGhpcywgdGhpcyBpcyBpcyB1c2VmdWwgb25seSBvbiA1IEdIeiBiYW5kLgorICoJdG8gZW5hYmxlIHRoaXMsIHRoaXMgaXMgdXNlZnVsIG9ubHkgb24gNSBHSHogYmFuZC4KICAqIEBvcmlnX21hZzogaW50ZXJuYWwgdXNlCiAgKiBAb3JpZ19tcHdyOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTg4LDYgKzE4OSw3IEBACiAgKglpbiB0aGlzIGJhbmQuIE11c3QgYmUgc29ydGVkIHRvIGdpdmUgYSB2YWxpZCAic3VwcG9ydGVkCiAgKglyYXRlcyIgSUUsIGkuZS4gQ0NLIHJhdGVzIGZpcnN0LCB0aGVuIE9GRE0uCiAgKiBAbl9iaXRyYXRlczogTnVtYmVyIG9mIGJpdHJhdGVzIGluIEBiaXRyYXRlcworICogQGh0X2NhcDogSFQgY2FwYWJpbGl0aWVzIGluIHRoaXMgYmFuZAogICovCiBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzOwpAQCAtMjI1LDYgKzIyNyw3IEBACiAgKiBAc2VxOiBzZXF1ZW5jZSBjb3VudGVyIChJVi9QTikgZm9yIFRLSVAgYW5kIENDTVAga2V5cywgb25seSB1c2VkCiAgKgl3aXRoIHRoZSBnZXRfa2V5KCkgY2FsbGJhY2ssIG11c3QgYmUgaW4gbGl0dGxlIGVuZGlhbiwKICAqCWxlbmd0aCBnaXZlbiBieSBAc2VxX2xlbi4KKyAqIEBzZXFfbGVuOiBsZW5ndGggb2YgQHNlcS4KICAqLwogc3RydWN0IGtleV9wYXJhbXMgewogCXU4ICprZXk7CkBAIC0yMzcsNiArMjQwLDggQEAKIC8qKgogICogZW51bSBzdXJ2ZXlfaW5mb19mbGFncyAtIHN1cnZleSBpbmZvcm1hdGlvbiBmbGFncwogICoKKyAqIEBTVVJWRVlfSU5GT19OT0lTRV9EQk06IG5vaXNlIChpbiBkQm0pIHdhcyBmaWxsZWQgaW4KKyAqCiAgKiBVc2VkIGJ5IHRoZSBkcml2ZXIgdG8gaW5kaWNhdGUgd2hpY2ggaW5mbyBpbiAmc3RydWN0IHN1cnZleV9pbmZvCiAgKiBpdCBoYXMgZmlsbGVkIGluIGR1cmluZyB0aGUgZ2V0X3N1cnZleSgpLgogICovCkBAIC0yNDcsMTMgKzI1MiwxMyBAQAogLyoqCiAgKiBzdHJ1Y3Qgc3VydmV5X2luZm8gLSBjaGFubmVsIHN1cnZleSByZXNwb25zZQogICoKLSAqIFVzZWQgYnkgZHVtcF9zdXJ2ZXkoKSB0byByZXBvcnQgYmFjayBwZXItY2hhbm5lbCBzdXJ2ZXkgaW5mb3JtYXRpb24uCi0gKgogICogQGNoYW5uZWw6IHRoZSBjaGFubmVsIHRoaXMgc3VydmV5IHJlY29yZCByZXBvcnRzLCBtYW5kYXRvcnkKICAqIEBmaWxsZWQ6IGJpdGZsYWcgb2YgZmxhZ3MgZnJvbSAmZW51bSBzdXJ2ZXlfaW5mb19mbGFncwogICogQG5vaXNlOiBjaGFubmVsIG5vaXNlIGluIGRCbS4gVGhpcyBhbmQgYWxsIGZvbGxvd2luZyBmaWVsZHMgYXJlCiAgKiAgICAgb3B0aW9uYWwKICAqCisgKiBVc2VkIGJ5IGR1bXBfc3VydmV5KCkgdG8gcmVwb3J0IGJhY2sgcGVyLWNoYW5uZWwgc3VydmV5IGluZm9ybWF0aW9uLgorICoKICAqIFRoaXMgc3RydWN0dXJlIGNhbiBsYXRlciBiZSBleHBhbmRlZCB3aXRoIHRoaW5ncyBsaWtlCiAgKiBjaGFubmVsIGR1dHkgY3ljbGUgZXRjLgogICovCkBAIC0yODgsNyArMjkzLDcgQEAKICAqCiAgKiBAUExJTktfQUNUSU9OX0lOVkFMSUQ6IGFjdGlvbiAwIGlzIHJlc2VydmVkCiAgKiBAUExJTktfQUNUSU9OX09QRU46IHN0YXJ0IG1lc2ggcGVlciBsaW5rIGVzdGFibGlzaG1lbnQKLSAqIEBQTElOS19BQ1RJT05fQkxPQ0w6IGJsb2NrIHRyYWZmaWMgZnJvbSB0aGlzIG1lc2ggcGVlcgorICogQFBMSU5LX0FDVElPTl9CTE9DSzogYmxvY2sgdHJhZmZpYyBmcm9tIHRoaXMgbWVzaCBwZWVyCiAgKi8KIGVudW0gcGxpbmtfYWN0aW9ucyB7CiAJUExJTktfQUNUSU9OX0lOVkFMSUQsCkBAIC0zMTEsNiArMzE2LDggQEAKICAqCShiaXRtYXNrIG9mIEJJVChOTDgwMjExX1NUQV9GTEFHXy4uLikpCiAgKiBAbGlzdGVuX2ludGVydmFsOiBsaXN0ZW4gaW50ZXJ2YWwgb3IgLTEgZm9yIG5vIGNoYW5nZQogICogQGFpZDogQUlEIG9yIHplcm8gZm9yIG5vIGNoYW5nZQorICogQHBsaW5rX2FjdGlvbjogcGxpbmsgYWN0aW9uIHRvIHRha2UKKyAqIEBodF9jYXBhOiBIVCBjYXBhYmlsaXRpZXMgb2Ygc3RhdGlvbgogICovCiBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHsKIAl1OCAqc3VwcG9ydGVkX3JhdGVzOwpAQCAtNDQ4LDEzICs0NTUsMTMgQEAKICAqIFVzZWQgYnkgdGhlIGRyaXZlciB0byBpbmRpY2F0ZSB3aGljaCBpbmZvIGluICZzdHJ1Y3QgbXBhdGhfaW5mbyBpdCBoYXMgZmlsbGVkCiAgKiBpbiBkdXJpbmcgZ2V0X3N0YXRpb24oKSBvciBkdW1wX3N0YXRpb24oKS4KICAqCi0gKiBNUEFUSF9JTkZPX0ZSQU1FX1FMRU46IEBmcmFtZV9xbGVuIGZpbGxlZAotICogTVBBVEhfSU5GT19TTjogQHNuIGZpbGxlZAotICogTVBBVEhfSU5GT19NRVRSSUM6IEBtZXRyaWMgZmlsbGVkCi0gKiBNUEFUSF9JTkZPX0VYUFRJTUU6IEBleHB0aW1lIGZpbGxlZAotICogTVBBVEhfSU5GT19ESVNDT1ZFUllfVElNRU9VVDogQGRpc2NvdmVyeV90aW1lb3V0IGZpbGxlZAotICogTVBBVEhfSU5GT19ESVNDT1ZFUllfUkVUUklFUzogQGRpc2NvdmVyeV9yZXRyaWVzIGZpbGxlZAotICogTVBBVEhfSU5GT19GTEFHUzogQGZsYWdzIGZpbGxlZAorICogQE1QQVRIX0lORk9fRlJBTUVfUUxFTjogQGZyYW1lX3FsZW4gZmlsbGVkCisgKiBATVBBVEhfSU5GT19TTjogQHNuIGZpbGxlZAorICogQE1QQVRIX0lORk9fTUVUUklDOiBAbWV0cmljIGZpbGxlZAorICogQE1QQVRIX0lORk9fRVhQVElNRTogQGV4cHRpbWUgZmlsbGVkCisgKiBATVBBVEhfSU5GT19ESVNDT1ZFUllfVElNRU9VVDogQGRpc2NvdmVyeV90aW1lb3V0IGZpbGxlZAorICogQE1QQVRIX0lORk9fRElTQ09WRVJZX1JFVFJJRVM6IEBkaXNjb3ZlcnlfcmV0cmllcyBmaWxsZWQKKyAqIEBNUEFUSF9JTkZPX0ZMQUdTOiBAZmxhZ3MgZmlsbGVkCiAgKi8KIGVudW0gbXBhdGhfaW5mb19mbGFncyB7CiAJTVBBVEhfSU5GT19GUkFNRV9RTEVOCQk9IEJJVCgwKSwKQEAgLTU4Nyw2ICs1OTQsNyBAQAogICogQGllX2xlbjogbGVuZ3RoIG9mIGllIGluIG9jdGV0cwogICogQHdpcGh5OiB0aGUgd2lwaHkgdGhpcyB3YXMgZm9yCiAgKiBAZGV2OiB0aGUgaW50ZXJmYWNlCisgKiBAYWJvcnRlZDogKGludGVybmFsKSBzY2FuIHJlcXVlc3Qgd2FzIG5vdGlmaWVkIGFzIGFib3J0ZWQKICAqLwogc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCB7CiAJc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWRzOwpAQCAtNjIzLDYgKzYzMSw3IEBACiAgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBCU1MgKHdoaWNoIG1heSBhbHNvIGJlIGEgbWVzaCBuZXR3b3JrKQogICogZm9yIHVzZSBpbiBzY2FuIHJlc3VsdHMgYW5kIHNpbWlsYXIuCiAgKgorICogQGNoYW5uZWw6IGNoYW5uZWwgdGhpcyBCU1MgaXMgb24KICAqIEBic3NpZDogQlNTSUQgb2YgdGhlIEJTUwogICogQHRzZjogdGltZXN0YW1wIG9mIGxhc3QgcmVjZWl2ZWQgdXBkYXRlCiAgKiBAYmVhY29uX2ludGVydmFsOiB0aGUgYmVhY29uIGludGVydmFsIGFzIGZyb20gdGhlIGZyYW1lCkBAIC04MDEsNiArODEwLDcgQEAKICAqIEBiZWFjb25faW50ZXJ2YWw6IGJlYWNvbiBpbnRlcnZhbCB0byB1c2UKICAqIEBwcml2YWN5OiB0aGlzIGlzIGEgcHJvdGVjdGVkIG5ldHdvcmssIGtleXMgd2lsbCBiZSBjb25maWd1cmVkCiAgKglhZnRlciBqb2luaW5nCisgKiBAYmFzaWNfcmF0ZXM6IGJpdG1hcCBvZiBiYXNpYyByYXRlcyB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgSUJTUwogICovCiBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgewogCXU4ICpzc2lkOwpAQCAtODA5LDYgKzgxOSw3IEBACiAJdTggKmllOwogCXU4IHNzaWRfbGVuLCBpZV9sZW47CiAJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MzIgYmFzaWNfcmF0ZXM7CiAJYm9vbCBjaGFubmVsX2ZpeGVkOwogCWJvb2wgcHJpdmFjeTsKIH07CkBAIC04MjYsOCArODM3LDggQEAKICAqIEBzc2lkOiBTU0lECiAgKiBAc3NpZF9sZW46IExlbmd0aCBvZiBzc2lkIGluIG9jdGV0cwogICogQGF1dGhfdHlwZTogQXV0aGVudGljYXRpb24gdHlwZSAoYWxnb3JpdGhtKQotICogQGFzc29jX2llOiBJRXMgZm9yIGFzc29jaWF0aW9uIHJlcXVlc3QKLSAqIEBhc3NvY19pZV9sZW46IExlbmd0aCBvZiBhc3NvY19pZSBpbiBvY3RldHMKKyAqIEBpZTogSUVzIGZvciBhc3NvY2lhdGlvbiByZXF1ZXN0CisgKiBAaWVfbGVuOiBMZW5ndGggb2YgYXNzb2NfaWUgaW4gb2N0ZXRzCiAgKiBAcHJpdmFjeTogaW5kaWNhdGVzIHdoZXRoZXIgcHJpdmFjeS1lbmFibGVkIEFQcyBzaG91bGQgYmUgdXNlZAogICogQGNyeXB0bzogY3J5cHRvIHNldHRpbmdzCiAgKiBAa2V5X2xlbjogbGVuZ3RoIG9mIFdFUCBrZXkgZm9yIHNoYXJlZCBrZXkgYXV0aGVudGljYXRpb24KQEAgLTg1MCwxMCArODYxLDExIEBACiAKIC8qKgogICogZW51bSB3aXBoeV9wYXJhbXNfZmxhZ3MgLSBzZXRfd2lwaHlfcGFyYW1zIGJpdGZpZWxkIHZhbHVlcwotICogV0lQSFlfUEFSQU1fUkVUUllfU0hPUlQ6IHdpcGh5LT5yZXRyeV9zaG9ydCBoYXMgY2hhbmdlZAotICogV0lQSFlfUEFSQU1fUkVUUllfTE9ORzogd2lwaHktPnJldHJ5X2xvbmcgaGFzIGNoYW5nZWQKLSAqIFdJUEhZX1BBUkFNX0ZSQUdfVEhSRVNIT0xEOiB3aXBoeS0+ZnJhZ190aHJlc2hvbGQgaGFzIGNoYW5nZWQKLSAqIFdJUEhZX1BBUkFNX1JUU19USFJFU0hPTEQ6IHdpcGh5LT5ydHNfdGhyZXNob2xkIGhhcyBjaGFuZ2VkCisgKiBAV0lQSFlfUEFSQU1fUkVUUllfU0hPUlQ6IHdpcGh5LT5yZXRyeV9zaG9ydCBoYXMgY2hhbmdlZAorICogQFdJUEhZX1BBUkFNX1JFVFJZX0xPTkc6IHdpcGh5LT5yZXRyeV9sb25nIGhhcyBjaGFuZ2VkCisgKiBAV0lQSFlfUEFSQU1fRlJBR19USFJFU0hPTEQ6IHdpcGh5LT5mcmFnX3RocmVzaG9sZCBoYXMgY2hhbmdlZAorICogQFdJUEhZX1BBUkFNX1JUU19USFJFU0hPTEQ6IHdpcGh5LT5ydHNfdGhyZXNob2xkIGhhcyBjaGFuZ2VkCisgKiBAV0lQSFlfUEFSQU1fQ09WRVJBR0VfQ0xBU1M6IGNvdmVyYWdlIGNsYXNzIGNoYW5nZWQKICAqLwogZW51bSB3aXBoeV9wYXJhbXNfZmxhZ3MgewogCVdJUEhZX1BBUkFNX1JFVFJZX1NIT1JUCQk9IDEgPDwgMCwKQEAgLTg2MywxOSArODc1LDYgQEAKIAlXSVBIWV9QQVJBTV9DT1ZFUkFHRV9DTEFTUwk9IDEgPDwgNCwKIH07CiAKLS8qKgotICogZW51bSB0eF9wb3dlcl9zZXR0aW5nIC0gVFggcG93ZXIgYWRqdXN0bWVudAotICoKLSAqIEBUWF9QT1dFUl9BVVRPTUFUSUM6IHRoZSBkYm0gcGFyYW1ldGVyIGlzIGlnbm9yZWQKLSAqIEBUWF9QT1dFUl9MSU1JVEVEOiBsaW1pdCBUWCBwb3dlciBieSB0aGUgZGJtIHBhcmFtZXRlcgotICogQFRYX1BPV0VSX0ZJWEVEOiBmaXggVFggcG93ZXIgdG8gdGhlIGRibSBwYXJhbWV0ZXIKLSAqLwotZW51bSB0eF9wb3dlcl9zZXR0aW5nIHsKLQlUWF9QT1dFUl9BVVRPTUFUSUMsCi0JVFhfUE9XRVJfTElNSVRFRCwKLQlUWF9QT1dFUl9GSVhFRCwKLX07Ci0KIC8qCiAgKiBjZmc4MDIxMV9iaXRyYXRlX21hc2sgLSBtYXNrcyBmb3IgYml0cmF0ZSBjb250cm9sCiAgKi8KQEAgLTk0OSwxMCArOTQ4LDE2IEBACiAgKiBAZGVsX2JlYWNvbjogUmVtb3ZlIGJlYWNvbiBjb25maWd1cmF0aW9uIGFuZCBzdG9wIHNlbmRpbmcgdGhlIGJlYWNvbi4KICAqCiAgKiBAYWRkX3N0YXRpb246IEFkZCBhIG5ldyBzdGF0aW9uLgotICoKICAqIEBkZWxfc3RhdGlvbjogUmVtb3ZlIGEgc3RhdGlvbjsgQG1hYyBtYXkgYmUgTlVMTCB0byByZW1vdmUgYWxsIHN0YXRpb25zLgotICoKICAqIEBjaGFuZ2Vfc3RhdGlvbjogTW9kaWZ5IGEgZ2l2ZW4gc3RhdGlvbi4KKyAqIEBnZXRfc3RhdGlvbjogZ2V0IHN0YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzdGF0aW9uIGlkZW50aWZpZWQgYnkgQG1hYworICogQGR1bXBfc3RhdGlvbjogZHVtcCBzdGF0aW9uIGNhbGxiYWNrIC0tIHJlc3VtZSBkdW1wIGF0IGluZGV4IEBpZHgKKyAqCisgKiBAYWRkX21wYXRoOiBhZGQgYSBmaXhlZCBtZXNoIHBhdGgKKyAqIEBkZWxfbXBhdGg6IGRlbGV0ZSBhIGdpdmVuIG1lc2ggcGF0aAorICogQGNoYW5nZV9tcGF0aDogY2hhbmdlIGEgZ2l2ZW4gbWVzaCBwYXRoCisgKiBAZ2V0X21wYXRoOiBnZXQgYSBtZXNoIHBhdGggZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCisgKiBAZHVtcF9tcGF0aDogZHVtcCBtZXNoIHBhdGggY2FsbGJhY2sgLS0gcmVzdW1lIGR1bXAgYXQgaW5kZXggQGlkeAogICoKICAqIEBnZXRfbWVzaF9wYXJhbXM6IFB1dCB0aGUgY3VycmVudCBtZXNoIHBhcmFtZXRlcnMgaW50byAqcGFyYW1zCiAgKgpAQCAtOTYwLDggKzk2NSw2IEBACiAgKglUaGUgbWFzayBpcyBhIGJpdGZpZWxkIHdoaWNoIHRlbGxzIHVzIHdoaWNoIHBhcmFtZXRlcnMgdG8KICAqCXNldCwgYW5kIHdoaWNoIHRvIGxlYXZlIGFsb25lLgogICoKLSAqIEBzZXRfbWVzaF9jZmc6IHNldCBtZXNoIHBhcmFtZXRlcnMgKGJ5IG5vdywganVzdCBtZXNoIGlkKQotICoKICAqIEBjaGFuZ2VfYnNzOiBNb2RpZnkgcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBCU1MuCiAgKgogICogQHNldF90eHFfcGFyYW1zOiBTZXQgVFggcXVldWUgcGFyYW1ldGVycwpAQCAtMTAwMiw2ICsxMDA1LDggQEAKICAqIEBnZXRfdHhfcG93ZXI6IHN0b3JlIHRoZSBjdXJyZW50IFRYIHBvd2VyIGludG8gdGhlIGRibSB2YXJpYWJsZTsKICAqCXJldHVybiAwIGlmIHN1Y2Nlc3NmdWwKICAqCisgKiBAc2V0X3dkc19wZWVyOiBzZXQgdGhlIFdEUyBwZWVyIGZvciBhIFdEUyBpbnRlcmZhY2UKKyAqCiAgKiBAcmZraWxsX3BvbGw6IHBvbGxzIHRoZSBodyByZmtpbGwgbGluZSwgdXNlIGNmZzgwMjExIHJlcG9ydGluZwogICoJZnVuY3Rpb25zIHRvIGFkanVzdCByZmtpbGwgaHcgc3RhdGUKICAqCkBAIC0xMDE5LDYgKzEwMjQsOCBAQAogICoKICAqIEB0ZXN0bW9kZV9jbWQ6IHJ1biBhIHRlc3QgbW9kZSBjb21tYW5kCiAgKgorICogQHNldF9iaXRyYXRlX21hc2s6IHNldCB0aGUgYml0cmF0ZSBtYXNrIGNvbmZpZ3VyYXRpb24KKyAqCiAgKiBAc2V0X3Bta3NhOiBDYWNoZSBhIFBNS0lEIGZvciBhIEJTU0lELiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGZ1bGxtYWMKICAqCWRldmljZXMgcnVubmluZyBmaXJtd2FyZXMgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHRoZSAocmUpIGFzc29jaWF0aW9uCiAgKglSU04gSUUuIEl0IGFsbG93cyBmb3IgZmFzdGVyIHJvYW1pbmcgYmV0d2VlbiBXUEEyIEJTU0lEcy4KQEAgLTExMjksNyArMTEzNiw3IEBACiAJaW50CSgqc2V0X3dpcGh5X3BhcmFtcykoc3RydWN0IHdpcGh5ICp3aXBoeSwgdTMyIGNoYW5nZWQpOwogCiAJaW50CSgqc2V0X3R4X3Bvd2VyKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCWVudW0gdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgZGJtKTsKKwkJCQllbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgbWJtKTsKIAlpbnQJKCpnZXRfdHhfcG93ZXIpKHN0cnVjdCB3aXBoeSAqd2lwaHksIGludCAqZGJtKTsKIAogCWludAkoKnNldF93ZHNfcGVlcikoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTExNjgsNiArMTE3NSw3IEBACiAJaW50CSgqYWN0aW9uKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAorCQkJICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwKIAkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgdTY0ICpjb29raWUpOwogCiAJaW50CSgqc2V0X3Bvd2VyX21nbXQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xMjMwLDggKzEyMzgsNiBAQAogCiAvKioKICAqIHN0cnVjdCB3aXBoeSAtIHdpcmVsZXNzIGhhcmR3YXJlIGRlc2NyaXB0aW9uCi0gKiBAaWR4OiB0aGUgd2lwaHkgaW5kZXggYXNzaWduZWQgdG8gdGhpcyBpdGVtCi0gKiBAY2xhc3NfZGV2OiB0aGUgY2xhc3MgZGV2aWNlIHJlcHJlc2VudGluZyAvc3lzL2NsYXNzL2llZWU4MDIxMS88d2lwaHktbmFtZT4KICAqIEByZWdfbm90aWZpZXI6IHRoZSBkcml2ZXIncyByZWd1bGF0b3J5IG5vdGlmaWNhdGlvbiBjYWxsYmFjawogICogQHJlZ2Q6IHRoZSBkcml2ZXIncyByZWd1bGF0b3J5IGRvbWFpbiwgaWYgb25lIHdhcyByZXF1ZXN0ZWQgdmlhCiAgKiAJdGhlIHJlZ3VsYXRvcnlfaGludCgpIEFQSS4gVGhpcyBjYW4gYmUgdXNlZCBieSB0aGUgZHJpdmVyCkBAIC0xMjQ1LDcgKzEyNTEsNyBAQAogICogQGZyYWdfdGhyZXNob2xkOiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAoZG90MTFGcmFnbWVudGF0aW9uVGhyZXNob2xkKTsKICAqCS0xID0gZnJhZ21lbnRhdGlvbiBkaXNhYmxlZCwgb25seSBvZGQgdmFsdWVzID49IDI1NiB1c2VkCiAgKiBAcnRzX3RocmVzaG9sZDogUlRTIHRocmVzaG9sZCAoZG90MTFSVFNUaHJlc2hvbGQpOyAtMSA9IFJUUy9DVFMgZGlzYWJsZWQKLSAqIEBuZXQ6IHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB0aGlzIHdpcGh5IGN1cnJlbnRseSBsaXZlcyBpbgorICogQF9uZXQ6IHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB0aGlzIHdpcGh5IGN1cnJlbnRseSBsaXZlcyBpbgogICogQHBlcm1fYWRkcjogcGVybWFuZW50IE1BQyBhZGRyZXNzIG9mIHRoaXMgZGV2aWNlCiAgKiBAYWRkcl9tYXNrOiBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIE1BQyBhZGRyZXNzZXMgYnkgbWFza2luZywKICAqCXNldCB0aGlzIHRvIGEgbWFzayB3aXRoIHZhcmlhYmxlIGJpdHMgc2V0IHRvIDEsIGUuZy4gaWYgdGhlIGxhc3QKQEAgLTEyNTgsNiArMTI2NCwyOCBAQAogICoJYnkgZGVmYXVsdCBmb3IgcGVybV9hZGRyLiBJbiB0aGlzIGNhc2UsIHRoZSBtYXNrIHNob3VsZCBiZSBzZXQgdG8KICAqCWFsbC16ZXJvZXMuIEluIHRoaXMgY2FzZSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGRldmljZSBjYW4gaGFuZGxlCiAgKgl0aGUgc2FtZSBudW1iZXIgb2YgYXJiaXRyYXJ5IE1BQyBhZGRyZXNzZXMuCisgKiBAZGVidWdmc2RpcjogZGVidWdmcyBkaXJlY3RvcnkgdXNlZCBmb3IgdGhpcyB3aXBoeSwgd2lsbCBiZSByZW5hbWVkCisgKglhdXRvbWF0aWNhbGx5IG9uIHdpcGh5IHJlbmFtZXMKKyAqIEBkZXY6ICh2aXJ0dWFsKSBzdHJ1Y3QgZGV2aWNlIGZvciB0aGlzIHdpcGh5CisgKiBAd2V4dDogd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzCisgKiBAcHJpdjogZHJpdmVyIHByaXZhdGUgZGF0YSAoc2l6ZWQgYWNjb3JkaW5nIHRvIHdpcGh5X25ldygpIHBhcmFtZXRlcikKKyAqIEBpbnRlcmZhY2VfbW9kZXM6IGJpdG1hc2sgb2YgaW50ZXJmYWNlcyB0eXBlcyB2YWxpZCBmb3IgdGhpcyB3aXBoeSwKKyAqCW11c3QgYmUgc2V0IGJ5IGRyaXZlcgorICogQGZsYWdzOiB3aXBoeSBmbGFncywgc2VlICZlbnVtIHdpcGh5X2ZsYWdzCisgKiBAYnNzX3ByaXZfc2l6ZTogZWFjaCBCU1Mgc3RydWN0IGhhcyBwcml2YXRlIGRhdGEgYWxsb2NhdGVkIHdpdGggaXQsCisgKgl0aGlzIHZhcmlhYmxlIGRldGVybWluZXMgaXRzIHNpemUKKyAqIEBtYXhfc2Nhbl9zc2lkczogbWF4aW11bSBudW1iZXIgb2YgU1NJRHMgdGhlIGRldmljZSBjYW4gc2NhbiBmb3IgaW4KKyAqCWFueSBnaXZlbiBzY2FuCisgKiBAbWF4X3NjYW5faWVfbGVuOiBtYXhpbXVtIGxlbmd0aCBvZiB1c2VyLWNvbnRyb2xsZWQgSUVzIGRldmljZSBjYW4KKyAqCWFkZCB0byBwcm9iZSByZXF1ZXN0IGZyYW1lcyB0cmFuc21pdHRlZCBkdXJpbmcgYSBzY2FuLCBtdXN0IG5vdAorICoJaW5jbHVkZSBmaXhlZCBJRXMgbGlrZSBzdXBwb3J0ZWQgcmF0ZXMKKyAqIEBjb3ZlcmFnZV9jbGFzczogY3VycmVudCBjb3ZlcmFnZSBjbGFzcworICogQGZ3X3ZlcnNpb246IGZpcm13YXJlIHZlcnNpb24gZm9yIGV0aHRvb2wgcmVwb3J0aW5nCisgKiBAaHdfdmVyc2lvbjogaGFyZHdhcmUgdmVyc2lvbiBmb3IgZXRodG9vbCByZXBvcnRpbmcKKyAqIEBtYXhfbnVtX3Bta2lkczogbWF4aW11bSBudW1iZXIgb2YgUE1LSURzIHN1cHBvcnRlZCBieSBkZXZpY2UKKyAqIEBwcml2aWQ6IGEgcG9pbnRlciB0aGF0IGRyaXZlcnMgY2FuIHVzZSB0byBpZGVudGlmeSBpZiBhbiBhcmJpdHJhcnkKKyAqCXdpcGh5IGlzIHRoZWlycywgZS5nLiBpbiBnbG9iYWwgbm90aWZpZXJzCisgKiBAYmFuZHM6IGluZm9ybWF0aW9uIGFib3V0IGJhbmRzL2NoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZQogICovCiBzdHJ1Y3Qgd2lwaHkgewogCS8qIGFzc2lnbiB0aGVzZSBmaWVsZHMgYmVmb3JlIHlvdSByZWdpc3RlciB0aGUgd2lwaHkgKi8KQEAgLTEzMzAsMjYgKzEzNTgsMTUgQEAKIAljaGFyIHByaXZbMF0gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oTkVUREVWX0FMSUdOKSkpOwogfTsKIAotI2lmZGVmIENPTkZJR19ORVRfTlMKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqd2lwaHlfbmV0KHN0cnVjdCB3aXBoeSAqd2lwaHkpCiB7Ci0JcmV0dXJuIHdpcGh5LT5fbmV0OworCXJldHVybiByZWFkX3BuZXQoJndpcGh5LT5fbmV0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHdpcGh5X25ldF9zZXQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldCAqbmV0KQogewotCXdpcGh5LT5fbmV0ID0gbmV0OworCXdyaXRlX3BuZXQoJndpcGh5LT5fbmV0LCBuZXQpOwogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqd2lwaHlfbmV0KHN0cnVjdCB3aXBoeSAqd2lwaHkpCi17Ci0JcmV0dXJuICZpbml0X25ldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdpcGh5X25ldF9zZXQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldCAqbmV0KQotewotfQotI2VuZGlmCiAKIC8qKgogICogd2lwaHlfcHJpdiAtIHJldHVybiBwcml2IGZyb20gd2lwaHkKQEAgLTEzOTksNyArMTQxNiw3IEBACiAgKgogICogQHdpcGh5OiBUaGUgd2lwaHkgd2hvc2UgbmFtZSB0byByZXR1cm4KICAqLwotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp3aXBoeV9uYW1lKHN0cnVjdCB3aXBoeSAqd2lwaHkpCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKndpcGh5X25hbWUoY29uc3Qgc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlyZXR1cm4gZGV2X25hbWUoJndpcGh5LT5kZXYpOwogfQpAQCAtMTQ3MSwxMyArMTQ4OCwxNCBAQAogICogQHNzaWQ6IChwcml2YXRlKSBVc2VkIGJ5IHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIGNvZGUKICAqIEBzc2lkX2xlbjogKHByaXZhdGUpIFVzZWQgYnkgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gY29kZQogICogQHdleHQ6IChwcml2YXRlKSBVc2VkIGJ5IHRoZSBpbnRlcm5hbCB3aXJlbGVzcyBleHRlbnNpb25zIGNvbXBhdCBjb2RlCi0gKiBAd2V4dF9ic3NpZDogKHByaXZhdGUpIFVzZWQgYnkgdGhlIGludGVybmFsIHdpcmVsZXNzIGV4dGVuc2lvbnMgY29tcGF0IGNvZGUKICAqIEB1c2VfNGFkZHI6IGluZGljYXRlcyA0YWRkciBtb2RlIGlzIHVzZWQgb24gdGhpcyBpbnRlcmZhY2UsIG11c3QgYmUKICAqCXNldCBieSBkcml2ZXIgKGlmIHN1cHBvcnRlZCkgb24gYWRkX2ludGVyZmFjZSBCRUZPUkUgcmVnaXN0ZXJpbmcgdGhlCiAgKgluZXRkZXYgYW5kIG1heSBvdGhlcndpc2UgYmUgdXNlZCBieSBkcml2ZXIgcmVhZC1vbmx5LCB3aWxsIGJlIHVwZGF0ZQogICoJYnkgY2ZnODAyMTEgb24gY2hhbmdlX2ludGVyZmFjZQogICogQGFjdGlvbl9yZWdpc3RyYXRpb25zOiBsaXN0IG9mIHJlZ2lzdHJhdGlvbnMgZm9yIGFjdGlvbiBmcmFtZXMKICAqIEBhY3Rpb25fcmVnaXN0cmF0aW9uc19sb2NrOiBsb2NrIGZvciB0aGUgbGlzdAorICogQG10eDogbXV0ZXggdXNlZCB0byBsb2NrIGRhdGEgaW4gdGhpcyBzdHJ1Y3QKKyAqIEBjbGVhbnVwX3dvcms6IHdvcmsgc3RydWN0IHVzZWQgZm9yIGNsZWFudXAgdGhhdCBjYW4ndCBiZSBkb25lIGRpcmVjdGx5CiAgKi8KIHN0cnVjdCB3aXJlbGVzc19kZXYgewogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CkBAIC0xNTUxLDExICsxNTY5LDEzIEBACiAKIC8qKgogICogaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5IC0gY29udmVydCBjaGFubmVsIG51bWJlciB0byBmcmVxdWVuY3kKKyAqIEBjaGFuOiBjaGFubmVsIG51bWJlcgogICovCiBleHRlcm4gaW50IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShpbnQgY2hhbik7CiAKIC8qKgogICogaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsIC0gY29udmVydCBmcmVxdWVuY3kgdG8gY2hhbm5lbCBudW1iZXIKKyAqIEBmcmVxOiBjZW50ZXIgZnJlcXVlbmN5CiAgKi8KIGV4dGVybiBpbnQgaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGludCBmcmVxKTsKIApAQCAtMTU3MCw2ICsxNTkwLDggQEAKIAkJCQkJCQkgaW50IGZyZXEpOwogLyoqCiAgKiBpZWVlODAyMTFfZ2V0X2NoYW5uZWwgLSBnZXQgY2hhbm5lbCBzdHJ1Y3QgZnJvbSB3aXBoeSBmb3Igc3BlY2lmaWVkIGZyZXF1ZW5jeQorICogQHdpcGh5OiB0aGUgc3RydWN0IHdpcGh5IHRvIGdldCB0aGUgY2hhbm5lbCBmb3IKKyAqIEBmcmVxOiB0aGUgY2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbAogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqCiBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwgaW50IGZyZXEpCkBAIC0xNjMwLDkgKzE2NTIsNiBAQAogICogQGlzX3JhZGlvdGFwX25zOiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBuYW1lc3BhY2UgaXMgdGhlIGRlZmF1bHQKICAqCXJhZGlvdGFwIG5hbWVzcGFjZSBvciBub3QKICAqCi0gKiBAb3ZlcnJpZGVzOiBvdmVycmlkZSBzdGFuZGFyZCByYWRpb3RhcCBmaWVsZHMKLSAqIEBuX292ZXJyaWRlczogbnVtYmVyIG9mIG92ZXJyaWRlcwotICoKICAqIEBfcnRoZWFkZXI6IHBvaW50ZXIgdG8gdGhlIHJhZGlvdGFwIGhlYWRlciB3ZSBhcmUgd2Fsa2luZyB0aHJvdWdoCiAgKiBAX21heF9sZW5ndGg6IGxlbmd0aCBvZiByYWRpb3RhcCBoZWFkZXIgaW4gY3B1IGJ5dGUgb3JkZXJpbmcKICAqIEBfYXJnX2luZGV4OiBuZXh0IGFyZ3VtZW50IGluZGV4CkBAIC0xOTMzLDYgKzE5NTIsMTAgQEAKIAkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKTsKIAoraW50IGNmZzgwMjExX3dleHRfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKKwogLyoKICAqIGNhbGxiYWNrcyBmb3IgYXN5bmNocm9ub3VzIGNmZzgwMjExIG1ldGhvZHMsIG5vdGlmaWNhdGlvbgogICogZnVuY3Rpb25zIGFuZCBCU1MgaGFuZGxpbmcgaGVscGVycwpAQCAtMTk0OCwxMCArMTk3MSwxMiBAQAogdm9pZCBjZmc4MDIxMV9zY2FuX2RvbmUoc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCwgYm9vbCBhYm9ydGVkKTsKIAogLyoqCi0gKiBjZmc4MDIxMV9pbmZvcm1fYnNzIC0gaW5mb3JtIGNmZzgwMjExIG9mIGEgbmV3IEJTUworICogY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZSAtIGluZm9ybSBjZmc4MDIxMSBvZiBhIHJlY2VpdmVkIEJTUyBmcmFtZQogICoKICAqIEB3aXBoeTogdGhlIHdpcGh5IHJlcG9ydGluZyB0aGUgQlNTCi0gKiBAYnNzOiB0aGUgZm91bmQgQlNTCisgKiBAY2hhbm5lbDogVGhlIGNoYW5uZWwgdGhlIGZyYW1lIHdhcyByZWNlaXZlZCBvbgorICogQG1nbXQ6IHRoZSBtYW5hZ2VtZW50IGZyYW1lIChwcm9iZSByZXNwb25zZSBvciBiZWFjb24pCisgKiBAbGVuOiBsZW5ndGggb2YgdGhlIG1hbmFnZW1lbnQgZnJhbWUKICAqIEBzaWduYWw6IHRoZSBzaWduYWwgc3RyZW5ndGgsIHR5cGUgZGVwZW5kcyBvbiB0aGUgd2lwaHkncyBzaWduYWxfdHlwZQogICogQGdmcDogY29udGV4dCBmbGFncwogICoKQEAgLTE5NjQsNiArMTk4OSwyMyBAQAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4sCiAJCQkgIHMzMiBzaWduYWwsIGdmcF90IGdmcCk7CiAKKy8qKgorICogY2ZnODAyMTFfaW5mb3JtX2JzcyAtIGluZm9ybSBjZmc4MDIxMSBvZiBhIG5ldyBCU1MKKyAqCisgKiBAd2lwaHk6IHRoZSB3aXBoeSByZXBvcnRpbmcgdGhlIEJTUworICogQGNoYW5uZWw6IFRoZSBjaGFubmVsIHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBic3NpZDogdGhlIEJTU0lEIG9mIHRoZSBCU1MKKyAqIEB0aW1lc3RhbXA6IHRoZSBUU0YgdGltZXN0YW1wIHNlbnQgYnkgdGhlIHBlZXIKKyAqIEBjYXBhYmlsaXR5OiB0aGUgY2FwYWJpbGl0eSBmaWVsZCBzZW50IGJ5IHRoZSBwZWVyCisgKiBAYmVhY29uX2ludGVydmFsOiB0aGUgYmVhY29uIGludGVydmFsIGFubm91bmNlZCBieSB0aGUgcGVlcgorICogQGllOiBhZGRpdGlvbmFsIElFcyBzZW50IGJ5IHRoZSBwZWVyCisgKiBAaWVsZW46IGxlbmd0aCBvZiB0aGUgYWRkaXRpb25hbCBJRXMKKyAqIEBzaWduYWw6IHRoZSBzaWduYWwgc3RyZW5ndGgsIHR5cGUgZGVwZW5kcyBvbiB0aGUgd2lwaHkncyBzaWduYWxfdHlwZQorICogQGdmcDogY29udGV4dCBmbGFncworICoKKyAqIFRoaXMgaW5mb3JtcyBjZmc4MDIxMSB0aGF0IEJTUyBpbmZvcm1hdGlvbiB3YXMgZm91bmQgYW5kCisgKiB0aGUgQlNTIHNob3VsZCBiZSB1cGRhdGVkL2FkZGVkLgorICovCiBzdHJ1Y3QgY2ZnODAyMTFfYnNzKgogY2ZnODAyMTFfaW5mb3JtX2JzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLApAQCAtMjM3OCw0ICsyNDIwLDY3IEBACiAJCQkgICAgICBlbnVtIG5sODAyMTFfY3FtX3Jzc2lfdGhyZXNob2xkX2V2ZW50IHJzc2lfZXZlbnQsCiAJCQkgICAgICBnZnBfdCBnZnApOwogCisjaWZkZWYgX19LRVJORUxfXworCisvKiBMb2dnaW5nLCBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy9kaWFnbm9zdGljIGhlbHBlcnMuICovCisKKy8qIHdpcGh5X3ByaW50ayBoZWxwZXJzLCBzaW1pbGFyIHRvIGRldl9wcmludGsgKi8KKworI2RlZmluZSB3aXBoeV9wcmludGsobGV2ZWwsIHdpcGh5LCBmb3JtYXQsIGFyZ3MuLi4pCQlcCisJcHJpbnRrKGxldmVsICIlczogIiBmb3JtYXQsIHdpcGh5X25hbWUod2lwaHkpLCAjI2FyZ3MpCisjZGVmaW5lIHdpcGh5X2VtZXJnKHdpcGh5LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAorCXdpcGh5X3ByaW50ayhLRVJOX0VNRVJHLCB3aXBoeSwgZm9ybWF0LCAjI2FyZ3MpCisjZGVmaW5lIHdpcGh5X2FsZXJ0KHdpcGh5LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAorCXdpcGh5X3ByaW50ayhLRVJOX0FMRVJULCB3aXBoeSwgZm9ybWF0LCAjI2FyZ3MpCisjZGVmaW5lIHdpcGh5X2NyaXQod2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQlcCisJd2lwaHlfcHJpbnRrKEtFUk5fQ1JJVCwgd2lwaHksIGZvcm1hdCwgIyNhcmdzKQorI2RlZmluZSB3aXBoeV9lcnIod2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQlcCisJd2lwaHlfcHJpbnRrKEtFUk5fRVJSLCB3aXBoeSwgZm9ybWF0LCAjI2FyZ3MpCisjZGVmaW5lIHdpcGh5X3dhcm4od2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQlcCisJd2lwaHlfcHJpbnRrKEtFUk5fV0FSTklORywgd2lwaHksIGZvcm1hdCwgIyNhcmdzKQorI2RlZmluZSB3aXBoeV9ub3RpY2Uod2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQlcCisJd2lwaHlfcHJpbnRrKEtFUk5fTk9USUNFLCB3aXBoeSwgZm9ybWF0LCAjI2FyZ3MpCisjZGVmaW5lIHdpcGh5X2luZm8od2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQlcCisJd2lwaHlfcHJpbnRrKEtFUk5fSU5GTywgd2lwaHksIGZvcm1hdCwgIyNhcmdzKQorCitpbnQgd2lwaHlfZGVidWcoY29uc3Qgc3RydWN0IHdpcGh5ICp3aXBoeSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgd2lwaHlfZGJnKHdpcGh5LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAorCXdpcGh5X3ByaW50ayhLRVJOX0RFQlVHLCB3aXBoeSwgZm9ybWF0LCAjI2FyZ3MpCisjZWxpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX0RFQlVHKQorI2RlZmluZSB3aXBoeV9kYmcod2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQlcCisJZHluYW1pY19wcl9kZWJ1ZygiJXM6ICIgZm9ybWF0LAl3aXBoeV9uYW1lKHdpcGh5KSwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgd2lwaHlfZGJnKHdpcGh5LCBmb3JtYXQsIGFyZ3MuLi4pCQkJCVwKKyh7CQkJCQkJCQkJXAorCWlmICgwKQkJCQkJCQkJXAorCQl3aXBoeV9wcmludGsoS0VSTl9ERUJVRywgd2lwaHksIGZvcm1hdCwgIyNhcmdzKTsJXAorCTA7CQkJCQkJCQlcCit9KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZFUkJPU0VfREVCVUcpCisjZGVmaW5lIHdpcGh5X3ZkYmcJd2lwaHlfZGJnCisjZWxzZQorCisjZGVmaW5lIHdpcGh5X3ZkYmcod2lwaHksIGZvcm1hdCwgYXJncy4uLikJCQkJXAorKHsJCQkJCQkJCQlcCisJaWYgKDApCQkJCQkJCQlcCisJCXdpcGh5X3ByaW50ayhLRVJOX0RFQlVHLCB3aXBoeSwgZm9ybWF0LCAjI2FyZ3MpOwlcCisJCTA7CQkJCQkJCVwKK30pCisjZW5kaWYKKworLyoKKyAqIHdpcGh5X1dBUk4oKSBhY3RzIGxpa2Ugd2lwaHlfcHJpbnRrKCksIGJ1dCB3aXRoIHRoZSBrZXkgZGlmZmVyZW5jZQorICogb2YgdXNpbmcgYSBXQVJOL1dBUk5fT04gdG8gZ2V0IHRoZSBtZXNzYWdlIG91dCwgaW5jbHVkaW5nIHRoZQorICogZmlsZS9saW5lIGluZm9ybWF0aW9uIGFuZCBhIGJhY2t0cmFjZS4KKyAqLworI2RlZmluZSB3aXBoeV9XQVJOKHdpcGh5LCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAorCVdBUk4oMSwgIndpcGh5OiAlc1xuIiBmb3JtYXQsIHdpcGh5X25hbWUod2lwaHkpLCAjI2FyZ3MpOworCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fTkVUX0NGRzgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RuX2Rldi5oIGIvaW5jbHVkZS9uZXQvZG5fZGV2LmgKaW5kZXggNTExYTQ1OS4uMDkxNmJiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZG5fZGV2LmgKKysrIGIvaW5jbHVkZS9uZXQvZG5fZGV2LmgKQEAgLTEwMSw3ICsxMDEsNyBAQAogCV9fbGUxNiBkc3Rub2RlOwogCV9fbGUxNiBzcmNub2RlOwogCV9fdTggICBmb3J3YXJkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBkbl9sb25nX3BhY2tldCB7CiAJX191OCAgIG1zZ2ZsZzsKQEAgLTExNSw3ICsxMTUsNyBAQAogCV9fdTggICB2aXNpdF9jdDsKIAlfX3U4ICAgc19jbGFzczsKIAlfX3U4ICAgcHQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERSUCAtIFJvdXRpbmcgbWVzc2FnZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTMyLDcgKzEzMiw3IEBACiAJX191OCAgIG1wZDsKIAlfX3U4ICAgZGF0YWxlbjsKIAlfX3U4ICAgZGF0YVsyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcnRub2RlX2hlbGxvX21lc3NhZ2UgewogCV9fdTggICBtc2dmbGc7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlfX3U4ICAgYXJlYTsKIAlfX2xlMTYgIHRpbWVyOwogCV9fdTggICBtcGQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiBleHRlcm4gdm9pZCBkbl9kZXZfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RuX25zcC5oIGIvaW5jbHVkZS9uZXQvZG5fbnNwLmgKaW5kZXggMTdkNDNkMi4uZTQzYTI4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZG5fbnNwLmgKKysrIGIvaW5jbHVkZS9uZXQvZG5fbnNwLmgKQEAgLTc0LDE4ICs3NCwxOCBAQAogCV9fdTggICBtc2dmbGc7CiAJX19sZTE2IGRzdGFkZHI7CiAJX19sZTE2IHNyY2FkZHI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5zcF9kYXRhX29wdF9tc2cgewogCV9fbGUxNiBhY2tudW07CiAJX19sZTE2IHNlZ251bTsKIAlfX2xlMTYgbHNmbGdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuc3BfZGF0YV9vcHRfbXNnMSB7CiAJX19sZTE2IGFja251bTsKIAlfX2xlMTYgc2VnbnVtOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyogQWNrbm93bGVkZ21lbnQgTWVzc2FnZSAoZGF0YS9vdGhlciBkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk0LDEzICs5NCwxMyBAQAogCV9fbGUxNiBkc3RhZGRyOwogCV9fbGUxNiBzcmNhZGRyOwogCV9fbGUxNiBhY2tudW07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQ29ubmVjdCBBY2tub3dsZWRnbWVudCBNZXNzYWdlICovCiBzdHJ1Y3QgIG5zcF9jb25uX2Fja19tc2cgewogCV9fdTggbXNnZmxnOwogCV9fbGUxNiBkc3RhZGRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyogQ29ubmVjdCBJbml0aWF0ZS9SZXRyYW5zbWl0IEluaXRpYXRlL0Nvbm5lY3QgQ29uZmlybSAqLwpAQCAtMTE3LDcgKzExNyw3IEBACiAjZGVmaW5lIE5TUF9GQ19NQVNLICAgMHgwYyAgICAgICAgICAgIC8qIEZDIHR5cGUgbWFzayAgICAgICAgICovCiAJX191OCAgIGluZm87CiAJX19sZTE2IHNlZ3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogRGlzY29ubmVjdCBJbml0aWF0ZS9EaXNjb25uZWN0IENvbmZpcm0gKi8KIHN0cnVjdCAgbnNwX2Rpc2Nvbm5faW5pdF9tc2cgewpAQCAtMTI1LDcgKzEyNSw3IEBACiAJX19sZTE2IGRzdGFkZHI7CiAJX19sZTE2IHNyY2FkZHI7CiAJX19sZTE2IHJlYXNvbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIApAQCAtMTM1LDcgKzEzNSw3IEBACiAJX19sZTE2IGdycGNvZGU7CiAJX19sZTE2IHVzcmNvZGU7CiAJX191OCAgIGRsZW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIEEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgc2VxdWVuY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RuX3JvdXRlLmggYi9pbmNsdWRlL25ldC9kbl9yb3V0ZS5oCmluZGV4IDYwYzlmMjIuLmNjYWRhYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RuX3JvdXRlLmgKKysrIGIvaW5jbHVkZS9uZXQvZG5fcm91dGUuaApAQCAtNjUsOSArNjUsNyBAQAogICogcGFja2V0cyB0byB0aGUgb3JpZ2luYXRpbmcgaG9zdC4KICAqLwogc3RydWN0IGRuX3JvdXRlIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBkc3RfZW50cnkgZHN0OwotCX0gdTsKKwlzdHJ1Y3QgZHN0X2VudHJ5IGRzdDsKIAogCXN0cnVjdCBmbG93aSBmbDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmggYi9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaAppbmRleCBlYjU1MWJhLi5mN2RjZDJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaAorKysgYi9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaApAQCAtNjgsMjYgKzY4LDE1IEBACiAjZW5kaWYKIH07CiAKLSNpZmRlZiBDT05GSUdfTkVUX05TCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKmdlbmxfaW5mb19uZXQoc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlyZXR1cm4gaW5mby0+X25ldDsKKwlyZXR1cm4gcmVhZF9wbmV0KCZpbmZvLT5fbmV0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGdlbmxfaW5mb19uZXRfc2V0KHN0cnVjdCBnZW5sX2luZm8gKmluZm8sIHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlpbmZvLT5fbmV0ID0gbmV0OworCXdyaXRlX3BuZXQoJmluZm8tPl9uZXQsIG5ldCk7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICpnZW5sX2luZm9fbmV0KHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuICZpbml0X25ldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdlbmxfaW5mb19uZXRfc2V0KHN0cnVjdCBnZW5sX2luZm8gKmluZm8sIHN0cnVjdCBuZXQgKm5ldCkKLXsKLX0KLSNlbmRpZgogCiAvKioKICAqIHN0cnVjdCBnZW5sX29wcyAtIGdlbmVyaWMgbmV0bGluayBvcGVyYXRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2NvbW1vbi5oIGIvaW5jbHVkZS9uZXQvaW5ldF9jb21tb24uaAppbmRleCAxOGM3NzMyLi4yMmZhYzk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfY29tbW9uLmgKQEAgLTEsOCArMSw4IEBACiAjaWZuZGVmIF9JTkVUX0NPTU1PTl9ICiAjZGVmaW5lIF9JTkVUX0NPTU1PTl9ICiAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzCQlpbmV0X3N0cmVhbV9vcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHByb3RvX29wcwkJaW5ldF9kZ3JhbV9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHByb3RvX29wcyBpbmV0X3N0cmVhbV9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHByb3RvX29wcyBpbmV0X2RncmFtX29wczsKIAogLyoKICAqCUlORVQ0IHByb3RvdHlwZXMgdXNlZCBieSBJTkVUNgpAQCAtMTMsMzcgKzEzLDI4IEBACiBzdHJ1Y3Qgc29ja2FkZHI7CiBzdHJ1Y3Qgc29ja2V0OwogCi1leHRlcm4gaW50CQkJaW5ldF9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spOwotZXh0ZXJuIGludAkJCWluZXRfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKiB1YWRkciwKLQkJCQkJCSAgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncyk7Ci1leHRlcm4gaW50CQkJaW5ldF9kZ3JhbV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIAotCQkJCQkJICAgc3RydWN0IHNvY2thZGRyICogdWFkZHIsCi0JCQkJCQkgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncyk7Ci1leHRlcm4gaW50CQkJaW5ldF9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgCi0JCQkJCSAgICBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLCBpbnQgZmxhZ3MpOwotZXh0ZXJuIGludAkJCWluZXRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkJCSAgICAgc3RydWN0IHNvY2tldCAqc29jaywgCi0JCQkJCSAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCAKLQkJCQkJICAgICBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gaW50CQkJaW5ldF9zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KTsKLWV4dGVybiBpbnQJCQlpbmV0X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZyk7Ci0KLWV4dGVybiB2b2lkCQkJaW5ldF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzayk7Ci0KLWV4dGVybiBpbnQJCQlpbmV0X2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgCi0JCQkJCSAgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKTsKLWV4dGVybiBpbnQJCQlpbmV0X2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgCi0JCQkJCSAgICAgc3RydWN0IHNvY2thZGRyICp1YWRkciwgCi0JCQkJCSAgICAgaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKTsKLWV4dGVybiBpbnQJCQlpbmV0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIAotCQkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0KLWV4dGVybiBpbnQJCQlpbmV0X2N0bF9zb2NrX2NyZWF0ZShzdHJ1Y3Qgc29jayAqKnNrLAotCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBmYW1pbHksCi0JCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgcHJvdG9jb2wsCi0JCQkJCQkgICAgIHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gaW50IGluZXRfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKK2V4dGVybiBpbnQgaW5ldF9zdHJlYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKiB1YWRkciwKKwkJCSAgICAgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncyk7CitleHRlcm4gaW50IGluZXRfZGdyYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKiB1YWRkciwKKwkJCSAgICAgIGludCBhZGRyX2xlbiwgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgaW5ldF9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgaW5ldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpOworZXh0ZXJuIHNzaXplX3QgaW5ldF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKKwkJCSAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CitleHRlcm4gaW50IGluZXRfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBpbmV0X3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpOworZXh0ZXJuIGludCBpbmV0X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZyk7CitleHRlcm4gdm9pZCBpbmV0X3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKTsKK2V4dGVybiBpbnQgaW5ldF9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCBhZGRyX2xlbik7CitleHRlcm4gaW50IGluZXRfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKTsKK2V4dGVybiBpbnQgaW5ldF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IGluZXRfY3RsX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrICoqc2ssIHVuc2lnbmVkIHNob3J0IGZhbWlseSwKKwkJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB1bnNpZ25lZCBjaGFyIHByb3RvY29sLAorCQkJCXN0cnVjdCBuZXQgKm5ldCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X2N0bF9zb2NrX2Rlc3Ryb3koc3RydWN0IHNvY2sgKnNrKQogewpAQCAtNTEsNSArNDIsMyBAQAogfQogCiAjZW5kaWYKLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2ZyYWcuaCBiL2luY2x1ZGUvbmV0L2luZXRfZnJhZy5oCmluZGV4IDM5ZjJkYzkuLjE2ZmYyOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfZnJhZy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfZnJhZy5oCkBAIC0yMCw2ICsyMCw3IEBACiAJYXRvbWljX3QJCXJlZmNudDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsgICAgICAvKiB3aGVuIHdpbGwgdGhpcyBxdWV1ZSBleHBpcmU/ICovCiAJc3RydWN0IHNrX2J1ZmYJCSpmcmFnbWVudHM7IC8qIGxpc3Qgb2YgcmVjZWl2ZWQgZnJhZ21lbnRzICovCisJc3RydWN0IHNrX2J1ZmYJCSpmcmFnbWVudHNfdGFpbDsKIAlrdGltZV90CQkJc3RhbXA7CiAJaW50CQkJbGVuOyAgICAgICAgLyogdG90YWwgbGVuZ3RoIG9mIG9yaWcgZGF0YWdyYW0gKi8KIAlpbnQJCQltZWF0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3NvY2suaAppbmRleCAxNjUzZGU1Li4xOTg5Y2ZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3NvY2suaApAQCAtMTM3LDcgKzEzNyw4IEBACiAJCQkJaGRyaW5jbDoxLAogCQkJCW1jX2xvb3A6MSwKIAkJCQl0cmFuc3BhcmVudDoxLAotCQkJCW1jX2FsbDoxOworCQkJCW1jX2FsbDoxLAorCQkJCW5vZGVmcmFnOjE7CiAJaW50CQkJbWNfaW5kZXg7CiAJX19iZTMyCQkJbWNfYWRkcjsKIAlzdHJ1Y3QgaXBfbWNfc29ja2xpc3QJKm1jX2xpc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0cGVlci5oIGIvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaAppbmRleCA4N2IxZGYwLi40MTdkMGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0cGVlci5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKQEAgLTIyLDEwICsyMiwyMSBAQAogCV9fdTMyCQkJZHRpbWU7CQkvKiB0aGUgdGltZSBvZiBsYXN0IHVzZSBvZiBub3QKIAkJCQkJCSAqIHJlZmVyZW5jZWQgZW50cmllcyAqLwogCWF0b21pY190CQlyZWZjbnQ7Ci0JYXRvbWljX3QJCXJpZDsJCS8qIEZyYWcgcmVjZXB0aW9uIGNvdW50ZXIgKi8KLQlhdG9taWNfdAkJaXBfaWRfY291bnQ7CS8qIElQIElEIGZvciB0aGUgbmV4dCBwYWNrZXQgKi8KLQlfX3UzMgkJCXRjcF90czsKLQlfX3UzMgkJCXRjcF90c19zdGFtcDsKKwkvKgorCSAqIE9uY2UgaW5ldF9wZWVyIGlzIHF1ZXVlZCBmb3IgZGVsZXRpb24gKHJlZmNudCA9PSAtMSksIGZvbGxvd2luZyBmaWVsZHMKKwkgKiBhcmUgbm90IGF2YWlsYWJsZTogcmlkLCBpcF9pZF9jb3VudCwgdGNwX3RzLCB0Y3BfdHNfc3RhbXAKKwkgKiBXZSBjYW4gc2hhcmUgbWVtb3J5IHdpdGggcmN1X2hlYWQgdG8ga2VlcCBpbmV0X3BlZXIgc21hbGwKKwkgKiAobGVzcyB0aGVuIDY0IGJ5dGVzKQorCSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWF0b21pY190CXJpZDsJCS8qIEZyYWcgcmVjZXB0aW9uIGNvdW50ZXIgKi8KKwkJCWF0b21pY190CWlwX2lkX2NvdW50OwkvKiBJUCBJRCBmb3IgdGhlIG5leHQgcGFja2V0ICovCisJCQlfX3UzMgkJdGNwX3RzOworCQkJX191MzIJCXRjcF90c19zdGFtcDsKKwkJfTsKKwkJc3RydWN0IHJjdV9oZWFkICAgICAgICAgcmN1OworCX07CiB9OwogCiB2b2lkCQkJaW5ldF9pbml0cGVlcnModm9pZCkgX19pbml0OwpAQCAtMzYsMTAgKzQ3LDIxIEBACiAvKiBjYW4gYmUgY2FsbGVkIGZyb20gQkggY29udGV4dCBvciBvdXRzaWRlICovCiBleHRlcm4gdm9pZCBpbmV0X3B1dHBlZXIoc3RydWN0IGluZXRfcGVlciAqcCk7CiAKKy8qCisgKiB0ZW1wb3JhcnkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbnQgYWNjZXNzIHJpZCwgaXBfaWRfY291bnQsIHRjcF90cywKKyAqIHRjcF90c19zdGFtcCBpZiBubyByZWZjb3VudCBpcyB0YWtlbiBvbiBpbmV0X3BlZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGluZXRfcGVlcl9yZWZjaGVjayhjb25zdCBzdHJ1Y3QgaW5ldF9wZWVyICpwKQoreworCVdBUk5fT05fT05DRShhdG9taWNfcmVhZCgmcC0+cmVmY250KSA8PSAwKTsKK30KKworCiAvKiBjYW4gYmUgY2FsbGVkIHdpdGggb3Igd2l0aG91dCBsb2NhbCBCSCBiZWluZyBkaXNhYmxlZCAqLwogc3RhdGljIGlubGluZSBfX3UxNglpbmV0X2dldGlkKHN0cnVjdCBpbmV0X3BlZXIgKnAsIGludCBtb3JlKQogewogCW1vcmUrKzsKKwlpbmV0X3BlZXJfcmVmY2hlY2socCk7CiAJcmV0dXJuIGF0b21pY19hZGRfcmV0dXJuKG1vcmUsICZwLT5pcF9pZF9jb3VudCkgLSBtb3JlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCA0NTJmMjI5Li44OTBmOTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTYxLDExICs2MSwxNCBAQAogc3RydWN0IGlwX3JhX2NoYWluIHsKIAlzdHJ1Y3QgaXBfcmFfY2hhaW4JKm5leHQ7CiAJc3RydWN0IHNvY2sJCSpzazsKLQl2b2lkCQkJKCpkZXN0cnVjdG9yKShzdHJ1Y3Qgc29jayAqKTsKKwl1bmlvbiB7CisJCXZvaWQJCQkoKmRlc3RydWN0b3IpKHN0cnVjdCBzb2NrICopOworCQlzdHJ1Y3Qgc29jawkJKnNhdmVkX3NrOworCX07CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiB9OwogCiBleHRlcm4gc3RydWN0IGlwX3JhX2NoYWluICppcF9yYV9jaGFpbjsKLWV4dGVybiByd2xvY2tfdCBpcF9yYV9sb2NrOwogCiAvKiBJUCBmbGFncy4gKi8KICNkZWZpbmUgSVBfQ0UJCTB4ODAwMAkJLyogRmxhZzogIkNvbmdlc3Rpb24iCQkqLwpAQCAtMTYyLDEyICsxNjUsMTIgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3QgaXB2NF9jb25maWcgaXB2NF9jb25maWc7Ci0jZGVmaW5lIElQX0lOQ19TVEFUUyhuZXQsIGZpZWxkKQlTTk1QX0lOQ19TVEFUUygobmV0KS0+bWliLmlwX3N0YXRpc3RpY3MsIGZpZWxkKQotI2RlZmluZSBJUF9JTkNfU1RBVFNfQkgobmV0LCBmaWVsZCkJU05NUF9JTkNfU1RBVFNfQkgoKG5ldCktPm1pYi5pcF9zdGF0aXN0aWNzLCBmaWVsZCkKLSNkZWZpbmUgSVBfQUREX1NUQVRTKG5ldCwgZmllbGQsIHZhbCkJU05NUF9BRERfU1RBVFMoKG5ldCktPm1pYi5pcF9zdGF0aXN0aWNzLCBmaWVsZCwgdmFsKQotI2RlZmluZSBJUF9BRERfU1RBVFNfQkgobmV0LCBmaWVsZCwgdmFsKSBTTk1QX0FERF9TVEFUU19CSCgobmV0KS0+bWliLmlwX3N0YXRpc3RpY3MsIGZpZWxkLCB2YWwpCi0jZGVmaW5lIElQX1VQRF9QT19TVEFUUyhuZXQsIGZpZWxkLCB2YWwpIFNOTVBfVVBEX1BPX1NUQVRTKChuZXQpLT5taWIuaXBfc3RhdGlzdGljcywgZmllbGQsIHZhbCkKLSNkZWZpbmUgSVBfVVBEX1BPX1NUQVRTX0JIKG5ldCwgZmllbGQsIHZhbCkgU05NUF9VUERfUE9fU1RBVFNfQkgoKG5ldCktPm1pYi5pcF9zdGF0aXN0aWNzLCBmaWVsZCwgdmFsKQorI2RlZmluZSBJUF9JTkNfU1RBVFMobmV0LCBmaWVsZCkJU05NUF9JTkNfU1RBVFM2NCgobmV0KS0+bWliLmlwX3N0YXRpc3RpY3MsIGZpZWxkKQorI2RlZmluZSBJUF9JTkNfU1RBVFNfQkgobmV0LCBmaWVsZCkJU05NUF9JTkNfU1RBVFM2NF9CSCgobmV0KS0+bWliLmlwX3N0YXRpc3RpY3MsIGZpZWxkKQorI2RlZmluZSBJUF9BRERfU1RBVFMobmV0LCBmaWVsZCwgdmFsKQlTTk1QX0FERF9TVEFUUzY0KChuZXQpLT5taWIuaXBfc3RhdGlzdGljcywgZmllbGQsIHZhbCkKKyNkZWZpbmUgSVBfQUREX1NUQVRTX0JIKG5ldCwgZmllbGQsIHZhbCkgU05NUF9BRERfU1RBVFM2NF9CSCgobmV0KS0+bWliLmlwX3N0YXRpc3RpY3MsIGZpZWxkLCB2YWwpCisjZGVmaW5lIElQX1VQRF9QT19TVEFUUyhuZXQsIGZpZWxkLCB2YWwpIFNOTVBfVVBEX1BPX1NUQVRTNjQoKG5ldCktPm1pYi5pcF9zdGF0aXN0aWNzLCBmaWVsZCwgdmFsKQorI2RlZmluZSBJUF9VUERfUE9fU1RBVFNfQkgobmV0LCBmaWVsZCwgdmFsKSBTTk1QX1VQRF9QT19TVEFUUzY0X0JIKChuZXQpLT5taWIuaXBfc3RhdGlzdGljcywgZmllbGQsIHZhbCkKICNkZWZpbmUgTkVUX0lOQ19TVEFUUyhuZXQsIGZpZWxkKQlTTk1QX0lOQ19TVEFUUygobmV0KS0+bWliLm5ldF9zdGF0aXN0aWNzLCBmaWVsZCkKICNkZWZpbmUgTkVUX0lOQ19TVEFUU19CSChuZXQsIGZpZWxkKQlTTk1QX0lOQ19TVEFUU19CSCgobmV0KS0+bWliLm5ldF9zdGF0aXN0aWNzLCBmaWVsZCkKICNkZWZpbmUgTkVUX0lOQ19TVEFUU19VU0VSKG5ldCwgZmllbGQpIAlTTk1QX0lOQ19TVEFUU19VU0VSKChuZXQpLT5taWIubmV0X3N0YXRpc3RpY3MsIGZpZWxkKQpAQCAtMTc1LDcgKzE3OCwxNSBAQAogI2RlZmluZSBORVRfQUREX1NUQVRTX1VTRVIobmV0LCBmaWVsZCwgYWRuZCkgU05NUF9BRERfU1RBVFNfVVNFUigobmV0KS0+bWliLm5ldF9zdGF0aXN0aWNzLCBmaWVsZCwgYWRuZCkKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25tcF9mb2xkX2ZpZWxkKHZvaWQgX19wZXJjcHUgKm1pYltdLCBpbnQgb2ZmdCk7Ci1leHRlcm4gaW50IHNubXBfbWliX2luaXQodm9pZCBfX3BlcmNwdSAqcHRyWzJdLCBzaXplX3QgbWlic2l6ZSk7CisjaWYgQklUU19QRVJfTE9ORz09MzIKK2V4dGVybiB1NjQgc25tcF9mb2xkX2ZpZWxkNjQodm9pZCBfX3BlcmNwdSAqbWliW10sIGludCBvZmZ0LCBzaXplX3Qgc3luY19vZmYpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdTY0IHNubXBfZm9sZF9maWVsZDY0KHZvaWQgX19wZXJjcHUgKm1pYltdLCBpbnQgb2ZmdCwgc2l6ZV90IHN5bmNwX29mZikKK3sKKwlyZXR1cm4gc25tcF9mb2xkX2ZpZWxkKG1pYiwgb2ZmdCk7Cit9CisjZW5kaWYKK2V4dGVybiBpbnQgc25tcF9taWJfaW5pdCh2b2lkIF9fcGVyY3B1ICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgYWxpZ24pOwogZXh0ZXJuIHZvaWQgc25tcF9taWJfZnJlZSh2b2lkIF9fcGVyY3B1ICpwdHJbMl0pOwogCiBleHRlcm4gc3RydWN0IGxvY2FsX3BvcnRzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaCBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaAppbmRleCA0YjFkYzExLi4wNjJhODIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCkBAIC04NCwxMyArODQsMTEgQEAKIHN0cnVjdCBmaWI2X3RhYmxlOwogCiBzdHJ1Y3QgcnQ2X2luZm8gewotCXVuaW9uIHsKLQkJc3RydWN0IGRzdF9lbnRyeQlkc3Q7Ci0JfSB1OworCXN0cnVjdCBkc3RfZW50cnkJCWRzdDsKIAotI2RlZmluZSBydDZpX2RldgkJCXUuZHN0LmRldgotI2RlZmluZSBydDZpX25leHRob3AJCQl1LmRzdC5uZWlnaGJvdXIKLSNkZWZpbmUgcnQ2aV9leHBpcmVzCQkJdS5kc3QuZXhwaXJlcworI2RlZmluZSBydDZpX2RldgkJCWRzdC5kZXYKKyNkZWZpbmUgcnQ2aV9uZXh0aG9wCQkJZHN0Lm5laWdoYm91cgorI2RlZmluZSBydDZpX2V4cGlyZXMJCQlkc3QuZXhwaXJlcwogCiAJLyoKIAkgKiBUYWlsIGVsZW1lbnRzIG9mIGRzdF9lbnRyeSAoX19yZWZjbnQgZXRjLikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaCBiL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaAppbmRleCBmYmY5ZDFjLi5mYzk0ZWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oCkBAIC0yNyw2ICsyNyw2IEBACiAJX191OCB0eXBlOwkJLyogdHlwZS1jb2RlIGZvciBvcHRpb24gICAgICAgICAqLwogCV9fdTggbGVuZ3RoOwkJLyogb3B0aW9uIGxlbmd0aCAgICAgICAgICAgICAgICAqLwogCV9fdTggZW5jYXBfbGltaXQ7CS8qIHR1bm5lbCBlbmNhcHN1bGF0aW9uIGxpbWl0ICAgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCBmZTgyYjFlMS4uYTQ3NDdhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfdnMuaAorKysgYi9pbmNsdWRlL25ldC9pcF92cy5oCkBAIC02MzIsMTAgKzYzMiwyMiBAQAogKGludCBhZiwgaW50IHByb3RvY29sLCBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnNfYWRkciwgX19iZTE2IHNfcG9ydCwKICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmRfYWRkciwgX19iZTE2IGRfcG9ydCk7CiAKK3N0cnVjdCBpcF92c19jb25uICogaXBfdnNfY29ubl9pbl9nZXRfcHJvdG8oaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkJCQkJICAgIGludCBpbnZlcnNlKTsKKwogZXh0ZXJuIHN0cnVjdCBpcF92c19jb25uICppcF92c19jb25uX291dF9nZXQKIChpbnQgYWYsIGludCBwcm90b2NvbCwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpzX2FkZHIsIF9fYmUxNiBzX3BvcnQsCiAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkX2FkZHIsIF9fYmUxNiBkX3BvcnQpOwogCitzdHJ1Y3QgaXBfdnNfY29ubiAqIGlwX3ZzX2Nvbm5fb3V0X2dldF9wcm90byhpbnQgYWYsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAorCQkJCQkgICAgIGludCBpbnZlcnNlKTsKKwogLyogcHV0IGJhY2sgdGhlIGNvbm4gd2l0aG91dCByZXN0YXJ0aW5nIGl0cyB0aW1lciAqLwogc3RhdGljIGlubGluZSB2b2lkIF9faXBfdnNfY29ubl9wdXQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQogewpAQCAtNzM2LDggKzc0OCw2IEBACiAKIGV4dGVybiBpbnQgaXBfdnNfYXBwX3BrdF9vdXQoc3RydWN0IGlwX3ZzX2Nvbm4gKiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50IGlwX3ZzX2FwcF9wa3RfaW4oc3RydWN0IGlwX3ZzX2Nvbm4gKiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gaW50IGlwX3ZzX3NrYl9yZXBsYWNlKHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IHByaSwKLQkJCSAgICAgY2hhciAqb19idWYsIGludCBvX2xlbiwgY2hhciAqbl9idWYsIGludCBuX2xlbik7CiBleHRlcm4gaW50IGlwX3ZzX2FwcF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXBfdnNfYXBwX2NsZWFudXAodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwaXAuaCBiL2luY2x1ZGUvbmV0L2lwaXAuaAppbmRleCAxMWU4NTEzLi42NWNhZWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcGlwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBpcC5oCkBAIC01MCw3ICs1MCw3IEBACiAJaW50IHBrdF9sZW4gPSBza2ItPmxlbiAtIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CQlcCiAJCQkJCQkJCQlcCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkJCQkJXAotCWlwX3NlbGVjdF9pZGVudChpcGgsICZydC0+dS5kc3QsIE5VTEwpOwkJCQlcCisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT5kc3QsIE5VTEwpOwkJCQlcCiAJCQkJCQkJCQlcCiAJZXJyID0gaXBfbG9jYWxfb3V0KHNrYik7CQkJCQlcCiAJaWYgKGxpa2VseShuZXRfeG1pdF9ldmFsKGVycikgPT0gMCkpIHsJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB2Ni5oIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCmluZGV4IDI2MDBiNjkuLjFmODQxMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwdjYuaAorKysgYi9pbmNsdWRlL25ldC9pcHY2LmgKQEAgLTEzNiwxNyArMTM2LDE3IEBACiAvKiBNSUJzICovCiAKICNkZWZpbmUgSVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsZmllbGQpCQlcCi0JCV9ERVZJTkMobmV0LCBpcHY2LCAsIGlkZXYsIGZpZWxkKQorCQlfREVWSU5DKG5ldCwgaXB2NiwgNjQsIGlkZXYsIGZpZWxkKQogI2RlZmluZSBJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaWRldixmaWVsZCkJXAotCQlfREVWSU5DKG5ldCwgaXB2NiwgX0JILCBpZGV2LCBmaWVsZCkKKwkJX0RFVklOQyhuZXQsIGlwdjYsIDY0X0JILCBpZGV2LCBmaWVsZCkKICNkZWZpbmUgSVA2X0FERF9TVEFUUyhuZXQsIGlkZXYsZmllbGQsdmFsKQlcCi0JCV9ERVZBREQobmV0LCBpcHY2LCAsIGlkZXYsIGZpZWxkLCB2YWwpCisJCV9ERVZBREQobmV0LCBpcHY2LCA2NCwgaWRldiwgZmllbGQsIHZhbCkKICNkZWZpbmUgSVA2X0FERF9TVEFUU19CSChuZXQsIGlkZXYsZmllbGQsdmFsKQlcCi0JCV9ERVZBREQobmV0LCBpcHY2LCBfQkgsIGlkZXYsIGZpZWxkLCB2YWwpCisJCV9ERVZBREQobmV0LCBpcHY2LCA2NF9CSCwgaWRldiwgZmllbGQsIHZhbCkKICNkZWZpbmUgSVA2X1VQRF9QT19TVEFUUyhuZXQsIGlkZXYsZmllbGQsdmFsKSAgIFwKLQkJX0RFVlVQRChuZXQsIGlwdjYsICwgaWRldiwgZmllbGQsIHZhbCkKKwkJX0RFVlVQRChuZXQsIGlwdjYsIDY0LCBpZGV2LCBmaWVsZCwgdmFsKQogI2RlZmluZSBJUDZfVVBEX1BPX1NUQVRTX0JIKG5ldCwgaWRldixmaWVsZCx2YWwpICAgXAotCQlfREVWVVBEKG5ldCwgaXB2NiwgX0JILCBpZGV2LCBmaWVsZCwgdmFsKQorCQlfREVWVVBEKG5ldCwgaXB2NiwgNjRfQkgsIGlkZXYsIGZpZWxkLCB2YWwpCiAjZGVmaW5lIElDTVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsIGZpZWxkKQlcCiAJCV9ERVZJTkMobmV0LCBpY21wdjYsICwgaWRldiwgZmllbGQpCiAjZGVmaW5lIElDTVA2X0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIGZpZWxkKQlcCkBAIC01NTEsNiArNTUxLDEwIEBACiAKIGV4dGVybiBpbnQgaXB2Nl9maW5kX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSk7CiAKK2V4dGVybiBzdHJ1Y3QgaW42X2FkZHIgKmZsNl91cGRhdGVfZHN0KHN0cnVjdCBmbG93aSAqZmwsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LAorCQkJCSAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKm9yaWcpOworCiAvKgogICoJc29ja2V0IG9wdGlvbnMgKGlwdjZfc29ja2dsdWUuYykKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB4LmggYi9pbmNsdWRlL25ldC9pcHguaAppbmRleCBlZjUxYTY2Li4wNWQ3ZTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHguaAorKysgYi9pbmNsdWRlL25ldC9pcHguaApAQCAtMjcsOSArMjcsOSBAQAogI2RlZmluZSBJUFhfTUFYX1BQUk9QX0hPUFMgOAogCiBzdHJ1Y3QgaXB4aGRyIHsKLQlfX2JlMTYJCQlpcHhfY2hlY2tzdW0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCV9fYmUxNgkJCWlweF9jaGVja3N1bSBfX3BhY2tlZDsKICNkZWZpbmUgSVBYX05PX0NIRUNLU1VNCWNwdV90b19iZTE2KDB4RkZGRikKLQlfX2JlMTYJCQlpcHhfcGt0c2l6ZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJX19iZTE2CQkJaXB4X3BrdHNpemUgX19wYWNrZWQ7CiAJX191OAkJCWlweF90Y3RybDsKIAlfX3U4CQkJaXB4X3R5cGU7CiAjZGVmaW5lIElQWF9UWVBFX1VOS05PV04JMHgwMApAQCAtMzgsOCArMzgsOCBAQAogI2RlZmluZSBJUFhfVFlQRV9TUFgJCTB4MDUJLyogU1BYIHByb3RvY29sICovCiAjZGVmaW5lIElQWF9UWVBFX05DUAkJMHgxMQkvKiAkbG90cyBmb3IgZG9jcyBvbiB0aGlzIChTUElUKSAqLwogI2RlZmluZSBJUFhfVFlQRV9QUFJPUAkJMHgxNAkvKiBjb21wbGljYXRlZCBmbG9vZCBmaWxsIGJyZGNhc3QgKi8KLQlzdHJ1Y3QgaXB4X2FkZHJlc3MJaXB4X2Rlc3QgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCXN0cnVjdCBpcHhfYWRkcmVzcwlpcHhfc291cmNlIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwlzdHJ1Y3QgaXB4X2FkZHJlc3MJaXB4X2Rlc3QgX19wYWNrZWQ7CisJc3RydWN0IGlweF9hZGRyZXNzCWlweF9zb3VyY2UgX19wYWNrZWQ7CiB9OwogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXB4aGRyICppcHhfaGRyKHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcmRhL2lyZGEuaCBiL2luY2x1ZGUvbmV0L2lyZGEvaXJkYS5oCmluZGV4IDdlNTgyMDYuLjNiZWQ2MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lyZGEvaXJkYS5oCisrKyBiL2luY2x1ZGUvbmV0L2lyZGEvaXJkYS5oCkBAIC01MywxMCArNTMsNiBAQAogI2lmbmRlZiBJUkRBX0FMSUdOCiAjICBkZWZpbmUgSVJEQV9BTElHTiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKSkKICNlbmRpZgotI2lmbmRlZiBJUkRBX1BBQ0sKLSMgIGRlZmluZSBJUkRBX1BBQ0sgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKLSNlbmRpZgotCiAKICNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcmRhL2lybGFwX2ZyYW1lLmggYi9pbmNsdWRlL25ldC9pcmRhL2lybGFwX2ZyYW1lLmgKaW5kZXggNjQxZjg4ZS4uNmIxZGM0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lyZGEvaXJsYXBfZnJhbWUuaApAQCAtODUsNyArODUsNyBAQAogc3RydWN0IGRpc2NfZnJhbWUgewogCV9fdTggY2FkZHI7ICAgICAgICAgIC8qIENvbm5lY3Rpb24gYWRkcmVzcyAqLwogCV9fdTggY29udHJvbDsKLX0gSVJEQV9QQUNLOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHhpZF9mcmFtZSB7CiAJX191OCAgY2FkZHI7IC8qIENvbm5lY3Rpb24gYWRkcmVzcyAqLwpAQCAtOTYsNDEgKzk2LDQxIEBACiAJX191OCAgZmxhZ3M7IC8qIERpc2NvdmVyeSBmbGFncyAqLwogCV9fdTggIHNsb3RucjsKIAlfX3U4ICB2ZXJzaW9uOwotfSBJUkRBX1BBQ0s7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdGVzdF9mcmFtZSB7CiAJX191OCBjYWRkcjsgICAgICAgICAgLyogQ29ubmVjdGlvbiBhZGRyZXNzICovCiAJX191OCBjb250cm9sOwogCV9fbGUzMiBzYWRkcjsgICAgICAgICAvKiBTb3VyY2UgZGV2aWNlIGFkZHJlc3MgKi8KIAlfX2xlMzIgZGFkZHI7ICAgICAgICAgLyogRGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KLX0gSVJEQV9QQUNLOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHVhX2ZyYW1lIHsKIAlfX3U4IGNhZGRyOwogCV9fdTggY29udHJvbDsKIAlfX2xlMzIgc2FkZHI7IC8qIFNvdXJjZSBkZXZpY2UgYWRkcmVzcyAqLwogCV9fbGUzMiBkYWRkcjsgLyogRGVzdCBkZXZpY2UgYWRkcmVzcyAqLwotfSBJUkRBX1BBQ0s7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgZG1fZnJhbWUgewogCV9fdTggY2FkZHI7ICAgICAgICAgIC8qIENvbm5lY3Rpb24gYWRkcmVzcyAqLwogCV9fdTggY29udHJvbDsKLX0gSVJEQV9QQUNLOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHJkX2ZyYW1lIHsKIAlfX3U4IGNhZGRyOyAgICAgICAgICAvKiBDb25uZWN0aW9uIGFkZHJlc3MgKi8KIAlfX3U4IGNvbnRyb2w7Ci19IElSREFfUEFDSzsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBycl9mcmFtZSB7CiAJX191OCBjYWRkcjsgICAgICAgICAgLyogQ29ubmVjdGlvbiBhZGRyZXNzICovCiAJX191OCBjb250cm9sOwotfSBJUkRBX1BBQ0s7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaV9mcmFtZSB7CiAJX191OCBjYWRkcjsKIAlfX3U4IGNvbnRyb2w7Ci19IElSREFfUEFDSzsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBzbnJtX2ZyYW1lIHsKIAlfX3U4ICBjYWRkcjsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCV9fbGUzMiBzYWRkcjsKIAlfX2xlMzIgZGFkZHI7CiAJX191OCAgbmNhZGRyOwotfSBJUkRBX1BBQ0s7Cit9IF9fcGFja2VkOwogCiB2b2lkIGlybGFwX3F1ZXVlX3htaXQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgaXJsYXBfc2VuZF9kaXNjb3ZlcnlfeGlkX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqLCBpbnQgUywgX191OCBzLCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2xpYjgwMjExLmggYi9pbmNsdWRlL25ldC9saWI4MDIxMS5oCmluZGV4IGZiNGUyNzguLjg0OGNjZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2xpYjgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvbGliODAyMTEuaApAQCAtNTQsOSArNTQsNiBAQAogCS8qIGRlaW5pdGlhbGl6ZSBjcnlwdG8gY29udGV4dCBhbmQgZnJlZSBhbGxvY2F0ZWQgcHJpdmF0ZSBkYXRhICovCiAJdm9pZCAoKmRlaW5pdCkgKHZvaWQgKnByaXYpOwogCi0JaW50ICgqYnVpbGRfaXYpIChzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgaW50IGhkcl9sZW4sCi0JCQkgdTggKmtleSwgaW50IGtleWxlbiwgdm9pZCAqcHJpdik7Ci0KIAkvKiBlbmNyeXB0L2RlY3J5cHQgcmV0dXJuIDwgMCBvbiBlcnJvciBvciA+PSAwIG9uIHN1Y2Nlc3MuIFRoZSByZXR1cm4KIAkgKiB2YWx1ZSBmcm9tIGRlY3J5cHRfbXBkdSBpcyBwYXNzZWQgYXMgdGhlIGtleWlkeCB2YWx1ZSBmb3IKIAkgKiBkZWNyeXB0X21zZHUuIHNrYiBtdXN0IGhhdmUgZW5vdWdoIGhlYWQgYW5kIHRhaWwgcm9vbSBmb3IgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAppbmRleCBkZTIyY2JmLi5iMDc4N2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKQEAgLTE0Niw2ICsxNDYsOSBAQAogICoJZW5hYmxlZC9kaXNhYmxlZCAoYmVhY29uaW5nIG1vZGVzKQogICogQEJTU19DSEFOR0VEX0NRTTogQ29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgY29uZmlnIGNoYW5nZWQKICAqIEBCU1NfQ0hBTkdFRF9JQlNTOiBJQlNTIGpvaW4gc3RhdHVzIGNoYW5nZWQKKyAqIEBCU1NfQ0hBTkdFRF9BUlBfRklMVEVSOiBIYXJkd2FyZSBBUlAgZmlsdGVyIGFkZHJlc3MgbGlzdCBvciBzdGF0ZSBjaGFuZ2VkLgorICogQEJTU19DSEFOR0VEX1FPUzogUW9TIGZvciB0aGlzIGFzc29jaWF0aW9uIHdhcyBlbmFibGVkL2Rpc2FibGVkLiBOb3RlCisgKgl0aGF0IGl0IGlzIG9ubHkgZXZlciBkaXNhYmxlZCBmb3Igc3RhdGlvbiBtb2RlLgogICovCiBlbnVtIGllZWU4MDIxMV9ic3NfY2hhbmdlIHsKIAlCU1NfQ0hBTkdFRF9BU1NPQwkJPSAxPDwwLApAQCAtMTYwLDEwICsxNjMsMTkgQEAKIAlCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRAk9IDE8PDksCiAJQlNTX0NIQU5HRURfQ1FNCQkJPSAxPDwxMCwKIAlCU1NfQ0hBTkdFRF9JQlNTCQk9IDE8PDExLAorCUJTU19DSEFOR0VEX0FSUF9GSUxURVIJCT0gMTw8MTIsCisJQlNTX0NIQU5HRURfUU9TCQkJPSAxPDwxMywKIAogCS8qIHdoZW4gYWRkaW5nIGhlcmUsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgaWVlZTgwMjExX3JlY29uZmlnICovCiB9OwogCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIElQdjQgYWRkcmVzc2VzIGxpc3RlZCBmb3IgQVJQIGZpbHRlcmluZy4gSWYgdGhlIG51bWJlcgorICogb2YgYWRkcmVzc2VzIGZvciBhbiBpbnRlcmZhY2UgaW5jcmVhc2UgYmV5b25kIHRoaXMgdmFsdWUsIGhhcmR3YXJlIEFSUAorICogZmlsdGVyaW5nIHdpbGwgYmUgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0JTU19BUlBfQUREUl9MSVNUX0xFTiA0CisKIC8qKgogICogc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAtIGhvbGRzIHRoZSBCU1MncyBjaGFuZ2luZyBwYXJhbWV0ZXJzCiAgKgpAQCAtMTgyLDcgKzE5NCw5IEBACiAgKglpZiB0aGUgaGFyZHdhcmUgY2Fubm90IGhhbmRsZSB0aGlzIGl0IG11c3Qgc2V0IHRoZQogICoJSUVFRTgwMjExX0hXXzJHSFpfU0hPUlRfU0xPVF9JTkNBUEFCTEUgaGFyZHdhcmUgZmxhZwogICogQGR0aW1fcGVyaW9kOiBudW0gb2YgYmVhY29ucyBiZWZvcmUgdGhlIG5leHQgRFRJTSwgZm9yIGJlYWNvbmluZywKLSAqCW5vdCB2YWxpZCBpbiBzdGF0aW9uIG1vZGUgKGNmLiBodyBjb25mIHBzX2R0aW1fcGVyaW9kKQorICoJdmFsaWQgaW4gc3RhdGlvbiBtb2RlIG9ubHkgd2hpbGUgQGFzc29jIGlzIHRydWUgYW5kIGlmIGFsc28KKyAqCXJlcXVlc3RlZCBieSAlSUVFRTgwMjExX0hXX05FRURfRFRJTV9QRVJJT0QgKGNmLiBhbHNvIGh3IGNvbmYKKyAqCUBwc19kdGltX3BlcmlvZCkKICAqIEB0aW1lc3RhbXA6IGJlYWNvbiB0aW1lc3RhbXAKICAqIEBiZWFjb25faW50OiBiZWFjb24gaW50ZXJ2YWwKICAqIEBhc3NvY19jYXBhYmlsaXR5OiBjYXBhYmlsaXRpZXMgdGFrZW4gZnJvbSBhc3NvYyByZXNwCkBAIC0xOTksNiArMjEzLDE2IEBACiAgKiBAY3FtX3Jzc2lfdGhvbGQ6IENvbm5lY3Rpb24gcXVhbGl0eSBtb25pdG9yIFJTU0kgdGhyZXNob2xkLCBhIHplcm8gdmFsdWUKICAqCWltcGxpZXMgZGlzYWJsZWQKICAqIEBjcW1fcnNzaV9oeXN0OiBDb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBSU1NJIGh5c3RlcmVzaXMKKyAqIEBhcnBfYWRkcl9saXN0OiBMaXN0IG9mIElQdjQgYWRkcmVzc2VzIGZvciBoYXJkd2FyZSBBUlAgZmlsdGVyaW5nLiBUaGUKKyAqCW1heSBmaWx0ZXIgQVJQIHF1ZXJpZXMgdGFyZ2V0ZWQgZm9yIG90aGVyIGFkZHJlc3NlcyB0aGFuIGxpc3RlZCBoZXJlLgorICoJVGhlIGRyaXZlciBtdXN0IGFsbG93IEFSUCBxdWVyaWVzIHRhcmdldGVkIGZvciBhbGwgYWRkcmVzcyBsaXN0ZWQgaGVyZQorICoJdG8gcGFzcyB0aHJvdWdoLiBBbiBlbXB0eSBsaXN0IGltcGxpZXMgbm8gQVJQIHF1ZXJpZXMgbmVlZCB0byBwYXNzLgorICogQGFycF9hZGRyX2NudDogTnVtYmVyIG9mIGFkZHJlc3NlcyBjdXJyZW50bHkgb24gdGhlIGxpc3QuCisgKiBAYXJwX2ZpbHRlcl9lbmFibGVkOiBFbmFibGUgQVJQIGZpbHRlcmluZyAtIGlmIGVuYWJsZWQsIHRoZSBoYXJkd2FyZSBtYXkKKyAqCWZpbHRlciBBUlAgcXVlcmllcyBiYXNlZCBvbiB0aGUgQGFycF9hZGRyX2xpc3QsIGlmIGRpc2FibGVkLCB0aGUKKyAqCWhhcmR3YXJlIG11c3Qgbm90IHBlcmZvcm0gYW55IEFSUCBmaWx0ZXJpbmcuIE5vdGUsIHRoYXQgdGhlIGZpbHRlciB3aWxsCisgKgliZSBlbmFibGVkIGFsc28gaW4gcHJvbWlzY3VvdXMgbW9kZS4KKyAqIEBxb3M6IFRoaXMgaXMgYSBRb1MtZW5hYmxlZCBCU1MuCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgewogCWNvbnN0IHU4ICpic3NpZDsKQEAgLTIxOSw2ICsyNDMsMTAgQEAKIAlzMzIgY3FtX3Jzc2lfdGhvbGQ7CiAJdTMyIGNxbV9yc3NpX2h5c3Q7CiAJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGU7CisJX19iZTMyIGFycF9hZGRyX2xpc3RbSUVFRTgwMjExX0JTU19BUlBfQUREUl9MSVNUX0xFTl07CisJdTggYXJwX2FkZHJfY250OworCWJvb2wgYXJwX2ZpbHRlcl9lbmFibGVkOworCWJvb2wgcW9zOwogfTsKIAogLyoqCkBAIC0zMTIsOSArMzQwLDEwIEBACiAJSUVFRTgwMjExX1RYX0lOVEZMX05MODAyMTFfRlJBTUVfVFgJPSBCSVQoMjEpLAogCUlFRUU4MDIxMV9UWF9DVExfTERQQwkJCT0gQklUKDIyKSwKIAlJRUVFODAyMTFfVFhfQ1RMX1NUQkMJCQk9IEJJVCgyMykgfCBCSVQoMjQpLAotI2RlZmluZSBJRUVFODAyMTFfVFhfQ1RMX1NUQkNfU0hJRlQJCTIzCiB9OwogCisjZGVmaW5lIElFRUU4MDIxMV9UWF9DVExfU1RCQ19TSElGVAkJMjMKKwogLyoqCiAgKiBlbnVtIG1hYzgwMjExX3JhdGVfY29udHJvbF9mbGFncyAtIHBlci1yYXRlIGZsYWdzIHNldCBieSB0aGUKICAqCVJhdGUgQ29udHJvbCBhbGdvcml0aG0uCkBAIC0zOTAsNyArNDE5LDcgQEAKIAlzOCBpZHg7CiAJdTggY291bnQ7CiAJdTggZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqCiAgKiBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gLSBza2IgdHJhbnNtaXQgaW5mb3JtYXRpb24KQEAgLTQxMiw4ICs0NDEsNiBAQAogICogQGRyaXZlcl9kYXRhOiBhcnJheSBvZiBkcml2ZXJfZGF0YSBwb2ludGVycwogICogQGFtcGR1X2Fja19sZW46IG51bWJlciBvZiBhY2tlZCBhZ2dyZWdhdGVkIGZyYW1lcy4KICAqIAlyZWxldmFudCBvbmx5IGlmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVIHdhcyBzZXQuCi0gKiBAYW1wZHVfYWNrX21hcDogYmxvY2sgYWNrIGJpdCBtYXAgZm9yIHRoZSBhZ2dyZWdhdGlvbi4KLSAqIAlyZWxldmFudCBvbmx5IGlmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVIHdhcyBzZXQuCiAgKiBAYW1wZHVfbGVuOiBudW1iZXIgb2YgYWdncmVnYXRlZCBmcmFtZXMuCiAgKiAJcmVsZXZhbnQgb25seSBpZiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSB3YXMgc2V0LgogICogQGFja19zaWduYWw6IHNpZ25hbCBzdHJlbmd0aCBvZiB0aGUgQUNLIGZyYW1lCkBAIC00NDgsMTAgKzQ3NSw5IEBACiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgcmF0ZXNbSUVFRTgwMjExX1RYX01BWF9SQVRFU107CiAJCQl1OCBhbXBkdV9hY2tfbGVuOwotCQkJdTY0IGFtcGR1X2Fja19tYXA7CiAJCQlpbnQgYWNrX3NpZ25hbDsKIAkJCXU4IGFtcGR1X2xlbjsKLQkJCS8qIDcgYnl0ZXMgZnJlZSAqLworCQkJLyogMTUgYnl0ZXMgZnJlZSAqLwogCQl9IHN0YXR1czsKIAkJc3RydWN0IHsKIAkJCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSBkcml2ZXJfcmF0ZXNbCkBAIC02MDEsMTUgKzYyNywxNCBAQAogICoJbWF5IHR1cm4gdGhlIGRldmljZSBvZmYgYXMgbXVjaCBhcyBwb3NzaWJsZS4gVHlwaWNhbGx5LCB0aGlzIGZsYWcgd2lsbAogICoJYmUgc2V0IHdoZW4gYW4gaW50ZXJmYWNlIGlzIHNldCBVUCBidXQgbm90IGFzc29jaWF0ZWQgb3Igc2Nhbm5pbmcsIGJ1dAogICoJaXQgY2FuIGFsc28gYmUgdW5zZXQgaW4gdGhhdCBjYXNlIHdoZW4gbW9uaXRvciBpbnRlcmZhY2VzIGFyZSBhY3RpdmUuCi0gKiBASUVFRTgwMjExX0NPTkZfUU9TOiBFbmFibGUgODAyLjExZSBRb1MgYWxzbyBrbm93IGFzIFdNTSAoV2lyZWxlc3MKLSAqICAgICAgTXVsdGltZWRpYSkuIE9uIHNvbWUgZHJpdmVycyAoaXdsd2lmaSBpcyBvbmUgb2Yga25vdykgd2UgaGF2ZQotICogICAgICB0byBlbmFibGUvZGlzYWJsZSBRb1MgZXhwbGljaXRseS4KKyAqIEBJRUVFODAyMTFfQ09ORl9PRkZDSEFOTkVMOiBUaGUgZGV2aWNlIGlzIGN1cnJlbnRseSBub3Qgb24gaXRzIG1haW4KKyAqCW9wZXJhdGluZyBjaGFubmVsLgogICovCiBlbnVtIGllZWU4MDIxMV9jb25mX2ZsYWdzIHsKIAlJRUVFODAyMTFfQ09ORl9NT05JVE9SCQk9ICgxPDwwKSwKIAlJRUVFODAyMTFfQ09ORl9QUwkJPSAoMTw8MSksCiAJSUVFRTgwMjExX0NPTkZfSURMRQkJPSAoMTw8MiksCi0JSUVFRTgwMjExX0NPTkZfUU9TCQk9ICgxPDwzKSwKKwlJRUVFODAyMTFfQ09ORl9PRkZDSEFOTkVMCT0gKDE8PDMpLAogfTsKIAogCkBAIC02MjQsNyArNjQ5LDYgQEAKICAqIEBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUkVUUllfTElNSVRTOiByZXRyeSBsaW1pdHMgY2hhbmdlZAogICogQElFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFOiBJZGxlIGZsYWcgY2hhbmdlZAogICogQElFRUU4MDIxMV9DT05GX0NIQU5HRV9TTVBTOiBTcGF0aWFsIG11bHRpcGxleGluZyBwb3dlcnNhdmUgbW9kZSBjaGFuZ2VkCi0gKiBASUVFRTgwMjExX0NPTkZfQ0hBTkdFX1FPUzogUXVhbGl0eSBvZiBzZXJ2aWNlIHdhcyBlbmFibGVkIG9yIGRpc2FibGVkCiAgKi8KIGVudW0gaWVlZTgwMjExX2NvbmZfY2hhbmdlZCB7CiAJSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1NNUFMJCT0gQklUKDEpLApAQCAtNjM1LDcgKzY1OSw2IEBACiAJSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwJCT0gQklUKDYpLAogCUlFRUU4MDIxMV9DT05GX0NIQU5HRV9SRVRSWV9MSU1JVFMJPSBCSVQoNyksCiAJSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0lETEUJCT0gQklUKDgpLAotCUlFRUU4MDIxMV9DT05GX0NIQU5HRV9RT1MJCT0gQklUKDkpLAogfTsKIAogLyoqCkBAIC02NzYsOSArNjk5LDYgQEAKICAqIEBkeW5hbWljX3BzX3RpbWVvdXQ6IFRoZSBkeW5hbWljIHBvd2Vyc2F2ZSB0aW1lb3V0IChpbiBtcyksIHNlZSB0aGUKICAqCXBvd2Vyc2F2ZSBkb2N1bWVudGF0aW9uIGJlbG93LiBUaGlzIHZhcmlhYmxlIGlzIHZhbGlkIG9ubHkgd2hlbgogICoJdGhlIENPTkZfUFMgZmxhZyBpcyBzZXQuCi0gKiBAZHluYW1pY19wc19mb3JjZWRfdGltZW91dDogVGhlIGR5bmFtaWMgcG93ZXJzYXZlIHRpbWVvdXQgKGluIG1zKSBjb25maWd1cmVkCi0gKglieSBjZmc4MDIxMSAoZXNzZW50aWFsbHksIHdleHQpIElmIHNldCwgdGhpcyB2YWx1ZSBvdmVycnVsZXMgdGhlIHZhbHVlCi0gKgljaG9zZW4gYnkgbWFjODAyMTEgYmFzZWQgb24gcHMgcW9zIG5ldHdvcmsgbGF0ZW5jeS4KICAqCiAgKiBAcG93ZXJfbGV2ZWw6IHJlcXVlc3RlZCB0cmFuc21pdCBwb3dlciAoaW4gZEJtKQogICoKQEAgLTY5OCw3ICs3MTgsNyBAQAogICovCiBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgewogCXUzMiBmbGFnczsKLQlpbnQgcG93ZXJfbGV2ZWwsIGR5bmFtaWNfcHNfdGltZW91dCwgZHluYW1pY19wc19mb3JjZWRfdGltZW91dDsKKwlpbnQgcG93ZXJfbGV2ZWwsIGR5bmFtaWNfcHNfdGltZW91dDsKIAlpbnQgbWF4X3NsZWVwX3BlcmlvZDsKIAogCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CkBAIC04MTUsNyArODM1LDYgQEAKICAqCWVuY3J5cHRlZCBpbiBoYXJkd2FyZS4KICAqIEBhbGc6IFRoZSBrZXkgYWxnb3JpdGhtLgogICogQGZsYWdzOiBrZXkgZmxhZ3MsIHNlZSAmZW51bSBpZWVlODAyMTFfa2V5X2ZsYWdzLgotICogQGFwX2FkZHI6IEFQJ3MgTUFDIGFkZHJlc3MKICAqIEBrZXlpZHg6IHRoZSBrZXkgaW5kZXggKDAtMykKICAqIEBrZXlsZW46IGtleSBtYXRlcmlhbCBsZW5ndGgKICAqIEBrZXk6IGtleSBtYXRlcmlhbC4gRm9yIEFMR19US0lQIHRoZSBrZXkgaXMgZW5jb2RlZCBhcyBhIDI1Ni1iaXQgKDMyIGJ5dGUpCkBAIC04ODEsMTYgKzkwMCwxMiBAQAogICogZW51bSBzdGFfbm90aWZ5X2NtZCAtIHN0YSBub3RpZnkgY29tbWFuZAogICoKICAqIFVzZWQgd2l0aCB0aGUgc3RhX25vdGlmeSgpIGNhbGxiYWNrIGluICZzdHJ1Y3QgaWVlZTgwMjExX29wcywgdGhpcwotICogaW5kaWNhdGVzIGFkZGl0aW9uIGFuZCByZW1vdmFsIG9mIGEgc3RhdGlvbiB0byBzdGF0aW9uIHRhYmxlLAotICogb3IgaWYgYSBhc3NvY2lhdGVkIHN0YXRpb24gbWFkZSBhIHBvd2VyIHN0YXRlIHRyYW5zaXRpb24uCisgKiBpbmRpY2F0ZXMgaWYgYW4gYXNzb2NpYXRlZCBzdGF0aW9uIG1hZGUgYSBwb3dlciBzdGF0ZSB0cmFuc2l0aW9uLgogICoKLSAqIEBTVEFfTk9USUZZX0FERDogKERFUFJFQ0FURUQpIGEgc3RhdGlvbiB3YXMgYWRkZWQgdG8gdGhlIHN0YXRpb24gdGFibGUKLSAqIEBTVEFfTk9USUZZX1JFTU9WRTogKERFUFJFQ0FURUQpIGEgc3RhdGlvbiBiZWluZyByZW1vdmVkIGZyb20gdGhlIHN0YXRpb24gdGFibGUKICAqIEBTVEFfTk9USUZZX1NMRUVQOiBhIHN0YXRpb24gaXMgbm93IHNsZWVwaW5nCiAgKiBAU1RBX05PVElGWV9BV0FLRTogYSBzbGVlcGluZyBzdGF0aW9uIHdva2UgdXAKICAqLwogZW51bSBzdGFfbm90aWZ5X2NtZCB7Ci0JU1RBX05PVElGWV9BREQsIFNUQV9OT1RJRllfUkVNT1ZFLAogCVNUQV9OT1RJRllfU0xFRVAsIFNUQV9OT1RJRllfQVdBS0UsCiB9OwogCkBAIC0xMDE0LDYgKzEwMjksOSBAQAogICoJY29ubmVjdGlvbiBxdWFsaXR5IHJlbGF0ZWQgcGFyYW1ldGVycywgc3VjaCBhcyB0aGUgUlNTSSBsZXZlbCBhbmQKICAqCXByb3ZpZGUgbm90aWZpY2F0aW9ucyBpZiBjb25maWd1cmVkIHRyaWdnZXIgbGV2ZWxzIGFyZSByZWFjaGVkLgogICoKKyAqIEBJRUVFODAyMTFfSFdfTkVFRF9EVElNX1BFUklPRDoKKyAqCVRoaXMgZGV2aWNlIG5lZWRzIHRvIGtub3cgdGhlIERUSU0gcGVyaW9kIGZvciB0aGUgQlNTIGJlZm9yZQorICoJYXNzb2NpYXRpbmcuCiAgKi8KIGVudW0gaWVlZTgwMjExX2h3X2ZsYWdzIHsKIAlJRUVFODAyMTFfSFdfSEFTX1JBVEVfQ09OVFJPTAkJCT0gMTw8MCwKQEAgLTEwMjMsNyArMTA0MSw3IEBACiAJSUVFRTgwMjExX0hXXzJHSFpfU0hPUlRfUFJFQU1CTEVfSU5DQVBBQkxFCT0gMTw8NCwKIAlJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BFQwkJCT0gMTw8NSwKIAlJRUVFODAyMTFfSFdfU0lHTkFMX0RCTQkJCQk9IDE8PDYsCi0JLyogdXNlIHRoaXMgaG9sZSAqLworCUlFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9ECQkJPSAxPDw3LAogCUlFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UCQkJPSAxPDw4LAogCUlFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTgkJCT0gMTw8OSwKIAlJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMJCQk9IDE8PDEwLApAQCAtMTI2MCw2ICsxMjc4LDE1IEBACiAgKiBkeW5hbWljIFBTIGZlYXR1cmUgaW4gc3RhY2sgYW5kIHdpbGwganVzdCBrZWVwICVJRUVFODAyMTFfQ09ORl9QUwogICogZW5hYmxlZCB3aGVuZXZlciB1c2VyIGhhcyBlbmFibGVkIHBvd2Vyc2F2ZS4KICAqCisgKiBTb21lIGhhcmR3YXJlIG5lZWQgdG8gdG9nZ2xlIGEgc2luZ2xlIHNoYXJlZCBhbnRlbm5hIGJldHdlZW4gV0xBTiBhbmQKKyAqIEJsdWV0b290aCB0byBmYWNpbGl0YXRlIGNvLWV4aXN0ZW5jZS4gVGhlc2UgdHlwZXMgb2YgaGFyZHdhcmUgc2V0CisgKiBsaW1pdGF0aW9ucyBvbiB0aGUgdXNlIG9mIGhvc3QgY29udHJvbGxlZCBkeW5hbWljIHBvd2Vyc2F2ZSB3aGVuZXZlciB0aGVyZQorICogaXMgc2ltdWx0YW5lb3VzIFdMQU4gYW5kIEJsdWV0b290aCB0cmFmZmljLiBGb3IgdGhlc2UgdHlwZXMgb2YgaGFyZHdhcmUsIHRoZQorICogZHJpdmVyIG1heSByZXF1ZXN0IHRlbXBvcmFyaWx5IGdvaW5nIGludG8gZnVsbCBwb3dlciBzYXZlLCBpbiBvcmRlciB0bworICogZW5hYmxlIHRvZ2dsaW5nIHRoZSBhbnRlbm5hIGJldHdlZW4gQlQgYW5kIFdMQU4uIElmIHRoZSBkcml2ZXIgcmVxdWVzdHMKKyAqIGRpc2FibGluZyBkeW5hbWljIHBvd2Vyc2F2ZSwgdGhlIEBkeW5hbWljX3BzX3RpbWVvdXQgdmFsdWUgd2lsbCBiZQorICogdGVtcG9yYXJpbHkgc2V0IHRvIHplcm8gdW50aWwgdGhlIGRyaXZlciByZS1lbmFibGVzIGR5bmFtaWMgcG93ZXJzYXZlLgorICoKICAqIERyaXZlciBpbmZvcm1zIFUtQVBTRCBjbGllbnQgc3VwcG9ydCBieSBlbmFibGluZwogICogJUlFRUU4MDIxMV9IV19TVVBQT1JUU19VQVBTRCBmbGFnLiBUaGUgbW9kZSBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlCiAgKiB1YXBzZCBwYXJhbWF0ZXIgaW4gY29uZl90eCgpIG9wZXJhdGlvbi4gSGFyZHdhcmUgbmVlZHMgdG8gc2VuZCB0aGUgUW9TCkBAIC0xNDUxLDcgKzE0NzgsNyBAQAogICoKICAqIE5vdGUgdGhhdCBkcml2ZXJzIE1VU1QgYmUgYWJsZSB0byBkZWFsIHdpdGggYSBUWCBhZ2dyZWdhdGlvbgogICogc2Vzc2lvbiBiZWluZyBzdG9wcGVkIGV2ZW4gYmVmb3JlIHRoZXkgT0snZWQgc3RhcnRpbmcgaXQgYnkKLSAqIGNhbGxpbmcgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiKF9pcnFzYWZlKSwgYmVjYXVzZSB0aGUgcGVlcgorICogY2FsbGluZyBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSwgYmVjYXVzZSB0aGUgcGVlcgogICogbWlnaHQgcmVjZWl2ZSB0aGUgYWRkQkEgZnJhbWUgYW5kIHNlbmQgYSBkZWxCQSByaWdodCBhd2F5IQogICoKICAqIEBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6IHN0YXJ0IFJ4IGFnZ3JlZ2F0aW9uCkBAIC0xNjM2LDcgKzE2NjMsNyBAQAogICogCWlzIHRoZSBmaXJzdCBmcmFtZSB3ZSBleHBlY3QgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uLiBOb3RpY2UKICAqIAl0aGF0IFRYL1JYX1NUT1AgY2FuIHBhc3MgTlVMTCBmb3IgdGhpcyBwYXJhbWV0ZXIuCiAgKglSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICoJVGhlIGNhbGxiYWNrIG11c3QgYmUgYXRvbWljLgorICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICAqCiAgKiBAZ2V0X3N1cnZleTogUmV0dXJuIHBlci1jaGFubmVsIHN1cnZleSBpbmZvcm1hdGlvbgogICoKQEAgLTIzMDcsMjUgKzIzMzQsMTQgQEAKIGludCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKTsKIAogLyoqCi0gKiBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2IgLSBsb3cgbGV2ZWwgZHJpdmVyIHJlYWR5IHRvIGFnZ3JlZ2F0ZS4KLSAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2sKLSAqIEByYTogcmVjZWl2ZXIgYWRkcmVzcyBvZiB0aGUgQkEgc2Vzc2lvbiByZWNpcGllbnQuCi0gKiBAdGlkOiB0aGUgVElEIHRvIEJBIG9uLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgbG93IGxldmVsIGRyaXZlciBvbmNlIGl0IGhhcwotICogZmluaXNoZWQgd2l0aCBwcmVwYXJhdGlvbnMgZm9yIHRoZSBCQSBzZXNzaW9uLgotICovCi12b2lkIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYihzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqcmEsIHUxNiB0aWQpOwotCi0vKioKICAqIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlIC0gbG93IGxldmVsIGRyaXZlciByZWFkeSB0byBhZ2dyZWdhdGUuCiAgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrCiAgKiBAcmE6IHJlY2VpdmVyIGFkZHJlc3Mgb2YgdGhlIEJBIHNlc3Npb24gcmVjaXBpZW50LgogICogQHRpZDogdGhlIFRJRCB0byBCQSBvbi4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IGxvdyBsZXZlbCBkcml2ZXIgb25jZSBpdCBoYXMKLSAqIGZpbmlzaGVkIHdpdGggcHJlcGFyYXRpb25zIGZvciB0aGUgQkEgc2Vzc2lvbi4KLSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaXMgSVJRLXNhZmUuCisgKiBmaW5pc2hlZCB3aXRoIHByZXBhcmF0aW9ucyBmb3IgdGhlIEJBIHNlc3Npb24uIEl0IGNhbiBiZSBjYWxsZWQKKyAqIGZyb20gYW55IGNvbnRleHQuCiAgKi8KIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgY29uc3QgdTggKnJhLAogCQkJCSAgICAgIHUxNiB0aWQpOwpAQCAtMjMzNCwyNyArMjM1MCwxNCBAQAogICogaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbiAtIFN0b3AgYSBCbG9jayBBY2sgc2Vzc2lvbi4KICAqIEBzdGE6IHRoZSBzdGF0aW9uIHdob3NlIEJBIHNlc3Npb24gdG8gc3RvcAogICogQHRpZDogdGhlIFRJRCB0byBzdG9wIEJBLgotICogQGluaXRpYXRvcjogaWYgaW5kaWNhdGVzIGluaXRpYXRvciBERUxCQSBmcmFtZSB3aWxsIGJlIHNlbnQuCiAgKgotICogUmV0dXJuOiBlcnJvciBpZiBubyBzdGEgd2l0aCBtYXRjaGluZyBkYSBmb3VuZCwgc3VjY2VzcyBvdGhlcndpc2UKKyAqIFJldHVybjogbmVnYXRpdmUgZXJyb3IgaWYgdGhlIFRJRCBpcyBpbnZhbGlkLCBvciBubyBhZ2dyZWdhdGlvbiBhY3RpdmUKICAqCiAgKiBBbHRob3VnaCBtYWM4MDIxMS9sb3cgbGV2ZWwgZHJpdmVyL3VzZXIgc3BhY2UgYXBwbGljYXRpb24gY2FuIGVzdGltYXRlCiAgKiB0aGUgbmVlZCB0byBzdG9wIGFnZ3JlZ2F0aW9uIG9uIGEgY2VydGFpbiBSQS9USUQsIHRoZSBzZXNzaW9uIGxldmVsCiAgKiB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIG1hYzgwMjExLgogICovCi1pbnQgaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLAotCQkJCSBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKTsKLQotLyoqCi0gKiBpZWVlODAyMTFfc3RvcF90eF9iYV9jYiAtIGxvdyBsZXZlbCBkcml2ZXIgcmVhZHkgdG8gc3RvcCBhZ2dyZWdhdGUuCi0gKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrCi0gKiBAcmE6IHJlY2VpdmVyIGFkZHJlc3Mgb2YgdGhlIEJBIHNlc3Npb24gcmVjaXBpZW50LgotICogQHRpZDogdGhlIGRlc2lyZWQgVElEIHRvIEJBIG9uLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgbG93IGxldmVsIGRyaXZlciBvbmNlIGl0IGhhcwotICogZmluaXNoZWQgd2l0aCBwcmVwYXJhdGlvbnMgZm9yIHRoZSBCQSBzZXNzaW9uIHRlYXIgZG93bi4KLSAqLwotdm9pZCBpZWVlODAyMTFfc3RvcF90eF9iYV9jYihzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqcmEsIHU4IHRpZCk7CitpbnQgaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKTsKIAogLyoqCiAgKiBpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlIC0gbG93IGxldmVsIGRyaXZlciByZWFkeSB0byBzdG9wIGFnZ3JlZ2F0ZS4KQEAgLTIzNjMsOCArMjM2Niw4IEBACiAgKiBAdGlkOiB0aGUgZGVzaXJlZCBUSUQgdG8gQkEgb24uCiAgKgogICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBsb3cgbGV2ZWwgZHJpdmVyIG9uY2UgaXQgaGFzCi0gKiBmaW5pc2hlZCB3aXRoIHByZXBhcmF0aW9ucyBmb3IgdGhlIEJBIHNlc3Npb24gdGVhciBkb3duLgotICogVGhpcyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBJUlEtc2FmZS4KKyAqIGZpbmlzaGVkIHdpdGggcHJlcGFyYXRpb25zIGZvciB0aGUgQkEgc2Vzc2lvbiB0ZWFyIGRvd24uIEl0CisgKiBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuCiAgKi8KIHZvaWQgaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBjb25zdCB1OCAqcmEsCiAJCQkJICAgICB1MTYgdGlkKTsKQEAgLTI0NjAsNiArMjQ2MywzNiBAQAogdm9pZCBpZWVlODAyMTFfY29ubmVjdGlvbl9sb3NzKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogCiAvKioKKyAqIGllZWU4MDIxMV9kaXNhYmxlX2R5bl9wcyAtIGZvcmNlIG1hYzgwMjExIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgZHluYW1pYyBwc20KKyAqCisgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgorICoKKyAqIFNvbWUgaGFyZHdhcmUgcmVxdWlyZSBmdWxsIHBvd2VyIHNhdmUgdG8gbWFuYWdlIHNpbXVsdGFuZW91cyBCVCB0cmFmZmljCisgKiBvbiB0aGUgV0xBTiBmcmVxdWVuY3kuIEZ1bGwgUFNNIGlzIHJlcXVpcmVkIHBlcmlvZGljYWxseSwgd2hlbmV2ZXIgdGhlcmUgYXJlCisgKiBidXJzdCBvZiBCVCB0cmFmZmljLiBUaGUgaGFyZHdhcmUgZ2V0cyBpbmZvcm1hdGlvbiBvZiBCVCB0cmFmZmljIHZpYQorICogaGFyZHdhcmUgY28tZXhpc3RlbmNlIGxpbmVzLCBhbmQgY29uc2VxdWVudGlhbGx5IHJlcXVlc3RzIG1hYzgwMjExIHRvCisgKiAodGVtcG9yYXJpbHkpIGVudGVyIGZ1bGwgcHNtLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgdGVtcG9yYXJpbHkgZGlzYWJsZSBkeW5hbWljIFBTLCBub3QgZW5hYmxlIFBTTSBpZgorICogaXQgd2FzIG5vdCBhbHJlYWR5IGVuYWJsZWQuCisgKiBUaGUgZHJpdmVyIG11c3QgbWFrZSBzdXJlIHRvIHJlLWVuYWJsZSBkeW5hbWljIFBTIHVzaW5nCisgKiBpZWVlODAyMTFfZW5hYmxlX2R5bl9wcygpIGlmIHRoZSBkcml2ZXIgaGFzIGRpc2FibGVkIGl0LgorICoKKyAqLwordm9pZCBpZWVlODAyMTFfZGlzYWJsZV9keW5fcHMoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CisKKy8qKgorICogaWVlZTgwMjExX2VuYWJsZV9keW5fcHMgLSByZXN0b3JlIGR5bmFtaWMgcHNtIGFmdGVyIGJlaW5nIGRpc2FibGVkCisgKgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIGR5bmFtaWMgUFMgYWZ0ZXIgYmVpbmcgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdmlhCisgKiBpZWVlODAyMTFfZGlzYWJsZV9keW5fcHMoKS4gRWFjaCBpZWVlODAyMTFfZGlzYWJsZV9keW5fcHMoKSBjYWxsIG11c3QKKyAqIGJlIGNvdXBsZWQgd2l0aCBhbiBldmVudHVhbCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICovCit2b2lkIGllZWU4MDIxMV9lbmFibGVfZHluX3BzKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCisvKioKICAqIGllZWU4MDIxMV9jcW1fcnNzaV9ub3RpZnkgLSBpbmZvcm0gYSBjb25maWd1cmVkIGNvbm5lY3Rpb24gcXVhbGl0eSBtb25pdG9yaW5nCiAgKglyc3NpIHRocmVzaG9sZCB0cmlnZ2VyZWQKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9taXA2LmggYi9pbmNsdWRlL25ldC9taXA2LmgKaW5kZXggYTgzYWQxOS4uMjZiYTk5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbWlwNi5oCisrKyBiL2luY2x1ZGUvbmV0L21pcDYuaApAQCAtMzksNyArMzksNyBAQAogCV9fdTE2CWlwNm1oX2Nrc3VtOwogCS8qIEZvbGxvd2VkIGJ5IHR5cGUgc3BlY2lmaWMgbWVzc2FnZXMgKi8KIAlfX3U4CWRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIElQNl9NSF9UWVBFX0JSUgkJMCAgIC8qIEJpbmRpbmcgUmVmcmVzaCBSZXF1ZXN0ICovCiAjZGVmaW5lIElQNl9NSF9UWVBFX0hPVEkJMSAgIC8qIEhPVEkgTWVzc2FnZSAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZGlzYy5oIGIvaW5jbHVkZS9uZXQvbmRpc2MuaAppbmRleCBmNzZmMjJkLi44OTU5OTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZGlzYy5oCisrKyBiL2luY2x1ZGUvbmV0L25kaXNjLmgKQEAgLTgyLDcgKzgyLDcgQEAKIHN0cnVjdCBuZF9vcHRfaGRyIHsKIAlfX3U4CQluZF9vcHRfdHlwZTsKIAlfX3U4CQluZF9vcHRfbGVuOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Cit9IF9fcGFja2VkOwogCiAKIGV4dGVybiBpbnQJCQluZGlzY19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmggYi9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaAppbmRleCBlYjIxMzQwLi4yNDI4NzliIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaAorKysgYi9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaApAQCAtMTUxLDcgKzE1MSw3IEBACiAJdm9pZAkJCSgqcHJveHlfcmVkbykoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJY2hhcgkJCSppZDsKIAlzdHJ1Y3QgbmVpZ2hfcGFybXMJcGFybXM7Ci0JLyogSEFDSy4gZ2NfKiBzaG91bCBmb2xsb3cgcGFybXMgd2l0aG91dCBhIGdhcCEgKi8KKwkvKiBIQUNLLiBnY18qIHNob3VsZCBmb2xsb3cgcGFybXMgd2l0aG91dCBhIGdhcCEgKi8KIAlpbnQJCQlnY19pbnRlcnZhbDsKIAlpbnQJCQlnY190aHJlc2gxOwogCWludAkJCWdjX3RocmVzaDI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggYmRlMDk1Zi4uZTYyNGRhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMTUyLDExICsxNTIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKm5mX2N0X25ldChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJldHVybiBjdC0+Y3RfbmV0OwotI2Vsc2UKLQlyZXR1cm4gJmluaXRfbmV0OwotI2VuZGlmCisJcmV0dXJuIHJlYWRfcG5ldCgmY3QtPmN0X25ldCk7CiB9CiAKIC8qIEFsdGVyIHJlcGx5IHR1cGxlIChtYXliZSBhbHRlciBoZWxwZXIpLiAqLwpAQCAtMjYxLDcgKzI1NywxMiBAQAogCQkJICAgICAgIHUzMiBzZXEpOwogCiAvKiBGYWtlIGNvbm50cmFjayBlbnRyeSBmb3IgdW50cmFja2VkIGNvbm5lY3Rpb25zICovCi1leHRlcm4gc3RydWN0IG5mX2Nvbm4gbmZfY29ubnRyYWNrX3VudHJhY2tlZDsKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgbmZfY29ubiwgbmZfY29ubnRyYWNrX3VudHJhY2tlZCk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uICpuZl9jdF91bnRyYWNrZWRfZ2V0KHZvaWQpCit7CisJcmV0dXJuICZfX3Jhd19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfdW50cmFja2VkKTsKK30KK2V4dGVybiB2b2lkIG5mX2N0X3VudHJhY2tlZF9zdGF0dXNfb3IodW5zaWduZWQgbG9uZyBiaXRzKTsKIAogLyogSXRlcmF0ZSBvdmVyIGFsbCBjb25udHJhY2tzOiBpZiBpdGVyIHJldHVybnMgdHJ1ZSwgaXQncyBkZWxldGVkLiAqLwogZXh0ZXJuIHZvaWQKQEAgLTI4OSw5ICsyOTAsOSBAQAogCXJldHVybiB0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2lzX3VudHJhY2tlZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBpbnQgbmZfY3RfaXNfdW50cmFja2VkKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQlyZXR1cm4gKHNrYi0+bmZjdCA9PSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsKTsKKwlyZXR1cm4gdGVzdF9iaXQoSVBTX1VOVFJBQ0tFRF9CSVQsICZjdC0+c3RhdHVzKTsKIH0KIAogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaAppbmRleCAwM2UyMThmLi40ZTljNjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaApAQCAtNDUsNiArNDUsMTggQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQKIHNlcV9wcmludF9hY2N0KHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LCBpbnQgZGlyKTsKIAorLyogQ2hlY2sgaWYgY29ubmVjdGlvbiB0cmFja2luZyBhY2NvdW50aW5nIGlzIGVuYWJsZWQgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBuZl9jdF9hY2N0X2VuYWJsZWQoc3RydWN0IG5ldCAqbmV0KQoreworCXJldHVybiBuZXQtPmN0LnN5c2N0bF9hY2N0ICE9IDA7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIGNvbm5lY3Rpb24gdHJhY2tpbmcgYWNjb3VudGluZyAqLworc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3NldF9hY2N0KHN0cnVjdCBuZXQgKm5ldCwgYm9vbCBlbmFibGUpCit7CisJbmV0LT5jdC5zeXNjdGxfYWNjdCA9IGVuYWJsZTsKK30KKwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfYWNjdF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7CiBleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfYWNjdF9maW5pKHN0cnVjdCBuZXQgKm5ldCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKaW5kZXggM2Q3NTI0Zi4uYWNlZDA4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKQEAgLTYwLDcgKzYwLDcgQEAKIAlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilza2ItPm5mY3Q7CiAJaW50IHJldCA9IE5GX0FDQ0VQVDsKIAotCWlmIChjdCAmJiBjdCAhPSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZCkgeworCWlmIChjdCAmJiAhbmZfY3RfaXNfdW50cmFja2VkKGN0KSkgewogCQlpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpCiAJCQlyZXQgPSBfX25mX2Nvbm50cmFja19jb25maXJtKHNrYik7CiAJCWlmIChsaWtlbHkocmV0ID09IE5GX0FDQ0VQVCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaAppbmRleCAzMmQxNWJkLi4wNzcyZDI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmgKQEAgLTI4LDkgKzI4LDE0IEBACiAJY2hhciBkYXRhWzBdOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgbmZfY3RfZXh0X2V4aXN0KGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwgdTggaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgX19uZl9jdF9leHRfZXhpc3QoY29uc3Qgc3RydWN0IG5mX2N0X2V4dCAqZXh0LCB1OCBpZCkKIHsKLQlyZXR1cm4gKGN0LT5leHQgJiYgY3QtPmV4dC0+b2Zmc2V0W2lkXSk7CisJcmV0dXJuICEhZXh0LT5vZmZzZXRbaWRdOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3RfZXh0X2V4aXN0KGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwgdTggaWQpCit7CisJcmV0dXJuIChjdC0+ZXh0ICYmIF9fbmZfY3RfZXh0X2V4aXN0KGN0LT5leHQsIGlkKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqX19uZl9jdF9leHRfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHU4IGlkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oCmluZGV4IGMzOTgwMTcuLmRmMTdiYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmgKQEAgLTI3LDkgKzI3LDkgQEAKIAogCS8qIEFsdGVyIHRoZSBwZXItcHJvdG8gcGFydCBvZiB0aGUgdHVwbGUgKGRlcGVuZGluZyBvbgogCSAgIG1hbmlwdHlwZSksIHRvIGdpdmUgYSB1bmlxdWUgdHVwbGUgaW4gdGhlIGdpdmVuIHJhbmdlIGlmCi0JICAgcG9zc2libGU7IHJldHVybiBmYWxzZSBpZiBub3QuICBQZXItcHJvdG9jb2wgcGFydCBvZiB0dXBsZQotCSAgIGlzIGluaXRpYWxpemVkIHRvIHRoZSBpbmNvbWluZyBwYWNrZXQuICovCi0JYm9vbCAoKnVuaXF1ZV90dXBsZSkoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgcG9zc2libGUuICBQZXItcHJvdG9jb2wgcGFydCBvZiB0dXBsZSBpcyBpbml0aWFsaXplZCB0byB0aGUKKwkgICBpbmNvbWluZyBwYWNrZXQuICovCisJdm9pZCAoKnVuaXF1ZV90dXBsZSkoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAogCQkJICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKIAkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KTsKQEAgLTYzLDcgKzYzLDcgQEAKIAkJCQkgIGNvbnN0IHVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gKm1pbiwKIAkJCQkgIGNvbnN0IHVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gKm1heCk7CiAKLWV4dGVybiBib29sIG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCitleHRlcm4gdm9pZCBuZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAogCQkJCSAgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKaW5kZXggZTRhMThhZS4uMjg5MGJkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKQEAgLTEyLDYgKzEyLDQgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkJICAgIHN0cnVjdCBuZl9jb25uICpjdCk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQKLWFsbG9jX251bGxfYmluZGluZyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHVuc2lnbmVkIGludCBob29rbnVtKTsKICNlbmRpZiAvKiBfTkZfTkFUX1JVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmgKaW5kZXggYjA1NjlmZi4uZTJkZWM0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oCkBAIC0xMCw1ICsxMCw3IEBACiAJCSAgY29uc3Qgc3RydWN0IG5mX2xvZ2luZm8gKmxpX3VzZXIsCiAJCSAgY29uc3QgY2hhciAqcHJlZml4KTsKIAorI2RlZmluZSBORlVMTkxfQ09QWV9ESVNBQkxFRCAgICAweGZmCisKICNlbmRpZiAvKiBfS0VSX05GTkVUTElOS19MT0dfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIveHRfcmF0ZWVzdC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuaAppbmRleCBkZGJmMzdlLi41YTI5NzhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIveHRfcmF0ZWVzdC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci94dF9yYXRlZXN0LmgKQEAgLTIsMTMgKzIsMTggQEAKICNkZWZpbmUgX1hUX1JBVEVFU1RfSAogCiBzdHJ1Y3QgeHRfcmF0ZWVzdCB7CisJLyoga2VlcCBsb2NrIGFuZCBic3RhdHMgb24gc2FtZSBjYWNoZSBsaW5lIHRvIHNwZWVkdXAgeHRfcmF0ZWVzdF90ZygpICovCisJc3RydWN0IGduZXRfc3RhdHNfYmFzaWNfcGFja2VkCWJzdGF0czsKKwlzcGlubG9ja190CQkJbG9jazsKKwkvKiBrZWVwIHJzdGF0cyBhbmQgbG9jayBvbiBzYW1lIGNhY2hlIGxpbmUgdG8gc3BlZWR1cCB4dF9yYXRlZXN0X210KCkgKi8KKwlzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdAlyc3RhdHM7CisKKwkvKiBmb2xsb3dpbmcgZmllbGRzIG5vdCBhY2Nlc3NlZCBpbiBob3QgcGF0aCAqLwogCXN0cnVjdCBobGlzdF9ub2RlCQlsaXN0OwogCWNoYXIJCQkJbmFtZVtJRk5BTVNJWl07CiAJdW5zaWduZWQgaW50CQkJcmVmY250OwotCXNwaW5sb2NrX3QJCQlsb2NrOwogCXN0cnVjdCBnbmV0X2VzdGltYXRvcgkJcGFyYW1zOwotCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0CXJzdGF0czsKLQlzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpY19wYWNrZWQJYnN0YXRzOworCXN0cnVjdCByY3VfaGVhZAkJCXJjdTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgeHRfcmF0ZWVzdCAqeHRfcmF0ZWVzdF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsaW5rLmggYi9pbmNsdWRlL25ldC9uZXRsaW5rLmgKaW5kZXggNGZjMDViNS4uZjNiMjAxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaApAQCAtMzUsNyArMzUsNyBAQAogICogICBubG1zZ19uZXcoKQkJCWNyZWF0ZSBhIG5ldyBuZXRsaW5rIG1lc3NhZ2UKICAqICAgbmxtc2dfcHV0KCkJCQlhZGQgYSBuZXRsaW5rIG1lc3NhZ2UgdG8gYW4gc2tiCiAgKiAgIG5sbXNnX3B1dF9hbnN3ZXIoKQkJCWNhbGxiYWNrIGJhc2VkIG5sbXNnX3B1dCgpCi0gKiAgIG5sbXNnX2VuZCgpCQkJZmluYW5saXplIG5ldGxpbmsgbWVzc2FnZQorICogICBubG1zZ19lbmQoKQkJCWZpbmFsaXplIG5ldGxpbmsgbWVzc2FnZQogICogICBubG1zZ19nZXRfcG9zKCkJCQlyZXR1cm4gY3VycmVudCBwb3NpdGlvbiBpbiBtZXNzYWdlCiAgKiAgIG5sbXNnX3RyaW0oKQkJCXRyaW0gcGFydCBvZiBtZXNzYWdlCiAgKiAgIG5sbXNnX2NhbmNlbCgpCQkJY2FuY2VsIG1lc3NhZ2UgY29uc3RydWN0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9waG9uZXQvcG5fZGV2LmggYi9pbmNsdWRlL25ldC9waG9uZXQvcG5fZGV2LmgKaW5kZXggZDdiOTg5Yy4uMmQxNjc4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGhvbmV0L3BuX2Rldi5oCisrKyBiL2luY2x1ZGUvbmV0L3Bob25ldC9wbl9kZXYuaApAQCAtMzQsNiArMzQsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCURFQ0xBUkVfQklUTUFQKGFkZHJzLCA2NCk7CisJc3RydWN0IHJjdV9oZWFkCXJjdTsKIH07CiAKIGludCBwaG9uZXRfZGV2aWNlX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaCBiL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oCmluZGV4IDlkNGQ4N2MuLmQ5NTQ5YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oCkBAIC05NSw3ICs5NSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxZGlzY19ydW4oc3RydWN0IFFkaXNjICpxKQogewotCWlmICghdGVzdF9hbmRfc2V0X2JpdChfX1FESVNDX1NUQVRFX1JVTk5JTkcsICZxLT5zdGF0ZSkpCisJaWYgKHFkaXNjX3J1bl9iZWdpbihxKSkKIAkJX19xZGlzY19ydW4ocSk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaCBiL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaAppbmRleCBmODczZWUzLi45ZTEwM2E0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oCisrKyBiL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaApAQCAtNTQsNyArNTQsNiBAQAogCWVudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIGluaXRpYXRvcjsKIAljaGFyIGFscGhhMlsyXTsKIAlib29sIGludGVyc2VjdDsKLQl1MzIgY291bnRyeV9pZV9jaGVja3N1bTsKIAllbnVtIGVudmlyb25tZW50X2NhcCBjb3VudHJ5X2llX2VudjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcm91dGUuaCBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKaW5kZXggYWY2Y2Y0Yi4uYmQ3MzJkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC01MCw5ICs1MCw3IEBACiBzdHJ1Y3QgZmliX25oOwogc3RydWN0IGluZXRfcGVlcjsKIHN0cnVjdCBydGFibGUgewotCXVuaW9uIHsKLQkJc3RydWN0IGRzdF9lbnRyeQlkc3Q7Ci0JfSB1OworCXN0cnVjdCBkc3RfZW50cnkJZHN0OwogCiAJLyogQ2FjaGUgbG9va3VwIGtleXMgKi8KIAlzdHJ1Y3QgZmxvd2kJCWZsOwpAQCAtMTQ0LDcgKzE0Miw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaXBfcnRfcHV0KHN0cnVjdCBydGFibGUgKiBydCkKIHsKIAlpZiAocnQpCi0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiB9CiAKICNkZWZpbmUgSVBUT1NfUlRfTUFTSwkoSVBUT1NfVE9TX01BU0sgJiB+MykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmggYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCmluZGV4IDQzMzYwNGIuLjNjODcyOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaApAQCAtMjMsMTEgKzIzLDE3IEBACiB9OwogCiBlbnVtIHFkaXNjX3N0YXRlX3QgewotCV9fUURJU0NfU1RBVEVfUlVOTklORywKIAlfX1FESVNDX1NUQVRFX1NDSEVELAogCV9fUURJU0NfU1RBVEVfREVBQ1RJVkFURUQsCiB9OwogCisvKgorICogZm9sbG93aW5nIGJpdHMgYXJlIG9ubHkgY2hhbmdlZCB3aGlsZSBxZGlzYyBsb2NrIGlzIGhlbGQKKyAqLworZW51bSBxZGlzY19fX3N0YXRlX3QgeworCV9fUURJU0NfX19TVEFURV9SVU5OSU5HLAorfTsKKwogc3RydWN0IHFkaXNjX3NpemVfdGFibGUgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgdGNfc2l6ZXNwZWMJc3pvcHRzOwpAQCAtNzIsMTAgKzc4LDI3IEBACiAJdW5zaWduZWQgbG9uZwkJc3RhdGU7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlxOwogCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljX3BhY2tlZCBic3RhdHM7CisJdW5zaWduZWQgbG9uZwkJX19zdGF0ZTsKIAlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZQlxc3RhdHM7Ci0Jc3RydWN0IHJjdV9oZWFkICAgICByY3VfaGVhZDsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdV9oZWFkOworCXNwaW5sb2NrX3QJCWJ1c3lsb2NrOwogfTsKIAorc3RhdGljIGlubGluZSBib29sIHFkaXNjX2lzX3J1bm5pbmcoc3RydWN0IFFkaXNjICpxZGlzYykKK3sKKwlyZXR1cm4gdGVzdF9iaXQoX19RRElTQ19fX1NUQVRFX1JVTk5JTkcsICZxZGlzYy0+X19zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBxZGlzY19ydW5fYmVnaW4oc3RydWN0IFFkaXNjICpxZGlzYykKK3sKKwlyZXR1cm4gIV9fdGVzdF9hbmRfc2V0X2JpdChfX1FESVNDX19fU1RBVEVfUlVOTklORywgJnFkaXNjLT5fX3N0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkaXNjX3J1bl9lbmQoc3RydWN0IFFkaXNjICpxZGlzYykKK3sKKwlfX2NsZWFyX2JpdChfX1FESVNDX19fU1RBVEVfUlVOTklORywgJnFkaXNjLT5fX3N0YXRlKTsKK30KKwogc3RydWN0IFFkaXNjX2NsYXNzX29wcyB7CiAJLyogQ2hpbGQgcWRpc2MgbWFuaXB1bGF0aW9uICovCiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqCSgqc2VsZWN0X3F1ZXVlKShzdHJ1Y3QgUWRpc2MgKiwgc3RydWN0IHRjbXNnICopOwpAQCAtNTgzLDkgKzYwNiwxNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza2JfYWN0X2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IGdmcF9tYXNrKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2FjdF9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBnZnBfbWFzaywKKwkJCQkJICAgIGludCBhY3Rpb24pCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKm4gPSBza2JfY2xvbmUoc2tiLCBnZnBfbWFzayk7CisJc3RydWN0IHNrX2J1ZmYgKm47CisKKwlpZiAoKGFjdGlvbiA9PSBUQ19BQ1RfU1RPTEVOIHx8IGFjdGlvbiA9PSBUQ19BQ1RfUVVFVUVEKSAmJgorCSAgICAhc2tiX3NoYXJlZChza2IpKQorCQluID0gc2tiX2dldChza2IpOworCWVsc2UKKwkJbiA9IHNrYl9jbG9uZShza2IsIGdmcF9tYXNrKTsKIAogCWlmIChuKSB7CiAJCW4tPnRjX3ZlcmQgPSBTRVRfVENfVkVSRChuLT50Y192ZXJkLCAwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjbS5oIGIvaW5jbHVkZS9uZXQvc2NtLmgKaW5kZXggODM2MGU0Ny4uMzE2NTY1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NtLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NtLmgKQEAgLTE5LDggKzE5LDEwIEBACiB9OwogCiBzdHJ1Y3Qgc2NtX2Nvb2tpZSB7Ci0Jc3RydWN0IHVjcmVkCQljcmVkczsJCS8qIFNrYiBjcmVkZW50aWFscwkqLworCXN0cnVjdCBwaWQJCSpwaWQ7CQkvKiBTa2IgY3JlZGVudGlhbHMgKi8KKwljb25zdCBzdHJ1Y3QgY3JlZAkqY3JlZDsKIAlzdHJ1Y3Qgc2NtX2ZwX2xpc3QJKmZwOwkJLyogUGFzc2VkIGZpbGVzCQkqLworCXN0cnVjdCB1Y3JlZAkJY3JlZHM7CQkvKiBTa2IgY3JlZGVudGlhbHMJKi8KICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSwogCXUzMgkJCXNlY2lkOwkJLyogUGFzc2VkIHNlY3VyaXR5IElEIAkqLwogI2VuZGlmCkBAIC00Miw4ICs0NCwyNyBAQAogeyB9CiAjZW5kaWYgLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgKi8KIAorc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwKKwkJCQkgICAgc3RydWN0IHBpZCAqcGlkLCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwlzY20tPnBpZCAgPSBnZXRfcGlkKHBpZCk7CisJc2NtLT5jcmVkID0gZ2V0X2NyZWQoY3JlZCk7CisJY3JlZF90b191Y3JlZChwaWQsIGNyZWQsICZzY20tPmNyZWRzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveV9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20pCit7CisJcHV0X3BpZChzY20tPnBpZCk7CisJc2NtLT5waWQgID0gTlVMTDsKKworCWlmIChzY20tPmNyZWQpCisJCXB1dF9jcmVkKHNjbS0+Y3JlZCk7CisJc2NtLT5jcmVkID0gTlVMTDsKK30KKwogc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKQogeworCXNjbV9kZXN0cm95X2NyZWQoc2NtKTsKIAlpZiAoc2NtICYmIHNjbS0+ZnApCiAJCV9fc2NtX2Rlc3Ryb3koc2NtKTsKIH0KQEAgLTUxLDEwICs3Miw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJICAgICAgIHN0cnVjdCBzY21fY29va2llICpzY20pCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKLQlzY20tPmNyZWRzLnVpZCA9IGN1cnJlbnRfdWlkKCk7Ci0Jc2NtLT5jcmVkcy5naWQgPSBjdXJyZW50X2dpZCgpOwotCXNjbS0+Y3JlZHMucGlkID0gdGFza190Z2lkX3ZucihwKTsKKwlzY21fc2V0X2NyZWQoc2NtLCB0YXNrX3RnaWQoY3VycmVudCksIGN1cnJlbnRfY3JlZCgpKTsKIAlzY20tPmZwID0gTlVMTDsKIAl1bml4X2dldF9wZWVyc2VjX2RncmFtKHNvY2ssIHNjbSk7CiAJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4gPD0gMCkKQEAgLTk2LDYgKzExNCw4IEBACiAJaWYgKHRlc3RfYml0KFNPQ0tfUEFTU0NSRUQsICZzb2NrLT5mbGFncykpCiAJCXB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwgU0NNX0NSRURFTlRJQUxTLCBzaXplb2Yoc2NtLT5jcmVkcyksICZzY20tPmNyZWRzKTsKIAorCXNjbV9kZXN0cm95X2NyZWQoc2NtKTsKKwogCXNjbV9wYXNzZWMoc29jaywgbXNnLCBzY20pOwogCiAJaWYgKCFzY20tPmZwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCA0Yjg2MDExLi5mOWU3NDczIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtNDQzLDcgKzQ0Myw3IEBACiAJX191OCBzaWduYXR1cmVbU0NUUF9TRUNSRVRfU0laRV07CiAJX191MzIgX19wYWQ7CQkvKiBmb3JjZSBzY3RwX2Nvb2tpZSBhbGlnbm1lbnQgdG8gNjQgYml0cyAqLwogCXN0cnVjdCBzY3RwX2Nvb2tpZSBjOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIFRoaXMgaXMgYW5vdGhlciBjb252ZW5pZW5jZSB0eXBlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWRkcmVzcwogICogcGFyYW1zIGZvciB0aGUgbWF4aW11bSBzaXplIGFuZCBwYXNzIHN1Y2ggc3RydWN0dXJlcyBhcm91bmQKQEAgLTQ4OCw3ICs0ODgsNyBAQAogCXVuaW9uIHNjdHBfYWRkciBkYWRkcjsKIAl1bnNpZ25lZCBsb25nIHNlbnRfYXQ7CiAJX191NjQgaGJfbm9uY2U7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc2VuZGVyX2hiX2luZm9fdDsKK30gX19wYWNrZWQgc2N0cF9zZW5kZXJfaGJfaW5mb190OwogCiAvKgogICogIFJGQyAyOTYwIDEuMy4yIFNlcXVlbmNlZCBEZWxpdmVyeSB3aXRoaW4gU3RyZWFtcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc25tcC5oIGIvaW5jbHVkZS9uZXQvc25tcC5oCmluZGV4IDg5OTAwM2QuLmEwZTYxODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NubXAuaAorKysgYi9pbmNsdWRlL25ldC9zbm1wLmgKQEAgLTQ3LDE1ICs0NywxNiBAQAogfQogCiAvKgotICogV2UgdXNlIGFsbCB1bnNpZ25lZCBsb25ncy4gTGludXggd2lsbCBzb29uIGJlIHNvIHJlbGlhYmxlIHRoYXQgZXZlbiAKLSAqIHRoZXNlIHdpbGwgcmFwaWRseSBnZXQgdG9vIHNtYWxsIDgtKS4gU2VyaW91c2x5IGNvbnNpZGVyIHRoZSBJcEluUmVjZWl2ZXMgCi0gKiBjb3VudCBvbiB0aGUgMjBHYi9zICsgbmV0d29ya3MgcGVvcGxlIGV4cGVjdCBpbiBhIGZldyB5ZWFycyB0aW1lIQorICogV2UgdXNlIHVuc2lnbmVkIGxvbmdzIGZvciBtb3N0IG1pYnMgYnV0IHU2NCBmb3IgaXBzdGF0cy4KICAqLworI2luY2x1ZGUgPGxpbnV4L3U2NF9zdGF0c19zeW5jLmg+CiAKIC8qIElQc3RhdHMgKi8KICNkZWZpbmUgSVBTVEFUU19NSUJfTUFYCV9fSVBTVEFUU19NSUJfTUFYCiBzdHJ1Y3QgaXBzdGF0c19taWIgewotCXVuc2lnbmVkIGxvbmcJbWlic1tJUFNUQVRTX01JQl9NQVhdOworCS8qIG1pYnNbXSBtdXN0IGJlIGZpcnN0IGZpZWxkIG9mIHN0cnVjdCBpcHN0YXRzX21pYiAqLworCXU2NAkJbWlic1tJUFNUQVRTX01JQl9NQVhdOworCXN0cnVjdCB1NjRfc3RhdHNfc3luYyBzeW5jcDsKIH07CiAKIC8qIElDTVAgKi8KQEAgLTE1NSw0ICsxNTYsNzAgQEAKIAkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjUEtUU10rKzsgXAogCQlwdHItPm1pYnNbYmFzZWZpZWxkIyNPQ1RFVFNdICs9IGFkZGVuZDtcCiAJfSB3aGlsZSAoMCkKKworCisjaWYgQklUU19QRVJfTE9ORz09MzIKKworI2RlZmluZSBTTk1QX0FERF9TVEFUUzY0X0JIKG1pYiwgZmllbGQsIGFkZGVuZCkgCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJX190eXBlb2ZfXygqbWliWzBdKSAqcHRyID0gX190aGlzX2NwdV9wdHIoKG1pYilbMF0pOwlcCisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnB0ci0+c3luY3ApOwkJCVwKKwkJcHRyLT5taWJzW2ZpZWxkXSArPSBhZGRlbmQ7CQkJCVwKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnB0ci0+c3luY3ApOwkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBTTk1QX0FERF9TVEFUUzY0X1VTRVIobWliLCBmaWVsZCwgYWRkZW5kKSAJCQlcCisJZG8gewkJCQkJCQkJXAorCQlfX3R5cGVvZl9fKCptaWJbMF0pICpwdHI7CQkJCVwKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQlcCisJCXB0ciA9IF9fdGhpc19jcHVfcHRyKChtaWIpWzFdKTsJCQkJXAorCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZwdHItPnN5bmNwKTsJCQlcCisJCXB0ci0+bWlic1tmaWVsZF0gKz0gYWRkZW5kOwkJCQlcCisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZwdHItPnN5bmNwKTsJCQlcCisJCXByZWVtcHRfZW5hYmxlKCk7CQkJCQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgU05NUF9BRERfU1RBVFM2NChtaWIsIGZpZWxkLCBhZGRlbmQpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCV9fdHlwZW9mX18oKm1pYlswXSkgKnB0cjsJCQkJXAorCQlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCVwKKwkJcHRyID0gX190aGlzX2NwdV9wdHIoKG1pYilbIWluX3NvZnRpcnEoKV0pOwkJXAorCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZwdHItPnN5bmNwKTsJCQlcCisJCXB0ci0+bWlic1tmaWVsZF0gKz0gYWRkZW5kOwkJCQlcCisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZwdHItPnN5bmNwKTsJCQlcCisJCXByZWVtcHRfZW5hYmxlKCk7CQkJCQlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgU05NUF9JTkNfU1RBVFM2NF9CSChtaWIsIGZpZWxkKSBTTk1QX0FERF9TVEFUUzY0X0JIKG1pYiwgZmllbGQsIDEpCisjZGVmaW5lIFNOTVBfSU5DX1NUQVRTNjRfVVNFUihtaWIsIGZpZWxkKSBTTk1QX0FERF9TVEFUUzY0X1VTRVIobWliLCBmaWVsZCwgMSkKKyNkZWZpbmUgU05NUF9JTkNfU1RBVFM2NChtaWIsIGZpZWxkKSBTTk1QX0FERF9TVEFUUzY0KG1pYiwgZmllbGQsIDEpCisjZGVmaW5lIFNOTVBfVVBEX1BPX1NUQVRTNjQobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlfX3R5cGVvZl9fKCptaWJbMF0pICpwdHI7CQkJCVwKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQlcCisJCXB0ciA9IF9fdGhpc19jcHVfcHRyKChtaWIpWyFpbl9zb2Z0aXJxKCldKTsJCVwKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcHRyLT5zeW5jcCk7CQkJXAorCQlwdHItPm1pYnNbYmFzZWZpZWxkIyNQS1RTXSsrOwkJCQlcCisJCXB0ci0+bWlic1tiYXNlZmllbGQjI09DVEVUU10gKz0gYWRkZW5kOwkJCVwKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnB0ci0+c3luY3ApOwkJCVwKKwkJcHJlZW1wdF9lbmFibGUoKTsJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBTTk1QX1VQRF9QT19TVEFUUzY0X0JIKG1pYiwgYmFzZWZpZWxkLCBhZGRlbmQpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJX190eXBlb2ZfXygqbWliWzBdKSAqcHRyOwkJCQlcCisJCXB0ciA9IF9fdGhpc19jcHVfcHRyKChtaWIpWyFpbl9zb2Z0aXJxKCldKTsJCVwKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcHRyLT5zeW5jcCk7CQkJXAorCQlwdHItPm1pYnNbYmFzZWZpZWxkIyNQS1RTXSsrOwkJCQlcCisJCXB0ci0+bWlic1tiYXNlZmllbGQjI09DVEVUU10gKz0gYWRkZW5kOwkJCVwKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnB0ci0+c3luY3ApOwkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgU05NUF9JTkNfU1RBVFM2NF9CSChtaWIsIGZpZWxkKQkJU05NUF9JTkNfU1RBVFNfQkgobWliLCBmaWVsZCkKKyNkZWZpbmUgU05NUF9JTkNfU1RBVFM2NF9VU0VSKG1pYiwgZmllbGQpCVNOTVBfSU5DX1NUQVRTX1VTRVIobWliLCBmaWVsZCkKKyNkZWZpbmUgU05NUF9JTkNfU1RBVFM2NChtaWIsIGZpZWxkKQkJU05NUF9JTkNfU1RBVFMobWliLCBmaWVsZCkKKyNkZWZpbmUgU05NUF9ERUNfU1RBVFM2NChtaWIsIGZpZWxkKQkJU05NUF9ERUNfU1RBVFMobWliLCBmaWVsZCkKKyNkZWZpbmUgU05NUF9BRERfU1RBVFM2NF9CSChtaWIsIGZpZWxkLCBhZGRlbmQpIFNOTVBfQUREX1NUQVRTX0JIKG1pYiwgZmllbGQsIGFkZGVuZCkKKyNkZWZpbmUgU05NUF9BRERfU1RBVFM2NF9VU0VSKG1pYiwgZmllbGQsIGFkZGVuZCkgU05NUF9BRERfU1RBVFNfVVNFUihtaWIsIGZpZWxkLCBhZGRlbmQpCisjZGVmaW5lIFNOTVBfQUREX1NUQVRTNjQobWliLCBmaWVsZCwgYWRkZW5kKQlTTk1QX0FERF9TVEFUUyhtaWIsIGZpZWxkLCBhZGRlbmQpCisjZGVmaW5lIFNOTVBfVVBEX1BPX1NUQVRTNjQobWliLCBiYXNlZmllbGQsIGFkZGVuZCkgU05NUF9VUERfUE9fU1RBVFMobWliLCBiYXNlZmllbGQsIGFkZGVuZCkKKyNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFM2NF9CSChtaWIsIGJhc2VmaWVsZCwgYWRkZW5kKSBTTk1QX1VQRF9QT19TVEFUU19CSChtaWIsIGJhc2VmaWVsZCwgYWRkZW5kKQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IDBhNjkxZWEuLmE0NDFjOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTI5NSw3ICsyOTUsOCBAQAogCXVuc2lnbmVkIHNob3J0CQlza19hY2tfYmFja2xvZzsKIAl1bnNpZ25lZCBzaG9ydAkJc2tfbWF4X2Fja19iYWNrbG9nOwogCV9fdTMyCQkJc2tfcHJpb3JpdHk7Ci0Jc3RydWN0IHVjcmVkCQlza19wZWVyY3JlZDsKKwlzdHJ1Y3QgcGlkCQkqc2tfcGVlcl9waWQ7CisJY29uc3Qgc3RydWN0IGNyZWQJKnNrX3BlZXJfY3JlZDsKIAlsb25nCQkJc2tfcmN2dGltZW87CiAJbG9uZwkJCXNrX3NuZHRpbWVvOwogCXN0cnVjdCBza19maWx0ZXIgICAgICAJKnNrX2ZpbHRlcjsKQEAgLTc3MSw2ICs3NzIsNyBAQAogCWludAkJCSpzeXNjdGxfd21lbTsKIAlpbnQJCQkqc3lzY3RsX3JtZW07CiAJaW50CQkJbWF4X2hlYWRlcjsKKwlib29sCQkJbm9fYXV0b2JpbmQ7CiAKIAlzdHJ1Y3Qga21lbV9jYWNoZQkqc2xhYjsKIAl1bnNpZ25lZCBpbnQJCW9ial9zaXplOwpAQCAtMTcwNiwxOSArMTcwOCwxMyBAQAogc3RhdGljIGlubGluZQogc3RydWN0IG5ldCAqc29ja19uZXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQogewotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlyZXR1cm4gc2stPnNrX25ldDsKLSNlbHNlCi0JcmV0dXJuICZpbml0X25ldDsKLSNlbmRpZgorCXJldHVybiByZWFkX3BuZXQoJnNrLT5za19uZXQpOwogfQogCiBzdGF0aWMgaW5saW5lCiB2b2lkIHNvY2tfbmV0X3NldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBuZXQgKm5ldCkKIHsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0Jc2stPnNrX25ldCA9IG5ldDsKLSNlbmRpZgorCXdyaXRlX3BuZXQoJnNrLT5za19uZXQsIG5ldCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y19hY3QvdGNfbWlycmVkLmggYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfbWlycmVkLmgKaW5kZXggY2VhYzY2MS4uY2ZlMjk0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX21pcnJlZC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19taXJyZWQuaApAQCAtOSw2ICs5LDcgQEAKIAlpbnQJCQl0Y2ZtX2lmaW5kZXg7CiAJaW50CQkJdGNmbV9va19wdXNoOwogCXN0cnVjdCBuZXRfZGV2aWNlCSp0Y2ZtX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXRjZm1fbGlzdDsKIH07CiAjZGVmaW5lIHRvX21pcnJlZChwYykgXAogCWNvbnRhaW5lcl9vZihwYywgc3RydWN0IHRjZl9taXJyZWQsIGNvbW1vbikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggYTE0NDkxNC4uZGY2YTJlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTI5Niw0NSArMjk2LDMwIEBACiAjZGVmaW5lIFRDUF9BRERfU1RBVFNfVVNFUihuZXQsIGZpZWxkLCB2YWwpIFNOTVBfQUREX1NUQVRTX1VTRVIoKG5ldCktPm1pYi50Y3Bfc3RhdGlzdGljcywgZmllbGQsIHZhbCkKICNkZWZpbmUgVENQX0FERF9TVEFUUyhuZXQsIGZpZWxkLCB2YWwpCVNOTVBfQUREX1NUQVRTKChuZXQpLT5taWIudGNwX3N0YXRpc3RpY3MsIGZpZWxkLCB2YWwpCiAKLWV4dGVybiB2b2lkCQkJdGNwX3Y0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIpOworZXh0ZXJuIHZvaWQgdGNwX3Y0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIpOwogCi1leHRlcm4gdm9pZAkJCXRjcF9zaHV0ZG93biAoc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KTsKK2V4dGVybiB2b2lkIHRjcF9zaHV0ZG93biAoc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KTsKIAotZXh0ZXJuIGludAkJCXRjcF92NF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IHRjcF92NF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLWV4dGVybiBpbnQJCQl0Y3BfdjRfcmVtZW1iZXJfc3RhbXAoc3RydWN0IHNvY2sgKnNrKTsKLQotZXh0ZXJuIGludAkJICAgIAl0Y3BfdjRfdHdfcmVtZW1iZXJfc3RhbXAoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcpOwotCi1leHRlcm4gaW50CQkJdGNwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gc3NpemVfdAkJCXRjcF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Ci0KLWV4dGVybiBpbnQJCQl0Y3BfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCAKLQkJCQkJICBpbnQgY21kLCAKLQkJCQkJICB1bnNpZ25lZCBsb25nIGFyZyk7Ci0KLWV4dGVybiBpbnQJCQl0Y3BfcmN2X3N0YXRlX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnNrLCAKLQkJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgICAgICBzdHJ1Y3QgdGNwaGRyICp0aCwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGxlbik7Ci0KLWV4dGVybiBpbnQJCQl0Y3BfcmN2X2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywgCi0JCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgICBzdHJ1Y3QgdGNwaGRyICp0aCwgCi0JCQkJCQkgICAgdW5zaWduZWQgbGVuKTsKLQotZXh0ZXJuIHZvaWQJCQl0Y3BfcmN2X3NwYWNlX2FkanVzdChzdHJ1Y3Qgc29jayAqc2spOwotCi1leHRlcm4gdm9pZAkJCXRjcF9jbGVhbnVwX3JidWYoc3RydWN0IHNvY2sgKnNrLCBpbnQgY29waWVkKTsKLQotZXh0ZXJuIGludAkJCXRjcF90d3NrX3VuaXF1ZShzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQlzdHJ1Y3Qgc29jayAqc2t0dywgdm9pZCAqdHdwKTsKLQotZXh0ZXJuIHZvaWQJCQl0Y3BfdHdza19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzayk7Ci0KLWV4dGVybiBzc2l6ZV90CQkJdGNwX3NwbGljZV9yZWFkKHN0cnVjdCBzb2NrZXQgKnNrLCBsb2ZmX3QgKnBwb3MsCi0JCQkJCSAgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgdGNwX3Y0X3JlbWVtYmVyX3N0YW1wKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gaW50IHRjcF92NF90d19yZW1lbWJlcl9zdGFtcChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyk7CitleHRlcm4gaW50IHRjcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCSAgICAgICBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IHRjcF9zZW5kcGFnZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LAorCQkJc2l6ZV90IHNpemUsIGludCBmbGFncyk7CitleHRlcm4gaW50IHRjcF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgdGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgc3RydWN0IHRjcGhkciAqdGgsIHVuc2lnbmVkIGxlbik7CitleHRlcm4gaW50IHRjcF9yY3ZfZXN0YWJsaXNoZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCB0Y3BoZHIgKnRoLCB1bnNpZ25lZCBsZW4pOworZXh0ZXJuIHZvaWQgdGNwX3Jjdl9zcGFjZV9hZGp1c3Qoc3RydWN0IHNvY2sgKnNrKTsKK2V4dGVybiB2b2lkIHRjcF9jbGVhbnVwX3JidWYoc3RydWN0IHNvY2sgKnNrLCBpbnQgY29waWVkKTsKK2V4dGVybiBpbnQgdGNwX3R3c2tfdW5pcXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnNrdHcsIHZvaWQgKnR3cCk7CitleHRlcm4gdm9pZCB0Y3BfdHdza19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gc3NpemVfdCB0Y3Bfc3BsaWNlX3JlYWQoc3RydWN0IHNvY2tldCAqc2ssIGxvZmZfdCAqcHBvcywKKwkJCSAgICAgICBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzaXplX3QgbGVuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZGVjX3F1aWNrYWNrX21vZGUoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgY29uc3QgdW5zaWduZWQgaW50IHBrdHMpCkBAIC0zNzIsODggKzM1Nyw1OSBAQAogfTsKIAogCi1leHRlcm4gZW51bSB0Y3BfdHdfc3RhdHVzCXRjcF90aW1ld2FpdF9zdGF0ZV9wcm9jZXNzKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LAotCQkJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkJICAgY29uc3Qgc3RydWN0IHRjcGhkciAqdGgpOwotCi1leHRlcm4gc3RydWN0IHNvY2sgKgkJdGNwX2NoZWNrX3JlcShzdHJ1Y3Qgc29jayAqc2ssc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldik7Ci1leHRlcm4gaW50CQkJdGNwX2NoaWxkX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnBhcmVudCwKLQkJCQkJCSAgc3RydWN0IHNvY2sgKmNoaWxkLAotCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQJCQl0Y3BfdXNlX2ZydG8oc3RydWN0IHNvY2sgKnNrKTsKLWV4dGVybiB2b2lkCQkJdGNwX2VudGVyX2ZydG8oc3RydWN0IHNvY2sgKnNrKTsKLWV4dGVybiB2b2lkCQkJdGNwX2VudGVyX2xvc3Moc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KTsKLWV4dGVybiB2b2lkCQkJdGNwX2NsZWFyX3JldHJhbnMoc3RydWN0IHRjcF9zb2NrICp0cCk7Ci1leHRlcm4gdm9pZAkJCXRjcF91cGRhdGVfbWV0cmljcyhzdHJ1Y3Qgc29jayAqc2spOwotCi1leHRlcm4gdm9pZAkJCXRjcF9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIAotCQkJCQkgIGxvbmcgdGltZW91dCk7Ci1leHRlcm4gdW5zaWduZWQgaW50CQl0Y3BfcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7Ci0KLWV4dGVybiBpbnQJCQl0Y3BfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgCi0JCQkJCSAgICAgICBpbnQgb3B0bmFtZSwKLQkJCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIAotCQkJCQkgICAgICAgaW50IF9fdXNlciAqb3B0bGVuKTsKLWV4dGVybiBpbnQJCQl0Y3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgCi0JCQkJCSAgICAgICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKLWV4dGVybiBpbnQJCQljb21wYXRfdGNwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLAotCQkJCQlpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwotZXh0ZXJuIGludAkJCWNvbXBhdF90Y3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCWludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwotZXh0ZXJuIHZvaWQJCQl0Y3Bfc2V0X2tlZXBhbGl2ZShzdHJ1Y3Qgc29jayAqc2ssIGludCB2YWwpOwotZXh0ZXJuIHZvaWQJCQl0Y3Bfc3luX2Fja190aW1lb3V0KHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOwotZXh0ZXJuIGludAkJCXRjcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJCQkgICAgc2l6ZV90IGxlbiwgaW50IG5vbmJsb2NrLCAKLQkJCQkJICAgIGludCBmbGFncywgaW50ICphZGRyX2xlbik7Ci0KLWV4dGVybiB2b2lkCQkJdGNwX3BhcnNlX29wdGlvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcngsCi0JCQkJCQkgIHU4ICoqaHZwcCwKLQkJCQkJCSAgaW50IGVzdGFiKTsKLQotZXh0ZXJuIHU4CQkJKnRjcF9wYXJzZV9tZDVzaWdfb3B0aW9uKHN0cnVjdCB0Y3BoZHIgKnRoKTsKK2V4dGVybiBlbnVtIHRjcF90d19zdGF0dXMgdGNwX3RpbWV3YWl0X3N0YXRlX3Byb2Nlc3Moc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCisJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgICAgIGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoKTsKK2V4dGVybiBzdHJ1Y3Qgc29jayAqIHRjcF9jaGVja19yZXEoc3RydWN0IHNvY2sgKnNrLHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2KTsKK2V4dGVybiBpbnQgdGNwX2NoaWxkX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKmNoaWxkLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgdGNwX3VzZV9mcnRvKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gdm9pZCB0Y3BfZW50ZXJfZnJ0byhzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHZvaWQgdGNwX2VudGVyX2xvc3Moc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KTsKK2V4dGVybiB2b2lkIHRjcF9jbGVhcl9yZXRyYW5zKHN0cnVjdCB0Y3Bfc29jayAqdHApOworZXh0ZXJuIHZvaWQgdGNwX3VwZGF0ZV9tZXRyaWNzKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gdm9pZCB0Y3BfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpOworZXh0ZXJuIHVuc2lnbmVkIGludCB0Y3BfcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CitleHRlcm4gaW50IHRjcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKK2V4dGVybiBpbnQgdGNwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKK2V4dGVybiBpbnQgY29tcGF0X3RjcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQkgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKK2V4dGVybiBpbnQgY29tcGF0X3RjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQkgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7CitleHRlcm4gdm9pZCB0Y3Bfc2V0X2tlZXBhbGl2ZShzdHJ1Y3Qgc29jayAqc2ssIGludCB2YWwpOworZXh0ZXJuIHZvaWQgdGNwX3N5bl9hY2tfdGltZW91dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CitleHRlcm4gaW50IHRjcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCSAgICAgICBzaXplX3QgbGVuLCBpbnQgbm9uYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbik7CitleHRlcm4gdm9pZCB0Y3BfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcngsIHU4ICoqaHZwcCwKKwkJCSAgICAgIGludCBlc3RhYik7CitleHRlcm4gdTggKnRjcF9wYXJzZV9tZDVzaWdfb3B0aW9uKHN0cnVjdCB0Y3BoZHIgKnRoKTsKIAogLyoKICAqCVRDUCB2NCBmdW5jdGlvbnMgZXhwb3J0ZWQgZm9yIHRoZSBpbmV0NiBBUEkKICAqLwogCi1leHRlcm4gdm9pZAkJICAgICAgIAl0Y3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwotCi1leHRlcm4gaW50CQkJdGNwX3Y0X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLWV4dGVybiBzdHJ1Y3Qgc29jayAqCQl0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwotCi1leHRlcm4gc3RydWN0IHNvY2sgKgkJdGNwX3Y0X3N5bl9yZWN2X3NvY2soc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCQkJc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKLQotZXh0ZXJuIGludAkJCXRjcF92NF9kb19yY3Yoc3RydWN0IHNvY2sgKnNrLAorZXh0ZXJuIHZvaWQgdGNwX3Y0X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgdGNwX3Y0X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHN0cnVjdCBzb2NrICogdGNwX2NyZWF0ZV9vcGVucmVxX2NoaWxkKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAogCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotZXh0ZXJuIGludAkJCXRjcF92NF9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICAgICAgIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCi0JCQkJCSAgICAgICBpbnQgYWRkcl9sZW4pOwotCi1leHRlcm4gaW50CQkJdGNwX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrKTsKLQotZXh0ZXJuIHN0cnVjdCBza19idWZmICoJCXRjcF9tYWtlX3N5bmFjayhzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCi0JCQkJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCQlzdHJ1Y3QgcmVxdWVzdF92YWx1ZXMgKnJ2cCk7Ci0KLWV4dGVybiBpbnQJCQl0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncyk7CitleHRlcm4gc3RydWN0IHNvY2sgKiB0Y3BfdjRfc3luX3JlY3Zfc29jayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCQkgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CitleHRlcm4gaW50IHRjcF92NF9kb19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgdGNwX3Y0X2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJICBpbnQgYWRkcl9sZW4pOworZXh0ZXJuIGludCB0Y3BfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHN0cnVjdCBza19idWZmICogdGNwX21ha2Vfc3luYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkJCXN0cnVjdCByZXF1ZXN0X3ZhbHVlcyAqcnZwKTsKK2V4dGVybiBpbnQgdGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpOwogCiAKIC8qIEZyb20gc3luY29va2llcy5jICovCkBAIC00NjQsNyArNDIwLDcgQEAKIAkJCQkgICAgIF9fdTE2ICptc3MpOwogCiBleHRlcm4gX191MzIgY29va2llX2luaXRfdGltZXN0YW1wKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7Ci1leHRlcm4gdm9pZCBjb29raWVfY2hlY2tfdGltZXN0YW1wKHN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqdGNwX29wdCk7CitleHRlcm4gYm9vbCBjb29raWVfY2hlY2tfdGltZXN0YW1wKHN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqb3B0LCBib29sICopOwogCiAvKiBGcm9tIG5ldC9pcHY2L3N5bmNvb2tpZXMuYyAqLwogZXh0ZXJuIHN0cnVjdCBzb2NrICpjb29raWVfdjZfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTQ4NSwxMCArNDQxLDEwIEBACiAKIGV4dGVybiB2b2lkIHRjcF9zZW5kX3Byb2JlMChzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9zZW5kX3BhcnRpYWwoc3RydWN0IHNvY2sgKik7Ci1leHRlcm4gaW50ICB0Y3Bfd3JpdGVfd2FrZXVwKHN0cnVjdCBzb2NrICopOworZXh0ZXJuIGludCB0Y3Bfd3JpdGVfd2FrZXVwKHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIHZvaWQgdGNwX3NlbmRfZmluKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gdm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBnZnBfdCBwcmlvcml0eSk7Ci1leHRlcm4gaW50ICB0Y3Bfc2VuZF9zeW5hY2soc3RydWN0IHNvY2sgKik7CitleHRlcm4gaW50IHRjcF9zZW5kX3N5bmFjayhzdHJ1Y3Qgc29jayAqKTsKIGV4dGVybiB2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBpbnQgbXNzX25vdyk7CiBleHRlcm4gdm9pZCB0Y3Bfc2VuZF9hY2soc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkIHRjcF9zZW5kX2RlbGF5ZWRfYWNrKHN0cnVjdCBzb2NrICpzayk7CkBAIC01OTIsNyArNTQ4LDcgQEAKICAqIHNjYWxpbmcgYXBwbGllZCB0byB0aGUgcmVzdWx0LiAgVGhlIGNhbGxlciBkb2VzIHRoZXNlIHRoaW5ncwogICogaWYgbmVjZXNzYXJ5LiAgVGhpcyBpcyBhICJyYXciIHdpbmRvdyBzZWxlY3Rpb24uCiAgKi8KLWV4dGVybiB1MzIJX190Y3Bfc2VsZWN0X3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHUzMiBfX3RjcF9zZWxlY3Rfd2luZG93KHN0cnVjdCBzb2NrICpzayk7CiAKIC8qIFRDUCB0aW1lc3RhbXBzIGFyZSBvbmx5IDMyLWJpdHMsIHRoaXMgY2F1c2VzIGEgc2xpZ2h0CiAgKiBjb21wbGljYXRpb24gb24gNjQtYml0IHN5c3RlbXMgc2luY2Ugd2Ugc3RvcmUgYSBzbmFwc2hvdApAQCAtNjAyLDEyICs1NTgsMjIgQEAKICAqLwogI2RlZmluZSB0Y3BfdGltZV9zdGFtcAkJKChfX3UzMikoamlmZmllcykpCiAKKyNkZWZpbmUgdGNwX2ZsYWdfYnl0ZSh0aCkgKCgodV9pbnQ4X3QgKil0aClbMTNdKQorCisjZGVmaW5lIFRDUEhEUl9GSU4gMHgwMQorI2RlZmluZSBUQ1BIRFJfU1lOIDB4MDIKKyNkZWZpbmUgVENQSERSX1JTVCAweDA0CisjZGVmaW5lIFRDUEhEUl9QU0ggMHgwOAorI2RlZmluZSBUQ1BIRFJfQUNLIDB4MTAKKyNkZWZpbmUgVENQSERSX1VSRyAweDIwCisjZGVmaW5lIFRDUEhEUl9FQ0UgMHg0MAorI2RlZmluZSBUQ1BIRFJfQ1dSIDB4ODAKKwogLyogVGhpcyBpcyB3aGF0IHRoZSBzZW5kIHBhY2tldCBxdWV1aW5nIGVuZ2luZSB1c2VzIHRvIHBhc3MKLSAqIFRDUCBwZXItcGFja2V0IGNvbnRyb2wgaW5mb3JtYXRpb24gdG8gdGhlIHRyYW5zbWlzc2lvbgotICogY29kZS4gIFdlIGFsc28gc3RvcmUgdGhlIGhvc3Qtb3JkZXIgc2VxdWVuY2UgbnVtYmVycyBpbgotICogaGVyZSB0b28uICBUaGlzIGlzIDM2IGJ5dGVzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLAotICogNDAgYnl0ZXMgb24gNjQtYml0IG1hY2hpbmVzLCBpZiB0aGlzIGdyb3dzIHBsZWFzZSBhZGp1c3QKLSAqIHNrYnVmZi5oOnNrYnVmZi0+Y2JbeHh4XSBzaXplIGFwcHJvcHJpYXRlbHkuCisgKiBUQ1AgcGVyLXBhY2tldCBjb250cm9sIGluZm9ybWF0aW9uIHRvIHRoZSB0cmFuc21pc3Npb24gY29kZS4KKyAqIFdlIGFsc28gc3RvcmUgdGhlIGhvc3Qtb3JkZXIgc2VxdWVuY2UgbnVtYmVycyBpbiBoZXJlIHRvby4KKyAqIFRoaXMgaXMgNDQgYnl0ZXMgaWYgSVBWNiBpcyBlbmFibGVkLgorICogSWYgdGhpcyBncm93cyBwbGVhc2UgYWRqdXN0IHNrYnVmZi5oOnNrYnVmZi0+Y2JbeHh4XSBzaXplIGFwcHJvcHJpYXRlbHkuCiAgKi8KIHN0cnVjdCB0Y3Bfc2tiX2NiIHsKIAl1bmlvbiB7CkBAIC02MjAsMTkgKzU4Niw2IEBACiAJX191MzIJCWVuZF9zZXE7CS8qIFNFUSArIEZJTiArIFNZTiArIGRhdGFsZW4JKi8KIAlfX3UzMgkJd2hlbjsJCS8qIHVzZWQgdG8gY29tcHV0ZSBydHQncwkqLwogCV9fdTgJCWZsYWdzOwkJLyogVENQIGhlYWRlciBmbGFncy4JCSovCi0KLQkvKiBOT1RFOiBUaGVzZSBtdXN0IG1hdGNoIHVwIHRvIHRoZSBmbGFncyBieXRlIGluIGEKLQkgKiAgICAgICByZWFsIFRDUCBoZWFkZXIuCi0JICovCi0jZGVmaW5lIFRDUENCX0ZMQUdfRklOCQkweDAxCi0jZGVmaW5lIFRDUENCX0ZMQUdfU1lOCQkweDAyCi0jZGVmaW5lIFRDUENCX0ZMQUdfUlNUCQkweDA0Ci0jZGVmaW5lIFRDUENCX0ZMQUdfUFNICQkweDA4Ci0jZGVmaW5lIFRDUENCX0ZMQUdfQUNLCQkweDEwCi0jZGVmaW5lIFRDUENCX0ZMQUdfVVJHCQkweDIwCi0jZGVmaW5lIFRDUENCX0ZMQUdfRUNFCQkweDQwCi0jZGVmaW5lIFRDUENCX0ZMQUdfQ1dSCQkweDgwCi0KIAlfX3U4CQlzYWNrZWQ7CQkvKiBTdGF0ZSBmbGFncyBmb3IgU0FDSy9GQUNLLgkqLwogI2RlZmluZSBUQ1BDQl9TQUNLRURfQUNLRUQJMHgwMQkvKiBTS0IgQUNLJ2QgYnkgYSBTQUNLIGJsb2NrCSovCiAjZGVmaW5lIFRDUENCX1NBQ0tFRF9SRVRSQU5TCTB4MDIJLyogU0tCIHJldHJhbnNtaXR0ZWQJCSovCkBAIC0xMTc2LDIyICsxMTI5LDE0IEBACiAjZGVmaW5lIFRDUF9NRDVTSUdfTUFYS0VZUwkofih1MzIpMCkJLyogcmVhbGx5PyEgKi8KIAogLyogLSBmdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQJCQl0Y3BfdjRfbWQ1X2hhc2hfc2tiKGNoYXIgKm1kNV9oYXNoLAotCQkJCQkJICAgIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5LAotCQkJCQkJICAgIHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLWV4dGVybiBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkJKnRjcF92NF9tZDVfbG9va3VwKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgIHN0cnVjdCBzb2NrICphZGRyX3NrKTsKLQotZXh0ZXJuIGludAkJCXRjcF92NF9tZDVfZG9fYWRkKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgX19iZTMyIGFkZHIsCi0JCQkJCQkgIHU4ICpuZXdrZXksCi0JCQkJCQkgIHU4IG5ld2tleWxlbik7Ci0KLWV4dGVybiBpbnQJCQl0Y3BfdjRfbWQ1X2RvX2RlbChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQkgIF9fYmUzMiBhZGRyKTsKK2V4dGVybiBpbnQgdGNwX3Y0X21kNV9oYXNoX3NrYihjaGFyICptZDVfaGFzaCwgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQkgICAgICAgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gc3RydWN0IHRjcF9tZDVzaWdfa2V5ICogdGNwX3Y0X21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJIHN0cnVjdCBzb2NrICphZGRyX3NrKTsKK2V4dGVybiBpbnQgdGNwX3Y0X21kNV9kb19hZGQoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgYWRkciwgdTggKm5ld2tleSwKKwkJCSAgICAgdTggbmV3a2V5bGVuKTsKK2V4dGVybiBpbnQgdGNwX3Y0X21kNV9kb19kZWwoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgYWRkcik7CiAKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwogI2RlZmluZSB0Y3BfdHdza19tZDVfa2V5KHR3c2spCSgodHdzayktPnR3X21kNV9rZXlsZW4gPyAJCSBcCkBAIC0xMjA0LDEwICsxMTQ5LDEwIEBACiAjZW5kaWYKIAogZXh0ZXJuIHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKiBfX3BlcmNwdSAqdGNwX2FsbG9jX21kNXNpZ19wb29sKHN0cnVjdCBzb2NrICopOwotZXh0ZXJuIHZvaWQJCQl0Y3BfZnJlZV9tZDVzaWdfcG9vbCh2b2lkKTsKK2V4dGVybiB2b2lkIHRjcF9mcmVlX21kNXNpZ19wb29sKHZvaWQpOwogCiBleHRlcm4gc3RydWN0IHRjcF9tZDVzaWdfcG9vbAkqdGNwX2dldF9tZDVzaWdfcG9vbCh2b2lkKTsKLWV4dGVybiB2b2lkCQkJdGNwX3B1dF9tZDVzaWdfcG9vbCh2b2lkKTsKK2V4dGVybiB2b2lkIHRjcF9wdXRfbWQ1c2lnX3Bvb2wodm9pZCk7CiAKIGV4dGVybiBpbnQgdGNwX21kNV9oYXNoX2hlYWRlcihzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICosIHN0cnVjdCB0Y3BoZHIgKik7CiBleHRlcm4gaW50IHRjcF9tZDVfaGFzaF9za2JfZGF0YShzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICosIHN0cnVjdCBza19idWZmICosCkBAIC0xNDEzLDcgKzEzNTgsOCBAQAogCXNhX2ZhbWlseV90CQlmYW1pbHk7CiAJZW51bSB0Y3Bfc2VxX3N0YXRlcwlzdGF0ZTsKIAlzdHJ1Y3Qgc29jawkJKnN5bl93YWl0X3NrOwotCWludAkJCWJ1Y2tldCwgc2J1Y2tldCwgbnVtLCB1aWQ7CisJaW50CQkJYnVja2V0LCBvZmZzZXQsIHNidWNrZXQsIG51bSwgdWlkOworCWxvZmZfdAkJCWxhc3RfcG9zOwogfTsKIAogZXh0ZXJuIGludCB0Y3BfcHJvY19yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyAqYWZpbmZvKTsKQEAgLTE0MzQsNyArMTM4MCw3IEBACiBleHRlcm4gaW50IHRjcDRfZ3JvX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLWV4dGVybiBpbnQgIHRjcDRfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIGludCB0Y3A0X3Byb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRjcDRfcHJvY19leGl0KHZvaWQpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggNTM0OGQ4MC4uN2FiZGYzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTE1NywzMCArMTU3LDI4IEBACiAJc2tfY29tbW9uX3JlbGVhc2Uoc2spOwogfQogCi1leHRlcm4gaW50CXVkcF9saWJfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAotCQlpbnQgKCopKGNvbnN0IHN0cnVjdCBzb2NrICosY29uc3Qgc3RydWN0IHNvY2sgKiksCi0JCXVuc2lnbmVkIGludCBoYXNoMl9udWxsYWRkcik7CitleHRlcm4gaW50IHVkcF9saWJfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAorCQkJICAgIGludCAoKikoY29uc3Qgc3RydWN0IHNvY2sgKixjb25zdCBzdHJ1Y3Qgc29jayAqKSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgaGFzaDJfbnVsbGFkZHIpOwogCiAvKiBuZXQvaXB2NC91ZHAuYyAqLwotZXh0ZXJuIGludAl1ZHBfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAotCQkJICAgICBpbnQgKCpzYWRkcl9jbXApKGNvbnN0IHN0cnVjdCBzb2NrICosIGNvbnN0IHN0cnVjdCBzb2NrICopKTsKLWV4dGVybiB2b2lkCXVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyKTsKLQotZXh0ZXJuIGludAl1ZHBfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKK2V4dGVybiBpbnQgdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKKwkJCWludCAoKnNhZGRyX2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICopKTsKK2V4dGVybiB2b2lkIHVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyKTsKK2V4dGVybiBpbnQgdWRwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkCXVkcF9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2spOwotCi1leHRlcm4gaW50CXVkcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gaW50CXVkcF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQJdWRwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpOworZXh0ZXJuIHZvaWQgdWRwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gaW50IHVkcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IHVkcF9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgdWRwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIHVuc2lnbmVkIGludCB1ZHBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKIAkJCSAgICAgcG9sbF90YWJsZSAqd2FpdCk7Ci1leHRlcm4gaW50IAl1ZHBfbGliX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgICAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwotZXh0ZXJuIGludCAJdWRwX2xpYl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuLAotCQkJCSAgIGludCAoKnB1c2hfcGVuZGluZ19mcmFtZXMpKHN0cnVjdCBzb2NrICopKTsKLQorZXh0ZXJuIGludCB1ZHBfbGliX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKK2V4dGVybiBpbnQgdWRwX2xpYl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4sCisJCQkgICAgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSk7CiBleHRlcm4gc3RydWN0IHNvY2sgKnVkcDRfbGliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBzYWRkciwgX19iZTE2IHNwb3J0LAogCQkJCSAgICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwKIAkJCQkgICAgaW50IGRpZik7CkBAIC0yMzYsNyArMjM0LDcgQEAKIGV4dGVybiBpbnQgdWRwX3Byb2NfcmVnaXN0ZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gKmFmaW5mbyk7CiBleHRlcm4gdm9pZCB1ZHBfcHJvY191bnJlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHVkcF9zZXFfYWZpbmZvICphZmluZm8pOwogCi1leHRlcm4gaW50ICB1ZHA0X3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdWRwNF9wcm9jX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCB1ZHA0X3Byb2NfZXhpdCh2b2lkKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jaXN0cGwuaCBiL2luY2x1ZGUvcGNtY2lhL2Npc3RwbC5oCmluZGV4IGNmZGQ1YWYuLjFjNTA4OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2Npc3RwbC5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2Npc3RwbC5oCkBAIC0xNSw2ICsxNSw4IEBACiAjaWZuZGVmIF9MSU5VWF9DSVNUUExfSAogI2RlZmluZSBfTElOVVhfQ0lTVFBMX0gKIAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGNpc2RhdGFfdDsKKwogI2RlZmluZSBDSVNUUExfTlVMTAkJMHgwMAogI2RlZmluZSBDSVNUUExfREVWSUNFCQkweDAxCiAjZGVmaW5lIENJU1RQTF9MT05HTElOS19DQgkweDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jcy5oIGIvaW5jbHVkZS9wY21jaWEvY3MuaAppbmRleCA1N2Q4ZDAzLi42OGQ4YmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9jcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKQEAgLTE5LDQ0ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjZW5kaWYKIAotLyogRm9yIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciAqLwotdHlwZWRlZiBzdHJ1Y3QgY29uZl9yZWdfdCB7Ci0gICAgdV9jaGFyCUZ1bmN0aW9uOwotICAgIHVfaW50CUFjdGlvbjsKLSAgICBvZmZfdAlPZmZzZXQ7Ci0gICAgdV9pbnQJVmFsdWU7Ci19IGNvbmZfcmVnX3Q7Ci0KLS8qIEFjdGlvbnMgKi8KLSNkZWZpbmUgQ1NfUkVBRAkJMQotI2RlZmluZSBDU19XUklURQkyCi0KLS8qIGZvciBBZGp1c3RSZXNvdXJjZUluZm8gKi8KLS8qIEFjdGlvbiBmaWVsZCAqLwotI2RlZmluZSBSRU1PVkVfTUFOQUdFRF9SRVNPVVJDRQkJMQotI2RlZmluZSBBRERfTUFOQUdFRF9SRVNPVVJDRQkJMgotCi0KLXR5cGVkZWYgc3RydWN0IGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCB7Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UJKmNsaWVudF9oYW5kbGU7Ci0Jdm9pZAkJCSpjbGllbnRfZGF0YTsKLX0gZXZlbnRfY2FsbGJhY2tfYXJnc190OwotCi0vKiBGb3IgQ2FyZFZhbHVlcyBmaWVsZCAqLwotI2RlZmluZSBDVl9PUFRJT05fVkFMVUUJCTB4MDEKLSNkZWZpbmUgQ1ZfU1RBVFVTX1ZBTFVFCQkweDAyCi0jZGVmaW5lIENWX1BJTl9SRVBMQUNFTUVOVAkweDA0Ci0jZGVmaW5lIENWX0NPUFlfVkFMVUUJCTB4MDgKLSNkZWZpbmUgQ1ZfRVhUX1NUQVRVUwkJMHgxMAotCi0vKiBGb3IgR2V0Rmlyc3QvTmV4dENsaWVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgY2xpZW50X3JlcV90IHsKLSAgICBzb2NrZXRfdAlTb2NrZXQ7Ci0gICAgdV9pbnQJQXR0cmlidXRlczsKLX0gY2xpZW50X3JlcV90OwotCi0jZGVmaW5lIENMSUVOVF9USElTX1NPQ0tFVAkweDAxCi0KIC8qIE1vZGlmeUNvbmZpZ3VyYXRpb24gKi8KIHR5cGVkZWYgc3RydWN0IG1vZGNvbmZfdCB7CiAgICAgdV9pbnQJQXR0cmlidXRlczsKQEAgLTk0LDQzICs1Niw2IEBACiAjZGVmaW5lIElOVF9DQVJEQlVTCQkweDA0CiAjZGVmaW5lIElOVF9aT09NRURfVklERU8JMHgwOAogCi0vKiBGb3IgUmVxdWVzdElPIGFuZCBSZWxlYXNlSU8gKi8KLXR5cGVkZWYgc3RydWN0IGlvX3JlcV90IHsKLSAgICB1X2ludAlCYXNlUG9ydDE7Ci0gICAgdV9pbnQJTnVtUG9ydHMxOwotICAgIHVfaW50CUF0dHJpYnV0ZXMxOwotICAgIHVfaW50CUJhc2VQb3J0MjsKLSAgICB1X2ludAlOdW1Qb3J0czI7Ci0gICAgdV9pbnQJQXR0cmlidXRlczI7Ci0gICAgdV9pbnQJSU9BZGRyTGluZXM7Ci19IGlvX3JlcV90OwotCi0vKiBBdHRyaWJ1dGVzIGZvciBSZXF1ZXN0SU8gYW5kIFJlbGVhc2VJTyAqLwotI2RlZmluZSBJT19TSEFSRUQJCTB4MDEKLSNkZWZpbmUgSU9fRklSU1RfU0hBUkVECQkweDAyCi0jZGVmaW5lIElPX0ZPUkNFX0FMSUFTX0FDQ0VTUwkweDA0Ci0jZGVmaW5lIElPX0RBVEFfUEFUSF9XSURUSAkweDE4Ci0jZGVmaW5lIElPX0RBVEFfUEFUSF9XSURUSF84CTB4MDAKLSNkZWZpbmUgSU9fREFUQV9QQVRIX1dJRFRIXzE2CTB4MDgKLSNkZWZpbmUgSU9fREFUQV9QQVRIX1dJRFRIX0FVVE8JMHgxMAotCi0vKiBCaXRzIGluIElSUUluZm8xIGZpZWxkICovCi0jZGVmaW5lIElSUV9OTUlfSUQJCTB4MDEKLSNkZWZpbmUgSVJRX0lPQ0tfSUQJCTB4MDIKLSNkZWZpbmUgSVJRX0JFUlJfSUQJCTB4MDQKLSNkZWZpbmUgSVJRX1ZFTkRfSUQJCTB4MDgKLSNkZWZpbmUgSVJRX0lORk8yX1ZBTElECQkweDEwCi0jZGVmaW5lIElSUV9MRVZFTF9JRAkJMHgyMAotI2RlZmluZSBJUlFfUFVMU0VfSUQJCTB4NDAKLSNkZWZpbmUgSVJRX1NIQVJFX0lECQkweDgwCi0KLXR5cGVkZWYgc3RydWN0IGV2ZW50bWFza190IHsKLSAgICB1X2ludAlBdHRyaWJ1dGVzOwotICAgIHVfaW50CUV2ZW50TWFzazsKLX0gZXZlbnRtYXNrX3Q7Ci0KLSNkZWZpbmUgQ09ORl9FVkVOVF9NQVNLX1ZBTElECTB4MDEKLQogLyogQ29uZmlndXJhdGlvbiByZWdpc3RlcnMgcHJlc2VudCAqLwogI2RlZmluZSBQUkVTRU5UX09QVElPTgkJMHgwMDEKICNkZWZpbmUgUFJFU0VOVF9TVEFUVVMJCTB4MDAyCkBAIC0xNDMsMTggKzY4LDYgQEAKICNkZWZpbmUgUFJFU0VOVF9JT0JBU0VfMwkweDEwMAogI2RlZmluZSBQUkVTRU5UX0lPU0laRQkJMHgyMDAKIAotLyogRm9yIEdldE1lbVBhZ2UsIE1hcE1lbVBhZ2UgKi8KLXR5cGVkZWYgc3RydWN0IG1lbXJlcV90IHsKLSAgICB1X2ludAlDYXJkT2Zmc2V0OwotICAgIHBhZ2VfdAlQYWdlOwotfSBtZW1yZXFfdDsKLQotLyogRm9yIE1vZGlmeVdpbmRvdyAqLwotdHlwZWRlZiBzdHJ1Y3QgbW9kd2luX3QgewotICAgIHVfaW50CUF0dHJpYnV0ZXM7Ci0gICAgdV9pbnQJQWNjZXNzU3BlZWQ7Ci19IG1vZHdpbl90OwotCiAvKiBGb3IgUmVxdWVzdFdpbmRvdyAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2luX3JlcV90IHsKICAgICB1X2ludAlBdHRyaWJ1dGVzOwpAQCAtMTY0LDYxICs3NywxOSBAQAogfSB3aW5fcmVxX3Q7CiAKIC8qIEF0dHJpYnV0ZXMgZm9yIFJlcXVlc3RXaW5kb3cgKi8KLSNkZWZpbmUgV0lOX0FERFJfU1BBQ0UJCTB4MDAwMQotI2RlZmluZSBXSU5fQUREUl9TUEFDRV9NRU0JMHgwMDAwCi0jZGVmaW5lIFdJTl9BRERSX1NQQUNFX0lPCTB4MDAwMQotI2RlZmluZSBXSU5fTUVNT1JZX1RZUEUJCTB4MDAwMgotI2RlZmluZSBXSU5fTUVNT1JZX1RZUEVfQ00JMHgwMDAwCi0jZGVmaW5lIFdJTl9NRU1PUllfVFlQRV9BTQkweDAwMDIKLSNkZWZpbmUgV0lOX0VOQUJMRQkJMHgwMDA0Ci0jZGVmaW5lIFdJTl9EQVRBX1dJRFRICQkweDAwMTgKLSNkZWZpbmUgV0lOX0RBVEFfV0lEVEhfOAkweDAwMDAKLSNkZWZpbmUgV0lOX0RBVEFfV0lEVEhfMTYJMHgwMDA4Ci0jZGVmaW5lIFdJTl9EQVRBX1dJRFRIXzMyCTB4MDAxMAotI2RlZmluZSBXSU5fUEFHRUQJCTB4MDAyMAotI2RlZmluZSBXSU5fU0hBUkVECQkweDAwNDAKLSNkZWZpbmUgV0lOX0ZJUlNUX1NIQVJFRAkweDAwODAKLSNkZWZpbmUgV0lOX1VTRV9XQUlUCQkweDAxMDAKLSNkZWZpbmUgV0lOX1NUUklDVF9BTElHTgkweDAyMDAKLSNkZWZpbmUgV0lOX01BUF9CRUxPV18xTUIJMHgwNDAwCi0jZGVmaW5lIFdJTl9QUkVGRVRDSAkJMHgwODAwCi0jZGVmaW5lIFdJTl9DQUNIRUFCTEUJCTB4MTAwMAotI2RlZmluZSBXSU5fQkFSX01BU0sJCTB4ZTAwMAotI2RlZmluZSBXSU5fQkFSX1NISUZUCQkxMworI2RlZmluZSBXSU5fTUVNT1JZX1RZUEVfQ00JMHgwMCAvKiBkZWZhdWx0ICovCisjZGVmaW5lIFdJTl9NRU1PUllfVFlQRV9BTQkweDIwIC8qIE1BUF9BVFRSSUIgKi8KKyNkZWZpbmUgV0lOX0RBVEFfV0lEVEhfOAkweDAwIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUgV0lOX0RBVEFfV0lEVEhfMTYJMHgwMiAvKiBNQVBfMTZCSVQgKi8KKyNkZWZpbmUgV0lOX0VOQUJMRQkJMHgwMSAvKiBNQVBfQUNUSVZFICovCisjZGVmaW5lIFdJTl9VU0VfV0FJVAkJMHg0MCAvKiBNQVBfVVNFX1dBSVQgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgZXJyb3JfaW5mb190IHsKLSAgICBpbnQJCWZ1bmM7Ci0gICAgaW50CQlyZXRjb2RlOwotfSBlcnJvcl9pbmZvX3Q7Ci0KLS8qIEZsYWcgdG8gYmluZCB0byBhbGwgZnVuY3Rpb25zICovCi0jZGVmaW5lIEJJTkRfRk5fQUxMCTB4ZmYKLQotLyogRXZlbnRzICovCi0jZGVmaW5lIENTX0VWRU5UX1BSSV9MT1cJCTAKLSNkZWZpbmUgQ1NfRVZFTlRfUFJJX0hJR0gJCTEKLQotI2RlZmluZSBDU19FVkVOVF9XUklURV9QUk9URUNUCQkweDAwMDAwMQotI2RlZmluZSBDU19FVkVOVF9DQVJEX0xPQ0sJCTB4MDAwMDAyCi0jZGVmaW5lIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OCQkweDAwMDAwNAotI2RlZmluZSBDU19FVkVOVF9DQVJEX1JFTU9WQUwJCTB4MDAwMDA4Ci0jZGVmaW5lIENTX0VWRU5UX0JBVFRFUllfREVBRAkJMHgwMDAwMTAKLSNkZWZpbmUgQ1NfRVZFTlRfQkFUVEVSWV9MT1cJCTB4MDAwMDIwCi0jZGVmaW5lIENTX0VWRU5UX1JFQURZX0NIQU5HRQkJMHgwMDAwNDAKLSNkZWZpbmUgQ1NfRVZFTlRfQ0FSRF9ERVRFQ1QJCTB4MDAwMDgwCi0jZGVmaW5lIENTX0VWRU5UX1JFU0VUX1JFUVVFU1QJCTB4MDAwMTAwCi0jZGVmaW5lIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMCQkweDAwMDIwMAotI2RlZmluZSBDU19FVkVOVF9DQVJEX1JFU0VUCQkweDAwMDQwMAotI2RlZmluZSBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUJMHgwMDA4MDAKLSNkZWZpbmUgQ1NfRVZFTlRfUE1fU1VTUEVORAkJMHgwMDIwMDAKLSNkZWZpbmUgQ1NfRVZFTlRfUE1fUkVTVU1FCQkweDAwNDAwMAotI2RlZmluZSBDU19FVkVOVF9JTlNFUlRJT05fUkVRVUVTVAkweDAwODAwMAotI2RlZmluZSBDU19FVkVOVF9FSkVDVElPTl9SRVFVRVNUCTB4MDEwMDAwCi0jZGVmaW5lIENTX0VWRU5UX01URF9SRVFVRVNUCQkweDAyMDAwMAotI2RlZmluZSBDU19FVkVOVF9FUkFTRV9DT01QTEVURQkJMHgwNDAwMDAKLSNkZWZpbmUgQ1NfRVZFTlRfUkVRVUVTVF9BVFRFTlRJT04JMHgwODAwMDAKLSNkZWZpbmUgQ1NfRVZFTlRfQ0JfREVURUNUCQkweDEwMDAwMAotI2RlZmluZSBDU19FVkVOVF8zVkNBUkQJCQkweDIwMDAwMAotI2RlZmluZSBDU19FVkVOVF9YVkNBUkQJCQkweDQwMDAwMAorI2RlZmluZSBXSU5fRkxBR1NfTUFQCQkweDYzIC8qIE1BUF9BVFRSSUIgfCBNQVBfMTZCSVQgfCBNQVBfQUNUSVZFIHwKKwkJCQkJTUFQX1VTRV9XQUlUICovCisjZGVmaW5lIFdJTl9GTEFHU19SRVEJCTB4MWMgLyogbWFwcGluZyB0byBzb2NrZXQtPndpbltpXToKKwkJCQkJMHgwNCAtPiAwCisJCQkJCTB4MDggLT4gMQorCQkJCQkweDBjIC0+IDIKKwkJCQkJMHgxMCAtPiAzICovCiAKICNlbmRpZiAvKiBfTElOVVhfQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaCBiL2luY2x1ZGUvcGNtY2lhL2NzX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTNiODMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBjc190eXBlcy5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKLSAqIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCi0gKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAoQykgMTk5OSAgICAgICAgICAgICBEYXZpZCBBLiBIaW5kcwotICovCi0KLSNpZm5kZWYgX0xJTlVYX0NTX1RZUEVTX0gKLSNkZWZpbmUgX0xJTlVYX0NTX1RZUEVTX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi10eXBlZGVmIHVfc2hvcnQJc29ja2V0X3Q7Ci10eXBlZGVmIHVfaW50CWV2ZW50X3Q7Ci10eXBlZGVmIHVfY2hhcgljaXNkYXRhX3Q7Ci10eXBlZGVmIHVfc2hvcnQJcGFnZV90OwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgd2luZG93X2hhbmRsZV90OwotCi1zdHJ1Y3QgcmVnaW9uX3Q7Ci10eXBlZGVmIHN0cnVjdCByZWdpb25fdCAqbWVtb3J5X2hhbmRsZV90OwotCi0jaWZuZGVmIERFVl9OQU1FX0xFTgotI2RlZmluZSBERVZfTkFNRV9MRU4gMzIKLSNlbmRpZgotCi10eXBlZGVmIGNoYXIgZGV2X2luZm9fdFtERVZfTkFNRV9MRU5dOwotCi0jZW5kaWYgLyogX0xJTlVYX0NTX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2RzLmggYi9pbmNsdWRlL3BjbWNpYS9kcy5oCmluZGV4IGMxODAxNjUuLjcwYzU4ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2RzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvZHMuaApAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2VuZGlmCiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvZGV2aWNlX2lkLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0zNyw2ICszNiw4IEBACiBzdHJ1Y3QgY29uZmlnX3Q7CiBzdHJ1Y3QgbmV0X2RldmljZTsKIAordHlwZWRlZiBzdHJ1Y3QgcmVzb3VyY2UgKndpbmRvd19oYW5kbGVfdDsKKwogLyogZHluYW1pYyBkZXZpY2UgSURzIGZvciBQQ01DSUEgZGV2aWNlIGRyaXZlcnMuIFNlZQogICogRG9jdW1lbnRhdGlvbi9wY21jaWEvZHJpdmVyLnR4dCBmb3IgZGV0YWlscy4KICovCkBAIC02Miw2ICs2MywxNyBAQAogaW50IHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjbWNpYV9kcml2ZXIgKmRyaXZlcik7CiB2b2lkIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqZHJpdmVyKTsKIAorLyogZm9yIHN0cnVjdCByZXNvdXJjZSAqIGFycmF5IGVtYmVkZGVkIGluIHN0cnVjdCBwY21jaWFfZGV2aWNlICovCitlbnVtIHsKKwlQQ01DSUFfSU9QT1JUXzAsCisJUENNQ0lBX0lPUE9SVF8xLAorCVBDTUNJQV9JT01FTV8wLAorCVBDTUNJQV9JT01FTV8xLAorCVBDTUNJQV9JT01FTV8yLAorCVBDTUNJQV9JT01FTV8zLAorCVBDTUNJQV9OVU1fUkVTT1VSQ0VTLAorfTsKKwogc3RydWN0IHBjbWNpYV9kZXZpY2UgewogCS8qIHRoZSBzb2NrZXQgYW5kIHRoZSBkZXZpY2Vfbm8gW2ZvciBtdWx0aWZ1bmN0aW9uIGRldmljZXNdCiAJICAgdW5pcXVlbHkgZGVmaW5lIGEgcGNtY2lhX2RldmljZSAqLwpAQCAtNzksMTMgKzkxLDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzb2NrZXRfZGV2aWNlX2xpc3Q7CiAKIAkvKiBkZXByZWNhdGVkLCB3aWxsIGJlIGNsZWFuZWQgdXAgc29vbiAqLwotCXVfaW50CQkJb3BlbjsKLQlpb19yZXFfdAkJaW87CiAJY29uZmlnX3JlcV90CQljb25mOwogCXdpbmRvd19oYW5kbGVfdAkJd2luOwogCiAJLyogZGV2aWNlIHNldHVwICovCiAJdW5zaWduZWQgaW50CQlpcnE7CisJc3RydWN0IHJlc291cmNlCQkqcmVzb3VyY2VbUENNQ0lBX05VTV9SRVNPVVJDRVNdOworCisJdW5zaWduZWQgaW50CQlpb19saW5lczsgLyogbnVtYmVyIG9mIEkvTyBsaW5lcyAqLwogCiAJLyogSXMgdGhlIGRldmljZSBzdXNwZW5kZWQ/ICovCiAJdTE2CQkJc3VzcGVuZGVkOjE7CkBAIC0xMTcsMTMgKzEzMCw5IEBACiAJdTY0CQkJZG1hX21hc2s7CiAJc3RydWN0IGRldmljZQkJZGV2OwogCi0jaWZkZWYgQ09ORklHX1BDTUNJQV9JT0NUTAotCS8qIGRldmljZSBkcml2ZXIgd2FudGVkIGJ5IGNhcmRtZ3IgKi8KLQlzdHJ1Y3QgcGNtY2lhX2RyaXZlcgkqY2FyZG1ncjsKLSNlbmRpZgotCiAJLyogZGF0YSBwcml2YXRlIHRvIGRyaXZlcnMgKi8KIAl2b2lkCQkJKnByaXY7CisJdW5zaWduZWQgaW50CQlvcGVuOwogfTsKIAogI2RlZmluZSB0b19wY21jaWFfZGV2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RldmljZSwgZGV2KQpAQCAtMTc4LDExICsxODcsMTEgQEAKIGludCBwY21jaWFfcmVzZXRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIAogLyogQ0lTIGNvbmZpZyAqLwotaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCi0JCQkJCSBjb25mX3JlZ190ICpyZWcpOworaW50IHBjbWNpYV9yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldiwgb2ZmX3Qgd2hlcmUsIHU4ICp2YWwpOworaW50IHBjbWNpYV93cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIG9mZl90IHdoZXJlLCB1OCB2YWwpOwogCiAvKiBkZXZpY2UgY29uZmlndXJhdGlvbiAqLwotaW50IHBjbWNpYV9yZXF1ZXN0X2lvKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW9fcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3RfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKIAogaW50IF9fbXVzdF9jaGVjawogX19wY21jaWFfcmVxdWVzdF9leGNsdXNpdmVfaXJxKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKQEAgLTIwNCwyMTUgKzIxMywyNyBAQAogCQkJICB3aW5kb3dfaGFuZGxlX3QgKndoKTsKIGludCBwY21jaWFfcmVsZWFzZV93aW5kb3coc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB3aW5kb3dfaGFuZGxlX3Qgd2luKTsKIGludCBwY21jaWFfbWFwX21lbV9wYWdlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldiwgd2luZG93X2hhbmRsZV90IHdpbiwKLQkJCW1lbXJlcV90ICpyZXEpOworCQkJdW5zaWduZWQgaW50IG9mZnNldCk7CiAKIGludCBwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBtb2Rjb25mX3QgKm1vZCk7CiB2b2lkIHBjbWNpYV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOwogCisvKiBJTyBwb3J0cyAqLworI2RlZmluZSBJT19EQVRBX1BBVEhfV0lEVEgJMHgxOAorI2RlZmluZSBJT19EQVRBX1BBVEhfV0lEVEhfOAkweDAwCisjZGVmaW5lIElPX0RBVEFfUEFUSF9XSURUSF8xNgkweDA4CisjZGVmaW5lIElPX0RBVEFfUEFUSF9XSURUSF9BVVRPCTB4MTAKKworLyogY29udmVydCBmbGFnIGZvdW5kIGluIGNmZ3RhYmxlIHRvIGRhdGEgcGF0aCB3aWR0aCBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBjbWNpYV9pb19jZmdfZGF0YV93aWR0aCh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCEoZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCXJldHVybiBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJaWYgKCEoZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQlyZXR1cm4gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJcmV0dXJuIElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworfQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0KLQotLyogQmVsb3csIHRoZXJlIGFyZSBvbmx5IGRlZmluaXRpb25zIHdoaWNoIGFyZSB1c2VkIGJ5Ci0gKiAtIHRoZSBQQ01DSUEgaW9jdGwKLSAqIC0gZGVwcmVjYXRlZCBQQ01DSUEgdXNlcnNwYWNlIHRvb2xzIG9ubHkKLSAqCi0gKiBoZXJlIGJlIGRyYWdvbnMgLi4uIGhlcmUgYmUgZHJhZ29ucyAuLi4gaGVyZSBiZSBkcmFnb25zIC4uLiBoZXJlIGJlIGRyYWcKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBX0lPQ1RMKSB8fCAhZGVmaW5lZChfX0tFUk5FTF9fKQotCi0jaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fYXZyMzJfXykgfHwgXAotCWRlZmluZWQoX19iZmluX18pCi0vKiBUaGlzIChpb2FkZHJfdCkgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgJiBoZW5jZSBjYW5ub3QgYmUgY2hhbmdlZC4gKi8KLXR5cGVkZWYgdV9pbnQgICBpb2FkZHJfdDsKLSNlbHNlCi10eXBlZGVmIHVfc2hvcnQJaW9hZGRyX3Q7Ci0jZW5kaWYKLQotLyogZm9yIEFkanVzdFJlc291cmNlSW5mbyAqLwotdHlwZWRlZiBzdHJ1Y3QgYWRqdXN0X3QgewotCXVfaW50CQkJQWN0aW9uOwotCXVfaW50CQkJUmVzb3VyY2U7Ci0JdV9pbnQJCQlBdHRyaWJ1dGVzOwotCXVuaW9uIHsKLQkJc3RydWN0IG1lbW9yeSB7Ci0JCQl1X2xvbmcJCUJhc2U7Ci0JCQl1X2xvbmcJCVNpemU7Ci0JCX0gbWVtb3J5OwotCQlzdHJ1Y3QgaW8gewotCQkJaW9hZGRyX3QJQmFzZVBvcnQ7Ci0JCQlpb2FkZHJfdAlOdW1Qb3J0czsKLQkJCXVfaW50CQlJT0FkZHJMaW5lczsKLQkJfSBpbzsKLQkJc3RydWN0IGlycSB7Ci0JCQl1X2ludAkJSVJROwotCQl9IGlycTsKLQl9IHJlc291cmNlOwotfSBhZGp1c3RfdDsKLQotLyogQWN0aW9uIGZpZWxkICovCi0jZGVmaW5lIFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFCQkxCi0jZGVmaW5lIEFERF9NQU5BR0VEX1JFU09VUkNFCQkyCi0jZGVmaW5lIEdFVF9GSVJTVF9NQU5BR0VEX1JFU09VUkNFCTMKLSNkZWZpbmUgR0VUX05FWFRfTUFOQUdFRF9SRVNPVVJDRQk0Ci0vKiBSZXNvdXJjZSBmaWVsZCAqLwotI2RlZmluZSBSRVNfTUVNT1JZX1JBTkdFCQkxCi0jZGVmaW5lIFJFU19JT19SQU5HRQkJCTIKLSNkZWZpbmUgUkVTX0lSUQkJCQkzCi0vKiBBdHRyaWJ1dGUgZmllbGQgKi8KLSNkZWZpbmUgUkVTX0lSUV9UWVBFCQkJMHgwMwotI2RlZmluZSBSRVNfSVJRX1RZUEVfRVhDTFVTSVZFCQkwCi0jZGVmaW5lIFJFU19JUlFfVFlQRV9USU1FCQkxCi0jZGVmaW5lIFJFU19JUlFfVFlQRV9EWU5BTUlDCQkyCi0jZGVmaW5lIFJFU19JUlFfQ1NDCQkJMHgwNAotI2RlZmluZSBSRVNfU0hBUkVECQkJMHgwOAotI2RlZmluZSBSRVNfUkVTRVJWRUQJCQkweDEwCi0jZGVmaW5lIFJFU19BTExPQ0FURUQJCQkweDIwCi0jZGVmaW5lIFJFU19SRU1PVkVECQkJMHg0MAotCi0KLXR5cGVkZWYgc3RydWN0IHR1cGxlX3BhcnNlX3QgewotCXR1cGxlX3QJCQl0dXBsZTsKLQljaXNkYXRhX3QJCWRhdGFbMjU1XTsKLQljaXNwYXJzZV90CQlwYXJzZTsKLX0gdHVwbGVfcGFyc2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3Qgd2luX2luZm9fdCB7Ci0Jd2luZG93X2hhbmRsZV90CQloYW5kbGU7Ci0Jd2luX3JlcV90CQl3aW5kb3c7Ci0JbWVtcmVxX3QJCW1hcDsKLX0gd2luX2luZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgYmluZF9pbmZvX3QgewotCWRldl9pbmZvX3QJCWRldl9pbmZvOwotCXVfY2hhcgkJCWZ1bmN0aW9uOwotCXN0cnVjdCBwY21jaWFfZGV2aWNlCSppbnN0YW5jZTsKLQljaGFyCQkJbmFtZVtERVZfTkFNRV9MRU5dOwotCXVfc2hvcnQJCQltYWpvciwgbWlub3I7Ci0Jdm9pZAkJCSpuZXh0OwotfSBiaW5kX2luZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgbXRkX2luZm9fdCB7Ci0JZGV2X2luZm9fdCAgICAgCQlkZXZfaW5mbzsKLQl1X2ludAkJCUF0dHJpYnV0ZXM7Ci0JdV9pbnQJCQlDYXJkT2Zmc2V0OwotfSBtdGRfaW5mb190OwotCi10eXBlZGVmIHN0cnVjdCByZWdpb25faW5mb190IHsKLQl1X2ludAkJCUF0dHJpYnV0ZXM7Ci0JdV9pbnQJCQlDYXJkT2Zmc2V0OwotCXVfaW50CQkJUmVnaW9uU2l6ZTsKLQl1X2ludAkJCUFjY2Vzc1NwZWVkOwotCXVfaW50CQkJQmxvY2tTaXplOwotCXVfaW50CQkJUGFydE11bHRpcGxlOwotCXVfY2hhcgkJCUplZGVjTWZyLCBKZWRlY0luZm87Ci0JbWVtb3J5X2hhbmRsZV90CQluZXh0OwotfSByZWdpb25faW5mb190OwotCi0jZGVmaW5lIFJFR0lPTl9UWVBFCQkweDAwMDEKLSNkZWZpbmUgUkVHSU9OX1RZUEVfQ00JCTB4MDAwMAotI2RlZmluZSBSRUdJT05fVFlQRV9BTQkJMHgwMDAxCi0jZGVmaW5lIFJFR0lPTl9QUkVGRVRDSAkJMHgwMDA4Ci0jZGVmaW5lIFJFR0lPTl9DQUNIRUFCTEUJMHgwMDEwCi0jZGVmaW5lIFJFR0lPTl9CQVJfTUFTSwkJMHhlMDAwCi0jZGVmaW5lIFJFR0lPTl9CQVJfU0hJRlQJMTMKLQotLyogRm9yIFJlcGxhY2VDSVMgKi8KLXR5cGVkZWYgc3RydWN0IGNpc2R1bXBfdCB7Ci0JdV9pbnQJCQlMZW5ndGg7Ci0JY2lzZGF0YV90CQlEYXRhW0NJU1RQTF9NQVhfQ0lTX1NJWkVdOwotfSBjaXNkdW1wX3Q7Ci0KLS8qIGZvciBHZXRDb25maWd1cmF0aW9uSW5mbyAqLwotdHlwZWRlZiBzdHJ1Y3QgY29uZmlnX2luZm9fdCB7Ci0JdV9jaGFyCQkJRnVuY3Rpb247Ci0JdV9pbnQJCQlBdHRyaWJ1dGVzOwotCXVfaW50CQkJVmNjLCBWcHAxLCBWcHAyOwotCXVfaW50CQkJSW50VHlwZTsKLQl1X2ludAkJCUNvbmZpZ0Jhc2U7Ci0JdV9jaGFyCQkJU3RhdHVzLCBQaW4sIENvcHksIE9wdGlvbiwgRXh0U3RhdHVzOwotCXVfaW50CQkJUHJlc2VudDsKLQl1X2ludAkJCUNhcmRWYWx1ZXM7Ci0JdV9pbnQJCQlBc3NpZ25lZElSUTsKLQl1X2ludAkJCUlSUUF0dHJpYnV0ZXM7Ci0JaW9hZGRyX3QJCUJhc2VQb3J0MTsKLQlpb2FkZHJfdAkJTnVtUG9ydHMxOwotCXVfaW50CQkJQXR0cmlidXRlczE7Ci0JaW9hZGRyX3QJCUJhc2VQb3J0MjsKLQlpb2FkZHJfdAkJTnVtUG9ydHMyOwotCXVfaW50CQkJQXR0cmlidXRlczI7Ci0JdV9pbnQJCQlJT0FkZHJMaW5lczsKLX0gY29uZmlnX2luZm9fdDsKLQotLyogRm9yIFZhbGlkYXRlQ0lTICovCi10eXBlZGVmIHN0cnVjdCBjaXNpbmZvX3QgewotCXVfaW50CQkJQ2hhaW5zOwotfSBjaXNpbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGNzX3N0YXR1c190IHsKLQl1X2NoYXIJCQlGdW5jdGlvbjsKLQlldmVudF90IAkJQ2FyZFN0YXRlOwotCWV2ZW50X3QJCQlTb2NrZXRTdGF0ZTsKLX0gY3Nfc3RhdHVzX3Q7Ci0KLXR5cGVkZWYgdW5pb24gZHNfaW9jdGxfYXJnX3QgewotCWFkanVzdF90CQlhZGp1c3Q7Ci0JY29uZmlnX2luZm9fdAkJY29uZmlnOwotCXR1cGxlX3QJCQl0dXBsZTsKLQl0dXBsZV9wYXJzZV90CQl0dXBsZV9wYXJzZTsKLQljbGllbnRfcmVxX3QJCWNsaWVudF9yZXE7Ci0JY3Nfc3RhdHVzX3QJCXN0YXR1czsKLQljb25mX3JlZ190CQljb25mX3JlZzsKLQljaXNpbmZvX3QJCWNpc2luZm87Ci0JcmVnaW9uX2luZm9fdAkJcmVnaW9uOwotCWJpbmRfaW5mb190CQliaW5kX2luZm87Ci0JbXRkX2luZm9fdAkJbXRkX2luZm87Ci0Jd2luX2luZm9fdAkJd2luX2luZm87Ci0JY2lzZHVtcF90CQljaXNkdW1wOwotfSBkc19pb2N0bF9hcmdfdDsKLQotI2RlZmluZSBEU19BREpVU1RfUkVTT1VSQ0VfSU5GTwkJCV9JT1dSKCdkJywgIDIsIGFkanVzdF90KQotI2RlZmluZSBEU19HRVRfQ09ORklHVVJBVElPTl9JTkZPCQlfSU9XUignZCcsICAzLCBjb25maWdfaW5mb190KQotI2RlZmluZSBEU19HRVRfRklSU1RfVFVQTEUJCQlfSU9XUignZCcsICA0LCB0dXBsZV90KQotI2RlZmluZSBEU19HRVRfTkVYVF9UVVBMRQkJCV9JT1dSKCdkJywgIDUsIHR1cGxlX3QpCi0jZGVmaW5lIERTX0dFVF9UVVBMRV9EQVRBCQkJX0lPV1IoJ2QnLCAgNiwgdHVwbGVfcGFyc2VfdCkKLSNkZWZpbmUgRFNfUEFSU0VfVFVQTEUJCQkJX0lPV1IoJ2QnLCAgNywgdHVwbGVfcGFyc2VfdCkKLSNkZWZpbmUgRFNfUkVTRVRfQ0FSRAkJCQlfSU8gICgnZCcsICA4KQotI2RlZmluZSBEU19HRVRfU1RBVFVTCQkJCV9JT1dSKCdkJywgIDksIGNzX3N0YXR1c190KQotI2RlZmluZSBEU19BQ0NFU1NfQ09ORklHVVJBVElPTl9SRUdJU1RFUglfSU9XUignZCcsIDEwLCBjb25mX3JlZ190KQotI2RlZmluZSBEU19WQUxJREFURV9DSVMJCQkJX0lPUiAoJ2QnLCAxMSwgY2lzaW5mb190KQotI2RlZmluZSBEU19TVVNQRU5EX0NBUkQJCQkJX0lPICAoJ2QnLCAxMikKLSNkZWZpbmUgRFNfUkVTVU1FX0NBUkQJCQkJX0lPICAoJ2QnLCAxMykKLSNkZWZpbmUgRFNfRUpFQ1RfQ0FSRAkJCQlfSU8gICgnZCcsIDE0KQotI2RlZmluZSBEU19JTlNFUlRfQ0FSRAkJCQlfSU8gICgnZCcsIDE1KQotI2RlZmluZSBEU19HRVRfRklSU1RfUkVHSU9OCQkJX0lPV1IoJ2QnLCAxNiwgcmVnaW9uX2luZm9fdCkKLSNkZWZpbmUgRFNfR0VUX05FWFRfUkVHSU9OCQkJX0lPV1IoJ2QnLCAxNywgcmVnaW9uX2luZm9fdCkKLSNkZWZpbmUgRFNfUkVQTEFDRV9DSVMJCQkJX0lPV1IoJ2QnLCAxOCwgY2lzZHVtcF90KQotI2RlZmluZSBEU19HRVRfRklSU1RfV0lORE9XCQkJX0lPUiAoJ2QnLCAxOSwgd2luX2luZm9fdCkKLSNkZWZpbmUgRFNfR0VUX05FWFRfV0lORE9XCQkJX0lPV1IoJ2QnLCAyMCwgd2luX2luZm9fdCkKLSNkZWZpbmUgRFNfR0VUX01FTV9QQUdFCQkJCV9JT1dSKCdkJywgMjEsIHdpbl9pbmZvX3QpCi0KLSNkZWZpbmUgRFNfQklORF9SRVFVRVNUCQkJCV9JT1dSKCdkJywgNjAsIGJpbmRfaW5mb190KQotI2RlZmluZSBEU19HRVRfREVWSUNFX0lORk8JCQlfSU9XUignZCcsIDYxLCBiaW5kX2luZm9fdCkKLSNkZWZpbmUgRFNfR0VUX05FWFRfREVWSUNFCQkJX0lPV1IoJ2QnLCA2MiwgYmluZF9pbmZvX3QpCi0jZGVmaW5lIERTX1VOQklORF9SRVFVRVNUCQkJX0lPVyAoJ2QnLCA2MywgYmluZF9pbmZvX3QpCi0jZGVmaW5lIERTX0JJTkRfTVRECQkJCV9JT1dSKCdkJywgNjQsIG10ZF9pbmZvX3QpCi0KLQotLyogdXNlZCBpbiB1c2Vyc3BhY2Ugb25seSAqLwotI2RlZmluZSBDU19JTl9VU0UJCQkweDFlCi0KLSNkZWZpbmUgSU5GT19NQVNURVJfQ0xJRU5UCTB4MDEKLSNkZWZpbmUgSU5GT19JT19DTElFTlQJCTB4MDIKLSNkZWZpbmUgSU5GT19NVERfQ0xJRU5UCQkweDA0Ci0jZGVmaW5lIElORk9fTUVNX0NMSUVOVAkJMHgwOAotI2RlZmluZSBNQVhfTlVNX0NMSUVOVFMJCTMKLQotI2RlZmluZSBJTkZPX0NBUkRfU0hBUkUJCTB4MTAKLSNkZWZpbmUgSU5GT19DQVJEX0VYQ0wJCTB4MjAKLQotCi0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChDT05GSUdfUENNQ0lBX0lPQ1RMKSAqLwotCiAjZW5kaWYgLyogX0xJTlVYX0RTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL3NzLmggYi9pbmNsdWRlL3BjbWNpYS9zcy5oCmluZGV4IDc2NDI4MWIuLjYyNmI2M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL3NzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvc3MuaApAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIHRhc2tfc3RydWN0LCBjb21wbGV0aW9uICovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2lmZGVmIENPTkZJR19DQVJEQlVTCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC0xNjIsMTcgKzE2MSwxMCBAQAogCXVfaW50CQkJCXBjaV9pcnE7CiAJc3RydWN0IHBjaV9kZXYJCQkqY2JfZGV2OwogCi0KIAkvKiBzb2NrZXQgc2V0dXAgaXMgZG9uZSBzbyByZXNvdXJjZXMgc2hvdWxkIGJlIGFibGUgdG8gYmUgYWxsb2NhdGVkLgogCSAqIE9ubHkgaWYgc2V0IHRvIDEsIGNhbGxzIHRvIGZpbmRfe2lvLG1lbX1fcmVnaW9uIGFyZSBoYW5kbGVkLCBhbmQKIAkgKiBpbnNlcnRpbyBldmVudHMgYXJlIGFjdHVhbGx5IG1hbmFnZWQgYnkgdGhlIFBDTUNJQSBsYXllci4qLwotCXU4CQkJCXJlc291cmNlX3NldHVwX2RvbmU6MTsKLQotCS8qIEl0J3Mgb2xkIGlmIHJlc291cmNlIHNldHVwIGlzIGRvbmUgdXNpbmcgYWRqdXN0X3Jlc291cmNlX2luZm8oKSAqLwotCXU4CQkJCXJlc291cmNlX3NldHVwX29sZDoxOwotCXU4CQkJCXJlc291cmNlX3NldHVwX25ldzoxOwotCi0JdTgJCQkJcmVzZXJ2ZWQ6NTsKKwl1OAkJCQlyZXNvdXJjZV9zZXR1cF9kb25lOwogCiAJLyogc29ja2V0IG9wZXJhdGlvbnMgKi8KIAlzdHJ1Y3QgcGNjYXJkX29wZXJhdGlvbnMJKm9wczsKQEAgLTIxOCwxNSArMjEwLDggQEAKIAkgKiBpbmNvcnJlY3RuZXNzIGFuZCBjaGFuZ2UgKi8KIAl1OAkJCQlkZXZpY2VfY291bnQ7CiAKLQkvKiAxNi1iaXQgc3RhdGU6ICovCi0Jc3RydWN0IHsKLQkJLyogIm1hc3RlciIgaW9jdGwgaXMgdXNlZCAqLwotCQl1OAkJCWJ1c3k6MTsKLQkJLyogdGhlIFBDTUNJQSBjYXJkIGNvbnNpc3RzIG9mIHR3byBwc2V1ZG8gZGV2aWNlcyAqLwotCQl1OAkJCWhhc19wZmM6MTsKLQotCQl1OAkJCXJlc2VydmVkOjY7Ci0JfSBwY21jaWFfc3RhdGU7CisJLyogZG9lcyB0aGUgUENNQ0lBIGNhcmQgY29uc2lzdCBvZiB0d28gcHNldWRvIGRldmljZXM/ICovCisJdTgJCQkJcGNtY2lhX3BmYzsKIAogCS8qIG5vbi16ZXJvIGlmIFBDTUNJQSBjYXJkIGlzIHByZXNlbnQgKi8KIAlhdG9taWNfdAkJCXByZXNlbnQ7CkBAIC0yMzQsMTAgKzIxOSw2IEBACiAJLyogSVJRIHRvIGJlIHVzZWQgYnkgUENNQ0lBIGRldmljZXMuIE1heSBub3QgYmUgSVJRIDAuICovCiAJdW5zaWduZWQgaW50CQkJcGNtY2lhX2lycTsKIAotI2lmZGVmIENPTkZJR19QQ01DSUFfSU9DVEwKLQlzdHJ1Y3QgdXNlcl9pbmZvX3QJCSp1c2VyOwotCXdhaXRfcXVldWVfaGVhZF90CQlxdWV1ZTsKLSNlbmRpZiAvKiBDT05GSUdfUENNQ0lBX0lPQ1RMICovCiAjZW5kaWYgLyogQ09ORklHX1BDTUNJQSAqLwogCiAJLyogc29ja2V0IGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaCBiL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKaW5kZXggYjY5ZTZlMS4uOWIyYzMwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaAorKysgYi9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCkBAIC02NSw3ICs2NSw3IEBACiAJfTsKIAlfX2JlMTYJCXNlcnZpY2VJZDsJLyogc2VydmljZSBJRCAqLwogCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBfX3J4cnBjX2hlYWRlcl9vZmYoWCkgb2Zmc2V0b2Yoc3RydWN0IHJ4cnBjX2hlYWRlcixYKQogCkBAIC0xMjAsNyArMTIwLDcgQEAKICNkZWZpbmUgUlhSUENfQUNLX1RZUEVfTkFDSwkJMAogI2RlZmluZSBSWFJQQ19BQ0tfVFlQRV9BQ0sJCTEKIAotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBBQ0sgcGFja2V0cyBjYW4gaGF2ZSBhIGZ1cnRoZXIgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGFnZ2VkIG9uIHRoZSBlbmQKQEAgLTE0MSw3ICsxNDEsNyBAQAogCV9fYmUzMgkJbm9uY2U7CQkvKiBlbmNyeXB0ZWQgcmFuZG9tIG51bWJlciAqLwogCV9fYmUzMgkJbWluX2xldmVsOwkvKiBtaW5pbXVtIHNlY3VyaXR5IGxldmVsICovCiAJX19iZTMyCQlfX3BhZGRpbmc7CS8qIHBhZGRpbmcgdG8gOC1ieXRlIGJvdW5kYXJ5ICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAJX19iZTMyCQlrdm5vOwkJLyogS2VyYmVyb3Mga2V5IHZlcnNpb24gbnVtYmVyICovCiAJX19iZTMyCQl0aWNrZXRfbGVuOwkvKiBLZXJiZXJvcyB0aWNrZXQgbGVuZ3RoICAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZWxzLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZWxzLmgKaW5kZXggZjk0MzI4MS4uNDgxYWJiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2Vscy5oCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19lbHMuaApAQCAtMTkxLDYgKzE5MSw3IEBACiAJRUxTX1JKVF9VTkFCID0JCTB4MDksCS8qIHVuYWJsZSB0byBwZXJmb3JtIGNvbW1hbmQgcmVxdWVzdCAqLwogCUVMU19SSlRfVU5TVVAgPQkJMHgwYiwJLyogY29tbWFuZCBub3Qgc3VwcG9ydGVkICovCiAJRUxTX1JKVF9JTlBST0cgPQkweDBlLAkvKiBjb21tYW5kIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKwlFTFNfUkpUX0ZJUCA9CQkweDIwLAkvKiBGSVAgZXJyb3IgKi8KIAlFTFNfUkpUX1ZFTkRPUiA9CTB4ZmYsCS8qIHZlbmRvciBzcGVjaWZpYyBlcnJvciAqLwogfTsKIApAQCAtMjEyLDYgKzIxMyw3IEBACiAJRUxTX0VYUExfVU5BQl9EQVRBID0JMHgyYSwJLyogdW5hYmxlIHRvIHN1cHBseSByZXF1ZXN0ZWQgZGF0YSAqLwogCUVMU19FWFBMX1VOU1VQUiA9CTB4MmMsCS8qIFJlcXVlc3Qgbm90IHN1cHBvcnRlZCAqLwogCUVMU19FWFBMX0lOVl9MRU4gPQkweDJkLAkvKiBJbnZhbGlkIHBheWxvYWQgbGVuZ3RoICovCisJRUxTX0VYUExfTk9UX05FSUdIQk9SID0gMHg2MiwJLyogVk4yVk5fUG9ydCBub3QgaW4gbmVpZ2hib3Igc2V0ICovCiAJLyogVEJEIC0gYWJvdmUgZGVmaW5pdGlvbnMgaW5jb21wbGV0ZSAqLwogfTsKIApAQCAtNDA1LDYgKzQwNywxNSBAQAogfTsKIAogLyoKKyAqIEVMU19QUkxPIC0gUHJvY2VzcyBsb2dvdXQgcmVxdWVzdCBhbmQgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBmY19lbHNfcHJsbyB7CisJX191OCAgICAgICAgICAgIHBybG9fY21kOyAgICAgICAvKiBjb21tYW5kICovCisJX191OCAgICAgICAgICAgIHBybG9fb2JzOyAgICAgICAvKiBvYnNvbGV0ZSwgYnV0IHNoYWxsIGJlIHNldCB0byAxMGggKi8KKwlfX2JlMTYgICAgICAgICAgcHJsb19sZW47ICAgICAgIC8qIHBheWxvYWQgbGVuZ3RoICovCit9OworCisvKgogICogRUxTX0FESVNDIHBheWxvYWQKICAqLwogc3RydWN0IGZjX2Vsc19hZGlzYyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZmNvZS5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2Zjb2UuaAppbmRleCBlNmFkM2QyLi5kNWRjZDYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvZmMvZmNfZmNvZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19mY29lLmgKQEAgLTIyLDIzICsyMiwxOCBAQAogCiAvKgogICogRkNvRSAtIEZpYnJlIENoYW5uZWwgb3ZlciBFdGhlcm5ldC4KKyAqIFNlZSBUMTEgRkMtQkItNSBSZXYgMi4wMCAoMDktMDU2djUucGRmKQogICovCiAKIC8qCi0gKiBGQ19GQ09FX09VSSBoYXNuJ3QgYmVlbiBzdGFuZGFyZGl6ZWQgeWV0LiAgIFhYWCBUQkQuCisgKiBEZWZhdWx0IEZDX0ZDT0VfT1VJIC8gRkMtTUFQIHZhbHVlLgogICovCi0jaWZuZGVmIEZDX0ZDT0VfT1VJCi0jZGVmaW5lCUZDX0ZDT0VfT1VJCTB4MGVmYzAwCS8qIHVwcGVyIDI0IGJpdHMgb2YgRkNPRSBkZXN0IE1BQyBUQkQgKi8KLSNlbmRpZgorI2RlZmluZQlGQ19GQ09FX09VSQkweDBlZmMwMAkvKiB1cHBlciAyNCBiaXRzIG9mIEZDT0UgTUFDICovCiAKIC8qCi0gKiBUaGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgZm9yIHRoZSBmYWJyaWMgbG9naW4gbWF5IGdldCBhIGRpZmZlcmVudCBPVUkuCi0gKiBUaGlzIGlzbid0IHN0YW5kYXJkaXplZCB5ZXQuCisgKiBGYWJyaWMgTG9naW4gKEZMT0dJKSBNQUMgZm9yIG5vbi1GSVAgdXNlLiAgTm9uLUZJUCB1c2UgaXMgZGVwcmVjYXRlZC4KICAqLwotI2lmbmRlZiBGQ19GQ09FX0ZMT0dJX01BQwotLyogZ2F0ZXdheSBNQUMgLSBUQkQgKi8KICNkZWZpbmUJRkNfRkNPRV9GTE9HSV9NQUMgeyAweDBlLCAweGZjLCAweDAwLCAweGZmLCAweGZmLCAweGZlIH0KLSNlbmRpZgogCiAjZGVmaW5lCUZDX0ZDT0VfVkVSCTAJCQkvKiB2ZXJzaW9uICovCiAKQEAgLTUxLDggKzQ2LDYgQEAKIAogLyoKICAqIEZDb0UgZnJhbWUgaGVhZGVyIC0gMTQgYnl0ZXMKLSAqCi0gKiBUaGlzIGlzIHRoZSBBdWd1c3QgMjAwNyB2ZXJzaW9uIG9mIHRoZSBGQ29FIGhlYWRlciBhcyBkZWZpbmVkIGJ5IFQxMS4KICAqIFRoaXMgZm9sbG93cyB0aGUgVkxBTiBoZWFkZXIsIHdoaWNoIGluY2x1ZGVzIHRoZSBldGhlcnR5cGUuCiAgKi8KIHN0cnVjdCBmY29lX2hkciB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZmlwLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmlwLmgKaW5kZXggMTdiYWExOS4uYWUyNWQ0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZpcC5oCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19maXAuaApAQCAtMTcsOSArMTcsMTIgQEAKICNpZm5kZWYgX0ZDX0ZJUF9IXwogI2RlZmluZSBfRkNfRklQX0hfCiAKKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX25zLmg+CisKIC8qCiAgKiBUaGlzIHZlcnNpb24gaXMgYmFzZWQgb246CiAgKiBodHRwOi8vd3d3LnQxMS5vcmcvZnRwL3QxMS9wdWIvZmMvYmItNS8wOC01NDN2MS5wZGYKKyAqIGFuZCBUMTEgRkMtQkItNiAxMC0wMTl2NC5wZGYgKEp1bmUgMjAxMCBWTjJWTiBwcm9wb3NhbCkKICAqLwogCiAjZGVmaW5lIEZJUF9ERUZfUFJJCTEyOAkvKiBkZWZhdWx0IHNlbGVjdGlvbiBwcmlvcml0eSAqLwpAQCAtMjksMTEgKzMyLDI0IEBACiAjZGVmaW5lIEZJUF9GQ0ZfRlVaWgkxMDAJLyogcmFuZG9tIHRpbWUgYWRkZWQgYnkgRkNGIChtUykgKi8KIAogLyoKKyAqIFZOMlZOIHByb3Bvc2VkLXN0YW5kYXJkIHZhbHVlcy4KKyAqLworI2RlZmluZSBGSVBfVk5fRkNfTUFQCTB4MGVmZDAwIC8qIE1BQyBPVUkgZm9yIFZOMlZOIHVzZSAqLworI2RlZmluZSBGSVBfVk5fUFJPQkVfV0FJVCAxMDAJLyogaW50ZXJ2YWwgYmV0d2VlbiBWTjJWTiBwcm9iZXMgKG1zKSAqLworI2RlZmluZSBGSVBfVk5fQU5OX1dBSVQgNDAwCS8qIGludGVydmFsIGJldHdlZW4gVk4yVk4gYW5ub3VuY2VtZW50cyAobXMpICovCisjZGVmaW5lIEZJUF9WTl9STElNX0lOVCAxMDAwMAkvKiBpbnRlcnZhbCBiZXR3ZWVuIHByb2JlcyB3aGVuIHJhdGUgbGltaXRlZCAqLworI2RlZmluZSBGSVBfVk5fUkxJTV9DT1VOVCAxMAkvKiBudW1iZXIgb2YgcHJvYmVzIGJlZm9yZSByYXRlIGxpbWl0aW5nICovCisjZGVmaW5lIEZJUF9WTl9CRUFDT05fSU5UIDgwMDAJLyogaW50ZXJ2YWwgYmV0d2VlbiBWTjJWTiBiZWFjb25zICovCisjZGVmaW5lIEZJUF9WTl9CRUFDT05fRlVaWiAxMDAJLyogcmFuZG9tIHRpbWUgdG8gYWRkIHRvIGJlYWNvbiBwZXJpb2QgKG1zKSAqLworCisvKgogICogTXVsdGljYXN0IE1BQyBhZGRyZXNzZXMuICBUMTEtYWRvcHRlZC4KICAqLwotI2RlZmluZSBGSVBfQUxMX0ZDT0VfTUFDUwkoKHU4WzZdKSB7IDEsIDB4MTAsIDB4MTgsIDEsIDAsIDAgfSkKLSNkZWZpbmUgRklQX0FMTF9FTk9ERV9NQUNTCSgodThbNl0pIHsgMSwgMHgxMCwgMHgxOCwgMSwgMCwgMSB9KQotI2RlZmluZSBGSVBfQUxMX0ZDRl9NQUNTCSgodThbNl0pIHsgMSwgMHgxMCwgMHgxOCwgMSwgMCwgMiB9KQorI2RlZmluZSBGSVBfQUxMX0ZDT0VfTUFDUwkoKF9fdThbNl0pIHsgMSwgMHgxMCwgMHgxOCwgMSwgMCwgMCB9KQorI2RlZmluZSBGSVBfQUxMX0VOT0RFX01BQ1MJKChfX3U4WzZdKSB7IDEsIDB4MTAsIDB4MTgsIDEsIDAsIDEgfSkKKyNkZWZpbmUgRklQX0FMTF9GQ0ZfTUFDUwkoKF9fdThbNl0pIHsgMSwgMHgxMCwgMHgxOCwgMSwgMCwgMiB9KQorI2RlZmluZSBGSVBfQUxMX1ZOMlZOX01BQ1MJKChfX3U4WzZdKSB7IDEsIDB4MTAsIDB4MTgsIDEsIDAsIDQgfSkKKyNkZWZpbmUgRklQX0FMTF9QMlBfTUFDUwkoKF9fdThbNl0pIHsgMSwgMHgxMCwgMHgxOCwgMSwgMCwgNSB9KQogCiAjZGVmaW5lIEZJUF9WRVIJCTEJCS8qIHZlcnNpb24gZm9yIGZpcF9oZWFkZXIgKi8KIApAQCAtNjAsNiArNzYsNyBAQAogCUZJUF9PUF9MUyA9CTIsCQkvKiBMaW5rIFNlcnZpY2UgcmVxdWVzdCBvciByZXBseSAqLwogCUZJUF9PUF9DVFJMID0JMywJCS8qIEtlZXAgQWxpdmUgLyBMaW5rIFJlc2V0ICovCiAJRklQX09QX1ZMQU4gPQk0LAkJLyogVkxBTiBkaXNjb3ZlcnkgKi8KKwlGSVBfT1BfVk4yVk4gPQk1LAkJLyogVk4yVk4gb3BlcmF0aW9uICovCiAJRklQX09QX1ZFTkRPUl9NSU4gPSAweGZmZjgsCS8qIG1pbiB2ZW5kb3Itc3BlY2lmaWMgb3Bjb2RlICovCiAJRklQX09QX1ZFTkRPUl9NQVggPSAweGZmZmUsCS8qIG1heCB2ZW5kb3Itc3BlY2lmaWMgb3Bjb2RlICovCiB9OwpAQCAtOTcsMTEgKzExNCwyMyBAQAogfTsKIAogLyoKKyAqIFN1YmNvZGVzIGZvciBGSVBfT1BfVk4yVk4uCisgKi8KK2VudW0gZmlwX3ZuMnZuX3N1YmNvZGUgeworCUZJUF9TQ19WTl9QUk9CRV9SRVEgPSAxLAkvKiBwcm9iZSByZXF1ZXN0ICovCisJRklQX1NDX1ZOX1BST0JFX1JFUCA9IDIsCS8qIHByb2JlIHJlcGx5ICovCisJRklQX1NDX1ZOX0NMQUlNX05PVElGWSA9IDMsCS8qIGNsYWltIG5vdGlmaWNhdGlvbiAqLworCUZJUF9TQ19WTl9DTEFJTV9SRVAgPSA0LAkvKiBjbGFpbSByZXNwb25zZSAqLworCUZJUF9TQ19WTl9CRUFDT04gPSA1LAkJLyogYmVhY29uICovCit9OworCisvKgogICogZmxhZ3MgaW4gaGVhZGVyIGZpcF9mbGFncy4KICAqLwogZW51bSBmaXBfZmxhZyB7CiAJRklQX0ZMX0ZQTUEgPQkweDgwMDAsCQkvKiBzdXBwb3J0cyBGUE1BIGZhYnJpYy1wcm92aWRlZCBNQUNzICovCiAJRklQX0ZMX1NQTUEgPQkweDQwMDAsCQkvKiBzdXBwb3J0cyBTUE1BIHNlcnZlci1wcm92aWRlZCBNQUNzICovCisJRklQX0ZMX1JFQ19PUl9QMlAgPSAweDAwMDgsCS8qIGNvbmZpZ3VyZWQgYWRkciBvciBwb2ludC10by1wb2ludCAqLwogCUZJUF9GTF9BVkFJTCA9CTB4MDAwNCwJCS8qIGF2YWlsYWJsZSBmb3IgRkxPR0kvRUxQICovCiAJRklQX0ZMX1NPTCA9CTB4MDAwMiwJCS8qIHRoaXMgaXMgYSBzb2xpY2l0ZWQgbWVzc2FnZSAqLwogCUZJUF9GTF9GUE9SVCA9CTB4MDAwMSwJCS8qIHNlbnQgZnJvbSBhbiBGIHBvcnQgKi8KQEAgLTEzMCw2ICsxNTksNyBAQAogCUZJUF9EVF9GS0EgPQkxMiwJCS8qIGFkdmVydGlzZW1lbnQga2VlcC1hbGl2ZSBwZXJpb2QgKi8KIAlGSVBfRFRfVkVORE9SID0JMTMsCQkvKiB2ZW5kb3IgSUQgKi8KIAlGSVBfRFRfVkxBTiA9CTE0LAkJLyogdmxhbiBudW1iZXIgKi8KKwlGSVBfRFRfRkM0RiA9CTE1LAkJLyogRkMtNCBmZWF0dXJlcyAqLwogCUZJUF9EVF9MSU1JVCwJCQkvKiBtYXggZGVmaW5lZCBkZXNjX3R5cGUgKyAxICovCiAJRklQX0RUX1ZFTkRPUl9CQVNFID0gMTI4LAkvKiBmaXJzdCB2ZW5kb3Itc3BlY2lmaWMgZGVzY190eXBlICovCiB9OwpAQCAtMjI5LDYgKzI1OSwxNiBAQAogLyogRklQX0RUX0ZLQSBmbGFncyAqLwogCiAvKgorICogRklQX0RUX0ZDNEYgLSBGQy00IGZlYXR1cmVzLgorICovCitzdHJ1Y3QgZmlwX2ZjNF9mZWF0IHsKKwlzdHJ1Y3QgZmlwX2Rlc2MgZmRfZGVzYzsKKwlfX3U4CQlmZF9yZXN2ZFsyXTsKKwlzdHJ1Y3QgZmNfbnNfZnRzIGZkX2Z0czsKKwlzdHJ1Y3QgZmNfbnNfZmYJZmRfZmY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgogICogRklQX0RUX1ZFTkRPUiBkZXNjcmlwdG9yLgogICovCiBzdHJ1Y3QgZmlwX3ZlbmRvcl9kZXNjIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mYy9mY19ucy5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX25zLmgKaW5kZXggZTdkM2FjNC4uMTg1MDE1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX25zLmgKKysrIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX25zLmgKQEAgLTEwMCw2ICsxMDAsMTMgQEAKIH07CiAKIC8qCisgKiBGQzQtZmVhdHVyZXMgb2JqZWN0LgorICovCitzdHJ1Y3QgZmNfbnNfZmYJeworCV9fYmUzMglmZF9mZWF0W0ZDX05TX1RZUEVTICogNCAvIEZDX05TX0JQV107IC8qIDQtYml0cyBwZXIgRkMtdHlwZSAqLworfTsKKworLyoKICAqIEdJRF9QVCByZXF1ZXN0LgogICovCiBzdHJ1Y3QgZmNfbnNfZ2lkX3B0IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mY19lbmNvZGUuaCBiL2luY2x1ZGUvc2NzaS9mY19lbmNvZGUuaAppbmRleCA5YjQ4NjdjLi42ZDI5M2M4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvZmNfZW5jb2RlLmgKKysrIGIvaW5jbHVkZS9zY3NpL2ZjX2VuY29kZS5oCkBAIC0yMSw2ICsyMSwxMyBAQAogI2RlZmluZSBfRkNfRU5DT0RFX0hfCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCisvKgorICogRl9DVEwgdmFsdWVzIGZvciBzaW1wbGUgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KKyAqLworI2RlZmluZSBGQ19GQ1RMX1JFUQkoRkNfRkNfRklSU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklUKQorI2RlZmluZSBGQ19GQ1RMX1JFU1AJKEZDX0ZDX0VYX0NUWCB8IEZDX0ZDX0xBU1RfU0VRIHwgXAorCQkJRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklUKQorCiBzdHJ1Y3QgZmNfbnNfcmZ0IHsKIAlzdHJ1Y3QgZmNfbnNfZmlkIGZpZDsJLyogcG9ydCBJRCBvYmplY3QgKi8KIAlzdHJ1Y3QgZmNfbnNfZnRzIGZ0czsJLyogRkM0LXR5cGVzIG9iamVjdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmggYi9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaAppbmRleCA0ZDNlOWM3Li40YWQwMjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaAorKysgYi9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaApAQCAtMzAsNiArMzAsMjMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAKKy8qIHNvbWUgaGVscGZ1bCBtYWNyb3MgKi8KKworI2RlZmluZSBudG9obGwoeCkgYmU2NF90b19jcHUoeCkKKyNkZWZpbmUgaHRvbmxsKHgpIGNwdV90b19iZTY0KHgpCisKK3N0YXRpYyBpbmxpbmUgdTMyIG50b2gyNChjb25zdCB1OCAqcCkKK3sKKwlyZXR1cm4gKHBbMF0gPDwgMTYpIHwgKHBbMV0gPDwgOCkgfCBwWzJdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHRvbjI0KHU4ICpwLCB1MzIgdikKK3sKKwlwWzBdID0gKHYgPj4gMTYpICYgMHhmZjsKKwlwWzFdID0gKHYgPj4gOCkgJiAweGZmOworCXBbMl0gPSB2ICYgMHhmZjsKK30KKwogLyoKICAqIFRoZSBmY19mcmFtZSBpbnRlcmZhY2UgaXMgdXNlZCB0byBwYXNzIGZyYW1lIGRhdGEgYmV0d2VlbiBmdW5jdGlvbnMuCiAgKiBUaGUgZnJhbWUgaW5jbHVkZXMgdGhlIGRhdGEgYnVmZmVyLCBsZW5ndGgsIGFuZCBTT0YgLyBFT0YgZGVsaW1pdGVyIHR5cGVzLgpAQCAtNTEsNiArNjgsNyBAQAogI2RlZmluZSBmcl9zb2YoZnApCShmcl9jYihmcCktPmZyX3NvZikKICNkZWZpbmUgZnJfZW9mKGZwKQkoZnJfY2IoZnApLT5mcl9lb2YpCiAjZGVmaW5lIGZyX2ZsYWdzKGZwKQkoZnJfY2IoZnApLT5mcl9mbGFncykKKyNkZWZpbmUgZnJfZW5jYXBzKGZwKQkoZnJfY2IoZnApLT5mcl9lbmNhcHMpCiAjZGVmaW5lIGZyX21heF9wYXlsb2FkKGZwKQkoZnJfY2IoZnApLT5mcl9tYXhfcGF5bG9hZCkKICNkZWZpbmUgZnJfZnNwKGZwKQkoZnJfY2IoZnApLT5mcl9mc3ApCiAjZGVmaW5lIGZyX2NyYyhmcCkJKGZyX2NiKGZwKS0+ZnJfY3JjKQpAQCAtNjYsOSArODQsMTAgQEAKIAlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnJfZnNwOwkvKiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmNwIEkvTyAqLwogCXUzMgkJZnJfY3JjOwogCXUxNgkJZnJfbWF4X3BheWxvYWQ7CS8qIG1heCBGQyBwYXlsb2FkICovCi0JZW51bSBmY19zb2YJZnJfc29mOwkJLyogc3RhcnQgb2YgZnJhbWUgZGVsaW1pdGVyICovCi0JZW51bSBmY19lb2YJZnJfZW9mOwkJLyogZW5kIG9mIGZyYW1lIGRlbGltaXRlciAqLworCXU4CQlmcl9zb2Y7CQkvKiBzdGFydCBvZiBmcmFtZSBkZWxpbWl0ZXIgKi8KKwl1OAkJZnJfZW9mOwkJLyogZW5kIG9mIGZyYW1lIGRlbGltaXRlciAqLwogCXU4CQlmcl9mbGFnczsJLyogZmxhZ3MgLSBzZWUgYmVsb3cgKi8KKwl1OAkJZnJfZW5jYXBzOwkvKiBMTEQgZW5jYXBzdWxhdGlvbiBpbmZvIChlLmcuIEZJUCkgKi8KIAl1OAkJZ3JhbnRlZF9tYWNbRVRIX0FMRU5dOyAvKiBGQ29FIE1BQyBhZGRyZXNzICovCiB9OwogCkBAIC05Nyw2ICsxMTYsNyBAQAogCWZyX2RldihmcCkgPSBOVUxMOwogCWZyX3NlcShmcCkgPSBOVUxMOwogCWZyX2ZsYWdzKGZwKSA9IDA7CisJZnJfZW5jYXBzKGZwKSA9IDA7CiB9CiAKIHN0cnVjdCBmY19mcmFtZSAqZmNfZnJhbWVfYWxsb2NfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKiwgc2l6ZV90IHBheWxvYWRfbGVuKTsKQEAgLTEzNiwxMyArMTU2LDM5IEBACiAKIC8qCiAgKiBHZXQgZnJhbWUgaGVhZGVyIGZyb20gbWVzc2FnZSBpbiBmY19mcmFtZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIHZlcnNpb24gZG9lc24ndCBkbyBhIGxlbmd0aCBjaGVjay4KKyAqLworc3RhdGljIGlubGluZQorc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqX19mY19mcmFtZV9oZWFkZXJfZ2V0KGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJcmV0dXJuIChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopZnJfaGRyKGZwKTsKK30KKworLyoKKyAqIEdldCBmcmFtZSBoZWFkZXIgZnJvbSBtZXNzYWdlIGluIGZjX2ZyYW1lIHN0cnVjdHVyZS4KICAqIFRoaXMgaGlkZXMgYSBjYXN0IGFuZCBwcm92aWRlcyBhIHBsYWNlIHRvIGFkZCBzb21lIGNoZWNraW5nLgogICovCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmY19mcmFtZV9oZWFkZXJfZ2V0KGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqZnApCiB7CiAJV0FSTl9PTihmcl9sZW4oZnApIDwgc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpKTsKLQlyZXR1cm4gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKikgZnJfaGRyKGZwKTsKKwlyZXR1cm4gX19mY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKK30KKworLyoKKyAqIEdldCBzb3VyY2UgRkNfSUQgKFNfSUQpIGZyb20gZnJhbWUgaGVhZGVyIGluIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGZjX2ZyYW1lX3NpZChjb25zdCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXJldHVybiBudG9oMjQoX19mY19mcmFtZV9oZWFkZXJfZ2V0KGZwKS0+Zmhfc19pZCk7Cit9CisKKy8qCisgKiBHZXQgZGVzdGluYXRpb24gRkNfSUQgKERfSUQpIGZyb20gZnJhbWUgaGVhZGVyIGluIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGZjX2ZyYW1lX2RpZChjb25zdCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXJldHVybiBudG9oMjQoX19mY19mcmFtZV9oZWFkZXJfZ2V0KGZwKS0+ZmhfZF9pZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaCBiL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oCmluZGV4IDY2ZDM3N2IuLmE4NjMxYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oCisrKyBiL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oCkBAIC0zMTMsNiArMzEzLDcgQEAKIAlJU0NTSV9QQVJBTV9JTklUSUFUT1JfTkFNRSwKIAogCUlTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU8sCisJSVNDU0lfUEFSQU1fVEFSR0VUX0FMSUFTLAogCS8qIG11c3QgYWx3YXlzIGJlIGxhc3QgKi8KIAlJU0NTSV9QQVJBTV9NQVgsCiB9OwpAQCAtMzUzLDYgKzM1NCw3IEBACiAjZGVmaW5lIElTQ1NJX0lTSUQJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9JU0lEKQogI2RlZmluZSBJU0NTSV9JTklUSUFUT1JfTkFNRQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUUpCiAjZGVmaW5lIElTQ1NJX1RHVF9SRVNFVF9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU8pCisjZGVmaW5lIElTQ1NJX1RBUkdFVF9BTElBUwkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fVEFSR0VUX0FMSUFTKQogCiAvKiBpU0NTSSBIQkEgcGFyYW1zICovCiBlbnVtIGlzY3NpX2hvc3RfcGFyYW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmZjLmggYi9pbmNsdWRlL3Njc2kvbGliZmMuaAppbmRleCA3NDk1YzBiLi4xNGJlNDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmMuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliZmMuaApAQCAtNDIsMjQgKzQyLDYgQEAKICNkZWZpbmUJRkNfRVhfVElNRU9VVAkxCS8qIEV4Y2hhbmdlIHRpbWVvdXQgKi8KICNkZWZpbmUJRkNfRVhfQ0xPU0VECTIJLyogRXhjaGFuZ2UgY2xvc2VkICovCiAKLS8qIHNvbWUgaGVscGZ1bCBtYWNyb3MgKi8KLQotI2RlZmluZSBudG9obGwoeCkgYmU2NF90b19jcHUoeCkKLSNkZWZpbmUgaHRvbmxsKHgpIGNwdV90b19iZTY0KHgpCi0KLQotc3RhdGljIGlubGluZSB1MzIgbnRvaDI0KGNvbnN0IHU4ICpwKQotewotCXJldHVybiAocFswXSA8PCAxNikgfCAocFsxXSA8PCA4KSB8IHBbMl07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBodG9uMjQodTggKnAsIHUzMiB2KQotewotCXBbMF0gPSAodiA+PiAxNikgJiAweGZmOwotCXBbMV0gPSAodiA+PiA4KSAmIDB4ZmY7Ci0JcFsyXSA9IHYgJiAweGZmOwotfQotCiAvKioKICAqIGVudW0gZmNfbHBvcnRfc3RhdGUgLSBMb2NhbCBwb3J0IHN0YXRlcwogICogQExQT1JUX1NUX0RJU0FCTEVEOiBEaXNhYmxlZApAQCAtOTcsMjUgKzc5LDI1IEBACiAvKioKICAqIGVudW0gZmNfcnBvcnRfc3RhdGUgLSBSZW1vdGUgcG9ydCBzdGF0ZXMKICAqIEBSUE9SVF9TVF9JTklUOiAgICBJbml0aWFsaXplZAorICogQFJQT1JUX1NUX0ZMT0dJOiAgIFdhaXRpbmcgZm9yIEZMT0dJIGNvbXBsZXRpb24gZm9yIHBvaW50LXRvLW11bHRpcG9pbnQKKyAqIEBSUE9SVF9TVF9QTE9HSV9XQUlUOiAgIFdhaXRpbmcgZm9yIHBlZXIgdG8gbG9naW4gZm9yIHBvaW50LXRvLW11bHRpcG9pbnQKICAqIEBSUE9SVF9TVF9QTE9HSTogICBXYWl0aW5nIGZvciBQTE9HSSBjb21wbGV0aW9uCiAgKiBAUlBPUlRfU1RfUFJMSTogICAgV2FpdGluZyBmb3IgUFJMSSBjb21wbGV0aW9uCiAgKiBAUlBPUlRfU1RfUlRWOiAgICAgV2FpdGluZyBmb3IgUlRWIGNvbXBsZXRpb24KICAqIEBSUE9SVF9TVF9SRUFEWTogICBSZWFkeSBmb3IgdXNlCi0gKiBAUlBPUlRfU1RfTE9HTzogICAgUmVtb3RlIHBvcnQgbG9nb3V0IChMT0dPKSBzZW50CiAgKiBAUlBPUlRfU1RfQURJU0M6ICAgRGlzY292ZXIgQWRkcmVzcyBzZW50CiAgKiBAUlBPUlRfU1RfREVMRVRFOiAgUmVtb3RlIHBvcnQgYmVpbmcgZGVsZXRlZAotICogQFJQT1JUX1NUX1JFU1RBUlQ6IFJlbW90ZSBwb3J0IGJlaW5nIGRlbGV0ZWQgYW5kIHdpbGwgcmVzdGFydAogKi8KIGVudW0gZmNfcnBvcnRfc3RhdGUgewogCVJQT1JUX1NUX0lOSVQsCisJUlBPUlRfU1RfRkxPR0ksCisJUlBPUlRfU1RfUExPR0lfV0FJVCwKIAlSUE9SVF9TVF9QTE9HSSwKIAlSUE9SVF9TVF9QUkxJLAogCVJQT1JUX1NUX1JUViwKIAlSUE9SVF9TVF9SRUFEWSwKLQlSUE9SVF9TVF9MT0dPLAogCVJQT1JUX1NUX0FESVNDLAogCVJQT1JUX1NUX0RFTEVURSwKLQlSUE9SVF9TVF9SRVNUQVJULAogfTsKIAogLyoqCkBAIC0xNzMsNiArMTU1LDcgQEAKIAl1MTYJCQkgICBmbGFnczsKIAkjZGVmaW5lIEZDX1JQX0ZMQUdTX1JFQ19TVVBQT1JURUQJKDEgPDwgMCkKIAkjZGVmaW5lIEZDX1JQX0ZMQUdTX1JFVFJZCQkoMSA8PCAxKQorCSNkZWZpbmUgRkNfUlBfU1RBUlRFRAkJCSgxIDw8IDIpCiAJdW5zaWduZWQgaW50CSAgICAgICAgICAgZV9kX3RvdjsKIAl1bnNpZ25lZCBpbnQJICAgICAgICAgICByX2FfdG92OwogfTsKQEAgLTE4NSwxNiArMTY4LDE4IEBACiAgKiBAcnBfc3RhdGU6ICAgICAgIEVudW1lcmF0aW9uIHRoYXQgdHJhY2tzIHByb2dyZXNzIG9mIFBMT0dJLCBQUkxJLAogICogICAgICAgICAgICAgICAgICBhbmQgUlRWIGV4Y2hhbmdlcwogICogQGlkczogICAgICAgICAgICBUaGUgcmVtb3RlIHBvcnQgaWRlbnRpZmllcnMgYW5kIHJvbGVzCi0gKiBAZmxhZ3M6ICAgICAgICAgIFJFQyBhbmQgUkVUUlkgc3VwcG9ydGVkIGZsYWdzCisgKiBAZmxhZ3M6ICAgICAgICAgIFNUQVJURUQsIFJFQyBhbmQgUkVUUllfU1VQUE9SVEVEIGZsYWdzCiAgKiBAbWF4X3NlcTogICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgc2VxdWVuY2VzCiAgKiBAZGlzY19pZDogICAgICAgIFRoZSBkaXNjb3ZlcnkgaWRlbnRpZmllcgogICogQG1heGZyYW1lX3NpemU6ICBUaGUgbWF4aW11bSBmcmFtZSBzaXplCiAgKiBAcmV0cmllczogICAgICAgIFRoZSByZXRyeSBjb3VudCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUKKyAqIEBtYWpvcl9yZXRyaWVzOiAgVGhlIHJldHJ5IGNvdW50IGZvciB0aGUgZW50aXJlIFBMT0dJL1BSTEkgc3RhdGUgbWFjaGluZQogICogQGVfZF90b3Y6ICAgICAgICBFcnJvciBkZXRlY3QgdGltZW91dCB2YWx1ZSAoaW4gbXNlYykKICAqIEByX2FfdG92OiAgICAgICAgUmVzb3VyY2UgYWxsb2NhdGlvbiB0aW1lb3V0IHZhbHVlIChpbiBtc2VjKQogICogQHJwX211dGV4OiAgICAgICBUaGUgbXV0ZXggdGhhdCBwcm90ZWN0cyB0aGUgcmVtb3RlIHBvcnQKICAqIEByZXRyeV93b3JrOiAgICAgSGFuZGxlIGZvciByZXRyaWVzCiAgKiBAZXZlbnRfY2FsbGJhY2s6IENhbGxiYWNrIHdoZW4gUkVBRFksIEZBSUxFRCBvciBMT0dPIHN0YXRlcyBjb21wbGV0ZQorICogQHJjdToJICAgIFN0cnVjdHVyZSB1c2VkIGZvciBmcmVlaW5nIGluIGFuIFJDVS1zYWZlIG1hbm5lcgogICovCiBzdHJ1Y3QgZmNfcnBvcnRfcHJpdiB7CiAJc3RydWN0IGZjX2xwb3J0CQkgICAgKmxvY2FsX3BvcnQ7CkBAIC0yMDcsNiArMTkyLDcgQEAKIAl1MTYJCQkgICAgZGlzY19pZDsKIAl1MTYJCQkgICAgbWF4ZnJhbWVfc2l6ZTsKIAl1bnNpZ25lZCBpbnQJICAgICAgICAgICAgcmV0cmllczsKKwl1bnNpZ25lZCBpbnQJICAgICAgICAgICAgbWFqb3JfcmV0cmllczsKIAl1bnNpZ25lZCBpbnQJICAgICAgICAgICAgZV9kX3RvdjsKIAl1bnNpZ25lZCBpbnQJICAgICAgICAgICAgcl9hX3RvdjsKIAlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgcnBfbXV0ZXg7CkBAIC0yMTYsNiArMjAyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgcGVlcnM7CiAJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgIGV2ZW50X3dvcms7CiAJdTMyCQkJICAgIHN1cHBvcnRlZF9jbGFzc2VzOworCXN0cnVjdCByY3VfaGVhZAkJICAgIHJjdTsKIH07CiAKIC8qKgpAQCAtMjYyLDE0ICsyNDksMTIgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIC0gRUxTIGRhdGEgdXNlZCBmb3IgcGFzc2luZyBFTFMgc3BlY2lmaWMgcmVzcG9uc2VzCi0gKiBAZnA6ICAgICBUaGUgRUxTIGZyYW1lCiAgKiBAcmVhc29uOiBUaGUgcmVhc29uIGZvciByZWplY3Rpb24KICAqIEBleHBsYW46IFRoZSBleHBsYWluYXRpb24gb2YgdGhlIHJlamVjdGlvbgogICoKICAqIE1haW5seSB1c2VkIGJ5IHRoZSBleGNoYW5nZSBtYW5hZ2VyIGxheWVyLgogICovCiBzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIHsKLQlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwogCWVudW0gZmNfZWxzX3JqdF9yZWFzb24gcmVhc29uOwogCWVudW0gZmNfZWxzX3JqdF9leHBsYW4gZXhwbGFuOwogfTsKQEAgLTQwNSw2ICszOTAsNyBAQAogICogQGVzYl9zdGF0OiAgICAgRVNCIGV4Y2hhbmdlIHN0YXR1cwogICogQHJfYV90b3Y6ICAgICAgUmVzb3VjZSBhbGxvY2F0aW9uIHRpbWUgb3V0IHZhbHVlIChpbiBtc2VjcykKICAqIEBzZXFfaWQ6ICAgICAgIFRoZSBuZXh0IHNlcXVlbmNlIElEIHRvIHVzZQorICogQGVuY2FwczogICAgICAgZW5jYXBzdWxhdGlvbiBpbmZvcm1hdGlvbiBmb3IgbG93ZXItbGV2ZWwgZHJpdmVyCiAgKiBAZl9jdGw6ICAgICAgICBGX0NUTCBmbGFncyBmb3IgdGhlIHNlcXVlbmNlCiAgKiBAZmhfdHlwZTogICAgICBUaGUgZnJhbWUgdHlwZQogICogQGNsYXNzOiAgICAgICAgVGhlIGNsYXNzIG9mIHNlcnZpY2UKQEAgLTQzNiw2ICs0MjIsNyBAQAogCXUzMgkJICAgIGVzYl9zdGF0OwogCXUzMgkJICAgIHJfYV90b3Y7CiAJdTgJCSAgICBzZXFfaWQ7CisJdTgJCSAgICBlbmNhcHM7CiAJdTMyCQkgICAgZl9jdGw7CiAJdTgJCSAgICBmaF90eXBlOwogCWVudW0gZmNfY2xhc3MJICAgIGNsYXNzOwpAQCAtNTMwLDEyICs1MTcsMTEgQEAKIAkJCXN0cnVjdCBmY19mcmFtZSAqKTsKIAogCS8qCi0JICogU2VuZCBhbiBFTFMgcmVzcG9uc2UgdXNpbmcgaW5mb21hdGlvbiBmcm9tIGEgcHJldmlvdXMKLQkgKiBleGNoYW5nZSBhbmQgc2VxdWVuY2UuCisJICogU2VuZCBhbiBFTFMgcmVzcG9uc2UgdXNpbmcgaW5mb21hdGlvbiBmcm9tIHRoZSByZWNlaXZlZCBmcmFtZS4KIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQl2b2lkICgqc2VxX2Vsc19yc3Bfc2VuZCkoc3RydWN0IGZjX3NlcSAqLCBlbnVtIGZjX2Vsc19jbWQsCisJdm9pZCAoKnNlcV9lbHNfcnNwX3NlbmQpKHN0cnVjdCBmY19mcmFtZSAqLCBlbnVtIGZjX2Vsc19jbWQsCiAJCQkJIHN0cnVjdCBmY19zZXFfZWxzX2RhdGEgKik7CiAKIAkvKgpAQCAtNTY3LDYgKzU1MywxMyBAQAogCXN0cnVjdCBmY19zZXEgKigqc2VxX3N0YXJ0X25leHQpKHN0cnVjdCBmY19zZXEgKik7CiAKIAkvKgorCSAqIEFzc2lnbiBhIHNlcXVlbmNlIGZvciBhbiBpbmNvbWluZyByZXF1ZXN0IGZyYW1lLgorCSAqCisJICogU1RBVFVTOiBPUFRJT05BTAorCSAqLworCXN0cnVjdCBmY19zZXEgKigqc2VxX2Fzc2lnbikoc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKKworCS8qCiAJICogUmVzZXQgYW4gZXhjaGFuZ2UgbWFuYWdlciwgY29tcGxldGluZyBhbGwgc2VxdWVuY2VzIGFuZCBleGNoYW5nZXMuCiAJICogSWYgc19pZCBpcyBub24temVybywgcmVzZXQgb25seSBleGNoYW5nZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGF0IEZJRC4KIAkgKiBJZiBkX2lkIGlzIG5vbi16ZXJvLCByZXNldCBvbmx5IGV4Y2hhbmdlcyBzZW5kaW5nIHRvIHRoYXQgRklELgpAQCAtNTg3LDggKzU4MCw3IEBACiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0Jdm9pZCAoKmxwb3J0X3JlY3YpKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfc2VxICosCi0JCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKik7CisJdm9pZCAoKmxwb3J0X3JlY3YpKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CiAKIAkvKgogCSAqIFJlc2V0IHRoZSBsb2NhbCBwb3J0LgpAQCAtNjUwLDggKzY0Miw3IEBACiAJICoKIAkgKiBTVEFUVVM6IE9QVElPTkFMCiAJICovCi0Jdm9pZCAoKnJwb3J0X3JlY3ZfcmVxKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqLAotCQkJICAgICAgIHN0cnVjdCBmY19scG9ydCAqKTsKKwl2b2lkICgqcnBvcnRfcmVjdl9yZXEpKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CiAKIAkvKgogCSAqIGxvb2t1cCBhbiBycG9ydCBieSBpdCdzIHBvcnQgSUQuCkBAIC02OTcsOCArNjg4LDcgQEAKIAkgKgogCSAqIFNUQVRVUzogT1BUSU9OQUwKIAkgKi8KLQl2b2lkICgqZGlzY19yZWN2X3JlcSkoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwKLQkJCSAgICAgIHN0cnVjdCBmY19scG9ydCAqKTsKKwl2b2lkICgqZGlzY19yZWN2X3JlcSkoc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKIAogCS8qCiAJICogU3RhcnQgZGlzY292ZXJ5IGZvciBhIGxvY2FsIHBvcnQuCkBAIC03MzYsNyArNzI2LDcgQEAKICAqIEBidWZfbGVuOiAgICAgICBMZW5ndGggb2YgdGhlIGRpc2NvdmVyeSBidWZmZXIKICAqIEBkaXNjX2lkOiAgICAgICBEaXNjb3ZlcnkgSUQKICAqIEBycG9ydHM6ICAgICAgICBMaXN0IG9mIGRpc2NvdmVyZWQgcmVtb3RlIHBvcnRzCi0gKiBAbHBvcnQ6ICAgICAgICAgVGhlIGxvY2FsIHBvcnQgdGhhdCBkaXNjb3ZlcnkgaXMgZm9yCisgKiBAcHJpdjogICAgICAgICAgUHJpdmF0ZSBwb2ludGVyIGZvciB1c2UgYnkgZGlzY292ZXJ5IGNvZGUKICAqIEBkaXNjX211dGV4OiAgICBNdXRleCB0aGF0IHByb3RlY3RzIHRoZSBkaXNjb3ZlcnkgY29udGV4dAogICogQHBhcnRpYWxfYnVmOiAgIFBhcnRpYWwgbmFtZSBidWZmZXIgKGlmIG5hbWVzIGFyZSByZXR1cm5lZAogICogICAgICAgICAgICAgICAgIGluIG11bHRpcGxlIGZyYW1lcykKQEAgLTc1Miw3ICs3NDIsNyBAQAogCXUxNiAgICAgICAgICAgICAgICAgICBkaXNjX2lkOwogCiAJc3RydWN0IGxpc3RfaGVhZCAgICAgIHJwb3J0czsKLQlzdHJ1Y3QgZmNfbHBvcnQJICAgICAgKmxwb3J0OworCXZvaWQJCSAgICAgICpwcml2OwogCXN0cnVjdCBtdXRleAkgICAgICBkaXNjX211dGV4OwogCXN0cnVjdCBmY19ncG5fZnRfcmVzcCBwYXJ0aWFsX2J1ZjsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICAgZGlzY193b3JrOwpAQCAtNzk2LDYgKzc4Niw3IEBACiAgKiBAbWZzOiAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBGaWJyZSBDaGFubmVsIHBheWxvYWQgc2l6ZQogICogQG1heF9yZXRyeV9jb3VudDogICAgICAgVGhlIG1heGltdW0gcmV0cnkgYXR0ZW1wdHMKICAqIEBtYXhfcnBvcnRfcmV0cnlfY291bnQ6IFRoZSBtYXhpbXVtIHJlbW90ZSBwb3J0IHJldHJ5IGF0dGVtcHRzCisgKiBAcnBvcnRfcHJpdl9zaXplOiAgICAgICBTaXplIG5lZWRlZCBieSBkcml2ZXIgYWZ0ZXIgc3RydWN0IGZjX3Jwb3J0X3ByaXYKICAqIEBscm9feGlkOiAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIFhJRCBmb3IgTFJPCiAgKiBAbHNvX21heDogICAgICAgICAgICAgICBUaGUgbWF4aW11bSBsYXJnZSBvZmZsb2FkIHNlbmQgc2l6ZQogICogQGZjdHM6ICAgICAgICAgICAgICAgICAgRkMtNCB0eXBlIG1hc2sKQEAgLTg0Miw5ICs4MzMsMTEgQEAKIAl1MzIJCQkgICAgICAgbHJvX2VuYWJsZWQ6MTsKIAl1MzIJCQkgICAgICAgZG9lc19ucGl2OjE7CiAJdTMyCQkJICAgICAgIG5waXZfZW5hYmxlZDoxOworCXUzMgkJCSAgICAgICBwb2ludF90b19tdWx0aXBvaW50OjE7CiAJdTMyCQkJICAgICAgIG1mczsKIAl1OAkJCSAgICAgICBtYXhfcmV0cnlfY291bnQ7CiAJdTgJCQkgICAgICAgbWF4X3Jwb3J0X3JldHJ5X2NvdW50OworCXUxNgkJCSAgICAgICBycG9ydF9wcml2X3NpemU7CiAJdTE2CQkJICAgICAgIGxpbmtfc3BlZWQ7CiAJdTE2CQkJICAgICAgIGxpbmtfc3VwcG9ydGVkX3NwZWVkczsKIAl1MTYJCQkgICAgICAgbHJvX3hpZDsKQEAgLTk4Niw2ICs5NzksNyBAQAogc3RydWN0IGZjX2xwb3J0ICpsaWJmY192cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICosIGludCBwcml2c2l6ZSk7CiBzdHJ1Y3QgZmNfbHBvcnQgKmZjX3Zwb3J0X2lkX2xvb2t1cChzdHJ1Y3QgZmNfbHBvcnQgKiwgdTMyIHBvcnRfaWQpOwogaW50IGZjX2xwb3J0X2JzZ19yZXF1ZXN0KHN0cnVjdCBmY19ic2dfam9iICopOwordm9pZCBmY19scG9ydF9zZXRfbG9jYWxfaWQoc3RydWN0IGZjX2xwb3J0ICosIHUzMiBwb3J0X2lkKTsKIAogLyoKICAqIFJFTU9URSBQT1JUIExBWUVSCkBAIC05OTgsNiArOTkyLDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgZmNfZGlzY19pbml0KHN0cnVjdCBmY19scG9ydCAqKTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNfbHBvcnQgKmZjX2Rpc2NfbHBvcnQoc3RydWN0IGZjX2Rpc2MgKmRpc2MpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkaXNjLCBzdHJ1Y3QgZmNfbHBvcnQsIGRpc2MpOworfQorCiAvKgogICogRkNQIExBWUVSCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDI5LDYgKzEwMjgsMTAgQEAKIAkJCQkgICAgdm9pZCAqYXJnLCB1MzIgdGltZXJfbXNlYyk7CiB2b2lkIGZjX2xwb3J0X2Zsb2dpX3Jlc3Aoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKIHZvaWQgZmNfbHBvcnRfbG9nb19yZXNwKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosIHZvaWQgKik7Cit2b2lkIGZjX2ZpbGxfcmVwbHlfaGRyKHN0cnVjdCBmY19mcmFtZSAqLCBjb25zdCBzdHJ1Y3QgZmNfZnJhbWUgKiwKKwkJICAgICAgIGVudW0gZmNfcmN0bCwgdTMyIHBhcm1fb2Zmc2V0KTsKK3ZvaWQgZmNfZmlsbF9oZHIoc3RydWN0IGZjX2ZyYW1lICosIGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqLAorCQkgZW51bSBmY19yY3RsLCB1MzIgZl9jdGwsIHUxNiBzZXFfY250LCB1MzIgcGFybV9vZmZzZXQpOwogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oIGIvaW5jbHVkZS9zY3NpL2xpYmZjb2UuaAppbmRleCBlYzEzZjUxLi4wNmYxYjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJmY29lLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2Zjb2UuaD4KICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAKQEAgLTM3LDYgKzM4LDcgQEAKICNkZWZpbmUgRkNPRV9DVExSX1NUQVJUX0RFTEFZCTIwMDAJLyogbVMgYWZ0ZXIgZmlyc3QgYWR2LiB0byBjaG9vc2UgRkNGICovCiAjZGVmaW5lIEZDT0VfQ1RSTF9TT0xfVE9WCTIwMDAJLyogbWluLiBzb2xpY2l0YXRpb24gaW50ZXJ2YWwgKG1TKSAqLwogI2RlZmluZSBGQ09FX0NUTFJfRkNGX0xJTUlUCTIwCS8qIG1heC4gbnVtYmVyIG9mIEZDRiBlbnRyaWVzICovCisjZGVmaW5lIEZDT0VfQ1RMUl9WTjJWTl9MT0dJTl9MSU1JVCAzCS8qIG1heC4gVk4yVk4gcnBvcnQgbG9naW4gcmV0cmllcyAqLwogCiAvKioKICAqIGVudW0gZmlwX3N0YXRlIC0gaW50ZXJuYWwgc3RhdGUgb2YgRkNvRSBjb250cm9sbGVyLgpAQCAtNDUsNiArNDcsMTEgQEAKICAqIEBGSVBfU1RfQVVUTzoJZGV0ZXJtaW5pbmcgd2hldGhlciB0byB1c2UgRklQIG9yIG5vbi1GSVAgbW9kZS4KICAqIEBGSVBfU1RfTk9OX0ZJUDoJbm9uLUZJUCBtb2RlIHNlbGVjdGVkLgogICogQEZJUF9TVF9FTkFCTEVEOglGSVAgbW9kZSBzZWxlY3RlZC4KKyAqIEBGSVBfU1RfVk5NUF9TVEFSVDoJVk4yVk4gbXVsdGlwYXRoIG1vZGUgc3RhcnQsIHdhaXQKKyAqIEBGSVBfU1RfVk5NUF9QUk9CRTE6CVZOMlZOIHNlbnQgZmlyc3QgcHJvYmUsIGxpc3RlbmluZworICogQEZJUF9TVF9WTk1QX1BST0JFMjoJVk4yVk4gc2VudCBzZWNvbmQgcHJvYmUsIGxpc3RlbmluZworICogQEZJUF9TVF9WTk1QX0NMQUlNOglWTjJWTiBzZW50IGNsYWltLCB3YWl0aW5nIGZvciByZXNwb25zZXMKKyAqIEBGSVBfU1RfVk5NUF9VUDoJVk4yVk4gbXVsdGlwYXRoIG1vZGUgb3BlcmF0aW9uCiAgKi8KIGVudW0gZmlwX3N0YXRlIHsKIAlGSVBfU1RfRElTQUJMRUQsCkBAIC01Miw4ICs1OSwyMyBAQAogCUZJUF9TVF9BVVRPLAogCUZJUF9TVF9OT05fRklQLAogCUZJUF9TVF9FTkFCTEVELAorCUZJUF9TVF9WTk1QX1NUQVJULAorCUZJUF9TVF9WTk1QX1BST0JFMSwKKwlGSVBfU1RfVk5NUF9QUk9CRTIsCisJRklQX1NUX1ZOTVBfQ0xBSU0sCisJRklQX1NUX1ZOTVBfVVAsCiB9OwogCisvKgorICogTW9kZXM6CisgKiBUaGUgbW9kZSBpcyB0aGUgc3RhdGUgdGhhdCBpcyB0byBiZSBlbnRlcmVkIGFmdGVyIGxpbmsgdXAuCisgKiBJdCBtdXN0IG5vdCBjaGFuZ2UgYWZ0ZXIgZmNvZV9jdGxyX2luaXQoKSBzZXRzIGl0LgorICovCisjZGVmaW5lIEZJUF9NT0RFX0FVVE8JCUZJUF9TVF9BVVRPCisjZGVmaW5lIEZJUF9NT0RFX05PTl9GSVAJRklQX1NUX05PTl9GSVAKKyNkZWZpbmUgRklQX01PREVfRkFCUklDCQlGSVBfU1RfRU5BQkxFRAorI2RlZmluZSBGSVBfTU9ERV9WTjJWTgkJRklQX1NUX1ZOTVBfU1RBUlQKKwogLyoqCiAgKiBzdHJ1Y3QgZmNvZV9jdGxyIC0gRkNvRSBDb250cm9sbGVyIGFuZCBGSVAgc3RhdGUKICAqIEBzdGF0ZToJICAgaW50ZXJuYWwgRklQIHN0YXRlIGZvciBuZXR3b3JrIGxpbmsgYW5kIEZJUCBvciBub24tRklQIG1vZGUuCkBAIC03MCwxOSArOTIsMjAgQEAKICAqIEB0aW1lcl93b3JrOgkgICAmd29ya19zdHJ1Y3QgZm9yIGRvaW5nIGtlZXAtYWxpdmVzIGFuZCByZXNldHMuCiAgKiBAcmVjdl93b3JrOgkgICAmd29ya19zdHJ1Y3QgZm9yIHJlY2VpdmluZyBGSVAgZnJhbWVzLgogICogQGZpcF9yZWN2X2xpc3Q6IGxpc3Qgb2YgcmVjZWl2ZWQgRklQIGZyYW1lcy4KKyAqIEBybmRfc3RhdGU6CSAgIHN0YXRlIGZvciBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgKiBAcG9ydF9pZDoJICAgcHJvcG9zZWQgb3Igc2VsZWN0ZWQgbG9jYWwtcG9ydCBJRC4KICAqIEB1c2VyX21mczoJICAgY29uZmlndXJlZCBtYXhpbXVtIEZDIGZyYW1lIHNpemUsIGluY2x1ZGluZyBGQyBoZWFkZXIuCiAgKiBAZmxvZ2lfb3hpZDogICAgZXhjaGFuZ2UgSUQgb2YgbW9zdCByZWNlbnQgZmFicmljIGxvZ2luLgogICogQGZsb2dpX2NvdW50OiAgIG51bWJlciBvZiBGTE9HSSBhdHRlbXB0cyBpbiBBVVRPIG1vZGUuCiAgKiBAbWFwX2Rlc3Q6CSAgIHVzZSB0aGUgRkNfTUFQIG1vZGUgZm9yIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzZXMuCiAgKiBAc3BtYToJICAgc3VwcG9ydHMgU1BNQSBzZXJ2ZXItcHJvdmlkZWQgTUFDcyBtb2RlCi0gKiBAc2VuZF9jdGxyX2thOiAgbmVlZCB0byBzZW5kIGNvbnRyb2xsZXIga2VlcCBhbGl2ZQotICogQHNlbmRfcG9ydF9rYTogIG5lZWQgdG8gc2VuZCBwb3J0IGtlZXAgYWxpdmVzCisgKiBAcHJvYmVfdHJpZXM6ICAgbnVtYmVyIG9mIEZDX0lEcyBwcm9iZWQKICAqIEBkZXN0X2FkZHI6CSAgIE1BQyBhZGRyZXNzIG9mIHRoZSBzZWxlY3RlZCBGQyBmb3J3YXJkZXIuCiAgKiBAY3RsX3NyY19hZGRyOiAgdGhlIG5hdGl2ZSBNQUMgYWRkcmVzcyBvZiBvdXIgbG9jYWwgcG9ydC4KICAqIEBzZW5kOgkgICBMTEQtc3VwcGxpZWQgZnVuY3Rpb24gdG8gaGFuZGxlIHNlbmRpbmcgRklQIEV0aGVybmV0IGZyYW1lcwogICogQHVwZGF0ZV9tYWM6ICAgIExMRC1zdXBwbGllZCBmdW5jdGlvbiB0byBoYW5kbGUgY2hhbmdlcyB0byBNQUMgYWRkcmVzc2VzLgogICogQGdldF9zcmNfYWRkcjogIExMRC1zdXBwbGllZCBmdW5jdGlvbiB0byBzdXBwbHkgYSBzb3VyY2UgTUFDIGFkZHJlc3MuCi0gKiBAbG9jazoJICAgbG9jayBwcm90ZWN0aW5nIHRoaXMgc3RydWN0dXJlLgorICogQGN0bHJfbXV0ZXg6CSAgIGxvY2sgcHJvdGVjdGluZyB0aGlzIHN0cnVjdHVyZS4KICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IGFsbCBGQ29FIGRyaXZlcnMuICBJdCBjb250YWlucyBpbmZvcm1hdGlvbgogICogbmVlZGVkIGJ5IGFsbCBGQ29FIGxvdy1sZXZlbCBkcml2ZXJzIChMTERzKSBhcyB3ZWxsIGFzIGludGVybmFsIHN0YXRlCkBAIC0xMDMsMjEgKzEyNiwyMyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB0aW1lcl93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZWN2X3dvcms7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBmaXBfcmVjdl9saXN0OworCisJc3RydWN0IHJuZF9zdGF0ZSBybmRfc3RhdGU7CisJdTMyIHBvcnRfaWQ7CisKIAl1MTYgdXNlcl9tZnM7CiAJdTE2IGZsb2dpX294aWQ7CiAJdTggZmxvZ2lfY291bnQ7Ci0JdTggcmVzZXRfcmVxOwogCXU4IG1hcF9kZXN0OwogCXU4IHNwbWE7Ci0JdTggc2VuZF9jdGxyX2thOwotCXU4IHNlbmRfcG9ydF9rYTsKKwl1OCBwcm9iZV90cmllczsKIAl1OCBkZXN0X2FkZHJbRVRIX0FMRU5dOwogCXU4IGN0bF9zcmNfYWRkcltFVEhfQUxFTl07CiAKIAl2b2lkICgqc2VuZCkoc3RydWN0IGZjb2VfY3RsciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAl2b2lkICgqdXBkYXRlX21hYykoc3RydWN0IGZjX2xwb3J0ICosIHU4ICphZGRyKTsKIAl1OCAqICgqZ2V0X3NyY19hZGRyKShzdHJ1Y3QgZmNfbHBvcnQgKik7Ci0Jc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBtdXRleCBjdGxyX211dGV4OwogfTsKIAogLyoqCkBAIC0xNTYsOCArMTgxLDI2IEBACiAJdTggZmRfZmxhZ3M6MTsKIH07CiAKKy8qKgorICogc3RydWN0IGZjb2VfcnBvcnQgLSBWTjJWTiByZW1vdGUgcG9ydAorICogQHRpbWU6CXRpbWUgb2YgY3JlYXRlIG9yIGxhc3QgYmVhY29uIHBhY2tldCByZWNlaXZlZCBmcm9tIG5vZGUKKyAqIEBmY29lX2xlbjoJbWF4IEZDb0UgZnJhbWUgc2l6ZSwgbm90IGluY2x1ZGluZyBWTEFOIG9yIEV0aGVybmV0IGhlYWRlcnMKKyAqIEBmbGFnczoJZmxhZ3MgZnJvbSBwcm9iZSBvciBjbGFpbQorICogQGxvZ2luX2NvdW50OiBudW1iZXIgb2YgdW5zdWNjZXNzZnVsIHJwb3J0IGxvZ2lucyB0byB0aGlzIHBvcnQKKyAqIEBlbm9kZV9tYWM6CUVfTm9kZSBjb250cm9sIE1BQyBhZGRyZXNzCisgKiBAdm5fbWFjOglWTl9Ob2RlIGFzc2lnbmVkIE1BQyBhZGRyZXNzIGZvciBkYXRhCisgKi8KK3N0cnVjdCBmY29lX3Jwb3J0IHsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJdTE2IGZjb2VfbGVuOworCXUxNiBmbGFnczsKKwl1OCBsb2dpbl9jb3VudDsKKwl1OCBlbm9kZV9tYWNbRVRIX0FMRU5dOworCXU4IHZuX21hY1tFVEhfQUxFTl07Cit9OworCiAvKiBGSVAgQVBJIGZ1bmN0aW9ucyAqLwotdm9pZCBmY29lX2N0bHJfaW5pdChzdHJ1Y3QgZmNvZV9jdGxyICopOwordm9pZCBmY29lX2N0bHJfaW5pdChzdHJ1Y3QgZmNvZV9jdGxyICosIGVudW0gZmlwX3N0YXRlKTsKIHZvaWQgZmNvZV9jdGxyX2Rlc3Ryb3koc3RydWN0IGZjb2VfY3RsciAqKTsKIHZvaWQgZmNvZV9jdGxyX2xpbmtfdXAoc3RydWN0IGZjb2VfY3RsciAqKTsKIGludCBmY29lX2N0bHJfbGlua19kb3duKHN0cnVjdCBmY29lX2N0bHIgKik7CkBAIC0xNjgsNiArMjExLDE3IEBACiAKIC8qIGxpYmZjb2UgZnVuY3MgKi8KIHU2NCBmY29lX3d3bl9mcm9tX21hYyh1bnNpZ25lZCBjaGFyIG1hY1tdLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci1pbnQgZmNvZV9saWJmY19jb25maWcoc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSAqKTsKK2ludCBmY29lX2xpYmZjX2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjb2VfY3RsciAqLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUgKiwgaW50IGluaXRfZmNwKTsKKworLyoqCisgKiBpc19maXBfbW9kZSgpIC0gcmV0dXJucyB0cnVlIGlmIEZJUCBtb2RlIHNlbGVjdGVkLgorICogQGZpcDoJRkNvRSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZmlwX21vZGUoc3RydWN0IGZjb2VfY3RsciAqZmlwKQoreworCXJldHVybiBmaXAtPnN0YXRlID09IEZJUF9TVF9FTkFCTEVEOworfQorCiAKICNlbmRpZiAvKiBfTElCRkNPRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGlic2FzLmggYi9pbmNsdWRlL3Njc2kvbGlic2FzLmgKaW5kZXggM2I1ODY4NS4uZDA2ZTEzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaApAQCAtNDIyLDE2ICs0MjIsNyBAQAogfTsKIAogZW51bSBleGVjX3N0YXR1cyB7Ci0JU0FNX0dPT0QgICAgICAgICA9IDAsCi0JU0FNX0NIRUNLX0NPTkQgICA9IDIsCi0JU0FNX0NPTkRfTUVUICAgICA9IDQsCi0JU0FNX0JVU1kgICAgICAgICA9IDgsCi0JU0FNX0lOVEVSTUVESUFURSA9IDB4MTAsCi0JU0FNX0lNX0NPTkRfTUVUICA9IDB4MTIsCi0JU0FNX1JFU1ZfQ09ORkxJQ1Q9IDB4MTQsCi0JU0FNX1RBU0tfU0VUX0ZVTEw9IDB4MjgsCi0JU0FNX0FDQV9BQ1RJVkUgICA9IDB4MzAsCi0JU0FNX1RBU0tfQUJPUlRFRCA9IDB4NDAsCisJLyogVGhlIFNBTV9TVEFUXy4uIGNvZGVzIGZpdCBpbiB0aGUgbG93ZXIgNiBiaXRzICovCiAKIAlTQVNfREVWX05PX1JFU1BPTlNFID0gMHg4MCwKIAlTQVNfREFUQV9VTkRFUlJVTiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmgKaW5kZXggZDgwYjZkYi4uNTBjYjM0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmgKQEAgLTM4MSw2ICszODEsMTQgQEAKIAkJCSAgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLAogCQkJICAgIGludCAqcmVzaWQpOwogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK2V4dGVybiBpbnQgc2NzaV9hdXRvcG1fZ2V0X2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzY3NpX2F1dG9wbV9nZXRfZGV2aWNlKHN0cnVjdCBzY3NpX2RldmljZSAqZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHNjc2lfYXV0b3BtX3B1dF9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpkKSB7fQorI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCisKIHN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBzY3NpX2RldmljZV9yZXByb2JlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlyZXR1cm4gZGV2aWNlX3JlcHJvYmUoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKaW5kZXggMzQ5YzdmMy4uN2ZmZjk0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKQEAgLTMyLDYgKzMyLDcgQEAKIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQ7CiBzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQ7CiBzdHJ1Y3QgU2NzaV9Ib3N0Oworc3RydWN0IHNjc2lfY21uZDsKIHN0cnVjdCBpc2NzaV9jbHNfY29ubjsKIHN0cnVjdCBpc2NzaV9jb25uOwogc3RydWN0IGlzY3NpX3Rhc2s7CkBAIC0yNTUsNSArMjU2LDYgQEAKIGV4dGVybiBzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmlzY3NpX2NyZWF0ZV9lbmRwb2ludChpbnQgZGRfc2l6ZSk7CiBleHRlcm4gdm9pZCBpc2NzaV9kZXN0cm95X2VuZHBvaW50KHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXApOwogZXh0ZXJuIHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqaXNjc2lfbG9va3VwX2VuZHBvaW50KHU2NCBoYW5kbGUpOworZXh0ZXJuIGludCBpc2NzaV9ibG9ja19zY3NpX2VoKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY20uaCBiL2luY2x1ZGUvc291bmQvcGNtLmgKaW5kZXggZGQ3NmNkZS4uNmUzYTI5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY20uaAorKysgYi9pbmNsdWRlL3NvdW5kL3BjbS5oCkBAIC0zNjYsNyArMzY2LDcgQEAKIAlpbnQgbnVtYmVyOwogCWNoYXIgbmFtZVszMl07CQkJLyogc3Vic3RyZWFtIG5hbWUgKi8KIAlpbnQgc3RyZWFtOwkJCS8qIHN0cmVhbSAoZGlyZWN0aW9uKSAqLwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICpsYXRlbmN5X3BtX3Fvc19yZXE7IC8qIHBtX3FvcyByZXF1ZXN0ICovCisJc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3QgbGF0ZW5jeV9wbV9xb3NfcmVxOyAvKiBwbV9xb3MgcmVxdWVzdCAqLwogCXNpemVfdCBidWZmZXJfYnl0ZXNfbWF4OwkvKiBsaW1pdCByaW5nIGJ1ZmZlciBzaXplICovCiAJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYV9idWZmZXI7CiAJdW5zaWduZWQgaW50IGRtYV9idWZfaWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2Jvb3QuaCBiL2luY2x1ZGUvdHJhY2UvYm9vdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODhlYTA4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvYm9vdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfVFJBQ0VfQk9PVF9ICi0jZGVmaW5lIF9MSU5VWF9UUkFDRV9CT09UX0gKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0vKgotICogU3RydWN0dXJlIHdoaWNoIGRlZmluZXMgdGhlIHRyYWNlIG9mIGFuIGluaXRjYWxsCi0gKiB3aGlsZSBpdCBpcyBjYWxsZWQuCi0gKiBZb3UgZG9uJ3QgaGF2ZSB0byBmaWxsIHRoZSBmdW5jIGZpZWxkIHNpbmNlIGl0IGlzCi0gKiBvbmx5IHVzZWQgaW50ZXJuYWxseSBieSB0aGUgdHJhY2VyLgotICovCi1zdHJ1Y3QgYm9vdF90cmFjZV9jYWxsIHsKLQlwaWRfdAkJCWNhbGxlcjsKLQljaGFyCQkJZnVuY1tLU1lNX1NZTUJPTF9MRU5dOwotfTsKLQotLyoKLSAqIFN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZSB0cmFjZSBvZiBhbiBpbml0Y2FsbAotICogd2hpbGUgaXQgcmV0dXJucy4KLSAqLwotc3RydWN0IGJvb3RfdHJhY2VfcmV0IHsKLQljaGFyCQkJZnVuY1tLU1lNX1NZTUJPTF9MRU5dOwotCWludAkJCQlyZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBsb25nCWR1cmF0aW9uOwkJLyogbnNlY3MgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfQk9PVF9UUkFDRVIKLS8qIEFwcGVuZCB0aGUgdHJhY2VzIG9uIHRoZSByaW5nLWJ1ZmZlciAqLwotZXh0ZXJuIHZvaWQgdHJhY2VfYm9vdF9jYWxsKHN0cnVjdCBib290X3RyYWNlX2NhbGwgKmJ0LCBpbml0Y2FsbF90IGZuKTsKLWV4dGVybiB2b2lkIHRyYWNlX2Jvb3RfcmV0KHN0cnVjdCBib290X3RyYWNlX3JldCAqYnQsIGluaXRjYWxsX3QgZm4pOwotCi0vKiBUZWxscyB0aGUgdHJhY2VyIHRoYXQgc21wX3ByZV9pbml0Y2FsbCBpcyBmaW5pc2hlZC4KLSAqIFNvIHdlIGNhbiBzdGFydCB0aGUgdHJhY2luZwotICovCi1leHRlcm4gdm9pZCBzdGFydF9ib290X3RyYWNlKHZvaWQpOwotCi0vKiBSZXN1bWUgdGhlIHRyYWNpbmcgb2Ygb3RoZXIgbmVjZXNzYXJ5IGV2ZW50cwotICogc3VjaCBhcyBzY2hlZCBzd2l0Y2hlcwotICovCi1leHRlcm4gdm9pZCBlbmFibGVfYm9vdF90cmFjZSh2b2lkKTsKLQotLyogU3VzcGVuZCB0aGlzIHRyYWNpbmcuIEFjdHVhbGx5LCBvbmx5IHNjaGVkX3N3aXRjaGVzIHRyYWNpbmcgaGF2ZQotICogdG8gYmUgc3VzcGVuZGVkLiBJbml0Y2FsbHMgZG9lc24ndCBuZWVkIGl0LikKLSAqLwotZXh0ZXJuIHZvaWQgZGlzYWJsZV9ib290X3RyYWNlKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUKLXZvaWQgdHJhY2VfYm9vdF9jYWxsKHN0cnVjdCBib290X3RyYWNlX2NhbGwgKmJ0LCBpbml0Y2FsbF90IGZuKSB7IH0KLQotc3RhdGljIGlubGluZQotdm9pZCB0cmFjZV9ib290X3JldChzdHJ1Y3QgYm9vdF90cmFjZV9yZXQgKmJ0LCBpbml0Y2FsbF90IGZuKSB7IH0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2Jvb3RfdHJhY2Uodm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2Jvb3RfdHJhY2Uodm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9ib290X3RyYWNlKHZvaWQpIHsgfQotI2VuZGlmIC8qIENPTkZJR19CT09UX1RSQUNFUiAqLwotCi0jZW5kaWYgLyogX19MSU5VWF9UUkFDRV9CT09UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9wb3dlci5oCmluZGV4IGM0ZWZlOWIuLjM1YTJhNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaApAQCAtMTgsNTIgKzE4LDU1IEBACiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MocG93ZXIsCiAKLQlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN0YXRlKSwKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgY3B1X2lkKSwKIAotCVRQX0FSR1ModHlwZSwgc3RhdGUpLAorCVRQX0FSR1ModHlwZSwgc3RhdGUsIGNwdV9pZCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAl1NjQsCQl0eXBlCQkpCiAJCV9fZmllbGQoCXU2NCwJCXN0YXRlCQkpCisJCV9fZmllbGQoCXU2NCwJCWNwdV9pZAkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+dHlwZSA9IHR5cGU7CiAJCV9fZW50cnktPnN0YXRlID0gc3RhdGU7CisJCV9fZW50cnktPmNwdV9pZCA9IGNwdV9pZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJ0eXBlPSVsdSBzdGF0ZT0lbHUiLCAodW5zaWduZWQgbG9uZylfX2VudHJ5LT50eXBlLCAodW5zaWduZWQgbG9uZylfX2VudHJ5LT5zdGF0ZSkKKwlUUF9wcmludGsoInR5cGU9JWx1IHN0YXRlPSVsdSBjcHVfaWQ9JWx1IiwgKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+dHlwZSwKKwkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+c3RhdGUsICh1bnNpZ25lZCBsb25nKV9fZW50cnktPmNwdV9pZCkKICk7CiAKIERFRklORV9FVkVOVChwb3dlciwgcG93ZXJfc3RhcnQsCiAKLQlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN0YXRlKSwKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgY3B1X2lkKSwKIAotCVRQX0FSR1ModHlwZSwgc3RhdGUpCisJVFBfQVJHUyh0eXBlLCBzdGF0ZSwgY3B1X2lkKQogKTsKIAogREVGSU5FX0VWRU5UKHBvd2VyLCBwb3dlcl9mcmVxdWVuY3ksCiAKLQlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN0YXRlKSwKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgY3B1X2lkKSwKIAotCVRQX0FSR1ModHlwZSwgc3RhdGUpCisJVFBfQVJHUyh0eXBlLCBzdGF0ZSwgY3B1X2lkKQogKTsKIAogVFJBQ0VfRVZFTlQocG93ZXJfZW5kLAogCi0JVFBfUFJPVE8oaW50IGR1bW15KSwKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgY3B1X2lkKSwKIAotCVRQX0FSR1MoZHVtbXkpLAorCVRQX0FSR1MoY3B1X2lkKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZmllbGQoCXU2NCwJCWR1bW15CQkpCisJCV9fZmllbGQoCXU2NCwJCWNwdV9pZAkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+ZHVtbXkgPSAweGZmZmY7CisJCV9fZW50cnktPmNwdV9pZCA9IGNwdV9pZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkdW1teT0lbHUiLCAodW5zaWduZWQgbG9uZylfX2VudHJ5LT5kdW1teSkKKwlUUF9wcmludGsoImNwdV9pZD0lbHUiLCAodW5zaWduZWQgbG9uZylfX2VudHJ5LT5jcHVfaWQpCiAKICk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCmluZGV4IGI5ZTFkZDYuLjkyMDhjOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2NoZWQuaApAQCAtNTAsMzEgKzUwLDYgQEAKICk7CiAKIC8qCi0gKiBUcmFjZXBvaW50IGZvciB3YWl0aW5nIG9uIHRhc2sgdG8gdW5zY2hlZHVsZToKLSAqLwotVFJBQ0VfRVZFTlQoc2NoZWRfd2FpdF90YXNrLAotCi0JVFBfUFJPVE8oc3RydWN0IHRhc2tfc3RydWN0ICpwKSwKLQotCVRQX0FSR1MocCksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2FycmF5KAljaGFyLAljb21tLAlUQVNLX0NPTU1fTEVOCSkKLQkJX19maWVsZCgJcGlkX3QsCXBpZAkJCSkKLQkJX19maWVsZCgJaW50LAlwcmlvCQkJKQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJbWVtY3B5KF9fZW50cnktPmNvbW0sIHAtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwotCQlfX2VudHJ5LT5waWQJPSBwLT5waWQ7Ci0JCV9fZW50cnktPnByaW8JPSBwLT5wcmlvOwotCSksCi0KLQlUUF9wcmludGsoImNvbW09JXMgcGlkPSVkIHByaW89JWQiLAotCQkgIF9fZW50cnktPmNvbW0sIF9fZW50cnktPnBpZCwgX19lbnRyeS0+cHJpbykKLSk7Ci0KLS8qCiAgKiBUcmFjZXBvaW50IGZvciB3YWtpbmcgdXAgYSB0YXNrOgogICovCiBERUNMQVJFX0VWRU5UX0NMQVNTKHNjaGVkX3dha2V1cF90ZW1wbGF0ZSwKQEAgLTI0MCw2ICsyMTUsMTMgQEAKIAkgICAgIFRQX0FSR1MocCkpOwogCiAvKgorICogVHJhY2Vwb2ludCBmb3Igd2FpdGluZyBvbiB0YXNrIHRvIHVuc2NoZWR1bGU6CisgKi8KK0RFRklORV9FVkVOVChzY2hlZF9wcm9jZXNzX3RlbXBsYXRlLCBzY2hlZF93YWl0X3Rhc2ssCisJVFBfUFJPVE8oc3RydWN0IHRhc2tfc3RydWN0ICpwKSwKKwlUUF9BUkdTKHApKTsKKworLyoKICAqIFRyYWNlcG9pbnQgZm9yIGEgd2FpdGluZyB0YXNrOgogICovCiBUUkFDRV9FVkVOVChzY2hlZF9wcm9jZXNzX3dhaXQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aW1lci5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvdGltZXIuaAppbmRleCA5NDk2Yjk2Li5jNjI0MTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aW1lci5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RpbWVyLmgKQEAgLTgsMTEgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCi0vKioKLSAqIHRpbWVyX2luaXQgLSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgaXMgaW5pdGlhbGl6ZWQKLSAqIEB0aW1lcjoJcG9pbnRlciB0byBzdHJ1Y3QgdGltZXJfbGlzdAotICovCi1UUkFDRV9FVkVOVCh0aW1lcl9pbml0LAorREVDTEFSRV9FVkVOVF9DTEFTUyh0aW1lcl9jbGFzcywKIAogCVRQX1BST1RPKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciksCiAKQEAgLTMwLDYgKzI2LDE3IEBACiApOwogCiAvKioKKyAqIHRpbWVyX2luaXQgLSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgaXMgaW5pdGlhbGl6ZWQKKyAqIEB0aW1lcjoJcG9pbnRlciB0byBzdHJ1Y3QgdGltZXJfbGlzdAorICovCitERUZJTkVfRVZFTlQodGltZXJfY2xhc3MsIHRpbWVyX2luaXQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpLAorCisJVFBfQVJHUyh0aW1lcikKKyk7CisKKy8qKgogICogdGltZXJfc3RhcnQgLSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgaXMgc3RhcnRlZAogICogQHRpbWVyOglwb2ludGVyIHRvIHN0cnVjdCB0aW1lcl9saXN0CiAgKiBAZXhwaXJlczoJdGhlIHRpbWVycyBleHBpcnkgdGltZQpAQCAtOTQsNDIgKzEwMSwyMiBAQAogICogTk9URTogRG8gTk9UIGRlcmVmZXJuY2UgdGltZXIgaW4gVFBfZmFzdF9hc3NpZ24uIFRoZSBwb2ludGVyIG1pZ2h0CiAgKiBiZSBpbnZhbGlkLiBXZSBzb2xlbHkgdHJhY2sgdGhlIHBvaW50ZXIuCiAgKi8KLVRSQUNFX0VWRU5UKHRpbWVyX2V4cGlyZV9leGl0LAorREVGSU5FX0VWRU5UKHRpbWVyX2NsYXNzLCB0aW1lcl9leHBpcmVfZXhpdCwKIAogCVRQX1BST1RPKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciksCiAKLQlUUF9BUkdTKHRpbWVyKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZmllbGQodm9pZCAqLAl0aW1lcgkpCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT50aW1lcgk9IHRpbWVyOwotCSksCi0KLQlUUF9wcmludGsoInRpbWVyPSVwIiwgX19lbnRyeS0+dGltZXIpCisJVFBfQVJHUyh0aW1lcikKICk7CiAKIC8qKgogICogdGltZXJfY2FuY2VsIC0gY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGlzIGNhbmNlbGVkCiAgKiBAdGltZXI6CXBvaW50ZXIgdG8gc3RydWN0IHRpbWVyX2xpc3QKICAqLwotVFJBQ0VfRVZFTlQodGltZXJfY2FuY2VsLAorREVGSU5FX0VWRU5UKHRpbWVyX2NsYXNzLCB0aW1lcl9jYW5jZWwsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpLAogCi0JVFBfQVJHUyh0aW1lciksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKCB2b2lkICosCXRpbWVyCSkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPnRpbWVyCT0gdGltZXI7Ci0JKSwKLQotCVRQX3ByaW50aygidGltZXI9JXAiLCBfX2VudHJ5LT50aW1lcikKKwlUUF9BUkdTKHRpbWVyKQogKTsKIAogLyoqCkBAIC0yMjQsMTQgKzIxMSw3IEBACiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylrdGltZV90b19ucygoa3RpbWVfdCkgeyAudHY2NCA9IF9fZW50cnktPm5vdyB9KSkKICApOwogCi0vKioKLSAqIGhydGltZXJfZXhwaXJlX2V4aXQgLSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGhydGltZXIgY2FsbGJhY2sgcmV0dXJucwotICogQHRpbWVyOglwb2ludGVyIHRvIHN0cnVjdCBocnRpbWVyCi0gKgotICogV2hlbiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGhydGltZXJfZXhwaXJlX2VudHJ5IHRyYWNlcG9pbnQgd2UgY2FuCi0gKiBkZXRlcm1pbmUgdGhlIHJ1bnRpbWUgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICovCi1UUkFDRV9FVkVOVChocnRpbWVyX2V4cGlyZV9leGl0LAorREVDTEFSRV9FVkVOVF9DTEFTUyhocnRpbWVyX2NsYXNzLAogCiAJVFBfUFJPVE8oc3RydWN0IGhydGltZXIgKmhydGltZXIpLAogCkBAIC0yNDksMjQgKzIyOSwyOCBAQAogKTsKIAogLyoqCi0gKiBocnRpbWVyX2NhbmNlbCAtIGNhbGxlZCB3aGVuIHRoZSBocnRpbWVyIGlzIGNhbmNlbGVkCi0gKiBAaHJ0aW1lcjoJcG9pbnRlciB0byBzdHJ1Y3QgaHJ0aW1lcgorICogaHJ0aW1lcl9leHBpcmVfZXhpdCAtIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaHJ0aW1lciBjYWxsYmFjayByZXR1cm5zCisgKiBAdGltZXI6CXBvaW50ZXIgdG8gc3RydWN0IGhydGltZXIKKyAqCisgKiBXaGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgaHJ0aW1lcl9leHBpcmVfZW50cnkgdHJhY2Vwb2ludCB3ZSBjYW4KKyAqIGRldGVybWluZSB0aGUgcnVudGltZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCiAgKi8KLVRSQUNFX0VWRU5UKGhydGltZXJfY2FuY2VsLAorREVGSU5FX0VWRU5UKGhydGltZXJfY2xhc3MsIGhydGltZXJfZXhwaXJlX2V4aXQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lciksCiAKLQlUUF9BUkdTKGhydGltZXIpLAorCVRQX0FSR1MoaHJ0aW1lcikKKyk7CiAKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKCB2b2lkICosCWhydGltZXIJKQotCSksCisvKioKKyAqIGhydGltZXJfY2FuY2VsIC0gY2FsbGVkIHdoZW4gdGhlIGhydGltZXIgaXMgY2FuY2VsZWQKKyAqIEBocnRpbWVyOglwb2ludGVyIHRvIHN0cnVjdCBocnRpbWVyCisgKi8KK0RFRklORV9FVkVOVChocnRpbWVyX2NsYXNzLCBocnRpbWVyX2NhbmNlbCwKIAotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5ocnRpbWVyCT0gaHJ0aW1lcjsKLQkpLAorCVRQX1BST1RPKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKSwKIAotCVRQX3ByaW50aygiaHJ0aW1lcj0lcCIsIF9fZW50cnktPmhydGltZXIpCisJVFBfQVJHUyhocnRpbWVyKQogKTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaAppbmRleCA1YTY0OTA1Li5hOTM3N2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZnRyYWNlLmgKQEAgLTc1LDE1ICs3NSwxMiBAQAogI2RlZmluZSBERUZJTkVfRVZFTlRfUFJJTlQodGVtcGxhdGUsIG5hbWUsIHByb3RvLCBhcmdzLCBwcmludCkJXAogCURFRklORV9FVkVOVCh0ZW1wbGF0ZSwgbmFtZSwgUEFSQU1TKHByb3RvKSwgUEFSQU1TKGFyZ3MpKQogCi0jdW5kZWYgX19jcHBhcmcKLSNkZWZpbmUgX19jcHBhcmcoYXJnLi4uKSBhcmcKLQogLyogQ2FsbGJhY2tzIGFyZSBtZWFuaW5nbGVzcyB0byBmdHJhY2UuICovCiAjdW5kZWYgVFJBQ0VfRVZFTlRfRk4KICNkZWZpbmUgVFJBQ0VfRVZFTlRfRk4obmFtZSwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsCQkJXAogCQlhc3NpZ24sIHByaW50LCByZWcsIHVucmVnKQkJCQlcCi0JVFJBQ0VfRVZFTlQobmFtZSwgX19jcHBhcmcocHJvdG8pLCBfX2NwcGFyZyhhcmdzKSwJCVwKLQkJX19jcHBhcmcodHN0cnVjdCksIF9fY3BwYXJnKGFzc2lnbiksIF9fY3BwYXJnKHByaW50KSkJXAorCVRSQUNFX0VWRU5UKG5hbWUsIFBBUkFNUyhwcm90byksIFBBUkFNUyhhcmdzKSwJCQlcCisJCVBBUkFNUyh0c3RydWN0KSwgUEFSQU1TKGFzc2lnbiksIFBBUkFNUyhwcmludCkpCQlcCiAKICNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQogCkBAIC0xNDUsNyArMTQyLDcgQEAKICAqCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwogICoJc3RydWN0IGZ0cmFjZV9yYXdfPGNhbGw+ICpmaWVsZDsgPC0tIGRlZmluZWQgaW4gc3RhZ2UgMQogICoJc3RydWN0IHRyYWNlX2VudHJ5ICplbnRyeTsKLSAqCXN0cnVjdCB0cmFjZV9zZXEgKnA7CisgKglzdHJ1Y3QgdHJhY2Vfc2VxICpwID0gJml0ZXItPnRtcF9zZXE7CiAgKglpbnQgcmV0OwogICoKICAqCWVudHJ5ID0gaXRlci0+ZW50OwpAQCAtMTU3LDEyICsxNTQsMTAgQEAKICAqCiAgKglmaWVsZCA9ICh0eXBlb2YoZmllbGQpKWVudHJ5OwogICoKLSAqCXAgPSAmZ2V0X2NwdV92YXIoZnRyYWNlX2V2ZW50X3NlcSk7CiAgKgl0cmFjZV9zZXFfaW5pdChwKTsKICAqCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiVzOiAiLCA8Y2FsbD4pOwogICoJaWYgKHJldCkKICAqCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsIDxUUF9wcmludGs+ICJcbiIpOwotICoJcHV0X2NwdSgpOwogICoJaWYgKCFyZXQpCiAgKgkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwogICoKQEAgLTIxNiw3ICsyMTEsNyBAQAogCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwkJCQlcCiAJc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsICpmaWVsZDsJCQkJXAogCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnk7CQkJCQlcCi0Jc3RydWN0IHRyYWNlX3NlcSAqcDsJCQkJCQlcCisJc3RydWN0IHRyYWNlX3NlcSAqcCA9ICZpdGVyLT50bXBfc2VxOwkJCQlcCiAJaW50IHJldDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCWV2ZW50ID0gY29udGFpbmVyX29mKHRyYWNlX2V2ZW50LCBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwsCVwKQEAgLTIzMSwxMiArMjI2LDEwIEBACiAJCQkJCQkJCQlcCiAJZmllbGQgPSAodHlwZW9mKGZpZWxkKSllbnRyeTsJCQkJCVwKIAkJCQkJCQkJCVwKLQlwID0gJmdldF9jcHVfdmFyKGZ0cmFjZV9ldmVudF9zZXEpOwkJCQlcCiAJdHJhY2Vfc2VxX2luaXQocCk7CQkJCQkJXAogCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiVzOiAiLCBldmVudC0+bmFtZSk7CQkJXAogCWlmIChyZXQpCQkJCQkJCVwKIAkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCBwcmludCk7CQkJXAotCXB1dF9jcHUoKTsJCQkJCQkJXAogCWlmICghcmV0KQkJCQkJCQlcCiAJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsJCQkJXAogCQkJCQkJCQkJXApAQCAtMjU1LDcgKzI0OCw3IEBACiAJc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7CQkJCVwKIAlzdHJ1Y3QgZnRyYWNlX3Jhd18jI3RlbXBsYXRlICpmaWVsZDsJCQkJXAogCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnk7CQkJCQlcCi0Jc3RydWN0IHRyYWNlX3NlcSAqcDsJCQkJCQlcCisJc3RydWN0IHRyYWNlX3NlcSAqcCA9ICZpdGVyLT50bXBfc2VxOwkJCQlcCiAJaW50IHJldDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCWVudHJ5ID0gaXRlci0+ZW50OwkJCQkJCVwKQEAgLTI2NywxMiArMjYwLDEwIEBACiAJCQkJCQkJCQlcCiAJZmllbGQgPSAodHlwZW9mKGZpZWxkKSllbnRyeTsJCQkJCVwKIAkJCQkJCQkJCVwKLQlwID0gJmdldF9jcHVfdmFyKGZ0cmFjZV9ldmVudF9zZXEpOwkJCQlcCiAJdHJhY2Vfc2VxX2luaXQocCk7CQkJCQkJXAogCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiVzOiAiLCAjY2FsbCk7CQkJXAogCWlmIChyZXQpCQkJCQkJCVwKIAkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCBwcmludCk7CQkJXAotCXB1dF9jcHUoKTsJCQkJCQkJXAogCWlmICghcmV0KQkJCQkJCQlcCiAJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsJCQkJXAogCQkJCQkJCQkJXApAQCAtNDM5LDYgKzQzMCw3IEBACiAgKgkuZmllbGRzCQkJPSBMSVNUX0hFQURfSU5JVChldmVudF9jbGFzc18jI2NhbGwuZmllbGRzKSwKICAqCS5yYXdfaW5pdAkJPSB0cmFjZV9ldmVudF9yYXdfaW5pdCwKICAqCS5wcm9iZQkJCT0gZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwsCisgKgkucmVnCQkJPSBmdHJhY2VfZXZlbnRfcmVnLAogICogfTsKICAqCiAgKiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZApAQCAtNTY3LDYgKzU1OSw3IEBACiAJLmZpZWxkcwkJCT0gTElTVF9IRUFEX0lOSVQoZXZlbnRfY2xhc3NfIyNjYWxsLmZpZWxkcyksXAogCS5yYXdfaW5pdAkJPSB0cmFjZV9ldmVudF9yYXdfaW5pdCwJCQlcCiAJLnByb2JlCQkJPSBmdHJhY2VfcmF3X2V2ZW50XyMjY2FsbCwJCVwKKwkucmVnCQkJPSBmdHJhY2VfZXZlbnRfcmVnLAkJCVwKIAlfVFJBQ0VfUEVSRl9JTklUKGNhbGwpCQkJCQkJXAogfTsKIApAQCAtNzA1LDcgKzY5OCw3IEBACiAJaW50IF9fZGF0YV9zaXplOwkJCQkJCVwKIAlpbnQgcmN0eDsJCQkJCQkJXAogCQkJCQkJCQkJXAotCXBlcmZfZmV0Y2hfY2FsbGVyX3JlZ3MoJl9fcmVncywgMSk7CQkJCVwKKwlwZXJmX2ZldGNoX2NhbGxlcl9yZWdzKCZfX3JlZ3MpOwkJCQlcCiAJCQkJCQkJCQlcCiAJX19kYXRhX3NpemUgPSBmdHJhY2VfZ2V0X29mZnNldHNfIyNjYWxsKCZfX2RhdGFfb2Zmc2V0cywgYXJncyk7IFwKIAlfX2VudHJ5X3NpemUgPSBBTElHTihfX2RhdGFfc2l6ZSArIHNpemVvZigqZW50cnkpICsgc2l6ZW9mKHUzMiksXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9zeXNjYWxsLmggYi9pbmNsdWRlL3RyYWNlL3N5c2NhbGwuaAppbmRleCAyNTdlMDg5Li4zMTk2NmE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL3N5c2NhbGwuaAorKysgYi9pbmNsdWRlL3RyYWNlL3N5c2NhbGwuaApAQCAtMjYsNyArMjYsNiBAQAogCWNvbnN0IGNoYXIJKip0eXBlczsKIAljb25zdCBjaGFyCSoqYXJnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGVudGVyX2ZpZWxkczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV4aXRfZmllbGRzOwogCiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICplbnRlcl9ldmVudDsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV4aXRfZXZlbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9ldmVudHMuaCBiL2luY2x1ZGUveGVuL2V2ZW50cy5oCmluZGV4IGU2OGQ1OWEuLmExNWQ5MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2V2ZW50cy5oCisrKyBiL2luY2x1ZGUveGVuL2V2ZW50cy5oCkBAIC01Niw0ICs1NiwxMSBAQAogLyogRGV0ZXJtaW5lIHRoZSBJUlEgd2hpY2ggaXMgYm91bmQgdG8gYW4gZXZlbnQgY2hhbm5lbCAqLwogdW5zaWduZWQgaXJxX2Zyb21fZXZ0Y2huKHVuc2lnbmVkIGludCBldnRjaG4pOwogCisvKiBYZW4gSFZNIGV2dGNobiB2ZWN0b3IgY2FsbGJhY2sgKi8KK2V4dGVybiB2b2lkIHhlbl9odm1fY2FsbGJhY2tfdmVjdG9yKHZvaWQpOworZXh0ZXJuIGludCB4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2s7CitpbnQgeGVuX3NldF9jYWxsYmFja192aWEodWludDY0X3QgdmlhKTsKK3ZvaWQgeGVuX2V2dGNobl9kb191cGNhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwordm9pZCB4ZW5faHZtX2V2dGNobl9kb191cGNhbGwodm9pZCk7CisKICNlbmRpZgkvKiBfWEVOX0VWRU5UU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oIGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaAppbmRleCBhNDBmMWNkLi45YTczMTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oCisrKyBiL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmgKQEAgLTUxLDYgKzUxLDcgQEAKIAl1MTYgY291bnQ7CiB9OwogCitpbnQgZ250dGFiX2luaXQodm9pZCk7CiBpbnQgZ250dGFiX3N1c3BlbmQodm9pZCk7CiBpbnQgZ250dGFiX3Jlc3VtZSh2b2lkKTsKIApAQCAtMTEyLDYgKzExMyw5IEBACiB2b2lkIGFyY2hfZ250dGFiX3VubWFwX3NoYXJlZChzdHJ1Y3QgZ3JhbnRfZW50cnkgKnNoYXJlZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfZ2ZyYW1lcyk7CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHhlbl9odm1fcmVzdW1lX2ZyYW1lczsKK3Vuc2lnbmVkIGludCBnbnR0YWJfbWF4X2dyYW50X2ZyYW1lcyh2b2lkKTsKKwogI2RlZmluZSBnbnR0YWJfbWFwX3ZhZGRyKG1hcCkgKCh2b2lkICopKG1hcC5ob3N0X3ZpcnRfYWRkcikpCiAKICNlbmRpZiAvKiBfX0FTTV9HTlRUQUJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9odm0uaCBiL2luY2x1ZGUveGVuL2h2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTNmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9odm0uaApAQCAtMCwwICsxLDMwIEBACisvKiBTaW1wbGUgd3JhcHBlcnMgYXJvdW5kIEhWTSBmdW5jdGlvbnMgKi8KKyNpZm5kZWYgWEVOX0hWTV9IX18KKyNkZWZpbmUgWEVOX0hWTV9IX18KKworI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvaHZtL3BhcmFtcy5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGh2bV9nZXRfcGFyYW1ldGVyKGludCBpZHgsIHVpbnQ2NF90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgeGVuX2h2bV9wYXJhbSB4aHY7CisJaW50IHI7CisKKwl4aHYuZG9taWQgPSBET01JRF9TRUxGOworCXhodi5pbmRleCA9IGlkeDsKKwlyID0gSFlQRVJWSVNPUl9odm1fb3AoSFZNT1BfZ2V0X3BhcmFtLCAmeGh2KTsKKwlpZiAociA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZ2V0IGh2bSBwYXJhbWV0ZXIgJWQ6ICVkIVxuIiwKKwkJCWlkeCwgcik7CisJCXJldHVybiByOworCX0KKwkqdmFsdWUgPSB4aHYudmFsdWU7CisJcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgSFZNX0NBTExCQUNLX1ZJQV9UWVBFX1ZFQ1RPUiAweDIKKyNkZWZpbmUgSFZNX0NBTExCQUNLX1ZJQV9UWVBFX1NISUZUIDU2CisjZGVmaW5lIEhWTV9DQUxMQkFDS19WRUNUT1IoeCkgKCgodWludDY0X3QpSFZNX0NBTExCQUNLX1ZJQV9UWVBFX1ZFQ1RPUik8PFwKKwkJSFZNX0NBTExCQUNLX1ZJQV9UWVBFX1NISUZUIHwgKHgpKQorCisjZW5kaWYgLyogWEVOX0hWTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9mZWF0dXJlcy5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2ZlYXR1cmVzLmgKaW5kZXggZjUxYjY0MS4uNzBkMjU2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2ZlYXR1cmVzLmgKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2ZlYXR1cmVzLmgKQEAgLTQxLDYgKzQxLDEyIEBACiAvKiB4ODY6IERvZXMgdGhpcyBYZW4gaG9zdCBzdXBwb3J0IHRoZSBNTVVfUFRfVVBEQVRFX1BSRVNFUlZFX0FEIGh5cGVyY2FsbD8gKi8KICNkZWZpbmUgWEVORkVBVF9tbXVfcHRfdXBkYXRlX3ByZXNlcnZlX2FkICA1CiAKKy8qIHg4NjogRG9lcyB0aGlzIFhlbiBob3N0IHN1cHBvcnQgdGhlIEhWTSBjYWxsYmFjayB2ZWN0b3IgdHlwZT8gKi8KKyNkZWZpbmUgWEVORkVBVF9odm1fY2FsbGJhY2tfdmVjdG9yICAgICAgICA4CisKKy8qIHg4NjogcHZjbG9jayBhbGdvcml0aG0gaXMgc2FmZSB0byB1c2Ugb24gSFZNICovCisjZGVmaW5lIFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jayAgICAgICAgICAgOQorCiAjZGVmaW5lIFhFTkZFQVRfTlJfU1VCTUFQUyAxCiAKICNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfRkVBVFVSRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvZ3JhbnRfdGFibGUuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oCmluZGV4IDM5ZGE5M2MuLjM5ZTU3MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaWZuZGVmIF9fWEVOX1BVQkxJQ19HUkFOVF9UQUJMRV9IX18KICNkZWZpbmUgX19YRU5fUFVCTElDX0dSQU5UX1RBQkxFX0hfXwogCisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBHUkFOVCBUQUJMRSBSRVBSRVNFTlRBVElPTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2h2bS9odm1fb3AuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9odm0vaHZtX29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MjdmNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9odm0vaHZtX29wLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fWEVOX1BVQkxJQ19IVk1fSFZNX09QX0hfXworI2RlZmluZSBfX1hFTl9QVUJMSUNfSFZNX0hWTV9PUF9IX18KKworLyogR2V0L3NldCBzdWJjb21tYW5kczogdGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgaHlwZXJjYWxsIGlzIGEKKyAqIHBvaW50ZXIgdG8gYSB4ZW5faHZtX3BhcmFtIHN0cnVjdC4gKi8KKyNkZWZpbmUgSFZNT1Bfc2V0X3BhcmFtICAgICAgICAgICAwCisjZGVmaW5lIEhWTU9QX2dldF9wYXJhbSAgICAgICAgICAgMQorc3RydWN0IHhlbl9odm1fcGFyYW0geworICAgIGRvbWlkX3QgIGRvbWlkOyAgICAvKiBJTiAqLworICAgIHVpbnQzMl90IGluZGV4OyAgICAvKiBJTiAqLworICAgIHVpbnQ2NF90IHZhbHVlOyAgICAvKiBJTi9PVVQgKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5faHZtX3BhcmFtKTsKKworLyogSGludCBmcm9tIFBWIGRyaXZlcnMgZm9yIHBhZ2V0YWJsZSBkZXN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgSFZNT1BfcGFnZXRhYmxlX2R5aW5nICAgICAgIDkKK3N0cnVjdCB4ZW5faHZtX3BhZ2V0YWJsZV9keWluZyB7CisgICAgLyogRG9tYWluIHdpdGggYSBwYWdldGFibGUgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAqLworICAgIGRvbWlkX3QgIGRvbWlkOworICAgIC8qIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHRvcGxldmVsIHBhZ2V0YWJsZSBkeWluZyAqLworICAgIGFsaWduZWRfdTY0IGdwYTsKK307Cit0eXBlZGVmIHN0cnVjdCB4ZW5faHZtX3BhZ2V0YWJsZV9keWluZyB4ZW5faHZtX3BhZ2V0YWJsZV9keWluZ190OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVuX2h2bV9wYWdldGFibGVfZHlpbmdfdCk7CisgCisjZW5kaWYgLyogX19YRU5fUFVCTElDX0hWTV9IVk1fT1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaHZtL3BhcmFtcy5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2h2bS9wYXJhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg4ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2h2bS9wYXJhbXMuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisgKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19YRU5fUFVCTElDX0hWTV9QQVJBTVNfSF9fCisjZGVmaW5lIF9fWEVOX1BVQkxJQ19IVk1fUEFSQU1TX0hfXworCisjaW5jbHVkZSAiaHZtX29wLmgiCisKKy8qCisgKiBQYXJhbWV0ZXIgc3BhY2UgZm9yIEhWTU9QX3tzZXQsZ2V0fV9wYXJhbS4KKyAqLworCisvKgorICogSG93IHNob3VsZCBDUFUwIGV2ZW50LWNoYW5uZWwgbm90aWZpY2F0aW9ucyBiZSBkZWxpdmVyZWQ/CisgKiB2YWxbNjM6NTZdID09IDA6IHZhbFs1NTowXSBpcyBhIGRlbGl2ZXJ5IEdTSSAoR2xvYmFsIFN5c3RlbSBJbnRlcnJ1cHQpLgorICogdmFsWzYzOjU2XSA9PSAxOiB2YWxbNTU6MF0gaXMgYSBkZWxpdmVyeSBQQ0kgSU5UeCBsaW5lLCBhcyBmb2xsb3dzOgorICogICAgICAgICAgICAgICAgICBEb21haW4gPSB2YWxbNDc6MzJdLCBCdXMgID0gdmFsWzMxOjE2XSwKKyAqICAgICAgICAgICAgICAgICAgRGV2Rm4gID0gdmFsWzE1OiA4XSwgSW50WCA9IHZhbFsgMTogMF0KKyAqIHZhbFs2Mzo1Nl0gPT0gMjogdmFsWzc6MF0gaXMgYSB2ZWN0b3IgbnVtYmVyLgorICogSWYgdmFsID09IDAgdGhlbiBDUFUwIGV2ZW50LWNoYW5uZWwgbm90aWZpY2F0aW9ucyBhcmUgbm90IGRlbGl2ZXJlZC4KKyAqLworI2RlZmluZSBIVk1fUEFSQU1fQ0FMTEJBQ0tfSVJRIDAKKworI2RlZmluZSBIVk1fUEFSQU1fU1RPUkVfUEZOICAgIDEKKyNkZWZpbmUgSFZNX1BBUkFNX1NUT1JFX0VWVENITiAyCisKKyNkZWZpbmUgSFZNX1BBUkFNX1BBRV9FTkFCTEVEICA0CisKKyNkZWZpbmUgSFZNX1BBUkFNX0lPUkVRX1BGTiAgICA1CisKKyNkZWZpbmUgSFZNX1BBUkFNX0JVRklPUkVRX1BGTiA2CisKKy8qCisgKiBTZXQgbW9kZSBmb3IgdmlydHVhbCB0aW1lcnMgKGN1cnJlbnRseSB4ODYgb25seSk6CisgKiAgZGVsYXlfZm9yX21pc3NlZF90aWNrcyAoZGVmYXVsdCk6CisgKiAgIERvIG5vdCBhZHZhbmNlIGEgdmNwdSdzIHRpbWUgYmV5b25kIHRoZSBjb3JyZWN0IGRlbGl2ZXJ5IHRpbWUgZm9yCisgKiAgIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gbWlzc2VkIGR1ZSB0byBwcmVlbXB0aW9uLiBEZWxpdmVyIG1pc3NlZAorICogICBpbnRlcnJ1cHRzIHdoZW4gdGhlIHZjcHUgaXMgcmVzY2hlZHVsZWQgYW5kIGFkdmFuY2UgdGhlIHZjcHUncyB2aXJ0dWFsCisgKiAgIHRpbWUgc3RlcHdpc2UgZm9yIGVhY2ggb25lLgorICogIG5vX2RlbGF5X2Zvcl9taXNzZWRfdGlja3M6CisgKiAgIEFzIGFib3ZlLCBtaXNzZWQgaW50ZXJydXB0cyBhcmUgZGVsaXZlcmVkLCBidXQgZ3Vlc3QgdGltZSBhbHdheXMgdHJhY2tzCisgKiAgIHdhbGxjbG9jayAoaS5lLiwgcmVhbCkgdGltZSB3aGlsZSBkb2luZyBzby4KKyAqICBub19taXNzZWRfdGlja3NfcGVuZGluZzoKKyAqICAgTm8gbWlzc2VkIGludGVycnVwdHMgYXJlIGhlbGQgcGVuZGluZy4gSW5zdGVhZCwgdG8gZW5zdXJlIHRpY2tzIGFyZQorICogICBkZWxpdmVyZWQgYXQgc29tZSBub24temVybyByYXRlLCBpZiB3ZSBkZXRlY3QgbWlzc2VkIHRpY2tzIHRoZW4gdGhlCisgKiAgIGludGVybmFsIHRpY2sgYWxhcm0gaXMgbm90IGRpc2FibGVkIGlmIHRoZSBWQ1BVIGlzIHByZWVtcHRlZCBkdXJpbmcgdGhlCisgKiAgIG5leHQgdGljayBwZXJpb2QuCisgKiAgb25lX21pc3NlZF90aWNrX3BlbmRpbmc6CisgKiAgIE1pc3NlZCBpbnRlcnJ1cHRzIGFyZSBjb2xsYXBzZWQgdG9nZXRoZXIgYW5kIGRlbGl2ZXJlZCBhcyBvbmUgJ2xhdGUgdGljaycuCisgKiAgIEd1ZXN0IHRpbWUgYWx3YXlzIHRyYWNrcyB3YWxsY2xvY2sgKGkuZS4sIHJlYWwpIHRpbWUuCisgKi8KKyNkZWZpbmUgSFZNX1BBUkFNX1RJTUVSX01PREUgICAxMAorI2RlZmluZSBIVk1QVE1fZGVsYXlfZm9yX21pc3NlZF90aWNrcyAgICAwCisjZGVmaW5lIEhWTVBUTV9ub19kZWxheV9mb3JfbWlzc2VkX3RpY2tzIDEKKyNkZWZpbmUgSFZNUFRNX25vX21pc3NlZF90aWNrc19wZW5kaW5nICAgMgorI2RlZmluZSBIVk1QVE1fb25lX21pc3NlZF90aWNrX3BlbmRpbmcgICAzCisKKy8qIEJvb2xlYW46IEVuYWJsZSB2aXJ0dWFsIEhQRVQgKGhpZ2gtcHJlY2lzaW9uIGV2ZW50IHRpbWVyKT8gKHg4Ni1vbmx5KSAqLworI2RlZmluZSBIVk1fUEFSQU1fSFBFVF9FTkFCTEVEIDExCisKKy8qIElkZW50aXR5LW1hcCBwYWdlIGRpcmVjdG9yeSB1c2VkIGJ5IEludGVsIEVQVCB3aGVuIENSMC5QRz0wLiAqLworI2RlZmluZSBIVk1fUEFSQU1fSURFTlRfUFQgICAgIDEyCisKKy8qIERldmljZSBNb2RlbCBkb21haW4sIGRlZmF1bHRzIHRvIDAuICovCisjZGVmaW5lIEhWTV9QQVJBTV9ETV9ET01BSU4gICAgMTMKKworLyogQUNQSSBTIHN0YXRlOiBjdXJyZW50bHkgc3VwcG9ydCBTMCBhbmQgUzMgb24geDg2LiAqLworI2RlZmluZSBIVk1fUEFSQU1fQUNQSV9TX1NUQVRFIDE0CisKKy8qIFRTUyB1c2VkIG9uIEludGVsIHdoZW4gQ1IwLlBFPTAuICovCisjZGVmaW5lIEhWTV9QQVJBTV9WTTg2X1RTUyAgICAgMTUKKworLyogQm9vbGVhbjogRW5hYmxlIGFsaWduaW5nIGFsbCBwZXJpb2RpYyB2cHRzIHRvIHJlZHVjZSBpbnRlcnJ1cHRzICovCisjZGVmaW5lIEhWTV9QQVJBTV9WUFRfQUxJR04gICAgMTYKKworI2RlZmluZSBIVk1fTlJfUEFSQU1TICAgICAgICAgIDE3CisKKyNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfSFZNX1BBUkFNU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3BsYXRmb3JtX3BjaS5oIGIvaW5jbHVkZS94ZW4vcGxhdGZvcm1fcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZDY3MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveGVuL3BsYXRmb3JtX3BjaS5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX1hFTl9QTEFURk9STV9QQ0lfSAorI2RlZmluZSBfWEVOX1BMQVRGT1JNX1BDSV9ICisKKyNkZWZpbmUgWEVOX0lPUE9SVF9NQUdJQ19WQUwgMHg0OWQyCisjZGVmaW5lIFhFTl9JT1BPUlRfTElOVVhfUFJPRE5VTSAweDAwMDMKKyNkZWZpbmUgWEVOX0lPUE9SVF9MSU5VWF9EUlZWRVIgIDB4MDAwMQorCisjZGVmaW5lIFhFTl9JT1BPUlRfQkFTRSAweDEwCisKKyNkZWZpbmUgWEVOX0lPUE9SVF9QTEFURkxBR1MJKFhFTl9JT1BPUlRfQkFTRSArIDApIC8qIDEgYnl0ZSBhY2Nlc3MgKFIvVykgKi8KKyNkZWZpbmUgWEVOX0lPUE9SVF9NQUdJQwkoWEVOX0lPUE9SVF9CQVNFICsgMCkgLyogMiBieXRlIGFjY2VzcyAoUikgKi8KKyNkZWZpbmUgWEVOX0lPUE9SVF9VTlBMVUcJKFhFTl9JT1BPUlRfQkFTRSArIDApIC8qIDIgYnl0ZSBhY2Nlc3MgKFcpICovCisjZGVmaW5lIFhFTl9JT1BPUlRfRFJWVkVSCShYRU5fSU9QT1JUX0JBU0UgKyAwKSAvKiA0IGJ5dGUgYWNjZXNzIChXKSAqLworCisjZGVmaW5lIFhFTl9JT1BPUlRfU1lTTE9HCShYRU5fSU9QT1JUX0JBU0UgKyAyKSAvKiAxIGJ5dGUgYWNjZXNzIChXKSAqLworI2RlZmluZSBYRU5fSU9QT1JUX1BST1RPVkVSCShYRU5fSU9QT1JUX0JBU0UgKyAyKSAvKiAxIGJ5dGUgYWNjZXNzIChSKSAqLworI2RlZmluZSBYRU5fSU9QT1JUX1BST0ROVU0JKFhFTl9JT1BPUlRfQkFTRSArIDIpIC8qIDIgYnl0ZSBhY2Nlc3MgKFcpICovCisKKyNkZWZpbmUgWEVOX1VOUExVR19BTExfSURFX0RJU0tTIDEKKyNkZWZpbmUgWEVOX1VOUExVR19BTExfTklDUyAyCisjZGVmaW5lIFhFTl9VTlBMVUdfQVVYX0lERV9ESVNLUyA0CisjZGVmaW5lIFhFTl9VTlBMVUdfQUxMIDcKKyNkZWZpbmUgWEVOX1VOUExVR19JR05PUkUgOAorCitzdGF0aWMgaW5saW5lIGludCB4ZW5fbXVzdF91bnBsdWdfbmljcyh2b2lkKSB7CisjaWYgKGRlZmluZWQoQ09ORklHX1hFTl9ORVRERVZfRlJPTlRFTkQpIHx8IFwKKwkJZGVmaW5lZChDT05GSUdfWEVOX05FVERFVl9GUk9OVEVORF9NT0RVTEUpKSAmJiBcCisJCShkZWZpbmVkKENPTkZJR19YRU5fUExBVEZPUk1fUENJKSB8fCBcCisJCSBkZWZpbmVkKENPTkZJR19YRU5fUExBVEZPUk1fUENJX01PRFVMRSkpCisgICAgICAgIHJldHVybiAxOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgeGVuX211c3RfdW5wbHVnX2Rpc2tzKHZvaWQpIHsKKyNpZiAoZGVmaW5lZChDT05GSUdfWEVOX0JMS0RFVl9GUk9OVEVORCkgfHwgXAorCQlkZWZpbmVkKENPTkZJR19YRU5fQkxLREVWX0ZST05URU5EX01PRFVMRSkpICYmIFwKKwkJKGRlZmluZWQoQ09ORklHX1hFTl9QTEFURk9STV9QQ0kpIHx8IFwKKwkJIGRlZmluZWQoQ09ORklHX1hFTl9QTEFURk9STV9QQ0lfTU9EVUxFKSkKKyAgICAgICAgcmV0dXJuIDE7CisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitleHRlcm4gaW50IHhlbl9wbGF0Zm9ybV9wY2lfdW5wbHVnOworCisjZW5kaWYgLyogX1hFTl9QTEFURk9STV9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLW9wcy5oIGIvaW5jbHVkZS94ZW4veGVuLW9wcy5oCmluZGV4IDg4M2EyMWIuLjQ2YmM4MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbi1vcHMuaAorKysgYi9pbmNsdWRlL3hlbi94ZW4tb3BzLmgKQEAgLTcsNiArNyw3IEBACiAKIHZvaWQgeGVuX3ByZV9zdXNwZW5kKHZvaWQpOwogdm9pZCB4ZW5fcG9zdF9zdXNwZW5kKGludCBzdXNwZW5kX2NhbmNlbGxlZCk7Cit2b2lkIHhlbl9odm1fcG9zdF9zdXNwZW5kKGludCBzdXNwZW5kX2NhbmNlbGxlZCk7CiAKIHZvaWQgeGVuX21tX3Bpbl9hbGwodm9pZCk7CiB2b2lkIHhlbl9tbV91bnBpbl9hbGwodm9pZCk7CkBAIC0xNCw0ICsxNSw2IEBACiB2b2lkIHhlbl90aW1lcl9yZXN1bWUodm9pZCk7CiB2b2lkIHhlbl9hcmNoX3Jlc3VtZSh2b2lkKTsKIAoraW50IHhlbl9zZXR1cF9zaHV0ZG93bl9ldmVudCh2b2lkKTsKKwogI2VuZGlmIC8qIElOQ0xVREVfWEVOX09QU19IICovCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGE0MmZkZjQuLmIwM2E0YzEgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC02NiwxMSArNjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+Ci0jaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2ZpLmg+CiAjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8dHJhY2UvYm9vdC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J1Z3MuaD4KQEAgLTUzMiw2ICs1MzAsNyBAQAogCXBhZ2VfY2dyb3VwX2luaXRfZmxhdG1lbSgpOwogCW1lbV9pbml0KCk7CiAJa21lbV9jYWNoZV9pbml0KCk7CisJcGVyY3B1X2luaXRfbGF0ZSgpOwogCXBndGFibGVfY2FjaGVfaW5pdCgpOwogCXZtYWxsb2NfaW5pdCgpOwogfQpAQCAtNjYzLDcgKzY2Miw2IEBACiAjZW5kaWYKIAlwYWdlX2Nncm91cF9pbml0KCk7CiAJZW5hYmxlX2RlYnVnX3BhZ2VhbGxvYygpOwotCWttZW10cmFjZV9pbml0KCk7CiAJa21lbWxlYWtfaW5pdCgpOwogCWRlYnVnX29iamVjdHNfbWVtX2luaXQoKTsKIAlpZHJfaW5pdF9jYWNoZSgpOwpAQCAtNzI1LDM4ICs3MjMsMzMgQEAKIGNvcmVfcGFyYW0oaW5pdGNhbGxfZGVidWcsIGluaXRjYWxsX2RlYnVnLCBib29sLCAwNjQ0KTsKIAogc3RhdGljIGNoYXIgbXNnYnVmWzY0XTsKLXN0YXRpYyBzdHJ1Y3QgYm9vdF90cmFjZV9jYWxsIGNhbGw7Ci1zdGF0aWMgc3RydWN0IGJvb3RfdHJhY2VfcmV0IHJldDsKIAogaW50IGRvX29uZV9pbml0Y2FsbChpbml0Y2FsbF90IGZuKQogewogCWludCBjb3VudCA9IHByZWVtcHRfY291bnQoKTsKIAlrdGltZV90IGNhbGx0aW1lLCBkZWx0YSwgcmV0dGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZHVyYXRpb247CisJaW50IHJldDsKIAogCWlmIChpbml0Y2FsbF9kZWJ1ZykgewotCQljYWxsLmNhbGxlciA9IHRhc2tfcGlkX25yKGN1cnJlbnQpOwotCQlwcmludGsoImNhbGxpbmcgICVwRiBAICVpXG4iLCBmbiwgY2FsbC5jYWxsZXIpOworCQlwcmludGsoImNhbGxpbmcgICVwRiBAICVpXG4iLCBmbiwgdGFza19waWRfbnIoY3VycmVudCkpOwogCQljYWxsdGltZSA9IGt0aW1lX2dldCgpOwotCQl0cmFjZV9ib290X2NhbGwoJmNhbGwsIGZuKTsKLQkJZW5hYmxlX2Jvb3RfdHJhY2UoKTsKIAl9CiAKLQlyZXQucmVzdWx0ID0gZm4oKTsKKwlyZXQgPSBmbigpOwogCiAJaWYgKGluaXRjYWxsX2RlYnVnKSB7Ci0JCWRpc2FibGVfYm9vdF90cmFjZSgpOwogCQlyZXR0aW1lID0ga3RpbWVfZ2V0KCk7CiAJCWRlbHRhID0ga3RpbWVfc3ViKHJldHRpbWUsIGNhbGx0aW1lKTsKLQkJcmV0LmR1cmF0aW9uID0gKHVuc2lnbmVkIGxvbmcgbG9uZykga3RpbWVfdG9fbnMoZGVsdGEpID4+IDEwOwotCQl0cmFjZV9ib290X3JldCgmcmV0LCBmbik7Ci0JCXByaW50aygiaW5pdGNhbGwgJXBGIHJldHVybmVkICVkIGFmdGVyICVMZCB1c2Vjc1xuIiwgZm4sCi0JCQlyZXQucmVzdWx0LCByZXQuZHVyYXRpb24pOworCQlkdXJhdGlvbiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGt0aW1lX3RvX25zKGRlbHRhKSA+PiAxMDsKKwkJcHJpbnRrKCJpbml0Y2FsbCAlcEYgcmV0dXJuZWQgJWQgYWZ0ZXIgJWxsZCB1c2Vjc1xuIiwgZm4sCisJCQlyZXQsIGR1cmF0aW9uKTsKIAl9CiAKIAltc2didWZbMF0gPSAwOwogCi0JaWYgKHJldC5yZXN1bHQgJiYgcmV0LnJlc3VsdCAhPSAtRU5PREVWICYmIGluaXRjYWxsX2RlYnVnKQotCQlzcHJpbnRmKG1zZ2J1ZiwgImVycm9yIGNvZGUgJWQgIiwgcmV0LnJlc3VsdCk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RFViAmJiBpbml0Y2FsbF9kZWJ1ZykKKwkJc3ByaW50Zihtc2didWYsICJlcnJvciBjb2RlICVkICIsIHJldCk7CiAKIAlpZiAocHJlZW1wdF9jb3VudCgpICE9IGNvdW50KSB7CiAJCXN0cmxjYXQobXNnYnVmLCAicHJlZW1wdGlvbiBpbWJhbGFuY2UgIiwgc2l6ZW9mKG1zZ2J1ZikpOwpAQCAtNzcwLDcgKzc2Myw3IEBACiAJCXByaW50aygiaW5pdGNhbGwgJXBGIHJldHVybmVkIHdpdGggJXNcbiIsIGZuLCBtc2didWYpOwogCX0KIAotCXJldHVybiByZXQucmVzdWx0OworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtODk0LDcgKzg4Nyw2IEBACiAJc21wX3ByZXBhcmVfY3B1cyhzZXR1cF9tYXhfY3B1cyk7CiAKIAlkb19wcmVfc21wX2luaXRjYWxscygpOwotCXN0YXJ0X2Jvb3RfdHJhY2UoKTsKIAogCXNtcF9pbml0KCk7CiAJc2NoZWRfaW5pdF9zbXAoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCAwNTc0NzJmLi5jZTUzZmIyIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC03Niw4ICs3Niw4IEBACiBvYmotJChDT05GSUdfQVVESVRfVFJFRSkgKz0gYXVkaXRfdHJlZS5vCiBvYmotJChDT05GSUdfS1BST0JFUykgKz0ga3Byb2Jlcy5vCiBvYmotJChDT05GSUdfS0dEQikgKz0gZGVidWcvCi1vYmotJChDT05GSUdfREVURUNUX1NPRlRMT0NLVVApICs9IHNvZnRsb2NrdXAubwogb2JqLSQoQ09ORklHX0RFVEVDVF9IVU5HX1RBU0spICs9IGh1bmdfdGFzay5vCitvYmotJChDT05GSUdfTE9DS1VQX0RFVEVDVE9SKSArPSB3YXRjaGRvZy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19IQVJESVJRUykgKz0gaXJxLwogb2JqLSQoQ09ORklHX1NFQ0NPTVApICs9IHNlY2NvbXAubwogb2JqLSQoQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QpICs9IHJjdXRvcnR1cmUubwpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmMgYi9rZXJuZWwvYXVkaXQuYwppbmRleCBjNzFiZDI2Li44Mjk2YWE1IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuYworKysgYi9rZXJuZWwvYXVkaXQuYwpAQCAtNDA3LDcgKzQwNyw3IEBACiAJCWF1ZGl0X2hvbGRfc2tiKHNrYik7CiAJfSBlbHNlCiAJCS8qIGRyb3AgdGhlIGV4dHJhIHJlZmVyZW5jZSBpZiBzZW50IG9rICovCi0JCWtmcmVlX3NrYihza2IpOworCQljb25zdW1lX3NrYihza2IpOwogfQogCiBzdGF0aWMgaW50IGthdWRpdGRfdGhyZWFkKHZvaWQgKmR1bW15KQpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDNhYzZmNWIuLmQ4M2NhYjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTE2MjMsNiArMTYyMyw4IEBACiAJLmtpbGxfc2IgPSBjZ3JvdXBfa2lsbF9zYiwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqY2dyb3VwX2tvYmo7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNncm91cCAqX19kX2NncnAoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXJldHVybiBkZW50cnktPmRfZnNkYXRhOwpAQCAtMTc4OCw2ICsxNzkwLDI5IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorLyoqCisgKiBjZ3JvdXBfYXR0YWNoX3Rhc2tfY3VycmVudF9jZyAtIGF0dGFjaCB0YXNrICd0c2snIHRvIGN1cnJlbnQgdGFzaydzIGNncm91cAorICogQHRzazogdGhlIHRhc2sgdG8gYmUgYXR0YWNoZWQKKyAqLworaW50IGNncm91cF9hdHRhY2hfdGFza19jdXJyZW50X2NnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290OworCXN0cnVjdCBjZ3JvdXAgKmN1cl9jZzsKKwlpbnQgcmV0dmFsID0gMDsKKworCWNncm91cF9sb2NrKCk7CisJZm9yX2VhY2hfYWN0aXZlX3Jvb3Qocm9vdCkgeworCQljdXJfY2cgPSB0YXNrX2Nncm91cF9mcm9tX3Jvb3QoY3VycmVudCwgcm9vdCk7CisJCXJldHZhbCA9IGNncm91cF9hdHRhY2hfdGFzayhjdXJfY2csIHRzayk7CisJCWlmIChyZXR2YWwpCisJCQlicmVhazsKKwl9CisJY2dyb3VwX3VubG9jaygpOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNncm91cF9hdHRhY2hfdGFza19jdXJyZW50X2NnKTsKKwogLyoKICAqIEF0dGFjaCB0YXNrIHdpdGggcGlkICdwaWQnIHRvIGNncm91cCAnY2dycCcuIENhbGwgd2l0aCBjZ3JvdXBfbXV0ZXgKICAqIGhlbGQuIE1heSB0YWtlIHRhc2tfbG9jayBvZiB0YXNrCkBAIC0zODcxLDkgKzM4OTYsMTggQEAKIAloaGVhZCA9IGNzc19zZXRfaGFzaChpbml0X2Nzc19zZXQuc3Vic3lzKTsKIAlobGlzdF9hZGRfaGVhZCgmaW5pdF9jc3Nfc2V0LmhsaXN0LCBoaGVhZCk7CiAJQlVHX09OKCFpbml0X3Jvb3RfaWQoJnJvb3Rub2RlKSk7Ci0JZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmY2dyb3VwX2ZzX3R5cGUpOwotCWlmIChlcnIgPCAwKQorCisJY2dyb3VwX2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJjZ3JvdXAiLCBmc19rb2JqKTsKKwlpZiAoIWNncm91cF9rb2JqKSB7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmNncm91cF9mc190eXBlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrb2JqZWN0X3B1dChjZ3JvdXBfa29iaik7CisJCWdvdG8gb3V0OworCX0KIAogCXByb2NfY3JlYXRlKCJjZ3JvdXBzIiwgMCwgTlVMTCwgJnByb2NfY2dyb3Vwc3RhdHNfb3BlcmF0aW9ucyk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCA5N2QxYjQyLi5mNmU3MjZmIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0yMzUsMTEgKzIzNSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJY3B1X2hvdHBsdWdfYmVnaW4oKTsKLQlzZXRfY3B1X2FjdGl2ZShjcHUsIGZhbHNlKTsKIAllcnIgPSBfX2NwdV9ub3RpZnkoQ1BVX0RPV05fUFJFUEFSRSB8IG1vZCwgaGNwdSwgLTEsICZucl9jYWxscyk7CiAJaWYgKGVycikgewotCQlzZXRfY3B1X2FjdGl2ZShjcHUsIHRydWUpOwotCiAJCW5yX2NhbGxzLS07CiAJCV9fY3B1X25vdGlmeShDUFVfRE9XTl9GQUlMRUQgfCBtb2QsIGhjcHUsIG5yX2NhbGxzLCBOVUxMKTsKIAkJcHJpbnRrKCIlczogYXR0ZW1wdCB0byB0YWtlIGRvd24gQ1BVICV1IGZhaWxlZFxuIiwKQEAgLTI0OSw3ICsyNDYsNiBAQAogCiAJZXJyID0gX19zdG9wX21hY2hpbmUodGFrZV9jcHVfZG93biwgJnRjZF9wYXJhbSwgY3B1bWFza19vZihjcHUpKTsKIAlpZiAoZXJyKSB7Ci0JCXNldF9jcHVfYWN0aXZlKGNwdSwgdHJ1ZSk7CiAJCS8qIENQVSBkaWRuJ3QgZGllOiB0ZWxsIGV2ZXJ5b25lLiAgQ2FuJ3QgY29tcGxhaW4uICovCiAJCWNwdV9ub3RpZnlfbm9mYWlsKENQVV9ET1dOX0ZBSUxFRCB8IG1vZCwgaGNwdSk7CiAKQEAgLTMyMSw4ICszMTcsNiBAQAogCQlnb3RvIG91dF9ub3RpZnk7CiAJQlVHX09OKCFjcHVfb25saW5lKGNwdSkpOwogCi0Jc2V0X2NwdV9hY3RpdmUoY3B1LCB0cnVlKTsKLQogCS8qIE5vdyBjYWxsIG5vdGlmaWVyIGluIHByZXBhcmF0aW9uLiAqLwogCWNwdV9ub3RpZnkoQ1BVX09OTElORSB8IG1vZCwgaGNwdSk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCAwMmI5NjExLi5iMjNjMDk3IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkvKiBmb3IgY3VzdG9tIHNjaGVkIGRvbWFpbiAqLwogCWludCByZWxheF9kb21haW5fbGV2ZWw7CiAKLQkvKiB1c2VkIGZvciB3YWxraW5nIGEgY3B1c2V0IGhlaXJhcmNoeSAqLworCS8qIHVzZWQgZm9yIHdhbGtpbmcgYSBjcHVzZXQgaGllcmFyY2h5ICovCiAJc3RydWN0IGxpc3RfaGVhZCBzdGFja19saXN0OwogfTsKIApAQCAtMjExMywzMSArMjExMywxNyBAQAogICogYnV0IG1ha2luZyBubyBhY3RpdmUgdXNlIG9mIGNwdXNldHMuCiAgKgogICogVGhpcyByb3V0aW5lIGVuc3VyZXMgdGhhdCB0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCB0cmFja3MKLSAqIGNwdV9vbmxpbmVfbWFwIG9uIGVhY2ggQ1BVIGhvdHBsdWcgKGNwdWhwKSBldmVudC4KKyAqIGNwdV9hY3RpdmVfbWFzayBvbiBlYWNoIENQVSBob3RwbHVnIChjcHVocCkgZXZlbnQuCiAgKgogICogQ2FsbGVkIHdpdGhpbiBnZXRfb25saW5lX2NwdXMoKS4gIE5lZWRzIHRvIGNhbGwgY2dyb3VwX2xvY2soKQogICogYmVmb3JlIGNhbGxpbmcgZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygpLgogICovCi1zdGF0aWMgaW50IGNwdXNldF90cmFja19vbmxpbmVfY3B1cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZF9uYiwKLQkJCQl1bnNpZ25lZCBsb25nIHBoYXNlLCB2b2lkICp1bnVzZWRfY3B1KQordm9pZCBjcHVzZXRfdXBkYXRlX2FjdGl2ZV9jcHVzKHZvaWQpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyOwogCWNwdW1hc2tfdmFyX3QgKmRvbXM7CiAJaW50IG5kb21zOwogCi0Jc3dpdGNoIChwaGFzZSkgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQotCiAJY2dyb3VwX2xvY2soKTsKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CiAJY3B1bWFza19jb3B5KHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkLCBjcHVfYWN0aXZlX21hc2spOwpAQCAtMjE0OCw4ICsyMTM0LDYgQEAKIAogCS8qIEhhdmUgc2NoZWR1bGVyIHJlYnVpbGQgdGhlIGRvbWFpbnMgKi8KIAlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhuZG9tcywgZG9tcywgYXR0cik7Ci0KLQlyZXR1cm4gTk9USUZZX09LOwogfQogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCkBAIC0yMjAzLDcgKzIxODcsNiBAQAogCWNwdW1hc2tfY29weSh0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCwgY3B1X2FjdGl2ZV9tYXNrKTsKIAl0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOwogCi0JaG90Y3B1X25vdGlmaWVyKGNwdXNldF90cmFja19vbmxpbmVfY3B1cywgMCk7CiAJaG90cGx1Z19tZW1vcnlfbm90aWZpZXIoY3B1c2V0X3RyYWNrX29ubGluZV9ub2RlcywgMTApOwogCiAJY3B1c2V0X3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImNwdXNldCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NyZWQuYyBiL2tlcm5lbC9jcmVkLmMKaW5kZXggYTJkNTUwNC4uNjBiYzhiMSAxMDA2NDQKLS0tIGEva2VybmVsL2NyZWQuYworKysgYi9rZXJuZWwvY3JlZC5jCkBAIC0yMDksNiArMjA5LDMxIEBACiAJfQogfQogCisvKioKKyAqIGdldF90YXNrX2NyZWQgLSBHZXQgYW5vdGhlciB0YXNrJ3Mgb2JqZWN0aXZlIGNyZWRlbnRpYWxzCisgKiBAdGFzazogVGhlIHRhc2sgdG8gcXVlcnkKKyAqCisgKiBHZXQgdGhlIG9iamVjdGl2ZSBjcmVkZW50aWFscyBvZiBhIHRhc2ssIHBpbm5pbmcgdGhlbSBzbyB0aGF0IHRoZXkgY2FuJ3QgZ28KKyAqIGF3YXkuICBBY2Nlc3NpbmcgYSB0YXNrJ3MgY3JlZGVudGlhbHMgZGlyZWN0bHkgaXMgbm90IHBlcm1pdHRlZC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgYWxzbyBtYWtlIHN1cmUgdGFzayBkb2Vzbid0IGdldCBkZWxldGVkLCBlaXRoZXIgYnkgaG9sZGluZyBhCisgKiByZWYgb24gdGFzayBvciBieSBob2xkaW5nIHRhc2tsaXN0X2xvY2sgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHVubGlua2VkLgorICovCitjb25zdCBzdHJ1Y3QgY3JlZCAqZ2V0X3Rhc2tfY3JlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlkbyB7CisJCWNyZWQgPSBfX3Rhc2tfY3JlZCgodGFzaykpOworCQlCVUdfT04oIWNyZWQpOworCX0gd2hpbGUgKCFhdG9taWNfaW5jX25vdF96ZXJvKCYoKHN0cnVjdCBjcmVkICopY3JlZCktPnVzYWdlKSk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gY3JlZDsKK30KKwogLyoKICAqIEFsbG9jYXRlIGJsYW5rIGNyZWRlbnRpYWxzLCBzdWNoIHRoYXQgdGhlIGNyZWRlbnRpYWxzIGNhbiBiZSBmaWxsZWQgaW4gYXQgYQogICogbGF0ZXIgZGF0ZSB3aXRob3V0IHJpc2sgb2YgRU5PTUVNLgpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2RlYnVnX2NvcmUuYyBiL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMKaW5kZXggOGJjNWVlZi4uM2MyZDQ5NyAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2RlYnVnX2NvcmUuYworKysgYi9rZXJuZWwvZGVidWcvZGVidWdfY29yZS5jCkBAIC02LDcgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVkVSSVRBUyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4KICAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFRpbWVzeXMgQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEFtaXQgUy4gS2FsZSA8YW1pdGthbGVAbGluc3lzc29mdC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgVG9tIFJpbmkgPHRyaW5pQGtlcm5lbC5jcmFzaGluZy5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBMaW5TeXNTb2Z0IFRlY2hub2xvZ2llcyBQdnQuIEx0ZC4KICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgpAQCAtNjA1LDYgKzYwNSw4IEBACiAJCWlmIChkYmdfa2RiX21vZGUpIHsKIAkJCWtnZGJfY29ubmVjdGVkID0gMTsKIAkJCWVycm9yID0ga2RiX3N0dWIoa3MpOworCQkJaWYgKGVycm9yID09IC0xKQorCQkJCWNvbnRpbnVlOwogCQkJa2dkYl9jb25uZWN0ZWQgPSAwOwogCQl9IGVsc2UgewogCQkJZXJyb3IgPSBnZGJfc2VyaWFsX3N0dWIoa3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYyBiL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMKaW5kZXggZThmZDY4Ni4uNDgxYTdiZCAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYworKysgYi9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jCkBAIC02LDcgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVkVSSVRBUyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4KICAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFRpbWVzeXMgQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEFtaXQgUy4gS2FsZSA8YW1pdGthbGVAbGluc3lzc29mdC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgVG9tIFJpbmkgPHRyaW5pQGtlcm5lbC5jcmFzaGluZy5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBMaW5TeXNTb2Z0IFRlY2hub2xvZ2llcyBQdnQuIEx0ZC4KICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgpAQCAtNTIsMTcgKzUyLDYgQEAKICAqIEdEQiByZW1vdGUgcHJvdG9jb2wgcGFyc2VyOgogICovCiAKLXN0YXRpYyBpbnQgaGV4KGNoYXIgY2gpCi17Ci0JaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQotCQlyZXR1cm4gY2ggLSAnYScgKyAxMDsKLQlpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpCi0JCXJldHVybiBjaCAtICcwJzsKLQlpZiAoKGNoID49ICdBJykgJiYgKGNoIDw9ICdGJykpCi0JCXJldHVybiBjaCAtICdBJyArIDEwOwotCXJldHVybiAtMTsKLX0KLQogI2lmZGVmIENPTkZJR19LR0RCX0tEQgogc3RhdGljIGludCBnZGJzdHViX3JlYWRfd2FpdCh2b2lkKQogewpAQCAtMTIzLDggKzExMiw4IEBACiAJCWJ1ZmZlcltjb3VudF0gPSAwOwogCiAJCWlmIChjaCA9PSAnIycpIHsKLQkJCXhtaXRjc3VtID0gaGV4KGdkYnN0dWJfcmVhZF93YWl0KCkpIDw8IDQ7Ci0JCQl4bWl0Y3N1bSArPSBoZXgoZ2Ric3R1Yl9yZWFkX3dhaXQoKSk7CisJCQl4bWl0Y3N1bSA9IGhleF90b19iaW4oZ2Ric3R1Yl9yZWFkX3dhaXQoKSkgPDwgNDsKKwkJCXhtaXRjc3VtICs9IGhleF90b19iaW4oZ2Ric3R1Yl9yZWFkX3dhaXQoKSk7CiAKIAkJCWlmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkKIAkJCQkvKiBmYWlsZWQgY2hlY2tzdW0gKi8KQEAgLTIzNiw3ICsyMjUsNyBAQAogICogYnVmLiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGFzdCBjaGFyIHB1dCBpbiBidWYgKG51bGwpLiBNYXkKICAqIHJldHVybiBhbiBlcnJvci4KICAqLwotaW50IGtnZGJfbWVtMmhleChjaGFyICptZW0sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQorY2hhciAqa2dkYl9tZW0yaGV4KGNoYXIgKm1lbSwgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CiAJY2hhciAqdG1wOwogCWludCBlcnI7CkBAIC0yNDgsMTcgKzIzNywxNiBAQAogCXRtcCA9IGJ1ZiArIGNvdW50OwogCiAJZXJyID0gcHJvYmVfa2VybmVsX3JlYWQodG1wLCBtZW0sIGNvdW50KTsKLQlpZiAoIWVycikgewotCQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgKnRtcCk7Ci0JCQl0bXArKzsKLQkJCWNvdW50LS07Ci0JCX0KLQotCQkqYnVmID0gMDsKKwlpZiAoZXJyKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCAqdG1wKTsKKwkJdG1wKys7CisJCWNvdW50LS07CiAJfQorCSpidWYgPSAwOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gYnVmOwogfQogCiAvKgpAQCAtMjgwLDggKzI2OCw4IEBACiAJdG1wX2hleCA9IHRtcF9yYXcgLSAxOwogCXdoaWxlICh0bXBfaGV4ID49IGJ1ZikgewogCQl0bXBfcmF3LS07Ci0JCSp0bXBfcmF3ID0gaGV4KCp0bXBfaGV4LS0pOwotCQkqdG1wX3JhdyB8PSBoZXgoKnRtcF9oZXgtLSkgPDwgNDsKKwkJKnRtcF9yYXcgPSBoZXhfdG9fYmluKCp0bXBfaGV4LS0pOworCQkqdG1wX3JhdyB8PSBoZXhfdG9fYmluKCp0bXBfaGV4LS0pIDw8IDQ7CiAJfQogCiAJcmV0dXJuIHByb2JlX2tlcm5lbF93cml0ZShtZW0sIHRtcF9yYXcsIGNvdW50KTsKQEAgLTMwNCw3ICsyOTIsNyBAQAogCQkoKnB0cikrKzsKIAl9CiAJd2hpbGUgKCoqcHRyKSB7Ci0JCWhleF92YWwgPSBoZXgoKipwdHIpOworCQloZXhfdmFsID0gaGV4X3RvX2JpbigqKnB0cik7CiAJCWlmIChoZXhfdmFsIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0zMzksNiArMzI3LDMyIEBACiAJcmV0dXJuIHByb2JlX2tlcm5lbF93cml0ZShtZW0sIGMsIHNpemUpOwogfQogCisjaWYgREJHX01BWF9SRUdfTlVNID4gMAordm9pZCBwdF9yZWdzX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlpbnQgaWR4ID0gMDsKKwljaGFyICpwdHIgPSAoY2hhciAqKWdkYl9yZWdzOworCisJZm9yIChpID0gMDsgaSA8IERCR19NQVhfUkVHX05VTTsgaSsrKSB7CisJCWRiZ19nZXRfcmVnKGksIHB0ciArIGlkeCwgcmVncyk7CisJCWlkeCArPSBkYmdfcmVnX2RlZltpXS5zaXplOworCX0KK30KKwordm9pZCBnZGJfcmVnc190b19wdF9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlpbnQgaWR4ID0gMDsKKwljaGFyICpwdHIgPSAoY2hhciAqKWdkYl9yZWdzOworCisJZm9yIChpID0gMDsgaSA8IERCR19NQVhfUkVHX05VTTsgaSsrKSB7CisJCWRiZ19zZXRfcmVnKGksIHB0ciArIGlkeCwgcmVncyk7CisJCWlkeCArPSBkYmdfcmVnX2RlZltpXS5zaXplOworCX0KK30KKyNlbmRpZiAvKiBEQkdfTUFYX1JFR19OVU0gPiAwICovCisKIC8qIFdyaXRlIG1lbW9yeSBkdWUgdG8gYW4gJ00nIG9yICdYJyBwYWNrZXQuICovCiBzdGF0aWMgaW50IHdyaXRlX21lbV9tc2coaW50IGJpbmFyeSkKIHsKQEAgLTM3OCwyOCArMzkyLDMxIEBACiAgKiByZW1hcHBlZCB0byBuZWdhdGl2ZSBUSURzLgogICovCiAKLSNkZWZpbmUgQlVGX1RIUkVBRF9JRF9TSVpFCTE2CisjZGVmaW5lIEJVRl9USFJFQURfSURfU0laRQk4CiAKIHN0YXRpYyBjaGFyICpwYWNrX3RocmVhZGlkKGNoYXIgKnBrdCwgdW5zaWduZWQgY2hhciAqaWQpCiB7Ci0JY2hhciAqbGltaXQ7CisJdW5zaWduZWQgY2hhciAqbGltaXQ7CisJaW50IGx6ZXJvID0gMTsKIAotCWxpbWl0ID0gcGt0ICsgQlVGX1RIUkVBRF9JRF9TSVpFOwotCXdoaWxlIChwa3QgPCBsaW1pdCkKLQkJcGt0ID0gcGFja19oZXhfYnl0ZShwa3QsICppZCsrKTsKKwlsaW1pdCA9IGlkICsgKEJVRl9USFJFQURfSURfU0laRSAvIDIpOworCXdoaWxlIChpZCA8IGxpbWl0KSB7CisJCWlmICghbHplcm8gfHwgKmlkICE9IDApIHsKKwkJCXBrdCA9IHBhY2tfaGV4X2J5dGUocGt0LCAqaWQpOworCQkJbHplcm8gPSAwOworCQl9CisJCWlkKys7CisJfQorCisJaWYgKGx6ZXJvKQorCQlwa3QgPSBwYWNrX2hleF9ieXRlKHBrdCwgMCk7CiAKIAlyZXR1cm4gcGt0OwogfQogCiBzdGF0aWMgdm9pZCBpbnRfdG9fdGhyZWFkcmVmKHVuc2lnbmVkIGNoYXIgKmlkLCBpbnQgdmFsdWUpCiB7Ci0JdW5zaWduZWQgY2hhciAqc2NhbjsKLQlpbnQgaSA9IDQ7Ci0KLQlzY2FuID0gKHVuc2lnbmVkIGNoYXIgKilpZDsKLQl3aGlsZSAoaS0tKQotCQkqc2NhbisrID0gMDsKLQlwdXRfdW5hbGlnbmVkX2JlMzIodmFsdWUsIHNjYW4pOworCXB1dF91bmFsaWduZWRfYmUzMih2YWx1ZSwgaWQpOwogfQogCiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpnZXR0aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0aWQpCkBAIC00NjMsOCArNDgwLDcgQEAKIAlwYWNrX2hleF9ieXRlKCZyZW1jb21fb3V0X2J1ZmZlclsxXSwga3MtPnNpZ25vKTsKIH0KIAotLyogSGFuZGxlIHRoZSAnZycgZ2V0IHJlZ2lzdGVycyByZXF1ZXN0ICovCi1zdGF0aWMgdm9pZCBnZGJfY21kX2dldHJlZ3Moc3RydWN0IGtnZGJfc3RhdGUgKmtzKQorc3RhdGljIHZvaWQgZ2RiX2dldF9yZWdzX2hlbHBlcihzdHJ1Y3Qga2dkYl9zdGF0ZSAqa3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CiAJdm9pZCAqbG9jYWxfZGVidWdnZXJpbmZvOwpAQCAtNTA1LDYgKzUyMSwxMiBAQAogCQkgKi8KIAkJc2xlZXBpbmdfdGhyZWFkX3RvX2dkYl9yZWdzKGdkYl9yZWdzLCB0aHJlYWQpOwogCX0KK30KKworLyogSGFuZGxlIHRoZSAnZycgZ2V0IHJlZ2lzdGVycyByZXF1ZXN0ICovCitzdGF0aWMgdm9pZCBnZGJfY21kX2dldHJlZ3Moc3RydWN0IGtnZGJfc3RhdGUgKmtzKQoreworCWdkYl9nZXRfcmVnc19oZWxwZXIoa3MpOwogCWtnZGJfbWVtMmhleCgoY2hhciAqKWdkYl9yZWdzLCByZW1jb21fb3V0X2J1ZmZlciwgTlVNUkVHQllURVMpOwogfQogCkBAIC01MjcsMTMgKzU0OSwxMyBAQAogCWNoYXIgKnB0ciA9ICZyZW1jb21faW5fYnVmZmVyWzFdOwogCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlpbnQgZXJyOworCWNoYXIgKmVycjsKIAogCWlmIChrZ2RiX2hleDJsb25nKCZwdHIsICZhZGRyKSA+IDAgJiYgKnB0cisrID09ICcsJyAmJgogCQkJCQlrZ2RiX2hleDJsb25nKCZwdHIsICZsZW5ndGgpID4gMCkgewogCQllcnIgPSBrZ2RiX21lbTJoZXgoKGNoYXIgKilhZGRyLCByZW1jb21fb3V0X2J1ZmZlciwgbGVuZ3RoKTsKLQkJaWYgKGVycikKLQkJCWVycm9yX3BhY2tldChyZW1jb21fb3V0X2J1ZmZlciwgZXJyKTsKKwkJaWYgKCFlcnIpCisJCQllcnJvcl9wYWNrZXQocmVtY29tX291dF9idWZmZXIsIC1FSU5WQUwpOwogCX0gZWxzZSB7CiAJCWVycm9yX3BhY2tldChyZW1jb21fb3V0X2J1ZmZlciwgLUVJTlZBTCk7CiAJfQpAQCAtNTUwLDYgKzU3Miw2MCBAQAogCQlzdHJjcHkocmVtY29tX291dF9idWZmZXIsICJPSyIpOwogfQogCisjaWYgREJHX01BWF9SRUdfTlVNID4gMAorc3RhdGljIGNoYXIgKmdkYl9oZXhfcmVnX2hlbHBlcihpbnQgcmVnbnVtLCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJaW50IG9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVnbnVtOyBpKyspCisJCW9mZnNldCArPSBkYmdfcmVnX2RlZltpXS5zaXplOworCXJldHVybiBrZ2RiX21lbTJoZXgoKGNoYXIgKilnZGJfcmVncyArIG9mZnNldCwgb3V0LAorCQkJICAgIGRiZ19yZWdfZGVmW2ldLnNpemUpOworfQorCisvKiBIYW5kbGUgdGhlICdwJyBpbmRpdmlkdWFsIHJlZ3N0ZXIgZ2V0ICovCitzdGF0aWMgdm9pZCBnZGJfY21kX3JlZ19nZXQoc3RydWN0IGtnZGJfc3RhdGUgKmtzKQoreworCXVuc2lnbmVkIGxvbmcgcmVnbnVtOworCWNoYXIgKnB0ciA9ICZyZW1jb21faW5fYnVmZmVyWzFdOworCisJa2dkYl9oZXgybG9uZygmcHRyLCAmcmVnbnVtKTsKKwlpZiAocmVnbnVtID49IERCR19NQVhfUkVHX05VTSkgeworCQllcnJvcl9wYWNrZXQocmVtY29tX291dF9idWZmZXIsIC1FSU5WQUwpOworCQlyZXR1cm47CisJfQorCWdkYl9nZXRfcmVnc19oZWxwZXIoa3MpOworCWdkYl9oZXhfcmVnX2hlbHBlcihyZWdudW0sIHJlbWNvbV9vdXRfYnVmZmVyKTsKK30KKworLyogSGFuZGxlIHRoZSAnUCcgaW5kaXZpZHVhbCByZWdzdGVyIHNldCAqLworc3RhdGljIHZvaWQgZ2RiX2NtZF9yZWdfc2V0KHN0cnVjdCBrZ2RiX3N0YXRlICprcykKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ251bTsKKwljaGFyICpwdHIgPSAmcmVtY29tX2luX2J1ZmZlclsxXTsKKwlpbnQgaSA9IDA7CisKKwlrZ2RiX2hleDJsb25nKCZwdHIsICZyZWdudW0pOworCWlmICgqcHRyKysgIT0gJz0nIHx8CisJICAgICEoIWtnZGJfdXNldGhyZWFkIHx8IGtnZGJfdXNldGhyZWFkID09IGN1cnJlbnQpIHx8CisJICAgICFkYmdfZ2V0X3JlZyhyZWdudW0sIGdkYl9yZWdzLCBrcy0+bGludXhfcmVncykpIHsKKwkJZXJyb3JfcGFja2V0KHJlbWNvbV9vdXRfYnVmZmVyLCAtRUlOVkFMKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoZ2RiX3JlZ3MsIDAsIHNpemVvZihnZGJfcmVncykpOworCXdoaWxlIChpIDwgc2l6ZW9mKGdkYl9yZWdzKSAqIDIpCisJCWlmIChoZXhfdG9fYmluKHB0cltpXSkgPj0gMCkKKwkJCWkrKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJaSA9IGkgLyAyOworCWtnZGJfaGV4Mm1lbShwdHIsIChjaGFyICopZ2RiX3JlZ3MsIGkpOworCWRiZ19zZXRfcmVnKHJlZ251bSwgZ2RiX3JlZ3MsIGtzLT5saW51eF9yZWdzKTsKKwlzdHJjcHkocmVtY29tX291dF9idWZmZXIsICJPSyIpOworfQorI2VuZGlmIC8qIERCR19NQVhfUkVHX05VTSA+IDAgKi8KKwogLyogSGFuZGxlIHRoZSAnWCcgbWVtb3J5IGJpbmFyeSB3cml0ZSBieXRlcyAqLwogc3RhdGljIHZvaWQgZ2RiX2NtZF9iaW53cml0ZShzdHJ1Y3Qga2dkYl9zdGF0ZSAqa3MpCiB7CkBAIC02MTIsNyArNjg4LDcgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmc7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCXVuc2lnbmVkIGNoYXIgdGhyZWZbOF07CisJdW5zaWduZWQgY2hhciB0aHJlZltCVUZfVEhSRUFEX0lEX1NJWkVdOwogCWNoYXIgKnB0cjsKIAlpbnQgaTsKIAlpbnQgY3B1OwpAQCAtNjMyLDggKzcwOCw3IEBACiAJCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQkJCWtzLT50aHJfcXVlcnkgPSAwOwogCQkJCWludF90b190aHJlYWRyZWYodGhyZWYsIC1jcHUgLSAyKTsKLQkJCQlwYWNrX3RocmVhZGlkKHB0ciwgdGhyZWYpOwotCQkJCXB0ciArPSBCVUZfVEhSRUFEX0lEX1NJWkU7CisJCQkJcHRyID0gcGFja190aHJlYWRpZChwdHIsIHRocmVmKTsKIAkJCQkqKHB0cisrKSA9ICcsJzsKIAkJCQlpKys7CiAJCQl9CkBAIC02NDIsOCArNzE3LDcgQEAKIAkJZG9fZWFjaF90aHJlYWQoZywgcCkgewogCQkJaWYgKGkgPj0ga3MtPnRocl9xdWVyeSAmJiAhZmluaXNoZWQpIHsKIAkJCQlpbnRfdG9fdGhyZWFkcmVmKHRocmVmLCBwLT5waWQpOwotCQkJCXBhY2tfdGhyZWFkaWQocHRyLCB0aHJlZik7Ci0JCQkJcHRyICs9IEJVRl9USFJFQURfSURfU0laRTsKKwkJCQlwdHIgPSBwYWNrX3RocmVhZGlkKHB0ciwgdGhyZWYpOwogCQkJCSoocHRyKyspID0gJywnOwogCQkJCWtzLT50aHJfcXVlcnkrKzsKIAkJCQlpZiAoa3MtPnRocl9xdWVyeSAlIEtHREJfTUFYX1RIUkVBRF9RVUVSWSA9PSAwKQpAQCAtODU4LDExICs5MzIsMTQgQEAKIAlpbnQgZXJyb3IgPSAwOwogCWludCB0bXA7CiAKLQkvKiBDbGVhciB0aGUgb3V0IGJ1ZmZlci4gKi8KKwkvKiBJbml0aWFsaXplIGNvbW0gYnVmZmVyIGFuZCBnbG9iYWxzLiAqLwogCW1lbXNldChyZW1jb21fb3V0X2J1ZmZlciwgMCwgc2l6ZW9mKHJlbWNvbV9vdXRfYnVmZmVyKSk7CisJa2dkYl91c2V0aHJlYWQgPSBrZ2RiX2luZm9ba3MtPmNwdV0udGFzazsKKwlrcy0+a2dkYl91c2V0aHJlYWRpZCA9IHNoYWRvd19waWQoa2dkYl9pbmZvW2tzLT5jcHVdLnRhc2stPnBpZCk7CisJa3MtPnBhc3NfZXhjZXB0aW9uID0gMDsKIAogCWlmIChrZ2RiX2Nvbm5lY3RlZCkgewotCQl1bnNpZ25lZCBjaGFyIHRocmVmWzhdOworCQl1bnNpZ25lZCBjaGFyIHRocmVmW0JVRl9USFJFQURfSURfU0laRV07CiAJCWNoYXIgKnB0cjsKIAogCQkvKiBSZXBseSB0byBob3N0IHRoYXQgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAqLwpAQCAtODc2LDEwICs5NTMsNiBAQAogCQlwdXRfcGFja2V0KHJlbWNvbV9vdXRfYnVmZmVyKTsKIAl9CiAKLQlrZ2RiX3VzZXRocmVhZCA9IGtnZGJfaW5mb1trcy0+Y3B1XS50YXNrOwotCWtzLT5rZ2RiX3VzZXRocmVhZGlkID0gc2hhZG93X3BpZChrZ2RiX2luZm9ba3MtPmNwdV0udGFzay0+cGlkKTsKLQlrcy0+cGFzc19leGNlcHRpb24gPSAwOwotCiAJd2hpbGUgKDEpIHsKIAkJZXJyb3IgPSAwOwogCkBAIC05MDQsNiArOTc3LDE0IEBACiAJCWNhc2UgJ00nOiAvKiBNQUEuLkFBLExMTEw6IFdyaXRlIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS4uQUEgKi8KIAkJCWdkYl9jbWRfbWVtd3JpdGUoa3MpOwogCQkJYnJlYWs7CisjaWYgREJHX01BWF9SRUdfTlVNID4gMAorCQljYXNlICdwJzogLyogcFhYIFJldHVybiBnZGIgcmVnaXN0ZXIgWFggKGluIGhleCkgKi8KKwkJCWdkYl9jbWRfcmVnX2dldChrcyk7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6IC8qIFBYWD1hYWFhIFNldCBnZGIgcmVnaXN0ZXIgWFggdG8gYWFhYSAoaW4gaGV4KSAqLworCQkJZ2RiX2NtZF9yZWdfc2V0KGtzKTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIERCR19NQVhfUkVHX05VTSA+IDAgKi8KIAkJY2FzZSAnWCc6IC8qIFhBQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAqLwogCQkJZ2RiX2NtZF9iaW53cml0ZShrcyk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYwppbmRleCBhN2I5ZjhkLi4yOGI4NDQxIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9tYWluLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfbWFpbi5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAogCWlmIChlbmRwID09IGFyZykgewogCQkvKgotCQkgKiBUcnkgYmFzZSAxNiwgZm9yIHVzIGZvbGtzIHRvbyBsYXp5IHRvIHR5cGUgdGhlCisJCSAqIEFsc28gdHJ5IGJhc2UgMTYsIGZvciB1cyBmb2xrcyB0b28gbGF6eSB0byB0eXBlIHRoZQogCQkgKiBsZWFkaW5nIDB4Li4uCiAJCSAqLwogCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmcsICZlbmRwLCAxNik7CkBAIC0zMjUsNiArMzI1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBrZGJnZXR1NjRhcmcoY29uc3QgY2hhciAqYXJnLCB1NjQgKnZhbHVlKQoreworCWNoYXIgKmVuZHA7CisJdTY0IHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsbChhcmcsICZlbmRwLCAwKTsKKworCWlmIChlbmRwID09IGFyZykgeworCisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsbChhcmcsICZlbmRwLCAxNik7CisJCWlmIChlbmRwID09IGFyZykKKwkJCXJldHVybiBLREJfQkFESU5UOworCX0KKworCSp2YWx1ZSA9IHZhbDsKKworCXJldHVybiAwOworfQorCiAvKgogICoga2RiX3NldCAtIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgJ3NldCcgY29tbWFuZC4gIEFsdGVyIGFuCiAgKglleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBjcmVhdGUgYSBuZXcgb25lLgpAQCAtMTc3MCwxMSArMTc4OSw2NSBAQAogICovCiBzdGF0aWMgaW50IGtkYl9yZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCiB7Ci0JaW50IGRpYWcgPSBrZGJfY2hlY2tfcmVncygpOwotCWlmIChkaWFnKQotCQlyZXR1cm4gZGlhZzsKKwlpbnQgbGVuID0ga2RiX2NoZWNrX3JlZ3MoKTsKKyNpZiBEQkdfTUFYX1JFR19OVU0gPiAwCisJaW50IGk7CisJY2hhciAqcm5hbWU7CisJaW50IHJzaXplOworCXU2NCByZWc2NDsKKwl1MzIgcmVnMzI7CisJdTE2IHJlZzE2OworCXU4IHJlZzg7CisKKwlpZiAobGVuKQorCQlyZXR1cm4gbGVuOworCisJZm9yIChpID0gMDsgaSA8IERCR19NQVhfUkVHX05VTTsgaSsrKSB7CisJCXJzaXplID0gZGJnX3JlZ19kZWZbaV0uc2l6ZSAqIDI7CisJCWlmIChyc2l6ZSA+IDE2KQorCQkJcnNpemUgPSAyOworCQlpZiAobGVuICsgc3RybGVuKGRiZ19yZWdfZGVmW2ldLm5hbWUpICsgNCArIHJzaXplID4gODApIHsKKwkJCWxlbiA9IDA7CisJCQlrZGJfcHJpbnRmKCJcbiIpOworCQl9CisJCWlmIChsZW4pCisJCQlsZW4gKz0ga2RiX3ByaW50ZigiICAiKTsKKwkJc3dpdGNoKGRiZ19yZWdfZGVmW2ldLnNpemUgKiA4KSB7CisJCWNhc2UgODoKKwkJCXJuYW1lID0gZGJnX2dldF9yZWcoaSwgJnJlZzgsIGtkYl9jdXJyZW50X3JlZ3MpOworCQkJaWYgKCFybmFtZSkKKwkJCQlicmVhazsKKwkJCWxlbiArPSBrZGJfcHJpbnRmKCIlczogJTAyeCIsIHJuYW1lLCByZWc4KTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJcm5hbWUgPSBkYmdfZ2V0X3JlZyhpLCAmcmVnMTYsIGtkYl9jdXJyZW50X3JlZ3MpOworCQkJaWYgKCFybmFtZSkKKwkJCQlicmVhazsKKwkJCWxlbiArPSBrZGJfcHJpbnRmKCIlczogJTA0eCIsIHJuYW1lLCByZWcxNik7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXJuYW1lID0gZGJnX2dldF9yZWcoaSwgJnJlZzMyLCBrZGJfY3VycmVudF9yZWdzKTsKKwkJCWlmICghcm5hbWUpCisJCQkJYnJlYWs7CisJCQlsZW4gKz0ga2RiX3ByaW50ZigiJXM6ICUwOHgiLCBybmFtZSwgcmVnMzIpOworCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCQlybmFtZSA9IGRiZ19nZXRfcmVnKGksICZyZWc2NCwga2RiX2N1cnJlbnRfcmVncyk7CisJCQlpZiAoIXJuYW1lKQorCQkJCWJyZWFrOworCQkJbGVuICs9IGtkYl9wcmludGYoIiVzOiAlMDE2bGx4Iiwgcm5hbWUsIHJlZzY0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbGVuICs9IGtkYl9wcmludGYoIiVzOiA/PyIsIGRiZ19yZWdfZGVmW2ldLm5hbWUpOworCQl9CisJfQorCWtkYl9wcmludGYoIlxuIik7CisjZWxzZQorCWlmIChsZW4pCisJCXJldHVybiBsZW47CiAKIAlrZGJfZHVtcHJlZ3Moa2RiX2N1cnJlbnRfcmVncyk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc4MiwzMiArMTg1NSw2NyBAQAogICoga2RiX3JtIC0gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSAncm0nIChyZWdpc3RlciBtb2RpZnkpICBjb21tYW5kLgogICoJcm0gcmVnaXN0ZXItbmFtZSBuZXctY29udGVudHMKICAqIFJlbWFya3M6Ci0gKglDdXJyZW50bHkgZG9lc24ndCBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29udHJvbCBvcgotICoJZGVidWcgcmVnaXN0ZXJzLgorICoJQWxsb3dzIHJlZ2lzdGVyIG1vZGlmaWNhdGlvbiB3aXRoIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBhcyBnZGIKICAqLwogc3RhdGljIGludCBrZGJfcm0oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogeworI2lmIERCR19NQVhfUkVHX05VTSA+IDAKIAlpbnQgZGlhZzsKLQlpbnQgaW5kID0gMDsKLQl1bnNpZ25lZCBsb25nIGNvbnRlbnRzOworCWNvbnN0IGNoYXIgKnJuYW1lOworCWludCBpOworCXU2NCByZWc2NDsKKwl1MzIgcmVnMzI7CisJdTE2IHJlZzE2OworCXU4IHJlZzg7CiAKIAlpZiAoYXJnYyAhPSAyKQogCQlyZXR1cm4gS0RCX0FSR0NPVU5UOwogCS8qCiAJICogQWxsb3cgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBsZWFkaW5nICclJyBzeW1ib2wuCiAJICovCi0JaWYgKGFyZ3ZbMV1bMF0gPT0gJyUnKQotCQlpbmQgPSAxOworCXJuYW1lID0gYXJndlsxXTsKKwlpZiAoKnJuYW1lID09ICclJykKKwkJcm5hbWUrKzsKIAotCWRpYWcgPSBrZGJnZXR1bGFyZyhhcmd2WzJdLCAmY29udGVudHMpOworCWRpYWcgPSBrZGJnZXR1NjRhcmcoYXJndlsyXSwgJnJlZzY0KTsKIAlpZiAoZGlhZykKIAkJcmV0dXJuIGRpYWc7CiAKIAlkaWFnID0ga2RiX2NoZWNrX3JlZ3MoKTsKIAlpZiAoZGlhZykKIAkJcmV0dXJuIGRpYWc7CisKKwlkaWFnID0gS0RCX0JBRFJFRzsKKwlmb3IgKGkgPSAwOyBpIDwgREJHX01BWF9SRUdfTlVNOyBpKyspIHsKKwkJaWYgKHN0cmNtcChybmFtZSwgZGJnX3JlZ19kZWZbaV0ubmFtZSkgPT0gMCkgeworCQkJZGlhZyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWRpYWcpIHsKKwkJc3dpdGNoKGRiZ19yZWdfZGVmW2ldLnNpemUgKiA4KSB7CisJCWNhc2UgODoKKwkJCXJlZzggPSByZWc2NDsKKwkJCWRiZ19zZXRfcmVnKGksICZyZWc4LCBrZGJfY3VycmVudF9yZWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJcmVnMTYgPSByZWc2NDsKKwkJCWRiZ19zZXRfcmVnKGksICZyZWcxNiwga2RiX2N1cnJlbnRfcmVncyk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXJlZzMyID0gcmVnNjQ7CisJCQlkYmdfc2V0X3JlZyhpLCAmcmVnMzIsIGtkYl9jdXJyZW50X3JlZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCQlkYmdfc2V0X3JlZyhpLCAmcmVnNjQsIGtkYl9jdXJyZW50X3JlZ3MpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGRpYWc7CisjZWxzZQogCWtkYl9wcmludGYoIkVSUk9SOiBSZWdpc3RlciBzZXQgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfcHJpdmF0ZS5oIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfcHJpdmF0ZS5oCmluZGV4IDk3ZDNiYTYuLmM0MzhmNTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3ByaXZhdGUuaAorKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9wcml2YXRlLmgKQEAgLTE0NCw5ICsxNDQsNyBAQAogZXh0ZXJuIGludCBrZGJfcHV0d29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOwogCiBleHRlcm4gaW50IGtkYmdldHVsYXJnKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKLWV4dGVybiBpbnQga2RiX3NldChpbnQsIGNvbnN0IGNoYXIgKiopOwogZXh0ZXJuIGNoYXIgKmtkYmdldGVudihjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBrZGJnZXRpbnRlbnYoY29uc3QgY2hhciAqLCBpbnQgKik7CiBleHRlcm4gaW50IGtkYmdldGFkZHJhcmcoaW50LCBjb25zdCBjaGFyICoqLCBpbnQqLCB1bnNpZ25lZCBsb25nICosCiAJCQkgbG9uZyAqLCBjaGFyICoqKTsKIGV4dGVybiBpbnQga2RiZ2V0c3ltdmFsKGNvbnN0IGNoYXIgKiwga2RiX3N5bXRhYl90ICopOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggYjZjY2UxNC4uYTgyYTY1YyAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC05MDcsNyArOTA3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG5ld19mbGFncyA9IHAtPmZsYWdzOwogCi0JbmV3X2ZsYWdzICY9IH5QRl9TVVBFUlBSSVY7CisJbmV3X2ZsYWdzICY9IH4oUEZfU1VQRVJQUklWIHwgUEZfV1FfV09SS0VSKTsKIAluZXdfZmxhZ3MgfD0gUEZfRk9SS05PRVhFQzsKIAluZXdfZmxhZ3MgfD0gUEZfU1RBUlRJTkc7CiAJcC0+ZmxhZ3MgPSBuZXdfZmxhZ3M7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCA4MDlmNDhjLi5jZTY2OTE3IDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTE0NCwxMiArMTQ0LDggQEAKIHN0YXRpYyBpbnQgaHJ0aW1lcl9nZXRfdGFyZ2V0KGludCB0aGlzX2NwdSwgaW50IHBpbm5lZCkKIHsKICNpZmRlZiBDT05GSUdfTk9fSFoKLQlpZiAoIXBpbm5lZCAmJiBnZXRfc3lzY3RsX3RpbWVyX21pZ3JhdGlvbigpICYmIGlkbGVfY3B1KHRoaXNfY3B1KSkgewotCQlpbnQgcHJlZmVycmVkX2NwdSA9IGdldF9ub2h6X2xvYWRfYmFsYW5jZXIoKTsKLQotCQlpZiAocHJlZmVycmVkX2NwdSA+PSAwKQotCQkJcmV0dXJuIHByZWZlcnJlZF9jcHU7Ci0JfQorCWlmICghcGlubmVkICYmIGdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgJiYgaWRsZV9jcHUodGhpc19jcHUpKQorCQlyZXR1cm4gZ2V0X25vaHpfdGltZXJfdGFyZ2V0KCk7CiAjZW5kaWYKIAlyZXR1cm4gdGhpc19jcHU7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIva2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCA3YTU2YjIyLi5kNzFhOTg3IDEwMDY0NAotLS0gYS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2tlcm5lbC9od19icmVha3BvaW50LmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCkBAIC02Miw2ICs2Myw5IEBACiAKIHN0YXRpYyBpbnQgbnJfc2xvdHNbVFlQRV9NQVhdOwogCisvKiBLZWVwIHRyYWNrIG9mIHRoZSBicmVha3BvaW50cyBhdHRhY2hlZCB0byB0YXNrcyAqLworc3RhdGljIExJU1RfSEVBRChicF90YXNrX2hlYWQpOworCiBzdGF0aWMgaW50IGNvbnN0cmFpbnRzX2luaXRpYWxpemVkOwogCiAvKiBHYXRoZXIgdGhlIG51bWJlciBvZiB0b3RhbCBwaW5uZWQgYW5kIHVuLXBpbm5lZCBicCBpbiBhIGNwdXNldCAqLwpAQCAtMTAzLDMzICsxMDcsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0YXNrX2JwX3Bpbm5lZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZW51bSBicF90eXBlX2lkeCB0eXBlKQorLyoKKyAqIENvdW50IHRoZSBudW1iZXIgb2YgYnJlYWtwb2ludHMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgc2FtZSB0YXNrLgorICogVGhlIGdpdmVuIGV2ZW50IG11c3QgYmUgbm90IG9uIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW50IHRhc2tfYnBfcGlubmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgZW51bSBicF90eXBlX2lkeCB0eXBlKQogewotCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IHRzay0+cGVyZl9ldmVudF9jdHhwOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKmJwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gYnAtPmN0eDsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqaXRlcjsKIAlpbnQgY291bnQgPSAwOwogCi0JaWYgKFdBUk5fT05DRSghY3R4LCAiTm8gcGVyZiBjb250ZXh0IGZvciB0aGlzIHRhc2siKSkKLQkJcmV0dXJuIDA7Ci0KLQlsaXN0ID0gJmN0eC0+ZXZlbnRfbGlzdDsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFRoZSBjdXJyZW50IGJyZWFrcG9pbnQgY291bnRlciBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QKLQkgKiBhdCB0aGUgb3BlbigpIGNhbGxiYWNrIHRpbWUKLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJwLCBsaXN0LCBldmVudF9lbnRyeSkgewotCQlpZiAoYnAtPmF0dHIudHlwZSA9PSBQRVJGX1RZUEVfQlJFQUtQT0lOVCkKLQkJCWlmIChmaW5kX3Nsb3RfaWR4KGJwKSA9PSB0eXBlKQotCQkJCWNvdW50ICs9IGh3X2JyZWFrcG9pbnRfd2VpZ2h0KGJwKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZicF90YXNrX2hlYWQsIGh3LmJwX2xpc3QpIHsKKwkJaWYgKGl0ZXItPmN0eCA9PSBjdHggJiYgZmluZF9zbG90X2lkeChpdGVyKSA9PSB0eXBlKQorCQkJY291bnQgKz0gaHdfYnJlYWtwb2ludF93ZWlnaHQoaXRlcik7CiAJfQogCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOwotCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xNDksNyArMTQxLDcgQEAKIAkJaWYgKCF0c2spCiAJCQlzbG90cy0+cGlubmVkICs9IG1heF90YXNrX2JwX3Bpbm5lZChjcHUsIHR5cGUpOwogCQllbHNlCi0JCQlzbG90cy0+cGlubmVkICs9IHRhc2tfYnBfcGlubmVkKHRzaywgdHlwZSk7CisJCQlzbG90cy0+cGlubmVkICs9IHRhc2tfYnBfcGlubmVkKGJwLCB0eXBlKTsKIAkJc2xvdHMtPmZsZXhpYmxlID0gcGVyX2NwdShucl9icF9mbGV4aWJsZVt0eXBlXSwgY3B1KTsKIAogCQlyZXR1cm47CkBAIC0xNjIsNyArMTU0LDcgQEAKIAkJaWYgKCF0c2spCiAJCQluciArPSBtYXhfdGFza19icF9waW5uZWQoY3B1LCB0eXBlKTsKIAkJZWxzZQotCQkJbnIgKz0gdGFza19icF9waW5uZWQodHNrLCB0eXBlKTsKKwkJCW5yICs9IHRhc2tfYnBfcGlubmVkKGJwLCB0eXBlKTsKIAogCQlpZiAobnIgPiBzbG90cy0+cGlubmVkKQogCQkJc2xvdHMtPnBpbm5lZCA9IG5yOwpAQCAtMTg4LDcgKzE4MCw3IEBACiAvKgogICogQWRkIGEgcGlubmVkIGJyZWFrcG9pbnQgZm9yIHRoZSBnaXZlbiB0YXNrIGluIG91ciBjb25zdHJhaW50IHRhYmxlCiAgKi8KLXN0YXRpYyB2b2lkIHRvZ2dsZV9icF90YXNrX3Nsb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjcHUsIGJvb2wgZW5hYmxlLAorc3RhdGljIHZvaWQgdG9nZ2xlX2JwX3Rhc2tfc2xvdChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIGludCBjcHUsIGJvb2wgZW5hYmxlLAogCQkJCWVudW0gYnBfdHlwZV9pZHggdHlwZSwgaW50IHdlaWdodCkKIHsKIAl1bnNpZ25lZCBpbnQgKnRza19waW5uZWQ7CkBAIC0xOTYsMTAgKzE4OCwxMSBAQAogCWludCBvbGRfaWR4ID0gMDsKIAlpbnQgaWR4ID0gMDsKIAotCW9sZF9jb3VudCA9IHRhc2tfYnBfcGlubmVkKHRzaywgdHlwZSk7CisJb2xkX2NvdW50ID0gdGFza19icF9waW5uZWQoYnAsIHR5cGUpOwogCW9sZF9pZHggPSBvbGRfY291bnQgLSAxOwogCWlkeCA9IG9sZF9pZHggKyB3ZWlnaHQ7CiAKKwkvKiB0c2tfcGlubmVkW25dIGlzIHRoZSBudW1iZXIgb2YgdGFza3MgaGF2aW5nIG4gYnJlYWtwb2ludHMgKi8KIAl0c2tfcGlubmVkID0gcGVyX2NwdShucl90YXNrX2JwX3Bpbm5lZFt0eXBlXSwgY3B1KTsKIAlpZiAoZW5hYmxlKSB7CiAJCXRza19waW5uZWRbaWR4XSsrOwpAQCAtMjIyLDIzICsyMTUsNDEgQEAKIAlpbnQgY3B1ID0gYnAtPmNwdTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGJwLT5jdHgtPnRhc2s7CiAKLQkvKiBQaW5uZWQgY291bnRlciB0YXNrIHByb2ZpbGluZyAqLwotCWlmICh0c2spIHsKLQkJaWYgKGNwdSA+PSAwKSB7Ci0JCQl0b2dnbGVfYnBfdGFza19zbG90KHRzaywgY3B1LCBlbmFibGUsIHR5cGUsIHdlaWdodCk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkvKiBQaW5uZWQgY291bnRlciBjcHUgcHJvZmlsaW5nICovCisJaWYgKCF0c2spIHsKIAotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJCXRvZ2dsZV9icF90YXNrX3Nsb3QodHNrLCBjcHUsIGVuYWJsZSwgdHlwZSwgd2VpZ2h0KTsKKwkJaWYgKGVuYWJsZSkKKwkJCXBlcl9jcHUobnJfY3B1X2JwX3Bpbm5lZFt0eXBlXSwgYnAtPmNwdSkgKz0gd2VpZ2h0OworCQllbHNlCisJCQlwZXJfY3B1KG5yX2NwdV9icF9waW5uZWRbdHlwZV0sIGJwLT5jcHUpIC09IHdlaWdodDsKIAkJcmV0dXJuOwogCX0KIAotCS8qIFBpbm5lZCBjb3VudGVyIGNwdSBwcm9maWxpbmcgKi8KKwkvKiBQaW5uZWQgY291bnRlciB0YXNrIHByb2ZpbGluZyAqLworCisJaWYgKCFlbmFibGUpCisJCWxpc3RfZGVsKCZicC0+aHcuYnBfbGlzdCk7CisKKwlpZiAoY3B1ID49IDApIHsKKwkJdG9nZ2xlX2JwX3Rhc2tfc2xvdChicCwgY3B1LCBlbmFibGUsIHR5cGUsIHdlaWdodCk7CisJfSBlbHNlIHsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCQl0b2dnbGVfYnBfdGFza19zbG90KGJwLCBjcHUsIGVuYWJsZSwgdHlwZSwgd2VpZ2h0KTsKKwl9CisKIAlpZiAoZW5hYmxlKQotCQlwZXJfY3B1KG5yX2NwdV9icF9waW5uZWRbdHlwZV0sIGJwLT5jcHUpICs9IHdlaWdodDsKLQllbHNlCi0JCXBlcl9jcHUobnJfY3B1X2JwX3Bpbm5lZFt0eXBlXSwgYnAtPmNwdSkgLT0gd2VpZ2h0OworCQlsaXN0X2FkZF90YWlsKCZicC0+aHcuYnBfbGlzdCwgJmJwX3Rhc2tfaGVhZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0byBwZXJmb3JtIHByb2Nlc3Nvci1zcGVjaWZpYyBjbGVhbnVwIGR1cmluZyB1bnJlZ2lzdHJhdGlvbgorICovCitfX3dlYWsgdm9pZCBhcmNoX3VucmVnaXN0ZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCit7CisJLyoKKwkgKiBBIHdlYWsgc3R1YiBmdW5jdGlvbiBoZXJlIGZvciB0aG9zZSBhcmNocyB0aGF0IGRvbid0IGRlZmluZQorCSAqIGl0IGluc2lkZSBhcmNoLy4uLi9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisJICovCiB9CiAKIC8qCkBAIC0zMDEsNiArMzEyLDEwIEBACiAJd2VpZ2h0ID0gaHdfYnJlYWtwb2ludF93ZWlnaHQoYnApOwogCiAJZmV0Y2hfYnBfYnVzeV9zbG90cygmc2xvdHMsIGJwLCB0eXBlKTsKKwkvKgorCSAqIFNpbXVsYXRlIHRoZSBhZGRpdGlvbiBvZiB0aGlzIGJyZWFrcG9pbnQgdG8gdGhlIGNvbnN0cmFpbnRzCisJICogYW5kIHNlZSB0aGUgcmVzdWx0LgorCSAqLwogCWZldGNoX3RoaXNfc2xvdCgmc2xvdHMsIHdlaWdodCk7CiAKIAkvKiBGbGV4aWJsZSBjb3VudGVycyBuZWVkIHRvIGtlZXAgYXQgbGVhc3Qgb25lIHNsb3QgKi8KQEAgLTMzOSw2ICszNTQsNyBAQAogewogCW11dGV4X2xvY2soJm5yX2JwX211dGV4KTsKIAorCWFyY2hfdW5yZWdpc3Rlcl9od19icmVha3BvaW50KGJwKTsKIAlfX3JlbGVhc2VfYnBfc2xvdChicCk7CiAKIAltdXRleF91bmxvY2soJm5yX2JwX211dGV4KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2RlcC5jCmluZGV4IDU0Mjg2NzkuLmYyODUyYTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NrZGVwLmMKKysrIGIva2VybmVsL2xvY2tkZXAuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdTY0IGxvY2tzdGF0X2Nsb2NrKHZvaWQpCiB7Ci0JcmV0dXJuIGNwdV9jbG9jayhzbXBfcHJvY2Vzc29yX2lkKCkpOworCXJldHVybiBsb2NhbF9jbG9jaygpOwogfQogCiBzdGF0aWMgaW50IGxvY2tfcG9pbnQodW5zaWduZWQgbG9uZyBwb2ludHNbXSwgdW5zaWduZWQgbG9uZyBpcCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCA1ZDJkMjgxLi5kMGI1ZjhkIDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgIENvcHlyaWdodCAoQykgMjAwMiBSaWNoYXJkIEhlbmRlcnNvbgotICAgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3R5IFJ1c3NlbGwsIDIwMDIgUnVzdHkgUnVzc2VsbCBJQk0uCisgICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzdHkgUnVzc2VsbCwgMjAwMiwgMjAxMCBSdXN0eSBSdXNzZWxsIElCTS4KIAogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTExMCw2ICsxMTAsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIpOwogCitzdHJ1Y3QgbG9hZF9pbmZvIHsKKwlFbGZfRWhkciAqaGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCUVsZl9TaGRyICpzZWNoZHJzOworCWNoYXIgKnNlY3N0cmluZ3MsICpzdHJ0YWI7CisJdW5zaWduZWQgbG9uZyAqc3RybWFwOworCXVuc2lnbmVkIGxvbmcgc3ltb2Zmcywgc3Ryb2ZmczsKKwlzdHJ1Y3QgX2RkZWJ1ZyAqZGVidWc7CisJdW5zaWduZWQgaW50IG51bV9kZWJ1ZzsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgc3ltLCBzdHIsIG1vZCwgdmVycywgaW5mbywgcGNwdTsKKwl9IGluZGV4OworfTsKKwogLyogV2UgcmVxdWlyZSBhIHRydWx5IHN0cm9uZyB0cnlfbW9kdWxlX2dldCgpOiAwIG1lYW5zIGZhaWx1cmUgZHVlIHRvCiAgICBvbmdvaW5nIG9yIGZhaWxlZCBpbml0aWFsaXphdGlvbiBldGMuICovCiBzdGF0aWMgaW5saW5lIGludCBzdHJvbmdfdHJ5X21vZHVsZV9nZXQoc3RydWN0IG1vZHVsZSAqbW9kKQpAQCAtMTQwLDQyICsxNTQsMzggQEAKIEVYUE9SVF9TWU1CT0woX19tb2R1bGVfcHV0X2FuZF9leGl0KTsKIAogLyogRmluZCBhIG1vZHVsZSBzZWN0aW9uOiAwIG1lYW5zIG5vdCBmb3VuZC4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9zZWMoRWxmX0VoZHIgKmhkciwKLQkJCSAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgIGNvbnN0IGNoYXIgKnNlY3N0cmluZ3MsCi0JCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IGZpbmRfc2VjKGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspCisJZm9yIChpID0gMTsgaSA8IGluZm8tPmhkci0+ZV9zaG51bTsgaSsrKSB7CisJCUVsZl9TaGRyICpzaGRyID0gJmluZm8tPnNlY2hkcnNbaV07CiAJCS8qIEFsbG9jIGJpdCBjbGVhcmVkIG1lYW5zICJpZ25vcmUgaXQuIiAqLwotCQlpZiAoKHNlY2hkcnNbaV0uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0JCSAgICAmJiBzdHJjbXAoc2Vjc3RyaW5ncytzZWNoZHJzW2ldLnNoX25hbWUsIG5hbWUpID09IDApCisJCWlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpCisJCSAgICAmJiBzdHJjbXAoaW5mby0+c2Vjc3RyaW5ncyArIHNoZHItPnNoX25hbWUsIG5hbWUpID09IDApCiAJCQlyZXR1cm4gaTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qIEZpbmQgYSBtb2R1bGUgc2VjdGlvbiwgb3IgTlVMTC4gKi8KLXN0YXRpYyB2b2lkICpzZWN0aW9uX2FkZHIoRWxmX0VoZHIgKmhkciwgRWxmX1NoZHIgKnNoZHJzLAotCQkJICBjb25zdCBjaGFyICpzZWNzdHJpbmdzLCBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHZvaWQgKnNlY3Rpb25fYWRkcihjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpuYW1lKQogewogCS8qIFNlY3Rpb24gMCBoYXMgc2hfYWRkciAwLiAqLwotCXJldHVybiAodm9pZCAqKXNoZHJzW2ZpbmRfc2VjKGhkciwgc2hkcnMsIHNlY3N0cmluZ3MsIG5hbWUpXS5zaF9hZGRyOworCXJldHVybiAodm9pZCAqKWluZm8tPnNlY2hkcnNbZmluZF9zZWMoaW5mbywgbmFtZSldLnNoX2FkZHI7CiB9CiAKIC8qIEZpbmQgYSBtb2R1bGUgc2VjdGlvbiwgb3IgTlVMTC4gIEZpbGwgaW4gbnVtYmVyIG9mICJvYmplY3RzIiBpbiBzZWN0aW9uLiAqLwotc3RhdGljIHZvaWQgKnNlY3Rpb25fb2JqcyhFbGZfRWhkciAqaGRyLAotCQkJICBFbGZfU2hkciAqc2VjaGRycywKLQkJCSAgY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKK3N0YXRpYyB2b2lkICpzZWN0aW9uX29ianMoY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbywKIAkJCSAgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgc2l6ZV90IG9iamVjdF9zaXplLAogCQkJICB1bnNpZ25lZCBpbnQgKm51bSkKIHsKLQl1bnNpZ25lZCBpbnQgc2VjID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCBuYW1lKTsKKwl1bnNpZ25lZCBpbnQgc2VjID0gZmluZF9zZWMoaW5mbywgbmFtZSk7CiAKIAkvKiBTZWN0aW9uIDAgaGFzIHNoX2FkZHIgMCBhbmQgc2hfc2l6ZSAwLiAqLwotCSpudW0gPSBzZWNoZHJzW3NlY10uc2hfc2l6ZSAvIG9iamVjdF9zaXplOwotCXJldHVybiAodm9pZCAqKXNlY2hkcnNbc2VjXS5zaF9hZGRyOworCSpudW0gPSBpbmZvLT5zZWNoZHJzW3NlY10uc2hfc2l6ZSAvIG9iamVjdF9zaXplOworCXJldHVybiAodm9pZCAqKWluZm8tPnNlY2hkcnNbc2VjXS5zaF9hZGRyOwogfQogCiAvKiBQcm92aWRlZCBieSB0aGUgbGlua2VyICovCkBAIC0yMjcsNyArMjM3LDcgQEAKIAkJCSAgICB1bnNpZ25lZCBpbnQgc3ltbnVtLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7Ci0JY29uc3Qgc3RydWN0IHN5bXNlYXJjaCBhcnJbXSA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHN5bXNlYXJjaCBhcnJbXSA9IHsKIAkJeyBfX3N0YXJ0X19fa3N5bXRhYiwgX19zdG9wX19fa3N5bXRhYiwgX19zdGFydF9fX2tjcmN0YWIsCiAJCSAgTk9UX0dQTF9PTkxZLCBmYWxzZSB9LAogCQl7IF9fc3RhcnRfX19rc3ltdGFiX2dwbCwgX19zdG9wX19fa3N5bXRhYl9ncGwsCkBAIC0zOTIsNyArNDAyLDggQEAKIAltb2QtPnBlcmNwdSA9IF9fYWxsb2NfcmVzZXJ2ZWRfcGVyY3B1KHNpemUsIGFsaWduKTsKIAlpZiAoIW1vZC0+cGVyY3B1KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIHBlcmNwdSBkYXRhXG4iLCBzaXplKTsKKwkJICAgICAgICIlczogQ291bGQgbm90IGFsbG9jYXRlICVsdSBieXRlcyBwZXJjcHUgZGF0YVxuIiwKKwkJICAgICAgIG1vZC0+bmFtZSwgc2l6ZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltb2QtPnBlcmNwdV9zaXplID0gc2l6ZTsKQEAgLTQwNCwxMSArNDE1LDkgQEAKIAlmcmVlX3BlcmNwdShtb2QtPnBlcmNwdSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9wY3B1c2VjKEVsZl9FaGRyICpoZHIsCi0JCQkJIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJCSBjb25zdCBjaGFyICpzZWNzdHJpbmdzKQorc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX3BjcHVzZWMoc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKIHsKLQlyZXR1cm4gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiLmRhdGEuLnBlcmNwdSIpOworCXJldHVybiBmaW5kX3NlYyhpbmZvLCAiLmRhdGEuLnBlcmNwdSIpOwogfQogCiBzdGF0aWMgdm9pZCBwZXJjcHVfbW9kY29weShzdHJ1Y3QgbW9kdWxlICptb2QsCkBAIC00NjgsOSArNDc3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfbW9kZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiB9Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaW5kX3BjcHVzZWMoRWxmX0VoZHIgKmhkciwKLQkJCQkJRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkJCWNvbnN0IGNoYXIgKnNlY3N0cmluZ3MpCitzdGF0aWMgdW5zaWduZWQgaW50IGZpbmRfcGNwdXNlYyhzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQogewogCXJldHVybiAwOwogfQpAQCAtNTI0LDIxICs1MzEsMjEgQEAKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChtb2R1bGVfZ2V0KTsKIAogLyogSW5pdCB0aGUgdW5sb2FkIHNlY3Rpb24gb2YgdGhlIG1vZHVsZS4gKi8KLXN0YXRpYyB2b2lkIG1vZHVsZV91bmxvYWRfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCitzdGF0aWMgaW50IG1vZHVsZV91bmxvYWRfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7Ci0JaW50IGNwdTsKKwltb2QtPnJlZnB0ciA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbW9kdWxlX3JlZik7CisJaWYgKCFtb2QtPnJlZnB0cikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlJTklUX0xJU1RfSEVBRCgmbW9kLT5zb3VyY2VfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJm1vZC0+dGFyZ2V0X2xpc3QpOwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJcGVyX2NwdV9wdHIobW9kLT5yZWZwdHIsIGNwdSktPmluY3MgPSAwOwotCQlwZXJfY3B1X3B0cihtb2QtPnJlZnB0ciwgY3B1KS0+ZGVjcyA9IDA7Ci0JfQogCiAJLyogSG9sZCByZWZlcmVuY2UgY291bnQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAqLwogCV9fdGhpc19jcHVfd3JpdGUobW9kLT5yZWZwdHItPmluY3MsIDEpOwogCS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1hY3JvcyBwdXQgcmVmY291bnQgZHVyaW5nIGluaXQuICovCiAJbW9kLT53YWl0ZXIgPSBjdXJyZW50OworCisJcmV0dXJuIDA7CiB9CiAKIC8qIERvZXMgYSBhbHJlYWR5IHVzZSBiPyAqLwpAQCAtNjE4LDYgKzYyNSw4IEBACiAJCWtmcmVlKHVzZSk7CiAJfQogCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKKworCWZyZWVfcGVyY3B1KG1vZC0+cmVmcHRyKTsKIH0KIAogI2lmZGVmIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FECkBAIC03ODcsNyArNzk2LDYgQEAKIAogCS8qIFN0b3JlIHRoZSBuYW1lIG9mIHRoZSBsYXN0IHVubG9hZGVkIG1vZHVsZSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyAqLwogCXN0cmxjcHkobGFzdF91bmxvYWRlZF9tb2R1bGUsIG1vZC0+bmFtZSwgc2l6ZW9mKGxhc3RfdW5sb2FkZWRfbW9kdWxlKSk7Ci0JZGRlYnVnX3JlbW92ZV9tb2R1bGUobW9kLT5uYW1lKTsKIAogCWZyZWVfbW9kdWxlKG1vZCk7CiAJcmV0dXJuIDA7CkBAIC04OTIsOCArOTAwLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZl9tb2R1bGUpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbW9kdWxlX3VubG9hZF9pbml0KHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBpbmxpbmUgaW50IG1vZHVsZV91bmxvYWRfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX01PRFVMRV9VTkxPQUQgKi8KIApAQCAtMTA1MiwxMCArMTA2MSw5IEBACiAjZW5kaWYgLyogQ09ORklHX01PRFZFUlNJT05TICovCiAKIC8qIFJlc29sdmUgYSBzeW1ib2wgZm9yIHRoaXMgbW9kdWxlLiAgSS5lLiBpZiB3ZSBmaW5kIG9uZSwgcmVjb3JkIHVzYWdlLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sICpyZXNvbHZlX3N5bWJvbChFbGZfU2hkciAqc2VjaGRycywKLQkJCQkJCSAgdW5zaWduZWQgaW50IHZlcnNpbmRleCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqcmVzb2x2ZV9zeW1ib2woc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLAogCQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICBzdHJ1Y3QgbW9kdWxlICptb2QsCiAJCQkJCQkgIGNoYXIgb3duZXJuYW1lW10pCiB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CkBAIC0xMDY5LDcgKzEwNzcsOCBAQAogCWlmICghc3ltKQogCQlnb3RvIHVubG9jazsKIAotCWlmICghY2hlY2tfdmVyc2lvbihzZWNoZHJzLCB2ZXJzaW5kZXgsIG5hbWUsIG1vZCwgY3JjLCBvd25lcikpIHsKKwlpZiAoIWNoZWNrX3ZlcnNpb24oaW5mby0+c2VjaGRycywgaW5mby0+aW5kZXgudmVycywgbmFtZSwgbW9kLCBjcmMsCisJCQkgICBvd25lcikpIHsKIAkJc3ltID0gRVJSX1BUUigtRUlOVkFMKTsKIAkJZ290byBnZXRuYW1lOwogCX0KQEAgLTEwODgsMjEgKzEwOTcsMjAgQEAKIAlyZXR1cm4gc3ltOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKnJlc29sdmVfc3ltYm9sX3dhaXQoRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHZlcnNpbmRleCwKLQkJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqCityZXNvbHZlX3N5bWJvbF93YWl0KHN0cnVjdCBtb2R1bGUgKm1vZCwKKwkJICAgIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8sCisJCSAgICBjb25zdCBjaGFyICpuYW1lKQogewogCWNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sICprc3ltOwotCWNoYXIgb3duZXJuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJY2hhciBvd25lcltNT0RVTEVfTkFNRV9MRU5dOwogCiAJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG1vZHVsZV93cSwKLQkJCSFJU19FUlIoa3N5bSA9IHJlc29sdmVfc3ltYm9sKHNlY2hkcnMsIHZlcnNpbmRleCwgbmFtZSwKLQkJCQkJCSAgICAgIG1vZCwgb3duZXJuYW1lKSkgfHwKLQkJCVBUUl9FUlIoa3N5bSkgIT0gLUVCVVNZLAorCQkJIUlTX0VSUihrc3ltID0gcmVzb2x2ZV9zeW1ib2wobW9kLCBpbmZvLCBuYW1lLCBvd25lcikpCisJCQl8fCBQVFJfRVJSKGtzeW0pICE9IC1FQlVTWSwKIAkJCQkJICAgICAzMCAqIEhaKSA8PSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnYXZlIHVwIHdhaXRpbmcgZm9yIGluaXQgb2YgbW9kdWxlICVzLlxuIiwKLQkJICAgICAgIG1vZC0+bmFtZSwgb3duZXJuYW1lKTsKKwkJICAgICAgIG1vZC0+bmFtZSwgb3duZXIpOwogCX0KIAlyZXR1cm4ga3N5bTsKIH0KQEAgLTExMTEsOCArMTExOSw5IEBACiAgKiAvc3lzL21vZHVsZS9mb28vc2VjdGlvbnMgc3R1ZmYKICAqIEouIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+CiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19LQUxMU1lNUykgJiYgZGVmaW5lZChDT05GSUdfU1lTRlMpCisjaWZkZWYgQ09ORklHX1NZU0ZTCiAKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIHN0YXRpYyBpbmxpbmUgYm9vbCBzZWN0X2VtcHR5KGNvbnN0IEVsZl9TaGRyICpzZWN0KQogewogCXJldHVybiAhKHNlY3QtPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSB8fCBzZWN0LT5zaF9zaXplID09IDA7CkBAIC0xMTQ5LDggKzExNTgsNyBAQAogCWtmcmVlKHNlY3RfYXR0cnMpOwogfQogCi1zdGF0aWMgdm9pZCBhZGRfc2VjdF9hdHRycyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGludCBuc2VjdCwKLQkJY2hhciAqc2Vjc3RyaW5ncywgRWxmX1NoZHIgKnNlY2hkcnMpCitzdGF0aWMgdm9pZCBhZGRfc2VjdF9hdHRycyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiAJdW5zaWduZWQgaW50IG5sb2FkZWQgPSAwLCBpLCBzaXplWzJdOwogCXN0cnVjdCBtb2R1bGVfc2VjdF9hdHRycyAqc2VjdF9hdHRyczsKQEAgLTExNTgsOCArMTE2Niw4IEBACiAJc3RydWN0IGF0dHJpYnV0ZSAqKmdhdHRyOwogCiAJLyogQ291bnQgbG9hZGVkIHNlY3Rpb25zIGFuZCBhbGxvY2F0ZSBzdHJ1Y3R1cmVzICovCi0JZm9yIChpID0gMDsgaSA8IG5zZWN0OyBpKyspCi0JCWlmICghc2VjdF9lbXB0eSgmc2VjaGRyc1tpXSkpCisJZm9yIChpID0gMDsgaSA8IGluZm8tPmhkci0+ZV9zaG51bTsgaSsrKQorCQlpZiAoIXNlY3RfZW1wdHkoJmluZm8tPnNlY2hkcnNbaV0pKQogCQkJbmxvYWRlZCsrOwogCXNpemVbMF0gPSBBTElHTihzaXplb2YoKnNlY3RfYXR0cnMpCiAJCQkrIG5sb2FkZWQgKiBzaXplb2Yoc2VjdF9hdHRycy0+YXR0cnNbMF0pLApAQCAtMTE3NiwxMSArMTE4NCwxMiBAQAogCXNlY3RfYXR0cnMtPm5zZWN0aW9ucyA9IDA7CiAJc2F0dHIgPSAmc2VjdF9hdHRycy0+YXR0cnNbMF07CiAJZ2F0dHIgPSAmc2VjdF9hdHRycy0+Z3JwLmF0dHJzWzBdOwotCWZvciAoaSA9IDA7IGkgPCBuc2VjdDsgaSsrKSB7Ci0JCWlmIChzZWN0X2VtcHR5KCZzZWNoZHJzW2ldKSkKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+aGRyLT5lX3NobnVtOyBpKyspIHsKKwkJRWxmX1NoZHIgKnNlYyA9ICZpbmZvLT5zZWNoZHJzW2ldOworCQlpZiAoc2VjdF9lbXB0eShzZWMpKQogCQkJY29udGludWU7Ci0JCXNhdHRyLT5hZGRyZXNzID0gc2VjaGRyc1tpXS5zaF9hZGRyOwotCQlzYXR0ci0+bmFtZSA9IGtzdHJkdXAoc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSwKKwkJc2F0dHItPmFkZHJlc3MgPSBzZWMtPnNoX2FkZHI7CisJCXNhdHRyLT5uYW1lID0ga3N0cmR1cChpbmZvLT5zZWNzdHJpbmdzICsgc2VjLT5zaF9uYW1lLAogCQkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKHNhdHRyLT5uYW1lID09IE5VTEwpCiAJCQlnb3RvIG91dDsKQEAgLTEyNDgsOCArMTI1Nyw3IEBACiAJa2ZyZWUobm90ZXNfYXR0cnMpOwogfQogCi1zdGF0aWMgdm9pZCBhZGRfbm90ZXNfYXR0cnMoc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBpbnQgbnNlY3QsCi0JCQkgICAgY2hhciAqc2Vjc3RyaW5ncywgRWxmX1NoZHIgKnNlY2hkcnMpCitzdGF0aWMgdm9pZCBhZGRfbm90ZXNfYXR0cnMoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQogewogCXVuc2lnbmVkIGludCBub3RlcywgbG9hZGVkLCBpOwogCXN0cnVjdCBtb2R1bGVfbm90ZXNfYXR0cnMgKm5vdGVzX2F0dHJzOwpAQCAtMTI2MSw5ICsxMjY5LDkgQEAKIAogCS8qIENvdW50IG5vdGVzIHNlY3Rpb25zIGFuZCBhbGxvY2F0ZSBzdHJ1Y3R1cmVzLiAgKi8KIAlub3RlcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5zZWN0OyBpKyspCi0JCWlmICghc2VjdF9lbXB0eSgmc2VjaGRyc1tpXSkgJiYKLQkJICAgIChzZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX05PVEUpKQorCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5oZHItPmVfc2hudW07IGkrKykKKwkJaWYgKCFzZWN0X2VtcHR5KCZpbmZvLT5zZWNoZHJzW2ldKSAmJgorCQkgICAgKGluZm8tPnNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfTk9URSkpCiAJCQkrK25vdGVzOwogCiAJaWYgKG5vdGVzID09IDApCkBAIC0xMjc3LDE1ICsxMjg1LDE1IEBACiAKIAlub3Rlc19hdHRycy0+bm90ZXMgPSBub3RlczsKIAluYXR0ciA9ICZub3Rlc19hdHRycy0+YXR0cnNbMF07Ci0JZm9yIChsb2FkZWQgPSBpID0gMDsgaSA8IG5zZWN0OyArK2kpIHsKLQkJaWYgKHNlY3RfZW1wdHkoJnNlY2hkcnNbaV0pKQorCWZvciAobG9hZGVkID0gaSA9IDA7IGkgPCBpbmZvLT5oZHItPmVfc2hudW07ICsraSkgeworCQlpZiAoc2VjdF9lbXB0eSgmaW5mby0+c2VjaGRyc1tpXSkpCiAJCQljb250aW51ZTsKLQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfTk9URSkgeworCQlpZiAoaW5mby0+c2VjaGRyc1tpXS5zaF90eXBlID09IFNIVF9OT1RFKSB7CiAJCQlzeXNmc19iaW5fYXR0cl9pbml0KG5hdHRyKTsKIAkJCW5hdHRyLT5hdHRyLm5hbWUgPSBtb2QtPnNlY3RfYXR0cnMtPmF0dHJzW2xvYWRlZF0ubmFtZTsKIAkJCW5hdHRyLT5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCQkJbmF0dHItPnNpemUgPSBzZWNoZHJzW2ldLnNoX3NpemU7Ci0JCQluYXR0ci0+cHJpdmF0ZSA9ICh2b2lkICopIHNlY2hkcnNbaV0uc2hfYWRkcjsKKwkJCW5hdHRyLT5zaXplID0gaW5mby0+c2VjaGRyc1tpXS5zaF9zaXplOworCQkJbmF0dHItPnByaXZhdGUgPSAodm9pZCAqKSBpbmZvLT5zZWNoZHJzW2ldLnNoX2FkZHI7CiAJCQluYXR0ci0+cmVhZCA9IG1vZHVsZV9ub3Rlc19yZWFkOwogCQkJKytuYXR0cjsKIAkJfQpAQCAtMTMxNiw4ICsxMzI0LDggQEAKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSB2b2lkIGFkZF9zZWN0X2F0dHJzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgaW50IG5zZWN0LAotCQljaGFyICpzZWN0c3RyaW5ncywgRWxmX1NoZHIgKnNlY2hkcnMpCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3NlY3RfYXR0cnMoc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJCSAgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKIHsKIH0KIApAQCAtMTMyNSwxNyArMTMzMywxNiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX25vdGVzX2F0dHJzKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgaW50IG5zZWN0LAotCQkJCSAgIGNoYXIgKnNlY3RzdHJpbmdzLCBFbGZfU2hkciAqc2VjaGRycykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfbm90ZXNfYXR0cnMoc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfbm90ZXNfYXR0cnMoc3RydWN0IG1vZHVsZSAqbW9kKQogewogfQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0tBTExTWU1TICovCiAKLSNpZmRlZiBDT05GSUdfU1lTRlMKIHN0YXRpYyB2b2lkIGFkZF91c2FnZV9saW5rcyhzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKQEAgLTE0NDAsNiArMTQ0Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbW9kX3N5c2ZzX3NldHVwKHN0cnVjdCBtb2R1bGUgKm1vZCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8sCiAJCQkgICBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcGFyYW0sCiAJCQkgICB1bnNpZ25lZCBpbnQgbnVtX3BhcmFtcykKIHsKQEAgLTE0NjQsNiArMTQ3Miw4IEBACiAJCWdvdG8gb3V0X3VucmVnX3BhcmFtOwogCiAJYWRkX3VzYWdlX2xpbmtzKG1vZCk7CisJYWRkX3NlY3RfYXR0cnMobW9kLCBpbmZvKTsKKwlhZGRfbm90ZXNfYXR0cnMobW9kLCBpbmZvKTsKIAogCWtvYmplY3RfdWV2ZW50KCZtb2QtPm1rb2JqLmtvYmosIEtPQkpfQUREKTsKIAlyZXR1cm4gMDsKQEAgLTE0ODAsNDMgKzE0OTAsMzYgQEAKIAogc3RhdGljIHZvaWQgbW9kX3N5c2ZzX2Zpbmkoc3RydWN0IG1vZHVsZSAqbW9kKQogeworCXJlbW92ZV9ub3Rlc19hdHRycyhtb2QpOworCXJlbW92ZV9zZWN0X2F0dHJzKG1vZCk7CiAJa29iamVjdF9wdXQoJm1vZC0+bWtvYmoua29iaik7CiB9CiAKLSNlbHNlIC8qIENPTkZJR19TWVNGUyAqLworI2Vsc2UgLyogIUNPTkZJR19TWVNGUyAqLwogCi1zdGF0aWMgaW5saW5lIGludCBtb2Rfc3lzZnNfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1vZF9zeXNmc19zZXR1cChzdHJ1Y3QgbW9kdWxlICptb2QsCitzdGF0aWMgaW50IG1vZF9zeXNmc19zZXR1cChzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkgICBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvLAogCQkJICAgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3BhcmFtLAogCQkJICAgdW5zaWduZWQgaW50IG51bV9wYXJhbXMpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1vZHVsZV9hZGRfbW9kaW5mb19hdHRycyhzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtb2R1bGVfcmVtb3ZlX21vZGluZm9fYXR0cnMoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQotCiBzdGF0aWMgdm9pZCBtb2Rfc3lzZnNfZmluaShzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiB9CiAKK3N0YXRpYyB2b2lkIG1vZHVsZV9yZW1vdmVfbW9kaW5mb19hdHRycyhzdHJ1Y3QgbW9kdWxlICptb2QpCit7Cit9CisKIHN0YXRpYyB2b2lkIGRlbF91c2FnZV9saW5rcyhzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIAotc3RhdGljIHZvaWQgbW9kX2tvYmplY3RfcmVtb3ZlKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyB2b2lkIG1vZF9zeXNmc190ZWFyZG93bihzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJZGVsX3VzYWdlX2xpbmtzKG1vZCk7CiAJbW9kdWxlX3JlbW92ZV9tb2RpbmZvX2F0dHJzKG1vZCk7CkBAIC0xNTQ2LDkgKzE1NDksMTAgQEAKIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCXN0b3BfbWFjaGluZShfX3VubGlua19tb2R1bGUsIG1vZCwgTlVMTCk7CiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwotCXJlbW92ZV9ub3Rlc19hdHRycyhtb2QpOwotCXJlbW92ZV9zZWN0X2F0dHJzKG1vZCk7Ci0JbW9kX2tvYmplY3RfcmVtb3ZlKG1vZCk7CisJbW9kX3N5c2ZzX3RlYXJkb3duKG1vZCk7CisKKwkvKiBSZW1vdmUgZHluYW1pYyBkZWJ1ZyBpbmZvICovCisJZGRlYnVnX3JlbW92ZV9tb2R1bGUobW9kLT5uYW1lKTsKIAogCS8qIEFyY2gtc3BlY2lmaWMgY2xlYW51cC4gKi8KIAltb2R1bGVfYXJjaF9jbGVhbnVwKG1vZCk7CkBAIC0xNTYzLDEwICsxNTY3LDcgQEAKIAltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2luaXQpOwogCWtmcmVlKG1vZC0+YXJncyk7CiAJcGVyY3B1X21vZGZyZWUobW9kKTsKLSNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVfVU5MT0FEKQotCWlmIChtb2QtPnJlZnB0cikKLQkJZnJlZV9wZXJjcHUobW9kLT5yZWZwdHIpOwotI2VuZGlmCisKIAkvKiBGcmVlIGxvY2stY2xhc3NlczogKi8KIAlsb2NrZGVwX2ZyZWVfa2V5X3JhbmdlKG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKTsKIApAQCAtMTYzMiwyNSArMTYzMywyMyBAQAogfQogCiAvKiBDaGFuZ2UgYWxsIHN5bWJvbHMgc28gdGhhdCBzdF92YWx1ZSBlbmNvZGVzIHRoZSBwb2ludGVyIGRpcmVjdGx5LiAqLwotc3RhdGljIGludCBzaW1wbGlmeV9zeW1ib2xzKEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkJCSAgICBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCQkgICAgdW5zaWduZWQgaW50IHZlcnNpbmRleCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgcGNwdWluZGV4LAotCQkJICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBpbnQgc2ltcGxpZnlfc3ltYm9scyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7Ci0JRWxmX1N5bSAqc3ltID0gKHZvaWQgKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyOworCUVsZl9TaGRyICpzeW1zZWMgPSAmaW5mby0+c2VjaGRyc1tpbmZvLT5pbmRleC5zeW1dOworCUVsZl9TeW0gKnN5bSA9ICh2b2lkICopc3ltc2VjLT5zaF9hZGRyOwogCXVuc2lnbmVkIGxvbmcgc2VjYmFzZTsKLQl1bnNpZ25lZCBpbnQgaSwgbiA9IHNlY2hkcnNbc3ltaW5kZXhdLnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSk7CisJdW5zaWduZWQgaW50IGk7CiAJaW50IHJldCA9IDA7CiAJY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKmtzeW07CiAKLQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8IHN5bXNlYy0+c2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBpbmZvLT5zdHJ0YWIgKyBzeW1baV0uc3RfbmFtZTsKKwogCQlzd2l0Y2ggKHN5bVtpXS5zdF9zaG5keCkgewogCQljYXNlIFNITl9DT01NT046CiAJCQkvKiBXZSBjb21waWxlZCB3aXRoIC1mbm8tY29tbW9uLiAgVGhlc2UgYXJlIG5vdAogCQkJICAgc3VwcG9zZWQgdG8gaGFwcGVuLiAgKi8KLQkJCURFQlVHUCgiQ29tbW9uIHN5bWJvbDogJXNcbiIsIHN0cnRhYiArIHN5bVtpXS5zdF9uYW1lKTsKKwkJCURFQlVHUCgiQ29tbW9uIHN5bWJvbDogJXNcbiIsIG5hbWUpOwogCQkJcHJpbnRrKCIlczogcGxlYXNlIGNvbXBpbGUgd2l0aCAtZm5vLWNvbW1vblxuIiwKIAkJCSAgICAgICBtb2QtPm5hbWUpOwogCQkJcmV0ID0gLUVOT0VYRUM7CkBAIC0xNjYzLDkgKzE2NjIsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBTSE5fVU5ERUY6Ci0JCQlrc3ltID0gcmVzb2x2ZV9zeW1ib2xfd2FpdChzZWNoZHJzLCB2ZXJzaW5kZXgsCi0JCQkJCQkgICBzdHJ0YWIgKyBzeW1baV0uc3RfbmFtZSwKLQkJCQkJCSAgIG1vZCk7CisJCQlrc3ltID0gcmVzb2x2ZV9zeW1ib2xfd2FpdChtb2QsIGluZm8sIG5hbWUpOwogCQkJLyogT2sgaWYgcmVzb2x2ZWQuICAqLwogCQkJaWYgKGtzeW0gJiYgIUlTX0VSUihrc3ltKSkgewogCQkJCXN5bVtpXS5zdF92YWx1ZSA9IGtzeW0tPnZhbHVlOwpAQCAtMTY3NywxNyArMTY3NCwxNiBAQAogCQkJCWJyZWFrOwogCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBzeW1ib2wgJXMgKGVyciAlbGkpXG4iLAotCQkJICAgICAgIG1vZC0+bmFtZSwgc3RydGFiICsgc3ltW2ldLnN0X25hbWUsCi0JCQkgICAgICAgUFRSX0VSUihrc3ltKSk7CisJCQkgICAgICAgbW9kLT5uYW1lLCBuYW1lLCBQVFJfRVJSKGtzeW0pKTsKIAkJCXJldCA9IFBUUl9FUlIoa3N5bSkgPzogLUVOT0VOVDsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAJCQkvKiBEaXZlcnQgdG8gcGVyY3B1IGFsbG9jYXRpb24gaWYgYSBwZXJjcHUgdmFyLiAqLwotCQkJaWYgKHN5bVtpXS5zdF9zaG5keCA9PSBwY3B1aW5kZXgpCisJCQlpZiAoc3ltW2ldLnN0X3NobmR4ID09IGluZm8tPmluZGV4LnBjcHUpCiAJCQkJc2VjYmFzZSA9ICh1bnNpZ25lZCBsb25nKW1vZF9wZXJjcHUobW9kKTsKIAkJCWVsc2UKLQkJCQlzZWNiYXNlID0gc2VjaGRyc1tzeW1baV0uc3Rfc2huZHhdLnNoX2FkZHI7CisJCQkJc2VjYmFzZSA9IGluZm8tPnNlY2hkcnNbc3ltW2ldLnN0X3NobmR4XS5zaF9hZGRyOwogCQkJc3ltW2ldLnN0X3ZhbHVlICs9IHNlY2Jhc2U7CiAJCQlicmVhazsKIAkJfQpAQCAtMTY5Niw2ICsxNjkyLDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBhcHBseV9yZWxvY2F0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVyciA9IDA7CisKKwkvKiBOb3cgZG8gcmVsb2NhdGlvbnMuICovCisJZm9yIChpID0gMTsgaSA8IGluZm8tPmhkci0+ZV9zaG51bTsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBpbmZvc2VjID0gaW5mby0+c2VjaGRyc1tpXS5zaF9pbmZvOworCisJCS8qIE5vdCBhIHZhbGlkIHJlbG9jYXRpb24gc2VjdGlvbj8gKi8KKwkJaWYgKGluZm9zZWMgPj0gaW5mby0+aGRyLT5lX3NobnVtKQorCQkJY29udGludWU7CisKKwkJLyogRG9uJ3QgYm90aGVyIHdpdGggbm9uLWFsbG9jYXRlZCBzZWN0aW9ucyAqLworCQlpZiAoIShpbmZvLT5zZWNoZHJzW2luZm9zZWNdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbmZvLT5zZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX1JFTCkKKwkJCWVyciA9IGFwcGx5X3JlbG9jYXRlKGluZm8tPnNlY2hkcnMsIGluZm8tPnN0cnRhYiwKKwkJCQkJICAgICBpbmZvLT5pbmRleC5zeW0sIGksIG1vZCk7CisJCWVsc2UgaWYgKGluZm8tPnNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfUkVMQSkKKwkJCWVyciA9IGFwcGx5X3JlbG9jYXRlX2FkZChpbmZvLT5zZWNoZHJzLCBpbmZvLT5zdHJ0YWIsCisJCQkJCQkgaW5mby0+aW5kZXguc3ltLCBpLCBtb2QpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCiAvKiBBZGRpdGlvbmFsIGJ5dGVzIG5lZWRlZCBieSBhcmNoIGluIGZyb250IG9mIGluZGl2aWR1YWwgc2VjdGlvbnMgKi8KIHVuc2lnbmVkIGludCBfX3dlYWsgYXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKHN0cnVjdCBtb2R1bGUgKm1vZCwKIAkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbikKQEAgLTE3MjAsMTAgKzE3NDUsNyBAQAogICAgbWlnaHQgLS0gY29kZSwgcmVhZC1vbmx5IGRhdGEsIHJlYWQtd3JpdGUgZGF0YSwgc21hbGwgZGF0YS4gIFRhbGx5CiAgICBzaXplcywgYW5kIHBsYWNlIHRoZSBvZmZzZXRzIGludG8gc2hfZW50c2l6ZSBmaWVsZHM6IGhpZ2ggYml0IG1lYW5zIGl0CiAgICBiZWxvbmdzIGluIGluaXQuICovCi1zdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLAotCQkJICAgIGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCQkgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgY29uc3QgY2hhciAqc2Vjc3RyaW5ncykKK3N0YXRpYyB2b2lkIGxheW91dF9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgY29uc3QgbWFza3NbXVsyXSA9IHsKIAkJLyogTk9URTogYWxsIGV4ZWN1dGFibGUgY29kZSBtdXN0IGJlIHRoZSBmaXJzdCBzZWN0aW9uCkBAIC0xNzM2LDIxICsxNzU4LDIyIEBACiAJfTsKIAl1bnNpZ25lZCBpbnQgbSwgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfc2hudW07IGkrKykKLQkJc2VjaGRyc1tpXS5zaF9lbnRzaXplID0gfjBVTDsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+aGRyLT5lX3NobnVtOyBpKyspCisJCWluZm8tPnNlY2hkcnNbaV0uc2hfZW50c2l6ZSA9IH4wVUw7CiAKIAlERUJVR1AoIkNvcmUgc2VjdGlvbiBhbGxvY2F0aW9uIG9yZGVyOlxuIik7CiAJZm9yIChtID0gMDsgbSA8IEFSUkFZX1NJWkUobWFza3MpOyArK20pIHsKLQkJZm9yIChpID0gMDsgaSA8IGhkci0+ZV9zaG51bTsgKytpKSB7Ci0JCQlFbGZfU2hkciAqcyA9ICZzZWNoZHJzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+aGRyLT5lX3NobnVtOyArK2kpIHsKKwkJCUVsZl9TaGRyICpzID0gJmluZm8tPnNlY2hkcnNbaV07CisJCQljb25zdCBjaGFyICpzbmFtZSA9IGluZm8tPnNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lOwogCiAJCQlpZiAoKHMtPnNoX2ZsYWdzICYgbWFza3NbbV1bMF0pICE9IG1hc2tzW21dWzBdCiAJCQkgICAgfHwgKHMtPnNoX2ZsYWdzICYgbWFza3NbbV1bMV0pCiAJCQkgICAgfHwgcy0+c2hfZW50c2l6ZSAhPSB+MFVMCi0JCQkgICAgfHwgc3Ryc3RhcnRzKHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lLCAiLmluaXQiKSkKKwkJCSAgICB8fCBzdHJzdGFydHMoc25hbWUsICIuaW5pdCIpKQogCQkJCWNvbnRpbnVlOwogCQkJcy0+c2hfZW50c2l6ZSA9IGdldF9vZmZzZXQobW9kLCAmbW9kLT5jb3JlX3NpemUsIHMsIGkpOwotCQkJREVCVUdQKCJcdCVzXG4iLCBzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSk7CisJCQlERUJVR1AoIlx0JXNcbiIsIG5hbWUpOwogCQl9CiAJCWlmIChtID09IDApCiAJCQltb2QtPmNvcmVfdGV4dF9zaXplID0gbW9kLT5jb3JlX3NpemU7CkBAIC0xNzU4LDE3ICsxNzgxLDE4IEBACiAKIAlERUJVR1AoIkluaXQgc2VjdGlvbiBhbGxvY2F0aW9uIG9yZGVyOlxuIik7CiAJZm9yIChtID0gMDsgbSA8IEFSUkFZX1NJWkUobWFza3MpOyArK20pIHsKLQkJZm9yIChpID0gMDsgaSA8IGhkci0+ZV9zaG51bTsgKytpKSB7Ci0JCQlFbGZfU2hkciAqcyA9ICZzZWNoZHJzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+aGRyLT5lX3NobnVtOyArK2kpIHsKKwkJCUVsZl9TaGRyICpzID0gJmluZm8tPnNlY2hkcnNbaV07CisJCQljb25zdCBjaGFyICpzbmFtZSA9IGluZm8tPnNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lOwogCiAJCQlpZiAoKHMtPnNoX2ZsYWdzICYgbWFza3NbbV1bMF0pICE9IG1hc2tzW21dWzBdCiAJCQkgICAgfHwgKHMtPnNoX2ZsYWdzICYgbWFza3NbbV1bMV0pCiAJCQkgICAgfHwgcy0+c2hfZW50c2l6ZSAhPSB+MFVMCi0JCQkgICAgfHwgIXN0cnN0YXJ0cyhzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSwgIi5pbml0IikpCisJCQkgICAgfHwgIXN0cnN0YXJ0cyhzbmFtZSwgIi5pbml0IikpCiAJCQkJY29udGludWU7CiAJCQlzLT5zaF9lbnRzaXplID0gKGdldF9vZmZzZXQobW9kLCAmbW9kLT5pbml0X3NpemUsIHMsIGkpCiAJCQkJCSB8IElOSVRfT0ZGU0VUX01BU0spOwotCQkJREVCVUdQKCJcdCVzXG4iLCBzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSk7CisJCQlERUJVR1AoIlx0JXNcbiIsIHNuYW1lKTsKIAkJfQogCQlpZiAobSA9PSAwKQogCQkJbW9kLT5pbml0X3RleHRfc2l6ZSA9IG1vZC0+aW5pdF9zaXplOwpAQCAtMTgwNywzMyArMTgzMSwyOCBAQAogCXJldHVybiBzdHJpbmc7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXRfbW9kaW5mbyhFbGZfU2hkciAqc2VjaGRycywKLQkJCSB1bnNpZ25lZCBpbnQgaW5mbywKLQkJCSBjb25zdCBjaGFyICp0YWcpCitzdGF0aWMgY2hhciAqZ2V0X21vZGluZm8oc3RydWN0IGxvYWRfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqdGFnKQogewogCWNoYXIgKnA7CiAJdW5zaWduZWQgaW50IHRhZ2xlbiA9IHN0cmxlbih0YWcpOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHNlY2hkcnNbaW5mb10uc2hfc2l6ZTsKKwlFbGZfU2hkciAqaW5mb3NlYyA9ICZpbmZvLT5zZWNoZHJzW2luZm8tPmluZGV4LmluZm9dOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGluZm9zZWMtPnNoX3NpemU7CiAKLQlmb3IgKHAgPSAoY2hhciAqKXNlY2hkcnNbaW5mb10uc2hfYWRkcjsgcDsgcCA9IG5leHRfc3RyaW5nKHAsICZzaXplKSkgeworCWZvciAocCA9IChjaGFyICopaW5mb3NlYy0+c2hfYWRkcjsgcDsgcCA9IG5leHRfc3RyaW5nKHAsICZzaXplKSkgewogCQlpZiAoc3RybmNtcChwLCB0YWcsIHRhZ2xlbikgPT0gMCAmJiBwW3RhZ2xlbl0gPT0gJz0nKQogCQkJcmV0dXJuIHAgKyB0YWdsZW4gKyAxOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfbW9kaW5mbyhzdHJ1Y3QgbW9kdWxlICptb2QsIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICB1bnNpZ25lZCBpbnQgaW5mb2luZGV4KQorc3RhdGljIHZvaWQgc2V0dXBfbW9kaW5mbyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKmF0dHI7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyAoYXR0ciA9IG1vZGluZm9fYXR0cnNbaV0pOyBpKyspIHsKIAkJaWYgKGF0dHItPnNldHVwKQotCQkJYXR0ci0+c2V0dXAobW9kLAotCQkJCSAgICBnZXRfbW9kaW5mbyhzZWNoZHJzLAotCQkJCQkJaW5mb2luZGV4LAotCQkJCQkJYXR0ci0+YXR0ci5uYW1lKSk7CisJCQlhdHRyLT5zZXR1cChtb2QsIGdldF9tb2RpbmZvKGluZm8sIGF0dHItPmF0dHIubmFtZSkpOwogCX0KIH0KIApAQCAtMTg3NCwxMSArMTg5MywxMCBAQAogfQogCiAvKiBBcyBwZXIgbm0gKi8KLXN0YXRpYyBjaGFyIGVsZl90eXBlKGNvbnN0IEVsZl9TeW0gKnN5bSwKLQkJICAgICBFbGZfU2hkciAqc2VjaGRycywKLQkJICAgICBjb25zdCBjaGFyICpzZWNzdHJpbmdzLAotCQkgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBjaGFyIGVsZl90eXBlKGNvbnN0IEVsZl9TeW0gKnN5bSwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKIHsKKwljb25zdCBFbGZfU2hkciAqc2VjaGRycyA9IGluZm8tPnNlY2hkcnM7CisKIAlpZiAoRUxGX1NUX0JJTkQoc3ltLT5zdF9pbmZvKSA9PSBTVEJfV0VBSykgewogCQlpZiAoRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZvKSA9PSBTVFRfT0JKRUNUKQogCQkJcmV0dXJuICd2JzsKQEAgLTE5MDgsOCArMTkyNiwxMCBAQAogCQllbHNlCiAJCQlyZXR1cm4gJ2InOwogCX0KLQlpZiAoc3Ryc3RhcnRzKHNlY3N0cmluZ3MgKyBzZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX25hbWUsICIuZGVidWciKSkKKwlpZiAoc3Ryc3RhcnRzKGluZm8tPnNlY3N0cmluZ3MgKyBzZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX25hbWUsCisJCSAgICAgICIuZGVidWciKSkgewogCQlyZXR1cm4gJ24nOworCX0KIAlyZXR1cm4gJz8nOwogfQogCkBAIC0xOTM0LDEyNyArMTk1NCw5NiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwKLQkJCQkgICBFbGZfU2hkciAqc2VjaGRycywKLQkJCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCQkJICAgdW5zaWduZWQgaW50IHN0cmluZGV4LAotCQkJCSAgIGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCQkJICAgY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKLQkJCQkgICB1bnNpZ25lZCBsb25nICpwc3Ryb2ZmcywKLQkJCQkgICB1bnNpZ25lZCBsb25nICpzdHJtYXApCitzdGF0aWMgdm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBsb25nIHN5bW9mZnM7Ci0JRWxmX1NoZHIgKnN5bXNlY3QgPSBzZWNoZHJzICsgc3ltaW5kZXg7Ci0JRWxmX1NoZHIgKnN0cnNlY3QgPSBzZWNoZHJzICsgc3RyaW5kZXg7CisJRWxmX1NoZHIgKnN5bXNlY3QgPSBpbmZvLT5zZWNoZHJzICsgaW5mby0+aW5kZXguc3ltOworCUVsZl9TaGRyICpzdHJzZWN0ID0gaW5mby0+c2VjaGRycyArIGluZm8tPmluZGV4LnN0cjsKIAljb25zdCBFbGZfU3ltICpzcmM7Ci0JY29uc3QgY2hhciAqc3RydGFiOwogCXVuc2lnbmVkIGludCBpLCBuc3JjLCBuZHN0OwogCiAJLyogUHV0IHN5bWJvbCBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9kdWxlLiAqLwogCXN5bXNlY3QtPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKIAlzeW1zZWN0LT5zaF9lbnRzaXplID0gZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfc2l6ZSwgc3ltc2VjdCwKLQkJCQkJIHN5bWluZGV4KSB8IElOSVRfT0ZGU0VUX01BU0s7Ci0JREVCVUdQKCJcdCVzXG4iLCBzZWNzdHJpbmdzICsgc3ltc2VjdC0+c2hfbmFtZSk7CisJCQkJCSBpbmZvLT5pbmRleC5zeW0pIHwgSU5JVF9PRkZTRVRfTUFTSzsKKwlERUJVR1AoIlx0JXNcbiIsIGluZm8tPnNlY3N0cmluZ3MgKyBzeW1zZWN0LT5zaF9uYW1lKTsKIAotCXNyYyA9ICh2b2lkICopaGRyICsgc3ltc2VjdC0+c2hfb2Zmc2V0OworCXNyYyA9ICh2b2lkICopaW5mby0+aGRyICsgc3ltc2VjdC0+c2hfb2Zmc2V0OwogCW5zcmMgPSBzeW1zZWN0LT5zaF9zaXplIC8gc2l6ZW9mKCpzcmMpOwotCXN0cnRhYiA9ICh2b2lkICopaGRyICsgc3Ryc2VjdC0+c2hfb2Zmc2V0OwogCWZvciAobmRzdCA9IGkgPSAxOyBpIDwgbnNyYzsgKytpLCArK3NyYykKLQkJaWYgKGlzX2NvcmVfc3ltYm9sKHNyYywgc2VjaGRycywgaGRyLT5lX3NobnVtKSkgeworCQlpZiAoaXNfY29yZV9zeW1ib2woc3JjLCBpbmZvLT5zZWNoZHJzLCBpbmZvLT5oZHItPmVfc2hudW0pKSB7CiAJCQl1bnNpZ25lZCBpbnQgaiA9IHNyYy0+c3RfbmFtZTsKIAotCQkJd2hpbGUoIV9fdGVzdF9hbmRfc2V0X2JpdChqLCBzdHJtYXApICYmIHN0cnRhYltqXSkKKwkJCXdoaWxlICghX190ZXN0X2FuZF9zZXRfYml0KGosIGluZm8tPnN0cm1hcCkKKwkJCSAgICAgICAmJiBpbmZvLT5zdHJ0YWJbal0pCiAJCQkJKytqOwogCQkJKytuZHN0OwogCQl9CiAKIAkvKiBBcHBlbmQgcm9vbSBmb3IgY29yZSBzeW1ib2xzIGF0IGVuZCBvZiBjb3JlIHBhcnQuICovCi0Jc3ltb2ZmcyA9IEFMSUdOKG1vZC0+Y29yZV9zaXplLCBzeW1zZWN0LT5zaF9hZGRyYWxpZ24gPzogMSk7Ci0JbW9kLT5jb3JlX3NpemUgPSBzeW1vZmZzICsgbmRzdCAqIHNpemVvZihFbGZfU3ltKTsKKwlpbmZvLT5zeW1vZmZzID0gQUxJR04obW9kLT5jb3JlX3NpemUsIHN5bXNlY3QtPnNoX2FkZHJhbGlnbiA/OiAxKTsKKwltb2QtPmNvcmVfc2l6ZSA9IGluZm8tPnN5bW9mZnMgKyBuZHN0ICogc2l6ZW9mKEVsZl9TeW0pOwogCiAJLyogUHV0IHN0cmluZyB0YWJsZSBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9kdWxlLiAqLwogCXN0cnNlY3QtPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKIAlzdHJzZWN0LT5zaF9lbnRzaXplID0gZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfc2l6ZSwgc3Ryc2VjdCwKLQkJCQkJIHN0cmluZGV4KSB8IElOSVRfT0ZGU0VUX01BU0s7Ci0JREVCVUdQKCJcdCVzXG4iLCBzZWNzdHJpbmdzICsgc3Ryc2VjdC0+c2hfbmFtZSk7CisJCQkJCSBpbmZvLT5pbmRleC5zdHIpIHwgSU5JVF9PRkZTRVRfTUFTSzsKKwlERUJVR1AoIlx0JXNcbiIsIGluZm8tPnNlY3N0cmluZ3MgKyBzdHJzZWN0LT5zaF9uYW1lKTsKIAogCS8qIEFwcGVuZCByb29tIGZvciBjb3JlIHN5bWJvbHMnIHN0cmluZ3MgYXQgZW5kIG9mIGNvcmUgcGFydC4gKi8KLQkqcHN0cm9mZnMgPSBtb2QtPmNvcmVfc2l6ZTsKLQlfX3NldF9iaXQoMCwgc3RybWFwKTsKLQltb2QtPmNvcmVfc2l6ZSArPSBiaXRtYXBfd2VpZ2h0KHN0cm1hcCwgc3Ryc2VjdC0+c2hfc2l6ZSk7Ci0KLQlyZXR1cm4gc3ltb2ZmczsKKwlpbmZvLT5zdHJvZmZzID0gbW9kLT5jb3JlX3NpemU7CisJX19zZXRfYml0KDAsIGluZm8tPnN0cm1hcCk7CisJbW9kLT5jb3JlX3NpemUgKz0gYml0bWFwX3dlaWdodChpbmZvLT5zdHJtYXAsIHN0cnNlY3QtPnNoX3NpemUpOwogfQogCi1zdGF0aWMgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0IG1vZHVsZSAqbW9kLAotCQkJIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJIHVuc2lnbmVkIGludCBzaG51bSwKLQkJCSB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCQkgdW5zaWduZWQgaW50IHN0cmluZGV4LAotCQkJIHVuc2lnbmVkIGxvbmcgc3ltb2ZmcywKLQkJCSB1bnNpZ25lZCBsb25nIHN0cm9mZnMsCi0JCQkgY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKLQkJCSB1bnNpZ25lZCBsb25nICpzdHJtYXApCitzdGF0aWMgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQogewogCXVuc2lnbmVkIGludCBpLCBuZHN0OwogCWNvbnN0IEVsZl9TeW0gKnNyYzsKIAlFbGZfU3ltICpkc3Q7CiAJY2hhciAqczsKKwlFbGZfU2hkciAqc3ltc2VjID0gJmluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXguc3ltXTsKIAotCW1vZC0+c3ltdGFiID0gKHZvaWQgKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyOwotCW1vZC0+bnVtX3N5bXRhYiA9IHNlY2hkcnNbc3ltaW5kZXhdLnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSk7Ci0JbW9kLT5zdHJ0YWIgPSAodm9pZCAqKXNlY2hkcnNbc3RyaW5kZXhdLnNoX2FkZHI7CisJbW9kLT5zeW10YWIgPSAodm9pZCAqKXN5bXNlYy0+c2hfYWRkcjsKKwltb2QtPm51bV9zeW10YWIgPSBzeW1zZWMtPnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSk7CisJLyogTWFrZSBzdXJlIHdlIGdldCBwZXJtYW5lbnQgc3RydGFiOiBkb24ndCB1c2UgaW5mby0+c3RydGFiLiAqLworCW1vZC0+c3RydGFiID0gKHZvaWQgKilpbmZvLT5zZWNoZHJzW2luZm8tPmluZGV4LnN0cl0uc2hfYWRkcjsKIAogCS8qIFNldCB0eXBlcyB1cCB3aGlsZSB3ZSBzdGlsbCBoYXZlIGFjY2VzcyB0byBzZWN0aW9ucy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbW9kLT5udW1fc3ltdGFiOyBpKyspCi0JCW1vZC0+c3ltdGFiW2ldLnN0X2luZm8KLQkJCT0gZWxmX3R5cGUoJm1vZC0+c3ltdGFiW2ldLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCBtb2QpOworCQltb2QtPnN5bXRhYltpXS5zdF9pbmZvID0gZWxmX3R5cGUoJm1vZC0+c3ltdGFiW2ldLCBpbmZvKTsKIAotCW1vZC0+Y29yZV9zeW10YWIgPSBkc3QgPSBtb2QtPm1vZHVsZV9jb3JlICsgc3ltb2ZmczsKKwltb2QtPmNvcmVfc3ltdGFiID0gZHN0ID0gbW9kLT5tb2R1bGVfY29yZSArIGluZm8tPnN5bW9mZnM7CiAJc3JjID0gbW9kLT5zeW10YWI7CiAJKmRzdCA9ICpzcmM7CiAJZm9yIChuZHN0ID0gaSA9IDE7IGkgPCBtb2QtPm51bV9zeW10YWI7ICsraSwgKytzcmMpIHsKLQkJaWYgKCFpc19jb3JlX3N5bWJvbChzcmMsIHNlY2hkcnMsIHNobnVtKSkKKwkJaWYgKCFpc19jb3JlX3N5bWJvbChzcmMsIGluZm8tPnNlY2hkcnMsIGluZm8tPmhkci0+ZV9zaG51bSkpCiAJCQljb250aW51ZTsKIAkJZHN0W25kc3RdID0gKnNyYzsKLQkJZHN0W25kc3RdLnN0X25hbWUgPSBiaXRtYXBfd2VpZ2h0KHN0cm1hcCwgZHN0W25kc3RdLnN0X25hbWUpOworCQlkc3RbbmRzdF0uc3RfbmFtZSA9IGJpdG1hcF93ZWlnaHQoaW5mby0+c3RybWFwLAorCQkJCQkJICBkc3RbbmRzdF0uc3RfbmFtZSk7CiAJCSsrbmRzdDsKIAl9CiAJbW9kLT5jb3JlX251bV9zeW1zID0gbmRzdDsKIAotCW1vZC0+Y29yZV9zdHJ0YWIgPSBzID0gbW9kLT5tb2R1bGVfY29yZSArIHN0cm9mZnM7Ci0JZm9yICgqcyA9IDAsIGkgPSAxOyBpIDwgc2VjaGRyc1tzdHJpbmRleF0uc2hfc2l6ZTsgKytpKQotCQlpZiAodGVzdF9iaXQoaSwgc3RybWFwKSkKKwltb2QtPmNvcmVfc3RydGFiID0gcyA9IG1vZC0+bW9kdWxlX2NvcmUgKyBpbmZvLT5zdHJvZmZzOworCWZvciAoKnMgPSAwLCBpID0gMTsgaSA8IGluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXguc3RyXS5zaF9zaXplOyArK2kpCisJCWlmICh0ZXN0X2JpdChpLCBpbmZvLT5zdHJtYXApKQogCQkJKisrcyA9IG1vZC0+c3RydGFiW2ldOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwKLQkJCQkJICBFbGZfU2hkciAqc2VjaGRycywKLQkJCQkJICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCQkJCSAgdW5zaWduZWQgaW50IHN0cmluZGV4LAotCQkJCQkgIGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCQkJCSAgY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKLQkJCQkJICB1bnNpZ25lZCBsb25nICpwc3Ryb2ZmcywKLQkJCQkJICB1bnNpZ25lZCBsb25nICpzdHJtYXApCitzdGF0aWMgaW5saW5lIHZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0IG1vZHVsZSAqbW9kLAotCQkJCUVsZl9TaGRyICpzZWNoZHJzLAotCQkJCXVuc2lnbmVkIGludCBzaG51bSwKLQkJCQl1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCQkJdW5zaWduZWQgaW50IHN0cmluZGV4LAotCQkJCXVuc2lnbmVkIGxvbmcgc3ltb2ZmcywKLQkJCQl1bnNpZ25lZCBsb25nIHN0cm9mZnMsCi0JCQkJY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKLQkJCQljb25zdCB1bnNpZ25lZCBsb25nICpzdHJtYXApCitzdGF0aWMgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQogewogfQogI2VuZGlmIC8qIENPTkZJR19LQUxMU1lNUyAqLwogCiBzdGF0aWMgdm9pZCBkeW5hbWljX2RlYnVnX3NldHVwKHN0cnVjdCBfZGRlYnVnICpkZWJ1ZywgdW5zaWduZWQgaW50IG51bSkKIHsKKwlpZiAoIWRlYnVnKQorCQlyZXR1cm47CiAjaWZkZWYgQ09ORklHX0RZTkFNSUNfREVCVUcKIAlpZiAoZGRlYnVnX2FkZF9tb2R1bGUoZGVidWcsIG51bSwgZGVidWctPm1vZG5hbWUpKQogCQlwcmludGsoS0VSTl9FUlIgImR5bmFtaWMgZGVidWcgZXJyb3IgYWRkaW5nIG1vZHVsZTogJXNcbiIsCkBAIC0yMDg1LDY1ICsyMDc0LDQ3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfS01FTUxFQUsKLXN0YXRpYyB2b2lkIGttZW1sZWFrX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgRWxmX0VoZHIgKmhkciwKLQkJCQkgRWxmX1NoZHIgKnNlY2hkcnMsIGNoYXIgKnNlY3N0cmluZ3MpCitzdGF0aWMgdm9pZCBrbWVtbGVha19sb2FkX21vZHVsZShjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkJIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKIAkvKiBvbmx5IHNjYW4gdGhlIHNlY3Rpb25zIGNvbnRhaW5pbmcgZGF0YSAqLwogCWttZW1sZWFrX3NjYW5fYXJlYShtb2QsIHNpemVvZihzdHJ1Y3QgbW9kdWxlKSwgR0ZQX0tFUk5FTCk7CiAKLQlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKLQkJaWYgKCEoc2VjaGRyc1tpXS5zaF9mbGFncyAmIFNIRl9BTExPQykpCisJZm9yIChpID0gMTsgaSA8IGluZm8tPmhkci0+ZV9zaG51bTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBpbmZvLT5zZWNzdHJpbmdzICsgaW5mby0+c2VjaGRyc1tpXS5zaF9uYW1lOworCQlpZiAoIShpbmZvLT5zZWNoZHJzW2ldLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoc3RybmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmRhdGEiLCA1KSAhPSAwCi0JCSAgICAmJiBzdHJuY21wKHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUsICIuYnNzIiwgNCkgIT0gMCkKKwkJaWYgKCFzdHJzdGFydHMobmFtZSwgIi5kYXRhIikgJiYgIXN0cnN0YXJ0cyhuYW1lLCAiLmJzcyIpKQogCQkJY29udGludWU7CiAKLQkJa21lbWxlYWtfc2Nhbl9hcmVhKCh2b2lkICopc2VjaGRyc1tpXS5zaF9hZGRyLAotCQkJCSAgIHNlY2hkcnNbaV0uc2hfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWttZW1sZWFrX3NjYW5fYXJlYSgodm9pZCAqKWluZm8tPnNlY2hkcnNbaV0uc2hfYWRkciwKKwkJCQkgICBpbmZvLT5zZWNoZHJzW2ldLnNoX3NpemUsIEdGUF9LRVJORUwpOwogCX0KIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQga21lbWxlYWtfbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBFbGZfRWhkciAqaGRyLAotCQkJCQlFbGZfU2hkciAqc2VjaGRycywgY2hhciAqc2Vjc3RyaW5ncykKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtbGVha19sb2FkX21vZHVsZShjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkJCWNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiB9CiAjZW5kaWYKIAotLyogQWxsb2NhdGUgYW5kIGxvYWQgdGhlIG1vZHVsZTogbm90ZSB0aGF0IHNpemUgb2Ygc2VjdGlvbiAwIGlzIGFsd2F5cwotICAgemVybywgYW5kIHdlIHJlbHkgb24gdGhpcyBmb3Igb3B0aW9uYWwgc2VjdGlvbnMuICovCi1zdGF0aWMgbm9pbmxpbmUgc3RydWN0IG1vZHVsZSAqbG9hZF9tb2R1bGUodm9pZCBfX3VzZXIgKnVtb2QsCi0JCQkJICB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCQkgIGNvbnN0IGNoYXIgX191c2VyICp1YXJncykKKy8qIFNldHMgaW5mby0+aGRyIGFuZCBpbmZvLT5sZW4uICovCitzdGF0aWMgaW50IGNvcHlfYW5kX2NoZWNrKHN0cnVjdCBsb2FkX2luZm8gKmluZm8sCisJCQkgIGNvbnN0IHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSAgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzKQogeworCWludCBlcnI7CiAJRWxmX0VoZHIgKmhkcjsKLQlFbGZfU2hkciAqc2VjaGRyczsKLQljaGFyICpzZWNzdHJpbmdzLCAqYXJncywgKm1vZG1hZ2ljLCAqc3RydGFiID0gTlVMTDsKLQljaGFyICpzdGFnaW5nOwotCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGludCBzeW1pbmRleCA9IDA7Ci0JdW5zaWduZWQgaW50IHN0cmluZGV4ID0gMDsKLQl1bnNpZ25lZCBpbnQgbW9kaW5kZXgsIHZlcnNpbmRleCwgaW5mb2luZGV4LCBwY3B1aW5kZXg7Ci0Jc3RydWN0IG1vZHVsZSAqbW9kOwotCWxvbmcgZXJyID0gMDsKLQl2b2lkICpwdHIgPSBOVUxMOyAvKiBTdG9wcyBzcHVyaW91cyBnY2Mgd2FybmluZyAqLwotCXVuc2lnbmVkIGxvbmcgc3ltb2Zmcywgc3Ryb2ZmcywgKnN0cm1hcDsKLQl2b2lkIF9fcGVyY3B1ICpwZXJjcHU7Ci0Jc3RydWN0IF9kZGVidWcgKmRlYnVnID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbnVtX2RlYnVnID0gMDsKIAotCW1tX3NlZ21lbnRfdCBvbGRfZnM7Ci0KLQlERUJVR1AoImxvYWRfbW9kdWxlOiB1bW9kPSVwLCBsZW49JWx1LCB1YXJncz0lcFxuIiwKLQkgICAgICAgdW1vZCwgbGVuLCB1YXJncyk7CiAJaWYgKGxlbiA8IHNpemVvZigqaGRyKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VYRUMpOworCQlyZXR1cm4gLUVOT0VYRUM7CiAKIAkvKiBTdWNrIGluIGVudGlyZSBmaWxlOiB3ZSdsbCB3YW50IG1vc3Qgb2YgaXQuICovCiAJLyogdm1hbGxvYyBiYXJmcyBvbiAidW51c3VhbCIgbnVtYmVycy4gIENoZWNrIGhlcmUgKi8KIAlpZiAobGVuID4gNjQgKiAxMDI0ICogMTAyNCB8fCAoaGRyID0gdm1hbGxvYyhsZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoaGRyLCB1bW9kLCBsZW4pICE9IDApIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTIxNTEsMTM1ICsyMTIyLDIyNSBAQAogCX0KIAogCS8qIFNhbml0eSBjaGVja3MgYWdhaW5zdCBpbnNtb2RpbmcgYmluYXJpZXMgb3Igd3JvbmcgYXJjaCwKLSAgICAgICAgICAgd2VpcmQgZWxmIHZlcnNpb24gKi8KKwkgICB3ZWlyZCBlbGYgdmVyc2lvbiAqLwogCWlmIChtZW1jbXAoaGRyLT5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDAKIAkgICAgfHwgaGRyLT5lX3R5cGUgIT0gRVRfUkVMCiAJICAgIHx8ICFlbGZfY2hlY2tfYXJjaChoZHIpCi0JICAgIHx8IGhkci0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mKCpzZWNoZHJzKSkgeworCSAgICB8fCBoZHItPmVfc2hlbnRzaXplICE9IHNpemVvZihFbGZfU2hkcikpIHsKIAkJZXJyID0gLUVOT0VYRUM7CiAJCWdvdG8gZnJlZV9oZHI7CiAJfQogCi0JaWYgKGxlbiA8IGhkci0+ZV9zaG9mZiArIGhkci0+ZV9zaG51bSAqIHNpemVvZihFbGZfU2hkcikpCi0JCWdvdG8gdHJ1bmNhdGVkOworCWlmIChsZW4gPCBoZHItPmVfc2hvZmYgKyBoZHItPmVfc2hudW0gKiBzaXplb2YoRWxmX1NoZHIpKSB7CisJCWVyciA9IC1FTk9FWEVDOworCQlnb3RvIGZyZWVfaGRyOworCX0KIAotCS8qIENvbnZlbmllbmNlIHZhcmlhYmxlcyAqLwotCXNlY2hkcnMgPSAodm9pZCAqKWhkciArIGhkci0+ZV9zaG9mZjsKLQlzZWNzdHJpbmdzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OwotCXNlY2hkcnNbMF0uc2hfYWRkciA9IDA7CisJaW5mby0+aGRyID0gaGRyOworCWluZm8tPmxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKIAotCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQlpZiAoc2VjaGRyc1tpXS5zaF90eXBlICE9IFNIVF9OT0JJVFMKLQkJICAgICYmIGxlbiA8IHNlY2hkcnNbaV0uc2hfb2Zmc2V0ICsgc2VjaGRyc1tpXS5zaF9zaXplKQotCQkJZ290byB0cnVuY2F0ZWQ7CitmcmVlX2hkcjoKKwl2ZnJlZShoZHIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY29weShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQoreworCXZmcmVlKGluZm8tPmhkcik7Cit9CisKK3N0YXRpYyBpbnQgcmV3cml0ZV9zZWN0aW9uX2hlYWRlcnMoc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCBidXQgbGV0J3MgYmUgc3VyZS4gKi8KKwlpbmZvLT5zZWNoZHJzWzBdLnNoX2FkZHIgPSAwOworCisJZm9yIChpID0gMTsgaSA8IGluZm8tPmhkci0+ZV9zaG51bTsgaSsrKSB7CisJCUVsZl9TaGRyICpzaGRyID0gJmluZm8tPnNlY2hkcnNbaV07CisJCWlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMKKwkJICAgICYmIGluZm8tPmxlbiA8IHNoZHItPnNoX29mZnNldCArIHNoZHItPnNoX3NpemUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTW9kdWxlIGxlbiAlbHUgdHJ1bmNhdGVkXG4iLAorCQkJICAgICAgIGluZm8tPmxlbik7CisJCQlyZXR1cm4gLUVOT0VYRUM7CisJCX0KIAogCQkvKiBNYXJrIGFsbCBzZWN0aW9ucyBzaF9hZGRyIHdpdGggdGhlaXIgYWRkcmVzcyBpbiB0aGUKIAkJICAgdGVtcG9yYXJ5IGltYWdlLiAqLwotCQlzZWNoZHJzW2ldLnNoX2FkZHIgPSAoc2l6ZV90KWhkciArIHNlY2hkcnNbaV0uc2hfb2Zmc2V0OworCQlzaGRyLT5zaF9hZGRyID0gKHNpemVfdClpbmZvLT5oZHIgKyBzaGRyLT5zaF9vZmZzZXQ7CiAKLQkJLyogSW50ZXJuYWwgc3ltYm9scyBhbmQgc3RyaW5ncy4gKi8KLQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCKSB7Ci0JCQlzeW1pbmRleCA9IGk7Ci0JCQlzdHJpbmRleCA9IHNlY2hkcnNbaV0uc2hfbGluazsKLQkJCXN0cnRhYiA9IChjaGFyICopaGRyICsgc2VjaGRyc1tzdHJpbmRleF0uc2hfb2Zmc2V0OwotCQl9CiAjaWZuZGVmIENPTkZJR19NT0RVTEVfVU5MT0FECiAJCS8qIERvbid0IGxvYWQgLmV4aXQgc2VjdGlvbnMgKi8KLQkJaWYgKHN0cnN0YXJ0cyhzZWNzdHJpbmdzK3NlY2hkcnNbaV0uc2hfbmFtZSwgIi5leGl0IikpCi0JCQlzZWNoZHJzW2ldLnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CisJCWlmIChzdHJzdGFydHMoaW5mby0+c2Vjc3RyaW5ncytzaGRyLT5zaF9uYW1lLCAiLmV4aXQiKSkKKwkJCXNoZHItPnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CiAjZW5kaWYKIAl9CiAKLQltb2RpbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywKLQkJCSAgICAiLmdudS5saW5rb25jZS50aGlzX21vZHVsZSIpOwotCWlmICghbW9kaW5kZXgpIHsKKwkvKiBUcmFjayBidXQgZG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqLworCWluZm8tPmluZGV4LnZlcnMgPSBmaW5kX3NlYyhpbmZvLCAiX192ZXJzaW9ucyIpOworCWluZm8tPmluZGV4LmluZm8gPSBmaW5kX3NlYyhpbmZvLCAiLm1vZGluZm8iKTsKKwlpbmZvLT5zZWNoZHJzW2luZm8tPmluZGV4LmluZm9dLnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CisJaW5mby0+c2VjaGRyc1tpbmZvLT5pbmRleC52ZXJzXS5zaF9mbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHVwIG91ciBiYXNpYyBjb252ZW5pZW5jZSB2YXJpYWJsZXMgKHBvaW50ZXJzIHRvIHNlY3Rpb24gaGVhZGVycywKKyAqIHNlYXJjaCBmb3IgbW9kdWxlIHNlY3Rpb24gaW5kZXggZXRjKSwgYW5kIGRvIHNvbWUgYmFzaWMgc2VjdGlvbgorICogdmVyaWZpY2F0aW9uLgorICoKKyAqIFJldHVybiB0aGUgdGVtcG9yYXJ5IG1vZHVsZSBwb2ludGVyICh3ZSdsbCByZXBsYWNlIGl0IHdpdGggdGhlIGZpbmFsCisgKiBvbmUgd2hlbiB3ZSBtb3ZlIHRoZSBtb2R1bGUgc2VjdGlvbnMgYXJvdW5kKS4KKyAqLworc3RhdGljIHN0cnVjdCBtb2R1bGUgKnNldHVwX2xvYWRfaW5mbyhzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCisJLyogU2V0IHVwIHRoZSBjb252ZW5pZW5jZSB2YXJpYWJsZXMgKi8KKwlpbmZvLT5zZWNoZHJzID0gKHZvaWQgKilpbmZvLT5oZHIgKyBpbmZvLT5oZHItPmVfc2hvZmY7CisJaW5mby0+c2Vjc3RyaW5ncyA9ICh2b2lkICopaW5mby0+aGRyCisJCSsgaW5mby0+c2VjaGRyc1tpbmZvLT5oZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKKworCWVyciA9IHJld3JpdGVfc2VjdGlvbl9oZWFkZXJzKGluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwkvKiBGaW5kIGludGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3MuICovCisJZm9yIChpID0gMTsgaSA8IGluZm8tPmhkci0+ZV9zaG51bTsgaSsrKSB7CisJCWlmIChpbmZvLT5zZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQikgeworCQkJaW5mby0+aW5kZXguc3ltID0gaTsKKwkJCWluZm8tPmluZGV4LnN0ciA9IGluZm8tPnNlY2hkcnNbaV0uc2hfbGluazsKKwkJCWluZm8tPnN0cnRhYiA9IChjaGFyICopaW5mby0+aGRyCisJCQkJKyBpbmZvLT5zZWNoZHJzW2luZm8tPmluZGV4LnN0cl0uc2hfb2Zmc2V0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpbmZvLT5pbmRleC5tb2QgPSBmaW5kX3NlYyhpbmZvLCAiLmdudS5saW5rb25jZS50aGlzX21vZHVsZSIpOworCWlmICghaW5mby0+aW5kZXgubW9kKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIG1vZHVsZSBmb3VuZCBpbiBvYmplY3RcbiIpOwotCQllcnIgPSAtRU5PRVhFQzsKLQkJZ290byBmcmVlX2hkcjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VYRUMpOwogCX0KIAkvKiBUaGlzIGlzIHRlbXBvcmFyeTogcG9pbnQgbW9kIGludG8gY29weSBvZiBkYXRhLiAqLwotCW1vZCA9ICh2b2lkICopc2VjaGRyc1ttb2RpbmRleF0uc2hfYWRkcjsKKwltb2QgPSAodm9pZCAqKWluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXgubW9kXS5zaF9hZGRyOwogCi0JaWYgKHN5bWluZGV4ID09IDApIHsKKwlpZiAoaW5mby0+aW5kZXguc3ltID09IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1vZHVsZSBoYXMgbm8gc3ltYm9scyAoc3RyaXBwZWQ/KVxuIiwKIAkJICAgICAgIG1vZC0+bmFtZSk7Ci0JCWVyciA9IC1FTk9FWEVDOwotCQlnb3RvIGZyZWVfaGRyOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRVhFQyk7CiAJfQogCi0JdmVyc2luZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX192ZXJzaW9ucyIpOwotCWluZm9pbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIi5tb2RpbmZvIik7Ci0JcGNwdWluZGV4ID0gZmluZF9wY3B1c2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncyk7Ci0KLQkvKiBEb24ndCBrZWVwIG1vZGluZm8gYW5kIHZlcnNpb24gc2VjdGlvbnMuICovCi0Jc2VjaGRyc1tpbmZvaW5kZXhdLnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7Ci0Jc2VjaGRyc1t2ZXJzaW5kZXhdLnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CisJaW5mby0+aW5kZXgucGNwdSA9IGZpbmRfcGNwdXNlYyhpbmZvKTsKIAogCS8qIENoZWNrIG1vZHVsZSBzdHJ1Y3QgdmVyc2lvbiBub3csIGJlZm9yZSB3ZSB0cnkgdG8gdXNlIG1vZHVsZS4gKi8KLQlpZiAoIWNoZWNrX21vZHN0cnVjdF92ZXJzaW9uKHNlY2hkcnMsIHZlcnNpbmRleCwgbW9kKSkgewotCQllcnIgPSAtRU5PRVhFQzsKLQkJZ290byBmcmVlX2hkcjsKLQl9CisJaWYgKCFjaGVja19tb2RzdHJ1Y3RfdmVyc2lvbihpbmZvLT5zZWNoZHJzLCBpbmZvLT5pbmRleC52ZXJzLCBtb2QpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRVhFQyk7CiAKLQltb2RtYWdpYyA9IGdldF9tb2RpbmZvKHNlY2hkcnMsIGluZm9pbmRleCwgInZlcm1hZ2ljIik7CisJcmV0dXJuIG1vZDsKK30KKworc3RhdGljIGludCBjaGVja19tb2RpbmZvKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKK3sKKwljb25zdCBjaGFyICptb2RtYWdpYyA9IGdldF9tb2RpbmZvKGluZm8sICJ2ZXJtYWdpYyIpOworCWludCBlcnI7CisKIAkvKiBUaGlzIGlzIGFsbG93ZWQ6IG1vZHByb2JlIC0tZm9yY2Ugd2lsbCBpbnZhbGlkYXRlIGl0LiAqLwogCWlmICghbW9kbWFnaWMpIHsKIAkJZXJyID0gdHJ5X3RvX2ZvcmNlX2xvYWQobW9kLCAiYmFkIHZlcm1hZ2ljIik7CiAJCWlmIChlcnIpCi0JCQlnb3RvIGZyZWVfaGRyOwotCX0gZWxzZSBpZiAoIXNhbWVfbWFnaWMobW9kbWFnaWMsIHZlcm1hZ2ljLCB2ZXJzaW5kZXgpKSB7CisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoIXNhbWVfbWFnaWMobW9kbWFnaWMsIHZlcm1hZ2ljLCBpbmZvLT5pbmRleC52ZXJzKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiB2ZXJzaW9uIG1hZ2ljICclcycgc2hvdWxkIGJlICclcydcbiIsCiAJCSAgICAgICBtb2QtPm5hbWUsIG1vZG1hZ2ljLCB2ZXJtYWdpYyk7Ci0JCWVyciA9IC1FTk9FWEVDOwotCQlnb3RvIGZyZWVfaGRyOworCQlyZXR1cm4gLUVOT0VYRUM7CiAJfQogCi0Jc3RhZ2luZyA9IGdldF9tb2RpbmZvKHNlY2hkcnMsIGluZm9pbmRleCwgInN0YWdpbmciKTsKLQlpZiAoc3RhZ2luZykgeworCWlmIChnZXRfbW9kaW5mbyhpbmZvLCAic3RhZ2luZyIpKSB7CiAJCWFkZF90YWludF9tb2R1bGUobW9kLCBUQUlOVF9DUkFQKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1vZHVsZSBpcyBmcm9tIHRoZSBzdGFnaW5nIGRpcmVjdG9yeSwiCiAJCSAgICAgICAiIHRoZSBxdWFsaXR5IGlzIHVua25vd24sIHlvdSBoYXZlIGJlZW4gd2FybmVkLlxuIiwKIAkJICAgICAgIG1vZC0+bmFtZSk7CiAJfQogCi0JLyogTm93IGNvcHkgaW4gYXJncyAqLwotCWFyZ3MgPSBzdHJuZHVwX3VzZXIodWFyZ3MsIH4wVUwgPj4gMSk7Ci0JaWYgKElTX0VSUihhcmdzKSkgewotCQllcnIgPSBQVFJfRVJSKGFyZ3MpOwotCQlnb3RvIGZyZWVfaGRyOwotCX0KKwkvKiBTZXQgdXAgbGljZW5zZSBpbmZvIGJhc2VkIG9uIHRoZSBpbmZvIHNlY3Rpb24gKi8KKwlzZXRfbGljZW5zZShtb2QsIGdldF9tb2RpbmZvKGluZm8sICJsaWNlbnNlIikpOwogCi0Jc3RybWFwID0ga3phbGxvYyhCSVRTX1RPX0xPTkdTKHNlY2hkcnNbc3RyaW5kZXhdLnNoX3NpemUpCi0JCQkgKiBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOwotCWlmICghc3RybWFwKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV9tb2Q7Ci0JfQorCXJldHVybiAwOworfQogCi0JbW9kLT5zdGF0ZSA9IE1PRFVMRV9TVEFURV9DT01JTkc7CitzdGF0aWMgdm9pZCBmaW5kX21vZHVsZV9zZWN0aW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCit7CisJbW9kLT5rcCA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX19wYXJhbSIsCisJCQkgICAgICAgc2l6ZW9mKCptb2QtPmtwKSwgJm1vZC0+bnVtX2twKTsKKwltb2QtPnN5bXMgPSBzZWN0aW9uX29ianMoaW5mbywgIl9fa3N5bXRhYiIsCisJCQkJIHNpemVvZigqbW9kLT5zeW1zKSwgJm1vZC0+bnVtX3N5bXMpOworCW1vZC0+Y3JjcyA9IHNlY3Rpb25fYWRkcihpbmZvLCAiX19rY3JjdGFiIik7CisJbW9kLT5ncGxfc3ltcyA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX19rc3ltdGFiX2dwbCIsCisJCQkJICAgICBzaXplb2YoKm1vZC0+Z3BsX3N5bXMpLAorCQkJCSAgICAgJm1vZC0+bnVtX2dwbF9zeW1zKTsKKwltb2QtPmdwbF9jcmNzID0gc2VjdGlvbl9hZGRyKGluZm8sICJfX2tjcmN0YWJfZ3BsIik7CisJbW9kLT5ncGxfZnV0dXJlX3N5bXMgPSBzZWN0aW9uX29ianMoaW5mbywKKwkJCQkJICAgICJfX2tzeW10YWJfZ3BsX2Z1dHVyZSIsCisJCQkJCSAgICBzaXplb2YoKm1vZC0+Z3BsX2Z1dHVyZV9zeW1zKSwKKwkJCQkJICAgICZtb2QtPm51bV9ncGxfZnV0dXJlX3N5bXMpOworCW1vZC0+Z3BsX2Z1dHVyZV9jcmNzID0gc2VjdGlvbl9hZGRyKGluZm8sICJfX2tjcmN0YWJfZ3BsX2Z1dHVyZSIpOwogCi0JLyogQWxsb3cgYXJjaGVzIHRvIGZyb2Igc2VjdGlvbiBjb250ZW50cyBhbmQgc2l6ZXMuICAqLwotCWVyciA9IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCBtb2QpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGZyZWVfbW9kOworI2lmZGVmIENPTkZJR19VTlVTRURfU1lNQk9MUworCW1vZC0+dW51c2VkX3N5bXMgPSBzZWN0aW9uX29ianMoaW5mbywgIl9fa3N5bXRhYl91bnVzZWQiLAorCQkJCQlzaXplb2YoKm1vZC0+dW51c2VkX3N5bXMpLAorCQkJCQkmbW9kLT5udW1fdW51c2VkX3N5bXMpOworCW1vZC0+dW51c2VkX2NyY3MgPSBzZWN0aW9uX2FkZHIoaW5mbywgIl9fa2NyY3RhYl91bnVzZWQiKTsKKwltb2QtPnVudXNlZF9ncGxfc3ltcyA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX19rc3ltdGFiX3VudXNlZF9ncGwiLAorCQkJCQkgICAgc2l6ZW9mKCptb2QtPnVudXNlZF9ncGxfc3ltcyksCisJCQkJCSAgICAmbW9kLT5udW1fdW51c2VkX2dwbF9zeW1zKTsKKwltb2QtPnVudXNlZF9ncGxfY3JjcyA9IHNlY3Rpb25fYWRkcihpbmZvLCAiX19rY3JjdGFiX3VudXNlZF9ncGwiKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT05TVFJVQ1RPUlMKKwltb2QtPmN0b3JzID0gc2VjdGlvbl9vYmpzKGluZm8sICIuY3RvcnMiLAorCQkJCSAgc2l6ZW9mKCptb2QtPmN0b3JzKSwgJm1vZC0+bnVtX2N0b3JzKTsKKyNlbmRpZgogCi0JaWYgKHBjcHVpbmRleCkgewotCQkvKiBXZSBoYXZlIGEgc3BlY2lhbCBhbGxvY2F0aW9uIGZvciB0aGlzIHNlY3Rpb24uICovCi0JCWVyciA9IHBlcmNwdV9tb2RhbGxvYyhtb2QsIHNlY2hkcnNbcGNwdWluZGV4XS5zaF9zaXplLAotCQkJCSAgICAgIHNlY2hkcnNbcGNwdWluZGV4XS5zaF9hZGRyYWxpZ24pOwotCQlpZiAoZXJyKQotCQkJZ290byBmcmVlX21vZDsKLQkJc2VjaGRyc1twY3B1aW5kZXhdLnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7Ci0JfQotCS8qIEtlZXAgdGhpcyBhcm91bmQgZm9yIGZhaWx1cmUgcGF0aC4gKi8KLQlwZXJjcHUgPSBtb2RfcGVyY3B1KG1vZCk7CisjaWZkZWYgQ09ORklHX1RSQUNFUE9JTlRTCisJbW9kLT50cmFjZXBvaW50cyA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX190cmFjZXBvaW50cyIsCisJCQkJCXNpemVvZigqbW9kLT50cmFjZXBvaW50cyksCisJCQkJCSZtb2QtPm51bV90cmFjZXBvaW50cyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORworCW1vZC0+dHJhY2VfZXZlbnRzID0gc2VjdGlvbl9vYmpzKGluZm8sICJfZnRyYWNlX2V2ZW50cyIsCisJCQkJCSBzaXplb2YoKm1vZC0+dHJhY2VfZXZlbnRzKSwKKwkJCQkJICZtb2QtPm51bV90cmFjZV9ldmVudHMpOworCS8qCisJICogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFsbG9jYXRlZCBvYmplY3RzIGluIHRoZSB0cmFjZQorCSAqIGNvZGUgYW5kIG5vdCBzY2FubmluZyBpdCBsZWFkcyB0byBmYWxzZSBwb3NpdGl2ZXMuCisJICovCisJa21lbWxlYWtfc2Nhbl9hcmVhKG1vZC0+dHJhY2VfZXZlbnRzLCBzaXplb2YoKm1vZC0+dHJhY2VfZXZlbnRzKSAqCisJCQkgICBtb2QtPm51bV90cmFjZV9ldmVudHMsIEdGUF9LRVJORUwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZUUkFDRV9NQ09VTlRfUkVDT1JECisJLyogc2VjaGRyc1swXS5zaF9zaXplIGlzIGFsd2F5cyB6ZXJvICovCisJbW9kLT5mdHJhY2VfY2FsbHNpdGVzID0gc2VjdGlvbl9vYmpzKGluZm8sICJfX21jb3VudF9sb2MiLAorCQkJCQkgICAgIHNpemVvZigqbW9kLT5mdHJhY2VfY2FsbHNpdGVzKSwKKwkJCQkJICAgICAmbW9kLT5udW1fZnRyYWNlX2NhbGxzaXRlcyk7CisjZW5kaWYKIAotCS8qIERldGVybWluZSB0b3RhbCBzaXplcywgYW5kIHB1dCBvZmZzZXRzIGluIHNoX2VudHNpemUuICBGb3Igbm93Ci0JICAgdGhpcyBpcyBkb25lIGdlbmVyaWNhbGx5OyB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkKLQkgICBzcGVjaWFsIGNhc2VzIGZvciB0aGUgYXJjaGl0ZWN0dXJlcy4gKi8KLQlsYXlvdXRfc2VjdGlvbnMobW9kLCBoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MpOwotCXN5bW9mZnMgPSBsYXlvdXRfc3ltdGFiKG1vZCwgc2VjaGRycywgc3ltaW5kZXgsIHN0cmluZGV4LCBoZHIsCi0JCQkJc2Vjc3RyaW5ncywgJnN0cm9mZnMsIHN0cm1hcCk7CisJbW9kLT5leHRhYmxlID0gc2VjdGlvbl9vYmpzKGluZm8sICJfX2V4X3RhYmxlIiwKKwkJCQkgICAgc2l6ZW9mKCptb2QtPmV4dGFibGUpLCAmbW9kLT5udW1fZXhlbnRyaWVzKTsKKworCWlmIChzZWN0aW9uX2FkZHIoaW5mbywgIl9fb2JzcGFybSIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSWdub3Jpbmcgb2Jzb2xldGUgcGFyYW1ldGVyc1xuIiwKKwkJICAgICAgIG1vZC0+bmFtZSk7CisKKwlpbmZvLT5kZWJ1ZyA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX192ZXJib3NlIiwKKwkJCQkgICBzaXplb2YoKmluZm8tPmRlYnVnKSwgJmluZm8tPm51bV9kZWJ1Zyk7Cit9CisKK3N0YXRpYyBpbnQgbW92ZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQoreworCWludCBpOworCXZvaWQgKnB0cjsKIAogCS8qIERvIHRoZSBhbGxvY3MuICovCiAJcHRyID0gbW9kdWxlX2FsbG9jX3VwZGF0ZV9ib3VuZHMobW9kLT5jb3JlX3NpemUpOwpAQCAtMjI4OSwxMCArMjM1MCw5IEBACiAJICogbGVhay4KIAkgKi8KIAlrbWVtbGVha19ub3RfbGVhayhwdHIpOwotCWlmICghcHRyKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV9wZXJjcHU7Ci0JfQorCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW1lbXNldChwdHIsIDAsIG1vZC0+Y29yZV9zaXplKTsKIAltb2QtPm1vZHVsZV9jb3JlID0gcHRyOwogCkBAIC0yMzA1LDUwICsyMzY1LDQwIEBACiAJICovCiAJa21lbWxlYWtfaWdub3JlKHB0cik7CiAJaWYgKCFwdHIgJiYgbW9kLT5pbml0X3NpemUpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmcmVlX2NvcmU7CisJCW1vZHVsZV9mcmVlKG1vZCwgbW9kLT5tb2R1bGVfY29yZSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQocHRyLCAwLCBtb2QtPmluaXRfc2l6ZSk7CiAJbW9kLT5tb2R1bGVfaW5pdCA9IHB0cjsKIAogCS8qIFRyYW5zZmVyIGVhY2ggc2VjdGlvbiB3aGljaCBzcGVjaWZpZXMgU0hGX0FMTE9DICovCiAJREVCVUdQKCJmaW5hbCBzZWN0aW9uIGFkZHJlc3NlczpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5oZHItPmVfc2hudW07IGkrKykgewogCQl2b2lkICpkZXN0OworCQlFbGZfU2hkciAqc2hkciA9ICZpbmZvLT5zZWNoZHJzW2ldOwogCi0JCWlmICghKHNlY2hkcnNbaV0uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKQorCQlpZiAoIShzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykpCiAJCQljb250aW51ZTsKIAotCQlpZiAoc2VjaGRyc1tpXS5zaF9lbnRzaXplICYgSU5JVF9PRkZTRVRfTUFTSykKKwkJaWYgKHNoZHItPnNoX2VudHNpemUgJiBJTklUX09GRlNFVF9NQVNLKQogCQkJZGVzdCA9IG1vZC0+bW9kdWxlX2luaXQKLQkJCQkrIChzZWNoZHJzW2ldLnNoX2VudHNpemUgJiB+SU5JVF9PRkZTRVRfTUFTSyk7CisJCQkJKyAoc2hkci0+c2hfZW50c2l6ZSAmIH5JTklUX09GRlNFVF9NQVNLKTsKIAkJZWxzZQotCQkJZGVzdCA9IG1vZC0+bW9kdWxlX2NvcmUgKyBzZWNoZHJzW2ldLnNoX2VudHNpemU7CisJCQlkZXN0ID0gbW9kLT5tb2R1bGVfY29yZSArIHNoZHItPnNoX2VudHNpemU7CiAKLQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCQkJbWVtY3B5KGRlc3QsICh2b2lkICopc2VjaGRyc1tpXS5zaF9hZGRyLAotCQkJICAgICAgIHNlY2hkcnNbaV0uc2hfc2l6ZSk7CisJCWlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCisJCQltZW1jcHkoZGVzdCwgKHZvaWQgKilzaGRyLT5zaF9hZGRyLCBzaGRyLT5zaF9zaXplKTsKIAkJLyogVXBkYXRlIHNoX2FkZHIgdG8gcG9pbnQgdG8gY29weSBpbiBpbWFnZS4gKi8KLQkJc2VjaGRyc1tpXS5zaF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZGVzdDsKLQkJREVCVUdQKCJcdDB4JWx4ICVzXG4iLCBzZWNoZHJzW2ldLnNoX2FkZHIsIHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUpOworCQlzaGRyLT5zaF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZGVzdDsKKwkJREVCVUdQKCJcdDB4JWx4ICVzXG4iLAorCQkgICAgICAgc2hkci0+c2hfYWRkciwgaW5mby0+c2Vjc3RyaW5ncyArIHNoZHItPnNoX25hbWUpOwogCX0KLQkvKiBNb2R1bGUgaGFzIGJlZW4gbW92ZWQuICovCi0JbW9kID0gKHZvaWQgKilzZWNoZHJzW21vZGluZGV4XS5zaF9hZGRyOwotCWttZW1sZWFrX2xvYWRfbW9kdWxlKG1vZCwgaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRV9VTkxPQUQpCi0JbW9kLT5yZWZwdHIgPSBhbGxvY19wZXJjcHUoc3RydWN0IG1vZHVsZV9yZWYpOwotCWlmICghbW9kLT5yZWZwdHIpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmcmVlX2luaXQ7Ci0JfQotI2VuZGlmCi0JLyogTm93IHdlJ3ZlIG1vdmVkIG1vZHVsZSwgaW5pdGlhbGl6ZSBsaW5rZWQgbGlzdHMsIGV0Yy4gKi8KLQltb2R1bGVfdW5sb2FkX2luaXQobW9kKTsKKwlyZXR1cm4gMDsKK30KIAotCS8qIFNldCB1cCBsaWNlbnNlIGluZm8gYmFzZWQgb24gdGhlIGluZm8gc2VjdGlvbiAqLwotCXNldF9saWNlbnNlKG1vZCwgZ2V0X21vZGluZm8oc2VjaGRycywgaW5mb2luZGV4LCAibGljZW5zZSIpKTsKLQorc3RhdGljIGludCBjaGVja19tb2R1bGVfbGljZW5zZV9hbmRfdmVyc2lvbnMoc3RydWN0IG1vZHVsZSAqbW9kKQorewogCS8qCiAJICogbmRpc3dyYXBwZXIgaXMgdW5kZXIgR1BMIGJ5IGl0c2VsZiwgYnV0IGxvYWRzIHByb3ByaWV0YXJ5IG1vZHVsZXMuCiAJICogRG9uJ3QgdXNlIGFkZF90YWludF9tb2R1bGUoKSwgYXMgaXQgd291bGQgcHJldmVudCBuZGlzd3JhcHBlciBmcm9tCkBAIC0yMzYxLDc3ICsyNDExLDYgQEAKIAlpZiAoc3RyY21wKG1vZC0+bmFtZSwgImRyaXZlcmxvYWRlciIpID09IDApCiAJCWFkZF90YWludF9tb2R1bGUobW9kLCBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpOwogCi0JLyogU2V0IHVwIE1PRElORk9fQVRUUiBmaWVsZHMgKi8KLQlzZXR1cF9tb2RpbmZvKG1vZCwgc2VjaGRycywgaW5mb2luZGV4KTsKLQotCS8qIEZpeCB1cCBzeW1zLCBzbyB0aGF0IHN0X3ZhbHVlIGlzIGEgcG9pbnRlciB0byBsb2NhdGlvbi4gKi8KLQllcnIgPSBzaW1wbGlmeV9zeW1ib2xzKHNlY2hkcnMsIHN5bWluZGV4LCBzdHJ0YWIsIHZlcnNpbmRleCwgcGNwdWluZGV4LAotCQkJICAgICAgIG1vZCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gY2xlYW51cDsKLQotCS8qIE5vdyB3ZSd2ZSBnb3QgZXZlcnl0aGluZyBpbiB0aGUgZmluYWwgbG9jYXRpb25zLCB3ZSBjYW4KLQkgKiBmaW5kIG9wdGlvbmFsIHNlY3Rpb25zLiAqLwotCW1vZC0+a3AgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX19wYXJhbSIsCi0JCQkgICAgICAgc2l6ZW9mKCptb2QtPmtwKSwgJm1vZC0+bnVtX2twKTsKLQltb2QtPnN5bXMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX19rc3ltdGFiIiwKLQkJCQkgc2l6ZW9mKCptb2QtPnN5bXMpLCAmbW9kLT5udW1fc3ltcyk7Ci0JbW9kLT5jcmNzID0gc2VjdGlvbl9hZGRyKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIl9fa2NyY3RhYiIpOwotCW1vZC0+Z3BsX3N5bXMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX19rc3ltdGFiX2dwbCIsCi0JCQkJICAgICBzaXplb2YoKm1vZC0+Z3BsX3N5bXMpLAotCQkJCSAgICAgJm1vZC0+bnVtX2dwbF9zeW1zKTsKLQltb2QtPmdwbF9jcmNzID0gc2VjdGlvbl9hZGRyKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIl9fa2NyY3RhYl9ncGwiKTsKLQltb2QtPmdwbF9mdXR1cmVfc3ltcyA9IHNlY3Rpb25fb2JqcyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsCi0JCQkJCSAgICAiX19rc3ltdGFiX2dwbF9mdXR1cmUiLAotCQkJCQkgICAgc2l6ZW9mKCptb2QtPmdwbF9mdXR1cmVfc3ltcyksCi0JCQkJCSAgICAmbW9kLT5udW1fZ3BsX2Z1dHVyZV9zeW1zKTsKLQltb2QtPmdwbF9mdXR1cmVfY3JjcyA9IHNlY3Rpb25fYWRkcihoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsCi0JCQkJCSAgICAiX19rY3JjdGFiX2dwbF9mdXR1cmUiKTsKLQotI2lmZGVmIENPTkZJR19VTlVTRURfU1lNQk9MUwotCW1vZC0+dW51c2VkX3N5bXMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAotCQkJCQkiX19rc3ltdGFiX3VudXNlZCIsCi0JCQkJCXNpemVvZigqbW9kLT51bnVzZWRfc3ltcyksCi0JCQkJCSZtb2QtPm51bV91bnVzZWRfc3ltcyk7Ci0JbW9kLT51bnVzZWRfY3JjcyA9IHNlY3Rpb25fYWRkcihoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsCi0JCQkJCSJfX2tjcmN0YWJfdW51c2VkIik7Ci0JbW9kLT51bnVzZWRfZ3BsX3N5bXMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAotCQkJCQkgICAgIl9fa3N5bXRhYl91bnVzZWRfZ3BsIiwKLQkJCQkJICAgIHNpemVvZigqbW9kLT51bnVzZWRfZ3BsX3N5bXMpLAotCQkJCQkgICAgJm1vZC0+bnVtX3VudXNlZF9ncGxfc3ltcyk7Ci0JbW9kLT51bnVzZWRfZ3BsX2NyY3MgPSBzZWN0aW9uX2FkZHIoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAotCQkJCQkgICAgIl9fa2NyY3RhYl91bnVzZWRfZ3BsIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQ09OU1RSVUNUT1JTCi0JbW9kLT5jdG9ycyA9IHNlY3Rpb25fb2JqcyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsICIuY3RvcnMiLAotCQkJCSAgc2l6ZW9mKCptb2QtPmN0b3JzKSwgJm1vZC0+bnVtX2N0b3JzKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1RSQUNFUE9JTlRTCi0JbW9kLT50cmFjZXBvaW50cyA9IHNlY3Rpb25fb2JqcyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsCi0JCQkJCSJfX3RyYWNlcG9pbnRzIiwKLQkJCQkJc2l6ZW9mKCptb2QtPnRyYWNlcG9pbnRzKSwKLQkJCQkJJm1vZC0+bnVtX3RyYWNlcG9pbnRzKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCi0JbW9kLT50cmFjZV9ldmVudHMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAotCQkJCQkgIl9mdHJhY2VfZXZlbnRzIiwKLQkJCQkJIHNpemVvZigqbW9kLT50cmFjZV9ldmVudHMpLAotCQkJCQkgJm1vZC0+bnVtX3RyYWNlX2V2ZW50cyk7Ci0JLyoKLQkgKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgcG9pbnRlcnMgdG8gYWxsb2NhdGVkIG9iamVjdHMgaW4gdGhlIHRyYWNlCi0JICogY29kZSBhbmQgbm90IHNjYW5uaW5nIGl0IGxlYWRzIHRvIGZhbHNlIHBvc2l0aXZlcy4KLQkgKi8KLQlrbWVtbGVha19zY2FuX2FyZWEobW9kLT50cmFjZV9ldmVudHMsIHNpemVvZigqbW9kLT50cmFjZV9ldmVudHMpICoKLQkJCSAgIG1vZC0+bnVtX3RyYWNlX2V2ZW50cywgR0ZQX0tFUk5FTCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKLQkvKiBzZWNoZHJzWzBdLnNoX3NpemUgaXMgYWx3YXlzIHplcm8gKi8KLQltb2QtPmZ0cmFjZV9jYWxsc2l0ZXMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAotCQkJCQkgICAgICJfX21jb3VudF9sb2MiLAotCQkJCQkgICAgIHNpemVvZigqbW9kLT5mdHJhY2VfY2FsbHNpdGVzKSwKLQkJCQkJICAgICAmbW9kLT5udW1fZnRyYWNlX2NhbGxzaXRlcyk7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKIAlpZiAoKG1vZC0+bnVtX3N5bXMgJiYgIW1vZC0+Y3JjcykKIAkgICAgfHwgKG1vZC0+bnVtX2dwbF9zeW1zICYmICFtb2QtPmdwbF9jcmNzKQpAQCAtMjQ0MSw1NiArMjQyMCwxNiBAQAogCSAgICB8fCAobW9kLT5udW1fdW51c2VkX2dwbF9zeW1zICYmICFtb2QtPnVudXNlZF9ncGxfY3JjcykKICNlbmRpZgogCQkpIHsKLQkJZXJyID0gdHJ5X3RvX2ZvcmNlX2xvYWQobW9kLAotCQkJCQkibm8gdmVyc2lvbnMgZm9yIGV4cG9ydGVkIHN5bWJvbHMiKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gY2xlYW51cDsKKwkJcmV0dXJuIHRyeV90b19mb3JjZV9sb2FkKG1vZCwKKwkJCQkJICJubyB2ZXJzaW9ucyBmb3IgZXhwb3J0ZWQgc3ltYm9scyIpOwogCX0KICNlbmRpZgorCXJldHVybiAwOworfQogCi0JLyogTm93IGRvIHJlbG9jYXRpb25zLiAqLwotCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQljb25zdCBjaGFyICpzdHJ0YWIgPSAoY2hhciAqKXNlY2hkcnNbc3RyaW5kZXhdLnNoX2FkZHI7Ci0JCXVuc2lnbmVkIGludCBpbmZvID0gc2VjaGRyc1tpXS5zaF9pbmZvOwotCi0JCS8qIE5vdCBhIHZhbGlkIHJlbG9jYXRpb24gc2VjdGlvbj8gKi8KLQkJaWYgKGluZm8gPj0gaGRyLT5lX3NobnVtKQotCQkJY29udGludWU7Ci0KLQkJLyogRG9uJ3QgYm90aGVyIHdpdGggbm9uLWFsbG9jYXRlZCBzZWN0aW9ucyAqLwotCQlpZiAoIShzZWNoZHJzW2luZm9dLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX1JFTCkKLQkJCWVyciA9IGFwcGx5X3JlbG9jYXRlKHNlY2hkcnMsIHN0cnRhYiwgc3ltaW5kZXgsIGksbW9kKTsKLQkJZWxzZSBpZiAoc2VjaGRyc1tpXS5zaF90eXBlID09IFNIVF9SRUxBKQotCQkJZXJyID0gYXBwbHlfcmVsb2NhdGVfYWRkKHNlY2hkcnMsIHN0cnRhYiwgc3ltaW5kZXgsIGksCi0JCQkJCQkgbW9kKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0gIAkvKiBTZXQgdXAgYW5kIHNvcnQgZXhjZXB0aW9uIHRhYmxlICovCi0JbW9kLT5leHRhYmxlID0gc2VjdGlvbl9vYmpzKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIl9fZXhfdGFibGUiLAotCQkJCSAgICBzaXplb2YoKm1vZC0+ZXh0YWJsZSksICZtb2QtPm51bV9leGVudHJpZXMpOwotCXNvcnRfZXh0YWJsZShtb2QtPmV4dGFibGUsIG1vZC0+ZXh0YWJsZSArIG1vZC0+bnVtX2V4ZW50cmllcyk7Ci0KLQkvKiBGaW5hbGx5LCBjb3B5IHBlcmNwdSBhcmVhIG92ZXIuICovCi0JcGVyY3B1X21vZGNvcHkobW9kLCAodm9pZCAqKXNlY2hkcnNbcGNwdWluZGV4XS5zaF9hZGRyLAotCQkgICAgICAgc2VjaGRyc1twY3B1aW5kZXhdLnNoX3NpemUpOwotCi0JYWRkX2thbGxzeW1zKG1vZCwgc2VjaGRycywgaGRyLT5lX3NobnVtLCBzeW1pbmRleCwgc3RyaW5kZXgsCi0JCSAgICAgc3ltb2Zmcywgc3Ryb2Zmcywgc2Vjc3RyaW5ncywgc3RybWFwKTsKLQlrZnJlZShzdHJtYXApOwotCXN0cm1hcCA9IE5VTEw7Ci0KLQlpZiAoIW1vZC0+dGFpbnRzKQotCQlkZWJ1ZyA9IHNlY3Rpb25fb2JqcyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsICJfX3ZlcmJvc2UiLAotCQkJCSAgICAgc2l6ZW9mKCpkZWJ1ZyksICZudW1fZGVidWcpOwotCi0JZXJyID0gbW9kdWxlX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbW9kKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBjbGVhbnVwOworc3RhdGljIHZvaWQgZmx1c2hfbW9kdWxlX2ljYWNoZShjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJbW1fc2VnbWVudF90IG9sZF9mczsKIAogCS8qIGZsdXNoIHRoZSBpY2FjaGUgaW4gY29ycmVjdCBjb250ZXh0ICovCiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CkBAIC0yNTA5LDExICsyNDQ4LDE2MCBAQAogCQkJICAgKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSArIG1vZC0+Y29yZV9zaXplKTsKIAogCXNldF9mcyhvbGRfZnMpOworfQogCi0JbW9kLT5hcmdzID0gYXJnczsKLQlpZiAoc2VjdGlvbl9hZGRyKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIl9fb2JzcGFybSIpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSWdub3Jpbmcgb2Jzb2xldGUgcGFyYW1ldGVyc1xuIiwKLQkJICAgICAgIG1vZC0+bmFtZSk7CitzdGF0aWMgc3RydWN0IG1vZHVsZSAqbGF5b3V0X2FuZF9hbGxvY2F0ZShzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQoreworCS8qIE1vZHVsZSB3aXRoaW4gdGVtcG9yYXJ5IGNvcHkuICovCisJc3RydWN0IG1vZHVsZSAqbW9kOworCUVsZl9TaGRyICpwY3B1c2VjOworCWludCBlcnI7CisKKwltb2QgPSBzZXR1cF9sb2FkX2luZm8oaW5mbyk7CisJaWYgKElTX0VSUihtb2QpKQorCQlyZXR1cm4gbW9kOworCisJZXJyID0gY2hlY2tfbW9kaW5mbyhtb2QsIGluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwkvKiBBbGxvdyBhcmNoZXMgdG8gZnJvYiBzZWN0aW9uIGNvbnRlbnRzIGFuZCBzaXplcy4gICovCisJZXJyID0gbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhpbmZvLT5oZHIsIGluZm8tPnNlY2hkcnMsCisJCQkJCWluZm8tPnNlY3N0cmluZ3MsIG1vZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJcGNwdXNlYyA9ICZpbmZvLT5zZWNoZHJzW2luZm8tPmluZGV4LnBjcHVdOworCWlmIChwY3B1c2VjLT5zaF9zaXplKSB7CisJCS8qIFdlIGhhdmUgYSBzcGVjaWFsIGFsbG9jYXRpb24gZm9yIHRoaXMgc2VjdGlvbi4gKi8KKwkJZXJyID0gcGVyY3B1X21vZGFsbG9jKG1vZCwKKwkJCQkgICAgICBwY3B1c2VjLT5zaF9zaXplLCBwY3B1c2VjLT5zaF9hZGRyYWxpZ24pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCXBjcHVzZWMtPnNoX2ZsYWdzICY9IH4odW5zaWduZWQgbG9uZylTSEZfQUxMT0M7CisJfQorCisJLyogRGV0ZXJtaW5lIHRvdGFsIHNpemVzLCBhbmQgcHV0IG9mZnNldHMgaW4gc2hfZW50c2l6ZS4gIEZvciBub3cKKwkgICB0aGlzIGlzIGRvbmUgZ2VuZXJpY2FsbHk7IHRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueQorCSAgIHNwZWNpYWwgY2FzZXMgZm9yIHRoZSBhcmNoaXRlY3R1cmVzLiAqLworCWxheW91dF9zZWN0aW9ucyhtb2QsIGluZm8pOworCisJaW5mby0+c3RybWFwID0ga3phbGxvYyhCSVRTX1RPX0xPTkdTKGluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXguc3RyXS5zaF9zaXplKQorCQkJICogc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8tPnN0cm1hcCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfcGVyY3B1OworCX0KKwlsYXlvdXRfc3ltdGFiKG1vZCwgaW5mbyk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgbW92ZSB0byB0aGUgZmluYWwgcGxhY2UgKi8KKwllcnIgPSBtb3ZlX21vZHVsZShtb2QsIGluZm8pOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9zdHJtYXA7CisKKwkvKiBNb2R1bGUgaGFzIGJlZW4gY29waWVkIHRvIGl0cyBmaW5hbCBwbGFjZSBub3c6IHJldHVybiBpdC4gKi8KKwltb2QgPSAodm9pZCAqKWluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXgubW9kXS5zaF9hZGRyOworCWttZW1sZWFrX2xvYWRfbW9kdWxlKG1vZCwgaW5mbyk7CisJcmV0dXJuIG1vZDsKKworZnJlZV9zdHJtYXA6CisJa2ZyZWUoaW5mby0+c3RybWFwKTsKK2ZyZWVfcGVyY3B1OgorCXBlcmNwdV9tb2RmcmVlKG1vZCk7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogbW9kIGlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzISAqLworc3RhdGljIHZvaWQgbW9kdWxlX2RlYWxsb2NhdGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQoreworCWtmcmVlKGluZm8tPnN0cm1hcCk7CisJcGVyY3B1X21vZGZyZWUobW9kKTsKKwltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2luaXQpOworCW1vZHVsZV9mcmVlKG1vZCwgbW9kLT5tb2R1bGVfY29yZSk7Cit9CisKK3N0YXRpYyBpbnQgcG9zdF9yZWxvY2F0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKK3sKKwkvKiBTb3J0IGV4Y2VwdGlvbiB0YWJsZSBub3cgcmVsb2NhdGlvbnMgYXJlIGRvbmUuICovCisJc29ydF9leHRhYmxlKG1vZC0+ZXh0YWJsZSwgbW9kLT5leHRhYmxlICsgbW9kLT5udW1fZXhlbnRyaWVzKTsKKworCS8qIENvcHkgcmVsb2NhdGVkIHBlcmNwdSBhcmVhIG92ZXIuICovCisJcGVyY3B1X21vZGNvcHkobW9kLCAodm9pZCAqKWluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXgucGNwdV0uc2hfYWRkciwKKwkJICAgICAgIGluZm8tPnNlY2hkcnNbaW5mby0+aW5kZXgucGNwdV0uc2hfc2l6ZSk7CisKKwkvKiBTZXR1cCBrYWxsc3ltcy1zcGVjaWZpYyBmaWVsZHMuICovCisJYWRkX2thbGxzeW1zKG1vZCwgaW5mbyk7CisKKwkvKiBBcmNoLXNwZWNpZmljIG1vZHVsZSBmaW5hbGl6aW5nLiAqLworCXJldHVybiBtb2R1bGVfZmluYWxpemUoaW5mby0+aGRyLCBpbmZvLT5zZWNoZHJzLCBtb2QpOworfQorCisvKiBBbGxvY2F0ZSBhbmQgbG9hZCB0aGUgbW9kdWxlOiBub3RlIHRoYXQgc2l6ZSBvZiBzZWN0aW9uIDAgaXMgYWx3YXlzCisgICB6ZXJvLCBhbmQgd2UgcmVseSBvbiB0aGlzIGZvciBvcHRpb25hbCBzZWN0aW9ucy4gKi8KK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlICpsb2FkX21vZHVsZSh2b2lkIF9fdXNlciAqdW1vZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKnVhcmdzKQoreworCXN0cnVjdCBsb2FkX2luZm8gaW5mbyA9IHsgTlVMTCwgfTsKKwlzdHJ1Y3QgbW9kdWxlICptb2Q7CisJbG9uZyBlcnI7CisKKwlERUJVR1AoImxvYWRfbW9kdWxlOiB1bW9kPSVwLCBsZW49JWx1LCB1YXJncz0lcFxuIiwKKwkgICAgICAgdW1vZCwgbGVuLCB1YXJncyk7CisKKwkvKiBDb3B5IGluIHRoZSBibG9icyBmcm9tIHVzZXJzcGFjZSwgY2hlY2sgdGhleSBhcmUgdmFndWVseSBzYW5lLiAqLworCWVyciA9IGNvcHlfYW5kX2NoZWNrKCZpbmZvLCB1bW9kLCBsZW4sIHVhcmdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJLyogRmlndXJlIG91dCBtb2R1bGUgbGF5b3V0LCBhbmQgYWxsb2NhdGUgYWxsIHRoZSBtZW1vcnkuICovCisJbW9kID0gbGF5b3V0X2FuZF9hbGxvY2F0ZSgmaW5mbyk7CisJaWYgKElTX0VSUihtb2QpKSB7CisJCWVyciA9IFBUUl9FUlIobW9kKTsKKwkJZ290byBmcmVlX2NvcHk7CisJfQorCisJLyogTm93IG1vZHVsZSBpcyBpbiBmaW5hbCBsb2NhdGlvbiwgaW5pdGlhbGl6ZSBsaW5rZWQgbGlzdHMsIGV0Yy4gKi8KKwllcnIgPSBtb2R1bGVfdW5sb2FkX2luaXQobW9kKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfbW9kdWxlOworCisJLyogTm93IHdlJ3ZlIGdvdCBldmVyeXRoaW5nIGluIHRoZSBmaW5hbCBsb2NhdGlvbnMsIHdlIGNhbgorCSAqIGZpbmQgb3B0aW9uYWwgc2VjdGlvbnMuICovCisJZmluZF9tb2R1bGVfc2VjdGlvbnMobW9kLCAmaW5mbyk7CisKKwllcnIgPSBjaGVja19tb2R1bGVfbGljZW5zZV9hbmRfdmVyc2lvbnMobW9kKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfdW5sb2FkOworCisJLyogU2V0IHVwIE1PRElORk9fQVRUUiBmaWVsZHMgKi8KKwlzZXR1cF9tb2RpbmZvKG1vZCwgJmluZm8pOworCisJLyogRml4IHVwIHN5bXMsIHNvIHRoYXQgc3RfdmFsdWUgaXMgYSBwb2ludGVyIHRvIGxvY2F0aW9uLiAqLworCWVyciA9IHNpbXBsaWZ5X3N5bWJvbHMobW9kLCAmaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZnJlZV9tb2RpbmZvOworCisJZXJyID0gYXBwbHlfcmVsb2NhdGlvbnMobW9kLCAmaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZnJlZV9tb2RpbmZvOworCisJZXJyID0gcG9zdF9yZWxvY2F0aW9uKG1vZCwgJmluZm8pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZyZWVfbW9kaW5mbzsKKworCWZsdXNoX21vZHVsZV9pY2FjaGUobW9kKTsKKworCS8qIE5vdyBjb3B5IGluIGFyZ3MgKi8KKwltb2QtPmFyZ3MgPSBzdHJuZHVwX3VzZXIodWFyZ3MsIH4wVUwgPj4gMSk7CisJaWYgKElTX0VSUihtb2QtPmFyZ3MpKSB7CisJCWVyciA9IFBUUl9FUlIobW9kLT5hcmdzKTsKKwkJZ290byBmcmVlX2FyY2hfY2xlYW51cDsKKwl9CisKKwkvKiBNYXJrIHN0YXRlIGFzIGNvbWluZyBzbyBzdHJvbmdfdHJ5X21vZHVsZV9nZXQoKSBpZ25vcmVzIHVzLiAqLworCW1vZC0+c3RhdGUgPSBNT0RVTEVfU1RBVEVfQ09NSU5HOwogCiAJLyogTm93IHNldyBpdCBpbnRvIHRoZSBsaXN0cyBzbyB3ZSBjYW4gZ2V0IGxvY2tkZXAgYW5kIG9vcHMKIAkgKiBpbmZvIGR1cmluZyBhcmd1bWVudCBwYXJzaW5nLiAgTm9vbmUgc2hvdWxkIGFjY2VzcyB1cywgc2luY2UKQEAgLTI1MjgsOCArMjYxNiw5IEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWlmIChkZWJ1ZykKLQkJZHluYW1pY19kZWJ1Z19zZXR1cChkZWJ1ZywgbnVtX2RlYnVnKTsKKwkvKiBUaGlzIGhhcyB0byBiZSBkb25lIG9uY2Ugd2UncmUgc3VyZSBtb2R1bGUgbmFtZSBpcyB1bmlxdWUuICovCisJaWYgKCFtb2QtPnRhaW50cykKKwkJZHluYW1pY19kZWJ1Z19zZXR1cChpbmZvLmRlYnVnLCBpbmZvLm51bV9kZWJ1Zyk7CiAKIAkvKiBGaW5kIGR1cGxpY2F0ZSBzeW1ib2xzICovCiAJZXJyID0gdmVyaWZ5X2V4cG9ydF9zeW1ib2xzKG1vZCk7CkBAIC0yNTM5LDIzICsyNjI4LDIyIEBACiAJbGlzdF9hZGRfcmN1KCZtb2QtPmxpc3QsICZtb2R1bGVzKTsKIAltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAKKwkvKiBNb2R1bGUgaXMgcmVhZHkgdG8gZXhlY3V0ZTogcGFyc2luZyBhcmdzIG1heSBkbyB0aGF0LiAqLwogCWVyciA9IHBhcnNlX2FyZ3MobW9kLT5uYW1lLCBtb2QtPmFyZ3MsIG1vZC0+a3AsIG1vZC0+bnVtX2twLCBOVUxMKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byB1bmxpbms7CiAKLQllcnIgPSBtb2Rfc3lzZnNfc2V0dXAobW9kLCBtb2QtPmtwLCBtb2QtPm51bV9rcCk7CisJLyogTGluayBpbiB0byBzeWZzLiAqLworCWVyciA9IG1vZF9zeXNmc19zZXR1cChtb2QsICZpbmZvLCBtb2QtPmtwLCBtb2QtPm51bV9rcCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gdW5saW5rOwogCi0JYWRkX3NlY3RfYXR0cnMobW9kLCBoZHItPmVfc2hudW0sIHNlY3N0cmluZ3MsIHNlY2hkcnMpOwotCWFkZF9ub3Rlc19hdHRycyhtb2QsIGhkci0+ZV9zaG51bSwgc2Vjc3RyaW5ncywgc2VjaGRycyk7Ci0KLQkvKiBHZXQgcmlkIG9mIHRlbXBvcmFyeSBjb3B5ICovCi0JdmZyZWUoaGRyKTsKLQotCXRyYWNlX21vZHVsZV9sb2FkKG1vZCk7CisJLyogR2V0IHJpZCBvZiB0ZW1wb3JhcnkgY29weSBhbmQgc3RybWFwLiAqLworCWtmcmVlKGluZm8uc3RybWFwKTsKKwlmcmVlX2NvcHkoJmluZm8pOwogCiAJLyogRG9uZSEgKi8KKwl0cmFjZV9tb2R1bGVfbG9hZChtb2QpOwogCXJldHVybiBtb2Q7CiAKICB1bmxpbms6CkBAIC0yNTYzLDM1ICsyNjUxLDIzIEBACiAJLyogVW5saW5rIGNhcmVmdWxseToga2FsbHN5bXMgY291bGQgYmUgd2Fsa2luZyBsaXN0LiAqLwogCWxpc3RfZGVsX3JjdSgmbW9kLT5saXN0KTsKICBkZGVidWc6Ci0JZHluYW1pY19kZWJ1Z19yZW1vdmUoZGVidWcpOworCWlmICghbW9kLT50YWludHMpCisJCWR5bmFtaWNfZGVidWdfcmVtb3ZlKGluZm8uZGVidWcpOwogIHVubG9jazoKIAltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJc3luY2hyb25pemVfc2NoZWQoKTsKKwlrZnJlZShtb2QtPmFyZ3MpOworIGZyZWVfYXJjaF9jbGVhbnVwOgogCW1vZHVsZV9hcmNoX2NsZWFudXAobW9kKTsKLSBjbGVhbnVwOgorIGZyZWVfbW9kaW5mbzoKIAlmcmVlX21vZGluZm8obW9kKTsKKyBmcmVlX3VubG9hZDoKIAltb2R1bGVfdW5sb2FkX2ZyZWUobW9kKTsKLSNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVfVU5MT0FEKQotCWZyZWVfcGVyY3B1KG1vZC0+cmVmcHRyKTsKLSBmcmVlX2luaXQ6Ci0jZW5kaWYKLQltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2luaXQpOwotIGZyZWVfY29yZToKLQltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2NvcmUpOwotCS8qIG1vZCB3aWxsIGJlIGZyZWVkIHdpdGggY29yZS4gRG9uJ3QgYWNjZXNzIGl0IGJleW9uZCB0aGlzIGxpbmUhICovCi0gZnJlZV9wZXJjcHU6Ci0JZnJlZV9wZXJjcHUocGVyY3B1KTsKLSBmcmVlX21vZDoKLQlrZnJlZShhcmdzKTsKLQlrZnJlZShzdHJtYXApOwotIGZyZWVfaGRyOgotCXZmcmVlKGhkcik7CisgZnJlZV9tb2R1bGU6CisJbW9kdWxlX2RlYWxsb2NhdGUobW9kLCAmaW5mbyk7CisgZnJlZV9jb3B5OgorCWZyZWVfY29weSgmaW5mbyk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQotIHRydW5jYXRlZDoKLQlwcmludGsoS0VSTl9FUlIgIk1vZHVsZSBsZW4gJWx1IHRydW5jYXRlZFxuIiwgbGVuKTsKLQllcnIgPSAtRU5PRVhFQzsKLQlnb3RvIGZyZWVfaGRyOwogfQogCiAvKiBDYWxsIG1vZHVsZSBjb25zdHJ1Y3RvcnMuICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFkYXRhLmMgYi9rZXJuZWwvcGFkYXRhLmMKaW5kZXggZmRkOGFlNi4uNzUxMDE5NCAxMDA2NDQKLS0tIGEva2VybmVsL3BhZGF0YS5jCisrKyBiL2tlcm5lbC9wYWRhdGEuYwpAQCAtMjYsMTggKzI2LDE5IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKLSNkZWZpbmUgTUFYX1NFUV9OUiBJTlRfTUFYIC0gTlJfQ1BVUworI2RlZmluZSBNQVhfU0VRX05SIChJTlRfTUFYIC0gTlJfQ1BVUykKICNkZWZpbmUgTUFYX09CSl9OVU0gMTAwMAogCiBzdGF0aWMgaW50IHBhZGF0YV9pbmRleF90b19jcHUoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkLCBpbnQgY3B1X2luZGV4KQogewogCWludCBjcHUsIHRhcmdldF9jcHU7CiAKLQl0YXJnZXRfY3B1ID0gY3B1bWFza19maXJzdChwZC0+Y3B1bWFzayk7CisJdGFyZ2V0X2NwdSA9IGNwdW1hc2tfZmlyc3QocGQtPmNwdW1hc2sucGNwdSk7CiAJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfaW5kZXg7IGNwdSsrKQotCQl0YXJnZXRfY3B1ID0gY3B1bWFza19uZXh0KHRhcmdldF9jcHUsIHBkLT5jcHVtYXNrKTsKKwkJdGFyZ2V0X2NwdSA9IGNwdW1hc2tfbmV4dCh0YXJnZXRfY3B1LCBwZC0+Y3B1bWFzay5wY3B1KTsKIAogCXJldHVybiB0YXJnZXRfY3B1OwogfQpAQCAtNTMsMjYgKzU0LDI3IEBACiAJICogSGFzaCB0aGUgc2VxdWVuY2UgbnVtYmVycyB0byB0aGUgY3B1cyBieSB0YWtpbmcKIAkgKiBzZXFfbnIgbW9kLiBudW1iZXIgb2YgY3B1cyBpbiB1c2UuCiAJICovCi0JY3B1X2luZGV4ID0gIHBhZGF0YS0+c2VxX25yICUgY3B1bWFza193ZWlnaHQocGQtPmNwdW1hc2spOworCWNwdV9pbmRleCA9ICBwYWRhdGEtPnNlcV9uciAlIGNwdW1hc2tfd2VpZ2h0KHBkLT5jcHVtYXNrLnBjcHUpOwogCiAJcmV0dXJuIHBhZGF0YV9pbmRleF90b19jcHUocGQsIGNwdV9pbmRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBhZGF0YV9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgcGFkYXRhX3BhcmFsbGVsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnBhcmFsbGVsX3dvcmspCiB7Ci0Jc3RydWN0IHBhZGF0YV9xdWV1ZSAqcXVldWU7CisJc3RydWN0IHBhZGF0YV9wYXJhbGxlbF9xdWV1ZSAqcHF1ZXVlOwogCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKIAlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKIAlMSVNUX0hFQUQobG9jYWxfbGlzdCk7CiAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JcXVldWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBhZGF0YV9xdWV1ZSwgcHdvcmspOwotCXBkID0gcXVldWUtPnBkOworCXBxdWV1ZSA9IGNvbnRhaW5lcl9vZihwYXJhbGxlbF93b3JrLAorCQkJICAgICAgc3RydWN0IHBhZGF0YV9wYXJhbGxlbF9xdWV1ZSwgd29yayk7CisJcGQgPSBwcXVldWUtPnBkOwogCXBpbnN0ID0gcGQtPnBpbnN0OwogCi0Jc3Bpbl9sb2NrKCZxdWV1ZS0+cGFyYWxsZWwubG9jayk7Ci0JbGlzdF9yZXBsYWNlX2luaXQoJnF1ZXVlLT5wYXJhbGxlbC5saXN0LCAmbG9jYWxfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnF1ZXVlLT5wYXJhbGxlbC5sb2NrKTsKKwlzcGluX2xvY2soJnBxdWV1ZS0+cGFyYWxsZWwubG9jayk7CisJbGlzdF9yZXBsYWNlX2luaXQoJnBxdWV1ZS0+cGFyYWxsZWwubGlzdCwgJmxvY2FsX2xpc3QpOworCXNwaW5fdW5sb2NrKCZwcXVldWUtPnBhcmFsbGVsLmxvY2spOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9saXN0KSkgewogCQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YTsKQEAgLTk0LDcgKzk2LDcgQEAKICAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlCiAgKiBAcGFkYXRhOiBvYmplY3QgdG8gYmUgcGFyYWxsZWxpemVkCiAgKiBAY2JfY3B1OiBjcHUgdGhlIHNlcmlhbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gb24sCi0gKiAgICAgICAgICBtdXN0IGJlIGluIHRoZSBjcHVtYXNrIG9mIHBhZGF0YS4KKyAqICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHNlcmlhbCBjcHVtYXNrIG9mIHBhZGF0YShpLmUuIGNwdW1hc2suY2JjcHUpLgogICoKICAqIFRoZSBwYXJhbGxlbGl6YXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBydW4gd2l0aCBCSHMgb2ZmLgogICogTm90ZTogRXZlcnkgb2JqZWN0IHdoaWNoIGlzIHBhcmFsbGVsaXplZCBieSBwYWRhdGFfZG9fcGFyYWxsZWwKQEAgLTEwNCwxNSArMTA2LDE4IEBACiAJCSAgICAgICBzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YSwgaW50IGNiX2NwdSkKIHsKIAlpbnQgdGFyZ2V0X2NwdSwgZXJyOwotCXN0cnVjdCBwYWRhdGFfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBwYWRhdGFfcGFyYWxsZWxfcXVldWUgKnF1ZXVlOwogCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKIAogCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAogCXBkID0gcmN1X2RlcmVmZXJlbmNlKHBpbnN0LT5wZCk7CiAKLQllcnIgPSAwOwotCWlmICghKHBpbnN0LT5mbGFncyAmIFBBREFUQV9JTklUKSkKKwllcnIgPSAtRUlOVkFMOworCWlmICghKHBpbnN0LT5mbGFncyAmIFBBREFUQV9JTklUKSB8fCBwaW5zdC0+ZmxhZ3MgJiBQQURBVEFfSU5WQUxJRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY2JfY3B1LCBwZC0+Y3B1bWFzay5jYmNwdSkpCiAJCWdvdG8gb3V0OwogCiAJZXJyID0gIC1FQlVTWTsKQEAgLTEyMiwxMSArMTI3LDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJnBkLT5yZWZjbnQpID49IE1BWF9PQkpfTlVNKQogCQlnb3RvIG91dDsKIAotCWVyciA9IC1FSU5WQUw7Ci0JaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNiX2NwdSwgcGQtPmNwdW1hc2spKQotCQlnb3RvIG91dDsKLQotCWVyciA9IC1FSU5QUk9HUkVTUzsKKwllcnIgPSAwOwogCWF0b21pY19pbmMoJnBkLT5yZWZjbnQpOwogCXBhZGF0YS0+cGQgPSBwZDsKIAlwYWRhdGEtPmNiX2NwdSA9IGNiX2NwdTsKQEAgLTEzNywxMyArMTM4LDEzIEBACiAJcGFkYXRhLT5zZXFfbnIgPSBhdG9taWNfaW5jX3JldHVybigmcGQtPnNlcV9ucik7CiAKIAl0YXJnZXRfY3B1ID0gcGFkYXRhX2NwdV9oYXNoKHBhZGF0YSk7Ci0JcXVldWUgPSBwZXJfY3B1X3B0cihwZC0+cXVldWUsIHRhcmdldF9jcHUpOworCXF1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnBxdWV1ZSwgdGFyZ2V0X2NwdSk7CiAKIAlzcGluX2xvY2soJnF1ZXVlLT5wYXJhbGxlbC5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZwYWRhdGEtPmxpc3QsICZxdWV1ZS0+cGFyYWxsZWwubGlzdCk7CiAJc3Bpbl91bmxvY2soJnF1ZXVlLT5wYXJhbGxlbC5sb2NrKTsKIAotCXF1ZXVlX3dvcmtfb24odGFyZ2V0X2NwdSwgcGluc3QtPndxLCAmcXVldWUtPnB3b3JrKTsKKwlxdWV1ZV93b3JrX29uKHRhcmdldF9jcHUsIHBpbnN0LT53cSwgJnF1ZXVlLT53b3JrKTsKIAogb3V0OgogCXJjdV9yZWFkX3VubG9ja19iaCgpOwpAQCAtMTcxLDg0ICsxNzIsNTIgQEAKICAqLwogc3RhdGljIHN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhX2dldF9uZXh0KHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKIHsKLQlpbnQgY3B1LCBudW1fY3B1cywgZW1wdHksIGNhbGNfc2VxX25yOwotCWludCBzZXFfbnIsIG5leHRfbnIsIG92ZXJydW4sIG5leHRfb3ZlcnJ1bjsKLQlzdHJ1Y3QgcGFkYXRhX3F1ZXVlICpxdWV1ZSwgKm5leHRfcXVldWU7CisJaW50IGNwdSwgbnVtX2NwdXM7CisJaW50IG5leHRfbnIsIG5leHRfaW5kZXg7CisJc3RydWN0IHBhZGF0YV9wYXJhbGxlbF9xdWV1ZSAqcXVldWUsICpuZXh0X3F1ZXVlOwogCXN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhOwogCXN0cnVjdCBwYWRhdGFfbGlzdCAqcmVvcmRlcjsKIAotCWVtcHR5ID0gMDsKLQluZXh0X25yID0gLTE7Ci0JbmV4dF9vdmVycnVuID0gMDsKLQluZXh0X3F1ZXVlID0gTlVMTDsKKwludW1fY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KHBkLT5jcHVtYXNrLnBjcHUpOwogCi0JbnVtX2NwdXMgPSBjcHVtYXNrX3dlaWdodChwZC0+Y3B1bWFzayk7CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHBlcmNwdSByZW9yZGVyIHF1ZXVlIGFuZCB0aGUgc2VxdWVuY2UKKwkgKiBudW1iZXIgb2YgdGhlIG5leHQgb2JqZWN0LgorCSAqLworCW5leHRfbnIgPSBwZC0+cHJvY2Vzc2VkOworCW5leHRfaW5kZXggPSBuZXh0X25yICUgbnVtX2NwdXM7CisJY3B1ID0gcGFkYXRhX2luZGV4X3RvX2NwdShwZCwgbmV4dF9pbmRleCk7CisJbmV4dF9xdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5wcXVldWUsIGNwdSk7CiAKLQlmb3JfZWFjaF9jcHUoY3B1LCBwZC0+Y3B1bWFzaykgewotCQlxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5xdWV1ZSwgY3B1KTsKLQkJcmVvcmRlciA9ICZxdWV1ZS0+cmVvcmRlcjsKLQotCQkvKgotCQkgKiBDYWxjdWxhdGUgdGhlIHNlcV9uciBvZiB0aGUgb2JqZWN0IHRoYXQgc2hvdWxkIGJlCi0JCSAqIG5leHQgaW4gdGhpcyByZW9yZGVyIHF1ZXVlLgotCQkgKi8KLQkJb3ZlcnJ1biA9IDA7Ci0JCWNhbGNfc2VxX25yID0gKGF0b21pY19yZWFkKCZxdWV1ZS0+bnVtX29iaikgKiBudW1fY3B1cykKLQkJCSAgICAgICArIHF1ZXVlLT5jcHVfaW5kZXg7Ci0KLQkJaWYgKHVubGlrZWx5KGNhbGNfc2VxX25yID4gcGQtPm1heF9zZXFfbnIpKSB7Ci0JCQljYWxjX3NlcV9uciA9IGNhbGNfc2VxX25yIC0gcGQtPm1heF9zZXFfbnIgLSAxOwotCQkJb3ZlcnJ1biA9IDE7Ci0JCX0KLQotCQlpZiAoIWxpc3RfZW1wdHkoJnJlb3JkZXItPmxpc3QpKSB7Ci0JCQlwYWRhdGEgPSBsaXN0X2VudHJ5KHJlb3JkZXItPmxpc3QubmV4dCwKLQkJCQkJICAgIHN0cnVjdCBwYWRhdGFfcHJpdiwgbGlzdCk7Ci0KLQkJCXNlcV9uciAgPSBwYWRhdGEtPnNlcV9ucjsKLQkJCUJVR19PTihjYWxjX3NlcV9uciAhPSBzZXFfbnIpOwotCQl9IGVsc2UgewotCQkJc2VxX25yID0gY2FsY19zZXFfbnI7Ci0JCQllbXB0eSsrOwotCQl9Ci0KLQkJaWYgKG5leHRfbnIgPCAwIHx8IHNlcV9uciA8IG5leHRfbnIKLQkJICAgIHx8IChuZXh0X292ZXJydW4gJiYgIW92ZXJydW4pKSB7Ci0JCQluZXh0X25yID0gc2VxX25yOwotCQkJbmV4dF9vdmVycnVuID0gb3ZlcnJ1bjsKLQkJCW5leHRfcXVldWUgPSBxdWV1ZTsKLQkJfQorCWlmICh1bmxpa2VseShuZXh0X25yID4gcGQtPm1heF9zZXFfbnIpKSB7CisJCW5leHRfbnIgPSBuZXh0X25yIC0gcGQtPm1heF9zZXFfbnIgLSAxOworCQluZXh0X2luZGV4ID0gbmV4dF9uciAlIG51bV9jcHVzOworCQljcHUgPSBwYWRhdGFfaW5kZXhfdG9fY3B1KHBkLCBuZXh0X2luZGV4KTsKKwkJbmV4dF9xdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5wcXVldWUsIGNwdSk7CisJCXBkLT5wcm9jZXNzZWQgPSAwOwogCX0KIAogCXBhZGF0YSA9IE5VTEw7CiAKLQlpZiAoZW1wdHkgPT0gbnVtX2NwdXMpCi0JCWdvdG8gb3V0OwotCiAJcmVvcmRlciA9ICZuZXh0X3F1ZXVlLT5yZW9yZGVyOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZyZW9yZGVyLT5saXN0KSkgewogCQlwYWRhdGEgPSBsaXN0X2VudHJ5KHJlb3JkZXItPmxpc3QubmV4dCwKIAkJCQkgICAgc3RydWN0IHBhZGF0YV9wcml2LCBsaXN0KTsKIAotCQlpZiAodW5saWtlbHkobmV4dF9vdmVycnVuKSkgewotCQkJZm9yX2VhY2hfY3B1KGNwdSwgcGQtPmNwdW1hc2spIHsKLQkJCQlxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5xdWV1ZSwgY3B1KTsKLQkJCQlhdG9taWNfc2V0KCZxdWV1ZS0+bnVtX29iaiwgMCk7Ci0JCQl9Ci0JCX0KKwkJQlVHX09OKG5leHRfbnIgIT0gcGFkYXRhLT5zZXFfbnIpOwogCiAJCXNwaW5fbG9jaygmcmVvcmRlci0+bG9jayk7CiAJCWxpc3RfZGVsX2luaXQoJnBhZGF0YS0+bGlzdCk7CiAJCWF0b21pY19kZWMoJnBkLT5yZW9yZGVyX29iamVjdHMpOwogCQlzcGluX3VubG9jaygmcmVvcmRlci0+bG9jayk7CiAKLQkJYXRvbWljX2luYygmbmV4dF9xdWV1ZS0+bnVtX29iaik7CisJCXBkLT5wcm9jZXNzZWQrKzsKIAogCQlnb3RvIG91dDsKIAl9CiAKLQlxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5xdWV1ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5wcXVldWUsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaWYgKHF1ZXVlLT5jcHVfaW5kZXggPT0gbmV4dF9xdWV1ZS0+Y3B1X2luZGV4KSB7CiAJCXBhZGF0YSA9IEVSUl9QVFIoLUVOT0RBVEEpOwogCQlnb3RvIG91dDsKQEAgLTI2Miw3ICsyMzEsNyBAQAogc3RhdGljIHZvaWQgcGFkYXRhX3Jlb3JkZXIoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKQogewogCXN0cnVjdCBwYWRhdGFfcHJpdiAqcGFkYXRhOwotCXN0cnVjdCBwYWRhdGFfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7CiAJc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBwZC0+cGluc3Q7CiAKIAkvKgpAQCAtMzAxLDEzICsyNzAsMTMgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCXF1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnF1ZXVlLCBwYWRhdGEtPmNiX2NwdSk7CisJCXNxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5zcXVldWUsIHBhZGF0YS0+Y2JfY3B1KTsKIAotCQlzcGluX2xvY2soJnF1ZXVlLT5zZXJpYWwubG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBhZGF0YS0+bGlzdCwgJnF1ZXVlLT5zZXJpYWwubGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZxdWV1ZS0+c2VyaWFsLmxvY2spOworCQlzcGluX2xvY2soJnNxdWV1ZS0+c2VyaWFsLmxvY2spOworCQlsaXN0X2FkZF90YWlsKCZwYWRhdGEtPmxpc3QsICZzcXVldWUtPnNlcmlhbC5saXN0KTsKKwkJc3Bpbl91bmxvY2soJnNxdWV1ZS0+c2VyaWFsLmxvY2spOwogCi0JCXF1ZXVlX3dvcmtfb24ocGFkYXRhLT5jYl9jcHUsIHBpbnN0LT53cSwgJnF1ZXVlLT5zd29yayk7CisJCXF1ZXVlX3dvcmtfb24ocGFkYXRhLT5jYl9jcHUsIHBpbnN0LT53cSwgJnNxdWV1ZS0+d29yayk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBkLT5sb2NrKTsKQEAgLTMzMywxOSArMzAyLDE5IEBACiAJcGFkYXRhX3Jlb3JkZXIocGQpOwogfQogCi1zdGF0aWMgdm9pZCBwYWRhdGFfc2VyaWFsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBwYWRhdGFfc2VyaWFsX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnNlcmlhbF93b3JrKQogewotCXN0cnVjdCBwYWRhdGFfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBwYWRhdGFfc2VyaWFsX3F1ZXVlICpzcXVldWU7CiAJc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwogCUxJU1RfSEVBRChsb2NhbF9saXN0KTsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlxdWV1ZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGFkYXRhX3F1ZXVlLCBzd29yayk7Ci0JcGQgPSBxdWV1ZS0+cGQ7CisJc3F1ZXVlID0gY29udGFpbmVyX29mKHNlcmlhbF93b3JrLCBzdHJ1Y3QgcGFkYXRhX3NlcmlhbF9xdWV1ZSwgd29yayk7CisJcGQgPSBzcXVldWUtPnBkOwogCi0Jc3Bpbl9sb2NrKCZxdWV1ZS0+c2VyaWFsLmxvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZxdWV1ZS0+c2VyaWFsLmxpc3QsICZsb2NhbF9saXN0KTsKLQlzcGluX3VubG9jaygmcXVldWUtPnNlcmlhbC5sb2NrKTsKKwlzcGluX2xvY2soJnNxdWV1ZS0+c2VyaWFsLmxvY2spOworCWxpc3RfcmVwbGFjZV9pbml0KCZzcXVldWUtPnNlcmlhbC5saXN0LCAmbG9jYWxfbGlzdCk7CisJc3Bpbl91bmxvY2soJnNxdWV1ZS0+c2VyaWFsLmxvY2spOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9saXN0KSkgewogCQlzdHJ1Y3QgcGFkYXRhX3ByaXYgKnBhZGF0YTsKQEAgLTM3MiwxOCArMzQxLDE4IEBACiB2b2lkIHBhZGF0YV9kb19zZXJpYWwoc3RydWN0IHBhZGF0YV9wcml2ICpwYWRhdGEpCiB7CiAJaW50IGNwdTsKLQlzdHJ1Y3QgcGFkYXRhX3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgcGFkYXRhX3BhcmFsbGVsX3F1ZXVlICpwcXVldWU7CiAJc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwogCiAJcGQgPSBwYWRhdGEtPnBkOwogCiAJY3B1ID0gZ2V0X2NwdSgpOwotCXF1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnF1ZXVlLCBjcHUpOworCXBxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5wcXVldWUsIGNwdSk7CiAKLQlzcGluX2xvY2soJnF1ZXVlLT5yZW9yZGVyLmxvY2spOworCXNwaW5fbG9jaygmcHF1ZXVlLT5yZW9yZGVyLmxvY2spOwogCWF0b21pY19pbmMoJnBkLT5yZW9yZGVyX29iamVjdHMpOwotCWxpc3RfYWRkX3RhaWwoJnBhZGF0YS0+bGlzdCwgJnF1ZXVlLT5yZW9yZGVyLmxpc3QpOwotCXNwaW5fdW5sb2NrKCZxdWV1ZS0+cmVvcmRlci5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZwYWRhdGEtPmxpc3QsICZwcXVldWUtPnJlb3JkZXIubGlzdCk7CisJc3Bpbl91bmxvY2soJnBxdWV1ZS0+cmVvcmRlci5sb2NrKTsKIAogCXB1dF9jcHUoKTsKIApAQCAtMzkxLDUyICszNjAsODkgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGFkYXRhX2RvX3NlcmlhbCk7CiAKLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbnRlcm5hbCBjcHVtYXNrIGRlcGVuZGVuZCByZXNvdXJjZXMuICovCi1zdGF0aWMgc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBhZGF0YV9hbGxvY19wZChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaykKK3N0YXRpYyBpbnQgcGFkYXRhX3NldHVwX2NwdW1hc2tzKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCwKKwkJCQkgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnBjcHVtYXNrLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY2JjcHVtYXNrKQogewotCWludCBjcHUsIGNwdV9pbmRleCwgbnVtX2NwdXM7Ci0Jc3RydWN0IHBhZGF0YV9xdWV1ZSAqcXVldWU7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJnBkLT5jcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNwdW1hc2tfYW5kKHBkLT5jcHVtYXNrLnBjcHUsIHBjcHVtYXNrLCBjcHVfYWN0aXZlX21hc2spOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJnBkLT5jcHVtYXNrLmNiY3B1LCBHRlBfS0VSTkVMKSkgeworCQlmcmVlX2NwdW1hc2tfdmFyKHBkLT5jcHVtYXNrLmNiY3B1KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY3B1bWFza19hbmQocGQtPmNwdW1hc2suY2JjcHUsIGNiY3B1bWFzaywgY3B1X2FjdGl2ZV9tYXNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19wYWRhdGFfbGlzdF9pbml0KHN0cnVjdCBwYWRhdGFfbGlzdCAqcGRfbGlzdCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmcGRfbGlzdC0+bGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnBkX2xpc3QtPmxvY2spOworfQorCisvKiBJbml0aWFsaXplIGFsbCBwZXJjcHUgcXVldWVzIHVzZWQgYnkgc2VyaWFsIHdvcmtlcnMgKi8KK3N0YXRpYyB2b2lkIHBhZGF0YV9pbml0X3NxdWV1ZXMoc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkKQoreworCWludCBjcHU7CisJc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTsKKworCWZvcl9lYWNoX2NwdShjcHUsIHBkLT5jcHVtYXNrLmNiY3B1KSB7CisJCXNxdWV1ZSA9IHBlcl9jcHVfcHRyKHBkLT5zcXVldWUsIGNwdSk7CisJCXNxdWV1ZS0+cGQgPSBwZDsKKwkJX19wYWRhdGFfbGlzdF9pbml0KCZzcXVldWUtPnNlcmlhbCk7CisJCUlOSVRfV09SSygmc3F1ZXVlLT53b3JrLCBwYWRhdGFfc2VyaWFsX3dvcmtlcik7CisJfQorfQorCisvKiBJbml0aWFsaXplIGFsbCBwZXJjcHUgcXVldWVzIHVzZWQgYnkgcGFyYWxsZWwgd29ya2VycyAqLworc3RhdGljIHZvaWQgcGFkYXRhX2luaXRfcHF1ZXVlcyhzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpCit7CisJaW50IGNwdV9pbmRleCwgbnVtX2NwdXMsIGNwdTsKKwlzdHJ1Y3QgcGFkYXRhX3BhcmFsbGVsX3F1ZXVlICpwcXVldWU7CiAKIAljcHVfaW5kZXggPSAwOworCWZvcl9lYWNoX2NwdShjcHUsIHBkLT5jcHVtYXNrLnBjcHUpIHsKKwkJcHF1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnBxdWV1ZSwgY3B1KTsKKwkJcHF1ZXVlLT5wZCA9IHBkOworCQlwcXVldWUtPmNwdV9pbmRleCA9IGNwdV9pbmRleDsKKwkJY3B1X2luZGV4Kys7CisKKwkJX19wYWRhdGFfbGlzdF9pbml0KCZwcXVldWUtPnJlb3JkZXIpOworCQlfX3BhZGF0YV9saXN0X2luaXQoJnBxdWV1ZS0+cGFyYWxsZWwpOworCQlJTklUX1dPUksoJnBxdWV1ZS0+d29yaywgcGFkYXRhX3BhcmFsbGVsX3dvcmtlcik7CisJCWF0b21pY19zZXQoJnBxdWV1ZS0+bnVtX29iaiwgMCk7CisJfQorCisJbnVtX2NwdXMgPSBjcHVtYXNrX3dlaWdodChwZC0+Y3B1bWFzay5wY3B1KTsKKwlwZC0+bWF4X3NlcV9uciA9IG51bV9jcHVzID8gKE1BWF9TRVFfTlIgLyBudW1fY3B1cykgKiBudW1fY3B1cyAtIDEgOiAwOworfQorCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgY3B1bWFzayBkZXBlbmRlbmQgcmVzb3VyY2VzLiAqLworc3RhdGljIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwYWRhdGFfYWxsb2NfcGQoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnBjcHVtYXNrLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjYmNwdW1hc2spCit7CisJc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwogCiAJcGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFyYWxsZWxfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGQpCiAJCWdvdG8gZXJyOwogCi0JcGQtPnF1ZXVlID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwYWRhdGFfcXVldWUpOwotCWlmICghcGQtPnF1ZXVlKQorCXBkLT5wcXVldWUgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBhZGF0YV9wYXJhbGxlbF9xdWV1ZSk7CisJaWYgKCFwZC0+cHF1ZXVlKQogCQlnb3RvIGVycl9mcmVlX3BkOwogCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcGQtPmNwdW1hc2ssIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycl9mcmVlX3F1ZXVlOworCXBkLT5zcXVldWUgPSBhbGxvY19wZXJjcHUoc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUpOworCWlmICghcGQtPnNxdWV1ZSkKKwkJZ290byBlcnJfZnJlZV9wcXVldWU7CisJaWYgKHBhZGF0YV9zZXR1cF9jcHVtYXNrcyhwZCwgcGNwdW1hc2ssIGNiY3B1bWFzaykgPCAwKQorCQlnb3RvIGVycl9mcmVlX3NxdWV1ZTsKIAotCWNwdW1hc2tfYW5kKHBkLT5jcHVtYXNrLCBjcHVtYXNrLCBjcHVfYWN0aXZlX21hc2spOwotCi0JZm9yX2VhY2hfY3B1KGNwdSwgcGQtPmNwdW1hc2spIHsKLQkJcXVldWUgPSBwZXJfY3B1X3B0cihwZC0+cXVldWUsIGNwdSk7Ci0KLQkJcXVldWUtPnBkID0gcGQ7Ci0KLQkJcXVldWUtPmNwdV9pbmRleCA9IGNwdV9pbmRleDsKLQkJY3B1X2luZGV4Kys7Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5yZW9yZGVyLmxpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPnBhcmFsbGVsLmxpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPnNlcmlhbC5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJnF1ZXVlLT5yZW9yZGVyLmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPnBhcmFsbGVsLmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPnNlcmlhbC5sb2NrKTsKLQotCQlJTklUX1dPUksoJnF1ZXVlLT5wd29yaywgcGFkYXRhX3BhcmFsbGVsX3dvcmtlcik7Ci0JCUlOSVRfV09SSygmcXVldWUtPnN3b3JrLCBwYWRhdGFfc2VyaWFsX3dvcmtlcik7Ci0JCWF0b21pY19zZXQoJnF1ZXVlLT5udW1fb2JqLCAwKTsKLQl9Ci0KLQludW1fY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KHBkLT5jcHVtYXNrKTsKLQlwZC0+bWF4X3NlcV9uciA9IChNQVhfU0VRX05SIC8gbnVtX2NwdXMpICogbnVtX2NwdXMgLSAxOwotCisJcGFkYXRhX2luaXRfcHF1ZXVlcyhwZCk7CisJcGFkYXRhX2luaXRfc3F1ZXVlcyhwZCk7CiAJc2V0dXBfdGltZXIoJnBkLT50aW1lciwgcGFkYXRhX3Jlb3JkZXJfdGltZXIsICh1bnNpZ25lZCBsb25nKXBkKTsKIAlhdG9taWNfc2V0KCZwZC0+c2VxX25yLCAtMSk7CiAJYXRvbWljX3NldCgmcGQtPnJlb3JkZXJfb2JqZWN0cywgMCk7CkBAIC00NDYsOCArNDUyLDEwIEBACiAKIAlyZXR1cm4gcGQ7CiAKLWVycl9mcmVlX3F1ZXVlOgotCWZyZWVfcGVyY3B1KHBkLT5xdWV1ZSk7CitlcnJfZnJlZV9zcXVldWU6CisJZnJlZV9wZXJjcHUocGQtPnNxdWV1ZSk7CitlcnJfZnJlZV9wcXVldWU6CisJZnJlZV9wZXJjcHUocGQtPnBxdWV1ZSk7CiBlcnJfZnJlZV9wZDoKIAlrZnJlZShwZCk7CiBlcnI6CkBAIC00NTYsOCArNDY0LDEwIEBACiAKIHN0YXRpYyB2b2lkIHBhZGF0YV9mcmVlX3BkKHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZCkKIHsKLQlmcmVlX2NwdW1hc2tfdmFyKHBkLT5jcHVtYXNrKTsKLQlmcmVlX3BlcmNwdShwZC0+cXVldWUpOworCWZyZWVfY3B1bWFza192YXIocGQtPmNwdW1hc2sucGNwdSk7CisJZnJlZV9jcHVtYXNrX3ZhcihwZC0+Y3B1bWFzay5jYmNwdSk7CisJZnJlZV9wZXJjcHUocGQtPnBxdWV1ZSk7CisJZnJlZV9wZXJjcHUocGQtPnNxdWV1ZSk7CiAJa2ZyZWUocGQpOwogfQogCkBAIC00NjUsMTEgKzQ3NSwxMiBAQAogc3RhdGljIHZvaWQgcGFkYXRhX2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQpCiB7CiAJaW50IGNwdTsKLQlzdHJ1Y3QgcGFkYXRhX3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgcGFkYXRhX3BhcmFsbGVsX3F1ZXVlICpwcXVldWU7CisJc3RydWN0IHBhZGF0YV9zZXJpYWxfcXVldWUgKnNxdWV1ZTsKIAotCWZvcl9lYWNoX2NwdShjcHUsIHBkLT5jcHVtYXNrKSB7Ci0JCXF1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnF1ZXVlLCBjcHUpOwotCQlmbHVzaF93b3JrKCZxdWV1ZS0+cHdvcmspOworCWZvcl9lYWNoX2NwdShjcHUsIHBkLT5jcHVtYXNrLnBjcHUpIHsKKwkJcHF1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnBxdWV1ZSwgY3B1KTsKKwkJZmx1c2hfd29yaygmcHF1ZXVlLT53b3JrKTsKIAl9CiAKIAlkZWxfdGltZXJfc3luYygmcGQtPnRpbWVyKTsKQEAgLTQ3NywxOSArNDg4LDM5IEBACiAJaWYgKGF0b21pY19yZWFkKCZwZC0+cmVvcmRlcl9vYmplY3RzKSkKIAkJcGFkYXRhX3Jlb3JkZXIocGQpOwogCi0JZm9yX2VhY2hfY3B1KGNwdSwgcGQtPmNwdW1hc2spIHsKLQkJcXVldWUgPSBwZXJfY3B1X3B0cihwZC0+cXVldWUsIGNwdSk7Ci0JCWZsdXNoX3dvcmsoJnF1ZXVlLT5zd29yayk7CisJZm9yX2VhY2hfY3B1KGNwdSwgcGQtPmNwdW1hc2suY2JjcHUpIHsKKwkJc3F1ZXVlID0gcGVyX2NwdV9wdHIocGQtPnNxdWV1ZSwgY3B1KTsKKwkJZmx1c2hfd29yaygmc3F1ZXVlLT53b3JrKTsKIAl9CiAKIAlCVUdfT04oYXRvbWljX3JlYWQoJnBkLT5yZWZjbnQpICE9IDApOwogfQogCitzdGF0aWMgdm9pZCBfX3BhZGF0YV9zdGFydChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKK3sKKwlwaW5zdC0+ZmxhZ3MgfD0gUEFEQVRBX0lOSVQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fcGFkYXRhX3N0b3Aoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpCit7CisJaWYgKCEocGluc3QtPmZsYWdzICYgUEFEQVRBX0lOSVQpKQorCQlyZXR1cm47CisKKwlwaW5zdC0+ZmxhZ3MgJj0gflBBREFUQV9JTklUOworCisJc3luY2hyb25pemVfcmN1KCk7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlwYWRhdGFfZmx1c2hfcXVldWVzKHBpbnN0LT5wZCk7CisJcHV0X29ubGluZV9jcHVzKCk7Cit9CisKIC8qIFJlcGxhY2UgdGhlIGludGVybmFsIGNvbnRyb2wgc3R1Y3R1cmUgd2l0aCBhIG5ldyBvbmUuICovCiBzdGF0aWMgdm9pZCBwYWRhdGFfcmVwbGFjZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKIAkJCSAgIHN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZF9uZXcpCiB7CiAJc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkX29sZCA9IHBpbnN0LT5wZDsKKwlpbnQgbm90aWZpY2F0aW9uX21hc2sgPSAwOwogCiAJcGluc3QtPmZsYWdzIHw9IFBBREFUQV9SRVNFVDsKIApAQCAtNDk3LDQxICs1MjgsMTYyIEBACiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAorCWlmICghY3B1bWFza19lcXVhbChwZF9vbGQtPmNwdW1hc2sucGNwdSwgcGRfbmV3LT5jcHVtYXNrLnBjcHUpKQorCQlub3RpZmljYXRpb25fbWFzayB8PSBQQURBVEFfQ1BVX1BBUkFMTEVMOworCWlmICghY3B1bWFza19lcXVhbChwZF9vbGQtPmNwdW1hc2suY2JjcHUsIHBkX25ldy0+Y3B1bWFzay5jYmNwdSkpCisJCW5vdGlmaWNhdGlvbl9tYXNrIHw9IFBBREFUQV9DUFVfU0VSSUFMOworCiAJcGFkYXRhX2ZsdXNoX3F1ZXVlcyhwZF9vbGQpOwogCXBhZGF0YV9mcmVlX3BkKHBkX29sZCk7CiAKKwlpZiAobm90aWZpY2F0aW9uX21hc2spCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBpbnN0LT5jcHVtYXNrX2NoYW5nZV9ub3RpZmllciwKKwkJCQkJICAgICBub3RpZmljYXRpb25fbWFzaywKKwkJCQkJICAgICAmcGRfbmV3LT5jcHVtYXNrKTsKKwogCXBpbnN0LT5mbGFncyAmPSB+UEFEQVRBX1JFU0VUOwogfQogCiAvKioKLSAqIHBhZGF0YV9zZXRfY3B1bWFzayAtIHNldCB0aGUgY3B1bWFzayB0aGF0IHBhZGF0YSBzaG91bGQgdXNlCisgKiBwYWRhdGFfcmVnaXN0ZXJfY3B1bWFza19ub3RpZmllciAtIFJlZ2lzdGVycyBhIG5vdGlmaWVyIHRoYXQgd2lsbCBiZSBjYWxsZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlaXRoZXIgcGNwdSBvciBjYmNwdSBvciBib3RoIGNwdW1hc2tzIGNoYW5nZS4KICAqCi0gKiBAcGluc3Q6IHBhZGF0YSBpbnN0YW5jZQotICogQGNwdW1hc2s6IHRoZSBjcHVtYXNrIHRvIHVzZQorICogQHBpbnN0OiBBIHBvaW5ldGVyIHRvIHBhZGF0YSBpbnN0YW5jZQorICogQG5ibG9jazogQSBwb2ludGVyIHRvIG5vdGlmaWVyIGJsb2NrLgogICovCi1pbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LAotCQkJY3B1bWFza192YXJfdCBjcHVtYXNrKQoraW50IHBhZGF0YV9yZWdpc3Rlcl9jcHVtYXNrX25vdGlmaWVyKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LAorCQkJCSAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2spCiB7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwotCWludCBlcnIgPSAwOworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGluc3QtPmNwdW1hc2tfY2hhbmdlX25vdGlmaWVyLAorCQkJCQkJbmJsb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wocGFkYXRhX3JlZ2lzdGVyX2NwdW1hc2tfbm90aWZpZXIpOwogCi0JbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOworLyoqCisgKiBwYWRhdGFfdW5yZWdpc3Rlcl9jcHVtYXNrX25vdGlmaWVyIC0gVW5yZWdpc3RlcnMgY3B1bWFzayBub3RpZmllcgorICogICAgICAgIHJlZ2lzdGVyZWQgZWFybGllciAgdXNpbmcgcGFkYXRhX3JlZ2lzdGVyX2NwdW1hc2tfbm90aWZpZXIKKyAqCisgKiBAcGluc3Q6IEEgcG9pbnRlciB0byBkYXRhIGluc3RhbmNlLgorICogQG5sb2NrOiBBIHBvaW50ZXIgdG8gbm90aWZpZXIgYmxvY2suCisgKi8KK2ludCBwYWRhdGFfdW5yZWdpc3Rlcl9jcHVtYXNrX25vdGlmaWVyKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LAorCQkJCSAgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaykKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigKKwkJJnBpbnN0LT5jcHVtYXNrX2NoYW5nZV9ub3RpZmllciwKKwkJbmJsb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wocGFkYXRhX3VucmVnaXN0ZXJfY3B1bWFza19ub3RpZmllcik7CiAKLQlnZXRfb25saW5lX2NwdXMoKTsKIAotCXBkID0gcGFkYXRhX2FsbG9jX3BkKHBpbnN0LCBjcHVtYXNrKTsKLQlpZiAoIXBkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworLyogSWYgY3B1bWFzayBjb250YWlucyBubyBhY3RpdmUgY3B1LCB3ZSBtYXJrIHRoZSBpbnN0YW5jZSBhcyBpbnZhbGlkLiAqLworc3RhdGljIGJvb2wgcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQoreworCWlmICghY3B1bWFza19pbnRlcnNlY3RzKGNwdW1hc2ssIGNwdV9hY3RpdmVfbWFzaykpIHsKKwkJcGluc3QtPmZsYWdzIHw9IFBBREFUQV9JTlZBTElEOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JY3B1bWFza19jb3B5KHBpbnN0LT5jcHVtYXNrLCBjcHVtYXNrKTsKKwlwaW5zdC0+ZmxhZ3MgJj0gflBBREFUQV9JTlZBTElEOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IF9fcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwKKwkJCQkgY3B1bWFza192YXJfdCBwY3B1bWFzaywKKwkJCQkgY3B1bWFza192YXJfdCBjYmNwdW1hc2spCit7CisJaW50IHZhbGlkOworCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKKworCXZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBjcHVtYXNrKTsKKwlpZiAoIXZhbGlkKSB7CisJCV9fcGFkYXRhX3N0b3AocGluc3QpOworCQlnb3RvIG91dF9yZXBsYWNlOworCX0KKworCXZhbGlkID0gcGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIGNiY3B1bWFzayk7CisJaWYgKCF2YWxpZCkKKwkJX19wYWRhdGFfc3RvcChwaW5zdCk7CisKK291dF9yZXBsYWNlOgorCXBkID0gcGFkYXRhX2FsbG9jX3BkKHBpbnN0LCBwY3B1bWFzaywgY2JjcHVtYXNrKTsKKwlpZiAoIXBkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNwdW1hc2tfY29weShwaW5zdC0+Y3B1bWFzay5wY3B1LCBwY3B1bWFzayk7CisJY3B1bWFza19jb3B5KHBpbnN0LT5jcHVtYXNrLmNiY3B1LCBjYmNwdW1hc2spOwogCiAJcGFkYXRhX3JlcGxhY2UocGluc3QsIHBkKTsKIAorCWlmICh2YWxpZCkKKwkJX19wYWRhdGFfc3RhcnQocGluc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGFkYXRhX3NldF9jcHVtYXNrcyAtIFNldCBib3RoIHBhcmFsbGVsIGFuZCBzZXJpYWwgY3B1bWFza3MuIFRoZSBmaXJzdAorICogICAgICAgICAgICAgICAgICAgICAgIG9uZSBpcyB1c2VkIGJ5IHBhcmFsbGVsIHdvcmtlcnMgYW5kIHRoZSBzZWNvbmQgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHdva2VycyBkb2luZyBzZXJpYWxpemF0aW9uLgorICoKKyAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlCisgKiBAcGNwdW1hc2s6IHRoZSBjcHVtYXNrIHRvIHVzZSBmb3IgcGFyYWxsZWwgd29ya2VycworICogQGNiY3B1bWFzazogdGhlIGNwdW1zYWsgdG8gdXNlIGZvciBzZXJpYWwgd29ya2VycworICovCitpbnQgcGFkYXRhX3NldF9jcHVtYXNrcyhzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgY3B1bWFza192YXJfdCBwY3B1bWFzaywKKwkJCWNwdW1hc2tfdmFyX3QgY2JjcHVtYXNrKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwllcnIgPSBfX3BhZGF0YV9zZXRfY3B1bWFza3MocGluc3QsIHBjcHVtYXNrLCBjYmNwdW1hc2spOworCisJcHV0X29ubGluZV9jcHVzKCk7CisJbXV0ZXhfdW5sb2NrKCZwaW5zdC0+bG9jayk7CisKKwlyZXR1cm4gZXJyOworCit9CitFWFBPUlRfU1lNQk9MKHBhZGF0YV9zZXRfY3B1bWFza3MpOworCisvKioKKyAqIHBhZGF0YV9zZXRfY3B1bWFzazogU2V0cyBzcGVjaWZpZWQgYnkgQGNwdW1hc2tfdHlwZSBjcHVtYXNrIHRvIHRoZSB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIEBjcHVtYXNrLgorICoKKyAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlCisgKiBAY3B1bWFza190eXBlOiBQQURBVEFfQ1BVX1NFUklBTCBvciBQQURBVEFfQ1BVX1BBUkFMTEVMIGNvcnJlc3BvbmRpbmcKKyAqICAgICAgICAgICAgICAgIHRvIHBhcmFsbGVsIGFuZCBzZXJpYWwgY3B1bWFza3MgcmVzcGVjdGl2ZWx5LgorICogQGNwdW1hc2s6IHRoZSBjcHVtYXNrIHRvIHVzZQorICovCitpbnQgcGFkYXRhX3NldF9jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1bWFza190eXBlLAorCQkgICAgICAgY3B1bWFza192YXJfdCBjcHVtYXNrKQoreworCXN0cnVjdCBjcHVtYXNrICpzZXJpYWxfbWFzaywgKnBhcmFsbGVsX21hc2s7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwlzd2l0Y2ggKGNwdW1hc2tfdHlwZSkgeworCWNhc2UgUEFEQVRBX0NQVV9QQVJBTExFTDoKKwkJc2VyaWFsX21hc2sgPSBwaW5zdC0+Y3B1bWFzay5jYmNwdTsKKwkJcGFyYWxsZWxfbWFzayA9IGNwdW1hc2s7CisJCWJyZWFrOworCWNhc2UgUEFEQVRBX0NQVV9TRVJJQUw6CisJCXBhcmFsbGVsX21hc2sgPSBwaW5zdC0+Y3B1bWFzay5wY3B1OworCQlzZXJpYWxfbWFzayA9IGNwdW1hc2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSBnb3RvIG91dDsKKwl9CisKKwllcnIgPSAgX19wYWRhdGFfc2V0X2NwdW1hc2tzKHBpbnN0LCBwYXJhbGxlbF9tYXNrLCBzZXJpYWxfbWFzayk7CisKIG91dDoKIAlwdXRfb25saW5lX2NwdXMoKTsKLQogCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOwogCiAJcmV0dXJuIGVycjsKQEAgLTU0MywzMCArNjk1LDQ4IEBACiAJc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOwogCiAJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVfYWN0aXZlX21hc2spKSB7Ci0JCXBkID0gcGFkYXRhX2FsbG9jX3BkKHBpbnN0LCBwaW5zdC0+Y3B1bWFzayk7CisJCXBkID0gcGFkYXRhX2FsbG9jX3BkKHBpbnN0LCBwaW5zdC0+Y3B1bWFzay5wY3B1LAorCQkJCSAgICAgcGluc3QtPmNwdW1hc2suY2JjcHUpOwogCQlpZiAoIXBkKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJcGFkYXRhX3JlcGxhY2UocGluc3QsIHBkKTsKKworCQlpZiAocGFkYXRhX3ZhbGlkYXRlX2NwdW1hc2socGluc3QsIHBpbnN0LT5jcHVtYXNrLnBjcHUpICYmCisJCSAgICBwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtPmNwdW1hc2suY2JjcHUpKQorCQkJX19wYWRhdGFfc3RhcnQocGluc3QpOwogCX0KIAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHBhZGF0YV9hZGRfY3B1IC0gYWRkIGEgY3B1IHRvIHRoZSBwYWRhdGEgY3B1bWFzaworIC8qKgorICogcGFkYXRhX2FkZF9jcHUgLSBhZGQgYSBjcHUgdG8gb25lIG9yIGJvdGgocGFyYWxsZWwgYW5kIHNlcmlhbCkKKyAqICAgICAgICAgICAgICAgICAgcGFkYXRhIGNwdW1hc2tzLgogICoKICAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlCiAgKiBAY3B1OiBjcHUgdG8gYWRkCisgKiBAbWFzazogYml0bWFzayBvZiBmbGFncyBzcGVjaWZ5aW5nIHRvIHdoaWNoIGNwdW1hc2sgQGNwdSBzaHVsZCBiZSBhZGRlZC4KKyAqICAgICAgICBUaGUgQG1hc2sgbWF5IGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorICogICAgICAgICAgUEFEQVRBX0NQVV9TRVJJQUwgICAtIHNlcmlhbCBjcHVtYXNrCisgKiAgICAgICAgICBQQURBVEFfQ1BVX1BBUkFMTEVMIC0gcGFyYWxsZWwgY3B1bWFzawogICovCi1pbnQgcGFkYXRhX2FkZF9jcHUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsIGludCBjcHUpCisKK2ludCBwYWRhdGFfYWRkX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSwgaW50IG1hc2spCiB7CiAJaW50IGVycjsKIAorCWlmICghKG1hc2sgJiAoUEFEQVRBX0NQVV9TRVJJQUwgfCBQQURBVEFfQ1BVX1BBUkFMTEVMKSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7Ci0JY3B1bWFza19zZXRfY3B1KGNwdSwgcGluc3QtPmNwdW1hc2spOworCWlmIChtYXNrICYgUEFEQVRBX0NQVV9TRVJJQUwpCisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrLmNiY3B1KTsKKwlpZiAobWFzayAmIFBBREFUQV9DUFVfUEFSQUxMRUwpCisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrLnBjcHUpOworCiAJZXJyID0gX19wYWRhdGFfYWRkX2NwdShwaW5zdCwgY3B1KTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIApAQCAtNTc4LDEwICs3NDgsMTYgQEAKIAogc3RhdGljIGludCBfX3BhZGF0YV9yZW1vdmVfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1KQogewotCXN0cnVjdCBwYXJhbGxlbF9kYXRhICpwZDsKKwlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBOVUxMOwogCiAJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVfb25saW5lX21hc2spKSB7Ci0JCXBkID0gcGFkYXRhX2FsbG9jX3BkKHBpbnN0LCBwaW5zdC0+Y3B1bWFzayk7CisKKwkJaWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtPmNwdW1hc2sucGNwdSkgfHwKKwkJICAgICFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGluc3QtPmNwdW1hc2suY2JjcHUpKQorCQkJX19wYWRhdGFfc3RvcChwaW5zdCk7CisKKwkJcGQgPSBwYWRhdGFfYWxsb2NfcGQocGluc3QsIHBpbnN0LT5jcHVtYXNrLnBjcHUsCisJCQkJICAgICBwaW5zdC0+Y3B1bWFzay5jYmNwdSk7CiAJCWlmICghcGQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNTkxLDIwICs3NjcsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBwYWRhdGFfcmVtb3ZlX2NwdSAtIHJlbW92ZSBhIGNwdSBmcm9tIHRoZSBwYWRhdGEgY3B1bWFzaworIC8qKgorICogcGFkYXRhX3JlbW92ZV9jcHUgLSByZW1vdmUgYSBjcHUgZnJvbSB0aGUgb25lIG9yIGJvdGgoc2VyaWFsIGFuZCBwYXJhbGVsbCkKKyAqICAgICAgICAgICAgICAgICAgICAgcGFkYXRhIGNwdW1hc2tzLgogICoKICAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlCiAgKiBAY3B1OiBjcHUgdG8gcmVtb3ZlCisgKiBAbWFzazogYml0bWFzayBzcGVjaWZ5aW5nIGZyb20gd2hpY2ggY3B1bWFzayBAY3B1IHNob3VsZCBiZSByZW1vdmVkCisgKiAgICAgICAgVGhlIEBtYXNrIG1heSBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKyAqICAgICAgICAgIFBBREFUQV9DUFVfU0VSSUFMICAgLSBzZXJpYWwgY3B1bWFzaworICogICAgICAgICAgUEFEQVRBX0NQVV9QQVJBTExFTCAtIHBhcmFsbGVsIGNwdW1hc2sKICAqLwotaW50IHBhZGF0YV9yZW1vdmVfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1KQoraW50IHBhZGF0YV9yZW1vdmVfY3B1KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LCBpbnQgY3B1LCBpbnQgbWFzaykKIHsKIAlpbnQgZXJyOwogCisJaWYgKCEobWFzayAmIChQQURBVEFfQ1BVX1NFUklBTCB8IFBBREFUQV9DUFVfUEFSQUxMRUwpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CiAKIAlnZXRfb25saW5lX2NwdXMoKTsKLQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrKTsKKwlpZiAobWFzayAmIFBBREFUQV9DUFVfU0VSSUFMKQorCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrLmNiY3B1KTsKKwlpZiAobWFzayAmIFBBREFUQV9DUFVfUEFSQUxMRUwpCisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgcGluc3QtPmNwdW1hc2sucGNwdSk7CisKIAllcnIgPSBfX3BhZGF0YV9yZW1vdmVfY3B1KHBpbnN0LCBjcHUpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCkBAIC02MTksMTEgKzgwNywyMCBAQAogICoKICAqIEBwaW5zdDogcGFkYXRhIGluc3RhbmNlIHRvIHN0YXJ0CiAgKi8KLXZvaWQgcGFkYXRhX3N0YXJ0KHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQoraW50IHBhZGF0YV9zdGFydChzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKIHsKKwlpbnQgZXJyID0gMDsKKwogCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKLQlwaW5zdC0+ZmxhZ3MgfD0gUEFEQVRBX0lOSVQ7CisKKwlpZiAocGluc3QtPmZsYWdzICYgUEFEQVRBX0lOVkFMSUQpCisJCWVyciA9LUVJTlZBTDsKKworCSBfX3BhZGF0YV9zdGFydChwaW5zdCk7CisKIAltdXRleF91bmxvY2soJnBpbnN0LT5sb2NrKTsKKworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHBhZGF0YV9zdGFydCk7CiAKQEAgLTYzNSwxMiArODMyLDIwIEBACiB2b2lkIHBhZGF0YV9zdG9wKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQogewogCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKLQlwaW5zdC0+ZmxhZ3MgJj0gflBBREFUQV9JTklUOworCV9fcGFkYXRhX3N0b3AocGluc3QpOwogCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOwogfQogRVhQT1JUX1NZTUJPTChwYWRhdGFfc3RvcCk7CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIGlubGluZSBpbnQgcGluc3RfaGFzX2NwdShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCwgaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrLnBjcHUpIHx8CisJCWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC0+Y3B1bWFzay5jYmNwdSk7Cit9CisKKwogc3RhdGljIGludCBwYWRhdGFfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewpAQCAtNjUzLDcgKzg1OCw3IEBACiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9PTkxJTkU6CiAJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtPmNwdW1hc2spKQorCQlpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpCiAJCQlicmVhazsKIAkJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOwogCQllcnIgPSBfX3BhZGF0YV9hZGRfY3B1KHBpbnN0LCBjcHUpOwpAQCAtNjY0LDcgKzg2OSw3IEBACiAKIAljYXNlIENQVV9ET1dOX1BSRVBBUkU6CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKLQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtPmNwdW1hc2spKQorCQlpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpCiAJCQlicmVhazsKIAkJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOwogCQllcnIgPSBfX3BhZGF0YV9yZW1vdmVfY3B1KHBpbnN0LCBjcHUpOwpAQCAtNjc1LDcgKzg4MCw3IEBACiAKIAljYXNlIENQVV9VUF9DQU5DRUxFRDoKIAljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHBpbnN0LT5jcHVtYXNrKSkKKwkJaWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKQogCQkJYnJlYWs7CiAJCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKIAkJX19wYWRhdGFfcmVtb3ZlX2NwdShwaW5zdCwgY3B1KTsKQEAgLTY4Myw3ICs4ODgsNyBAQAogCiAJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CiAJY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgotCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC0+Y3B1bWFzaykpCisJCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKIAkJCWJyZWFrOwogCQltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CiAJCV9fcGFkYXRhX2FkZF9jcHUocGluc3QsIGNwdSk7CkBAIC02OTQsMzYgKzg5OSwyMDIgQEAKIH0KICNlbmRpZgogCi0vKioKLSAqIHBhZGF0YV9hbGxvYyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgcGFkYXRhIGluc3RhbmNlCi0gKgotICogQGNwdW1hc2s6IGNwdW1hc2sgdGhhdCBwYWRhdGEgdXNlcyBmb3IgcGFyYWxsZWxpemF0aW9uCi0gKiBAd3E6IHdvcmtxdWV1ZSB0byB1c2UgZm9yIHRoZSBhbGxvY2F0ZWQgcGFkYXRhIGluc3RhbmNlCitzdGF0aWMgdm9pZCBfX3BhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQoreworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZwaW5zdC0+Y3B1X25vdGlmaWVyKTsKKyNlbmRpZgorCisJcGFkYXRhX3N0b3AocGluc3QpOworCXBhZGF0YV9mcmVlX3BkKHBpbnN0LT5wZCk7CisJZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0+Y3B1bWFzay5wY3B1KTsKKwlmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LT5jcHVtYXNrLmNiY3B1KTsKKwlrZnJlZShwaW5zdCk7Cit9CisKKyNkZWZpbmUga29iajJwaW5zdChfa29iaikJCQkJCVwKKwljb250YWluZXJfb2YoX2tvYmosIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGtvYmopCisjZGVmaW5lIGF0dHIycGVudHJ5KF9hdHRyKQkJCQkJXAorCWNvbnRhaW5lcl9vZihfYXR0ciwgc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSwgYXR0cikKKworc3RhdGljIHZvaWQgcGFkYXRhX3N5c2ZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QgPSBrb2JqMnBpbnN0KGtvYmopOworCV9fcGFkYXRhX2ZyZWUocGluc3QpOworfQorCitzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKiwgc3RydWN0IGF0dHJpYnV0ZSAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqLCBzdHJ1Y3QgYXR0cmlidXRlICosCisJCQkgY29uc3QgY2hhciAqLCBzaXplX3QpOworfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19jcHVtYXNrKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0LAorCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWYpCit7CisJc3RydWN0IGNwdW1hc2sgKmNwdW1hc2s7CisJc3NpemVfdCBsZW47CisKKwltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CisJaWYgKCFzdHJjbXAoYXR0ci0+bmFtZSwgInNlcmlhbF9jcHVtYXNrIikpCisJCWNwdW1hc2sgPSBwaW5zdC0+Y3B1bWFzay5jYmNwdTsKKwllbHNlCisJCWNwdW1hc2sgPSBwaW5zdC0+Y3B1bWFzay5wY3B1OworCisJbGVuID0gYml0bWFwX3NjbnByaW50ZihidWYsIFBBR0VfU0laRSwgY3B1bWFza19iaXRzKGNwdW1hc2spLAorCQkJICAgICAgIG5yX2NwdV9pZHMpOworCWlmIChQQUdFX1NJWkUgLSBsZW4gPCAyKQorCQlsZW4gPSAtRUlOVkFMOworCWVsc2UKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKworCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2NwdW1hc2soc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QsCisJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNwdW1hc2tfdmFyX3QgbmV3X2NwdW1hc2s7CisJc3NpemVfdCByZXQ7CisJaW50IG1hc2tfdHlwZTsKKworCWlmICghYWxsb2NfY3B1bWFza192YXIoJm5ld19jcHVtYXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBiaXRtYXBfcGFyc2UoYnVmLCBjb3VudCwgY3B1bWFza19iaXRzKG5ld19jcHVtYXNrKSwKKwkJCSAgIG5yX2NwdW1hc2tfYml0cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbWFza190eXBlID0gIXN0cmNtcChhdHRyLT5uYW1lLCAic2VyaWFsX2NwdW1hc2siKSA/CisJCVBBREFUQV9DUFVfU0VSSUFMIDogUEFEQVRBX0NQVV9QQVJBTExFTDsKKwlyZXQgPSBwYWRhdGFfc2V0X2NwdW1hc2socGluc3QsIG1hc2tfdHlwZSwgbmV3X2NwdW1hc2spOworCWlmICghcmV0KQorCQlyZXQgPSBjb3VudDsKKworb3V0OgorCWZyZWVfY3B1bWFza192YXIobmV3X2NwdW1hc2spOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUEFEQVRBX0FUVFJfUlcoX25hbWUsIF9zaG93X25hbWUsIF9zdG9yZV9uYW1lKQkJXAorCXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IF9uYW1lIyNfYXR0ciA9CQlcCisJCV9fQVRUUihfbmFtZSwgMDY0NCwgX3Nob3dfbmFtZSwgX3N0b3JlX25hbWUpCisjZGVmaW5lIFBBREFUQV9BVFRSX1JPKF9uYW1lLCBfc2hvd19uYW1lKQkJXAorCXN0YXRpYyBzdHJ1Y3QgcGFkYXRhX3N5c2ZzX2VudHJ5IF9uYW1lIyNfYXR0ciA9IFwKKwkJX19BVFRSKF9uYW1lLCAwNDAwLCBfc2hvd19uYW1lLCBOVUxMKQorCitQQURBVEFfQVRUUl9SVyhzZXJpYWxfY3B1bWFzaywgc2hvd19jcHVtYXNrLCBzdG9yZV9jcHVtYXNrKTsKK1BBREFUQV9BVFRSX1JXKHBhcmFsbGVsX2NwdW1hc2ssIHNob3dfY3B1bWFzaywgc3RvcmVfY3B1bWFzayk7CisKKy8qCisgKiBQYWRhdGEgc3lzZnMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOgorICogc2VyaWFsX2NwdW1hc2sgICBbUlddIC0gY3B1bWFzayBmb3Igc2VyaWFsIHdvcmtlcnMKKyAqIHBhcmFsbGVsX2NwdW1hc2sgW1JXXSAtIGNwdW1hc2sgZm9yIHBhcmFsbGVsIHdvcmtlcnMKICAqLwotc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGFkYXRhX2FsbG9jKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAotCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBhZGF0YV9kZWZhdWx0X2F0dHJzW10gPSB7CisJJnNlcmlhbF9jcHVtYXNrX2F0dHIuYXR0ciwKKwkmcGFyYWxsZWxfY3B1bWFza19hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzc2l6ZV90IHBhZGF0YV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7Ci0Jc3RydWN0IHBhcmFsbGVsX2RhdGEgKnBkOworCXN0cnVjdCBwYWRhdGFfc3lzZnNfZW50cnkgKnBlbnRyeTsKKwlzc2l6ZV90IHJldCA9IC1FSU87CisKKwlwaW5zdCA9IGtvYmoycGluc3Qoa29iaik7CisJcGVudHJ5ID0gYXR0cjJwZW50cnkoYXR0cik7CisJaWYgKHBlbnRyeS0+c2hvdykKKwkJcmV0ID0gcGVudHJ5LT5zaG93KHBpbnN0LCBhdHRyLCBidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgcGFkYXRhX3N5c2ZzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7CisJc3RydWN0IHBhZGF0YV9zeXNmc19lbnRyeSAqcGVudHJ5OworCXNzaXplX3QgcmV0ID0gLUVJTzsKKworCXBpbnN0ID0ga29iajJwaW5zdChrb2JqKTsKKwlwZW50cnkgPSBhdHRyMnBlbnRyeShhdHRyKTsKKwlpZiAocGVudHJ5LT5zaG93KQorCQlyZXQgPSBwZW50cnktPnN0b3JlKHBpbnN0LCBhdHRyLCBidWYsIGNvdW50KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHBhZGF0YV9zeXNmc19vcHMgPSB7CisJLnNob3cgPSBwYWRhdGFfc3lzZnNfc2hvdywKKwkuc3RvcmUgPSBwYWRhdGFfc3lzZnNfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBwYWRhdGFfYXR0cl90eXBlID0geworCS5zeXNmc19vcHMgPSAmcGFkYXRhX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycyA9IHBhZGF0YV9kZWZhdWx0X2F0dHJzLAorCS5yZWxlYXNlID0gcGFkYXRhX3N5c2ZzX3JlbGVhc2UsCit9OworCisvKioKKyAqIHBhZGF0YV9hbGxvY19wb3NzaWJsZSAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBhZGF0YSBpbnN0YW5jZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgY3B1X3Bvc3NpYmxlX21hc2sgZm9yIHNlcmlhbCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsIHdvcmtlcnMuCisgKgorICogQHdxOiB3b3JrcXVldWUgdG8gdXNlIGZvciB0aGUgYWxsb2NhdGVkIHBhZGF0YSBpbnN0YW5jZQorICovCitzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2NfcG9zc2libGUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQoreworCXJldHVybiBwYWRhdGFfYWxsb2Mod3EsIGNwdV9wb3NzaWJsZV9tYXNrLCBjcHVfcG9zc2libGVfbWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKHBhZGF0YV9hbGxvY19wb3NzaWJsZSk7CisKKy8qKgorICogcGFkYXRhX2FsbG9jIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBwYWRhdGEgaW5zdGFuY2UgYW5kIHNwZWNpZnkKKyAqICAgICAgICAgICAgICAgIGNwdW1hc2tzIGZvciBzZXJpYWwgYW5kIHBhcmFsbGVsIHdvcmtlcnMuCisgKgorICogQHdxOiB3b3JrcXVldWUgdG8gdXNlIGZvciB0aGUgYWxsb2NhdGVkIHBhZGF0YSBpbnN0YW5jZQorICogQHBjcHVtYXNrOiBjcHVtYXNrIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwYWRhdGEgcGFyYWxsZWxpemF0aW9uCisgKiBAY2JjcHVtYXNrOiBjcHVtYXNrIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwYWRhdGEgc2VyaWFsaXphdGlvbgorICovCitzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwYWRhdGFfYWxsb2Moc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnBjcHVtYXNrLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNiY3B1bWFzaykKK3sKKwlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKKwlzdHJ1Y3QgcGFyYWxsZWxfZGF0YSAqcGQgPSBOVUxMOwogCiAJcGluc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaW5zdCkKIAkJZ290byBlcnI7CiAKIAlnZXRfb25saW5lX2NwdXMoKTsKLQotCXBkID0gcGFkYXRhX2FsbG9jX3BkKHBpbnN0LCBjcHVtYXNrKTsKLQlpZiAoIXBkKQorCWlmICghYWxsb2NfY3B1bWFza192YXIoJnBpbnN0LT5jcHVtYXNrLnBjcHUsIEdGUF9LRVJORUwpKQogCQlnb3RvIGVycl9mcmVlX2luc3Q7CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcGluc3QtPmNwdW1hc2suY2JjcHUsIEdGUF9LRVJORUwpKSB7CisJCWZyZWVfY3B1bWFza192YXIocGluc3QtPmNwdW1hc2sucGNwdSk7CisJCWdvdG8gZXJyX2ZyZWVfaW5zdDsKKwl9CisJaWYgKCFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgcGNwdW1hc2spIHx8CisJICAgICFwYWRhdGFfdmFsaWRhdGVfY3B1bWFzayhwaW5zdCwgY2JjcHVtYXNrKSkKKwkJZ290byBlcnJfZnJlZV9tYXNrczsKIAotCWlmICghYWxsb2NfY3B1bWFza192YXIoJnBpbnN0LT5jcHVtYXNrLCBHRlBfS0VSTkVMKSkKLQkJZ290byBlcnJfZnJlZV9wZDsKKwlwZCA9IHBhZGF0YV9hbGxvY19wZChwaW5zdCwgcGNwdW1hc2ssIGNiY3B1bWFzayk7CisJaWYgKCFwZCkKKwkJZ290byBlcnJfZnJlZV9tYXNrczsKIAogCXJjdV9hc3NpZ25fcG9pbnRlcihwaW5zdC0+cGQsIHBkKTsKIAogCXBpbnN0LT53cSA9IHdxOwogCi0JY3B1bWFza19jb3B5KHBpbnN0LT5jcHVtYXNrLCBjcHVtYXNrKTsKKwljcHVtYXNrX2NvcHkocGluc3QtPmNwdW1hc2sucGNwdSwgcGNwdW1hc2spOworCWNwdW1hc2tfY29weShwaW5zdC0+Y3B1bWFzay5jYmNwdSwgY2JjcHVtYXNrKTsKIAogCXBpbnN0LT5mbGFncyA9IDA7CiAKQEAgLTczNSwxMiArMTEwNiwxNSBAQAogCiAJcHV0X29ubGluZV9jcHVzKCk7CiAKKwlCTE9DS0lOR19JTklUX05PVElGSUVSX0hFQUQoJnBpbnN0LT5jcHVtYXNrX2NoYW5nZV9ub3RpZmllcik7CisJa29iamVjdF9pbml0KCZwaW5zdC0+a29iaiwgJnBhZGF0YV9hdHRyX3R5cGUpOwogCW11dGV4X2luaXQoJnBpbnN0LT5sb2NrKTsKIAogCXJldHVybiBwaW5zdDsKIAotZXJyX2ZyZWVfcGQ6Ci0JcGFkYXRhX2ZyZWVfcGQocGQpOworZXJyX2ZyZWVfbWFza3M6CisJZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0+Y3B1bWFzay5wY3B1KTsKKwlmcmVlX2NwdW1hc2tfdmFyKHBpbnN0LT5jcHVtYXNrLmNiY3B1KTsKIGVycl9mcmVlX2luc3Q6CiAJa2ZyZWUocGluc3QpOwogCXB1dF9vbmxpbmVfY3B1cygpOwpAQCAtNzU2LDE5ICsxMTMwLDYgQEAKICAqLwogdm9pZCBwYWRhdGFfZnJlZShzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdCkKIHsKLQlwYWRhdGFfc3RvcChwaW5zdCk7Ci0KLQlzeW5jaHJvbml6ZV9yY3UoKTsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZwaW5zdC0+Y3B1X25vdGlmaWVyKTsKLSNlbmRpZgotCWdldF9vbmxpbmVfY3B1cygpOwotCXBhZGF0YV9mbHVzaF9xdWV1ZXMocGluc3QtPnBkKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKLQotCXBhZGF0YV9mcmVlX3BkKHBpbnN0LT5wZCk7Ci0JZnJlZV9jcHVtYXNrX3ZhcihwaW5zdC0+Y3B1bWFzayk7Ci0Ja2ZyZWUocGluc3QpOworCWtvYmplY3RfcHV0KCZwaW5zdC0+a29iaik7CiB9CiBFWFBPUlRfU1lNQk9MKHBhZGF0YV9mcmVlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IGZmODZjNTUuLjQwM2QxODAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdTY0IHBlcmZfY2xvY2sodm9pZCkKIHsKLQlyZXR1cm4gY3B1X2Nsb2NrKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXJldHVybiBsb2NhbF9jbG9jaygpOwogfQogCiAvKgpAQCAtNjc1LDcgKzY3NSw2IEBACiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCAqcGFydGlhbF9ncm91cCA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IHBtdSAqcG11ID0gZ3JvdXBfZXZlbnQtPnBtdTsKIAlib29sIHR4biA9IGZhbHNlOwotCWludCByZXQ7CiAKIAlpZiAoZ3JvdXBfZXZlbnQtPnN0YXRlID09IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQogCQlyZXR1cm4gMDsKQEAgLTcwMywxNSArNzAyLDkgQEAKIAkJfQogCX0KIAotCWlmICghdHhuKQorCWlmICghdHhuIHx8ICFwbXUtPmNvbW1pdF90eG4ocG11KSkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBwbXUtPmNvbW1pdF90eG4ocG11KTsKLQlpZiAoIXJldCkgewotCQlwbXUtPmNhbmNlbF90eG4ocG11KTsKLQkJcmV0dXJuIDA7Ci0JfQotCiBncm91cF9lcnJvcjoKIAkvKgogCSAqIEdyb3VwcyBjYW4gYmUgc2NoZWR1bGVkIGluIGFzIG9uZSB1bml0IG9ubHksIHNvIHVuZG8gYW55CkBAIC0xMTU1LDkgKzExNDgsOSBAQAogCSAqIEluIG9yZGVyIHRvIGtlZXAgcGVyLXRhc2sgc3RhdHMgcmVsaWFibGUgd2UgbmVlZCB0byBmbGlwIHRoZSBldmVudAogCSAqIHZhbHVlcyB3aGVuIHdlIGZsaXAgdGhlIGNvbnRleHRzLgogCSAqLwotCXZhbHVlID0gYXRvbWljNjRfcmVhZCgmbmV4dF9ldmVudC0+Y291bnQpOwotCXZhbHVlID0gYXRvbWljNjRfeGNoZygmZXZlbnQtPmNvdW50LCB2YWx1ZSk7Ci0JYXRvbWljNjRfc2V0KCZuZXh0X2V2ZW50LT5jb3VudCwgdmFsdWUpOworCXZhbHVlID0gbG9jYWw2NF9yZWFkKCZuZXh0X2V2ZW50LT5jb3VudCk7CisJdmFsdWUgPSBsb2NhbDY0X3hjaGcoJmV2ZW50LT5jb3VudCwgdmFsdWUpOworCWxvY2FsNjRfc2V0KCZuZXh0X2V2ZW50LT5jb3VudCwgdmFsdWUpOwogCiAJc3dhcChldmVudC0+dG90YWxfdGltZV9lbmFibGVkLCBuZXh0X2V2ZW50LT50b3RhbF90aW1lX2VuYWJsZWQpOwogCXN3YXAoZXZlbnQtPnRvdGFsX3RpbWVfcnVubmluZywgbmV4dF9ldmVudC0+dG90YWxfdGltZV9ydW5uaW5nKTsKQEAgLTE1NDcsMTAgKzE1NDAsMTAgQEAKIAogCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IHNhbXBsZV9wZXJpb2Q7CiAKLQlpZiAoYXRvbWljNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCkgPiA4KnNhbXBsZV9wZXJpb2QpIHsKKwlpZiAobG9jYWw2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KSA+IDgqc2FtcGxlX3BlcmlvZCkgewogCQlwZXJmX2Rpc2FibGUoKTsKIAkJcGVyZl9ldmVudF9zdG9wKGV2ZW50KTsKLQkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCAwKTsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIDApOwogCQlwZXJmX2V2ZW50X3N0YXJ0KGV2ZW50KTsKIAkJcGVyZl9lbmFibGUoKTsKIAl9CkBAIC0xNTkxLDcgKzE1ODQsNyBAQAogCiAJCXBlcmZfZGlzYWJsZSgpOwogCQlldmVudC0+cG11LT5yZWFkKGV2ZW50KTsKLQkJbm93ID0gYXRvbWljNjRfcmVhZCgmZXZlbnQtPmNvdW50KTsKKwkJbm93ID0gbG9jYWw2NF9yZWFkKCZldmVudC0+Y291bnQpOwogCQlkZWx0YSA9IG5vdyAtIGh3Yy0+ZnJlcV9jb3VudF9zdGFtcDsKIAkJaHdjLT5mcmVxX2NvdW50X3N0YW1wID0gbm93OwogCkBAIC0xNzQzLDYgKzE3MzYsMTEgQEAKIAlldmVudC0+cG11LT5yZWFkKGV2ZW50KTsKIH0KIAorc3RhdGljIGlubGluZSB1NjQgcGVyZl9ldmVudF9jb3VudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIGxvY2FsNjRfcmVhZCgmZXZlbnQtPmNvdW50KSArIGF0b21pYzY0X3JlYWQoJmV2ZW50LT5jaGlsZF9jb3VudCk7Cit9CisKIHN0YXRpYyB1NjQgcGVyZl9ldmVudF9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAkvKgpAQCAtMTc2Miw3ICsxNzYwLDcgQEAKIAkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOwogCX0KIAotCXJldHVybiBhdG9taWM2NF9yZWFkKCZldmVudC0+Y291bnQpOworCXJldHVybiBwZXJmX2V2ZW50X2NvdW50KGV2ZW50KTsKIH0KIAogLyoKQEAgLTE4ODMsNyArMTg4MSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfcGVuZGluZ19zeW5jKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7Ci1zdGF0aWMgdm9pZCBwZXJmX21tYXBfZGF0YV9wdXQoc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIHBlcmZfYnVmZmVyX3B1dChzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcik7CiAKIHN0YXRpYyB2b2lkIGZyZWVfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewpAQCAtMTg5MSw3ICsxODg5LDcgQEAKIAogCWlmICghZXZlbnQtPnBhcmVudCkgewogCQlhdG9taWNfZGVjKCZucl9ldmVudHMpOwotCQlpZiAoZXZlbnQtPmF0dHIubW1hcCkKKwkJaWYgKGV2ZW50LT5hdHRyLm1tYXAgfHwgZXZlbnQtPmF0dHIubW1hcF9kYXRhKQogCQkJYXRvbWljX2RlYygmbnJfbW1hcF9ldmVudHMpOwogCQlpZiAoZXZlbnQtPmF0dHIuY29tbSkKIAkJCWF0b21pY19kZWMoJm5yX2NvbW1fZXZlbnRzKTsKQEAgLTE4OTksOSArMTg5Nyw5IEBACiAJCQlhdG9taWNfZGVjKCZucl90YXNrX2V2ZW50cyk7CiAJfQogCi0JaWYgKGV2ZW50LT5kYXRhKSB7Ci0JCXBlcmZfbW1hcF9kYXRhX3B1dChldmVudC0+ZGF0YSk7Ci0JCWV2ZW50LT5kYXRhID0gTlVMTDsKKwlpZiAoZXZlbnQtPmJ1ZmZlcikgeworCQlwZXJmX2J1ZmZlcl9wdXQoZXZlbnQtPmJ1ZmZlcik7CisJCWV2ZW50LT5idWZmZXIgPSBOVUxMOwogCX0KIAogCWlmIChldmVudC0+ZGVzdHJveSkKQEAgLTIxMjYsMTMgKzIxMjQsMTMgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGVyZl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisJc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CiAJdW5zaWduZWQgaW50IGV2ZW50cyA9IFBPTExfSFVQOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWRhdGEgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmRhdGEpOwotCWlmIChkYXRhKQotCQlldmVudHMgPSBhdG9taWNfeGNoZygmZGF0YS0+cG9sbCwgMCk7CisJYnVmZmVyID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5idWZmZXIpOworCWlmIChidWZmZXIpCisJCWV2ZW50cyA9IGF0b21pY194Y2hnKCZidWZmZXItPnBvbGwsIDApOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcG9sbF93YWl0KGZpbGUsICZldmVudC0+d2FpdHEsIHdhaXQpOwpAQCAtMjE0Myw3ICsyMTQxLDcgQEAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfcmVzZXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCSh2b2lkKXBlcmZfZXZlbnRfcmVhZChldmVudCk7Ci0JYXRvbWljNjRfc2V0KCZldmVudC0+Y291bnQsIDApOworCWxvY2FsNjRfc2V0KCZldmVudC0+Y291bnQsIDApOwogCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIH0KIApAQCAtMjM0MiwxNCArMjM0MCwxNCBAQAogdm9pZCBwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlICp1c2VycGc7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWRhdGEgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmRhdGEpOwotCWlmICghZGF0YSkKKwlidWZmZXIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmJ1ZmZlcik7CisJaWYgKCFidWZmZXIpCiAJCWdvdG8gdW5sb2NrOwogCi0JdXNlcnBnID0gZGF0YS0+dXNlcl9wYWdlOworCXVzZXJwZyA9IGJ1ZmZlci0+dXNlcl9wYWdlOwogCiAJLyoKIAkgKiBEaXNhYmxlIHByZWVtcHRpb24gc28gYXMgdG8gbm90IGxldCB0aGUgY29ycmVzcG9uZGluZyB1c2VyLXNwYWNlCkBAIC0yMzU5LDkgKzIzNTcsOSBAQAogCSsrdXNlcnBnLT5sb2NrOwogCWJhcnJpZXIoKTsKIAl1c2VycGctPmluZGV4ID0gcGVyZl9ldmVudF9pbmRleChldmVudCk7Ci0JdXNlcnBnLT5vZmZzZXQgPSBhdG9taWM2NF9yZWFkKCZldmVudC0+Y291bnQpOworCXVzZXJwZy0+b2Zmc2V0ID0gcGVyZl9ldmVudF9jb3VudChldmVudCk7CiAJaWYgKGV2ZW50LT5zdGF0ZSA9PSBQRVJGX0VWRU5UX1NUQVRFX0FDVElWRSkKLQkJdXNlcnBnLT5vZmZzZXQgLT0gYXRvbWljNjRfcmVhZCgmZXZlbnQtPmh3LnByZXZfY291bnQpOworCQl1c2VycGctPm9mZnNldCAtPSBsb2NhbDY0X3JlYWQoJmV2ZW50LT5ody5wcmV2X2NvdW50KTsKIAogCXVzZXJwZy0+dGltZV9lbmFibGVkID0gZXZlbnQtPnRvdGFsX3RpbWVfZW5hYmxlZCArCiAJCQlhdG9taWM2NF9yZWFkKCZldmVudC0+Y2hpbGRfdG90YWxfdGltZV9lbmFibGVkKTsKQEAgLTIzNzYsNiArMjM3NCwyNSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJmX2RhdGFfc2l6ZShzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkCitwZXJmX2J1ZmZlcl9pbml0KHN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyLCBsb25nIHdhdGVybWFyaywgaW50IGZsYWdzKQoreworCWxvbmcgbWF4X3NpemUgPSBwZXJmX2RhdGFfc2l6ZShidWZmZXIpOworCisJaWYgKHdhdGVybWFyaykKKwkJYnVmZmVyLT53YXRlcm1hcmsgPSBtaW4obWF4X3NpemUsIHdhdGVybWFyayk7CisKKwlpZiAoIWJ1ZmZlci0+d2F0ZXJtYXJrKQorCQlidWZmZXItPndhdGVybWFyayA9IG1heF9zaXplIC8gMjsKKworCWlmIChmbGFncyAmIFBFUkZfQlVGRkVSX1dSSVRBQkxFKQorCQlidWZmZXItPndyaXRhYmxlID0gMTsKKworCWF0b21pY19zZXQoJmJ1ZmZlci0+cmVmY291bnQsIDEpOworfQorCiAjaWZuZGVmIENPTkZJR19QRVJGX1VTRV9WTUFMTE9DCiAKIC8qCkBAIC0yMzgzLDE1ICsyNDAwLDE1IEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBwYWdlICoKLXBlcmZfbW1hcF90b19wYWdlKHN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3BlcmZfbW1hcF90b19wYWdlKHN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewotCWlmIChwZ29mZiA+IGRhdGEtPm5yX3BhZ2VzKQorCWlmIChwZ29mZiA+IGJ1ZmZlci0+bnJfcGFnZXMpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKHBnb2ZmID09IDApCi0JCXJldHVybiB2aXJ0X3RvX3BhZ2UoZGF0YS0+dXNlcl9wYWdlKTsKKwkJcmV0dXJuIHZpcnRfdG9fcGFnZShidWZmZXItPnVzZXJfcGFnZSk7CiAKLQlyZXR1cm4gdmlydF90b19wYWdlKGRhdGEtPmRhdGFfcGFnZXNbcGdvZmYgLSAxXSk7CisJcmV0dXJuIHZpcnRfdG9fcGFnZShidWZmZXItPmRhdGFfcGFnZXNbcGdvZmYgLSAxXSk7CiB9CiAKIHN0YXRpYyB2b2lkICpwZXJmX21tYXBfYWxsb2NfcGFnZShpbnQgY3B1KQpAQCAtMjQwNyw0MiArMjQyNCw0NCBAQAogCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKgotcGVyZl9tbWFwX2RhdGFfYWxsb2Moc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbnJfcGFnZXMpCitzdGF0aWMgc3RydWN0IHBlcmZfYnVmZmVyICoKK3BlcmZfYnVmZmVyX2FsbG9jKGludCBucl9wYWdlcywgbG9uZyB3YXRlcm1hcmssIGludCBjcHUsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisJc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCWludCBpOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEpOworCXNpemUgPSBzaXplb2Yoc3RydWN0IHBlcmZfYnVmZmVyKTsKIAlzaXplICs9IG5yX3BhZ2VzICogc2l6ZW9mKHZvaWQgKik7CiAKLQlkYXRhID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCisJYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKIAkJZ290byBmYWlsOwogCi0JZGF0YS0+dXNlcl9wYWdlID0gcGVyZl9tbWFwX2FsbG9jX3BhZ2UoZXZlbnQtPmNwdSk7Ci0JaWYgKCFkYXRhLT51c2VyX3BhZ2UpCisJYnVmZmVyLT51c2VyX3BhZ2UgPSBwZXJmX21tYXBfYWxsb2NfcGFnZShjcHUpOworCWlmICghYnVmZmVyLT51c2VyX3BhZ2UpCiAJCWdvdG8gZmFpbF91c2VyX3BhZ2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQlkYXRhLT5kYXRhX3BhZ2VzW2ldID0gcGVyZl9tbWFwX2FsbG9jX3BhZ2UoZXZlbnQtPmNwdSk7Ci0JCWlmICghZGF0YS0+ZGF0YV9wYWdlc1tpXSkKKwkJYnVmZmVyLT5kYXRhX3BhZ2VzW2ldID0gcGVyZl9tbWFwX2FsbG9jX3BhZ2UoY3B1KTsKKwkJaWYgKCFidWZmZXItPmRhdGFfcGFnZXNbaV0pCiAJCQlnb3RvIGZhaWxfZGF0YV9wYWdlczsKIAl9CiAKLQlkYXRhLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCWJ1ZmZlci0+bnJfcGFnZXMgPSBucl9wYWdlczsKIAotCXJldHVybiBkYXRhOworCXBlcmZfYnVmZmVyX2luaXQoYnVmZmVyLCB3YXRlcm1hcmssIGZsYWdzKTsKKworCXJldHVybiBidWZmZXI7CiAKIGZhaWxfZGF0YV9wYWdlczoKIAlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLT5kYXRhX3BhZ2VzW2ldKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlci0+ZGF0YV9wYWdlc1tpXSk7CiAKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0+dXNlcl9wYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLT51c2VyX3BhZ2UpOwogCiBmYWlsX3VzZXJfcGFnZToKLQlrZnJlZShkYXRhKTsKKwlrZnJlZShidWZmZXIpOwogCiBmYWlsOgogCXJldHVybiBOVUxMOwpAQCAtMjQ1NiwxNyArMjQ3NSwxNyBAQAogCV9fZnJlZV9wYWdlKHBhZ2UpOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX21tYXBfZGF0YV9mcmVlKHN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSkKK3N0YXRpYyB2b2lkIHBlcmZfYnVmZmVyX2ZyZWUoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpCiB7CiAJaW50IGk7CiAKLQlwZXJmX21tYXBfZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEtPnVzZXJfcGFnZSk7Ci0JZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX3BhZ2VzOyBpKyspCi0JCXBlcmZfbW1hcF9mcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0+ZGF0YV9wYWdlc1tpXSk7Ci0Ja2ZyZWUoZGF0YSk7CisJcGVyZl9tbWFwX2ZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXItPnVzZXJfcGFnZSk7CisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlci0+bnJfcGFnZXM7IGkrKykKKwkJcGVyZl9tbWFwX2ZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXItPmRhdGFfcGFnZXNbaV0pOworCWtmcmVlKGJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2Vfb3JkZXIoc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhKQorc3RhdGljIGlubGluZSBpbnQgcGFnZV9vcmRlcihzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcikKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NzksMTggKzI0OTgsMTggQEAKICAqIFJlcXVpcmVkIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZSBkLWNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBwYWdlX29yZGVyKHN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgaW50IHBhZ2Vfb3JkZXIoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpCiB7Ci0JcmV0dXJuIGRhdGEtPnBhZ2Vfb3JkZXI7CisJcmV0dXJuIGJ1ZmZlci0+cGFnZV9vcmRlcjsKIH0KIAogc3RhdGljIHN0cnVjdCBwYWdlICoKLXBlcmZfbW1hcF90b19wYWdlKHN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3BlcmZfbW1hcF90b19wYWdlKHN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewotCWlmIChwZ29mZiA+ICgxVUwgPDwgcGFnZV9vcmRlcihkYXRhKSkpCisJaWYgKHBnb2ZmID4gKDFVTCA8PCBwYWdlX29yZGVyKGJ1ZmZlcikpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiB2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilkYXRhLT51c2VyX3BhZ2UgKyBwZ29mZiAqIFBBR0VfU0laRSk7CisJcmV0dXJuIHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWJ1ZmZlci0+dXNlcl9wYWdlICsgcGdvZmYgKiBQQUdFX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCBwZXJmX21tYXBfdW5tYXJrX3BhZ2Uodm9pZCAqYWRkcikKQEAgLTI1MDAsNTcgKzI1MTksNTkgQEAKIAlwYWdlLT5tYXBwaW5nID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9tbWFwX2RhdGFfZnJlZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIHBlcmZfYnVmZmVyX2ZyZWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyOwogCXZvaWQgKmJhc2U7CiAJaW50IGksIG5yOwogCi0JZGF0YSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEsIHdvcmspOwotCW5yID0gMSA8PCBwYWdlX29yZGVyKGRhdGEpOworCWJ1ZmZlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGVyZl9idWZmZXIsIHdvcmspOworCW5yID0gMSA8PCBwYWdlX29yZGVyKGJ1ZmZlcik7CiAKLQliYXNlID0gZGF0YS0+dXNlcl9wYWdlOworCWJhc2UgPSBidWZmZXItPnVzZXJfcGFnZTsKIAlmb3IgKGkgPSAwOyBpIDwgbnIgKyAxOyBpKyspCiAJCXBlcmZfbW1hcF91bm1hcmtfcGFnZShiYXNlICsgKGkgKiBQQUdFX1NJWkUpKTsKIAogCXZmcmVlKGJhc2UpOwotCWtmcmVlKGRhdGEpOworCWtmcmVlKGJ1ZmZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfbW1hcF9kYXRhX2ZyZWUoc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhKQorc3RhdGljIHZvaWQgcGVyZl9idWZmZXJfZnJlZShzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcikKIHsKLQlzY2hlZHVsZV93b3JrKCZkYXRhLT53b3JrKTsKKwlzY2hlZHVsZV93b3JrKCZidWZmZXItPndvcmspOwogfQogCi1zdGF0aWMgc3RydWN0IHBlcmZfbW1hcF9kYXRhICoKLXBlcmZfbW1hcF9kYXRhX2FsbG9jKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IG5yX3BhZ2VzKQorc3RhdGljIHN0cnVjdCBwZXJmX2J1ZmZlciAqCitwZXJmX2J1ZmZlcl9hbGxvYyhpbnQgbnJfcGFnZXMsIGxvbmcgd2F0ZXJtYXJrLCBpbnQgY3B1LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAl2b2lkICphbGxfYnVmOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEpOworCXNpemUgPSBzaXplb2Yoc3RydWN0IHBlcmZfYnVmZmVyKTsKIAlzaXplICs9IHNpemVvZih2b2lkICopOwogCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKQorCWJ1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCiAJCWdvdG8gZmFpbDsKIAotCUlOSVRfV09SSygmZGF0YS0+d29yaywgcGVyZl9tbWFwX2RhdGFfZnJlZV93b3JrKTsKKwlJTklUX1dPUksoJmJ1ZmZlci0+d29yaywgcGVyZl9idWZmZXJfZnJlZV93b3JrKTsKIAogCWFsbF9idWYgPSB2bWFsbG9jX3VzZXIoKG5yX3BhZ2VzICsgMSkgKiBQQUdFX1NJWkUpOwogCWlmICghYWxsX2J1ZikKIAkJZ290byBmYWlsX2FsbF9idWY7CiAKLQlkYXRhLT51c2VyX3BhZ2UgPSBhbGxfYnVmOwotCWRhdGEtPmRhdGFfcGFnZXNbMF0gPSBhbGxfYnVmICsgUEFHRV9TSVpFOwotCWRhdGEtPnBhZ2Vfb3JkZXIgPSBpbG9nMihucl9wYWdlcyk7Ci0JZGF0YS0+bnJfcGFnZXMgPSAxOworCWJ1ZmZlci0+dXNlcl9wYWdlID0gYWxsX2J1ZjsKKwlidWZmZXItPmRhdGFfcGFnZXNbMF0gPSBhbGxfYnVmICsgUEFHRV9TSVpFOworCWJ1ZmZlci0+cGFnZV9vcmRlciA9IGlsb2cyKG5yX3BhZ2VzKTsKKwlidWZmZXItPm5yX3BhZ2VzID0gMTsKIAotCXJldHVybiBkYXRhOworCXBlcmZfYnVmZmVyX2luaXQoYnVmZmVyLCB3YXRlcm1hcmssIGZsYWdzKTsKKworCXJldHVybiBidWZmZXI7CiAKIGZhaWxfYWxsX2J1ZjoKLQlrZnJlZShkYXRhKTsKKwlrZnJlZShidWZmZXIpOwogCiBmYWlsOgogCXJldHVybiBOVUxMOwpAQCAtMjU1OCwxNSArMjU3OSwxNSBAQAogCiAjZW5kaWYKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9kYXRhX3NpemUoc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9kYXRhX3NpemUoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpCiB7Ci0JcmV0dXJuIGRhdGEtPm5yX3BhZ2VzIDw8IChQQUdFX1NISUZUICsgcGFnZV9vcmRlcihkYXRhKSk7CisJcmV0dXJuIGJ1ZmZlci0+bnJfcGFnZXMgPDwgKFBBR0VfU0hJRlQgKyBwYWdlX29yZGVyKGJ1ZmZlcikpOwogfQogCiBzdGF0aWMgaW50IHBlcmZfbW1hcF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyOwogCWludCByZXQgPSBWTV9GQVVMVF9TSUdCVVM7CiAKIAlpZiAodm1mLT5mbGFncyAmIEZBVUxUX0ZMQUdfTUtXUklURSkgewpAQCAtMjU3NiwxNCArMjU5NywxNCBAQAogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKLQlkYXRhID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5kYXRhKTsKLQlpZiAoIWRhdGEpCisJYnVmZmVyID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5idWZmZXIpOworCWlmICghYnVmZmVyKQogCQlnb3RvIHVubG9jazsKIAogCWlmICh2bWYtPnBnb2ZmICYmICh2bWYtPmZsYWdzICYgRkFVTFRfRkxBR19XUklURSkpCiAJCWdvdG8gdW5sb2NrOwogCi0Jdm1mLT5wYWdlID0gcGVyZl9tbWFwX3RvX3BhZ2UoZGF0YSwgdm1mLT5wZ29mZik7CisJdm1mLT5wYWdlID0gcGVyZl9tbWFwX3RvX3BhZ2UoYnVmZmVyLCB2bWYtPnBnb2ZmKTsKIAlpZiAoIXZtZi0+cGFnZSkKIAkJZ290byB1bmxvY2s7CiAKQEAgLTI1OTgsNTIgKzI2MTksMzUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZAotcGVyZl9tbWFwX2RhdGFfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSkKK3N0YXRpYyB2b2lkIHBlcmZfYnVmZmVyX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1X2hlYWQpCiB7Ci0JbG9uZyBtYXhfc2l6ZSA9IHBlcmZfZGF0YV9zaXplKGRhdGEpOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyOwogCi0JaWYgKGV2ZW50LT5hdHRyLndhdGVybWFyaykgewotCQlkYXRhLT53YXRlcm1hcmsgPSBtaW5fdChsb25nLCBtYXhfc2l6ZSwKLQkJCQkJZXZlbnQtPmF0dHIud2FrZXVwX3dhdGVybWFyayk7Ci0JfQotCi0JaWYgKCFkYXRhLT53YXRlcm1hcmspCi0JCWRhdGEtPndhdGVybWFyayA9IG1heF9zaXplIC8gMjsKLQotCWF0b21pY19zZXQoJmRhdGEtPnJlZmNvdW50LCAxKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPmRhdGEsIGRhdGEpOworCWJ1ZmZlciA9IGNvbnRhaW5lcl9vZihyY3VfaGVhZCwgc3RydWN0IHBlcmZfYnVmZmVyLCByY3VfaGVhZCk7CisJcGVyZl9idWZmZXJfZnJlZShidWZmZXIpOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX21tYXBfZGF0YV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdV9oZWFkKQorc3RhdGljIHN0cnVjdCBwZXJmX2J1ZmZlciAqcGVyZl9idWZmZXJfZ2V0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7Ci0KLQlkYXRhID0gY29udGFpbmVyX29mKHJjdV9oZWFkLCBzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEsIHJjdV9oZWFkKTsKLQlwZXJmX21tYXBfZGF0YV9mcmVlKGRhdGEpOwotfQotCi1zdGF0aWMgc3RydWN0IHBlcmZfbW1hcF9kYXRhICpwZXJmX21tYXBfZGF0YV9nZXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQotewotCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlkYXRhID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5kYXRhKTsKLQlpZiAoZGF0YSkgewotCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmRhdGEtPnJlZmNvdW50KSkKLQkJCWRhdGEgPSBOVUxMOworCWJ1ZmZlciA9IHJjdV9kZXJlZmVyZW5jZShldmVudC0+YnVmZmVyKTsKKwlpZiAoYnVmZmVyKSB7CisJCWlmICghYXRvbWljX2luY19ub3RfemVybygmYnVmZmVyLT5yZWZjb3VudCkpCisJCQlidWZmZXIgPSBOVUxMOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJldHVybiBkYXRhOworCXJldHVybiBidWZmZXI7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfbW1hcF9kYXRhX3B1dChzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEpCitzdGF0aWMgdm9pZCBwZXJmX2J1ZmZlcl9wdXQoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpCiB7Ci0JaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZkYXRhLT5yZWZjb3VudCkpCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZidWZmZXItPnJlZmNvdW50KSkKIAkJcmV0dXJuOwogCi0JY2FsbF9yY3UoJmRhdGEtPnJjdV9oZWFkLCBwZXJmX21tYXBfZGF0YV9mcmVlX3JjdSk7CisJY2FsbF9yY3UoJmJ1ZmZlci0+cmN1X2hlYWQsIHBlcmZfYnVmZmVyX2ZyZWVfcmN1KTsKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9tbWFwX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC0yNjU4LDE2ICsyNjYyLDE2IEBACiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfY291bnQsICZldmVudC0+bW1hcF9tdXRleCkpIHsKLQkJdW5zaWduZWQgbG9uZyBzaXplID0gcGVyZl9kYXRhX3NpemUoZXZlbnQtPmRhdGEpOworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBwZXJmX2RhdGFfc2l6ZShldmVudC0+YnVmZmVyKTsKIAkJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyID0gZXZlbnQtPm1tYXBfdXNlcjsKLQkJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gZXZlbnQtPmRhdGE7CisJCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyID0gZXZlbnQtPmJ1ZmZlcjsKIAogCQlhdG9taWNfbG9uZ19zdWIoKHNpemUgPj4gUEFHRV9TSElGVCkgKyAxLCAmdXNlci0+bG9ja2VkX3ZtKTsKIAkJdm1hLT52bV9tbS0+bG9ja2VkX3ZtIC09IGV2ZW50LT5tbWFwX2xvY2tlZDsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5kYXRhLCBOVUxMKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5idWZmZXIsIE5VTEwpOwogCQltdXRleF91bmxvY2soJmV2ZW50LT5tbWFwX211dGV4KTsKIAotCQlwZXJmX21tYXBfZGF0YV9wdXQoZGF0YSk7CisJCXBlcmZfYnVmZmVyX3B1dChidWZmZXIpOwogCQlmcmVlX3VpZCh1c2VyKTsKIAl9CiB9CkBAIC0yNjg1LDExICsyNjg5LDExIEBACiAJdW5zaWduZWQgbG9uZyB1c2VyX2xvY2tlZCwgdXNlcl9sb2NrX2xpbWl0OwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IGN1cnJlbnRfdXNlcigpOwogCXVuc2lnbmVkIGxvbmcgbG9ja2VkLCBsb2NrX2xpbWl0OwotCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIHZtYV9zaXplOwogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CiAJbG9uZyB1c2VyX2V4dHJhLCBleHRyYTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMCwgZmxhZ3MgPSAwOwogCiAJLyoKIAkgKiBEb24ndCBhbGxvdyBtbWFwKCkgb2YgaW5oZXJpdGVkIHBlci10YXNrIGNvdW50ZXJzLiBUaGlzIHdvdWxkCkBAIC0yNzA2LDcgKzI3MTAsNyBAQAogCW5yX3BhZ2VzID0gKHZtYV9zaXplIC8gUEFHRV9TSVpFKSAtIDE7CiAKIAkvKgotCSAqIElmIHdlIGhhdmUgZGF0YSBwYWdlcyBlbnN1cmUgdGhleSdyZSBhIHBvd2VyLW9mLXR3byBudW1iZXIsIHNvIHdlCisJICogSWYgd2UgaGF2ZSBidWZmZXIgcGFnZXMgZW5zdXJlIHRoZXkncmUgYSBwb3dlci1vZi10d28gbnVtYmVyLCBzbyB3ZQogCSAqIGNhbiBkbyBiaXRtYXNrcyBpbnN0ZWFkIG9mIG1vZHVsby4KIAkgKi8KIAlpZiAobnJfcGFnZXMgIT0gMCAmJiAhaXNfcG93ZXJfb2ZfMihucl9wYWdlcykpCkBAIC0yNzIwLDkgKzI3MjQsOSBAQAogCiAJV0FSTl9PTl9PTkNFKGV2ZW50LT5jdHgtPnBhcmVudF9jdHgpOwogCW11dGV4X2xvY2soJmV2ZW50LT5tbWFwX211dGV4KTsKLQlpZiAoZXZlbnQtPmRhdGEpIHsKLQkJaWYgKGV2ZW50LT5kYXRhLT5ucl9wYWdlcyA9PSBucl9wYWdlcykKLQkJCWF0b21pY19pbmMoJmV2ZW50LT5kYXRhLT5yZWZjb3VudCk7CisJaWYgKGV2ZW50LT5idWZmZXIpIHsKKwkJaWYgKGV2ZW50LT5idWZmZXItPm5yX3BhZ2VzID09IG5yX3BhZ2VzKQorCQkJYXRvbWljX2luYygmZXZlbnQtPmJ1ZmZlci0+cmVmY291bnQpOwogCQllbHNlCiAJCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHVubG9jazsKQEAgLTI3NTIsMTcgKzI3NTYsMTggQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JV0FSTl9PTihldmVudC0+ZGF0YSk7CisJV0FSTl9PTihldmVudC0+YnVmZmVyKTsKIAotCWRhdGEgPSBwZXJmX21tYXBfZGF0YV9hbGxvYyhldmVudCwgbnJfcGFnZXMpOwotCWlmICghZGF0YSkgeworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCisJCWZsYWdzIHw9IFBFUkZfQlVGRkVSX1dSSVRBQkxFOworCisJYnVmZmVyID0gcGVyZl9idWZmZXJfYWxsb2MobnJfcGFnZXMsIGV2ZW50LT5hdHRyLndha2V1cF93YXRlcm1hcmssCisJCQkJICAgZXZlbnQtPmNwdSwgZmxhZ3MpOworCWlmICghYnVmZmVyKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gdW5sb2NrOwogCX0KLQotCXBlcmZfbW1hcF9kYXRhX2luaXQoZXZlbnQsIGRhdGEpOwotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCi0JCWV2ZW50LT5kYXRhLT53cml0YWJsZSA9IDE7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5idWZmZXIsIGJ1ZmZlcik7CiAKIAlhdG9taWNfbG9uZ19hZGQodXNlcl9leHRyYSwgJnVzZXItPmxvY2tlZF92bSk7CiAJZXZlbnQtPm1tYXBfbG9ja2VkID0gZXh0cmE7CkBAIC0yOTQxLDExICsyOTQ2LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotX193ZWFrCi12b2lkIHBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBpcCwgaW50IHNraXApCi17Ci19Ci0KIAogLyoKICAqIFdlIGFzc3VtZSB0aGVyZSBpcyBvbmx5IEtWTSBzdXBwb3J0aW5nIHRoZSBjYWxsYmFja3MuCkBAIC0yOTcxLDE1ICsyOTcxLDE1IEBACiAvKgogICogT3V0cHV0CiAgKi8KLXN0YXRpYyBib29sIHBlcmZfb3V0cHV0X3NwYWNlKHN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyB0YWlsLAorc3RhdGljIGJvb2wgcGVyZl9vdXRwdXRfc3BhY2Uoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgdGFpbCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCi0JaWYgKCFkYXRhLT53cml0YWJsZSkKKwlpZiAoIWJ1ZmZlci0+d3JpdGFibGUpCiAJCXJldHVybiB0cnVlOwogCi0JbWFzayA9IHBlcmZfZGF0YV9zaXplKGRhdGEpIC0gMTsKKwltYXNrID0gcGVyZl9kYXRhX3NpemUoYnVmZmVyKSAtIDE7CiAKIAlvZmZzZXQgPSAob2Zmc2V0IC0gdGFpbCkgJiBtYXNrOwogCWhlYWQgICA9IChoZWFkICAgLSB0YWlsKSAmIG1hc2s7CkBAIC0yOTkyLDcgKzI5OTIsNyBAQAogCiBzdGF0aWMgdm9pZCBwZXJmX291dHB1dF93YWtldXAoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQogewotCWF0b21pY19zZXQoJmhhbmRsZS0+ZGF0YS0+cG9sbCwgUE9MTF9JTik7CisJYXRvbWljX3NldCgmaGFuZGxlLT5idWZmZXItPnBvbGwsIFBPTExfSU4pOwogCiAJaWYgKGhhbmRsZS0+bm1pKSB7CiAJCWhhbmRsZS0+ZXZlbnQtPnBlbmRpbmdfd2FrZXVwID0gMTsKQEAgLTMwMTIsNDUgKzMwMTIsNDUgQEAKICAqLwogc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfZ2V0X2hhbmRsZShzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCiB7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gaGFuZGxlLT5kYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyID0gaGFuZGxlLT5idWZmZXI7CiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlsb2NhbF9pbmMoJmRhdGEtPm5lc3QpOwotCWhhbmRsZS0+d2FrZXVwID0gbG9jYWxfcmVhZCgmZGF0YS0+d2FrZXVwKTsKKwlsb2NhbF9pbmMoJmJ1ZmZlci0+bmVzdCk7CisJaGFuZGxlLT53YWtldXAgPSBsb2NhbF9yZWFkKCZidWZmZXItPndha2V1cCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X3B1dF9oYW5kbGUoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQogewotCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSA9IGhhbmRsZS0+ZGF0YTsKKwlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlciA9IGhhbmRsZS0+YnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgaGVhZDsKIAogYWdhaW46Ci0JaGVhZCA9IGxvY2FsX3JlYWQoJmRhdGEtPmhlYWQpOworCWhlYWQgPSBsb2NhbF9yZWFkKCZidWZmZXItPmhlYWQpOwogCiAJLyoKIAkgKiBJUlEvTk1JIGNhbiBoYXBwZW4gaGVyZSwgd2hpY2ggbWVhbnMgd2UgY2FuIG1pc3MgYSBoZWFkIHVwZGF0ZS4KIAkgKi8KIAotCWlmICghbG9jYWxfZGVjX2FuZF90ZXN0KCZkYXRhLT5uZXN0KSkKKwlpZiAoIWxvY2FsX2RlY19hbmRfdGVzdCgmYnVmZmVyLT5uZXN0KSkKIAkJZ290byBvdXQ7CiAKIAkvKgogCSAqIFB1Ymxpc2ggdGhlIGtub3duIGdvb2QgaGVhZC4gUmVseSBvbiB0aGUgZnVsbCBiYXJyaWVyIGltcGxpZWQKLQkgKiBieSBhdG9taWNfZGVjX2FuZF90ZXN0KCkgb3JkZXIgdGhlIGRhdGEtPmhlYWQgcmVhZCBhbmQgdGhpcworCSAqIGJ5IGF0b21pY19kZWNfYW5kX3Rlc3QoKSBvcmRlciB0aGUgYnVmZmVyLT5oZWFkIHJlYWQgYW5kIHRoaXMKIAkgKiB3cml0ZS4KIAkgKi8KLQlkYXRhLT51c2VyX3BhZ2UtPmRhdGFfaGVhZCA9IGhlYWQ7CisJYnVmZmVyLT51c2VyX3BhZ2UtPmRhdGFfaGVhZCA9IGhlYWQ7CiAKIAkvKgogCSAqIE5vdyBjaGVjayBpZiB3ZSBtaXNzZWQgYW4gdXBkYXRlLCByZWx5IG9uIHRoZSAoY29tcGlsZXIpCi0JICogYmFycmllciBpbiBhdG9taWNfZGVjX2FuZF90ZXN0KCkgdG8gcmUtcmVhZCBkYXRhLT5oZWFkLgorCSAqIGJhcnJpZXIgaW4gYXRvbWljX2RlY19hbmRfdGVzdCgpIHRvIHJlLXJlYWQgYnVmZmVyLT5oZWFkLgogCSAqLwotCWlmICh1bmxpa2VseShoZWFkICE9IGxvY2FsX3JlYWQoJmRhdGEtPmhlYWQpKSkgewotCQlsb2NhbF9pbmMoJmRhdGEtPm5lc3QpOworCWlmICh1bmxpa2VseShoZWFkICE9IGxvY2FsX3JlYWQoJmJ1ZmZlci0+aGVhZCkpKSB7CisJCWxvY2FsX2luYygmYnVmZmVyLT5uZXN0KTsKIAkJZ290byBhZ2FpbjsKIAl9CiAKLQlpZiAoaGFuZGxlLT53YWtldXAgIT0gbG9jYWxfcmVhZCgmZGF0YS0+d2FrZXVwKSkKKwlpZiAoaGFuZGxlLT53YWtldXAgIT0gbG9jYWxfcmVhZCgmYnVmZmVyLT53YWtldXApKQogCQlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKIAogIG91dDoKQEAgLTMwNzAsMTIgKzMwNzAsMTIgQEAKIAkJYnVmICs9IHNpemU7CiAJCWhhbmRsZS0+c2l6ZSAtPSBzaXplOwogCQlpZiAoIWhhbmRsZS0+c2l6ZSkgewotCQkJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gaGFuZGxlLT5kYXRhOworCQkJc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIgPSBoYW5kbGUtPmJ1ZmZlcjsKIAogCQkJaGFuZGxlLT5wYWdlKys7Ci0JCQloYW5kbGUtPnBhZ2UgJj0gZGF0YS0+bnJfcGFnZXMgLSAxOwotCQkJaGFuZGxlLT5hZGRyID0gZGF0YS0+ZGF0YV9wYWdlc1toYW5kbGUtPnBhZ2VdOwotCQkJaGFuZGxlLT5zaXplID0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXIoZGF0YSk7CisJCQloYW5kbGUtPnBhZ2UgJj0gYnVmZmVyLT5ucl9wYWdlcyAtIDE7CisJCQloYW5kbGUtPmFkZHIgPSBidWZmZXItPmRhdGFfcGFnZXNbaGFuZGxlLT5wYWdlXTsKKwkJCWhhbmRsZS0+c2l6ZSA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyKGJ1ZmZlcik7CiAJCX0KIAl9IHdoaWxlIChsZW4pOwogfQpAQCAtMzA4NCw3ICszMDg0LDcgQEAKIAkJICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJICAgICAgaW50IG5taSwgaW50IHNhbXBsZSkKIHsKLQlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisJc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CiAJdW5zaWduZWQgbG9uZyB0YWlsLCBvZmZzZXQsIGhlYWQ7CiAJaW50IGhhdmVfbG9zdDsKIAlzdHJ1Y3QgewpAQCAtMzEwMCwxOSArMzEwMCwxOSBAQAogCWlmIChldmVudC0+cGFyZW50KQogCQlldmVudCA9IGV2ZW50LT5wYXJlbnQ7CiAKLQlkYXRhID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5kYXRhKTsKLQlpZiAoIWRhdGEpCisJYnVmZmVyID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5idWZmZXIpOworCWlmICghYnVmZmVyKQogCQlnb3RvIG91dDsKIAotCWhhbmRsZS0+ZGF0YQk9IGRhdGE7CisJaGFuZGxlLT5idWZmZXIJPSBidWZmZXI7CiAJaGFuZGxlLT5ldmVudAk9IGV2ZW50OwogCWhhbmRsZS0+bm1pCT0gbm1pOwogCWhhbmRsZS0+c2FtcGxlCT0gc2FtcGxlOwogCi0JaWYgKCFkYXRhLT5ucl9wYWdlcykKKwlpZiAoIWJ1ZmZlci0+bnJfcGFnZXMpCiAJCWdvdG8gb3V0OwogCi0JaGF2ZV9sb3N0ID0gbG9jYWxfcmVhZCgmZGF0YS0+bG9zdCk7CisJaGF2ZV9sb3N0ID0gbG9jYWxfcmVhZCgmYnVmZmVyLT5sb3N0KTsKIAlpZiAoaGF2ZV9sb3N0KQogCQlzaXplICs9IHNpemVvZihsb3N0X2V2ZW50KTsKIApAQCAtMzEyNCwzMCArMzEyNCwzMCBAQAogCQkgKiB0YWlsIHBvaW50ZXIuIFNvIHRoYXQgYWxsIHJlYWRzIHdpbGwgYmUgY29tcGxldGVkIGJlZm9yZSB0aGUKIAkJICogd3JpdGUgaXMgaXNzdWVkLgogCQkgKi8KLQkJdGFpbCA9IEFDQ0VTU19PTkNFKGRhdGEtPnVzZXJfcGFnZS0+ZGF0YV90YWlsKTsKKwkJdGFpbCA9IEFDQ0VTU19PTkNFKGJ1ZmZlci0+dXNlcl9wYWdlLT5kYXRhX3RhaWwpOwogCQlzbXBfcm1iKCk7Ci0JCW9mZnNldCA9IGhlYWQgPSBsb2NhbF9yZWFkKCZkYXRhLT5oZWFkKTsKKwkJb2Zmc2V0ID0gaGVhZCA9IGxvY2FsX3JlYWQoJmJ1ZmZlci0+aGVhZCk7CiAJCWhlYWQgKz0gc2l6ZTsKLQkJaWYgKHVubGlrZWx5KCFwZXJmX291dHB1dF9zcGFjZShkYXRhLCB0YWlsLCBvZmZzZXQsIGhlYWQpKSkKKwkJaWYgKHVubGlrZWx5KCFwZXJmX291dHB1dF9zcGFjZShidWZmZXIsIHRhaWwsIG9mZnNldCwgaGVhZCkpKQogCQkJZ290byBmYWlsOwotCX0gd2hpbGUgKGxvY2FsX2NtcHhjaGcoJmRhdGEtPmhlYWQsIG9mZnNldCwgaGVhZCkgIT0gb2Zmc2V0KTsKKwl9IHdoaWxlIChsb2NhbF9jbXB4Y2hnKCZidWZmZXItPmhlYWQsIG9mZnNldCwgaGVhZCkgIT0gb2Zmc2V0KTsKIAotCWlmIChoZWFkIC0gbG9jYWxfcmVhZCgmZGF0YS0+d2FrZXVwKSA+IGRhdGEtPndhdGVybWFyaykKLQkJbG9jYWxfYWRkKGRhdGEtPndhdGVybWFyaywgJmRhdGEtPndha2V1cCk7CisJaWYgKGhlYWQgLSBsb2NhbF9yZWFkKCZidWZmZXItPndha2V1cCkgPiBidWZmZXItPndhdGVybWFyaykKKwkJbG9jYWxfYWRkKGJ1ZmZlci0+d2F0ZXJtYXJrLCAmYnVmZmVyLT53YWtldXApOwogCi0JaGFuZGxlLT5wYWdlID0gb2Zmc2V0ID4+IChQQUdFX1NISUZUICsgcGFnZV9vcmRlcihkYXRhKSk7Ci0JaGFuZGxlLT5wYWdlICY9IGRhdGEtPm5yX3BhZ2VzIC0gMTsKLQloYW5kbGUtPnNpemUgPSBvZmZzZXQgJiAoKFBBR0VfU0laRSA8PCBwYWdlX29yZGVyKGRhdGEpKSAtIDEpOwotCWhhbmRsZS0+YWRkciA9IGRhdGEtPmRhdGFfcGFnZXNbaGFuZGxlLT5wYWdlXTsKKwloYW5kbGUtPnBhZ2UgPSBvZmZzZXQgPj4gKFBBR0VfU0hJRlQgKyBwYWdlX29yZGVyKGJ1ZmZlcikpOworCWhhbmRsZS0+cGFnZSAmPSBidWZmZXItPm5yX3BhZ2VzIC0gMTsKKwloYW5kbGUtPnNpemUgPSBvZmZzZXQgJiAoKFBBR0VfU0laRSA8PCBwYWdlX29yZGVyKGJ1ZmZlcikpIC0gMSk7CisJaGFuZGxlLT5hZGRyID0gYnVmZmVyLT5kYXRhX3BhZ2VzW2hhbmRsZS0+cGFnZV07CiAJaGFuZGxlLT5hZGRyICs9IGhhbmRsZS0+c2l6ZTsKLQloYW5kbGUtPnNpemUgPSAoUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXIoZGF0YSkpIC0gaGFuZGxlLT5zaXplOworCWhhbmRsZS0+c2l6ZSA9IChQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcihidWZmZXIpKSAtIGhhbmRsZS0+c2l6ZTsKIAogCWlmIChoYXZlX2xvc3QpIHsKIAkJbG9zdF9ldmVudC5oZWFkZXIudHlwZSA9IFBFUkZfUkVDT1JEX0xPU1Q7CiAJCWxvc3RfZXZlbnQuaGVhZGVyLm1pc2MgPSAwOwogCQlsb3N0X2V2ZW50LmhlYWRlci5zaXplID0gc2l6ZW9mKGxvc3RfZXZlbnQpOwogCQlsb3N0X2V2ZW50LmlkICAgICAgICAgID0gZXZlbnQtPmlkOwotCQlsb3N0X2V2ZW50Lmxvc3QgICAgICAgID0gbG9jYWxfeGNoZygmZGF0YS0+bG9zdCwgMCk7CisJCWxvc3RfZXZlbnQubG9zdCAgICAgICAgPSBsb2NhbF94Y2hnKCZidWZmZXItPmxvc3QsIDApOwogCiAJCXBlcmZfb3V0cHV0X3B1dChoYW5kbGUsIGxvc3RfZXZlbnQpOwogCX0KQEAgLTMxNTUsNyArMzE1NSw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0JbG9jYWxfaW5jKCZkYXRhLT5sb3N0KTsKKwlsb2NhbF9pbmMoJmJ1ZmZlci0+bG9zdCk7CiAJcGVyZl9vdXRwdXRfcHV0X2hhbmRsZShoYW5kbGUpOwogb3V0OgogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMzE2NiwxNSArMzE2NiwxNSBAQAogdm9pZCBwZXJmX291dHB1dF9lbmQoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQogewogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGhhbmRsZS0+ZXZlbnQ7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gaGFuZGxlLT5kYXRhOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyID0gaGFuZGxlLT5idWZmZXI7CiAKIAlpbnQgd2FrZXVwX2V2ZW50cyA9IGV2ZW50LT5hdHRyLndha2V1cF9ldmVudHM7CiAKIAlpZiAoaGFuZGxlLT5zYW1wbGUgJiYgd2FrZXVwX2V2ZW50cykgewotCQlpbnQgZXZlbnRzID0gbG9jYWxfaW5jX3JldHVybigmZGF0YS0+ZXZlbnRzKTsKKwkJaW50IGV2ZW50cyA9IGxvY2FsX2luY19yZXR1cm4oJmJ1ZmZlci0+ZXZlbnRzKTsKIAkJaWYgKGV2ZW50cyA+PSB3YWtldXBfZXZlbnRzKSB7Ci0JCQlsb2NhbF9zdWIod2FrZXVwX2V2ZW50cywgJmRhdGEtPmV2ZW50cyk7Ci0JCQlsb2NhbF9pbmMoJmRhdGEtPndha2V1cCk7CisJCQlsb2NhbF9zdWIod2FrZXVwX2V2ZW50cywgJmJ1ZmZlci0+ZXZlbnRzKTsKKwkJCWxvY2FsX2luYygmYnVmZmVyLT53YWtldXApOwogCQl9CiAJfQogCkBAIC0zMjExLDcgKzMyMTEsNyBAQAogCXU2NCB2YWx1ZXNbNF07CiAJaW50IG4gPSAwOwogCi0JdmFsdWVzW24rK10gPSBhdG9taWM2NF9yZWFkKCZldmVudC0+Y291bnQpOworCXZhbHVlc1tuKytdID0gcGVyZl9ldmVudF9jb3VudChldmVudCk7CiAJaWYgKHJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEKSB7CiAJCXZhbHVlc1tuKytdID0gZXZlbnQtPnRvdGFsX3RpbWVfZW5hYmxlZCArCiAJCQlhdG9taWM2NF9yZWFkKCZldmVudC0+Y2hpbGRfdG90YWxfdGltZV9lbmFibGVkKTsKQEAgLTMyNDgsNyArMzI0OCw3IEBACiAJaWYgKGxlYWRlciAhPSBldmVudCkKIAkJbGVhZGVyLT5wbXUtPnJlYWQobGVhZGVyKTsKIAotCXZhbHVlc1tuKytdID0gYXRvbWljNjRfcmVhZCgmbGVhZGVyLT5jb3VudCk7CisJdmFsdWVzW24rK10gPSBwZXJmX2V2ZW50X2NvdW50KGxlYWRlcik7CiAJaWYgKHJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfSUQpCiAJCXZhbHVlc1tuKytdID0gcHJpbWFyeV9ldmVudF9pZChsZWFkZXIpOwogCkBAIC0zMjYwLDcgKzMyNjAsNyBAQAogCQlpZiAoc3ViICE9IGV2ZW50KQogCQkJc3ViLT5wbXUtPnJlYWQoc3ViKTsKIAotCQl2YWx1ZXNbbisrXSA9IGF0b21pYzY0X3JlYWQoJnN1Yi0+Y291bnQpOworCQl2YWx1ZXNbbisrXSA9IHBlcmZfZXZlbnRfY291bnQoc3ViKTsKIAkJaWYgKHJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfSUQpCiAJCQl2YWx1ZXNbbisrXSA9IHByaW1hcnlfZXZlbnRfaWQoc3ViKTsKIApAQCAtMzQ5MSw3ICszNDkxLDcgQEAKIC8qCiAgKiB0YXNrIHRyYWNraW5nIC0tIGZvcmsvZXhpdAogICoKLSAqIGVuYWJsZWQgYnk6IGF0dHIuY29tbSB8IGF0dHIubW1hcCB8IGF0dHIudGFzaworICogZW5hYmxlZCBieTogYXR0ci5jb21tIHwgYXR0ci5tbWFwIHwgYXR0ci5tbWFwX2RhdGEgfCBhdHRyLnRhc2sKICAqLwogCiBzdHJ1Y3QgcGVyZl90YXNrX2V2ZW50IHsKQEAgLTM1NDEsNyArMzU0MSw4IEBACiAJaWYgKGV2ZW50LT5jcHUgIT0gLTEgJiYgZXZlbnQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGV2ZW50LT5hdHRyLmNvbW0gfHwgZXZlbnQtPmF0dHIubW1hcCB8fCBldmVudC0+YXR0ci50YXNrKQorCWlmIChldmVudC0+YXR0ci5jb21tIHx8IGV2ZW50LT5hdHRyLm1tYXAgfHwKKwkgICAgZXZlbnQtPmF0dHIubW1hcF9kYXRhIHx8IGV2ZW50LT5hdHRyLnRhc2spCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CkBAIC0zNzY2LDcgKzM3NjcsOCBAQAogfQogCiBzdGF0aWMgaW50IHBlcmZfZXZlbnRfbW1hcF9tYXRjaChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJICAgc3RydWN0IHBlcmZfbW1hcF9ldmVudCAqbW1hcF9ldmVudCkKKwkJCQkgICBzdHJ1Y3QgcGVyZl9tbWFwX2V2ZW50ICptbWFwX2V2ZW50LAorCQkJCSAgIGludCBleGVjdXRhYmxlKQogewogCWlmIChldmVudC0+c3RhdGUgPCBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKQogCQlyZXR1cm4gMDsKQEAgLTM3NzQsMTkgKzM3NzYsMjEgQEAKIAlpZiAoZXZlbnQtPmNwdSAhPSAtMSAmJiBldmVudC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZXZlbnQtPmF0dHIubW1hcCkKKwlpZiAoKCFleGVjdXRhYmxlICYmIGV2ZW50LT5hdHRyLm1tYXBfZGF0YSkgfHwKKwkgICAgKGV4ZWN1dGFibGUgJiYgZXZlbnQtPmF0dHIubW1hcCkpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfbW1hcF9jdHgoc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAotCQkJCSAgc3RydWN0IHBlcmZfbW1hcF9ldmVudCAqbW1hcF9ldmVudCkKKwkJCQkgIHN0cnVjdCBwZXJmX21tYXBfZXZlbnQgKm1tYXBfZXZlbnQsCisJCQkJICBpbnQgZXhlY3V0YWJsZSkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShldmVudCwgJmN0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKLQkJaWYgKHBlcmZfZXZlbnRfbW1hcF9tYXRjaChldmVudCwgbW1hcF9ldmVudCkpCisJCWlmIChwZXJmX2V2ZW50X21tYXBfbWF0Y2goZXZlbnQsIG1tYXBfZXZlbnQsIGV4ZWN1dGFibGUpKQogCQkJcGVyZl9ldmVudF9tbWFwX291dHB1dChldmVudCwgbW1hcF9ldmVudCk7CiAJfQogfQpAQCAtMzgzMCw2ICszODM0LDE0IEBACiAJCWlmICghdm1hLT52bV9tbSkgewogCQkJbmFtZSA9IHN0cm5jcHkodG1wLCAiW3Zkc29dIiwgc2l6ZW9mKHRtcCkpOwogCQkJZ290byBnb3RfbmFtZTsKKwkJfSBlbHNlIGlmICh2bWEtPnZtX3N0YXJ0IDw9IHZtYS0+dm1fbW0tPnN0YXJ0X2JyayAmJgorCQkJCXZtYS0+dm1fZW5kID49IHZtYS0+dm1fbW0tPmJyaykgeworCQkJbmFtZSA9IHN0cm5jcHkodG1wLCAiW2hlYXBdIiwgc2l6ZW9mKHRtcCkpOworCQkJZ290byBnb3RfbmFtZTsKKwkJfSBlbHNlIGlmICh2bWEtPnZtX3N0YXJ0IDw9IHZtYS0+dm1fbW0tPnN0YXJ0X3N0YWNrICYmCisJCQkJdm1hLT52bV9lbmQgPj0gdm1hLT52bV9tbS0+c3RhcnRfc3RhY2spIHsKKwkJCW5hbWUgPSBzdHJuY3B5KHRtcCwgIltzdGFja10iLCBzaXplb2YodG1wKSk7CisJCQlnb3RvIGdvdF9uYW1lOwogCQl9CiAKIAkJbmFtZSA9IHN0cm5jcHkodG1wLCAiLy9hbm9uIiwgc2l6ZW9mKHRtcCkpOwpAQCAtMzg0NiwxNyArMzg1OCwxNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWNwdWN0eCA9ICZnZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKLQlwZXJmX2V2ZW50X21tYXBfY3R4KCZjcHVjdHgtPmN0eCwgbW1hcF9ldmVudCk7CisJcGVyZl9ldmVudF9tbWFwX2N0eCgmY3B1Y3R4LT5jdHgsIG1tYXBfZXZlbnQsIHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKTsKIAljdHggPSByY3VfZGVyZWZlcmVuY2UoY3VycmVudC0+cGVyZl9ldmVudF9jdHhwKTsKIAlpZiAoY3R4KQotCQlwZXJmX2V2ZW50X21tYXBfY3R4KGN0eCwgbW1hcF9ldmVudCk7CisJCXBlcmZfZXZlbnRfbW1hcF9jdHgoY3R4LCBtbWFwX2V2ZW50LCB2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQyk7CiAJcHV0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlrZnJlZShidWYpOwogfQogCi12b2lkIF9fcGVyZl9ldmVudF9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQordm9pZCBwZXJmX2V2ZW50X21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHBlcmZfbW1hcF9ldmVudCBtbWFwX2V2ZW50OwogCkBAIC00MDE4LDE0ICs0MDMwLDE0IEBACiAJaHdjLT5sYXN0X3BlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKIAogYWdhaW46Ci0Jb2xkID0gdmFsID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CisJb2xkID0gdmFsID0gbG9jYWw2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KTsKIAlpZiAodmFsIDwgMCkKIAkJcmV0dXJuIDA7CiAKIAluciA9IGRpdjY0X3U2NChwZXJpb2QgKyB2YWwsIHBlcmlvZCk7CiAJb2Zmc2V0ID0gbnIgKiBwZXJpb2Q7CiAJdmFsIC09IG9mZnNldDsKLQlpZiAoYXRvbWljNjRfY21weGNoZygmaHdjLT5wZXJpb2RfbGVmdCwgb2xkLCB2YWwpICE9IG9sZCkKKwlpZiAobG9jYWw2NF9jbXB4Y2hnKCZod2MtPnBlcmlvZF9sZWZ0LCBvbGQsIHZhbCkgIT0gb2xkKQogCQlnb3RvIGFnYWluOwogCiAJcmV0dXJuIG5yOwpAQCAtNDA2NCw3ICs0MDc2LDcgQEAKIHsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKIAotCWF0b21pYzY0X2FkZChuciwgJmV2ZW50LT5jb3VudCk7CisJbG9jYWw2NF9hZGQobnIsICZldmVudC0+Y291bnQpOwogCiAJaWYgKCFyZWdzKQogCQlyZXR1cm47CkBAIC00MDc1LDcgKzQwODcsNyBAQAogCWlmIChuciA9PSAxICYmIGh3Yy0+c2FtcGxlX3BlcmlvZCA9PSAxICYmICFldmVudC0+YXR0ci5mcmVxKQogCQlyZXR1cm4gcGVyZl9zd2V2ZW50X292ZXJmbG93KGV2ZW50LCAxLCBubWksIGRhdGEsIHJlZ3MpOwogCi0JaWYgKGF0b21pYzY0X2FkZF9uZWdhdGl2ZShuciwgJmh3Yy0+cGVyaW9kX2xlZnQpKQorCWlmIChsb2NhbDY0X2FkZF9uZWdhdGl2ZShuciwgJmh3Yy0+cGVyaW9kX2xlZnQpKQogCQlyZXR1cm47CiAKIAlwZXJmX3N3ZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsIG5taSwgZGF0YSwgcmVncyk7CkBAIC00MjEzLDE0ICs0MjI1LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwZXJmX3N3ZXZlbnRfZ2V0X3JlY3Vyc2lvbl9jb250ZXh0KTsKIAotdm9pZCBwZXJmX3N3ZXZlbnRfcHV0X3JlY3Vyc2lvbl9jb250ZXh0KGludCByY3R4KQordm9pZCBpbmxpbmUgcGVyZl9zd2V2ZW50X3B1dF9yZWN1cnNpb25fY29udGV4dChpbnQgcmN0eCkKIHsKIAlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJl9fZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CiAJYmFycmllcigpOwogCWNwdWN0eC0+cmVjdXJzaW9uW3JjdHhdLS07CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwZXJmX3N3ZXZlbnRfcHV0X3JlY3Vyc2lvbl9jb250ZXh0KTsKLQogCiB2b2lkIF9fcGVyZl9zd19ldmVudCh1MzIgZXZlbnRfaWQsIHU2NCBuciwgaW50IG5taSwKIAkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTY0IGFkZHIpCkBAIC00MzY4LDggKzQzNzgsOCBAQAogCXU2NCBub3c7CiAKIAlub3cgPSBjcHVfY2xvY2soY3B1KTsKLQlwcmV2ID0gYXRvbWljNjRfeGNoZygmZXZlbnQtPmh3LnByZXZfY291bnQsIG5vdyk7Ci0JYXRvbWljNjRfYWRkKG5vdyAtIHByZXYsICZldmVudC0+Y291bnQpOworCXByZXYgPSBsb2NhbDY0X3hjaGcoJmV2ZW50LT5ody5wcmV2X2NvdW50LCBub3cpOworCWxvY2FsNjRfYWRkKG5vdyAtIHByZXYsICZldmVudC0+Y291bnQpOwogfQogCiBzdGF0aWMgaW50IGNwdV9jbG9ja19wZXJmX2V2ZW50X2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC00Mzc3LDcgKzQzODcsNyBAQAogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JYXRvbWljNjRfc2V0KCZod2MtPnByZXZfY291bnQsIGNwdV9jbG9jayhjcHUpKTsKKwlsb2NhbDY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCBjcHVfY2xvY2soY3B1KSk7CiAJcGVyZl9zd2V2ZW50X3N0YXJ0X2hydGltZXIoZXZlbnQpOwogCiAJcmV0dXJuIDA7CkBAIC00NDA5LDkgKzQ0MTksOSBAQAogCXU2NCBwcmV2OwogCXM2NCBkZWx0YTsKIAotCXByZXYgPSBhdG9taWM2NF94Y2hnKCZldmVudC0+aHcucHJldl9jb3VudCwgbm93KTsKKwlwcmV2ID0gbG9jYWw2NF94Y2hnKCZldmVudC0+aHcucHJldl9jb3VudCwgbm93KTsKIAlkZWx0YSA9IG5vdyAtIHByZXY7Ci0JYXRvbWljNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsKKwlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7CiB9CiAKIHN0YXRpYyBpbnQgdGFza19jbG9ja19wZXJmX2V2ZW50X2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC00NDIxLDcgKzQ0MzEsNyBAQAogCiAJbm93ID0gZXZlbnQtPmN0eC0+dGltZTsKIAotCWF0b21pYzY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCBub3cpOworCWxvY2FsNjRfc2V0KCZod2MtPnByZXZfY291bnQsIG5vdyk7CiAKIAlwZXJmX3N3ZXZlbnRfc3RhcnRfaHJ0aW1lcihldmVudCk7CiAKQEAgLTQ2MDEsNyArNDYxMSw3IEBACiB9CiAKIHZvaWQgcGVyZl90cF9ldmVudCh1NjQgYWRkciwgdTY0IGNvdW50LCB2b2lkICpyZWNvcmQsIGludCBlbnRyeV9zaXplLAotCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQpCisJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50IHJjdHgpCiB7CiAJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQ7CkBAIC00NjE1LDEyICs0NjI1LDEyIEBACiAJcGVyZl9zYW1wbGVfZGF0YV9pbml0KCZkYXRhLCBhZGRyKTsKIAlkYXRhLnJhdyA9ICZyYXc7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGV2ZW50LCBub2RlLCBoZWFkLCBobGlzdF9lbnRyeSkgewogCQlpZiAocGVyZl90cF9ldmVudF9tYXRjaChldmVudCwgJmRhdGEsIHJlZ3MpKQogCQkJcGVyZl9zd2V2ZW50X2FkZChldmVudCwgY291bnQsIDEsICZkYXRhLCByZWdzKTsKIAl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlwZXJmX3N3ZXZlbnRfcHV0X3JlY3Vyc2lvbl9jb250ZXh0KHJjdHgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGVyZl90cF9ldmVudCk7CiAKQEAgLTQ4NjQsNyArNDg3NCw3IEBACiAJCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IDE7CiAJaHdjLT5sYXN0X3BlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKIAotCWF0b21pYzY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgaHdjLT5zYW1wbGVfcGVyaW9kKTsKKwlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgaHdjLT5zYW1wbGVfcGVyaW9kKTsKIAogCS8qCiAJICogd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IFBFUkZfRk9STUFUX0dST1VQIG9uIGluaGVyaXRlZCBldmVudHMKQEAgLTQ5MTMsNyArNDkyMyw3IEBACiAKIAlpZiAoIWV2ZW50LT5wYXJlbnQpIHsKIAkJYXRvbWljX2luYygmbnJfZXZlbnRzKTsKLQkJaWYgKGV2ZW50LT5hdHRyLm1tYXApCisJCWlmIChldmVudC0+YXR0ci5tbWFwIHx8IGV2ZW50LT5hdHRyLm1tYXBfZGF0YSkKIAkJCWF0b21pY19pbmMoJm5yX21tYXBfZXZlbnRzKTsKIAkJaWYgKGV2ZW50LT5hdHRyLmNvbW0pCiAJCQlhdG9taWNfaW5jKCZucl9jb21tX2V2ZW50cyk7CkBAIC01MDA3LDcgKzUwMTcsNyBAQAogc3RhdGljIGludAogcGVyZl9ldmVudF9zZXRfb3V0cHV0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHBlcmZfZXZlbnQgKm91dHB1dF9ldmVudCkKIHsKLQlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEgPSBOVUxMLCAqb2xkX2RhdGEgPSBOVUxMOworCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyID0gTlVMTCwgKm9sZF9idWZmZXIgPSBOVUxMOwogCWludCByZXQgPSAtRUlOVkFMOwogCiAJaWYgKCFvdXRwdXRfZXZlbnQpCkBAIC01MDM3LDE5ICs1MDQ3LDE5IEBACiAKIAlpZiAob3V0cHV0X2V2ZW50KSB7CiAJCS8qIGdldCB0aGUgYnVmZmVyIHdlIHdhbnQgdG8gcmVkaXJlY3QgdG8gKi8KLQkJZGF0YSA9IHBlcmZfbW1hcF9kYXRhX2dldChvdXRwdXRfZXZlbnQpOwotCQlpZiAoIWRhdGEpCisJCWJ1ZmZlciA9IHBlcmZfYnVmZmVyX2dldChvdXRwdXRfZXZlbnQpOworCQlpZiAoIWJ1ZmZlcikKIAkJCWdvdG8gdW5sb2NrOwogCX0KIAotCW9sZF9kYXRhID0gZXZlbnQtPmRhdGE7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5kYXRhLCBkYXRhKTsKKwlvbGRfYnVmZmVyID0gZXZlbnQtPmJ1ZmZlcjsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPmJ1ZmZlciwgYnVmZmVyKTsKIAlyZXQgPSAwOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOwogCi0JaWYgKG9sZF9kYXRhKQotCQlwZXJmX21tYXBfZGF0YV9wdXQob2xkX2RhdGEpOworCWlmIChvbGRfYnVmZmVyKQorCQlwZXJmX2J1ZmZlcl9wdXQob2xkX2J1ZmZlcik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUyOTgsNyArNTMwOCw3IEBACiAJCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IHNhbXBsZV9wZXJpb2Q7CiAJCWh3Yy0+bGFzdF9wZXJpb2QgICA9IHNhbXBsZV9wZXJpb2Q7CiAKLQkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBzYW1wbGVfcGVyaW9kKTsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIHNhbXBsZV9wZXJpb2QpOwogCX0KIAogCWNoaWxkX2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyOwpAQCAtNTM1OSwxMiArNTM2OSwxMiBAQAogCWlmIChjaGlsZF9ldmVudC0+YXR0ci5pbmhlcml0X3N0YXQpCiAJCXBlcmZfZXZlbnRfcmVhZF9ldmVudChjaGlsZF9ldmVudCwgY2hpbGQpOwogCi0JY2hpbGRfdmFsID0gYXRvbWljNjRfcmVhZCgmY2hpbGRfZXZlbnQtPmNvdW50KTsKKwljaGlsZF92YWwgPSBwZXJmX2V2ZW50X2NvdW50KGNoaWxkX2V2ZW50KTsKIAogCS8qCiAJICogQWRkIGJhY2sgdGhlIGNoaWxkJ3MgY291bnQgdG8gdGhlIHBhcmVudCdzIGNvdW50OgogCSAqLwotCWF0b21pYzY0X2FkZChjaGlsZF92YWwsICZwYXJlbnRfZXZlbnQtPmNvdW50KTsKKwlhdG9taWM2NF9hZGQoY2hpbGRfdmFsLCAmcGFyZW50X2V2ZW50LT5jaGlsZF9jb3VudCk7CiAJYXRvbWljNjRfYWRkKGNoaWxkX2V2ZW50LT50b3RhbF90aW1lX2VuYWJsZWQsCiAJCSAgICAgJnBhcmVudF9ldmVudC0+Y2hpbGRfdG90YWxfdGltZV9lbmFibGVkKTsKIAlhdG9taWM2NF9hZGQoY2hpbGRfZXZlbnQtPnRvdGFsX3RpbWVfcnVubmluZywKZGlmZiAtLWdpdCBhL2tlcm5lbC9wbV9xb3NfcGFyYW1zLmMgYi9rZXJuZWwvcG1fcW9zX3BhcmFtcy5jCmluZGV4IGY0MmQzZjcuLjk5NmE0ZGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wbV9xb3NfcGFyYW1zLmMKKysrIGIva2VybmVsL3BtX3Fvc19wYXJhbXMuYwpAQCAtNDgsNTkgKzQ4LDQ5IEBACiAgKiBvciBwbV9xb3Nfb2JqZWN0IGxpc3QgYW5kIHBtX3Fvc19vYmplY3RzIG5lZWQgdG8gaGFwcGVuIHdpdGggcG1fcW9zX2xvY2sKICAqIGhlbGQsIHRha2VuIHdpdGggX2lycXNhdmUuICBPbmUgbG9jayB0byBydWxlIHRoZW0gYWxsCiAgKi8KLXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdW5pb24gewotCQlzMzIgdmFsdWU7Ci0JCXMzMiB1c2VjOwotCQlzMzIga2JwczsKLQl9OwotCWludCBwbV9xb3NfY2xhc3M7CitlbnVtIHBtX3Fvc190eXBlIHsKKwlQTV9RT1NfTUFYLAkJLyogcmV0dXJuIHRoZSBsYXJnZXN0IHZhbHVlICovCisJUE1fUU9TX01JTgkJLyogcmV0dXJuIHRoZSBzbWFsbGVzdCB2YWx1ZSAqLwogfTsKIAotc3RhdGljIHMzMiBtYXhfY29tcGFyZShzMzIgdjEsIHMzMiB2Mik7Ci1zdGF0aWMgczMyIG1pbl9jb21wYXJlKHMzMiB2MSwgczMyIHYyKTsKLQogc3RydWN0IHBtX3Fvc19vYmplY3QgewotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0IHJlcXVlc3RzOworCXN0cnVjdCBwbGlzdF9oZWFkIHJlcXVlc3RzOwogCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkICpub3RpZmllcnM7CiAJc3RydWN0IG1pc2NkZXZpY2UgcG1fcW9zX3Bvd2VyX21pc2NkZXY7CiAJY2hhciAqbmFtZTsKIAlzMzIgZGVmYXVsdF92YWx1ZTsKLQlhdG9taWNfdCB0YXJnZXRfdmFsdWU7Ci0JczMyICgqY29tcGFyaXRvcikoczMyLCBzMzIpOworCWVudW0gcG1fcW9zX3R5cGUgdHlwZTsKIH07CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG1fcW9zX2xvY2spOworCiBzdGF0aWMgc3RydWN0IHBtX3Fvc19vYmplY3QgbnVsbF9wbV9xb3M7CiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChjcHVfZG1hX2xhdF9ub3RpZmllcik7CiBzdGF0aWMgc3RydWN0IHBtX3Fvc19vYmplY3QgY3B1X2RtYV9wbV9xb3MgPSB7Ci0JLnJlcXVlc3RzID0ge0xJU1RfSEVBRF9JTklUKGNwdV9kbWFfcG1fcW9zLnJlcXVlc3RzLmxpc3QpfSwKKwkucmVxdWVzdHMgPSBQTElTVF9IRUFEX0lOSVQoY3B1X2RtYV9wbV9xb3MucmVxdWVzdHMsIHBtX3Fvc19sb2NrKSwKIAkubm90aWZpZXJzID0gJmNwdV9kbWFfbGF0X25vdGlmaWVyLAogCS5uYW1lID0gImNwdV9kbWFfbGF0ZW5jeSIsCiAJLmRlZmF1bHRfdmFsdWUgPSAyMDAwICogVVNFQ19QRVJfU0VDLAotCS50YXJnZXRfdmFsdWUgPSBBVE9NSUNfSU5JVCgyMDAwICogVVNFQ19QRVJfU0VDKSwKLQkuY29tcGFyaXRvciA9IG1pbl9jb21wYXJlCisJLnR5cGUgPSBQTV9RT1NfTUlOLAogfTsKIAogc3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQobmV0d29ya19sYXRfbm90aWZpZXIpOwogc3RhdGljIHN0cnVjdCBwbV9xb3Nfb2JqZWN0IG5ldHdvcmtfbGF0X3BtX3FvcyA9IHsKLQkucmVxdWVzdHMgPSB7TElTVF9IRUFEX0lOSVQobmV0d29ya19sYXRfcG1fcW9zLnJlcXVlc3RzLmxpc3QpfSwKKwkucmVxdWVzdHMgPSBQTElTVF9IRUFEX0lOSVQobmV0d29ya19sYXRfcG1fcW9zLnJlcXVlc3RzLCBwbV9xb3NfbG9jayksCiAJLm5vdGlmaWVycyA9ICZuZXR3b3JrX2xhdF9ub3RpZmllciwKIAkubmFtZSA9ICJuZXR3b3JrX2xhdGVuY3kiLAogCS5kZWZhdWx0X3ZhbHVlID0gMjAwMCAqIFVTRUNfUEVSX1NFQywKLQkudGFyZ2V0X3ZhbHVlID0gQVRPTUlDX0lOSVQoMjAwMCAqIFVTRUNfUEVSX1NFQyksCi0JLmNvbXBhcml0b3IgPSBtaW5fY29tcGFyZQorCS50eXBlID0gUE1fUU9TX01JTgogfTsKIAogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChuZXR3b3JrX3Rocm91Z2hwdXRfbm90aWZpZXIpOwogc3RhdGljIHN0cnVjdCBwbV9xb3Nfb2JqZWN0IG5ldHdvcmtfdGhyb3VnaHB1dF9wbV9xb3MgPSB7Ci0JLnJlcXVlc3RzID0ge0xJU1RfSEVBRF9JTklUKG5ldHdvcmtfdGhyb3VnaHB1dF9wbV9xb3MucmVxdWVzdHMubGlzdCl9LAorCS5yZXF1ZXN0cyA9IFBMSVNUX0hFQURfSU5JVChuZXR3b3JrX3Rocm91Z2hwdXRfcG1fcW9zLnJlcXVlc3RzLCBwbV9xb3NfbG9jayksCiAJLm5vdGlmaWVycyA9ICZuZXR3b3JrX3Rocm91Z2hwdXRfbm90aWZpZXIsCiAJLm5hbWUgPSAibmV0d29ya190aHJvdWdocHV0IiwKIAkuZGVmYXVsdF92YWx1ZSA9IDAsCi0JLnRhcmdldF92YWx1ZSA9IEFUT01JQ19JTklUKDApLAotCS5jb21wYXJpdG9yID0gbWF4X2NvbXBhcmUKKwkudHlwZSA9IFBNX1FPU19NQVgsCiB9OwogCiAKQEAgLTExMSw4ICsxMDEsNiBAQAogCSZuZXR3b3JrX3Rocm91Z2hwdXRfcG1fcW9zCiB9OwogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBtX3Fvc19sb2NrKTsKLQogc3RhdGljIHNzaXplX3QgcG1fcW9zX3Bvd2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQlzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpOwogc3RhdGljIGludCBwbV9xb3NfcG93ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CkBAIC0xMjQsNDYgKzExMiw1NSBAQAogCS5yZWxlYXNlID0gcG1fcW9zX3Bvd2VyX3JlbGVhc2UsCiB9OwogCi0vKiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIHMzMiBtYXhfY29tcGFyZShzMzIgdjEsIHMzMiB2MikKKy8qIHVubG9ja2VkIGludGVybmFsIHZhcmlhbnQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBtX3Fvc19nZXRfdmFsdWUoc3RydWN0IHBtX3Fvc19vYmplY3QgKm8pCiB7Ci0JcmV0dXJuIG1heCh2MSwgdjIpOworCWlmIChwbGlzdF9oZWFkX2VtcHR5KCZvLT5yZXF1ZXN0cykpCisJCXJldHVybiBvLT5kZWZhdWx0X3ZhbHVlOworCisJc3dpdGNoIChvLT50eXBlKSB7CisJY2FzZSBQTV9RT1NfTUlOOgorCQlyZXR1cm4gcGxpc3RfbGFzdCgmby0+cmVxdWVzdHMpLT5wcmlvOworCisJY2FzZSBQTV9RT1NfTUFYOgorCQlyZXR1cm4gcGxpc3RfZmlyc3QoJm8tPnJlcXVlc3RzKS0+cHJpbzsKKworCWRlZmF1bHQ6CisJCS8qIHJ1bnRpbWUgY2hlY2sgZm9yIG5vdCB1c2luZyBlbnVtICovCisJCUJVRygpOworCX0KIH0KIAotc3RhdGljIHMzMiBtaW5fY29tcGFyZShzMzIgdjEsIHMzMiB2MikKK3N0YXRpYyB2b2lkIHVwZGF0ZV90YXJnZXQoc3RydWN0IHBtX3Fvc19vYmplY3QgKm8sIHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLAorCQkJICBpbnQgZGVsLCBpbnQgdmFsdWUpCiB7Ci0JcmV0dXJuIG1pbih2MSwgdjIpOwotfQotCi0KLXN0YXRpYyB2b2lkIHVwZGF0ZV90YXJnZXQoaW50IHBtX3Fvc19jbGFzcykKLXsKLQlzMzIgZXh0cmVtZV92YWx1ZTsKLQlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjYWxsX25vdGlmaWVyID0gMDsKKwlpbnQgcHJldl92YWx1ZSwgY3Vycl92YWx1ZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwbV9xb3NfbG9jaywgZmxhZ3MpOwotCWV4dHJlbWVfdmFsdWUgPSBwbV9xb3NfYXJyYXlbcG1fcW9zX2NsYXNzXS0+ZGVmYXVsdF92YWx1ZTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsCi0JCQkmcG1fcW9zX2FycmF5W3BtX3Fvc19jbGFzc10tPnJlcXVlc3RzLmxpc3QsIGxpc3QpIHsKLQkJZXh0cmVtZV92YWx1ZSA9IHBtX3Fvc19hcnJheVtwbV9xb3NfY2xhc3NdLT5jb21wYXJpdG9yKAotCQkJCWV4dHJlbWVfdmFsdWUsIG5vZGUtPnZhbHVlKTsKKwlwcmV2X3ZhbHVlID0gcG1fcW9zX2dldF92YWx1ZShvKTsKKwkvKiBQTV9RT1NfREVGQVVMVF9WQUxVRSBpcyBhIHNpZ25hbCB0aGF0IHRoZSB2YWx1ZSBpcyB1bmNoYW5nZWQgKi8KKwlpZiAodmFsdWUgIT0gUE1fUU9TX0RFRkFVTFRfVkFMVUUpIHsKKwkJLyoKKwkJICogdG8gY2hhbmdlIHRoZSBsaXN0LCB3ZSBhdG9taWNhbGx5IHJlbW92ZSwgcmVpbml0CisJCSAqIHdpdGggbmV3IHZhbHVlIGFuZCBhZGQsIHRoZW4gc2VlIGlmIHRoZSBleHRyZW1hbAorCQkgKiBjaGFuZ2VkCisJCSAqLworCQlwbGlzdF9kZWwobm9kZSwgJm8tPnJlcXVlc3RzKTsKKwkJcGxpc3Rfbm9kZV9pbml0KG5vZGUsIHZhbHVlKTsKKwkJcGxpc3RfYWRkKG5vZGUsICZvLT5yZXF1ZXN0cyk7CisJfSBlbHNlIGlmIChkZWwpIHsKKwkJcGxpc3RfZGVsKG5vZGUsICZvLT5yZXF1ZXN0cyk7CisJfSBlbHNlIHsKKwkJcGxpc3RfYWRkKG5vZGUsICZvLT5yZXF1ZXN0cyk7CiAJfQotCWlmIChhdG9taWNfcmVhZCgmcG1fcW9zX2FycmF5W3BtX3Fvc19jbGFzc10tPnRhcmdldF92YWx1ZSkgIT0KLQkJCWV4dHJlbWVfdmFsdWUpIHsKLQkJY2FsbF9ub3RpZmllciA9IDE7Ci0JCWF0b21pY19zZXQoJnBtX3Fvc19hcnJheVtwbV9xb3NfY2xhc3NdLT50YXJnZXRfdmFsdWUsCi0JCQkJZXh0cmVtZV92YWx1ZSk7Ci0JCXByX2RlYnVnKEtFUk5fRVJSICJuZXcgdGFyZ2V0IGZvciBxb3MgJWQgaXMgJWRcbiIsIHBtX3Fvc19jbGFzcywKLQkJCWF0b21pY19yZWFkKCZwbV9xb3NfYXJyYXlbcG1fcW9zX2NsYXNzXS0+dGFyZ2V0X3ZhbHVlKSk7Ci0JfQorCWN1cnJfdmFsdWUgPSBwbV9xb3NfZ2V0X3ZhbHVlKG8pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtX3Fvc19sb2NrLCBmbGFncyk7CiAKLQlpZiAoY2FsbF9ub3RpZmllcikKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigKLQkJCQlwbV9xb3NfYXJyYXlbcG1fcW9zX2NsYXNzXS0+bm90aWZpZXJzLAotCQkJCQkodW5zaWduZWQgbG9uZykgZXh0cmVtZV92YWx1ZSwgTlVMTCk7CisJaWYgKHByZXZfdmFsdWUgIT0gY3Vycl92YWx1ZSkKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbihvLT5ub3RpZmllcnMsCisJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY3Vycl92YWx1ZSwKKwkJCQkJICAgICBOVUxMKTsKIH0KIAogc3RhdGljIGludCByZWdpc3Rlcl9wbV9xb3NfbWlzYyhzdHJ1Y3QgcG1fcW9zX29iamVjdCAqcW9zKQpAQCAtMTk2LDEwICsxOTMsMjMgQEAKICAqLwogaW50IHBtX3Fvc19yZXF1ZXN0KGludCBwbV9xb3NfY2xhc3MpCiB7Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZwbV9xb3NfYXJyYXlbcG1fcW9zX2NsYXNzXS0+dGFyZ2V0X3ZhbHVlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwbV9xb3NfbG9jaywgZmxhZ3MpOworCXZhbHVlID0gcG1fcW9zX2dldF92YWx1ZShwbV9xb3NfYXJyYXlbcG1fcW9zX2NsYXNzXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWx1ZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc19yZXF1ZXN0KTsKIAoraW50IHBtX3Fvc19yZXF1ZXN0X2FjdGl2ZShzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqcmVxKQoreworCXJldHVybiByZXEtPnBtX3Fvc19jbGFzcyAhPSAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fcW9zX3JlcXVlc3RfYWN0aXZlKTsKKwogLyoqCiAgKiBwbV9xb3NfYWRkX3JlcXVlc3QgLSBpbnNlcnRzIG5ldyBxb3MgcmVxdWVzdCBpbnRvIHRoZSBsaXN0CiAgKiBAcG1fcW9zX2NsYXNzOiBpZGVudGlmaWVzIHdoaWNoIGxpc3Qgb2YgcW9zIHJlcXVlc3QgdG8gdXMKQEAgLTIxMSwyNyArMjIxLDIzIEBACiAgKiBlbGVtZW50IGFzIGEgaGFuZGxlIGZvciB1c2UgaW4gdXBkYXRpbmcgYW5kIHJlbW92YWwuICBDYWxsIG5lZWRzIHRvIHNhdmUKICAqIHRoaXMgaGFuZGxlIGZvciBsYXRlciB1c2UuCiAgKi8KLXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICpwbV9xb3NfYWRkX3JlcXVlc3QoaW50IHBtX3Fvc19jbGFzcywgczMyIHZhbHVlKQordm9pZCBwbV9xb3NfYWRkX3JlcXVlc3Qoc3RydWN0IHBtX3Fvc19yZXF1ZXN0X2xpc3QgKmRlcCwKKwkJCWludCBwbV9xb3NfY2xhc3MsIHMzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqZGVwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBtX3Fvc19vYmplY3QgKm8gPSAgcG1fcW9zX2FycmF5W3BtX3Fvc19jbGFzc107CisJaW50IG5ld192YWx1ZTsKIAotCWRlcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRlcCkgewotCQlpZiAodmFsdWUgPT0gUE1fUU9TX0RFRkFVTFRfVkFMVUUpCi0JCQlkZXAtPnZhbHVlID0gcG1fcW9zX2FycmF5W3BtX3Fvc19jbGFzc10tPmRlZmF1bHRfdmFsdWU7Ci0JCWVsc2UKLQkJCWRlcC0+dmFsdWUgPSB2YWx1ZTsKLQkJZGVwLT5wbV9xb3NfY2xhc3MgPSBwbV9xb3NfY2xhc3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBtX3Fvc19sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkKCZkZXAtPmxpc3QsCi0JCQkmcG1fcW9zX2FycmF5W3BtX3Fvc19jbGFzc10tPnJlcXVlc3RzLmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbV9xb3NfbG9jaywgZmxhZ3MpOwotCQl1cGRhdGVfdGFyZ2V0KHBtX3Fvc19jbGFzcyk7CisJaWYgKHBtX3Fvc19yZXF1ZXN0X2FjdGl2ZShkZXApKSB7CisJCVdBUk4oMSwgS0VSTl9FUlIgInBtX3Fvc19hZGRfcmVxdWVzdCgpIGNhbGxlZCBmb3IgYWxyZWFkeSBhZGRlZCByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuOwogCX0KLQotCXJldHVybiBkZXA7CisJaWYgKHZhbHVlID09IFBNX1FPU19ERUZBVUxUX1ZBTFVFKQorCQluZXdfdmFsdWUgPSBvLT5kZWZhdWx0X3ZhbHVlOworCWVsc2UKKwkJbmV3X3ZhbHVlID0gdmFsdWU7CisJcGxpc3Rfbm9kZV9pbml0KCZkZXAtPmxpc3QsIG5ld192YWx1ZSk7CisJZGVwLT5wbV9xb3NfY2xhc3MgPSBwbV9xb3NfY2xhc3M7CisJdXBkYXRlX3RhcmdldChvLCAmZGVwLT5saXN0LCAwLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9xb3NfYWRkX3JlcXVlc3QpOwogCkBAIC0yNDYsMjcgKzI1MiwyOCBAQAogICogQXR0ZW1wdHMgYXJlIG1hZGUgdG8gbWFrZSB0aGlzIGNvZGUgY2FsbGFibGUgb24gaG90IGNvZGUgcGF0aHMuCiAgKi8KIHZvaWQgcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KHN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICpwbV9xb3NfcmVxLAotCQlzMzIgbmV3X3ZhbHVlKQorCQkJICAgczMyIG5ld192YWx1ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBwZW5kaW5nX3VwZGF0ZSA9IDA7CiAJczMyIHRlbXA7CisJc3RydWN0IHBtX3Fvc19vYmplY3QgKm87CiAKLQlpZiAocG1fcW9zX3JlcSkgeyAvKmd1YXJkIGFnYWluc3QgY2FsbGVycyBwYXNzaW5nIGluIG51bGwgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBtX3Fvc19sb2NrLCBmbGFncyk7Ci0JCWlmIChuZXdfdmFsdWUgPT0gUE1fUU9TX0RFRkFVTFRfVkFMVUUpCi0JCQl0ZW1wID0gcG1fcW9zX2FycmF5W3BtX3Fvc19yZXEtPnBtX3Fvc19jbGFzc10tPmRlZmF1bHRfdmFsdWU7Ci0JCWVsc2UKLQkJCXRlbXAgPSBuZXdfdmFsdWU7CisJaWYgKCFwbV9xb3NfcmVxKSAvKmd1YXJkIGFnYWluc3QgY2FsbGVycyBwYXNzaW5nIGluIG51bGwgKi8KKwkJcmV0dXJuOwogCi0JCWlmICh0ZW1wICE9IHBtX3Fvc19yZXEtPnZhbHVlKSB7Ci0JCQlwZW5kaW5nX3VwZGF0ZSA9IDE7Ci0JCQlwbV9xb3NfcmVxLT52YWx1ZSA9IHRlbXA7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKLQkJaWYgKHBlbmRpbmdfdXBkYXRlKQotCQkJdXBkYXRlX3RhcmdldChwbV9xb3NfcmVxLT5wbV9xb3NfY2xhc3MpOworCWlmICghcG1fcW9zX3JlcXVlc3RfYWN0aXZlKHBtX3Fvc19yZXEpKSB7CisJCVdBUk4oMSwgS0VSTl9FUlIgInBtX3Fvc191cGRhdGVfcmVxdWVzdCgpIGNhbGxlZCBmb3IgdW5rbm93biBvYmplY3RcbiIpOworCQlyZXR1cm47CiAJfQorCisJbyA9IHBtX3Fvc19hcnJheVtwbV9xb3NfcmVxLT5wbV9xb3NfY2xhc3NdOworCisJaWYgKG5ld192YWx1ZSA9PSBQTV9RT1NfREVGQVVMVF9WQUxVRSkKKwkJdGVtcCA9IG8tPmRlZmF1bHRfdmFsdWU7CisJZWxzZQorCQl0ZW1wID0gbmV3X3ZhbHVlOworCisJaWYgKHRlbXAgIT0gcG1fcW9zX3JlcS0+bGlzdC5wcmlvKQorCQl1cGRhdGVfdGFyZ2V0KG8sICZwbV9xb3NfcmVxLT5saXN0LCAwLCB0ZW1wKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc191cGRhdGVfcmVxdWVzdCk7CiAKQEAgLTI4MCwxOSArMjg3LDIwIEBACiAgKi8KIHZvaWQgcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KHN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICpwbV9xb3NfcmVxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHFvc19jbGFzczsKKwlzdHJ1Y3QgcG1fcW9zX29iamVjdCAqbzsKIAogCWlmIChwbV9xb3NfcmVxID09IE5VTEwpCiAJCXJldHVybjsKIAkJLyogc2lsZW50IHJldHVybiB0byBrZWVwIHBjbSBjb2RlIGNsZWFuZXIgKi8KIAotCXFvc19jbGFzcyA9IHBtX3Fvc19yZXEtPnBtX3Fvc19jbGFzczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmcG1fcW9zX3JlcS0+bGlzdCk7Ci0Ja2ZyZWUocG1fcW9zX3JlcSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKLQl1cGRhdGVfdGFyZ2V0KHFvc19jbGFzcyk7CisJaWYgKCFwbV9xb3NfcmVxdWVzdF9hY3RpdmUocG1fcW9zX3JlcSkpIHsKKwkJV0FSTigxLCBLRVJOX0VSUiAicG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCkgY2FsbGVkIGZvciB1bmtub3duIG9iamVjdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlvID0gcG1fcW9zX2FycmF5W3BtX3Fvc19yZXEtPnBtX3Fvc19jbGFzc107CisJdXBkYXRlX3RhcmdldChvLCAmcG1fcW9zX3JlcS0+bGlzdCwgMSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOworCW1lbXNldChwbV9xb3NfcmVxLCAwLCBzaXplb2YoKnBtX3Fvc19yZXEpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc19yZW1vdmVfcmVxdWVzdCk7CiAKQEAgLTM0MCw4ICszNDgsMTIgQEAKIAogCXBtX3Fvc19jbGFzcyA9IGZpbmRfcG1fcW9zX29iamVjdF9ieV9taW5vcihpbWlub3IoaW5vZGUpKTsKIAlpZiAocG1fcW9zX2NsYXNzID49IDApIHsKLQkJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgcG1fcW9zX2FkZF9yZXF1ZXN0KHBtX3Fvc19jbGFzcywKLQkJCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7CisJCXN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICpyZXEgPSBremFsbG9jKEdGUF9LRVJORUwsIHNpemVvZigqcmVxKSk7CisJCWlmICghcmVxKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcG1fcW9zX2FkZF9yZXF1ZXN0KHJlcSwgcG1fcW9zX2NsYXNzLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJlcTsKIAogCQlpZiAoZmlscC0+cHJpdmF0ZV9kYXRhKQogCQkJcmV0dXJuIDA7CkBAIC0zNTMsOCArMzY1LDkgQEAKIHsKIAlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCAqcmVxOwogCi0JcmVxID0gKHN0cnVjdCBwbV9xb3NfcmVxdWVzdF9saXN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOworCXJlcSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwlrZnJlZShyZXEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jIGIva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYwppbmRleCA5ODI5NjQ2Li5mNjZiZGQzIDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKQEAgLTIzMiwzMSArMjMyLDI0IEBACiAKIHZvaWQgdGhyZWFkX2dyb3VwX2NwdXRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB0YXNrX2NwdXRpbWUgKnRpbWVzKQogewotCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc2lnaGFuZDsKLQlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnOworCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0c2stPnNpZ25hbDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CiAKLQkqdGltZXMgPSBJTklUX0NQVVRJTUU7CisJdGltZXMtPnV0aW1lID0gc2lnLT51dGltZTsKKwl0aW1lcy0+c3RpbWUgPSBzaWctPnN0aW1lOworCXRpbWVzLT5zdW1fZXhlY19ydW50aW1lID0gc2lnLT5zdW1fc2NoZWRfcnVudGltZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzaWdoYW5kID0gcmN1X2RlcmVmZXJlbmNlKHRzay0+c2lnaGFuZCk7Ci0JaWYgKCFzaWdoYW5kKQorCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gdHJ1c3QgdHNrLT50aHJlYWRfZ3JvdXAgbGlzdCAqLworCWlmICghbGlrZWx5KHBpZF9hbGl2ZSh0c2spKSkKIAkJZ290byBvdXQ7CiAKLQlzaWcgPSB0c2stPnNpZ25hbDsKLQogCXQgPSB0c2s7CiAJZG8gewogCQl0aW1lcy0+dXRpbWUgPSBjcHV0aW1lX2FkZCh0aW1lcy0+dXRpbWUsIHQtPnV0aW1lKTsKIAkJdGltZXMtPnN0aW1lID0gY3B1dGltZV9hZGQodGltZXMtPnN0aW1lLCB0LT5zdGltZSk7CiAJCXRpbWVzLT5zdW1fZXhlY19ydW50aW1lICs9IHQtPnNlLnN1bV9leGVjX3J1bnRpbWU7Ci0KLQkJdCA9IG5leHRfdGhyZWFkKHQpOwotCX0gd2hpbGUgKHQgIT0gdHNrKTsKLQotCXRpbWVzLT51dGltZSA9IGNwdXRpbWVfYWRkKHRpbWVzLT51dGltZSwgc2lnLT51dGltZSk7Ci0JdGltZXMtPnN0aW1lID0gY3B1dGltZV9hZGQodGltZXMtPnN0aW1lLCBzaWctPnN0aW1lKTsKLQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSBzaWctPnN1bV9zY2hlZF9ydW50aW1lOworCX0gd2hpbGVfZWFjaF90aHJlYWQodHNrLCB0KTsKIG91dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTEyNzksMTAgKzEyNzIsNiBAQAogewogCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWc7CiAKLQkvKiB0c2sgPT0gY3VycmVudCwgZW5zdXJlIGl0IGlzIHNhZmUgdG8gdXNlIC0+c2lnbmFsL3NpZ2hhbmQgKi8KLQlpZiAodW5saWtlbHkodHNrLT5leGl0X3N0YXRlKSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIXRhc2tfY3B1dGltZV96ZXJvKCZ0c2stPmNwdXRpbWVfZXhwaXJlcykpIHsKIAkJc3RydWN0IHRhc2tfY3B1dGltZSB0YXNrX3NhbXBsZSA9IHsKIAkJCS51dGltZSA9IHRzay0+dXRpbWUsCkBAIC0xMjk4LDcgKzEyODcsMTAgQEAKIAlpZiAoc2lnLT5jcHV0aW1lci5ydW5uaW5nKSB7CiAJCXN0cnVjdCB0YXNrX2NwdXRpbWUgZ3JvdXBfc2FtcGxlOwogCi0JCXRocmVhZF9ncm91cF9jcHV0aW1lcih0c2ssICZncm91cF9zYW1wbGUpOworCQlzcGluX2xvY2soJnNpZy0+Y3B1dGltZXIubG9jayk7CisJCWdyb3VwX3NhbXBsZSA9IHNpZy0+Y3B1dGltZXIuY3B1dGltZTsKKwkJc3Bpbl91bmxvY2soJnNpZy0+Y3B1dGltZXIubG9jayk7CisKIAkJaWYgKHRhc2tfY3B1dGltZV9leHBpcmVkKCZncm91cF9zYW1wbGUsICZzaWctPmNwdXRpbWVfZXhwaXJlcykpCiAJCQlyZXR1cm4gMTsKIAl9CkBAIC0xMzE1LDYgKzEzMDcsNyBAQAogewogCUxJU1RfSEVBRChmaXJpbmcpOwogCXN0cnVjdCBrX2l0aW1lciAqdGltZXIsICpuZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlCVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKQEAgLTEzMjUsNyArMTMxOCw4IEBACiAJaWYgKCFmYXN0cGF0aF90aW1lcl9jaGVjayh0c2spKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKCFsb2NrX3Rhc2tfc2lnaGFuZCh0c2ssICZmbGFncykpCisJCXJldHVybjsKIAkvKgogCSAqIEhlcmUgd2UgdGFrZSBvZmYgdHNrLT5zaWduYWwtPmNwdV90aW1lcnNbTl0gYW5kCiAJICogdHNrLT5jcHVfdGltZXJzW05dIGFsbCB0aGUgdGltZXJzIHRoYXQgYXJlIGZpcmluZywgYW5kCkBAIC0xMzQ3LDcgKzEzNDEsNyBAQAogCSAqIHRoYXQgZ2V0cyB0aGUgdGltZXIgbG9jayBiZWZvcmUgd2UgZG8gd2lsbCBnaXZlIGl0IHVwIGFuZAogCSAqIHNwaW4gdW50aWwgd2UndmUgdGFrZW4gY2FyZSBvZiB0aGF0IHRpbWVyIGJlbG93LgogCSAqLwotCXNwaW5fdW5sb2NrKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCXVubG9ja190YXNrX3NpZ2hhbmQodHNrLCAmZmxhZ3MpOwogCiAJLyoKIAkgKiBOb3cgdGhhdCBhbGwgdGhlIHRpbWVycyBvbiBvdXIgbGlzdCBoYXZlIHRoZSBmaXJpbmcgZmxhZywKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwppbmRleCBhZDcyMzQyLi45Y2E0OTczIDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCkBAIC01NjAsMTEgKzU2MCw2IEBACiAJbmV3X3RpbWVyLT5pdF9jbG9jayA9IHdoaWNoX2Nsb2NrOwogCW5ld190aW1lci0+aXRfb3ZlcnJ1biA9IC0xOwogCi0JaWYgKGNvcHlfdG9fdXNlcihjcmVhdGVkX3RpbWVyX2lkLAotCQkJICZuZXdfdGltZXJfaWQsIHNpemVvZiAobmV3X3RpbWVyX2lkKSkpIHsKLQkJZXJyb3IgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9CiAJaWYgKHRpbWVyX2V2ZW50X3NwZWMpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZldmVudCwgdGltZXJfZXZlbnRfc3BlYywgc2l6ZW9mIChldmVudCkpKSB7CiAJCQllcnJvciA9IC1FRkFVTFQ7CkBAIC01OTAsNiArNTg1LDEyIEBACiAJbmV3X3RpbWVyLT5zaWdxLT5pbmZvLnNpX3RpZCAgID0gbmV3X3RpbWVyLT5pdF9pZDsKIAluZXdfdGltZXItPnNpZ3EtPmluZm8uc2lfY29kZSAgPSBTSV9USU1FUjsKIAorCWlmIChjb3B5X3RvX3VzZXIoY3JlYXRlZF90aW1lcl9pZCwKKwkJCSAmbmV3X3RpbWVyX2lkLCBzaXplb2YgKG5ld190aW1lcl9pZCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCiAJZXJyb3IgPSBDTE9DS19ESVNQQVRDSCh3aGljaF9jbG9jaywgdGltZXJfY3JlYXRlLCAobmV3X3RpbWVyKSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCBhYTllOTE2Li44ZGMzMWUwIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKKysrIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoYykgMjAwMyBQYXRyaWNrIE1vY2hlbAogICogQ29weXJpZ2h0IChjKSAyMDAzIE9wZW4gU291cmNlIERldmVsb3BtZW50IExhYgotICogQ29weXJpZ2h0IChjKSAyMDA0IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIENvcHlyaWdodCAoYykgMjAwOSBSYWZhZWwgSi4gV3lzb2NraSwgTm92ZWxsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJCWdvdG8gRW5hYmxlX2lycXM7CiAJfQogCi0JaWYgKGhpYmVybmF0aW9uX3Rlc3QoVEVTVF9DT1JFKSkKKwlpZiAoaGliZXJuYXRpb25fdGVzdChURVNUX0NPUkUpIHx8ICFwbV9jaGVja193YWtldXBfZXZlbnRzKCkpCiAJCWdvdG8gUG93ZXJfdXA7CiAKIAlpbl9zdXNwZW5kID0gMTsKQEAgLTI4OCw4ICsyODgsMTAgQEAKIAkJCWVycm9yKTsKIAkvKiBSZXN0b3JlIGNvbnRyb2wgZmxvdyBtYWdpY2FsbHkgYXBwZWFycyBoZXJlICovCiAJcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoKTsKLQlpZiAoIWluX3N1c3BlbmQpCisJaWYgKCFpbl9zdXNwZW5kKSB7CisJCWV2ZW50c19jaGVja19lbmFibGVkID0gZmFsc2U7CiAJCXBsYXRmb3JtX2xlYXZlKHBsYXRmb3JtX21vZGUpOworCX0KIAogIFBvd2VyX3VwOgogCXN5c2Rldl9yZXN1bWUoKTsKQEAgLTMyOCw3ICszMzAsNyBAQAogCiAJZXJyb3IgPSBwbGF0Zm9ybV9iZWdpbihwbGF0Zm9ybV9tb2RlKTsKIAlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwkJZ290byBDbG9zZTsKIAogCS8qIFByZWFsbG9jYXRlIGltYWdlIG1lbW9yeSBiZWZvcmUgc2h1dHRpbmcgZG93biBkZXZpY2VzLiAqLwogCWVycm9yID0gaGliZXJuYXRlX3ByZWFsbG9jYXRlX21lbW9yeSgpOwpAQCAtNTExLDE4ICs1MTMsMjQgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJc3lzZGV2X3N1c3BlbmQoUE1TR19ISUJFUk5BVEUpOworCWlmICghcG1fY2hlY2tfd2FrZXVwX2V2ZW50cygpKSB7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBQb3dlcl91cDsKKwl9CisKIAloaWJlcm5hdGlvbl9vcHMtPmVudGVyKCk7CiAJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCiAJd2hpbGUgKDEpOwogCi0JLyoKLQkgKiBXZSBkb24ndCBuZWVkIHRvIHJlZW5hYmxlIHRoZSBub25ib290IENQVXMgb3IgcmVzdW1lIGNvbnNvbGVzLCBzaW5jZQotCSAqIHRoZSBzeXN0ZW0gaXMgZ29pbmcgdG8gYmUgaGFsdGVkIGFueXdheS4KLQkgKi8KKyBQb3dlcl91cDoKKwlzeXNkZXZfcmVzdW1lKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWVuYWJsZV9ub25ib290X2NwdXMoKTsKKwogIFBsYXRmb3JtX2ZpbmlzaDoKIAloaWJlcm5hdGlvbl9vcHMtPmZpbmlzaCgpOwogCi0JZHBtX3N1c3BlbmRfbm9pcnEoUE1TR19SRVNUT1JFKTsKKwlkcG1fcmVzdW1lX25vaXJxKFBNU0dfUkVTVE9SRSk7CiAKICBSZXN1bWVfZGV2aWNlczoKIAllbnRlcmluZ19wbGF0Zm9ybV9oaWJlcm5hdGlvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggYjU4ODAwYi4uNjJiMGJjNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC0yMDQsNiArMjA0LDYwIEBACiAKIHBvd2VyX2F0dHIoc3RhdGUpOwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisvKgorICogVGhlICd3YWtldXBfY291bnQnIGF0dHJpYnV0ZSwgYWxvbmcgd2l0aCB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4KKyAqIGRyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYywgcHJvdmlkZXMgYSBtZWFucyBieSB3aGljaCB3YWtldXAgZXZlbnRzIGNhbiBiZQorICogaGFuZGxlZCBpbiBhIG5vbi1yYWN5IHdheS4KKyAqCisgKiBJZiBhIHdha2V1cCBldmVudCBvY2N1cnMgd2hlbiB0aGUgc3lzdGVtIGlzIGluIGEgc2xlZXAgc3RhdGUsIGl0IHNpbXBseSBpcworICogd29rZW4gdXAuICBJbiB0dXJuLCBpZiBhbiBldmVudCB0aGF0IHdvdWxkIHdha2UgdGhlIHN5c3RlbSB1cCBmcm9tIGEgc2xlZXAKKyAqIHN0YXRlIG9jY3VycyB3aGVuIGl0IGlzIHVuZGVyZ29pbmcgYSB0cmFuc2l0aW9uIHRvIHRoYXQgc2xlZXAgc3RhdGUsIHRoZQorICogdHJhbnNpdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4gIE1vcmVvdmVyLCBpZiBzdWNoIGFuIGV2ZW50IG9jY3VycyB3aGVuIHRoZQorICogc3lzdGVtIGlzIGluIHRoZSB3b3JraW5nIHN0YXRlLCBhbiBhdHRlbXB0IHRvIHN0YXJ0IGEgdHJhbnNpdGlvbiB0byB0aGUKKyAqIGdpdmVuIHNsZWVwIHN0YXRlIHNob3VsZCBmYWlsIGR1cmluZyBjZXJ0YWluIHBlcmlvZCBhZnRlciB0aGUgZGV0ZWN0aW9uIG9mCisgKiB0aGUgZXZlbnQuICBVc2luZyB0aGUgJ3N0YXRlJyBhdHRyaWJ1dGUgYWxvbmUgaXMgbm90IHN1ZmZpY2llbnQgdG8gc2F0aXNmeQorICogdGhlc2UgcmVxdWlyZW1lbnRzLCBiZWNhdXNlIGEgd2FrZXVwIGV2ZW50IG1heSBvY2N1ciBleGFjdGx5IHdoZW4gJ3N0YXRlJworICogaXMgYmVpbmcgd3JpdHRlbiB0byBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byB1c2VyIHNwYWNlIHJpZ2h0IGJlZm9yZSBpdCBpcworICogZnJvemVuLCBzbyB0aGUgZXZlbnQgd2lsbCByZW1haW4gb25seSBwYXJ0aWFsbHkgcHJvY2Vzc2VkIHVudGlsIHRoZSBzeXN0ZW0gaXMKKyAqIHdva2VuIHVwIGJ5IGFub3RoZXIgZXZlbnQuICBJbiBwYXJ0aWN1bGFyLCBpdCB3b24ndCBjYXVzZSB0aGUgdHJhbnNpdGlvbiB0bworICogYSBzbGVlcCBzdGF0ZSB0byBiZSBhYm9ydGVkLgorICoKKyAqIFRoaXMgZGlmZmljdWx0eSBtYXkgYmUgb3ZlcmNvbWUgaWYgdXNlciBzcGFjZSB1c2VzICd3YWtldXBfY291bnQnIGJlZm9yZQorICogd3JpdGluZyB0byAnc3RhdGUnLiAgSXQgZmlyc3Qgc2hvdWxkIHJlYWQgZnJvbSAnd2FrZXVwX2NvdW50JyBhbmQgc3RvcmUKKyAqIHRoZSByZWFkIHZhbHVlLiAgVGhlbiwgYWZ0ZXIgY2Fycnlpbmcgb3V0IGl0cyBvd24gcHJlcGFyYXRpb25zIGZvciB0aGUgc3lzdGVtCisgKiB0cmFuc2l0aW9uIHRvIGEgc2xlZXAgc3RhdGUsIGl0IHNob3VsZCB3cml0ZSB0aGUgc3RvcmVkIHZhbHVlIHRvCisgKiAnd2FrZXVwX2NvdW50Jy4gIElmIHRoYXQgZmFpbHMsIGF0IGxlYXN0IG9uZSB3YWtldXAgZXZlbnQgaGFzIG9jY3VyZWQgc2luY2UKKyAqICd3YWtldXBfY291bnQnIHdhcyByZWFkIGFuZCAnc3RhdGUnIHNob3VsZCBub3QgYmUgd3JpdHRlbiB0by4gIE90aGVyd2lzZSwgaXQKKyAqIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gJ3N0YXRlJywgYnV0IHRoZSB0cmFuc2l0aW9uIHdpbGwgYmUgYWJvcnRlZCBpZiB0aGVyZQorICogYXJlIGFueSB3YWtldXAgZXZlbnRzIGRldGVjdGVkIGFmdGVyICd3YWtldXBfY291bnQnIHdhcyB3cml0dGVuIHRvLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdha2V1cF9jb3VudF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlyZXR1cm4gcG1fZ2V0X3dha2V1cF9jb3VudCgmdmFsKSA/IHNwcmludGYoYnVmLCAiJWx1XG4iLCB2YWwpIDogLUVJTlRSOworfQorCitzdGF0aWMgc3NpemVfdCB3YWtldXBfY291bnRfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVsdSIsICZ2YWwpID09IDEpIHsKKwkJaWYgKHBtX3NhdmVfd2FrZXVwX2NvdW50KHZhbCkpCisJCQlyZXR1cm4gbjsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3Bvd2VyX2F0dHIod2FrZXVwX2NvdW50KTsKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKwogI2lmZGVmIENPTkZJR19QTV9UUkFDRQogaW50IHBtX3RyYWNlX2VuYWJsZWQ7CiAKQEAgLTIzNiw2ICsyOTAsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJJnBtX2FzeW5jX2F0dHIuYXR0ciwKKwkmd2FrZXVwX2NvdW50X2F0dHIuYXR0ciwKICNpZmRlZiBDT05GSUdfUE1fREVCVUcKIAkmcG1fdGVzdF9hdHRyLmF0dHIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKaW5kZXggMjVjZTAxMC4uZjZjZDZmYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKKysrIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBmaWxlIHByb3ZpZGVzIHN5c3RlbSBzbmFwc2hvdC9yZXN0b3JlIGZ1bmN0aW9uYWxpdHkgZm9yIHN3c3VzcC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIENvcHlyaWdodCAoQykgMjAwNiBSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IGYzN2NiN2QuLjczMzU5NTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMTM2LDE5ICsxMzYsMTkgQEAKIAlpZiAoc3VzcGVuZF9vcHMtPnByZXBhcmUpIHsKIAkJZXJyb3IgPSBzdXNwZW5kX29wcy0+cHJlcGFyZSgpOwogCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7CisJCQlnb3RvIFBsYXRmb3JtX2ZpbmlzaDsKIAl9CiAKIAllcnJvciA9IGRwbV9zdXNwZW5kX25vaXJxKFBNU0dfU1VTUEVORCk7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUE06IFNvbWUgZGV2aWNlcyBmYWlsZWQgdG8gcG93ZXIgZG93blxuIik7Ci0JCWdvdG8gUGxhdGZyb21fZmluaXNoOworCQlnb3RvIFBsYXRmb3JtX2ZpbmlzaDsKIAl9CiAKIAlpZiAoc3VzcGVuZF9vcHMtPnByZXBhcmVfbGF0ZSkgewogCQllcnJvciA9IHN1c3BlbmRfb3BzLT5wcmVwYXJlX2xhdGUoKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBQb3dlcl91cF9kZXZpY2VzOworCQkJZ290byBQbGF0Zm9ybV93YWtlOwogCX0KIAogCWlmIChzdXNwZW5kX3Rlc3QoVEVTVF9QTEFURk9STSkpCkBAIC0xNjMsOCArMTYzLDEwIEBACiAKIAllcnJvciA9IHN5c2Rldl9zdXNwZW5kKFBNU0dfU1VTUEVORCk7CiAJaWYgKCFlcnJvcikgewotCQlpZiAoIXN1c3BlbmRfdGVzdChURVNUX0NPUkUpKQorCQlpZiAoIXN1c3BlbmRfdGVzdChURVNUX0NPUkUpICYmIHBtX2NoZWNrX3dha2V1cF9ldmVudHMoKSkgewogCQkJZXJyb3IgPSBzdXNwZW5kX29wcy0+ZW50ZXIoc3RhdGUpOworCQkJZXZlbnRzX2NoZWNrX2VuYWJsZWQgPSBmYWxzZTsKKwkJfQogCQlzeXNkZXZfcmVzdW1lKCk7CiAJfQogCkBAIC0xNzgsMTAgKzE4MCw5IEBACiAJaWYgKHN1c3BlbmRfb3BzLT53YWtlKQogCQlzdXNwZW5kX29wcy0+d2FrZSgpOwogCi0gUG93ZXJfdXBfZGV2aWNlczoKIAlkcG1fcmVzdW1lX25vaXJxKFBNU0dfUkVTVU1FKTsKIAotIFBsYXRmcm9tX2ZpbmlzaDoKKyBQbGF0Zm9ybV9maW5pc2g6CiAJaWYgKHN1c3BlbmRfb3BzLT5maW5pc2gpCiAJCXN1c3BlbmRfb3BzLT5maW5pc2goKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3YXAuYyBiL2tlcm5lbC9wb3dlci9zd2FwLmMKaW5kZXggYjBiYjIxNy4uZTZhNWJkZiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N3YXAuYworKysgYi9rZXJuZWwvcG93ZXIvc3dhcC5jCkBAIC00LDcgKzQsNyBAQAogICogVGhpcyBmaWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyB0aGUgc3VzcGVuZCBpbWFnZSBmcm9tCiAgKiBhbmQgd3JpdGluZyBpdCB0byBhIHN3YXAgcGFydGl0aW9uLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCwyMDAxLTIwMDUgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChDKSAxOTk4LDIwMDEtMjAwNSBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIENvcHlyaWdodCAoQykgMjAwNiBSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KQEAgLTMyLDcgKzMyLDcgQEAKIC8qCiAgKglUaGUgc3dhcCBtYXAgaXMgYSBkYXRhIHN0cnVjdHVyZSB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGVhY2ggcGFnZQogICoJd3JpdHRlbiB0byBhIHN3YXAgcGFydGl0aW9uLiAgSXQgY29uc2lzdHMgb2YgbWFueSBzd2FwX21hcF9wYWdlCi0gKglzdHJ1Y3R1cmVzIHRoYXQgY29udGFpbiBlYWNoIGFuIGFycmF5IG9mIE1BUF9QQUdFX1NJWkUgc3dhcCBlbnRyaWVzLgorICoJc3RydWN0dXJlcyB0aGF0IGNvbnRhaW4gZWFjaCBhbiBhcnJheSBvZiBNQVBfUEFHRV9FTlRSSUVTIHN3YXAgZW50cmllcy4KICAqCVRoZXNlIHN0cnVjdHVyZXMgYXJlIHN0b3JlZCBvbiB0aGUgc3dhcCBhbmQgbGlua2VkIHRvZ2V0aGVyIHdpdGggdGhlCiAgKgloZWxwIG9mIHRoZSAubmV4dF9zd2FwIG1lbWJlci4KICAqCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogLyoqCiAgKglmcmVlX2FsbF9zd2FwX3BhZ2VzIC0gZnJlZSBzd2FwIHBhZ2VzIGFsbG9jYXRlZCBmb3Igc2F2aW5nIGltYWdlIGRhdGEuCi0gKglJdCBhbHNvIGZyZWVzIHRoZSBleHRlbnRzIHVzZWQgdG8gcmVnaXN0ZXIgd2hpY2ggc3dhcCBlbnRyZXMgaGFkIGJlZW4KKyAqCUl0IGFsc28gZnJlZXMgdGhlIGV4dGVudHMgdXNlZCB0byByZWdpc3RlciB3aGljaCBzd2FwIGVudHJpZXMgaGFkIGJlZW4KICAqCWFsbG9jYXRlZC4KICAqLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggNDQ0Yjc3MC4uNGFiMDE2NCAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttc2dfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2xvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC05ODUsNiArOTg3LDMyIEBACiB9CiAKIC8qKgorICogY29uc29sZV9jcHVfbm90aWZ5IC0gcHJpbnQgZGVmZXJyZWQgY29uc29sZSBtZXNzYWdlcyBhZnRlciBDUFUgaG90cGx1ZworICogQHNlbGY6IG5vdGlmaWVyIHN0cnVjdAorICogQGFjdGlvbjogQ1BVIGhvdHBsdWcgZXZlbnQKKyAqIEBoY3B1OiB1bnVzZWQKKyAqCisgKiBJZiBwcmludGsoKSBpcyBjYWxsZWQgZnJvbSBhIENQVSB0aGF0IGlzIG5vdCBvbmxpbmUgeWV0LCB0aGUgbWVzc2FnZXMKKyAqIHdpbGwgYmUgc3Bvb2xlZCBidXQgd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgY29uc29sZS4gIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGNhbGxlZCB3aGVuIGEgbmV3IENQVSBjb21lcyBvbmxpbmUgKG9yIGZhaWxzIHRvIGNvbWUgdXApLCBhbmQgZW5zdXJlcworICogdGhhdCBhbnkgc3VjaCBvdXRwdXQgZ2V0cyBwcmludGVkLgorICovCitzdGF0aWMgaW50IF9fY3B1aW5pdCBjb25zb2xlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX0RFQUQ6CisJY2FzZSBDUFVfRFlJTkc6CisJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCisvKioKICAqIGFjcXVpcmVfY29uc29sZV9zZW0gLSBsb2NrIHRoZSBjb25zb2xlIHN5c3RlbSBmb3IgZXhjbHVzaXZlIHVzZS4KICAqCiAgKiBBY3F1aXJlcyBhIHNlbWFwaG9yZSB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlIGNhbGxlciBoYXMKQEAgLTEzNzEsNyArMTM5OSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfY29uc29sZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfYm9vdF9jb25zb2xlcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHJpbnRrX2xhdGVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjb25zb2xlICpjb247CiAKQEAgLTEzODIsOSArMTQxMCwxMCBAQAogCQkJdW5yZWdpc3Rlcl9jb25zb2xlKGNvbik7CiAJCX0KIAl9CisJaG90Y3B1X25vdGlmaWVyKGNvbnNvbGVfY3B1X25vdGlmeSwgMCk7CiAJcmV0dXJuIDA7CiB9Ci1sYXRlX2luaXRjYWxsKGRpc2FibGVfYm9vdF9jb25zb2xlcyk7CitsYXRlX2luaXRjYWxsKHByaW50a19sYXRlX2luaXQpOwogCiAjaWYgZGVmaW5lZCBDT05GSUdfUFJJTlRLCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwZGF0ZS5jIGIva2VybmVsL3JjdXBkYXRlLmMKaW5kZXggNzJhOGRjOS4uNGQxNjk4MyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXBkYXRlLmMKKysrIGIva2VybmVsL3JjdXBkYXRlLmMKQEAgLTExNCwzICsxMTQsMTYzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyY3VfbXlfdGhyZWFkX2dyb3VwX2VtcHR5KTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1BST1ZFX1JDVSAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19pbml0X3JjdV9oZWFkKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlkZWJ1Z19vYmplY3RfaW5pdChoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19yY3VfaGVhZF9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlkZWJ1Z19vYmplY3RfZnJlZShoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjcik7Cit9CisKKy8qCisgKiBmaXh1cF9pbml0IGlzIGNhbGxlZCB3aGVuOgorICogLSBhbiBhY3RpdmUgb2JqZWN0IGlzIGluaXRpYWxpemVkCisgKi8KK3N0YXRpYyBpbnQgcmN1aGVhZF9maXh1cF9pbml0KHZvaWQgKmFkZHIsIGVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCByY3VfaGVhZCAqaGVhZCA9IGFkZHI7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPREVCVUdfU1RBVEVfQUNUSVZFOgorCQkvKgorCQkgKiBFbnN1cmUgdGhhdCBxdWV1ZWQgY2FsbGJhY2tzIGFyZSBhbGwgZXhlY3V0ZWQuCisJCSAqIElmIHdlIGRldGVjdCB0aGF0IHdlIGFyZSBuZXN0ZWQgaW4gYSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCisJCSAqIHNlY3Rpb24sIHdlIHNob3VsZCBzaW1wbHkgZmFpbCwgb3RoZXJ3aXNlIHdlIHdvdWxkIGRlYWRsb2NrLgorCQkgKi8KKwkJaWYgKHJjdV9wcmVlbXB0X2RlcHRoKCkgIT0gMCB8fCBwcmVlbXB0X2NvdW50KCkgIT0gMCB8fAorCQkgICAgaXJxc19kaXNhYmxlZCgpKSB7CisJCQlXQVJOX09OKDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmN1X2JhcnJpZXIoKTsKKwkJcmN1X2JhcnJpZXJfc2NoZWQoKTsKKwkJcmN1X2JhcnJpZXJfYmgoKTsKKwkJZGVidWdfb2JqZWN0X2luaXQoaGVhZCwgJnJjdWhlYWRfZGVidWdfZGVzY3IpOworCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBmaXh1cF9hY3RpdmF0ZSBpcyBjYWxsZWQgd2hlbjoKKyAqIC0gYW4gYWN0aXZlIG9iamVjdCBpcyBhY3RpdmF0ZWQKKyAqIC0gYW4gdW5rbm93biBvYmplY3QgaXMgYWN0aXZhdGVkIChtaWdodCBiZSBhIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgb2JqZWN0KQorICogQWN0aXZhdGlvbiBpcyBwZXJmb3JtZWQgaW50ZXJuYWxseSBieSBjYWxsX3JjdSgpLgorICovCitzdGF0aWMgaW50IHJjdWhlYWRfZml4dXBfYWN0aXZhdGUodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IHJjdV9oZWFkICpoZWFkID0gYWRkcjsKKworCXN3aXRjaCAoc3RhdGUpIHsKKworCWNhc2UgT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRToKKwkJLyoKKwkJICogVGhpcyBpcyBub3QgcmVhbGx5IGEgZml4dXAuIFdlIGp1c3QgbWFrZSBzdXJlIHRoYXQgaXQgaXMKKwkJICogdHJhY2tlZCBpbiB0aGUgb2JqZWN0IHRyYWNrZXIuCisJCSAqLworCQlkZWJ1Z19vYmplY3RfaW5pdChoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjcik7CisJCWRlYnVnX29iamVjdF9hY3RpdmF0ZShoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjcik7CisJCXJldHVybiAwOworCisJY2FzZSBPREVCVUdfU1RBVEVfQUNUSVZFOgorCQkvKgorCQkgKiBFbnN1cmUgdGhhdCBxdWV1ZWQgY2FsbGJhY2tzIGFyZSBhbGwgZXhlY3V0ZWQuCisJCSAqIElmIHdlIGRldGVjdCB0aGF0IHdlIGFyZSBuZXN0ZWQgaW4gYSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsCisJCSAqIHNlY3Rpb24sIHdlIHNob3VsZCBzaW1wbHkgZmFpbCwgb3RoZXJ3aXNlIHdlIHdvdWxkIGRlYWRsb2NrLgorCQkgKi8KKwkJaWYgKHJjdV9wcmVlbXB0X2RlcHRoKCkgIT0gMCB8fCBwcmVlbXB0X2NvdW50KCkgIT0gMCB8fAorCQkgICAgaXJxc19kaXNhYmxlZCgpKSB7CisJCQlXQVJOX09OKDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmN1X2JhcnJpZXIoKTsKKwkJcmN1X2JhcnJpZXJfc2NoZWQoKTsKKwkJcmN1X2JhcnJpZXJfYmgoKTsKKwkJZGVidWdfb2JqZWN0X2FjdGl2YXRlKGhlYWQsICZyY3VoZWFkX2RlYnVnX2Rlc2NyKTsKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogZml4dXBfZnJlZSBpcyBjYWxsZWQgd2hlbjoKKyAqIC0gYW4gYWN0aXZlIG9iamVjdCBpcyBmcmVlZAorICovCitzdGF0aWMgaW50IHJjdWhlYWRfZml4dXBfZnJlZSh2b2lkICphZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQgPSBhZGRyOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgT0RFQlVHX1NUQVRFX0FDVElWRToKKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgcXVldWVkIGNhbGxiYWNrcyBhcmUgYWxsIGV4ZWN1dGVkLgorCQkgKiBJZiB3ZSBkZXRlY3QgdGhhdCB3ZSBhcmUgbmVzdGVkIGluIGEgUkNVIHJlYWQtc2lkZSBjcml0aWNhbAorCQkgKiBzZWN0aW9uLCB3ZSBzaG91bGQgc2ltcGx5IGZhaWwsIG90aGVyd2lzZSB3ZSB3b3VsZCBkZWFkbG9jay4KKwkJICovCisjaWZuZGVmIENPTkZJR19QUkVFTVBUCisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworI2Vsc2UKKwkJaWYgKHJjdV9wcmVlbXB0X2RlcHRoKCkgIT0gMCB8fCBwcmVlbXB0X2NvdW50KCkgIT0gMCB8fAorCQkgICAgaXJxc19kaXNhYmxlZCgpKSB7CisJCQlXQVJOX09OKDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmN1X2JhcnJpZXIoKTsKKwkJcmN1X2JhcnJpZXJfc2NoZWQoKTsKKwkJcmN1X2JhcnJpZXJfYmgoKTsKKwkJZGVidWdfb2JqZWN0X2ZyZWUoaGVhZCwgJnJjdWhlYWRfZGVidWdfZGVzY3IpOworCQlyZXR1cm4gMTsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKiBpbml0X3JjdV9oZWFkX29uX3N0YWNrKCkgLSBpbml0aWFsaXplIG9uLXN0YWNrIHJjdV9oZWFkIGZvciBkZWJ1Z29iamVjdHMKKyAqIEBoZWFkOiBwb2ludGVyIHRvIHJjdV9oZWFkIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5mb3JtcyBkZWJ1Z29iamVjdHMgb2YgYSBuZXcgcmN1X2hlYWQgc3RydWN0dXJlIHRoYXQKKyAqIGhhcyBiZWVuIGFsbG9jYXRlZCBhcyBhbiBhdXRvIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gIFRoaXMgZnVuY3Rpb24KKyAqIGlzIG5vdCByZXF1aXJlZCBmb3IgcmN1X2hlYWQgc3RydWN0dXJlcyB0aGF0IGFyZSBzdGF0aWNhbGx5IGRlZmluZWQgb3IKKyAqIHRoYXQgYXJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbiB0aGUgaGVhcC4gIFRoaXMgZnVuY3Rpb24gaGFzIG5vCisgKiBlZmZlY3QgZm9yICFDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCBrZXJuZWwgYnVpbGRzLgorICovCit2b2lkIGluaXRfcmN1X2hlYWRfb25fc3RhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCWRlYnVnX29iamVjdF9pbml0X29uX3N0YWNrKGhlYWQsICZyY3VoZWFkX2RlYnVnX2Rlc2NyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGluaXRfcmN1X2hlYWRfb25fc3RhY2spOworCisvKioKKyAqIGRlc3Ryb3lfcmN1X2hlYWRfb25fc3RhY2soKSAtIGRlc3Ryb3kgb24tc3RhY2sgcmN1X2hlYWQgZm9yIGRlYnVnb2JqZWN0cworICogQGhlYWQ6IHBvaW50ZXIgdG8gcmN1X2hlYWQgc3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmZvcm1zIGRlYnVnb2JqZWN0cyB0aGF0IGFuIG9uLXN0YWNrIHJjdV9oZWFkIHN0cnVjdHVyZQorICogaXMgYWJvdXQgdG8gZ28gb3V0IG9mIHNjb3BlLiAgQXMgd2l0aCBpbml0X3JjdV9oZWFkX29uX3N0YWNrKCksIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgcmN1X2hlYWQgc3RydWN0dXJlcyB0aGF0IGFyZSBzdGF0aWNhbGx5CisgKiBkZWZpbmVkIG9yIHRoYXQgYXJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbiB0aGUgaGVhcC4gIEFsc28gYXMgd2l0aAorICogaW5pdF9yY3VfaGVhZF9vbl9zdGFjaygpLCB0aGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QgZm9yCisgKiAhQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQga2VybmVsIGJ1aWxkcy4KKyAqLwordm9pZCBkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlkZWJ1Z19vYmplY3RfZnJlZShoZWFkLCAmcmN1aGVhZF9kZWJ1Z19kZXNjcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKTsKKworc3RydWN0IGRlYnVnX29ial9kZXNjciByY3VoZWFkX2RlYnVnX2Rlc2NyID0geworCS5uYW1lID0gInJjdV9oZWFkIiwKKwkuZml4dXBfaW5pdCA9IHJjdWhlYWRfZml4dXBfaW5pdCwKKwkuZml4dXBfYWN0aXZhdGUgPSByY3VoZWFkX2ZpeHVwX2FjdGl2YXRlLAorCS5maXh1cF9mcmVlID0gcmN1aGVhZF9maXh1cF9mcmVlLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJjdWhlYWRfZGVidWdfZGVzY3IpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRpbnkuYyBiL2tlcm5lbC9yY3V0aW55LmMKaW5kZXggMzg3MjlkMy4uMTk2ZWMwMiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRpbnkuYworKysgYi9rZXJuZWwvcmN1dGlueS5jCkBAIC0xNjksNiArMTY5LDcgQEAKIAl3aGlsZSAobGlzdCkgewogCQluZXh0ID0gbGlzdC0+bmV4dDsKIAkJcHJlZmV0Y2gobmV4dCk7CisJCWRlYnVnX3JjdV9oZWFkX3VucXVldWUobGlzdCk7CiAJCWxpc3QtPmZ1bmMobGlzdCk7CiAJCWxpc3QgPSBuZXh0OwogCX0KQEAgLTIxMSw2ICsyMTIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlkZWJ1Z19yY3VfaGVhZF9xdWV1ZShoZWFkKTsKIAloZWFkLT5mdW5jID0gZnVuYzsKIAloZWFkLT5uZXh0ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggNjUzNWFjOC4uMmUyNzI2ZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC0yMzksOCArMjM5LDcgQEAKIHJjdV9yYW5kb20oc3RydWN0IHJjdV9yYW5kb21fc3RhdGUgKnJyc3ApCiB7CiAJaWYgKC0tcnJzcC0+cnJzX2NvdW50IDwgMCkgewotCQlycnNwLT5ycnNfc3RhdGUgKz0KLQkJCSh1bnNpZ25lZCBsb25nKWNwdV9jbG9jayhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJcnJzcC0+cnJzX3N0YXRlICs9ICh1bnNpZ25lZCBsb25nKWxvY2FsX2Nsb2NrKCk7CiAJCXJyc3AtPnJyc19jb3VudCA9IFJDVV9SQU5ET01fUkVGUkVTSDsKIAl9CiAJcnJzcC0+cnJzX3N0YXRlID0gcnJzcC0+cnJzX3N0YXRlICogUkNVX1JBTkRPTV9NVUxUICsgUkNVX1JBTkRPTV9BREQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5jIGIva2VybmVsL3JjdXRyZWUuYwppbmRleCBkNDQzNzM0Li5kNWJjNDM5IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5jCisrKyBiL2tlcm5lbC9yY3V0cmVlLmMKQEAgLTExMTIsNiArMTExMiw3IEBACiAJd2hpbGUgKGxpc3QpIHsKIAkJbmV4dCA9IGxpc3QtPm5leHQ7CiAJCXByZWZldGNoKG5leHQpOworCQlkZWJ1Z19yY3VfaGVhZF91bnF1ZXVlKGxpc3QpOwogCQlsaXN0LT5mdW5jKGxpc3QpOwogCQlsaXN0ID0gbmV4dDsKIAkJaWYgKCsrY291bnQgPj0gcmRwLT5ibGltaXQpCkBAIC0xMzg4LDYgKzEzODksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CiAKKwlkZWJ1Z19yY3VfaGVhZF9xdWV1ZShoZWFkKTsKIAloZWFkLT5mdW5jID0gZnVuYzsKIAloZWFkLT5uZXh0ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBmNTJhODgwLi40MTU0MWQ3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtNzcsNiArNzcsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCiAjaW5jbHVkZSAic2NoZWRfY3B1cHJpLmgiCisjaW5jbHVkZSAid29ya3F1ZXVlX3NjaGVkLmgiCiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgpAQCAtNDU2LDkgKzQ1NywxMCBAQAogCXVuc2lnbmVkIGxvbmcgbnJfcnVubmluZzsKIAkjZGVmaW5lIENQVV9MT0FEX0lEWF9NQVggNQogCXVuc2lnbmVkIGxvbmcgY3B1X2xvYWRbQ1BVX0xPQURfSURYX01BWF07CisJdW5zaWduZWQgbG9uZyBsYXN0X2xvYWRfdXBkYXRlX3RpY2s7CiAjaWZkZWYgQ09ORklHX05PX0haCiAJdTY0IG5vaHpfc3RhbXA7Ci0JdW5zaWduZWQgY2hhciBpbl9ub2h6X3JlY2VudGx5OworCXVuc2lnbmVkIGNoYXIgbm9oel9iYWxhbmNlX2tpY2s7CiAjZW5kaWYKIAl1bnNpZ25lZCBpbnQgc2tpcF9jbG9ja191cGRhdGU7CiAKQEAgLTExOTMsNiArMTE5NSwyNyBAQAogCiAjaWZkZWYgQ09ORklHX05PX0haCiAvKgorICogSW4gdGhlIHNlbWkgaWRsZSBjYXNlLCB1c2UgdGhlIG5lYXJlc3QgYnVzeSBjcHUgZm9yIG1pZ3JhdGluZyB0aW1lcnMKKyAqIGZyb20gYW4gaWRsZSBjcHUuICBUaGlzIGlzIGdvb2QgZm9yIHBvd2VyLXNhdmluZ3MuCisgKgorICogV2UgZG9uJ3QgZG8gc2ltaWxhciBvcHRpbWl6YXRpb24gZm9yIGNvbXBsZXRlbHkgaWRsZSBzeXN0ZW0sIGFzCisgKiBzZWxlY3RpbmcgYW4gaWRsZSBjcHUgd2lsbCBhZGQgbW9yZSBkZWxheXMgdG8gdGhlIHRpbWVycyB0aGFuIGludGVuZGVkCisgKiAoYXMgdGhhdCBjcHUncyB0aW1lciBiYXNlIG1heSBub3QgYmUgdXB0b2RhdGUgd3J0IGppZmZpZXMgZXRjKS4KKyAqLworaW50IGdldF9ub2h6X3RpbWVyX3RhcmdldCh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGk7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQlmb3JfZWFjaF9jcHUoaSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKQorCQkJaWYgKCFpZGxlX2NwdShpKSkKKwkJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIGNwdTsKK30KKy8qCiAgKiBXaGVuIGFkZF90aW1lcl9vbigpIGVucXVldWVzIGEgdGltZXIgaW50byB0aGUgdGltZXIgd2hlZWwgb2YgYW4KICAqIGlkbGUgQ1BVIHRoZW4gdGhpcyB0aW1lciBtaWdodCBleHBpcmUgYmVmb3JlIHRoZSBuZXh0IHRpbWVyIGV2ZW50CiAgKiB3aGljaCBpcyBzY2hlZHVsZWQgdG8gd2FrZSB1cCB0aGF0IENQVS4gSW4gY2FzZSBvZiBhIGNvbXBsZXRlbHkKQEAgLTEyMzIsMTYgKzEyNTUsNiBAQAogCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGNwdSk7CiB9CiAKLWludCBub2h6X3JhdGVsaW1pdChpbnQgY3B1KQotewotCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKLQl1NjQgZGlmZiA9IHJxLT5jbG9jayAtIHJxLT5ub2h6X3N0YW1wOwotCi0JcnEtPm5vaHpfc3RhbXAgPSBycS0+Y2xvY2s7Ci0KLQlyZXR1cm4gZGlmZiA8IChOU0VDX1BFUl9TRUMgLyBIWikgPj4gMTsKLX0KLQogI2VuZGlmIC8qIENPTkZJR19OT19IWiAqLwogCiBzdGF0aWMgdTY0IHNjaGVkX2F2Z19wZXJpb2Qodm9pZCkKQEAgLTE2NTIsNyArMTY2NSw3IEBACiAJaWYgKHJvb3RfdGFza19ncm91cF9lbXB0eSgpKQogCQlyZXR1cm47CiAKLQlub3cgPSBjcHVfY2xvY2socmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJbm93ID0gbG9jYWxfY2xvY2soKTsKIAllbGFwc2VkID0gbm93IC0gc2QtPmxhc3RfdXBkYXRlOwogCiAJaWYgKGVsYXBzZWQgPj0gKHM2NCkodTY0KXN5c2N0bF9zY2hlZF9zaGFyZXNfcmF0ZWxpbWl0KSB7CkBAIC0xODA1LDYgKzE4MTgsNyBAQAogc3RhdGljIHZvaWQgY2FsY19sb2FkX2FjY291bnRfaWRsZShzdHJ1Y3QgcnEgKnRoaXNfcnEpOwogc3RhdGljIHZvaWQgdXBkYXRlX3N5c2N0bCh2b2lkKTsKIHN0YXRpYyBpbnQgZ2V0X3VwZGF0ZV9zeXNjdGxfZmFjdG9yKHZvaWQpOworc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9sb2FkKHN0cnVjdCBycSAqdGhpc19ycSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF90YXNrX2NwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBjcHUpCiB7CkBAIC0yMjY3LDExICsyMjgxLDU1IEBACiB9CiAjZW5kaWYKIAotLyoqKgorc3RhdGljIGlubGluZSB2b2lkIHR0d3VfYWN0aXZhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEgKnJxLAorCQkJCSBib29sIGlzX3N5bmMsIGJvb2wgaXNfbWlncmF0ZSwgYm9vbCBpc19sb2NhbCwKKwkJCQkgdW5zaWduZWQgbG9uZyBlbl9mbGFncykKK3sKKwlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyk7CisJaWYgKGlzX3N5bmMpCisJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3N5bmMpOworCWlmIChpc19taWdyYXRlKQorCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKKwlpZiAoaXNfbG9jYWwpCisJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2xvY2FsKTsKKwllbHNlCisJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7CisKKwlhY3RpdmF0ZV90YXNrKHJxLCBwLCBlbl9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHd1X3Bvc3RfYWN0aXZhdGlvbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBycSAqcnEsCisJCQkJCWludCB3YWtlX2ZsYWdzLCBib29sIHN1Y2Nlc3MpCit7CisJdHJhY2Vfc2NoZWRfd2FrZXVwKHAsIHN1Y2Nlc3MpOworCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCwgd2FrZV9mbGFncyk7CisKKwlwLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX3dva2VuKQorCQlwLT5zY2hlZF9jbGFzcy0+dGFza193b2tlbihycSwgcCk7CisKKwlpZiAodW5saWtlbHkocnEtPmlkbGVfc3RhbXApKSB7CisJCXU2NCBkZWx0YSA9IHJxLT5jbG9jayAtIHJxLT5pZGxlX3N0YW1wOworCQl1NjQgbWF4ID0gMipzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CisKKwkJaWYgKGRlbHRhID4gbWF4KQorCQkJcnEtPmF2Z19pZGxlID0gbWF4OworCQllbHNlCisJCQl1cGRhdGVfYXZnKCZycS0+YXZnX2lkbGUsIGRlbHRhKTsKKwkJcnEtPmlkbGVfc3RhbXAgPSAwOworCX0KKyNlbmRpZgorCS8qIGlmIGEgd29ya2VyIGlzIHdha2luZyB1cCwgbm90aWZ5IHdvcmtxdWV1ZSAqLworCWlmICgocC0+ZmxhZ3MgJiBQRl9XUV9XT1JLRVIpICYmIHN1Y2Nlc3MpCisJCXdxX3dvcmtlcl93YWtpbmdfdXAocCwgY3B1X29mKHJxKSk7Cit9CisKKy8qKgogICogdHJ5X3RvX3dha2VfdXAgLSB3YWtlIHVwIGEgdGhyZWFkCi0gKiBAcDogdGhlIHRvLWJlLXdva2VuLXVwIHRocmVhZAorICogQHA6IHRoZSB0aHJlYWQgdG8gYmUgYXdha2VuZWQKICAqIEBzdGF0ZTogdGhlIG1hc2sgb2YgdGFzayBzdGF0ZXMgdGhhdCBjYW4gYmUgd29rZW4KLSAqIEBzeW5jOiBkbyBhIHN5bmNocm9ub3VzIHdha2V1cD8KKyAqIEB3YWtlX2ZsYWdzOiB3YWtlIG1vZGlmaWVyIGZsYWdzIChXRl8qKQogICoKICAqIFB1dCBpdCBvbiB0aGUgcnVuLXF1ZXVlIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuIFRoZSAiY3VycmVudCIKICAqIHRocmVhZCBpcyBhbHdheXMgb24gdGhlIHJ1bi1xdWV1ZSAoZXhjZXB0IHdoZW4gdGhlIGFjdHVhbApAQCAtMjI3OSw3ICsyMzM3LDggQEAKICAqIHRoZSBzaW1wbGVyICJjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORyIgdG8gbWFyayB5b3Vyc2VsZgogICogcnVubmFibGUgd2l0aG91dCB0aGUgb3ZlcmhlYWQgb2YgdGhpcy4KICAqCi0gKiByZXR1cm5zIGZhaWx1cmUgb25seSBpZiB0aGUgdGFzayBpcyBhbHJlYWR5IGFjdGl2ZS4KKyAqIFJldHVybnMgJXRydWUgaWYgQHAgd2FzIHdva2VuIHVwLCAlZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgcnVubmluZworICogb3IgQHN0YXRlIGRpZG4ndCBtYXRjaCBAcCdzIHN0YXRlLgogICovCiBzdGF0aWMgaW50IHRyeV90b193YWtlX3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IHN0YXRlLAogCQkJICBpbnQgd2FrZV9mbGFncykKQEAgLTIzNTksMzggKzI0MTgsMTEgQEAKIAogb3V0X2FjdGl2YXRlOgogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyk7Ci0JaWYgKHdha2VfZmxhZ3MgJiBXRl9TWU5DKQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jKTsKLQlpZiAob3JpZ19jcHUgIT0gY3B1KQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKLQlpZiAoY3B1ID09IHRoaXNfY3B1KQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7Ci0JZWxzZQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19yZW1vdGUpOwotCWFjdGl2YXRlX3Rhc2socnEsIHAsIGVuX2ZsYWdzKTsKKwl0dHd1X2FjdGl2YXRlKHAsIHJxLCB3YWtlX2ZsYWdzICYgV0ZfU1lOQywgb3JpZ19jcHUgIT0gY3B1LAorCQkgICAgICBjcHUgPT0gdGhpc19jcHUsIGVuX2ZsYWdzKTsKIAlzdWNjZXNzID0gMTsKLQogb3V0X3J1bm5pbmc6Ci0JdHJhY2Vfc2NoZWRfd2FrZXVwKHAsIHN1Y2Nlc3MpOwotCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCwgd2FrZV9mbGFncyk7Ci0KLQlwLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX3dva2VuKQotCQlwLT5zY2hlZF9jbGFzcy0+dGFza193b2tlbihycSwgcCk7Ci0KLQlpZiAodW5saWtlbHkocnEtPmlkbGVfc3RhbXApKSB7Ci0JCXU2NCBkZWx0YSA9IHJxLT5jbG9jayAtIHJxLT5pZGxlX3N0YW1wOwotCQl1NjQgbWF4ID0gMipzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7Ci0KLQkJaWYgKGRlbHRhID4gbWF4KQotCQkJcnEtPmF2Z19pZGxlID0gbWF4OwotCQllbHNlCi0JCQl1cGRhdGVfYXZnKCZycS0+YXZnX2lkbGUsIGRlbHRhKTsKLQkJcnEtPmlkbGVfc3RhbXAgPSAwOwotCX0KLSNlbmRpZgorCXR0d3VfcG9zdF9hY3RpdmF0aW9uKHAsIHJxLCB3YWtlX2ZsYWdzLCBzdWNjZXNzKTsKIG91dDoKIAl0YXNrX3JxX3VubG9jayhycSwgJmZsYWdzKTsKIAlwdXRfY3B1KCk7CkBAIC0yMzk5LDYgKzI0MzEsMzcgQEAKIH0KIAogLyoqCisgKiB0cnlfdG9fd2FrZV91cF9sb2NhbCAtIHRyeSB0byB3YWtlIHVwIGEgbG9jYWwgdGFzayB3aXRoIHJxIGxvY2sgaGVsZAorICogQHA6IHRoZSB0aHJlYWQgdG8gYmUgYXdha2VuZWQKKyAqCisgKiBQdXQgQHAgb24gdGhlIHJ1bi1xdWV1ZSBpZiBpdCdzIG5vdCBhbHJlZHkgdGhlcmUuICBUaGUgY2FsbGVyIG11c3QKKyAqIGVuc3VyZSB0aGF0IHRoaXNfcnEoKSBpcyBsb2NrZWQsIEBwIGlzIGJvdW5kIHRvIHRoaXNfcnEoKSBhbmQgbm90CisgKiB0aGUgY3VycmVudCB0YXNrLiAgdGhpc19ycSgpIHN0YXlzIGxvY2tlZCBvdmVyIGludm9jYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHRyeV90b193YWtlX3VwX2xvY2FsKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gdGFza19ycShwKTsKKwlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworCUJVR19PTihycSAhPSB0aGlzX3JxKCkpOworCUJVR19PTihwID09IGN1cnJlbnQpOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJxLT5sb2NrKTsKKworCWlmICghKHAtPnN0YXRlICYgVEFTS19OT1JNQUwpKQorCQlyZXR1cm47CisKKwlpZiAoIXAtPnNlLm9uX3JxKSB7CisJCWlmIChsaWtlbHkoIXRhc2tfcnVubmluZyhycSwgcCkpKSB7CisJCQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2NvdW50KTsKKwkJCXNjaGVkc3RhdF9pbmMocnEsIHR0d3VfbG9jYWwpOworCQl9CisJCXR0d3VfYWN0aXZhdGUocCwgcnEsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgRU5RVUVVRV9XQUtFVVApOworCQlzdWNjZXNzID0gdHJ1ZTsKKwl9CisJdHR3dV9wb3N0X2FjdGl2YXRpb24ocCwgcnEsIDAsIHN1Y2Nlc3MpOworfQorCisvKioKICAqIHdha2VfdXBfcHJvY2VzcyAtIFdha2UgdXAgYSBzcGVjaWZpYyBwcm9jZXNzCiAgKiBAcDogVGhlIHByb2Nlc3MgdG8gYmUgd29rZW4gdXAuCiAgKgpAQCAtMzAxMiwyMyArMzA3NSwxMDIgQEAKIH0KIAogLyoKKyAqIFRoZSBleGFjdCBjcHVsb2FkIGF0IHZhcmlvdXMgaWR4IHZhbHVlcywgY2FsY3VsYXRlZCBhdCBldmVyeSB0aWNrIHdvdWxkIGJlCisgKiBsb2FkID0gKDJeaWR4IC0gMSkgLyAyXmlkeCAqIGxvYWQgKyAxIC8gMl5pZHggKiBjdXJfbG9hZAorICoKKyAqIElmIGEgY3B1IG1pc3NlcyB1cGRhdGVzIGZvciBuLTEgdGlja3MgKGFzIGl0IHdhcyBpZGxlKSBhbmQgdXBkYXRlIGdldHMgY2FsbGVkCisgKiBvbiBudGggdGljayB3aGVuIGNwdSBtYXkgYmUgYnVzeSwgdGhlbiB3ZSBoYXZlOgorICogbG9hZCA9ICgoMl5pZHggLSAxKSAvIDJeaWR4KV4obi0xKSAqIGxvYWQKKyAqIGxvYWQgPSAoMl5pZHggLSAxKSAvIDJeaWR4KSAqIGxvYWQgKyAxIC8gMl5pZHggKiBjdXJfbG9hZAorICoKKyAqIGRlY2F5X2xvYWRfbWlzc2VkKCkgYmVsb3cgZG9lcyBlZmZpY2llbnQgY2FsY3VsYXRpb24gb2YKKyAqIGxvYWQgPSAoKDJeaWR4IC0gMSkgLyAyXmlkeCleKG4tMSkgKiBsb2FkCisgKiBhdm9pZGluZyAwLi5uLTEgbG9vcCBkb2luZyBsb2FkID0gKCgyXmlkeCAtIDEpIC8gMl5pZHgpICogbG9hZAorICoKKyAqIFRoZSBjYWxjdWxhdGlvbiBpcyBhcHByb3hpbWF0ZWQgb24gYSAxMjggcG9pbnQgc2NhbGUuCisgKiBkZWdyYWRlX3plcm9fdGlja3MgaXMgdGhlIG51bWJlciBvZiB0aWNrcyBhZnRlciB3aGljaCBsb2FkIGF0IGFueQorICogcGFydGljdWxhciBpZHggaXMgYXBwcm94aW1hdGVkIHRvIGJlIHplcm8uCisgKiBkZWdyYWRlX2ZhY3RvciBpcyBhIHByZWNvbXB1dGVkIHRhYmxlLCBhIHJvdyBmb3IgZWFjaCBsb2FkIGlkeC4KKyAqIEVhY2ggY29sdW1uIGNvcnJlc3BvbmRzIHRvIGRlZ3JhZGF0aW9uIGZhY3RvciBmb3IgYSBwb3dlciBvZiB0d28gdGlja3MsCisgKiBiYXNlZCBvbiAxMjggcG9pbnQgc2NhbGUuCisgKiBFeGFtcGxlOgorICogcm93IDIsIGNvbCAzICg9MTIpIHNheXMgdGhhdCB0aGUgZGVncmFkYXRpb24gYXQgbG9hZCBpZHggMiBhZnRlcgorICogOCB0aWNrcyBpcyAxMi8xMjggKHdoaWNoIGlzIGFuIGFwcHJveGltYXRpb24gb2YgZXhhY3QgZmFjdG9yIDNeOC80XjgpLgorICoKKyAqIFdpdGggdGhpcyBwb3dlciBvZiAyIGxvYWQgZmFjdG9ycywgd2UgY2FuIGRlZ3JhZGUgdGhlIGxvYWQgbiB0aW1lcworICogYnkgbG9va2luZyBhdCAxIGJpdHMgaW4gbiBhbmQgZG9pbmcgYXMgbWFueSBtdWx0L3NoaWZ0IGluc3RlYWQgb2YKKyAqIG4gbXVsdC9zaGlmdHMgbmVlZGVkIGJ5IHRoZSBleGFjdCBkZWdyYWRhdGlvbi4KKyAqLworI2RlZmluZSBERUdSQURFX1NISUZUCQk3CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhcgorCQlkZWdyYWRlX3plcm9fdGlja3NbQ1BVX0xPQURfSURYX01BWF0gPSB7MCwgOCwgMzIsIDY0LCAxMjh9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIKKwkJZGVncmFkZV9mYWN0b3JbQ1BVX0xPQURfSURYX01BWF1bREVHUkFERV9TSElGVCArIDFdID0geworCQkJCQl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCQkJCXs2NCwgMzIsIDgsIDAsIDAsIDAsIDAsIDB9LAorCQkJCQl7OTYsIDcyLCA0MCwgMTIsIDEsIDAsIDB9LAorCQkJCQl7MTEyLCA5OCwgNzUsIDQzLCAxNSwgMSwgMH0sCisJCQkJCXsxMjAsIDExMiwgOTgsIDc2LCA0NSwgMTYsIDJ9IH07CisKKy8qCisgKiBVcGRhdGUgY3B1X2xvYWQgZm9yIGFueSBtaXNzZWQgdGlja3MsIGR1ZSB0byB0aWNrbGVzcyBpZGxlLiBUaGUgYmFja2xvZworICogd291bGQgYmUgd2hlbiBDUFUgaXMgaWRsZSBhbmQgc28gd2UganVzdCBkZWNheSB0aGUgb2xkIGxvYWQgd2l0aG91dAorICogYWRkaW5nIGFueSBuZXcgbG9hZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2RlY2F5X2xvYWRfbWlzc2VkKHVuc2lnbmVkIGxvbmcgbG9hZCwgdW5zaWduZWQgbG9uZyBtaXNzZWRfdXBkYXRlcywgaW50IGlkeCkKK3sKKwlpbnQgaiA9IDA7CisKKwlpZiAoIW1pc3NlZF91cGRhdGVzKQorCQlyZXR1cm4gbG9hZDsKKworCWlmIChtaXNzZWRfdXBkYXRlcyA+PSBkZWdyYWRlX3plcm9fdGlja3NbaWR4XSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWR4ID09IDEpCisJCXJldHVybiBsb2FkID4+IG1pc3NlZF91cGRhdGVzOworCisJd2hpbGUgKG1pc3NlZF91cGRhdGVzKSB7CisJCWlmIChtaXNzZWRfdXBkYXRlcyAlIDIpCisJCQlsb2FkID0gKGxvYWQgKiBkZWdyYWRlX2ZhY3RvcltpZHhdW2pdKSA+PiBERUdSQURFX1NISUZUOworCisJCW1pc3NlZF91cGRhdGVzID4+PSAxOworCQlqKys7CisJfQorCXJldHVybiBsb2FkOworfQorCisvKgogICogVXBkYXRlIHJxLT5jcHVfbG9hZFtdIHN0YXRpc3RpY3MuIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgZXZlcnkKLSAqIHNjaGVkdWxlciB0aWNrIChUSUNLX05TRUMpLgorICogc2NoZWR1bGVyIHRpY2sgKFRJQ0tfTlNFQykuIFdpdGggdGlja2xlc3MgaWRsZSB0aGlzIHdpbGwgbm90IGJlIGNhbGxlZAorICogZXZlcnkgdGljay4gV2UgZml4IGl0IHVwIGJhc2VkIG9uIGppZmZpZXMuCiAgKi8KIHN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVfbG9hZChzdHJ1Y3QgcnEgKnRoaXNfcnEpCiB7CiAJdW5zaWduZWQgbG9uZyB0aGlzX2xvYWQgPSB0aGlzX3JxLT5sb2FkLndlaWdodDsKKwl1bnNpZ25lZCBsb25nIGN1cnJfamlmZmllcyA9IGppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBwZW5kaW5nX3VwZGF0ZXM7CiAJaW50IGksIHNjYWxlOwogCiAJdGhpc19ycS0+bnJfbG9hZF91cGRhdGVzKys7CiAKKwkvKiBBdm9pZCByZXBlYXRlZCBjYWxscyBvbiBzYW1lIGppZmZ5LCB3aGVuIG1vdmluZyBpbiBhbmQgb3V0IG9mIGlkbGUgKi8KKwlpZiAoY3Vycl9qaWZmaWVzID09IHRoaXNfcnEtPmxhc3RfbG9hZF91cGRhdGVfdGljaykKKwkJcmV0dXJuOworCisJcGVuZGluZ191cGRhdGVzID0gY3Vycl9qaWZmaWVzIC0gdGhpc19ycS0+bGFzdF9sb2FkX3VwZGF0ZV90aWNrOworCXRoaXNfcnEtPmxhc3RfbG9hZF91cGRhdGVfdGljayA9IGN1cnJfamlmZmllczsKKwogCS8qIFVwZGF0ZSBvdXIgbG9hZDogKi8KLQlmb3IgKGkgPSAwLCBzY2FsZSA9IDE7IGkgPCBDUFVfTE9BRF9JRFhfTUFYOyBpKyssIHNjYWxlICs9IHNjYWxlKSB7CisJdGhpc19ycS0+Y3B1X2xvYWRbMF0gPSB0aGlzX2xvYWQ7IC8qIEZhc3R0cmFjayBmb3IgaWR4IDAgKi8KKwlmb3IgKGkgPSAxLCBzY2FsZSA9IDI7IGkgPCBDUFVfTE9BRF9JRFhfTUFYOyBpKyssIHNjYWxlICs9IHNjYWxlKSB7CiAJCXVuc2lnbmVkIGxvbmcgb2xkX2xvYWQsIG5ld19sb2FkOwogCiAJCS8qIHNjYWxlIGlzIGVmZmVjdGl2ZWx5IDEgPDwgaSBub3csIGFuZCA+PiBpIGRpdmlkZXMgYnkgc2NhbGUgKi8KIAogCQlvbGRfbG9hZCA9IHRoaXNfcnEtPmNwdV9sb2FkW2ldOworCQlvbGRfbG9hZCA9IGRlY2F5X2xvYWRfbWlzc2VkKG9sZF9sb2FkLCBwZW5kaW5nX3VwZGF0ZXMgLSAxLCBpKTsKIAkJbmV3X2xvYWQgPSB0aGlzX2xvYWQ7CiAJCS8qCiAJCSAqIFJvdW5kIHVwIHRoZSBhdmVyYWdpbmcgZGl2aXNpb24gaWYgbG9hZCBpcyBpbmNyZWFzaW5nLiBUaGlzCkBAIC0zMDM2LDkgKzMxNzgsMTUgQEAKIAkJICogZXhhbXBsZS4KIAkJICovCiAJCWlmIChuZXdfbG9hZCA+IG9sZF9sb2FkKQotCQkJbmV3X2xvYWQgKz0gc2NhbGUtMTsKLQkJdGhpc19ycS0+Y3B1X2xvYWRbaV0gPSAob2xkX2xvYWQqKHNjYWxlLTEpICsgbmV3X2xvYWQpID4+IGk7CisJCQluZXdfbG9hZCArPSBzY2FsZSAtIDE7CisKKwkJdGhpc19ycS0+Y3B1X2xvYWRbaV0gPSAob2xkX2xvYWQgKiAoc2NhbGUgLSAxKSArIG5ld19sb2FkKSA+PiBpOwogCX0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9sb2FkX2FjdGl2ZShzdHJ1Y3QgcnEgKnRoaXNfcnEpCit7CisJdXBkYXRlX2NwdV9sb2FkKHRoaXNfcnEpOwogCiAJY2FsY19sb2FkX2FjY291bnRfYWN0aXZlKHRoaXNfcnEpOwogfQpAQCAtMzQyNiw3ICszNTc0LDcgQEAKIAogCXJhd19zcGluX2xvY2soJnJxLT5sb2NrKTsKIAl1cGRhdGVfcnFfY2xvY2socnEpOwotCXVwZGF0ZV9jcHVfbG9hZChycSk7CisJdXBkYXRlX2NwdV9sb2FkX2FjdGl2ZShycSk7CiAJY3Vyci0+c2NoZWRfY2xhc3MtPnRhc2tfdGljayhycSwgY3VyciwgMCk7CiAJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7CiAKQEAgLTM1OTgsNyArMzc0Niw2IEBACiAJcnEgPSBjcHVfcnEoY3B1KTsKIAlyY3Vfbm90ZV9jb250ZXh0X3N3aXRjaChjcHUpOwogCXByZXYgPSBycS0+Y3VycjsKLQlzd2l0Y2hfY291bnQgPSAmcHJldi0+bml2Y3N3OwogCiAJcmVsZWFzZV9rZXJuZWxfbG9jayhwcmV2KTsKIG5lZWRfcmVzY2hlZF9ub25wcmVlbXB0aWJsZToKQEAgLTM2MTEsMTEgKzM3NTgsMjYgQEAKIAlyYXdfc3Bpbl9sb2NrX2lycSgmcnEtPmxvY2spOwogCWNsZWFyX3Rza19uZWVkX3Jlc2NoZWQocHJldik7CiAKKwlzd2l0Y2hfY291bnQgPSAmcHJldi0+bml2Y3N3OwogCWlmIChwcmV2LT5zdGF0ZSAmJiAhKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfQUNUSVZFKSkgewotCQlpZiAodW5saWtlbHkoc2lnbmFsX3BlbmRpbmdfc3RhdGUocHJldi0+c3RhdGUsIHByZXYpKSkKKwkJaWYgKHVubGlrZWx5KHNpZ25hbF9wZW5kaW5nX3N0YXRlKHByZXYtPnN0YXRlLCBwcmV2KSkpIHsKIAkJCXByZXYtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQllbHNlCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgYSB3b3JrZXIgaXMgZ29pbmcgdG8gc2xlZXAsIG5vdGlmeSBhbmQKKwkJCSAqIGFzayB3b3JrcXVldWUgd2hldGhlciBpdCB3YW50cyB0byB3YWtlIHVwIGEKKwkJCSAqIHRhc2sgdG8gbWFpbnRhaW4gY29uY3VycmVuY3kuICBJZiBzbywgd2FrZQorCQkJICogdXAgdGhlIHRhc2suCisJCQkgKi8KKwkJCWlmIChwcmV2LT5mbGFncyAmIFBGX1dRX1dPUktFUikgeworCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdG9fd2FrZXVwOworCisJCQkJdG9fd2FrZXVwID0gd3Ffd29ya2VyX3NsZWVwaW5nKHByZXYsIGNwdSk7CisJCQkJaWYgKHRvX3dha2V1cCkKKwkJCQkJdHJ5X3RvX3dha2VfdXBfbG9jYWwodG9fd2FrZXVwKTsKKwkJCX0KIAkJCWRlYWN0aXZhdGVfdGFzayhycSwgcHJldiwgREVRVUVVRV9TTEVFUCk7CisJCX0KIAkJc3dpdGNoX2NvdW50ID0gJnByZXYtPm52Y3N3OwogCX0KIApAQCAtMzYzNyw4ICszNzk5LDEwIEBACiAKIAkJY29udGV4dF9zd2l0Y2gocnEsIHByZXYsIG5leHQpOyAvKiB1bmxvY2tzIHRoZSBycSAqLwogCQkvKgotCQkgKiB0aGUgY29udGV4dCBzd2l0Y2ggbWlnaHQgaGF2ZSBmbGlwcGVkIHRoZSBzdGFjayBmcm9tIHVuZGVyCi0JCSAqIHVzLCBoZW5jZSByZWZyZXNoIHRoZSBsb2NhbCB2YXJpYWJsZXMuCisJCSAqIFRoZSBjb250ZXh0IHN3aXRjaCBoYXZlIGZsaXBwZWQgdGhlIHN0YWNrIGZyb20gdW5kZXIgdXMKKwkJICogYW5kIHJlc3RvcmVkIHRoZSBsb2NhbCB2YXJpYWJsZXMgd2hpY2ggd2VyZSBzYXZlZCB3aGVuCisJCSAqIHRoaXMgdGFzayBjYWxsZWQgc2NoZWR1bGUoKSBpbiB0aGUgcGFzdC4gcHJldiA9PSBjdXJyZW50CisJCSAqIGlzIHN0aWxsIGNvcnJlY3QsIGJ1dCBpdCBjYW4gYmUgbW92ZWQgdG8gYW5vdGhlciBjcHUvcnEuCiAJCSAqLwogCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCXJxID0gY3B1X3JxKGNwdSk7CkBAIC0zNjQ3LDExICszODExLDggQEAKIAogCXBvc3Rfc2NoZWR1bGUocnEpOwogCi0JaWYgKHVubGlrZWx5KHJlYWNxdWlyZV9rZXJuZWxfbG9jayhjdXJyZW50KSA8IDApKSB7Ci0JCXByZXYgPSBycS0+Y3VycjsKLQkJc3dpdGNoX2NvdW50ID0gJnByZXYtPm5pdmNzdzsKKwlpZiAodW5saWtlbHkocmVhY3F1aXJlX2tlcm5lbF9sb2NrKHByZXYpKSkKIAkJZ290byBuZWVkX3Jlc2NoZWRfbm9ucHJlZW1wdGlibGU7Ci0JfQogCiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCWlmIChuZWVkX3Jlc2NoZWQoKSkKQEAgLTM3MjYsNyArMzg4Nyw3IEBACiAgKiBvZmYgb2YgcHJlZW1wdF9lbmFibGUuIEtlcm5lbCBwcmVlbXB0aW9ucyBvZmYgcmV0dXJuIGZyb20gaW50ZXJydXB0CiAgKiBvY2N1ciB0aGVyZSBhbmQgY2FsbCBzY2hlZHVsZSBkaXJlY3RseS4KICAqLwotYXNtbGlua2FnZSB2b2lkIF9fc2NoZWQgcHJlZW1wdF9zY2hlZHVsZSh2b2lkKQorYXNtbGlua2FnZSB2b2lkIF9fc2NoZWQgbm90cmFjZSBwcmVlbXB0X3NjaGVkdWxlKHZvaWQpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIApAQCAtMzczOCw5ICszODk5LDkgQEAKIAkJcmV0dXJuOwogCiAJZG8gewotCQlhZGRfcHJlZW1wdF9jb3VudChQUkVFTVBUX0FDVElWRSk7CisJCWFkZF9wcmVlbXB0X2NvdW50X25vdHJhY2UoUFJFRU1QVF9BQ1RJVkUpOwogCQlzY2hlZHVsZSgpOwotCQlzdWJfcHJlZW1wdF9jb3VudChQUkVFTVBUX0FDVElWRSk7CisJCXN1Yl9wcmVlbXB0X2NvdW50X25vdHJhY2UoUFJFRU1QVF9BQ1RJVkUpOwogCiAJCS8qCiAJCSAqIENoZWNrIGFnYWluIGluIGNhc2Ugd2UgbWlzc2VkIGEgcHJlZW1wdGlvbiBvcHBvcnR1bml0eQpAQCAtNDQ0MSwxMiArNDYwMiw4IEBACiAJICovCiAJaWYgKHVzZXIgJiYgIWNhcGFibGUoQ0FQX1NZU19OSUNFKSkgewogCQlpZiAocnRfcG9saWN5KHBvbGljeSkpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcmxpbV9ydHByaW87Ci0KLQkJCWlmICghbG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKSkKLQkJCQlyZXR1cm4gLUVTUkNIOwotCQkJcmxpbV9ydHByaW8gPSB0YXNrX3JsaW1pdChwLCBSTElNSVRfUlRQUklPKTsKLQkJCXVubG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKTsKKwkJCXVuc2lnbmVkIGxvbmcgcmxpbV9ydHByaW8gPQorCQkJCQl0YXNrX3JsaW1pdChwLCBSTElNSVRfUlRQUklPKTsKIAogCQkJLyogY2FuJ3Qgc2V0L2NoYW5nZSB0aGUgcnQgcG9saWN5ICovCiAJCQlpZiAocG9saWN5ICE9IHAtPnBvbGljeSAmJiAhcmxpbV9ydHByaW8pCkBAIC01ODE2LDIwICs1OTczLDQ5IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSBtaWdyYXRpb25fbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBtaWdyYXRpb25fY2FsbCwKLQkucHJpb3JpdHkgPSAxMAorCS5wcmlvcml0eSA9IENQVV9QUklfTUlHUkFUSU9OLAogfTsKIAorc3RhdGljIGludCBfX2NwdWluaXQgc2NoZWRfY3B1X2FjdGl2ZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgorCQlzZXRfY3B1X2FjdGl2ZSgobG9uZyloY3B1LCB0cnVlKTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorfQorCitzdGF0aWMgaW50IF9fY3B1aW5pdCBzY2hlZF9jcHVfaW5hY3RpdmUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJCXNldF9jcHVfYWN0aXZlKChsb25nKWhjcHUsIGZhbHNlKTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorfQorCiBzdGF0aWMgaW50IF9faW5pdCBtaWdyYXRpb25faW5pdCh2b2lkKQogewogCXZvaWQgKmNwdSA9ICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBlcnI7CiAKLQkvKiBTdGFydCBvbmUgZm9yIHRoZSBib290IENQVTogKi8KKwkvKiBJbml0aWFsaXplIG1pZ3JhdGlvbiBmb3IgdGhlIGJvb3QgQ1BVICovCiAJZXJyID0gbWlncmF0aW9uX2NhbGwoJm1pZ3JhdGlvbl9ub3RpZmllciwgQ1BVX1VQX1BSRVBBUkUsIGNwdSk7CiAJQlVHX09OKGVyciA9PSBOT1RJRllfQkFEKTsKIAltaWdyYXRpb25fY2FsbCgmbWlncmF0aW9uX25vdGlmaWVyLCBDUFVfT05MSU5FLCBjcHUpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbWlncmF0aW9uX25vdGlmaWVyKTsKIAorCS8qIFJlZ2lzdGVyIGNwdSBhY3RpdmUgbm90aWZpZXJzICovCisJY3B1X25vdGlmaWVyKHNjaGVkX2NwdV9hY3RpdmUsIENQVV9QUklfU0NIRURfQUNUSVZFKTsKKwljcHVfbm90aWZpZXIoc2NoZWRfY3B1X2luYWN0aXZlLCBDUFVfUFJJX1NDSEVEX0lOQUNUSVZFKTsKKwogCXJldHVybiAwOwogfQogZWFybHlfaW5pdGNhbGwobWlncmF0aW9uX2luaXQpOwpAQCAtNjA2NCwyMyArNjI1MCwxOCBAQAogCQlmcmVlX3Jvb3Rkb21haW4ob2xkX3JkKTsKIH0KIAotc3RhdGljIGludCBpbml0X3Jvb3Rkb21haW4oc3RydWN0IHJvb3RfZG9tYWluICpyZCwgYm9vbCBib290bWVtKQorc3RhdGljIGludCBpbml0X3Jvb3Rkb21haW4oc3RydWN0IHJvb3RfZG9tYWluICpyZCkKIHsKLQlnZnBfdCBnZnAgPSBHRlBfS0VSTkVMOwotCiAJbWVtc2V0KHJkLCAwLCBzaXplb2YoKnJkKSk7CiAKLQlpZiAoYm9vdG1lbSkKLQkJZ2ZwID0gR0ZQX05PV0FJVDsKLQotCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5zcGFuLCBnZnApKQorCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5zcGFuLCBHRlBfS0VSTkVMKSkKIAkJZ290byBvdXQ7Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPm9ubGluZSwgZ2ZwKSkKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+b25saW5lLCBHRlBfS0VSTkVMKSkKIAkJZ290byBmcmVlX3NwYW47Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPnJ0b19tYXNrLCBnZnApKQorCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5ydG9fbWFzaywgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZnJlZV9vbmxpbmU7CiAKLQlpZiAoY3B1cHJpX2luaXQoJnJkLT5jcHVwcmksIGJvb3RtZW0pICE9IDApCisJaWYgKGNwdXByaV9pbml0KCZyZC0+Y3B1cHJpKSAhPSAwKQogCQlnb3RvIGZyZWVfcnRvX21hc2s7CiAJcmV0dXJuIDA7CiAKQEAgLTYwOTYsNyArNjI3Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfZGVmcm9vdGRvbWFpbih2b2lkKQogewotCWluaXRfcm9vdGRvbWFpbigmZGVmX3Jvb3RfZG9tYWluLCB0cnVlKTsKKwlpbml0X3Jvb3Rkb21haW4oJmRlZl9yb290X2RvbWFpbik7CiAKIAlhdG9taWNfc2V0KCZkZWZfcm9vdF9kb21haW4ucmVmY291bnQsIDEpOwogfQpAQCAtNjEwOSw3ICs2MjkwLDcgQEAKIAlpZiAoIXJkKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChpbml0X3Jvb3Rkb21haW4ocmQsIGZhbHNlKSAhPSAwKSB7CisJaWYgKGluaXRfcm9vdGRvbWFpbihyZCkgIT0gMCkgewogCQlrZnJlZShyZCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTcyODgsMjkgKzc0NjksMzUgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfU0NIRURfTUMgfHwgQ09ORklHX1NDSEVEX1NNVCAqLwogCi0jaWZuZGVmIENPTkZJR19DUFVTRVRTCiAvKgotICogQWRkIG9ubGluZSBhbmQgcmVtb3ZlIG9mZmxpbmUgQ1BVcyBmcm9tIHRoZSBzY2hlZHVsZXIgZG9tYWlucy4KLSAqIFdoZW4gY3B1c2V0cyBhcmUgZW5hYmxlZCB0aGV5IHRha2Ugb3ZlciB0aGlzIGZ1bmN0aW9uLgorICogVXBkYXRlIGNwdXNldHMgYWNjb3JkaW5nIHRvIGNwdV9hY3RpdmUgbWFzay4gIElmIGNwdXNldHMgYXJlCisgKiBkaXNhYmxlZCwgY3B1c2V0X3VwZGF0ZV9hY3RpdmVfY3B1cygpIGJlY29tZXMgYSBzaW1wbGUgd3JhcHBlcgorICogYXJvdW5kIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCkuCiAgKi8KLXN0YXRpYyBpbnQgdXBkYXRlX3NjaGVkX2RvbWFpbnMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IGNwdXNldF9jcHVfYWN0aXZlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCSAgICAgdm9pZCAqaGNwdSkKIHsKLQlzd2l0Y2ggKGFjdGlvbikgeworCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKIAljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKIAljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU46Ci0JCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKDEsIE5VTEwsIE5VTEwpOworCQljcHVzZXRfdXBkYXRlX2FjdGl2ZV9jcHVzKCk7CiAJCXJldHVybiBOT1RJRllfT0s7Ci0KIAlkZWZhdWx0OgogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAJfQogfQotI2VuZGlmCisKK3N0YXRpYyBpbnQgY3B1c2V0X2NwdV9pbmFjdGl2ZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkgICAgICAgdm9pZCAqaGNwdSkKK3sKKwlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCQljcHVzZXRfdXBkYXRlX2FjdGl2ZV9jcHVzKCk7CisJCXJldHVybiBOT1RJRllfT0s7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KK30KIAogc3RhdGljIGludCB1cGRhdGVfcnVudGltZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKQEAgLTczNTYsMTAgKzc1NDMsOCBAQAogCW11dGV4X3VubG9jaygmc2NoZWRfZG9tYWluc19tdXRleCk7CiAJcHV0X29ubGluZV9jcHVzKCk7CiAKLSNpZm5kZWYgQ09ORklHX0NQVVNFVFMKLQkvKiBYWFg6IFRoZW9yZXRpY2FsIHJhY2UgaGVyZSAtIENQVSBtYXkgYmUgaG90cGx1Z2dlZCBub3cgKi8KLQlob3RjcHVfbm90aWZpZXIodXBkYXRlX3NjaGVkX2RvbWFpbnMsIDApOwotI2VuZGlmCisJaG90Y3B1X25vdGlmaWVyKGNwdXNldF9jcHVfYWN0aXZlLCBDUFVfUFJJX0NQVVNFVF9BQ1RJVkUpOworCWhvdGNwdV9ub3RpZmllcihjcHVzZXRfY3B1X2luYWN0aXZlLCBDUFVfUFJJX0NQVVNFVF9JTkFDVElWRSk7CiAKIAkvKiBSVCBydW50aW1lIGNvZGUgbmVlZHMgdG8gaGFuZGxlIHNvbWUgaG90cGx1ZyBldmVudHMgKi8KIAlob3RjcHVfbm90aWZpZXIodXBkYXRlX3J1bnRpbWUsIDApOwpAQCAtNzYwNCw2ICs3Nzg5LDkgQEAKIAogCQlmb3IgKGogPSAwOyBqIDwgQ1BVX0xPQURfSURYX01BWDsgaisrKQogCQkJcnEtPmNwdV9sb2FkW2pdID0gMDsKKworCQlycS0+bGFzdF9sb2FkX3VwZGF0ZV90aWNrID0gamlmZmllczsKKwogI2lmZGVmIENPTkZJR19TTVAKIAkJcnEtPnNkID0gTlVMTDsKIAkJcnEtPnJkID0gTlVMTDsKQEAgLTc2MTcsNiArNzgwNSwxMCBAQAogCQlycS0+aWRsZV9zdGFtcCA9IDA7CiAJCXJxLT5hdmdfaWRsZSA9IDIqc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0OwogCQlycV9hdHRhY2hfcm9vdChycSwgJmRlZl9yb290X2RvbWFpbik7CisjaWZkZWYgQ09ORklHX05PX0haCisJCXJxLT5ub2h6X2JhbGFuY2Vfa2ljayA9IDA7CisJCWluaXRfc2NoZWRfc29mdGlycV9jc2QoJnBlcl9jcHUocmVtb3RlX3NjaGVkX3NvZnRpcnFfY2IsIGkpKTsKKyNlbmRpZgogI2VuZGlmCiAJCWluaXRfcnFfaHJ0aWNrKHJxKTsKIAkJYXRvbWljX3NldCgmcnEtPm5yX2lvd2FpdCwgMCk7CkBAIC03NjYxLDggKzc4NTMsMTEgQEAKIAl6YWxsb2NfY3B1bWFza192YXIoJm5vaHpfY3B1X21hc2ssIEdGUF9OT1dBSVQpOwogI2lmZGVmIENPTkZJR19TTVAKICNpZmRlZiBDT05GSUdfTk9fSFoKLQl6YWxsb2NfY3B1bWFza192YXIoJm5vaHouY3B1X21hc2ssIEdGUF9OT1dBSVQpOwotCWFsbG9jX2NwdW1hc2tfdmFyKCZub2h6LmlsYl9ncnBfbm9oel9tYXNrLCBHRlBfTk9XQUlUKTsKKwl6YWxsb2NfY3B1bWFza192YXIoJm5vaHouaWRsZV9jcHVzX21hc2ssIEdGUF9OT1dBSVQpOworCWFsbG9jX2NwdW1hc2tfdmFyKCZub2h6LmdycF9pZGxlX21hc2ssIEdGUF9OT1dBSVQpOworCWF0b21pY19zZXQoJm5vaHoubG9hZF9iYWxhbmNlciwgbnJfY3B1X2lkcyk7CisJYXRvbWljX3NldCgmbm9oei5maXJzdF9waWNrX2NwdSwgbnJfY3B1X2lkcyk7CisJYXRvbWljX3NldCgmbm9oei5zZWNvbmRfcGlja19jcHUsIG5yX2NwdV9pZHMpOwogI2VuZGlmCiAJLyogTWF5IGJlIGFsbG9jYXRlZCBhdCBpc29sY3B1cyBjbWRsaW5lIHBhcnNlIHRpbWUgKi8KIAlpZiAoY3B1X2lzb2xhdGVkX21hcCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2Nsb2NrLmMgYi9rZXJuZWwvc2NoZWRfY2xvY2suYwppbmRleCA5MDZhMGY3Li41MmYxYTE0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfY2xvY2suYworKysgYi9rZXJuZWwvc2NoZWRfY2xvY2suYwpAQCAtMTAsMTkgKzEwLDU1IEBACiAgKiAgIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgogICogICBHdWlsbGF1bWUgQ2hhemFyYWluIDxndWljaGF6QGdtYWlsLmNvbT4KICAqCi0gKiBDcmVhdGUgYSBzZW1pIHN0YWJsZSBjbG9jayBmcm9tIGEgbWl4dHVyZSBvZiBvdGhlciBldmVudHMsIGluY2x1ZGluZzoKLSAqICAtIGd0b2QKKyAqCisgKiBXaGF0OgorICoKKyAqIGNwdV9jbG9jayhpKSBwcm92aWRlcyBhIGZhc3QgKGV4ZWN1dGlvbiB0aW1lKSBoaWdoIHJlc29sdXRpb24KKyAqIGNsb2NrIHdpdGggYm91bmRlZCBkcmlmdCBiZXR3ZWVuIENQVXMuIFRoZSB2YWx1ZSBvZiBjcHVfY2xvY2soaSkKKyAqIGlzIG1vbm90b25pYyBmb3IgY29uc3RhbnQgaS4gVGhlIHRpbWVzdGFtcCByZXR1cm5lZCBpcyBpbiBuYW5vc2Vjb25kcy4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJJRyBGQVQgV0FSTklORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogIyB3aGVuIGNvbXBhcmluZyBjcHVfY2xvY2soaSkgdG8gY3B1X2Nsb2NrKGopIGZvciBpICE9IGosIHRpbWUgY2FuICMKKyAqICMgZ28gYmFja3dhcmRzICEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqIFRoZXJlIGlzIG5vIHN0cmljdCBwcm9taXNlIGFib3V0IHRoZSBiYXNlLCBhbHRob3VnaCBpdCB0ZW5kcyB0byBzdGFydAorICogYXQgMCBvbiBib290IChidXQgcGVvcGxlIHJlYWxseSBzaG91bGRuJ3QgcmVseSBvbiB0aGF0KS4KKyAqCisgKiBjcHVfY2xvY2soaSkgICAgICAgLS0gY2FuIGJlIHVzZWQgZnJvbSBhbnkgY29udGV4dCwgaW5jbHVkaW5nIE5NSS4KKyAqIHNjaGVkX2Nsb2NrX2NwdShpKSAtLSBtdXN0IGJlIHVzZWQgd2l0aCBsb2NhbCBJUlFzIGRpc2FibGVkIChpbXBsaWVkIGJ5IE5NSSkKKyAqIGxvY2FsX2Nsb2NrKCkgICAgICAtLSBpcyBjcHVfY2xvY2soKSBvbiB0aGUgY3VycmVudCBjcHUuCisgKgorICogSG93OgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBlaXRoZXIgdXNlcyBzY2hlZF9jbG9jaygpIHdoZW4KKyAqICFDT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSywgd2hpY2ggbWVhbnMgaW4gdGhhdCBjYXNlIHRoZQorICogc2NoZWRfY2xvY2soKSBpcyBhc3N1bWVkIHRvIHByb3ZpZGUgdGhlc2UgcHJvcGVydGllcyAobW9zdGx5IGl0IG1lYW5zCisgKiB0aGUgYXJjaGl0ZWN0dXJlIHByb3ZpZGVzIGEgZ2xvYmFsbHkgc3luY2hyb25pemVkIGhpZ2hyZXMgdGltZSBzb3VyY2UpLgorICoKKyAqIE90aGVyd2lzZSBpdCB0cmllcyB0byBjcmVhdGUgYSBzZW1pIHN0YWJsZSBjbG9jayBmcm9tIGEgbWl4dHVyZSBvZiBvdGhlcgorICogY2xvY2tzLCBpbmNsdWRpbmc6CisgKgorICogIC0gR1RPRCAoY2xvY2sgbW9ub3RvbWljKQogICogIC0gc2NoZWRfY2xvY2soKQogICogIC0gZXhwbGljaXQgaWRsZSBldmVudHMKICAqCi0gKiBXZSB1c2UgZ3RvZCBhcyBiYXNlIGFuZCB0aGUgdW5zdGFibGUgY2xvY2sgZGVsdGFzLiBUaGUgZGVsdGFzIGFyZSBmaWx0ZXJlZCwKLSAqIG1ha2luZyBpdCBtb25vdG9uaWMgYW5kIGtlZXBpbmcgaXQgd2l0aGluIGFuIGV4cGVjdGVkIHdpbmRvdy4KKyAqIFdlIHVzZSBHVE9EIGFzIGJhc2UgYW5kIHVzZSBzY2hlZF9jbG9jaygpIGRlbHRhcyB0byBpbXByb3ZlIHJlc29sdXRpb24uIFRoZQorICogZGVsdGFzIGFyZSBmaWx0ZXJlZCB0byBwcm92aWRlIG1vbm90b25pY2l0eSBhbmQga2VlcGluZyBpdCB3aXRoaW4gYW4KKyAqIGV4cGVjdGVkIHdpbmRvdy4KICAqCiAgKiBGdXJ0aGVybW9yZSwgZXhwbGljaXQgc2xlZXAgYW5kIHdha2V1cCBob29rcyBhbGxvdyB1cyB0byBhY2NvdW50IGZvciB0aW1lCiAgKiB0aGF0IGlzIG90aGVyd2lzZSBpbnZpc2libGUgKFRTQyBnZXRzIHN0b3BwZWQpLgogICoKLSAqIFRoZSBjbG9jazogc2NoZWRfY2xvY2tfY3B1KCkgaXMgbW9ub3RvbmljIHBlciBjcHUsIGFuZCBzaG91bGQgYmUgc29tZXdoYXQKLSAqIGNvbnNpc3RlbnQgYmV0d2VlbiBjcHVzIChuZXZlciBtb3JlIHRoYW4gMiBqaWZmaWVzIGRpZmZlcmVuY2UpLgorICoKKyAqIE5vdGVzOgorICoKKyAqIFRoZSAhSVJRLXNhZmV0bHkgb2Ygc2NoZWRfY2xvY2soKSBhbmQgc2NoZWRfY2xvY2tfY3B1KCkgY29tZXMgZnJvbSB0aGluZ3MKKyAqIGxpa2UgY3B1ZnJlcSBpbnRlcnJ1cHRzIHRoYXQgY2FuIGNoYW5nZSB0aGUgYmFzZSBjbG9jayAoVFNDKSBtdWx0aXBsaWVyCisgKiBhbmQgY2F1c2UgZnVubnkganVtcHMgaW4gdGltZSAtLSBhbHRob3VnaCB0aGUgZmlsdGVyaW5nIHByb3ZpZGVkIGJ5CisgKiBzY2hlZF9jbG9ja19jcHUoKSBzaG91bGQgbWl0aWdhdGUgc2VyaW91cyBhcnRpZmFjdHMgd2UgY2Fubm90IHJlbHkgb24gaXQKKyAqIGluIGdlbmVyYWwgc2luY2UgZm9yICFDT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSyB3ZSBmdWxseSByZWx5IG9uCisgKiBzY2hlZF9jbG9jaygpLgogICovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CkBAIC0xNzAsNiArMjA2LDExIEBACiAJcmV0dXJuIHZhbDsKIH0KIAorLyoKKyAqIFNpbWlsYXIgdG8gY3B1X2Nsb2NrKCksIGJ1dCByZXF1aXJlcyBsb2NhbCBJUlFzIHRvIGJlIGRpc2FibGVkLgorICoKKyAqIFNlZSBjcHVfY2xvY2soKS4KKyAqLwogdTY0IHNjaGVkX2Nsb2NrX2NwdShpbnQgY3B1KQogewogCXN0cnVjdCBzY2hlZF9jbG9ja19kYXRhICpzY2Q7CkBAIC0yMzcsOSArMjc4LDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzY2hlZF9jbG9ja19pZGxlX3dha2V1cF9ldmVudCk7CiAKLXVuc2lnbmVkIGxvbmcgbG9uZyBjcHVfY2xvY2soaW50IGNwdSkKKy8qCisgKiBBcyBvdXRsaW5lZCBhdCB0aGUgdG9wLCBwcm92aWRlcyBhIGZhc3QsIGhpZ2ggcmVzb2x1dGlvbiwgbmFub3NlY29uZAorICogdGltZSBzb3VyY2UgdGhhdCBpcyBtb25vdG9uaWMgcGVyIGNwdSBhcmd1bWVudCBhbmQgaGFzIGJvdW5kZWQgZHJpZnQKKyAqIGJldHdlZW4gY3B1cy4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJJRyBGQVQgV0FSTklORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogIyB3aGVuIGNvbXBhcmluZyBjcHVfY2xvY2soaSkgdG8gY3B1X2Nsb2NrKGopIGZvciBpICE9IGosIHRpbWUgY2FuICMKKyAqICMgZ28gYmFja3dhcmRzICEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICovCit1NjQgY3B1X2Nsb2NrKGludCBjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrOworCXU2NCBjbG9jazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMjQ5LDYgKzMwMCwyNSBAQAogCXJldHVybiBjbG9jazsKIH0KIAorLyoKKyAqIFNpbWlsYXIgdG8gY3B1X2Nsb2NrKCkgZm9yIHRoZSBjdXJyZW50IGNwdS4gVGltZSB3aWxsIG9ubHkgYmUgb2JzZXJ2ZWQKKyAqIHRvIGJlIG1vbm90b25pYyBpZiBjYXJlIGlzIHRha2VuIHRvIG9ubHkgY29tcGFyZSB0aW1lc3RhbXB0IHRha2VuIG9uIHRoZQorICogc2FtZSBDUFUuCisgKgorICogU2VlIGNwdV9jbG9jaygpLgorICovCit1NjQgbG9jYWxfY2xvY2sodm9pZCkKK3sKKwl1NjQgY2xvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljbG9jayA9IHNjaGVkX2Nsb2NrX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBjbG9jazsKK30KKwogI2Vsc2UgLyogQ09ORklHX0hBVkVfVU5TVEFCTEVfU0NIRURfQ0xPQ0sgKi8KIAogdm9pZCBzY2hlZF9jbG9ja19pbml0KHZvaWQpCkBAIC0yNjQsMTIgKzMzNCwxNyBAQAogCXJldHVybiBzY2hlZF9jbG9jaygpOwogfQogCi0KLXVuc2lnbmVkIGxvbmcgbG9uZyBjcHVfY2xvY2soaW50IGNwdSkKK3U2NCBjcHVfY2xvY2soaW50IGNwdSkKIHsKIAlyZXR1cm4gc2NoZWRfY2xvY2tfY3B1KGNwdSk7CiB9CiAKK3U2NCBsb2NhbF9jbG9jayh2b2lkKQoreworCXJldHVybiBzY2hlZF9jbG9ja19jcHUoMCk7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSyAqLwogCiBFWFBPUlRfU1lNQk9MX0dQTChjcHVfY2xvY2spOworRVhQT1JUX1NZTUJPTF9HUEwobG9jYWxfY2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2NwdXByaS5jIGIva2VybmVsL3NjaGVkX2NwdXByaS5jCmluZGV4IGU2ODcxY2IuLjI3MjJkYzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jcHVwcmkuYworKysgYi9rZXJuZWwvc2NoZWRfY3B1cHJpLmMKQEAgLTE2NiwxNCArMTY2LDEwIEBACiAgKgogICogUmV0dXJuczogLUVOT01FTSBpZiBtZW1vcnkgZmFpbHMuCiAgKi8KLWludCBjcHVwcmlfaW5pdChzdHJ1Y3QgY3B1cHJpICpjcCwgYm9vbCBib290bWVtKQoraW50IGNwdXByaV9pbml0KHN0cnVjdCBjcHVwcmkgKmNwKQogewotCWdmcF90IGdmcCA9IEdGUF9LRVJORUw7CiAJaW50IGk7CiAKLQlpZiAoYm9vdG1lbSkKLQkJZ2ZwID0gR0ZQX05PV0FJVDsKLQogCW1lbXNldChjcCwgMCwgc2l6ZW9mKCpjcCkpOwogCiAJZm9yIChpID0gMDsgaSA8IENQVVBSSV9OUl9QUklPUklUSUVTOyBpKyspIHsKQEAgLTE4MSw3ICsxNzcsNyBAQAogCiAJCXJhd19zcGluX2xvY2tfaW5pdCgmdmVjLT5sb2NrKTsKIAkJdmVjLT5jb3VudCA9IDA7Ci0JCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZ2ZWMtPm1hc2ssIGdmcCkpCisJCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZ2ZWMtPm1hc2ssIEdGUF9LRVJORUwpKQogCQkJZ290byBjbGVhbnVwOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2NwdXByaS5oIGIva2VybmVsL3NjaGVkX2NwdXByaS5oCmluZGV4IDdjYjViYjYuLjlmYzdkMzggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jcHVwcmkuaAorKysgYi9rZXJuZWwvc2NoZWRfY3B1cHJpLmgKQEAgLTI3LDcgKzI3LDcgQEAKIGludCAgY3B1cHJpX2ZpbmQoc3RydWN0IGNwdXByaSAqY3AsCiAJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBjcHVtYXNrICpsb3dlc3RfbWFzayk7CiB2b2lkIGNwdXByaV9zZXQoc3RydWN0IGNwdXByaSAqY3AsIGludCBjcHUsIGludCBwcmkpOwotaW50IGNwdXByaV9pbml0KHN0cnVjdCBjcHVwcmkgKmNwLCBib29sIGJvb3RtZW0pOworaW50IGNwdXByaV9pbml0KHN0cnVjdCBjcHVwcmkgKmNwKTsKIHZvaWQgY3B1cHJpX2NsZWFudXAoc3RydWN0IGNwdXByaSAqY3ApOwogI2Vsc2UKICNkZWZpbmUgY3B1cHJpX3NldChjcCwgY3B1LCBwcmkpIGRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKaW5kZXggMzU1NjUzOS4uMmUxYjBkMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2RlYnVnLmMKKysrIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCVBOKHN5c2N0bF9zY2hlZF9sYXRlbmN5KTsKIAlQTihzeXNjdGxfc2NoZWRfbWluX2dyYW51bGFyaXR5KTsKIAlQTihzeXNjdGxfc2NoZWRfd2FrZXVwX2dyYW51bGFyaXR5KTsKLQlQTihzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdCk7CisJUChzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdCk7CiAJUChzeXNjdGxfc2NoZWRfZmVhdHVyZXMpOwogI3VuZGVmIFBOCiAjdW5kZWYgUApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZhaXIuYyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKaW5kZXggYTg3OGI1My4uODA2ZDFiMiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZhaXIuYworKysgYi9rZXJuZWwvc2NoZWRfZmFpci5jCkBAIC0yMjg3LDEzICsyMjg3LDYgQEAKIAl1bnNpZ25lZCBsb25nIHBvd2VyID0gU0NIRURfTE9BRF9TQ0FMRTsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNkZyA9IHNkLT5ncm91cHM7CiAKLQlpZiAoc2NoZWRfZmVhdChBUkNIX1BPV0VSKSkKLQkJcG93ZXIgKj0gYXJjaF9zY2FsZV9mcmVxX3Bvd2VyKHNkLCBjcHUpOwotCWVsc2UKLQkJcG93ZXIgKj0gZGVmYXVsdF9zY2FsZV9mcmVxX3Bvd2VyKHNkLCBjcHUpOwotCi0JcG93ZXIgPj49IFNDSEVEX0xPQURfU0hJRlQ7Ci0KIAlpZiAoKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKSAmJiB3ZWlnaHQgPiAxKSB7CiAJCWlmIChzY2hlZF9mZWF0KEFSQ0hfUE9XRVIpKQogCQkJcG93ZXIgKj0gYXJjaF9zY2FsZV9zbXRfcG93ZXIoc2QsIGNwdSk7CkBAIC0yMzAzLDYgKzIyOTYsMTUgQEAKIAkJcG93ZXIgPj49IFNDSEVEX0xPQURfU0hJRlQ7CiAJfQogCisJc2RnLT5jcHVfcG93ZXJfb3JpZyA9IHBvd2VyOworCisJaWYgKHNjaGVkX2ZlYXQoQVJDSF9QT1dFUikpCisJCXBvd2VyICo9IGFyY2hfc2NhbGVfZnJlcV9wb3dlcihzZCwgY3B1KTsKKwllbHNlCisJCXBvd2VyICo9IGRlZmF1bHRfc2NhbGVfZnJlcV9wb3dlcihzZCwgY3B1KTsKKworCXBvd2VyID4+PSBTQ0hFRF9MT0FEX1NISUZUOworCiAJcG93ZXIgKj0gc2NhbGVfcnRfcG93ZXIoY3B1KTsKIAlwb3dlciA+Pj0gU0NIRURfTE9BRF9TSElGVDsKIApAQCAtMjMzNSw2ICsyMzM3LDMxIEBACiAJc2RnLT5jcHVfcG93ZXIgPSBwb3dlcjsKIH0KIAorLyoKKyAqIFRyeSBhbmQgZml4IHVwIGNhcGFjaXR5IGZvciB0aW55IHNpYmxpbmdzLCB0aGlzIGlzIG5lZWRlZCB3aGVuCisgKiB0aGluZ3MgbGlrZSBTRF9BU1lNX1BBQ0tJTkcgbmVlZCBmX2JfZyB0byBzZWxlY3QgYW5vdGhlciBzaWJsaW5nCisgKiB3aGljaCBvbiBpdHMgb3duIGlzbid0IHBvd2VyZnVsIGVub3VnaC4KKyAqCisgKiBTZWUgdXBkYXRlX3NkX3BpY2tfYnVzaWVzdCgpIGFuZCBjaGVja19hc3ltX3BhY2tpbmcoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2ZpeF9zbWFsbF9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCkKK3sKKwkvKgorCSAqIE9ubHkgc2libGluZ3MgY2FuIGhhdmUgc2lnbmlmaWNhbnRseSBsZXNzIHRoYW4gU0NIRURfTE9BRF9TQ0FMRQorCSAqLworCWlmIChzZC0+bGV2ZWwgIT0gU0RfTFZfU0lCTElORykKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIH45MCUgb2YgdGhlIGNwdV9wb3dlciBpcyBzdGlsbCB0aGVyZSwgd2UncmUgZ29vZC4KKwkgKi8KKwlpZiAoZ3JvdXAtPmNwdV9wb3dlciAqIDMyID4gZ3JvdXAtPmNwdV9wb3dlcl9vcmlnICogMjkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogdXBkYXRlX3NnX2xiX3N0YXRzIC0gVXBkYXRlIHNjaGVkX2dyb3VwJ3Mgc3RhdGlzdGljcyBmb3IgbG9hZCBiYWxhbmNpbmcuCiAgKiBAc2Q6IFRoZSBzY2hlZF9kb21haW4gd2hvc2Ugc3RhdGlzdGljcyBhcmUgdG8gYmUgdXBkYXRlZC4KQEAgLTI0MDAsMTQgKzI0MjcsMTQgQEAKIAkgKiBkb21haW5zLiBJbiB0aGUgbmV3bHkgaWRsZSBjYXNlLCB3ZSB3aWxsIGFsbG93IGFsbCB0aGUgY3B1J3MKIAkgKiB0byBkbyB0aGUgbmV3bHkgaWRsZSBsb2FkIGJhbGFuY2UuCiAJICovCi0JaWYgKGlkbGUgIT0gQ1BVX05FV0xZX0lETEUgJiYgbG9jYWxfZ3JvdXAgJiYKLQkgICAgYmFsYW5jZV9jcHUgIT0gdGhpc19jcHUpIHsKLQkJKmJhbGFuY2UgPSAwOwotCQlyZXR1cm47CisJaWYgKGlkbGUgIT0gQ1BVX05FV0xZX0lETEUgJiYgbG9jYWxfZ3JvdXApIHsKKwkJaWYgKGJhbGFuY2VfY3B1ICE9IHRoaXNfY3B1KSB7CisJCQkqYmFsYW5jZSA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJdXBkYXRlX2dyb3VwX3Bvd2VyKHNkLCB0aGlzX2NwdSk7CiAJfQogCi0JdXBkYXRlX2dyb3VwX3Bvd2VyKHNkLCB0aGlzX2NwdSk7Ci0KIAkvKiBBZGp1c3QgYnkgcmVsYXRpdmUgQ1BVIHBvd2VyIG9mIHRoZSBncm91cCAqLwogCXNncy0+YXZnX2xvYWQgPSAoc2dzLT5ncm91cF9sb2FkICogU0NIRURfTE9BRF9TQ0FMRSkgLyBncm91cC0+Y3B1X3Bvd2VyOwogCkBAIC0yNDI4LDYgKzI0NTUsNTEgQEAKIAogCXNncy0+Z3JvdXBfY2FwYWNpdHkgPQogCQlESVZfUk9VTkRfQ0xPU0VTVChncm91cC0+Y3B1X3Bvd2VyLCBTQ0hFRF9MT0FEX1NDQUxFKTsKKwlpZiAoIXNncy0+Z3JvdXBfY2FwYWNpdHkpCisJCXNncy0+Z3JvdXBfY2FwYWNpdHkgPSBmaXhfc21hbGxfY2FwYWNpdHkoc2QsIGdyb3VwKTsKK30KKworLyoqCisgKiB1cGRhdGVfc2RfcGlja19idXNpZXN0IC0gcmV0dXJuIDEgb24gYnVzaWVzdCBncm91cAorICogQHNkOiBzY2hlZF9kb21haW4gd2hvc2Ugc3RhdGlzdGljcyBhcmUgdG8gYmUgY2hlY2tlZAorICogQHNkczogc2NoZWRfZG9tYWluIHN0YXRpc3RpY3MKKyAqIEBzZzogc2NoZWRfZ3JvdXAgY2FuZGlkYXRlIHRvIGJlIGNoZWNrZWQgZm9yIGJlaW5nIHRoZSBidXNpZXN0CisgKiBAc2dzOiBzY2hlZF9ncm91cCBzdGF0aXN0aWNzCisgKiBAdGhpc19jcHU6IHRoZSBjdXJyZW50IGNwdQorICoKKyAqIERldGVybWluZSBpZiBAc2cgaXMgYSBidXNpZXIgZ3JvdXAgdGhhbiB0aGUgcHJldmlvdXNseSBzZWxlY3RlZAorICogYnVzaWVzdCBncm91cC4KKyAqLworc3RhdGljIGJvb2wgdXBkYXRlX3NkX3BpY2tfYnVzaWVzdChzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwKKwkJCQkgICBzdHJ1Y3Qgc2RfbGJfc3RhdHMgKnNkcywKKwkJCQkgICBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLAorCQkJCSAgIHN0cnVjdCBzZ19sYl9zdGF0cyAqc2dzLAorCQkJCSAgIGludCB0aGlzX2NwdSkKK3sKKwlpZiAoc2dzLT5hdmdfbG9hZCA8PSBzZHMtPm1heF9sb2FkKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc2dzLT5zdW1fbnJfcnVubmluZyA+IHNncy0+Z3JvdXBfY2FwYWNpdHkpCisJCXJldHVybiB0cnVlOworCisJaWYgKHNncy0+Z3JvdXBfaW1iKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogQVNZTV9QQUNLSU5HIG5lZWRzIHRvIG1vdmUgYWxsIHRoZSB3b3JrIHRvIHRoZSBsb3dlc3QKKwkgKiBudW1iZXJlZCBDUFVzIGluIHRoZSBncm91cCwgdGhlcmVmb3JlIG1hcmsgYWxsIGdyb3VwcworCSAqIGhpZ2hlciB0aGFuIG91cnNlbGYgYXMgYnVzeS4KKwkgKi8KKwlpZiAoKHNkLT5mbGFncyAmIFNEX0FTWU1fUEFDS0lORykgJiYgc2dzLT5zdW1fbnJfcnVubmluZyAmJgorCSAgICB0aGlzX2NwdSA8IGdyb3VwX2ZpcnN0X2NwdShzZykpIHsKKwkJaWYgKCFzZHMtPmJ1c2llc3QpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlpZiAoZ3JvdXBfZmlyc3RfY3B1KHNkcy0+YnVzaWVzdCkgPiBncm91cF9maXJzdF9jcHUoc2cpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOwogfQogCiAvKioKQEAgLTI0MzUsNyArMjUwNyw3IEBACiAgKiBAc2Q6IHNjaGVkX2RvbWFpbiB3aG9zZSBzdGF0aXN0aWNzIGFyZSB0byBiZSB1cGRhdGVkLgogICogQHRoaXNfY3B1OiBDcHUgZm9yIHdoaWNoIGxvYWQgYmFsYW5jZSBpcyBjdXJyZW50bHkgcGVyZm9ybWVkLgogICogQGlkbGU6IElkbGUgc3RhdHVzIG9mIHRoaXNfY3B1Ci0gKiBAc2RfaWRsZTogSWRsZSBzdGF0dXMgb2YgdGhlIHNjaGVkX2RvbWFpbiBjb250YWluaW5nIGdyb3VwLgorICogQHNkX2lkbGU6IElkbGUgc3RhdHVzIG9mIHRoZSBzY2hlZF9kb21haW4gY29udGFpbmluZyBzZy4KICAqIEBjcHVzOiBTZXQgb2YgY3B1cyBjb25zaWRlcmVkIGZvciBsb2FkIGJhbGFuY2luZy4KICAqIEBiYWxhbmNlOiBTaG91bGQgd2UgYmFsYW5jZS4KICAqIEBzZHM6IHZhcmlhYmxlIHRvIGhvbGQgdGhlIHN0YXRpc3RpY3MgZm9yIHRoaXMgc2NoZWRfZG9tYWluLgpAQCAtMjQ0Niw3ICsyNTE4LDcgQEAKIAkJCXN0cnVjdCBzZF9sYl9zdGF0cyAqc2RzKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkID0gc2QtPmNoaWxkOwotCXN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXAgPSBzZC0+Z3JvdXBzOworCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSBzZC0+Z3JvdXBzOwogCXN0cnVjdCBzZ19sYl9zdGF0cyBzZ3M7CiAJaW50IGxvYWRfaWR4LCBwcmVmZXJfc2libGluZyA9IDA7CiAKQEAgLTI0NTksMjEgKzI1MzEsMjAgQEAKIAlkbyB7CiAJCWludCBsb2NhbF9ncm91cDsKIAotCQlsb2NhbF9ncm91cCA9IGNwdW1hc2tfdGVzdF9jcHUodGhpc19jcHUsCi0JCQkJCSAgICAgICBzY2hlZF9ncm91cF9jcHVzKGdyb3VwKSk7CisJCWxvY2FsX2dyb3VwID0gY3B1bWFza190ZXN0X2NwdSh0aGlzX2NwdSwgc2NoZWRfZ3JvdXBfY3B1cyhzZykpOwogCQltZW1zZXQoJnNncywgMCwgc2l6ZW9mKHNncykpOwotCQl1cGRhdGVfc2dfbGJfc3RhdHMoc2QsIGdyb3VwLCB0aGlzX2NwdSwgaWRsZSwgbG9hZF9pZHgsIHNkX2lkbGUsCisJCXVwZGF0ZV9zZ19sYl9zdGF0cyhzZCwgc2csIHRoaXNfY3B1LCBpZGxlLCBsb2FkX2lkeCwgc2RfaWRsZSwKIAkJCQlsb2NhbF9ncm91cCwgY3B1cywgYmFsYW5jZSwgJnNncyk7CiAKIAkJaWYgKGxvY2FsX2dyb3VwICYmICEoKmJhbGFuY2UpKQogCQkJcmV0dXJuOwogCiAJCXNkcy0+dG90YWxfbG9hZCArPSBzZ3MuZ3JvdXBfbG9hZDsKLQkJc2RzLT50b3RhbF9wd3IgKz0gZ3JvdXAtPmNwdV9wb3dlcjsKKwkJc2RzLT50b3RhbF9wd3IgKz0gc2ctPmNwdV9wb3dlcjsKIAogCQkvKgogCQkgKiBJbiBjYXNlIHRoZSBjaGlsZCBkb21haW4gcHJlZmVycyB0YXNrcyBnbyB0byBzaWJsaW5ncwotCQkgKiBmaXJzdCwgbG93ZXIgdGhlIGdyb3VwIGNhcGFjaXR5IHRvIG9uZSBzbyB0aGF0IHdlJ2xsIHRyeQorCQkgKiBmaXJzdCwgbG93ZXIgdGhlIHNnIGNhcGFjaXR5IHRvIG9uZSBzbyB0aGF0IHdlJ2xsIHRyeQogCQkgKiBhbmQgbW92ZSBhbGwgdGhlIGV4Y2VzcyB0YXNrcyBhd2F5LgogCQkgKi8KIAkJaWYgKHByZWZlcl9zaWJsaW5nKQpAQCAtMjQ4MSwyMyArMjU1Miw3MiBAQAogCiAJCWlmIChsb2NhbF9ncm91cCkgewogCQkJc2RzLT50aGlzX2xvYWQgPSBzZ3MuYXZnX2xvYWQ7Ci0JCQlzZHMtPnRoaXMgPSBncm91cDsKKwkJCXNkcy0+dGhpcyA9IHNnOwogCQkJc2RzLT50aGlzX25yX3J1bm5pbmcgPSBzZ3Muc3VtX25yX3J1bm5pbmc7CiAJCQlzZHMtPnRoaXNfbG9hZF9wZXJfdGFzayA9IHNncy5zdW1fd2VpZ2h0ZWRfbG9hZDsKLQkJfSBlbHNlIGlmIChzZ3MuYXZnX2xvYWQgPiBzZHMtPm1heF9sb2FkICYmCi0JCQkgICAoc2dzLnN1bV9ucl9ydW5uaW5nID4gc2dzLmdyb3VwX2NhcGFjaXR5IHx8Ci0JCQkJc2dzLmdyb3VwX2ltYikpIHsKKwkJfSBlbHNlIGlmICh1cGRhdGVfc2RfcGlja19idXNpZXN0KHNkLCBzZHMsIHNnLCAmc2dzLCB0aGlzX2NwdSkpIHsKIAkJCXNkcy0+bWF4X2xvYWQgPSBzZ3MuYXZnX2xvYWQ7Ci0JCQlzZHMtPmJ1c2llc3QgPSBncm91cDsKKwkJCXNkcy0+YnVzaWVzdCA9IHNnOwogCQkJc2RzLT5idXNpZXN0X25yX3J1bm5pbmcgPSBzZ3Muc3VtX25yX3J1bm5pbmc7CiAJCQlzZHMtPmJ1c2llc3RfZ3JvdXBfY2FwYWNpdHkgPSBzZ3MuZ3JvdXBfY2FwYWNpdHk7CiAJCQlzZHMtPmJ1c2llc3RfbG9hZF9wZXJfdGFzayA9IHNncy5zdW1fd2VpZ2h0ZWRfbG9hZDsKIAkJCXNkcy0+Z3JvdXBfaW1iID0gc2dzLmdyb3VwX2ltYjsKIAkJfQogCi0JCXVwZGF0ZV9zZF9wb3dlcl9zYXZpbmdzX3N0YXRzKGdyb3VwLCBzZHMsIGxvY2FsX2dyb3VwLCAmc2dzKTsKLQkJZ3JvdXAgPSBncm91cC0+bmV4dDsKLQl9IHdoaWxlIChncm91cCAhPSBzZC0+Z3JvdXBzKTsKKwkJdXBkYXRlX3NkX3Bvd2VyX3NhdmluZ3Nfc3RhdHMoc2csIHNkcywgbG9jYWxfZ3JvdXAsICZzZ3MpOworCQlzZyA9IHNnLT5uZXh0OworCX0gd2hpbGUgKHNnICE9IHNkLT5ncm91cHMpOworfQorCitpbnQgX193ZWFrIGFyY2hfc2Rfc2libGluZ19hc3ltX3BhY2tpbmcodm9pZCkKK3sKKyAgICAgICByZXR1cm4gMCpTRF9BU1lNX1BBQ0tJTkc7Cit9CisKKy8qKgorICogY2hlY2tfYXN5bV9wYWNraW5nIC0gQ2hlY2sgdG8gc2VlIGlmIHRoZSBncm91cCBpcyBwYWNrZWQgaW50byB0aGUKKyAqCQkJc2NoZWQgZG9tYW4uCisgKgorICogVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gdXNlZCBhdCB0aGUgc2libGluZyBsZXZlbC4gIFNvbWUKKyAqIGNvcmVzIGxpa2UgUE9XRVI3IHByZWZlciB0byB1c2UgbG93ZXIgbnVtYmVyZWQgU01UIHRocmVhZHMuICBJbiB0aGUKKyAqIGNhc2Ugb2YgUE9XRVI3LCBpdCBjYW4gbW92ZSB0byBsb3dlciBTTVQgbW9kZXMgb25seSB3aGVuIGhpZ2hlcgorICogdGhyZWFkcyBhcmUgaWRsZS4gIFdoZW4gaW4gbG93ZXIgU01UIG1vZGVzLCB0aGUgdGhyZWFkcyB3aWxsCisgKiBwZXJmb3JtIGJldHRlciBzaW5jZSB0aGV5IHNoYXJlIGxlc3MgY29yZSByZXNvdXJjZXMuICBIZW5jZSB3aGVuIHdlCisgKiBoYXZlIGlkbGUgdGhyZWFkcywgd2Ugd2FudCB0aGVtIHRvIGJlIHRoZSBoaWdoZXIgb25lcy4KKyAqCisgKiBUaGlzIHBhY2tpbmcgZnVuY3Rpb24gaXMgcnVuIG9uIGlkbGUgdGhyZWFkcy4gIEl0IGNoZWNrcyB0byBzZWUgaWYKKyAqIHRoZSBidXNpZXN0IENQVSBpbiB0aGlzIGRvbWFpbiAoY29yZSBpbiB0aGUgUDcgY2FzZSkgaGFzIGEgaGlnaGVyCisgKiBDUFUgbnVtYmVyIHRoYW4gdGhlIHBhY2tpbmcgZnVuY3Rpb24gaXMgYmVpbmcgcnVuIG9uLiAgSGVyZSB3ZSBhcmUKKyAqIGFzc3VtaW5nIGxvd2VyIENQVSBudW1iZXIgd2lsbCBiZSBlcXVpdmFsZW50IHRvIGxvd2VyIGEgU01UIHRocmVhZAorICogbnVtYmVyLgorICoKKyAqIFJldHVybnMgMSB3aGVuIHBhY2tpbmcgaXMgcmVxdWlyZWQgYW5kIGEgdGFzayBzaG91bGQgYmUgbW92ZWQgdG8KKyAqIHRoaXMgQ1BVLiAgVGhlIGFtb3VudCBvZiB0aGUgaW1iYWxhbmNlIGlzIHJldHVybmVkIGluICppbWJhbGFuY2UuCisgKgorICogQHNkOiBUaGUgc2NoZWRfZG9tYWluIHdob3NlIHBhY2tpbmcgaXMgdG8gYmUgY2hlY2tlZC4KKyAqIEBzZHM6IFN0YXRpc3RpY3Mgb2YgdGhlIHNjaGVkX2RvbWFpbiB3aGljaCBpcyB0byBiZSBwYWNrZWQKKyAqIEB0aGlzX2NwdTogVGhlIGNwdSBhdCB3aG9zZSBzY2hlZF9kb21haW4gd2UncmUgcGVyZm9ybWluZyBsb2FkLWJhbGFuY2UuCisgKiBAaW1iYWxhbmNlOiByZXR1cm5zIGFtb3VudCBvZiBpbWJhbGFuY2VkIGR1ZSB0byBwYWNraW5nLgorICovCitzdGF0aWMgaW50IGNoZWNrX2FzeW1fcGFja2luZyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwKKwkJCSAgICAgIHN0cnVjdCBzZF9sYl9zdGF0cyAqc2RzLAorCQkJICAgICAgaW50IHRoaXNfY3B1LCB1bnNpZ25lZCBsb25nICppbWJhbGFuY2UpCit7CisJaW50IGJ1c2llc3RfY3B1OworCisJaWYgKCEoc2QtPmZsYWdzICYgU0RfQVNZTV9QQUNLSU5HKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNkcy0+YnVzaWVzdCkKKwkJcmV0dXJuIDA7CisKKwlidXNpZXN0X2NwdSA9IGdyb3VwX2ZpcnN0X2NwdShzZHMtPmJ1c2llc3QpOworCWlmICh0aGlzX2NwdSA+IGJ1c2llc3RfY3B1KQorCQlyZXR1cm4gMDsKKworCSppbWJhbGFuY2UgPSBESVZfUk9VTkRfQ0xPU0VTVChzZHMtPm1heF9sb2FkICogc2RzLT5idXNpZXN0LT5jcHVfcG93ZXIsCisJCQkJICAgICAgIFNDSEVEX0xPQURfU0NBTEUpOworCXJldHVybiAxOwogfQogCiAvKioKQEAgLTI2OTIsNiArMjgxMiwxMCBAQAogCWlmICghKCpiYWxhbmNlKSkKIAkJZ290byByZXQ7CiAKKwlpZiAoKGlkbGUgPT0gQ1BVX0lETEUgfHwgaWRsZSA9PSBDUFVfTkVXTFlfSURMRSkgJiYKKwkgICAgY2hlY2tfYXN5bV9wYWNraW5nKHNkLCAmc2RzLCB0aGlzX2NwdSwgaW1iYWxhbmNlKSkKKwkJcmV0dXJuIHNkcy5idXNpZXN0OworCiAJaWYgKCFzZHMuYnVzaWVzdCB8fCBzZHMuYnVzaWVzdF9ucl9ydW5uaW5nID09IDApCiAJCWdvdG8gb3V0X2JhbGFuY2VkOwogCkBAIC0yNzI2LDggKzI4NTAsOSBAQAogICogZmluZF9idXNpZXN0X3F1ZXVlIC0gZmluZCB0aGUgYnVzaWVzdCBydW5xdWV1ZSBhbW9uZyB0aGUgY3B1cyBpbiBncm91cC4KICAqLwogc3RhdGljIHN0cnVjdCBycSAqCi1maW5kX2J1c2llc3RfcXVldWUoc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsCi0JCSAgIHVuc2lnbmVkIGxvbmcgaW1iYWxhbmNlLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cykKK2ZpbmRfYnVzaWVzdF9xdWV1ZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCwKKwkJICAgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsIHVuc2lnbmVkIGxvbmcgaW1iYWxhbmNlLAorCQkgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cykKIHsKIAlzdHJ1Y3QgcnEgKmJ1c2llc3QgPSBOVUxMLCAqcnE7CiAJdW5zaWduZWQgbG9uZyBtYXhfbG9hZCA9IDA7CkBAIC0yNzM4LDYgKzI4NjMsOSBAQAogCQl1bnNpZ25lZCBsb25nIGNhcGFjaXR5ID0gRElWX1JPVU5EX0NMT1NFU1QocG93ZXIsIFNDSEVEX0xPQURfU0NBTEUpOwogCQl1bnNpZ25lZCBsb25nIHdsOwogCisJCWlmICghY2FwYWNpdHkpCisJCQljYXBhY2l0eSA9IGZpeF9zbWFsbF9jYXBhY2l0eShzZCwgZ3JvdXApOworCiAJCWlmICghY3B1bWFza190ZXN0X2NwdShpLCBjcHVzKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yNzc3LDkgKzI5MDUsMTkgQEAKIC8qIFdvcmtpbmcgY3B1bWFzayBmb3IgbG9hZF9iYWxhbmNlIGFuZCBsb2FkX2JhbGFuY2VfbmV3aWRsZS4gKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfdG1wbWFzayk7CiAKLXN0YXRpYyBpbnQgbmVlZF9hY3RpdmVfYmFsYW5jZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IHNkX2lkbGUsIGludCBpZGxlKQorc3RhdGljIGludCBuZWVkX2FjdGl2ZV9iYWxhbmNlKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgc2RfaWRsZSwgaW50IGlkbGUsCisJCQkgICAgICAgaW50IGJ1c2llc3RfY3B1LCBpbnQgdGhpc19jcHUpCiB7CiAJaWYgKGlkbGUgPT0gQ1BVX05FV0xZX0lETEUpIHsKKworCQkvKgorCQkgKiBBU1lNX1BBQ0tJTkcgbmVlZHMgdG8gZm9yY2UgbWlncmF0ZSB0YXNrcyBmcm9tIGJ1c3kgYnV0CisJCSAqIGhpZ2hlciBudW1iZXJlZCBDUFVzIGluIG9yZGVyIHRvIHBhY2sgYWxsIHRhc2tzIGluIHRoZQorCQkgKiBsb3dlc3QgbnVtYmVyZWQgQ1BVcy4KKwkJICovCisJCWlmICgoc2QtPmZsYWdzICYgU0RfQVNZTV9QQUNLSU5HKSAmJiBidXNpZXN0X2NwdSA+IHRoaXNfY3B1KQorCQkJcmV0dXJuIDE7CisKIAkJLyoKIAkJICogVGhlIG9ubHkgdGFzayBydW5uaW5nIGluIGEgbm9uLWlkbGUgY3B1IGNhbiBiZSBtb3ZlZCB0byB0aGlzCiAJCSAqIGNwdSBpbiBhbiBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgZnJlZXVwIHRoZSBvdGhlciBDUFUKQEAgLTI4NTQsNyArMjk5Miw3IEBACiAJCWdvdG8gb3V0X2JhbGFuY2VkOwogCX0KIAotCWJ1c2llc3QgPSBmaW5kX2J1c2llc3RfcXVldWUoZ3JvdXAsIGlkbGUsIGltYmFsYW5jZSwgY3B1cyk7CisJYnVzaWVzdCA9IGZpbmRfYnVzaWVzdF9xdWV1ZShzZCwgZ3JvdXAsIGlkbGUsIGltYmFsYW5jZSwgY3B1cyk7CiAJaWYgKCFidXNpZXN0KSB7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeXFbaWRsZV0pOwogCQlnb3RvIG91dF9iYWxhbmNlZDsKQEAgLTI4OTgsNyArMzAzNiw4IEBACiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2ZhaWxlZFtpZGxlXSk7CiAJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCsrOwogCi0JCWlmIChuZWVkX2FjdGl2ZV9iYWxhbmNlKHNkLCBzZF9pZGxlLCBpZGxlKSkgeworCQlpZiAobmVlZF9hY3RpdmVfYmFsYW5jZShzZCwgc2RfaWRsZSwgaWRsZSwgY3B1X29mKGJ1c2llc3QpLAorCQkJCQl0aGlzX2NwdSkpIHsKIAkJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmYnVzaWVzdC0+bG9jaywgZmxhZ3MpOwogCiAJCQkvKiBkb24ndCBraWNrIHRoZSBhY3RpdmVfbG9hZF9iYWxhbmNlX2NwdV9zdG9wLApAQCAtMzA5MywxMyArMzIzMiw0MCBAQAogfQogCiAjaWZkZWYgQ09ORklHX05PX0haCisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSwgcmVtb3RlX3NjaGVkX3NvZnRpcnFfY2IpOworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3NjaGVkX3NvZnRpcnEodm9pZCAqZGF0YSkKK3sKKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihTQ0hFRF9TT0ZUSVJRKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfc2NoZWRfc29mdGlycV9jc2Qoc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCkKK3sKKwljc2QtPmZ1bmMgPSB0cmlnZ2VyX3NjaGVkX3NvZnRpcnE7CisJY3NkLT5pbmZvID0gTlVMTDsKKwljc2QtPmZsYWdzID0gMDsKKwljc2QtPnByaXYgPSAwOworfQorCisvKgorICogaWRsZSBsb2FkIGJhbGFuY2luZyBkZXRhaWxzCisgKiAtIE9uZSBvZiB0aGUgaWRsZSBDUFVzIG5vbWluYXRlcyBpdHNlbGYgYXMgaWRsZSBsb2FkX2JhbGFuY2VyLCB3aGlsZQorICogICBlbnRlcmluZyBpZGxlLgorICogLSBUaGlzIGlkbGUgbG9hZCBiYWxhbmNlciBDUFUgd2lsbCBhbHNvIGdvIGludG8gdGlja2xlc3MgbW9kZSB3aGVuCisgKiAgIGl0IGlzIGlkbGUsIGp1c3QgbGlrZSBhbGwgb3RoZXIgaWRsZSBDUFVzCisgKiAtIFdoZW4gb25lIG9mIHRoZSBidXN5IENQVXMgbm90aWNlIHRoYXQgdGhlcmUgbWF5IGJlIGFuIGlkbGUgcmViYWxhbmNpbmcKKyAqICAgbmVlZGVkLCB0aGV5IHdpbGwga2ljayB0aGUgaWRsZSBsb2FkIGJhbGFuY2VyLCB3aGljaCB0aGVuIGRvZXMgaWRsZQorICogICBsb2FkIGJhbGFuY2luZyBmb3IgYWxsIHRoZSBpZGxlIENQVXMuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgewogCWF0b21pY190IGxvYWRfYmFsYW5jZXI7Ci0JY3B1bWFza192YXJfdCBjcHVfbWFzazsKLQljcHVtYXNrX3Zhcl90IGlsYl9ncnBfbm9oel9tYXNrOwotfSBub2h6IF9fX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKLQkubG9hZF9iYWxhbmNlciA9IEFUT01JQ19JTklUKC0xKSwKLX07CisJYXRvbWljX3QgZmlyc3RfcGlja19jcHU7CisJYXRvbWljX3Qgc2Vjb25kX3BpY2tfY3B1OworCWNwdW1hc2tfdmFyX3QgaWRsZV9jcHVzX21hc2s7CisJY3B1bWFza192YXJfdCBncnBfaWRsZV9tYXNrOworCXVuc2lnbmVkIGxvbmcgbmV4dF9iYWxhbmNlOyAgICAgLyogaW4gamlmZnkgdW5pdHMgKi8KK30gbm9oeiBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIGludCBnZXRfbm9oel9sb2FkX2JhbGFuY2VyKHZvaWQpCiB7CkBAIC0zMTUzLDE3ICszMzE5LDE3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlzX3NlbWlfaWRsZV9ncm91cChzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmlsYl9ncm91cCkKIHsKLQljcHVtYXNrX2FuZChub2h6LmlsYl9ncnBfbm9oel9tYXNrLCBub2h6LmNwdV9tYXNrLAorCWNwdW1hc2tfYW5kKG5vaHouZ3JwX2lkbGVfbWFzaywgbm9oei5pZGxlX2NwdXNfbWFzaywKIAkJCQkJc2NoZWRfZ3JvdXBfY3B1cyhpbGJfZ3JvdXApKTsKIAogCS8qCiAJICogQSBzY2hlZF9ncm91cCBpcyBzZW1pLWlkbGUgd2hlbiBpdCBoYXMgYXRsZWFzdCBvbmUgYnVzeSBjcHUKIAkgKiBhbmQgYXRsZWFzdCBvbmUgaWRsZSBjcHUuCiAJICovCi0JaWYgKGNwdW1hc2tfZW1wdHkobm9oei5pbGJfZ3JwX25vaHpfbWFzaykpCisJaWYgKGNwdW1hc2tfZW1wdHkobm9oei5ncnBfaWRsZV9tYXNrKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY3B1bWFza19lcXVhbChub2h6LmlsYl9ncnBfbm9oel9tYXNrLCBzY2hlZF9ncm91cF9jcHVzKGlsYl9ncm91cCkpKQorCWlmIChjcHVtYXNrX2VxdWFsKG5vaHouZ3JwX2lkbGVfbWFzaywgc2NoZWRfZ3JvdXBfY3B1cyhpbGJfZ3JvdXApKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKQEAgLTMxOTYsNyArMzM2Miw3IEBACiAJICogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZW4gd2UgaGF2ZSBubyBpZGxlIENQVXMgb3Igb25seSBvbmUKIAkgKiBpZGxlIENQVS4gRG9uJ3Qgd2FsayB0aGUgc2NoZWRfZG9tYWluIGhpZXJhcmNoeSBpbiBzdWNoIGNhc2VzCiAJICovCi0JaWYgKGNwdW1hc2tfd2VpZ2h0KG5vaHouY3B1X21hc2spIDwgMikKKwlpZiAoY3B1bWFza193ZWlnaHQobm9oei5pZGxlX2NwdXNfbWFzaykgPCAyKQogCQlnb3RvIG91dF9kb25lOwogCiAJZm9yX2VhY2hfZmxhZ19kb21haW4oY3B1LCBzZCwgU0RfUE9XRVJTQVZJTkdTX0JBTEFOQ0UpIHsKQEAgLTMyMDQsNyArMzM3MCw3IEBACiAKIAkJZG8gewogCQkJaWYgKGlzX3NlbWlfaWRsZV9ncm91cChpbGJfZ3JvdXApKQotCQkJCXJldHVybiBjcHVtYXNrX2ZpcnN0KG5vaHouaWxiX2dycF9ub2h6X21hc2spOworCQkJCXJldHVybiBjcHVtYXNrX2ZpcnN0KG5vaHouZ3JwX2lkbGVfbWFzayk7CiAKIAkJCWlsYl9ncm91cCA9IGlsYl9ncm91cC0+bmV4dDsKIApAQCAtMzIxMiw5OCArMzM3OCwxMTYgQEAKIAl9CiAKIG91dF9kb25lOgotCXJldHVybiBjcHVtYXNrX2ZpcnN0KG5vaHouY3B1X21hc2spOworCXJldHVybiBucl9jcHVfaWRzOwogfQogI2Vsc2UgLyogIChDT05GSUdfU0NIRURfTUMgfHwgQ09ORklHX1NDSEVEX1NNVCkgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZpbmRfbmV3X2lsYihpbnQgY2FsbF9jcHUpCiB7Ci0JcmV0dXJuIGNwdW1hc2tfZmlyc3Qobm9oei5jcHVfbWFzayk7CisJcmV0dXJuIG5yX2NwdV9pZHM7CiB9CiAjZW5kaWYKIAogLyoKKyAqIEtpY2sgYSBDUFUgdG8gZG8gdGhlIG5vaHogYmFsYW5jaW5nLCBpZiBpdCBpcyB0aW1lIGZvciBpdC4gV2UgcGljayB0aGUKKyAqIG5vaHpfbG9hZF9iYWxhbmNlciBDUFUgKGlmIHRoZXJlIGlzIG9uZSkgb3RoZXJ3aXNlIGZhbGxiYWNrIHRvIGFueSBpZGxlCisgKiBDUFUgKGlmIHRoZXJlIGlzIG9uZSkuCisgKi8KK3N0YXRpYyB2b2lkIG5vaHpfYmFsYW5jZXJfa2ljayhpbnQgY3B1KQoreworCWludCBpbGJfY3B1OworCisJbm9oei5uZXh0X2JhbGFuY2UrKzsKKworCWlsYl9jcHUgPSBnZXRfbm9oel9sb2FkX2JhbGFuY2VyKCk7CisKKwlpZiAoaWxiX2NwdSA+PSBucl9jcHVfaWRzKSB7CisJCWlsYl9jcHUgPSBjcHVtYXNrX2ZpcnN0KG5vaHouaWRsZV9jcHVzX21hc2spOworCQlpZiAoaWxiX2NwdSA+PSBucl9jcHVfaWRzKQorCQkJcmV0dXJuOworCX0KKworCWlmICghY3B1X3JxKGlsYl9jcHUpLT5ub2h6X2JhbGFuY2Vfa2ljaykgeworCQlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3A7CisKKwkJY3B1X3JxKGlsYl9jcHUpLT5ub2h6X2JhbGFuY2Vfa2ljayA9IDE7CisJCWNwID0gJnBlcl9jcHUocmVtb3RlX3NjaGVkX3NvZnRpcnFfY2IsIGNwdSk7CisJCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGlsYl9jcHUsIGNwLCAwKTsKKwl9CisJcmV0dXJuOworfQorCisvKgogICogVGhpcyByb3V0aW5lIHdpbGwgdHJ5IHRvIG5vbWluYXRlIHRoZSBpbGIgKGlkbGUgbG9hZCBiYWxhbmNpbmcpCiAgKiBvd25lciBhbW9uZyB0aGUgY3B1cyB3aG9zZSB0aWNrcyBhcmUgc3RvcHBlZC4gaWxiIG93bmVyIHdpbGwgZG8gdGhlIGlkbGUKLSAqIGxvYWQgYmFsYW5jaW5nIG9uIGJlaGFsZiBvZiBhbGwgdGhvc2UgY3B1cy4gSWYgYWxsIHRoZSBjcHVzIGluIHRoZSBzeXN0ZW0KLSAqIGdvIGludG8gdGhpcyB0aWNrbGVzcyBtb2RlLCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gaWxiIG93bmVyIChhcyB0aGVyZSBpcwotICogbm8gbmVlZCBmb3Igb25lKSBhbmQgYWxsIHRoZSBjcHVzIHdpbGwgc2xlZXAgdGlsbCB0aGUgbmV4dCB3YWtldXAgZXZlbnQKLSAqIGFycml2ZXMuLi4KKyAqIGxvYWQgYmFsYW5jaW5nIG9uIGJlaGFsZiBvZiBhbGwgdGhvc2UgY3B1cy4KICAqCi0gKiBGb3IgdGhlIGlsYiBvd25lciwgdGljayBpcyBub3Qgc3RvcHBlZC4gQW5kIHRoaXMgdGljayB3aWxsIGJlIHVzZWQKLSAqIGZvciBpZGxlIGxvYWQgYmFsYW5jaW5nLiBpbGIgb3duZXIgd2lsbCBzdGlsbCBiZSBwYXJ0IG9mCi0gKiBub2h6LmNwdV9tYXNrLi4KKyAqIFdoZW4gdGhlIGlsYiBvd25lciBiZWNvbWVzIGJ1c3ksIHdlIHdpbGwgbm90IGhhdmUgbmV3IGlsYiBvd25lciB1bnRpbCBzb21lCisgKiBpZGxlIENQVSB3YWtlcyB1cCBhbmQgZ29lcyBiYWNrIHRvIGlkbGUgb3Igc29tZSBidXN5IENQVSB0cmllcyB0byBraWNrCisgKiBpZGxlIGxvYWQgYmFsYW5jaW5nIGJ5IGtpY2tpbmcgb25lIG9mIHRoZSBpZGxlIENQVXMuCiAgKgotICogV2hpbGUgc3RvcHBpbmcgdGhlIHRpY2ssIHRoaXMgY3B1IHdpbGwgYmVjb21lIHRoZSBpbGIgb3duZXIgaWYgdGhlcmUKLSAqIGlzIG5vIG90aGVyIG93bmVyLiBBbmQgd2lsbCBiZSB0aGUgb3duZXIgdGlsbCB0aGF0IGNwdSBiZWNvbWVzIGJ1c3kKLSAqIG9yIGlmIGFsbCBjcHVzIGluIHRoZSBzeXN0ZW0gc3RvcCB0aGVpciB0aWNrcyBhdCB3aGljaCBwb2ludAotICogdGhlcmUgaXMgbm8gbmVlZCBmb3IgaWxiIG93bmVyLgotICoKLSAqIFdoZW4gdGhlIGlsYiBvd25lciBiZWNvbWVzIGJ1c3ksIGl0IG5vbWluYXRlcyBhbm90aGVyIG93bmVyLCBkdXJpbmcgdGhlCi0gKiBuZXh0IGJ1c3kgc2NoZWR1bGVyX3RpY2soKQorICogVGlja3MgYXJlIHN0b3BwZWQgZm9yIHRoZSBpbGIgb3duZXIgYXMgd2VsbCwgd2l0aCBidXN5IENQVSBraWNraW5nIHRoaXMKKyAqIGlsYiBvd25lciBDUFUgaW4gZnV0dXJlICh3aGVuIHRoZXJlIGlzIGEgbmVlZCBmb3IgaWRsZSBsb2FkIGJhbGFuY2luZyBvbgorICogYmVoYWxmIG9mIGFsbCBpZGxlIENQVXMpLgogICovCi1pbnQgc2VsZWN0X25vaHpfbG9hZF9iYWxhbmNlcihpbnQgc3RvcF90aWNrKQordm9pZCBzZWxlY3Rfbm9oel9sb2FkX2JhbGFuY2VyKGludCBzdG9wX3RpY2spCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWlmIChzdG9wX3RpY2spIHsKLQkJY3B1X3JxKGNwdSktPmluX25vaHpfcmVjZW50bHkgPSAxOwotCiAJCWlmICghY3B1X2FjdGl2ZShjcHUpKSB7CiAJCQlpZiAoYXRvbWljX3JlYWQoJm5vaHoubG9hZF9iYWxhbmNlcikgIT0gY3B1KQotCQkJCXJldHVybiAwOworCQkJCXJldHVybjsKIAogCQkJLyoKIAkJCSAqIElmIHdlIGFyZSBnb2luZyBvZmZsaW5lIGFuZCBzdGlsbCB0aGUgbGVhZGVyLAogCQkJICogZ2l2ZSB1cCEKIAkJCSAqLwotCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZub2h6LmxvYWRfYmFsYW5jZXIsIGNwdSwgLTEpICE9IGNwdSkKKwkJCWlmIChhdG9taWNfY21weGNoZygmbm9oei5sb2FkX2JhbGFuY2VyLCBjcHUsCisJCQkJCSAgIG5yX2NwdV9pZHMpICE9IGNwdSkKIAkJCQlCVUcoKTsKIAotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm47CiAJCX0KIAotCQljcHVtYXNrX3NldF9jcHUoY3B1LCBub2h6LmNwdV9tYXNrKTsKKwkJY3B1bWFza19zZXRfY3B1KGNwdSwgbm9oei5pZGxlX2NwdXNfbWFzayk7CiAKLQkJLyogdGltZSBmb3IgaWxiIG93bmVyIGFsc28gdG8gc2xlZXAgKi8KLQkJaWYgKGNwdW1hc2tfd2VpZ2h0KG5vaHouY3B1X21hc2spID09IG51bV9hY3RpdmVfY3B1cygpKSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJm5vaHoubG9hZF9iYWxhbmNlcikgPT0gY3B1KQotCQkJCWF0b21pY19zZXQoJm5vaHoubG9hZF9iYWxhbmNlciwgLTEpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwkJaWYgKGF0b21pY19yZWFkKCZub2h6LmZpcnN0X3BpY2tfY3B1KSA9PSBjcHUpCisJCQlhdG9taWNfY21weGNoZygmbm9oei5maXJzdF9waWNrX2NwdSwgY3B1LCBucl9jcHVfaWRzKTsKKwkJaWYgKGF0b21pY19yZWFkKCZub2h6LnNlY29uZF9waWNrX2NwdSkgPT0gY3B1KQorCQkJYXRvbWljX2NtcHhjaGcoJm5vaHouc2Vjb25kX3BpY2tfY3B1LCBjcHUsIG5yX2NwdV9pZHMpOwogCi0JCWlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSA9PSAtMSkgewotCQkJLyogbWFrZSBtZSB0aGUgaWxiIG93bmVyICovCi0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJm5vaHoubG9hZF9iYWxhbmNlciwgLTEsIGNwdSkgPT0gLTEpCi0JCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJm5vaHoubG9hZF9iYWxhbmNlcikgPT0gY3B1KSB7CisJCWlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSA+PSBucl9jcHVfaWRzKSB7CiAJCQlpbnQgbmV3X2lsYjsKIAotCQkJaWYgKCEoc2NoZWRfc210X3Bvd2VyX3NhdmluZ3MgfHwKLQkJCQkJCXNjaGVkX21jX3Bvd2VyX3NhdmluZ3MpKQotCQkJCXJldHVybiAxOworCQkJLyogbWFrZSBtZSB0aGUgaWxiIG93bmVyICovCisJCQlpZiAoYXRvbWljX2NtcHhjaGcoJm5vaHoubG9hZF9iYWxhbmNlciwgbnJfY3B1X2lkcywKKwkJCQkJICAgY3B1KSAhPSBucl9jcHVfaWRzKQorCQkJCXJldHVybjsKKwogCQkJLyoKIAkJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1vcmUgcG93ZXItZWZmaWNpZW50CiAJCQkgKiBpbGIuCiAJCQkgKi8KIAkJCW5ld19pbGIgPSBmaW5kX25ld19pbGIoY3B1KTsKIAkJCWlmIChuZXdfaWxiIDwgbnJfY3B1X2lkcyAmJiBuZXdfaWxiICE9IGNwdSkgewotCQkJCWF0b21pY19zZXQoJm5vaHoubG9hZF9iYWxhbmNlciwgLTEpOworCQkJCWF0b21pY19zZXQoJm5vaHoubG9hZF9iYWxhbmNlciwgbnJfY3B1X2lkcyk7CiAJCQkJcmVzY2hlZF9jcHUobmV3X2lsYik7Ci0JCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuOwogCQkJfQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBub2h6LmNwdV9tYXNrKSkKLQkJCXJldHVybiAwOworCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKSkKKwkJCXJldHVybjsKIAotCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5vaHouY3B1X21hc2spOworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5vaHouaWRsZV9jcHVzX21hc2spOwogCiAJCWlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSA9PSBjcHUpCi0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJm5vaHoubG9hZF9iYWxhbmNlciwgY3B1LCAtMSkgIT0gY3B1KQorCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZub2h6LmxvYWRfYmFsYW5jZXIsIGNwdSwKKwkJCQkJICAgbnJfY3B1X2lkcykgIT0gY3B1KQogCQkJCUJVRygpOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm47CiB9CiAjZW5kaWYKIApAQCAtMzM4NSwxMCArMzU2OSwxMDEgQEAKIAkJcnEtPm5leHRfYmFsYW5jZSA9IG5leHRfYmFsYW5jZTsKIH0KIAorI2lmZGVmIENPTkZJR19OT19IWgorLyoKKyAqIEluIENPTkZJR19OT19IWiBjYXNlLCB0aGUgaWRsZSBiYWxhbmNlIGtpY2tlZSB3aWxsIGRvIHRoZQorICogcmViYWxhbmNpbmcgZm9yIGFsbCB0aGUgY3B1cyBmb3Igd2hvbSBzY2hlZHVsZXIgdGlja3MgYXJlIHN0b3BwZWQuCisgKi8KK3N0YXRpYyB2b2lkIG5vaHpfaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUpCit7CisJc3RydWN0IHJxICp0aGlzX3JxID0gY3B1X3JxKHRoaXNfY3B1KTsKKwlzdHJ1Y3QgcnEgKnJxOworCWludCBiYWxhbmNlX2NwdTsKKworCWlmIChpZGxlICE9IENQVV9JRExFIHx8ICF0aGlzX3JxLT5ub2h6X2JhbGFuY2Vfa2ljaykKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfY3B1KGJhbGFuY2VfY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKSB7CisJCWlmIChiYWxhbmNlX2NwdSA9PSB0aGlzX2NwdSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIElmIHRoaXMgY3B1IGdldHMgd29yayB0byBkbywgc3RvcCB0aGUgbG9hZCBiYWxhbmNpbmcKKwkJICogd29yayBiZWluZyBkb25lIGZvciBvdGhlciBjcHVzLiBOZXh0IGxvYWQKKwkJICogYmFsYW5jaW5nIG93bmVyIHdpbGwgcGljayBpdCB1cC4KKwkJICovCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJdGhpc19ycS0+bm9oel9iYWxhbmNlX2tpY2sgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlyYXdfc3Bpbl9sb2NrX2lycSgmdGhpc19ycS0+bG9jayk7CisJCXVwZGF0ZV9ycV9jbG9jayh0aGlzX3JxKTsKKwkJdXBkYXRlX2NwdV9sb2FkKHRoaXNfcnEpOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZ0aGlzX3JxLT5sb2NrKTsKKworCQlyZWJhbGFuY2VfZG9tYWlucyhiYWxhbmNlX2NwdSwgQ1BVX0lETEUpOworCisJCXJxID0gY3B1X3JxKGJhbGFuY2VfY3B1KTsKKwkJaWYgKHRpbWVfYWZ0ZXIodGhpc19ycS0+bmV4dF9iYWxhbmNlLCBycS0+bmV4dF9iYWxhbmNlKSkKKwkJCXRoaXNfcnEtPm5leHRfYmFsYW5jZSA9IHJxLT5uZXh0X2JhbGFuY2U7CisJfQorCW5vaHoubmV4dF9iYWxhbmNlID0gdGhpc19ycS0+bmV4dF9iYWxhbmNlOworCXRoaXNfcnEtPm5vaHpfYmFsYW5jZV9raWNrID0gMDsKK30KKworLyoKKyAqIEN1cnJlbnQgaGV1cmlzdGljIGZvciBraWNraW5nIHRoZSBpZGxlIGxvYWQgYmFsYW5jZXIKKyAqIC0gZmlyc3RfcGlja19jcHUgaXMgdGhlIG9uZSBvZiB0aGUgYnVzeSBDUFVzLiBJdCB3aWxsIGtpY2sKKyAqICAgaWRsZSBsb2FkIGJhbGFuY2VyIHdoZW4gaXQgaGFzIG1vcmUgdGhhbiBvbmUgcHJvY2VzcyBhY3RpdmUuIFRoaXMKKyAqICAgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgaWRsZSBsb2FkIGJhbGFuY2luZyBhbHRvZ2V0aGVyIHdoZW4gd2UgaGF2ZQorICogICBvbmx5IG9uZSBydW5uaW5nIHByb2Nlc3MgaW4gdGhlIHN5c3RlbSAoY29tbW9uIGNhc2UpLgorICogLSBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBidXN5IENQVSwgaWRsZSBsb2FkIGJhbGFuY2VyIG1heSBoYXZlCisgKiAgIHRvIHJ1biBmb3IgYWN0aXZlX2xvYWRfYmFsYW5jZSB0byBoYXBwZW4gKGkuZS4sIHR3byBidXN5IENQVXMgYXJlCisgKiAgIFNNVCBvciBjb3JlIHNpYmxpbmdzIGFuZCBjYW4gcnVuIGJldHRlciBpZiB0aGV5IG1vdmUgdG8gZGlmZmVyZW50CisgKiAgIHBoeXNpY2FsIENQVXMpLiBTbywgc2Vjb25kX3BpY2tfY3B1IGlzIHRoZSBzZWNvbmQgb2YgdGhlIGJ1c3kgQ1BVcworICogICB3aGljaCB3aWxsIGtpY2sgaWRsZSBsb2FkIGJhbGFuY2VyIGFzIHNvb24gYXMgaXQgaGFzIGFueSBsb2FkLgorICovCitzdGF0aWMgaW5saW5lIGludCBub2h6X2tpY2tfbmVlZGVkKHN0cnVjdCBycSAqcnEsIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCByZXQ7CisJaW50IGZpcnN0X3BpY2tfY3B1LCBzZWNvbmRfcGlja19jcHU7CisKKwlpZiAodGltZV9iZWZvcmUobm93LCBub2h6Lm5leHRfYmFsYW5jZSkpCisJCXJldHVybiAwOworCisJaWYgKCFycS0+bnJfcnVubmluZykKKwkJcmV0dXJuIDA7CisKKwlmaXJzdF9waWNrX2NwdSA9IGF0b21pY19yZWFkKCZub2h6LmZpcnN0X3BpY2tfY3B1KTsKKwlzZWNvbmRfcGlja19jcHUgPSBhdG9taWNfcmVhZCgmbm9oei5zZWNvbmRfcGlja19jcHUpOworCisJaWYgKGZpcnN0X3BpY2tfY3B1IDwgbnJfY3B1X2lkcyAmJiBmaXJzdF9waWNrX2NwdSAhPSBjcHUgJiYKKwkgICAgc2Vjb25kX3BpY2tfY3B1IDwgbnJfY3B1X2lkcyAmJiBzZWNvbmRfcGlja19jcHUgIT0gY3B1KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGF0b21pY19jbXB4Y2hnKCZub2h6LmZpcnN0X3BpY2tfY3B1LCBucl9jcHVfaWRzLCBjcHUpOworCWlmIChyZXQgPT0gbnJfY3B1X2lkcyB8fCByZXQgPT0gY3B1KSB7CisJCWF0b21pY19jbXB4Y2hnKCZub2h6LnNlY29uZF9waWNrX2NwdSwgY3B1LCBucl9jcHVfaWRzKTsKKwkJaWYgKHJxLT5ucl9ydW5uaW5nID4gMSkKKwkJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldCA9IGF0b21pY19jbXB4Y2hnKCZub2h6LnNlY29uZF9waWNrX2NwdSwgbnJfY3B1X2lkcywgY3B1KTsKKwkJaWYgKHJldCA9PSBucl9jcHVfaWRzIHx8IHJldCA9PSBjcHUpIHsKKwkJCWlmIChycS0+bnJfcnVubmluZykKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBub2h6X2lkbGVfYmFsYW5jZShpbnQgdGhpc19jcHUsIGVudW0gY3B1X2lkbGVfdHlwZSBpZGxlKSB7IH0KKyNlbmRpZgorCiAvKgogICogcnVuX3JlYmFsYW5jZV9kb21haW5zIGlzIHRyaWdnZXJlZCB3aGVuIG5lZWRlZCBmcm9tIHRoZSBzY2hlZHVsZXIgdGljay4KLSAqIEluIENPTkZJR19OT19IWiBjYXNlLCB0aGUgaWRsZSBsb2FkIGJhbGFuY2Ugb3duZXIgd2lsbCBkbyB0aGUKLSAqIHJlYmFsYW5jaW5nIGZvciBhbGwgdGhlIGNwdXMgZm9yIHdob20gc2NoZWR1bGVyIHRpY2tzIGFyZSBzdG9wcGVkLgorICogQWxzbyB0cmlnZ2VyZWQgZm9yIG5vaHogaWRsZSBiYWxhbmNpbmcgKHdpdGggbm9oel9iYWxhbmNpbmdfa2ljayBzZXQpLgogICovCiBzdGF0aWMgdm9pZCBydW5fcmViYWxhbmNlX2RvbWFpbnMoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQogewpAQCAtMzM5OSwzNyArMzY3NCwxMiBAQAogCiAJcmViYWxhbmNlX2RvbWFpbnModGhpc19jcHUsIGlkbGUpOwogCi0jaWZkZWYgQ09ORklHX05PX0haCiAJLyoKLQkgKiBJZiB0aGlzIGNwdSBpcyB0aGUgb3duZXIgZm9yIGlkbGUgbG9hZCBiYWxhbmNpbmcsIHRoZW4gZG8gdGhlCisJICogSWYgdGhpcyBjcHUgaGFzIGEgcGVuZGluZyBub2h6X2JhbGFuY2Vfa2ljaywgdGhlbiBkbyB0aGUKIAkgKiBiYWxhbmNpbmcgb24gYmVoYWxmIG9mIHRoZSBvdGhlciBpZGxlIGNwdXMgd2hvc2UgdGlja3MgYXJlCiAJICogc3RvcHBlZC4KIAkgKi8KLQlpZiAodGhpc19ycS0+aWRsZV9hdF90aWNrICYmCi0JICAgIGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IHRoaXNfY3B1KSB7Ci0JCXN0cnVjdCBycSAqcnE7Ci0JCWludCBiYWxhbmNlX2NwdTsKLQotCQlmb3JfZWFjaF9jcHUoYmFsYW5jZV9jcHUsIG5vaHouY3B1X21hc2spIHsKLQkJCWlmIChiYWxhbmNlX2NwdSA9PSB0aGlzX2NwdSkKLQkJCQljb250aW51ZTsKLQotCQkJLyoKLQkJCSAqIElmIHRoaXMgY3B1IGdldHMgd29yayB0byBkbywgc3RvcCB0aGUgbG9hZCBiYWxhbmNpbmcKLQkJCSAqIHdvcmsgYmVpbmcgZG9uZSBmb3Igb3RoZXIgY3B1cy4gTmV4dCBsb2FkCi0JCQkgKiBiYWxhbmNpbmcgb3duZXIgd2lsbCBwaWNrIGl0IHVwLgotCQkJICovCi0JCQlpZiAobmVlZF9yZXNjaGVkKCkpCi0JCQkJYnJlYWs7Ci0KLQkJCXJlYmFsYW5jZV9kb21haW5zKGJhbGFuY2VfY3B1LCBDUFVfSURMRSk7Ci0KLQkJCXJxID0gY3B1X3JxKGJhbGFuY2VfY3B1KTsKLQkJCWlmICh0aW1lX2FmdGVyKHRoaXNfcnEtPm5leHRfYmFsYW5jZSwgcnEtPm5leHRfYmFsYW5jZSkpCi0JCQkJdGhpc19ycS0+bmV4dF9iYWxhbmNlID0gcnEtPm5leHRfYmFsYW5jZTsKLQkJfQotCX0KLSNlbmRpZgorCW5vaHpfaWRsZV9iYWxhbmNlKHRoaXNfY3B1LCBpZGxlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgb25fbnVsbF9kb21haW4oaW50IGNwdSkKQEAgLTM0MzksNTcgKzM2ODksMTcgQEAKIAogLyoKICAqIFRyaWdnZXIgdGhlIFNDSEVEX1NPRlRJUlEgaWYgaXQgaXMgdGltZSB0byBkbyBwZXJpb2RpYyBsb2FkIGJhbGFuY2luZy4KLSAqCi0gKiBJbiBjYXNlIG9mIENPTkZJR19OT19IWiwgdGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgd2Ugbm9taW5hdGUgYSBuZXcKLSAqIGlkbGUgbG9hZCBiYWxhbmNpbmcgb3duZXIgb3IgZGVjaWRlIHRvIHN0b3AgdGhlIHBlcmlvZGljIGxvYWQgYmFsYW5jaW5nLAotICogaWYgdGhlIHdob2xlIHN5c3RlbSBpcyBpZGxlLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdHJpZ2dlcl9sb2FkX2JhbGFuY2Uoc3RydWN0IHJxICpycSwgaW50IGNwdSkKIHsKLSNpZmRlZiBDT05GSUdfTk9fSFoKLQkvKgotCSAqIElmIHdlIHdlcmUgaW4gdGhlIG5vaHogbW9kZSByZWNlbnRseSBhbmQgYnVzeSBhdCB0aGUgY3VycmVudAotCSAqIHNjaGVkdWxlciB0aWNrLCB0aGVuIGNoZWNrIGlmIHdlIG5lZWQgdG8gbm9taW5hdGUgbmV3IGlkbGUKLQkgKiBsb2FkIGJhbGFuY2VyLgotCSAqLwotCWlmIChycS0+aW5fbm9oel9yZWNlbnRseSAmJiAhcnEtPmlkbGVfYXRfdGljaykgewotCQlycS0+aW5fbm9oel9yZWNlbnRseSA9IDA7Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IGNwdSkgewotCQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBub2h6LmNwdV9tYXNrKTsKLQkJCWF0b21pY19zZXQoJm5vaHoubG9hZF9iYWxhbmNlciwgLTEpOwotCQl9Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IC0xKSB7Ci0JCQlpbnQgaWxiID0gZmluZF9uZXdfaWxiKGNwdSk7Ci0KLQkJCWlmIChpbGIgPCBucl9jcHVfaWRzKQotCQkJCXJlc2NoZWRfY3B1KGlsYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIElmIHRoaXMgY3B1IGlzIGlkbGUgYW5kIGRvaW5nIGlkbGUgbG9hZCBiYWxhbmNpbmcgZm9yIGFsbCB0aGUKLQkgKiBjcHVzIHdpdGggdGlja3Mgc3RvcHBlZCwgaXMgaXQgdGltZSBmb3IgdGhhdCB0byBzdG9wPwotCSAqLwotCWlmIChycS0+aWRsZV9hdF90aWNrICYmIGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IGNwdSAmJgotCSAgICBjcHVtYXNrX3dlaWdodChub2h6LmNwdV9tYXNrKSA9PSBudW1fb25saW5lX2NwdXMoKSkgewotCQlyZXNjaGVkX2NwdShjcHUpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGlzIGNwdSBpcyBpZGxlIGFuZCB0aGUgaWRsZSBsb2FkIGJhbGFuY2luZyBpcyBkb25lIGJ5Ci0JICogc29tZW9uZSBlbHNlLCB0aGVuIG5vIG5lZWQgcmFpc2UgdGhlIFNDSEVEX1NPRlRJUlEKLQkgKi8KLQlpZiAocnEtPmlkbGVfYXRfdGljayAmJiBhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSAhPSBjcHUgJiYKLQkgICAgY3B1bWFza190ZXN0X2NwdShjcHUsIG5vaHouY3B1X21hc2spKQotCQlyZXR1cm47Ci0jZW5kaWYKIAkvKiBEb24ndCBuZWVkIHRvIHJlYmFsYW5jZSB3aGlsZSBhdHRhY2hlZCB0byBOVUxMIGRvbWFpbiAqLwogCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJxLT5uZXh0X2JhbGFuY2UpICYmCiAJICAgIGxpa2VseSghb25fbnVsbF9kb21haW4oY3B1KSkpCiAJCXJhaXNlX3NvZnRpcnEoU0NIRURfU09GVElSUSk7CisjaWZkZWYgQ09ORklHX05PX0haCisJZWxzZSBpZiAobm9oel9raWNrX25lZWRlZChycSwgY3B1KSAmJiBsaWtlbHkoIW9uX251bGxfZG9tYWluKGNwdSkpKQorCQlub2h6X2JhbGFuY2VyX2tpY2soY3B1KTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBycV9vbmxpbmVfZmFpcihzdHJ1Y3QgcnEgKnJxKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX3J0LmMgYi9rZXJuZWwvc2NoZWRfcnQuYwppbmRleCA4YWZiOTUzLi5kMTBjODBlIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfcnQuYworKysgYi9rZXJuZWwvc2NoZWRfcnQuYwpAQCAtMTY2Myw5ICsxNjYzLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHNvZnQsIGhhcmQ7CiAKLQlpZiAoIXAtPnNpZ25hbCkKLQkJcmV0dXJuOwotCiAJLyogbWF4IG1heSBjaGFuZ2UgYWZ0ZXIgY3VyIHdhcyByZWFkLCB0aGlzIHdpbGwgYmUgZml4ZWQgbmV4dCB0aWNrICovCiAJc29mdCA9IHRhc2tfcmxpbWl0KHAsIFJMSU1JVF9SVFRJTUUpOwogCWhhcmQgPSB0YXNrX3JsaW1pdF9tYXgocCwgUkxJTUlUX1JUVElNRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfc3RhdHMuaCBiL2tlcm5lbC9zY2hlZF9zdGF0cy5oCmluZGV4IDMyZDJiZDQuLjI1YzJmOTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9zdGF0cy5oCisrKyBiL2tlcm5lbC9zY2hlZF9zdGF0cy5oCkBAIC0yOTUsMTMgKzI5NSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWNjb3VudF9ncm91cF91c2VyX3RpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJCSAgIGNwdXRpbWVfdCBjcHV0aW1lKQogewotCXN0cnVjdCB0aHJlYWRfZ3JvdXBfY3B1dGltZXIgKmNwdXRpbWVyOwotCi0JLyogdHNrID09IGN1cnJlbnQsIGVuc3VyZSBpdCBpcyBzYWZlIHRvIHVzZSAtPnNpZ25hbCAqLwotCWlmICh1bmxpa2VseSh0c2stPmV4aXRfc3RhdGUpKQotCQlyZXR1cm47Ci0KLQljcHV0aW1lciA9ICZ0c2stPnNpZ25hbC0+Y3B1dGltZXI7CisJc3RydWN0IHRocmVhZF9ncm91cF9jcHV0aW1lciAqY3B1dGltZXIgPSAmdHNrLT5zaWduYWwtPmNwdXRpbWVyOwogCiAJaWYgKCFjcHV0aW1lci0+cnVubmluZykKIAkJcmV0dXJuOwpAQCAtMzI1LDEzICszMTksNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGFjY291bnRfZ3JvdXBfc3lzdGVtX3RpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJCSAgICAgY3B1dGltZV90IGNwdXRpbWUpCiB7Ci0Jc3RydWN0IHRocmVhZF9ncm91cF9jcHV0aW1lciAqY3B1dGltZXI7Ci0KLQkvKiB0c2sgPT0gY3VycmVudCwgZW5zdXJlIGl0IGlzIHNhZmUgdG8gdXNlIC0+c2lnbmFsICovCi0JaWYgKHVubGlrZWx5KHRzay0+ZXhpdF9zdGF0ZSkpCi0JCXJldHVybjsKLQotCWNwdXRpbWVyID0gJnRzay0+c2lnbmFsLT5jcHV0aW1lcjsKKwlzdHJ1Y3QgdGhyZWFkX2dyb3VwX2NwdXRpbWVyICpjcHV0aW1lciA9ICZ0c2stPnNpZ25hbC0+Y3B1dGltZXI7CiAKIAlpZiAoIWNwdXRpbWVyLT5ydW5uaW5nKQogCQlyZXR1cm47CkBAIC0zNTUsMTYgKzM0Myw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWNjb3VudF9ncm91cF9leGVjX3J1bnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBucykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2dyb3VwX2NwdXRpbWVyICpjcHV0aW1lcjsKLQlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnOwotCi0Jc2lnID0gdHNrLT5zaWduYWw7Ci0JLyogc2VlIF9fZXhpdF9zaWduYWwoKS0+dGFza19ycV91bmxvY2tfd2FpdCgpICovCi0JYmFycmllcigpOwotCWlmICh1bmxpa2VseSghc2lnKSkKLQkJcmV0dXJuOwotCi0JY3B1dGltZXIgPSAmc2lnLT5jcHV0aW1lcjsKKwlzdHJ1Y3QgdGhyZWFkX2dyb3VwX2NwdXRpbWVyICpjcHV0aW1lciA9ICZ0c2stPnNpZ25hbC0+Y3B1dGltZXI7CiAKIAlpZiAoIWNwdXRpbWVyLT5ydW5uaW5nKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOTA2YWU1YTEuLmJkZWQ2NTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTYzNyw3ICs2MzcsNyBAQAogCiAvKgogICogQmFkIHBlcm1pc3Npb25zIGZvciBzZW5kaW5nIHRoZSBzaWduYWwKLSAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIFJDVSByZWFkIGxvY2sKKyAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2sKICAqLwogc3RhdGljIGludCBjaGVja19raWxsX3Blcm1pc3Npb24oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sCiAJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKQEAgLTExMjcsMTEgKzExMjcsMTQgQEAKIAogLyoKICAqIHNlbmQgc2lnbmFsIGluZm8gdG8gYWxsIHRoZSBtZW1iZXJzIG9mIGEgZ3JvdXAKLSAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2sgYXQgbGVhc3QKICAqLwogaW50IGdyb3VwX3NlbmRfc2lnX2luZm8oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlpbnQgcmV0ID0gY2hlY2tfa2lsbF9wZXJtaXNzaW9uKHNpZywgaW5mbywgcCk7CisJaW50IHJldDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXQgPSBjaGVja19raWxsX3Blcm1pc3Npb24oc2lnLCBpbmZvLCBwKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmICghcmV0ICYmIHNpZykKIAkJcmV0ID0gZG9fc2VuZF9zaWdfaW5mbyhzaWcsIGluZm8sIHAsIHRydWUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRsb2NrdXAuYyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDkzZjYuLjAwMDAwMDAKLS0tIGEva2VybmVsL3NvZnRsb2NrdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogRGV0ZWN0IFNvZnQgTG9ja3VwcwotICoKLSAqIHN0YXJ0ZWQgYnkgSW5nbyBNb2xuYXIsIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBSZWQgSGF0LCBJbmMuCi0gKgotICogdGhpcyBjb2RlIGRldGVjdHMgc29mdCBsb2NrdXBzOiBpbmNpZGVudHMgaW4gd2hlcmUgb24gYSBDUFUKLSAqIHRoZSBrZXJuZWwgZG9lcyBub3QgcmVzY2hlZHVsZSBmb3IgMTAgc2Vjb25kcyBvciBtb3JlLgotICovCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9ubWkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotCi0jaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHJpbnRfbG9jayk7Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBzb2Z0bG9ja3VwX3RvdWNoX3RzKTsgLyogdG91Y2ggdGltZXN0YW1wICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgc29mdGxvY2t1cF9wcmludF90cyk7IC8qIHByaW50IHRpbWVzdGFtcCAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBzb2Z0bG9ja3VwX3dhdGNoZG9nKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCBzb2Z0bG9ja190b3VjaF9zeW5jKTsKLQotc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGRpZF9wYW5pYzsKLWludCBfX3JlYWRfbW9zdGx5IHNvZnRsb2NrdXBfdGhyZXNoID0gNjA7Ci0KLS8qCi0gKiBTaG91bGQgd2UgcGFuaWMgKGFuZCByZWJvb3QsIGlmIHBhbmljX3RpbWVvdXQ9IGlzIHNldCkgd2hlbiBhCi0gKiBzb2Z0LWxvY2t1cCBvY2N1cnM6Ci0gKi8KLXVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHNvZnRsb2NrdXBfcGFuaWMgPQotCQkJCUNPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRTsKLQotc3RhdGljIGludCBfX2luaXQgc29mdGxvY2t1cF9wYW5pY19zZXR1cChjaGFyICpzdHIpCi17Ci0Jc29mdGxvY2t1cF9wYW5pYyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMCk7Ci0KLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoInNvZnRsb2NrdXBfcGFuaWM9Iiwgc29mdGxvY2t1cF9wYW5pY19zZXR1cCk7Ci0KLXN0YXRpYyBpbnQKLXNvZnRsb2NrX3BhbmljKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQotewotCWRpZF9wYW5pYyA9IDE7Ci0KLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuaWNfYmxvY2sgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBzb2Z0bG9ja19wYW5pYywKLX07Ci0KLS8qCi0gKiBSZXR1cm5zIHNlY29uZHMsIGFwcHJveGltYXRlbHkuICBXZSBkb24ndCBuZWVkIG5hbm9zZWNvbmQKLSAqIHJlc29sdXRpb24sIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgd2l0aCBhIGJpZyBkaXZpZGUgd2hlbgotICogMl4zMG5zID09IDEuMDc0cy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3RpbWVzdGFtcChpbnQgdGhpc19jcHUpCi17Ci0JcmV0dXJuIGNwdV9jbG9jayh0aGlzX2NwdSkgPj4gMzBMTDsgIC8qIDJeMzAgfj0gMTBeOSAqLwotfQotCi1zdGF0aWMgdm9pZCBfX3RvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKLXsKLQlpbnQgdGhpc19jcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JX19yYXdfZ2V0X2NwdV92YXIoc29mdGxvY2t1cF90b3VjaF90cykgPSBnZXRfdGltZXN0YW1wKHRoaXNfY3B1KTsKLX0KLQotdm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKHZvaWQpCi17Ci0JX19yYXdfZ2V0X2NwdV92YXIoc29mdGxvY2t1cF90b3VjaF90cykgPSAwOwotfQotRVhQT1JUX1NZTUJPTCh0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKTsKLQotdm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nX3N5bmModm9pZCkKLXsKLQlfX3Jhd19nZXRfY3B1X3Zhcihzb2Z0bG9ja190b3VjaF9zeW5jKSA9IHRydWU7Ci0JX19yYXdfZ2V0X2NwdV92YXIoc29mdGxvY2t1cF90b3VjaF90cykgPSAwOwotfQotCi12b2lkIHRvdWNoX2FsbF9zb2Z0bG9ja3VwX3dhdGNoZG9ncyh2b2lkKQotewotCWludCBjcHU7Ci0KLQkvKiBDYXVzZSBlYWNoIENQVSB0byByZS11cGRhdGUgaXRzIHRpbWVzdGFtcCByYXRoZXIgdGhhbiBjb21wbGFpbiAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlwZXJfY3B1KHNvZnRsb2NrdXBfdG91Y2hfdHMsIGNwdSkgPSAwOwotfQotRVhQT1JUX1NZTUJPTCh0b3VjaF9hbGxfc29mdGxvY2t1cF93YXRjaGRvZ3MpOwotCi1pbnQgcHJvY19kb3NvZnRsb2NrdXBfdGhyZXNoKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsCi0JCQkgICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCXRvdWNoX2FsbF9zb2Z0bG9ja3VwX3dhdGNoZG9ncygpOwotCXJldHVybiBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci19Ci0KLS8qCi0gKiBUaGlzIGNhbGxiYWNrIHJ1bnMgZnJvbSB0aGUgdGltZXIgaW50ZXJydXB0LCBhbmQgY2hlY2tzCi0gKiB3aGV0aGVyIHRoZSB3YXRjaGRvZyB0aHJlYWQgaGFzIGh1bmcgb3Igbm90OgotICovCi12b2lkIHNvZnRsb2NrdXBfdGljayh2b2lkKQotewotCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1bnNpZ25lZCBsb25nIHRvdWNoX3RzID0gcGVyX2NwdShzb2Z0bG9ja3VwX3RvdWNoX3RzLCB0aGlzX2NwdSk7Ci0JdW5zaWduZWQgbG9uZyBwcmludF90czsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwotCXVuc2lnbmVkIGxvbmcgbm93OwotCi0JLyogSXMgZGV0ZWN0aW9uIHN3aXRjaGVkIG9mZj8gKi8KLQlpZiAoIXBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgdGhpc19jcHUpIHx8IHNvZnRsb2NrdXBfdGhyZXNoIDw9IDApIHsKLQkJLyogQmUgc3VyZSB3ZSBkb24ndCBmYWxzZSB0cmlnZ2VyIGlmIHN3aXRjaGVkIGJhY2sgb24gKi8KLQkJaWYgKHRvdWNoX3RzKQotCQkJcGVyX2NwdShzb2Z0bG9ja3VwX3RvdWNoX3RzLCB0aGlzX2NwdSkgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHRvdWNoX3RzID09IDApIHsKLQkJaWYgKHVubGlrZWx5KHBlcl9jcHUoc29mdGxvY2tfdG91Y2hfc3luYywgdGhpc19jcHUpKSkgewotCQkJLyoKLQkJCSAqIElmIHRoZSB0aW1lIHN0YW1wIHdhcyB0b3VjaGVkIGF0b21pY2FsbHkKLQkJCSAqIG1ha2Ugc3VyZSB0aGUgc2NoZWR1bGVyIHRpY2sgaXMgdXAgdG8gZGF0ZS4KLQkJCSAqLwotCQkJcGVyX2NwdShzb2Z0bG9ja190b3VjaF9zeW5jLCB0aGlzX2NwdSkgPSBmYWxzZTsKLQkJCXNjaGVkX2Nsb2NrX3RpY2soKTsKLQkJfQotCQlfX3RvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50X3RzID0gcGVyX2NwdShzb2Z0bG9ja3VwX3ByaW50X3RzLCB0aGlzX2NwdSk7Ci0KLQkvKiByZXBvcnQgYXQgbW9zdCBvbmNlIGEgc2Vjb25kICovCi0JaWYgKHByaW50X3RzID09IHRvdWNoX3RzIHx8IGRpZF9wYW5pYykKLQkJcmV0dXJuOwotCi0JLyogZG8gbm90IHByaW50IGR1cmluZyBlYXJseSBib290dXA6ICovCi0JaWYgKHVubGlrZWx5KHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fUlVOTklORykpIHsKLQkJX190b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlub3cgPSBnZXRfdGltZXN0YW1wKHRoaXNfY3B1KTsKLQotCS8qCi0JICogV2FrZSB1cCB0aGUgaGlnaC1wcmlvIHdhdGNoZG9nIHRhc2sgdHdpY2UgcGVyCi0JICogdGhyZXNob2xkIHRpbWVzcGFuLgotCSAqLwotCWlmICh0aW1lX2FmdGVyKG5vdyAtIHNvZnRsb2NrdXBfdGhyZXNoLzIsIHRvdWNoX3RzKSkKLQkJd2FrZV91cF9wcm9jZXNzKHBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgdGhpc19jcHUpKTsKLQotCS8qIFdhcm4gYWJvdXQgdW5yZWFzb25hYmxlIGRlbGF5czogKi8KLQlpZiAodGltZV9iZWZvcmVfZXEobm93IC0gc29mdGxvY2t1cF90aHJlc2gsIHRvdWNoX3RzKSkKLQkJcmV0dXJuOwotCi0JcGVyX2NwdShzb2Z0bG9ja3VwX3ByaW50X3RzLCB0aGlzX2NwdSkgPSB0b3VjaF90czsKLQotCXNwaW5fbG9jaygmcHJpbnRfbG9jayk7Ci0JcHJpbnRrKEtFUk5fRVJSICJCVUc6IHNvZnQgbG9ja3VwIC0gQ1BVIyVkIHN0dWNrIGZvciAlbHVzISBbJXM6JWRdXG4iLAotCQkJdGhpc19jcHUsIG5vdyAtIHRvdWNoX3RzLAotCQkJY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOwotCXByaW50X21vZHVsZXMoKTsKLQlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7Ci0JaWYgKHJlZ3MpCi0JCXNob3dfcmVncyhyZWdzKTsKLQllbHNlCi0JCWR1bXBfc3RhY2soKTsKLQlzcGluX3VubG9jaygmcHJpbnRfbG9jayk7Ci0KLQlpZiAoc29mdGxvY2t1cF9wYW5pYykKLQkJcGFuaWMoInNvZnRsb2NrdXA6IGh1bmcgdGFza3MiKTsKLX0KLQotLyoKLSAqIFRoZSB3YXRjaGRvZyB0aHJlYWQgLSBydW5zIGV2ZXJ5IHNlY29uZCBhbmQgdG91Y2hlcyB0aGUgdGltZXN0YW1wLgotICovCi1zdGF0aWMgaW50IHdhdGNoZG9nKHZvaWQgKl9fYmluZF9jcHUpCi17Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07Ci0KLQlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKLQotCS8qIGluaXRpYWxpemUgdGltZXN0YW1wICovCi0JX190b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCS8qCi0JICogUnVuIGJyaWVmbHkgb25jZSBwZXIgc2Vjb25kIHRvIHJlc2V0IHRoZSBzb2Z0bG9ja3VwIHRpbWVzdGFtcC4KLQkgKiBJZiB0aGlzIGdldHMgZGVsYXllZCBmb3IgbW9yZSB0aGFuIDYwIHNlY29uZHMgdGhlbiB0aGUKLQkgKiBkZWJ1Zy1wcmludG91dCB0cmlnZ2VycyBpbiBzb2Z0bG9ja3VwX3RpY2soKS4KLQkgKi8KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlfX3RvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKLQkJc2NoZWR1bGUoKTsKLQotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7Ci0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQl9Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDcmVhdGUvZGVzdHJveSB3YXRjaGRvZyB0aHJlYWRzIGFzIENQVXMgY29tZSBhbmQgZ286Ci0gKi8KLXN0YXRpYyBpbnQgX19jcHVpbml0Ci1jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCWludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJQlVHX09OKHBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgaG90Y3B1KSk7Ci0JCXAgPSBrdGhyZWFkX2NyZWF0ZSh3YXRjaGRvZywgaGNwdSwgIndhdGNoZG9nLyVkIiwgaG90Y3B1KTsKLQkJaWYgKElTX0VSUihwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ3YXRjaGRvZyBmb3IgJWkgZmFpbGVkXG4iLCBob3RjcHUpOwotCQkJcmV0dXJuIE5PVElGWV9CQUQ7Ci0JCX0KLQkJcGVyX2NwdShzb2Z0bG9ja3VwX3RvdWNoX3RzLCBob3RjcHUpID0gMDsKLQkJcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpID0gcDsKLQkJa3RocmVhZF9iaW5kKHAsIGhvdGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQl3YWtlX3VwX3Byb2Nlc3MocGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpKTsKLQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCQlpZiAoIXBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgaG90Y3B1KSkKLQkJCWJyZWFrOwotCQkvKiBVbmJpbmQgc28gaXQgY2FuIHJ1bi4gIEZhbGwgdGhydS4gKi8KLQkJa3RocmVhZF9iaW5kKHBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgaG90Y3B1KSwKLQkJCSAgICAgY3B1bWFza19hbnkoY3B1X29ubGluZV9tYXNrKSk7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJcCA9IHBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgaG90Y3B1KTsKLQkJcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpID0gTlVMTDsKLQkJa3RocmVhZF9zdG9wKHApOwotCQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIGNwdV9uZmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBjcHVfY2FsbGJhY2sKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBub3NvZnRsb2NrdXA7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5vc29mdGxvY2t1cF9zZXR1cChjaGFyICpzdHIpCi17Ci0Jbm9zb2Z0bG9ja3VwID0gMTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoIm5vc29mdGxvY2t1cCIsIG5vc29mdGxvY2t1cF9zZXR1cCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNwYXduX3NvZnRsb2NrdXBfdGFzayh2b2lkKQotewotCXZvaWQgKmNwdSA9ICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBlcnI7Ci0KLQlpZiAobm9zb2Z0bG9ja3VwKQotCQlyZXR1cm4gMDsKLQotCWVyciA9IGNwdV9jYWxsYmFjaygmY3B1X25mYiwgQ1BVX1VQX1BSRVBBUkUsIGNwdSk7Ci0JaWYgKGVyciA9PSBOT1RJRllfQkFEKSB7Ci0JCUJVRygpOwotCQlyZXR1cm4gMTsKLQl9Ci0JY3B1X2NhbGxiYWNrKCZjcHVfbmZiLCBDUFVfT05MSU5FLCBjcHUpOwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1X25mYik7Ci0KLQlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLWVhcmx5X2luaXRjYWxsKHNwYXduX3NvZnRsb2NrdXBfdGFzayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZDI0Zjc2MS4uOWFjZmNlMCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtNzYsNiArNzYsMTAgQEAKICNpbmNsdWRlIDxzY3NpL3NnLmg+CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19MT0NLVVBfREVURUNUT1IKKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNlbmRpZgorCiAKICNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpCiAKQEAgLTEwNiw3ICsxMTAsNyBAQAogI2VuZGlmCiAKIC8qIENvbnN0YW50cyB1c2VkIGZvciBtaW5pbXVtIGFuZCAgbWF4aW11bSAqLwotI2lmZGVmIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUAorI2lmZGVmIENPTkZJR19MT0NLVVBfREVURUNUT1IKIHN0YXRpYyBpbnQgc2l4dHkgPSA2MDsKIHN0YXRpYyBpbnQgbmVnX29uZSA9IC0xOwogI2VuZGlmCkBAIC01NjIsNyArNTY2LDcgQEAKIAkJLmV4dHJhMgkJPSAmb25lLAogCX0sCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKSAmJiBkZWZpbmVkKENPTkZJR19ORVQpCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKIAl7CiAJCS5wcm9jbmFtZQk9ICJob3RwbHVnIiwKIAkJLmRhdGEJCT0gJnVldmVudF9oZWxwZXIsCkBAIC03MTAsNyArNzE0LDM0IEBACiAJCS5tb2RlCQk9IDA0NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4NikKKyNpZiBkZWZpbmVkKENPTkZJR19MT0NLVVBfREVURUNUT1IpCisJeworCQkucHJvY25hbWUgICAgICAgPSAid2F0Y2hkb2ciLAorCQkuZGF0YSAgICAgICAgICAgPSAmd2F0Y2hkb2dfZW5hYmxlZCwKKwkJLm1heGxlbiAgICAgICAgID0gc2l6ZW9mIChpbnQpLAorCQkubW9kZSAgICAgICAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyICAgPSBwcm9jX2Rvd2F0Y2hkb2dfZW5hYmxlZCwKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gIndhdGNoZG9nX3RocmVzaCIsCisJCS5kYXRhCQk9ICZzb2Z0bG9ja3VwX3RocmVzaCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG93YXRjaGRvZ190aHJlc2gsCisJCS5leHRyYTEJCT0gJm5lZ19vbmUsCisJCS5leHRyYTIJCT0gJnNpeHR5LAorCX0sCisJeworCQkucHJvY25hbWUJPSAic29mdGxvY2t1cF9wYW5pYyIsCisJCS5kYXRhCQk9ICZzb2Z0bG9ja3VwX3BhbmljLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gJnplcm8sCisJCS5leHRyYTIJCT0gJm9uZSwKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4NikgJiYgIWRlZmluZWQoQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUikKIAl7CiAJCS5wcm9jbmFtZSAgICAgICA9ICJ1bmtub3duX25taV9wYW5pYyIsCiAJCS5kYXRhICAgICAgICAgICA9ICZ1bmtub3duX25taV9wYW5pYywKQEAgLTgxMywyNiArODQ0LDYgQEAKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUAotCXsKLQkJLnByb2NuYW1lCT0gInNvZnRsb2NrdXBfcGFuaWMiLAotCQkuZGF0YQkJPSAmc29mdGxvY2t1cF9wYW5pYywKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuZXh0cmExCQk9ICZ6ZXJvLAotCQkuZXh0cmEyCQk9ICZvbmUsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJzb2Z0bG9ja3VwX3RocmVzaCIsCi0JCS5kYXRhCQk9ICZzb2Z0bG9ja3VwX3RocmVzaCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9zb2Z0bG9ja3VwX3RocmVzaCwKLQkJLmV4dHJhMQkJPSAmbmVnX29uZSwKLQkJLmV4dHJhMgkJPSAmc2l4dHksCi0JfSwKLSNlbmRpZgogI2lmZGVmIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLCiAJewogCQkucHJvY25hbWUJPSAiaHVuZ190YXNrX3BhbmljIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCmluZGV4IGIzYmFmZDUuLjQ4YjI3NjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJLyoKIAkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCiAJICogcGVyaW9kaWMgbW9kZS4gV2UgcmVhZCBkZXYtPm5leHRfZXZlbnQgZmlyc3QgYW5kIGFkZCB0byBpdAotCSAqIHdoZW4gdGhlIGV2ZW50IGFscmFkeSBleHBpcmVkLiBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KCkKKwkgKiB3aGVuIHRoZSBldmVudCBhbHJlYWR5IGV4cGlyZWQuIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoKQogCSAqIHNldHMgZGV2LT5uZXh0X2V2ZW50IG9ubHkgd2hlbiB0aGUgZXZlbnQgaXMgcmVhbGx5CiAJICogcHJvZ3JhbW1lZCB0byB0aGUgZGV2aWNlLgogCSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IDgxMzk5M2IuLjNlMjE2ZTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTMyNSw3ICszMjUsNyBAQAogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCiAJaWYgKHJjdV9uZWVkc19jcHUoY3B1KSB8fCBwcmludGtfbmVlZHNfY3B1KGNwdSkgfHwKLQkgICAgYXJjaF9uZWVkc19jcHUoY3B1KSB8fCBub2h6X3JhdGVsaW1pdChjcHUpKSB7CisJICAgIGFyY2hfbmVlZHNfY3B1KGNwdSkpIHsKIAkJbmV4dF9qaWZmaWVzID0gbGFzdF9qaWZmaWVzICsgMTsKIAkJZGVsdGFfamlmZmllcyA9IDE7CiAJfSBlbHNlIHsKQEAgLTQwNSwxMyArNDA1LDcgQEAKIAkJICogdGhlIHNjaGVkdWxlciB0aWNrIGluIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrLgogCQkgKi8KIAkJaWYgKCF0cy0+dGlja19zdG9wcGVkKSB7Ci0JCQlpZiAoc2VsZWN0X25vaHpfbG9hZF9iYWxhbmNlcigxKSkgewotCQkJCS8qCi0JCQkJICogc2NoZWQgdGljayBub3Qgc3RvcHBlZCEKLQkJCQkgKi8KLQkJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5vaHpfY3B1X21hc2spOwotCQkJCWdvdG8gb3V0OwotCQkJfQorCQkJc2VsZWN0X25vaHpfbG9hZF9iYWxhbmNlcigxKTsKIAogCQkJdHMtPmlkbGVfdGljayA9IGhydGltZXJfZ2V0X2V4cGlyZXMoJnRzLT5zY2hlZF90aW1lcik7CiAJCQl0cy0+dGlja19zdG9wcGVkID0gMTsKQEAgLTc4MCw3ICs3NzQsNiBAQAogewogCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKIAlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOwotCXU2NCBvZmZzZXQ7CiAKIAkvKgogCSAqIEVtdWxhdGUgdGljayBwcm9jZXNzaW5nIHZpYSBwZXItQ1BVIGhydGltZXJzOgpAQCAtNzkwLDEwICs3ODMsNiBAQAogCiAJLyogR2V0IHRoZSBuZXh0IHBlcmlvZCAocGVyIGNwdSkgKi8KIAlocnRpbWVyX3NldF9leHBpcmVzKCZ0cy0+c2NoZWRfdGltZXIsIHRpY2tfaW5pdF9qaWZmeV91cGRhdGUoKSk7Ci0Jb2Zmc2V0ID0ga3RpbWVfdG9fbnModGlja19wZXJpb2QpID4+IDE7Ci0JZG9fZGl2KG9mZnNldCwgbnVtX3Bvc3NpYmxlX2NwdXMoKSk7Ci0Jb2Zmc2V0ICo9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlocnRpbWVyX2FkZF9leHBpcmVzX25zKCZ0cy0+c2NoZWRfdGltZXIsIG9mZnNldCk7CiAKIAlmb3IgKDs7KSB7CiAJCWhydGltZXJfZm9yd2FyZCgmdHMtPnNjaGVkX3RpbWVyLCBub3csIHRpY2tfcGVyaW9kKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggZWUzMDVjOC4uZjFiOGFmZSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTkwLDggKzkwLDEzIEBACiAKIC8qCiAgKiBOb3RlIHRoYXQgYWxsIHR2ZWNfYmFzZXMgYXJlIDIgYnl0ZSBhbGlnbmVkIGFuZCBsb3dlciBiaXQgb2YKLSAqIGJhc2UgaW4gdGltZXJfbGlzdCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8uIFVzZSB0aGUgTFNCIGZvcgotICogdGhlIG5ldyBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRpbWVyIGlzIGRlZmVycmFibGUKKyAqIGJhc2UgaW4gdGltZXJfbGlzdCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8uIFVzZSB0aGUgTFNCIHRvCisgKiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0aW1lciBpcyBkZWZlcnJhYmxlLgorICoKKyAqIEEgZGVmZXJyYWJsZSB0aW1lciB3aWxsIHdvcmsgbm9ybWFsbHkgd2hlbiB0aGUgc3lzdGVtIGlzIGJ1c3ksIGJ1dAorICogd2lsbCBub3QgY2F1c2UgYSBDUFUgdG8gY29tZSBvdXQgb2YgaWRsZSBqdXN0IHRvIHNlcnZpY2UgaXQ7IGluc3RlYWQsCisgKiB0aGUgdGltZXIgd2lsbCBiZSBzZXJ2aWNlZCB3aGVuIHRoZSBDUFUgZXZlbnR1YWxseSB3YWtlcyB1cCB3aXRoIGEKKyAqIHN1YnNlcXVlbnQgbm9uLWRlZmVycmFibGUgdGltZXIuCiAgKi8KICNkZWZpbmUgVEJBU0VfREVGRVJSQUJMRV9GTEFHCQkoMHgxKQogCkBAIC01NzcsNiArNTgyLDE5IEBACiAJbG9ja2RlcF9pbml0X21hcCgmdGltZXItPmxvY2tkZXBfbWFwLCBuYW1lLCBrZXksIDApOwogfQogCit2b2lkIHNldHVwX2RlZmVycmFibGVfdGltZXJfb25fc3RhY2tfa2V5KHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSwKKwkJCQkJIHZvaWQgKCpmdW5jdGlvbikodW5zaWduZWQgbG9uZyksCisJCQkJCSB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247CisJdGltZXItPmRhdGEgPSBkYXRhOworCWluaXRfdGltZXJfb25fc3RhY2tfa2V5KHRpbWVyLCBuYW1lLCBrZXkpOworCXRpbWVyX3NldF9kZWZlcnJhYmxlKHRpbWVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNldHVwX2RlZmVycmFibGVfdGltZXJfb25fc3RhY2tfa2V5KTsKKwogLyoqCiAgKiBpbml0X3RpbWVyX2tleSAtIGluaXRpYWxpemUgYSB0aW1lcgogICogQHRpbWVyOiB0aGUgdGltZXIgdG8gYmUgaW5pdGlhbGl6ZWQKQEAgLTY3OSwxMiArNjk3LDggQEAKIAljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19OT19IWikgJiYgZGVmaW5lZChDT05GSUdfU01QKQotCWlmICghcGlubmVkICYmIGdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgJiYgaWRsZV9jcHUoY3B1KSkgewotCQlpbnQgcHJlZmVycmVkX2NwdSA9IGdldF9ub2h6X2xvYWRfYmFsYW5jZXIoKTsKLQotCQlpZiAocHJlZmVycmVkX2NwdSA+PSAwKQotCQkJY3B1ID0gcHJlZmVycmVkX2NwdTsKLQl9CisJaWYgKCFwaW5uZWQgJiYgZ2V0X3N5c2N0bF90aW1lcl9taWdyYXRpb24oKSAmJiBpZGxlX2NwdShjcHUpKQorCQljcHUgPSBnZXRfbm9oel90aW1lcl90YXJnZXQoKTsKICNlbmRpZgogCW5ld19iYXNlID0gcGVyX2NwdSh0dmVjX2Jhc2VzLCBjcHUpOwogCkBAIC0xMjg5LDcgKzEzMDMsNiBAQAogewogCWhydGltZXJfcnVuX3F1ZXVlcygpOwogCXJhaXNlX3NvZnRpcnEoVElNRVJfU09GVElSUSk7Ci0Jc29mdGxvY2t1cF90aWNrKCk7CiB9CiAKIC8qCkBAIC0xNzUwLDMgKzE3NjMsMjUgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChtc2xlZXBfaW50ZXJydXB0aWJsZSk7CisKK3N0YXRpYyBpbnQgX19zY2hlZCBkb191c2xlZXBfcmFuZ2UodW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4KQoreworCWt0aW1lX3Qga21pbjsKKwl1bnNpZ25lZCBsb25nIGRlbHRhOworCisJa21pbiA9IGt0aW1lX3NldCgwLCBtaW4gKiBOU0VDX1BFUl9VU0VDKTsKKwlkZWx0YSA9IChtYXggLSBtaW4pICogTlNFQ19QRVJfVVNFQzsKKwlyZXR1cm4gc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlKCZrbWluLCBkZWx0YSwgSFJUSU1FUl9NT0RFX1JFTCk7Cit9CisKKy8qKgorICogdXNsZWVwX3JhbmdlIC0gRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgdWRlbGF5IHdoZXJlIHdha2V1cCBpcyBmbGV4aWJsZQorICogQG1pbjogTWluaW11bSB0aW1lIGluIHVzZWNzIHRvIHNsZWVwCisgKiBAbWF4OiBNYXhpbXVtIHRpbWUgaW4gdXNlY3MgdG8gc2xlZXAKKyAqLwordm9pZCB1c2xlZXBfcmFuZ2UodW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4KQoreworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCWRvX3VzbGVlcF9yYW5nZShtaW4sIG1heCk7Cit9CitFWFBPUlRfU1lNQk9MKHVzbGVlcF9yYW5nZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvS2NvbmZpZyBiL2tlcm5lbC90cmFjZS9LY29uZmlnCmluZGV4IDc1MzFkZGEuLjZlYjk3YmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9LY29uZmlnCisrKyBiL2tlcm5lbC90cmFjZS9LY29uZmlnCkBAIC0xOTQsMTUgKzE5NCw2IEBACiAJICBlbmFibGVkLiBUaGlzIG9wdGlvbiBhbmQgdGhlIGlycXMtb2ZmIHRpbWluZyBvcHRpb24gY2FuIGJlCiAJICB1c2VkIHRvZ2V0aGVyIG9yIHNlcGFyYXRlbHkuKQogCi1jb25maWcgU1lTUFJPRl9UUkFDRVIKLQlib29sICJTeXNwcm9mIFRyYWNlciIKLQlkZXBlbmRzIG9uIFg4NgotCXNlbGVjdCBHRU5FUklDX1RSQUNFUgotCXNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVIKLQloZWxwCi0JICBUaGlzIHRyYWNlciBwcm92aWRlcyB0aGUgdHJhY2UgbmVlZGVkIGJ5IHRoZSAnU3lzcHJvZicgdXNlcnNwYWNlCi0JICB0b29sLgotCiBjb25maWcgU0NIRURfVFJBQ0VSCiAJYm9vbCAiU2NoZWR1bGluZyBMYXRlbmN5IFRyYWNlciIKIAlzZWxlY3QgR0VORVJJQ19UUkFDRVIKQEAgLTIyOSwyMyArMjIwLDYgQEAKIAloZWxwCiAJICBCYXNpYyB0cmFjZXIgdG8gY2F0Y2ggdGhlIHN5c2NhbGwgZW50cnkgYW5kIGV4aXQgZXZlbnRzLgogCi1jb25maWcgQk9PVF9UUkFDRVIKLQlib29sICJUcmFjZSBib290IGluaXRjYWxscyIKLQlzZWxlY3QgR0VORVJJQ19UUkFDRVIKLQlzZWxlY3QgQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSCi0JaGVscAotCSAgVGhpcyB0cmFjZXIgaGVscHMgZGV2ZWxvcGVycyB0byBvcHRpbWl6ZSBib290IHRpbWVzOiBpdCByZWNvcmRzCi0JICB0aGUgdGltaW5ncyBvZiB0aGUgaW5pdGNhbGxzIGFuZCB0cmFjZXMga2V5IGV2ZW50cyBhbmQgdGhlIGlkZW50aXR5Ci0JICBvZiB0YXNrcyB0aGF0IGNhbiBjYXVzZSBib290IGRlbGF5cywgc3VjaCBhcyBjb250ZXh0LXN3aXRjaGVzLgotCi0JICBJdHMgYWltIGlzIHRvIGJlIHBhcnNlZCBieSB0aGUgc2NyaXB0cy9ib290Z3JhcGgucGwgdG9vbCB0bwotCSAgcHJvZHVjZSBwcmV0dHkgZ3JhcGhpY3MgYWJvdXQgYm9vdCBpbmVmZmljaWVuY2llcywgZ2l2aW5nIGEgdmlzdWFsCi0JICByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVsYXlzIGR1cmluZyBpbml0Y2FsbHMgLSBidXQgdGhlIHJhdwotCSAgL2RlYnVnL3RyYWNpbmcvdHJhY2UgdGV4dCBvdXRwdXQgaXMgcmVhZGFibGUgdG9vLgotCi0JICBZb3UgbXVzdCBwYXNzIGluIGluaXRjYWxsX2RlYnVnIGFuZCBmdHJhY2U9aW5pdGNhbGwgdG8gdGhlIGtlcm5lbAotCSAgY29tbWFuZCBsaW5lIHRvIGVuYWJsZSB0aGlzIG9uIGJvb3R1cC4KLQogY29uZmlnIFRSQUNFX0JSQU5DSF9QUk9GSUxJTkcKIAlib29sCiAJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCkBAIC0zMjUsMjggKzI5OSw2IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotY29uZmlnIEtTWU1fVFJBQ0VSCi0JYm9vbCAiVHJhY2UgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIG9uIGtlcm5lbCBtZW1vcnkgbG9jYXRpb25zIgotCWRlcGVuZHMgb24gSEFWRV9IV19CUkVBS1BPSU5UCi0Jc2VsZWN0IFRSQUNJTkcKLQloZWxwCi0JICBUaGlzIHRyYWNlciBoZWxwcyBmaW5kIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMgb24gYW55IGdpdmVuIGtlcm5lbAotCSAgc3ltYm9sIGkuZS4gL3Byb2Mva2FsbHN5bXMuCi0KLWNvbmZpZyBQUk9GSUxFX0tTWU1fVFJBQ0VSCi0JYm9vbCAiUHJvZmlsZSBhbGwga2VybmVsIG1lbW9yeSBhY2Nlc3NlcyBvbiAnd2F0Y2hlZCcgdmFyaWFibGVzIgotCWRlcGVuZHMgb24gS1NZTV9UUkFDRVIKLQloZWxwCi0JICBUaGlzIHRyYWNlciBwcm9maWxlcyBrZXJuZWwgYWNjZXNzZXMgb24gdmFyaWFibGVzIHdhdGNoZWQgdGhyb3VnaCB0aGUKLQkgIGtzeW0gdHJhY2VyIGZ0cmFjZSBwbHVnaW4uIERlcGVuZGluZyB1cG9uIHRoZSBoYXJkd2FyZSwgYWxsIHJlYWQKLQkgIGFuZCB3cml0ZSBvcGVyYXRpb25zIG9uIGtlcm5lbCB2YXJpYWJsZXMgY2FuIGJlIG1vbml0b3JlZCBmb3IKLQkgIGFjY2Vzc2VzLgotCi0JICBUaGUgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCBpbjoKLQkgIC9kZWJ1Z2ZzL3RyYWNpbmcvcHJvZmlsZV9rc3ltCi0KLQkgIFNheSBOIGlmIHVuc3VyZS4KLQogY29uZmlnIFNUQUNLX1RSQUNFUgogCWJvb2wgIlRyYWNlIG1heCBzdGFjayIKIAlkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fVFJBQ0VSCkBAIC0zNzEsMjYgKzMyMyw2IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotY29uZmlnIEtNRU1UUkFDRQotCWJvb2wgIlRyYWNlIFNMQUIgYWxsb2NhdGlvbnMiCi0Jc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCi0JaGVscAotCSAga21lbXRyYWNlIHByb3ZpZGVzIHRyYWNpbmcgZm9yIHNsYWIgYWxsb2NhdG9yIGZ1bmN0aW9ucywgc3VjaCBhcwotCSAga21hbGxvYywga2ZyZWUsIGttZW1fY2FjaGVfYWxsb2MsIGttZW1fY2FjaGVfZnJlZSwgZXRjLiBDb2xsZWN0ZWQKLQkgIGRhdGEgaXMgdGhlbiBmZWQgdG8gdGhlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBpbiBvcmRlciB0byBhbmFseXNlCi0JICBhbGxvY2F0aW9uIGhvdHNwb3RzLCBpbnRlcm5hbCBmcmFnbWVudGF0aW9uIGFuZCBzbyBvbiwgbWFraW5nIGl0Ci0JICBwb3NzaWJsZSB0byBzZWUgaG93IHdlbGwgYW4gYWxsb2NhdG9yIHBlcmZvcm1zLCBhcyB3ZWxsIGFzIGRlYnVnCi0JICBhbmQgcHJvZmlsZSBrZXJuZWwgY29kZS4KLQotCSAgVGhpcyByZXF1aXJlcyBhbiB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gdXNlLiBTZWUKLQkgIERvY3VtZW50YXRpb24vdHJhY2Uva21lbXRyYWNlLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCSAgU2F5aW5nIFkgd2lsbCBtYWtlIHRoZSBrZXJuZWwgc29tZXdoYXQgbGFyZ2VyIGFuZCBzbG93ZXIuIEhvd2V2ZXIsCi0JICBpZiB5b3UgZGlzYWJsZSBrbWVtdHJhY2UgYXQgcnVuLXRpbWUgb3IgYm9vdC10aW1lLCB0aGUgcGVyZm9ybWFuY2UKLQkgIGltcGFjdCBpcyBtaW5pbWFsIChkZXBlbmRpbmcgb24gdGhlIGFyY2ggdGhlIGtlcm5lbCBpcyBidWlsdCBmb3IpLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgV09SS1FVRVVFX1RSQUNFUgogCWJvb2wgIlRyYWNlIHdvcmtxdWV1ZXMiCiAJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvTWFrZWZpbGUgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKaW5kZXggZmZiMWE1Yi4uNTNmMzM4MSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL01ha2VmaWxlCisrKyBiL2tlcm5lbC90cmFjZS9NYWtlZmlsZQpAQCAtMzAsNyArMzAsNiBAQAogb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlX3N0YXQubwogb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlX3ByaW50ay5vCiBvYmotJChDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSKSArPSB0cmFjZV9zY2hlZF9zd2l0Y2gubwotb2JqLSQoQ09ORklHX1NZU1BST0ZfVFJBQ0VSKSArPSB0cmFjZV9zeXNwcm9mLm8KIG9iai0kKENPTkZJR19GVU5DVElPTl9UUkFDRVIpICs9IHRyYWNlX2Z1bmN0aW9ucy5vCiBvYmotJChDT05GSUdfSVJRU09GRl9UUkFDRVIpICs9IHRyYWNlX2lycXNvZmYubwogb2JqLSQoQ09ORklHX1BSRUVNUFRfVFJBQ0VSKSArPSB0cmFjZV9pcnFzb2ZmLm8KQEAgLTM4LDEwICszNyw4IEBACiBvYmotJChDT05GSUdfTk9QX1RSQUNFUikgKz0gdHJhY2Vfbm9wLm8KIG9iai0kKENPTkZJR19TVEFDS19UUkFDRVIpICs9IHRyYWNlX3N0YWNrLm8KIG9iai0kKENPTkZJR19NTUlPVFJBQ0UpICs9IHRyYWNlX21taW90cmFjZS5vCi1vYmotJChDT05GSUdfQk9PVF9UUkFDRVIpICs9IHRyYWNlX2Jvb3Qubwogb2JqLSQoQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUikgKz0gdHJhY2VfZnVuY3Rpb25zX2dyYXBoLm8KIG9iai0kKENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HKSArPSB0cmFjZV9icmFuY2gubwotb2JqLSQoQ09ORklHX0tNRU1UUkFDRSkgKz0ga21lbXRyYWNlLm8KIG9iai0kKENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSKSArPSB0cmFjZV93b3JrcXVldWUubwogb2JqLSQoQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UpICs9IGJsa3RyYWNlLm8KIGlmZXEgKCQoQ09ORklHX0JMT0NLKSx5KQpAQCAtNTUsNyArNTIsOSBAQAogZW5kaWYKIG9iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSB0cmFjZV9ldmVudHNfZmlsdGVyLm8KIG9iai0kKENPTkZJR19LUFJPQkVfRVZFTlQpICs9IHRyYWNlX2twcm9iZS5vCi1vYmotJChDT05GSUdfS1NZTV9UUkFDRVIpICs9IHRyYWNlX2tzeW0ubwogb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNJTkcpICs9IHBvd2VyLXRyYWNlcy5vCitpZmVxICgkKENPTkZJR19UUkFDSU5HKSx5KQorb2JqLSQoQ09ORklHX0tHREJfS0RCKSArPSB0cmFjZV9rZGIubworZW5kaWYKIAogbGliZnRyYWNlLXkgOj0gZnRyYWNlLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCA2ZDJjYjE0Li4wZDg4Y2U5IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC0xODgzLDcgKzE4ODMsNiBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpoaGQ7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJdW5zaWduZWQgbG9uZyBrZXk7Ci0JaW50IHJlc2NoZWQ7CiAKIAlrZXkgPSBoYXNoX2xvbmcoaXAsIEZUUkFDRV9IQVNIX0JJVFMpOwogCkBAIC0xODk3LDEyICsxODk2LDEyIEBACiAJICogcGVyaW9kLiBUaGlzIHN5bmNzIHRoZSBoYXNoIGl0ZXJhdGlvbiBhbmQgZnJlZWluZyBvZiBpdGVtcwogCSAqIG9uIHRoZSBoYXNoLiByY3VfcmVhZF9sb2NrIGlzIHRvbyBkYW5nZXJvdXMgaGVyZS4KIAkgKi8KLQlyZXNjaGVkID0gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSgpOworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVudHJ5LCBuLCBoaGQsIG5vZGUpIHsKIAkJaWYgKGVudHJ5LT5pcCA9PSBpcCkKIAkJCWVudHJ5LT5vcHMtPmZ1bmMoaXAsIHBhcmVudF9pcCwgJmVudHJ5LT5kYXRhKTsKIAl9Ci0JZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRyYWNlX3Byb2JlX29wcyBfX3JlYWRfbW9zdGx5ID0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9rbWVtdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9rbWVtdHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmYzFiYi4uMDAwMDAwMAotLS0gYS9rZXJuZWwvdHJhY2Uva21lbXRyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLyoKLSAqIE1lbW9yeSBhbGxvY2F0b3IgdHJhY2luZwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBFZHVhcmQgLSBHYWJyaWVsIE11bnRlYW51Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPgotICogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWRlcmljIFdlaXNiZWNrZXIgPGZ3ZWlzYmVjQGdtYWlsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rbWVtdHJhY2UuaD4KLQotI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgotI2luY2x1ZGUgInRyYWNlLmgiCi0KLS8qIFNlbGVjdCBhbiBhbHRlcm5hdGl2ZSwgbWluaW1hbGlzdGljIG91dHB1dCB0aGFuIHRoZSBvcmlnaW5hbCBvbmUgKi8KLSNkZWZpbmUgVFJBQ0VfS01FTV9PUFRfTUlOSU1BTAkweDEKLQotc3RhdGljIHN0cnVjdCB0cmFjZXJfb3B0IGttZW1fb3B0c1tdID0gewotCS8qIERlZmF1bHQgZGlzYWJsZSB0aGUgbWluaW1hbGlzdGljIG91dHB1dCAqLwotCXsgVFJBQ0VSX09QVChrbWVtX21pbmltYWxpc3RpYywgVFJBQ0VfS01FTV9PUFRfTUlOSU1BTCkgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJhY2VyX2ZsYWdzIGttZW1fdHJhY2VyX2ZsYWdzID0gewotCS52YWwJCQk9IDAsCi0JLm9wdHMJCQk9IGttZW1fb3B0cwotfTsKLQotc3RhdGljIHN0cnVjdCB0cmFjZV9hcnJheSAqa21lbXRyYWNlX2FycmF5OwotCi0vKiBUcmFjZSBhbGxvY2F0aW9ucyAqLwotc3RhdGljIGlubGluZSB2b2lkIGttZW10cmFjZV9hbGxvYyhlbnVtIGttZW10cmFjZV90eXBlX2lkIHR5cGVfaWQsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCQkJICAgY29uc3Qgdm9pZCAqcHRyLAotCQkJCSAgIHNpemVfdCBieXRlc19yZXEsCi0JCQkJICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkJCSAgIGdmcF90IGdmcF9mbGFncywKLQkJCQkgICBpbnQgbm9kZSkKLXsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfa21lbV9hbGxvYzsKLQlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0ga21lbXRyYWNlX2FycmF5OwotCXN0cnVjdCBrbWVtdHJhY2VfYWxsb2NfZW50cnkgKmVudHJ5OwotCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7Ci0KLQlldmVudCA9IHJpbmdfYnVmZmVyX2xvY2tfcmVzZXJ2ZSh0ci0+YnVmZmVyLCBzaXplb2YoKmVudHJ5KSk7Ci0JaWYgKCFldmVudCkKLQkJcmV0dXJuOwotCi0JZW50cnkgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKLQl0cmFjaW5nX2dlbmVyaWNfZW50cnlfdXBkYXRlKCZlbnRyeS0+ZW50LCAwLCAwKTsKLQotCWVudHJ5LT5lbnQudHlwZQkJPSBUUkFDRV9LTUVNX0FMTE9DOwotCWVudHJ5LT50eXBlX2lkCQk9IHR5cGVfaWQ7Ci0JZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKLQllbnRyeS0+cHRyCQk9IHB0cjsKLQllbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOwotCWVudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOwotCWVudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7Ci0JZW50cnktPm5vZGUJCT0gbm9kZTsKLQotCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKLQkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7Ci0KLQl0cmFjZV93YWtlX3VwKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrbWVtdHJhY2VfZnJlZShlbnVtIGttZW10cmFjZV90eXBlX2lkIHR5cGVfaWQsCi0JCQkJICB1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKLQkJCQkgIGNvbnN0IHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfa21lbV9mcmVlOwotCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBrbWVtdHJhY2VfYXJyYXk7Ci0Jc3RydWN0IGttZW10cmFjZV9mcmVlX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCi0JZXZlbnQgPSByaW5nX2J1ZmZlcl9sb2NrX3Jlc2VydmUodHItPmJ1ZmZlciwgc2l6ZW9mKCplbnRyeSkpOwotCWlmICghZXZlbnQpCi0JCXJldHVybjsKLQllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwotCXRyYWNpbmdfZ2VuZXJpY19lbnRyeV91cGRhdGUoJmVudHJ5LT5lbnQsIDAsIDApOwotCi0JZW50cnktPmVudC50eXBlCQk9IFRSQUNFX0tNRU1fRlJFRTsKLQllbnRyeS0+dHlwZV9pZAkJPSB0eXBlX2lkOwotCWVudHJ5LT5jYWxsX3NpdGUJPSBjYWxsX3NpdGU7Ci0JZW50cnktPnB0cgkJPSBwdHI7Ci0KLQlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCi0JCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwotCi0JdHJhY2Vfd2FrZV91cCgpOwotfQotCi1zdGF0aWMgdm9pZCBrbWVtdHJhY2Vfa21hbGxvYyh2b2lkICppZ25vcmUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKLQkJCSAgICAgIGNvbnN0IHZvaWQgKnB0ciwKLQkJCSAgICAgIHNpemVfdCBieXRlc19yZXEsCi0JCQkgICAgICBzaXplX3QgYnl0ZXNfYWxsb2MsCi0JCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpCi17Ci0Ja21lbXRyYWNlX2FsbG9jKEtNRU1UUkFDRV9UWVBFX0tNQUxMT0MsIGNhbGxfc2l0ZSwgcHRyLAotCQkJYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzLCAtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGttZW10cmFjZV9rbWVtX2NhY2hlX2FsbG9jKHZvaWQgKmlnbm9yZSwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCQkJICAgICAgIGNvbnN0IHZvaWQgKnB0ciwKLQkJCQkgICAgICAgc2l6ZV90IGJ5dGVzX3JlcSwKLQkJCQkgICAgICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkJCSAgICAgICBnZnBfdCBnZnBfZmxhZ3MpCi17Ci0Ja21lbXRyYWNlX2FsbG9jKEtNRU1UUkFDRV9UWVBFX0NBQ0hFLCBjYWxsX3NpdGUsIHB0ciwKLQkJCWJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncywgLTEpOwotfQotCi1zdGF0aWMgdm9pZCBrbWVtdHJhY2Vfa21hbGxvY19ub2RlKHZvaWQgKmlnbm9yZSwKLQkJCQkgICB1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKLQkJCQkgICBjb25zdCB2b2lkICpwdHIsCi0JCQkJICAgc2l6ZV90IGJ5dGVzX3JlcSwKLQkJCQkgICBzaXplX3QgYnl0ZXNfYWxsb2MsCi0JCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzLAotCQkJCSAgIGludCBub2RlKQotewotCWttZW10cmFjZV9hbGxvYyhLTUVNVFJBQ0VfVFlQRV9LTUFMTE9DLCBjYWxsX3NpdGUsIHB0ciwKLQkJCWJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncywgbm9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGttZW10cmFjZV9rbWVtX2NhY2hlX2FsbG9jX25vZGUodm9pZCAqaWdub3JlLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCQkJCSAgICBjb25zdCB2b2lkICpwdHIsCi0JCQkJCSAgICBzaXplX3QgYnl0ZXNfcmVxLAotCQkJCQkgICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkJCQkgICAgZ2ZwX3QgZ2ZwX2ZsYWdzLAotCQkJCQkgICAgaW50IG5vZGUpCi17Ci0Ja21lbXRyYWNlX2FsbG9jKEtNRU1UUkFDRV9UWVBFX0NBQ0hFLCBjYWxsX3NpdGUsIHB0ciwKLQkJCWJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncywgbm9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1rbWVtdHJhY2Vfa2ZyZWUodm9pZCAqaWdub3JlLCB1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwgY29uc3Qgdm9pZCAqcHRyKQotewotCWttZW10cmFjZV9mcmVlKEtNRU1UUkFDRV9UWVBFX0tNQUxMT0MsIGNhbGxfc2l0ZSwgcHRyKTsKLX0KLQotc3RhdGljIHZvaWQga21lbXRyYWNlX2ttZW1fY2FjaGVfZnJlZSh2b2lkICppZ25vcmUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsIGNvbnN0IHZvaWQgKnB0cikKLXsKLQlrbWVtdHJhY2VfZnJlZShLTUVNVFJBQ0VfVFlQRV9DQUNIRSwgY2FsbF9zaXRlLCBwdHIpOwotfQotCi1zdGF0aWMgaW50IGttZW10cmFjZV9zdGFydF9wcm9iZXModm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gcmVnaXN0ZXJfdHJhY2Vfa21hbGxvYyhrbWVtdHJhY2Vfa21hbGxvYywgTlVMTCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllcnIgPSByZWdpc3Rlcl90cmFjZV9rbWVtX2NhY2hlX2FsbG9jKGttZW10cmFjZV9rbWVtX2NhY2hlX2FsbG9jLCBOVUxMKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHJlZ2lzdGVyX3RyYWNlX2ttYWxsb2Nfbm9kZShrbWVtdHJhY2Vfa21hbGxvY19ub2RlLCBOVUxMKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHJlZ2lzdGVyX3RyYWNlX2ttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtdHJhY2Vfa21lbV9jYWNoZV9hbGxvY19ub2RlLCBOVUxMKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHJlZ2lzdGVyX3RyYWNlX2tmcmVlKGttZW10cmFjZV9rZnJlZSwgTlVMTCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllcnIgPSByZWdpc3Rlcl90cmFjZV9rbWVtX2NhY2hlX2ZyZWUoa21lbXRyYWNlX2ttZW1fY2FjaGVfZnJlZSwgTlVMTCk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBrbWVtdHJhY2Vfc3RvcF9wcm9iZXModm9pZCkKLXsKLQl1bnJlZ2lzdGVyX3RyYWNlX2ttYWxsb2Moa21lbXRyYWNlX2ttYWxsb2MsIE5VTEwpOwotCXVucmVnaXN0ZXJfdHJhY2Vfa21lbV9jYWNoZV9hbGxvYyhrbWVtdHJhY2Vfa21lbV9jYWNoZV9hbGxvYywgTlVMTCk7Ci0JdW5yZWdpc3Rlcl90cmFjZV9rbWFsbG9jX25vZGUoa21lbXRyYWNlX2ttYWxsb2Nfbm9kZSwgTlVMTCk7Ci0JdW5yZWdpc3Rlcl90cmFjZV9rbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbXRyYWNlX2ttZW1fY2FjaGVfYWxsb2Nfbm9kZSwgTlVMTCk7Ci0JdW5yZWdpc3Rlcl90cmFjZV9rZnJlZShrbWVtdHJhY2Vfa2ZyZWUsIE5VTEwpOwotCXVucmVnaXN0ZXJfdHJhY2Vfa21lbV9jYWNoZV9mcmVlKGttZW10cmFjZV9rbWVtX2NhY2hlX2ZyZWUsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGttZW1fdHJhY2VfaW5pdChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQotewotCWttZW10cmFjZV9hcnJheSA9IHRyOwotCi0JdHJhY2luZ19yZXNldF9vbmxpbmVfY3B1cyh0cik7Ci0KLQlrbWVtdHJhY2Vfc3RhcnRfcHJvYmVzKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQga21lbV90cmFjZV9yZXNldChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQotewotCWttZW10cmFjZV9zdG9wX3Byb2JlcygpOwotfQotCi1zdGF0aWMgdm9pZCBrbWVtdHJhY2VfaGVhZGVycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCi17Ci0JLyogRG9uJ3QgbmVlZCBoZWFkZXJzIGZvciB0aGUgb3JpZ2luYWwga21lbXRyYWNlIG91dHB1dCAqLwotCWlmICghKGttZW1fdHJhY2VyX2ZsYWdzLnZhbCAmIFRSQUNFX0tNRU1fT1BUX01JTklNQUwpKQotCQlyZXR1cm47Ci0KLQlzZXFfcHJpbnRmKHMsICIjXG4iKTsKLQlzZXFfcHJpbnRmKHMsICIjIEFMTE9DICBUWVBFICBSRVEgICBHSVZFTiAgRkxBR1MgICAgICIKLQkJCSIgICAgICBQT0lOVEVSICAgICAgICAgTk9ERSAgICBDQUxMRVJcbiIpOwotCXNlcV9wcmludGYocywgIiMgRlJFRSAgIHwgICAgICB8ICAgICB8ICAgICAgIHwgICAgICAgIgotCQkJIiAgICAgICB8ICAgfCAgICAgICAgICAgIHwgICAgICAgIHxcbiIpOwotCXNlcV9wcmludGYocywgIiMgfFxuXG4iKTsKLX0KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGdpdmUgdGhlIG9yaWdpbmFsIG91dHB1dCBmcm9tIGttZW10cmFjZSwKLSAqIHBsdXMgdGhlIG9yaWdpbiBDUFUsIHNpbmNlIHJlb3JkZXJpbmcgb2NjdXJzIGluLWtlcm5lbCBub3cuCi0gKi8KLQotI2RlZmluZSBLTUVNVFJBQ0VfVVNFUl9BTExPQwkwCi0jZGVmaW5lIEtNRU1UUkFDRV9VU0VSX0ZSRUUJMQotCi1zdHJ1Y3Qga21lbXRyYWNlX3VzZXJfZXZlbnQgewotCXU4CQkJZXZlbnRfaWQ7Ci0JdTgJCQl0eXBlX2lkOwotCXUxNgkJCWV2ZW50X3NpemU7Ci0JdTMyCQkJY3B1OwotCXU2NAkJCXRpbWVzdGFtcDsKLQl1bnNpZ25lZCBsb25nCQljYWxsX3NpdGU7Ci0JdW5zaWduZWQgbG9uZwkJcHRyOwotfTsKLQotc3RydWN0IGttZW10cmFjZV91c2VyX2V2ZW50X2FsbG9jIHsKLQlzaXplX3QJCQlieXRlc19yZXE7Ci0Jc2l6ZV90CQkJYnl0ZXNfYWxsb2M7Ci0JdW5zaWduZWQJCWdmcF9mbGFnczsKLQlpbnQJCQlub2RlOwotfTsKLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90Ci1rbWVtdHJhY2VfcHJpbnRfYWxsb2Moc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLCBpbnQgZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpCi17Ci0Jc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7Ci0Jc3RydWN0IGttZW10cmFjZV9hbGxvY19lbnRyeSAqZW50cnk7Ci0JaW50IHJldDsKLQotCXRyYWNlX2Fzc2lnbl90eXBlKGVudHJ5LCBpdGVyLT5lbnQpOwotCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAidHlwZV9pZCAlZCBjYWxsX3NpdGUgJXBGIHB0ciAlbHUgIgotCSAgICAiYnl0ZXNfcmVxICVsdSBieXRlc19hbGxvYyAlbHUgZ2ZwX2ZsYWdzICVsdSBub2RlICVkXG4iLAotCSAgICBlbnRyeS0+dHlwZV9pZCwgKHZvaWQgKillbnRyeS0+Y2FsbF9zaXRlLCAodW5zaWduZWQgbG9uZyllbnRyeS0+cHRyLAotCSAgICAodW5zaWduZWQgbG9uZyllbnRyeS0+Ynl0ZXNfcmVxLCAodW5zaWduZWQgbG9uZyllbnRyeS0+Ynl0ZXNfYWxsb2MsCi0JICAgICh1bnNpZ25lZCBsb25nKWVudHJ5LT5nZnBfZmxhZ3MsIGVudHJ5LT5ub2RlKTsKLQotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0JcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90Ci1rbWVtdHJhY2VfcHJpbnRfZnJlZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncywKLQkJICAgICBzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KQotewotCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwotCXN0cnVjdCBrbWVtdHJhY2VfZnJlZV9lbnRyeSAqZW50cnk7Ci0JaW50IHJldDsKLQotCXRyYWNlX2Fzc2lnbl90eXBlKGVudHJ5LCBpdGVyLT5lbnQpOwotCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAidHlwZV9pZCAlZCBjYWxsX3NpdGUgJXBGIHB0ciAlbHVcbiIsCi0JCQkgICAgICAgZW50cnktPnR5cGVfaWQsICh2b2lkICopZW50cnktPmNhbGxfc2l0ZSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyllbnRyeS0+cHRyKTsKLQotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0JcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90Ci1rbWVtdHJhY2VfcHJpbnRfYWxsb2NfdXNlcihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncywKLQkJCSAgIHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpCi17Ci0Jc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7Ci0Jc3RydWN0IGttZW10cmFjZV9hbGxvY19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGttZW10cmFjZV91c2VyX2V2ZW50ICpldjsKLQlzdHJ1Y3Qga21lbXRyYWNlX3VzZXJfZXZlbnRfYWxsb2MgKmV2X2FsbG9jOwotCi0JdHJhY2VfYXNzaWduX3R5cGUoZW50cnksIGl0ZXItPmVudCk7Ci0KLQlldiA9IHRyYWNlX3NlcV9yZXNlcnZlKHMsIHNpemVvZigqZXYpKTsKLQlpZiAoIWV2KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0KLQlldi0+ZXZlbnRfaWQJCT0gS01FTVRSQUNFX1VTRVJfQUxMT0M7Ci0JZXYtPnR5cGVfaWQJCT0gZW50cnktPnR5cGVfaWQ7Ci0JZXYtPmV2ZW50X3NpemUJCT0gc2l6ZW9mKCpldikgKyBzaXplb2YoKmV2X2FsbG9jKTsKLQlldi0+Y3B1CQkJPSBpdGVyLT5jcHU7Ci0JZXYtPnRpbWVzdGFtcAkJPSBpdGVyLT50czsKLQlldi0+Y2FsbF9zaXRlCQk9IGVudHJ5LT5jYWxsX3NpdGU7Ci0JZXYtPnB0cgkJCT0gKHVuc2lnbmVkIGxvbmcpZW50cnktPnB0cjsKLQotCWV2X2FsbG9jID0gdHJhY2Vfc2VxX3Jlc2VydmUocywgc2l6ZW9mKCpldl9hbGxvYykpOwotCWlmICghZXZfYWxsb2MpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCWV2X2FsbG9jLT5ieXRlc19yZXEJPSBlbnRyeS0+Ynl0ZXNfcmVxOwotCWV2X2FsbG9jLT5ieXRlc19hbGxvYwk9IGVudHJ5LT5ieXRlc19hbGxvYzsKLQlldl9hbGxvYy0+Z2ZwX2ZsYWdzCT0gZW50cnktPmdmcF9mbGFnczsKLQlldl9hbGxvYy0+bm9kZQkJPSBlbnRyeS0+bm9kZTsKLQotCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBlbnVtIHByaW50X2xpbmVfdAota21lbXRyYWNlX3ByaW50X2ZyZWVfdXNlcihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncywKLQkJCSAgc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCkKLXsKLQlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsKLQlzdHJ1Y3Qga21lbXRyYWNlX2ZyZWVfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBrbWVtdHJhY2VfdXNlcl9ldmVudCAqZXY7Ci0KLQl0cmFjZV9hc3NpZ25fdHlwZShlbnRyeSwgaXRlci0+ZW50KTsKLQotCWV2ID0gdHJhY2Vfc2VxX3Jlc2VydmUocywgc2l6ZW9mKCpldikpOwotCWlmICghZXYpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCWV2LT5ldmVudF9pZAkJPSBLTUVNVFJBQ0VfVVNFUl9GUkVFOwotCWV2LT50eXBlX2lkCQk9IGVudHJ5LT50eXBlX2lkOwotCWV2LT5ldmVudF9zaXplCQk9IHNpemVvZigqZXYpOwotCWV2LT5jcHUJCQk9IGl0ZXItPmNwdTsKLQlldi0+dGltZXN0YW1wCQk9IGl0ZXItPnRzOwotCWV2LT5jYWxsX3NpdGUJCT0gZW50cnktPmNhbGxfc2l0ZTsKLQlldi0+cHRyCQkJPSAodW5zaWduZWQgbG9uZyllbnRyeS0+cHRyOwotCi0JcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotLyogVGhlIHR3byBvdGhlciBmb2xsb3dpbmcgcHJvdmlkZSBhIG1vcmUgbWluaW1hbGlzdGljIG91dHB1dCAqLwotc3RhdGljIGVudW0gcHJpbnRfbGluZV90Ci1rbWVtdHJhY2VfcHJpbnRfYWxsb2NfY29tcHJlc3Moc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQotewotCXN0cnVjdCBrbWVtdHJhY2VfYWxsb2NfZW50cnkgKmVudHJ5OwotCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwotCWludCByZXQ7Ci0KLQl0cmFjZV9hc3NpZ25fdHlwZShlbnRyeSwgaXRlci0+ZW50KTsKLQotCS8qIEFsbG9jIGVudHJ5ICovCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICArICAgICAgIik7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCS8qIFR5cGUgKi8KLQlzd2l0Y2ggKGVudHJ5LT50eXBlX2lkKSB7Ci0JY2FzZSBLTUVNVFJBQ0VfVFlQRV9LTUFMTE9DOgotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJLICAgIik7Ci0JCWJyZWFrOwotCWNhc2UgS01FTVRSQUNFX1RZUEVfQ0FDSEU6Ci0JCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIkMgICAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBLTUVNVFJBQ0VfVFlQRV9QQUdFUzoKLQkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiUCAgICIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICI/ICAgIik7Ci0JfQotCi0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCS8qIFJlcXVlc3RlZCAqLwotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiU0enUgICAiLCBlbnRyeS0+Ynl0ZXNfcmVxKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCi0JLyogQWxsb2NhdGVkICovCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJTR6dSAgICIsIGVudHJ5LT5ieXRlc19hbGxvYyk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCS8qIEZsYWdzCi0JICogVE9ETzogd291bGQgYmUgYmV0dGVyIHRvIHNlZSB0aGUgbmFtZSBvZiB0aGUgR0ZQIGZsYWcgbmFtZXMKLQkgKi8KLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIlMDh4ICAgIiwgZW50cnktPmdmcF9mbGFncyk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCS8qIFBvaW50ZXIgdG8gYWxsb2NhdGVkICovCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiMHgldHggICAiLCAocHRyZGlmZl90KWVudHJ5LT5wdHIpOwotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0KLQkvKiBOb2RlIGFuZCBjYWxsIHNpdGUqLwotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiU0ZCAgICVwZlxuIiwgZW50cnktPm5vZGUsCi0JCQkJCQkgKHZvaWQgKillbnRyeS0+Y2FsbF9zaXRlKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCi0JcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90Ci1rbWVtdHJhY2VfcHJpbnRfZnJlZV9jb21wcmVzcyhzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCi17Ci0Jc3RydWN0IGttZW10cmFjZV9mcmVlX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsKLQlpbnQgcmV0OwotCi0JdHJhY2VfYXNzaWduX3R5cGUoZW50cnksIGl0ZXItPmVudCk7Ci0KLQkvKiBGcmVlIGVudHJ5ICovCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICAtICAgICAgIik7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCS8qIFR5cGUgKi8KLQlzd2l0Y2ggKGVudHJ5LT50eXBlX2lkKSB7Ci0JY2FzZSBLTUVNVFJBQ0VfVFlQRV9LTUFMTE9DOgotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJLICAgICAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBLTUVNVFJBQ0VfVFlQRV9DQUNIRToKLQkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiQyAgICAgIik7Ci0JCWJyZWFrOwotCWNhc2UgS01FTVRSQUNFX1RZUEVfUEFHRVM6Ci0JCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlAgICAgICIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICI/ICAgICAiKTsKLQl9Ci0KLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCi0JLyogU2tpcCByZXF1ZXN0ZWQvYWxsb2NhdGVkL2ZsYWdzICovCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICAgICAgICAgICAgICAgICAgICAgICAiKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCi0JLyogUG9pbnRlciB0byBhbGxvY2F0ZWQgKi8KLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIweCV0eCAgICIsIChwdHJkaWZmX3QpZW50cnktPnB0cik7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCS8qIFNraXAgbm9kZSBhbmQgcHJpbnQgY2FsbCBzaXRlKi8KLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIgICAgICAgJXBmXG4iLCAodm9pZCAqKWVudHJ5LT5jYWxsX3NpdGUpOwotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0KLQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwotfQotCi1zdGF0aWMgZW51bSBwcmludF9saW5lX3Qga21lbXRyYWNlX3ByaW50X2xpbmUoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQotewotCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnkgPSBpdGVyLT5lbnQ7Ci0KLQlpZiAoIShrbWVtX3RyYWNlcl9mbGFncy52YWwgJiBUUkFDRV9LTUVNX09QVF9NSU5JTUFMKSkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOwotCi0Jc3dpdGNoIChlbnRyeS0+dHlwZSkgewotCWNhc2UgVFJBQ0VfS01FTV9BTExPQzoKLQkJcmV0dXJuIGttZW10cmFjZV9wcmludF9hbGxvY19jb21wcmVzcyhpdGVyKTsKLQljYXNlIFRSQUNFX0tNRU1fRlJFRToKLQkJcmV0dXJuIGttZW10cmFjZV9wcmludF9mcmVlX2NvbXByZXNzKGl0ZXIpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBUUkFDRV9UWVBFX1VOSEFORExFRDsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnRfZnVuY3Rpb25zIGttZW1fdHJhY2VfYWxsb2NfZnVuY3MgPSB7Ci0JLnRyYWNlCQkJPSBrbWVtdHJhY2VfcHJpbnRfYWxsb2MsCi0JLmJpbmFyeQkJCT0ga21lbXRyYWNlX3ByaW50X2FsbG9jX3VzZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50IGttZW1fdHJhY2VfYWxsb2MgPSB7Ci0JLnR5cGUJCQk9IFRSQUNFX0tNRU1fQUxMT0MsCi0JLmZ1bmNzCQkJPSAma21lbV90cmFjZV9hbGxvY19mdW5jcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnRfZnVuY3Rpb25zIGttZW1fdHJhY2VfZnJlZV9mdW5jcyA9IHsKLQkudHJhY2UJCQk9IGttZW10cmFjZV9wcmludF9mcmVlLAotCS5iaW5hcnkJCQk9IGttZW10cmFjZV9wcmludF9mcmVlX3VzZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50IGttZW1fdHJhY2VfZnJlZSA9IHsKLQkudHlwZQkJCT0gVFJBQ0VfS01FTV9GUkVFLAotCS5mdW5jcwkJCT0gJmttZW1fdHJhY2VfZnJlZV9mdW5jcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJhY2VyIGttZW1fdHJhY2VyIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUJCQk9ICJrbWVtdHJhY2UiLAotCS5pbml0CQkJPSBrbWVtX3RyYWNlX2luaXQsCi0JLnJlc2V0CQkJPSBrbWVtX3RyYWNlX3Jlc2V0LAotCS5wcmludF9saW5lCQk9IGttZW10cmFjZV9wcmludF9saW5lLAotCS5wcmludF9oZWFkZXIJCT0ga21lbXRyYWNlX2hlYWRlcnMsCi0JLmZsYWdzCQkJPSAma21lbV90cmFjZXJfZmxhZ3MKLX07Ci0KLXZvaWQga21lbXRyYWNlX2luaXQodm9pZCkKLXsKLQkvKiBlYXJsaWVzdCBvcHBvcnR1bml0eSB0byBzdGFydCBrbWVtIHRyYWNpbmcgKi8KLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9rbWVtX3RyYWNlcih2b2lkKQotewotCWlmICghcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KCZrbWVtX3RyYWNlX2FsbG9jKSkgewotCQlwcl93YXJuaW5nKCJXYXJuaW5nOiBjb3VsZCBub3QgcmVnaXN0ZXIga21lbSBldmVudHNcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoIXJlZ2lzdGVyX2Z0cmFjZV9ldmVudCgma21lbV90cmFjZV9mcmVlKSkgewotCQlwcl93YXJuaW5nKCJXYXJuaW5nOiBjb3VsZCBub3QgcmVnaXN0ZXIga21lbSBldmVudHNcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAocmVnaXN0ZXJfdHJhY2VyKCZrbWVtX3RyYWNlcikgIT0gMCkgewotCQlwcl93YXJuaW5nKCJXYXJuaW5nOiBjb3VsZCBub3QgcmVnaXN0ZXIgdGhlIGttZW0gdHJhY2VyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1kZXZpY2VfaW5pdGNhbGwoaW5pdF9rbWVtX3RyYWNlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCmluZGV4IDFkYTdiNmUuLjM2MzJjZTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCkBAIC00NDMsNiArNDQzLDcgQEAKICAqLwogc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgewogCWludAkJCQljcHU7CisJYXRvbWljX3QJCQlyZWNvcmRfZGlzYWJsZWQ7CiAJc3RydWN0IHJpbmdfYnVmZmVyCQkqYnVmZmVyOwogCXNwaW5sb2NrX3QJCQlyZWFkZXJfbG9jazsJLyogc2VyaWFsaXplIHJlYWRlcnMgKi8KIAlhcmNoX3NwaW5sb2NrX3QJCQlsb2NrOwpAQCAtNDYyLDcgKzQ2Myw2IEBACiAJdW5zaWduZWQgbG9uZwkJCXJlYWQ7CiAJdTY0CQkJCXdyaXRlX3N0YW1wOwogCXU2NAkJCQlyZWFkX3N0YW1wOwotCWF0b21pY190CQkJcmVjb3JkX2Rpc2FibGVkOwogfTsKIAogc3RydWN0IHJpbmdfYnVmZmVyIHsKQEAgLTIyNDIsOCArMjI0Miw2IEBACiAKICNlbmRpZgogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCByYl9uZWVkX3Jlc2NoZWQpOwotCiAvKioKICAqIHJpbmdfYnVmZmVyX2xvY2tfcmVzZXJ2ZSAtIHJlc2VydmUgYSBwYXJ0IG9mIHRoZSBidWZmZXIKICAqIEBidWZmZXI6IHRoZSByaW5nIGJ1ZmZlciB0byByZXNlcnZlIGZyb20KQEAgLTIyNjQsMTMgKzIyNjIsMTMgQEAKIHsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlcjsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCWludCBjcHUsIHJlc2NoZWQ7CisJaW50IGNwdTsKIAogCWlmIChyaW5nX2J1ZmZlcl9mbGFncyAhPSBSQl9CVUZGRVJTX09OKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIElmIHdlIGFyZSB0cmFjaW5nIHNjaGVkdWxlLCB3ZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgKi8KLQlyZXNjaGVkID0gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSgpOworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmJ1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKSkKIAkJZ290byBvdXRfbm9jaGVjazsKQEAgLTIyOTUsMjEgKzIyOTMsMTMgQEAKIAlpZiAoIWV2ZW50KQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogTmVlZCB0byBzdG9yZSByZXNjaGVkIHN0YXRlIG9uIHRoaXMgY3B1LgotCSAqIE9ubHkgdGhlIGZpcnN0IG5lZWRzIHRvLgotCSAqLwotCi0JaWYgKHByZWVtcHRfY291bnQoKSA9PSAxKQotCQlwZXJfY3B1KHJiX25lZWRfcmVzY2hlZCwgY3B1KSA9IHJlc2NoZWQ7Ci0KIAlyZXR1cm4gZXZlbnQ7CiAKICBvdXQ6CiAJdHJhY2VfcmVjdXJzaXZlX3VubG9jaygpOwogCiAgb3V0X25vY2hlY2s6Ci0JZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2xvY2tfcmVzZXJ2ZSk7CkBAIC0yMzU1LDEzICsyMzQ1LDcgQEAKIAogCXRyYWNlX3JlY3Vyc2l2ZV91bmxvY2soKTsKIAotCS8qCi0JICogT25seSB0aGUgbGFzdCBwcmVlbXB0IGNvdW50IG5lZWRzIHRvIHJlc3RvcmUgcHJlZW1wdGlvbi4KLQkgKi8KLQlpZiAocHJlZW1wdF9jb3VudCgpID09IDEpCi0JCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShwZXJfY3B1KHJiX25lZWRfcmVzY2hlZCwgY3B1KSk7Ci0JZWxzZQotCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkX25vdHJhY2UoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NjksMTMgKzI0NTMsNyBAQAogCiAJdHJhY2VfcmVjdXJzaXZlX3VubG9jaygpOwogCi0JLyoKLQkgKiBPbmx5IHRoZSBsYXN0IHByZWVtcHQgY291bnQgbmVlZHMgdG8gcmVzdG9yZSBwcmVlbXB0aW9uLgotCSAqLwotCWlmIChwcmVlbXB0X2NvdW50KCkgPT0gMSkKLQkJZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHBlcl9jcHUocmJfbmVlZF9yZXNjaGVkLCBjcHUpKTsKLQllbHNlCi0JCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWRfbm90cmFjZSgpOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQpOwpAQCAtMjUwMSwxMiArMjQ3OSwxMiBAQAogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJdm9pZCAqYm9keTsKIAlpbnQgcmV0ID0gLUVCVVNZOwotCWludCBjcHUsIHJlc2NoZWQ7CisJaW50IGNwdTsKIAogCWlmIChyaW5nX2J1ZmZlcl9mbGFncyAhPSBSQl9CVUZGRVJTX09OKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcmVzY2hlZCA9IGZ0cmFjZV9wcmVlbXB0X2Rpc2FibGUoKTsKKwlwcmVlbXB0X2Rpc2FibGVfbm90cmFjZSgpOwogCiAJaWYgKGF0b21pY19yZWFkKCZidWZmZXItPnJlY29yZF9kaXNhYmxlZCkpCiAJCWdvdG8gb3V0OwpAQCAtMjUzNiw3ICsyNTE0LDcgQEAKIAogCXJldCA9IDA7CiAgb3V0OgotCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShyZXNjaGVkKTsKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwppbmRleCAwODZkMzYzLi5lZDEwMzJkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwpAQCAtMTAxLDEwICsxMDEsNyBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKLXN0YXRpYyBjcHVtYXNrX3Zhcl90IF9fcmVhZF9tb3N0bHkJdHJhY2luZ19idWZmZXJfbWFzazsKLQotI2RlZmluZSBmb3JfZWFjaF90cmFjaW5nX2NwdShjcHUpCVwKLQlmb3JfZWFjaF9jcHUoY3B1LCB0cmFjaW5nX2J1ZmZlcl9tYXNrKQorY3B1bWFza192YXJfdCBfX3JlYWRfbW9zdGx5CXRyYWNpbmdfYnVmZmVyX21hc2s7CiAKIC8qCiAgKiBmdHJhY2VfZHVtcF9vbl9vb3BzIC0gdmFyaWFibGUgdG8gZHVtcCBmdHJhY2UgYnVmZmVyIG9uIG9vcHMKQEAgLTM0NCw3ICszNDEsNyBAQAogLyogdHJhY2VfZmxhZ3MgaG9sZHMgdHJhY2Vfb3B0aW9ucyBkZWZhdWx0IHZhbHVlcyAqLwogdW5zaWduZWQgbG9uZyB0cmFjZV9mbGFncyA9IFRSQUNFX0lURVJfUFJJTlRfUEFSRU5UIHwgVFJBQ0VfSVRFUl9QUklOVEsgfAogCVRSQUNFX0lURVJfQU5OT1RBVEUgfCBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTyB8IFRSQUNFX0lURVJfU0xFRVBfVElNRSB8Ci0JVFJBQ0VfSVRFUl9HUkFQSF9USU1FOworCVRSQUNFX0lURVJfR1JBUEhfVElNRSB8IFRSQUNFX0lURVJfUkVDT1JEX0NNRDsKIAogc3RhdGljIGludCB0cmFjZV9zdG9wX2NvdW50Owogc3RhdGljIERFRklORV9TUElOTE9DSyh0cmFjaW5nX3N0YXJ0X2xvY2spOwpAQCAtNDI4LDYgKzQyNSw3IEBACiAJImxhdGVuY3ktZm9ybWF0IiwKIAkic2xlZXAtdGltZSIsCiAJImdyYXBoLXRpbWUiLAorCSJyZWNvcmQtY21kIiwKIAlOVUxMCiB9OwogCkBAIC02NTksNiArNjU3LDEwIEBACiAJCXJldHVybjsKIAogCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKKwlpZiAoIWN1cnJlbnRfdHJhY2UtPnVzZV9tYXhfdHIpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm47CisJfQogCWFyY2hfc3Bpbl9sb2NrKCZmdHJhY2VfbWF4X2xvY2spOwogCiAJdHItPmJ1ZmZlciA9IG1heF90ci5idWZmZXI7CkBAIC02ODUsNiArNjg3LDExIEBACiAJCXJldHVybjsKIAogCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKKwlpZiAoIWN1cnJlbnRfdHJhY2UtPnVzZV9tYXhfdHIpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm47CisJfQorCiAJYXJjaF9zcGluX2xvY2soJmZ0cmFjZV9tYXhfbG9jayk7CiAKIAlmdHJhY2VfZGlzYWJsZV9jcHUoKTsKQEAgLTcyOSw3ICs3MzYsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKHN0cmxlbih0eXBlLT5uYW1lKSA+IE1BWF9UUkFDRVJfU0laRSkgeworCWlmIChzdHJsZW4odHlwZS0+bmFtZSkgPj0gTUFYX1RSQUNFUl9TSVpFKSB7CiAJCXByX2luZm8oIlRyYWNlciBoYXMgYSBuYW1lIGxvbmdlciB0aGFuICVkXG4iLCBNQVhfVFJBQ0VSX1NJWkUpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTMzMSw2MSArMTMzOCw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU1RBQ0tUUkFDRSAqLwogCi1zdGF0aWMgdm9pZAotZnRyYWNlX3RyYWNlX3NwZWNpYWwodm9pZCAqX190ciwKLQkJICAgICB1bnNpZ25lZCBsb25nIGFyZzEsIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczLAotCQkgICAgIGludCBwYykKLXsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfc3BlY2lhbDsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBfX3RyOwotCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyID0gdHItPmJ1ZmZlcjsKLQlzdHJ1Y3Qgc3BlY2lhbF9lbnRyeSAqZW50cnk7Ci0KLQlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9TUEVDSUFMLAotCQkJCQkgIHNpemVvZigqZW50cnkpLCAwLCBwYyk7Ci0JaWYgKCFldmVudCkKLQkJcmV0dXJuOwotCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7Ci0JZW50cnktPmFyZzEJCQk9IGFyZzE7Ci0JZW50cnktPmFyZzIJCQk9IGFyZzI7Ci0JZW50cnktPmFyZzMJCQk9IGFyZzM7Ci0KLQlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCBidWZmZXIsIGV2ZW50KSkKLQkJdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCwgMCwgcGMpOwotfQotCi12b2lkCi1fX3RyYWNlX3NwZWNpYWwodm9pZCAqX190ciwgdm9pZCAqX19kYXRhLAotCQl1bnNpZ25lZCBsb25nIGFyZzEsIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczKQotewotCWZ0cmFjZV90cmFjZV9zcGVjaWFsKF9fdHIsIGFyZzEsIGFyZzIsIGFyZzMsIHByZWVtcHRfY291bnQoKSk7Ci19Ci0KLXZvaWQKLWZ0cmFjZV9zcGVjaWFsKHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyLCB1bnNpZ25lZCBsb25nIGFyZzMpCi17Ci0Jc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9ICZnbG9iYWxfdHJhY2U7Ci0Jc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjcHU7Ci0JaW50IHBjOwotCi0JaWYgKHRyYWNpbmdfZGlzYWJsZWQpCi0JCXJldHVybjsKLQotCXBjID0gcHJlZW1wdF9jb3VudCgpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWRhdGEgPSB0ci0+ZGF0YVtjcHVdOwotCi0JaWYgKGxpa2VseShhdG9taWNfaW5jX3JldHVybigmZGF0YS0+ZGlzYWJsZWQpID09IDEpKQotCQlmdHJhY2VfdHJhY2Vfc3BlY2lhbCh0ciwgYXJnMSwgYXJnMiwgYXJnMywgcGMpOwotCi0JYXRvbWljX2RlYygmZGF0YS0+ZGlzYWJsZWQpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQogLyoqCiAgKiB0cmFjZV92YnByaW50ayAtIHdyaXRlIGJpbmFyeSBtc2cgdG8gdHJhY2luZyBidWZmZXIKICAqCkBAIC0xNDA0LDcgKzEzNTYsNiBAQAogCXN0cnVjdCBicHJpbnRfZW50cnkgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGRpc2FibGU7Ci0JaW50IHJlc2NoZWQ7CiAJaW50IGNwdSwgbGVuID0gMCwgc2l6ZSwgcGM7CiAKIAlpZiAodW5saWtlbHkodHJhY2luZ19zZWxmdGVzdF9ydW5uaW5nIHx8IHRyYWNpbmdfZGlzYWJsZWQpKQpAQCAtMTQxNCw3ICsxMzY1LDcgQEAKIAlwYXVzZV9ncmFwaF90cmFjaW5nKCk7CiAKIAlwYyA9IHByZWVtcHRfY291bnQoKTsKLQlyZXNjaGVkID0gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSgpOworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlkYXRhID0gdHItPmRhdGFbY3B1XTsKIApAQCAtMTQ1Miw3ICsxNDAzLDcgQEAKIAogb3V0OgogCWF0b21pY19kZWNfcmV0dXJuKCZkYXRhLT5kaXNhYmxlZCk7Ci0JZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIAl1bnBhdXNlX2dyYXBoX3RyYWNpbmcoKTsKIAogCXJldHVybiBsZW47CkBAIC0xNTM5LDExICsxNDkwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX3ZwcmludGspOwogCi1lbnVtIHRyYWNlX2ZpbGVfdHlwZSB7Ci0JVFJBQ0VfRklMRV9MQVRfRk1UCT0gMSwKLQlUUkFDRV9GSUxFX0FOTk9UQVRFCT0gMiwKLX07Ci0KIHN0YXRpYyB2b2lkIHRyYWNlX2l0ZXJhdG9yX2luY3JlbWVudChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CiAJLyogRG9uJ3QgYWxsb3cgZnRyYWNlIHRvIHRyYWNlIGludG8gdGhlIHJpbmcgYnVmZmVycyAqLwpAQCAtMTY0MSw3ICsxNTg3LDcgQEAKIH0KIAogLyogRmluZCB0aGUgbmV4dCByZWFsIGVudHJ5LCBhbmQgaW5jcmVtZW50IHRoZSBpdGVyYXRvciB0byB0aGUgbmV4dCBlbnRyeSAqLwotc3RhdGljIHZvaWQgKmZpbmRfbmV4dF9lbnRyeV9pbmMoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQordm9pZCAqdHJhY2VfZmluZF9uZXh0X2VudHJ5X2luYyhzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CiAJaXRlci0+ZW50ID0gX19maW5kX25leHRfZW50cnkoaXRlciwgJml0ZXItPmNwdSwKIAkJCQkgICAgICAmaXRlci0+bG9zdF9ldmVudHMsICZpdGVyLT50cyk7CkBAIC0xNjc2LDE5ICsxNjIyLDE5IEBACiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGl0ZXItPmlkeCA8IDApCi0JCWVudCA9IGZpbmRfbmV4dF9lbnRyeV9pbmMoaXRlcik7CisJCWVudCA9IHRyYWNlX2ZpbmRfbmV4dF9lbnRyeV9pbmMoaXRlcik7CiAJZWxzZQogCQllbnQgPSBpdGVyOwogCiAJd2hpbGUgKGVudCAmJiBpdGVyLT5pZHggPCBpKQotCQllbnQgPSBmaW5kX25leHRfZW50cnlfaW5jKGl0ZXIpOworCQllbnQgPSB0cmFjZV9maW5kX25leHRfZW50cnlfaW5jKGl0ZXIpOwogCiAJaXRlci0+cG9zID0gKnBvczsKIAogCXJldHVybiBlbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRyYWNpbmdfaXRlcl9yZXNldChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBjcHUpCit2b2lkIHRyYWNpbmdfaXRlcl9yZXNldChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBjcHUpCiB7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGl0ZXItPnRyOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CkBAIC0yMDQ5LDcgKzE5OTUsNyBAQAogfQogCiAvKiAgQ2FsbGVkIHdpdGggdHJhY2VfZXZlbnRfcmVhZF9sb2NrKCkgaGVsZC4gKi8KLXN0YXRpYyBlbnVtIHByaW50X2xpbmVfdCBwcmludF90cmFjZV9saW5lKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKK2VudW0gcHJpbnRfbGluZV90IHByaW50X3RyYWNlX2xpbmUoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogewogCWVudW0gcHJpbnRfbGluZV90IHJldDsKIApAQCAtMjM5NCw2ICsyMzQwLDcgQEAKIAkub3BlbgkJPSBzaG93X3RyYWNlc19vcGVuLAogCS5yZWFkCQk9IHNlcV9yZWFkLAogCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCiB9OwogCiAvKgpAQCAtMjQ4Nyw2ICsyNDM0LDcgQEAKIAkub3BlbgkJPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKIAkucmVhZAkJPSB0cmFjaW5nX2NwdW1hc2tfcmVhZCwKIAkud3JpdGUJCT0gdHJhY2luZ19jcHVtYXNrX3dyaXRlLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBpbnQgdHJhY2luZ190cmFjZV9vcHRpb25zX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQpAQCAtMjU2Miw2ICsyNTEwLDkgQEAKIAkJdHJhY2VfZmxhZ3MgfD0gbWFzazsKIAllbHNlCiAJCXRyYWNlX2ZsYWdzICY9IH5tYXNrOworCisJaWYgKG1hc2sgPT0gVFJBQ0VfSVRFUl9SRUNPUkRfQ01EKQorCQl0cmFjZV9ldmVudF9lbmFibGVfY21kX3JlY29yZChlbmFibGVkKTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTI2NTMsNiArMjYwNCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX3JlYWRtZV9mb3BzID0gewogCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAogCS5yZWFkCQk9IHRyYWNpbmdfcmVhZG1lX3JlYWQsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogc3RhdGljIHNzaXplX3QKQEAgLTI3MDMsNiArMjY1NSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX3NhdmVkX2NtZGxpbmVzX2ZvcHMgPSB7CiAgICAgLm9wZW4gICAgICAgPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKICAgICAucmVhZCAgICAgICA9IHRyYWNpbmdfc2F2ZWRfY21kbGluZXNfcmVhZCwKKyAgICAubGxzZWVrCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0yNzk4LDYgKzI3NTEsOSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJaWYgKCFjdXJyZW50X3RyYWNlLT51c2VfbWF4X3RyKQorCQlnb3RvIG91dDsKKwogCXJldCA9IHJpbmdfYnVmZmVyX3Jlc2l6ZShtYXhfdHIuYnVmZmVyLCBzaXplKTsKIAlpZiAocmV0IDwgMCkgewogCQlpbnQgcjsKQEAgLTI4MjUsMTEgKzI3ODEsMTQgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwltYXhfdHIuZW50cmllcyA9IHNpemU7Cisgb3V0OgogCWdsb2JhbF90cmFjZS5lbnRyaWVzID0gc2l6ZTsKIAogCXJldHVybiByZXQ7CiB9CiAKKwogLyoqCiAgKiB0cmFjaW5nX3VwZGF0ZV9idWZmZXJzIC0gdXNlZCBieSB0cmFjaW5nIGZhY2lsaXR5IHRvIGV4cGFuZCByaW5nIGJ1ZmZlcnMKICAqCkBAIC0yODkwLDEyICsyODQ5LDI2IEBACiAJdHJhY2VfYnJhbmNoX2Rpc2FibGUoKTsKIAlpZiAoY3VycmVudF90cmFjZSAmJiBjdXJyZW50X3RyYWNlLT5yZXNldCkKIAkJY3VycmVudF90cmFjZS0+cmVzZXQodHIpOwotCisJaWYgKGN1cnJlbnRfdHJhY2UgJiYgY3VycmVudF90cmFjZS0+dXNlX21heF90cikgeworCQkvKgorCQkgKiBXZSBkb24ndCBmcmVlIHRoZSByaW5nIGJ1ZmZlci4gaW5zdGVhZCwgcmVzaXplIGl0IGJlY2F1c2UKKwkJICogVGhlIG1heF90ciByaW5nIGJ1ZmZlciBoYXMgc29tZSBzdGF0ZSAoZS5nLiByaW5nLT5jbG9jaykgYW5kCisJCSAqIHdlIHdhbnQgcHJlc2VydmUgaXQuCisJCSAqLworCQlyaW5nX2J1ZmZlcl9yZXNpemUobWF4X3RyLmJ1ZmZlciwgMSk7CisJCW1heF90ci5lbnRyaWVzID0gMTsKKwl9CiAJZGVzdHJveV90cmFjZV9vcHRpb25fZmlsZXModG9wdHMpOwogCiAJY3VycmVudF90cmFjZSA9IHQ7CiAKIAl0b3B0cyA9IGNyZWF0ZV90cmFjZV9vcHRpb25fZmlsZXMoY3VycmVudF90cmFjZSk7CisJaWYgKGN1cnJlbnRfdHJhY2UtPnVzZV9tYXhfdHIpIHsKKwkJcmV0ID0gcmluZ19idWZmZXJfcmVzaXplKG1heF90ci5idWZmZXIsIGdsb2JhbF90cmFjZS5lbnRyaWVzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJbWF4X3RyLmVudHJpZXMgPSBnbG9iYWxfdHJhY2UuZW50cmllczsKKwl9CiAKIAlpZiAodC0+aW5pdCkgewogCQlyZXQgPSB0cmFjZXJfaW5pdCh0LCB0cik7CkBAIC0zMDMyLDYgKzMwMDUsNyBAQAogCWlmIChpdGVyLT50cmFjZS0+cGlwZV9vcGVuKQogCQlpdGVyLT50cmFjZS0+cGlwZV9vcGVuKGl0ZXIpOwogCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ0cmFjZV90eXBlc19sb2NrKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzIxMSw3ICszMTg1LDcgQEAKIAogCXRyYWNlX2V2ZW50X3JlYWRfbG9jaygpOwogCXRyYWNlX2FjY2Vzc19sb2NrKGl0ZXItPmNwdV9maWxlKTsKLQl3aGlsZSAoZmluZF9uZXh0X2VudHJ5X2luYyhpdGVyKSAhPSBOVUxMKSB7CisJd2hpbGUgKHRyYWNlX2ZpbmRfbmV4dF9lbnRyeV9pbmMoaXRlcikgIT0gTlVMTCkgewogCQllbnVtIHByaW50X2xpbmVfdCByZXQ7CiAJCWludCBsZW4gPSBpdGVyLT5zZXEubGVuOwogCkBAIC0zMjk0LDcgKzMyNjgsNyBAQAogCQlpZiAocmV0ICE9IFRSQUNFX1RZUEVfTk9fQ09OU1VNRSkKIAkJCXRyYWNlX2NvbnN1bWUoaXRlcik7CiAJCXJlbSAtPSBjb3VudDsKLQkJaWYgKCFmaW5kX25leHRfZW50cnlfaW5jKGl0ZXIpKQl7CisJCWlmICghdHJhY2VfZmluZF9uZXh0X2VudHJ5X2luYyhpdGVyKSkJewogCQkJcmVtID0gMDsKIAkJCWl0ZXItPmVudCA9IE5VTEw7CiAJCQlicmVhazsKQEAgLTMzNTAsNyArMzMyNCw3IEBACiAJaWYgKHJldCA8PSAwKQogCQlnb3RvIG91dF9lcnI7CiAKLQlpZiAoIWl0ZXItPmVudCAmJiAhZmluZF9uZXh0X2VudHJ5X2luYyhpdGVyKSkgeworCWlmICghaXRlci0+ZW50ICYmICF0cmFjZV9maW5kX25leHRfZW50cnlfaW5jKGl0ZXIpKSB7CiAJCXJldCA9IC1FRkFVTFQ7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC0zNDc3LDcgKzM0NTEsNiBAQAogCX0KIAogCXRyYWNpbmdfc3RhcnQoKTsKLQltYXhfdHIuZW50cmllcyA9IGdsb2JhbF90cmFjZS5lbnRyaWVzOwogCW11dGV4X3VubG9jaygmdHJhY2VfdHlwZXNfbG9jayk7CiAKIAlyZXR1cm4gY250OwpAQCAtMzU5MCwxOCArMzU2MywyMSBAQAogCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAogCS5yZWFkCQk9IHRyYWNpbmdfbWF4X2xhdF9yZWFkLAogCS53cml0ZQkJPSB0cmFjaW5nX21heF9sYXRfd3JpdGUsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19jdHJsX2ZvcHMgPSB7CiAJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCiAJLnJlYWQJCT0gdHJhY2luZ19jdHJsX3JlYWQsCiAJLndyaXRlCQk9IHRyYWNpbmdfY3RybF93cml0ZSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZXRfdHJhY2VyX2ZvcHMgPSB7CiAJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCiAJLnJlYWQJCT0gdHJhY2luZ19zZXRfdHJhY2VfcmVhZCwKIAkud3JpdGUJCT0gdHJhY2luZ19zZXRfdHJhY2Vfd3JpdGUsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19waXBlX2ZvcHMgPSB7CkBAIC0zNjEwLDE3ICszNTg2LDIwIEBACiAJLnJlYWQJCT0gdHJhY2luZ19yZWFkX3BpcGUsCiAJLnNwbGljZV9yZWFkCT0gdHJhY2luZ19zcGxpY2VfcmVhZF9waXBlLAogCS5yZWxlYXNlCT0gdHJhY2luZ19yZWxlYXNlX3BpcGUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX2VudHJpZXNfZm9wcyA9IHsKIAkub3BlbgkJPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKIAkucmVhZAkJPSB0cmFjaW5nX2VudHJpZXNfcmVhZCwKIAkud3JpdGUJCT0gdHJhY2luZ19lbnRyaWVzX3dyaXRlLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYWNpbmdfbWFya19mb3BzID0gewogCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAogCS53cml0ZQkJPSB0cmFjaW5nX21hcmtfd3JpdGUsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2VfY2xvY2tfZm9wcyA9IHsKQEAgLTM5MjYsNiArMzkwNSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX3N0YXRzX2ZvcHMgPSB7CiAJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCiAJLnJlYWQJCT0gdHJhY2luZ19zdGF0c19yZWFkLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKQEAgLTM5NjIsNiArMzk0Miw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX2R5bl9pbmZvX2ZvcHMgPSB7CiAJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCiAJLnJlYWQJCT0gdHJhY2luZ19yZWFkX2R5bl9pbmZvLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAjZW5kaWYKIApAQCAtNDExNSw2ICs0MDk2LDcgQEAKIAkub3BlbiA9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAogCS5yZWFkID0gdHJhY2Vfb3B0aW9uc19yZWFkLAogCS53cml0ZSA9IHRyYWNlX29wdGlvbnNfd3JpdGUsCisJLmxsc2Vlawk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgc3NpemVfdApAQCAtNDE2Niw2ICs0MTQ4LDcgQEAKIAkub3BlbiA9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAogCS5yZWFkID0gdHJhY2Vfb3B0aW9uc19jb3JlX3JlYWQsCiAJLndyaXRlID0gdHJhY2Vfb3B0aW9uc19jb3JlX3dyaXRlLAorCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogc3RydWN0IGRlbnRyeSAqdHJhY2VfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwKQEAgLTQzNTUsOSArNDMzOCw2IEBACiAJdHJhY2VfY3JlYXRlX2ZpbGUoImR5bl9mdHJhY2VfdG90YWxfaW5mbyIsIDA0NDQsIGRfdHJhY2VyLAogCQkJJmZ0cmFjZV91cGRhdGVfdG90X2NudCwgJnRyYWNpbmdfZHluX2luZm9fZm9wcyk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfU1lTUFJPRl9UUkFDRVIKLQlpbml0X3RyYWNlcl9zeXNwcm9mX2RlYnVnZnMoZF90cmFjZXIpOwotI2VuZGlmCiAKIAljcmVhdGVfdHJhY2Vfb3B0aW9uc19kaXIoKTsKIApAQCAtNDQxNCw3ICs0Mzk0LDcgQEAKICAqLwogI2RlZmluZSBLRVJOX1RSQUNFCQlLRVJOX0VNRVJHCiAKLXN0YXRpYyB2b2lkCit2b2lkCiB0cmFjZV9wcmludGtfc2VxKHN0cnVjdCB0cmFjZV9zZXEgKnMpCiB7CiAJLyogUHJvYmFibHkgc2hvdWxkIHByaW50IGEgd2FybmluZyBoZXJlLiAqLwpAQCAtNDQyOSw2ICs0NDA5LDEzIEBACiAJdHJhY2Vfc2VxX2luaXQocyk7CiB9CiAKK3ZvaWQgdHJhY2VfaW5pdF9nbG9iYWxfaXRlcihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCit7CisJaXRlci0+dHIgPSAmZ2xvYmFsX3RyYWNlOworCWl0ZXItPnRyYWNlID0gY3VycmVudF90cmFjZTsKKwlpdGVyLT5jcHVfZmlsZSA9IFRSQUNFX1BJUEVfQUxMX0NQVTsKK30KKwogc3RhdGljIHZvaWQKIF9fZnRyYWNlX2R1bXAoYm9vbCBkaXNhYmxlX3RyYWNpbmcsIGVudW0gZnRyYWNlX2R1bXBfbW9kZSBvb3BzX2R1bXBfbW9kZSkKIHsKQEAgLTQ0NTQsOCArNDQ0MSwxMCBAQAogCWlmIChkaXNhYmxlX3RyYWNpbmcpCiAJCWZ0cmFjZV9raWxsKCk7CiAKKwl0cmFjZV9pbml0X2dsb2JhbF9pdGVyKCZpdGVyKTsKKwogCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkgewotCQlhdG9taWNfaW5jKCZnbG9iYWxfdHJhY2UuZGF0YVtjcHVdLT5kaXNhYmxlZCk7CisJCWF0b21pY19pbmMoJml0ZXIudHItPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwogCX0KIAogCW9sZF91c2Vyb2JqID0gdHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX1NZTV9VU0VST0JKOwpAQCAtNDUwNCw3ICs0NDkzLDcgQEAKIAkJaXRlci5pdGVyX2ZsYWdzIHw9IFRSQUNFX0ZJTEVfTEFUX0ZNVDsKIAkJaXRlci5wb3MgPSAtMTsKIAotCQlpZiAoZmluZF9uZXh0X2VudHJ5X2luYygmaXRlcikgIT0gTlVMTCkgeworCQlpZiAodHJhY2VfZmluZF9uZXh0X2VudHJ5X2luYygmaXRlcikgIT0gTlVMTCkgewogCQkJaW50IHJldDsKIAogCQkJcmV0ID0gcHJpbnRfdHJhY2VfbGluZSgmaXRlcik7CkBAIC00NTI2LDcgKzQ1MTUsNyBAQAogCQl0cmFjZV9mbGFncyB8PSBvbGRfdXNlcm9iajsKIAogCQlmb3JfZWFjaF90cmFjaW5nX2NwdShjcHUpIHsKLQkJCWF0b21pY19kZWMoJmdsb2JhbF90cmFjZS5kYXRhW2NwdV0tPmRpc2FibGVkKTsKKwkJCWF0b21pY19kZWMoJml0ZXIudHItPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwogCQl9CiAJCXRyYWNpbmdfb24oKTsKIAl9CkBAIC00NTc1LDE2ICs0NTY0LDE0IEBACiAKIAogI2lmZGVmIENPTkZJR19UUkFDRVJfTUFYX1RSQUNFCi0JbWF4X3RyLmJ1ZmZlciA9IHJpbmdfYnVmZmVyX2FsbG9jKHJpbmdfYnVmX3NpemUsCi0JCQkJCSAgICAgVFJBQ0VfQlVGRkVSX0ZMQUdTKTsKKwltYXhfdHIuYnVmZmVyID0gcmluZ19idWZmZXJfYWxsb2MoMSwgVFJBQ0VfQlVGRkVSX0ZMQUdTKTsKIAlpZiAoIW1heF90ci5idWZmZXIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ0cmFjZXI6IGZhaWxlZCB0byBhbGxvY2F0ZSBtYXggcmluZyBidWZmZXIhXG4iKTsKIAkJV0FSTl9PTigxKTsKIAkJcmluZ19idWZmZXJfZnJlZShnbG9iYWxfdHJhY2UuYnVmZmVyKTsKIAkJZ290byBvdXRfZnJlZV9jcHVtYXNrOwogCX0KLQltYXhfdHIuZW50cmllcyA9IHJpbmdfYnVmZmVyX3NpemUobWF4X3RyLmJ1ZmZlcik7Ci0JV0FSTl9PTihtYXhfdHIuZW50cmllcyAhPSBnbG9iYWxfdHJhY2UuZW50cmllcyk7CisJbWF4X3RyLmVudHJpZXMgPSAxOwogI2VuZGlmCiAKIAkvKiBBbGxvY2F0ZSB0aGUgZmlyc3QgcGFnZSBmb3IgYWxsIGJ1ZmZlcnMgKi8KQEAgLTQ1OTcsOSArNDU4NCw2IEBACiAKIAlyZWdpc3Rlcl90cmFjZXIoJm5vcF90cmFjZSk7CiAJY3VycmVudF90cmFjZSA9ICZub3BfdHJhY2U7Ci0jaWZkZWYgQ09ORklHX0JPT1RfVFJBQ0VSCi0JcmVnaXN0ZXJfdHJhY2VyKCZib290X3RyYWNlcik7Ci0jZW5kaWYKIAkvKiBBbGwgc2VlbXMgT0ssIGVuYWJsZSB0cmFjaW5nICovCiAJdHJhY2luZ19kaXNhYmxlZCA9IDA7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5oIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKaW5kZXggMmNkOTYzOS4uZDM5YjNjNSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKQEAgLTksMTAgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21taW90cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDx0cmFjZS9ib290Lmg+Ci0jaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaHdfYnJlYWtwb2ludC5oPgotCiAjaW5jbHVkZSA8bGludXgvdHJhY2Vfc2VxLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CiAKQEAgLTI1LDMwICsyMiwxNyBAQAogCVRSQUNFX1NUQUNLLAogCVRSQUNFX1BSSU5ULAogCVRSQUNFX0JQUklOVCwKLQlUUkFDRV9TUEVDSUFMLAogCVRSQUNFX01NSU9fUlcsCiAJVFJBQ0VfTU1JT19NQVAsCiAJVFJBQ0VfQlJBTkNILAotCVRSQUNFX0JPT1RfQ0FMTCwKLQlUUkFDRV9CT09UX1JFVCwKIAlUUkFDRV9HUkFQSF9SRVQsCiAJVFJBQ0VfR1JBUEhfRU5ULAogCVRSQUNFX1VTRVJfU1RBQ0ssCi0JVFJBQ0VfS01FTV9BTExPQywKLQlUUkFDRV9LTUVNX0ZSRUUsCiAJVFJBQ0VfQkxLLAotCVRSQUNFX0tTWU0sCiAKIAlfX1RSQUNFX0xBU1RfVFlQRSwKIH07CiAKLWVudW0ga21lbXRyYWNlX3R5cGVfaWQgewotCUtNRU1UUkFDRV9UWVBFX0tNQUxMT0MgPSAwLAkvKiBrbWFsbG9jKCkgb3Iga2ZyZWUoKS4gKi8KLQlLTUVNVFJBQ0VfVFlQRV9DQUNIRSwJCS8qIGttZW1fY2FjaGVfKigpLiAqLwotCUtNRU1UUkFDRV9UWVBFX1BBR0VTLAkJLyogX19nZXRfZnJlZV9wYWdlcygpIGFuZCBmcmllbmRzLiAqLwotfTsKLQotZXh0ZXJuIHN0cnVjdCB0cmFjZXIgYm9vdF90cmFjZXI7CiAKICN1bmRlZiBfX2ZpZWxkCiAjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCXR5cGUJaXRlbTsKQEAgLTIwNCwyMyArMTg4LDE1IEBACiAJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IHVzZXJzdGFja19lbnRyeSwgVFJBQ0VfVVNFUl9TVEFDSyk7XAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBwcmludF9lbnRyeSwgVFJBQ0VfUFJJTlQpOwlcCiAJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IGJwcmludF9lbnRyeSwgVFJBQ0VfQlBSSU5UKTsJXAotCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBzcGVjaWFsX2VudHJ5LCAwKTsJCVwKIAkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgdHJhY2VfbW1pb3RyYWNlX3J3LAkJXAogCQkJICBUUkFDRV9NTUlPX1JXKTsJCQkJXAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCB0cmFjZV9tbWlvdHJhY2VfbWFwLAkJXAogCQkJICBUUkFDRV9NTUlPX01BUCk7CQkJCVwKLQkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgdHJhY2VfYm9vdF9jYWxsLCBUUkFDRV9CT09UX0NBTEwpO1wKLQkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgdHJhY2VfYm9vdF9yZXQsIFRSQUNFX0JPT1RfUkVUKTtcCiAJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IHRyYWNlX2JyYW5jaCwgVFJBQ0VfQlJBTkNIKTsgXAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5LAlcCiAJCQkgIFRSQUNFX0dSQVBIX0VOVCk7CQlcCiAJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXRfZW50cnksCVwKIAkJCSAgVFJBQ0VfR1JBUEhfUkVUKTsJCVwKLQkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3Qga21lbXRyYWNlX2FsbG9jX2VudHJ5LAlcCi0JCQkgIFRSQUNFX0tNRU1fQUxMT0MpOwlcCi0JCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IGttZW10cmFjZV9mcmVlX2VudHJ5LAlcCi0JCQkgIFRSQUNFX0tNRU1fRlJFRSk7CVwKLQkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3Qga3N5bV90cmFjZV9lbnRyeSwgVFJBQ0VfS1NZTSk7XAogCQlfX2Z0cmFjZV9iYWRfdHlwZSgpOwkJCQkJXAogCX0gd2hpbGUgKDApCiAKQEAgLTI5OCw2ICsyNzQsNyBAQAogCXN0cnVjdCB0cmFjZXIJCSpuZXh0OwogCWludAkJCXByaW50X21heDsKIAlzdHJ1Y3QgdHJhY2VyX2ZsYWdzCSpmbGFnczsKKwlpbnQJCQl1c2VfbWF4X3RyOwogfTsKIAogCkBAIC0zMTgsNyArMjk1LDYgQEAKIAkJCQkgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcyk7CiAKIHN0cnVjdCBkZW50cnkgKnRyYWNpbmdfaW5pdF9kZW50cnkodm9pZCk7Ci12b2lkIGluaXRfdHJhY2VyX3N5c3Byb2ZfZGVidWdmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcik7CiAKIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudDsKIApAQCAtMzM4LDYgKzMxNCwxNCBAQAogc3RydWN0IHRyYWNlX2VudHJ5ICp0cmFjZV9maW5kX25leHRfZW50cnkoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAogCQkJCQkgIGludCAqZW50X2NwdSwgdTY0ICplbnRfdHMpOwogCitpbnQgdHJhY2VfZW1wdHkoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKKwordm9pZCAqdHJhY2VfZmluZF9uZXh0X2VudHJ5X2luYyhzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOworCit2b2lkIHRyYWNlX2luaXRfZ2xvYmFsX2l0ZXIoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKKwordm9pZCB0cmFjaW5nX2l0ZXJfcmVzZXQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLCBpbnQgY3B1KTsKKwogdm9pZCBkZWZhdWx0X3dhaXRfcGlwZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogdm9pZCBwb2xsX3dhaXRfcGlwZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogCkBAIC0zNTUsMTEgKzMzOSw2IEBACiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp3YWtlZSwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1ciwKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwotdm9pZCB0cmFjZV9zcGVjaWFsKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCi0JCSAgIHN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGEsCi0JCSAgIHVuc2lnbmVkIGxvbmcgYXJnMSwKLQkJICAgdW5zaWduZWQgbG9uZyBhcmcyLAotCQkgICB1bnNpZ25lZCBsb25nIGFyZzMsIGludCBwYyk7CiB2b2lkIHRyYWNlX2Z1bmN0aW9uKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCiAJCSAgICB1bnNpZ25lZCBsb25nIGlwLAogCQkgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXAsCkBAIC0zODAsOCArMzU5LDE1IEBACiBpbnQgcmVnaXN0ZXJfdHJhY2VyKHN0cnVjdCB0cmFjZXIgKnR5cGUpOwogdm9pZCB1bnJlZ2lzdGVyX3RyYWNlcihzdHJ1Y3QgdHJhY2VyICp0eXBlKTsKIGludCBpc190cmFjaW5nX3N0b3BwZWQodm9pZCk7CitlbnVtIHRyYWNlX2ZpbGVfdHlwZSB7CisJVFJBQ0VfRklMRV9MQVRfRk1UCT0gMSwKKwlUUkFDRV9GSUxFX0FOTk9UQVRFCT0gMiwKK307CiAKLWV4dGVybiBpbnQgcHJvY2Vzc19uZXdfa3N5bV9lbnRyeShjaGFyICprc3ltbmFtZSwgaW50IG9wLCB1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIGNwdW1hc2tfdmFyX3QgX19yZWFkX21vc3RseSB0cmFjaW5nX2J1ZmZlcl9tYXNrOworCisjZGVmaW5lIGZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkJXAorCWZvcl9lYWNoX2NwdShjcHUsIHRyYWNpbmdfYnVmZmVyX21hc2spCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG5zZWNzX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgbnNlY3MpOwogCkBAIC00NTIsMTIgKzQzOCw4IEBACiAJCQkJCSBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKIGV4dGVybiBpbnQgdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9zY2hlZF9zd2l0Y2goc3RydWN0IHRyYWNlciAqdHJhY2UsCiAJCQkJCSAgICAgICBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9zeXNwcm9mKHN0cnVjdCB0cmFjZXIgKnRyYWNlLAotCQkJCQkgICAgICAgc3RydWN0IHRyYWNlX2FycmF5ICp0cik7CiBleHRlcm4gaW50IHRyYWNlX3NlbGZ0ZXN0X3N0YXJ0dXBfYnJhbmNoKHN0cnVjdCB0cmFjZXIgKnRyYWNlLAogCQkJCQkgc3RydWN0IHRyYWNlX2FycmF5ICp0cik7Ci1leHRlcm4gaW50IHRyYWNlX3NlbGZ0ZXN0X3N0YXJ0dXBfa3N5bShzdHJ1Y3QgdHJhY2VyICp0cmFjZSwKLQkJCQkJIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpOwogI2VuZGlmIC8qIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUICovCiAKIGV4dGVybiB2b2lkICpoZWFkX3BhZ2Uoc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YSk7CkBAIC00NzEsNiArNDUzLDggQEAKIAkJICAgIHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIGludCB0cmFjZV9hcnJheV9wcmludGsoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3ZvaWQgdHJhY2VfcHJpbnRrX3NlcShzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKK2VudW0gcHJpbnRfbGluZV90IHByaW50X3RyYWNlX2xpbmUoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJhY2VfZmxhZ3M7CiAKQEAgLTYxNyw2ICs2MDEsNyBAQAogCVRSQUNFX0lURVJfTEFURU5DWV9GTVQJCT0gMHgyMDAwMCwKIAlUUkFDRV9JVEVSX1NMRUVQX1RJTUUJCT0gMHg0MDAwMCwKIAlUUkFDRV9JVEVSX0dSQVBIX1RJTUUJCT0gMHg4MDAwMCwKKwlUUkFDRV9JVEVSX1JFQ09SRF9DTUQJCT0gMHgxMDAwMDAsCiB9OwogCiAvKgpAQCAtNjI4LDU0ICs2MTMsNiBAQAogCiBleHRlcm4gc3RydWN0IHRyYWNlciBub3BfdHJhY2U7CiAKLS8qKgotICogZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSAtIGRpc2FibGUgcHJlZW1wdGlvbiBzY2hlZHVsZXIgc2FmZQotICoKLSAqIFdoZW4gdHJhY2luZyBjYW4gaGFwcGVuIGluc2lkZSB0aGUgc2NoZWR1bGVyLCB0aGVyZSBleGlzdHMKLSAqIGNhc2VzIHRoYXQgdGhlIHRyYWNpbmcgbWlnaHQgaGFwcGVuIGJlZm9yZSB0aGUgbmVlZF9yZXNjaGVkCi0gKiBmbGFnIGlzIGNoZWNrZWQuIElmIHRoaXMgaGFwcGVucyBhbmQgdGhlIHRyYWNlciBjYWxscwotICogcHJlZW1wdF9lbmFibGUgKGFmdGVyIGEgZGlzYWJsZSksIGEgc2NoZWR1bGUgbWlnaHQgdGFrZSBwbGFjZQotICogY2F1c2luZyBhbiBpbmZpbml0ZSByZWN1cnNpb24uCi0gKgotICogVG8gcHJldmVudCB0aGlzLCB3ZSByZWFkIHRoZSBuZWVkX3Jlc2NoZWQgZmxhZyBiZWZvcmUKLSAqIGRpc2FibGluZyBwcmVlbXB0aW9uLiBXaGVuIHdlIHdhbnQgdG8gZW5hYmxlIHByZWVtcHRpb24gd2UKLSAqIGNoZWNrIHRoZSBmbGFnLCBpZiBpdCBpcyBzZXQsIHRoZW4gd2UgY2FsbCBwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkLgotICogT3RoZXJ3aXNlLCB3ZSBjYWxsIHByZWVtcHRfZW5hYmxlLgotICoKLSAqIFRoZSByYXRpb25hbCBmb3IgZG9pbmcgdGhlIGFib3ZlIGlzIHRoYXQgaWYgbmVlZF9yZXNjaGVkIGlzIHNldAotICogYW5kIHdlIGhhdmUgeWV0IHRvIHJlc2NoZWR1bGUsIHdlIGFyZSBlaXRoZXIgaW4gYW4gYXRvbWljIGxvY2F0aW9uCi0gKiAod2hlcmUgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgZm9yIHNjaGVkdWxpbmcpIG9yIHdlIGFyZSBpbnNpZGUKLSAqIHRoZSBzY2hlZHVsZXIgYW5kIGRvIG5vdCB3YW50IHRvIHJlc2NoZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZ0cmFjZV9wcmVlbXB0X2Rpc2FibGUodm9pZCkKLXsKLQlpbnQgcmVzY2hlZDsKLQotCXJlc2NoZWQgPSBuZWVkX3Jlc2NoZWQoKTsKLQlwcmVlbXB0X2Rpc2FibGVfbm90cmFjZSgpOwotCi0JcmV0dXJuIHJlc2NoZWQ7Ci19Ci0KLS8qKgotICogZnRyYWNlX3ByZWVtcHRfZW5hYmxlIC0gZW5hYmxlIHByZWVtcHRpb24gc2NoZWR1bGVyIHNhZmUKLSAqIEByZXNjaGVkOiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZQotICoKLSAqIFRoaXMgaXMgYSBzY2hlZHVsZXIgc2FmZSB3YXkgdG8gZW5hYmxlIHByZWVtcHRpb24gYW5kIG5vdCBtaXNzCi0gKiBhbnkgcHJlZW1wdGlvbiBjaGVja3MuIFRoZSBkaXNhYmxlZCBzYXZlZCB0aGUgc3RhdGUgb2YgcHJlZW1wdGlvbi4KLSAqIElmIHJlc2NoZWQgaXMgc2V0LCB0aGVuIHdlIGFyZSBlaXRoZXIgaW5zaWRlIGFuIGF0b21pYyBvcgotICogYXJlIGluc2lkZSB0aGUgc2NoZWR1bGVyICh3ZSB3b3VsZCBoYXZlIGFscmVhZHkgc2NoZWR1bGVkCi0gKiBvdGhlcndpc2UpLiBJbiB0aGlzIGNhc2UsIHdlIGRvIG5vdCB3YW50IHRvIGNhbGwgbm9ybWFsCi0gKiBwcmVlbXB0X2VuYWJsZSwgYnV0IHByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQgaW5zdGVhZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9wcmVlbXB0X2VuYWJsZShpbnQgcmVzY2hlZCkKLXsKLQlpZiAocmVzY2hlZCkKLQkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZF9ub3RyYWNlKCk7Ci0JZWxzZQotCQlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfQlJBTkNIX1RSQUNFUgogZXh0ZXJuIGludCBlbmFibGVfYnJhbmNoX3RyYWNpbmcoc3RydWN0IHRyYWNlX2FycmF5ICp0cik7CiBleHRlcm4gdm9pZCBkaXNhYmxlX2JyYW5jaF90cmFjaW5nKHZvaWQpOwpAQCAtNzY2LDYgKzcwMyw4IEBACiAJaW50IAkJCXBvcF9uOwogfTsKIAorZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZnRyYWNlX2NvbW1vbl9maWVsZHM7CisKIGV4dGVybiBlbnVtIHJlZ2V4X3R5cGUKIGZpbHRlcl9wYXJzZV9yZWdleChjaGFyICpidWZmLCBpbnQgbGVuLCBjaGFyICoqc2VhcmNoLCBpbnQgKm5vdCk7CiBleHRlcm4gdm9pZCBwcmludF9ldmVudF9maWx0ZXIoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLApAQCAtNzk1LDYgKzczNCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK2V4dGVybiB2b2lkIHRyYWNlX2V2ZW50X2VuYWJsZV9jbWRfcmVjb3JkKGJvb2wgZW5hYmxlKTsKKwogZXh0ZXJuIHN0cnVjdCBtdXRleCBldmVudF9tdXRleDsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGZ0cmFjZV9ldmVudHM7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ib290LmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfYm9vdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjFkNWYzLi4wMDAwMDAwCi0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ib290LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIHJpbmcgYnVmZmVyIGJhc2VkIGluaXRjYWxscyB0cmFjZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLQotI2luY2x1ZGUgInRyYWNlLmgiCi0jaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCi0KLXN0YXRpYyBzdHJ1Y3QgdHJhY2VfYXJyYXkgKmJvb3RfdHJhY2U7Ci1zdGF0aWMgYm9vbCBwcmVfaW5pdGNhbGxzX2ZpbmlzaGVkOwotCi0vKiBUZWxscyB0aGUgYm9vdCB0cmFjZXIgdGhhdCB0aGUgcHJlX3NtcF9pbml0Y2FsbHMgYXJlIGZpbmlzaGVkLgotICogU28gd2UgYXJlIHJlYWR5IC4KLSAqIEl0IGRvZXNuJ3QgZW5hYmxlIHNjaGVkIGV2ZW50cyB0cmFjaW5nIGhvd2V2ZXIuCi0gKiBZb3UgaGF2ZSB0byBjYWxsIGVuYWJsZV9ib290X3RyYWNlIHRvIGRvIHNvLgotICovCi12b2lkIHN0YXJ0X2Jvb3RfdHJhY2Uodm9pZCkKLXsKLQlwcmVfaW5pdGNhbGxzX2ZpbmlzaGVkID0gdHJ1ZTsKLX0KLQotdm9pZCBlbmFibGVfYm9vdF90cmFjZSh2b2lkKQotewotCWlmIChib290X3RyYWNlICYmIHByZV9pbml0Y2FsbHNfZmluaXNoZWQpCi0JCXRyYWNpbmdfc3RhcnRfc2NoZWRfc3dpdGNoX3JlY29yZCgpOwotfQotCi12b2lkIGRpc2FibGVfYm9vdF90cmFjZSh2b2lkKQotewotCWlmIChib290X3RyYWNlICYmIHByZV9pbml0Y2FsbHNfZmluaXNoZWQpCi0JCXRyYWNpbmdfc3RvcF9zY2hlZF9zd2l0Y2hfcmVjb3JkKCk7Ci19Ci0KLXN0YXRpYyBpbnQgYm9vdF90cmFjZV9pbml0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0JYm9vdF90cmFjZSA9IHRyOwotCi0JaWYgKCF0cikKLQkJcmV0dXJuIDA7Ci0KLQl0cmFjaW5nX3Jlc2V0X29ubGluZV9jcHVzKHRyKTsKLQotCXRyYWNpbmdfc2NoZWRfc3dpdGNoX2Fzc2lnbl90cmFjZSh0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBlbnVtIHByaW50X2xpbmVfdAotaW5pdGNhbGxfY2FsbF9wcmludF9saW5lKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKLXsKLQlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5ID0gaXRlci0+ZW50OwotCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwotCXN0cnVjdCB0cmFjZV9ib290X2NhbGwgKmZpZWxkOwotCXN0cnVjdCBib290X3RyYWNlX2NhbGwgKmNhbGw7Ci0JdTY0IHRzOwotCXVuc2lnbmVkIGxvbmcgbnNlY19yZW07Ci0JaW50IHJldDsKLQotCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBlbnRyeSk7Ci0JY2FsbCA9ICZmaWVsZC0+Ym9vdF9jYWxsOwotCXRzID0gaXRlci0+dHM7Ci0JbnNlY19yZW0gPSBkb19kaXYodHMsIE5TRUNfUEVSX1NFQyk7Ci0KLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJbJTVsZC4lMDlsZF0gY2FsbGluZyAgJXMgQCAlaVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKXRzLCBuc2VjX3JlbSwgY2FsbC0+ZnVuYywgY2FsbC0+Y2FsbGVyKTsKLQotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0JZWxzZQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwotfQotCi1zdGF0aWMgZW51bSBwcmludF9saW5lX3QKLWluaXRjYWxsX3JldF9wcmludF9saW5lKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKLXsKLQlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5ID0gaXRlci0+ZW50OwotCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwotCXN0cnVjdCB0cmFjZV9ib290X3JldCAqZmllbGQ7Ci0Jc3RydWN0IGJvb3RfdHJhY2VfcmV0ICppbml0X3JldDsKLQl1NjQgdHM7Ci0JdW5zaWduZWQgbG9uZyBuc2VjX3JlbTsKLQlpbnQgcmV0OwotCi0JdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGVudHJ5KTsKLQlpbml0X3JldCA9ICZmaWVsZC0+Ym9vdF9yZXQ7Ci0JdHMgPSBpdGVyLT50czsKLQluc2VjX3JlbSA9IGRvX2Rpdih0cywgTlNFQ19QRVJfU0VDKTsKLQotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlslNWxkLiUwOWxkXSBpbml0Y2FsbCAlcyAiCi0JCQkicmV0dXJuZWQgJWQgYWZ0ZXIgJWxsdSBtc2Vjc1xuIiwKLQkJCSh1bnNpZ25lZCBsb25nKSB0cywKLQkJCW5zZWNfcmVtLAotCQkJaW5pdF9yZXQtPmZ1bmMsIGluaXRfcmV0LT5yZXN1bHQsIGluaXRfcmV0LT5kdXJhdGlvbik7Ci0KLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCWVsc2UKLQkJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90IGluaXRjYWxsX3ByaW50X2xpbmUoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQotewotCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnkgPSBpdGVyLT5lbnQ7Ci0KLQlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0JY2FzZSBUUkFDRV9CT09UX0NBTEw6Ci0JCXJldHVybiBpbml0Y2FsbF9jYWxsX3ByaW50X2xpbmUoaXRlcik7Ci0JY2FzZSBUUkFDRV9CT09UX1JFVDoKLQkJcmV0dXJuIGluaXRjYWxsX3JldF9wcmludF9saW5lKGl0ZXIpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBUUkFDRV9UWVBFX1VOSEFORExFRDsKLQl9Ci19Ci0KLXN0cnVjdCB0cmFjZXIgYm9vdF90cmFjZXIgX19yZWFkX21vc3RseSA9Ci17Ci0JLm5hbWUJCT0gImluaXRjYWxsIiwKLQkuaW5pdAkJPSBib290X3RyYWNlX2luaXQsCi0JLnJlc2V0CQk9IHRyYWNpbmdfcmVzZXRfb25saW5lX2NwdXMsCi0JLnByaW50X2xpbmUJPSBpbml0Y2FsbF9wcmludF9saW5lLAotfTsKLQotdm9pZCB0cmFjZV9ib290X2NhbGwoc3RydWN0IGJvb3RfdHJhY2VfY2FsbCAqYnQsIGluaXRjYWxsX3QgZm4pCi17Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2Jvb3RfY2FsbDsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCB0cmFjZV9ib290X2NhbGwgKmVudHJ5OwotCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBib290X3RyYWNlOwotCi0JaWYgKCF0ciB8fCAhcHJlX2luaXRjYWxsc19maW5pc2hlZCkKLQkJcmV0dXJuOwotCi0JLyogR2V0IGl0cyBuYW1lIG5vdyBzaW5jZSB0aGlzIGZ1bmN0aW9uIGNvdWxkCi0JICogZGlzYXBwZWFyIGJlY2F1c2UgaXQgaXMgaW4gdGhlIC5pbml0IHNlY3Rpb24uCi0JICovCi0Jc3ByaW50X3N5bWJvbChidC0+ZnVuYywgKHVuc2lnbmVkIGxvbmcpZm4pOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCi0JYnVmZmVyID0gdHItPmJ1ZmZlcjsKLQlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9CT09UX0NBTEwsCi0JCQkJCSAgc2l6ZW9mKCplbnRyeSksIDAsIDApOwotCWlmICghZXZlbnQpCi0JCWdvdG8gb3V0OwotCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7Ci0JZW50cnktPmJvb3RfY2FsbCA9ICpidDsKLQlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCBidWZmZXIsIGV2ZW50KSkKLQkJdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCwgMCwgMCk7Ci0gb3V0OgotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXZvaWQgdHJhY2VfYm9vdF9yZXQoc3RydWN0IGJvb3RfdHJhY2VfcmV0ICpidCwgaW5pdGNhbGxfdCBmbikKLXsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfYm9vdF9yZXQ7Ci0Jc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKLQlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcjsKLQlzdHJ1Y3QgdHJhY2VfYm9vdF9yZXQgKmVudHJ5OwotCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBib290X3RyYWNlOwotCi0JaWYgKCF0ciB8fCAhcHJlX2luaXRjYWxsc19maW5pc2hlZCkKLQkJcmV0dXJuOwotCi0Jc3ByaW50X3N5bWJvbChidC0+ZnVuYywgKHVuc2lnbmVkIGxvbmcpZm4pOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCi0JYnVmZmVyID0gdHItPmJ1ZmZlcjsKLQlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9CT09UX1JFVCwKLQkJCQkJICBzaXplb2YoKmVudHJ5KSwgMCwgMCk7Ci0JaWYgKCFldmVudCkKLQkJZ290byBvdXQ7Ci0JZW50cnkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKLQllbnRyeS0+Ym9vdF9yZXQgPSAqYnQ7Ci0JaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgYnVmZmVyLCBldmVudCkpCi0JCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KGJ1ZmZlciwgZXZlbnQsIDAsIDApOwotIG91dDoKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2Nsb2NrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfY2xvY2suYwppbmRleCA5ZDU4OWQ4Li42ODVhNjdkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfY2xvY2suYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfY2xvY2suYwpAQCAtMzIsMTYgKzMyLDE1IEBACiB1NjQgbm90cmFjZSB0cmFjZV9jbG9ja19sb2NhbCh2b2lkKQogewogCXU2NCBjbG9jazsKLQlpbnQgcmVzY2hlZDsKIAogCS8qCiAJICogc2NoZWRfY2xvY2soKSBpcyBhbiBhcmNoaXRlY3R1cmUgaW1wbGVtZW50ZWQsIGZhc3QsIHNjYWxhYmxlLAogCSAqIGxvY2tsZXNzIGNsb2NrLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb2hlcmVudCBhY3Jvc3MKIAkgKiBDUFVzLCBub3IgYWNyb3NzIENQVSBpZGxlIGV2ZW50cy4KIAkgKi8KLQlyZXNjaGVkID0gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSgpOworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CiAJY2xvY2sgPSBzY2hlZF9jbG9jaygpOwotCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShyZXNjaGVkKTsKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7CiAKIAlyZXR1cm4gY2xvY2s7CiB9CkBAIC01Niw3ICs1NSw3IEBACiAgKi8KIHU2NCBub3RyYWNlIHRyYWNlX2Nsb2NrKHZvaWQpCiB7Ci0JcmV0dXJuIGNwdV9jbG9jayhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlyZXR1cm4gbG9jYWxfY2xvY2soKTsKIH0KIAogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oIGIva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaAppbmRleCBkYzAwOGMxLi5lM2RmZWNhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmgKQEAgLTE1MSwyMyArMTUxLDYgQEAKICk7CiAKIC8qCi0gKiBTcGVjaWFsIChmcmVlLWZvcm0pIHRyYWNlIGVudHJ5OgotICovCi1GVFJBQ0VfRU5UUlkoc3BlY2lhbCwgc3BlY2lhbF9lbnRyeSwKLQotCVRSQUNFX1NQRUNJQUwsCi0KLQlGX1NUUlVDVCgKLQkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJYXJnMQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCWFyZzIJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAlhcmczCSkKLQkpLAotCi0JRl9wcmludGsoIiglMDhseCkgKCUwOGx4KSAoJTA4bHgpIiwKLQkJIF9fZW50cnktPmFyZzEsIF9fZW50cnktPmFyZzIsIF9fZW50cnktPmFyZzMpCi0pOwotCi0vKgogICogU3RhY2stdHJhY2UgZW50cnk6CiAgKi8KIApAQCAtMjcxLDMzICsyNTQsNiBAQAogCQkgX19lbnRyeS0+bWFwX2lkLCBfX2VudHJ5LT5vcGNvZGUpCiApOwogCi1GVFJBQ0VfRU5UUlkoYm9vdF9jYWxsLCB0cmFjZV9ib290X2NhbGwsCi0KLQlUUkFDRV9CT09UX0NBTEwsCi0KLQlGX1NUUlVDVCgKLQkJX19maWVsZF9zdHJ1Y3QoCXN0cnVjdCBib290X3RyYWNlX2NhbGwsCWJvb3RfY2FsbAkpCi0JCV9fZmllbGRfZGVzYygJcGlkX3QsCWJvb3RfY2FsbCwJY2FsbGVyCQkpCi0JCV9fYXJyYXlfZGVzYygJY2hhciwJYm9vdF9jYWxsLAlmdW5jLAlLU1lNX1NZTUJPTF9MRU4pCi0JKSwKLQotCUZfcHJpbnRrKCIlZCAgJXMiLCBfX2VudHJ5LT5jYWxsZXIsIF9fZW50cnktPmZ1bmMpCi0pOwotCi1GVFJBQ0VfRU5UUlkoYm9vdF9yZXQsIHRyYWNlX2Jvb3RfcmV0LAotCi0JVFJBQ0VfQk9PVF9SRVQsCi0KLQlGX1NUUlVDVCgKLQkJX19maWVsZF9zdHJ1Y3QoCXN0cnVjdCBib290X3RyYWNlX3JldCwJYm9vdF9yZXQJKQotCQlfX2FycmF5X2Rlc2MoCWNoYXIsCWJvb3RfcmV0LAlmdW5jLAlLU1lNX1NZTUJPTF9MRU4pCi0JCV9fZmllbGRfZGVzYygJaW50LAlib290X3JldCwJcmVzdWx0CQkpCi0JCV9fZmllbGRfZGVzYygJdW5zaWduZWQgbG9uZywgYm9vdF9yZXQsIGR1cmF0aW9uCSkKLQkpLAotCi0JRl9wcmludGsoIiVzICVkICVseCIsCi0JCSBfX2VudHJ5LT5mdW5jLCBfX2VudHJ5LT5yZXN1bHQsIF9fZW50cnktPmR1cmF0aW9uKQotKTsKIAogI2RlZmluZSBUUkFDRV9GVU5DX1NJWkUgMzAKICNkZWZpbmUgVFJBQ0VfRklMRV9TSVpFIDIwCkBAIC0zMTgsNTMgKzI3NCwzIEBACiAJCSBfX2VudHJ5LT5mdW5jLCBfX2VudHJ5LT5maWxlLCBfX2VudHJ5LT5jb3JyZWN0KQogKTsKIAotRlRSQUNFX0VOVFJZKGttZW1fYWxsb2MsIGttZW10cmFjZV9hbGxvY19lbnRyeSwKLQotCVRSQUNFX0tNRU1fQUxMT0MsCi0KLQlGX1NUUlVDVCgKLQkJX19maWVsZCgJZW51bSBrbWVtdHJhY2VfdHlwZV9pZCwJdHlwZV9pZAkJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAkJY2FsbF9zaXRlCSkKLQkJX19maWVsZCgJY29uc3Qgdm9pZCAqLAkJcHRyCQkpCi0JCV9fZmllbGQoCXNpemVfdCwJCQlieXRlc19yZXEJKQotCQlfX2ZpZWxkKAlzaXplX3QsCQkJYnl0ZXNfYWxsb2MJKQotCQlfX2ZpZWxkKAlnZnBfdCwJCQlnZnBfZmxhZ3MJKQotCQlfX2ZpZWxkKAlpbnQsCQkJbm9kZQkJKQotCSksCi0KLQlGX3ByaW50aygidHlwZToldSBjYWxsX3NpdGU6JWx4IHB0cjolcCByZXE6JXppIGFsbG9jOiV6aSIKLQkJICIgZmxhZ3M6JXggbm9kZTolZCIsCi0JCSBfX2VudHJ5LT50eXBlX2lkLCBfX2VudHJ5LT5jYWxsX3NpdGUsIF9fZW50cnktPnB0ciwKLQkJIF9fZW50cnktPmJ5dGVzX3JlcSwgX19lbnRyeS0+Ynl0ZXNfYWxsb2MsCi0JCSBfX2VudHJ5LT5nZnBfZmxhZ3MsIF9fZW50cnktPm5vZGUpCi0pOwotCi1GVFJBQ0VfRU5UUlkoa21lbV9mcmVlLCBrbWVtdHJhY2VfZnJlZV9lbnRyeSwKLQotCVRSQUNFX0tNRU1fRlJFRSwKLQotCUZfU1RSVUNUKAotCQlfX2ZpZWxkKAllbnVtIGttZW10cmFjZV90eXBlX2lkLAl0eXBlX2lkCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCQljYWxsX3NpdGUJKQotCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCQlwdHIJCSkKLQkpLAotCi0JRl9wcmludGsoInR5cGU6JXUgY2FsbF9zaXRlOiVseCBwdHI6JXAiLAotCQkgX19lbnRyeS0+dHlwZV9pZCwgX19lbnRyeS0+Y2FsbF9zaXRlLCBfX2VudHJ5LT5wdHIpCi0pOwotCi1GVFJBQ0VfRU5UUlkoa3N5bV90cmFjZSwga3N5bV90cmFjZV9lbnRyeSwKLQotCVRSQUNFX0tTWU0sCi0KLQlGX1NUUlVDVCgKLQkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJaXAJCQkgICkKLQkJX19maWVsZCgJdW5zaWduZWQgY2hhciwJdHlwZQkJCSAgKQotCQlfX2FycmF5KAljaGFyCSAgICAgLAljbWQsCSAgIFRBU0tfQ09NTV9MRU4gICkKLQkJX19maWVsZCgJdW5zaWduZWQgbG9uZywgIGFkZHIJCQkgICkKLQkpLAotCi0JRl9wcmludGsoImlwOiAlcEYgdHlwZTogJWQga3N5bV9uYW1lOiAlcFMgY21kOiAlcyIsCi0JCSh2b2lkICopX19lbnRyeS0+aXAsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+dHlwZSwKLQkJKHZvaWQgKilfX2VudHJ5LT5hZGRyLCAgX19lbnRyeS0+Y21kKQotKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcGVyZi5jCmluZGV4IDhhMmI3M2YuLjAwMGU2ZTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3BlcmYuYwpAQCAtOSw4ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSAidHJhY2UuaCIKIAotRVhQT1JUX1NZTUJPTF9HUEwocGVyZl9hcmNoX2ZldGNoX2NhbGxlcl9yZWdzKTsKLQogc3RhdGljIGNoYXIgKnBlcmZfdHJhY2VfYnVmWzRdOwogCiAvKgpAQCAtNTYsMTMgKzU0LDcgQEAKIAkJfQogCX0KIAotCWlmICh0cF9ldmVudC0+Y2xhc3MtPnJlZykKLQkJcmV0ID0gdHBfZXZlbnQtPmNsYXNzLT5yZWcodHBfZXZlbnQsIFRSQUNFX1JFR19QRVJGX1JFR0lTVEVSKTsKLQllbHNlCi0JCXJldCA9IHRyYWNlcG9pbnRfcHJvYmVfcmVnaXN0ZXIodHBfZXZlbnQtPm5hbWUsCi0JCQkJCQl0cF9ldmVudC0+Y2xhc3MtPnBlcmZfcHJvYmUsCi0JCQkJCQl0cF9ldmVudCk7Ci0KKwlyZXQgPSB0cF9ldmVudC0+Y2xhc3MtPnJlZyh0cF9ldmVudCwgVFJBQ0VfUkVHX1BFUkZfUkVHSVNURVIpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbDsKIApAQCAtOTYsOSArODgsNyBAQAogCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRwX2V2ZW50LCAmZnRyYWNlX2V2ZW50cywgbGlzdCkgewogCQlpZiAodHBfZXZlbnQtPmV2ZW50LnR5cGUgPT0gZXZlbnRfaWQgJiYKLQkJICAgIHRwX2V2ZW50LT5jbGFzcyAmJgotCQkgICAgKHRwX2V2ZW50LT5jbGFzcy0+cGVyZl9wcm9iZSB8fAotCQkgICAgIHRwX2V2ZW50LT5jbGFzcy0+cmVnKSAmJgorCQkgICAgdHBfZXZlbnQtPmNsYXNzICYmIHRwX2V2ZW50LT5jbGFzcy0+cmVnICYmCiAJCSAgICB0cnlfbW9kdWxlX2dldCh0cF9ldmVudC0+bW9kKSkgewogCQkJcmV0ID0gcGVyZl90cmFjZV9ldmVudF9pbml0KHRwX2V2ZW50LCBwX2V2ZW50KTsKIAkJCWJyZWFrOwpAQCAtMTM4LDE4ICsxMjgsMTMgQEAKIAlpZiAoLS10cF9ldmVudC0+cGVyZl9yZWZjb3VudCA+IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKHRwX2V2ZW50LT5jbGFzcy0+cmVnKQotCQl0cF9ldmVudC0+Y2xhc3MtPnJlZyh0cF9ldmVudCwgVFJBQ0VfUkVHX1BFUkZfVU5SRUdJU1RFUik7Ci0JZWxzZQotCQl0cmFjZXBvaW50X3Byb2JlX3VucmVnaXN0ZXIodHBfZXZlbnQtPm5hbWUsCi0JCQkJCSAgICB0cF9ldmVudC0+Y2xhc3MtPnBlcmZfcHJvYmUsCi0JCQkJCSAgICB0cF9ldmVudCk7CisJdHBfZXZlbnQtPmNsYXNzLT5yZWcodHBfZXZlbnQsIFRSQUNFX1JFR19QRVJGX1VOUkVHSVNURVIpOwogCiAJLyoKLQkgKiBFbnN1cmUgb3VyIGNhbGxiYWNrIHdvbid0IGJlIGNhbGxlZCBhbnltb3JlLiBTZWUKLQkgKiB0cmFjZXBvaW50X3Byb2JlX3VucmVnaXN0ZXIoKSBhbmQgX19ET19UUkFDRSgpLgorCSAqIEVuc3VyZSBvdXIgY2FsbGJhY2sgd29uJ3QgYmUgY2FsbGVkIGFueW1vcmUuIFRoZSBidWZmZXJzCisJICogd2lsbCBiZSBmcmVlZCBhZnRlciB0aGF0LgogCSAqLwotCXN5bmNocm9uaXplX3NjaGVkKCk7CisJdHJhY2Vwb2ludF9zeW5jaHJvbml6ZV91bnJlZ2lzdGVyKCk7CiAKIAlmcmVlX3BlcmNwdSh0cF9ldmVudC0+cGVyZl9ldmVudHMpOwogCXRwX2V2ZW50LT5wZXJmX2V2ZW50cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKaW5kZXggNTNjZmZjMC4uMDliNGZhNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwpAQCAtMjgsNiArMjgsNyBAQAogREVGSU5FX01VVEVYKGV2ZW50X211dGV4KTsKIAogTElTVF9IRUFEKGZ0cmFjZV9ldmVudHMpOworTElTVF9IRUFEKGZ0cmFjZV9jb21tb25fZmllbGRzKTsKIAogc3RydWN0IGxpc3RfaGVhZCAqCiB0cmFjZV9nZXRfZmllbGRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnRfY2FsbCkKQEAgLTM3LDE1ICszOCwxMSBAQAogCXJldHVybiBldmVudF9jYWxsLT5jbGFzcy0+Z2V0X2ZpZWxkcyhldmVudF9jYWxsKTsKIH0KIAotaW50IHRyYWNlX2RlZmluZV9maWVsZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIGNvbnN0IGNoYXIgKnR5cGUsCi0JCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgaW50IGlzX3NpZ25lZCwKLQkJICAgICAgIGludCBmaWx0ZXJfdHlwZSkKK3N0YXRpYyBpbnQgX190cmFjZV9kZWZpbmVfZmllbGQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgY29uc3QgY2hhciAqdHlwZSwKKwkJCQljb25zdCBjaGFyICpuYW1lLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwKKwkJCQlpbnQgaXNfc2lnbmVkLCBpbnQgZmlsdGVyX3R5cGUpCiB7CiAJc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqZmllbGQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKLQotCWlmIChXQVJOX09OKCFjYWxsLT5jbGFzcykpCi0JCXJldHVybiAwOwogCiAJZmllbGQgPSBremFsbG9jKHNpemVvZigqZmllbGQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZpZWxkKQpAQCAtNjgsNyArNjUsNiBAQAogCWZpZWxkLT5zaXplID0gc2l6ZTsKIAlmaWVsZC0+aXNfc2lnbmVkID0gaXNfc2lnbmVkOwogCi0JaGVhZCA9IHRyYWNlX2dldF9maWVsZHMoY2FsbCk7CiAJbGlzdF9hZGQoJmZpZWxkLT5saW5rLCBoZWFkKTsKIAogCXJldHVybiAwOwpAQCAtODAsMTcgKzc2LDMyIEBACiAKIAlyZXR1cm4gLUVOT01FTTsKIH0KKworaW50IHRyYWNlX2RlZmluZV9maWVsZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIGNvbnN0IGNoYXIgKnR5cGUsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgaW50IGlzX3NpZ25lZCwKKwkJICAgICAgIGludCBmaWx0ZXJfdHlwZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCisJaWYgKFdBUk5fT04oIWNhbGwtPmNsYXNzKSkKKwkJcmV0dXJuIDA7CisKKwloZWFkID0gdHJhY2VfZ2V0X2ZpZWxkcyhjYWxsKTsKKwlyZXR1cm4gX190cmFjZV9kZWZpbmVfZmllbGQoaGVhZCwgdHlwZSwgbmFtZSwgb2Zmc2V0LCBzaXplLAorCQkJCSAgICBpc19zaWduZWQsIGZpbHRlcl90eXBlKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX2RlZmluZV9maWVsZCk7CiAKICNkZWZpbmUgX19jb21tb25fZmllbGQodHlwZSwgaXRlbSkJCQkJCVwKLQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoY2FsbCwgI3R5cGUsICJjb21tb25fIiAjaXRlbSwJCVwKLQkJCQkgb2Zmc2V0b2YodHlwZW9mKGVudCksIGl0ZW0pLAkJXAotCQkJCSBzaXplb2YoZW50Lml0ZW0pLAkJCVwKLQkJCQkgaXNfc2lnbmVkX3R5cGUodHlwZSksIEZJTFRFUl9PVEhFUik7CVwKKwlyZXQgPSBfX3RyYWNlX2RlZmluZV9maWVsZCgmZnRyYWNlX2NvbW1vbl9maWVsZHMsICN0eXBlLAlcCisJCQkJICAgImNvbW1vbl8iICNpdGVtLAkJCVwKKwkJCQkgICBvZmZzZXRvZih0eXBlb2YoZW50KSwgaXRlbSksCQlcCisJCQkJICAgc2l6ZW9mKGVudC5pdGVtKSwJCQlcCisJCQkJICAgaXNfc2lnbmVkX3R5cGUodHlwZSksIEZJTFRFUl9PVEhFUik7CVwKIAlpZiAocmV0KQkJCQkJCQlcCiAJCXJldHVybiByZXQ7CiAKLXN0YXRpYyBpbnQgdHJhY2VfZGVmaW5lX2NvbW1vbl9maWVsZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQorc3RhdGljIGludCB0cmFjZV9kZWZpbmVfY29tbW9uX2ZpZWxkcyh2b2lkKQogewogCWludCByZXQ7CiAJc3RydWN0IHRyYWNlX2VudHJ5IGVudDsKQEAgLTEzMCw2ICsxNDEsNTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX2V2ZW50X3Jhd19pbml0KTsKIAoraW50IGZ0cmFjZV9ldmVudF9yZWcoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBlbnVtIHRyYWNlX3JlZyB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVFJBQ0VfUkVHX1JFR0lTVEVSOgorCQlyZXR1cm4gdHJhY2Vwb2ludF9wcm9iZV9yZWdpc3RlcihjYWxsLT5uYW1lLAorCQkJCQkJIGNhbGwtPmNsYXNzLT5wcm9iZSwKKwkJCQkJCSBjYWxsKTsKKwljYXNlIFRSQUNFX1JFR19VTlJFR0lTVEVSOgorCQl0cmFjZXBvaW50X3Byb2JlX3VucmVnaXN0ZXIoY2FsbC0+bmFtZSwKKwkJCQkJICAgIGNhbGwtPmNsYXNzLT5wcm9iZSwKKwkJCQkJICAgIGNhbGwpOworCQlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUworCWNhc2UgVFJBQ0VfUkVHX1BFUkZfUkVHSVNURVI6CisJCXJldHVybiB0cmFjZXBvaW50X3Byb2JlX3JlZ2lzdGVyKGNhbGwtPm5hbWUsCisJCQkJCQkgY2FsbC0+Y2xhc3MtPnBlcmZfcHJvYmUsCisJCQkJCQkgY2FsbCk7CisJY2FzZSBUUkFDRV9SRUdfUEVSRl9VTlJFR0lTVEVSOgorCQl0cmFjZXBvaW50X3Byb2JlX3VucmVnaXN0ZXIoY2FsbC0+bmFtZSwKKwkJCQkJICAgIGNhbGwtPmNsYXNzLT5wZXJmX3Byb2JlLAorCQkJCQkgICAgY2FsbCk7CisJCXJldHVybiAwOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnRyYWNlX2V2ZW50X3JlZyk7CisKK3ZvaWQgdHJhY2VfZXZlbnRfZW5hYmxlX2NtZF9yZWNvcmQoYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOworCisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJaWYgKCEoY2FsbC0+ZmxhZ3MgJiBUUkFDRV9FVkVOVF9GTF9FTkFCTEVEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChlbmFibGUpIHsKKwkJCXRyYWNpbmdfc3RhcnRfY21kbGluZV9yZWNvcmQoKTsKKwkJCWNhbGwtPmZsYWdzIHw9IFRSQUNFX0VWRU5UX0ZMX1JFQ09SREVEX0NNRDsKKwkJfSBlbHNlIHsKKwkJCXRyYWNpbmdfc3RvcF9jbWRsaW5lX3JlY29yZCgpOworCQkJY2FsbC0+ZmxhZ3MgJj0gflRSQUNFX0VWRU5UX0ZMX1JFQ09SREVEX0NNRDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKK30KKwogc3RhdGljIGludCBmdHJhY2VfZXZlbnRfZW5hYmxlX2Rpc2FibGUoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAogCQkJCQlpbnQgZW5hYmxlKQogewpAQCAtMTM5LDI0ICsxOTksMjAgQEAKIAljYXNlIDA6CiAJCWlmIChjYWxsLT5mbGFncyAmIFRSQUNFX0VWRU5UX0ZMX0VOQUJMRUQpIHsKIAkJCWNhbGwtPmZsYWdzICY9IH5UUkFDRV9FVkVOVF9GTF9FTkFCTEVEOwotCQkJdHJhY2luZ19zdG9wX2NtZGxpbmVfcmVjb3JkKCk7Ci0JCQlpZiAoY2FsbC0+Y2xhc3MtPnJlZykKLQkJCQljYWxsLT5jbGFzcy0+cmVnKGNhbGwsIFRSQUNFX1JFR19VTlJFR0lTVEVSKTsKLQkJCWVsc2UKLQkJCQl0cmFjZXBvaW50X3Byb2JlX3VucmVnaXN0ZXIoY2FsbC0+bmFtZSwKLQkJCQkJCQkgICAgY2FsbC0+Y2xhc3MtPnByb2JlLAotCQkJCQkJCSAgICBjYWxsKTsKKwkJCWlmIChjYWxsLT5mbGFncyAmIFRSQUNFX0VWRU5UX0ZMX1JFQ09SREVEX0NNRCkgeworCQkJCXRyYWNpbmdfc3RvcF9jbWRsaW5lX3JlY29yZCgpOworCQkJCWNhbGwtPmZsYWdzICY9IH5UUkFDRV9FVkVOVF9GTF9SRUNPUkRFRF9DTUQ7CisJCQl9CisJCQljYWxsLT5jbGFzcy0+cmVnKGNhbGwsIFRSQUNFX1JFR19VTlJFR0lTVEVSKTsKIAkJfQogCQlicmVhazsKIAljYXNlIDE6CiAJCWlmICghKGNhbGwtPmZsYWdzICYgVFJBQ0VfRVZFTlRfRkxfRU5BQkxFRCkpIHsKLQkJCXRyYWNpbmdfc3RhcnRfY21kbGluZV9yZWNvcmQoKTsKLQkJCWlmIChjYWxsLT5jbGFzcy0+cmVnKQotCQkJCXJldCA9IGNhbGwtPmNsYXNzLT5yZWcoY2FsbCwgVFJBQ0VfUkVHX1JFR0lTVEVSKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSB0cmFjZXBvaW50X3Byb2JlX3JlZ2lzdGVyKGNhbGwtPm5hbWUsCi0JCQkJCQkJCWNhbGwtPmNsYXNzLT5wcm9iZSwKLQkJCQkJCQkJY2FsbCk7CisJCQlpZiAodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX1JFQ09SRF9DTUQpIHsKKwkJCQl0cmFjaW5nX3N0YXJ0X2NtZGxpbmVfcmVjb3JkKCk7CisJCQkJY2FsbC0+ZmxhZ3MgfD0gVFJBQ0VfRVZFTlRfRkxfUkVDT1JERURfQ01EOworCQkJfQorCQkJcmV0ID0gY2FsbC0+Y2xhc3MtPnJlZyhjYWxsLCBUUkFDRV9SRUdfUkVHSVNURVIpOwogCQkJaWYgKHJldCkgewogCQkJCXRyYWNpbmdfc3RvcF9jbWRsaW5lX3JlY29yZCgpOwogCQkJCXByX2luZm8oImV2ZW50IHRyYWNlOiBDb3VsZCBub3QgZW5hYmxlIGV2ZW50ICIKQEAgLTE5NCw4ICsyNTAsNyBAQAogCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CiAKLQkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5jbGFzcyB8fAotCQkgICAgKCFjYWxsLT5jbGFzcy0+cHJvYmUgJiYgIWNhbGwtPmNsYXNzLT5yZWcpKQorCQlpZiAoIWNhbGwtPm5hbWUgfHwgIWNhbGwtPmNsYXNzIHx8ICFjYWxsLT5jbGFzcy0+cmVnKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1hdGNoICYmCkBAIC0zMjEsNyArMzc2LDcgQEAKIAkJICogVGhlIGZ0cmFjZSBzdWJzeXN0ZW0gaXMgZm9yIHNob3dpbmcgZm9ybWF0cyBvbmx5LgogCQkgKiBUaGV5IGNhbiBub3QgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB2aWEgdGhlIGV2ZW50IGZpbGVzLgogCQkgKi8KLQkJaWYgKGNhbGwtPmNsYXNzICYmIChjYWxsLT5jbGFzcy0+cHJvYmUgfHwgY2FsbC0+Y2xhc3MtPnJlZykpCisJCWlmIChjYWxsLT5jbGFzcyAmJiBjYWxsLT5jbGFzcy0+cmVnKQogCQkJcmV0dXJuIGNhbGw7CiAJfQogCkBAIC00NzQsOCArNTI5LDcgQEAKIAogCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7Ci0JCWlmICghY2FsbC0+bmFtZSB8fCAhY2FsbC0+Y2xhc3MgfHwKLQkJICAgICghY2FsbC0+Y2xhc3MtPnByb2JlICYmICFjYWxsLT5jbGFzcy0+cmVnKSkKKwkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5jbGFzcyB8fCAhY2FsbC0+Y2xhc3MtPnJlZykKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzeXN0ZW0gJiYgc3RyY21wKGNhbGwtPmNsYXNzLT5zeXN0ZW0sIHN5c3RlbSkgIT0gMCkKQEAgLTU0NCwzMiArNTk4LDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QKLWV2ZW50X2Zvcm1hdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwKLQkJICBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgdm9pZCBwcmludF9ldmVudF9maWVsZHMoc3RydWN0IHRyYWNlX3NlcSAqcywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqZmllbGQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKLQlzdHJ1Y3QgdHJhY2Vfc2VxICpzOwotCWludCBjb21tb25fZmllbGRfY291bnQgPSA1OwotCWNoYXIgKmJ1ZjsKLQlpbnQgciA9IDA7CiAKLQlpZiAoKnBwb3MpCi0JCXJldHVybiAwOwotCi0JcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXRyYWNlX3NlcV9pbml0KHMpOwotCi0JdHJhY2Vfc2VxX3ByaW50ZihzLCAibmFtZTogJXNcbiIsIGNhbGwtPm5hbWUpOwotCXRyYWNlX3NlcV9wcmludGYocywgIklEOiAlZFxuIiwgY2FsbC0+ZXZlbnQudHlwZSk7Ci0JdHJhY2Vfc2VxX3ByaW50ZihzLCAiZm9ybWF0OlxuIik7Ci0KLQloZWFkID0gdHJhY2VfZ2V0X2ZpZWxkcyhjYWxsKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZmllbGQsIGhlYWQsIGxpbmspIHsKIAkJLyoKIAkJICogU21hcnRseSBzaG93cyB0aGUgYXJyYXkgdHlwZShleGNlcHQgZHluYW1pYyBhcnJheSkuCkBAIC01ODQsMjkgKzYxNiw1NCBAQAogCQkJYXJyYXlfZGVzY3JpcHRvciA9IE5VTEw7CiAKIAkJaWYgKCFhcnJheV9kZXNjcmlwdG9yKSB7Ci0JCQlyID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDolcyAlcztcdG9mZnNldDoldTsiCisJCQl0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGZpZWxkOiVzICVzO1x0b2Zmc2V0OiV1OyIKIAkJCQkJIlx0c2l6ZToldTtcdHNpZ25lZDolZDtcbiIsCiAJCQkJCWZpZWxkLT50eXBlLCBmaWVsZC0+bmFtZSwgZmllbGQtPm9mZnNldCwKIAkJCQkJZmllbGQtPnNpemUsICEhZmllbGQtPmlzX3NpZ25lZCk7CiAJCX0gZWxzZSB7Ci0JCQlyID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDolLipzICVzJXM7XHRvZmZzZXQ6JXU7IgorCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDolLipzICVzJXM7XHRvZmZzZXQ6JXU7IgogCQkJCQkiXHRzaXplOiV1O1x0c2lnbmVkOiVkO1xuIiwKIAkJCQkJKGludCkoYXJyYXlfZGVzY3JpcHRvciAtIGZpZWxkLT50eXBlKSwKIAkJCQkJZmllbGQtPnR5cGUsIGZpZWxkLT5uYW1lLAogCQkJCQlhcnJheV9kZXNjcmlwdG9yLCBmaWVsZC0+b2Zmc2V0LAogCQkJCQlmaWVsZC0+c2l6ZSwgISFmaWVsZC0+aXNfc2lnbmVkKTsKIAkJfQotCi0JCWlmICgtLWNvbW1vbl9maWVsZF9jb3VudCA9PSAwKQotCQkJciA9IHRyYWNlX3NlcV9wcmludGYocywgIlxuIik7Ci0KLQkJaWYgKCFyKQotCQkJYnJlYWs7CiAJfQorfQogCi0JaWYgKHIpCi0JCXIgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcbnByaW50IGZtdDogJXNcbiIsCi0JCQkJY2FsbC0+cHJpbnRfZm10KTsKK3N0YXRpYyBzc2l6ZV90CitldmVudF9mb3JtYXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsCisJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCB0cmFjZV9zZXEgKnM7CisJY2hhciAqYnVmOworCWludCByOworCisJaWYgKCpwcG9zKQorCQlyZXR1cm4gMDsKKworCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmFjZV9zZXFfaW5pdChzKTsKKworCXRyYWNlX3NlcV9wcmludGYocywgIm5hbWU6ICVzXG4iLCBjYWxsLT5uYW1lKTsKKwl0cmFjZV9zZXFfcHJpbnRmKHMsICJJRDogJWRcbiIsIGNhbGwtPmV2ZW50LnR5cGUpOworCXRyYWNlX3NlcV9wcmludGYocywgImZvcm1hdDpcbiIpOworCisJLyogcHJpbnQgY29tbW9uIGZpZWxkcyAqLworCXByaW50X2V2ZW50X2ZpZWxkcyhzLCAmZnRyYWNlX2NvbW1vbl9maWVsZHMpOworCisJdHJhY2Vfc2VxX3B1dGMocywgJ1xuJyk7CisKKwkvKiBwcmludCBldmVudCBzcGVjaWZpYyBmaWVsZHMgKi8KKwloZWFkID0gdHJhY2VfZ2V0X2ZpZWxkcyhjYWxsKTsKKwlwcmludF9ldmVudF9maWVsZHMocywgaGVhZCk7CisKKwlyID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXG5wcmludCBmbXQ6ICVzXG4iLCBjYWxsLT5wcmludF9mbXQpOwogCiAJaWYgKCFyKSB7CiAJCS8qCkBAIC05NjMsMzUgKzEwMjAsMzEgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChjYWxsLT5jbGFzcy0+cHJvYmUgfHwgY2FsbC0+Y2xhc3MtPnJlZykKKwlpZiAoY2FsbC0+Y2xhc3MtPnJlZykKIAkJdHJhY2VfY3JlYXRlX2ZpbGUoImVuYWJsZSIsIDA2NDQsIGNhbGwtPmRpciwgY2FsbCwKIAkJCQkgIGVuYWJsZSk7CiAKICNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKLQlpZiAoY2FsbC0+ZXZlbnQudHlwZSAmJiAoY2FsbC0+Y2xhc3MtPnBlcmZfcHJvYmUgfHwgY2FsbC0+Y2xhc3MtPnJlZykpCisJaWYgKGNhbGwtPmV2ZW50LnR5cGUgJiYgY2FsbC0+Y2xhc3MtPnJlZykKIAkJdHJhY2VfY3JlYXRlX2ZpbGUoImlkIiwgMDQ0NCwgY2FsbC0+ZGlyLCBjYWxsLAogCQkgCQkgIGlkKTsKICNlbmRpZgogCi0JaWYgKGNhbGwtPmNsYXNzLT5kZWZpbmVfZmllbGRzKSB7Ci0JCS8qCi0JCSAqIE90aGVyIGV2ZW50cyBtYXkgaGF2ZSB0aGUgc2FtZSBjbGFzcy4gT25seSB1cGRhdGUKLQkJICogdGhlIGZpZWxkcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBkZWZpbmVkLgotCQkgKi8KLQkJaGVhZCA9IHRyYWNlX2dldF9maWVsZHMoY2FsbCk7Ci0JCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCQlyZXQgPSB0cmFjZV9kZWZpbmVfY29tbW9uX2ZpZWxkcyhjYWxsKTsKLQkJCWlmICghcmV0KQotCQkJCXJldCA9IGNhbGwtPmNsYXNzLT5kZWZpbmVfZmllbGRzKGNhbGwpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSB0cmFjZSBwb2ludCIKLQkJCQkJICAgIiBldmVudHMvJXNcbiIsIGNhbGwtPm5hbWUpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9CisJLyoKKwkgKiBPdGhlciBldmVudHMgbWF5IGhhdmUgdGhlIHNhbWUgY2xhc3MuIE9ubHkgdXBkYXRlCisJICogdGhlIGZpZWxkcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBkZWZpbmVkLgorCSAqLworCWhlYWQgPSB0cmFjZV9nZXRfZmllbGRzKGNhbGwpOworCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXJldCA9IGNhbGwtPmNsYXNzLT5kZWZpbmVfZmllbGRzKGNhbGwpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfd2FybmluZygiQ291bGQgbm90IGluaXRpYWxpemUgdHJhY2UgcG9pbnQiCisJCQkJICAgIiBldmVudHMvJXNcbiIsIGNhbGwtPm5hbWUpOworCQkJcmV0dXJuIHJldDsKIAkJfQotCQl0cmFjZV9jcmVhdGVfZmlsZSgiZmlsdGVyIiwgMDY0NCwgY2FsbC0+ZGlyLCBjYWxsLAotCQkJCSAgZmlsdGVyKTsKIAl9CisJdHJhY2VfY3JlYXRlX2ZpbGUoImZpbHRlciIsIDA2NDQsIGNhbGwtPmRpciwgY2FsbCwKKwkJCSAgZmlsdGVyKTsKIAogCXRyYWNlX2NyZWF0ZV9maWxlKCJmb3JtYXQiLCAwNDQ0LCBjYWxsLT5kaXIsIGNhbGwsCiAJCQkgIGZvcm1hdCk7CkBAIC05OTksMTEgKzEwNTIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX3RyYWNlX2FkZF9ldmVudF9jYWxsKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkKK3N0YXRpYyBpbnQKK19fdHJhY2VfYWRkX2V2ZW50X2NhbGwoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBzdHJ1Y3QgbW9kdWxlICptb2QsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICppZCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmVuYWJsZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZpbHRlciwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcm1hdCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50czsKIAlpbnQgcmV0OwogCisJLyogVGhlIGxpbmtlciBtYXkgbGVhdmUgYmxhbmtzICovCiAJaWYgKCFjYWxsLT5uYW1lKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTAxMSw4ICsxMDcwLDggQEAKIAkJcmV0ID0gY2FsbC0+Y2xhc3MtPnJhd19pbml0KGNhbGwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKHJldCAhPSAtRU5PU1lTKQotCQkJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBpbml0aWFsaXplIHRyYWNlICIKLQkJCQkiZXZlbnRzLyVzXG4iLCBjYWxsLT5uYW1lKTsKKwkJCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSB0cmFjZSBldmVudHMvJXNcbiIsCisJCQkJCSAgIGNhbGwtPm5hbWUpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTEwMjEsMTEgKzEwODAsMTAgQEAKIAlpZiAoIWRfZXZlbnRzKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXJldCA9IGV2ZW50X2NyZWF0ZV9kaXIoY2FsbCwgZF9ldmVudHMsICZmdHJhY2VfZXZlbnRfaWRfZm9wcywKLQkJCQkmZnRyYWNlX2VuYWJsZV9mb3BzLCAmZnRyYWNlX2V2ZW50X2ZpbHRlcl9mb3BzLAotCQkJCSZmdHJhY2VfZXZlbnRfZm9ybWF0X2ZvcHMpOworCXJldCA9IGV2ZW50X2NyZWF0ZV9kaXIoY2FsbCwgZF9ldmVudHMsIGlkLCBlbmFibGUsIGZpbHRlciwgZm9ybWF0KTsKIAlpZiAoIXJldCkKIAkJbGlzdF9hZGQoJmNhbGwtPmxpc3QsICZmdHJhY2VfZXZlbnRzKTsKKwljYWxsLT5tb2QgPSBtb2Q7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAzNSw3ICsxMDkzLDEwIEBACiB7CiAJaW50IHJldDsKIAltdXRleF9sb2NrKCZldmVudF9tdXRleCk7Ci0JcmV0ID0gX190cmFjZV9hZGRfZXZlbnRfY2FsbChjYWxsKTsKKwlyZXQgPSBfX3RyYWNlX2FkZF9ldmVudF9jYWxsKGNhbGwsIE5VTEwsICZmdHJhY2VfZXZlbnRfaWRfZm9wcywKKwkJCQkgICAgICZmdHJhY2VfZW5hYmxlX2ZvcHMsCisJCQkJICAgICAmZnRyYWNlX2V2ZW50X2ZpbHRlcl9mb3BzLAorCQkJCSAgICAgJmZ0cmFjZV9ldmVudF9mb3JtYXRfZm9wcyk7CiAJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNTIsOCArMTIxMyw2IEBACiB7CiAJc3RydWN0IGZ0cmFjZV9tb2R1bGVfZmlsZV9vcHMgKmZpbGVfb3BzID0gTlVMTDsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsICpzdGFydCwgKmVuZDsKLQlzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50czsKLQlpbnQgcmV0OwogCiAJc3RhcnQgPSBtb2QtPnRyYWNlX2V2ZW50czsKIAllbmQgPSBtb2QtPnRyYWNlX2V2ZW50cyArIG1vZC0+bnVtX3RyYWNlX2V2ZW50czsKQEAgLTExNjEsMzggKzEyMjAsMTQgQEAKIAlpZiAoc3RhcnQgPT0gZW5kKQogCQlyZXR1cm47CiAKLQlkX2V2ZW50cyA9IGV2ZW50X3RyYWNlX2V2ZW50c19kaXIoKTsKLQlpZiAoIWRfZXZlbnRzKQorCWZpbGVfb3BzID0gdHJhY2VfY3JlYXRlX2ZpbGVfb3BzKG1vZCk7CisJaWYgKCFmaWxlX29wcykKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfZXZlbnQoY2FsbCwgc3RhcnQsIGVuZCkgewotCQkvKiBUaGUgbGlua2VyIG1heSBsZWF2ZSBibGFua3MgKi8KLQkJaWYgKCFjYWxsLT5uYW1lKQotCQkJY29udGludWU7Ci0JCWlmIChjYWxsLT5jbGFzcy0+cmF3X2luaXQpIHsKLQkJCXJldCA9IGNhbGwtPmNsYXNzLT5yYXdfaW5pdChjYWxsKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJaWYgKHJldCAhPSAtRU5PU1lTKQotCQkJCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSB0cmFjZSAiCi0JCQkJCSJwb2ludCBldmVudHMvJXNcbiIsIGNhbGwtPm5hbWUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIFRoaXMgbW9kdWxlIGhhcyBldmVudHMsIGNyZWF0ZSBmaWxlIG9wcyBmb3IgdGhpcyBtb2R1bGUKLQkJICogaWYgbm90IGFscmVhZHkgZG9uZS4KLQkJICovCi0JCWlmICghZmlsZV9vcHMpIHsKLQkJCWZpbGVfb3BzID0gdHJhY2VfY3JlYXRlX2ZpbGVfb3BzKG1vZCk7Ci0JCQlpZiAoIWZpbGVfb3BzKQotCQkJCXJldHVybjsKLQkJfQotCQljYWxsLT5tb2QgPSBtb2Q7Ci0JCXJldCA9IGV2ZW50X2NyZWF0ZV9kaXIoY2FsbCwgZF9ldmVudHMsCisJCV9fdHJhY2VfYWRkX2V2ZW50X2NhbGwoY2FsbCwgbW9kLAogCQkJCSAgICAgICAmZmlsZV9vcHMtPmlkLCAmZmlsZV9vcHMtPmVuYWJsZSwKIAkJCQkgICAgICAgJmZpbGVfb3BzLT5maWx0ZXIsICZmaWxlX29wcy0+Zm9ybWF0KTsKLQkJaWYgKCFyZXQpCi0JCQlsaXN0X2FkZCgmY2FsbC0+bGlzdCwgJmZ0cmFjZV9ldmVudHMpOwogCX0KIH0KIApAQCAtMTMxOSwyNSArMTM1NCwxNCBAQAogCXRyYWNlX2NyZWF0ZV9maWxlKCJlbmFibGUiLCAwNjQ0LCBkX2V2ZW50cywKIAkJCSAgTlVMTCwgJmZ0cmFjZV9zeXN0ZW1fZW5hYmxlX2ZvcHMpOwogCisJaWYgKHRyYWNlX2RlZmluZV9jb21tb25fZmllbGRzKCkpCisJCXByX3dhcm5pbmcoInRyYWNpbmc6IEZhaWxlZCB0byBhbGxvY2F0ZSBjb21tb24gZmllbGRzIik7CisKIAlmb3JfZWFjaF9ldmVudChjYWxsLCBfX3N0YXJ0X2Z0cmFjZV9ldmVudHMsIF9fc3RvcF9mdHJhY2VfZXZlbnRzKSB7Ci0JCS8qIFRoZSBsaW5rZXIgbWF5IGxlYXZlIGJsYW5rcyAqLwotCQlpZiAoIWNhbGwtPm5hbWUpCi0JCQljb250aW51ZTsKLQkJaWYgKGNhbGwtPmNsYXNzLT5yYXdfaW5pdCkgewotCQkJcmV0ID0gY2FsbC0+Y2xhc3MtPnJhd19pbml0KGNhbGwpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlpZiAocmV0ICE9IC1FTk9TWVMpCi0JCQkJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBpbml0aWFsaXplIHRyYWNlICIKLQkJCQkJInBvaW50IGV2ZW50cy8lc1xuIiwgY2FsbC0+bmFtZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0ID0gZXZlbnRfY3JlYXRlX2RpcihjYWxsLCBkX2V2ZW50cywgJmZ0cmFjZV9ldmVudF9pZF9mb3BzLAorCQlfX3RyYWNlX2FkZF9ldmVudF9jYWxsKGNhbGwsIE5VTEwsICZmdHJhY2VfZXZlbnRfaWRfZm9wcywKIAkJCQkgICAgICAgJmZ0cmFjZV9lbmFibGVfZm9wcywKIAkJCQkgICAgICAgJmZ0cmFjZV9ldmVudF9maWx0ZXJfZm9wcywKIAkJCQkgICAgICAgJmZ0cmFjZV9ldmVudF9mb3JtYXRfZm9wcyk7Ci0JCWlmICghcmV0KQotCQkJbGlzdF9hZGQoJmNhbGwtPmxpc3QsICZmdHJhY2VfZXZlbnRzKTsKIAl9CiAKIAl3aGlsZSAodHJ1ZSkgewpAQCAtMTUyNCwxMiArMTU0OCwxMSBAQAogCXN0cnVjdCBmdHJhY2VfZW50cnkgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbG9uZyBkaXNhYmxlZDsKLQlpbnQgcmVzY2hlZDsKIAlpbnQgY3B1OwogCWludCBwYzsKIAogCXBjID0gcHJlZW1wdF9jb3VudCgpOwotCXJlc2NoZWQgPSBmdHJhY2VfcHJlZW1wdF9kaXNhYmxlKCk7CisJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsKIAljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWRpc2FibGVkID0gYXRvbWljX2luY19yZXR1cm4oJnBlcl9jcHUoZnRyYWNlX3Rlc3RfZXZlbnRfZGlzYWJsZSwgY3B1KSk7CiAKQEAgLTE1NTEsNyArMTU3NCw3IEBACiAKICBvdXQ6CiAJYXRvbWljX2RlYygmcGVyX2NwdShmdHJhY2VfdGVzdF9ldmVudF9kaXNhYmxlLCBjcHUpKTsKLQlmdHJhY2VfcHJlZW1wdF9lbmFibGUocmVzY2hlZCk7CisJcHJlZW1wdF9lbmFibGVfbm90cmFjZSgpOwogfQogCiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgdHJhY2Vfb3BzIF9faW5pdGRhdGEgID0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCmluZGV4IDU3YmIxYmIuLjM2ZDQwMTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYwpAQCAtNDk3LDEyICs0OTcsMTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfZmllbGQgKgotZmluZF9ldmVudF9maWVsZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIGNoYXIgKm5hbWUpCitfX2ZpbmRfZXZlbnRfZmllbGQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpZWxkICpmaWVsZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwogCi0JaGVhZCA9IHRyYWNlX2dldF9maWVsZHMoY2FsbCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWVsZCwgaGVhZCwgbGluaykgewogCQlpZiAoIXN0cmNtcChmaWVsZC0+bmFtZSwgbmFtZSkpCiAJCQlyZXR1cm4gZmllbGQ7CkBAIC01MTEsNiArNTA5LDIwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpZWxkICoKK2ZpbmRfZXZlbnRfZmllbGQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmdHJhY2VfZXZlbnRfZmllbGQgKmZpZWxkOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisKKwlmaWVsZCA9IF9fZmluZF9ldmVudF9maWVsZCgmZnRyYWNlX2NvbW1vbl9maWVsZHMsIG5hbWUpOworCWlmIChmaWVsZCkKKwkJcmV0dXJuIGZpZWxkOworCisJaGVhZCA9IHRyYWNlX2dldF9maWVsZHMoY2FsbCk7CisJcmV0dXJuIF9fZmluZF9ldmVudF9maWVsZChoZWFkLCBuYW1lKTsKK30KKwogc3RhdGljIHZvaWQgZmlsdGVyX2ZyZWVfcHJlZChzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpCiB7CiAJaWYgKCFwcmVkKQpAQCAtNjI3LDkgKzYzOSw2IEBACiAJaW50IGVycjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKLQkJaWYgKCFjYWxsLT5jbGFzcyB8fCAhY2FsbC0+Y2xhc3MtPmRlZmluZV9maWVsZHMpCi0JCQljb250aW51ZTsKLQogCQlpZiAoc3RyY21wKGNhbGwtPmNsYXNzLT5zeXN0ZW0sIHN5c3RlbS0+bmFtZSkgIT0gMCkKIAkJCWNvbnRpbnVlOwogCkBAIC02NDYsOSArNjU1LDYgQEAKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7Ci0JCWlmICghY2FsbC0+Y2xhc3MgfHwgIWNhbGwtPmNsYXNzLT5kZWZpbmVfZmllbGRzKQotCQkJY29udGludWU7Ci0KIAkJaWYgKHN0cmNtcChjYWxsLT5jbGFzcy0+c3lzdGVtLCBzeXN0ZW0tPm5hbWUpICE9IDApCiAJCQljb250aW51ZTsKIApAQCAtMTI1MSw5ICsxMjU3LDYgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CiAJCXN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlciA9IGNhbGwtPmZpbHRlcjsKIAotCQlpZiAoIWNhbGwtPmNsYXNzIHx8ICFjYWxsLT5jbGFzcy0+ZGVmaW5lX2ZpZWxkcykKLQkJCWNvbnRpbnVlOwotCiAJCWlmIChzdHJjbXAoY2FsbC0+Y2xhc3MtPnN5c3RlbSwgc3lzdGVtLT5uYW1lKSAhPSAwKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYwppbmRleCA4NTM2ZTJhLi40YmE0NGRlIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jCkBAIC0xMjUsMTIgKzEyNSw2IEBACiAKICNpbmNsdWRlICJ0cmFjZV9lbnRyaWVzLmgiCiAKLXN0YXRpYyBpbnQgZnRyYWNlX3Jhd19pbml0X2V2ZW50KHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkKLXsKLQlJTklUX0xJU1RfSEVBRCgmY2FsbC0+Y2xhc3MtPmZpZWxkcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KICN1bmRlZiBfX2VudHJ5CiAjZGVmaW5lIF9fZW50cnkgUkVDCiAKQEAgLTE1OCw3ICsxNTIsNyBAQAogc3RydWN0IGZ0cmFjZV9ldmVudF9jbGFzcyBldmVudF9jbGFzc19mdHJhY2VfIyNjYWxsID0gewkJCVwKIAkuc3lzdGVtCQkJPSBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pLAkJXAogCS5kZWZpbmVfZmllbGRzCQk9IGZ0cmFjZV9kZWZpbmVfZmllbGRzXyMjY2FsbCwJCVwKLQkucmF3X2luaXQJCT0gZnRyYWNlX3Jhd19pbml0X2V2ZW50LAkJXAorCS5maWVsZHMJCQk9IExJU1RfSEVBRF9JTklUKGV2ZW50X2NsYXNzX2Z0cmFjZV8jI2NhbGwuZmllbGRzKSxcCiB9OwkJCQkJCQkJCVwKIAkJCQkJCQkJCVwKIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3VzZWQJCQkJCQlcCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zLmMKaW5kZXggYjNmMzc3Ni4uMTZhZWU0ZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9ucy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnMuYwpAQCAtNTQsMTQgKzU0LDE0IEBACiAJc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWxvbmcgZGlzYWJsZWQ7Ci0JaW50IGNwdSwgcmVzY2hlZDsKKwlpbnQgY3B1OwogCWludCBwYzsKIAogCWlmICh1bmxpa2VseSghZnRyYWNlX2Z1bmN0aW9uX2VuYWJsZWQpKQogCQlyZXR1cm47CiAKIAlwYyA9IHByZWVtcHRfY291bnQoKTsKLQlyZXNjaGVkID0gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSgpOworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CiAJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlkYXRhID0gdHItPmRhdGFbY3B1XTsKQEAgLTcxLDcgKzcxLDcgQEAKIAkJdHJhY2VfZnVuY3Rpb24odHIsIGlwLCBwYXJlbnRfaXAsIGZsYWdzLCBwYyk7CiAKIAlhdG9taWNfZGVjKCZkYXRhLT5kaXNhYmxlZCk7Ci0JZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwppbmRleCA3OWY0YmFjLi42YmZmMjM2IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCkBAIC02NDEsNyArNjQxLDggQEAKIAogCS8qIFByaW50IG5zZWNzICh3ZSBkb24ndCB3YW50IHRvIGV4Y2VlZCA3IG51bWJlcnMpICovCiAJaWYgKGxlbiA8IDcpIHsKLQkJc25wcmludGYobnNlY3Nfc3RyLCA4IC0gbGVuLCAiJTAzbHUiLCBuc2Vjc19yZW0pOworCQlzbnByaW50Zihuc2Vjc19zdHIsIG1pbihzaXplb2YobnNlY3Nfc3RyKSwgOFVMIC0gbGVuKSwgIiUwM2x1IiwKKwkJCSBuc2Vjc19yZW0pOwogCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIuJXMiLCBuc2Vjc19zdHIpOwogCQlpZiAoIXJldCkKIAkJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jCmluZGV4IDZmZDQ4NmUuLjczYTZiMDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYwpAQCAtNjQ5LDYgKzY0OSw3IEBACiAjZW5kaWYKIAkub3BlbiAgICAgICAgICAgPSBpcnFzb2ZmX3RyYWNlX29wZW4sCiAJLmNsb3NlICAgICAgICAgID0gaXJxc29mZl90cmFjZV9jbG9zZSwKKwkudXNlX21heF90cgk9IDEsCiB9OwogIyBkZWZpbmUgcmVnaXN0ZXJfaXJxc29mZih0cmFjZSkgcmVnaXN0ZXJfdHJhY2VyKCZ0cmFjZSkKICNlbHNlCkBAIC02ODEsNiArNjgyLDcgQEAKICNlbmRpZgogCS5vcGVuCQk9IGlycXNvZmZfdHJhY2Vfb3BlbiwKIAkuY2xvc2UJCT0gaXJxc29mZl90cmFjZV9jbG9zZSwKKwkudXNlX21heF90cgk9IDEsCiB9OwogIyBkZWZpbmUgcmVnaXN0ZXJfcHJlZW1wdG9mZih0cmFjZSkgcmVnaXN0ZXJfdHJhY2VyKCZ0cmFjZSkKICNlbHNlCkBAIC03MTUsNiArNzE3LDcgQEAKICNlbmRpZgogCS5vcGVuCQk9IGlycXNvZmZfdHJhY2Vfb3BlbiwKIAkuY2xvc2UJCT0gaXJxc29mZl90cmFjZV9jbG9zZSwKKwkudXNlX21heF90cgk9IDEsCiB9OwogCiAjIGRlZmluZSByZWdpc3Rlcl9wcmVlbXB0aXJxc29mZih0cmFjZSkgcmVnaXN0ZXJfdHJhY2VyKCZ0cmFjZSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9rZGIuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9rZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjhlY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2tkYi5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICoga2RiIGhlbHBlciBmb3IgZHVtcGluZyB0aGUgZnRyYWNlIGJ1ZmZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBKYXNvbiBXZXNzZWwgPGphc29uLndlc3NlbEB3aW5kcml2ZXIuY29tPgorICoKKyAqIGZ0cmFjZV9kdW1wX2J1ZiBiYXNlZCBvbiBmdHJhY2VfZHVtcDoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFN0ZXZlbiBSb3N0ZWR0IDxzcm9zdGVkdEByZWRoYXQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjaW5jbHVkZSA8bGludXgva2RiLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisKKyNpbmNsdWRlICIuLi9kZWJ1Zy9rZGIva2RiX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgorCitzdGF0aWMgdm9pZCBmdHJhY2VfZHVtcF9idWYoaW50IHNraXBfbGluZXMsIGxvbmcgY3B1X2ZpbGUpCit7CisJLyogdXNlIHN0YXRpYyBiZWNhdXNlIGl0ZXIgY2FuIGJlIGEgYml0IGJpZyBmb3IgdGhlIHN0YWNrICovCisJc3RhdGljIHN0cnVjdCB0cmFjZV9pdGVyYXRvciBpdGVyOworCXVuc2lnbmVkIGludCBvbGRfdXNlcm9iajsKKwlpbnQgY250ID0gMCwgY3B1OworCisJdHJhY2VfaW5pdF9nbG9iYWxfaXRlcigmaXRlcik7CisKKwlmb3JfZWFjaF90cmFjaW5nX2NwdShjcHUpIHsKKwkJYXRvbWljX2luYygmaXRlci50ci0+ZGF0YVtjcHVdLT5kaXNhYmxlZCk7CisJfQorCisJb2xkX3VzZXJvYmogPSB0cmFjZV9mbGFnczsKKworCS8qIGRvbid0IGxvb2sgYXQgdXNlciBtZW1vcnkgaW4gcGFuaWMgbW9kZSAqLworCXRyYWNlX2ZsYWdzICY9IH5UUkFDRV9JVEVSX1NZTV9VU0VST0JKOworCisJa2RiX3ByaW50ZigiRHVtcGluZyBmdHJhY2UgYnVmZmVyOlxuIik7CisKKwkvKiByZXNldCBhbGwgYnV0IHRyLCB0cmFjZSwgYW5kIG92ZXJydW5zICovCisJbWVtc2V0KCZpdGVyLnNlcSwgMCwKKwkJICAgc2l6ZW9mKHN0cnVjdCB0cmFjZV9pdGVyYXRvcikgLQorCQkgICBvZmZzZXRvZihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IsIHNlcSkpOworCWl0ZXIuaXRlcl9mbGFncyB8PSBUUkFDRV9GSUxFX0xBVF9GTVQ7CisJaXRlci5wb3MgPSAtMTsKKworCWlmIChjcHVfZmlsZSA9PSBUUkFDRV9QSVBFX0FMTF9DUFUpIHsKKwkJZm9yX2VhY2hfdHJhY2luZ19jcHUoY3B1KSB7CisJCQlpdGVyLmJ1ZmZlcl9pdGVyW2NwdV0gPQorCQkJcmluZ19idWZmZXJfcmVhZF9wcmVwYXJlKGl0ZXIudHItPmJ1ZmZlciwgY3B1KTsKKwkJCXJpbmdfYnVmZmVyX3JlYWRfc3RhcnQoaXRlci5idWZmZXJfaXRlcltjcHVdKTsKKwkJCXRyYWNpbmdfaXRlcl9yZXNldCgmaXRlciwgY3B1KTsKKwkJfQorCX0gZWxzZSB7CisJCWl0ZXIuY3B1X2ZpbGUgPSBjcHVfZmlsZTsKKwkJaXRlci5idWZmZXJfaXRlcltjcHVfZmlsZV0gPQorCQkJcmluZ19idWZmZXJfcmVhZF9wcmVwYXJlKGl0ZXIudHItPmJ1ZmZlciwgY3B1X2ZpbGUpOworCQlyaW5nX2J1ZmZlcl9yZWFkX3N0YXJ0KGl0ZXIuYnVmZmVyX2l0ZXJbY3B1X2ZpbGVdKTsKKwkJdHJhY2luZ19pdGVyX3Jlc2V0KCZpdGVyLCBjcHVfZmlsZSk7CisJfQorCWlmICghdHJhY2VfZW1wdHkoJml0ZXIpKQorCQl0cmFjZV9maW5kX25leHRfZW50cnlfaW5jKCZpdGVyKTsKKwl3aGlsZSAoIXRyYWNlX2VtcHR5KCZpdGVyKSkgeworCQlpZiAoIWNudCkKKwkJCWtkYl9wcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCWNudCsrOworCisJCWlmICh0cmFjZV9maW5kX25leHRfZW50cnlfaW5jKCZpdGVyKSAhPSBOVUxMICYmICFza2lwX2xpbmVzKQorCQkJcHJpbnRfdHJhY2VfbGluZSgmaXRlcik7CisJCWlmICghc2tpcF9saW5lcykKKwkJCXRyYWNlX3ByaW50a19zZXEoJml0ZXIuc2VxKTsKKwkJZWxzZQorCQkJc2tpcF9saW5lcy0tOworCQlpZiAoS0RCX0ZMQUcoQ01EX0lOVEVSUlVQVCkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWNudCkKKwkJa2RiX3ByaW50ZigiICAgKGZ0cmFjZSBidWZmZXIgZW1wdHkpXG4iKTsKKwllbHNlCisJCWtkYl9wcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKK291dDoKKwl0cmFjZV9mbGFncyA9IG9sZF91c2Vyb2JqOworCisJZm9yX2VhY2hfdHJhY2luZ19jcHUoY3B1KSB7CisJCWF0b21pY19kZWMoJml0ZXIudHItPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOworCX0KKworCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkKKwkJaWYgKGl0ZXIuYnVmZmVyX2l0ZXJbY3B1XSkKKwkJCXJpbmdfYnVmZmVyX3JlYWRfZmluaXNoKGl0ZXIuYnVmZmVyX2l0ZXJbY3B1XSk7Cit9CisKKy8qCisgKiBrZGJfZnRkdW1wIC0gRHVtcCB0aGUgZnRyYWNlIGxvZyBidWZmZXIKKyAqLworc3RhdGljIGludCBrZGJfZnRkdW1wKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2tpcF9saW5lcyA9IDA7CisJbG9uZyBjcHVfZmlsZTsKKwljaGFyICpjcDsKKworCWlmIChhcmdjID4gMikKKwkJcmV0dXJuIEtEQl9BUkdDT1VOVDsKKworCWlmIChhcmdjKSB7CisJCXNraXBfbGluZXMgPSBzaW1wbGVfc3RydG9sKGFyZ3ZbMV0sICZjcCwgMCk7CisJCWlmICgqY3ApCisJCQlza2lwX2xpbmVzID0gMDsKKwl9CisKKwlpZiAoYXJnYyA9PSAyKSB7CisJCWNwdV9maWxlID0gc2ltcGxlX3N0cnRvbChhcmd2WzJdLCAmY3AsIDApOworCQlpZiAoKmNwIHx8IGNwdV9maWxlID49IE5SX0NQVVMgfHwgY3B1X2ZpbGUgPCAwIHx8CisJCSAgICAhY3B1X29ubGluZShjcHVfZmlsZSkpCisJCQlyZXR1cm4gS0RCX0JBRElOVDsKKwl9IGVsc2UgeworCQljcHVfZmlsZSA9IFRSQUNFX1BJUEVfQUxMX0NQVTsKKwl9CisKKwlrZGJfdHJhcF9wcmludGsrKzsKKwlmdHJhY2VfZHVtcF9idWYoc2tpcF9saW5lcywgY3B1X2ZpbGUpOworCWtkYl90cmFwX3ByaW50ay0tOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IGtkYl9mdHJhY2VfcmVnaXN0ZXIodm9pZCkKK3sKKwlrZGJfcmVnaXN0ZXJfcmVwZWF0KCJmdGR1bXAiLCBrZGJfZnRkdW1wLCAiW3NraXBfI2xpbmVzXSBbY3B1XSIsCisJCQkgICAgIkR1bXAgZnRyYWNlIGxvZyIsIDAsIEtEQl9SRVBFQVRfTk9ORSk7CisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwoa2RiX2Z0cmFjZV9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKaW5kZXggZjUyYjVmNS4uOGIyN2M5OCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+CiAKICNpbmNsdWRlICJ0cmFjZS5oIgpAQCAtMzgsNiArNDAsNyBAQAogI2RlZmluZSBNQVhfVFJBQ0VfQVJHUyAxMjgKICNkZWZpbmUgTUFYX0FSR1NUUl9MRU4gNjMKICNkZWZpbmUgTUFYX0VWRU5UX05BTUVfTEVOIDY0CisjZGVmaW5lIE1BWF9TVFJJTkdfU0laRSBQQVRIX01BWAogI2RlZmluZSBLUFJPQkVfRVZFTlRfU1lTVEVNICJrcHJvYmVzIgogCiAvKiBSZXNlcnZlZCBmaWVsZCBuYW1lcyAqLwpAQCAtNTgsMTQgKzYxLDE2IEBACiB9OwogCiAvKiBQcmludGluZyBmdW5jdGlvbiB0eXBlICovCi10eXBlZGVmIGludCAoKnByaW50X3R5cGVfZnVuY190KShzdHJ1Y3QgdHJhY2Vfc2VxICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK3R5cGVkZWYgaW50ICgqcHJpbnRfdHlwZV9mdW5jX3QpKHN0cnVjdCB0cmFjZV9zZXEgKiwgY29uc3QgY2hhciAqLCB2b2lkICosCisJCQkJIHZvaWQgKik7CiAjZGVmaW5lIFBSSU5UX1RZUEVfRlVOQ19OQU1FKHR5cGUpCXByaW50X3R5cGVfIyN0eXBlCiAjZGVmaW5lIFBSSU5UX1RZUEVfRk1UX05BTUUodHlwZSkJcHJpbnRfdHlwZV9mb3JtYXRfIyN0eXBlCiAKIC8qIFByaW50aW5nICBpbiBiYXNpYyB0eXBlIGZ1bmN0aW9uIHRlbXBsYXRlICovCiAjZGVmaW5lIERFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModHlwZSwgZm10LCBjYXN0KQkJCVwKIHN0YXRpYyBfX2twcm9iZXMgaW50IFBSSU5UX1RZUEVfRlVOQ19OQU1FKHR5cGUpKHN0cnVjdCB0cmFjZV9zZXEgKnMsCVwKLQkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpXAorCQkJCQkJY29uc3QgY2hhciAqbmFtZSwJXAorCQkJCQkJdm9pZCAqZGF0YSwgdm9pZCAqZW50KVwKIHsJCQkJCQkJCQlcCiAJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiAlcz0iIGZtdCwgbmFtZSwgKGNhc3QpKih0eXBlICopZGF0YSk7XAogfQkJCQkJCQkJCVwKQEAgLTgwLDYgKzg1LDQ5IEBACiBERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMzMiwgIiVsZCIsIGxvbmcpCiBERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHM2NCwgIiVsbGQiLCBsb25nIGxvbmcpCiAKKy8qIGRhdGFfcmxvYzogZGF0YSByZWxhdGl2ZSBsb2NhdGlvbiwgY29tcGF0aWJsZSB3aXRoIHUzMiAqLworI2RlZmluZSBtYWtlX2RhdGFfcmxvYyhsZW4sIHJvZmZzKQlcCisJKCgodTMyKShsZW4pIDw8IDE2KSB8ICgodTMyKShyb2ZmcykgJiAweGZmZmYpKQorI2RlZmluZSBnZXRfcmxvY19sZW4oZGwpCSgodTMyKShkbCkgPj4gMTYpCisjZGVmaW5lIGdldF9ybG9jX29mZnMoZGwpCSgodTMyKShkbCkgJiAweGZmZmYpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X3Jsb2NfZGF0YSh1MzIgKmRsKQoreworCXJldHVybiAodTggKilkbCArIGdldF9ybG9jX29mZnMoKmRsKTsKK30KKworLyogRm9yIGRhdGFfbG9jIGNvbnZlcnNpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2xvY19kYXRhKHUzMiAqZGwsIHZvaWQgKmVudCkKK3sKKwlyZXR1cm4gKHU4ICopZW50ICsgZ2V0X3Jsb2Nfb2ZmcygqZGwpOworfQorCisvKgorICogQ29udmVydCBkYXRhX3Jsb2MgdG8gZGF0YV9sb2M6CisgKiAgZGF0YV9ybG9jIHN0b3JlcyB0aGUgb2Zmc2V0IGZyb20gZGF0YV9ybG9jIGl0c2VsZiwgYnV0IGRhdGFfbG9jCisgKiAgc3RvcmVzIHRoZSBvZmZzZXQgZnJvbSBldmVudCBlbnRyeS4KKyAqLworI2RlZmluZSBjb252ZXJ0X3Jsb2NfdG9fbG9jKGRsLCBvZmZzKQkoKHUzMikoZGwpICsgKG9mZnMpKQorCisvKiBGb3IgZGVmaW5pbmcgbWFjcm9zLCBkZWZpbmUgc3RyaW5nL3N0cmluZ19zaXplIHR5cGVzICovCit0eXBlZGVmIHUzMiBzdHJpbmc7Cit0eXBlZGVmIHUzMiBzdHJpbmdfc2l6ZTsKKworLyogUHJpbnQgdHlwZSBmdW5jdGlvbiBmb3Igc3RyaW5nIHR5cGUgKi8KK3N0YXRpYyBfX2twcm9iZXMgaW50IFBSSU5UX1RZUEVfRlVOQ19OQU1FKHN0cmluZykoc3RydWN0IHRyYWNlX3NlcSAqcywKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgdm9pZCAqZGF0YSwgdm9pZCAqZW50KQoreworCWludCBsZW4gPSAqKHUzMiAqKWRhdGEgPj4gMTY7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiAlcz0oZmF1bHQpIiwgbmFtZSk7CisJZWxzZQorCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICVzPVwiJXNcIiIsIG5hbWUsCisJCQkJCShjb25zdCBjaGFyICopZ2V0X2xvY19kYXRhKGRhdGEsIGVudCkpOworfQorc3RhdGljIGNvbnN0IGNoYXIgUFJJTlRfVFlQRV9GTVRfTkFNRShzdHJpbmcpW10gPSAiXFxcIiVzXFxcIiI7CisKIC8qIERhdGEgZmV0Y2ggZnVuY3Rpb24gdHlwZSAqLwogdHlwZWRlZgl2b2lkICgqZmV0Y2hfZnVuY190KShzdHJ1Y3QgcHRfcmVncyAqLCB2b2lkICosIHZvaWQgKik7CiAKQEAgLTk0LDMyICsxNDIsMzggQEAKIAlyZXR1cm4gZnBybS0+Zm4ocmVncywgZnBybS0+ZGF0YSwgZGVzdCk7CiB9CiAKLSNkZWZpbmUgRkVUQ0hfRlVOQ19OQU1FKGtpbmQsIHR5cGUpCWZldGNoXyMja2luZCMjXyMjdHlwZQorI2RlZmluZSBGRVRDSF9GVU5DX05BTUUobWV0aG9kLCB0eXBlKQlmZXRjaF8jI21ldGhvZCMjXyMjdHlwZQogLyoKICAqIERlZmluZSBtYWNybyBmb3IgYmFzaWMgdHlwZXMgLSB3ZSBkb24ndCBuZWVkIHRvIGRlZmluZSBzKiB0eXBlcywgYmVjYXVzZQogICogd2UgaGF2ZSB0byBjYXJlIG9ubHkgYWJvdXQgYml0d2lkdGggYXQgcmVjb3JkaW5nIHRpbWUuCiAgKi8KLSNkZWZpbmUgREVGSU5FX0JBU0lDX0ZFVENIX0ZVTkNTKGtpbmQpICBcCi1ERUZJTkVfRkVUQ0hfIyNraW5kKHU4KQkJCVwKLURFRklORV9GRVRDSF8jI2tpbmQodTE2KQkJXAotREVGSU5FX0ZFVENIXyMja2luZCh1MzIpCQlcCi1ERUZJTkVfRkVUQ0hfIyNraW5kKHU2NCkKKyNkZWZpbmUgREVGSU5FX0JBU0lDX0ZFVENIX0ZVTkNTKG1ldGhvZCkgXAorREVGSU5FX0ZFVENIXyMjbWV0aG9kKHU4KQkJXAorREVGSU5FX0ZFVENIXyMjbWV0aG9kKHUxNikJCVwKK0RFRklORV9GRVRDSF8jI21ldGhvZCh1MzIpCQlcCitERUZJTkVfRkVUQ0hfIyNtZXRob2QodTY0KQogCi0jZGVmaW5lIENIRUNLX0JBU0lDX0ZFVENIX0ZVTkNTKGtpbmQsIGZuKQlcCi0JKChGRVRDSF9GVU5DX05BTUUoa2luZCwgdTgpID09IGZuKSB8fAlcCi0JIChGRVRDSF9GVU5DX05BTUUoa2luZCwgdTE2KSA9PSBmbikgfHwJXAotCSAoRkVUQ0hfRlVOQ19OQU1FKGtpbmQsIHUzMikgPT0gZm4pIHx8CVwKLQkgKEZFVENIX0ZVTkNfTkFNRShraW5kLCB1NjQpID09IGZuKSkKKyNkZWZpbmUgQ0hFQ0tfRkVUQ0hfRlVOQ1MobWV0aG9kLCBmbikJCQlcCisJKCgoRkVUQ0hfRlVOQ19OQU1FKG1ldGhvZCwgdTgpID09IGZuKSB8fAlcCisJICAoRkVUQ0hfRlVOQ19OQU1FKG1ldGhvZCwgdTE2KSA9PSBmbikgfHwJXAorCSAgKEZFVENIX0ZVTkNfTkFNRShtZXRob2QsIHUzMikgPT0gZm4pIHx8CVwKKwkgIChGRVRDSF9GVU5DX05BTUUobWV0aG9kLCB1NjQpID09IGZuKSB8fAlcCisJICAoRkVUQ0hfRlVOQ19OQU1FKG1ldGhvZCwgc3RyaW5nKSA9PSBmbikgfHwJXAorCSAgKEZFVENIX0ZVTkNfTkFNRShtZXRob2QsIHN0cmluZ19zaXplKSA9PSBmbikpIFwKKwkgJiYgKGZuICE9IE5VTEwpKQogCiAvKiBEYXRhIGZldGNoIGZ1bmN0aW9uIHRlbXBsYXRlcyAqLwogI2RlZmluZSBERUZJTkVfRkVUQ0hfcmVnKHR5cGUpCQkJCQkJXAogc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShyZWcsIHR5cGUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAlcCi0JCQkJCSAgdm9pZCAqb2Zmc2V0LCB2b2lkICpkZXN0KQlcCisJCQkJCXZvaWQgKm9mZnNldCwgdm9pZCAqZGVzdCkJXAogewkJCQkJCQkJCVwKIAkqKHR5cGUgKilkZXN0ID0gKHR5cGUpcmVnc19nZXRfcmVnaXN0ZXIocmVncywJCQlcCiAJCQkJKHVuc2lnbmVkIGludCkoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSk7CVwKIH0KIERFRklORV9CQVNJQ19GRVRDSF9GVU5DUyhyZWcpCisvKiBObyBzdHJpbmcgb24gdGhlIHJlZ2lzdGVyICovCisjZGVmaW5lIGZldGNoX3JlZ19zdHJpbmcgTlVMTAorI2RlZmluZSBmZXRjaF9yZWdfc3RyaW5nX3NpemUgTlVMTAogCiAjZGVmaW5lIERFRklORV9GRVRDSF9zdGFjayh0eXBlKQkJCQkJXAogc3RhdGljIF9fa3Byb2JlcyB2b2lkIEZFVENIX0ZVTkNfTkFNRShzdGFjaywgdHlwZSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsXApAQCAtMTI5LDYgKzE4Myw5IEBACiAJCQkJKHVuc2lnbmVkIGludCkoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSk7CVwKIH0KIERFRklORV9CQVNJQ19GRVRDSF9GVU5DUyhzdGFjaykKKy8qIE5vIHN0cmluZyBvbiB0aGUgc3RhY2sgZW50cnkgKi8KKyNkZWZpbmUgZmV0Y2hfc3RhY2tfc3RyaW5nIE5VTEwKKyNkZWZpbmUgZmV0Y2hfc3RhY2tfc3RyaW5nX3NpemUgTlVMTAogCiAjZGVmaW5lIERFRklORV9GRVRDSF9yZXR2YWwodHlwZSkJCQkJCVwKIHN0YXRpYyBfX2twcm9iZXMgdm9pZCBGRVRDSF9GVU5DX05BTUUocmV0dmFsLCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncyxcCkBAIC0xMzcsNiArMTk0LDkgQEAKIAkqKHR5cGUgKilkZXN0ID0gKHR5cGUpcmVnc19yZXR1cm5fdmFsdWUocmVncyk7CQkJXAogfQogREVGSU5FX0JBU0lDX0ZFVENIX0ZVTkNTKHJldHZhbCkKKy8qIE5vIHN0cmluZyBvbiB0aGUgcmV0dmFsICovCisjZGVmaW5lIGZldGNoX3JldHZhbF9zdHJpbmcgTlVMTAorI2RlZmluZSBmZXRjaF9yZXR2YWxfc3RyaW5nX3NpemUgTlVMTAogCiAjZGVmaW5lIERFRklORV9GRVRDSF9tZW1vcnkodHlwZSkJCQkJCVwKIHN0YXRpYyBfX2twcm9iZXMgdm9pZCBGRVRDSF9GVU5DX05BTUUobWVtb3J5LCB0eXBlKShzdHJ1Y3QgcHRfcmVncyAqcmVncyxcCkBAIC0xNDksNiArMjA5LDYyIEBACiAJCSoodHlwZSAqKWRlc3QgPSByZXR2YWw7CQkJCQlcCiB9CiBERUZJTkVfQkFTSUNfRkVUQ0hfRlVOQ1MobWVtb3J5KQorLyoKKyAqIEZldGNoIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gQ2FsbGVyIE1VU1Qgc2V0ICoodTMyICopZGVzdCB3aXRoIG1heAorICogbGVuZ3RoIGFuZCByZWxhdGl2ZSBkYXRhIGxvY2F0aW9uLgorICovCitzdGF0aWMgX19rcHJvYmVzIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgc3RyaW5nKShzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJCSAgICAgIHZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCit7CisJbG9uZyByZXQ7CisJaW50IG1heGxlbiA9IGdldF9ybG9jX2xlbigqKHUzMiAqKWRlc3QpOworCXU4ICpkc3QgPSBnZXRfcmxvY19kYXRhKGRlc3QpOworCXU4ICpzcmMgPSBhZGRyOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlpZiAoIW1heGxlbikKKwkJcmV0dXJuOworCS8qCisJICogVHJ5IHRvIGdldCBzdHJpbmcgYWdhaW4sIHNpbmNlIHRoZSBzdHJpbmcgY2FuIGJlIGNoYW5nZWQgd2hpbGUKKwkgKiBwcm9iaW5nLgorCSAqLworCXNldF9mcyhLRVJORUxfRFMpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisJZG8KKwkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhkc3QrKywgc3JjKyssIDEpOworCXdoaWxlIChkc3RbLTFdICYmIHJldCA9PSAwICYmIHNyYyAtICh1OCAqKWFkZHIgPCBtYXhsZW4pOworCWRzdFstMV0gPSAnXDAnOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmIChyZXQgPCAwKSB7CS8qIEZhaWxlZCB0byBmZXRjaCBzdHJpbmcgKi8KKwkJKCh1OCAqKWdldF9ybG9jX2RhdGEoZGVzdCkpWzBdID0gJ1wwJzsKKwkJKih1MzIgKilkZXN0ID0gbWFrZV9kYXRhX3Jsb2MoMCwgZ2V0X3Jsb2Nfb2ZmcygqKHUzMiAqKWRlc3QpKTsKKwl9IGVsc2UKKwkJKih1MzIgKilkZXN0ID0gbWFrZV9kYXRhX3Jsb2Moc3JjIC0gKHU4ICopYWRkciwKKwkJCQkJICAgICAgZ2V0X3Jsb2Nfb2ZmcygqKHUzMiAqKWRlc3QpKTsKK30KKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHN0cmluZyAtLSBpbmNsdWRpbmcgbnVsbCB0ZXJtaW5hbCBieXRlICovCitzdGF0aWMgX19rcHJvYmVzIHZvaWQgRkVUQ0hfRlVOQ19OQU1FKG1lbW9yeSwgc3RyaW5nX3NpemUpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkJCXZvaWQgKmFkZHIsIHZvaWQgKmRlc3QpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1OCBjOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKworCXNldF9mcyhLRVJORUxfRFMpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisJZG8geworCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCZjLCAodTggKilhZGRyICsgbGVuLCAxKTsKKwkJbGVuKys7CisJfSB3aGlsZSAoYyAmJiByZXQgPT0gMCAmJiBsZW4gPCBNQVhfU1RSSU5HX1NJWkUpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmIChyZXQgPCAwKQkvKiBGYWlsZWQgdG8gY2hlY2sgdGhlIGxlbmd0aCAqLworCQkqKHUzMiAqKWRlc3QgPSAwOworCWVsc2UKKwkJKih1MzIgKilkZXN0ID0gbGVuOworfQogCiAvKiBNZW1vcnkgZmV0Y2hpbmcgYnkgc3ltYm9sICovCiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlIHsKQEAgLTIwMyw2ICszMTksOCBAQAogCQkqKHR5cGUgKilkZXN0ID0gMDsJCQkJCVwKIH0KIERFRklORV9CQVNJQ19GRVRDSF9GVU5DUyhzeW1ib2wpCitERUZJTkVfRkVUQ0hfc3ltYm9sKHN0cmluZykKK0RFRklORV9GRVRDSF9zeW1ib2woc3RyaW5nX3NpemUpCiAKIC8qIERlcmVmZXJlbmNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb24gKi8KIHN0cnVjdCBkZXJlZl9mZXRjaF9wYXJhbSB7CkBAIC0yMjQsMTIgKzM0MiwxNCBAQAogCQkqKHR5cGUgKilkZXN0ID0gMDsJCQkJCVwKIH0KIERFRklORV9CQVNJQ19GRVRDSF9GVU5DUyhkZXJlZikKK0RFRklORV9GRVRDSF9kZXJlZihzdHJpbmcpCitERUZJTkVfRkVUQ0hfZGVyZWYoc3RyaW5nX3NpemUpCiAKIHN0YXRpYyBfX2twcm9iZXMgdm9pZCBmcmVlX2RlcmVmX2ZldGNoX3BhcmFtKHN0cnVjdCBkZXJlZl9mZXRjaF9wYXJhbSAqZGF0YSkKIHsKLQlpZiAoQ0hFQ0tfQkFTSUNfRkVUQ0hfRlVOQ1MoZGVyZWYsIGRhdGEtPm9yaWcuZm4pKQorCWlmIChDSEVDS19GRVRDSF9GVU5DUyhkZXJlZiwgZGF0YS0+b3JpZy5mbikpCiAJCWZyZWVfZGVyZWZfZmV0Y2hfcGFyYW0oZGF0YS0+b3JpZy5kYXRhKTsKLQllbHNlIGlmIChDSEVDS19CQVNJQ19GRVRDSF9GVU5DUyhzeW1ib2wsIGRhdGEtPm9yaWcuZm4pKQorCWVsc2UgaWYgKENIRUNLX0ZFVENIX0ZVTkNTKHN5bWJvbCwgZGF0YS0+b3JpZy5mbikpCiAJCWZyZWVfc3ltYm9sX2NhY2hlKGRhdGEtPm9yaWcuZGF0YSk7CiAJa2ZyZWUoZGF0YSk7CiB9CkBAIC0yNDAsMjMgKzM2MCw0MyBAQAogI2RlZmluZSBERUZBVUxUX0ZFVENIX1RZUEUgX0RFRkFVTFRfRkVUQ0hfVFlQRShCSVRTX1BFUl9MT05HKQogI2RlZmluZSBERUZBVUxUX0ZFVENIX1RZUEVfU1RSIF9fc3RyaW5naWZ5KERFRkFVTFRfRkVUQ0hfVFlQRSkKIAotI2RlZmluZSBBU1NJR05fRkVUQ0hfRlVOQyhraW5kLCB0eXBlKQlcCi0JLmtpbmQgPSBGRVRDSF9GVU5DX05BTUUoa2luZCwgdHlwZSkKKy8qIEZldGNoIHR5cGVzICovCitlbnVtIHsKKwlGRVRDSF9NVERfcmVnID0gMCwKKwlGRVRDSF9NVERfc3RhY2ssCisJRkVUQ0hfTVREX3JldHZhbCwKKwlGRVRDSF9NVERfbWVtb3J5LAorCUZFVENIX01URF9zeW1ib2wsCisJRkVUQ0hfTVREX2RlcmVmLAorCUZFVENIX01URF9FTkQsCit9OwogCi0jZGVmaW5lIEFTU0lHTl9GRVRDSF9UWVBFKHB0eXBlLCBmdHlwZSwgc2lnbikJXAotCXsubmFtZSA9ICNwdHlwZSwJCQlcCi0JIC5zaXplID0gc2l6ZW9mKGZ0eXBlKSwJCQlcCi0JIC5pc19zaWduZWQgPSBzaWduLAkJCVwKLQkgLnByaW50ID0gUFJJTlRfVFlQRV9GVU5DX05BTUUocHR5cGUpLAlcCi0JIC5mbXQgPSBQUklOVF9UWVBFX0ZNVF9OQU1FKHB0eXBlKSwJXAotQVNTSUdOX0ZFVENIX0ZVTkMocmVnLCBmdHlwZSksCQkJXAotQVNTSUdOX0ZFVENIX0ZVTkMoc3RhY2ssIGZ0eXBlKSwJCVwKLUFTU0lHTl9GRVRDSF9GVU5DKHJldHZhbCwgZnR5cGUpLAkJXAotQVNTSUdOX0ZFVENIX0ZVTkMobWVtb3J5LCBmdHlwZSksCQlcCi1BU1NJR05fRkVUQ0hfRlVOQyhzeW1ib2wsIGZ0eXBlKSwJCVwKLUFTU0lHTl9GRVRDSF9GVU5DKGRlcmVmLCBmdHlwZSksCQlcCisjZGVmaW5lIEFTU0lHTl9GRVRDSF9GVU5DKG1ldGhvZCwgdHlwZSkJXAorCVtGRVRDSF9NVERfIyNtZXRob2RdID0gRkVUQ0hfRlVOQ19OQU1FKG1ldGhvZCwgdHlwZSkKKworI2RlZmluZSBfX0FTU0lHTl9GRVRDSF9UWVBFKF9uYW1lLCBwdHlwZSwgZnR5cGUsIF9zaXplLCBzaWduLCBfZm10dHlwZSkJXAorCXsubmFtZSA9IF9uYW1lLAkJCQlcCisJIC5zaXplID0gX3NpemUsCQkJCQlcCisJIC5pc19zaWduZWQgPSBzaWduLAkJCQlcCisJIC5wcmludCA9IFBSSU5UX1RZUEVfRlVOQ19OQU1FKHB0eXBlKSwJCVwKKwkgLmZtdCA9IFBSSU5UX1RZUEVfRk1UX05BTUUocHR5cGUpLAkJXAorCSAuZm10dHlwZSA9IF9mbXR0eXBlLAkJCQlcCisJIC5mZXRjaCA9IHsJCQkJCVwKK0FTU0lHTl9GRVRDSF9GVU5DKHJlZywgZnR5cGUpLAkJCQlcCitBU1NJR05fRkVUQ0hfRlVOQyhzdGFjaywgZnR5cGUpLAkJCVwKK0FTU0lHTl9GRVRDSF9GVU5DKHJldHZhbCwgZnR5cGUpLAkJCVwKK0FTU0lHTl9GRVRDSF9GVU5DKG1lbW9yeSwgZnR5cGUpLAkJCVwKK0FTU0lHTl9GRVRDSF9GVU5DKHN5bWJvbCwgZnR5cGUpLAkJCVwKK0FTU0lHTl9GRVRDSF9GVU5DKGRlcmVmLCBmdHlwZSksCQkJXAorCSAgfQkJCQkJCVwKIAl9CiAKKyNkZWZpbmUgQVNTSUdOX0ZFVENIX1RZUEUocHR5cGUsIGZ0eXBlLCBzaWduKQkJCVwKKwlfX0FTU0lHTl9GRVRDSF9UWVBFKCNwdHlwZSwgcHR5cGUsIGZ0eXBlLCBzaXplb2YoZnR5cGUpLCBzaWduLCAjcHR5cGUpCisKKyNkZWZpbmUgRkVUQ0hfVFlQRV9TVFJJTkcgMAorI2RlZmluZSBGRVRDSF9UWVBFX1NUUlNJWkUgMQorCiAvKiBGZXRjaCB0eXBlIGluZm9ybWF0aW9uIHRhYmxlICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgewogCWNvbnN0IGNoYXIJKm5hbWU7CQkvKiBOYW1lIG9mIHR5cGUgKi8KQEAgLTI2NCwxNCArNDA0LDE2IEBACiAJaW50CQlpc19zaWduZWQ7CS8qIFNpZ25lZCBmbGFnICovCiAJcHJpbnRfdHlwZV9mdW5jX3QJcHJpbnQ7CS8qIFByaW50IGZ1bmN0aW9ucyAqLwogCWNvbnN0IGNoYXIJKmZtdDsJCS8qIEZyb21hdCBzdHJpbmcgKi8KKwljb25zdCBjaGFyCSpmbXR0eXBlOwkvKiBOYW1lIGluIGZvcm1hdCBmaWxlICovCiAJLyogRmV0Y2ggZnVuY3Rpb25zICovCi0JZmV0Y2hfZnVuY190CXJlZzsKLQlmZXRjaF9mdW5jX3QJc3RhY2s7Ci0JZmV0Y2hfZnVuY190CXJldHZhbDsKLQlmZXRjaF9mdW5jX3QJbWVtb3J5OwotCWZldGNoX2Z1bmNfdAlzeW1ib2w7Ci0JZmV0Y2hfZnVuY190CWRlcmVmOworCWZldGNoX2Z1bmNfdAlmZXRjaFtGRVRDSF9NVERfRU5EXTsKIH0gZmV0Y2hfdHlwZV90YWJsZVtdID0geworCS8qIFNwZWNpYWwgdHlwZXMgKi8KKwlbRkVUQ0hfVFlQRV9TVFJJTkddID0gX19BU1NJR05fRkVUQ0hfVFlQRSgic3RyaW5nIiwgc3RyaW5nLCBzdHJpbmcsCisJCQkJCXNpemVvZih1MzIpLCAxLCAiX19kYXRhX2xvYyBjaGFyW10iKSwKKwlbRkVUQ0hfVFlQRV9TVFJTSVpFXSA9IF9fQVNTSUdOX0ZFVENIX1RZUEUoInN0cmluZ19zaXplIiwgdTMyLAorCQkJCQlzdHJpbmdfc2l6ZSwgc2l6ZW9mKHUzMiksIDAsICJ1MzIiKSwKKwkvKiBCYXNpYyB0eXBlcyAqLwogCUFTU0lHTl9GRVRDSF9UWVBFKHU4LCAgdTgsICAwKSwKIAlBU1NJR05fRkVUQ0hfVFlQRSh1MTYsIHUxNiwgMCksCiAJQVNTSUdOX0ZFVENIX1RZUEUodTMyLCB1MzIsIDApLApAQCAtMzAyLDEyICs0NDQsMjggQEAKIAkqKHVuc2lnbmVkIGxvbmcgKilkZXN0ID0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CiB9CiAKK3N0YXRpYyBmZXRjaF9mdW5jX3QgZ2V0X2ZldGNoX3NpemVfZnVuY3Rpb24oY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgKnR5cGUsCisJCQkJCSAgICBmZXRjaF9mdW5jX3Qgb3JpZ19mbikKK3sKKwlpbnQgaTsKKworCWlmICh0eXBlICE9ICZmZXRjaF90eXBlX3RhYmxlW0ZFVENIX1RZUEVfU1RSSU5HXSkKKwkJcmV0dXJuIE5VTEw7CS8qIE9ubHkgc3RyaW5nIHR5cGUgbmVlZHMgc2l6ZSBmdW5jdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBGRVRDSF9NVERfRU5EOyBpKyspCisJCWlmICh0eXBlLT5mZXRjaFtpXSA9PSBvcmlnX2ZuKQorCQkJcmV0dXJuIGZldGNoX3R5cGVfdGFibGVbRkVUQ0hfVFlQRV9TVFJTSVpFXS5mZXRjaFtpXTsKKworCVdBUk5fT04oMSk7CS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwlyZXR1cm4gTlVMTDsKK30KKwogLyoqCiAgKiBLcHJvYmUgZXZlbnQgY29yZSBmdW5jdGlvbnMKICAqLwogCiBzdHJ1Y3QgcHJvYmVfYXJnIHsKIAlzdHJ1Y3QgZmV0Y2hfcGFyYW0JZmV0Y2g7CisJc3RydWN0IGZldGNoX3BhcmFtCWZldGNoX3NpemU7CiAJdW5zaWduZWQgaW50CQlvZmZzZXQ7CS8qIE9mZnNldCBmcm9tIGFyZ3VtZW50IGVudHJ5ICovCiAJY29uc3QgY2hhcgkJKm5hbWU7CS8qIE5hbWUgb2YgdGhpcyBhcmd1bWVudCAqLwogCWNvbnN0IGNoYXIJCSpjb21tOwkvKiBDb21tYW5kIG9mIHRoaXMgYXJndW1lbnQgKi8KQEAgLTQyOSw5ICs1ODcsOSBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX3Byb2JlX2FyZyhzdHJ1Y3QgcHJvYmVfYXJnICphcmcpCiB7Ci0JaWYgKENIRUNLX0JBU0lDX0ZFVENIX0ZVTkNTKGRlcmVmLCBhcmctPmZldGNoLmZuKSkKKwlpZiAoQ0hFQ0tfRkVUQ0hfRlVOQ1MoZGVyZWYsIGFyZy0+ZmV0Y2guZm4pKQogCQlmcmVlX2RlcmVmX2ZldGNoX3BhcmFtKGFyZy0+ZmV0Y2guZGF0YSk7Ci0JZWxzZSBpZiAoQ0hFQ0tfQkFTSUNfRkVUQ0hfRlVOQ1Moc3ltYm9sLCBhcmctPmZldGNoLmZuKSkKKwllbHNlIGlmIChDSEVDS19GRVRDSF9GVU5DUyhzeW1ib2wsIGFyZy0+ZmV0Y2guZm4pKQogCQlmcmVlX3N5bWJvbF9jYWNoZShhcmctPmZldGNoLmRhdGEpOwogCWtmcmVlKGFyZy0+bmFtZSk7CiAJa2ZyZWUoYXJnLT5jb21tKTsKQEAgLTU0OCw3ICs3MDYsNyBAQAogCiAJaWYgKHN0cmNtcChhcmcsICJyZXR2YWwiKSA9PSAwKSB7CiAJCWlmIChpc19yZXR1cm4pCi0JCQlmLT5mbiA9IHQtPnJldHZhbDsKKwkJCWYtPmZuID0gdC0+ZmV0Y2hbRkVUQ0hfTVREX3JldHZhbF07CiAJCWVsc2UKIAkJCXJldCA9IC1FSU5WQUw7CiAJfSBlbHNlIGlmIChzdHJuY21wKGFyZywgInN0YWNrIiwgNSkgPT0gMCkgewpAQCAtNTYyLDcgKzcyMCw3IEBACiAJCQlpZiAocmV0IHx8IHBhcmFtID4gUEFSQU1fTUFYX1NUQUNLKQogCQkJCXJldCA9IC1FSU5WQUw7CiAJCQllbHNlIHsKLQkJCQlmLT5mbiA9IHQtPnN0YWNrOworCQkJCWYtPmZuID0gdC0+ZmV0Y2hbRkVUQ0hfTVREX3N0YWNrXTsKIAkJCQlmLT5kYXRhID0gKHZvaWQgKilwYXJhbTsKIAkJCX0KIAkJfSBlbHNlCkBAIC01ODgsNyArNzQ2LDcgQEAKIAljYXNlICclJzoJLyogbmFtZWQgcmVnaXN0ZXIgKi8KIAkJcmV0ID0gcmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZzZXQoYXJnICsgMSk7CiAJCWlmIChyZXQgPj0gMCkgewotCQkJZi0+Zm4gPSB0LT5yZWc7CisJCQlmLT5mbiA9IHQtPmZldGNoW0ZFVENIX01URF9yZWddOwogCQkJZi0+ZGF0YSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcmV0OwogCQkJcmV0ID0gMDsKIAkJfQpAQCAtNTk4LDcgKzc1Niw3IEBACiAJCQlyZXQgPSBzdHJpY3Rfc3RydG91bChhcmcgKyAxLCAwLCAmcGFyYW0pOwogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKLQkJCWYtPmZuID0gdC0+bWVtb3J5OworCQkJZi0+Zm4gPSB0LT5mZXRjaFtGRVRDSF9NVERfbWVtb3J5XTsKIAkJCWYtPmRhdGEgPSAodm9pZCAqKXBhcmFtOwogCQl9IGVsc2UgewogCQkJcmV0ID0gc3BsaXRfc3ltYm9sX29mZnNldChhcmcgKyAxLCAmb2Zmc2V0KTsKQEAgLTYwNiw3ICs3NjQsNyBAQAogCQkJCWJyZWFrOwogCQkJZi0+ZGF0YSA9IGFsbG9jX3N5bWJvbF9jYWNoZShhcmcgKyAxLCBvZmZzZXQpOwogCQkJaWYgKGYtPmRhdGEpCi0JCQkJZi0+Zm4gPSB0LT5zeW1ib2w7CisJCQkJZi0+Zm4gPSB0LT5mZXRjaFtGRVRDSF9NVERfc3ltYm9sXTsKIAkJfQogCQlicmVhazsKIAljYXNlICcrJzoJLyogZGVyZWYgbWVtb3J5ICovCkBAIC02MzYsMTQgKzc5NCwxNyBAQAogCQkJaWYgKHJldCkKIAkJCQlrZnJlZShkcHJtKTsKIAkJCWVsc2UgewotCQkJCWYtPmZuID0gdC0+ZGVyZWY7CisJCQkJZi0+Zm4gPSB0LT5mZXRjaFtGRVRDSF9NVERfZGVyZWZdOwogCQkJCWYtPmRhdGEgPSAodm9pZCAqKWRwcm07CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJfQotCWlmICghcmV0ICYmICFmLT5mbikKKwlpZiAoIXJldCAmJiAhZi0+Zm4pIHsJLyogUGFyc2VkLCBidXQgZG8gbm90IGZpbmQgZmV0Y2ggbWV0aG9kICovCisJCXByX2luZm8oIiVzIHR5cGUgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZmV0Y2ggbWV0aG9kLlxuIiwKKwkJCXQtPm5hbWUpOwogCQlyZXQgPSAtRUlOVkFMOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02NTIsNiArODEzLDcgQEAKIAkJCSAgIHN0cnVjdCBwcm9iZV9hcmcgKnBhcmcsIGludCBpc19yZXR1cm4pCiB7CiAJY29uc3QgY2hhciAqdDsKKwlpbnQgcmV0OwogCiAJaWYgKHN0cmxlbihhcmcpID4gTUFYX0FSR1NUUl9MRU4pIHsKIAkJcHJfaW5mbygiQXJndW1lbnQgaXMgdG9vIGxvbmcuOiAlc1xuIiwgIGFyZyk7CkBAIC02NzQsNyArODM2LDEzIEBACiAJfQogCXBhcmctPm9mZnNldCA9IHRwLT5zaXplOwogCXRwLT5zaXplICs9IHBhcmctPnR5cGUtPnNpemU7Ci0JcmV0dXJuIF9fcGFyc2VfcHJvYmVfYXJnKGFyZywgcGFyZy0+dHlwZSwgJnBhcmctPmZldGNoLCBpc19yZXR1cm4pOworCXJldCA9IF9fcGFyc2VfcHJvYmVfYXJnKGFyZywgcGFyZy0+dHlwZSwgJnBhcmctPmZldGNoLCBpc19yZXR1cm4pOworCWlmIChyZXQgPj0gMCkgeworCQlwYXJnLT5mZXRjaF9zaXplLmZuID0gZ2V0X2ZldGNoX3NpemVfZnVuY3Rpb24ocGFyZy0+dHlwZSwKKwkJCQkJCQkgICAgICBwYXJnLT5mZXRjaC5mbik7CisJCXBhcmctPmZldGNoX3NpemUuZGF0YSA9IHBhcmctPmZldGNoLmRhdGE7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIC8qIFJldHVybiAxIGlmIG5hbWUgaXMgcmVzZXJ2ZWQgb3IgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgYXJndW1lbnQgKi8KQEAgLTc1NywxNCArOTI1LDE3IEBACiAJCQlwcl9pbmZvKCJEZWxldGUgY29tbWFuZCBuZWVkcyBhbiBldmVudCBuYW1lLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQltdXRleF9sb2NrKCZwcm9iZV9sb2NrKTsKIAkJdHAgPSBmaW5kX3Byb2JlX2V2ZW50KGV2ZW50LCBncm91cCk7CiAJCWlmICghdHApIHsKKwkJCW11dGV4X3VubG9jaygmcHJvYmVfbG9jayk7CiAJCQlwcl9pbmZvKCJFdmVudCAlcy8lcyBkb2Vzbid0IGV4aXN0LlxuIiwgZ3JvdXAsIGV2ZW50KTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAJCS8qIGRlbGV0ZSBhbiBldmVudCAqLwogCQl1bnJlZ2lzdGVyX3RyYWNlX3Byb2JlKHRwKTsKIAkJZnJlZV90cmFjZV9wcm9iZSh0cCk7CisJCW11dGV4X3VubG9jaygmcHJvYmVfbG9jayk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTA0Myw2ICsxMjE0LDU0IEBACiAJLnJlbGVhc2UgICAgICAgID0gc2VxX3JlbGVhc2UsCiB9OwogCisvKiBTdW0gdXAgdG90YWwgZGF0YSBsZW5ndGggZm9yIGR5bmFtaWMgYXJyYWllcyAoc3RyaW5ncykgKi8KK3N0YXRpYyBfX2twcm9iZXMgaW50IF9fZ2V0X2RhdGFfc2l6ZShzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwLAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGksIHJldCA9IDA7CisJdTMyIGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQorCQlpZiAodW5saWtlbHkodHAtPmFyZ3NbaV0uZmV0Y2hfc2l6ZS5mbikpIHsKKwkJCWNhbGxfZmV0Y2goJnRwLT5hcmdzW2ldLmZldGNoX3NpemUsIHJlZ3MsICZsZW4pOworCQkJcmV0ICs9IGxlbjsKKwkJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogU3RvcmUgdGhlIHZhbHVlIG9mIGVhY2ggYXJndW1lbnQgKi8KK3N0YXRpYyBfX2twcm9iZXMgdm9pZCBzdG9yZV90cmFjZV9hcmdzKGludCBlbnRfc2l6ZSwgc3RydWN0IHRyYWNlX3Byb2JlICp0cCwKKwkJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgICAgIHU4ICpkYXRhLCBpbnQgbWF4bGVuKQoreworCWludCBpOworCXUzMiBlbmQgPSB0cC0+c2l6ZTsKKwl1MzIgKmRsOwkvKiBEYXRhIChyZWxhdGl2ZSkgbG9jYXRpb24gKi8KKworCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKSB7CisJCWlmICh1bmxpa2VseSh0cC0+YXJnc1tpXS5mZXRjaF9zaXplLmZuKSkgeworCQkJLyoKKwkJCSAqIEZpcnN0LCB3ZSBzZXQgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIGFuZAorCQkJICogbWF4aW11bSBkYXRhIGxlbmd0aCB0byAqZGwKKwkJCSAqLworCQkJZGwgPSAodTMyICopKGRhdGEgKyB0cC0+YXJnc1tpXS5vZmZzZXQpOworCQkJKmRsID0gbWFrZV9kYXRhX3Jsb2MobWF4bGVuLCBlbmQgLSB0cC0+YXJnc1tpXS5vZmZzZXQpOworCQkJLyogVGhlbiB0cnkgdG8gZmV0Y2ggc3RyaW5nIG9yIGR5bmFtaWMgYXJyYXkgZGF0YSAqLworCQkJY2FsbF9mZXRjaCgmdHAtPmFyZ3NbaV0uZmV0Y2gsIHJlZ3MsIGRsKTsKKwkJCS8qIFJlZHVjZSBtYXhpbXVtIGxlbmd0aCAqLworCQkJZW5kICs9IGdldF9ybG9jX2xlbigqZGwpOworCQkJbWF4bGVuIC09IGdldF9ybG9jX2xlbigqZGwpOworCQkJLyogVHJpY2sgaGVyZSwgY29udmVydCBkYXRhX3Jsb2MgdG8gZGF0YV9sb2MgKi8KKwkJCSpkbCA9IGNvbnZlcnRfcmxvY190b19sb2MoKmRsLAorCQkJCSBlbnRfc2l6ZSArIHRwLT5hcmdzW2ldLm9mZnNldCk7CisJCX0gZWxzZQorCQkJLyogSnVzdCBmZXRjaGluZyBkYXRhIG5vcm1hbGx5ICovCisJCQljYWxsX2ZldGNoKCZ0cC0+YXJnc1tpXS5mZXRjaCwgcmVncywKKwkJCQkgICBkYXRhICsgdHAtPmFyZ3NbaV0ub2Zmc2V0KTsKKwl9Cit9CisKIC8qIEtwcm9iZSBoYW5kbGVyICovCiBzdGF0aWMgX19rcHJvYmVzIHZvaWQga3Byb2JlX3RyYWNlX2Z1bmMoc3RydWN0IGtwcm9iZSAqa3AsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMTA1MCw4ICsxMjY5LDcgQEAKIAlzdHJ1Y3Qga3Byb2JlX3RyYWNlX2VudHJ5X2hlYWQgKmVudHJ5OwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXI7Ci0JdTggKmRhdGE7Ci0JaW50IHNpemUsIGksIHBjOworCWludCBzaXplLCBkc2l6ZSwgcGM7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJnRwLT5jYWxsOwogCkBAIC0xMDYwLDcgKzEyNzgsOCBAQAogCWxvY2FsX3NhdmVfZmxhZ3MoaXJxX2ZsYWdzKTsKIAlwYyA9IHByZWVtcHRfY291bnQoKTsKIAotCXNpemUgPSBzaXplb2YoKmVudHJ5KSArIHRwLT5zaXplOworCWRzaXplID0gX19nZXRfZGF0YV9zaXplKHRwLCByZWdzKTsKKwlzaXplID0gc2l6ZW9mKCplbnRyeSkgKyB0cC0+c2l6ZSArIGRzaXplOwogCiAJZXZlbnQgPSB0cmFjZV9jdXJyZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoJmJ1ZmZlciwgY2FsbC0+ZXZlbnQudHlwZSwKIAkJCQkJCSAgc2l6ZSwgaXJxX2ZsYWdzLCBwYyk7CkBAIC0xMDY5LDkgKzEyODgsNyBAQAogCiAJZW50cnkgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKIAllbnRyeS0+aXAgPSAodW5zaWduZWQgbG9uZylrcC0+YWRkcjsKLQlkYXRhID0gKHU4ICopJmVudHJ5WzFdOwotCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQotCQljYWxsX2ZldGNoKCZ0cC0+YXJnc1tpXS5mZXRjaCwgcmVncywgZGF0YSArIHRwLT5hcmdzW2ldLm9mZnNldCk7CisJc3RvcmVfdHJhY2VfYXJncyhzaXplb2YoKmVudHJ5KSwgdHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCiAJaWYgKCFmaWx0ZXJfY3VycmVudF9jaGVja19kaXNjYXJkKGJ1ZmZlciwgY2FsbCwgZW50cnksIGV2ZW50KSkKIAkJdHJhY2Vfbm93YWtlX2J1ZmZlcl91bmxvY2tfY29tbWl0KGJ1ZmZlciwgZXZlbnQsIGlycV9mbGFncywgcGMpOwpAQCAtMTA4NSwxNSArMTMwMiwxNSBAQAogCXN0cnVjdCBrcmV0cHJvYmVfdHJhY2VfZW50cnlfaGVhZCAqZW50cnk7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcjsKLQl1OCAqZGF0YTsKLQlpbnQgc2l6ZSwgaSwgcGM7CisJaW50IHNpemUsIHBjLCBkc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmdHAtPmNhbGw7CiAKIAlsb2NhbF9zYXZlX2ZsYWdzKGlycV9mbGFncyk7CiAJcGMgPSBwcmVlbXB0X2NvdW50KCk7CiAKLQlzaXplID0gc2l6ZW9mKCplbnRyeSkgKyB0cC0+c2l6ZTsKKwlkc2l6ZSA9IF9fZ2V0X2RhdGFfc2l6ZSh0cCwgcmVncyk7CisJc2l6ZSA9IHNpemVvZigqZW50cnkpICsgdHAtPnNpemUgKyBkc2l6ZTsKIAogCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKCZidWZmZXIsIGNhbGwtPmV2ZW50LnR5cGUsCiAJCQkJCQkgIHNpemUsIGlycV9mbGFncywgcGMpOwpAQCAtMTEwMyw5ICsxMzIwLDcgQEAKIAllbnRyeSA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCWVudHJ5LT5mdW5jID0gKHVuc2lnbmVkIGxvbmcpdHAtPnJwLmtwLmFkZHI7CiAJZW50cnktPnJldF9pcCA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKLQlkYXRhID0gKHU4ICopJmVudHJ5WzFdOwotCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQotCQljYWxsX2ZldGNoKCZ0cC0+YXJnc1tpXS5mZXRjaCwgcmVncywgZGF0YSArIHRwLT5hcmdzW2ldLm9mZnNldCk7CisJc3RvcmVfdHJhY2VfYXJncyhzaXplb2YoKmVudHJ5KSwgdHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCiAJaWYgKCFmaWx0ZXJfY3VycmVudF9jaGVja19kaXNjYXJkKGJ1ZmZlciwgY2FsbCwgZW50cnksIGV2ZW50KSkKIAkJdHJhY2Vfbm93YWtlX2J1ZmZlcl91bmxvY2tfY29tbWl0KGJ1ZmZlciwgZXZlbnQsIGlycV9mbGFncywgcGMpOwpAQCAtMTEzNyw3ICsxMzUyLDcgQEAKIAlkYXRhID0gKHU4ICopJmZpZWxkWzFdOwogCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQogCQlpZiAoIXRwLT5hcmdzW2ldLnR5cGUtPnByaW50KHMsIHRwLT5hcmdzW2ldLm5hbWUsCi0JCQkJCSAgICAgZGF0YSArIHRwLT5hcmdzW2ldLm9mZnNldCkpCisJCQkJCSAgICAgZGF0YSArIHRwLT5hcmdzW2ldLm9mZnNldCwgZmllbGQpKQogCQkJZ290byBwYXJ0aWFsOwogCiAJaWYgKCF0cmFjZV9zZXFfcHV0cyhzLCAiXG4iKSkKQEAgLTExNzksNyArMTM5NCw3IEBACiAJZGF0YSA9ICh1OCAqKSZmaWVsZFsxXTsKIAlmb3IgKGkgPSAwOyBpIDwgdHAtPm5yX2FyZ3M7IGkrKykKIAkJaWYgKCF0cC0+YXJnc1tpXS50eXBlLT5wcmludChzLCB0cC0+YXJnc1tpXS5uYW1lLAotCQkJCQkgICAgIGRhdGEgKyB0cC0+YXJnc1tpXS5vZmZzZXQpKQorCQkJCQkgICAgIGRhdGEgKyB0cC0+YXJnc1tpXS5vZmZzZXQsIGZpZWxkKSkKIAkJCWdvdG8gcGFydGlhbDsKIAogCWlmICghdHJhY2Vfc2VxX3B1dHMocywgIlxuIikpCkBAIC0xMjE0LDExICsxNDI5LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcHJvYmVfZXZlbnRfcmF3X2luaXQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudF9jYWxsKQotewotCXJldHVybiAwOwotfQotCiAjdW5kZWYgREVGSU5FX0ZJRUxECiAjZGVmaW5lIERFRklORV9GSUVMRCh0eXBlLCBpdGVtLCBuYW1lLCBpc19zaWduZWQpCQkJXAogCWRvIHsJCQkJCQkJCVwKQEAgLTEyMzksNyArMTQ0OSw3IEBACiAJREVGSU5FX0ZJRUxEKHVuc2lnbmVkIGxvbmcsIGlwLCBGSUVMRF9TVFJJTkdfSVAsIDApOwogCS8qIFNldCBhcmd1bWVudCBuYW1lcyBhcyBmaWVsZHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdHAtPm5yX2FyZ3M7IGkrKykgewotCQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgdHAtPmFyZ3NbaV0udHlwZS0+bmFtZSwKKwkJcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsIHRwLT5hcmdzW2ldLnR5cGUtPmZtdHR5cGUsCiAJCQkJCSB0cC0+YXJnc1tpXS5uYW1lLAogCQkJCQkgc2l6ZW9mKGZpZWxkKSArIHRwLT5hcmdzW2ldLm9mZnNldCwKIAkJCQkJIHRwLT5hcmdzW2ldLnR5cGUtPnNpemUsCkBAIC0xMjYxLDcgKzE0NzEsNyBAQAogCURFRklORV9GSUVMRCh1bnNpZ25lZCBsb25nLCByZXRfaXAsIEZJRUxEX1NUUklOR19SRVRJUCwgMCk7CiAJLyogU2V0IGFyZ3VtZW50IG5hbWVzIGFzIGZpZWxkcyAqLwogCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKSB7Ci0JCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCB0cC0+YXJnc1tpXS50eXBlLT5uYW1lLAorCQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgdHAtPmFyZ3NbaV0udHlwZS0+Zm10dHlwZSwKIAkJCQkJIHRwLT5hcmdzW2ldLm5hbWUsCiAJCQkJCSBzaXplb2YoZmllbGQpICsgdHAtPmFyZ3NbaV0ub2Zmc2V0LAogCQkJCQkgdHAtPmFyZ3NbaV0udHlwZS0+c2l6ZSwKQEAgLTEzMDEsOCArMTUxMSwxMyBAQAogCXBvcyArPSBzbnByaW50ZihidWYgKyBwb3MsIExFTl9PUl9aRVJPLCAiXCIsICVzIiwgYXJnKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKSB7Ci0JCXBvcyArPSBzbnByaW50ZihidWYgKyBwb3MsIExFTl9PUl9aRVJPLCAiLCBSRUMtPiVzIiwKLQkJCQl0cC0+YXJnc1tpXS5uYW1lKTsKKwkJaWYgKHN0cmNtcCh0cC0+YXJnc1tpXS50eXBlLT5uYW1lLCAic3RyaW5nIikgPT0gMCkKKwkJCXBvcyArPSBzbnByaW50ZihidWYgKyBwb3MsIExFTl9PUl9aRVJPLAorCQkJCQkiLCBfX2dldF9zdHIoJXMpIiwKKwkJCQkJdHAtPmFyZ3NbaV0ubmFtZSk7CisJCWVsc2UKKwkJCXBvcyArPSBzbnByaW50ZihidWYgKyBwb3MsIExFTl9PUl9aRVJPLCAiLCBSRUMtPiVzIiwKKwkJCQkJdHAtPmFyZ3NbaV0ubmFtZSk7CiAJfQogCiAjdW5kZWYgTEVOX09SX1pFUk8KQEAgLTEzMzksMTEgKzE1NTQsMTEgQEAKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmdHAtPmNhbGw7CiAJc3RydWN0IGtwcm9iZV90cmFjZV9lbnRyeV9oZWFkICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQl1OCAqZGF0YTsKLQlpbnQgc2l6ZSwgX19zaXplLCBpOworCWludCBzaXplLCBfX3NpemUsIGRzaXplOwogCWludCByY3R4OwogCi0JX19zaXplID0gc2l6ZW9mKCplbnRyeSkgKyB0cC0+c2l6ZTsKKwlkc2l6ZSA9IF9fZ2V0X2RhdGFfc2l6ZSh0cCwgcmVncyk7CisJX19zaXplID0gc2l6ZW9mKCplbnRyeSkgKyB0cC0+c2l6ZSArIGRzaXplOwogCXNpemUgPSBBTElHTihfX3NpemUgKyBzaXplb2YodTMyKSwgc2l6ZW9mKHU2NCkpOwogCXNpemUgLT0gc2l6ZW9mKHUzMik7CiAJaWYgKFdBUk5fT05DRShzaXplID4gUEVSRl9NQVhfVFJBQ0VfU0laRSwKQEAgLTEzNTUsOSArMTU3MCw4IEBACiAJCXJldHVybjsKIAogCWVudHJ5LT5pcCA9ICh1bnNpZ25lZCBsb25nKWtwLT5hZGRyOwotCWRhdGEgPSAodTggKikmZW50cnlbMV07Ci0JZm9yIChpID0gMDsgaSA8IHRwLT5ucl9hcmdzOyBpKyspCi0JCWNhbGxfZmV0Y2goJnRwLT5hcmdzW2ldLmZldGNoLCByZWdzLCBkYXRhICsgdHAtPmFyZ3NbaV0ub2Zmc2V0KTsKKwltZW1zZXQoJmVudHJ5WzFdLCAwLCBkc2l6ZSk7CisJc3RvcmVfdHJhY2VfYXJncyhzaXplb2YoKmVudHJ5KSwgdHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCiAJaGVhZCA9IHRoaXNfY3B1X3B0cihjYWxsLT5wZXJmX2V2ZW50cyk7CiAJcGVyZl90cmFjZV9idWZfc3VibWl0KGVudHJ5LCBzaXplLCByY3R4LCBlbnRyeS0+aXAsIDEsIHJlZ3MsIGhlYWQpOwpAQCAtMTM3MSwxMSArMTU4NSwxMSBAQAogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZ0cC0+Y2FsbDsKIAlzdHJ1Y3Qga3JldHByb2JlX3RyYWNlX2VudHJ5X2hlYWQgKmVudHJ5OwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXU4ICpkYXRhOwotCWludCBzaXplLCBfX3NpemUsIGk7CisJaW50IHNpemUsIF9fc2l6ZSwgZHNpemU7CiAJaW50IHJjdHg7CiAKLQlfX3NpemUgPSBzaXplb2YoKmVudHJ5KSArIHRwLT5zaXplOworCWRzaXplID0gX19nZXRfZGF0YV9zaXplKHRwLCByZWdzKTsKKwlfX3NpemUgPSBzaXplb2YoKmVudHJ5KSArIHRwLT5zaXplICsgZHNpemU7CiAJc2l6ZSA9IEFMSUdOKF9fc2l6ZSArIHNpemVvZih1MzIpLCBzaXplb2YodTY0KSk7CiAJc2l6ZSAtPSBzaXplb2YodTMyKTsKIAlpZiAoV0FSTl9PTkNFKHNpemUgPiBQRVJGX01BWF9UUkFDRV9TSVpFLApAQCAtMTM4OCw5ICsxNjAyLDcgQEAKIAogCWVudHJ5LT5mdW5jID0gKHVuc2lnbmVkIGxvbmcpdHAtPnJwLmtwLmFkZHI7CiAJZW50cnktPnJldF9pcCA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKLQlkYXRhID0gKHU4ICopJmVudHJ5WzFdOwotCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQotCQljYWxsX2ZldGNoKCZ0cC0+YXJnc1tpXS5mZXRjaCwgcmVncywgZGF0YSArIHRwLT5hcmdzW2ldLm9mZnNldCk7CisJc3RvcmVfdHJhY2VfYXJncyhzaXplb2YoKmVudHJ5KSwgdHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCiAJaGVhZCA9IHRoaXNfY3B1X3B0cihjYWxsLT5wZXJmX2V2ZW50cyk7CiAJcGVyZl90cmFjZV9idWZfc3VibWl0KGVudHJ5LCBzaXplLCByY3R4LCBlbnRyeS0+cmV0X2lwLCAxLCByZWdzLCBoZWFkKTsKQEAgLTE0ODYsMTUgKzE2OTgsMTIgQEAKIAlpbnQgcmV0OwogCiAJLyogSW5pdGlhbGl6ZSBmdHJhY2VfZXZlbnRfY2FsbCAqLworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5jbGFzcy0+ZmllbGRzKTsKIAlpZiAocHJvYmVfaXNfcmV0dXJuKHRwKSkgewotCQlJTklUX0xJU1RfSEVBRCgmY2FsbC0+Y2xhc3MtPmZpZWxkcyk7CiAJCWNhbGwtPmV2ZW50LmZ1bmNzID0gJmtyZXRwcm9iZV9mdW5jczsKLQkJY2FsbC0+Y2xhc3MtPnJhd19pbml0ID0gcHJvYmVfZXZlbnRfcmF3X2luaXQ7CiAJCWNhbGwtPmNsYXNzLT5kZWZpbmVfZmllbGRzID0ga3JldHByb2JlX2V2ZW50X2RlZmluZV9maWVsZHM7CiAJfSBlbHNlIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmNsYXNzLT5maWVsZHMpOwogCQljYWxsLT5ldmVudC5mdW5jcyA9ICZrcHJvYmVfZnVuY3M7Ci0JCWNhbGwtPmNsYXNzLT5yYXdfaW5pdCA9IHByb2JlX2V2ZW50X3Jhd19pbml0OwogCQljYWxsLT5jbGFzcy0+ZGVmaW5lX2ZpZWxkcyA9IGtwcm9iZV9ldmVudF9kZWZpbmVfZmllbGRzOwogCX0KIAlpZiAoc2V0X3ByaW50X2ZtdCh0cCkgPCAwKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2tzeW0uYyBiL2tlcm5lbC90cmFjZS90cmFjZV9rc3ltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYWYwMDcuLjAwMDAwMDAKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2tzeW0uYworKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogdHJhY2Vfa3N5bS5jIC0gS2VybmVsIFN5bWJvbCBUcmFjZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA5Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgotI2luY2x1ZGUgInRyYWNlLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+Ci0jaW5jbHVkZSA8YXNtL2h3X2JyZWFrcG9pbnQuaD4KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLQotI2RlZmluZSBLU1lNX1RSQUNFUl9PUF9MRU4gMyAvKiBydy0gKi8KLQotc3RydWN0IHRyYWNlX2tzeW0gewotCXN0cnVjdCBwZXJmX2V2ZW50CSoqa3N5bV9oYnA7Ci0Jc3RydWN0IHBlcmZfZXZlbnRfYXR0cglhdHRyOwotI2lmZGVmIENPTkZJR19QUk9GSUxFX0tTWU1fVFJBQ0VSCi0JYXRvbWljNjRfdAkJY291bnRlcjsKLSNlbmRpZgotCXN0cnVjdCBobGlzdF9ub2RlCWtzeW1faGxpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IHRyYWNlX2FycmF5ICprc3ltX3RyYWNlX2FycmF5OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGtzeW1fdHJhY2luZ19lbmFibGVkOwotCi1zdGF0aWMgSExJU1RfSEVBRChrc3ltX2ZpbHRlcl9oZWFkKTsKLQotc3RhdGljIERFRklORV9NVVRFWChrc3ltX3RyYWNlcl9tdXRleCk7Ci0KLSNpZmRlZiBDT05GSUdfUFJPRklMRV9LU1lNX1RSQUNFUgotCi0jZGVmaW5lIE1BWF9VTF9JTlQgMHhmZmZmZmZmZgotCi12b2lkIGtzeW1fY29sbGVjdF9zdGF0cyh1bnNpZ25lZCBsb25nIGhicF9oaXRfYWRkcikKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgdHJhY2Vfa3N5bSAqZW50cnk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVudHJ5LCBub2RlLCAma3N5bV9maWx0ZXJfaGVhZCwga3N5bV9obGlzdCkgewotCQlpZiAoZW50cnktPmF0dHIuYnBfYWRkciA9PSBoYnBfaGl0X2FkZHIpIHsKLQkJCWF0b21pYzY0X2luYygmZW50cnktPmNvdW50ZXIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BST0ZJTEVfS1NZTV9UUkFDRVIgKi8KLQotdm9pZCBrc3ltX2hicF9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpoYnAsIGludCBubWksCi0JCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAotCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCXN0cnVjdCBrc3ltX3RyYWNlX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcjsKLQlpbnQgcGM7Ci0KLQlpZiAoIWtzeW1fdHJhY2luZ19lbmFibGVkKQotCQlyZXR1cm47Ci0KLQlidWZmZXIgPSBrc3ltX3RyYWNlX2FycmF5LT5idWZmZXI7Ci0KLQlwYyA9IHByZWVtcHRfY291bnQoKTsKLQotCWV2ZW50ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShidWZmZXIsIFRSQUNFX0tTWU0sCi0JCQkJCQkJc2l6ZW9mKCplbnRyeSksIDAsIHBjKTsKLQlpZiAoIWV2ZW50KQotCQlyZXR1cm47Ci0KLQllbnRyeQkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKLQllbnRyeS0+aXAJPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwotCWVudHJ5LT50eXBlCT0gaHdfYnJlYWtwb2ludF90eXBlKGhicCk7Ci0JZW50cnktPmFkZHIJPSBod19icmVha3BvaW50X2FkZHIoaGJwKTsKLQlzdHJsY3B5KGVudHJ5LT5jbWQsIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwotCi0jaWZkZWYgQ09ORklHX1BST0ZJTEVfS1NZTV9UUkFDRVIKLQlrc3ltX2NvbGxlY3Rfc3RhdHMoaHdfYnJlYWtwb2ludF9hZGRyKGhicCkpOwotI2VuZGlmIC8qIENPTkZJR19QUk9GSUxFX0tTWU1fVFJBQ0VSICovCi0KLQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdChidWZmZXIsIGV2ZW50LCAwLCBwYyk7Ci19Ci0KLS8qIFZhbGlkIGFjY2VzcyB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYXMKLSAqCi0gKiBydy0gOiBTZXQgUmVhZC9Xcml0ZSBBY2Nlc3MgQnJlYWtwb2ludAotICogLXctIDogU2V0IFdyaXRlIEFjY2VzcyBCcmVha3BvaW50Ci0gKiAtLS0gOiBDbGVhciBCcmVha3BvaW50cwotICogLS14IDogU2V0IEV4ZWN1dGlvbiBCcmVhayBwb2ludHMgKE5vdCBhdmFpbGFibGUgeWV0KQotICoKLSAqLwotc3RhdGljIGludCBrc3ltX3RyYWNlX2dldF9hY2Nlc3NfdHlwZShjaGFyICpzdHIpCi17Ci0JaW50IGFjY2VzcyA9IDA7Ci0KLQlpZiAoc3RyWzBdID09ICdyJykKLQkJYWNjZXNzIHw9IEhXX0JSRUFLUE9JTlRfUjsKLQotCWlmIChzdHJbMV0gPT0gJ3cnKQotCQlhY2Nlc3MgfD0gSFdfQlJFQUtQT0lOVF9XOwotCi0JaWYgKHN0clsyXSA9PSAneCcpCi0JCWFjY2VzcyB8PSBIV19CUkVBS1BPSU5UX1g7Ci0KLQlzd2l0Y2ggKGFjY2VzcykgewotCWNhc2UgSFdfQlJFQUtQT0lOVF9SOgotCWNhc2UgSFdfQlJFQUtQT0lOVF9XOgotCWNhc2UgSFdfQlJFQUtQT0lOVF9XIHwgSFdfQlJFQUtQT0lOVF9SOgotCQlyZXR1cm4gYWNjZXNzOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotLyoKLSAqIFRoZXJlIGNhbiBiZSBzZXZlcmFsIHBvc3NpYmxlIG1hbGZvcm1lZCByZXF1ZXN0cyBhbmQgd2UgYXR0ZW1wdCB0byBjYXB0dXJlCi0gKiBhbGwgb2YgdGhlbS4gV2UgZW51bWVyYXRlIHNvbWUgb2YgdGhlIHJ1bGVzCi0gKiAxLiBXZSB3aWxsIG5vdCBhbGxvdyBrZXJuZWwgc3ltYm9scyB3aXRoICc6JyBzaW5jZSBpdCBpcyB1c2VkIGFzIGEgZGVsaW1pdGVyLgotICogICAgaS5lLiBtdWx0aXBsZSAnOicgc3ltYm9scyBkaXNhbGxvd2VkLiBQb3NzaWJsZSB1c2VzIGFyZSBvZiB0aGUgZm9ybQotICogICAgPG1vZHVsZT46PGtzeW1fbmFtZT46PG9wPi4KLSAqIDIuIE5vIGRlbGltaXRlciBzeW1ib2wgJzonIGluIHRoZSBpbnB1dCBzdHJpbmcKLSAqIDMuIFNwdXJpb3VzIG9wZXJhdG9yIHN5bWJvbHMgb3Igc3ltYm9scyBub3QgaW4gdGhlaXIgcmVzcGVjdGl2ZSBwb3NpdGlvbnMKLSAqIDQuIDxrc3ltX25hbWU+Oi0tLSBpLmUuIGNsZWFyIGJyZWFrcG9pbnQgcmVxdWVzdCB3aGVuIGtzeW1fbmFtZSBub3QgaW4gZmlsZQotICogNS4gS2VybmVsIHN5bWJvbCBub3QgYSBwYXJ0IG9mIC9wcm9jL2thbGxzeW1zCi0gKiA2LiBEdXBsaWNhdGUgcmVxdWVzdHMKLSAqLwotc3RhdGljIGludCBwYXJzZV9rc3ltX3RyYWNlX3N0cihjaGFyICppbnB1dF9zdHJpbmcsIGNoYXIgKiprc3ltbmFtZSwKLQkJCQkJCQl1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCByZXQ7Ci0KLQkqa3N5bW5hbWUgPSBzdHJzZXAoJmlucHV0X3N0cmluZywgIjoiKTsKLQkqYWRkciA9IGthbGxzeW1zX2xvb2t1cF9uYW1lKCprc3ltbmFtZSk7Ci0KLQkvKiBDaGVjayBmb3IgbWFsZm9ybWVkIHJlcXVlc3Q6ICgyKSwgKDEpIGFuZCAoNSkgKi8KLQlpZiAoKCFpbnB1dF9zdHJpbmcpIHx8Ci0JICAgIChzdHJsZW4oaW5wdXRfc3RyaW5nKSAhPSBLU1lNX1RSQUNFUl9PUF9MRU4pIHx8Ci0JICAgICgqYWRkciA9PSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7OwotCi0JcmV0ID0ga3N5bV90cmFjZV9nZXRfYWNjZXNzX3R5cGUoaW5wdXRfc3RyaW5nKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBwcm9jZXNzX25ld19rc3ltX2VudHJ5KGNoYXIgKmtzeW1uYW1lLCBpbnQgb3AsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlzdHJ1Y3QgdHJhY2Vfa3N5bSAqZW50cnk7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0KLQllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmFjZV9rc3ltKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlod19icmVha3BvaW50X2luaXQoJmVudHJ5LT5hdHRyKTsKLQotCWVudHJ5LT5hdHRyLmJwX3R5cGUgPSBvcDsKLQllbnRyeS0+YXR0ci5icF9hZGRyID0gYWRkcjsKLQllbnRyeS0+YXR0ci5icF9sZW4gPSBIV19CUkVBS1BPSU5UX0xFTl80OwotCi0JZW50cnktPmtzeW1faGJwID0gcmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KCZlbnRyeS0+YXR0ciwKLQkJCQkJa3N5bV9oYnBfaGFuZGxlcik7Ci0KLQlpZiAoSVNfRVJSKGVudHJ5LT5rc3ltX2hicCkpIHsKLQkJcmV0ID0gUFRSX0VSUihlbnRyeS0+a3N5bV9oYnApOwotCQlpZiAocmV0ID09IC1FTk9TUEMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAia3N5bV90cmFjZXI6IE1heGltdW0gbGltaXQgcmVhY2hlZC4iCi0JCQkiIE5vIG5ldyByZXF1ZXN0cyBmb3IgdHJhY2luZyBjYW4gYmUgYWNjZXB0ZWQgbm93LlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJrc3ltX3RyYWNlciByZXF1ZXN0IGZhaWxlZC4gVHJ5IGFnYWluIgotCQkJCQkgIiBsYXRlciEhXG4iKTsKLQkJfQotCQlnb3RvIGVycjsKLQl9Ci0KLQlobGlzdF9hZGRfaGVhZF9yY3UoJihlbnRyeS0+a3N5bV9obGlzdCksICZrc3ltX2ZpbHRlcl9oZWFkKTsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0Ja2ZyZWUoZW50cnkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3Qga3N5bV90cmFjZV9maWx0ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgdHJhY2Vfa3N5bSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IHRyYWNlX3NlcSAqczsKLQlzc2l6ZV90IGNudCA9IDA7Ci0JaW50IHJldDsKLQotCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOwotCWlmICghcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JdHJhY2Vfc2VxX2luaXQocyk7Ci0KLQltdXRleF9sb2NrKCZrc3ltX3RyYWNlcl9tdXRleCk7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbm9kZSwgJmtzeW1fZmlsdGVyX2hlYWQsIGtzeW1faGxpc3QpIHsKLQkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXBTOiIsCi0JCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZyllbnRyeS0+YXR0ci5icF9hZGRyKTsKLQkJaWYgKGVudHJ5LT5hdHRyLmJwX3R5cGUgPT0gSFdfQlJFQUtQT0lOVF9SKQotCQkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgInItLVxuIik7Ci0JCWVsc2UgaWYgKGVudHJ5LT5hdHRyLmJwX3R5cGUgPT0gSFdfQlJFQUtQT0lOVF9XKQotCQkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgIi13LVxuIik7Ci0JCWVsc2UgaWYgKGVudHJ5LT5hdHRyLmJwX3R5cGUgPT0gKEhXX0JSRUFLUE9JTlRfVyB8IEhXX0JSRUFLUE9JTlRfUikpCi0JCQlyZXQgPSB0cmFjZV9zZXFfcHV0cyhzLCAicnctXG4iKTsKLQkJV0FSTl9PTl9PTkNFKCFyZXQpOwotCX0KLQotCWNudCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9zLCBzLT5idWZmZXIsIHMtPmxlbik7Ci0KLQltdXRleF91bmxvY2soJmtzeW1fdHJhY2VyX211dGV4KTsKLQotCWtmcmVlKHMpOwotCi0JcmV0dXJuIGNudDsKLX0KLQotc3RhdGljIHZvaWQgX19rc3ltX3RyYWNlX3Jlc2V0KHZvaWQpCi17Ci0Jc3RydWN0IHRyYWNlX2tzeW0gKmVudHJ5OwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZTE7Ci0KLQltdXRleF9sb2NrKCZrc3ltX3RyYWNlcl9tdXRleCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbm9kZSwgbm9kZTEsICZrc3ltX2ZpbHRlcl9oZWFkLAotCQkJCQkJCQlrc3ltX2hsaXN0KSB7Ci0JCXVucmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KGVudHJ5LT5rc3ltX2hicCk7Ci0JCWhsaXN0X2RlbF9yY3UoJihlbnRyeS0+a3N5bV9obGlzdCkpOwotCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJa2ZyZWUoZW50cnkpOwotCX0KLQltdXRleF91bmxvY2soJmtzeW1fdHJhY2VyX211dGV4KTsKLX0KLQotc3RhdGljIHNzaXplX3Qga3N5bV90cmFjZV9maWx0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgdHJhY2Vfa3N5bSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0JY2hhciAqYnVmLCAqaW5wdXRfc3RyaW5nLCAqa3N5bW5hbWUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcga3N5bV9hZGRyID0gMDsKLQlpbnQgcmV0LCBvcCwgY2hhbmdlZCA9IDA7Ci0KLQlidWYgPSBremFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gLUVGQVVMVDsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkKLQkJZ290byBvdXQ7Ci0KLQlidWZbY291bnRdID0gJ1wwJzsKLQlpbnB1dF9zdHJpbmcgPSBzdHJzdHJpcChidWYpOwotCi0JLyoKLQkgKiBDbGVhciBhbGwgYnJlYWtwb2ludHMgaWY6Ci0JICogMTogZWNobyA+IGtzeW1fdHJhY2VfZmlsdGVyCi0JICogMjogZWNobyAwID4ga3N5bV90cmFjZV9maWx0ZXIKLQkgKiAzOiBlY2hvICIqOi0tLSIgPiBrc3ltX3RyYWNlX2ZpbHRlcgotCSAqLwotCWlmICghaW5wdXRfc3RyaW5nWzBdIHx8ICFzdHJjbXAoaW5wdXRfc3RyaW5nLCAiMCIpIHx8Ci0JICAgICFzdHJjbXAoaW5wdXRfc3RyaW5nLCAiKjotLS0iKSkgewotCQlfX2tzeW1fdHJhY2VfcmVzZXQoKTsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gb3AgPSBwYXJzZV9rc3ltX3RyYWNlX3N0cihpbnB1dF9zdHJpbmcsICZrc3ltbmFtZSwgJmtzeW1fYWRkcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXV0ZXhfbG9jaygma3N5bV90cmFjZXJfbXV0ZXgpOwotCi0JcmV0ID0gLUVJTlZBTDsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbm9kZSwgJmtzeW1fZmlsdGVyX2hlYWQsIGtzeW1faGxpc3QpIHsKLQkJaWYgKGVudHJ5LT5hdHRyLmJwX2FkZHIgPT0ga3N5bV9hZGRyKSB7Ci0JCQkvKiBDaGVjayBmb3IgbWFsZm9ybWVkIHJlcXVlc3Q6ICg2KSAqLwotCQkJaWYgKGVudHJ5LT5hdHRyLmJwX3R5cGUgIT0gb3ApCi0JCQkJY2hhbmdlZCA9IDE7Ci0JCQllbHNlCi0JCQkJZ290byBvdXRfdW5sb2NrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGNoYW5nZWQpIHsKLQkJdW5yZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnQoZW50cnktPmtzeW1faGJwKTsKLQkJZW50cnktPmF0dHIuYnBfdHlwZSA9IG9wOwotCQlyZXQgPSAwOwotCQlpZiAob3AgPiAwKSB7Ci0JCQllbnRyeS0+a3N5bV9oYnAgPQotCQkJCXJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludCgmZW50cnktPmF0dHIsCi0JCQkJCWtzeW1faGJwX2hhbmRsZXIpOwotCQkJaWYgKElTX0VSUihlbnRyeS0+a3N5bV9oYnApKQotCQkJCXJldCA9IFBUUl9FUlIoZW50cnktPmtzeW1faGJwKTsKLQkJCWVsc2UKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQkJLyogRXJyb3Igb3IgInN5bWJvbDotLS0iIGNhc2U6IGRyb3AgaXQgKi8KLQkJaGxpc3RfZGVsX3JjdSgmKGVudHJ5LT5rc3ltX2hsaXN0KSk7Ci0JCXN5bmNocm9uaXplX3JjdSgpOwotCQlrZnJlZShlbnRyeSk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9IGVsc2UgewotCQkvKiBDaGVjayBmb3IgbWFsZm9ybWVkIHJlcXVlc3Q6ICg0KSAqLwotCQlpZiAob3ApCi0JCQlyZXQgPSBwcm9jZXNzX25ld19rc3ltX2VudHJ5KGtzeW1uYW1lLCBvcCwga3N5bV9hZGRyKTsKLQl9Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygma3N5bV90cmFjZXJfbXV0ZXgpOwotb3V0OgotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuICFyZXQgPyBjb3VudCA6IHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga3N5bV90cmFjaW5nX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCi0JLnJlYWQJCT0ga3N5bV90cmFjZV9maWx0ZXJfcmVhZCwKLQkud3JpdGUJCT0ga3N5bV90cmFjZV9maWx0ZXJfd3JpdGUsCi19OwotCi1zdGF0aWMgdm9pZCBrc3ltX3RyYWNlX3Jlc2V0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0Ja3N5bV90cmFjaW5nX2VuYWJsZWQgPSAwOwotCV9fa3N5bV90cmFjZV9yZXNldCgpOwotfQotCi1zdGF0aWMgaW50IGtzeW1fdHJhY2VfaW5pdChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQotewotCWludCBjcHUsIHJldCA9IDA7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJdHJhY2luZ19yZXNldCh0ciwgY3B1KTsKLQlrc3ltX3RyYWNpbmdfZW5hYmxlZCA9IDE7Ci0Ja3N5bV90cmFjZV9hcnJheSA9IHRyOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQga3N5bV90cmFjZV9wcmludF9oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKQotewotCXNlcV9wdXRzKG0sCi0JCSAiIyAgICAgICBUQVNLLVBJRCAgIENQVSMgICAgICBTeW1ib2wgICAgICAgICAgICAgICAgICAgICIKLQkJICJUeXBlICAgIEZ1bmN0aW9uXG4iKTsKLQlzZXFfcHV0cyhtLAotCQkgIiMgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAiCi0JCSAiIHwgICAgICAgICB8XG4iKTsKLX0KLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90IGtzeW1fdHJhY2Vfb3V0cHV0KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKLXsKLQlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5ID0gaXRlci0+ZW50OwotCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwotCXN0cnVjdCBrc3ltX3RyYWNlX2VudHJ5ICpmaWVsZDsKLQljaGFyIHN0cltLU1lNX1NZTUJPTF9MRU5dOwotCWludCByZXQ7Ci0KLQlpZiAoZW50cnktPnR5cGUgIT0gVFJBQ0VfS1NZTSkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOwotCi0JdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGVudHJ5KTsKLQotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiUxMXMtJS01ZCBbJTAzZF0gJXBTIiwgZmllbGQtPmNtZCwKLQkJCQllbnRyeS0+cGlkLCBpdGVyLT5jcHUsIChjaGFyICopZmllbGQtPmFkZHIpOwotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0KLQlzd2l0Y2ggKGZpZWxkLT50eXBlKSB7Ci0JY2FzZSBIV19CUkVBS1BPSU5UX1I6Ci0JCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiBSICAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBIV19CUkVBS1BPSU5UX1c6Ci0JCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiBXICAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBIV19CUkVBS1BPSU5UX1IgfCBIV19CUkVBS1BPSU5UX1c6Ci0JCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiBSVyAiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCX0KLQotCWlmICghcmV0KQotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0KLQlzcHJpbnRfc3ltYm9sKHN0ciwgZmllbGQtPmlwKTsKLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIlc1xuIiwgc3RyKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCi0JcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotc3RydWN0IHRyYWNlciBrc3ltX3RyYWNlciBfX3JlYWRfbW9zdGx5ID0KLXsKLQkubmFtZQkJPSAia3N5bV90cmFjZXIiLAotCS5pbml0CQk9IGtzeW1fdHJhY2VfaW5pdCwKLQkucmVzZXQJCT0ga3N5bV90cmFjZV9yZXNldCwKLSNpZmRlZiBDT05GSUdfRlRSQUNFX1NFTEZURVNUCi0JLnNlbGZ0ZXN0CT0gdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9rc3ltLAotI2VuZGlmCi0JLnByaW50X2hlYWRlciAgID0ga3N5bV90cmFjZV9wcmludF9oZWFkZXIsCi0JLnByaW50X2xpbmUJPSBrc3ltX3RyYWNlX291dHB1dAotfTsKLQotI2lmZGVmIENPTkZJR19QUk9GSUxFX0tTWU1fVFJBQ0VSCi1zdGF0aWMgaW50IGtzeW1fcHJvZmlsZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgdHJhY2Vfa3N5bSAqZW50cnk7Ci0JaW50IGFjY2Vzc190eXBlID0gMDsKLQljaGFyIGZuX25hbWVbS1NZTV9OQU1FX0xFTl07Ci0KLQlzZXFfcHV0cyhtLCAiICBBY2Nlc3MgVHlwZSAiKTsKLQlzZXFfcHV0cyhtLCAiICBTeW1ib2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyXG4iKTsKLQlzZXFfcHV0cyhtLCAiICAtLS0tLS0tLS0tLSAiKTsKLQlzZXFfcHV0cyhtLCAiICAtLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tXG4iKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZW50cnksIG5vZGUsICZrc3ltX2ZpbHRlcl9oZWFkLCBrc3ltX2hsaXN0KSB7Ci0KLQkJYWNjZXNzX3R5cGUgPSBlbnRyeS0+YXR0ci5icF90eXBlOwotCi0JCXN3aXRjaCAoYWNjZXNzX3R5cGUpIHsKLQkJY2FzZSBIV19CUkVBS1BPSU5UX1I6Ci0JCQlzZXFfcHV0cyhtLCAiICBSICAgICAgICAgICAiKTsKLQkJCWJyZWFrOwotCQljYXNlIEhXX0JSRUFLUE9JTlRfVzoKLQkJCXNlcV9wdXRzKG0sICIgIFcgICAgICAgICAgICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFdfQlJFQUtQT0lOVF9SIHwgSFdfQlJFQUtQT0lOVF9XOgotCQkJc2VxX3B1dHMobSwgIiAgUlcgICAgICAgICAgIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNlcV9wdXRzKG0sICIgIE5BICAgICAgICAgICIpOwotCQl9Ci0KLQkJaWYgKGxvb2t1cF9zeW1ib2xfbmFtZShlbnRyeS0+YXR0ci5icF9hZGRyLCBmbl9uYW1lKSA+PSAwKQotCQkJc2VxX3ByaW50ZihtLCAiICAlLTM2cyIsIGZuX25hbWUpOwotCQllbHNlCi0JCQlzZXFfcHJpbnRmKG0sICIgICUtMzZzIiwgIjxOQT4iKTsKLQkJc2VxX3ByaW50ZihtLCAiICUxNWxsdVxuIiwKLQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXRvbWljNjRfcmVhZCgmZW50cnktPmNvdW50ZXIpKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBrc3ltX3Byb2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKm5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBrc3ltX3Byb2ZpbGVfc2hvdywgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtzeW1fcHJvZmlsZV9mb3BzID0gewotCS5vcGVuCQk9IGtzeW1fcHJvZmlsZV9vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi19OwotI2VuZGlmIC8qIENPTkZJR19QUk9GSUxFX0tTWU1fVFJBQ0VSICovCi0KLV9faW5pdCBzdGF0aWMgaW50IGluaXRfa3N5bV90cmFjZSh2b2lkKQotewotCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwotCi0JZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7Ci0KLQl0cmFjZV9jcmVhdGVfZmlsZSgia3N5bV90cmFjZV9maWx0ZXIiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCSAgTlVMTCwgJmtzeW1fdHJhY2luZ19mb3BzKTsKLQotI2lmZGVmIENPTkZJR19QUk9GSUxFX0tTWU1fVFJBQ0VSCi0JdHJhY2VfY3JlYXRlX2ZpbGUoImtzeW1fcHJvZmlsZSIsIDA0NDQsIGRfdHJhY2VyLAotCQkJICBOVUxMLCAma3N5bV9wcm9maWxlX2ZvcHMpOwotI2VuZGlmCi0KLQlyZXR1cm4gcmVnaXN0ZXJfdHJhY2VyKCZrc3ltX3RyYWNlcik7Ci19Ci1kZXZpY2VfaW5pdGNhbGwoaW5pdF9rc3ltX3RyYWNlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYwppbmRleCA1N2MxYjQ1Li4wMjI3MmJhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCkBAIC0xNiw5ICsxNiw2IEBACiAKIERFQ0xBUkVfUldTRU0odHJhY2VfZXZlbnRfbXV0ZXgpOwogCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdHJhY2Vfc2VxLCBmdHJhY2VfZXZlbnRfc2VxKTsKLUVYUE9SVF9QRVJfQ1BVX1NZTUJPTChmdHJhY2VfZXZlbnRfc2VxKTsKLQogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGV2ZW50X2hhc2hbRVZFTlRfSEFTSFNJWkVdIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBpbnQgbmV4dF9ldmVudF90eXBlID0gX19UUkFDRV9MQVNUX1RZUEUgKyAxOwpAQCAtMTA2OSw2NSArMTA2Niw2IEBACiAJLmZ1bmNzCQk9ICZ0cmFjZV93YWtlX2Z1bmNzLAogfTsKIAotLyogVFJBQ0VfU1BFQ0lBTCAqLwotc3RhdGljIGVudW0gcHJpbnRfbGluZV90IHRyYWNlX3NwZWNpYWxfcHJpbnQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAotCQkJCQkgICAgIGludCBmbGFncywgc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCkKLXsKLQlzdHJ1Y3Qgc3BlY2lhbF9lbnRyeSAqZmllbGQ7Ci0KLQl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgaXRlci0+ZW50KTsKLQotCWlmICghdHJhY2Vfc2VxX3ByaW50ZigmaXRlci0+c2VxLCAiIyAlbGQgJWxkICVsZFxuIiwKLQkJCSAgICAgIGZpZWxkLT5hcmcxLAotCQkJICAgICAgZmllbGQtPmFyZzIsCi0JCQkgICAgICBmaWVsZC0+YXJnMykpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQotCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBlbnVtIHByaW50X2xpbmVfdCB0cmFjZV9zcGVjaWFsX2hleChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsCi0JCQkJCSAgIGludCBmbGFncywgc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCkKLXsKLQlzdHJ1Y3Qgc3BlY2lhbF9lbnRyeSAqZmllbGQ7Ci0Jc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7Ci0KLQl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgaXRlci0+ZW50KTsKLQotCVNFUV9QVVRfSEVYX0ZJRUxEX1JFVChzLCBmaWVsZC0+YXJnMSk7Ci0JU0VRX1BVVF9IRVhfRklFTERfUkVUKHMsIGZpZWxkLT5hcmcyKTsKLQlTRVFfUFVUX0hFWF9GSUVMRF9SRVQocywgZmllbGQtPmFyZzMpOwotCi0JcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLX0KLQotc3RhdGljIGVudW0gcHJpbnRfbGluZV90IHRyYWNlX3NwZWNpYWxfYmluKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwKLQkJCQkJICAgaW50IGZsYWdzLCBzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KQotewotCXN0cnVjdCBzcGVjaWFsX2VudHJ5ICpmaWVsZDsKLQlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsKLQotCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBpdGVyLT5lbnQpOwotCi0JU0VRX1BVVF9GSUVMRF9SRVQocywgZmllbGQtPmFyZzEpOwotCVNFUV9QVVRfRklFTERfUkVUKHMsIGZpZWxkLT5hcmcyKTsKLQlTRVFfUFVUX0ZJRUxEX1JFVChzLCBmaWVsZC0+YXJnMyk7Ci0KLQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50X2Z1bmN0aW9ucyB0cmFjZV9zcGVjaWFsX2Z1bmNzID0gewotCS50cmFjZQkJPSB0cmFjZV9zcGVjaWFsX3ByaW50LAotCS5yYXcJCT0gdHJhY2Vfc3BlY2lhbF9wcmludCwKLQkuaGV4CQk9IHRyYWNlX3NwZWNpYWxfaGV4LAotCS5iaW5hcnkJCT0gdHJhY2Vfc3BlY2lhbF9iaW4sCi19OwotCi1zdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50IHRyYWNlX3NwZWNpYWxfZXZlbnQgPSB7Ci0JLnR5cGUJCT0gVFJBQ0VfU1BFQ0lBTCwKLQkuZnVuY3MJCT0gJnRyYWNlX3NwZWNpYWxfZnVuY3MsCi19OwotCiAvKiBUUkFDRV9TVEFDSyAqLwogCiBzdGF0aWMgZW51bSBwcmludF9saW5lX3QgdHJhY2Vfc3RhY2tfcHJpbnQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLApAQCAtMTE2MSw5ICsxMDk5LDYgQEAKIAogc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudF9mdW5jdGlvbnMgdHJhY2Vfc3RhY2tfZnVuY3MgPSB7CiAJLnRyYWNlCQk9IHRyYWNlX3N0YWNrX3ByaW50LAotCS5yYXcJCT0gdHJhY2Vfc3BlY2lhbF9wcmludCwKLQkuaGV4CQk9IHRyYWNlX3NwZWNpYWxfaGV4LAotCS5iaW5hcnkJCT0gdHJhY2Vfc3BlY2lhbF9iaW4sCiB9OwogCiBzdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50IHRyYWNlX3N0YWNrX2V2ZW50ID0gewpAQCAtMTE5NCw5ICsxMTI5LDYgQEAKIAogc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudF9mdW5jdGlvbnMgdHJhY2VfdXNlcl9zdGFja19mdW5jcyA9IHsKIAkudHJhY2UJCT0gdHJhY2VfdXNlcl9zdGFja19wcmludCwKLQkucmF3CQk9IHRyYWNlX3NwZWNpYWxfcHJpbnQsCi0JLmhleAkJPSB0cmFjZV9zcGVjaWFsX2hleCwKLQkuYmluYXJ5CQk9IHRyYWNlX3NwZWNpYWxfYmluLAogfTsKIAogc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudCB0cmFjZV91c2VyX3N0YWNrX2V2ZW50ID0gewpAQCAtMTMxNCw3ICsxMjQ2LDYgQEAKIAkmdHJhY2VfZm5fZXZlbnQsCiAJJnRyYWNlX2N0eF9ldmVudCwKIAkmdHJhY2Vfd2FrZV9ldmVudCwKLQkmdHJhY2Vfc3BlY2lhbF9ldmVudCwKIAkmdHJhY2Vfc3RhY2tfZXZlbnQsCiAJJnRyYWNlX3VzZXJfc3RhY2tfZXZlbnQsCiAJJnRyYWNlX2JwcmludF9ldmVudCwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYwppbmRleCAwZTczYmMyLi40MDg2ZWFlNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYwpAQCAtNDYsNyArNDYsNiBAQAogCXN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlsb25nIGRpc2FibGVkOwotCWludCByZXNjaGVkOwogCWludCBjcHU7CiAJaW50IHBjOwogCkBAIC01NCw3ICs1Myw3IEBACiAJCXJldHVybjsKIAogCXBjID0gcHJlZW1wdF9jb3VudCgpOwotCXJlc2NoZWQgPSBmdHJhY2VfcHJlZW1wdF9kaXNhYmxlKCk7CisJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsKIAogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJaWYgKGNwdSAhPSB3YWtldXBfY3VycmVudF9jcHUpCkBAIC03NCw3ICs3Myw3IEBACiAgb3V0OgogCWF0b21pY19kZWMoJmRhdGEtPmRpc2FibGVkKTsKICBvdXRfZW5hYmxlOgotCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShyZXNjaGVkKTsKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyB0cmFjZV9vcHMgX19yZWFkX21vc3RseSA9CkBAIC0zODMsNiArMzgyLDcgQEAKICNpZmRlZiBDT05GSUdfRlRSQUNFX1NFTEZURVNUCiAJLnNlbGZ0ZXN0ICAgID0gdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF93YWtldXAsCiAjZW5kaWYKKwkudXNlX21heF90cgk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHRyYWNlciB3YWtldXBfcnRfdHJhY2VyIF9fcmVhZF9tb3N0bHkgPQpAQCAtMzk3LDYgKzM5Nyw3IEBACiAjaWZkZWYgQ09ORklHX0ZUUkFDRV9TRUxGVEVTVAogCS5zZWxmdGVzdCAgICA9IHRyYWNlX3NlbGZ0ZXN0X3N0YXJ0dXBfd2FrZXVwLAogI2VuZGlmCisJLnVzZV9tYXhfdHIJPSAxLAogfTsKIAogX19pbml0IHN0YXRpYyBpbnQgaW5pdF93YWtldXBfdHJhY2VyKHZvaWQpCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2VsZnRlc3QuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zZWxmdGVzdC5jCmluZGV4IDI1MGU3ZjkuLjE1NWE0MTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zZWxmdGVzdC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zZWxmdGVzdC5jCkBAIC0xMywxMSArMTMsOSBAQAogCWNhc2UgVFJBQ0VfV0FLRToKIAljYXNlIFRSQUNFX1NUQUNLOgogCWNhc2UgVFJBQ0VfUFJJTlQ6Ci0JY2FzZSBUUkFDRV9TUEVDSUFMOgogCWNhc2UgVFJBQ0VfQlJBTkNIOgogCWNhc2UgVFJBQ0VfR1JBUEhfRU5UOgogCWNhc2UgVFJBQ0VfR1JBUEhfUkVUOgotCWNhc2UgVFJBQ0VfS1NZTToKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNjkxLDM4ICs2ODksNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgKi8KIAotI2lmZGVmIENPTkZJR19TWVNQUk9GX1RSQUNFUgotaW50Ci10cmFjZV9zZWxmdGVzdF9zdGFydHVwX3N5c3Byb2Yoc3RydWN0IHRyYWNlciAqdHJhY2UsIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKLQlpbnQgcmV0OwotCi0JLyogc3RhcnQgdGhlIHRyYWNpbmcgKi8KLQlyZXQgPSB0cmFjZXJfaW5pdCh0cmFjZSwgdHIpOwotCWlmIChyZXQpIHsKLQkJd2Fybl9mYWlsZWRfaW5pdF90cmFjZXIodHJhY2UsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2xlZXAgZm9yIGEgMS8xMCBvZiBhIHNlY29uZCAqLwotCW1zbGVlcCgxMDApOwotCS8qIHN0b3AgdGhlIHRyYWNpbmcuICovCi0JdHJhY2luZ19zdG9wKCk7Ci0JLyogY2hlY2sgdGhlIHRyYWNlIGJ1ZmZlciAqLwotCXJldCA9IHRyYWNlX3Rlc3RfYnVmZmVyKHRyLCAmY291bnQpOwotCXRyYWNlLT5yZXNldCh0cik7Ci0JdHJhY2luZ19zdGFydCgpOwotCi0JaWYgKCFyZXQgJiYgIWNvdW50KSB7Ci0JCXByaW50ayhLRVJOX0NPTlQgIi4uIG5vIGVudHJpZXMgZm91bmQgLi4iKTsKLQkJcmV0ID0gLTE7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU1lTUFJPRl9UUkFDRVIgKi8KLQogI2lmZGVmIENPTkZJR19CUkFOQ0hfVFJBQ0VSCiBpbnQKIHRyYWNlX3NlbGZ0ZXN0X3N0YXJ0dXBfYnJhbmNoKHN0cnVjdCB0cmFjZXIgKnRyYWNlLCBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQpAQCAtNzU1LDU2ICs3MjEsMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19CUkFOQ0hfVFJBQ0VSICovCiAKLSNpZmRlZiBDT05GSUdfS1NZTV9UUkFDRVIKLXN0YXRpYyBpbnQga3N5bV9zZWxmdGVzdF9kdW1teTsKLQotaW50Ci10cmFjZV9zZWxmdGVzdF9zdGFydHVwX2tzeW0oc3RydWN0IHRyYWNlciAqdHJhY2UsIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKLQlpbnQgcmV0OwotCi0JLyogc3RhcnQgdGhlIHRyYWNpbmcgKi8KLQlyZXQgPSB0cmFjZXJfaW5pdCh0cmFjZSwgdHIpOwotCWlmIChyZXQpIHsKLQkJd2Fybl9mYWlsZWRfaW5pdF90cmFjZXIodHJhY2UsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Ja3N5bV9zZWxmdGVzdF9kdW1teSA9IDA7Ci0JLyogUmVnaXN0ZXIgdGhlIHJlYWQtd3JpdGUgdHJhY2luZyByZXF1ZXN0ICovCi0KLQlyZXQgPSBwcm9jZXNzX25ld19rc3ltX2VudHJ5KCJrc3ltX3NlbGZ0ZXN0X2R1bW15IiwKLQkJCQkgICAgIEhXX0JSRUFLUE9JTlRfUiB8IEhXX0JSRUFLUE9JTlRfVywKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKCZrc3ltX3NlbGZ0ZXN0X2R1bW15KSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9DT05UICJrc3ltX3RyYWNlIHJlYWQtd3JpdGUgc3RhcnR1cCB0ZXN0IGZhaWxlZFxuIik7Ci0JCWdvdG8gcmV0X3BhdGg7Ci0JfQotCS8qIFBlcmZvcm0gYSByZWFkIGFuZCBhIHdyaXRlIG9wZXJhdGlvbiBvdmVyIHRoZSBkdW1teSB2YXJpYWJsZSB0bwotCSAqIHRyaWdnZXIgdGhlIHRyYWNlcgotCSAqLwotCWlmIChrc3ltX3NlbGZ0ZXN0X2R1bW15ID09IDApCi0JCWtzeW1fc2VsZnRlc3RfZHVtbXkrKzsKLQotCS8qIHN0b3AgdGhlIHRyYWNpbmcuICovCi0JdHJhY2luZ19zdG9wKCk7Ci0JLyogY2hlY2sgdGhlIHRyYWNlIGJ1ZmZlciAqLwotCXJldCA9IHRyYWNlX3Rlc3RfYnVmZmVyKHRyLCAmY291bnQpOwotCXRyYWNlLT5yZXNldCh0cik7Ci0JdHJhY2luZ19zdGFydCgpOwotCi0JLyogcmVhZCAmIHdyaXRlIG9wZXJhdGlvbnMgLSBvbmUgZWFjaCBpcyBwZXJmb3JtZWQgb24gdGhlIGR1bW15IHZhcmlhYmxlCi0JICogdHJpZ2dlcmluZyB0d28gZW50cmllcyBpbiB0aGUgdHJhY2UgYnVmZmVyCi0JICovCi0JaWYgKCFyZXQgJiYgY291bnQgIT0gMikgewotCQlwcmludGsoS0VSTl9DT05UICJLc3ltIHRyYWNlciBzdGFydHVwIHRlc3QgZmFpbGVkIik7Ci0JCXJldCA9IC0xOwotCX0KLQotcmV0X3BhdGg6Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfS1NZTV9UUkFDRVIgKi8KLQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwppbmRleCBmNGJjOWIyLi4wNTY0NjhlIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwpAQCAtMTEwLDEyICsxMTAsMTIgQEAKIHN0YXRpYyB2b2lkCiBzdGFja190cmFjZV9jYWxsKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgcGFyZW50X2lwKQogewotCWludCBjcHUsIHJlc2NoZWQ7CisJaW50IGNwdTsKIAogCWlmICh1bmxpa2VseSghZnRyYWNlX2VuYWJsZWQgfHwgc3RhY2tfdHJhY2VfZGlzYWJsZWQpKQogCQlyZXR1cm47CiAKLQlyZXNjaGVkID0gZnRyYWNlX3ByZWVtcHRfZGlzYWJsZSgpOworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CiAKIAljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCS8qIG5vIGF0b21pYyBuZWVkZWQsIHdlIG9ubHkgbW9kaWZ5IHRoaXMgdmFyaWFibGUgYnkgdGhpcyBjcHUgKi8KQEAgLTEyNyw3ICsxMjcsNyBAQAogIG91dDoKIAlwZXJfY3B1KHRyYWNlX2FjdGl2ZSwgY3B1KS0tOwogCS8qIHByZXZlbnQgcmVjdXJzaW9uIGluIHNjaGVkdWxlICovCi0JZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRyYWNlX29wcyBfX3JlYWRfbW9zdGx5ID0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zeXNjYWxscy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3N5c2NhbGxzLmMKaW5kZXggMzRlMzU4MC4uYmFjNzUyZiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c2NhbGxzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3N5c2NhbGxzLmMKQEAgLTIzLDYgKzIzLDkgQEAKIHN0YXRpYyBpbnQgc3lzY2FsbF9lbnRlcl9kZWZpbmVfZmllbGRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCk7CiBzdGF0aWMgaW50IHN5c2NhbGxfZXhpdF9kZWZpbmVfZmllbGRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCk7CiAKKy8qIEFsbCBzeXNjYWxsIGV4aXQgZXZlbnRzIGhhdmUgdGhlIHNhbWUgZmllbGRzICovCitzdGF0aWMgTElTVF9IRUFEKHN5c2NhbGxfZXhpdF9maWVsZHMpOworCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqCiBzeXNjYWxsX2dldF9lbnRlcl9maWVsZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQogewpAQCAtMzQsOSArMzcsNyBAQAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKgogc3lzY2FsbF9nZXRfZXhpdF9maWVsZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQogewotCXN0cnVjdCBzeXNjYWxsX21ldGFkYXRhICplbnRyeSA9IGNhbGwtPmRhdGE7Ci0KLQlyZXR1cm4gJmVudHJ5LT5leGl0X2ZpZWxkczsKKwlyZXR1cm4gJnN5c2NhbGxfZXhpdF9maWVsZHM7CiB9CiAKIHN0cnVjdCB0cmFjZV9ldmVudF9mdW5jdGlvbnMgZW50ZXJfc3lzY2FsbF9wcmludF9mdW5jcyA9IHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zeXNwcm9mLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzk3NGE1Li4wMDAwMDAwCi0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zeXNwcm9mLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoKLSAqIHRyYWNlIHN0YWNrIHRyYWNlcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4LCBTb2VyZW4gU2FuZG1hbm4KLSAqIENvcHlyaWdodCAoQykgMjAwNyBTdGV2ZW4gUm9zdGVkdCA8c3Jvc3RlZHRAcmVkaGF0LmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+Ci0KLSNpbmNsdWRlICJ0cmFjZS5oIgotCi1zdGF0aWMgc3RydWN0IHRyYWNlX2FycmF5CSpzeXNwcm9mX3RyYWNlOwotc3RhdGljIGludCBfX3JlYWRfbW9zdGx5CXRyYWNlcl9lbmFibGVkOwotCi0vKgotICogMSBtc2VjIHNhbXBsZSBpbnRlcnZhbCBieSBkZWZhdWx0OgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzYW1wbGVfcGVyaW9kID0gMTAwMDAwMDsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2FtcGxlX21heF9kZXB0aCA9IDUxMjsKLQotc3RhdGljIERFRklORV9NVVRFWChzYW1wbGVfdGltZXJfbG9jayk7Ci0vKgotICogUGVyIENQVSBocnRpbWVycyB0aGF0IGRvIHRoZSBwcm9maWxpbmc6Ci0gKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaHJ0aW1lciwgc3RhY2tfdHJhY2VfaHJ0aW1lcik7Ci0KLXN0cnVjdCBzdGFja19mcmFtZSB7Ci0JY29uc3Qgdm9pZCBfX3VzZXIJKm5leHRfZnA7Ci0JdW5zaWduZWQgbG9uZwkJcmV0dXJuX2FkZHJlc3M7Ci19OwotCi1zdGF0aWMgaW50IGNvcHlfc3RhY2tfZnJhbWUoY29uc3Qgdm9pZCBfX3VzZXIgKmZwLCBzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmZyYW1lKQotewotCWludCByZXQ7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnAsIHNpemVvZigqZnJhbWUpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSAxOwotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoZnJhbWUsIGZwLCBzaXplb2YoKmZyYW1lKSkpCi0JCXJldCA9IDA7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IGJhY2t0cmFjZV9pbmZvIHsKLQlzdHJ1Y3QgdHJhY2VfYXJyYXlfY3B1CSpkYXRhOwotCXN0cnVjdCB0cmFjZV9hcnJheQkqdHI7Ci0JaW50CQkJcG9zOwotfTsKLQotc3RhdGljIHZvaWQKLWJhY2t0cmFjZV93YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKQotewotCS8qIElnbm9yZSB3YXJuaW5ncyAqLwotfQotCi1zdGF0aWMgdm9pZCBiYWNrdHJhY2Vfd2FybmluZyh2b2lkICpkYXRhLCBjaGFyICptc2cpCi17Ci0JLyogSWdub3JlIHdhcm5pbmdzICovCi19Ci0KLXN0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCi17Ci0JLyogRG9uJ3QgYm90aGVyIHdpdGggSVJRIHN0YWNrcyBmb3Igbm93ICovCi0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQlzdHJ1Y3QgYmFja3RyYWNlX2luZm8gKmluZm8gPSBkYXRhOwotCi0JaWYgKGluZm8tPnBvcyA8IHNhbXBsZV9tYXhfZGVwdGggJiYgcmVsaWFibGUpIHsKLQkJX190cmFjZV9zcGVjaWFsKGluZm8tPnRyLCBpbmZvLT5kYXRhLCAxLCBhZGRyLCAwKTsKLQotCQlpbmZvLT5wb3MrKzsKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgYmFja3RyYWNlX29wcyA9IHsKLQkud2FybmluZwkJPSBiYWNrdHJhY2Vfd2FybmluZywKLQkud2FybmluZ19zeW1ib2wJCT0gYmFja3RyYWNlX3dhcm5pbmdfc3ltYm9sLAotCS5zdGFjawkJCT0gYmFja3RyYWNlX3N0YWNrLAotCS5hZGRyZXNzCQk9IGJhY2t0cmFjZV9hZGRyZXNzLAotCS53YWxrX3N0YWNrCQk9IHByaW50X2NvbnRleHRfc3RhY2ssCi19OwotCi1zdGF0aWMgaW50Ci10cmFjZV9rZXJuZWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCi0JICAgICBzdHJ1Y3QgdHJhY2VfYXJyYXlfY3B1ICpkYXRhKQotewotCXN0cnVjdCBiYWNrdHJhY2VfaW5mbyBpbmZvOwotCXVuc2lnbmVkIGxvbmcgYnA7Ci0JY2hhciAqc3RhY2s7Ci0KLQlpbmZvLnRyID0gdHI7Ci0JaW5mby5kYXRhID0gZGF0YTsKLQlpbmZvLnBvcyA9IDE7Ci0KLQlfX3RyYWNlX3NwZWNpYWwoaW5mby50ciwgaW5mby5kYXRhLCAxLCByZWdzLT5pcCwgMCk7Ci0KLQlzdGFjayA9ICgoY2hhciAqKXJlZ3MgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCWJwID0gcmVncy0+YnA7Ci0jZWxzZQotCWJwID0gMDsKLSNlbmRpZgotCi0JZHVtcF90cmFjZShOVUxMLCByZWdzLCAodm9pZCAqKXN0YWNrLCBicCwgJmJhY2t0cmFjZV9vcHMsICZpbmZvKTsKLQotCXJldHVybiBpbmZvLnBvczsKLX0KLQotc3RhdGljIHZvaWQgdGltZXJfbm90aWZ5KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQotewotCXN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGE7Ci0Jc3RydWN0IHN0YWNrX2ZyYW1lIGZyYW1lOwotCXN0cnVjdCB0cmFjZV9hcnJheSAqdHI7Ci0JY29uc3Qgdm9pZCBfX3VzZXIgKmZwOwotCWludCBpc191c2VyOwotCWludCBpOwotCi0JaWYgKCFyZWdzKQotCQlyZXR1cm47Ci0KLQl0ciA9IHN5c3Byb2ZfdHJhY2U7Ci0JZGF0YSA9IHRyLT5kYXRhW2NwdV07Ci0JaXNfdXNlciA9IHVzZXJfbW9kZShyZWdzKTsKLQotCWlmICghY3VycmVudCB8fCBjdXJyZW50LT5waWQgPT0gMCkKLQkJcmV0dXJuOwotCi0JaWYgKGlzX3VzZXIgJiYgY3VycmVudC0+c3RhdGUgIT0gVEFTS19SVU5OSU5HKQotCQlyZXR1cm47Ci0KLQlfX3RyYWNlX3NwZWNpYWwodHIsIGRhdGEsIDAsIDAsIGN1cnJlbnQtPnBpZCk7Ci0KLQlpZiAoIWlzX3VzZXIpCi0JCWkgPSB0cmFjZV9rZXJuZWwocmVncywgdHIsIGRhdGEpOwotCWVsc2UKLQkJaSA9IDA7Ci0KLQkvKgotCSAqIFRyYWNlIHVzZXIgc3RhY2sgaWYgd2UgYXJlIG5vdCBhIGtlcm5lbCB0aHJlYWQKLQkgKi8KLQlpZiAoY3VycmVudC0+bW0gJiYgaSA8IHNhbXBsZV9tYXhfZGVwdGgpIHsKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKWN1cnJlbnQtPnRocmVhZC5zcDAgLSAxOwotCi0JCWZwID0gKHZvaWQgX191c2VyICopcmVncy0+YnA7Ci0KLQkJX190cmFjZV9zcGVjaWFsKHRyLCBkYXRhLCAyLCByZWdzLT5pcCwgMCk7Ci0KLQkJd2hpbGUgKGkgPCBzYW1wbGVfbWF4X2RlcHRoKSB7Ci0JCQlmcmFtZS5uZXh0X2ZwID0gTlVMTDsKLQkJCWZyYW1lLnJldHVybl9hZGRyZXNzID0gMDsKLQkJCWlmICghY29weV9zdGFja19mcmFtZShmcCwgJmZyYW1lKSkKLQkJCQlicmVhazsKLQkJCWlmICgodW5zaWduZWQgbG9uZylmcCA8IHJlZ3MtPnNwKQotCQkJCWJyZWFrOwotCi0JCQlfX3RyYWNlX3NwZWNpYWwodHIsIGRhdGEsIDIsIGZyYW1lLnJldHVybl9hZGRyZXNzLAotCQkJCQkodW5zaWduZWQgbG9uZylmcCk7Ci0JCQlmcCA9IGZyYW1lLm5leHRfZnA7Ci0KLQkJCWkrKzsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBTcGVjaWFsIHRyYWNlIGVudHJ5IGlmIHdlIG92ZXJmbG93IHRoZSBtYXggZGVwdGg6Ci0JICovCi0JaWYgKGkgPT0gc2FtcGxlX21heF9kZXB0aCkKLQkJX190cmFjZV9zcGVjaWFsKHRyLCBkYXRhLCAtMSwgLTEsIC0xKTsKLQotCV9fdHJhY2Vfc3BlY2lhbCh0ciwgZGF0YSwgMywgY3VycmVudC0+cGlkLCBpKTsKLX0KLQotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHN0YWNrX3RyYWNlX3RpbWVyX2ZuKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKQotewotCS8qIHRyYWNlIGhlcmUgKi8KLQl0aW1lcl9ub3RpZnkoZ2V0X2lycV9yZWdzKCksIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KLQlocnRpbWVyX2ZvcndhcmRfbm93KGhydGltZXIsIG5zX3RvX2t0aW1lKHNhbXBsZV9wZXJpb2QpKTsKLQotCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X3N0YWNrX3RpbWVyKHZvaWQgKnVudXNlZCkKLXsKLQlzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lciA9ICZfX2dldF9jcHVfdmFyKHN0YWNrX3RyYWNlX2hydGltZXIpOwotCi0JaHJ0aW1lcl9pbml0KGhydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JaHJ0aW1lci0+ZnVuY3Rpb24gPSBzdGFja190cmFjZV90aW1lcl9mbjsKLQotCWhydGltZXJfc3RhcnQoaHJ0aW1lciwgbnNfdG9fa3RpbWUoc2FtcGxlX3BlcmlvZCksCi0JCSAgICAgIEhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfc3RhY2tfdGltZXJzKHZvaWQpCi17Ci0Jb25fZWFjaF9jcHUoc3RhcnRfc3RhY2tfdGltZXIsIE5VTEwsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBzdG9wX3N0YWNrX3RpbWVyKGludCBjcHUpCi17Ci0Jc3RydWN0IGhydGltZXIgKmhydGltZXIgPSAmcGVyX2NwdShzdGFja190cmFjZV9ocnRpbWVyLCBjcHUpOwotCi0JaHJ0aW1lcl9jYW5jZWwoaHJ0aW1lcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0b3Bfc3RhY2tfdGltZXJzKHZvaWQpCi17Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlzdG9wX3N0YWNrX3RpbWVyKGNwdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0b3Bfc3RhY2tfdHJhY2Uoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKLXsKLQltdXRleF9sb2NrKCZzYW1wbGVfdGltZXJfbG9jayk7Ci0Jc3RvcF9zdGFja190aW1lcnMoKTsKLQl0cmFjZXJfZW5hYmxlZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZzYW1wbGVfdGltZXJfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgc3RhY2tfdHJhY2VfaW5pdChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQotewotCXN5c3Byb2ZfdHJhY2UgPSB0cjsKLQotCXRyYWNpbmdfc3RhcnRfY21kbGluZV9yZWNvcmQoKTsKLQotCW11dGV4X2xvY2soJnNhbXBsZV90aW1lcl9sb2NrKTsKLQlzdGFydF9zdGFja190aW1lcnMoKTsKLQl0cmFjZXJfZW5hYmxlZCA9IDE7Ci0JbXV0ZXhfdW5sb2NrKCZzYW1wbGVfdGltZXJfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YWNrX3RyYWNlX3Jlc2V0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0JdHJhY2luZ19zdG9wX2NtZGxpbmVfcmVjb3JkKCk7Ci0Jc3RvcF9zdGFja190cmFjZSh0cik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHJhY2VyIHN0YWNrX3RyYWNlIF9fcmVhZF9tb3N0bHkgPQotewotCS5uYW1lCQk9ICJzeXNwcm9mIiwKLQkuaW5pdAkJPSBzdGFja190cmFjZV9pbml0LAotCS5yZXNldAkJPSBzdGFja190cmFjZV9yZXNldCwKLSNpZmRlZiBDT05GSUdfRlRSQUNFX1NFTEZURVNUCi0JLnNlbGZ0ZXN0ICAgID0gdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9zeXNwcm9mLAotI2VuZGlmCi19OwotCi1fX2luaXQgc3RhdGljIGludCBpbml0X3N0YWNrX3RyYWNlKHZvaWQpCi17Ci0JcmV0dXJuIHJlZ2lzdGVyX3RyYWNlcigmc3RhY2tfdHJhY2UpOwotfQotZGV2aWNlX2luaXRjYWxsKGluaXRfc3RhY2tfdHJhY2UpOwotCi0jZGVmaW5lIE1BWF9MT05HX0RJR0lUUyAyMgotCi1zdGF0aWMgc3NpemVfdAotc3lzcHJvZl9zYW1wbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCi0JCSAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciBidWZbTUFYX0xPTkdfRElHSVRTXTsKLQlpbnQgcjsKLQotCXIgPSBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgbnNlY3NfdG9fdXNlY3Moc2FtcGxlX3BlcmlvZCkpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgYnVmLCByKTsKLX0KLQotc3RhdGljIHNzaXplX3QKLXN5c3Byb2Zfc2FtcGxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciBidWZbTUFYX0xPTkdfRElHSVRTXTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCWlmIChjbnQgPiBNQVhfTE9OR19ESUdJVFMtMSkKLQkJY250ID0gTUFYX0xPTkdfRElHSVRTLTE7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY250XSA9IDA7Ci0KLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQkvKgotCSAqIEVuZm9yY2UgYSBtaW5pbXVtIHNhbXBsZSBwZXJpb2Qgb2YgMTAwIHVzZWNzOgotCSAqLwotCWlmICh2YWwgPCAxMDApCi0JCXZhbCA9IDEwMDsKLQotCW11dGV4X2xvY2soJnNhbXBsZV90aW1lcl9sb2NrKTsKLQlzdG9wX3N0YWNrX3RpbWVycygpOwotCXNhbXBsZV9wZXJpb2QgPSB2YWwgKiAxMDAwOwotCXN0YXJ0X3N0YWNrX3RpbWVycygpOwotCW11dGV4X3VubG9jaygmc2FtcGxlX3RpbWVyX2xvY2spOwotCi0JcmV0dXJuIGNudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzcHJvZl9zYW1wbGVfZm9wcyA9IHsKLQkucmVhZAkJPSBzeXNwcm9mX3NhbXBsZV9yZWFkLAotCS53cml0ZQkJPSBzeXNwcm9mX3NhbXBsZV93cml0ZSwKLX07Ci0KLXZvaWQgaW5pdF90cmFjZXJfc3lzcHJvZl9kZWJ1Z2ZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQotewotCi0JdHJhY2VfY3JlYXRlX2ZpbGUoInN5c3Byb2Zfc2FtcGxlX3BlcmlvZCIsIDA2NDQsCi0JCQlkX3RyYWNlciwgTlVMTCwgJnN5c3Byb2Zfc2FtcGxlX2ZvcHMpOwotfQpkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMgYi9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYwppbmRleCBiMmQ3MGQzLi4yNTkxNTgzIDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYworKysgYi9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KIAogLyoKQEAgLTgyLDMgKzgzLDQ2IEBACiAJc2NoZWR1bGVfd29yaygmbnMtPmRlc3Ryb3llcik7CiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfdXNlcl9ucyk7CisKK3VpZF90IHVzZXJfbnNfbWFwX3VpZChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnRvLCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwgdWlkX3QgdWlkKQoreworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdG1wOworCisJaWYgKGxpa2VseSh0byA9PSBjcmVkLT51c2VyLT51c2VyX25zKSkKKwkJcmV0dXJuIHVpZDsKKworCisJLyogSXMgY3JlZC0+dXNlciB0aGUgY3JlYXRvciBvZiB0aGUgdGFyZ2V0IHVzZXJfbnMKKwkgKiBvciB0aGUgY3JlYXRvciBvZiBvbmUgb2YgaXQncyBwYXJlbnRzPworCSAqLworCWZvciAoIHRtcCA9IHRvOyB0bXAgIT0gJmluaXRfdXNlcl9uczsKKwkgICAgICB0bXAgPSB0bXAtPmNyZWF0b3ItPnVzZXJfbnMgKSB7CisJCWlmIChjcmVkLT51c2VyID09IHRtcC0+Y3JlYXRvcikgeworCQkJcmV0dXJuICh1aWRfdCkwOworCQl9CisJfQorCisJLyogTm8gdXNlZnVsIHJlbGF0aW9uc2hpcCBzbyBubyBtYXBwaW5nICovCisJcmV0dXJuIG92ZXJmbG93dWlkOworfQorCitnaWRfdCB1c2VyX25zX21hcF9naWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICp0bywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsIGdpZF90IGdpZCkKK3sKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnRtcDsKKworCWlmIChsaWtlbHkodG8gPT0gY3JlZC0+dXNlci0+dXNlcl9ucykpCisJCXJldHVybiBnaWQ7CisKKwkvKiBJcyBjcmVkLT51c2VyIHRoZSBjcmVhdG9yIG9mIHRoZSB0YXJnZXQgdXNlcl9ucworCSAqIG9yIHRoZSBjcmVhdG9yIG9mIG9uZSBvZiBpdCdzIHBhcmVudHM/CisJICovCisJZm9yICggdG1wID0gdG87IHRtcCAhPSAmaW5pdF91c2VyX25zOworCSAgICAgIHRtcCA9IHRtcC0+Y3JlYXRvci0+dXNlcl9ucyApIHsKKwkJaWYgKGNyZWQtPnVzZXIgPT0gdG1wLT5jcmVhdG9yKSB7CisJCQlyZXR1cm4gKGdpZF90KTA7CisJCX0KKwl9CisKKwkvKiBObyB1c2VmdWwgcmVsYXRpb25zaGlwIHNvIG5vIG1hcHBpbmcgKi8KKwlyZXR1cm4gb3ZlcmZsb3dnaWQ7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvd2F0Y2hkb2cuYyBiL2tlcm5lbC93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2JjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvd2F0Y2hkb2cuYwpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIERldGVjdCBoYXJkIGFuZCBzb2Z0IGxvY2t1cHMgb24gYSBzeXN0ZW0KKyAqCisgKiBzdGFydGVkIGJ5IERvbiBaaWNrdXMsIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICogdGhpcyBjb2RlIGRldGVjdHMgaGFyZCBsb2NrdXBzOiBpbmNpZGVudHMgaW4gd2hlcmUgb24gYSBDUFUKKyAqIHRoZSBrZXJuZWwgZG9lcyBub3QgcmVzcG9uZCB0byBhbnl0aGluZyBleGNlcHQgTk1JLgorICoKKyAqIE5vdGU6IE1vc3Qgb2YgdGhpcyBjb2RlIGlzIGJvcnJvd2VkIGhlYXZpbHkgZnJvbSBzb2Z0bG9ja3VwLmMsCisgKiBzbyB0aGFua3MgdG8gSW5nbyBmb3IgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCisgKiBTb21lIGNodW5rcyBhbHNvIHRha2VuIGZyb20gYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMsIHRoYW5rcworICogdG8gdGhvc2UgY29udHJpYnV0b3JzIGFzIHdlbGwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKworaW50IHdhdGNoZG9nX2VuYWJsZWQ7CitpbnQgX19yZWFkX21vc3RseSBzb2Z0bG9ja3VwX3RocmVzaCA9IDYwOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgd2F0Y2hkb2dfdG91Y2hfdHMpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBzb2Z0bG9ja3VwX3dhdGNoZG9nKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaHJ0aW1lciwgd2F0Y2hkb2dfaHJ0aW1lcik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwgc29mdGxvY2t1cF90b3VjaF9zeW5jKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCBzb2Z0X3dhdGNoZG9nX3dhcm4pOworI2lmZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwgaGFyZF93YXRjaGRvZ193YXJuKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCB3YXRjaGRvZ19ubWlfdG91Y2gpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGhydGltZXJfaW50ZXJydXB0cyk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgaHJ0aW1lcl9pbnRlcnJ1cHRzX3NhdmVkKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9ldmVudCAqLCB3YXRjaGRvZ19ldik7CisjZW5kaWYKKworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGRpZF9wYW5pYzsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBub193YXRjaGRvZzsKKworCisvKiBib290IGNvbW1hbmRzICovCisvKgorICogU2hvdWxkIHdlIHBhbmljIHdoZW4gYSBzb2Z0LWxvY2t1cCBvciBoYXJkLWxvY2t1cCBvY2N1cnM6CisgKi8KKyNpZmRlZiBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUgorc3RhdGljIGludCBoYXJkbG9ja3VwX3BhbmljOworCitzdGF0aWMgaW50IF9faW5pdCBoYXJkbG9ja3VwX3BhbmljX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cm5jbXAoc3RyLCAicGFuaWMiLCA1KSkKKwkJaGFyZGxvY2t1cF9wYW5pYyA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJubWlfd2F0Y2hkb2c9IiwgaGFyZGxvY2t1cF9wYW5pY19zZXR1cCk7CisjZW5kaWYKKwordW5zaWduZWQgaW50IF9fcmVhZF9tb3N0bHkgc29mdGxvY2t1cF9wYW5pYyA9CisJCQlDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU7CisKK3N0YXRpYyBpbnQgX19pbml0IHNvZnRsb2NrdXBfcGFuaWNfc2V0dXAoY2hhciAqc3RyKQoreworCXNvZnRsb2NrdXBfcGFuaWMgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOworCisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJzb2Z0bG9ja3VwX3BhbmljPSIsIHNvZnRsb2NrdXBfcGFuaWNfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBub3dhdGNoZG9nX3NldHVwKGNoYXIgKnN0cikKK3sKKwlub193YXRjaGRvZyA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub3dhdGNoZG9nIiwgbm93YXRjaGRvZ19zZXR1cCk7CisKKy8qIGRlcHJlY2F0ZWQgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5vc29mdGxvY2t1cF9zZXR1cChjaGFyICpzdHIpCit7CisJbm9fd2F0Y2hkb2cgPSAxOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9zb2Z0bG9ja3VwIiwgbm9zb2Z0bG9ja3VwX3NldHVwKTsKKy8qICAqLworCisKKy8qCisgKiBSZXR1cm5zIHNlY29uZHMsIGFwcHJveGltYXRlbHkuICBXZSBkb24ndCBuZWVkIG5hbm9zZWNvbmQKKyAqIHJlc29sdXRpb24sIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgd2l0aCBhIGJpZyBkaXZpZGUgd2hlbgorICogMl4zMG5zID09IDEuMDc0cy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3RpbWVzdGFtcChpbnQgdGhpc19jcHUpCit7CisJcmV0dXJuIGNwdV9jbG9jayh0aGlzX2NwdSkgPj4gMzBMTDsgIC8qIDJeMzAgfj0gMTBeOSAqLworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfc2FtcGxlX3BlcmlvZCh2b2lkKQoreworCS8qCisJICogY29udmVydCBzb2Z0bG9ja3VwX3RocmVzaCBmcm9tIHNlY29uZHMgdG8gbnMKKwkgKiB0aGUgZGl2aWRlIGJ5IDUgaXMgdG8gZ2l2ZSBocnRpbWVyIDUgY2hhbmNlcyB0bworCSAqIGluY3JlbWVudCBiZWZvcmUgdGhlIGhhcmRsb2NrdXAgZGV0ZWN0b3IgZ2VuZXJhdGVzCisJICogYSB3YXJuaW5nCisJICovCisJcmV0dXJuIHNvZnRsb2NrdXBfdGhyZXNoIC8gNSAqIE5TRUNfUEVSX1NFQzsKK30KKworLyogQ29tbWFuZHMgZm9yIHJlc2V0dGluZyB0aGUgd2F0Y2hkb2cgKi8KK3N0YXRpYyB2b2lkIF9fdG91Y2hfd2F0Y2hkb2codm9pZCkKK3sKKwlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlfX2dldF9jcHVfdmFyKHdhdGNoZG9nX3RvdWNoX3RzKSA9IGdldF90aW1lc3RhbXAodGhpc19jcHUpOworfQorCit2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKK3sKKwlfX2dldF9jcHVfdmFyKHdhdGNoZG9nX3RvdWNoX3RzKSA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2cpOworCit2b2lkIHRvdWNoX2FsbF9zb2Z0bG9ja3VwX3dhdGNoZG9ncyh2b2lkKQoreworCWludCBjcHU7CisKKwkvKgorCSAqIHRoaXMgaXMgZG9uZSBsb2NrbGVzcworCSAqIGRvIHdlIGNhcmUgaWYgYSAwIHJhY2VzIHdpdGggYSB0aW1lc3RhbXA/CisJICogYWxsIGl0IG1lYW5zIGlzIHRoZSBzb2Z0bG9jayBjaGVjayBzdGFydHMgb25lIGN5Y2xlIGxhdGVyCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCXBlcl9jcHUod2F0Y2hkb2dfdG91Y2hfdHMsIGNwdSkgPSAwOworfQorCisjaWZkZWYgQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IKK3ZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nKHZvaWQpCit7CisJX19nZXRfY3B1X3Zhcih3YXRjaGRvZ19ubWlfdG91Y2gpID0gdHJ1ZTsKKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Cit9CitFWFBPUlRfU1lNQk9MKHRvdWNoX25taV93YXRjaGRvZyk7CisKKyNlbmRpZgorCit2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2dfc3luYyh2b2lkKQoreworCV9fcmF3X2dldF9jcHVfdmFyKHNvZnRsb2NrdXBfdG91Y2hfc3luYykgPSB0cnVlOworCV9fcmF3X2dldF9jcHVfdmFyKHdhdGNoZG9nX3RvdWNoX3RzKSA9IDA7Cit9CisKKyNpZmRlZiBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUgorLyogd2F0Y2hkb2cgZGV0ZWN0b3IgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGlzX2hhcmRsb2NrdXAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGhyaW50ID0gX19nZXRfY3B1X3ZhcihocnRpbWVyX2ludGVycnVwdHMpOworCisJaWYgKF9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9pbnRlcnJ1cHRzX3NhdmVkKSA9PSBocmludCkKKwkJcmV0dXJuIDE7CisKKwlfX2dldF9jcHVfdmFyKGhydGltZXJfaW50ZXJydXB0c19zYXZlZCkgPSBocmludDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGlzX3NvZnRsb2NrdXAodW5zaWduZWQgbG9uZyB0b3VjaF90cykKK3sKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGdldF90aW1lc3RhbXAoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIFdhcm4gYWJvdXQgdW5yZWFzb25hYmxlIGRlbGF5czogKi8KKwlpZiAodGltZV9hZnRlcihub3csIHRvdWNoX3RzICsgc29mdGxvY2t1cF90aHJlc2gpKQorCQlyZXR1cm4gbm93IC0gdG91Y2hfdHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2F0Y2hkb2dfcGFuaWMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJZGlkX3BhbmljID0gMTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdhdGNoZG9nX3BhbmljLAorfTsKKworI2lmZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SCitzdGF0aWMgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciB3ZF9od19hdHRyID0geworCS50eXBlCQk9IFBFUkZfVFlQRV9IQVJEV0FSRSwKKwkuY29uZmlnCQk9IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUywKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciksCisJLnBpbm5lZAkJPSAxLAorCS5kaXNhYmxlZAk9IDEsCit9OworCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgcGVyZiBldmVudCBzdWJzeXN0ZW0gKi8KK3ZvaWQgd2F0Y2hkb2dfb3ZlcmZsb3dfY2FsbGJhY2soc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbm1pLAorCQkgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoX19nZXRfY3B1X3Zhcih3YXRjaGRvZ19ubWlfdG91Y2gpID09IHRydWUpIHsKKwkJX19nZXRfY3B1X3Zhcih3YXRjaGRvZ19ubWlfdG91Y2gpID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwkvKiBjaGVjayBmb3IgYSBoYXJkbG9ja3VwCisJICogVGhpcyBpcyBkb25lIGJ5IG1ha2luZyBzdXJlIG91ciB0aW1lciBpbnRlcnJ1cHQKKwkgKiBpcyBpbmNyZW1lbnRpbmcuICBUaGUgdGltZXIgaW50ZXJydXB0IHNob3VsZCBoYXZlCisJICogZmlyZWQgbXVsdGlwbGUgdGltZXMgYmVmb3JlIHdlIG92ZXJmbG93J2QuICBJZiBpdCBoYXNuJ3QKKwkgKiB0aGVuIHRoaXMgaXMgYSBnb29kIGluZGljYXRpb24gdGhlIGNwdSBpcyBzdHVjaworCSAqLworCWlmIChpc19oYXJkbG9ja3VwKCkpIHsKKwkJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJCS8qIG9ubHkgcHJpbnQgaGFyZGxvY2t1cHMgb25jZSAqLworCQlpZiAoX19nZXRfY3B1X3ZhcihoYXJkX3dhdGNoZG9nX3dhcm4pID09IHRydWUpCisJCQlyZXR1cm47CisKKwkJaWYgKGhhcmRsb2NrdXBfcGFuaWMpCisJCQlwYW5pYygiV2F0Y2hkb2cgZGV0ZWN0ZWQgaGFyZCBMT0NLVVAgb24gY3B1ICVkIiwgdGhpc19jcHUpOworCQllbHNlCisJCQlXQVJOKDEsICJXYXRjaGRvZyBkZXRlY3RlZCBoYXJkIExPQ0tVUCBvbiBjcHUgJWQiLCB0aGlzX2NwdSk7CisKKwkJX19nZXRfY3B1X3ZhcihoYXJkX3dhdGNoZG9nX3dhcm4pID0gdHJ1ZTsKKwkJcmV0dXJuOworCX0KKworCV9fZ2V0X2NwdV92YXIoaGFyZF93YXRjaGRvZ193YXJuKSA9IGZhbHNlOworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2ludGVycnVwdF9jb3VudCh2b2lkKQoreworCV9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9pbnRlcnJ1cHRzKSsrOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YXRjaGRvZ19pbnRlcnJ1cHRfY291bnQodm9pZCkgeyByZXR1cm47IH0KKyNlbmRpZiAvKiBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUiAqLworCisvKiB3YXRjaGRvZyBraWNrZXIgZnVuY3Rpb25zICovCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgd2F0Y2hkb2dfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmhydGltZXIpCit7CisJdW5zaWduZWQgbG9uZyB0b3VjaF90cyA9IF9fZ2V0X2NwdV92YXIod2F0Y2hkb2dfdG91Y2hfdHMpOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2lycV9yZWdzKCk7CisJaW50IGR1cmF0aW9uOworCisJLyoga2ljayB0aGUgaGFyZGxvY2t1cCBkZXRlY3RvciAqLworCXdhdGNoZG9nX2ludGVycnVwdF9jb3VudCgpOworCisJLyoga2ljayB0aGUgc29mdGxvY2t1cCBkZXRlY3RvciAqLworCXdha2VfdXBfcHJvY2VzcyhfX2dldF9jcHVfdmFyKHNvZnRsb2NrdXBfd2F0Y2hkb2cpKTsKKworCS8qIC4uIGFuZCByZXBlYXQgKi8KKwlocnRpbWVyX2ZvcndhcmRfbm93KGhydGltZXIsIG5zX3RvX2t0aW1lKGdldF9zYW1wbGVfcGVyaW9kKCkpKTsKKworCWlmICh0b3VjaF90cyA9PSAwKSB7CisJCWlmICh1bmxpa2VseShfX2dldF9jcHVfdmFyKHNvZnRsb2NrdXBfdG91Y2hfc3luYykpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHRpbWUgc3RhbXAgd2FzIHRvdWNoZWQgYXRvbWljYWxseQorCQkJICogbWFrZSBzdXJlIHRoZSBzY2hlZHVsZXIgdGljayBpcyB1cCB0byBkYXRlLgorCQkJICovCisJCQlfX2dldF9jcHVfdmFyKHNvZnRsb2NrdXBfdG91Y2hfc3luYykgPSBmYWxzZTsKKwkJCXNjaGVkX2Nsb2NrX3RpY2soKTsKKwkJfQorCQlfX3RvdWNoX3dhdGNoZG9nKCk7CisJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CisJfQorCisJLyogY2hlY2sgZm9yIGEgc29mdGxvY2t1cAorCSAqIFRoaXMgaXMgZG9uZSBieSBtYWtpbmcgc3VyZSBhIGhpZ2ggcHJpb3JpdHkgdGFzayBpcworCSAqIGJlaW5nIHNjaGVkdWxlZC4gIFRoZSB0YXNrIHRvdWNoZXMgdGhlIHdhdGNoZG9nIHRvCisJICogaW5kaWNhdGUgaXQgaXMgZ2V0dGluZyBjcHUgdGltZS4gIElmIGl0IGhhc24ndCB0aGVuCisJICogdGhpcyBpcyBhIGdvb2QgaW5kaWNhdGlvbiBzb21lIHRhc2sgaXMgaG9nZ2luZyB0aGUgY3B1CisJICovCisJZHVyYXRpb24gPSBpc19zb2Z0bG9ja3VwKHRvdWNoX3RzKTsKKwlpZiAodW5saWtlbHkoZHVyYXRpb24pKSB7CisJCS8qIG9ubHkgd2FybiBvbmNlICovCisJCWlmIChfX2dldF9jcHVfdmFyKHNvZnRfd2F0Y2hkb2dfd2FybikgPT0gdHJ1ZSkKKwkJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJCVUc6IHNvZnQgbG9ja3VwIC0gQ1BVIyVkIHN0dWNrIGZvciAldXMhIFslczolZF1cbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGR1cmF0aW9uLAorCQkJY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOworCQlwcmludF9tb2R1bGVzKCk7CisJCXByaW50X2lycXRyYWNlX2V2ZW50cyhjdXJyZW50KTsKKwkJaWYgKHJlZ3MpCisJCQlzaG93X3JlZ3MocmVncyk7CisJCWVsc2UKKwkJCWR1bXBfc3RhY2soKTsKKworCQlpZiAoc29mdGxvY2t1cF9wYW5pYykKKwkJCXBhbmljKCJzb2Z0bG9ja3VwOiBodW5nIHRhc2tzIik7CisJCV9fZ2V0X2NwdV92YXIoc29mdF93YXRjaGRvZ193YXJuKSA9IHRydWU7CisJfSBlbHNlCisJCV9fZ2V0X2NwdV92YXIoc29mdF93YXRjaGRvZ193YXJuKSA9IGZhbHNlOworCisJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKK30KKworCisvKgorICogVGhlIHdhdGNoZG9nIHRocmVhZCAtIHRvdWNoZXMgdGhlIHRpbWVzdGFtcC4KKyAqLworc3RhdGljIGludCB3YXRjaGRvZyh2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CisJc3RydWN0IGhydGltZXIgKmhydGltZXIgPSAmX19yYXdfZ2V0X2NwdV92YXIod2F0Y2hkb2dfaHJ0aW1lcik7CisKKwlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKKworCS8qIGluaXRpYWxpemUgdGltZXN0YW1wICovCisJX190b3VjaF93YXRjaGRvZygpOworCisJLyoga2ljayBvZmYgdGhlIHRpbWVyIGZvciB0aGUgaGFyZGxvY2t1cCBkZXRlY3RvciAqLworCS8qIGRvbmUgaGVyZSBiZWNhdXNlIGhydGltZXJfc3RhcnQgY2FuIG9ubHkgcGluIHRvIHNtcF9wcm9jZXNzb3JfaWQoKSAqLworCWhydGltZXJfc3RhcnQoaHJ0aW1lciwgbnNfdG9fa3RpbWUoZ2V0X3NhbXBsZV9wZXJpb2QoKSksCisJCSAgICAgIEhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJLyoKKwkgKiBSdW4gYnJpZWZseSBvbmNlIHBlciBzZWNvbmQgdG8gcmVzZXQgdGhlIHNvZnRsb2NrdXAgdGltZXN0YW1wLgorCSAqIElmIHRoaXMgZ2V0cyBkZWxheWVkIGZvciBtb3JlIHRoYW4gNjAgc2Vjb25kcyB0aGVuIHRoZQorCSAqIGRlYnVnLXByaW50b3V0IHRyaWdnZXJzIGluIHdhdGNoZG9nX3RpbWVyX2ZuKCkuCisJICovCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJX190b3VjaF93YXRjaGRvZygpOworCQlzY2hlZHVsZSgpOworCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfbm1pX2VuYWJsZShpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKndkX2F0dHI7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gcGVyX2NwdSh3YXRjaGRvZ19ldiwgY3B1KTsKKworCS8qIGlzIGl0IGFscmVhZHkgc2V0dXAgYW5kIGVuYWJsZWQ/ICovCisJaWYgKGV2ZW50ICYmIGV2ZW50LT5zdGF0ZSA+IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQorCQlnb3RvIG91dDsKKworCS8qIGl0IGlzIHNldHVwIGJ1dCBub3QgZW5hYmxlZCAqLworCWlmIChldmVudCAhPSBOVUxMKQorCQlnb3RvIG91dF9lbmFibGU7CisKKwkvKiBUcnkgdG8gcmVnaXN0ZXIgdXNpbmcgaGFyZHdhcmUgcGVyZiBldmVudHMgKi8KKwl3ZF9hdHRyID0gJndkX2h3X2F0dHI7CisJd2RfYXR0ci0+c2FtcGxlX3BlcmlvZCA9IGh3X25taV9nZXRfc2FtcGxlX3BlcmlvZCgpOworCWV2ZW50ID0gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIod2RfYXR0ciwgY3B1LCAtMSwgd2F0Y2hkb2dfb3ZlcmZsb3dfY2FsbGJhY2spOworCWlmICghSVNfRVJSKGV2ZW50KSkgeworCQlwcmludGsoS0VSTl9JTkZPICJOTUkgd2F0Y2hkb2cgZW5hYmxlZCwgdGFrZXMgb25lIGh3LXBtdSBjb3VudGVyLlxuIik7CisJCWdvdG8gb3V0X3NhdmU7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJOTUkgd2F0Y2hkb2cgZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGV2ZW50IG9uIGNwdSVpOiAlcFxuIiwgY3B1LCBldmVudCk7CisJcmV0dXJuIC0xOworCisJLyogc3VjY2VzcyBwYXRoICovCitvdXRfc2F2ZToKKwlwZXJfY3B1KHdhdGNoZG9nX2V2LCBjcHUpID0gZXZlbnQ7CitvdXRfZW5hYmxlOgorCXBlcmZfZXZlbnRfZW5hYmxlKHBlcl9jcHUod2F0Y2hkb2dfZXYsIGNwdSkpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19ubWlfZGlzYWJsZShpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IHBlcl9jcHUod2F0Y2hkb2dfZXYsIGNwdSk7CisKKwlpZiAoZXZlbnQpIHsKKwkJcGVyZl9ldmVudF9kaXNhYmxlKGV2ZW50KTsKKwkJcGVyX2NwdSh3YXRjaGRvZ19ldiwgY3B1KSA9IE5VTEw7CisKKwkJLyogc2hvdWxkIGJlIGluIGNsZWFudXAsIGJ1dCBibG9ja3Mgb3Byb2ZpbGUgKi8KKwkJcGVyZl9ldmVudF9yZWxlYXNlX2tlcm5lbChldmVudCk7CisJfQorCXJldHVybjsKK30KKyNlbHNlCitzdGF0aWMgaW50IHdhdGNoZG9nX25taV9lbmFibGUoaW50IGNwdSkgeyByZXR1cm4gMDsgfQorc3RhdGljIHZvaWQgd2F0Y2hkb2dfbm1pX2Rpc2FibGUoaW50IGNwdSkgeyByZXR1cm47IH0KKyNlbmRpZiAvKiBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUiAqLworCisvKiBwcmVwYXJlL2VuYWJsZS9kaXNhYmxlIHJvdXRpbmVzICovCitzdGF0aWMgaW50IHdhdGNoZG9nX3ByZXBhcmVfY3B1KGludCBjcHUpCit7CisJc3RydWN0IGhydGltZXIgKmhydGltZXIgPSAmcGVyX2NwdSh3YXRjaGRvZ19ocnRpbWVyLCBjcHUpOworCisJV0FSTl9PTihwZXJfY3B1KHNvZnRsb2NrdXBfd2F0Y2hkb2csIGNwdSkpOworCWhydGltZXJfaW5pdChocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCWhydGltZXItPmZ1bmN0aW9uID0gd2F0Y2hkb2dfdGltZXJfZm47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YXRjaGRvZ19lbmFibGUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBwZXJfY3B1KHNvZnRsb2NrdXBfd2F0Y2hkb2csIGNwdSk7CisKKwkvKiBlbmFibGUgdGhlIHBlcmYgZXZlbnQgKi8KKwlpZiAod2F0Y2hkb2dfbm1pX2VuYWJsZShjcHUpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGNyZWF0ZSB0aGUgd2F0Y2hkb2cgdGhyZWFkICovCisJaWYgKCFwKSB7CisJCXAgPSBrdGhyZWFkX2NyZWF0ZSh3YXRjaGRvZywgKHZvaWQgKikodW5zaWduZWQgbG9uZyljcHUsICJ3YXRjaGRvZy8lZCIsIGNwdSk7CisJCWlmIChJU19FUlIocCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic29mdGxvY2t1cCB3YXRjaGRvZyBmb3IgJWkgZmFpbGVkXG4iLCBjcHUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWt0aHJlYWRfYmluZChwLCBjcHUpOworCQlwZXJfY3B1KHdhdGNoZG9nX3RvdWNoX3RzLCBjcHUpID0gMDsKKwkJcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBjcHUpID0gcDsKKwkJd2FrZV91cF9wcm9jZXNzKHApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19kaXNhYmxlKGludCBjcHUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBjcHUpOworCXN0cnVjdCBocnRpbWVyICpocnRpbWVyID0gJnBlcl9jcHUod2F0Y2hkb2dfaHJ0aW1lciwgY3B1KTsKKworCS8qCisJICogY2FuY2VsIHRoZSB0aW1lciBmaXJzdCB0byBzdG9wIGluY3JlbWVudGluZyB0aGUgc3RhdHMKKwkgKiBhbmQgd2FraW5nIHVwIHRoZSBrdGhyZWFkCisJICovCisJaHJ0aW1lcl9jYW5jZWwoaHJ0aW1lcik7CisKKwkvKiBkaXNhYmxlIHRoZSBwZXJmIGV2ZW50ICovCisJd2F0Y2hkb2dfbm1pX2Rpc2FibGUoY3B1KTsKKworCS8qIHN0b3AgdGhlIHdhdGNoZG9nIHRocmVhZCAqLworCWlmIChwKSB7CisJCXBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgY3B1KSA9IE5VTEw7CisJCWt0aHJlYWRfc3RvcChwKTsKKwl9CisKKwkvKiBpZiBhbnkgY3B1IHN1Y2NlZWRzLCB3YXRjaGRvZyBpcyBjb25zaWRlcmVkIGVuYWJsZWQgZm9yIHRoZSBzeXN0ZW0gKi8KKwl3YXRjaGRvZ19lbmFibGVkID0gMTsKK30KKworc3RhdGljIHZvaWQgd2F0Y2hkb2dfZW5hYmxlX2FsbF9jcHVzKHZvaWQpCit7CisJaW50IGNwdTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlyZXN1bHQgKz0gd2F0Y2hkb2dfZW5hYmxlKGNwdSk7CisKKwlpZiAocmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgIndhdGNoZG9nOiBmYWlsZWQgdG8gYmUgZW5hYmxlZCBvbiBzb21lIGNwdXNcbiIpOworCit9CisKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2Rpc2FibGVfYWxsX2NwdXModm9pZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCXdhdGNoZG9nX2Rpc2FibGUoY3B1KTsKKworCS8qIGlmIGFsbCB3YXRjaGRvZ3MgYXJlIGRpc2FibGVkLCB0aGVuIHRoZXkgYXJlIGRpc2FibGVkIGZvciB0aGUgc3lzdGVtICovCisJd2F0Y2hkb2dfZW5hYmxlZCA9IDA7Cit9CisKKworLyogc3lzY3RsIGZ1bmN0aW9ucyAqLworI2lmZGVmIENPTkZJR19TWVNDVEwKKy8qCisgKiBwcm9jIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy9rZXJuZWwvbm1pX3dhdGNoZG9nCisgKi8KKworaW50IHByb2NfZG93YXRjaGRvZ19lbmFibGVkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCisJaWYgKHdhdGNoZG9nX2VuYWJsZWQpCisJCXdhdGNoZG9nX2VuYWJsZV9hbGxfY3B1cygpOworCWVsc2UKKwkJd2F0Y2hkb2dfZGlzYWJsZV9hbGxfY3B1cygpOworCXJldHVybiAwOworfQorCitpbnQgcHJvY19kb3dhdGNoZG9nX3RocmVzaChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworfQorI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworCisvKgorICogQ3JlYXRlL2Rlc3Ryb3kgd2F0Y2hkb2cgdGhyZWFkcyBhcyBDUFVzIGNvbWUgYW5kIGdvOgorICovCitzdGF0aWMgaW50IF9fY3B1aW5pdAorY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlpbnQgaG90Y3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKKwkJaWYgKHdhdGNoZG9nX3ByZXBhcmVfY3B1KGhvdGNwdSkpCisJCQlyZXR1cm4gTk9USUZZX0JBRDsKKwkJYnJlYWs7CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CisJCWlmICh3YXRjaGRvZ19lbmFibGUoaG90Y3B1KSkKKwkJCXJldHVybiBOT1RJRllfQkFEOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwljYXNlIENQVV9VUF9DQU5DRUxFRDoKKwljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46CisJCXdhdGNoZG9nX2Rpc2FibGUoaG90Y3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwkJd2F0Y2hkb2dfZGlzYWJsZShob3RjcHUpOworCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIGNwdV9uZmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjcHVfY2FsbGJhY2sKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwYXduX3dhdGNoZG9nX3Rhc2sodm9pZCkKK3sKKwl2b2lkICpjcHUgPSAodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgZXJyOworCisJaWYgKG5vX3dhdGNoZG9nKQorCQlyZXR1cm4gMDsKKworCWVyciA9IGNwdV9jYWxsYmFjaygmY3B1X25mYiwgQ1BVX1VQX1BSRVBBUkUsIGNwdSk7CisJV0FSTl9PTihlcnIgPT0gTk9USUZZX0JBRCk7CisKKwljcHVfY2FsbGJhY2soJmNwdV9uZmIsIENQVV9PTkxJTkUsIGNwdSk7CisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVfbmZiKTsKKworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCXJldHVybiAwOworfQorZWFybHlfaW5pdGNhbGwoc3Bhd25fd2F0Y2hkb2dfdGFzayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggMzI3ZDJkZS4uNTlmZWYxNSAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtNjgsNiArNjgsMjEgQEAKICNlbmRpZgogfTsKIAorI2lmZGVmIENPTkZJR19MT0NLREVQCisvKioKKyAqIGluX3dvcmtxdWV1ZV9jb250ZXh0KCkgLSBpbiBjb250ZXh0IG9mIHNwZWNpZmllZCB3b3JrcXVldWU/CisgKiBAd3E6IHRoZSB3b3JrcXVldWUgb2YgaW50ZXJlc3QKKyAqCisgKiBDaGVja3MgbG9ja2RlcCBzdGF0ZSB0byBzZWUgaWYgdGhlIGN1cnJlbnQgdGFzayBpcyBleGVjdXRpbmcgZnJvbQorICogd2l0aGluIGEgd29ya3F1ZXVlIGl0ZW0uICBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IGlmIGxvY2tkZXAgaXMKKyAqIGVuYWJsZWQuCisgKi8KK2ludCBpbl93b3JrcXVldWVfY29udGV4dChzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpCit7CisJcmV0dXJuIGxvY2tfaXNfaGVsZCgmd3EtPmxvY2tkZXBfbWFwKTsKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfV09SSwogCiBzdGF0aWMgc3RydWN0IGRlYnVnX29ial9kZXNjciB3b3JrX2RlYnVnX2Rlc2NyOwpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZV9zY2hlZC5oIGIva2VybmVsL3dvcmtxdWV1ZV9zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDQwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvd29ya3F1ZXVlX3NjaGVkLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGtlcm5lbC93b3JrcXVldWVfc2NoZWQuaAorICoKKyAqIFNjaGVkdWxlciBob29rcyBmb3IgY29uY3VycmVuY3kgbWFuYWdlZCB3b3JrcXVldWUuICBPbmx5IHRvIGJlCisgKiBpbmNsdWRlZCBmcm9tIHNjaGVkLmMgYW5kIHdvcmtxdWV1ZS5jLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3Ffd29ya2VyX3dha2luZ191cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBjcHUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICp3cV93b3JrZXJfc2xlZXBpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBlNzIyZTlkLi43OWUwZGZmIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtNzYsNyArNzYsNiBAQAogCiBjb25maWcgREVCVUdfRlMKIAlib29sICJEZWJ1ZyBGaWxlc3lzdGVtIgotCWRlcGVuZHMgb24gU1lTRlMKIAloZWxwCiAJICBkZWJ1Z2ZzIGlzIGEgdmlydHVhbCBmaWxlIHN5c3RlbSB0aGF0IGtlcm5lbCBkZXZlbG9wZXJzIHVzZSB0byBwdXQKIAkgIGRlYnVnZ2luZyBmaWxlcyBpbnRvLiAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIGJlIGFibGUgdG8gcmVhZCBhbmQKQEAgLTE1MiwyOCArMTUxLDMzIEBACiAJICBEcml2ZXJzIG91Z2h0IHRvIGJlIGFibGUgdG8gaGFuZGxlIGludGVycnVwdHMgY29taW5nIGluIGF0IHRob3NlCiAJICBwb2ludHM7IHNvbWUgZG9uJ3QgYW5kIG5lZWQgdG8gYmUgY2F1Z2h0LgogCi1jb25maWcgREVURUNUX1NPRlRMT0NLVVAKLQlib29sICJEZXRlY3QgU29mdCBMb2NrdXBzIgorY29uZmlnIExPQ0tVUF9ERVRFQ1RPUgorCWJvb2wgIkRldGVjdCBIYXJkIGFuZCBTb2Z0IExvY2t1cHMiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgIVMzOTAKLQlkZWZhdWx0IHkKIAloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUga2VybmVsIHRvIGRldGVjdCAic29mdCBsb2NrdXBzIiwKLQkgIHdoaWNoIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIGtlcm5lbCB0byBsb29wIGluIGtlcm5lbAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGtlcm5lbCB0byBhY3QgYXMgYSB3YXRjaGRvZyB0byBkZXRlY3QKKwkgIGhhcmQgYW5kIHNvZnQgbG9ja3Vwcy4KKworCSAgU29mdGxvY2t1cHMgYXJlIGJ1Z3MgdGhhdCBjYXVzZSB0aGUga2VybmVsIHRvIGxvb3AgaW4ga2VybmVsCiAJICBtb2RlIGZvciBtb3JlIHRoYW4gNjAgc2Vjb25kcywgd2l0aG91dCBnaXZpbmcgb3RoZXIgdGFza3MgYQotCSAgY2hhbmNlIHRvIHJ1bi4KKwkgIGNoYW5jZSB0byBydW4uICBUaGUgY3VycmVudCBzdGFjayB0cmFjZSBpcyBkaXNwbGF5ZWQgdXBvbgorCSAgZGV0ZWN0aW9uIGFuZCB0aGUgc3lzdGVtIHdpbGwgc3RheSBsb2NrZWQgdXAuCiAKLQkgIFdoZW4gYSBzb2Z0LWxvY2t1cCBpcyBkZXRlY3RlZCwgdGhlIGtlcm5lbCB3aWxsIHByaW50IHRoZQotCSAgY3VycmVudCBzdGFjayB0cmFjZSAod2hpY2ggeW91IHNob3VsZCByZXBvcnQpLCBidXQgdGhlCi0JICBzeXN0ZW0gd2lsbCBzdGF5IGxvY2tlZCB1cC4gVGhpcyBmZWF0dXJlIGhhcyBuZWdsaWdpYmxlCi0JICBvdmVyaGVhZC4KKwkgIEhhcmRsb2NrdXBzIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIENQVSB0byBsb29wIGluIGtlcm5lbCBtb2RlCisJICBmb3IgbW9yZSB0aGFuIDYwIHNlY29uZHMsIHdpdGhvdXQgbGV0dGluZyBvdGhlciBpbnRlcnJ1cHRzIGhhdmUgYQorCSAgY2hhbmNlIHRvIHJ1bi4gIFRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIGlzIGRpc3BsYXllZCB1cG9uIGRldGVjdGlvbgorCSAgYW5kIHRoZSBzeXN0ZW0gd2lsbCBzdGF5IGxvY2tlZCB1cC4KIAotCSAgKE5vdGUgdGhhdCAiaGFyZCBsb2NrdXBzIiBhcmUgc2VwYXJhdGUgdHlwZSBvZiBidWdzIHRoYXQKLQkgICBjYW4gYmUgZGV0ZWN0ZWQgdmlhIHRoZSBOTUktd2F0Y2hkb2csIG9uIHBsYXRmb3JtcyB0aGF0Ci0JICAgc3VwcG9ydCBpdC4pCisJICBUaGUgb3ZlcmhlYWQgc2hvdWxkIGJlIG1pbmltYWwuICBBIHBlcmlvZGljIGhydGltZXIgcnVucyB0bworCSAgZ2VuZXJhdGUgaW50ZXJydXB0cyBhbmQga2ljayB0aGUgd2F0Y2hkb2cgdGFzayBldmVyeSAxMC0xMiBzZWNvbmRzLgorCSAgQW4gTk1JIGlzIGdlbmVyYXRlZCBldmVyeSA2MCBzZWNvbmRzIG9yIHNvIHRvIGNoZWNrIGZvciBoYXJkbG9ja3Vwcy4KKworY29uZmlnIEhBUkRMT0NLVVBfREVURUNUT1IKKwlkZWZfYm9vbCBMT0NLVVBfREVURUNUT1IgJiYgUEVSRl9FVkVOVFMgJiYgSEFWRV9QRVJGX0VWRU5UU19OTUkKIAogY29uZmlnIEJPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDCiAJYm9vbCAiUGFuaWMgKFJlYm9vdCkgT24gU29mdCBMb2NrdXBzIgotCWRlcGVuZHMgb24gREVURUNUX1NPRlRMT0NLVVAKKwlkZXBlbmRzIG9uIExPQ0tVUF9ERVRFQ1RPUgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gcGFuaWMgb24gInNvZnQgbG9ja3VwcyIsCiAJICB3aGljaCBhcmUgYnVncyB0aGF0IGNhdXNlIHRoZSBrZXJuZWwgdG8gbG9vcCBpbiBrZXJuZWwKQEAgLTE5MCw3ICsxOTQsNyBAQAogCiBjb25maWcgQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUUKIAlpbnQKLQlkZXBlbmRzIG9uIERFVEVDVF9TT0ZUTE9DS1VQCisJZGVwZW5kcyBvbiBMT0NLVVBfREVURUNUT1IKIAlyYW5nZSAwIDEKIAlkZWZhdWx0IDAgaWYgIUJPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDCiAJZGVmYXVsdCAxIGlmIEJPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDCkBAIC0zMDcsNiArMzExLDEyIEBACiAJICB3b3JrIHF1ZXVlIHJvdXRpbmVzIHRvIHRyYWNrIHRoZSBsaWZlIHRpbWUgb2Ygd29yayBvYmplY3RzIGFuZAogCSAgdmFsaWRhdGUgdGhlIHdvcmsgb3BlcmF0aW9ucy4KIAorY29uZmlnIERFQlVHX09CSkVDVFNfUkNVX0hFQUQKKwlib29sICJEZWJ1ZyBSQ1UgY2FsbGJhY2tzIG9iamVjdHMiCisJZGVwZW5kcyBvbiBERUJVR19PQkpFQ1RTICYmIFBSRUVNUFQKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byB0dXJuIG9uIGRlYnVnZ2luZyBvZiBSQ1UgbGlzdCBoZWFkcyAoY2FsbF9yY3UoKSB1c2FnZSkuCisKIGNvbmZpZyBERUJVR19PQkpFQ1RTX0VOQUJMRV9ERUZBVUxUCiAJaW50ICJkZWJ1Z19vYmplY3RzIGJvb3R1cCBkZWZhdWx0IHZhbHVlICgwLTEpIgogICAgICAgICByYW5nZSAwIDEKQEAgLTUyOCw3ICs1MzgsNyBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBUUkFDRV9JUlFGTEFHU19TVVBQT1JUICYmIFNUQUNLVFJBQ0VfU1VQUE9SVCAmJiBMT0NLREVQX1NVUFBPUlQKIAlzZWxlY3QgU1RBQ0tUUkFDRQotCXNlbGVjdCBGUkFNRV9QT0lOVEVSIGlmICFNSVBTICYmICFQUEMgJiYgIUFSTV9VTldJTkQgJiYgIVMzOTAKKwlzZWxlY3QgRlJBTUVfUE9JTlRFUiBpZiAhTUlQUyAmJiAhUFBDICYmICFBUk1fVU5XSU5EICYmICFTMzkwICYmICFNSUNST0JMQVpFCiAJc2VsZWN0IEtBTExTWU1TCiAJc2VsZWN0IEtBTExTWU1TX0FMTAogCkBAIC02MjgsNiArNjM4LDE5IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBERUJVR19JTkZPX1JFRFVDRUQKKwlib29sICJSZWR1Y2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIgorCWRlcGVuZHMgb24gREVCVUdfSU5GTworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIGdjYyBpcyBpbnN0cnVjdGVkIHRvIGdlbmVyYXRlIGxlc3MgZGVidWdnaW5nCisJICBpbmZvcm1hdGlvbiBmb3Igc3RydWN0dXJlIHR5cGVzLiBUaGlzIG1lYW5zIHRoYXQgdG9vbHMgdGhhdAorCSAgbmVlZCBmdWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAobGlrZSBrZ2RiIG9yIHN5c3RlbXRhcCkgd29uJ3QKKwkgIGJlIGhhcHB5LiBCdXQgaWYgeW91IG1lcmVseSBuZWVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0bworCSAgcmVzb2x2ZSBsaW5lIG51bWJlcnMgdGhlcmUgaXMgbm8gbG9zcy4gQWR2YW50YWdlIGlzIHRoYXQKKwkgIGJ1aWxkIGRpcmVjdG9yeSBvYmplY3Qgc2l6ZXMgc2hyaW5rIGRyYW1hdGljYWxseSBvdmVyIGEgZnVsbAorCSAgREVCVUdfSU5GTyBidWlsZCBhbmQgY29tcGlsZSB0aW1lcyBhcmUgcmVkdWNlZCB0b28uCisJICBPbmx5IHdvcmtzIHdpdGggbmV3ZXIgZ2NjIHZlcnNpb25zLgorCiBjb25maWcgREVCVUdfVk0KIAlib29sICJEZWJ1ZyBWTSIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApAQCAtOTM3LDcgKzk2MCw3IEBACiAJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBkaXNrIElPLgogCiBjb25maWcgRkFJTF9JT19USU1FT1VUCi0JYm9vbCAiRmF1bC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgZmFraW5nIGRpc2sgaW50ZXJydXB0cyIKKwlib29sICJGYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgZmFraW5nIGRpc2sgaW50ZXJydXB0cyIKIAlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTiAmJiBCTE9DSwogCWhlbHAKIAkgIFByb3ZpZGUgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgb24gZW5kIElPIGhhbmRsaW5nLiBUaGlzCkBAIC05NTgsMTMgKzk4MSwxMyBAQAogCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICYmIFNUQUNLVFJBQ0VfU1VQUE9SVAogCWRlcGVuZHMgb24gIVg4Nl82NAogCXNlbGVjdCBTVEFDS1RSQUNFCi0Jc2VsZWN0IEZSQU1FX1BPSU5URVIgaWYgIVBQQyAmJiAhUzM5MAorCXNlbGVjdCBGUkFNRV9QT0lOVEVSIGlmICFQUEMgJiYgIVMzOTAgJiYgIU1JQ1JPQkxBWkUKIAloZWxwCiAJICBQcm92aWRlIHN0YWNrdHJhY2UgZmlsdGVyIGZvciBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0aWVzCiAKIGNvbmZpZyBMQVRFTkNZVE9QCiAJYm9vbCAiTGF0ZW5jeSBtZWFzdXJpbmcgaW5mcmFzdHJ1Y3R1cmUiCi0Jc2VsZWN0IEZSQU1FX1BPSU5URVIgaWYgIU1JUFMgJiYgIVBQQyAmJiAhUzM5MAorCXNlbGVjdCBGUkFNRV9QT0lOVEVSIGlmICFNSVBTICYmICFQUEMgJiYgIVMzOTAgJiYgIU1JQ1JPQkxBWkUKIAlzZWxlY3QgS0FMTFNZTVMKIAlzZWxlY3QgS0FMTFNZTVNfQUxMCiAJc2VsZWN0IFNUQUNLVFJBQ0UKZGlmZiAtLWdpdCBhL2xpYi9hdG9taWM2NF90ZXN0LmMgYi9saWIvYXRvbWljNjRfdGVzdC5jCmluZGV4IDI1MGVkMTEuLjQ0NTI0Y2MgMTAwNjQ0Ci0tLSBhL2xpYi9hdG9taWM2NF90ZXN0LmMKKysrIGIvbGliL2F0b21pYzY0X3Rlc3QuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJQlVHX09OKHYuY291bnRlciAhPSByKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfTUlQUykgfHwgZGVmaW5lZChDT05GSUdfUFBDKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfUzM5MCkgfHwgZGVmaW5lZChfQVNNX0dFTkVSSUNfQVRPTUlDNjRfSCkKKyAgICBkZWZpbmVkKENPTkZJR19TMzkwKSB8fCBkZWZpbmVkKF9BU01fR0VORVJJQ19BVE9NSUM2NF9IKSB8fCBkZWZpbmVkKENPTkZJR19BUk0pCiAJSU5JVChvbmVzdHdvcyk7CiAJQlVHX09OKGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZSgmdikgIT0gKG9uZXN0d29zIC0gMSkpOwogCXIgLT0gb25lOwpkaWZmIC0tZ2l0IGEvbGliL2RldnJlcy5jIGIvbGliL2RldnJlcy5jCmluZGV4IDQ5MzY4NjAuLjZlZmRkZjUgMTAwNjQ0Ci0tLSBhL2xpYi9kZXZyZXMuYworKysgYi9saWIvZGV2cmVzLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogICogQHBkZXY6IFBDSSBkZXZpY2UgdG8gbWFwIElPIHJlc291cmNlcyBmb3IKICAqIEBtYXNrOiBNYXNrIG9mIEJBUnMgdG8gdW5tYXAgYW5kIHJlbGVhc2UKICAqCi0gKiBVbmFtcCBhbmQgcmVsZWFzZSByZWdpb25zIHNwZWNpZmllZCBieSBAbWFzay4KKyAqIFVubWFwIGFuZCByZWxlYXNlIHJlZ2lvbnMgc3BlY2lmaWVkIGJ5IEBtYXNrLgogICovCiB2b2lkIHBjaW1faW91bm1hcF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MTYgbWFzaykKIHsKZGlmZiAtLWdpdCBhL2xpYi9pb3JlbWFwLmMgYi9saWIvaW9yZW1hcC5jCmluZGV4IDE0YzYwNzguLjU3MzBlY2QgMTAwNjQ0Ci0tLSBhL2xpYi9pb3JlbWFwLmMKKysrIGIvbGliL2lvcmVtYXAuYwpAQCAtMTMsMTAgKzEzLDEwIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAogc3RhdGljIGludCBpb3JlbWFwX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCXVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKIHsKIAlwdGVfdCAqcHRlOwotCXVuc2lnbmVkIGxvbmcgcGZuOworCXU2NCBwZm47CiAKIAlwZm4gPSBwaHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKIAlwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgYWRkcik7CkBAIC0zMSw3ICszMSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlvcmVtYXBfcG1kX3JhbmdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KQorCQl1bnNpZ25lZCBsb25nIGVuZCwgcGh5c19hZGRyX3QgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KQogewogCXBtZF90ICpwbWQ7CiAJdW5zaWduZWQgbG9uZyBuZXh0OwpAQCAtNDksNyArNDksNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3B1ZF9yYW5nZShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCXVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKIHsKIAlwdWRfdCAqcHVkOwogCXVuc2lnbmVkIGxvbmcgbmV4dDsKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogaW50IGlvcmVtYXBfcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHBncHJvdF90IHByb3QpCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZCwgcGh5c19hZGRyX3QgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KQogewogCXBnZF90ICpwZ2Q7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKZGlmZiAtLWdpdCBhL2xpYi9yYW5kb20zMi5jIGIvbGliL3JhbmRvbTMyLmMKaW5kZXggODcwZGMzZi4uZmMzNTQ1YSAxMDA2NDQKLS0tIGEvbGliL3JhbmRvbTMyLmMKKysrIGIvbGliL3JhbmRvbTMyLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAvKgogICoJR2VuZXJhdGUgYmV0dGVyIHZhbHVlcyBhZnRlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotICoJaXMgZnVsbHkgaW5pdGFsaXplZC4KKyAqCWlzIGZ1bGx5IGluaXRpYWxpemVkLgogICovCiBzdGF0aWMgaW50IF9faW5pdCByYW5kb20zMl9yZXNlZWQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2xpYi9zd2lvdGxiLmMgYi9saWIvc3dpb3RsYi5jCmluZGV4IGEwMDkwNTUuLjM0ZTMwODIgMTAwNjQ0Ci0tLSBhL2xpYi9zd2lvdGxiLmMKKysrIGIvbGliL3N3aW90bGIuYwpAQCAtNTAsMTkgKzUwLDExIEBACiAgKi8KICNkZWZpbmUgSU9fVExCX01JTl9TTEFCUyAoKDE8PDIwKSA+PiBJT19UTEJfU0hJRlQpCiAKLS8qCi0gKiBFbnVtZXJhdGlvbiBmb3Igc3luYyB0YXJnZXRzCi0gKi8KLWVudW0gZG1hX3N5bmNfdGFyZ2V0IHsKLQlTWU5DX0ZPUl9DUFUgPSAwLAotCVNZTkNfRk9SX0RFVklDRSA9IDEsCi19OwotCiBpbnQgc3dpb3RsYl9mb3JjZTsKIAogLyoKLSAqIFVzZWQgdG8gZG8gYSBxdWljayByYW5nZSBjaGVjayBpbiB1bm1hcF9zaW5nbGUgYW5kCi0gKiBzeW5jX3NpbmdsZV8qLCB0byBzZWUgaWYgdGhlIG1lbW9yeSB3YXMgaW4gZmFjdCBhbGxvY2F0ZWQgYnkgdGhpcworICogVXNlZCB0byBkbyBhIHF1aWNrIHJhbmdlIGNoZWNrIGluIHN3aW90bGJfdGJsX3VubWFwX3NpbmdsZSBhbmQKKyAqIHN3aW90bGJfdGJsX3N5bmNfc2luZ2xlXyosIHRvIHNlZSBpZiB0aGUgbWVtb3J5IHdhcyBpbiBmYWN0IGFsbG9jYXRlZCBieSB0aGlzCiAgKiBBUEkuCiAgKi8KIHN0YXRpYyBjaGFyICppb190bGJfc3RhcnQsICppb190bGJfZW5kOwpAQCAtMTQwLDI4ICsxMzIsMTQgQEAKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwZW5kKTsKIH0KIAotLyoKLSAqIFN0YXRpY2FsbHkgcmVzZXJ2ZSBib3VuY2UgYnVmZmVyIHNwYWNlIGFuZCBpbml0aWFsaXplIGJvdW5jZSBidWZmZXIgZGF0YQotICogc3RydWN0dXJlcyBmb3IgdGhlIHNvZnR3YXJlIElPIFRMQiB1c2VkIHRvIGltcGxlbWVudCB0aGUgRE1BIEFQSS4KLSAqLwotdm9pZCBfX2luaXQKLXN3aW90bGJfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZShzaXplX3QgZGVmYXVsdF9zaXplLCBpbnQgdmVyYm9zZSkKK3ZvaWQgX19pbml0IHN3aW90bGJfaW5pdF93aXRoX3RibChjaGFyICp0bGIsIHVuc2lnbmVkIGxvbmcgbnNsYWJzLCBpbnQgdmVyYm9zZSkKIHsKIAl1bnNpZ25lZCBsb25nIGksIGJ5dGVzOwogCi0JaWYgKCFpb190bGJfbnNsYWJzKSB7Ci0JCWlvX3RsYl9uc2xhYnMgPSAoZGVmYXVsdF9zaXplID4+IElPX1RMQl9TSElGVCk7Ci0JCWlvX3RsYl9uc2xhYnMgPSBBTElHTihpb190bGJfbnNsYWJzLCBJT19UTEJfU0VHU0laRSk7Ci0JfQorCWJ5dGVzID0gbnNsYWJzIDw8IElPX1RMQl9TSElGVDsKIAotCWJ5dGVzID0gaW9fdGxiX25zbGFicyA8PCBJT19UTEJfU0hJRlQ7Ci0KLQkvKgotCSAqIEdldCBJTyBUTEIgbWVtb3J5IGZyb20gdGhlIGxvdyBwYWdlcwotCSAqLwotCWlvX3RsYl9zdGFydCA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKGJ5dGVzKTsKLQlpZiAoIWlvX3RsYl9zdGFydCkKLQkJcGFuaWMoIkNhbm5vdCBhbGxvY2F0ZSBTV0lPVExCIGJ1ZmZlciIpOworCWlvX3RsYl9uc2xhYnMgPSBuc2xhYnM7CisJaW9fdGxiX3N0YXJ0ID0gdGxiOwogCWlvX3RsYl9lbmQgPSBpb190bGJfc3RhcnQgKyBieXRlczsKIAogCS8qCkBAIC0xODUsNiArMTYzLDMyIEBACiAJCXN3aW90bGJfcHJpbnRfaW5mbygpOwogfQogCisvKgorICogU3RhdGljYWxseSByZXNlcnZlIGJvdW5jZSBidWZmZXIgc3BhY2UgYW5kIGluaXRpYWxpemUgYm91bmNlIGJ1ZmZlciBkYXRhCisgKiBzdHJ1Y3R1cmVzIGZvciB0aGUgc29mdHdhcmUgSU8gVExCIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBETUEgQVBJLgorICovCit2b2lkIF9faW5pdAorc3dpb3RsYl9pbml0X3dpdGhfZGVmYXVsdF9zaXplKHNpemVfdCBkZWZhdWx0X3NpemUsIGludCB2ZXJib3NlKQoreworCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CisKKwlpZiAoIWlvX3RsYl9uc2xhYnMpIHsKKwkJaW9fdGxiX25zbGFicyA9IChkZWZhdWx0X3NpemUgPj4gSU9fVExCX1NISUZUKTsKKwkJaW9fdGxiX25zbGFicyA9IEFMSUdOKGlvX3RsYl9uc2xhYnMsIElPX1RMQl9TRUdTSVpFKTsKKwl9CisKKwlieXRlcyA9IGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUOworCisJLyoKKwkgKiBHZXQgSU8gVExCIG1lbW9yeSBmcm9tIHRoZSBsb3cgcGFnZXMKKwkgKi8KKwlpb190bGJfc3RhcnQgPSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhieXRlcyk7CisJaWYgKCFpb190bGJfc3RhcnQpCisJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgU1dJT1RMQiBidWZmZXIiKTsKKworCXN3aW90bGJfaW5pdF93aXRoX3RibChpb190bGJfc3RhcnQsIGlvX3RsYl9uc2xhYnMsIHZlcmJvc2UpOworfQorCiB2b2lkIF9faW5pdAogc3dpb3RsYl9pbml0KGludCB2ZXJib3NlKQogewpAQCAtMzIzLDggKzMyNyw4IEBACiAvKgogICogQm91bmNlOiBjb3B5IHRoZSBzd2lvdGxiIGJ1ZmZlciBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkbWEgbG9jYXRpb24KICAqLwotc3RhdGljIHZvaWQgc3dpb3RsYl9ib3VuY2UocGh5c19hZGRyX3QgcGh5cywgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLAotCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQordm9pZCBzd2lvdGxiX2JvdW5jZShwaHlzX2FkZHJfdCBwaHlzLCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihwaHlzKTsKIApAQCAtMzYwLDI2ICszNjQsMjUgQEAKIAkJCW1lbWNweShwaHlzX3RvX3ZpcnQocGh5cyksIGRtYV9hZGRyLCBzaXplKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX2JvdW5jZSk7CiAKLS8qCi0gKiBBbGxvY2F0ZXMgYm91bmNlIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMga2VybmVsIHZpcnR1YWwgYWRkcmVzcy4KLSAqLwotc3RhdGljIHZvaWQgKgotbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgcGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUsIGludCBkaXIpCit2b2lkICpzd2lvdGxiX3RibF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IHRibF9kbWFfYWRkciwKKwkJCSAgICAgcGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUsCisJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgKmRtYV9hZGRyOwogCXVuc2lnbmVkIGludCBuc2xvdHMsIHN0cmlkZSwgaW5kZXgsIHdyYXA7CiAJaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9kbWFfYWRkcjsKIAl1bnNpZ25lZCBsb25nIG1hc2s7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXRfc2xvdHM7CiAJdW5zaWduZWQgbG9uZyBtYXhfc2xvdHM7CiAKIAltYXNrID0gZG1hX2dldF9zZWdfYm91bmRhcnkoaHdkZXYpOwotCXN0YXJ0X2RtYV9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgaW9fdGxiX3N0YXJ0KSAmIG1hc2s7CiAKLQlvZmZzZXRfc2xvdHMgPSBBTElHTihzdGFydF9kbWFfYWRkciwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKKwl0YmxfZG1hX2FkZHIgJj0gbWFzazsKKworCW9mZnNldF9zbG90cyA9IEFMSUdOKHRibF9kbWFfYWRkciwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKIAogCS8qCiAgCSAqIENhcmVmdWxseSBoYW5kbGUgaW50ZWdlciBvdmVyZmxvdyB3aGljaCBjYW4gb2NjdXIgd2hlbiBtYXNrID09IH4wVUwuCkBAIC00NjYsMTIgKzQ2OSwyNyBAQAogCiAJcmV0dXJuIGRtYV9hZGRyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl90YmxfbWFwX3NpbmdsZSk7CisKKy8qCisgKiBBbGxvY2F0ZXMgYm91bmNlIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMga2VybmVsIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworCitzdGF0aWMgdm9pZCAqCittYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSwKKwkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX2FkZHJfdCBzdGFydF9kbWFfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIGlvX3RsYl9zdGFydCk7CisKKwlyZXR1cm4gc3dpb3RsYl90YmxfbWFwX3NpbmdsZShod2Rldiwgc3RhcnRfZG1hX2FkZHIsIHBoeXMsIHNpemUsIGRpcik7Cit9CiAKIC8qCiAgKiBkbWFfYWRkciBpcyB0aGUga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYm91bmNlIGJ1ZmZlciB0byB1bm1hcC4KICAqLwotc3RhdGljIHZvaWQKLWRvX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQordm9pZAorc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSwgY291bnQsIG5zbG90cyA9IEFMSUdOKHNpemUsIDEgPDwgSU9fVExCX1NISUZUKSA+PiBJT19UTEJfU0hJRlQ7CkBAIC01MDksMTAgKzUyNywxMiBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb190bGJfbG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlKTsKIAotc3RhdGljIHZvaWQKLXN5bmNfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsCi0JICAgIGludCBkaXIsIGludCB0YXJnZXQpCit2b2lkCitzd2lvdGxiX3RibF9zeW5jX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJZW51bSBkbWFfc3luY190YXJnZXQgdGFyZ2V0KQogewogCWludCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOwogCXBoeXNfYWRkcl90IHBoeXMgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKQEAgLTUzNiw2ICs1NTYsNyBAQAogCQlCVUcoKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3RibF9zeW5jX3NpbmdsZSk7CiAKIHZvaWQgKgogc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCkBAIC01NTksOCArNTgwLDggQEAKIAl9CiAJaWYgKCFyZXQpIHsKIAkJLyoKLQkJICogV2UgYXJlIGVpdGhlciBvdXQgb2YgbWVtb3J5IG9yIHRoZSBkZXZpY2UgY2FuJ3QgRE1BCi0JCSAqIHRvIEdGUF9ETUEgbWVtb3J5OyBmYWxsIGJhY2sgb24gbWFwX3NpbmdsZSgpLCB3aGljaAorCQkgKiBXZSBhcmUgZWl0aGVyIG91dCBvZiBtZW1vcnkgb3IgdGhlIGRldmljZSBjYW4ndCBETUEgdG8KKwkJICogR0ZQX0RNQSBtZW1vcnk7IGZhbGwgYmFjayBvbiBtYXBfc2luZ2xlKCksIHdoaWNoCiAJCSAqIHdpbGwgZ3JhYiBtZW1vcnkgZnJvbSB0aGUgbG93ZXN0IGF2YWlsYWJsZSBhZGRyZXNzIHJhbmdlLgogCQkgKi8KIAkJcmV0ID0gbWFwX3NpbmdsZShod2RldiwgMCwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKQEAgLTU3OCw3ICs1OTksNyBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZfYWRkcik7CiAKIAkJLyogRE1BX1RPX0RFVklDRSB0byBhdm9pZCBtZW1jcHkgaW4gdW5tYXBfc2luZ2xlICovCi0JCWRvX3VubWFwX3NpbmdsZShod2RldiwgcmV0LCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlKGh3ZGV2LCByZXQsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJKmRtYV9oYW5kbGUgPSBkZXZfYWRkcjsKQEAgLTU5NiwxMyArNjE3LDE0IEBACiAJaWYgKCFpc19zd2lvdGxiX2J1ZmZlcihwYWRkcikpCiAJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7CiAJZWxzZQotCQkvKiBETUFfVE9fREVWSUNFIHRvIGF2b2lkIG1lbWNweSBpbiB1bm1hcF9zaW5nbGUgKi8KLQkJZG9fdW5tYXBfc2luZ2xlKGh3ZGV2LCB2YWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCS8qIERNQV9UT19ERVZJQ0UgdG8gYXZvaWQgbWVtY3B5IGluIHN3aW90bGJfdGJsX3VubWFwX3NpbmdsZSAqLworCQlzd2lvdGxiX3RibF91bm1hcF9zaW5nbGUoaHdkZXYsIHZhZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKIH0KIEVYUE9SVF9TWU1CT0woc3dpb3RsYl9mcmVlX2NvaGVyZW50KTsKIAogc3RhdGljIHZvaWQKLXN3aW90bGJfZnVsbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBpbnQgZGlyLCBpbnQgZG9fcGFuaWMpCitzd2lvdGxiX2Z1bGwoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCSAgICAgaW50IGRvX3BhbmljKQogewogCS8qCiAJICogUmFuIG91dCBvZiBJT01NVSBzcGFjZSBmb3IgdGhpcyBvcGVyYXRpb24uIFRoaXMgaXMgdmVyeSBiYWQuCkBAIC02ODAsMTQgKzcwMiwxNCBAQAogICogd2hhdGV2ZXIgdGhlIGRldmljZSB3cm90ZSB0aGVyZS4KICAqLwogc3RhdGljIHZvaWQgdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJIHNpemVfdCBzaXplLCBpbnQgZGlyKQorCQkJIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJcGh5c19hZGRyX3QgcGFkZHIgPSBkbWFfdG9fcGh5cyhod2RldiwgZGV2X2FkZHIpOwogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKIAlpZiAoaXNfc3dpb3RsYl9idWZmZXIocGFkZHIpKSB7Ci0JCWRvX3VubWFwX3NpbmdsZShod2RldiwgcGh5c190b192aXJ0KHBhZGRyKSwgc2l6ZSwgZGlyKTsKKwkJc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlKGh3ZGV2LCBwaHlzX3RvX3ZpcnQocGFkZHIpLCBzaXplLCBkaXIpOwogCQlyZXR1cm47CiAJfQogCkBAIC03MjMsMTQgKzc0NSwxNiBAQAogICovCiBzdGF0aWMgdm9pZAogc3dpb3RsYl9zeW5jX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJICAgIHNpemVfdCBzaXplLCBpbnQgZGlyLCBpbnQgdGFyZ2V0KQorCQkgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJICAgIGVudW0gZG1hX3N5bmNfdGFyZ2V0IHRhcmdldCkKIHsKIAlwaHlzX2FkZHJfdCBwYWRkciA9IGRtYV90b19waHlzKGh3ZGV2LCBkZXZfYWRkcik7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAogCWlmIChpc19zd2lvdGxiX2J1ZmZlcihwYWRkcikpIHsKLQkJc3luY19zaW5nbGUoaHdkZXYsIHBoeXNfdG9fdmlydChwYWRkciksIHNpemUsIGRpciwgdGFyZ2V0KTsKKwkJc3dpb3RsYl90Ymxfc3luY19zaW5nbGUoaHdkZXYsIHBoeXNfdG9fdmlydChwYWRkciksIHNpemUsIGRpciwKKwkJCQkgICAgICAgdGFyZ2V0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODA5LDcgKzgzMyw3IEBACiAKIGludAogc3dpb3RsYl9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVsZW1zLAotCSAgICAgICBpbnQgZGlyKQorCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJcmV0dXJuIHN3aW90bGJfbWFwX3NnX2F0dHJzKGh3ZGV2LCBzZ2wsIG5lbGVtcywgZGlyLCBOVUxMKTsKIH0KQEAgLTgzNiw3ICs4NjAsNyBAQAogCiB2b2lkCiBzd2lvdGxiX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbGVtcywKLQkJIGludCBkaXIpCisJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJcmV0dXJuIHN3aW90bGJfdW5tYXBfc2dfYXR0cnMoaHdkZXYsIHNnbCwgbmVsZW1zLCBkaXIsIE5VTEwpOwogfQpAQCAtODUxLDcgKzg3NSw4IEBACiAgKi8KIHN0YXRpYyB2b2lkCiBzd2lvdGxiX3N5bmNfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAotCQlpbnQgbmVsZW1zLCBpbnQgZGlyLCBpbnQgdGFyZ2V0KQorCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCWVudW0gZG1hX3N5bmNfdGFyZ2V0IHRhcmdldCkKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBiOGEyZjU0Li40ZWUxOWQwIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtOTgwLDYgKzk4MCwxMSBAQAogICogICAgICAgICAgICAgWzBdWzFdWzJdWzNdLVs0XVs1XS1bNl1bN10tWzhdWzldLVsxMF1bMTFdWzEyXVsxM11bMTRdWzE1XQogICogICAgICAgICAgIGxpdHRsZSBlbmRpYW4gb3V0cHV0IGJ5dGUgb3JkZXIgaXM6CiAgKiAgICAgICAgICAgICBbM11bMl1bMV1bMF0tWzVdWzRdLVs3XVs2XS1bOF1bOV0tWzEwXVsxMV1bMTJdWzEzXVsxNF1bMTVdCisgKiAtICdWJyBGb3IgYSBzdHJ1Y3QgdmFfZm9ybWF0IHdoaWNoIGNvbnRhaW5zIGEgZm9ybWF0IHN0cmluZyAqIGFuZCB2YV9saXN0ICosCisgKiAgICAgICBjYWxsIHZzbnByaW50ZigtPmZvcm1hdCwgKi0+dmFfbGlzdCkuCisgKiAgICAgICBJbXBsZW1lbnRzIGEgInJlY3Vyc2l2ZSB2c25wcmludGYiLgorICogICAgICAgRG8gbm90IHVzZSB0aGlzIGZlYXR1cmUgd2l0aG91dCBzb21lIG1lY2hhbmlzbSB0byB2ZXJpZnkgdGhlCisgKiAgICAgICBjb3JyZWN0bmVzcyBvZiB0aGUgZm9ybWF0IHN0cmluZyBhbmQgdmFfbGlzdCBhcmd1bWVudHMuCiAgKgogICogTm90ZTogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAnUycgYW5kICdGJyBpcyB0aGF0IG9uIGlhNjQgYW5kIHBwYzY0CiAgKiBmdW5jdGlvbiBwb2ludGVycyBhcmUgcmVhbGx5IGZ1bmN0aW9uIGRlc2NyaXB0b3JzLCB3aGljaCBjb250YWluIGEKQEAgLTEwMjUsNiArMTAzMCwxMCBAQAogCQlicmVhazsKIAljYXNlICdVJzoKIAkJcmV0dXJuIHV1aWRfc3RyaW5nKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CisJY2FzZSAnVic6CisJCXJldHVybiBidWYgKyB2c25wcmludGYoYnVmLCBlbmQgLSBidWYsCisJCQkJICAgICAgICgoc3RydWN0IHZhX2Zvcm1hdCAqKXB0ciktPmZtdCwKKwkJCQkgICAgICAgKigoKHN0cnVjdCB2YV9mb3JtYXQgKilwdHIpLT52YSkpOwogCX0KIAlzcGVjLmZsYWdzIHw9IFNNQUxMOwogCWlmIChzcGVjLmZpZWxkX3dpZHRoID09IC0xKSB7CmRpZmYgLS1naXQgYS9tbS9iYWNraW5nLWRldi5jIGIvbW0vYmFja2luZy1kZXYuYwppbmRleCAxMjNiY2VmLi5mOWZkM2RkIDEwMDY0NAotLS0gYS9tbS9iYWNraW5nLWRldi5jCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTY2NSw3ICs2NjUsNiBAQAogCWJkaS0+bWF4X3JhdGlvID0gMTAwOwogCWJkaS0+bWF4X3Byb3BfZnJhYyA9IFBST1BfRlJBQ19CQVNFOwogCXNwaW5fbG9ja19pbml0KCZiZGktPndiX2xvY2spOwotCUlOSVRfUkNVX0hFQUQoJmJkaS0+cmN1X2hlYWQpOwogCUlOSVRfTElTVF9IRUFEKCZiZGktPmJkaV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYmRpLT53Yl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYmRpLT53b3JrX2xpc3QpOwpkaWZmIC0tZ2l0IGEvbW0vaGlnaG1lbS5jIGIvbW0vaGlnaG1lbS5jCmluZGV4IDY2YmFhMjAuLjdhMGFhMWIgMTAwNjQ0Ci0tLSBhL21tL2hpZ2htZW0uYworKysgYi9tbS9oaWdobWVtLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKIC8qCkBAIC00NzAsNiArNDcxLDEyIEBACiAJCQl3YXJuX2NvdW50LS07CiAJCX0KIAl9CisjaWZkZWYgQ09ORklHX0tHREJfS0RCCisJaWYgKHVubGlrZWx5KHR5cGUgPT0gS01fS0RCICYmIGF0b21pY19yZWFkKCZrZ2RiX2FjdGl2ZSkgPT0gLTEpKSB7CisJCVdBUk5fT04oMSk7CisJCXdhcm5fY291bnQtLTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0tHREJfS0RCICovCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggNjIwYjBiNC4uNmI0NGU1MiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZS1pc29sYXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBpbnQgc3lzY3RsX21lbW9yeV9mYWlsdXJlX2Vhcmx5X2tpbGwgX19yZWFkX21vc3RseSA9IDA7CkBAIC0xMjk2LDMgKzEyOTcsMzUgQEAKIAkvKiBrZWVwIGVsZXZhdGVkIHBhZ2UgY291bnQgZm9yIGJhZCBwYWdlICovCiAJcmV0dXJuIHJldDsKIH0KKworLyoKKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIGN1cnJlbnQtPm1tLT5tbWFwX3NlbSBpbiByZWFkIG1vZGUuCisgKi8KK2ludCBpc19od3BvaXNvbl9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlwZ2RfdCAqcGdkcDsKKwlwdWRfdCBwdWQsICpwdWRwOworCXBtZF90IHBtZCwgKnBtZHA7CisJcHRlX3QgcHRlLCAqcHRlcDsKKwlzd3BfZW50cnlfdCBlbnRyeTsKKworCXBnZHAgPSBwZ2Rfb2Zmc2V0KGN1cnJlbnQtPm1tLCBhZGRyKTsKKwlpZiAoIXBnZF9wcmVzZW50KCpwZ2RwKSkKKwkJcmV0dXJuIDA7CisJcHVkcCA9IHB1ZF9vZmZzZXQocGdkcCwgYWRkcik7CisJcHVkID0gKnB1ZHA7CisJaWYgKCFwdWRfcHJlc2VudChwdWQpIHx8IHB1ZF9sYXJnZShwdWQpKQorCQlyZXR1cm4gMDsKKwlwbWRwID0gcG1kX29mZnNldChwdWRwLCBhZGRyKTsKKwlwbWQgPSAqcG1kcDsKKwlpZiAoIXBtZF9wcmVzZW50KHBtZCkgfHwgcG1kX2xhcmdlKHBtZCkpCisJCXJldHVybiAwOworCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcChwbWRwLCBhZGRyKTsKKwlwdGUgPSAqcHRlcDsKKwlwdGVfdW5tYXAocHRlcCk7CisJaWYgKCFpc19zd2FwX3B0ZShwdGUpKQorCQlyZXR1cm4gMDsKKwllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkocHRlKTsKKwlyZXR1cm4gaXNfaHdwb2lzb25fZW50cnkoZW50cnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNfaHdwb2lzb25fYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDExOWI3Y2MuLmJkZTQyYzYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0xMzk0LDEwICsxMzk0LDIwIEBACiAJCQkJcmV0dXJuIGkgPyA6IC1FRkFVTFQ7CiAJCQl9CiAJCQlpZiAocGFnZXMpIHsKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZtX25vcm1hbF9wYWdlKGdhdGVfdm1hLCBzdGFydCwgKnB0ZSk7CisJCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2UoZ2F0ZV92bWEsIHN0YXJ0LCAqcHRlKTsKKwkJCQlpZiAoIXBhZ2UpIHsKKwkJCQkJaWYgKCEoZ3VwX2ZsYWdzICYgRk9MTF9EVU1QKSAmJgorCQkJCQkgICAgIGlzX3plcm9fcGZuKHB0ZV9wZm4oKnB0ZSkpKQorCQkJCQkJcGFnZSA9IHB0ZV9wYWdlKCpwdGUpOworCQkJCQllbHNlIHsKKwkJCQkJCXB0ZV91bm1hcChwdGUpOworCQkJCQkJcmV0dXJuIGkgPyA6IC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CiAJCQkJcGFnZXNbaV0gPSBwYWdlOwotCQkJCWlmIChwYWdlKQotCQkJCQlnZXRfcGFnZShwYWdlKTsKKwkJCQlnZXRfcGFnZShwYWdlKTsKIAkJCX0KIAkJCXB0ZV91bm1hcChwdGUpOwogCQkJaWYgKHZtYXMpCmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggNDU2ZWM2Zi4uZTM4ZTkxMCAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtMTczNCw4ICsxNzM0LDEwIEBACiAJCWdyb3cgPSAoYWRkcmVzcyAtIHZtYS0+dm1fZW5kKSA+PiBQQUdFX1NISUZUOwogCiAJCWVycm9yID0gYWNjdF9zdGFja19ncm93dGgodm1hLCBzaXplLCBncm93KTsKLQkJaWYgKCFlcnJvcikKKwkJaWYgKCFlcnJvcikgewogCQkJdm1hLT52bV9lbmQgPSBhZGRyZXNzOworCQkJcGVyZl9ldmVudF9tbWFwKHZtYSk7CisJCX0KIAl9CiAJYW5vbl92bWFfdW5sb2NrKHZtYSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTc4MSw2ICsxNzgzLDcgQEAKIAkJaWYgKCFlcnJvcikgewogCQkJdm1hLT52bV9zdGFydCA9IGFkZHJlc3M7CiAJCQl2bWEtPnZtX3Bnb2ZmIC09IGdyb3c7CisJCQlwZXJmX2V2ZW50X21tYXAodm1hKTsKIAkJfQogCX0KIAlhbm9uX3ZtYV91bmxvY2sodm1hKTsKQEAgLTIyMDgsNiArMjIxMSw3IEBACiAJdm1hLT52bV9wYWdlX3Byb3QgPSB2bV9nZXRfcGFnZV9wcm90KGZsYWdzKTsKIAl2bWFfbGluayhtbSwgdm1hLCBwcmV2LCByYl9saW5rLCByYl9wYXJlbnQpOwogb3V0OgorCXBlcmZfZXZlbnRfbW1hcCh2bWEpOwogCW1tLT50b3RhbF92bSArPSBsZW4gPj4gUEFHRV9TSElGVDsKIAlpZiAoZmxhZ3MgJiBWTV9MT0NLRUQpIHsKIAkJaWYgKCFtbG9ja192bWFfcGFnZXNfcmFuZ2Uodm1hLCBhZGRyLCBhZGRyICsgbGVuKSkKZGlmZiAtLWdpdCBhL21tL3BlcmNwdS5jIGIvbW0vcGVyY3B1LmMKaW5kZXggNjQ3MGU3Ny4uZTYxZGMyYyAxMDA2NDQKLS0tIGEvbW0vcGVyY3B1LmMKKysrIGIvbW0vcGVyY3B1LmMKQEAgLTI4Miw2ICsyODIsOSBAQAogICovCiBzdGF0aWMgdm9pZCAqcGNwdV9tZW1fYWxsb2Moc2l6ZV90IHNpemUpCiB7CisJaWYgKFdBUk5fT05fT05DRSghc2xhYl9pc19hdmFpbGFibGUoKSkpCisJCXJldHVybiBOVUxMOworCiAJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQogCQlyZXR1cm4ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAllbHNlIHsKQEAgLTM5MiwxMyArMzk1LDYgQEAKIAlvbGRfc2l6ZSA9IGNodW5rLT5tYXBfYWxsb2MgKiBzaXplb2YoY2h1bmstPm1hcFswXSk7CiAJbWVtY3B5KG5ldywgY2h1bmstPm1hcCwgb2xkX3NpemUpOwogCi0JLyoKLQkgKiBtYXBfYWxsb2MgPCBQQ1BVX0RGTF9NQVBfQUxMT0MgaW5kaWNhdGVzIHRoYXQgdGhlIGNodW5rIGlzCi0JICogb25lIG9mIHRoZSBmaXJzdCBjaHVua3MgYW5kIHN0aWxsIHVzaW5nIHN0YXRpYyBtYXAuCi0JICovCi0JaWYgKGNodW5rLT5tYXBfYWxsb2MgPj0gUENQVV9ERkxfTUFQX0FMTE9DKQotCQlvbGQgPSBjaHVuay0+bWFwOwotCiAJY2h1bmstPm1hcF9hbGxvYyA9IG5ld19hbGxvYzsKIAljaHVuay0+bWFwID0gbmV3OwogCW5ldyA9IE5VTEw7CkBAIC02MDQsNyArNjAwLDcgQEAKIHsKIAlzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bms7CiAKLQljaHVuayA9IGt6YWxsb2MocGNwdV9jaHVua19zdHJ1Y3Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJY2h1bmsgPSBwY3B1X21lbV9hbGxvYyhwY3B1X2NodW5rX3N0cnVjdF9zaXplKTsKIAlpZiAoIWNodW5rKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTAxMywyMCArMTAwOSw2IEBACiAJCXJldHVybiBwYWdlX3RvX3BoeXMocGNwdV9hZGRyX3RvX3BhZ2UoYWRkcikpOwogfQogCi1zdGF0aWMgaW5saW5lIHNpemVfdCBwY3B1X2NhbGNfZmNfc2l6ZXMoc2l6ZV90IHN0YXRpY19zaXplLAotCQkJCQlzaXplX3QgcmVzZXJ2ZWRfc2l6ZSwKLQkJCQkJc3NpemVfdCAqZHluX3NpemVwKQotewotCXNpemVfdCBzaXplX3N1bTsKLQotCXNpemVfc3VtID0gUEZOX0FMSUdOKHN0YXRpY19zaXplICsgcmVzZXJ2ZWRfc2l6ZSArCi0JCQkgICAgICgqZHluX3NpemVwID49IDAgPyAqZHluX3NpemVwIDogMCkpOwotCWlmICgqZHluX3NpemVwICE9IDApCi0JCSpkeW5fc2l6ZXAgPSBzaXplX3N1bSAtIHN0YXRpY19zaXplIC0gcmVzZXJ2ZWRfc2l6ZTsKLQotCXJldHVybiBzaXplX3N1bTsKLX0KLQogLyoqCiAgKiBwY3B1X2FsbG9jX2FsbG9jX2luZm8gLSBhbGxvY2F0ZSBwZXJjcHUgYWxsb2NhdGlvbiBpbmZvCiAgKiBAbnJfZ3JvdXBzOiB0aGUgbnVtYmVyIG9mIGdyb3VwcwpAQCAtMTA4NSw3ICsxMDY3LDcgQEAKIC8qKgogICogcGNwdV9idWlsZF9hbGxvY19pbmZvIC0gYnVpbGQgYWxsb2NfaW5mbyBjb25zaWRlcmluZyBkaXN0YW5jZXMgYmV0d2VlbiBDUFVzCiAgKiBAcmVzZXJ2ZWRfc2l6ZTogdGhlIHNpemUgb2YgcmVzZXJ2ZWQgcGVyY3B1IGFyZWEgaW4gYnl0ZXMKLSAqIEBkeW5fc2l6ZTogZnJlZSBzaXplIGZvciBkeW5hbWljIGFsbG9jYXRpb24gaW4gYnl0ZXMsIC0xIGZvciBhdXRvCisgKiBAZHluX3NpemU6IG1pbmltdW0gZnJlZSBzaXplIGZvciBkeW5hbWljIGFsbG9jYXRpb24gaW4gYnl0ZXMKICAqIEBhdG9tX3NpemU6IGFsbG9jYXRpb24gYXRvbSBzaXplCiAgKiBAY3B1X2Rpc3RhbmNlX2ZuOiBjYWxsYmFjayB0byBkZXRlcm1pbmUgZGlzdGFuY2UgYmV0d2VlbiBjcHVzLCBvcHRpb25hbAogICoKQEAgLTExMDMsOCArMTA4NSw4IEBACiAgKiBPbiBzdWNjZXNzLCBwb2ludGVyIHRvIHRoZSBuZXcgYWxsb2NhdGlvbl9pbmZvIGlzIHJldHVybmVkLiAgT24KICAqIGZhaWx1cmUsIEVSUl9QVFIgdmFsdWUgaXMgcmV0dXJuZWQuCiAgKi8KLXN0cnVjdCBwY3B1X2FsbG9jX2luZm8gKiBfX2luaXQgcGNwdV9idWlsZF9hbGxvY19pbmZvKAotCQkJCXNpemVfdCByZXNlcnZlZF9zaXplLCBzc2l6ZV90IGR5bl9zaXplLAorc3RhdGljIHN0cnVjdCBwY3B1X2FsbG9jX2luZm8gKiBfX2luaXQgcGNwdV9idWlsZF9hbGxvY19pbmZvKAorCQkJCXNpemVfdCByZXNlcnZlZF9zaXplLCBzaXplX3QgZHluX3NpemUsCiAJCQkJc2l6ZV90IGF0b21fc2l6ZSwKIAkJCQlwY3B1X2ZjX2NwdV9kaXN0YW5jZV9mbl90IGNwdV9kaXN0YW5jZV9mbikKIHsKQEAgLTExMjMsMTMgKzExMDUsMTcgQEAKIAltZW1zZXQoZ3JvdXBfbWFwLCAwLCBzaXplb2YoZ3JvdXBfbWFwKSk7CiAJbWVtc2V0KGdyb3VwX2NudCwgMCwgc2l6ZW9mKGdyb3VwX2NudCkpOwogCisJLyogY2FsY3VsYXRlIHNpemVfc3VtIGFuZCBlbnN1cmUgZHluX3NpemUgaXMgZW5vdWdoIGZvciBlYXJseSBhbGxvYyAqLworCXNpemVfc3VtID0gUEZOX0FMSUdOKHN0YXRpY19zaXplICsgcmVzZXJ2ZWRfc2l6ZSArCisJCQkgICAgbWF4X3Qoc2l6ZV90LCBkeW5fc2l6ZSwgUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0laRSkpOworCWR5bl9zaXplID0gc2l6ZV9zdW0gLSBzdGF0aWNfc2l6ZSAtIHJlc2VydmVkX3NpemU7CisKIAkvKgogCSAqIERldGVybWluZSBtaW5fdW5pdF9zaXplLCBhbGxvY19zaXplIGFuZCBtYXhfdXBhIHN1Y2ggdGhhdAogCSAqIGFsbG9jX3NpemUgaXMgbXVsdGlwbGUgb2YgYXRvbV9zaXplIGFuZCBpcyB0aGUgc21hbGxlc3QKIAkgKiB3aGljaCBjYW4gYWNjb21vZGF0ZSA0ayBhbGlnbmVkIHNlZ21lbnRzIHdoaWNoIGFyZSBlcXVhbCB0bwogCSAqIG9yIGxhcmdlciB0aGFuIG1pbl91bml0X3NpemUuCiAJICovCi0Jc2l6ZV9zdW0gPSBwY3B1X2NhbGNfZmNfc2l6ZXMoc3RhdGljX3NpemUsIHJlc2VydmVkX3NpemUsICZkeW5fc2l6ZSk7CiAJbWluX3VuaXRfc2l6ZSA9IG1heF90KHNpemVfdCwgc2l6ZV9zdW0sIFBDUFVfTUlOX1VOSVRfU0laRSk7CiAKIAlhbGxvY19zaXplID0gcm91bmR1cChtaW5fdW5pdF9zaXplLCBhdG9tX3NpemUpOwpAQCAtMTM1MCw3ICsxMzM2LDggQEAKIAkJCQkgIHZvaWQgKmJhc2VfYWRkcikKIHsKIAlzdGF0aWMgY2hhciBjcHVzX2J1Zls0MDk2XSBfX2luaXRkYXRhOwotCXN0YXRpYyBpbnQgc21hcFsyXSwgZG1hcFsyXTsKKwlzdGF0aWMgaW50IHNtYXBbUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0xPVFNdIF9faW5pdGRhdGE7CisJc3RhdGljIGludCBkbWFwW1BFUkNQVV9EWU5BTUlDX0VBUkxZX1NMT1RTXSBfX2luaXRkYXRhOwogCXNpemVfdCBkeW5fc2l6ZSA9IGFpLT5keW5fc2l6ZTsKIAlzaXplX3Qgc2l6ZV9zdW0gPSBhaS0+c3RhdGljX3NpemUgKyBhaS0+cmVzZXJ2ZWRfc2l6ZSArIGR5bl9zaXplOwogCXN0cnVjdCBwY3B1X2NodW5rICpzY2h1bmssICpkY2h1bmsgPSBOVUxMOwpAQCAtMTM3MywxNCArMTM2MCwxMyBAQAogfSB3aGlsZSAoMCkKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzbWFwKSA+PSBQQ1BVX0RGTF9NQVBfQUxMT0MgfHwKLQkJICAgICBBUlJBWV9TSVpFKGRtYXApID49IFBDUFVfREZMX01BUF9BTExPQyk7CiAJUENQVV9TRVRVUF9CVUdfT04oYWktPm5yX2dyb3VwcyA8PSAwKTsKIAlQQ1BVX1NFVFVQX0JVR19PTighYWktPnN0YXRpY19zaXplKTsKIAlQQ1BVX1NFVFVQX0JVR19PTighYmFzZV9hZGRyKTsKIAlQQ1BVX1NFVFVQX0JVR19PTihhaS0+dW5pdF9zaXplIDwgc2l6ZV9zdW0pOwogCVBDUFVfU0VUVVBfQlVHX09OKGFpLT51bml0X3NpemUgJiB+UEFHRV9NQVNLKTsKIAlQQ1BVX1NFVFVQX0JVR19PTihhaS0+dW5pdF9zaXplIDwgUENQVV9NSU5fVU5JVF9TSVpFKTsKKwlQQ1BVX1NFVFVQX0JVR19PTihhaS0+ZHluX3NpemUgPCBQRVJDUFVfRFlOQU1JQ19FQVJMWV9TSVpFKTsKIAlQQ1BVX1NFVFVQX0JVR19PTihwY3B1X3ZlcmlmeV9hbGxvY19pbmZvKGFpKSA8IDApOwogCiAJLyogcHJvY2VzcyBncm91cCBpbmZvcm1hdGlvbiBhbmQgYnVpbGQgY29uZmlnIHRhYmxlcyBhY2NvcmRpbmdseSAqLwpAQCAtMTUzMiw3ICsxNTE4LDcgQEAKIC8qKgogICogcGNwdV9lbWJlZF9maXJzdF9jaHVuayAtIGVtYmVkIHRoZSBmaXJzdCBwZXJjcHUgY2h1bmsgaW50byBib290bWVtCiAgKiBAcmVzZXJ2ZWRfc2l6ZTogdGhlIHNpemUgb2YgcmVzZXJ2ZWQgcGVyY3B1IGFyZWEgaW4gYnl0ZXMKLSAqIEBkeW5fc2l6ZTogZnJlZSBzaXplIGZvciBkeW5hbWljIGFsbG9jYXRpb24gaW4gYnl0ZXMsIC0xIGZvciBhdXRvCisgKiBAZHluX3NpemU6IG1pbmltdW0gZnJlZSBzaXplIGZvciBkeW5hbWljIGFsbG9jYXRpb24gaW4gYnl0ZXMKICAqIEBhdG9tX3NpemU6IGFsbG9jYXRpb24gYXRvbSBzaXplCiAgKiBAY3B1X2Rpc3RhbmNlX2ZuOiBjYWxsYmFjayB0byBkZXRlcm1pbmUgZGlzdGFuY2UgYmV0d2VlbiBjcHVzLCBvcHRpb25hbAogICogQGFsbG9jX2ZuOiBmdW5jdGlvbiB0byBhbGxvY2F0ZSBwZXJjcHUgcGFnZQpAQCAtMTU1MywxMCArMTUzOSw3IEBACiAgKiB2bWFsbG9jIHNwYWNlIGlzIG5vdCBvcmRlcnMgb2YgbWFnbml0dWRlIGxhcmdlciB0aGFuIGRpc3RhbmNlcwogICogYmV0d2VlbiBub2RlIG1lbW9yeSBhZGRyZXNzZXMgKGllLiAzMmJpdCBOVU1BIG1hY2hpbmVzKS4KICAqCi0gKiBXaGVuIEBkeW5fc2l6ZSBpcyBwb3NpdGl2ZSwgZHluYW1pYyBhcmVhIG1pZ2h0IGJlIGxhcmdlciB0aGFuCi0gKiBzcGVjaWZpZWQgdG8gZmlsbCBwYWdlIGFsaWdubWVudC4gIFdoZW4gQGR5bl9zaXplIGlzIGF1dG8sCi0gKiBAZHluX3NpemUgaXMganVzdCBiaWcgZW5vdWdoIHRvIGZpbGwgcGFnZSBhbGlnbm1lbnQgYWZ0ZXIgc3RhdGljCi0gKiBhbmQgcmVzZXJ2ZWQgYXJlYXMuCisgKiBAZHluX3NpemUgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIGR5bmFtaWMgYXJlYSBzaXplLgogICoKICAqIElmIHRoZSBuZWVkZWQgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gb3Igc3BlY2lmaWVkIHVuaXQKICAqIHNpemUsIHRoZSBsZWZ0b3ZlciBpcyByZXR1cm5lZCB1c2luZyBAZnJlZV9mbi4KQEAgLTE1NjQsNyArMTU0Nyw3IEBACiAgKiBSRVRVUk5TOgogICogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KICAqLwotaW50IF9faW5pdCBwY3B1X2VtYmVkX2ZpcnN0X2NodW5rKHNpemVfdCByZXNlcnZlZF9zaXplLCBzc2l6ZV90IGR5bl9zaXplLAoraW50IF9faW5pdCBwY3B1X2VtYmVkX2ZpcnN0X2NodW5rKHNpemVfdCByZXNlcnZlZF9zaXplLCBzaXplX3QgZHluX3NpemUsCiAJCQkJICBzaXplX3QgYXRvbV9zaXplLAogCQkJCSAgcGNwdV9mY19jcHVfZGlzdGFuY2VfZm5fdCBjcHVfZGlzdGFuY2VfZm4sCiAJCQkJICBwY3B1X2ZjX2FsbG9jX2ZuX3QgYWxsb2NfZm4sCkBAIC0xNjk1LDcgKzE2NzgsNyBAQAogCiAJc25wcmludGYocHNpemVfc3RyLCBzaXplb2YocHNpemVfc3RyKSwgIiVsdUsiLCBQQUdFX1NJWkUgPj4gMTApOwogCi0JYWkgPSBwY3B1X2J1aWxkX2FsbG9jX2luZm8ocmVzZXJ2ZWRfc2l6ZSwgLTEsIFBBR0VfU0laRSwgTlVMTCk7CisJYWkgPSBwY3B1X2J1aWxkX2FsbG9jX2luZm8ocmVzZXJ2ZWRfc2l6ZSwgMCwgUEFHRV9TSVpFLCBOVUxMKTsKIAlpZiAoSVNfRVJSKGFpKSkKIAkJcmV0dXJuIFBUUl9FUlIoYWkpOwogCUJVR19PTihhaS0+bnJfZ3JvdXBzICE9IDEpOwpAQCAtMTgyMSwzICsxODA0LDMzIEBACiAJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IGRlbHRhICsgcGNwdV91bml0X29mZnNldHNbY3B1XTsKIH0KICNlbmRpZiAvKiBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEgKi8KKworLyoKKyAqIEZpcnN0IGFuZCByZXNlcnZlZCBjaHVua3MgYXJlIGluaXRpYWxpemVkIHdpdGggdGVtcG9yYXJ5IGFsbG9jYXRpb24KKyAqIG1hcCBpbiBpbml0ZGF0YSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYmVmb3JlIHNsYWIgaXMgb25saW5lLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgc2xhYiBpcyBicm91Z2h0IHVwIGFuZCByZXBsYWNlcyB0aG9zZQorICogd2l0aCBwcm9wZXJseSBhbGxvY2F0ZWQgbWFwcy4KKyAqLwordm9pZCBfX2luaXQgcGVyY3B1X2luaXRfbGF0ZSh2b2lkKQoreworCXN0cnVjdCBwY3B1X2NodW5rICp0YXJnZXRfY2h1bmtzW10gPQorCQl7IHBjcHVfZmlyc3RfY2h1bmssIHBjcHVfcmVzZXJ2ZWRfY2h1bmssIE5VTEwgfTsKKwlzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IChjaHVuayA9IHRhcmdldF9jaHVua3NbaV0pOyBpKyspIHsKKwkJaW50ICptYXA7CisJCWNvbnN0IHNpemVfdCBzaXplID0gUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0xPVFMgKiBzaXplb2YobWFwWzBdKTsKKworCQlCVUlMRF9CVUdfT04oc2l6ZSA+IFBBR0VfU0laRSk7CisKKwkJbWFwID0gcGNwdV9tZW1fYWxsb2Moc2l6ZSk7CisJCUJVR19PTighbWFwKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNwdV9sb2NrLCBmbGFncyk7CisJCW1lbWNweShtYXAsIGNodW5rLT5tYXAsIHNpemUpOworCQljaHVuay0+bWFwID0gbWFwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3B1X2xvY2ssIGZsYWdzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggZTQ5ZjhmNC4uNzM2ZTQ5NyAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtMTAyLDcgKzEwMiw2IEBACiAjaW5jbHVkZQk8bGludXgvY3B1Lmg+CiAjaW5jbHVkZQk8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZQk8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZQk8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZQk8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlCTxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlCTxsaW51eC91YWNjZXNzLmg+CkBAIC04NjEsNyArODYwLDcgQEAKIAkgKi8KIAlpZiAoa2V2ZW50ZF91cCgpICYmIHJlYXBfd29yay0+d29yay5mdW5jID09IE5VTEwpIHsKIAkJaW5pdF9yZWFwX25vZGUoY3B1KTsKLQkJSU5JVF9ERUxBWUVEX1dPUksocmVhcF93b3JrLCBjYWNoZV9yZWFwKTsKKwkJSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRShyZWFwX3dvcmssIGNhY2hlX3JlYXApOwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oY3B1LCByZWFwX3dvcmssCiAJCQkJCV9fcm91bmRfamlmZmllc19yZWxhdGl2ZShIWiwgY3B1KSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IDIzNjMxZTIuLmQ1ODIxNzEgMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTY2LDggKzY2LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rbWVtLmg+CisKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIC8qCkBAIC0zOTQsNiArMzk2LDcgQEAKIAlzbG9iX3QgKnByZXYsICpuZXh0LCAqYiA9IChzbG9iX3QgKilibG9jazsKIAlzbG9iaWR4X3QgdW5pdHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzbG9iX2xpc3Q7CiAKIAlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihibG9jaykpKQogCQlyZXR1cm47CkBAIC00MjIsNyArNDI1LDEzIEBACiAJCXNldF9zbG9iKGIsIHVuaXRzLAogCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGIgKwogCQkJCQlTTE9CX1VOSVRTKFBBR0VfU0laRSkpICYgUEFHRV9NQVNLKSk7Ci0JCXNldF9zbG9iX3BhZ2VfZnJlZShzcCwgJmZyZWVfc2xvYl9zbWFsbCk7CisJCWlmIChzaXplIDwgU0xPQl9CUkVBSzEpCisJCQlzbG9iX2xpc3QgPSAmZnJlZV9zbG9iX3NtYWxsOworCQllbHNlIGlmIChzaXplIDwgU0xPQl9CUkVBSzIpCisJCQlzbG9iX2xpc3QgPSAmZnJlZV9zbG9iX21lZGl1bTsKKwkJZWxzZQorCQkJc2xvYl9saXN0ID0gJmZyZWVfc2xvYl9sYXJnZTsKKwkJc2V0X3Nsb2JfcGFnZV9mcmVlKHNwLCBzbG9iX2xpc3QpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTYzOSw3ICs2NDgsNiBAQAogCWlmICh1bmxpa2VseShjLT5mbGFncyAmIFNMQUJfREVTVFJPWV9CWV9SQ1UpKSB7CiAJCXN0cnVjdCBzbG9iX3JjdSAqc2xvYl9yY3U7CiAJCXNsb2JfcmN1ID0gYiArIChjLT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBzbG9iX3JjdSkpOwotCQlJTklUX1JDVV9IRUFEKCZzbG9iX3JjdS0+aGVhZCk7CiAJCXNsb2JfcmN1LT5zaXplID0gYy0+c2l6ZTsKIAkJY2FsbF9yY3UoJnNsb2JfcmN1LT5oZWFkLCBrbWVtX3JjdV9mcmVlKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDU3OGY2OGYuLjEzZmZmZTEgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CkBAIC0xMDcsMTEgKzEwNiwxNyBAQAogICogCQkJdGhlIGZhc3QgcGF0aCBhbmQgZGlzYWJsZXMgbG9ja2xlc3MgZnJlZWxpc3RzLgogICovCiAKKyNkZWZpbmUgU0xBQl9ERUJVR19GTEFHUyAoU0xBQl9SRURfWk9ORSB8IFNMQUJfUE9JU09OIHwgU0xBQl9TVE9SRV9VU0VSIHwgXAorCQlTTEFCX1RSQUNFIHwgU0xBQl9ERUJVR19GUkVFKQorCitzdGF0aWMgaW5saW5lIGludCBrbWVtX2NhY2hlX2RlYnVnKHN0cnVjdCBrbWVtX2NhY2hlICpzKQorewogI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCi0jZGVmaW5lIFNMQUJERUJVRyAxCisJcmV0dXJuIHVubGlrZWx5KHMtPmZsYWdzICYgU0xBQl9ERUJVR19GTEFHUyk7CiAjZWxzZQotI2RlZmluZSBTTEFCREVCVUcgMAorCXJldHVybiAwOwogI2VuZGlmCit9CiAKIC8qCiAgKiBJc3N1ZXMgc3RpbGwgdG8gYmUgcmVzb2x2ZWQ6CkBAIC0xNjIsOCArMTY3LDggQEAKICNkZWZpbmUgTUFYX09CSlNfUEVSX1BBR0UJNjU1MzUgLyogc2luY2UgcGFnZS5vYmplY3RzIGlzIHUxNiAqLwogCiAvKiBJbnRlcm5hbCBTTFVCIGZsYWdzICovCi0jZGVmaW5lIF9fT0JKRUNUX1BPSVNPTgkJMHg4MDAwMDAwMCAvKiBQb2lzb24gb2JqZWN0ICovCi0jZGVmaW5lIF9fU1lTRlNfQUREX0RFRkVSUkVECTB4NDAwMDAwMDAgLyogTm90IHlldCB2aXNpYmxlIHZpYSBzeXNmcyAqLworI2RlZmluZSBfX09CSkVDVF9QT0lTT04JCTB4ODAwMDAwMDBVTCAvKiBQb2lzb24gb2JqZWN0ICovCisjZGVmaW5lIF9fU1lTRlNfQUREX0RFRkVSUkVECTB4NDAwMDAwMDBVTCAvKiBOb3QgeWV0IHZpc2libGUgdmlhIHN5c2ZzICovCiAKIHN0YXRpYyBpbnQga21lbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlKTsKIApAQCAtMTA3Myw3ICsxMDc4LDcgQEAKIAogCWZsYWdzIHw9IF9fR0ZQX05PVFJBQ0s7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCiAJCXJldHVybiBhbGxvY19wYWdlcyhmbGFncywgb3JkZXIpOwogCWVsc2UKIAkJcmV0dXJuIGFsbG9jX3BhZ2VzX2V4YWN0X25vZGUobm9kZSwgZmxhZ3MsIG9yZGVyKTsKQEAgLTExNTcsOSArMTE2Miw2IEBACiAJaW5jX3NsYWJzX25vZGUocywgcGFnZV90b19uaWQocGFnZSksIHBhZ2UtPm9iamVjdHMpOwogCXBhZ2UtPnNsYWIgPSBzOwogCXBhZ2UtPmZsYWdzIHw9IDEgPDwgUEdfc2xhYjsKLQlpZiAocy0+ZmxhZ3MgJiAoU0xBQl9ERUJVR19GUkVFIHwgU0xBQl9SRURfWk9ORSB8IFNMQUJfUE9JU09OIHwKLQkJCVNMQUJfU1RPUkVfVVNFUiB8IFNMQUJfVFJBQ0UpKQotCQlfX1NldFBhZ2VTbHViRGVidWcocGFnZSk7CiAKIAlzdGFydCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIApAQCAtMTE4NiwxNCArMTE4OCwxMyBAQAogCWludCBvcmRlciA9IGNvbXBvdW5kX29yZGVyKHBhZ2UpOwogCWludCBwYWdlcyA9IDEgPDwgb3JkZXI7CiAKLQlpZiAodW5saWtlbHkoU0xBQkRFQlVHICYmIFBhZ2VTbHViRGVidWcocGFnZSkpKSB7CisJaWYgKGttZW1fY2FjaGVfZGVidWcocykpIHsKIAkJdm9pZCAqcDsKIAogCQlzbGFiX3BhZF9jaGVjayhzLCBwYWdlKTsKIAkJZm9yX2VhY2hfb2JqZWN0KHAsIHMsIHBhZ2VfYWRkcmVzcyhwYWdlKSwKIAkJCQkJCXBhZ2UtPm9iamVjdHMpCiAJCQljaGVja19vYmplY3QocywgcGFnZSwgcCwgMCk7Ci0JCV9fQ2xlYXJQYWdlU2x1YkRlYnVnKHBhZ2UpOwogCX0KIAogCWttZW1jaGVja19mcmVlX3NoYWRvdyhwYWdlLCBjb21wb3VuZF9vcmRlcihwYWdlKSk7CkBAIC0xMzg3LDEwICsxMzg4LDEwIEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKmdldF9wYXJ0aWFsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IHNlYXJjaG5vZGUgPSAobm9kZSA9PSAtMSkgPyBudW1hX25vZGVfaWQoKSA6IG5vZGU7CisJaW50IHNlYXJjaG5vZGUgPSAobm9kZSA9PSBOVU1BX05PX05PREUpID8gbnVtYV9ub2RlX2lkKCkgOiBub2RlOwogCiAJcGFnZSA9IGdldF9wYXJ0aWFsX25vZGUoZ2V0X25vZGUocywgc2VhcmNobm9kZSkpOwotCWlmIChwYWdlIHx8IChmbGFncyAmIF9fR0ZQX1RISVNOT0RFKSkKKwlpZiAocGFnZSB8fCBub2RlICE9IC0xKQogCQlyZXR1cm4gcGFnZTsKIAogCXJldHVybiBnZXRfYW55X3BhcnRpYWwocywgZmxhZ3MpOwpAQCAtMTQxNSw4ICsxNDE2LDcgQEAKIAkJCXN0YXQocywgdGFpbCA/IERFQUNUSVZBVEVfVE9fVEFJTCA6IERFQUNUSVZBVEVfVE9fSEVBRCk7CiAJCX0gZWxzZSB7CiAJCQlzdGF0KHMsIERFQUNUSVZBVEVfRlVMTCk7Ci0JCQlpZiAoU0xBQkRFQlVHICYmIFBhZ2VTbHViRGVidWcocGFnZSkgJiYKLQkJCQkJCShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCisJCQlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSAmJiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQogCQkJCWFkZF9mdWxsKG4sIHBhZ2UpOwogCQl9CiAJCXNsYWJfdW5sb2NrKHBhZ2UpOwpAQCAtMTUxNSw3ICsxNTE1LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG5vZGVfbWF0Y2goc3RydWN0IGttZW1fY2FjaGVfY3B1ICpjLCBpbnQgbm9kZSkKIHsKICNpZmRlZiBDT05GSUdfTlVNQQotCWlmIChub2RlICE9IC0xICYmIGMtPm5vZGUgIT0gbm9kZSkKKwlpZiAobm9kZSAhPSBOVU1BX05PX05PREUgJiYgYy0+bm9kZSAhPSBub2RlKQogCQlyZXR1cm4gMDsKICNlbmRpZgogCXJldHVybiAxOwpAQCAtMTYyNCw3ICsxNjI0LDcgQEAKIAlvYmplY3QgPSBjLT5wYWdlLT5mcmVlbGlzdDsKIAlpZiAodW5saWtlbHkoIW9iamVjdCkpCiAJCWdvdG8gYW5vdGhlcl9zbGFiOwotCWlmICh1bmxpa2VseShTTEFCREVCVUcgJiYgUGFnZVNsdWJEZWJ1ZyhjLT5wYWdlKSkpCisJaWYgKGttZW1fY2FjaGVfZGVidWcocykpCiAJCWdvdG8gZGVidWc7CiAKIAljLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihzLCBvYmplY3QpOwpAQCAtMTcyNyw3ICsxNzI3LDcgQEAKIAogdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MpCiB7Ci0Jdm9pZCAqcmV0ID0gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgLTEsIF9SRVRfSVBfKTsKKwl2b2lkICpyZXQgPSBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBOVU1BX05PX05PREUsIF9SRVRfSVBfKTsKIAogCXRyYWNlX2ttZW1fY2FjaGVfYWxsb2MoX1JFVF9JUF8sIHJldCwgcy0+b2Jqc2l6ZSwgcy0+c2l6ZSwgZ2ZwZmxhZ3MpOwogCkBAIC0xNzM4LDcgKzE3MzgsNyBAQAogI2lmZGVmIENPTkZJR19UUkFDSU5HCiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzKQogewotCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCAtMSwgX1JFVF9JUF8pOworCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBOVU1BX05PX05PREUsIF9SRVRfSVBfKTsKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKTsKICNlbmRpZgpAQCAtMTc4Myw3ICsxNzgzLDcgQEAKIAlzdGF0KHMsIEZSRUVfU0xPV1BBVEgpOwogCXNsYWJfbG9jayhwYWdlKTsKIAotCWlmICh1bmxpa2VseShTTEFCREVCVUcgJiYgUGFnZVNsdWJEZWJ1ZyhwYWdlKSkpCisJaWYgKGttZW1fY2FjaGVfZGVidWcocykpCiAJCWdvdG8gZGVidWc7CiAKIGNoZWNrc19vazoKQEAgLTI0OTAsNyArMjQ5MCw2IEBACiAJcy0+cmVmY291bnQtLTsKIAlpZiAoIXMtPnJlZmNvdW50KSB7CiAJCWxpc3RfZGVsKCZzLT5saXN0KTsKLQkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCWlmIChrbWVtX2NhY2hlX2Nsb3NlKHMpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNMVUIgJXM6ICVzIGNhbGxlZCBmb3IgY2FjaGUgdGhhdCAiCiAJCQkJInN0aWxsIGhhcyBvYmplY3RzLlxuIiwgcy0+bmFtZSwgX19mdW5jX18pOwpAQCAtMjQ5OSw4ICsyNDk4LDggQEAKIAkJaWYgKHMtPmZsYWdzICYgU0xBQl9ERVNUUk9ZX0JZX1JDVSkKIAkJCXJjdV9iYXJyaWVyKCk7CiAJCXN5c2ZzX3NsYWJfcmVtb3ZlKHMpOwotCX0gZWxzZQotCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKKwl9CisJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfZGVzdHJveSk7CiAKQEAgLTI3MjgsNyArMjcyNyw3IEBACiAJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIocykpKQogCQlyZXR1cm4gczsKIAotCXJldCA9IHNsYWJfYWxsb2MocywgZmxhZ3MsIC0xLCBfUkVUX0lQXyk7CisJcmV0ID0gc2xhYl9hbGxvYyhzLCBmbGFncywgTlVNQV9OT19OT0RFLCBfUkVUX0lQXyk7CiAKIAl0cmFjZV9rbWFsbG9jKF9SRVRfSVBfLCByZXQsIHNpemUsIHMtPnNpemUsIGZsYWdzKTsKIApAQCAtMzExOCw5ICszMTE3LDEyIEBACiAJc2xhYl9zdGF0ZSA9IFVQOwogCiAJLyogUHJvdmlkZSB0aGUgY29ycmVjdCBrbWFsbG9jIG5hbWVzIG5vdyB0aGF0IHRoZSBjYWNoZXMgYXJlIHVwICovCi0JZm9yIChpID0gS01BTExPQ19TSElGVF9MT1c7IGkgPCBTTFVCX1BBR0VfU0hJRlQ7IGkrKykKLQkJa21hbGxvY19jYWNoZXNbaV0uIG5hbWUgPQotCQkJa2FzcHJpbnRmKEdGUF9OT1dBSVQsICJrbWFsbG9jLSVkIiwgMSA8PCBpKTsKKwlmb3IgKGkgPSBLTUFMTE9DX1NISUZUX0xPVzsgaSA8IFNMVUJfUEFHRV9TSElGVDsgaSsrKSB7CisJCWNoYXIgKnMgPSBrYXNwcmludGYoR0ZQX05PV0FJVCwgImttYWxsb2MtJWQiLCAxIDw8IGkpOworCisJCUJVR19PTighcyk7CisJCWttYWxsb2NfY2FjaGVzW2ldLm5hbWUgPSBzOworCX0KIAogI2lmZGVmIENPTkZJR19TTVAKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNsYWJfbm90aWZpZXIpOwpAQCAtMzIyMywxNCArMzIyNSwxMiBAQAogCQkgKi8KIAkJcy0+b2Jqc2l6ZSA9IG1heChzLT5vYmpzaXplLCAoaW50KXNpemUpOwogCQlzLT5pbnVzZSA9IG1heF90KGludCwgcy0+aW51c2UsIEFMSUdOKHNpemUsIHNpemVvZih2b2lkICopKSk7Ci0JCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCiAJCWlmIChzeXNmc19zbGFiX2FsaWFzKHMsIG5hbWUpKSB7Ci0JCQlkb3duX3dyaXRlKCZzbHViX2xvY2spOwogCQkJcy0+cmVmY291bnQtLTsKLQkJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQkJZ290byBlcnI7CiAJCX0KKwkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCXJldHVybiBzOwogCX0KIApAQCAtMzIzOSwxNCArMzIzOSwxMiBAQAogCQlpZiAoa21lbV9jYWNoZV9vcGVuKHMsIEdGUF9LRVJORUwsIG5hbWUsCiAJCQkJc2l6ZSwgYWxpZ24sIGZsYWdzLCBjdG9yKSkgewogCQkJbGlzdF9hZGQoJnMtPmxpc3QsICZzbGFiX2NhY2hlcyk7Ci0JCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAkJCWlmIChzeXNmc19zbGFiX2FkZChzKSkgewotCQkJCWRvd25fd3JpdGUoJnNsdWJfbG9jayk7CiAJCQkJbGlzdF9kZWwoJnMtPmxpc3QpOwotCQkJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQkJCWtmcmVlKHMpOwogCQkJCWdvdG8gZXJyOwogCQkJfQorCQkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCQlyZXR1cm4gczsKIAkJfQogCQlrZnJlZShzKTsKQEAgLTMzMTIsNyArMzMxMCw3IEBACiAJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIocykpKQogCQlyZXR1cm4gczsKIAotCXJldCA9IHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIC0xLCBjYWxsZXIpOworCXJldCA9IHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIE5VTUFfTk9fTk9ERSwgY2FsbGVyKTsKIAogCS8qIEhvbm9yIHRoZSBjYWxsIHNpdGUgcG9pbnRlciB3ZSByZWNpZXZlZC4gKi8KIAl0cmFjZV9rbWFsbG9jKGNhbGxlciwgcmV0LCBzaXplLCBzLT5zaXplLCBnZnBmbGFncyk7CkBAIC0zMzk1LDE2ICszMzkzLDYgQEAKIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU0xVQiAlczogU2tpcHBlZCBidXN5IHNsYWIgMHglcFxuIiwKIAkJCXMtPm5hbWUsIHBhZ2UpOwotCi0JaWYgKHMtPmZsYWdzICYgREVCVUdfREVGQVVMVF9GTEFHUykgewotCQlpZiAoIVBhZ2VTbHViRGVidWcocGFnZSkpCi0JCQlwcmludGsoS0VSTl9FUlIgIlNMVUIgJXM6IFNsdWJEZWJ1ZyBub3Qgc2V0ICIKLQkJCQkib24gc2xhYiAweCVwXG4iLCBzLT5uYW1lLCBwYWdlKTsKLQl9IGVsc2UgewotCQlpZiAoUGFnZVNsdWJEZWJ1ZyhwYWdlKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiU0xVQiAlczogU2x1YkRlYnVnIHNldCBvbiAiCi0JCQkJInNsYWIgMHglcFxuIiwgcy0+bmFtZSwgcGFnZSk7Ci0JfQogfQogCiBzdGF0aWMgaW50IHZhbGlkYXRlX3NsYWJfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKQEAgLTQ1MDQsNiArNDQ5MiwxMyBAQAogCiBzdGF0aWMgdm9pZCBzeXNmc19zbGFiX3JlbW92ZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKIHsKKwlpZiAoc2xhYl9zdGF0ZSA8IFNZU0ZTKQorCQkvKgorCQkgKiBTeXNmcyBoYXMgbm90IGJlZW4gc2V0dXAgeWV0IHNvIG5vIG5lZWQgdG8gcmVtb3ZlIHRoZQorCQkgKiBjYWNoZSBmcm9tIHN5c2ZzLgorCQkgKi8KKwkJcmV0dXJuOworCiAJa29iamVjdF91ZXZlbnQoJnMtPmtvYmosIEtPQkpfUkVNT1ZFKTsKIAlrb2JqZWN0X2RlbCgmcy0+a29iaik7CiAJa29iamVjdF9wdXQoJnMtPmtvYmopOwpAQCAtNDU0OSw4ICs0NTQ0LDExIEBACiAJc3RydWN0IGttZW1fY2FjaGUgKnM7CiAJaW50IGVycjsKIAorCWRvd25fd3JpdGUoJnNsdWJfbG9jayk7CisKIAlzbGFiX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJzbGFiIiwgJnNsYWJfdWV2ZW50X29wcywga2VybmVsX2tvYmopOwogCWlmICghc2xhYl9rc2V0KSB7CisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCByZWdpc3RlciBzbGFiIHN1YnN5c3RlbS5cbiIpOwogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CkBAIC00NTc1LDYgKzQ1NzMsNyBAQAogCQlrZnJlZShhbCk7CiAJfQogCisJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJcmVzaWxpZW5jeV90ZXN0KCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggYWUwMDc0Ni4uYjdlMzE0YiAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtMjQwMyw3ICsyNDAzLDcgQEAKIAkJc2VxX3ByaW50ZihtLCAiIHBhZ2VzPSVkIiwgdi0+bnJfcGFnZXMpOwogCiAJaWYgKHYtPnBoeXNfYWRkcikKLQkJc2VxX3ByaW50ZihtLCAiIHBoeXM9JWx4Iiwgdi0+cGh5c19hZGRyKTsKKwkJc2VxX3ByaW50ZihtLCAiIHBoeXM9JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpdi0+cGh5c19hZGRyKTsKIAogCWlmICh2LT5mbGFncyAmIFZNX0lPUkVNQVApCiAJCXNlcV9wcmludGYobSwgIiBpb3JlbWFwIik7CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbi5jIGIvbmV0LzgwMjFxL3ZsYW4uYwppbmRleCAzYzFjOGMxLi5hMmFkMTUyIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbi5jCisrKyBiL25ldC84MDIxcS92bGFuLmMKQEAgLTE1NSw5ICsxNTUsMTAgQEAKIAlCVUdfT04oIWdycCk7CiAKIAkvKiBUYWtlIGl0IG91dCBvZiBvdXIgb3duIHN0cnVjdHVyZXMsIGJ1dCBiZSBzdXJlIHRvIGludGVybG9jayB3aXRoCi0JICogSFcgYWNjZWxlcmF0aW5nIGRldmljZXMgb3IgU1cgdmxhbiBpbnB1dCBwYWNrZXQgcHJvY2Vzc2luZy4KKwkgKiBIVyBhY2NlbGVyYXRpbmcgZGV2aWNlcyBvciBTVyB2bGFuIGlucHV0IHBhY2tldCBwcm9jZXNzaW5nIGlmCisJICogVkxBTiBpcyBub3QgMCAobGVhdmUgaXQgdGhlcmUgZm9yIDgwMi4xcCkuCiAJICovCi0JaWYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpCisJaWYgKHZsYW5faWQgJiYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpKQogCQlvcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKHJlYWxfZGV2LCB2bGFuX2lkKTsKIAogCWdycC0+bnJfdmxhbnMtLTsKQEAgLTQxOSw2ICs0MjAsMTQgQEAKIAlpZiAoaXNfdmxhbl9kZXYoZGV2KSkKIAkJX192bGFuX2RldmljZV9ldmVudChkZXYsIGV2ZW50KTsKIAorCWlmICgoZXZlbnQgPT0gTkVUREVWX1VQKSAmJgorCSAgICAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCisJICAgIGRldi0+bmV0ZGV2X29wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZCkgeworCQlwcl9pbmZvKCI4MDIxcTogYWRkaW5nIFZMQU4gMCB0byBIVyBmaWx0ZXIgb24gZGV2aWNlICVzXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkKGRldiwgMCk7CisJfQorCiAJZ3JwID0gX192bGFuX2ZpbmRfZ3JvdXAoZGV2KTsKIAlpZiAoIWdycCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbi5oIGIvbmV0LzgwMjFxL3ZsYW4uaAppbmRleCA2YWJkY2FjLi44ZDk1MDNhIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbi5oCisrKyBiL25ldC84MDIxcS92bGFuLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9fQkVOX1ZMQU5fODAyXzFRX0lOQ19fCiAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvdTY0X3N0YXRzX3N5bmMuaD4KIAogCiAvKioKQEAgLTIxLDE0ICsyMiwxNiBAQAogICoJc3RydWN0IHZsYW5fcnhfc3RhdHMgLSBWTEFOIHBlcmNwdSByeCBzdGF0cwogICoJQHJ4X3BhY2tldHM6IG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzCiAgKglAcnhfYnl0ZXM6IG51bWJlciBvZiByZWNlaXZlZCBieXRlcwotICoJQG11bHRpY2FzdDogbnVtYmVyIG9mIHJlY2VpdmVkIG11bHRpY2FzdCBwYWNrZXRzCisgKglAcnhfbXVsdGljYXN0OiBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IHBhY2tldHMKKyAqCUBzeW5jcDogc3luY2hyb25pemF0aW9uIHBvaW50IGZvciA2NGJpdCBjb3VudGVycwogICoJQHJ4X2Vycm9yczogbnVtYmVyIG9mIGVycm9ycwogICovCiBzdHJ1Y3Qgdmxhbl9yeF9zdGF0cyB7Ci0JdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOwotCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyBtdWx0aWNhc3Q7Ci0JdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CisJdTY0CQkJcnhfcGFja2V0czsKKwl1NjQJCQlyeF9ieXRlczsKKwl1NjQJCQlyeF9tdWx0aWNhc3Q7CisJc3RydWN0IHU2NF9zdGF0c19zeW5jCXN5bmNwOworCXVuc2lnbmVkIGxvbmcJCXJ4X2Vycm9yczsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCmluZGV4IDUwZjU4ZjVmLi4wMWRkYjA0IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCkBAIC04LDYgKzgsOSBAQAogaW50IF9fdmxhbl9od2FjY2VsX3J4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCiAJCSAgICAgIHUxNiB2bGFuX3RjaSwgaW50IHBvbGxpbmcpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2OworCXUxNiB2bGFuX2lkOworCiAJaWYgKG5ldHBvbGxfcngoc2tiKSkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCkBAIC0xNiw5ICsxOSwxMiBAQAogCiAJc2tiLT5za2JfaWlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHZsYW5fdGNpKTsKLQlza2ItPmRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5fdGNpICYgVkxBTl9WSURfTUFTSyk7CisJdmxhbl9pZCA9IHZsYW5fdGNpICYgVkxBTl9WSURfTUFTSzsKKwl2bGFuX2RldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5faWQpOwogCi0JaWYgKCFza2ItPmRldikKKwlpZiAodmxhbl9kZXYpCisJCXNrYi0+ZGV2ID0gdmxhbl9kZXY7CisJZWxzZSBpZiAodmxhbl9pZCkKIAkJZ290byBkcm9wOwogCiAJcmV0dXJuIChwb2xsaW5nID8gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKSA6IG5ldGlmX3J4KHNrYikpOwpAQCAtNDEsOSArNDcsOSBAQAogCXNrYi0+cHJpb3JpdHkgPSB2bGFuX2dldF9pbmdyZXNzX3ByaW9yaXR5KGRldiwgc2tiLT52bGFuX3RjaSk7CiAJc2tiLT52bGFuX3RjaSA9IDA7CiAKLQlyeF9zdGF0cyA9IHBlcl9jcHVfcHRyKHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9yeF9zdGF0cywKLQkJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXJ4X3N0YXRzID0gdGhpc19jcHVfcHRyKHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9yeF9zdGF0cyk7CiAKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9zdGF0cy0+c3luY3ApOwogCXJ4X3N0YXRzLT5yeF9wYWNrZXRzKys7CiAJcnhfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCkBAIC01MSw3ICs1Nyw3IEBACiAJY2FzZSBQQUNLRVRfQlJPQURDQVNUOgogCQlicmVhazsKIAljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6Ci0JCXJ4X3N0YXRzLT5tdWx0aWNhc3QrKzsKKwkJcnhfc3RhdHMtPnJ4X211bHRpY2FzdCsrOwogCQlicmVhazsKIAljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6CiAJCS8qIE91ciBsb3dlciBsYXllciB0aGlua3MgdGhpcyBpcyBub3QgbG9jYWwsIGxldCdzIG1ha2Ugc3VyZS4KQEAgLTYyLDYgKzY4LDcgQEAKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAkJYnJlYWs7CiAJfQorCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9zdGF0cy0+c3luY3ApOwogCXJldHVybiAwOwogfQogCkBAIC04MiwxNSArODksMjAgQEAKIAkJdW5zaWduZWQgaW50IHZsYW5fdGNpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBza19idWZmICpwOworCXN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldjsKKwl1MTYgdmxhbl9pZDsKIAogCWlmIChza2JfYm9uZF9zaG91bGRfZHJvcChza2IsIEFDQ0VTU19PTkNFKHNrYi0+ZGV2LT5tYXN0ZXIpKSkKIAkJc2tiLT5kZWxpdmVyX25vX3djYXJkID0gMTsKIAogCXNrYi0+c2tiX2lpZiA9IHNrYi0+ZGV2LT5pZmluZGV4OwogCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RjaSk7Ci0Jc2tiLT5kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuX3RjaSAmIFZMQU5fVklEX01BU0spOworCXZsYW5faWQgPSB2bGFuX3RjaSAmIFZMQU5fVklEX01BU0s7CisJdmxhbl9kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuX2lkKTsKIAotCWlmICghc2tiLT5kZXYpCisJaWYgKHZsYW5fZGV2KQorCQlza2ItPmRldiA9IHZsYW5fZGV2OworCWVsc2UgaWYgKHZsYW5faWQpCiAJCWdvdG8gZHJvcDsKIAogCWZvciAocCA9IG5hcGktPmdyb19saXN0OyBwOyBwID0gcC0+bmV4dCkgewpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCA1Mjk4NDI2Li4zZDU5YzliIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtMTQyLDYgKzE0Miw3IEBACiB7CiAJc3RydWN0IHZsYW5faGRyICp2aGRyOwogCXN0cnVjdCB2bGFuX3J4X3N0YXRzICpyeF9zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXY7CiAJdTE2IHZsYW5faWQ7CiAJdTE2IHZsYW5fdGNpOwogCkBAIC0xNTcsNTMgKzE1OCw3MSBAQAogCXZsYW5faWQgPSB2bGFuX3RjaSAmIFZMQU5fVklEX01BU0s7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc2tiLT5kZXYgPSBfX2ZpbmRfdmxhbl9kZXYoZGV2LCB2bGFuX2lkKTsKLQlpZiAoIXNrYi0+ZGV2KSB7Ci0JCXByX2RlYnVnKCIlczogRVJST1I6IE5vIG5ldF9kZXZpY2UgZm9yIFZJRDogJXUgb24gZGV2OiAlc1xuIiwKLQkJCSBfX2Z1bmNfXywgdmxhbl9pZCwgZGV2LT5uYW1lKTsKLQkJZ290byBlcnJfdW5sb2NrOwotCX0KKwl2bGFuX2RldiA9IF9fZmluZF92bGFuX2RldihkZXYsIHZsYW5faWQpOwogCi0Jcnhfc3RhdHMgPSBwZXJfY3B1X3B0cih2bGFuX2Rldl9pbmZvKHNrYi0+ZGV2KS0+dmxhbl9yeF9zdGF0cywKLQkJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXJ4X3N0YXRzLT5yeF9wYWNrZXRzKys7Ci0Jcnhfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCS8qIElmIHRoZSBWTEFOIGRldmljZSBpcyBkZWZpbmVkLCB3ZSB1c2UgaXQuCisJICogSWYgbm90LCBhbmQgdGhlIFZJRCBpcyAwLCBpdCBpcyBhIDgwMi4xcCBwYWNrZXQgKG5vdAorCSAqIHJlYWxseSBhIFZMQU4pLCBzbyB3ZSB3aWxsIGp1c3QgbmV0aWZfcnggaXQgbGF0ZXIgdG8gdGhlCisJICogb3JpZ2luYWwgaW50ZXJmYWNlLCBidXQgd2l0aCB0aGUgc2tiLT5wcm90byBzZXQgdG8gdGhlCisJICogd3JhcHBlZCBwcm90bzogd2UgZG8gbm90aGluZyBoZXJlLgorCSAqLworCisJaWYgKCF2bGFuX2RldikgeworCQlpZiAodmxhbl9pZCkgeworCQkJcHJfZGVidWcoIiVzOiBFUlJPUjogTm8gbmV0X2RldmljZSBmb3IgVklEOiAldSBvbiBkZXY6ICVzXG4iLAorCQkJCSBfX2Z1bmNfXywgdmxhbl9pZCwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZXJyX3VubG9jazsKKwkJfQorCQlyeF9zdGF0cyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc2tiLT5kZXYgPSB2bGFuX2RldjsKKworCQlyeF9zdGF0cyA9IHBlcl9jcHVfcHRyKHZsYW5fZGV2X2luZm8oc2tiLT5kZXYpLT52bGFuX3J4X3N0YXRzLAorCQkJCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9zdGF0cy0+c3luY3ApOworCQlyeF9zdGF0cy0+cnhfcGFja2V0cysrOworCQlyeF9zdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJc2tiLT5wcmlvcml0eSA9IHZsYW5fZ2V0X2luZ3Jlc3NfcHJpb3JpdHkoc2tiLT5kZXYsIHZsYW5fdGNpKTsKKworCQlwcl9kZWJ1ZygiJXM6IHByaW9yaXR5OiAldSBmb3IgVENJOiAlaHVcbiIsCisJCQkgX19mdW5jX18sIHNrYi0+cHJpb3JpdHksIHZsYW5fdGNpKTsKKworCQlzd2l0Y2ggKHNrYi0+cGt0X3R5cGUpIHsKKwkJY2FzZSBQQUNLRVRfQlJPQURDQVNUOgorCQkJLyogWWVhaCwgc3RhdHMgY29sbGVjdCB0aGVzZSB0b2dldGhlci4uICovCisJCQkvKiBzdGF0cy0+YnJvYWRjYXN0ICsrOyAvLyBubyBzdWNoIGNvdW50ZXIgOi0oICovCisJCQlicmVhazsKKworCQljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6CisJCQlyeF9zdGF0cy0+cnhfbXVsdGljYXN0Kys7CisJCQlicmVhazsKKworCQljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6CisJCQkvKiBPdXIgbG93ZXIgbGF5ZXIgdGhpbmtzIHRoaXMgaXMgbm90IGxvY2FsLCBsZXQncyBtYWtlCisJCQkgKiBzdXJlLgorCQkJICogVGhpcyBhbGxvd3MgdGhlIFZMQU4gdG8gaGF2ZSBhIGRpZmZlcmVudCBNQUMgdGhhbiB0aGUKKwkJCSAqIHVuZGVybHlpbmcgZGV2aWNlLCBhbmQgc3RpbGwgcm91dGUgY29ycmVjdGx5LgorCQkJICovCisJCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfZGVzdCwKKwkJCQkJCXNrYi0+ZGV2LT5kZXZfYWRkcikpCisJCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfc3RhdHMtPnN5bmNwKTsKKwl9CiAKIAlza2JfcHVsbF9yY3N1bShza2IsIFZMQU5fSExFTik7Ci0KLQlza2ItPnByaW9yaXR5ID0gdmxhbl9nZXRfaW5ncmVzc19wcmlvcml0eShza2ItPmRldiwgdmxhbl90Y2kpOwotCi0JcHJfZGVidWcoIiVzOiBwcmlvcml0eTogJXUgZm9yIFRDSTogJWh1XG4iLAotCQkgX19mdW5jX18sIHNrYi0+cHJpb3JpdHksIHZsYW5fdGNpKTsKLQotCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSkgewotCWNhc2UgUEFDS0VUX0JST0FEQ0FTVDogLyogWWVhaCwgc3RhdHMgY29sbGVjdCB0aGVzZSB0b2dldGhlci4uICovCi0JCS8qIHN0YXRzLT5icm9hZGNhc3QgKys7IC8vIG5vIHN1Y2ggY291bnRlciA6LSggKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6Ci0JCXJ4X3N0YXRzLT5tdWx0aWNhc3QrKzsKLQkJYnJlYWs7Ci0KLQljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6Ci0JCS8qIE91ciBsb3dlciBsYXllciB0aGlua3MgdGhpcyBpcyBub3QgbG9jYWwsIGxldCdzIG1ha2Ugc3VyZS4KLQkJICogVGhpcyBhbGxvd3MgdGhlIFZMQU4gdG8gaGF2ZSBhIGRpZmZlcmVudCBNQUMgdGhhbiB0aGUKLQkJICogdW5kZXJseWluZyBkZXZpY2UsIGFuZCBzdGlsbCByb3V0ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfZGVzdCwKLQkJCQkJc2tiLT5kZXYtPmRldl9hZGRyKSkKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCiAJdmxhbl9zZXRfZW5jYXBfcHJvdG8oc2tiLCB2aGRyKTsKIAotCXNrYiA9IHZsYW5fY2hlY2tfcmVvcmRlcl9oZWFkZXIoc2tiKTsKLQlpZiAoIXNrYikgewotCQlyeF9zdGF0cy0+cnhfZXJyb3JzKys7Ci0JCWdvdG8gZXJyX3VubG9jazsKKwlpZiAodmxhbl9kZXYpIHsKKwkJc2tiID0gdmxhbl9jaGVja19yZW9yZGVyX2hlYWRlcihza2IpOworCQlpZiAoIXNrYikgeworCQkJcnhfc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJZ290byBlcnJfdW5sb2NrOworCQl9CiAJfQogCiAJbmV0aWZfcngoc2tiKTsKQEAgLTgwMSwzNyArODIwLDY1IEBACiAJcmV0dXJuIGRldl9ldGh0b29sX2dldF9mbGFncyh2bGFuLT5yZWFsX2Rldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdmxhbl9kZXZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp2bGFuX2Rldl9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOwotCiAJZGV2X3R4cV9zdGF0c19mb2xkKGRldiwgc3RhdHMpOwogCiAJaWYgKHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9yeF9zdGF0cykgewotCQlzdHJ1Y3Qgdmxhbl9yeF9zdGF0cyAqcCwgcnggPSB7MH07CisJCXN0cnVjdCB2bGFuX3J4X3N0YXRzICpwLCBhY2N1bSA9IHswfTsKIAkJaW50IGk7CiAKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJCXU2NCByeHBhY2tldHMsIHJ4Ynl0ZXMsIHJ4bXVsdGljYXN0OworCQkJdW5zaWduZWQgaW50IHN0YXJ0OworCiAJCQlwID0gcGVyX2NwdV9wdHIodmxhbl9kZXZfaW5mbyhkZXYpLT52bGFuX3J4X3N0YXRzLCBpKTsKLQkJCXJ4LnJ4X3BhY2tldHMgKz0gcC0+cnhfcGFja2V0czsKLQkJCXJ4LnJ4X2J5dGVzICAgKz0gcC0+cnhfYnl0ZXM7Ci0JCQlyeC5yeF9lcnJvcnMgICs9IHAtPnJ4X2Vycm9yczsKLQkJCXJ4Lm11bHRpY2FzdCAgKz0gcC0+bXVsdGljYXN0OworCQkJZG8geworCQkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKCZwLT5zeW5jcCk7CisJCQkJcnhwYWNrZXRzCT0gcC0+cnhfcGFja2V0czsKKwkJCQlyeGJ5dGVzCQk9IHAtPnJ4X2J5dGVzOworCQkJCXJ4bXVsdGljYXN0CT0gcC0+cnhfbXVsdGljYXN0OworCQkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2JoKCZwLT5zeW5jcCwgc3RhcnQpKTsKKwkJCWFjY3VtLnJ4X3BhY2tldHMgKz0gcnhwYWNrZXRzOworCQkJYWNjdW0ucnhfYnl0ZXMgICArPSByeGJ5dGVzOworCQkJYWNjdW0ucnhfbXVsdGljYXN0ICs9IHJ4bXVsdGljYXN0OworCQkJLyogcnhfZXJyb3JzIGlzIGFuIHVsb25nLCBub3QgcHJvdGVjdGVkIGJ5IHN5bmNwICovCisJCQlhY2N1bS5yeF9lcnJvcnMgICs9IHAtPnJ4X2Vycm9yczsKIAkJfQotCQlzdGF0cy0+cnhfcGFja2V0cyA9IHJ4LnJ4X3BhY2tldHM7Ci0JCXN0YXRzLT5yeF9ieXRlcyAgID0gcngucnhfYnl0ZXM7Ci0JCXN0YXRzLT5yeF9lcnJvcnMgID0gcngucnhfZXJyb3JzOwotCQlzdGF0cy0+bXVsdGljYXN0ICA9IHJ4Lm11bHRpY2FzdDsKKwkJc3RhdHMtPnJ4X3BhY2tldHMgPSBhY2N1bS5yeF9wYWNrZXRzOworCQlzdGF0cy0+cnhfYnl0ZXMgICA9IGFjY3VtLnJ4X2J5dGVzOworCQlzdGF0cy0+cnhfZXJyb3JzICA9IGFjY3VtLnJ4X2Vycm9yczsKKwkJc3RhdHMtPm11bHRpY2FzdCAgPSBhY2N1bS5yeF9tdWx0aWNhc3Q7CiAJfQogCXJldHVybiBzdGF0czsKIH0KIAorc3RhdGljIGludCB2bGFuX2V0aHRvb2xfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKyAgICAgICBpZiAoZGF0YSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCisJCS8qIFVuZGVybHlpbmcgZGV2aWNlIG11c3Qgc3VwcG9ydCBUU08gZm9yIFZMQU4tdGFnZ2VkIHBhY2tldHMKKwkJICogYW5kIG11c3QgaGF2ZSBUU08gZW5hYmxlZCBub3cuCisJCSAqLworCQlpZiAoIShyZWFsX2Rldi0+dmxhbl9mZWF0dXJlcyAmIE5FVElGX0ZfVFNPKSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKCEocmVhbF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9UU08pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisJfSBlbHNlIHsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHZsYW5fZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkgICAgICAgID0gdmxhbl9ldGh0b29sX2dldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JICAgICAgICA9IHZsYW5fZXRodG9vbF9nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3J4X2NzdW0JCT0gdmxhbl9ldGh0b29sX2dldF9yeF9jc3VtLAogCS5nZXRfZmxhZ3MJCT0gdmxhbl9ldGh0b29sX2dldF9mbGFncywKKwkuc2V0X3RzbyAgICAgICAgICAgICAgICA9IHZsYW5fZXRodG9vbF9zZXRfdHNvLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB2bGFuX25ldGRldl9vcHMgPSB7CkBAIC04NDgsNyArODk1LDcgQEAKIAkubmRvX2NoYW5nZV9yeF9mbGFncwk9IHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncywKIAkubmRvX2RvX2lvY3RsCQk9IHZsYW5fZGV2X2lvY3RsLAogCS5uZG9fbmVpZ2hfc2V0dXAJPSB2bGFuX2Rldl9uZWlnaF9zZXR1cCwKLQkubmRvX2dldF9zdGF0cwkJPSB2bGFuX2Rldl9nZXRfc3RhdHMsCisJLm5kb19nZXRfc3RhdHM2NAk9IHZsYW5fZGV2X2dldF9zdGF0czY0LAogI2lmIGRlZmluZWQoQ09ORklHX0ZDT0UpIHx8IGRlZmluZWQoQ09ORklHX0ZDT0VfTU9EVUxFKQogCS5uZG9fZmNvZV9kZHBfc2V0dXAJPSB2bGFuX2Rldl9mY29lX2RkcF9zZXR1cCwKIAkubmRvX2Zjb2VfZGRwX2RvbmUJPSB2bGFuX2Rldl9mY29lX2RkcF9kb25lLApAQCAtODcyLDcgKzkxOSw3IEBACiAJLm5kb19jaGFuZ2VfcnhfZmxhZ3MJPSB2bGFuX2Rldl9jaGFuZ2VfcnhfZmxhZ3MsCiAJLm5kb19kb19pb2N0bAkJPSB2bGFuX2Rldl9pb2N0bCwKIAkubmRvX25laWdoX3NldHVwCT0gdmxhbl9kZXZfbmVpZ2hfc2V0dXAsCi0JLm5kb19nZXRfc3RhdHMJCT0gdmxhbl9kZXZfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQJPSB2bGFuX2Rldl9nZXRfc3RhdHM2NCwKICNpZiBkZWZpbmVkKENPTkZJR19GQ09FKSB8fCBkZWZpbmVkKENPTkZJR19GQ09FX01PRFVMRSkKIAkubmRvX2Zjb2VfZGRwX3NldHVwCT0gdmxhbl9kZXZfZmNvZV9kZHBfc2V0dXAsCiAJLm5kb19mY29lX2RkcF9kb25lCT0gdmxhbl9kZXZfZmNvZV9kZHBfZG9uZSwKQEAgLTg5Nyw3ICs5NDQsNyBAQAogCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gdmxhbl9kZXZfY2hhbmdlX3J4X2ZsYWdzLAogCS5uZG9fZG9faW9jdGwJCT0gdmxhbl9kZXZfaW9jdGwsCiAJLm5kb19uZWlnaF9zZXR1cAk9IHZsYW5fZGV2X25laWdoX3NldHVwLAotCS5uZG9fZ2V0X3N0YXRzCQk9IHZsYW5fZGV2X2dldF9zdGF0cywKKwkubmRvX2dldF9zdGF0czY0CT0gdmxhbl9kZXZfZ2V0X3N0YXRzNjQsCiAjaWYgZGVmaW5lZChDT05GSUdfRkNPRSkgfHwgZGVmaW5lZChDT05GSUdfRkNPRV9NT0RVTEUpCiAJLm5kb19mY29lX2RkcF9zZXR1cAk9IHZsYW5fZGV2X2Zjb2VfZGRwX3NldHVwLAogCS5uZG9fZmNvZV9kZHBfZG9uZQk9IHZsYW5fZGV2X2Zjb2VfZGRwX2RvbmUsCkBAIC05MjIsNyArOTY5LDcgQEAKIAkubmRvX2NoYW5nZV9yeF9mbGFncwk9IHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncywKIAkubmRvX2RvX2lvY3RsCQk9IHZsYW5fZGV2X2lvY3RsLAogCS5uZG9fbmVpZ2hfc2V0dXAJPSB2bGFuX2Rldl9uZWlnaF9zZXR1cCwKLQkubmRvX2dldF9zdGF0cwkJPSB2bGFuX2Rldl9nZXRfc3RhdHMsCisJLm5kb19nZXRfc3RhdHM2NAk9IHZsYW5fZGV2X2dldF9zdGF0czY0LAogI2lmIGRlZmluZWQoQ09ORklHX0ZDT0UpIHx8IGRlZmluZWQoQ09ORklHX0ZDT0VfTU9EVUxFKQogCS5uZG9fZmNvZV9kZHBfc2V0dXAJPSB2bGFuX2Rldl9mY29lX2RkcF9zZXR1cCwKIAkubmRvX2Zjb2VfZGRwX2RvbmUJPSB2bGFuX2Rldl9mY29lX2RkcF9kb25lLApkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5wcm9jLmMgYi9uZXQvODAyMXEvdmxhbnByb2MuYwppbmRleCBhZmVhZDM1Li44MGUyODBmIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbnByb2MuYworKysgYi9uZXQvODAyMXEvdmxhbnByb2MuYwpAQCAtMjc4LDI1ICsyNzgsMjcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzZXEtPnByaXZhdGU7CiAJY29uc3Qgc3RydWN0IHZsYW5fZGV2X2luZm8gKmRldl9pbmZvID0gdmxhbl9kZXZfaW5mbyh2bGFuZGV2KTsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IHRlbXA7CisJY29uc3Qgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0czsKIAlzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICIlMzBzICUxMmx1XG4iOworCXN0YXRpYyBjb25zdCBjaGFyIGZtdDY0W10gPSAiJTMwcyAlMTJsbHVcbiI7CiAJaW50IGk7CiAKIAlpZiAoIWlzX3ZsYW5fZGV2KHZsYW5kZXYpKQogCQlyZXR1cm4gMDsKIAotCXN0YXRzID0gZGV2X2dldF9zdGF0cyh2bGFuZGV2KTsKKwlzdGF0cyA9IGRldl9nZXRfc3RhdHModmxhbmRldiwgJnRlbXApOwogCXNlcV9wcmludGYoc2VxLAogCQkgICAiJXMgIFZJRDogJWQJIFJFT1JERVJfSERSOiAlaSAgZGV2LT5wcml2X2ZsYWdzOiAlaHhcbiIsCiAJCSAgIHZsYW5kZXYtPm5hbWUsIGRldl9pbmZvLT52bGFuX2lkLAogCQkgICAoaW50KShkZXZfaW5mby0+ZmxhZ3MgJiAxKSwgdmxhbmRldi0+cHJpdl9mbGFncyk7CiAKLQlzZXFfcHJpbnRmKHNlcSwgZm10LCAidG90YWwgZnJhbWVzIHJlY2VpdmVkIiwgc3RhdHMtPnJ4X3BhY2tldHMpOwotCXNlcV9wcmludGYoc2VxLCBmbXQsICJ0b3RhbCBieXRlcyByZWNlaXZlZCIsIHN0YXRzLT5yeF9ieXRlcyk7Ci0Jc2VxX3ByaW50ZihzZXEsIGZtdCwgIkJyb2FkY2FzdC9NdWx0aWNhc3QgUmN2ZCIsIHN0YXRzLT5tdWx0aWNhc3QpOworCXNlcV9wcmludGYoc2VxLCBmbXQ2NCwgInRvdGFsIGZyYW1lcyByZWNlaXZlZCIsIHN0YXRzLT5yeF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgZm10NjQsICJ0b3RhbCBieXRlcyByZWNlaXZlZCIsIHN0YXRzLT5yeF9ieXRlcyk7CisJc2VxX3ByaW50ZihzZXEsIGZtdDY0LCAiQnJvYWRjYXN0L011bHRpY2FzdCBSY3ZkIiwgc3RhdHMtPm11bHRpY2FzdCk7CiAJc2VxX3B1dHMoc2VxLCAiXG4iKTsKLQlzZXFfcHJpbnRmKHNlcSwgZm10LCAidG90YWwgZnJhbWVzIHRyYW5zbWl0dGVkIiwgc3RhdHMtPnR4X3BhY2tldHMpOwotCXNlcV9wcmludGYoc2VxLCBmbXQsICJ0b3RhbCBieXRlcyB0cmFuc21pdHRlZCIsIHN0YXRzLT50eF9ieXRlcyk7CisJc2VxX3ByaW50ZihzZXEsIGZtdDY0LCAidG90YWwgZnJhbWVzIHRyYW5zbWl0dGVkIiwgc3RhdHMtPnR4X3BhY2tldHMpOworCXNlcV9wcmludGYoc2VxLCBmbXQ2NCwgInRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkIiwgc3RhdHMtPnR4X2J5dGVzKTsKIAlzZXFfcHJpbnRmKHNlcSwgZm10LCAidG90YWwgaGVhZHJvb20gaW5jIiwKIAkJICAgZGV2X2luZm8tPmNudF9pbmNfaGVhZHJvb21fb25fdHgpOwogCXNlcV9wcmludGYoc2VxLCBmbXQsICJ0b3RhbCBlbmNhcCBvbiB4bWl0IiwKZGlmZiAtLWdpdCBhL25ldC85cC9jbGllbnQuYyBiL25ldC85cC9jbGllbnQuYwppbmRleCAzN2M4ZGEwLi5kYzZmMmYyIDEwMDY0NAotLS0gYS9uZXQvOXAvY2xpZW50LmMKKysrIGIvbmV0LzlwL2NsaWVudC5jCkBAIC00NjAsNyArNDYwLDggQEAKIAkJCXJldHVybiBlcnI7CiAJCX0KIAotCQlpZiAocDlfaXNfcHJvdG9fZG90dShjKSkKKwkJaWYgKHA5X2lzX3Byb3RvX2RvdHUoYykgfHwKKwkJCXA5X2lzX3Byb3RvX2RvdGwoYykpCiAJCQllcnIgPSAtZWNvZGU7CiAKIAkJaWYgKCFlcnIgfHwgIUlTX0VSUl9WQUxVRShlcnIpKQpAQCAtMTAxNSwxNCArMTAxNiwxOCBAQAogCXN0cnVjdCBwOV9xaWQgcWlkOwogCWludCBpb3VuaXQ7CiAKLQlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPj4+IFRPUEVOIGZpZCAlZCBtb2RlICVkXG4iLCBmaWQtPmZpZCwgbW9kZSk7Ci0JZXJyID0gMDsKIAljbG50ID0gZmlkLT5jbG50OworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI+Pj4gJXMgZmlkICVkIG1vZGUgJWRcbiIsCisJCXA5X2lzX3Byb3RvX2RvdGwoY2xudCkgPyAiVExPUEVOIiA6ICJUT1BFTiIsIGZpZC0+ZmlkLCBtb2RlKTsKKwllcnIgPSAwOwogCiAJaWYgKGZpZC0+bW9kZSAhPSAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RPUEVOLCAiZGIiLCBmaWQtPmZpZCwgbW9kZSk7CisJaWYgKHA5X2lzX3Byb3RvX2RvdGwoY2xudCkpCisJCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVExPUEVOLCAiZGQiLCBmaWQtPmZpZCwgbW9kZSk7CisJZWxzZQorCQlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RPUEVOLCAiZGIiLCBmaWQtPmZpZCwgbW9kZSk7CiAJaWYgKElTX0VSUihyZXEpKSB7CiAJCWVyciA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBlcnJvcjsKQEAgLTEwMzQsMTAgKzEwMzksOSBAQAogCQlnb3RvIGZyZWVfYW5kX2Vycm9yOwogCX0KIAotCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUk9QRU4gcWlkICV4LiVsbHguJXggaW91bml0ICV4XG4iLAotCQkJCXFpZC50eXBlLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcWlkLnBhdGgsCi0JCQkJcWlkLnZlcnNpb24sIGlvdW5pdCk7CisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCAlcyBxaWQgJXguJWxseC4leCBpb3VuaXQgJXhcbiIsCisJCXA5X2lzX3Byb3RvX2RvdGwoY2xudCkgPyAiUkxPUEVOIiA6ICJST1BFTiIsICBxaWQudHlwZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylxaWQucGF0aCwgcWlkLnZlcnNpb24sIGlvdW5pdCk7CiAKIAlmaWQtPm1vZGUgPSBtb2RlOwogCWZpZC0+aW91bml0ID0gaW91bml0OwpAQCAtMTA0OSw2ICsxMDUzLDUwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHA5X2NsaWVudF9vcGVuKTsKIAoraW50IHA5X2NsaWVudF9jcmVhdGVfZG90bChzdHJ1Y3QgcDlfZmlkICpvZmlkLCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MsIHUzMiBtb2RlLAorCQlnaWRfdCBnaWQsIHN0cnVjdCBwOV9xaWQgKnFpZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcDlfY2xpZW50ICpjbG50OworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCWludCBpb3VuaXQ7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLAorCQkJIj4+PiBUTENSRUFURSBmaWQgJWQgbmFtZSAlcyBmbGFncyAlZCBtb2RlICVkIGdpZCAlZFxuIiwKKwkJCW9maWQtPmZpZCwgbmFtZSwgZmxhZ3MsIG1vZGUsIGdpZCk7CisJY2xudCA9IG9maWQtPmNsbnQ7CisKKwlpZiAob2ZpZC0+bW9kZSAhPSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RMQ1JFQVRFLCAiZHNkZGQiLCBvZmlkLT5maWQsIG5hbWUsIGZsYWdzLAorCQkJbW9kZSwgZ2lkKTsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXEpOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJRZCIsIHFpZCwgJmlvdW5pdCk7CisJaWYgKGVycikgeworCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlnb3RvIGZyZWVfYW5kX2Vycm9yOworCX0KKworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUkxDUkVBVEUgcWlkICV4LiVsbHguJXggaW91bml0ICV4XG4iLAorCQkJcWlkLT50eXBlLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylxaWQtPnBhdGgsCisJCQlxaWQtPnZlcnNpb24sIGlvdW5pdCk7CisKKwlvZmlkLT5tb2RlID0gbW9kZTsKKwlvZmlkLT5pb3VuaXQgPSBpb3VuaXQ7CisKK2ZyZWVfYW5kX2Vycm9yOgorCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfY3JlYXRlX2RvdGwpOworCiBpbnQgcDlfY2xpZW50X2ZjcmVhdGUoc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpuYW1lLCB1MzIgcGVybSwgaW50IG1vZGUsCiAJCSAgICAgY2hhciAqZXh0ZW5zaW9uKQogewpAQCAtMTA5NCw2ICsxMTQyLDU5IEBACiB9CiBFWFBPUlRfU1lNQk9MKHA5X2NsaWVudF9mY3JlYXRlKTsKIAoraW50IHA5X2NsaWVudF9zeW1saW5rKHN0cnVjdCBwOV9maWQgKmRmaWQsIGNoYXIgKm5hbWUsIGNoYXIgKnN5bXRndCwgZ2lkX3QgZ2lkLAorCQlzdHJ1Y3QgcDlfcWlkICpxaWQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHA5X2NsaWVudCAqY2xudDsKKwlzdHJ1Y3QgcDlfcmVxX3QgKnJlcTsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI+Pj4gVFNZTUxJTksgZGZpZCAlZCBuYW1lICVzICBzeW10Z3QgJXNcbiIsCisJCQlkZmlkLT5maWQsIG5hbWUsIHN5bXRndCk7CisJY2xudCA9IGRmaWQtPmNsbnQ7CisKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RTWU1MSU5LLCAiZHNzZCIsIGRmaWQtPmZpZCwgbmFtZSwgc3ltdGd0LAorCQkJZ2lkKTsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXEpOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJRIiwgcWlkKTsKKwlpZiAoZXJyKSB7CisJCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCWdvdG8gZnJlZV9hbmRfZXJyb3I7CisJfQorCisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCBSU1lNTElOSyBxaWQgJXguJWxseC4leFxuIiwKKwkJCXFpZC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylxaWQtPnBhdGgsIHFpZC0+dmVyc2lvbik7CisKK2ZyZWVfYW5kX2Vycm9yOgorCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfc3ltbGluayk7CisKK2ludCBwOV9jbGllbnRfbGluayhzdHJ1Y3QgcDlfZmlkICpkZmlkLCBzdHJ1Y3QgcDlfZmlkICpvbGRmaWQsIGNoYXIgKm5ld25hbWUpCit7CisJc3RydWN0IHA5X2NsaWVudCAqY2xudDsKKwlzdHJ1Y3QgcDlfcmVxX3QgKnJlcTsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI+Pj4gVExJTksgZGZpZCAlZCBvbGRmaWQgJWQgbmV3bmFtZSAlc1xuIiwKKwkJCWRmaWQtPmZpZCwgb2xkZmlkLT5maWQsIG5ld25hbWUpOworCWNsbnQgPSBkZmlkLT5jbG50OworCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVExJTkssICJkZHMiLCBkZmlkLT5maWQsIG9sZGZpZC0+ZmlkLAorCQkJbmV3bmFtZSk7CisJaWYgKElTX0VSUihyZXEpKQorCQlyZXR1cm4gUFRSX0VSUihyZXEpOworCisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCBSTElOS1xuIik7CisJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocDlfY2xpZW50X2xpbmspOworCiBpbnQgcDlfY2xpZW50X2NsdW5rKHN0cnVjdCBwOV9maWQgKmZpZCkKIHsKIAlpbnQgZXJyOwpAQCAtMTEzOSw5ICsxMjQwLDggQEAKIAlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJSRU1PVkUgZmlkICVkXG4iLCBmaWQtPmZpZCk7CiAKIAlwOV9mcmVlX3JlcShjbG50LCByZXEpOwotCXA5X2ZpZF9kZXN0cm95KGZpZCk7Ci0KIGVycm9yOgorCXA5X2ZpZF9kZXN0cm95KGZpZCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0wocDlfY2xpZW50X3JlbW92ZSk7CkBAIC0xMzAyLDYgKzE0MDIsNjUgQEAKIH0KIEVYUE9SVF9TWU1CT0wocDlfY2xpZW50X3N0YXQpOwogCitzdHJ1Y3QgcDlfc3RhdF9kb3RsICpwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKHN0cnVjdCBwOV9maWQgKmZpZCwKKwkJCQkJCQl1NjQgcmVxdWVzdF9tYXNrKQoreworCWludCBlcnI7CisJc3RydWN0IHA5X2NsaWVudCAqY2xudDsKKwlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpyZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcDlfc3RhdF9kb3RsKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJc3RydWN0IHA5X3JlcV90ICpyZXE7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPj4+IFRHRVRBVFRSIGZpZCAlZCwgcmVxdWVzdF9tYXNrICVsbGRcbiIsCisJCQkJCQkJZmlkLT5maWQsIHJlcXVlc3RfbWFzayk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSAwOworCWNsbnQgPSBmaWQtPmNsbnQ7CisKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RHRVRBVFRSLCAiZHEiLCBmaWQtPmZpZCwgcmVxdWVzdF9tYXNrKTsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXEpOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJBIiwgcmV0KTsKKwlpZiAoZXJyKSB7CisJCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwKKwkJIjw8PCBSR0VUQVRUUiBzdF9yZXN1bHRfbWFzaz0lbGxkXG4iCisJCSI8PDwgcWlkPSV4LiVsbHguJXhcbiIKKwkJIjw8PCBzdF9tb2RlPSU4Ljh4IHN0X25saW5rPSVsbHVcbiIKKwkJIjw8PCBzdF91aWQ9JWQgc3RfZ2lkPSVkXG4iCisJCSI8PDwgc3RfcmRldj0lbGx4IHN0X3NpemU9JWxseCBzdF9ibGtzaXplPSVsbHUgc3RfYmxvY2tzPSVsbHVcbiIKKwkJIjw8PCBzdF9hdGltZV9zZWM9JWxsZCBzdF9hdGltZV9uc2VjPSVsbGRcbiIKKwkJIjw8PCBzdF9tdGltZV9zZWM9JWxsZCBzdF9tdGltZV9uc2VjPSVsbGRcbiIKKwkJIjw8PCBzdF9jdGltZV9zZWM9JWxsZCBzdF9jdGltZV9uc2VjPSVsbGRcbiIKKwkJIjw8PCBzdF9idGltZV9zZWM9JWxsZCBzdF9idGltZV9uc2VjPSVsbGRcbiIKKwkJIjw8PCBzdF9nZW49JWxsZCBzdF9kYXRhX3ZlcnNpb249JWxsZCIsCisJCXJldC0+c3RfcmVzdWx0X21hc2ssIHJldC0+cWlkLnR5cGUsIHJldC0+cWlkLnBhdGgsCisJCXJldC0+cWlkLnZlcnNpb24sIHJldC0+c3RfbW9kZSwgcmV0LT5zdF9ubGluaywgcmV0LT5zdF91aWQsCisJCXJldC0+c3RfZ2lkLCByZXQtPnN0X3JkZXYsIHJldC0+c3Rfc2l6ZSwgcmV0LT5zdF9ibGtzaXplLAorCQlyZXQtPnN0X2Jsb2NrcywgcmV0LT5zdF9hdGltZV9zZWMsIHJldC0+c3RfYXRpbWVfbnNlYywKKwkJcmV0LT5zdF9tdGltZV9zZWMsIHJldC0+c3RfbXRpbWVfbnNlYywgcmV0LT5zdF9jdGltZV9zZWMsCisJCXJldC0+c3RfY3RpbWVfbnNlYywgcmV0LT5zdF9idGltZV9zZWMsIHJldC0+c3RfYnRpbWVfbnNlYywKKwkJcmV0LT5zdF9nZW4sIHJldC0+c3RfZGF0YV92ZXJzaW9uKTsKKworCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CisJcmV0dXJuIHJldDsKKworZXJyb3I6CisJa2ZyZWUocmV0KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKTsKKwogc3RhdGljIGludCBwOV9jbGllbnRfc3RhdHNpemUoc3RydWN0IHA5X3dzdGF0ICp3c3QsIGludCBwcm90b192ZXJzaW9uKQogewogCWludCByZXQ7CkBAIC0xMzY2LDYgKzE1MjUsMzYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocDlfY2xpZW50X3dzdGF0KTsKIAoraW50IHA5X2NsaWVudF9zZXRhdHRyKHN0cnVjdCBwOV9maWQgKmZpZCwgc3RydWN0IHA5X2lhdHRyX2RvdGwgKnA5YXR0cikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CisKKwllcnIgPSAwOworCWNsbnQgPSBmaWQtPmNsbnQ7CisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIj4+PiBUU0VUQVRUUiBmaWQgJWRcbiIsIGZpZC0+ZmlkKTsKKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLAorCQkiICAgIHZhbGlkPSV4IG1vZGU9JXggdWlkPSVkIGdpZD0lZCBzaXplPSVsbGRcbiIKKwkJIiAgICBhdGltZV9zZWM9JWxsZCBhdGltZV9uc2VjPSVsbGRcbiIKKwkJIiAgICBtdGltZV9zZWM9JWxsZCBtdGltZV9uc2VjPSVsbGRcbiIsCisJCXA5YXR0ci0+dmFsaWQsIHA5YXR0ci0+bW9kZSwgcDlhdHRyLT51aWQsIHA5YXR0ci0+Z2lkLAorCQlwOWF0dHItPnNpemUsIHA5YXR0ci0+YXRpbWVfc2VjLCBwOWF0dHItPmF0aW1lX25zZWMsCisJCXA5YXR0ci0+bXRpbWVfc2VjLCBwOWF0dHItPm10aW1lX25zZWMpOworCisJcmVxID0gcDlfY2xpZW50X3JwYyhjbG50LCBQOV9UU0VUQVRUUiwgImRJIiwgZmlkLT5maWQsIHA5YXR0cik7CisKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXEpOworCQlnb3RvIGVycm9yOworCX0KKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJTRVRBVFRSIGZpZCAlZFxuIiwgZmlkLT5maWQpOworCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfc2V0YXR0cik7CisKIGludCBwOV9jbGllbnRfc3RhdGZzKHN0cnVjdCBwOV9maWQgKmZpZCwgc3RydWN0IHA5X3JzdGF0ZnMgKnNiKQogewogCWludCBlcnI7CkBAIC0xNDMyLDMgKzE2MjEsMTg3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHA5X2NsaWVudF9yZW5hbWUpOwogCisvKgorICogQW4geGF0dHJ3YWxrIHdpdGhvdXQgQGF0dHJfbmFtZSBnaXZlcyB0aGUgZmlkIGZvciB0aGUgbGlzeGF0dHIgbmFtZXNwYWNlCisgKi8KK3N0cnVjdCBwOV9maWQgKnA5X2NsaWVudF94YXR0cndhbGsoc3RydWN0IHA5X2ZpZCAqZmlsZV9maWQsCisJCQkJY29uc3QgY2hhciAqYXR0cl9uYW1lLCB1NjQgKmF0dHJfc2l6ZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CisJc3RydWN0IHA5X2ZpZCAqYXR0cl9maWQ7CisKKwllcnIgPSAwOworCWNsbnQgPSBmaWxlX2ZpZC0+Y2xudDsKKwlhdHRyX2ZpZCA9IHA5X2ZpZF9jcmVhdGUoY2xudCk7CisJaWYgKElTX0VSUihhdHRyX2ZpZCkpIHsKKwkJZXJyID0gUFRSX0VSUihhdHRyX2ZpZCk7CisJCWF0dHJfZmlkID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwKKwkJIj4+PiBUWEFUVFJXQUxLIGZpbGVfZmlkICVkLCBhdHRyX2ZpZCAlZCBuYW1lICVzXG4iLAorCQlmaWxlX2ZpZC0+ZmlkLCBhdHRyX2ZpZC0+ZmlkLCBhdHRyX25hbWUpOworCisJcmVxID0gcDlfY2xpZW50X3JwYyhjbG50LCBQOV9UWEFUVFJXQUxLLCAiZGRzIiwKKwkJCWZpbGVfZmlkLT5maWQsIGF0dHJfZmlkLT5maWQsIGF0dHJfbmFtZSk7CisJaWYgKElTX0VSUihyZXEpKSB7CisJCWVyciA9IFBUUl9FUlIocmVxKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgInEiLCBhdHRyX3NpemUpOworCWlmIChlcnIpIHsKKwkJcDlwZHVfZHVtcCgxLCByZXEtPnJjKTsKKwkJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKKwkJZ290byBjbHVua19maWQ7CisJfQorCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCAgUlhBVFRSV0FMSyBmaWQgJWQgc2l6ZSAlbGx1XG4iLAorCQlhdHRyX2ZpZC0+ZmlkLCAqYXR0cl9zaXplKTsKKwlyZXR1cm4gYXR0cl9maWQ7CitjbHVua19maWQ6CisJcDlfY2xpZW50X2NsdW5rKGF0dHJfZmlkKTsKKwlhdHRyX2ZpZCA9IE5VTEw7CitlcnJvcjoKKwlpZiAoYXR0cl9maWQgJiYgKGF0dHJfZmlkICE9IGZpbGVfZmlkKSkKKwkJcDlfZmlkX2Rlc3Ryb3koYXR0cl9maWQpOworCisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHA5X2NsaWVudF94YXR0cndhbGspOworCitpbnQgcDlfY2xpZW50X3hhdHRyY3JlYXRlKHN0cnVjdCBwOV9maWQgKmZpZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCXU2NCBhdHRyX3NpemUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLAorCQkiPj4+IFRYQVRUUkNSRUFURSBmaWQgJWQgbmFtZSAgJXMgc2l6ZSAlbGxkIGZsYWcgJWRcbiIsCisJCWZpZC0+ZmlkLCBuYW1lLCAobG9uZyBsb25nKWF0dHJfc2l6ZSwgZmxhZ3MpOworCWVyciA9IDA7CisJY2xudCA9IGZpZC0+Y2xudDsKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RYQVRUUkNSRUFURSwgImRzcWQiLAorCQkJZmlkLT5maWQsIG5hbWUsIGF0dHJfc2l6ZSwgZmxhZ3MpOworCWlmIChJU19FUlIocmVxKSkgeworCQllcnIgPSBQVFJfRVJSKHJlcSk7CisJCWdvdG8gZXJyb3I7CisJfQorCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUlhBVFRSQ1JFQVRFIGZpZCAlZFxuIiwgZmlkLT5maWQpOworCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwocDlfY2xpZW50X3hhdHRyY3JlYXRlKTsKKworaW50IHA5X2NsaWVudF9yZWFkZGlyKHN0cnVjdCBwOV9maWQgKmZpZCwgY2hhciAqZGF0YSwgdTMyIGNvdW50LCB1NjQgb2Zmc2V0KQoreworCWludCBlcnIsIHJzaXplLCB0b3RhbDsKKwlzdHJ1Y3QgcDlfY2xpZW50ICpjbG50OworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCWNoYXIgKmRhdGFwdHI7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPj4+IFRSRUFERElSIGZpZCAlZCBvZmZzZXQgJWxsdSBjb3VudCAlZFxuIiwKKwkJCQlmaWQtPmZpZCwgKGxvbmcgbG9uZyB1bnNpZ25lZCkgb2Zmc2V0LCBjb3VudCk7CisKKwllcnIgPSAwOworCWNsbnQgPSBmaWQtPmNsbnQ7CisJdG90YWwgPSAwOworCisJcnNpemUgPSBmaWQtPmlvdW5pdDsKKwlpZiAoIXJzaXplIHx8IHJzaXplID4gY2xudC0+bXNpemUtUDlfUkVBRERJUkhEUlNaKQorCQlyc2l6ZSA9IGNsbnQtPm1zaXplIC0gUDlfUkVBRERJUkhEUlNaOworCisJaWYgKGNvdW50IDwgcnNpemUpCisJCXJzaXplID0gY291bnQ7CisKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RSRUFERElSLCAiZHFkIiwgZmlkLT5maWQsIG9mZnNldCwgcnNpemUpOworCWlmIChJU19FUlIocmVxKSkgeworCQllcnIgPSBQVFJfRVJSKHJlcSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgIkQiLCAmY291bnQsICZkYXRhcHRyKTsKKwlpZiAoZXJyKSB7CisJCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCWdvdG8gZnJlZV9hbmRfZXJyb3I7CisJfQorCisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCBSUkVBRERJUiBjb3VudCAlZFxuIiwgY291bnQpOworCisJaWYgKGRhdGEpCisJCW1lbW1vdmUoZGF0YSwgZGF0YXB0ciwgY291bnQpOworCisJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKKwlyZXR1cm4gY291bnQ7CisKK2ZyZWVfYW5kX2Vycm9yOgorCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfcmVhZGRpcik7CisKK2ludCBwOV9jbGllbnRfbWtub2RfZG90bChzdHJ1Y3QgcDlfZmlkICpmaWQsIGNoYXIgKm5hbWUsIGludCBtb2RlLAorCQkJZGV2X3QgcmRldiwgZ2lkX3QgZ2lkLCBzdHJ1Y3QgcDlfcWlkICpxaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcDlfY2xpZW50ICpjbG50OworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCisJZXJyID0gMDsKKwljbG50ID0gZmlkLT5jbG50OworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI+Pj4gVE1LTk9EIGZpZCAlZCBuYW1lICVzIG1vZGUgJWQgbWFqb3IgJWQgIgorCQkibWlub3IgJWRcbiIsIGZpZC0+ZmlkLCBuYW1lLCBtb2RlLCBNQUpPUihyZGV2KSwgTUlOT1IocmRldikpOworCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVE1LTk9ELCAiZHNkZGRkIiwgZmlkLT5maWQsIG5hbWUsIG1vZGUsCisJCU1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSwgZ2lkKTsKKwlpZiAoSVNfRVJSKHJlcSkpCisJCXJldHVybiBQVFJfRVJSKHJlcSk7CisKKwllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiUSIsIHFpZCk7CisJaWYgKGVycikgeworCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlnb3RvIGVycm9yOworCX0KKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJNS05PRCBxaWQgJXguJWxseC4leFxuIiwgcWlkLT50eXBlLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcWlkLT5wYXRoLCBxaWQtPnZlcnNpb24pOworCitlcnJvcjoKKwlwOV9mcmVlX3JlcShjbG50LCByZXEpOworCXJldHVybiBlcnI7CisKK30KK0VYUE9SVF9TWU1CT0wocDlfY2xpZW50X21rbm9kX2RvdGwpOworCitpbnQgcDlfY2xpZW50X21rZGlyX2RvdGwoc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpuYW1lLCBpbnQgbW9kZSwKKwkJCQlnaWRfdCBnaWQsIHN0cnVjdCBwOV9xaWQgKnFpZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CisJc3RydWN0IHA5X3JlcV90ICpyZXE7CisKKwllcnIgPSAwOworCWNsbnQgPSBmaWQtPmNsbnQ7CisJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIj4+PiBUTUtESVIgZmlkICVkIG5hbWUgJXMgbW9kZSAlZCBnaWQgJWRcbiIsCisJCSBmaWQtPmZpZCwgbmFtZSwgbW9kZSwgZ2lkKTsKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RNS0RJUiwgImRzZGQiLCBmaWQtPmZpZCwgbmFtZSwgbW9kZSwKKwkJZ2lkKTsKKwlpZiAoSVNfRVJSKHJlcSkpCisJCXJldHVybiBQVFJfRVJSKHJlcSk7CisKKwllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiUSIsIHFpZCk7CisJaWYgKGVycikgeworCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlnb3RvIGVycm9yOworCX0KKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJNS0RJUiBxaWQgJXguJWxseC4leFxuIiwgcWlkLT50eXBlLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcWlkLT5wYXRoLCBxaWQtPnZlcnNpb24pOworCitlcnJvcjoKKwlwOV9mcmVlX3JlcShjbG50LCByZXEpOworCXJldHVybiBlcnI7CisKK30KK0VYUE9SVF9TWU1CT0wocDlfY2xpZW50X21rZGlyX2RvdGwpOwpkaWZmIC0tZ2l0IGEvbmV0LzlwL3Byb3RvY29sLmMgYi9uZXQvOXAvcHJvdG9jb2wuYwppbmRleCAxNDlmODIxLi4zYWNkM2FmIDEwMDY0NAotLS0gYS9uZXQvOXAvcHJvdG9jb2wuYworKysgYi9uZXQvOXAvcHJvdG9jb2wuYwpAQCAtMTQxLDYgKzE0MSw3IEBACiAJRCAtIGRhdGEgYmxvYiAoaW50MzJfdCBzaXplIGZvbGxvd2VkIGJ5IHZvaWQgKiwgcmVzdWx0cyBhcmUgbm90IGZyZWVkKQogCVQgLSBhcnJheSBvZiBzdHJpbmdzIChpbnQxNl90IGNvdW50LCBmb2xsb3dlZCBieSBzdHJpbmdzKQogCVIgLSBhcnJheSBvZiBxaWRzIChpbnQxNl90IGNvdW50LCBmb2xsb3dlZCBieSBxaWRzKQorCUEgLSBzdGF0IGZvciA5cDIwMDAuTCAocDlfc3RhdF9kb3RsKQogCT8gLSBpZiBvcHRpb25hbCA9IDEsIGNvbnRpbnVlIHBhcnNpbmcKICovCiAKQEAgLTM0MCw2ICszNDEsMzMgQEAKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSAnQSc6IHsKKwkJCQlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdGJ1ZiA9CisJCQkJICAgIHZhX2FyZyhhcCwgc3RydWN0IHA5X3N0YXRfZG90bCAqKTsKKworCQkJCW1lbXNldChzdGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBwOV9zdGF0X2RvdGwpKTsKKwkJCQllcnJjb2RlID0KKwkJCQkgICAgcDlwZHVfcmVhZGYocGR1LCBwcm90b192ZXJzaW9uLAorCQkJCQkicVFkZGRxcXFxcXFxcXFxcXFxcXEiLAorCQkJCQkmc3RidWYtPnN0X3Jlc3VsdF9tYXNrLAorCQkJCQkmc3RidWYtPnFpZCwKKwkJCQkJJnN0YnVmLT5zdF9tb2RlLAorCQkJCQkmc3RidWYtPnN0X3VpZCwgJnN0YnVmLT5zdF9naWQsCisJCQkJCSZzdGJ1Zi0+c3RfbmxpbmssCisJCQkJCSZzdGJ1Zi0+c3RfcmRldiwgJnN0YnVmLT5zdF9zaXplLAorCQkJCQkmc3RidWYtPnN0X2Jsa3NpemUsICZzdGJ1Zi0+c3RfYmxvY2tzLAorCQkJCQkmc3RidWYtPnN0X2F0aW1lX3NlYywKKwkJCQkJJnN0YnVmLT5zdF9hdGltZV9uc2VjLAorCQkJCQkmc3RidWYtPnN0X210aW1lX3NlYywKKwkJCQkJJnN0YnVmLT5zdF9tdGltZV9uc2VjLAorCQkJCQkmc3RidWYtPnN0X2N0aW1lX3NlYywKKwkJCQkJJnN0YnVmLT5zdF9jdGltZV9uc2VjLAorCQkJCQkmc3RidWYtPnN0X2J0aW1lX3NlYywKKwkJCQkJJnN0YnVmLT5zdF9idGltZV9uc2VjLAorCQkJCQkmc3RidWYtPnN0X2dlbiwKKwkJCQkJJnN0YnVmLT5zdF9kYXRhX3ZlcnNpb24pOworCQkJfQorCQkJYnJlYWs7CiAJCWNhc2UgJz8nOgogCQkJaWYgKChwcm90b192ZXJzaW9uICE9IHA5X3Byb3RvXzIwMDB1KSAmJgogCQkJCShwcm90b192ZXJzaW9uICE9IHA5X3Byb3RvXzIwMDBMKSkKQEAgLTQ4OCw2ICs1MTYsMjMgQEAKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSAnSSc6eworCQkJCXN0cnVjdCBwOV9pYXR0cl9kb3RsICpwOWF0dHIgPSB2YV9hcmcoYXAsCisJCQkJCQkJc3RydWN0IHA5X2lhdHRyX2RvdGwgKik7CisKKwkJCQllcnJjb2RlID0gcDlwZHVfd3JpdGVmKHBkdSwgcHJvdG9fdmVyc2lvbiwKKwkJCQkJCQkiZGRkZHFxcXFxIiwKKwkJCQkJCQlwOWF0dHItPnZhbGlkLAorCQkJCQkJCXA5YXR0ci0+bW9kZSwKKwkJCQkJCQlwOWF0dHItPnVpZCwKKwkJCQkJCQlwOWF0dHItPmdpZCwKKwkJCQkJCQlwOWF0dHItPnNpemUsCisJCQkJCQkJcDlhdHRyLT5hdGltZV9zZWMsCisJCQkJCQkJcDlhdHRyLT5hdGltZV9uc2VjLAorCQkJCQkJCXA5YXR0ci0+bXRpbWVfc2VjLAorCQkJCQkJCXA5YXR0ci0+bXRpbWVfbnNlYyk7CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSAnPyc6CiAJCQlpZiAoKHByb3RvX3ZlcnNpb24gIT0gcDlfcHJvdG9fMjAwMHUpICYmCiAJCQkJKHByb3RvX3ZlcnNpb24gIT0gcDlfcHJvdG9fMjAwMEwpKQpAQCAtNTgwLDMgKzYyNSwzMCBAQAogCXBkdS0+b2Zmc2V0ID0gMDsKIAlwZHUtPnNpemUgPSAwOwogfQorCitpbnQgcDlkaXJlbnRfcmVhZChjaGFyICpidWYsIGludCBsZW4sIHN0cnVjdCBwOV9kaXJlbnQgKmRpcmVudCwKKwkJCQkJCWludCBwcm90b192ZXJzaW9uKQoreworCXN0cnVjdCBwOV9mY2FsbCBmYWtlX3BkdTsKKwlpbnQgcmV0OworCWNoYXIgKm5hbWVwdHI7CisKKwlmYWtlX3BkdS5zaXplID0gbGVuOworCWZha2VfcGR1LmNhcGFjaXR5ID0gbGVuOworCWZha2VfcGR1LnNkYXRhID0gYnVmOworCWZha2VfcGR1Lm9mZnNldCA9IDA7CisKKwlyZXQgPSBwOXBkdV9yZWFkZigmZmFrZV9wZHUsIHByb3RvX3ZlcnNpb24sICJRcWJzIiwgJmRpcmVudC0+cWlkLAorCQkJJmRpcmVudC0+ZF9vZmYsICZkaXJlbnQtPmRfdHlwZSwgJm5hbWVwdHIpOworCWlmIChyZXQpIHsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCBwOWRpcmVudF9yZWFkIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXA5cGR1X2R1bXAoMSwgJmZha2VfcGR1KTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RyY3B5KGRpcmVudC0+ZF9uYW1lLCBuYW1lcHRyKTsKKworb3V0OgorCXJldHVybiBmYWtlX3BkdS5vZmZzZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHA5ZGlyZW50X3JlYWQpOwpkaWZmIC0tZ2l0IGEvbmV0LzlwL3RyYW5zX2ZkLmMgYi9uZXQvOXAvdHJhbnNfZmQuYwppbmRleCA5OGNlOWJjLi5jODUxMDlkIDEwMDY0NAotLS0gYS9uZXQvOXAvdHJhbnNfZmQuYworKysgYi9uZXQvOXAvdHJhbnNfZmQuYwpAQCAtOTQ4LDcgKzk0OCw3IEBACiAKIAljc29ja2V0ID0gTlVMTDsKIAotCWlmIChzdHJsZW4oYWRkcikgPiBVTklYX1BBVEhfTUFYKSB7CisJaWYgKHN0cmxlbihhZGRyKSA+PSBVTklYX1BBVEhfTUFYKSB7CiAJCVA5X0VQUklOVEsoS0VSTl9FUlIsICJwOV90cmFuc191bml4OiBhZGRyZXNzIHRvbyBsb25nOiAlc1xuIiwKIAkJCWFkZHIpOwogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWcKaW5kZXggMGQ2OGI0MC4uZTI0ZmEwOCAxMDA2NDQKLS0tIGEvbmV0L0tjb25maWcKKysrIGIvbmV0L0tjb25maWcKQEAgLTMyLDcgKzMyLDcgQEAKIGNvbmZpZyBDT01QQVRfTkVUTElOS19NRVNTQUdFUwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIENPTVBBVAotCWRlcGVuZHMgb24gV0lSRUxFU1NfRVhUIHx8IFdBTlRfQ09NUEFUX05FVExJTktfTUVTU0FHRVMKKwlkZXBlbmRzIG9uIFdFWFRfQ09SRSB8fCBXQU5UX0NPTVBBVF9ORVRMSU5LX01FU1NBR0VTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gbWFrZXMgaXQgcG9zc2libGUgdG8gc2VuZCBkaWZmZXJlbnQgbmV0bGluayBtZXNzYWdlcwogCSAgdG8gdGFza3MgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHRhc2sgaXMgYSBjb21wYXQgdGFzayBvciBub3QuIFRvCkBAIC04Niw2ICs4NiwxNiBAQAogCSAgdG8gbmZtYXJrLCBidXQgZGVzaWduYXRlZCBmb3Igc2VjdXJpdHkgcHVycG9zZXMuCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgogCitjb25maWcgTkVUV09SS19QSFlfVElNRVNUQU1QSU5HCisJYm9vbCAiVGltZXN0YW1waW5nIGluIFBIWSBkZXZpY2VzIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBhbGxvd3MgdGltZXN0YW1waW5nIG9mIG5ldHdvcmsgcGFja2V0cyBieSBQSFlzIHdpdGgKKwkgIGhhcmR3YXJlIHRpbWVzdGFtcGluZyBjYXBhYmlsaXRpZXMuIFRoaXMgb3B0aW9uIGFkZHMgc29tZQorCSAgb3ZlcmhlYWQgaW4gdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHBhdGhzLgorCisJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgorCiBtZW51Y29uZmlnIE5FVEZJTFRFUgogCWJvb2wgIk5ldHdvcmsgcGFja2V0IGZpbHRlcmluZyBmcmFtZXdvcmsgKE5ldGZpbHRlcikiCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IGNiN2JkYzEuLjQxZDQyMDAgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTUwLDcgKzUwLDcgQEAKIG9iai0kKENPTkZJR19JUF9EQ0NQKQkJKz0gZGNjcC8KIG9iai0kKENPTkZJR19JUF9TQ1RQKQkJKz0gc2N0cC8KIG9iai0kKENPTkZJR19SRFMpCQkrPSByZHMvCi1vYmoteQkJCQkrPSB3aXJlbGVzcy8KK29iai0kKENPTkZJR19XSVJFTEVTUykJCSs9IHdpcmVsZXNzLwogb2JqLSQoQ09ORklHX01BQzgwMjExKQkJKz0gbWFjODAyMTEvCiBvYmotJChDT05GSUdfVElQQykJCSs9IHRpcGMvCiBvYmotJChDT05GSUdfTkVUTEFCRUwpCQkrPSBuZXRsYWJlbC8KQEAgLTYxLDcgKzYxLDcgQEAKIGlmbmVxICgkKENPTkZJR19EQ0IpLCkKIG9iai15CQkJCSs9IGRjYi8KIGVuZGlmCi1vYmoteQkJCQkrPSBpZWVlODAyMTU0Lworb2JqLSQoQ09ORklHX0lFRUU4MDIxNTQpCSs9IGllZWU4MDIxNTQvCiAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9hdG0vYnIyNjg0LmMgYi9uZXQvYXRtL2JyMjY4NC5jCmluZGV4IDY3MTlhZjYuLjY1MWJhYmQgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYnIyNjg0LmMKKysrIGIvbmV0L2F0bS9icjI2ODQuYwpAQCAtMTM5LDYgKzEzOSw0MyBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGF0bV9kZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkgdm9pZCAqYXJnKQoreworCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2ID0gYXJnOworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBicjI2ODRfdmNjICpicnZjYzsKKwlzdHJ1Y3QgYXRtX3ZjYyAqYXRtX3ZjYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoImV2ZW50PSVsZCBkZXY9JXBcbiIsIGV2ZW50LCBhdG1fZGV2KTsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZkZXZzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGxoLCAmYnIyNjg0X2RldnMpIHsKKwkJbmV0X2RldiA9IGxpc3RfZW50cnlfYnJkZXYobGgpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJ2Y2MsICZCUlBSSVYobmV0X2RldiktPmJydmNjcywgYnJ2Y2NzKSB7CisJCQlhdG1fdmNjID0gYnJ2Y2MtPmF0bXZjYzsKKwkJCWlmIChhdG1fdmNjICYmIGJydmNjLT5hdG12Y2MtPmRldiA9PSBhdG1fZGV2KSB7CisKKwkJCQlpZiAoYXRtX3ZjYy0+ZGV2LT5zaWduYWwgPT0gQVRNX1BIWV9TSUdfTE9TVCkKKwkJCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJCQkJZWxzZQorCQkJCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZGV2c19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYXRtX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGF0bV9kZXZfZXZlbnQsCit9OworCiAvKiBjaGFpbmVkIHZjYy0+cG9wIGZ1bmN0aW9uLiAgQ2hlY2sgaWYgd2Ugc2hvdWxkIHdha2UgdGhlIG5ldGlmX3F1ZXVlICovCiBzdGF0aWMgdm9pZCBicjI2ODRfcG9wKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0zNjIsNiArMzk5LDEyIEBACiAJCQl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKIAkJCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOwogCQl9CisJCXJlYWRfbG9ja19pcnEoJmRldnNfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZicjI2ODRfZGV2cykpIHsKKwkJCS8qIGxhc3QgYnIyNjg0IGRldmljZSAqLworCQkJdW5yZWdpc3Rlcl9hdG1kZXZpY2Vfbm90aWZpZXIoJmF0bV9kZXZfbm90aWZpZXIpOworCQl9CisJCXJlYWRfdW5sb2NrX2lycSgmZGV2c19sb2NrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTMwLDYgKzU3MywxMyBAQAogCiAJCWJyMjY4NF9wdXNoKGF0bXZjYywgc2tiKTsKIAl9CisKKwkvKiBpbml0aWFsaXplIG5ldGRldiBjYXJyaWVyIHN0YXRlICovCisJaWYgKGF0bXZjYy0+ZGV2LT5zaWduYWwgPT0gQVRNX1BIWV9TSUdfTE9TVCkKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCiAJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gMDsKIApAQCAtNjIwLDkgKzY3MCwxNiBAQAogCX0KIAogCXdyaXRlX2xvY2tfaXJxKCZkZXZzX2xvY2spOworCiAJYnJkZXYtPnBheWxvYWQgPSBwYXlsb2FkOwotCWJyZGV2LT5udW1iZXIgPSBsaXN0X2VtcHR5KCZicjI2ODRfZGV2cykgPyAxIDoKLQkgICAgQlJQUklWKGxpc3RfZW50cnlfYnJkZXYoYnIyNjg0X2RldnMucHJldikpLT5udW1iZXIgKyAxOworCisJaWYgKGxpc3RfZW1wdHkoJmJyMjY4NF9kZXZzKSkgeworCQkvKiAxc3QgYnIyNjg0IGRldmljZSAqLworCQlyZWdpc3Rlcl9hdG1kZXZpY2Vfbm90aWZpZXIoJmF0bV9kZXZfbm90aWZpZXIpOworCQlicmRldi0+bnVtYmVyID0gMTsKKwl9IGVsc2UKKwkJYnJkZXYtPm51bWJlciA9IEJSUFJJVihsaXN0X2VudHJ5X2JyZGV2KGJyMjY4NF9kZXZzLnByZXYpKS0+bnVtYmVyICsgMTsKKwogCWxpc3RfYWRkX3RhaWwoJmJyZGV2LT5icjI2ODRfZGV2cywgJmJyMjY4NF9kZXZzKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZkZXZzX2xvY2spOwogCXJldHVybiAwOwpAQCAtNzcyLDYgKzgyOSwxMSBAQAogCXJlbW92ZV9wcm9jX2VudHJ5KCJicjI2ODQiLCBhdG1fcHJvY19yb290KTsKICNlbmRpZgogCisKKwkvKiBpZiBub3QgYWxyZWFkeSBlbXB0eSAqLworCWlmICghbGlzdF9lbXB0eSgmYnIyNjg0X2RldnMpKQorCQl1bnJlZ2lzdGVyX2F0bWRldmljZV9ub3RpZmllcigmYXRtX2Rldl9ub3RpZmllcik7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmJyMjY4NF9kZXZzKSkgewogCQluZXRfZGV2ID0gbGlzdF9lbnRyeV9icmRldihicjI2ODRfZGV2cy5uZXh0KTsKIAkJYnJkZXYgPSBCUlBSSVYobmV0X2Rldik7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NsaXAuYyBiL25ldC9hdG0vY2xpcC5jCmluZGV4IDMxM2FiYTEuLjk1ZmRkMTEgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY2xpcC5jCisrKyBiL25ldC9hdG0vY2xpcC5jCkBAIC01MjIsNyArNTIyLDcgQEAKIAllcnJvciA9IGlwX3JvdXRlX291dHB1dF9rZXkoJmluaXRfbmV0LCAmcnQsICZmbCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JbmVpZ2ggPSBfX25laWdoX2xvb2t1cCgmY2xpcF90YmwsICZpcCwgcnQtPnUuZHN0LmRldiwgMSk7CisJbmVpZ2ggPSBfX25laWdoX2xvb2t1cCgmY2xpcF90YmwsICZpcCwgcnQtPmRzdC5kZXYsIDEpOwogCWlwX3J0X3B1dChydCk7CiAJaWYgKCFuZWlnaCkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NvbW1vbi5jIGIvbmV0L2F0bS9jb21tb24uYwppbmRleCBiNDNmZWIxLi45NDA0MDRhIDEwMDY0NAotLS0gYS9uZXQvYXRtL2NvbW1vbi5jCisrKyBiL25ldC9hdG0vY29tbW9uLmMKQEAgLTM3LDYgKzM3LDggQEAKIERFRklORV9SV0xPQ0sodmNjX3NrbGlzdF9sb2NrKTsKIEVYUE9SVF9TWU1CT0wodmNjX3NrbGlzdF9sb2NrKTsKIAorc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGF0bV9kZXZfbm90aWZ5X2NoYWluKTsKKwogc3RhdGljIHZvaWQgX192Y2NfaW5zZXJ0X3NvY2tldChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IGF0bV92Y2MgKnZjYyA9IGF0bV9zayhzayk7CkBAIC0yMTIsNiArMjE0LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHZjY19yZWxlYXNlX2FzeW5jKTsKIAordm9pZCBhdG1fZGV2X3NpZ25hbF9jaGFuZ2Uoc3RydWN0IGF0bV9kZXYgKmRldiwgY2hhciBzaWduYWwpCit7CisJcHJfZGVidWcoIiVzIHNpZ25hbD0lZCBkZXY9JXAgbnVtYmVyPSVkIGRldi0+c2lnbmFsPSVkXG4iLAorCQlfX2Z1bmNfXywgc2lnbmFsLCBkZXYsIGRldi0+bnVtYmVyLCBkZXYtPnNpZ25hbCk7CisKKwkvKiBhdG0gZHJpdmVyIHNlbmRpbmcgaW52YWxpZCBzaWduYWwgKi8KKwlXQVJOX09OKHNpZ25hbCA8IEFUTV9QSFlfU0lHX0xPU1QgfHwgc2lnbmFsID4gQVRNX1BIWV9TSUdfRk9VTkQpOworCisJaWYgKGRldi0+c2lnbmFsID09IHNpZ25hbCkKKwkJcmV0dXJuOyAvKiBubyBjaGFuZ2UgKi8KKworCWRldi0+c2lnbmFsID0gc2lnbmFsOworCisJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmF0bV9kZXZfbm90aWZ5X2NoYWluLCBzaWduYWwsIGRldik7Cit9CitFWFBPUlRfU1lNQk9MKGF0bV9kZXZfc2lnbmFsX2NoYW5nZSk7CiAKIHZvaWQgYXRtX2Rldl9yZWxlYXNlX3ZjY3Moc3RydWN0IGF0bV9kZXYgKmRldikKIHsKQEAgLTc4MSw2ICs3OTksMTggQEAKIAlyZXR1cm4gdmNjLT5kZXYtPm9wcy0+Z2V0c29ja29wdCh2Y2MsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIGxlbik7CiB9CiAKK2ludCByZWdpc3Rlcl9hdG1kZXZpY2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZhdG1fZGV2X25vdGlmeV9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfYXRtZGV2aWNlX25vdGlmaWVyKTsKKwordm9pZCB1bnJlZ2lzdGVyX2F0bWRldmljZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZhdG1fZGV2X25vdGlmeV9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9hdG1kZXZpY2Vfbm90aWZpZXIpOworCiBzdGF0aWMgaW50IF9faW5pdCBhdG1faW5pdCh2b2lkKQogewogCWludCBlcnJvcjsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvS2NvbmZpZwppbmRleCBlZTNiMzA0Li5lZDM3MTY4IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL0tjb25maWcKKysrIGIvbmV0L2JsdWV0b290aC9LY29uZmlnCkBAIC00MywxOSArNDMsNiBAQAogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEwyQ0FQIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCiAJICBjb21waWxlIGl0IGFzIG1vZHVsZSAobDJjYXApLgogCi1jb25maWcgQlRfTDJDQVBfRVhUX0ZFQVRVUkVTCi0JYm9vbCAiTDJDQVAgRXh0ZW5kZWQgRmVhdHVyZXMgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEJUX0wyQ0FQICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIEwyQ0FQIEV4dGVuZGVkIEZlYXR1cmVzIHN1cHBvcnQuIFRoZXNlCi0JICBuZXcgZmVhdHVyZXMgaW5jbHVkZSB0aGUgRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gYW5kIFN0cmVhbWluZwotCSAgTW9kZXMsIHRoZSBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoRkNTKSwgYW5kIFNlZ21lbnRhdGlvbiBhbmQKLQkgIFJlYXNzZW1ibHkgKFNBUikgZm9yIEwyQ0FQIHBhY2tldHMuIFRoZXkgYXJlIGEgcmVxdWlyZWQgZm9yIHRoZQotCSAgbmV3IEFsdGVybmF0ZSBNQUMvUEhZIGFuZCB0aGUgQmx1ZXRvb3RoIE1lZGljYWwgUHJvZmlsZS4KLQotCSAgWW91IHNob3VsZCBzYXkgTiB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBOb3RlIHRoYXQKLQkgIHRoaXMgaXMgaW4gYW4gZXhwZXJpbWVudGFsIHN0YXRlIHlldC4KLQogY29uZmlnIEJUX1NDTwogCXRyaXN0YXRlICJTQ08gbGlua3Mgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJUCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaAppbmRleCAwZDllNTA2Li43MDY3MjU0NCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCkBAIC04NiwyNiArODYsMjYgQEAKIAlfX3U4ICBjdHJsOwogCV9fdTggIHV1aWRfc2l6ZTsKIAlfX3U4ICBzZXJ2aWNlWzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBibmVwX3NldF9maWx0ZXJfcmVxIHsKIAlfX3U4ICB0eXBlOwogCV9fdTggIGN0cmw7CiAJX19iZTE2IGxlbjsKIAlfX3U4ICBsaXN0WzBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBibmVwX2NvbnRyb2xfcnNwIHsKIAlfX3U4ICB0eXBlOwogCV9fdTggIGN0cmw7CiAJX19iZTE2IHJlc3A7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGJuZXBfZXh0X2hkciB7CiAJX191OCAgdHlwZTsKIAlfX3U4ICBsZW47CiAJX191OCAgZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBCTkVQIGlvY3RsIGRlZmluZXMgKi8KICNkZWZpbmUgQk5FUENPTk5BREQJX0lPVygnQicsIDIwMCwgaW50KQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCmluZGV4IDgwMGI2YjkuLjBiMWU0NjAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4Ci0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKKyAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLCAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgogCkBAIC0xNTUsNiArMTU1LDI3IEBACiAJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9TRVRVUF9TWU5DX0NPTk4sIHNpemVvZihjcCksICZjcCk7CiB9CiAKKy8qIERldmljZSBfbXVzdF8gYmUgbG9ja2VkICovCit2b2lkIGhjaV9zY29fc2V0dXAoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKnNjbyA9IGNvbm4tPmxpbms7CisKKwlCVF9EQkcoIiVwIiwgY29ubik7CisKKwlpZiAoIXNjbykKKwkJcmV0dXJuOworCisJaWYgKCFzdGF0dXMpIHsKKwkJaWYgKGxtcF9lc2NvX2NhcGFibGUoY29ubi0+aGRldikpCisJCQloY2lfc2V0dXBfc3luYyhzY28sIGNvbm4tPmhhbmRsZSk7CisJCWVsc2UKKwkJCWhjaV9hZGRfc2NvKHNjbywgY29ubi0+aGFuZGxlKTsKKwl9IGVsc2UgeworCQloY2lfcHJvdG9fY29ubmVjdF9jZm0oc2NvLCBzdGF0dXMpOworCQloY2lfY29ubl9kZWwoc2NvKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGhjaV9jb25uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGhjaV9jb25uICpjb25uID0gKHZvaWQgKikgYXJnOwpAQCAtMzg1LDEwICs0MDYsMTMgQEAKIAkJYWNsLT5wb3dlcl9zYXZlID0gMTsKIAkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoYWNsKTsKIAotCQlpZiAobG1wX2VzY29fY2FwYWJsZShoZGV2KSkKLQkJCWhjaV9zZXR1cF9zeW5jKHNjbywgYWNsLT5oYW5kbGUpOwotCQllbHNlCi0JCQloY2lfYWRkX3NjbyhzY28sIGFjbC0+aGFuZGxlKTsKKwkJaWYgKHRlc3RfYml0KEhDSV9DT05OX01PREVfQ0hBTkdFX1BFTkQsICZhY2wtPnBlbmQpKSB7CisJCQkvKiBkZWZlciBTQ08gc2V0dXAgdW50aWwgbW9kZSBjaGFuZ2UgY29tcGxldGVkICovCisJCQlzZXRfYml0KEhDSV9DT05OX1NDT19TRVRVUF9QRU5ELCAmYWNsLT5wZW5kKTsKKwkJCXJldHVybiBzY287CisJCX0KKworCQloY2lfc2NvX3NldHVwKGFjbCwgMHgwMCk7CiAJfQogCiAJcmV0dXJuIHNjbzsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwppbmRleCAyZjc2OGRlLi44MzAzZjFjIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCkBAIC01NjIsNiArNTYyLDcgQEAKIAloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAJaW5xdWlyeV9jYWNoZV9mbHVzaChoZGV2KTsKIAloY2lfY29ubl9oYXNoX2ZsdXNoKGhkZXYpOworCWhjaV9ibGFja2xpc3RfY2xlYXIoaGRldik7CiAJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAKIAloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfRE9XTik7CkBAIC05MTMsNyArOTE0LDcgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZoZGV2LT5jbWRfcSk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaGRldi0+cmF3X3EpOwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JFQVNTRU1CTFk7IGkrKykKIAkJaGRldi0+cmVhc3NlbWJseVtpXSA9IE5VTEw7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoZGV2LT5yZXFfd2FpdF9xKTsKQEAgLTkyMyw2ICs5MjQsOCBAQAogCiAJaGNpX2Nvbm5faGFzaF9pbml0KGhkZXYpOwogCisJSU5JVF9MSVNUX0hFQUQoJmhkZXYtPmJsYWNrbGlzdC5saXN0KTsKKwogCW1lbXNldCgmaGRldi0+c3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBoY2lfZGV2X3N0YXRzKSk7CiAKIAlhdG9taWNfc2V0KCZoZGV2LT5wcm9taXNjLCAwKTsKQEAgLTk3MCw3ICs5NzMsNyBAQAogCiAJaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE5VTV9SRUFTU0VNQkxZOyBpKyspCiAJCWtmcmVlX3NrYihoZGV2LT5yZWFzc2VtYmx5W2ldKTsKIAogCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9VTlJFRyk7CkBAIC0xMDMwLDkwICsxMDMzLDE3MSBAQAogfQogRVhQT1JUX1NZTUJPTChoY2lfcmVjdl9mcmFtZSk7CiAKLS8qIFJlY2VpdmUgcGFja2V0IHR5cGUgZnJhZ21lbnQgKi8KLSNkZWZpbmUgX19yZWFzc2VtYmx5KGhkZXYsIHR5cGUpICAoKGhkZXYpLT5yZWFzc2VtYmx5Wyh0eXBlKSAtIDJdKQotCi1pbnQgaGNpX3JlY3ZfZnJhZ21lbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgY291bnQpCitzdGF0aWMgaW50IGhjaV9yZWFzc2VtYmx5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwKKwkJCSAgaW50IGNvdW50LCBfX3U4IGluZGV4LCBnZnBfdCBnZnBfbWFzaykKIHsKLQlpZiAodHlwZSA8IEhDSV9BQ0xEQVRBX1BLVCB8fCB0eXBlID4gSENJX0VWRU5UX1BLVCkKKwlpbnQgbGVuID0gMDsKKwlpbnQgaGxlbiA9IDA7CisJaW50IHJlbWFpbiA9IGNvdW50OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGJ0X3NrYl9jYiAqc2NiOworCisJaWYgKCh0eXBlIDwgSENJX0FDTERBVEFfUEtUIHx8IHR5cGUgPiBIQ0lfRVZFTlRfUEtUKSB8fAorCQkJCWluZGV4ID49IE5VTV9SRUFTU0VNQkxZKQogCQlyZXR1cm4gLUVJTFNFUTsKIAotCXdoaWxlIChjb3VudCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19yZWFzc2VtYmx5KGhkZXYsIHR5cGUpOwotCQlzdHJ1Y3QgeyBpbnQgZXhwZWN0OyB9ICpzY2I7Ci0JCWludCBsZW4gPSAwOworCXNrYiA9IGhkZXYtPnJlYXNzZW1ibHlbaW5kZXhdOwogCi0JCWlmICghc2tiKSB7Ci0JCQkvKiBTdGFydCBvZiB0aGUgZnJhbWUgKi8KLQotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEhDSV9FVkVOVF9QS1Q6Ci0JCQkJaWYgKGNvdW50ID49IEhDSV9FVkVOVF9IRFJfU0laRSkgewotCQkJCQlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaCA9IGRhdGE7Ci0JCQkJCWxlbiA9IEhDSV9FVkVOVF9IRFJfU0laRSArIGgtPnBsZW47Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiAtRUlMU0VROwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKLQkJCQlpZiAoY291bnQgPj0gSENJX0FDTF9IRFJfU0laRSkgewotCQkJCQlzdHJ1Y3QgaGNpX2FjbF9oZHIgKmggPSBkYXRhOwotCQkJCQlsZW4gPSBIQ0lfQUNMX0hEUl9TSVpFICsgX19sZTE2X3RvX2NwdShoLT5kbGVuKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIC1FSUxTRVE7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSENJX1NDT0RBVEFfUEtUOgotCQkJCWlmIChjb3VudCA+PSBIQ0lfU0NPX0hEUl9TSVpFKSB7Ci0JCQkJCXN0cnVjdCBoY2lfc2NvX2hkciAqaCA9IGRhdGE7Ci0JCQkJCWxlbiA9IEhDSV9TQ09fSERSX1NJWkUgKyBoLT5kbGVuOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm4gLUVJTFNFUTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc2tiID0gYnRfc2tiX2FsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIXNrYikgewotCQkJCUJUX0VSUigiJXMgbm8gbWVtb3J5IGZvciBwYWNrZXQiLCBoZGV2LT5uYW1lKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQotCQkJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OwotCQkJYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSB0eXBlOwotCi0JCQlfX3JlYXNzZW1ibHkoaGRldiwgdHlwZSkgPSBza2I7Ci0KLQkJCXNjYiA9ICh2b2lkICopIHNrYi0+Y2I7Ci0JCQlzY2ItPmV4cGVjdCA9IGxlbjsKLQkJfSBlbHNlIHsKLQkJCS8qIENvbnRpbnVhdGlvbiAqLwotCi0JCQlzY2IgPSAodm9pZCAqKSBza2ItPmNiOwotCQkJbGVuID0gc2NiLT5leHBlY3Q7CisJaWYgKCFza2IpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgSENJX0FDTERBVEFfUEtUOgorCQkJbGVuID0gSENJX01BWF9GUkFNRV9TSVpFOworCQkJaGxlbiA9IEhDSV9BQ0xfSERSX1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBIQ0lfRVZFTlRfUEtUOgorCQkJbGVuID0gSENJX01BWF9FVkVOVF9TSVpFOworCQkJaGxlbiA9IEhDSV9FVkVOVF9IRFJfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIEhDSV9TQ09EQVRBX1BLVDoKKwkJCWxlbiA9IEhDSV9NQVhfU0NPX1NJWkU7CisJCQlobGVuID0gSENJX1NDT19IRFJfU0laRTsKKwkJCWJyZWFrOwogCQl9CiAKLQkJbGVuID0gbWluKGxlbiwgY291bnQpOworCQlza2IgPSBidF9za2JfYWxsb2MobGVuLCBnZnBfbWFzayk7CisJCWlmICghc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2NiID0gKHZvaWQgKikgc2tiLT5jYjsKKwkJc2NiLT5leHBlY3QgPSBobGVuOworCQlzY2ItPnBrdF90eXBlID0gdHlwZTsKKworCQlza2ItPmRldiA9ICh2b2lkICopIGhkZXY7CisJCWhkZXYtPnJlYXNzZW1ibHlbaW5kZXhdID0gc2tiOworCX0KKworCXdoaWxlIChjb3VudCkgeworCQlzY2IgPSAodm9pZCAqKSBza2ItPmNiOworCQlsZW4gPSBtaW4oc2NiLT5leHBlY3QsIChfX3UxNiljb3VudCk7CiAKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBkYXRhLCBsZW4pOwogCisJCWNvdW50IC09IGxlbjsKKwkJZGF0YSArPSBsZW47CiAJCXNjYi0+ZXhwZWN0IC09IGxlbjsKKwkJcmVtYWluID0gY291bnQ7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgSENJX0VWRU5UX1BLVDoKKwkJCWlmIChza2ItPmxlbiA9PSBIQ0lfRVZFTlRfSERSX1NJWkUpIHsKKwkJCQlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaCA9IGhjaV9ldmVudF9oZHIoc2tiKTsKKwkJCQlzY2ItPmV4cGVjdCA9IGgtPnBsZW47CisKKwkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBzY2ItPmV4cGVjdCkgeworCQkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQkJaGRldi0+cmVhc3NlbWJseVtpbmRleF0gPSBOVUxMOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKwkJCWlmIChza2ItPmxlbiAgPT0gSENJX0FDTF9IRFJfU0laRSkgeworCQkJCXN0cnVjdCBoY2lfYWNsX2hkciAqaCA9IGhjaV9hY2xfaGRyKHNrYik7CisJCQkJc2NiLT5leHBlY3QgPSBfX2xlMTZfdG9fY3B1KGgtPmRsZW4pOworCisJCQkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgc2NiLT5leHBlY3QpIHsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJCWhkZXYtPnJlYXNzZW1ibHlbaW5kZXhdID0gTlVMTDsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBIQ0lfU0NPREFUQV9QS1Q6CisJCQlpZiAoc2tiLT5sZW4gPT0gSENJX1NDT19IRFJfU0laRSkgeworCQkJCXN0cnVjdCBoY2lfc2NvX2hkciAqaCA9IGhjaV9zY29faGRyKHNrYik7CisJCQkJc2NiLT5leHBlY3QgPSBoLT5kbGVuOworCisJCQkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgc2NiLT5leHBlY3QpIHsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJCWhkZXYtPnJlYXNzZW1ibHlbaW5kZXhdID0gTlVMTDsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KIAogCQlpZiAoc2NiLT5leHBlY3QgPT0gMCkgewogCQkJLyogQ29tcGxldGUgZnJhbWUgKi8KIAotCQkJX19yZWFzc2VtYmx5KGhkZXYsIHR5cGUpID0gTlVMTDsKLQogCQkJYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSB0eXBlOwogCQkJaGNpX3JlY3ZfZnJhbWUoc2tiKTsKLQkJfQogCi0JCWNvdW50IC09IGxlbjsgZGF0YSArPSBsZW47CisJCQloZGV2LT5yZWFzc2VtYmx5W2luZGV4XSA9IE5VTEw7CisJCQlyZXR1cm4gcmVtYWluOworCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlbWFpbjsKK30KKworaW50IGhjaV9yZWN2X2ZyYWdtZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwgaW50IGNvdW50KQoreworCWludCByZW0gPSAwOworCisJaWYgKHR5cGUgPCBIQ0lfQUNMREFUQV9QS1QgfHwgdHlwZSA+IEhDSV9FVkVOVF9QS1QpCisJCXJldHVybiAtRUlMU0VROworCisJd2hpbGUgKGNvdW50KSB7CisJCXJlbSA9IGhjaV9yZWFzc2VtYmx5KGhkZXYsIHR5cGUsIGRhdGEsIGNvdW50LAorCQkJCQkJdHlwZSAtIDEsIEdGUF9BVE9NSUMpOworCQlpZiAocmVtIDwgMCkKKwkJCXJldHVybiByZW07CisKKwkJZGF0YSArPSAoY291bnQgLSByZW0pOworCQljb3VudCA9IHJlbTsKKwl9OworCisJcmV0dXJuIHJlbTsKIH0KIEVYUE9SVF9TWU1CT0woaGNpX3JlY3ZfZnJhZ21lbnQpOwogCisjZGVmaW5lIFNUUkVBTV9SRUFTU0VNQkxZIDAKKworaW50IGhjaV9yZWN2X3N0cmVhbV9mcmFnbWVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwgaW50IGNvdW50KQoreworCWludCB0eXBlOworCWludCByZW0gPSAwOworCisJd2hpbGUgKGNvdW50KSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBoZGV2LT5yZWFzc2VtYmx5W1NUUkVBTV9SRUFTU0VNQkxZXTsKKworCQlpZiAoIXNrYikgeworCQkJc3RydWN0IHsgY2hhciB0eXBlOyB9ICpwa3Q7CisKKwkJCS8qIFN0YXJ0IG9mIHRoZSBmcmFtZSAqLworCQkJcGt0ID0gZGF0YTsKKwkJCXR5cGUgPSBwa3QtPnR5cGU7CisKKwkJCWRhdGErKzsKKwkJCWNvdW50LS07CisJCX0gZWxzZQorCQkJdHlwZSA9IGJ0X2NiKHNrYiktPnBrdF90eXBlOworCisJCXJlbSA9IGhjaV9yZWFzc2VtYmx5KGhkZXYsIHR5cGUsIGRhdGEsCisJCQkJCWNvdW50LCBTVFJFQU1fUkVBU1NFTUJMWSwgR0ZQX0FUT01JQyk7CisJCWlmIChyZW0gPCAwKQorCQkJcmV0dXJuIHJlbTsKKworCQlkYXRhICs9IChjb3VudCAtIHJlbSk7CisJCWNvdW50ID0gcmVtOworCX07CisKKwlyZXR1cm4gcmVtOworfQorRVhQT1JUX1NZTUJPTChoY2lfcmVjdl9zdHJlYW1fZnJhZ21lbnQpOworCiAvKiAtLS0tIEludGVyZmFjZSB0byB1cHBlciBwcm90b2NvbHMgLS0tLSAqLwogCiAvKiBSZWdpc3Rlci9VbnJlZ2lzdGVyIHByb3RvY29scy4KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IDc4NmI1ZGUuLmJmZWY1YmEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CiAKQEAgLTU4NCw3ICs1ODQsNyBAQAogCQkJCWNvbm4tPm91dCA9IDE7CiAJCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9NQVNURVI7CiAJCQl9IGVsc2UKLQkJCQlCVF9FUlIoIk5vIG1lbW1vcnkgZm9yIG5ldyBjb25uZWN0aW9uIik7CisJCQkJQlRfRVJSKCJObyBtZW1vcnkgZm9yIG5ldyBjb25uZWN0aW9uIik7CiAJCX0KIAl9CiAKQEAgLTc4NSw5ICs3ODUsMTMgQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIF9fbGUxNl90b19jcHUoY3AtPmhhbmRsZSkpOwotCWlmIChjb25uKQorCWlmIChjb25uKSB7CiAJCWNsZWFyX2JpdChIQ0lfQ09OTl9NT0RFX0NIQU5HRV9QRU5ELCAmY29ubi0+cGVuZCk7CiAKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfQ09OTl9TQ09fU0VUVVBfUEVORCwgJmNvbm4tPnBlbmQpKQorCQkJaGNpX3Njb19zZXR1cChjb25uLCBzdGF0dXMpOworCX0KKwogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCkBAIC04MDgsOSArODEyLDEzIEBACiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBfX2xlMTZfdG9fY3B1KGNwLT5oYW5kbGUpKTsKLQlpZiAoY29ubikKKwlpZiAoY29ubikgewogCQljbGVhcl9iaXQoSENJX0NPTk5fTU9ERV9DSEFOR0VfUEVORCwgJmNvbm4tPnBlbmQpOwogCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0NPTk5fU0NPX1NFVFVQX1BFTkQsICZjb25uLT5wZW5kKSkKKwkJCWhjaV9zY29fc2V0dXAoY29ubiwgc3RhdHVzKTsKKwl9CisKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIApAQCAtOTE1LDIwICs5MjMsOCBAQAogCX0gZWxzZQogCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKIAotCWlmIChjb25uLT50eXBlID09IEFDTF9MSU5LKSB7Ci0JCXN0cnVjdCBoY2lfY29ubiAqc2NvID0gY29ubi0+bGluazsKLQkJaWYgKHNjbykgewotCQkJaWYgKCFldi0+c3RhdHVzKSB7Ci0JCQkJaWYgKGxtcF9lc2NvX2NhcGFibGUoaGRldikpCi0JCQkJCWhjaV9zZXR1cF9zeW5jKHNjbywgY29ubi0+aGFuZGxlKTsKLQkJCQllbHNlCi0JCQkJCWhjaV9hZGRfc2NvKHNjbywgY29ubi0+aGFuZGxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKHNjbywgZXYtPnN0YXR1cyk7Ci0JCQkJaGNpX2Nvbm5fZGVsKHNjbyk7Ci0JCQl9Ci0JCX0KLQl9CisJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTkspCisJCWhjaV9zY29fc2V0dXAoY29ubiwgZXYtPnN0YXR1cyk7CiAKIAlpZiAoZXYtPnN0YXR1cykgewogCQloY2lfcHJvdG9fY29ubmVjdF9jZm0oY29ubiwgZXYtPnN0YXR1cyk7CkBAIC05NTIsNyArOTQ4LDcgQEAKIAogCW1hc2sgfD0gaGNpX3Byb3RvX2Nvbm5lY3RfaW5kKGhkZXYsICZldi0+YmRhZGRyLCBldi0+bGlua190eXBlKTsKIAotCWlmIChtYXNrICYgSENJX0xNX0FDQ0VQVCkgeworCWlmICgobWFzayAmIEhDSV9MTV9BQ0NFUFQpICYmICFoY2lfYmxhY2tsaXN0X2xvb2t1cChoZGV2LCAmZXYtPmJkYWRkcikpIHsKIAkJLyogQ29ubmVjdGlvbiBhY2NlcHRlZCAqLwogCQlzdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqaWU7CiAJCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKQEAgLTk2NSw3ICs5NjEsNyBAQAogCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpOwogCQlpZiAoIWNvbm4pIHsKIAkJCWlmICghKGNvbm4gPSBoY2lfY29ubl9hZGQoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpKSkgewotCQkJCUJUX0VSUigiTm8gbWVtbW9yeSBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKKwkJCQlCVF9FUlIoIk5vIG1lbW9yeSBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKIAkJCQloY2lfZGV2X3VubG9jayhoZGV2KTsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC0xNDgxLDYgKzE0NzcsOSBAQAogCQkJZWxzZQogCQkJCWNvbm4tPnBvd2VyX3NhdmUgPSAwOwogCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfQ09OTl9TQ09fU0VUVVBfUEVORCwgJmNvbm4tPnBlbmQpKQorCQkJaGNpX3Njb19zZXR1cChjb25uLCBldi0+c3RhdHVzKTsKIAl9CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwppbmRleCAzOGYwOGY2Li40ZjE3MGE1IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCkBAIC0xNjUsNiArMTY1LDg2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBiZGFkZHJfbGlzdCAqaGNpX2JsYWNrbGlzdF9sb29rdXAoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmJsYWNrbGlzdCA9ICZoZGV2LT5ibGFja2xpc3Q7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZibGFja2xpc3QtPmxpc3QpIHsKKwkJc3RydWN0IGJkYWRkcl9saXN0ICpiOworCisJCWIgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBiZGFkZHJfbGlzdCwgbGlzdCk7CisKKwkJaWYgKGJhY21wKGJkYWRkciwgJmItPmJkYWRkcikgPT0gMCkKKwkJCXJldHVybiBiOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGhjaV9ibGFja2xpc3RfYWRkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCWJkYWRkcl90IGJkYWRkcjsKKwlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmVudHJ5OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiZGFkZHIsIGFyZywgc2l6ZW9mKGJkYWRkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChiYWNtcCgmYmRhZGRyLCBCREFERFJfQU5ZKSA9PSAwKQorCQlyZXR1cm4gLUVCQURGOworCisJaWYgKGhjaV9ibGFja2xpc3RfbG9va3VwKGhkZXYsICZiZGFkZHIpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWVudHJ5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJkYWRkcl9saXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliYWNweSgmZW50cnktPmJkYWRkciwgJmJkYWRkcik7CisKKwlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZoZGV2LT5ibGFja2xpc3QubGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhjaV9ibGFja2xpc3RfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisJc3RydWN0IGJkYWRkcl9saXN0ICpibGFja2xpc3QgPSAmaGRldi0+YmxhY2tsaXN0OworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZibGFja2xpc3QtPmxpc3QpIHsKKwkJc3RydWN0IGJkYWRkcl9saXN0ICpiOworCisJCWIgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBiZGFkZHJfbGlzdCwgbGlzdCk7CisKKwkJbGlzdF9kZWwocCk7CisJCWtmcmVlKGIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhjaV9ibGFja2xpc3RfZGVsKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCWJkYWRkcl90IGJkYWRkcjsKKwlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmVudHJ5OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiZGFkZHIsIGFyZywgc2l6ZW9mKGJkYWRkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChiYWNtcCgmYmRhZGRyLCBCREFERFJfQU5ZKSA9PSAwKQorCQlyZXR1cm4gaGNpX2JsYWNrbGlzdF9jbGVhcihoZGV2KTsKKworCWVudHJ5ID0gaGNpX2JsYWNrbGlzdF9sb29rdXAoaGRldiwgJmJkYWRkcik7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCWtmcmVlKGVudHJ5KTsKKworCXJldHVybiAwOworfQorCiAvKiBJb2N0bHMgdGhhdCByZXF1aXJlIGJvdW5kIHNvY2tldCAqLwogc3RhdGljIGlubGluZSBpbnQgaGNpX3NvY2tfYm91bmRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTE5NCw2ICsyNzQsMTYgQEAKIAljYXNlIEhDSUdFVEFVVEhJTkZPOgogCQlyZXR1cm4gaGNpX2dldF9hdXRoX2luZm8oaGRldiwgKHZvaWQgX191c2VyICopIGFyZyk7CiAKKwljYXNlIEhDSUJMT0NLQUREUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBoY2lfYmxhY2tsaXN0X2FkZChoZGV2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKworCWNhc2UgSENJVU5CTE9DS0FERFI6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaGNpX2JsYWNrbGlzdF9kZWwoaGRldiwgKHZvaWQgX191c2VyICopIGFyZyk7CisKIAlkZWZhdWx0OgogCQlpZiAoaGRldi0+aW9jdGwpCiAJCQlyZXR1cm4gaGRldi0+aW9jdGwoaGRldiwgY21kLCBhcmcpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYyBiL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKaW5kZXggNDYzZmZhNC4uY2U0NGM0NyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCkBAIC00MzYsNiArNDM2LDQxIEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBpbnQgYmxhY2tsaXN0X3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpwKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmJsYWNrbGlzdCA9ICZoZGV2LT5ibGFja2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKworCWxpc3RfZm9yX2VhY2gobCwgJmJsYWNrbGlzdC0+bGlzdCkgeworCQlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmI7CisJCWJkYWRkcl90IGJkYWRkcjsKKworCQliID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYmRhZGRyX2xpc3QsIGxpc3QpOworCisJCWJhc3dhcCgmYmRhZGRyLCAmYi0+YmRhZGRyKTsKKworCQlzZXFfcHJpbnRmKGYsICIlc1xuIiwgYmF0b3N0cigmYmRhZGRyKSk7CisJfQorCisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibGFja2xpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYmxhY2tsaXN0X3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibGFja2xpc3RfZm9wcyA9IHsKKwkub3BlbgkJPSBibGFja2xpc3Rfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKIGludCBoY2lfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmhkZXYtPmRldjsKQEAgLTQ2NSw2ICs1MDAsOSBAQAogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImlucXVpcnlfY2FjaGUiLCAwNDQ0LCBoZGV2LT5kZWJ1Z2ZzLAogCQkJCQkJaGRldiwgJmlucXVpcnlfY2FjaGVfZm9wcyk7CiAKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJibGFja2xpc3QiLCAwNDQ0LCBoZGV2LT5kZWJ1Z2ZzLAorCQkJCQkJaGRldiwgJmJsYWNrbGlzdF9mb3BzKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKaW5kZXggY2YzYzQwNy4uOWJhMWU4ZSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcC5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwpAQCAtMSw2ICsxLDggQEAKIC8qCiAgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKICAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR3VzdGF2byBGLiBQYWRvdmFuIDxndXN0YXZvQHBhZG92YW4ub3JnPgorICAgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCiAKICAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KIApAQCAtNTMsMTUgKzU1LDkgQEAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgogCi0jZGVmaW5lIFZFUlNJT04gIjIuMTQiCisjZGVmaW5lIFZFUlNJT04gIjIuMTUiCiAKLSNpZmRlZiBDT05GSUdfQlRfTDJDQVBfRVhUX0ZFQVRVUkVTCi1zdGF0aWMgaW50IGVuYWJsZV9lcnRtID0gMTsKLSNlbHNlCi1zdGF0aWMgaW50IGVuYWJsZV9lcnRtID0gMDsKLSNlbmRpZgotc3RhdGljIGludCBtYXhfdHJhbnNtaXQgPSBMMkNBUF9ERUZBVUxUX01BWF9UWDsKLXN0YXRpYyBpbnQgdHhfd2luZG93ID0gTDJDQVBfREVGQVVMVF9UWF9XSU5ET1c7CitzdGF0aWMgaW50IGRpc2FibGVfZXJ0bSA9IDA7CiAKIHN0YXRpYyB1MzIgbDJjYXBfZmVhdF9tYXNrID0gTDJDQVBfRkVBVF9GSVhFRF9DSEFOOwogc3RhdGljIHU4IGwyY2FwX2ZpeGVkX2NoYW5bOF0gPSB7IDB4MDIsIH07CkBAIC04MCw5ICs3NiwxMiBAQAogc3RhdGljIHZvaWQgbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spOwogc3RhdGljIHZvaWQgbDJjYXBfc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CiAKK3N0YXRpYyBpbnQgbDJjYXBfYnVpbGRfY29uZl9yZXEoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpkYXRhKTsKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbDJjYXBfYnVpbGRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAogCQkJCXU4IGNvZGUsIHU4IGlkZW50LCB1MTYgZGxlbiwgdm9pZCAqZGF0YSk7CiAKK3N0YXRpYyBpbnQgbDJjYXBfZXJ0bV9kYXRhX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworCiAvKiAtLS0tIEwyQ0FQIHRpbWVycyAtLS0tICovCiBzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0yNzgsNiArMjc3LDI0IEBACiAJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOwogCX0gZWxzZQogCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKworCXNrYl9xdWV1ZV9wdXJnZShUWF9RVUVVRShzaykpOworCisJaWYgKGwyY2FwX3BpKHNrKS0+bW9kZSA9PSBMMkNBUF9NT0RFX0VSVE0pIHsKKwkJc3RydWN0IHNyZWpfbGlzdCAqbCwgKnRtcDsKKworCQlkZWxfdGltZXIoJmwyY2FwX3BpKHNrKS0+cmV0cmFuc190aW1lcik7CisJCWRlbF90aW1lcigmbDJjYXBfcGkoc2spLT5tb25pdG9yX3RpbWVyKTsKKwkJZGVsX3RpbWVyKCZsMmNhcF9waShzayktPmFja190aW1lcik7CisKKwkJc2tiX3F1ZXVlX3B1cmdlKFNSRUpfUVVFVUUoc2spKTsKKwkJc2tiX3F1ZXVlX3B1cmdlKEJVU1lfUVVFVUUoc2spKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgdG1wLCBTUkVKX0xJU1Qoc2spLCBsaXN0KSB7CisJCQlsaXN0X2RlbCgmbC0+bGlzdCk7CisJCQlrZnJlZShsKTsKKwkJfQorCX0KIH0KIAogLyogU2VydmljZSBsZXZlbCBzZWN1cml0eSAqLwpAQCAtMzUxLDggKzM2OCwxMiBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGwyY2FwX2hkciAqbGg7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBwaS0+Y29ubjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilwaTsKIAlpbnQgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CiAKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJcmV0dXJuOworCiAJaWYgKHBpLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KQogCQlobGVuICs9IDI7CiAKQEAgLTQ0MCwyNCArNDYxLDU3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb2RlX3N1cHBvcnRlZChfX3U4IG1vZGUsIF9fdTMyIGZlYXRfbWFzaykKK3sKKwl1MzIgbG9jYWxfZmVhdF9tYXNrID0gbDJjYXBfZmVhdF9tYXNrOworCWlmICghZGlzYWJsZV9lcnRtKQorCQlsb2NhbF9mZWF0X21hc2sgfD0gTDJDQVBfRkVBVF9FUlRNIHwgTDJDQVBfRkVBVF9TVFJFQU1JTkc7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEwyQ0FQX01PREVfRVJUTToKKwkJcmV0dXJuIEwyQ0FQX0ZFQVRfRVJUTSAmIGZlYXRfbWFzayAmIGxvY2FsX2ZlYXRfbWFzazsKKwljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgorCQlyZXR1cm4gTDJDQVBfRkVBVF9TVFJFQU1JTkcgJiBmZWF0X21hc2sgJiBsb2NhbF9mZWF0X21hc2s7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDB4MDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpCiB7CiAJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxIHJlcTsKIAorCWlmICghY29ubikKKwkJcmV0dXJuOworCisJc2tiX3F1ZXVlX3B1cmdlKFRYX1FVRVVFKHNrKSk7CisKKwlpZiAobDJjYXBfcGkoc2spLT5tb2RlID09IEwyQ0FQX01PREVfRVJUTSkgeworCQlkZWxfdGltZXIoJmwyY2FwX3BpKHNrKS0+cmV0cmFuc190aW1lcik7CisJCWRlbF90aW1lcigmbDJjYXBfcGkoc2spLT5tb25pdG9yX3RpbWVyKTsKKwkJZGVsX3RpbWVyKCZsMmNhcF9waShzayktPmFja190aW1lcik7CisJfQorCiAJcmVxLmRjaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwogCXJlcS5zY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKIAlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksCiAJCQlMMkNBUF9ESVNDT05OX1JFUSwgc2l6ZW9mKHJlcSksICZyZXEpOworCisJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKKwlzay0+c2tfZXJyID0gZXJyOwogfQogCiAvKiAtLS0tIEwyQ0FQIGNvbm5lY3Rpb25zIC0tLS0gKi8KIHN0YXRpYyB2b2lkIGwyY2FwX2Nvbm5fc3RhcnQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisJc3RydWN0IHNvY2tfZGVsX2xpc3QgZGVsLCAqdG1wMSwgKnRtcDI7CiAJc3RydWN0IHNvY2sgKnNrOwogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKKwlJTklUX0xJU1RfSEVBRCgmZGVsLmxpc3QpOworCiAJcmVhZF9sb2NrKCZsLT5sb2NrKTsKIAogCWZvciAoc2sgPSBsLT5oZWFkOyBzazsgc2sgPSBsMmNhcF9waShzayktPm5leHRfYykgewpAQCAtNDcwLDIwICs1MjQsMzggQEAKIAkJfQogCiAJCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVCkgewotCQkJaWYgKGwyY2FwX2NoZWNrX3NlY3VyaXR5KHNrKSAmJgotCQkJCQlfX2wyY2FwX25vX2Nvbm5fcGVuZGluZyhzaykpIHsKLQkJCQlzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgcmVxOwotCQkJCXJlcS5zY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKLQkJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOworCQkJc3RydWN0IGwyY2FwX2Nvbm5fcmVxIHJlcTsKIAotCQkJCWwyY2FwX3BpKHNrKS0+aWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7Ci0JCQkJbDJjYXBfcGkoc2spLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfQ09OTkVDVF9QRU5EOwotCi0JCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKLQkJCQkJTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJCWlmICghbDJjYXBfY2hlY2tfc2VjdXJpdHkoc2spIHx8CisJCQkJCSFfX2wyY2FwX25vX2Nvbm5fcGVuZGluZyhzaykpIHsKKwkJCQliaF91bmxvY2tfc29jayhzayk7CisJCQkJY29udGludWU7CiAJCQl9CisKKwkJCWlmICghbDJjYXBfbW9kZV9zdXBwb3J0ZWQobDJjYXBfcGkoc2spLT5tb2RlLAorCQkJCQljb25uLT5mZWF0X21hc2spCisJCQkJCSYmIGwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSAmCisJCQkJCUwyQ0FQX0NPTkZfU1RBVEUyX0RFVklDRSkgeworCQkJCXRtcDEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja19kZWxfbGlzdCksCisJCQkJCQlHRlBfQVRPTUlDKTsKKwkJCQl0bXAxLT5zayA9IHNrOworCQkJCWxpc3RfYWRkX3RhaWwoJnRtcDEtPmxpc3QsICZkZWwubGlzdCk7CisJCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyZXEuc2NpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOworCisJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOworCQkJbDJjYXBfcGkoc2spLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfQ09OTkVDVF9QRU5EOworCisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9waShzayktPmlkZW50LAorCQkJCUwyQ0FQX0NPTk5fUkVRLCBzaXplb2YocmVxKSwgJnJlcSk7CisKIAkJfSBlbHNlIGlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVDIpIHsKIAkJCXN0cnVjdCBsMmNhcF9jb25uX3JzcCByc3A7CisJCQljaGFyIGJ1ZlsxMjhdOwogCQkJcnNwLnNjaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwogCQkJcnNwLmRjaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOwogCkBAIC01MDYsMTIgKzU3OCwzMSBAQAogCiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9waShzayktPmlkZW50LAogCQkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCisJCQlpZiAobDJjYXBfcGkoc2spLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9SRVFfU0VOVCB8fAorCQkJCQlyc3AucmVzdWx0ICE9IEwyQ0FQX0NSX1NVQ0NFU1MpIHsKKwkJCQliaF91bmxvY2tfc29jayhzayk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX1JFUV9TRU5UOworCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKKwkJCQkJCWwyY2FwX2J1aWxkX2NvbmZfcmVxKHNrLCBidWYpLCBidWYpOworCQkJbDJjYXBfcGkoc2spLT5udW1fY29uZl9yZXErKzsKIAkJfQogCiAJCWJoX3VubG9ja19zb2NrKHNrKTsKIAl9CiAKIAlyZWFkX3VubG9jaygmbC0+bG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wMSwgdG1wMiwgJmRlbC5saXN0LCBsaXN0KSB7CisJCWJoX2xvY2tfc29jayh0bXAxLT5zayk7CisJCV9fbDJjYXBfc29ja19jbG9zZSh0bXAxLT5zaywgRUNPTk5SRVNFVCk7CisJCWJoX3VubG9ja19zb2NrKHRtcDEtPnNrKTsKKwkJbGlzdF9kZWwoJnRtcDEtPmxpc3QpOworCQlrZnJlZSh0bXAxKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGwyY2FwX2Nvbm5fcmVhZHkoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4pCkBAIC03NDAsOSArODMxLDggQEAKIAkJCQlzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkgewogCQkJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBsMmNhcF9waShzayktPmNvbm47CiAKLQkJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CiAJCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgc2stPnNrX3NuZHRpbWVvKTsKLQkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY29ubiwgc2spOworCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjb25uLCBzaywgcmVhc29uKTsKIAkJfSBlbHNlCiAJCQlsMmNhcF9jaGFuX2RlbChzaywgcmVhc29uKTsKIAkJYnJlYWs7CkBAIC04MDIsNiArODkyLDcgQEAKIAogCQlwaS0+aW10dSA9IGwyY2FwX3BpKHBhcmVudCktPmltdHU7CiAJCXBpLT5vbXR1ID0gbDJjYXBfcGkocGFyZW50KS0+b210dTsKKwkJcGktPmNvbmZfc3RhdGUgPSBsMmNhcF9waShwYXJlbnQpLT5jb25mX3N0YXRlOwogCQlwaS0+bW9kZSA9IGwyY2FwX3BpKHBhcmVudCktPm1vZGU7CiAJCXBpLT5mY3MgID0gbDJjYXBfcGkocGFyZW50KS0+ZmNzOwogCQlwaS0+bWF4X3R4ID0gbDJjYXBfcGkocGFyZW50KS0+bWF4X3R4OwpAQCAtODEyLDEzICs5MDMsMTUgQEAKIAl9IGVsc2UgewogCQlwaS0+aW10dSA9IEwyQ0FQX0RFRkFVTFRfTVRVOwogCQlwaS0+b210dSA9IDA7Ci0JCWlmIChlbmFibGVfZXJ0bSAmJiBzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJaWYgKCFkaXNhYmxlX2VydG0gJiYgc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pIHsKIAkJCXBpLT5tb2RlID0gTDJDQVBfTU9ERV9FUlRNOwotCQllbHNlCisJCQlwaS0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX1NUQVRFMl9ERVZJQ0U7CisJCX0gZWxzZSB7CiAJCQlwaS0+bW9kZSA9IEwyQ0FQX01PREVfQkFTSUM7Ci0JCXBpLT5tYXhfdHggPSBtYXhfdHJhbnNtaXQ7CisJCX0KKwkJcGktPm1heF90eCA9IEwyQ0FQX0RFRkFVTFRfTUFYX1RYOwogCQlwaS0+ZmNzICA9IEwyQ0FQX0ZDU19DUkMxNjsKLQkJcGktPnR4X3dpbiA9IHR4X3dpbmRvdzsKKwkJcGktPnR4X3dpbiA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOwogCQlwaS0+c2VjX2xldmVsID0gQlRfU0VDVVJJVFlfTE9XOwogCQlwaS0+cm9sZV9zd2l0Y2ggPSAwOwogCQlwaS0+Zm9yY2VfcmVsaWFibGUgPSAwOwpAQCAtMTA2Nyw3ICsxMTYwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBMMkNBUF9NT0RFX0VSVE06CiAJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJaWYgKGVuYWJsZV9lcnRtKQorCQlpZiAoIWRpc2FibGVfZXJ0bSkKIAkJCWJyZWFrOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgpAQCAtMTA4NCw2ICsxMTc3LDcgQEAKIAogCWNhc2UgQlRfQ09OTkVDVEVEOgogCQkvKiBBbHJlYWR5IGNvbm5lY3RlZCAqLworCQllcnIgPSAtRUlTQ09OTjsKIAkJZ290byBkb25lOwogCiAJY2FzZSBCVF9PUEVOOgpAQCAtMTEzMiw3ICsxMjI2LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBMMkNBUF9NT0RFX0VSVE06CiAJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJaWYgKGVuYWJsZV9lcnRtKQorCQlpZiAoIWRpc2FibGVfZXJ0bSkKIAkJCWJyZWFrOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgpAQCAtMTI4NSw5ICsxMzc5LDExIEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gKHZvaWQgKikgYXJnOwogCisJQlRfREJHKCJzayAlcCIsIHNrKTsKKwogCWJoX2xvY2tfc29jayhzayk7CiAJaWYgKGwyY2FwX3BpKHNrKS0+cmV0cnlfY291bnQgPj0gbDJjYXBfcGkoc2spLT5yZW1vdGVfbWF4X3R4KSB7Ci0JCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEobDJjYXBfcGkoc2spLT5jb25uLCBzayk7CisJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEobDJjYXBfcGkoc2spLT5jb25uLCBzaywgRUNPTk5BQk9SVEVEKTsKIAkJYmhfdW5sb2NrX3NvY2soc2spOwogCQlyZXR1cm47CiAJfQpAQCAtMTMwMyw2ICsxMzk5LDggQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSAodm9pZCAqKSBhcmc7CiAKKwlCVF9EQkcoInNrICVwIiwgc2spOworCiAJYmhfbG9ja19zb2NrKHNrKTsKIAlsMmNhcF9waShzayktPnJldHJ5X2NvdW50ID0gMTsKIAlfX21vZF9tb25pdG9yX3RpbWVyKCk7CkBAIC0xMzQxLDcgKzE0MzksNyBAQAogCWhjaV9zZW5kX2FjbChwaS0+Y29ubi0+aGNvbiwgc2tiLCAwKTsKIH0KIAotc3RhdGljIGludCBsMmNhcF9zdHJlYW1pbmdfc2VuZChzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCBsMmNhcF9zdHJlYW1pbmdfc2VuZChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnR4X3NrYjsKIAlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOwpAQCAtMTM3MSw3ICsxNDY5LDYgQEAKIAkJc2tiID0gc2tiX2RlcXVldWUoVFhfUVVFVUUoc2spKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBsMmNhcF9yZXRyYW5zbWl0X29uZV9mcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHU4IHR4X3NlcSkKQEAgLTEzOTUsMTUgKzE0OTIsMjIgQEAKIAogCWlmIChwaS0+cmVtb3RlX21heF90eCAmJgogCQkJYnRfY2Ioc2tiKS0+cmV0cmllcyA9PSBwaS0+cmVtb3RlX21heF90eCkgewotCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzayk7CisJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEocGktPmNvbm4sIHNrLCBFQ09OTkFCT1JURUQpOwogCQlyZXR1cm47CiAJfQogCiAJdHhfc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAJYnRfY2Ioc2tiKS0+cmV0cmllcysrOwogCWNvbnRyb2wgPSBnZXRfdW5hbGlnbmVkX2xlMTYodHhfc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOworCisJaWYgKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TRU5EX0ZCSVQpIHsKKwkJY29udHJvbCB8PSBMMkNBUF9DVFJMX0ZJTkFMOworCQlwaS0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9TRU5EX0ZCSVQ7CisJfQorCiAJY29udHJvbCB8PSAocGktPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQpCiAJCQl8ICh0eF9zZXEgPDwgTDJDQVBfQ1RSTF9UWFNFUV9TSElGVCk7CisKIAlwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgdHhfc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOwogCiAJaWYgKHBpLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KSB7CkBAIC0xNDIxLDE1ICsxNTI1LDE0IEBACiAJdTE2IGNvbnRyb2wsIGZjczsKIAlpbnQgbnNlbnQgPSAwOwogCi0JaWYgKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9XQUlUX0YpCi0JCXJldHVybiAwOworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOwogCi0Jd2hpbGUgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSAmJiAoIWwyY2FwX3R4X3dpbmRvd19mdWxsKHNrKSkgJiYKLQkJCSEocGktPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFTU9URV9CVVNZKSkgeworCXdoaWxlICgoc2tiID0gc2stPnNrX3NlbmRfaGVhZCkgJiYgKCFsMmNhcF90eF93aW5kb3dfZnVsbChzaykpKSB7CiAKIAkJaWYgKHBpLT5yZW1vdGVfbWF4X3R4ICYmCiAJCQkJYnRfY2Ioc2tiKS0+cmV0cmllcyA9PSBwaS0+cmVtb3RlX21heF90eCkgewotCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2spOworCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2ssIEVDT05OQUJPUlRFRCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNDM4LDYgKzE1NDEsOCBAQAogCQlidF9jYihza2IpLT5yZXRyaWVzKys7CiAKIAkJY29udHJvbCA9IGdldF91bmFsaWduZWRfbGUxNih0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CisJCWNvbnRyb2wgJj0gTDJDQVBfQ1RSTF9TQVI7CisKIAkJaWYgKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TRU5EX0ZCSVQpIHsKIAkJCWNvbnRyb2wgfD0gTDJDQVBfQ1RSTF9GSU5BTDsKIAkJCXBpLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1NFTkRfRkJJVDsKQEAgLTE0NzgsMTYgKzE1ODMsMTEgQEAKIAlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2tfYmgoJnBpLT5zZW5kX2xvY2spOwotCiAJaWYgKCFza2JfcXVldWVfZW1wdHkoVFhfUVVFVUUoc2spKSkKIAkJc2stPnNrX3NlbmRfaGVhZCA9IFRYX1FVRVVFKHNrKS0+bmV4dDsKIAogCXBpLT5uZXh0X3R4X3NlcSA9IHBpLT5leHBlY3RlZF9hY2tfc2VxOwogCXJldCA9IGwyY2FwX2VydG1fc2VuZChzayk7Ci0KLQlzcGluX3VubG9ja19iaCgmcGktPnNlbmRfbG9jayk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDk1LDcgKzE1OTUsNiBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKXBpOwogCXUxNiBjb250cm9sID0gMDsKLQlpbnQgbmZyYW1lczsKIAogCWNvbnRyb2wgfD0gcGktPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CiAKQEAgLTE1MDYsMTEgKzE2MDUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZwaS0+c2VuZF9sb2NrKTsKLQluZnJhbWVzID0gbDJjYXBfZXJ0bV9zZW5kKHNrKTsKLQlzcGluX3VubG9ja19iaCgmcGktPnNlbmRfbG9jayk7Ci0KLQlpZiAobmZyYW1lcyA+IDApCisJaWYgKGwyY2FwX2VydG1fc2VuZChzaykgPiAwKQogCQlyZXR1cm47CiAKIAljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9SRUFEWTsKQEAgLTE3MDUsMTAgKzE4MDAsOCBAQAogCQlzaXplICs9IGJ1ZmxlbjsKIAl9CiAJc2tiX3F1ZXVlX3NwbGljZV90YWlsKCZzYXJfcXVldWUsIFRYX1FVRVVFKHNrKSk7Ci0Jc3Bpbl9sb2NrX2JoKCZwaS0+c2VuZF9sb2NrKTsKIAlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBOVUxMKQogCQlzay0+c2tfc2VuZF9oZWFkID0gc2FyX3F1ZXVlLm5leHQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBpLT5zZW5kX2xvY2spOwogCiAJcmV0dXJuIHNpemU7CiB9CkBAIC0xNzUzLDcgKzE4NDYsNyBAQAogCWNhc2UgTDJDQVBfTU9ERV9CQVNJQzoKIAkJLyogQ2hlY2sgb3V0Z29pbmcgTVRVICovCiAJCWlmIChsZW4gPiBwaS0+b210dSkgewotCQkJZXJyID0gLUVJTlZBTDsKKwkJCWVyciA9IC1FTVNHU0laRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCkBAIC0xNzgwLDE0ICsxODczLDkgQEAKIAkJCX0KIAkJCV9fc2tiX3F1ZXVlX3RhaWwoVFhfUVVFVUUoc2spLCBza2IpOwogCi0JCQlpZiAocGktPm1vZGUgPT0gTDJDQVBfTU9ERV9FUlRNKQotCQkJCXNwaW5fbG9ja19iaCgmcGktPnNlbmRfbG9jayk7Ci0KIAkJCWlmIChzay0+c2tfc2VuZF9oZWFkID09IE5VTEwpCiAJCQkJc2stPnNrX3NlbmRfaGVhZCA9IHNrYjsKIAotCQkJaWYgKHBpLT5tb2RlID09IEwyQ0FQX01PREVfRVJUTSkKLQkJCQlzcGluX3VubG9ja19iaCgmcGktPnNlbmRfbG9jayk7CiAJCX0gZWxzZSB7CiAJCS8qIFNlZ21lbnQgU0RVIGludG8gbXVsdGlwbGVzIFBEVXMgKi8KIAkJCWVyciA9IGwyY2FwX3Nhcl9zZWdtZW50X3NkdShzaywgbXNnLCBsZW4pOwpAQCAtMTc5NiwxMSArMTg4NCwxNCBAQAogCQl9CiAKIAkJaWYgKHBpLT5tb2RlID09IEwyQ0FQX01PREVfU1RSRUFNSU5HKSB7Ci0JCQllcnIgPSBsMmNhcF9zdHJlYW1pbmdfc2VuZChzayk7CisJCQlsMmNhcF9zdHJlYW1pbmdfc2VuZChzayk7CiAJCX0gZWxzZSB7Ci0JCQlzcGluX2xvY2tfYmgoJnBpLT5zZW5kX2xvY2spOworCQkJaWYgKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9SRU1PVEVfQlVTWSAmJgorCQkJCQlwaS0+Y29ubl9zdGF0ZSAmJiBMMkNBUF9DT05OX1dBSVRfRikgeworCQkJCWVyciA9IGxlbjsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWVyciA9IGwyY2FwX2VydG1fc2VuZChzayk7Ci0JCQlzcGluX3VubG9ja19iaCgmcGktPnNlbmRfbG9jayk7CiAJCX0KIAogCQlpZiAoZXJyID49IDApCkBAIC0xODA5LDcgKzE5MDAsNyBAQAogCiAJZGVmYXVsdDoKIAkJQlRfREJHKCJiYWQgc3RhdGUgJTEuMXgiLCBwaS0+bW9kZSk7Ci0JCWVyciA9IC1FSU5WQUw7CisJCWVyciA9IC1FQkFERkQ7CiAJfQogCiBkb25lOgpAQCAtMTgyNSw2ICsxOTE2LDggQEAKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVDIgJiYgYnRfc2soc2spLT5kZWZlcl9zZXR1cCkgewogCQlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOworCQlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGwyY2FwX3BpKHNrKS0+Y29ubjsKKwkJdTggYnVmWzEyOF07CiAKIAkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOwogCkBAIC0xODM1LDYgKzE5MjgsMTYgQEAKIAkJbDJjYXBfc2VuZF9jbWQobDJjYXBfcGkoc2spLT5jb25uLCBsMmNhcF9waShzayktPmlkZW50LAogCQkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOwogCisJCWlmIChsMmNhcF9waShzayktPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1JFUV9TRU5UKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlsMmNhcF9waShzayktPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9SRVFfU0VOVDsKKwkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKKwkJCQlsMmNhcF9idWlsZF9jb25mX3JlcShzaywgYnVmKSwgYnVmKTsKKwkJbDJjYXBfcGkoc2spLT5udW1fY29uZl9yZXErKzsKKwogCQlyZWxlYXNlX3NvY2soc2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xODcxLDEzICsxOTc0LDE5IEBACiAJCQlicmVhazsKIAkJfQogCisJCWlmIChvcHRzLnR4d2luX3NpemUgPiBMMkNBUF9ERUZBVUxUX1RYX1dJTkRPVykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKIAkJbDJjYXBfcGkoc2spLT5tb2RlID0gb3B0cy5tb2RlOwogCQlzd2l0Y2ggKGwyY2FwX3BpKHNrKS0+bW9kZSkgewogCQljYXNlIEwyQ0FQX01PREVfQkFTSUM6CisJCQlsMmNhcF9waShzayktPmNvbmZfc3RhdGUgJj0gfkwyQ0FQX0NPTkZfU1RBVEUyX0RFVklDRTsKIAkJCWJyZWFrOwogCQljYXNlIEwyQ0FQX01PREVfRVJUTToKIAkJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJCWlmIChlbmFibGVfZXJ0bSkKKwkJCWlmICghZGlzYWJsZV9lcnRtKQogCQkJCWJyZWFrOwogCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWRlZmF1bHQ6CkBAIC0yMTQ1LDYgKzIyNTQsMTAgQEAKIAkJCWVyciA9IGJ0X3NvY2tfd2FpdF9zdGF0ZShzaywgQlRfQ0xPU0VELAogCQkJCQkJCXNrLT5za19saW5nZXJ0aW1lKTsKIAl9CisKKwlpZiAoIWVyciAmJiBzay0+c2tfZXJyKQorCQllcnIgPSAtc2stPnNrX2VycjsKKwogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIzNjUsMjUgKzI0NzgsMTAgQEAKIAogCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdChTUkVKX1FVRVVFKHNrKSk7CiAJX19za2JfcXVldWVfaGVhZF9pbml0KEJVU1lfUVVFVUUoc2spKTsKLQlzcGluX2xvY2tfaW5pdCgmbDJjYXBfcGkoc2spLT5zZW5kX2xvY2spOwogCiAJSU5JVF9XT1JLKCZsMmNhcF9waShzayktPmJ1c3lfd29yaywgbDJjYXBfYnVzeV93b3JrKTsKLX0KIAotc3RhdGljIGludCBsMmNhcF9tb2RlX3N1cHBvcnRlZChfX3U4IG1vZGUsIF9fdTMyIGZlYXRfbWFzaykKLXsKLQl1MzIgbG9jYWxfZmVhdF9tYXNrID0gbDJjYXBfZmVhdF9tYXNrOwotCWlmIChlbmFibGVfZXJ0bSkKLQkJbG9jYWxfZmVhdF9tYXNrIHw9IEwyQ0FQX0ZFQVRfRVJUTSB8IEwyQ0FQX0ZFQVRfU1RSRUFNSU5HOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBMMkNBUF9NT0RFX0VSVE06Ci0JCXJldHVybiBMMkNBUF9GRUFUX0VSVE0gJiBmZWF0X21hc2sgJiBsb2NhbF9mZWF0X21hc2s7Ci0JY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJcmV0dXJuIEwyQ0FQX0ZFQVRfU1RSRUFNSU5HICYgZmVhdF9tYXNrICYgbG9jYWxfZmVhdF9tYXNrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAweDAwOwotCX0KKwlzay0+c2tfYmFja2xvZ19yY3YgPSBsMmNhcF9lcnRtX2RhdGFfcmN2OwogfQogCiBzdGF0aWMgaW5saW5lIF9fdTggbDJjYXBfc2VsZWN0X21vZGUoX191OCBtb2RlLCBfX3UxNiByZW1vdGVfZmVhdF9tYXNrKQpAQCAtMjQxNCwxMCArMjUxMiwxMCBAQAogCXN3aXRjaCAocGktPm1vZGUpIHsKIAljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgogCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgotCQlwaS0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX1NUQVRFMl9ERVZJQ0U7Ci0JCWlmICghbDJjYXBfbW9kZV9zdXBwb3J0ZWQocGktPm1vZGUsIHBpLT5jb25uLT5mZWF0X21hc2spKQotCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2spOwotCQlicmVhazsKKwkJaWYgKHBpLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9TVEFURTJfREVWSUNFKQorCQkJYnJlYWs7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJZGVmYXVsdDoKIAkJcGktPm1vZGUgPSBsMmNhcF9zZWxlY3RfbW9kZShyZmMubW9kZSwgcGktPmNvbm4tPmZlYXRfbWFzayk7CiAJCWJyZWFrOwpAQCAtMjQyOCw2ICsyNTI2LDE0IEBACiAJY2FzZSBMMkNBUF9NT0RFX0JBU0lDOgogCQlpZiAocGktPmltdHUgIT0gTDJDQVBfREVGQVVMVF9NVFUpCiAJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9NVFUsIDIsIHBpLT5pbXR1KTsKKworCQlyZmMubW9kZSAgICAgICAgICAgID0gTDJDQVBfTU9ERV9CQVNJQzsKKwkJcmZjLnR4d2luX3NpemUgICAgICA9IDA7CisJCXJmYy5tYXhfdHJhbnNtaXQgICAgPSAwOworCQlyZmMucmV0cmFuc190aW1lb3V0ID0gMDsKKwkJcmZjLm1vbml0b3JfdGltZW91dCA9IDA7CisJCXJmYy5tYXhfcGR1X3NpemUgICAgPSAwOworCiAJCWJyZWFrOwogCiAJY2FzZSBMMkNBUF9NT0RFX0VSVE06CkBAIC0yNDQwLDkgKzI1NDYsNiBAQAogCQlpZiAoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUgPiBwaS0+Y29ubi0+bXR1IC0gMTApCiAJCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYocGktPmNvbm4tPm10dSAtIDEwKTsKIAotCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsCi0JCQkJCXNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYyk7Ci0KIAkJaWYgKCEocGktPmNvbm4tPmZlYXRfbWFzayAmIEwyQ0FQX0ZFQVRfRkNTKSkKIAkJCWJyZWFrOwogCkBAIC0yNDYzLDkgKzI1NjYsNiBAQAogCQlpZiAoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUgPiBwaS0+Y29ubi0+bXR1IC0gMTApCiAJCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYocGktPmNvbm4tPm10dSAtIDEwKTsKIAotCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsCi0JCQkJCXNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYyk7Ci0KIAkJaWYgKCEocGktPmNvbm4tPmZlYXRfbWFzayAmIEwyQ0FQX0ZFQVRfRkNTKSkKIAkJCWJyZWFrOwogCkBAIC0yNDc3LDYgKzI1NzcsOSBAQAogCQlicmVhazsKIAl9CiAKKwlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsIHNpemVvZihyZmMpLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpICZyZmMpOworCiAJLyogRklYTUU6IE5lZWQgYWN0dWFsIHZhbHVlIG9mIHRoZSBmbHVzaCB0aW1lb3V0ICovCiAJLy9pZiAoZmx1c2hfdG8gIT0gTDJDQVBfREVGQVVMVF9GTFVTSF9UTykKIAkvLyAgIGwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0ZMVVNIX1RPLCAyLCBwaS0+Zmx1c2hfdG8pOwpAQCAtMjU0MSwxOCArMjY0NCwyMSBAQAogCQl9CiAJfQogCi0JaWYgKHBpLT5udW1fY29uZl9yc3AgfHwgcGktPm51bV9jb25mX3JlcSkKKwlpZiAocGktPm51bV9jb25mX3JzcCB8fCBwaS0+bnVtX2NvbmZfcmVxID4gMSkKIAkJZ290byBkb25lOwogCiAJc3dpdGNoIChwaS0+bW9kZSkgewogCWNhc2UgTDJDQVBfTU9ERV9TVFJFQU1JTkc6CiAJY2FzZSBMMkNBUF9NT0RFX0VSVE06Ci0JCXBpLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfU1RBVEUyX0RFVklDRTsKLQkJaWYgKCFsMmNhcF9tb2RlX3N1cHBvcnRlZChwaS0+bW9kZSwgcGktPmNvbm4tPmZlYXRfbWFzaykpCisJCWlmICghKHBpLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9TVEFURTJfREVWSUNFKSkgeworCQkJcGktPm1vZGUgPSBsMmNhcF9zZWxlY3RfbW9kZShyZmMubW9kZSwKKwkJCQkJcGktPmNvbm4tPmZlYXRfbWFzayk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwaS0+bW9kZSAhPSByZmMubW9kZSkKIAkJCXJldHVybiAtRUNPTk5SRUZVU0VEOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwaS0+bW9kZSA9IGwyY2FwX3NlbGVjdF9tb2RlKHJmYy5tb2RlLCBwaS0+Y29ubi0+ZmVhdF9tYXNrKTsKKwogCQlicmVhazsKIAl9CiAKQEAgLTI2NzUsNyArMjc4MSw2IEBACiAJCQkJCQkJcmZjLm1vZGUgIT0gcGktPm1vZGUpCiAJCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAKLQkJCXBpLT5tb2RlID0gcmZjLm1vZGU7CiAJCQlwaS0+ZmNzID0gMDsKIAogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLApAQCAtMjY4NCw2ICsyNzg5LDExIEBACiAJCX0KIAl9CiAKKwlpZiAocGktPm1vZGUgPT0gTDJDQVBfTU9ERV9CQVNJQyAmJiBwaS0+bW9kZSAhPSByZmMubW9kZSkKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisKKwlwaS0+bW9kZSA9IHJmYy5tb2RlOworCiAJaWYgKCpyZXN1bHQgPT0gTDJDQVBfQ09ORl9TVUNDRVNTKSB7CiAJCXN3aXRjaCAocmZjLm1vZGUpIHsKIAkJY2FzZSBMMkNBUF9NT0RFX0VSVE06CkBAIC0yNzc4LDcgKzI4ODgsNyBAQAogCXN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmxpc3QgPSAmY29ubi0+Y2hhbl9saXN0OwogCXN0cnVjdCBsMmNhcF9jb25uX3JlcSAqcmVxID0gKHN0cnVjdCBsMmNhcF9jb25uX3JlcSAqKSBkYXRhOwogCXN0cnVjdCBsMmNhcF9jb25uX3JzcCByc3A7Ci0Jc3RydWN0IHNvY2sgKnNrLCAqcGFyZW50OworCXN0cnVjdCBzb2NrICpwYXJlbnQsICp1bmluaXRpYWxpemVkX3Zhcihzayk7CiAJaW50IHJlc3VsdCwgc3RhdHVzID0gTDJDQVBfQ1NfTk9fSU5GTzsKIAogCXUxNiBkY2lkID0gMCwgc2NpZCA9IF9fbGUxNl90b19jcHUocmVxLT5zY2lkKTsKQEAgLTI4ODcsNiArMjk5NywxNSBAQAogCQkJCQlMMkNBUF9JTkZPX1JFUSwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CiAJfQogCisJaWYgKCEobDJjYXBfcGkoc2spLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9SRVFfU0VOVCkgJiYKKwkJCQlyZXN1bHQgPT0gTDJDQVBfQ1JfU1VDQ0VTUykgeworCQl1OCBidWZbMTI4XTsKKwkJbDJjYXBfcGkoc2spLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfUkVRX1NFTlQ7CisJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCisJCQkJCWwyY2FwX2J1aWxkX2NvbmZfcmVxKHNrLCBidWYpLCBidWYpOworCQlsMmNhcF9waShzayktPm51bV9jb25mX3JlcSsrOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yOTA3LDExICszMDI2LDExIEBACiAJaWYgKHNjaWQpIHsKIAkJc2sgPSBsMmNhcF9nZXRfY2hhbl9ieV9zY2lkKCZjb25uLT5jaGFuX2xpc3QsIHNjaWQpOwogCQlpZiAoIXNrKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UgewogCQlzayA9IGwyY2FwX2dldF9jaGFuX2J5X2lkZW50KCZjb25uLT5jaGFuX2xpc3QsIGNtZC0+aWRlbnQpOwogCQlpZiAoIXNrKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlzd2l0Y2ggKHJlc3VsdCkgewpAQCAtMjkxOSw5ICszMDM4LDEzIEBACiAJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKIAkJbDJjYXBfcGkoc2spLT5pZGVudCA9IDA7CiAJCWwyY2FwX3BpKHNrKS0+ZGNpZCA9IGRjaWQ7Ci0JCWwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX1JFUV9TRU5UOwogCQlsMmNhcF9waShzayktPmNvbmZfc3RhdGUgJj0gfkwyQ0FQX0NPTkZfQ09OTkVDVF9QRU5EOwogCisJCWlmIChsMmNhcF9waShzayktPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1JFUV9TRU5UKQorCQkJYnJlYWs7CisKKwkJbDJjYXBfcGkoc2spLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfUkVRX1NFTlQ7CisKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKIAkJCQkJbDJjYXBfYnVpbGRfY29uZl9yZXEoc2ssIHJlcSksIHJlcSk7CiAJCWwyY2FwX3BpKHNrKS0+bnVtX2NvbmZfcmVxKys7CkBAIC0yOTU3LDggKzMwODAsMTQgQEAKIAlpZiAoIXNrKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfRElTQ09OTikKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTkZJRykgeworCQlzdHJ1Y3QgbDJjYXBfY21kX3JlaiByZWo7CisKKwkJcmVqLnJlYXNvbiA9IGNwdV90b19sZTE2KDB4MDAwMik7CisJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0NPTU1BTkRfUkVKLAorCQkJCXNpemVvZihyZWopLCAmcmVqKTsKIAkJZ290byB1bmxvY2s7CisJfQogCiAJLyogUmVqZWN0IGlmIGNvbmZpZyBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLwogCWxlbiA9IGNtZF9sZW4gLSBzaXplb2YoKnJlcSk7CkBAIC0yOTg0LDcgKzMxMTMsNyBAQAogCS8qIENvbXBsZXRlIGNvbmZpZy4gKi8KIAlsZW4gPSBsMmNhcF9wYXJzZV9jb25mX3JlcShzaywgcnNwKTsKIAlpZiAobGVuIDwgMCkgewotCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNvbm4sIHNrKTsKKwkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjb25uLCBzaywgRUNPTk5SRVNFVCk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtMzA1NCw3ICszMTgzLDcgQEAKIAkJCWNoYXIgcmVxWzY0XTsKIAogCQkJaWYgKGxlbiA+IHNpemVvZihyZXEpIC0gc2l6ZW9mKHN0cnVjdCBsMmNhcF9jb25mX3JlcSkpIHsKLQkJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNvbm4sIHNrKTsKKwkJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNvbm4sIHNrLCBFQ09OTlJFU0VUKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAKQEAgLTMwNjMsNyArMzE5Miw3IEBACiAJCQlsZW4gPSBsMmNhcF9wYXJzZV9jb25mX3JzcChzaywgcnNwLT5kYXRhLAogCQkJCQkJCWxlbiwgcmVxLCAmcmVzdWx0KTsKIAkJCWlmIChsZW4gPCAwKSB7Ci0JCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjb25uLCBzayk7CisJCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjb25uLCBzaywgRUNPTk5SRVNFVCk7CiAJCQkJZ290byBkb25lOwogCQkJfQogCkBAIC0zMDc2LDEwICszMjA1LDkgQEAKIAkJfQogCiAJZGVmYXVsdDoKLQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKIAkJc2stPnNrX2VyciA9IEVDT05OUkVTRVQ7CiAJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWiAqIDUpOwotCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNvbm4sIHNrKTsKKwkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjb25uLCBzaywgRUNPTk5SRVNFVCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTMxMzAsMTYgKzMyNTgsNiBAQAogCiAJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKIAotCXNrYl9xdWV1ZV9wdXJnZShUWF9RVUVVRShzaykpOwotCi0JaWYgKGwyY2FwX3BpKHNrKS0+bW9kZSA9PSBMMkNBUF9NT0RFX0VSVE0pIHsKLQkJc2tiX3F1ZXVlX3B1cmdlKFNSRUpfUVVFVUUoc2spKTsKLQkJc2tiX3F1ZXVlX3B1cmdlKEJVU1lfUVVFVUUoc2spKTsKLQkJZGVsX3RpbWVyKCZsMmNhcF9waShzayktPnJldHJhbnNfdGltZXIpOwotCQlkZWxfdGltZXIoJmwyY2FwX3BpKHNrKS0+bW9uaXRvcl90aW1lcik7Ci0JCWRlbF90aW1lcigmbDJjYXBfcGkoc2spLT5hY2tfdGltZXIpOwotCX0KLQogCWwyY2FwX2NoYW5fZGVsKHNrLCBFQ09OTlJFU0VUKTsKIAliaF91bmxvY2tfc29jayhzayk7CiAKQEAgLTMxNjIsMTYgKzMyODAsNiBAQAogCWlmICghc2spCiAJCXJldHVybiAwOwogCi0Jc2tiX3F1ZXVlX3B1cmdlKFRYX1FVRVVFKHNrKSk7Ci0KLQlpZiAobDJjYXBfcGkoc2spLT5tb2RlID09IEwyQ0FQX01PREVfRVJUTSkgewotCQlza2JfcXVldWVfcHVyZ2UoU1JFSl9RVUVVRShzaykpOwotCQlza2JfcXVldWVfcHVyZ2UoQlVTWV9RVUVVRShzaykpOwotCQlkZWxfdGltZXIoJmwyY2FwX3BpKHNrKS0+cmV0cmFuc190aW1lcik7Ci0JCWRlbF90aW1lcigmbDJjYXBfcGkoc2spLT5tb25pdG9yX3RpbWVyKTsKLQkJZGVsX3RpbWVyKCZsMmNhcF9waShzayktPmFja190aW1lcik7Ci0JfQotCiAJbDJjYXBfY2hhbl9kZWwoc2ssIDApOwogCWJoX3VubG9ja19zb2NrKHNrKTsKIApAQCAtMzE5NCw3ICszMzAyLDcgQEAKIAkJc3RydWN0IGwyY2FwX2luZm9fcnNwICpyc3AgPSAoc3RydWN0IGwyY2FwX2luZm9fcnNwICopIGJ1ZjsKIAkJcnNwLT50eXBlICAgPSBjcHVfdG9fbGUxNihMMkNBUF9JVF9GRUFUX01BU0spOwogCQlyc3AtPnJlc3VsdCA9IGNwdV90b19sZTE2KEwyQ0FQX0lSX1NVQ0NFU1MpOwotCQlpZiAoZW5hYmxlX2VydG0pCisJCWlmICghZGlzYWJsZV9lcnRtKQogCQkJZmVhdF9tYXNrIHw9IEwyQ0FQX0ZFQVRfRVJUTSB8IEwyQ0FQX0ZFQVRfU1RSRUFNSU5HCiAJCQkJCQkJIHwgTDJDQVBfRkVBVF9GQ1M7CiAJCXB1dF91bmFsaWduZWRfbGUzMihmZWF0X21hc2ssIHJzcC0+ZGF0YSk7CkBAIC0zMzU5LDcgKzM0NjcsNyBAQAogCQlvdXJfZmNzID0gY3JjMTYoMCwgc2tiLT5kYXRhIC0gaGRyX3NpemUsIHNrYi0+bGVuICsgaGRyX3NpemUpOwogCiAJCWlmIChvdXJfZmNzICE9IHJjdl9mY3MpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAtRUJBRE1TRzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzcwLDI1ICszNDc4LDE5IEBACiAJdTE2IGNvbnRyb2wgPSAwOwogCiAJcGktPmZyYW1lc19zZW50ID0gMDsKLQlwaS0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1NFTkRfRkJJVDsKIAogCWNvbnRyb2wgfD0gcGktPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CiAKIAlpZiAocGktPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX0xPQ0FMX0JVU1kpIHsKLQkJY29udHJvbCB8PSBMMkNBUF9TVVBFUl9SQ1ZfTk9UX1JFQURZIHwgTDJDQVBfQ1RSTF9GSU5BTDsKKwkJY29udHJvbCB8PSBMMkNBUF9TVVBFUl9SQ1ZfTk9UX1JFQURZOwogCQlsMmNhcF9zZW5kX3NmcmFtZShwaSwgY29udHJvbCk7CiAJCXBpLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fUk5SX1NFTlQ7Ci0JCXBpLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1NFTkRfRkJJVDsKIAl9CiAKLQlpZiAocGktPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFTU9URV9CVVNZICYmIHBpLT51bmFja2VkX2ZyYW1lcyA+IDApCi0JCV9fbW9kX3JldHJhbnNfdGltZXIoKTsKKwlpZiAocGktPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFTU9URV9CVVNZKQorCQlsMmNhcF9yZXRyYW5zbWl0X2ZyYW1lcyhzayk7CiAKLQlwaS0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9SRU1PVEVfQlVTWTsKLQotCXNwaW5fbG9ja19iaCgmcGktPnNlbmRfbG9jayk7CiAJbDJjYXBfZXJ0bV9zZW5kKHNrKTsKLQlzcGluX3VubG9ja19iaCgmcGktPnNlbmRfbG9jayk7CiAKIAlpZiAoIShwaS0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fTE9DQUxfQlVTWSkgJiYKIAkJCXBpLT5mcmFtZXNfc2VudCA9PSAwKSB7CkBAIC0zNDAwLDYgKzM1MDIsOCBAQAogc3RhdGljIGludCBsMmNhcF9hZGRfdG9fc3Jlal9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHU4IHR4X3NlcSwgdTggc2FyKQogewogCXN0cnVjdCBza19idWZmICpuZXh0X3NrYjsKKwlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOworCWludCB0eF9zZXFfb2Zmc2V0LCBuZXh0X3R4X3NlcV9vZmZzZXQ7CiAKIAlidF9jYihza2IpLT50eF9zZXEgPSB0eF9zZXE7CiAJYnRfY2Ioc2tiKS0+c2FyID0gc2FyOwpAQCAtMzQxMCwxMSArMzUxNCwyMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwl0eF9zZXFfb2Zmc2V0ID0gKHR4X3NlcSAtIHBpLT5idWZmZXJfc2VxKSAlIDY0OworCWlmICh0eF9zZXFfb2Zmc2V0IDwgMCkKKwkJdHhfc2VxX29mZnNldCArPSA2NDsKKwogCWRvIHsKIAkJaWYgKGJ0X2NiKG5leHRfc2tiKS0+dHhfc2VxID09IHR4X3NlcSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChidF9jYihuZXh0X3NrYiktPnR4X3NlcSA+IHR4X3NlcSkgeworCQluZXh0X3R4X3NlcV9vZmZzZXQgPSAoYnRfY2IobmV4dF9za2IpLT50eF9zZXEgLQorCQkJCQkJcGktPmJ1ZmZlcl9zZXEpICUgNjQ7CisJCWlmIChuZXh0X3R4X3NlcV9vZmZzZXQgPCAwKQorCQkJbmV4dF90eF9zZXFfb2Zmc2V0ICs9IDY0OworCisJCWlmIChuZXh0X3R4X3NlcV9vZmZzZXQgPiB0eF9zZXFfb2Zmc2V0KSB7CiAJCQlfX3NrYl9xdWV1ZV9iZWZvcmUoU1JFSl9RVUVVRShzayksIG5leHRfc2tiLCBza2IpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM1MzIsNjIgKzM2NDUsMjcgQEAKIAlwaS0+c2R1ID0gTlVMTDsKIAogZGlzY29ubmVjdDoKLQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzayk7CisJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2ssIEVDT05OUkVTRVQpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9idXN5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIGludCBsMmNhcF90cnlfcHVzaF9yeF9za2Ioc3RydWN0IHNvY2sgKnNrKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGwyY2FwX3BpbmZvLCBidXN5X3dvcmspOwotCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKXBpOwotCWludCBuX3RyaWVzID0gMCwgdGltZW8gPSBIWi81LCBlcnI7CisJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXUxNiBjb250cm9sOworCWludCBlcnI7CiAKLQlsb2NrX3NvY2soc2spOwotCi0JYWRkX3dhaXRfcXVldWUoc2tfc2xlZXAoc2spLCAmd2FpdCk7Ci0Jd2hpbGUgKChza2IgPSBza2JfcGVlayhCVVNZX1FVRVVFKHNrKSkpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJaWYgKG5fdHJpZXMrKyA+IEwyQ0FQX0xPQ0FMX0JVU1lfVFJJRVMpIHsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEocGktPmNvbm4sIHNrKTsKLQkJCWdvdG8gZG9uZTsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKEJVU1lfUVVFVUUoc2spKSkpIHsKKwkJY29udHJvbCA9IGJ0X2NiKHNrYiktPnNhciA8PCBMMkNBUF9DVFJMX1NBUl9TSElGVDsKKwkJZXJyID0gbDJjYXBfZXJ0bV9yZWFzc2VtYmx5X3NkdShzaywgc2tiLCBjb250cm9sKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKEJVU1lfUVVFVUUoc2spLCBza2IpOworCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCi0JCWlmICghdGltZW8pCi0JCQl0aW1lbyA9IEhaLzU7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKLQkJbG9ja19zb2NrKHNrKTsKLQotCQllcnIgPSBzb2NrX2Vycm9yKHNrKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZG9uZTsKLQotCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKEJVU1lfUVVFVUUoc2spKSkpIHsKLQkJCWNvbnRyb2wgPSBidF9jYihza2IpLT5zYXIgPDwgTDJDQVBfQ1RSTF9TQVJfU0hJRlQ7Ci0JCQllcnIgPSBsMmNhcF9lcnRtX3JlYXNzZW1ibHlfc2R1KHNrLCBza2IsIGNvbnRyb2wpOwotCQkJaWYgKGVyciA8IDApIHsKLQkJCQlza2JfcXVldWVfaGVhZChCVVNZX1FVRVVFKHNrKSwgc2tiKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGktPmJ1ZmZlcl9zZXEgPSAocGktPmJ1ZmZlcl9zZXEgKyAxKSAlIDY0OwotCQl9Ci0KLQkJaWYgKCFza2IpCi0JCQlicmVhazsKKwkJcGktPmJ1ZmZlcl9zZXEgPSAocGktPmJ1ZmZlcl9zZXEgKyAxKSAlIDY0OwogCX0KIAogCWlmICghKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9STlJfU0VOVCkpCkBAIC0zNjA3LDYgKzM2ODUsNTIgQEAKIAlwaS0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9MT0NBTF9CVVNZOwogCXBpLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JOUl9TRU5UOwogCisJQlRfREJHKCJzayAlcCwgRXhpdCBsb2NhbCBidXN5Iiwgc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX2J1c3lfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbDJjYXBfcGluZm8sIGJ1c3lfd29yayk7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopcGk7CisJaW50IG5fdHJpZXMgPSAwLCB0aW1lbyA9IEhaLzUsIGVycjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJbG9ja19zb2NrKHNrKTsKKworCWFkZF93YWl0X3F1ZXVlKHNrX3NsZWVwKHNrKSwgJndhaXQpOworCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoQlVTWV9RVUVVRShzaykpKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmIChuX3RyaWVzKysgPiBMMkNBUF9MT0NBTF9CVVNZX1RSSUVTKSB7CisJCQllcnIgPSAtRUJVU1k7CisJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzaywgRUJVU1kpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXRpbWVvKQorCQkJdGltZW8gPSBIWi81OworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJbG9ja19zb2NrKHNrKTsKKworCQllcnIgPSBzb2NrX2Vycm9yKHNrKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWlmIChsMmNhcF90cnlfcHVzaF9yeF9za2Ioc2spID09IDApCisJCQlicmVhazsKKwl9CisKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKHNrKSwgJndhaXQpOwogCkBAIC0zNjIxLDcgKzM3NDUsOSBAQAogCWlmIChwaS0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fTE9DQUxfQlVTWSkgewogCQlidF9jYihza2IpLT5zYXIgPSBjb250cm9sID4+IEwyQ0FQX0NUUkxfU0FSX1NISUZUOwogCQlfX3NrYl9xdWV1ZV90YWlsKEJVU1lfUVVFVUUoc2spLCBza2IpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gbDJjYXBfdHJ5X3B1c2hfcnhfc2tiKHNrKTsKKworCiAJfQogCiAJZXJyID0gbDJjYXBfZXJ0bV9yZWFzc2VtYmx5X3NkdShzaywgc2tiLCBjb250cm9sKTsKQEAgLTM2MzEsNiArMzc1Nyw4IEBACiAJfQogCiAJLyogQnVzeSBDb25kaXRpb24gKi8KKwlCVF9EQkcoInNrICVwLCBFbnRlciBsb2NhbCBidXN5Iiwgc2spOworCiAJcGktPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9MT0NBTF9CVVNZOwogCWJ0X2NiKHNrYiktPnNhciA9IGNvbnRyb2wgPj4gTDJDQVBfQ1RSTF9TQVJfU0hJRlQ7CiAJX19za2JfcXVldWVfdGFpbChCVVNZX1FVRVVFKHNrKSwgc2tiKTsKQEAgLTM2NDEsNiArMzc2OSw4IEBACiAKIAlwaS0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1JOUl9TRU5UOwogCisJZGVsX3RpbWVyKCZwaS0+YWNrX3RpbWVyKTsKKwogCXF1ZXVlX3dvcmsoX2J1c3lfd3EsICZwaS0+YnVzeV93b3JrKTsKIAogCXJldHVybiBlcnI7CkBAIC0zNzU0LDcgKzM4ODQsNyBAQAogCQlsMmNhcF9lcnRtX3JlYXNzZW1ibHlfc2R1KHNrLCBza2IsIGNvbnRyb2wpOwogCQlsMmNhcF9waShzayktPmJ1ZmZlcl9zZXFfc3JlaiA9CiAJCQkobDJjYXBfcGkoc2spLT5idWZmZXJfc2VxX3NyZWogKyAxKSAlIDY0OwotCQl0eF9zZXErKzsKKwkJdHhfc2VxID0gKHR4X3NlcSArIDEpICUgNjQ7CiAJfQogfQogCkBAIC0zNzkwLDEwICszOTIwLDExIEBACiAJCWwyY2FwX3NlbmRfc2ZyYW1lKHBpLCBjb250cm9sKTsKIAogCQluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Jlal9saXN0KSwgR0ZQX0FUT01JQyk7Ci0JCW5ldy0+dHhfc2VxID0gcGktPmV4cGVjdGVkX3R4X3NlcSsrOworCQluZXctPnR4X3NlcSA9IHBpLT5leHBlY3RlZF90eF9zZXE7CisJCXBpLT5leHBlY3RlZF90eF9zZXEgPSAocGktPmV4cGVjdGVkX3R4X3NlcSArIDEpICUgNjQ7CiAJCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgU1JFSl9MSVNUKHNrKSk7CiAJfQotCXBpLT5leHBlY3RlZF90eF9zZXErKzsKKwlwaS0+ZXhwZWN0ZWRfdHhfc2VxID0gKHBpLT5leHBlY3RlZF90eF9zZXEgKyAxKSAlIDY0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBsMmNhcF9kYXRhX2NoYW5uZWxfaWZyYW1lKHN0cnVjdCBzb2NrICpzaywgdTE2IHJ4X2NvbnRyb2wsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0zODAyLDExICszOTMzLDEyIEBACiAJdTggdHhfc2VxID0gX19nZXRfdHhzZXEocnhfY29udHJvbCk7CiAJdTggcmVxX3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKIAl1OCBzYXIgPSByeF9jb250cm9sID4+IEwyQ0FQX0NUUkxfU0FSX1NISUZUOwotCXU4IHR4X3NlcV9vZmZzZXQsIGV4cGVjdGVkX3R4X3NlcV9vZmZzZXQ7CisJaW50IHR4X3NlcV9vZmZzZXQsIGV4cGVjdGVkX3R4X3NlcV9vZmZzZXQ7CiAJaW50IG51bV90b19hY2sgPSAocGktPnR4X3dpbi82KSArIDE7CiAJaW50IGVyciA9IDA7CiAKLQlCVF9EQkcoInNrICVwIHJ4X2NvbnRyb2wgMHglNC40eCBsZW4gJWQiLCBzaywgcnhfY29udHJvbCwgc2tiLT5sZW4pOworCUJUX0RCRygic2sgJXAgbGVuICVkIHR4X3NlcSAlZCByeF9jb250cm9sIDB4JTQuNHgiLCBzaywgc2tiLT5sZW4sIHR4X3NlcSwKKwkJCQkJCQkJcnhfY29udHJvbCk7CiAKIAlpZiAoTDJDQVBfQ1RSTF9GSU5BTCAmIHJ4X2NvbnRyb2wgJiYKIAkJCWwyY2FwX3BpKHNrKS0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fV0FJVF9GKSB7CkBAIC0zODI4LDcgKzM5NjAsNyBAQAogCiAJLyogaW52YWxpZCB0eF9zZXEgKi8KIAlpZiAodHhfc2VxX29mZnNldCA+PSBwaS0+dHhfd2luKSB7Ci0JCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEocGktPmNvbm4sIHNrKTsKKwkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2ssIEVDT05OUkVTRVQpOwogCQlnb3RvIGRyb3A7CiAJfQogCkBAIC0zODUxLDYgKzM5ODMsNyBAQAogCQkJCXBpLT5idWZmZXJfc2VxID0gcGktPmJ1ZmZlcl9zZXFfc3JlajsKIAkJCQlwaS0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9TUkVKX1NFTlQ7CiAJCQkJbDJjYXBfc2VuZF9hY2socGkpOworCQkJCUJUX0RCRygic2sgJXAsIEV4aXQgU1JFSl9TRU5UIiwgc2spOwogCQkJfQogCQl9IGVsc2UgewogCQkJc3RydWN0IHNyZWpfbGlzdCAqbDsKQEAgLTM4NzksNiArNDAxMiw4IEBACiAKIAkJcGktPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9TUkVKX1NFTlQ7CiAKKwkJQlRfREJHKCJzayAlcCwgRW50ZXIgU1JFSiIsIHNrKTsKKwogCQlJTklUX0xJU1RfSEVBRChTUkVKX0xJU1Qoc2spKTsKIAkJcGktPmJ1ZmZlcl9zZXFfc3JlaiA9IHBpLT5idWZmZXJfc2VxOwogCkBAIC0zODg5LDYgKzQwMjQsOCBAQAogCQlwaS0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1NFTkRfUEJJVDsKIAogCQlsMmNhcF9zZW5kX3NyZWpmcmFtZShzaywgdHhfc2VxKTsKKworCQlkZWxfdGltZXIoJnBpLT5hY2tfdGltZXIpOwogCX0KIAlyZXR1cm4gMDsKIApAQCAtMzkwMiw2ICs0MDM5LDEwIEBACiAJCXJldHVybiAwOwogCX0KIAorCWVyciA9IGwyY2FwX3B1c2hfcnhfc2tiKHNrLCBza2IsIHJ4X2NvbnRyb2wpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gMDsKKwogCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9GSU5BTCkgewogCQlpZiAocGktPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFSl9BQ1QpCiAJCQlwaS0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9SRUpfQUNUOwpAQCAtMzkwOSwxMCArNDA1MCw2IEBACiAJCQlsMmNhcF9yZXRyYW5zbWl0X2ZyYW1lcyhzayk7CiAJfQogCi0JZXJyID0gbDJjYXBfcHVzaF9yeF9za2Ioc2ssIHNrYiwgcnhfY29udHJvbCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiAwOwotCiAJX19tb2RfYWNrX3RpbWVyKCk7CiAKIAlwaS0+bnVtX2Fja2VkID0gKHBpLT5udW1fYWNrZWQgKyAxKSAlIG51bV90b19hY2s7CkBAIC0zOTMwLDEwICs0MDY3LDE0IEBACiB7CiAJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKIAorCUJUX0RCRygic2sgJXAsIHJlcV9zZXEgJWQgY3RybCAweCU0LjR4Iiwgc2ssIF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKSwKKwkJCQkJCXJ4X2NvbnRyb2wpOworCiAJcGktPmV4cGVjdGVkX2Fja19zZXEgPSBfX2dldF9yZXFzZXEocnhfY29udHJvbCk7CiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoc2spOwogCiAJaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpIHsKKwkJcGktPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9TRU5EX0ZCSVQ7CiAJCWlmIChwaS0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fU1JFSl9TRU5UKSB7CiAJCQlpZiAoKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9SRU1PVEVfQlVTWSkgJiYKIAkJCQkJKHBpLT51bmFja2VkX2ZyYW1lcyA+IDApKQpAQCAtMzk2Miw5ICs0MTAzLDcgQEAKIAkJaWYgKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TUkVKX1NFTlQpIHsKIAkJCWwyY2FwX3NlbmRfYWNrKHBpKTsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fbG9ja19iaCgmcGktPnNlbmRfbG9jayk7CiAJCQlsMmNhcF9lcnRtX3NlbmQoc2spOwotCQkJc3Bpbl91bmxvY2tfYmgoJnBpLT5zZW5kX2xvY2spOwogCQl9CiAJfQogfQpAQCAtMzk3NCw2ICs0MTEzLDggQEAKIAlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOwogCXU4IHR4X3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKIAorCUJUX0RCRygic2sgJXAsIHJlcV9zZXEgJWQgY3RybCAweCU0LjR4Iiwgc2ssIHR4X3NlcSwgcnhfY29udHJvbCk7CisKIAlwaS0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9SRU1PVEVfQlVTWTsKIAogCXBpLT5leHBlY3RlZF9hY2tfc2VxID0gdHhfc2VxOwpAQCAtMzk5NiwxNiArNDEzNywxOCBAQAogCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPSBsMmNhcF9waShzayk7CiAJdTggdHhfc2VxID0gX19nZXRfcmVxc2VxKHJ4X2NvbnRyb2wpOwogCisJQlRfREJHKCJzayAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTQuNHgiLCBzaywgdHhfc2VxLCByeF9jb250cm9sKTsKKwogCXBpLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JFTU9URV9CVVNZOwogCiAJaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpIHsKIAkJcGktPmV4cGVjdGVkX2Fja19zZXEgPSB0eF9zZXE7CiAJCWwyY2FwX2Ryb3BfYWNrZWRfZnJhbWVzKHNrKTsKKworCQlwaS0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1NFTkRfRkJJVDsKIAkJbDJjYXBfcmV0cmFuc21pdF9vbmVfZnJhbWUoc2ssIHR4X3NlcSk7CiAKLQkJc3Bpbl9sb2NrX2JoKCZwaS0+c2VuZF9sb2NrKTsKIAkJbDJjYXBfZXJ0bV9zZW5kKHNrKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBpLT5zZW5kX2xvY2spOwogCiAJCWlmIChwaS0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fV0FJVF9GKSB7CiAJCQlwaS0+c3Jlal9zYXZlX3JlcXNlcSA9IHR4X3NlcTsKQEAgLTQwMzEsMTAgKzQxNzQsMTUgQEAKIAlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOwogCXU4IHR4X3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKIAorCUJUX0RCRygic2sgJXAsIHJlcV9zZXEgJWQgY3RybCAweCU0LjR4Iiwgc2ssIHR4X3NlcSwgcnhfY29udHJvbCk7CisKIAlwaS0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1JFTU9URV9CVVNZOwogCXBpLT5leHBlY3RlZF9hY2tfc2VxID0gdHhfc2VxOwogCWwyY2FwX2Ryb3BfYWNrZWRfZnJhbWVzKHNrKTsKIAorCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9QT0xMKQorCQlwaS0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1NFTkRfRkJJVDsKKwogCWlmICghKHBpLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TUkVKX1NFTlQpKSB7CiAJCWRlbF90aW1lcigmcGktPnJldHJhbnNfdGltZXIpOwogCQlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfUE9MTCkKQEAgLTQwODIsMTIgKzQyMzAsODMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBsMmNhcF9lcnRtX2RhdGFfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOworCXUxNiBjb250cm9sOworCXU4IHJlcV9zZXE7CisJaW50IGxlbiwgbmV4dF90eF9zZXFfb2Zmc2V0LCByZXFfc2VxX29mZnNldDsKKworCWNvbnRyb2wgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhKTsKKwlza2JfcHVsbChza2IsIDIpOworCWxlbiA9IHNrYi0+bGVuOworCisJLyoKKwkgKiBXZSBjYW4ganVzdCBkcm9wIHRoZSBjb3JydXB0ZWQgSS1mcmFtZSBoZXJlLgorCSAqIFJlY2VpdmVyIHdpbGwgbWlzcyBpdCBhbmQgc3RhcnQgcHJvcGVyIHJlY292ZXJ5CisJICogcHJvY2VkdXJlcyBhbmQgYXNrIHJldHJhbnNtaXNzaW9uLgorCSAqLworCWlmIChsMmNhcF9jaGVja19mY3MocGksIHNrYikpCisJCWdvdG8gZHJvcDsKKworCWlmIChfX2lzX3Nhcl9zdGFydChjb250cm9sKSAmJiBfX2lzX2lmcmFtZShjb250cm9sKSkKKwkJbGVuIC09IDI7CisKKwlpZiAocGktPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCisJCWxlbiAtPSAyOworCisJaWYgKGxlbiA+IHBpLT5tcHMpIHsKKwkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2ssIEVDT05OUkVTRVQpOworCQlnb3RvIGRyb3A7CisJfQorCisJcmVxX3NlcSA9IF9fZ2V0X3JlcXNlcShjb250cm9sKTsKKwlyZXFfc2VxX29mZnNldCA9IChyZXFfc2VxIC0gcGktPmV4cGVjdGVkX2Fja19zZXEpICUgNjQ7CisJaWYgKHJlcV9zZXFfb2Zmc2V0IDwgMCkKKwkJcmVxX3NlcV9vZmZzZXQgKz0gNjQ7CisKKwluZXh0X3R4X3NlcV9vZmZzZXQgPQorCQkocGktPm5leHRfdHhfc2VxIC0gcGktPmV4cGVjdGVkX2Fja19zZXEpICUgNjQ7CisJaWYgKG5leHRfdHhfc2VxX29mZnNldCA8IDApCisJCW5leHRfdHhfc2VxX29mZnNldCArPSA2NDsKKworCS8qIGNoZWNrIGZvciBpbnZhbGlkIHJlcS1zZXEgKi8KKwlpZiAocmVxX3NlcV9vZmZzZXQgPiBuZXh0X3R4X3NlcV9vZmZzZXQpIHsKKwkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShwaS0+Y29ubiwgc2ssIEVDT05OUkVTRVQpOworCQlnb3RvIGRyb3A7CisJfQorCisJaWYgKF9faXNfaWZyYW1lKGNvbnRyb2wpKSB7CisJCWlmIChsZW4gPCAwKSB7CisJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzaywgRUNPTk5SRVNFVCk7CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQlsMmNhcF9kYXRhX2NoYW5uZWxfaWZyYW1lKHNrLCBjb250cm9sLCBza2IpOworCX0gZWxzZSB7CisJCWlmIChsZW4gIT0gMCkgeworCQkJQlRfRVJSKCIlZCIsIGxlbik7CisJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzaywgRUNPTk5SRVNFVCk7CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQlsMmNhcF9kYXRhX2NoYW5uZWxfc2ZyYW1lKHNrLCBjb250cm9sLCBza2IpOworCX0KKworCXJldHVybiAwOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBsMmNhcF9kYXRhX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHUxNiBjaWQsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBsMmNhcF9waW5mbyAqcGk7Ci0JdTE2IGNvbnRyb2wsIGxlbjsKLQl1OCB0eF9zZXEsIHJlcV9zZXEsIG5leHRfdHhfc2VxX29mZnNldCwgcmVxX3NlcV9vZmZzZXQ7CisJdTE2IGNvbnRyb2w7CisJdTggdHhfc2VxOworCWludCBsZW47CiAKIAlzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgY2lkKTsKIAlpZiAoIXNrKSB7CkBAIC00MTE3LDU5ICs0MzM2LDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBMMkNBUF9NT0RFX0VSVE06Ci0JCWNvbnRyb2wgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhKTsKLQkJc2tiX3B1bGwoc2tiLCAyKTsKLQkJbGVuID0gc2tiLT5sZW47Ci0KLQkJaWYgKF9faXNfc2FyX3N0YXJ0KGNvbnRyb2wpKQotCQkJbGVuIC09IDI7Ci0KLQkJaWYgKHBpLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KQotCQkJbGVuIC09IDI7Ci0KLQkJLyoKLQkJICogV2UgY2FuIGp1c3QgZHJvcCB0aGUgY29ycnVwdGVkIEktZnJhbWUgaGVyZS4KLQkJICogUmVjZWl2ZXIgd2lsbCBtaXNzIGl0IGFuZCBzdGFydCBwcm9wZXIgcmVjb3ZlcnkKLQkJICogcHJvY2VkdXJlcyBhbmQgYXNrIHJldHJhbnNtaXNzaW9uLgotCQkgKi8KLQkJaWYgKGxlbiA+IHBpLT5tcHMpIHsKLQkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEocGktPmNvbm4sIHNrKTsKLQkJCWdvdG8gZHJvcDsKLQkJfQotCi0JCWlmIChsMmNhcF9jaGVja19mY3MocGksIHNrYikpCi0JCQlnb3RvIGRyb3A7Ci0KLQkJcmVxX3NlcSA9IF9fZ2V0X3JlcXNlcShjb250cm9sKTsKLQkJcmVxX3NlcV9vZmZzZXQgPSAocmVxX3NlcSAtIHBpLT5leHBlY3RlZF9hY2tfc2VxKSAlIDY0OwotCQlpZiAocmVxX3NlcV9vZmZzZXQgPCAwKQotCQkJcmVxX3NlcV9vZmZzZXQgKz0gNjQ7Ci0KLQkJbmV4dF90eF9zZXFfb2Zmc2V0ID0KLQkJCShwaS0+bmV4dF90eF9zZXEgLSBwaS0+ZXhwZWN0ZWRfYWNrX3NlcSkgJSA2NDsKLQkJaWYgKG5leHRfdHhfc2VxX29mZnNldCA8IDApCi0JCQluZXh0X3R4X3NlcV9vZmZzZXQgKz0gNjQ7Ci0KLQkJLyogY2hlY2sgZm9yIGludmFsaWQgcmVxLXNlcSAqLwotCQlpZiAocmVxX3NlcV9vZmZzZXQgPiBuZXh0X3R4X3NlcV9vZmZzZXQpIHsKLQkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEocGktPmNvbm4sIHNrKTsKLQkJCWdvdG8gZHJvcDsKLQkJfQotCi0JCWlmIChfX2lzX2lmcmFtZShjb250cm9sKSkgewotCQkJaWYgKGxlbiA8IDQpIHsKLQkJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzayk7Ci0JCQkJZ290byBkcm9wOwotCQkJfQotCi0JCQlsMmNhcF9kYXRhX2NoYW5uZWxfaWZyYW1lKHNrLCBjb250cm9sLCBza2IpOworCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJCWwyY2FwX2VydG1fZGF0YV9yY3Yoc2ssIHNrYik7CiAJCX0gZWxzZSB7Ci0JCQlpZiAobGVuICE9IDApIHsKLQkJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHBpLT5jb25uLCBzayk7CisJCQlpZiAoc2tfYWRkX2JhY2tsb2coc2ssIHNrYikpCiAJCQkJZ290byBkcm9wOwotCQkJfQotCi0JCQlsMmNhcF9kYXRhX2NoYW5uZWxfc2ZyYW1lKHNrLCBjb250cm9sLCBza2IpOwogCQl9CiAKIAkJZ290byBkb25lOwpAQCAtNDE3OSwxNiArNDM1MCwxNiBAQAogCQlza2JfcHVsbChza2IsIDIpOwogCQlsZW4gPSBza2ItPmxlbjsKIAorCQlpZiAobDJjYXBfY2hlY2tfZmNzKHBpLCBza2IpKQorCQkJZ290byBkcm9wOworCiAJCWlmIChfX2lzX3Nhcl9zdGFydChjb250cm9sKSkKIAkJCWxlbiAtPSAyOwogCiAJCWlmIChwaS0+ZmNzID09IEwyQ0FQX0ZDU19DUkMxNikKIAkJCWxlbiAtPSAyOwogCi0JCWlmIChsZW4gPiBwaS0+bXBzIHx8IGxlbiA8IDQgfHwgX19pc19zZnJhbWUoY29udHJvbCkpCi0JCQlnb3RvIGRyb3A7Ci0KLQkJaWYgKGwyY2FwX2NoZWNrX2ZjcyhwaSwgc2tiKSkKKwkJaWYgKGxlbiA+IHBpLT5tcHMgfHwgbGVuIDwgMCB8fCBfX2lzX3NmcmFtZShjb250cm9sKSkKIAkJCWdvdG8gZHJvcDsKIAogCQl0eF9zZXEgPSBfX2dldF90eHNlcShjb250cm9sKTsKQEAgLTQyODgsNyArNDQ1OSw3IEBACiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAKIAlpZiAodHlwZSAhPSBBQ0xfTElOSykKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCiAJQlRfREJHKCJoZGV2ICVzLCBiZGFkZHIgJXMiLCBoZGV2LT5uYW1lLCBiYXRvc3RyKGJkYWRkcikpOwogCkBAIC00MzIxLDcgKzQ0OTIsNyBAQAogCUJUX0RCRygiaGNvbiAlcCBiZGFkZHIgJXMgc3RhdHVzICVkIiwgaGNvbiwgYmF0b3N0cigmaGNvbi0+ZHN0KSwgc3RhdHVzKTsKIAogCWlmIChoY29uLT50eXBlICE9IEFDTF9MSU5LKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXN0YXR1cykgewogCQljb25uID0gbDJjYXBfY29ubl9hZGQoaGNvbiwgc3RhdHVzKTsKQEAgLTQzNTAsNyArNDUyMSw3IEBACiAJQlRfREJHKCJoY29uICVwIHJlYXNvbiAlZCIsIGhjb24sIHJlYXNvbik7CiAKIAlpZiAoaGNvbi0+dHlwZSAhPSBBQ0xfTElOSykKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCiAJbDJjYXBfY29ubl9kZWwoaGNvbiwgYnRfZXJyKHJlYXNvbikpOwogCkBAIC00Njc5LDE0ICs0ODUwLDggQEAKIG1vZHVsZV9pbml0KGwyY2FwX2luaXQpOwogbW9kdWxlX2V4aXQobDJjYXBfZXhpdCk7CiAKLW1vZHVsZV9wYXJhbShlbmFibGVfZXJ0bSwgYm9vbCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9lcnRtLCAiRW5hYmxlIGVuaGFuY2VkIHJldHJhbnNtaXNzaW9uIG1vZGUiKTsKLQotbW9kdWxlX3BhcmFtKG1heF90cmFuc21pdCwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1heF90cmFuc21pdCwgIk1heCB0cmFuc21pdCB2YWx1ZSAoZGVmYXVsdCA9IDMpIik7Ci0KLW1vZHVsZV9wYXJhbSh0eF93aW5kb3csIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh0eF93aW5kb3csICJUcmFuc21pc3Npb24gd2luZG93IHNpemUgdmFsdWUgKGRlZmF1bHQgPSA2MykiKTsKK21vZHVsZV9wYXJhbShkaXNhYmxlX2VydG0sIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2VydG0sICJEaXNhYmxlIGVuaGFuY2VkIHJldHJhbnNtaXNzaW9uIG1vZGUiKTsKIAogTU9EVUxFX0FVVEhPUigiTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggTDJDQVAgdmVyICIgVkVSU0lPTik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKaW5kZXggNDNmYmY2Yi4uNDRhNjIzMiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi12b2lkIHJmY29tbV9jbGVhbnVwX3NvY2tldHModm9pZCkKK3ZvaWQgX19leGl0IHJmY29tbV9jbGVhbnVwX3NvY2tldHModm9pZCkKIHsKIAlkZWJ1Z2ZzX3JlbW92ZShyZmNvbW1fc29ja19kZWJ1Z2ZzKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwppbmRleCAzMDliNmMyLi4wMjYyMDVjIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIAkudGlvY21zZXQJCT0gcmZjb21tX3R0eV90aW9jbXNldCwKIH07CiAKLWludCByZmNvbW1faW5pdF90dHlzKHZvaWQpCitpbnQgX19pbml0IHJmY29tbV9pbml0X3R0eXModm9pZCkKIHsKIAlyZmNvbW1fdHR5X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoUkZDT01NX1RUWV9QT1JUUyk7CiAJaWYgKCFyZmNvbW1fdHR5X2RyaXZlcikKQEAgLTExODMsNyArMTE4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcmZjb21tX2NsZWFudXBfdHR5cyh2b2lkKQordm9pZCBfX2V4aXQgcmZjb21tX2NsZWFudXBfdHR5cyh2b2lkKQogewogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcik7CiAJcHV0X3R0eV9kcml2ZXIocmZjb21tX3R0eV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9ici5jIGIvbmV0L2JyaWRnZS9ici5jCmluZGV4IDc2MzU3YjUuLmM4NDM2ZmEgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnIuYworKysgYi9uZXQvYnJpZGdlL2JyLmMKQEAgLTYzLDcgKzYzLDYgQEAKIAkJZ290byBlcnJfb3V0NDsKIAogCWJyaW9jdGxfc2V0KGJyX2lvY3RsX2RldmljZWxlc3Nfc3R1Yik7Ci0JYnJfaGFuZGxlX2ZyYW1lX2hvb2sgPSBicl9oYW5kbGVfZnJhbWU7CiAKICNpZiBkZWZpbmVkKENPTkZJR19BVE1fTEFORSkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0xBTkVfTU9EVUxFKQogCWJyX2ZkYl90ZXN0X2FkZHJfaG9vayA9IGJyX2ZkYl90ZXN0X2FkZHI7CkBAIC0xMDAsNyArOTksNiBAQAogCWJyX2ZkYl90ZXN0X2FkZHJfaG9vayA9IE5VTEw7CiAjZW5kaWYKIAotCWJyX2hhbmRsZV9mcmFtZV9ob29rID0gTlVMTDsKIAlicl9mZGJfZmluaSgpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCA3NTNmYzQyLi5jZjA5ZmU1OSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKLS8qIG5ldCBkZXZpY2UgdHJhbnNtaXQgYWx3YXlzIGNhbGxlZCB3aXRoIG5vIEJIIChwcmVlbXB0X2Rpc2FibGVkKSAqLworLyogbmV0IGRldmljZSB0cmFuc21pdCBhbHdheXMgY2FsbGVkIHdpdGggQkggZGlzYWJsZWQgKi8KIG5ldGRldl90eF90IGJyX2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTM4LDE3ICszOCwyNiBAQAogCX0KICNlbmRpZgogCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYnJzdGF0cy0+c3luY3ApOwogCWJyc3RhdHMtPnR4X3BhY2tldHMrKzsKIAlicnN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYnJzdGF0cy0+c3luY3ApOwogCiAJQlJfSU5QVVRfU0tCX0NCKHNrYiktPmJyZGV2ID0gZGV2OwogCiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKIAorCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKLQkJaWYgKGJyX211bHRpY2FzdF9yY3YoYnIsIE5VTEwsIHNrYikpCisJCWlmICh1bmxpa2VseShuZXRwb2xsX3R4X3J1bm5pbmcoZGV2KSkpIHsKKwkJCWJyX2Zsb29kX2RlbGl2ZXIoYnIsIHNrYik7CiAJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoYnJfbXVsdGljYXN0X3JjdihiciwgTlVMTCwgc2tiKSkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCW1kc3QgPSBicl9tZGJfZ2V0KGJyLCBza2IpOwogCQlpZiAobWRzdCB8fCBCUl9JTlBVVF9TS0JfQ0JfTVJPVVRFUlNfT05MWShza2IpKQpAQCAtNjEsNiArNzAsNyBAQAogCQlicl9mbG9vZF9kZWxpdmVyKGJyLCBza2IpOwogCiBvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtOTIsMjEgKzEwMiwyNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqYnJfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKLQlzdHJ1Y3QgYnJfY3B1X25ldHN0YXRzIHN1bSA9IHsgMCB9OworCXN0cnVjdCBicl9jcHVfbmV0c3RhdHMgdG1wLCBzdW0gPSB7IDAgfTsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJCWNvbnN0IHN0cnVjdCBicl9jcHVfbmV0c3RhdHMgKmJzdGF0cwogCQkJPSBwZXJfY3B1X3B0cihici0+c3RhdHMsIGNwdSk7Ci0KLQkJc3VtLnR4X2J5dGVzICAgKz0gYnN0YXRzLT50eF9ieXRlczsKLQkJc3VtLnR4X3BhY2tldHMgKz0gYnN0YXRzLT50eF9wYWNrZXRzOwotCQlzdW0ucnhfYnl0ZXMgICArPSBic3RhdHMtPnJ4X2J5dGVzOwotCQlzdW0ucnhfcGFja2V0cyArPSBic3RhdHMtPnJ4X3BhY2tldHM7CisJCWRvIHsKKwkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZic3RhdHMtPnN5bmNwKTsKKwkJCW1lbWNweSgmdG1wLCBic3RhdHMsIHNpemVvZih0bXApKTsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZic3RhdHMtPnN5bmNwLCBzdGFydCkpOworCQlzdW0udHhfYnl0ZXMgICArPSB0bXAudHhfYnl0ZXM7CisJCXN1bS50eF9wYWNrZXRzICs9IHRtcC50eF9wYWNrZXRzOworCQlzdW0ucnhfYnl0ZXMgICArPSB0bXAucnhfYnl0ZXM7CisJCXN1bS5yeF9wYWNrZXRzICs9IHRtcC5yeF9wYWNrZXRzOwogCX0KIAogCXN0YXRzLT50eF9ieXRlcyAgID0gc3VtLnR4X2J5dGVzOwpAQCAtMTI3LDcgKzE0MSw3IEBACiAKICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgogCS8qIHJlbWVtYmVyIHRoZSBNVFUgaW4gdGhlIHJ0YWJsZSBmb3IgUE1UVSAqLwotCWJyLT5mYWtlX3J0YWJsZS51LmRzdC5tZXRyaWNzW1JUQVhfTVRVIC0gMV0gPSBuZXdfbXR1OworCWJyLT5mYWtlX3J0YWJsZS5kc3QubWV0cmljc1tSVEFYX01UVSAtIDFdID0gbmV3X210dTsKICNlbmRpZgogCiAJcmV0dXJuIDA7CkBAIC0xOTksNjUgKzIxMyw4MSBAQAogfQogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLXN0YXRpYyBib29sIGJyX2RldmljZXNfc3VwcG9ydF9uZXRwb2xsKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3N0YXRpYyB2b2lkIGJyX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqYnJfZGV2KQogewotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7Ci0JYm9vbCByZXQgPSB0cnVlOwotCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZici0+bG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKLQkJY291bnQrKzsKLQkJaWYgKChwLT5kZXYtPnByaXZfZmxhZ3MgJiBJRkZfRElTQUJMRV9ORVRQT0xMKSB8fAotCQkgICAgIXAtPmRldi0+bmV0ZGV2X29wcy0+bmRvX3BvbGxfY29udHJvbGxlcikKLQkJCXJldCA9IGZhbHNlOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZici0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBjb3VudCAhPSAwICYmIHJldDsKIH0KIAotdm9pZCBicl9uZXRwb2xsX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGJyX25ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgKm47Ci0JY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHM7CiAKLQlici0+ZGV2LT5ucGluZm8gPSBOVUxMOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgewotCQlpZiAocC0+ZGV2KSB7Ci0JCQlvcHMgPSBwLT5kZXYtPm5ldGRldl9vcHM7Ci0JCQlpZiAob3BzLT5uZG9fbmV0cG9sbF9jbGVhbnVwKQotCQkJCW9wcy0+bmRvX25ldHBvbGxfY2xlYW51cChwLT5kZXYpOwotCQkJZWxzZQotCQkJCXAtPmRldi0+bnBpbmZvID0gTlVMTDsKLQkJfQorCQlicl9uZXRwb2xsX2Rpc2FibGUocCk7CiAJfQogfQogCi12b2lkIGJyX25ldHBvbGxfZGlzYWJsZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCi0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBicl9uZXRwb2xsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRwb2xsX2luZm8gKm5pKQogewotCWlmIChicl9kZXZpY2VzX3N1cHBvcnRfbmV0cG9sbChicikpCi0JCWJyLT5kZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9ESVNBQkxFX05FVFBPTEw7Ci0JaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX25ldHBvbGxfY2xlYW51cCkKLQkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fbmV0cG9sbF9jbGVhbnVwKGRldik7Ci0JZWxzZQotCQlkZXYtPm5waW5mbyA9IE5VTEw7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCAqbjsKKwlpbnQgZXJyID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoIXAtPmRldikKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IGJyX25ldHBvbGxfZW5hYmxlKHApOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsOworCX0KKworb3V0OgorCXJldHVybiBlcnI7CisKK2ZhaWw6CisJYnJfbmV0cG9sbF9jbGVhbnVwKGRldik7CisJZ290byBvdXQ7CiB9CiAKLXZvaWQgYnJfbmV0cG9sbF9lbmFibGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2ludCBicl9uZXRwb2xsX2VuYWJsZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQogewotCWlmIChicl9kZXZpY2VzX3N1cHBvcnRfbmV0cG9sbChicikpIHsKLQkJYnItPmRldi0+cHJpdl9mbGFncyAmPSB+SUZGX0RJU0FCTEVfTkVUUE9MTDsKLQkJaWYgKGJyLT5kZXYtPm5waW5mbykKLQkJCWRldi0+bnBpbmZvID0gYnItPmRldi0+bnBpbmZvOwotCX0gZWxzZSBpZiAoIShici0+ZGV2LT5wcml2X2ZsYWdzICYgSUZGX0RJU0FCTEVfTkVUUE9MTCkpIHsKLQkJYnItPmRldi0+cHJpdl9mbGFncyB8PSBJRkZfRElTQUJMRV9ORVRQT0xMOwotCQlicl9pbmZvKGJyLCJuZXcgZGV2aWNlICVzIGRvZXMgbm90IHN1cHBvcnQgbmV0cG9sbCAoZGlzYWJsaW5nKSIsCi0JCQlkZXYtPm5hbWUpOworCXN0cnVjdCBuZXRwb2xsICpucDsKKwlpbnQgZXJyID0gMDsKKworCW5wID0ga3phbGxvYyhzaXplb2YoKnAtPm5wKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIW5wKQorCQlnb3RvIG91dDsKKworCW5wLT5kZXYgPSBwLT5kZXY7CisKKwllcnIgPSBfX25ldHBvbGxfc2V0dXAobnApOworCWlmIChlcnIpIHsKKwkJa2ZyZWUobnApOworCQlnb3RvIG91dDsKIAl9CisKKwlwLT5ucCA9IG5wOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBicl9uZXRwb2xsX2Rpc2FibGUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlzdHJ1Y3QgbmV0cG9sbCAqbnAgPSBwLT5ucDsKKworCWlmICghbnApCisJCXJldHVybjsKKworCXAtPm5wID0gTlVMTDsKKworCS8qIFdhaXQgZm9yIHRyYW5zbWl0dGluZyBwYWNrZXRzIHRvIGZpbmlzaCBiZWZvcmUgZnJlZWluZy4gKi8KKwlzeW5jaHJvbml6ZV9yY3VfYmgoKTsKKworCV9fbmV0cG9sbF9jbGVhbnVwKG5wKTsKKwlrZnJlZShucCk7CiB9CiAKICNlbmRpZgpAQCAtMjgwLDEzICszMTAsMTUgQEAKIAkubmRvX29wZW4JCSA9IGJyX2Rldl9vcGVuLAogCS5uZG9fc3RvcAkJID0gYnJfZGV2X3N0b3AsCiAJLm5kb19zdGFydF94bWl0CQkgPSBicl9kZXZfeG1pdCwKLQkubmRvX2dldF9zdGF0cwkJID0gYnJfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQJID0gYnJfZ2V0X3N0YXRzNjQsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJID0gYnJfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CSA9IGJyX2Rldl9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb19jaGFuZ2VfbXR1CQkgPSBicl9jaGFuZ2VfbXR1LAogCS5uZG9fZG9faW9jdGwJCSA9IGJyX2Rldl9pb2N0bCwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fbmV0cG9sbF9zZXR1cAkgPSBicl9uZXRwb2xsX3NldHVwLAogCS5uZG9fbmV0cG9sbF9jbGVhbnVwCSA9IGJyX25ldHBvbGxfY2xlYW51cCwKKwkubmRvX3BvbGxfY29udHJvbGxlcgkgPSBicl9wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZmRiLmMgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCmluZGV4IGIwMWRkZTMuLjkwNTEyY2MgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZmRiLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mZGIuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwogfQogCi0vKiBObyBsb2NraW5nIG9yIHJlZmNvdW50aW5nLCBhc3N1bWVzIGNhbGxlciBoYXMgbm8gcHJlZW1wdCAocmN1X3JlYWRfbG9jaykgKi8KKy8qIE5vIGxvY2tpbmcgb3IgcmVmY291bnRpbmcsIGFzc3VtZXMgY2FsbGVyIGhhcyByY3VfcmVhZF9sb2NrICovCiBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKl9fYnJfZmRiX2dldChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKQEAgLTI0MCwxMSArMjQwLDExIEBACiAJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CiAJaW50IHJldDsKIAotCWlmICghZGV2LT5icl9wb3J0KQorCWlmICghYnJfcG9ydF9leGlzdHMoZGV2KSkKIAkJcmV0dXJuIDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JZmRiID0gX19icl9mZGJfZ2V0KGRldi0+YnJfcG9ydC0+YnIsIGFkZHIpOworCWZkYiA9IF9fYnJfZmRiX2dldChicl9wb3J0X2dldF9yY3UoZGV2KS0+YnIsIGFkZHIpOwogCXJldCA9IGZkYiAmJiBmZGItPmRzdC0+ZGV2ICE9IGRldiAmJgogCQlmZGItPmRzdC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORzsKIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKaW5kZXggNTk1ZGE0NS4uY2JmZTg3ZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKQEAgLTY3LDYgKzY3LDE3IEBACiBzdGF0aWMgdm9pZCBfX2JyX2RlbGl2ZXIoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqdG8sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc2tiLT5kZXYgPSB0by0+ZGV2OworCisJaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyh0by0+ZGV2KSkpIHsKKwkJaWYgKHBhY2tldF9sZW5ndGgoc2tiKSA+IHNrYi0+ZGV2LT5tdHUgJiYgIXNrYl9pc19nc28oc2tiKSkKKwkJCWtmcmVlX3NrYihza2IpOworCQllbHNlIHsKKwkJCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOworCQkJYnJfbmV0cG9sbF9zZW5kX3NrYih0bywgc2tiKTsKKwkJfQorCQlyZXR1cm47CisJfQorCiAJTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfTE9DQUxfT1VULCBza2IsIE5VTEwsIHNrYi0+ZGV2LAogCQlicl9mb3J3YXJkX2ZpbmlzaCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggMThiMjQ1ZS4uYzAzZDJjMyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtMTQ3LDE0ICsxNDcsMTcgQEAKIAogCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT5icl9wb3J0LCBOVUxMKTsKKwlkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9CUklER0VfUE9SVDsKKworCW5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIoZGV2KTsKIAogCWJyX211bHRpY2FzdF9kZWxfcG9ydChwKTsKIAogCWtvYmplY3RfdWV2ZW50KCZwLT5rb2JqLCBLT0JKX1JFTU9WRSk7CiAJa29iamVjdF9kZWwoJnAtPmtvYmopOwogCi0JYnJfbmV0cG9sbF9kaXNhYmxlKGJyLCBkZXYpOworCWJyX25ldHBvbGxfZGlzYWJsZShwKTsKKwogCWNhbGxfcmN1KCZwLT5yY3UsIGRlc3Ryb3lfbmJwX3JjdSk7CiB9CiAKQEAgLTE2Nyw4ICsxNzAsNiBAQAogCQlkZWxfbmJwKHApOwogCX0KIAotCWJyX25ldHBvbGxfY2xlYW51cChici0+ZGV2KTsKLQogCWRlbF90aW1lcl9zeW5jKCZici0+Z2NfdGltZXIpOwogCiAJYnJfc3lzZnNfZGVsYnIoYnItPmRldik7CkBAIC00MDAsNyArNDAxLDcgQEAKIAkJcmV0dXJuIC1FTE9PUDsKIAogCS8qIERldmljZSBpcyBhbHJlYWR5IGJlaW5nIGJyaWRnZWQgKi8KLQlpZiAoZGV2LT5icl9wb3J0ICE9IE5VTEwpCisJaWYgKGJyX3BvcnRfZXhpc3RzKGRldikpCiAJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBObyBicmlkZ2luZyBkZXZpY2VzIHRoYXQgZGlzbGlrZSB0aGF0IChlLmcuIHdpcmVsZXNzKSAqLwpAQCAtNDI4LDcgKzQyOSwxNSBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyMjsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcihkZXYtPmJyX3BvcnQsIHApOworCWlmIChicl9uZXRwb2xsX2luZm8oYnIpICYmICgoZXJyID0gYnJfbmV0cG9sbF9lbmFibGUocCkpKSkKKwkJZ290byBlcnIzOworCisJZXJyID0gbmV0ZGV2X3J4X2hhbmRsZXJfcmVnaXN0ZXIoZGV2LCBicl9oYW5kbGVfZnJhbWUsIHApOworCWlmIChlcnIpCisJCWdvdG8gZXJyMzsKKworCWRldi0+cHJpdl9mbGFncyB8PSBJRkZfQlJJREdFX1BPUlQ7CisKIAlkZXZfZGlzYWJsZV9scm8oZGV2KTsKIAogCWxpc3RfYWRkX3JjdSgmcC0+bGlzdCwgJmJyLT5wb3J0X2xpc3QpOwpAQCAtNDQ4LDkgKzQ1Nyw5IEBACiAKIAlrb2JqZWN0X3VldmVudCgmcC0+a29iaiwgS09CSl9BREQpOwogCi0JYnJfbmV0cG9sbF9lbmFibGUoYnIsIGRldik7Ci0KIAlyZXR1cm4gMDsKK2VycjM6CisJc3lzZnNfcmVtb3ZlX2xpbmsoYnItPmlmb2JqLCBwLT5kZXYtPm5hbWUpOwogZXJyMjoKIAlicl9mZGJfZGVsZXRlX2J5X3BvcnQoYnIsIHAsIDEpOwogZXJyMToKQEAgLTQ2Nyw5ICs0NzYsMTMgQEAKIC8qIGNhbGxlZCB3aXRoIFJUTkwgKi8KIGludCBicl9kZWxfaWYoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBkZXYtPmJyX3BvcnQ7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKIAotCWlmICghcCB8fCBwLT5iciAhPSBicikKKwlpZiAoIWJyX3BvcnRfZXhpc3RzKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJcCA9IGJyX3BvcnRfZ2V0KGRldik7CisJaWYgKHAtPmJyICE9IGJyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRlbF9uYnAocCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggZDM2ZTcwMC4uODI2Y2Q1MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtMjcsOCArMjcsMTAgQEAKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihicmRldik7CiAJc3RydWN0IGJyX2NwdV9uZXRzdGF0cyAqYnJzdGF0cyA9IHRoaXNfY3B1X3B0cihici0+c3RhdHMpOwogCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYnJzdGF0cy0+c3luY3ApOwogCWJyc3RhdHMtPnJ4X3BhY2tldHMrKzsKIAlicnN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYnJzdGF0cy0+c3luY3ApOwogCiAJaW5kZXYgPSBza2ItPmRldjsKIAlza2ItPmRldiA9IGJyZGV2OwpAQCAtMzcsMTEgKzM5LDExIEBACiAJCSAgICAgICBuZXRpZl9yZWNlaXZlX3NrYik7CiB9CiAKLS8qIG5vdGU6IGFscmVhZHkgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAocHJlZW1wdF9kaXNhYmxlZCkgKi8KKy8qIG5vdGU6IGFscmVhZHkgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAqLwogaW50IGJyX2hhbmRsZV9mcmFtZV9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0ID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IHJjdV9kZXJlZmVyZW5jZShza2ItPmRldi0+YnJfcG9ydCk7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyOwogCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZHN0OwogCXN0cnVjdCBuZXRfYnJpZGdlX21kYl9lbnRyeSAqbWRzdDsKQEAgLTEwOCwxMyArMTEwLDEyIEBACiAJZ290byBvdXQ7CiB9CiAKLS8qIG5vdGU6IGFscmVhZHkgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAocHJlZW1wdF9kaXNhYmxlZCkgKi8KKy8qIG5vdGU6IGFscmVhZHkgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAqLwogc3RhdGljIGludCBicl9oYW5kbGVfbG9jYWxfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IHJjdV9kZXJlZmVyZW5jZShza2ItPmRldi0+YnJfcG9ydCk7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CiAKLQlpZiAocCkKLQkJYnJfZmRiX3VwZGF0ZShwLT5iciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CisJYnJfZmRiX3VwZGF0ZShwLT5iciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CiAJcmV0dXJuIDA7CSAvKiBwcm9jZXNzIGZ1cnRoZXIgKi8KIH0KIApAQCAtMTMxLDE1ICsxMzIsMTggQEAKIH0KIAogLyoKLSAqIENhbGxlZCB2aWEgYnJfaGFuZGxlX2ZyYW1lX2hvb2suCiAgKiBSZXR1cm4gTlVMTCBpZiBza2IgaXMgaGFuZGxlZAotICogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrIChwcmVlbXB0X2Rpc2FibGVkKQorICogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrCiAgKi8KLXN0cnVjdCBza19idWZmICpicl9oYW5kbGVfZnJhbWUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0cnVjdCBza19idWZmICpicl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBldGhfaGRyKHNrYiktPmhfZGVzdDsKIAlpbnQgKCpyaG9vaykoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0spCisJCXJldHVybiBza2I7CisKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZXRoX2hkcihza2IpLT5oX3NvdXJjZSkpCiAJCWdvdG8gZHJvcDsKIApAQCAtMTQ3LDYgKzE1MSw4IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCisJcCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CisKIAlpZiAodW5saWtlbHkoaXNfbGlua19sb2NhbChkZXN0KSkpIHsKIAkJLyogUGF1c2UgZnJhbWVzIHNob3VsZG4ndCBiZSBwYXNzZWQgdXAgYnkgZHJpdmVyIGFueXdheSAqLwogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QQVVTRSkpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jIGIvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYwppbmRleCAyN2FlOTQ2Li5lYjViMjU2IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCisrKyBiL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKQEAgLTE0MzUsNyArMTQzNSw3IEBACiAJc3RydWN0IGljbXA2aGRyICppY21wNmg7CiAJdTggbmV4dGhkcjsKIAl1bnNpZ25lZCBsZW47Ci0JdW5zaWduZWQgb2Zmc2V0OworCWludCBvZmZzZXQ7CiAJaW50IGVycjsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXA2aCkpKQpAQCAtMTcyOCwxMyArMTcyOCw5IEBACiBpbnQgYnJfbXVsdGljYXN0X3RvZ2dsZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQ7Ci0JaW50IGVyciA9IC1FTk9FTlQ7CisJaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2soJmJyLT5tdWx0aWNhc3RfbG9jayk7Ci0JaWYgKCFuZXRpZl9ydW5uaW5nKGJyLT5kZXYpKQotCQlnb3RvIHVubG9jazsKLQotCWVyciA9IDA7CiAJaWYgKGJyLT5tdWx0aWNhc3RfZGlzYWJsZWQgPT0gIXZhbCkKIAkJZ290byB1bmxvY2s7CiAKQEAgLTE3NDIsNiArMTczOCw5IEBACiAJaWYgKGJyLT5tdWx0aWNhc3RfZGlzYWJsZWQpCiAJCWdvdG8gdW5sb2NrOwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGJyLT5kZXYpKQorCQlnb3RvIHVubG9jazsKKwogCWlmIChici0+bWRiKSB7CiAJCWlmIChici0+bWRiLT5vbGQpIHsKIAkJCWVyciA9IC1FRVhJU1Q7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCA4ZmI3NWY4Li4yYzkxMWMwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTU1LDYgKzU1LDkgQEAKIHN0YXRpYyBpbnQgYnJuZl9maWx0ZXJfdmxhbl90YWdnZWQgX19yZWFkX21vc3RseSA9IDA7CiBzdGF0aWMgaW50IGJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCBfX3JlYWRfbW9zdGx5ID0gMDsKICNlbHNlCisjZGVmaW5lIGJybmZfY2FsbF9pcHRhYmxlcyAxCisjZGVmaW5lIGJybmZfY2FsbF9pcDZ0YWJsZXMgMQorI2RlZmluZSBicm5mX2NhbGxfYXJwdGFibGVzIDEKICNkZWZpbmUgYnJuZl9maWx0ZXJfdmxhbl90YWdnZWQgMAogI2RlZmluZSBicm5mX2ZpbHRlcl9wcHBvZV90YWdnZWQgMAogI2VuZGlmCkBAIC0xMTcsMjYgKzEyMCwyNyBAQAogewogCXN0cnVjdCBydGFibGUgKnJ0ID0gJmJyLT5mYWtlX3J0YWJsZTsKIAotCWF0b21pY19zZXQoJnJ0LT51LmRzdC5fX3JlZmNudCwgMSk7Ci0JcnQtPnUuZHN0LmRldiA9IGJyLT5kZXY7Ci0JcnQtPnUuZHN0LnBhdGggPSAmcnQtPnUuZHN0OwotCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVIC0gMV0gPSAxNTAwOwotCXJ0LT51LmRzdC5mbGFncwk9IERTVF9OT1hGUk07Ci0JcnQtPnUuZHN0Lm9wcyA9ICZmYWtlX2RzdF9vcHM7CisJYXRvbWljX3NldCgmcnQtPmRzdC5fX3JlZmNudCwgMSk7CisJcnQtPmRzdC5kZXYgPSBici0+ZGV2OworCXJ0LT5kc3QucGF0aCA9ICZydC0+ZHN0OworCXJ0LT5kc3QubWV0cmljc1tSVEFYX01UVSAtIDFdID0gMTUwMDsKKwlydC0+ZHN0LmZsYWdzCT0gRFNUX05PWEZSTTsKKwlydC0+ZHN0Lm9wcyA9ICZmYWtlX2RzdF9vcHM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJ0YWJsZSAqYnJpZGdlX3BhcmVudF9ydGFibGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0ID0gcmN1X2RlcmVmZXJlbmNlKGRldi0+YnJfcG9ydCk7Ci0KLQlyZXR1cm4gcG9ydCA/ICZwb3J0LT5ici0+ZmFrZV9ydGFibGUgOiBOVUxMOworCWlmICghYnJfcG9ydF9leGlzdHMoZGV2KSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZicl9wb3J0X2dldF9yY3UoZGV2KS0+YnItPmZha2VfcnRhYmxlOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2VfcGFyZW50KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCA9IHJjdV9kZXJlZmVyZW5jZShkZXYtPmJyX3BvcnQpOworCWlmICghYnJfcG9ydF9leGlzdHMoZGV2KSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gcG9ydCA/IHBvcnQtPmJyLT5kZXYgOiBOVUxMOworCXJldHVybiBicl9wb3J0X2dldF9yY3UoZGV2KS0+YnItPmRldjsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZV9hbGxvYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjQ0LDggKzI0OCw3IEBACiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gMDsKIAl9Ci0JZHN0X2hvbGQoJnJ0LT51LmRzdCk7Ci0Jc2tiX2RzdF9zZXQoc2tiLCAmcnQtPnUuZHN0KTsKKwlza2JfZHN0X3NldF9ub3JlZihza2IsICZydC0+ZHN0KTsKIAogCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CiAJbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChza2IpOwpAQCAtMzk2LDggKzM5OSw3IEBACiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWRzdF9ob2xkKCZydC0+dS5kc3QpOwotCQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCQlza2JfZHN0X3NldF9ub3JlZihza2IsICZydC0+ZHN0KTsKIAl9CiAKIAlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwpAQCAtNTQ1LDI1ICs1NDcsMzAgQEAKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkJCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogeworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOwogCXN0cnVjdCBpcGhkciAqaXBoOwogCV9fdTMyIGxlbiA9IG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKHNrYik7CiAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBsZW4pKSkKIAkJZ290byBvdXQ7CiAKKwlwID0gYnJfcG9ydF9nZXRfcmN1KGluKTsKKwlpZiAocCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwliciA9IHAtPmJyOworCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikgfHwgSVNfVkxBTl9JUFY2KHNrYikgfHwKIAkgICAgSVNfUFBQT0VfSVBWNihza2IpKSB7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCQlpZiAoIWJybmZfY2FsbF9pcDZ0YWJsZXMpCisJCWlmICghYnJuZl9jYWxsX2lwNnRhYmxlcyAmJiAhYnItPm5mX2NhbGxfaXA2dGFibGVzKQogCQkJcmV0dXJuIE5GX0FDQ0VQVDsKLSNlbmRpZgorCiAJCW5mX2JyaWRnZV9wdWxsX2VuY2FwX2hlYWRlcl9yY3N1bShza2IpOwogCQlyZXR1cm4gYnJfbmZfcHJlX3JvdXRpbmdfaXB2Nihob29rLCBza2IsIGluLCBvdXQsIG9rZm4pOwogCX0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JaWYgKCFicm5mX2NhbGxfaXB0YWJsZXMpCisKKwlpZiAoIWJybmZfY2FsbF9pcHRhYmxlcyAmJiAhYnItPm5mX2NhbGxfaXB0YWJsZXMpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0jZW5kaWYKIAogCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSAmJiAhSVNfVkxBTl9JUChza2IpICYmCiAJICAgICFJU19QUFBPRV9JUChza2IpKQpAQCAtNzE5LDEyICs3MjYsMTcgQEAKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkJCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogeworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOwogCXN0cnVjdCBuZXRfZGV2aWNlICoqZCA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKikoc2tiLT5jYik7CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JaWYgKCFicm5mX2NhbGxfYXJwdGFibGVzKQorCXAgPSBicl9wb3J0X2dldF9yY3Uob3V0KTsKKwlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTkZfQUNDRVBUOwotI2VuZGlmCisJYnIgPSBwLT5icjsKKworCWlmICghYnJuZl9jYWxsX2FycHRhYmxlcyAmJiAhYnItPm5mX2NhbGxfYXJwdGFibGVzKQorCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfQVJQKSkgewogCQlpZiAoIUlTX1ZMQU5fQVJQKHNrYikpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCmluZGV4IGZlMGE3OTAuLjRhNmEzNzggMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCkBAIC0xMjAsMTAgKzEyMCwxMSBAQAogCWlkeCA9IDA7CiAJZm9yX2VhY2hfbmV0ZGV2KG5ldCwgZGV2KSB7CiAJCS8qIG5vdCBhIGJyaWRnZSBwb3J0ICovCi0JCWlmIChkZXYtPmJyX3BvcnQgPT0gTlVMTCB8fCBpZHggPCBjYi0+YXJnc1swXSkKKwkJaWYgKCFicl9wb3J0X2V4aXN0cyhkZXYpIHx8IGlkeCA8IGNiLT5hcmdzWzBdKQogCQkJZ290byBza2lwOwogCi0JCWlmIChicl9maWxsX2lmaW5mbyhza2IsIGRldi0+YnJfcG9ydCwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCWlmIChicl9maWxsX2lmaW5mbyhza2IsIGJyX3BvcnRfZ2V0KGRldiksCisJCQkJICAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJICAgY2ItPm5saC0+bmxtc2dfc2VxLCBSVE1fTkVXTElOSywKIAkJCQkgICBOTE1fRl9NVUxUSSkgPCAwKQogCQkJYnJlYWs7CkBAIC0xNjgsOSArMTY5LDkgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwID0gZGV2LT5icl9wb3J0OwotCWlmICghcCkKKwlpZiAoIWJyX3BvcnRfZXhpc3RzKGRldikpCiAJCXJldHVybiAtRUlOVkFMOworCXAgPSBicl9wb3J0X2dldChkZXYpOwogCiAJLyogaWYga2VybmVsIFNUUCBpcyBydW5uaW5nLCBkb24ndCBhbGxvdyBjaGFuZ2VzICovCiAJaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCA9PSBCUl9LRVJORUxfU1RQKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9ub3RpZnkuYyBiL25ldC9icmlkZ2UvYnJfbm90aWZ5LmMKaW5kZXggNzE3ZTFmZC4uNDA0ZDRlMSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9ub3RpZnkuYworKysgYi9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCkBAIC0zMiwxNCArMzIsMTUgQEAKIHN0YXRpYyBpbnQgYnJfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gZGV2LT5icl9wb3J0OworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBicl9wb3J0X2dldChkZXYpOwogCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKIAlpbnQgZXJyOwogCiAJLyogbm90IGEgcG9ydCBvZiBhIGJyaWRnZSAqLwotCWlmIChwID09IE5VTEwpCisJaWYgKCFicl9wb3J0X2V4aXN0cyhkZXYpKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKKwlwID0gYnJfcG9ydF9nZXQoZGV2KTsKIAliciA9IHAtPmJyOwogCiAJc3dpdGNoIChldmVudCkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmggYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAppbmRleCAwZjRhNzRiLi43NWM5MGVkIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAorKysgYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaApAQCAtMTUsNiArMTUsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0cG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3U2NF9zdGF0c19zeW5jLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKICNkZWZpbmUgQlJfSEFTSF9CSVRTIDgKQEAgLTE0MywxMyArMTQ1LDIzIEBACiAjaWZkZWYgQ09ORklHX1NZU0ZTCiAJY2hhcgkJCQlzeXNmc19uYW1lW0lGTkFNU0laXTsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlzdHJ1Y3QgbmV0cG9sbAkJCSpucDsKKyNlbmRpZgogfTsKIAorI2RlZmluZSBicl9wb3J0X2dldF9yY3UoZGV2KSBcCisJKChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICopIHJjdV9kZXJlZmVyZW5jZShkZXYtPnJ4X2hhbmRsZXJfZGF0YSkpCisjZGVmaW5lIGJyX3BvcnRfZ2V0KGRldikgKChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICopIGRldi0+cnhfaGFuZGxlcl9kYXRhKQorI2RlZmluZSBicl9wb3J0X2V4aXN0cyhkZXYpIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpCisKIHN0cnVjdCBicl9jcHVfbmV0c3RhdHMgewotCXVuc2lnbmVkIGxvbmcJcnhfcGFja2V0czsKLQl1bnNpZ25lZCBsb25nCXJ4X2J5dGVzOwotCXVuc2lnbmVkIGxvbmcJdHhfcGFja2V0czsKLQl1bnNpZ25lZCBsb25nCXR4X2J5dGVzOworCXU2NAkJCXJ4X3BhY2tldHM7CisJdTY0CQkJcnhfYnl0ZXM7CisJdTY0CQkJdHhfcGFja2V0czsKKwl1NjQJCQl0eF9ieXRlczsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMJc3luY3A7CiB9OwogCiBzdHJ1Y3QgbmV0X2JyaWRnZQpAQCAtMTY0LDYgKzE3Niw5IEBACiAJdW5zaWduZWQgbG9uZwkJCWZlYXR1cmVfbWFzazsKICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgogCXN0cnVjdCBydGFibGUgCQkJZmFrZV9ydGFibGU7CisJYm9vbAkJCQluZl9jYWxsX2lwdGFibGVzOworCWJvb2wJCQkJbmZfY2FsbF9pcDZ0YWJsZXM7CisJYm9vbAkJCQluZl9jYWxsX2FycHRhYmxlczsKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcJCQlmbGFnczsKICNkZWZpbmUgQlJfU0VUX01BQ19BRERSCQkweDAwMDAwMDAxCkBAIC0yNzMsMTYgKzI4OCw0MSBAQAogZXh0ZXJuIG5ldGRldl90eF90IGJyX2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLWV4dGVybiB2b2lkIGJyX25ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGJyX25ldHBvbGxfZW5hYmxlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgYnJfbmV0cG9sbF9kaXNhYmxlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLSNlbHNlCi0jZGVmaW5lIGJyX25ldHBvbGxfY2xlYW51cChicikKLSNkZWZpbmUgYnJfbmV0cG9sbF9lbmFibGUoYnIsIGRldikKLSNkZWZpbmUgYnJfbmV0cG9sbF9kaXNhYmxlKGJyLCBkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRwb2xsX2luZm8gKmJyX25ldHBvbGxfaW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJcmV0dXJuIGJyLT5kZXYtPm5waW5mbzsKK30KIAorc3RhdGljIGlubGluZSB2b2lkIGJyX25ldHBvbGxfc2VuZF9za2IoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0cG9sbCAqbnAgPSBwLT5ucDsKKworCWlmIChucCkKKwkJbmV0cG9sbF9zZW5kX3NrYihucCwgc2tiKTsKK30KKworZXh0ZXJuIGludCBicl9uZXRwb2xsX2VuYWJsZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKK2V4dGVybiB2b2lkIGJyX25ldHBvbGxfZGlzYWJsZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRwb2xsX2luZm8gKmJyX25ldHBvbGxfaW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBicl9uZXRwb2xsX3NlbmRfc2tiKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJyX25ldHBvbGxfZW5hYmxlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBicl9uZXRwb2xsX2Rpc2FibGUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKK30KICNlbmRpZgogCiAvKiBicl9mZGIuYyAqLwpAQCAtMzMxLDggKzM3MSw3IEBACiAKIC8qIGJyX2lucHV0LmMgKi8KIGV4dGVybiBpbnQgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpicl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qIGJyX2lvY3RsLmMgKi8KIGV4dGVybiBpbnQgYnJfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jIGIvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCmluZGV4IDIxN2JkMjIuLjM1Y2YyNzAgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMKQEAgLTEzMSwxOCArMTMxLDE5IEBACiAvKgogICogQ2FsbGVkIGZyb20gbGxjLgogICoKLSAqIE5PIGxvY2tzLCBidXQgcmN1X3JlYWRfbG9jayAocHJlZW1wdF9kaXNhYmxlZCkKKyAqIE5PIGxvY2tzLCBidXQgcmN1X3JlYWRfbG9jawogICovCiB2b2lkIGJyX3N0cF9yY3YoY29uc3Qgc3RydWN0IHN0cF9wcm90byAqcHJvdG8sIHN0cnVjdCBza19idWZmICpza2IsCiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9IGV0aF9oZHIoc2tiKS0+aF9kZXN0OwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSByY3VfZGVyZWZlcmVuY2UoZGV2LT5icl9wb3J0KTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwogCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpidWY7CiAKLQlpZiAoIXApCisJaWYgKCFicl9wb3J0X2V4aXN0cyhkZXYpKQogCQlnb3RvIGVycjsKKwlwID0gYnJfcG9ydF9nZXRfcmN1KGRldik7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCA0KSkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKaW5kZXggNDg2YjhmMy4uNWMxZTU1NSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwpAQCAtNjExLDYgKzYxMSw3MyBAQAogCQkgICBzaG93X211bHRpY2FzdF9zdGFydHVwX3F1ZXJ5X2ludGVydmFsLAogCQkgICBzdG9yZV9tdWx0aWNhc3Rfc3RhcnR1cF9xdWVyeV9pbnRlcnZhbCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorc3RhdGljIHNzaXplX3Qgc2hvd19uZl9jYWxsX2lwdGFibGVzKAorCXN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBici0+bmZfY2FsbF9pcHRhYmxlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X25mX2NhbGxfaXB0YWJsZXMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlici0+bmZfY2FsbF9pcHRhYmxlcyA9IHZhbCA/IHRydWUgOiBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbmZfY2FsbF9pcHRhYmxlcygKKwlzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGQsIGJ1ZiwgbGVuLCBzZXRfbmZfY2FsbF9pcHRhYmxlcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobmZfY2FsbF9pcHRhYmxlcywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfbmZfY2FsbF9pcHRhYmxlcywgc3RvcmVfbmZfY2FsbF9pcHRhYmxlcyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbmZfY2FsbF9pcDZ0YWJsZXMoCisJc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGJyLT5uZl9jYWxsX2lwNnRhYmxlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X25mX2NhbGxfaXA2dGFibGVzKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJYnItPm5mX2NhbGxfaXA2dGFibGVzID0gdmFsID8gdHJ1ZSA6IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9uZl9jYWxsX2lwNnRhYmxlcygKKwlzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGQsIGJ1ZiwgbGVuLCBzZXRfbmZfY2FsbF9pcDZ0YWJsZXMpOworfQorc3RhdGljIERFVklDRV9BVFRSKG5mX2NhbGxfaXA2dGFibGVzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgc2hvd19uZl9jYWxsX2lwNnRhYmxlcywgc3RvcmVfbmZfY2FsbF9pcDZ0YWJsZXMpOworCitzdGF0aWMgc3NpemVfdCBzaG93X25mX2NhbGxfYXJwdGFibGVzKAorCXN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBici0+bmZfY2FsbF9hcnB0YWJsZXMpOworfQorCitzdGF0aWMgaW50IHNldF9uZl9jYWxsX2FycHRhYmxlcyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWJyLT5uZl9jYWxsX2FycHRhYmxlcyA9IHZhbCA/IHRydWUgOiBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbmZfY2FsbF9hcnB0YWJsZXMoCisJc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgbGVuKQoreworCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShkLCBidWYsIGxlbiwgc2V0X25mX2NhbGxfYXJwdGFibGVzKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihuZl9jYWxsX2FycHRhYmxlcywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfbmZfY2FsbF9hcnB0YWJsZXMsIHN0b3JlX25mX2NhbGxfYXJwdGFibGVzKTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYnJpZGdlX2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX2ZvcndhcmRfZGVsYXkuYXR0ciwKQEAgLTY0NSw2ICs3MTIsMTEgQEAKIAkmZGV2X2F0dHJfbXVsdGljYXN0X3F1ZXJ5X3Jlc3BvbnNlX2ludGVydmFsLmF0dHIsCiAJJmRldl9hdHRyX211bHRpY2FzdF9zdGFydHVwX3F1ZXJ5X2ludGVydmFsLmF0dHIsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCSZkZXZfYXR0cl9uZl9jYWxsX2lwdGFibGVzLmF0dHIsCisJJmRldl9hdHRyX25mX2NhbGxfaXA2dGFibGVzLmF0dHIsCisJJmRldl9hdHRyX25mX2NhbGxfYXJwdGFibGVzLmF0dHIsCisjZW5kaWYKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfcmVkaXJlY3QuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jCmluZGV4IDllMTkxNjYuLjQ2NjI0YmIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jCkBAIC0yNCw4ICsyNCw5IEBACiAJCXJldHVybiBFQlRfRFJPUDsKIAogCWlmIChwYXItPmhvb2tudW0gIT0gTkZfQlJfQlJPVVRJTkcpCisJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLwogCQltZW1jcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsCi0JCSAgICAgICBwYXItPmluLT5icl9wb3J0LT5ici0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCQkgICAgICAgYnJfcG9ydF9nZXRfcmN1KHBhci0+aW4pLT5ici0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtY3B5KGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBwYXItPmluLT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCmluZGV4IGFlM2M3Y2UuLjI2Mzc3ZTkgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwpAQCAtMTc3LDggKzE3Nyw5IEBACiAJaWYgKGluKSB7CiAJCXN0cmNweShwbS0+cGh5c2luZGV2LCBpbi0+bmFtZSk7CiAJCS8qIElmIGluIGlzbid0IGEgYnJpZGdlLCB0aGVuIHBoeXNpbmRldj09aW5kZXYgKi8KLQkJaWYgKGluLT5icl9wb3J0KQotCQkJc3RyY3B5KHBtLT5pbmRldiwgaW4tPmJyX3BvcnQtPmJyLT5kZXYtPm5hbWUpOworCQlpZiAoYnJfcG9ydF9leGlzdHMoaW4pKQorCQkJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJCQlzdHJjcHkocG0tPmluZGV2LCBicl9wb3J0X2dldF9yY3UoaW4pLT5ici0+ZGV2LT5uYW1lKTsKIAkJZWxzZQogCQkJc3RyY3B5KHBtLT5pbmRldiwgaW4tPm5hbWUpOwogCX0gZWxzZQpAQCAtMTg3LDcgKzE4OCw4IEBACiAJaWYgKG91dCkgewogCQkvKiBJZiBvdXQgZXhpc3RzLCB0aGVuIG91dCBpcyBhIGJyaWRnZSBwb3J0ICovCiAJCXN0cmNweShwbS0+cGh5c291dGRldiwgb3V0LT5uYW1lKTsKLQkJc3RyY3B5KHBtLT5vdXRkZXYsIG91dC0+YnJfcG9ydC0+YnItPmRldi0+bmFtZSk7CisJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCQlzdHJjcHkocG0tPm91dGRldiwgYnJfcG9ydF9nZXRfcmN1KG91dCktPmJyLT5kZXYtPm5hbWUpOwogCX0gZWxzZQogCQlwbS0+b3V0ZGV2WzBdID0gcG0tPnBoeXNvdXRkZXZbMF0gPSAnXDAnOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYwppbmRleCA1OWNhMDBlLi5iY2MxMDJlIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKQEAgLTE0MCwxMSArMTQwLDE0IEBACiAJCXJldHVybiAxOwogCWlmIChGV0lOVjIoZWJ0X2Rldl9jaGVjayhlLT5vdXQsIG91dCksIEVCVF9JT1VUKSkKIAkJcmV0dXJuIDE7Ci0JaWYgKCghaW4gfHwgIWluLT5icl9wb3J0KSA/IDAgOiBGV0lOVjIoZWJ0X2Rldl9jaGVjaygKLQkgICBlLT5sb2dpY2FsX2luLCBpbi0+YnJfcG9ydC0+YnItPmRldiksIEVCVF9JTE9HSUNBTElOKSkKKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwlpZiAoaW4gJiYgYnJfcG9ydF9leGlzdHMoaW4pICYmCisJICAgIEZXSU5WMihlYnRfZGV2X2NoZWNrKGUtPmxvZ2ljYWxfaW4sIGJyX3BvcnRfZ2V0X3JjdShpbiktPmJyLT5kZXYpLAorCQkgICBFQlRfSUxPR0lDQUxJTikpCiAJCXJldHVybiAxOwotCWlmICgoIW91dCB8fCAhb3V0LT5icl9wb3J0KSA/IDAgOiBGV0lOVjIoZWJ0X2Rldl9jaGVjaygKLQkgICBlLT5sb2dpY2FsX291dCwgb3V0LT5icl9wb3J0LT5ici0+ZGV2KSwgRUJUX0lMT0dJQ0FMT1VUKSkKKwlpZiAob3V0ICYmIGJyX3BvcnRfZXhpc3RzKG91dCkgJiYKKwkgICAgRldJTlYyKGVidF9kZXZfY2hlY2soZS0+bG9naWNhbF9vdXQsIGJyX3BvcnRfZ2V0X3JjdShvdXQpLT5ici0+ZGV2KSwKKwkJICAgRUJUX0lMT0dJQ0FMT1VUKSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoZS0+Yml0bWFzayAmIEVCVF9TT1VSQ0VNQUMpIHsKZGlmZiAtLWdpdCBhL25ldC9jYWlmL0tjb25maWcgYi9uZXQvY2FpZi9LY29uZmlnCmluZGV4IGVkNjUxNzguLjUyOTc1MGQgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL0tjb25maWcKKysrIGIvbmV0L2NhaWYvS2NvbmZpZwpAQCAtMjEsMTkgKzIxLDE4IEBACiAJU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYWlmIGZvciBhIGZ1cnRoZXIgZXhwbGFuYXRpb24gb24gaG93IHRvCiAJdXNlIGFuZCBjb25maWd1cmUgQ0FJRi4KIAotaWYgQ0FJRgotCiBjb25maWcgIENBSUZfREVCVUcKIAlib29sICJFbmFibGUgRGVidWciCisJZGVwZW5kcyBvbiBDQUlGCiAJZGVmYXVsdCBuCiAJLS0tIGhlbHAgLS0tCiAJRW5hYmxlIHRoZSBpbmNsdXNpb24gb2YgZGVidWcgY29kZSBpbiB0aGUgQ0FJRiBzdGFjay4KIAlCZSBhd2FyZSB0aGF0IGRvaW5nIHRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCiAJSWYgdW5zdXJlIHNheSBOLgogCi0KIGNvbmZpZyBDQUlGX05FVERFVgogCXRyaXN0YXRlICJDQUlGIEdQUlMgTmV0d29yayBkZXZpY2UiCisJZGVwZW5kcyBvbiBDQUlGCiAJZGVmYXVsdCBDQUlGCiAJLS0taGVscC0tLQogCVNheSBZIGlmIHlvdSB3aWxsIGJlIHVzaW5nIGEgQ0FJRiBiYXNlZCBHUFJTIG5ldHdvcmsgZGV2aWNlLgpAQCAtNDEsNSArNDAsMyBAQAogCUlmIHlvdSBzZWxlY3QgdG8gYnVpbGQgaXQgYXMgYSBidWlsdC1pbiB0aGVuIHRoZSBtYWluIENBSUYgZGV2aWNlIG11c3QKIAlhbHNvIGJlIGEgYnVpbHQtaW4uCiAJSWYgdW5zdXJlIHNheSBZLgotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvTWFrZWZpbGUgYi9uZXQvY2FpZi9NYWtlZmlsZQppbmRleCAzNDg1MmFmLi5mODc0ODFmIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9NYWtlZmlsZQorKysgYi9uZXQvY2FpZi9NYWtlZmlsZQpAQCAtMSwyMyArMSwxMyBAQAotaWZlcSAoJChDT05GSUdfQ0FJRl9ERUJVRyksMSkKLUNBSUZfREJHX0ZMQUdTIDo9IC1EREVCVUcKK2lmZXEgKCQoQ09ORklHX0NBSUZfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRwogZW5kaWYKIAotY2NmbGFncy15IDo9ICQoQ0FJRl9GTEFHUykgJChDQUlGX0RCR19GTEFHUykKLQogY2FpZi1vYmpzIDo9IGNhaWZfZGV2Lm8gXAogCWNmY25mZy5vIGNmbXV4bC5vIGNmY3RybC5vICBcCiAJY2Zmcm1sLm8gY2Z2ZWlsLm8gY2ZkYmdsLm9cCiAJY2ZzZXJsLm8gY2ZkZ21sLm8gIFwKIAljZnJmbWwubyBjZnZpZGwubyBjZnV0aWxsLm8gXAogCWNmc3J2bC5vIGNmcGt0X3NrYnVmZi5vIGNhaWZfY29uZmlnX3V0aWwubwotY2xlYW4tZGlyczo9IC50bXBfdmVyc2lvbnMKLQotY2xlYW4tZmlsZXM6PSBcCi0JTW9kdWxlLnN5bXZlcnMgXAotCW1vZHVsZXMub3JkZXIgXAotCSouY21kIFwKLQkqLm8gXAotCSp+CiAKIG9iai0kKENPTkZJR19DQUlGKSArPSBjYWlmLm8KIG9iai0kKENPTkZJR19DQUlGX05FVERFVikgKz0gY2hubF9uZXQubwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2FpZl9jb25maWdfdXRpbC5jIGIvbmV0L2NhaWYvY2FpZl9jb25maWdfdXRpbC5jCmluZGV4IDZmMzY1ODAuLjc2YWU2ODMgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NhaWZfY29uZmlnX3V0aWwuYworKysgYi9uZXQvY2FpZi9jYWlmX2NvbmZpZ191dGlsLmMKQEAgLTgwLDYgKzgwLDExIEBACiAJCSAgICAgICBsLT51LnV0aWxpdHkucGFyYW1sZW4pOwogCiAJCWJyZWFrOworCWNhc2UgQ0FJRlBST1RPX0RFQlVHOgorCQlsLT5saW5rdHlwZSA9IENGQ1RSTF9TUlZfREJHOworCQlsLT5lbmRwb2ludCA9IHMtPnNvY2thZGRyLnUuZGJnLnNlcnZpY2U7CisJCWwtPmNodHlwZSA9IHMtPnNvY2thZGRyLnUuZGJnLnR5cGU7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NhaWZfZGV2LmMgYi9uZXQvY2FpZi9jYWlmX2Rldi5jCmluZGV4IGUyYjg2ZjEuLjBiNTg2ZTkgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NhaWZfZGV2LmMKKysrIGIvbmV0L2NhaWYvY2FpZl9kZXYuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCQlwcmVmID0gQ0ZQSFlQUkVGX0hJR0hfQlc7CiAJCQlicmVhazsKIAkJfQotCisJCWRldl9ob2xkKGRldik7CiAJCWNmY25mZ19hZGRfcGh5X2xheWVyKGdldF9jYWlmX2NvbmYoKSwKIAkJCQkgICAgIHBoeV90eXBlLAogCQkJCSAgICAgZGV2LApAQCAtMjg1LDYgKzI4NSw3IEBACiAJCWNhaWZkLT5sYXllci51cC0+Y3RybGNtZChjYWlmZC0+bGF5ZXIudXAsCiAJCQkJCSBfQ0FJRl9DVFJMQ01EX1BIWUlGX0RPV05fSU5ELAogCQkJCQkgY2FpZmQtPmxheWVyLmlkKTsKKwkJbWlnaHRfc2xlZXAoKTsKIAkJcmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2FpZmQtPmV2ZW50LAogCQkJCQlhdG9taWNfcmVhZCgmY2FpZmQtPmluX3VzZSkgPT0gMCwKIAkJCQkJVElNRU9VVCk7CkBAIC0zMDAsNiArMzAxLDcgQEAKIAkJCQkgICAiVW5yZWdpc3RlcmluZyBhbiBhY3RpdmUgQ0FJRiBkZXZpY2U6ICVzXG4iLAogCQkJCSAgIF9fZnVuY19fLCBkZXYtPm5hbWUpOwogCQljZmNuZmdfZGVsX3BoeV9sYXllcihnZXRfY2FpZl9jb25mKCksICZjYWlmZC0+bGF5ZXIpOworCQlkZXZfcHV0KGRldik7CiAJCWF0b21pY19zZXQoJmNhaWZkLT5zdGF0ZSwgd2hhdCk7CiAJCWJyZWFrOwogCkBAIC0zMjYsNyArMzI4LDggQEAKIEVYUE9SVF9TWU1CT0woZ2V0X2NhaWZfY29uZik7CiAKIGludCBjYWlmX2Nvbm5lY3RfY2xpZW50KHN0cnVjdCBjYWlmX2Nvbm5lY3RfcmVxdWVzdCAqY29ubl9yZXEsCi0JCQkgICBzdHJ1Y3QgY2ZsYXllciAqY2xpZW50X2xheWVyKQorCQkJc3RydWN0IGNmbGF5ZXIgKmNsaWVudF9sYXllciwgaW50ICppZmluZGV4LAorCQkJaW50ICpoZWFkcm9vbSwgaW50ICp0YWlscm9vbSkKIHsKIAlzdHJ1Y3QgY2ZjdHJsX2xpbmtfcGFyYW0gcGFyYW07CiAJaW50IHJldDsKQEAgLTMzNCw4ICszMzcsOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJLyogSG9vayB1cCB0aGUgYWRhcHRhdGlvbiBsYXllci4gKi8KLQlyZXR1cm4gY2ZjbmZnX2FkZF9hZGFwdGF0aW9uX2xheWVyKGdldF9jYWlmX2NvbmYoKSwKLQkJCQkJCSZwYXJhbSwgY2xpZW50X2xheWVyKTsKKwlyZXR1cm4gY2ZjbmZnX2FkZF9hZGFwdGF0aW9uX2xheWVyKGdldF9jYWlmX2NvbmYoKSwgJnBhcmFtLAorCQkJCQljbGllbnRfbGF5ZXIsIGlmaW5kZXgsCisJCQkJCWhlYWRyb29tLCB0YWlscm9vbSk7CiB9CiBFWFBPUlRfU1lNQk9MKGNhaWZfY29ubmVjdF9jbGllbnQpOwogCmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jYWlmX3NvY2tldC5jIGIvbmV0L2NhaWYvY2FpZl9zb2NrZXQuYwppbmRleCAzZDBlMDk1Li44Y2U5MDQ3IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jYWlmX3NvY2tldC5jCisrKyBiL25ldC9jYWlmL2NhaWZfc29ja2V0LmMKQEAgLTI4LDggKzI4LDggQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19ORVRQUk9UTyhBRl9DQUlGKTsKIAotI2RlZmluZSBDQUlGX0RFRl9TTkRCVUYgKENBSUZfTUFYX1BBWUxPQURfU0laRSoxMCkKLSNkZWZpbmUgQ0FJRl9ERUZfUkNWQlVGIChDQUlGX01BWF9QQVlMT0FEX1NJWkUqMTAwKQorI2RlZmluZSBDQUlGX0RFRl9TTkRCVUYgKDQwOTYqMTApCisjZGVmaW5lIENBSUZfREVGX1JDVkJVRiAoNDA5NioxMDApCiAKIC8qCiAgKiBDQUlGIHN0YXRlIGlzIHJlLXVzaW5nIHRoZSBUQ1Agc29ja2V0IHN0YXRlcy4KQEAgLTc2LDYgKzc2LDcgQEAKIAlzdHJ1Y3QgY2FpZl9jb25uZWN0X3JlcXVlc3QgY29ubl9yZXE7CiAJc3RydWN0IG11dGV4IHJlYWRsb2NrOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfc29ja2V0X2RpcjsKKwlpbnQgaGVhZHJvb20sIHRhaWxyb29tLCBtYXhmcmFtZTsKIH07CiAKIHN0YXRpYyBpbnQgcnhfZmxvd19pc19vbihzdHJ1Y3QgY2FpZnNvY2sgKmNmX3NrKQpAQCAtNTk0LDI3ICs1OTUsMzIgQEAKIAkJZ290byBlcnI7CiAJbm9ibG9jayA9IG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUOwogCi0JYnVmZmVyX3NpemUgPSBsZW4gKyBDQUlGX05FRURFRF9IRUFEUk9PTSArIENBSUZfTkVFREVEX1RBSUxST09NOwotCi0JcmV0ID0gLUVNU0dTSVpFOwotCWlmIChidWZmZXJfc2l6ZSA+IENBSUZfTUFYX1BBWUxPQURfU0laRSkKLQkJZ290byBlcnI7Ci0KIAl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG5vYmxvY2spOwogCXRpbWVvID0gY2FpZl93YWl0X2Zvcl9mbG93X29uKGNvbnRhaW5lcl9vZihzaywgc3RydWN0IGNhaWZzb2NrLCBzayksCiAJCQkJMSwgdGltZW8sICZyZXQpOwogCisJaWYgKHJldCkKKwkJZ290byBlcnI7CiAJcmV0ID0gLUVQSVBFOwogCWlmIChjZl9zay0+c2suc2tfc3RhdGUgIT0gQ0FJRl9DT05ORUNURUQgfHwKIAkJc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpIHx8CiAJCShzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pKQogCQlnb3RvIGVycjsKIAorCS8qIEVycm9yIGlmIHRyeWluZyB0byB3cml0ZSBtb3JlIHRoYW4gbWF4aW11bSBmcmFtZSBzaXplLiAqLworCXJldCA9IC1FTVNHU0laRTsKKwlpZiAobGVuID4gY2Zfc2stPm1heGZyYW1lICYmIGNmX3NrLT5zay5za19wcm90b2NvbCAhPSBDQUlGUFJPVE9fUkZNKQorCQlnb3RvIGVycjsKKworCWJ1ZmZlcl9zaXplID0gbGVuICsgY2Zfc2stPmhlYWRyb29tICsgY2Zfc2stPnRhaWxyb29tOworCiAJcmV0ID0gLUVOT01FTTsKIAlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBidWZmZXJfc2l6ZSwgbm9ibG9jaywgJnJldCk7Ci0JaWYgKCFza2IpCisKKwlpZiAoIXNrYiB8fCBza2JfdGFpbHJvb20oc2tiKSA8IGJ1ZmZlcl9zaXplKQogCQlnb3RvIGVycjsKLQlza2JfcmVzZXJ2ZShza2IsIENBSUZfTkVFREVEX0hFQURST09NKTsKKworCXNrYl9yZXNlcnZlKHNrYiwgY2Zfc2stPmhlYWRyb29tKTsKIAogCXJldCA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIApAQCAtNjQ1LDcgKzY1MSw2IEBACiAJbG9uZyB0aW1lbzsKIAogCWVyciA9IC1FT1BOT1RTVVBQOwotCiAJaWYgKHVubGlrZWx5KG1zZy0+bXNnX2ZsYWdzJk1TR19PT0IpKQogCQlnb3RvIG91dF9lcnI7CiAKQEAgLTY2Miw4ICs2NjcsOCBAQAogCiAJCXNpemUgPSBsZW4tc2VudDsKIAotCQlpZiAoc2l6ZSA+IENBSUZfTUFYX1BBWUxPQURfU0laRSkKLQkJCXNpemUgPSBDQUlGX01BWF9QQVlMT0FEX1NJWkU7CisJCWlmIChzaXplID4gY2Zfc2stPm1heGZyYW1lKQorCQkJc2l6ZSA9IGNmX3NrLT5tYXhmcmFtZTsKIAogCQkvKiBJZiBzaXplIGlzIG1vcmUgdGhhbiBoYWxmIG9mIHNuZGJ1ZiwgY2hvcCB1cCBtZXNzYWdlICovCiAJCWlmIChzaXplID4gKChzay0+c2tfc25kYnVmID4+IDEpIC0gNjQpKQpAQCAtNjczLDE0ICs2NzgsMTQgQEAKIAkJCXNpemUgPSBTS0JfTUFYX0FMTE9DOwogCiAJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCi0JCQkJCXNpemUgKyBDQUlGX05FRURFRF9IRUFEUk9PTQotCQkJCQkrIENBSUZfTkVFREVEX1RBSUxST09NLAorCQkJCQlzaXplICsgY2Zfc2stPmhlYWRyb29tICsKKwkJCQkJY2Zfc2stPnRhaWxyb29tLAogCQkJCQltc2ctPm1zZ19mbGFncyZNU0dfRE9OVFdBSVQsCiAJCQkJCSZlcnIpOwogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlnb3RvIG91dF9lcnI7CiAKLQkJc2tiX3Jlc2VydmUoc2tiLCBDQUlGX05FRURFRF9IRUFEUk9PTSk7CisJCXNrYl9yZXNlcnZlKHNrYiwgY2Zfc2stPmhlYWRyb29tKTsKIAkJLyoKIAkJICoJSWYgeW91IHBhc3MgdHdvIHZhbHVlcyB0byB0aGUgc29ja19hbGxvY19zZW5kX3NrYgogCQkgKglpdCB0cmllcyB0byBncmFiIHRoZSBsYXJnZSBidWZmZXIgd2l0aCBHRlBfTk9GUwpAQCAtODIxLDE3ICs4MjYsMTUgQEAKIAlzdHJ1Y3QgY2FpZnNvY2sgKmNmX3NrID0gY29udGFpbmVyX29mKHNrLCBzdHJ1Y3QgY2FpZnNvY2ssIHNrKTsKIAlsb25nIHRpbWVvOwogCWludCBlcnI7CisJaW50IGlmaW5kZXgsIGhlYWRyb29tLCB0YWlscm9vbTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCiAJbG9ja19zb2NrKHNrKTsKIAogCWVyciA9IC1FQUZOT1NVUFBPUlQ7CiAJaWYgKHVhZGRyLT5zYV9mYW1pbHkgIT0gQUZfQ0FJRikKIAkJZ290byBvdXQ7CiAKLQllcnIgPSAtRVNPQ0tUTk9TVVBQT1JUOwotCWlmICh1bmxpa2VseSghKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNICYmCi0JCSAgICAgICBjZl9zay0+c2suc2tfcHJvdG9jb2wgPT0gQ0FJRlBST1RPX0FUKSAmJgotCQkgICAgICAgc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpKQotCQlnb3RvIG91dDsKIAlzd2l0Y2ggKHNvY2stPnN0YXRlKSB7CiAJY2FzZSBTU19VTkNPTk5FQ1RFRDoKIAkJLyogTm9ybWFsIGNhc2UsIGEgZnJlc2ggY29ubmVjdCAqLwpAQCAtODc0LDggKzg3Nyw3IEBACiAJc2tfc3RyZWFtX2tpbGxfcXVldWVzKCZjZl9zay0+c2spOwogCiAJZXJyID0gLUVJTlZBTDsKLQlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9jYWlmKSB8fAotCQkhdWFkZHIpCisJaWYgKGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfY2FpZikpCiAJCWdvdG8gb3V0OwogCiAJbWVtY3B5KCZjZl9zay0+Y29ubl9yZXEuc29ja2FkZHIsIHVhZGRyLApAQCAtODg4LDEyICs4OTAsMjMgQEAKIAlkYmZzX2F0b21pY19pbmMoJmNudC5udW1fY29ubmVjdF9yZXEpOwogCWNmX3NrLT5sYXllci5yZWNlaXZlID0gY2FpZl9za3RyZWN2X2NiOwogCWVyciA9IGNhaWZfY29ubmVjdF9jbGllbnQoJmNmX3NrLT5jb25uX3JlcSwKLQkJCQkmY2Zfc2stPmxheWVyKTsKKwkJCQkmY2Zfc2stPmxheWVyLCAmaWZpbmRleCwgJmhlYWRyb29tLCAmdGFpbHJvb20pOwogCWlmIChlcnIgPCAwKSB7CiAJCWNmX3NrLT5zay5za19zb2NrZXQtPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CiAJCWNmX3NrLT5zay5za19zdGF0ZSA9IENBSUZfRElTQ09OTkVDVEVEOwogCQlnb3RvIG91dDsKIAl9CisJZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChzayksIGlmaW5kZXgpOworCWNmX3NrLT5oZWFkcm9vbSA9IExMX1JFU0VSVkVEX1NQQUNFX0VYVFJBKGRldiwgaGVhZHJvb20pOworCWNmX3NrLT50YWlscm9vbSA9IHRhaWxyb29tOworCWNmX3NrLT5tYXhmcmFtZSA9IGRldi0+bXR1IC0gKGhlYWRyb29tICsgdGFpbHJvb20pOworCWRldl9wdXQoZGV2KTsKKwlpZiAoY2Zfc2stPm1heGZyYW1lIDwgMSkgeworCQlwcl93YXJuaW5nKCJDQUlGOiAlcygpOiBDQUlGIEludGVyZmFjZSBNVFUgdG9vIHNtYWxsICglZClcbiIsCisJCQlfX2Z1bmNfXywgZGV2LT5tdHUpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CiAKIAllcnIgPSAtRUlOUFJPR1JFU1M7CiB3YWl0X2Nvbm5lY3Q6CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZmNuZmcuYyBiL25ldC9jYWlmL2NmY25mZy5jCmluZGV4IGRmNDNmMjYuLjFjMjkxODkgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NmY25mZy5jCisrKyBiL25ldC9jYWlmL2NmY25mZy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX2xheWVyLmg+CiAjaW5jbHVkZSA8bmV0L2NhaWYvY2Zwa3QuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jZmNuZmcuaD4KQEAgLTIyLDYgKzIzLDcgQEAKICNkZWZpbmUgUEhZX05BTUVfTEVOIDIwCiAKICNkZWZpbmUgY29udGFpbmVyX29iaihsYXlyKSBjb250YWluZXJfb2YobGF5ciwgc3RydWN0IGNmY25mZywgbGF5ZXIpCisjZGVmaW5lIFJGTV9GUkFHTUVOVF9TSVpFIDQwMzAKIAogLyogSW5mb3JtYXRpb24gYWJvdXQgQ0FJRiBwaHlzaWNhbCBpbnRlcmZhY2VzIGhlbGQgYnkgQ29uZmlnIE1vZHVsZSBpbiBvcmRlcgogICogdG8gbWFuYWdlIHBoeXNpY2FsIGludGVyZmFjZXMKQEAgLTQxLDYgKzQzLDE1IEBACiAKIAkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgZGV2aWNlICovCiAJc3RydWN0IGRldl9pbmZvIGRldl9pbmZvOworCisJLyogSW50ZXJmYWNlIGluZGV4ICovCisJaW50IGlmaW5kZXg7CisKKwkvKiBVc2UgU3RhcnQgb2YgZnJhbWUgZXh0ZW5zaW9uICovCisJYm9vbCB1c2Vfc3R4OworCisJLyogVXNlIFN0YXJ0IG9mIGZyYW1lIGNoZWNrc3VtICovCisJYm9vbCB1c2VfZmNzOwogfTsKIAogc3RydWN0IGNmY25mZyB7CkBAIC0yNDgsOSArMjU5LDIwIEBACiB7CiB9CiAKK2ludCBwcm90b2hlYWRbQ0ZDVFJMX1NSVl9NQVNLXSA9IHsKKwlbQ0ZDVFJMX1NSVl9WRUldID0gNCwKKwlbQ0ZDVFJMX1NSVl9EQVRBR1JBTV0gPSA3LAorCVtDRkNUUkxfU1JWX1VUSUxdID0gNCwKKwlbQ0ZDVFJMX1NSVl9SRk1dID0gMywKKwlbQ0ZDVFJMX1NSVl9EQkddID0gMywKK307CisKIGludCBjZmNuZmdfYWRkX2FkYXB0YXRpb25fbGF5ZXIoc3RydWN0IGNmY25mZyAqY25mZywKIAkJCQlzdHJ1Y3QgY2ZjdHJsX2xpbmtfcGFyYW0gKnBhcmFtLAotCQkJCXN0cnVjdCBjZmxheWVyICphZGFwX2xheWVyKQorCQkJCXN0cnVjdCBjZmxheWVyICphZGFwX2xheWVyLAorCQkJCWludCAqaWZpbmRleCwKKwkJCQlpbnQgKnByb3RvX2hlYWQsCisJCQkJaW50ICpwcm90b190YWlsKQogewogCXN0cnVjdCBjZmxheWVyICpmcm1sOwogCWlmIChhZGFwX2xheWVyID09IE5VTEwpIHsKQEAgLTI3Niw2ICsyOTgsMTQgQEAKIAkJICAgICBwYXJhbS0+cGh5aWQpOwogCWNhaWZfYXNzZXJ0KGNuZmctPnBoeV9sYXllcnNbcGFyYW0tPnBoeWlkXS5waHlfbGF5ZXItPmlkID09CiAJCSAgICAgcGFyYW0tPnBoeWlkKTsKKworCSppZmluZGV4ID0gY25mZy0+cGh5X2xheWVyc1twYXJhbS0+cGh5aWRdLmlmaW5kZXg7CisJKnByb3RvX2hlYWQgPQorCQlwcm90b2hlYWRbcGFyYW0tPmxpbmt0eXBlXSsKKwkJKGNuZmctPnBoeV9sYXllcnNbcGFyYW0tPnBoeWlkXS51c2Vfc3R4ID8gMSA6IDApOworCisJKnByb3RvX3RhaWwgPSAyOworCiAJLyogRklYTUU6IEVOVU1FUkFURSBJTklUSUFMTFkgV0hFTiBBQ1RJVkFUSU5HIFBIWVNJQ0FMIElOVEVSRkFDRSAqLwogCWNmY3RybF9lbnVtX3JlcShjbmZnLT5jdHJsLCBwYXJhbS0+cGh5aWQpOwogCXJldHVybiBjZmN0cmxfbGlua3VwX3JlcXVlc3QoY25mZy0+Y3RybCwgcGFyYW0sIGFkYXBfbGF5ZXIpOwpAQCAtMjk3LDYgKzMyNyw4IEBACiAJc3RydWN0IGNmY25mZyAqY25mZyA9IGNvbnRhaW5lcl9vYmoobGF5ZXIpOwogCXN0cnVjdCBjZmxheWVyICpzZXJ2aWNlbCA9IE5VTEw7CiAJc3RydWN0IGNmY25mZ19waHlpbmZvICpwaHlpbmZvOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKIAlpZiAoYWRhcHRfbGF5ZXIgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogbGluayBzZXR1cCByZXNwb25zZSAiCiAJCQkJImJ1dCBubyBjbGllbnQgZXhpc3QsIHNlbmQgbGlua2Rvd24gYmFja1xuIiwKQEAgLTMwOCwxOSArMzQwLDE1IEBACiAJY2FpZl9hc3NlcnQoY25mZyAhPSBOVUxMKTsKIAljYWlmX2Fzc2VydChwaHlpZCAhPSAwKTsKIAlwaHlpbmZvID0gJmNuZmctPnBoeV9sYXllcnNbcGh5aWRdOwotCWNhaWZfYXNzZXJ0KHBoeWluZm8gIT0gTlVMTCk7CiAJY2FpZl9hc3NlcnQocGh5aW5mby0+aWQgPT0gcGh5aWQpOwogCWNhaWZfYXNzZXJ0KHBoeWluZm8tPnBoeV9sYXllciAhPSBOVUxMKTsKIAljYWlmX2Fzc2VydChwaHlpbmZvLT5waHlfbGF5ZXItPmlkID09IHBoeWlkKTsKIAotCWlmIChwaHlpbmZvICE9IE5VTEwgJiYKLQkgICAgcGh5aW5mby0+cGh5X3JlZl9jb3VudCsrID09IDAgJiYKLQkgICAgcGh5aW5mby0+cGh5X2xheWVyICE9IE5VTEwgJiYKKwlwaHlpbmZvLT5waHlfcmVmX2NvdW50Kys7CisJaWYgKHBoeWluZm8tPnBoeV9yZWZfY291bnQgPT0gMSAmJgogCSAgICBwaHlpbmZvLT5waHlfbGF5ZXItPm1vZGVtY21kICE9IE5VTEwpIHsKLQkJY2FpZl9hc3NlcnQocGh5aW5mby0+cGh5X2xheWVyLT5pZCA9PSBwaHlpZCk7CiAJCXBoeWluZm8tPnBoeV9sYXllci0+bW9kZW1jbWQocGh5aW5mby0+cGh5X2xheWVyLAogCQkJCQkgICAgIF9DQUlGX01PREVNQ01EX1BIWUlGX1VTRUZVTEwpOwotCiAJfQogCWFkYXB0X2xheWVyLT5pZCA9IGNoYW5uZWxfaWQ7CiAKQEAgLTMzMiw3ICszNjAsOSBAQAogCQlzZXJ2aWNlbCA9IGNmZGdtbF9jcmVhdGUoY2hhbm5lbF9pZCwgJnBoeWluZm8tPmRldl9pbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBDRkNUUkxfU1JWX1JGTToKLQkJc2VydmljZWwgPSBjZnJmbWxfY3JlYXRlKGNoYW5uZWxfaWQsICZwaHlpbmZvLT5kZXZfaW5mbyk7CisJCW5ldGRldiA9IHBoeWluZm8tPmRldl9pbmZvLmRldjsKKwkJc2VydmljZWwgPSBjZnJmbWxfY3JlYXRlKGNoYW5uZWxfaWQsICZwaHlpbmZvLT5kZXZfaW5mbywKKwkJCQkJCW5ldGRldi0+bXR1KTsKIAkJYnJlYWs7CiAJY2FzZSBDRkNUUkxfU1JWX1VUSUw6CiAJCXNlcnZpY2VsID0gY2Z1dGlsbF9jcmVhdGUoY2hhbm5lbF9pZCwgJnBoeWluZm8tPmRldl9pbmZvKTsKQEAgLTM2Myw4ICszOTMsOCBAQAogCiB2b2lkCiBjZmNuZmdfYWRkX3BoeV9sYXllcihzdHJ1Y3QgY2ZjbmZnICpjbmZnLCBlbnVtIGNmY25mZ19waHlfdHlwZSBwaHlfdHlwZSwKLQkJICAgICB2b2lkICpkZXYsIHN0cnVjdCBjZmxheWVyICpwaHlfbGF5ZXIsIHUxNiAqcGh5aWQsCi0JCSAgICAgZW51bSBjZmNuZmdfcGh5X3ByZWZlcmVuY2UgcHJlZiwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2ZsYXllciAqcGh5X2xheWVyLAorCQkgICAgIHUxNiAqcGh5aWQsIGVudW0gY2ZjbmZnX3BoeV9wcmVmZXJlbmNlIHByZWYsCiAJCSAgICAgYm9vbCBmY3MsIGJvb2wgc3R4KQogewogCXN0cnVjdCBjZmxheWVyICpmcm1sOwpAQCAtNDE4LDYgKzQ0OCwxMCBAQAogCWNuZmctPnBoeV9sYXllcnNbKnBoeWlkXS5kZXZfaW5mby5kZXYgPSBkZXY7CiAJY25mZy0+cGh5X2xheWVyc1sqcGh5aWRdLnBoeV9sYXllciA9IHBoeV9sYXllcjsKIAljbmZnLT5waHlfbGF5ZXJzWypwaHlpZF0ucGh5X3JlZl9jb3VudCA9IDA7CisJY25mZy0+cGh5X2xheWVyc1sqcGh5aWRdLmlmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJY25mZy0+cGh5X2xheWVyc1sqcGh5aWRdLnVzZV9zdHggPSBzdHg7CisJY25mZy0+cGh5X2xheWVyc1sqcGh5aWRdLnVzZV9mY3MgPSBmY3M7CisKIAlwaHlfbGF5ZXItPnR5cGUgPSBwaHlfdHlwZTsKIAlmcm1sID0gY2Zmcm1sX2NyZWF0ZSgqcGh5aWQsIGZjcyk7CiAJaWYgKCFmcm1sKSB7CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZmN0cmwuYyBiL25ldC9jYWlmL2NmY3RybC5jCmluZGV4IGZjZmRhOTguLjU2MzE0NWYgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NmY3RybC5jCisrKyBiL25ldC9jYWlmL2NmY3RybC5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZkZWYgQ0FJRl9OT19MT09QCiBzdGF0aWMgaW50IGhhbmRsZV9sb29wKHN0cnVjdCBjZmN0cmwgKmN0cmwsCiAJCQkgICAgICBpbnQgY21kLCBzdHJ1Y3QgY2Zwa3QgKnBrdCl7Ci0JcmV0dXJuIENBSUZfRkFJTFVSRTsKKwlyZXR1cm4gLTE7CiB9CiAjZWxzZQogc3RhdGljIGludCBoYW5kbGVfbG9vcChzdHJ1Y3QgY2ZjdHJsICpjdHJsLApAQCAtNDMsNyArNDMsNyBAQAogCW1lbXNldCgmZGV2X2luZm8sIDAsIHNpemVvZihkZXZfaW5mbykpOwogCWRldl9pbmZvLmlkID0gMHhmZjsKIAltZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7Ci0JY2ZzcnZsX2luaXQoJnRoaXMtPnNlcnYsIDAsICZkZXZfaW5mbyk7CisJY2ZzcnZsX2luaXQoJnRoaXMtPnNlcnYsIDAsICZkZXZfaW5mbywgZmFsc2UpOwogCWF0b21pY19zZXQoJnRoaXMtPnJlcV9zZXFfbm8sIDEpOwogCWF0b21pY19zZXQoJnRoaXMtPnJzcF9zZXFfbm8sIDEpOwogCXRoaXMtPnNlcnYubGF5ZXIucmVjZWl2ZSA9IGNmY3RybF9yZWN2OwpAQCAtMzk1LDcgKzM5NSw3IEBACiAJY21kID0gY21kcnNwICYgQ0ZDVFJMX0NNRF9NQVNLOwogCWlmIChjbWQgIT0gQ0ZDVFJMX0NNRF9MSU5LX0VSUgogCSAgICAmJiBDRkNUUkxfUlNQX0JJVCAhPSAoQ0ZDVFJMX1JTUF9CSVQgJiBjbWRyc3ApKSB7Ci0JCWlmIChoYW5kbGVfbG9vcChjZmN0cmwsIGNtZCwgcGt0KSA9PSBDQUlGX0ZBSUxVUkUpCisJCWlmIChoYW5kbGVfbG9vcChjZmN0cmwsIGNtZCwgcGt0KSAhPSAwKQogCQkJY21kcnNwIHw9IENGQ1RSTF9FUlJfQklUOwogCX0KIApAQCAtNjQ3LDYgKzY0Nyw2IEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCXJldHVybiBDQUlGX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmZGJnbC5jIGIvbmV0L2NhaWYvY2ZkYmdsLmMKaW5kZXggYWI2YjZkYy4uNjc2NjQ4YyAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2ZkYmdsLmMKKysrIGIvbmV0L2NhaWYvY2ZkYmdsLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAl9CiAJY2FpZl9hc3NlcnQob2Zmc2V0b2Yoc3RydWN0IGNmc3J2bCwgbGF5ZXIpID09IDApOwogCW1lbXNldChkYmcsIDAsIHNpemVvZihzdHJ1Y3QgY2ZzcnZsKSk7Ci0JY2ZzcnZsX2luaXQoZGJnLCBjaGFubmVsX2lkLCBkZXZfaW5mbyk7CisJY2ZzcnZsX2luaXQoZGJnLCBjaGFubmVsX2lkLCBkZXZfaW5mbywgZmFsc2UpOwogCWRiZy0+bGF5ZXIucmVjZWl2ZSA9IGNmZGJnbF9yZWNlaXZlOwogCWRiZy0+bGF5ZXIudHJhbnNtaXQgPSBjZmRiZ2xfdHJhbnNtaXQ7CiAJc25wcmludGYoZGJnLT5sYXllci5uYW1lLCBDQUlGX0xBWUVSX05BTUVfU1ogLSAxLCAiZGJnJWQiLCBjaGFubmVsX2lkKTsKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmZGdtbC5jIGIvbmV0L2NhaWYvY2ZkZ21sLmMKaW5kZXggNTMxOTQ4NC4uZWQ5ZDUzYWZmIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZmRnbWwuYworKysgYi9uZXQvY2FpZi9jZmRnbWwuYwpAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBER01fRkxPV19PRkYgMHg4MQogI2RlZmluZSBER01fRkxPV19PTiAgMHg4MAogI2RlZmluZSBER01fQ1RSTF9QS1RfU0laRSAxCisjZGVmaW5lIERHTV9NVFUgMTUwMAogCiBzdGF0aWMgaW50IGNmZGdtbF9yZWNlaXZlKHN0cnVjdCBjZmxheWVyICpsYXlyLCBzdHJ1Y3QgY2Zwa3QgKnBrdCk7CiBzdGF0aWMgaW50IGNmZGdtbF90cmFuc21pdChzdHJ1Y3QgY2ZsYXllciAqbGF5ciwgc3RydWN0IGNmcGt0ICpwa3QpOwpAQCAtMzAsNyArMzEsNyBAQAogCX0KIAljYWlmX2Fzc2VydChvZmZzZXRvZihzdHJ1Y3QgY2ZzcnZsLCBsYXllcikgPT0gMCk7CiAJbWVtc2V0KGRnbSwgMCwgc2l6ZW9mKHN0cnVjdCBjZnNydmwpKTsKLQljZnNydmxfaW5pdChkZ20sIGNoYW5uZWxfaWQsIGRldl9pbmZvKTsKKwljZnNydmxfaW5pdChkZ20sIGNoYW5uZWxfaWQsIGRldl9pbmZvLCB0cnVlKTsKIAlkZ20tPmxheWVyLnJlY2VpdmUgPSBjZmRnbWxfcmVjZWl2ZTsKIAlkZ20tPmxheWVyLnRyYW5zbWl0ID0gY2ZkZ21sX3RyYW5zbWl0OwogCXNucHJpbnRmKGRnbS0+bGF5ZXIubmFtZSwgQ0FJRl9MQVlFUl9OQU1FX1NaIC0gMSwgImRnbSVkIiwgY2hhbm5lbF9pZCk7CkBAIC04OSw2ICs5MCwxMCBAQAogCWlmICghY2ZzcnZsX3JlYWR5KHNlcnZpY2UsICZyZXQpKQogCQlyZXR1cm4gcmV0OwogCisJLyogU1RFIE1vZGVtIGNhbm5vdCBoYW5kbGUgbW9yZSB0aGFuIDE1MDAgYnl0ZXMgZGF0YWdyYW1zICovCisJaWYgKGNmcGt0X2dldGxlbihwa3QpID4gREdNX01UVSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwogCWNmcGt0X2FkZF9oZWFkKHBrdCwgJnplcm8sIDQpOwogCiAJLyogQWRkIGluZm8gZm9yIE1VWC1sYXllciB0byByb3V0ZSB0aGUgcGFja2V0IG91dC4gKi8KZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmcGt0X3NrYnVmZi5jIGIvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKaW5kZXggYTZmZGY4OS4uMDFmMjM4ZiAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKKysrIGIvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKQEAgLTksOCArOSw4IEBACiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2NmcGt0Lmg+CiAKLSNkZWZpbmUgUEtUX1BSRUZJWCBDQUlGX05FRURFRF9IRUFEUk9PTQotI2RlZmluZSBQS1RfUE9TVEZJWCBDQUlGX05FRURFRF9UQUlMUk9PTQorI2RlZmluZSBQS1RfUFJFRklYICAxNgorI2RlZmluZSBQS1RfUE9TVEZJWCAyCiAjZGVmaW5lIFBLVF9MRU5fV0hFTl9FWFRFTkRJTkcgMTI4CiAjZGVmaW5lIFBLVF9FUlJPUihwa3QsIGVycm1zZykgZG8gewkgICBcCiAgICAgY2Zwa3RfcHJpdihwa3QpLT5lcnJvbm91cyA9IHRydWU7CSAgIFwKQEAgLTMzOCw3ICszMzgsNiBAQAogCXUxNiBkc3RsZW47CiAJdTE2IGNyZWF0ZWxlbjsKIAlpZiAodW5saWtlbHkoaXNfZXJyb25vdXMoZHN0cGt0KSB8fCBpc19lcnJvbm91cyhhZGRwa3QpKSkgewotCQljZnBrdF9kZXN0cm95KGFkZHBrdCk7CiAJCXJldHVybiBkc3Rwa3Q7CiAJfQogCWlmIChleHBlY3RsZW4gPiBhZGRsZW4pCmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZnJmbWwuYyBiL25ldC9jYWlmL2NmcmZtbC5jCmluZGV4IGZkMjdiMTcuLmViMTYwMjAgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NmcmZtbC5jCisrKyBiL25ldC9jYWlmL2NmcmZtbC5jCkBAIC03LDEwMiArNywzMDQgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0Lmg+CiAjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9sYXllci5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2Nmc3J2bC5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2NmcGt0Lmg+CiAKLSNkZWZpbmUgY29udGFpbmVyX29iaihsYXlyKSBjb250YWluZXJfb2YobGF5ciwgc3RydWN0IGNmc3J2bCwgbGF5ZXIpCi0KKyNkZWZpbmUgY29udGFpbmVyX29iaihsYXlyKSBjb250YWluZXJfb2YobGF5ciwgc3RydWN0IGNmcmZtbCwgc2Vydi5sYXllcikKICNkZWZpbmUgUkZNX1NFR01FTlRBVElPTl9CSVQgMHgwMQotI2RlZmluZSBSRk1fUEFZTE9BRCAgMHgwMAotI2RlZmluZSBSRk1fQ01EX0JJVCAgMHg4MAotI2RlZmluZSBSRk1fRkxPV19PRkYgMHg4MQotI2RlZmluZSBSRk1fRkxPV19PTiAgMHg4MAotI2RlZmluZSBSRk1fU0VUX1BJTiAgMHg4MgotI2RlZmluZSBSRk1fQ1RSTF9QS1RfU0laRSAxCisjZGVmaW5lIFJGTV9IRUFEX1NJWkUgNwogCiBzdGF0aWMgaW50IGNmcmZtbF9yZWNlaXZlKHN0cnVjdCBjZmxheWVyICpsYXlyLCBzdHJ1Y3QgY2Zwa3QgKnBrdCk7CiBzdGF0aWMgaW50IGNmcmZtbF90cmFuc21pdChzdHJ1Y3QgY2ZsYXllciAqbGF5ciwgc3RydWN0IGNmcGt0ICpwa3QpOwotc3RhdGljIGludCBjZnNlcnZsX21vZGVtY21kKHN0cnVjdCBjZmxheWVyICpsYXlyLCBlbnVtIGNhaWZfbW9kZW1jbWQgY3RybCk7CiAKLXN0cnVjdCBjZmxheWVyICpjZnJmbWxfY3JlYXRlKHU4IGNoYW5uZWxfaWQsIHN0cnVjdCBkZXZfaW5mbyAqZGV2X2luZm8pCitzdHJ1Y3QgY2ZyZm1sIHsKKwlzdHJ1Y3QgY2ZzcnZsIHNlcnY7CisJc3RydWN0IGNmcGt0ICppbmNvbXBsZXRlX2ZybTsKKwlpbnQgZnJhZ21lbnRfc2l6ZTsKKwl1OCAgc2VnaGVhZFs2XTsKKwl1MTYgcGR1X3NpemU7CisJLyogUHJvdGVjdHMgc2VyaWFsaXplZCBwcm9jZXNzaW5nIG9mIHBhY2tldHMgKi8KKwlzcGlubG9ja190IHN5bmM7Cit9OworCitzdGF0aWMgdm9pZCBjZnJmbWxfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKLQlzdHJ1Y3QgY2ZzcnZsICpyZm0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2ZzcnZsKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFyZm0pIHsKKwlzdHJ1Y3QgY2ZzcnZsICpzcnZsID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBjZnNydmwsIHJlZik7CisJc3RydWN0IGNmcmZtbCAqcmZtbCA9IGNvbnRhaW5lcl9vYmooJnNydmwtPmxheWVyKTsKKworCWlmIChyZm1sLT5pbmNvbXBsZXRlX2ZybSkKKwkJY2Zwa3RfZGVzdHJveShyZm1sLT5pbmNvbXBsZXRlX2ZybSk7CisKKwlrZnJlZShzcnZsKTsKK30KKworc3RydWN0IGNmbGF5ZXIgKmNmcmZtbF9jcmVhdGUodTggY2hhbm5lbF9pZCwgc3RydWN0IGRldl9pbmZvICpkZXZfaW5mbywKKwkJCQkJaW50IG10dV9zaXplKQoreworCWludCB0bXA7CisJc3RydWN0IGNmcmZtbCAqdGhpcyA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjZnJmbWwpLCBHRlBfQVRPTUlDKTsKKworCWlmICghdGhpcykgewogCQlwcl93YXJuaW5nKCJDQUlGOiAlcygpOiBPdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQljYWlmX2Fzc2VydChvZmZzZXRvZihzdHJ1Y3QgY2ZzcnZsLCBsYXllcikgPT0gMCk7Ci0JbWVtc2V0KHJmbSwgMCwgc2l6ZW9mKHN0cnVjdCBjZnNydmwpKTsKLQljZnNydmxfaW5pdChyZm0sIGNoYW5uZWxfaWQsIGRldl9pbmZvKTsKLQlyZm0tPmxheWVyLm1vZGVtY21kID0gY2ZzZXJ2bF9tb2RlbWNtZDsKLQlyZm0tPmxheWVyLnJlY2VpdmUgPSBjZnJmbWxfcmVjZWl2ZTsKLQlyZm0tPmxheWVyLnRyYW5zbWl0ID0gY2ZyZm1sX3RyYW5zbWl0OwotCXNucHJpbnRmKHJmbS0+bGF5ZXIubmFtZSwgQ0FJRl9MQVlFUl9OQU1FX1NaLCAicmZtJWQiLCBjaGFubmVsX2lkKTsKLQlyZXR1cm4gJnJmbS0+bGF5ZXI7CisKKwljZnNydmxfaW5pdCgmdGhpcy0+c2VydiwgY2hhbm5lbF9pZCwgZGV2X2luZm8sIGZhbHNlKTsKKwl0aGlzLT5zZXJ2LnJlbGVhc2UgPSBjZnJmbWxfcmVsZWFzZTsKKwl0aGlzLT5zZXJ2LmxheWVyLnJlY2VpdmUgPSBjZnJmbWxfcmVjZWl2ZTsKKwl0aGlzLT5zZXJ2LmxheWVyLnRyYW5zbWl0ID0gY2ZyZm1sX3RyYW5zbWl0OworCisJLyogUm91bmQgZG93biB0byBjbG9zZXN0IG11bHRpcGxlIG9mIDE2ICovCisJdG1wID0gKG10dV9zaXplIC0gUkZNX0hFQURfU0laRSAtIDYpIC8gMTY7CisJdG1wICo9IDE2OworCisJdGhpcy0+ZnJhZ21lbnRfc2l6ZSA9IHRtcDsKKwlzcGluX2xvY2tfaW5pdCgmdGhpcy0+c3luYyk7CisJc25wcmludGYodGhpcy0+c2Vydi5sYXllci5uYW1lLCBDQUlGX0xBWUVSX05BTUVfU1osCisJCSJyZm0lZCIsIGNoYW5uZWxfaWQpOworCisJcmV0dXJuICZ0aGlzLT5zZXJ2LmxheWVyOwogfQogCi1zdGF0aWMgaW50IGNmc2VydmxfbW9kZW1jbWQoc3RydWN0IGNmbGF5ZXIgKmxheXIsIGVudW0gY2FpZl9tb2RlbWNtZCBjdHJsKQorc3RhdGljIHN0cnVjdCBjZnBrdCAqcmZtX2FwcGVuZChzdHJ1Y3QgY2ZyZm1sICpyZm1sLCBjaGFyICpzZWdoZWFkLAorCQkJc3RydWN0IGNmcGt0ICpwa3QsIGludCAqZXJyKQogewotICAgICAgIHJldHVybiAtRVBST1RPOworCXN0cnVjdCBjZnBrdCAqdG1wcGt0OworCSplcnIgPSAtRVBST1RPOworCS8qIG4tdGggYnV0IG5vdCBsYXN0IHNlZ21lbnQgKi8KKworCWlmIChjZnBrdF9leHRyX2hlYWQocGt0LCBzZWdoZWFkLCA2KSA8IDApCisJCXJldHVybiBOVUxMOworCisJLyogVmVyaWZ5IGNvcnJlY3QgaGVhZGVyICovCisJaWYgKG1lbWNtcChzZWdoZWFkLCByZm1sLT5zZWdoZWFkLCA2KSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXRtcHBrdCA9IGNmcGt0X2FwcGVuZChyZm1sLT5pbmNvbXBsZXRlX2ZybSwgcGt0LAorCQkJcmZtbC0+cGR1X3NpemUgKyBSRk1fSEVBRF9TSVpFKTsKKworCS8qIElmIGNmcGt0X2FwcGVuZCBmYWlsZXMgaW5wdXQgcGt0cyBhcmUgbm90IGZyZWVkICovCisJKmVyciA9IC1FTk9NRU07CisJaWYgKHRtcHBrdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCSplcnIgPSAwOworCXJldHVybiB0bXBwa3Q7CiB9CiAKIHN0YXRpYyBpbnQgY2ZyZm1sX3JlY2VpdmUoc3RydWN0IGNmbGF5ZXIgKmxheXIsIHN0cnVjdCBjZnBrdCAqcGt0KQogewogCXU4IHRtcDsKIAlib29sIHNlZ21lbnRlZDsKLQlpbnQgcmV0OworCWludCBlcnI7CisJdTggc2VnaGVhZFs2XTsKKwlzdHJ1Y3QgY2ZyZm1sICpyZm1sOworCXN0cnVjdCBjZnBrdCAqdG1wcGt0ID0gTlVMTDsKKwogCWNhaWZfYXNzZXJ0KGxheXItPnVwICE9IE5VTEwpOwogCWNhaWZfYXNzZXJ0KGxheXItPnJlY2VpdmUgIT0gTlVMTCk7CisJcmZtbCA9IGNvbnRhaW5lcl9vYmoobGF5cik7CisJc3Bpbl9sb2NrKCZyZm1sLT5zeW5jKTsKIAotCS8qCi0JICogUkZNIGlzIHRha2luZyBjYXJlIG9mIHNlZ21lbnRhdGlvbiBhbmQgc3RyaXBwaW5nIG9mCi0JICogc2VnbWVudGF0aW9uIGJpdC4KLQkgKi8KLQlpZiAoY2Zwa3RfZXh0cl9oZWFkKHBrdCwgJnRtcCwgMSkgPCAwKSB7Ci0JCXByX2VycigiQ0FJRjogJXMoKTogUGFja2V0IGlzIGVycm9uZW91cyFcbiIsIF9fZnVuY19fKTsKLQkJY2Zwa3RfZGVzdHJveShwa3QpOwotCQlyZXR1cm4gLUVQUk9UTzsKLQl9CisJZXJyID0gLUVQUk9UTzsKKwlpZiAoY2Zwa3RfZXh0cl9oZWFkKHBrdCwgJnRtcCwgMSkgPCAwKQorCQlnb3RvIG91dDsKIAlzZWdtZW50ZWQgPSB0bXAgJiBSRk1fU0VHTUVOVEFUSU9OX0JJVDsKLQljYWlmX2Fzc2VydCghc2VnbWVudGVkKTsKIAotCXJldCA9IGxheXItPnVwLT5yZWNlaXZlKGxheXItPnVwLCBwa3QpOwotCXJldHVybiByZXQ7CisJaWYgKHNlZ21lbnRlZCkgeworCQlpZiAocmZtbC0+aW5jb21wbGV0ZV9mcm0gPT0gTlVMTCkgeworCQkJLyogSW5pdGlhbCBTZWdtZW50ICovCisJCQlpZiAoY2Zwa3RfcGVla19oZWFkKHBrdCwgcmZtbC0+c2VnaGVhZCwgNikgPCAwKQorCQkJCWdvdG8gb3V0OworCisJCQlyZm1sLT5wZHVfc2l6ZSA9IGdldF91bmFsaWduZWRfbGUxNihyZm1sLT5zZWdoZWFkKzQpOworCisJCQlpZiAoY2Zwa3RfZXJyb25lb3VzKHBrdCkpCisJCQkJZ290byBvdXQ7CisJCQlyZm1sLT5pbmNvbXBsZXRlX2ZybSA9IHBrdDsKKwkJCXBrdCA9IE5VTEw7CisJCX0gZWxzZSB7CisKKwkJCXRtcHBrdCA9IHJmbV9hcHBlbmQocmZtbCwgc2VnaGVhZCwgcGt0LCAmZXJyKTsKKwkJCWlmICh0bXBwa3QgPT0gTlVMTCkKKwkJCQlnb3RvIG91dDsKKworCQkJaWYgKGNmcGt0X2Vycm9uZW91cyh0bXBwa3QpKQorCQkJCWdvdG8gb3V0OworCisJCQlyZm1sLT5pbmNvbXBsZXRlX2ZybSA9IHRtcHBrdDsKKworCisJCQlpZiAoY2Zwa3RfZXJyb25lb3VzKHRtcHBrdCkpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJmbWwtPmluY29tcGxldGVfZnJtKSB7CisKKwkJLyogTGFzdCBTZWdtZW50ICovCisJCXRtcHBrdCA9IHJmbV9hcHBlbmQocmZtbCwgc2VnaGVhZCwgcGt0LCAmZXJyKTsKKwkJaWYgKHRtcHBrdCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGNmcGt0X2Vycm9uZW91cyh0bXBwa3QpKQorCQkJZ290byBvdXQ7CisKKwkJcmZtbC0+aW5jb21wbGV0ZV9mcm0gPSBOVUxMOworCQlwa3QgPSB0bXBwa3Q7CisJCXRtcHBrdCA9IE5VTEw7CisKKwkJLyogVmVyaWZ5IHRoYXQgbGVuZ3RoIGlzIGNvcnJlY3QgKi8KKwkJZXJyID0gRVBST1RPOworCQlpZiAocmZtbC0+cGR1X3NpemUgIT0gY2Zwa3RfZ2V0bGVuKHBrdCkgLSBSRk1fSEVBRF9TSVpFICsgMSkKKwkJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHJmbWwtPnNlcnYubGF5ZXIudXAtPnJlY2VpdmUocmZtbC0+c2Vydi5sYXllci51cCwgcGt0KTsKKworb3V0OgorCisJaWYgKGVyciAhPSAwKSB7CisJCWlmICh0bXBwa3QpCisJCQljZnBrdF9kZXN0cm95KHRtcHBrdCk7CisJCWlmIChwa3QpCisJCQljZnBrdF9kZXN0cm95KHBrdCk7CisJCWlmIChyZm1sLT5pbmNvbXBsZXRlX2ZybSkKKwkJCWNmcGt0X2Rlc3Ryb3kocmZtbC0+aW5jb21wbGV0ZV9mcm0pOworCQlyZm1sLT5pbmNvbXBsZXRlX2ZybSA9IE5VTEw7CisKKwkJcHJfaW5mbygiQ0FJRjogJXMoKTogIgorCQkJCSJDb25uZWN0aW9uIGVycm9yICVkIHRyaWdnZXJlZCBvbiBSRk0gbGlua1xuIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKworCQkvKiBUcmlnZ2VyIGNvbm5lY3Rpb24gZXJyb3IgdXBvbiBmYWlsdXJlLiovCisJCWxheXItPnVwLT5jdHJsY21kKGxheXItPnVwLCBDQUlGX0NUUkxDTURfUkVNT1RFX1NIVVRET1dOX0lORCwKKwkJCQkJcmZtbC0+c2Vydi5kZXZfaW5mby5pZCk7CisJfQorCXNwaW5fdW5sb2NrKCZyZm1sLT5zeW5jKTsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGNmcmZtbF90cmFuc21pdChzdHJ1Y3QgY2ZsYXllciAqbGF5ciwgc3RydWN0IGNmcGt0ICpwa3QpCisKK3N0YXRpYyBpbnQgY2ZyZm1sX3RyYW5zbWl0X3NlZ21lbnQoc3RydWN0IGNmcmZtbCAqcmZtbCwgc3RydWN0IGNmcGt0ICpwa3QpCiB7Ci0JdTggdG1wID0gMDsKLQlpbnQgcmV0OwotCXN0cnVjdCBjZnNydmwgKnNlcnZpY2UgPSBjb250YWluZXJfb2JqKGxheXIpOwotCi0JY2FpZl9hc3NlcnQobGF5ci0+ZG4gIT0gTlVMTCk7Ci0JY2FpZl9hc3NlcnQobGF5ci0+ZG4tPnRyYW5zbWl0ICE9IE5VTEwpOwotCi0JaWYgKCFjZnNydmxfcmVhZHkoc2VydmljZSwgJnJldCkpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY2Zwa3RfZ2V0bGVuKHBrdCkgPiBDQUlGX01BWF9QQVlMT0FEX1NJWkUpIHsKLQkJcHJfZXJyKCJDQUlGOiAlcygpOlBhY2tldCB0b28gbGFyZ2UgLSBzaXplPSVkXG4iLAotCQkJX19mdW5jX18sIGNmcGt0X2dldGxlbihwa3QpKTsKLQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JfQotCWlmIChjZnBrdF9hZGRfaGVhZChwa3QsICZ0bXAsIDEpIDwgMCkgewotCQlwcl9lcnIoIkNBSUY6ICVzKCk6IFBhY2tldCBpcyBlcnJvbmVvdXMhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBST1RPOwotCX0KKwljYWlmX2Fzc2VydChjZnBrdF9nZXRsZW4ocGt0KSA+PSByZm1sLT5mcmFnbWVudF9zaXplKTsKIAogCS8qIEFkZCBpbmZvIGZvciBNVVgtbGF5ZXIgdG8gcm91dGUgdGhlIHBhY2tldCBvdXQuICovCi0JY2Zwa3RfaW5mbyhwa3QpLT5jaGFubmVsX2lkID0gc2VydmljZS0+bGF5ZXIuaWQ7CisJY2Zwa3RfaW5mbyhwa3QpLT5jaGFubmVsX2lkID0gcmZtbC0+c2Vydi5sYXllci5pZDsKKwogCS8qCiAJICogVG8gb3B0aW1pemUgYWxpZ25tZW50LCB3ZSBhZGQgdXAgdGhlIHNpemUgb2YgQ0FJRiBoZWFkZXIgYmVmb3JlCiAJICogcGF5bG9hZC4KIAkgKi8KLQljZnBrdF9pbmZvKHBrdCktPmhkcl9sZW4gPSAxOwotCWNmcGt0X2luZm8ocGt0KS0+ZGV2X2luZm8gPSAmc2VydmljZS0+ZGV2X2luZm87Ci0JcmV0ID0gbGF5ci0+ZG4tPnRyYW5zbWl0KGxheXItPmRuLCBwa3QpOwotCWlmIChyZXQgPCAwKQotCQljZnBrdF9leHRyX2hlYWQocGt0LCAmdG1wLCAxKTsKLQlyZXR1cm4gcmV0OworCWNmcGt0X2luZm8ocGt0KS0+aGRyX2xlbiA9IFJGTV9IRUFEX1NJWkU7CisJY2Zwa3RfaW5mbyhwa3QpLT5kZXZfaW5mbyA9ICZyZm1sLT5zZXJ2LmRldl9pbmZvOworCisJcmV0dXJuIHJmbWwtPnNlcnYubGF5ZXIuZG4tPnRyYW5zbWl0KHJmbWwtPnNlcnYubGF5ZXIuZG4sIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgY2ZyZm1sX3RyYW5zbWl0KHN0cnVjdCBjZmxheWVyICpsYXlyLCBzdHJ1Y3QgY2Zwa3QgKnBrdCkKK3sKKwlpbnQgZXJyOworCXU4IHNlZzsKKwl1OCBoZWFkWzZdOworCXN0cnVjdCBjZnBrdCAqcmVhcnBrdCA9IE5VTEw7CisJc3RydWN0IGNmcGt0ICpmcm9udHBrdCA9IHBrdDsKKwlzdHJ1Y3QgY2ZyZm1sICpyZm1sID0gY29udGFpbmVyX29iaihsYXlyKTsKKworCWNhaWZfYXNzZXJ0KGxheXItPmRuICE9IE5VTEwpOworCWNhaWZfYXNzZXJ0KGxheXItPmRuLT50cmFuc21pdCAhPSBOVUxMKTsKKworCWlmICghY2ZzcnZsX3JlYWR5KCZyZm1sLT5zZXJ2LCAmZXJyKSkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IC1FUFJPVE87CisJaWYgKGNmcGt0X2dldGxlbihwa3QpIDw9IFJGTV9IRUFEX1NJWkUtMSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCWlmIChjZnBrdF9nZXRsZW4ocGt0KSA+IHJmbWwtPmZyYWdtZW50X3NpemUgKyBSRk1fSEVBRF9TSVpFKQorCQllcnIgPSBjZnBrdF9wZWVrX2hlYWQocGt0LCBoZWFkLCA2KTsKKworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCXdoaWxlIChjZnBrdF9nZXRsZW4oZnJvbnRwa3QpID4gcmZtbC0+ZnJhZ21lbnRfc2l6ZSArIFJGTV9IRUFEX1NJWkUpIHsKKworCQlzZWcgPSAxOworCQllcnIgPSAtRVBST1RPOworCisJCWlmIChjZnBrdF9hZGRfaGVhZChmcm9udHBrdCwgJnNlZywgMSkgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qCisJCSAqIE9uIE9PTSBlcnJvciBjZnBrdF9zcGxpdCByZXR1cm5zIE5VTEwuCisJCSAqCisJCSAqIE5PVEU6IFNlZ21lbnRlZCBwZHUgaXMgbm90IGNvcnJlY3RseSBhbGlnbmVkLgorCQkgKiBUaGlzIGhhcyBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QuCisJCSAqLworCisJCXJlYXJwa3QgPSBjZnBrdF9zcGxpdChmcm9udHBrdCwgcmZtbC0+ZnJhZ21lbnRfc2l6ZSk7CisJCWlmIChyZWFycGt0ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSBjZnJmbWxfdHJhbnNtaXRfc2VnbWVudChyZm1sLCBmcm9udHBrdCk7CisKKwkJaWYgKGVyciAhPSAwKQorCQkJZ290byBvdXQ7CisJCWZyb250cGt0ID0gcmVhcnBrdDsKKwkJcmVhcnBrdCA9IE5VTEw7CisKKwkJZXJyID0gLUVOT01FTTsKKwkJaWYgKGZyb250cGt0ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gLUVQUk9UTzsKKwkJaWYgKGNmcGt0X2FkZF9oZWFkKGZyb250cGt0LCBoZWFkLCA2KSA8IDApCisJCQlnb3RvIG91dDsKKworCX0KKworCXNlZyA9IDA7CisJZXJyID0gLUVQUk9UTzsKKworCWlmIChjZnBrdF9hZGRfaGVhZChmcm9udHBrdCwgJnNlZywgMSkgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IGNmcmZtbF90cmFuc21pdF9zZWdtZW50KHJmbWwsIGZyb250cGt0KTsKKworCWZyb250cGt0ID0gTlVMTDsKK291dDoKKworCWlmIChlcnIgIT0gMCkgeworCQlwcl9pbmZvKCJDQUlGOiAlcygpOiAiCisJCQkJIkNvbm5lY3Rpb24gZXJyb3IgJWQgdHJpZ2dlcmVkIG9uIFJGTSBsaW5rXG4iLAorCQkJCV9fZnVuY19fLCBlcnIpOworCQkvKiBUcmlnZ2VyIGNvbm5lY3Rpb24gZXJyb3IgdXBvbiBmYWlsdXJlLiovCisKKwkJbGF5ci0+dXAtPmN0cmxjbWQobGF5ci0+dXAsIENBSUZfQ1RSTENNRF9SRU1PVEVfU0hVVERPV05fSU5ELAorCQkJCQlyZm1sLT5zZXJ2LmRldl9pbmZvLmlkKTsKKworCQlpZiAocmVhcnBrdCkKKwkJCWNmcGt0X2Rlc3Ryb3kocmVhcnBrdCk7CisKKwkJaWYgKGZyb250cGt0ICYmIGZyb250cGt0ICE9IHBrdCkgeworCisJCQljZnBrdF9kZXN0cm95KGZyb250cGt0KTsKKwkJCS8qCisJCQkgKiBTb2NrZXQgbGF5ZXIgd2lsbCBmcmVlIHRoZSBvcmlnaW5hbCBwYWNrZXQsCisJCQkgKiBidXQgdGhpcyBwYWNrZXQgbWF5IGFscmVhZHkgYmUgc2VudCBhbmQKKwkJCSAqIGZyZWVkLiBTbyB3ZSBoYXZlIHRvIHJldHVybiAwIGluIHRoaXMgY2FzZQorCQkJICogdG8gYXZvaWQgc29ja2V0IGxheWVyIHRvIHJlLWZyZWUgdGhpcyBwYWNrZXQuCisJCQkgKiBUaGUgcmV0dXJuIG9mIHNodXRkb3duIGluZGljYXRpb24gd2lsbAorCQkJICogY2F1c2UgY29ubmVjdGlvbiB0byBiZSBpbnZhbGlkYXRlZCBhbnlob3cuCisJCQkgKi8KKwkJCWVyciA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2ZzZXJsLmMgYi9uZXQvY2FpZi9jZnNlcmwuYwppbmRleCA5NjVjNWJhLi5hMTFmYmQ2IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZnNlcmwuYworKysgYi9uZXQvY2FpZi9jZnNlcmwuYwpAQCAtMTQsNyArMTQsOCBAQAogI2RlZmluZSBjb250YWluZXJfb2JqKGxheXIpICgoc3RydWN0IGNmc2VybCAqKSBsYXlyKQogCiAjZGVmaW5lIENGU0VSTF9TVFggMHgwMgotI2RlZmluZSBDQUlGX01JTklVTV9QQUNLRVRfU0laRSA0CisjZGVmaW5lIFNFUklBTF9NSU5JVU1fUEFDS0VUX1NJWkUgNAorI2RlZmluZSBTRVJJQUxfTUFYX0ZSQU1FU0laRSA0MDk2CiBzdHJ1Y3QgY2ZzZXJsIHsKIAlzdHJ1Y3QgY2ZsYXllciBsYXllcjsKIAlzdHJ1Y3QgY2Zwa3QgKmluY29tcGxldGVfZnJtOwpAQCAtMTE5LDggKzEyMCw4IEBACiAJCS8qCiAJCSAqIEZyYW1lIGVycm9yIGhhbmRsaW5nCiAJCSAqLwotCQlpZiAoZXhwZWN0bGVuIDwgQ0FJRl9NSU5JVU1fUEFDS0VUX1NJWkUKLQkJICAgIHx8IGV4cGVjdGxlbiA+IENBSUZfTUFYX0ZSQU1FU0laRSkgeworCQlpZiAoZXhwZWN0bGVuIDwgU0VSSUFMX01JTklVTV9QQUNLRVRfU0laRQorCQkgICAgfHwgZXhwZWN0bGVuID4gU0VSSUFMX01BWF9GUkFNRVNJWkUpIHsKIAkJCWlmICghbGF5ci0+dXNlc3R4KSB7CiAJCQkJaWYgKHBrdCAhPSBOVUxMKQogCQkJCQljZnBrdF9kZXN0cm95KHBrdCk7CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZnNydmwuYyBiL25ldC9jYWlmL2Nmc3J2bC5jCmluZGV4IDZlNWI3MDc5Li5mNDA5MzlhIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZnNydmwuYworKysgYi9uZXQvY2FpZi9jZnNydmwuYwpAQCAtMjQsOCArMjQsMTAgQEAKIAkJCQlpbnQgcGh5aWQpCiB7CiAJc3RydWN0IGNmc3J2bCAqc2VydmljZSA9IGNvbnRhaW5lcl9vYmoobGF5cik7CisKIAljYWlmX2Fzc2VydChsYXlyLT51cCAhPSBOVUxMKTsKIAljYWlmX2Fzc2VydChsYXlyLT51cC0+Y3RybGNtZCAhPSBOVUxMKTsKKwogCXN3aXRjaCAoY3RybCkgewogCWNhc2UgQ0FJRl9DVFJMQ01EX0lOSVRfUlNQOgogCQlzZXJ2aWNlLT5vcGVuID0gdHJ1ZTsKQEAgLTg5LDkgKzkxLDE0IEBACiBzdGF0aWMgaW50IGNmc2VydmxfbW9kZW1jbWQoc3RydWN0IGNmbGF5ZXIgKmxheXIsIGVudW0gY2FpZl9tb2RlbWNtZCBjdHJsKQogewogCXN0cnVjdCBjZnNydmwgKnNlcnZpY2UgPSBjb250YWluZXJfb2JqKGxheXIpOworCiAJY2FpZl9hc3NlcnQobGF5ciAhPSBOVUxMKTsKIAljYWlmX2Fzc2VydChsYXlyLT5kbiAhPSBOVUxMKTsKIAljYWlmX2Fzc2VydChsYXlyLT5kbi0+dHJhbnNtaXQgIT0gTlVMTCk7CisKKwlpZiAoIXNlcnZpY2UtPnN1cHBvcnRzX2Zsb3djdHJsKQorCQlyZXR1cm4gMDsKKwogCXN3aXRjaCAoY3RybCkgewogCWNhc2UgQ0FJRl9NT0RFTUNNRF9GTE9XX09OX1JFUToKIAkJewpAQCAtMTUyLDkgKzE1OSwxNyBAQAogCWtmcmVlKGxheWVyKTsKIH0KIAordm9pZCBjZnNydmxfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgY2ZzcnZsICpzZXJ2aWNlID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBjZnNydmwsIHJlZik7CisJa2ZyZWUoc2VydmljZSk7Cit9CisKIHZvaWQgY2ZzcnZsX2luaXQoc3RydWN0IGNmc3J2bCAqc2VydmljZSwKLQkJIHU4IGNoYW5uZWxfaWQsCi0JCSBzdHJ1Y3QgZGV2X2luZm8gKmRldl9pbmZvKQorCQkJdTggY2hhbm5lbF9pZCwKKwkJCXN0cnVjdCBkZXZfaW5mbyAqZGV2X2luZm8sCisJCQlib29sIHN1cHBvcnRzX2Zsb3djdHJsCisJCQkpCiB7CiAJY2FpZl9hc3NlcnQob2Zmc2V0b2Yoc3RydWN0IGNmc3J2bCwgbGF5ZXIpID09IDApOwogCXNlcnZpY2UtPm9wZW4gPSBmYWxzZTsKQEAgLTE2NCwxNCArMTc5LDExIEBACiAJc2VydmljZS0+bGF5ZXIuY3RybGNtZCA9IGNmc2VydmxfY3RybGNtZDsKIAlzZXJ2aWNlLT5sYXllci5tb2RlbWNtZCA9IGNmc2VydmxfbW9kZW1jbWQ7CiAJc2VydmljZS0+ZGV2X2luZm8gPSAqZGV2X2luZm87CisJc2VydmljZS0+c3VwcG9ydHNfZmxvd2N0cmwgPSBzdXBwb3J0c19mbG93Y3RybDsKKwlzZXJ2aWNlLT5yZWxlYXNlID0gY2ZzcnZsX3JlbGVhc2U7CiAJa3JlZl9pbml0KCZzZXJ2aWNlLT5yZWYpOwogfQogCi12b2lkIGNmc3J2bF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCBjZnNydmwgKnNlcnZpY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGNmc3J2bCwgcmVmKTsKLQlrZnJlZShzZXJ2aWNlKTsKLX0KIAogYm9vbCBjZnNydmxfcmVhZHkoc3RydWN0IGNmc3J2bCAqc2VydmljZSwgaW50ICplcnIpCiB7CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZnV0aWxsLmMgYi9uZXQvY2FpZi9jZnV0aWxsLmMKaW5kZXggNWZkMmM5ZS4uMDI3OTVhZiAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2Z1dGlsbC5jCisrKyBiL25ldC9jYWlmL2NmdXRpbGwuYwpAQCAtMzEsNyArMzEsNyBAQAogCX0KIAljYWlmX2Fzc2VydChvZmZzZXRvZihzdHJ1Y3QgY2ZzcnZsLCBsYXllcikgPT0gMCk7CiAJbWVtc2V0KHV0aWwsIDAsIHNpemVvZihzdHJ1Y3QgY2ZzcnZsKSk7Ci0JY2ZzcnZsX2luaXQodXRpbCwgY2hhbm5lbF9pZCwgZGV2X2luZm8pOworCWNmc3J2bF9pbml0KHV0aWwsIGNoYW5uZWxfaWQsIGRldl9pbmZvLCB0cnVlKTsKIAl1dGlsLT5sYXllci5yZWNlaXZlID0gY2Z1dGlsbF9yZWNlaXZlOwogCXV0aWwtPmxheWVyLnRyYW5zbWl0ID0gY2Z1dGlsbF90cmFuc21pdDsKIAlzbnByaW50Zih1dGlsLT5sYXllci5uYW1lLCBDQUlGX0xBWUVSX05BTUVfU1ogLSAxLCAidXRpbDEiKTsKQEAgLTkwLDEyICs5MCw2IEBACiAJaWYgKCFjZnNydmxfcmVhZHkoc2VydmljZSwgJnJldCkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoY2Zwa3RfZ2V0bGVuKHBrdCkgPiBDQUlGX01BWF9QQVlMT0FEX1NJWkUpIHsKLQkJcHJfZXJyKCJDQUlGOiAlcygpOiBwYWNrZXQgdG9vIGxhcmdlIHNpemU9JWRcbiIsCi0JCQlfX2Z1bmNfXywgY2Zwa3RfZ2V0bGVuKHBrdCkpOwotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQl9Ci0KIAljZnBrdF9hZGRfaGVhZChwa3QsICZ6ZXJvLCAxKTsKIAkvKiBBZGQgaW5mbyBmb3IgTVVYLWxheWVyIHRvIHJvdXRlIHRoZSBwYWNrZXQgb3V0LiAqLwogCWluZm8gPSBjZnBrdF9pbmZvKHBrdCk7CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jZnZlaWwuYyBiL25ldC9jYWlmL2NmdmVpbC5jCmluZGV4IGUwNGY3ZDkuLjc3Y2MwOWYgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NmdmVpbC5jCisrKyBiL25ldC9jYWlmL2NmdmVpbC5jCkBAIC0zMCw3ICszMCw3IEBACiAJfQogCWNhaWZfYXNzZXJ0KG9mZnNldG9mKHN0cnVjdCBjZnNydmwsIGxheWVyKSA9PSAwKTsKIAltZW1zZXQodmVpLCAwLCBzaXplb2Yoc3RydWN0IGNmc3J2bCkpOwotCWNmc3J2bF9pbml0KHZlaSwgY2hhbm5lbF9pZCwgZGV2X2luZm8pOworCWNmc3J2bF9pbml0KHZlaSwgY2hhbm5lbF9pZCwgZGV2X2luZm8sIHRydWUpOwogCXZlaS0+bGF5ZXIucmVjZWl2ZSA9IGNmdmVpX3JlY2VpdmU7CiAJdmVpLT5sYXllci50cmFuc21pdCA9IGNmdmVpX3RyYW5zbWl0OwogCXNucHJpbnRmKHZlaS0+bGF5ZXIubmFtZSwgQ0FJRl9MQVlFUl9OQU1FX1NaIC0gMSwgInZlaSVkIiwgY2hhbm5lbF9pZCk7CkBAIC04NCwxMSArODQsNiBAQAogCQlyZXR1cm4gcmV0OwogCWNhaWZfYXNzZXJ0KGxheXItPmRuICE9IE5VTEwpOwogCWNhaWZfYXNzZXJ0KGxheXItPmRuLT50cmFuc21pdCAhPSBOVUxMKTsKLQlpZiAoY2Zwa3RfZ2V0bGVuKHBrdCkgPiBDQUlGX01BWF9QQVlMT0FEX1NJWkUpIHsKLQkJcHJfd2FybmluZygiQ0FJRjogJXMoKTogUGFja2V0IHRvbyBsYXJnZSAtIHNpemU9JWRcbiIsCi0JCQkgICBfX2Z1bmNfXywgY2Zwa3RfZ2V0bGVuKHBrdCkpOwotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQl9CiAKIAlpZiAoY2Zwa3RfYWRkX2hlYWQocGt0LCAmdG1wLCAxKSA8IDApIHsKIAkJcHJfZXJyKCJDQUlGOiAlcygpOiBQYWNrZXQgaXMgZXJyb25lb3VzIVxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2Z2aWRsLmMgYi9uZXQvY2FpZi9jZnZpZGwuYwppbmRleCA4OWFkNGVhLi5hZGE2ZWUyIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZnZpZGwuYworKysgYi9uZXQvY2FpZi9jZnZpZGwuYwpAQCAtMjcsNyArMjcsNyBAQAogCWNhaWZfYXNzZXJ0KG9mZnNldG9mKHN0cnVjdCBjZnNydmwsIGxheWVyKSA9PSAwKTsKIAogCW1lbXNldCh2aWQsIDAsIHNpemVvZihzdHJ1Y3QgY2ZzcnZsKSk7Ci0JY2ZzcnZsX2luaXQodmlkLCBjaGFubmVsX2lkLCBkZXZfaW5mbyk7CisJY2ZzcnZsX2luaXQodmlkLCBjaGFubmVsX2lkLCBkZXZfaW5mbywgZmFsc2UpOwogCXZpZC0+bGF5ZXIucmVjZWl2ZSA9IGNmdmlkbF9yZWNlaXZlOwogCXZpZC0+bGF5ZXIudHJhbnNtaXQgPSBjZnZpZGxfdHJhbnNtaXQ7CiAJc25wcmludGYodmlkLT5sYXllci5uYW1lLCBDQUlGX0xBWUVSX05BTUVfU1ogLSAxLCAidmlkMSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2hubF9uZXQuYyBiL25ldC9jYWlmL2NobmxfbmV0LmMKaW5kZXggNjEwOTY2YS4uNDI5M2UxOSAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2hubF9uZXQuYworKysgYi9uZXQvY2FpZi9jaG5sX25ldC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9kZXYuaD4KIAogLyogR1BSUyBQRFAgY29ubmVjdGlvbiBoYXMgTVRVIHRvIDE1MDAgKi8KLSNkZWZpbmUgU0laRV9NVFUgMTUwMAorI2RlZmluZSBHUFJTX1BEUF9NVFUgMTUwMAogLyogNSBzZWMuIGNvbm5lY3QgdGltZW91dCAqLwogI2RlZmluZSBDT05ORUNUX1RJTUVPVVQgKDUgKiBIWikKICNkZWZpbmUgQ0FJRl9ORVRfREVGQVVMVF9RVUVVRV9MRU4gNTAwCkBAIC0yMzIsNiArMjMyLDggQEAKIHsKIAlzdHJ1Y3QgY2hubF9uZXQgKnByaXYgPSBOVUxMOwogCWludCByZXN1bHQgPSAtMTsKKwlpbnQgbGxpZmluZGV4LCBoZWFkcm9vbSwgdGFpbHJvb20sIG10dTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbGxkZXY7CiAJQVNTRVJUX1JUTkwoKTsKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpZiAoIXByaXYpIHsKQEAgLTI0MSw0MSArMjQzLDg4IEBACiAKIAlpZiAocHJpdi0+c3RhdGUgIT0gQ0FJRl9DT05ORUNUSU5HKSB7CiAJCXByaXYtPnN0YXRlID0gQ0FJRl9DT05ORUNUSU5HOwotCQlyZXN1bHQgPSBjYWlmX2Nvbm5lY3RfY2xpZW50KCZwcml2LT5jb25uX3JlcSwgJnByaXYtPmNobmwpOworCQlyZXN1bHQgPSBjYWlmX2Nvbm5lY3RfY2xpZW50KCZwcml2LT5jb25uX3JlcSwgJnByaXYtPmNobmwsCisJCQkJCSZsbGlmaW5kZXgsICZoZWFkcm9vbSwgJnRhaWxyb29tKTsKIAkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJcHJpdi0+c3RhdGUgPSBDQUlGX0RJU0NPTk5FQ1RFRDsKIAkJCQlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogZXJyOiAiCiAJCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgYW5kIG9wZW4gZGV2aWNlLCIKIAkJCQkJIiBFcnI6JWRcbiIsCiAJCQkJCV9fZnVuY19fLAogCQkJCQlyZXN1bHQpOwotCQkJCXJldHVybiByZXN1bHQ7CisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWxsZGV2ID0gZGV2X2dldF9ieV9pbmRleChkZXZfbmV0KGRldiksIGxsaWZpbmRleCk7CisKKwkJaWYgKGxsZGV2ID09IE5VTEwpIHsKKwkJCXByX2RlYnVnKCJDQUlGOiAlcygpOiBubyBpbnRlcmZhY2U/XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWRldi0+bmVlZGVkX3RhaWxyb29tID0gdGFpbHJvb20gKyBsbGRldi0+bmVlZGVkX3RhaWxyb29tOworCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IGhlYWRyb29tICsgbGxkZXYtPmhhcmRfaGVhZGVyX2xlbiArCisJCQlsbGRldi0+bmVlZGVkX3RhaWxyb29tOworCisJCS8qCisJCSAqIE1UVSwgaGVhZC1yb29tIGV0YyBpcyBub3Qga25vdyBiZWZvcmUgd2UgaGF2ZSBhCisJCSAqIENBSUYgbGluayBsYXllciBkZXZpY2UgYXZhaWxhYmxlLiBNVFUgY2FsY3VsYXRpb24gbWF5CisJCSAqIG92ZXJyaWRlIGluaXRpYWwgUlROTCBjb25maWd1cmF0aW9uLgorCQkgKiBNVFUgaXMgbWluaW11bSBvZiBjdXJyZW50IG10dSwgbGluayBsYXllciBtdHUgcGx1c3MKKwkJICogQ0FJRiBoZWFkIGFuZCB0YWlsLCBhbmQgUERQIEdQUlMgY29udGV4dHMgbWF4IE1UVS4KKwkJICovCisJCW10dSA9IG1pbl90KGludCwgZGV2LT5tdHUsIGxsZGV2LT5tdHUgLSAoaGVhZHJvb20gKyB0YWlscm9vbSkpOworCQltdHUgPSBtaW5fdChpbnQsIEdQUlNfUERQX01UVSwgbXR1KTsKKwkJZGV2X3NldF9tdHUoZGV2LCBtdHUpOworCQlkZXZfcHV0KGxsZGV2KTsKKworCQlpZiAobXR1IDwgMTAwKSB7CisJCQlwcl93YXJuaW5nKCJDQUlGOiAlcygpOiAiCisJCQkJIkNBSUYgSW50ZXJmYWNlIE1UVSB0b28gc21hbGwgKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgbXR1KTsKKwkJCXJlc3VsdCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycm9yOwogCQl9CiAJfQogCisJcnRubF91bmxvY2soKTsgIC8qIFJlbGVhc2UgUlROTCBsb2NrIGR1cmluZyBjb25uZWN0IHdhaXQgKi8KKwogCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHByaXYtPm5ldG1nbXRfd3EsCiAJCQkJCQlwcml2LT5zdGF0ZSAhPSBDQUlGX0NPTk5FQ1RJTkcsCiAJCQkJCQlDT05ORUNUX1RJTUVPVVQpOwogCisJcnRubF9sb2NrKCk7CisKIAlpZiAocmVzdWx0ID09IC1FUkVTVEFSVFNZUykgewogCQlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIgogCQkJICIgd29rZW4gYnkgYSBzaWduYWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGVycm9yOwogCX0KKwogCWlmIChyZXN1bHQgPT0gMCkgewogCQlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogY29ubmVjdCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CiAJCWNhaWZfZGlzY29ubmVjdF9jbGllbnQoJnByaXYtPmNobmwpOwogCQlwcml2LT5zdGF0ZSA9IENBSUZfRElTQ09OTkVDVEVEOwogCQlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogc3RhdGUgZGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVRJTUVET1VUOworCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycm9yOwogCX0KIAogCWlmIChwcml2LT5zdGF0ZSAhPSBDQUlGX0NPTk5FQ1RFRCkgewogCQlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogY29ubmVjdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJCXJlc3VsdCA9IC1FQ09OTlJFRlVTRUQ7CisJCWdvdG8gZXJyb3I7CiAJfQogCXByX2RlYnVnKCJDQUlGOiAlcygpOiBDQUlGIE5ldGRldmljZSBjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJY2FpZl9kaXNjb25uZWN0X2NsaWVudCgmcHJpdi0+Y2hubCk7CisJcHJpdi0+c3RhdGUgPSBDQUlGX0RJU0NPTk5FQ1RFRDsKKwlwcl9kZWJ1ZygiQ0FJRjogJXMoKTogc3RhdGUgZGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJlc3VsdDsKKwogfQogCiBzdGF0aWMgaW50IGNobmxfbmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTMyMSw5ICszNzAsNyBAQAogCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OwogCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOwogCWRldi0+ZmxhZ3MgfD0gSUZGX1BPSU5UT1BPSU5UOwotCWRldi0+bmVlZGVkX2hlYWRyb29tID0gQ0FJRl9ORUVERURfSEVBRFJPT007Ci0JZGV2LT5uZWVkZWRfdGFpbHJvb20gPSBDQUlGX05FRURFRF9UQUlMUk9PTTsKLQlkZXYtPm10dSA9IFNJWkVfTVRVOworCWRldi0+bXR1ID0gR1BSU19QRFBfTVRVOwogCWRldi0+dHhfcXVldWVfbGVuID0gQ0FJRl9ORVRfREVGQVVMVF9RVUVVRV9MRU47CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9jYW4vcmF3LmMgYi9uZXQvY2FuL3Jhdy5jCmluZGV4IGRhOTljZjEuLmExMGUzMzMgMTAwNjQ0Ci0tLSBhL25ldC9jYW4vcmF3LmMKKysrIGIvbmV0L2Nhbi9yYXcuYwpAQCAtNDM2LDE0ICs0MzYsOSBAQAogCiAJCWlmIChjb3VudCA+IDEpIHsKIAkJCS8qIGZpbHRlciBkb2VzIG5vdCBmaXQgaW50byBkZmlsdGVyID0+IGFsbG9jIHNwYWNlICovCi0JCQlmaWx0ZXIgPSBrbWFsbG9jKG9wdGxlbiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWZpbHRlcikKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGZpbHRlciwgb3B0dmFsLCBvcHRsZW4pKSB7Ci0JCQkJa2ZyZWUoZmlsdGVyKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KKwkJCWZpbHRlciA9IG1lbWR1cF91c2VyKG9wdHZhbCwgb3B0bGVuKTsKKwkJCWlmIChJU19FUlIoZmlsdGVyKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihmaWx0ZXIpOwogCQl9IGVsc2UgaWYgKGNvdW50ID09IDEpIHsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmc2ZpbHRlciwgb3B0dmFsLCBzaXplb2Yoc2ZpbHRlcikpKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtNjU1LDYgKzY1MCwxMCBAQAogCWVyciA9IHNvY2tfdHhfdGltZXN0YW1wKG1zZywgc2ssIHNrYl90eChza2IpKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmcmVlX3NrYjsKKworCS8qIHRvIGJlIGFibGUgdG8gY2hlY2sgdGhlIHJlY2VpdmVkIHR4IHNvY2sgcmVmZXJlbmNlIGluIHJhd19yY3YoKSAqLworCXNrYl90eChza2IpLT5wcmV2ZW50X3NrX29ycGhhbiA9IDE7CisKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPnNrICA9IHNrOwogCmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggZWMyNGQ5ZS4uNjNkMjYwZSAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtODEsNyArODEsNyBAQAogCWludCB0b3RfbGVuOwogCiAJaWYgKGtlcm5fbXNnLT5tc2dfbmFtZWxlbikgewotCQlpZiAobW9kZT09VkVSSUZZX1JFQUQpIHsKKwkJaWYgKG1vZGUgPT0gVkVSSUZZX1JFQUQpIHsKIAkJCWludCBlcnIgPSBtb3ZlX2FkZHJfdG9fa2VybmVsKGtlcm5fbXNnLT5tc2dfbmFtZSwKIAkJCQkJCSAgICAgIGtlcm5fbXNnLT5tc2dfbmFtZWxlbiwKIAkJCQkJCSAgICAgIGtlcm5fYWRkcmVzcyk7CkBAIC0zNTQsNyArMzU0LDcgQEAKIHN0YXRpYyBpbnQgZG9fc2V0X3NvY2tfdGltZW91dChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsCiAJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewotCXN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnVwID0gKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKikgb3B0dmFsOworCXN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnVwID0gKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKilvcHR2YWw7CiAJc3RydWN0IHRpbWV2YWwga3RpbWU7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKIAlpbnQgZXJyOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCW9sZF9mcyA9IGdldF9mcygpOwogCXNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHNvY2tfc2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgKGNoYXIgKikgJmt0aW1lLCBzaXplb2Yoa3RpbWUpKTsKKwllcnIgPSBzb2NrX3NldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIChjaGFyICopJmt0aW1lLCBzaXplb2Yoa3RpbWUpKTsKIAlzZXRfZnMob2xkX2ZzKTsKIAogCXJldHVybiBlcnI7CkBAIC0zODksMTEgKzM4OSwxMCBAQAogCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKIAotCWlmICgoc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpKSE9TlVMTCkKLQl7Ci0JCWVyciA9IHNlY3VyaXR5X3NvY2tldF9zZXRzb2Nrb3B0KHNvY2ssbGV2ZWwsb3B0bmFtZSk7CisJaWYgKHNvY2spIHsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X3NldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUpOwogCQlpZiAoZXJyKSB7CiAJCQlzb2NrZmRfcHV0KHNvY2spOwogCQkJcmV0dXJuIGVycjsKQEAgLTQ1Myw3ICs0NTIsNyBAQAogaW50IGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnVzZXJzdGFtcCkKIHsKIAlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpjdHYgPQotCQkJKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIqKSB1c2Vyc3RhbXA7CisJCQkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqKSB1c2Vyc3RhbXA7CiAJaW50IGVyciA9IC1FTk9FTlQ7CiAJc3RydWN0IHRpbWV2YWwgdHY7CiAKQEAgLTQ3Nyw3ICs0NzYsNyBAQAogaW50IGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXBucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnVzZXJzdGFtcCkKIHsKIAlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3R2ID0KLQkJCShzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciopIHVzZXJzdGFtcDsKKwkJCShzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqKSB1c2Vyc3RhbXA7CiAJaW50IGVyciA9IC1FTk9FTlQ7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwogCkBAIC01MDIsMTIgKzUwMSwxMCBAQAogCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOwogCi0JaWYgKChzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwgJmVycikpIT1OVUxMKQotCXsKLQkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2dldHNvY2tvcHQoc29jaywgbGV2ZWwsCi0JCQkJCQkJICAgb3B0bmFtZSk7CisJaWYgKHNvY2spIHsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2dldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUpOwogCQlpZiAoZXJyKSB7CiAJCQlzb2NrZmRfcHV0KHNvY2spOwogCQkJcmV0dXJuIGVycjsKQEAgLTUzMSw3ICs1MjgsNyBAQAogCV9fdTMyCQkJCSBncl9pbnRlcmZhY2U7CiAJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3JfZ3JvdXAKIAkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNvbXBhdF9ncm91cF9zb3VyY2VfcmVxIHsKIAlfX3UzMgkJCQkgZ3NyX2ludGVyZmFjZTsKQEAgLTUzOSw3ICs1MzYsNyBAQAogCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOwogCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdzcl9zb3VyY2UKIAkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGNvbXBhdF9ncm91cF9maWx0ZXIgewogCV9fdTMyCQkJCSBnZl9pbnRlcmZhY2U7CkBAIC01NDksNyArNTQ2LDcgQEAKIAlfX3UzMgkJCQkgZ2ZfbnVtc3JjOwogCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdmX3NsaXN0WzFdCiAJCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgX19DT01QQVRfR0YwX1NJWkUgKHNpemVvZihzdHJ1Y3QgY29tcGF0X2dyb3VwX2ZpbHRlcikgLSBcCiAJCQlzaXplb2Yoc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UpKQpAQCAtNTU3LDcgKzU1NCw3IEBACiAKIGludCBjb21wYXRfbWNfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuLAotCWludCAoKnNldHNvY2tvcHQpKHN0cnVjdCBzb2NrICosaW50LGludCxjaGFyIF9fdXNlciAqLHVuc2lnbmVkIGludCkpCisJaW50ICgqc2V0c29ja29wdCkoc3RydWN0IHNvY2sgKiwgaW50LCBpbnQsIGNoYXIgX191c2VyICosIHVuc2lnbmVkIGludCkpCiB7CiAJY2hhciBfX3VzZXIJKmtvcHR2YWwgPSBvcHR2YWw7CiAJaW50CQlrb3B0bGVuID0gb3B0bGVuOwpAQCAtNjQwLDEyICs2MzcsMTEgQEAKIAl9CiAJcmV0dXJuIHNldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIGtvcHR2YWwsIGtvcHRsZW4pOwogfQotCiBFWFBPUlRfU1lNQk9MKGNvbXBhdF9tY19zZXRzb2Nrb3B0KTsKIAogaW50IGNvbXBhdF9tY19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbiwKLQlpbnQgKCpnZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqLGludCxpbnQsY2hhciBfX3VzZXIgKixpbnQgX191c2VyICopKQorCWludCAoKmdldHNvY2tvcHQpKHN0cnVjdCBzb2NrICosIGludCwgaW50LCBjaGFyIF9fdXNlciAqLCBpbnQgX191c2VyICopKQogewogCXN0cnVjdCBjb21wYXRfZ3JvdXBfZmlsdGVyIF9fdXNlciAqZ2YzMiA9ICh2b2lkICopb3B0dmFsOwogCXN0cnVjdCBncm91cF9maWx0ZXIgX191c2VyICprZ2Y7CkBAIC02ODEsNyArNjc3LDcgQEAKIAkgICAgX19wdXRfdXNlcihpbnRlcmZhY2UsICZrZ2YtPmdmX2ludGVyZmFjZSkgfHwKIAkgICAgX19wdXRfdXNlcihmbW9kZSwgJmtnZi0+Z2ZfZm1vZGUpIHx8CiAJICAgIF9fcHV0X3VzZXIobnVtc3JjLCAma2dmLT5nZl9udW1zcmMpIHx8Ci0JICAgIGNvcHlfaW5fdXNlcigma2dmLT5nZl9ncm91cCwmZ2YzMi0+Z2ZfZ3JvdXAsc2l6ZW9mKGtnZi0+Z2ZfZ3JvdXApKSkKKwkgICAgY29weV9pbl91c2VyKCZrZ2YtPmdmX2dyb3VwLCAmZ2YzMi0+Z2ZfZ3JvdXAsIHNpemVvZihrZ2YtPmdmX2dyb3VwKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJZXJyID0gZ2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgKGNoYXIgX191c2VyICopa2dmLCBrb3B0bGVuKTsKQEAgLTcxNCwyMSArNzEwLDIyIEBACiAJCWNvcHlsZW4gPSBudW1zcmMgKiBzaXplb2YoZ2YzMi0+Z2Zfc2xpc3RbMF0pOwogCQlpZiAoY29weWxlbiA+IGtsZW4pCiAJCQljb3B5bGVuID0ga2xlbjsKLQkgICAgICAgIGlmIChjb3B5X2luX3VzZXIoZ2YzMi0+Z2Zfc2xpc3QsIGtnZi0+Z2Zfc2xpc3QsIGNvcHlsZW4pKQorCQlpZiAoY29weV9pbl91c2VyKGdmMzItPmdmX3NsaXN0LCBrZ2YtPmdmX3NsaXN0LCBjb3B5bGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAlyZXR1cm4gZXJyOwogfQotCiBFWFBPUlRfU1lNQk9MKGNvbXBhdF9tY19nZXRzb2Nrb3B0KTsKIAogCiAvKiBBcmd1bWVudCBsaXN0IHNpemVzIGZvciBjb21wYXRfc3lzX3NvY2tldGNhbGwgKi8KICNkZWZpbmUgQUwoeCkgKCh4KSAqIHNpemVvZih1MzIpKQotc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFzWzIwXT17QUwoMCksQUwoMyksQUwoMyksQUwoMyksQUwoMiksQUwoMyksCi0JCQkJQUwoMyksQUwoMyksQUwoNCksQUwoNCksQUwoNCksQUwoNiksCi0JCQkJQUwoNiksQUwoMiksQUwoNSksQUwoNSksQUwoMyksQUwoMyksCi0JCQkJQUwoNCksQUwoNSl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFzWzIwXSA9IHsKKwlBTCgwKSwgQUwoMyksIEFMKDMpLCBBTCgzKSwgQUwoMiksIEFMKDMpLAorCUFMKDMpLCBBTCgzKSwgQUwoNCksIEFMKDQpLCBBTCg0KSwgQUwoNiksCisJQUwoNiksIEFMKDIpLCBBTCg1KSwgQUwoNSksIEFMKDMpLCBBTCgzKSwKKwlBTCg0KSwgQUwoNSkKK307CiAjdW5kZWYgQUwKIAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2VuZG1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqbXNnLCB1bnNpZ25lZCBmbGFncykKQEAgLTgyNyw3ICs4MjQsNyBAQAogCQkJCQkgIGNvbXBhdF9wdHIoYVs0XSksIGNvbXBhdF9wdHIoYVs1XSkpOwogCQlicmVhazsKIAljYXNlIFNZU19TSFVURE9XTjoKLQkJcmV0ID0gc3lzX3NodXRkb3duKGEwLGExKTsKKwkJcmV0ID0gc3lzX3NodXRkb3duKGEwLCBhMSk7CiAJCWJyZWFrOwogCWNhc2UgU1lTX1NFVFNPQ0tPUFQ6CiAJCXJldCA9IGNvbXBhdF9zeXNfc2V0c29ja29wdChhMCwgYTEsIGFbMl0sCmRpZmYgLS1naXQgYS9uZXQvY29yZS9NYWtlZmlsZSBiL25ldC9jb3JlL01ha2VmaWxlCmluZGV4IDUxYzNlZWMuLjhhMDRkZDIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL01ha2VmaWxlCisrKyBiL25ldC9jb3JlL01ha2VmaWxlCkBAIC0xOCw0ICsxOCw0IEBACiBvYmotJChDT05GSUdfRklCX1JVTEVTKSArPSBmaWJfcnVsZXMubwogb2JqLSQoQ09ORklHX1RSQUNFUE9JTlRTKSArPSBuZXQtdHJhY2VzLm8KIG9iai0kKENPTkZJR19ORVRfRFJPUF9NT05JVE9SKSArPSBkcm9wX21vbml0b3IubwotCitvYmotJChDT05GSUdfTkVUV09SS19QSFlfVElNRVNUQU1QSU5HKSArPSB0aW1lc3RhbXBpbmcubwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGF0YWdyYW0uYyBiL25ldC9jb3JlL2RhdGFncmFtLmMKaW5kZXggZjViNmY0My4uMjUxOTk3YSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGF0YWdyYW0uYworKysgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCkBAIC0yMTksNiArMjE5LDcgQEAKIAlyZXR1cm4gX19za2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MgfCAobm9ibG9jayA/IE1TR19ET05UV0FJVCA6IDApLAogCQkJCSAgICZwZWVrZWQsIGVycik7CiB9CitFWFBPUlRfU1lNQk9MKHNrYl9yZWN2X2RhdGFncmFtKTsKIAogdm9pZCBza2JfZnJlZV9kYXRhZ3JhbShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0yODgsNyArMjg5LDYgQEAKIAogCXJldHVybiBlcnI7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc2tiX2tpbGxfZGF0YWdyYW0pOwogCiAvKioKQEAgLTM3Myw2ICszNzMsNyBAQAogZmF1bHQ6CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CitFWFBPUlRfU1lNQk9MKHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKTsKIAogLyoqCiAgKglza2JfY29weV9kYXRhZ3JhbV9jb25zdF9pb3ZlYyAtIENvcHkgYSBkYXRhZ3JhbSB0byBhbiBpb3ZlYy4KQEAgLTcxNiw2ICs3MTcsNyBAQAogZmF1bHQ6CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CitFWFBPUlRfU1lNQk9MKHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKTsKIAogLyoqCiAgKiAJZGF0YWdyYW1fcG9sbCAtIGdlbmVyaWMgZGF0YWdyYW0gcG9sbApAQCAtNzcwLDggKzc3Miw0IEBACiAKIAlyZXR1cm4gbWFzazsKIH0KLQogRVhQT1JUX1NZTUJPTChkYXRhZ3JhbV9wb2xsKTsKLUVYUE9SVF9TWU1CT0woc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW1faW92ZWMpOwotRVhQT1JUX1NZTUJPTChza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyk7Ci1FWFBPUlRfU1lNQk9MKHNrYl9yZWN2X2RhdGFncmFtKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggMGVhMTBmOC4uZTFjMWNkYyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTEwMSw4ICsxMDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9tYWN2bGFuLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KQEAgLTgwMywzNSArODAxLDMxIEBACiBFWFBPUlRfU1lNQk9MKGRldl9nZXRmaXJzdGJ5aHd0eXBlKTsKIAogLyoqCi0gKglkZXZfZ2V0X2J5X2ZsYWdzIC0gZmluZCBhbnkgZGV2aWNlIHdpdGggZ2l2ZW4gZmxhZ3MKKyAqCWRldl9nZXRfYnlfZmxhZ3NfcmN1IC0gZmluZCBhbnkgZGV2aWNlIHdpdGggZ2l2ZW4gZmxhZ3MKICAqCUBuZXQ6IHRoZSBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2UKICAqCUBpZl9mbGFnczogSUZGXyogdmFsdWVzCiAgKglAbWFzazogYml0bWFzayBvZiBiaXRzIGluIGlmX2ZsYWdzIHRvIGNoZWNrCiAgKgogICoJU2VhcmNoIGZvciBhbnkgaW50ZXJmYWNlIHdpdGggdGhlIGdpdmVuIGZsYWdzLiBSZXR1cm5zIE5VTEwgaWYgYSBkZXZpY2UKLSAqCWlzIG5vdCBmb3VuZCBvciBhIHBvaW50ZXIgdG8gdGhlIGRldmljZS4gVGhlIGRldmljZSByZXR1cm5lZCBoYXMKLSAqCWhhZCBhIHJlZmVyZW5jZSBhZGRlZCBhbmQgdGhlIHBvaW50ZXIgaXMgc2FmZSB1bnRpbCB0aGUgdXNlciBjYWxscwotICoJZGV2X3B1dCB0byBpbmRpY2F0ZSB0aGV5IGhhdmUgZmluaXNoZWQgd2l0aCBpdC4KKyAqCWlzIG5vdCBmb3VuZCBvciBhIHBvaW50ZXIgdG8gdGhlIGRldmljZS4gTXVzdCBiZSBjYWxsZWQgaW5zaWRlCisgKglyY3VfcmVhZF9sb2NrKCksIGFuZCByZXN1bHQgcmVmY291bnQgaXMgdW5jaGFuZ2VkLgogICovCiAKLXN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZ2V0X2J5X2ZsYWdzKHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgc2hvcnQgaWZfZmxhZ3MsCitzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2dldF9ieV9mbGFnc19yY3Uoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBzaG9ydCBpZl9mbGFncywKIAkJCQkgICAgdW5zaWduZWQgc2hvcnQgbWFzaykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAqcmV0OwogCiAJcmV0ID0gTlVMTDsKLQlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfbmV0ZGV2X3JjdShuZXQsIGRldikgewogCQlpZiAoKChkZXYtPmZsYWdzIF4gaWZfZmxhZ3MpICYgbWFzaykgPT0gMCkgewotCQkJZGV2X2hvbGQoZGV2KTsKIAkJCXJldCA9IGRldjsKIAkJCWJyZWFrOwogCQl9CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGRldl9nZXRfYnlfZmxhZ3MpOworRVhQT1JUX1NZTUJPTChkZXZfZ2V0X2J5X2ZsYWdzX3JjdSk7CiAKIC8qKgogICoJZGV2X3ZhbGlkX25hbWUgLSBjaGVjayBpZiBuYW1lIGlzIG9rYXkgZm9yIG5ldHdvcmsgZGV2aWNlCkBAIC0xNDg4LDYgKzE0ODIsNyBAQAogaW50IGRldl9mb3J3YXJkX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXNrYl9vcnBoYW4oc2tiKTsKKwluZl9yZXNldChza2IpOwogCiAJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkgfHwKIAkgICAgKHNrYi0+bGVuID4gKGRldi0+bXR1ICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4pKSkgewpAQCAtMTU0MSw3ICsxNTM2LDggQEAKIAkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCQlwcmludGsoS0VSTl9DUklUICJwcm90b2NvbCAlMDR4IGlzICIKIAkJCQkJICAgICAgICJidWdneSwgZGV2ICVzXG4iLAotCQkJCQkgICAgICAgc2tiMi0+cHJvdG9jb2wsIGRldi0+bmFtZSk7CisJCQkJCSAgICAgICBudG9ocyhza2IyLT5wcm90b2NvbCksCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKIAkJCX0KIApAQCAtMTkyMyw2ICsxOTE5LDIyIEBACiAJfQogfQogCisvKgorICogUmV0dXJucyB0cnVlIGlmIGVpdGhlcjoKKyAqCTEuIHNrYiBoYXMgZnJhZ19saXN0IGFuZCB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBGUkFHTElTVCwgb3IKKyAqCTIuIHNrYiBpcyBmcmFnbWVudGVkIGFuZCB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgU0csIG9yIGlmCisgKgkgICBhdCBsZWFzdCBvbmUgb2YgZnJhZ21lbnRzIGlzIGluIGhpZ2htZW0gYW5kIGRldmljZSBkb2VzIG5vdAorICoJICAgc3VwcG9ydCBETUEgZnJvbSBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2tiX25lZWRzX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHNrYl9pc19ub25saW5lYXIoc2tiKSAmJgorCSAgICAgICAoKHNrYl9oYXNfZnJhZ3Moc2tiKSAmJiAhKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0ZSQUdMSVNUKSkgfHwKKwkgICAgICAgIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICYmICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSB8fAorCQkJCQkgICAgICBpbGxlZ2FsX2hpZ2hkbWEoZGV2LCBza2IpKSkpOworfQorCiBpbnQgZGV2X2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxKQogewpAQCAtMTk0Nyw2ICsxOTU5LDIyIEBACiAJCQkJZ290byBvdXRfa2ZyZWVfc2tiOwogCQkJaWYgKHNrYi0+bmV4dCkKIAkJCQlnb3RvIGdzbzsKKwkJfSBlbHNlIHsKKwkJCWlmIChza2JfbmVlZHNfbGluZWFyaXplKHNrYiwgZGV2KSAmJgorCQkJICAgIF9fc2tiX2xpbmVhcml6ZShza2IpKQorCQkJCWdvdG8gb3V0X2tmcmVlX3NrYjsKKworCQkJLyogSWYgcGFja2V0IGlzIG5vdCBjaGVja3N1bW1lZCBhbmQgZGV2aWNlIGRvZXMgbm90CisJCQkgKiBzdXBwb3J0IGNoZWNrc3VtbWluZyBmb3IgdGhpcyBwcm90b2NvbCwgY29tcGxldGUKKwkJCSAqIGNoZWNrc3VtbWluZyBoZXJlLgorCQkJICovCisJCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQkJCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIHNrYi0+Y3N1bV9zdGFydCAtCisJCQkJCSAgICAgIHNrYl9oZWFkcm9vbShza2IpKTsKKwkJCQlpZiAoIWRldl9jYW5fY2hlY2tzdW0oZGV2LCBza2IpICYmCisJCQkJICAgICBza2JfY2hlY2tzdW1faGVscChza2IpKQorCQkJCQlnb3RvIG91dF9rZnJlZV9za2I7CisJCQl9CiAJCX0KIAogCQlyYyA9IG9wcy0+bmRvX3N0YXJ0X3htaXQoc2tiLCBkZXYpOwpAQCAtMjA2MiwxNCArMjA5MCwyNCBAQAogCQkJCSBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEpCiB7CiAJc3BpbmxvY2tfdCAqcm9vdF9sb2NrID0gcWRpc2NfbG9jayhxKTsKKwlib29sIGNvbnRlbmRlZCA9IHFkaXNjX2lzX3J1bm5pbmcocSk7CiAJaW50IHJjOwogCisJLyoKKwkgKiBIZXVyaXN0aWMgdG8gZm9yY2UgY29udGVuZGVkIGVucXVldWVzIHRvIHNlcmlhbGl6ZSBvbiBhCisJICogc2VwYXJhdGUgbG9jayBiZWZvcmUgdHJ5aW5nIHRvIGdldCBxZGlzYyBtYWluIGxvY2suCisJICogVGhpcyBwZXJtaXRzIF9fUURJU0NfU1RBVEVfUlVOTklORyBvd25lciB0byBnZXQgdGhlIGxvY2sgbW9yZSBvZnRlbgorCSAqIGFuZCBkZXF1ZXVlIHBhY2tldHMgZmFzdGVyLgorCSAqLworCWlmICh1bmxpa2VseShjb250ZW5kZWQpKQorCQlzcGluX2xvY2soJnEtPmJ1c3lsb2NrKTsKKwogCXNwaW5fbG9jayhyb290X2xvY2spOwogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChfX1FESVNDX1NUQVRFX0RFQUNUSVZBVEVELCAmcS0+c3RhdGUpKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmMgPSBORVRfWE1JVF9EUk9QOwogCX0gZWxzZSBpZiAoKHEtPmZsYWdzICYgVENRX0ZfQ0FOX0JZUEFTUykgJiYgIXFkaXNjX3FsZW4ocSkgJiYKLQkJICAgIXRlc3RfYW5kX3NldF9iaXQoX19RRElTQ19TVEFURV9SVU5OSU5HLCAmcS0+c3RhdGUpKSB7CisJCSAgIHFkaXNjX3J1bl9iZWdpbihxKSkgewogCQkvKgogCQkgKiBUaGlzIGlzIGEgd29yay1jb25zZXJ2aW5nIHF1ZXVlOyB0aGVyZSBhcmUgbm8gb2xkIHNrYnMKIAkJICogd2FpdGluZyB0byBiZSBzZW50IG91dDsgYW5kIHRoZSBxZGlzYyBpcyBub3QgcnVubmluZyAtCkBAIC0yMDc4LDM3ICsyMTE2LDMzIEBACiAJCWlmICghKGRldi0+cHJpdl9mbGFncyAmIElGRl9YTUlUX0RTVF9SRUxFQVNFKSkKIAkJCXNrYl9kc3RfZm9yY2Uoc2tiKTsKIAkJX19xZGlzY191cGRhdGVfYnN0YXRzKHEsIHNrYi0+bGVuKTsKLQkJaWYgKHNjaF9kaXJlY3RfeG1pdChza2IsIHEsIGRldiwgdHhxLCByb290X2xvY2spKQorCQlpZiAoc2NoX2RpcmVjdF94bWl0KHNrYiwgcSwgZGV2LCB0eHEsIHJvb3RfbG9jaykpIHsKKwkJCWlmICh1bmxpa2VseShjb250ZW5kZWQpKSB7CisJCQkJc3Bpbl91bmxvY2soJnEtPmJ1c3lsb2NrKTsKKwkJCQljb250ZW5kZWQgPSBmYWxzZTsKKwkJCX0KIAkJCV9fcWRpc2NfcnVuKHEpOwotCQllbHNlCi0JCQljbGVhcl9iaXQoX19RRElTQ19TVEFURV9SVU5OSU5HLCAmcS0+c3RhdGUpOworCQl9IGVsc2UKKwkJCXFkaXNjX3J1bl9lbmQocSk7CiAKIAkJcmMgPSBORVRfWE1JVF9TVUNDRVNTOwogCX0gZWxzZSB7CiAJCXNrYl9kc3RfZm9yY2Uoc2tiKTsKIAkJcmMgPSBxZGlzY19lbnF1ZXVlX3Jvb3Qoc2tiLCBxKTsKLQkJcWRpc2NfcnVuKHEpOworCQlpZiAocWRpc2NfcnVuX2JlZ2luKHEpKSB7CisJCQlpZiAodW5saWtlbHkoY29udGVuZGVkKSkgeworCQkJCXNwaW5fdW5sb2NrKCZxLT5idXN5bG9jayk7CisJCQkJY29udGVuZGVkID0gZmFsc2U7CisJCQl9CisJCQlfX3FkaXNjX3J1bihxKTsKKwkJfQogCX0KIAlzcGluX3VubG9jayhyb290X2xvY2spOwotCisJaWYgKHVubGlrZWx5KGNvbnRlbmRlZCkpCisJCXNwaW5fdW5sb2NrKCZxLT5idXN5bG9jayk7CiAJcmV0dXJuIHJjOwogfQogCi0vKgotICogUmV0dXJucyB0cnVlIGlmIGVpdGhlcjoKLSAqCTEuIHNrYiBoYXMgZnJhZ19saXN0IGFuZCB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBGUkFHTElTVCwgb3IKLSAqCTIuIHNrYiBpcyBmcmFnbWVudGVkIGFuZCB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgU0csIG9yIGlmCi0gKgkgICBhdCBsZWFzdCBvbmUgb2YgZnJhZ21lbnRzIGlzIGluIGhpZ2htZW0gYW5kIGRldmljZSBkb2VzIG5vdAotICoJICAgc3VwcG9ydCBETUEgZnJvbSBpdC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgc2tiX25lZWRzX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIChza2JfaGFzX2ZyYWdzKHNrYikgJiYgIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GUkFHTElTVCkpIHx8Ci0JICAgICAgIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICYmICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSB8fAotCQkJCQkgICAgICBpbGxlZ2FsX2hpZ2hkbWEoZGV2LCBza2IpKSk7Ci19Ci0KIC8qKgogICoJZGV2X3F1ZXVlX3htaXQgLSB0cmFuc21pdCBhIGJ1ZmZlcgogICoJQHNrYjogYnVmZmVyIHRvIHRyYW5zbWl0CkBAIC0yMTQxLDI1ICsyMTc1LDYgQEAKIAlzdHJ1Y3QgUWRpc2MgKnE7CiAJaW50IHJjID0gLUVOT01FTTsKIAotCS8qIEdTTyB3aWxsIGhhbmRsZSB0aGUgZm9sbG93aW5nIGVtdWxhdGlvbnMgZGlyZWN0bHkuICovCi0JaWYgKG5ldGlmX25lZWRzX2dzbyhkZXYsIHNrYikpCi0JCWdvdG8gZ3NvOwotCi0JLyogQ29udmVydCBhIHBhZ2VkIHNrYiB0byBsaW5lYXIsIGlmIHJlcXVpcmVkICovCi0JaWYgKHNrYl9uZWVkc19saW5lYXJpemUoc2tiLCBkZXYpICYmIF9fc2tiX2xpbmVhcml6ZShza2IpKQotCQlnb3RvIG91dF9rZnJlZV9za2I7Ci0KLQkvKiBJZiBwYWNrZXQgaXMgbm90IGNoZWNrc3VtbWVkIGFuZCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAotCSAqIGNoZWNrc3VtbWluZyBmb3IgdGhpcyBwcm90b2NvbCwgY29tcGxldGUgY2hlY2tzdW1taW5nIGhlcmUuCi0JICovCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgc2tiLT5jc3VtX3N0YXJ0IC0KLQkJCQkJICAgICAgc2tiX2hlYWRyb29tKHNrYikpOwotCQlpZiAoIWRldl9jYW5fY2hlY2tzdW0oZGV2LCBza2IpICYmIHNrYl9jaGVja3N1bV9oZWxwKHNrYikpCi0JCQlnb3RvIG91dF9rZnJlZV9za2I7Ci0JfQotCi1nc286CiAJLyogRGlzYWJsZSBzb2Z0IGlycXMgZm9yIHZhcmlvdXMgbG9ja3MgYmVsb3cuIEFsc28KIAkgKiBzdG9wcyBwcmVlbXB0aW9uIGZvciBSQ1UuCiAJICovCkBAIC0yMjE4LDcgKzIyMzMsNiBAQAogCXJjID0gLUVORVRET1dOOwogCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCi1vdXRfa2ZyZWVfc2tiOgogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiByYzsKIG91dDoKQEAgLTI2MDMsNzAgKzI2MTcsMTQgQEAKIAlyZXR1cm4gcHRfcHJldi0+ZnVuYyhza2IsIHNrYi0+ZGV2LCBwdF9wcmV2LCBvcmlnX2Rldik7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQgKENPTkZJR19CUklER0VfTU9EVUxFKQotCi0jaWYgZGVmaW5lZChDT05GSUdfQVRNX0xBTkUpIHx8IGRlZmluZWQoQ09ORklHX0FUTV9MQU5FX01PRFVMRSkKKyNpZiAoZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKSkgJiYgXAorICAgIChkZWZpbmVkKENPTkZJR19BVE1fTEFORSkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0xBTkVfTU9EVUxFKSkKIC8qIFRoaXMgaG9vayBpcyBkZWZpbmVkIGhlcmUgZm9yIEFUTSBMQU5FICovCiBpbnQgKCpicl9mZGJfdGVzdF9hZGRyX2hvb2spKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIpIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MX0dQTChicl9mZGJfdGVzdF9hZGRyX2hvb2spOwogI2VuZGlmCiAKLS8qCi0gKiBJZiBicmlkZ2UgbW9kdWxlIGlzIGxvYWRlZCBjYWxsIGJyaWRnaW5nIGhvb2suCi0gKiAgcmV0dXJucyBOVUxMIGlmIHBhY2tldCB3YXMgY29uc3VtZWQuCi0gKi8KLXN0cnVjdCBza19idWZmICooKmJyX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSBfX3JlYWRfbW9zdGx5OwotRVhQT1JUX1NZTUJPTF9HUEwoYnJfaGFuZGxlX2ZyYW1lX2hvb2spOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpoYW5kbGVfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKipwdF9wcmV2LCBpbnQgKnJldCwKLQkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0OwotCi0JaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0xPT1BCQUNLIHx8Ci0JICAgIChwb3J0ID0gcmN1X2RlcmVmZXJlbmNlKHNrYi0+ZGV2LT5icl9wb3J0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIHNrYjsKLQotCWlmICgqcHRfcHJldikgewotCQkqcmV0ID0gZGVsaXZlcl9za2Ioc2tiLCAqcHRfcHJldiwgb3JpZ19kZXYpOwotCQkqcHRfcHJldiA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIGJyX2hhbmRsZV9mcmFtZV9ob29rKHBvcnQsIHNrYik7Ci19Ci0jZWxzZQotI2RlZmluZSBoYW5kbGVfYnJpZGdlKHNrYiwgcHRfcHJldiwgcmV0LCBvcmlnX2RldikJKHNrYikKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfTUFDVkxBTikgfHwgZGVmaW5lZChDT05GSUdfTUFDVkxBTl9NT0RVTEUpCi1zdHJ1Y3Qgc2tfYnVmZiAqKCptYWN2bGFuX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwLAotCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpIF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChtYWN2bGFuX2hhbmRsZV9mcmFtZV9ob29rKTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaGFuZGxlX21hY3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKipwdF9wcmV2LAotCQkJCQkgICAgIGludCAqcmV0LAotCQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKLXsKLQlzdHJ1Y3QgbWFjdmxhbl9wb3J0ICpwb3J0OwotCi0JcG9ydCA9IHJjdV9kZXJlZmVyZW5jZShza2ItPmRldi0+bWFjdmxhbl9wb3J0KTsKLQlpZiAoIXBvcnQpCi0JCXJldHVybiBza2I7Ci0KLQlpZiAoKnB0X3ByZXYpIHsKLQkJKnJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgKnB0X3ByZXYsIG9yaWdfZGV2KTsKLQkJKnB0X3ByZXYgPSBOVUxMOwotCX0KLQlyZXR1cm4gbWFjdmxhbl9oYW5kbGVfZnJhbWVfaG9vayhwb3J0LCBza2IpOwotfQotI2Vsc2UKLSNkZWZpbmUgaGFuZGxlX21hY3ZsYW4oc2tiLCBwdF9wcmV2LCByZXQsIG9yaWdfZGV2KQkoc2tiKQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIC8qIFRPRE86IE1heWJlIHdlIHNob3VsZCBqdXN0IGZvcmNlIHNjaF9pbmdyZXNzIHRvIGJlIGNvbXBpbGVkIGluCiAgKiB3aGVuIENPTkZJR19ORVRfQ0xTX0FDVCBpcz8gb3RoZXJ3aXNlIHNvbWUgdXNlbGVzcyBpbnN0cnVjdGlvbnMKQEAgLTI2ODQsMTAgKzI2NDIsMTAgQEAKIAlpbnQgcmVzdWx0ID0gVENfQUNUX09LOwogCXN0cnVjdCBRZGlzYyAqcTsKIAotCWlmIChNQVhfUkVEX0xPT1AgPCB0dGwrKykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiUmVkaXIgbG9vcCBkZXRlY3RlZCBEcm9wcGluZyBwYWNrZXQgKCVkLT4lZClcbiIsCi0JCSAgICAgICBza2ItPnNrYl9paWYsIGRldi0+aWZpbmRleCk7CisJaWYgKHVubGlrZWx5KE1BWF9SRURfTE9PUCA8IHR0bCsrKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJfd2FybmluZyggIlJlZGlyIGxvb3AgZGV0ZWN0ZWQgRHJvcHBpbmcgcGFja2V0ICglZC0+JWQpXG4iLAorCQkJICAgICAgIHNrYi0+c2tiX2lpZiwgZGV2LT5pZmluZGV4KTsKIAkJcmV0dXJuIFRDX0FDVF9TSE9UOwogCX0KIApAQCAtMjcxNyw5ICsyNjc1LDYgQEAKIAlpZiAoKnB0X3ByZXYpIHsKIAkJKnJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgKnB0X3ByZXYsIG9yaWdfZGV2KTsKIAkJKnB0X3ByZXYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qIEh1aD8gV2h5IGRvZXMgdHVybmluZyBvbiBBRl9QQUNLRVQgYWZmZWN0IHRoaXM/ICovCi0JCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19PSzJNVU5HRShza2ItPnRjX3ZlcmQpOwogCX0KIAogCXN3aXRjaCAoaW5nX2ZpbHRlcihza2IpKSB7CkBAIC0yNzYyLDYgKzI3MTcsNTEgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAorLyoqCisgKgluZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3RlciAtIHJlZ2lzdGVyIHJlY2VpdmUgaGFuZGxlcgorICoJQGRldjogZGV2aWNlIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IKKyAqCUByeF9oYW5kbGVyOiByZWNlaXZlIGhhbmRsZXIgdG8gcmVnaXN0ZXIKKyAqCUByeF9oYW5kbGVyX2RhdGE6IGRhdGEgcG9pbnRlciB0aGF0IGlzIHVzZWQgYnkgcnggaGFuZGxlcgorICoKKyAqCVJlZ2lzdGVyIGEgcmVjZWl2ZSBoYW5kZXIgZm9yIGEgZGV2aWNlLiBUaGlzIGhhbmRsZXIgd2lsbCB0aGVuIGJlCisgKgljYWxsZWQgZnJvbSBfX25ldGlmX3JlY2VpdmVfc2tiLiBBIG5lZ2F0aXZlIGVycm5vIGNvZGUgaXMgcmV0dXJuZWQKKyAqCW9uIGEgZmFpbHVyZS4KKyAqCisgKglUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgcnRubF9tdXRleC4KKyAqLworaW50IG5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgcnhfaGFuZGxlcl9mdW5jX3QgKnJ4X2hhbmRsZXIsCisJCQkgICAgICAgdm9pZCAqcnhfaGFuZGxlcl9kYXRhKQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoZGV2LT5yeF9oYW5kbGVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+cnhfaGFuZGxlcl9kYXRhLCByeF9oYW5kbGVyX2RhdGEpOworCXJjdV9hc3NpZ25fcG9pbnRlcihkZXYtPnJ4X2hhbmRsZXIsIHJ4X2hhbmRsZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3Rlcik7CisKKy8qKgorICoJbmV0ZGV2X3J4X2hhbmRsZXJfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgcmVjZWl2ZSBoYW5kbGVyCisgKglAZGV2OiBkZXZpY2UgdG8gdW5yZWdpc3RlciBhIGhhbmRsZXIgZnJvbQorICoKKyAqCVVucmVnaXN0ZXIgYSByZWNlaXZlIGhhbmRlciBmcm9tIGEgZGV2aWNlLgorICoKKyAqCVRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBydG5sX211dGV4LgorICovCit2b2lkIG5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCUFTU0VSVF9SVE5MKCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+cnhfaGFuZGxlciwgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+cnhfaGFuZGxlcl9kYXRhLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2JvbmRfc2V0X21hY19ieV9tYXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcikKIHsKQEAgLTI3ODMsNyArMjc4Myw4IEBACiAJaWYgKG1hc3Rlci0+cHJpdl9mbGFncyAmIElGRl9NQVNURVJfQVJQTU9OKQogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0JaWYgKChtYXN0ZXItPnByaXZfZmxhZ3MgJiBJRkZfTUFTVEVSX0FMQikgJiYgbWFzdGVyLT5icl9wb3J0KSB7CisJaWYgKChtYXN0ZXItPnByaXZfZmxhZ3MgJiBJRkZfTUFTVEVSX0FMQikgJiYKKwkgICAgKG1hc3Rlci0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkpIHsKIAkJLyogRG8gYWRkcmVzcyB1bm1hbmdsZS4gVGhlIGxvY2FsIGRlc3RpbmF0aW9uIGFkZHJlc3MKIAkJICogd2lsbCBiZSBhbHdheXMgdGhlIG9uZSBtYXN0ZXIgaGFzLiBQcm92aWRlcyB0aGUgcmlnaHQKIAkJICogZnVuY3Rpb25hbGl0eSBpbiBhIGJyaWRnZS4KQEAgLTI4MTQsNiArMjgxNSw3IEBACiBzdGF0aWMgaW50IF9fbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCAqcHRfcHJldjsKKwlyeF9oYW5kbGVyX2Z1bmNfdCAqcnhfaGFuZGxlcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbnVsbF9vcl9vcmlnOwpAQCAtMjg1NSw4ICsyODU3LDcgQEAKIAkJCXNrYi0+ZGV2ID0gbWFzdGVyOwogCX0KIAotCV9fZ2V0X2NwdV92YXIoc29mdG5ldF9kYXRhKS5wcm9jZXNzZWQrKzsKLQorCV9fdGhpc19jcHVfaW5jKHNvZnRuZXRfZGF0YS5wcm9jZXNzZWQpOwogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJc2tiLT5tYWNfbGVuID0gc2tiLT5uZXR3b3JrX2hlYWRlciAtIHNrYi0+bWFjX2hlYWRlcjsKQEAgLTI4ODgsMTIgKzI4ODksMTcgQEAKIG5jbHM6CiAjZW5kaWYKIAotCXNrYiA9IGhhbmRsZV9icmlkZ2Uoc2tiLCAmcHRfcHJldiwgJnJldCwgb3JpZ19kZXYpOwotCWlmICghc2tiKQotCQlnb3RvIG91dDsKLQlza2IgPSBoYW5kbGVfbWFjdmxhbihza2IsICZwdF9wcmV2LCAmcmV0LCBvcmlnX2Rldik7Ci0JaWYgKCFza2IpCi0JCWdvdG8gb3V0OworCS8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYnJpZGdlIG9yIG1hY3ZsYW4gKi8KKwlyeF9oYW5kbGVyID0gcmN1X2RlcmVmZXJlbmNlKHNrYi0+ZGV2LT5yeF9oYW5kbGVyKTsKKwlpZiAocnhfaGFuZGxlcikgeworCQlpZiAocHRfcHJldikgeworCQkJcmV0ID0gZGVsaXZlcl9za2Ioc2tiLCBwdF9wcmV2LCBvcmlnX2Rldik7CisJCQlwdF9wcmV2ID0gTlVMTDsKKwkJfQorCQlza2IgPSByeF9oYW5kbGVyKHNrYik7CisJCWlmICghc2tiKQorCQkJZ290byBvdXQ7CisJfQogCiAJLyoKIAkgKiBNYWtlIHN1cmUgZnJhbWVzIHJlY2VpdmVkIG9uIFZMQU4gaW50ZXJmYWNlcyBzdGFja2VkIG9uCkBAIC0yOTU0LDYgKzI5NjAsOSBAQAogCWlmIChuZXRkZXZfdHN0YW1wX3ByZXF1ZXVlKQogCQluZXRfdGltZXN0YW1wX2NoZWNrKHNrYik7CiAKKwlpZiAoc2tiX2RlZmVyX3J4X3RpbWVzdGFtcChza2IpKQorCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisKICNpZmRlZiBDT05GSUdfUlBTCiAJewogCQlzdHJ1Y3QgcnBzX2Rldl9mbG93IHZvaWRmbG93LCAqcmZsb3cgPSAmdm9pZGZsb3c7CkBAIC0zNzE4LDEwICszNzI3LDExIEBACiAKIHN0YXRpYyB2b2lkIGRldl9zZXFfcHJpbnRmX3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGRldl9nZXRfc3RhdHMoZGV2KTsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKKwljb25zdCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzID0gZGV2X2dldF9zdGF0cyhkZXYsICZ0ZW1wKTsKIAotCXNlcV9wcmludGYoc2VxLCAiJTZzOiAlN2x1ICU3bHUgJTRsdSAlNGx1ICU0bHUgJTVsdSAlMTBsdSAlOWx1ICIKLQkJICAgIiU4bHUgJTdsdSAlNGx1ICU0bHUgJTRsdSAlNWx1ICU3bHUgJTEwbHVcbiIsCisJc2VxX3ByaW50ZihzZXEsICIlNnM6ICU3bGx1ICU3bGx1ICU0bGx1ICU0bGx1ICU0bGx1ICU1bGx1ICUxMGxsdSAlOWxsdSAiCisJCSAgICIlOGxsdSAlN2xsdSAlNGxsdSAlNGxsdSAlNGxsdSAlNWxsdSAlN2xsdSAlMTBsbHVcbiIsCiAJCSAgIGRldi0+bmFtZSwgc3RhdHMtPnJ4X2J5dGVzLCBzdGF0cy0+cnhfcGFja2V0cywKIAkJICAgc3RhdHMtPnJ4X2Vycm9ycywKIAkJICAgc3RhdHMtPnJ4X2Ryb3BwZWQgKyBzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycywKQEAgLTUyNzAsMjAgKzUyODAsMjIgQEAKIC8qKgogICoJZGV2X3R4cV9zdGF0c19mb2xkIC0gZm9sZCB0eF9xdWV1ZXMgc3RhdHMKICAqCUBkZXY6IGRldmljZSB0byBnZXQgc3RhdGlzdGljcyBmcm9tCi0gKglAc3RhdHM6IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHRvIGhvbGQgcmVzdWx0cworICoJQHN0YXRzOiBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdG8gaG9sZCByZXN1bHRzCiAgKi8KIHZvaWQgZGV2X3R4cV9zdGF0c19mb2xkKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMpCisJCQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewotCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXMgPSAwLCB0eF9wYWNrZXRzID0gMCwgdHhfZHJvcHBlZCA9IDA7CisJdTY0IHR4X2J5dGVzID0gMCwgdHhfcGFja2V0cyA9IDAsIHR4X2Ryb3BwZWQgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV90eF9xdWV1ZXM7IGkrKykgewogCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSk7CisJCXNwaW5fbG9ja19iaCgmdHhxLT5feG1pdF9sb2NrKTsKIAkJdHhfYnl0ZXMgICArPSB0eHEtPnR4X2J5dGVzOwogCQl0eF9wYWNrZXRzICs9IHR4cS0+dHhfcGFja2V0czsKIAkJdHhfZHJvcHBlZCArPSB0eHEtPnR4X2Ryb3BwZWQ7CisJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPl94bWl0X2xvY2spOwogCX0KIAlpZiAodHhfYnl0ZXMgfHwgdHhfcGFja2V0cyB8fCB0eF9kcm9wcGVkKSB7CiAJCXN0YXRzLT50eF9ieXRlcyAgID0gdHhfYnl0ZXM7CkBAIC01MjkzLDIzICs1MzA1LDUzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRldl90eHFfc3RhdHNfZm9sZCk7CiAKKy8qIENvbnZlcnQgbmV0X2RldmljZV9zdGF0cyB0byBydG5sX2xpbmtfc3RhdHM2NC4gIFRoZXkgaGF2ZSB0aGUgc2FtZQorICogZmllbGRzIGluIHRoZSBzYW1lIG9yZGVyLCB3aXRoIG9ubHkgdGhlIHR5cGUgZGlmZmVyaW5nLgorICovCitzdGF0aWMgdm9pZCBuZXRkZXZfc3RhdHNfdG9fc3RhdHM2NChzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzNjQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRkZXZfc3RhdHMpCit7CisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorICAgICAgICBCVUlMRF9CVUdfT04oc2l6ZW9mKCpzdGF0czY0KSAhPSBzaXplb2YoKm5ldGRldl9zdGF0cykpOworICAgICAgICBtZW1jcHkoc3RhdHM2NCwgbmV0ZGV2X3N0YXRzLCBzaXplb2YoKnN0YXRzNjQpKTsKKyNlbHNlCisJc2l6ZV90IGksIG4gPSBzaXplb2YoKnN0YXRzNjQpIC8gc2l6ZW9mKHU2NCk7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjID0gKGNvbnN0IHVuc2lnbmVkIGxvbmcgKiluZXRkZXZfc3RhdHM7CisJdTY0ICpkc3QgPSAodTY0ICopc3RhdHM2NDsKKworCUJVSUxEX0JVR19PTihzaXplb2YoKm5ldGRldl9zdGF0cykgLyBzaXplb2YodW5zaWduZWQgbG9uZykgIT0KKwkJICAgICBzaXplb2YoKnN0YXRzNjQpIC8gc2l6ZW9mKHU2NCkpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWRzdFtpXSA9IHNyY1tpXTsKKyNlbmRpZgorfQorCiAvKioKICAqCWRldl9nZXRfc3RhdHMJLSBnZXQgbmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcwogICoJQGRldjogZGV2aWNlIHRvIGdldCBzdGF0aXN0aWNzIGZyb20KKyAqCUBzdG9yYWdlOiBwbGFjZSB0byBzdG9yZSBzdGF0cwogICoKLSAqCUdldCBuZXR3b3JrIHN0YXRpc3RpY3MgZnJvbSBkZXZpY2UuIFRoZSBkZXZpY2UgZHJpdmVyIG1heSBwcm92aWRlCi0gKglpdHMgb3duIG1ldGhvZCBieSBzZXR0aW5nIGRldi0+bmV0ZGV2X29wcy0+Z2V0X3N0YXRzOyBvdGhlcndpc2UKLSAqCXRoZSBpbnRlcm5hbCBzdGF0aXN0aWNzIHN0cnVjdHVyZSBpcyB1c2VkLgorICoJR2V0IG5ldHdvcmsgc3RhdGlzdGljcyBmcm9tIGRldmljZS4gUmV0dXJuIEBzdG9yYWdlLgorICoJVGhlIGRldmljZSBkcml2ZXIgbWF5IHByb3ZpZGUgaXRzIG93biBtZXRob2QgYnkgc2V0dGluZworICoJZGV2LT5uZXRkZXZfb3BzLT5nZXRfc3RhdHM2NCBvciBkZXYtPm5ldGRldl9vcHMtPmdldF9zdGF0czsKKyAqCW90aGVyd2lzZSB0aGUgaW50ZXJuYWwgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgaXMgdXNlZC4KICAqLwotY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqZGV2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpCiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBkZXYtPm5ldGRldl9vcHM7CiAKLQlpZiAob3BzLT5uZG9fZ2V0X3N0YXRzKQotCQlyZXR1cm4gb3BzLT5uZG9fZ2V0X3N0YXRzKGRldik7Ci0KLQlkZXZfdHhxX3N0YXRzX2ZvbGQoZGV2LCAmZGV2LT5zdGF0cyk7Ci0JcmV0dXJuICZkZXYtPnN0YXRzOworCWlmIChvcHMtPm5kb19nZXRfc3RhdHM2NCkgeworCQltZW1zZXQoc3RvcmFnZSwgMCwgc2l6ZW9mKCpzdG9yYWdlKSk7CisJCXJldHVybiBvcHMtPm5kb19nZXRfc3RhdHM2NChkZXYsIHN0b3JhZ2UpOworCX0KKwlpZiAob3BzLT5uZG9fZ2V0X3N0YXRzKSB7CisJCW5ldGRldl9zdGF0c190b19zdGF0czY0KHN0b3JhZ2UsIG9wcy0+bmRvX2dldF9zdGF0cyhkZXYpKTsKKwkJcmV0dXJuIHN0b3JhZ2U7CisJfQorCW5ldGRldl9zdGF0c190b19zdGF0czY0KHN0b3JhZ2UsICZkZXYtPnN0YXRzKTsKKwlkZXZfdHhxX3N0YXRzX2ZvbGQoZGV2LCBzdG9yYWdlKTsKKwlyZXR1cm4gc3RvcmFnZTsKIH0KIEVYUE9SVF9TWU1CT0woZGV2X2dldF9zdGF0cyk7CiAKQEAgLTU4MTQsNiArNTg1Niw2OCBAQAogCXJldHVybiBidWZmZXI7CiB9CiAKK3N0YXRpYyBpbnQgX19uZXRkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IHZhX2Zvcm1hdCAqdmFmKQoreworCWludCByOworCisJaWYgKGRldiAmJiBkZXYtPmRldi5wYXJlbnQpCisJCXIgPSBkZXZfcHJpbnRrKGxldmVsLCBkZXYtPmRldi5wYXJlbnQsICIlczogJXBWIiwKKwkJCSAgICAgICBuZXRkZXZfbmFtZShkZXYpLCB2YWYpOworCWVsc2UgaWYgKGRldikKKwkJciA9IHByaW50aygiJXMlczogJXBWIiwgbGV2ZWwsIG5ldGRldl9uYW1lKGRldiksIHZhZik7CisJZWxzZQorCQlyID0gcHJpbnRrKCIlcyhOVUxMIG5ldF9kZXZpY2UpOiAlcFYiLCBsZXZlbCwgdmFmKTsKKworCXJldHVybiByOworfQorCitpbnQgbmV0ZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCisJdmFmLmZtdCA9IGZvcm1hdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXIgPSBfX25ldGRldl9wcmludGsobGV2ZWwsIGRldiwgJnZhZik7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKG5ldGRldl9wcmludGspOworCisjZGVmaW5lIGRlZmluZV9uZXRkZXZfcHJpbnRrX2xldmVsKGZ1bmMsIGxldmVsKQkJCVwKK2ludCBmdW5jKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQlcCit7CQkJCQkJCQlcCisJaW50IHI7CQkJCQkJCVwKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsJCQkJCVwKKwl2YV9saXN0IGFyZ3M7CQkJCQkJXAorCQkJCQkJCQlcCisJdmFfc3RhcnQoYXJncywgZm10KTsJCQkJCVwKKwkJCQkJCQkJXAorCXZhZi5mbXQgPSBmbXQ7CQkJCQkJXAorCXZhZi52YSA9ICZhcmdzOwkJCQkJCVwKKwkJCQkJCQkJXAorCXIgPSBfX25ldGRldl9wcmludGsobGV2ZWwsIGRldiwgJnZhZik7CQkJXAorCXZhX2VuZChhcmdzKTsJCQkJCQlcCisJCQkJCQkJCVwKKwlyZXR1cm4gcjsJCQkJCQlcCit9CQkJCQkJCQlcCitFWFBPUlRfU1lNQk9MKGZ1bmMpOworCitkZWZpbmVfbmV0ZGV2X3ByaW50a19sZXZlbChuZXRkZXZfZW1lcmcsIEtFUk5fRU1FUkcpOworZGVmaW5lX25ldGRldl9wcmludGtfbGV2ZWwobmV0ZGV2X2FsZXJ0LCBLRVJOX0FMRVJUKTsKK2RlZmluZV9uZXRkZXZfcHJpbnRrX2xldmVsKG5ldGRldl9jcml0LCBLRVJOX0NSSVQpOworZGVmaW5lX25ldGRldl9wcmludGtfbGV2ZWwobmV0ZGV2X2VyciwgS0VSTl9FUlIpOworZGVmaW5lX25ldGRldl9wcmludGtfbGV2ZWwobmV0ZGV2X3dhcm4sIEtFUk5fV0FSTklORyk7CitkZWZpbmVfbmV0ZGV2X3ByaW50a19sZXZlbChuZXRkZXZfbm90aWNlLCBLRVJOX05PVElDRSk7CitkZWZpbmVfbmV0ZGV2X3ByaW50a19sZXZlbChuZXRkZXZfaW5mbywgS0VSTl9JTkZPKTsKKwogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZXRkZXZfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJa2ZyZWUobmV0LT5kZXZfbmFtZV9oZWFkKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Ryb3BfbW9uaXRvci5jIGIvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKaW5kZXggYWQ0MTUyOS4uMzZlNjAzYyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKKysrIGIvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKQEAgLTIyMyw2ICsyMjMsMTEgQEAKIAogCXNwaW5fbG9jaygmdHJhY2Vfc3RhdGVfbG9jayk7CiAKKwlpZiAoc3RhdGUgPT0gdHJhY2Vfc3RhdGUpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgVFJBQ0VfT046CiAJCXJjIHw9IHJlZ2lzdGVyX3RyYWNlX2tmcmVlX3NrYih0cmFjZV9rZnJlZV9za2JfaGl0LCBOVUxMKTsKQEAgLTI1MSwxMSArMjU2LDEyIEBACiAKIAlpZiAoIXJjKQogCQl0cmFjZV9zdGF0ZSA9IHN0YXRlOworCWVsc2UKKwkJcmMgPSAtRUlOUFJPR1JFU1M7CiAKK291dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJnRyYWNlX3N0YXRlX2xvY2spOwogCi0JaWYgKHJjKQotCQlyZXR1cm4gLUVJTlBST0dSRVNTOwogCXJldHVybiByYzsKIH0KIApAQCAtMzQxLDkgKzM0Nyw5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbmV0X2Ryb3BfbW9uaXRvcih2b2lkKQogewotCWludCBjcHU7Ci0JaW50IHJjLCBpLCByZXQ7CiAJc3RydWN0IHBlcl9jcHVfZG1fZGF0YSAqZGF0YTsKKwlpbnQgY3B1LCByYzsKKwogCXByaW50ayhLRVJOX0lORk8gIkluaXRhbGl6aW5nIG5ldHdvcmsgZHJvcCBtb25pdG9yIHNlcnZpY2VcbiIpOwogCiAJaWYgKHNpemVvZih2b2lkICopID4gOCkgewpAQCAtMzUxLDIxICszNTcsMTIgQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCi0JaWYgKGdlbmxfcmVnaXN0ZXJfZmFtaWx5KCZuZXRfZHJvcF9tb25pdG9yX2ZhbWlseSkgPCAwKSB7CisJcmMgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseV93aXRoX29wcygmbmV0X2Ryb3BfbW9uaXRvcl9mYW1pbHksCisJCQkJCSAgIGRyb3Btb25fb3BzLAorCQkJCQkgICBBUlJBWV9TSVpFKGRyb3Btb25fb3BzKSk7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGNyZWF0ZSBkcm9wIG1vbml0b3IgbmV0bGluayBmYW1pbHlcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IC1FRkFVTFQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcm9wbW9uX29wcyk7IGkrKykgewotCQlyZXQgPSBnZW5sX3JlZ2lzdGVyX29wcygmbmV0X2Ryb3BfbW9uaXRvcl9mYW1pbHksCi0JCQkJCSZkcm9wbW9uX29wc1tpXSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX0NSSVQgIkZhaWxlZCB0byByZWdpc3RlciBvcGVyYXRpb24gJWRcbiIsCi0JCQkJZHJvcG1vbl9vcHNbaV0uY21kKTsKLQkJCWdvdG8gb3V0X3VucmVnOwotCQl9CisJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZHJvcG1vbl9uZXRfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHN0LmMgYi9uZXQvY29yZS9kc3QuYwppbmRleCA5OTIwNzIyLi42YzQxYjFmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kc3QuYworKysgYi9uZXQvY29yZS9kc3QuYwpAQCAtMTk3LDcgKzE5Nyw2IEBACiAJCWRzdC0+aW5wdXQgPSBkc3QtPm91dHB1dCA9IGRzdF9kaXNjYXJkOwogCWRzdC0+b2Jzb2xldGUgPSAyOwogfQotRVhQT1JUX1NZTUJPTChfX2RzdF9mcmVlKTsKIAogdm9pZCBfX2RzdF9mcmVlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKQEAgLTIxMyw2ICsyMTIsNyBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmZHN0X2dhcmJhZ2UubG9jayk7CiB9CitFWFBPUlRfU1lNQk9MKF9fZHN0X2ZyZWUpOwogCiBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3RfZGVzdHJveShzdHJ1Y3QgZHN0X2VudHJ5ICogZHN0KQogewpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZXRodG9vbC5jIGIvbmV0L2NvcmUvZXRodG9vbC5jCmluZGV4IDc1ZTRmZmUuLjdhODUzNjcgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2V0aHRvb2wuYworKysgYi9uZXQvY29yZS9ldGh0b29sLmMKQEAgLTE0NCwzMSArMTQ0LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGV0aHRvb2xfb3BfZ2V0X2ZsYWdzKTsKIAotaW50IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoraW50IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhLCB1MzIgc3VwcG9ydGVkKQogewotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKLQl1bnNpZ25lZCBsb25nIGZlYXR1cmVzID0gZGV2LT5mZWF0dXJlczsKKwlpZiAoZGF0YSAmIH5zdXBwb3J0ZWQpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRhdGEgJiBFVEhfRkxBR19MUk8pCi0JCWZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOwotCWVsc2UKLQkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfTFJPOwotCi0JaWYgKGRhdGEgJiBFVEhfRkxBR19OVFVQTEUpIHsKLQkJaWYgKCFvcHMtPnNldF9yeF9udHVwbGUpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWZlYXR1cmVzIHw9IE5FVElGX0ZfTlRVUExFOwotCX0gZWxzZSB7Ci0JCS8qIHNhZmUgdG8gY2xlYXIgcmVnYXJkbGVzcyAqLwotCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9OVFVQTEU7Ci0JfQotCi0JaWYgKGRhdGEgJiBFVEhfRkxBR19SWEhBU0gpCi0JCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhIQVNIOwotCWVsc2UKLQkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfUlhIQVNIOwotCi0JZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOworCWRldi0+ZmVhdHVyZXMgPSAoKGRldi0+ZmVhdHVyZXMgJiB+ZmxhZ3NfZHVwX2ZlYXR1cmVzKSB8CisJCQkgKGRhdGEgJiBmbGFnc19kdXBfZmVhdHVyZXMpKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfZmxhZ3MpOwpAQCAtMzk1LDYgKzM3Nyw4MCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IGV0aHRvb2xfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICAgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyOworCXUzMiB0YWJsZV9zaXplOworCXNpemVfdCBmdWxsX3NpemU7CisJaW50IHJldDsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4ZmhfaW5kaXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdGFibGVfc2l6ZSwKKwkJCSAgIHVzZXJhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciwgc2l6ZSksCisJCQkgICBzaXplb2YodGFibGVfc2l6ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh0YWJsZV9zaXplID4KKwkgICAgKEtNQUxMT0NfTUFYX1NJWkUgLSBzaXplb2YoKmluZGlyKSkgLyBzaXplb2YoKmluZGlyLT5yaW5nX2luZGV4KSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZnVsbF9zaXplID0gc2l6ZW9mKCppbmRpcikgKyBzaXplb2YoKmluZGlyLT5yaW5nX2luZGV4KSAqIHRhYmxlX3NpemU7CisJaW5kaXIgPSBrbWFsbG9jKGZ1bGxfc2l6ZSwgR0ZQX1VTRVIpOworCWlmICghaW5kaXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5kaXItPmNtZCA9IEVUSFRPT0xfR1JYRkhJTkRJUjsKKwlpbmRpci0+c2l6ZSA9IHRhYmxlX3NpemU7CisJcmV0ID0gZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4ZmhfaW5kaXIoZGV2LCBpbmRpcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCBpbmRpciwgZnVsbF9zaXplKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworb3V0OgorCWtmcmVlKGluZGlyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludCBldGh0b29sX3NldF9yeGZoX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgICAgIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyICppbmRpcjsKKwl1MzIgdGFibGVfc2l6ZTsKKwlzaXplX3QgZnVsbF9zaXplOworCWludCByZXQ7CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF9yeGZoX2luZGlyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRhYmxlX3NpemUsCisJCQkgICB1c2VyYWRkciArIG9mZnNldG9mKHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIsIHNpemUpLAorCQkJICAgc2l6ZW9mKHRhYmxlX3NpemUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodGFibGVfc2l6ZSA+CisJICAgIChLTUFMTE9DX01BWF9TSVpFIC0gc2l6ZW9mKCppbmRpcikpIC8gc2l6ZW9mKCppbmRpci0+cmluZ19pbmRleCkpCisJCXJldHVybiAtRU5PTUVNOworCWZ1bGxfc2l6ZSA9IHNpemVvZigqaW5kaXIpICsgc2l6ZW9mKCppbmRpci0+cmluZ19pbmRleCkgKiB0YWJsZV9zaXplOworCWluZGlyID0ga21hbGxvYyhmdWxsX3NpemUsIEdGUF9VU0VSKTsKKwlpZiAoIWluZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihpbmRpciwgdXNlcmFkZHIsIGZ1bGxfc2l6ZSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZGV2LT5ldGh0b29sX29wcy0+c2V0X3J4ZmhfaW5kaXIoZGV2LCBpbmRpcik7CisKK291dDoKKwlrZnJlZShpbmRpcik7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgX19yeF9udHVwbGVfZmlsdGVyX2FkZChzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfbGlzdCAqbGlzdCwKIAkJCXN0cnVjdCBldGh0b29sX3J4X250dXBsZV9mbG93X3NwZWMgKnNwZWMsCiAJCQlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjX2NvbnRhaW5lciAqZnNjKQpAQCAtMTU2Myw2ICsxNjE5LDEyIEBACiAJY2FzZSBFVEhUT09MX0dTU0VUX0lORk86CiAJCXJjID0gZXRodG9vbF9nZXRfc3NldF9pbmZvKGRldiwgdXNlcmFkZHIpOwogCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYRkhJTkRJUjoKKwkJcmMgPSBldGh0b29sX2dldF9yeGZoX2luZGlyKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1JYRkhJTkRJUjoKKwkJcmMgPSBldGh0b29sX3NldF9yeGZoX2luZGlyKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyYyA9IC1FT1BOT1RTVVBQOwogCX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggZGE2OWZiNy4uNTJiMDUxZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTEyOCw4NyArMTI4LDg3IEBACiAJCWZlbnRyeSA9ICZmaWx0ZXJbcGNdOwogCiAJCXN3aXRjaCAoZmVudHJ5LT5jb2RlKSB7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfQUREfEJQRl9YOgorCQljYXNlIEJQRl9TX0FMVV9BRERfWDoKIAkJCUEgKz0gWDsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9BTFV8QlBGX0FERHxCUEZfSzoKKwkJY2FzZSBCUEZfU19BTFVfQUREX0s6CiAJCQlBICs9IGZlbnRyeS0+azsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9BTFV8QlBGX1NVQnxCUEZfWDoKKwkJY2FzZSBCUEZfU19BTFVfU1VCX1g6CiAJCQlBIC09IFg7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9TVUJ8QlBGX0s6CisJCWNhc2UgQlBGX1NfQUxVX1NVQl9LOgogCQkJQSAtPSBmZW50cnktPms7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9NVUx8QlBGX1g6CisJCWNhc2UgQlBGX1NfQUxVX01VTF9YOgogCQkJQSAqPSBYOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfTVVMfEJQRl9LOgorCQljYXNlIEJQRl9TX0FMVV9NVUxfSzoKIAkJCUEgKj0gZmVudHJ5LT5rOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfRElWfEJQRl9YOgorCQljYXNlIEJQRl9TX0FMVV9ESVZfWDoKIAkJCWlmIChYID09IDApCiAJCQkJcmV0dXJuIDA7CiAJCQlBIC89IFg7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9ESVZ8QlBGX0s6CisJCWNhc2UgQlBGX1NfQUxVX0RJVl9LOgogCQkJQSAvPSBmZW50cnktPms7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9BTkR8QlBGX1g6CisJCWNhc2UgQlBGX1NfQUxVX0FORF9YOgogCQkJQSAmPSBYOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfQU5EfEJQRl9LOgorCQljYXNlIEJQRl9TX0FMVV9BTkRfSzoKIAkJCUEgJj0gZmVudHJ5LT5rOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfT1J8QlBGX1g6CisJCWNhc2UgQlBGX1NfQUxVX09SX1g6CiAJCQlBIHw9IFg7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9PUnxCUEZfSzoKKwkJY2FzZSBCUEZfU19BTFVfT1JfSzoKIAkJCUEgfD0gZmVudHJ5LT5rOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfTFNIfEJQRl9YOgorCQljYXNlIEJQRl9TX0FMVV9MU0hfWDoKIAkJCUEgPDw9IFg7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9MU0h8QlBGX0s6CisJCWNhc2UgQlBGX1NfQUxVX0xTSF9LOgogCQkJQSA8PD0gZmVudHJ5LT5rOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfUlNIfEJQRl9YOgorCQljYXNlIEJQRl9TX0FMVV9SU0hfWDoKIAkJCUEgPj49IFg7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfQUxVfEJQRl9SU0h8QlBGX0s6CisJCWNhc2UgQlBGX1NfQUxVX1JTSF9LOgogCQkJQSA+Pj0gZmVudHJ5LT5rOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0FMVXxCUEZfTkVHOgorCQljYXNlIEJQRl9TX0FMVV9ORUc6CiAJCQlBID0gLUE7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfSk1QfEJQRl9KQToKKwkJY2FzZSBCUEZfU19KTVBfSkE6CiAJCQlwYyArPSBmZW50cnktPms7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfSk1QfEJQRl9KR1R8QlBGX0s6CisJCWNhc2UgQlBGX1NfSk1QX0pHVF9LOgogCQkJcGMgKz0gKEEgPiBmZW50cnktPmspID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfSk1QfEJQRl9KR0V8QlBGX0s6CisJCWNhc2UgQlBGX1NfSk1QX0pHRV9LOgogCQkJcGMgKz0gKEEgPj0gZmVudHJ5LT5rKSA/IGZlbnRyeS0+anQgOiBmZW50cnktPmpmOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0pNUHxCUEZfSkVRfEJQRl9LOgorCQljYXNlIEJQRl9TX0pNUF9KRVFfSzoKIAkJCXBjICs9IChBID09IGZlbnRyeS0+aykgPyBmZW50cnktPmp0IDogZmVudHJ5LT5qZjsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9KTVB8QlBGX0pTRVR8QlBGX0s6CisJCWNhc2UgQlBGX1NfSk1QX0pTRVRfSzoKIAkJCXBjICs9IChBICYgZmVudHJ5LT5rKSA/IGZlbnRyeS0+anQgOiBmZW50cnktPmpmOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0pNUHxCUEZfSkdUfEJQRl9YOgorCQljYXNlIEJQRl9TX0pNUF9KR1RfWDoKIAkJCXBjICs9IChBID4gWCkgPyBmZW50cnktPmp0IDogZmVudHJ5LT5qZjsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9KTVB8QlBGX0pHRXxCUEZfWDoKKwkJY2FzZSBCUEZfU19KTVBfSkdFX1g6CiAJCQlwYyArPSAoQSA+PSBYKSA/IGZlbnRyeS0+anQgOiBmZW50cnktPmpmOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0pNUHxCUEZfSkVRfEJQRl9YOgorCQljYXNlIEJQRl9TX0pNUF9KRVFfWDoKIAkJCXBjICs9IChBID09IFgpID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfSk1QfEJQRl9KU0VUfEJQRl9YOgorCQljYXNlIEJQRl9TX0pNUF9KU0VUX1g6CiAJCQlwYyArPSAoQSAmIFgpID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CiAJCQljb250aW51ZTsKLQkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0FCUzoKKwkJY2FzZSBCUEZfU19MRF9XX0FCUzoKIAkJCWsgPSBmZW50cnktPms7CiBsb2FkX3c6CiAJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrLCA0LCAmdG1wKTsKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0xEfEJQRl9IfEJQRl9BQlM6CisJCWNhc2UgQlBGX1NfTERfSF9BQlM6CiAJCQlrID0gZmVudHJ5LT5rOwogbG9hZF9oOgogCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgaywgMiwgJnRtcCk7CkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwotCQljYXNlIEJQRl9MRHxCUEZfQnxCUEZfQUJTOgorCQljYXNlIEJQRl9TX0xEX0JfQUJTOgogCQkJayA9IGZlbnRyeS0+azsKIGxvYWRfYjoKIAkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDEsICZ0bXApOwpAQCAtMjM1LDU0ICsyMzUsNTQgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwotCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfTEVOOgorCQljYXNlIEJQRl9TX0xEX1dfTEVOOgogCQkJQSA9IHNrYi0+bGVuOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX0xEWHxCUEZfV3xCUEZfTEVOOgorCQljYXNlIEJQRl9TX0xEWF9XX0xFTjoKIAkJCVggPSBza2ItPmxlbjsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfSU5EOgorCQljYXNlIEJQRl9TX0xEX1dfSU5EOgogCQkJayA9IFggKyBmZW50cnktPms7CiAJCQlnb3RvIGxvYWRfdzsKLQkJY2FzZSBCUEZfTER8QlBGX0h8QlBGX0lORDoKKwkJY2FzZSBCUEZfU19MRF9IX0lORDoKIAkJCWsgPSBYICsgZmVudHJ5LT5rOwogCQkJZ290byBsb2FkX2g7Ci0JCWNhc2UgQlBGX0xEfEJQRl9CfEJQRl9JTkQ6CisJCWNhc2UgQlBGX1NfTERfQl9JTkQ6CiAJCQlrID0gWCArIGZlbnRyeS0+azsKIAkJCWdvdG8gbG9hZF9iOwotCQljYXNlIEJQRl9MRFh8QlBGX0J8QlBGX01TSDoKKwkJY2FzZSBCUEZfU19MRFhfQl9NU0g6CiAJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBmZW50cnktPmssIDEsICZ0bXApOwogCQkJaWYgKHB0ciAhPSBOVUxMKSB7CiAJCQkJWCA9ICgqKHU4ICopcHRyICYgMHhmKSA8PCAyOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJcmV0dXJuIDA7Ci0JCWNhc2UgQlBGX0xEfEJQRl9JTU06CisJCWNhc2UgQlBGX1NfTERfSU1NOgogCQkJQSA9IGZlbnRyeS0+azsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9MRFh8QlBGX0lNTToKKwkJY2FzZSBCUEZfU19MRFhfSU1NOgogCQkJWCA9IGZlbnRyeS0+azsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9MRHxCUEZfTUVNOgorCQljYXNlIEJQRl9TX0xEX01FTToKIAkJCUEgPSBtZW1bZmVudHJ5LT5rXTsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9MRFh8QlBGX01FTToKKwkJY2FzZSBCUEZfU19MRFhfTUVNOgogCQkJWCA9IG1lbVtmZW50cnktPmtdOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX01JU0N8QlBGX1RBWDoKKwkJY2FzZSBCUEZfU19NSVNDX1RBWDoKIAkJCVggPSBBOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX01JU0N8QlBGX1RYQToKKwkJY2FzZSBCUEZfU19NSVNDX1RYQToKIAkJCUEgPSBYOwogCQkJY29udGludWU7Ci0JCWNhc2UgQlBGX1JFVHxCUEZfSzoKKwkJY2FzZSBCUEZfU19SRVRfSzoKIAkJCXJldHVybiBmZW50cnktPms7Ci0JCWNhc2UgQlBGX1JFVHxCUEZfQToKKwkJY2FzZSBCUEZfU19SRVRfQToKIAkJCXJldHVybiBBOwotCQljYXNlIEJQRl9TVDoKKwkJY2FzZSBCUEZfU19TVDoKIAkJCW1lbVtmZW50cnktPmtdID0gQTsKIAkJCWNvbnRpbnVlOwotCQljYXNlIEJQRl9TVFg6CisJCWNhc2UgQlBGX1NfU1RYOgogCQkJbWVtW2ZlbnRyeS0+a10gPSBYOwogCQkJY29udGludWU7CiAJCWRlZmF1bHQ6CkBAIC0zOTAsNTMgKzM5MCwxMjggQEAKIAkJLyogT25seSBhbGxvdyB2YWxpZCBpbnN0cnVjdGlvbnMgKi8KIAkJc3dpdGNoIChmdGVzdC0+Y29kZSkgewogCQljYXNlIEJQRl9BTFV8QlBGX0FERHxCUEZfSzoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfQUxVX0FERF9LOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0FMVXxCUEZfQUREfEJQRl9YOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfQUREX1g7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfQUxVfEJQRl9TVUJ8QlBGX0s6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0FMVV9TVUJfSzsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9BTFV8QlBGX1NVQnxCUEZfWDoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfQUxVX1NVQl9YOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0FMVXxCUEZfTVVMfEJQRl9LOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfTVVMX0s7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfQUxVfEJQRl9NVUx8QlBGX1g6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0FMVV9NVUxfWDsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9BTFV8QlBGX0RJVnxCUEZfWDoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfQUxVX0RJVl9YOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0FMVXxCUEZfQU5EfEJQRl9LOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfQU5EX0s7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfQUxVfEJQRl9BTkR8QlBGX1g6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0FMVV9BTkRfWDsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9BTFV8QlBGX09SfEJQRl9LOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfT1JfSzsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9BTFV8QlBGX09SfEJQRl9YOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfT1JfWDsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9BTFV8QlBGX0xTSHxCUEZfSzoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfQUxVX0xTSF9LOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0FMVXxCUEZfTFNIfEJQRl9YOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfTFNIX1g7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfQUxVfEJQRl9SU0h8QlBGX0s6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0FMVV9SU0hfSzsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9BTFV8QlBGX1JTSHxCUEZfWDoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfQUxVX1JTSF9YOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0FMVXxCUEZfTkVHOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19BTFVfTkVHOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9BQlM6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX1dfQUJTOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9IfEJQRl9BQlM6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX0hfQUJTOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9CfEJQRl9BQlM6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX0JfQUJTOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9MRU46CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX1dfTEVOOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9JTkQ6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX1dfSU5EOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9IfEJQRl9JTkQ6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX0hfSU5EOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9CfEJQRl9JTkQ6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX0JfSU5EOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9JTU06CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEX0lNTTsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9MRFh8QlBGX1d8QlBGX0xFTjoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfTERYX1dfTEVOOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEWHxCUEZfQnxCUEZfTVNIOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19MRFhfQl9NU0g7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfTERYfEJQRl9JTU06CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0xEWF9JTU07CisJCQlicmVhazsKIAkJY2FzZSBCUEZfTUlTQ3xCUEZfVEFYOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19NSVNDX1RBWDsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9NSVNDfEJQRl9UWEE6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX01JU0NfVFhBOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX1JFVHxCUEZfSzoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfUkVUX0s7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfUkVUfEJQRl9BOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19SRVRfQTsKIAkJCWJyZWFrOwogCiAJCS8qIFNvbWUgaW5zdHJ1Y3Rpb25zIG5lZWQgc3BlY2lhbCBjaGVja3MgKi8KIAotCQljYXNlIEJQRl9BTFV8QlBGX0RJVnxCUEZfSzoKIAkJCS8qIGNoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvICovCisJCWNhc2UgQlBGX0FMVXxCUEZfRElWfEJQRl9LOgogCQkJaWYgKGZ0ZXN0LT5rID09IDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0FMVV9ESVZfSzsKIAkJCWJyZWFrOwogCisJCS8qIGNoZWNrIGZvciBpbnZhbGlkIG1lbW9yeSBhZGRyZXNzZXMgKi8KIAkJY2FzZSBCUEZfTER8QlBGX01FTToKLQkJY2FzZSBCUEZfTERYfEJQRl9NRU06Ci0JCWNhc2UgQlBGX1NUOgotCQljYXNlIEJQRl9TVFg6Ci0JCQkvKiBjaGVjayBmb3IgaW52YWxpZCBtZW1vcnkgYWRkcmVzc2VzICovCiAJCQlpZiAoZnRlc3QtPmsgPj0gQlBGX01FTVdPUkRTKQogCQkJCXJldHVybiAtRUlOVkFMOworCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19MRF9NRU07CisJCQlicmVhazsKKwkJY2FzZSBCUEZfTERYfEJQRl9NRU06CisJCQlpZiAoZnRlc3QtPmsgPj0gQlBGX01FTVdPUkRTKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19MRFhfTUVNOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NUOgorCQkJaWYgKGZ0ZXN0LT5rID49IEJQRl9NRU1XT1JEUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfU1Q7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU1RYOgorCQkJaWYgKGZ0ZXN0LT5rID49IEJQRl9NRU1XT1JEUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfU1RYOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBCUEZfSk1QfEJQRl9KQToKQEAgLTQ0NywyOCArNTIyLDYzIEBACiAJCQkgKi8KIAkJCWlmIChmdGVzdC0+ayA+PSAodW5zaWduZWQpKGZsZW4tcGMtMSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0pNUF9KQTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQlBGX0pNUHxCUEZfSkVRfEJQRl9LOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19KTVBfSkVRX0s7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfSk1QfEJQRl9KRVF8QlBGX1g6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0pNUF9KRVFfWDsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9KTVB8QlBGX0pHRXxCUEZfSzoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfSk1QX0pHRV9LOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0pNUHxCUEZfSkdFfEJQRl9YOgorCQkJZnRlc3QtPmNvZGUgPSBCUEZfU19KTVBfSkdFX1g7CisJCQlicmVhazsKIAkJY2FzZSBCUEZfSk1QfEJQRl9KR1R8QlBGX0s6CisJCQlmdGVzdC0+Y29kZSA9IEJQRl9TX0pNUF9KR1RfSzsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9KTVB8QlBGX0pHVHxCUEZfWDoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfSk1QX0pHVF9YOworCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0pNUHxCUEZfSlNFVHxCUEZfSzoKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfSk1QX0pTRVRfSzsKKwkJCWJyZWFrOwogCQljYXNlIEJQRl9KTVB8QlBGX0pTRVR8QlBGX1g6Ci0JCQkvKiBmb3IgY29uZGl0aW9uYWxzIGJvdGggbXVzdCBiZSBzYWZlICovCi0JCQlpZiAocGMgKyBmdGVzdC0+anQgKyAxID49IGZsZW4gfHwKLQkJCSAgICBwYyArIGZ0ZXN0LT5qZiArIDEgPj0gZmxlbikKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWZ0ZXN0LT5jb2RlID0gQlBGX1NfSk1QX0pTRVRfWDsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCisJCQkvKiBmb3IgY29uZGl0aW9uYWxzIGJvdGggbXVzdCBiZSBzYWZlICovCisJCXN3aXRjaCAoZnRlc3QtPmNvZGUpIHsKKwkJY2FzZSBCUEZfU19KTVBfSkVRX0s6CisJCWNhc2UgQlBGX1NfSk1QX0pFUV9YOgorCQljYXNlIEJQRl9TX0pNUF9KR0VfSzoKKwkJY2FzZSBCUEZfU19KTVBfSkdFX1g6CisJCWNhc2UgQlBGX1NfSk1QX0pHVF9LOgorCQljYXNlIEJQRl9TX0pNUF9KR1RfWDoKKwkJY2FzZSBCUEZfU19KTVBfSlNFVF9YOgorCQljYXNlIEJQRl9TX0pNUF9KU0VUX0s6CisJCQlpZiAocGMgKyBmdGVzdC0+anQgKyAxID49IGZsZW4gfHwKKwkJCSAgICBwYyArIGZ0ZXN0LT5qZiArIDEgPj0gZmxlbikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAotCXJldHVybiAoQlBGX0NMQVNTKGZpbHRlcltmbGVuIC0gMV0uY29kZSkgPT0gQlBGX1JFVCkgPyAwIDogLUVJTlZBTDsKKwkvKiBsYXN0IGluc3RydWN0aW9uIG11c3QgYmUgYSBSRVQgY29kZSAqLworCXN3aXRjaCAoZmlsdGVyW2ZsZW4gLSAxXS5jb2RlKSB7CisJY2FzZSBCUEZfU19SRVRfSzoKKwljYXNlIEJQRl9TX1JFVF9BOgorCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogfQogRVhQT1JUX1NZTUJPTChza19jaGtfZmlsdGVyKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmxvdy5jIGIvbmV0L2NvcmUvZmxvdy5jCmluZGV4IDE2MTkwMDYuLmY2N2RjYmYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zsb3cuYworKysgYi9uZXQvY29yZS9mbG93LmMKQEAgLTYyLDYgKzYyLDcgQEAKIH07CiAKIGF0b21pY190IGZsb3dfY2FjaGVfZ2VuaWQgPSBBVE9NSUNfSU5JVCgwKTsKK0VYUE9SVF9TWU1CT0woZmxvd19jYWNoZV9nZW5pZCk7CiBzdGF0aWMgc3RydWN0IGZsb3dfY2FjaGUgZmxvd19jYWNoZV9nbG9iYWw7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZsb3dfY2FjaGVwOwogCkBAIC0yMjIsNyArMjIzLDcgQEAKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlmY3AgPSBwZXJfY3B1X3B0cihmYy0+cGVyY3B1LCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWZjcCA9IHRoaXNfY3B1X3B0cihmYy0+cGVyY3B1KTsKIAogCWZsZSA9IE5VTEw7CiAJZmxvID0gTlVMTDsKQEAgLTI5MSw2ICsyOTIsNyBAQAogCWxvY2FsX2JoX2VuYWJsZSgpOwogCXJldHVybiBmbG87CiB9CitFWFBPUlRfU1lNQk9MKGZsb3dfY2FjaGVfbG9va3VwKTsKIAogc3RhdGljIHZvaWQgZmxvd19jYWNoZV9mbHVzaF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKQEAgLTMwMiw3ICszMDQsNyBAQAogCUxJU1RfSEVBRChnY19saXN0KTsKIAlpbnQgaSwgZGVsZXRlZCA9IDA7CiAKLQlmY3AgPSBwZXJfY3B1X3B0cihmYy0+cGVyY3B1LCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWZjcCA9IHRoaXNfY3B1X3B0cihmYy0+cGVyY3B1KTsKIAlmb3IgKGkgPSAwOyBpIDwgZmxvd19jYWNoZV9oYXNoX3NpemUoZmMpOyBpKyspIHsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmbGUsIGVudHJ5LCB0bXAsCiAJCQkJCSAgJmZjcC0+aGFzaF90YWJsZVtpXSwgdS5obGlzdCkgewpAQCAtNDI0LDYgKzQyNiwzIEBACiB9CiAKIG1vZHVsZV9pbml0KGZsb3dfY2FjaGVfaW5pdF9nbG9iYWwpOwotCi1FWFBPUlRfU1lNQk9MKGZsb3dfY2FjaGVfZ2VuaWQpOwotRVhQT1JUX1NZTUJPTChmbG93X2NhY2hlX2xvb2t1cCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9nZW5fZXN0aW1hdG9yLmMgYi9uZXQvY29yZS9nZW5fZXN0aW1hdG9yLmMKaW5kZXggNzg1ZTUyNy4uOWZiZTdmNyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZ2VuX2VzdGltYXRvci5jCisrKyBiL25ldC9jb3JlL2dlbl9lc3RpbWF0b3IuYwpAQCAtMjYzLDYgKzI2Myw3IEBACiAgKgogICogUmVtb3ZlcyB0aGUgcmF0ZSBlc3RpbWF0b3Igc3BlY2lmaWVkIGJ5ICZic3RhdHMgYW5kICZyYXRlX2VzdC4KICAqCisgKiBOb3RlIDogQ2FsbGVyIHNob3VsZCByZXNwZWN0IGFuIFJDVSBncmFjZSBwZXJpb2QgYmVmb3JlIGZyZWVpbmcgc3RhdHNfbG9jawogICovCiB2b2lkIGdlbl9raWxsX2VzdGltYXRvcihzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpY19wYWNrZWQgKmJzdGF0cywKIAkJCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0ICpyYXRlX2VzdCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2dlbl9zdGF0cy5jIGIvbmV0L2NvcmUvZ2VuX3N0YXRzLmMKaW5kZXggMzkzYjFkOC4uMDQ1MmViMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZ2VuX3N0YXRzLmMKKysrIGIvbmV0L2NvcmUvZ2VuX3N0YXRzLmMKQEAgLTczLDYgKzczLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0KTsKIAogLyoqCiAgKiBnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0IC0gc3RhcnQgZHVtcGluZyBwcm9jZWR1cmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlCkBAIC05Myw2ICs5NCw3IEBACiB7CiAJcmV0dXJuIGduZXRfc3RhdHNfc3RhcnRfY29weV9jb21wYXQoc2tiLCB0eXBlLCAwLCAwLCBsb2NrLCBkKTsKIH0KK0VYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19zdGFydF9jb3B5KTsKIAogLyoqCiAgKiBnbmV0X3N0YXRzX2NvcHlfYmFzaWMgLSBjb3B5IGJhc2ljIHN0YXRpc3RpY3MgaW50byBzdGF0aXN0aWMgVExWCkBAIC0xMjMsNiArMTI1LDcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9iYXNpYyk7CiAKIC8qKgogICogZ25ldF9zdGF0c19jb3B5X3JhdGVfZXN0IC0gY29weSByYXRlIGVzdGltYXRvciBzdGF0aXN0aWNzIGludG8gc3RhdGlzdGljcyBUTFYKQEAgLTE1NCw2ICsxNTcsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9yYXRlX2VzdCk7CiAKIC8qKgogICogZ25ldF9zdGF0c19jb3B5X3F1ZXVlIC0gY29weSBxdWV1ZSBzdGF0aXN0aWNzIGludG8gc3RhdGlzdGljcyBUTFYKQEAgLTE4MSw2ICsxODUsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9xdWV1ZSk7CiAKIC8qKgogICogZ25ldF9zdGF0c19jb3B5X2FwcCAtIGNvcHkgYXBwbGljYXRpb24gc3BlY2lmaWMgc3RhdGlzdGljcyBpbnRvIHN0YXRpc3RpY3MgVExWCkBAIC0yMDgsNiArMjEzLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChnbmV0X3N0YXRzX2NvcHlfYXBwKTsKIAogLyoqCiAgKiBnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5IC0gZmluaXNoIGR1bXBpbmcgcHJvY2VkdXJlCkBAIC0yNDEsMTIgKzI0Nyw0IEBACiAJc3Bpbl91bmxvY2tfYmgoZC0+bG9jayk7CiAJcmV0dXJuIDA7CiB9Ci0KLQotRVhQT1JUX1NZTUJPTChnbmV0X3N0YXRzX3N0YXJ0X2NvcHkpOwotRVhQT1JUX1NZTUJPTChnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0KTsKLUVYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19jb3B5X2Jhc2ljKTsKLUVYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19jb3B5X3JhdGVfZXN0KTsKLUVYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19jb3B5X3F1ZXVlKTsKLUVYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19jb3B5X2FwcCk7CiBFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfZmluaXNoX2NvcHkpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvaW92ZWMuYyBiL25ldC9jb3JlL2lvdmVjLmMKaW5kZXggMWU3ZjRlOS4uMWNkOThkZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvaW92ZWMuYworKysgYi9uZXQvY29yZS9pb3ZlYy5jCkBAIC05NSw2ICs5NSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wobWVtY3B5X3RvaW92ZWMpOwogCiAvKgogICoJQ29weSBrZXJuZWwgdG8gaW92ZWMuIFJldHVybnMgLUVGQVVMVCBvbiBlcnJvci4KQEAgLTEyMCw2ICsxMjEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1lbWNweV90b2lvdmVjZW5kKTsKIAogLyoKICAqCUNvcHkgaW92ZWMgdG8ga2VybmVsLiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IuCkBAIC0xNDQsNiArMTQ2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChtZW1jcHlfZnJvbWlvdmVjKTsKIAogLyoKICAqCUNvcHkgaW92ZWMgZnJvbSBrZXJuZWwuIFJldHVybnMgLUVGQVVMVCBvbiBlcnJvci4KQEAgLTE3Miw2ICsxNzUsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1lbWNweV9mcm9taW92ZWNlbmQpOwogCiAvKgogICoJQW5kIG5vdyBmb3IgdGhlIGFsbC1pbi1vbmU6IGNvcHkgYW5kIGNoZWNrc3VtIGZyb20gYSB1c2VyIGlvdmVjCkBAIC0yNTYsOSArMjYwLDQgQEAKIAllcnIgPSAtRUZBVUxUOwogCWdvdG8gb3V0OwogfQotCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X2Zyb21pb3ZlY2VuZCk7Ci1FWFBPUlRfU1lNQk9MKG1lbWNweV9mcm9taW92ZWMpOwotRVhQT1JUX1NZTUJPTChtZW1jcHlfZnJvbWlvdmVjZW5kKTsKLUVYUE9SVF9TWU1CT0wobWVtY3B5X3RvaW92ZWMpOwotRVhQT1JUX1NZTUJPTChtZW1jcHlfdG9pb3ZlY2VuZCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9saW5rX3dhdGNoLmMgYi9uZXQvY29yZS9saW5rX3dhdGNoLmMKaW5kZXggYmRiY2UyZi4uMDFhMTEwMSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbGlua193YXRjaC5jCisrKyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwpAQCAtMjQzLDUgKzI0Myw0IEBACiAKIAlsaW5rd2F0Y2hfc2NoZWR1bGVfd29yayh1cmdlbnQpOwogfQotCiBFWFBPUlRfU1lNQk9MKGxpbmt3YXRjaF9maXJlX2V2ZW50KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggOTllNzA1Mi4uYWY0ZGZiYSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTI5LDYgKzI5LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIGZtdF9sb25nX2hleFtdID0gIiUjbHhcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBmbXRfZGVjW10gPSAiJWRcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBmbXRfdWxvbmdbXSA9ICIlbHVcbiI7CitzdGF0aWMgY29uc3QgY2hhciBmbXRfdTY0W10gPSAiJWxsdVxuIjsKIAogc3RhdGljIGlubGluZSBpbnQgZGV2X2lzYWxpdmUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTk0LDYgKzk1LDcgQEAKIH0KIAogTkVUREVWSUNFX1NIT1coZGV2X2lkLCBmbXRfaGV4KTsKK05FVERFVklDRV9TSE9XKGFkZHJfYXNzaWduX3R5cGUsIGZtdF9kZWMpOwogTkVUREVWSUNFX1NIT1coYWRkcl9sZW4sIGZtdF9kZWMpOwogTkVUREVWSUNFX1NIT1coaWZsaW5rLCBmbXRfZGVjKTsKIE5FVERFVklDRV9TSE9XKGlmaW5kZXgsIGZtdF9kZWMpOwpAQCAtMjk0LDYgKzI5Niw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBuZXRfY2xhc3NfYXR0cmlidXRlc1tdID0geworCV9fQVRUUihhZGRyX2Fzc2lnbl90eXBlLCBTX0lSVUdPLCBzaG93X2FkZHJfYXNzaWduX3R5cGUsIE5VTEwpLAogCV9fQVRUUihhZGRyX2xlbiwgU19JUlVHTywgc2hvd19hZGRyX2xlbiwgTlVMTCksCiAJX19BVFRSKGRldl9pZCwgU19JUlVHTywgc2hvd19kZXZfaWQsIE5VTEwpLAogCV9fQVRUUihpZmFsaWFzLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19pZmFsaWFzLCBzdG9yZV9pZmFsaWFzKSwKQEAgLTMyNCwxNCArMzI3LDE1IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoZCk7CiAJc3NpemVfdCByZXQgPSAtRUlOVkFMOwogCi0JV0FSTl9PTihvZmZzZXQgPiBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpIHx8Ci0JCQlvZmZzZXQgJSBzaXplb2YodW5zaWduZWQgbG9uZykgIT0gMCk7CisJV0FSTl9PTihvZmZzZXQgPiBzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19zdGF0czY0KSB8fAorCQkJb2Zmc2V0ICUgc2l6ZW9mKHU2NCkgIT0gMCk7CiAKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCWlmIChkZXZfaXNhbGl2ZShkZXYpKSB7Ci0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGRldl9nZXRfc3RhdHMoZGV2KTsKLQkJcmV0ID0gc3ByaW50ZihidWYsIGZtdF91bG9uZywKLQkJCSAgICAgICoodW5zaWduZWQgbG9uZyAqKSgoKHU4ICopIHN0YXRzKSArIG9mZnNldCkpOworCQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKKwkJY29uc3Qgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cyA9IGRldl9nZXRfc3RhdHMoZGV2LCAmdGVtcCk7CisKKwkJcmV0ID0gc3ByaW50ZihidWYsIGZtdF91NjQsICoodTY0ICopKCgodTggKikgc3RhdHMpICsgb2Zmc2V0KSk7CiAJfQogCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzQzLDcgKzM0Nyw3IEBACiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSAJXAogewkJCQkJCQkJCVwKIAlyZXR1cm4gbmV0c3RhdF9zaG93KGQsIGF0dHIsIGJ1ZiwJCQkJXAotCQkJICAgIG9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzLCBuYW1lKSk7CVwKKwkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQsIG5hbWUpKTsJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKIApAQCAtOTIyLDEzICs5MjYsMTIgQEAKIHsKIAlyZXR1cm4gY2xhc3NfY3JlYXRlX2ZpbGUoJm5ldF9jbGFzcywgY2xhc3NfYXR0cik7CiB9CitFWFBPUlRfU1lNQk9MKG5ldGRldl9jbGFzc19jcmVhdGVfZmlsZSk7CiAKIHZvaWQgbmV0ZGV2X2NsYXNzX3JlbW92ZV9maWxlKHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmNsYXNzX2F0dHIpCiB7CiAJY2xhc3NfcmVtb3ZlX2ZpbGUoJm5ldF9jbGFzcywgY2xhc3NfYXR0cik7CiB9Ci0KLUVYUE9SVF9TWU1CT0wobmV0ZGV2X2NsYXNzX2NyZWF0ZV9maWxlKTsKIEVYUE9SVF9TWU1CT0wobmV0ZGV2X2NsYXNzX3JlbW92ZV9maWxlKTsKIAogaW50IG5ldGRldl9rb2JqZWN0X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldGV2ZW50LmMgYi9uZXQvY29yZS9uZXRldmVudC5jCmluZGV4IDk1ZjgxZGUuLjg2NWYwY2UgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldGV2ZW50LmMKKysrIGIvbmV0L2NvcmUvbmV0ZXZlbnQuYwpAQCAtMzUsNiArMzUsNyBAQAogCWVyciA9IGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmV0ZXZlbnRfbm90aWZfY2hhaW4sIG5iKTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIpOwogCiAvKioKICAqCW5ldGV2ZW50X3VucmVnaXN0ZXJfbm90aWZpZXIgLSB1bnJlZ2lzdGVyIGEgbmV0ZXZlbnQgbm90aWZpZXIgYmxvY2sKQEAgLTUwLDYgKzUxLDcgQEAKIHsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5ldGV2ZW50X25vdGlmX2NoYWluLCBuYik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKTsKIAogLyoqCiAgKgljYWxsX25ldGV2ZW50X25vdGlmaWVycyAtIGNhbGwgYWxsIG5ldGV2ZW50IG5vdGlmaWVyIGJsb2NrcwpAQCAtNjQsNyArNjYsNCBAQAogewogCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbmV0ZXZlbnRfbm90aWZfY2hhaW4sIHZhbCwgdik7CiB9Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIpOwogRVhQT1JUX1NZTUJPTF9HUEwoY2FsbF9uZXRldmVudF9ub3RpZmllcnMpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IDk0ODI1YjEuLjUzN2UwMWEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTE5OSwxMSArMTk5LDEzIEBACiAKIAl6YXBfY29tcGxldGlvbl9xdWV1ZSgpOwogfQorRVhQT1JUX1NZTUJPTChuZXRwb2xsX3BvbGxfZGV2KTsKIAogdm9pZCBuZXRwb2xsX3BvbGwoc3RydWN0IG5ldHBvbGwgKm5wKQogewogCW5ldHBvbGxfcG9sbF9kZXYobnAtPmRldik7CiB9CitFWFBPUlRfU1lNQk9MKG5ldHBvbGxfcG9sbCk7CiAKIHN0YXRpYyB2b2lkIHJlZmlsbF9za2JzKHZvaWQpCiB7CkBAIC0yOTIsNiArMjk0LDcgQEAKIAl1bnNpZ25lZCBsb25nIHRyaWVzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBucC0+ZGV2OwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gZGV2LT5uZXRkZXZfb3BzOworCS8qIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8ga2VlcCBucGluZm8gYWxpdmUuICovCiAJc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvID0gbnAtPmRldi0+bnBpbmZvOwogCiAJaWYgKCFucGluZm8gfHwgIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgewpAQCAtMzQzLDYgKzM0Niw3IEBACiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbnBpbmZvLT50eF93b3JrLDApOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wobmV0cG9sbF9zZW5kX3NrYik7CiAKIHZvaWQgbmV0cG9sbF9zZW5kX3VkcChzdHJ1Y3QgbmV0cG9sbCAqbnAsIGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKIHsKQEAgLTQwNCw2ICs0MDgsNyBAQAogCiAJbmV0cG9sbF9zZW5kX3NrYihucCwgc2tiKTsKIH0KK0VYUE9SVF9TWU1CT0wobmV0cG9sbF9zZW5kX3VkcCk7CiAKIHN0YXRpYyB2b2lkIGFycF9yZXBseShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNjMwLDYgKzYzNSw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbW90ZSBldGhlcm5ldCBhZGRyZXNzICVwTVxuIiwKIAkgICAgICAgICAgICAgICAgIG5wLT5uYW1lLCBucC0+cmVtb3RlX21hYyk7CiB9CitFWFBPUlRfU1lNQk9MKG5ldHBvbGxfcHJpbnRfb3B0aW9ucyk7CiAKIGludCBuZXRwb2xsX3BhcnNlX29wdGlvbnMoc3RydWN0IG5ldHBvbGwgKm5wLCBjaGFyICpvcHQpCiB7CkBAIC03MjIsMzAgKzcyOCwyOSBAQAogCSAgICAgICBucC0+bmFtZSwgY3VyKTsKIAlyZXR1cm4gLTE7CiB9CitFWFBPUlRfU1lNQk9MKG5ldHBvbGxfcGFyc2Vfb3B0aW9ucyk7CiAKLWludCBuZXRwb2xsX3NldHVwKHN0cnVjdCBuZXRwb2xsICpucCkKK2ludCBfX25ldHBvbGxfc2V0dXAoc3RydWN0IG5ldHBvbGwgKm5wKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBucC0+ZGV2OwogCXN0cnVjdCBuZXRwb2xsX2luZm8gKm5waW5mbzsKLQlzdHJ1Y3QgbmV0cG9sbCAqbnBlLCAqdG1wOworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCWlmIChucC0+ZGV2X25hbWUpCi0JCW5kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBucC0+ZGV2X25hbWUpOwotCWlmICghbmRldikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBkb2Vzbid0IGV4aXN0LCBhYm9ydGluZy5cbiIsCisJaWYgKChuZGV2LT5wcml2X2ZsYWdzICYgSUZGX0RJU0FCTEVfTkVUUE9MTCkgfHwKKwkgICAgIW5kZXYtPm5ldGRldl9vcHMtPm5kb19wb2xsX2NvbnRyb2xsZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZG9lc24ndCBzdXBwb3J0IHBvbGxpbmcsIGFib3J0aW5nLlxuIiwKIAkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZXJyID0gLUVOT1RTVVBQOworCQlnb3RvIG91dDsKIAl9CiAKLQlucC0+ZGV2ID0gbmRldjsKIAlpZiAoIW5kZXYtPm5waW5mbykgewogCQlucGluZm8gPSBrbWFsbG9jKHNpemVvZigqbnBpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbnBpbmZvKSB7CiAJCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBwdXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCW5waW5mby0+cnhfZmxhZ3MgPSAwOwpAQCAtNzU3LDYgKzc2MiwxMyBAQAogCQlJTklUX0RFTEFZRURfV09SSygmbnBpbmZvLT50eF93b3JrLCBxdWV1ZV9wcm9jZXNzKTsKIAogCQlhdG9taWNfc2V0KCZucGluZm8tPnJlZmNudCwgMSk7CisKKwkJb3BzID0gbnAtPmRldi0+bmV0ZGV2X29wczsKKwkJaWYgKG9wcy0+bmRvX25ldHBvbGxfc2V0dXApIHsKKwkJCWVyciA9IG9wcy0+bmRvX25ldHBvbGxfc2V0dXAobmRldiwgbnBpbmZvKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmcmVlX25waW5mbzsKKwkJfQogCX0gZWxzZSB7CiAJCW5waW5mbyA9IG5kZXYtPm5waW5mbzsKIAkJYXRvbWljX2luYygmbnBpbmZvLT5yZWZjbnQpOwpAQCAtNzY0LDEyICs3NzYsMzcgQEAKIAogCW5waW5mby0+bmV0cG9sbCA9IG5wOwogCi0JaWYgKChuZGV2LT5wcml2X2ZsYWdzICYgSUZGX0RJU0FCTEVfTkVUUE9MTCkgfHwKLQkgICAgIW5kZXYtPm5ldGRldl9vcHMtPm5kb19wb2xsX2NvbnRyb2xsZXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZG9lc24ndCBzdXBwb3J0IHBvbGxpbmcsIGFib3J0aW5nLlxuIiwKKwlpZiAobnAtPnJ4X2hvb2spIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOworCQlucGluZm8tPnJ4X2ZsYWdzIHw9IE5FVFBPTExfUlhfRU5BQkxFRDsKKwkJbGlzdF9hZGRfdGFpbCgmbnAtPnJ4LCAmbnBpbmZvLT5yeF9ucCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOworCX0KKworCS8qIGxhc3QgdGhpbmcgdG8gZG8gaXMgbGluayBpdCB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlyY3VfYXNzaWduX3BvaW50ZXIobmRldi0+bnBpbmZvLCBucGluZm8pOworCisJcmV0dXJuIDA7CisKK2ZyZWVfbnBpbmZvOgorCWtmcmVlKG5waW5mbyk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmV0cG9sbF9zZXR1cCk7CisKK2ludCBuZXRwb2xsX3NldHVwKHN0cnVjdCBuZXRwb2xsICpucCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCWludCBlcnI7CisKKwlpZiAobnAtPmRldl9uYW1lKQorCQluZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgbnAtPmRldl9uYW1lKTsKKwlpZiAoIW5kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZG9lc24ndCBleGlzdCwgYWJvcnRpbmcuXG4iLAogCQkgICAgICAgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7Ci0JCWVyciA9IC1FTk9UU1VQUDsKLQkJZ290byByZWxlYXNlOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpIHsKQEAgLTc4NSw3ICs4MjIsNyBAQAogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gb3BlbiAlc1xuIiwKIAkJCSAgICAgICBucC0+bmFtZSwgbmRldi0+bmFtZSk7Ci0JCQlnb3RvIHJlbGVhc2U7CisJCQlnb3RvIHB1dDsKIAkJfQogCiAJCWF0bGVhc3QgPSBqaWZmaWVzICsgSFovMTA7CkBAIC04MjIsNyArODU5LDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIElQIGFkZHJlc3MgZm9yICVzLCBhYm9ydGluZ1xuIiwKIAkJCSAgICAgICBucC0+bmFtZSwgbnAtPmRldl9uYW1lKTsKIAkJCWVyciA9IC1FREVTVEFERFJSRVE7Ci0JCQlnb3RvIHJlbGVhc2U7CisJCQlnb3RvIHB1dDsKIAkJfQogCiAJCW5wLT5sb2NhbF9pcCA9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbDsKQEAgLTgzMCwzOCArODY3LDI1IEBACiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2NhbCBJUCAlcEk0XG4iLCBucC0+bmFtZSwgJm5wLT5sb2NhbF9pcCk7CiAJfQogCi0JaWYgKG5wLT5yeF9ob29rKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZucGluZm8tPnJ4X2xvY2ssIGZsYWdzKTsKLQkJbnBpbmZvLT5yeF9mbGFncyB8PSBORVRQT0xMX1JYX0VOQUJMRUQ7Ci0JCWxpc3RfYWRkX3RhaWwoJm5wLT5yeCwgJm5waW5mby0+cnhfbnApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucGluZm8tPnJ4X2xvY2ssIGZsYWdzKTsKLQl9CisJbnAtPmRldiA9IG5kZXY7CiAKIAkvKiBmaWxsIHVwIHRoZSBza2IgcXVldWUgKi8KIAlyZWZpbGxfc2ticygpOwogCi0JLyogbGFzdCB0aGluZyB0byBkbyBpcyBsaW5rIGl0IHRvIHRoZSBuZXQgZGV2aWNlIHN0cnVjdHVyZSAqLwotCW5kZXYtPm5waW5mbyA9IG5waW5mbzsKKwlydG5sX2xvY2soKTsKKwllcnIgPSBfX25ldHBvbGxfc2V0dXAobnApOworCXJ0bmxfdW5sb2NrKCk7CiAKLQkvKiBhdm9pZCByYWNpbmcgd2l0aCBOQVBJIHJlYWRpbmcgbnBpbmZvICovCi0Jc3luY2hyb25pemVfcmN1KCk7CisJaWYgKGVycikKKwkJZ290byBwdXQ7CiAKIAlyZXR1cm4gMDsKIAotIHJlbGVhc2U6Ci0JaWYgKCFuZGV2LT5ucGluZm8pIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobnBlLCB0bXAsICZucGluZm8tPnJ4X25wLCByeCkgewotCQkJbnBlLT5kZXYgPSBOVUxMOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOwotCi0JCWtmcmVlKG5waW5mbyk7Ci0JfQogcHV0OgogCWRldl9wdXQobmRldik7CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0wobmV0cG9sbF9zZXR1cCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IG5ldHBvbGxfaW5pdCh2b2lkKQogewpAQCAtODcwLDQ5ICs4OTQsNjUgQEAKIH0KIGNvcmVfaW5pdGNhbGwobmV0cG9sbF9pbml0KTsKIAotdm9pZCBuZXRwb2xsX2NsZWFudXAoc3RydWN0IG5ldHBvbGwgKm5wKQordm9pZCBfX25ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0cG9sbCAqbnApCiB7CiAJc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobnAtPmRldikgewotCQlucGluZm8gPSBucC0+ZGV2LT5ucGluZm87Ci0JCWlmIChucGluZm8pIHsKLQkJCWlmICghbGlzdF9lbXB0eSgmbnBpbmZvLT5yeF9ucCkpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7Ci0JCQkJbGlzdF9kZWwoJm5wLT5yeCk7Ci0JCQkJaWYgKGxpc3RfZW1wdHkoJm5waW5mby0+cnhfbnApKQotCQkJCQlucGluZm8tPnJ4X2ZsYWdzICY9IH5ORVRQT0xMX1JYX0VOQUJMRUQ7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7Ci0JCQl9CisJbnBpbmZvID0gbnAtPmRldi0+bnBpbmZvOworCWlmICghbnBpbmZvKQorCQlyZXR1cm47CiAKLQkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZucGluZm8tPnJlZmNudCkpIHsKLQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wczsKLQkJCQlza2JfcXVldWVfcHVyZ2UoJm5waW5mby0+YXJwX3R4KTsKLQkJCQlza2JfcXVldWVfcHVyZ2UoJm5waW5mby0+dHhxKTsKLQkJCQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZucGluZm8tPnR4X3dvcmspOwotCi0JCQkJLyogY2xlYW4gYWZ0ZXIgbGFzdCwgdW5maW5pc2hlZCB3b3JrICovCi0JCQkJX19za2JfcXVldWVfcHVyZ2UoJm5waW5mby0+dHhxKTsKLQkJCQlrZnJlZShucGluZm8pOwotCQkJCW9wcyA9IG5wLT5kZXYtPm5ldGRldl9vcHM7Ci0JCQkJaWYgKG9wcy0+bmRvX25ldHBvbGxfY2xlYW51cCkKLQkJCQkJb3BzLT5uZG9fbmV0cG9sbF9jbGVhbnVwKG5wLT5kZXYpOwotCQkJCWVsc2UKLQkJCQkJbnAtPmRldi0+bnBpbmZvID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JCWRldl9wdXQobnAtPmRldik7CisJaWYgKCFsaXN0X2VtcHR5KCZucGluZm8tPnJ4X25wKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZGVsKCZucC0+cngpOworCQlpZiAobGlzdF9lbXB0eSgmbnBpbmZvLT5yeF9ucCkpCisJCQlucGluZm8tPnJ4X2ZsYWdzICY9IH5ORVRQT0xMX1JYX0VOQUJMRUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOwogCX0KIAorCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZucGluZm8tPnJlZmNudCkpIHsKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHM7CisKKwkJb3BzID0gbnAtPmRldi0+bmV0ZGV2X29wczsKKwkJaWYgKG9wcy0+bmRvX25ldHBvbGxfY2xlYW51cCkKKwkJCW9wcy0+bmRvX25ldHBvbGxfY2xlYW51cChucC0+ZGV2KTsKKworCQlyY3VfYXNzaWduX3BvaW50ZXIobnAtPmRldi0+bnBpbmZvLCBOVUxMKTsKKworCQkvKiBhdm9pZCByYWNpbmcgd2l0aCBOQVBJIHJlYWRpbmcgbnBpbmZvICovCisJCXN5bmNocm9uaXplX3JjdV9iaCgpOworCisJCXNrYl9xdWV1ZV9wdXJnZSgmbnBpbmZvLT5hcnBfdHgpOworCQlza2JfcXVldWVfcHVyZ2UoJm5waW5mby0+dHhxKTsKKwkJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmbnBpbmZvLT50eF93b3JrKTsKKworCQkvKiBjbGVhbiBhZnRlciBsYXN0LCB1bmZpbmlzaGVkIHdvcmsgKi8KKwkJX19za2JfcXVldWVfcHVyZ2UoJm5waW5mby0+dHhxKTsKKwkJa2ZyZWUobnBpbmZvKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX25ldHBvbGxfY2xlYW51cCk7CisKK3ZvaWQgbmV0cG9sbF9jbGVhbnVwKHN0cnVjdCBuZXRwb2xsICpucCkKK3sKKwlpZiAoIW5wLT5kZXYpCisJCXJldHVybjsKKworCXJ0bmxfbG9jaygpOworCV9fbmV0cG9sbF9jbGVhbnVwKG5wKTsKKwlydG5sX3VubG9jaygpOworCisJZGV2X3B1dChucC0+ZGV2KTsKIAlucC0+ZGV2ID0gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wobmV0cG9sbF9jbGVhbnVwKTsKIAogaW50IG5ldHBvbGxfdHJhcCh2b2lkKQogewogCXJldHVybiBhdG9taWNfcmVhZCgmdHJhcHBlZCk7CiB9CitFWFBPUlRfU1lNQk9MKG5ldHBvbGxfdHJhcCk7CiAKIHZvaWQgbmV0cG9sbF9zZXRfdHJhcChpbnQgdHJhcCkKIHsKQEAgLTkyMSwxNCArOTYxLDQgQEAKIAllbHNlCiAJCWF0b21pY19kZWMoJnRyYXBwZWQpOwogfQotCi1FWFBPUlRfU1lNQk9MKG5ldHBvbGxfc2VuZF9za2IpOwogRVhQT1JUX1NZTUJPTChuZXRwb2xsX3NldF90cmFwKTsKLUVYUE9SVF9TWU1CT0wobmV0cG9sbF90cmFwKTsKLUVYUE9SVF9TWU1CT0wobmV0cG9sbF9wcmludF9vcHRpb25zKTsKLUVYUE9SVF9TWU1CT0wobmV0cG9sbF9wYXJzZV9vcHRpb25zKTsKLUVYUE9SVF9TWU1CT0wobmV0cG9sbF9zZXR1cCk7Ci1FWFBPUlRfU1lNQk9MKG5ldHBvbGxfY2xlYW51cCk7Ci1FWFBPUlRfU1lNQk9MKG5ldHBvbGxfc2VuZF91ZHApOwotRVhQT1JUX1NZTUJPTChuZXRwb2xsX3BvbGxfZGV2KTsKLUVYUE9SVF9TWU1CT0wobmV0cG9sbF9wb2xsKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggMWRhY2Q3Yi4uMTBhMWVhNyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTExNSw2ICsxMTUsOSBAQAogICogY29tbWFuZCBieSBBZGl0IFJhbmFkaXZlIDxhZGl0LjI2MkBnbWFpbC5jb20+CiAgKgogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNjksMTEgKzE3MiwxMyBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4JCS8qIGRvX2RpdiAqLwogCi0jZGVmaW5lIFZFUlNJT04gCSIyLjczIgorI2RlZmluZSBWRVJTSU9OCSIyLjc0IgogI2RlZmluZSBJUF9OQU1FX1NaIDMyCiAjZGVmaW5lIE1BWF9NUExTX0xBQkVMUyAxNiAvKiBUaGlzIGlzIHRoZSBtYXggbGFiZWwgc3RhY2sgZGVwdGggKi8KICNkZWZpbmUgTVBMU19TVEFDS19CT1RUT00gaHRvbmwoMHgwMDAwMDEwMCkKIAorI2RlZmluZSBmdW5jX2VudGVyKCkgcHJfZGVidWcoImVudGVyaW5nICVzXG4iLCBfX2Z1bmNfXyk7CisKIC8qIERldmljZSBmbGFnIGJpdHMgKi8KICNkZWZpbmUgRl9JUFNSQ19STkQgICAoMTw8MCkJLyogSVAtU3JjIFJhbmRvbSAgKi8KICNkZWZpbmUgRl9JUERTVF9STkQgICAoMTw8MSkJLyogSVAtRHN0IFJhbmRvbSAgKi8KQEAgLTQyNCw3ICs0MjksOCBAQAogfQogCiBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQotCSJwa3RnZW4gIiBWRVJTSU9OICI6IFBhY2tldCBHZW5lcmF0b3IgZm9yIHBhY2tldCBwZXJmb3JtYW5jZSB0ZXN0aW5nLlxuIjsKKwkiUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuICIKKwkiVmVyc2lvbjogIiBWRVJTSU9OICJcbiI7CiAKIHN0YXRpYyBpbnQgcGt0Z2VuX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIHN0cnVjdCBwa3RnZW5fZGV2ICppKTsKIHN0YXRpYyBpbnQgcGt0Z2VuX2FkZF9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIGNvbnN0IGNoYXIgKmlmbmFtZSk7CkBAIC00OTUsNyArNTAxLDcgQEAKIAkJcGt0Z2VuX3Jlc2V0X2FsbF90aHJlYWRzKCk7CiAKIAllbHNlCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBrdGdlbjogVW5rbm93biBjb21tYW5kOiAlc1xuIiwgZGF0YSk7CisJCXByX3dhcm5pbmcoIlVua25vd24gY29tbWFuZDogJXNcbiIsIGRhdGEpOwogCiAJZXJyID0gY291bnQ7CiAKQEAgLTg0MCw3ICs4NDYsNyBAQAogCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICogdXNlcl9idWZmZXIsIHNpemVfdCBjb3VudCwKIAkJCSAgICAgICBsb2ZmX3QgKiBvZmZzZXQpCiB7Ci0Jc3RydWN0IHNlcV9maWxlICpzZXEgPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gc2VxLT5wcml2YXRlOwogCWludCBpID0gMCwgbWF4LCBsZW47CiAJY2hhciBuYW1lWzE2XSwgdmFsc3RyWzMyXTsKQEAgLTg1MiwxNCArODU4LDE0IEBACiAJcGdfcmVzdWx0ID0gJihwa3RfZGV2LT5yZXN1bHRbMF0pOwogCiAJaWYgKGNvdW50IDwgMSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwa3RnZW46IHdyb25nIGNvbW1hbmQgZm9ybWF0XG4iKTsKKwkJcHJfd2FybmluZygid3JvbmcgY29tbWFuZCBmb3JtYXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAltYXggPSBjb3VudCAtIGk7CiAJdG1wID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOwogCWlmICh0bXAgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBrdGdlbjogaWxsZWdhbCBmb3JtYXRcbiIpOworCQlwcl93YXJuaW5nKCJpbGxlZ2FsIGZvcm1hdFxuIik7CiAJCXJldHVybiB0bXA7CiAJfQogCWkgKz0gdG1wOwpAQCAtOTgwLDYgKzk4NiwzNiBAQAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+ZGVsYXkpOwogCQlyZXR1cm4gY291bnQ7CiAJfQorCWlmICghc3RyY21wKG5hbWUsICJyYXRlIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworCQlpZiAobGVuIDwgMCkKKwkJCXJldHVybiBsZW47CisKKwkJaSArPSBsZW47CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gbGVuOworCQlwa3RfZGV2LT5kZWxheSA9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSo4Kk5TRUNfUEVSX1VTRUMvdmFsdWU7CisJCWlmIChkZWJ1ZykKKwkJCXByX2luZm8oIkRlbGF5IHNldCBhdDogJWxsdSBuc1xuIiwgcGt0X2Rldi0+ZGVsYXkpOworCisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHJhdGU9JWx1IiwgdmFsdWUpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJyYXRlcCIpKSB7CisJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKKwkJaWYgKGxlbiA8IDApCisJCQlyZXR1cm4gbGVuOworCisJCWkgKz0gbGVuOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGxlbjsKKwkJcGt0X2Rldi0+ZGVsYXkgPSBOU0VDX1BFUl9TRUMvdmFsdWU7CisJCWlmIChkZWJ1ZykKKwkJCXByX2luZm8oIkRlbGF5IHNldCBhdDogJWxsdSBuc1xuIiwgcGt0X2Rldi0+ZGVsYXkpOworCisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHJhdGU9JWx1IiwgdmFsdWUpOworCQlyZXR1cm4gY291bnQ7CisJfQogCWlmICghc3RyY21wKG5hbWUsICJ1ZHBfc3JjX21pbiIpKSB7CiAJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKIAkJaWYgKGxlbiA8IDApCkBAIC0xMzk4LDE4ICsxNDM0LDEyIEBACiAJCWkgKz0gbGVuOwogCiAJCWZvciAoKm0gPSAwOyAqdiAmJiBtIDwgcGt0X2Rldi0+ZHN0X21hYyArIDY7IHYrKykgewotCQkJaWYgKCp2ID49ICcwJyAmJiAqdiA8PSAnOScpIHsKLQkJCQkqbSAqPSAxNjsKLQkJCQkqbSArPSAqdiAtICcwJzsKLQkJCX0KLQkJCWlmICgqdiA+PSAnQScgJiYgKnYgPD0gJ0YnKSB7Ci0JCQkJKm0gKj0gMTY7Ci0JCQkJKm0gKz0gKnYgLSAnQScgKyAxMDsKLQkJCX0KLQkJCWlmICgqdiA+PSAnYScgJiYgKnYgPD0gJ2YnKSB7Ci0JCQkJKm0gKj0gMTY7Ci0JCQkJKm0gKz0gKnYgLSAnYScgKyAxMDsKLQkJCX0KKwkJCWludCB2YWx1ZTsKKworCQkJdmFsdWUgPSBoZXhfdG9fYmluKCp2KTsKKwkJCWlmICh2YWx1ZSA+PSAwKQorCQkJCSptID0gKm0gKiAxNiArIHZhbHVlOworCiAJCQlpZiAoKnYgPT0gJzonKSB7CiAJCQkJbSsrOwogCQkJCSptID0gMDsKQEAgLTE0NDAsMTggKzE0NzAsMTIgQEAKIAkJaSArPSBsZW47CiAKIAkJZm9yICgqbSA9IDA7ICp2ICYmIG0gPCBwa3RfZGV2LT5zcmNfbWFjICsgNjsgdisrKSB7Ci0JCQlpZiAoKnYgPj0gJzAnICYmICp2IDw9ICc5JykgewotCQkJCSptICo9IDE2OwotCQkJCSptICs9ICp2IC0gJzAnOwotCQkJfQotCQkJaWYgKCp2ID49ICdBJyAmJiAqdiA8PSAnRicpIHsKLQkJCQkqbSAqPSAxNjsKLQkJCQkqbSArPSAqdiAtICdBJyArIDEwOwotCQkJfQotCQkJaWYgKCp2ID49ICdhJyAmJiAqdiA8PSAnZicpIHsKLQkJCQkqbSAqPSAxNjsKLQkJCQkqbSArPSAqdiAtICdhJyArIDEwOwotCQkJfQorCQkJaW50IHZhbHVlOworCisJCQl2YWx1ZSA9IGhleF90b19iaW4oKnYpOworCQkJaWYgKHZhbHVlID49IDApCisJCQkJKm0gPSAqbSAqIDE2ICsgdmFsdWU7CisKIAkJCWlmICgqdiA9PSAnOicpIHsKIAkJCQltKys7CiAJCQkJKm0gPSAwOwpAQCAtMTc0MCw3ICsxNzY0LDcgQEAKIAkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIHVzZXJfYnVmZmVyLAogCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2Zmc2V0KQogewotCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHNlcS0+cHJpdmF0ZTsKIAlpbnQgaSA9IDAsIG1heCwgbGVuLCByZXQ7CiAJY2hhciBuYW1lWzQwXTsKQEAgLTE3ODEsNyArMTgwNSw3IEBACiAJCSAgICAgICBuYW1lLCAodW5zaWduZWQgbG9uZyljb3VudCk7CiAKIAlpZiAoIXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IEVSUk9SOiBObyB0aHJlYWRcbiIpOworCQlwcl9lcnIoIkVSUk9SOiBObyB0aHJlYWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xODc0LDcgKzE4OTgsNyBAQAogCWludCBpID0gMDsKIAogCW11dGV4X2xvY2soJnBrdGdlbl90aHJlYWRfbG9jayk7Ci0JcHJfZGVidWcoInBrdGdlbjogcGt0Z2VuX21hcmtfZGV2aWNlIG1hcmtpbmcgJXMgZm9yIHJlbW92YWxcbiIsIGlmbmFtZSk7CisJcHJfZGVidWcoIiVzOiBtYXJraW5nICVzIGZvciByZW1vdmFsXG4iLCBfX2Z1bmNfXywgaWZuYW1lKTsKIAogCXdoaWxlICgxKSB7CiAKQEAgLTE4ODMsMTUgKzE5MDcsMTQgQEAKIAkJCWJyZWFrOwkvKiBzdWNjZXNzICovCiAKIAkJbXV0ZXhfdW5sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwotCQlwcl9kZWJ1ZygicGt0Z2VuOiBwa3RnZW5fbWFya19kZXZpY2Ugd2FpdGluZyBmb3IgJXMgIgotCQkJCSJ0byBkaXNhcHBlYXIuLi4uXG4iLCBpZm5hbWUpOworCQlwcl9kZWJ1ZygiJXM6IHdhaXRpbmcgZm9yICVzIHRvIGRpc2FwcGVhci4uLi5cbiIsCisJCQkgX19mdW5jX18sIGlmbmFtZSk7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKG1zZWNfcGVyX3RyeSkpOwogCQltdXRleF9sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwogCiAJCWlmICgrK2kgPj0gbWF4X3RyaWVzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBrdGdlbl9tYXJrX2RldmljZTogdGltZWQgb3V0IGFmdGVyICIKLQkJCSAgICAgICAid2FpdGluZyAlZCBtc2VjIGZvciBkZXZpY2UgJXMgdG8gYmUgcmVtb3ZlZFxuIiwKLQkJCSAgICAgICBtc2VjX3Blcl90cnkgKiBpLCBpZm5hbWUpOworCQkJcHJfZXJyKCIlczogdGltZWQgb3V0IGFmdGVyIHdhaXRpbmcgJWQgbXNlYyBmb3IgZGV2aWNlICVzIHRvIGJlIHJlbW92ZWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIG1zZWNfcGVyX3RyeSAqIGksIGlmbmFtZSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xOTE4LDggKzE5NDEsOCBAQAogCQkJCQkJCSAgJnBrdGdlbl9pZl9mb3BzLAogCQkJCQkJCSAgcGt0X2Rldik7CiAJCQlpZiAoIXBrdF9kZXYtPmVudHJ5KQotCQkJCXByaW50ayhLRVJOX0VSUiAicGt0Z2VuOiBjYW4ndCBtb3ZlIHByb2MgIgotCQkJCSAgICAgICAiIGVudHJ5IGZvciAnJXMnXG4iLCBkZXYtPm5hbWUpOworCQkJCXByX2VycigiY2FuJ3QgbW92ZSBwcm9jIGVudHJ5IGZvciAnJXMnXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xOTgzLDE1ICsyMDA2LDE1IEBACiAKIAlvZGV2ID0gcGt0Z2VuX2Rldl9nZXRfYnlfbmFtZShwa3RfZGV2LCBpZm5hbWUpOwogCWlmICghb2RldikgewotCQlwcmludGsoS0VSTl9FUlIgInBrdGdlbjogbm8gc3VjaCBuZXRkZXZpY2U6IFwiJXNcIlxuIiwgaWZuYW1lKTsKKwkJcHJfZXJyKCJubyBzdWNoIG5ldGRldmljZTogXCIlc1wiXG4iLCBpZm5hbWUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAob2Rldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IG5vdCBhbiBldGhlcm5ldCBkZXZpY2U6IFwiJXNcIlxuIiwgaWZuYW1lKTsKKwkJcHJfZXJyKCJub3QgYW4gZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCJcbiIsIGlmbmFtZSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJfSBlbHNlIGlmICghbmV0aWZfcnVubmluZyhvZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgInBrdGdlbjogZGV2aWNlIGlzIGRvd246IFwiJXNcIlxuIiwgaWZuYW1lKTsKKwkJcHJfZXJyKCJkZXZpY2UgaXMgZG93bjogXCIlc1wiXG4iLCBpZm5hbWUpOwogCQllcnIgPSAtRU5FVERPV047CiAJfSBlbHNlIHsKIAkJcGt0X2Rldi0+b2RldiA9IG9kZXY7CkBAIC0yMDEwLDggKzIwMzMsNyBAQAogCWludCBudHhxOwogCiAJaWYgKCFwa3RfZGV2LT5vZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGt0Z2VuOiBFUlJPUjogcGt0X2Rldi0+b2RldiA9PSBOVUxMIGluICIKLQkJICAgICAgICJzZXR1cF9pbmplY3QuXG4iKTsKKwkJcHJfZXJyKCJFUlJPUjogcGt0X2Rldi0+b2RldiA9PSBOVUxMIGluIHNldHVwX2luamVjdFxuIik7CiAJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LAogCQkJIkVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CiAJCXJldHVybjsKQEAgLTIwMjEsMTkgKzIwNDMsMTUgQEAKIAludHhxID0gcGt0X2Rldi0+b2Rldi0+cmVhbF9udW1fdHhfcXVldWVzOwogCiAJaWYgKG50eHEgPD0gcGt0X2Rldi0+cXVldWVfbWFwX21pbikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwa3RnZW46IFdBUk5JTkc6IFJlcXVlc3RlZCAiCi0JCSAgICAgICAicXVldWVfbWFwX21pbiAoemVyby1iYXNlZCkgKCVkKSBleGNlZWRzIHZhbGlkIHJhbmdlICIKLQkJICAgICAgICJbMCAtICVkXSBmb3IgKCVkKSBxdWV1ZXMgb24gJXMsIHJlc2V0dGluZ1xuIiwKLQkJICAgICAgIHBrdF9kZXYtPnF1ZXVlX21hcF9taW4sIChudHhxID86IDEpIC0gMSwgbnR4cSwKLQkJICAgICAgIHBrdF9kZXYtPm9kZXZuYW1lKTsKKwkJcHJfd2FybmluZygiV0FSTklORzogUmVxdWVzdGVkIHF1ZXVlX21hcF9taW4gKHplcm8tYmFzZWQpICglZCkgZXhjZWVkcyB2YWxpZCByYW5nZSBbMCAtICVkXSBmb3IgKCVkKSBxdWV1ZXMgb24gJXMsIHJlc2V0dGluZ1xuIiwKKwkJCSAgIHBrdF9kZXYtPnF1ZXVlX21hcF9taW4sIChudHhxID86IDEpIC0gMSwgbnR4cSwKKwkJCSAgIHBrdF9kZXYtPm9kZXZuYW1lKTsKIAkJcGt0X2Rldi0+cXVldWVfbWFwX21pbiA9IG50eHEgLSAxOwogCX0KIAlpZiAocGt0X2Rldi0+cXVldWVfbWFwX21heCA+PSBudHhxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBrdGdlbjogV0FSTklORzogUmVxdWVzdGVkICIKLQkJICAgICAgICJxdWV1ZV9tYXBfbWF4ICh6ZXJvLWJhc2VkKSAoJWQpIGV4Y2VlZHMgdmFsaWQgcmFuZ2UgIgotCQkgICAgICAgIlswIC0gJWRdIGZvciAoJWQpIHF1ZXVlcyBvbiAlcywgcmVzZXR0aW5nXG4iLAotCQkgICAgICAgcGt0X2Rldi0+cXVldWVfbWFwX21heCwgKG50eHEgPzogMSkgLSAxLCBudHhxLAotCQkgICAgICAgcGt0X2Rldi0+b2Rldm5hbWUpOworCQlwcl93YXJuaW5nKCJXQVJOSU5HOiBSZXF1ZXN0ZWQgcXVldWVfbWFwX21heCAoemVyby1iYXNlZCkgKCVkKSBleGNlZWRzIHZhbGlkIHJhbmdlIFswIC0gJWRdIGZvciAoJWQpIHF1ZXVlcyBvbiAlcywgcmVzZXR0aW5nXG4iLAorCQkJICAgcGt0X2Rldi0+cXVldWVfbWFwX21heCwgKG50eHEgPzogMSkgLSAxLCBudHhxLAorCQkJICAgcGt0X2Rldi0+b2Rldm5hbWUpOwogCQlwa3RfZGV2LT5xdWV1ZV9tYXBfbWF4ID0gbnR4cSAtIDE7CiAJfQogCkBAIC0yMDkzLDggKzIxMTEsNyBAQAogCQkJfQogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlpZiAoZXJyKQotCQkJCXByaW50ayhLRVJOX0VSUiAicGt0Z2VuOiBFUlJPUjogSVB2NiBsaW5rICIKLQkJCQkgICAgICAgImFkZHJlc3Mgbm90IGF2YWlsYmxlLlxuIik7CisJCQkJcHJfZXJyKCJFUlJPUjogSVB2NiBsaW5rIGFkZHJlc3Mgbm90IGF2YWlsYWJsZVxuIik7CiAJCX0KICNlbmRpZgogCX0gZWxzZSB7CkBAIC0yMTQyLDE1ICsyMTU5LDE1IEBACiAJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0LnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9BQlMpOwogCWhydGltZXJfc2V0X2V4cGlyZXMoJnQudGltZXIsIHNwaW5fdW50aWwpOwogCi0JcmVtYWluaW5nID0ga3RpbWVfdG9fdXMoaHJ0aW1lcl9leHBpcmVzX3JlbWFpbmluZygmdC50aW1lcikpOworCXJlbWFpbmluZyA9IGt0aW1lX3RvX25zKGhydGltZXJfZXhwaXJlc19yZW1haW5pbmcoJnQudGltZXIpKTsKIAlpZiAocmVtYWluaW5nIDw9IDApIHsKIAkJcGt0X2Rldi0+bmV4dF90eCA9IGt0aW1lX2FkZF9ucyhzcGluX3VudGlsLCBwa3RfZGV2LT5kZWxheSk7CiAJCXJldHVybjsKIAl9CiAKIAlzdGFydF90aW1lID0ga3RpbWVfbm93KCk7Ci0JaWYgKHJlbWFpbmluZyA8IDEwMCkKLQkJdWRlbGF5KHJlbWFpbmluZyk7IAkvKiByZWFsbHkgc21hbGwganVzdCBzcGluICovCisJaWYgKHJlbWFpbmluZyA8IDEwMDAwMCkKKwkJbmRlbGF5KHJlbWFpbmluZyk7CS8qIHJlYWxseSBzbWFsbCBqdXN0IHNwaW4gKi8KIAllbHNlIHsKIAkJLyogc2VlIGRvX25hbm9zbGVlcCAqLwogCQlocnRpbWVyX2luaXRfc2xlZXBlcigmdCwgY3VycmVudCk7CkBAIC0yNTI4LDggKzI1NDUsOCBAQAogCQkJaWYgKG5oZWFkID4gMCkgewogCQkJCXJldCA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCBuaGVhZCwgMCwgR0ZQX0FUT01JQyk7CiAJCQkJaWYgKHJldCA8IDApIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBleHBhbmRpbmcgIgotCQkJCQkgICAgICAgImlwc2VjIHBhY2tldCAlZFxuIiwgcmV0KTsKKwkJCQkJcHJfZXJyKCJFcnJvciBleHBhbmRpbmcgaXBzZWMgcGFja2V0ICVkXG4iLAorCQkJCQkgICAgICAgcmV0KTsKIAkJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJfQpAQCAtMjUzOCw4ICsyNTU1LDcgQEAKIAkJCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwogCQkJcmV0ID0gcGt0Z2VuX291dHB1dF9pcHNlYyhza2IsIHBrdF9kZXYpOwogCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgY3JlYXRpbmcgaXBzZWMgIgotCQkJCSAgICAgICAicGFja2V0ICVkXG4iLCByZXQpOworCQkJCXByX2VycigiRXJyb3IgY3JlYXRpbmcgaXBzZWMgcGFja2V0ICVkXG4iLCByZXQpOwogCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJLyogcmVzdG9yZSBsbCAqLwpAQCAtMzAxNSw4ICszMDMxLDcgQEAKIAlpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcikpIHsKIAkJZGF0YWxlbiA9IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcik7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJwa3RnZW46IGluY3JlYXNlZCBkYXRhbGVuIHRvICVkXG4iLAotCQkJICAgICAgIGRhdGFsZW4pOworCQkJcHJfaW5mbygiaW5jcmVhc2VkIGRhdGFsZW4gdG8gJWRcbiIsIGRhdGFsZW4pOwogCX0KIAogCXVkcGgtPnNvdXJjZSA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKQEAgLTMxNDMsNyArMzE1OCw3IEBACiAJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7CiAJaW50IHN0YXJ0ZWQgPSAwOwogCi0JcHJfZGVidWcoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bi4gJXBcbiIsIHQpOworCWZ1bmNfZW50ZXIoKTsKIAogCWlmX2xvY2sodCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwa3RfZGV2LCAmdC0+aWZfbGlzdCwgbGlzdCkgewpAQCAtMzE3Niw3ICszMTkxLDcgQEAKIHsKIAlzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdDsKIAotCXByX2RlYnVnKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcy5cbiIpOworCWZ1bmNfZW50ZXIoKTsKIAogCW11dGV4X2xvY2soJnBrdGdlbl90aHJlYWRfbG9jayk7CiAKQEAgLTMyNDEsNyArMzI1Niw3IEBACiB7CiAJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CiAKLQlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuX2FsbF90aHJlYWRzLlxuIik7CisJZnVuY19lbnRlcigpOwogCiAJbXV0ZXhfbG9jaygmcGt0Z2VuX3RocmVhZF9sb2NrKTsKIApAQCAtMzI2MCw3ICszMjc1LDcgQEAKIHsKIAlzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdDsKIAotCXByX2RlYnVnKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9yZXNldF9hbGxfdGhyZWFkcy5cbiIpOworCWZ1bmNfZW50ZXIoKTsKIAogCW11dGV4X2xvY2soJnBrdGdlbl90aHJlYWRfbG9jayk7CiAKQEAgLTMzMTAsOCArMzMyNSw4IEBACiAJaW50IG5yX2ZyYWdzID0gcGt0X2Rldi0+c2tiID8gc2tiX3NoaW5mbyhwa3RfZGV2LT5za2IpLT5ucl9mcmFncyA6IC0xOwogCiAJaWYgKCFwa3RfZGV2LT5ydW5uaW5nKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBrdGdlbjogaW50ZXJmYWNlOiAlcyBpcyBhbHJlYWR5ICIKLQkJICAgICAgICJzdG9wcGVkXG4iLCBwa3RfZGV2LT5vZGV2bmFtZSk7CisJCXByX3dhcm5pbmcoImludGVyZmFjZTogJXMgaXMgYWxyZWFkeSBzdG9wcGVkXG4iLAorCQkJICAgcGt0X2Rldi0+b2Rldm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMzNDcsNyArMzM2Miw3IEBACiB7CiAJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7CiAKLQlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fc3RvcFxuIik7CisJZnVuY19lbnRlcigpOwogCiAJaWZfbG9jayh0KTsKIApAQCAtMzM2Nyw3ICszMzgyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxLCAqbjsKIAlzdHJ1Y3QgcGt0Z2VuX2RldiAqY3VyOwogCi0JcHJfZGVidWcoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3JlbV9vbmVfaWZcbiIpOworCWZ1bmNfZW50ZXIoKTsKIAogCWlmX2xvY2sodCk7CiAKQEAgLTMzOTMsOSArMzQwOCwxMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnEsICpuOwogCXN0cnVjdCBwa3RnZW5fZGV2ICpjdXI7CiAKKwlmdW5jX2VudGVyKCk7CisKIAkvKiBSZW1vdmUgYWxsIGRldmljZXMsIGZyZWUgbWVtICovCiAKLQlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcmVtX2FsbF9pZnNcbiIpOwogCWlmX2xvY2sodCk7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocSwgbiwgJnQtPmlmX2xpc3QpIHsKQEAgLTM0NzcsOCArMzQ5Myw3IEBACiAKIAkJcGt0X2Rldi0+c2tiID0gZmlsbF9wYWNrZXQob2RldiwgcGt0X2Rldik7CiAJCWlmIChwa3RfZGV2LT5za2IgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IEVSUk9SOiBjb3VsZG4ndCAiCi0JCQkgICAgICAgImFsbG9jYXRlIHNrYiBpbiBmaWxsX3BhY2tldC5cbiIpOworCQkJcHJfZXJyKCJFUlJPUjogY291bGRuJ3QgYWxsb2NhdGUgc2tiIGluIGZpbGxfcGFja2V0XG4iKTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlwa3RfZGV2LT5jbG9uZV9jb3VudC0tOwkvKiBiYWNrIG91dCBpbmNyZW1lbnQsIE9PTSAqLwogCQkJcmV0dXJuOwpAQCAtMzU1OCw4ICszNTczLDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0LT5xdWV1ZSk7CiAJY29tcGxldGUoJnQtPnN0YXJ0X2RvbmUpOwogCi0JcHJfZGVidWcoInBrdGdlbjogc3RhcnRpbmcgcGt0Z2VuLyVkOiAgcGlkPSVkXG4iLAotCQkgY3B1LCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJcHJfZGVidWcoInN0YXJ0aW5nIHBrdGdlbi8lZDogIHBpZD0lZFxuIiwgY3B1LCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCkBAIC0zNjEyLDEzICszNjI2LDEzIEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQogCi0JcHJfZGVidWcoInBrdGdlbjogJXMgc3RvcHBpbmcgYWxsIGRldmljZVxuIiwgdC0+dHNrLT5jb21tKTsKKwlwcl9kZWJ1ZygiJXMgc3RvcHBpbmcgYWxsIGRldmljZVxuIiwgdC0+dHNrLT5jb21tKTsKIAlwa3RnZW5fc3RvcCh0KTsKIAotCXByX2RlYnVnKCJwa3RnZW46ICVzIHJlbW92aW5nIGFsbCBkZXZpY2VcbiIsIHQtPnRzay0+Y29tbSk7CisJcHJfZGVidWcoIiVzIHJlbW92aW5nIGFsbCBkZXZpY2VcbiIsIHQtPnRzay0+Y29tbSk7CiAJcGt0Z2VuX3JlbV9hbGxfaWZzKHQpOwogCi0JcHJfZGVidWcoInBrdGdlbjogJXMgcmVtb3ZpbmcgdGhyZWFkLlxuIiwgdC0+dHNrLT5jb21tKTsKKwlwcl9kZWJ1ZygiJXMgcmVtb3ZpbmcgdGhyZWFkXG4iLCB0LT50c2stPmNvbW0pOwogCXBrdGdlbl9yZW1fdGhyZWFkKHQpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjQyLDcgKzM2NTYsNyBAQAogCQl9CiAKIAlpZl91bmxvY2sodCk7Ci0JcHJfZGVidWcoInBrdGdlbjogZmluZF9kZXYoJXMpIHJldHVybmluZyAlcFxuIiwgaWZuYW1lLCBwa3RfZGV2KTsKKwlwcl9kZWJ1ZygiZmluZF9kZXYoJXMpIHJldHVybmluZyAlcFxuIiwgaWZuYW1lLCBwa3RfZGV2KTsKIAlyZXR1cm4gcGt0X2RldjsKIH0KIApAQCAtMzY1OCw4ICszNjcyLDcgQEAKIAlpZl9sb2NrKHQpOwogCiAJaWYgKHBrdF9kZXYtPnBnX3RocmVhZCkgewotCQlwcmludGsoS0VSTl9FUlIgInBrdGdlbjogRVJST1I6IGFscmVhZHkgYXNzaWduZWQgIgotCQkgICAgICAgInRvIGEgdGhyZWFkLlxuIik7CisJCXByX2VycigiRVJST1I6IGFscmVhZHkgYXNzaWduZWQgdG8gYSB0aHJlYWRcbiIpOwogCQlydiA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzY4NSw3ICszNjk4LDcgQEAKIAogCXBrdF9kZXYgPSBfX3BrdGdlbl9OTl90aHJlYWRzKGlmbmFtZSwgRklORCk7CiAJaWYgKHBrdF9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IEVSUk9SOiBpbnRlcmZhY2UgYWxyZWFkeSB1c2VkLlxuIik7CisJCXByX2VycigiRVJST1I6IGludGVyZmFjZSBhbHJlYWR5IHVzZWRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMzczMCw3ICszNzQzLDcgQEAKIAlwa3RfZGV2LT5lbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoaWZuYW1lLCAwNjAwLCBwZ19wcm9jX2RpciwKIAkJCQkJICAmcGt0Z2VuX2lmX2ZvcHMsIHBrdF9kZXYpOwogCWlmICghcGt0X2Rldi0+ZW50cnkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMvJXMgcHJvY2ZzIGVudHJ5LlxuIiwKKwkJcHJfZXJyKCJjYW5ub3QgY3JlYXRlICVzLyVzIHByb2NmcyBlbnRyeVxuIiwKIAkJICAgICAgIFBHX1BST0NfRElSLCBpZm5hbWUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDI7CkBAIC0zNzYxLDggKzM3NzQsNyBAQAogCXQgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBwa3RnZW5fdGhyZWFkKSwgR0ZQX0tFUk5FTCwKIAkJCSBjcHVfdG9fbm9kZShjcHUpKTsKIAlpZiAoIXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IEVSUk9SOiBvdXQgb2YgbWVtb3J5LCBjYW4ndCAiCi0JCSAgICAgICAiY3JlYXRlIG5ldyB0aHJlYWQuXG4iKTsKKwkJcHJfZXJyKCJFUlJPUjogb3V0IG9mIG1lbW9yeSwgY2FuJ3QgY3JlYXRlIG5ldyB0aHJlYWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTM3NzYsOCArMzc4OCw3IEBACiAKIAlwID0ga3RocmVhZF9jcmVhdGUocGt0Z2VuX3RocmVhZF93b3JrZXIsIHQsICJrcGt0Z2VuZF8lZCIsIGNwdSk7CiAJaWYgKElTX0VSUihwKSkgewotCQlwcmludGsoS0VSTl9FUlIgInBrdGdlbjoga2VybmVsX3RocmVhZCgpIGZhaWxlZCAiCi0JCSAgICAgICAiZm9yIGNwdSAlZFxuIiwgdC0+Y3B1KTsKKwkJcHJfZXJyKCJrZXJuZWxfdGhyZWFkKCkgZmFpbGVkIGZvciBjcHUgJWRcbiIsIHQtPmNwdSk7CiAJCWxpc3RfZGVsKCZ0LT50aF9saXN0KTsKIAkJa2ZyZWUodCk7CiAJCXJldHVybiBQVFJfRVJSKHApOwpAQCAtMzc4OCw3ICszNzk5LDcgQEAKIAlwZSA9IHByb2NfY3JlYXRlX2RhdGEodC0+dHNrLT5jb21tLCAwNjAwLCBwZ19wcm9jX2RpciwKIAkJCSAgICAgICZwa3RnZW5fdGhyZWFkX2ZvcHMsIHQpOwogCWlmICghcGUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMvJXMgcHJvY2ZzIGVudHJ5LlxuIiwKKwkJcHJfZXJyKCJjYW5ub3QgY3JlYXRlICVzLyVzIHByb2NmcyBlbnRyeVxuIiwKIAkJICAgICAgIFBHX1BST0NfRElSLCB0LT50c2stPmNvbW0pOwogCQlrdGhyZWFkX3N0b3AocCk7CiAJCWxpc3RfZGVsKCZ0LT50aF9saXN0KTsKQEAgLTM4MjIsMTEgKzM4MzMsMTAgQEAKIAkJCQlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKIAotCXByX2RlYnVnKCJwa3RnZW46IHJlbW92ZV9kZXZpY2UgcGt0X2Rldj0lcFxuIiwgcGt0X2Rldik7CisJcHJfZGVidWcoInJlbW92ZV9kZXZpY2UgcGt0X2Rldj0lcFxuIiwgcGt0X2Rldik7CiAKIAlpZiAocGt0X2Rldi0+cnVubmluZykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwa3RnZW46IFdBUk5JTkc6IHRyeWluZyB0byByZW1vdmUgYSAiCi0JCSAgICAgICAicnVubmluZyBpbnRlcmZhY2UsIHN0b3BwaW5nIGl0IG5vdy5cbiIpOworCQlwcl93YXJuaW5nKCJXQVJOSU5HOiB0cnlpbmcgdG8gcmVtb3ZlIGEgcnVubmluZyBpbnRlcmZhY2UsIHN0b3BwaW5nIGl0IG5vd1xuIik7CiAJCXBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKIAl9CiAKQEAgLTM4NTcsNyArMzg2Nyw3IEBACiAJaW50IGNwdTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBlOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKwlwcl9pbmZvKCIlcyIsIHZlcnNpb24pOwogCiAJcGdfcHJvY19kaXIgPSBwcm9jX21rZGlyKFBHX1BST0NfRElSLCBpbml0X25ldC5wcm9jX25ldCk7CiAJaWYgKCFwZ19wcm9jX2RpcikKQEAgLTM4NjUsOCArMzg3NSw3IEBACiAKIAlwZSA9IHByb2NfY3JlYXRlKFBHQ1RSTCwgMDYwMCwgcGdfcHJvY19kaXIsICZwa3RnZW5fZm9wcyk7CiAJaWYgKHBlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IEVSUk9SOiBjYW5ub3QgY3JlYXRlICVzICIKLQkJICAgICAgICJwcm9jZnMgZW50cnkuXG4iLCBQR0NUUkwpOworCQlwcl9lcnIoIkVSUk9SOiBjYW5ub3QgY3JlYXRlICVzIHByb2NmcyBlbnRyeVxuIiwgUEdDVFJMKTsKIAkJcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgUEdfUFJPQ19ESVIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0zODc5LDEzICszODg4LDEyIEBACiAKIAkJZXJyID0gcGt0Z2VuX2NyZWF0ZV90aHJlYWQoY3B1KTsKIAkJaWYgKGVycikKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBrdGdlbjogV0FSTklORzogQ2Fubm90IGNyZWF0ZSAiCi0JCQkgICAgICAgInRocmVhZCBmb3IgY3B1ICVkICglZClcbiIsIGNwdSwgZXJyKTsKKwkJCXByX3dhcm5pbmcoIldBUk5JTkc6IENhbm5vdCBjcmVhdGUgdGhyZWFkIGZvciBjcHUgJWQgKCVkKVxuIiwKKwkJCQkgICBjcHUsIGVycik7CiAJfQogCiAJaWYgKGxpc3RfZW1wdHkoJnBrdGdlbl90aHJlYWRzKSkgewotCQlwcmludGsoS0VSTl9FUlIgInBrdGdlbjogRVJST1I6IEluaXRpYWxpemF0aW9uIGZhaWxlZCBmb3IgIgotCQkgICAgICAgImFsbCB0aHJlYWRzXG4iKTsKKwkJcHJfZXJyKCJFUlJPUjogSW5pdGlhbGl6YXRpb24gZmFpbGVkIGZvciBhbGwgdGhyZWFkc1xuIik7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwa3RnZW5fbm90aWZpZXJfYmxvY2spOwogCQlyZW1vdmVfcHJvY19lbnRyeShQR0NUUkwsIHBnX3Byb2NfZGlyKTsKIAkJcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgUEdfUFJPQ19ESVIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCAxYTJhZjI0Li5mNzhkODIxIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlfcnRubF9saW5rX3N0YXRzKHN0cnVjdCBydG5sX2xpbmtfc3RhdHMgKmEsCi0JCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpiKQorCQkJCSBjb25zdCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmIpCiB7CiAJYS0+cnhfcGFja2V0cyA9IGItPnJ4X3BhY2tldHM7CiAJYS0+dHhfcGFja2V0cyA9IGItPnR4X3BhY2tldHM7CkBAIC02MTAsNyArNjEwLDcgQEAKIAlhLT50eF9jb21wcmVzc2VkID0gYi0+dHhfY29tcHJlc3NlZDsKIH0KIAotc3RhdGljIHZvaWQgY29weV9ydG5sX2xpbmtfc3RhdHM2NCh2b2lkICp2LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYikKK3N0YXRpYyB2b2lkIGNvcHlfcnRubF9saW5rX3N0YXRzNjQodm9pZCAqdiwgY29uc3Qgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpiKQogewogCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCBhOwogCkBAIC02ODYsNyArNjg2LDcgQEAKIAkJcmV0dXJuIHBvcnRfc2VsZl9zaXplOwogfQogCi1zdGF0aWMgaW5saW5lIHNpemVfdCBpZl9ubG1zZ19zaXplKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgbm9pbmxpbmUgc2l6ZV90IGlmX25sbXNnX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKQogCSAgICAgICArIG5sYV90b3RhbF9zaXplKElGTkFNU0laKSAvKiBJRkxBX0lGTkFNRSAqLwpAQCAtNzkxLDcgKzc5MSw4IEBACiB7CiAJc3RydWN0IGlmaW5mb21zZyAqaWZtOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKKwljb25zdCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzOwogCXN0cnVjdCBubGF0dHIgKmF0dHI7CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCppZm0pLCBmbGFncyk7CkBAIC04NDcsNyArODQ4LDcgQEAKIAlpZiAoYXR0ciA9PSBOVUxMKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCXN0YXRzID0gZGV2X2dldF9zdGF0cyhkZXYpOworCXN0YXRzID0gZGV2X2dldF9zdGF0cyhkZXYsICZ0ZW1wKTsKIAljb3B5X3J0bmxfbGlua19zdGF0cyhubGFfZGF0YShhdHRyKSwgc3RhdHMpOwogCiAJYXR0ciA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9TVEFUUzY0LApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2NtLmMgYi9uZXQvY29yZS9zY20uYwppbmRleCBiODhmNmY5Li40MTNjYWI4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9zY20uYworKysgYi9uZXQvY29yZS9zY20uYwpAQCAtMTMwLDYgKzEzMCw3IEBACiAJCX0KIAl9CiB9CitFWFBPUlRfU1lNQk9MKF9fc2NtX2Rlc3Ryb3kpOwogCiBpbnQgX19zY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpwKQogewpAQCAtMTcwLDYgKzE3MSwzMCBAQAogCQkJZXJyID0gc2NtX2NoZWNrX2NyZWRzKCZwLT5jcmVkcyk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyb3I7CisKKwkJCWlmIChwaWRfdm5yKHAtPnBpZCkgIT0gcC0+Y3JlZHMucGlkKSB7CisJCQkJc3RydWN0IHBpZCAqcGlkOworCQkJCWVyciA9IC1FU1JDSDsKKwkJCQlwaWQgPSBmaW5kX2dldF9waWQocC0+Y3JlZHMucGlkKTsKKwkJCQlpZiAoIXBpZCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlwdXRfcGlkKHAtPnBpZCk7CisJCQkJcC0+cGlkID0gcGlkOworCQkJfQorCisJCQlpZiAoKHAtPmNyZWQtPmV1aWQgIT0gcC0+Y3JlZHMudWlkKSB8fAorCQkJCShwLT5jcmVkLT5lZ2lkICE9IHAtPmNyZWRzLmdpZCkpIHsKKwkJCQlzdHJ1Y3QgY3JlZCAqY3JlZDsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWNyZWQgPSBwcmVwYXJlX2NyZWRzKCk7CisJCQkJaWYgKCFjcmVkKQorCQkJCQlnb3RvIGVycm9yOworCisJCQkJY3JlZC0+dWlkID0gY3JlZC0+ZXVpZCA9IHAtPmNyZWRzLnVpZDsKKwkJCQljcmVkLT5naWQgPSBjcmVkLT5lZ2lkID0gcC0+Y3JlZHMudWlkOworCQkJCXB1dF9jcmVkKHAtPmNyZWQpOworCQkJCXAtPmNyZWQgPSBjcmVkOworCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlnb3RvIGVycm9yOwpAQCAtMTg3LDYgKzIxMiw3IEBACiAJc2NtX2Rlc3Ryb3kocCk7CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0woX19zY21fc2VuZCk7CiAKIGludCBwdXRfY21zZyhzdHJ1Y3QgbXNnaGRyICogbXNnLCBpbnQgbGV2ZWwsIGludCB0eXBlLCBpbnQgbGVuLCB2b2lkICpkYXRhKQogewpAQCAtMjI1LDYgKzI1MSw3IEBACiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0wocHV0X2Ntc2cpOwogCiB2b2lkIHNjbV9kZXRhY2hfZmRzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSkKIHsKQEAgLTI5NCw2ICszMjEsNyBAQAogCSAqLwogCV9fc2NtX2Rlc3Ryb3koc2NtKTsKIH0KK0VYUE9SVF9TWU1CT0woc2NtX2RldGFjaF9mZHMpOwogCiBzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKnNjbV9mcF9kdXAoc3RydWN0IHNjbV9mcF9saXN0ICpmcGwpCiB7CkBAIC0zMTEsOSArMzM5LDQgQEAKIAl9CiAJcmV0dXJuIG5ld19mcGw7CiB9Ci0KLUVYUE9SVF9TWU1CT0woX19zY21fZGVzdHJveSk7Ci1FWFBPUlRfU1lNQk9MKF9fc2NtX3NlbmQpOwotRVhQT1JUX1NZTUJPTChwdXRfY21zZyk7Ci1FWFBPUlRfU1lNQk9MKHNjbV9kZXRhY2hfZmRzKTsKIEVYUE9SVF9TWU1CT0woc2NtX2ZwX2R1cCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDM0NDMyYjQuLjNhMjUxM2YgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC04MTcsNyArODE3LDcgQEAKIAltZW1jcHkoZGF0YSArIG5oZWFkLCBza2ItPmhlYWQsIHNrYi0+dGFpbCAtIHNrYi0+aGVhZCk7CiAjZW5kaWYKIAltZW1jcHkoZGF0YSArIHNpemUsIHNrYl9lbmRfcG9pbnRlcihza2IpLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpOworCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvLCBmcmFnc1tza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzXSkpOwogCiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykKIAkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKQEAgLTg0Myw3ICs4NDMsOSBAQAogCXNrYi0+bmV0d29ya19oZWFkZXIgICArPSBvZmY7CiAJaWYgKHNrYl9tYWNfaGVhZGVyX3dhc19zZXQoc2tiKSkKIAkJc2tiLT5tYWNfaGVhZGVyICs9IG9mZjsKLQlza2ItPmNzdW1fc3RhcnQgICAgICAgKz0gbmhlYWQ7CisJLyogT25seSBhZGp1c3QgdGhpcyBpZiBpdCBhY3R1YWxseSBpcyBjc3VtX3N0YXJ0IHJhdGhlciB0aGFuIGNzdW0gKi8KKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJc2tiLT5jc3VtX3N0YXJ0ICs9IG5oZWFkOwogCXNrYi0+Y2xvbmVkICAgPSAwOwogCXNrYi0+aGRyX2xlbiAgPSAwOwogCXNrYi0+bm9oZHIgICAgPSAwOwpAQCAtOTMwLDcgKzkzMiw4IEBACiAJY29weV9za2JfaGVhZGVyKG4sIHNrYik7CiAKIAlvZmYgICAgICAgICAgICAgICAgICA9IG5ld2hlYWRyb29tIC0gb2xkaGVhZHJvb207Ci0Jbi0+Y3N1bV9zdGFydCAgICAgICArPSBvZmY7CisJaWYgKG4tPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQluLT5jc3VtX3N0YXJ0ICs9IG9mZjsKICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKIAluLT50cmFuc3BvcnRfaGVhZGVyICs9IG9mZjsKIAluLT5uZXR3b3JrX2hlYWRlciAgICs9IG9mZjsKQEAgLTI0ODMsNyArMjQ4Niw2IEBACiAJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc2tiLT5kYXRhLCBsZW4pOwogCXJldHVybiBza2ItPmRhdGEgKz0gbGVuOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChza2JfcHVsbF9yY3N1bSk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IDJjZjdmOWYuLmIwNWI5YjYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTExMCw2ICsxMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTU2LDcgKzE1Nyw3IEBACiAgICJza19sb2NrLTI3IiAgICAgICAsICJza19sb2NrLTI4IiAgICAgICAgICAsICJza19sb2NrLUFGX0NBTiIgICAgICAsCiAgICJza19sb2NrLUFGX1RJUEMiICAsICJza19sb2NrLUFGX0JMVUVUT09USCIsICJza19sb2NrLUlVQ1YiICAgICAgICAsCiAgICJza19sb2NrLUFGX1JYUlBDIiAsICJza19sb2NrLUFGX0lTRE4iICAgICAsICJza19sb2NrLUFGX1BIT05FVCIgICAsCi0gICJza19sb2NrLUFGX0lFRUU4MDIxNTQiLAorICAic2tfbG9jay1BRl9JRUVFODAyMTU0IiwgInNrX2xvY2stQUZfQ0FJRiIgLAogICAic2tfbG9jay1BRl9NQVgiCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFmX2ZhbWlseV9zbG9ja19rZXlfc3RyaW5nc1tBRl9NQVgrMV0gPSB7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgInNsb2NrLTI3IiAgICAgICAsICJzbG9jay0yOCIgICAgICAgICAgLCAic2xvY2stQUZfQ0FOIiAgICAgICwKICAgInNsb2NrLUFGX1RJUEMiICAsICJzbG9jay1BRl9CTFVFVE9PVEgiLCAic2xvY2stQUZfSVVDViIgICAgICwKICAgInNsb2NrLUFGX1JYUlBDIiAsICJzbG9jay1BRl9JU0ROIiAgICAgLCAic2xvY2stQUZfUEhPTkVUIiAgICwKLSAgInNsb2NrLUFGX0lFRUU4MDIxNTQiLAorICAic2xvY2stQUZfSUVFRTgwMjE1NCIsICJzbG9jay1BRl9DQUlGIiAsCiAgICJzbG9jay1BRl9NQVgiCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFmX2ZhbWlseV9jbG9ja19rZXlfc3RyaW5nc1tBRl9NQVgrMV0gPSB7CkBAIC0xODgsNyArMTg5LDcgQEAKICAgImNsb2NrLTI3IiAgICAgICAsICJjbG9jay0yOCIgICAgICAgICAgLCAiY2xvY2stQUZfQ0FOIiAgICAgICwKICAgImNsb2NrLUFGX1RJUEMiICAsICJjbG9jay1BRl9CTFVFVE9PVEgiLCAiY2xvY2stQUZfSVVDViIgICAgICwKICAgImNsb2NrLUFGX1JYUlBDIiAsICJjbG9jay1BRl9JU0ROIiAgICAgLCAiY2xvY2stQUZfUEhPTkVUIiAgICwKLSAgImNsb2NrLUFGX0lFRUU4MDIxNTQiLAorICAiY2xvY2stQUZfSUVFRTgwMjE1NCIsICJjbG9jay1BRl9DQUlGIiAsCiAgICJjbG9jay1BRl9NQVgiCiB9OwogCkBAIC03NDksNiArNzUwLDIwIEBACiBFWFBPUlRfU1lNQk9MKHNvY2tfc2V0c29ja29wdCk7CiAKIAordm9pZCBjcmVkX3RvX3VjcmVkKHN0cnVjdCBwaWQgKnBpZCwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCisJCSAgIHN0cnVjdCB1Y3JlZCAqdWNyZWQpCit7CisJdWNyZWQtPnBpZCA9IHBpZF92bnIocGlkKTsKKwl1Y3JlZC0+dWlkID0gdWNyZWQtPmdpZCA9IC0xOworCWlmIChjcmVkKSB7CisJCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY3VycmVudF9ucyA9IGN1cnJlbnRfdXNlcl9ucygpOworCisJCXVjcmVkLT51aWQgPSB1c2VyX25zX21hcF91aWQoY3VycmVudF9ucywgY3JlZCwgY3JlZC0+ZXVpZCk7CisJCXVjcmVkLT5naWQgPSB1c2VyX25zX21hcF9naWQoY3VycmVudF9ucywgY3JlZCwgY3JlZC0+ZWdpZCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoY3JlZF90b191Y3JlZCk7CisKIGludCBzb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKQEAgLTkwMSwxMSArOTE2LDE1IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTT19QRUVSQ1JFRDoKLQkJaWYgKGxlbiA+IHNpemVvZihzay0+c2tfcGVlcmNyZWQpKQotCQkJbGVuID0gc2l6ZW9mKHNrLT5za19wZWVyY3JlZCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmc2stPnNrX3BlZXJjcmVkLCBsZW4pKQorCXsKKwkJc3RydWN0IHVjcmVkIHBlZXJjcmVkOworCQlpZiAobGVuID4gc2l6ZW9mKHBlZXJjcmVkKSkKKwkJCWxlbiA9IHNpemVvZihwZWVyY3JlZCk7CisJCWNyZWRfdG9fdWNyZWQoc2stPnNrX3BlZXJfcGlkLCBzay0+c2tfcGVlcl9jcmVkLCAmcGVlcmNyZWQpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnBlZXJjcmVkLCBsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWdvdG8gbGVub3V0OworCX0KIAogCWNhc2UgU09fUEVFUk5BTUU6CiAJewpAQCAtMTExOSw2ICsxMTM4LDkgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvcHRtZW0gbGVha2FnZSAoJWQgYnl0ZXMpIGRldGVjdGVkLlxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBhdG9taWNfcmVhZCgmc2stPnNrX29tZW1fYWxsb2MpKTsKIAorCWlmIChzay0+c2tfcGVlcl9jcmVkKQorCQlwdXRfY3JlZChzay0+c2tfcGVlcl9jcmVkKTsKKwlwdXRfcGlkKHNrLT5za19wZWVyX3BpZCk7CiAJcHV0X25ldChzb2NrX25ldChzaykpOwogCXNrX3Byb3RfZnJlZShzay0+c2tfcHJvdF9jcmVhdG9yLCBzayk7CiB9CkBAIC0xMzE3LDkgKzEzMzksMTAgQEAKIHZvaWQgc29ja19yZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+dHJ1ZXNpemU7CiAKLQlhdG9taWNfc3ViKHNrYi0+dHJ1ZXNpemUsICZzay0+c2tfcm1lbV9hbGxvYyk7Ci0Jc2tfbWVtX3VuY2hhcmdlKHNrYi0+c2ssIHNrYi0+dHJ1ZXNpemUpOworCWF0b21pY19zdWIobGVuLCAmc2stPnNrX3JtZW1fYWxsb2MpOworCXNrX21lbV91bmNoYXJnZShzaywgbGVuKTsKIH0KIEVYUE9SVF9TWU1CT0woc29ja19yZnJlZSk7CiAKQEAgLTE5NTQsOSArMTk3Nyw4IEBACiAJc2stPnNrX3NuZG1zZ19wYWdlCT0JTlVMTDsKIAlzay0+c2tfc25kbXNnX29mZgk9CTA7CiAKLQlzay0+c2tfcGVlcmNyZWQucGlkIAk9CTA7Ci0Jc2stPnNrX3BlZXJjcmVkLnVpZAk9CS0xOwotCXNrLT5za19wZWVyY3JlZC5naWQJPQktMTsKKwlzay0+c2tfcGVlcl9waWQgCT0JTlVMTDsKKwlzay0+c2tfcGVlcl9jcmVkCT0JTlVMTDsKIAlzay0+c2tfd3JpdGVfcGVuZGluZwk9CTA7CiAJc2stPnNrX3Jjdmxvd2F0CQk9CTE7CiAJc2stPnNrX3JjdnRpbWVvCQk9CU1BWF9TQ0hFRFVMRV9USU1FT1VUOwpAQCAtMjIxMCw4ICsyMjMyLDcgQEAKICNpZmRlZiBDT05GSUdfTkVUX05TCiB2b2lkIHNvY2tfcHJvdF9pbnVzZV9hZGQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgcHJvdG8gKnByb3QsIGludCB2YWwpCiB7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlwZXJfY3B1X3B0cihuZXQtPmNvcmUuaW51c2UsIGNwdSktPnZhbFtwcm90LT5pbnVzZV9pZHhdICs9IHZhbDsKKwlfX3RoaXNfY3B1X2FkZChuZXQtPmNvcmUuaW51c2UtPnZhbFtwcm90LT5pbnVzZV9pZHhdLCB2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc29ja19wcm90X2ludXNlX2FkZCk7CiAKQEAgLTIyNTcsNyArMjI3OCw3IEBACiAKIHZvaWQgc29ja19wcm90X2ludXNlX2FkZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBwcm90byAqcHJvdCwgaW50IHZhbCkKIHsKLQlfX2dldF9jcHVfdmFyKHByb3RfaW51c2UpLnZhbFtwcm90LT5pbnVzZV9pZHhdICs9IHZhbDsKKwlfX3RoaXNfY3B1X2FkZChwcm90X2ludXNlLnZhbFtwcm90LT5pbnVzZV9pZHhdLCB2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc29ja19wcm90X2ludXNlX2FkZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N0cmVhbS5jIGIvbmV0L2NvcmUvc3RyZWFtLmMKaW5kZXggY2MxOTZmNDJiLi5kOTU5ZTBmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zdHJlYW0uYworKysgYi9uZXQvY29yZS9zdHJlYW0uYwpAQCAtNDMsNyArNDMsNiBAQAogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiB9Ci0KIEVYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dyaXRlX3NwYWNlKTsKIAogLyoqCkBAIC04MSw3ICs4MCw2IEBACiAJfSB3aGlsZSAoIWRvbmUpOwogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKHNrX3N0cmVhbV93YWl0X2Nvbm5lY3QpOwogCiAvKioKQEAgLTEwOSw3ICsxMDcsNiBAQAogCQlmaW5pc2hfd2FpdChza19zbGVlcChzayksICZ3YWl0KTsKIAl9CiB9Ci0KIEVYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dhaXRfY2xvc2UpOwogCiAvKioKQEAgLTE3NCw3ICsxNzEsNiBAQAogCWVyciA9IHNvY2tfaW50cl9lcnJubygqdGltZW9fcCk7CiAJZ290byBvdXQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dhaXRfbWVtb3J5KTsKIAogaW50IHNrX3N0cmVhbV9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywgaW50IGVycikKQEAgLTE4NSw3ICsxODEsNiBAQAogCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKIAlyZXR1cm4gZXJyOwogfQotCiBFWFBPUlRfU1lNQk9MKHNrX3N0cmVhbV9lcnJvcik7CiAKIHZvaWQgc2tfc3RyZWFtX2tpbGxfcXVldWVzKHN0cnVjdCBzb2NrICpzaykKQEAgLTIxMCw1ICsyMDUsNCBAQAogCSAqIGhhdmUgZ29uZSBhd2F5LCBvbmx5IHRoZSBuZXQgbGF5ZXIga25vd3MgY2FuIHRvdWNoIGl0LgogCSAqLwogfQotCiBFWFBPUlRfU1lNQk9MKHNrX3N0cmVhbV9raWxsX3F1ZXVlcyk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS90aW1lc3RhbXBpbmcuYyBiL25ldC9jb3JlL3RpbWVzdGFtcGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTZjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS90aW1lc3RhbXBpbmcuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIFBUUCAxNTg4IGNsb2NrIHN1cHBvcnQgLSBzdXBwb3J0IGZvciB0aW1lc3RhbXBpbmcgaW4gUEhZIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgT01JQ1JPTiBlbGVjdHJvbmljcyBHbWJICisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcHRwX2NsYXNzaWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja19maWx0ZXIgcHRwX2ZpbHRlcltdID0geworCVBUUF9GSUxURVIKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAobGlrZWx5KHNrYi0+ZGV2ICYmCisJCSAgIHNrYi0+ZGV2LT5waHlkZXYgJiYKKwkJICAgc2tiLT5kZXYtPnBoeWRldi0+ZHJ2KSkKKwkJcmV0dXJuIHNrX3J1bl9maWx0ZXIoc2tiLCBwdHBfZmlsdGVyLCBBUlJBWV9TSVpFKHB0cF9maWx0ZXIpKTsKKwllbHNlCisJCXJldHVybiBQVFBfQ0xBU1NfTk9ORTsKK30KKwordm9pZCBza2JfY2xvbmVfdHhfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKworCWlmICghc2spCisJCXJldHVybjsKKworCXR5cGUgPSBjbGFzc2lmeShza2IpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBQVFBfQ0xBU1NfVjFfSVBWNDoKKwljYXNlIFBUUF9DTEFTU19WMV9JUFY2OgorCWNhc2UgUFRQX0NMQVNTX1YyX0lQVjQ6CisJY2FzZSBQVFBfQ0xBU1NfVjJfSVBWNjoKKwljYXNlIFBUUF9DTEFTU19WMl9MMjoKKwljYXNlIFBUUF9DTEFTU19WMl9WTEFOOgorCQlwaHlkZXYgPSBza2ItPmRldi0+cGh5ZGV2OworCQlpZiAobGlrZWx5KHBoeWRldi0+ZHJ2LT50eHRzdGFtcCkpIHsKKwkJCWNsb25lID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWNsb25lKQorCQkJCXJldHVybjsKKwkJCWNsb25lLT5zayA9IHNrOworCQkJcGh5ZGV2LT5kcnYtPnR4dHN0YW1wKHBoeWRldiwgY2xvbmUsIHR5cGUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBza2JfY29tcGxldGVfdHhfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IHNrYl9zaGFyZWRfaHd0c3RhbXBzICpod3RzdGFtcHMpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKwlzdHJ1Y3Qgc29ja19leHRlcnJfc2tiICpzZXJyOworCWludCBlcnI7CisKKwlpZiAoIWh3dHN0YW1wcykKKwkJcmV0dXJuOworCisJKnNrYl9od3RzdGFtcHMoc2tiKSA9ICpod3RzdGFtcHM7CisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisJbWVtc2V0KHNlcnIsIDAsIHNpemVvZigqc2VycikpOworCXNlcnItPmVlLmVlX2Vycm5vID0gRU5PTVNHOworCXNlcnItPmVlLmVlX29yaWdpbiA9IFNPX0VFX09SSUdJTl9USU1FU1RBTVBJTkc7CisJc2tiLT5zayA9IE5VTEw7CisJZXJyID0gc29ja19xdWV1ZV9lcnJfc2tiKHNrLCBza2IpOworCWlmIChlcnIpCisJCWtmcmVlX3NrYihza2IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tiX2NvbXBsZXRlX3R4X3RpbWVzdGFtcCk7CisKK2Jvb2wgc2tiX2RlZmVyX3J4X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CisJdW5zaWduZWQgaW50IHR5cGU7CisKKwlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKKworCXR5cGUgPSBjbGFzc2lmeShza2IpOworCisJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFBUUF9DTEFTU19WMV9JUFY0OgorCWNhc2UgUFRQX0NMQVNTX1YxX0lQVjY6CisJY2FzZSBQVFBfQ0xBU1NfVjJfSVBWNDoKKwljYXNlIFBUUF9DTEFTU19WMl9JUFY2OgorCWNhc2UgUFRQX0NMQVNTX1YyX0wyOgorCWNhc2UgUFRQX0NMQVNTX1YyX1ZMQU46CisJCXBoeWRldiA9IHNrYi0+ZGV2LT5waHlkZXY7CisJCWlmIChsaWtlbHkocGh5ZGV2LT5kcnYtPnJ4dHN0YW1wKSkKKwkJCXJldHVybiBwaHlkZXYtPmRydi0+cnh0c3RhbXAocGh5ZGV2LCBza2IsIHR5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgX19pbml0IHNrYl90aW1lc3RhbXBpbmdfaW5pdCh2b2lkKQoreworCUJVR19PTihza19jaGtfZmlsdGVyKHB0cF9maWx0ZXIsIEFSUkFZX1NJWkUocHRwX2ZpbHRlcikpKTsKK30KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3V0aWxzLmMgYi9uZXQvY29yZS91dGlscy5jCmluZGV4IDgzODI1MDIuLmY0MTg1NDQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3V0aWxzLmMKKysrIGIvbmV0L2NvcmUvdXRpbHMuYwpAQCAtNzcsNyArNzcsNiBAQAogCX0KIAlyZXR1cm4oaHRvbmwobCkpOwogfQotCiBFWFBPUlRfU1lNQk9MKGluX2F0b24pOwogCiAjZGVmaW5lIElONlBUT05fWERJR0lUCQkweDAwMDEwMDAwCkBAIC0xNjIsNyArMTYxLDYgQEAKIAkJKmVuZCA9IHM7CiAJcmV0dXJuIHJldDsKIH0KLQogRVhQT1JUX1NZTUJPTChpbjRfcHRvbik7CiAKIGludCBpbjZfcHRvbihjb25zdCBjaGFyICpzcmMsIGludCBzcmNsZW4sCkBAIC0yODAsNyArMjc4LDYgQEAKIAkJKmVuZCA9IHM7CiAJcmV0dXJuIHJldDsKIH0KLQogRVhQT1JUX1NZTUJPTChpbjZfcHRvbik7CiAKIHZvaWQgaW5ldF9wcm90b19jc3VtX3JlcGxhY2U0KF9fc3VtMTYgKnN1bSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2Fja3ZlYy5jIGIvbmV0L2RjY3AvYWNrdmVjLmMKaW5kZXggMDFlNGQzOS4uOTJhNmZjYiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvYWNrdmVjLmMKKysrIGIvbmV0L2RjY3AvYWNrdmVjLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAllbGFwc2VkX3RpbWUgPSBkZWx0YSAvIDEwOwogCiAJaWYgKGVsYXBzZWRfdGltZSAhPSAwICYmCi0JICAgIGRjY3BfaW5zZXJ0X29wdGlvbl9lbGFwc2VkX3RpbWUoc2ssIHNrYiwgZWxhcHNlZF90aW1lKSkKKwkgICAgZGNjcF9pbnNlcnRfb3B0aW9uX2VsYXBzZWRfdGltZShza2IsIGVsYXBzZWRfdGltZSkpCiAJCXJldHVybiAtMTsKIAogCWF2ciA9IGRjY3BfYWNrdmVjX3JlY29yZF9uZXcoKTsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGludCBwYWNrZXRzLAogCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3RhdGUpCiB7Ci0JdW5zaWduZWQgaW50IGdhcDsKKwlsb25nIGdhcDsKIAlsb25nIG5ld19oZWFkOwogCiAJaWYgKGF2LT5hdl92ZWNfbGVuICsgcGFja2V0cyA+IERDQ1BfTUFYX0FDS1ZFQ19MRU4pCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwppbmRleCBkMzIzNTg5Li45NWY3NTI5IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKQEAgLTcxNSw5ICs3MTUsOSBAQAogCXhfcmVjdiA9IGh0b25sKGhjLT5yeF94X3JlY3YpOwogCXBpbnYgICA9IGh0b25sKGhjLT5yeF9waW52KTsKIAotCWlmIChkY2NwX2luc2VydF9vcHRpb24oc2ssIHNrYiwgVEZSQ19PUFRfTE9TU19FVkVOVF9SQVRFLAorCWlmIChkY2NwX2luc2VydF9vcHRpb24oc2tiLCBURlJDX09QVF9MT1NTX0VWRU5UX1JBVEUsCiAJCQkgICAgICAgJnBpbnYsIHNpemVvZihwaW52KSkgfHwKLQkgICAgZGNjcF9pbnNlcnRfb3B0aW9uKHNrLCBza2IsIFRGUkNfT1BUX1JFQ0VJVkVfUkFURSwKKwkgICAgZGNjcF9pbnNlcnRfb3B0aW9uKHNrYiwgVEZSQ19PUFRfUkVDRUlWRV9SQVRFLAogCQkJICAgICAgICZ4X3JlY3YsIHNpemVvZih4X3JlY3YpKSkKIAkJcmV0dXJuIC0xOwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kY2NwLmggYi9uZXQvZGNjcC9kY2NwLmgKaW5kZXggYTEwYTYxYS4uM2NjZWYxYiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGNjcC5oCisrKyBiL25ldC9kY2NwL2RjY3AuaApAQCAtNDQ2LDE2ICs0NDYsMTIgQEAKIAogZXh0ZXJuIGludCBkY2NwX2luc2VydF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50IGRjY3BfaW5zZXJ0X29wdGlvbnNfcnNrKHN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayosIHN0cnVjdCBza19idWZmKik7Ci1leHRlcm4gaW50IGRjY3BfaW5zZXJ0X29wdGlvbl9lbGFwc2VkX3RpbWUoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgIHUzMiBlbGFwc2VkX3RpbWUpOworZXh0ZXJuIGludCBkY2NwX2luc2VydF9vcHRpb25fZWxhcHNlZF90aW1lKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBlbGFwc2VkKTsKIGV4dGVybiB1MzIgZGNjcF90aW1lc3RhbXAodm9pZCk7CiBleHRlcm4gdm9pZCBkY2NwX3RpbWVzdGFtcGluZ19pbml0KHZvaWQpOwotZXh0ZXJuIGludCBkY2NwX2luc2VydF9vcHRpb25fdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIGludCBkY2NwX2luc2VydF9vcHRpb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgb3B0aW9uLAotCQkJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCB1bnNpZ25lZCBjaGFyIGxlbik7CitleHRlcm4gaW50IGRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IGRjY3BfaW5zZXJ0X29wdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyIG9wdGlvbiwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCB1bnNpZ25lZCBjaGFyIGxlbik7CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiBleHRlcm4gaW50IGRjY3Bfc3lzY3RsX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCA2YmViNmE3Li4xMGM5NTdhIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTQzMCw3ICs0MzAsNyBAQAogCQlpZiAoZGNjcF9wYXJzZV9vcHRpb25zKHNrLCBOVUxMLCBza2IpKQogCQkJcmV0dXJuIDE7CiAKLQkJLyogT2J0YWluIHVzZWMgUlRUIHNhbXBsZSBmcm9tIFNZTiBleGNoYW5nZSAodXNlZCBieSBDQ0lEIDMpICovCisJCS8qIE9idGFpbiB1c2VjIFJUVCBzYW1wbGUgZnJvbSBTWU4gZXhjaGFuZ2UgKHVzZWQgYnkgVEZSQykuICovCiAJCWlmIChsaWtlbHkoZHAtPmRjY3BzX29wdGlvbnNfcmVjZWl2ZWQuZGNjcG9yX3RpbWVzdGFtcF9lY2hvKSkKIAkJCWRwLT5kY2Nwc19zeW5fcnR0ID0gZGNjcF9zYW1wbGVfcnR0KHNrLCAxMCAqICh0c3RhbXAgLQogCQkJICAgIGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl90aW1lc3RhbXBfZWNobykpOwpAQCAtNTM1LDYgKzUzNSw4IEBACiAJCQkJCQkgICBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLAogCQkJCQkJICAgY29uc3QgdW5zaWduZWQgbGVuKQogeworCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJdTMyIHNhbXBsZSA9IGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl90aW1lc3RhbXBfZWNobzsKIAlpbnQgcXVldWVkID0gMDsKIAogCXN3aXRjaCAoZGgtPmRjY3BoX3R5cGUpIHsKQEAgLTU1OSw3ICs1NjEsMTQgQEAKIAkJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX1BBUlRPUEVOKQogCQkJaW5ldF9jc2tfY2xlYXJfeG1pdF90aW1lcihzaywgSUNTS19USU1FX0RBQ0spOwogCi0JCWRjY3Bfc2soc2spLT5kY2Nwc19vc3IgPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXE7CisJCS8qIE9idGFpbiB1c2VjIFJUVCBzYW1wbGUgZnJvbSBTWU4gZXhjaGFuZ2UgKHVzZWQgYnkgVEZSQykuICovCisJCWlmIChsaWtlbHkoc2FtcGxlKSkgeworCQkJbG9uZyBkZWx0YSA9IGRjY3BfdGltZXN0YW1wKCkgLSBzYW1wbGU7CisKKwkJCWRwLT5kY2Nwc19zeW5fcnR0ID0gZGNjcF9zYW1wbGVfcnR0KHNrLCAxMCAqIGRlbHRhKTsKKwkJfQorCisJCWRwLT5kY2Nwc19vc3IgPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXE7CiAJCWRjY3Bfc2V0X3N0YXRlKHNrLCBEQ0NQX09QRU4pOwogCiAJCWlmIChkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9EQVRBQUNLIHx8CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY0LmMgYi9uZXQvZGNjcC9pcHY0LmMKaW5kZXggZDliMTFlZi4uZDRhMTY2ZiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2NC5jCisrKyBiL25ldC9kY2NwL2lwdjQuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCWdvdG8gZmFpbHVyZTsKIAogCS8qIE9LLCBub3cgY29tbWl0IGRlc3RpbmF0aW9uIHRvIHNvY2tldC4gICovCi0Jc2tfc2V0dXBfY2FwcyhzaywgJnJ0LT51LmRzdCk7CisJc2tfc2V0dXBfY2FwcyhzaywgJnJ0LT5kc3QpOwogCiAJZHAtPmRjY3BzX2lzcyA9IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihpbmV0LT5pbmV0X3NhZGRyLAogCQkJCQkJICAgIGluZXQtPmluZXRfZGFkZHIsCkBAIC00NzUsNyArNDc1LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcmV0dXJuICZydC0+dS5kc3Q7CisJcmV0dXJuICZydC0+ZHN0OwogfQogCiBzdGF0aWMgaW50IGRjY3BfdjRfc2VuZF9yZXNwb25zZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjYuYyBiL25ldC9kY2NwL2lwdjYuYwppbmRleCAwOTE2OTg4Li42ZTNmMzI1IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY2LmMKKysrIGIvbmV0L2RjY3AvaXB2Ni5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7Ci0Jc3RydWN0IGluNl9hZGRyICpmaW5hbF9wID0gTlVMTCwgZmluYWw7CisJc3RydWN0IGluNl9hZGRyICpmaW5hbF9wLCBmaW5hbDsKIAlzdHJ1Y3QgZmxvd2kgZmw7CiAJaW50IGVyciA9IC0xOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKQEAgLTI2NSwxMyArMjY1LDcgQEAKIAogCW9wdCA9IG5wLT5vcHQ7CiAKLQlpZiAob3B0ICE9IE5VTEwgJiYgb3B0LT5zcmNydCAhPSBOVUxMKSB7Ci0JCWNvbnN0IHN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKilvcHQtPnNyY3J0OwotCi0JCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOwotCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgcnQwLT5hZGRyKTsKLQkJZmluYWxfcCA9ICZmaW5hbDsKLQl9CisJZmluYWxfcCA9IGZsNl91cGRhdGVfZHN0KCZmbCwgb3B0LCAmZmluYWwpOwogCiAJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CiAJaWYgKGVycikKQEAgLTU0NSwxOSArNTM5LDEzIEBACiAJCWdvdG8gb3V0X292ZXJmbG93OwogCiAJaWYgKGRzdCA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBpbjZfYWRkciAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCQlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AsIGZpbmFsOwogCQlzdHJ1Y3QgZmxvd2kgZmw7CiAKIAkJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CiAJCWZsLnByb3RvID0gSVBQUk9UT19EQ0NQOwogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJmlyZXE2LT5ybXRfYWRkcik7Ci0JCWlmIChvcHQgIT0gTlVMTCAmJiBvcHQtPnNyY3J0ICE9IE5VTEwpIHsKLQkJCWNvbnN0IHN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKilvcHQtPnNyY3J0OwotCi0JCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKLQkJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOwotCQkJZmluYWxfcCA9ICZmaW5hbDsKLQkJfQorCQlmaW5hbF9wID0gZmw2X3VwZGF0ZV9kc3QoJmZsLCBvcHQsICZmaW5hbCk7CiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmaXJlcTYtPmxvY19hZGRyKTsKIAkJZmwub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAkJZmwuZmxfaXBfZHBvcnQgPSBpbmV0X3JzayhyZXEpLT5ybXRfcG9ydDsKQEAgLTg4NSw3ICs4NzMsNyBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gTlVMTCwgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gTlVMTCwgKmZpbmFsX3AsIGZpbmFsOwogCXN0cnVjdCBmbG93aSBmbDsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJaW50IGFkZHJfdHlwZTsKQEAgLTk4OCwxMyArOTc2LDcgQEAKIAlmbC5mbF9pcF9zcG9ydCA9IGluZXQtPmluZXRfc3BvcnQ7CiAJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKIAotCWlmIChucC0+b3B0ICE9IE5VTEwgJiYgbnAtPm9wdC0+c3JjcnQgIT0gTlVMTCkgewotCQljb25zdCBzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopbnAtPm9wdC0+c3JjcnQ7Ci0KLQkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOwotCQlmaW5hbF9wID0gJmZpbmFsOwotCX0KKwlmaW5hbF9wID0gZmw2X3VwZGF0ZV9kc3QoJmZsLCBucC0+b3B0LCAmZmluYWwpOwogCiAJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL25ldC9kY2NwL29wdGlvbnMuYyBiL25ldC9kY2NwL29wdGlvbnMuYwppbmRleCAwNzM5NWY4Li5iZmRhMDg3IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vcHRpb25zLmMKKysrIGIvbmV0L2RjY3Avb3B0aW9ucy5jCkBAIC0yOTksOSArMjk5LDggQEAKIAlyZXR1cm4gbGlrZWx5KG5kcCA8PSBVU0hSVF9NQVgpID8gMiA6IChuZHAgPD0gVUlOVF9NQVggPyA0IDogNik7CiB9CiAKLWludCBkY2NwX2luc2VydF9vcHRpb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciBvcHRpb24sCi0JCQljb25zdCB2b2lkICp2YWx1ZSwgY29uc3QgdW5zaWduZWQgY2hhciBsZW4pCitpbnQgZGNjcF9pbnNlcnRfb3B0aW9uKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3B0aW9uLAorCQkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGVuKQogewogCXVuc2lnbmVkIGNoYXIgKnRvOwogCkBAIC0zNTQsOCArMzUzLDcgQEAKIAlyZXR1cm4gZWxhcHNlZF90aW1lID09IDAgPyAwIDogZWxhcHNlZF90aW1lIDw9IDB4RkZGRiA/IDIgOiA0OwogfQogCi1pbnQgZGNjcF9pbnNlcnRfb3B0aW9uX2VsYXBzZWRfdGltZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHUzMiBlbGFwc2VkX3RpbWUpCitpbnQgZGNjcF9pbnNlcnRfb3B0aW9uX2VsYXBzZWRfdGltZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZWxhcHNlZF90aW1lKQogewogCWNvbnN0IGludCBlbGFwc2VkX3RpbWVfbGVuID0gZGNjcF9lbGFwc2VkX3RpbWVfbGVuKGVsYXBzZWRfdGltZSk7CiAJY29uc3QgaW50IGxlbiA9IDIgKyBlbGFwc2VkX3RpbWVfbGVuOwpAQCAtMzg2LDEzICszODQsMTMgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9pbnNlcnRfb3B0aW9uX2VsYXBzZWRfdGltZSk7CiAKLWludCBkY2NwX2luc2VydF9vcHRpb25fdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBkY2NwX2luc2VydF9vcHRpb25fdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJX19iZTMyIG5vdyA9IGh0b25sKGRjY3BfdGltZXN0YW1wKCkpOwogCS8qIHllcyB0aGlzIHdpbGwgb3ZlcmZsb3cgYnV0IHRoYXQgaXMgdGhlIHBvaW50IGFzIHdlIHdhbnQgYQogCSAqIDEwIHVzZWMgMzIgYml0IHRpbWVyIHdoaWNoIG1lYW4gaXQgd3JhcHMgZXZlcnkgMTEuOSBob3VycyAqLwogCi0JcmV0dXJuIGRjY3BfaW5zZXJ0X29wdGlvbihzaywgc2tiLCBEQ0NQT19USU1FU1RBTVAsICZub3csIHNpemVvZihub3cpKTsKKwlyZXR1cm4gZGNjcF9pbnNlcnRfb3B0aW9uKHNrYiwgRENDUE9fVElNRVNUQU1QLCAmbm93LCBzaXplb2Yobm93KSk7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXApOwpAQCAtNTMxLDkgKzUyOSw5IEBACiAJCWlmIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID09IERDQ1BfUEtUX1JFUVVFU1QpIHsKIAkJCS8qCiAJCQkgKiBPYnRhaW4gUlRUIHNhbXBsZSBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgZXhjaGFuZ2UuCi0JCQkgKiBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGluIENDSUQgMyBpbml0aWFsaXNhdGlvbi4KKwkJCSAqIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgZm9yIFRGUkMgaW5pdGlhbGlzYXRpb24uCiAJCQkgKi8KLQkJCWlmIChkY2NwX2luc2VydF9vcHRpb25fdGltZXN0YW1wKHNrLCBza2IpKQorCQkJaWYgKGRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXAoc2tiKSkKIAkJCQlyZXR1cm4gLTE7CiAKIAkJfSBlbHNlIGlmIChkcC0+ZGNjcHNfaGNfcnhfYWNrdmVjICE9IE5VTEwgJiYKQEAgLTU2NCw2ICs1NjIsMTAgQEAKIAlpZiAoZGNjcF9mZWF0X2luc2VydF9vcHRzKE5VTEwsIGRyZXEsIHNrYikpCiAJCXJldHVybiAtMTsKIAorCS8qIE9idGFpbiBSVFQgc2FtcGxlIGZyb20gUmVzcG9uc2UvQWNrIGV4Y2hhbmdlICh1c2VkIGJ5IFRGUkMpLiAqLworCWlmIChkY2NwX2luc2VydF9vcHRpb25fdGltZXN0YW1wKHNrYikpCisJCXJldHVybiAtMTsKKwogCWlmIChkcmVxLT5kcmVxX3RpbWVzdGFtcF9lY2hvICE9IDAgJiYKIAkgICAgZGNjcF9pbnNlcnRfb3B0aW9uX3RpbWVzdGFtcF9lY2hvKE5VTEwsIGRyZXEsIHNrYikpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3Byb3RvLmMgYi9uZXQvZGNjcC9wcm90by5jCmluZGV4IGIwM2VjZjYuLjA5NjI1MGQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3Byb3RvLmMKKysrIGIvbmV0L2RjY3AvcHJvdG8uYwpAQCAtNDczLDE0ICs0NzMsOSBAQAogCWlmIChvcHRsZW4gPCAxIHx8IG9wdGxlbiA+IERDQ1BfRkVBVF9NQVhfU1BfVkFMUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl2YWwgPSBrbWFsbG9jKG9wdGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZhbCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcih2YWwsIG9wdHZhbCwgb3B0bGVuKSkgewotCQlrZnJlZSh2YWwpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJdmFsID0gbWVtZHVwX3VzZXIob3B0dmFsLCBvcHRsZW4pOworCWlmIChJU19FUlIodmFsKSkKKwkJcmV0dXJuIFBUUl9FUlIodmFsKTsKIAogCWxvY2tfc29jayhzayk7CiAJaWYgKHR5cGUgPT0gRENDUF9TT0NLT1BUX1RYX0NDSUQgfHwgdHlwZSA9PSBEQ0NQX1NPQ0tPUFRfQ0NJRCkKQEAgLTEwMDcsNyArMTAwMiw4IEBACiBzdGF0aWMgaW5saW5lIGludCBkY2NwX21pYl9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopZGNjcF9zdGF0aXN0aWNzLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGRjY3BfbWliKSk7CisJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9taWIpLAorCQkJICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgZGNjcF9taWIpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRjY3BfbWliX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fcm91dGUuYyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwppbmRleCA4MTJlNmRmLi42NTg1ZWE2IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKKysrIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCkBAIC0xNDYsMTMgKzE0NiwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG5ydF9mcmVlKHN0cnVjdCBkbl9yb3V0ZSAqcnQpCiB7Ci0JY2FsbF9yY3VfYmgoJnJ0LT51LmRzdC5yY3VfaGVhZCwgZHN0X3JjdV9mcmVlKTsKKwljYWxsX3JjdV9iaCgmcnQtPmRzdC5yY3VfaGVhZCwgZHN0X3JjdV9mcmVlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRucnRfZHJvcChzdHJ1Y3QgZG5fcm91dGUgKnJ0KQogewotCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOwotCWNhbGxfcmN1X2JoKCZydC0+dS5kc3QucmN1X2hlYWQsIGRzdF9yY3VfZnJlZSk7CisJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOworCWNhbGxfcmN1X2JoKCZydC0+ZHN0LnJjdV9oZWFkLCBkc3RfcmN1X2ZyZWUpOwogfQogCiBzdGF0aWMgdm9pZCBkbl9kc3RfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCkBAIC0xNjcsMTMgKzE2NywxMyBAQAogCiAJCXNwaW5fbG9jaygmZG5fcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKIAkJd2hpbGUoKHJ0PSpydHApICE9IE5VTEwpIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmcnQtPnUuZHN0Ll9fcmVmY250KSB8fAotCQkJCQkobm93IC0gcnQtPnUuZHN0Lmxhc3R1c2UpIDwgZXhwaXJlKSB7Ci0JCQkJcnRwID0gJnJ0LT51LmRzdC5kbl9uZXh0OworCQkJaWYgKGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSB8fAorCQkJCQkobm93IC0gcnQtPmRzdC5sYXN0dXNlKSA8IGV4cGlyZSkgeworCQkJCXJ0cCA9ICZydC0+ZHN0LmRuX25leHQ7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQkqcnRwID0gcnQtPnUuZHN0LmRuX25leHQ7Ci0JCQlydC0+dS5kc3QuZG5fbmV4dCA9IE5VTEw7CisJCQkqcnRwID0gcnQtPmRzdC5kbl9uZXh0OworCQkJcnQtPmRzdC5kbl9uZXh0ID0gTlVMTDsKIAkJCWRucnRfZnJlZShydCk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmRuX3J0X2hhc2hfdGFibGVbaV0ubG9jayk7CkBAIC0xOTgsMTMgKzE5OCwxMyBAQAogCQlydHAgPSAmZG5fcnRfaGFzaF90YWJsZVtpXS5jaGFpbjsKIAogCQl3aGlsZSgocnQ9KnJ0cCkgIT0gTlVMTCkgewotCQkJaWYgKGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpIHx8Ci0JCQkJCShub3cgLSBydC0+dS5kc3QubGFzdHVzZSkgPCBleHBpcmUpIHsKLQkJCQlydHAgPSAmcnQtPnUuZHN0LmRuX25leHQ7CisJCQlpZiAoYXRvbWljX3JlYWQoJnJ0LT5kc3QuX19yZWZjbnQpIHx8CisJCQkJCShub3cgLSBydC0+ZHN0Lmxhc3R1c2UpIDwgZXhwaXJlKSB7CisJCQkJcnRwID0gJnJ0LT5kc3QuZG5fbmV4dDsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCSpydHAgPSBydC0+dS5kc3QuZG5fbmV4dDsKLQkJCXJ0LT51LmRzdC5kbl9uZXh0ID0gTlVMTDsKKwkJCSpydHAgPSBydC0+ZHN0LmRuX25leHQ7CisJCQlydC0+ZHN0LmRuX25leHQgPSBOVUxMOwogCQkJZG5ydF9kcm9wKHJ0KTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yODcsMjUgKzI4NywyNSBAQAogCXdoaWxlKChydGggPSAqcnRocCkgIT0gTlVMTCkgewogCQlpZiAoY29tcGFyZV9rZXlzKCZydGgtPmZsLCAmcnQtPmZsKSkgewogCQkJLyogUHV0IGl0IGZpcnN0ICovCi0JCQkqcnRocCA9IHJ0aC0+dS5kc3QuZG5fbmV4dDsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihydGgtPnUuZHN0LmRuX25leHQsCisJCQkqcnRocCA9IHJ0aC0+ZHN0LmRuX25leHQ7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIocnRoLT5kc3QuZG5fbmV4dCwKIAkJCQkJICAgZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7CiAJCQlyY3VfYXNzaWduX3BvaW50ZXIoZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbiwgcnRoKTsKIAotCQkJZHN0X3VzZSgmcnRoLT51LmRzdCwgbm93KTsKKwkJCWRzdF91c2UoJnJ0aC0+ZHN0LCBub3cpOwogCQkJc3Bpbl91bmxvY2tfYmgoJmRuX3J0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CiAKIAkJCWRucnRfZHJvcChydCk7CiAJCQkqcnAgPSBydGg7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlydGhwID0gJnJ0aC0+dS5kc3QuZG5fbmV4dDsKKwkJcnRocCA9ICZydGgtPmRzdC5kbl9uZXh0OwogCX0KIAotCXJjdV9hc3NpZ25fcG9pbnRlcihydC0+dS5kc3QuZG5fbmV4dCwgZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHJ0LT5kc3QuZG5fbmV4dCwgZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKGRuX3J0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW4sIHJ0KTsKIAotCWRzdF91c2UoJnJ0LT51LmRzdCwgbm93KTsKKwlkc3RfdXNlKCZydC0+ZHN0LCBub3cpOwogCXNwaW5fdW5sb2NrX2JoKCZkbl9ydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOwogCSpycCA9IHJ0OwogCXJldHVybiAwOwpAQCAtMzIzLDggKzMyMyw4IEBACiAJCQlnb3RvIG5vdGhpbmdfdG9fZGVjbGFyZTsKIAogCQlmb3IoOyBydDsgcnQ9bmV4dCkgewotCQkJbmV4dCA9IHJ0LT51LmRzdC5kbl9uZXh0OwotCQkJcnQtPnUuZHN0LmRuX25leHQgPSBOVUxMOworCQkJbmV4dCA9IHJ0LT5kc3QuZG5fbmV4dDsKKwkJCXJ0LT5kc3QuZG5fbmV4dCA9IE5VTEw7CiAJCQlkc3RfZnJlZSgoc3RydWN0IGRzdF9lbnRyeSAqKXJ0KTsKIAkJfQogCkBAIC03NDMsNyArNzQzLDcgQEAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgaGVhZGVycyAqLwogCXJ0ID0gKHN0cnVjdCBkbl9yb3V0ZSAqKXNrYl9kc3Qoc2tiKTsKIAloZWFkZXJfbGVuID0gZG5fZGItPnVzZV9sb25nID8gMjEgOiA2OwotCWlmIChza2JfY293KHNrYiwgTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldikraGVhZGVyX2xlbikpCisJaWYgKHNrYl9jb3coc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikraGVhZGVyX2xlbikpCiAJCWdvdG8gZHJvcDsKIAogCS8qCkBAIC03NTIsNyArNzUyLDcgQEAKIAlpZiAoKytjYi0+aG9wcyA+IDMwKQogCQlnb3RvIGRyb3A7CiAKLQlza2ItPmRldiA9IHJ0LT51LmRzdC5kZXY7CisJc2tiLT5kZXYgPSBydC0+ZHN0LmRldjsKIAogCS8qCiAJICogSWYgcGFja2V0IGdvZXMgb3V0IHNhbWUgaW50ZXJmYWNlIGl0IGNhbWUgaW4gb24sIHRoZW4gc2V0CkBAIC03OTIsNyArNzkyLDcgQEAKIHN0YXRpYyBpbnQgZG5fcnRfc2V0X25leHRfaG9wKHN0cnVjdCBkbl9yb3V0ZSAqcnQsIHN0cnVjdCBkbl9maWJfcmVzICpyZXMpCiB7CiAJc3RydWN0IGRuX2ZpYl9pbmZvICpmaSA9IHJlcy0+Zmk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJ0LT51LmRzdC5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJ0LT5kc3QuZGV2OwogCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJdW5zaWduZWQgbXNzOwogCkBAIC04MDAsMjUgKzgwMCwyNSBAQAogCQlpZiAoRE5fRklCX1JFU19HVygqcmVzKSAmJgogCQkgICAgRE5fRklCX1JFU19OSCgqcmVzKS5uaF9zY29wZSA9PSBSVF9TQ09QRV9MSU5LKQogCQkJcnQtPnJ0X2dhdGV3YXkgPSBETl9GSUJfUkVTX0dXKCpyZXMpOwotCQltZW1jcHkocnQtPnUuZHN0Lm1ldHJpY3MsIGZpLT5maWJfbWV0cmljcywKLQkJICAgICAgIHNpemVvZihydC0+dS5kc3QubWV0cmljcykpOworCQltZW1jcHkocnQtPmRzdC5tZXRyaWNzLCBmaS0+ZmliX21ldHJpY3MsCisJCSAgICAgICBzaXplb2YocnQtPmRzdC5tZXRyaWNzKSk7CiAJfQogCXJ0LT5ydF90eXBlID0gcmVzLT50eXBlOwogCi0JaWYgKGRldiAhPSBOVUxMICYmIHJ0LT51LmRzdC5uZWlnaGJvdXIgPT0gTlVMTCkgeworCWlmIChkZXYgIT0gTlVMTCAmJiBydC0+ZHN0Lm5laWdoYm91ciA9PSBOVUxMKSB7CiAJCW4gPSBfX25laWdoX2xvb2t1cF9lcnJubygmZG5fbmVpZ2hfdGFibGUsICZydC0+cnRfZ2F0ZXdheSwgZGV2KTsKIAkJaWYgKElTX0VSUihuKSkKIAkJCXJldHVybiBQVFJfRVJSKG4pOwotCQlydC0+dS5kc3QubmVpZ2hib3VyID0gbjsKKwkJcnQtPmRzdC5uZWlnaGJvdXIgPSBuOwogCX0KIAotCWlmIChkc3RfbWV0cmljKCZydC0+dS5kc3QsIFJUQVhfTVRVKSA9PSAwIHx8Ci0JICAgIGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9NVFUpID4gcnQtPnUuZHN0LmRldi0+bXR1KQotCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IHJ0LT51LmRzdC5kZXYtPm10dTsKLQltc3MgPSBkbl9tc3NfZnJvbV9wbXR1KGRldiwgZHN0X210dSgmcnQtPnUuZHN0KSk7Ci0JaWYgKGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9BRFZNU1MpID09IDAgfHwKLQkgICAgZHN0X21ldHJpYygmcnQtPnUuZHN0LCBSVEFYX0FEVk1TUykgPiBtc3MpCi0JCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gbXNzOworCWlmIChkc3RfbWV0cmljKCZydC0+ZHN0LCBSVEFYX01UVSkgPT0gMCB8fAorCSAgICBkc3RfbWV0cmljKCZydC0+ZHN0LCBSVEFYX01UVSkgPiBydC0+ZHN0LmRldi0+bXR1KQorCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBydC0+ZHN0LmRldi0+bXR1OworCW1zcyA9IGRuX21zc19mcm9tX3BtdHUoZGV2LCBkc3RfbXR1KCZydC0+ZHN0KSk7CisJaWYgKGRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfQURWTVNTKSA9PSAwIHx8CisJICAgIGRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfQURWTVNTKSA+IG1zcykKKwkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gbXNzOwogCXJldHVybiAwOwogfQogCkBAIC0xMDk2LDggKzEwOTYsOCBAQAogCWlmIChydCA9PSBOVUxMKQogCQlnb3RvIGVfbm9idWZzOwogCi0JYXRvbWljX3NldCgmcnQtPnUuZHN0Ll9fcmVmY250LCAxKTsKLQlydC0+dS5kc3QuZmxhZ3MgICA9IERTVF9IT1NUOworCWF0b21pY19zZXQoJnJ0LT5kc3QuX19yZWZjbnQsIDEpOworCXJ0LT5kc3QuZmxhZ3MgICA9IERTVF9IT1NUOwogCiAJcnQtPmZsLmZsZF9zcmMgICAgPSBvbGRmbHAtPmZsZF9zcmM7CiAJcnQtPmZsLmZsZF9kc3QgICAgPSBvbGRmbHAtPmZsZF9kc3Q7CkBAIC0xMTEzLDE3ICsxMTEzLDE3IEBACiAJcnQtPnJ0X2RzdF9tYXAgICAgPSBmbC5mbGRfZHN0OwogCXJ0LT5ydF9zcmNfbWFwICAgID0gZmwuZmxkX3NyYzsKIAotCXJ0LT51LmRzdC5kZXYgPSBkZXZfb3V0OworCXJ0LT5kc3QuZGV2ID0gZGV2X291dDsKIAlkZXZfaG9sZChkZXZfb3V0KTsKLQlydC0+dS5kc3QubmVpZ2hib3VyID0gbmVpZ2g7CisJcnQtPmRzdC5uZWlnaGJvdXIgPSBuZWlnaDsKIAluZWlnaCA9IE5VTEw7CiAKLQlydC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7Ci0JcnQtPnUuZHN0Lm91dHB1dCAgPSBkbl9vdXRwdXQ7Ci0JcnQtPnUuZHN0LmlucHV0ICAgPSBkbl9ydF9idWc7CisJcnQtPmRzdC5sYXN0dXNlID0gamlmZmllczsKKwlydC0+ZHN0Lm91dHB1dCAgPSBkbl9vdXRwdXQ7CisJcnQtPmRzdC5pbnB1dCAgID0gZG5fcnRfYnVnOwogCXJ0LT5ydF9mbGFncyAgICAgID0gZmxhZ3M7CiAJaWYgKGZsYWdzICYgUlRDRl9MT0NBTCkKLQkJcnQtPnUuZHN0LmlucHV0ID0gZG5fbnNwX3J4OworCQlydC0+ZHN0LmlucHV0ID0gZG5fbnNwX3J4OwogCiAJZXJyID0gZG5fcnRfc2V0X25leHRfaG9wKHJ0LCAmcmVzKTsKIAlpZiAoZXJyKQpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAllcnIgPSAtRU5PQlVGUzsKIAlnb3RvIGRvbmU7CiBlX25laWdoYm91cjoKLQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwlkc3RfZnJlZSgmcnQtPmRzdCk7CiAJZ290byBlX25vYnVmczsKIH0KIApAQCAtMTE2OCwxNSArMTE2OCwxNSBAQAogCWlmICghKGZsYWdzICYgTVNHX1RSWUhBUkQpKSB7CiAJCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAkJZm9yIChydCA9IHJjdV9kZXJlZmVyZW5jZV9iaChkbl9ydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluKTsgcnQ7Ci0JCQlydCA9IHJjdV9kZXJlZmVyZW5jZV9iaChydC0+dS5kc3QuZG5fbmV4dCkpIHsKKwkJCXJ0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHJ0LT5kc3QuZG5fbmV4dCkpIHsKIAkJCWlmICgoZmxwLT5mbGRfZHN0ID09IHJ0LT5mbC5mbGRfZHN0KSAmJgogCQkJICAgIChmbHAtPmZsZF9zcmMgPT0gcnQtPmZsLmZsZF9zcmMpICYmCiAJCQkgICAgKGZscC0+bWFyayA9PSBydC0+ZmwubWFyaykgJiYKIAkJCSAgICAocnQtPmZsLmlpZiA9PSAwKSAmJgogCQkJICAgIChydC0+Zmwub2lmID09IGZscC0+b2lmKSkgewotCQkJCWRzdF91c2UoJnJ0LT51LmRzdCwgamlmZmllcyk7CisJCQkJZHN0X3VzZSgmcnQtPmRzdCwgamlmZmllcyk7CiAJCQkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7Ci0JCQkJKnBwcnQgPSAmcnQtPnUuZHN0OworCQkJCSpwcHJ0ID0gJnJ0LT5kc3Q7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTEzNzUsMjkgKzEzNzUsMjkgQEAKIAlydC0+ZmwuaWlmICAgICAgICA9IGluX2Rldi0+aWZpbmRleDsKIAlydC0+ZmwubWFyayAgICAgICA9IGZsLm1hcms7CiAKLQlydC0+dS5kc3QuZmxhZ3MgPSBEU1RfSE9TVDsKLQlydC0+dS5kc3QubmVpZ2hib3VyID0gbmVpZ2g7Ci0JcnQtPnUuZHN0LmRldiA9IG91dF9kZXY7Ci0JcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOwotCXJ0LT51LmRzdC5vdXRwdXQgPSBkbl9ydF9idWc7CisJcnQtPmRzdC5mbGFncyA9IERTVF9IT1NUOworCXJ0LT5kc3QubmVpZ2hib3VyID0gbmVpZ2g7CisJcnQtPmRzdC5kZXYgPSBvdXRfZGV2OworCXJ0LT5kc3QubGFzdHVzZSA9IGppZmZpZXM7CisJcnQtPmRzdC5vdXRwdXQgPSBkbl9ydF9idWc7CiAJc3dpdGNoKHJlcy50eXBlKSB7CiAJCWNhc2UgUlROX1VOSUNBU1Q6Ci0JCQlydC0+dS5kc3QuaW5wdXQgPSBkbl9mb3J3YXJkOworCQkJcnQtPmRzdC5pbnB1dCA9IGRuX2ZvcndhcmQ7CiAJCQlicmVhazsKIAkJY2FzZSBSVE5fTE9DQUw6Ci0JCQlydC0+dS5kc3Qub3V0cHV0ID0gZG5fb3V0cHV0OwotCQkJcnQtPnUuZHN0LmlucHV0ID0gZG5fbnNwX3J4OwotCQkJcnQtPnUuZHN0LmRldiA9IGluX2RldjsKKwkJCXJ0LT5kc3Qub3V0cHV0ID0gZG5fb3V0cHV0OworCQkJcnQtPmRzdC5pbnB1dCA9IGRuX25zcF9yeDsKKwkJCXJ0LT5kc3QuZGV2ID0gaW5fZGV2OwogCQkJZmxhZ3MgfD0gUlRDRl9MT0NBTDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQljYXNlIFJUTl9VTlJFQUNIQUJMRToKIAkJY2FzZSBSVE5fQkxBQ0tIT0xFOgotCQkJcnQtPnUuZHN0LmlucHV0ID0gZHN0X2Rpc2NhcmQ7CisJCQlydC0+ZHN0LmlucHV0ID0gZHN0X2Rpc2NhcmQ7CiAJfQogCXJ0LT5ydF9mbGFncyA9IGZsYWdzOwotCWlmIChydC0+dS5kc3QuZGV2KQotCQlkZXZfaG9sZChydC0+dS5kc3QuZGV2KTsKKwlpZiAocnQtPmRzdC5kZXYpCisJCWRldl9ob2xkKHJ0LT5kc3QuZGV2KTsKIAogCWVyciA9IGRuX3J0X3NldF9uZXh0X2hvcChydCwgJnJlcyk7CiAJaWYgKGVycikKQEAgLTE0MDUsNyArMTQwNSw3IEBACiAKIAloYXNoID0gZG5faGFzaChydC0+ZmwuZmxkX3NyYywgcnQtPmZsLmZsZF9kc3QpOwogCWRuX2luc2VydF9yb3V0ZShydCwgaGFzaCwgJnJ0KTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiBkb25lOgogCWlmIChuZWlnaCkKQEAgLTE0MjcsNyArMTQyNyw3IEBACiAJZ290byBkb25lOwogCiBlX25laWdoYm91cjoKLQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwlkc3RfZnJlZSgmcnQtPmRzdCk7CiAJZ290byBkb25lOwogfQogCkBAIC0xNDQyLDEzICsxNDQyLDEzIEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yKHJ0ID0gcmN1X2RlcmVmZXJlbmNlKGRuX3J0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW4pOyBydCAhPSBOVUxMOwotCSAgICBydCA9IHJjdV9kZXJlZmVyZW5jZShydC0+dS5kc3QuZG5fbmV4dCkpIHsKKwkgICAgcnQgPSByY3VfZGVyZWZlcmVuY2UocnQtPmRzdC5kbl9uZXh0KSkgewogCQlpZiAoKHJ0LT5mbC5mbGRfc3JjID09IGNiLT5zcmMpICYmCiAJCSAgICAocnQtPmZsLmZsZF9kc3QgPT0gY2ItPmRzdCkgJiYKIAkJICAgIChydC0+Zmwub2lmID09IDApICYmCiAJCSAgICAocnQtPmZsLm1hcmsgPT0gc2tiLT5tYXJrKSAmJgogCQkgICAgKHJ0LT5mbC5paWYgPT0gY2ItPmlpZikpIHsKLQkJCWRzdF91c2UoJnJ0LT51LmRzdCwgamlmZmllcyk7CisJCQlkc3RfdXNlKCZydC0+ZHN0LCBqaWZmaWVzKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJc2tiX2RzdF9zZXQoc2tiLCAoc3RydWN0IGRzdF9lbnRyeSAqKXJ0KTsKIAkJCXJldHVybiAwOwpAQCAtMTQ4Nyw4ICsxNDg3LDggQEAKIAkJci0+cnRtX3NyY19sZW4gPSAxNjsKIAkJUlRBX1BVVChza2IsIFJUQV9TUkMsIDIsICZydC0+ZmwuZmxkX3NyYyk7CiAJfQotCWlmIChydC0+dS5kc3QuZGV2KQotCQlSVEFfUFVUKHNrYiwgUlRBX09JRiwgc2l6ZW9mKGludCksICZydC0+dS5kc3QuZGV2LT5pZmluZGV4KTsKKwlpZiAocnQtPmRzdC5kZXYpCisJCVJUQV9QVVQoc2tiLCBSVEFfT0lGLCBzaXplb2YoaW50KSwgJnJ0LT5kc3QuZGV2LT5pZmluZGV4KTsKIAkvKgogCSAqIE5vdGUgdG8gc2VsZiAtIGNoYW5nZSB0aGlzIGlmIGlucHV0IHJvdXRlcyByZXZlcnNlIGRpcmVjdGlvbiB3aGVuCiAJICogdGhleSBkZWFsIG9ubHkgd2l0aCBpbnB1dHMgYW5kIG5vdCB3aXRoIHJlcGxpZXMgbGlrZSB0aGV5IGRvCkBAIC0xNDk3LDExICsxNDk3LDExIEBACiAJUlRBX1BVVChza2IsIFJUQV9QUkVGU1JDLCAyLCAmcnQtPnJ0X2xvY2FsX3NyYyk7CiAJaWYgKHJ0LT5ydF9kYWRkciAhPSBydC0+cnRfZ2F0ZXdheSkKIAkJUlRBX1BVVChza2IsIFJUQV9HQVRFV0FZLCAyLCAmcnQtPnJ0X2dhdGV3YXkpOwotCWlmIChydG5ldGxpbmtfcHV0X21ldHJpY3Moc2tiLCBydC0+dS5kc3QubWV0cmljcykgPCAwKQorCWlmIChydG5ldGxpbmtfcHV0X21ldHJpY3Moc2tiLCBydC0+ZHN0Lm1ldHJpY3MpIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKLQlleHBpcmVzID0gcnQtPnUuZHN0LmV4cGlyZXMgPyBydC0+dS5kc3QuZXhwaXJlcyAtIGppZmZpZXMgOiAwOwotCWlmIChydG5sX3B1dF9jYWNoZWluZm8oc2tiLCAmcnQtPnUuZHN0LCAwLCAwLCAwLCBleHBpcmVzLAotCQkJICAgICAgIHJ0LT51LmRzdC5lcnJvcikgPCAwKQorCWV4cGlyZXMgPSBydC0+ZHN0LmV4cGlyZXMgPyBydC0+ZHN0LmV4cGlyZXMgLSBqaWZmaWVzIDogMDsKKwlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT5kc3QsIDAsIDAsIDAsIGV4cGlyZXMsCisJCQkgICAgICAgcnQtPmRzdC5lcnJvcikgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCWlmIChydC0+ZmwuaWlmKQogCQlSVEFfUFVUKHNrYiwgUlRBX0lJRiwgc2l6ZW9mKGludCksICZydC0+ZmwuaWlmKTsKQEAgLTE1NjgsOCArMTU2OCw4IEBACiAJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQltZW1zZXQoY2IsIDAsIHNpemVvZihzdHJ1Y3QgZG5fc2tiX2NiKSk7CiAJCXJ0ID0gKHN0cnVjdCBkbl9yb3V0ZSAqKXNrYl9kc3Qoc2tiKTsKLQkJaWYgKCFlcnIgJiYgLXJ0LT51LmRzdC5lcnJvcikKLQkJCWVyciA9IHJ0LT51LmRzdC5lcnJvcjsKKwkJaWYgKCFlcnIgJiYgLXJ0LT5kc3QuZXJyb3IpCisJCQllcnIgPSBydC0+ZHN0LmVycm9yOwogCX0gZWxzZSB7CiAJCWludCBvaWYgPSAwOwogCQlpZiAocnRhW1JUQV9PSUYgLSAxXSkKQEAgLTE1ODMsNyArMTU4Myw3IEBACiAJc2tiLT5kZXYgPSBOVUxMOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7Ci0Jc2tiX2RzdF9zZXQoc2tiLCAmcnQtPnUuZHN0KTsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAlpZiAocnRtLT5ydG1fZmxhZ3MgJiBSVE1fRl9OT1RJRlkpCiAJCXJ0LT5ydF9mbGFncyB8PSBSVENGX05PVElGWTsKIApAQCAtMTYzMiwxMCArMTYzMiwxMCBAQAogCQlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJCWZvcihydCA9IHJjdV9kZXJlZmVyZW5jZV9iaChkbl9ydF9oYXNoX3RhYmxlW2hdLmNoYWluKSwgaWR4ID0gMDsKIAkJCXJ0OwotCQkJcnQgPSByY3VfZGVyZWZlcmVuY2VfYmgocnQtPnUuZHN0LmRuX25leHQpLCBpZHgrKykgeworCQkJcnQgPSByY3VfZGVyZWZlcmVuY2VfYmgocnQtPmRzdC5kbl9uZXh0KSwgaWR4KyspIHsKIAkJCWlmIChpZHggPCBzX2lkeCkKIAkJCQljb250aW51ZTsKLQkJCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKCZydC0+dS5kc3QpKTsKKwkJCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKCZydC0+ZHN0KSk7CiAJCQlpZiAoZG5fcnRfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV1JPVVRFLAogCQkJCQkxLCBOTE1fRl9NVUxUSSkgPD0gMCkgewpAQCAtMTY3OCw3ICsxNjc4LDcgQEAKIHsKIAlzdHJ1Y3QgZG5fcnRfY2FjaGVfaXRlcl9zdGF0ZSAqcyA9IHNlcS0+cHJpdmF0ZTsKIAotCXJ0ID0gcnQtPnUuZHN0LmRuX25leHQ7CisJcnQgPSBydC0+ZHN0LmRuX25leHQ7CiAJd2hpbGUoIXJ0KSB7CiAJCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCQlpZiAoLS1zLT5idWNrZXQgPCAwKQpAQCAtMTcxOSwxMiArMTcxOSwxMiBAQAogCWNoYXIgYnVmMVtETl9BU0NCVUZfTEVOXSwgYnVmMltETl9BU0NCVUZfTEVOXTsKIAogCXNlcV9wcmludGYoc2VxLCAiJS04cyAlLTdzICUtN3MgJTA0ZCAlMDRkICUwNGRcbiIsCi0JCQlydC0+dS5kc3QuZGV2ID8gcnQtPnUuZHN0LmRldi0+bmFtZSA6ICIqIiwKKwkJCXJ0LT5kc3QuZGV2ID8gcnQtPmRzdC5kZXYtPm5hbWUgOiAiKiIsCiAJCQlkbl9hZGRyMmFzYyhsZTE2X3RvX2NwdShydC0+cnRfZGFkZHIpLCBidWYxKSwKIAkJCWRuX2FkZHIyYXNjKGxlMTZfdG9fY3B1KHJ0LT5ydF9zYWRkciksIGJ1ZjIpLAotCQkJYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCksCi0JCQlydC0+dS5kc3QuX191c2UsCi0JCQkoaW50KSBkc3RfbWV0cmljKCZydC0+dS5kc3QsIFJUQVhfUlRUKSk7CisJCQlhdG9taWNfcmVhZCgmcnQtPmRzdC5fX3JlZmNudCksCisJCQlydC0+ZHN0Ll9fdXNlLAorCQkJKGludCkgZHN0X21ldHJpYygmcnQtPmRzdCwgUlRBWF9SVFQpKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RzYS9zbGF2ZS5jIGIvbmV0L2RzYS9zbGF2ZS5jCmluZGV4IDhmZGNhNTYuLjY0Y2EyYTYgMTAwNjQ0Ci0tLSBhL25ldC9kc2Evc2xhdmUuYworKysgYi9uZXQvZHNhL3NsYXZlLmMKQEAgLTE2NCwxMCArMTY0LDkgQEAKIHN0YXRpYyBpbnQgZHNhX3NsYXZlX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSA9IGlmX21paShpZnIpOwogCiAJaWYgKHAtPnBoeSAhPSBOVUxMKQotCQlyZXR1cm4gcGh5X21paV9pb2N0bChwLT5waHksIG1paV9kYXRhLCBjbWQpOworCQlyZXR1cm4gcGh5X21paV9pb2N0bChwLT5waHksIGlmciwgY21kKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMgYi9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCmluZGV4IDJhNWE4MDUuLmRjNTRiZDAgMTAwNjQ0Ci0tLSBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMKKysrIGIvbmV0L2Vjb25ldC9hZl9lY29uZXQuYwpAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBlY29uZXRfb3BzOwogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGVjb25ldF9za2xpc3Q7Ci1zdGF0aWMgREVGSU5FX1JXTE9DSyhlY29uZXRfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVjb25ldF9sb2NrKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoZWNvbmV0X211dGV4KTsKIAogLyogU2luY2UgdGhlcmUgYXJlIG9ubHkgMjU2IHBvc3NpYmxlIG5ldHdvcmsgbnVtYmVycyAob3IgZmV3ZXIsIGRlcGVuZHMKQEAgLTk4LDE2ICs5OCwxNiBAQAogCiBzdGF0aWMgdm9pZCBlY29uZXRfcmVtb3ZlX3NvY2tldChzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNvY2sgKnNrKQogewotCXdyaXRlX2xvY2tfYmgoJmVjb25ldF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmVjb25ldF9sb2NrKTsKIAlza19kZWxfbm9kZV9pbml0KHNrKTsKLQl3cml0ZV91bmxvY2tfYmgoJmVjb25ldF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmZWNvbmV0X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBlY29uZXRfaW5zZXJ0X3NvY2tldChzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNvY2sgKnNrKQogewotCXdyaXRlX2xvY2tfYmgoJmVjb25ldF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmVjb25ldF9sb2NrKTsKIAlza19hZGRfbm9kZShzaywgbGlzdCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZlY29uZXRfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmVjb25ldF9sb2NrKTsKIH0KIAogLyoKQEAgLTc4MiwxNSArNzgyLDE5IEBACiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCisJc3Bpbl9sb2NrKCZlY29uZXRfbG9jayk7CiAJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZlY29uZXRfc2tsaXN0KSB7CiAJCXN0cnVjdCBlY29uZXRfc29jayAqb3B0ID0gZWNfc2soc2spOwogCQlpZiAoKG9wdC0+cG9ydCA9PSBwb3J0IHx8IG9wdC0+cG9ydCA9PSAwKSAmJgogCQkgICAgKG9wdC0+c3RhdGlvbiA9PSBzdGF0aW9uIHx8IG9wdC0+c3RhdGlvbiA9PSAwKSAmJgotCQkgICAgKG9wdC0+bmV0ID09IG5ldCB8fCBvcHQtPm5ldCA9PSAwKSkKKwkJICAgIChvcHQtPm5ldCA9PSBuZXQgfHwgb3B0LT5uZXQgPT0gMCkpIHsKKwkJCXNvY2tfaG9sZChzayk7CiAJCQlnb3RvIGZvdW5kOworCQl9CiAJfQogCXNrID0gTlVMTDsKIGZvdW5kOgorCXNwaW5fdW5sb2NrKCZlY29uZXRfbG9jayk7CiAJcmV0dXJuIHNrOwogfQogCkBAIC04NTIsNyArODU2LDcgQEAKIHsKIAlzdHJ1Y3QgaXBoZHIgKmlwID0gaXBfaGRyKHNrYik7CiAJdW5zaWduZWQgY2hhciBzdG4gPSBudG9obChpcC0+c2FkZHIpICYgMHhmZjsKLQlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOwogCXN0cnVjdCBlY19kZXZpY2UgKmVkZXYgPSBza2ItPmRldi0+ZWNfcHRyOwogCkBAIC04ODIsMTAgKzg4NiwxMyBAQAogCX0KIAogCWF1bl9zZW5kX3Jlc3BvbnNlKGlwLT5zYWRkciwgYWgtPmhhbmRsZSwgMywgMCk7CisJc29ja19wdXQoc2spOwogCXJldHVybjsKIAogYmFkOgogCWF1bl9zZW5kX3Jlc3BvbnNlKGlwLT5zYWRkciwgYWgtPmhhbmRsZSwgNCwgMCk7CisJaWYgKHNrKQorCQlzb2NrX3B1dChzayk7CiB9CiAKIC8qCkBAIC0xMDUwLDcgKzEwNTcsNyBAQAogc3RhdGljIGludCBlY29uZXRfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKIHsKIAlzdHJ1Y3QgZWNfZnJhbWVoZHIgKmhkcjsKLQlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKIAlzdHJ1Y3QgZWNfZGV2aWNlICplZGV2ID0gZGV2LT5lY19wdHI7CiAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KGRldiksICZpbml0X25ldCkpCkBAIC0xMDg1LDEwICsxMDkyLDEyIEBACiAJaWYgKGVjX3F1ZXVlX3BhY2tldChzaywgc2tiLCBlZGV2LT5uZXQsIGhkci0+c3JjX3N0biwgaGRyLT5jYiwKIAkJCSAgICBoZHItPnBvcnQpKQogCQlnb3RvIGRyb3A7Ci0KKwlzb2NrX3B1dChzayk7CiAJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwogCiBkcm9wOgorCWlmIChzaykKKwkJc29ja19wdXQoc2spOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiBORVRfUlhfRFJPUDsKIH0KZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguYwppbmRleCA2MWVjMDMyLi4yMTVjODM5IDEwMDY0NAotLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmMKKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jCkBAIC0xNTgsNyArMTU4LDYgQEAKIF9fYmUxNiBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGhoZHIgKmV0aDsKLQl1bnNpZ25lZCBjaGFyICpyYXdwOwogCiAJc2tiLT5kZXYgPSBkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKQEAgLTE5OSwxNSArMTk4LDEzIEBACiAJaWYgKG50b2hzKGV0aC0+aF9wcm90bykgPj0gMTUzNikKIAkJcmV0dXJuIGV0aC0+aF9wcm90bzsKIAotCXJhd3AgPSBza2ItPmRhdGE7Ci0KIAkvKgogCSAqICAgICAgVGhpcyBpcyBhIG1hZ2ljIGhhY2sgdG8gc3BvdCBJUFggcGFja2V0cy4gT2xkZXIgTm92ZWxsIGJyZWFrcwogCSAqICAgICAgdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0IGFuIDgwMi4yIExMQwogCSAqICAgICAgbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJ3QgYSB1c2VkIDgwMi4yIFNTQVAvRFNBUC4gVGhpcwogCSAqICAgICAgd29uJ3Qgd29yayBmb3IgZmF1bHQgdG9sZXJhbnQgbmV0d2FyZSBidXQgZG9lcyBmb3IgdGhlIHJlc3QuCiAJICovCi0JaWYgKCoodW5zaWduZWQgc2hvcnQgKilyYXdwID09IDB4RkZGRikKKwlpZiAoc2tiLT5sZW4gPj0gMiAmJiAqKHVuc2lnbmVkIHNob3J0ICopKHNrYi0+ZGF0YSkgPT0gMHhGRkZGKQogCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOwogCiAJLyoKZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9wZTIuYyBiL25ldC9ldGhlcm5ldC9wZTIuYwppbmRleCBlYjAwNzk2Li44NWQ1NzRhIDEwMDY0NAotLS0gYS9uZXQvZXRoZXJuZXQvcGUyLmMKKysrIGIvbmV0L2V0aGVybmV0L3BlMi5jCkBAIC0yOCwxMSArMjgsMTAgQEAKIAogCXJldHVybiBwcm90bzsKIH0KK0VYUE9SVF9TWU1CT0wobWFrZV9FSUlfY2xpZW50KTsKIAogdm9pZCBkZXN0cm95X0VJSV9jbGllbnQoc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkbCkKIHsKIAlrZnJlZShkbCk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZGVzdHJveV9FSUlfY2xpZW50KTsKLUVYUE9SVF9TWU1CT0wobWFrZV9FSUlfY2xpZW50KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCA1NTFjZTU2Li42YTExMDBjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC0zNTUsNiArMzU1LDggQEAKIAlpbmV0ID0gaW5ldF9zayhzayk7CiAJaW5ldC0+aXNfaWNzayA9IChJTkVUX1BST1RPU1dfSUNTSyAmIGFuc3dlcl9mbGFncykgIT0gMDsKIAorCWluZXQtPm5vZGVmcmFnID0gMDsKKwogCWlmIChTT0NLX1JBVyA9PSBzb2NrLT50eXBlKSB7CiAJCWluZXQtPmluZXRfbnVtID0gcHJvdG9jb2w7CiAJCWlmIChJUFBST1RPX1JBVyA9PSBwcm90b2NvbCkKQEAgLTcyNSwyOCArNzI3LDMxIEBACiAJc29ja19ycHNfcmVjb3JkX2Zsb3coc2spOwogCiAJLyogV2UgbWF5IG5lZWQgdG8gYmluZCB0aGUgc29ja2V0LiAqLwotCWlmICghaW5ldF9zayhzayktPmluZXRfbnVtICYmIGluZXRfYXV0b2JpbmQoc2spKQorCWlmICghaW5ldF9zayhzayktPmluZXRfbnVtICYmICFzay0+c2tfcHJvdC0+bm9fYXV0b2JpbmQgJiYKKwkgICAgaW5ldF9hdXRvYmluZChzaykpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJcmV0dXJuIHNrLT5za19wcm90LT5zZW5kbXNnKGlvY2IsIHNrLCBtc2csIHNpemUpOwogfQogRVhQT1JUX1NZTUJPTChpbmV0X3NlbmRtc2cpOwogCi1zdGF0aWMgc3NpemVfdCBpbmV0X3NlbmRwYWdlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LAotCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3NpemVfdCBpbmV0X3NlbmRwYWdlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LAorCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCiAJc29ja19ycHNfcmVjb3JkX2Zsb3coc2spOwogCiAJLyogV2UgbWF5IG5lZWQgdG8gYmluZCB0aGUgc29ja2V0LiAqLwotCWlmICghaW5ldF9zayhzayktPmluZXRfbnVtICYmIGluZXRfYXV0b2JpbmQoc2spKQorCWlmICghaW5ldF9zayhzayktPmluZXRfbnVtICYmICFzay0+c2tfcHJvdC0+bm9fYXV0b2JpbmQgJiYKKwkgICAgaW5ldF9hdXRvYmluZChzaykpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKHNrLT5za19wcm90LT5zZW5kcGFnZSkKIAkJcmV0dXJuIHNrLT5za19wcm90LT5zZW5kcGFnZShzaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiAJcmV0dXJuIHNvY2tfbm9fc2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKGluZXRfc2VuZHBhZ2UpOwogCiBpbnQgaW5ldF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAogCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKQEAgLTg5MiwxMCArODk3LDEwIEBACiAJLnNodXRkb3duCSAgID0gaW5ldF9zaHV0ZG93biwKIAkuc2V0c29ja29wdAkgICA9IHNvY2tfY29tbW9uX3NldHNvY2tvcHQsCiAJLmdldHNvY2tvcHQJICAgPSBzb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LAotCS5zZW5kbXNnCSAgID0gdGNwX3NlbmRtc2csCisJLnNlbmRtc2cJICAgPSBpbmV0X3NlbmRtc2csCiAJLnJlY3Ztc2cJICAgPSBpbmV0X3JlY3Ztc2csCiAJLm1tYXAJCSAgID0gc29ja19ub19tbWFwLAotCS5zZW5kcGFnZQkgICA9IHRjcF9zZW5kcGFnZSwKKwkuc2VuZHBhZ2UJICAgPSBpbmV0X3NlbmRwYWdlLAogCS5zcGxpY2VfcmVhZAkgICA9IHRjcF9zcGxpY2VfcmVhZCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3NvY2tfY29tbW9uX3NldHNvY2tvcHQsCkBAIC0xMTAwLDcgKzExMDUsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlza19zZXR1cF9jYXBzKHNrLCAmcnQtPnUuZHN0KTsKKwlza19zZXR1cF9jYXBzKHNrLCAmcnQtPmRzdCk7CiAKIAluZXdfc2FkZHIgPSBydC0+cnRfc3JjOwogCkBAIC0xMTY2LDcgKzExNzEsNyBAQAogCWVyciA9IGlwX3JvdXRlX291dHB1dF9mbG93KHNvY2tfbmV0KHNrKSwgJnJ0LCAmZmwsIHNrLCAwKTsKIH0KIAlpZiAoIWVycikKLQkJc2tfc2V0dXBfY2FwcyhzaywgJnJ0LT51LmRzdCk7CisJCXNrX3NldHVwX2NhcHMoc2ssICZydC0+ZHN0KTsKIAllbHNlIHsKIAkJLyogUm91dGluZyBmYWlsZWQuLi4gKi8KIAkJc2stPnNrX3JvdXRlX2NhcHMgPSAwOwpAQCAtMTQyNSwxMyArMTQzMCw0OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9mb2xkX2ZpZWxkKTsKIAotaW50IHNubXBfbWliX2luaXQodm9pZCBfX3BlcmNwdSAqcHRyWzJdLCBzaXplX3QgbWlic2l6ZSkKKyNpZiBCSVRTX1BFUl9MT05HPT0zMgorCit1NjQgc25tcF9mb2xkX2ZpZWxkNjQodm9pZCBfX3BlcmNwdSAqbWliW10sIGludCBvZmZ0LCBzaXplX3Qgc3luY3Bfb2Zmc2V0KQoreworCXU2NCByZXMgPSAwOworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXZvaWQgKmJocHRyLCAqdXNlcnB0cjsKKwkJc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcDsKKwkJdTY0IHZfYmgsIHZfdXNlcjsKKwkJdW5zaWduZWQgaW50IHN0YXJ0OworCisJCS8qIGZpcnN0IG1pYiB1c2VkIGJ5IHNvZnRpcnEgY29udGV4dCwgd2UgbXVzdCB1c2UgX2JoKCkgYWNjZXNzb3JzICovCisJCWJocHRyID0gcGVyX2NwdV9wdHIoU05NUF9TVEFUX0JIUFRSKG1pYiksIGNwdSk7CisJCXN5bmNwID0gKHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqKShiaHB0ciArIHN5bmNwX29mZnNldCk7CisJCWRvIHsKKwkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKHN5bmNwKTsKKwkJCXZfYmggPSAqKCgodTY0ICopIGJocHRyKSArIG9mZnQpOworCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfYmgoc3luY3AsIHN0YXJ0KSk7CisKKwkJLyogc2Vjb25kIG1pYiB1c2VkIGluIFVTRVIgY29udGV4dCAqLworCQl1c2VycHRyID0gcGVyX2NwdV9wdHIoU05NUF9TVEFUX1VTUlBUUihtaWIpLCBjcHUpOworCQlzeW5jcCA9IChzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKikodXNlcnB0ciArIHN5bmNwX29mZnNldCk7CisJCWRvIHsKKwkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKHN5bmNwKTsKKwkJCXZfdXNlciA9ICooKCh1NjQgKikgdXNlcnB0cikgKyBvZmZ0KTsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KHN5bmNwLCBzdGFydCkpOworCisJCXJlcyArPSB2X2JoICsgdl91c2VyOworCX0KKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9mb2xkX2ZpZWxkNjQpOworI2VuZGlmCisKK2ludCBzbm1wX21pYl9pbml0KHZvaWQgX19wZXJjcHUgKnB0clsyXSwgc2l6ZV90IG1pYnNpemUsIHNpemVfdCBhbGlnbikKIHsKIAlCVUdfT04ocHRyID09IE5VTEwpOwotCXB0clswXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUsIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcpKTsKKwlwdHJbMF0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplLCBhbGlnbik7CiAJaWYgKCFwdHJbMF0pCiAJCWdvdG8gZXJyMDsKLQlwdHJbMV0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplLCBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKSk7CisJcHRyWzFdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSwgYWxpZ24pOwogCWlmICghcHRyWzFdKQogCQlnb3RvIGVycjE7CiAJcmV0dXJuIDA7CkBAIC0xNDg4LDI1ICsxNTI5LDMyIEBACiBzdGF0aWMgX19uZXRfaW5pdCBpbnQgaXB2NF9taWJfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0KQogewogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnRjcF9zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IHRjcF9taWIpKSA8IDApCisJCQkgIHNpemVvZihzdHJ1Y3QgdGNwX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCB0Y3BfbWliKSkgPCAwKQogCQlnb3RvIGVycl90Y3BfbWliOwogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmlwX3N0YXRpc3RpY3MsCi0JCQkgIHNpemVvZihzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCisJCQkgIHNpemVvZihzdHJ1Y3QgaXBzdGF0c19taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCiAJCWdvdG8gZXJyX2lwX21pYjsKIAlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5uZXRfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBsaW51eF9taWIpKSA8IDApCisJCQkgIHNpemVvZihzdHJ1Y3QgbGludXhfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGxpbnV4X21pYikpIDwgMCkKIAkJZ290byBlcnJfbmV0X21pYjsKIAlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQorCQkJICBzaXplb2Yoc3RydWN0IHVkcF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKIAkJZ290byBlcnJfdWRwX21pYjsKIAlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MsCi0JCQkgIHNpemVvZihzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCiAJCWdvdG8gZXJyX3VkcGxpdGVfbWliOwogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXBfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wX21pYikpIDwgMCkKKwkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wX21pYikpIDwgMCkKIAkJZ290byBlcnJfaWNtcF9taWI7CiAJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IGljbXBtc2dfbWliKSkgPCAwKQorCQkJICBzaXplb2Yoc3RydWN0IGljbXBtc2dfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXBtc2dfbWliKSkgPCAwKQogCQlnb3RvIGVycl9pY21wbXNnX21pYjsKIAogCXRjcF9taWJfaW5pdChuZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYXJwLmMgYi9uZXQvaXB2NC9hcnAuYwppbmRleCBmMDk0Yjc1Li45NmMxOTU1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hcnAuYworKysgYi9uZXQvaXB2NC9hcnAuYwpAQCAtMTE2LDYgKzExNiw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQVRNX0NMSVApIHx8IGRlZmluZWQoQ09ORklHX0FUTV9DTElQX01PRFVMRSkKICNpbmNsdWRlIDxuZXQvYXRtY2xpcC5oPgogc3RydWN0IG5laWdoX3RhYmxlICpjbGlwX3RibF9ob29rOworRVhQT1JUX1NZTUJPTChjbGlwX3RibF9ob29rKTsKICNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTY5LDYgKzE3MCw3IEBACiAJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKIAkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKIH07CitFWFBPUlRfU1lNQk9MKGFycF9icm9rZW5fb3BzKTsKIAogc3RydWN0IG5laWdoX3RhYmxlIGFycF90YmwgPSB7CiAJLmZhbWlseSA9CUFGX0lORVQsCkBAIC0xOTgsNiArMjAwLDcgQEAKIAkuZ2NfdGhyZXNoMiA9CTUxMiwKIAkuZ2NfdGhyZXNoMyA9CTEwMjQsCiB9OworRVhQT1JUX1NZTUJPTChhcnBfdGJsKTsKIAogaW50IGFycF9tY19tYXAoX19iZTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcikKIHsKQEAgLTMzMywxMSArMzM2LDE0IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJX19iZTMyIHRhcmdldCA9ICooX19iZTMyKiluZWlnaC0+cHJpbWFyeV9rZXk7CiAJaW50IHByb2JlcyA9IGF0b21pY19yZWFkKCZuZWlnaC0+cHJvYmVzKTsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwogCi0JaWYgKCFpbl9kZXYpCisJcmN1X3JlYWRfbG9jaygpOworCWluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKKwlpZiAoIWluX2RldikgeworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwotCisJfQogCXN3aXRjaCAoSU5fREVWX0FSUF9BTk5PVU5DRShpbl9kZXYpKSB7CiAJZGVmYXVsdDoKIAljYXNlIDA6CQkvKiBCeSBkZWZhdWx0IGFubm91bmNlIGFueSBsb2NhbCBJUCAqLwpAQCAtMzU4LDkgKzM2NCw4IEBACiAJY2FzZSAyOgkJLyogQXZvaWQgc2Vjb25kYXJ5IElQcywgZ2V0IGEgcHJpbWFyeS9wcmVmZXJyZWQgb25lICovCiAJCWJyZWFrOwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChpbl9kZXYpCi0JCWluX2Rldl9wdXQoaW5fZGV2KTsKIAlpZiAoIXNhZGRyKQogCQlzYWRkciA9IGluZXRfc2VsZWN0X2FkZHIoZGV2LCB0YXJnZXQsIFJUX1NDT1BFX0xJTkspOwogCkBAIC00MjcsNyArNDMyLDcgQEAKIAogCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJnJ0LCAmZmwpIDwgMCkKIAkJcmV0dXJuIDE7Ci0JaWYgKHJ0LT51LmRzdC5kZXYgIT0gZGV2KSB7CisJaWYgKHJ0LT5kc3QuZGV2ICE9IGRldikgewogCQlORVRfSU5DX1NUQVRTX0JIKG5ldCwgTElOVVhfTUlCX0FSUEZJTFRFUik7CiAJCWZsYWcgPSAxOwogCX0KQEAgLTQ5Nyw2ICs1MDIsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMTsKIH0KK0VYUE9SVF9TWU1CT0woYXJwX2ZpbmQpOwogCiAvKiBFTkQgT0YgT0JTT0xFVEUgRlVOQ1RJT05TICovCiAKQEAgLTUzMiw3ICs1MzgsNyBAQAogCXN0cnVjdCBpbl9kZXZpY2UgKm91dF9kZXY7CiAJaW50IGltaSwgb21pID0gLTE7CiAKLQlpZiAocnQtPnUuZHN0LmRldiA9PSBkZXYpCisJaWYgKHJ0LT5kc3QuZGV2ID09IGRldikKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIUlOX0RFVl9QUk9YWV9BUlAoaW5fZGV2KSkKQEAgLTU0NSwxMCArNTUxLDEwIEBACiAKIAkvKiBwbGFjZSB0byBjaGVjayBmb3IgcHJveHlfYXJwIGZvciByb3V0ZXMgKi8KIAotCWlmICgob3V0X2RldiA9IGluX2Rldl9nZXQocnQtPnUuZHN0LmRldikpICE9IE5VTEwpIHsKKwlvdXRfZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShydC0+ZHN0LmRldik7CisJaWYgKG91dF9kZXYpCiAJCW9taSA9IElOX0RFVl9NRURJVU1fSUQob3V0X2Rldik7Ci0JCWluX2Rldl9wdXQob3V0X2Rldik7Ci0JfQorCiAJcmV0dXJuIChvbWkgIT0gaW1pICYmIG9taSAhPSAtMSk7CiB9CiAKQEAgLTU3Niw3ICs1ODIsNyBAQAogCQkJCV9fYmUzMiBzaXAsIF9fYmUzMiB0aXApCiB7CiAJLyogUHJpdmF0ZSBWTEFOIGlzIG9ubHkgY29uY2VybmVkIGFib3V0IHRoZSBzYW1lIGV0aGVybmV0IHNlZ21lbnQgKi8KLQlpZiAocnQtPnUuZHN0LmRldiAhPSBkZXYpCisJaWYgKHJ0LT5kc3QuZGV2ICE9IGRldikKIAkJcmV0dXJuIDA7CiAKIAkvKiBEb24ndCByZXBseSBvbiBzZWxmIHByb2JlcyAob2Z0ZW4gZG9uZSBieSB3aW5kb3d6IGJveGVzKSovCkBAIC02OTgsNiArNzA0LDcgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woYXJwX2NyZWF0ZSk7CiAKIC8qCiAgKglTZW5kIGFuIGFycCBwYWNrZXQuCkBAIC03MDcsNiArNzE0LDcgQEAKIAkvKiBTZW5kIGl0IG9mZiwgbWF5YmUgZmlsdGVyIGl0IHVzaW5nIGZpcmV3YWxsaW5nIGZpcnN0LiAgKi8KIAlORl9IT09LKE5GUFJPVE9fQVJQLCBORl9BUlBfT1VULCBza2IsIE5VTEwsIHNrYi0+ZGV2LCBkZXZfcXVldWVfeG1pdCk7CiB9CitFWFBPUlRfU1lNQk9MKGFycF94bWl0KTsKIAogLyoKICAqCUNyZWF0ZSBhbmQgc2VuZCBhbiBhcnAgcGFja2V0LgpAQCAtNzMzLDYgKzc0MSw3IEBACiAKIAlhcnBfeG1pdChza2IpOwogfQorRVhQT1JUX1NZTUJPTChhcnBfc2VuZCk7CiAKIC8qCiAgKglQcm9jZXNzIGFuIGFycCByZXF1ZXN0LgpAQCAtNzQxLDcgKzc1MCw3IEBACiBzdGF0aWMgaW50IGFycF9wcm9jZXNzKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwotCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGluX2Rldl9nZXQoZGV2KTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldik7CiAJc3RydWN0IGFycGhkciAqYXJwOwogCXVuc2lnbmVkIGNoYXIgKmFycF9wdHI7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CkBAIC04OTAsNyArODk5LDYgQEAKIAkJCQkJYXJwX3NlbmQoQVJQT1BfUkVQTFksRVRIX1BfQVJQLHNpcCxkZXYsdGlwLHNoYSxkZXYtPmRldl9hZGRyLHNoYSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJcG5laWdoX2VucXVldWUoJmFycF90YmwsIGluX2Rldi0+YXJwX3Bhcm1zLCBza2IpOwotCQkJCQlpbl9kZXZfcHV0KGluX2Rldik7CiAJCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCQlnb3RvIG91dDsKQEAgLTkzNiw4ICs5NDQsNiBAQAogCX0KIAogb3V0OgotCWlmIChpbl9kZXYpCi0JCWluX2Rldl9wdXQoaW5fZGV2KTsKIAljb25zdW1lX3NrYihza2IpOwogCXJldHVybiAwOwogfQpAQCAtMTA0NSw3ICsxMDUxLDcgQEAKIAkJc3RydWN0IHJ0YWJsZSAqIHJ0OwogCQlpZiAoKGVyciA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmcnQsICZmbCkpICE9IDApCiAJCQlyZXR1cm4gZXJyOwotCQlkZXYgPSBydC0+dS5kc3QuZGV2OworCQlkZXYgPSBydC0+ZHN0LmRldjsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJaWYgKCFkZXYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNTIsNyArMTE1OCw3IEBACiAJCXN0cnVjdCBydGFibGUgKiBydDsKIAkJaWYgKChlcnIgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJnJ0LCAmZmwpKSAhPSAwKQogCQkJcmV0dXJuIGVycjsKLQkJZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJZGV2ID0gcnQtPmRzdC5kZXY7CiAJCWlwX3J0X3B1dChydCk7CiAJCWlmICghZGV2KQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDUzLDE0ICsxNDU5LDMgQEAKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0KLUVYUE9SVF9TWU1CT0woYXJwX2Jyb2tlbl9vcHMpOwotRVhQT1JUX1NZTUJPTChhcnBfZmluZCk7Ci1FWFBPUlRfU1lNQk9MKGFycF9jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChhcnBfeG1pdCk7Ci1FWFBPUlRfU1lNQk9MKGFycF9zZW5kKTsKLUVYUE9SVF9TWU1CT0woYXJwX3RibCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19BVE1fQ0xJUCkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0NMSVBfTU9EVUxFKQotRVhQT1JUX1NZTUJPTChjbGlwX3RibF9ob29rKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGF0YWdyYW0uYyBiL25ldC9pcHY0L2RhdGFncmFtLmMKaW5kZXggZmIyNDY1OC4uZjA1NTA5NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2NC9kYXRhZ3JhbS5jCkBAIC02OSw5ICs2OSw3IEBACiAJc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOwogCWluZXQtPmluZXRfaWQgPSBqaWZmaWVzOwogCi0Jc2tfZHN0X3NldChzaywgJnJ0LT51LmRzdCk7CisJc2tfZHN0X3NldChzaywgJnJ0LT5kc3QpOwogCXJldHVybigwKTsKIH0KLQogRVhQT1JUX1NZTUJPTChpcDRfZGF0YWdyYW1fY29ubmVjdCk7Ci0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCAzODJiYzc2Li5kYTE0YzQ5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0xMDgxLDYgKzEwODEsNyBAQAogCQl9CiAJCWlwX21jX3VwKGluX2Rldik7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgTkVUREVWX05PVElGWV9QRUVSUzoKIAljYXNlIE5FVERFVl9DSEFOR0VBRERSOgogCQkvKiBTZW5kIGdyYXR1aXRvdXMgQVJQIHRvIG5vdGlmeSBvZiBsaW5rIGNoYW5nZSAqLwogCQlpZiAoSU5fREVWX0FSUF9OT1RJRlkoaW5fZGV2KSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwppbmRleCA0ZjBlZDQ1Li5hNDM5Njg5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYworKysgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwpAQCAtMTc1LDYgKzE3NSw3IEBACiAJZmliX3Jlc19wdXQoJnJlcyk7CiAJcmV0dXJuIGRldjsKIH0KK0VYUE9SVF9TWU1CT0woaXBfZGV2X2ZpbmQpOwogCiAvKgogICogRmluZCBhZGRyZXNzIHR5cGUgYXMgaWYgb25seSAiZGV2IiB3YXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLiBJZgpAQCAtMjE0LDEyICsyMTUsMTQgQEAKIHsKIAlyZXR1cm4gX19pbmV0X2Rldl9hZGRyX3R5cGUobmV0LCBOVUxMLCBhZGRyKTsKIH0KK0VYUE9SVF9TWU1CT0woaW5ldF9hZGRyX3R5cGUpOwogCiB1bnNpZ25lZCBpbnQgaW5ldF9kZXZfYWRkcl90eXBlKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlfX2JlMzIgYWRkcikKIHsKICAgICAgICByZXR1cm4gX19pbmV0X2Rldl9hZGRyX3R5cGUobmV0LCBkZXYsIGFkZHIpOwogfQorRVhQT1JUX1NZTUJPTChpbmV0X2Rldl9hZGRyX3R5cGUpOwogCiAvKiBHaXZlbiAocGFja2V0IHNvdXJjZSwgaW5wdXQgaW50ZXJmYWNlKSBhbmQgb3B0aW9uYWwgKGRzdCwgb2lmLCB0b3MpOgogICAgLSAobWFpbikgY2hlY2ssIHRoYXQgc291cmNlIGlzIHZhbGlkIGkuZS4gbm90IGJyb2FkY2FzdCBvciBvdXIgbG9jYWwKQEAgLTI4NCw3ICsyODcsNyBAQAogCWlmIChub19hZGRyKQogCQlnb3RvIGxhc3RfcmVzb3J0OwogCWlmIChycGYgPT0gMSkKLQkJZ290byBlX2ludmFsOworCQlnb3RvIGVfcnBmOwogCWZsLm9pZiA9IGRldi0+aWZpbmRleDsKIAogCXJldCA9IDA7CkBAIC0yOTksNyArMzAyLDcgQEAKIAogbGFzdF9yZXNvcnQ6CiAJaWYgKHJwZikKLQkJZ290byBlX2ludmFsOworCQlnb3RvIGVfcnBmOwogCSpzcGVjX2RzdCA9IGluZXRfc2VsZWN0X2FkZHIoZGV2LCAwLCBSVF9TQ09QRV9VTklWRVJTRSk7CiAJKml0YWcgPSAwOwogCXJldHVybiAwOwpAQCAtMzA4LDYgKzMxMSw4IEBACiAJZmliX3Jlc19wdXQoJnJlcyk7CiBlX2ludmFsOgogCXJldHVybiAtRUlOVkFMOworZV9ycGY6CisJcmV0dXJuIC1FWERFVjsKIH0KIAogc3RhdGljIGlubGluZSBfX2JlMzIgc2tfZXh0cmFjdF9hZGRyKHN0cnVjdCBzb2NrYWRkciAqYWRkcikKQEAgLTEwNzUsNyArMTA4MCwzIEBACiAKIAlmaWJfaGFzaF9pbml0KCk7CiB9Ci0KLUVYUE9SVF9TWU1CT0woaW5ldF9hZGRyX3R5cGUpOwotRVhQT1JUX1NZTUJPTChpbmV0X2Rldl9hZGRyX3R5cGUpOwotRVhQT1JUX1NZTUJPTChpcF9kZXZfZmluZCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pY21wLmMgYi9uZXQvaXB2NC9pY21wLmMKaW5kZXggZDY1ZTkyMTUuLmEwZDg0N2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTE4MSw2ICsxODEsNyBAQAogCQkuZmF0YWwgPSAxLAogCX0sCiB9OworRVhQT1JUX1NZTUJPTChpY21wX2Vycl9jb252ZXJ0KTsKIAogLyoKICAqCUlDTVAgY29udHJvbCBhcnJheS4gVGhpcyBzcGVjaWZpZXMgd2hhdCB0byBkbyB3aXRoIGVhY2ggSUNNUC4KQEAgLTI2NywxMSArMjY4LDEyIEBACiAJZHN0LT5yYXRlX3Rva2VucyA9IHRva2VuOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0woeHJsaW1fYWxsb3cpOwogCiBzdGF0aWMgaW5saW5lIGludCBpY21wdjRfeHJsaW1fYWxsb3coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgcnRhYmxlICpydCwKIAkJaW50IHR5cGUsIGludCBjb2RlKQogewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9ICZydC0+dS5kc3Q7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gJnJ0LT5kc3Q7CiAJaW50IHJjID0gMTsKIAogCWlmICh0eXBlID4gTlJfSUNNUF9UWVBFUykKQEAgLTMyNyw3ICszMjksNyBAQAogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jc2sgPSBpY21wX3NrKGRldl9uZXQoKCpydCktPnUuZHN0LmRldikpOworCXNrID0gaWNtcF9zayhkZXZfbmV0KCgqcnQpLT5kc3QuZGV2KSk7CiAJaWYgKGlwX2FwcGVuZF9kYXRhKHNrLCBpY21wX2dsdWVfYml0cywgaWNtcF9wYXJhbSwKIAkJCSAgIGljbXBfcGFyYW0tPmRhdGFfbGVuK2ljbXBfcGFyYW0tPmhlYWRfbGVuLAogCQkJICAgaWNtcF9wYXJhbS0+aGVhZF9sZW4sCkBAIC0zNTksNyArMzYxLDcgQEAKIHsKIAlzdHJ1Y3QgaXBjbV9jb29raWUgaXBjOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gc2tiX3J0YWJsZShza2IpOwotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQocnQtPnUuZHN0LmRldik7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChydC0+ZHN0LmRldik7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CiAJX19iZTMyIGRhZGRyOwpAQCAtNDI3LDcgKzQyOSw3IEBACiAKIAlpZiAoIXJ0KQogCQlnb3RvIG91dDsKLQluZXQgPSBkZXZfbmV0KHJ0LT51LmRzdC5kZXYpOworCW5ldCA9IGRldl9uZXQocnQtPmRzdC5kZXYpOwogCiAJLyoKIAkgKglGaW5kIHRoZSBvcmlnaW5hbCBoZWFkZXIuIEl0IGlzIGV4cGVjdGVkIHRvIGJlIHZhbGlkLCBvZiBjb3Vyc2UuCkBAIC01OTYsOSArNTk4LDkgQEAKIAkJCS8qIFVnaCEgKi8KIAkJCW9yZWZkc3QgPSBza2JfaW4tPl9za2JfcmVmZHN0OyAvKiBzYXZlIG9sZCByZWZkc3QgKi8KIAkJCWVyciA9IGlwX3JvdXRlX2lucHV0KHNrYl9pbiwgZmwuZmw0X2RzdCwgZmwuZmw0X3NyYywKLQkJCQkJICAgICBSVF9UT1ModG9zKSwgcnQyLT51LmRzdC5kZXYpOworCQkJCQkgICAgIFJUX1RPUyh0b3MpLCBydDItPmRzdC5kZXYpOwogCi0JCQlkc3RfcmVsZWFzZSgmcnQyLT51LmRzdCk7CisJCQlkc3RfcmVsZWFzZSgmcnQyLT5kc3QpOwogCQkJcnQyID0gc2tiX3J0YWJsZShza2JfaW4pOwogCQkJc2tiX2luLT5fc2tiX3JlZmRzdCA9IG9yZWZkc3Q7IC8qIHJlc3RvcmUgb2xkIHJlZmRzdCAqLwogCQl9CkBAIC02MTAsNyArNjEyLDcgQEAKIAkJCQkgIFhGUk1fTE9PS1VQX0lDTVApOwogCQlzd2l0Y2ggKGVycikgewogCQljYXNlIDA6Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJCXJ0ID0gcnQyOwogCQkJYnJlYWs7CiAJCWNhc2UgLUVQRVJNOgpAQCAtNjI5LDcgKzYzMSw3IEBACiAKIAkvKiBSRkMgc2F5cyByZXR1cm4gYXMgbXVjaCBhcyB3ZSBjYW4gd2l0aG91dCBleGNlZWRpbmcgNTc2IGJ5dGVzLiAqLwogCi0Jcm9vbSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJcm9vbSA9IGRzdF9tdHUoJnJ0LT5kc3QpOwogCWlmIChyb29tID4gNTc2KQogCQlyb29tID0gNTc2OwogCXJvb20gLT0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBpY21wX3BhcmFtLnJlcGx5b3B0cy5vcHRsZW47CkBAIC02NDcsNiArNjQ5LDcgQEAKIAlpY21wX3htaXRfdW5sb2NrKHNrKTsKIG91dDo7CiB9CitFWFBPUlRfU1lNQk9MKGljbXBfc2VuZCk7CiAKIAogLyoKQEAgLTkyNSw2ICs5MjgsNyBAQAogLyoKICAqIFJGQzE4MTIgKDQuMy4zLjkpLglBIHJvdXRlciBTSE9VTEQgbGlzdGVuIGFsbCByZXBsaWVzLCBhbmQgY29tcGxhaW4KICAqCQkJbG91ZGx5IGlmIGFuIGluY29uc2lzdGVuY3kgaXMgZm91bmQuCisgKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrKCkKICAqLwogCiBzdGF0aWMgdm9pZCBpY21wX2FkZHJlc3NfcmVwbHkoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTkzNSwxMiArOTM5LDEyIEBACiAJc3RydWN0IGluX2lmYWRkciAqaWZhOwogCiAJaWYgKHNrYi0+bGVuIDwgNCB8fCAhKHJ0LT5ydF9mbGFncyZSVENGX0RJUkVDVFNSQykpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKLQlpbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShkZXYpOwogCWlmICghaW5fZGV2KQotCQlnb3RvIG91dDsKLQlyY3VfcmVhZF9sb2NrKCk7CisJCXJldHVybjsKKwogCWlmIChpbl9kZXYtPmlmYV9saXN0ICYmCiAJICAgIElOX0RFVl9MT0dfTUFSVElBTlMoaW5fZGV2KSAmJgogCSAgICBJTl9ERVZfRk9SV0FSRChpbl9kZXYpKSB7CkBAIC05NTgsOSArOTYyLDYgQEAKIAkJCSAgICAgICBtcCwgZGV2LT5uYW1lLCAmcnQtPnJ0X3NyYyk7CiAJCX0KIAl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JaW5fZGV2X3B1dChpbl9kZXYpOwotb3V0OjsKIH0KIAogc3RhdGljIHZvaWQgaWNtcF9kaXNjYXJkKHN0cnVjdCBza19idWZmICpza2IpCkBAIC05NzQsNyArOTc1LDcgQEAKIHsKIAlzdHJ1Y3QgaWNtcGhkciAqaWNtcGg7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSBza2JfcnRhYmxlKHNrYik7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChydC0+dS5kc3QuZGV2KTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHJ0LT5kc3QuZGV2KTsKIAogCWlmICgheGZybTRfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7CiAJCXN0cnVjdCBzZWNfcGF0aCAqc3AgPSBza2Jfc2VjX3BhdGgoc2tiKTsKQEAgLTEyMTYsNyArMTIxNywzIEBACiB7CiAJcmV0dXJuIHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmljbXBfc2tfb3BzKTsKIH0KLQotRVhQT1JUX1NZTUJPTChpY21wX2Vycl9jb252ZXJ0KTsKLUVYUE9SVF9TWU1CT0woaWNtcF9zZW5kKTsKLUVYUE9SVF9TWU1CT0woeHJsaW1fYWxsb3cpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDVmZmY4NjUuLmExYWQwZTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCXNrYi0+ZGV2ID0gZGV2OwogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKQEAgLTMzMCw3ICszMzAsNyBAQAogCXBpcC0+c2FkZHIgICAgPSBydC0+cnRfc3JjOwogCXBpcC0+cHJvdG9jb2wgPSBJUFBST1RPX0lHTVA7CiAJcGlwLT50b3RfbGVuICA9IDA7CS8qIGZpbGxlZCBpbiBsYXRlciAqLwotCWlwX3NlbGVjdF9pZGVudChwaXAsICZydC0+dS5kc3QsIE5VTEwpOworCWlwX3NlbGVjdF9pZGVudChwaXAsICZydC0+ZHN0LCBOVUxMKTsKIAkoKHU4KikmcGlwWzFdKVswXSA9IElQT1BUX1JBOwogCSgodTgqKSZwaXBbMV0pWzFdID0gNDsKIAkoKHU4KikmcGlwWzFdKVsyXSA9IDA7CkBAIC02NjAsNyArNjYwLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwogCkBAIC02NzYsNyArNjc2LDcgQEAKIAlpcGgtPmRhZGRyICAgID0gZHN0OwogCWlwaC0+c2FkZHIgICAgPSBydC0+cnRfc3JjOwogCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0lHTVA7Ci0JaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgTlVMTCk7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT5kc3QsIE5VTEwpOwogCSgodTgqKSZpcGhbMV0pWzBdID0gSVBPUFRfUkE7CiAJKCh1OCopJmlwaFsxXSlbMV0gPSA0OwogCSgodTgqKSZpcGhbMV0pWzJdID0gMDsKQEAgLTkxNiwxOCArOTE2LDE5IEBACiAJcmVhZF91bmxvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKIH0KIAorLyogY2FsbGVkIGluIHJjdV9yZWFkX2xvY2soKSBzZWN0aW9uICovCiBpbnQgaWdtcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAkvKiBUaGlzIGJhc2ljYWxseSBmb2xsb3dzIHRoZSBzcGVjIGxpbmUgYnkgbGluZSAtLSBzZWUgUkZDMTExMiAqLwogCXN0cnVjdCBpZ21waGRyICppaDsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KHNrYi0+ZGV2KTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KHNrYi0+ZGV2KTsKIAlpbnQgbGVuID0gc2tiLT5sZW47CiAKIAlpZiAoaW5fZGV2ID09IE5VTEwpCiAJCWdvdG8gZHJvcDsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWdtcGhkcikpKQotCQlnb3RvIGRyb3BfcmVmOworCQlnb3RvIGRyb3A7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKQEAgLTkzNyw3ICs5MzgsNyBAQAogCWNhc2UgQ0hFQ0tTVU1fTk9ORToKIAkJc2tiLT5jc3VtID0gMDsKIAkJaWYgKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCi0JCQlnb3RvIGRyb3BfcmVmOworCQkJZ290byBkcm9wOwogCX0KIAogCWloID0gaWdtcF9oZHIoc2tiKTsKQEAgLTk1Nyw3ICs5NTgsNiBAQAogCQlicmVhazsKIAljYXNlIElHTVBfUElNOgogI2lmZGVmIENPTkZJR19JUF9QSU1TTV9WMQotCQlpbl9kZXZfcHV0KGluX2Rldik7CiAJCXJldHVybiBwaW1fcmN2X3YxKHNrYik7CiAjZW5kaWYKIAljYXNlIElHTVBWM19IT1NUX01FTUJFUlNISVBfUkVQT1JUOgpAQCAtOTcxLDggKzk3MSw2IEBACiAJCWJyZWFrOwogCX0KIAotZHJvcF9yZWY6Ci0JaW5fZGV2X3B1dChpbl9kZXYpOwogZHJvcDoKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTEyNDYsNiArMTI0NCw3IEBACiBvdXQ6CiAJcmV0dXJuOwogfQorRVhQT1JUX1NZTUJPTChpcF9tY19pbmNfZ3JvdXApOwogCiAvKgogICoJUmVzZW5kIElHTVAgSk9JTiByZXBvcnQ7IHVzZWQgZm9yIGJvbmRpbmcuCkBAIC0xMjY4LDYgKzEyNjcsNyBAQAogCWlnbXBfaWZjX2V2ZW50KGluX2Rldik7CiAjZW5kaWYKIH0KK0VYUE9SVF9TWU1CT0woaXBfbWNfcmVqb2luX2dyb3VwKTsKIAogLyoKICAqCUEgc29ja2V0IGhhcyBsZWZ0IGEgbXVsdGljYXN0IGdyb3VwIG9uIGRldmljZSBkZXYKQEAgLTEyOTgsNiArMTI5OCw3IEBACiAJCX0KIAl9CiB9CitFWFBPUlRfU1lNQk9MKGlwX21jX2RlY19ncm91cCk7CiAKIC8qIERldmljZSBjaGFuZ2luZyB0eXBlICovCiAKQEAgLTE0MjcsNyArMTQyOCw3IEBACiAJfQogCiAJaWYgKCFkZXYgJiYgIWlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmcnQsICZmbCkpIHsKLQkJZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJZGV2ID0gcnQtPmRzdC5kZXY7CiAJCWlwX3J0X3B1dChydCk7CiAJfQogCWlmIChkZXYpIHsKQEAgLTE2NDYsOCArMTY0Nyw3IEBACiAJCQkJaWYgKGRwc2YtPnNmX2luYWRkciA9PSBwc2YtPnNmX2luYWRkcikKIAkJCQkJYnJlYWs7CiAJCQlpZiAoIWRwc2YpIHsKLQkJCQlkcHNmID0gKHN0cnVjdCBpcF9zZl9saXN0ICopCi0JCQkJCWttYWxsb2Moc2l6ZW9mKCpkcHNmKSwgR0ZQX0FUT01JQyk7CisJCQkJZHBzZiA9IGttYWxsb2Moc2l6ZW9mKCpkcHNmKSwgR0ZQX0FUT01JQyk7CiAJCQkJaWYgKCFkcHNmKQogCQkJCQljb250aW51ZTsKIAkJCQkqZHBzZiA9ICpwc2Y7CkBAIC0xODA3LDYgKzE4MDcsNyBAQAogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0woaXBfbWNfam9pbl9ncm91cCk7CiAKIHN0YXRpYyB2b2lkIGlwX3NmX3NvY2tsaXN0X3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpycCkKIHsKQEAgLTI2NzksOCArMjY4MCwzIEBACiAJcmV0dXJuIHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlnbXBfbmV0X29wcyk7CiB9CiAjZW5kaWYKLQotRVhQT1JUX1NZTUJPTChpcF9tY19kZWNfZ3JvdXApOwotRVhQT1JUX1NZTUJPTChpcF9tY19pbmNfZ3JvdXApOwotRVhQT1JUX1NZTUJPTChpcF9tY19qb2luX2dyb3VwKTsKLUVYUE9SVF9TWU1CT0woaXBfbWNfcmVqb2luX2dyb3VwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMgYi9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCmluZGV4IDcwZWIzNTAuLjcxNzQzNzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwpAQCAtODQsNyArODQsNiBAQAogCX0KIAlyZXR1cm4gbm9kZSAhPSBOVUxMOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2Nza19iaW5kX2NvbmZsaWN0KTsKIAogLyogT2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgcG9ydCBmb3IgdGhlIGdpdmVuIHNvY2ssCkBAIC0yMTIsNyArMjExLDYgQEAKIAlsb2NhbF9iaF9lbmFibGUoKTsKIAlyZXR1cm4gcmV0OwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2Nza19nZXRfcG9ydCk7CiAKIC8qCkBAIC0zMDUsNyArMzAzLDYgQEAKIAkqZXJyID0gZXJyb3I7CiAJZ290byBvdXQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5ldF9jc2tfYWNjZXB0KTsKIAogLyoKQEAgLTMyNyw3ICszMjQsNiBAQAogCXNldHVwX3RpbWVyKCZzay0+c2tfdGltZXIsIGtlZXBhbGl2ZV9oYW5kbGVyLCAodW5zaWduZWQgbG9uZylzayk7CiAJaWNzay0+aWNza19wZW5kaW5nID0gaWNzay0+aWNza19hY2sucGVuZGluZyA9IDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5ldF9jc2tfaW5pdF94bWl0X3RpbWVycyk7CiAKIHZvaWQgaW5ldF9jc2tfY2xlYXJfeG1pdF90aW1lcnMoc3RydWN0IHNvY2sgKnNrKQpAQCAtMzQwLDIxICszMzYsMTggQEAKIAlza19zdG9wX3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIpOwogCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOwogfQotCiBFWFBPUlRfU1lNQk9MKGluZXRfY3NrX2NsZWFyX3htaXRfdGltZXJzKTsKIAogdm9pZCBpbmV0X2Nza19kZWxldGVfa2VlcGFsaXZlX3RpbWVyKHN0cnVjdCBzb2NrICpzaykKIHsKIAlza19zdG9wX3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyKTsKIH0KLQogRVhQT1JUX1NZTUJPTChpbmV0X2Nza19kZWxldGVfa2VlcGFsaXZlX3RpbWVyKTsKIAogdm9pZCBpbmV0X2Nza19yZXNldF9rZWVwYWxpdmVfdGltZXIoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlza19yZXNldF90aW1lcihzaywgJnNrLT5za190aW1lciwgamlmZmllcyArIGxlbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5ldF9jc2tfcmVzZXRfa2VlcGFsaXZlX3RpbWVyKTsKIAogc3RydWN0IGRzdF9lbnRyeSAqaW5ldF9jc2tfcm91dGVfcmVxKHN0cnVjdCBzb2NrICpzaywKQEAgLTM4Myw3ICszNzYsNyBAQAogCQlnb3RvIG5vX3JvdXRlOwogCWlmIChvcHQgJiYgb3B0LT5pc19zdHJpY3Ryb3V0ZSAmJiBydC0+cnRfZHN0ICE9IHJ0LT5ydF9nYXRld2F5KQogCQlnb3RvIHJvdXRlX2VycjsKLQlyZXR1cm4gJnJ0LT51LmRzdDsKKwlyZXR1cm4gJnJ0LT5kc3Q7CiAKIHJvdXRlX2VycjoKIAlpcF9ydF9wdXQocnQpOwpAQCAtMzkxLDcgKzM4NCw2IEBACiAJSVBfSU5DX1NUQVRTX0JIKG5ldCwgSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOwogCXJldHVybiBOVUxMOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2Nza19yb3V0ZV9yZXEpOwogCiBzdGF0aWMgaW5saW5lIHUzMiBpbmV0X3N5bnFfaGFzaChjb25zdCBfX2JlMzIgcmFkZHIsIGNvbnN0IF9fYmUxNiBycG9ydCwKQEAgLTQzMyw3ICs0MjUsNiBAQAogCiAJcmV0dXJuIHJlcTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfc2VhcmNoX3JlcSk7CiAKIHZvaWQgaW5ldF9jc2tfcmVxc2tfcXVldWVfaGFzaF9hZGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCkBAIC00NDcsMTEgKzQzOCwxMSBAQAogCXJlcXNrX3F1ZXVlX2hhc2hfcmVxKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZSwgaCwgcmVxLCB0aW1lb3V0KTsKIAlpbmV0X2Nza19yZXFza19xdWV1ZV9hZGRlZChzaywgdGltZW91dCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2Nza19yZXFza19xdWV1ZV9oYXNoX2FkZCk7CiAKIC8qIE9ubHkgdGhpbmcgd2UgbmVlZCBmcm9tIHRjcC5oICovCiBleHRlcm4gaW50IHN5c2N0bF90Y3Bfc3luYWNrX3JldHJpZXM7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX3JlcXNrX3F1ZXVlX2hhc2hfYWRkKTsKIAogLyogRGVjaWRlIHdoZW4gdG8gZXhwaXJlIHRoZSByZXF1ZXN0IGFuZCB3aGVuIHRvIHJlc2VuZCBTWU4tQUNLICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc3luX2Fja19yZWNhbGMoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBjb25zdCBpbnQgdGhyZXNoLApAQCAtNTY5LDcgKzU2MCw2IEBACiAJaWYgKGxvcHQtPnFsZW4pCiAJCWluZXRfY3NrX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihwYXJlbnQsIGludGVydmFsKTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfcmVxc2tfcXVldWVfcHJ1bmUpOwogCiBzdHJ1Y3Qgc29jayAqaW5ldF9jc2tfY2xvbmUoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCkBAIC01OTksNyArNTg5LDYgQEAKIAl9CiAJcmV0dXJuIG5ld3NrOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2Nza19jbG9uZSk7CiAKIC8qCkBAIC02MzAsNyArNjE5LDYgQEAKIAlwZXJjcHVfY291bnRlcl9kZWMoc2stPnNrX3Byb3QtPm9ycGhhbl9jb3VudCk7CiAJc29ja19wdXQoc2spOwogfQotCiBFWFBPUlRfU1lNQk9MKGluZXRfY3NrX2Rlc3Ryb3lfc29jayk7CiAKIGludCBpbmV0X2Nza19saXN0ZW5fc3RhcnQoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgbnJfdGFibGVfZW50cmllcykKQEAgLTY2NSw3ICs2NTMsNiBAQAogCV9fcmVxc2tfcXVldWVfZGVzdHJveSgmaWNzay0+aWNza19hY2NlcHRfcXVldWUpOwogCXJldHVybiAtRUFERFJJTlVTRTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfbGlzdGVuX3N0YXJ0KTsKIAogLyoKQEAgLTcyMCw3ICs3MDcsNiBAQAogCX0KIAlXQVJOX09OKHNrLT5za19hY2tfYmFja2xvZyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX2xpc3Rlbl9zdG9wKTsKIAogdm9pZCBpbmV0X2Nza19hZGRyMnNvY2thZGRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkcikKQEAgLTczMiw3ICs3MTgsNiBAQAogCXNpbi0+c2luX2FkZHIuc19hZGRyCT0gaW5ldC0+aW5ldF9kYWRkcjsKIAlzaW4tPnNpbl9wb3J0CQk9IGluZXQtPmluZXRfZHBvcnQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX2FkZHIyc29ja2FkZHIpOwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtNzQ3LDcgKzczMiw2IEBACiAJcmV0dXJuIGljc2stPmljc2tfYWZfb3BzLT5nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwKIAkJCQkJICAgICBvcHR2YWwsIG9wdGxlbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX2NvbXBhdF9nZXRzb2Nrb3B0KTsKIAogaW50IGluZXRfY3NrX2NvbXBhdF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKQEAgLTc2MSw2ICs3NDUsNSBAQAogCXJldHVybiBpY3NrLT5pY3NrX2FmX29wcy0+c2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCiAJCQkJCSAgICAgb3B0dmFsLCBvcHRsZW4pOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2Nza19jb21wYXRfc2V0c29ja29wdCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfZnJhZ21lbnQuYyBiL25ldC9pcHY0L2luZXRfZnJhZ21lbnQuYwppbmRleCBhMmNhNmFlLi41ZmYyYTUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2ZyYWdtZW50LmMKKysrIGIvbmV0L2lwdjQvaW5ldF9mcmFnbWVudC5jCkBAIC0xMTQsNyArMTE0LDYgQEAKIAkJZnEtPmxhc3RfaW4gfD0gSU5FVF9GUkFHX0NPTVBMRVRFOwogCX0KIH0KLQogRVhQT1JUX1NZTUJPTChpbmV0X2ZyYWdfa2lsbCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmFnX2tmcmVlX3NrYihzdHJ1Y3QgbmV0bnNfZnJhZ3MgKm5mLCBzdHJ1Y3QgaW5ldF9mcmFncyAqZiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jIGIvbmV0L2lwdjQvaW5ldF9oYXNodGFibGVzLmMKaW5kZXggZDNlMTYwYS4uZmI3YWQ1YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9oYXNodGFibGVzLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9oYXNodGFibGVzLmMKQEAgLTk5LDcgKzk5LDYgQEAKIAlfX2luZXRfcHV0X3BvcnQoc2spOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogfQotCiBFWFBPUlRfU1lNQk9MKGluZXRfcHV0X3BvcnQpOwogCiB2b2lkIF9faW5ldF9pbmhlcml0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqY2hpbGQpCkBAIC0xMTYsNyArMTE1LDYgQEAKIAlpbmV0X2NzayhjaGlsZCktPmljc2tfYmluZF9oYXNoID0gdGI7CiAJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChfX2luZXRfaW5oZXJpdF9wb3J0KTsKIAogc3RhdGljIGlubGluZSBpbnQgY29tcHV0ZV9zY29yZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBuZXQgKm5ldCwKQEAgLTU0Niw3ICs1NDQsNiBAQAogCXJldHVybiBfX2luZXRfaGFzaF9jb25uZWN0KGRlYXRoX3Jvdywgc2ssIGluZXRfc2tfcG9ydF9vZmZzZXQoc2spLAogCQkJX19pbmV0X2NoZWNrX2VzdGFibGlzaGVkLCBfX2luZXRfaGFzaF9ub2xpc3Rlbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfaGFzaF9jb25uZWN0KTsKIAogdm9pZCBpbmV0X2hhc2hpbmZvX2luaXQoc3RydWN0IGluZXRfaGFzaGluZm8gKmgpCkBAIC01NjAsNSArNTU3LDQgQEAKIAkJCQkgICAgICBpICsgTElTVEVOSU5HX05VTExTX0JBU0UpOwogCQl9CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfaGFzaGluZm9faW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0cGVlci5jIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwppbmRleCA2YmNmZTUyLi45ZmZhMjRiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0cGVlci5jCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTUxLDggKzUxLDggQEAKICAqICBsb29rdXBzIHBlcmZvcm1lZCB3aXRoIGRpc2FibGVkIEJIcy4KICAqCiAgKiAgU2VyaWFsaXNhdGlvbiBpc3N1ZXMuCi0gKiAgMS4gIE5vZGVzIG1heSBhcHBlYXIgaW4gdGhlIHRyZWUgb25seSB3aXRoIHRoZSBwb29sIHdyaXRlIGxvY2sgaGVsZC4KLSAqICAyLiAgTm9kZXMgbWF5IGRpc2FwcGVhciBmcm9tIHRoZSB0cmVlIG9ubHkgd2l0aCB0aGUgcG9vbCB3cml0ZSBsb2NrIGhlbGQKKyAqICAxLiAgTm9kZXMgbWF5IGFwcGVhciBpbiB0aGUgdHJlZSBvbmx5IHdpdGggdGhlIHBvb2wgbG9jayBoZWxkLgorICogIDIuICBOb2RlcyBtYXkgZGlzYXBwZWFyIGZyb20gdGhlIHRyZWUgb25seSB3aXRoIHRoZSBwb29sIGxvY2sgaGVsZAogICogICAgICBBTkQgcmVmZXJlbmNlIGNvdW50IGJlaW5nIDAuCiAgKiAgMy4gIE5vZGVzIGFwcGVhcnMgYW5kIGRpc2FwcGVhcnMgZnJvbSB1bnVzZWQgbm9kZSBsaXN0IG9ubHkgdW5kZXIKICAqICAgICAgImluZXRfcGVlcl91bnVzZWRfbG9jayIuCkBAIC02NCwyMyArNjQsMzEgQEAKICAqCQkgICB1c3VhbGx5IHVuZGVyIHNvbWUgb3RoZXIgbG9jayB0byBwcmV2ZW50IG5vZGUgZGlzYXBwZWFyaW5nCiAgKgkJZHRpbWU6IHVudXNlZCBub2RlIGxpc3QgbG9jawogICoJCXY0ZGFkZHI6IHVuY2hhbmdlYWJsZQotICoJCWlwX2lkX2NvdW50OiBpZGxvY2sKKyAqCQlpcF9pZF9jb3VudDogYXRvbWljIHZhbHVlIChubyBsb2NrIG5lZWRlZCkKICAqLwogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnBlZXJfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKICNkZWZpbmUgbm9kZV9oZWlnaHQoeCkgeC0+YXZsX2hlaWdodAotc3RhdGljIHN0cnVjdCBpbmV0X3BlZXIgcGVlcl9mYWtlX25vZGUgPSB7Ci0JLmF2bF9sZWZ0CT0gJnBlZXJfZmFrZV9ub2RlLAotCS5hdmxfcmlnaHQJPSAmcGVlcl9mYWtlX25vZGUsCisKKyNkZWZpbmUgcGVlcl9hdmxfZW1wdHkgKChzdHJ1Y3QgaW5ldF9wZWVyICopJnBlZXJfZmFrZV9ub2RlKQorc3RhdGljIGNvbnN0IHN0cnVjdCBpbmV0X3BlZXIgcGVlcl9mYWtlX25vZGUgPSB7CisJLmF2bF9sZWZ0CT0gcGVlcl9hdmxfZW1wdHksCisJLmF2bF9yaWdodAk9IHBlZXJfYXZsX2VtcHR5LAogCS5hdmxfaGVpZ2h0CT0gMAogfTsKLSNkZWZpbmUgcGVlcl9hdmxfZW1wdHkgKCZwZWVyX2Zha2Vfbm9kZSkKLXN0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyX3Jvb3QgPSBwZWVyX2F2bF9lbXB0eTsKLXN0YXRpYyBERUZJTkVfUldMT0NLKHBlZXJfcG9vbF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGluZXRfcGVlciAqcm9vdDsKKwlzcGlubG9ja190CWxvY2s7CisJaW50CQl0b3RhbDsKK30gcGVlcnMgPSB7CisJLnJvb3QJCT0gcGVlcl9hdmxfZW1wdHksCisJLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQocGVlcnMubG9jayksCisJLnRvdGFsCQk9IDAsCit9OwogI2RlZmluZSBQRUVSX01BWERFUFRIIDQwIC8qIHN1ZmZpY2llbnQgZm9yIGFib3V0IDJeMjcgbm9kZXMgKi8KIAotc3RhdGljIGludCBwZWVyX3RvdGFsOwogLyogRXhwb3J0ZWQgZm9yIHN5c2N0bF9uZXRfaXB2NC4gICovCiBpbnQgaW5ldF9wZWVyX3RocmVzaG9sZCBfX3JlYWRfbW9zdGx5ID0gNjU1MzYgKyAxMjg7CS8qIHN0YXJ0IHRvIHRocm93IGVudHJpZXMgbW9yZQogCQkJCQkgKiBhZ2dyZXNzaXZlbHkgYXQgdGhpcyBzdGFnZSAqLwpAQCAtODksOCArOTcsMTMgQEAKIGludCBpbmV0X3BlZXJfZ2NfbWludGltZSBfX3JlYWRfbW9zdGx5ID0gMTAgKiBIWjsKIGludCBpbmV0X3BlZXJfZ2NfbWF4dGltZSBfX3JlYWRfbW9zdGx5ID0gMTIwICogSFo7CiAKLXN0YXRpYyBMSVNUX0hFQUQodW51c2VkX3BlZXJzKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzcGlubG9ja190CQlsb2NrOworfSB1bnVzZWRfcGVlcnMgPSB7CisJLmxpc3QJCQk9IExJU1RfSEVBRF9JTklUKHVudXNlZF9wZWVycy5saXN0KSwKKwkubG9jawkJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQodW51c2VkX3BlZXJzLmxvY2spLAorfTsKIAogc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSk7CiBzdGF0aWMgREVGSU5FX1RJTUVSKHBlZXJfcGVyaW9kaWNfdGltZXIsIHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKQEAgLTExNiw3ICsxMjksNyBAQAogCiAJcGVlcl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW5ldF9wZWVyX2NhY2hlIiwKIAkJCXNpemVvZihzdHJ1Y3QgaW5ldF9wZWVyKSwKLQkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLAorCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOIHwgU0xBQl9QQU5JQywKIAkJCU5VTEwpOwogCiAJLyogQWxsIHRoZSB0aW1lcnMsIHN0YXJ0ZWQgYXQgc3lzdGVtIHN0YXJ0dXAgdGVuZApAQCAtMTMxLDM4ICsxNDQsNjkgQEAKIC8qIENhbGxlZCB3aXRoIG9yIHdpdGhvdXQgbG9jYWwgQkggYmVpbmcgZGlzYWJsZWQuICovCiBzdGF0aWMgdm9pZCB1bmxpbmtfZnJvbV91bnVzZWQoc3RydWN0IGluZXRfcGVlciAqcCkKIHsKLQlzcGluX2xvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7Ci0JbGlzdF9kZWxfaW5pdCgmcC0+dW51c2VkKTsKLQlzcGluX3VubG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnAtPnVudXNlZCkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZ1bnVzZWRfcGVlcnMubG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnAtPnVudXNlZCk7CisJCXNwaW5fdW5sb2NrX2JoKCZ1bnVzZWRfcGVlcnMubG9jayk7CisJfQogfQogCiAvKgogICogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4KLSAqIF9zdGFjayBpcyBrbm93biB0byBiZSBOVUxMIG9yIG5vdCBhdCBjb21waWxlIHRpbWUsCi0gKiBzbyBjb21waWxlciB3aWxsIG9wdGltaXplIHRoZSBpZiAoX3N0YWNrKSB0ZXN0cy4KICAqLwogI2RlZmluZSBsb29rdXAoX2RhZGRyLCBfc3RhY2spIAkJCQkJXAogKHsJCQkJCQkJCVwKIAlzdHJ1Y3QgaW5ldF9wZWVyICp1LCAqKnY7CQkJCVwKLQlpZiAoX3N0YWNrICE9IE5VTEwpIHsJCQkJCVwKLQkJc3RhY2twdHIgPSBfc3RhY2s7CQkJCVwKLQkJKnN0YWNrcHRyKysgPSAmcGVlcl9yb290OwkJCVwKLQl9CQkJCQkJCVwKLQlmb3IgKHUgPSBwZWVyX3Jvb3Q7IHUgIT0gcGVlcl9hdmxfZW1wdHk7ICkgewkJXAorCQkJCQkJCQlcCisJc3RhY2twdHIgPSBfc3RhY2s7CQkJCQlcCisJKnN0YWNrcHRyKysgPSAmcGVlcnMucm9vdDsJCQkJXAorCWZvciAodSA9IHBlZXJzLnJvb3Q7IHUgIT0gcGVlcl9hdmxfZW1wdHk7ICkgewkJXAogCQlpZiAoX2RhZGRyID09IHUtPnY0ZGFkZHIpCQkJXAogCQkJYnJlYWs7CQkJCQlcCiAJCWlmICgoX19mb3JjZSBfX3UzMilfZGFkZHIgPCAoX19mb3JjZSBfX3UzMil1LT52NGRhZGRyKQlcCiAJCQl2ID0gJnUtPmF2bF9sZWZ0OwkJCVwKIAkJZWxzZQkJCQkJCVwKIAkJCXYgPSAmdS0+YXZsX3JpZ2h0OwkJCVwKLQkJaWYgKF9zdGFjayAhPSBOVUxMKQkJCQlcCi0JCQkqc3RhY2twdHIrKyA9IHY7CQkJXAorCQkqc3RhY2twdHIrKyA9IHY7CQkJCVwKIAkJdSA9ICp2OwkJCQkJCVwKIAl9CQkJCQkJCVwKIAl1OwkJCQkJCQlcCiB9KQogCi0vKiBDYWxsZWQgd2l0aCBsb2NhbCBCSCBkaXNhYmxlZCBhbmQgdGhlIHBvb2wgd3JpdGUgbG9jayBoZWxkLiAqLworLyoKKyAqIENhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2tfYmgoKQorICogQmVjYXVzZSB3ZSBob2xkIG5vIGxvY2sgYWdhaW5zdCBhIHdyaXRlciwgaXRzIHF1aXRlIHBvc3NpYmxlIHdlIGZhbGwKKyAqIGluIGFuIGVuZGxlc3MgbG9vcC4KKyAqIEJ1dCBldmVyeSBwb2ludGVyIHdlIGZvbGxvdyBpcyBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIHRoYW5rcyB0byBSQ1UuCisgKiBXZSBleGl0IGZyb20gdGhpcyBmdW5jdGlvbiBpZiBudW1iZXIgb2YgbGlua3MgZXhjZWVkcyBQRUVSX01BWERFUFRICisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyICpsb29rdXBfcmN1X2JoKF9fYmUzMiBkYWRkcikKK3sKKwlzdHJ1Y3QgaW5ldF9wZWVyICp1ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHBlZXJzLnJvb3QpOworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAodSAhPSBwZWVyX2F2bF9lbXB0eSkgeworCQlpZiAoZGFkZHIgPT0gdS0+djRkYWRkcikgeworCQkJLyogQmVmb3JlIHRha2luZyBhIHJlZmVyZW5jZSwgY2hlY2sgaWYgdGhpcyBlbnRyeSB3YXMKKwkJCSAqIGRlbGV0ZWQsIHVubGlua19mcm9tX3Bvb2woKSBzZXRzIHJlZmNudD0tMSB0byBtYWtlCisJCQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGFuIHVudXNlZCBlbnRyeSAocmVmY250PTApIGFuZAorCQkJICogYSBmcmVlZCBvbmUuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSghYXRvbWljX2FkZF91bmxlc3MoJnUtPnJlZmNudCwgMSwgLTEpKSkKKwkJCQl1ID0gTlVMTDsKKwkJCXJldHVybiB1OworCQl9CisJCWlmICgoX19mb3JjZSBfX3UzMilkYWRkciA8IChfX2ZvcmNlIF9fdTMyKXUtPnY0ZGFkZHIpCisJCQl1ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHUtPmF2bF9sZWZ0KTsKKwkJZWxzZQorCQkJdSA9IHJjdV9kZXJlZmVyZW5jZV9iaCh1LT5hdmxfcmlnaHQpOworCQlpZiAodW5saWtlbHkoKytjb3VudCA9PSBQRUVSX01BWERFUFRIKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4gKi8KICNkZWZpbmUgbG9va3VwX3JpZ2h0ZW1wdHkoc3RhcnQpCQkJCVwKICh7CQkJCQkJCQlcCiAJc3RydWN0IGluZXRfcGVlciAqdSwgKip2OwkJCQlcCkBAIC0xNzYsOSArMjIwLDEwIEBACiAJdTsJCQkJCQkJXAogfSkKIAotLyogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIHdyaXRlIGxvY2sgaGVsZC4KKy8qIENhbGxlZCB3aXRoIGxvY2FsIEJIIGRpc2FibGVkIGFuZCB0aGUgcG9vbCBsb2NrIGhlbGQuCiAgKiBWYXJpYWJsZSBuYW1lcyBhcmUgdGhlIHByb29mIG9mIG9wZXJhdGlvbiBjb3JyZWN0bmVzcy4KLSAqIExvb2sgaW50byBtbS9tYXBfYXZsLmMgZm9yIG1vcmUgZGV0YWlsIGRlc2NyaXB0aW9uIG9mIHRoZSBpZGVhcy4gICovCisgKiBMb29rIGludG8gbW0vbWFwX2F2bC5jIGZvciBtb3JlIGRldGFpbCBkZXNjcmlwdGlvbiBvZiB0aGUgaWRlYXMuCisgKi8KIHN0YXRpYyB2b2lkIHBlZXJfYXZsX3JlYmFsYW5jZShzdHJ1Y3QgaW5ldF9wZWVyICoqc3RhY2tbXSwKIAkJc3RydWN0IGluZXRfcGVlciAqKipzdGFja2VuZCkKIHsKQEAgLTI1NCwxNSArMjk5LDIxIEBACiAJfQogfQogCi0vKiBDYWxsZWQgd2l0aCBsb2NhbCBCSCBkaXNhYmxlZCBhbmQgdGhlIHBvb2wgd3JpdGUgbG9jayBoZWxkLiAqLworLyogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4gKi8KICNkZWZpbmUgbGlua190b19wb29sKG4pCQkJCQkJXAogZG8gewkJCQkJCQkJXAogCW4tPmF2bF9oZWlnaHQgPSAxOwkJCQkJXAogCW4tPmF2bF9sZWZ0ID0gcGVlcl9hdmxfZW1wdHk7CQkJCVwKIAluLT5hdmxfcmlnaHQgPSBwZWVyX2F2bF9lbXB0eTsJCQkJXAorCXNtcF93bWIoKTsgLyogbG9ja2xlc3MgcmVhZGVycyBjYW4gY2F0Y2ggdXMgbm93ICovCVwKIAkqKi0tc3RhY2twdHIgPSBuOwkJCQkJXAogCXBlZXJfYXZsX3JlYmFsYW5jZShzdGFjaywgc3RhY2twdHIpOwkJCVwKLX0gd2hpbGUoMCkKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGluZXRwZWVyX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUocGVlcl9jYWNoZXAsIGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaW5ldF9wZWVyLCByY3UpKTsKK30KIAogLyogTWF5IGJlIGNhbGxlZCB3aXRoIGxvY2FsIEJIIGVuYWJsZWQuICovCiBzdGF0aWMgdm9pZCB1bmxpbmtfZnJvbV9wb29sKHN0cnVjdCBpbmV0X3BlZXIgKnApCkBAIC0yNzEsMTMgKzMyMiwxNCBAQAogCiAJZG9fZnJlZSA9IDA7CiAKLQl3cml0ZV9sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZwZWVycy5sb2NrKTsKIAkvKiBDaGVjayB0aGUgcmVmZXJlbmNlIGNvdW50ZXIuICBJdCB3YXMgYXJ0aWZpY2lhbGx5IGluY3JlbWVudGVkIGJ5IDEKLQkgKiBpbiBjbGVhbnVwKCkgZnVuY3Rpb24gdG8gcHJldmVudCBzdWRkZW4gZGlzYXBwZWFyaW5nLiAgSWYgdGhlCi0JICogcmVmZXJlbmNlIGNvdW50IGlzIHN0aWxsIDEgdGhlbiB0aGUgbm9kZSBpcyByZWZlcmVuY2VkIG9ubHkgYXMgYHAnCi0JICogaGVyZSBhbmQgZnJvbSB0aGUgcG9vbC4gIFNvIHVuZGVyIHRoZSBleGNsdXNpdmUgcG9vbCBsb2NrIGl0J3Mgc2FmZQotCSAqIHRvIHJlbW92ZSB0aGUgbm9kZSBhbmQgZnJlZSBpdCBsYXRlci4gKi8KLQlpZiAoYXRvbWljX3JlYWQoJnAtPnJlZmNudCkgPT0gMSkgeworCSAqIGluIGNsZWFudXAoKSBmdW5jdGlvbiB0byBwcmV2ZW50IHN1ZGRlbiBkaXNhcHBlYXJpbmcuICBJZiB3ZSBjYW4KKwkgKiBhdG9taWNhbGx5IChiZWNhdXNlIG9mIGxvY2tsZXNzIHJlYWRlcnMpIHRha2UgdGhpcyBsYXN0IHJlZmVyZW5jZSwKKwkgKiBpdCdzIHNhZmUgdG8gcmVtb3ZlIHRoZSBub2RlIGFuZCBmcmVlIGl0IGxhdGVyLgorCSAqIFdlIHVzZSByZWZjbnQ9LTEgdG8gYWxlcnQgbG9ja2xlc3MgcmVhZGVycyB0aGlzIGVudHJ5IGlzIGRlbGV0ZWQuCisJICovCisJaWYgKGF0b21pY19jbXB4Y2hnKCZwLT5yZWZjbnQsIDEsIC0xKSA9PSAxKSB7CiAJCXN0cnVjdCBpbmV0X3BlZXIgKipzdGFja1tQRUVSX01BWERFUFRIXTsKIAkJc3RydWN0IGluZXRfcGVlciAqKipzdGFja3B0ciwgKioqZGVscDsKIAkJaWYgKGxvb2t1cChwLT52NGRhZGRyLCBzdGFjaykgIT0gcCkKQEAgLTMwMywyMCArMzU1LDIxIEBACiAJCQlkZWxwWzFdID0gJnQtPmF2bF9sZWZ0OyAvKiB3YXMgJnAtPmF2bF9sZWZ0ICovCiAJCX0KIAkJcGVlcl9hdmxfcmViYWxhbmNlKHN0YWNrLCBzdGFja3B0cik7Ci0JCXBlZXJfdG90YWwtLTsKKwkJcGVlcnMudG90YWwtLTsKIAkJZG9fZnJlZSA9IDE7CiAJfQotCXdyaXRlX3VubG9ja19iaCgmcGVlcl9wb29sX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZwZWVycy5sb2NrKTsKIAogCWlmIChkb19mcmVlKQotCQlrbWVtX2NhY2hlX2ZyZWUocGVlcl9jYWNoZXAsIHApOworCQljYWxsX3JjdV9iaCgmcC0+cmN1LCBpbmV0cGVlcl9mcmVlX3JjdSk7CiAJZWxzZQogCQkvKiBUaGUgbm9kZSBpcyB1c2VkIGFnYWluLiAgRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyCiAJCSAqIGJhY2suICBUaGUgbG9vcCAiY2xlYW51cCAtPiB1bmxpbmtfZnJvbV91bnVzZWQKIAkJICogICAtPiB1bmxpbmtfZnJvbV9wb29sIC0+IHB1dHBlZXIgLT4gbGlua190b191bnVzZWQKIAkJICogICAtPiBjbGVhbnVwIChmb3IgdGhlIHNhbWUgbm9kZSkiCiAJCSAqIGRvZXNuJ3QgcmVhbGx5IGV4aXN0IGJlY2F1c2UgdGhlIGVudHJ5IHdpbGwgaGF2ZSBhCi0JCSAqIHJlY2VudCBkZWxldGlvbiB0aW1lIGFuZCB3aWxsIG5vdCBiZSBjbGVhbmVkIGFnYWluIHNvb24uICovCisJCSAqIHJlY2VudCBkZWxldGlvbiB0aW1lIGFuZCB3aWxsIG5vdCBiZSBjbGVhbmVkIGFnYWluIHNvb24uCisJCSAqLwogCQlpbmV0X3B1dHBlZXIocCk7CiB9CiAKQEAgLTMyNiwxNiArMzc5LDE2IEBACiAJc3RydWN0IGluZXRfcGVlciAqcCA9IE5VTEw7CiAKIAkvKiBSZW1vdmUgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIGxpc3Qgb2YgdW51c2VkIG5vZGVzLiAqLwotCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnVudXNlZF9wZWVycykpIHsKKwlzcGluX2xvY2tfYmgoJnVudXNlZF9wZWVycy5sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnVudXNlZF9wZWVycy5saXN0KSkgewogCQlfX3UzMiBkZWx0YTsKIAotCQlwID0gbGlzdF9maXJzdF9lbnRyeSgmdW51c2VkX3BlZXJzLCBzdHJ1Y3QgaW5ldF9wZWVyLCB1bnVzZWQpOworCQlwID0gbGlzdF9maXJzdF9lbnRyeSgmdW51c2VkX3BlZXJzLmxpc3QsIHN0cnVjdCBpbmV0X3BlZXIsIHVudXNlZCk7CiAJCWRlbHRhID0gKF9fdTMyKWppZmZpZXMgLSBwLT5kdGltZTsKIAogCQlpZiAoZGVsdGEgPCB0dGwpIHsKIAkJCS8qIERvIG5vdCBwcnVuZSBmcmVzaCBlbnRyaWVzLiAqLwotCQkJc3Bpbl91bmxvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmdW51c2VkX3BlZXJzLmxvY2spOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKQEAgLTM0NSw3ICszOTgsNyBAQAogCQkgKiBiZWZvcmUgdW5saW5rX2Zyb21fcG9vbCgpIGNhbGwuICovCiAJCWF0b21pY19pbmMoJnAtPnJlZmNudCk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZpbmV0X3BlZXJfdW51c2VkX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZ1bnVzZWRfcGVlcnMubG9jayk7CiAKIAlpZiAocCA9PSBOVUxMKQogCQkvKiBJdCBtZWFucyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgVVNFRCBlbnRyaWVzIGhhcwpAQCAtMzYwLDYyICs0MTMsNTYgQEAKIC8qIENhbGxlZCB3aXRoIG9yIHdpdGhvdXQgbG9jYWwgQkggYmVpbmcgZGlzYWJsZWQuICovCiBzdHJ1Y3QgaW5ldF9wZWVyICppbmV0X2dldHBlZXIoX19iZTMyIGRhZGRyLCBpbnQgY3JlYXRlKQogewotCXN0cnVjdCBpbmV0X3BlZXIgKnAsICpuOworCXN0cnVjdCBpbmV0X3BlZXIgKnA7CiAJc3RydWN0IGluZXRfcGVlciAqKnN0YWNrW1BFRVJfTUFYREVQVEhdLCAqKipzdGFja3B0cjsKIAotCS8qIExvb2sgdXAgZm9yIHRoZSBhZGRyZXNzIHF1aWNrbHkuICovCi0JcmVhZF9sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7Ci0JcCA9IGxvb2t1cChkYWRkciwgTlVMTCk7Ci0JaWYgKHAgIT0gcGVlcl9hdmxfZW1wdHkpCi0JCWF0b21pY19pbmMoJnAtPnJlZmNudCk7Ci0JcmVhZF91bmxvY2tfYmgoJnBlZXJfcG9vbF9sb2NrKTsKKwkvKiBMb29rIHVwIGZvciB0aGUgYWRkcmVzcyBxdWlja2x5LCBsb2NrbGVzcy4KKwkgKiBCZWNhdXNlIG9mIGEgY29uY3VycmVudCB3cml0ZXIsIHdlIG1pZ2h0IG5vdCBmaW5kIGFuIGV4aXN0aW5nIGVudHJ5LgorCSAqLworCXJjdV9yZWFkX2xvY2tfYmgoKTsKKwlwID0gbG9va3VwX3JjdV9iaChkYWRkcik7CisJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAKLQlpZiAocCAhPSBwZWVyX2F2bF9lbXB0eSkgewotCQkvKiBUaGUgZXhpc3Rpbmcgbm9kZSBoYXMgYmVlbiBmb3VuZC4gKi8KLQkJLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHVudXNlZCBsaXN0IGlmIGl0IHdhcyB0aGVyZS4gKi8KKwlpZiAocCkgeworCQkvKiBUaGUgZXhpc3Rpbmcgbm9kZSBoYXMgYmVlbiBmb3VuZC4KKwkJICogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHVudXNlZCBsaXN0IGlmIGl0IHdhcyB0aGVyZS4KKwkJICovCiAJCXVubGlua19mcm9tX3VudXNlZChwKTsKIAkJcmV0dXJuIHA7CiAJfQogCi0JaWYgKCFjcmVhdGUpCi0JCXJldHVybiBOVUxMOwotCi0JLyogQWxsb2NhdGUgdGhlIHNwYWNlIG91dHNpZGUgdGhlIGxvY2tlZCByZWdpb24uICovCi0JbiA9IGttZW1fY2FjaGVfYWxsb2MocGVlcl9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmIChuID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW4tPnY0ZGFkZHIgPSBkYWRkcjsKLQlhdG9taWNfc2V0KCZuLT5yZWZjbnQsIDEpOwotCWF0b21pY19zZXQoJm4tPnJpZCwgMCk7Ci0JYXRvbWljX3NldCgmbi0+aXBfaWRfY291bnQsIHNlY3VyZV9pcF9pZChkYWRkcikpOwotCW4tPnRjcF90c19zdGFtcCA9IDA7Ci0KLQl3cml0ZV9sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7Ci0JLyogQ2hlY2sgaWYgYW4gZW50cnkgaGFzIHN1ZGRlbmx5IGFwcGVhcmVkLiAqLworCS8qIHJldHJ5IGFuIGV4YWN0IGxvb2t1cCwgdGFraW5nIHRoZSBsb2NrIGJlZm9yZS4KKwkgKiBBdCBsZWFzdCwgbm9kZXMgc2hvdWxkIGJlIGhvdCBpbiBvdXIgY2FjaGUuCisJICovCisJc3Bpbl9sb2NrX2JoKCZwZWVycy5sb2NrKTsKIAlwID0gbG9va3VwKGRhZGRyLCBzdGFjayk7Ci0JaWYgKHAgIT0gcGVlcl9hdmxfZW1wdHkpCi0JCWdvdG8gb3V0X2ZyZWU7CisJaWYgKHAgIT0gcGVlcl9hdmxfZW1wdHkpIHsKKwkJYXRvbWljX2luYygmcC0+cmVmY250KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBlZXJzLmxvY2spOworCQkvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdW51c2VkIGxpc3QgaWYgaXQgd2FzIHRoZXJlLiAqLworCQl1bmxpbmtfZnJvbV91bnVzZWQocCk7CisJCXJldHVybiBwOworCX0KKwlwID0gY3JlYXRlID8ga21lbV9jYWNoZV9hbGxvYyhwZWVyX2NhY2hlcCwgR0ZQX0FUT01JQykgOiBOVUxMOworCWlmIChwKSB7CisJCXAtPnY0ZGFkZHIgPSBkYWRkcjsKKwkJYXRvbWljX3NldCgmcC0+cmVmY250LCAxKTsKKwkJYXRvbWljX3NldCgmcC0+cmlkLCAwKTsKKwkJYXRvbWljX3NldCgmcC0+aXBfaWRfY291bnQsIHNlY3VyZV9pcF9pZChkYWRkcikpOworCQlwLT50Y3BfdHNfc3RhbXAgPSAwOworCQlJTklUX0xJU1RfSEVBRCgmcC0+dW51c2VkKTsKIAotCS8qIExpbmsgdGhlIG5vZGUuICovCi0JbGlua190b19wb29sKG4pOwotCUlOSVRfTElTVF9IRUFEKCZuLT51bnVzZWQpOwotCXBlZXJfdG90YWwrKzsKLQl3cml0ZV91bmxvY2tfYmgoJnBlZXJfcG9vbF9sb2NrKTsKIAotCWlmIChwZWVyX3RvdGFsID49IGluZXRfcGVlcl90aHJlc2hvbGQpCisJCS8qIExpbmsgdGhlIG5vZGUuICovCisJCWxpbmtfdG9fcG9vbChwKTsKKwkJcGVlcnMudG90YWwrKzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnBlZXJzLmxvY2spOworCisJaWYgKHBlZXJzLnRvdGFsID49IGluZXRfcGVlcl90aHJlc2hvbGQpCiAJCS8qIFJlbW92ZSBvbmUgbGVzcy1yZWNlbnRseS11c2VkIGVudHJ5LiAqLwogCQljbGVhbnVwX29uY2UoMCk7CiAKLQlyZXR1cm4gbjsKLQotb3V0X2ZyZWU6Ci0JLyogVGhlIGFwcHJvcHJpYXRlIG5vZGUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbC4gKi8KLQlhdG9taWNfaW5jKCZwLT5yZWZjbnQpOwotCXdyaXRlX3VubG9ja19iaCgmcGVlcl9wb29sX2xvY2spOwotCS8qIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB1bnVzZWQgbGlzdCBpZiBpdCB3YXMgdGhlcmUuICovCi0JdW5saW5rX2Zyb21fdW51c2VkKHApOwotCS8qIEZyZWUgcHJlYWxsb2NhdGVkIHRoZSBwcmVhbGxvY2F0ZWQgbm9kZS4gKi8KLQlrbWVtX2NhY2hlX2ZyZWUocGVlcl9jYWNoZXAsIG4pOwogCXJldHVybiBwOwogfQogCkBAIC00MjUsMTIgKzQ3MiwxMiBAQAogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAlpbnQgdHRsOwogCi0JaWYgKHBlZXJfdG90YWwgPj0gaW5ldF9wZWVyX3RocmVzaG9sZCkKKwlpZiAocGVlcnMudG90YWwgPj0gaW5ldF9wZWVyX3RocmVzaG9sZCkKIAkJdHRsID0gaW5ldF9wZWVyX21pbnR0bDsKIAllbHNlCiAJCXR0bCA9IGluZXRfcGVlcl9tYXh0dGwKIAkJCQktIChpbmV0X3BlZXJfbWF4dHRsIC0gaW5ldF9wZWVyX21pbnR0bCkgLyBIWiAqCi0JCQkJCXBlZXJfdG90YWwgLyBpbmV0X3BlZXJfdGhyZXNob2xkICogSFo7CisJCQkJCXBlZXJzLnRvdGFsIC8gaW5ldF9wZWVyX3RocmVzaG9sZCAqIEhaOwogCXdoaWxlICghY2xlYW51cF9vbmNlKHR0bCkpIHsKIAkJaWYgKGppZmZpZXMgIT0gbm93KQogCQkJYnJlYWs7CkBAIC00MzksMjIgKzQ4NiwyNSBAQAogCS8qIFRyaWdnZXIgdGhlIHRpbWVyIGFmdGVyIGluZXRfcGVlcl9nY19taW50aW1lIC4uIGluZXRfcGVlcl9nY19tYXh0aW1lCiAJICogaW50ZXJ2YWwgZGVwZW5kaW5nIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyAobW9yZSBlbnRyaWVzLAogCSAqIGxlc3MgaW50ZXJ2YWwpLiAqLwotCWlmIChwZWVyX3RvdGFsID49IGluZXRfcGVlcl90aHJlc2hvbGQpCisJaWYgKHBlZXJzLnRvdGFsID49IGluZXRfcGVlcl90aHJlc2hvbGQpCiAJCXBlZXJfcGVyaW9kaWNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBpbmV0X3BlZXJfZ2NfbWludGltZTsKIAllbHNlCiAJCXBlZXJfcGVyaW9kaWNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMKIAkJCSsgaW5ldF9wZWVyX2djX21heHRpbWUKIAkJCS0gKGluZXRfcGVlcl9nY19tYXh0aW1lIC0gaW5ldF9wZWVyX2djX21pbnRpbWUpIC8gSFogKgotCQkJCXBlZXJfdG90YWwgLyBpbmV0X3BlZXJfdGhyZXNob2xkICogSFo7CisJCQkJcGVlcnMudG90YWwgLyBpbmV0X3BlZXJfdGhyZXNob2xkICogSFo7CiAJYWRkX3RpbWVyKCZwZWVyX3BlcmlvZGljX3RpbWVyKTsKIH0KIAogdm9pZCBpbmV0X3B1dHBlZXIoc3RydWN0IGluZXRfcGVlciAqcCkKIHsKLQlzcGluX2xvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnAtPnJlZmNudCkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmcC0+dW51c2VkLCAmdW51c2VkX3BlZXJzKTsKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmcC0+cmVmY250LCAmdW51c2VkX3BlZXJzLmxvY2spKSB7CisJCWxpc3RfYWRkX3RhaWwoJnAtPnVudXNlZCwgJnVudXNlZF9wZWVycy5saXN0KTsKIAkJcC0+ZHRpbWUgPSAoX191MzIpamlmZmllczsKKwkJc3Bpbl91bmxvY2soJnVudXNlZF9wZWVycy5sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7CisKKwlsb2NhbF9iaF9lbmFibGUoKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2ZvcndhcmQuYyBiL25ldC9pcHY0L2lwX2ZvcndhcmQuYwppbmRleCA1NmNkZjY4Li45OTQ2MWYwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKKysrIGIvbmV0L2lwdjQvaXBfZm9yd2FyZC5jCkBAIC04NywxNiArODcsMTYgQEAKIAlpZiAob3B0LT5pc19zdHJpY3Ryb3V0ZSAmJiBydC0+cnRfZHN0ICE9IHJ0LT5ydF9nYXRld2F5KQogCQlnb3RvIHNyX2ZhaWxlZDsKIAotCWlmICh1bmxpa2VseShza2ItPmxlbiA+IGRzdF9tdHUoJnJ0LT51LmRzdCkgJiYgIXNrYl9pc19nc28oc2tiKSAmJgorCWlmICh1bmxpa2VseShza2ItPmxlbiA+IGRzdF9tdHUoJnJ0LT5kc3QpICYmICFza2JfaXNfZ3NvKHNrYikgJiYKIAkJICAgICAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgJiYgIXNrYi0+bG9jYWxfZGYpIHsKLQkJSVBfSU5DX1NUQVRTKGRldl9uZXQocnQtPnUuZHN0LmRldiksIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCUlQX0lOQ19TVEFUUyhkZXZfbmV0KHJ0LT5kc3QuZGV2KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsCi0JCQkgIGh0b25sKGRzdF9tdHUoJnJ0LT51LmRzdCkpKTsKKwkJCSAgaHRvbmwoZHN0X210dSgmcnQtPmRzdCkpKTsKIAkJZ290byBkcm9wOwogCX0KIAogCS8qIFdlIGFyZSBhYm91dCB0byBtYW5nbGUgcGFja2V0LiBDb3B5IGl0ISAqLwotCWlmIChza2JfY293KHNrYiwgTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldikrcnQtPnUuZHN0LmhlYWRlcl9sZW4pKQorCWlmIChza2JfY293KHNrYiwgTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpK3J0LT5kc3QuaGVhZGVyX2xlbikpCiAJCWdvdG8gZHJvcDsKIAlpcGggPSBpcF9oZHIoc2tiKTsKIApAQCAtMTEzLDcgKzExMyw3IEBACiAJc2tiLT5wcmlvcml0eSA9IHJ0X3RvczJwcmlvcml0eShpcGgtPnRvcyk7CiAKIAlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0lQVjQsIE5GX0lORVRfRk9SV0FSRCwgc2tiLCBza2ItPmRldiwKLQkJICAgICAgIHJ0LT51LmRzdC5kZXYsIGlwX2ZvcndhcmRfZmluaXNoKTsKKwkJICAgICAgIHJ0LT5kc3QuZGV2LCBpcF9mb3J3YXJkX2ZpbmlzaCk7CiAKIHNyX2ZhaWxlZDoKIAkvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKaW5kZXggNzUzNDdlYS4uYjdjNDE2NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYworKysgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCkBAIC0xMjQsMTEgKzEyNCw4IEBACiB9CiAKIC8qIE1lbW9yeSBUcmFja2luZyBGdW5jdGlvbnMuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZyYWdfa2ZyZWVfc2tiKHN0cnVjdCBuZXRuc19mcmFncyAqbmYsCi0JCXN0cnVjdCBza19idWZmICpza2IsIGludCAqd29yaykKK3N0YXRpYyB2b2lkIGZyYWdfa2ZyZWVfc2tiKHN0cnVjdCBuZXRuc19mcmFncyAqbmYsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKHdvcmspCi0JCSp3b3JrIC09IHNrYi0+dHJ1ZXNpemU7CiAJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmbmYtPm1lbSk7CiAJa2ZyZWVfc2tiKHNrYik7CiB9CkBAIC0zMDksNyArMzA2LDcgQEAKIAlmcCA9IHFwLT5xLmZyYWdtZW50czsKIAlkbyB7CiAJCXN0cnVjdCBza19idWZmICp4cCA9IGZwLT5uZXh0OwotCQlmcmFnX2tmcmVlX3NrYihxcC0+cS5uZXQsIGZwLCBOVUxMKTsKKwkJZnJhZ19rZnJlZV9za2IocXAtPnEubmV0LCBmcCk7CiAJCWZwID0geHA7CiAJfSB3aGlsZSAoZnApOwogCkBAIC0zMTcsNiArMzE0LDcgQEAKIAlxcC0+cS5sZW4gPSAwOwogCXFwLT5xLm1lYXQgPSAwOwogCXFwLT5xLmZyYWdtZW50cyA9IE5VTEw7CisJcXAtPnEuZnJhZ21lbnRzX3RhaWwgPSBOVUxMOwogCXFwLT5paWYgPSAwOwogCiAJcmV0dXJuIDA7CkBAIC0zODksNiArMzg3LDExIEBACiAJICogaW4gdGhlIGNoYWluIG9mIGZyYWdtZW50cyBzbyBmYXIuICBXZSBtdXN0IGtub3cgd2hlcmUgdG8gcHV0CiAJICogdGhpcyBmcmFnbWVudCwgcmlnaHQ/CiAJICovCisJcHJldiA9IHFwLT5xLmZyYWdtZW50c190YWlsOworCWlmICghcHJldiB8fCBGUkFHX0NCKHByZXYpLT5vZmZzZXQgPCBvZmZzZXQpIHsKKwkJbmV4dCA9IE5VTEw7CisJCWdvdG8gZm91bmQ7CisJfQogCXByZXYgPSBOVUxMOwogCWZvciAobmV4dCA9IHFwLT5xLmZyYWdtZW50czsgbmV4dCAhPSBOVUxMOyBuZXh0ID0gbmV4dC0+bmV4dCkgewogCQlpZiAoRlJBR19DQihuZXh0KS0+b2Zmc2V0ID49IG9mZnNldCkKQEAgLTM5Niw2ICszOTksNyBAQAogCQlwcmV2ID0gbmV4dDsKIAl9CiAKK2ZvdW5kOgogCS8qIFdlIGZvdW5kIHdoZXJlIHRvIHB1dCB0aGlzIG9uZS4gIENoZWNrIGZvciBvdmVybGFwIHdpdGgKIAkgKiBwcmVjZWRpbmcgZnJhZ21lbnQsIGFuZCwgaWYgbmVlZGVkLCBhbGlnbiB0aGluZ3Mgc28gdGhhdAogCSAqIGFueSBvdmVybGFwcyBhcmUgZWxpbWluYXRlZC4KQEAgLTQ0Niw3ICs0NTAsNyBAQAogCQkJCXFwLT5xLmZyYWdtZW50cyA9IG5leHQ7CiAKIAkJCXFwLT5xLm1lYXQgLT0gZnJlZV9pdC0+bGVuOwotCQkJZnJhZ19rZnJlZV9za2IocXAtPnEubmV0LCBmcmVlX2l0LCBOVUxMKTsKKwkJCWZyYWdfa2ZyZWVfc2tiKHFwLT5xLm5ldCwgZnJlZV9pdCk7CiAJCX0KIAl9CiAKQEAgLTQ1NCw2ICs0NTgsOCBAQAogCiAJLyogSW5zZXJ0IHRoaXMgZnJhZ21lbnQgaW4gdGhlIGNoYWluIG9mIGZyYWdtZW50cy4gKi8KIAlza2ItPm5leHQgPSBuZXh0OworCWlmICghbmV4dCkKKwkJcXAtPnEuZnJhZ21lbnRzX3RhaWwgPSBza2I7CiAJaWYgKHByZXYpCiAJCXByZXYtPm5leHQgPSBza2I7CiAJZWxzZQpAQCAtNTA3LDYgKzUxMyw4IEBACiAJCQlnb3RvIG91dF9ub21lbTsKIAogCQlmcC0+bmV4dCA9IGhlYWQtPm5leHQ7CisJCWlmICghZnAtPm5leHQpCisJCQlxcC0+cS5mcmFnbWVudHNfdGFpbCA9IGZwOwogCQlwcmV2LT5uZXh0ID0gZnA7CiAKIAkJc2tiX21vcnBoKGhlYWQsIHFwLT5xLmZyYWdtZW50cyk7CkBAIC01NTYsNyArNTY0LDYgQEAKIAogCXNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdCA9IGhlYWQtPm5leHQ7CiAJc2tiX3B1c2goaGVhZCwgaGVhZC0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSk7Ci0JYXRvbWljX3N1YihoZWFkLT50cnVlc2l6ZSwgJnFwLT5xLm5ldC0+bWVtKTsKIAogCWZvciAoZnA9aGVhZC0+bmV4dDsgZnA7IGZwID0gZnAtPm5leHQpIHsKIAkJaGVhZC0+ZGF0YV9sZW4gKz0gZnAtPmxlbjsKQEAgLTU2Niw4ICs1NzMsOCBAQAogCQllbHNlIGlmIChoZWFkLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCiAJCQloZWFkLT5jc3VtID0gY3N1bV9hZGQoaGVhZC0+Y3N1bSwgZnAtPmNzdW0pOwogCQloZWFkLT50cnVlc2l6ZSArPSBmcC0+dHJ1ZXNpemU7Ci0JCWF0b21pY19zdWIoZnAtPnRydWVzaXplLCAmcXAtPnEubmV0LT5tZW0pOwogCX0KKwlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmcXAtPnEubmV0LT5tZW0pOwogCiAJaGVhZC0+bmV4dCA9IE5VTEw7CiAJaGVhZC0+ZGV2ID0gZGV2OwpAQCAtNTc4LDYgKzU4NSw3IEBACiAJaXBoLT50b3RfbGVuID0gaHRvbnMobGVuKTsKIAlJUF9JTkNfU1RBVFNfQkgobmV0LCBJUFNUQVRTX01JQl9SRUFTTU9LUyk7CiAJcXAtPnEuZnJhZ21lbnRzID0gTlVMTDsKKwlxcC0+cS5mcmFnbWVudHNfdGFpbCA9IE5VTEw7CiAJcmV0dXJuIDA7CiAKIG91dF9ub21lbToKQEAgLTYyNCw2ICs2MzIsNyBAQAogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtRU5PTUVNOwogfQorRVhQT1JUX1NZTUJPTChpcF9kZWZyYWcpOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGludCB6ZXJvOwpAQCAtNzc3LDUgKzc4NiwzIEBACiAJaXA0X2ZyYWdzLnNlY3JldF9pbnRlcnZhbCA9IDEwICogNjAgKiBIWjsKIAlpbmV0X2ZyYWdzX2luaXQoJmlwNF9mcmFncyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0woaXBfZGVmcmFnKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggMzI2MThlMS4uOTQ1YjIwYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTczMSw2ICs3MzEsOCBAQAogCQl0b3MgPSAwOwogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCQl0b3MgPSBvbGRfaXBoLT50b3M7CisJCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpCisJCQl0b3MgPSBpcHY2X2dldF9kc2ZpZWxkKChzdHJ1Y3QgaXB2NmhkciAqKW9sZF9pcGgpOwogCX0KIAogCXsKQEAgLTc0NSw3ICs3NDcsNyBAQAogCQkJZ290byB0eF9lcnJvcjsKIAkJfQogCX0KLQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKwl0ZGV2ID0gcnQtPmRzdC5kZXY7CiAKIAlpZiAodGRldiA9PSBkZXYpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKQEAgLTc1NSw3ICs3NTcsNyBAQAogCiAJZGYgPSB0aXBoLT5mcmFnX29mZjsKIAlpZiAoZGYpCi0JCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCkgLSBkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIHR1bm5lbC0+aGxlbjsKKwkJbXR1ID0gZHN0X210dSgmcnQtPmRzdCkgLSBkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIHR1bm5lbC0+aGxlbjsKIAllbHNlCiAJCW10dSA9IHNrYl9kc3Qoc2tiKSA/IGRzdF9tdHUoc2tiX2RzdChza2IpKSA6IGRldi0+bXR1OwogCkBAIC04MDMsNyArODA1LDcgQEAKIAkJCXR1bm5lbC0+ZXJyX2NvdW50ID0gMDsKIAl9CiAKLQltYXhfaGVhZHJvb20gPSBMTF9SRVNFUlZFRF9TUEFDRSh0ZGV2KSArIGdyZV9obGVuICsgcnQtPnUuZHN0LmhlYWRlcl9sZW47CisJbWF4X2hlYWRyb29tID0gTExfUkVTRVJWRURfU1BBQ0UodGRldikgKyBncmVfaGxlbiArIHJ0LT5kc3QuaGVhZGVyX2xlbjsKIAogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IG1heF9oZWFkcm9vbSB8fCBza2Jfc2hhcmVkKHNrYil8fAogCSAgICAoc2tiX2Nsb25lZChza2IpICYmICFza2JfY2xvbmVfd3JpdGFibGUoc2tiLCAwKSkpIHsKQEAgLTgzMCw3ICs4MzIsNyBAQAogCUlQQ0Ioc2tiKS0+ZmxhZ3MgJj0gfihJUFNLQl9YRlJNX1RVTk5FTF9TSVpFIHwgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCB8CiAJCQkgICAgICBJUFNLQl9SRVJPVVRFRCk7CiAJc2tiX2RzdF9kcm9wKHNrYik7Ci0Jc2tiX2RzdF9zZXQoc2tiLCAmcnQtPnUuZHN0KTsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAogCS8qCiAJICoJUHVzaCBkb3duIGFuZCBpbnN0YWxsIHRoZSBJUElQIGhlYWRlci4KQEAgLTg1Myw3ICs4NTUsNyBAQAogCQkJaXBoLT50dGwgPSAoKHN0cnVjdCBpcHY2aGRyICopb2xkX2lwaCktPmhvcF9saW1pdDsKICNlbmRpZgogCQllbHNlCi0JCQlpcGgtPnR0bCA9IGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9IT1BMSU1JVCk7CisJCQlpcGgtPnR0bCA9IGRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfSE9QTElNSVQpOwogCX0KIAogCSgoX19iZTE2ICopKGlwaCArIDEpKVswXSA9IHR1bm5lbC0+cGFybXMub19mbGFnczsKQEAgLTkxNSw3ICs5MTcsNyBAQAogCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX0dSRSB9OwogCQlzdHJ1Y3QgcnRhYmxlICpydDsKIAkJaWYgKCFpcF9yb3V0ZV9vdXRwdXRfa2V5KGRldl9uZXQoZGV2KSwgJnJ0LCAmZmwpKSB7Ci0JCQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJCXRkZXYgPSBydC0+ZHN0LmRldjsKIAkJCWlwX3J0X3B1dChydCk7CiAJCX0KIApAQCAtMTE3NCw3ICsxMTc2LDcgQEAKIAkJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KGRldl9uZXQoZGV2KSwgJnJ0LCAmZmwpKQogCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwotCQlkZXYgPSBydC0+dS5kc3QuZGV2OworCQlkZXYgPSBydC0+ZHN0LmRldjsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJaWYgKF9faW5fZGV2X2dldF9ydG5sKGRldikgPT0gTlVMTCkKIAkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCmluZGV4IGQ5MzBkYzUuLmQ4NTliY2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogCiAvKgotICoJUHJvY2VzcyBSb3V0ZXIgQXR0ZW50aW9uIElQIG9wdGlvbgorICoJUHJvY2VzcyBSb3V0ZXIgQXR0ZW50aW9uIElQIG9wdGlvbiAoUkZDIDIxMTMpCiAgKi8KIGludCBpcF9jYWxsX3JhX2NoYWluKHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xNTUsOCArMTU1LDcgQEAKIAlzdHJ1Y3Qgc29jayAqbGFzdCA9IE5VTEw7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCi0JcmVhZF9sb2NrKCZpcF9yYV9sb2NrKTsKLQlmb3IgKHJhID0gaXBfcmFfY2hhaW47IHJhOyByYSA9IHJhLT5uZXh0KSB7CisJZm9yIChyYSA9IHJjdV9kZXJlZmVyZW5jZShpcF9yYV9jaGFpbik7IHJhOyByYSA9IHJjdV9kZXJlZmVyZW5jZShyYS0+bmV4dCkpIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gcmEtPnNrOwogCiAJCS8qIElmIHNvY2tldCBpcyBib3VuZCB0byBhbiBpbnRlcmZhY2UsIG9ubHkgcmVwb3J0CkBAIC0xNjcsMTAgKzE2Niw4IEBACiAJCSAgICAgc2stPnNrX2JvdW5kX2Rldl9pZiA9PSBkZXYtPmlmaW5kZXgpICYmCiAJCSAgICBuZXRfZXEoc29ja19uZXQoc2spLCBkZXZfbmV0KGRldikpKSB7CiAJCQlpZiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSB7Ci0JCQkJaWYgKGlwX2RlZnJhZyhza2IsIElQX0RFRlJBR19DQUxMX1JBX0NIQUlOKSkgewotCQkJCQlyZWFkX3VubG9jaygmaXBfcmFfbG9jayk7CisJCQkJaWYgKGlwX2RlZnJhZyhza2IsIElQX0RFRlJBR19DQUxMX1JBX0NIQUlOKSkKIAkJCQkJcmV0dXJuIDE7Ci0JCQkJfQogCQkJfQogCQkJaWYgKGxhc3QpIHsKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwpAQCAtMTgzLDEwICsxODAsOCBAQAogCiAJaWYgKGxhc3QpIHsKIAkJcmF3X3JjdihsYXN0LCBza2IpOwotCQlyZWFkX3VubG9jaygmaXBfcmFfbG9jayk7CiAJCXJldHVybiAxOwogCX0KLQlyZWFkX3VubG9jaygmaXBfcmFfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5OCwxOCArMjkzLDE2IEBACiAJfQogCiAJaWYgKHVubGlrZWx5KG9wdC0+c3JyKSkgewotCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKKwogCQlpZiAoaW5fZGV2KSB7CiAJCQlpZiAoIUlOX0RFVl9TT1VSQ0VfUk9VVEUoaW5fZGV2KSkgewogCQkJCWlmIChJTl9ERVZfTE9HX01BUlRJQU5TKGluX2RldikgJiYKIAkJCQkgICAgbmV0X3JhdGVsaW1pdCgpKQogCQkJCQlwcmludGsoS0VSTl9JTkZPICJzb3VyY2Ugcm91dGUgb3B0aW9uICVwSTQgLT4gJXBJNFxuIiwKIAkJCQkJICAgICAgICZpcGgtPnNhZGRyLCAmaXBoLT5kYWRkcik7Ci0JCQkJaW5fZGV2X3B1dChpbl9kZXYpOwogCQkJCWdvdG8gZHJvcDsKIAkJCX0KLQotCQkJaW5fZGV2X3B1dChpbl9kZXYpOwogCQl9CiAKIAkJaWYgKGlwX29wdGlvbnNfcmN2X3Nycihza2IpKQpAQCAtMzQwLDEzICszMzMsMTYgQEAKIAkJCWVsc2UgaWYgKGVyciA9PSAtRU5FVFVOUkVBQ0gpCiAJCQkJSVBfSU5DX1NUQVRTX0JIKGRldl9uZXQoc2tiLT5kZXYpLAogCQkJCQkJSVBTVEFUU19NSUJfSU5OT1JPVVRFUyk7CisJCQllbHNlIGlmIChlcnIgPT0gLUVYREVWKQorCQkJCU5FVF9JTkNfU1RBVFNfQkgoZGV2X25ldChza2ItPmRldiksCisJCQkJCQkgTElOVVhfTUlCX0lQUlBGSUxURVIpOwogCQkJZ290byBkcm9wOwogCQl9CiAJfQogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKIAlpZiAodW5saWtlbHkoc2tiX2RzdChza2IpLT50Y2xhc3NpZCkpIHsKLQkJc3RydWN0IGlwX3J0X2FjY3QgKnN0ID0gcGVyX2NwdV9wdHIoaXBfcnRfYWNjdCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJc3RydWN0IGlwX3J0X2FjY3QgKnN0ID0gdGhpc19jcHVfcHRyKGlwX3J0X2FjY3QpOwogCQl1MzIgaWR4ID0gc2tiX2RzdChza2IpLT50Y2xhc3NpZDsKIAkJc3RbaWR4JjB4RkZdLm9fcGFja2V0cysrOwogCQlzdFtpZHgmMHhGRl0ub19ieXRlcyArPSBza2ItPmxlbjsKQEAgLTM2MCwxMCArMzU2LDEwIEBACiAKIAlydCA9IHNrYl9ydGFibGUoc2tiKTsKIAlpZiAocnQtPnJ0X3R5cGUgPT0gUlROX01VTFRJQ0FTVCkgewotCQlJUF9VUERfUE9fU1RBVFNfQkgoZGV2X25ldChydC0+dS5kc3QuZGV2KSwgSVBTVEFUU19NSUJfSU5NQ0FTVCwKKwkJSVBfVVBEX1BPX1NUQVRTX0JIKGRldl9uZXQocnQtPmRzdC5kZXYpLCBJUFNUQVRTX01JQl9JTk1DQVNULAogCQkJCXNrYi0+bGVuKTsKIAl9IGVsc2UgaWYgKHJ0LT5ydF90eXBlID09IFJUTl9CUk9BRENBU1QpCi0JCUlQX1VQRF9QT19TVEFUU19CSChkZXZfbmV0KHJ0LT51LmRzdC5kZXYpLCBJUFNUQVRTX01JQl9JTkJDQVNULAorCQlJUF9VUERfUE9fU1RBVFNfQkgoZGV2X25ldChydC0+ZHN0LmRldiksIElQU1RBVFNfTUlCX0lOQkNBU1QsCiAJCQkJc2tiLT5sZW4pOwogCiAJcmV0dXJuIGRzdF9pbnB1dChza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCAwNDFkNDFkLi4wNGI2OTg5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtODksNiArODksNyBAQAogCWlwaC0+Y2hlY2sgPSAwOwogCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIH0KK0VYUE9SVF9TWU1CT0woaXBfc2VuZF9jaGVjayk7CiAKIGludCBfX2lwX2xvY2FsX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTUxLDE1ICsxNTIsMTUgQEAKIAlpcGgtPnZlcnNpb24gID0gNDsKIAlpcGgtPmlobCAgICAgID0gNTsKIAlpcGgtPnRvcyAgICAgID0gaW5ldC0+dG9zOwotCWlmIChpcF9kb250X2ZyYWdtZW50KHNrLCAmcnQtPnUuZHN0KSkKKwlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT5kc3QpKQogCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwogCWVsc2UKIAkJaXBoLT5mcmFnX29mZiA9IDA7Ci0JaXBoLT50dGwgICAgICA9IGlwX3NlbGVjdF90dGwoaW5ldCwgJnJ0LT51LmRzdCk7CisJaXBoLT50dGwgICAgICA9IGlwX3NlbGVjdF90dGwoaW5ldCwgJnJ0LT5kc3QpOwogCWlwaC0+ZGFkZHIgICAgPSBydC0+cnRfZHN0OwogCWlwaC0+c2FkZHIgICAgPSBydC0+cnRfc3JjOwogCWlwaC0+cHJvdG9jb2wgPSBzay0+c2tfcHJvdG9jb2w7Ci0JaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgc2spOworCWlwX3NlbGVjdF9pZGVudChpcGgsICZydC0+ZHN0LCBzayk7CiAKIAlpZiAob3B0ICYmIG9wdC0+b3B0bGVuKSB7CiAJCWlwaC0+aWhsICs9IG9wdC0+b3B0bGVuPj4yOwpAQCAtMTcyLDcgKzE3Myw2IEBACiAJLyogU2VuZCBpdCBvdXQuICovCiAJcmV0dXJuIGlwX2xvY2FsX291dChza2IpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpcF9idWlsZF9hbmRfc2VuZF9wa3QpOwogCiBzdGF0aWMgaW5saW5lIGludCBpcF9maW5pc2hfb3V0cHV0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjQwLDcgKzI0MCw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IHNrYl9ydGFibGUoc2tiKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcnQtPnUuZHN0LmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcnQtPmRzdC5kZXY7CiAKIAkvKgogCSAqCUlmIHRoZSBpbmRpY2F0ZWQgaW50ZXJmYWNlIGlzIHVwIGFuZCBydW5uaW5nLCBzZW5kIHRoZSBwYWNrZXQuCkBAIC0zNTksOSArMzU5LDkgQEAKIAkJCWlmIChpcF9yb3V0ZV9vdXRwdXRfZmxvdyhzb2NrX25ldChzayksICZydCwgJmZsLCBzaywgMCkpCiAJCQkJZ290byBub19yb3V0ZTsKIAkJfQotCQlza19zZXR1cF9jYXBzKHNrLCAmcnQtPnUuZHN0KTsKKwkJc2tfc2V0dXBfY2FwcyhzaywgJnJ0LT5kc3QpOwogCX0KLQlza2JfZHN0X3NldF9ub3JlZihza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0X25vcmVmKHNrYiwgJnJ0LT5kc3QpOwogCiBwYWNrZXRfcm91dGVkOgogCWlmIChvcHQgJiYgb3B0LT5pc19zdHJpY3Ryb3V0ZSAmJiBydC0+cnRfZHN0ICE9IHJ0LT5ydF9nYXRld2F5KQpAQCAtMzcyLDExICszNzIsMTEgQEAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlpcGggPSBpcF9oZHIoc2tiKTsKIAkqKChfX2JlMTYgKilpcGgpID0gaHRvbnMoKDQgPDwgMTIpIHwgKDUgPDwgOCkgfCAoaW5ldC0+dG9zICYgMHhmZikpOwotCWlmIChpcF9kb250X2ZyYWdtZW50KHNrLCAmcnQtPnUuZHN0KSAmJiAhc2tiLT5sb2NhbF9kZikKKwlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT5kc3QpICYmICFza2ItPmxvY2FsX2RmKQogCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwogCWVsc2UKIAkJaXBoLT5mcmFnX29mZiA9IDA7Ci0JaXBoLT50dGwgICAgICA9IGlwX3NlbGVjdF90dGwoaW5ldCwgJnJ0LT51LmRzdCk7CisJaXBoLT50dGwgICAgICA9IGlwX3NlbGVjdF90dGwoaW5ldCwgJnJ0LT5kc3QpOwogCWlwaC0+cHJvdG9jb2wgPSBzay0+c2tfcHJvdG9jb2w7CiAJaXBoLT5zYWRkciAgICA9IHJ0LT5ydF9zcmM7CiAJaXBoLT5kYWRkciAgICA9IHJ0LT5ydF9kc3Q7CkBAIC0zODcsNyArMzg3LDcgQEAKIAkJaXBfb3B0aW9uc19idWlsZChza2IsIG9wdCwgaW5ldC0+aW5ldF9kYWRkciwgcnQsIDApOwogCX0KIAotCWlwX3NlbGVjdF9pZGVudF9tb3JlKGlwaCwgJnJ0LT51LmRzdCwgc2ssCisJaXBfc2VsZWN0X2lkZW50X21vcmUoaXBoLCAmcnQtPmRzdCwgc2ssCiAJCQkgICAgIChza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID86IDEpIC0gMSk7CiAKIAlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CiB9CitFWFBPUlRfU1lNQk9MKGlwX3F1ZXVlX3htaXQpOwogCiAKIHN0YXRpYyB2b2lkIGlwX2NvcHlfbWV0YWRhdGEoc3RydWN0IHNrX2J1ZmYgKnRvLCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSkKQEAgLTQxMSw3ICs0MTIsNyBAQAogCXRvLT5wcmlvcml0eSA9IGZyb20tPnByaW9yaXR5OwogCXRvLT5wcm90b2NvbCA9IGZyb20tPnByb3RvY29sOwogCXNrYl9kc3RfZHJvcCh0byk7Ci0Jc2tiX2RzdF9zZXQodG8sIGRzdF9jbG9uZShza2JfZHN0KGZyb20pKSk7CisJc2tiX2RzdF9jb3B5KHRvLCBmcm9tKTsKIAl0by0+ZGV2ID0gZnJvbS0+ZGV2OwogCXRvLT5tYXJrID0gZnJvbS0+bWFyazsKIApAQCAtNDQyLDE3ICs0NDMsMTYgQEAKIGludCBpcF9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKCpvdXRwdXQpKHN0cnVjdCBza19idWZmICopKQogewogCXN0cnVjdCBpcGhkciAqaXBoOwotCWludCByYXcgPSAwOwogCWludCBwdHI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKLQl1bnNpZ25lZCBpbnQgbXR1LCBobGVuLCBsZWZ0LCBsZW4sIGxsX3JzLCBwYWQ7CisJdW5zaWduZWQgaW50IG10dSwgaGxlbiwgbGVmdCwgbGVuLCBsbF9yczsKIAlpbnQgb2Zmc2V0OwogCV9fYmUxNiBub3RfbGFzdF9mcmFnOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gc2tiX3J0YWJsZShza2IpOwogCWludCBlcnIgPSAwOwogCi0JZGV2ID0gcnQtPnUuZHN0LmRldjsKKwlkZXYgPSBydC0+ZHN0LmRldjsKIAogCS8qCiAJICoJUG9pbnQgaW50byB0aGUgSVAgZGF0YWdyYW0gaGVhZGVyLgpAQCAtNDczLDcgKzQ3Myw3IEBACiAJICovCiAKIAlobGVuID0gaXBoLT5paGwgKiA0OwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCkgLSBobGVuOwkvKiBTaXplIG9mIGRhdGEgc3BhY2UgKi8KKwltdHUgPSBkc3RfbXR1KCZydC0+ZHN0KSAtIGhsZW47CS8qIFNpemUgb2YgZGF0YSBzcGFjZSAqLwogI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCiAJaWYgKHNrYi0+bmZfYnJpZGdlKQogCQltdHUgLT0gbmZfYnJpZGdlX210dV9yZWR1Y3Rpb24oc2tiKTsKQEAgLTU4MCwxNCArNTgwLDEyIEBACiAKIHNsb3dfcGF0aDoKIAlsZWZ0ID0gc2tiLT5sZW4gLSBobGVuOwkJLyogU3BhY2UgcGVyIGZyYW1lICovCi0JcHRyID0gcmF3ICsgaGxlbjsJCS8qIFdoZXJlIHRvIHN0YXJ0IGZyb20gKi8KKwlwdHIgPSBobGVuOwkJLyogV2hlcmUgdG8gc3RhcnQgZnJvbSAqLwogCiAJLyogZm9yIGJyaWRnZWQgSVAgdHJhZmZpYyBlbmNhcHN1bGF0ZWQgaW5zaWRlIGYuZS4gYSB2bGFuIGhlYWRlciwKIAkgKiB3ZSBuZWVkIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGVuY2Fwc3VsYXRpbmcgaGVhZGVyCiAJICovCi0JcGFkID0gbmZfYnJpZGdlX3BhZChza2IpOwotCWxsX3JzID0gTExfUkVTRVJWRURfU1BBQ0VfRVhUUkEocnQtPnUuZHN0LmRldiwgcGFkKTsKLQltdHUgLT0gcGFkOworCWxsX3JzID0gTExfUkVTRVJWRURfU1BBQ0VfRVhUUkEocnQtPmRzdC5kZXYsIG5mX2JyaWRnZV9wYWQoc2tiKSk7CiAKIAkvKgogCSAqCUZyYWdtZW50IHRoZSBkYXRhZ3JhbS4KQEAgLTY5Nyw3ICs2OTUsNiBAQAogCUlQX0lOQ19TVEFUUyhkZXZfbmV0KGRldiksIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJcmV0dXJuIGVycjsKIH0KLQogRVhQT1JUX1NZTUJPTChpcF9mcmFnbWVudCk7CiAKIGludApAQCAtNzE2LDYgKzcxMyw3IEBACiAJfQogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChpcF9nZW5lcmljX2dldGZyYWcpOwogCiBzdGF0aWMgaW5saW5lIF9fd3N1bQogY3N1bV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LCBpbnQgY29weSkKQEAgLTgzMywxMyArODMxLDEzIEBACiAJCSAqLwogCQkqcnRwID0gTlVMTDsKIAkJaW5ldC0+Y29yay5mcmFnc2l6ZSA9IG10dSA9IGluZXQtPnBtdHVkaXNjID09IElQX1BNVFVESVNDX1BST0JFID8KLQkJCQkJICAgIHJ0LT51LmRzdC5kZXYtPm10dSA6Ci0JCQkJCSAgICBkc3RfbXR1KHJ0LT51LmRzdC5wYXRoKTsKLQkJaW5ldC0+Y29yay5kc3QgPSAmcnQtPnUuZHN0OworCQkJCQkgICAgcnQtPmRzdC5kZXYtPm10dSA6CisJCQkJCSAgICBkc3RfbXR1KHJ0LT5kc3QucGF0aCk7CisJCWluZXQtPmNvcmsuZHN0ID0gJnJ0LT5kc3Q7CiAJCWluZXQtPmNvcmsubGVuZ3RoID0gMDsKIAkJc2stPnNrX3NuZG1zZ19wYWdlID0gTlVMTDsKIAkJc2stPnNrX3NuZG1zZ19vZmYgPSAwOwotCQlpZiAoKGV4dGhkcmxlbiA9IHJ0LT51LmRzdC5oZWFkZXJfbGVuKSAhPSAwKSB7CisJCWlmICgoZXh0aGRybGVuID0gcnQtPmRzdC5oZWFkZXJfbGVuKSAhPSAwKSB7CiAJCQlsZW5ndGggKz0gZXh0aGRybGVuOwogCQkJdHJhbnNoZHJsZW4gKz0gZXh0aGRybGVuOwogCQl9CkBAIC04NTIsNyArODUwLDcgQEAKIAkJZXh0aGRybGVuID0gMDsKIAkJbXR1ID0gaW5ldC0+Y29yay5mcmFnc2l6ZTsKIAl9Ci0JaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldik7CisJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpOwogCiAJZnJhZ2hlYWRlcmxlbiA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgKG9wdCA/IG9wdC0+b3B0bGVuIDogMCk7CiAJbWF4ZnJhZ2xlbiA9ICgobXR1IC0gZnJhZ2hlYWRlcmxlbikgJiB+NykgKyBmcmFnaGVhZGVybGVuOwpAQCAtODY5LDcgKzg2Nyw3IEBACiAJICovCiAJaWYgKHRyYW5zaGRybGVuICYmCiAJICAgIGxlbmd0aCArIGZyYWdoZWFkZXJsZW4gPD0gbXR1ICYmCi0JICAgIHJ0LT51LmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WNF9DU1VNICYmCisJICAgIHJ0LT5kc3QuZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVjRfQ1NVTSAmJgogCSAgICAhZXh0aGRybGVuKQogCQljc3VtbW9kZSA9IENIRUNLU1VNX1BBUlRJQUw7CiAKQEAgLTg3OCw3ICs4NzYsNyBAQAogCWluZXQtPmNvcmsubGVuZ3RoICs9IGxlbmd0aDsKIAlpZiAoKChsZW5ndGggPiBtdHUpIHx8IChza2IgJiYgc2tiX2lzX2dzbyhza2IpKSkgJiYKIAkgICAgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgJiYKLQkgICAgKHJ0LT51LmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pKSB7CisJICAgIChydC0+ZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykpIHsKIAkJZXJyID0gaXBfdWZvX2FwcGVuZF9kYXRhKHNrLCBnZXRmcmFnLCBmcm9tLCBsZW5ndGgsIGhoX2xlbiwKIAkJCQkJIGZyYWdoZWFkZXJsZW4sIHRyYW5zaGRybGVuLCBtdHUsCiAJCQkJCSBmbGFncyk7CkBAIC05MjYsNyArOTI0LDcgQEAKIAkJCWZyYWdsZW4gPSBkYXRhbGVuICsgZnJhZ2hlYWRlcmxlbjsKIAogCQkJaWYgKChmbGFncyAmIE1TR19NT1JFKSAmJgotCQkJICAgICEocnQtPnUuZHN0LmRldi0+ZmVhdHVyZXMmTkVUSUZfRl9TRykpCisJCQkgICAgIShydC0+ZHN0LmRldi0+ZmVhdHVyZXMmTkVUSUZfRl9TRykpCiAJCQkJYWxsb2NsZW4gPSBtdHU7CiAJCQllbHNlCiAJCQkJYWxsb2NsZW4gPSBkYXRhbGVuICsgZnJhZ2hlYWRlcmxlbjsKQEAgLTkzNyw3ICs5MzUsNyBAQAogCQkJICogdGhlIGxhc3QuCiAJCQkgKi8KIAkJCWlmIChkYXRhbGVuID09IGxlbmd0aCArIGZyYWdnYXApCi0JCQkJYWxsb2NsZW4gKz0gcnQtPnUuZHN0LnRyYWlsZXJfbGVuOworCQkJCWFsbG9jbGVuICs9IHJ0LT5kc3QudHJhaWxlcl9sZW47CiAKIAkJCWlmICh0cmFuc2hkcmxlbikgewogCQkJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCkBAIC0xMDEwLDcgKzEwMDgsNyBAQAogCQlpZiAoY29weSA+IGxlbmd0aCkKIAkJCWNvcHkgPSBsZW5ndGg7CiAKLQkJaWYgKCEocnQtPnUuZHN0LmRldi0+ZmVhdHVyZXMmTkVUSUZfRl9TRykpIHsKKwkJaWYgKCEocnQtPmRzdC5kZXYtPmZlYXR1cmVzJk5FVElGX0ZfU0cpKSB7CiAJCQl1bnNpZ25lZCBpbnQgb2ZmOwogCiAJCQlvZmYgPSBza2ItPmxlbjsKQEAgLTExMDUsMTAgKzExMDMsMTAgQEAKIAlpZiAoaW5ldC0+Y29yay5mbGFncyAmIElQQ09SS19PUFQpCiAJCW9wdCA9IGluZXQtPmNvcmsub3B0OwogCi0JaWYgKCEocnQtPnUuZHN0LmRldi0+ZmVhdHVyZXMmTkVUSUZfRl9TRykpCisJaWYgKCEocnQtPmRzdC5kZXYtPmZlYXR1cmVzJk5FVElGX0ZfU0cpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQloaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+dS5kc3QuZGV2KTsKKwloaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldik7CiAJbXR1ID0gaW5ldC0+Y29yay5mcmFnc2l6ZTsKIAogCWZyYWdoZWFkZXJsZW4gPSBzaXplb2Yoc3RydWN0IGlwaGRyKSArIChvcHQgPyBvcHQtPm9wdGxlbiA6IDApOwpAQCAtMTEyNSw3ICsxMTIzLDcgQEAKIAlpbmV0LT5jb3JrLmxlbmd0aCArPSBzaXplOwogCWlmICgoc2l6ZSArIHNrYi0+bGVuID4gbXR1KSAmJgogCSAgICAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVURQKSAmJgotCSAgICAocnQtPnUuZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykpIHsKKwkgICAgKHJ0LT5kc3QuZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVUZPKSkgewogCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gbXR1IC0gZnJhZ2hlYWRlcmxlbjsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVURQOwogCX0KQEAgLTEyNzcsOCArMTI3NSw4IEBACiAJICogSWYgbG9jYWxfZGYgaXMgc2V0IHRvbywgd2Ugc3RpbGwgYWxsb3cgdG8gZnJhZ21lbnQgdGhpcyBmcmFtZQogCSAqIGxvY2FsbHkuICovCiAJaWYgKGluZXQtPnBtdHVkaXNjID49IElQX1BNVFVESVNDX0RPIHx8Ci0JICAgIChza2ItPmxlbiA8PSBkc3RfbXR1KCZydC0+dS5kc3QpICYmCi0JICAgICBpcF9kb250X2ZyYWdtZW50KHNrLCAmcnQtPnUuZHN0KSkpCisJICAgIChza2ItPmxlbiA8PSBkc3RfbXR1KCZydC0+ZHN0KSAmJgorCSAgICAgaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT5kc3QpKSkKIAkJZGYgPSBodG9ucyhJUF9ERik7CiAKIAlpZiAoaW5ldC0+Y29yay5mbGFncyAmIElQQ09SS19PUFQpCkBAIC0xMjg3LDcgKzEyODUsNyBAQAogCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fTVVMVElDQVNUKQogCQl0dGwgPSBpbmV0LT5tY190dGw7CiAJZWxzZQotCQl0dGwgPSBpcF9zZWxlY3RfdHRsKGluZXQsICZydC0+dS5kc3QpOworCQl0dGwgPSBpcF9zZWxlY3RfdHRsKGluZXQsICZydC0+ZHN0KTsKIAogCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CiAJaXBoLT52ZXJzaW9uID0gNDsKQEAgLTEyOTgsNyArMTI5Niw3IEBACiAJfQogCWlwaC0+dG9zID0gaW5ldC0+dG9zOwogCWlwaC0+ZnJhZ19vZmYgPSBkZjsKLQlpcF9zZWxlY3RfaWRlbnQoaXBoLCAmcnQtPnUuZHN0LCBzayk7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT5kc3QsIHNrKTsKIAlpcGgtPnR0bCA9IHR0bDsKIAlpcGgtPnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sOwogCWlwaC0+c2FkZHIgPSBydC0+cnRfc3JjOwpAQCAtMTMxMSw3ICsxMzA5LDcgQEAKIAkgKiBvbiBkc3QgcmVmY291bnQKIAkgKi8KIAlpbmV0LT5jb3JrLmRzdCA9IE5VTEw7Ci0Jc2tiX2RzdF9zZXQoc2tiLCAmcnQtPnUuZHN0KTsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAogCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkKIAkJaWNtcF9vdXRfY291bnQobmV0LCAoKHN0cnVjdCBpY21waGRyICopCkBAIC0xNDQ4LDcgKzE0NDYsMyBAQAogCWlnbXBfbWNfcHJvY19pbml0KCk7CiAjZW5kaWYKIH0KLQotRVhQT1JUX1NZTUJPTChpcF9nZW5lcmljX2dldGZyYWcpOwotRVhQT1JUX1NZTUJPTChpcF9xdWV1ZV94bWl0KTsKLUVYUE9SVF9TWU1CT0woaXBfc2VuZF9jaGVjayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwppbmRleCBjZTIzMTc4Li42YzQwYThjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKQEAgLTIzOSw3ICsyMzksMTYgQEAKICAgIHNlbnQgdG8gbXVsdGljYXN0IGdyb3VwIHRvIHJlYWNoIGRlc3RpbmF0aW9uIGRlc2lnbmF0ZWQgcm91dGVyLgogICovCiBzdHJ1Y3QgaXBfcmFfY2hhaW4gKmlwX3JhX2NoYWluOwotREVGSU5FX1JXTE9DSyhpcF9yYV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBfcmFfbG9jayk7CisKKworc3RhdGljIHZvaWQgaXBfcmFfZGVzdHJveV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBpcF9yYV9jaGFpbiAqcmEgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGlwX3JhX2NoYWluLCByY3UpOworCisJc29ja19wdXQocmEtPnNhdmVkX3NrKTsKKwlrZnJlZShyYSk7Cit9CiAKIGludCBpcF9yYV9jb250cm9sKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgY2hhciBvbiwKIAkJICB2b2lkICgqZGVzdHJ1Y3Rvcikoc3RydWN0IHNvY2sgKikpCkBAIC0yNTEsMzUgKzI2MCw0MiBAQAogCiAJbmV3X3JhID0gb24gPyBrbWFsbG9jKHNpemVvZigqbmV3X3JhKSwgR0ZQX0tFUk5FTCkgOiBOVUxMOwogCi0Jd3JpdGVfbG9ja19iaCgmaXBfcmFfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZpcF9yYV9sb2NrKTsKIAlmb3IgKHJhcCA9ICZpcF9yYV9jaGFpbjsgKHJhID0gKnJhcCkgIT0gTlVMTDsgcmFwID0gJnJhLT5uZXh0KSB7CiAJCWlmIChyYS0+c2sgPT0gc2spIHsKIAkJCWlmIChvbikgewotCQkJCXdyaXRlX3VubG9ja19iaCgmaXBfcmFfbG9jayk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmlwX3JhX2xvY2spOwogCQkJCWtmcmVlKG5ld19yYSk7CiAJCQkJcmV0dXJuIC1FQUREUklOVVNFOwogCQkJfQotCQkJKnJhcCA9IHJhLT5uZXh0OwotCQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9yYV9sb2NrKTsKKwkJCS8qIGRvbnQgbGV0IGlwX2NhbGxfcmFfY2hhaW4oKSB1c2Ugc2sgYWdhaW4gKi8KKwkJCXJhLT5zayA9IE5VTEw7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoKnJhcCwgcmEtPm5leHQpOworCQkJc3Bpbl91bmxvY2tfYmgoJmlwX3JhX2xvY2spOwogCiAJCQlpZiAocmEtPmRlc3RydWN0b3IpCiAJCQkJcmEtPmRlc3RydWN0b3Ioc2spOwotCQkJc29ja19wdXQoc2spOwotCQkJa2ZyZWUocmEpOworCQkJLyoKKwkJCSAqIERlbGF5IHNvY2tfcHV0KHNrKSBhbmQga2ZyZWUocmEpIGFmdGVyIG9uZSByY3UgZ3JhY2UKKwkJCSAqIHBlcmlvZC4gVGhpcyBndWFyYW50ZWUgaXBfY2FsbF9yYV9jaGFpbigpIGRvbnQgbmVlZAorCQkJICogdG8gbWVzcyB3aXRoIHNvY2tldCByZWZjb3VudHMuCisJCQkgKi8KKwkJCXJhLT5zYXZlZF9zayA9IHNrOworCQkJY2FsbF9yY3UoJnJhLT5yY3UsIGlwX3JhX2Rlc3Ryb3lfcmN1KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCWlmIChuZXdfcmEgPT0gTlVMTCkgewotCQl3cml0ZV91bmxvY2tfYmgoJmlwX3JhX2xvY2spOworCQlzcGluX3VubG9ja19iaCgmaXBfcmFfbG9jayk7CiAJCXJldHVybiAtRU5PQlVGUzsKIAl9CiAJbmV3X3JhLT5zayA9IHNrOwogCW5ld19yYS0+ZGVzdHJ1Y3RvciA9IGRlc3RydWN0b3I7CiAKIAluZXdfcmEtPm5leHQgPSByYTsKLQkqcmFwID0gbmV3X3JhOworCXJjdV9hc3NpZ25fcG9pbnRlcigqcmFwLCBuZXdfcmEpOwogCXNvY2tfaG9sZChzayk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9yYV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmaXBfcmFfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0OSw3ICs0NjUsNyBAQAogCQkJICAgICAoMTw8SVBfTVRVX0RJU0NPVkVSKSB8ICgxPDxJUF9SRUNWRVJSKSB8CiAJCQkgICAgICgxPDxJUF9ST1VURVJfQUxFUlQpIHwgKDE8PElQX0ZSRUVCSU5EKSB8CiAJCQkgICAgICgxPDxJUF9QQVNTU0VDKSB8ICgxPDxJUF9UUkFOU1BBUkVOVCkgfAotCQkJICAgICAoMTw8SVBfTUlOVFRMKSkpIHx8CisJCQkgICAgICgxPDxJUF9NSU5UVEwpIHwgKDE8PElQX05PREVGUkFHKSkpIHx8CiAJICAgIG9wdG5hbWUgPT0gSVBfTVVMVElDQVNUX1RUTCB8fAogCSAgICBvcHRuYW1lID09IElQX01VTFRJQ0FTVF9BTEwgfHwKIAkgICAgb3B0bmFtZSA9PSBJUF9NVUxUSUNBU1RfTE9PUCB8fApAQCAtNTcyLDYgKzU4OCwxMyBAQAogCQl9CiAJCWluZXQtPmhkcmluY2wgPSB2YWwgPyAxIDogMDsKIAkJYnJlYWs7CisJY2FzZSBJUF9OT0RFRlJBRzoKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKSB7CisJCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCQlicmVhazsKKwkJfQorCQlpbmV0LT5ub2RlZnJhZyA9IHZhbCA/IDEgOiAwOworCQlicmVhazsKIAljYXNlIElQX01UVV9ESVNDT1ZFUjoKIAkJaWYgKHZhbCA8IElQX1BNVFVESVNDX0RPTlQgfHwgdmFsID4gSVBfUE1UVURJU0NfUFJPQkUpCiAJCQlnb3RvIGVfaW52YWw7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGNvbmZpZy5jIGIvbmV0L2lwdjQvaXBjb25maWcuYwppbmRleCBiOWQ4NGU4Li4zYTZlMWVjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbmZpZy5jCisrKyBiL25ldC9pcHY0L2lwY29uZmlnLmMKQEAgLTY2NSw2ICs2NjUsMTMgQEAKIAkJbWVtY3B5KGUsIGljX3JlcV9wYXJhbXMsIHNpemVvZihpY19yZXFfcGFyYW1zKSk7CiAJCWUgKz0gc2l6ZW9mKGljX3JlcV9wYXJhbXMpOwogCisJCWlmIChpY19ob3N0X25hbWVfc2V0KSB7CisJCQkqZSsrID0gMTI7CS8qIGhvc3QtbmFtZSAqLworCQkJbGVuID0gc3RybGVuKHV0c25hbWUoKS0+bm9kZW5hbWUpOworCQkJKmUrKyA9IGxlbjsKKwkJCW1lbWNweShlLCB1dHNuYW1lKCktPm5vZGVuYW1lLCBsZW4pOworCQkJZSArPSBsZW47CisJCX0KIAkJaWYgKCp2ZW5kb3JfY2xhc3NfaWRlbnRpZmllcikgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiREhDUDogc2VuZGluZyBjbGFzcyBpZGVudGlmaWVyIFwiJXNcIlxuIiwKIAkJCSAgICAgICB2ZW5kb3JfY2xhc3NfaWRlbnRpZmllcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGlwLmMgYi9uZXQvaXB2NC9pcGlwLmMKaW5kZXggN2ZkNjM2Ny4uZWMwMzY3MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBpcC5jCisrKyBiL25ldC9pcHY0L2lwaXAuYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJCQlnb3RvIHR4X2Vycm9yX2ljbXA7CiAJCX0KIAl9Ci0JdGRldiA9IHJ0LT51LmRzdC5kZXY7CisJdGRldiA9IHJ0LT5kc3QuZGV2OwogCiAJaWYgKHRkZXYgPT0gZGV2KSB7CiAJCWlwX3J0X3B1dChydCk7CkBAIC00NDYsNyArNDQ2LDcgQEAKIAlkZiB8PSBvbGRfaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKTsKIAogCWlmIChkZikgewotCQltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCW10dSA9IGRzdF9tdHUoJnJ0LT5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CiAKIAkJaWYgKG10dSA8IDY4KSB7CiAJCQlzdGF0cy0+Y29sbGlzaW9ucysrOwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJSVBDQihza2IpLT5mbGFncyAmPSB+KElQU0tCX1hGUk1fVFVOTkVMX1NJWkUgfCBJUFNLQl9YRlJNX1RSQU5TRk9STUVEIHwKIAkJCSAgICAgIElQU0tCX1JFUk9VVEVEKTsKIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyoKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgpAQCAtNTUyLDcgKzU1Miw3IEBACiAJCQkJICAgIC5wcm90byA9IElQUFJPVE9fSVBJUCB9OwogCQlzdHJ1Y3QgcnRhYmxlICpydDsKIAkJaWYgKCFpcF9yb3V0ZV9vdXRwdXRfa2V5KGRldl9uZXQoZGV2KSwgJnJ0LCAmZmwpKSB7Ci0JCQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJCXRkZXYgPSBydC0+ZHN0LmRldjsKIAkJCWlwX3J0X3B1dChydCk7CiAJCX0KIAkJZGV2LT5mbGFncyB8PSBJRkZfUE9JTlRPUE9JTlQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggN2Y2MjczNS4uMTc5ZmNhYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtMTU1NSw5ICsxNTU1LDkgQEAKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JZGV2ID0gcnQtPnUuZHN0LmRldjsKKwlkZXYgPSBydC0+ZHN0LmRldjsKIAotCWlmIChza2ItPmxlbitlbmNhcCA+IGRzdF9tdHUoJnJ0LT51LmRzdCkgJiYgKG50b2hzKGlwaC0+ZnJhZ19vZmYpICYgSVBfREYpKSB7CisJaWYgKHNrYi0+bGVuK2VuY2FwID4gZHN0X210dSgmcnQtPmRzdCkgJiYgKG50b2hzKGlwaC0+ZnJhZ19vZmYpICYgSVBfREYpKSB7CiAJCS8qIERvIG5vdCBmcmFnbWVudCBtdWx0aWNhc3RzLiBBbGFzLCBJUHY0IGRvZXMgbm90CiAJCSAgIGFsbG93IHRvIHNlbmQgSUNNUCwgc28gdGhhdCBwYWNrZXRzIHdpbGwgZGlzYXBwZWFyCiAJCSAgIHRvIGJsYWNraG9sZS4KQEAgLTE1NjgsNyArMTU2OCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JZW5jYXAgKz0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KSArIHJ0LT51LmRzdC5oZWFkZXJfbGVuOworCWVuY2FwICs9IExMX1JFU0VSVkVEX1NQQUNFKGRldikgKyBydC0+ZHN0LmhlYWRlcl9sZW47CiAKIAlpZiAoc2tiX2Nvdyhza2IsIGVuY2FwKSkgewogCQlpcF9ydF9wdXQocnQpOwpAQCAtMTU3OSw3ICsxNTc5LDcgQEAKIAl2aWYtPmJ5dGVzX291dCArPSBza2ItPmxlbjsKIAogCXNrYl9kc3RfZHJvcChza2IpOwotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAJaXBfZGVjcmVhc2VfdHRsKGlwX2hkcihza2IpKTsKIAogCS8qIEZJWE1FOiBmb3J3YXJkIGFuZCBvdXRwdXQgZmlyZXdhbGxzIHVzZWQgdG8gYmUgY2FsbGVkIGhlcmUuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDA3ZGU4NTUuLmQ4OGE0NmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC00Myw3ICs0Myw3IEBACiAKIAkJLyogRHJvcCBvbGQgcm91dGUuICovCiAJCXNrYl9kc3RfZHJvcChza2IpOwotCQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCQlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAl9IGVsc2UgewogCQkvKiBub24tbG9jYWwgc3JjLCBmaW5kIHZhbGlkIGlpZiB0byBzYXRpc2Z5CiAJCSAqIHJwLWZpbHRlciB3aGVuIGNhbGxpbmcgaXBfcm91dGVfaW5wdXQuICovCkBAIC01MywxMSArNTMsMTEgQEAKIAogCQlvcmVmZHN0ID0gc2tiLT5fc2tiX3JlZmRzdDsKIAkJaWYgKGlwX3JvdXRlX2lucHV0KHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwKLQkJCQkgICBSVF9UT1MoaXBoLT50b3MpLCBydC0+dS5kc3QuZGV2KSAhPSAwKSB7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJCQkgICBSVF9UT1MoaXBoLT50b3MpLCBydC0+ZHN0LmRldikgIT0gMCkgeworCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCXJlZmRzdF9kcm9wKG9yZWZkc3QpOwogCX0KIApAQCAtMjEyLDkgKzIxMiw3IEBACiAJCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCBwcm90b2NvbCwKIAkJCQkJICAgICAgIHNrYi0+bGVuIC0gZGF0YW9mZiwgMCk7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQkJY3N1bSA9IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQoc2tiLCBkYXRhb2ZmICsgbGVuKTsKLQkJaWYgKCFjc3VtKQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQoc2tiLCBkYXRhb2ZmICsgbGVuKTsKIAl9CiAJcmV0dXJuIGNzdW07CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYwppbmRleCAxYWMwMWIxLi42YmNjYmEzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKQEAgLTI4MywxNiArMjgzLDEzIEBACiAJYXJwID0gYXJwX2hkcihza2IpOwogCWRvIHsKIAkJY29uc3Qgc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICp0OwotCQlpbnQgaGRyX2xlbjsKIAogCQlpZiAoIWFycF9wYWNrZXRfbWF0Y2goYXJwLCBza2ItPmRldiwgaW5kZXYsIG91dGRldiwgJmUtPmFycCkpIHsKIAkJCWUgPSBhcnB0X25leHRfZW50cnkoZSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWhkcl9sZW4gPSBzaXplb2YoKmFycCkgKyAoMiAqIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpICsKLQkJCSgyICogc2tiLT5kZXYtPmFkZHJfbGVuKTsKLQkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsIGhkcl9sZW4sIDEpOworCQlBRERfQ09VTlRFUihlLT5jb3VudGVycywgYXJwX2hkcl9sZW4oc2tiLT5kZXYpLCAxKTsKIAogCQl0ID0gYXJwdF9nZXRfdGFyZ2V0X2MoZSk7CiAKQEAgLTcxMyw3ICs3MTAsNyBAQAogCXN0cnVjdCBhcnB0X2VudHJ5ICppdGVyOwogCXVuc2lnbmVkIGludCBjcHU7CiAJdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgaW50IGN1cmNwdTsKKwl1bnNpZ25lZCBpbnQgY3VyY3B1ID0gZ2V0X2NwdSgpOwogCiAJLyogSW5zdGVhZCBvZiBjbGVhcmluZyAoYnkgYSBwcmV2aW91cyBjYWxsIHRvIG1lbXNldCgpKQogCSAqIHRoZSBjb3VudGVycyBhbmQgdXNpbmcgYWRkcywgd2Ugc2V0IHRoZSBjb3VudGVycwpAQCAtNzIzLDE0ICs3MjAsMTYgQEAKIAkgKiBpZiBuZXcgc29mdGlycSB3ZXJlIHRvIHJ1biBhbmQgY2FsbCBpcHRfZG9fdGFibGUKIAkgKi8KIAlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JY3VyY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCiAJaSA9IDA7CiAJeHRfZW50cnlfZm9yZWFjaChpdGVyLCB0LT5lbnRyaWVzW2N1cmNwdV0sIHQtPnNpemUpIHsKIAkJU0VUX0NPVU5URVIoY291bnRlcnNbaV0sIGl0ZXItPmNvdW50ZXJzLmJjbnQsCiAJCQkgICAgaXRlci0+Y291bnRlcnMucGNudCk7CiAJCSsraTsKIAl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJLyogUHJvY2Vzc2luZyBjb3VudGVycyBmcm9tIG90aGVyIGNwdXMsIHdlIGNhbiBsZXQgYm90dG9tIGhhbGYgZW5hYmxlZCwKKwkgKiAocHJlZW1wdGlvbiBpcyBkaXNhYmxlZCkKKwkgKi8KIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJaWYgKGNwdSA9PSBjdXJjcHUpCkBAIC03NDQsNyArNzQzLDcgQEAKIAkJfQogCQl4dF9pbmZvX3dydW5sb2NrKGNwdSk7CiAJfQotCWxvY2FsX2JoX2VuYWJsZSgpOworCXB1dF9jcHUoKTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF9jb3VudGVycyAqYWxsb2NfY291bnRlcnMoY29uc3Qgc3RydWN0IHh0X3RhYmxlICp0YWJsZSkKQEAgLTc1OCw3ICs3NTcsNyBAQAogCSAqIGFib3V0KS4KIAkgKi8KIAljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpICogcHJpdmF0ZS0+bnVtYmVyOwotCWNvdW50ZXJzID0gdm1hbGxvY19ub2RlKGNvdW50ZXJzaXplLCBudW1hX25vZGVfaWQoKSk7CisJY291bnRlcnMgPSB2bWFsbG9jKGNvdW50ZXJzaXplKTsKIAogCWlmIChjb3VudGVycyA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTEwMDUsOCArMTAwNCw3IEBACiAJc3RydWN0IGFycHRfZW50cnkgKml0ZXI7CiAKIAlyZXQgPSAwOwotCWNvdW50ZXJzID0gdm1hbGxvY19ub2RlKG51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpLAotCQkJCW51bWFfbm9kZV9pZCgpKTsKKwljb3VudGVycyA9IHZtYWxsb2MobnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykpOwogCWlmICghY291bnRlcnMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0xMTU5LDcgKzExNTcsNyBAQAogCWlmIChsZW4gIT0gc2l6ZSArIG51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhZGRjID0gdm1hbGxvY19ub2RlKGxlbiAtIHNpemUsIG51bWFfbm9kZV9pZCgpKTsKKwlwYWRkYyA9IHZtYWxsb2MobGVuIC0gc2l6ZSk7CiAJaWYgKCFwYWRkYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9xdWV1ZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKaW5kZXggYTRlNWZjNS4uZDJjMTMxMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgY29weV9tb2RlIF9fcmVhZF9tb3N0bHkgPSBJUFFfQ09QWV9OT05FOwogc3RhdGljIHVuc2lnbmVkIGludCBxdWV1ZV9tYXhsZW4gX19yZWFkX21vc3RseSA9IElQUV9RTUFYX0RFRkFVTFQ7Ci1zdGF0aWMgREVGSU5FX1JXTE9DSyhxdWV1ZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socXVldWVfbG9jayk7CiBzdGF0aWMgaW50IHBlZXJfcGlkIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgaW50IGNvcHlfcmFuZ2UgX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcXVldWVfdG90YWw7CkBAIC03MiwxMCArNzIsMTAgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElQUV9DT1BZX1BBQ0tFVDoKLQkJY29weV9tb2RlID0gbW9kZTsKKwkJaWYgKHJhbmdlID4gMHhGRkZGKQorCQkJcmFuZ2UgPSAweEZGRkY7CiAJCWNvcHlfcmFuZ2UgPSByYW5nZTsKLQkJaWYgKGNvcHlfcmFuZ2UgPiAweEZGRkYpCi0JCQljb3B5X3JhbmdlID0gMHhGRkZGOworCQljb3B5X21vZGUgPSBtb2RlOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xMDEsNyArMTAxLDcgQEAKIHsKIAlzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5ID0gTlVMTCwgKmk7CiAKLQl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnF1ZXVlX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmcXVldWVfbGlzdCwgbGlzdCkgewogCQlpZiAoKHVuc2lnbmVkIGxvbmcpaSA9PSBpZCkgewpAQCAtMTE1LDcgKzExNSw3IEBACiAJCXF1ZXVlX3RvdGFsLS07CiAJfQogCi0Jd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiAJcmV0dXJuIGVudHJ5OwogfQogCkBAIC0xMzYsOSArMTM2LDkgQEAKIHN0YXRpYyB2b2lkCiBpcHFfZmx1c2goaXBxX2NtcGZuIGNtcGZuLCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAlfX2lwcV9mbHVzaChjbXBmbiwgZGF0YSk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCkBAIC0xNTIsOSArMTUyLDcgQEAKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKIAotCXJlYWRfbG9ja19iaCgmcXVldWVfbG9jayk7Ci0KLQlzd2l0Y2ggKGNvcHlfbW9kZSkgeworCXN3aXRjaCAoQUNDRVNTX09OQ0UoY29weV9tb2RlKSkgewogCWNhc2UgSVBRX0NPUFlfTUVUQToKIAljYXNlIElQUV9DT1BZX05PTkU6CiAJCXNpemUgPSBOTE1TR19TUEFDRShzaXplb2YoKnBtc2cpKTsKQEAgLTE2MiwyNiArMTYwLDIxIEBACiAKIAljYXNlIElQUV9DT1BZX1BBQ0tFVDoKIAkJaWYgKGVudHJ5LT5za2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMICYmCi0JCSAgICAoKmVycnAgPSBza2JfY2hlY2tzdW1faGVscChlbnRyeS0+c2tiKSkpIHsKLQkJCXJlYWRfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkJICAgICgqZXJycCA9IHNrYl9jaGVja3N1bV9oZWxwKGVudHJ5LT5za2IpKSkKIAkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChjb3B5X3JhbmdlID09IDAgfHwgY29weV9yYW5nZSA+IGVudHJ5LT5za2ItPmxlbikKKworCQlkYXRhX2xlbiA9IEFDQ0VTU19PTkNFKGNvcHlfcmFuZ2UpOworCQlpZiAoZGF0YV9sZW4gPT0gMCB8fCBkYXRhX2xlbiA+IGVudHJ5LT5za2ItPmxlbikKIAkJCWRhdGFfbGVuID0gZW50cnktPnNrYi0+bGVuOwotCQllbHNlCi0JCQlkYXRhX2xlbiA9IGNvcHlfcmFuZ2U7CiAKIAkJc2l6ZSA9IE5MTVNHX1NQQUNFKHNpemVvZigqcG1zZykgKyBkYXRhX2xlbik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJKmVycnAgPSAtRUlOVkFMOwotCQlyZWFkX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXJlYWRfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKLQogCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikKIAkJZ290byBubG1zZ19mYWlsdXJlOwpAQCAtMjQyLDcgKzIzNSw3IEBACiAJaWYgKG5za2IgPT0gTlVMTCkKIAkJcmV0dXJuIHN0YXR1czsKIAotCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CiAKIAlpZiAoIXBlZXJfcGlkKQogCQlnb3RvIGVycl9vdXRfZnJlZV9uc2tiOwpAQCAtMjY2LDE0ICsyNTksMTQgQEAKIAogCV9faXBxX2VucXVldWVfZW50cnkoZW50cnkpOwogCi0Jd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIAogZXJyX291dF9mcmVlX25za2I6CiAJa2ZyZWVfc2tiKG5za2IpOwogCiBlcnJfb3V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNDIsOSArMzM1LDkgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0Jd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAlzdGF0dXMgPSBfX2lwcV9zZXRfbW9kZShtb2RlLCByYW5nZSk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDQwLDExICs0MzMsMTEgQEAKIAlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX05FVF9BRE1JTikpCiAJCVJDVl9TS0JfRkFJTCgtRVBFUk0pOwogCi0Jd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAogCWlmIChwZWVyX3BpZCkgewogCQlpZiAocGVlcl9waWQgIT0gcGlkKSB7Ci0JCQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogCQkJUkNWX1NLQl9GQUlMKC1FQlVTWSk7CiAJCX0KIAl9IGVsc2UgewpAQCAtNDUyLDcgKzQ0NSw3IEBACiAJCXBlZXJfcGlkID0gcGlkOwogCX0KIAotCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogCiAJc3RhdHVzID0gaXBxX3JlY2VpdmVfcGVlcihOTE1TR19EQVRBKG5saCksIHR5cGUsCiAJCQkJICBubG1zZ2xlbiAtIE5MTVNHX0xFTkdUSCgwKSk7CkBAIC00OTcsMTAgKzQ5MCwxMCBAQAogCXN0cnVjdCBuZXRsaW5rX25vdGlmeSAqbiA9IHB0cjsKIAogCWlmIChldmVudCA9PSBORVRMSU5LX1VSRUxFQVNFICYmIG4tPnByb3RvY29sID09IE5FVExJTktfRklSRVdBTEwpIHsKLQkJd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CiAJCWlmICgobmV0X2VxKG4tPm5ldCwgJmluaXRfbmV0KSkgJiYgKG4tPnBpZCA9PSBwZWVyX3BpZCkpCiAJCQlfX2lwcV9yZXNldCgpOwotCQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCQlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiAJfQogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KQEAgLTUyNyw3ICs1MjAsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IGlwX3F1ZXVlX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJlYWRfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAogCXNlcV9wcmludGYobSwKIAkJICAgICAgIlBlZXIgUElEICAgICAgICAgIDogJWRcbiIKQEAgLTU0NSw3ICs1MzgsNyBAQAogCQkgICAgICBxdWV1ZV9kcm9wcGVkLAogCQkgICAgICBxdWV1ZV91c2VyX2Ryb3BwZWQpOwogCi0JcmVhZF91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IDRiNmM1Y2EuLmM0Mzk3MjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTM2NCw3ICszNjQsNyBAQAogCQkJCWdvdG8gbm9fbWF0Y2g7CiAJCX0KIAotCQlBRERfQ09VTlRFUihlLT5jb3VudGVycywgbnRvaHMoaXAtPnRvdF9sZW4pLCAxKTsKKwkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsIHNrYi0+bGVuLCAxKTsKIAogCQl0ID0gaXB0X2dldF90YXJnZXQoZSk7CiAJCUlQX05GX0FTU0VSVCh0LT51Lmtlcm5lbC50YXJnZXQpOwpAQCAtODg0LDcgKzg4NCw3IEBACiAJc3RydWN0IGlwdF9lbnRyeSAqaXRlcjsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGludCBjdXJjcHU7CisJdW5zaWduZWQgaW50IGN1cmNwdSA9IGdldF9jcHUoKTsKIAogCS8qIEluc3RlYWQgb2YgY2xlYXJpbmcgKGJ5IGEgcHJldmlvdXMgY2FsbCB0byBtZW1zZXQoKSkKIAkgKiB0aGUgY291bnRlcnMgYW5kIHVzaW5nIGFkZHMsIHdlIHNldCB0aGUgY291bnRlcnMKQEAgLTg5NCwxNCArODk0LDE2IEBACiAJICogaWYgbmV3IHNvZnRpcnEgd2VyZSB0byBydW4gYW5kIGNhbGwgaXB0X2RvX3RhYmxlCiAJICovCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwotCWN1cmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQogCWkgPSAwOwogCXh0X2VudHJ5X2ZvcmVhY2goaXRlciwgdC0+ZW50cmllc1tjdXJjcHVdLCB0LT5zaXplKSB7CiAJCVNFVF9DT1VOVEVSKGNvdW50ZXJzW2ldLCBpdGVyLT5jb3VudGVycy5iY250LAogCQkJICAgIGl0ZXItPmNvdW50ZXJzLnBjbnQpOwogCQkrK2k7CiAJfQorCWxvY2FsX2JoX2VuYWJsZSgpOworCS8qIFByb2Nlc3NpbmcgY291bnRlcnMgZnJvbSBvdGhlciBjcHVzLCB3ZSBjYW4gbGV0IGJvdHRvbSBoYWxmIGVuYWJsZWQsCisJICogKHByZWVtcHRpb24gaXMgZGlzYWJsZWQpCisJICovCiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCWlmIChjcHUgPT0gY3VyY3B1KQpAQCAtOTE1LDcgKzkxNyw3IEBACiAJCX0KIAkJeHRfaW5mb193cnVubG9jayhjcHUpOwogCX0KLQlsb2NhbF9iaF9lbmFibGUoKTsKKwlwdXRfY3B1KCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfY291bnRlcnMgKmFsbG9jX2NvdW50ZXJzKGNvbnN0IHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCkBAIC05MjgsNyArOTMwLDcgQEAKIAkgICAob3RoZXIgdGhhbiBjb21lZnJvbSwgd2hpY2ggdXNlcnNwYWNlIGRvZXNuJ3QgY2FyZQogCSAgIGFib3V0KS4gKi8KIAljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpICogcHJpdmF0ZS0+bnVtYmVyOwotCWNvdW50ZXJzID0gdm1hbGxvY19ub2RlKGNvdW50ZXJzaXplLCBudW1hX25vZGVfaWQoKSk7CisJY291bnRlcnMgPSB2bWFsbG9jKGNvdW50ZXJzaXplKTsKIAogCWlmIChjb3VudGVycyA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTEzNTIsNyArMTM1NCw3IEBACiAJaWYgKGxlbiAhPSBzaXplICsgbnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGFkZGMgPSB2bWFsbG9jX25vZGUobGVuIC0gc2l6ZSwgbnVtYV9ub2RlX2lkKCkpOworCXBhZGRjID0gdm1hbGxvYyhsZW4gLSBzaXplKTsKIAlpZiAoIXBhZGRjKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggZjkxYzk0Yi4uM2E0M2NmMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC01MywxMiArNTMsMTMgQEAKICNlbmRpZgogCWVudW0gY2x1c3RlcmlwX2hhc2htb2RlIGhhc2hfbW9kZTsJLyogd2hpY2ggaGFzaGluZyBtb2RlICovCiAJdV9pbnQzMl90IGhhc2hfaW5pdHZhbDsJCQkvKiBoYXNoIGluaXRpYWxpemF0aW9uICovCisJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQoY2x1c3RlcmlwX2NvbmZpZ3MpOwogCiAvKiBjbHVzdGVyaXBfbG9jayBwcm90ZWN0cyB0aGUgY2x1c3RlcmlwX2NvbmZpZ3MgbGlzdCAqLwotc3RhdGljIERFRklORV9SV0xPQ0soY2x1c3RlcmlwX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhjbHVzdGVyaXBfbG9jayk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2x1c3RlcmlwX3Byb2NfZm9wczsKQEAgLTcxLDExICs3MiwxNyBAQAogCWF0b21pY19pbmMoJmMtPnJlZmNvdW50KTsKIH0KIAorCitzdGF0aWMgdm9pZCBjbHVzdGVyaXBfY29uZmlnX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlrZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGNsdXN0ZXJpcF9jb25maWcsIHJjdSkpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQKIGNsdXN0ZXJpcF9jb25maWdfcHV0KHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjLT5yZWZjb3VudCkpCi0JCWtmcmVlKGMpOworCQljYWxsX3JjdV9iaCgmYy0+cmN1LCBjbHVzdGVyaXBfY29uZmlnX3JjdV9mcmVlKTsKIH0KIAogLyogZGVjcmVhc2UgdGhlIGNvdW50IG9mIGVudHJpZXMgdXNpbmcvcmVmZXJlbmNpbmcgdGhpcyBjb25maWcuICBJZiBsYXN0CkBAIC04NCwxMCArOTEsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogY2x1c3RlcmlwX2NvbmZpZ19lbnRyeV9wdXQoc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMpCiB7Ci0Jd3JpdGVfbG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjLT5lbnRyaWVzKSkgewotCQlsaXN0X2RlbCgmYy0+bGlzdCk7Ci0JCXdyaXRlX3VubG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmYy0+ZW50cmllcywgJmNsdXN0ZXJpcF9sb2NrKSkgeworCQlsaXN0X2RlbF9yY3UoJmMtPmxpc3QpOworCQlzcGluX3VubG9jaygmY2x1c3RlcmlwX2xvY2spOworCQlsb2NhbF9iaF9lbmFibGUoKTsKIAogCQlkZXZfbWNfZGVsKGMtPmRldiwgYy0+Y2x1c3Rlcm1hYyk7CiAJCWRldl9wdXQoYy0+ZGV2KTsKQEAgLTEwMCw3ICsxMDgsNyBAQAogI2VuZGlmCiAJCXJldHVybjsKIAl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjbHVzdGVyaXBfbG9jayk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqCkBAIC0xMDgsNyArMTE2LDcgQEAKIHsKIAlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNsdXN0ZXJpcF9jb25maWdzLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYywgJmNsdXN0ZXJpcF9jb25maWdzLCBsaXN0KSB7CiAJCWlmIChjLT5jbHVzdGVyaXAgPT0gY2x1c3RlcmlwKQogCQkJcmV0dXJuIGM7CiAJfQpAQCAtMTIxLDE2ICsxMjksMTUgQEAKIHsKIAlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKIAotCXJlYWRfbG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOworCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAljID0gX19jbHVzdGVyaXBfY29uZmlnX2ZpbmQoY2x1c3RlcmlwKTsKLQlpZiAoIWMpIHsKLQkJcmVhZF91bmxvY2tfYmgoJmNsdXN0ZXJpcF9sb2NrKTsKLQkJcmV0dXJuIE5VTEw7CisJaWYgKGMpIHsKKwkJaWYgKHVubGlrZWx5KCFhdG9taWNfaW5jX25vdF96ZXJvKCZjLT5yZWZjb3VudCkpKQorCQkJYyA9IE5VTEw7CisJCWVsc2UgaWYgKGVudHJ5KQorCQkJYXRvbWljX2luYygmYy0+ZW50cmllcyk7CiAJfQotCWF0b21pY19pbmMoJmMtPnJlZmNvdW50KTsKLQlpZiAoZW50cnkpCi0JCWF0b21pY19pbmMoJmMtPmVudHJpZXMpOwotCXJlYWRfdW5sb2NrX2JoKCZjbHVzdGVyaXBfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAKIAlyZXR1cm4gYzsKIH0KQEAgLTE4MSw5ICsxODgsOSBAQAogCX0KICNlbmRpZgogCi0Jd3JpdGVfbG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOwotCWxpc3RfYWRkKCZjLT5saXN0LCAmY2x1c3RlcmlwX2NvbmZpZ3MpOwotCXdyaXRlX3VubG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOworCXNwaW5fbG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOworCWxpc3RfYWRkX3JjdSgmYy0+bGlzdCwgJmNsdXN0ZXJpcF9jb25maWdzKTsKKwlzcGluX3VubG9ja19iaCgmY2x1c3RlcmlwX2xvY2spOwogCiAJcmV0dXJuIGM7CiB9CkBAIC00NjIsNyArNDY5LDcgQEAKIAlfX2JlMzIgc3JjX2lwOwogCXVfaW50OF90IGRzdF9od1tFVEhfQUxFTl07CiAJX19iZTMyIGRzdF9pcDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2lmZGVmIERFQlVHCiBzdGF0aWMgdm9pZCBhcnBfcHJpbnQoc3RydWN0IGFycF9wYXlsb2FkICpwYXlsb2FkKQpAQCAtNzMzLDYgKzc0MCw5IEBACiAjZW5kaWYKIAluZl91bnJlZ2lzdGVyX2hvb2soJmNpcF9hcnBfb3BzKTsKIAl4dF91bnJlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RnX3JlZyk7CisKKwkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1X2JoKCkncyAoY2x1c3RlcmlwX2NvbmZpZ19yY3VfZnJlZSkgKi8KKwlyY3VfYmFycmllcl9iaCgpOwogfQogCiBtb2R1bGVfaW5pdChjbHVzdGVyaXBfdGdfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwppbmRleCA1MjM0ZjRmLi45MTVmYzE3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CkBAIC0zNjMsNiArMzY0LDQyIEBACiAJLyogbWF4bGVuID0gMjMwKyAgIDkxICArIDIzMCArIDI1MiA9IDgwMyAqLwogfQogCitzdGF0aWMgdm9pZCBkdW1wX21hY19oZWFkZXIoY29uc3Qgc3RydWN0IG5mX2xvZ2luZm8gKmluZm8sCisJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJdW5zaWduZWQgaW50IGxvZ2ZsYWdzID0gMDsKKworCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKKwkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKKworCWlmICghKGxvZ2ZsYWdzICYgSVBUX0xPR19NQUNERUNPREUpKQorCQlnb3RvIGZhbGxiYWNrOworCisJc3dpdGNoIChkZXYtPnR5cGUpIHsKKwljYXNlIEFSUEhSRF9FVEhFUjoKKwkJcHJpbnRrKCJNQUNTUkM9JXBNIE1BQ0RTVD0lcE0gTUFDUFJPVE89JTA0eCAiLAorCQkgICAgICAgZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgZXRoX2hkcihza2IpLT5oX2Rlc3QsCisJCSAgICAgICBudG9ocyhldGhfaGRyKHNrYiktPmhfcHJvdG8pKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworZmFsbGJhY2s6CisJcHJpbnRrKCJNQUM9Iik7CisJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuICYmCisJICAgIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBza2JfbWFjX2hlYWRlcihza2IpOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlwcmludGsoIiUwMngiLCAqcCsrKTsKKwkJZm9yIChpID0gMTsgaSA8IGRldi0+aGFyZF9oZWFkZXJfbGVuOyBpKyssIHArKykKKwkJCXByaW50aygiOiUwMngiLCAqcCk7CisJfQorCXByaW50aygiICIpOworfQorCiBzdGF0aWMgc3RydWN0IG5mX2xvZ2luZm8gZGVmYXVsdF9sb2dpbmZvID0gewogCS50eXBlCT0gTkZfTE9HX1RZUEVfTE9HLAogCS51ID0gewpAQCAtNDA0LDIwICs0NDEsOSBAQAogCX0KICNlbmRpZgogCi0JaWYgKGluICYmICFvdXQpIHsKLQkJLyogTUFDIGxvZ2dpbmcgZm9yIGlucHV0IGNoYWluIG9ubHkuICovCi0JCXByaW50aygiTUFDPSIpOwotCQlpZiAoc2tiLT5kZXYgJiYgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiAmJgotCQkgICAgc2tiLT5tYWNfaGVhZGVyICE9IHNrYi0+bmV0d29ya19oZWFkZXIpIHsKLQkJCWludCBpOwotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHNrYl9tYWNfaGVhZGVyKHNrYik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbjsgaSsrLHArKykKLQkJCQlwcmludGsoIiUwMnglYyIsICpwLAotCQkJCSAgICAgICBpPT1za2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gMQotCQkJCSAgICAgICA/ICcgJzonOicpOwotCQl9IGVsc2UKLQkJCXByaW50aygiICIpOwotCX0KKwkvKiBNQUMgbG9nZ2luZyBmb3IgaW5wdXQgcGF0aCBvbmx5LiAqLworCWlmIChpbiAmJiAhb3V0KQorCQlkdW1wX21hY19oZWFkZXIobG9naW5mbywgc2tiKTsKIAogCWR1bXBfcGFja2V0KGxvZ2luZm8sIHNrYiwgMCk7CiAJcHJpbnRrKCJcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKaW5kZXggZjQzODY3ZC4uNmNkYjI5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCkBAIC00OCw3ICs0OCw4IEBACiAKIAlORl9DVF9BU1NFUlQocGFyLT5ob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgfHwKIAkJICAgICBwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcgfHwKLQkJICAgICBwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQpOworCQkgICAgIHBhci0+aG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCB8fAorCQkgICAgIHBhci0+aG9va251bSA9PSBORl9JTkVUX0xPQ0FMX0lOKTsKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCiAJbmV0bWFzayA9IH4obXItPnJhbmdlWzBdLm1pbl9pcCBeIG1yLT5yYW5nZVswXS5tYXhfaXApOwpAQCAtNzcsNyArNzgsOCBAQAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfAogCQkJICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykgfAotCQkJICAoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCksCisJCQkgICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8CisJCQkgICgxIDw8IE5GX0lORVRfTE9DQUxfSU4pLAogCS5jaGVja2VudHJ5IAk9IG5ldG1hcF90Z19jaGVjaywKIAkubWUgCQk9IFRISVNfTU9EVUxFCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggZjVmNGE4OC4uYjI1NGRhZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC05NSwxMCArOTUsMTEgQEAKIAl9CiAKIAl0Y3BoLT5yc3QJPSAxOwotCXRjcGgtPmNoZWNrCT0gdGNwX3Y0X2NoZWNrKHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwKLQkJCQkgICAgICAgbmlwaC0+c2FkZHIsIG5pcGgtPmRhZGRyLAotCQkJCSAgICAgICBjc3VtX3BhcnRpYWwodGNwaCwKLQkJCQkJCSAgICBzaXplb2Yoc3RydWN0IHRjcGhkciksIDApKTsKKwl0Y3BoLT5jaGVjayA9IH50Y3BfdjRfY2hlY2soc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCBuaXBoLT5zYWRkciwKKwkJCQkgICAgbmlwaC0+ZGFkZHIsIDApOworCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CisJbnNrYi0+Y3N1bV9zdGFydCA9ICh1bnNpZ25lZCBjaGFyICopdGNwaCAtIG5za2ItPmhlYWQ7CisJbnNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAKIAlhZGRyX3R5cGUgPSBSVE5fVU5TUEVDOwogCWlmIChob29rICE9IE5GX0lORVRfRk9SV0FSRApAQCAtMTA5LDEzICsxMTAsMTIgQEAKIAkJYWRkcl90eXBlID0gUlROX0xPQ0FMOwogCiAJLyogaXBfcm91dGVfbWVfaGFyZGVyIGV4cGVjdHMgc2tiLT5kc3QgdG8gYmUgc2V0ICovCi0Jc2tiX2RzdF9zZXQobnNrYiwgZHN0X2Nsb25lKHNrYl9kc3Qob2xkc2tiKSkpOworCXNrYl9kc3Rfc2V0X25vcmVmKG5za2IsIHNrYl9kc3Qob2xkc2tiKSk7CiAKIAlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKG5za2IsIGFkZHJfdHlwZSkpCiAJCWdvdG8gZnJlZV9uc2tiOwogCiAJbmlwaC0+dHRsCT0gZHN0X21ldHJpYyhza2JfZHN0KG5za2IpLCBSVEFYX0hPUExJTUlUKTsKLQluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogIk5ldmVyIGhhcHBlbnMiICovCiAJaWYgKG5za2ItPmxlbiA+IGRzdF9tdHUoc2tiX2RzdChuc2tiKSkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCmluZGV4IGNiNzYzYWUuLmVhYjhkZTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCkBAIC02Niw2ICs2NiwxMSBAQAogCQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCQkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2tiLT5zayk7CisKKwlpZiAoaW5ldCAmJiBpbmV0LT5ub2RlZnJhZykKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKICNpZiAhZGVmaW5lZChDT05GSUdfTkZfTkFUKSAmJiAhZGVmaW5lZChDT05GSUdfTkZfTkFUX01PRFVMRSkKIAkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gIElnbm9yZS4gIERvIHRoaXMgYmVmb3JlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDRmOGJkZGIuLjhjODYzMmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC0yNjEsMTQgKzI2MSw5IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCXByb3RvID0gX19uZl9uYXRfcHJvdG9fZmluZChvcmlnX3R1cGxlLT5kc3QucHJvdG9udW0pOwogCi0JLyogQ2hhbmdlIHByb3RvY29sIGluZm8gdG8gaGF2ZSBzb21lIHJhbmRvbWl6YXRpb24gKi8KLQlpZiAocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkgewotCQlwcm90by0+dW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjdCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCS8qIE9ubHkgYm90aGVyIG1hcHBpbmcgaWYgaXQncyBub3QgYWxyZWFkeSBpbiByYW5nZSBhbmQgdW5pcXVlICovCi0JaWYgKCghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpIHx8CisJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkgJiYKKwkgICAgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkgfHwKIAkgICAgIHByb3RvLT5pbl9yYW5nZSh0dXBsZSwgbWFuaXB0eXBlLCAmcmFuZ2UtPm1pbiwgJnJhbmdlLT5tYXgpKSAmJgogCSAgICAhbmZfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGN0KSkKIAkJZ290byBvdXQ7CkBAIC00NDAsNyArNDM1LDcgQEAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgaGRybGVuICsgc2l6ZW9mKCppbnNpZGUpKSkKIAkJcmV0dXJuIDA7CiAKLQlpbnNpZGUgPSAodm9pZCAqKXNrYi0+ZGF0YSArIGlwX2hkcmxlbihza2IpOworCWluc2lkZSA9ICh2b2lkICopc2tiLT5kYXRhICsgaGRybGVuOwogCiAJLyogV2UncmUgYWN0dWFsbHkgZ29pbmcgdG8gbWFuZ2xlIGl0IGJleW9uZCB0cml2aWFsIGNoZWNrc3VtCiAJICAgYWRqdXN0bWVudCwgc28gbWFrZSBzdXJlIHRoZSBjdXJyZW50IGNoZWNrc3VtIGlzIGNvcnJlY3QuICovCkBAIC00NzAsMTIgKzQ2NSwxMCBAQAogCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLwogCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChQRl9JTkVULCBpbnNpZGUtPmlwLnByb3RvY29sKTsKIAotCWlmICghbmZfY3RfZ2V0X3R1cGxlKHNrYiwKLQkJCSAgICAgaXBfaGRybGVuKHNrYikgKyBzaXplb2Yoc3RydWN0IGljbXBoZHIpLAotCQkJICAgICAoaXBfaGRybGVuKHNrYikgKworCWlmICghbmZfY3RfZ2V0X3R1cGxlKHNrYiwgaGRybGVuICsgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSwKKwkJCSAgICAgKGhkcmxlbiArCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGljbXBoZHIpICsgaW5zaWRlLT5pcC5paGwgKiA0KSwKLQkJCSAgICAgKHVfaW50MTZfdClBRl9JTkVULAotCQkJICAgICBpbnNpZGUtPmlwLnByb3RvY29sLAorCQkJICAgICAodV9pbnQxNl90KUFGX0lORVQsIGluc2lkZS0+aXAucHJvdG9jb2wsCiAJCQkgICAgICZpbm5lciwgbDNwcm90bywgbDRwcm90bykpCiAJCXJldHVybiAwOwogCkBAIC00ODQsMTUgKzQ3NywxMyBAQAogCSAgIHBhc3MgYWxsIGhvb2tzIChsb2NhbGx5LWdlbmVyYXRlZCBJQ01QKS4gIENvbnNpZGVyIGluY29taW5nCiAJICAgcGFja2V0OiBQUkVST1VUSU5HIChEU1QgbWFuaXApLCByb3V0aW5nIHByb2R1Y2VzIElDTVAsIGdvZXMKIAkgICB0aHJvdWdoIFBPU1RST1VUSU5HICh3aGljaCBtdXN0IGNvcnJlY3QgdGhlIERTVCBtYW5pcCkuICovCi0JaWYgKCFtYW5pcF9wa3QoaW5zaWRlLT5pcC5wcm90b2NvbCwgc2tiLAotCQkgICAgICAgaXBfaGRybGVuKHNrYikgKyBzaXplb2YoaW5zaWRlLT5pY21wKSwKLQkJICAgICAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLAotCQkgICAgICAgIW1hbmlwKSkKKwlpZiAoIW1hbmlwX3BrdChpbnNpZGUtPmlwLnByb3RvY29sLCBza2IsIGhkcmxlbiArIHNpemVvZihpbnNpZGUtPmljbXApLAorCQkgICAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUsICFtYW5pcCkpCiAJCXJldHVybiAwOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJLyogUmVsb2FkaW5nICJpbnNpZGUiIGhlcmUgc2luY2UgbWFuaXBfcGt0IGlubmVyLiAqLwotCQlpbnNpZGUgPSAodm9pZCAqKXNrYi0+ZGF0YSArIGlwX2hkcmxlbihza2IpOworCQlpbnNpZGUgPSAodm9pZCAqKXNrYi0+ZGF0YSArIGhkcmxlbjsKIAkJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0gMDsKIAkJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0KIAkJCWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCBoZHJsZW4sCkBAIC03NDIsNyArNzMzLDcgQEAKIAlzcGluX3VubG9ja19iaCgmbmZfbmF0X2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSBmYWtlIGNvbm50cmFjayBzbyB0aGF0IE5BVCB3aWxsIHNraXAgaXQgKi8KLQluZl9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyB8PSBJUFNfTkFUX0RPTkVfTUFTSzsKKwluZl9jdF91bnRyYWNrZWRfc3RhdHVzX29yKElQU19OQVRfRE9ORV9NQVNLKTsKIAogCWwzcHJvdG8gPSBuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KCh1X2ludDE2X3QpQUZfSU5FVCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2NvbW1vbi5jCmluZGV4IDZjNGYxMWYuLjNlNjFmYWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYwpAQCAtMzQsNyArMzQsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3Byb3RvX2luX3JhbmdlKTsKIAotYm9vbCBuZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAordm9pZCBuZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAogCQkJICAgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKQEAgLTUzLDcgKzUzLDcgQEAKIAlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSkgewogCQkvKiBJZiBpdCdzIGRzdCByZXdyaXRlLCBjYW4ndCBjaGFuZ2UgcG9ydCAqLwogCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpCi0JCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm47CiAKIAkJaWYgKG50b2hzKCpwb3J0cHRyKSA8IDEwMjQpIHsKIAkJCS8qIExvb3NlIGNvbnZlbnRpb246ID4+IDUxMiBpcyBjcmVkZW50aWFsIHBhc3NpbmcgKi8KQEAgLTgxLDE1ICs4MSwxNSBAQAogCWVsc2UKIAkJb2ZmID0gKnJvdmVyOwogCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgb2ZmKyspIHsKKwlmb3IgKGkgPSAwOyA7ICsrb2ZmKSB7CiAJCSpwb3J0cHRyID0gaHRvbnMobWluICsgb2ZmICUgcmFuZ2Vfc2l6ZSk7Ci0JCWlmIChuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorCQlpZiAoKytpICE9IHJhbmdlX3NpemUgJiYgbmZfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGN0KSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSkKIAkJCSpyb3ZlciA9IG9mZjsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybjsKIAl9Ci0JcmV0dXJuIGZhbHNlOworCXJldHVybjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2RjY3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZGNjcC5jCmluZGV4IDIyNDg1Y2UuLjU3MGZhZjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZGNjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZGNjcC5jCkBAIC0yMiwxNCArMjIsMTQgQEAKIAogc3RhdGljIHVfaW50MTZfdCBkY2NwX3BvcnRfcm92ZXI7CiAKLXN0YXRpYyBib29sCitzdGF0aWMgdm9pZAogZGNjcF91bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJCSAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCiAJCSAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCSAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXJldHVybiBuZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjdCwKLQkJCQkJICZkY2NwX3BvcnRfcm92ZXIpOworCW5mX25hdF9wcm90b191bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGN0LAorCQkJCSAgJmRjY3BfcG9ydF9yb3Zlcik7CiB9CiAKIHN0YXRpYyBib29sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYwppbmRleCBkN2U4OTIwLi5iYzhkODNhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiTmV0ZmlsdGVyIE5BVCBwcm90b2NvbCBoZWxwZXIgbW9kdWxlIGZvciBHUkUiKTsKIAogLyogZ2VuZXJhdGUgdW5pcXVlIHR1cGxlIC4uLiAqLwotc3RhdGljIGJvb2wKK3N0YXRpYyB2b2lkCiBncmVfdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCiAJCSBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKQEAgLTUwLDcgKzUwLDcgQEAKIAkvKiBJZiB0aGVyZSBpcyBubyBtYXN0ZXIgY29ubnRyYWNrIHdlIGFyZSBub3QgUFBUUCwKIAkgICBkbyBub3QgY2hhbmdlIHR1cGxlcyAqLwogCWlmICghY3QtPm1hc3RlcikKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm47CiAKIAlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCiAJCWtleXB0ciA9ICZ0dXBsZS0+c3JjLnUuZ3JlLmtleTsKQEAgLTY4LDE0ICs2OCwxNCBAQAogCiAJcHJfZGVidWcoIm1pbiA9ICV1LCByYW5nZV9zaXplID0gJXVcbiIsIG1pbiwgcmFuZ2Vfc2l6ZSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBrZXkrKykgeworCWZvciAoaSA9IDA7IDsgKytrZXkpIHsKIAkJKmtleXB0ciA9IGh0b25zKG1pbiArIGtleSAlIHJhbmdlX3NpemUpOwotCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKCsraSA9PSByYW5nZV9zaXplIHx8ICFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorCQkJcmV0dXJuOwogCX0KIAogCXByX2RlYnVnKCIlcDogbm8gTkFUIG1hcHBpbmdcbiIsIGN0KTsKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuOwogfQogCiAvKiBtYW5pcHVsYXRlIGEgR1JFIHBhY2tldCBhY2NvcmRpbmcgdG8gbWFuaXB0eXBlICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCmluZGV4IDE5YThiMGIuLjU3NDRjM2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCkBAIC0yNyw3ICsyNyw3IEBACiAJICAgICAgIG50b2hzKHR1cGxlLT5zcmMudS5pY21wLmlkKSA8PSBudG9ocyhtYXgtPmljbXAuaWQpOwogfQogCi1zdGF0aWMgYm9vbAorc3RhdGljIHZvaWQKIGljbXBfdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAogCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLApAQCAtNDIsMTMgKzQyLDEzIEBACiAJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpCiAJCXJhbmdlX3NpemUgPSAweEZGRkY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBpZCsrKSB7CisJZm9yIChpID0gMDsgOyArK2lkKSB7CiAJCXR1cGxlLT5zcmMudS5pY21wLmlkID0gaHRvbnMobnRvaHMocmFuZ2UtPm1pbi5pY21wLmlkKSArCiAJCQkJCSAgICAgKGlkICUgcmFuZ2Vfc2l6ZSkpOwotCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKCsraSA9PSByYW5nZV9zaXplIHx8ICFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorCQkJcmV0dXJuOwogCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgYm9vbApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19zY3RwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3NjdHAuYwppbmRleCAzZmM1OThlZS4uNzU2MzMxZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19zY3RwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19zY3RwLmMKQEAgLTE2LDE0ICsxNiwxNCBAQAogCiBzdGF0aWMgdV9pbnQxNl90IG5mX3NjdHBfcG9ydF9yb3ZlcjsKIAotc3RhdGljIGJvb2wKK3N0YXRpYyB2b2lkCiBzY3RwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKIAkJICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKIAkJICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JcmV0dXJuIG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGN0LAotCQkJCQkgJm5mX3NjdHBfcG9ydF9yb3Zlcik7CisJbmZfbmF0X3Byb3RvX3VuaXF1ZV90dXBsZSh0dXBsZSwgcmFuZ2UsIG1hbmlwdHlwZSwgY3QsCisJCQkJICAmbmZfc2N0cF9wb3J0X3JvdmVyKTsKIH0KIAogc3RhdGljIGJvb2wKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCmluZGV4IDM5OWUyY2YuLmFhNDYwYTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYwpAQCAtMjAsMTQgKzIwLDEzIEBACiAKIHN0YXRpYyB1X2ludDE2X3QgdGNwX3BvcnRfcm92ZXI7CiAKLXN0YXRpYyBib29sCitzdGF0aWMgdm9pZAogdGNwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAogCQkgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JcmV0dXJuIG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGN0LAotCQkJCQkgJnRjcF9wb3J0X3JvdmVyKTsKKwluZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjdCwgJnRjcF9wb3J0X3JvdmVyKTsKIH0KIAogc3RhdGljIGJvb2wKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCmluZGV4IDllNjFjNzkuLmRmZTY1YzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYwpAQCAtMTksMTQgKzE5LDEzIEBACiAKIHN0YXRpYyB1X2ludDE2X3QgdWRwX3BvcnRfcm92ZXI7CiAKLXN0YXRpYyBib29sCitzdGF0aWMgdm9pZAogdWRwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAogCQkgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JcmV0dXJuIG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGN0LAotCQkJCQkgJnVkcF9wb3J0X3JvdmVyKTsKKwluZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjdCwgJnVkcF9wb3J0X3JvdmVyKTsKIH0KIAogc3RhdGljIGJvb2wKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHBsaXRlLmMKaW5kZXggNDQwYTIyOS4uM2NjOGM4YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHBsaXRlLmMKQEAgLTE4LDE0ICsxOCwxNCBAQAogCiBzdGF0aWMgdV9pbnQxNl90IHVkcGxpdGVfcG9ydF9yb3ZlcjsKIAotc3RhdGljIGJvb2wKK3N0YXRpYyB2b2lkCiB1ZHBsaXRlX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKIAkJICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JcmV0dXJuIG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGN0LAotCQkJCQkgJnVkcGxpdGVfcG9ydF9yb3Zlcik7CisJbmZfbmF0X3Byb3RvX3VuaXF1ZV90dXBsZSh0dXBsZSwgcmFuZ2UsIG1hbmlwdHlwZSwgY3QsCisJCQkJICAmdWRwbGl0ZV9wb3J0X3JvdmVyKTsKIH0KIAogc3RhdGljIGJvb2wKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdW5rbm93bi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191bmtub3duLmMKaW5kZXggMTQzODFjNi4uYTUwZjJiYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191bmtub3duLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191bmtub3duLmMKQEAgLTI2LDE0ICsyNiwxNCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCB1bmtub3duX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKK3N0YXRpYyB2b2lkIHVua25vd25fdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkJCSBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKIAkJCQkgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAkvKiBTb3JyeTogd2UgY2FuJ3QgaGVscCB5b3U7IGlmIGl0J3Mgbm90IHVuaXF1ZSwgd2UgY2FuJ3QgZnJvYgogCSAgIGFueXRoaW5nLiAqLwotCXJldHVybiBmYWxzZTsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyBib29sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IDk4ZWQ3ODIuLmViYmQzMTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC0yOCw3ICsyOCw4IEBACiAKICNkZWZpbmUgTkFUX1ZBTElEX0hPT0tTICgoMSA8PCBORl9JTkVUX1BSRV9ST1VUSU5HKSB8IFwKIAkJCSAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykgfCBcCi0JCQkgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpKQorCQkJICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8IFwKKwkJCSAoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB4dF90YWJsZSBuYXRfdGFibGUgPSB7CiAJLm5hbWUJCT0gIm5hdCIsCkBAIC00NSw3ICs0Niw4IEBACiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKIAotCU5GX0NUX0FTU0VSVChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcpOworCU5GX0NUX0FTU0VSVChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcgfHwKKwkJICAgICBwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9JTik7CiAKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCkBAIC05OSw3ICsxMDEsNyBAQAogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBpbnQKK3N0YXRpYyB1bnNpZ25lZCBpbnQKIGFsbG9jX251bGxfYmluZGluZyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHVuc2lnbmVkIGludCBob29rbnVtKQogewogCS8qIEZvcmNlIHJhbmdlIHRvIHRoaXMgSVA7IGxldCBwcm90byBkZWNpZGUgbWFwcGluZyBmb3IKQEAgLTE0MSw3ICsxNDMsNyBAQAogCS50YXJnZXQJCT0gaXB0X3NuYXRfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCi0JLmhvb2tzCQk9IDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcsCisJLmhvb2tzCQk9ICgxIDw8IE5GX0lORVRfUE9TVF9ST1VUSU5HKSB8ICgxIDw8IE5GX0lORVRfTE9DQUxfSU4pLAogCS5jaGVja2VudHJ5CT0gaXB0X3NuYXRfY2hlY2tlbnRyeSwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYwppbmRleCBiZWIyNTgxLi45NTQ4MWZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYwpAQCAtOTgsNyArOTgsNyBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJLyogRG9uJ3QgdHJ5IHRvIE5BVCBpZiB0aGlzIHBhY2tldCBpcyBub3QgY29ubnRyYWNrZWQgKi8KLQlpZiAoY3QgPT0gJm5mX2Nvbm50cmFja191bnRyYWNrZWQpCisJaWYgKG5mX2N0X2lzX3VudHJhY2tlZChjdCkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAluYXQgPSBuZmN0X25hdChjdCk7CkBAIC0xMzEsMTMgKzEzMSw3IEBACiAJCWlmICghbmZfbmF0X2luaXRpYWxpemVkKGN0LCBtYW5pcHR5cGUpKSB7CiAJCQl1bnNpZ25lZCBpbnQgcmV0OwogCi0JCQlpZiAoaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX0lOKQotCQkJCS8qIExPQ0FMX0lOIGhvb2sgZG9lc24ndCBoYXZlIGEgY2hhaW4hICAqLwotCQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZyhjdCwgaG9va251bSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gbmZfbmF0X3J1bGVfZmluZChza2IsIGhvb2tudW0sIGluLCBvdXQsCi0JCQkJCQkgICAgICAgY3QpOwotCisJCQlyZXQgPSBuZl9uYXRfcnVsZV9maW5kKHNrYiwgaG9va251bSwgaW4sIG91dCwgY3QpOwogCQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpCiAJCQkJcmV0dXJuIHJldDsKIAkJfSBlbHNlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9wcm9jLmMgYi9uZXQvaXB2NC9wcm9jLmMKaW5kZXggM2RjOTkxNC4uNGFlMWYyMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcHJvYy5jCisrKyBiL25ldC9pcHY0L3Byb2MuYwpAQCAtMjUyLDYgKzI1Miw3IEBACiAJU05NUF9NSUJfSVRFTSgiVENQQmFja2xvZ0Ryb3AiLCBMSU5VWF9NSUJfVENQQkFDS0xPR0RST1ApLAogCVNOTVBfTUlCX0lURU0oIlRDUE1pblRUTERyb3AiLCBMSU5VWF9NSUJfVENQTUlOVFRMRFJPUCksCiAJU05NUF9NSUJfSVRFTSgiVENQRGVmZXJBY2NlcHREcm9wIiwgTElOVVhfTUlCX1RDUERFRkVSQUNDRVBURFJPUCksCisJU05NUF9NSUJfSVRFTSgiSVBSZXZlcnNlUGF0aEZpbHRlciIsIExJTlVYX01JQl9JUFJQRklMVEVSKSwKIAlTTk1QX01JQl9TRU5USU5FTAogfTsKIApAQCAtMzQyLDEwICszNDMsMTIgQEAKIAkJICAgSVBWNF9ERVZDT05GX0FMTChuZXQsIEZPUldBUkRJTkcpID8gMSA6IDIsCiAJCSAgIHN5c2N0bF9pcF9kZWZhdWx0X3R0bCk7CiAKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBtaWJzKSAhPSAwKTsKIAlmb3IgKGkgPSAwOyBzbm1wNF9pcHN0YXRzX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcywKLQkJCQkJICAgc25tcDRfaXBzdGF0c19saXN0W2ldLmVudHJ5KSk7CisJCXNlcV9wcmludGYoc2VxLCAiICVsbHUiLAorCQkJICAgc25tcF9mb2xkX2ZpZWxkNjQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcywKKwkJCQkJICAgICBzbm1wNF9pcHN0YXRzX2xpc3RbaV0uZW50cnksCisJCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpKTsKIAogCWljbXBfcHV0KHNlcSk7CS8qIFJGQyAyMDExIGNvbXBhdGliaWxpdHkgKi8KIAlpY21wbXNnX3B1dChzZXEpOwpAQCAtNDMxLDkgKzQzNCwxMCBAQAogCiAJc2VxX3B1dHMoc2VxLCAiXG5JcEV4dDoiKTsKIAlmb3IgKGkgPSAwOyBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcywKLQkJCQkJICAgc25tcDRfaXBleHRzdGF0c19saXN0W2ldLmVudHJ5KSk7CisJCXNlcV9wcmludGYoc2VxLCAiICVsbHUiLAorCQkJICAgc25tcF9mb2xkX2ZpZWxkNjQoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXBfc3RhdGlzdGljcywKKwkJCQkJICAgICBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0uZW50cnksCisJCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpKTsKIAogCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9wcm90b2NvbC5jIGIvbmV0L2lwdjQvcHJvdG9jb2wuYwppbmRleCA1NDJmMjJmLi5mMmQyOTczIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9wcm90b2NvbC5jCisrKyBiL25ldC9pcHY0L3Byb3RvY29sLmMKQEAgLTUyLDYgKzUyLDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKGluZXRfYWRkX3Byb3RvY29sKTsKIAogLyoKICAqCVJlbW92ZSBhIHByb3RvY29sIGZyb20gdGhlIGhhc2ggdGFibGVzLgpAQCAtNzYsNiArNzcsNCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQotRVhQT1JUX1NZTUJPTChpbmV0X2FkZF9wcm90b2NvbCk7CiBFWFBPUlRfU1lNQk9MKGluZXRfZGVsX3Byb3RvY29sKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggMmM3YTE2My4uMDA5YTdiMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTMxNCw3ICszMTQsNyBAQAogfQogCiBzdGF0aWMgaW50IHJhd19zZW5kX2hkcmluYyhzdHJ1Y3Qgc29jayAqc2ssIHZvaWQgKmZyb20sIHNpemVfdCBsZW5ndGgsCi0JCQlzdHJ1Y3QgcnRhYmxlICpydCwKKwkJCXN0cnVjdCBydGFibGUgKipydHAsCiAJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwpAQCAtMzIzLDI1ICszMjMsMjcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGludCBpcGhsZW47CiAJaW50IGVycjsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9ICpydHA7CiAKLQlpZiAobGVuZ3RoID4gcnQtPnUuZHN0LmRldi0+bXR1KSB7CisJaWYgKGxlbmd0aCA+IHJ0LT5kc3QuZGV2LT5tdHUpIHsKIAkJaXBfbG9jYWxfZXJyb3Ioc2ssIEVNU0dTSVpFLCBydC0+cnRfZHN0LCBpbmV0LT5pbmV0X2Rwb3J0LAotCQkJICAgICAgIHJ0LT51LmRzdC5kZXYtPm10dSk7CisJCQkgICAgICAgcnQtPmRzdC5kZXYtPm10dSk7CiAJCXJldHVybiAtRU1TR1NJWkU7CiAJfQogCWlmIChmbGFncyZNU0dfUFJPQkUpCiAJCWdvdG8gb3V0OwogCiAJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKLQkJCQkgIGxlbmd0aCArIExMX0FMTE9DQVRFRF9TUEFDRShydC0+dS5kc3QuZGV2KSArIDE1LAorCQkJCSAgbGVuZ3RoICsgTExfQUxMT0NBVEVEX1NQQUNFKHJ0LT5kc3QuZGV2KSArIDE1LAogCQkJCSAgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT5kc3QuZGV2KSk7CiAKIAlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OwogCXNrYi0+bWFyayA9IHNrLT5za19tYXJrOwotCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKCZydC0+dS5kc3QpKTsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKKwkqcnRwID0gTlVMTDsKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWlwaCA9IGlwX2hkcihza2IpOwpAQCAtMzczLDcgKzM3NSw3IEBACiAJCWlwaC0+Y2hlY2sgICA9IDA7CiAJCWlwaC0+dG90X2xlbiA9IGh0b25zKGxlbmd0aCk7CiAJCWlmICghaXBoLT5pZCkKLQkJCWlwX3NlbGVjdF9pZGVudChpcGgsICZydC0+dS5kc3QsIE5VTEwpOworCQkJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT5kc3QsIE5VTEwpOwogCiAJCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIAl9CkBAIC0zODIsNyArMzg0LDcgQEAKIAkJCXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikpLT50eXBlKTsKIAogCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLAotCQkgICAgICBydC0+dS5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsKKwkJICAgICAgcnQtPmRzdC5kZXYsIGRzdF9vdXRwdXQpOwogCWlmIChlcnIgPiAwKQogCQllcnIgPSBuZXRfeG1pdF9lcnJubyhlcnIpOwogCWlmIChlcnIpCkBAIC01NzYsNyArNTc4LDcgQEAKIAogCWlmIChpbmV0LT5oZHJpbmNsKQogCQllcnIgPSByYXdfc2VuZF9oZHJpbmMoc2ssIG1zZy0+bXNnX2lvdiwgbGVuLAotCQkJCQlydCwgbXNnLT5tc2dfZmxhZ3MpOworCQkJCQkmcnQsIG1zZy0+bXNnX2ZsYWdzKTsKIAogCSBlbHNlIHsKIAkJaWYgKCFpcGMuYWRkcikKQEAgLTYwNCw3ICs2MDYsNyBAQAogCXJldHVybiBsZW47CiAKIGRvX2NvbmZpcm06Ci0JZHN0X2NvbmZpcm0oJnJ0LT51LmRzdCk7CisJZHN0X2NvbmZpcm0oJnJ0LT5kc3QpOwogCWlmICghKG1zZy0+bXNnX2ZsYWdzICYgTVNHX1BST0JFKSB8fCBsZW4pCiAJCWdvdG8gYmFja19mcm9tX2NvbmZpcm07CiAJZXJyID0gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDU2MGFjYzYuLjNmNTZiNmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMjUzLDggKzI1Myw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CQlydF9oYXNoX2xvZyAgX19yZWFkX21vc3RseTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBydF9jYWNoZV9zdGF0LCBydF9jYWNoZV9zdGF0KTsKLSNkZWZpbmUgUlRfQ0FDSEVfU1RBVF9JTkMoZmllbGQpIFwKLQkoX19yYXdfZ2V0X2NwdV92YXIocnRfY2FjaGVfc3RhdCkuZmllbGQrKykKKyNkZWZpbmUgUlRfQ0FDSEVfU1RBVF9JTkMoZmllbGQpIF9fdGhpc19jcHVfaW5jKHJ0X2NhY2hlX3N0YXQuZmllbGQpCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJ0X2hhc2goX19iZTMyIGRhZGRyLCBfX2JlMzIgc2FkZHIsIGludCBpZHgsCiAJCQkJICAgaW50IGdlbmlkKQpAQCAtMjg3LDEwICsyODYsMTAgQEAKIAkJcmN1X3JlYWRfbG9ja19iaCgpOwogCQlyID0gcmN1X2RlcmVmZXJlbmNlX2JoKHJ0X2hhc2hfdGFibGVbc3QtPmJ1Y2tldF0uY2hhaW4pOwogCQl3aGlsZSAocikgewotCQkJaWYgKGRldl9uZXQoci0+dS5kc3QuZGV2KSA9PSBzZXFfZmlsZV9uZXQoc2VxKSAmJgorCQkJaWYgKGRldl9uZXQoci0+ZHN0LmRldikgPT0gc2VxX2ZpbGVfbmV0KHNlcSkgJiYKIAkJCSAgICByLT5ydF9nZW5pZCA9PSBzdC0+Z2VuaWQpCiAJCQkJcmV0dXJuIHI7Ci0JCQlyID0gcmN1X2RlcmVmZXJlbmNlX2JoKHItPnUuZHN0LnJ0X25leHQpOworCQkJciA9IHJjdV9kZXJlZmVyZW5jZV9iaChyLT5kc3QucnRfbmV4dCk7CiAJCX0KIAkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAJfQpAQCAtMzAyLDcgKzMwMSw3IEBACiB7CiAJc3RydWN0IHJ0X2NhY2hlX2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCi0JciA9IHItPnUuZHN0LnJ0X25leHQ7CisJciA9IHItPmRzdC5ydF9uZXh0OwogCXdoaWxlICghcikgewogCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIAkJZG8gewpAQCAtMzIwLDcgKzMxOSw3IEBACiB7CiAJc3RydWN0IHJ0X2NhY2hlX2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCXdoaWxlICgociA9IF9fcnRfY2FjaGVfZ2V0X25leHQoc2VxLCByKSkgIT0gTlVMTCkgewotCQlpZiAoZGV2X25ldChyLT51LmRzdC5kZXYpICE9IHNlcV9maWxlX25ldChzZXEpKQorCQlpZiAoZGV2X25ldChyLT5kc3QuZGV2KSAhPSBzZXFfZmlsZV9uZXQoc2VxKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoci0+cnRfZ2VuaWQgPT0gc3QtPmdlbmlkKQogCQkJYnJlYWs7CkBAIC0zNzgsMTkgKzM3NywxOSBAQAogCiAJCXNlcV9wcmludGYoc2VxLCAiJXNcdCUwOFhcdCUwOFhcdCU4WFx0JWRcdCV1XHQlZFx0IgogCQkJICAgICAgIiUwOFhcdCVkXHQldVx0JXVcdCUwMlhcdCVkXHQlMWRcdCUwOFglbiIsCi0JCQlyLT51LmRzdC5kZXYgPyByLT51LmRzdC5kZXYtPm5hbWUgOiAiKiIsCisJCQlyLT5kc3QuZGV2ID8gci0+ZHN0LmRldi0+bmFtZSA6ICIqIiwKIAkJCShfX2ZvcmNlIHUzMilyLT5ydF9kc3QsCiAJCQkoX19mb3JjZSB1MzIpci0+cnRfZ2F0ZXdheSwKLQkJCXItPnJ0X2ZsYWdzLCBhdG9taWNfcmVhZCgmci0+dS5kc3QuX19yZWZjbnQpLAotCQkJci0+dS5kc3QuX191c2UsIDAsIChfX2ZvcmNlIHUzMilyLT5ydF9zcmMsCi0JCQkoZHN0X21ldHJpYygmci0+dS5kc3QsIFJUQVhfQURWTVNTKSA/Ci0JCQkgICAgIChpbnQpZHN0X21ldHJpYygmci0+dS5kc3QsIFJUQVhfQURWTVNTKSArIDQwIDogMCksCi0JCQlkc3RfbWV0cmljKCZyLT51LmRzdCwgUlRBWF9XSU5ET1cpLAotCQkJKGludCkoKGRzdF9tZXRyaWMoJnItPnUuZHN0LCBSVEFYX1JUVCkgPj4gMykgKwotCQkJICAgICAgZHN0X21ldHJpYygmci0+dS5kc3QsIFJUQVhfUlRUVkFSKSksCisJCQlyLT5ydF9mbGFncywgYXRvbWljX3JlYWQoJnItPmRzdC5fX3JlZmNudCksCisJCQlyLT5kc3QuX191c2UsIDAsIChfX2ZvcmNlIHUzMilyLT5ydF9zcmMsCisJCQkoZHN0X21ldHJpYygmci0+ZHN0LCBSVEFYX0FEVk1TUykgPworCQkJICAgICAoaW50KWRzdF9tZXRyaWMoJnItPmRzdCwgUlRBWF9BRFZNU1MpICsgNDAgOiAwKSwKKwkJCWRzdF9tZXRyaWMoJnItPmRzdCwgUlRBWF9XSU5ET1cpLAorCQkJKGludCkoKGRzdF9tZXRyaWMoJnItPmRzdCwgUlRBWF9SVFQpID4+IDMpICsKKwkJCSAgICAgIGRzdF9tZXRyaWMoJnItPmRzdCwgUlRBWF9SVFRWQVIpKSwKIAkJCXItPmZsLmZsNF90b3MsCi0JCQlyLT51LmRzdC5oaCA/IGF0b21pY19yZWFkKCZyLT51LmRzdC5oaC0+aGhfcmVmY250KSA6IC0xLAotCQkJci0+dS5kc3QuaGggPyAoci0+dS5kc3QuaGgtPmhoX291dHB1dCA9PQorCQkJci0+ZHN0LmhoID8gYXRvbWljX3JlYWQoJnItPmRzdC5oaC0+aGhfcmVmY250KSA6IC0xLAorCQkJci0+ZHN0LmhoID8gKHItPmRzdC5oaC0+aGhfb3V0cHV0ID09CiAJCQkJICAgICAgIGRldl9xdWV1ZV94bWl0KSA6IDAsCiAJCQlyLT5ydF9zcGVjX2RzdCwgJmxlbik7CiAKQEAgLTYwOSwxMyArNjA4LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBydF9mcmVlKHN0cnVjdCBydGFibGUgKnJ0KQogewotCWNhbGxfcmN1X2JoKCZydC0+dS5kc3QucmN1X2hlYWQsIGRzdF9yY3VfZnJlZSk7CisJY2FsbF9yY3VfYmgoJnJ0LT5kc3QucmN1X2hlYWQsIGRzdF9yY3VfZnJlZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBydF9kcm9wKHN0cnVjdCBydGFibGUgKnJ0KQogewogCWlwX3J0X3B1dChydCk7Ci0JY2FsbF9yY3VfYmgoJnJ0LT51LmRzdC5yY3VfaGVhZCwgZHN0X3JjdV9mcmVlKTsKKwljYWxsX3JjdV9iaCgmcnQtPmRzdC5yY3VfaGVhZCwgZHN0X3JjdV9mcmVlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcnRfZmFzdF9jbGVhbihzdHJ1Y3QgcnRhYmxlICpydGgpCkBAIC02MjMsMTMgKzYyMiwxMyBAQAogCS8qIEtpbGwgYnJvYWRjYXN0L211bHRpY2FzdCBlbnRyaWVzIHZlcnkgYWdncmVzaXZlbHksIGlmIHRoZXkKIAkgICBjb2xsaWRlIGluIGhhc2ggdGFibGUgd2l0aCBtb3JlIHVzZWZ1bCBlbnRyaWVzICovCiAJcmV0dXJuIChydGgtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSAmJgotCQlydGgtPmZsLmlpZiAmJiBydGgtPnUuZHN0LnJ0X25leHQ7CisJCXJ0aC0+ZmwuaWlmICYmIHJ0aC0+ZHN0LnJ0X25leHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0X3ZhbHVhYmxlKHN0cnVjdCBydGFibGUgKnJ0aCkKIHsKIAlyZXR1cm4gKHJ0aC0+cnRfZmxhZ3MgJiAoUlRDRl9SRURJUkVDVEVEIHwgUlRDRl9OT1RJRlkpKSB8fAotCQlydGgtPnUuZHN0LmV4cGlyZXM7CisJCXJ0aC0+ZHN0LmV4cGlyZXM7CiB9CiAKIHN0YXRpYyBpbnQgcnRfbWF5X2V4cGlyZShzdHJ1Y3QgcnRhYmxlICpydGgsIHVuc2lnbmVkIGxvbmcgdG1vMSwgdW5zaWduZWQgbG9uZyB0bW8yKQpAQCAtNjM3LDE1ICs2MzYsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGFnZTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChhdG9taWNfcmVhZCgmcnRoLT51LmRzdC5fX3JlZmNudCkpCisJaWYgKGF0b21pY19yZWFkKCZydGgtPmRzdC5fX3JlZmNudCkpCiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gMTsKLQlpZiAocnRoLT51LmRzdC5leHBpcmVzICYmCi0JICAgIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnRoLT51LmRzdC5leHBpcmVzKSkKKwlpZiAocnRoLT5kc3QuZXhwaXJlcyAmJgorCSAgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJ0aC0+ZHN0LmV4cGlyZXMpKQogCQlnb3RvIG91dDsKIAotCWFnZSA9IGppZmZpZXMgLSBydGgtPnUuZHN0Lmxhc3R1c2U7CisJYWdlID0gamlmZmllcyAtIHJ0aC0+ZHN0Lmxhc3R1c2U7CiAJcmV0ID0gMDsKIAlpZiAoKGFnZSA8PSB0bW8xICYmICFydF9mYXN0X2NsZWFuKHJ0aCkpIHx8CiAJICAgIChhZ2UgPD0gdG1vMiAmJiBydF92YWx1YWJsZShydGgpKSkKQEAgLTY2MSw3ICs2NjAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHUzMiBydF9zY29yZShzdHJ1Y3QgcnRhYmxlICpydCkKIHsKLQl1MzIgc2NvcmUgPSBqaWZmaWVzIC0gcnQtPnUuZHN0Lmxhc3R1c2U7CisJdTMyIHNjb3JlID0gamlmZmllcyAtIHJ0LT5kc3QubGFzdHVzZTsKIAogCXNjb3JlID0gfnNjb3JlICYgfigzPDwzMCk7CiAKQEAgLTcwMSwxMiArNzAwLDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfbmV0bnMoc3RydWN0IHJ0YWJsZSAqcnQxLCBzdHJ1Y3QgcnRhYmxlICpydDIpCiB7Ci0JcmV0dXJuIG5ldF9lcShkZXZfbmV0KHJ0MS0+dS5kc3QuZGV2KSwgZGV2X25ldChydDItPnUuZHN0LmRldikpOworCXJldHVybiBuZXRfZXEoZGV2X25ldChydDEtPmRzdC5kZXYpLCBkZXZfbmV0KHJ0Mi0+ZHN0LmRldikpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBydF9pc19leHBpcmVkKHN0cnVjdCBydGFibGUgKnJ0aCkKIHsKLQlyZXR1cm4gcnRoLT5ydF9nZW5pZCAhPSBydF9nZW5pZChkZXZfbmV0KHJ0aC0+dS5kc3QuZGV2KSk7CisJcmV0dXJuIHJ0aC0+cnRfZ2VuaWQgIT0gcnRfZ2VuaWQoZGV2X25ldChydGgtPmRzdC5kZXYpKTsKIH0KIAogLyoKQEAgLTczNSw3ICs3MzQsNyBAQAogCQlydGggPSBydF9oYXNoX3RhYmxlW2ldLmNoYWluOwogCiAJCS8qIGRlZmVyIHJlbGVhc2luZyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBhZnRlciBzcGluX3VubG9jayAqLwotCQlmb3IgKHRhaWwgPSBydGg7IHRhaWw7IHRhaWwgPSB0YWlsLT51LmRzdC5ydF9uZXh0KQorCQlmb3IgKHRhaWwgPSBydGg7IHRhaWw7IHRhaWwgPSB0YWlsLT5kc3QucnRfbmV4dCkKIAkJCWlmICghcnRfaXNfZXhwaXJlZCh0YWlsKSkKIAkJCQlicmVhazsKIAkJaWYgKHJ0aCAhPSB0YWlsKQpAQCAtNzQ0LDkgKzc0Myw5IEBACiAJCS8qIGNhbGwgcnRfZnJlZSBvbiBlbnRyaWVzIGFmdGVyIHRoZSB0YWlsIHJlcXVpcmluZyBmbHVzaCAqLwogCQlwcmV2ID0gJnJ0X2hhc2hfdGFibGVbaV0uY2hhaW47CiAJCWZvciAocCA9ICpwcmV2OyBwOyBwID0gbmV4dCkgewotCQkJbmV4dCA9IHAtPnUuZHN0LnJ0X25leHQ7CisJCQluZXh0ID0gcC0+ZHN0LnJ0X25leHQ7CiAJCQlpZiAoIXJ0X2lzX2V4cGlyZWQocCkpIHsKLQkJCQlwcmV2ID0gJnAtPnUuZHN0LnJ0X25leHQ7CisJCQkJcHJldiA9ICZwLT5kc3QucnRfbmV4dDsKIAkJCX0gZWxzZSB7CiAJCQkJKnByZXYgPSBuZXh0OwogCQkJCXJ0X2ZyZWUocCk7CkBAIC03NjEsNyArNzYwLDcgQEAKIAkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaSkpOwogCiAJCWZvciAoOyBydGggIT0gdGFpbDsgcnRoID0gbmV4dCkgewotCQkJbmV4dCA9IHJ0aC0+dS5kc3QucnRfbmV4dDsKKwkJCW5leHQgPSBydGgtPmRzdC5ydF9uZXh0OwogCQkJcnRfZnJlZShydGgpOwogCQl9CiAJfQpAQCAtNzkyLDcgKzc5MSw3IEBACiAJd2hpbGUgKGF1eCAhPSBydGgpIHsKIAkJaWYgKGNvbXBhcmVfaGFzaF9pbnB1dHMoJmF1eC0+ZmwsICZydGgtPmZsKSkKIAkJCXJldHVybiAwOwotCQlhdXggPSBhdXgtPnUuZHN0LnJ0X25leHQ7CisJCWF1eCA9IGF1eC0+ZHN0LnJ0X25leHQ7CiAJfQogCXJldHVybiBPTkU7CiB9CkBAIC04MzIsMTggKzgzMSwxOCBAQAogCQlsZW5ndGggPSAwOwogCQlzcGluX2xvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaSkpOwogCQl3aGlsZSAoKHJ0aCA9ICpydGhwKSAhPSBOVUxMKSB7Ci0JCQlwcmVmZXRjaChydGgtPnUuZHN0LnJ0X25leHQpOworCQkJcHJlZmV0Y2gocnRoLT5kc3QucnRfbmV4dCk7CiAJCQlpZiAocnRfaXNfZXhwaXJlZChydGgpKSB7Ci0JCQkJKnJ0aHAgPSBydGgtPnUuZHN0LnJ0X25leHQ7CisJCQkJKnJ0aHAgPSBydGgtPmRzdC5ydF9uZXh0OwogCQkJCXJ0X2ZyZWUocnRoKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChydGgtPnUuZHN0LmV4cGlyZXMpIHsKKwkJCWlmIChydGgtPmRzdC5leHBpcmVzKSB7CiAJCQkJLyogRW50cnkgaXMgZXhwaXJlZCBldmVuIGlmIGl0IGlzIGluIHVzZSAqLwotCQkJCWlmICh0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBydGgtPnUuZHN0LmV4cGlyZXMpKSB7CisJCQkJaWYgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHJ0aC0+ZHN0LmV4cGlyZXMpKSB7CiBub2ZyZWU6CiAJCQkJCXRtbyA+Pj0gMTsKLQkJCQkJcnRocCA9ICZydGgtPnUuZHN0LnJ0X25leHQ7CisJCQkJCXJ0aHAgPSAmcnRoLT5kc3QucnRfbmV4dDsKIAkJCQkJLyoKIAkJCQkJICogV2Ugb25seSBjb3VudCBlbnRyaWVzIG9uCiAJCQkJCSAqIGEgY2hhaW4gd2l0aCBlcXVhbCBoYXNoIGlucHV0cyBvbmNlCkBAIC04NTksNyArODU4LDcgQEAKIAkJCQlnb3RvIG5vZnJlZTsKIAogCQkJLyogQ2xlYW51cCBhZ2VkIG9mZiBlbnRyaWVzLiAqLwotCQkJKnJ0aHAgPSBydGgtPnUuZHN0LnJ0X25leHQ7CisJCQkqcnRocCA9IHJ0aC0+ZHN0LnJ0X25leHQ7CiAJCQlydF9mcmVlKHJ0aCk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaSkpOwpAQCAtMTAwMCwxMCArOTk5LDEwIEBACiAJCQkJaWYgKCFydF9pc19leHBpcmVkKHJ0aCkgJiYKIAkJCQkJIXJ0X21heV9leHBpcmUocnRoLCB0bW8sIGV4cGlyZSkpIHsKIAkJCQkJdG1vID4+PSAxOwotCQkJCQlydGhwID0gJnJ0aC0+dS5kc3QucnRfbmV4dDsKKwkJCQkJcnRocCA9ICZydGgtPmRzdC5ydF9uZXh0OwogCQkJCQljb250aW51ZTsKIAkJCQl9Ci0JCQkJKnJ0aHAgPSBydGgtPnUuZHN0LnJ0X25leHQ7CisJCQkJKnJ0aHAgPSBydGgtPmRzdC5ydF9uZXh0OwogCQkJCXJ0X2ZyZWUocnRoKTsKIAkJCQlnb2FsLS07CiAJCQl9CkBAIC0xMDY5LDcgKzEwNjgsNyBAQAogCiAJd2hpbGUgKHJ0aCkgewogCQlsZW5ndGggKz0gaGFzX25vYWxpYXMoaGVhZCwgcnRoKTsKLQkJcnRoID0gcnRoLT51LmRzdC5ydF9uZXh0OworCQlydGggPSBydGgtPmRzdC5ydF9uZXh0OwogCX0KIAlyZXR1cm4gbGVuZ3RoID4+IEZSQUNUX0JJVFM7CiB9CkBAIC0xMDkxLDcgKzEwOTAsNyBAQAogCWNhbmRwID0gTlVMTDsKIAlub3cgPSBqaWZmaWVzOwogCi0JaWYgKCFydF9jYWNoaW5nKGRldl9uZXQocnQtPnUuZHN0LmRldikpKSB7CisJaWYgKCFydF9jYWNoaW5nKGRldl9uZXQocnQtPmRzdC5kZXYpKSkgewogCQkvKgogCQkgKiBJZiB3ZSdyZSBub3QgY2FjaGluZywganVzdCB0ZWxsIHRoZSBjYWxsZXIgd2UKIAkJICogd2VyZSBzdWNjZXNzZnVsIGFuZCBkb24ndCB0b3VjaCB0aGUgcm91dGUuICBUaGUKQEAgLTExMDksNyArMTEwOCw3IEBACiAJCSAqLwogCiAJCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fVU5JQ0FTVCB8fCBydC0+ZmwuaWlmID09IDApIHsKLQkJCWludCBlcnIgPSBhcnBfYmluZF9uZWlnaGJvdXIoJnJ0LT51LmRzdCk7CisJCQlpbnQgZXJyID0gYXJwX2JpbmRfbmVpZ2hib3VyKCZydC0+ZHN0KTsKIAkJCWlmIChlcnIpIHsKIAkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCkBAIC0xMTI4LDE5ICsxMTI3LDE5IEBACiAJc3Bpbl9sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGhhc2gpKTsKIAl3aGlsZSAoKHJ0aCA9ICpydGhwKSAhPSBOVUxMKSB7CiAJCWlmIChydF9pc19leHBpcmVkKHJ0aCkpIHsKLQkJCSpydGhwID0gcnRoLT51LmRzdC5ydF9uZXh0OworCQkJKnJ0aHAgPSBydGgtPmRzdC5ydF9uZXh0OwogCQkJcnRfZnJlZShydGgpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGNvbXBhcmVfa2V5cygmcnRoLT5mbCwgJnJ0LT5mbCkgJiYgY29tcGFyZV9uZXRucyhydGgsIHJ0KSkgewogCQkJLyogUHV0IGl0IGZpcnN0ICovCi0JCQkqcnRocCA9IHJ0aC0+dS5kc3QucnRfbmV4dDsKKwkJCSpydGhwID0gcnRoLT5kc3QucnRfbmV4dDsKIAkJCS8qCiAJCQkgKiBTaW5jZSBsb29rdXAgaXMgbG9ja2ZyZWUsIHRoZSBkZWxldGlvbgogCQkJICogbXVzdCBiZSB2aXNpYmxlIHRvIGFub3RoZXIgd2Vha2x5IG9yZGVyZWQgQ1BVIGJlZm9yZQogCQkJICogdGhlIGluc2VydGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGhhc2ggY2hhaW4uCiAJCQkgKi8KLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihydGgtPnUuZHN0LnJ0X25leHQsCisJCQlyY3VfYXNzaWduX3BvaW50ZXIocnRoLT5kc3QucnRfbmV4dCwKIAkJCQkJICAgcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7CiAJCQkvKgogCQkJICogU2luY2UgbG9va3VwIGlzIGxvY2tmcmVlLCB0aGUgdXBkYXRlIHdyaXRlcwpAQCAtMTE0OCwxOCArMTE0NywxOCBAQAogCQkJICovCiAJCQlyY3VfYXNzaWduX3BvaW50ZXIocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbiwgcnRoKTsKIAotCQkJZHN0X3VzZSgmcnRoLT51LmRzdCwgbm93KTsKKwkJCWRzdF91c2UoJnJ0aC0+ZHN0LCBub3cpOwogCQkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCiAJCQlydF9kcm9wKHJ0KTsKIAkJCWlmIChycCkKIAkJCQkqcnAgPSBydGg7CiAJCQllbHNlCi0JCQkJc2tiX2RzdF9zZXQoc2tiLCAmcnRoLT51LmRzdCk7CisJCQkJc2tiX2RzdF9zZXQoc2tiLCAmcnRoLT5kc3QpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlpZiAoIWF0b21pY19yZWFkKCZydGgtPnUuZHN0Ll9fcmVmY250KSkgeworCQlpZiAoIWF0b21pY19yZWFkKCZydGgtPmRzdC5fX3JlZmNudCkpIHsKIAkJCXUzMiBzY29yZSA9IHJ0X3Njb3JlKHJ0aCk7CiAKIAkJCWlmIChzY29yZSA8PSBtaW5fc2NvcmUpIHsKQEAgLTExNzEsNyArMTE3MCw3IEBACiAKIAkJY2hhaW5fbGVuZ3RoKys7CiAKLQkJcnRocCA9ICZydGgtPnUuZHN0LnJ0X25leHQ7CisJCXJ0aHAgPSAmcnRoLT5kc3QucnRfbmV4dDsKIAl9CiAKIAlpZiAoY2FuZCkgewpAQCAtMTE4MiwxNyArMTE4MSwxNyBAQAogCQkgKiBvbmx5IDIgZW50cmllcyBwZXIgYnVja2V0LiBXZSB3aWxsIHNlZS4KIAkJICovCiAJCWlmIChjaGFpbl9sZW5ndGggPiBpcF9ydF9nY19lbGFzdGljaXR5KSB7Ci0JCQkqY2FuZHAgPSBjYW5kLT51LmRzdC5ydF9uZXh0OworCQkJKmNhbmRwID0gY2FuZC0+ZHN0LnJ0X25leHQ7CiAJCQlydF9mcmVlKGNhbmQpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGNoYWluX2xlbmd0aCA+IHJ0X2NoYWluX2xlbmd0aF9tYXggJiYKIAkJICAgIHNsb3dfY2hhaW5fbGVuZ3RoKHJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW4pID4gcnRfY2hhaW5fbGVuZ3RoX21heCkgewotCQkJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChydC0+dS5kc3QuZGV2KTsKKwkJCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQocnQtPmRzdC5kZXYpOwogCQkJaW50IG51bSA9ICsrbmV0LT5pcHY0LmN1cnJlbnRfcnRfY2FjaGVfcmVidWlsZF9jb3VudDsKIAkJCWlmICghcnRfY2FjaGluZyhuZXQpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVkIHJlYnVpbGRzIGlzIG92ZXIgbGltaXQsIHJvdXRlIGNhY2hpbmcgZGlzYWJsZWRcbiIsCi0JCQkJCXJ0LT51LmRzdC5kZXYtPm5hbWUsIG51bSk7CisJCQkJCXJ0LT5kc3QuZGV2LT5uYW1lLCBudW0pOwogCQkJfQogCQkJcnRfZW1lcmdlbmN5X2hhc2hfcmVidWlsZChuZXQpOwogCQkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwpAQCAtMTIwNyw3ICsxMjA2LDcgQEAKIAkgICByb3V0ZSBvciB1bmljYXN0IGZvcndhcmRpbmcgcGF0aC4KIAkgKi8KIAlpZiAocnQtPnJ0X3R5cGUgPT0gUlROX1VOSUNBU1QgfHwgcnQtPmZsLmlpZiA9PSAwKSB7Ci0JCWludCBlcnIgPSBhcnBfYmluZF9uZWlnaGJvdXIoJnJ0LT51LmRzdCk7CisJCWludCBlcnIgPSBhcnBfYmluZF9uZWlnaGJvdXIoJnJ0LT5kc3QpOwogCQlpZiAoZXJyKSB7CiAJCQlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAKQEAgLTEyMzgsMTQgKzEyMzcsMTQgQEAKIAkJfQogCX0KIAotCXJ0LT51LmRzdC5ydF9uZXh0ID0gcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbjsKKwlydC0+ZHN0LnJ0X25leHQgPSBydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluOwogCiAjaWYgUlRfQ0FDSEVfREVCVUcgPj0gMgotCWlmIChydC0+dS5kc3QucnRfbmV4dCkgeworCWlmIChydC0+ZHN0LnJ0X25leHQpIHsKIAkJc3RydWN0IHJ0YWJsZSAqdHJ0OwogCQlwcmludGsoS0VSTl9ERUJVRyAicnRfY2FjaGUgQCUwMng6ICVwSTQiLAogCQkgICAgICAgaGFzaCwgJnJ0LT5ydF9kc3QpOwotCQlmb3IgKHRydCA9IHJ0LT51LmRzdC5ydF9uZXh0OyB0cnQ7IHRydCA9IHRydC0+dS5kc3QucnRfbmV4dCkKKwkJZm9yICh0cnQgPSBydC0+ZHN0LnJ0X25leHQ7IHRydDsgdHJ0ID0gdHJ0LT5kc3QucnRfbmV4dCkKIAkJCXByaW50aygiIC4gJXBJNCIsICZ0cnQtPnJ0X2RzdCk7CiAJCXByaW50aygiXG4iKTsKIAl9CkBAIC0xMjYzLDcgKzEyNjIsNyBAQAogCWlmIChycCkKIAkJKnJwID0gcnQ7CiAJZWxzZQotCQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCQlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMyNSw2ICsxMzI0LDcgQEAKIAogCWlwX3NlbGVjdF9mYl9pZGVudChpcGgpOwogfQorRVhQT1JUX1NZTUJPTChfX2lwX3NlbGVjdF9pZGVudCk7CiAKIHN0YXRpYyB2b2lkIHJ0X2RlbCh1bnNpZ25lZCBoYXNoLCBzdHJ1Y3QgcnRhYmxlICpydCkKIHsKQEAgLTEzMzUsMjAgKzEzMzUsMjEgQEAKIAlpcF9ydF9wdXQocnQpOwogCXdoaWxlICgoYXV4ID0gKnJ0aHApICE9IE5VTEwpIHsKIAkJaWYgKGF1eCA9PSBydCB8fCBydF9pc19leHBpcmVkKGF1eCkpIHsKLQkJCSpydGhwID0gYXV4LT51LmRzdC5ydF9uZXh0OworCQkJKnJ0aHAgPSBhdXgtPmRzdC5ydF9uZXh0OwogCQkJcnRfZnJlZShhdXgpOwogCQkJY29udGludWU7CiAJCX0KLQkJcnRocCA9ICZhdXgtPnUuZHN0LnJ0X25leHQ7CisJCXJ0aHAgPSAmYXV4LT5kc3QucnRfbmV4dDsKIAl9CiAJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogfQogCisvKiBjYWxsZWQgaW4gcmN1X3JlYWRfbG9jaygpIHNlY3Rpb24gKi8KIHZvaWQgaXBfcnRfcmVkaXJlY3QoX19iZTMyIG9sZF9ndywgX19iZTMyIGRhZGRyLCBfX2JlMzIgbmV3X2d3LAogCQkgICAgX19iZTMyIHNhZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBpLCBrOwotCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGluX2Rldl9nZXQoZGV2KTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldik7CiAJc3RydWN0IHJ0YWJsZSAqcnRoLCAqKnJ0aHA7CiAJX19iZTMyICBza2V5c1syXSA9IHsgc2FkZHIsIDAgfTsKIAlpbnQgIGlrZXlzWzJdID0geyBkZXYtPmlmaW5kZXgsIDAgfTsKQEAgLTEzODQsNyArMTM4NSw2IEBACiAKIAkJCXJ0aHA9JnJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW47CiAKLQkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCXdoaWxlICgocnRoID0gcmN1X2RlcmVmZXJlbmNlKCpydGhwKSkgIT0gTlVMTCkgewogCQkJCXN0cnVjdCBydGFibGUgKnJ0OwogCkBAIC0xMzkzLDQ0ICsxMzkzLDQyIEBACiAJCQkJICAgIHJ0aC0+Zmwub2lmICE9IGlrZXlzW2tdIHx8CiAJCQkJICAgIHJ0aC0+ZmwuaWlmICE9IDAgfHwKIAkJCQkgICAgcnRfaXNfZXhwaXJlZChydGgpIHx8Ci0JCQkJICAgICFuZXRfZXEoZGV2X25ldChydGgtPnUuZHN0LmRldiksIG5ldCkpIHsKLQkJCQkJcnRocCA9ICZydGgtPnUuZHN0LnJ0X25leHQ7CisJCQkJICAgICFuZXRfZXEoZGV2X25ldChydGgtPmRzdC5kZXYpLCBuZXQpKSB7CisJCQkJCXJ0aHAgPSAmcnRoLT5kc3QucnRfbmV4dDsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKHJ0aC0+cnRfZHN0ICE9IGRhZGRyIHx8CiAJCQkJICAgIHJ0aC0+cnRfc3JjICE9IHNhZGRyIHx8Ci0JCQkJICAgIHJ0aC0+dS5kc3QuZXJyb3IgfHwKKwkJCQkgICAgcnRoLT5kc3QuZXJyb3IgfHwKIAkJCQkgICAgcnRoLT5ydF9nYXRld2F5ICE9IG9sZF9ndyB8fAotCQkJCSAgICBydGgtPnUuZHN0LmRldiAhPSBkZXYpCisJCQkJICAgIHJ0aC0+ZHN0LmRldiAhPSBkZXYpCiAJCQkJCWJyZWFrOwogCi0JCQkJZHN0X2hvbGQoJnJ0aC0+dS5kc3QpOwotCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCWRzdF9ob2xkKCZydGgtPmRzdCk7CiAKIAkJCQlydCA9IGRzdF9hbGxvYygmaXB2NF9kc3Rfb3BzKTsKIAkJCQlpZiAocnQgPT0gTlVMTCkgewogCQkJCQlpcF9ydF9wdXQocnRoKTsKLQkJCQkJaW5fZGV2X3B1dChpbl9kZXYpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCiAJCQkJLyogQ29weSBhbGwgdGhlIGluZm9ybWF0aW9uLiAqLwogCQkJCSpydCA9ICpydGg7Ci0JCQkJcnQtPnUuZHN0Ll9fdXNlCQk9IDE7Ci0JCQkJYXRvbWljX3NldCgmcnQtPnUuZHN0Ll9fcmVmY250LCAxKTsKLQkJCQlydC0+dS5kc3QuY2hpbGQJCT0gTlVMTDsKLQkJCQlpZiAocnQtPnUuZHN0LmRldikKLQkJCQkJZGV2X2hvbGQocnQtPnUuZHN0LmRldik7CisJCQkJcnQtPmRzdC5fX3VzZQkJPSAxOworCQkJCWF0b21pY19zZXQoJnJ0LT5kc3QuX19yZWZjbnQsIDEpOworCQkJCXJ0LT5kc3QuY2hpbGQJCT0gTlVMTDsKKwkJCQlpZiAocnQtPmRzdC5kZXYpCisJCQkJCWRldl9ob2xkKHJ0LT5kc3QuZGV2KTsKIAkJCQlpZiAocnQtPmlkZXYpCiAJCQkJCWluX2Rldl9ob2xkKHJ0LT5pZGV2KTsKLQkJCQlydC0+dS5kc3Qub2Jzb2xldGUJPSAtMTsKLQkJCQlydC0+dS5kc3QubGFzdHVzZQk9IGppZmZpZXM7Ci0JCQkJcnQtPnUuZHN0LnBhdGgJCT0gJnJ0LT51LmRzdDsKLQkJCQlydC0+dS5kc3QubmVpZ2hib3VyCT0gTlVMTDsKLQkJCQlydC0+dS5kc3QuaGgJCT0gTlVMTDsKKwkJCQlydC0+ZHN0Lm9ic29sZXRlCT0gLTE7CisJCQkJcnQtPmRzdC5sYXN0dXNlCT0gamlmZmllczsKKwkJCQlydC0+ZHN0LnBhdGgJCT0gJnJ0LT5kc3Q7CisJCQkJcnQtPmRzdC5uZWlnaGJvdXIJPSBOVUxMOworCQkJCXJ0LT5kc3QuaGgJCT0gTlVMTDsKICNpZmRlZiBDT05GSUdfWEZSTQotCQkJCXJ0LT51LmRzdC54ZnJtCQk9IE5VTEw7CisJCQkJcnQtPmRzdC54ZnJtCQk9IE5VTEw7CiAjZW5kaWYKIAkJCQlydC0+cnRfZ2VuaWQJCT0gcnRfZ2VuaWQobmV0KTsKIAkJCQlydC0+cnRfZmxhZ3MJCXw9IFJUQ0ZfUkVESVJFQ1RFRDsKQEAgLTE0MzksMjMgKzE0MzcsMjMgQEAKIAkJCQlydC0+cnRfZ2F0ZXdheQkJPSBuZXdfZ3c7CiAKIAkJCQkvKiBSZWRpcmVjdCByZWNlaXZlZCAtPiBwYXRoIHdhcyB2YWxpZCAqLwotCQkJCWRzdF9jb25maXJtKCZydGgtPnUuZHN0KTsKKwkJCQlkc3RfY29uZmlybSgmcnRoLT5kc3QpOwogCiAJCQkJaWYgKHJ0LT5wZWVyKQogCQkJCQlhdG9taWNfaW5jKCZydC0+cGVlci0+cmVmY250KTsKIAotCQkJCWlmIChhcnBfYmluZF9uZWlnaGJvdXIoJnJ0LT51LmRzdCkgfHwKLQkJCQkgICAgIShydC0+dS5kc3QubmVpZ2hib3VyLT5udWRfc3RhdGUgJgorCQkJCWlmIChhcnBfYmluZF9uZWlnaGJvdXIoJnJ0LT5kc3QpIHx8CisJCQkJICAgICEocnQtPmRzdC5uZWlnaGJvdXItPm51ZF9zdGF0ZSAmCiAJCQkJCSAgICBOVURfVkFMSUQpKSB7Ci0JCQkJCWlmIChydC0+dS5kc3QubmVpZ2hib3VyKQotCQkJCQkJbmVpZ2hfZXZlbnRfc2VuZChydC0+dS5kc3QubmVpZ2hib3VyLCBOVUxMKTsKKwkJCQkJaWYgKHJ0LT5kc3QubmVpZ2hib3VyKQorCQkJCQkJbmVpZ2hfZXZlbnRfc2VuZChydC0+ZHN0Lm5laWdoYm91ciwgTlVMTCk7CiAJCQkJCWlwX3J0X3B1dChydGgpOwogCQkJCQlydF9kcm9wKHJ0KTsKIAkJCQkJZ290byBkb19uZXh0OwogCQkJCX0KIAotCQkJCW5ldGV2ZW50Lm9sZCA9ICZydGgtPnUuZHN0OwotCQkJCW5ldGV2ZW50Lm5ldyA9ICZydC0+dS5kc3Q7CisJCQkJbmV0ZXZlbnQub2xkID0gJnJ0aC0+ZHN0OworCQkJCW5ldGV2ZW50Lm5ldyA9ICZydC0+ZHN0OwogCQkJCWNhbGxfbmV0ZXZlbnRfbm90aWZpZXJzKE5FVEVWRU5UX1JFRElSRUNULAogCQkJCQkJCSZuZXRldmVudCk7CiAKQEAgLTE0NjQsMTIgKzE0NjIsMTAgQEAKIAkJCQkJaXBfcnRfcHV0KHJ0KTsKIAkJCQlnb3RvIGRvX25leHQ7CiAJCQl9Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJZG9fbmV4dDoKIAkJCTsKIAkJfQogCX0KLQlpbl9kZXZfcHV0KGluX2Rldik7CiAJcmV0dXJuOwogCiByZWplY3RfcmVkaXJlY3Q6CkBAIC0xNDgwLDcgKzE0NzYsNyBAQAogCQkgICAgICAgJm9sZF9ndywgZGV2LT5uYW1lLCAmbmV3X2d3LAogCQkgICAgICAgJnNhZGRyLCAmZGFkZHIpOwogI2VuZGlmCi0JaW5fZGV2X3B1dChpbl9kZXYpOworCTsKIH0KIAogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmlwdjRfbmVnYXRpdmVfYWR2aWNlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKQEAgLTE0OTMsOCArMTQ4OSw4IEBACiAJCQlpcF9ydF9wdXQocnQpOwogCQkJcmV0ID0gTlVMTDsKIAkJfSBlbHNlIGlmICgocnQtPnJ0X2ZsYWdzICYgUlRDRl9SRURJUkVDVEVEKSB8fAotCQkJICAgKHJ0LT51LmRzdC5leHBpcmVzICYmCi0JCQkgICAgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBydC0+dS5kc3QuZXhwaXJlcykpKSB7CisJCQkgICAocnQtPmRzdC5leHBpcmVzICYmCisJCQkgICAgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBydC0+ZHN0LmV4cGlyZXMpKSkgewogCQkJdW5zaWduZWQgaGFzaCA9IHJ0X2hhc2gocnQtPmZsLmZsNF9kc3QsIHJ0LT5mbC5mbDRfc3JjLAogCQkJCQkJcnQtPmZsLm9pZiwKIAkJCQkJCXJ0X2dlbmlkKGRldl9uZXQoZHN0LT5kZXYpKSk7CkBAIC0xNTMyLDcgKzE1MjgsNyBAQAogCWludCBsb2dfbWFydGlhbnM7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShydC0+dS5kc3QuZGV2KTsKKwlpbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KHJ0LT5kc3QuZGV2KTsKIAlpZiAoIWluX2RldiB8fCAhSU5fREVWX1RYX1JFRElSRUNUUyhpbl9kZXYpKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm47CkBAIC0xNTQzLDMwICsxNTM5LDMwIEBACiAJLyogTm8gcmVkaXJlY3RlZCBwYWNrZXRzIGR1cmluZyBpcF9ydF9yZWRpcmVjdF9zaWxlbmNlOwogCSAqIHJlc2V0IHRoZSBhbGdvcml0aG0uCiAJICovCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcnQtPnUuZHN0LnJhdGVfbGFzdCArIGlwX3J0X3JlZGlyZWN0X3NpbGVuY2UpKQotCQlydC0+dS5kc3QucmF0ZV90b2tlbnMgPSAwOworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJ0LT5kc3QucmF0ZV9sYXN0ICsgaXBfcnRfcmVkaXJlY3Rfc2lsZW5jZSkpCisJCXJ0LT5kc3QucmF0ZV90b2tlbnMgPSAwOwogCiAJLyogVG9vIG1hbnkgaWdub3JlZCByZWRpcmVjdHM7IGRvIG5vdCBzZW5kIGFueXRoaW5nCi0JICogc2V0IHUuZHN0LnJhdGVfbGFzdCB0byB0aGUgbGFzdCBzZWVuIHJlZGlyZWN0ZWQgcGFja2V0LgorCSAqIHNldCBkc3QucmF0ZV9sYXN0IHRvIHRoZSBsYXN0IHNlZW4gcmVkaXJlY3RlZCBwYWNrZXQuCiAJICovCi0JaWYgKHJ0LT51LmRzdC5yYXRlX3Rva2VucyA+PSBpcF9ydF9yZWRpcmVjdF9udW1iZXIpIHsKLQkJcnQtPnUuZHN0LnJhdGVfbGFzdCA9IGppZmZpZXM7CisJaWYgKHJ0LT5kc3QucmF0ZV90b2tlbnMgPj0gaXBfcnRfcmVkaXJlY3RfbnVtYmVyKSB7CisJCXJ0LT5kc3QucmF0ZV9sYXN0ID0gamlmZmllczsKIAkJcmV0dXJuOwogCX0KIAogCS8qIENoZWNrIGZvciBsb2FkIGxpbWl0OyBzZXQgcmF0ZV9sYXN0IHRvIHRoZSBsYXRlc3Qgc2VudAogCSAqIHJlZGlyZWN0LgogCSAqLwotCWlmIChydC0+dS5kc3QucmF0ZV90b2tlbnMgPT0gMCB8fAorCWlmIChydC0+ZHN0LnJhdGVfdG9rZW5zID09IDAgfHwKIAkgICAgdGltZV9hZnRlcihqaWZmaWVzLAotCQkgICAgICAgKHJ0LT51LmRzdC5yYXRlX2xhc3QgKwotCQkJKGlwX3J0X3JlZGlyZWN0X2xvYWQgPDwgcnQtPnUuZHN0LnJhdGVfdG9rZW5zKSkpKSB7CisJCSAgICAgICAocnQtPmRzdC5yYXRlX2xhc3QgKworCQkJKGlwX3J0X3JlZGlyZWN0X2xvYWQgPDwgcnQtPmRzdC5yYXRlX3Rva2VucykpKSkgewogCQlpY21wX3NlbmQoc2tiLCBJQ01QX1JFRElSRUNULCBJQ01QX1JFRElSX0hPU1QsIHJ0LT5ydF9nYXRld2F5KTsKLQkJcnQtPnUuZHN0LnJhdGVfbGFzdCA9IGppZmZpZXM7Ci0JCSsrcnQtPnUuZHN0LnJhdGVfdG9rZW5zOworCQlydC0+ZHN0LnJhdGVfbGFzdCA9IGppZmZpZXM7CisJCSsrcnQtPmRzdC5yYXRlX3Rva2VuczsKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRQogCQlpZiAobG9nX21hcnRpYW5zICYmCi0JCSAgICBydC0+dS5kc3QucmF0ZV90b2tlbnMgPT0gaXBfcnRfcmVkaXJlY3RfbnVtYmVyICYmCisJCSAgICBydC0+ZHN0LnJhdGVfdG9rZW5zID09IGlwX3J0X3JlZGlyZWN0X251bWJlciAmJgogCQkgICAgbmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaG9zdCAlcEk0L2lmJWQgaWdub3JlcyByZWRpcmVjdHMgZm9yICVwSTQgdG8gJXBJNC5cbiIsCiAJCQkJJnJ0LT5ydF9zcmMsIHJ0LT5ydF9paWYsCkBAIC0xNTgxLDcgKzE1NzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgbm93OwogCWludCBjb2RlOwogCi0Jc3dpdGNoIChydC0+dS5kc3QuZXJyb3IpIHsKKwlzd2l0Y2ggKHJ0LT5kc3QuZXJyb3IpIHsKIAkJY2FzZSBFSU5WQUw6CiAJCWRlZmF1bHQ6CiAJCQlnb3RvIG91dDsKQEAgLTE1OTAsNyArMTU4Niw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBFTkVUVU5SRUFDSDoKIAkJCWNvZGUgPSBJQ01QX05FVF9VTlJFQUNIOwotCQkJSVBfSU5DX1NUQVRTX0JIKGRldl9uZXQocnQtPnUuZHN0LmRldiksCisJCQlJUF9JTkNfU1RBVFNfQkgoZGV2X25ldChydC0+ZHN0LmRldiksCiAJCQkJCUlQU1RBVFNfTUlCX0lOTk9ST1VURVMpOwogCQkJYnJlYWs7CiAJCWNhc2UgRUFDQ0VTOgpAQCAtMTU5OSwxMiArMTU5NSwxMiBAQAogCX0KIAogCW5vdyA9IGppZmZpZXM7Ci0JcnQtPnUuZHN0LnJhdGVfdG9rZW5zICs9IG5vdyAtIHJ0LT51LmRzdC5yYXRlX2xhc3Q7Ci0JaWYgKHJ0LT51LmRzdC5yYXRlX3Rva2VucyA+IGlwX3J0X2Vycm9yX2J1cnN0KQotCQlydC0+dS5kc3QucmF0ZV90b2tlbnMgPSBpcF9ydF9lcnJvcl9idXJzdDsKLQlydC0+dS5kc3QucmF0ZV9sYXN0ID0gbm93OwotCWlmIChydC0+dS5kc3QucmF0ZV90b2tlbnMgPj0gaXBfcnRfZXJyb3JfY29zdCkgewotCQlydC0+dS5kc3QucmF0ZV90b2tlbnMgLT0gaXBfcnRfZXJyb3JfY29zdDsKKwlydC0+ZHN0LnJhdGVfdG9rZW5zICs9IG5vdyAtIHJ0LT5kc3QucmF0ZV9sYXN0OworCWlmIChydC0+ZHN0LnJhdGVfdG9rZW5zID4gaXBfcnRfZXJyb3JfYnVyc3QpCisJCXJ0LT5kc3QucmF0ZV90b2tlbnMgPSBpcF9ydF9lcnJvcl9idXJzdDsKKwlydC0+ZHN0LnJhdGVfbGFzdCA9IG5vdzsKKwlpZiAocnQtPmRzdC5yYXRlX3Rva2VucyA+PSBpcF9ydF9lcnJvcl9jb3N0KSB7CisJCXJ0LT5kc3QucmF0ZV90b2tlbnMgLT0gaXBfcnRfZXJyb3JfY29zdDsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIGNvZGUsIDApOwogCX0KIApAQCAtMTY0OSw3ICsxNjQ1LDcgQEAKIAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJZm9yIChydGggPSByY3VfZGVyZWZlcmVuY2UocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0aDsKLQkJCSAgICAgcnRoID0gcmN1X2RlcmVmZXJlbmNlKHJ0aC0+dS5kc3QucnRfbmV4dCkpIHsKKwkJCSAgICAgcnRoID0gcmN1X2RlcmVmZXJlbmNlKHJ0aC0+ZHN0LnJ0X25leHQpKSB7CiAJCQkJdW5zaWduZWQgc2hvcnQgbXR1ID0gbmV3X210dTsKIAogCQkJCWlmIChydGgtPmZsLmZsNF9kc3QgIT0gZGFkZHIgfHwKQEAgLTE2NTgsOCArMTY1NCw4IEBACiAJCQkJICAgIHJ0aC0+cnRfc3JjICE9IGlwaC0+c2FkZHIgfHwKIAkJCQkgICAgcnRoLT5mbC5vaWYgIT0gaWtleXNba10gfHwKIAkJCQkgICAgcnRoLT5mbC5paWYgIT0gMCB8fAotCQkJCSAgICBkc3RfbWV0cmljX2xvY2tlZCgmcnRoLT51LmRzdCwgUlRBWF9NVFUpIHx8Ci0JCQkJICAgICFuZXRfZXEoZGV2X25ldChydGgtPnUuZHN0LmRldiksIG5ldCkgfHwKKwkJCQkgICAgZHN0X21ldHJpY19sb2NrZWQoJnJ0aC0+ZHN0LCBSVEFYX01UVSkgfHwKKwkJCQkgICAgIW5ldF9lcShkZXZfbmV0KHJ0aC0+ZHN0LmRldiksIG5ldCkgfHwKIAkJCQkgICAgcnRfaXNfZXhwaXJlZChydGgpKQogCQkJCQljb250aW51ZTsKIApAQCAtMTY2NywyMiArMTY2MywyMiBAQAogCiAJCQkJCS8qIEJTRCA0LjIgY29tcGF0aWJpbGl0eSBoYWNrIDotKCAqLwogCQkJCQlpZiAobXR1ID09IDAgJiYKLQkJCQkJICAgIG9sZF9tdHUgPj0gZHN0X210dSgmcnRoLT51LmRzdCkgJiYKKwkJCQkJICAgIG9sZF9tdHUgPj0gZHN0X210dSgmcnRoLT5kc3QpICYmCiAJCQkJCSAgICBvbGRfbXR1ID49IDY4ICsgKGlwaC0+aWhsIDw8IDIpKQogCQkJCQkJb2xkX210dSAtPSBpcGgtPmlobCA8PCAyOwogCiAJCQkJCW10dSA9IGd1ZXNzX210dShvbGRfbXR1KTsKIAkJCQl9Ci0JCQkJaWYgKG10dSA8PSBkc3RfbXR1KCZydGgtPnUuZHN0KSkgewotCQkJCQlpZiAobXR1IDwgZHN0X210dSgmcnRoLT51LmRzdCkpIHsKLQkJCQkJCWRzdF9jb25maXJtKCZydGgtPnUuZHN0KTsKKwkJCQlpZiAobXR1IDw9IGRzdF9tdHUoJnJ0aC0+ZHN0KSkgeworCQkJCQlpZiAobXR1IDwgZHN0X210dSgmcnRoLT5kc3QpKSB7CisJCQkJCQlkc3RfY29uZmlybSgmcnRoLT5kc3QpOwogCQkJCQkJaWYgKG10dSA8IGlwX3J0X21pbl9wbXR1KSB7CiAJCQkJCQkJbXR1ID0gaXBfcnRfbWluX3BtdHU7Ci0JCQkJCQkJcnRoLT51LmRzdC5tZXRyaWNzW1JUQVhfTE9DSy0xXSB8PQorCQkJCQkJCXJ0aC0+ZHN0Lm1ldHJpY3NbUlRBWF9MT0NLLTFdIHw9CiAJCQkJCQkJCSgxIDw8IFJUQVhfTVRVKTsKIAkJCQkJCX0KLQkJCQkJCXJ0aC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IG10dTsKLQkJCQkJCWRzdF9zZXRfZXhwaXJlcygmcnRoLT51LmRzdCwKKwkJCQkJCXJ0aC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBtdHU7CisJCQkJCQlkc3Rfc2V0X2V4cGlyZXMoJnJ0aC0+ZHN0LAogCQkJCQkJCWlwX3J0X210dV9leHBpcmVzKTsKIAkJCQkJfQogCQkJCQllc3RfbXR1ID0gbXR1OwpAQCAtMTc1NSw3ICsxNzUxLDcgQEAKIAogCXJ0ID0gc2tiX3J0YWJsZShza2IpOwogCWlmIChydCkKLQkJZHN0X3NldF9leHBpcmVzKCZydC0+dS5kc3QsIDApOworCQlkc3Rfc2V0X2V4cGlyZXMoJnJ0LT5kc3QsIDApOwogfQogCiBzdGF0aWMgaW50IGlwX3J0X2J1ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTc4MywxMSArMTc3OSwxMSBAQAogCiAJaWYgKHJ0LT5mbC5paWYgPT0gMCkKIAkJc3JjID0gcnQtPnJ0X3NyYzsKLQllbHNlIGlmIChmaWJfbG9va3VwKGRldl9uZXQocnQtPnUuZHN0LmRldiksICZydC0+ZmwsICZyZXMpID09IDApIHsKKwllbHNlIGlmIChmaWJfbG9va3VwKGRldl9uZXQocnQtPmRzdC5kZXYpLCAmcnQtPmZsLCAmcmVzKSA9PSAwKSB7CiAJCXNyYyA9IEZJQl9SRVNfUFJFRlNSQyhyZXMpOwogCQlmaWJfcmVzX3B1dCgmcmVzKTsKIAl9IGVsc2UKLQkJc3JjID0gaW5ldF9zZWxlY3RfYWRkcihydC0+dS5kc3QuZGV2LCBydC0+cnRfZ2F0ZXdheSwKKwkJc3JjID0gaW5ldF9zZWxlY3RfYWRkcihydC0+ZHN0LmRldiwgcnQtPnJ0X2dhdGV3YXksCiAJCQkJCVJUX1NDT1BFX1VOSVZFUlNFKTsKIAltZW1jcHkoYWRkciwgJnNyYywgNCk7CiB9CkBAIC0xNzk1LDEwICsxNzkxLDEwIEBACiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKIHN0YXRpYyB2b2lkIHNldF9jbGFzc190YWcoc3RydWN0IHJ0YWJsZSAqcnQsIHUzMiB0YWcpCiB7Ci0JaWYgKCEocnQtPnUuZHN0LnRjbGFzc2lkICYgMHhGRkZGKSkKLQkJcnQtPnUuZHN0LnRjbGFzc2lkIHw9IHRhZyAmIDB4RkZGRjsKLQlpZiAoIShydC0+dS5kc3QudGNsYXNzaWQgJiAweEZGRkYwMDAwKSkKLQkJcnQtPnUuZHN0LnRjbGFzc2lkIHw9IHRhZyAmIDB4RkZGRjAwMDA7CisJaWYgKCEocnQtPmRzdC50Y2xhc3NpZCAmIDB4RkZGRikpCisJCXJ0LT5kc3QudGNsYXNzaWQgfD0gdGFnICYgMHhGRkZGOworCWlmICghKHJ0LT5kc3QudGNsYXNzaWQgJiAweEZGRkYwMDAwKSkKKwkJcnQtPmRzdC50Y2xhc3NpZCB8PSB0YWcgJiAweEZGRkYwMDAwOwogfQogI2VuZGlmCiAKQEAgLTE4MTAsMzAgKzE4MDYsMzAgQEAKIAkJaWYgKEZJQl9SRVNfR1coKnJlcykgJiYKIAkJICAgIEZJQl9SRVNfTkgoKnJlcykubmhfc2NvcGUgPT0gUlRfU0NPUEVfTElOSykKIAkJCXJ0LT5ydF9nYXRld2F5ID0gRklCX1JFU19HVygqcmVzKTsKLQkJbWVtY3B5KHJ0LT51LmRzdC5tZXRyaWNzLCBmaS0+ZmliX21ldHJpY3MsCi0JCSAgICAgICBzaXplb2YocnQtPnUuZHN0Lm1ldHJpY3MpKTsKKwkJbWVtY3B5KHJ0LT5kc3QubWV0cmljcywgZmktPmZpYl9tZXRyaWNzLAorCQkgICAgICAgc2l6ZW9mKHJ0LT5kc3QubWV0cmljcykpOwogCQlpZiAoZmktPmZpYl9tdHUgPT0gMCkgewotCQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBydC0+dS5kc3QuZGV2LT5tdHU7Ci0JCQlpZiAoZHN0X21ldHJpY19sb2NrZWQoJnJ0LT51LmRzdCwgUlRBWF9NVFUpICYmCisJCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBydC0+ZHN0LmRldi0+bXR1OworCQkJaWYgKGRzdF9tZXRyaWNfbG9ja2VkKCZydC0+ZHN0LCBSVEFYX01UVSkgJiYKIAkJCSAgICBydC0+cnRfZ2F0ZXdheSAhPSBydC0+cnRfZHN0ICYmCi0JCQkgICAgcnQtPnUuZHN0LmRldi0+bXR1ID4gNTc2KQotCQkJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gNTc2OworCQkJICAgIHJ0LT5kc3QuZGV2LT5tdHUgPiA1NzYpCisJCQkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gNTc2OwogCQl9CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKLQkJcnQtPnUuZHN0LnRjbGFzc2lkID0gRklCX1JFU19OSCgqcmVzKS5uaF90Y2xhc3NpZDsKKwkJcnQtPmRzdC50Y2xhc3NpZCA9IEZJQl9SRVNfTkgoKnJlcykubmhfdGNsYXNzaWQ7CiAjZW5kaWYKIAl9IGVsc2UKLQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV09IHJ0LT51LmRzdC5kZXYtPm10dTsKKwkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdPSBydC0+ZHN0LmRldi0+bXR1OwogCi0JaWYgKGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9IT1BMSU1JVCkgPT0gMCkKLQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IHN5c2N0bF9pcF9kZWZhdWx0X3R0bDsKLQlpZiAoZHN0X210dSgmcnQtPnUuZHN0KSA+IElQX01BWF9NVFUpCi0JCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gSVBfTUFYX01UVTsKLQlpZiAoZHN0X21ldHJpYygmcnQtPnUuZHN0LCBSVEFYX0FEVk1TUykgPT0gMCkKLQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBtYXhfdCh1bnNpZ25lZCBpbnQsIHJ0LT51LmRzdC5kZXYtPm10dSAtIDQwLAorCWlmIChkc3RfbWV0cmljKCZydC0+ZHN0LCBSVEFYX0hPUExJTUlUKSA9PSAwKQorCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IHN5c2N0bF9pcF9kZWZhdWx0X3R0bDsKKwlpZiAoZHN0X210dSgmcnQtPmRzdCkgPiBJUF9NQVhfTVRVKQorCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBJUF9NQVhfTVRVOworCWlmIChkc3RfbWV0cmljKCZydC0+ZHN0LCBSVEFYX0FEVk1TUykgPT0gMCkKKwkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gbWF4X3QodW5zaWduZWQgaW50LCBydC0+ZHN0LmRldi0+bXR1IC0gNDAsCiAJCQkJICAgICAgIGlwX3J0X21pbl9hZHZtc3MpOwotCWlmIChkc3RfbWV0cmljKCZydC0+dS5kc3QsIFJUQVhfQURWTVNTKSA+IDY1NTM1IC0gNDApCi0JCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gNjU1MzUgLSA0MDsKKwlpZiAoZHN0X21ldHJpYygmcnQtPmRzdCwgUlRBWF9BRFZNU1MpID4gNjU1MzUgLSA0MCkKKwkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gNjU1MzUgLSA0MDsKIAogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCiAjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUwpAQCAtMTg0NCwxNCArMTg0MCwxNiBAQAogCXJ0LT5ydF90eXBlID0gcmVzLT50eXBlOwogfQogCisvKiBjYWxsZWQgaW4gcmN1X3JlYWRfbG9jaygpIHNlY3Rpb24gKi8KIHN0YXRpYyBpbnQgaXBfcm91dGVfaW5wdXRfbWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTMyIGRhZGRyLCBfX2JlMzIgc2FkZHIsCiAJCQkJdTggdG9zLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb3VyKQogewotCXVuc2lnbmVkIGhhc2g7CisJdW5zaWduZWQgaW50IGhhc2g7CiAJc3RydWN0IHJ0YWJsZSAqcnRoOwogCV9fYmUzMiBzcGVjX2RzdDsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShkZXYpOwogCXUzMiBpdGFnID0gMDsKKwlpbnQgZXJyOwogCiAJLyogUHJpbWFyeSBzYW5pdHkgY2hlY2tzLiAqLwogCkBAIC0xODY2LDIxICsxODY0LDIzIEBACiAJCWlmICghaXB2NF9pc19sb2NhbF9tdWx0aWNhc3QoZGFkZHIpKQogCQkJZ290byBlX2ludmFsOwogCQlzcGVjX2RzdCA9IGluZXRfc2VsZWN0X2FkZHIoZGV2LCAwLCBSVF9TQ09QRV9MSU5LKTsKLQl9IGVsc2UgaWYgKGZpYl92YWxpZGF0ZV9zb3VyY2Uoc2FkZHIsIDAsIHRvcywgMCwKLQkJCQkJZGV2LCAmc3BlY19kc3QsICZpdGFnLCAwKSA8IDApCi0JCWdvdG8gZV9pbnZhbDsKLQorCX0gZWxzZSB7CisJCWVyciA9IGZpYl92YWxpZGF0ZV9zb3VyY2Uoc2FkZHIsIDAsIHRvcywgMCwgZGV2LCAmc3BlY19kc3QsCisJCQkJCSAgJml0YWcsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZV9lcnI7CisJfQogCXJ0aCA9IGRzdF9hbGxvYygmaXB2NF9kc3Rfb3BzKTsKIAlpZiAoIXJ0aCkKIAkJZ290byBlX25vYnVmczsKIAotCXJ0aC0+dS5kc3Qub3V0cHV0ID0gaXBfcnRfYnVnOwotCXJ0aC0+dS5kc3Qub2Jzb2xldGUgPSAtMTsKKwlydGgtPmRzdC5vdXRwdXQgPSBpcF9ydF9idWc7CisJcnRoLT5kc3Qub2Jzb2xldGUgPSAtMTsKIAotCWF0b21pY19zZXQoJnJ0aC0+dS5kc3QuX19yZWZjbnQsIDEpOwotCXJ0aC0+dS5kc3QuZmxhZ3M9IERTVF9IT1NUOworCWF0b21pY19zZXQoJnJ0aC0+ZHN0Ll9fcmVmY250LCAxKTsKKwlydGgtPmRzdC5mbGFncz0gRFNUX0hPU1Q7CiAJaWYgKElOX0RFVl9DT05GX0dFVChpbl9kZXYsIE5PUE9MSUNZKSkKLQkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfTk9QT0xJQ1k7CisJCXJ0aC0+ZHN0LmZsYWdzIHw9IERTVF9OT1BPTElDWTsKIAlydGgtPmZsLmZsNF9kc3QJPSBkYWRkcjsKIAlydGgtPnJ0X2RzdAk9IGRhZGRyOwogCXJ0aC0+ZmwuZmw0X3Rvcwk9IHRvczsKQEAgLTE4ODgsMTMgKzE4ODgsMTMgQEAKIAlydGgtPmZsLmZsNF9zcmMJPSBzYWRkcjsKIAlydGgtPnJ0X3NyYwk9IHNhZGRyOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCi0JcnRoLT51LmRzdC50Y2xhc3NpZCA9IGl0YWc7CisJcnRoLT5kc3QudGNsYXNzaWQgPSBpdGFnOwogI2VuZGlmCiAJcnRoLT5ydF9paWYJPQogCXJ0aC0+ZmwuaWlmCT0gZGV2LT5pZmluZGV4OwotCXJ0aC0+dS5kc3QuZGV2CT0gaW5pdF9uZXQubG9vcGJhY2tfZGV2OwotCWRldl9ob2xkKHJ0aC0+dS5kc3QuZGV2KTsKLQlydGgtPmlkZXYJPSBpbl9kZXZfZ2V0KHJ0aC0+dS5kc3QuZGV2KTsKKwlydGgtPmRzdC5kZXYJPSBpbml0X25ldC5sb29wYmFja19kZXY7CisJZGV2X2hvbGQocnRoLT5kc3QuZGV2KTsKKwlydGgtPmlkZXYJPSBpbl9kZXZfZ2V0KHJ0aC0+ZHN0LmRldik7CiAJcnRoLT5mbC5vaWYJPSAwOwogCXJ0aC0+cnRfZ2F0ZXdheQk9IGRhZGRyOwogCXJ0aC0+cnRfc3BlY19kc3Q9IHNwZWNfZHN0OwpAQCAtMTkwMiwyNyArMTkwMiwyNSBAQAogCXJ0aC0+cnRfZmxhZ3MJPSBSVENGX01VTFRJQ0FTVDsKIAlydGgtPnJ0X3R5cGUJPSBSVE5fTVVMVElDQVNUOwogCWlmIChvdXIpIHsKLQkJcnRoLT51LmRzdC5pbnB1dD0gaXBfbG9jYWxfZGVsaXZlcjsKKwkJcnRoLT5kc3QuaW5wdXQ9IGlwX2xvY2FsX2RlbGl2ZXI7CiAJCXJ0aC0+cnRfZmxhZ3MgfD0gUlRDRl9MT0NBTDsKIAl9CiAKICNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCiAJaWYgKCFpcHY0X2lzX2xvY2FsX211bHRpY2FzdChkYWRkcikgJiYgSU5fREVWX01GT1JXQVJEKGluX2RldikpCi0JCXJ0aC0+dS5kc3QuaW5wdXQgPSBpcF9tcl9pbnB1dDsKKwkJcnRoLT5kc3QuaW5wdXQgPSBpcF9tcl9pbnB1dDsKICNlbmRpZgogCVJUX0NBQ0hFX1NUQVRfSU5DKGluX3Nsb3dfbWMpOwogCi0JaW5fZGV2X3B1dChpbl9kZXYpOwogCWhhc2ggPSBydF9oYXNoKGRhZGRyLCBzYWRkciwgZGV2LT5pZmluZGV4LCBydF9nZW5pZChkZXZfbmV0KGRldikpKTsKIAlyZXR1cm4gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCBOVUxMLCBza2IsIGRldi0+aWZpbmRleCk7CiAKIGVfbm9idWZzOgotCWluX2Rldl9wdXQoaW5fZGV2KTsKIAlyZXR1cm4gLUVOT0JVRlM7Ci0KIGVfaW52YWw6Ci0JaW5fZGV2X3B1dChpbl9kZXYpOwogCXJldHVybiAtRUlOVkFMOworZV9lcnI6CisJcmV0dXJuIGVycjsKIH0KIAogCkBAIC0xOTU2LDIyICsxOTU0LDIyIEBACiAjZW5kaWYKIH0KIAorLyogY2FsbGVkIGluIHJjdV9yZWFkX2xvY2soKSBzZWN0aW9uICovCiBzdGF0aWMgaW50IF9fbWtyb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IGZpYl9yZXN1bHQgKnJlcywKIAkJCSAgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiwKIAkJCSAgIF9fYmUzMiBkYWRkciwgX19iZTMyIHNhZGRyLCB1MzIgdG9zLAogCQkJICAgc3RydWN0IHJ0YWJsZSAqKnJlc3VsdCkKIHsKLQogCXN0cnVjdCBydGFibGUgKnJ0aDsKIAlpbnQgZXJyOwogCXN0cnVjdCBpbl9kZXZpY2UgKm91dF9kZXY7Ci0JdW5zaWduZWQgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CiAJX19iZTMyIHNwZWNfZHN0OwogCXUzMiBpdGFnOwogCiAJLyogZ2V0IGEgd29ya2luZyByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBkZXZpY2UgKi8KLQlvdXRfZGV2ID0gaW5fZGV2X2dldChGSUJfUkVTX0RFVigqcmVzKSk7CisJb3V0X2RldiA9IF9faW5fZGV2X2dldF9yY3UoRklCX1JFU19ERVYoKnJlcykpOwogCWlmIChvdXRfZGV2ID09IE5VTEwpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0NSSVQgIkJ1ZyBpbiBpcF9yb3V0ZV9pbnB1dCIgXApAQCAtMTk4Niw3ICsxOTg0LDYgQEAKIAkJaXBfaGFuZGxlX21hcnRpYW5fc291cmNlKGluX2Rldi0+ZGV2LCBpbl9kZXYsIHNrYiwgZGFkZHIsCiAJCQkJCSBzYWRkcik7CiAKLQkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjAyMCwxMiArMjAxNywxMiBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7Ci0JcnRoLT51LmRzdC5mbGFncz0gRFNUX0hPU1Q7CisJYXRvbWljX3NldCgmcnRoLT5kc3QuX19yZWZjbnQsIDEpOworCXJ0aC0+ZHN0LmZsYWdzPSBEU1RfSE9TVDsKIAlpZiAoSU5fREVWX0NPTkZfR0VUKGluX2RldiwgTk9QT0xJQ1kpKQotCQlydGgtPnUuZHN0LmZsYWdzIHw9IERTVF9OT1BPTElDWTsKKwkJcnRoLT5kc3QuZmxhZ3MgfD0gRFNUX05PUE9MSUNZOwogCWlmIChJTl9ERVZfQ09ORl9HRVQob3V0X2RldiwgTk9YRlJNKSkKLQkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfTk9YRlJNOworCQlydGgtPmRzdC5mbGFncyB8PSBEU1RfTk9YRlJNOwogCXJ0aC0+ZmwuZmw0X2RzdAk9IGRhZGRyOwogCXJ0aC0+cnRfZHN0CT0gZGFkZHI7CiAJcnRoLT5mbC5mbDRfdG9zCT0gdG9zOwpAQCAtMjAzNSwxNiArMjAzMiwxNiBAQAogCXJ0aC0+cnRfZ2F0ZXdheQk9IGRhZGRyOwogCXJ0aC0+cnRfaWlmIAk9CiAJCXJ0aC0+ZmwuaWlmCT0gaW5fZGV2LT5kZXYtPmlmaW5kZXg7Ci0JcnRoLT51LmRzdC5kZXYJPSAob3V0X2RldiktPmRldjsKLQlkZXZfaG9sZChydGgtPnUuZHN0LmRldik7Ci0JcnRoLT5pZGV2CT0gaW5fZGV2X2dldChydGgtPnUuZHN0LmRldik7CisJcnRoLT5kc3QuZGV2CT0gKG91dF9kZXYpLT5kZXY7CisJZGV2X2hvbGQocnRoLT5kc3QuZGV2KTsKKwlydGgtPmlkZXYJPSBpbl9kZXZfZ2V0KHJ0aC0+ZHN0LmRldik7CiAJcnRoLT5mbC5vaWYgCT0gMDsKIAlydGgtPnJ0X3NwZWNfZHN0PSBzcGVjX2RzdDsKIAotCXJ0aC0+dS5kc3Qub2Jzb2xldGUgPSAtMTsKLQlydGgtPnUuZHN0LmlucHV0ID0gaXBfZm9yd2FyZDsKLQlydGgtPnUuZHN0Lm91dHB1dCA9IGlwX291dHB1dDsKLQlydGgtPnJ0X2dlbmlkID0gcnRfZ2VuaWQoZGV2X25ldChydGgtPnUuZHN0LmRldikpOworCXJ0aC0+ZHN0Lm9ic29sZXRlID0gLTE7CisJcnRoLT5kc3QuaW5wdXQgPSBpcF9mb3J3YXJkOworCXJ0aC0+ZHN0Lm91dHB1dCA9IGlwX291dHB1dDsKKwlydGgtPnJ0X2dlbmlkID0gcnRfZ2VuaWQoZGV2X25ldChydGgtPmRzdC5kZXYpKTsKIAogCXJ0X3NldF9uZXh0aG9wKHJ0aCwgcmVzLCBpdGFnKTsKIApAQCAtMjA1Myw4ICsyMDUwLDYgQEAKIAkqcmVzdWx0ID0gcnRoOwogCWVyciA9IDA7CiAgY2xlYW51cDoKLQkvKiByZWxlYXNlIHRoZSB3b3JraW5nIHJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IGRldmljZSAqLwotCWluX2Rldl9wdXQob3V0X2Rldik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjA4MCw3ICsyMDc1LDcgQEAKIAogCS8qIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSAqLwogCWhhc2ggPSBydF9oYXNoKGRhZGRyLCBzYWRkciwgZmwtPmlpZiwKLQkJICAgICAgIHJ0X2dlbmlkKGRldl9uZXQocnRoLT51LmRzdC5kZXYpKSk7CisJCSAgICAgICBydF9nZW5pZChkZXZfbmV0KHJ0aC0+ZHN0LmRldikpKTsKIAlyZXR1cm4gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCBOVUxMLCBza2IsIGZsLT5paWYpOwogfQogCkBAIC0yMDk4LDcgKzIwOTMsNyBAQAogCQkJICAgICAgIHU4IHRvcywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7Ci0Jc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaW5fZGV2X2dldChkZXYpOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQogCQkJCSAgICAgIHsgLmRhZGRyID0gZGFkZHIsCiAJCQkJCS5zYWRkciA9IHNhZGRyLApAQCAtMjE1OCwxMyArMjE1MywxMiBAQAogCQlnb3RvIGJyZF9pbnB1dDsKIAogCWlmIChyZXMudHlwZSA9PSBSVE5fTE9DQUwpIHsKLQkJaW50IHJlc3VsdDsKLQkJcmVzdWx0ID0gZmliX3ZhbGlkYXRlX3NvdXJjZShzYWRkciwgZGFkZHIsIHRvcywKKwkJZXJyID0gZmliX3ZhbGlkYXRlX3NvdXJjZShzYWRkciwgZGFkZHIsIHRvcywKIAkJCQkJICAgICBuZXQtPmxvb3BiYWNrX2Rldi0+aWZpbmRleCwKIAkJCQkJICAgICBkZXYsICZzcGVjX2RzdCwgJml0YWcsIHNrYi0+bWFyayk7Ci0JCWlmIChyZXN1bHQgPCAwKQotCQkJZ290byBtYXJ0aWFuX3NvdXJjZTsKLQkJaWYgKHJlc3VsdCkKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG1hcnRpYW5fc291cmNlX2tlZXBfZXJyOworCQlpZiAoZXJyKQogCQkJZmxhZ3MgfD0gUlRDRl9ESVJFQ1RTUkM7CiAJCXNwZWNfZHN0ID0gZGFkZHI7CiAJCWdvdG8gbG9jYWxfaW5wdXQ7CkBAIC0yMTc3LDcgKzIxNzEsNiBAQAogCiAJZXJyID0gaXBfbWtyb3V0ZV9pbnB1dChza2IsICZyZXMsICZmbCwgaW5fZGV2LCBkYWRkciwgc2FkZHIsIHRvcyk7CiBkb25lOgotCWluX2Rldl9wdXQoaW5fZGV2KTsKIAlpZiAoZnJlZV9yZXMpCiAJCWZpYl9yZXNfcHV0KCZyZXMpOwogb3V0OglyZXR1cm4gZXJyOwpAQCAtMjE5Miw3ICsyMTg1LDcgQEAKIAkJZXJyID0gZmliX3ZhbGlkYXRlX3NvdXJjZShzYWRkciwgMCwgdG9zLCAwLCBkZXYsICZzcGVjX2RzdCwKIAkJCQkJICAmaXRhZywgc2tiLT5tYXJrKTsKIAkJaWYgKGVyciA8IDApCi0JCQlnb3RvIG1hcnRpYW5fc291cmNlOworCQkJZ290byBtYXJ0aWFuX3NvdXJjZV9rZWVwX2VycjsKIAkJaWYgKGVycikKIAkJCWZsYWdzIHw9IFJUQ0ZfRElSRUNUU1JDOwogCX0KQEAgLTIyMDUsMTQgKzIxOTgsMTQgQEAKIAlpZiAoIXJ0aCkKIAkJZ290byBlX25vYnVmczsKIAotCXJ0aC0+dS5kc3Qub3V0cHV0PSBpcF9ydF9idWc7Ci0JcnRoLT51LmRzdC5vYnNvbGV0ZSA9IC0xOworCXJ0aC0+ZHN0Lm91dHB1dD0gaXBfcnRfYnVnOworCXJ0aC0+ZHN0Lm9ic29sZXRlID0gLTE7CiAJcnRoLT5ydF9nZW5pZCA9IHJ0X2dlbmlkKG5ldCk7CiAKLQlhdG9taWNfc2V0KCZydGgtPnUuZHN0Ll9fcmVmY250LCAxKTsKLQlydGgtPnUuZHN0LmZsYWdzPSBEU1RfSE9TVDsKKwlhdG9taWNfc2V0KCZydGgtPmRzdC5fX3JlZmNudCwgMSk7CisJcnRoLT5kc3QuZmxhZ3M9IERTVF9IT1NUOwogCWlmIChJTl9ERVZfQ09ORl9HRVQoaW5fZGV2LCBOT1BPTElDWSkpCi0JCXJ0aC0+dS5kc3QuZmxhZ3MgfD0gRFNUX05PUE9MSUNZOworCQlydGgtPmRzdC5mbGFncyB8PSBEU1RfTk9QT0xJQ1k7CiAJcnRoLT5mbC5mbDRfZHN0CT0gZGFkZHI7CiAJcnRoLT5ydF9kc3QJPSBkYWRkcjsKIAlydGgtPmZsLmZsNF90b3MJPSB0b3M7CkBAIC0yMjIwLDIwICsyMjEzLDIwIEBACiAJcnRoLT5mbC5mbDRfc3JjCT0gc2FkZHI7CiAJcnRoLT5ydF9zcmMJPSBzYWRkcjsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQotCXJ0aC0+dS5kc3QudGNsYXNzaWQgPSBpdGFnOworCXJ0aC0+ZHN0LnRjbGFzc2lkID0gaXRhZzsKICNlbmRpZgogCXJ0aC0+cnRfaWlmCT0KIAlydGgtPmZsLmlpZgk9IGRldi0+aWZpbmRleDsKLQlydGgtPnUuZHN0LmRldgk9IG5ldC0+bG9vcGJhY2tfZGV2OwotCWRldl9ob2xkKHJ0aC0+dS5kc3QuZGV2KTsKLQlydGgtPmlkZXYJPSBpbl9kZXZfZ2V0KHJ0aC0+dS5kc3QuZGV2KTsKKwlydGgtPmRzdC5kZXYJPSBuZXQtPmxvb3BiYWNrX2RldjsKKwlkZXZfaG9sZChydGgtPmRzdC5kZXYpOworCXJ0aC0+aWRldgk9IGluX2Rldl9nZXQocnRoLT5kc3QuZGV2KTsKIAlydGgtPnJ0X2dhdGV3YXkJPSBkYWRkcjsKIAlydGgtPnJ0X3NwZWNfZHN0PSBzcGVjX2RzdDsKLQlydGgtPnUuZHN0LmlucHV0PSBpcF9sb2NhbF9kZWxpdmVyOworCXJ0aC0+ZHN0LmlucHV0PSBpcF9sb2NhbF9kZWxpdmVyOwogCXJ0aC0+cnRfZmxhZ3MgCT0gZmxhZ3N8UlRDRl9MT0NBTDsKIAlpZiAocmVzLnR5cGUgPT0gUlROX1VOUkVBQ0hBQkxFKSB7Ci0JCXJ0aC0+dS5kc3QuaW5wdXQ9IGlwX2Vycm9yOwotCQlydGgtPnUuZHN0LmVycm9yPSAtZXJyOworCQlydGgtPmRzdC5pbnB1dD0gaXBfZXJyb3I7CisJCXJ0aC0+ZHN0LmVycm9yPSAtZXJyOwogCQlydGgtPnJ0X2ZsYWdzIAkmPSB+UlRDRl9MT0NBTDsKIAl9CiAJcnRoLT5ydF90eXBlCT0gcmVzLnR5cGU7CkBAIC0yMjczLDggKzIyNjYsMTAgQEAKIAlnb3RvIGRvbmU7CiAKIG1hcnRpYW5fc291cmNlOgorCWVyciA9IC1FSU5WQUw7CittYXJ0aWFuX3NvdXJjZV9rZWVwX2VycjoKIAlpcF9oYW5kbGVfbWFydGlhbl9zb3VyY2UoZGV2LCBpbl9kZXYsIHNrYiwgZGFkZHIsIHNhZGRyKTsKLQlnb3RvIGVfaW52YWw7CisJZ290byBkb25lOwogfQogCiBpbnQgaXBfcm91dGVfaW5wdXRfY29tbW9uKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUzMiBkYWRkciwgX19iZTMyIHNhZGRyLApAQCAtMjI4NCwzMiArMjI3OSwzNCBAQAogCXVuc2lnbmVkCWhhc2g7CiAJaW50IGlpZiA9IGRldi0+aWZpbmRleDsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CisJaW50IHJlczsKIAogCW5ldCA9IGRldl9uZXQoZGV2KTsKIAorCXJjdV9yZWFkX2xvY2soKTsKKwogCWlmICghcnRfY2FjaGluZyhuZXQpKQogCQlnb3RvIHNraXBfY2FjaGU7CiAKIAl0b3MgJj0gSVBUT1NfUlRfTUFTSzsKIAloYXNoID0gcnRfaGFzaChkYWRkciwgc2FkZHIsIGlpZiwgcnRfZ2VuaWQobmV0KSk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yIChydGggPSByY3VfZGVyZWZlcmVuY2UocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0aDsKLQkgICAgIHJ0aCA9IHJjdV9kZXJlZmVyZW5jZShydGgtPnUuZHN0LnJ0X25leHQpKSB7CisJICAgICBydGggPSByY3VfZGVyZWZlcmVuY2UocnRoLT5kc3QucnRfbmV4dCkpIHsKIAkJaWYgKCgoKF9fZm9yY2UgdTMyKXJ0aC0+ZmwuZmw0X2RzdCBeIChfX2ZvcmNlIHUzMilkYWRkcikgfAogCQkgICAgICgoX19mb3JjZSB1MzIpcnRoLT5mbC5mbDRfc3JjIF4gKF9fZm9yY2UgdTMyKXNhZGRyKSB8CiAJCSAgICAgKHJ0aC0+ZmwuaWlmIF4gaWlmKSB8CiAJCSAgICAgcnRoLT5mbC5vaWYgfAogCQkgICAgIChydGgtPmZsLmZsNF90b3MgXiB0b3MpKSA9PSAwICYmCiAJCSAgICBydGgtPmZsLm1hcmsgPT0gc2tiLT5tYXJrICYmCi0JCSAgICBuZXRfZXEoZGV2X25ldChydGgtPnUuZHN0LmRldiksIG5ldCkgJiYKKwkJICAgIG5ldF9lcShkZXZfbmV0KHJ0aC0+ZHN0LmRldiksIG5ldCkgJiYKIAkJICAgICFydF9pc19leHBpcmVkKHJ0aCkpIHsKIAkJCWlmIChub3JlZikgewotCQkJCWRzdF91c2Vfbm9yZWYoJnJ0aC0+dS5kc3QsIGppZmZpZXMpOwotCQkJCXNrYl9kc3Rfc2V0X25vcmVmKHNrYiwgJnJ0aC0+dS5kc3QpOworCQkJCWRzdF91c2Vfbm9yZWYoJnJ0aC0+ZHN0LCBqaWZmaWVzKTsKKwkJCQlza2JfZHN0X3NldF9ub3JlZihza2IsICZydGgtPmRzdCk7CiAJCQl9IGVsc2UgewotCQkJCWRzdF91c2UoJnJ0aC0+dS5kc3QsIGppZmZpZXMpOwotCQkJCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0aC0+dS5kc3QpOworCQkJCWRzdF91c2UoJnJ0aC0+ZHN0LCBqaWZmaWVzKTsKKwkJCQlza2JfZHN0X3NldChza2IsICZydGgtPmRzdCk7CiAJCQl9CiAJCQlSVF9DQUNIRV9TVEFUX0lOQyhpbl9oaXQpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yMzE3LDcgKzIzMTQsNiBAQAogCQl9CiAJCVJUX0NBQ0hFX1NUQVRfSU5DKGluX2hsaXN0X3NlYXJjaCk7CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOwogCiBza2lwX2NhY2hlOgogCS8qIE11bHRpY2FzdCByZWNvZ25pdGlvbiBsb2dpYyBpcyBtb3ZlZCBmcm9tIHJvdXRlIGNhY2hlIHRvIGhlcmUuCkBAIC0yMzMyLDEyICsyMzI4LDExIEBACiAJICAgcm91dGUgY2FjaGUgZW50cnkgaXMgY3JlYXRlZCBldmVudHVhbGx5LgogCSAqLwogCWlmIChpcHY0X2lzX211bHRpY2FzdChkYWRkcikpIHsKLQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldik7CiAKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KSkgIT0gTlVMTCkgeworCQlpZiAoaW5fZGV2KSB7CiAJCQlpbnQgb3VyID0gaXBfY2hlY2tfbWMoaW5fZGV2LCBkYWRkciwgc2FkZHIsCi0JCQkJaXBfaGRyKHNrYiktPnByb3RvY29sKTsKKwkJCQkJICAgICAgaXBfaGRyKHNrYiktPnByb3RvY29sKTsKIAkJCWlmIChvdXIKICNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCiAJCQkJfHwKQEAgLTIzNDUsMTUgKzIzNDAsMTggQEAKIAkJCSAgICAgSU5fREVWX01GT1JXQVJEKGluX2RldikpCiAjZW5kaWYKIAkJCSAgICkgeworCQkJCWludCByZXMgPSBpcF9yb3V0ZV9pbnB1dF9tYyhza2IsIGRhZGRyLCBzYWRkciwKKwkJCQkJCQkgICAgdG9zLCBkZXYsIG91cik7CiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQkJcmV0dXJuIGlwX3JvdXRlX2lucHV0X21jKHNrYiwgZGFkZHIsIHNhZGRyLAotCQkJCQkJCSB0b3MsIGRldiwgb3VyKTsKKwkJCQlyZXR1cm4gcmVzOwogCQkJfQogCQl9CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIGlwX3JvdXRlX2lucHV0X3Nsb3coc2tiLCBkYWRkciwgc2FkZHIsIHRvcywgZGV2KTsKKwlyZXMgPSBpcF9yb3V0ZV9pbnB1dF9zbG93KHNrYiwgZGFkZHIsIHNhZGRyLCB0b3MsIGRldik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0woaXBfcm91dGVfaW5wdXRfY29tbW9uKTsKIApAQCAtMjQxNSwxMiArMjQxMywxMiBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7Ci0JcnRoLT51LmRzdC5mbGFncz0gRFNUX0hPU1Q7CisJYXRvbWljX3NldCgmcnRoLT5kc3QuX19yZWZjbnQsIDEpOworCXJ0aC0+ZHN0LmZsYWdzPSBEU1RfSE9TVDsKIAlpZiAoSU5fREVWX0NPTkZfR0VUKGluX2RldiwgTk9YRlJNKSkKLQkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfTk9YRlJNOworCQlydGgtPmRzdC5mbGFncyB8PSBEU1RfTk9YRlJNOwogCWlmIChJTl9ERVZfQ09ORl9HRVQoaW5fZGV2LCBOT1BPTElDWSkpCi0JCXJ0aC0+dS5kc3QuZmxhZ3MgfD0gRFNUX05PUE9MSUNZOworCQlydGgtPmRzdC5mbGFncyB8PSBEU1RfTk9QT0xJQ1k7CiAKIAlydGgtPmZsLmZsNF9kc3QJPSBvbGRmbHAtPmZsNF9kc3Q7CiAJcnRoLT5mbC5mbDRfdG9zCT0gdG9zOwpAQCAtMjQzMiwzNSArMjQzMCwzNSBAQAogCXJ0aC0+cnRfaWlmCT0gb2xkZmxwLT5vaWYgPyA6IGRldl9vdXQtPmlmaW5kZXg7CiAJLyogZ2V0IHJlZmVyZW5jZXMgdG8gdGhlIGRldmljZXMgdGhhdCBhcmUgdG8gYmUgaG9sZCBieSB0aGUgcm91dGluZwogCSAgIGNhY2hlIGVudHJ5ICovCi0JcnRoLT51LmRzdC5kZXYJPSBkZXZfb3V0OworCXJ0aC0+ZHN0LmRldgk9IGRldl9vdXQ7CiAJZGV2X2hvbGQoZGV2X291dCk7CiAJcnRoLT5pZGV2CT0gaW5fZGV2X2dldChkZXZfb3V0KTsKIAlydGgtPnJ0X2dhdGV3YXkgPSBmbC0+Zmw0X2RzdDsKIAlydGgtPnJ0X3NwZWNfZHN0PSBmbC0+Zmw0X3NyYzsKIAotCXJ0aC0+dS5kc3Qub3V0cHV0PWlwX291dHB1dDsKLQlydGgtPnUuZHN0Lm9ic29sZXRlID0gLTE7CisJcnRoLT5kc3Qub3V0cHV0PWlwX291dHB1dDsKKwlydGgtPmRzdC5vYnNvbGV0ZSA9IC0xOwogCXJ0aC0+cnRfZ2VuaWQgPSBydF9nZW5pZChkZXZfbmV0KGRldl9vdXQpKTsKIAogCVJUX0NBQ0hFX1NUQVRfSU5DKG91dF9zbG93X3RvdCk7CiAKIAlpZiAoZmxhZ3MgJiBSVENGX0xPQ0FMKSB7Ci0JCXJ0aC0+dS5kc3QuaW5wdXQgPSBpcF9sb2NhbF9kZWxpdmVyOworCQlydGgtPmRzdC5pbnB1dCA9IGlwX2xvY2FsX2RlbGl2ZXI7CiAJCXJ0aC0+cnRfc3BlY19kc3QgPSBmbC0+Zmw0X2RzdDsKIAl9CiAJaWYgKGZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSB7CiAJCXJ0aC0+cnRfc3BlY19kc3QgPSBmbC0+Zmw0X3NyYzsKIAkJaWYgKGZsYWdzICYgUlRDRl9MT0NBTCAmJgogCQkgICAgIShkZXZfb3V0LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKLQkJCXJ0aC0+dS5kc3Qub3V0cHV0ID0gaXBfbWNfb3V0cHV0OworCQkJcnRoLT5kc3Qub3V0cHV0ID0gaXBfbWNfb3V0cHV0OwogCQkJUlRfQ0FDSEVfU1RBVF9JTkMob3V0X3Nsb3dfbWMpOwogCQl9CiAjaWZkZWYgQ09ORklHX0lQX01ST1VURQogCQlpZiAocmVzLT50eXBlID09IFJUTl9NVUxUSUNBU1QpIHsKIAkJCWlmIChJTl9ERVZfTUZPUldBUkQoaW5fZGV2KSAmJgogCQkJICAgICFpcHY0X2lzX2xvY2FsX211bHRpY2FzdChvbGRmbHAtPmZsNF9kc3QpKSB7Ci0JCQkJcnRoLT51LmRzdC5pbnB1dCA9IGlwX21yX2lucHV0OwotCQkJCXJ0aC0+dS5kc3Qub3V0cHV0ID0gaXBfbWNfb3V0cHV0OworCQkJCXJ0aC0+ZHN0LmlucHV0ID0gaXBfbXJfaW5wdXQ7CisJCQkJcnRoLT5kc3Qub3V0cHV0ID0gaXBfbWNfb3V0cHV0OwogCQkJfQogCQl9CiAjZW5kaWYKQEAgLTI3MTUsNyArMjcxMyw3IEBACiAKIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJZm9yIChydGggPSByY3VfZGVyZWZlcmVuY2VfYmgocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0aDsKLQkJcnRoID0gcmN1X2RlcmVmZXJlbmNlX2JoKHJ0aC0+dS5kc3QucnRfbmV4dCkpIHsKKwkJcnRoID0gcmN1X2RlcmVmZXJlbmNlX2JoKHJ0aC0+ZHN0LnJ0X25leHQpKSB7CiAJCWlmIChydGgtPmZsLmZsNF9kc3QgPT0gZmxwLT5mbDRfZHN0ICYmCiAJCSAgICBydGgtPmZsLmZsNF9zcmMgPT0gZmxwLT5mbDRfc3JjICYmCiAJCSAgICBydGgtPmZsLmlpZiA9PSAwICYmCkBAIC0yNzIzLDkgKzI3MjEsOSBAQAogCQkgICAgcnRoLT5mbC5tYXJrID09IGZscC0+bWFyayAmJgogCQkgICAgISgocnRoLT5mbC5mbDRfdG9zIF4gZmxwLT5mbDRfdG9zKSAmCiAJCQkgICAgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSkgJiYKLQkJICAgIG5ldF9lcShkZXZfbmV0KHJ0aC0+dS5kc3QuZGV2KSwgbmV0KSAmJgorCQkgICAgbmV0X2VxKGRldl9uZXQocnRoLT5kc3QuZGV2KSwgbmV0KSAmJgogCQkgICAgIXJ0X2lzX2V4cGlyZWQocnRoKSkgewotCQkJZHN0X3VzZSgmcnRoLT51LmRzdCwgamlmZmllcyk7CisJCQlkc3RfdXNlKCZydGgtPmRzdCwgamlmZmllcyk7CiAJCQlSVF9DQUNIRV9TVEFUX0lOQyhvdXRfaGl0KTsKIAkJCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCQkJKnJwID0gcnRoOwpAQCAtMjczOCw3ICsyNzM2LDYgQEAKIHNsb3dfb3V0cHV0OgogCXJldHVybiBpcF9yb3V0ZV9vdXRwdXRfc2xvdyhuZXQsIHJwLCBmbHApOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChfX2lwX3JvdXRlX291dHB1dF9rZXkpOwogCiBzdGF0aWMgdm9pZCBpcHY0X3J0X2JsYWNraG9sZV91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpCkBAIC0yNzYyLDE1ICsyNzU5LDE1IEBACiAJCWRzdF9hbGxvYygmaXB2NF9kc3RfYmxhY2tob2xlX29wcyk7CiAKIAlpZiAocnQpIHsKLQkJc3RydWN0IGRzdF9lbnRyeSAqbmV3ID0gJnJ0LT51LmRzdDsKKwkJc3RydWN0IGRzdF9lbnRyeSAqbmV3ID0gJnJ0LT5kc3Q7CiAKIAkJYXRvbWljX3NldCgmbmV3LT5fX3JlZmNudCwgMSk7CiAJCW5ldy0+X191c2UgPSAxOwogCQluZXctPmlucHV0ID0gZHN0X2Rpc2NhcmQ7CiAJCW5ldy0+b3V0cHV0ID0gZHN0X2Rpc2NhcmQ7Ci0JCW1lbWNweShuZXctPm1ldHJpY3MsIG9ydC0+dS5kc3QubWV0cmljcywgUlRBWF9NQVgqc2l6ZW9mKHUzMikpOworCQltZW1jcHkobmV3LT5tZXRyaWNzLCBvcnQtPmRzdC5tZXRyaWNzLCBSVEFYX01BWCpzaXplb2YodTMyKSk7CiAKLQkJbmV3LT5kZXYgPSBvcnQtPnUuZHN0LmRldjsKKwkJbmV3LT5kZXYgPSBvcnQtPmRzdC5kZXY7CiAJCWlmIChuZXctPmRldikKIAkJCWRldl9ob2xkKG5ldy0+ZGV2KTsKIApAQCAtMjc5NCw3ICsyNzkxLDcgQEAKIAkJZHN0X2ZyZWUobmV3KTsKIAl9CiAKLQlkc3RfcmVsZWFzZSgmKCpycCktPnUuZHN0KTsKKwlkc3RfcmVsZWFzZSgmKCpycCktPmRzdCk7CiAJKnJwID0gcnQ7CiAJcmV0dXJuIChydCA/IDAgOiAtRU5PTUVNKTsKIH0KQEAgLTI4MjIsMTMgKzI4MTksMTMgQEAKIAogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpcF9yb3V0ZV9vdXRwdXRfZmxvdyk7CiAKIGludCBpcF9yb3V0ZV9vdXRwdXRfa2V5KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJ0YWJsZSAqKnJwLCBzdHJ1Y3QgZmxvd2kgKmZscCkKIHsKIAlyZXR1cm4gaXBfcm91dGVfb3V0cHV0X2Zsb3cobmV0LCBycCwgZmxwLCBOVUxMLCAwKTsKIH0KK0VYUE9SVF9TWU1CT0woaXBfcm91dGVfb3V0cHV0X2tleSk7CiAKIHN0YXRpYyBpbnQgcnRfZmlsbF9pbmZvKHN0cnVjdCBuZXQgKm5ldCwKIAkJCXN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwKQEAgLTI4NjQsMTEgKzI4NjEsMTEgQEAKIAkJci0+cnRtX3NyY19sZW4gPSAzMjsKIAkJTkxBX1BVVF9CRTMyKHNrYiwgUlRBX1NSQywgcnQtPmZsLmZsNF9zcmMpOwogCX0KLQlpZiAocnQtPnUuZHN0LmRldikKLQkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfT0lGLCBydC0+dS5kc3QuZGV2LT5pZmluZGV4KTsKKwlpZiAocnQtPmRzdC5kZXYpCisJCU5MQV9QVVRfVTMyKHNrYiwgUlRBX09JRiwgcnQtPmRzdC5kZXYtPmlmaW5kZXgpOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCi0JaWYgKHJ0LT51LmRzdC50Y2xhc3NpZCkKLQkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfRkxPVywgcnQtPnUuZHN0LnRjbGFzc2lkKTsKKwlpZiAocnQtPmRzdC50Y2xhc3NpZCkKKwkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfRkxPVywgcnQtPmRzdC50Y2xhc3NpZCk7CiAjZW5kaWYKIAlpZiAocnQtPmZsLmlpZikKIAkJTkxBX1BVVF9CRTMyKHNrYiwgUlRBX1BSRUZTUkMsIHJ0LT5ydF9zcGVjX2RzdCk7CkBAIC0yODc4LDEyICsyODc1LDE2IEBACiAJaWYgKHJ0LT5ydF9kc3QgIT0gcnQtPnJ0X2dhdGV3YXkpCiAJCU5MQV9QVVRfQkUzMihza2IsIFJUQV9HQVRFV0FZLCBydC0+cnRfZ2F0ZXdheSk7CiAKLQlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPnUuZHN0Lm1ldHJpY3MpIDwgMCkKKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPmRzdC5tZXRyaWNzKSA8IDApCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JZXJyb3IgPSBydC0+dS5kc3QuZXJyb3I7Ci0JZXhwaXJlcyA9IHJ0LT51LmRzdC5leHBpcmVzID8gcnQtPnUuZHN0LmV4cGlyZXMgLSBqaWZmaWVzIDogMDsKKwlpZiAocnQtPmZsLm1hcmspCisJCU5MQV9QVVRfQkUzMihza2IsIFJUQV9NQVJLLCBydC0+ZmwubWFyayk7CisKKwllcnJvciA9IHJ0LT5kc3QuZXJyb3I7CisJZXhwaXJlcyA9IHJ0LT5kc3QuZXhwaXJlcyA/IHJ0LT5kc3QuZXhwaXJlcyAtIGppZmZpZXMgOiAwOwogCWlmIChydC0+cGVlcikgeworCQlpbmV0X3BlZXJfcmVmY2hlY2socnQtPnBlZXIpOwogCQlpZCA9IGF0b21pY19yZWFkKCZydC0+cGVlci0+aXBfaWRfY291bnQpICYgMHhmZmZmOwogCQlpZiAocnQtPnBlZXItPnRjcF90c19zdGFtcCkgewogCQkJdHMgPSBydC0+cGVlci0+dGNwX3RzOwpAQCAtMjkxNCw3ICsyOTE1LDcgQEAKIAkJCU5MQV9QVVRfVTMyKHNrYiwgUlRBX0lJRiwgcnQtPmZsLmlpZik7CiAJfQogCi0JaWYgKHJ0bmxfcHV0X2NhY2hlaW5mbyhza2IsICZydC0+dS5kc3QsIGlkLCB0cywgdHNhZ2UsCisJaWYgKHJ0bmxfcHV0X2NhY2hlaW5mbyhza2IsICZydC0+ZHN0LCBpZCwgdHMsIHRzYWdlLAogCQkJICAgICAgIGV4cGlyZXMsIGVycm9yKSA8IDApCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCkBAIC0yOTM1LDYgKzI5MzYsNyBAQAogCV9fYmUzMiBzcmMgPSAwOwogCXUzMiBpaWY7CiAJaW50IGVycjsKKwlpbnQgbWFyazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBzaXplb2YoKnJ0bSksIHRiLCBSVEFfTUFYLCBydG1faXB2NF9wb2xpY3kpOwpAQCAtMjk2Miw2ICsyOTY0LDcgQEAKIAlzcmMgPSB0YltSVEFfU1JDXSA/IG5sYV9nZXRfYmUzMih0YltSVEFfU1JDXSkgOiAwOwogCWRzdCA9IHRiW1JUQV9EU1RdID8gbmxhX2dldF9iZTMyKHRiW1JUQV9EU1RdKSA6IDA7CiAJaWlmID0gdGJbUlRBX0lJRl0gPyBubGFfZ2V0X3UzMih0YltSVEFfSUlGXSkgOiAwOworCW1hcmsgPSB0YltSVEFfTUFSS10gPyBubGFfZ2V0X3UzMih0YltSVEFfTUFSS10pIDogMDsKIAogCWlmIChpaWYpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTI5NzQsMTMgKzI5NzcsMTQgQEAKIAogCQlza2ItPnByb3RvY29sCT0gaHRvbnMoRVRIX1BfSVApOwogCQlza2ItPmRldgk9IGRldjsKKwkJc2tiLT5tYXJrCT0gbWFyazsKIAkJbG9jYWxfYmhfZGlzYWJsZSgpOwogCQllcnIgPSBpcF9yb3V0ZV9pbnB1dChza2IsIGRzdCwgc3JjLCBydG0tPnJ0bV90b3MsIGRldik7CiAJCWxvY2FsX2JoX2VuYWJsZSgpOwogCiAJCXJ0ID0gc2tiX3J0YWJsZShza2IpOwotCQlpZiAoZXJyID09IDAgJiYgcnQtPnUuZHN0LmVycm9yKQotCQkJZXJyID0gLXJ0LT51LmRzdC5lcnJvcjsKKwkJaWYgKGVyciA9PSAwICYmIHJ0LT5kc3QuZXJyb3IpCisJCQllcnIgPSAtcnQtPmRzdC5lcnJvcjsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7CiAJCQkubmxfdSA9IHsKQEAgLTI5OTEsNiArMjk5NSw3IEBACiAJCQkJfSwKIAkJCX0sCiAJCQkub2lmID0gdGJbUlRBX09JRl0gPyBubGFfZ2V0X3UzMih0YltSVEFfT0lGXSkgOiAwLAorCQkJLm1hcmsgPSBtYXJrLAogCQl9OwogCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJnJ0LCAmZmwpOwogCX0KQEAgLTI5OTgsNyArMzAwMyw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJvdXRfZnJlZTsKIAotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAJaWYgKHJ0bS0+cnRtX2ZsYWdzICYgUlRNX0ZfTk9USUZZKQogCQlydC0+cnRfZmxhZ3MgfD0gUlRDRl9OT1RJRlk7CiAKQEAgLTMwMzQsMTIgKzMwMzksMTIgQEAKIAkJCWNvbnRpbnVlOwogCQlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJCWZvciAocnQgPSByY3VfZGVyZWZlcmVuY2VfYmgocnRfaGFzaF90YWJsZVtoXS5jaGFpbiksIGlkeCA9IDA7IHJ0OwotCQkgICAgIHJ0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHJ0LT51LmRzdC5ydF9uZXh0KSwgaWR4KyspIHsKLQkJCWlmICghbmV0X2VxKGRldl9uZXQocnQtPnUuZHN0LmRldiksIG5ldCkgfHwgaWR4IDwgc19pZHgpCisJCSAgICAgcnQgPSByY3VfZGVyZWZlcmVuY2VfYmgocnQtPmRzdC5ydF9uZXh0KSwgaWR4KyspIHsKKwkJCWlmICghbmV0X2VxKGRldl9uZXQocnQtPmRzdC5kZXYpLCBuZXQpIHx8IGlkeCA8IHNfaWR4KQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHJ0X2lzX2V4cGlyZWQocnQpKQogCQkJCWNvbnRpbnVlOwotCQkJc2tiX2RzdF9zZXRfbm9yZWYoc2tiLCAmcnQtPnUuZHN0KTsKKwkJCXNrYl9kc3Rfc2V0X25vcmVmKHNrYiwgJnJ0LT5kc3QpOwogCQkJaWYgKHJ0X2ZpbGxfaW5mbyhuZXQsIHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdST1VURSwKIAkJCQkJIDEsIE5MTV9GX01VTFRJKSA8PSAwKSB7CkBAIC0zMzY1LDYgKzMzNzAsMyBAQAogCXJlZ2lzdGVyX3N5c2N0bF9wYXRocyhpcHY0X3BhdGgsIGlwdjRfc2tlbGV0b24pOwogfQogI2VuZGlmCi0KLUVYUE9SVF9TWU1CT0woX19pcF9zZWxlY3RfaWRlbnQpOwotRVhQT1JUX1NZTUJPTChpcF9yb3V0ZV9vdXRwdXRfa2V5KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwppbmRleCA5ZjZiMjIyLi42NTBjYWNlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeW5jb29raWVzLmMKKysrIGIvbmV0L2lwdjQvc3luY29va2llcy5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogCi0vKiBUaW1lc3RhbXBzOiBsb3dlc3QgOSBiaXRzIHN0b3JlIFRDUCBvcHRpb25zICovCi0jZGVmaW5lIFRTQklUUyA5CisvKiBUaW1lc3RhbXBzOiBsb3dlc3QgYml0cyBzdG9yZSBUQ1Agb3B0aW9ucyAqLworI2RlZmluZSBUU0JJVFMgNgogI2RlZmluZSBUU01BU0sgKCgoX191MzIpMSA8PCBUU0JJVFMpIC0gMSkKIAogZXh0ZXJuIGludCBzeXNjdGxfdGNwX3N5bmNvb2tpZXM7CkBAIC01OCw3ICs1OCw3IEBACiAKIC8qCiAgKiB3aGVuIHN5bmNvb2tpZXMgYXJlIGluIGVmZmVjdCBhbmQgdGNwIHRpbWVzdGFtcHMgYXJlIGVuYWJsZWQgd2UgZW5jb2RlCi0gKiB0Y3Agb3B0aW9ucyBpbiB0aGUgbG93ZXN0IDkgYml0cyBvZiB0aGUgdGltZXN0YW1wIHZhbHVlIHRoYXQgd2lsbCBiZQorICogdGNwIG9wdGlvbnMgaW4gdGhlIGxvd2VyIGJpdHMgb2YgdGhlIHRpbWVzdGFtcCB2YWx1ZSB0aGF0IHdpbGwgYmUKICAqIHNlbnQgaW4gdGhlIHN5bi1hY2suCiAgKiBTaW5jZSBzdWJzZXF1ZW50IHRpbWVzdGFtcHMgdXNlIHRoZSBub3JtYWwgdGNwX3RpbWVfc3RhbXAgdmFsdWUsIHdlCiAgKiBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRpbmcgaW5pdGlhbCB0aW1lc3RhbXAgaXMgPD0gdGNwX3RpbWVfc3RhbXAuCkBAIC03MCwxMSArNzAsMTAgQEAKIAl1MzIgb3B0aW9ucyA9IDA7CiAKIAlpcmVxID0gaW5ldF9yc2socmVxKTsKLQlpZiAoaXJlcS0+d3NjYWxlX29rKSB7Ci0JCW9wdGlvbnMgPSBpcmVxLT5zbmRfd3NjYWxlOwotCQlvcHRpb25zIHw9IGlyZXEtPnJjdl93c2NhbGUgPDwgNDsKLQl9Ci0Jb3B0aW9ucyB8PSBpcmVxLT5zYWNrX29rIDw8IDg7CisKKwlvcHRpb25zID0gaXJlcS0+d3NjYWxlX29rID8gaXJlcS0+c25kX3dzY2FsZSA6IDB4ZjsKKwlvcHRpb25zIHw9IGlyZXEtPnNhY2tfb2sgPDwgNDsKKwlvcHRpb25zIHw9IGlyZXEtPmVjbl9vayA8PCA1OwogCiAJdHMgPSB0c19ub3cgJiB+VFNNQVNLOwogCXRzIHw9IG9wdGlvbnM7CkBAIC0xMzgsMjMgKzEzNywyMyBAQAogfQogCiAvKgotICogVGhpcyB0YWJsZSBoYXMgdG8gYmUgc29ydGVkIGFuZCB0ZXJtaW5hdGVkIHdpdGggKF9fdTE2KS0xLgotICogWFhYIGdlbmVyYXRlIGEgYmV0dGVyIHRhYmxlLgotICogVW5yZXNvbHZlZCBJc3N1ZXM6IEhJUFBJIHdpdGggYSA2NGsgTVNTIGlzIG5vdCB3ZWxsIHN1cHBvcnRlZC4KKyAqIE1TUyBWYWx1ZXMgYXJlIHRha2VuIGZyb20gdGhlIDIwMDkgcGFwZXIKKyAqICdNZWFzdXJpbmcgVENQIE1heGltdW0gU2VnbWVudCBTaXplJyBieSBTLiBBbGNvY2sgYW5kIFIuIE5lbHNvbjoKKyAqICAtIHZhbHVlcyAxNDQwIHRvIDE0NjAgYWNjb3VudGVkIGZvciA4MCUgb2Ygb2JzZXJ2ZWQgbXNzIHZhbHVlcworICogIC0gdmFsdWVzIG91dHNpZGUgdGhlIDUzNi0xNDYwIHJhbmdlIGFyZSByYXJlICg8MC4yJSkuCisgKgorICogVGFibGUgbXVzdCBiZSBzb3J0ZWQuCiAgKi8KIHN0YXRpYyBfX3UxNiBjb25zdCBtc3N0YWJbXSA9IHsKLQk2NCAtIDEsCi0JMjU2IC0gMSwKLQk1MTIgLSAxLAotCTUzNiAtIDEsCi0JMTAyNCAtIDEsCi0JMTQ0MCAtIDEsCi0JMTQ2MCAtIDEsCi0JNDMxMiAtIDEsCi0JKF9fdTE2KS0xCisJNjQsCisJNTEyLAorCTUzNiwKKwkxMDI0LAorCTE0NDAsCisJMTQ2MCwKKwk0MzEyLAorCTg5NjAsCiB9OwotLyogVGhlIG51bWJlciBkb2Vzbid0IGluY2x1ZGUgdGhlIC0xIHRlcm1pbmF0b3IgKi8KLSNkZWZpbmUgTlVNX01TUyAoQVJSQVlfU0laRShtc3N0YWIpIC0gMSkKIAogLyoKICAqIEdlbmVyYXRlIGEgc3luY29va2llLiAgbXNzcCBwb2ludHMgdG8gdGhlIG1zcywgd2hpY2ggaXMgcmV0dXJuZWQKQEAgLTE2OSwxMCArMTY4LDEwIEBACiAKIAl0Y3Bfc3lucV9vdmVyZmxvdyhzayk7CiAKLQkvKiBYWFggc29ydCBtc3N0YWJbXSBieSBwcm9iYWJpbGl0eT8gIEJpbmFyeSBzZWFyY2g/ICovCi0JZm9yIChtc3NpbmQgPSAwOyBtc3MgPiBtc3N0YWJbbXNzaW5kICsgMV07IG1zc2luZCsrKQotCQk7Ci0JKm1zc3AgPSBtc3N0YWJbbXNzaW5kXSArIDE7CisJZm9yIChtc3NpbmQgPSBBUlJBWV9TSVpFKG1zc3RhYikgLSAxOyBtc3NpbmQgOyBtc3NpbmQtLSkKKwkJaWYgKG1zcyA+PSBtc3N0YWJbbXNzaW5kXSkKKwkJCWJyZWFrOworCSptc3NwID0gbXNzdGFiW21zc2luZF07CiAKIAlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1NZTkNPT0tJRVNTRU5UKTsKIApAQCAtMjAyLDcgKzIwMSw3IEBACiAJCQkJCSAgICBqaWZmaWVzIC8gKEhaICogNjApLAogCQkJCQkgICAgQ09VTlRFUl9UUklFUyk7CiAKLQlyZXR1cm4gbXNzaW5kIDwgTlVNX01TUyA/IG1zc3RhYlttc3NpbmRdICsgMSA6IDA7CisJcmV0dXJuIG1zc2luZCA8IEFSUkFZX1NJWkUobXNzdGFiKSA/IG1zc3RhYlttc3NpbmRdIDogMDsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqZ2V0X2Nvb2tpZV9zb2NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTIyNywyNiArMjI2LDM4IEBACiAgKiBhZGRpdGlvbmFsIHRjcCBvcHRpb25zIGluIHRoZSB0aW1lc3RhbXAuCiAgKiBUaGlzIGV4dHJhY3RzIHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUgdGltZXN0YW1wIGVjaG8uCiAgKgotICogVGhlIGxvd2VzdCA0IGJpdHMgYXJlIGZvciBzbmRfd3NjYWxlCi0gKiBUaGUgbmV4dCA0IGxzYiBhcmUgZm9yIHJjdl93c2NhbGUKLSAqIFRoZSBuZXh0IGxzYiBpcyBmb3Igc2Fja19vaworICogVGhlIGxvd2VzdCA0IGJpdHMgc3RvcmUgc25kX3dzY2FsZS4KKyAqIG5leHQgMiBiaXRzIGluZGljYXRlIFNBQ0sgYW5kIEVDTiBzdXBwb3J0LgorICoKKyAqIHJldHVybiBmYWxzZSBpZiB3ZSBkZWNvZGUgYW4gb3B0aW9uIHRoYXQgc2hvdWxkIG5vdCBiZS4KICAqLwotdm9pZCBjb29raWVfY2hlY2tfdGltZXN0YW1wKHN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqdGNwX29wdCkKK2Jvb2wgY29va2llX2NoZWNrX3RpbWVzdGFtcChzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgKnRjcF9vcHQsIGJvb2wgKmVjbl9vaykKIHsKLQkvKiBlY2hvZWQgdGltZXN0YW1wLCA5IGxvd2VzdCBiaXRzIGNvbnRhaW4gb3B0aW9ucyAqLworCS8qIGVjaG9lZCB0aW1lc3RhbXAsIGxvd2VzdCBiaXRzIGNvbnRhaW4gb3B0aW9ucyAqLwogCXUzMiBvcHRpb25zID0gdGNwX29wdC0+cmN2X3RzZWNyICYgVFNNQVNLOwogCi0JdGNwX29wdC0+c25kX3dzY2FsZSA9IG9wdGlvbnMgJiAweGY7Ci0Jb3B0aW9ucyA+Pj0gNDsKLQl0Y3Bfb3B0LT5yY3Zfd3NjYWxlID0gb3B0aW9ucyAmIDB4ZjsKKwlpZiAoIXRjcF9vcHQtPnNhd190c3RhbXApICB7CisJCXRjcF9jbGVhcl9vcHRpb25zKHRjcF9vcHQpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpZiAoIXN5c2N0bF90Y3BfdGltZXN0YW1wcykKKwkJcmV0dXJuIGZhbHNlOwogCiAJdGNwX29wdC0+c2Fja19vayA9IChvcHRpb25zID4+IDQpICYgMHgxOworCSplY25fb2sgPSAob3B0aW9ucyA+PiA1KSAmIDE7CisJaWYgKCplY25fb2sgJiYgIXN5c2N0bF90Y3BfZWNuKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAodGNwX29wdC0+c2Fja19vaykKLQkJdGNwX3NhY2tfcmVzZXQodGNwX29wdCk7CisJaWYgKHRjcF9vcHQtPnNhY2tfb2sgJiYgIXN5c2N0bF90Y3Bfc2FjaykKKwkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKHRjcF9vcHQtPnNuZF93c2NhbGUgfHwgdGNwX29wdC0+cmN2X3dzY2FsZSkKLQkJdGNwX29wdC0+d3NjYWxlX29rID0gMTsKKwlpZiAoKG9wdGlvbnMgJiAweGYpID09IDB4ZikKKwkJcmV0dXJuIHRydWU7IC8qIG5vIHdpbmRvdyBzY2FsaW5nICovCisKKwl0Y3Bfb3B0LT53c2NhbGVfb2sgPSAxOworCXRjcF9vcHQtPnNuZF93c2NhbGUgPSBvcHRpb25zICYgMHhmOworCXJldHVybiBzeXNjdGxfdGNwX3dpbmRvd19zY2FsaW5nICE9IDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNvb2tpZV9jaGVja190aW1lc3RhbXApOwogCkBAIC0yNjUsOCArMjc2LDkgQEAKIAlpbnQgbXNzOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCV9fdTggcmN2X3dzY2FsZTsKKwlib29sIGVjbl9vazsKIAotCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICF0aC0+YWNrKQorCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICF0aC0+YWNrIHx8IHRoLT5yc3QpCiAJCWdvdG8gb3V0OwogCiAJaWYgKHRjcF9zeW5xX25vX3JlY2VudF9vdmVyZmxvdyhzaykgfHwKQEAgLTI4MSw4ICsyOTMsOCBAQAogCW1lbXNldCgmdGNwX29wdCwgMCwgc2l6ZW9mKHRjcF9vcHQpKTsKIAl0Y3BfcGFyc2Vfb3B0aW9ucyhza2IsICZ0Y3Bfb3B0LCAmaGFzaF9sb2NhdGlvbiwgMCk7CiAKLQlpZiAodGNwX29wdC5zYXdfdHN0YW1wKQotCQljb29raWVfY2hlY2tfdGltZXN0YW1wKCZ0Y3Bfb3B0KTsKKwlpZiAoIWNvb2tpZV9jaGVja190aW1lc3RhbXAoJnRjcF9vcHQsICZlY25fb2spKQorCQlnb3RvIG91dDsKIAogCXJldCA9IE5VTEw7CiAJcmVxID0gaW5ldF9yZXFza19hbGxvYygmdGNwX3JlcXVlc3Rfc29ja19vcHMpOyAvKiBmb3Igc2FmZXR5ICovCkBAIC0yOTgsOSArMzEwLDggQEAKIAlpcmVxLT5ybXRfcG9ydAkJPSB0aC0+c291cmNlOwogCWlyZXEtPmxvY19hZGRyCQk9IGlwX2hkcihza2IpLT5kYWRkcjsKIAlpcmVxLT5ybXRfYWRkcgkJPSBpcF9oZHIoc2tiKS0+c2FkZHI7Ci0JaXJlcS0+ZWNuX29rCQk9IDA7CisJaXJlcS0+ZWNuX29rCQk9IGVjbl9vazsKIAlpcmVxLT5zbmRfd3NjYWxlCT0gdGNwX29wdC5zbmRfd3NjYWxlOwotCWlyZXEtPnJjdl93c2NhbGUJPSB0Y3Bfb3B0LnJjdl93c2NhbGU7CiAJaXJlcS0+c2Fja19vawkJPSB0Y3Bfb3B0LnNhY2tfb2s7CiAJaXJlcS0+d3NjYWxlX29rCQk9IHRjcF9vcHQud3NjYWxlX29rOwogCWlyZXEtPnRzdGFtcF9vawkJPSB0Y3Bfb3B0LnNhd190c3RhbXA7CkBAIC0zNTQsMTUgKzM2NSwxNSBAQAogCX0KIAogCS8qIFRyeSB0byByZWRvIHdoYXQgdGNwX3Y0X3NlbmRfc3luYWNrIGRpZC4gKi8KLQlyZXEtPndpbmRvd19jbGFtcCA9IHRwLT53aW5kb3dfY2xhbXAgPyA6ZHN0X21ldHJpYygmcnQtPnUuZHN0LCBSVEFYX1dJTkRPVyk7CisJcmVxLT53aW5kb3dfY2xhbXAgPSB0cC0+d2luZG93X2NsYW1wID8gOmRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfV0lORE9XKTsKIAogCXRjcF9zZWxlY3RfaW5pdGlhbF93aW5kb3codGNwX2Z1bGxfc3BhY2Uoc2spLCByZXEtPm1zcywKIAkJCQkgICZyZXEtPnJjdl93bmQsICZyZXEtPndpbmRvd19jbGFtcCwKIAkJCQkgIGlyZXEtPndzY2FsZV9vaywgJnJjdl93c2NhbGUsCi0JCQkJICBkc3RfbWV0cmljKCZydC0+dS5kc3QsIFJUQVhfSU5JVFJXTkQpKTsKKwkJCQkgIGRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfSU5JVFJXTkQpKTsKIAogCWlyZXEtPnJjdl93c2NhbGUgID0gcmN2X3dzY2FsZTsKIAotCXJldCA9IGdldF9jb29raWVfc29jayhzaywgc2tiLCByZXEsICZydC0+dS5kc3QpOworCXJldCA9IGdldF9jb29raWVfc29jayhzaywgc2tiLCByZXEsICZydC0+ZHN0KTsKIG91dDoJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggNjVhZmVhZS4uMTc2ZTExYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTMxNSw3ICszMTUsNiBAQAogICogaXMgc3RyaWN0LCBhY3Rpb25zIGFyZSBhZHZpc29yeSBhbmQgaGF2ZSBzb21lIGxhdGVuY3kuCiAgKi8KIGludCB0Y3BfbWVtb3J5X3ByZXNzdXJlIF9fcmVhZF9tb3N0bHk7Ci0KIEVYUE9SVF9TWU1CT0wodGNwX21lbW9yeV9wcmVzc3VyZSk7CiAKIHZvaWQgdGNwX2VudGVyX21lbW9yeV9wcmVzc3VyZShzdHJ1Y3Qgc29jayAqc2spCkBAIC0zMjUsNyArMzI0LDYgQEAKIAkJdGNwX21lbW9yeV9wcmVzc3VyZSA9IDE7CiAJfQogfQotCiBFWFBPUlRfU1lNQk9MKHRjcF9lbnRlcl9tZW1vcnlfcHJlc3N1cmUpOwogCiAvKiBDb252ZXJ0IHNlY29uZHMgdG8gcmV0cmFuc21pdHMgYmFzZWQgb24gaW5pdGlhbCBhbmQgbWF4IHRpbWVvdXQgKi8KQEAgLTQ2MCw2ICs0NTgsNyBAQAogCX0KIAlyZXR1cm4gbWFzazsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3BvbGwpOwogCiBpbnQgdGNwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC01MDgsMTAgKzUwNywxMSBAQAogCiAJcmV0dXJuIHB1dF91c2VyKGFuc3csIChpbnQgX191c2VyICopYXJnKTsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX2lvY3RsKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9tYXJrX3B1c2goc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUENCX0ZMQUdfUFNIOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQSERSX1BTSDsKIAl0cC0+cHVzaGVkX3NlcSA9IHRwLT53cml0ZV9zZXE7CiB9CiAKQEAgLTUyNyw3ICs1MjcsNyBAQAogCiAJc2tiLT5jc3VtICAgID0gMDsKIAl0Y2ItPnNlcSAgICAgPSB0Y2ItPmVuZF9zZXEgPSB0cC0+d3JpdGVfc2VxOwotCXRjYi0+ZmxhZ3MgICA9IFRDUENCX0ZMQUdfQUNLOworCXRjYi0+ZmxhZ3MgICA9IFRDUEhEUl9BQ0s7CiAJdGNiLT5zYWNrZWQgID0gMDsKIAlza2JfaGVhZGVyX3JlbGVhc2Uoc2tiKTsKIAl0Y3BfYWRkX3dyaXRlX3F1ZXVlX3RhaWwoc2ssIHNrYik7CkBAIC02NzYsNiArNjc2LDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9zcGxpY2VfcmVhZCk7CiAKIHN0cnVjdCBza19idWZmICpza19zdHJlYW1fYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGdmcF90IGdmcCkKIHsKQEAgLTgxNiw3ICs4MTcsNyBAQAogCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMDsKIAogCQlpZiAoIWNvcGllZCkKLQkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJj0gflRDUENCX0ZMQUdfUFNIOworCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyAmPSB+VENQSERSX1BTSDsKIAogCQljb3BpZWQgKz0gY29weTsKIAkJcG9mZnNldCArPSBjb3B5OwpAQCAtODU3LDE1ICs4NTgsMTUgQEAKIAlyZXR1cm4gc2tfc3RyZWFtX2Vycm9yKHNrLCBmbGFncywgZXJyKTsKIH0KIAotc3NpemVfdCB0Y3Bfc2VuZHBhZ2Uoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsCi0JCSAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK2ludCB0Y3Bfc2VuZHBhZ2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKKwkJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3NpemVfdCByZXM7Ci0Jc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAKIAlpZiAoIShzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfU0cpIHx8CiAJICAgICEoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX0FMTF9DU1VNKSkKLQkJcmV0dXJuIHNvY2tfbm9fc2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CisJCXJldHVybiBzb2NrX25vX3NlbmRwYWdlKHNrLT5za19zb2NrZXQsIHBhZ2UsIG9mZnNldCwgc2l6ZSwKKwkJCQkJZmxhZ3MpOwogCiAJbG9ja19zb2NrKHNrKTsKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwpAQCAtODc0LDYgKzg3NSw3IEBACiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gcmVzOwogfQorRVhQT1JUX1NZTUJPTCh0Y3Bfc2VuZHBhZ2UpOwogCiAjZGVmaW5lIFRDUF9QQUdFKHNrKQkoc2stPnNrX3NuZG1zZ19wYWdlKQogI2RlZmluZSBUQ1BfT0ZGKHNrKQkoc2stPnNrX3NuZG1zZ19vZmYpCkBAIC04OTgsMTAgKzkwMCw5IEBACiAJcmV0dXJuIHRtcDsKIH0KIAotaW50IHRjcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAoraW50IHRjcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCXNpemVfdCBzaXplKQogewotCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpb3ZlYyAqaW92OwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMDYyLDcgKzEwNjMsNyBAQAogCQkJfQogCiAJCQlpZiAoIWNvcGllZCkKLQkJCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICY9IH5UQ1BDQl9GTEFHX1BTSDsKKwkJCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICY9IH5UQ1BIRFJfUFNIOwogCiAJCQl0cC0+d3JpdGVfc2VxICs9IGNvcHk7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgKz0gY29weTsKQEAgLTExMjIsNiArMTEyMyw3IEBACiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTCh0Y3Bfc2VuZG1zZyk7CiAKIC8qCiAgKglIYW5kbGUgcmVhZGluZyB1cmdlbnQgZGF0YS4gQlNEIGhhcyB2ZXJ5IHNpbXBsZSBzZW1hbnRpY3MgZm9yCkBAIC0xMzgxLDYgKzEzODMsNyBAQAogCQl0Y3BfY2xlYW51cF9yYnVmKHNrLCBjb3BpZWQpOwogCXJldHVybiBjb3BpZWQ7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9yZWFkX3NvY2spOwogCiAvKgogICoJVGhpcyByb3V0aW5lIGNvcGllcyBmcm9tIGEgc29jayBzdHJ1Y3QgaW50byB0aGUgdXNlciBidWZmZXIuCkBAIC0xNzc1LDYgKzE3NzgsNyBAQAogCWVyciA9IHRjcF9yZWN2X3VyZyhzaywgbXNnLCBsZW4sIGZsYWdzKTsKIAlnb3RvIG91dDsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3JlY3Ztc2cpOwogCiB2b2lkIHRjcF9zZXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3RhdGUpCiB7CkBAIC0xODY3LDYgKzE4NzEsNyBAQAogCQkJdGNwX3NlbmRfZmluKHNrKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9zaHV0ZG93bik7CiAKIHZvaWQgdGNwX2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KQogewpAQCAtMTg5OSw2ICsxOTA0LDEwIEBACiAKIAlza19tZW1fcmVjbGFpbShzayk7CiAKKwkvKiBJZiBzb2NrZXQgaGFzIGJlZW4gYWxyZWFkeSByZXNldCAoZS5nLiBpbiB0Y3BfcmVzZXQoKSkgLSBraWxsIGl0LiAqLworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKQorCQlnb3RvIGFkanVkZ2VfdG9fZGVhdGg7CisKIAkvKiBBcyBvdXRsaW5lZCBpbiBSRkMgMjUyNSwgc2VjdGlvbiAyLjE3LCB3ZSBzZW5kIGEgUlNUIGhlcmUgYmVjYXVzZQogCSAqIGRhdGEgd2FzIGxvc3QuIFRvIHdpdG5lc3MgdGhlIGF3ZnVsIGVmZmVjdHMgb2YgdGhlIG9sZCBiZWhhdmlvciBvZgogCSAqIGFsd2F5cyBkb2luZyBhIEZJTiwgcnVuIGFuIG9sZGVyIDIuMS54IGtlcm5lbCBvciAyLjAueCwgc3RhcnQgYSBidWxrCkBAIC0yMDI2LDYgKzIwMzUsNyBAQAogCWxvY2FsX2JoX2VuYWJsZSgpOwogCXNvY2tfcHV0KHNrKTsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX2Nsb3NlKTsKIAogLyogVGhlc2Ugc3RhdGVzIG5lZWQgUlNUIG9uIEFCT1JUIGFjY29yZGluZyB0byBSRkM3OTMgKi8KIApAQCAtMjA5OSw2ICsyMTA5LDcgQEAKIAlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfZGlzY29ubmVjdCk7CiAKIC8qCiAgKglTb2NrZXQgb3B0aW9uIGNvZGUgZm9yIFRDUC4KQEAgLTIxNzYsNiArMjE4Nyw4IEBACiAJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoY3ZwID09IE5VTEwpCiAJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWtyZWZfaW5pdCgmY3ZwLT5rcmVmKTsKIAkJfQogCQlsb2NrX3NvY2soc2spOwogCQl0cC0+cnhfb3B0LmNvb2tpZV9pbl9hbHdheXMgPQpAQCAtMjE5MCwxMiArMjIwMywxMSBAQAogCQkJCSAqLwogCQkJCWtyZWZfcHV0KCZ0cC0+Y29va2llX3ZhbHVlcy0+a3JlZiwKIAkJCQkJIHRjcF9jb29raWVfdmFsdWVzX3JlbGVhc2UpOwotCQkJCWtyZWZfaW5pdCgmY3ZwLT5rcmVmKTsKLQkJCQl0cC0+Y29va2llX3ZhbHVlcyA9IGN2cDsKIAkJCX0gZWxzZSB7CiAJCQkJY3ZwID0gdHAtPmNvb2tpZV92YWx1ZXM7CiAJCQl9CiAJCX0KKwogCQlpZiAoY3ZwICE9IE5VTEwpIHsKIAkJCWN2cC0+Y29va2llX2Rlc2lyZWQgPSBjdGQudGNwY3RfY29va2llX2Rlc2lyZWQ7CiAKQEAgLTIyMDksNiArMjIyMSw4IEBACiAJCQkJY3ZwLT5zX2RhdGFfZGVzaXJlZCA9IGN0ZC50Y3BjdF9zX2RhdGFfZGVzaXJlZDsKIAkJCQljdnAtPnNfZGF0YV9jb25zdGFudCA9IDA7IC8qIGZhbHNlICovCiAJCQl9CisKKwkJCXRwLT5jb29raWVfdmFsdWVzID0gY3ZwOwogCQl9CiAJCXJlbGVhc2Vfc29jayhzayk7CiAJCXJldHVybiBlcnI7CkBAIC0yMzk3LDYgKzI0MTEsNyBAQAogCQkJCQkJICAgICBvcHR2YWwsIG9wdGxlbik7CiAJcmV0dXJuIGRvX3RjcF9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQorRVhQT1JUX1NZTUJPTCh0Y3Bfc2V0c29ja29wdCk7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBpbnQgY29tcGF0X3RjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKQEAgLTI0MDcsNyArMjQyMiw2IEBACiAJCQkJCQkgIG9wdHZhbCwgb3B0bGVuKTsKIAlyZXR1cm4gZG9fdGNwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0woY29tcGF0X3RjcF9zZXRzb2Nrb3B0KTsKICNlbmRpZgogCkBAIC0yNDczLDcgKzI0ODcsNiBAQAogCiAJaW5mby0+dGNwaV90b3RhbF9yZXRyYW5zID0gdHAtPnRvdGFsX3JldHJhbnM7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHRjcF9nZXRfaW5mbyk7CiAKIHN0YXRpYyBpbnQgZG9fdGNwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsCkBAIC0yNTkxLDYgKzI2MDQsMTIgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAl9CisJY2FzZSBUQ1BfVEhJTl9MSU5FQVJfVElNRU9VVFM6CisJCXZhbCA9IHRwLT50aGluX2x0bzsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfVEhJTl9EVVBBQ0s6CisJCXZhbCA9IHRwLT50aGluX2R1cGFjazsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CkBAIC0yNjEyLDYgKzI2MzEsNyBAQAogCQkJCQkJICAgICBvcHR2YWwsIG9wdGxlbik7CiAJcmV0dXJuIGRvX3RjcF9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfZ2V0c29ja29wdCk7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBpbnQgY29tcGF0X3RjcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKQEAgLTI2MjIsNyArMjY0Miw2IEBACiAJCQkJCQkgIG9wdHZhbCwgb3B0bGVuKTsKIAlyZXR1cm4gZG9fdGNwX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0woY29tcGF0X3RjcF9nZXRzb2Nrb3B0KTsKICNlbmRpZgogCkBAIC0yODU5LDcgKzI4NzgsNiBAQAogCWlmIChwb29sKQogCQlfX3RjcF9mcmVlX21kNXNpZ19wb29sKHBvb2wpOwogfQotCiBFWFBPUlRfU1lNQk9MKHRjcF9mcmVlX21kNXNpZ19wb29sKTsKIAogc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKiBfX3BlcmNwdSAqCkBAIC0yOTM1LDcgKzI5NTMsNiBAQAogCX0KIAlyZXR1cm4gcG9vbDsKIH0KLQogRVhQT1JUX1NZTUJPTCh0Y3BfYWxsb2NfbWQ1c2lnX3Bvb2wpOwogCiAKQEAgLTI5NTksNyArMjk3Niw3IEBACiAJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKIAogCWlmIChwKQotCQlyZXR1cm4gKnBlcl9jcHVfcHRyKHAsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCXJldHVybiAqdGhpc19jcHVfcHRyKHApOwogCiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAJcmV0dXJuIE5VTEw7CkBAIC0yOTg3LDcgKzMwMDQsNiBAQAogCXRoLT5jaGVjayA9IG9sZF9jaGVja3N1bTsKIAlyZXR1cm4gZXJyOwogfQotCiBFWFBPUlRfU1lNQk9MKHRjcF9tZDVfaGFzaF9oZWFkZXIpOwogCiBpbnQgdGNwX21kNV9oYXNoX3NrYl9kYXRhKHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKmhwLApAQCAtMzAwMCw2ICszMDE2LDcgQEAKIAljb25zdCB1bnNpZ25lZCBoZWFkX2RhdGFfbGVuID0gc2tiX2hlYWRsZW4oc2tiKSA+IGhlYWRlcl9sZW4gPwogCQkJCSAgICAgICBza2JfaGVhZGxlbihza2IpIC0gaGVhZGVyX2xlbiA6IDA7CiAJY29uc3Qgc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc2hpID0gc2tiX3NoaW5mbyhza2IpOworCXN0cnVjdCBza19idWZmICpmcmFnX2l0ZXI7CiAKIAlzZ19pbml0X3RhYmxlKCZzZywgMSk7CiAKQEAgLTMwMTQsOSArMzAzMSwxMiBAQAogCQkJcmV0dXJuIDE7CiAJfQogCisJc2tiX3dhbGtfZnJhZ3Moc2tiLCBmcmFnX2l0ZXIpCisJCWlmICh0Y3BfbWQ1X2hhc2hfc2tiX2RhdGEoaHAsIGZyYWdfaXRlciwgMCkpCisJCQlyZXR1cm4gMTsKKwogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKHRjcF9tZDVfaGFzaF9za2JfZGF0YSk7CiAKIGludCB0Y3BfbWQ1X2hhc2hfa2V5KHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKmhwLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSkKQEAgLTMwMjYsNyArMzA0Niw2IEBACiAJc2dfaW5pdF9vbmUoJnNnLCBrZXktPmtleSwga2V5LT5rZXlsZW4pOwogCXJldHVybiBjcnlwdG9faGFzaF91cGRhdGUoJmhwLT5tZDVfZGVzYywgJnNnLCBrZXktPmtleWxlbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodGNwX21kNV9oYXNoX2tleSk7CiAKICNlbmRpZgpAQCAtMzI5OCwxNiArMzMxNywzIEBACiAJdGNwX3NlY3JldF9yZXRpcmluZyA9ICZ0Y3Bfc2VjcmV0X3R3bzsKIAl0Y3Bfc2VjcmV0X3NlY29uZGFyeSA9ICZ0Y3Bfc2VjcmV0X3R3bzsKIH0KLQotRVhQT1JUX1NZTUJPTCh0Y3BfY2xvc2UpOwotRVhQT1JUX1NZTUJPTCh0Y3BfZGlzY29ubmVjdCk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9nZXRzb2Nrb3B0KTsKLUVYUE9SVF9TWU1CT0wodGNwX2lvY3RsKTsKLUVYUE9SVF9TWU1CT0wodGNwX3BvbGwpOwotRVhQT1JUX1NZTUJPTCh0Y3BfcmVhZF9zb2NrKTsKLUVYUE9SVF9TWU1CT0wodGNwX3JlY3Ztc2cpOwotRVhQT1JUX1NZTUJPTCh0Y3Bfc2VuZG1zZyk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9zcGxpY2VfcmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9zZW5kcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9zZXRzb2Nrb3B0KTsKLUVYUE9SVF9TWU1CT0wodGNwX3NodXRkb3duKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggNTQ4ZDU3NS4uM2M0MjZjYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTc4LDEwICs3OCwxMyBAQAogaW50IHN5c2N0bF90Y3Bfc2FjayBfX3JlYWRfbW9zdGx5ID0gMTsKIGludCBzeXNjdGxfdGNwX2ZhY2sgX19yZWFkX21vc3RseSA9IDE7CiBpbnQgc3lzY3RsX3RjcF9yZW9yZGVyaW5nIF9fcmVhZF9tb3N0bHkgPSBUQ1BfRkFTVFJFVFJBTlNfVEhSRVNIOworRVhQT1JUX1NZTUJPTChzeXNjdGxfdGNwX3Jlb3JkZXJpbmcpOwogaW50IHN5c2N0bF90Y3BfZWNuIF9fcmVhZF9tb3N0bHkgPSAyOworRVhQT1JUX1NZTUJPTChzeXNjdGxfdGNwX2Vjbik7CiBpbnQgc3lzY3RsX3RjcF9kc2FjayBfX3JlYWRfbW9zdGx5ID0gMTsKIGludCBzeXNjdGxfdGNwX2FwcF93aW4gX19yZWFkX21vc3RseSA9IDMxOwogaW50IHN5c2N0bF90Y3BfYWR2X3dpbl9zY2FsZSBfX3JlYWRfbW9zdGx5ID0gMjsKK0VYUE9SVF9TWU1CT0woc3lzY3RsX3RjcF9hZHZfd2luX3NjYWxlKTsKIAogaW50IHN5c2N0bF90Y3Bfc3RkdXJnIF9fcmVhZF9tb3N0bHk7CiBpbnQgc3lzY3RsX3RjcF9yZmMxMzM3IF9fcmVhZF9tb3N0bHk7CkBAIC00MTksNiArNDIyLDcgQEAKIAogCWluZXRfY3NrKHNrKS0+aWNza19hY2sucmN2X21zcyA9IGhpbnQ7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9pbml0aWFsaXplX3Jjdl9tc3MpOwogCiAvKiBSZWNlaXZlciAiYXV0b3R1bmluZyIgY29kZS4KICAqCkBAIC0yOTM4LDYgKzI5NDIsNyBAQAogCX0KIAl0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHNrKTsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3NpbXBsZV9yZXRyYW5zbWl0KTsKIAogLyogUHJvY2VzcyBhbiBldmVudCwgd2hpY2ggY2FuIHVwZGF0ZSBwYWNrZXRzLWluLWZsaWdodCBub3QgdHJpdmlhbGx5LgogICogTWFpbiBnb2FsIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gY2FsY3VsYXRlIG5ldyBlc3RpbWF0ZSBmb3IgbGVmdF9vdXQsCkBAIC0zMjg2LDcgKzMyOTEsNyBAQAogCQkgKiBjb25uZWN0aW9uIHN0YXJ0dXAgc2xvdyBzdGFydCBvbmUgcGFja2V0IHRvbwogCQkgKiBxdWlja2x5LiAgVGhpcyBpcyBzZXZlcmVseSBmcm93bmVkIHVwb24gYmVoYXZpb3IuCiAJCSAqLwotCQlpZiAoIShzY2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pKSB7CisJCWlmICghKHNjYi0+ZmxhZ3MgJiBUQ1BIRFJfU1lOKSkgewogCQkJZmxhZyB8PSBGTEFHX0RBVEFfQUNLRUQ7CiAJCX0gZWxzZSB7CiAJCQlmbGFnIHw9IEZMQUdfU1lOX0FDS0VEOwpAQCAtMzg1OCw2ICszODYzLDcgQEAKIAkJfQogCX0KIH0KK0VYUE9SVF9TWU1CT0wodGNwX3BhcnNlX29wdGlvbnMpOwogCiBzdGF0aWMgaW50IHRjcF9wYXJzZV9hbGlnbmVkX3RpbWVzdGFtcChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3QgdGNwaGRyICp0aCkKIHsKQEAgLTM5MzEsNiArMzkzNyw3IEBACiAJfQogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfcGFyc2VfbWQ1c2lnX29wdGlvbik7CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9zdG9yZV90c19yZWNlbnQoc3RydWN0IHRjcF9zb2NrICp0cCkKQEAgLTU0MzIsNiArNTQzOSw3IEBACiAJX19rZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3Jjdl9lc3RhYmxpc2hlZCk7CiAKIHN0YXRpYyBpbnQgdGNwX3Jjdl9zeW5zZW50X3N0YXRlX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgc3RydWN0IHRjcGhkciAqdGgsIHVuc2lnbmVkIGxlbikKQEAgLTU5MzEsMTQgKzU5MzksNCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLQotRVhQT1JUX1NZTUJPTChzeXNjdGxfdGNwX2Vjbik7Ci1FWFBPUlRfU1lNQk9MKHN5c2N0bF90Y3BfcmVvcmRlcmluZyk7Ci1FWFBPUlRfU1lNQk9MKHN5c2N0bF90Y3BfYWR2X3dpbl9zY2FsZSk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9wYXJzZV9vcHRpb25zKTsKLSNpZmRlZiBDT05GSUdfVENQX01ENVNJRwotRVhQT1JUX1NZTUJPTCh0Y3BfcGFyc2VfbWQ1c2lnX29wdGlvbik7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wodGNwX3Jjdl9lc3RhYmxpc2hlZCk7CiBFWFBPUlRfU1lNQk9MKHRjcF9yY3Zfc3RhdGVfcHJvY2Vzcyk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9pbml0aWFsaXplX3Jjdl9tc3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggZmUxOTNlNS4uMDIwNzY2MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC04NCw2ICs4NCw3IEBACiAKIGludCBzeXNjdGxfdGNwX3R3X3JldXNlIF9fcmVhZF9tb3N0bHk7CiBpbnQgc3lzY3RsX3RjcF9sb3dfbGF0ZW5jeSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChzeXNjdGxfdGNwX2xvd19sYXRlbmN5KTsKIAogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKQEAgLTEwMCw2ICsxMDEsNyBAQAogI2VuZGlmCiAKIHN0cnVjdCBpbmV0X2hhc2hpbmZvIHRjcF9oYXNoaW5mbzsKK0VYUE9SVF9TWU1CT0wodGNwX2hhc2hpbmZvKTsKIAogc3RhdGljIGlubGluZSBfX3UzMiB0Y3BfdjRfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTM5LDcgKzE0MSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX3R3c2tfdW5pcXVlKTsKIAogLyogVGhpcyB3aWxsIGluaXRpYXRlIGFuIG91dGdvaW5nIGNvbm5lY3Rpb24uICovCkBAIC0yMDQsMTAgKzIwNSwxMiBAQAogCQkgKiBUSU1FLVdBSVQgKiBhbmQgaW5pdGlhbGl6ZSByeF9vcHQudHNfcmVjZW50IGZyb20gaXQsCiAJCSAqIHdoZW4gdHJ5aW5nIG5ldyBjb25uZWN0aW9uLgogCQkgKi8KLQkJaWYgKHBlZXIgIT0gTlVMTCAmJgotCQkgICAgKHUzMilnZXRfc2Vjb25kcygpIC0gcGVlci0+dGNwX3RzX3N0YW1wIDw9IFRDUF9QQVdTX01TTCkgewotCQkJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSBwZWVyLT50Y3BfdHNfc3RhbXA7Ci0JCQl0cC0+cnhfb3B0LnRzX3JlY2VudCA9IHBlZXItPnRjcF90czsKKwkJaWYgKHBlZXIpIHsKKwkJCWluZXRfcGVlcl9yZWZjaGVjayhwZWVyKTsKKwkJCWlmICgodTMyKWdldF9zZWNvbmRzKCkgLSBwZWVyLT50Y3BfdHNfc3RhbXAgPD0gVENQX1BBV1NfTVNMKSB7CisJCQkJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSBwZWVyLT50Y3BfdHNfc3RhbXA7CisJCQkJdHAtPnJ4X29wdC50c19yZWNlbnQgPSBwZWVyLT50Y3BfdHM7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTIzNyw3ICsyNDAsNyBAQAogCiAJLyogT0ssIG5vdyBjb21taXQgZGVzdGluYXRpb24gdG8gc29ja2V0LiAgKi8KIAlzay0+c2tfZ3NvX3R5cGUgPSBTS0JfR1NPX1RDUFY0OwotCXNrX3NldHVwX2NhcHMoc2ssICZydC0+dS5kc3QpOworCXNrX3NldHVwX2NhcHMoc2ssICZydC0+ZHN0KTsKIAogCWlmICghdHAtPndyaXRlX3NlcSkKIAkJdHAtPndyaXRlX3NlcSA9IHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKGluZXQtPmluZXRfc2FkZHIsCkBAIC0yNjUsNiArMjY4LDcgQEAKIAlpbmV0LT5pbmV0X2Rwb3J0ID0gMDsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfdjRfY29ubmVjdCk7CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgZG9lcyBwYXRoIG10dSBkaXNjb3ZlcnkgYXMgZGVmaW5lZCBpbiBSRkMxMTkxLgpAQCAtNTQzLDYgKzU0Nyw3IEBACiAKIAlfX3RjcF92NF9zZW5kX2NoZWNrKHNrYiwgaW5ldC0+aW5ldF9zYWRkciwgaW5ldC0+aW5ldF9kYWRkcik7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF92NF9zZW5kX2NoZWNrKTsKIAogaW50IHRjcF92NF9nc29fc2VuZF9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNzkzLDE5ICs3OTgsMjAgQEAKIAlrZnJlZShpbmV0X3JzayhyZXEpLT5vcHQpOwogfQogCi0jaWZkZWYgQ09ORklHX1NZTl9DT09LSUVTCi1zdGF0aWMgdm9pZCBzeW5fZmxvb2Rfd2FybmluZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgc3luX2Zsb29kX3dhcm5pbmcoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyB3YXJudGltZTsKKwljb25zdCBjaGFyICptc2c7CiAKLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCAod2FybnRpbWUgKyBIWiAqIDYwKSkpIHsKLQkJd2FybnRpbWUgPSBqaWZmaWVzOwotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAicG9zc2libGUgU1lOIGZsb29kaW5nIG9uIHBvcnQgJWQuIFNlbmRpbmcgY29va2llcy5cbiIsCi0JCSAgICAgICBudG9ocyh0Y3BfaGRyKHNrYiktPmRlc3QpKTsKLQl9Ci19CisjaWZkZWYgQ09ORklHX1NZTl9DT09LSUVTCisJaWYgKHN5c2N0bF90Y3Bfc3luY29va2llcykKKwkJbXNnID0gIlNlbmRpbmcgY29va2llcyI7CisJZWxzZQogI2VuZGlmCisJCW1zZyA9ICJEcm9wcGluZyByZXF1ZXN0IjsKKworCXByX2luZm8oIlRDUDogUG9zc2libGUgU1lOIGZsb29kaW5nIG9uIHBvcnQgJWQuICVzLlxuIiwKKwkJCQludG9ocyh0Y3BfaGRyKHNrYiktPmRlc3QpLCBtc2cpOworfQogCiAvKgogICogU2F2ZSBhbmQgY29tcGlsZSBJUHY0IG9wdGlvbnMgaW50byB0aGUgcmVxdWVzdF9zb2NrIGlmIG5lZWRlZC4KQEAgLTg1Nyw3ICs4NjMsNiBAQAogewogCXJldHVybiB0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzaywgaW5ldF9zayhhZGRyX3NrKS0+aW5ldF9kYWRkcik7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodGNwX3Y0X21kNV9sb29rdXApOwogCiBzdGF0aWMgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICp0Y3BfdjRfcmVxc2tfbWQ1X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCkBAIC05MjQsNyArOTI5LDYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodGNwX3Y0X21kNV9kb19hZGQpOwogCiBzdGF0aWMgaW50IHRjcF92NF9tZDVfYWRkX2Z1bmMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqYWRkcl9zaywKQEAgLTk2Miw3ICs5NjYsNiBAQAogCX0KIAlyZXR1cm4gLUVOT0VOVDsKIH0KLQogRVhQT1JUX1NZTUJPTCh0Y3BfdjRfbWQ1X2RvX2RlbCk7CiAKIHN0YXRpYyB2b2lkIHRjcF92NF9jbGVhcl9tZDVfbGlzdChzdHJ1Y3Qgc29jayAqc2spCkBAIC0xMTM1LDcgKzExMzgsNiBAQAogCW1lbXNldChtZDVfaGFzaCwgMCwgMTYpOwogCXJldHVybiAxOwogfQotCiBFWFBPUlRfU1lNQk9MKHRjcF92NF9tZDVfaGFzaF9za2IpOwogCiBzdGF0aWMgaW50IHRjcF92NF9pbmJvdW5kX21kNV9oYXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTEyNDMsNiArMTI0NSw4IEBACiAJICogZXZpZGVudGx5IHJlYWwgb25lLgogCSAqLwogCWlmIChpbmV0X2Nza19yZXFza19xdWV1ZV9pc19mdWxsKHNrKSAmJiAhaXNuKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlzeW5fZmxvb2Rfd2FybmluZyhza2IpOwogI2lmZGVmIENPTkZJR19TWU5fQ09PS0lFUwogCQlpZiAoc3lzY3RsX3RjcF9zeW5jb29raWVzKSB7CiAJCQl3YW50X2Nvb2tpZSA9IDE7CkBAIC0xMzIzLDE1ICsxMzI3LDEyIEBACiAJaWYgKHNlY3VyaXR5X2luZXRfY29ubl9yZXF1ZXN0KHNrLCBza2IsIHJlcSkpCiAJCWdvdG8gZHJvcF9hbmRfZnJlZTsKIAotCWlmICghd2FudF9jb29raWUpCisJaWYgKCF3YW50X2Nvb2tpZSB8fCB0bXBfb3B0LnRzdGFtcF9vaykKIAkJVENQX0VDTl9jcmVhdGVfcmVxdWVzdChyZXEsIHRjcF9oZHIoc2tiKSk7CiAKIAlpZiAod2FudF9jb29raWUpIHsKLSNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKLQkJc3luX2Zsb29kX3dhcm5pbmcoc2tiKTsKLQkJcmVxLT5jb29raWVfdHMgPSB0bXBfb3B0LnRzdGFtcF9vazsKLSNlbmRpZgogCQlpc24gPSBjb29raWVfdjRfaW5pdF9zZXF1ZW5jZShzaywgc2tiLCAmcmVxLT5tc3MpOworCQlyZXEtPmNvb2tpZV90cyA9IHRtcF9vcHQudHN0YW1wX29rOwogCX0gZWxzZSBpZiAoIWlzbikgewogCQlzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyID0gTlVMTDsKIApAQCAtMTM0OSw2ICsxMzUwLDcgQEAKIAkJICAgIChkc3QgPSBpbmV0X2Nza19yb3V0ZV9yZXEoc2ssIHJlcSkpICE9IE5VTEwgJiYKIAkJICAgIChwZWVyID0gcnRfZ2V0X3BlZXIoKHN0cnVjdCBydGFibGUgKilkc3QpKSAhPSBOVUxMICYmCiAJCSAgICBwZWVyLT52NGRhZGRyID09IHNhZGRyKSB7CisJCQlpbmV0X3BlZXJfcmVmY2hlY2socGVlcik7CiAJCQlpZiAoKHUzMilnZXRfc2Vjb25kcygpIC0gcGVlci0+dGNwX3RzX3N0YW1wIDwgVENQX1BBV1NfTVNMICYmCiAJCQkgICAgKHMzMikocGVlci0+dGNwX3RzIC0gcmVxLT50c19yZWNlbnQpID4KIAkJCQkJCQlUQ1BfUEFXU19XSU5ET1cpIHsKQEAgLTEzOTMsNiArMTM5NSw3IEBACiBkcm9wOgogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfdjRfY29ubl9yZXF1ZXN0KTsKIAogCiAvKgpAQCAtMTQ3OCw2ICsxNDgxLDcgQEAKIAlkc3RfcmVsZWFzZShkc3QpOwogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfdjRfc3luX3JlY3Zfc29jayk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqdGNwX3Y0X2huZF9yZXEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTUwNCw3ICsxNTA4LDcgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKLQlpZiAoIXRoLT5yc3QgJiYgIXRoLT5zeW4gJiYgdGgtPmFjaykKKwlpZiAoIXRoLT5zeW4pCiAJCXNrID0gY29va2llX3Y0X2NoZWNrKHNrLCBza2IsICYoSVBDQihza2IpLT5vcHQpKTsKICNlbmRpZgogCXJldHVybiBzazsKQEAgLTE2MDcsNiArMTYxMSw3IEBACiAJVENQX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIFRDUF9NSUJfSU5FUlJTKTsKIAlnb3RvIGRpc2NhcmQ7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF92NF9kb19yY3YpOwogCiAvKgogICoJRnJvbSB0Y3BfaW5wdXQuYwpAQCAtMTc5Myw2ICsxNzk4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfdjRfcmVtZW1iZXJfc3RhbXApOwogCiBpbnQgdGNwX3Y0X3R3X3JlbWVtYmVyX3N0YW1wKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KQogewpAQCAtMTgzMiw2ICsxODM4LDcgQEAKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfaXBfZ2V0c29ja29wdCwKICNlbmRpZgogfTsKK0VYUE9SVF9TWU1CT0woaXB2NF9zcGVjaWZpYyk7CiAKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwogc3RhdGljIGNvbnN0IHN0cnVjdCB0Y3Bfc29ja19hZl9vcHMgdGNwX3NvY2tfaXB2NF9zcGVjaWZpYyA9IHsKQEAgLTE5NjAsNyArMTk2Nyw2IEBACiAKIAlwZXJjcHVfY291bnRlcl9kZWMoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodGNwX3Y0X2Rlc3Ryb3lfc29jayk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtMTk3OCw2ICsxOTg0LDExIEBACiAJCWhsaXN0X251bGxzX2VudHJ5KHR3LT50d19ub2RlLm5leHQsIHR5cGVvZigqdHcpLCB0d19ub2RlKSA6IE5VTEw7CiB9CiAKKy8qCisgKiBHZXQgbmV4dCBsaXN0ZW5lciBzb2NrZXQgZm9sbG93IGN1ci4gIElmIGN1ciBpcyBOVUxMLCBnZXQgZmlyc3Qgc29ja2V0CisgKiBzdGFydGluZyBmcm9tIGJ1Y2tldCBnaXZlbiBpbiBzdC0+YnVja2V0OyB3aGVuIHN0LT5idWNrZXQgaXMgemVybyB0aGUKKyAqIHZlcnkgZmlyc3Qgc29ja2V0IGluIHRoZSBoYXNoIHRhYmxlIGlzIHJldHVybmVkLgorICovCiBzdGF0aWMgdm9pZCAqbGlzdGVuaW5nX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpjdXIpCiB7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrOwpAQCAtMTk4OCwxNCArMTk5OSwxNSBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwogCiAJaWYgKCFzaykgewotCQlzdC0+YnVja2V0ID0gMDsKLQkJaWxiID0gJnRjcF9oYXNoaW5mby5saXN0ZW5pbmdfaGFzaFswXTsKKwkJaWxiID0gJnRjcF9oYXNoaW5mby5saXN0ZW5pbmdfaGFzaFtzdC0+YnVja2V0XTsKIAkJc3Bpbl9sb2NrX2JoKCZpbGItPmxvY2spOwogCQlzayA9IHNrX251bGxzX2hlYWQoJmlsYi0+aGVhZCk7CisJCXN0LT5vZmZzZXQgPSAwOwogCQlnb3RvIGdldF9zazsKIAl9CiAJaWxiID0gJnRjcF9oYXNoaW5mby5saXN0ZW5pbmdfaGFzaFtzdC0+YnVja2V0XTsKIAkrK3N0LT5udW07CisJKytzdC0+b2Zmc2V0OwogCiAJaWYgKHN0LT5zdGF0ZSA9PSBUQ1BfU0VRX1NUQVRFX09QRU5SRVEpIHsKIAkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0gY3VyOwpAQCAtMjAxMCw2ICsyMDIyLDcgQEAKIAkJCQl9CiAJCQkJcmVxID0gcmVxLT5kbF9uZXh0OwogCQkJfQorCQkJc3QtPm9mZnNldCA9IDA7CiAJCQlpZiAoKytzdC0+c2J1Y2tldCA+PSBpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5saXN0ZW5fb3B0LT5ucl90YWJsZV9lbnRyaWVzKQogCQkJCWJyZWFrOwogZ2V0X3JlcToKQEAgLTIwNDUsNiArMjA1OCw3IEBACiAJCXJlYWRfdW5sb2NrX2JoKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmlsYi0+bG9jayk7CisJc3QtPm9mZnNldCA9IDA7CiAJaWYgKCsrc3QtPmJ1Y2tldCA8IElORVRfTEhUQUJMRV9TSVpFKSB7CiAJCWlsYiA9ICZ0Y3BfaGFzaGluZm8ubGlzdGVuaW5nX2hhc2hbc3QtPmJ1Y2tldF07CiAJCXNwaW5fbG9ja19iaCgmaWxiLT5sb2NrKTsKQEAgLTIwNTgsNyArMjA3MiwxMiBAQAogCiBzdGF0aWMgdm9pZCAqbGlzdGVuaW5nX2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCXZvaWQgKnJjID0gbGlzdGVuaW5nX2dldF9uZXh0KHNlcSwgTlVMTCk7CisJc3RydWN0IHRjcF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKKwl2b2lkICpyYzsKKworCXN0LT5idWNrZXQgPSAwOworCXN0LT5vZmZzZXQgPSAwOworCXJjID0gbGlzdGVuaW5nX2dldF9uZXh0KHNlcSwgTlVMTCk7CiAKIAl3aGlsZSAocmMgJiYgKnBvcykgewogCQlyYyA9IGxpc3RlbmluZ19nZXRfbmV4dChzZXEsIHJjKTsKQEAgLTIwNzMsMTMgKzIwOTIsMTggQEAKIAkJaGxpc3RfbnVsbHNfZW1wdHkoJnRjcF9oYXNoaW5mby5laGFzaFtzdC0+YnVja2V0XS50d2NoYWluKTsKIH0KIAorLyoKKyAqIEdldCBmaXJzdCBlc3RhYmxpc2hlZCBzb2NrZXQgc3RhcnRpbmcgZnJvbSBidWNrZXQgZ2l2ZW4gaW4gc3QtPmJ1Y2tldC4KKyAqIElmIHN0LT5idWNrZXQgaXMgemVybywgdGhlIHZlcnkgZmlyc3Qgc29ja2V0IGluIHRoZSBoYXNoIGlzIHJldHVybmVkLgorICovCiBzdGF0aWMgdm9pZCAqZXN0YWJsaXNoZWRfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQogewogCXN0cnVjdCB0Y3BfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJdm9pZCAqcmMgPSBOVUxMOwogCi0JZm9yIChzdC0+YnVja2V0ID0gMDsgc3QtPmJ1Y2tldCA8PSB0Y3BfaGFzaGluZm8uZWhhc2hfbWFzazsgKytzdC0+YnVja2V0KSB7CisJc3QtPm9mZnNldCA9IDA7CisJZm9yICg7IHN0LT5idWNrZXQgPD0gdGNwX2hhc2hpbmZvLmVoYXNoX21hc2s7ICsrc3QtPmJ1Y2tldCkgewogCQlzdHJ1Y3Qgc29jayAqc2s7CiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpub2RlOwogCQlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dzsKQEAgLTIxMjQsNiArMjE0OCw3IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAKIAkrK3N0LT5udW07CisJKytzdC0+b2Zmc2V0OwogCiAJaWYgKHN0LT5zdGF0ZSA9PSBUQ1BfU0VRX1NUQVRFX1RJTUVfV0FJVCkgewogCQl0dyA9IGN1cjsKQEAgLTIxNDAsNiArMjE2NSw3IEBACiAJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfRVNUQUJMSVNIRUQ7CiAKIAkJLyogTG9vayBmb3IgbmV4dCBub24gZW1wdHkgYnVja2V0ICovCisJCXN0LT5vZmZzZXQgPSAwOwogCQl3aGlsZSAoKytzdC0+YnVja2V0IDw9IHRjcF9oYXNoaW5mby5laGFzaF9tYXNrICYmCiAJCQkJZW1wdHlfYnVja2V0KHN0KSkKIAkJCTsKQEAgLTIxNjcsNyArMjE5MywxMSBAQAogCiBzdGF0aWMgdm9pZCAqZXN0YWJsaXNoZWRfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKIHsKLQl2b2lkICpyYyA9IGVzdGFibGlzaGVkX2dldF9maXJzdChzZXEpOworCXN0cnVjdCB0Y3BfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CisJdm9pZCAqcmM7CisKKwlzdC0+YnVja2V0ID0gMDsKKwlyYyA9IGVzdGFibGlzaGVkX2dldF9maXJzdChzZXEpOwogCiAJd2hpbGUgKHJjICYmIHBvcykgewogCQlyYyA9IGVzdGFibGlzaGVkX2dldF9uZXh0KHNlcSwgcmMpOwpAQCAtMjE5MiwyNCArMjIyMiw3MiBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgKnRjcF9zZWVrX2xhc3RfcG9zKHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCB0Y3BfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CisJaW50IG9mZnNldCA9IHN0LT5vZmZzZXQ7CisJaW50IG9yaWdfbnVtID0gc3QtPm51bTsKKwl2b2lkICpyYyA9IE5VTEw7CisKKwlzd2l0Y2ggKHN0LT5zdGF0ZSkgeworCWNhc2UgVENQX1NFUV9TVEFURV9PUEVOUkVROgorCWNhc2UgVENQX1NFUV9TVEFURV9MSVNURU5JTkc6CisJCWlmIChzdC0+YnVja2V0ID49IElORVRfTEhUQUJMRV9TSVpFKQorCQkJYnJlYWs7CisJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfTElTVEVOSU5HOworCQlyYyA9IGxpc3RlbmluZ19nZXRfbmV4dChzZXEsIE5VTEwpOworCQl3aGlsZSAob2Zmc2V0LS0gJiYgcmMpCisJCQlyYyA9IGxpc3RlbmluZ19nZXRfbmV4dChzZXEsIHJjKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisJCXN0LT5idWNrZXQgPSAwOworCQkvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgVENQX1NFUV9TVEFURV9FU1RBQkxJU0hFRDoKKwljYXNlIFRDUF9TRVFfU1RBVEVfVElNRV9XQUlUOgorCQlzdC0+c3RhdGUgPSBUQ1BfU0VRX1NUQVRFX0VTVEFCTElTSEVEOworCQlpZiAoc3QtPmJ1Y2tldCA+IHRjcF9oYXNoaW5mby5laGFzaF9tYXNrKQorCQkJYnJlYWs7CisJCXJjID0gZXN0YWJsaXNoZWRfZ2V0X2ZpcnN0KHNlcSk7CisJCXdoaWxlIChvZmZzZXQtLSAmJiByYykKKwkJCXJjID0gZXN0YWJsaXNoZWRfZ2V0X25leHQoc2VxLCByYyk7CisJfQorCisJc3QtPm51bSA9IG9yaWdfbnVtOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgdm9pZCAqdGNwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IHRjcF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKKwl2b2lkICpyYzsKKworCWlmICgqcG9zICYmICpwb3MgPT0gc3QtPmxhc3RfcG9zKSB7CisJCXJjID0gdGNwX3NlZWtfbGFzdF9wb3Moc2VxKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJfQorCiAJc3QtPnN0YXRlID0gVENQX1NFUV9TVEFURV9MSVNURU5JTkc7CiAJc3QtPm51bSA9IDA7Ci0JcmV0dXJuICpwb3MgPyB0Y3BfZ2V0X2lkeChzZXEsICpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKKwlzdC0+YnVja2V0ID0gMDsKKwlzdC0+b2Zmc2V0ID0gMDsKKwlyYyA9ICpwb3MgPyB0Y3BfZ2V0X2lkeChzZXEsICpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKKworb3V0OgorCXN0LT5sYXN0X3BvcyA9ICpwb3M7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCAqdGNwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCXZvaWQgKnJjID0gTlVMTDsKLQlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUgKnN0OwogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CiAJCXJjID0gdGNwX2dldF9pZHgoc2VxLCAwKTsKIAkJZ290byBvdXQ7CiAJfQotCXN0ID0gc2VxLT5wcml2YXRlOwogCiAJc3dpdGNoIChzdC0+c3RhdGUpIHsKIAljYXNlIFRDUF9TRVFfU1RBVEVfT1BFTlJFUToKQEAgLTIyMTcsNiArMjI5NSw4IEBACiAJCXJjID0gbGlzdGVuaW5nX2dldF9uZXh0KHNlcSwgdik7CiAJCWlmICghcmMpIHsKIAkJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfRVNUQUJMSVNIRUQ7CisJCQlzdC0+YnVja2V0ID0gMDsKKwkJCXN0LT5vZmZzZXQgPSAwOwogCQkJcmMJICA9IGVzdGFibGlzaGVkX2dldF9maXJzdChzZXEpOwogCQl9CiAJCWJyZWFrOwpAQCAtMjIyNyw2ICsyMzA3LDcgQEAKIAl9CiBvdXQ6CiAJKysqcG9zOworCXN0LT5sYXN0X3BvcyA9ICpwb3M7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yMjY1LDYgKzIzNDYsNyBAQAogCiAJcyA9ICgoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+cHJpdmF0ZTsKIAlzLT5mYW1pbHkJCT0gYWZpbmZvLT5mYW1pbHk7CisJcy0+bGFzdF9wb3MgCQk9IDA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyODgsMTEgKzIzNzAsMTMgQEAKIAkJcmMgPSAtRU5PTUVNOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3Byb2NfcmVnaXN0ZXIpOwogCiB2b2lkIHRjcF9wcm9jX3VucmVnaXN0ZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gKmFmaW5mbykKIHsKIAlwcm9jX25ldF9yZW1vdmUobmV0LCBhZmluZm8tPm5hbWUpOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfcHJvY191bnJlZ2lzdGVyKTsKIAogc3RhdGljIHZvaWQgZ2V0X29wZW5yZXE0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAogCQkJIHN0cnVjdCBzZXFfZmlsZSAqZiwgaW50IGksIGludCB1aWQsIGludCAqbGVuKQpAQCAtMjUxNiw2ICsyNjAwLDggQEAKIAkuc2V0c29ja29wdAkJPSB0Y3Bfc2V0c29ja29wdCwKIAkuZ2V0c29ja29wdAkJPSB0Y3BfZ2V0c29ja29wdCwKIAkucmVjdm1zZwkJPSB0Y3BfcmVjdm1zZywKKwkuc2VuZG1zZwkJPSB0Y3Bfc2VuZG1zZywKKwkuc2VuZHBhZ2UJCT0gdGNwX3NlbmRwYWdlLAogCS5iYWNrbG9nX3JjdgkJPSB0Y3BfdjRfZG9fcmN2LAogCS5oYXNoCQkJPSBpbmV0X2hhc2gsCiAJLnVuaGFzaAkJCT0gaW5ldF91bmhhc2gsCkBAIC0yNTM0LDExICsyNjIwLDEzIEBACiAJLnR3c2tfcHJvdAkJPSAmdGNwX3RpbWV3YWl0X3NvY2tfb3BzLAogCS5yc2tfcHJvdAkJPSAmdGNwX3JlcXVlc3Rfc29ja19vcHMsCiAJLmguaGFzaGluZm8JCT0gJnRjcF9oYXNoaW5mbywKKwkubm9fYXV0b2JpbmQJCT0gdHJ1ZSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9zZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdAk9IGNvbXBhdF90Y3BfZ2V0c29ja29wdCwKICNlbmRpZgogfTsKK0VYUE9SVF9TWU1CT0wodGNwX3Byb3QpOwogCiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCB0Y3Bfc2tfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCkBAIC0yNTY5LDIwICsyNjU3LDMgQEAKIAlpZiAocmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmdGNwX3NrX29wcykpCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBUQ1AgY29udHJvbCBzb2NrZXQuXG4iKTsKIH0KLQotRVhQT1JUX1NZTUJPTChpcHY0X3NwZWNpZmljKTsKLUVYUE9SVF9TWU1CT0wodGNwX2hhc2hpbmZvKTsKLUVYUE9SVF9TWU1CT0wodGNwX3Byb3QpOwotRVhQT1JUX1NZTUJPTCh0Y3BfdjRfY29ubl9yZXF1ZXN0KTsKLUVYUE9SVF9TWU1CT0wodGNwX3Y0X2Nvbm5lY3QpOwotRVhQT1JUX1NZTUJPTCh0Y3BfdjRfZG9fcmN2KTsKLUVYUE9SVF9TWU1CT0wodGNwX3Y0X3JlbWVtYmVyX3N0YW1wKTsKLUVYUE9SVF9TWU1CT0wodGNwX3Y0X3NlbmRfY2hlY2spOwotRVhQT1JUX1NZTUJPTCh0Y3BfdjRfc3luX3JlY3Zfc29jayk7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotRVhQT1JUX1NZTUJPTCh0Y3BfcHJvY19yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKHRjcF9wcm9jX3VucmVnaXN0ZXIpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKHN5c2N0bF90Y3BfbG93X2xhdGVuY3kpOwotCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKaW5kZXggNzk0YzJlMS4uZjI1YjU2YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCisrKyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwpAQCAtNDcsNyArNDcsNiBAQAogCS50d2NhbF90aW1lcgk9IFRJTUVSX0lOSVRJQUxJWkVSKGluZXRfdHdkcl90d2NhbF90aWNrLCAwLAogCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpJnRjcF9kZWF0aF9yb3cpLAogfTsKLQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX2RlYXRoX3Jvdyk7CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCB0Y3BfaW5fd2luZG93KHUzMiBzZXEsIHUzMiBlbmRfc2VxLCB1MzIgc193aW4sIHUzMiBlX3dpbikKQEAgLTI2Miw2ICsyNjEsNyBAQAogCWluZXRfdHdza19wdXQodHcpOwogCXJldHVybiBUQ1BfVFdfU1VDQ0VTUzsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3RpbWV3YWl0X3N0YXRlX3Byb2Nlc3MpOwogCiAvKgogICogTW92ZSBhIHNvY2tldCB0byB0aW1lLXdhaXQgb3IgZGVhZCBmaW4td2FpdC0yIHN0YXRlLgpAQCAtMzYyLDcgKzM2Miw2IEBACiAJCXRjcF9mcmVlX21kNXNpZ19wb29sKCk7CiAjZW5kaWYKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX3R3c2tfZGVzdHJ1Y3Rvcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBUQ1BfRUNOX29wZW5yZXFfY2hpbGQoc3RydWN0IHRjcF9zb2NrICp0cCwKQEAgLTUxMCw2ICs1MDksNyBAQAogCX0KIAlyZXR1cm4gbmV3c2s7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZCk7CiAKIC8qCiAgKglQcm9jZXNzIGFuIGluY29taW5nIHBhY2tldCBmb3IgU1lOX1JFQ1Ygc29ja2V0cyByZXByZXNlbnRlZApAQCAtNzA2LDYgKzcwNiw3IEBACiAJaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX2NoZWNrX3JlcSk7CiAKIC8qCiAgKiBRdWV1ZSBzZWdtZW50IG9uIHRoZSBuZXcgc29ja2V0IGlmIHRoZSBuZXcgc29ja2V0IGlzIGFjdGl2ZSwKQEAgLTczNyw4ICs3MzgsNCBAQAogCXNvY2tfcHV0KGNoaWxkKTsKIAlyZXR1cm4gcmV0OwogfQotCi1FWFBPUlRfU1lNQk9MKHRjcF9jaGVja19yZXEpOwogRVhQT1JUX1NZTUJPTCh0Y3BfY2hpbGRfcHJvY2Vzcyk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZCk7Ci1FWFBPUlRfU1lNQk9MKHRjcF90aW1ld2FpdF9zdGF0ZV9wcm9jZXNzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCA3ZWQ5ZGMxLi5kZTNiZDg0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC0yNDcsNiArMjQ3LDcgQEAKIAkvKiBTZXQgdGhlIGNsYW1wIG5vIGhpZ2hlciB0aGFuIG1heCByZXByZXNlbnRhYmxlIHZhbHVlICovCiAJKCp3aW5kb3dfY2xhbXApID0gbWluKDY1NTM1VSA8PCAoKnJjdl93c2NhbGUpLCAqd2luZG93X2NsYW1wKTsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3NlbGVjdF9pbml0aWFsX3dpbmRvdyk7CiAKIC8qIENob3NlIGEgbmV3IHdpbmRvdyB0byBhZHZlcnRpc2UsIHVwZGF0ZSBzdGF0ZSBpbiB0Y3Bfc29jayBmb3IgdGhlCiAgKiBzb2NrZXQsIGFuZCByZXR1cm4gcmVzdWx0IHdpdGggUkZDMTMyMyBzY2FsaW5nIGFwcGxpZWQuICBUaGUgcmV0dXJuCkBAIC0yOTQsOSArMjk1LDkgQEAKIC8qIFBhY2tldCBFQ04gc3RhdGUgZm9yIGEgU1lOLUFDSyAqLwogc3RhdGljIGlubGluZSB2b2lkIFRDUF9FQ05fc2VuZF9zeW5hY2soc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICY9IH5UQ1BDQl9GTEFHX0NXUjsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICY9IH5UQ1BIRFJfQ1dSOwogCWlmICghKHRwLT5lY25fZmxhZ3MgJiBUQ1BfRUNOX09LKSkKLQkJVENQX1NLQl9DQihza2IpLT5mbGFncyAmPSB+VENQQ0JfRkxBR19FQ0U7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJj0gflRDUEhEUl9FQ0U7CiB9CiAKIC8qIFBhY2tldCBFQ04gc3RhdGUgZm9yIGEgU1lOLiAgKi8KQEAgLTMwNiw3ICszMDcsNyBAQAogCiAJdHAtPmVjbl9mbGFncyA9IDA7CiAJaWYgKHN5c2N0bF90Y3BfZWNuID09IDEpIHsKLQkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX0VDRSB8IFRDUENCX0ZMQUdfQ1dSOworCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUEhEUl9FQ0UgfCBUQ1BIRFJfQ1dSOwogCQl0cC0+ZWNuX2ZsYWdzID0gVENQX0VDTl9PSzsKIAl9CiB9CkBAIC0zNjEsNyArMzYyLDcgQEAKIAlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gMDsKIAogCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxID0gc2VxOwotCWlmIChmbGFncyAmIChUQ1BDQl9GTEFHX1NZTiB8IFRDUENCX0ZMQUdfRklOKSkKKwlpZiAoZmxhZ3MgJiAoVENQSERSX1NZTiB8IFRDUEhEUl9GSU4pKQogCQlzZXErKzsKIAlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSBzZXE7CiB9CkBAIC04MjAsNyArODIxLDcgQEAKIAl0Y2IgPSBUQ1BfU0tCX0NCKHNrYik7CiAJbWVtc2V0KCZvcHRzLCAwLCBzaXplb2Yob3B0cykpOwogCi0JaWYgKHVubGlrZWx5KHRjYi0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX1NZTikpCisJaWYgKHVubGlrZWx5KHRjYi0+ZmxhZ3MgJiBUQ1BIRFJfU1lOKSkKIAkJdGNwX29wdGlvbnNfc2l6ZSA9IHRjcF9zeW5fb3B0aW9ucyhzaywgc2tiLCAmb3B0cywgJm1kNSk7CiAJZWxzZQogCQl0Y3Bfb3B0aW9uc19zaXplID0gdGNwX2VzdGFibGlzaGVkX29wdGlvbnMoc2ssIHNrYiwgJm9wdHMsCkBAIC04NDMsNyArODQ0LDcgQEAKIAkqKCgoX19iZTE2ICopdGgpICsgNikJPSBodG9ucygoKHRjcF9oZWFkZXJfc2l6ZSA+PiAyKSA8PCAxMikgfAogCQkJCQl0Y2ItPmZsYWdzKTsKIAotCWlmICh1bmxpa2VseSh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pKSB7CisJaWYgKHVubGlrZWx5KHRjYi0+ZmxhZ3MgJiBUQ1BIRFJfU1lOKSkgewogCQkvKiBSRkMxMzIzOiBUaGUgd2luZG93IGluIFNZTiAmIFNZTi9BQ0sgc2VnbWVudHMKIAkJICogaXMgbmV2ZXIgc2NhbGVkLgogCQkgKi8KQEAgLTg2Niw3ICs4NjcsNyBAQAogCX0KIAogCXRjcF9vcHRpb25zX3dyaXRlKChfX2JlMzIgKikodGggKyAxKSwgdHAsICZvcHRzKTsKLQlpZiAobGlrZWx5KCh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pID09IDApKQorCWlmIChsaWtlbHkoKHRjYi0+ZmxhZ3MgJiBUQ1BIRFJfU1lOKSA9PSAwKSkKIAkJVENQX0VDTl9zZW5kKHNrLCBza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CiAKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwpAQCAtODgwLDcgKzg4MSw3IEBACiAKIAlpY3NrLT5pY3NrX2FmX29wcy0+c2VuZF9jaGVjayhzaywgc2tiKTsKIAotCWlmIChsaWtlbHkodGNiLT5mbGFncyAmIFRDUENCX0ZMQUdfQUNLKSkKKwlpZiAobGlrZWx5KHRjYi0+ZmxhZ3MgJiBUQ1BIRFJfQUNLKSkKIAkJdGNwX2V2ZW50X2Fja19zZW50KHNrLCB0Y3Bfc2tiX3Bjb3VudChza2IpKTsKIAogCWlmIChza2ItPmxlbiAhPSB0Y3BfaGVhZGVyX3NpemUpCkBAIC0xMDIzLDcgKzEwMjQsNyBAQAogCiAJLyogUFNIIGFuZCBGSU4gc2hvdWxkIG9ubHkgYmUgc2V0IGluIHRoZSBzZWNvbmQgcGFja2V0LiAqLwogCWZsYWdzID0gVENQX1NLQl9DQihza2IpLT5mbGFnczsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3MgJiB+KFRDUENCX0ZMQUdfRklOIHwgVENQQ0JfRkxBR19QU0gpOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBmbGFncyAmIH4oVENQSERSX0ZJTiB8IFRDUEhEUl9QU0gpOwogCVRDUF9TS0JfQ0IoYnVmZiktPmZsYWdzID0gZmxhZ3M7CiAJVENQX1NLQl9DQihidWZmKS0+c2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7CiAKQEAgLTExODksNiArMTE5MCw3IEBACiAJaWNzay0+aWNza19tdHVwLnNlYXJjaF9sb3cgPSB0Y3BfbXNzX3RvX210dShzaywgc3lzY3RsX3RjcF9iYXNlX21zcyk7CiAJaWNzay0+aWNza19tdHVwLnByb2JlX3NpemUgPSAwOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfbXR1cF9pbml0KTsKIAogLyogVGhpcyBmdW5jdGlvbiBzeW5jaHJvbml6ZSBzbmQgbXNzIHRvIGN1cnJlbnQgcG10dS9leHRoZHIgc2V0LgogCkBAIC0xMjMyLDYgKzEyMzQsNyBAQAogCiAJcmV0dXJuIG1zc19ub3c7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9zeW5jX21zcyk7CiAKIC8qIENvbXB1dGUgdGhlIGN1cnJlbnQgZWZmZWN0aXZlIE1TUywgdGFraW5nIFNBQ0tzIGFuZCBJUCBvcHRpb25zLAogICogYW5kIGV2ZW4gUE1UVSBkaXNjb3ZlcnkgZXZlbnRzIGludG8gYWNjb3VudC4KQEAgLTEzMjgsOCArMTMzMSw3IEBACiAJdTMyIGluX2ZsaWdodCwgY3duZDsKIAogCS8qIERvbid0IGJlIHN0cmljdCBhYm91dCB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgZm9yIHRoZSBmaW5hbCBGSU4uICAqLwotCWlmICgoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKSAmJgotCSAgICB0Y3Bfc2tiX3Bjb3VudChza2IpID09IDEpCisJaWYgKChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQSERSX0ZJTikgJiYgdGNwX3NrYl9wY291bnQoc2tiKSA9PSAxKQogCQlyZXR1cm4gMTsKIAogCWluX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CkBAIC0xMzk4LDcgKzE0MDAsNyBAQAogCSAqIE5hZ2xlIGNhbiBiZSBpZ25vcmVkIGR1cmluZyBGLVJUTyB0b28gKHNlZSBSRkM0MTM4KS4KIAkgKi8KIAlpZiAodGNwX3VyZ19tb2RlKHRwKSB8fCAodHAtPmZydG9fY291bnRlciA9PSAyKSB8fAotCSAgICAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKSkKKwkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BIRFJfRklOKSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoIXRjcF9uYWdsZV9jaGVjayh0cCwgc2tiLCBjdXJfbXNzLCBub25hZ2xlKSkKQEAgLTE0NjEsNyArMTQ2Myw3IEBACiAgKiBwYWNrZXQgaGFzIG5ldmVyIGJlZW4gc2VudCBvdXQgYmVmb3JlIChhbmQgdGh1cyBpcyBub3QgY2xvbmVkKS4KICAqLwogc3RhdGljIGludCB0c29fZnJhZ21lbnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuLAotCQkJdW5zaWduZWQgaW50IG1zc19ub3cpCisJCQl1bnNpZ25lZCBpbnQgbXNzX25vdywgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBza19idWZmICpidWZmOwogCWludCBubGVuID0gc2tiLT5sZW4gLSBsZW47CkBAIC0xNDcxLDcgKzE0NzMsNyBAQAogCWlmIChza2ItPmxlbiAhPSBza2ItPmRhdGFfbGVuKQogCQlyZXR1cm4gdGNwX2ZyYWdtZW50KHNrLCBza2IsIGxlbiwgbXNzX25vdyk7CiAKLQlidWZmID0gc2tfc3RyZWFtX2FsbG9jX3NrYihzaywgMCwgR0ZQX0FUT01JQyk7CisJYnVmZiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssIDAsIGdmcCk7CiAJaWYgKHVubGlrZWx5KGJ1ZmYgPT0gTlVMTCkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDg3LDcgKzE0ODksNyBAQAogCiAJLyogUFNIIGFuZCBGSU4gc2hvdWxkIG9ubHkgYmUgc2V0IGluIHRoZSBzZWNvbmQgcGFja2V0LiAqLwogCWZsYWdzID0gVENQX1NLQl9DQihza2IpLT5mbGFnczsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3MgJiB+KFRDUENCX0ZMQUdfRklOIHwgVENQQ0JfRkxBR19QU0gpOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBmbGFncyAmIH4oVENQSERSX0ZJTiB8IFRDUEhEUl9QU0gpOwogCVRDUF9TS0JfQ0IoYnVmZiktPmZsYWdzID0gZmxhZ3M7CiAKIAkvKiBUaGlzIHBhY2tldCB3YXMgbmV2ZXIgc2VudCBvdXQgeWV0LCBzbyBubyBTQUNLIGJpdHMuICovCkBAIC0xNTE4LDcgKzE1MjAsNyBAQAogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAl1MzIgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OwogCi0JaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikKKwlpZiAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUEhEUl9GSU4pCiAJCWdvdG8gc2VuZF9ub3c7CiAKIAlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfT3BlbikKQEAgLTE2NDQsNyArMTY0Niw3IEBACiAKIAlUQ1BfU0tCX0NCKG5za2IpLT5zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAlUQ1BfU0tCX0NCKG5za2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyBwcm9iZV9zaXplOwotCVRDUF9TS0JfQ0IobnNrYiktPmZsYWdzID0gVENQQ0JfRkxBR19BQ0s7CisJVENQX1NLQl9DQihuc2tiKS0+ZmxhZ3MgPSBUQ1BIRFJfQUNLOwogCVRDUF9TS0JfQ0IobnNrYiktPnNhY2tlZCA9IDA7CiAJbnNrYi0+Y3N1bSA9IDA7CiAJbnNrYi0+aXBfc3VtbWVkID0gc2tiLT5pcF9zdW1tZWQ7CkBAIC0xNjY5LDcgKzE2NzEsNyBAQAogCQkJc2tfd21lbV9mcmVlX3NrYihzaywgc2tiKTsKIAkJfSBlbHNlIHsKIAkJCVRDUF9TS0JfQ0IobnNrYiktPmZsYWdzIHw9IFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJgotCQkJCQkJICAgfihUQ1BDQl9GTEFHX0ZJTnxUQ1BDQl9GTEFHX1BTSCk7CisJCQkJCQkgICB+KFRDUEhEUl9GSU58VENQSERSX1BTSCk7CiAJCQlpZiAoIXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHsKIAkJCQlza2JfcHVsbChza2IsIGNvcHkpOwogCQkJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQpAQCAtMTc2OSw3ICsxNzcxLDcgQEAKIAkJCQkJCSAgICBjd25kX3F1b3RhKTsKIAogCQlpZiAoc2tiLT5sZW4gPiBsaW1pdCAmJgotCQkgICAgdW5saWtlbHkodHNvX2ZyYWdtZW50KHNrLCBza2IsIGxpbWl0LCBtc3Nfbm93KSkpCisJCSAgICB1bmxpa2VseSh0c29fZnJhZ21lbnQoc2ssIHNrYiwgbGltaXQsIG1zc19ub3csIGdmcCkpKQogCQkJYnJlYWs7CiAKIAkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CkBAIC0yMDIwLDcgKzIwMjIsNyBAQAogCiAJaWYgKCFzeXNjdGxfdGNwX3JldHJhbnNfY29sbGFwc2UpCiAJCXJldHVybjsKLQlpZiAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKQorCWlmIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQSERSX1NZTikKIAkJcmV0dXJuOwogCiAJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tX3NhZmUoc2tiLCB0bXAsIHNrKSB7CkBAIC0yMTEyLDcgKzIxMTQsNyBAQAogCSAqIHNpbmNlIGl0IGlzIGNoZWFwIHRvIGRvIHNvIGFuZCBzYXZlcyBieXRlcyBvbiB0aGUgbmV0d29yay4KIAkgKi8KIAlpZiAoc2tiLT5sZW4gPiAwICYmCi0JICAgIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pICYmCisJICAgIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQSERSX0ZJTikgJiYKIAkgICAgdHAtPnNuZF91bmEgPT0gKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAtIDEpKSB7CiAJCWlmICghcHNrYl90cmltKHNrYiwgMCkpIHsKIAkJCS8qIFJldXNlLCBldmVuIHRob3VnaCBpdCBkb2VzIHNvbWUgdW5uZWNlc3Nhcnkgd29yayAqLwpAQCAtMjMwNCw3ICsyMzA2LDcgQEAKIAltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrKTsKIAogCWlmICh0Y3Bfc2VuZF9oZWFkKHNrKSAhPSBOVUxMKSB7Ci0JCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19GSU47CisJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQSERSX0ZJTjsKIAkJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKys7CiAJCXRwLT53cml0ZV9zZXErKzsKIAl9IGVsc2UgewpAQCAtMjMyMSw3ICsyMzIzLDcgQEAKIAkJc2tiX3Jlc2VydmUoc2tiLCBNQVhfVENQX0hFQURFUik7CiAJCS8qIEZJTiBlYXRzIGEgc2VxdWVuY2UgYnl0ZSwgd3JpdGVfc2VxIGFkdmFuY2VkIGJ5IHRjcF9xdWV1ZV9za2IoKS4gKi8KIAkJdGNwX2luaXRfbm9uZGF0YV9za2Ioc2tiLCB0cC0+d3JpdGVfc2VxLAotCQkJCSAgICAgVENQQ0JfRkxBR19BQ0sgfCBUQ1BDQl9GTEFHX0ZJTik7CisJCQkJICAgICBUQ1BIRFJfQUNLIHwgVENQSERSX0ZJTik7CiAJCXRjcF9xdWV1ZV9za2Ioc2ssIHNrYik7CiAJfQogCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIG1zc19ub3csIFRDUF9OQUdMRV9PRkYpOwpAQCAtMjM0Niw3ICsyMzQ4LDcgQEAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzIGFuZCBwcmVwYXJlIGNvbnRyb2wgYml0cy4gKi8KIAlza2JfcmVzZXJ2ZShza2IsIE1BWF9UQ1BfSEVBREVSKTsKIAl0Y3BfaW5pdF9ub25kYXRhX3NrYihza2IsIHRjcF9hY2NlcHRhYmxlX3NlcShzayksCi0JCQkgICAgIFRDUENCX0ZMQUdfQUNLIHwgVENQQ0JfRkxBR19SU1QpOworCQkJICAgICBUQ1BIRFJfQUNLIHwgVENQSERSX1JTVCk7CiAJLyogU2VuZCBpdCBvZmYuICovCiAJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CiAJaWYgKHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYiwgMCwgcHJpb3JpdHkpKQpAQCAtMjM2NiwxMSArMjM2OCwxMSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlza2IgPSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzayk7Ci0JaWYgKHNrYiA9PSBOVUxMIHx8ICEoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKSkgeworCWlmIChza2IgPT0gTlVMTCB8fCAhKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BIRFJfU1lOKSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAidGNwX3NlbmRfc3luYWNrOiB3cm9uZyBxdWV1ZSBzdGF0ZVxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19BQ0spKSB7CisJaWYgKCEoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUEhEUl9BQ0spKSB7CiAJCWlmIChza2JfY2xvbmVkKHNrYikpIHsKIAkJCXN0cnVjdCBza19idWZmICpuc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChuc2tiID09IE5VTEwpCkBAIC0yMzg0LDcgKzIzODYsNyBAQAogCQkJc2tiID0gbnNrYjsKIAkJfQogCi0JCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19BQ0s7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQSERSX0FDSzsKIAkJVENQX0VDTl9zZW5kX3N5bmFjayh0Y3Bfc2soc2spLCBza2IpOwogCX0KIAlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKQEAgLTI0NjMsNyArMjQ2NSw3IEBACiAJICogbm90IGV2ZW4gY29ycmVjdGx5IHNldCkKIAkgKi8KIAl0Y3BfaW5pdF9ub25kYXRhX3NrYihza2IsIHRjcF9yc2socmVxKS0+c250X2lzbiwKLQkJCSAgICAgVENQQ0JfRkxBR19TWU4gfCBUQ1BDQl9GTEFHX0FDSyk7CisJCQkgICAgIFRDUEhEUl9TWU4gfCBUQ1BIRFJfQUNLKTsKIAogCWlmIChPUFRJT05fQ09PS0lFX0VYVEVOU0lPTiAmIG9wdHMub3B0aW9ucykgewogCQlpZiAoc19kYXRhX2Rlc2lyZWQpIHsKQEAgLTI1MTgsNiArMjUyMCw3IEBACiAKIAlyZXR1cm4gc2tiOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfbWFrZV9zeW5hY2spOwogCiAvKiBEbyBhbGwgY29ubmVjdCBzb2NrZXQgc2V0dXBzIHRoYXQgY2FuIGJlIGRvbmUgQUYgaW5kZXBlbmRlbnQuICovCiBzdGF0aWMgdm9pZCB0Y3BfY29ubmVjdF9pbml0KHN0cnVjdCBzb2NrICpzaykKQEAgLTI1OTUsNyArMjU5OCw3IEBACiAJc2tiX3Jlc2VydmUoYnVmZiwgTUFYX1RDUF9IRUFERVIpOwogCiAJdHAtPnNuZF9ueHQgPSB0cC0+d3JpdGVfc2VxOwotCXRjcF9pbml0X25vbmRhdGFfc2tiKGJ1ZmYsIHRwLT53cml0ZV9zZXErKywgVENQQ0JfRkxBR19TWU4pOworCXRjcF9pbml0X25vbmRhdGFfc2tiKGJ1ZmYsIHRwLT53cml0ZV9zZXErKywgVENQSERSX1NZTik7CiAJVENQX0VDTl9zZW5kX3N5bihzaywgYnVmZik7CiAKIAkvKiBTZW5kIGl0IG9mZi4gKi8KQEAgLTI2MjAsNiArMjYyMyw3IEBACiAJCQkJICBpbmV0X2NzayhzayktPmljc2tfcnRvLCBUQ1BfUlRPX01BWCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9jb25uZWN0KTsKIAogLyogU2VuZCBvdXQgYSBkZWxheWVkIGFjaywgdGhlIGNhbGxlciBkb2VzIHRoZSBwb2xpY3kgY2hlY2tpbmcKICAqIHRvIHNlZSBpZiB3ZSBzaG91bGQgZXZlbiBiZSBoZXJlLiAgU2VlIHRjcF9pbnB1dC5jOnRjcF9hY2tfc25kX2NoZWNrKCkKQEAgLTI3MDEsNyArMjcwNSw3IEBACiAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzIGFuZCBwcmVwYXJlIGNvbnRyb2wgYml0cy4gKi8KIAlza2JfcmVzZXJ2ZShidWZmLCBNQVhfVENQX0hFQURFUik7Ci0JdGNwX2luaXRfbm9uZGF0YV9za2IoYnVmZiwgdGNwX2FjY2VwdGFibGVfc2VxKHNrKSwgVENQQ0JfRkxBR19BQ0spOworCXRjcF9pbml0X25vbmRhdGFfc2tiKGJ1ZmYsIHRjcF9hY2NlcHRhYmxlX3NlcShzayksIFRDUEhEUl9BQ0spOwogCiAJLyogU2VuZCBpdCBvZmYsIHRoaXMgY2xlYXJzIGRlbGF5ZWQgYWNrcyBmb3IgdXMuICovCiAJVENQX1NLQl9DQihidWZmKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwpAQCAtMjczNSw3ICsyNzM5LDcgQEAKIAkgKiBlbmQgdG8gc2VuZCBhbiBhY2suICBEb24ndCBxdWV1ZSBvciBjbG9uZSBTS0IsIGp1c3QKIAkgKiBzZW5kIGl0LgogCSAqLwotCXRjcF9pbml0X25vbmRhdGFfc2tiKHNrYiwgdHAtPnNuZF91bmEgLSAhdXJnZW50LCBUQ1BDQl9GTEFHX0FDSyk7CisJdGNwX2luaXRfbm9uZGF0YV9za2Ioc2tiLCB0cC0+c25kX3VuYSAtICF1cmdlbnQsIFRDUEhEUl9BQ0spOwogCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwogCXJldHVybiB0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IsIDAsIEdGUF9BVE9NSUMpOwogfQpAQCAtMjc2NSwxMyArMjc2OSwxMyBAQAogCQlpZiAoc2VnX3NpemUgPCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSB8fAogCQkgICAgc2tiLT5sZW4gPiBtc3MpIHsKIAkJCXNlZ19zaXplID0gbWluKHNlZ19zaXplLCBtc3MpOwotCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQSERSX1BTSDsKIAkJCWlmICh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgc2VnX3NpemUsIG1zcykpCiAJCQkJcmV0dXJuIC0xOwogCQl9IGVsc2UgaWYgKCF0Y3Bfc2tiX3Bjb3VudChza2IpKQogCQkJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIHNrYiwgbXNzKTsKIAotCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUENCX0ZMQUdfUFNIOworCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUEhEUl9QU0g7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwogCQllcnIgPSB0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IsIDEsIEdGUF9BVE9NSUMpOwogCQlpZiAoIWVycikKQEAgLTI4MjQsMTAgKzI4MjgsMyBAQAogCQkJCQkgIFRDUF9SVE9fTUFYKTsKIAl9CiB9Ci0KLUVYUE9SVF9TWU1CT0wodGNwX3NlbGVjdF9pbml0aWFsX3dpbmRvdyk7Ci1FWFBPUlRfU1lNQk9MKHRjcF9jb25uZWN0KTsKLUVYUE9SVF9TWU1CT0wodGNwX21ha2Vfc3luYWNrKTsKLUVYUE9SVF9TWU1CT0wodGNwX3NpbXBsZV9yZXRyYW5zbWl0KTsKLUVYUE9SVF9TWU1CT0wodGNwX3N5bmNfbXNzKTsKLUVYUE9SVF9TWU1CT0wodGNwX210dXBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IDQ0MGE1YzYwLi44MDhiYjkyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdGltZXIuYworKysgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwpAQCAtNDEsNyArNDEsNiBAQAogCWluZXRfY3NrX2luaXRfeG1pdF90aW1lcnMoc2ssICZ0Y3Bfd3JpdGVfdGltZXIsICZ0Y3BfZGVsYWNrX3RpbWVyLAogCQkJCSAgJnRjcF9rZWVwYWxpdmVfdGltZXIpOwogfQotCiBFWFBPUlRfU1lNQk9MKHRjcF9pbml0X3htaXRfdGltZXJzKTsKIAogc3RhdGljIHZvaWQgdGNwX3dyaXRlX2VycihzdHJ1Y3Qgc29jayAqc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90dW5uZWw0LmMgYi9uZXQvaXB2NC90dW5uZWw0LmMKaW5kZXggM2IzODEzYy4uNTkxODZjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdHVubmVsNC5jCisrKyBiL25ldC9pcHY0L3R1bm5lbDQuYwpAQCAtNDgsNyArNDgsNiBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQogRVhQT1JUX1NZTUJPTCh4ZnJtNF90dW5uZWxfcmVnaXN0ZXIpOwogCiBpbnQgeGZybTRfdHVubmVsX2RlcmVnaXN0ZXIoc3RydWN0IHhmcm1fdHVubmVsICpoYW5kbGVyLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCkBAIC03Miw3ICs3MSw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotCiBFWFBPUlRfU1lNQk9MKHhmcm00X3R1bm5lbF9kZXJlZ2lzdGVyKTsKIAogc3RhdGljIGludCB0dW5uZWw0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBlZWM0ZmY0Li4zMmUwYmVmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtOTE0LDcgKzkxNCw3IEBACiAJCSAgICAhc29ja19mbGFnKHNrLCBTT0NLX0JST0FEQ0FTVCkpCiAJCQlnb3RvIG91dDsKIAkJaWYgKGNvbm5lY3RlZCkKLQkJCXNrX2RzdF9zZXQoc2ssIGRzdF9jbG9uZSgmcnQtPnUuZHN0KSk7CisJCQlza19kc3Rfc2V0KHNrLCBkc3RfY2xvbmUoJnJ0LT5kc3QpKTsKIAl9CiAKIAlpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX0NPTkZJUk0pCkBAIC05NzgsNyArOTc4LDcgQEAKIAlyZXR1cm4gZXJyOwogCiBkb19jb25maXJtOgotCWRzdF9jb25maXJtKCZydC0+dS5kc3QpOworCWRzdF9jb25maXJtKCZydC0+ZHN0KTsKIAlpZiAoIShtc2ctPm1zZ19mbGFncyZNU0dfUFJPQkUpIHx8IGxlbikKIAkJZ290byBiYWNrX2Zyb21fY29uZmlybTsKIAllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwbGl0ZS5jIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCmluZGV4IDY2MTBiZjcuLmFiNzZhYTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcGxpdGUuYworKysgYi9uZXQvaXB2NC91ZHBsaXRlLmMKQEAgLTU4LDYgKzU4LDcgQEAKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfdWRwX2dldHNvY2tvcHQsCiAjZW5kaWYKIH07CitFWFBPUlRfU1lNQk9MKHVkcGxpdGVfcHJvdCk7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9wcm90b3N3IHVkcGxpdGU0X3Byb3Rvc3cgPSB7CiAJLnR5cGUJCT0gIFNPQ0tfREdSQU0sCkBAIC0xMjcsNSArMTI4LDMgQEAKIG91dF9yZWdpc3Rlcl9lcnI6CiAJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IENhbm5vdCBhZGQgVURQLUxpdGUgcHJvdG9jb2wuXG4iLCBfX2Z1bmNfXyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wodWRwbGl0ZV9wcm90KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X2lucHV0LmMgYi9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCmluZGV4IGFkOGZiYjguLjA2ODE0YjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X2lucHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfaW5wdXQuYwpAQCAtMTYzLDUgKzE2Myw0IEBACiB7CiAJcmV0dXJuIHhmcm00X3Jjdl9zcGkoc2tiLCBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsIDApOwogfQotCiBFWFBPUlRfU1lNQk9MKHhmcm00X3Jjdik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCmluZGV4IDIzODgzYTQuLjg2OTA3OGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCkBAIC0zNyw3ICszNyw3IEBACiAJCWZsLmZsNF9zcmMgPSBzYWRkci0+YTQ7CiAKIAllcnIgPSBfX2lwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmcnQsICZmbCk7Ci0JZHN0ID0gJnJ0LT51LmRzdDsKKwlkc3QgPSAmcnQtPmRzdDsKIAlpZiAoZXJyKQogCQlkc3QgPSBFUlJfUFRSKGVycik7CiAJcmV0dXJuIGRzdDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGUxYTY5OGQuLmFiNzBhM2YgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMTIxLDggKzEyMSw2IEBACiBzdGF0aWMgaW50IF9faXB2Nl9yZWdlbl9ybmRpZChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKIHN0YXRpYyBpbnQgX19pcHY2X3RyeV9yZWdlbl9ybmRpZChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnRtcGFkZHIpOwogc3RhdGljIHZvaWQgaXB2Nl9yZWdlbl9ybmRpZCh1bnNpZ25lZCBsb25nIGRhdGEpOwotCi1zdGF0aWMgaW50IGRlc3luY19mYWN0b3IgPSBNQVhfREVTWU5DX0ZBQ1RPUiAqIEhaOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgaXB2Nl9nZW5lcmF0ZV9ldWk2NCh1OCAqZXVpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTI4NCwxMyArMjgyLDE2IEBACiBzdGF0aWMgaW50IHNubXA2X2FsbG9jX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQogewogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKWlkZXYtPnN0YXRzLmlwdjYsCi0JCQkgIHNpemVvZihzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCisJCQkgIHNpemVvZihzdHJ1Y3QgaXBzdGF0c19taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCiAJCWdvdG8gZXJyX2lwOwogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKWlkZXYtPnN0YXRzLmljbXB2NiwKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQorCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nl9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKIAkJZ290byBlcnJfaWNtcDsKIAlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKilpZGV2LT5zdGF0cy5pY21wdjZtc2csCi0JCQkgIHNpemVvZihzdHJ1Y3QgaWNtcHY2bXNnX21pYikpIDwgMCkKKwkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wdjZtc2dfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXB2Nm1zZ19taWIpKSA8IDApCiAJCWdvdG8gZXJyX2ljbXBtc2c7CiAKIAlyZXR1cm4gMDsKQEAgLTU1Nyw3ICs1NTgsNyBAQAogCQlwcl93YXJuaW5nKCJGcmVlaW5nIGFsaXZlIGluZXQ2IGFkZHJlc3MgJXBcbiIsIGlmcCk7CiAJCXJldHVybjsKIAl9Ci0JZHN0X3JlbGVhc2UoJmlmcC0+cnQtPnUuZHN0KTsKKwlkc3RfcmVsZWFzZSgmaWZwLT5ydC0+ZHN0KTsKIAogCWNhbGxfcmN1KCZpZnAtPnJjdSwgaW5ldDZfaWZhX2ZpbmlzaF9kZXN0cm95X3JjdSk7CiB9CkBAIC04MjMsNyArODI0LDcgQEAKIAkJCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKIAkJCX0KIAkJfQotCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCX0KIAogb3V0OgpAQCAtODkwLDcgKzg5MSw4IEBACiAJCQkgICAgICBpZGV2LT5jbmYudGVtcF92YWxpZF9sZnQpOwogCXRtcF9wcmVmZXJlZF9sZnQgPSBtaW5fdChfX3UzMiwKIAkJCQkgaWZwLT5wcmVmZXJlZF9sZnQsCi0JCQkJIGlkZXYtPmNuZi50ZW1wX3ByZWZlcmVkX2xmdCAtIGRlc3luY19mYWN0b3IgLyBIWik7CisJCQkJIGlkZXYtPmNuZi50ZW1wX3ByZWZlcmVkX2xmdCAtCisJCQkJIGlkZXYtPmNuZi5tYXhfZGVzeW5jX2ZhY3Rvcik7CiAJdG1wX3BsZW4gPSBpZnAtPnByZWZpeF9sZW47CiAJbWF4X2FkZHJlc3NlcyA9IGlkZXYtPmNuZi5tYXhfYWRkcmVzc2VzOwogCXRtcF9jc3RhbXAgPSBpZnAtPmNzdGFtcDsKQEAgLTE2NTAsNyArMTY1Miw4IEBACiAKIAlleHBpcmVzID0gamlmZmllcyArCiAJCWlkZXYtPmNuZi50ZW1wX3ByZWZlcmVkX2xmdCAqIEhaIC0KLQkJaWRldi0+Y25mLnJlZ2VuX21heF9yZXRyeSAqIGlkZXYtPmNuZi5kYWRfdHJhbnNtaXRzICogaWRldi0+bmRfcGFybXMtPnJldHJhbnNfdGltZSAtIGRlc3luY19mYWN0b3I7CisJCWlkZXYtPmNuZi5yZWdlbl9tYXhfcmV0cnkgKiBpZGV2LT5jbmYuZGFkX3RyYW5zbWl0cyAqIGlkZXYtPm5kX3Bhcm1zLT5yZXRyYW5zX3RpbWUgLQorCQlpZGV2LT5jbmYubWF4X2Rlc3luY19mYWN0b3IgKiBIWjsKIAlpZiAodGltZV9iZWZvcmUoZXhwaXJlcywgamlmZmllcykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJImlwdjZfcmVnZW5fcm5kaWQoKTogdG9vIHNob3J0IHJlZ2VuZXJhdGlvbiBpbnRlcnZhbDsgdGltZXIgZGlzYWJsZWQgZm9yICVzLlxuIiwKQEAgLTE3NjAsNyArMTc2MywxMCBAQAogCiAJaWRldiA9IGlwdjZfZmluZF9pZGV2KGRldik7CiAJaWYgKCFpZGV2KQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0JVRlMpOworCisJaWYgKGlkZXYtPmNuZi5kaXNhYmxlX2lwdjYpCisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCiAJLyogQWRkIGRlZmF1bHQgbXVsdGljYXN0IHJvdXRlICovCiAJYWRkcmNvbmZfYWRkX21yb3V0ZShkZXYpOwpAQCAtMTg2Myw3ICsxODY5LDcgQEAKIAkJCQkJICAgICAgZGV2LCBleHBpcmVzLCBmbGFncyk7CiAJCX0KIAkJaWYgKHJ0KQotCQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJfQogCiAJLyogVHJ5IHRvIGZpZ3VyZSBvdXQgb3VyIGxvY2FsIGFkZHJlc3MgZm9yIHRoaXMgcHJlZml4ICovCkBAIC0yMTI5LDggKzIxMzUsOSBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICgoaWRldiA9IGFkZHJjb25mX2FkZF9kZXYoZGV2KSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCWlkZXYgPSBhZGRyY29uZl9hZGRfZGV2KGRldik7CisJaWYgKElTX0VSUihpZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoaWRldik7CiAKIAlzY29wZSA9IGlwdjZfYWRkcl9zY29wZShwZngpOwogCkBAIC0yMzc3LDcgKzIzODQsNyBAQAogCX0KIAogCWlkZXYgPSBhZGRyY29uZl9hZGRfZGV2KGRldik7Ci0JaWYgKGlkZXYgPT0gTlVMTCkKKwlpZiAoSVNfRVJSKGlkZXYpKQogCQlyZXR1cm47CiAKIAltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKQEAgLTI0NjgsNyArMjQ3NSw3IEBACiAJQVNTRVJUX1JUTkwoKTsKIAogCWlkZXYgPSBhZGRyY29uZl9hZGRfZGV2KGRldik7Ci0JaWYgKCFpZGV2KSB7CisJaWYgKElTX0VSUihpZGV2KSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiaW5pdCBpcDYtaXA2OiBhZGRfZGV2IGZhaWxlZFxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0zNDkyLDggKzM0OTksMTIgQEAKIAkJCQlwcmVmZXJyZWQgLT0gdHZhbDsKIAkJCWVsc2UKIAkJCQlwcmVmZXJyZWQgPSAwOwotCQkJaWYgKHZhbGlkICE9IElORklOSVRZX0xJRkVfVElNRSkKLQkJCQl2YWxpZCAtPSB0dmFsOworCQkJaWYgKHZhbGlkICE9IElORklOSVRZX0xJRkVfVElNRSkgeworCQkJCWlmICh2YWxpZCA+IHR2YWwpCisJCQkJCXZhbGlkIC09IHR2YWw7CisJCQkJZWxzZQorCQkJCQl2YWxpZCA9IDA7CisJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlwcmVmZXJyZWQgPSBJTkZJTklUWV9MSUZFX1RJTUU7CkBAIC0zODU1LDEyICszODY2LDI4IEBACiAJbWVtc2V0KCZzdGF0c1tpdGVtc10sIDAsIHBhZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NubXA2X2ZpbGxfc3RhdHM2NCh1NjQgKnN0YXRzLCB2b2lkIF9fcGVyY3B1ICoqbWliLAorCQkJCSAgICAgIGludCBpdGVtcywgaW50IGJ5dGVzLCBzaXplX3Qgc3luY3BvZmYpCit7CisJaW50IGk7CisJaW50IHBhZCA9IGJ5dGVzIC0gc2l6ZW9mKHU2NCkgKiBpdGVtczsKKwlCVUdfT04ocGFkIDwgMCk7CisKKwkvKiBVc2UgcHV0X3VuYWxpZ25lZCgpIGJlY2F1c2Ugc3RhdHMgbWF5IG5vdCBiZSBhbGlnbmVkIGZvciB1NjQuICovCisJcHV0X3VuYWxpZ25lZChpdGVtcywgJnN0YXRzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgaXRlbXM7IGkrKykKKwkJcHV0X3VuYWxpZ25lZChzbm1wX2ZvbGRfZmllbGQ2NChtaWIsIGksIHN5bmNwb2ZmKSwgJnN0YXRzW2ldKTsKKworCW1lbXNldCgmc3RhdHNbaXRlbXNdLCAwLCBwYWQpOworfQorCiBzdGF0aWMgdm9pZCBzbm1wNl9maWxsX3N0YXRzKHU2NCAqc3RhdHMsIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIGludCBhdHRydHlwZSwKIAkJCSAgICAgaW50IGJ5dGVzKQogewogCXN3aXRjaCAoYXR0cnR5cGUpIHsKIAljYXNlIElGTEFfSU5FVDZfU1RBVFM6Ci0JCV9fc25tcDZfZmlsbF9zdGF0cyhzdGF0cywgKHZvaWQgX19wZXJjcHUgKiopaWRldi0+c3RhdHMuaXB2NiwgSVBTVEFUU19NSUJfTUFYLCBieXRlcyk7CisJCV9fc25tcDZfZmlsbF9zdGF0czY0KHN0YXRzLCAodm9pZCBfX3BlcmNwdSAqKilpZGV2LT5zdGF0cy5pcHY2LAorCQkJCSAgICAgSVBTVEFUU19NSUJfTUFYLCBieXRlcywgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpOwogCQlicmVhazsKIAljYXNlIElGTEFfSU5FVDZfSUNNUDZTVEFUUzoKIAkJX19zbm1wNl9maWxsX3N0YXRzKHN0YXRzLCAodm9pZCBfX3BlcmNwdSAqKilpZGV2LT5zdGF0cy5pY21wdjYsIElDTVA2X01JQl9NQVgsIGJ5dGVzKTsKQEAgLTQwOTMsMTEgKzQxMjAsMTEgQEAKIAkJaWYgKGlmcC0+aWRldi0+Y25mLmZvcndhcmRpbmcpCiAJCQlhZGRyY29uZl9sZWF2ZV9hbnljYXN0KGlmcCk7CiAJCWFkZHJjb25mX2xlYXZlX3NvbGljdChpZnAtPmlkZXYsICZpZnAtPmFkZHIpOwotCQlkc3RfaG9sZCgmaWZwLT5ydC0+dS5kc3QpOworCQlkc3RfaG9sZCgmaWZwLT5ydC0+ZHN0KTsKIAogCQlpZiAoaWZwLT5zdGF0ZSA9PSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRCAmJgogCQkgICAgaXA2X2RlbF9ydChpZnAtPnJ0KSkKLQkJCWRzdF9mcmVlKCZpZnAtPnJ0LT51LmRzdCk7CisJCQlkc3RfZnJlZSgmaWZwLT5ydC0+ZHN0KTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmxhYmVsLmMgYi9uZXQvaXB2Ni9hZGRybGFiZWwuYwppbmRleCA4YzQzNDhjLi5mMGU3NzRjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRybGFiZWwuYworKysgYi9uZXQvaXB2Ni9hZGRybGFiZWwuYwpAQCAtNTMsMTEgKzUzLDcgQEAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBuZXQgKmlwNmFkZHJsYmxfbmV0KGNvbnN0IHN0cnVjdCBpcDZhZGRybGJsX2VudHJ5ICpsYmwpCiB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJldHVybiBsYmwtPmxibF9uZXQ7Ci0jZWxzZQotCXJldHVybiAmaW5pdF9uZXQ7Ci0jZW5kaWYKKwlyZXR1cm4gcmVhZF9wbmV0KCZsYmwtPmxibF9uZXQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggZTczMzk0MmQuLjU2YjliZjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtNTIyLDEwICs1MjIsMTAgQEAKIAkuc2h1dGRvd24JICAgPSBpbmV0X3NodXRkb3duLAkJLyogb2sJCSovCiAJLnNldHNvY2tvcHQJICAgPSBzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAkvKiBvawkJKi8KIAkuZ2V0c29ja29wdAkgICA9IHNvY2tfY29tbW9uX2dldHNvY2tvcHQsCS8qIG9rCQkqLwotCS5zZW5kbXNnCSAgID0gdGNwX3NlbmRtc2csCQkvKiBvawkJKi8KLQkucmVjdm1zZwkgICA9IHNvY2tfY29tbW9uX3JlY3Ztc2csCS8qIG9rCQkqLworCS5zZW5kbXNnCSAgID0gaW5ldF9zZW5kbXNnLAkJLyogb2sJCSovCisJLnJlY3Ztc2cJICAgPSBpbmV0X3JlY3Ztc2csCQkvKiBvawkJKi8KIAkubW1hcAkJICAgPSBzb2NrX25vX21tYXAsCi0JLnNlbmRwYWdlCSAgID0gdGNwX3NlbmRwYWdlLAorCS5zZW5kcGFnZQkgICA9IGluZXRfc2VuZHBhZ2UsCiAJLnNwbGljZV9yZWFkCSAgID0gdGNwX3NwbGljZV9yZWFkLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfc29ja19jb21tb25fc2V0c29ja29wdCwKQEAgLTU0OSw3ICs1NDksNyBAQAogCS5zZXRzb2Nrb3B0CSAgID0gc29ja19jb21tb25fc2V0c29ja29wdCwJLyogb2sJCSovCiAJLmdldHNvY2tvcHQJICAgPSBzb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LAkvKiBvawkJKi8KIAkuc2VuZG1zZwkgICA9IGluZXRfc2VuZG1zZywJCS8qIG9rCQkqLwotCS5yZWN2bXNnCSAgID0gc29ja19jb21tb25fcmVjdm1zZywJLyogb2sJCSovCisJLnJlY3Ztc2cJICAgPSBpbmV0X3JlY3Ztc2csCQkvKiBvawkJKi8KIAkubW1hcAkJICAgPSBzb2NrX25vX21tYXAsCiAJLnNlbmRwYWdlCSAgID0gc29ja19ub19zZW5kcGFnZSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC02NTEsNyArNjUxLDcgQEAKIAogCWlmIChkc3QgPT0gTlVMTCkgewogCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0JCXN0cnVjdCBpbjZfYWRkciAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCQlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AsIGZpbmFsOwogCQlzdHJ1Y3QgZmxvd2kgZmw7CiAKIAkJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CkBAIC02NjUsMTIgKzY2NSw3IEBACiAJCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+aW5ldF9zcG9ydDsKIAkJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKIAotCQlpZiAobnAtPm9wdCAmJiBucC0+b3B0LT5zcmNydCkgewotCQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBucC0+b3B0LT5zcmNydDsKLQkJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7Ci0JCQlmaW5hbF9wID0gJmZpbmFsOwotCQl9CisJCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmwsIG5wLT5vcHQsICZmaW5hbCk7CiAKIAkJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CiAJCWlmIChlcnIpIHsKQEAgLTk3NiwxOSArOTcxLDI0IEBACiBzdGF0aWMgaW50IF9fbmV0X2luaXQgaXB2Nl9pbml0X21pYnMoc3RydWN0IG5ldCAqbmV0KQogewogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnVkcF9zdGF0c19pbjYsCi0JCQkgIHNpemVvZiAoc3RydWN0IHVkcF9taWIpKSA8IDApCisJCQkgIHNpemVvZihzdHJ1Y3QgdWRwX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRzX2luNiwKLQkJCSAgc2l6ZW9mIChzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCiAJCWdvdG8gZXJyX3VkcGxpdGVfbWliOwogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmlwdjZfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKIAkJZ290byBlcnJfaXBfbWliOwogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nl9taWIpKSA8IDApCisJCQkgIHNpemVvZihzdHJ1Y3QgaWNtcHY2X21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQogCQlnb3RvIGVycl9pY21wX21pYjsKIAlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pY21wdjZtc2dfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wdjZtc2dfbWliKSkgPCAwKQorCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nm1zZ19taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2bXNnX21pYikpIDwgMCkKIAkJZ290byBlcnJfaWNtcG1zZ19taWI7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FueWNhc3QuYyBiL25ldC9pcHY2L2FueWNhc3QuYwppbmRleCBiNWIwNzA1Li4wZTVlOTQzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hbnljYXN0LmMKKysrIGIvbmV0L2lwdjYvYW55Y2FzdC5jCkBAIC03Nyw0MSArNzcsNDAgQEAKIAlwYWMtPmFjbF9uZXh0ID0gTlVMTDsKIAlpcHY2X2FkZHJfY29weSgmcGFjLT5hY2xfYWRkciwgYWRkcik7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKGlmaW5kZXggPT0gMCkgewogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCiAJCXJ0ID0gcnQ2X2xvb2t1cChuZXQsIGFkZHIsIE5VTEwsIDAsIDApOwogCQlpZiAocnQpIHsKIAkJCWRldiA9IHJ0LT5ydDZpX2RldjsKLQkJCWRldl9ob2xkKGRldik7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJfSBlbHNlIGlmIChpc2hvc3QpIHsKIAkJCWVyciA9IC1FQUREUk5PVEFWQUlMOwotCQkJZ290byBvdXRfZnJlZV9wYWM7CisJCQlnb3RvIGVycm9yOwogCQl9IGVsc2UgewogCQkJLyogcm91dGVyLCBubyBtYXRjaGluZyBpbnRlcmZhY2U6IGp1c3QgcGljayBvbmUgKi8KLQotCQkJZGV2ID0gZGV2X2dldF9ieV9mbGFncyhuZXQsIElGRl9VUCwgSUZGX1VQfElGRl9MT09QQkFDSyk7CisJCQlkZXYgPSBkZXZfZ2V0X2J5X2ZsYWdzX3JjdShuZXQsIElGRl9VUCwKKwkJCQkJCSAgIElGRl9VUCB8IElGRl9MT09QQkFDSyk7CiAJCX0KIAl9IGVsc2UKLQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIGlmaW5kZXgpOwogCiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2ZyZWVfcGFjOworCQlnb3RvIGVycm9yOwogCX0KIAotCWlkZXYgPSBpbjZfZGV2X2dldChkZXYpOworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CiAJaWYgKCFpZGV2KSB7CiAJCWlmIChpZmluZGV4KQogCQkJZXJyID0gLUVOT0RFVjsKIAkJZWxzZQogCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7Ci0JCWdvdG8gb3V0X2Rldl9wdXQ7CisJCWdvdG8gZXJyb3I7CiAJfQogCS8qIHJlc2V0IGlzaG9zdCwgbm93IHRoYXQgd2UgaGF2ZSBhIHNwZWNpZmljIGRldmljZSAqLwogCWlzaG9zdCA9ICFpZGV2LT5jbmYuZm9yd2FyZGluZzsKLQlpbjZfZGV2X3B1dChpZGV2KTsKIAogCXBhYy0+YWNsX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAKQEAgLTEyNCwyNiArMTIzLDIyIEBACiAJCWlmIChpc2hvc3QpCiAJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKIAkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2Rldl9wdXQ7CisJCQlnb3RvIGVycm9yOwogCX0KIAogCWVyciA9IGlwdjZfZGV2X2FjX2luYyhkZXYsIGFkZHIpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2Rldl9wdXQ7CisJaWYgKCFlcnIpIHsKKwkJd3JpdGVfbG9ja19iaCgmaXB2Nl9za19hY19sb2NrKTsKKwkJcGFjLT5hY2xfbmV4dCA9IG5wLT5pcHY2X2FjX2xpc3Q7CisJCW5wLT5pcHY2X2FjX2xpc3QgPSBwYWM7CisJCXdyaXRlX3VubG9ja19iaCgmaXB2Nl9za19hY19sb2NrKTsKKwkJcGFjID0gTlVMTDsKKwl9CiAKLQl3cml0ZV9sb2NrX2JoKCZpcHY2X3NrX2FjX2xvY2spOwotCXBhYy0+YWNsX25leHQgPSBucC0+aXB2Nl9hY19saXN0OwotCW5wLT5pcHY2X2FjX2xpc3QgPSBwYWM7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcHY2X3NrX2FjX2xvY2spOwotCi0JZGV2X3B1dChkZXYpOwotCi0JcmV0dXJuIDA7Ci0KLW91dF9kZXZfcHV0OgotCWRldl9wdXQoZGV2KTsKLW91dF9mcmVlX3BhYzoKLQlzb2NrX2tmcmVlX3Moc2ssIHBhYywgc2l6ZW9mKCpwYWMpKTsKK2Vycm9yOgorCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChwYWMpCisJCXNvY2tfa2ZyZWVfcyhzaywgcGFjLCBzaXplb2YoKnBhYykpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3NiwxMSArMTcxLDEyIEBACiAKIAl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CiAKLQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgcGFjLT5hY2xfaWZpbmRleCk7Ci0JaWYgKGRldikgeworCXJjdV9yZWFkX2xvY2soKTsKKwlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIHBhYy0+YWNsX2lmaW5kZXgpOworCWlmIChkZXYpCiAJCWlwdjZfZGV2X2FjX2RlYyhkZXYsICZwYWMtPmFjbF9hZGRyKTsKLQkJZGV2X3B1dChkZXYpOwotCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCXNvY2tfa2ZyZWVfcyhzaywgcGFjLCBzaXplb2YoKnBhYykpOwogCXJldHVybiAwOwogfQpAQCAtMTk5LDEzICsxOTUsMTIgQEAKIAl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CiAKIAlwcmV2X2luZGV4ID0gMDsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJd2hpbGUgKHBhYykgewogCQlzdHJ1Y3QgaXB2Nl9hY19zb2NrbGlzdCAqbmV4dCA9IHBhYy0+YWNsX25leHQ7CiAKIAkJaWYgKHBhYy0+YWNsX2lmaW5kZXggIT0gcHJldl9pbmRleCkgewotCQkJaWYgKGRldikKLQkJCQlkZXZfcHV0KGRldik7Ci0JCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgcGFjLT5hY2xfaWZpbmRleCk7CisJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIHBhYy0+YWNsX2lmaW5kZXgpOwogCQkJcHJldl9pbmRleCA9IHBhYy0+YWNsX2lmaW5kZXg7CiAJCX0KIAkJaWYgKGRldikKQEAgLTIxMyw4ICsyMDgsNyBAQAogCQlzb2NrX2tmcmVlX3Moc2ssIHBhYywgc2l6ZW9mKCpwYWMpKTsKIAkJcGFjID0gbmV4dDsKIAl9Ci0JaWYgKGRldikKLQkJZGV2X3B1dChkZXYpOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAjaWYgMApAQCAtMjUwLDcgKzI0NCw3IEBACiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmFjLT5hY2FfcmVmY250KSkgewogCQlpbjZfZGV2X3B1dChhYy0+YWNhX2lkZXYpOwotCQlkc3RfcmVsZWFzZSgmYWMtPmFjYV9ydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmYWMtPmFjYV9ydC0+ZHN0KTsKIAkJa2ZyZWUoYWMpOwogCX0KIH0KQEAgLTM1Niw0MCArMzUwLDM5IEBACiAJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAlhZGRyY29uZl9sZWF2ZV9zb2xpY3QoaWRldiwgJmFjYS0+YWNhX2FkZHIpOwogCi0JZHN0X2hvbGQoJmFjYS0+YWNhX3J0LT51LmRzdCk7CisJZHN0X2hvbGQoJmFjYS0+YWNhX3J0LT5kc3QpOwogCWlwNl9kZWxfcnQoYWNhLT5hY2FfcnQpOwogCiAJYWNhX3B1dChhY2EpOwogCXJldHVybiAwOwogfQogCisvKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrKCkgKi8KIHN0YXRpYyBpbnQgaXB2Nl9kZXZfYWNfZGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKIHsKLQlpbnQgcmV0OwotCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpbjZfZGV2X2dldChkZXYpOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CisKIAlpZiAoaWRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXQgPSBfX2lwdjZfZGV2X2FjX2RlYyhpZGV2LCBhZGRyKTsKLQlpbjZfZGV2X3B1dChpZGV2KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBfX2lwdjZfZGV2X2FjX2RlYyhpZGV2LCBhZGRyKTsKIH0KIAogLyoKICAqCWNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaGFzIHRoaXMgYW55Y2FzdCBhZGRyZXNzCisgKgljYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrKCkKICAqLwogc3RhdGljIGludCBpcHY2X2Noa19hY2FzdF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IGlmYWNhZGRyNiAqYWNhOwogCi0JaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisJaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKIAlpZiAoaWRldikgewogCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOwogCQlmb3IgKGFjYSA9IGlkZXYtPmFjX2xpc3Q7IGFjYTsgYWNhID0gYWNhLT5hY2FfbmV4dCkKIAkJCWlmIChpcHY2X2FkZHJfZXF1YWwoJmFjYS0+YWNhX2FkZHIsIGFkZHIpKQogCQkJCWJyZWFrOwogCQlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7Ci0JCWluNl9kZXZfcHV0KGlkZXYpOwogCQlyZXR1cm4gYWNhICE9IE5VTEw7CiAJfQogCXJldHVybiAwOwpAQCAtNDAzLDE0ICszOTYsMTUgQEAKIHsKIAlpbnQgZm91bmQgPSAwOwogCi0JaWYgKGRldikKLQkJcmV0dXJuIGlwdjZfY2hrX2FjYXN0X2RldihkZXYsIGFkZHIpOwogCXJjdV9yZWFkX2xvY2soKTsKLQlmb3JfZWFjaF9uZXRkZXZfcmN1KG5ldCwgZGV2KQotCQlpZiAoaXB2Nl9jaGtfYWNhc3RfZGV2KGRldiwgYWRkcikpIHsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9CisJaWYgKGRldikKKwkJZm91bmQgPSBpcHY2X2Noa19hY2FzdF9kZXYoZGV2LCBhZGRyKTsKKwllbHNlCisJCWZvcl9lYWNoX25ldGRldl9yY3UobmV0LCBkZXYpCisJCQlpZiAoaXB2Nl9jaGtfYWNhc3RfZGV2KGRldiwgYWRkcikpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIGZvdW5kOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZGF0YWdyYW0uYyBiL25ldC9pcHY2L2RhdGFncmFtLmMKaW5kZXggNzEyNjg0Ni4uN2Q5MjlhMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0zOCwxMCArMzgsMTEgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42CSp1c2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgdWFkZHI7CiAJc3RydWN0IGluZXRfc29jayAgICAgIAkqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcHY2X3BpbmZvICAgICAgCSpucCA9IGluZXQ2X3NrKHNrKTsKLQlzdHJ1Y3QgaW42X2FkZHIJCSpkYWRkciwgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwlzdHJ1Y3QgaW42X2FkZHIJCSpkYWRkciwgKmZpbmFsX3AsIGZpbmFsOwogCXN0cnVjdCBkc3RfZW50cnkJKmRzdDsKIAlzdHJ1Y3QgZmxvd2kJCWZsOwogCXN0cnVjdCBpcDZfZmxvd2xhYmVsCSpmbG93bGFiZWwgPSBOVUxMOworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAgICpvcHQ7CiAJaW50CQkJYWRkcl90eXBlOwogCWludAkJCWVycjsKIApAQCAtMTU1LDE5ICsxNTYsOCBAQAogCiAJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKIAotCWlmIChmbG93bGFiZWwpIHsKLQkJaWYgKGZsb3dsYWJlbC0+b3B0ICYmIGZsb3dsYWJlbC0+b3B0LT5zcmNydCkgewotCQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBmbG93bGFiZWwtPm9wdC0+c3JjcnQ7Ci0JCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKLQkJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOwotCQkJZmluYWxfcCA9ICZmaW5hbDsKLQkJfQotCX0gZWxzZSBpZiAobnAtPm9wdCAmJiBucC0+b3B0LT5zcmNydCkgewotCQlzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopbnAtPm9wdC0+c3JjcnQ7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOwotCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgcnQwLT5hZGRyKTsKLQkJZmluYWxfcCA9ICZmaW5hbDsKLQl9CisJb3B0ID0gZmxvd2xhYmVsID8gZmxvd2xhYmVsLT5vcHQgOiBucC0+b3B0OworCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmwsIG9wdCwgJmZpbmFsKTsKIAogCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzLmMgYi9uZXQvaXB2Ni9leHRoZHJzLmMKaW5kZXggOGE2NTlmOS4uMjYyZjEwNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRycy5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnMuYwpAQCAtMzEyLDYgKzMxMiw3IEBACiAgIFJvdXRpbmcgaGVhZGVyLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrKCkgKi8KIHN0YXRpYyBpbnQgaXB2Nl9ydGhkcl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IElQNkNCKHNrYik7CkBAIC0zMjQsMTIgKzMyNSw5IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRldik7CiAJaW50IGFjY2VwdF9zb3VyY2Vfcm91dGUgPSBuZXQtPmlwdjYuZGV2Y29uZl9hbGwtPmFjY2VwdF9zb3VyY2Vfcm91dGU7CiAKLQlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOwotCWlmIChpZGV2KSB7Ci0JCWlmIChhY2NlcHRfc291cmNlX3JvdXRlID4gaWRldi0+Y25mLmFjY2VwdF9zb3VyY2Vfcm91dGUpCi0JCQlhY2NlcHRfc291cmNlX3JvdXRlID0gaWRldi0+Y25mLmFjY2VwdF9zb3VyY2Vfcm91dGU7Ci0JCWluNl9kZXZfcHV0KGlkZXYpOwotCX0KKwlpZGV2ID0gX19pbjZfZGV2X2dldChza2ItPmRldik7CisJaWYgKGlkZXYgJiYgYWNjZXB0X3NvdXJjZV9yb3V0ZSA+IGlkZXYtPmNuZi5hY2NlcHRfc291cmNlX3JvdXRlKQorCQlhY2NlcHRfc291cmNlX3JvdXRlID0gaWRldi0+Y25mLmFjY2VwdF9zb3VyY2Vfcm91dGU7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgOCkgfHwKIAkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCkBAIC04NzQsMyArODcyLDI3IEBACiAJcmV0dXJuIG9wdDsKIH0KIAorLyoqCisgKiBmbDZfdXBkYXRlX2RzdCAtIHVwZGF0ZSBmbG93aSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpdGggaW5mbyBnaXZlbgorICogICAgICAgICAgICAgICAgICBieSBzcmNydCBvcHRpb24sIGlmIGFueS4KKyAqCisgKiBAZmw6IGZsb3dpIGZvciB3aGljaCBmbDZfZHN0IGlzIHRvIGJlIHVwZGF0ZWQKKyAqIEBvcHQ6IHN0cnVjdCBpcHY2X3R4b3B0aW9ucyBpbiB3aGljaCB0byBsb29rIGZvciBzcmNydCBvcHQKKyAqIEBvcmlnOiBjb3B5IG9mIG9yaWdpbmFsIGZsNl9kc3QgYWRkcmVzcyBpZiBtb2RpZmllZAorICoKKyAqIFJldHVybnMgTlVMTCBpZiBubyB0eG9wdGlvbnMgb3Igbm8gc3JjcnQsIG90aGVyd2lzZSByZXR1cm5zIG9yaWcKKyAqIGFuZCBpbml0aWFsIHZhbHVlIG9mIGZsLT5mbDZfZHN0IHNldCBpbiBvcmlnCisgKi8KK3N0cnVjdCBpbjZfYWRkciAqZmw2X3VwZGF0ZV9kc3Qoc3RydWN0IGZsb3dpICpmbCwKKwkJCQljb25zdCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwKKwkJCQlzdHJ1Y3QgaW42X2FkZHIgKm9yaWcpCit7CisJaWYgKCFvcHQgfHwgIW9wdC0+c3JjcnQpCisJCXJldHVybiBOVUxMOworCisJaXB2Nl9hZGRyX2NvcHkob3JpZywgJmZsLT5mbDZfZHN0KTsKKwlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9kc3QsICgoc3RydWN0IHJ0MF9oZHIgKilvcHQtPnNyY3J0KS0+YWRkcik7CisJcmV0dXJuIG9yaWc7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGZsNl91cGRhdGVfZHN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwppbmRleCA4ZTQ0ZjhmLi5iMTEwOGVkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKKysrIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCkBAIC00Myw4ICs0Myw4IEBACiAJaWYgKGFyZy5yZXN1bHQpCiAJCXJldHVybiBhcmcucmVzdWx0OwogCi0JZHN0X2hvbGQoJm5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeS0+dS5kc3QpOwotCXJldHVybiAmbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5LT51LmRzdDsKKwlkc3RfaG9sZCgmbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5LT5kc3QpOworCXJldHVybiAmbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5LT5kc3Q7CiB9CiAKIHN0YXRpYyBpbnQgZmliNl9ydWxlX2FjdGlvbihzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBmbG93aSAqZmxwLApAQCAtODYsNyArODYsNyBAQAogCQkJc3RydWN0IGluNl9hZGRyIHNhZGRyOwogCiAJCQlpZiAoaXB2Nl9kZXZfZ2V0X3NhZGRyKG5ldCwKLQkJCQkJICAgICAgIGlwNl9kc3RfaWRldigmcnQtPnUuZHN0KS0+ZGV2LAorCQkJCQkgICAgICAgaXA2X2RzdF9pZGV2KCZydC0+ZHN0KS0+ZGV2LAogCQkJCQkgICAgICAgJmZscC0+Zmw2X2RzdCwKIAkJCQkJICAgICAgIHJ0Nl9mbGFnczJzcmNwcmVmcyhmbGFncyksCiAJCQkJCSAgICAgICAmc2FkZHIpKQpAQCAtOTksMTIgKzk5LDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIGFnYWluOgotCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAlydCA9IE5VTEw7CiAJZ290byBvdXQ7CiAKIGRpc2NhcmRfcGt0OgotCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCWRzdF9ob2xkKCZydC0+ZHN0KTsKIG91dDoKIAlhcmctPnJlc3VsdCA9IHJ0OwogCXJldHVybiBydCA9PSBOVUxMID8gLUVBR0FJTiA6IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYyBiL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCmluZGV4IDBjNWUzYzMuLjhhMTYyODAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGZsb3dpIGZsOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKLQlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AsIGZpbmFsOwogCiAJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CiAJZmwucHJvdG8gPSBzay0+c2tfcHJvdG9jb2w7CkBAIC0xOTksMTIgKzE5OSw3IEBACiAJZmwuZmxfaXBfZHBvcnQgPSBpbmV0LT5pbmV0X2Rwb3J0OwogCXNlY3VyaXR5X3NrX2NsYXNzaWZ5X2Zsb3coc2ssICZmbCk7CiAKLQlpZiAobnAtPm9wdCAmJiBucC0+b3B0LT5zcmNydCkgewotCQlzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopbnAtPm9wdC0+c3JjcnQ7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOwotCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgcnQwLT5hZGRyKTsKLQkJZmluYWxfcCA9ICZmaW5hbDsKLQl9CisJZmluYWxfcCA9IGZsNl91cGRhdGVfZHN0KCZmbCwgbnAtPm9wdCwgJmZpbmFsKTsKIAogCWRzdCA9IF9faW5ldDZfY3NrX2RzdF9jaGVjayhzaywgbnAtPmRzdF9jb29raWUpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggOTJhMTIyYi4uYjZhNTg1OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJ0Nl9yZWxlYXNlKHN0cnVjdCBydDZfaW5mbyAqcnQpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJ0LT5ydDZpX3JlZikpCi0JCWRzdF9mcmVlKCZydC0+dS5kc3QpOworCQlkc3RfZnJlZSgmcnQtPmRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZpYjZfbGlua190YWJsZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWI2X3RhYmxlICp0YikKQEAgLTI3OCw3ICsyNzgsNyBAQAogCWludCByZXM7CiAJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAotCWZvciAocnQgPSB3LT5sZWFmOyBydDsgcnQgPSBydC0+dS5kc3QucnQ2X25leHQpIHsKKwlmb3IgKHJ0ID0gdy0+bGVhZjsgcnQ7IHJ0ID0gcnQtPmRzdC5ydDZfbmV4dCkgewogCQlyZXMgPSBydDZfZHVtcF9yb3V0ZShydCwgdy0+YXJncyk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQkvKiBGcmFtZSBpcyBmdWxsLCBzdXNwZW5kIHdhbGtpbmcgKi8KQEAgLTYxOSw3ICs2MTksNyBAQAogCiAJaW5zID0gJmZuLT5sZWFmOwogCi0JZm9yIChpdGVyID0gZm4tPmxlYWY7IGl0ZXI7IGl0ZXI9aXRlci0+dS5kc3QucnQ2X25leHQpIHsKKwlmb3IgKGl0ZXIgPSBmbi0+bGVhZjsgaXRlcjsgaXRlcj1pdGVyLT5kc3QucnQ2X25leHQpIHsKIAkJLyoKIAkJICoJU2VhcmNoIGZvciBkdXBsaWNhdGVzCiAJCSAqLwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJCWlmIChpdGVyLT5ydDZpX21ldHJpYyA+IHJ0LT5ydDZpX21ldHJpYykKIAkJCWJyZWFrOwogCi0JCWlucyA9ICZpdGVyLT51LmRzdC5ydDZfbmV4dDsKKwkJaW5zID0gJml0ZXItPmRzdC5ydDZfbmV4dDsKIAl9CiAKIAkvKiBSZXNldCByb3VuZC1yb2JpbiBzdGF0ZSwgaWYgbmVjZXNzYXJ5ICovCkBAIC02NTgsNyArNjU4LDcgQEAKIAkgKglpbnNlcnQgbm9kZQogCSAqLwogCi0JcnQtPnUuZHN0LnJ0Nl9uZXh0ID0gaXRlcjsKKwlydC0+ZHN0LnJ0Nl9uZXh0ID0gaXRlcjsKIAkqaW5zID0gcnQ7CiAJcnQtPnJ0Nmlfbm9kZSA9IGZuOwogCWF0b21pY19pbmMoJnJ0LT5ydDZpX3JlZik7CkBAIC03OTksNyArNzk5LDcgQEAKIAkJCWF0b21pY19pbmMoJnBuLT5sZWFmLT5ydDZpX3JlZik7CiAJCX0KICNlbmRpZgotCQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwkJZHN0X2ZyZWUoJnJ0LT5kc3QpOwogCX0KIAlyZXR1cm4gZXJyOwogCkBAIC04MTAsNyArODEwLDcgQEAKIHN0X2ZhaWx1cmU6CiAJaWYgKGZuICYmICEoZm4tPmZuX2ZsYWdzICYgKFJUTl9SVElORk98UlROX1JPT1QpKSkKIAkJZmliNl9yZXBhaXJfdHJlZShpbmZvLT5ubF9uZXQsIGZuKTsKLQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwlkc3RfZnJlZSgmcnQtPmRzdCk7CiAJcmV0dXJuIGVycjsKICNlbmRpZgogfQpAQCAtMTEwOCw3ICsxMTA4LDcgQEAKIAlSVDZfVFJBQ0UoImZpYjZfZGVsX3JvdXRlXG4iKTsKIAogCS8qIFVubGluayBpdCAqLwotCSpydHAgPSBydC0+dS5kc3QucnQ2X25leHQ7CisJKnJ0cCA9IHJ0LT5kc3QucnQ2X25leHQ7CiAJcnQtPnJ0Nmlfbm9kZSA9IE5VTEw7CiAJbmV0LT5pcHY2LnJ0Nl9zdGF0cy0+ZmliX3J0X2VudHJpZXMtLTsKIAluZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfZGlzY2FyZGVkX3JvdXRlcysrOwpAQCAtMTEyMiwxNCArMTEyMiwxNCBAQAogCUZPUl9XQUxLRVJTKHcpIHsKIAkJaWYgKHctPnN0YXRlID09IEZXU19DICYmIHctPmxlYWYgPT0gcnQpIHsKIAkJCVJUNl9UUkFDRSgid2Fsa2VyICVwIGFkanVzdGVkIGJ5IGRlbHJvdXRlXG4iLCB3KTsKLQkJCXctPmxlYWYgPSBydC0+dS5kc3QucnQ2X25leHQ7CisJCQl3LT5sZWFmID0gcnQtPmRzdC5ydDZfbmV4dDsKIAkJCWlmICh3LT5sZWFmID09IE5VTEwpCiAJCQkJdy0+c3RhdGUgPSBGV1NfVTsKIAkJfQogCX0KIAlyZWFkX3VubG9jaygmZmliNl93YWxrZXJfbG9jayk7CiAKLQlydC0+dS5kc3QucnQ2X25leHQgPSBOVUxMOworCXJ0LT5kc3QucnQ2X25leHQgPSBOVUxMOwogCiAJLyogSWYgaXQgd2FzIGxhc3Qgcm91dGUsIGV4cHVuZ2UgaXRzIHJhZGl4IHRyZWUgbm9kZSAqLwogCWlmIChmbi0+bGVhZiA9PSBOVUxMKSB7CkBAIC0xMTY4LDcgKzExNjgsNyBAQAogCXN0cnVjdCBydDZfaW5mbyAqKnJ0cDsKIAogI2lmIFJUNl9ERUJVRyA+PSAyCi0JaWYgKHJ0LT51LmRzdC5vYnNvbGV0ZT4wKSB7CisJaWYgKHJ0LT5kc3Qub2Jzb2xldGU+MCkgewogCQlXQVJOX09OKGZuICE9IE5VTEwpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogCSAqCVdhbGsgdGhlIGxlYWYgZW50cmllcyBsb29raW5nIGZvciBvdXJzZWxmCiAJICovCiAKLQlmb3IgKHJ0cCA9ICZmbi0+bGVhZjsgKnJ0cDsgcnRwID0gJigqcnRwKS0+dS5kc3QucnQ2X25leHQpIHsKKwlmb3IgKHJ0cCA9ICZmbi0+bGVhZjsgKnJ0cDsgcnRwID0gJigqcnRwKS0+ZHN0LnJ0Nl9uZXh0KSB7CiAJCWlmICgqcnRwID09IHJ0KSB7CiAJCQlmaWI2X2RlbF9yb3V0ZShmbiwgcnRwLCBpbmZvKTsKIAkJCXJldHVybiAwOwpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKIAkJLm5sX25ldCA9IGMtPm5ldCwKIAl9OwogCi0JZm9yIChydCA9IHctPmxlYWY7IHJ0OyBydCA9IHJ0LT51LmRzdC5ydDZfbmV4dCkgeworCWZvciAocnQgPSB3LT5sZWFmOyBydDsgcnQgPSBydC0+ZHN0LnJ0Nl9uZXh0KSB7CiAJCXJlcyA9IGMtPmZ1bmMocnQsIGMtPmFyZyk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQl3LT5sZWFmID0gcnQ7CkBAIC0xNDQ4LDggKzE0NDgsOCBAQAogCQl9CiAJCWdjX2FyZ3MubW9yZSsrOwogCX0gZWxzZSBpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpIHsKLQkJaWYgKGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpID09IDAgJiYKLQkJICAgIHRpbWVfYWZ0ZXJfZXEobm93LCBydC0+dS5kc3QubGFzdHVzZSArIGdjX2FyZ3MudGltZW91dCkpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSA9PSAwICYmCisJCSAgICB0aW1lX2FmdGVyX2VxKG5vdywgcnQtPmRzdC5sYXN0dXNlICsgZ2NfYXJncy50aW1lb3V0KSkgewogCQkJUlQ2X1RSQUNFKCJhZ2luZyBjbG9uZSAlcFxuIiwgcnQpOwogCQkJcmV0dXJuIC0xOwogCQl9IGVsc2UgaWYgKChydC0+cnQ2aV9mbGFncyAmIFJURl9HQVRFV0FZKSAmJgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCmluZGV4IDg5NDI1YWYuLmQ0MGIzMzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTY5OCw3ICs2OTgsNyBAQAogCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZpcnN0X2xlbiAtCiAJCQkJCQkgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAotCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwkJZHN0X2hvbGQoJnJ0LT5kc3QpOwogCiAJCWZvciAoOzspIHsKIAkJCS8qIFByZXBhcmUgaGVhZGVyIG9mIHRoZSBuZXh0IGZyYW1lLApAQCAtNzI2LDcgKzcyNiw3IEBACiAKIAkJCWVyciA9IG91dHB1dChza2IpOwogCQkJaWYoIWVycikKLQkJCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KCZydC0+dS5kc3QpLAorCQkJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoJnJ0LT5kc3QpLAogCQkJCQkgICAgICBJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyk7CiAKIAkJCWlmIChlcnIgfHwgIWZyYWcpCkBAIC03NDAsOSArNzQwLDkgQEAKIAkJa2ZyZWUodG1wX2hkcik7CiAKIAkJaWYgKGVyciA9PSAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KCZydC0+dS5kc3QpLAorCQkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldigmcnQtPmRzdCksCiAJCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR09LUyk7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTc1Miw5ICs3NTIsOSBAQAogCQkJZnJhZyA9IHNrYjsKIAkJfQogCi0JCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoJnJ0LT51LmRzdCksCisJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoJnJ0LT5kc3QpLAogCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKLQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTc4NSw3ICs3ODUsNyBAQAogCQkgKglBbGxvY2F0ZSBidWZmZXIuCiAJCSAqLwogCi0JCWlmICgoZnJhZyA9IGFsbG9jX3NrYihsZW4raGxlbitzaXplb2Yoc3RydWN0IGZyYWdfaGRyKStMTF9BTExPQ0FURURfU1BBQ0UocnQtPnUuZHN0LmRldiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWlmICgoZnJhZyA9IGFsbG9jX3NrYihsZW4raGxlbitzaXplb2Yoc3RydWN0IGZyYWdfaGRyKStMTF9BTExPQ0FURURfU1BBQ0UocnQtPmRzdC5kZXYpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQkJTkVUREVCVUcoS0VSTl9JTkZPICJJUHY2OiBmcmFnOiBubyBtZW1vcnkgZm9yIG5ldyBmcmFnbWVudCFcbiIpOwogCQkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2JfZHN0KHNrYikpLAogCQkJCSAgICAgIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CkBAIC03OTgsNyArNzk4LDcgQEAKIAkJICovCiAKIAkJaXA2X2NvcHlfbWV0YWRhdGEoZnJhZywgc2tiKTsKLQkJc2tiX3Jlc2VydmUoZnJhZywgTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldikpOworCQlza2JfcmVzZXJ2ZShmcmFnLCBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikpOwogCQlza2JfcHV0KGZyYWcsIGxlbiArIGhsZW4gKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CiAJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihmcmFnKTsKIAkJZmggPSAoc3RydWN0IGZyYWdfaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihmcmFnKSArIGhsZW4pOwpAQCAtMTE1NiwyNCArMTE1NiwyNCBAQAogCiAJCQkvKiBuZWVkIHNvdXJjZSBhZGRyZXNzIGFib3ZlIG1peWF6YXdhKi8KIAkJfQotCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKLQkJaW5ldC0+Y29yay5kc3QgPSAmcnQtPnUuZHN0OworCQlkc3RfaG9sZCgmcnQtPmRzdCk7CisJCWluZXQtPmNvcmsuZHN0ID0gJnJ0LT5kc3Q7CiAJCWluZXQtPmNvcmsuZmwgPSAqZmw7CiAJCW5wLT5jb3JrLmhvcF9saW1pdCA9IGhsaW1pdDsKIAkJbnAtPmNvcmsudGNsYXNzID0gdGNsYXNzOwogCQltdHUgPSBucC0+cG10dWRpc2MgPT0gSVBWNl9QTVRVRElTQ19QUk9CRSA/Ci0JCSAgICAgIHJ0LT51LmRzdC5kZXYtPm10dSA6IGRzdF9tdHUocnQtPnUuZHN0LnBhdGgpOworCQkgICAgICBydC0+ZHN0LmRldi0+bXR1IDogZHN0X210dShydC0+ZHN0LnBhdGgpOwogCQlpZiAobnAtPmZyYWdfc2l6ZSA8IG10dSkgewogCQkJaWYgKG5wLT5mcmFnX3NpemUpCiAJCQkJbXR1ID0gbnAtPmZyYWdfc2l6ZTsKIAkJfQogCQlpbmV0LT5jb3JrLmZyYWdzaXplID0gbXR1OwotCQlpZiAoZHN0X2FsbGZyYWcocnQtPnUuZHN0LnBhdGgpKQorCQlpZiAoZHN0X2FsbGZyYWcocnQtPmRzdC5wYXRoKSkKIAkJCWluZXQtPmNvcmsuZmxhZ3MgfD0gSVBDT1JLX0FMTEZSQUc7CiAJCWluZXQtPmNvcmsubGVuZ3RoID0gMDsKIAkJc2stPnNrX3NuZG1zZ19wYWdlID0gTlVMTDsKIAkJc2stPnNrX3NuZG1zZ19vZmYgPSAwOwotCQlleHRoZHJsZW4gPSBydC0+dS5kc3QuaGVhZGVyX2xlbiArIChvcHQgPyBvcHQtPm9wdF9mbGVuIDogMCkgLQorCQlleHRoZHJsZW4gPSBydC0+ZHN0LmhlYWRlcl9sZW4gKyAob3B0ID8gb3B0LT5vcHRfZmxlbiA6IDApIC0KIAkJCSAgICBydC0+cnQ2aV9uZmhlYWRlcl9sZW47CiAJCWxlbmd0aCArPSBleHRoZHJsZW47CiAJCXRyYW5zaGRybGVuICs9IGV4dGhkcmxlbjsKQEAgLTExODYsNyArMTE4Niw3IEBACiAJCW10dSA9IGluZXQtPmNvcmsuZnJhZ3NpemU7CiAJfQogCi0JaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldik7CisJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpOwogCiAJZnJhZ2hlYWRlcmxlbiA9IHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBydC0+cnQ2aV9uZmhlYWRlcl9sZW4gKwogCQkJKG9wdCA/IG9wdC0+b3B0X25mbGVuIDogMCk7CkBAIC0xMjI0LDcgKzEyMjQsNyBAQAogCQl9CiAKIAkJaWYgKHByb3RvID09IElQUFJPVE9fVURQICYmCi0JCSAgICAocnQtPnUuZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykpIHsKKwkJICAgIChydC0+ZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykpIHsKIAogCQkJZXJyID0gaXA2X3Vmb19hcHBlbmRfZGF0YShzaywgZ2V0ZnJhZywgZnJvbSwgbGVuZ3RoLAogCQkJCQkJICBoaF9sZW4sIGZyYWdoZWFkZXJsZW4sCkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogCiAJCQlmcmFnbGVuID0gZGF0YWxlbiArIGZyYWdoZWFkZXJsZW47CiAJCQlpZiAoKGZsYWdzICYgTVNHX01PUkUpICYmCi0JCQkgICAgIShydC0+dS5kc3QuZGV2LT5mZWF0dXJlcyZORVRJRl9GX1NHKSkKKwkJCSAgICAhKHJ0LT5kc3QuZGV2LT5mZWF0dXJlcyZORVRJRl9GX1NHKSkKIAkJCQlhbGxvY2xlbiA9IG10dTsKIAkJCWVsc2UKIAkJCQlhbGxvY2xlbiA9IGRhdGFsZW4gKyBmcmFnaGVhZGVybGVuOwpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKIAkJCSAqIGJlY2F1c2Ugd2UgaGF2ZSBubyBpZGVhIGlmIHdlJ3JlIHRoZSBsYXN0IG9uZS4KIAkJCSAqLwogCQkJaWYgKGRhdGFsZW4gPT0gbGVuZ3RoICsgZnJhZ2dhcCkKLQkJCQlhbGxvY2xlbiArPSBydC0+dS5kc3QudHJhaWxlcl9sZW47CisJCQkJYWxsb2NsZW4gKz0gcnQtPmRzdC50cmFpbGVyX2xlbjsKIAogCQkJLyoKIAkJCSAqIFdlIGp1c3QgcmVzZXJ2ZSBzcGFjZSBmb3IgZnJhZ21lbnQgaGVhZGVyLgpAQCAtMTM1OCw3ICsxMzU4LDcgQEAKIAkJaWYgKGNvcHkgPiBsZW5ndGgpCiAJCQljb3B5ID0gbGVuZ3RoOwogCi0JCWlmICghKHJ0LT51LmRzdC5kZXYtPmZlYXR1cmVzJk5FVElGX0ZfU0cpKSB7CisJCWlmICghKHJ0LT5kc3QuZGV2LT5mZWF0dXJlcyZORVRJRl9GX1NHKSkgewogCQkJdW5zaWduZWQgaW50IG9mZjsKIAogCQkJb2ZmID0gc2tiLT5sZW47CkBAIC0xNTAzLDcgKzE1MDMsNyBAQAogCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CiAJc2tiLT5tYXJrID0gc2stPnNrX21hcms7CiAKLQlza2JfZHN0X3NldChza2IsIGRzdF9jbG9uZSgmcnQtPnUuZHN0KSk7CisJc2tiX2RzdF9zZXQoc2tiLCBkc3RfY2xvbmUoJnJ0LT5kc3QpKTsKIAlJUDZfVVBEX1BPX1NUQVRTKG5ldCwgcnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VULCBza2ItPmxlbik7CiAJaWYgKHByb3RvID09IElQUFJPVE9fSUNNUFY2KSB7CiAJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpcDZfZHN0X2lkZXYoc2tiX2RzdChza2IpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwppbmRleCA4ZjM5ODkzLi4wZmQwMjdmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCkBAIC01NTIsNyArNTUyLDcgQEAKIAlpZiAoaXBfcm91dGVfb3V0cHV0X2tleShkZXZfbmV0KHNrYi0+ZGV2KSwgJnJ0LCAmZmwpKQogCQlnb3RvIG91dDsKIAotCXNrYjItPmRldiA9IHJ0LT51LmRzdC5kZXY7CisJc2tiMi0+ZGV2ID0gcnQtPmRzdC5kZXY7CiAKIAkvKiByb3V0ZSAiaW5jb21pbmciIHBhY2tldCAqLwogCWlmIChydC0+cnRfZmxhZ3MgJiBSVENGX0xPQ0FMKSB7CkBAIC01NjIsNyArNTYyLDcgQEAKIAkJZmwuZmw0X3NyYyA9IGVpcGgtPnNhZGRyOwogCQlmbC5mbDRfdG9zID0gZWlwaC0+dG9zOwogCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleShkZXZfbmV0KHNrYi0+ZGV2KSwgJnJ0LCAmZmwpIHx8Ci0JCSAgICBydC0+dS5kc3QuZGV2LT50eXBlICE9IEFSUEhSRF9UVU5ORUwpIHsKKwkJICAgIHJ0LT5kc3QuZGV2LT50eXBlICE9IEFSUEhSRF9UVU5ORUwpIHsKIAkJCWlwX3J0X3B1dChydCk7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNjI2LDcgKzYyNiw3IEBACiAJCWljbXB2Nl9zZW5kKHNrYjIsIHJlbF90eXBlLCByZWxfY29kZSwgcmVsX2luZm8pOwogCiAJCWlmIChydCkKLQkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCiAJCWtmcmVlX3NrYihza2IyKTsKIAl9CkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCQkJaWYgKGRldi0+bXR1IDwgSVBWNl9NSU5fTVRVKQogCQkJCWRldi0+bXR1ID0gSVBWNl9NSU5fTVRVOwogCQl9Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKaW5kZXggYmQ0M2YwMS4uYTdmNjZiYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwpAQCAtNTUsOCArNTUsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaXBzdGF0c19taWIsIGlwdjZfc3RhdGlzdGljcykgX19yZWFkX21vc3RseTsKLQogc3RydWN0IGlwNl9yYV9jaGFpbiAqaXA2X3JhX2NoYWluOwogREVGSU5FX1JXTE9DSyhpcDZfcmFfbG9jayk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IGFiMTYyMmQuLmQxNDQ0YjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMTUyLDE4ICsxNTIsMTkgQEAKIAltY19sc3QtPm5leHQgPSBOVUxMOwogCWlwdjZfYWRkcl9jb3B5KCZtY19sc3QtPmFkZHIsIGFkZHIpOwogCisJcmN1X3JlYWRfbG9jaygpOwogCWlmIChpZmluZGV4ID09IDApIHsKIAkJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAkJcnQgPSBydDZfbG9va3VwKG5ldCwgYWRkciwgTlVMTCwgMCwgMCk7CiAJCWlmIChydCkgewogCQkJZGV2ID0gcnQtPnJ0NmlfZGV2OwotCQkJZGV2X2hvbGQoZGV2KTsKLQkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCQl9CiAJfSBlbHNlCi0JCWRldiA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwkJZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBpZmluZGV4KTsKIAogCWlmIChkZXYgPT0gTlVMTCkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE4MCw4ICsxODEsOCBAQAogCWVyciA9IGlwdjZfZGV2X21jX2luYyhkZXYsIGFkZHIpOwogCiAJaWYgKGVycikgeworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7Ci0JCWRldl9wdXQoZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE5MCw3ICsxOTEsNyBAQAogCW5wLT5pcHY2X21jX2xpc3QgPSBtY19sc3Q7CiAJd3JpdGVfdW5sb2NrX2JoKCZpcHY2X3NrX21jX2xvY2spOwogCi0JZGV2X3B1dChkZXYpOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTMsMTggKzIxNCwxNyBAQAogCQkJKmxuayA9IG1jX2xzdC0+bmV4dDsKIAkJCXdyaXRlX3VubG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKIAotCQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChuZXQsIG1jX2xzdC0+aWZpbmRleCk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIG1jX2xzdC0+aWZpbmRleCk7CiAJCQlpZiAoZGV2ICE9IE5VTEwpIHsKLQkJCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwkJCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gX19pbjZfZGV2X2dldChkZXYpOwogCiAJCQkJKHZvaWQpIGlwNl9tY19sZWF2ZV9zcmMoc2ssIG1jX2xzdCwgaWRldik7Ci0JCQkJaWYgKGlkZXYpIHsKKwkJCQlpZiAoaWRldikKIAkJCQkJX19pcHY2X2Rldl9tY19kZWMoaWRldiwgJm1jX2xzdC0+YWRkcik7Ci0JCQkJCWluNl9kZXZfcHV0KGlkZXYpOwotCQkJCX0KLQkJCQlkZXZfcHV0KGRldik7CiAJCQl9IGVsc2UKIAkJCQkodm9pZCkgaXA2X21jX2xlYXZlX3NyYyhzaywgbWNfbHN0LCBOVUxMKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjM0LDQzICsyMzQsMzYgQEAKIAlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW5ldDZfZGV2ICppcDZfbWNfZmluZF9kZXYoc3RydWN0IG5ldCAqbmV0LAotCQkJCQkgc3RydWN0IGluNl9hZGRyICpncm91cCwKLQkJCQkJIGludCBpZmluZGV4KQorLyogY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jaygpICovCitzdGF0aWMgc3RydWN0IGluZXQ2X2RldiAqaXA2X21jX2ZpbmRfZGV2X3JjdShzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSAgICAgc3RydWN0IGluNl9hZGRyICpncm91cCwKKwkJCQkJICAgICBpbnQgaWZpbmRleCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gTlVMTDsKIAogCWlmIChpZmluZGV4ID09IDApIHsKLQkJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwkJc3RydWN0IHJ0Nl9pbmZvICpydCA9IHJ0Nl9sb29rdXAobmV0LCBncm91cCwgTlVMTCwgMCwgMCk7CiAKLQkJcnQgPSBydDZfbG9va3VwKG5ldCwgZ3JvdXAsIE5VTEwsIDAsIDApOwogCQlpZiAocnQpIHsKIAkJCWRldiA9IHJ0LT5ydDZpX2RldjsKIAkJCWRldl9ob2xkKGRldik7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJfQogCX0gZWxzZQotCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgaWZpbmRleCk7CiAKIAlpZiAoIWRldikKLQkJZ290byBub2RldjsKLQlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKIAlpZiAoIWlkZXYpCi0JCWdvdG8gcmVsZWFzZTsKKwkJcmV0dXJuIE5VTEw7OwogCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7Ci0JaWYgKGlkZXYtPmRlYWQpCi0JCWdvdG8gdW5sb2NrX3JlbGVhc2U7Ci0KKwlpZiAoaWRldi0+ZGVhZCkgeworCQlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJCXJldHVybiBOVUxMOworCX0KIAlyZXR1cm4gaWRldjsKLQotdW5sb2NrX3JlbGVhc2U6Ci0JcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwotCWluNl9kZXZfcHV0KGlkZXYpOwotcmVsZWFzZToKLQlkZXZfcHV0KGRldik7Ci1ub2RldjoKLQlyZXR1cm4gTlVMTDsKIH0KIAogdm9pZCBpcHY2X3NvY2tfbWNfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKQpAQCAtMjg2LDE5ICsyNzksMTcgQEAKIAkJbnAtPmlwdjZfbWNfbGlzdCA9IG1jX2xzdC0+bmV4dDsKIAkJd3JpdGVfdW5sb2NrX2JoKCZpcHY2X3NrX21jX2xvY2spOwogCi0JCWRldiA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBtY19sc3QtPmlmaW5kZXgpOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgbWNfbHN0LT5pZmluZGV4KTsKIAkJaWYgKGRldikgewotCQkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisJCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gX19pbjZfZGV2X2dldChkZXYpOwogCiAJCQkodm9pZCkgaXA2X21jX2xlYXZlX3NyYyhzaywgbWNfbHN0LCBpZGV2KTsKLQkJCWlmIChpZGV2KSB7CisJCQlpZiAoaWRldikKIAkJCQlfX2lwdjZfZGV2X21jX2RlYyhpZGV2LCAmbWNfbHN0LT5hZGRyKTsKLQkJCQlpbjZfZGV2X3B1dChpZGV2KTsKLQkJCX0KLQkJCWRldl9wdXQoZGV2KTsKIAkJfSBlbHNlCiAJCQkodm9pZCkgaXA2X21jX2xlYXZlX3NyYyhzaywgbWNfbHN0LCBOVUxMKTsKLQorCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CiAKIAkJd3JpdGVfbG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKQEAgLTMyNywxNCArMzE4LDE3IEBACiAJaWYgKCFpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGdyb3VwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZGV2ID0gaXA2X21jX2ZpbmRfZGV2KG5ldCwgZ3JvdXAsIHBnc3ItPmdzcl9pbnRlcmZhY2UpOwotCWlmICghaWRldikKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWRldiA9IGlwNl9tY19maW5kX2Rldl9yY3UobmV0LCBncm91cCwgcGdzci0+Z3NyX2ludGVyZmFjZSk7CisJaWYgKCFpZGV2KSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJZGV2ID0gaWRldi0+ZGV2OwogCiAJZXJyID0gLUVBRERSTk9UQVZBSUw7CiAKLQlyZWFkX2xvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CisJcmVhZF9sb2NrKCZpcHY2X3NrX21jX2xvY2spOwogCWZvciAocG1jPWluZXQ2LT5pcHY2X21jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgewogCQlpZiAocGdzci0+Z3NyX2ludGVyZmFjZSAmJiBwbWMtPmlmaW5kZXggIT0gcGdzci0+Z3NyX2ludGVyZmFjZSkKIAkJCWNvbnRpbnVlOwpAQCAtMzU4LDcgKzM1Miw3IEBACiAJCXBtYy0+c2Ztb2RlID0gb21vZGU7CiAJfQogCi0Jd3JpdGVfbG9ja19iaCgmcG1jLT5zZmxvY2spOworCXdyaXRlX2xvY2soJnBtYy0+c2Zsb2NrKTsKIAlwbWNsb2NrZWQgPSAxOwogCiAJcHNsID0gcG1jLT5zZmxpc3Q7CkBAIC00MzMsMTEgKzQyNywxMCBAQAogCWlwNl9tY19hZGRfc3JjKGlkZXYsIGdyb3VwLCBvbW9kZSwgMSwgc291cmNlLCAxKTsKIGRvbmU6CiAJaWYgKHBtY2xvY2tlZCkKLQkJd3JpdGVfdW5sb2NrX2JoKCZwbWMtPnNmbG9jayk7Ci0JcmVhZF91bmxvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CisJCXdyaXRlX3VubG9jaygmcG1jLT5zZmxvY2spOworCXJlYWRfdW5sb2NrKCZpcHY2X3NrX21jX2xvY2spOwogCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKLQlpbjZfZGV2X3B1dChpZGV2KTsKLQlkZXZfcHV0KGRldik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKGxlYXZlZ3JvdXApCiAJCXJldHVybiBpcHY2X3NvY2tfbWNfZHJvcChzaywgcGdzci0+Z3NyX2ludGVyZmFjZSwgZ3JvdXApOwogCXJldHVybiBlcnI7CkBAIC00NjMsMTQgKzQ1NiwxNyBAQAogCSAgICBnc2YtPmdmX2Ztb2RlICE9IE1DQVNUX0VYQ0xVREUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWRldiA9IGlwNl9tY19maW5kX2RldihuZXQsIGdyb3VwLCBnc2YtPmdmX2ludGVyZmFjZSk7CisJcmN1X3JlYWRfbG9jaygpOworCWlkZXYgPSBpcDZfbWNfZmluZF9kZXZfcmN1KG5ldCwgZ3JvdXAsIGdzZi0+Z2ZfaW50ZXJmYWNlKTsKIAotCWlmICghaWRldikKKwlpZiAoIWlkZXYpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAlkZXYgPSBpZGV2LT5kZXY7CiAKIAllcnIgPSAwOwotCXJlYWRfbG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKKwlyZWFkX2xvY2soJmlwdjZfc2tfbWNfbG9jayk7CiAKIAlpZiAoZ3NmLT5nZl9mbW9kZSA9PSBNQ0FTVF9JTkNMVURFICYmIGdzZi0+Z2ZfbnVtc3JjID09IDApIHsKIAkJbGVhdmVncm91cCA9IDE7CkBAIC01MTIsNyArNTA4LDcgQEAKIAkJKHZvaWQpIGlwNl9tY19hZGRfc3JjKGlkZXYsIGdyb3VwLCBnc2YtPmdmX2Ztb2RlLCAwLCBOVUxMLCAwKTsKIAl9CiAKLQl3cml0ZV9sb2NrX2JoKCZwbWMtPnNmbG9jayk7CisJd3JpdGVfbG9jaygmcG1jLT5zZmxvY2spOwogCXBzbCA9IHBtYy0+c2ZsaXN0OwogCWlmIChwc2wpIHsKIAkJKHZvaWQpIGlwNl9tY19kZWxfc3JjKGlkZXYsIGdyb3VwLCBwbWMtPnNmbW9kZSwKQEAgLTUyMiwxMyArNTE4LDEyIEBACiAJCSh2b2lkKSBpcDZfbWNfZGVsX3NyYyhpZGV2LCBncm91cCwgcG1jLT5zZm1vZGUsIDAsIE5VTEwsIDApOwogCXBtYy0+c2ZsaXN0ID0gbmV3cHNsOwogCXBtYy0+c2Ztb2RlID0gZ3NmLT5nZl9mbW9kZTsKLQl3cml0ZV91bmxvY2tfYmgoJnBtYy0+c2Zsb2NrKTsKKwl3cml0ZV91bmxvY2soJnBtYy0+c2Zsb2NrKTsKIAllcnIgPSAwOwogZG9uZToKLQlyZWFkX3VubG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKKwlyZWFkX3VubG9jaygmaXB2Nl9za19tY19sb2NrKTsKIAlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7Ci0JaW42X2Rldl9wdXQoaWRldik7Ci0JZGV2X3B1dChkZXYpOworCXJjdV9yZWFkX3VubG9jaygpOwogCWlmIChsZWF2ZWdyb3VwKQogCQllcnIgPSBpcHY2X3NvY2tfbWNfZHJvcChzaywgZ3NmLT5nZl9pbnRlcmZhY2UsIGdyb3VwKTsKIAlyZXR1cm4gZXJyOwpAQCAtNTUxLDExICs1NDYsMTMgQEAKIAlpZiAoIWlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZ3JvdXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlkZXYgPSBpcDZfbWNfZmluZF9kZXYobmV0LCBncm91cCwgZ3NmLT5nZl9pbnRlcmZhY2UpOworCXJjdV9yZWFkX2xvY2soKTsKKwlpZGV2ID0gaXA2X21jX2ZpbmRfZGV2X3JjdShuZXQsIGdyb3VwLCBnc2YtPmdmX2ludGVyZmFjZSk7CiAKLQlpZiAoIWlkZXYpCisJaWYgKCFpZGV2KSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQorCX0KIAlkZXYgPSBpZGV2LT5kZXY7CiAKIAllcnIgPSAtRUFERFJOT1RBVkFJTDsKQEAgLTU3Nyw4ICs1NzQsNyBAQAogCXBzbCA9IHBtYy0+c2ZsaXN0OwogCWNvdW50ID0gcHNsID8gcHNsLT5zbF9jb3VudCA6IDA7CiAJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwotCWluNl9kZXZfcHV0KGlkZXYpOwotCWRldl9wdXQoZGV2KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCWNvcHljb3VudCA9IGNvdW50IDwgZ3NmLT5nZl9udW1zcmMgPyBjb3VudCA6IGdzZi0+Z2ZfbnVtc3JjOwogCWdzZi0+Z2ZfbnVtc3JjID0gY291bnQ7CkBAIC02MDQsOCArNjAwLDcgQEAKIAlyZXR1cm4gMDsKIGRvbmU6CiAJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwotCWluNl9kZXZfcHV0KGlkZXYpOwotCWRldl9wdXQoZGV2KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04MjIsNiArODE3LDcgQEAKIAlzdHJ1Y3QgaWZtY2FkZHI2ICptYzsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwogCisJLyogd2UgbmVlZCB0byB0YWtlIGEgcmVmZXJlbmNlIG9uIGlkZXYgKi8KIAlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKIAogCWlmIChpZGV2ID09IE5VTEwpCkBAIC04NjAsNyArODU2LDcgQEAKIAlzZXR1cF90aW1lcigmbWMtPm1jYV90aW1lciwgaWdtcDZfdGltZXJfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpbWMpOwogCiAJaXB2Nl9hZGRyX2NvcHkoJm1jLT5tY2FfYWRkciwgYWRkcik7Ci0JbWMtPmlkZXYgPSBpZGV2OworCW1jLT5pZGV2ID0gaWRldjsgLyogKHJlZmVyZW5jZSB0YWtlbikgKi8KIAltYy0+bWNhX3VzZXJzID0gMTsKIAkvKiBtY2Ffc3RhbXAgc2hvdWxkIGJlIHVwZGF0ZWQgdXBvbiBjaGFuZ2VzICovCiAJbWMtPm1jYV9jc3RhbXAgPSBtYy0+bWNhX3RzdGFtcCA9IGppZmZpZXM7CkBAIC05MTUsMTYgKzkxMSwxOCBAQAogCiBpbnQgaXB2Nl9kZXZfbWNfZGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKIHsKLQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwogCWludCBlcnI7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZGV2ID0gX19pbjZfZGV2X2dldChkZXYpOwogCWlmICghaWRldikKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJZWxzZQorCQllcnIgPSBfX2lwdjZfZGV2X21jX2RlYyhpZGV2LCBhZGRyKTsKIAotCWVyciA9IF9faXB2Nl9kZXZfbWNfZGVjKGlkZXYsIGFkZHIpOwotCi0JaW42X2Rldl9wdXQoaWRldik7Ci0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC05NjUsNyArOTYzLDggQEAKIAlzdHJ1Y3QgaWZtY2FkZHI2ICptYzsKIAlpbnQgcnYgPSAwOwogCi0JaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisJcmN1X3JlYWRfbG9jaygpOworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CiAJaWYgKGlkZXYpIHsKIAkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAkJZm9yIChtYyA9IGlkZXYtPm1jX2xpc3Q7IG1jOyBtYz1tYy0+bmV4dCkgewpAQCAtOTkyLDggKzk5MSw4IEBACiAJCQkJcnYgPSAxOyAvKiBkb24ndCBmaWx0ZXIgdW5zcGVjaWZpZWQgc291cmNlICovCiAJCX0KIAkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwotCQlpbjZfZGV2X3B1dChpZGV2KTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJ2OwogfQogCkBAIC0xMTA0LDYgKzExMDMsNyBAQAogCXJldHVybiAxOwogfQogCisvKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrKCkgKi8KIGludCBpZ21wNl9ldmVudF9xdWVyeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBtbGQyX3F1ZXJ5ICptbGgyID0gTlVMTDsKQEAgLTExMjcsNyArMTEyNyw3IEBACiAJaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPnNhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlkZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CisJaWRldiA9IF9faW42X2Rldl9nZXQoc2tiLT5kZXYpOwogCiAJaWYgKGlkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CkBAIC0xMTM3LDEwICsxMTM3LDggQEAKIAlncm91cF90eXBlID0gaXB2Nl9hZGRyX3R5cGUoZ3JvdXApOwogCiAJaWYgKGdyb3VwX3R5cGUgIT0gSVBWNl9BRERSX0FOWSAmJgotCSAgICAhKGdyb3VwX3R5cGUmSVBWNl9BRERSX01VTFRJQ0FTVCkpIHsKLQkJaW42X2Rldl9wdXQoaWRldik7CisJICAgICEoZ3JvdXBfdHlwZSZJUFY2X0FERFJfTVVMVElDQVNUKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJaWYgKGxlbiA9PSAyNCkgewogCQlpbnQgc3dpdGNoYmFjazsKQEAgLTExNjEsMTAgKzExNTksOSBAQAogCX0gZWxzZSBpZiAobGVuID49IDI4KSB7CiAJCWludCBzcmNzX29mZnNldCA9IHNpemVvZihzdHJ1Y3QgbWxkMl9xdWVyeSkgLQogCQkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcik7Ci0JCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNyY3Nfb2Zmc2V0KSkgewotCQkJaW42X2Rldl9wdXQoaWRldik7CisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNyY3Nfb2Zmc2V0KSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CisKIAkJbWxoMiA9IChzdHJ1Y3QgbWxkMl9xdWVyeSAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCW1heF9kZWxheSA9IChNTERWMl9NUkMobnRvaHMobWxoMi0+bWxkMnFfbXJjKSkqSFopLzEwMDA7CiAJCWlmICghbWF4X2RlbGF5KQpAQCAtMTE3MywyOCArMTE3MCwyMyBAQAogCQlpZiAobWxoMi0+bWxkMnFfcXJ2KQogCQkJaWRldi0+bWNfcXJ2ID0gbWxoMi0+bWxkMnFfcXJ2OwogCQlpZiAoZ3JvdXBfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB7IC8qIGdlbmVyYWwgcXVlcnkgKi8KLQkJCWlmIChtbGgyLT5tbGQycV9uc3JjcykgewotCQkJCWluNl9kZXZfcHV0KGlkZXYpOworCQkJaWYgKG1saDItPm1sZDJxX25zcmNzKQogCQkJCXJldHVybiAtRUlOVkFMOyAvKiBubyBzb3VyY2VzIGFsbG93ZWQgKi8KLQkJCX0KKwogCQkJbWxkX2dxX3N0YXJ0X3RpbWVyKGlkZXYpOwotCQkJaW42X2Rldl9wdXQoaWRldik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQkvKiBtYXJrIHNvdXJjZXMgdG8gaW5jbHVkZSwgaWYgZ3JvdXAgJiBzb3VyY2Utc3BlY2lmaWMgKi8KIAkJaWYgKG1saDItPm1sZDJxX25zcmNzICE9IDApIHsKIAkJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNyY3Nfb2Zmc2V0ICsKLQkJCSAgICBudG9ocyhtbGgyLT5tbGQycV9uc3JjcykgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkpIHsKLQkJCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJCSAgICBudG9ocyhtbGgyLT5tbGQycV9uc3JjcykgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisKIAkJCW1saDIgPSAoc3RydWN0IG1sZDJfcXVlcnkgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQkJbWFyayA9IDE7CiAJCX0KLQl9IGVsc2UgewotCQlpbjZfZGV2X3B1dChpZGV2KTsKKwl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAlpZiAoZ3JvdXBfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB7CkBAIC0xMjI3LDEyICsxMjE5LDExIEBACiAJCX0KIAl9CiAJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwotCWluNl9kZXZfcHV0KGlkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQorLyogY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jaygpICovCiBpbnQgaWdtcDZfZXZlbnRfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlmbWNhZGRyNiAqbWE7CkBAIC0xMjYwLDcgKzEyNTEsNyBAQAogCSAgICAhKGFkZHJfdHlwZSZJUFY2X0FERFJfTElOS0xPQ0FMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAlpZiAoaWRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTI4MCw3ICsxMjcxLDYgQEAKIAkJfQogCX0KIAlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7Ci0JaW42X2Rldl9wdXQoaWRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTYsMTIgKzEzODYsMTQgQEAKIAlzdHJ1Y3QgbWxkMl9yZXBvcnQgKnBtciA9CiAJCQkgICAgICAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlpbnQgcGF5bG9hZF9sZW4sIG1sZGxlbjsKLQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRldik7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZmxvd2kgZmw7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCisJcmN1X3JlYWRfbG9jaygpOworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAlJUDZfVVBEX1BPX1NUQVRTKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfT1VULCBza2ItPmxlbik7CiAKIAlwYXlsb2FkX2xlbiA9IChza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyKSAtIHNpemVvZigqcGlwNik7CkBAIC0xNDQxLDggKzE0MzMsNyBAQAogCX0gZWxzZQogCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCi0JaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQotCQlpbjZfZGV2X3B1dChpZGV2KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm47CiAKIGVycl9vdXQ6CkBAIC0xNzc5LDcgKzE3NzAsOCBAQAogCQkJCQkgSVBQUk9UT19JQ01QVjYsCiAJCQkJCSBjc3VtX3BhcnRpYWwoaGRyLCBsZW4sIDApKTsKIAotCWlkZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CisJcmN1X3JlYWRfbG9jaygpOworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAogCWRzdCA9IGljbXA2X2RzdF9hbGxvYyhza2ItPmRldiwgTlVMTCwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAlpZiAoIWRzdCkgewpAQCAtMTgwNiw4ICsxNzk4LDcgQEAKIAl9IGVsc2UKIAkJSVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAotCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKLQkJaW42X2Rldl9wdXQoaWRldik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuOwogCiBlcnJfb3V0OgpAQCAtMTk5OCw4ICsxOTg5LDcgQEAKIAkJCQkgICAgJnBzZi0+c2ZfYWRkcikpCiAJCQkJCWJyZWFrOwogCQkJaWYgKCFkcHNmKSB7Ci0JCQkJZHBzZiA9IChzdHJ1Y3QgaXA2X3NmX2xpc3QgKikKLQkJCQkJa21hbGxvYyhzaXplb2YoKmRwc2YpLCBHRlBfQVRPTUlDKTsKKwkJCQlkcHNmID0ga21hbGxvYyhzaXplb2YoKmRwc2YpLCBHRlBfQVRPTUlDKTsKIAkJCQlpZiAoIWRwc2YpCiAJCQkJCWNvbnRpbnVlOwogCQkJCSpkcHNmID0gKnBzZjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDJlZmVmNTIuLjU4ODQxYzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtMTIyOSw3ICsxMjI5LDcgQEAKIAkJCU5EX1BSSU5USzAoS0VSTl9FUlIKIAkJCQkgICAiSUNNUHY2IFJBOiAlcygpIGdvdCBkZWZhdWx0IHJvdXRlciB3aXRob3V0IG5laWdoYm91ci5cbiIsCiAJCQkJICAgX19mdW5jX18pOwotCQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCQlpbjZfZGV2X3B1dChpbjZfZGV2KTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTI0NCw3ICsxMjQ0LDcgQEAKIAlpZiAocmFfbXNnLT5pY21waC5pY21wNl9ob3BfbGltaXQpIHsKIAkJaW42X2Rldi0+Y25mLmhvcF9saW1pdCA9IHJhX21zZy0+aWNtcGguaWNtcDZfaG9wX2xpbWl0OwogCQlpZiAocnQpCi0JCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX0hPUExJTUlULTFdID0gcmFfbXNnLT5pY21waC5pY21wNl9ob3BfbGltaXQ7CisJCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IHJhX21zZy0+aWNtcGguaWNtcDZfaG9wX2xpbWl0OwogCX0KIAogc2tpcF9kZWZydHI6CkBAIC0xMzYzLDcgKzEzNjMsNyBAQAogCQkJaW42X2Rldi0+Y25mLm10dTYgPSBtdHU7CiAKIAkJCWlmIChydCkKLQkJCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IG10dTsKKwkJCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBtdHU7CiAKIAkJCXJ0Nl9tdHVfY2hhbmdlKHNrYi0+ZGV2LCBtdHUpOwogCQl9CkBAIC0xMzg0LDcgKzEzODQsNyBAQAogCX0KIG91dDoKIAlpZiAocnQpCi0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJZWxzZSBpZiAobmVpZ2gpCiAJCW5laWdoX3JlbGVhc2UobmVpZ2gpOwogCWluNl9kZXZfcHV0KGluNl9kZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwppbmRleCBhNzQ5NTFjLi43MTU1YjI0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwpAQCAtMTUxLDkgKzE1MSw3IEBACiAJCQkJCQkJIHByb3RvY29sLAogCQkJCQkJCSBjc3VtX3N1YigwLCBoc3VtKSkpOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCWNzdW0gPSBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZV9oZWFkKHNrYiwgZGF0YW9mZiArIGxlbik7Ci0JCWlmICghY3N1bSkKLQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZV9oZWFkKHNrYiwgZGF0YW9mZiArIGxlbik7CiAJfQogCXJldHVybiBjc3VtOwogfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwppbmRleCA4YzIwMTc0Li40MTNhYjA3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCkBAIC00Myw3ICs0Myw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvcHlfbW9kZSBfX3JlYWRfbW9zdGx5ID0gSVBRX0NPUFlfTk9ORTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcXVldWVfbWF4bGVuIF9fcmVhZF9tb3N0bHkgPSBJUFFfUU1BWF9ERUZBVUxUOwotc3RhdGljIERFRklORV9SV0xPQ0socXVldWVfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHF1ZXVlX2xvY2spOwogc3RhdGljIGludCBwZWVyX3BpZCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHVuc2lnbmVkIGludCBjb3B5X3JhbmdlIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHF1ZXVlX3RvdGFsOwpAQCAtNzMsMTAgKzczLDEwIEBACiAJCWJyZWFrOwogCiAJY2FzZSBJUFFfQ09QWV9QQUNLRVQ6Ci0JCWNvcHlfbW9kZSA9IG1vZGU7CisJCWlmIChyYW5nZSA+IDB4RkZGRikKKwkJCXJhbmdlID0gMHhGRkZGOwogCQljb3B5X3JhbmdlID0gcmFuZ2U7Ci0JCWlmIChjb3B5X3JhbmdlID4gMHhGRkZGKQotCQkJY29weV9yYW5nZSA9IDB4RkZGRjsKKwkJY29weV9tb2RlID0gbW9kZTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTAyLDcgKzEwMiw3IEBACiB7CiAJc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSA9IE5VTEwsICppOwogCi0Jd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnF1ZXVlX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCh1bnNpZ25lZCBsb25nKWkgPT0gaWQpIHsKQEAgLTExNiw3ICsxMTYsNyBAQAogCQlxdWV1ZV90b3RhbC0tOwogCX0KIAotCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogCXJldHVybiBlbnRyeTsKIH0KIApAQCAtMTM3LDkgKzEzNyw5IEBACiBzdGF0aWMgdm9pZAogaXBxX2ZsdXNoKGlwcV9jbXBmbiBjbXBmbiwgdW5zaWduZWQgbG9uZyBkYXRhKQogewotCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CiAJX19pcHFfZmx1c2goY21wZm4sIGRhdGEpOwotCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgpAQCAtMTUzLDkgKzE1Myw3IEBACiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHRpbWV2YWwgdHY7CiAKLQlyZWFkX2xvY2tfYmgoJnF1ZXVlX2xvY2spOwotCi0Jc3dpdGNoIChjb3B5X21vZGUpIHsKKwlzd2l0Y2ggKEFDQ0VTU19PTkNFKGNvcHlfbW9kZSkpIHsKIAljYXNlIElQUV9DT1BZX01FVEE6CiAJY2FzZSBJUFFfQ09QWV9OT05FOgogCQlzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpwbXNnKSk7CkBAIC0xNjMsMjYgKzE2MSwyMSBAQAogCiAJY2FzZSBJUFFfQ09QWV9QQUNLRVQ6CiAJCWlmIChlbnRyeS0+c2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgICAgKCplcnJwID0gc2tiX2NoZWNrc3VtX2hlbHAoZW50cnktPnNrYikpKSB7Ci0JCQlyZWFkX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJCSAgICAoKmVycnAgPSBza2JfY2hlY2tzdW1faGVscChlbnRyeS0+c2tiKSkpCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoY29weV9yYW5nZSA9PSAwIHx8IGNvcHlfcmFuZ2UgPiBlbnRyeS0+c2tiLT5sZW4pCisKKwkJZGF0YV9sZW4gPSBBQ0NFU1NfT05DRShjb3B5X3JhbmdlKTsKKwkJaWYgKGRhdGFfbGVuID09IDAgfHwgZGF0YV9sZW4gPiBlbnRyeS0+c2tiLT5sZW4pCiAJCQlkYXRhX2xlbiA9IGVudHJ5LT5za2ItPmxlbjsKLQkJZWxzZQotCQkJZGF0YV9sZW4gPSBjb3B5X3JhbmdlOwogCiAJCXNpemUgPSBOTE1TR19TUEFDRShzaXplb2YoKnBtc2cpICsgZGF0YV9sZW4pOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCSplcnJwID0gLUVJTlZBTDsKLQkJcmVhZF91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlyZWFkX3VubG9ja19iaCgmcXVldWVfbG9jayk7Ci0KIAlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKQEAgLTI0Miw3ICsyMzUsNyBAQAogCWlmIChuc2tiID09IE5VTEwpCiAJCXJldHVybiBzdGF0dXM7CiAKLQl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnF1ZXVlX2xvY2spOwogCiAJaWYgKCFwZWVyX3BpZCkKIAkJZ290byBlcnJfb3V0X2ZyZWVfbnNrYjsKQEAgLTI2NiwxNCArMjU5LDE0IEBACiAKIAlfX2lwcV9lbnF1ZXVlX2VudHJ5KGVudHJ5KTsKIAotCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiAKIGVycl9vdXRfZnJlZV9uc2tiOgogCWtmcmVlX3NrYihuc2tiKTsKIAogZXJyX291dF91bmxvY2s6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzQyLDkgKzMzNSw5IEBACiB7CiAJaW50IHN0YXR1czsKIAotCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CiAJc3RhdHVzID0gX19pcHFfc2V0X21vZGUobW9kZSwgcmFuZ2UpOwotCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ0MSwxMSArNDM0LDExIEBACiAJaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKQogCQlSQ1ZfU0tCX0ZBSUwoLUVQRVJNKTsKIAotCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fbG9ja19iaCgmcXVldWVfbG9jayk7CiAKIAlpZiAocGVlcl9waWQpIHsKIAkJaWYgKHBlZXJfcGlkICE9IHBpZCkgewotCQkJd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAkJCVJDVl9TS0JfRkFJTCgtRUJVU1kpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTQ1Myw3ICs0NDYsNyBAQAogCQlwZWVyX3BpZCA9IHBpZDsKIAl9CiAKLQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAogCXN0YXR1cyA9IGlwcV9yZWNlaXZlX3BlZXIoTkxNU0dfREFUQShubGgpLCB0eXBlLAogCQkJCSAgbmxtc2dsZW4gLSBOTE1TR19MRU5HVEgoMCkpOwpAQCAtNDk4LDEwICs0OTEsMTAgQEAKIAlzdHJ1Y3QgbmV0bGlua19ub3RpZnkgKm4gPSBwdHI7CiAKIAlpZiAoZXZlbnQgPT0gTkVUTElOS19VUkVMRUFTRSAmJiBuLT5wcm90b2NvbCA9PSBORVRMSU5LX0lQNl9GVykgewotCQl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAkJaWYgKChuZXRfZXEobi0+bmV0LCAmaW5pdF9uZXQpKSAmJiAobi0+cGlkID09IHBlZXJfcGlkKSkKIAkJCV9faXBxX3Jlc2V0KCk7Ci0JCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAl9CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQpAQCAtNTI4LDcgKzUyMSw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgaXA2X3F1ZXVlX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJlYWRfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAogCXNlcV9wcmludGYobSwKIAkJICAgICAgIlBlZXIgUElEICAgICAgICAgIDogJWRcbiIKQEAgLTU0Niw3ICs1MzksNyBAQAogCQkgICAgICBxdWV1ZV9kcm9wcGVkLAogCQkgICAgICBxdWV1ZV91c2VyX2Ryb3BwZWQpOwogCi0JcmVhZF91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggOWQyZDY4Zi4uNTM1OWVmNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC0zODcsOSArMzg3LDcgQEAKIAkJCQlnb3RvIG5vX21hdGNoOwogCQl9CiAKLQkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsCi0JCQkgICAgbnRvaHMoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pICsKLQkJCSAgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpLCAxKTsKKwkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsIHNrYi0+bGVuLCAxKTsKIAogCQl0ID0gaXA2dF9nZXRfdGFyZ2V0X2MoZSk7CiAJCUlQX05GX0FTU0VSVCh0LT51Lmtlcm5lbC50YXJnZXQpOwpAQCAtODk5LDcgKzg5Nyw3IEBACiAJc3RydWN0IGlwNnRfZW50cnkgKml0ZXI7CiAJdW5zaWduZWQgaW50IGNwdTsKIAl1bnNpZ25lZCBpbnQgaTsKLQl1bnNpZ25lZCBpbnQgY3VyY3B1OworCXVuc2lnbmVkIGludCBjdXJjcHUgPSBnZXRfY3B1KCk7CiAKIAkvKiBJbnN0ZWFkIG9mIGNsZWFyaW5nIChieSBhIHByZXZpb3VzIGNhbGwgdG8gbWVtc2V0KCkpCiAJICogdGhlIGNvdW50ZXJzIGFuZCB1c2luZyBhZGRzLCB3ZSBzZXQgdGhlIGNvdW50ZXJzCkBAIC05MDksMTQgKzkwNywxNiBAQAogCSAqIGlmIG5ldyBzb2Z0aXJxIHdlcmUgdG8gcnVuIGFuZCBjYWxsIGlwdF9kb190YWJsZQogCSAqLwogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQljdXJjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KIAlpID0gMDsKIAl4dF9lbnRyeV9mb3JlYWNoKGl0ZXIsIHQtPmVudHJpZXNbY3VyY3B1XSwgdC0+c2l6ZSkgewogCQlTRVRfQ09VTlRFUihjb3VudGVyc1tpXSwgaXRlci0+Y291bnRlcnMuYmNudCwKIAkJCSAgICBpdGVyLT5jb3VudGVycy5wY250KTsKIAkJKytpOwogCX0KKwlsb2NhbF9iaF9lbmFibGUoKTsKKwkvKiBQcm9jZXNzaW5nIGNvdW50ZXJzIGZyb20gb3RoZXIgY3B1cywgd2UgY2FuIGxldCBib3R0b20gaGFsZiBlbmFibGVkLAorCSAqIChwcmVlbXB0aW9uIGlzIGRpc2FibGVkKQorCSAqLwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlpZiAoY3B1ID09IGN1cmNwdSkKQEAgLTkzMCw3ICs5MzAsNyBAQAogCQl9CiAJCXh0X2luZm9fd3J1bmxvY2soY3B1KTsKIAl9Ci0JbG9jYWxfYmhfZW5hYmxlKCk7CisJcHV0X2NwdSgpOwogfQogCiBzdGF0aWMgc3RydWN0IHh0X2NvdW50ZXJzICphbGxvY19jb3VudGVycyhjb25zdCBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQpAQCAtOTQzLDcgKzk0Myw3IEBACiAJICAgKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKIAkgICBhYm91dCkuICovCiAJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHByaXZhdGUtPm51bWJlcjsKLQljb3VudGVycyA9IHZtYWxsb2Nfbm9kZShjb3VudGVyc2l6ZSwgbnVtYV9ub2RlX2lkKCkpOworCWNvdW50ZXJzID0gdm1hbGxvYyhjb3VudGVyc2l6ZSk7CiAKIAlpZiAoY291bnRlcnMgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC0xMjEzLDggKzEyMTMsNyBAQAogCXN0cnVjdCBpcDZ0X2VudHJ5ICppdGVyOwogCiAJcmV0ID0gMDsKLQljb3VudGVycyA9IHZtYWxsb2Nfbm9kZShudW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSwKLQkJCQludW1hX25vZGVfaWQoKSk7CisJY291bnRlcnMgPSB2bWFsbG9jKG51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKTsKIAlpZiAoIWNvdW50ZXJzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMTM2OCw3ICsxMzY3LDcgQEAKIAlpZiAobGVuICE9IHNpemUgKyBudW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwYWRkYyA9IHZtYWxsb2Nfbm9kZShsZW4gLSBzaXplLCBudW1hX25vZGVfaWQoKSk7CisJcGFkZGMgPSB2bWFsbG9jKGxlbiAtIHNpemUpOwogCWlmICghcGFkZGMpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCmluZGV4IGFmNGVlMTEuLjBhMDdhZTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCkBAIC0zNzMsNiArMzczLDU2IEBACiAJCXByaW50aygiTUFSSz0weCV4ICIsIHNrYi0+bWFyayk7CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfbWFjX2hlYWRlcihjb25zdCBzdHJ1Y3QgbmZfbG9naW5mbyAqaW5mbywKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwl1bnNpZ25lZCBpbnQgbG9nZmxhZ3MgPSAwOworCisJaWYgKGluZm8tPnR5cGUgPT0gTkZfTE9HX1RZUEVfTE9HKQorCQlsb2dmbGFncyA9IGluZm8tPnUubG9nLmxvZ2ZsYWdzOworCisJaWYgKCEobG9nZmxhZ3MgJiBJUDZUX0xPR19NQUNERUNPREUpKQorCQlnb3RvIGZhbGxiYWNrOworCisJc3dpdGNoIChkZXYtPnR5cGUpIHsKKwljYXNlIEFSUEhSRF9FVEhFUjoKKwkJcHJpbnRrKCJNQUNTUkM9JXBNIE1BQ0RTVD0lcE0gTUFDUFJPVE89JTA0eCAiLAorCQkgICAgICAgZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgZXRoX2hkcihza2IpLT5oX2Rlc3QsCisJCSAgICAgICBudG9ocyhldGhfaGRyKHNrYiktPmhfcHJvdG8pKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworZmFsbGJhY2s6CisJcHJpbnRrKCJNQUM9Iik7CisJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuICYmCisJICAgIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBza2JfbWFjX2hlYWRlcihza2IpOworCQl1bnNpZ25lZCBpbnQgbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJCXVuc2lnbmVkIGludCBpOworCisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCAmJgorCQkgICAgKHAgLT0gRVRIX0hMRU4pIDwgc2tiLT5oZWFkKQorCQkJcCA9IE5VTEw7CisKKwkJaWYgKHAgIT0gTlVMTCkgeworCQkJcHJpbnRrKCIlMDJ4IiwgKnArKyk7CisJCQlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspCisJCQkJcHJpbnRrKCI6JTAyeCIsIHBbaV0pOworCQl9CisJCXByaW50aygiICIpOworCisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCkgeworCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPQorCQkJCShzdHJ1Y3QgaXBoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOworCQkJcHJpbnRrKCJUVU5ORUw9JXBJNC0+JXBJNCAiLCAmaXBoLT5zYWRkciwgJmlwaC0+ZGFkZHIpOworCQl9CisJfSBlbHNlCisJCXByaW50aygiICIpOworfQorCiBzdGF0aWMgc3RydWN0IG5mX2xvZ2luZm8gZGVmYXVsdF9sb2dpbmZvID0gewogCS50eXBlCT0gTkZfTE9HX1RZUEVfTE9HLAogCS51ID0gewpAQCAtNDAwLDM1ICs0NTAsMTAgQEAKIAkJcHJlZml4LAogCQlpbiA/IGluLT5uYW1lIDogIiIsCiAJCW91dCA/IG91dC0+bmFtZSA6ICIiKTsKLQlpZiAoaW4gJiYgIW91dCkgewotCQl1bnNpZ25lZCBpbnQgbGVuOwotCQkvKiBNQUMgbG9nZ2luZyBmb3IgaW5wdXQgY2hhaW4gb25seS4gKi8KLQkJcHJpbnRrKCJNQUM9Iik7Ci0JCWlmIChza2ItPmRldiAmJiAobGVuID0gc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbikgJiYKLQkJICAgIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7Ci0JCQljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gc2tiX21hY19oZWFkZXIoc2tiKTsKLQkJCWludCBpOwogCi0JCQlpZiAoc2tiLT5kZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCAmJgotCQkJICAgIChwIC09IEVUSF9ITEVOKSA8IHNrYi0+aGVhZCkKLQkJCQlwID0gTlVMTDsKLQotCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCQkJcHJpbnRrKCIlMDJ4JXMiLCBwW2ldLAotCQkJCQkgICAgICAgaSA9PSBsZW4gLSAxID8gIiIgOiAiOiIpOwotCQkJfQotCQkJcHJpbnRrKCIgIik7Ci0KLQkJCWlmIChza2ItPmRldi0+dHlwZSA9PSBBUlBIUkRfU0lUKSB7Ci0JCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPQotCQkJCQkoc3RydWN0IGlwaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQkJCQlwcmludGsoIlRVTk5FTD0lcEk0LT4lcEk0ICIsCi0JCQkJICAgICAgICZpcGgtPnNhZGRyLCAmaXBoLT5kYWRkcik7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcHJpbnRrKCIgIik7Ci0JfQorCS8qIE1BQyBsb2dnaW5nIGZvciBpbnB1dCBwYXRoIG9ubHkuICovCisJaWYgKGluICYmICFvdXQpCisJCWR1bXBfbWFjX2hlYWRlcihsb2dpbmZvLCBza2IpOwogCiAJZHVtcF9wYWNrZXQobG9naW5mbywgc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgMSk7CiAJcHJpbnRrKCJcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKaW5kZXggOWJlODE3Ny4uMWRmM2M4YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAl0eXBlID0gaWNtcDZoLT5pY21wNl90eXBlIC0gMTMwOwogCWlmICh0eXBlID49IDAgJiYgdHlwZSA8IHNpemVvZihub2N0X3ZhbGlkX25ldykgJiYKIAkgICAgbm9jdF92YWxpZF9uZXdbdHlwZV0pIHsKLQkJc2tiLT5uZmN0ID0gJm5mX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbDsKKwkJc2tiLT5uZmN0ID0gJm5mX2N0X3VudHJhY2tlZF9nZXQoKS0+Y3RfZ2VuZXJhbDsKIAkJc2tiLT5uZmN0aW5mbyA9IElQX0NUX05FVzsKIAkJbmZfY29ubnRyYWNrX2dldChza2ItPm5mY3QpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCmluZGV4IDZmYjg5MDEuLjEzZWY1YmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKQEAgLTExNCwxMCArMTE0LDggQEAKIH0KIAogLyogTWVtb3J5IFRyYWNraW5nIEZ1bmN0aW9ucy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmFnX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgKndvcmspCitzdGF0aWMgdm9pZCBmcmFnX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICh3b3JrKQotCQkqd29yayAtPSBza2ItPnRydWVzaXplOwogCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJm5mX2luaXRfZnJhZ3MubWVtKTsKIAluZl9za2JfZnJlZShza2IpOwogCWtmcmVlX3NrYihza2IpOwpAQCAtMjAxLDcgKzE5OSw3IEBACiAJaW50IG9mZnNldCwgZW5kOwogCiAJaWYgKGZxLT5xLmxhc3RfaW4gJiBJTkVUX0ZSQUdfQ09NUExFVEUpIHsKLQkJcHJfZGVidWcoIkFsbHJlYWR5IGNvbXBsZXRlZFxuIik7CisJCXByX2RlYnVnKCJBbHJlYWR5IGNvbXBsZXRlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMjcxLDYgKzI2OSwxMSBAQAogCSAqIGluIHRoZSBjaGFpbiBvZiBmcmFnbWVudHMgc28gZmFyLiAgV2UgbXVzdCBrbm93IHdoZXJlIHRvIHB1dAogCSAqIHRoaXMgZnJhZ21lbnQsIHJpZ2h0PwogCSAqLworCXByZXYgPSBmcS0+cS5mcmFnbWVudHNfdGFpbDsKKwlpZiAoIXByZXYgfHwgTkZDVF9GUkFHNl9DQihwcmV2KS0+b2Zmc2V0IDwgb2Zmc2V0KSB7CisJCW5leHQgPSBOVUxMOworCQlnb3RvIGZvdW5kOworCX0KIAlwcmV2ID0gTlVMTDsKIAlmb3IgKG5leHQgPSBmcS0+cS5mcmFnbWVudHM7IG5leHQgIT0gTlVMTDsgbmV4dCA9IG5leHQtPm5leHQpIHsKIAkJaWYgKE5GQ1RfRlJBRzZfQ0IobmV4dCktPm9mZnNldCA+PSBvZmZzZXQpCkBAIC0yNzgsNiArMjgxLDcgQEAKIAkJcHJldiA9IG5leHQ7CiAJfQogCitmb3VuZDoKIAkvKiBXZSBmb3VuZCB3aGVyZSB0byBwdXQgdGhpcyBvbmUuICBDaGVjayBmb3Igb3ZlcmxhcCB3aXRoCiAJICogcHJlY2VkaW5nIGZyYWdtZW50LCBhbmQsIGlmIG5lZWRlZCwgYWxpZ24gdGhpbmdzIHNvIHRoYXQKIAkgKiBhbnkgb3ZlcmxhcHMgYXJlIGVsaW1pbmF0ZWQuCkBAIC0zMzUsNyArMzM5LDcgQEAKIAkJCQlmcS0+cS5mcmFnbWVudHMgPSBuZXh0OwogCiAJCQlmcS0+cS5tZWF0IC09IGZyZWVfaXQtPmxlbjsKLQkJCWZyYWdfa2ZyZWVfc2tiKGZyZWVfaXQsIE5VTEwpOworCQkJZnJhZ19rZnJlZV9za2IoZnJlZV9pdCk7CiAJCX0KIAl9CiAKQEAgLTM0Myw2ICszNDcsOCBAQAogCiAJLyogSW5zZXJ0IHRoaXMgZnJhZ21lbnQgaW4gdGhlIGNoYWluIG9mIGZyYWdtZW50cy4gKi8KIAlza2ItPm5leHQgPSBuZXh0OworCWlmICghbmV4dCkKKwkJZnEtPnEuZnJhZ21lbnRzX3RhaWwgPSBza2I7CiAJaWYgKHByZXYpCiAJCXByZXYtPm5leHQgPSBza2I7CiAJZWxzZQpAQCAtNDQyLDcgKzQ0OCw2IEBACiAJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gaGVhZC0+bmV4dDsKIAlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihoZWFkKTsKIAlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKTsKLQlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmbmZfaW5pdF9mcmFncy5tZW0pOwogCiAJZm9yIChmcD1oZWFkLT5uZXh0OyBmcDsgZnAgPSBmcC0+bmV4dCkgewogCQloZWFkLT5kYXRhX2xlbiArPSBmcC0+bGVuOwpAQCAtNDUyLDggKzQ1Nyw4IEBACiAJCWVsc2UgaWYgKGhlYWQtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKIAkJCWhlYWQtPmNzdW0gPSBjc3VtX2FkZChoZWFkLT5jc3VtLCBmcC0+Y3N1bSk7CiAJCWhlYWQtPnRydWVzaXplICs9IGZwLT50cnVlc2l6ZTsKLQkJYXRvbWljX3N1YihmcC0+dHJ1ZXNpemUsICZuZl9pbml0X2ZyYWdzLm1lbSk7CiAJfQorCWF0b21pY19zdWIoaGVhZC0+dHJ1ZXNpemUsICZuZl9pbml0X2ZyYWdzLm1lbSk7CiAKIAloZWFkLT5uZXh0ID0gTlVMTDsKIAloZWFkLT5kZXYgPSBkZXY7CkBAIC00NjcsNiArNDcyLDcgQEAKIAkJCQkJICBoZWFkLT5jc3VtKTsKIAogCWZxLT5xLmZyYWdtZW50cyA9IE5VTEw7CisJZnEtPnEuZnJhZ21lbnRzX3RhaWwgPSBOVUxMOwogCiAJLyogYWxsIG9yaWdpbmFsIHNrYnMgYXJlIGxpbmtlZCBpbnRvIHRoZSBORkNUX0ZSQUc2X0NCKGhlYWQpLm9yaWcgKi8KIAlmcCA9IHNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwppbmRleCA1NjY3OThkLi5kMDgyZWFlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0xNzQsMTcgKzE3NCwyOCBAQAogCQkJCWNvbnN0IHN0cnVjdCBzbm1wX21pYiAqaXRlbWxpc3QpCiB7CiAJaW50IGk7Ci0JZm9yIChpPTA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKKworCWZvciAoaSA9IDA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLAogCQkJICAgc25tcF9mb2xkX2ZpZWxkKG1pYiwgaXRlbWxpc3RbaV0uZW50cnkpKTsKIH0KIAorc3RhdGljIHZvaWQgc25tcDZfc2VxX3Nob3dfaXRlbTY0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkIF9fcGVyY3B1ICoqbWliLAorCQkJCSAgY29uc3Qgc3RydWN0IHNubXBfbWliICppdGVtbGlzdCwgc2l6ZV90IHN5bmNwb2ZmKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaXRlbWxpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbGx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLAorCQkJICAgc25tcF9mb2xkX2ZpZWxkNjQobWliLCBpdGVtbGlzdFtpXS5lbnRyeSwgc3luY3BvZmYpKTsKK30KKwogc3RhdGljIGludCBzbm1wNl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSAoc3RydWN0IG5ldCAqKXNlcS0+cHJpdmF0ZTsKIAotCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MsCi0JCQkgICAgc25tcDZfaXBzdGF0c19saXN0KTsKKwlzbm1wNl9zZXFfc2hvd19pdGVtNjQoc2VxLCAodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MsCisJCQkgICAgc25tcDZfaXBzdGF0c19saXN0LCBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSk7CiAJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzLAogCQkJICAgIHNubXA2X2ljbXA2X2xpc3QpOwogCXNubXA2X3NlcV9zaG93X2ljbXB2Nm1zZyhzZXEsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDRhNGRjYmUuLmU2Nzc5MzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC02MDIsMzEgKzYwMiwzMyBAQAogfQogCiBzdGF0aWMgaW50IHJhd3Y2X3NlbmRfaGRyaW5jKHN0cnVjdCBzb2NrICpzaywgdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwKLQkJCXN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBydDZfaW5mbyAqcnQsCisJCQlzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgZHN0X2VudHJ5ICoqZHN0cCwKIAkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGlwdjZoZHIgKmlwaDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnI7CisJc3RydWN0IHJ0Nl9pbmZvICpydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikqZHN0cDsKIAotCWlmIChsZW5ndGggPiBydC0+dS5kc3QuZGV2LT5tdHUpIHsKLQkJaXB2Nl9sb2NhbF9lcnJvcihzaywgRU1TR1NJWkUsIGZsLCBydC0+dS5kc3QuZGV2LT5tdHUpOworCWlmIChsZW5ndGggPiBydC0+ZHN0LmRldi0+bXR1KSB7CisJCWlwdjZfbG9jYWxfZXJyb3Ioc2ssIEVNU0dTSVpFLCBmbCwgcnQtPmRzdC5kZXYtPm10dSk7CiAJCXJldHVybiAtRU1TR1NJWkU7CiAJfQogCWlmIChmbGFncyZNU0dfUFJPQkUpCiAJCWdvdG8gb3V0OwogCiAJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKLQkJCQkgIGxlbmd0aCArIExMX0FMTE9DQVRFRF9TUEFDRShydC0+dS5kc3QuZGV2KSArIDE1LAorCQkJCSAgbGVuZ3RoICsgTExfQUxMT0NBVEVEX1NQQUNFKHJ0LT5kc3QuZGV2KSArIDE1LAogCQkJCSAgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT5kc3QuZGV2KSk7CiAKIAlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OwogCXNrYi0+bWFyayA9IHNrLT5za19tYXJrOwotCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKCZydC0+dS5kc3QpKTsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKKwkqZHN0cCA9IE5VTEw7CiAKIAlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKQEAgLTY0MSw3ICs2NDMsNyBAQAogCiAJSVA2X1VQRF9QT19TVEFUUyhzb2NrX25ldChzayksIHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOwogCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLAotCQkgICAgICBydC0+dS5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsKKwkJICAgICAgcnQtPmRzdC5kZXYsIGRzdF9vdXRwdXQpOwogCWlmIChlcnIgPiAwKQogCQllcnIgPSBuZXRfeG1pdF9lcnJubyhlcnIpOwogCWlmIChlcnIpCkBAIC03MjUsNyArNzI3LDcgQEAKIHsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgb3B0X3NwYWNlOwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKiBzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgbXNnLT5tc2dfbmFtZTsKLQlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIsICpmaW5hbF9wLCBmaW5hbDsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCByYXc2X3NvY2sgKnJwID0gcmF3Nl9zayhzayk7CkBAIC04NDcsMTMgKzg0OSw3IEBACiAJaWYgKGlwdjZfYWRkcl9hbnkoJmZsLmZsNl9zcmMpICYmICFpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJm5wLT5zYWRkcik7CiAKLQkvKiBtZXJnZSBpcDZfYnVpbGRfeG1pdCBmcm9tIGlwNl9vdXRwdXQgKi8KLQlpZiAob3B0ICYmIG9wdC0+c3JjcnQpIHsKLQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBvcHQtPnNyY3J0OwotCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7Ci0JCWZpbmFsX3AgPSAmZmluYWw7Ci0JfQorCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmwsIG9wdCwgJmZpbmFsKTsKIAogCWlmICghZmwub2lmICYmIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLmZsNl9kc3QpKQogCQlmbC5vaWYgPSBucC0+bWNhc3Rfb2lmOwpAQCAtODkyLDkgKzg4OCw5IEBACiAJCWdvdG8gZG9fY29uZmlybTsKIAogYmFja19mcm9tX2NvbmZpcm06Ci0JaWYgKGluZXQtPmhkcmluY2wpIHsKLQkJZXJyID0gcmF3djZfc2VuZF9oZHJpbmMoc2ssIG1zZy0+bXNnX2lvdiwgbGVuLCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwgbXNnLT5tc2dfZmxhZ3MpOwotCX0gZWxzZSB7CisJaWYgKGluZXQtPmhkcmluY2wpCisJCWVyciA9IHJhd3Y2X3NlbmRfaGRyaW5jKHNrLCBtc2ctPm1zZ19pb3YsIGxlbiwgJmZsLCAmZHN0LCBtc2ctPm1zZ19mbGFncyk7CisJZWxzZSB7CiAJCWxvY2tfc29jayhzayk7CiAJCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsCiAJCQlsZW4sIDAsIGhsaW1pdCwgdGNsYXNzLCBvcHQsICZmbCwgKHN0cnVjdCBydDZfaW5mbyopZHN0LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IDZkNDI5MmYuLjU0NWM0MTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTE1MCwxMSArMTUwLDggQEAKIEVYUE9SVF9TWU1CT0woaXA2X2ZyYWdfbWF0Y2gpOwogCiAvKiBNZW1vcnkgVHJhY2tpbmcgRnVuY3Rpb25zLiAqLwotc3RhdGljIGlubGluZSB2b2lkIGZyYWdfa2ZyZWVfc2tiKHN0cnVjdCBuZXRuc19mcmFncyAqbmYsCi0JCXN0cnVjdCBza19idWZmICpza2IsIGludCAqd29yaykKK3N0YXRpYyB2b2lkIGZyYWdfa2ZyZWVfc2tiKHN0cnVjdCBuZXRuc19mcmFncyAqbmYsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKHdvcmspCi0JCSp3b3JrIC09IHNrYi0+dHJ1ZXNpemU7CiAJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmbmYtPm1lbSk7CiAJa2ZyZWVfc2tiKHNrYik7CiB9CkBAIC0zMzYsNiArMzMzLDExIEBACiAJICogaW4gdGhlIGNoYWluIG9mIGZyYWdtZW50cyBzbyBmYXIuICBXZSBtdXN0IGtub3cgd2hlcmUgdG8gcHV0CiAJICogdGhpcyBmcmFnbWVudCwgcmlnaHQ/CiAJICovCisJcHJldiA9IGZxLT5xLmZyYWdtZW50c190YWlsOworCWlmICghcHJldiB8fCBGUkFHNl9DQihwcmV2KS0+b2Zmc2V0IDwgb2Zmc2V0KSB7CisJCW5leHQgPSBOVUxMOworCQlnb3RvIGZvdW5kOworCX0KIAlwcmV2ID0gTlVMTDsKIAlmb3IobmV4dCA9IGZxLT5xLmZyYWdtZW50czsgbmV4dCAhPSBOVUxMOyBuZXh0ID0gbmV4dC0+bmV4dCkgewogCQlpZiAoRlJBRzZfQ0IobmV4dCktPm9mZnNldCA+PSBvZmZzZXQpCkBAIC0zNDMsNiArMzQ1LDcgQEAKIAkJcHJldiA9IG5leHQ7CiAJfQogCitmb3VuZDoKIAkvKiBXZSBmb3VuZCB3aGVyZSB0byBwdXQgdGhpcyBvbmUuICBDaGVjayBmb3Igb3ZlcmxhcCB3aXRoCiAJICogcHJlY2VkaW5nIGZyYWdtZW50LCBhbmQsIGlmIG5lZWRlZCwgYWxpZ24gdGhpbmdzIHNvIHRoYXQKIAkgKiBhbnkgb3ZlcmxhcHMgYXJlIGVsaW1pbmF0ZWQuCkBAIC0zOTIsNyArMzk1LDcgQEAKIAkJCQlmcS0+cS5mcmFnbWVudHMgPSBuZXh0OwogCiAJCQlmcS0+cS5tZWF0IC09IGZyZWVfaXQtPmxlbjsKLQkJCWZyYWdfa2ZyZWVfc2tiKGZxLT5xLm5ldCwgZnJlZV9pdCwgTlVMTCk7CisJCQlmcmFnX2tmcmVlX3NrYihmcS0+cS5uZXQsIGZyZWVfaXQpOwogCQl9CiAJfQogCkBAIC00MDAsNiArNDAzLDggQEAKIAogCS8qIEluc2VydCB0aGlzIGZyYWdtZW50IGluIHRoZSBjaGFpbiBvZiBmcmFnbWVudHMuICovCiAJc2tiLT5uZXh0ID0gbmV4dDsKKwlpZiAoIW5leHQpCisJCWZxLT5xLmZyYWdtZW50c190YWlsID0gc2tiOwogCWlmIChwcmV2KQogCQlwcmV2LT5uZXh0ID0gc2tiOwogCWVsc2UKQEAgLTQ2Niw2ICs0NzEsOCBAQAogCQkJZ290byBvdXRfb29tOwogCiAJCWZwLT5uZXh0ID0gaGVhZC0+bmV4dDsKKwkJaWYgKCFmcC0+bmV4dCkKKwkJCWZxLT5xLmZyYWdtZW50c190YWlsID0gZnA7CiAJCXByZXYtPm5leHQgPSBmcDsKIAogCQlza2JfbW9ycGgoaGVhZCwgZnEtPnEuZnJhZ21lbnRzKTsKQEAgLTUyNCw3ICs1MzEsNiBAQAogCXNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdCA9IGhlYWQtPm5leHQ7CiAJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoaGVhZCk7CiAJc2tiX3B1c2goaGVhZCwgaGVhZC0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSk7Ci0JYXRvbWljX3N1YihoZWFkLT50cnVlc2l6ZSwgJmZxLT5xLm5ldC0+bWVtKTsKIAogCWZvciAoZnA9aGVhZC0+bmV4dDsgZnA7IGZwID0gZnAtPm5leHQpIHsKIAkJaGVhZC0+ZGF0YV9sZW4gKz0gZnAtPmxlbjsKQEAgLTUzNCw4ICs1NDAsOCBAQAogCQllbHNlIGlmIChoZWFkLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCiAJCQloZWFkLT5jc3VtID0gY3N1bV9hZGQoaGVhZC0+Y3N1bSwgZnAtPmNzdW0pOwogCQloZWFkLT50cnVlc2l6ZSArPSBmcC0+dHJ1ZXNpemU7Ci0JCWF0b21pY19zdWIoZnAtPnRydWVzaXplLCAmZnEtPnEubmV0LT5tZW0pOwogCX0KKwlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmZnEtPnEubmV0LT5tZW0pOwogCiAJaGVhZC0+bmV4dCA9IE5VTEw7CiAJaGVhZC0+ZGV2ID0gZGV2OwpAQCAtNTUzLDYgKzU1OSw3IEBACiAJSVA2X0lOQ19TVEFUU19CSChuZXQsIF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWZxLT5xLmZyYWdtZW50cyA9IE5VTEw7CisJZnEtPnEuZnJhZ21lbnRzX3RhaWwgPSBOVUxMOwogCXJldHVybiAxOwogCiBvdXRfb3ZlcnNpemU6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCAyNTJkNzYxLi44ZjJkMDQwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTEyNiwxNiArMTI2LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJ0Nl9pbmZvIGlwNl9udWxsX2VudHJ5X3RlbXBsYXRlID0gewotCS51ID0gewotCQkuZHN0ID0gewotCQkJLl9fcmVmY250CT0gQVRPTUlDX0lOSVQoMSksCi0JCQkuX191c2UJCT0gMSwKLQkJCS5vYnNvbGV0ZQk9IC0xLAotCQkJLmVycm9yCQk9IC1FTkVUVU5SRUFDSCwKLQkJCS5tZXRyaWNzCT0geyBbUlRBWF9IT1BMSU1JVCAtIDFdID0gMjU1LCB9LAotCQkJLmlucHV0CQk9IGlwNl9wa3RfZGlzY2FyZCwKLQkJCS5vdXRwdXQJCT0gaXA2X3BrdF9kaXNjYXJkX291dCwKLQkJfQorCS5kc3QgPSB7CisJCS5fX3JlZmNudAk9IEFUT01JQ19JTklUKDEpLAorCQkuX191c2UJCT0gMSwKKwkJLm9ic29sZXRlCT0gLTEsCisJCS5lcnJvcgkJPSAtRU5FVFVOUkVBQ0gsCisJCS5tZXRyaWNzCT0geyBbUlRBWF9IT1BMSU1JVCAtIDFdID0gMjU1LCB9LAorCQkuaW5wdXQJCT0gaXA2X3BrdF9kaXNjYXJkLAorCQkub3V0cHV0CQk9IGlwNl9wa3RfZGlzY2FyZF9vdXQsCiAJfSwKIAkucnQ2aV9mbGFncwk9IChSVEZfUkVKRUNUIHwgUlRGX05PTkVYVEhPUCksCiAJLnJ0NmlfcHJvdG9jb2wgID0gUlRQUk9UX0tFUk5FTCwKQEAgLTE0OSwxNiArMTQ3LDE0IEBACiBzdGF0aWMgaW50IGlwNl9wa3RfcHJvaGliaXRfb3V0KHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgc3RydWN0IHJ0Nl9pbmZvIGlwNl9wcm9oaWJpdF9lbnRyeV90ZW1wbGF0ZSA9IHsKLQkudSA9IHsKLQkJLmRzdCA9IHsKLQkJCS5fX3JlZmNudAk9IEFUT01JQ19JTklUKDEpLAotCQkJLl9fdXNlCQk9IDEsCi0JCQkub2Jzb2xldGUJPSAtMSwKLQkJCS5lcnJvcgkJPSAtRUFDQ0VTLAotCQkJLm1ldHJpY3MJPSB7IFtSVEFYX0hPUExJTUlUIC0gMV0gPSAyNTUsIH0sCi0JCQkuaW5wdXQJCT0gaXA2X3BrdF9wcm9oaWJpdCwKLQkJCS5vdXRwdXQJCT0gaXA2X3BrdF9wcm9oaWJpdF9vdXQsCi0JCX0KKwkuZHN0ID0geworCQkuX19yZWZjbnQJPSBBVE9NSUNfSU5JVCgxKSwKKwkJLl9fdXNlCQk9IDEsCisJCS5vYnNvbGV0ZQk9IC0xLAorCQkuZXJyb3IJCT0gLUVBQ0NFUywKKwkJLm1ldHJpY3MJPSB7IFtSVEFYX0hPUExJTUlUIC0gMV0gPSAyNTUsIH0sCisJCS5pbnB1dAkJPSBpcDZfcGt0X3Byb2hpYml0LAorCQkub3V0cHV0CQk9IGlwNl9wa3RfcHJvaGliaXRfb3V0LAogCX0sCiAJLnJ0NmlfZmxhZ3MJPSAoUlRGX1JFSkVDVCB8IFJURl9OT05FWFRIT1ApLAogCS5ydDZpX3Byb3RvY29sICA9IFJUUFJPVF9LRVJORUwsCkBAIC0xNjcsMTYgKzE2MywxNCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBydDZfaW5mbyBpcDZfYmxrX2hvbGVfZW50cnlfdGVtcGxhdGUgPSB7Ci0JLnUgPSB7Ci0JCS5kc3QgPSB7Ci0JCQkuX19yZWZjbnQJPSBBVE9NSUNfSU5JVCgxKSwKLQkJCS5fX3VzZQkJPSAxLAotCQkJLm9ic29sZXRlCT0gLTEsCi0JCQkuZXJyb3IJCT0gLUVJTlZBTCwKLQkJCS5tZXRyaWNzCT0geyBbUlRBWF9IT1BMSU1JVCAtIDFdID0gMjU1LCB9LAotCQkJLmlucHV0CQk9IGRzdF9kaXNjYXJkLAotCQkJLm91dHB1dAkJPSBkc3RfZGlzY2FyZCwKLQkJfQorCS5kc3QgPSB7CisJCS5fX3JlZmNudAk9IEFUT01JQ19JTklUKDEpLAorCQkuX191c2UJCT0gMSwKKwkJLm9ic29sZXRlCT0gLTEsCisJCS5lcnJvcgkJPSAtRUlOVkFMLAorCQkubWV0cmljcwk9IHsgW1JUQVhfSE9QTElNSVQgLSAxXSA9IDI1NSwgfSwKKwkJLmlucHV0CQk9IGRzdF9kaXNjYXJkLAorCQkub3V0cHV0CQk9IGRzdF9kaXNjYXJkLAogCX0sCiAJLnJ0NmlfZmxhZ3MJPSAoUlRGX1JFSkVDVCB8IFJURl9OT05FWFRIT1ApLAogCS5ydDZpX3Byb3RvY29sICA9IFJUUFJPVF9LRVJORUwsCkBAIC0yNDksNyArMjQzLDcgQEAKIAlpZiAoIW9pZiAmJiBpcHY2X2FkZHJfYW55KHNhZGRyKSkKIAkJZ290byBvdXQ7CiAKLQlmb3IgKHNwcnQgPSBydDsgc3BydDsgc3BydCA9IHNwcnQtPnUuZHN0LnJ0Nl9uZXh0KSB7CisJZm9yIChzcHJ0ID0gcnQ7IHNwcnQ7IHNwcnQgPSBzcHJ0LT5kc3QucnQ2X25leHQpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwcnQtPnJ0NmlfZGV2OwogCiAJCWlmIChvaWYpIHsKQEAgLTQwNywxMCArNDAxLDEwIEBACiAKIAltYXRjaCA9IE5VTEw7CiAJZm9yIChydCA9IHJyX2hlYWQ7IHJ0ICYmIHJ0LT5ydDZpX21ldHJpYyA9PSBtZXRyaWM7Ci0JICAgICBydCA9IHJ0LT51LmRzdC5ydDZfbmV4dCkKKwkgICAgIHJ0ID0gcnQtPmRzdC5ydDZfbmV4dCkKIAkJbWF0Y2ggPSBmaW5kX21hdGNoKHJ0LCBvaWYsIHN0cmljdCwgJm1wcmksIG1hdGNoKTsKIAlmb3IgKHJ0ID0gZm4tPmxlYWY7IHJ0ICYmIHJ0ICE9IHJyX2hlYWQgJiYgcnQtPnJ0NmlfbWV0cmljID09IG1ldHJpYzsKLQkgICAgIHJ0ID0gcnQtPnUuZHN0LnJ0Nl9uZXh0KQorCSAgICAgcnQgPSBydC0+ZHN0LnJ0Nl9uZXh0KQogCQltYXRjaCA9IGZpbmRfbWF0Y2gocnQsIG9pZiwgc3RyaWN0LCAmbXByaSwgbWF0Y2gpOwogCiAJcmV0dXJuIG1hdGNoOwpAQCAtNDMyLDcgKzQyNiw3IEBACiAKIAlpZiAoIW1hdGNoICYmCiAJICAgIChzdHJpY3QgJiBSVDZfTE9PS1VQX0ZfUkVBQ0hBQkxFKSkgewotCQlzdHJ1Y3QgcnQ2X2luZm8gKm5leHQgPSBydDAtPnUuZHN0LnJ0Nl9uZXh0OworCQlzdHJ1Y3QgcnQ2X2luZm8gKm5leHQgPSBydDAtPmRzdC5ydDZfbmV4dDsKIAogCQkvKiBubyBlbnRyaWVzIG1hdGNoZWQ7IGRvIHJvdW5kLXJvYmluICovCiAJCWlmICghbmV4dCB8fCBuZXh0LT5ydDZpX21ldHJpYyAhPSBydDAtPnJ0NmlfbWV0cmljKQpAQCAtNTE3LDcgKzUxMSw3IEBACiAJCQlydC0+cnQ2aV9leHBpcmVzID0gamlmZmllcyArIEhaICogbGlmZXRpbWU7CiAJCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKIAkJfQotCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTU1NSw3ICs1NDksNyBAQAogCXJ0ID0gcnQ2X2RldmljZV9tYXRjaChuZXQsIHJ0LCAmZmwtPmZsNl9zcmMsIGZsLT5vaWYsIGZsYWdzKTsKIAlCQUNLVFJBQ0sobmV0LCAmZmwtPmZsNl9zcmMpOwogb3V0OgotCWRzdF91c2UoJnJ0LT51LmRzdCwgamlmZmllcyk7CisJZHN0X3VzZSgmcnQtPmRzdCwgamlmZmllcyk7CiAJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CiAJcmV0dXJuIHJ0OwogCkBAIC02NDMsNyArNjM3LDcgQEAKIAkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcik7CiAJCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwogCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfQ0FDSEU7Ci0JCXJ0LT51LmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKKwkJcnQtPmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJCWlmIChydC0+cnQ2aV9zcmMucGxlbiAmJiBzYWRkcikgewpAQCAtNjc3LDcgKzY3MSw3IEBACiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkgICAgICAgIk5laWdoYm91ciB0YWJsZSBvdmVyZmxvdy5cbiIpOwotCQkJZHN0X2ZyZWUoJnJ0LT51LmRzdCk7CisJCQlkc3RfZnJlZSgmcnQtPmRzdCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2g7CkBAIC02OTQsNyArNjg4LDcgQEAKIAkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcik7CiAJCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwogCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfQ0FDSEU7Ci0JCXJ0LT51LmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKKwkJcnQtPmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAkJcnQtPnJ0NmlfbmV4dGhvcCA9IG5laWdoX2Nsb25lKG9ydC0+cnQ2aV9uZXh0aG9wKTsKIAl9CiAJcmV0dXJuIHJ0OwpAQCAtNzI2LDcgKzcyMCw3IEBACiAJICAgIHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0NBQ0hFKQogCQlnb3RvIG91dDsKIAotCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCWRzdF9ob2xkKCZydC0+ZHN0KTsKIAlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIAogCWlmICghcnQtPnJ0NmlfbmV4dGhvcCAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpCkBAIC03MzksMTAgKzczMywxMCBAQAogI2VuZGlmCiAJfQogCi0JZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCXJ0ID0gbnJ0ID8gOiBuZXQtPmlwdjYuaXA2X251bGxfZW50cnk7CiAKLQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwlkc3RfaG9sZCgmcnQtPmRzdCk7CiAJaWYgKG5ydCkgewogCQllcnIgPSBpcDZfaW5zX3J0KG5ydCk7CiAJCWlmICghZXJyKQpAQCAtNzU2LDcgKzc1MCw3IEBACiAJICogUmFjZSBjb25kaXRpb24hIEluIHRoZSBnYXAsIHdoZW4gdGFibGUtPnRiNl9sb2NrIHdhcwogCSAqIHJlbGVhc2VkIHNvbWVvbmUgY291bGQgaW5zZXJ0IHRoaXMgcm91dGUuICBSZWxvb2t1cC4KIAkgKi8KLQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJZ290byByZWxvb2t1cDsKIAogb3V0OgpAQCAtNzY0LDExICs3NTgsMTEgQEAKIAkJcmVhY2hhYmxlID0gMDsKIAkJZ290byByZXN0YXJ0XzI7CiAJfQotCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCWRzdF9ob2xkKCZydC0+ZHN0KTsKIAlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIG91dDI6Ci0JcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOwotCXJ0LT51LmRzdC5fX3VzZSsrOworCXJ0LT5kc3QubGFzdHVzZSA9IGppZmZpZXM7CisJcnQtPmRzdC5fX3VzZSsrOwogCiAJcmV0dXJuIHJ0OwogfQpAQCAtODM1LDE1ICs4MjksMTUgQEAKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpuZXcgPSBOVUxMOwogCiAJaWYgKHJ0KSB7Ci0JCW5ldyA9ICZydC0+dS5kc3Q7CisJCW5ldyA9ICZydC0+ZHN0OwogCiAJCWF0b21pY19zZXQoJm5ldy0+X19yZWZjbnQsIDEpOwogCQluZXctPl9fdXNlID0gMTsKIAkJbmV3LT5pbnB1dCA9IGRzdF9kaXNjYXJkOwogCQluZXctPm91dHB1dCA9IGRzdF9kaXNjYXJkOwogCi0JCW1lbWNweShuZXctPm1ldHJpY3MsIG9ydC0+dS5kc3QubWV0cmljcywgUlRBWF9NQVgqc2l6ZW9mKHUzMikpOwotCQluZXctPmRldiA9IG9ydC0+dS5kc3QuZGV2OworCQltZW1jcHkobmV3LT5tZXRyaWNzLCBvcnQtPmRzdC5tZXRyaWNzLCBSVEFYX01BWCpzaXplb2YodTMyKSk7CisJCW5ldy0+ZGV2ID0gb3J0LT5kc3QuZGV2OwogCQlpZiAobmV3LT5kZXYpCiAJCQlkZXZfaG9sZChuZXctPmRldik7CiAJCXJ0LT5ydDZpX2lkZXYgPSBvcnQtPnJ0NmlfaWRldjsKQEAgLTkxMiw3ICs5MDYsNyBAQAogCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKSBza2JfZHN0KHNrYik7CiAJaWYgKHJ0KSB7CiAJCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfQ0FDSEUpIHsKLQkJCWRzdF9zZXRfZXhwaXJlcygmcnQtPnUuZHN0LCAwKTsKKwkJCWRzdF9zZXRfZXhwaXJlcygmcnQtPmRzdCwgMCk7CiAJCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKIAkJfSBlbHNlIGlmIChydC0+cnQ2aV9ub2RlICYmIChydC0+cnQ2aV9mbGFncyAmIFJURl9ERUZBVUxUKSkKIAkJCXJ0LT5ydDZpX25vZGUtPmZuX3Nlcm51bSA9IC0xOwpAQCAtOTg2LDE0ICs5ODAsMTQgQEAKIAlydC0+cnQ2aV9kZXYJICA9IGRldjsKIAlydC0+cnQ2aV9pZGV2ICAgICA9IGlkZXY7CiAJcnQtPnJ0NmlfbmV4dGhvcCAgPSBuZWlnaDsKLQlhdG9taWNfc2V0KCZydC0+dS5kc3QuX19yZWZjbnQsIDEpOwotCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfSE9QTElNSVQtMV0gPSAyNTU7Ci0JcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBpcHY2X2dldF9tdHUocnQtPnJ0NmlfZGV2KTsKLQlydC0+dS5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IGlwdjZfYWR2bXNzKG5ldCwgZHN0X210dSgmcnQtPnUuZHN0KSk7Ci0JcnQtPnUuZHN0Lm91dHB1dCAgPSBpcDZfb3V0cHV0OworCWF0b21pY19zZXQoJnJ0LT5kc3QuX19yZWZjbnQsIDEpOworCXJ0LT5kc3QubWV0cmljc1tSVEFYX0hPUExJTUlULTFdID0gMjU1OworCXJ0LT5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IGlwdjZfZ2V0X210dShydC0+cnQ2aV9kZXYpOworCXJ0LT5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IGlwdjZfYWR2bXNzKG5ldCwgZHN0X210dSgmcnQtPmRzdCkpOworCXJ0LT5kc3Qub3V0cHV0ICA9IGlwNl9vdXRwdXQ7CiAKICNpZiAwCS8qIHRoZXJlJ3Mgbm8gY2hhbmNlIHRvIHVzZSB0aGVzZSBmb3IgbmRpc2MgKi8KLQlydC0+dS5kc3QuZmxhZ3MgICA9IGlwdjZfYWRkcl90eXBlKGFkZHIpICYgSVBWNl9BRERSX1VOSUNBU1QKKwlydC0+ZHN0LmZsYWdzICAgPSBpcHY2X2FkZHJfdHlwZShhZGRyKSAmIElQVjZfQUREUl9VTklDQVNUCiAJCQkJPyBEU1RfSE9TVAogCQkJCTogMDsKIAlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOwpAQCAtMTAwMSwxNCArOTk1LDE0IEBACiAjZW5kaWYKIAogCXNwaW5fbG9ja19iaCgmaWNtcDZfZHN0X2xvY2spOwotCXJ0LT51LmRzdC5uZXh0ID0gaWNtcDZfZHN0X2djX2xpc3Q7Ci0JaWNtcDZfZHN0X2djX2xpc3QgPSAmcnQtPnUuZHN0OworCXJ0LT5kc3QubmV4dCA9IGljbXA2X2RzdF9nY19saXN0OworCWljbXA2X2RzdF9nY19saXN0ID0gJnJ0LT5kc3Q7CiAJc3Bpbl91bmxvY2tfYmgoJmljbXA2X2RzdF9sb2NrKTsKIAogCWZpYjZfZm9yY2Vfc3RhcnRfZ2MobmV0KTsKIAogb3V0OgotCXJldHVybiAmcnQtPnUuZHN0OworCXJldHVybiAmcnQtPmRzdDsKIH0KIAogaW50IGljbXA2X2RzdF9nYyh2b2lkKQpAQCAtMTA5MCwxMSArMTA4NCwxMSBAQAogCWludCBtdHUgPSBJUFY2X01JTl9NVFU7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKIAotCWlkZXYgPSBpbjZfZGV2X2dldChkZXYpOwotCWlmIChpZGV2KSB7CisJcmN1X3JlYWRfbG9jaygpOworCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CisJaWYgKGlkZXYpCiAJCW10dSA9IGlkZXYtPmNuZi5tdHU2OwotCQlpbjZfZGV2X3B1dChpZGV2KTsKLQl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIG10dTsKIH0KIApAQCAtMTEwMywxMiArMTA5NywxNSBAQAogCWludCBob3BsaW1pdCA9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0hPUExJTUlUKTsKIAlpZiAoaG9wbGltaXQgPCAwKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc3QtPmRldjsKLQkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGluNl9kZXZfZ2V0KGRldik7Ci0JCWlmIChpZGV2KSB7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZGV2ID0gX19pbjZfZGV2X2dldChkZXYpOworCQlpZiAoaWRldikKIAkJCWhvcGxpbWl0ID0gaWRldi0+Y25mLmhvcF9saW1pdDsKLQkJCWluNl9kZXZfcHV0KGlkZXYpOwotCQl9IGVsc2UKKwkJZWxzZQogCQkJaG9wbGltaXQgPSBkZXZfbmV0KGRldiktPmlwdjYuZGV2Y29uZl9hbGwtPmhvcF9saW1pdDsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCXJldHVybiBob3BsaW1pdDsKIH0KQEAgLTExNTksNyArMTE1Niw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJ0LT51LmRzdC5vYnNvbGV0ZSA9IC0xOworCXJ0LT5kc3Qub2Jzb2xldGUgPSAtMTsKIAlydC0+cnQ2aV9leHBpcmVzID0gKGNmZy0+ZmNfZmxhZ3MgJiBSVEZfRVhQSVJFUykgPwogCQkJCWppZmZpZXMgKyBjbG9ja190X3RvX2ppZmZpZXMoY2ZnLT5mY19leHBpcmVzKSA6CiAJCQkJMDsKQEAgLTExNzEsMTYgKzExNjgsMTYgQEAKIAlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmY2ZnLT5mY19kc3QpOwogCiAJaWYgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NVUxUSUNBU1QpCi0JCXJ0LT51LmRzdC5pbnB1dCA9IGlwNl9tY19pbnB1dDsKKwkJcnQtPmRzdC5pbnB1dCA9IGlwNl9tY19pbnB1dDsKIAllbHNlCi0JCXJ0LT51LmRzdC5pbnB1dCA9IGlwNl9mb3J3YXJkOworCQlydC0+ZHN0LmlucHV0ID0gaXA2X2ZvcndhcmQ7CiAKLQlydC0+dS5kc3Qub3V0cHV0ID0gaXA2X291dHB1dDsKKwlydC0+ZHN0Lm91dHB1dCA9IGlwNl9vdXRwdXQ7CiAKIAlpcHY2X2FkZHJfcHJlZml4KCZydC0+cnQ2aV9kc3QuYWRkciwgJmNmZy0+ZmNfZHN0LCBjZmctPmZjX2RzdF9sZW4pOwogCXJ0LT5ydDZpX2RzdC5wbGVuID0gY2ZnLT5mY19kc3RfbGVuOwogCWlmIChydC0+cnQ2aV9kc3QucGxlbiA9PSAxMjgpCi0JICAgICAgIHJ0LT51LmRzdC5mbGFncyA9IERTVF9IT1NUOworCSAgICAgICBydC0+ZHN0LmZsYWdzID0gRFNUX0hPU1Q7CiAKICNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUwogCWlwdjZfYWRkcl9wcmVmaXgoJnJ0LT5ydDZpX3NyYy5hZGRyLCAmY2ZnLT5mY19zcmMsIGNmZy0+ZmNfc3JjX2xlbik7CkBAIC0xMjA4LDkgKzEyMDUsOSBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9Ci0JCXJ0LT51LmRzdC5vdXRwdXQgPSBpcDZfcGt0X2Rpc2NhcmRfb3V0OwotCQlydC0+dS5kc3QuaW5wdXQgPSBpcDZfcGt0X2Rpc2NhcmQ7Ci0JCXJ0LT51LmRzdC5lcnJvciA9IC1FTkVUVU5SRUFDSDsKKwkJcnQtPmRzdC5vdXRwdXQgPSBpcDZfcGt0X2Rpc2NhcmRfb3V0OworCQlydC0+ZHN0LmlucHV0ID0gaXA2X3BrdF9kaXNjYXJkOworCQlydC0+ZHN0LmVycm9yID0gLUVORVRVTlJFQUNIOwogCQlydC0+cnQ2aV9mbGFncyA9IFJURl9SRUpFQ1R8UlRGX05PTkVYVEhPUDsKIAkJZ290byBpbnN0YWxsX3JvdXRlOwogCX0KQEAgLTEyNDQsNyArMTI0MSw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQlpZiAoZGV2KSB7CiAJCQkJaWYgKGRldiAhPSBncnQtPnJ0NmlfZGV2KSB7Ci0JCQkJCWRzdF9yZWxlYXNlKCZncnQtPnUuZHN0KTsKKwkJCQkJZHN0X3JlbGVhc2UoJmdydC0+ZHN0KTsKIAkJCQkJZ290byBvdXQ7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTEyNTUsNyArMTI1Miw3IEBACiAJCQl9CiAJCQlpZiAoIShncnQtPnJ0NmlfZmxhZ3MmUlRGX0dBVEVXQVkpKQogCQkJCWVyciA9IDA7Ci0JCQlkc3RfcmVsZWFzZSgmZ3J0LT51LmRzdCk7CisJCQlkc3RfcmVsZWFzZSgmZ3J0LT5kc3QpOwogCiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwpAQCAtMTI5NCwxOCArMTI5MSwxOCBAQAogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAKLQkJCQlydC0+dS5kc3QubWV0cmljc1t0eXBlIC0gMV0gPSBubGFfZ2V0X3UzMihubGEpOworCQkJCXJ0LT5kc3QubWV0cmljc1t0eXBlIC0gMV0gPSBubGFfZ2V0X3UzMihubGEpOwogCQkJfQogCQl9CiAJfQogCi0JaWYgKGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9IT1BMSU1JVCkgPT0gMCkKLQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IC0xOwotCWlmICghZHN0X210dSgmcnQtPnUuZHN0KSkKLQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBpcHY2X2dldF9tdHUoZGV2KTsKLQlpZiAoIWRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9BRFZNU1MpKQotCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IGlwdjZfYWR2bXNzKG5ldCwgZHN0X210dSgmcnQtPnUuZHN0KSk7Ci0JcnQtPnUuZHN0LmRldiA9IGRldjsKKwlpZiAoZHN0X21ldHJpYygmcnQtPmRzdCwgUlRBWF9IT1BMSU1JVCkgPT0gMCkKKwkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfSE9QTElNSVQtMV0gPSAtMTsKKwlpZiAoIWRzdF9tdHUoJnJ0LT5kc3QpKQorCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBpcHY2X2dldF9tdHUoZGV2KTsKKwlpZiAoIWRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfQURWTVNTKSkKKwkJcnQtPmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gaXB2Nl9hZHZtc3MobmV0LCBkc3RfbXR1KCZydC0+ZHN0KSk7CisJcnQtPmRzdC5kZXYgPSBkZXY7CiAJcnQtPnJ0NmlfaWRldiA9IGlkZXY7CiAJcnQtPnJ0NmlfdGFibGUgPSB0YWJsZTsKIApAQCAtMTMxOSw3ICsxMzE2LDcgQEAKIAlpZiAoaWRldikKIAkJaW42X2Rldl9wdXQoaWRldik7CiAJaWYgKHJ0KQotCQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwkJZHN0X2ZyZWUoJnJ0LT5kc3QpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEzMzYsNyArMTMzMyw3IEBACiAJd3JpdGVfbG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIAogCWVyciA9IGZpYjZfZGVsKHJ0LCBpbmZvKTsKLQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAKIAl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CiAKQEAgLTEzNjksNyArMTM2Niw3IEBACiAJCQkgJmNmZy0+ZmNfc3JjLCBjZmctPmZjX3NyY19sZW4pOwogCiAJaWYgKGZuKSB7Ci0JCWZvciAocnQgPSBmbi0+bGVhZjsgcnQ7IHJ0ID0gcnQtPnUuZHN0LnJ0Nl9uZXh0KSB7CisJCWZvciAocnQgPSBmbi0+bGVhZjsgcnQ7IHJ0ID0gcnQtPmRzdC5ydDZfbmV4dCkgewogCQkJaWYgKGNmZy0+ZmNfaWZpbmRleCAmJgogCQkJICAgIChydC0+cnQ2aV9kZXYgPT0gTlVMTCB8fAogCQkJICAgICBydC0+cnQ2aV9kZXYtPmlmaW5kZXggIT0gY2ZnLT5mY19pZmluZGV4KSkKQEAgLTEzNzksNyArMTM3Niw3IEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoY2ZnLT5mY19tZXRyaWMgJiYgY2ZnLT5mY19tZXRyaWMgIT0gcnQtPnJ0NmlfbWV0cmljKQogCQkJCWNvbnRpbnVlOwotCQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCQlkc3RfaG9sZCgmcnQtPmRzdCk7CiAJCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIAogCQkJcmV0dXJuIF9faXA2X2RlbF9ydChydCwgJmNmZy0+ZmNfbmxpbmZvKTsKQEAgLTE0MjEsNyArMTQxOCw3IEBACiAJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+dGI2X2xvY2spOwogCWZuID0gZmliNl9sb29rdXAoJnRhYmxlLT50YjZfcm9vdCwgJmZsLT5mbDZfZHN0LCAmZmwtPmZsNl9zcmMpOwogcmVzdGFydDoKLQlmb3IgKHJ0ID0gZm4tPmxlYWY7IHJ0OyBydCA9IHJ0LT51LmRzdC5ydDZfbmV4dCkgeworCWZvciAocnQgPSBmbi0+bGVhZjsgcnQ7IHJ0ID0gcnQtPmRzdC5ydDZfbmV4dCkgewogCQkvKgogCQkgKiBDdXJyZW50IHJvdXRlIGlzIG9uLWxpbms7IHJlZGlyZWN0IGlzIGFsd2F5cyBpbnZhbGlkLgogCQkgKgpAQCAtMTQ0NSw3ICsxNDQyLDcgQEAKIAkJcnQgPSBuZXQtPmlwdjYuaXA2X251bGxfZW50cnk7CiAJQkFDS1RSQUNLKG5ldCwgJmZsLT5mbDZfc3JjKTsKIG91dDoKLQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwlkc3RfaG9sZCgmcnQtPmRzdCk7CiAKIAlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIApAQCAtMTUxMywxMCArMTUxMCwxMCBAQAogCSAqIExvb2ssIHJlZGlyZWN0cyBhcmUgc2VudCBvbmx5IGluIHJlc3BvbnNlIHRvIGRhdGEgcGFja2V0cywKIAkgKiBzbyB0aGF0IHRoaXMgbmV4dGhvcCBhcHBhcmVudGx5IGlzIHJlYWNoYWJsZS4gLS1BTksKIAkgKi8KLQlkc3RfY29uZmlybSgmcnQtPnUuZHN0KTsKKwlkc3RfY29uZmlybSgmcnQtPmRzdCk7CiAKIAkvKiBEdXBsaWNhdGUgcmVkaXJlY3Q6IHNpbGVudGx5IGlnbm9yZS4gKi8KLQlpZiAobmVpZ2ggPT0gcnQtPnUuZHN0Lm5laWdoYm91cikKKwlpZiAobmVpZ2ggPT0gcnQtPmRzdC5uZWlnaGJvdXIpCiAJCWdvdG8gb3V0OwogCiAJbnJ0ID0gaXA2X3J0X2NvcHkocnQpOwpAQCAtMTUyOSwyMCArMTUyNiwyMCBAQAogCiAJaXB2Nl9hZGRyX2NvcHkoJm5ydC0+cnQ2aV9kc3QuYWRkciwgZGVzdCk7CiAJbnJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwotCW5ydC0+dS5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CisJbnJ0LT5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CiAKIAlpcHY2X2FkZHJfY29weSgmbnJ0LT5ydDZpX2dhdGV3YXksIChzdHJ1Y3QgaW42X2FkZHIqKW5laWdoLT5wcmltYXJ5X2tleSk7CiAJbnJ0LT5ydDZpX25leHRob3AgPSBuZWlnaF9jbG9uZShuZWlnaCk7CiAJLyogUmVzZXQgcG10dSwgaXQgbWF5IGJlIGJldHRlciAqLwotCW5ydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IGlwdjZfZ2V0X210dShuZWlnaC0+ZGV2KTsKLQlucnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhkZXZfbmV0KG5laWdoLT5kZXYpLAotCQkJCQkJCWRzdF9tdHUoJm5ydC0+dS5kc3QpKTsKKwlucnQtPmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gaXB2Nl9nZXRfbXR1KG5laWdoLT5kZXYpOworCW5ydC0+ZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhkZXZfbmV0KG5laWdoLT5kZXYpLAorCQkJCQkJCWRzdF9tdHUoJm5ydC0+ZHN0KSk7CiAKIAlpZiAoaXA2X2luc19ydChucnQpKQogCQlnb3RvIG91dDsKIAotCW5ldGV2ZW50Lm9sZCA9ICZydC0+dS5kc3Q7Ci0JbmV0ZXZlbnQubmV3ID0gJm5ydC0+dS5kc3Q7CisJbmV0ZXZlbnQub2xkID0gJnJ0LT5kc3Q7CisJbmV0ZXZlbnQubmV3ID0gJm5ydC0+ZHN0OwogCWNhbGxfbmV0ZXZlbnRfbm90aWZpZXJzKE5FVEVWRU5UX1JFRElSRUNULCAmbmV0ZXZlbnQpOwogCiAJaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9DQUNIRSkgewpAQCAtMTU1MSw3ICsxNTQ4LDcgQEAKIAl9CiAKIG91dDoKLQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiB9CiAKIC8qCkBAIC0xNTcwLDcgKzE1NjcsNyBAQAogCWlmIChydCA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlpZiAocG10dSA+PSBkc3RfbXR1KCZydC0+dS5kc3QpKQorCWlmIChwbXR1ID49IGRzdF9tdHUoJnJ0LT5kc3QpKQogCQlnb3RvIG91dDsKIAogCWlmIChwbXR1IDwgSVBWNl9NSU5fTVRVKSB7CkBAIC0xNTg4LDcgKzE1ODUsNyBAQAogCSAgIFRoZXkgYXJlIHNlbnQgb25seSBpbiByZXNwb25zZSB0byBkYXRhIHBhY2tldHMsCiAJICAgc28gdGhhdCB0aGlzIG5leHRob3AgYXBwYXJlbnRseSBpcyByZWFjaGFibGUuIC0tQU5LCiAJICovCi0JZHN0X2NvbmZpcm0oJnJ0LT51LmRzdCk7CisJZHN0X2NvbmZpcm0oJnJ0LT5kc3QpOwogCiAJLyogSG9zdCByb3V0ZS4gSWYgaXQgaXMgc3RhdGljLCBpdCB3b3VsZCBiZSBiZXR0ZXIKIAkgICBub3QgdG8gb3ZlcnJpZGUgaXQsIGJ1dCBhZGQgbmV3IG9uZSwgc28gdGhhdApAQCAtMTU5NiwxMCArMTU5MywxMCBAQAogCSAgIHdvdWxkIHJldHVybiBhdXRvbWF0aWNhbGx5LgogCSAqLwogCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9DQUNIRSkgewotCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IHBtdHU7CisJCXJ0LT5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IHBtdHU7CiAJCWlmIChhbGxmcmFnKQotCQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9GRUFUVVJFUy0xXSB8PSBSVEFYX0ZFQVRVUkVfQUxMRlJBRzsKLQkJZHN0X3NldF9leHBpcmVzKCZydC0+dS5kc3QsIG5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X210dV9leHBpcmVzKTsKKwkJCXJ0LT5kc3QubWV0cmljc1tSVEFYX0ZFQVRVUkVTLTFdIHw9IFJUQVhfRkVBVFVSRV9BTExGUkFHOworCQlkc3Rfc2V0X2V4cGlyZXMoJnJ0LT5kc3QsIG5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X210dV9leHBpcmVzKTsKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX01PRElGSUVEfFJURl9FWFBJUkVTOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjE1LDkgKzE2MTIsOSBAQAogCQlucnQgPSBydDZfYWxsb2NfY2xvbmUocnQsIGRhZGRyKTsKIAogCWlmIChucnQpIHsKLQkJbnJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gcG10dTsKKwkJbnJ0LT5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IHBtdHU7CiAJCWlmIChhbGxmcmFnKQotCQkJbnJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfRkVBVFVSRVMtMV0gfD0gUlRBWF9GRUFUVVJFX0FMTEZSQUc7CisJCQlucnQtPmRzdC5tZXRyaWNzW1JUQVhfRkVBVFVSRVMtMV0gfD0gUlRBWF9GRUFUVVJFX0FMTEZSQUc7CiAKIAkJLyogQWNjb3JkaW5nIHRvIFJGQyAxOTgxLCBkZXRlY3RpbmcgUE1UVSBpbmNyZWFzZSBzaG91bGRuJ3QgYmUKIAkJICogaGFwcGVuZWQgd2l0aGluIDUgbWlucywgdGhlIHJlY29tbWVuZGVkIHRpbWVyIGlzIDEwIG1pbnMuCkBAIC0xNjI1LDEzICsxNjIyLDEzIEBACiAJCSAqIHdoaWNoIGlzIDEwIG1pbnMuIEFmdGVyIDEwIG1pbnMgdGhlIGRlY3JlYXNlZCBwbXR1IGlzIGV4cGlyZWQKIAkJICogYW5kIGRldGVjdGluZyBQTVRVIGluY3JlYXNlIHdpbGwgYmUgYXV0b21hdGljYWxseSBoYXBwZW5lZC4KIAkJICovCi0JCWRzdF9zZXRfZXhwaXJlcygmbnJ0LT51LmRzdCwgbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfbXR1X2V4cGlyZXMpOworCQlkc3Rfc2V0X2V4cGlyZXMoJm5ydC0+ZHN0LCBuZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9tdHVfZXhwaXJlcyk7CiAJCW5ydC0+cnQ2aV9mbGFncyB8PSBSVEZfRFlOQU1JQ3xSVEZfRVhQSVJFUzsKIAogCQlpcDZfaW5zX3J0KG5ydCk7CiAJfQogb3V0OgotCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIH0KIAogLyoKQEAgLTE2NDQsMTggKzE2NDEsMTggQEAKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzKTsKIAogCWlmIChydCkgewotCQlydC0+dS5kc3QuaW5wdXQgPSBvcnQtPnUuZHN0LmlucHV0OwotCQlydC0+dS5kc3Qub3V0cHV0ID0gb3J0LT51LmRzdC5vdXRwdXQ7CisJCXJ0LT5kc3QuaW5wdXQgPSBvcnQtPmRzdC5pbnB1dDsKKwkJcnQtPmRzdC5vdXRwdXQgPSBvcnQtPmRzdC5vdXRwdXQ7CiAKLQkJbWVtY3B5KHJ0LT51LmRzdC5tZXRyaWNzLCBvcnQtPnUuZHN0Lm1ldHJpY3MsIFJUQVhfTUFYKnNpemVvZih1MzIpKTsKLQkJcnQtPnUuZHN0LmVycm9yID0gb3J0LT51LmRzdC5lcnJvcjsKLQkJcnQtPnUuZHN0LmRldiA9IG9ydC0+dS5kc3QuZGV2OwotCQlpZiAocnQtPnUuZHN0LmRldikKLQkJCWRldl9ob2xkKHJ0LT51LmRzdC5kZXYpOworCQltZW1jcHkocnQtPmRzdC5tZXRyaWNzLCBvcnQtPmRzdC5tZXRyaWNzLCBSVEFYX01BWCpzaXplb2YodTMyKSk7CisJCXJ0LT5kc3QuZXJyb3IgPSBvcnQtPmRzdC5lcnJvcjsKKwkJcnQtPmRzdC5kZXYgPSBvcnQtPmRzdC5kZXY7CisJCWlmIChydC0+ZHN0LmRldikKKwkJCWRldl9ob2xkKHJ0LT5kc3QuZGV2KTsKIAkJcnQtPnJ0NmlfaWRldiA9IG9ydC0+cnQ2aV9pZGV2OwogCQlpZiAocnQtPnJ0NmlfaWRldikKIAkJCWluNl9kZXZfaG9sZChydC0+cnQ2aV9pZGV2KTsKLQkJcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCQlydC0+ZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOwogCQlydC0+cnQ2aV9leHBpcmVzID0gMDsKIAogCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZ2F0ZXdheSwgJm9ydC0+cnQ2aV9nYXRld2F5KTsKQEAgLTE2ODksMTQgKzE2ODYsMTQgQEAKIAlpZiAoIWZuKQogCQlnb3RvIG91dDsKIAotCWZvciAocnQgPSBmbi0+bGVhZjsgcnQ7IHJ0ID0gcnQtPnUuZHN0LnJ0Nl9uZXh0KSB7CisJZm9yIChydCA9IGZuLT5sZWFmOyBydDsgcnQgPSBydC0+ZHN0LnJ0Nl9uZXh0KSB7CiAJCWlmIChydC0+cnQ2aV9kZXYtPmlmaW5kZXggIT0gaWZpbmRleCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKHJ0LT5ydDZpX2ZsYWdzICYgKFJURl9ST1VURUlORk98UlRGX0dBVEVXQVkpKSAhPSAoUlRGX1JPVVRFSU5GT3xSVEZfR0FURVdBWSkpCiAJCQljb250aW51ZTsKIAkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJnJ0LT5ydDZpX2dhdGV3YXksIGd3YWRkcikpCiAJCQljb250aW51ZTsKLQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCWRzdF9ob2xkKCZydC0+ZHN0KTsKIAkJYnJlYWs7CiAJfQogb3V0OgpAQCAtMTc0NCwxNCArMTc0MSwxNCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7Ci0JZm9yIChydCA9IHRhYmxlLT50YjZfcm9vdC5sZWFmOyBydDsgcnQ9cnQtPnUuZHN0LnJ0Nl9uZXh0KSB7CisJZm9yIChydCA9IHRhYmxlLT50YjZfcm9vdC5sZWFmOyBydDsgcnQ9cnQtPmRzdC5ydDZfbmV4dCkgewogCQlpZiAoZGV2ID09IHJ0LT5ydDZpX2RldiAmJgogCQkgICAgKChydC0+cnQ2aV9mbGFncyAmIChSVEZfQUREUkNPTkYgfCBSVEZfREVGQVVMVCkpID09IChSVEZfQUREUkNPTkYgfCBSVEZfREVGQVVMVCkpICYmCiAJCSAgICBpcHY2X2FkZHJfZXF1YWwoJnJ0LT5ydDZpX2dhdGV3YXksIGFkZHIpKQogCQkJYnJlYWs7CiAJfQogCWlmIChydCkKLQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCWRzdF9ob2xkKCZydC0+ZHN0KTsKIAl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CiAJcmV0dXJuIHJ0OwogfQpAQCAtMTc5MCw5ICsxNzg3LDkgQEAKIAogcmVzdGFydDoKIAlyZWFkX2xvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7Ci0JZm9yIChydCA9IHRhYmxlLT50YjZfcm9vdC5sZWFmOyBydDsgcnQgPSBydC0+dS5kc3QucnQ2X25leHQpIHsKKwlmb3IgKHJ0ID0gdGFibGUtPnRiNl9yb290LmxlYWY7IHJ0OyBydCA9IHJ0LT5kc3QucnQ2X25leHQpIHsKIAkJaWYgKHJ0LT5ydDZpX2ZsYWdzICYgKFJURl9ERUZBVUxUIHwgUlRGX0FERFJDT05GKSkgewotCQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCQlkc3RfaG9sZCgmcnQtPmRzdCk7CiAJCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIAkJCWlwNl9kZWxfcnQocnQpOwogCQkJZ290byByZXN0YXJ0OwpAQCAtMTkzMCwxNSArMTkyNywxNSBAQAogCWRldl9ob2xkKG5ldC0+bG9vcGJhY2tfZGV2KTsKIAlpbjZfZGV2X2hvbGQoaWRldik7CiAKLQlydC0+dS5kc3QuZmxhZ3MgPSBEU1RfSE9TVDsKLQlydC0+dS5kc3QuaW5wdXQgPSBpcDZfaW5wdXQ7Ci0JcnQtPnUuZHN0Lm91dHB1dCA9IGlwNl9vdXRwdXQ7CisJcnQtPmRzdC5mbGFncyA9IERTVF9IT1NUOworCXJ0LT5kc3QuaW5wdXQgPSBpcDZfaW5wdXQ7CisJcnQtPmRzdC5vdXRwdXQgPSBpcDZfb3V0cHV0OwogCXJ0LT5ydDZpX2RldiA9IG5ldC0+bG9vcGJhY2tfZGV2OwogCXJ0LT5ydDZpX2lkZXYgPSBpZGV2OwotCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gaXB2Nl9nZXRfbXR1KHJ0LT5ydDZpX2Rldik7Ci0JcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhuZXQsIGRzdF9tdHUoJnJ0LT51LmRzdCkpOwotCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfSE9QTElNSVQtMV0gPSAtMTsKLQlydC0+dS5kc3Qub2Jzb2xldGUgPSAtMTsKKwlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBpcHY2X2dldF9tdHUocnQtPnJ0NmlfZGV2KTsKKwlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhuZXQsIGRzdF9tdHUoJnJ0LT5kc3QpKTsKKwlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IC0xOworCXJ0LT5kc3Qub2Jzb2xldGUgPSAtMTsKIAogCXJ0LT5ydDZpX2ZsYWdzID0gUlRGX1VQIHwgUlRGX05PTkVYVEhPUDsKIAlpZiAoYW55Y2FzdCkKQEAgLTE5NDcsNyArMTk0NCw3IEBACiAJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9MT0NBTDsKIAluZWlnaCA9IG5kaXNjX2dldF9uZWlnaChydC0+cnQ2aV9kZXYsICZydC0+cnQ2aV9nYXRld2F5KTsKIAlpZiAoSVNfRVJSKG5laWdoKSkgewotCQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwkJZHN0X2ZyZWUoJnJ0LT5kc3QpOwogCiAJCS8qIFdlIGFyZSBjYXN0aW5nIHRoaXMgYmVjYXVzZSB0aGF0IGlzIHRoZSByZXR1cm4KIAkJICogdmFsdWUgdHlwZS4gIEJ1dCBhbiBlcnJubyBlbmNvZGVkIHBvaW50ZXIgaXMgdGhlCkBAIC0xOTYyLDcgKzE5NTksNyBAQAogCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwogCXJ0LT5ydDZpX3RhYmxlID0gZmliNl9nZXRfdGFibGUobmV0LCBSVDZfVEFCTEVfTE9DQUwpOwogCi0JYXRvbWljX3NldCgmcnQtPnUuZHN0Ll9fcmVmY250LCAxKTsKKwlhdG9taWNfc2V0KCZydC0+ZHN0Ll9fcmVmY250LCAxKTsKIAogCXJldHVybiBydDsKIH0KQEAgLTIwMzMsMTIgKzIwMzAsMTIgQEAKIAkgICBQTVRVIGRpc2NvdXZlcnkuCiAJICovCiAJaWYgKHJ0LT5ydDZpX2RldiA9PSBhcmctPmRldiAmJgotCSAgICAhZHN0X21ldHJpY19sb2NrZWQoJnJ0LT51LmRzdCwgUlRBWF9NVFUpICYmCi0JICAgIChkc3RfbXR1KCZydC0+dS5kc3QpID49IGFyZy0+bXR1IHx8Ci0JICAgICAoZHN0X210dSgmcnQtPnUuZHN0KSA8IGFyZy0+bXR1ICYmCi0JICAgICAgZHN0X210dSgmcnQtPnUuZHN0KSA9PSBpZGV2LT5jbmYubXR1NikpKSB7Ci0JCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gYXJnLT5tdHU7Ci0JCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gaXB2Nl9hZHZtc3MobmV0LCBhcmctPm10dSk7CisJICAgICFkc3RfbWV0cmljX2xvY2tlZCgmcnQtPmRzdCwgUlRBWF9NVFUpICYmCisJICAgIChkc3RfbXR1KCZydC0+ZHN0KSA+PSBhcmctPm10dSB8fAorCSAgICAgKGRzdF9tdHUoJnJ0LT5kc3QpIDwgYXJnLT5tdHUgJiYKKwkgICAgICBkc3RfbXR1KCZydC0+ZHN0KSA9PSBpZGV2LT5jbmYubXR1NikpKSB7CisJCXJ0LT5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IGFyZy0+bXR1OworCQlydC0+ZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhuZXQsIGFyZy0+bXR1KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjUyLDIwICsyMjQ5LDIwIEBACiAjZW5kaWYKIAkJCU5MQV9QVVRfVTMyKHNrYiwgUlRBX0lJRiwgaWlmKTsKIAl9IGVsc2UgaWYgKGRzdCkgewotCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaXA2X2RzdF9pZGV2KCZydC0+dS5kc3QpOworCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaXA2X2RzdF9pZGV2KCZydC0+ZHN0KTsKIAkJc3RydWN0IGluNl9hZGRyIHNhZGRyX2J1ZjsKIAkJaWYgKGlwdjZfZGV2X2dldF9zYWRkcihuZXQsIGlkZXYgPyBpZGV2LT5kZXYgOiBOVUxMLAogCQkJCSAgICAgICBkc3QsIDAsICZzYWRkcl9idWYpID09IDApCiAJCQlOTEFfUFVUKHNrYiwgUlRBX1BSRUZTUkMsIDE2LCAmc2FkZHJfYnVmKTsKIAl9CiAKLQlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPnUuZHN0Lm1ldHJpY3MpIDwgMCkKKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPmRzdC5tZXRyaWNzKSA8IDApCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKHJ0LT51LmRzdC5uZWlnaGJvdXIpCi0JCU5MQV9QVVQoc2tiLCBSVEFfR0FURVdBWSwgMTYsICZydC0+dS5kc3QubmVpZ2hib3VyLT5wcmltYXJ5X2tleSk7CisJaWYgKHJ0LT5kc3QubmVpZ2hib3VyKQorCQlOTEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDE2LCAmcnQtPmRzdC5uZWlnaGJvdXItPnByaW1hcnlfa2V5KTsKIAotCWlmIChydC0+dS5kc3QuZGV2KQorCWlmIChydC0+ZHN0LmRldikKIAkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfT0lGLCBydC0+cnQ2aV9kZXYtPmlmaW5kZXgpOwogCiAJTkxBX1BVVF9VMzIoc2tiLCBSVEFfUFJJT1JJVFksIHJ0LT5ydDZpX21ldHJpYyk7CkBAIC0yMjc3LDggKzIyNzQsOCBAQAogCWVsc2UKIAkJZXhwaXJlcyA9IElOVF9NQVg7CiAKLQlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT51LmRzdCwgMCwgMCwgMCwKLQkJCSAgICAgICBleHBpcmVzLCBydC0+dS5kc3QuZXJyb3IpIDwgMCkKKwlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT5kc3QsIDAsIDAsIDAsCisJCQkgICAgICAgZXhwaXJlcywgcnQtPmRzdC5lcnJvcikgPCAwKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwpAQCAtMjM2NCw3ICsyMzYxLDcgQEAKIAlza2JfcmVzZXJ2ZShza2IsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAogCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyopIGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBOVUxMLCAmZmwpOwotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAllcnIgPSBydDZfZmlsbF9ub2RlKG5ldCwgc2tiLCBydCwgJmZsLmZsNl9kc3QsICZmbC5mbDZfc3JjLCBpaWYsCiAJCQkgICAgUlRNX05FV1JPVVRFLCBORVRMSU5LX0NCKGluX3NrYikucGlkLApAQCAtMjQxNiwxMiArMjQxMywxMiBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKIAogCWlmIChldmVudCA9PSBORVRERVZfUkVHSVNURVIgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7Ci0JCW5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeS0+dS5kc3QuZGV2ID0gZGV2OworCQluZXQtPmlwdjYuaXA2X251bGxfZW50cnktPmRzdC5kZXYgPSBkZXY7CiAJCW5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeS0+cnQ2aV9pZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKICNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKLQkJbmV0LT5pcHY2LmlwNl9wcm9oaWJpdF9lbnRyeS0+dS5kc3QuZGV2ID0gZGV2OworCQluZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5LT5kc3QuZGV2ID0gZGV2OwogCQluZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5LT5ydDZpX2lkZXYgPSBpbjZfZGV2X2dldChkZXYpOwotCQluZXQtPmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5LT51LmRzdC5kZXYgPSBkZXY7CisJCW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPmRzdC5kZXYgPSBkZXY7CiAJCW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPnJ0NmlfaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CiAjZW5kaWYKIAl9CkBAIC0yNDY0LDggKzI0NjEsOCBAQAogCQlzZXFfcHV0cyhtLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKTsKIAl9CiAJc2VxX3ByaW50ZihtLCAiICUwOHggJTA4eCAlMDh4ICUwOHggJThzXG4iLAotCQkgICBydC0+cnQ2aV9tZXRyaWMsIGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpLAotCQkgICBydC0+dS5kc3QuX191c2UsIHJ0LT5ydDZpX2ZsYWdzLAorCQkgICBydC0+cnQ2aV9tZXRyaWMsIGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSwKKwkJICAgcnQtPmRzdC5fX3VzZSwgcnQtPnJ0NmlfZmxhZ3MsCiAJCSAgIHJ0LT5ydDZpX2RldiA/IHJ0LT5ydDZpX2Rldi0+bmFtZSA6ICIiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NDYsOSArMjY0Myw5IEBACiAJCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5KQogCQlnb3RvIG91dF9pcDZfZHN0X29wczsKLQluZXQtPmlwdjYuaXA2X251bGxfZW50cnktPnUuZHN0LnBhdGggPQorCW5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeS0+ZHN0LnBhdGggPQogCQkoc3RydWN0IGRzdF9lbnRyeSAqKW5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeTsKLQluZXQtPmlwdjYuaXA2X251bGxfZW50cnktPnUuZHN0Lm9wcyA9ICZuZXQtPmlwdjYuaXA2X2RzdF9vcHM7CisJbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5LT5kc3Qub3BzID0gJm5ldC0+aXB2Ni5pcDZfZHN0X29wczsKIAogI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUwogCW5ldC0+aXB2Ni5pcDZfcHJvaGliaXRfZW50cnkgPSBrbWVtZHVwKCZpcDZfcHJvaGliaXRfZW50cnlfdGVtcGxhdGUsCkBAIC0yNjU2LDE4ICsyNjUzLDE4IEBACiAJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ldC0+aXB2Ni5pcDZfcHJvaGliaXRfZW50cnkpCiAJCWdvdG8gb3V0X2lwNl9udWxsX2VudHJ5OwotCW5ldC0+aXB2Ni5pcDZfcHJvaGliaXRfZW50cnktPnUuZHN0LnBhdGggPQorCW5ldC0+aXB2Ni5pcDZfcHJvaGliaXRfZW50cnktPmRzdC5wYXRoID0KIAkJKHN0cnVjdCBkc3RfZW50cnkgKiluZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5OwotCW5ldC0+aXB2Ni5pcDZfcHJvaGliaXRfZW50cnktPnUuZHN0Lm9wcyA9ICZuZXQtPmlwdjYuaXA2X2RzdF9vcHM7CisJbmV0LT5pcHY2LmlwNl9wcm9oaWJpdF9lbnRyeS0+ZHN0Lm9wcyA9ICZuZXQtPmlwdjYuaXA2X2RzdF9vcHM7CiAKIAluZXQtPmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5ID0ga21lbWR1cCgmaXA2X2Jsa19ob2xlX2VudHJ5X3RlbXBsYXRlLAogCQkJCQkgICAgICAgc2l6ZW9mKCpuZXQtPmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5KSwKIAkJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmICghbmV0LT5pcHY2LmlwNl9ibGtfaG9sZV9lbnRyeSkKIAkJZ290byBvdXRfaXA2X3Byb2hpYml0X2VudHJ5OwotCW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPnUuZHN0LnBhdGggPQorCW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPmRzdC5wYXRoID0KIAkJKHN0cnVjdCBkc3RfZW50cnkgKiluZXQtPmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5OwotCW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPnUuZHN0Lm9wcyA9ICZuZXQtPmlwdjYuaXA2X2RzdF9vcHM7CisJbmV0LT5pcHY2LmlwNl9ibGtfaG9sZV9lbnRyeS0+ZHN0Lm9wcyA9ICZuZXQtPmlwdjYuaXA2X2RzdF9vcHM7CiAjZW5kaWYKIAogCW5ldC0+aXB2Ni5zeXNjdGwuZmx1c2hfZGVsYXkgPSAwOwpAQCAtMjc0MiwxMiArMjczOSwxMiBAQAogCS8qIFJlZ2lzdGVyaW5nIG9mIHRoZSBsb29wYmFjayBpcyBkb25lIGJlZm9yZSB0aGlzIHBvcnRpb24gb2YgY29kZSwKIAkgKiB0aGUgbG9vcGJhY2sgcmVmZXJlbmNlIGluIHJ0Nl9pbmZvIHdpbGwgbm90IGJlIHRha2VuLCBkbyBpdAogCSAqIG1hbnVhbGx5IGZvciBpbml0X25ldCAqLwotCWluaXRfbmV0LmlwdjYuaXA2X251bGxfZW50cnktPnUuZHN0LmRldiA9IGluaXRfbmV0Lmxvb3BiYWNrX2RldjsKKwlpbml0X25ldC5pcHY2LmlwNl9udWxsX2VudHJ5LT5kc3QuZGV2ID0gaW5pdF9uZXQubG9vcGJhY2tfZGV2OwogCWluaXRfbmV0LmlwdjYuaXA2X251bGxfZW50cnktPnJ0NmlfaWRldiA9IGluNl9kZXZfZ2V0KGluaXRfbmV0Lmxvb3BiYWNrX2Rldik7CiAgICNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKLQlpbml0X25ldC5pcHY2LmlwNl9wcm9oaWJpdF9lbnRyeS0+dS5kc3QuZGV2ID0gaW5pdF9uZXQubG9vcGJhY2tfZGV2OworCWluaXRfbmV0LmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5LT5kc3QuZGV2ID0gaW5pdF9uZXQubG9vcGJhY2tfZGV2OwogCWluaXRfbmV0LmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5LT5ydDZpX2lkZXYgPSBpbjZfZGV2X2dldChpbml0X25ldC5sb29wYmFja19kZXYpOwotCWluaXRfbmV0LmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5LT51LmRzdC5kZXYgPSBpbml0X25ldC5sb29wYmFja19kZXY7CisJaW5pdF9uZXQuaXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPmRzdC5kZXYgPSBpbml0X25ldC5sb29wYmFja19kZXY7CiAJaW5pdF9uZXQuaXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPnJ0NmlfaWRldiA9IGluNl9kZXZfZ2V0KGluaXRfbmV0Lmxvb3BiYWNrX2Rldik7CiAgICNlbmRpZgogCXJldCA9IGZpYjZfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCBlNTFlNjUwLi40Njk5Y2QzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtMjQ5LDggKzI0OSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBpcDZfcHJsX2xvY2spOwotCiAjZGVmaW5lIGZvcl9lYWNoX3BybF9yY3Uoc3RhcnQpCQkJXAogCWZvciAocHJsID0gcmN1X2RlcmVmZXJlbmNlKHN0YXJ0KTsJXAogCSAgICAgcHJsOwkJCQlcCkBAIC0zNDAsNyArMzM4LDcgQEAKIAlpZiAoYS0+YWRkciA9PSBodG9ubChJTkFERFJfQU5ZKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2soJmlwaXA2X3BybF9sb2NrKTsKKwlBU1NFUlRfUlROTCgpOwogCiAJZm9yIChwID0gdC0+cHJsOyBwOyBwID0gcC0+bmV4dCkgewogCQlpZiAocC0+YWRkciA9PSBhLT5hZGRyKSB7CkBAIC0zNzAsNyArMzY4LDYgQEAKIAl0LT5wcmxfY291bnQrKzsKIAlyY3VfYXNzaWduX3BvaW50ZXIodC0+cHJsLCBwKTsKIG91dDoKLQlzcGluX3VubG9jaygmaXBpcDZfcHJsX2xvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM5Nyw3ICszOTQsNyBAQAogCXN0cnVjdCBpcF90dW5uZWxfcHJsX2VudHJ5ICp4LCAqKnA7CiAJaW50IGVyciA9IDA7CiAKLQlzcGluX2xvY2soJmlwaXA2X3BybF9sb2NrKTsKKwlBU1NFUlRfUlROTCgpOwogCiAJaWYgKGEgJiYgYS0+YWRkciAhPSBodG9ubChJTkFERFJfQU5ZKSkgewogCQlmb3IgKHAgPSAmdC0+cHJsOyAqcDsgcCA9ICYoKnApLT5uZXh0KSB7CkBAIC00MTksNyArNDE2LDYgQEAKIAkJfQogCX0KIG91dDoKLQlzcGluX3VubG9jaygmaXBpcDZfcHJsX2xvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTcxNiw3ICs3MTIsNyBAQAogCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKIAkJZ290byB0eF9lcnJvcl9pY21wOwogCX0KLQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKwl0ZGV2ID0gcnQtPmRzdC5kZXY7CiAKIAlpZiAodGRldiA9PSBkZXYpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKQEAgLTcyNSw3ICs3MjEsNyBAQAogCX0KIAogCWlmIChkZikgewotCQltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCW10dSA9IGRzdF9tdHUoJnJ0LT5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CiAKIAkJaWYgKG10dSA8IDY4KSB7CiAJCQlzdGF0cy0+Y29sbGlzaW9ucysrOwpAQCAtNzg0LDcgKzc4MCw3IEBACiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKIAlJUENCKHNrYiktPmZsYWdzID0gMDsKIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyoKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgpAQCAtODMzLDcgKzgyOSw3IEBACiAJCQkJICAgIC5wcm90byA9IElQUFJPVE9fSVBWNiB9OwogCQlzdHJ1Y3QgcnRhYmxlICpydDsKIAkJaWYgKCFpcF9yb3V0ZV9vdXRwdXRfa2V5KGRldl9uZXQoZGV2KSwgJnJ0LCAmZmwpKSB7Ci0JCQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJCXRkZXYgPSBydC0+ZHN0LmRldjsKIAkJCWlwX3J0X3B1dChydCk7CiAJCX0KIAkJZGV2LT5mbGFncyB8PSBJRkZfUE9JTlRPUE9JTlQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zeW5jb29raWVzLmMgYi9uZXQvaXB2Ni9zeW5jb29raWVzLmMKaW5kZXggMzRkMWYwNi4uMDlmZDM0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY2L3N5bmNvb2tpZXMuYwpAQCAtMjcsMjggKzI3LDE3IEBACiAjZGVmaW5lIENPT0tJRUJJVFMgMjQJLyogVXBwZXIgYml0cyBzdG9yZSBjb3VudCAqLwogI2RlZmluZSBDT09LSUVNQVNLICgoKF9fdTMyKTEgPDwgQ09PS0lFQklUUykgLSAxKQogCi0vKgotICogVGhpcyB0YWJsZSBoYXMgdG8gYmUgc29ydGVkIGFuZCB0ZXJtaW5hdGVkIHdpdGggKF9fdTE2KS0xLgotICogWFhYIGdlbmVyYXRlIGEgYmV0dGVyIHRhYmxlLgotICogVW5yZXNvbHZlZCBJc3N1ZXM6IEhJUFBJIHdpdGggYSA2NGsgTVNTIGlzIG5vdCB3ZWxsIHN1cHBvcnRlZC4KLSAqCi0gKiBUYWtlbiBkaXJlY3RseSBmcm9tIGlwdjQgaW1wbGVtZW50YXRpb24uCi0gKiBTaG91bGQgdGhpcyBsaXN0IGJlIG1vZGlmaWVkIGZvciBpcHY2IHVzZSBvciBpcyBpdCBjbG9zZSBlbm91Z2g/Ci0gKiByZmMgMjQ2MCA4LjMgc3VnZ2VzdHMgbXNzIHZhbHVlcyAyMCBieXRlcyBsZXNzIHRoYW4gaXB2NCBjb3VudGVycGFydAotICovCisvKiBUYWJsZSBtdXN0IGJlIHNvcnRlZC4gKi8KIHN0YXRpYyBfX3UxNiBjb25zdCBtc3N0YWJbXSA9IHsKLQk2NCAtIDEsCi0JMjU2IC0gMSwKLQk1MTIgLSAxLAotCTUzNiAtIDEsCi0JMTAyNCAtIDEsCi0JMTQ0MCAtIDEsCi0JMTQ2MCAtIDEsCi0JNDMxMiAtIDEsCi0JKF9fdTE2KS0xCisJNjQsCisJNTEyLAorCTUzNiwKKwkxMjgwIC0gNjAsCisJMTQ4MCAtIDYwLAorCTE1MDAgLSA2MCwKKwk0NDYwIC0gNjAsCisJOTAwMCAtIDYwLAogfTsKLS8qIFRoZSBudW1iZXIgZG9lc24ndCBpbmNsdWRlIHRoZSAtMSB0ZXJtaW5hdG9yICovCi0jZGVmaW5lIE5VTV9NU1MgKEFSUkFZX1NJWkUobXNzdGFiKSAtIDEpCiAKIC8qCiAgKiBUaGlzIChtaXNuYW1lZCkgdmFsdWUgaXMgdGhlIGFnZSBvZiBzeW5jb29raWUgd2hpY2ggaXMgcGVybWl0dGVkLgpAQCAtMTM0LDkgKzEyMywxMSBAQAogCiAJdGNwX3N5bnFfb3ZlcmZsb3coc2spOwogCi0JZm9yIChtc3NpbmQgPSAwOyBtc3MgPiBtc3N0YWJbbXNzaW5kICsgMV07IG1zc2luZCsrKQotCQk7Ci0JKm1zc3AgPSBtc3N0YWJbbXNzaW5kXSArIDE7CisJZm9yIChtc3NpbmQgPSBBUlJBWV9TSVpFKG1zc3RhYikgLSAxOyBtc3NpbmQgOyBtc3NpbmQtLSkKKwkJaWYgKG1zcyA+PSBtc3N0YWJbbXNzaW5kXSkKKwkJCWJyZWFrOworCisJKm1zc3AgPSBtc3N0YWJbbXNzaW5kXTsKIAogCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfU1lOQ09PS0lFU1NFTlQpOwogCkBAIC0xNTQsNyArMTQ1LDcgQEAKIAkJCQkJICAgIHRoLT5zb3VyY2UsIHRoLT5kZXN0LCBzZXEsCiAJCQkJCSAgICBqaWZmaWVzIC8gKEhaICogNjApLCBDT1VOVEVSX1RSSUVTKTsKIAotCXJldHVybiBtc3NpbmQgPCBOVU1fTVNTID8gbXNzdGFiW21zc2luZF0gKyAxIDogMDsKKwlyZXR1cm4gbXNzaW5kIDwgQVJSQVlfU0laRShtc3N0YWIpID8gbXNzdGFiW21zc2luZF0gOiAwOwogfQogCiBzdHJ1Y3Qgc29jayAqY29va2llX3Y2X2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE3Myw4ICsxNjQsOSBAQAogCWludCBtc3M7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCV9fdTggcmN2X3dzY2FsZTsKKwlib29sIGVjbl9vazsKIAotCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICF0aC0+YWNrKQorCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICF0aC0+YWNrIHx8IHRoLT5yc3QpCiAJCWdvdG8gb3V0OwogCiAJaWYgKHRjcF9zeW5xX25vX3JlY2VudF9vdmVyZmxvdyhzaykgfHwKQEAgLTE4OSw4ICsxODEsOCBAQAogCW1lbXNldCgmdGNwX29wdCwgMCwgc2l6ZW9mKHRjcF9vcHQpKTsKIAl0Y3BfcGFyc2Vfb3B0aW9ucyhza2IsICZ0Y3Bfb3B0LCAmaGFzaF9sb2NhdGlvbiwgMCk7CiAKLQlpZiAodGNwX29wdC5zYXdfdHN0YW1wKQotCQljb29raWVfY2hlY2tfdGltZXN0YW1wKCZ0Y3Bfb3B0KTsKKwlpZiAoIWNvb2tpZV9jaGVja190aW1lc3RhbXAoJnRjcF9vcHQsICZlY25fb2spKQorCQlnb3RvIG91dDsKIAogCXJldCA9IE5VTEw7CiAJcmVxID0gaW5ldDZfcmVxc2tfYWxsb2MoJnRjcDZfcmVxdWVzdF9zb2NrX29wcyk7CkBAIC0yMjQsOSArMjE2LDggQEAKIAogCXJlcS0+ZXhwaXJlcyA9IDBVTDsKIAlyZXEtPnJldHJhbnMgPSAwOwotCWlyZXEtPmVjbl9vawkJPSAwOworCWlyZXEtPmVjbl9vawkJPSBlY25fb2s7CiAJaXJlcS0+c25kX3dzY2FsZQk9IHRjcF9vcHQuc25kX3dzY2FsZTsKLQlpcmVxLT5yY3Zfd3NjYWxlCT0gdGNwX29wdC5yY3Zfd3NjYWxlOwogCWlyZXEtPnNhY2tfb2sJCT0gdGNwX29wdC5zYWNrX29rOwogCWlyZXEtPndzY2FsZV9vawkJPSB0Y3Bfb3B0LndzY2FsZV9vazsKIAlpcmVxLT50c3RhbXBfb2sJCT0gdGNwX29wdC5zYXdfdHN0YW1wOwpAQCAtMjQwLDE3ICsyMzEsMTIgQEAKIAkgKiBtZSBpZiB0aGVyZSBpcyBhIHByZWZlcnJlZCB3YXkuCiAJICovCiAJewotCQlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwkJc3RydWN0IGluNl9hZGRyICpmaW5hbF9wLCBmaW5hbDsKIAkJc3RydWN0IGZsb3dpIGZsOwogCQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKIAkJZmwucHJvdG8gPSBJUFBST1RPX1RDUDsKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZpcmVxNi0+cm10X2FkZHIpOwotCQlpZiAobnAtPm9wdCAmJiBucC0+b3B0LT5zcmNydCkgewotCQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBucC0+b3B0LT5zcmNydDsKLQkJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7Ci0JCQlmaW5hbF9wID0gJmZpbmFsOwotCQl9CisJCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmwsIG5wLT5vcHQsICZmaW5hbCk7CiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmaXJlcTYtPmxvY19hZGRyKTsKIAkJZmwub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAkJZmwubWFyayA9IHNrLT5za19tYXJrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggMmI3YzNhMS4uZmU2ZDQwNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSBOVUxMLCAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSBOVUxMLCAqZmluYWxfcCwgZmluYWw7CiAJc3RydWN0IGZsb3dpIGZsOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlpbnQgYWRkcl90eXBlOwpAQCAtMjUwLDEyICsyNTAsNyBAQAogCWZsLmZsX2lwX2Rwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwogCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+aW5ldF9zcG9ydDsKIAotCWlmIChucC0+b3B0ICYmIG5wLT5vcHQtPnNyY3J0KSB7Ci0JCXN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKilucC0+b3B0LT5zcmNydDsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOwotCQlmaW5hbF9wID0gJmZpbmFsOwotCX0KKwlmaW5hbF9wID0gZmw2X3VwZGF0ZV9kc3QoJmZsLCBucC0+b3B0LCAmZmluYWwpOwogCiAJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKIApAQCAtNDc3LDcgKzQ3Miw3IEBACiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBza19idWZmICogc2tiOwogCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0ID0gTlVMTDsKLQlzdHJ1Y3QgaW42X2FkZHIgKiBmaW5hbF9wID0gTlVMTCwgZmluYWw7CisJc3RydWN0IGluNl9hZGRyICogZmluYWxfcCwgZmluYWw7CiAJc3RydWN0IGZsb3dpIGZsOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlpbnQgZXJyID0gLTE7CkBAIC00OTQsMTIgKzQ4OSw3IEBACiAJc2VjdXJpdHlfcmVxX2NsYXNzaWZ5X2Zsb3cocmVxLCAmZmwpOwogCiAJb3B0ID0gbnAtPm9wdDsKLQlpZiAob3B0ICYmIG9wdC0+c3JjcnQpIHsKLQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBvcHQtPnNyY3J0OwotCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7Ci0JCWZpbmFsX3AgPSAmZmluYWw7Ci0JfQorCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmwsIG9wdCwgJmZpbmFsKTsKIAogCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOwogCWlmIChlcnIpCkBAIC0xMTY3LDcgKzExNTcsNyBAQAogCX0KIAogI2lmZGVmIENPTkZJR19TWU5fQ09PS0lFUwotCWlmICghdGgtPnJzdCAmJiAhdGgtPnN5biAmJiB0aC0+YWNrKQorCWlmICghdGgtPnN5bikKIAkJc2sgPSBjb29raWVfdjZfY2hlY2soc2ssIHNrYik7CiAjZW5kaWYKIAlyZXR1cm4gc2s7CkBAIC0xMjc5LDEzICsxMjY5LDEwIEBACiAJdHJlcSA9IGluZXQ2X3JzayhyZXEpOwogCWlwdjZfYWRkcl9jb3B5KCZ0cmVxLT5ybXRfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmdHJlcS0+bG9jX2FkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7Ci0JaWYgKCF3YW50X2Nvb2tpZSkKKwlpZiAoIXdhbnRfY29va2llIHx8IHRtcF9vcHQudHN0YW1wX29rKQogCQlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgdGNwX2hkcihza2IpKTsKIAotCWlmICh3YW50X2Nvb2tpZSkgewotCQlpc24gPSBjb29raWVfdjZfaW5pdF9zZXF1ZW5jZShzaywgc2tiLCAmcmVxLT5tc3MpOwotCQlyZXEtPmNvb2tpZV90cyA9IHRtcF9vcHQudHN0YW1wX29rOwotCX0gZWxzZSBpZiAoIWlzbikgeworCWlmICghaXNuKSB7CiAJCWlmIChpcHY2X29wdF9hY2NlcHRlZChzaywgc2tiKSB8fAogCQkgICAgbnAtPnJ4b3B0LmJpdHMucnhpbmZvIHx8IG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8gfHwKIAkJICAgIG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSB8fCBucC0+cnhvcHQuYml0cy5yeG9obGltKSB7CkBAIC0xMjk4LDggKzEyODUsMTIgQEAKIAkJaWYgKCFzay0+c2tfYm91bmRfZGV2X2lmICYmCiAJCSAgICBpcHY2X2FkZHJfdHlwZSgmdHJlcS0+cm10X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKIAkJCXRyZXEtPmlpZiA9IGluZXQ2X2lpZihza2IpOwotCi0JCWlzbiA9IHRjcF92Nl9pbml0X3NlcXVlbmNlKHNrYik7CisJCWlmICghd2FudF9jb29raWUpIHsKKwkJCWlzbiA9IHRjcF92Nl9pbml0X3NlcXVlbmNlKHNrYik7CisJCX0gZWxzZSB7CisJCQlpc24gPSBjb29raWVfdjZfaW5pdF9zZXF1ZW5jZShzaywgc2tiLCAmcmVxLT5tc3MpOworCQkJcmVxLT5jb29raWVfdHMgPSB0bXBfb3B0LnRzdGFtcF9vazsKKwkJfQogCX0KIAl0Y3BfcnNrKHJlcSktPnNudF9pc24gPSBpc247CiAKQEAgLTEzOTIsMTggKzEzODMsMTMgQEAKIAkJZ290byBvdXRfb3ZlcmZsb3c7CiAKIAlpZiAoZHN0ID09IE5VTEwpIHsKLQkJc3RydWN0IGluNl9hZGRyICpmaW5hbF9wID0gTlVMTCwgZmluYWw7CisJCXN0cnVjdCBpbjZfYWRkciAqZmluYWxfcCwgZmluYWw7CiAJCXN0cnVjdCBmbG93aSBmbDsKIAogCQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKIAkJZmwucHJvdG8gPSBJUFBST1RPX1RDUDsKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZ0cmVxLT5ybXRfYWRkcik7Ci0JCWlmIChvcHQgJiYgb3B0LT5zcmNydCkgewotCQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBvcHQtPnNyY3J0OwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7Ci0JCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgcnQwLT5hZGRyKTsKLQkJCWZpbmFsX3AgPSAmZmluYWw7Ci0JCX0KKwkJZmluYWxfcCA9IGZsNl91cGRhdGVfZHN0KCZmbCwgb3B0LCAmZmluYWwpOwogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnRyZXEtPmxvY19hZGRyKTsKIAkJZmwub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAkJZmwubWFyayA9IHNrLT5za19tYXJrOwpAQCAtMjE1Niw2ICsyMTQyLDggQEAKIAkuc2V0c29ja29wdAkJPSB0Y3Bfc2V0c29ja29wdCwKIAkuZ2V0c29ja29wdAkJPSB0Y3BfZ2V0c29ja29wdCwKIAkucmVjdm1zZwkJPSB0Y3BfcmVjdm1zZywKKwkuc2VuZG1zZwkJPSB0Y3Bfc2VuZG1zZywKKwkuc2VuZHBhZ2UJCT0gdGNwX3NlbmRwYWdlLAogCS5iYWNrbG9nX3JjdgkJPSB0Y3BfdjZfZG9fcmN2LAogCS5oYXNoCQkJPSB0Y3BfdjZfaGFzaCwKIAkudW5oYXNoCQkJPSBpbmV0X3VuaGFzaCwKQEAgLTIxNzQsNiArMjE2Miw3IEBACiAJLnR3c2tfcHJvdAkJPSAmdGNwNl90aW1ld2FpdF9zb2NrX29wcywKIAkucnNrX3Byb3QJCT0gJnRjcDZfcmVxdWVzdF9zb2NrX29wcywKIAkuaC5oYXNoaW5mbwkJPSAmdGNwX2hhc2hpbmZvLAorCS5ub19hdXRvYmluZAkJPSB0cnVlLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQJPSBjb21wYXRfdGNwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9nZXRzb2Nrb3B0LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCA4N2JlNTg2Li4xZGQxYWZmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtOTI3LDcgKzkyNyw3IEBACiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgbXNnLT5tc2dfbmFtZTsKLQlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIsICpmaW5hbF9wLCBmaW5hbDsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7CiAJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsb3dsYWJlbCA9IE5VTEw7CiAJc3RydWN0IGZsb3dpIGZsOwpAQCAtMTA5NywxNCArMTA5Nyw5IEBACiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmbnAtPnNhZGRyKTsKIAlmbC5mbF9pcF9zcG9ydCA9IGluZXQtPmluZXRfc3BvcnQ7CiAKLQkvKiBtZXJnZSBpcDZfYnVpbGRfeG1pdCBmcm9tIGlwNl9vdXRwdXQgKi8KLQlpZiAob3B0ICYmIG9wdC0+c3JjcnQpIHsKLQkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBvcHQtPnNyY3J0OwotCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7Ci0JCWZpbmFsX3AgPSAmZmluYWw7CisJZmluYWxfcCA9IGZsNl91cGRhdGVfZHN0KCZmbCwgb3B0LCAmZmluYWwpOworCWlmIChmaW5hbF9wKQogCQljb25uZWN0ZWQgPSAwOwotCX0KIAogCWlmICghZmwub2lmICYmIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLmZsNl9kc3QpKSB7CiAJCWZsLm9pZiA9IG5wLT5tY2FzdF9vaWY7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm5ldC9pcm5ldF9wcHAuYyBiL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5jCmluZGV4IDZhMWEyMDIuLjgwMGJjNTMgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5jCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5jCkBAIC01MjcsNyArNTI3LDcgQEAKIGRldl9pcm5ldF9jbG9zZShzdHJ1Y3QgaW5vZGUgKglpbm9kZSwKIAkJc3RydWN0IGZpbGUgKglmaWxlKQogewotICBpcm5ldF9zb2NrZXQgKglhcCA9IChzdHJ1Y3QgaXJuZXRfc29ja2V0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgaXJuZXRfc29ja2V0ICoJYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKICAgREVOVEVSKEZTX1RSQUNFLCAiKGZpbGU9MHglcCwgYXA9MHglcClcbiIsCiAJIGZpbGUsIGFwKTsKQEAgLTU2NCw3ICs1NjQsNyBAQAogCQlzaXplX3QJCWNvdW50LAogCQlsb2ZmX3QgKglwcG9zKQogewotICBpcm5ldF9zb2NrZXQgKglhcCA9IChzdHJ1Y3QgaXJuZXRfc29ja2V0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgaXJuZXRfc29ja2V0ICoJYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKICAgRFBBU1MoRlNfVFJBQ0UsICIoZmlsZT0weCVwLCBhcD0weCVwLCBjb3VudD0lWmQpXG4iLAogCWZpbGUsIGFwLCBjb3VudCk7CkBAIC01ODgsNyArNTg4LDcgQEAKIAkgICAgICAgc2l6ZV90CQljb3VudCwKIAkgICAgICAgbG9mZl90ICoJCXBwb3MpCiB7Ci0gIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworICBpcm5ldF9zb2NrZXQgKglhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogICBEUEFTUyhGU19UUkFDRSwgIihmaWxlPTB4JXAsIGFwPTB4JXAsIGNvdW50PSVaZClcbiIsCiAJZmlsZSwgYXAsIGNvdW50KTsKQEAgLTYwOSw3ICs2MDksNyBAQAogZGV2X2lybmV0X3BvbGwoc3RydWN0IGZpbGUgKglmaWxlLAogCSAgICAgICBwb2xsX3RhYmxlICoJd2FpdCkKIHsKLSAgaXJuZXRfc29ja2V0ICoJYXAgPSAoc3RydWN0IGlybmV0X3NvY2tldCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgIGlybmV0X3NvY2tldCAqCWFwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogICB1bnNpZ25lZCBpbnQJCW1hc2s7CiAKICAgREVOVEVSKEZTX1RSQUNFLCAiKGZpbGU9MHglcCwgYXA9MHglcClcbiIsCkBAIC02MzgsNyArNjM4LDcgQEAKIAkJdW5zaWduZWQgaW50CWNtZCwKIAkJdW5zaWduZWQgbG9uZwlhcmcpCiB7Ci0gIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworICBpcm5ldF9zb2NrZXQgKglhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKICAgaW50CQkJZXJyOwogICBpbnQJCQl2YWw7CiAgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJ0dHAuYyBiL25ldC9pcmRhL2lydHRwLmMKaW5kZXggNDdkYjFkOC4uMjg1NzYxZSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJ0dHAuYworKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0xODUzLDIzICsxODUzLDIzIEBACiAJCSAgIHNlbGYtPnJlbW90ZV9jcmVkaXQpOwogCXNlcV9wcmludGYoc2VxLCAic2VuZCBjcmVkaXQ6ICVkXG4iLAogCQkgICBzZWxmLT5zZW5kX2NyZWRpdCk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgIHR4IHBhY2tldHM6ICVsZCwgIiwKKwlzZXFfcHJpbnRmKHNlcSwgIiAgdHggcGFja2V0czogJWx1LCAiLAogCQkgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzKTsKLQlzZXFfcHJpbnRmKHNlcSwgInJ4IHBhY2tldHM6ICVsZCwgIiwKKwlzZXFfcHJpbnRmKHNlcSwgInJ4IHBhY2tldHM6ICVsdSwgIiwKIAkJICAgc2VsZi0+c3RhdHMucnhfcGFja2V0cyk7Ci0Jc2VxX3ByaW50ZihzZXEsICJ0eF9xdWV1ZSBsZW46ICVkICIsCisJc2VxX3ByaW50ZihzZXEsICJ0eF9xdWV1ZSBsZW46ICV1ICIsCiAJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJyeF9xdWV1ZSBsZW46ICVkXG4iLAorCXNlcV9wcmludGYoc2VxLCAicnhfcXVldWUgbGVuOiAldVxuIiwKIAkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+cnhfcXVldWUpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgdHhfc2R1X2J1c3k6ICVzLCAiLAogCQkgICBzZWxmLT50eF9zZHVfYnVzeT8gIlRSVUUiOiJGQUxTRSIpOwogCXNlcV9wcmludGYoc2VxLCAicnhfc2R1X2J1c3k6ICVzXG4iLAogCQkgICBzZWxmLT5yeF9zZHVfYnVzeT8gIlRSVUUiOiJGQUxTRSIpOwotCXNlcV9wcmludGYoc2VxLCAiICBtYXhfc2VnX3NpemU6ICVkLCAiLAorCXNlcV9wcmludGYoc2VxLCAiICBtYXhfc2VnX3NpemU6ICV1LCAiLAogCQkgICBzZWxmLT5tYXhfc2VnX3NpemUpOwotCXNlcV9wcmludGYoc2VxLCAidHhfbWF4X3NkdV9zaXplOiAlZCwgIiwKKwlzZXFfcHJpbnRmKHNlcSwgInR4X21heF9zZHVfc2l6ZTogJXUsICIsCiAJCSAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJyeF9tYXhfc2R1X3NpemU6ICVkXG4iLAorCXNlcV9wcmludGYoc2VxLCAicnhfbWF4X3NkdV9zaXplOiAldVxuIiwKIAkJICAgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKIAogCXNlcV9wcmludGYoc2VxLCAiICBVc2VkIGJ5ICglcylcblxuIiwKZGlmZiAtLWdpdCBhL25ldC9pdWN2L2l1Y3YuYyBiL25ldC9pdWN2L2l1Y3YuYwppbmRleCBmMjhhZDJjYy4uNDk5YzA0NSAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvaXVjdi5jCisrKyBiL25ldC9pdWN2L2l1Y3YuYwpAQCAtMTQ2Myw3ICsxNDYzLDcgQEAKIAl1MzIgcmVzMzsKIAl1OCAgaXBwb2xsZmc7CiAJdTggIHJlczRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyB2b2lkIGl1Y3ZfcGF0aF9wZW5kaW5nKHN0cnVjdCBpdWN2X2lycV9kYXRhICpkYXRhKQogewpAQCAtMTUyNCw3ICsxNTI0LDcgQEAKIAl1MzIgcmVzMzsKIAl1OCAgaXBwb2xsZmc7CiAJdTggIHJlczRbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyB2b2lkIGl1Y3ZfcGF0aF9jb21wbGV0ZShzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKIHsKQEAgLTE1NTQsNyArMTU1NCw3IEBACiAJdTMyIHJlczQ7CiAJdTggIGlwcG9sbGZnOwogCXU4ICByZXM1WzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgdm9pZCBpdWN2X3BhdGhfc2V2ZXJlZChzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKIHsKQEAgLTE1OTAsNyArMTU5MCw3IEBACiAJdTMyIHJlczQ7CiAJdTggIGlwcG9sbGZnOwogCXU4ICByZXM1WzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgdm9pZCBpdWN2X3BhdGhfcXVpZXNjZWQoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCiB7CkBAIC0xNjE4LDcgKzE2MTgsNyBAQAogCXUzMiByZXM0OwogCXU4ICBpcHBvbGxmZzsKIAl1OCAgcmVzNVszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIHZvaWQgaXVjdl9wYXRoX3Jlc3VtZWQoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCiB7CkBAIC0xNjQ5LDcgKzE2NDksNyBAQAogCXUzMiBpcGJmbG4yZjsKIAl1OCAgaXBwb2xsZmc7CiAJdTggIHJlczJbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0YXRpYyB2b2lkIGl1Y3ZfbWVzc2FnZV9jb21wbGV0ZShzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKIHsKQEAgLTE2OTQsNyArMTY5NCw3IEBACiAJdTMyIGlwYmZsbjJmOwogCXU4ICBpcHBvbGxmZzsKIAl1OCAgcmVzMlszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RhdGljIHZvaWQgaXVjdl9tZXNzYWdlX3BlbmRpbmcoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2lwLmMgYi9uZXQvbDJ0cC9sMnRwX2lwLmMKaW5kZXggMDg1MjUxMi4uMjI2YTBhZSAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9pcC5jCisrKyBiL25ldC9sMnRwL2wydHBfaXAuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOwogCWluZXQtPmluZXRfaWQgPSBqaWZmaWVzOwogCi0Jc2tfZHN0X3NldChzaywgJnJ0LT51LmRzdCk7CisJc2tfZHN0X3NldChzaywgJnJ0LT5kc3QpOwogCiAJd3JpdGVfbG9ja19iaCgmbDJ0cF9pcF9sb2NrKTsKIAlobGlzdF9kZWxfaW5pdCgmc2stPnNrX2JpbmRfbm9kZSk7CkBAIC00OTYsOSArNDk2LDkgQEAKIAkJCWlmIChpcF9yb3V0ZV9vdXRwdXRfZmxvdyhzb2NrX25ldChzayksICZydCwgJmZsLCBzaywgMCkpCiAJCQkJZ290byBub19yb3V0ZTsKIAkJfQotCQlza19zZXR1cF9jYXBzKHNrLCAmcnQtPnUuZHN0KTsKKwkJc2tfc2V0dXBfY2FwcyhzaywgJnJ0LT5kc3QpOwogCX0KLQlza2JfZHN0X3NldChza2IsIGRzdF9jbG9uZSgmcnQtPnUuZHN0KSk7CisJc2tiX2RzdF9zZXQoc2tiLCBkc3RfY2xvbmUoJnJ0LT5kc3QpKTsKIAogCS8qIFF1ZXVlIHRoZSBwYWNrZXQgdG8gSVAgZm9yIG91dHB1dCAqLwogCXJjID0gaXBfcXVldWVfeG1pdChza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL0tjb25maWcgYi9uZXQvbWFjODAyMTEvS2NvbmZpZwppbmRleCA4YTkxZjZjLi40ZDZmODY1MyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL0tjb25maWcKKysrIGIvbmV0L21hYzgwMjExL0tjb25maWcKQEAgLTMzLDYgKzMzLDEzIEBACiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgJ21pbnN0cmVsJyBUWCByYXRlIGNvbnRyb2wgYWxnb3JpdGhtCiAKK2NvbmZpZyBNQUM4MDIxMV9SQ19NSU5TVFJFTF9IVAorCWJvb2wgIk1pbnN0cmVsIDgwMi4xMW4gc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIE1BQzgwMjExX1JDX01JTlNUUkVMCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgJ21pbnN0cmVsX2h0JyBUWCByYXRlIGNvbnRyb2wgYWxnb3JpdGhtCisKIGNob2ljZQogCXByb21wdCAiRGVmYXVsdCByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIgogCWRlcGVuZHMgb24gTUFDODAyMTFfSEFTX1JDCkBAIC02Miw2ICs2OSw3IEBACiAKIGNvbmZpZyBNQUM4MDIxMV9SQ19ERUZBVUxUCiAJc3RyaW5nCisJZGVmYXVsdCAibWluc3RyZWxfaHQiIGlmIE1BQzgwMjExX1JDX0RFRkFVTFRfTUlOU1RSRUwgJiYgTUFDODAyMTFfUkNfTUlOU1RSRUxfSFQKIAlkZWZhdWx0ICJtaW5zdHJlbCIgaWYgTUFDODAyMTFfUkNfREVGQVVMVF9NSU5TVFJFTAogCWRlZmF1bHQgInBpZCIgaWYgTUFDODAyMTFfUkNfREVGQVVMVF9QSUQKIAlkZWZhdWx0ICIiCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvTWFrZWZpbGUgYi9uZXQvbWFjODAyMTEvTWFrZWZpbGUKaW5kZXggODRiNDhiYS4uZmRiNTRlNiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL01ha2VmaWxlCisrKyBiL25ldC9tYWM4MDIxMS9NYWtlZmlsZQpAQCAtNTEsNyArNTEsMTEgQEAKIHJjODAyMTFfbWluc3RyZWwteSA6PSByYzgwMjExX21pbnN0cmVsLm8KIHJjODAyMTFfbWluc3RyZWwtJChDT05GSUdfTUFDODAyMTFfREVCVUdGUykgKz0gcmM4MDIxMV9taW5zdHJlbF9kZWJ1Z2ZzLm8KIAorcmM4MDIxMV9taW5zdHJlbF9odC15IDo9IHJjODAyMTFfbWluc3RyZWxfaHQubworcmM4MDIxMV9taW5zdHJlbF9odC0kKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSArPSByYzgwMjExX21pbnN0cmVsX2h0X2RlYnVnZnMubworCiBtYWM4MDIxMS0kKENPTkZJR19NQUM4MDIxMV9SQ19QSUQpICs9ICQocmM4MDIxMV9waWQteSkKIG1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX1JDX01JTlNUUkVMKSArPSAkKHJjODAyMTFfbWluc3RyZWwteSkKK21hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX1JDX01JTlNUUkVMX0hUKSArPSAkKHJjODAyMTFfbWluc3RyZWxfaHQteSkKIAogY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IDZiYjlhOWEuLjk2NWIyNzIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTYsMzkgKzYsNzAgQEAKICAqIENvcHlyaWdodCAyMDA1LTIwMDYsIERldmljZXNjYXBlIFNvZnR3YXJlLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNi0yMDA3CUppcmkgQmVuYyA8amJlbmNAc3VzZS5jej4KICAqIENvcHlyaWdodCAyMDA3LCBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KLSAqIENvcHlyaWdodCAyMDA3LTIwMDgsIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwLCBJbnRlbCBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorLyoqCisgKiBET0M6IFJYIEEtTVBEVSBhZ2dyZWdhdGlvbgorICoKKyAqIEFnZ3JlZ2F0aW9uIG9uIHRoZSBSWCBzaWRlIHJlcXVpcmVzIG9ubHkgaW1wbGVtZW50aW5nIHRoZQorICogQGFtcGR1X2FjdGlvbiBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgdG8gc3RhcnQvc3RvcCBhbnkKKyAqIGJsb2NrLWFjayBzZXNzaW9ucyBmb3IgUlggYWdncmVnYXRpb24uCisgKgorICogV2hlbiBSWCBhZ2dyZWdhdGlvbiBpcyBzdGFydGVkIGJ5IHRoZSBwZWVyLCB0aGUgZHJpdmVyIGlzCisgKiBub3RpZmllZCB2aWEgQGFtcGR1X2FjdGlvbiBmdW5jdGlvbiwgd2l0aCB0aGUKKyAqICVJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQgYWN0aW9uLCBhbmQgbWF5IHJlamVjdCB0aGUgcmVxdWVzdAorICogaW4gd2hpY2ggY2FzZSBhIG5lZ2F0aXZlIHJlc3BvbnNlIGlzIHNlbnQgdG8gdGhlIHBlZXIsIGlmIGl0CisgKiBhY2NlcHRzIGl0IGEgcG9zaXRpdmUgcmVzcG9uc2UgaXMgc2VudC4KKyAqCisgKiBXaGlsZSB0aGUgc2Vzc2lvbiBpcyBhY3RpdmUsIHRoZSBkZXZpY2UvZHJpdmVyIGFyZSByZXF1aXJlZAorICogdG8gZGUtYWdncmVnYXRlIGZyYW1lcyBhbmQgcGFzcyB0aGVtIHVwIG9uZSBieSBvbmUgdG8gbWFjODAyMTEsCisgKiB3aGljaCB3aWxsIGhhbmRsZSB0aGUgcmVvcmRlciBidWZmZXIuCisgKgorICogV2hlbiB0aGUgYWdncmVnYXRpb24gc2Vzc2lvbiBpcyBzdG9wcGVkIGFnYWluIGJ5IHRoZSBwZWVyIG9yCisgKiBvdXJzZWx2ZXMsIHRoZSBkcml2ZXIncyBAYW1wZHVfYWN0aW9uIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgKiB3aXRoIHRoZSBhY3Rpb24gJUlFRUU4MDIxMV9BTVBEVV9SWF9TVE9QLiBJbiB0aGlzIGNhc2UsIHRoZQorICogY2FsbCBtdXN0IG5vdCBmYWlsLgorICovCisKICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJkcml2ZXItb3BzLmgiCiAKLXN0YXRpYyB2b2lkIF9fX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RydWN0IHN0YV9pbmZvICpzdGEsIHUxNiB0aWQsCi0JCQkJCSAgICB1MTYgaW5pdGlhdG9yLCB1MTYgcmVhc29uLAotCQkJCQkgICAgYm9vbCBmcm9tX3RpbWVyKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2ZyZWVfdGlkX3J4KHN0cnVjdCByY3VfaGVhZCAqaCkKK3sKKwlzdHJ1Y3QgdGlkX2FtcGR1X3J4ICp0aWRfcnggPQorCQljb250YWluZXJfb2YoaCwgc3RydWN0IHRpZF9hbXBkdV9yeCwgcmN1X2hlYWQpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHRpZF9yeC0+YnVmX3NpemU7IGkrKykKKwkJZGV2X2tmcmVlX3NrYih0aWRfcngtPnJlb3JkZXJfYnVmW2ldKTsKKwlrZnJlZSh0aWRfcngtPnJlb3JkZXJfYnVmKTsKKwlrZnJlZSh0aWRfcngtPnJlb3JkZXJfdGltZSk7CisJa2ZyZWUodGlkX3J4KTsKK30KKwordm9pZCBfX19pZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1MTYgdGlkLAorCQkJCSAgICAgdTE2IGluaXRpYXRvciwgdTE2IHJlYXNvbikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7CiAJc3RydWN0IHRpZF9hbXBkdV9yeCAqdGlkX3J4OwotCWludCBpOwogCi0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCi0JLyogY2hlY2sgaWYgVElEIGlzIGluIG9wZXJhdGlvbmFsIHN0YXRlICovCi0JaWYgKCFzdGEtPmFtcGR1X21sbWUudGlkX2FjdGl2ZV9yeFt0aWRdKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhLT5hbXBkdV9tbG1lLnRpZF9hY3RpdmVfcnhbdGlkXSA9IGZhbHNlOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnN0YS0+YW1wZHVfbWxtZS5tdHgpOwogCiAJdGlkX3J4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdOwogCisJaWYgKCF0aWRfcngpCisJCXJldHVybjsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0sIE5VTEwpOworCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgIlJ4IEJBIHNlc3Npb24gc3RvcCByZXF1ZXN0ZWQgZm9yICVwTSB0aWQgJXVcbiIsCiAJICAgICAgIHN0YS0+c3RhLmFkZHIsIHRpZCk7CkBAIC01NCwzMiArODUsMTcgQEAKIAkJaWVlZTgwMjExX3NlbmRfZGVsYmEoc3RhLT5zZGF0YSwgc3RhLT5zdGEuYWRkciwKIAkJCQkgICAgIHRpZCwgMCwgcmVhc29uKTsKIAotCS8qIGZyZWUgdGhlIHJlb3JkZXJpbmcgYnVmZmVyICovCi0JZm9yIChpID0gMDsgaSA8IHRpZF9yeC0+YnVmX3NpemU7IGkrKykgewotCQlpZiAodGlkX3J4LT5yZW9yZGVyX2J1ZltpXSkgewotCQkJLyogcmVsZWFzZSB0aGUgcmVvcmRlcmVkIGZyYW1lcyAqLwotCQkJZGV2X2tmcmVlX3NrYih0aWRfcngtPnJlb3JkZXJfYnVmW2ldKTsKLQkJCXRpZF9yeC0+c3RvcmVkX21wZHVfbnVtLS07Ci0JCQl0aWRfcngtPnJlb3JkZXJfYnVmW2ldID0gTlVMTDsKLQkJfQotCX0KKwlkZWxfdGltZXJfc3luYygmdGlkX3J4LT5zZXNzaW9uX3RpbWVyKTsKIAotCS8qIGZyZWUgcmVzb3VyY2VzICovCi0Ja2ZyZWUodGlkX3J4LT5yZW9yZGVyX2J1Zik7Ci0Ja2ZyZWUodGlkX3J4LT5yZW9yZGVyX3RpbWUpOwotCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSA9IE5VTEw7Ci0KLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCWlmICghZnJvbV90aW1lcikKLQkJZGVsX3RpbWVyX3N5bmMoJnRpZF9yeC0+c2Vzc2lvbl90aW1lcik7Ci0Ja2ZyZWUodGlkX3J4KTsKKwljYWxsX3JjdSgmdGlkX3J4LT5yY3VfaGVhZCwgaWVlZTgwMjExX2ZyZWVfdGlkX3J4KTsKIH0KIAogdm9pZCBfX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RydWN0IHN0YV9pbmZvICpzdGEsIHUxNiB0aWQsCiAJCQkJICAgIHUxNiBpbml0aWF0b3IsIHUxNiByZWFzb24pCiB7Ci0JX19faWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbihzdGEsIHRpZCwgaW5pdGlhdG9yLCByZWFzb24sIGZhbHNlKTsKKwltdXRleF9sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKKwlfX19pZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0YSwgdGlkLCBpbml0aWF0b3IsIHJlYXNvbik7CisJbXV0ZXhfdW5sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKIH0KIAogLyoKQEAgLTEwMCw4ICsxMTYsOCBAQAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJyeCBzZXNzaW9uIHRpbWVyIGV4cGlyZWQgb24gdGlkICVkXG4iLCAodTE2KSpwdGlkKTsKICNlbmRpZgotCV9fX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RhLCAqcHRpZCwgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKLQkJCQkJV0xBTl9SRUFTT05fUVNUQV9USU1FT1VULCB0cnVlKTsKKwlzZXRfYml0KCpwdGlkLCBzdGEtPmFtcGR1X21sbWUudGlkX3J4X3RpbWVyX2V4cGlyZWQpOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZzdGEtPmxvY2FsLT5odywgJnN0YS0+YW1wZHVfbWxtZS53b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYWRkYmFfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgdTggKmRhLCB1MTYgdGlkLApAQCAtMjEyLDkgKzIyOCw5IEBACiAKIAogCS8qIGV4YW1pbmUgc3RhdGUgbWFjaGluZSAqLwotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKwltdXRleF9sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKIAotCWlmIChzdGEtPmFtcGR1X21sbWUudGlkX2FjdGl2ZV9yeFt0aWRdKSB7CisJaWYgKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgInVuZXhwZWN0ZWQgQWRkQkEgUmVxIGZyb20gIgpAQCAtMjI1LDkgKzI0MSw4IEBACiAJfQogCiAJLyogcHJlcGFyZSBBLU1QRFUgTUxNRSBmb3IgUnggYWdncmVnYXRpb24gKi8KLQlzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0gPQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHRpZF9hbXBkdV9yeCksIEdGUF9BVE9NSUMpOwotCWlmICghc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdKSB7CisJdGlkX2FnZ19yeCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aWRfYW1wZHVfcngpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRpZF9hZ2dfcngpIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0VSUiAiYWxsb2NhdGUgcnggbWxtZSB0byB0aWQgJWQgZmFpbGVkXG4iLApAQCAtMjM1LDE0ICsyNTAsMTEgQEAKICNlbmRpZgogCQlnb3RvIGVuZDsKIAl9Ci0JLyogcnggdGltZXIgKi8KLQlzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0tPnNlc3Npb25fdGltZXIuZnVuY3Rpb24gPQotCQkJCXN0YV9yeF9hZ2dfc2Vzc2lvbl90aW1lcl9leHBpcmVkOwotCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+c2Vzc2lvbl90aW1lci5kYXRhID0KLQkJCQkodW5zaWduZWQgbG9uZykmc3RhLT50aW1lcl90b190aWRbdGlkXTsKLQlpbml0X3RpbWVyKCZzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0tPnNlc3Npb25fdGltZXIpOwogCi0JdGlkX2FnZ19yeCA9IHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXTsKKwkvKiByeCB0aW1lciAqLworCXRpZF9hZ2dfcngtPnNlc3Npb25fdGltZXIuZnVuY3Rpb24gPSBzdGFfcnhfYWdnX3Nlc3Npb25fdGltZXJfZXhwaXJlZDsKKwl0aWRfYWdnX3J4LT5zZXNzaW9uX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykmc3RhLT50aW1lcl90b190aWRbdGlkXTsKKwlpbml0X3RpbWVyKCZ0aWRfYWdnX3J4LT5zZXNzaW9uX3RpbWVyKTsKIAogCS8qIHByZXBhcmUgcmVvcmRlcmluZyBidWZmZXIgKi8KIAl0aWRfYWdnX3J4LT5yZW9yZGVyX2J1ZiA9CkBAIC0yNTcsOCArMjY5LDcgQEAKICNlbmRpZgogCQlrZnJlZSh0aWRfYWdnX3J4LT5yZW9yZGVyX2J1Zik7CiAJCWtmcmVlKHRpZF9hZ2dfcngtPnJlb3JkZXJfdGltZSk7Ci0JCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSk7Ci0JCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSA9IE5VTEw7CisJCWtmcmVlKHRpZF9hZ2dfcngpOwogCQlnb3RvIGVuZDsKIAl9CiAKQEAgLTI3MCwxMyArMjgxLDEyIEBACiAKIAlpZiAocmV0KSB7CiAJCWtmcmVlKHRpZF9hZ2dfcngtPnJlb3JkZXJfYnVmKTsKKwkJa2ZyZWUodGlkX2FnZ19yeC0+cmVvcmRlcl90aW1lKTsKIAkJa2ZyZWUodGlkX2FnZ19yeCk7Ci0JCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSA9IE5VTEw7CiAJCWdvdG8gZW5kOwogCX0KIAotCS8qIGNoYW5nZSBzdGF0ZSBhbmQgc2VuZCBhZGRiYSByZXNwICovCi0Jc3RhLT5hbXBkdV9tbG1lLnRpZF9hY3RpdmVfcnhbdGlkXSA9IHRydWU7CisJLyogdXBkYXRlIGRhdGEgKi8KIAl0aWRfYWdnX3J4LT5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47CiAJdGlkX2FnZ19yeC0+c3NuID0gc3RhcnRfc2VxX251bTsKIAl0aWRfYWdnX3J4LT5oZWFkX3NlcV9udW0gPSBzdGFydF9zZXFfbnVtOwpAQCAtMjg0LDggKzI5NCwxNSBAQAogCXRpZF9hZ2dfcngtPnRpbWVvdXQgPSB0aW1lb3V0OwogCXRpZF9hZ2dfcngtPnN0b3JlZF9tcGR1X251bSA9IDA7CiAJc3RhdHVzID0gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKKworCS8qIGFjdGl2YXRlIGl0IGZvciBSWCAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0sIHRpZF9hZ2dfcngpOworCisJaWYgKHRpbWVvdXQpCisJCW1vZF90aW1lcigmdGlkX2FnZ19yeC0+c2Vzc2lvbl90aW1lciwgVFVfVE9fRVhQX1RJTUUodGltZW91dCkpOworCiBlbmQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKIAogZW5kX25vX2xvY2s6CiAJaWVlZTgwMjExX3NlbmRfYWRkYmFfcmVzcChzdGEtPnNkYXRhLCBzdGEtPnN0YS5hZGRyLCB0aWQsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWdnLXR4LmMgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKaW5kZXggOTgyNThiNy4uYzg5M2YyMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2FnZy10eC5jCisrKyBiL25ldC9tYWM4MDIxMS9hZ2ctdHguYwpAQCAtNiw3ICs2LDcgQEAKICAqIENvcHlyaWdodCAyMDA1LTIwMDYsIERldmljZXNjYXBlIFNvZnR3YXJlLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNi0yMDA3CUppcmkgQmVuYyA8amJlbmNAc3VzZS5jej4KICAqIENvcHlyaWdodCAyMDA3LCBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KLSAqIENvcHlyaWdodCAyMDA3LTIwMDksIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwLCBJbnRlbCBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMjEsMjggKzIxLDM5IEBACiAjaW5jbHVkZSAid21lLmgiCiAKIC8qKgotICogRE9DOiBUWCBhZ2dyZWdhdGlvbgorICogRE9DOiBUWCBBLU1QRFUgYWdncmVnYXRpb24KICAqCiAgKiBBZ2dyZWdhdGlvbiBvbiB0aGUgVFggc2lkZSByZXF1aXJlcyBzZXR0aW5nIHRoZSBoYXJkd2FyZSBmbGFnCi0gKiAlSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIGFzIHdlbGwgYXMsIGlmIHByZXNlbnQsIHRoZSBAYW1wZHVfcXVldWVzCi0gKiBoYXJkd2FyZSBwYXJhbWV0ZXIgdG8gdGhlIG51bWJlciBvZiBoYXJkd2FyZSBBTVBEVSBxdWV1ZXMuIElmIHRoZXJlIGFyZSBubwotICogaGFyZHdhcmUgcXVldWVzIHRoZW4gdGhlIGRyaXZlciB3aWxsIChjdXJyZW50bHkpIGhhdmUgdG8gZG8gYWxsIGZyYW1lCi0gKiBidWZmZXJpbmcuCisgKiAlSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OLiBUaGUgZHJpdmVyIHdpbGwgdGhlbiBiZSBoYW5kZWQKKyAqIHBhY2tldHMgd2l0aCBhIGZsYWcgaW5kaWNhdGluZyBBLU1QRFUgYWdncmVnYXRpb24uIFRoZSBkcml2ZXIKKyAqIG9yIGRldmljZSBpcyByZXNwb25zaWJsZSBmb3IgYWN0dWFsbHkgYWdncmVnYXRpbmcgdGhlIGZyYW1lcywKKyAqIGFzIHdlbGwgYXMgZGVjaWRpbmcgaG93IG1hbnkgYW5kIHdoaWNoIHRvIGFnZ3JlZ2F0ZS4KICAqCi0gKiBXaGVuIFRYIGFnZ3JlZ2F0aW9uIGlzIHN0YXJ0ZWQgYnkgc29tZSBzdWJzeXN0ZW0gKHVzdWFsbHkgdGhlIHJhdGUgY29udHJvbAotICogYWxnb3JpdGhtIHdvdWxkIGJlIGFwcHJvcHJpYXRlKSBieSBjYWxsaW5nIHRoZQotICogaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oKSBmdW5jdGlvbiwgdGhlIGRyaXZlciB3aWxsIGJlIG5vdGlmaWVkIHZpYQotICogaXRzIEBhbXBkdV9hY3Rpb24gZnVuY3Rpb24sIHdpdGggdGhlICVJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQgYWN0aW9uLgorICogV2hlbiBUWCBhZ2dyZWdhdGlvbiBpcyBzdGFydGVkIGJ5IHNvbWUgc3Vic3lzdGVtICh1c3VhbGx5IHRoZSByYXRlCisgKiBjb250cm9sIGFsZ29yaXRobSB3b3VsZCBiZSBhcHByb3ByaWF0ZSkgYnkgY2FsbGluZyB0aGUKKyAqIGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKCkgZnVuY3Rpb24sIHRoZSBkcml2ZXIgd2lsbCBiZQorICogbm90aWZpZWQgdmlhIGl0cyBAYW1wZHVfYWN0aW9uIGZ1bmN0aW9uLCB3aXRoIHRoZQorICogJUlFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVCBhY3Rpb24uCiAgKgogICogSW4gcmVzcG9uc2UgdG8gdGhhdCwgdGhlIGRyaXZlciBpcyBsYXRlciByZXF1aXJlZCB0byBjYWxsIHRoZQotICogaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiKCkgKG9yIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKCkpCi0gKiBmdW5jdGlvbiwgd2hpY2ggd2lsbCBzdGFydCB0aGUgYWdncmVnYXRpb24gc2Vzc2lvbi4KKyAqIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKCkgZnVuY3Rpb24sIHdoaWNoIHdpbGwgcmVhbGx5CisgKiBzdGFydCB0aGUgYWdncmVnYXRpb24gc2Vzc2lvbiBhZnRlciB0aGUgcGVlciBoYXMgYWxzbyByZXNwb25kZWQuCisgKiBJZiB0aGUgcGVlciByZXNwb25kcyBuZWdhdGl2ZWx5LCB0aGUgc2Vzc2lvbiB3aWxsIGJlIHN0b3BwZWQKKyAqIGFnYWluIHJpZ2h0IGF3YXkuIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGFnZ3JlZ2F0aW9uCisgKiBzZXNzaW9uIHRvIGJlIHN0b3BwZWQgYmVmb3JlIHRoZSBkcml2ZXIgaGFzIGluZGljYXRlZCB0aGF0IGl0CisgKiBpcyBkb25lIHNldHRpbmcgaXQgdXAsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBub3QgaW5kaWNhdGUgdGhlCisgKiBzZXR1cCBjb21wbGV0aW9uLgogICoKLSAqIFNpbWlsYXJseSwgd2hlbiB0aGUgYWdncmVnYXRpb24gc2Vzc2lvbiBpcyBzdG9wcGVkIGJ5Ci0gKiBpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKCksIHRoZSBkcml2ZXIncyBAYW1wZHVfYWN0aW9uIGZ1bmN0aW9uIHdpbGwKLSAqIGJlIGNhbGxlZCB3aXRoIHRoZSBhY3Rpb24gJUlFRUU4MDIxMV9BTVBEVV9UWF9TVE9QLiBJbiB0aGlzIGNhc2UsIHRoZQotICogY2FsbCBtdXN0IG5vdCBmYWlsLCBhbmQgdGhlIGRyaXZlciBtdXN0IGxhdGVyIGNhbGwgaWVlZTgwMjExX3N0b3BfdHhfYmFfY2IoKQotICogKG9yIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoKSkuCisgKiBBbHNvIG5vdGUgdGhhdCwgc2luY2Ugd2UgYWxzbyBuZWVkIHRvIHdhaXQgZm9yIGEgcmVzcG9uc2UgZnJvbQorICogdGhlIHBlZXIsIHRoZSBkcml2ZXIgaXMgbm90aWZpZWQgb2YgdGhlIGNvbXBsZXRpb24gb2YgdGhlCisgKiBoYW5kc2hha2UgYnkgdGhlICVJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUwgYWN0aW9uIHRvIHRoZQorICogQGFtcGR1X2FjdGlvbiBjYWxsYmFjay4KKyAqCisgKiBTaW1pbGFybHksIHdoZW4gdGhlIGFnZ3JlZ2F0aW9uIHNlc3Npb24gaXMgc3RvcHBlZCBieSB0aGUgcGVlcgorICogb3Igc29tZXRoaW5nIGNhbGxpbmcgaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbigpLCB0aGUgZHJpdmVyJ3MKKyAqIEBhbXBkdV9hY3Rpb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYWN0aW9uCisgKiAlSUVFRTgwMjExX0FNUERVX1RYX1NUT1AuIEluIHRoaXMgY2FzZSwgdGhlIGNhbGwgbXVzdCBub3QgZmFpbCwKKyAqIGFuZCB0aGUgZHJpdmVyIG11c3QgbGF0ZXIgY2FsbCBpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKCkuCiAgKi8KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYWRkYmFfcmVxdWVzdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTEyNSwyNSArMTM2LDUzIEBACiAJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiKTsKIH0KIAorc3RhdGljIHZvaWQga2ZyZWVfdGlkX3R4KHN0cnVjdCByY3VfaGVhZCAqcmN1X2hlYWQpCit7CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4ID0KKwkgICAgY29udGFpbmVyX29mKHJjdV9oZWFkLCBzdHJ1Y3QgdGlkX2FtcGR1X3R4LCByY3VfaGVhZCk7CisKKwlrZnJlZSh0aWRfdHgpOworfQorCiBpbnQgX19faWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgdTE2IHRpZCwKIAkJCQkgICAgZW51bSBpZWVlODAyMTFfYmFja19wYXJ0aWVzIGluaXRpYXRvcikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdOwogCWludCByZXQ7Ci0JdTggKnN0YXRlOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc3RhLT5hbXBkdV9tbG1lLm10eCk7CisKKwlpZiAoIXRpZF90eCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7CisKKwlpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKSkgeworCQkvKiBub3QgZXZlbiBzdGFydGVkIHlldCEgKi8KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQljYWxsX3JjdSgmdGlkX3R4LT5yY3VfaGVhZCwga2ZyZWVfdGlkX3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiVHggQkEgc2Vzc2lvbiBzdG9wIHJlcXVlc3RlZCBmb3IgJXBNIHRpZCAldVxuIiwKIAkgICAgICAgc3RhLT5zdGEuYWRkciwgdGlkKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KIAotCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKKwlzZXRfYml0KEhUX0FHR19TVEFURV9TVE9QUElORywgJnRpZF90eC0+c3RhdGUpOwogCi0JaWYgKCpzdGF0ZSA9PSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwpCi0JCXN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0gPSAwOworCS8qCisJICogQWZ0ZXIgdGhpcyBwYWNrZXRzIGFyZSBubyBsb25nZXIgaGFuZGVkIHJpZ2h0IHRocm91Z2gKKwkgKiB0byB0aGUgZHJpdmVyIGJ1dCBhcmUgcHV0IG9udG8gdGlkX3R4LT5wZW5kaW5nIGluc3RlYWQsCisJICogd2l0aCBsb2NraW5nIHRvIGVuc3VyZSBwcm9wZXIgYWNjZXNzLgorCSAqLworCWNsZWFyX2JpdChIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwsICZ0aWRfdHgtPnN0YXRlKTsKIAotCSpzdGF0ZSA9IEhUX0FHR19TVEFURV9SRVFfU1RPUF9CQV9NU0sgfAotCQkoaW5pdGlhdG9yIDw8IEhUX0FHR19TVEFURV9JTklUSUFUT1JfU0hJRlQpOworCXRpZF90eC0+c3RvcF9pbml0aWF0b3IgPSBpbml0aWF0b3I7CiAKIAlyZXQgPSBkcnZfYW1wZHVfYWN0aW9uKGxvY2FsLCBzdGEtPnNkYXRhLAogCQkJICAgICAgIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QLApAQCAtMTc0LDE2ICsyMTMsMTQgQEAKIAl1MTYgdGlkID0gKih1OCAqKWRhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YoKHZvaWQgKilkYXRhLAogCQlzdHJ1Y3Qgc3RhX2luZm8sIHRpbWVyX3RvX3RpZFt0aWRdKTsKLQl1OCAqc3RhdGU7Ci0KLQlzdGF0ZSA9ICZzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZF07CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OwogCiAJLyogY2hlY2sgaWYgdGhlIFRJRCB3YWl0cyBmb3IgYWRkQkEgcmVzcG9uc2UgKi8KLQlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7Ci0JaWYgKCgqc3RhdGUgJiAoSFRfQUREQkFfUkVRVUVTVEVEX01TSyB8IEhUX0FEREJBX1JFQ0VJVkVEX01TSyB8Ci0JCSAgICAgICBIVF9BR0dfU1RBVEVfUkVRX1NUT1BfQkFfTVNLKSkgIT0KLQkJCQkJCUhUX0FEREJBX1JFUVVFU1RFRF9NU0spIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCXRpZF90eCA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0pOworCWlmICghdGlkX3R4IHx8CisJICAgIHRlc3RfYml0KEhUX0FHR19TVEFURV9SRVNQT05TRV9SRUNFSVZFRCwgJnRpZF90eC0+c3RhdGUpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAidGltZXIgZXhwaXJlZCBvbiB0aWQgJWQgYnV0IHdlIGFyZSBub3QgIgogCQkJCSIob3Igbm8gbG9uZ2VyKSBleHBlY3RpbmcgYWRkQkEgcmVzcG9uc2UgdGhlcmVcbiIsCkBAIC0xOTYsOCArMjMzLDggQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiYWRkQkEgcmVzcG9uc2UgdGltZXIgZXhwaXJlZCBvbiB0aWQgJWRcbiIsIHRpZCk7CiAjZW5kaWYKIAotCV9fX2llZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQsIFdMQU5fQkFDS19JTklUSUFUT1IpOwotCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oJnN0YS0+c3RhLCB0aWQpOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfYWNfZnJvbV90aWQoaW50IHRpZCkKQEAgLTIwNSwxNCArMjQyLDExMiBAQAogCXJldHVybiBpZWVlODAyXzFkX3RvX2FjW3RpZCAmIDddOwogfQogCisvKgorICogV2hlbiBtdWx0aXBsZSBhZ2dyZWdhdGlvbiBzZXNzaW9ucyBvbiBtdWx0aXBsZSBzdGF0aW9ucworICogYXJlIGJlaW5nIGNyZWF0ZWQvZGVzdHJveWVkIHNpbXVsdGFuZW91c2x5LCB3ZSBuZWVkIHRvCisgKiByZWZjb3VudCB0aGUgZ2xvYmFsIHF1ZXVlIHN0b3AgY2F1c2VkIGJ5IHRoYXQgaW4gb3JkZXIKKyAqIHRvIG5vdCBnZXQgaW50byBhIHNpdHVhdGlvbiB3aGVyZSBvbmUgb2YgdGhlIGFnZ3JlZ2F0aW9uCisgKiBzZXR1cCBvciB0ZWFyZG93biByZS1lbmFibGVzIHF1ZXVlcyBiZWZvcmUgdGhlIG90aGVyIGlzCisgKiByZWFkeSB0byBoYW5kbGUgdGhhdC4KKyAqCisgKiBUaGVzZSB0d28gZnVuY3Rpb25zIHRha2UgY2FyZSBvZiB0aGlzIGlzc3VlIGJ5IGtlZXBpbmcKKyAqIGEgZ2xvYmFsICJhZ2dfcXVldWVfc3RvcCIgcmVmY291bnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fYWNxdWlyZXMoYWdnX3F1ZXVlKQoraWVlZTgwMjExX3N0b3BfcXVldWVfYWdnKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBpbnQgdGlkKQoreworCWludCBxdWV1ZSA9IGllZWU4MDIxMV9hY19mcm9tX3RpZCh0aWQpOworCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZsb2NhbC0+YWdnX3F1ZXVlX3N0b3BbcXVldWVdKSA9PSAxKQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZV9ieV9yZWFzb24oCisJCQkmbG9jYWwtPmh3LCBxdWV1ZSwKKwkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9BR0dSRUdBVElPTik7CisJX19hY3F1aXJlKGFnZ19xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmVsZWFzZXMoYWdnX3F1ZXVlKQoraWVlZTgwMjExX3dha2VfcXVldWVfYWdnKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBpbnQgdGlkKQoreworCWludCBxdWV1ZSA9IGllZWU4MDIxMV9hY19mcm9tX3RpZCh0aWQpOworCisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZsb2NhbC0+YWdnX3F1ZXVlX3N0b3BbcXVldWVdKSA9PSAwKQorCQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9ieV9yZWFzb24oCisJCQkmbG9jYWwtPmh3LCBxdWV1ZSwKKwkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9BR0dSRUdBVElPTik7CisJX19yZWxlYXNlKGFnZ19xdWV1ZSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3R4X2JhX3Nlc3Npb25faGFuZGxlX3N0YXJ0KHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBpbnQgdGlkKQoreworCXN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eCA9IHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOworCXUxNiBzdGFydF9zZXFfbnVtOworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKKworCS8qCisJICogV2hpbGUgd2UncmUgYXNraW5nIHRoZSBkcml2ZXIgYWJvdXQgdGhlIGFnZ3JlZ2F0aW9uLAorCSAqIHN0b3AgdGhlIEFDIHF1ZXVlIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQorCSAqIGFib3V0IGZyYW1lcyB0aGF0IGNhbWUgaW4gd2hpbGUgd2Ugd2VyZSBkb2luZyB0aGF0LAorCSAqIHdoaWNoIHdvdWxkIHJlcXVpcmUgdXMgdG8gcHV0IHRoZW0gdG8gdGhlIEFDIHBlbmRpbmcKKwkgKiBhZnRlcndhcmRzIHdoaWNoIGp1c3QgbWFrZXMgdGhlIGNvZGUgbW9yZSBjb21wbGV4LgorCSAqLworCWllZWU4MDIxMV9zdG9wX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKKworCWNsZWFyX2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVEFSVCwgJnRpZF90eC0+c3RhdGUpOworCisJLyoKKwkgKiBtYWtlIHN1cmUgbm8gcGFja2V0cyBhcmUgYmVpbmcgcHJvY2Vzc2VkIHRvIGdldAorCSAqIHZhbGlkIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorCSAqLworCXN5bmNocm9uaXplX25ldCgpOworCisJc3RhcnRfc2VxX251bSA9IHN0YS0+dGlkX3NlcVt0aWRdID4+IDQ7CisKKwlyZXQgPSBkcnZfYW1wZHVfYWN0aW9uKGxvY2FsLCBzZGF0YSwgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJULAorCQkJICAgICAgICZzdGEtPnN0YSwgdGlkLCAmc3RhcnRfc2VxX251bSk7CisJaWYgKHJldCkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSBIVyB1bmF2YWlsYWJsZSBmb3IiCisJCQkJCSIgdGlkICVkXG4iLCB0aWQpOworI2VuZGlmCisJCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKKwkJY2FsbF9yY3UoJnRpZF90eC0+cmN1X2hlYWQsIGtmcmVlX3RpZF90eCk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3ZSBjYW4gdGFrZSBwYWNrZXRzIGFnYWluIG5vdyAqLworCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKKworCS8qIGFjdGl2YXRlIHRoZSB0aW1lciBmb3IgdGhlIHJlY2lwaWVudCdzIGFkZEJBIHJlc3BvbnNlICovCisJbW9kX3RpbWVyKCZ0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIsIGppZmZpZXMgKyBBRERCQV9SRVNQX0lOVEVSVkFMKTsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiYWN0aXZhdGVkIGFkZEJBIHJlc3BvbnNlIHRpbWVyIG9uIHRpZCAlZFxuIiwgdGlkKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCXN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0rKzsKKwlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKworCS8qIHNlbmQgQWRkQkEgcmVxdWVzdCAqLworCWllZWU4MDIxMV9zZW5kX2FkZGJhX3JlcXVlc3Qoc2RhdGEsIHN0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkgICAgIHRpZF90eC0+ZGlhbG9nX3Rva2VuLCBzdGFydF9zZXFfbnVtLAorCQkJCSAgICAgMHg0MCwgNTAwMCk7Cit9CisKIGludCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhLCB1MTYgdGlkKQogewogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gY29udGFpbmVyX29mKHB1YnN0YSwgc3RydWN0IHN0YV9pbmZvLCBzdGEpOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQl1OCAqc3RhdGU7CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OwogCWludCByZXQgPSAwOwotCXUxNiBzdGFydF9zZXFfbnVtOwogCiAJdHJhY2VfYXBpX3N0YXJ0X3R4X2JhX3Nlc3Npb24ocHVic3RhLCB0aWQpOwogCkBAIC0yMzksMjQgKzM3NCwxNSBAQAogCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHRlc3Rfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfRElTQVNTT0MpKSB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJEaXNhc3NvY2lhdGlvbiBpcyBpbiBwcm9ncmVzcy4gIgotCQkgICAgICAgIkRlbnlpbmcgQkEgc2Vzc2lvbiByZXF1ZXN0XG4iKTsKLSNlbmRpZgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAodGVzdF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9CTE9DS19CQSkpIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlN1c3BlbmQgaW4gcHJvZ3Jlc3MuICIKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJBIHNlc3Npb25zIGJsb2NrZWQuICIKIAkJICAgICAgICJEZW55aW5nIEJBIHNlc3Npb24gcmVxdWVzdFxuIik7CiAjZW5kaWYKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCXNwaW5fbG9jaygmbG9jYWwtPmFtcGR1X2xvY2spOwogCiAJLyogd2UgaGF2ZSB0cmllZCB0b28gbWFueSB0aW1lcywgcmVjZWl2ZXIgZG9lcyBub3Qgd2FudCBBLU1QRFUgKi8KIAlpZiAoc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA+IEhUX0FHR19NQVhfUkVUUklFUykgewpAQCAtMjY0LDkgKzM5MCw5IEBACiAJCWdvdG8gZXJyX3VubG9ja19zdGE7CiAJfQogCi0Jc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOworCXRpZF90eCA9IHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXTsKIAkvKiBjaGVjayBpZiB0aGUgVElEIGlzIG5vdCBpbiBhZ2dyZWdhdGlvbiBmbG93IGFscmVhZHkgKi8KLQlpZiAoKnN0YXRlICE9IEhUX0FHR19TVEFURV9JRExFKSB7CisJaWYgKHRpZF90eCkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSBzZXNzaW9uIGlzIG5vdCAiCiAJCQkJICJpZGxlIG9uIHRpZCAldVxuIiwgdGlkKTsKQEAgLTI3NSw5NiArNDAxLDM3IEBACiAJCWdvdG8gZXJyX3VubG9ja19zdGE7CiAJfQogCi0JLyoKLQkgKiBXaGlsZSB3ZSdyZSBhc2tpbmcgdGhlIGRyaXZlciBhYm91dCB0aGUgYWdncmVnYXRpb24sCi0JICogc3RvcCB0aGUgQUMgcXVldWUgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JICogYWJvdXQgZnJhbWVzIHRoYXQgY2FtZSBpbiB3aGlsZSB3ZSB3ZXJlIGRvaW5nIHRoYXQsCi0JICogd2hpY2ggd291bGQgcmVxdWlyZSB1cyB0byBwdXQgdGhlbSB0byB0aGUgQUMgcGVuZGluZwotCSAqIGFmdGVyd2FyZHMgd2hpY2gganVzdCBtYWtlcyB0aGUgY29kZSBtb3JlIGNvbXBsZXguCi0JICovCi0JaWVlZTgwMjExX3N0b3BfcXVldWVfYnlfcmVhc29uKAotCQkmbG9jYWwtPmh3LCBpZWVlODAyMTFfYWNfZnJvbV90aWQodGlkKSwKLQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0FHR1JFR0FUSU9OKTsKLQogCS8qIHByZXBhcmUgQS1NUERVIE1MTUUgZm9yIFR4IGFnZ3JlZ2F0aW9uICovCi0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdID0KLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aWRfYW1wZHVfdHgpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSkgeworCXRpZF90eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aWRfYW1wZHVfdHgpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRpZF90eCkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKEtFUk5fRVJSICJhbGxvY2F0ZSB0eCBtbG1lIHRvIHRpZCAlZCBmYWlsZWRcbiIsCiAJCQkJCXRpZCk7CiAjZW5kaWYKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfd2FrZV9xdWV1ZTsKKwkJZ290byBlcnJfdW5sb2NrX3N0YTsKIAl9CiAKLQlza2JfcXVldWVfaGVhZF9pbml0KCZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPnBlbmRpbmcpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRpZF90eC0+cGVuZGluZyk7CisJX19zZXRfYml0KEhUX0FHR19TVEFURV9XQU5UX1NUQVJULCAmdGlkX3R4LT5zdGF0ZSk7CiAKIAkvKiBUeCB0aW1lciAqLwotCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lci5mdW5jdGlvbiA9Ci0JCQlzdGFfYWRkYmFfcmVzcF90aW1lcl9leHBpcmVkOwotCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lci5kYXRhID0KLQkJCSh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOwotCWluaXRfdGltZXIoJnN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lcik7CisJdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyLmZ1bmN0aW9uID0gc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZDsKKwl0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOworCWluaXRfdGltZXIoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CiAKLQkvKiBPaywgdGhlIEFkZGJhIGZyYW1lIGhhc24ndCBiZWVuIHNlbnQgeWV0LCBidXQgaWYgdGhlIGRyaXZlciBjYWxscyB0aGUKLQkgKiBjYWxsIGJhY2sgcmlnaHQgYXdheSwgaXQgbXVzdCBzZWUgdGhhdCB0aGUgZmxvdyBoYXMgYmVndW4gKi8KLQkqc3RhdGUgfD0gSFRfQUREQkFfUkVRVUVTVEVEX01TSzsKLQotCXN0YXJ0X3NlcV9udW0gPSBzdGEtPnRpZF9zZXFbdGlkXSA+PiA0OwotCi0JcmV0ID0gZHJ2X2FtcGR1X2FjdGlvbihsb2NhbCwgc2RhdGEsIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVCwKLQkJCSAgICAgICBwdWJzdGEsIHRpZCwgJnN0YXJ0X3NlcV9udW0pOwotCi0JaWYgKHJldCkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSBIVyB1bmF2YWlsYWJsZSBmb3IiCi0JCQkJCSIgdGlkICVkXG4iLCB0aWQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfSURMRTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQkvKiBEcml2ZXIgdmV0b2VkIG9yIE9LZWQsIGJ1dCB3ZSBjYW4gdGFrZSBwYWNrZXRzIGFnYWluIG5vdyAqLwotCWllZWU4MDIxMV93YWtlX3F1ZXVlX2J5X3JlYXNvbigKLQkJJmxvY2FsLT5odywgaWVlZTgwMjExX2FjX2Zyb21fdGlkKHRpZCksCi0JCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9BR0dSRUdBVElPTik7Ci0KLQlzcGluX3VubG9jaygmbG9jYWwtPmFtcGR1X2xvY2spOwotCi0JLyogcHJlcGFyZSB0aWQgZGF0YSAqLworCS8qIGFzc2lnbiBhIGRpYWxvZyB0b2tlbiAqLwogCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yKys7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5kaWFsb2dfdG9rZW4gPQotCQkJc3RhLT5hbXBkdV9tbG1lLmRpYWxvZ190b2tlbl9hbGxvY2F0b3I7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5zc24gPSBzdGFydF9zZXFfbnVtOworCXRpZF90eC0+ZGlhbG9nX3Rva2VuID0gc3RhLT5hbXBkdV9tbG1lLmRpYWxvZ190b2tlbl9hbGxvY2F0b3I7CiAKLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKwkvKiBmaW5hbGx5LCBhc3NpZ24gaXQgdG8gdGhlIGFycmF5ICovCisJcmN1X2Fzc2lnbl9wb2ludGVyKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSwgdGlkX3R4KTsKIAotCS8qIHNlbmQgQWRkQkEgcmVxdWVzdCAqLwotCWllZWU4MDIxMV9zZW5kX2FkZGJhX3JlcXVlc3Qoc2RhdGEsIHB1YnN0YS0+YWRkciwgdGlkLAotCQkJIHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+ZGlhbG9nX3Rva2VuLAotCQkJIHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+c3NuLAotCQkJIDB4NDAsIDUwMDApOwotCXN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0rKzsKLQkvKiBhY3RpdmF0ZSB0aGUgdGltZXIgZm9yIHRoZSByZWNpcGllbnQncyBhZGRCQSByZXNwb25zZSAqLwotCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lci5leHBpcmVzID0KLQkJCQlqaWZmaWVzICsgQUREQkFfUkVTUF9JTlRFUlZBTDsKLQlhZGRfdGltZXIoJnN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lcik7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgImFjdGl2YXRlZCBhZGRCQSByZXNwb25zZSB0aW1lciBvbiB0aWQgJWRcbiIsIHRpZCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKKwlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmc3RhLT5hbXBkdV9tbG1lLndvcmspOwogCi0gZXJyX2ZyZWU6Ci0Ja2ZyZWUoc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdKTsKLQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0gPSBOVUxMOwotIGVycl93YWtlX3F1ZXVlOgotCWllZWU4MDIxMV93YWtlX3F1ZXVlX2J5X3JlYXNvbigKLQkJJmxvY2FsLT5odywgaWVlZTgwMjExX2FjX2Zyb21fdGlkKHRpZCksCi0JCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9BR0dSRUdBVElPTik7CisJLyogdGhpcyBmbG93IGNvbnRpbnVlcyBvZmYgdGhlIHdvcmsgKi8KICBlcnJfdW5sb2NrX3N0YToKLQlzcGluX3VubG9jaygmbG9jYWwtPmFtcGR1X2xvY2spOwogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0zNzIsNjkgKzQzOSw2NSBAQAogCiAvKgogICogc3BsaWNlIHBhY2tldHMgZnJvbSB0aGUgU1RBJ3MgcGVuZGluZyB0byB0aGUgbG9jYWwgcGVuZGluZywKLSAqIHJlcXVpcmVzIGEgY2FsbCB0byBpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2ggYW5kIGhvbGRpbmcKLSAqIGxvY2FsLT5hbXBkdV9sb2NrIGFjcm9zcyBib3RoIGNhbGxzLgorICogcmVxdWlyZXMgYSBjYWxsIHRvIGllZWU4MDIxMV9hZ2dfc3BsaWNlX2ZpbmlzaCBsYXRlcgogICovCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfYWdnX3NwbGljZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkgc3RydWN0IHN0YV9pbmZvICpzdGEsIHUxNiB0aWQpCitzdGF0aWMgdm9pZCBfX2FjcXVpcmVzKGFnZ19xdWV1ZSkKK2llZWU4MDIxMV9hZ2dfc3BsaWNlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgICAgIHN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eCwgdTE2IHRpZCkKIHsKKwlpbnQgcXVldWUgPSBpZWVlODAyMTFfYWNfZnJvbV90aWQodGlkKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiBxdWV1ZSA9IGllZWU4MDIxMV9hY19mcm9tX3RpZCh0aWQpOwogCi0JaWVlZTgwMjExX3N0b3BfcXVldWVfYnlfcmVhc29uKAotCQkmbG9jYWwtPmh3LCBxdWV1ZSwKLQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0FHR1JFR0FUSU9OKTsKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZV9hZ2cobG9jYWwsIHRpZCk7CiAKLQlpZiAoIShzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZF0gJiBIVF9BRERCQV9SRVFVRVNURURfTVNLKSkKKwlpZiAoV0FSTighdGlkX3R4LCAiVElEICVkIGdvbmUgYnV0IGV4cGVjdGVkIHdoZW4gc3BsaWNpbmcgYWdncmVnYXRlcyIKKwkJCSAgIiBmcm9tIHRoZSBwZW5kaW5nIHF1ZXVlXG4iLCB0aWQpKQogCQlyZXR1cm47CiAKLQlpZiAoV0FSTighc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLAotCQkgIlRJRCAlZCBnb25lIGJ1dCBleHBlY3RlZCB3aGVuIHNwbGljaW5nIGFnZ3JlZ2F0ZXMgZnJvbSIKLQkJICJ0aGUgcGVuZGluZyBxdWV1ZVxuIiwgdGlkKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+cGVuZGluZykpIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdGlkX3R4LT5wZW5kaW5nKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKIAkJLyogY29weSBvdmVyIHJlbWFpbmluZyBwYWNrZXRzICovCi0JCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbF9pbml0KAotCQkJJnN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+cGVuZGluZywKLQkJCSZsb2NhbC0+cGVuZGluZ1txdWV1ZV0pOworCQlza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdCgmdGlkX3R4LT5wZW5kaW5nLAorCQkJCQkgICAmbG9jYWwtPnBlbmRpbmdbcXVldWVdKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9hZ2dfc3BsaWNlX2ZpbmlzaChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJc3RydWN0IHN0YV9pbmZvICpzdGEsIHUxNiB0aWQpCitzdGF0aWMgdm9pZCBfX3JlbGVhc2VzKGFnZ19xdWV1ZSkKK2llZWU4MDIxMV9hZ2dfc3BsaWNlX2ZpbmlzaChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgdTE2IHRpZCkKIHsKLQl1MTYgcXVldWUgPSBpZWVlODAyMTFfYWNfZnJvbV90aWQodGlkKTsKLQotCWllZWU4MDIxMV93YWtlX3F1ZXVlX2J5X3JlYXNvbigKLQkJJmxvY2FsLT5odywgcXVldWUsCi0JCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9BR0dSRUdBVElPTik7CisJaWVlZTgwMjExX3dha2VfcXVldWVfYWdnKGxvY2FsLCB0aWQpOwogfQogCi0vKiBjYWxsZXIgbXVzdCBob2xkIHN0YS0+bG9jayAqLwogc3RhdGljIHZvaWQgaWVlZTgwMjExX2FnZ190eF9vcGVyYXRpb25hbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQkJIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1MTYgdGlkKQogeworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnN0YS0+YW1wZHVfbWxtZS5tdHgpOworCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgIkFnZ3JlZ2F0aW9uIGlzIG9uIGZvciB0aWQgJWRcbiIsIHRpZCk7CiAjZW5kaWYKIAotCXNwaW5fbG9jaygmbG9jYWwtPmFtcGR1X2xvY2spOwotCWllZWU4MDIxMV9hZ2dfc3BsaWNlX3BhY2tldHMobG9jYWwsIHN0YSwgdGlkKTsKLQkvKgotCSAqIE5COiB3ZSByZWx5IG9uIHN0YS0+bG9jayBiZWluZyB0YWtlbiBpbiB0aGUgVFgKLQkgKiBwcm9jZXNzaW5nIGhlcmUgd2hlbiBhZGRpbmcgdG8gdGhlIHBlbmRpbmcgcXVldWUsCi0JICogb3RoZXJ3aXNlIHdlIGNvdWxkIG9ubHkgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUKLQkgKiBzZXNzaW9uIHRvIE9QRVJBVElPTkFMIF9oZXJlXy4KLQkgKi8KLQlpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2gobG9jYWwsIHN0YSwgdGlkKTsKLQlzcGluX3VubG9jaygmbG9jYWwtPmFtcGR1X2xvY2spOwotCiAJZHJ2X2FtcGR1X2FjdGlvbihsb2NhbCwgc3RhLT5zZGF0YSwKIAkJCSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUwsCiAJCQkgJnN0YS0+c3RhLCB0aWQsIE5VTEwpOworCisJLyoKKwkgKiBzeW5jaHJvbml6ZSB3aXRoIFRYIHBhdGgsIHdoaWxlIHNwbGljaW5nIHRoZSBUWCBwYXRoCisJICogc2hvdWxkIGJsb2NrIHNvIGl0IHdvbid0IHB1dCBtb3JlIHBhY2tldHMgb250byBwZW5kaW5nLgorCSAqLworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKworCWllZWU4MDIxMV9hZ2dfc3BsaWNlX3BhY2tldHMobG9jYWwsIHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSwgdGlkKTsKKwkvKgorCSAqIE5vdyBtYXJrIGFzIG9wZXJhdGlvbmFsLiBUaGlzIHdpbGwgYmUgdmlzaWJsZQorCSAqIGluIHRoZSBUWCBwYXRoLCBhbmQgbGV0cyBpdCBnbyBsb2NrLWZyZWUgaW4KKwkgKiB0aGUgY29tbW9uIGNhc2UuCisJICovCisJc2V0X2JpdChIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwsICZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPnN0YXRlKTsKKwlpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2gobG9jYWwsIHRpZCk7CisKKwlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2Ioc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKnJhLCB1MTYgdGlkKQpAQCAtNDQyLDcgKzUwNSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQl1OCAqc3RhdGU7CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OwogCiAJdHJhY2VfYXBpX3N0YXJ0X3R4X2JhX2NiKHNkYXRhLCByYSwgdGlkKTsKIApAQCAtNDU0LDQyICs1MTcsMzYgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJjdV9yZWFkX2xvY2soKTsKKwltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCByYSk7CiAJaWYgKCFzdGEpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGZpbmQgc3RhdGlvbjogJXBNXG4iLCByYSk7CiAjZW5kaWYKIAkJcmV0dXJuOwogCX0KIAotCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKLQlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7CisJbXV0ZXhfbG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CisJdGlkX3R4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdOwogCi0JaWYgKFdBUk5fT04oISgqc3RhdGUgJiBIVF9BRERCQV9SRVFVRVNURURfTVNLKSkpIHsKKwlpZiAoV0FSTl9PTighdGlkX3R4KSkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiYWRkQkEgd2FzIG5vdCByZXF1ZXN0ZWQgeWV0LCBzdGF0ZSBpcyAlZFxuIiwKLQkJCQkqc3RhdGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiYWRkQkEgd2FzIG5vdCByZXF1ZXN0ZWQhXG4iKTsKICNlbmRpZgotCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKKwkJZ290byB1bmxvY2s7CiAJfQogCi0JaWYgKFdBUk5fT04oKnN0YXRlICYgSFRfQUREQkFfRFJWX1JFQURZX01TSykpCi0JCWdvdG8gb3V0OworCWlmIChXQVJOX09OKHRlc3RfYW5kX3NldF9iaXQoSFRfQUdHX1NUQVRFX0RSVl9SRUFEWSwgJnRpZF90eC0+c3RhdGUpKSkKKwkJZ290byB1bmxvY2s7CiAKLQkqc3RhdGUgfD0gSFRfQUREQkFfRFJWX1JFQURZX01TSzsKLQotCWlmICgqc3RhdGUgPT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKQorCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfUkVTUE9OU0VfUkVDRUlWRUQsICZ0aWRfdHgtPnN0YXRlKSkKIAkJaWVlZTgwMjExX2FnZ190eF9vcGVyYXRpb25hbChsb2NhbCwgc3RhLCB0aWQpOwogCi0gb3V0OgotCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCXJjdV9yZWFkX3VubG9jaygpOworIHVubG9jazoKKwltdXRleF91bmxvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOworCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogfQotRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2IpOwogCiB2b2lkIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICAgY29uc3QgdTggKnJhLCB1MTYgdGlkKQpAQCAtNTEwLDQ0ICs1NjcsMzYgQEAKIAlyYV90aWQgPSAoc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKikgJnNrYi0+Y2I7CiAJbWVtY3B5KCZyYV90aWQtPnJhLCByYSwgRVRIX0FMRU4pOwogCXJhX3RpZC0+dGlkID0gdGlkOwotCXJhX3RpZC0+dmlmID0gdmlmOwogCi0Jc2tiLT5wa3RfdHlwZSA9IElFRUU4MDIxMV9BRERCQV9NU0c7Ci0Jc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT5za2JfcXVldWUsIHNrYik7Ci0JdGFza2xldF9zY2hlZHVsZSgmbG9jYWwtPnRhc2tsZXQpOworCXNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfQUdHX1NUQVJUOworCXNrYl9xdWV1ZV90YWlsKCZzZGF0YS0+c2tiX3F1ZXVlLCBza2IpOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKTsKIAogaW50IF9faWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgdTE2IHRpZCwKIAkJCQkgICBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKQogewotCXU4ICpzdGF0ZTsKIAlpbnQgcmV0OwogCi0JLyogY2hlY2sgaWYgdGhlIFRJRCBpcyBpbiBhZ2dyZWdhdGlvbiAqLwotCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKLQlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7Ci0KLQlpZiAoKnN0YXRlICE9IEhUX0FHR19TVEFURV9PUEVSQVRJT05BTCkgewotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIHVubG9jazsKLQl9CisJbXV0ZXhfbG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CiAKIAlyZXQgPSBfX19pZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCBpbml0aWF0b3IpOwogCi0gdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCW11dGV4X3VubG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CisKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhLCB1MTYgdGlkLAotCQkJCSBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKQoraW50IGllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwgdTE2IHRpZCkKIHsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZihwdWJzdGEsIHN0cnVjdCBzdGFfaW5mbywgc3RhKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OworCWludCByZXQgPSAwOwogCi0JdHJhY2VfYXBpX3N0b3BfdHhfYmFfc2Vzc2lvbihwdWJzdGEsIHRpZCwgaW5pdGlhdG9yKTsKKwl0cmFjZV9hcGlfc3RvcF90eF9iYV9zZXNzaW9uKHB1YnN0YSwgdGlkKTsKIAogCWlmICghbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU1NSw3ICs2MDQsMjYgQEAKIAlpZiAodGlkID49IFNUQV9USURfTlVNKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBfX2llZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQsIGluaXRpYXRvcik7CisJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCXRpZF90eCA9IHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXTsKKworCWlmICghdGlkX3R4KSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfU1RPUFBJTkcsICZ0aWRfdHgtPnN0YXRlKSkgeworCQkvKiBhbHJlYWR5IGluIHByb2dyZXNzIHN0b3BwaW5nIGl0ICovCisJCXJldCA9IDA7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXNldF9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RPUCwgJnRpZF90eC0+c3RhdGUpOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzdGEtPmFtcGR1X21sbWUud29yayk7CisKKyB1bmxvY2s6CisJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbik7CiAKQEAgLTU2NCw3ICs2MzIsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0JdTggKnN0YXRlOworCXN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eDsKIAogCXRyYWNlX2FwaV9zdG9wX3R4X2JhX2NiKHNkYXRhLCByYSwgdGlkKTsKIApAQCAtNTgxLDUxICs2NDksNTYgQEAKIAkgICAgICAgcmEsIHRpZCk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCiAKLQlyY3VfcmVhZF9sb2NrKCk7CisJbXV0ZXhfbG9jaygmbG9jYWwtPnN0YV9tdHgpOworCiAJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCByYSk7CiAJaWYgKCFzdGEpIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBmaW5kIHN0YXRpb246ICVwTVxuIiwgcmEpOwogI2VuZGlmCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47CisJCWdvdG8gdW5sb2NrOwogCX0KLQlzdGF0ZSA9ICZzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZF07CiAKLQkvKiBOT1RFOiBubyBuZWVkIHRvIHVzZSBzdGEtPmxvY2sgaW4gdGhpcyBzdGF0ZSBjaGVjaywgYXMKLQkgKiBpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uIHdpbGwgbGV0IG9ubHkgb25lIHN0b3AgY2FsbCB0bwotCSAqIHBhc3MgdGhyb3VnaCBwZXIgc3RhL3RpZAotCSAqLwotCWlmICgoKnN0YXRlICYgSFRfQUdHX1NUQVRFX1JFUV9TVE9QX0JBX01TSykgPT0gMCkgeworCW11dGV4X2xvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKwl0aWRfdHggPSBzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF07CisKKwlpZiAoIXRpZF90eCB8fCAhdGVzdF9iaXQoSFRfQUdHX1NUQVRFX1NUT1BQSU5HLCAmdGlkX3R4LT5zdGF0ZSkpIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAkJcHJpbnRrKEtFUk5fREVCVUcgInVuZXhwZWN0ZWQgY2FsbGJhY2sgdG8gQS1NUERVIHN0b3BcbiIpOwogI2VuZGlmCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47CisJCWdvdG8gdW5sb2NrX3N0YTsKIAl9CiAKLQlpZiAoKnN0YXRlICYgSFRfQUdHX1NUQVRFX0lOSVRJQVRPUl9NU0spCisJaWYgKHRpZF90eC0+c3RvcF9pbml0aWF0b3IgPT0gV0xBTl9CQUNLX0lOSVRJQVRPUikKIAkJaWVlZTgwMjExX3NlbmRfZGVsYmEoc3RhLT5zZGF0YSwgcmEsIHRpZCwKIAkJCVdMQU5fQkFDS19JTklUSUFUT1IsIFdMQU5fUkVBU09OX1FTVEFfTk9UX1VTRSk7CiAKLQlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZsb2NhbC0+YW1wZHVfbG9jayk7CisJLyoKKwkgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgVFggcGF0aCB3aWxsIG5vdCBiZSBsb2NrbGVzcyBhbnkgbW9yZSB3cnQuCisJICogYWdncmVnYXRpb24sIHNpbmNlIHRoZSBPUEVSQVRJT05BTCBiaXQgaGFzIGxvbmcgYmVlbiBjbGVhcmVkLgorCSAqIFRodXMgaXQgd2lsbCBibG9jayBvbiBnZXR0aW5nIHRoZSBsb2NrLCBpZiBpdCBvY2N1cnMuIFNvIGlmIHdlCisJICogc3RvcCB0aGUgcXVldWUgbm93LCB3ZSB3aWxsIG5vdCBnZXQgYW55IG1vcmUgcGFja2V0cywgYW5kIGFueQorCSAqIHRoYXQgbWlnaHQgYmUgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgd2FpdCBmb3IgdXMgaGVyZSwgdGhlcmVieQorCSAqIGd1YXJhbnRlZWluZyB0aGF0IG5vIHBhY2tldHMgZ28gdG8gdGhlIHRpZF90eCBwZW5kaW5nIHF1ZXVlIGFueQorCSAqIG1vcmUuCisJICovCiAKLQlpZWVlODAyMTFfYWdnX3NwbGljZV9wYWNrZXRzKGxvY2FsLCBzdGEsIHRpZCk7CisJaWVlZTgwMjExX2FnZ19zcGxpY2VfcGFja2V0cyhsb2NhbCwgdGlkX3R4LCB0aWQpOwogCi0JKnN0YXRlID0gSFRfQUdHX1NUQVRFX0lETEU7Ci0JLyogZnJvbSBub3cgb24gcGFja2V0cyBhcmUgbm8gbG9uZ2VyIHB1dCBvbnRvIHN0YS0+cGVuZGluZyAqLwotCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSk7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdID0gTlVMTDsKKwkvKiBmdXR1cmUgcGFja2V0cyBtdXN0IG5vdCBmaW5kIHRoZSB0aWRfdHggc3RydWN0IGFueSBtb3JlICovCisJcmN1X2Fzc2lnbl9wb2ludGVyKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSwgTlVMTCk7CiAKLQlpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2gobG9jYWwsIHN0YSwgdGlkKTsKKwlpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2gobG9jYWwsIHRpZCk7CiAKLQlzcGluX3VubG9jaygmbG9jYWwtPmFtcGR1X2xvY2spOworCWNhbGxfcmN1KCZ0aWRfdHgtPnJjdV9oZWFkLCBrZnJlZV90aWRfdHgpOworCisgdW5sb2NrX3N0YToKIAlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCXJjdV9yZWFkX3VubG9jaygpOworCW11dGV4X3VubG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CisgdW5sb2NrOgorCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogfQotRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF90eF9iYV9jYik7CiAKIHZvaWQgaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCSAgICAgY29uc3QgdTggKnJhLCB1MTYgdGlkKQpAQCAtNjQ2LDExICs3MTksMTAgQEAKIAlyYV90aWQgPSAoc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKikgJnNrYi0+Y2I7CiAJbWVtY3B5KCZyYV90aWQtPnJhLCByYSwgRVRIX0FMRU4pOwogCXJhX3RpZC0+dGlkID0gdGlkOwotCXJhX3RpZC0+dmlmID0gdmlmOwogCi0Jc2tiLT5wa3RfdHlwZSA9IElFRUU4MDIxMV9ERUxCQV9NU0c7Ci0Jc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT5za2JfcXVldWUsIHNrYik7Ci0JdGFza2xldF9zY2hlZHVsZSgmbG9jYWwtPnRhc2tsZXQpOworCXNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfQUdHX1NUT1A7CisJc2tiX3F1ZXVlX3RhaWwoJnNkYXRhLT5za2JfcXVldWUsIHNrYik7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSk7CiAKQEAgLTY2MCw0MCArNzMyLDQwIEBACiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkJICBzaXplX3QgbGVuKQogeworCXN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eDsKIAl1MTYgY2FwYWIsIHRpZDsKLQl1OCAqc3RhdGU7CiAKIAljYXBhYiA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5jYXBhYik7CiAJdGlkID0gKGNhcGFiICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLKSA+PiAyOwogCi0Jc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOworCW11dGV4X2xvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOwogCi0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCi0JaWYgKCEoKnN0YXRlICYgSFRfQUREQkFfUkVRVUVTVEVEX01TSykpCisJdGlkX3R4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdOworCWlmICghdGlkX3R4KQogCQlnb3RvIG91dDsKIAotCWlmIChtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuZGlhbG9nX3Rva2VuICE9Ci0JCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+ZGlhbG9nX3Rva2VuKSB7CisJaWYgKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5kaWFsb2dfdG9rZW4gIT0gdGlkX3R4LT5kaWFsb2dfdG9rZW4pIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAkJcHJpbnRrKEtFUk5fREVCVUcgIndyb25nIGFkZEJBIHJlc3BvbnNlIHRva2VuLCB0aWQgJWRcbiIsIHRpZCk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisjZW5kaWYKIAkJZ290byBvdXQ7CiAJfQogCi0JZGVsX3RpbWVyKCZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIpOworCWRlbF90aW1lcigmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyKTsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJzd2l0Y2hlZCBvZmYgYWRkQkEgdGltZXIgZm9yIHRpZCAlZFxuIiwgdGlkKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KKyNlbmRpZgogCiAJaWYgKGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5zdGF0dXMpCiAJCQk9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCXU4IGN1cnN0YXRlID0gKnN0YXRlOworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChIVF9BR0dfU1RBVEVfUkVTUE9OU0VfUkVDRUlWRUQsCisJCQkJICAgICAmdGlkX3R4LT5zdGF0ZSkpIHsKKwkJCS8qIGlnbm9yZSBkdXBsaWNhdGUgcmVzcG9uc2UgKi8KKwkJCWdvdG8gb3V0OworCQl9CiAKLQkJKnN0YXRlIHw9IEhUX0FEREJBX1JFQ0VJVkVEX01TSzsKLQotCQlpZiAoKnN0YXRlICE9IGN1cnN0YXRlICYmICpzdGF0ZSA9PSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwpCisJCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfRFJWX1JFQURZLCAmdGlkX3R4LT5zdGF0ZSkpCiAJCQlpZWVlODAyMTFfYWdnX3R4X29wZXJhdGlvbmFsKGxvY2FsLCBzdGEsIHRpZCk7CiAKIAkJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA9IDA7CkBAIC03MDIsNSArNzc0LDUgQEAKIAl9CiAKICBvdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9jZmcuYyBiL25ldC9tYWM4MDIxMS9jZmcuYwppbmRleCBjNzAwMGE2Li4yOWFjOGUxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvY2ZnLmMKKysrIGIvbmV0L21hYzgwMjExL2NmZy5jCkBAIC0xMjAsNiArMTIwLDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5OwogCWludCBlcnI7CiAKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAogCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKQEAgLTE0MCwxNyArMTQzLDIyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIHJlamVjdCBXRVAgYW5kIFRLSVAga2V5cyBpZiBXRVAgZmFpbGVkIHRvIGluaXRpYWxpemUgKi8KKwlpZiAoKGFsZyA9PSBBTEdfV0VQIHx8IGFsZyA9PSBBTEdfVEtJUCkgJiYKKwkgICAgSVNfRVJSKHNkYXRhLT5sb2NhbC0+d2VwX3R4X3RmbSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJa2V5ID0gaWVlZTgwMjExX2tleV9hbGxvYyhhbGcsIGtleV9pZHgsIHBhcmFtcy0+a2V5X2xlbiwgcGFyYW1zLT5rZXksCiAJCQkJICBwYXJhbXMtPnNlcV9sZW4sIHBhcmFtcy0+c2VxKTsKIAlpZiAoIWtleSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyY3VfcmVhZF9sb2NrKCk7CisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5zdGFfbXR4KTsKIAogCWlmIChtYWNfYWRkcikgewogCQlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBtYWNfYWRkcik7CiAJCWlmICghc3RhKSB7Ci0JCQlpZWVlODAyMTFfa2V5X2ZyZWUoa2V5KTsKKwkJCWllZWU4MDIxMV9rZXlfZnJlZShzZGF0YS0+bG9jYWwsIGtleSk7CiAJCQllcnIgPSAtRU5PRU5UOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CkBAIC0xNjAsNyArMTY4LDcgQEAKIAogCWVyciA9IDA7CiAgb3V0X3VubG9jazoKLQlyY3VfcmVhZF91bmxvY2soKTsKKwltdXRleF91bmxvY2soJnNkYXRhLT5sb2NhbC0+c3RhX210eCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTc0LDcgKzE4Miw3IEBACiAKIAlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5zdGFfbXR4KTsKIAogCWlmIChtYWNfYWRkcikgewogCQlyZXQgPSAtRU5PRU5UOwpAQCAtMTg0LDcgKzE5Miw3IEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAKIAkJaWYgKHN0YS0+a2V5KSB7Ci0JCQlpZWVlODAyMTFfa2V5X2ZyZWUoc3RhLT5rZXkpOworCQkJaWVlZTgwMjExX2tleV9mcmVlKHNkYXRhLT5sb2NhbCwgc3RhLT5rZXkpOwogCQkJV0FSTl9PTihzdGEtPmtleSk7CiAJCQlyZXQgPSAwOwogCQl9CkBAIC0xOTcsMTIgKzIwNSwxMiBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JaWVlZTgwMjExX2tleV9mcmVlKHNkYXRhLT5rZXlzW2tleV9pZHhdKTsKKwlpZWVlODAyMTFfa2V5X2ZyZWUoc2RhdGEtPmxvY2FsLCBzZGF0YS0+a2V5c1trZXlfaWR4XSk7CiAJV0FSTl9PTihzZGF0YS0+a2V5c1trZXlfaWR4XSk7CiAKIAlyZXQgPSAwOwogIG91dF91bmxvY2s6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPnN0YV9tdHgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMwNSwxNSArMzEzLDEwIEBACiAJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCXU4IGtleV9pZHgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCWllZWU4MDIxMV9zZXRfZGVmYXVsdF9rZXkoc2RhdGEsIGtleV9pZHgpOwogCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzIxLDE1ICszMjQsMTAgQEAKIAkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgICAgIHU4IGtleV9pZHgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCWllZWU4MDIxMV9zZXRfZGVmYXVsdF9tZ210X2tleShzZGF0YSwga2V5X2lkeCk7CiAKLQlyY3VfcmVhZF91bmxvY2soKTsKLQogCXJldHVybiAwOwogfQogCkBAIC00MTUsOSArNDEzLDYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwogCi0JaWYgKCFsb2NhbC0+b3BzLT5nZXRfc3VydmV5KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlyZXR1cm4gZHJ2X2dldF9zdXJ2ZXkobG9jYWwsIGlkeCwgc3VydmV5KTsKIH0KIApAQCAtNjAwLDcgKzU5NSw3IEBACiAJdTggc3NhcDsJCS8qIDAgKi8KIAl1OCBjb250cm9sOwogCXU4IHhpZF9pbmZvWzNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9sYXllcjJfdXBkYXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewpAQCAtNjMyLDcgKzYyNyw3IEBACiAJc2tiLT5kZXYgPSBzdGEtPnNkYXRhLT5kZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc3RhLT5zZGF0YS0+ZGV2KTsKIAltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKLQluZXRpZl9yeChza2IpOworCW5ldGlmX3J4X25pKHNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YV9hcHBseV9wYXJhbWV0ZXJzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLApAQCAtMTE1NCwxMCArMTE0OSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIGVuYWJsZSBXTU0gb3IgYWN0aXZhdGUgbmV3IHNldHRpbmdzICovCi0JbG9jYWwtPmh3LmNvbmYuZmxhZ3MgfD0gSUVFRTgwMjExX0NPTkZfUU9TOwotCWRydl9jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9RT1MpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMzEsMjggKzEzMjIsMjggQEAKIH0KIAogc3RhdGljIGludCBpZWVlODAyMTFfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICBlbnVtIHR4X3Bvd2VyX3NldHRpbmcgdHlwZSwgaW50IGRibSkKKwkJCQkgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsIGludCBtYm0pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsOwogCXUzMiBjaGFuZ2VzID0gMDsKIAogCXN3aXRjaCAodHlwZSkgewotCWNhc2UgVFhfUE9XRVJfQVVUT01BVElDOgorCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6CiAJCWxvY2FsLT51c2VyX3Bvd2VyX2xldmVsID0gLTE7CiAJCWJyZWFrOwotCWNhc2UgVFhfUE9XRVJfTElNSVRFRDoKLQkJaWYgKGRibSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbG9jYWwtPnVzZXJfcG93ZXJfbGV2ZWwgPSBkYm07CisJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0xJTUlURUQ6CisJCWlmIChtYm0gPCAwIHx8IChtYm0gJSAxMDApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlsb2NhbC0+dXNlcl9wb3dlcl9sZXZlbCA9IE1CTV9UT19EQk0obWJtKTsKIAkJYnJlYWs7Ci0JY2FzZSBUWF9QT1dFUl9GSVhFRDoKLQkJaWYgKGRibSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6CisJCWlmIChtYm0gPCAwIHx8IChtYm0gJSAxMDApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQkvKiBUT0RPOiBtb3ZlIHRvIGNmZzgwMjExIHdoZW4gaXQga25vd3MgdGhlIGNoYW5uZWwgKi8KLQkJaWYgKGRibSA+IGNoYW4tPm1heF9wb3dlcikKKwkJaWYgKE1CTV9UT19EQk0obWJtKSA+IGNoYW4tPm1heF9wb3dlcikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlsb2NhbC0+dXNlcl9wb3dlcl9sZXZlbCA9IGRibTsKKwkJbG9jYWwtPnVzZXJfcG93ZXJfbGV2ZWwgPSBNQk1fVE9fREJNKG1ibSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQ0OCw3ICsxNDM5LDYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmbG9jYWwtPmh3LmNvbmY7CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTE0NTcsMTEgKzE0NDcsMTEgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKGVuYWJsZWQgPT0gc2RhdGEtPnUubWdkLnBvd2Vyc2F2ZSAmJgotCSAgICB0aW1lb3V0ID09IGNvbmYtPmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQpCisJICAgIHRpbWVvdXQgPT0gbG9jYWwtPmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQpCiAJCXJldHVybiAwOwogCiAJc2RhdGEtPnUubWdkLnBvd2Vyc2F2ZSA9IGVuYWJsZWQ7Ci0JY29uZi0+ZHluYW1pY19wc19mb3JjZWRfdGltZW91dCA9IHRpbWVvdXQ7CisJbG9jYWwtPmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQgPSB0aW1lb3V0OwogCiAJLyogbm8gY2hhbmdlLCBidXQgaWYgYXV0b21hdGljIGZvbGxvdyBwb3dlcnNhdmUgKi8KIAltdXRleF9sb2NrKCZzZGF0YS0+dS5tZ2QubXR4KTsKQEAgLTE1NTQsMTAgKzE1NDQsNTggQEAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2FjdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCSAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKwkJCSAgICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwKIAkJCSAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1NjQgKmNvb2tpZSkKIHsKLQlyZXR1cm4gaWVlZTgwMjExX21nZF9hY3Rpb24oSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KSwgY2hhbiwKLQkJCQkgICAgY2hhbm5lbF90eXBlLCBidWYsIGxlbiwgY29va2llKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAodm9pZCAqKWJ1ZjsKKwl1MzIgZmxhZ3MgPSBJRUVFODAyMTFfVFhfSU5URkxfTkw4MDIxMV9GUkFNRV9UWCB8CisJCSAgICBJRUVFODAyMTFfVFhfQ1RMX1JFUV9UWF9TVEFUVVM7CisKKwkvKiBDaGVjayB0aGF0IHdlIGFyZSBvbiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgZm9yIHRyYW5zbWlzc2lvbiAqLworCWlmIChjaGFuICE9IGxvY2FsLT50bXBfY2hhbm5lbCAmJgorCSAgICBjaGFuICE9IGxvY2FsLT5vcGVyX2NoYW5uZWwpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKGNoYW5uZWxfdHlwZV92YWxpZCAmJgorCSAgICAoY2hhbm5lbF90eXBlICE9IGxvY2FsLT50bXBfY2hhbm5lbF90eXBlICYmCisJICAgICBjaGFubmVsX3R5cGUgIT0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWlmIChtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PSBXTEFOX0NBVEVHT1JZX1BVQkxJQykKKwkJCWJyZWFrOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgbWdtdC0+ZGEpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJaWYgKCFzdGEpCisJCQlyZXR1cm4gLUVOT0xJTks7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJaWYgKCEoc2RhdGEtPnUubWdkLmZsYWdzICYgSUVFRTgwMjExX1NUQV9NRlBfRU5BQkxFRCkpCisJCQlmbGFncyB8PSBJRUVFODAyMTFfVFhfSU5URkxfRE9OVF9FTkNSWVBUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKyBsZW4pOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKwlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CisKKwltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKKworCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBmbGFnczsKKworCXNrYi0+ZGV2ID0gc2RhdGEtPmRldjsKKwlpZWVlODAyMTFfdHhfc2tiKHNkYXRhLCBza2IpOworCisJKmNvb2tpZSA9ICh1bnNpZ25lZCBsb25nKSBza2I7CisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBjZmc4MDIxMV9vcHMgbWFjODAyMTFfY29uZmlnX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCmluZGV4IDYzNzkyOWIuLmE2OTRjNTkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnMuYwpAQCAtMzA3LDkgKzMwNyw2IEBACiAKIC8qIHN0YXRpc3RpY3Mgc3R1ZmYgKi8KIAotI2RlZmluZSBERUJVR0ZTX1NUQVRTX0ZJTEUobmFtZSwgYnVmbGVuLCBmbXQsIHZhbHVlLi4uKQkJCVwKLQlERUJVR0ZTX1JFQURPTkxZX0ZJTEUoc3RhdHNfICMjbmFtZSwgYnVmbGVuLCBmbXQsICMjdmFsdWUpCi0KIHN0YXRpYyBzc2l6ZV90IGZvcm1hdF9kZXZzdGF0X2NvdW50ZXIoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJY2hhciBfX3VzZXIgKnVzZXJidWYsCiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MsCkBAIC0zNTEsNzUgKzM0OCwxNiBAQAogCS5vcGVuID0gbWFjODAyMTFfb3Blbl9maWxlX2dlbmVyaWMsCQkJCVwKIH07CiAKLSNkZWZpbmUgREVCVUdGU19TVEFUU19BREQobmFtZSkJCQkJCQlcCisjZGVmaW5lIERFQlVHRlNfU1RBVFNfQUREKG5hbWUsIGZpZWxkKQkJCQkJXAorCWRlYnVnZnNfY3JlYXRlX3UzMigjbmFtZSwgMDQwMCwgc3RhdHNkLCAodTMyICopICZmaWVsZCk7CisjZGVmaW5lIERFQlVHRlNfREVWU1RBVFNfQUREKG5hbWUpCQkJCQlcCiAJZGVidWdmc19jcmVhdGVfZmlsZSgjbmFtZSwgMDQwMCwgc3RhdHNkLCBsb2NhbCwgJnN0YXRzXyAjI25hbWUjIyBfb3BzKTsKIAotREVCVUdGU19TVEFUU19GSUxFKHRyYW5zbWl0dGVkX2ZyYWdtZW50X2NvdW50LCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPmRvdDExVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50KTsKLURFQlVHRlNfU1RBVFNfRklMRShtdWx0aWNhc3RfdHJhbnNtaXR0ZWRfZnJhbWVfY291bnQsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+ZG90MTFNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOwotREVCVUdGU19TVEFUU19GSUxFKGZhaWxlZF9jb3VudCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5kb3QxMUZhaWxlZENvdW50KTsKLURFQlVHRlNfU1RBVFNfRklMRShyZXRyeV9jb3VudCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5kb3QxMVJldHJ5Q291bnQpOwotREVCVUdGU19TVEFUU19GSUxFKG11bHRpcGxlX3JldHJ5X2NvdW50LCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPmRvdDExTXVsdGlwbGVSZXRyeUNvdW50KTsKLURFQlVHRlNfU1RBVFNfRklMRShmcmFtZV9kdXBsaWNhdGVfY291bnQsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+ZG90MTFGcmFtZUR1cGxpY2F0ZUNvdW50KTsKLURFQlVHRlNfU1RBVFNfRklMRShyZWNlaXZlZF9mcmFnbWVudF9jb3VudCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5kb3QxMVJlY2VpdmVkRnJhZ21lbnRDb3VudCk7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUobXVsdGljYXN0X3JlY2VpdmVkX2ZyYW1lX2NvdW50LCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPmRvdDExTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50KTsKLURFQlVHRlNfU1RBVFNfRklMRSh0cmFuc21pdHRlZF9mcmFtZV9jb3VudCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5kb3QxMVRyYW5zbWl0dGVkRnJhbWVDb3VudCk7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHX0NPVU5URVJTCi1ERUJVR0ZTX1NUQVRTX0ZJTEUodHhfaGFuZGxlcnNfZHJvcCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT50eF9oYW5kbGVyc19kcm9wKTsKLURFQlVHRlNfU1RBVFNfRklMRSh0eF9oYW5kbGVyc19xdWV1ZWQsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+dHhfaGFuZGxlcnNfcXVldWVkKTsKLURFQlVHRlNfU1RBVFNfRklMRSh0eF9oYW5kbGVyc19kcm9wX3VuZW5jcnlwdGVkLCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3BfdW5lbmNyeXB0ZWQpOwotREVCVUdGU19TVEFUU19GSUxFKHR4X2hhbmRsZXJzX2Ryb3BfZnJhZ21lbnQsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+dHhfaGFuZGxlcnNfZHJvcF9mcmFnbWVudCk7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUodHhfaGFuZGxlcnNfZHJvcF93ZXAsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+dHhfaGFuZGxlcnNfZHJvcF93ZXApOwotREVCVUdGU19TVEFUU19GSUxFKHR4X2hhbmRsZXJzX2Ryb3Bfbm90X2Fzc29jLCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3Bfbm90X2Fzc29jKTsKLURFQlVHRlNfU1RBVFNfRklMRSh0eF9oYW5kbGVyc19kcm9wX3VuYXV0aF9wb3J0LCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3BfdW5hdXRoX3BvcnQpOwotREVCVUdGU19TVEFUU19GSUxFKHJ4X2hhbmRsZXJzX2Ryb3AsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+cnhfaGFuZGxlcnNfZHJvcCk7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUocnhfaGFuZGxlcnNfcXVldWVkLCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnJ4X2hhbmRsZXJzX3F1ZXVlZCk7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUocnhfaGFuZGxlcnNfZHJvcF9udWxsZnVuYywgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX251bGxmdW5jKTsKLURFQlVHRlNfU1RBVFNfRklMRShyeF9oYW5kbGVyc19kcm9wX2RlZnJhZywgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX2RlZnJhZyk7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUocnhfaGFuZGxlcnNfZHJvcF9zaG9ydCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX3Nob3J0KTsKLURFQlVHRlNfU1RBVFNfRklMRShyeF9oYW5kbGVyc19kcm9wX3Bhc3NpdmVfc2NhbiwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX3Bhc3NpdmVfc2Nhbik7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUodHhfZXhwYW5kX3NrYl9oZWFkLCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnR4X2V4cGFuZF9za2JfaGVhZCk7Ci1ERUJVR0ZTX1NUQVRTX0ZJTEUodHhfZXhwYW5kX3NrYl9oZWFkX2Nsb25lZCwgMjAsICIldSIsCi0JCSAgIGxvY2FsLT50eF9leHBhbmRfc2tiX2hlYWRfY2xvbmVkKTsKLURFQlVHRlNfU1RBVFNfRklMRShyeF9leHBhbmRfc2tiX2hlYWQsIDIwLCAiJXUiLAotCQkgICBsb2NhbC0+cnhfZXhwYW5kX3NrYl9oZWFkKTsKLURFQlVHRlNfU1RBVFNfRklMRShyeF9leHBhbmRfc2tiX2hlYWQyLCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnJ4X2V4cGFuZF9za2JfaGVhZDIpOwotREVCVUdGU19TVEFUU19GSUxFKHJ4X2hhbmRsZXJzX2ZyYWdtZW50cywgMjAsICIldSIsCi0JCSAgIGxvY2FsLT5yeF9oYW5kbGVyc19mcmFnbWVudHMpOwotREVCVUdGU19TVEFUU19GSUxFKHR4X3N0YXR1c19kcm9wLCAyMCwgIiV1IiwKLQkJICAgbG9jYWwtPnR4X3N0YXR1c19kcm9wKTsKLQotI2VuZGlmCi0KIERFQlVHRlNfREVWU1RBVFNfRklMRShkb3QxMUFDS0ZhaWx1cmVDb3VudCk7CiBERUJVR0ZTX0RFVlNUQVRTX0ZJTEUoZG90MTFSVFNGYWlsdXJlQ291bnQpOwogREVCVUdGU19ERVZTVEFUU19GSUxFKGRvdDExRkNTRXJyb3JDb3VudCk7CiBERUJVR0ZTX0RFVlNUQVRTX0ZJTEUoZG90MTFSVFNTdWNjZXNzQ291bnQpOwogCi0KIHZvaWQgZGVidWdmc19od19hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJc3RydWN0IGRlbnRyeSAqcGh5ZCA9IGxvY2FsLT5ody53aXBoeS0+ZGVidWdmc2RpcjsKQEAgLTQ0OCwzOCArMzg2LDYwIEBACiAJaWYgKCFzdGF0c2QpCiAJCXJldHVybjsKIAotCURFQlVHRlNfU1RBVFNfQUREKHRyYW5zbWl0dGVkX2ZyYWdtZW50X2NvdW50KTsKLQlERUJVR0ZTX1NUQVRTX0FERChtdWx0aWNhc3RfdHJhbnNtaXR0ZWRfZnJhbWVfY291bnQpOwotCURFQlVHRlNfU1RBVFNfQUREKGZhaWxlZF9jb3VudCk7Ci0JREVCVUdGU19TVEFUU19BREQocmV0cnlfY291bnQpOwotCURFQlVHRlNfU1RBVFNfQUREKG11bHRpcGxlX3JldHJ5X2NvdW50KTsKLQlERUJVR0ZTX1NUQVRTX0FERChmcmFtZV9kdXBsaWNhdGVfY291bnQpOwotCURFQlVHRlNfU1RBVFNfQUREKHJlY2VpdmVkX2ZyYWdtZW50X2NvdW50KTsKLQlERUJVR0ZTX1NUQVRTX0FERChtdWx0aWNhc3RfcmVjZWl2ZWRfZnJhbWVfY291bnQpOwotCURFQlVHRlNfU1RBVFNfQUREKHRyYW5zbWl0dGVkX2ZyYW1lX2NvdW50KTsKKwlERUJVR0ZTX1NUQVRTX0FERCh0cmFuc21pdHRlZF9mcmFnbWVudF9jb3VudCwKKwkJbG9jYWwtPmRvdDExVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50KTsKKwlERUJVR0ZTX1NUQVRTX0FERChtdWx0aWNhc3RfdHJhbnNtaXR0ZWRfZnJhbWVfY291bnQsCisJCWxvY2FsLT5kb3QxMU11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudCk7CisJREVCVUdGU19TVEFUU19BREQoZmFpbGVkX2NvdW50LCBsb2NhbC0+ZG90MTFGYWlsZWRDb3VudCk7CisJREVCVUdGU19TVEFUU19BREQocmV0cnlfY291bnQsIGxvY2FsLT5kb3QxMVJldHJ5Q291bnQpOworCURFQlVHRlNfU1RBVFNfQUREKG11bHRpcGxlX3JldHJ5X2NvdW50LAorCQlsb2NhbC0+ZG90MTFNdWx0aXBsZVJldHJ5Q291bnQpOworCURFQlVHRlNfU1RBVFNfQUREKGZyYW1lX2R1cGxpY2F0ZV9jb3VudCwKKwkJbG9jYWwtPmRvdDExRnJhbWVEdXBsaWNhdGVDb3VudCk7CisJREVCVUdGU19TVEFUU19BREQocmVjZWl2ZWRfZnJhZ21lbnRfY291bnQsCisJCWxvY2FsLT5kb3QxMVJlY2VpdmVkRnJhZ21lbnRDb3VudCk7CisJREVCVUdGU19TVEFUU19BREQobXVsdGljYXN0X3JlY2VpdmVkX2ZyYW1lX2NvdW50LAorCQlsb2NhbC0+ZG90MTFNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQpOworCURFQlVHRlNfU1RBVFNfQUREKHRyYW5zbWl0dGVkX2ZyYW1lX2NvdW50LAorCQlsb2NhbC0+ZG90MTFUcmFuc21pdHRlZEZyYW1lQ291bnQpOwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR19DT1VOVEVSUwotCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX2Ryb3ApOwotCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX3F1ZXVlZCk7Ci0JREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF91bmVuY3J5cHRlZCk7Ci0JREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF9mcmFnbWVudCk7Ci0JREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF93ZXApOwotCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX2Ryb3Bfbm90X2Fzc29jKTsKLQlERUJVR0ZTX1NUQVRTX0FERCh0eF9oYW5kbGVyc19kcm9wX3VuYXV0aF9wb3J0KTsKLQlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19kcm9wKTsKLQlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19xdWV1ZWQpOwotCURFQlVHRlNfU1RBVFNfQUREKHJ4X2hhbmRsZXJzX2Ryb3BfbnVsbGZ1bmMpOwotCURFQlVHRlNfU1RBVFNfQUREKHJ4X2hhbmRsZXJzX2Ryb3BfZGVmcmFnKTsKLQlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19kcm9wX3Nob3J0KTsKLQlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19kcm9wX3Bhc3NpdmVfc2Nhbik7Ci0JREVCVUdGU19TVEFUU19BREQodHhfZXhwYW5kX3NrYl9oZWFkKTsKLQlERUJVR0ZTX1NUQVRTX0FERCh0eF9leHBhbmRfc2tiX2hlYWRfY2xvbmVkKTsKLQlERUJVR0ZTX1NUQVRTX0FERChyeF9leHBhbmRfc2tiX2hlYWQpOwotCURFQlVHRlNfU1RBVFNfQUREKHJ4X2V4cGFuZF9za2JfaGVhZDIpOwotCURFQlVHRlNfU1RBVFNfQUREKHJ4X2hhbmRsZXJzX2ZyYWdtZW50cyk7Ci0JREVCVUdGU19TVEFUU19BREQodHhfc3RhdHVzX2Ryb3ApOworCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX2Ryb3AsIGxvY2FsLT50eF9oYW5kbGVyc19kcm9wKTsKKwlERUJVR0ZTX1NUQVRTX0FERCh0eF9oYW5kbGVyc19xdWV1ZWQsIGxvY2FsLT50eF9oYW5kbGVyc19xdWV1ZWQpOworCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX2Ryb3BfdW5lbmNyeXB0ZWQsCisJCWxvY2FsLT50eF9oYW5kbGVyc19kcm9wX3VuZW5jcnlwdGVkKTsKKwlERUJVR0ZTX1NUQVRTX0FERCh0eF9oYW5kbGVyc19kcm9wX2ZyYWdtZW50LAorCQlsb2NhbC0+dHhfaGFuZGxlcnNfZHJvcF9mcmFnbWVudCk7CisJREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF93ZXAsCisJCWxvY2FsLT50eF9oYW5kbGVyc19kcm9wX3dlcCk7CisJREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF9ub3RfYXNzb2MsCisJCWxvY2FsLT50eF9oYW5kbGVyc19kcm9wX25vdF9hc3NvYyk7CisJREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF91bmF1dGhfcG9ydCwKKwkJbG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3BfdW5hdXRoX3BvcnQpOworCURFQlVHRlNfU1RBVFNfQUREKHJ4X2hhbmRsZXJzX2Ryb3AsIGxvY2FsLT5yeF9oYW5kbGVyc19kcm9wKTsKKwlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19xdWV1ZWQsIGxvY2FsLT5yeF9oYW5kbGVyc19xdWV1ZWQpOworCURFQlVHRlNfU1RBVFNfQUREKHJ4X2hhbmRsZXJzX2Ryb3BfbnVsbGZ1bmMsCisJCWxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX251bGxmdW5jKTsKKwlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19kcm9wX2RlZnJhZywKKwkJbG9jYWwtPnJ4X2hhbmRsZXJzX2Ryb3BfZGVmcmFnKTsKKwlERUJVR0ZTX1NUQVRTX0FERChyeF9oYW5kbGVyc19kcm9wX3Nob3J0LAorCQlsb2NhbC0+cnhfaGFuZGxlcnNfZHJvcF9zaG9ydCk7CisJREVCVUdGU19TVEFUU19BREQocnhfaGFuZGxlcnNfZHJvcF9wYXNzaXZlX3NjYW4sCisJCWxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX3Bhc3NpdmVfc2Nhbik7CisJREVCVUdGU19TVEFUU19BREQodHhfZXhwYW5kX3NrYl9oZWFkLAorCQlsb2NhbC0+dHhfZXhwYW5kX3NrYl9oZWFkKTsKKwlERUJVR0ZTX1NUQVRTX0FERCh0eF9leHBhbmRfc2tiX2hlYWRfY2xvbmVkLAorCQlsb2NhbC0+dHhfZXhwYW5kX3NrYl9oZWFkX2Nsb25lZCk7CisJREVCVUdGU19TVEFUU19BREQocnhfZXhwYW5kX3NrYl9oZWFkLAorCQlsb2NhbC0+cnhfZXhwYW5kX3NrYl9oZWFkKTsKKwlERUJVR0ZTX1NUQVRTX0FERChyeF9leHBhbmRfc2tiX2hlYWQyLAorCQlsb2NhbC0+cnhfZXhwYW5kX3NrYl9oZWFkMik7CisJREVCVUdGU19TVEFUU19BREQocnhfaGFuZGxlcnNfZnJhZ21lbnRzLAorCQlsb2NhbC0+cnhfaGFuZGxlcnNfZnJhZ21lbnRzKTsKKwlERUJVR0ZTX1NUQVRTX0FERCh0eF9zdGF0dXNfZHJvcCwKKwkJbG9jYWwtPnR4X3N0YXR1c19kcm9wKTsKICNlbmRpZgotCURFQlVHRlNfU1RBVFNfQUREKGRvdDExQUNLRmFpbHVyZUNvdW50KTsKLQlERUJVR0ZTX1NUQVRTX0FERChkb3QxMVJUU0ZhaWx1cmVDb3VudCk7Ci0JREVCVUdGU19TVEFUU19BREQoZG90MTFGQ1NFcnJvckNvdW50KTsKLQlERUJVR0ZTX1NUQVRTX0FERChkb3QxMVJUU1N1Y2Nlc3NDb3VudCk7CisJREVCVUdGU19ERVZTVEFUU19BREQoZG90MTFBQ0tGYWlsdXJlQ291bnQpOworCURFQlVHRlNfREVWU1RBVFNfQUREKGRvdDExUlRTRmFpbHVyZUNvdW50KTsKKwlERUJVR0ZTX0RFVlNUQVRTX0FERChkb3QxMUZDU0Vycm9yQ291bnQpOworCURFQlVHRlNfREVWU1RBVFNfQUREKGRvdDExUlRTU3VjY2Vzc0NvdW50KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfa2V5LmMKaW5kZXggOTdjOWU0Ni4uZmE1ZTc2ZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfa2V5LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfa2V5LmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQlsZW4gPSBwIC0gYnVmOwogCQlicmVhazsKIAljYXNlIEFMR19DQ01QOgotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RBVEFfUVVFVUVTOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9EQVRBX1FVRVVFUyArIDE7IGkrKykgewogCQkJcnBuID0ga2V5LT51LmNjbXAucnhfcG5baV07CiAJCQlwICs9IHNjbnByaW50ZihwLCBzaXplb2YoYnVmKStidWYtcCwKIAkJCQkgICAgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKaW5kZXggZTc2M2YxNS4uNzY4MzlkNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKQEAgLTMwLDcgKzMwLDYgQEAKIH0KICNkZWZpbmUgU1RBX1JFQURfRChuYW1lLCBmaWVsZCkgU1RBX1JFQUQobmFtZSwgMjAsIGZpZWxkLCAiJWRcbiIpCiAjZGVmaW5lIFNUQV9SRUFEX1UobmFtZSwgZmllbGQpIFNUQV9SRUFEKG5hbWUsIDIwLCBmaWVsZCwgIiV1XG4iKQotI2RlZmluZSBTVEFfUkVBRF9MVShuYW1lLCBmaWVsZCkgU1RBX1JFQUQobmFtZSwgMjAsIGZpZWxkLCAiJWx1XG4iKQogI2RlZmluZSBTVEFfUkVBRF9TKG5hbWUsIGZpZWxkKSBTVEFfUkVBRChuYW1lLCAyMCwgZmllbGQsICIlc1xuIikKIAogI2RlZmluZSBTVEFfT1BTKG5hbWUpCQkJCQkJCVwKQEAgLTUyLDE5ICs1MSw3IEBACiAKIFNUQV9GSUxFKGFpZCwgc3RhLmFpZCwgRCk7CiBTVEFfRklMRShkZXYsIHNkYXRhLT5uYW1lLCBTKTsKLVNUQV9GSUxFKHJ4X3BhY2tldHMsIHJ4X3BhY2tldHMsIExVKTsKLVNUQV9GSUxFKHR4X3BhY2tldHMsIHR4X3BhY2tldHMsIExVKTsKLVNUQV9GSUxFKHJ4X2J5dGVzLCByeF9ieXRlcywgTFUpOwotU1RBX0ZJTEUodHhfYnl0ZXMsIHR4X2J5dGVzLCBMVSk7Ci1TVEFfRklMRShyeF9kdXBsaWNhdGVzLCBudW1fZHVwbGljYXRlcywgTFUpOwotU1RBX0ZJTEUocnhfZnJhZ21lbnRzLCByeF9mcmFnbWVudHMsIExVKTsKLVNUQV9GSUxFKHJ4X2Ryb3BwZWQsIHJ4X2Ryb3BwZWQsIExVKTsKLVNUQV9GSUxFKHR4X2ZyYWdtZW50cywgdHhfZnJhZ21lbnRzLCBMVSk7Ci1TVEFfRklMRSh0eF9maWx0ZXJlZCwgdHhfZmlsdGVyZWRfY291bnQsIExVKTsKLVNUQV9GSUxFKHR4X3JldHJ5X2ZhaWxlZCwgdHhfcmV0cnlfZmFpbGVkLCBMVSk7Ci1TVEFfRklMRSh0eF9yZXRyeV9jb3VudCwgdHhfcmV0cnlfY291bnQsIExVKTsKIFNUQV9GSUxFKGxhc3Rfc2lnbmFsLCBsYXN0X3NpZ25hbCwgRCk7Ci1TVEFfRklMRSh3ZXBfd2Vha19pdl9jb3VudCwgd2VwX3dlYWtfaXZfY291bnQsIExVKTsKIAogc3RhdGljIHNzaXplX3Qgc3RhX2ZsYWdzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0xMzQsMjggKzEyMSwyNSBAQAogCXAgKz0gc2NucHJpbnRmKHAsIHNpemVvZihidWYpICsgYnVmIC0gcCwgIm5leHQgZGlhbG9nX3Rva2VuOiAlIzAyeFxuIiwKIAkJCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yICsgMSk7CiAJcCArPSBzY25wcmludGYocCwgc2l6ZW9mKGJ1ZikgKyBidWYgLSBwLAotCQkgICAgICAgIlRJRFx0XHRSWCBhY3RpdmVcdERUS05cdFNTTlx0XHRUWFx0RFRLTlx0U1NOXHRwZW5kaW5nXG4iKTsKKwkJICAgICAgICJUSURcdFx0UlggYWN0aXZlXHREVEtOXHRTU05cdFx0VFhcdERUS05cdHBlbmRpbmdcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBTVEFfVElEX05VTTsgaSsrKSB7CiAJCXAgKz0gc2NucHJpbnRmKHAsIHNpemVvZihidWYpICsgYnVmIC0gcCwgIiUwMmQiLCBpKTsKIAkJcCArPSBzY25wcmludGYocCwgc2l6ZW9mKGJ1ZikgKyBidWYgLSBwLCAiXHRcdCV4IiwKLQkJCQlzdGEtPmFtcGR1X21sbWUudGlkX2FjdGl2ZV9yeFtpXSk7CisJCQkJISFzdGEtPmFtcGR1X21sbWUudGlkX3J4W2ldKTsKIAkJcCArPSBzY25wcmludGYocCwgc2l6ZW9mKGJ1ZikgKyBidWYgLSBwLCAiXHQlIy4yeCIsCi0JCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9hY3RpdmVfcnhbaV0gPworCQkJCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbaV0gPwogCQkJCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbaV0tPmRpYWxvZ190b2tlbiA6IDApOwogCQlwICs9IHNjbnByaW50ZihwLCBzaXplb2YoYnVmKSArIGJ1ZiAtIHAsICJcdCUjLjN4IiwKLQkJCQlzdGEtPmFtcGR1X21sbWUudGlkX2FjdGl2ZV9yeFtpXSA/CisJCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFtpXSA/CiAJCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFtpXS0+c3NuIDogMCk7CiAKIAkJcCArPSBzY25wcmludGYocCwgc2l6ZW9mKGJ1ZikgKyBidWYgLSBwLCAiXHRcdCV4IiwKLQkJCQlzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W2ldKTsKKwkJCQkhIXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbaV0pOwogCQlwICs9IHNjbnByaW50ZihwLCBzaXplb2YoYnVmKSArIGJ1ZiAtIHAsICJcdCUjLjJ4IiwKLQkJCQlzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W2ldID8KKwkJCQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W2ldID8KIAkJCQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W2ldLT5kaWFsb2dfdG9rZW4gOiAwKTsKLQkJcCArPSBzY25wcmludGYocCwgc2l6ZW9mKGJ1ZikgKyBidWYgLSBwLCAiXHQlIy4zeCIsCi0JCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFtpXSA/Ci0JCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF90eFtpXS0+c3NuIDogMCk7CiAJCXAgKz0gc2NucHJpbnRmKHAsIHNpemVvZihidWYpICsgYnVmIC0gcCwgIlx0JTAzZCIsCi0JCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFtpXSA/CisJCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF90eFtpXSA/CiAJCQkJc2tiX3F1ZXVlX2xlbigmc3RhLT5hbXBkdV9tbG1lLnRpZF90eFtpXS0+cGVuZGluZykgOiAwKTsKIAkJcCArPSBzY25wcmludGYocCwgc2l6ZW9mKGJ1ZikgKyBidWYgLSBwLCAiXG4iKTsKIAl9CkBAIC0yMTAsOCArMTk0LDcgQEAKIAkJaWYgKHN0YXJ0KQogCQkJcmV0ID0gaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oJnN0YS0+c3RhLCB0aWQpOwogCQllbHNlCi0JCQlyZXQgPSBpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKCZzdGEtPnN0YSwgdGlkLAotCQkJCQkJCSAgIFdMQU5fQkFDS19SRUNJUElFTlQpOworCQkJcmV0ID0gaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbigmc3RhLT5zdGEsIHRpZCk7CiAJfSBlbHNlIHsKIAkJX19pZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0YSwgdGlkLCBXTEFOX0JBQ0tfUkVDSVBJRU5ULCAzKTsKIAkJcmV0ID0gMDsKQEAgLTMwNyw2ICsyOTAsMTMgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCNuYW1lLCAwNDAwLCBcCiAJCXN0YS0+ZGVidWdmcy5kaXIsIHN0YSwgJnN0YV8gIyNuYW1lIyMgX29wcyk7CiAKKyNkZWZpbmUgREVCVUdGU19BRERfQ09VTlRFUihuYW1lLCBmaWVsZCkJCQkJXAorCWlmIChzaXplb2Yoc3RhLT5maWVsZCkgPT0gc2l6ZW9mKHUzMikpCQkJCVwKKwkJZGVidWdmc19jcmVhdGVfdTMyKCNuYW1lLCAwNDAwLCBzdGEtPmRlYnVnZnMuZGlyLAlcCisJCQkodTMyICopICZzdGEtPmZpZWxkKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJZGVidWdmc19jcmVhdGVfdTY0KCNuYW1lLCAwNDAwLCBzdGEtPmRlYnVnZnMuZGlyLAlcCisJCQkodTY0ICopICZzdGEtPmZpZWxkKTsKIAogdm9pZCBpZWVlODAyMTFfc3RhX2RlYnVnZnNfYWRkKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewpAQCAtMzM5LDIwICszMjksMjEgQEAKIAlERUJVR0ZTX0FERChsYXN0X3NlcV9jdHJsKTsKIAlERUJVR0ZTX0FERChhZ2dfc3RhdHVzKTsKIAlERUJVR0ZTX0FERChkZXYpOwotCURFQlVHRlNfQUREKHJ4X3BhY2tldHMpOwotCURFQlVHRlNfQUREKHR4X3BhY2tldHMpOwotCURFQlVHRlNfQUREKHJ4X2J5dGVzKTsKLQlERUJVR0ZTX0FERCh0eF9ieXRlcyk7Ci0JREVCVUdGU19BREQocnhfZHVwbGljYXRlcyk7Ci0JREVCVUdGU19BREQocnhfZnJhZ21lbnRzKTsKLQlERUJVR0ZTX0FERChyeF9kcm9wcGVkKTsKLQlERUJVR0ZTX0FERCh0eF9mcmFnbWVudHMpOwotCURFQlVHRlNfQUREKHR4X2ZpbHRlcmVkKTsKLQlERUJVR0ZTX0FERCh0eF9yZXRyeV9mYWlsZWQpOwotCURFQlVHRlNfQUREKHR4X3JldHJ5X2NvdW50KTsKIAlERUJVR0ZTX0FERChsYXN0X3NpZ25hbCk7Ci0JREVCVUdGU19BREQod2VwX3dlYWtfaXZfY291bnQpOwogCURFQlVHRlNfQUREKGh0X2NhcGEpOworCisJREVCVUdGU19BRERfQ09VTlRFUihyeF9wYWNrZXRzLCByeF9wYWNrZXRzKTsKKwlERUJVR0ZTX0FERF9DT1VOVEVSKHR4X3BhY2tldHMsIHR4X3BhY2tldHMpOworCURFQlVHRlNfQUREX0NPVU5URVIocnhfYnl0ZXMsIHJ4X2J5dGVzKTsKKwlERUJVR0ZTX0FERF9DT1VOVEVSKHR4X2J5dGVzLCB0eF9ieXRlcyk7CisJREVCVUdGU19BRERfQ09VTlRFUihyeF9kdXBsaWNhdGVzLCBudW1fZHVwbGljYXRlcyk7CisJREVCVUdGU19BRERfQ09VTlRFUihyeF9mcmFnbWVudHMsIHJ4X2ZyYWdtZW50cyk7CisJREVCVUdGU19BRERfQ09VTlRFUihyeF9kcm9wcGVkLCByeF9kcm9wcGVkKTsKKwlERUJVR0ZTX0FERF9DT1VOVEVSKHR4X2ZyYWdtZW50cywgdHhfZnJhZ21lbnRzKTsKKwlERUJVR0ZTX0FERF9DT1VOVEVSKHR4X2ZpbHRlcmVkLCB0eF9maWx0ZXJlZF9jb3VudCk7CisJREVCVUdGU19BRERfQ09VTlRFUih0eF9yZXRyeV9mYWlsZWQsIHR4X3JldHJ5X2ZhaWxlZCk7CisJREVCVUdGU19BRERfQ09VTlRFUih0eF9yZXRyeV9jb3VudCwgdHhfcmV0cnlfY291bnQpOworCURFQlVHRlNfQUREX0NPVU5URVIod2VwX3dlYWtfaXZfY291bnQsIHdlcF93ZWFrX2l2X2NvdW50KTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc3RhX2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaCBiL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKaW5kZXggOWMxZGEwOC4uMTQxMjNkYyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaAorKysgYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwl0cmFjZV9kcnZfc3RhcnQobG9jYWwpOwogCWxvY2FsLT5zdGFydGVkID0gdHJ1ZTsKIAlzbXBfbWIoKTsKIAlyZXQgPSBsb2NhbC0+b3BzLT5zdGFydCgmbG9jYWwtPmh3KTsKLQl0cmFjZV9kcnZfc3RhcnQobG9jYWwsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjcsOCArMjgsOSBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKLQlsb2NhbC0+b3BzLT5zdG9wKCZsb2NhbC0+aHcpOwogCXRyYWNlX2Rydl9zdG9wKGxvY2FsKTsKKwlsb2NhbC0+b3BzLT5zdG9wKCZsb2NhbC0+aHcpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiAKIAkvKiBzeW5jIGF3YXkgYWxsIHdvcmsgb24gdGhlIHRhc2tsZXQgYmVmb3JlIGNsZWFyaW5nIHN0YXJ0ZWQgKi8KIAl0YXNrbGV0X2Rpc2FibGUoJmxvY2FsLT50YXNrbGV0KTsKQEAgLTQ2LDggKzQ4LDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwl0cmFjZV9kcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgdmlmX3RvX3NkYXRhKHZpZikpOwogCXJldCA9IGxvY2FsLT5vcHMtPmFkZF9pbnRlcmZhY2UoJmxvY2FsLT5odywgdmlmKTsKLQl0cmFjZV9kcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgdmlmX3RvX3NkYXRhKHZpZiksIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTYsOCArNTksOSBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKLQlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKCZsb2NhbC0+aHcsIHZpZik7CiAJdHJhY2VfZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHZpZl90b19zZGF0YSh2aWYpKTsKKwlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKCZsb2NhbC0+aHcsIHZpZik7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZHJ2X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgdTMyIGNoYW5nZWQpCkBAIC02Niw4ICs3MCw5IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X2NvbmZpZyhsb2NhbCwgY2hhbmdlZCk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+Y29uZmlnKCZsb2NhbC0+aHcsIGNoYW5nZWQpOwotCXRyYWNlX2Rydl9jb25maWcobG9jYWwsIGNoYW5nZWQsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzgsOSArODMsMTAgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X2Jzc19pbmZvX2NoYW5nZWQobG9jYWwsIHNkYXRhLCBpbmZvLCBjaGFuZ2VkKTsKIAlpZiAobG9jYWwtPm9wcy0+YnNzX2luZm9fY2hhbmdlZCkKIAkJbG9jYWwtPm9wcy0+YnNzX2luZm9fY2hhbmdlZCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgaW5mbywgY2hhbmdlZCk7Ci0JdHJhY2VfZHJ2X2Jzc19pbmZvX2NoYW5nZWQobG9jYWwsIHNkYXRhLCBpbmZvLCBjaGFuZ2VkKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHU2NCBkcnZfcHJlcGFyZV9tdWx0aWNhc3Qoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCkBAIC04OCwxMCArOTQsMTIgQEAKIHsKIAl1NjQgcmV0ID0gMDsKIAorCXRyYWNlX2Rydl9wcmVwYXJlX211bHRpY2FzdChsb2NhbCwgbWNfbGlzdC0+Y291bnQpOworCiAJaWYgKGxvY2FsLT5vcHMtPnByZXBhcmVfbXVsdGljYXN0KQogCQlyZXQgPSBsb2NhbC0+b3BzLT5wcmVwYXJlX211bHRpY2FzdCgmbG9jYWwtPmh3LCBtY19saXN0KTsKIAotCXRyYWNlX2Rydl9wcmVwYXJlX211bHRpY2FzdChsb2NhbCwgbWNfbGlzdC0+Y291bnQsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl91NjQobG9jYWwsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAzLDE5ICsxMTEsMjEgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCi0JbG9jYWwtPm9wcy0+Y29uZmlndXJlX2ZpbHRlcigmbG9jYWwtPmh3LCBjaGFuZ2VkX2ZsYWdzLCB0b3RhbF9mbGFncywKLQkJCQkgICAgIG11bHRpY2FzdCk7CiAJdHJhY2VfZHJ2X2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwsIGNoYW5nZWRfZmxhZ3MsIHRvdGFsX2ZsYWdzLAogCQkJCSAgIG11bHRpY2FzdCk7CisJbG9jYWwtPm9wcy0+Y29uZmlndXJlX2ZpbHRlcigmbG9jYWwtPmh3LCBjaGFuZ2VkX2ZsYWdzLCB0b3RhbF9mbGFncywKKwkJCQkgICAgIG11bHRpY2FzdCk7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZHJ2X3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBib29sIHNldCkKIHsKIAlpbnQgcmV0ID0gMDsKKwl0cmFjZV9kcnZfc2V0X3RpbShsb2NhbCwgc3RhLCBzZXQpOwogCWlmIChsb2NhbC0+b3BzLT5zZXRfdGltKQogCQlyZXQgPSBsb2NhbC0+b3BzLT5zZXRfdGltKCZsb2NhbC0+aHcsIHN0YSwgc2V0KTsKLQl0cmFjZV9kcnZfc2V0X3RpbShsb2NhbCwgc3RhLCBzZXQsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTI5LDggKzEzOSw5IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X3NldF9rZXkobG9jYWwsIGNtZCwgc2RhdGEsIHN0YSwga2V5KTsKIAlyZXQgPSBsb2NhbC0+b3BzLT5zZXRfa2V5KCZsb2NhbC0+aHcsIGNtZCwgJnNkYXRhLT52aWYsIHN0YSwga2V5KTsKLQl0cmFjZV9kcnZfc2V0X2tleShsb2NhbCwgY21kLCBzZGF0YSwgc3RhLCBrZXksIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ1LDEwICsxNTYsMTEgQEAKIAlpZiAoc3RhKQogCQlpc3RhID0gJnN0YS0+c3RhOwogCisJdHJhY2VfZHJ2X3VwZGF0ZV90a2lwX2tleShsb2NhbCwgc2RhdGEsIGNvbmYsIGlzdGEsIGl2MzIpOwogCWlmIChsb2NhbC0+b3BzLT51cGRhdGVfdGtpcF9rZXkpCiAJCWxvY2FsLT5vcHMtPnVwZGF0ZV90a2lwX2tleSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgY29uZiwKIAkJCQkJICAgIGlzdGEsIGl2MzIsIHBoYXNlMWtleSk7Ci0JdHJhY2VfZHJ2X3VwZGF0ZV90a2lwX2tleShsb2NhbCwgc2RhdGEsIGNvbmYsIGlzdGEsIGl2MzIpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRydl9od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLApAQCAtMTU5LDggKzE3MSw5IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X2h3X3NjYW4obG9jYWwsIHNkYXRhLCByZXEpOwogCXJldCA9IGxvY2FsLT5vcHMtPmh3X3NjYW4oJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIHJlcSk7Ci0JdHJhY2VfZHJ2X2h3X3NjYW4obG9jYWwsIHNkYXRhLCByZXEsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTY4LDE4ICsxODEsMjAgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X3N3X3NjYW5fc3RhcnQobG9jYWwpOwogCWlmIChsb2NhbC0+b3BzLT5zd19zY2FuX3N0YXJ0KQogCQlsb2NhbC0+b3BzLT5zd19zY2FuX3N0YXJ0KCZsb2NhbC0+aHcpOwotCXRyYWNlX2Rydl9zd19zY2FuX3N0YXJ0KGxvY2FsKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJbWlnaHRfc2xlZXAoKTsKIAorCXRyYWNlX2Rydl9zd19zY2FuX2NvbXBsZXRlKGxvY2FsKTsKIAlpZiAobG9jYWwtPm9wcy0+c3dfc2Nhbl9jb21wbGV0ZSkKIAkJbG9jYWwtPm9wcy0+c3dfc2Nhbl9jb21wbGV0ZSgmbG9jYWwtPmh3KTsKLQl0cmFjZV9kcnZfc3dfc2Nhbl9jb21wbGV0ZShsb2NhbCk7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZHJ2X2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKQEAgLTIxMSw5ICsyMjYsMTAgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwl0cmFjZV9kcnZfc2V0X3J0c190aHJlc2hvbGQobG9jYWwsIHZhbHVlKTsKIAlpZiAobG9jYWwtPm9wcy0+c2V0X3J0c190aHJlc2hvbGQpCiAJCXJldCA9IGxvY2FsLT5vcHMtPnNldF9ydHNfdGhyZXNob2xkKCZsb2NhbC0+aHcsIHZhbHVlKTsKLQl0cmFjZV9kcnZfc2V0X3J0c190aHJlc2hvbGQobG9jYWwsIHZhbHVlLCByZXQpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIyMywxMiArMjM5LDEzIEBACiAJaW50IHJldCA9IDA7CiAJbWlnaHRfc2xlZXAoKTsKIAorCXRyYWNlX2Rydl9zZXRfY292ZXJhZ2VfY2xhc3MobG9jYWwsIHZhbHVlKTsKIAlpZiAobG9jYWwtPm9wcy0+c2V0X2NvdmVyYWdlX2NsYXNzKQogCQlsb2NhbC0+b3BzLT5zZXRfY292ZXJhZ2VfY2xhc3MoJmxvY2FsLT5odywgdmFsdWUpOwogCWVsc2UKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAKLQl0cmFjZV9kcnZfc2V0X2NvdmVyYWdlX2NsYXNzKGxvY2FsLCB2YWx1ZSwgcmV0KTsKKwl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMzcsOSArMjU0LDEwIEBACiAJCQkJICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CisJdHJhY2VfZHJ2X3N0YV9ub3RpZnkobG9jYWwsIHNkYXRhLCBjbWQsIHN0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9ub3RpZnkpCiAJCWxvY2FsLT5vcHMtPnN0YV9ub3RpZnkoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGNtZCwgc3RhKTsKLQl0cmFjZV9kcnZfc3RhX25vdGlmeShsb2NhbCwgc2RhdGEsIGNtZCwgc3RhKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBkcnZfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKQEAgLTI1MCwxMyArMjY4LDExIEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X3N0YV9hZGQobG9jYWwsIHNkYXRhLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfYWRkKQogCQlyZXQgPSBsb2NhbC0+b3BzLT5zdGFfYWRkKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBzdGEpOwotCWVsc2UgaWYgKGxvY2FsLT5vcHMtPnN0YV9ub3RpZnkpCi0JCWxvY2FsLT5vcHMtPnN0YV9ub3RpZnkoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCi0JCQkJCVNUQV9OT1RJRllfQURELCBzdGEpOwogCi0JdHJhY2VfZHJ2X3N0YV9hZGQobG9jYWwsIHNkYXRhLCBzdGEsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjY3LDEzICsyODMsMTEgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X3N0YV9yZW1vdmUobG9jYWwsIHNkYXRhLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKQogCQlsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBzdGEpOwotCWVsc2UgaWYgKGxvY2FsLT5vcHMtPnN0YV9ub3RpZnkpCi0JCWxvY2FsLT5vcHMtPnN0YV9ub3RpZnkoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCi0JCQkJCVNUQV9OT1RJRllfUkVNT1ZFLCBzdGEpOwogCi0JdHJhY2VfZHJ2X3N0YV9yZW1vdmUobG9jYWwsIHNkYXRhLCBzdGEpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRydl9jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1MTYgcXVldWUsCkBAIC0yODMsOSArMjk3LDEwIEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X2NvbmZfdHgobG9jYWwsIHF1ZXVlLCBwYXJhbXMpOwogCWlmIChsb2NhbC0+b3BzLT5jb25mX3R4KQogCQlyZXQgPSBsb2NhbC0+b3BzLT5jb25mX3R4KCZsb2NhbC0+aHcsIHF1ZXVlLCBwYXJhbXMpOwotCXRyYWNlX2Rydl9jb25mX3R4KGxvY2FsLCBxdWV1ZSwgcGFyYW1zLCByZXQpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI5NSw5ICszMTAsMTAgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwl0cmFjZV9kcnZfZ2V0X3RzZihsb2NhbCk7CiAJaWYgKGxvY2FsLT5vcHMtPmdldF90c2YpCiAJCXJldCA9IGxvY2FsLT5vcHMtPmdldF90c2YoJmxvY2FsLT5odyk7Ci0JdHJhY2VfZHJ2X2dldF90c2YobG9jYWwsIHJldCk7CisJdHJhY2VfZHJ2X3JldHVybl91NjQobG9jYWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzA1LDE4ICszMjEsMjAgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X3NldF90c2YobG9jYWwsIHRzZik7CiAJaWYgKGxvY2FsLT5vcHMtPnNldF90c2YpCiAJCWxvY2FsLT5vcHMtPnNldF90c2YoJmxvY2FsLT5odywgdHNmKTsKLQl0cmFjZV9kcnZfc2V0X3RzZihsb2NhbCwgdHNmKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3Jlc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKIAltaWdodF9zbGVlcCgpOwogCisJdHJhY2VfZHJ2X3Jlc2V0X3RzZihsb2NhbCk7CiAJaWYgKGxvY2FsLT5vcHMtPnJlc2V0X3RzZikKIAkJbG9jYWwtPm9wcy0+cmVzZXRfdHNmKCZsb2NhbC0+aHcpOwotCXRyYWNlX2Rydl9yZXNldF90c2YobG9jYWwpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRydl90eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKQEAgLTMyNSw5ICszNDMsMTAgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwl0cmFjZV9kcnZfdHhfbGFzdF9iZWFjb24obG9jYWwpOwogCWlmIChsb2NhbC0+b3BzLT50eF9sYXN0X2JlYWNvbikKIAkJcmV0ID0gbG9jYWwtPm9wcy0+dHhfbGFzdF9iZWFjb24oJmxvY2FsLT5odyk7Ci0JdHJhY2VfZHJ2X3R4X2xhc3RfYmVhY29uKGxvY2FsLCByZXQpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMzOCwxMCArMzU3LDE3IEBACiAJCQkJICAgdTE2ICpzc24pCiB7CiAJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJbWlnaHRfc2xlZXAoKTsKKworCXRyYWNlX2Rydl9hbXBkdV9hY3Rpb24obG9jYWwsIHNkYXRhLCBhY3Rpb24sIHN0YSwgdGlkLCBzc24pOworCiAJaWYgKGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbikKIAkJcmV0ID0gbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBhY3Rpb24sCiAJCQkJCSAgICAgICBzdGEsIHRpZCwgc3NuKTsKLQl0cmFjZV9kcnZfYW1wZHVfYWN0aW9uKGxvY2FsLCBzZGF0YSwgYWN0aW9uLCBzdGEsIHRpZCwgc3NuLCByZXQpOworCisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNDksOSArMzc1LDE0IEBACiAJCQkJc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpCiB7CiAJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJdHJhY2VfZHJ2X2dldF9zdXJ2ZXkobG9jYWwsIGlkeCwgc3VydmV5KTsKKwogCWlmIChsb2NhbC0+b3BzLT5nZXRfc3VydmV5KQogCQlyZXQgPSBsb2NhbC0+b3BzLT5nZXRfc3VydmV5KCZsb2NhbC0+aHcsIGlkeCwgc3VydmV5KTsKLQkvKiB0cmFjZV9kcnZfZ2V0X3N1cnZleShsb2NhbCwgaWR4LCBzdXJ2ZXksIHJldCk7ICovCisKKwl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3MCw2ICs0MDEsNyBAQAogCXRyYWNlX2Rydl9mbHVzaChsb2NhbCwgZHJvcCk7CiAJaWYgKGxvY2FsLT5vcHMtPmZsdXNoKQogCQlsb2NhbC0+b3BzLT5mbHVzaCgmbG9jYWwtPmh3LCBkcm9wKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLApAQCAtMzc3LDkgKzQwOSw5IEBACiB7CiAJbWlnaHRfc2xlZXAoKTsKIAotCWxvY2FsLT5vcHMtPmNoYW5uZWxfc3dpdGNoKCZsb2NhbC0+aHcsIGNoX3N3aXRjaCk7Ci0KIAl0cmFjZV9kcnZfY2hhbm5lbF9zd2l0Y2gobG9jYWwsIGNoX3N3aXRjaCk7CisJbG9jYWwtPm9wcy0+Y2hhbm5lbF9zd2l0Y2goJmxvY2FsLT5odywgY2hfc3dpdGNoKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCiAjZW5kaWYgLyogX19NQUM4MDIxMV9EUklWRVJfT1BTICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmgKaW5kZXggNmE5YjIzNC4uNWQ1ZDJhOSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RyaXZlci10cmFjZS5oCisrKyBiL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaApAQCAtMzYsMjAgKzM2LDU4IEBACiAgKiBUcmFjaW5nIGZvciBkcml2ZXIgY2FsbGJhY2tzLgogICovCiAKLVRSQUNFX0VWRU5UKGRydl9zdGFydCwKK1RSQUNFX0VWRU5UKGRydl9yZXR1cm5fdm9pZCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCksCisJVFBfQVJHUyhsb2NhbCksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJKSwKKwlUUF9wcmludGsoTE9DQUxfUFJfRk1ULCBMT0NBTF9QUl9BUkcpCispOworCitUUkFDRV9FVkVOVChkcnZfcmV0dXJuX2ludCwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgaW50IHJldCksCi0KIAlUUF9BUkdTKGxvY2FsLCByZXQpLAotCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJTE9DQUxfRU5UUlkKIAkJX19maWVsZChpbnQsIHJldCkKIAkpLAotCiAJVFBfZmFzdF9hc3NpZ24oCiAJCUxPQ0FMX0FTU0lHTjsKIAkJX19lbnRyeS0+cmV0ID0gcmV0OwogCSksCisJVFBfcHJpbnRrKExPQ0FMX1BSX0ZNVCAiIC0gJWQiLCBMT0NBTF9QUl9BUkcsIF9fZW50cnktPnJldCkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9yZXR1cm5fdTY0LAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1NjQgcmV0KSwKKwlUUF9BUkdTKGxvY2FsLCByZXQpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCV9fZmllbGQodTY0LCByZXQpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlfX2VudHJ5LT5yZXQgPSByZXQ7CisJKSwKKwlUUF9wcmludGsoTE9DQUxfUFJfRk1UICIgLSAlbGx1IiwgTE9DQUxfUFJfQVJHLCBfX2VudHJ5LT5yZXQpCispOworCitUUkFDRV9FVkVOVChkcnZfc3RhcnQsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpLAorCisJVFBfQVJHUyhsb2NhbCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCSksCiAKIAlUUF9wcmludGsoCiAJCUxPQ0FMX1BSX0ZNVCwgTE9DQUxfUFJfQVJHCkBAIC03NiwyOCArMTE0LDI1IEBACiAKIFRSQUNFX0VWRU5UKGRydl9hZGRfaW50ZXJmYWNlLAogCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCSBpbnQgcmV0KSwKKwkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKSwKIAotCVRQX0FSR1MobG9jYWwsIHNkYXRhLCByZXQpLAorCVRQX0FSR1MobG9jYWwsIHNkYXRhKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCUxPQ0FMX0VOVFJZCiAJCVZJRl9FTlRSWQogCQlfX2FycmF5KGNoYXIsIGFkZHIsIDYpCi0JCV9fZmllbGQoaW50LCByZXQpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlMT0NBTF9BU1NJR047CiAJCVZJRl9BU1NJR047CiAJCW1lbWNweShfX2VudHJ5LT5hZGRyLCBzZGF0YS0+dmlmLmFkZHIsIDYpOwotCQlfX2VudHJ5LT5yZXQgPSByZXQ7CiAJKSwKIAogCVRQX3ByaW50aygKLQkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UICIgYWRkcjolcE0gcmV0OiVkIiwKLQkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5yZXQKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UICIgYWRkcjolcE0iLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPmFkZHIKIAkpCiApOwogCkBAIC0xMjYsMTUgKzE2MSwxMyBAQAogCiBUUkFDRV9FVkVOVChkcnZfY29uZmlnLAogCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkgdTMyIGNoYW5nZWQsCi0JCSBpbnQgcmV0KSwKKwkJIHUzMiBjaGFuZ2VkKSwKIAotCVRQX0FSR1MobG9jYWwsIGNoYW5nZWQsIHJldCksCisJVFBfQVJHUyhsb2NhbCwgY2hhbmdlZCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlMT0NBTF9FTlRSWQogCQlfX2ZpZWxkKHUzMiwgY2hhbmdlZCkKLQkJX19maWVsZChpbnQsIHJldCkKIAkJX19maWVsZCh1MzIsIGZsYWdzKQogCQlfX2ZpZWxkKGludCwgcG93ZXJfbGV2ZWwpCiAJCV9fZmllbGQoaW50LCBkeW5hbWljX3BzX3RpbWVvdXQpCkBAIC0xNTAsNyArMTgzLDYgQEAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJTE9DQUxfQVNTSUdOOwogCQlfX2VudHJ5LT5jaGFuZ2VkID0gY2hhbmdlZDsKLQkJX19lbnRyeS0+cmV0ID0gcmV0OwogCQlfX2VudHJ5LT5mbGFncyA9IGxvY2FsLT5ody5jb25mLmZsYWdzOwogCQlfX2VudHJ5LT5wb3dlcl9sZXZlbCA9IGxvY2FsLT5ody5jb25mLnBvd2VyX2xldmVsOwogCQlfX2VudHJ5LT5keW5hbWljX3BzX3RpbWVvdXQgPSBsb2NhbC0+aHcuY29uZi5keW5hbWljX3BzX3RpbWVvdXQ7CkBAIC0xNjQsOCArMTk2LDggQEAKIAkpLAogCiAJVFBfcHJpbnRrKAotCQlMT0NBTF9QUl9GTVQgIiBjaDolI3ggZnJlcTolZCByZXQ6JWQiLAotCQlMT0NBTF9QUl9BUkcsIF9fZW50cnktPmNoYW5nZWQsIF9fZW50cnktPmNlbnRlcl9mcmVxLCBfX2VudHJ5LT5yZXQKKwkJTE9DQUxfUFJfRk1UICIgY2g6JSN4IGZyZXE6JWQiLAorCQlMT0NBTF9QUl9BUkcsIF9fZW50cnktPmNoYW5nZWQsIF9fZW50cnktPmNlbnRlcl9mcmVxCiAJKQogKTsKIApAQCAtMjIwLDI2ICsyNTIsMjMgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGRydl9wcmVwYXJlX211bHRpY2FzdCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgaW50IG1jX2NvdW50LCB1NjQgcmV0KSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgaW50IG1jX2NvdW50KSwKIAotCVRQX0FSR1MobG9jYWwsIG1jX2NvdW50LCByZXQpLAorCVRQX0FSR1MobG9jYWwsIG1jX2NvdW50KSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCUxPQ0FMX0VOVFJZCiAJCV9fZmllbGQoaW50LCBtY19jb3VudCkKLQkJX19maWVsZCh1NjQsIHJldCkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCUxPQ0FMX0FTU0lHTjsKIAkJX19lbnRyeS0+bWNfY291bnQgPSBtY19jb3VudDsKLQkJX19lbnRyeS0+cmV0ID0gcmV0OwogCSksCiAKIAlUUF9wcmludGsoCi0JCUxPQ0FMX1BSX0ZNVCAiIHByZXBhcmUgbWMgKCVkKTogJWxseCIsCi0JCUxPQ0FMX1BSX0FSRywgX19lbnRyeS0+bWNfY291bnQsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnJldAorCQlMT0NBTF9QUl9GTVQgIiBwcmVwYXJlIG1jICglZCkiLAorCQlMT0NBTF9QUl9BUkcsIF9fZW50cnktPm1jX2NvdW50CiAJKQogKTsKIApAQCAtMjczLDI3ICszMDIsMjUgQEAKIAogVFJBQ0VfRVZFTlQoZHJ2X3NldF90aW0sCiAJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBib29sIHNldCwgaW50IHJldCksCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBib29sIHNldCksCiAKLQlUUF9BUkdTKGxvY2FsLCBzdGEsIHNldCwgcmV0KSwKKwlUUF9BUkdTKGxvY2FsLCBzdGEsIHNldCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlMT0NBTF9FTlRSWQogCQlTVEFfRU5UUlkKIAkJX19maWVsZChib29sLCBzZXQpCi0JCV9fZmllbGQoaW50LCByZXQpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlMT0NBTF9BU1NJR047CiAJCVNUQV9BU1NJR047CiAJCV9fZW50cnktPnNldCA9IHNldDsKLQkJX19lbnRyeS0+cmV0ID0gcmV0OwogCSksCiAKIAlUUF9wcmludGsoCi0JCUxPQ0FMX1BSX0ZNVCBTVEFfUFJfRk1UICIgc2V0OiVkIHJldDolZCIsCi0JCUxPQ0FMX1BSX0FSRywgU1RBX1BSX0ZNVCwgX19lbnRyeS0+c2V0LCBfX2VudHJ5LT5yZXQKKwkJTE9DQUxfUFJfRk1UIFNUQV9QUl9GTVQgIiBzZXQ6JWQiLAorCQlMT0NBTF9QUl9BUkcsIFNUQV9QUl9GTVQsIF9fZW50cnktPnNldAogCSkKICk7CiAKQEAgLTMwMSw5ICszMjgsOSBAQAogCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgZW51bSBzZXRfa2V5X2NtZCBjbWQsIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgaW50IHJldCksCisJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpLAogCi0JVFBfQVJHUyhsb2NhbCwgY21kLCBzZGF0YSwgc3RhLCBrZXksIHJldCksCisJVFBfQVJHUyhsb2NhbCwgY21kLCBzZGF0YSwgc3RhLCBrZXkpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJTE9DQUxfRU5UUlkKQEAgLTMxMyw3ICszNDAsNiBAQAogCQlfX2ZpZWxkKHU4LCBod19rZXlfaWR4KQogCQlfX2ZpZWxkKHU4LCBmbGFncykKIAkJX19maWVsZChzOCwga2V5aWR4KQotCQlfX2ZpZWxkKGludCwgcmV0KQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTMyNCwxMiArMzUwLDExIEBACiAJCV9fZW50cnktPmZsYWdzID0ga2V5LT5mbGFnczsKIAkJX19lbnRyeS0+a2V5aWR4ID0ga2V5LT5rZXlpZHg7CiAJCV9fZW50cnktPmh3X2tleV9pZHggPSBrZXktPmh3X2tleV9pZHg7Ci0JCV9fZW50cnktPnJldCA9IHJldDsKIAkpLAogCiAJVFBfcHJpbnRrKAotCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQgIFNUQV9QUl9GTVQgIiByZXQ6JWQiLAotCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIFNUQV9QUl9BUkcsIF9fZW50cnktPnJldAorCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQgIFNUQV9QUl9GTVQsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywgU1RBX1BSX0FSRwogCSkKICk7CiAKQEAgLTM2NCwyNSArMzg5LDIzIEBACiBUUkFDRV9FVkVOVChkcnZfaHdfc2NhbiwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxLCBpbnQgcmV0KSwKKwkJIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSksCiAKLQlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgcmVxLCByZXQpLAorCVRQX0FSR1MobG9jYWwsIHNkYXRhLCByZXEpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJTE9DQUxfRU5UUlkKIAkJVklGX0VOVFJZCi0JCV9fZmllbGQoaW50LCByZXQpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlMT0NBTF9BU1NJR047CiAJCVZJRl9BU1NJR047Ci0JCV9fZW50cnktPnJldCA9IHJldDsKIAkpLAogCiAJVFBfcHJpbnRrKAotCQlMT0NBTF9QUl9GTVQgVklGX1BSX0ZNVCAiIHJldDolZCIsCi0JCUxPQ0FMX1BSX0FSRyxWSUZfUFJfQVJHLCBfX2VudHJ5LT5yZXQKKwkJTE9DQUxfUFJfRk1UIFZJRl9QUl9GTVQsCisJCUxPQ0FMX1BSX0FSRyxWSUZfUFJfQVJHCiAJKQogKTsKIApAQCAtNDc5LDQ4ICs1MDIsNDQgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGRydl9zZXRfcnRzX3RocmVzaG9sZCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgdTMyIHZhbHVlLCBpbnQgcmV0KSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgdTMyIHZhbHVlKSwKIAotCVRQX0FSR1MobG9jYWwsIHZhbHVlLCByZXQpLAorCVRQX0FSR1MobG9jYWwsIHZhbHVlKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCUxPQ0FMX0VOVFJZCiAJCV9fZmllbGQodTMyLCB2YWx1ZSkKLQkJX19maWVsZChpbnQsIHJldCkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCUxPQ0FMX0FTU0lHTjsKLQkJX19lbnRyeS0+cmV0ID0gcmV0OwogCQlfX2VudHJ5LT52YWx1ZSA9IHZhbHVlOwogCSksCiAKIAlUUF9wcmludGsoCi0JCUxPQ0FMX1BSX0ZNVCAiIHZhbHVlOiVkIHJldDolZCIsCi0JCUxPQ0FMX1BSX0FSRywgX19lbnRyeS0+dmFsdWUsIF9fZW50cnktPnJldAorCQlMT0NBTF9QUl9GTVQgIiB2YWx1ZTolZCIsCisJCUxPQ0FMX1BSX0FSRywgX19lbnRyeS0+dmFsdWUKIAkpCiApOwogCiBUUkFDRV9FVkVOVChkcnZfc2V0X2NvdmVyYWdlX2NsYXNzLAotCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1OCB2YWx1ZSwgaW50IHJldCksCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHU4IHZhbHVlKSwKIAotCVRQX0FSR1MobG9jYWwsIHZhbHVlLCByZXQpLAorCVRQX0FSR1MobG9jYWwsIHZhbHVlKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCUxPQ0FMX0VOVFJZCiAJCV9fZmllbGQodTgsIHZhbHVlKQotCQlfX2ZpZWxkKGludCwgcmV0KQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJTE9DQUxfQVNTSUdOOwotCQlfX2VudHJ5LT5yZXQgPSByZXQ7CiAJCV9fZW50cnktPnZhbHVlID0gdmFsdWU7CiAJKSwKIAogCVRQX3ByaW50aygKLQkJTE9DQUxfUFJfRk1UICIgdmFsdWU6JWQgcmV0OiVkIiwKLQkJTE9DQUxfUFJfQVJHLCBfX2VudHJ5LT52YWx1ZSwgX19lbnRyeS0+cmV0CisJCUxPQ0FMX1BSX0ZNVCAiIHZhbHVlOiVkIiwKKwkJTE9DQUxfUFJfQVJHLCBfX2VudHJ5LT52YWx1ZQogCSkKICk7CiAKQEAgLTU1NSwyNyArNTc0LDI1IEBACiBUUkFDRV9FVkVOVChkcnZfc3RhX2FkZCwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IHJldCksCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKSwKIAotCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBzdGEsIHJldCksCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIHN0YSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlMT0NBTF9FTlRSWQogCQlWSUZfRU5UUlkKIAkJU1RBX0VOVFJZCi0JCV9fZmllbGQoaW50LCByZXQpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlMT0NBTF9BU1NJR047CiAJCVZJRl9BU1NJR047CiAJCVNUQV9BU1NJR047Ci0JCV9fZW50cnktPnJldCA9IHJldDsKIAkpLAogCiAJVFBfcHJpbnRrKAotCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQgIFNUQV9QUl9GTVQgIiByZXQ6JWQiLAotCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIFNUQV9QUl9BUkcsIF9fZW50cnktPnJldAorCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQgIFNUQV9QUl9GTVQsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywgU1RBX1BSX0FSRwogCSkKICk7CiAKQEAgLTYwNiwxMCArNjIzLDkgQEAKIAogVFJBQ0VfRVZFTlQoZHJ2X2NvbmZfdHgsCiAJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHUxNiBxdWV1ZSwKLQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMsCi0JCSBpbnQgcmV0KSwKKwkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpLAogCi0JVFBfQVJHUyhsb2NhbCwgcXVldWUsIHBhcmFtcywgcmV0KSwKKwlUUF9BUkdTKGxvY2FsLCBxdWV1ZSwgcGFyYW1zKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCUxPQ0FMX0VOVFJZCkBAIC02MTgsMTMgKzYzNCwxMSBAQAogCQlfX2ZpZWxkKHUxNiwgY3dfbWluKQogCQlfX2ZpZWxkKHUxNiwgY3dfbWF4KQogCQlfX2ZpZWxkKHU4LCBhaWZzKQotCQlfX2ZpZWxkKGludCwgcmV0KQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJTE9DQUxfQVNTSUdOOwogCQlfX2VudHJ5LT5xdWV1ZSA9IHF1ZXVlOwotCQlfX2VudHJ5LT5yZXQgPSByZXQ7CiAJCV9fZW50cnktPnR4b3AgPSBwYXJhbXMtPnR4b3A7CiAJCV9fZW50cnktPmN3X21heCA9IHBhcmFtcy0+Y3dfbWF4OwogCQlfX2VudHJ5LT5jd19taW4gPSBwYXJhbXMtPmN3X21pbjsKQEAgLTYzMiwyOSArNjQ2LDI3IEBACiAJKSwKIAogCVRQX3ByaW50aygKLQkJTE9DQUxfUFJfRk1UICIgcXVldWU6JWQgcmV0OiVkIiwKLQkJTE9DQUxfUFJfQVJHLCBfX2VudHJ5LT5xdWV1ZSwgX19lbnRyeS0+cmV0CisJCUxPQ0FMX1BSX0ZNVCAiIHF1ZXVlOiVkIiwKKwkJTE9DQUxfUFJfQVJHLCBfX2VudHJ5LT5xdWV1ZQogCSkKICk7CiAKIFRSQUNFX0VWRU5UKGRydl9nZXRfdHNmLAotCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1NjQgcmV0KSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCksCiAKLQlUUF9BUkdTKGxvY2FsLCByZXQpLAorCVRQX0FSR1MobG9jYWwpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJTE9DQUxfRU5UUlkKLQkJX19maWVsZCh1NjQsIHJldCkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCUxPQ0FMX0FTU0lHTjsKLQkJX19lbnRyeS0+cmV0ID0gcmV0OwogCSksCiAKIAlUUF9wcmludGsoCi0JCUxPQ0FMX1BSX0ZNVCAiIHJldDolbGx1IiwKLQkJTE9DQUxfUFJfQVJHLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnJldAorCQlMT0NBTF9QUl9GTVQsCisJCUxPQ0FMX1BSX0FSRwogCSkKICk7CiAKQEAgLTY5OCwyMyArNzEwLDIxIEBACiApOwogCiBUUkFDRV9FVkVOVChkcnZfdHhfbGFzdF9iZWFjb24sCi0JVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIGludCByZXQpLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKSwKIAotCVRQX0FSR1MobG9jYWwsIHJldCksCisJVFBfQVJHUyhsb2NhbCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlMT0NBTF9FTlRSWQotCQlfX2ZpZWxkKGludCwgcmV0KQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJTE9DQUxfQVNTSUdOOwotCQlfX2VudHJ5LT5yZXQgPSByZXQ7CiAJKSwKIAogCVRQX3ByaW50aygKLQkJTE9DQUxfUFJfRk1UICIgcmV0OiVkIiwKLQkJTE9DQUxfUFJfQVJHLCBfX2VudHJ5LT5yZXQKKwkJTE9DQUxfUFJfRk1ULAorCQlMT0NBTF9QUl9BUkcKIAkpCiApOwogCkBAIC03MjMsOSArNzMzLDkgQEAKIAkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAogCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwKLQkJIHUxNiAqc3NuLCBpbnQgcmV0KSwKKwkJIHUxNiAqc3NuKSwKIAotCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBhY3Rpb24sIHN0YSwgdGlkLCBzc24sIHJldCksCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIGFjdGlvbiwgc3RhLCB0aWQsIHNzbiksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlMT0NBTF9FTlRSWQpAQCAtNzMzLDcgKzc0Myw2IEBACiAJCV9fZmllbGQodTMyLCBhY3Rpb24pCiAJCV9fZmllbGQodTE2LCB0aWQpCiAJCV9fZmllbGQodTE2LCBzc24pCi0JCV9fZmllbGQoaW50LCByZXQpCiAJCVZJRl9FTlRSWQogCSksCiAKQEAgLTc0MSwxNSArNzUwLDM2IEBACiAJCUxPQ0FMX0FTU0lHTjsKIAkJVklGX0FTU0lHTjsKIAkJU1RBX0FTU0lHTjsKLQkJX19lbnRyeS0+cmV0ID0gcmV0OwogCQlfX2VudHJ5LT5hY3Rpb24gPSBhY3Rpb247CiAJCV9fZW50cnktPnRpZCA9IHRpZDsKIAkJX19lbnRyeS0+c3NuID0gc3NuID8gKnNzbiA6IDA7CiAJKSwKIAogCVRQX3ByaW50aygKLQkJTE9DQUxfUFJfRk1UIFZJRl9QUl9GTVQgU1RBX1BSX0ZNVCAiIGFjdGlvbjolZCB0aWQ6JWQgcmV0OiVkIiwKLQkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBTVEFfUFJfQVJHLCBfX2VudHJ5LT5hY3Rpb24sIF9fZW50cnktPnRpZCwgX19lbnRyeS0+cmV0CisJCUxPQ0FMX1BSX0ZNVCBWSUZfUFJfRk1UIFNUQV9QUl9GTVQgIiBhY3Rpb246JWQgdGlkOiVkIiwKKwkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBTVEFfUFJfQVJHLCBfX2VudHJ5LT5hY3Rpb24sIF9fZW50cnktPnRpZAorCSkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9nZXRfc3VydmV5LAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBpbnQgaWR4LAorCQkgc3RydWN0IHN1cnZleV9pbmZvICpzdXJ2ZXkpLAorCisJVFBfQVJHUyhsb2NhbCwgaWR4LCBzdXJ2ZXkpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJX19maWVsZChpbnQsIGlkeCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJX19lbnRyeS0+aWR4ID0gaWR4OworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAiIGlkeDolZCIsCisJCUxPQ0FMX1BSX0FSRywgX19lbnRyeS0+aWR4CiAJKQogKTsKIApAQCAtODUxLDI1ICs4ODEsMjMgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGFwaV9zdG9wX3R4X2JhX3Nlc3Npb24sCi0JVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2IGluaXRpYXRvciksCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCksCiAKLQlUUF9BUkdTKHN0YSwgdGlkLCBpbml0aWF0b3IpLAorCVRQX0FSR1Moc3RhLCB0aWQpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJU1RBX0VOVFJZCiAJCV9fZmllbGQodTE2LCB0aWQpCi0JCV9fZmllbGQodTE2LCBpbml0aWF0b3IpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlTVEFfQVNTSUdOOwogCQlfX2VudHJ5LT50aWQgPSB0aWQ7Ci0JCV9fZW50cnktPmluaXRpYXRvciA9IGluaXRpYXRvcjsKIAkpLAogCiAJVFBfcHJpbnRrKAotCQlTVEFfUFJfRk1UICIgdGlkOiVkIGluaXRpYXRvcjolZCIsCi0JCVNUQV9QUl9BUkcsIF9fZW50cnktPnRpZCwgX19lbnRyeS0+aW5pdGlhdG9yCisJCVNUQV9QUl9GTVQgIiB0aWQ6JWQiLAorCQlTVEFfUFJfQVJHLCBfX2VudHJ5LT50aWQKIAkpCiApOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaHQuYyBiL25ldC9tYWM4MDIxMS9odC5jCmluZGV4IDJhYjEwNmEuLjlkMTAxZmIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9odC5jCkBAIC02LDcgKzYsNyBAQAogICogQ29weXJpZ2h0IDIwMDUtMjAwNiwgRGV2aWNlc2NhcGUgU29mdHdhcmUsIEluYy4KICAqIENvcHlyaWdodCAyMDA2LTIwMDcJSmlyaSBCZW5jIDxqYmVuY0BzdXNlLmN6PgogICogQ29weXJpZ2h0IDIwMDcsIE1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgotICogQ29weXJpZ2h0IDIwMDctMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAsIEludGVsIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0yOSw3ICsyOSw3IEBACiAKIAltZW1zZXQoaHRfY2FwLCAwLCBzaXplb2YoKmh0X2NhcCkpOwogCi0JaWYgKCFodF9jYXBfaWUpCisJaWYgKCFodF9jYXBfaWUgfHwgIXNiYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkKQogCQlyZXR1cm47CiAKIAlodF9jYXAtPmh0X3N1cHBvcnRlZCA9IHRydWU7CkBAIC0xMDUsNiArMTA1LDggQEAKIHsKIAlpbnQgaTsKIAorCWNhbmNlbF93b3JrX3N5bmMoJnN0YS0+YW1wZHVfbWxtZS53b3JrKTsKKwogCWZvciAoaSA9IDA7IGkgPCAgU1RBX1RJRF9OVU07IGkrKykgewogCQlfX2llZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RhLCBpLCBXTEFOX0JBQ0tfSU5JVElBVE9SKTsKIAkJX19pZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0YSwgaSwgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKQEAgLTExMiw2ICsxMTQsNDMgQEAKIAl9CiB9CiAKK3ZvaWQgaWVlZTgwMjExX2JhX3Nlc3Npb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHN0YV9pbmZvLCBhbXBkdV9tbG1lLndvcmspOworCXN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eDsKKwlpbnQgdGlkOworCisJLyoKKwkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIG5ldyBzZXNzaW9ucyBzaG91bGQgYmUKKwkgKiBibG9ja2VkLCBhbmQgZXhpc3Rpbmcgc2Vzc2lvbnMgd2lsbCBiZSB0b3JuCisJICogZG93biBieSB0aGUgY29kZSB0aGF0IHNldCB0aGUgZmxhZywgc28gdGhpcworCSAqIG5lZWQgbm90IHJ1bi4KKwkgKi8KKwlpZiAodGVzdF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9CTE9DS19CQSkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOworCWZvciAodGlkID0gMDsgdGlkIDwgU1RBX1RJRF9OVU07IHRpZCsrKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQodGlkLCBzdGEtPmFtcGR1X21sbWUudGlkX3J4X3RpbWVyX2V4cGlyZWQpKQorCQkJX19faWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbigKKwkJCQlzdGEsIHRpZCwgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKKwkJCQlXTEFOX1JFQVNPTl9RU1RBX1RJTUVPVVQpOworCisJCXRpZF90eCA9IHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXTsKKwkJaWYgKCF0aWRfdHgpCisJCQljb250aW51ZTsKKworCQlpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKSkKKwkJCWllZWU4MDIxMV90eF9iYV9zZXNzaW9uX2hhbmRsZV9zdGFydChzdGEsIHRpZCk7CisJCWVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVE9QLAorCQkJCQkgICAgJnRpZF90eC0+c3RhdGUpKQorCQkJX19faWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdGEsIHRpZCwKKwkJCQkJCQlXTEFOX0JBQ0tfSU5JVElBVE9SKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKK30KKwogdm9pZCBpZWVlODAyMTFfc2VuZF9kZWxiYShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgY29uc3QgdTggKmRhLCB1MTYgdGlkLAogCQkJICB1MTYgaW5pdGlhdG9yLCB1MTYgcmVhc29uX2NvZGUpCkBAIC0xNzYsMTMgKzIxNSw4IEBACiAKIAlpZiAoaW5pdGlhdG9yID09IFdMQU5fQkFDS19JTklUSUFUT1IpCiAJCV9faWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbihzdGEsIHRpZCwgV0xBTl9CQUNLX0lOSVRJQVRPUiwgMCk7Ci0JZWxzZSB7IC8qIFdMQU5fQkFDS19SRUNJUElFTlQgKi8KLQkJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCQlpZiAoc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdICYgSFRfQUREQkFfUkVRVUVTVEVEX01TSykKLQkJCV9fX2llZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQsCi0JCQkJCQkJV0xBTl9CQUNLX1JFQ0lQSUVOVCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCX0KKwllbHNlCisJCV9faWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdGEsIHRpZCwgV0xBTl9CQUNLX1JFQ0lQSUVOVCk7CiB9CiAKIGludCBpZWVlODAyMTFfc2VuZF9zbXBzX2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IGIyY2MxZmQuLmM2OTE3ODAgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtNDMsNiArNDMsOCBAQAogewogCXUxNiBhdXRoX2FsZywgYXV0aF90cmFuc2FjdGlvbiwgc3RhdHVzX2NvZGU7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzZGF0YS0+dS5pYnNzLm10eCk7CisKIAlpZiAobGVuIDwgMjQgKyA2KQogCQlyZXR1cm47CiAKQEAgLTc4LDYgKzgwLDggQEAKIAl1MzIgYnNzX2NoYW5nZTsKIAl1OCBzdXBwX3JhdGVzW0lFRUU4MDIxMV9NQVhfU1VQUF9SQVRFU107CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpZmlic3MtPm10eCk7CisKIAkvKiBSZXNldCBvd24gVFNGIHRvIGFsbG93IHRpbWUgc3luY2hyb25pemF0aW9uIHdvcmsuICovCiAJZHJ2X3Jlc2V0X3RzZihsb2NhbCk7CiAKQEAgLTE3MiwxMSArMTc2LDEzIEBACiAJcmN1X2Fzc2lnbl9wb2ludGVyKGlmaWJzcy0+cHJlc3AsIHNrYik7CiAKIAlzZGF0YS0+dmlmLmJzc19jb25mLmJlYWNvbl9pbnQgPSBiZWFjb25faW50OworCXNkYXRhLT52aWYuYnNzX2NvbmYuYmFzaWNfcmF0ZXMgPSBiYXNpY19yYXRlczsKIAlic3NfY2hhbmdlID0gQlNTX0NIQU5HRURfQkVBQ09OX0lOVDsKIAlic3NfY2hhbmdlIHw9IGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzZGF0YSk7CiAJYnNzX2NoYW5nZSB8PSBCU1NfQ0hBTkdFRF9CU1NJRDsKIAlic3NfY2hhbmdlIHw9IEJTU19DSEFOR0VEX0JFQUNPTjsKIAlic3NfY2hhbmdlIHw9IEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEOworCWJzc19jaGFuZ2UgfD0gQlNTX0NIQU5HRURfQkFTSUNfUkFURVM7CiAJYnNzX2NoYW5nZSB8PSBCU1NfQ0hBTkdFRF9JQlNTOwogCXNkYXRhLT52aWYuYnNzX2NvbmYuaWJzc19qb2luZWQgPSB0cnVlOwogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBic3NfY2hhbmdlKTsKQEAgLTIwMyw2ICsyMDksOCBAQAogCWludCBpLCBqOwogCXUxNiBiZWFjb25faW50ID0gY2Jzcy0+YmVhY29uX2ludGVydmFsOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2RhdGEtPnUuaWJzcy5tdHgpOworCiAJaWYgKGJlYWNvbl9pbnQgPCAxMCkKIAkJYmVhY29uX2ludCA9IDEwOwogCkBAIC00NDcsNiArNDU1LDggQEAKIAlpbnQgYWN0aXZlID0gMDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNkYXRhLT51Lmlic3MubXR4KTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewpAQCAtNDcxLDYgKzQ4MSw4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzICppZmlic3MgPSAmc2RhdGEtPnUuaWJzczsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlmaWJzcy0+bXR4KTsKKwogCW1vZF90aW1lcigmaWZpYnNzLT50aW1lciwKIAkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBJRUVFODAyMTFfSUJTU19NRVJHRV9JTlRFUlZBTCkpOwogCkBAIC01MDMsNiArNTE1LDggQEAKIAl1MTYgY2FwYWJpbGl0eTsKIAlpbnQgaTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlmaWJzcy0+bXR4KTsKKwogCWlmIChpZmlic3MtPmZpeGVkX2Jzc2lkKSB7CiAJCW1lbWNweShic3NpZCwgaWZpYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwogCX0gZWxzZSB7CkBAIC01MjksNyArNTQzLDcgQEAKIAkJc2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOwogCiAJX19pZWVlODAyMTFfc3RhX2pvaW5faWJzcyhzZGF0YSwgYnNzaWQsIHNkYXRhLT52aWYuYnNzX2NvbmYuYmVhY29uX2ludCwKLQkJCQkgIGlmaWJzcy0+Y2hhbm5lbCwgMywgLyogZmlyc3QgdHdvIGFyZSBiYXNpYyAqLworCQkJCSAgaWZpYnNzLT5jaGFubmVsLCBpZmlic3MtPmJhc2ljX3JhdGVzLAogCQkJCSAgY2FwYWJpbGl0eSwgMCk7CiB9CiAKQEAgLTU0Nyw2ICs1NjEsOCBAQAogCWludCBhY3RpdmVfaWJzczsKIAl1MTYgY2FwYWJpbGl0eTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlmaWJzcy0+bXR4KTsKKwogCWFjdGl2ZV9pYnNzID0gaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzZGF0YSk7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YV9maW5kX2lic3MgKGFjdGl2ZV9pYnNzPSVkKVxuIiwKQEAgLTYzNSw2ICs2NTEsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqcmVzcDsKIAl1OCAqcG9zLCAqZW5kOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWZpYnNzLT5tdHgpOworCiAJaWYgKGlmaWJzcy0+c3RhdGUgIT0gSUVFRTgwMjExX0lCU1NfTUxNRV9KT0lORUQgfHwKIAkgICAgbGVuIDwgMjQgKyAyIHx8ICFpZmlic3MtPnByZXNwKQogCQlyZXR1cm47CkBAIC03MjcsOCArNzQ1LDggQEAKIAlpZWVlODAyMTFfcnhfYnNzX2luZm8oc2RhdGEsIG1nbXQsIGxlbiwgcnhfc3RhdHVzLCAmZWxlbXMsIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfaWJzc19yeF9xdWV1ZWRfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordm9pZCBpZWVlODAyMTFfaWJzc19yeF9xdWV1ZWRfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwpAQCAtNzM4LDYgKzc1Niw4IEBACiAJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwogCWZjID0gbGUxNl90b19jcHUobWdtdC0+ZnJhbWVfY29udHJvbCk7CiAKKwltdXRleF9sb2NrKCZzZGF0YS0+dS5pYnNzLm10eCk7CisKIAlzd2l0Y2ggKGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpIHsKIAljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CiAJCWllZWU4MDIxMV9yeF9tZ210X3Byb2JlX3JlcShzZGF0YSwgbWdtdCwgc2tiLT5sZW4pOwpAQCAtNzU1LDM1ICs3NzUsMjIgQEAKIAkJYnJlYWs7CiAJfQogCi0Ja2ZyZWVfc2tiKHNrYik7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+dS5pYnNzLm10eCk7CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9pYnNzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQordm9pZCBpZWVlODAyMTFfaWJzc193b3JrKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuaWJzcy53b3JrKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgKmlmaWJzczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaWZfaWJzcyAqaWZpYnNzID0gJnNkYXRhLT51Lmlic3M7CiAKLQlpZiAoV0FSTl9PTihsb2NhbC0+c3VzcGVuZGVkKSkKLQkJcmV0dXJuOworCW11dGV4X2xvY2soJmlmaWJzcy0+bXR4KTsKIAotCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQotCQlyZXR1cm47Ci0KLQlpZiAobG9jYWwtPnNjYW5uaW5nKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTihzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpKQotCQlyZXR1cm47Ci0JaWZpYnNzID0gJnNkYXRhLT51Lmlic3M7Ci0KLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZpZmlic3MtPnNrYl9xdWV1ZSkpKQotCQlpZWVlODAyMTFfaWJzc19yeF9xdWV1ZWRfbWdtdChzZGF0YSwgc2tiKTsKLQotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KElFRUU4MDIxMV9JQlNTX1JFUV9SVU4sICZpZmlic3MtPnJlcXVlc3QpKQotCQlyZXR1cm47CisJLyoKKwkgKiBXb3JrIGNvdWxkIGJlIHNjaGVkdWxlZCBhZnRlciBzY2FuIG9yIHNpbWlsYXIKKwkgKiB3aGVuIHdlIGFyZW4ndCBldmVuIGpvaW5lZCAob3IgdHJ5aW5nKSB3aXRoIGEKKwkgKiBuZXR3b3JrLgorCSAqLworCWlmICghaWZpYnNzLT5zc2lkX2xlbikKKwkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKGlmaWJzcy0+c3RhdGUpIHsKIAljYXNlIElFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNIOgpAQCAtNzk2LDYgKzgwMyw5IEBACiAJCVdBUk5fT04oMSk7CiAJCWJyZWFrOwogCX0KKworIG91dDoKKwltdXRleF91bmxvY2soJmlmaWJzcy0+bXR4KTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2lic3NfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtODEwLDggKzgyMCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzZXRfYml0KElFRUU4MDIxMV9JQlNTX1JFUV9SVU4sICZpZmlic3MtPnJlcXVlc3QpOwotCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZpZmlic3MtPndvcmspOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTgxOSw3ICs4MjgsNiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaWZfaWJzcyAqaWZpYnNzID0gJnNkYXRhLT51Lmlic3M7CiAKLQljYW5jZWxfd29ya19zeW5jKCZpZmlic3MtPndvcmspOwogCWlmIChkZWxfdGltZXJfc3luYygmaWZpYnNzLT50aW1lcikpCiAJCWlmaWJzcy0+dGltZXJfcnVubmluZyA9IHRydWU7CiB9CkBAIC04MzksMTAgKzg0Nyw5IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzICppZmlic3MgPSAmc2RhdGEtPnUuaWJzczsKIAotCUlOSVRfV09SSygmaWZpYnNzLT53b3JrLCBpZWVlODAyMTFfaWJzc193b3JrKTsKIAlzZXR1cF90aW1lcigmaWZpYnNzLT50aW1lciwgaWVlZTgwMjExX2lic3NfdGltZXIsCiAJCSAgICAodW5zaWduZWQgbG9uZykgc2RhdGEpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmlmaWJzcy0+c2tiX3F1ZXVlKTsKKwltdXRleF9pbml0KCZpZmlic3MtPm10eCk7CiB9CiAKIC8qIHNjYW4gZmluaXNoZWQgbm90aWZpY2F0aW9uICovCkBAIC04NTYsNDUgKzg2MywyOCBAQAogCQkJY29udGludWU7CiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCQljb250aW51ZTsKLQkJaWYgKCFzZGF0YS0+dS5pYnNzLnNzaWRfbGVuKQotCQkJY29udGludWU7CiAJCXNkYXRhLT51Lmlic3MubGFzdF9zY2FuX2NvbXBsZXRlZCA9IGppZmZpZXM7Ci0JCW1vZF90aW1lcigmc2RhdGEtPnUuaWJzcy50aW1lciwgMCk7CisJCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiAJfQogCW11dGV4X3VubG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOwogfQogCi1pZWVlODAyMTFfcnhfcmVzdWx0Ci1pZWVlODAyMTFfaWJzc19yeF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1MTYgZmM7Ci0KLQlpZiAoc2tiLT5sZW4gPCAyNCkKLQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLQotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlmYyA9IGxlMTZfdG9fY3B1KG1nbXQtPmZyYW1lX2NvbnRyb2wpOwotCi0Jc3dpdGNoIChmYyAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUDoKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9CRUFDT046Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6Ci0JCXNrYl9xdWV1ZV90YWlsKCZzZGF0YS0+dS5pYnNzLnNrYl9xdWV1ZSwgc2tiKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT51Lmlic3Mud29yayk7Ci0JCXJldHVybiBSWF9RVUVVRUQ7Ci0JfQotCi0JcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLX0KLQogaW50IGllZWU4MDIxMV9pYnNzX2pvaW4oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQlzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJc2tiID0gZGV2X2FsbG9jX3NrYihzZGF0YS0+bG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsKKwkJCSAgICAzNiAvKiBiaXRyYXRlcyAqLyArCisJCQkgICAgMzQgLyogU1NJRCAqLyArCisJCQkgICAgMyAgLyogRFMgcGFyYW1zICovICsKKwkJCSAgICA0ICAvKiBJQlNTIHBhcmFtcyAqLyArCisJCQkgICAgcGFyYW1zLT5pZV9sZW4pOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2xvY2soJnNkYXRhLT51Lmlic3MubXR4KTsKKwogCWlmIChwYXJhbXMtPmJzc2lkKSB7CiAJCW1lbWNweShzZGF0YS0+dS5pYnNzLmJzc2lkLCBwYXJhbXMtPmJzc2lkLCBFVEhfQUxFTik7CiAJCXNkYXRhLT51Lmlic3MuZml4ZWRfYnNzaWQgPSB0cnVlOwpAQCAtOTAyLDYgKzg5Miw3IEBACiAJCXNkYXRhLT51Lmlic3MuZml4ZWRfYnNzaWQgPSBmYWxzZTsKIAogCXNkYXRhLT51Lmlic3MucHJpdmFjeSA9IHBhcmFtcy0+cHJpdmFjeTsKKwlzZGF0YS0+dS5pYnNzLmJhc2ljX3JhdGVzID0gcGFyYW1zLT5iYXNpY19yYXRlczsKIAogCXNkYXRhLT52aWYuYnNzX2NvbmYuYmVhY29uX2ludCA9IHBhcmFtcy0+YmVhY29uX2ludGVydmFsOwogCkBAIC05MjIsMzQgKzkxMywxOCBAQAogCQkJc2RhdGEtPnUuaWJzcy5pZV9sZW4gPSBwYXJhbXMtPmllX2xlbjsKIAl9CiAKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNkYXRhLT5sb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKwotCQkJICAgIDM2IC8qIGJpdHJhdGVzICovICsKLQkJCSAgICAzNCAvKiBTU0lEICovICsKLQkJCSAgICAzICAvKiBEUyBwYXJhbXMgKi8gKwotCQkJICAgIDQgIC8qIElCU1MgcGFyYW1zICovICsKLQkJCSAgICBwYXJhbXMtPmllX2xlbik7Ci0JaWYgKCFza2IpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJc2RhdGEtPnUuaWJzcy5za2IgPSBza2I7CiAJc2RhdGEtPnUuaWJzcy5zdGF0ZSA9IElFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNIOwogCXNkYXRhLT51Lmlic3MuaWJzc19qb2luX3JlcSA9IGppZmZpZXM7CiAKIAltZW1jcHkoc2RhdGEtPnUuaWJzcy5zc2lkLCBwYXJhbXMtPnNzaWQsIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pOwotCi0JLyoKLQkgKiBUaGUgc3NpZF9sZW4gc2V0dGluZyBiZWxvdyBpcyB1c2VkIHRvIHNlZSB3aGV0aGVyCi0JICogd2UgYXJlIGFjdGl2ZSwgYW5kIHdlIG5lZWQgYWxsIG90aGVyIHNldHRpbmdzCi0JICogYmVmb3JlIHRoYXQgbWF5IGdldCB2aXNpYmxlLgotCSAqLwotCW1iKCk7Ci0KIAlzZGF0YS0+dS5pYnNzLnNzaWRfbGVuID0gcGFyYW1zLT5zc2lkX2xlbjsKIAogCWllZWU4MDIxMV9yZWNhbGNfaWRsZShzZGF0YS0+bG9jYWwpOwogCi0Jc2V0X2JpdChJRUVFODAyMTFfSUJTU19SRVFfUlVOLCAmc2RhdGEtPnUuaWJzcy5yZXF1ZXN0KTsKLQlpZWVlODAyMTFfcXVldWVfd29yaygmc2RhdGEtPmxvY2FsLT5odywgJnNkYXRhLT51Lmlic3Mud29yayk7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJnNkYXRhLT5sb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CisKKwltdXRleF91bmxvY2soJnNkYXRhLT51Lmlic3MubXR4KTsKIAogCXJldHVybiAwOwogfQpAQCAtOTU3LDExICs5MzIsMzMgQEAKIGludCBpZWVlODAyMTFfaWJzc19sZWF2ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaWZfaWJzcyAqaWZpYnNzID0gJnNkYXRhLT51Lmlic3M7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqY2JzczsKKwl1MTYgY2FwYWJpbGl0eTsKKwlpbnQgYWN0aXZlX2lic3M7CiAKLQlkZWxfdGltZXJfc3luYygmc2RhdGEtPnUuaWJzcy50aW1lcik7Ci0JY2xlYXJfYml0KElFRUU4MDIxMV9JQlNTX1JFUV9SVU4sICZzZGF0YS0+dS5pYnNzLnJlcXVlc3QpOwotCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT51Lmlic3Mud29yayk7Ci0JY2xlYXJfYml0KElFRUU4MDIxMV9JQlNTX1JFUV9SVU4sICZzZGF0YS0+dS5pYnNzLnJlcXVlc3QpOworCW11dGV4X2xvY2soJnNkYXRhLT51Lmlic3MubXR4KTsKKworCWFjdGl2ZV9pYnNzID0gaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzZGF0YSk7CisKKwlpZiAoIWFjdGl2ZV9pYnNzICYmICFpc196ZXJvX2V0aGVyX2FkZHIoaWZpYnNzLT5ic3NpZCkpIHsKKwkJY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCisJCWlmIChpZmlic3MtPnByaXZhY3kpCisJCQljYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOworCisJCWNic3MgPSBjZmc4MDIxMV9nZXRfYnNzKGxvY2FsLT5ody53aXBoeSwgaWZpYnNzLT5jaGFubmVsLAorCQkJCQlpZmlic3MtPmJzc2lkLCBpZmlic3MtPnNzaWQsCisJCQkJCWlmaWJzcy0+c3NpZF9sZW4sIFdMQU5fQ0FQQUJJTElUWV9JQlNTIHwKKwkJCQkJV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1ksCisJCQkJCWNhcGFiaWxpdHkpOworCisJCWlmIChjYnNzKSB7CisJCQljZmc4MDIxMV91bmxpbmtfYnNzKGxvY2FsLT5ody53aXBoeSwgY2Jzcyk7CisJCQljZmc4MDIxMV9wdXRfYnNzKGNic3MpOworCQl9CisJfQogCiAJc3RhX2luZm9fZmx1c2goc2RhdGEtPmxvY2FsLCBzZGF0YSk7CiAKQEAgLTk3NSwxMCArOTcyLDE0IEBACiAJc3luY2hyb25pemVfcmN1KCk7CiAJa2ZyZWVfc2tiKHNrYik7CiAKLQlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT51Lmlic3Muc2tiX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT5za2JfcXVldWUpOwogCW1lbXNldChzZGF0YS0+dS5pYnNzLmJzc2lkLCAwLCBFVEhfQUxFTik7CiAJc2RhdGEtPnUuaWJzcy5zc2lkX2xlbiA9IDA7CiAKKwlkZWxfdGltZXJfc3luYygmc2RhdGEtPnUuaWJzcy50aW1lcik7CisKKwltdXRleF91bmxvY2soJnNkYXRhLT51Lmlic3MubXR4KTsKKwogCWllZWU4MDIxMV9yZWNhbGNfaWRsZShzZGF0YS0+bG9jYWwpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IDFhOWUyZGEuLjY1ZTBlZDYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC0yMzgsNiArMjM4LDcgQEAKIAlJRUVFODAyMTFfV09SS19BQk9SVCwKIAlJRUVFODAyMTFfV09SS19ESVJFQ1RfUFJPQkUsCiAJSUVFRTgwMjExX1dPUktfQVVUSCwKKwlJRUVFODAyMTFfV09SS19BU1NPQ19CRUFDT05fV0FJVCwKIAlJRUVFODAyMTFfV09SS19BU1NPQywKIAlJRUVFODAyMTFfV09SS19SRU1BSU5fT05fQ0hBTk5FTCwKIH07CkBAIC0zMjUsNyArMzI2LDYgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBjb25uX21vbl90aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBiY25fbW9uX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IGNoc3dpdGNoX3RpbWVyOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBtb25pdG9yX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IGNoc3dpdGNoX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IGJlYWNvbl9jb25uZWN0aW9uX2xvc3Nfd29yazsKQEAgLTM0MCw4ICszNDAsNiBAQAogCiAJdTE2IGFpZDsKIAotCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOwotCiAJdW5zaWduZWQgbG9uZyB0aW1lcnNfcnVubmluZzsgLyogdXNlZCBmb3IgcXVpZXNjZS9yZXN0YXJ0ICovCiAJYm9vbCBwb3dlcnNhdmU7IC8qIHBvd2Vyc2F2ZSByZXF1ZXN0ZWQgZm9yIHRoaXMgaWZhY2UgKi8KIAllbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgcmVxX3NtcHMsIC8qIHJlcXVlc3RlZCBzbXBzIG1vZGUgKi8KQEAgLTM4MCwxOSArMzc4LDE1IEBACiAJaW50IGxhc3RfY3FtX2V2ZW50X3NpZ25hbDsKIH07CiAKLWVudW0gaWVlZTgwMjExX2lic3NfcmVxdWVzdCB7Ci0JSUVFRTgwMjExX0lCU1NfUkVRX1JVTgk9IDAsCi19OwotCiBzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgewogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JfcXVldWU7CisJc3RydWN0IG11dGV4IG10eDsKIAotCXVuc2lnbmVkIGxvbmcgcmVxdWVzdDsKIAl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbl9jb21wbGV0ZWQ7CiAKKwl1MzIgYmFzaWNfcmF0ZXM7CisKIAlib29sIHRpbWVyX3J1bm5pbmc7CiAKIAlib29sIGZpeGVkX2Jzc2lkOwpAQCAtNDE2LDExICs0MTAsOSBAQAogfTsKIAogc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBob3VzZWtlZXBpbmdfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgbWVzaF9wYXRoX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IG1lc2hfcGF0aF9yb290X3RpbWVyOwotCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOwogCiAJdW5zaWduZWQgbG9uZyB0aW1lcnNfcnVubmluZzsKIApAQCAtNTE3LDYgKzUwOSwxMSBAQAogCiAJdTE2IHNlcXVlbmNlX251bWJlcjsKIAorCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOworCisJYm9vbCBhcnBfZmlsdGVyX3N0YXRlOworCiAJLyoKIAkgKiBBUCB0aGlzIGJlbG9uZ3MgdG86IHNlbGYgaW4gQVAgbW9kZSBhbmQKIAkgKiBjb3JyZXNwb25kaW5nIEFQIGluIFZMQU4gbW9kZSwgTlVMTCBmb3IKQEAgLTU2OSwxMSArNTY2LDE1IEBACiAjZW5kaWYKIH0KIAorZW51bSBzZGF0YV9xdWV1ZV90eXBlIHsKKwlJRUVFODAyMTFfU0RBVEFfUVVFVUVfVFlQRV9GUkFNRQk9IDAsCisJSUVFRTgwMjExX1NEQVRBX1FVRVVFX0FHR19TVEFSVAkJPSAxLAorCUlFRUU4MDIxMV9TREFUQV9RVUVVRV9BR0dfU1RPUAkJPSAyLAorfTsKKwogZW51bSB7CiAJSUVFRTgwMjExX1JYX01TRwk9IDEsCiAJSUVFRTgwMjExX1RYX1NUQVRVU19NU0cJPSAyLAotCUlFRUU4MDIxMV9ERUxCQV9NU0cJPSAzLAotCUlFRUU4MDIxMV9BRERCQV9NU0cJPSA0LAogfTsKIAogZW51bSBxdWV1ZV9zdG9wX3JlYXNvbiB7CkBAIC03MjQsMTMgKzcyNSw3IEBACiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZW5kaW5nW0lFRUU4MDIxMV9NQVhfUVVFVUVTXTsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHhfcGVuZGluZ190YXNrbGV0OwogCi0JLyoKLQkgKiBUaGlzIGxvY2sgaXMgdXNlZCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgQS1NUERVCi0JICogc2Vzc2lvbiBzdGFydC9zdG9wIHByb2Nlc3NpbmcsIHRoaXMgdGh1cyBhbHNvCi0JICogc3luY2hyb25pc2VzIHRoZSAtPmFtcGR1X2FjdGlvbigpIGNhbGxiYWNrIHRvCi0JICogZHJpdmVycyBhbmQgbGltaXRzIGl0IHRvIG9uZSBhdCBhIHRpbWUuCi0JICovCi0Jc3BpbmxvY2tfdCBhbXBkdV9sb2NrOworCWF0b21pY190IGFnZ19xdWV1ZV9zdG9wW0lFRUU4MDIxMV9NQVhfUVVFVUVTXTsKIAogCS8qIG51bWJlciBvZiBpbnRlcmZhY2VzIHdpdGggY29ycmVzcG9uZGluZyBJRkZfIGZsYWdzICovCiAJYXRvbWljX3QgaWZmX2FsbG11bHRpcywgaWZmX3Byb21pc2NzOwpAQCAtNzQ2LDEwICs3NDEsMTAgQEAKIAlzdHJ1Y3QgbXV0ZXggaWZsaXN0X210eDsKIAogCS8qCi0JICogS2V5IGxvY2ssIHByb3RlY3RzIHNkYXRhJ3Mga2V5X2xpc3QgYW5kIHN0YV9pbmZvJ3MKKwkgKiBLZXkgbXV0ZXgsIHByb3RlY3RzIHNkYXRhJ3Mga2V5X2xpc3QgYW5kIHN0YV9pbmZvJ3MKIAkgKiBrZXkgcG9pbnRlcnMgKHdyaXRlIGFjY2VzcywgdGhleSdyZSBSQ1UuKQogCSAqLwotCXNwaW5sb2NrX3Qga2V5X2xvY2s7CisJc3RydWN0IG11dGV4IGtleV9tdHg7CiAKIAogCS8qIFNjYW5uaW5nIGFuZCBCU1MgbGlzdCAqLwpAQCAtODUxLDYgKzg0NiwxNSBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBkeW5hbWljX3BzX2Rpc2FibGVfd29yazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBkeW5hbWljX3BzX3RpbWVyOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBuZXR3b3JrX2xhdGVuY3lfbm90aWZpZXI7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlmYV9ub3RpZmllcjsKKworCS8qCisJICogVGhlIGR5bmFtaWMgcHMgdGltZW91dCBjb25maWd1cmVkIGZyb20gdXNlciBzcGFjZSB2aWEgV0VYVCAtCisJICogdGhpcyB3aWxsIG92ZXJyaWRlIHdoYXRldmVyIGNob3NlbiBieSBtYWM4MDIxMSBpbnRlcm5hbGx5LgorCSAqLworCWludCBkeW5hbWljX3BzX2ZvcmNlZF90aW1lb3V0OworCWludCBkeW5hbWljX3BzX3VzZXJfdGltZW91dDsKKwlib29sIGRpc2FibGVfZHluYW1pY19wczsKIAogCWludCB1c2VyX3Bvd2VyX2xldmVsOyAvKiBpbiBkQm0gKi8KIAlpbnQgcG93ZXJfY29uc3RyX2xldmVsOyAvKiBpbiBkQm0gKi8KQEAgLTg3NCw5ICs4NzgsOCBAQAogCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOwogfQogCi0vKiB0aGlzIHN0cnVjdCByZXByZXNlbnRzIDgwMi4xMW4ncyBSQS9USUQgY29tYmluYXRpb24gYWxvbmcgd2l0aCBvdXIgdmlmICovCisvKiB0aGlzIHN0cnVjdCByZXByZXNlbnRzIDgwMi4xMW4ncyBSQS9USUQgY29tYmluYXRpb24gKi8KIHN0cnVjdCBpZWVlODAyMTFfcmFfdGlkIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwogCXU4IHJhW0VUSF9BTEVOXTsKIAl1MTYgdGlkOwogfTsKQEAgLTk4NSwyOSArOTg4LDI1IEBACiBpbnQgaWVlZTgwMjExX21nZF9kaXNhc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgIHN0cnVjdCBjZmc4MDIxMV9kaXNhc3NvY19yZXF1ZXN0ICpyZXEsCiAJCQkgICB2b2lkICpjb29raWUpOwotaW50IGllZWU4MDIxMV9tZ2RfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKLQkJCSBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKLQkJCSBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCB1NjQgKmNvb2tpZSk7Ci1pZWVlODAyMTFfcnhfcmVzdWx0IGllZWU4MDIxMV9zdGFfcnhfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgaWVlZTgwMjExX3NlbmRfcHNwb2xsKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfcmVjYWxjX3BzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzMzIgbGF0ZW5jeSk7CiBpbnQgaWVlZTgwMjExX21heF9uZXR3b3JrX2xhdGVuY3koc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSwgdm9pZCAqZHVtbXkpOworaW50IGllZWU4MDIxMV9zZXRfYXJwX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIGllZWU4MDIxMV9zdGFfcHJvY2Vzc19jaGFuc3dpdGNoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd19pZSAqc3dfZWxlbSwKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzLAogCQkJCSAgICAgIHU2NCB0aW1lc3RhbXApOwogdm9pZCBpZWVlODAyMTFfc3RhX3F1aWVzY2Uoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfc3RhX3Jlc3RhcnQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwordm9pZCBpZWVlODAyMTFfc3RhX3dvcmsoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwordm9pZCBpZWVlODAyMTFfc3RhX3J4X3F1ZXVlZF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qIElCU1MgY29kZSAqLwogdm9pZCBpZWVlODAyMTFfaWJzc19ub3RpZnlfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogdm9pZCBpZWVlODAyMTFfaWJzc19zZXR1cF9zZGF0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Ci1pZWVlODAyMTFfcnhfcmVzdWx0Ci1pZWVlODAyMTFfaWJzc19yeF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0cnVjdCBzdGFfaW5mbyAqaWVlZTgwMjExX2lic3NfYWRkX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkJdTggKmJzc2lkLCB1OCAqYWRkciwgdTMyIHN1cHBfcmF0ZXMsCiAJCQkJCWdmcF90IGdmcCk7CkBAIC0xMDE2LDYgKzEwMTUsMTQgQEAKIGludCBpZWVlODAyMTFfaWJzc19sZWF2ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIGllZWU4MDIxMV9pYnNzX3F1aWVzY2Uoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfaWJzc19yZXN0YXJ0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK3ZvaWQgaWVlZTgwMjExX2lic3Nfd29yayhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIGllZWU4MDIxMV9pYnNzX3J4X3F1ZXVlZF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOworCisvKiBtZXNoIGNvZGUgKi8KK3ZvaWQgaWVlZTgwMjExX21lc2hfd29yayhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIGllZWU4MDIxMV9tZXNoX3J4X3F1ZXVlZF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOwogCiAvKiBzY2FuL0JTUyBoYW5kbGluZyAqLwogdm9pZCBpZWVlODAyMTFfc2Nhbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC0xMDg0LDcgKzEwOTEsNyBAQAogCXU4IHBhZGRpbmdfZm9yX3JhdGU7CiAJX19sZTE2IHR4X2ZsYWdzOwogCXU4IGRhdGFfcmV0cmllczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogCiAvKiBIVCAqLwpAQCAtMTA5OSw2ICsxMTA2LDggQEAKIAkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgc21wcywgY29uc3QgdTggKmRhLAogCQkJICAgICAgIGNvbnN0IHU4ICpic3NpZCk7CiAKK3ZvaWQgX19faWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbihzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgdTE2IHRpZCwKKwkJCQkgICAgIHUxNiBpbml0aWF0b3IsIHUxNiByZWFzb24pOwogdm9pZCBfX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RydWN0IHN0YV9pbmZvICpzdGEsIHUxNiB0aWQsCiAJCQkJICAgIHUxNiBpbml0aWF0b3IsIHUxNiByZWFzb24pOwogdm9pZCBpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CkBAIC0xMTE4LDYgKzExMjcsMTAgQEAKIAkJCQkgICBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKTsKIGludCBfX19pZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1MTYgdGlkLAogCQkJCSAgICBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKTsKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICpyYSwgdTE2IHRpZCk7Cit2b2lkIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICpyYSwgdTggdGlkKTsKK3ZvaWQgaWVlZTgwMjExX2JhX3Nlc3Npb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBpZWVlODAyMTFfdHhfYmFfc2Vzc2lvbl9oYW5kbGVfc3RhcnQoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQpOwogCiAvKiBTcGVjdHJ1bSBtYW5hZ2VtZW50ICovCiB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX21lYXN1cmVtZW50X3JlcShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggNTBkZWIwMS4uZWJiZTI2NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTI0OSw2ICsyNDksOCBAQAogCQkJbG9jYWwtPmZpZl9vdGhlcl9ic3MrKzsKIAogCQlpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihsb2NhbCk7CisKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXMgPSBkcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgJnNkYXRhLT52aWYpOwpAQCAtMjY4LDcgKzI3MCw2IEBACiAKIAkJY2hhbmdlZCB8PSBpZWVlODAyMTFfcmVzZXRfZXJwX2luZm8oc2RhdGEpOwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7Ci0JCWllZWU4MDIxMV9lbmFibGVfa2V5cyhzZGF0YSk7CiAKIAkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKQEAgLTMyMSwxNSArMzIyLDYgQEAKIAogCWllZWU4MDIxMV9yZWNhbGNfcHMobG9jYWwsIC0xKTsKIAotCS8qCi0JICogaWVlZTgwMjExX3N0YV93b3JrIGlzIGRpc2FibGVkIHdoaWxlIG5ldHdvcmsgaW50ZXJmYWNlCi0JICogaXMgZG93bi4gVGhlcmVmb3JlLCBzb21lIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtYXkgbm90Ci0JICogeWV0IGJlIGVmZmVjdGl2ZS4gVHJpZ2dlciBleGVjdXRpb24gb2YgaWVlZTgwMjExX3N0YV93b3JrCi0JICogdG8gZml4IHRoaXMuCi0JICovCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQotCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmc2RhdGEtPnUubWdkLndvcmspOwotCiAJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0zNDksNyArMzQxLDYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwogCXUzMiBod19yZWNvbmZfZmxhZ3MgPSAwOwpAQCAtMzY2LDE4ICszNTcsNiBAQAogCWllZWU4MDIxMV93b3JrX3B1cmdlKHNkYXRhKTsKIAogCS8qCi0JICogTm93IGRlbGV0ZSBhbGwgYWN0aXZlIGFnZ3JlZ2F0aW9uIHNlc3Npb25zLgotCSAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewotCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSkKLQkJCWllZWU4MDIxMV9zdGFfdGVhcl9kb3duX0JBX3Nlc3Npb25zKHN0YSk7Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQkvKgogCSAqIFJlbW92ZSBhbGwgc3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW50ZXJmYWNlLgogCSAqCiAJICogVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgb3BzLT5yZW1vdmVfaW50ZXJmYWNlKCkKQEAgLTQ4MywyNyArNDYyLDE0IEBACiAJCSAqIHdoZXRoZXIgdGhlIGludGVyZmFjZSBpcyBydW5uaW5nLCB3aGljaCwgYXQgdGhpcyBwb2ludCwKIAkJICogaXQgbm8gbG9uZ2VyIGlzLgogCQkgKi8KLQkJY2FuY2VsX3dvcmtfc3luYygmc2RhdGEtPnUubWdkLndvcmspOwogCQljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+dS5tZ2QuY2hzd2l0Y2hfd29yayk7CiAJCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT51Lm1nZC5tb25pdG9yX3dvcmspOwogCQljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+dS5tZ2QuYmVhY29uX2Nvbm5lY3Rpb25fbG9zc193b3JrKTsKIAotCQkvKgotCQkgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBkb3duLgotCQkgKiBDYWxsIHN5bmNocm9uaXplX3JjdSgpIHRvIHdhaXQgZm9yIHRoZSBSWCBwYXRoCi0JCSAqIHNob3VsZCBpdCBiZSB1c2luZyB0aGUgaW50ZXJmYWNlIGFuZCBlbnF1ZXVpbmcKLQkJICogZnJhbWVzIGF0IHRoaXMgdmVyeSB0aW1lIG9uIGFub3RoZXIgQ1BVLgotCQkgKi8KLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCXNrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPnUubWdkLnNrYl9xdWV1ZSk7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCWRlbF90aW1lcl9zeW5jKCZzZGF0YS0+dS5pYnNzLnRpbWVyKTsKLQkJCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT51Lmlic3Mud29yayk7Ci0JCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJCXNrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPnUuaWJzcy5za2JfcXVldWUpOwotCQl9CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpIHsKQEAgLTUxOCw2ICs0ODQsMTYgQEAKIAkJfQogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgorCQlmbHVzaF93b3JrKCZzZGF0YS0+d29yayk7CisJCS8qCisJCSAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSBpbnRlcmZhY2UgaXMgbWFya2VkIGRvd24uCisJCSAqIENhbGwgc3luY2hyb25pemVfcmN1KCkgdG8gd2FpdCBmb3IgdGhlIFJYIHBhdGgKKwkJICogc2hvdWxkIGl0IGJlIHVzaW5nIHRoZSBpbnRlcmZhY2UgYW5kIGVucXVldWluZworCQkgKiBmcmFtZXMgYXQgdGhpcyB2ZXJ5IHRpbWUgb24gYW5vdGhlciBDUFUuCisJCSAqLworCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZzZGF0YS0+c2tiX3F1ZXVlKTsKKwogCQlpZiAobG9jYWwtPnNjYW5fc2RhdGEgPT0gc2RhdGEpCiAJCQlpZWVlODAyMTFfc2Nhbl9jYW5jZWwobG9jYWwpOwogCkBAIC01MzEsOCArNTA3LDggQEAKIAkJCQlCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCk7CiAJCX0KIAotCQkvKiBkaXNhYmxlIGFsbCBrZXlzIGZvciBhcyBsb25nIGFzIHRoaXMgbmV0ZGV2IGlzIGRvd24gKi8KLQkJaWVlZTgwMjExX2Rpc2FibGVfa2V5cyhzZGF0YSk7CisJCS8qIGZyZWUgYWxsIHJlbWFpbmluZyBrZXlzLCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55ICovCisJCWllZWU4MDIxMV9mcmVlX2tleXMoc2RhdGEpOwogCQlkcnZfcmVtb3ZlX2ludGVyZmFjZShsb2NhbCwgJnNkYXRhLT52aWYpOwogCX0KIApAQCAtNzI3LDYgKzcwMywxMzYgQEAKIAlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKIH0KIAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2lmYWNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKnJhX3RpZDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm47CisKKwlpZiAobG9jYWwtPnNjYW5uaW5nKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGllZWU4MDIxMV9xdWV1ZV93b3JrKCkgc2hvdWxkIGhhdmUgcGlja2VkIHVwIG1vc3QgY2FzZXMsCisJICogaGVyZSB3ZSdsbCBwaWNrIHRoZSByZXN0LgorCSAqLworCWlmIChXQVJOKGxvY2FsLT5zdXNwZW5kZWQsCisJCSAiaW50ZXJmYWNlIHdvcmsgc2NoZWR1bGVkIHdoaWxlIGdvaW5nIHRvIHN1c3BlbmRcbiIpKQorCQlyZXR1cm47CisKKwkvKiBmaXJzdCBwcm9jZXNzIGZyYW1lcyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNkYXRhLT5za2JfcXVldWUpKSkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKworCQlpZiAoc2tiLT5wa3RfdHlwZSA9PSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfQUdHX1NUQVJUKSB7CisJCQlyYV90aWQgPSAodm9pZCAqKSZza2ItPmNiOworCQkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiKCZzZGF0YS0+dmlmLCByYV90aWQtPnJhLAorCQkJCQkJIHJhX3RpZC0+dGlkKTsKKwkJfSBlbHNlIGlmIChza2ItPnBrdF90eXBlID09IElFRUU4MDIxMV9TREFUQV9RVUVVRV9BR0dfU1RPUCkgeworCQkJcmFfdGlkID0gKHZvaWQgKikmc2tiLT5jYjsKKwkJCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiKCZzZGF0YS0+dmlmLCByYV90aWQtPnJhLAorCQkJCQkJcmFfdGlkLT50aWQpOworCQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19hY3Rpb24obWdtdC0+ZnJhbWVfY29udHJvbCkgJiYKKwkJCSAgIG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQ0FURUdPUllfQkFDSykgeworCQkJaW50IGxlbiA9IHNrYi0+bGVuOworCisJCQltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7CisJCQlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBtZ210LT5zYSk7CisJCQlpZiAoc3RhKSB7CisJCQkJc3dpdGNoIChtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5hY3Rpb25fY29kZSkgeworCQkJCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVROgorCQkJCQlpZWVlODAyMTFfcHJvY2Vzc19hZGRiYV9yZXF1ZXN0KAorCQkJCQkJCWxvY2FsLCBzdGEsIG1nbXQsIGxlbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDoKKwkJCQkJaWVlZTgwMjExX3Byb2Nlc3NfYWRkYmFfcmVzcChsb2NhbCwgc3RhLAorCQkJCQkJCQkgICAgIG1nbXQsIGxlbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV0xBTl9BQ1RJT05fREVMQkE6CisJCQkJCWllZWU4MDIxMV9wcm9jZXNzX2RlbGJhKHNkYXRhLCBzdGEsCisJCQkJCQkJCW1nbXQsIGxlbik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCVdBUk5fT04oMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOworCQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhtZ210LT5mcmFtZV9jb250cm9sKSkgeworCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopbWdtdDsKKwkJCS8qCisJCQkgKiBTbyB0aGUgZnJhbWUgaXNuJ3QgbWdtdCwgYnV0IGZyYW1lX2NvbnRyb2wKKwkJCSAqIGlzIGF0IHRoZSByaWdodCBwbGFjZSBhbnl3YXksIG9mIGNvdXJzZSwgc28KKwkJCSAqIHRoZSBpZiBzdGF0ZW1lbnQgaXMgY29ycmVjdC4KKwkJCSAqCisJCQkgKiBXYXJuIGlmIHdlIGhhdmUgb3RoZXIgZGF0YSBmcmFtZSB0eXBlcyBoZXJlLAorCQkJICogdGhleSBtdXN0IG5vdCBnZXQgaGVyZS4KKwkJCSAqLworCQkJV0FSTl9PTihoZHItPmZyYW1lX2NvbnRyb2wgJgorCQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpKTsKKwkJCVdBUk5fT04oIShoZHItPnNlcV9jdHJsICYKKwkJCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRykpKTsKKwkJCS8qCisJCQkgKiBUaGlzIHdhcyBhIGZyYWdtZW50IG9mIGEgZnJhbWUsIHJlY2VpdmVkIHdoaWxlCisJCQkgKiBhIGJsb2NrLWFjayBzZXNzaW9uIHdhcyBhY3RpdmUuIFRoYXQgY2Fubm90IGJlCisJCQkgKiByaWdodCwgc28gdGVybWluYXRlIHRoZSBzZXNzaW9uLgorCQkJICovCisJCQltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7CisJCQlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBtZ210LT5zYSk7CisJCQlpZiAoc3RhKSB7CisJCQkJdTE2IHRpZCA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmCisJCQkJCQlJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKKworCQkJCV9faWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbigKKwkJCQkJc3RhLCB0aWQsIFdMQU5fQkFDS19SRUNJUElFTlQsCisJCQkJCVdMQU5fUkVBU09OX1FTVEFfUkVRVUlSRV9TRVRVUCk7CisJCQl9CisJCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKKwkJfSBlbHNlIHN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJCWllZWU4MDIxMV9zdGFfcnhfcXVldWVkX21nbXQoc2RhdGEsIHNrYik7CisJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJCWllZWU4MDIxMV9pYnNzX3J4X3F1ZXVlZF9tZ210KHNkYXRhLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJCWlmICghaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKKwkJCQlicmVhazsKKwkJCWllZWU4MDIxMV9tZXNoX3J4X3F1ZXVlZF9tZ210KHNkYXRhLCBza2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXQVJOKDEsICJmcmFtZSBmb3IgdW5leHBlY3RlZCBpbnRlcmZhY2UgdHlwZSIpOworCQkJYnJlYWs7CisJCX0KKworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKiB0aGVuIG90aGVyIHR5cGUtZGVwZW5kZW50IHdvcmsgKi8KKwlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJaWVlZTgwMjExX3N0YV93b3JrKHNkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaWVlZTgwMjExX2lic3Nfd29yayhzZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJaWYgKCFpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQorCQkJYnJlYWs7CisJCWllZWU4MDIxMV9tZXNoX3dvcmsoc2RhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKwogLyoKICAqIEhlbHBlciBmdW5jdGlvbiB0byBpbml0aWFsaXNlIGFuIGludGVyZmFjZSB0byBhIHNwZWNpZmljIHR5cGUuCiAgKi8KQEAgLTc0NCw2ICs4NTAsOSBAQAogCS8qIG9ubHkgbW9uaXRvciBkaWZmZXJzICovCiAJc2RhdGEtPmRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKIAorCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkYXRhLT5za2JfcXVldWUpOworCUlOSVRfV09SSygmc2RhdGEtPndvcmssIGllZWU4MDIxMV9pZmFjZV93b3JrKTsKKwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkYXRhLT51LmFwLnBzX2JjX2J1Zik7CkBAIC05NjksNiArMTA3OCw5IEBACiAJc2RhdGEtPndkZXYud2lwaHkgPSBsb2NhbC0+aHcud2lwaHk7CiAJc2RhdGEtPmxvY2FsID0gbG9jYWw7CiAJc2RhdGEtPmRldiA9IG5kZXY7CisjaWZkZWYgQ09ORklHX0lORVQKKwlzZGF0YS0+YXJwX2ZpbHRlcl9zdGF0ZSA9IHRydWU7CisjZW5kaWYKIAogCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfRlJBR01FTlRfTUFYOyBpKyspCiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkYXRhLT5mcmFnbWVudHNbaV0uc2tiX2xpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2tleS5jIGIvbmV0L21hYzgwMjExL2tleS5jCmluZGV4IGU4ZjZlM2IuLjFiOWQ4N2UgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9rZXkuYworKysgYi9uZXQvbWFjODAyMTEva2V5LmMKQEAgLTM2LDgwICszNiwyMCBAQAogICogVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSBvZiBrbm93aW5nIHRoaXMgZXhjZXB0IGJ5IGxvb2tpbmcgaW50bwogICogZGVidWdmcy4KICAqCi0gKiBBbGwga2V5IG9wZXJhdGlvbnMgYXJlIHByb3RlY3RlZCBpbnRlcm5hbGx5IHNvIHlvdSBjYW4gY2FsbCB0aGVtIGF0Ci0gKiBhbnkgdGltZS4KKyAqIEFsbCBrZXkgb3BlcmF0aW9ucyBhcmUgcHJvdGVjdGVkIGludGVybmFsbHkuCiAgKgogICogV2l0aGluIG1hYzgwMjExLCBrZXkgcmVmZXJlbmNlcyBhcmUsIGp1c3QgYXMgU1RBIHN0cnVjdHVyZSByZWZlcmVuY2VzLAogICogcHJvdGVjdGVkIGJ5IFJDVS4gTm90ZSwgaG93ZXZlciwgdGhhdCBzb21lIHRoaW5ncyBhcmUgdW5wcm90ZWN0ZWQsCiAgKiBuYW1lbHkgdGhlIGtleS0+c3RhIGRlcmVmZXJlbmNlcyB3aXRoaW4gdGhlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgotICogZnVuY3Rpb25zLiBUaGlzIG1lYW5zIHRoYXQgc3RhX2luZm9fZGVzdHJveSgpIG11c3QgZmx1c2ggdGhlIGtleSB0b2RvCi0gKiBsaXN0LgotICoKLSAqIEFsbCB0aGUgZGlyZWN0IGtleSBsaXN0IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgbXVzdCBub3Qgc2xlZXAgYmVjYXVzZQotICogdGhleSBjYW4gb3BlcmF0ZSBvbiBTVEEgaW5mbyBzdHJ1Y3RzIHRoYXQgYXJlIHByb3RlY3RlZCBieSBSQ1UuCisgKiBmdW5jdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBzdGFfaW5mb19kZXN0cm95KCkgbXVzdCByZW1vdmUgdGhlIGtleQorICogd2hpY2ggd2FpdHMgZm9yIGFuIFJDVSBncmFjZSBwZXJpb2QuCiAgKi8KIAogc3RhdGljIGNvbnN0IHU4IGJjYXN0X2FkZHJbRVRIX0FMRU5dID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CiAKLS8qIGtleSBtdXRleDogdXNlZCB0byBzeW5jaHJvbmlzZSB0b2RvIHJ1bm5lcnMgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoa2V5X211dGV4KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodG9kb19sb2NrKTsKLXN0YXRpYyBMSVNUX0hFQUQodG9kb19saXN0KTsKLQotc3RhdGljIHZvaWQga2V5X3RvZG8oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgYXNzZXJ0X2tleV9sb2NrKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQogewotCWllZWU4MDIxMV9rZXlfdG9kbygpOwotfQotCi1zdGF0aWMgREVDTEFSRV9XT1JLKHRvZG9fd29yaywga2V5X3RvZG8pOwotCi0vKioKLSAqIGFkZF90b2RvIC0gYWRkIHRvZG8gaXRlbSBmb3IgYSBrZXkKLSAqCi0gKiBAa2V5OiBrZXkgdG8gYWRkIHRvIGRvIGl0ZW0gZm9yCi0gKiBAZmxhZzogdG9kbyBmbGFnKHMpCi0gKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCBJUlFzIG9yIHNvZnRpcnFzIGRpc2FibGVkLgotICovCi1zdGF0aWMgdm9pZCBhZGRfdG9kbyhzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LCB1MzIgZmxhZykKLXsKLQlpZiAoIWtleSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrKCZ0b2RvX2xvY2spOwotCWtleS0+ZmxhZ3MgfD0gZmxhZzsKLQkvKgotCSAqIFJlbW92ZSBhZ2FpbiBpZiBhbHJlYWR5IG9uIHRoZSBsaXN0IHNvIHRoYXQgd2UgbW92ZSBpdCB0byB0aGUgZW5kLgotCSAqLwotCWlmICghbGlzdF9lbXB0eSgma2V5LT50b2RvKSkKLQkJbGlzdF9kZWwoJmtleS0+dG9kbyk7Ci0JbGlzdF9hZGRfdGFpbCgma2V5LT50b2RvLCAmdG9kb19saXN0KTsKLQlzY2hlZHVsZV93b3JrKCZ0b2RvX3dvcmspOwotCXNwaW5fdW5sb2NrKCZ0b2RvX2xvY2spOwotfQotCi0vKioKLSAqIGllZWU4MDIxMV9rZXlfbG9jayAtIGxvY2sgdGhlIG1hYzgwMjExIGtleSBvcGVyYXRpb24gbG9jawotICoKLSAqIFRoaXMgbG9ja3MgdGhlIChnbG9iYWwpIG1hYzgwMjExIGtleSBvcGVyYXRpb24gbG9jaywgYWxsCi0gKiBrZXkgb3BlcmF0aW9ucyBtdXN0IGJlIGRvbmUgdW5kZXIgdGhpcyBsb2NrLgotICovCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfa2V5X2xvY2sodm9pZCkKLXsKLQltdXRleF9sb2NrKCZrZXlfbXV0ZXgpOwotfQotCi0vKioKLSAqIGllZWU4MDIxMV9rZXlfdW5sb2NrIC0gdW5sb2NrIHRoZSBtYWM4MDIxMSBrZXkgb3BlcmF0aW9uIGxvY2sKLSAqLwotc3RhdGljIHZvaWQgaWVlZTgwMjExX2tleV91bmxvY2sodm9pZCkKLXsKLQltdXRleF91bmxvY2soJmtleV9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFzc2VydF9rZXlfbG9jayh2b2lkKQotewotCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgma2V5X211dGV4KSk7CisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZsb2NhbC0+a2V5X210eCkpOwogfQogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdGEgKmdldF9zdGFfZm9yX2tleShzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5KQpAQCAtMTI2LDEyICs2NiwxMyBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJaW50IHJldDsKIAotCWFzc2VydF9rZXlfbG9jaygpOwogCW1pZ2h0X3NsZWVwKCk7CiAKIAlpZiAoIWtleS0+bG9jYWwtPm9wcy0+c2V0X2tleSkKIAkJcmV0dXJuOwogCisJYXNzZXJ0X2tleV9sb2NrKGtleS0+bG9jYWwpOworCiAJc3RhID0gZ2V0X3N0YV9mb3Jfa2V5KGtleSk7CiAKIAlzZGF0YSA9IGtleS0+c2RhdGE7CkBAIC0xNDIsMTEgKzgzLDggQEAKIAogCXJldCA9IGRydl9zZXRfa2V5KGtleS0+bG9jYWwsIFNFVF9LRVksIHNkYXRhLCBzdGEsICZrZXktPmNvbmYpOwogCi0JaWYgKCFyZXQpIHsKLQkJc3Bpbl9sb2NrX2JoKCZ0b2RvX2xvY2spOworCWlmICghcmV0KQogCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFOwotCQlzcGluX3VubG9ja19iaCgmdG9kb19sb2NrKTsKLQl9CiAKIAlpZiAocmV0ICYmIHJldCAhPSAtRU5PU1BDICYmIHJldCAhPSAtRU9QTk9UU1VQUCkKIAkJcHJpbnRrKEtFUk5fRVJSICJtYWM4MDIxMS0lczogZmFpbGVkIHRvIHNldCBrZXkgIgpAQCAtMTYxLDE4ICs5OSwxNSBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJaW50IHJldDsKIAotCWFzc2VydF9rZXlfbG9jaygpOwogCW1pZ2h0X3NsZWVwKCk7CiAKIAlpZiAoIWtleSB8fCAha2V5LT5sb2NhbC0+b3BzLT5zZXRfa2V5KQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfYmgoJnRvZG9fbG9jayk7Ci0JaWYgKCEoa2V5LT5mbGFncyAmIEtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFKSkgewotCQlzcGluX3VubG9ja19iaCgmdG9kb19sb2NrKTsKKwlhc3NlcnRfa2V5X2xvY2soa2V5LT5sb2NhbCk7CisKKwlpZiAoIShrZXktPmZsYWdzICYgS0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkUpKQogCQlyZXR1cm47Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZ0b2RvX2xvY2spOwogCiAJc3RhID0gZ2V0X3N0YV9mb3Jfa2V5KGtleSk7CiAJc2RhdGEgPSBrZXktPnNkYXRhOwpAQCAtMTkxLDkgKzEyNiw3IEBACiAJCSAgICAgICB3aXBoeV9uYW1lKGtleS0+bG9jYWwtPmh3LndpcGh5KSwKIAkJICAgICAgIGtleS0+Y29uZi5rZXlpZHgsIHN0YSA/IHN0YS0+YWRkciA6IGJjYXN0X2FkZHIsIHJldCk7CiAKLQlzcGluX2xvY2tfYmgoJnRvZG9fbG9jayk7CiAJa2V5LT5mbGFncyAmPSB+S0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkU7Ci0Jc3Bpbl91bmxvY2tfYmgoJnRvZG9fbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faWVlZTgwMjExX3NldF9kZWZhdWx0X2tleShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTIwMSwyMiArMTM0LDI0IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IE5VTEw7CiAKKwlhc3NlcnRfa2V5X2xvY2soc2RhdGEtPmxvY2FsKTsKKwogCWlmIChpZHggPj0gMCAmJiBpZHggPCBOVU1fREVGQVVMVF9LRVlTKQogCQlrZXkgPSBzZGF0YS0+a2V5c1tpZHhdOwogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKHNkYXRhLT5kZWZhdWx0X2tleSwga2V5KTsKIAotCWlmIChrZXkpCi0JCWFkZF90b2RvKGtleSwgS0VZX0ZMQUdfVE9ET19ERUZLRVkpOworCWlmIChrZXkpIHsKKwkJaWVlZTgwMjExX2RlYnVnZnNfa2V5X3JlbW92ZV9kZWZhdWx0KGtleS0+c2RhdGEpOworCQlpZWVlODAyMTFfZGVidWdmc19rZXlfYWRkX2RlZmF1bHQoa2V5LT5zZGF0YSk7CisJfQogfQogCiB2b2lkIGllZWU4MDIxMV9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIGludCBpZHgpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGF0YS0+bG9jYWwtPmtleV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKIAlfX2llZWU4MDIxMV9zZXRfZGVmYXVsdF9rZXkoc2RhdGEsIGlkeCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RhdGEtPmxvY2FsLT5rZXlfbG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTIyNCwyNCArMTU5LDI2IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IE5VTEw7CiAKKwlhc3NlcnRfa2V5X2xvY2soc2RhdGEtPmxvY2FsKTsKKwogCWlmIChpZHggPj0gTlVNX0RFRkFVTFRfS0VZUyAmJgogCSAgICBpZHggPCBOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTKQogCQlrZXkgPSBzZGF0YS0+a2V5c1tpZHhdOwogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKHNkYXRhLT5kZWZhdWx0X21nbXRfa2V5LCBrZXkpOwogCi0JaWYgKGtleSkKLQkJYWRkX3RvZG8oa2V5LCBLRVlfRkxBR19UT0RPX0RFRk1HTVRLRVkpOworCWlmIChrZXkpIHsKKwkJaWVlZTgwMjExX2RlYnVnZnNfa2V5X3JlbW92ZV9tZ210X2RlZmF1bHQoa2V5LT5zZGF0YSk7CisJCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9hZGRfbWdtdF9kZWZhdWx0KGtleS0+c2RhdGEpOworCX0KIH0KIAogdm9pZCBpZWVlODAyMTFfc2V0X2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgIGludCBpZHgpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGF0YS0+bG9jYWwtPmtleV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKIAlfX2llZWU4MDIxMV9zZXRfZGVmYXVsdF9tZ210X2tleShzZGF0YSwgaWR4KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGF0YS0+bG9jYWwtPmtleV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwogfQogCiAKQEAgLTMzNiw3ICsyNzMsNyBAQAogCQlrZXktPmNvbmYuaXZfbGVuID0gQ0NNUF9IRFJfTEVOOwogCQlrZXktPmNvbmYuaWN2X2xlbiA9IENDTVBfTUlDX0xFTjsKIAkJaWYgKHNlcSkgewotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9EQVRBX1FVRVVFUzsgaSsrKQorCQkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9EQVRBX1FVRVVFUyArIDE7IGkrKykKIAkJCQlmb3IgKGogPSAwOyBqIDwgQ0NNUF9QTl9MRU47IGorKykKIAkJCQkJa2V5LT51LmNjbXAucnhfcG5baV1bal0gPQogCQkJCQkJc2VxW0NDTVBfUE5fTEVOIC0gaiAtIDFdOwpAQCAtMzUyLDcgKzI4OSw2IEBACiAJfQogCW1lbWNweShrZXktPmNvbmYua2V5LCBrZXlfZGF0YSwga2V5X2xlbik7CiAJSU5JVF9MSVNUX0hFQUQoJmtleS0+bGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmtleS0+dG9kbyk7CiAKIAlpZiAoYWxnID09IEFMR19DQ01QKSB7CiAJCS8qCkBAIC0zODIsMTIgKzMxOCwyOSBAQAogCXJldHVybiBrZXk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faWVlZTgwMjExX2tleV9kZXN0cm95KHN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkpCit7CisJaWYgKCFrZXkpCisJCXJldHVybjsKKworCWlmIChrZXktPmxvY2FsKQorCQlpZWVlODAyMTFfa2V5X2Rpc2FibGVfaHdfYWNjZWwoa2V5KTsKKworCWlmIChrZXktPmNvbmYuYWxnID09IEFMR19DQ01QKQorCQlpZWVlODAyMTFfYWVzX2tleV9mcmVlKGtleS0+dS5jY21wLnRmbSk7CisJaWYgKGtleS0+Y29uZi5hbGcgPT0gQUxHX0FFU19DTUFDKQorCQlpZWVlODAyMTFfYWVzX2NtYWNfa2V5X2ZyZWUoa2V5LT51LmFlc19jbWFjLnRmbSk7CisJaWYgKGtleS0+bG9jYWwpCisJCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9yZW1vdmUoa2V5KTsKKworCWtmcmVlKGtleSk7Cit9CisKIHZvaWQgaWVlZTgwMjExX2tleV9saW5rKHN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXksCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCXN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICpvbGRfa2V5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGlkeDsKIAogCUJVR19PTighc2RhdGEpOwpAQCAtNDMxLDcgKzM4NCw3IEBACiAJCX0KIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RhdGEtPmxvY2FsLT5rZXlfbG9jaywgZmxhZ3MpOworCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CiAKIAlpZiAoc3RhKQogCQlvbGRfa2V5ID0gc3RhLT5rZXk7CkBAIC00MzksMTUgKzM5MiwxMyBAQAogCQlvbGRfa2V5ID0gc2RhdGEtPmtleXNbaWR4XTsKIAogCV9faWVlZTgwMjExX2tleV9yZXBsYWNlKHNkYXRhLCBzdGEsIG9sZF9rZXksIGtleSk7CisJX19pZWVlODAyMTFfa2V5X2Rlc3Ryb3kob2xkX2tleSk7CiAKLQkvKiBmcmVlIG9sZCBrZXkgbGF0ZXIgKi8KLQlhZGRfdG9kbyhvbGRfa2V5LCBLRVlfRkxBR19UT0RPX0RFTEVURSk7CisJaWVlZTgwMjExX2RlYnVnZnNfa2V5X2FkZChrZXkpOwogCi0JYWRkX3RvZG8oa2V5LCBLRVlfRkxBR19UT0RPX0FERF9ERUJVR0ZTKTsKLQlpZiAoaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQotCQlhZGRfdG9kbyhrZXksIEtFWV9GTEFHX1RPRE9fSFdBQ0NFTF9BREQpOworCWllZWU4MDIxMV9rZXlfZW5hYmxlX2h3X2FjY2VsKGtleSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGF0YS0+bG9jYWwtPmtleV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2llZWU4MDIxMV9rZXlfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5KQpAQCAtNDU4LDE3MCArNDA5LDYyIEBACiAJaWYgKGtleS0+c2RhdGEpCiAJCV9faWVlZTgwMjExX2tleV9yZXBsYWNlKGtleS0+c2RhdGEsIGtleS0+c3RhLAogCQkJCQlrZXksIE5VTEwpOwotCi0JYWRkX3RvZG8oa2V5LCBLRVlfRkxBR19UT0RPX0RFTEVURSk7CisJX19pZWVlODAyMTFfa2V5X2Rlc3Ryb3koa2V5KTsKIH0KIAotdm9pZCBpZWVlODAyMTFfa2V5X2ZyZWUoc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSkKK3ZvaWQgaWVlZTgwMjExX2tleV9mcmVlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJaWYgKCFrZXkpCiAJCXJldHVybjsKIAotCWlmICgha2V5LT5zZGF0YSkgewotCQkvKiBUaGUga2V5IGhhcyBub3QgYmVlbiBsaW5rZWQgeWV0LCBzaW1wbHkgZnJlZSBpdAotCQkgKiBhbmQgZG9uJ3QgT29wcyAqLwotCQlpZiAoa2V5LT5jb25mLmFsZyA9PSBBTEdfQ0NNUCkKLQkJCWllZWU4MDIxMV9hZXNfa2V5X2ZyZWUoa2V5LT51LmNjbXAudGZtKTsKLQkJa2ZyZWUoa2V5KTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZrZXktPnNkYXRhLT5sb2NhbC0+a2V5X2xvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZsb2NhbC0+a2V5X210eCk7CiAJX19pZWVlODAyMTFfa2V5X2ZyZWUoa2V5KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXktPnNkYXRhLT5sb2NhbC0+a2V5X2xvY2ssIGZsYWdzKTsKLX0KLQotLyoKLSAqIFRvIGJlIHNhZmUgYWdhaW5zdCBjb25jdXJyZW50IG1hbmlwdWxhdGlvbnMgb2YgdGhlIGxpc3QgKHdoaWNoIHNob3VsZG4ndAotICogYWN0dWFsbHkgaGFwcGVuKSB3ZSBuZWVkIHRvIGhvbGQgdGhlIHNwaW5sb2NrLiBCdXQgdW5kZXIgdGhlIHNwaW5sb2NrIHdlCi0gKiBjYW4ndCBhY3R1YWxseSBkbyBtdWNoLCBzbyB3ZSBkZWZlciBwcm9jZXNzaW5nIHRvIHRoZSB0b2RvIGxpc3QuIFRoZW4gcnVuCi0gKiB0aGUgdG9kbyBsaXN0IHRvIGJlIHN1cmUgdGhlIG9wZXJhdGlvbiBhbmQgcG9zc2libHkgcHJldmlvdXNseSBwZW5kaW5nCi0gKiBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV90b2RvX2Zvcl9lYWNoX2tleShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJdTMyIHRvZG9fZmxhZ3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGF0YS0+bG9jYWwtPmtleV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShrZXksICZzZGF0YS0+a2V5X2xpc3QsIGxpc3QpCi0JCWFkZF90b2RvKGtleSwgdG9kb19mbGFncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RhdGEtPmxvY2FsLT5rZXlfbG9jaywgZmxhZ3MpOwotCi0JaWVlZTgwMjExX2tleV90b2RvKCk7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+a2V5X210eCk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX2VuYWJsZV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogeworCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXk7CisKIAlBU1NFUlRfUlROTCgpOwogCiAJaWYgKFdBUk5fT04oIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkpCiAJCXJldHVybjsKIAotCWllZWU4MDIxMV90b2RvX2Zvcl9lYWNoX2tleShzZGF0YSwgS0VZX0ZMQUdfVE9ET19IV0FDQ0VMX0FERCk7CisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2V5LCAmc2RhdGEtPmtleV9saXN0LCBsaXN0KQorCQlpZWVlODAyMTFfa2V5X2VuYWJsZV9od19hY2NlbChrZXkpOworCisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwogfQogCiB2b2lkIGllZWU4MDIxMV9kaXNhYmxlX2tleXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CisJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleTsKKwogCUFTU0VSVF9SVE5MKCk7CiAKLQlpZWVlODAyMTFfdG9kb19mb3JfZWFjaF9rZXkoc2RhdGEsIEtFWV9GTEFHX1RPRE9fSFdBQ0NFTF9SRU1PVkUpOwotfQorCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CiAKLXN0YXRpYyB2b2lkIF9faWVlZTgwMjExX2tleV9kZXN0cm95KHN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkpCi17Ci0JaWYgKCFrZXkpCi0JCXJldHVybjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleSwgJnNkYXRhLT5rZXlfbGlzdCwgbGlzdCkKKwkJaWVlZTgwMjExX2tleV9kaXNhYmxlX2h3X2FjY2VsKGtleSk7CiAKLQlpZWVlODAyMTFfa2V5X2Rpc2FibGVfaHdfYWNjZWwoa2V5KTsKLQotCWlmIChrZXktPmNvbmYuYWxnID09IEFMR19DQ01QKQotCQlpZWVlODAyMTFfYWVzX2tleV9mcmVlKGtleS0+dS5jY21wLnRmbSk7Ci0JaWYgKGtleS0+Y29uZi5hbGcgPT0gQUxHX0FFU19DTUFDKQotCQlpZWVlODAyMTFfYWVzX2NtYWNfa2V5X2ZyZWUoa2V5LT51LmFlc19jbWFjLnRmbSk7Ci0JaWVlZTgwMjExX2RlYnVnZnNfa2V5X3JlbW92ZShrZXkpOwotCi0Ja2ZyZWUoa2V5KTsKLX0KLQotc3RhdGljIHZvaWQgX19pZWVlODAyMTFfa2V5X3RvZG8odm9pZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5OwotCWJvb2wgd29ya19kb25lOwotCXUzMiB0b2RvZmxhZ3M7Ci0KLQkvKgotCSAqIE5COiBzdGFfaW5mb19kZXN0cm95IHJlbGllcyBvbiB0aGlzIQotCSAqLwotCXN5bmNocm9uaXplX3JjdSgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZ0b2RvX2xvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmdG9kb19saXN0KSkgewotCQlrZXkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0b2RvX2xpc3QsIHN0cnVjdCBpZWVlODAyMTFfa2V5LCB0b2RvKTsKLQkJbGlzdF9kZWxfaW5pdCgma2V5LT50b2RvKTsKLQkJdG9kb2ZsYWdzID0ga2V5LT5mbGFncyAmIChLRVlfRkxBR19UT0RPX0FERF9ERUJVR0ZTIHwKLQkJCQkJICBLRVlfRkxBR19UT0RPX0RFRktFWSB8Ci0JCQkJCSAgS0VZX0ZMQUdfVE9ET19ERUZNR01US0VZIHwKLQkJCQkJICBLRVlfRkxBR19UT0RPX0hXQUNDRUxfQUREIHwKLQkJCQkJICBLRVlfRkxBR19UT0RPX0hXQUNDRUxfUkVNT1ZFIHwKLQkJCQkJICBLRVlfRkxBR19UT0RPX0RFTEVURSk7Ci0JCWtleS0+ZmxhZ3MgJj0gfnRvZG9mbGFnczsKLQkJc3Bpbl91bmxvY2tfYmgoJnRvZG9fbG9jayk7Ci0KLQkJd29ya19kb25lID0gZmFsc2U7Ci0KLQkJaWYgKHRvZG9mbGFncyAmIEtFWV9GTEFHX1RPRE9fQUREX0RFQlVHRlMpIHsKLQkJCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9hZGQoa2V5KTsKLQkJCXdvcmtfZG9uZSA9IHRydWU7Ci0JCX0KLQkJaWYgKHRvZG9mbGFncyAmIEtFWV9GTEFHX1RPRE9fREVGS0VZKSB7Ci0JCQlpZWVlODAyMTFfZGVidWdmc19rZXlfcmVtb3ZlX2RlZmF1bHQoa2V5LT5zZGF0YSk7Ci0JCQlpZWVlODAyMTFfZGVidWdmc19rZXlfYWRkX2RlZmF1bHQoa2V5LT5zZGF0YSk7Ci0JCQl3b3JrX2RvbmUgPSB0cnVlOwotCQl9Ci0JCWlmICh0b2RvZmxhZ3MgJiBLRVlfRkxBR19UT0RPX0RFRk1HTVRLRVkpIHsKLQkJCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9yZW1vdmVfbWdtdF9kZWZhdWx0KGtleS0+c2RhdGEpOwotCQkJaWVlZTgwMjExX2RlYnVnZnNfa2V5X2FkZF9tZ210X2RlZmF1bHQoa2V5LT5zZGF0YSk7Ci0JCQl3b3JrX2RvbmUgPSB0cnVlOwotCQl9Ci0JCWlmICh0b2RvZmxhZ3MgJiBLRVlfRkxBR19UT0RPX0hXQUNDRUxfQUREKSB7Ci0JCQlpZWVlODAyMTFfa2V5X2VuYWJsZV9od19hY2NlbChrZXkpOwotCQkJd29ya19kb25lID0gdHJ1ZTsKLQkJfQotCQlpZiAodG9kb2ZsYWdzICYgS0VZX0ZMQUdfVE9ET19IV0FDQ0VMX1JFTU9WRSkgewotCQkJaWVlZTgwMjExX2tleV9kaXNhYmxlX2h3X2FjY2VsKGtleSk7Ci0JCQl3b3JrX2RvbmUgPSB0cnVlOwotCQl9Ci0JCWlmICh0b2RvZmxhZ3MgJiBLRVlfRkxBR19UT0RPX0RFTEVURSkgewotCQkJX19pZWVlODAyMTFfa2V5X2Rlc3Ryb3koa2V5KTsKLQkJCXdvcmtfZG9uZSA9IHRydWU7Ci0JCX0KLQotCQlXQVJOX09OKCF3b3JrX2RvbmUpOwotCi0JCXNwaW5fbG9ja19iaCgmdG9kb19sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnRvZG9fbG9jayk7Ci19Ci0KLXZvaWQgaWVlZTgwMjExX2tleV90b2RvKHZvaWQpCi17Ci0JaWVlZTgwMjExX2tleV9sb2NrKCk7Ci0JX19pZWVlODAyMTFfa2V5X3RvZG8oKTsKLQlpZWVlODAyMTFfa2V5X3VubG9jaygpOworCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKIH0KIAogdm9pZCBpZWVlODAyMTFfZnJlZV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXksICp0bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWllZWU4MDIxMV9rZXlfbG9jaygpOworCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CiAKIAlpZWVlODAyMTFfZGVidWdmc19rZXlfcmVtb3ZlX2RlZmF1bHQoc2RhdGEpOwogCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9yZW1vdmVfbWdtdF9kZWZhdWx0KHNkYXRhKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGF0YS0+bG9jYWwtPmtleV9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtleSwgdG1wLCAmc2RhdGEtPmtleV9saXN0LCBsaXN0KQogCQlfX2llZWU4MDIxMV9rZXlfZnJlZShrZXkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkYXRhLT5sb2NhbC0+a2V5X2xvY2ssIGZsYWdzKTsKIAotCV9faWVlZTgwMjExX2tleV90b2RvKCk7Ci0KLQlpZWVlODAyMTFfa2V5X3VubG9jaygpOworCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9rZXkuaCBiL25ldC9tYWM4MDIxMS9rZXkuaAppbmRleCBiZGMyOTY4Li5iNjY1YmJiIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEva2V5LmgKKysrIGIvbmV0L21hYzgwMjExL2tleS5oCkBAIC0zOCwyNSArMzgsOSBAQAogICoKICAqIEBLRVlfRkxBR19VUExPQURFRF9UT19IQVJEV0FSRTogSW5kaWNhdGVzIHRoYXQgdGhpcyBrZXkgaXMgcHJlc2VudAogICoJaW4gdGhlIGhhcmR3YXJlIGZvciBUWCBjcnlwdG8gaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgotICogQEtFWV9GTEFHX1RPRE9fREVMRVRFOiBLZXkgaXMgbWFya2VkIGZvciBkZWxldGlvbiBhbmQgd2lsbCwgYWZ0ZXIgYW4KLSAqCVJDVSBncmFjZSBwZXJpb2QsIG5vIGxvbmdlciBiZSByZWFjaGFibGUgb3RoZXIgdGhhbiBmcm9tIHRoZQotICoJdG9kbyBsaXN0LgotICogQEtFWV9GTEFHX1RPRE9fSFdBQ0NFTF9BREQ6IEtleSBuZWVkcyB0byBiZSBhZGRlZCB0byBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCi0gKiBAS0VZX0ZMQUdfVE9ET19IV0FDQ0VMX1JFTU9WRTogS2V5IG5lZWRzIHRvIGJlIHJlbW92ZWQgZnJvbSBoYXJkd2FyZQotICoJYWNjZWxlcmF0aW9uLgotICogQEtFWV9GTEFHX1RPRE9fREVGS0VZOiBLZXkgaXMgZGVmYXVsdCBrZXkgYW5kIGRlYnVnZnMgbmVlZHMgdG8gYmUgdXBkYXRlZC4KLSAqIEBLRVlfRkxBR19UT0RPX0FERF9ERUJVR0ZTOiBLZXkgbmVlZHMgdG8gYmUgYWRkZWQgdG8gZGVidWdmcy4KLSAqIEBLRVlfRkxBR19UT0RPX0RFRk1HTVRLRVk6IEtleSBpcyBkZWZhdWx0IG1hbmFnZW1lbnQga2V5IGFuZCBkZWJ1Z2ZzIG5lZWRzCi0gKgl0byBiZSB1cGRhdGVkLgogICovCiBlbnVtIGllZWU4MDIxMV9pbnRlcm5hbF9rZXlfZmxhZ3MgewogCUtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFCT0gQklUKDApLAotCUtFWV9GTEFHX1RPRE9fREVMRVRFCQk9IEJJVCgxKSwKLQlLRVlfRkxBR19UT0RPX0hXQUNDRUxfQURECT0gQklUKDIpLAotCUtFWV9GTEFHX1RPRE9fSFdBQ0NFTF9SRU1PVkUJPSBCSVQoMyksCi0JS0VZX0ZMQUdfVE9ET19ERUZLRVkJCT0gQklUKDQpLAotCUtFWV9GTEFHX1RPRE9fQUREX0RFQlVHRlMJPSBCSVQoNSksCi0JS0VZX0ZMQUdfVE9ET19ERUZNR01US0VZCT0gQklUKDYpLAogfTsKIAogZW51bSBpZWVlODAyMTFfaW50ZXJuYWxfdGtpcF9zdGF0ZSB7CkBAIC03OSwxMCArNjMsOCBAQAogCiAJLyogZm9yIHNkYXRhIGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JLyogZm9yIHRvZG8gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKIAotCS8qIHByb3RlY3RlZCBieSB0b2RvIGxvY2shICovCisJLyogcHJvdGVjdGVkIGJ5IGtleSBtdXRleCAqLwogCXVuc2lnbmVkIGludCBmbGFnczsKIAogCXVuaW9uIHsKQEAgLTk1LDcgKzc3LDEzIEBACiAJCX0gdGtpcDsKIAkJc3RydWN0IHsKIAkJCXU4IHR4X3BuWzZdOwotCQkJdTggcnhfcG5bTlVNX1JYX0RBVEFfUVVFVUVTXVs2XTsKKwkJCS8qCisJCQkgKiBMYXN0IHJlY2VpdmVkIHBhY2tldCBudW1iZXIuIFRoZSBmaXJzdAorCQkJICogTlVNX1JYX0RBVEFfUVVFVUVTIGNvdW50ZXJzIGFyZSB1c2VkIHdpdGggRGF0YQorCQkJICogZnJhbWVzIGFuZCB0aGUgbGFzdCBjb3VudGVyIGlzIHVzZWQgd2l0aCBSb2J1c3QKKwkJCSAqIE1hbmFnZW1lbnQgZnJhbWVzLgorCQkJICovCisJCQl1OCByeF9wbltOVU1fUlhfREFUQV9RVUVVRVMgKyAxXVs2XTsKIAkJCXN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm07CiAJCQl1MzIgcmVwbGF5czsgLyogZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cyAqLwogCQkJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KQEAgLTE0Nyw3ICsxMzUsOCBAQAogdm9pZCBpZWVlODAyMTFfa2V5X2xpbmsoc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSwKIAkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJc3RydWN0IHN0YV9pbmZvICpzdGEpOwotdm9pZCBpZWVlODAyMTFfa2V5X2ZyZWUoc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSk7Cit2b2lkIGllZWU4MDIxMV9rZXlfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkpOwogdm9pZCBpZWVlODAyMTFfc2V0X2RlZmF1bHRfa2V5KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBpbnQgaWR4KTsKIHZvaWQgaWVlZTgwMjExX3NldF9kZWZhdWx0X21nbXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICBpbnQgaWR4KTsKQEAgLTE1NSw2ICsxNDQsNCBAQAogdm9pZCBpZWVlODAyMTFfZW5hYmxlX2tleXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfZGlzYWJsZV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIAotdm9pZCBpZWVlODAyMTFfa2V5X3RvZG8odm9pZCk7Ci0KICNlbmRpZiAvKiBJRUVFODAyMTFfS0VZX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tYWluLmMgYi9uZXQvbWFjODAyMTEvbWFpbi5jCmluZGV4IDIyYTM4NGQuLjdjYzRmOTEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKKysrIGIvbmV0L21hYzgwMjExL21haW4uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvc19wYXJhbXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KIApAQCAtMTA2LDEyICsxMDcsMTUgQEAKIAlpZiAoc2Nhbl9jaGFuKSB7CiAJCWNoYW4gPSBzY2FuX2NoYW47CiAJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9OT19IVDsKKwkJbG9jYWwtPmh3LmNvbmYuZmxhZ3MgfD0gSUVFRTgwMjExX0NPTkZfT0ZGQ0hBTk5FTDsKIAl9IGVsc2UgaWYgKGxvY2FsLT50bXBfY2hhbm5lbCkgewogCQljaGFuID0gc2Nhbl9jaGFuID0gbG9jYWwtPnRtcF9jaGFubmVsOwogCQljaGFubmVsX3R5cGUgPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZTsKKwkJbG9jYWwtPmh3LmNvbmYuZmxhZ3MgfD0gSUVFRTgwMjExX0NPTkZfT0ZGQ0hBTk5FTDsKIAl9IGVsc2UgewogCQljaGFuID0gbG9jYWwtPm9wZXJfY2hhbm5lbDsKIAkJY2hhbm5lbF90eXBlID0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZTsKKwkJbG9jYWwtPmh3LmNvbmYuZmxhZ3MgJj0gfklFRUU4MDIxMV9DT05GX09GRkNIQU5ORUw7CiAJfQogCiAJaWYgKGNoYW4gIT0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbCB8fApAQCAtMjU5LDcgKzI2Myw2IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSAoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqKSBkYXRhOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKnJhX3RpZDsKIAogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5za2JfcXVldWUpKSB8fAogCSAgICAgICAoc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5za2JfcXVldWVfdW5yZWxpYWJsZSkpKSB7CkBAIC0yNzQsMTggKzI3Nyw2IEBACiAJCQlza2ItPnBrdF90eXBlID0gMDsKIAkJCWllZWU4MDIxMV90eF9zdGF0dXMobG9jYWxfdG9faHcobG9jYWwpLCBza2IpOwogCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX0RFTEJBX01TRzoKLQkJCXJhX3RpZCA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhX3RpZCAqKSAmc2tiLT5jYjsKLQkJCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiKHJhX3RpZC0+dmlmLCByYV90aWQtPnJhLAotCQkJCQkJcmFfdGlkLT50aWQpOwotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX0FEREJBX01TRzoKLQkJCXJhX3RpZCA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhX3RpZCAqKSAmc2tiLT5jYjsKLQkJCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYihyYV90aWQtPnZpZiwgcmFfdGlkLT5yYSwKLQkJCQkJCSByYV90aWQtPnRpZCk7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlicmVhayA7CiAJCWRlZmF1bHQ6CiAJCQlXQVJOKDEsICJtYWM4MDIxMTogUGFja2V0IGlzIG9mIHVua25vd24gdHlwZSAlZFxuIiwKIAkJCSAgICAgc2tiLT5wa3RfdHlwZSk7CkBAIC0zMjksNiArMzIwLDc2IEBACiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+aWZsaXN0X210eCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSU5FVAorc3RhdGljIGludCBpZWVlODAyMTFfaWZhX2NoYW5nZWQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgdW5zaWduZWQgbG9uZyBkYXRhLCB2b2lkICphcmcpCit7CisJc3RydWN0IGluX2lmYWRkciAqaWZhID0gYXJnOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KKwkJY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsLAorCQkJICAgICBpZmFfbm90aWZpZXIpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaWZhLT5pZmFfZGV2LT5kZXY7CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IG5kZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IGluX2RldmljZSAqaWRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21hbmFnZWQgKmlmbWdkOworCWludCBjID0gMDsKKworCWlmICghbmV0aWZfcnVubmluZyhuZGV2KSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogTWFrZSBzdXJlIGl0J3Mgb3VyIGludGVyZmFjZSB0aGF0IGdvdCBjaGFuZ2VkICovCisJaWYgKCF3ZGV2KQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlpZiAod2Rldi0+d2lwaHkgIT0gbG9jYWwtPmh3LndpcGh5KQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKG5kZXYpOworCWJzc19jb25mID0gJnNkYXRhLT52aWYuYnNzX2NvbmY7CisKKwkvKiBBUlAgZmlsdGVyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIG1hbmFnZWQgbW9kZSAqLworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJaWRldiA9IHNkYXRhLT5kZXYtPmlwX3B0cjsKKwlpZiAoIWlkZXYpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWlmbWdkID0gJnNkYXRhLT51Lm1nZDsKKwltdXRleF9sb2NrKCZpZm1nZC0+bXR4KTsKKworCS8qIENvcHkgdGhlIGFkZHJlc3NlcyB0byB0aGUgYnNzX2NvbmYgbGlzdCAqLworCWlmYSA9IGlkZXYtPmlmYV9saXN0OworCXdoaWxlIChjIDwgSUVFRTgwMjExX0JTU19BUlBfQUREUl9MSVNUX0xFTiAmJiBpZmEpIHsKKwkJYnNzX2NvbmYtPmFycF9hZGRyX2xpc3RbY10gPSBpZmEtPmlmYV9hZGRyZXNzOworCQlpZmEgPSBpZmEtPmlmYV9uZXh0OworCQljKys7CisJfQorCisJLyogSWYgbm90IGFsbCBhZGRyZXNzZXMgZml0IHRoZSBsaXN0LCBkaXNhYmxlIGZpbHRlcmluZyAqLworCWlmIChpZmEpIHsKKwkJc2RhdGEtPmFycF9maWx0ZXJfc3RhdGUgPSBmYWxzZTsKKwkJYyA9IDA7CisJfSBlbHNlIHsKKwkJc2RhdGEtPmFycF9maWx0ZXJfc3RhdGUgPSB0cnVlOworCX0KKwlic3NfY29uZi0+YXJwX2FkZHJfY250ID0gYzsKKworCS8qIENvbmZpZ3VyZSBkcml2ZXIgb25seSBpZiBhc3NvY2lhdGVkICovCisJaWYgKGlmbWdkLT5hc3NvY2lhdGVkKSB7CisJCWJzc19jb25mLT5hcnBfZmlsdGVyX2VuYWJsZWQgPSBzZGF0YS0+YXJwX2ZpbHRlcl9zdGF0ZTsKKwkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsCisJCQkJCQkgQlNTX0NIQU5HRURfQVJQX0ZJTFRFUik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpZm1nZC0+bXR4KTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKyNlbmRpZgorCiBzdHJ1Y3QgaWVlZTgwMjExX2h3ICppZWVlODAyMTFfYWxsb2NfaHcoc2l6ZV90IHByaXZfZGF0YV9sZW4sCiAJCQkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzICpvcHMpCiB7CkBAIC0zOTYsNyArNDU3LDcgQEAKIAltdXRleF9pbml0KCZsb2NhbC0+aWZsaXN0X210eCk7CiAJbXV0ZXhfaW5pdCgmbG9jYWwtPnNjYW5fbXR4KTsKIAotCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+a2V5X2xvY2spOworCW11dGV4X2luaXQoJmxvY2FsLT5rZXlfbXR4KTsKIAlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPmZpbHRlcl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2spOwogCkBAIC00MTksOCArNDgwLDEwIEBACiAKIAlzdGFfaW5mb19pbml0KGxvY2FsKTsKIAotCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTUFYX1FVRVVFUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTUFYX1FVRVVFUzsgaSsrKSB7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5wZW5kaW5nW2ldKTsKKwkJYXRvbWljX3NldCgmbG9jYWwtPmFnZ19xdWV1ZV9zdG9wW2ldLCAwKTsKKwl9CiAJdGFza2xldF9pbml0KCZsb2NhbC0+dHhfcGVuZGluZ190YXNrbGV0LCBpZWVlODAyMTFfdHhfcGVuZGluZywKIAkJICAgICAodW5zaWduZWQgbG9uZylsb2NhbCk7CiAKQEAgLTQzMSw4ICs0OTQsNiBAQAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5za2JfcXVldWUpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5za2JfcXVldWVfdW5yZWxpYWJsZSk7CiAKLQlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPmFtcGR1X2xvY2spOwotCiAJcmV0dXJuIGxvY2FsX3RvX2h3KGxvY2FsKTsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2FsbG9jX2h3KTsKQEAgLTU3MiwxOCArNjMzLDE2IEBACiAKIAlsb2NhbC0+aHcuY29uZi5saXN0ZW5faW50ZXJ2YWwgPSBsb2NhbC0+aHcubWF4X2xpc3Rlbl9pbnRlcnZhbDsKIAotCWxvY2FsLT5ody5jb25mLmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQgPSAtMTsKKwlsb2NhbC0+ZHluYW1pY19wc19mb3JjZWRfdGltZW91dCA9IC0xOwogCiAJcmVzdWx0ID0gc3RhX2luZm9fc3RhcnQobG9jYWwpOwogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIGZhaWxfc3RhX2luZm87CiAKIAlyZXN1bHQgPSBpZWVlODAyMTFfd2VwX2luaXQobG9jYWwpOwotCWlmIChyZXN1bHQgPCAwKSB7CisJaWYgKHJlc3VsdCA8IDApCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgd2VwOiAlZFxuIiwKIAkJICAgICAgIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSwgcmVzdWx0KTsKLQkJZ290byBmYWlsX3dlcDsKLQl9CiAKIAlydG5sX2xvY2soKTsKIApAQCAtNjEyLDIxICs2NzEsMzAgQEAKIAkJaWVlZTgwMjExX21heF9uZXR3b3JrX2xhdGVuY3k7CiAJcmVzdWx0ID0gcG1fcW9zX2FkZF9ub3RpZmllcihQTV9RT1NfTkVUV09SS19MQVRFTkNZLAogCQkJCSAgICAgJmxvY2FsLT5uZXR3b3JrX2xhdGVuY3lfbm90aWZpZXIpOwotCiAJaWYgKHJlc3VsdCkgewogCQlydG5sX2xvY2soKTsKIAkJZ290byBmYWlsX3BtX3FvczsKIAl9CiAKKyNpZmRlZiBDT05GSUdfSU5FVAorCWxvY2FsLT5pZmFfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGllZWU4MDIxMV9pZmFfY2hhbmdlZDsKKwlyZXN1bHQgPSByZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmbG9jYWwtPmlmYV9ub3RpZmllcik7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2lmYTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiAKKyBmYWlsX2lmYToKKwlwbV9xb3NfcmVtb3ZlX25vdGlmaWVyKFBNX1FPU19ORVRXT1JLX0xBVEVOQ1ksCisJCQkgICAgICAgJmxvY2FsLT5uZXR3b3JrX2xhdGVuY3lfbm90aWZpZXIpOworCXJ0bmxfbG9jaygpOwogIGZhaWxfcG1fcW9zOgogCWllZWU4MDIxMV9sZWRfZXhpdChsb2NhbCk7CiAJaWVlZTgwMjExX3JlbW92ZV9pbnRlcmZhY2VzKGxvY2FsKTsKICBmYWlsX3JhdGU6CiAJcnRubF91bmxvY2soKTsKIAlpZWVlODAyMTFfd2VwX2ZyZWUobG9jYWwpOwotIGZhaWxfd2VwOgogCXN0YV9pbmZvX3N0b3AobG9jYWwpOwogIGZhaWxfc3RhX2luZm86CiAJZGVzdHJveV93b3JrcXVldWUobG9jYWwtPndvcmtxdWV1ZSk7CkBAIC02NDcsNiArNzE1LDkgQEAKIAogCXBtX3Fvc19yZW1vdmVfbm90aWZpZXIoUE1fUU9TX05FVFdPUktfTEFURU5DWSwKIAkJCSAgICAgICAmbG9jYWwtPm5ldHdvcmtfbGF0ZW5jeV9ub3RpZmllcik7CisjaWZkZWYgQ09ORklHX0lORVQKKwl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZsb2NhbC0+aWZhX25vdGlmaWVyKTsKKyNlbmRpZgogCiAJcnRubF9sb2NrKCk7CiAKQEAgLTcwNCw2ICs3NzUsMTAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcmV0ID0gcmM4MDIxMV9taW5zdHJlbF9odF9pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbWluc3RyZWw7CisKIAlyZXQgPSByYzgwMjExX3BpZF9pbml0KCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfcGlkOwpAQCAtNzE2LDYgKzc5MSw4IEBACiAgZXJyX25ldGRldjoKIAlyYzgwMjExX3BpZF9leGl0KCk7CiAgZXJyX3BpZDoKKwlyYzgwMjExX21pbnN0cmVsX2h0X2V4aXQoKTsKKyBlcnJfbWluc3RyZWw6CiAJcmM4MDIxMV9taW5zdHJlbF9leGl0KCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzI0LDYgKzgwMSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2V4aXQodm9pZCkKIHsKIAlyYzgwMjExX3BpZF9leGl0KCk7CisJcmM4MDIxMV9taW5zdHJlbF9odF9leGl0KCk7CiAJcmM4MDIxMV9taW5zdHJlbF9leGl0KCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2guYyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKaW5kZXggYmRlODEwMy4uYzhhNGYxOSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2guYworKysgYi9uZXQvbWFjODAyMTEvbWVzaC5jCkBAIC01NCw3ICs1NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmaWZtc2gtPndvcmspOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiB9CiAKIC8qKgpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmaWZtc2gtPndvcmspOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3BhdGhfcm9vdF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC0zNjIsNyArMzYyLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZpZm1zaC0+d29yayk7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfbWVzaF9yb290X3NldHVwKHN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqaWZtc2gpCkBAIC00ODQsOSArNDg0LDYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CiAKLQkvKiBtaWdodCByZXN0YXJ0IHRoZSB0aW1lciBidXQgdGhhdCBkb2Vzbid0IG1hdHRlciAqLwotCWNhbmNlbF93b3JrX3N5bmMoJmlmbXNoLT53b3JrKTsKLQogCS8qIHVzZSBhdG9taWMgYml0b3BzIGluIGNhc2UgYm90aCB0aW1lcnMgZmlyZSBhdCB0aGUgc2FtZSB0aW1lICovCiAKIAlpZiAoZGVsX3RpbWVyX3N5bmMoJmlmbXNoLT5ob3VzZWtlZXBpbmdfdGltZXIpKQpAQCAtNTE4LDcgKzUxNSw3IEBACiAKIAlzZXRfYml0KE1FU0hfV09SS19IT1VTRUtFRVBJTkcsICZpZm1zaC0+d3JrcV9mbGFncyk7CiAJaWVlZTgwMjExX21lc2hfcm9vdF9zZXR1cChpZm1zaCk7Ci0JaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJmlmbXNoLT53b3JrKTsKKwlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmc2RhdGEtPndvcmspOwogCXNkYXRhLT52aWYuYnNzX2NvbmYuYmVhY29uX2ludCA9IE1FU0hfREVGQVVMVF9CRUFDT05fSU5URVJWQUw7CiAJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0JFQUNPTiB8CiAJCQkJCQlCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCB8CkBAIC01MzYsMTYgKzUzMyw3IEBACiAJICogd2hldGhlciB0aGUgaW50ZXJmYWNlIGlzIHJ1bm5pbmcsIHdoaWNoLCBhdCB0aGlzIHBvaW50LAogCSAqIGl0IG5vIGxvbmdlciBpcy4KIAkgKi8KLQljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+dS5tZXNoLndvcmspOwotCi0JLyoKLQkgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBkb3duLgotCSAqIENhbGwgc3luY2hyb25pemVfcmN1KCkgdG8gd2FpdCBmb3IgdGhlIFJYIHBhdGgKLQkgKiBzaG91bGQgaXQgYmUgdXNpbmcgdGhlIGludGVyZmFjZSBhbmQgZW5xdWV1aW5nCi0JICogZnJhbWVzIGF0IHRoaXMgdmVyeSB0aW1lIG9uIGFub3RoZXIgQ1BVLgotCSAqLwotCXJjdV9iYXJyaWVyKCk7IC8qIFdhaXQgZm9yIFJYIHBhdGggYW5kIGNhbGxfcmN1KCkncyAqLwotCXNrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPnUubWVzaC5za2JfcXVldWUpOworCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT53b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX21lc2hfcnhfYmNuX3ByZXNwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtNjA4LDggKzU5Niw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfbWVzaF9yeF9xdWV1ZWRfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordm9pZCBpZWVlODAyMTFfbWVzaF9yeF9xdWV1ZWRfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaDsKQEAgLTYzMiwyNiArNjIwLDExIEBACiAJCWllZWU4MDIxMV9tZXNoX3J4X21nbXRfYWN0aW9uKHNkYXRhLCBtZ210LCBza2ItPmxlbiwgcnhfc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQotCi0Ja2ZyZWVfc2tiKHNrYik7CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQordm9pZCBpZWVlODAyMTFfbWVzaF93b3JrKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUubWVzaC53b3JrKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQotCQlyZXR1cm47Ci0KLQlpZiAobG9jYWwtPnNjYW5uaW5nKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZpZm1zaC0+c2tiX3F1ZXVlKSkpCi0JCWllZWU4MDIxMV9tZXNoX3J4X3F1ZXVlZF9tZ210KHNkYXRhLCBza2IpOwogCiAJaWYgKGlmbXNoLT5wcmVxX3F1ZXVlX2xlbiAmJgogCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsCkBAIC02NzgsNyArNjUxLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkKIAkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpCi0JCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmc2RhdGEtPnUubWVzaC53b3JrKTsKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKQEAgLTY4NiwxMSArNjU5LDkgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CiAKLQlJTklUX1dPUksoJmlmbXNoLT53b3JrLCBpZWVlODAyMTFfbWVzaF93b3JrKTsKIAlzZXR1cF90aW1lcigmaWZtc2gtPmhvdXNla2VlcGluZ190aW1lciwKIAkJICAgIGllZWU4MDIxMV9tZXNoX2hvdXNla2VlcGluZ190aW1lciwKIAkJICAgICh1bnNpZ25lZCBsb25nKSBzZGF0YSk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2RhdGEtPnUubWVzaC5za2JfcXVldWUpOwogCiAJaWZtc2gtPm1zaGNmZy5kb3QxMU1lc2hSZXRyeVRpbWVvdXQgPSBNRVNIX1JFVF9UOwogCWlmbXNoLT5tc2hjZmcuZG90MTFNZXNoQ29uZmlybVRpbWVvdXQgPSBNRVNIX0NPTkZfVDsKQEAgLTczMSwyOSArNzAyLDMgQEAKIAlJTklUX0xJU1RfSEVBRCgmaWZtc2gtPnByZXFfcXVldWUubGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmlmbXNoLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CiB9Ci0KLWllZWU4MDIxMV9yeF9yZXN1bHQKLWllZWU4MDIxMV9tZXNoX3J4X21nbXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1MTYgZmM7Ci0KLQlpZiAoc2tiLT5sZW4gPCAyNCkKLQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLQotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlmYyA9IGxlMTZfdG9fY3B1KG1nbXQtPmZyYW1lX2NvbnRyb2wpOwotCi0Jc3dpdGNoIChmYyAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCQlza2JfcXVldWVfdGFpbCgmaWZtc2gtPnNrYl9xdWV1ZSwgc2tiKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJmlmbXNoLT53b3JrKTsKLQkJcmV0dXJuIFJYX1FVRVVFRDsKLQl9Ci0KLQlyZXR1cm4gUlhfQ09OVElOVUU7Ci19CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5oIGIvbmV0L21hYzgwMjExL21lc2guaAppbmRleCBjODgwODdmLi5lYmQzZjFkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5oCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmgKQEAgLTIzNyw4ICsyMzcsNiBAQAogCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm8sIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBpZWVlODAyMTFzX3N0b3Aodm9pZCk7CiB2b2lkIGllZWU4MDIxMV9tZXNoX2luaXRfc2RhdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwotaWVlZTgwMjExX3J4X3Jlc3VsdAotaWVlZTgwMjExX21lc2hfcnhfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIGllZWU4MDIxMV9zdGFydF9tZXNoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHZvaWQgaWVlZTgwMjExX3N0b3BfbWVzaChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIGllZWU4MDIxMV9tZXNoX3Jvb3Rfc2V0dXAoc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKaW5kZXggMDcwNTAxOC4uODI5ZTA4YSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwpAQCAtODA1LDE0ICs4MDUsMTQgQEAKIAlzcGluX3VubG9jaygmaWZtc2gtPm1lc2hfcHJlcV9xdWV1ZV9sb2NrKTsKIAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGlmbXNoLT5sYXN0X3ByZXEgKyBtaW5fcHJlcV9pbnRfamlmZihzZGF0YSkpKQotCQlpZWVlODAyMTFfcXVldWVfd29yaygmc2RhdGEtPmxvY2FsLT5odywgJmlmbXNoLT53b3JrKTsKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJnNkYXRhLT5sb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiAKIAllbHNlIGlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBpZm1zaC0+bGFzdF9wcmVxKSkgewogCQkvKiBhdm9pZCBsb25nIHdhaXQgaWYgZGlkIG5vdCBzZW5kIHByZXFzIGZvciBhIGxvbmcgdGltZQogCQkgKiBhbmQgamlmZmllcyB3cmFwcGVkIGFyb3VuZAogCQkgKi8KIAkJaWZtc2gtPmxhc3RfcHJlcSA9IGppZmZpZXMgLSBtaW5fcHJlcV9pbnRfamlmZihzZGF0YSkgLSAxOwotCQlpZWVlODAyMTFfcXVldWVfd29yaygmc2RhdGEtPmxvY2FsLT5odywgJmlmbXNoLT53b3JrKTsKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJnNkYXRhLT5sb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiAJfSBlbHNlCiAJCW1vZF90aW1lcigmaWZtc2gtPm1lc2hfcGF0aF90aW1lciwgaWZtc2gtPmxhc3RfcHJlcSArCiAJCQkJCQltaW5fcHJlcV9pbnRfamlmZihzZGF0YSkpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCmluZGV4IDE4MWZmZDYuLjM0OWU0NjYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKQEAgLTMxNSw3ICszMTUsNyBAQAogCXJlYWRfdW5sb2NrKCZwYXRodGJsX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoZ3JvdykgewogCQlzZXRfYml0KE1FU0hfV09SS19HUk9XX01QQVRIX1RBQkxFLCAgJmlmbXNoLT53cmtxX2ZsYWdzKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJmlmbXNoLT53b3JrKTsKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIAl9CiAJcmV0dXJuIDA7CiAKQEAgLTQyNSw3ICs0MjUsNyBAQAogCXJlYWRfdW5sb2NrKCZwYXRodGJsX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoZ3JvdykgewogCQlzZXRfYml0KE1FU0hfV09SS19HUk9XX01QUF9UQUJMRSwgICZpZm1zaC0+d3JrcV9mbGFncyk7Ci0JCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZpZm1zaC0+d29yayk7CisJCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CiAJfQogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jIGIvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYwppbmRleCAzY2Q1ZjdiLi5lYTEzYTgwIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMKQEAgLTY1LDcgKzY1LDYgQEAKIHsKIAlhdG9taWNfaW5jKCZzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmVzdGFiX3BsaW5rcyk7CiAJbWVzaF9hY2NlcHRfcGxpbmtzX3VwZGF0ZShzZGF0YSk7Ci0JaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0JFQUNPTik7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTczLDcgKzcyLDYgQEAKIHsKIAlhdG9taWNfZGVjKCZzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmVzdGFiX3BsaW5rcyk7CiAJbWVzaF9hY2NlcHRfcGxpbmtzX3VwZGF0ZShzZGF0YSk7Ci0JaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0JFQUNPTik7CiB9CiAKIC8qKgpAQCAtMTE1LDcgKzExMyw3IEBACiB9CiAKIC8qKgotICogbWVzaF9wbGlua19kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSBtZXNoIHBlZXIgbGluaworICogX19tZXNoX3BsaW5rX2RlYWN0aXZhdGUgLSBkZWFjdGl2YXRlIG1lc2ggcGVlciBsaW5rCiAgKgogICogQHN0YTogbWVzaCBwZWVyIGxpbmsgdG8gZGVhY3RpdmF0ZQogICoKQEAgLTEyMywxOCArMTIxLDIzIEBACiAgKgogICogTG9ja2luZzogdGhlIGNhbGxlciBtdXN0IGhvbGQgc3RhLT5sb2NrCiAgKi8KLXN0YXRpYyB2b2lkIF9fbWVzaF9wbGlua19kZWFjdGl2YXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQorc3RhdGljIGJvb2wgX19tZXNoX3BsaW5rX2RlYWN0aXZhdGUoc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOworCWJvb2wgZGVhY3RpdmF0ZWQgPSBmYWxzZTsKIAotCWlmIChzdGEtPnBsaW5rX3N0YXRlID09IFBMSU5LX0VTVEFCKQorCWlmIChzdGEtPnBsaW5rX3N0YXRlID09IFBMSU5LX0VTVEFCKSB7CiAJCW1lc2hfcGxpbmtfZGVjX2VzdGFiX2NvdW50KHNkYXRhKTsKKwkJZGVhY3RpdmF0ZWQgPSB0cnVlOworCX0KIAlzdGEtPnBsaW5rX3N0YXRlID0gUExJTktfQkxPQ0tFRDsKIAltZXNoX3BhdGhfZmx1c2hfYnlfbmV4dGhvcChzdGEpOworCisJcmV0dXJuIGRlYWN0aXZhdGVkOwogfQogCiAvKioKLSAqIF9fbWVzaF9wbGlua19kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSBtZXNoIHBlZXIgbGluaworICogbWVzaF9wbGlua19kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSBtZXNoIHBlZXIgbGluawogICoKICAqIEBzdGE6IG1lc2ggcGVlciBsaW5rIHRvIGRlYWN0aXZhdGUKICAqCkBAIC0xNDIsOSArMTQ1LDE1IEBACiAgKi8KIHZvaWQgbWVzaF9wbGlua19kZWFjdGl2YXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogeworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKKwlib29sIGRlYWN0aXZhdGVkOworCiAJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCV9fbWVzaF9wbGlua19kZWFjdGl2YXRlKHN0YSk7CisJZGVhY3RpdmF0ZWQgPSBfX21lc2hfcGxpbmtfZGVhY3RpdmF0ZShzdGEpOwogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCisJaWYgKGRlYWN0aXZhdGVkKQorCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OKTsKIH0KIAogc3RhdGljIGludCBtZXNoX3BsaW5rX2ZyYW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtMzgxLDEwICszOTAsMTYgQEAKIAogdm9pZCBtZXNoX3BsaW5rX2Jsb2NrKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogeworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKKwlib29sIGRlYWN0aXZhdGVkOworCiAJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCV9fbWVzaF9wbGlua19kZWFjdGl2YXRlKHN0YSk7CisJZGVhY3RpdmF0ZWQgPSBfX21lc2hfcGxpbmtfZGVhY3RpdmF0ZShzdGEpOwogCXN0YS0+cGxpbmtfc3RhdGUgPSBQTElOS19CTE9DS0VEOwogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCisJaWYgKGRlYWN0aXZhdGVkKQorCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OKTsKIH0KIAogCkBAIC0zOTcsNiArNDEyLDcgQEAKIAllbnVtIHBsaW5rX2V2ZW50IGV2ZW50OwogCWVudW0gcGxpbmtfZnJhbWVfdHlwZSBmdHlwZTsKIAlzaXplX3QgYmFzZWxlbjsKKwlib29sIGRlYWN0aXZhdGVkOwogCXU4IGllX2xlbjsKIAl1OCAqYmFzZWFkZHI7CiAJX19sZTE2IHBsaWQsIGxsaWQsIHJlYXNvbjsKQEAgLTY1MSw4ICs2NjcsOSBAQAogCQljYXNlIENORl9BQ1BUOgogCQkJZGVsX3RpbWVyKCZzdGEtPnBsaW5rX3RpbWVyKTsKIAkJCXN0YS0+cGxpbmtfc3RhdGUgPSBQTElOS19FU1RBQjsKLQkJCW1lc2hfcGxpbmtfaW5jX2VzdGFiX2NvdW50KHNkYXRhKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQkJbWVzaF9wbGlua19pbmNfZXN0YWJfY291bnQoc2RhdGEpOworCQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0JFQUNPTik7CiAJCQltcGxfZGJnKCJNZXNoIHBsaW5rIHdpdGggJXBNIEVTVEFCTElTSEVEXG4iLAogCQkJCXN0YS0+c3RhLmFkZHIpOwogCQkJYnJlYWs7CkBAIC02ODQsOCArNzAxLDkgQEAKIAkJY2FzZSBPUE5fQUNQVDoKIAkJCWRlbF90aW1lcigmc3RhLT5wbGlua190aW1lcik7CiAJCQlzdGEtPnBsaW5rX3N0YXRlID0gUExJTktfRVNUQUI7Ci0JCQltZXNoX3BsaW5rX2luY19lc3RhYl9jb3VudChzZGF0YSk7CiAJCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKwkJCW1lc2hfcGxpbmtfaW5jX2VzdGFiX2NvdW50KHNkYXRhKTsKKwkJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9CRUFDT04pOwogCQkJbXBsX2RiZygiTWVzaCBwbGluayB3aXRoICVwTSBFU1RBQkxJU0hFRFxuIiwKIAkJCQlzdGEtPnN0YS5hZGRyKTsKIAkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NPTkZJUk0sIHN0YS0+c3RhLmFkZHIsIGxsaWQsCkBAIC03MDIsMTEgKzcyMCwxMyBAQAogCQljYXNlIENMU19BQ1BUOgogCQkJcmVhc29uID0gY3B1X3RvX2xlMTYoTUVTSF9DTE9TRV9SQ1ZEKTsKIAkJCXN0YS0+cmVhc29uID0gcmVhc29uOwotCQkJX19tZXNoX3BsaW5rX2RlYWN0aXZhdGUoc3RhKTsKKwkJCWRlYWN0aXZhdGVkID0gX19tZXNoX3BsaW5rX2RlYWN0aXZhdGUoc3RhKTsKIAkJCXN0YS0+cGxpbmtfc3RhdGUgPSBQTElOS19IT0xESU5HOwogCQkJbGxpZCA9IHN0YS0+bGxpZDsKIAkJCW1vZF9wbGlua190aW1lcihzdGEsIGRvdDExTWVzaEhvbGRpbmdUaW1lb3V0KHNkYXRhKSk7CiAJCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKwkJCWlmIChkZWFjdGl2YXRlZCkKKwkJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OKTsKIAkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NMT1NFLCBzdGEtPnN0YS5hZGRyLCBsbGlkLAogCQkJCQkgICAgcGxpZCwgcmVhc29uKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21sbWUuYyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKaW5kZXggZjgwM2Y4Yi4uYjZjMTYzYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC00NzgsNiArNDc4LDM5IEBACiAJfQogfQogCit2b2lkIGllZWU4MDIxMV9lbmFibGVfZHluX3BzKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmbG9jYWwtPmh3LmNvbmY7CisKKwlXQVJOX09OKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJCSEobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1NVUFBPUlRTX1BTKSB8fAorCQkobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFMpKTsKKworCWxvY2FsLT5kaXNhYmxlX2R5bmFtaWNfcHMgPSBmYWxzZTsKKwljb25mLT5keW5hbWljX3BzX3RpbWVvdXQgPSBsb2NhbC0+ZHluYW1pY19wc191c2VyX3RpbWVvdXQ7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9lbmFibGVfZHluX3BzKTsKKwordm9pZCBpZWVlODAyMTFfZGlzYWJsZV9keW5fcHMoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZsb2NhbC0+aHcuY29uZjsKKworCVdBUk5fT04oc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJIShsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMpIHx8CisJCShsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19QUykpOworCisJbG9jYWwtPmRpc2FibGVfZHluYW1pY19wcyA9IHRydWU7CisJY29uZi0+ZHluYW1pY19wc190aW1lb3V0ID0gMDsKKwlkZWxfdGltZXJfc3luYygmbG9jYWwtPmR5bmFtaWNfcHNfdGltZXIpOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsCisJCQkgICAgICZsb2NhbC0+ZHluYW1pY19wc19lbmFibGVfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9kaXNhYmxlX2R5bl9wcyk7CisKIC8qIHBvd2Vyc2F2ZSAqLwogc3RhdGljIHZvaWQgaWVlZTgwMjExX2VuYWJsZV9wcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKQEAgLTU1Myw2ICs1ODYsNyBAQAogCSAgICBmb3VuZC0+dS5tZ2QuYXNzb2NpYXRlZC0+YmVhY29uX2llcyAmJgogCSAgICAhKGZvdW5kLT51Lm1nZC5mbGFncyAmIChJRUVFODAyMTFfU1RBX0JFQUNPTl9QT0xMIHwKIAkJCQkgICAgSUVFRTgwMjExX1NUQV9DT05ORUNUSU9OX1BPTEwpKSkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmbG9jYWwtPmh3LmNvbmY7CiAJCXMzMiBiZWFjb25pbnRfdXM7CiAKIAkJaWYgKGxhdGVuY3kgPCAwKQpAQCAtNTYxLDI1ICs1OTUsMjQgQEAKIAkJYmVhY29uaW50X3VzID0gaWVlZTgwMjExX3R1X3RvX3VzZWMoCiAJCQkJCWZvdW5kLT52aWYuYnNzX2NvbmYuYmVhY29uX2ludCk7CiAKLQkJdGltZW91dCA9IGxvY2FsLT5ody5jb25mLmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQ7CisJCXRpbWVvdXQgPSBsb2NhbC0+ZHluYW1pY19wc19mb3JjZWRfdGltZW91dDsKIAkJaWYgKHRpbWVvdXQgPCAwKSB7CiAJCQkvKgorCQkJICogR28gdG8gZnVsbCBQU00gaWYgdGhlIHVzZXIgY29uZmlndXJlcyBhIHZlcnkgbG93CisJCQkgKiBsYXRlbmN5IHJlcXVpcmVtZW50LgogCQkJICogVGhlIDIgc2Vjb25kIHZhbHVlIGlzIHRoZXJlIGZvciBjb21wYXRpYmlsaXR5IHVudGlsCiAJCQkgKiB0aGUgUE1fUU9TX05FVFdPUktfTEFURU5DWSBpcyBjb25maWd1cmVkIHdpdGggcmVhbAogCQkJICogdmFsdWVzLgogCQkJICovCi0JCQlpZiAobGF0ZW5jeSA9PSAyMDAwMDAwMDAwKQotCQkJCXRpbWVvdXQgPSAxMDA7Ci0JCQllbHNlIGlmIChsYXRlbmN5IDw9IDUwMDAwKQotCQkJCXRpbWVvdXQgPSAzMDA7Ci0JCQllbHNlIGlmIChsYXRlbmN5IDw9IDEwMDAwMCkKLQkJCQl0aW1lb3V0ID0gMTAwOwotCQkJZWxzZSBpZiAobGF0ZW5jeSA8PSA1MDAwMDApCi0JCQkJdGltZW91dCA9IDUwOwotCQkJZWxzZQorCQkJaWYgKGxhdGVuY3kgPiAxOTAwMDAwMDAwICYmIGxhdGVuY3kgIT0gMjAwMDAwMDAwMCkKIAkJCQl0aW1lb3V0ID0gMDsKKwkJCWVsc2UKKwkJCQl0aW1lb3V0ID0gMTAwOwogCQl9Ci0JCWxvY2FsLT5ody5jb25mLmR5bmFtaWNfcHNfdGltZW91dCA9IHRpbWVvdXQ7CisJCWxvY2FsLT5keW5hbWljX3BzX3VzZXJfdGltZW91dCA9IHRpbWVvdXQ7CisJCWlmICghbG9jYWwtPmRpc2FibGVfZHluYW1pY19wcykKKwkJCWNvbmYtPmR5bmFtaWNfcHNfdGltZW91dCA9CisJCQkJbG9jYWwtPmR5bmFtaWNfcHNfdXNlcl90aW1lb3V0OwogCiAJCWlmIChiZWFjb25pbnRfdXMgPiBsYXRlbmN5KSB7CiAJCQlsb2NhbC0+cHNfc2RhdGEgPSBOVUxMOwpAQCAtNjY1LDEwICs2OTgsMTEgQEAKIAogLyogTUxNRSAqLwogc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV93bW1fcGFyYW1zKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9tYW5hZ2VkICppZm1nZCwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgdTggKndtbV9wYXJhbSwgc2l6ZV90IHdtbV9wYXJhbV9sZW4pCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwogCXNpemVfdCBsZWZ0OwogCWludCBjb3VudDsKIAl1OCAqcG9zLCB1YXBzZF9xdWV1ZXMgPSAwOwpAQCAtNzU3LDggKzc5MSw4IEBACiAJfQogCiAJLyogZW5hYmxlIFdNTSBvciBhY3RpdmF0ZSBuZXcgc2V0dGluZ3MgKi8KLQlsb2NhbC0+aHcuY29uZi5mbGFncyB8PQlJRUVFODAyMTFfQ09ORl9RT1M7Ci0JZHJ2X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1FPUyk7CisJc2RhdGEtPnZpZi5ic3NfY29uZi5xb3MgPSB0cnVlOworCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9RT1MpOwogfQogCiBzdGF0aWMgdTMyIGllZWU4MDIxMV9oYW5kbGVfYnNzX2NhcGFiaWxpdHkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC04MDYsMTEgKzg0MCwxMiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MgPSAodm9pZCAqKWNic3MtPnByaXY7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmc2RhdGEtPnZpZi5ic3NfY29uZjsKIAogCWJzc19pbmZvX2NoYW5nZWQgfD0gQlNTX0NIQU5HRURfQVNTT0M7CiAJLyogc2V0IHRpbWluZyBpbmZvcm1hdGlvbiAqLwotCXNkYXRhLT52aWYuYnNzX2NvbmYuYmVhY29uX2ludCA9IGNic3MtPmJlYWNvbl9pbnRlcnZhbDsKLQlzZGF0YS0+dmlmLmJzc19jb25mLnRpbWVzdGFtcCA9IGNic3MtPnRzZjsKKwlic3NfY29uZi0+YmVhY29uX2ludCA9IGNic3MtPmJlYWNvbl9pbnRlcnZhbDsKKwlic3NfY29uZi0+dGltZXN0YW1wID0gY2Jzcy0+dHNmOwogCiAJYnNzX2luZm9fY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UOwogCWJzc19pbmZvX2NoYW5nZWQgfD0gaWVlZTgwMjExX2hhbmRsZV9ic3NfY2FwYWJpbGl0eShzZGF0YSwKQEAgLTgzNSw3ICs4NzAsMTIgQEAKIAogCWllZWU4MDIxMV9sZWRfYXNzb2MobG9jYWwsIDEpOwogCi0Jc2RhdGEtPnZpZi5ic3NfY29uZi5hc3NvYyA9IDE7CisJaWYgKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EKQorCQlic3NfY29uZi0+ZHRpbV9wZXJpb2QgPSBic3MtPmR0aW1fcGVyaW9kOworCWVsc2UKKwkJYnNzX2NvbmYtPmR0aW1fcGVyaW9kID0gMDsKKworCWJzc19jb25mLT5hc3NvYyA9IDE7CiAJLyoKIAkgKiBGb3Igbm93IGp1c3QgYWx3YXlzIGFzayB0aGUgZHJpdmVyIHRvIHVwZGF0ZSB0aGUgYmFzaWMgcmF0ZXNldAogCSAqIHdoZW4gd2UgaGF2ZSBhc3NvY2lhdGVkLCB3ZSBhcmVuJ3QgY2hlY2tpbmcgd2hldGhlciBpdCBhY3R1YWxseQpAQCAtODQ4LDkgKzg4OCwxNSBAQAogCiAJLyogVGVsbCB0aGUgZHJpdmVyIHRvIG1vbml0b3IgY29ubmVjdGlvbiBxdWFsaXR5IChpZiBzdXBwb3J0ZWQpICovCiAJaWYgKChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfQ1FNX1JTU0kpICYmCi0JICAgIHNkYXRhLT52aWYuYnNzX2NvbmYuY3FtX3Jzc2lfdGhvbGQpCisJICAgIGJzc19jb25mLT5jcW1fcnNzaV90aG9sZCkKIAkJYnNzX2luZm9fY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9DUU07CiAKKwkvKiBFbmFibGUgQVJQIGZpbHRlcmluZyAqLworCWlmIChic3NfY29uZi0+YXJwX2ZpbHRlcl9lbmFibGVkICE9IHNkYXRhLT5hcnBfZmlsdGVyX3N0YXRlKSB7CisJCWJzc19jb25mLT5hcnBfZmlsdGVyX2VuYWJsZWQgPSBzZGF0YS0+YXJwX2ZpbHRlcl9zdGF0ZTsKKwkJYnNzX2luZm9fY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9BUlBfRklMVEVSOworCX0KKwogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBic3NfaW5mb19jaGFuZ2VkKTsKIAogCW11dGV4X2xvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKQEAgLTg5OCwxMyArOTQ0LDEzIEBACiAJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHNkYXRhLT5kZXYpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKHNkYXRhLT5kZXYpOwogCi0JcmN1X3JlYWRfbG9jaygpOworCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIGJzc2lkKTsKIAlpZiAoc3RhKSB7Ci0JCXNldF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9ESVNBU1NPQyk7CisJCXNldF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9CTE9DS19CQSk7CiAJCWllZWU4MDIxMV9zdGFfdGVhcl9kb3duX0JBX3Nlc3Npb25zKHN0YSk7CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOworCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCiAJY2hhbmdlZCB8PSBpZWVlODAyMTFfcmVzZXRfZXJwX2luZm8oc2RhdGEpOwogCkBAIC05MzIsNiArOTc4LDEyIEBACiAKIAlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBjb25maWdfY2hhbmdlZCk7CiAKKwkvKiBEaXNhYmxlIEFSUCBmaWx0ZXJpbmcgKi8KKwlpZiAoc2RhdGEtPnZpZi5ic3NfY29uZi5hcnBfZmlsdGVyX2VuYWJsZWQpIHsKKwkJc2RhdGEtPnZpZi5ic3NfY29uZi5hcnBfZmlsdGVyX2VuYWJsZWQgPSBmYWxzZTsKKwkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9BUlBfRklMVEVSOworCX0KKwogCS8qIFRoZSBCU1NJRCAobm90IHJlYWxseSBpbnRlcmVzdGluZykgYW5kIEhUIGNoYW5nZWQgKi8KIAljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0JTU0lEIHwgQlNTX0NIQU5HRURfSFQ7CiAJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGNoYW5nZWQpOwpAQCAtMTI3OSw3ICsxMzMxLDcgQEAKIAl9CiAKIAlpZiAoZWxlbXMud21tX3BhcmFtKQotCQlpZWVlODAyMTFfc3RhX3dtbV9wYXJhbXMobG9jYWwsIGlmbWdkLCBlbGVtcy53bW1fcGFyYW0sCisJCWllZWU4MDIxMV9zdGFfd21tX3BhcmFtcyhsb2NhbCwgc2RhdGEsIGVsZW1zLndtbV9wYXJhbSwKIAkJCQkJIGVsZW1zLndtbV9wYXJhbV9sZW4pOwogCWVsc2UKIAkJaWVlZTgwMjExX3NldF93bW1fZGVmYXVsdChzZGF0YSk7CkBAIC0xNTUxLDcgKzE2MDMsNyBAQAogCQlpZWVlODAyMTFfcnhfYnNzX2luZm8oc2RhdGEsIG1nbXQsIGxlbiwgcnhfc3RhdHVzLCAmZWxlbXMsCiAJCQkJICAgICAgdHJ1ZSk7CiAKLQkJaWVlZTgwMjExX3N0YV93bW1fcGFyYW1zKGxvY2FsLCBpZm1nZCwgZWxlbXMud21tX3BhcmFtLAorCQlpZWVlODAyMTFfc3RhX3dtbV9wYXJhbXMobG9jYWwsIHNkYXRhLCBlbGVtcy53bW1fcGFyYW0sCiAJCQkJCSBlbGVtcy53bW1fcGFyYW1fbGVuKTsKIAl9CiAKQEAgLTE2MzMsMzUgKzE2ODUsOCBAQAogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIH0KIAotaWVlZTgwMjExX3J4X3Jlc3VsdCBpZWVlODAyMTFfc3RhX3J4X21nbXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTE2IGZjOwotCi0JaWYgKHNrYi0+bGVuIDwgMjQpCi0JCXJldHVybiBSWF9EUk9QX01PTklUT1I7Ci0KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0JZmMgPSBsZTE2X3RvX2NwdShtZ210LT5mcmFtZV9jb250cm9sKTsKLQotCXN3aXRjaCAoZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgewotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ1RJT046Ci0JCXNrYl9xdWV1ZV90YWlsKCZzZGF0YS0+dS5tZ2Quc2tiX3F1ZXVlLCBza2IpOwotCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmc2RhdGEtPnUubWdkLndvcmspOwotCQlyZXR1cm4gUlhfUVVFVUVEOwotCX0KLQotCXJldHVybiBSWF9EUk9QX01PTklUT1I7Ci19Ci0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFfcnhfcXVldWVkX21nbXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordm9pZCBpZWVlODAyMTFfc3RhX3J4X3F1ZXVlZF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21hbmFnZWQgKmlmbWdkID0gJnNkYXRhLT51Lm1nZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzOwpAQCAtMTY5Myw0NCArMTcxOCw2IEBACiAJCQlicmVhazsKIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgogCQkJc3dpdGNoIChtZ210LT51LmFjdGlvbi5jYXRlZ29yeSkgewotCQkJY2FzZSBXTEFOX0NBVEVHT1JZX0JBQ0s6IHsKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQkJCQlpbnQgbGVuID0gc2tiLT5sZW47Ci0JCQkJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0KLQkJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBtZ210LT5zYSk7Ci0JCQkJaWYgKCFzdGEpIHsKLQkJCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQotCQkJCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuYWN0aW9uX2NvZGUpIHsKLQkJCQljYXNlIFdMQU5fQUNUSU9OX0FEREJBX1JFUToKLQkJCQkJaWYgKGxlbiA8IChJRUVFODAyMTFfTUlOX0FDVElPTl9TSVpFICsKLQkJCQkJCSAgIHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcSkpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3JlcXVlc3QobG9jYWwsIHN0YSwgbWdtdCwgbGVuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTEFOX0FDVElPTl9BRERCQV9SRVNQOgotCQkJCQlpZiAobGVuIDwgKElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKwotCQkJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcCkpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3Jlc3AobG9jYWwsIHN0YSwgbWdtdCwgbGVuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTEFOX0FDVElPTl9ERUxCQToKLQkJCQkJaWYgKGxlbiA8IChJRUVFODAyMTFfTUlOX0FDVElPTl9TSVpFICsKLQkJCQkJCSAgIHNpemVvZihtZ210LT51LmFjdGlvbi51LmRlbGJhKSkpCi0JCQkJCQlicmVhazsKLQkJCQkJaWVlZTgwMjExX3Byb2Nlc3NfZGVsYmEoc2RhdGEsIHN0YSwgbWdtdCwgbGVuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWxvY2FsX2JoX2VuYWJsZSgpOwotCQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJCWJyZWFrOwotCQkJCX0KIAkJCWNhc2UgV0xBTl9DQVRFR09SWV9TUEVDVFJVTV9NR01UOgogCQkJCWllZWU4MDIxMV9zdGFfcHJvY2Vzc19jaGFuc3dpdGNoKHNkYXRhLAogCQkJCQkJJm1nbXQtPnUuYWN0aW9uLnUuY2hhbl9zd2l0Y2guc3dfZWxlbSwKQEAgLTE3NTQsNyArMTc0MSw3IEBACiAJCWRlZmF1bHQ6CiAJCQlXQVJOKDEsICJ1bmV4cGVjdGVkOiAlZCIsIHJtYSk7CiAJCX0KLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAl9CiAKIAltdXRleF91bmxvY2soJmlmbWdkLT5tdHgpOwpAQCAtMTc2OSw3ICsxNzU2LDggQEAKIAkJCWlmICh3ay0+c2RhdGEgIT0gc2RhdGEpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICh3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19BU1NPQykKKwkJCWlmICh3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19BU1NPQyAmJgorCQkJICAgIHdrLT50eXBlICE9IElFRUU4MDIxMV9XT1JLX0FTU09DX0JFQUNPTl9XQUlUKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAobWVtY21wKG1nbXQtPmJzc2lkLCB3ay0+ZmlsdGVyX3RhLCBFVEhfQUxFTikpCkBAIC0xNzk5LDggKzE3ODcsNiBAQAogCiAJCWNmZzgwMjExX3NlbmRfZGVhdXRoKHNkYXRhLT5kZXYsICh1OCAqKW1nbXQsIHNrYi0+bGVuKTsKIAl9Ci0gb3V0OgotCWtmcmVlX3NrYihza2IpOwogfQogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTE4MTUsMzkgKzE4MDEsMTMgQEAKIAkJcmV0dXJuOwogCX0KIAotCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZpZm1nZC0+d29yayk7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIH0KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3ZvaWQgaWVlZTgwMjExX3N0YV93b3JrKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUubWdkLndvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2Q7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQotCQlyZXR1cm47Ci0KLQlpZiAobG9jYWwtPnNjYW5uaW5nKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTihzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpCi0JCXJldHVybjsKLQotCS8qCi0JICogaWVlZTgwMjExX3F1ZXVlX3dvcmsoKSBzaG91bGQgaGF2ZSBwaWNrZWQgdXAgbW9zdCBjYXNlcywKLQkgKiBoZXJlIHdlJ2xsIHBpY2sgdGhlIHRoZSByZXN0LgotCSAqLwotCWlmIChXQVJOKGxvY2FsLT5zdXNwZW5kZWQsICJTVEEgTUxNRSB3b3JrIHNjaGVkdWxlZCB3aGlsZSAiCi0JCSAiZ29pbmcgdG8gc3VzcGVuZFxuIikpCi0JCXJldHVybjsKLQotCWlmbWdkID0gJnNkYXRhLT51Lm1nZDsKLQotCS8qIGZpcnN0IHByb2Nlc3MgZnJhbWVzIHRvIGF2b2lkIHRpbWluZyBvdXQgd2hpbGUgYSBmcmFtZSBpcyBwZW5kaW5nICovCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmaWZtZ2QtPnNrYl9xdWV1ZSkpKQotCQlpZWVlODAyMTFfc3RhX3J4X3F1ZXVlZF9tZ210KHNkYXRhLCBza2IpOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwogCiAJLyogdGhlbiBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSB3b3JrICovCiAJbXV0ZXhfbG9jaygmaWZtZ2QtPm10eCk7CkBAIC0xOTQyLDggKzE5MDIsNyBAQAogCQlpZWVlODAyMTFfcXVldWVfd29yaygmc2RhdGEtPmxvY2FsLT5odywKIAkJCSAgICZzZGF0YS0+dS5tZ2QubW9uaXRvcl93b3JrKTsKIAkJLyogYW5kIGRvIGFsbCB0aGUgb3RoZXIgcmVndWxhciB3b3JrIHRvbyAqLwotCQlpZWVlODAyMTFfcXVldWVfd29yaygmc2RhdGEtPmxvY2FsLT5odywKLQkJCSAgICZzZGF0YS0+dS5tZ2Qud29yayk7CisJCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZzZGF0YS0+bG9jYWwtPmh3LCAmc2RhdGEtPndvcmspOwogCX0KIH0KIApAQCAtMTk1OCw3ICsxOTE3LDYgQEAKIAkgKiB0aW1lIC0tIHRoZSBjb2RlIGhlcmUgaXMgcHJvcGVybHkgc3luY2hyb25pc2VkLgogCSAqLwogCi0JY2FuY2VsX3dvcmtfc3luYygmaWZtZ2QtPndvcmspOwogCWNhbmNlbF93b3JrX3N5bmMoJmlmbWdkLT5iZWFjb25fY29ubmVjdGlvbl9sb3NzX3dvcmspOwogCWlmIChkZWxfdGltZXJfc3luYygmaWZtZ2QtPnRpbWVyKSkKIAkJc2V0X2JpdChUTVJfUlVOTklOR19USU1FUiwgJmlmbWdkLT50aW1lcnNfcnVubmluZyk7CkBAIC0xOTkwLDcgKzE5NDgsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2Q7CiAKIAlpZm1nZCA9ICZzZGF0YS0+dS5tZ2Q7Ci0JSU5JVF9XT1JLKCZpZm1nZC0+d29yaywgaWVlZTgwMjExX3N0YV93b3JrKTsKIAlJTklUX1dPUksoJmlmbWdkLT5tb25pdG9yX3dvcmssIGllZWU4MDIxMV9zdGFfbW9uaXRvcl93b3JrKTsKIAlJTklUX1dPUksoJmlmbWdkLT5jaHN3aXRjaF93b3JrLCBpZWVlODAyMTFfY2hzd2l0Y2hfd29yayk7CiAJSU5JVF9XT1JLKCZpZm1nZC0+YmVhY29uX2Nvbm5lY3Rpb25fbG9zc193b3JrLApAQCAtMjAwMyw3ICsxOTYwLDYgQEAKIAkJICAgICh1bnNpZ25lZCBsb25nKSBzZGF0YSk7CiAJc2V0dXBfdGltZXIoJmlmbWdkLT5jaHN3aXRjaF90aW1lciwgaWVlZTgwMjExX2Noc3dpdGNoX3RpbWVyLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNkYXRhKTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZpZm1nZC0+c2tiX3F1ZXVlKTsKIAogCWlmbWdkLT5mbGFncyA9IDA7CiAKQEAgLTIwODEsNiArMjAzNyw4IEBACiAJCWF1dGhfYWxnID0gV0xBTl9BVVRIX09QRU47CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgorCQlpZiAoSVNfRVJSKHNkYXRhLT5sb2NhbC0+d2VwX3R4X3RmbSkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCWF1dGhfYWxnID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9GVDoKQEAgLTIxMzQsNiArMjA5Miw4IEBACiAJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXM7CisJc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgZWxlbXM7CiAJdTE2IHN0YXR1czsKIAogCWlmICghc2tiKSB7CkBAIC0yMTQxLDYgKzIxMDEsMTkgQEAKIAkJcmV0dXJuIFdPUktfRE9ORV9ERVNUUk9ZOwogCX0KIAorCWlmICh3ay0+dHlwZSA9PSBJRUVFODAyMTFfV09SS19BU1NPQ19CRUFDT05fV0FJVCkgeworCQltdXRleF9sb2NrKCZ3ay0+c2RhdGEtPnUubWdkLm10eCk7CisJCXJ4X3N0YXR1cyA9ICh2b2lkICopIHNrYi0+Y2I7CisJCWllZWU4MDJfMTFfcGFyc2VfZWxlbXMoc2tiLT5kYXRhICsgMjQgKyAxMiwgc2tiLT5sZW4gLSAyNCAtIDEyLCAmZWxlbXMpOworCQlpZWVlODAyMTFfcnhfYnNzX2luZm8od2stPnNkYXRhLCAodm9pZCAqKXNrYi0+ZGF0YSwgc2tiLT5sZW4sIHJ4X3N0YXR1cywKKwkJCQkgICAgICAmZWxlbXMsIHRydWUpOworCQltdXRleF91bmxvY2soJndrLT5zZGF0YS0+dS5tZ2QubXR4KTsKKworCQl3ay0+dHlwZSA9IElFRUU4MDIxMV9XT1JLX0FTU09DOworCQkvKiBub3QgcmVhbGx5IGRvbmUgeWV0ICovCisJCXJldHVybiBXT1JLX0RPTkVfUkVRVUVVRTsKKwl9CisKIAltZ210ID0gKHZvaWQgKilza2ItPmRhdGE7CiAJc3RhdHVzID0gbGUxNl90b19jcHUobWdtdC0+dS5hc3NvY19yZXNwLnN0YXR1c19jb2RlKTsKIApAQCAtMjE1Myw2ICsyMTI2LDcgQEAKIAkJCQkJCSAgICB3ay0+ZmlsdGVyX3RhKTsKIAkJCXJldHVybiBXT1JLX0RPTkVfREVTVFJPWTsKIAkJfQorCiAJCW11dGV4X3VubG9jaygmd2stPnNkYXRhLT51Lm1nZC5tdHgpOwogCX0KIApAQCAtMjI1MywxMCArMjIyNywxNCBAQAogCWlmIChyZXEtPnByZXZfYnNzaWQpCiAJCW1lbWNweSh3ay0+YXNzb2MucHJldl9ic3NpZCwgcmVxLT5wcmV2X2Jzc2lkLCBFVEhfQUxFTik7CiAKLQl3ay0+dHlwZSA9IElFRUU4MDIxMV9XT1JLX0FTU09DOwogCXdrLT5jaGFuID0gcmVxLT5ic3MtPmNoYW5uZWw7CiAJd2stPnNkYXRhID0gc2RhdGE7CiAJd2stPmRvbmUgPSBpZWVlODAyMTFfYXNzb2NfZG9uZTsKKwlpZiAoIWJzcy0+ZHRpbV9wZXJpb2QgJiYKKwkgICAgc2RhdGEtPmxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EKQorCQl3ay0+dHlwZSA9IElFRUU4MDIxMV9XT1JLX0FTU09DX0JFQUNPTl9XQUlUOworCWVsc2UKKwkJd2stPnR5cGUgPSBJRUVFODAyMTFfV09SS19BU1NPQzsKIAogCWlmIChyZXEtPnVzZV9tZnApIHsKIAkJaWZtZ2QtPm1mcCA9IElFRUU4MDIxMV9NRlBfUkVRVUlSRUQ7CkBAIC0yMjgyLDE0ICsyMjYwLDE2IEBACiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9tYW5hZ2VkICppZm1nZCA9ICZzZGF0YS0+dS5tZ2Q7CiAJc3RydWN0IGllZWU4MDIxMV93b3JrICp3azsKLQljb25zdCB1OCAqYnNzaWQgPSByZXEtPmJzcy0+YnNzaWQ7CisJdTggYnNzaWRbRVRIX0FMRU5dOworCWJvb2wgYXNzb2NfYnNzID0gZmFsc2U7CiAKIAltdXRleF9sb2NrKCZpZm1nZC0+bXR4KTsKIAorCW1lbWNweShic3NpZCwgcmVxLT5ic3MtPmJzc2lkLCBFVEhfQUxFTik7CiAJaWYgKGlmbWdkLT5hc3NvY2lhdGVkID09IHJlcS0+YnNzKSB7Ci0JCWJzc2lkID0gcmVxLT5ic3MtPmJzc2lkOwotCQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCB0cnVlKTsKKwkJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgZmFsc2UpOwogCQltdXRleF91bmxvY2soJmlmbWdkLT5tdHgpOworCQlhc3NvY19ic3MgPSB0cnVlOwogCX0gZWxzZSB7CiAJCWJvb2wgbm90X2F1dGhfeWV0ID0gZmFsc2U7CiAKQEAgLTIzMDIsNyArMjI4Miw4IEBACiAKIAkJCWlmICh3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19ESVJFQ1RfUFJPQkUgJiYKIAkJCSAgICB3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19BVVRIICYmCi0JCQkgICAgd2stPnR5cGUgIT0gSUVFRTgwMjExX1dPUktfQVNTT0MpCisJCQkgICAgd2stPnR5cGUgIT0gSUVFRTgwMjExX1dPUktfQVNTT0MgJiYKKwkJCSAgICB3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19BU1NPQ19CRUFDT05fV0FJVCkKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKG1lbWNtcChyZXEtPmJzcy0+YnNzaWQsIHdrLT5maWx0ZXJfdGEsIEVUSF9BTEVOKSkKQEAgLTIzMzUsNiArMjMxNiw4IEBACiAJaWVlZTgwMjExX3NlbmRfZGVhdXRoX2Rpc2Fzc29jKHNkYXRhLCBic3NpZCwgSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwKIAkJCQkgICAgICAgcmVxLT5yZWFzb25fY29kZSwgY29va2llLAogCQkJCSAgICAgICAhcmVxLT5sb2NhbF9zdGF0ZV9jaGFuZ2UpOworCWlmIChhc3NvY19ic3MpCisJCXN0YV9pbmZvX2Rlc3Ryb3lfYWRkcihzZGF0YSwgYnNzaWQpOwogCiAJaWVlZTgwMjExX3JlY2FsY19pZGxlKHNkYXRhLT5sb2NhbCk7CiAKQEAgLTIzNzksNDEgKzIzNjIsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaWVlZTgwMjExX21nZF9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAotCQkJIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAotCQkJIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIHU2NCAqY29va2llKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkvKiBDaGVjayB0aGF0IHdlIGFyZSBvbiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgZm9yIHRyYW5zbWlzc2lvbiAqLwotCWlmICgoY2hhbiAhPSBsb2NhbC0+dG1wX2NoYW5uZWwgfHwKLQkgICAgIGNoYW5uZWxfdHlwZSAhPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZSkgJiYKLQkgICAgKGNoYW4gIT0gbG9jYWwtPm9wZXJfY2hhbm5lbCB8fAotCSAgICAgY2hhbm5lbF90eXBlICE9IGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGUpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKyBsZW4pOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKLQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0KLQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKLQotCWlmICghKGlmbWdkLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfTUZQX0VOQUJMRUQpKQotCQlJRUVFODAyMTFfU0tCX0NCKHNrYiktPmZsYWdzIHw9Ci0JCQlJRUVFODAyMTFfVFhfSU5URkxfRE9OVF9FTkNSWVBUOwotCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX05MODAyMTFfRlJBTUVfVFggfAotCQlJRUVFODAyMTFfVFhfQ1RMX1JFUV9UWF9TVEFUVVM7Ci0Jc2tiLT5kZXYgPSBzZGF0YS0+ZGV2OwotCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYik7Ci0KLQkqY29va2llID0gKHVuc2lnbmVkIGxvbmcpIHNrYjsKLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBpZWVlODAyMTFfY3FtX3Jzc2lfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgICAgICAgZW51bSBubDgwMjExX2NxbV9yc3NpX3RocmVzaG9sZF9ldmVudCByc3NpX2V2ZW50LAogCQkJICAgICAgIGdmcF90IGdmcCkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9wbS5jIGIvbmV0L21hYzgwMjExL3BtLmMKaW5kZXggNzUyMDJiMi4uZDI4N2ZkZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3BtLmMKKysrIGIvbmV0L21hYzgwMjExL3BtLmMKQEAgLTQwLDIyICs0MCwxNCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkKIAkJaWVlZTgwMjExX2Rpc2FibGVfa2V5cyhzZGF0YSk7CiAKLQkvKiBUZWFyIGRvd24gYWdncmVnYXRpb24gc2Vzc2lvbnMgKi8KLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCWlmIChody0+ZmxhZ3MgJiBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04pIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc3RhLCAmbG9jYWwtPnN0YV9saXN0LCBsaXN0KSB7CisJLyogdGVhciBkb3duIGFnZ3JlZ2F0aW9uIHNlc3Npb25zIGFuZCByZW1vdmUgU1RBcyAqLworCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgeworCQlpZiAoaHctPmZsYWdzICYgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OKSB7CiAJCQlzZXRfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfQkxPQ0tfQkEpOwogCQkJaWVlZTgwMjExX3N0YV90ZWFyX2Rvd25fQkFfc2Vzc2lvbnMoc3RhKTsKIAkJfQotCX0KIAotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JLyogcmVtb3ZlIFNUQXMgKi8KLQltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShzdGEsICZsb2NhbC0+c3RhX2xpc3QsIGxpc3QpIHsKIAkJaWYgKHN0YS0+dXBsb2FkZWQpIHsKIAkJCXNkYXRhID0gc3RhLT5zZGF0YTsKIAkJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKQEAgLTcyLDYgKzY0LDggQEAKIAogCS8qIHJlbW92ZSBhbGwgaW50ZXJmYWNlcyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgeworCQljYW5jZWxfd29ya19zeW5jKCZzZGF0YS0+d29yayk7CisKIAkJc3dpdGNoKHNkYXRhLT52aWYudHlwZSkgewogCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCQlpZWVlODAyMTFfc3RhX3F1aWVzY2Uoc2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JhdGUuaCBiL25ldC9tYWM4MDIxMS9yYXRlLmgKaW5kZXggMDY1YTk2MTkuLjE2ODQyN2IgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYXRlLmgKKysrIGIvbmV0L21hYzgwMjExL3JhdGUuaApAQCAtMTQ3LDUgKzE0NywxOCBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfUkNfTUlOU1RSRUxfSFQKK2V4dGVybiBpbnQgcmM4MDIxMV9taW5zdHJlbF9odF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcmM4MDIxMV9taW5zdHJlbF9odF9leGl0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHJjODAyMTFfbWluc3RyZWxfaHRfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHJjODAyMTFfbWluc3RyZWxfaHRfZXhpdCh2b2lkKQoreworfQorI2VuZGlmCisKIAogI2VuZGlmIC8qIElFRUU4MDIxMV9SQVRFX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCmluZGV4IGY2NWNlNmQuLjc3OGM2MDQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwpAQCAtNjcsNyArNjcsNiBAQAogCWZvciAoaSA9IHJpeDsgaSA+PSAwOyBpLS0pCiAJCWlmIChtaS0+cltpXS5yaXggPT0gcml4KQogCQkJYnJlYWs7Ci0JV0FSTl9PTihpIDwgMCk7CiAJcmV0dXJuIGk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjQ2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCkBAIC0wLDAgKzEsODI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEZlbGl4IEZpZXRrYXUgPG5iZEBvcGVud3J0Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSAicmF0ZS5oIgorI2luY2x1ZGUgInJjODAyMTFfbWluc3RyZWwuaCIKKyNpbmNsdWRlICJyYzgwMjExX21pbnN0cmVsX2h0LmgiCisKKyNkZWZpbmUgQVZHX1BLVF9TSVpFCTEyMDAKKyNkZWZpbmUgU0FNUExFX0NPTFVNTlMJMTAKKyNkZWZpbmUgRVdNQV9MRVZFTAkJNzUKKworLyogTnVtYmVyIG9mIGJpdHMgZm9yIGFuIGF2ZXJhZ2Ugc2l6ZWQgcGFja2V0ICovCisjZGVmaW5lIE1DU19OQklUUyAoQVZHX1BLVF9TSVpFIDw8IDMpCisKKy8qIE51bWJlciBvZiBzeW1ib2xzIGZvciBhIHBhY2tldCB3aXRoIChicHMpIGJpdHMgcGVyIHN5bWJvbCAqLworI2RlZmluZSBNQ1NfTlNZTVMoYnBzKSAoKE1DU19OQklUUyArIChicHMpIC0gMSkgLyAoYnBzKSkKKworLyogVHJhbnNtaXNzaW9uIHRpbWUgZm9yIGEgcGFja2V0IGNvbnRhaW5pbmcgKHN5bXMpIHN5bWJvbHMgKi8KKyNkZWZpbmUgTUNTX1NZTUJPTF9USU1FKHNnaSwgc3ltcykJCQkJCVwKKwkoc2dpID8JCQkJCQkJCVwKKwkgICgoc3ltcykgKiAxOCArIDQpIC8gNSA6CS8qIHN5bXMgKiAzLjYgdXMgKi8JCVwKKwkgIChzeW1zKSA8PCAyCQkJLyogc3ltcyAqIDQgdXMgKi8JCVwKKwkpCisKKy8qIFRyYW5zbWl0IGR1cmF0aW9uIGZvciB0aGUgcmF3IGRhdGEgcGFydCBvZiBhbiBhdmVyYWdlIHNpemVkIHBhY2tldCAqLworI2RlZmluZSBNQ1NfRFVSQVRJT04oc3RyZWFtcywgc2dpLCBicHMpIE1DU19TWU1CT0xfVElNRShzZ2ksIE1DU19OU1lNUygoc3RyZWFtcykgKiAoYnBzKSkpCisKKy8qIE1DUyByYXRlIGluZm9ybWF0aW9uIGZvciBhbiBNQ1MgZ3JvdXAgKi8KKyNkZWZpbmUgTUNTX0dST1VQKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkgewkJCQlcCisJLnN0cmVhbXMgPSBfc3RyZWFtcywJCQkJCQlcCisJLmZsYWdzID0JCQkJCQkJXAorCQkoX3NnaSA/IElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSA6IDApIHwJCQlcCisJCShfaHQ0MCA/IElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEggOiAwKSwJCVwKKwkuZHVyYXRpb24gPSB7CQkJCQkJCVwKKwkJTUNTX0RVUkFUSU9OKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCA/IDU0IDogMjYpLAkJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gMTA4IDogNTIpLAkJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gMTYyIDogNzgpLAkJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gMjE2IDogMTA0KSwJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gMzI0IDogMTU2KSwJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gNDMyIDogMjA4KSwJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gNDg2IDogMjM0KSwJXAorCQlNQ1NfRFVSQVRJT04oX3N0cmVhbXMsIF9zZ2ksIF9odDQwID8gNTQwIDogMjYwKQkJXAorCX0JCQkJCQkJCVwKK30KKworLyoKKyAqIFRvIGVuYWJsZSBzdWZmaWNpZW50bHkgdGFyZ2V0ZWQgcmF0ZSBzYW1wbGluZywgTUNTIHJhdGVzIGFyZSBkaXZpZGVkIGludG8KKyAqIGdyb3VwcywgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzdHJlYW1zIGFuZCBmbGFncyAoSFQ0MCwgU0dJKSB0aGF0IHRoZXkKKyAqIHVzZS4KKyAqLworY29uc3Qgc3RydWN0IG1jc19ncm91cCBtaW5zdHJlbF9tY3NfZ3JvdXBzW10gPSB7CisJTUNTX0dST1VQKDEsIDAsIDApLAorCU1DU19HUk9VUCgyLCAwLCAwKSwKKyNpZiBNSU5TVFJFTF9NQVhfU1RSRUFNUyA+PSAzCisJTUNTX0dST1VQKDMsIDAsIDApLAorI2VuZGlmCisKKwlNQ1NfR1JPVVAoMSwgMSwgMCksCisJTUNTX0dST1VQKDIsIDEsIDApLAorI2lmIE1JTlNUUkVMX01BWF9TVFJFQU1TID49IDMKKwlNQ1NfR1JPVVAoMywgMSwgMCksCisjZW5kaWYKKworCU1DU19HUk9VUCgxLCAwLCAxKSwKKwlNQ1NfR1JPVVAoMiwgMCwgMSksCisjaWYgTUlOU1RSRUxfTUFYX1NUUkVBTVMgPj0gMworCU1DU19HUk9VUCgzLCAwLCAxKSwKKyNlbmRpZgorCisJTUNTX0dST1VQKDEsIDEsIDEpLAorCU1DU19HUk9VUCgyLCAxLCAxKSwKKyNpZiBNSU5TVFJFTF9NQVhfU1RSRUFNUyA+PSAzCisJTUNTX0dST1VQKDMsIDEsIDEpLAorI2VuZGlmCit9OworCitzdGF0aWMgdTggc2FtcGxlX3RhYmxlW1NBTVBMRV9DT0xVTU5TXVtNQ1NfR1JPVVBfUkFURVNdOworCisvKgorICogUGVyZm9ybSBFV01BIChFeHBvbmVudGlhbGx5IFdlaWdodGVkIE1vdmluZyBBdmVyYWdlKSBjYWxjdWxhdGlvbgorICovCitzdGF0aWMgaW50CittaW5zdHJlbF9ld21hKGludCBvbGQsIGludCBuZXcsIGludCB3ZWlnaHQpCit7CisJcmV0dXJuIChuZXcgKiAoMTAwIC0gd2VpZ2h0KSArIG9sZCAqIHdlaWdodCkgLyAxMDA7Cit9CisKKy8qCisgKiBMb29rIHVwIGFuIE1DUyBncm91cCBpbmRleCBiYXNlZCBvbiBtYWM4MDIxMSByYXRlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyBpbnQKK21pbnN0cmVsX2h0X2dldF9ncm91cF9pZHgoc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyYXRlKQoreworCWludCBzdHJlYW1zID0gKHJhdGUtPmlkeCAvIE1DU19HUk9VUF9SQVRFUykgKyAxOworCXUzMiBmbGFncyA9IElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSB8IElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtaW5zdHJlbF9tY3NfZ3JvdXBzKTsgaSsrKSB7CisJCWlmIChtaW5zdHJlbF9tY3NfZ3JvdXBzW2ldLnN0cmVhbXMgIT0gc3RyZWFtcykKKwkJCWNvbnRpbnVlOworCQlpZiAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5mbGFncyAhPSAocmF0ZS0+ZmxhZ3MgJiBmbGFncykpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gaTsKKwl9CisKKwlXQVJOX09OKDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICoKK21pbnN0cmVsX2dldF9yYXRlc3RhdHMoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIGludCBpbmRleCkKK3sKKwlyZXR1cm4gJm1pLT5ncm91cHNbaW5kZXggLyBNQ1NfR1JPVVBfUkFURVNdLnJhdGVzW2luZGV4ICUgTUNTX0dST1VQX1JBVEVTXTsKK30KKworCisvKgorICogUmVjYWxjdWxhdGUgc3VjY2VzcyBwcm9iYWJpbGl0aWVzIGFuZCBjb3VudGVycyBmb3IgYSByYXRlIHVzaW5nIEVXTUEKKyAqLworc3RhdGljIHZvaWQKK21pbnN0cmVsX2NhbGNfcmF0ZV9ld21hKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yKQoreworCWlmICh1bmxpa2VseShtci0+YXR0ZW1wdHMgPiAwKSkgeworCQltci0+c2FtcGxlX3NraXBwZWQgPSAwOworCQltci0+Y3VyX3Byb2IgPSBNSU5TVFJFTF9GUkFDKG1yLT5zdWNjZXNzLCBtci0+YXR0ZW1wdHMpOworCQlpZiAoIW1yLT5hdHRfaGlzdCkKKwkJCW1yLT5wcm9iYWJpbGl0eSA9IG1yLT5jdXJfcHJvYjsKKwkJZWxzZQorCQkJbXItPnByb2JhYmlsaXR5ID0gbWluc3RyZWxfZXdtYShtci0+cHJvYmFiaWxpdHksCisJCQkJbXItPmN1cl9wcm9iLCBFV01BX0xFVkVMKTsKKwkJbXItPmF0dF9oaXN0ICs9IG1yLT5hdHRlbXB0czsKKwkJbXItPnN1Y2NfaGlzdCArPSBtci0+c3VjY2VzczsKKwl9IGVsc2UgeworCQltci0+c2FtcGxlX3NraXBwZWQrKzsKKwl9CisJbXItPmxhc3Rfc3VjY2VzcyA9IG1yLT5zdWNjZXNzOworCW1yLT5sYXN0X2F0dGVtcHRzID0gbXItPmF0dGVtcHRzOworCW1yLT5zdWNjZXNzID0gMDsKKwltci0+YXR0ZW1wdHMgPSAwOworfQorCisvKgorICogQ2FsY3VsYXRlIHRocm91Z2hwdXQgYmFzZWQgb24gdGhlIGF2ZXJhZ2UgQS1NUERVIGxlbmd0aCwgdGFraW5nIGludG8gYWNjb3VudAorICogdGhlIGV4cGVjdGVkIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgYW5kIHRoZWlyIGV4cGVjdGVkIGxlbmd0aAorICovCitzdGF0aWMgdm9pZAorbWluc3RyZWxfaHRfY2FsY190cChzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAsIHN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pLAorICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXAsIGludCByYXRlKQoreworCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICptcjsKKwl1bnNpZ25lZCBpbnQgdXNlY3M7CisKKwltciA9ICZtaS0+Z3JvdXBzW2dyb3VwXS5yYXRlc1tyYXRlXTsKKworCWlmIChtci0+cHJvYmFiaWxpdHkgPCBNSU5TVFJFTF9GUkFDKDEsIDEwKSkgeworCQltci0+Y3VyX3RwID0gMDsKKwkJcmV0dXJuOworCX0KKworCXVzZWNzID0gbWktPm92ZXJoZWFkIC8gTUlOU1RSRUxfVFJVTkMobWktPmF2Z19hbXBkdV9sZW4pOworCXVzZWNzICs9IG1pbnN0cmVsX21jc19ncm91cHNbZ3JvdXBdLmR1cmF0aW9uW3JhdGVdOworCW1yLT5jdXJfdHAgPSBNSU5TVFJFTF9UUlVOQygoMTAwMDAwMCAvIHVzZWNzKSAqIG1yLT5wcm9iYWJpbGl0eSk7Cit9CisKKy8qCisgKiBVcGRhdGUgcmF0ZSBzdGF0aXN0aWNzIGFuZCBzZWxlY3QgbmV3IHByaW1hcnkgcmF0ZXMKKyAqCisgKiBSdWxlcyBmb3IgcmF0ZSBzZWxlY3Rpb246CisgKiAgLSBtYXhfcHJvYl9yYXRlIG11c3QgdXNlIG9ubHkgb25lIHN0cmVhbSwgYXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGRlbGl2ZXJ5CisgKiAgICBwcm9iYWJpbGl0eSBhbmQgdGhyb3VnaHB1dCBkdXJpbmcgc3Ryb25nIGZsdWN0dWF0aW9ucworICogIC0gYXMgbG9uZyBhcyB0aGUgbWF4IHByb2IgcmF0ZSBoYXMgYSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gMy80LCBwaWNrCisgKiAgICBoaWdoZXIgdGhyb3VnaHB1dCByYXRlcywgZXZlbiBpZiB0aGUgcHJvYmFibGl0eSBpcyBhIGJpdCBsb3dlcgorICovCitzdGF0aWMgdm9pZAorbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkpCit7CisJc3RydWN0IG1pbnN0cmVsX21jc19ncm91cF9kYXRhICptZzsKKwlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXI7CisJaW50IGN1cl9wcm9iLCBjdXJfcHJvYl90cCwgY3VyX3RwLCBjdXJfdHAyOworCWludCBncm91cCwgaSwgaW5kZXg7CisKKwlpZiAobWktPmFtcGR1X3BhY2tldHMgPiAwKSB7CisJCW1pLT5hdmdfYW1wZHVfbGVuID0gbWluc3RyZWxfZXdtYShtaS0+YXZnX2FtcGR1X2xlbiwKKwkJCU1JTlNUUkVMX0ZSQUMobWktPmFtcGR1X2xlbiwgbWktPmFtcGR1X3BhY2tldHMpLCBFV01BX0xFVkVMKTsKKwkJbWktPmFtcGR1X2xlbiA9IDA7CisJCW1pLT5hbXBkdV9wYWNrZXRzID0gMDsKKwl9CisKKwltaS0+c2FtcGxlX3Nsb3cgPSAwOworCW1pLT5zYW1wbGVfY291bnQgPSAwOworCW1pLT5tYXhfdHBfcmF0ZSA9IDA7CisJbWktPm1heF90cF9yYXRlMiA9IDA7CisJbWktPm1heF9wcm9iX3JhdGUgPSAwOworCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgQVJSQVlfU0laRShtaW5zdHJlbF9tY3NfZ3JvdXBzKTsgZ3JvdXArKykgeworCQljdXJfcHJvYiA9IDA7CisJCWN1cl9wcm9iX3RwID0gMDsKKwkJY3VyX3RwID0gMDsKKwkJY3VyX3RwMiA9IDA7CisKKwkJbWcgPSAmbWktPmdyb3Vwc1tncm91cF07CisJCWlmICghbWctPnN1cHBvcnRlZCkKKwkJCWNvbnRpbnVlOworCisJCW1nLT5tYXhfdHBfcmF0ZSA9IDA7CisJCW1nLT5tYXhfdHBfcmF0ZTIgPSAwOworCQltZy0+bWF4X3Byb2JfcmF0ZSA9IDA7CisJCW1pLT5zYW1wbGVfY291bnQrKzsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUNTX0dST1VQX1JBVEVTOyBpKyspIHsKKwkJCWlmICghKG1nLT5zdXBwb3J0ZWQgJiBCSVQoaSkpKQorCQkJCWNvbnRpbnVlOworCisJCQltciA9ICZtZy0+cmF0ZXNbaV07CisJCQltci0+cmV0cnlfdXBkYXRlZCA9IGZhbHNlOworCQkJaW5kZXggPSBNQ1NfR1JPVVBfUkFURVMgKiBncm91cCArIGk7CisJCQltaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShtcCwgbXIpOworCQkJbWluc3RyZWxfaHRfY2FsY190cChtcCwgbWksIGdyb3VwLCBpKTsKKworCQkJaWYgKCFtci0+Y3VyX3RwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBpZ25vcmUgdGhlIGxvd2VzdCByYXRlIG9mIGVhY2ggc2luZ2xlLXN0cmVhbSBncm91cCAqLworCQkJaWYgKCFpICYmIG1pbnN0cmVsX21jc19ncm91cHNbZ3JvdXBdLnN0cmVhbXMgPT0gMSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKChtci0+Y3VyX3RwID4gY3VyX3Byb2JfdHAgJiYgbXItPnByb2JhYmlsaXR5ID4KKwkJCSAgICAgTUlOU1RSRUxfRlJBQygzLCA0KSkgfHwgbXItPnByb2JhYmlsaXR5ID4gY3VyX3Byb2IpIHsKKwkJCQltZy0+bWF4X3Byb2JfcmF0ZSA9IGluZGV4OworCQkJCWN1cl9wcm9iID0gbXItPnByb2JhYmlsaXR5OworCQkJCWN1cl9wcm9iX3RwID0gbXItPmN1cl90cDsKKwkJCX0KKworCQkJaWYgKG1yLT5jdXJfdHAgPiBjdXJfdHApIHsKKwkJCQlzd2FwKGluZGV4LCBtZy0+bWF4X3RwX3JhdGUpOworCQkJCWN1cl90cCA9IG1yLT5jdXJfdHA7CisJCQkJbXIgPSBtaW5zdHJlbF9nZXRfcmF0ZXN0YXRzKG1pLCBpbmRleCk7CisJCQl9CisKKwkJCWlmIChpbmRleCA+PSBtZy0+bWF4X3RwX3JhdGUpCisJCQkJY29udGludWU7CisKKwkJCWlmIChtci0+Y3VyX3RwID4gY3VyX3RwMikgeworCQkJCW1nLT5tYXhfdHBfcmF0ZTIgPSBpbmRleDsKKwkJCQljdXJfdHAyID0gbXItPmN1cl90cDsKKwkJCX0KKwkJfQorCX0KKworCS8qIHRyeSB0byBzYW1wbGUgdXAgdG8gaGFsZiBvZiB0aGUgYXZhaWxibGUgcmF0ZXMgZHVyaW5nIGVhY2ggaW50ZXJ2YWwgKi8KKwltaS0+c2FtcGxlX2NvdW50ICo9IDQ7CisKKwljdXJfcHJvYiA9IDA7CisJY3VyX3Byb2JfdHAgPSAwOworCWN1cl90cCA9IDA7CisJY3VyX3RwMiA9IDA7CisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgQVJSQVlfU0laRShtaW5zdHJlbF9tY3NfZ3JvdXBzKTsgZ3JvdXArKykgeworCQltZyA9ICZtaS0+Z3JvdXBzW2dyb3VwXTsKKwkJaWYgKCFtZy0+c3VwcG9ydGVkKQorCQkJY29udGludWU7CisKKwkJbXIgPSBtaW5zdHJlbF9nZXRfcmF0ZXN0YXRzKG1pLCBtZy0+bWF4X3Byb2JfcmF0ZSk7CisJCWlmIChjdXJfcHJvYl90cCA8IG1yLT5jdXJfdHAgJiYKKwkJICAgIG1pbnN0cmVsX21jc19ncm91cHNbZ3JvdXBdLnN0cmVhbXMgPT0gMSkgeworCQkJbWktPm1heF9wcm9iX3JhdGUgPSBtZy0+bWF4X3Byb2JfcmF0ZTsKKwkJCWN1cl9wcm9iID0gbXItPmN1cl9wcm9iOworCQkJY3VyX3Byb2JfdHAgPSBtci0+Y3VyX3RwOworCQl9CisKKwkJbXIgPSBtaW5zdHJlbF9nZXRfcmF0ZXN0YXRzKG1pLCBtZy0+bWF4X3RwX3JhdGUpOworCQlpZiAoY3VyX3RwIDwgbXItPmN1cl90cCkgeworCQkJbWktPm1heF90cF9yYXRlID0gbWctPm1heF90cF9yYXRlOworCQkJY3VyX3RwID0gbXItPmN1cl90cDsKKwkJfQorCisJCW1yID0gbWluc3RyZWxfZ2V0X3JhdGVzdGF0cyhtaSwgbWctPm1heF90cF9yYXRlMik7CisJCWlmIChjdXJfdHAyIDwgbXItPmN1cl90cCkgeworCQkJbWktPm1heF90cF9yYXRlMiA9IG1nLT5tYXhfdHBfcmF0ZTI7CisJCQljdXJfdHAyID0gbXItPmN1cl90cDsKKwkJfQorCX0KKworCW1pLT5zdGF0c191cGRhdGUgPSBqaWZmaWVzOworfQorCitzdGF0aWMgYm9vbAorbWluc3RyZWxfaHRfdHhzdGF0X3ZhbGlkKHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKK3sKKwlpZiAoIXJhdGUtPmNvdW50KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAocmF0ZS0+aWR4IDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuICEhKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUyk7Cit9CisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF9uZXh0X3NhbXBsZV9pZHgoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkpCit7CisJc3RydWN0IG1pbnN0cmVsX21jc19ncm91cF9kYXRhICptZzsKKworCWZvciAoOzspIHsKKwkJbWktPnNhbXBsZV9ncm91cCsrOworCQltaS0+c2FtcGxlX2dyb3VwICU9IEFSUkFZX1NJWkUobWluc3RyZWxfbWNzX2dyb3Vwcyk7CisJCW1nID0gJm1pLT5ncm91cHNbbWktPnNhbXBsZV9ncm91cF07CisKKwkJaWYgKCFtZy0+c3VwcG9ydGVkKQorCQkJY29udGludWU7CisKKwkJaWYgKCsrbWctPmluZGV4ID49IE1DU19HUk9VUF9SQVRFUykgeworCQkJbWctPmluZGV4ID0gMDsKKwkJCWlmICgrK21nLT5jb2x1bW4gPj0gQVJSQVlfU0laRShzYW1wbGVfdGFibGUpKQorCQkJCW1nLT5jb2x1bW4gPSAwOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK21pbnN0cmVsX2Rvd25ncmFkZV9yYXRlKHN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pLCB1bnNpZ25lZCBpbnQgKmlkeCwKKwkJCWJvb2wgcHJpbWFyeSkKK3sKKwlpbnQgZ3JvdXAsIG9yaWdfZ3JvdXA7CisKKwlvcmlnX2dyb3VwID0gZ3JvdXAgPSAqaWR4IC8gTUNTX0dST1VQX1JBVEVTOworCXdoaWxlIChncm91cCA+IDApIHsKKwkJZ3JvdXAtLTsKKworCQlpZiAoIW1pLT5ncm91cHNbZ3JvdXBdLnN1cHBvcnRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtaW5zdHJlbF9tY3NfZ3JvdXBzW2dyb3VwXS5zdHJlYW1zID4KKwkJICAgIG1pbnN0cmVsX21jc19ncm91cHNbb3JpZ19ncm91cF0uc3RyZWFtcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChwcmltYXJ5KQorCQkJKmlkeCA9IG1pLT5ncm91cHNbZ3JvdXBdLm1heF90cF9yYXRlOworCQllbHNlCisJCQkqaWR4ID0gbWktPmdyb3Vwc1tncm91cF0ubWF4X3RwX3JhdGUyOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF9hZ2dyX2NoZWNrKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZihwdWJzdGEsIHN0cnVjdCBzdGFfaW5mbywgc3RhKTsKKwl1MTYgdGlkOworCisJaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkpCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseShza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpKQorCQlyZXR1cm47CisKKwl0aWQgPSAqaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcikgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKKwlpZiAobGlrZWx5KHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSkpCisJCXJldHVybjsKKworCWllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHB1YnN0YSwgdGlkKTsKK30KKworc3RhdGljIHZvaWQKK21pbnN0cmVsX2h0X3R4X3N0YXR1cyh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBtaW5zdHJlbF9odF9zdGFfcHJpdiAqbXNwID0gcHJpdl9zdGE7CisJc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkgPSAmbXNwLT5odDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICphciA9IGluZm8tPnN0YXR1cy5yYXRlczsKKwlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqcmF0ZSwgKnJhdGUyOworCXN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCA9IHByaXY7CisJYm9vbCBsYXN0ID0gZmFsc2U7CisJaW50IGdyb3VwOworCWludCBpID0gMDsKKworCWlmICghbXNwLT5pc19odCkKKwkJcmV0dXJuIG1hYzgwMjExX21pbnN0cmVsLnR4X3N0YXR1cyhwcml2LCBzYmFuZCwgc3RhLCAmbXNwLT5sZWdhY3ksIHNrYik7CisKKwkvKiBUaGlzIHBhY2tldCB3YXMgYWdncmVnYXRlZCBidXQgZG9lc24ndCBjYXJyeSBzdGF0dXMgaW5mbyAqLworCWlmICgoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSAmJgorCSAgICAhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFUpKQorCQlyZXR1cm47CisKKwlpZiAoIWluZm8tPnN0YXR1cy5hbXBkdV9sZW4pIHsKKwkJaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4gPSAxOworCQlpbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gMTsKKwl9CisKKwltaS0+YW1wZHVfcGFja2V0cysrOworCW1pLT5hbXBkdV9sZW4gKz0gaW5mby0+c3RhdHVzLmFtcGR1X2xlbjsKKworCWlmICghbWktPnNhbXBsZV93YWl0ICYmICFtaS0+c2FtcGxlX3RyaWVzICYmIG1pLT5zYW1wbGVfY291bnQgPiAwKSB7CisJCW1pLT5zYW1wbGVfd2FpdCA9IDQgKyAyICogTUlOU1RSRUxfVFJVTkMobWktPmF2Z19hbXBkdV9sZW4pOworCQltaS0+c2FtcGxlX3RyaWVzID0gMzsKKwkJbWktPnNhbXBsZV9jb3VudC0tOworCX0KKworCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFKSB7CisJCW1pLT5zYW1wbGVfcGFja2V0cyArPSBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuOworCQltaW5zdHJlbF9uZXh0X3NhbXBsZV9pZHgobWkpOworCX0KKworCWZvciAoaSA9IDA7ICFsYXN0OyBpKyspIHsKKwkJbGFzdCA9IChpID09IElFRUU4MDIxMV9UWF9NQVhfUkFURVMgLSAxKSB8fAorCQkgICAgICAgIW1pbnN0cmVsX2h0X3R4c3RhdF92YWxpZCgmYXJbaSArIDFdKTsKKworCQlpZiAoIW1pbnN0cmVsX2h0X3R4c3RhdF92YWxpZCgmYXJbaV0pKQorCQkJYnJlYWs7CisKKwkJZ3JvdXAgPSBtaW5zdHJlbF9odF9nZXRfZ3JvdXBfaWR4KCZhcltpXSk7CisJCXJhdGUgPSAmbWktPmdyb3Vwc1tncm91cF0ucmF0ZXNbYXJbaV0uaWR4ICUgOF07CisKKwkJaWYgKGxhc3QgJiYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKSkKKwkJCXJhdGUtPnN1Y2Nlc3MgKz0gaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW47CisKKwkJcmF0ZS0+YXR0ZW1wdHMgKz0gYXJbaV0uY291bnQgKiBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuOworCX0KKworCS8qCisJICogY2hlY2sgZm9yIHN1ZGRlbiBkZWF0aCBvZiBzcGF0aWFsIG11bHRpcGxleGluZywKKwkgKiBkb3duZ3JhZGUgdG8gYSBsb3dlciBudW1iZXIgb2Ygc3RyZWFtcyBpZiBuZWNlc3NhcnkuCisJICovCisJcmF0ZSA9IG1pbnN0cmVsX2dldF9yYXRlc3RhdHMobWksIG1pLT5tYXhfdHBfcmF0ZSk7CisJaWYgKHJhdGUtPmF0dGVtcHRzID4gMzAgJiYKKwkgICAgTUlOU1RSRUxfRlJBQyhyYXRlLT5zdWNjZXNzLCByYXRlLT5hdHRlbXB0cykgPAorCSAgICBNSU5TVFJFTF9GUkFDKDIwLCAxMDApKQorCQltaW5zdHJlbF9kb3duZ3JhZGVfcmF0ZShtaSwgJm1pLT5tYXhfdHBfcmF0ZSwgdHJ1ZSk7CisKKwlyYXRlMiA9IG1pbnN0cmVsX2dldF9yYXRlc3RhdHMobWksIG1pLT5tYXhfdHBfcmF0ZTIpOworCWlmIChyYXRlMi0+YXR0ZW1wdHMgPiAzMCAmJgorCSAgICBNSU5TVFJFTF9GUkFDKHJhdGUyLT5zdWNjZXNzLCByYXRlMi0+YXR0ZW1wdHMpIDwKKwkgICAgTUlOU1RSRUxfRlJBQygyMCwgMTAwKSkKKwkJbWluc3RyZWxfZG93bmdyYWRlX3JhdGUobWksICZtaS0+bWF4X3RwX3JhdGUyLCBmYWxzZSk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBtaS0+c3RhdHNfdXBkYXRlICsgKG1wLT51cGRhdGVfaW50ZXJ2YWwgLyAyICogSFopIC8gMTAwMCkpIHsKKwkJbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKG1wLCBtaSk7CisJCW1pbnN0cmVsX2FnZ3JfY2hlY2sobXAsIHN0YSwgc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF9jYWxjX3JldHJhbnNtaXQoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpCit7CisJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOworCWNvbnN0IHN0cnVjdCBtY3NfZ3JvdXAgKmdyb3VwOworCXVuc2lnbmVkIGludCB0eF90aW1lLCB0eF90aW1lX3J0c2N0cywgdHhfdGltZV9kYXRhOworCXVuc2lnbmVkIGludCBjdyA9IG1wLT5jd19taW47CisJdW5zaWduZWQgaW50IHRfc2xvdCA9IDk7IC8qIEZJWE1FICovCisJdW5zaWduZWQgaW50IGFtcGR1X2xlbiA9IE1JTlNUUkVMX1RSVU5DKG1pLT5hdmdfYW1wZHVfbGVuKTsKKworCW1yID0gbWluc3RyZWxfZ2V0X3JhdGVzdGF0cyhtaSwgaW5kZXgpOworCWlmIChtci0+cHJvYmFiaWxpdHkgPCBNSU5TVFJFTF9GUkFDKDEsIDEwKSkgeworCQltci0+cmV0cnlfY291bnQgPSAxOworCQltci0+cmV0cnlfY291bnRfcnRzY3RzID0gMTsKKwkJcmV0dXJuOworCX0KKworCW1yLT5yZXRyeV9jb3VudCA9IDI7CisJbXItPnJldHJ5X2NvdW50X3J0c2N0cyA9IDI7CisJbXItPnJldHJ5X3VwZGF0ZWQgPSB0cnVlOworCisJZ3JvdXAgPSAmbWluc3RyZWxfbWNzX2dyb3Vwc1tpbmRleCAvIE1DU19HUk9VUF9SQVRFU107CisJdHhfdGltZV9kYXRhID0gZ3JvdXAtPmR1cmF0aW9uW2luZGV4ICUgTUNTX0dST1VQX1JBVEVTXSAqIGFtcGR1X2xlbjsKKwl0eF90aW1lID0gMiAqICh0X3Nsb3QgKyBtaS0+b3ZlcmhlYWQgKyB0eF90aW1lX2RhdGEpOworCXR4X3RpbWVfcnRzY3RzID0gMiAqICh0X3Nsb3QgKyBtaS0+b3ZlcmhlYWRfcnRzY3RzICsgdHhfdGltZV9kYXRhKTsKKwlkbyB7CisJCWN3ID0gKGN3IDw8IDEpIHwgMTsKKwkJY3cgPSBtaW4oY3csIG1wLT5jd19tYXgpOworCQl0eF90aW1lICs9IGN3ICsgdF9zbG90ICsgbWktPm92ZXJoZWFkOworCQl0eF90aW1lX3J0c2N0cyArPSBjdyArIHRfc2xvdCArIG1pLT5vdmVyaGVhZF9ydHNjdHM7CisJCWlmICh0eF90aW1lX3J0c2N0cyA8IG1wLT5zZWdtZW50X3NpemUpCisJCQltci0+cmV0cnlfY291bnRfcnRzY3RzKys7CisJfSB3aGlsZSAoKHR4X3RpbWUgPCBtcC0+c2VnbWVudF9zaXplKSAmJgorCSAgICAgICAgICgrK21yLT5yZXRyeV9jb3VudCA8IG1wLT5tYXhfcmV0cnkpKTsKK30KKworCitzdGF0aWMgdm9pZAorbWluc3RyZWxfaHRfc2V0X3JhdGUoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9yYXRlX2NvbnRyb2wgKnR4cmMsCisgICAgICAgICAgICAgICAgICAgICBib29sIHNhbXBsZSwgYm9vbCBydHNjdHMpCit7CisJY29uc3Qgc3RydWN0IG1jc19ncm91cCAqZ3JvdXAgPSAmbWluc3RyZWxfbWNzX2dyb3Vwc1tpbmRleCAvIE1DU19HUk9VUF9SQVRFU107CisJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOworCisJbXIgPSBtaW5zdHJlbF9nZXRfcmF0ZXN0YXRzKG1pLCBpbmRleCk7CisJaWYgKCFtci0+cmV0cnlfdXBkYXRlZCkKKwkJbWluc3RyZWxfY2FsY19yZXRyYW5zbWl0KG1wLCBtaSwgaW5kZXgpOworCisJaWYgKG1yLT5wcm9iYWJpbGl0eSA8IE1JTlNUUkVMX0ZSQUMoMjAsIDEwMCkpCisJCXJhdGUtPmNvdW50ID0gMjsKKwllbHNlIGlmIChydHNjdHMpCisJCXJhdGUtPmNvdW50ID0gbXItPnJldHJ5X2NvdW50X3J0c2N0czsKKwllbHNlCisJCXJhdGUtPmNvdW50ID0gbXItPnJldHJ5X2NvdW50OworCisJcmF0ZS0+ZmxhZ3MgPSBJRUVFODAyMTFfVFhfUkNfTUNTIHwgZ3JvdXAtPmZsYWdzOworCWlmICh0eHJjLT5zaG9ydF9wcmVhbWJsZSkKKwkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRTsKKwlpZiAodHhyYy0+cnRzIHx8IHJ0c2N0cykKKwkJcmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTOworCXJhdGUtPmlkeCA9IGluZGV4ICUgTUNTX0dST1VQX1JBVEVTICsgKGdyb3VwLT5zdHJlYW1zIC0gMSkgKiBNQ1NfR1JPVVBfUkFURVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittaW5zdHJlbF9nZXRfZHVyYXRpb24oaW50IGluZGV4KQoreworCWNvbnN0IHN0cnVjdCBtY3NfZ3JvdXAgKmdyb3VwID0gJm1pbnN0cmVsX21jc19ncm91cHNbaW5kZXggLyBNQ1NfR1JPVVBfUkFURVNdOworCXJldHVybiBncm91cC0+ZHVyYXRpb25baW5kZXggJSBNQ1NfR1JPVVBfUkFURVNdOworfQorCitzdGF0aWMgaW50CittaW5zdHJlbF9nZXRfc2FtcGxlX3JhdGUoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSkKK3sKKwlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXI7CisJc3RydWN0IG1pbnN0cmVsX21jc19ncm91cF9kYXRhICptZzsKKwlpbnQgc2FtcGxlX2lkeCA9IDA7CisKKwlpZiAobWktPnNhbXBsZV93YWl0ID4gMCkgeworCQltaS0+c2FtcGxlX3dhaXQtLTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghbWktPnNhbXBsZV90cmllcykKKwkJcmV0dXJuIC0xOworCisJbWktPnNhbXBsZV90cmllcy0tOworCW1nID0gJm1pLT5ncm91cHNbbWktPnNhbXBsZV9ncm91cF07CisJc2FtcGxlX2lkeCA9IHNhbXBsZV90YWJsZVttZy0+Y29sdW1uXVttZy0+aW5kZXhdOworCW1yID0gJm1nLT5yYXRlc1tzYW1wbGVfaWR4XTsKKwlzYW1wbGVfaWR4ICs9IG1pLT5zYW1wbGVfZ3JvdXAgKiBNQ1NfR1JPVVBfUkFURVM7CisKKwkvKgorCSAqIFdoZW4gbm90IHVzaW5nIE1SUiwgZG8gbm90IHNhbXBsZSBpZiB0aGUgcHJvYmFiaWxpdHkgaXMgYWxyZWFkeQorCSAqIGhpZ2hlciB0aGFuIDk1JSB0byBhdm9pZCB3YXN0aW5nIGFpcnRpbWUKKwkgKi8KKwlpZiAoIW1wLT5oYXNfbXJyICYmIChtci0+cHJvYmFiaWxpdHkgPiBNSU5TVFJFTF9GUkFDKDk1LCAxMDApKSkKKwkJZ290byBuZXh0OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBsb3dlciByYXRlcyBnZXQgc2FtcGxlZCBvbmx5IG9jY2FzaW9uYWxseSwKKwkgKiBpZiB0aGUgbGluayBpcyB3b3JraW5nIHBlcmZlY3RseS4KKwkgKi8KKwlpZiAobWluc3RyZWxfZ2V0X2R1cmF0aW9uKHNhbXBsZV9pZHgpID4KKwkgICAgbWluc3RyZWxfZ2V0X2R1cmF0aW9uKG1pLT5tYXhfdHBfcmF0ZSkpIHsKKwkJaWYgKG1yLT5zYW1wbGVfc2tpcHBlZCA8IDEwKQorCQkJZ290byBuZXh0OworCisJCWlmIChtaS0+c2FtcGxlX3Nsb3crKyA+IDIpCisJCQlnb3RvIG5leHQ7CisJfQorCisJcmV0dXJuIHNhbXBsZV9pZHg7CisKK25leHQ6CisJbWluc3RyZWxfbmV4dF9zYW1wbGVfaWR4KG1pKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF9odF9nZXRfcmF0ZSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhyYy0+c2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKmFyID0gaW5mby0+c3RhdHVzLnJhdGVzOworCXN0cnVjdCBtaW5zdHJlbF9odF9zdGFfcHJpdiAqbXNwID0gcHJpdl9zdGE7CisJc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkgPSAmbXNwLT5odDsKKwlzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAgPSBwcml2OworCWludCBzYW1wbGVfaWR4OworCisJaWYgKHJhdGVfY29udHJvbF9zZW5kX2xvdyhzdGEsIHByaXZfc3RhLCB0eHJjKSkKKwkJcmV0dXJuOworCisJaWYgKCFtc3AtPmlzX2h0KQorCQlyZXR1cm4gbWFjODAyMTFfbWluc3RyZWwuZ2V0X3JhdGUocHJpdiwgc3RhLCAmbXNwLT5sZWdhY3ksIHR4cmMpOworCisJaW5mby0+ZmxhZ3MgfD0gbWktPnR4X2ZsYWdzOworCXNhbXBsZV9pZHggPSBtaW5zdHJlbF9nZXRfc2FtcGxlX3JhdGUobXAsIG1pKTsKKwlpZiAoc2FtcGxlX2lkeCA+PSAwKSB7CisJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzBdLCBzYW1wbGVfaWR4LAorCQkJdHhyYywgdHJ1ZSwgZmFsc2UpOworCQltaW5zdHJlbF9odF9zZXRfcmF0ZShtcCwgbWksICZhclsxXSwgbWktPm1heF90cF9yYXRlLAorCQkJdHhyYywgZmFsc2UsIHRydWUpOworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRTsKKwl9IGVsc2UgeworCQltaW5zdHJlbF9odF9zZXRfcmF0ZShtcCwgbWksICZhclswXSwgbWktPm1heF90cF9yYXRlLAorCQkJdHhyYywgZmFsc2UsIGZhbHNlKTsKKwkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfdHBfcmF0ZTIsCisJCQl0eHJjLCBmYWxzZSwgdHJ1ZSk7CisJfQorCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzJdLCBtaS0+bWF4X3Byb2JfcmF0ZSwgdHhyYywgZmFsc2UsIHRydWUpOworCisJYXJbM10uY291bnQgPSAwOworCWFyWzNdLmlkeCA9IC0xOworCisJbWktPnRvdGFsX3BhY2tldHMrKzsKKworCS8qIHdyYXBhcm91bmQgKi8KKwlpZiAobWktPnRvdGFsX3BhY2tldHMgPT0gfjApIHsKKwkJbWktPnRvdGFsX3BhY2tldHMgPSAwOworCQltaS0+c2FtcGxlX3BhY2tldHMgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK21pbnN0cmVsX2h0X3VwZGF0ZV9jYXBzKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCisJCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIG9wZXJfY2hhbl90eXBlKQoreworCXN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCA9IHByaXY7CisJc3RydWN0IG1pbnN0cmVsX2h0X3N0YV9wcml2ICptc3AgPSBwcml2X3N0YTsKKwlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSA9ICZtc3AtPmh0OworCXN0cnVjdCBpZWVlODAyMTFfbWNzX2luZm8gKm1jcyA9ICZzdGEtPmh0X2NhcC5tY3M7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChtcC0+aHcpOworCXUxNiBzdGFfY2FwID0gc3RhLT5odF9jYXAuY2FwOworCWludCBhY2tfZHVyOworCWludCBzdGJjOworCWludCBpOworCisJLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWluc3RyZWwgZm9yIGxlZ2FjeSBzdGF0aW9ucyAqLworCWlmICghc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7CisJCW1zcC0+aXNfaHQgPSBmYWxzZTsKKwkJbWVtc2V0KCZtc3AtPmxlZ2FjeSwgMCwgc2l6ZW9mKG1zcC0+bGVnYWN5KSk7CisJCW1zcC0+bGVnYWN5LnIgPSBtc3AtPnJhdGVsaXN0OworCQltc3AtPmxlZ2FjeS5zYW1wbGVfdGFibGUgPSBtc3AtPnNhbXBsZV90YWJsZTsKKwkJcmV0dXJuIG1hYzgwMjExX21pbnN0cmVsLnJhdGVfaW5pdChwcml2LCBzYmFuZCwgc3RhLCAmbXNwLT5sZWdhY3kpOworCX0KKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKG1pbnN0cmVsX21jc19ncm91cHMpICE9CisJCU1JTlNUUkVMX01BWF9TVFJFQU1TICogTUlOU1RSRUxfU1RSRUFNX0dST1VQUyk7CisKKwltc3AtPmlzX2h0ID0gdHJ1ZTsKKwltZW1zZXQobWksIDAsIHNpemVvZigqbWkpKTsKKwltaS0+c3RhdHNfdXBkYXRlID0gamlmZmllczsKKworCWFja19kdXIgPSBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24obG9jYWwsIDEwLCA2MCwgMSwgMSk7CisJbWktPm92ZXJoZWFkID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAwLCA2MCwgMSwgMSkgKyBhY2tfZHVyOworCW1pLT5vdmVyaGVhZF9ydHNjdHMgPSBtaS0+b3ZlcmhlYWQgKyAyICogYWNrX2R1cjsKKworCW1pLT5hdmdfYW1wZHVfbGVuID0gTUlOU1RSRUxfRlJBQygxLCAxKTsKKworCS8qIFdoZW4gdXNpbmcgTVJSLCBzYW1wbGUgbW9yZSBvbiB0aGUgZmlyc3QgYXR0ZW1wdCwgd2l0aG91dCBkZWxheSAqLworCWlmIChtcC0+aGFzX21ycikgeworCQltaS0+c2FtcGxlX2NvdW50ID0gMTY7CisJCW1pLT5zYW1wbGVfd2FpdCA9IDA7CisJfSBlbHNlIHsKKwkJbWktPnNhbXBsZV9jb3VudCA9IDg7CisJCW1pLT5zYW1wbGVfd2FpdCA9IDg7CisJfQorCW1pLT5zYW1wbGVfdHJpZXMgPSA0OworCisJc3RiYyA9IChzdGFfY2FwICYgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDKSA+PgorCQlJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CisJbWktPnR4X2ZsYWdzIHw9IHN0YmMgPDwgSUVFRTgwMjExX1RYX0NUTF9TVEJDX1NISUZUOworCisJaWYgKHN0YV9jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX0xEUENfQ09ESU5HKQorCQltaS0+dHhfZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9MRFBDOworCisJaWYgKG9wZXJfY2hhbl90eXBlICE9IE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMgJiYKKwkgICAgb3Blcl9jaGFuX3R5cGUgIT0gTkw4MDIxMV9DSEFOX0hUNDBQTFVTKQorCQlzdGFfY2FwICY9IH5JRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1pLT5ncm91cHMpOyBpKyspIHsKKwkJdTE2IHJlcSA9IDA7CisKKwkJbWktPmdyb3Vwc1tpXS5zdXBwb3J0ZWQgPSAwOworCQlpZiAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkgeworCQkJaWYgKG1pbnN0cmVsX21jc19ncm91cHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKQorCQkJCXJlcSB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MDsKKwkJCWVsc2UKKwkJCQlyZXEgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CisJCX0KKworCQlpZiAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpCisJCQlyZXEgfD0gSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDA7CisKKwkJaWYgKChzdGFfY2FwICYgcmVxKSAhPSByZXEpCisJCQljb250aW51ZTsKKworCQltaS0+Z3JvdXBzW2ldLnN1cHBvcnRlZCA9CisJCQltY3MtPnJ4X21hc2tbbWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5zdHJlYW1zIC0gMV07CisJfQorfQorCitzdGF0aWMgdm9pZAorbWluc3RyZWxfaHRfcmF0ZV9pbml0KHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhKQoreworCXN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCA9IHByaXY7CisKKwltaW5zdHJlbF9odF91cGRhdGVfY2Fwcyhwcml2LCBzYmFuZCwgc3RhLCBwcml2X3N0YSwgbXAtPmh3LT5jb25mLmNoYW5uZWxfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF9odF9yYXRlX3VwZGF0ZSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNoYW5nZWQsIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgb3Blcl9jaGFuX3R5cGUpCit7CisJbWluc3RyZWxfaHRfdXBkYXRlX2NhcHMocHJpdiwgc2JhbmQsIHN0YSwgcHJpdl9zdGEsIG9wZXJfY2hhbl90eXBlKTsKK30KKworc3RhdGljIHZvaWQgKgorbWluc3RyZWxfaHRfYWxsb2Nfc3RhKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhX3ByaXYgKm1zcDsKKwlzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAgPSBwcml2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbXAtPmh3OworCWludCBtYXhfcmF0ZXMgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGkrKykgeworCQlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbaV07CisJCWlmIChzYmFuZCAmJiBzYmFuZC0+bl9iaXRyYXRlcyA+IG1heF9yYXRlcykKKwkJCW1heF9yYXRlcyA9IHNiYW5kLT5uX2JpdHJhdGVzOworCX0KKworCW1zcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtaW5zdHJlbF9odF9zdGEpLCBnZnApOworCWlmICghbXNwKQorCQlyZXR1cm4gTlVMTDsKKworCW1zcC0+cmF0ZWxpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWluc3RyZWxfcmF0ZSkgKiBtYXhfcmF0ZXMsIGdmcCk7CisJaWYgKCFtc3AtPnJhdGVsaXN0KQorCQlnb3RvIGVycm9yOworCisJbXNwLT5zYW1wbGVfdGFibGUgPSBrbWFsbG9jKFNBTVBMRV9DT0xVTU5TICogbWF4X3JhdGVzLCBnZnApOworCWlmICghbXNwLT5zYW1wbGVfdGFibGUpCisJCWdvdG8gZXJyb3IxOworCisJcmV0dXJuIG1zcDsKKworZXJyb3IxOgorCWtmcmVlKG1zcC0+cmF0ZWxpc3QpOworZXJyb3I6CisJa2ZyZWUobXNwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK21pbnN0cmVsX2h0X2ZyZWVfc3RhKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhKQoreworCXN0cnVjdCBtaW5zdHJlbF9odF9zdGFfcHJpdiAqbXNwID0gcHJpdl9zdGE7CisKKwlrZnJlZShtc3AtPnNhbXBsZV90YWJsZSk7CisJa2ZyZWUobXNwLT5yYXRlbGlzdCk7CisJa2ZyZWUobXNwKTsKK30KKworc3RhdGljIHZvaWQgKgorbWluc3RyZWxfaHRfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXIpCit7CisJcmV0dXJuIG1hYzgwMjExX21pbnN0cmVsLmFsbG9jKGh3LCBkZWJ1Z2ZzZGlyKTsKK30KKworc3RhdGljIHZvaWQKK21pbnN0cmVsX2h0X2ZyZWUodm9pZCAqcHJpdikKK3sKKwltYWM4MDIxMV9taW5zdHJlbC5mcmVlKHByaXYpOworfQorCitzdGF0aWMgc3RydWN0IHJhdGVfY29udHJvbF9vcHMgbWFjODAyMTFfbWluc3RyZWxfaHQgPSB7CisJLm5hbWUgPSAibWluc3RyZWxfaHQiLAorCS50eF9zdGF0dXMgPSBtaW5zdHJlbF9odF90eF9zdGF0dXMsCisJLmdldF9yYXRlID0gbWluc3RyZWxfaHRfZ2V0X3JhdGUsCisJLnJhdGVfaW5pdCA9IG1pbnN0cmVsX2h0X3JhdGVfaW5pdCwKKwkucmF0ZV91cGRhdGUgPSBtaW5zdHJlbF9odF9yYXRlX3VwZGF0ZSwKKwkuYWxsb2Nfc3RhID0gbWluc3RyZWxfaHRfYWxsb2Nfc3RhLAorCS5mcmVlX3N0YSA9IG1pbnN0cmVsX2h0X2ZyZWVfc3RhLAorCS5hbGxvYyA9IG1pbnN0cmVsX2h0X2FsbG9jLAorCS5mcmVlID0gbWluc3RyZWxfaHRfZnJlZSwKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS5hZGRfc3RhX2RlYnVnZnMgPSBtaW5zdHJlbF9odF9hZGRfc3RhX2RlYnVnZnMsCisJLnJlbW92ZV9zdGFfZGVidWdmcyA9IG1pbnN0cmVsX2h0X3JlbW92ZV9zdGFfZGVidWdmcywKKyNlbmRpZgorfTsKKworCitzdGF0aWMgdm9pZAoraW5pdF9zYW1wbGVfdGFibGUodm9pZCkKK3sKKwlpbnQgY29sLCBpLCBuZXdfaWR4OworCXU4IHJuZFtNQ1NfR1JPVVBfUkFURVNdOworCisJbWVtc2V0KHNhbXBsZV90YWJsZSwgMHhmZiwgc2l6ZW9mKHNhbXBsZV90YWJsZSkpOworCWZvciAoY29sID0gMDsgY29sIDwgU0FNUExFX0NPTFVNTlM7IGNvbCsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQ1NfR1JPVVBfUkFURVM7IGkrKykgeworCQkJZ2V0X3JhbmRvbV9ieXRlcyhybmQsIHNpemVvZihybmQpKTsKKwkJCW5ld19pZHggPSAoaSArIHJuZFtpXSkgJSBNQ1NfR1JPVVBfUkFURVM7CisKKwkJCXdoaWxlIChzYW1wbGVfdGFibGVbY29sXVtuZXdfaWR4XSAhPSAweGZmKQorCQkJCW5ld19pZHggPSAobmV3X2lkeCArIDEpICUgTUNTX0dST1VQX1JBVEVTOworCisJCQlzYW1wbGVfdGFibGVbY29sXVtuZXdfaWR4XSA9IGk7CisJCX0KKwl9Cit9CisKK2ludCBfX2luaXQKK3JjODAyMTFfbWluc3RyZWxfaHRfaW5pdCh2b2lkKQoreworCWluaXRfc2FtcGxlX3RhYmxlKCk7CisJcmV0dXJuIGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoJm1hYzgwMjExX21pbnN0cmVsX2h0KTsKK30KKwordm9pZAorcmM4MDIxMV9taW5zdHJlbF9odF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCZtYWM4MDIxMV9taW5zdHJlbF9odCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5oIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjJkMmIyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fUkNfTUlOU1RSRUxfSFRfSAorI2RlZmluZSBfX1JDX01JTlNUUkVMX0hUX0gKKworLyoKKyAqIFRoZSBudW1iZXIgb2Ygc3RyZWFtcyBjYW4gYmUgY2hhbmdlZCB0byAyIHRvIHJlZHVjZSBjb2RlCisgKiBzaXplIGFuZCBtZW1vcnkgZm9vdHByaW50LgorICovCisjZGVmaW5lIE1JTlNUUkVMX01BWF9TVFJFQU1TCTMKKyNkZWZpbmUgTUlOU1RSRUxfU1RSRUFNX0dST1VQUwk0CisKKy8qIHNjYWxlZCBmcmFjdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgTUlOU1RSRUxfU0NBTEUJMTYKKyNkZWZpbmUgTUlOU1RSRUxfRlJBQyh2YWwsIGRpdikgKCgodmFsKSA8PCBNSU5TVFJFTF9TQ0FMRSkgLyBkaXYpCisjZGVmaW5lIE1JTlNUUkVMX1RSVU5DKHZhbCkgKCh2YWwpID4+IE1JTlNUUkVMX1NDQUxFKQorCisjZGVmaW5lIE1DU19HUk9VUF9SQVRFUwk4CisKK3N0cnVjdCBtY3NfZ3JvdXAgeworCXUzMiBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgZHVyYXRpb25bTUNTX0dST1VQX1JBVEVTXTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbWNzX2dyb3VwIG1pbnN0cmVsX21jc19ncm91cHNbXTsKKworc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgeworCS8qIGN1cnJlbnQgLyBsYXN0IHNhbXBsaW5nIHBlcmlvZCBhdHRlbXB0cy9zdWNjZXNzIGNvdW50ZXJzICovCisJdW5zaWduZWQgaW50IGF0dGVtcHRzLCBsYXN0X2F0dGVtcHRzOworCXVuc2lnbmVkIGludCBzdWNjZXNzLCBsYXN0X3N1Y2Nlc3M7CisKKwkvKiB0b3RhbCBhdHRlbXB0cy9zdWNjZXNzIGNvdW50ZXJzICovCisJdTY0IGF0dF9oaXN0LCBzdWNjX2hpc3Q7CisKKwkvKiBjdXJyZW50IHRocm91Z2hwdXQgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3RwOworCisJLyogcGFja2V0IGRlbGl2ZXJ5IHByb2JhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3Byb2IsIHByb2JhYmlsaXR5OworCisJLyogbWF4aW11bSByZXRyeSBjb3VudHMgKi8KKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CisJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50X3J0c2N0czsKKworCWJvb2wgcmV0cnlfdXBkYXRlZDsKKwl1OCBzYW1wbGVfc2tpcHBlZDsKK307CisKK3N0cnVjdCBtaW5zdHJlbF9tY3NfZ3JvdXBfZGF0YSB7CisJdTggaW5kZXg7CisJdTggY29sdW1uOworCisJLyogYml0ZmllbGQgb2Ygc3VwcG9ydGVkIE1DUyByYXRlcyBvZiB0aGlzIGdyb3VwICovCisJdTggc3VwcG9ydGVkOworCisJLyogc2VsZWN0ZWQgcHJpbWFyeSByYXRlcyAqLworCXVuc2lnbmVkIGludCBtYXhfdHBfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgbWF4X3RwX3JhdGUyOworCXVuc2lnbmVkIGludCBtYXhfcHJvYl9yYXRlOworCisJLyogTUNTIHJhdGUgc3RhdGlzdGljcyAqLworCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzIHJhdGVzW01DU19HUk9VUF9SQVRFU107Cit9OworCitzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhIHsKKwkvKiBhbXBkdSBsZW5ndGggKGF2ZXJhZ2UsIHBlciBzYW1wbGluZyBpbnRlcnZhbCkgKi8KKwl1bnNpZ25lZCBpbnQgYW1wZHVfbGVuOworCXVuc2lnbmVkIGludCBhbXBkdV9wYWNrZXRzOworCisJLyogYW1wZHUgbGVuZ3RoIChFV01BKSAqLworCXVuc2lnbmVkIGludCBhdmdfYW1wZHVfbGVuOworCisJLyogYmVzdCB0aHJvdWdocHV0IHJhdGUgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3RwX3JhdGU7CisKKwkvKiBzZWNvbmQgYmVzdCB0aHJvdWdocHV0IHJhdGUgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3RwX3JhdGUyOworCisJLyogYmVzdCBwcm9iYWJpbGl0eSByYXRlICovCisJdW5zaWduZWQgaW50IG1heF9wcm9iX3JhdGU7CisKKwkvKiB0aW1lIG9mIGxhc3Qgc3RhdHVzIHVwZGF0ZSAqLworCXVuc2lnbmVkIGxvbmcgc3RhdHNfdXBkYXRlOworCisJLyogb3ZlcmhlYWQgdGltZSBpbiB1c2VjIGZvciBlYWNoIGZyYW1lICovCisJdW5zaWduZWQgaW50IG92ZXJoZWFkOworCXVuc2lnbmVkIGludCBvdmVyaGVhZF9ydHNjdHM7CisKKwl1bnNpZ25lZCBpbnQgdG90YWxfcGFja2V0czsKKwl1bnNpZ25lZCBpbnQgc2FtcGxlX3BhY2tldHM7CisKKwkvKiB0eCBmbGFncyB0byBhZGQgZm9yIGZyYW1lcyBmb3IgdGhpcyBzdGEgKi8KKwl1MzIgdHhfZmxhZ3M7CisKKwl1OCBzYW1wbGVfd2FpdDsKKwl1OCBzYW1wbGVfdHJpZXM7CisJdTggc2FtcGxlX2NvdW50OworCXU4IHNhbXBsZV9zbG93OworCisJLyogY3VycmVudCBNQ1MgZ3JvdXAgdG8gYmUgc2FtcGxlZCAqLworCXU4IHNhbXBsZV9ncm91cDsKKworCS8qIE1DUyByYXRlIGdyb3VwIGluZm8gYW5kIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgbWluc3RyZWxfbWNzX2dyb3VwX2RhdGEgZ3JvdXBzW01JTlNUUkVMX01BWF9TVFJFQU1TICogTUlOU1RSRUxfU1RSRUFNX0dST1VQU107Cit9OworCitzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhX3ByaXYgeworCXVuaW9uIHsKKwkJc3RydWN0IG1pbnN0cmVsX2h0X3N0YSBodDsKKwkJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvIGxlZ2FjeTsKKwl9OworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJc3RydWN0IGRlbnRyeSAqZGJnX3N0YXRzOworI2VuZGlmCisJdm9pZCAqcmF0ZWxpc3Q7CisJdm9pZCAqc2FtcGxlX3RhYmxlOworCWJvb2wgaXNfaHQ7Cit9OworCit2b2lkIG1pbnN0cmVsX2h0X2FkZF9zdGFfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSwgc3RydWN0IGRlbnRyeSAqZGlyKTsKK3ZvaWQgbWluc3RyZWxfaHRfcmVtb3ZlX3N0YV9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1YTRiMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0X2RlYnVnZnMuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgInJjODAyMTFfbWluc3RyZWwuaCIKKyNpbmNsdWRlICJyYzgwMjExX21pbnN0cmVsX2h0LmgiCisKK3N0YXRpYyBpbnQKK21pbnN0cmVsX2h0X3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1pbnN0cmVsX2h0X3N0YV9wcml2ICptc3AgPSBpbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pID0gJm1zcC0+aHQ7CisJc3RydWN0IG1pbnN0cmVsX2RlYnVnZnNfaW5mbyAqbXM7CisJdW5zaWduZWQgaW50IGksIGosIHRwLCBwcm9iLCBlcHJvYjsKKwljaGFyICpwOworCWludCByZXQ7CisKKwlpZiAoIW1zcC0+aXNfaHQpIHsKKwkJaW5vZGUtPmlfcHJpdmF0ZSA9ICZtc3AtPmxlZ2FjeTsKKwkJcmV0ID0gbWluc3RyZWxfc3RhdHNfb3Blbihpbm9kZSwgZmlsZSk7CisJCWlub2RlLT5pX3ByaXZhdGUgPSBtc3A7CisJCXJldHVybiByZXQ7CisJfQorCisJbXMgPSBrbWFsbG9jKHNpemVvZigqbXMpICsgODE5MiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBtczsKKwlwID0gbXMtPmJ1ZjsKKwlwICs9IHNwcmludGYocCwgInR5cGUgICAgICByYXRlICAgICB0aHJvdWdocHV0ICBld21hIHByb2IgICB0aGlzIHByb2IgICIKKwkJCSJ0aGlzIHN1Y2MvYXR0ZW1wdCAgIHN1Y2Nlc3MgICAgYXR0ZW1wdHNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBNSU5TVFJFTF9NQVhfU1RSRUFNUyAqIE1JTlNUUkVMX1NUUkVBTV9HUk9VUFM7IGkrKykgeworCQljaGFyIGh0bW9kZSA9ICcyJzsKKwkJY2hhciBnaW1vZGUgPSAnTCc7CisKKwkJaWYgKCFtaS0+Z3JvdXBzW2ldLnN1cHBvcnRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtaW5zdHJlbF9tY3NfZ3JvdXBzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkKKwkJCWh0bW9kZSA9ICc0JzsKKwkJaWYgKG1pbnN0cmVsX21jc19ncm91cHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpCisJCQlnaW1vZGUgPSAnUyc7CisKKwkJZm9yIChqID0gMDsgaiA8IE1DU19HUk9VUF9SQVRFUzsgaisrKSB7CisJCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIgPSAmbWktPmdyb3Vwc1tpXS5yYXRlc1tqXTsKKwkJCWludCBpZHggPSBpICogTUNTX0dST1VQX1JBVEVTICsgajsKKworCQkJaWYgKCEobWktPmdyb3Vwc1tpXS5zdXBwb3J0ZWQgJiBCSVQoaikpKQorCQkJCWNvbnRpbnVlOworCisJCQlwICs9IHNwcmludGYocCwgIkhUJWMwLyVjR0kgIiwgaHRtb2RlLCBnaW1vZGUpOworCisJCQkqKHArKykgPSAoaWR4ID09IG1pLT5tYXhfdHBfcmF0ZSkgPyAnVCcgOiAnICc7CisJCQkqKHArKykgPSAoaWR4ID09IG1pLT5tYXhfdHBfcmF0ZTIpID8gJ3QnIDogJyAnOworCQkJKihwKyspID0gKGlkeCA9PSBtaS0+bWF4X3Byb2JfcmF0ZSkgPyAnUCcgOiAnICc7CisJCQlwICs9IHNwcmludGYocCwgIk1DUyUtMnUiLCAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5zdHJlYW1zIC0gMSkgKgorCQkJCQlNQ1NfR1JPVVBfUkFURVMgKyBqKTsKKworCQkJdHAgPSBtci0+Y3VyX3RwIC8gMTA7CisJCQlwcm9iID0gTUlOU1RSRUxfVFJVTkMobXItPmN1cl9wcm9iICogMTAwMCk7CisJCQllcHJvYiA9IE1JTlNUUkVMX1RSVU5DKG1yLT5wcm9iYWJpbGl0eSAqIDEwMDApOworCisJCQlwICs9IHNwcmludGYocCwgIiAgJTZ1LiUxdSAgICU2dS4lMXUgICAlNnUuJTF1ICAgICAgICAiCisJCQkJCSIlM3UoJTN1KSAgICU4bGx1ICAgICU4bGx1XG4iLAorCQkJCQl0cCAvIDEwLCB0cCAlIDEwLAorCQkJCQllcHJvYiAvIDEwLCBlcHJvYiAlIDEwLAorCQkJCQlwcm9iIC8gMTAsIHByb2IgJSAxMCwKKwkJCQkJbXItPmxhc3Rfc3VjY2VzcywKKwkJCQkJbXItPmxhc3RfYXR0ZW1wdHMsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXItPnN1Y2NfaGlzdCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltci0+YXR0X2hpc3QpOworCQl9CisJfQorCXAgKz0gc3ByaW50ZihwLCAiXG5Ub3RhbCBwYWNrZXQgY291bnQ6OiAgICBpZGVhbCAlZCAgICAgICIKKwkJCSJsb29rYXJvdW5kICVkXG4iLAorCQkJbWF4KDAsIChpbnQpIG1pLT50b3RhbF9wYWNrZXRzIC0gKGludCkgbWktPnNhbXBsZV9wYWNrZXRzKSwKKwkJCW1pLT5zYW1wbGVfcGFja2V0cyk7CisJcCArPSBzcHJpbnRmKHAsICJBdmVyYWdlIEEtTVBEVSBsZW5ndGg6ICVkLiVkXG4iLAorCQlNSU5TVFJFTF9UUlVOQyhtaS0+YXZnX2FtcGR1X2xlbiksCisJCU1JTlNUUkVMX1RSVU5DKG1pLT5hdmdfYW1wZHVfbGVuICogMTApICUgMTApOworCW1zLT5sZW4gPSBwIC0gbXMtPmJ1ZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaW5zdHJlbF9odF9zdGF0X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBtaW5zdHJlbF9odF9zdGF0c19vcGVuLAorCS5yZWFkID0gbWluc3RyZWxfc3RhdHNfcmVhZCwKKwkucmVsZWFzZSA9IG1pbnN0cmVsX3N0YXRzX3JlbGVhc2UsCit9OworCit2b2lkCittaW5zdHJlbF9odF9hZGRfc3RhX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEsIHN0cnVjdCBkZW50cnkgKmRpcikKK3sKKwlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhX3ByaXYgKm1zcCA9IHByaXZfc3RhOworCisJbXNwLT5kYmdfc3RhdHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyY19zdGF0cyIsIFNfSVJVR08sIGRpciwgbXNwLAorCQkJJm1pbnN0cmVsX2h0X3N0YXRfZm9wcyk7Cit9CisKK3ZvaWQKK21pbnN0cmVsX2h0X3JlbW92ZV9zdGFfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSkKK3sKKwlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhX3ByaXYgKm1zcCA9IHByaXZfc3RhOworCisJZGVidWdmc19yZW1vdmUobXNwLT5kYmdfc3RhdHMpOworfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3J4LmMgYi9uZXQvbWFjODAyMTEvcnguYwppbmRleCBiZTlhYmMyLi5mYTBmMzdlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcnguYworKysgYi9uZXQvbWFjODAyMTEvcnguYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoc2tiMikgewogCQkJCXNrYjItPmRldiA9IHByZXZfZGV2OwotCQkJCW5ldGlmX3J4KHNrYjIpOworCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYjIpOwogCQkJfQogCQl9CiAKQEAgLTMwNCw3ICszMDQsNyBAQAogCiAJaWYgKHByZXZfZGV2KSB7CiAJCXNrYi0+ZGV2ID0gcHJldl9kZXY7Ci0JCW5ldGlmX3J4KHNrYik7CisJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJfSBlbHNlCiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIApAQCAtNzE5LDE2ICs3MTksMTMgQEAKIAogCXRpZCA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCi0Jc3Bpbl9sb2NrKCZzdGEtPmxvY2spOwotCi0JaWYgKCFzdGEtPmFtcGR1X21sbWUudGlkX2FjdGl2ZV9yeFt0aWRdKQotCQlnb3RvIGRvbnRfcmVvcmRlcl91bmxvY2s7Ci0KLQl0aWRfYWdnX3J4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdOworCXRpZF9hZ2dfcnggPSByY3VfZGVyZWZlcmVuY2Uoc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdKTsKKwlpZiAoIXRpZF9hZ2dfcngpCisJCWdvdG8gZG9udF9yZW9yZGVyOwogCiAJLyogcW9zIG51bGwgZGF0YSBmcmFtZXMgYXJlIGV4Y2x1ZGVkICovCiAJaWYgKHVubGlrZWx5KGhkci0+ZnJhbWVfY29udHJvbCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQykpKQotCQlnb3RvIGRvbnRfcmVvcmRlcl91bmxvY2s7CisJCWdvdG8gZG9udF9yZW9yZGVyOwogCiAJLyogbmV3LCBwb3RlbnRpYWxseSB1bi1vcmRlcmVkLCBhbXBkdSBmcmFtZSAtIHByb2Nlc3MgaXQgKi8KIApAQCAtNzQwLDIwICs3MzcsMjIgQEAKIAkvKiBpZiB0aGlzIG1wZHUgaXMgZnJhZ21lbnRlZCAtIHRlcm1pbmF0ZSByeCBhZ2dyZWdhdGlvbiBzZXNzaW9uICovCiAJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKIAlpZiAoc2MgJiBJRUVFODAyMTFfU0NUTF9GUkFHKSB7Ci0JCXNwaW5fdW5sb2NrKCZzdGEtPmxvY2spOwotCQlfX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RhLCB0aWQsIFdMQU5fQkFDS19SRUNJUElFTlQsCi0JCQkJCSAgICAgICBXTEFOX1JFQVNPTl9RU1RBX1JFUVVJUkVfU0VUVVApOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfVFlQRV9GUkFNRTsKKwkJc2tiX3F1ZXVlX3RhaWwoJnJ4LT5zZGF0YS0+c2tiX3F1ZXVlLCBza2IpOworCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmcngtPnNkYXRhLT53b3JrKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChpZWVlODAyMTFfc3RhX21hbmFnZV9yZW9yZGVyX2J1ZihodywgdGlkX2FnZ19yeCwgc2tiLCBmcmFtZXMpKSB7Ci0JCXNwaW5fdW5sb2NrKCZzdGEtPmxvY2spOworCS8qCisJICogTm8gbG9ja2luZyBuZWVkZWQgLS0gd2Ugd2lsbCBvbmx5IGV2ZXIgcHJvY2VzcyBvbmUKKwkgKiBSWCBwYWNrZXQgYXQgYSB0aW1lLCBhbmQgdGh1cyBvd24gdGlkX2FnZ19yeC4gQWxsCisJICogb3RoZXIgY29kZSBtYW5pcHVsYXRpbmcgaXQgbmVlZHMgdG8gKGFuZCBkb2VzKSBtYWtlCisJICogc3VyZSB0aGF0IHdlIGNhbm5vdCBnZXQgdG8gaXQgYW55IG1vcmUgYmVmb3JlIGRvaW5nCisJICogYW55dGhpbmcgd2l0aCBpdC4KKwkgKi8KKwlpZiAoaWVlZTgwMjExX3N0YV9tYW5hZ2VfcmVvcmRlcl9idWYoaHcsIHRpZF9hZ2dfcngsIHNrYiwgZnJhbWVzKSkKIAkJcmV0dXJuOwotCX0KIAotIGRvbnRfcmVvcmRlcl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJnN0YS0+bG9jayk7CiAgZG9udF9yZW9yZGVyOgogCV9fc2tiX3F1ZXVlX3RhaWwoZnJhbWVzLCBza2IpOwogfQpAQCAtODI1LDYgKzgyNCw3IEBACiAJaWVlZTgwMjExX3J4X3Jlc3VsdCByZXN1bHQgPSBSWF9EUk9QX1VOVVNBQkxFOwogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICpzdGFrZXkgPSBOVUxMOwogCWludCBtbWllX2tleWlkeCA9IC0xOworCV9fbGUxNiBmYzsKIAogCS8qCiAJICogS2V5IHNlbGVjdGlvbiAxMDEKQEAgLTg2NiwxMyArODY2LDE1IEBACiAJaWYgKHJ4LT5zdGEpCiAJCXN0YWtleSA9IHJjdV9kZXJlZmVyZW5jZShyeC0+c3RhLT5rZXkpOwogCi0JaWYgKCFpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2NvbnRyb2wpKQorCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisJaWYgKCFpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChmYykpCiAJCW1taWVfa2V5aWR4ID0gaWVlZTgwMjExX2dldF9tbWllX2tleWlkeChyeC0+c2tiKTsKIAogCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgJiYgc3Rha2V5KSB7CiAJCXJ4LT5rZXkgPSBzdGFrZXk7CiAJCS8qIFNraXAgZGVjcnlwdGlvbiBpZiB0aGUgZnJhbWUgaXMgbm90IHByb3RlY3RlZC4gKi8KLQkJaWYgKCFpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlpZiAoIWllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGZjKSkKIAkJCXJldHVybiBSWF9DT05USU5VRTsKIAl9IGVsc2UgaWYgKG1taWVfa2V5aWR4ID49IDApIHsKIAkJLyogQnJvYWRjYXN0L211bHRpY2FzdCByb2J1c3QgbWFuYWdlbWVudCBmcmFtZSAvIEJJUCAqLwpAQCAtODg0LDcgKzg4Niw3IEBACiAJCSAgICBtbWllX2tleWlkeCA+PSBOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTKQogCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsgLyogdW5leHBlY3RlZCBCSVAga2V5aWR4ICovCiAJCXJ4LT5rZXkgPSByY3VfZGVyZWZlcmVuY2UocngtPnNkYXRhLT5rZXlzW21taWVfa2V5aWR4XSk7Ci0JfSBlbHNlIGlmICghaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCX0gZWxzZSBpZiAoIWllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGZjKSkgewogCQkvKgogCQkgKiBUaGUgZnJhbWUgd2FzIG5vdCBwcm90ZWN0ZWQsIHNvIHNraXAgZGVjcnlwdGlvbi4gSG93ZXZlciwgd2UKIAkJICogbmVlZCB0byBzZXQgcngtPmtleSBpZiB0aGVyZSBpcyBhIGtleSB0aGF0IGNvdWxkIGhhdmUgYmVlbgpAQCAtODkyLDcgKzg5NCw3IEBACiAJCSAqIGhhdmUgYmVlbiBleHBlY3RlZC4KIAkJICovCiAJCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSBOVUxMOwotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgorCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpICYmCiAJCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJgogCQkgICAgKGtleSA9IHJjdV9kZXJlZmVyZW5jZShyeC0+c2RhdGEtPmRlZmF1bHRfbWdtdF9rZXkpKSkKIAkJCXJ4LT5rZXkgPSBrZXk7CkBAIC05MTQsNyArOTE2LDcgQEAKIAkJICAgIChzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0lWX1NUUklQUEVEKSkKIAkJCXJldHVybiBSWF9DT05USU5VRTsKIAotCQloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CisJCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOwogCiAJCWlmIChyeC0+c2tiLT5sZW4gPCA4ICsgaGRybGVuKQogCQkJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7IC8qIFRPRE86IGNvdW50IHRoaXM/ICovCkBAIC05NDcsMTkgKzk0OSwxNyBAQAogCiAJaWYgKHNrYl9saW5lYXJpemUocngtPnNrYikpCiAJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcngtPnNrYi0+ZGF0YTsKLQotCS8qIENoZWNrIGZvciB3ZWFrIElWcyBpZiBwb3NzaWJsZSAqLwotCWlmIChyeC0+c3RhICYmIHJ4LT5rZXktPmNvbmYuYWxnID09IEFMR19XRVAgJiYKLQkgICAgaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCSAgICAoIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0lWX1NUUklQUEVEKSB8fAotCSAgICAgIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0RFQ1JZUFRFRCkpICYmCi0JICAgIGllZWU4MDIxMV93ZXBfaXNfd2Vha19pdihyeC0+c2tiLCByeC0+a2V5KSkKLQkJcngtPnN0YS0+d2VwX3dlYWtfaXZfY291bnQrKzsKKwkvKiB0aGUgaGRyIHZhcmlhYmxlIGlzIGludmFsaWQgbm93ISAqLwogCiAJc3dpdGNoIChyeC0+a2V5LT5jb25mLmFsZykgewogCWNhc2UgQUxHX1dFUDoKKwkJLyogQ2hlY2sgZm9yIHdlYWsgSVZzIGlmIHBvc3NpYmxlICovCisJCWlmIChyeC0+c3RhICYmIGllZWU4MDIxMV9pc19kYXRhKGZjKSAmJgorCQkgICAgKCEoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19JVl9TVFJJUFBFRCkgfHwKKwkJICAgICAhKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfREVDUllQVEVEKSkgJiYKKwkJICAgIGllZWU4MDIxMV93ZXBfaXNfd2Vha19pdihyeC0+c2tiLCByeC0+a2V5KSkKKwkJCXJ4LT5zdGEtPndlcF93ZWFrX2l2X2NvdW50Kys7CisKIAkJcmVzdWx0ID0gaWVlZTgwMjExX2NyeXB0b193ZXBfZGVjcnlwdChyeCk7CiAJCWJyZWFrOwogCWNhc2UgQUxHX1RLSVA6CkBAIC0xMjY3LDExICsxMjY3LDEzIEBACiAJCQkJCQkgcngtPnF1ZXVlLCAmKHJ4LT5za2IpKTsKIAkJaWYgKHJ4LT5rZXkgJiYgcngtPmtleS0+Y29uZi5hbGcgPT0gQUxHX0NDTVAgJiYKIAkJICAgIGllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGZjKSkgeworCQkJaW50IHF1ZXVlID0gaWVlZTgwMjExX2lzX21nbXQoZmMpID8KKwkJCQlOVU1fUlhfREFUQV9RVUVVRVMgOiByeC0+cXVldWU7CiAJCQkvKiBTdG9yZSBDQ01QIFBOIHNvIHRoYXQgd2UgY2FuIHZlcmlmeSB0aGF0IHRoZSBuZXh0CiAJCQkgKiBmcmFnbWVudCBoYXMgYSBzZXF1ZW50aWFsIFBOIHZhbHVlLiAqLwogCQkJZW50cnktPmNjbXAgPSAxOwogCQkJbWVtY3B5KGVudHJ5LT5sYXN0X3BuLAotCQkJICAgICAgIHJ4LT5rZXktPnUuY2NtcC5yeF9wbltyeC0+cXVldWVdLAorCQkJICAgICAgIHJ4LT5rZXktPnUuY2NtcC5yeF9wbltxdWV1ZV0sCiAJCQkgICAgICAgQ0NNUF9QTl9MRU4pOwogCQl9CiAJCXJldHVybiBSWF9RVUVVRUQ7CkBAIC0xMjkxLDYgKzEyOTMsNyBAQAogCWlmIChlbnRyeS0+Y2NtcCkgewogCQlpbnQgaTsKIAkJdTggcG5bQ0NNUF9QTl9MRU5dLCAqcnBuOworCQlpbnQgcXVldWU7CiAJCWlmICghcngtPmtleSB8fCByeC0+a2V5LT5jb25mLmFsZyAhPSBBTEdfQ0NNUCkKIAkJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCQltZW1jcHkocG4sIGVudHJ5LT5sYXN0X3BuLCBDQ01QX1BOX0xFTik7CkBAIC0xMjk5LDcgKzEzMDIsOSBAQAogCQkJaWYgKHBuW2ldKQogCQkJCWJyZWFrOwogCQl9Ci0JCXJwbiA9IHJ4LT5rZXktPnUuY2NtcC5yeF9wbltyeC0+cXVldWVdOworCQlxdWV1ZSA9IGllZWU4MDIxMV9pc19tZ210KGZjKSA/CisJCQlOVU1fUlhfREFUQV9RVUVVRVMgOiByeC0+cXVldWU7CisJCXJwbiA9IHJ4LT5rZXktPnUuY2NtcC5yeF9wbltxdWV1ZV07CiAJCWlmIChtZW1jbXAocG4sIHJwbiwgQ0NNUF9QTl9MRU4pKQogCQkJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7CiAJCW1lbWNweShlbnRyeS0+bGFzdF9wbiwgcG4sIENDTVBfUE5fTEVOKTsKQEAgLTE1NzMsNyArMTU3OCw3IEBACiAJCQkvKiBkZWxpdmVyIHRvIGxvY2FsIHN0YWNrICovCiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7Ci0JCQluZXRpZl9yeChza2IpOworCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJfQogCX0KIApAQCAtMTgyOSwxMyArMTgzNCwxMSBAQAogCQkJCSAgJmJhcl9kYXRhLCBzaXplb2YoYmFyX2RhdGEpKSkKIAkJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKLQkJc3Bpbl9sb2NrKCZyeC0+c3RhLT5sb2NrKTsKIAkJdGlkID0gbGUxNl90b19jcHUoYmFyX2RhdGEuY29udHJvbCkgPj4gMTI7Ci0JCWlmICghcngtPnN0YS0+YW1wZHVfbWxtZS50aWRfYWN0aXZlX3J4W3RpZF0pIHsKLQkJCXNwaW5fdW5sb2NrKCZyeC0+c3RhLT5sb2NrKTsKKworCQl0aWRfYWdnX3J4ID0gcmN1X2RlcmVmZXJlbmNlKHJ4LT5zdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOworCQlpZiAoIXRpZF9hZ2dfcngpCiAJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwotCQl9Ci0JCXRpZF9hZ2dfcnggPSByeC0+c3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdOwogCiAJCXN0YXJ0X3NlcV9udW0gPSBsZTE2X3RvX2NwdShiYXJfZGF0YS5zdGFydF9zZXFfbnVtKSA+PiA0OwogCkBAIC0xODQ4LDExICsxODUxLDE1IEBACiAJCWllZWU4MDIxMV9yZWxlYXNlX3Jlb3JkZXJfZnJhbWVzKGh3LCB0aWRfYWdnX3J4LCBzdGFydF9zZXFfbnVtLAogCQkJCQkJIGZyYW1lcyk7CiAJCWtmcmVlX3NrYihza2IpOwotCQlzcGluX3VubG9jaygmcngtPnN0YS0+bG9jayk7CiAJCXJldHVybiBSWF9RVUVVRUQ7CiAJfQogCi0JcmV0dXJuIFJYX0NPTlRJTlVFOworCS8qCisJICogQWZ0ZXIgdGhpcyBwb2ludCwgd2Ugb25seSB3YW50IG1hbmFnZW1lbnQgZnJhbWVzLAorCSAqIHNvIHdlIGNhbiBkcm9wIGFsbCByZW1haW5pbmcgY29udHJvbCBmcmFtZXMgdG8KKwkgKiBjb29rZWQgbW9uaXRvciBpbnRlcmZhY2VzLgorCSAqLworCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3NhX3F1ZXJ5X3JlcShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTE5NDQsMzAgKzE5NTEsMjcgQEAKIAkJaWYgKGxlbiA8IElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKyAxKQogCQkJYnJlYWs7CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQotCQkJcmV0dXJuIGllZWU4MDIxMV9zdGFfcnhfbWdtdChzZGF0YSwgcngtPnNrYik7Ci0KIAkJc3dpdGNoIChtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5hY3Rpb25fY29kZSkgewogCQljYXNlIFdMQU5fQUNUSU9OX0FEREJBX1JFUToKIAkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCiAJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxKSkpCi0JCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLQkJCWllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3JlcXVlc3QobG9jYWwsIHJ4LT5zdGEsIG1nbXQsIGxlbik7Ci0JCQlnb3RvIGhhbmRsZWQ7CisJCQkJZ290byBpbnZhbGlkOworCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDoKIAkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCiAJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcCkpKQotCQkJCWJyZWFrOwotCQkJaWVlZTgwMjExX3Byb2Nlc3NfYWRkYmFfcmVzcChsb2NhbCwgcngtPnN0YSwgbWdtdCwgbGVuKTsKLQkJCWdvdG8gaGFuZGxlZDsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQlicmVhazsKIAkJY2FzZSBXTEFOX0FDVElPTl9ERUxCQToKIAkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCiAJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuZGVsYmEpKSkKLQkJCQlicmVhazsKLQkJCWllZWU4MDIxMV9wcm9jZXNzX2RlbGJhKHNkYXRhLCByeC0+c3RhLCBtZ210LCBsZW4pOwotCQkJZ290byBoYW5kbGVkOworCQkJCWdvdG8gaW52YWxpZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbnZhbGlkOwogCQl9Ci0JCWJyZWFrOworCisJCWdvdG8gcXVldWU7CiAJY2FzZSBXTEFOX0NBVEVHT1JZX1NQRUNUUlVNX01HTVQ6CiAJCWlmIChsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kICE9IElFRUU4MDIxMV9CQU5EXzVHSFopCiAJCQlicmVhazsKQEAgLTE5OTcsNyArMjAwMSw3IEBACiAJCQlpZiAobWVtY21wKG1nbXQtPmJzc2lkLCBzZGF0YS0+dS5tZ2QuYnNzaWQsIEVUSF9BTEVOKSkKIAkJCQlicmVhazsKIAotCQkJcmV0dXJuIGllZWU4MDIxMV9zdGFfcnhfbWdtdChzZGF0YSwgcngtPnNrYik7CisJCQlnb3RvIHF1ZXVlOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DQVRFR09SWV9TQV9RVUVSWToKQEAgLTIwMTUsMTEgKzIwMTksMTIgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NBVEVHT1JZX01FU0hfUExJTks6CiAJY2FzZSBXTEFOX0NBVEVHT1JZX01FU0hfUEFUSF9TRUw6Ci0JCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQotCQkJcmV0dXJuIGllZWU4MDIxMV9tZXNoX3J4X21nbXQoc2RhdGEsIHJ4LT5za2IpOwotCQlicmVhazsKKwkJaWYgKCFpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQorCQkJYnJlYWs7CisJCWdvdG8gcXVldWU7CiAJfQogCisgaW52YWxpZDoKIAkvKgogCSAqIEZvciBBUCBtb2RlLCBob3N0YXBkIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBhbnkgYWN0aW9uCiAJICogZnJhbWVzIHRoYXQgd2UgZGlkbid0IGhhbmRsZSwgaW5jbHVkaW5nIHJldHVybmluZyB1bmtub3duCkBAIC0yMDM5LDggKzIwNDQsNyBAQAogCSAqLwogCXN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgotCSAgICBjZmc4MDIxMV9yeF9hY3Rpb24ocngtPnNkYXRhLT5kZXYsIHN0YXR1cy0+ZnJlcSwKKwlpZiAoY2ZnODAyMTFfcnhfYWN0aW9uKHJ4LT5zZGF0YS0+ZGV2LCBzdGF0dXMtPmZyZXEsCiAJCQkgICAgICAgcngtPnNrYi0+ZGF0YSwgcngtPnNrYi0+bGVuLAogCQkJICAgICAgIEdGUF9BVE9NSUMpKQogCQlnb3RvIGhhbmRsZWQ7CkBAIC0yMDUyLDExICsyMDU2LDExIEBACiAJbnNrYiA9IHNrYl9jb3B5X2V4cGFuZChyeC0+c2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20sIDAsCiAJCQkgICAgICAgR0ZQX0FUT01JQyk7CiAJaWYgKG5za2IpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHZvaWQgKiluc2tiLT5kYXRhOworCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm5tZ210ID0gKHZvaWQgKiluc2tiLT5kYXRhOwogCi0JCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5IHw9IDB4ODA7Ci0JCW1lbWNweShtZ210LT5kYSwgbWdtdC0+c2EsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KG1nbXQtPnNhLCByeC0+c2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CisJCW5tZ210LT51LmFjdGlvbi5jYXRlZ29yeSB8PSAweDgwOworCQltZW1jcHkobm1nbXQtPmRhLCBubWdtdC0+c2EsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG5tZ210LT5zYSwgcngtPnNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCiAJCW1lbXNldChuc2tiLT5jYiwgMCwgc2l6ZW9mKG5za2ItPmNiKSk7CiAKQEAgLTIwNjgsNiArMjA3MiwxNCBAQAogCQlyeC0+c3RhLT5yeF9wYWNrZXRzKys7CiAJZGV2X2tmcmVlX3NrYihyeC0+c2tiKTsKIAlyZXR1cm4gUlhfUVVFVUVEOworCisgcXVldWU6CisJcngtPnNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfVFlQRV9GUkFNRTsKKwlza2JfcXVldWVfdGFpbCgmc2RhdGEtPnNrYl9xdWV1ZSwgcngtPnNrYik7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKKwlpZiAocngtPnN0YSkKKwkJcngtPnN0YS0+cnhfcGFja2V0cysrOworCXJldHVybiBSWF9RVUVVRUQ7CiB9CiAKIHN0YXRpYyBpZWVlODAyMTFfcnhfcmVzdWx0IGRlYnVnX25vaW5saW5lCkBAIC0yMDc1LDEwICsyMDg3LDE1IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSByeC0+c2RhdGE7CiAJaWVlZTgwMjExX3J4X3Jlc3VsdCByeHM7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHZvaWQgKilyeC0+c2tiLT5kYXRhOworCV9fbGUxNiBzdHlwZTsKIAogCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKKwlpZiAocngtPnNrYi0+bGVuIDwgMjQpCisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisKIAlpZiAoaWVlZTgwMjExX2Ryb3BfdW5lbmNyeXB0ZWRfbWdtdChyeCkpCiAJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCkBAIC0yMDg2LDE2ICsyMTAzLDQyIEBACiAJaWYgKHJ4cyAhPSBSWF9DT05USU5VRSkKIAkJcmV0dXJuIHJ4czsKIAotCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQotCQlyZXR1cm4gaWVlZTgwMjExX21lc2hfcnhfbWdtdChzZGF0YSwgcngtPnNrYik7CisJc3R5cGUgPSBtZ210LT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfU1RZUEUpOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJcmV0dXJuIGllZWU4MDIxMV9pYnNzX3J4X21nbXQoc2RhdGEsIHJ4LT5za2IpOworCWlmICghaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSAmJgorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCi0JCXJldHVybiBpZWVlODAyMTFfc3RhX3J4X21nbXQoc2RhdGEsIHJ4LT5za2IpOworCXN3aXRjaCAoc3R5cGUpIHsKKwljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOgorCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOgorCQkvKiBwcm9jZXNzIGZvciBhbGw6IG1lc2gsIG1sbWUsIGlic3MgKi8KKwkJYnJlYWs7CisJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfREVBVVRIKToKKwljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk6CisJCS8qIHByb2Nlc3Mgb25seSBmb3Igc3RhdGlvbiAqLworCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCQlicmVhazsKKwljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOgorCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOgorCQkvKiBwcm9jZXNzIG9ubHkgZm9yIGlic3MgKi8KKwkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisJfQogCi0JcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwkvKiBxdWV1ZSB1cCBmcmFtZSBhbmQga2ljayBvZmYgd29yayB0byBwcm9jZXNzIGl0ICovCisJcngtPnNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfVFlQRV9GUkFNRTsKKwlza2JfcXVldWVfdGFpbCgmc2RhdGEtPnNrYl9xdWV1ZSwgcngtPnNrYik7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJnJ4LT5sb2NhbC0+aHcsICZzZGF0YS0+d29yayk7CisJaWYgKHJ4LT5zdGEpCisJCXJ4LT5zdGEtPnJ4X3BhY2tldHMrKzsKKworCXJldHVybiBSWF9RVUVVRUQ7CiB9CiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9taWNoYWVsX21pY19yZXBvcnQoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKQEAgLTIxNTEsNyArMjE5NCw3IEBACiAJCXU4IHJhdGVfb3JfcGFkOwogCQlfX2xlMTYgY2hhbl9mcmVxOwogCQlfX2xlMTYgY2hhbl9mbGFnczsKLQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqcnRoZHI7CisJfSBfX3BhY2tlZCAqcnRoZHI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4LT5za2IsICpza2IyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpwcmV2X2RldiA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwpAQCAtMjIwMSw3ICsyMjQ0LDcgQEAKIAkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChza2IyKSB7CiAJCQkJc2tiMi0+ZGV2ID0gcHJldl9kZXY7Ci0JCQkJbmV0aWZfcngoc2tiMik7CisJCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiMik7CiAJCQl9CiAJCX0KIApAQCAtMjIxMiw3ICsyMjU1LDcgQEAKIAogCWlmIChwcmV2X2RldikgewogCQlza2ItPmRldiA9IHByZXZfZGV2OwotCQluZXRpZl9yeChza2IpOworCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQlza2IgPSBOVUxMOwogCX0gZWxzZQogCQlnb3RvIG91dF9mcmVlX3NrYjsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zY2FuLmMgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCmluZGV4IGUxYjBiZTcuLjQxZjIwZmIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zY2FuLmMKKysrIGIvbmV0L21hYzgwMjExL3NjYW4uYwpAQCAtMTE0LDYgKzExNCwxMCBAQAogCQlic3MtPmR0aW1fcGVyaW9kID0gdGltX2llLT5kdGltX3BlcmlvZDsKIAl9CiAKKwkvKiBJZiB0aGUgYmVhY29uIGhhZCBubyBUSU0gSUUsIG9yIGl0IHdhcyBpbnZhbGlkLCB1c2UgMSAqLworCWlmIChiZWFjb24gJiYgIWJzcy0+ZHRpbV9wZXJpb2QpCisJCWJzcy0+ZHRpbV9wZXJpb2QgPSAxOworCiAJLyogcmVwbGFjZSBvbGQgc3VwcG9ydGVkIHJhdGVzIGlmIHdlIGdldCBuZXcgdmFsdWVzICovCiAJc3JsZW4gPSAwOwogCWlmIChlbGVtcy0+c3VwcF9yYXRlcykgewpAQCAtNzM0LDcgKzczOCw3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJaW50IHJldCA9IC1FQlVTWTsKLQllbnVtIG5sODAyMTFfYmFuZCBiYW5kOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAogCW11dGV4X2xvY2soJmxvY2FsLT5zY2FuX210eCk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKaW5kZXggYmE5MzYwYS4uNmQ4NmYwYyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKQEAgLTIzNSw2ICsyMzUsOCBAQAogCXNwaW5fbG9ja19pbml0KCZzdGEtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZzdGEtPmZsYWdsb2NrKTsKIAlJTklUX1dPUksoJnN0YS0+ZHJ2X3VuYmxvY2tfd2ssIHN0YV91bmJsb2NrKTsKKwlJTklUX1dPUksoJnN0YS0+YW1wZHVfbWxtZS53b3JrLCBpZWVlODAyMTFfYmFfc2Vzc2lvbl93b3JrKTsKKwltdXRleF9pbml0KCZzdGEtPmFtcGR1X21sbWUubXR4KTsKIAogCW1lbWNweShzdGEtPnN0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJc3RhLT5sb2NhbCA9IGxvY2FsOwpAQCAtMjQ2LDE0ICsyNDgsMTIgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgU1RBX1RJRF9OVU07IGkrKykgewotCQkvKiB0aW1lcl90b190aWQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGlkZW50aXR5IG1hcHBpbmcgdG8KLQkJICogZW5hYmxlIHNlc3Npb25fdGltZXIncyBkYXRhIGRpZmZlcmVudGlhdGlvbi4gcmVmZXIgdG8KLQkJICogc3RhX3J4X2FnZ19zZXNzaW9uX3RpbWVyX2V4cGlyZWQgZm9yIHVzZWFnZSAqLworCQkvKgorCQkgKiB0aW1lcl90b190aWQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGlkZW50aXR5IG1hcHBpbmcKKwkJICogdG8gZW5hYmxlIHNlc3Npb25fdGltZXIncyBkYXRhIGRpZmZlcmVudGlhdGlvbi4gU2VlCisJCSAqIHN0YV9yeF9hZ2dfc2Vzc2lvbl90aW1lcl9leHBpcmVkIGZvciB1c2FnZS4KKwkJICovCiAJCXN0YS0+dGltZXJfdG9fdGlkW2ldID0gaTsKLQkJLyogdHggKi8KLQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFtpXSA9IEhUX0FHR19TVEFURV9JRExFOwotCQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W2ldID0gTlVMTDsKLQkJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1baV0gPSAwOwogCX0KIAlza2JfcXVldWVfaGVhZF9pbml0KCZzdGEtPnBzX3R4X2J1Zik7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc3RhLT50eF9maWx0ZXJlZCk7CkBAIC02NDcsMTUgKzY0Nyw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlpZiAoc3RhLT5rZXkpIHsKLQkJaWVlZTgwMjExX2tleV9mcmVlKHN0YS0+a2V5KTsKLQkJLyoKLQkJICogV2UgaGF2ZSBvbmx5IHVubGlua2VkIHRoZSBrZXksIGFuZCBhY3R1YWxseSBkZXN0cm95aW5nIGl0Ci0JCSAqIG1heSBtZWFuIGl0IGlzIHJlbW92ZWQgZnJvbSBoYXJkd2FyZSB3aGljaCByZXF1aXJlcyB0aGF0Ci0JCSAqIHRoZSBrZXktPnN0YSBwb2ludGVyIGlzIHN0aWxsIHZhbGlkLCBzbyBmbHVzaCB0aGUga2V5IHRvZG8KLQkJICogbGlzdCBoZXJlLgotCQkgKi8KLQkJaWVlZTgwMjExX2tleV90b2RvKCk7Ci0KKwkJaWVlZTgwMjExX2tleV9mcmVlKGxvY2FsLCBzdGEtPmtleSk7CiAJCVdBUk5fT04oc3RhLT5rZXkpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmggYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAppbmRleCBkZjlkNDU1Li41NDI2MmU3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAorKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaApAQCAtNDIsOSArNDIsNiBAQAogICoJYmUgaW4gdGhlIHF1ZXVlcwogICogQFdMQU5fU1RBX1BTUE9MTDogU3RhdGlvbiBzZW50IFBTLXBvbGwgd2hpbGUgZHJpdmVyIHdhcyBrZWVwaW5nCiAgKglzdGF0aW9uIGluIHBvd2VyLXNhdmUgbW9kZSwgcmVwbHkgd2hlbiB0aGUgZHJpdmVyIHVuYmxvY2tzLgotICogQFdMQU5fU1RBX0RJU0FTU09DOiBEaXNhc3NvY2lhdGlvbiBpbiBwcm9ncmVzcy4KLSAqCVRoaXMgaXMgdXNlZCB0byByZWplY3QgVFggQkEgc2Vzc2lvbiByZXF1ZXN0cyB3aGVuIGRpc2Fzc29jaWF0aW9uCi0gKglpcyBpbiBwcm9ncmVzcy4KICAqLwogZW51bSBpZWVlODAyMTFfc3RhX2luZm9fZmxhZ3MgewogCVdMQU5fU1RBX0FVVEgJCT0gMTw8MCwKQEAgLTYwLDM4ICs1Nyw0NCBAQAogCVdMQU5fU1RBX0JMT0NLX0JBCT0gMTw8MTEsCiAJV0xBTl9TVEFfUFNfRFJJVkVSCT0gMTw8MTIsCiAJV0xBTl9TVEFfUFNQT0xMCQk9IDE8PDEzLAotCVdMQU5fU1RBX0RJU0FTU09DICAgICAgID0gMTw8MTQsCiB9OwogCiAjZGVmaW5lIFNUQV9USURfTlVNIDE2CiAjZGVmaW5lIEFEREJBX1JFU1BfSU5URVJWQUwgSFoKLSNkZWZpbmUgSFRfQUdHX01BWF9SRVRSSUVTCQkoMHgzKQorI2RlZmluZSBIVF9BR0dfTUFYX1JFVFJJRVMJCTB4MwogCi0jZGVmaW5lIEhUX0FHR19TVEFURV9JTklUSUFUT1JfU0hJRlQJKDQpCi0KLSNkZWZpbmUgSFRfQUREQkFfUkVRVUVTVEVEX01TSwkJQklUKDApCi0jZGVmaW5lIEhUX0FEREJBX0RSVl9SRUFEWV9NU0sJCUJJVCgxKQotI2RlZmluZSBIVF9BRERCQV9SRUNFSVZFRF9NU0sJCUJJVCgyKQotI2RlZmluZSBIVF9BR0dfU1RBVEVfUkVRX1NUT1BfQkFfTVNLCUJJVCgzKQotI2RlZmluZSBIVF9BR0dfU1RBVEVfSU5JVElBVE9SX01TSyAgICAgIEJJVChIVF9BR0dfU1RBVEVfSU5JVElBVE9SX1NISUZUKQotI2RlZmluZSBIVF9BR0dfU1RBVEVfSURMRQkJKDB4MCkKLSNkZWZpbmUgSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMCShIVF9BRERCQV9SRVFVRVNURURfTVNLIHwJXAotCQkJCQkgSFRfQUREQkFfRFJWX1JFQURZX01TSyB8CVwKLQkJCQkJIEhUX0FEREJBX1JFQ0VJVkVEX01TSykKKyNkZWZpbmUgSFRfQUdHX1NUQVRFX0RSVl9SRUFEWQkJMAorI2RlZmluZSBIVF9BR0dfU1RBVEVfUkVTUE9OU0VfUkVDRUlWRUQJMQorI2RlZmluZSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwJMgorI2RlZmluZSBIVF9BR0dfU1RBVEVfU1RPUFBJTkcJCTMKKyNkZWZpbmUgSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQJCTQKKyNkZWZpbmUgSFRfQUdHX1NUQVRFX1dBTlRfU1RPUAkJNQogCiAvKioKICAqIHN0cnVjdCB0aWRfYW1wZHVfdHggLSBUSUQgYWdncmVnYXRpb24gaW5mb3JtYXRpb24gKFR4KS4KICAqCisgKiBAcmN1X2hlYWQ6IHJjdSBoZWFkIGZvciBmcmVlaW5nIHN0cnVjdHVyZQogICogQGFkZGJhX3Jlc3BfdGltZXI6IHRpbWVyIGZvciBwZWVyJ3MgcmVzcG9uc2UgdG8gYWRkYmEgcmVxdWVzdAogICogQHBlbmRpbmc6IHBlbmRpbmcgZnJhbWVzIHF1ZXVlIC0tIHVzZSBzdGEncyBzcGlubG9jayB0byBwcm90ZWN0Ci0gKiBAc3NuOiBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgZXhwZWN0ZWQgdG8gYmUgYWdncmVnYXRlZC4KICAqIEBkaWFsb2dfdG9rZW46IGRpYWxvZyB0b2tlbiBmb3IgYWdncmVnYXRpb24gc2Vzc2lvbgorICogQHN0YXRlOiBzZXNzaW9uIHN0YXRlIChzZWUgYWJvdmUpCisgKiBAc3RvcF9pbml0aWF0b3I6IGluaXRpYXRvciBvZiBhIHNlc3Npb24gc3RvcAorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSBSQ1UgYW5kIHRoZSBwZXItc3RhdGlvbgorICogc3BpbmxvY2suIEFzc2lnbm1lbnRzIHRvIHRoZSBhcnJheSBob2xkaW5nIGl0IG11c3QgaG9sZAorICogdGhlIHNwaW5sb2NrLCBvbmx5IHRoZSBUWCBwYXRoIGNhbiBhY2Nlc3MgaXQgdW5kZXIgUkNVCisgKiBsb2NrLWZyZWUgaWYsIGFuZCBvbmx5IGlmLCB0aGUgc3RhdGUgaGFzICB0aGUgZmxhZworICogJUhUX0FHR19TVEFURV9PUEVSQVRJT05BTCBzZXQuIE90aGVyd2lzZSwgdGhlIFRYIHBhdGgKKyAqIG11c3QgYWxzbyBhY3F1aXJlIHRoZSBzcGlubG9jayBhbmQgcmUtY2hlY2sgdGhlIHN0YXRlLAorICogc2VlIGNvbW1lbnRzIGluIHRoZSB0eCBjb2RlIHRvdWNoaW5nIGl0LgogICovCiBzdHJ1Y3QgdGlkX2FtcGR1X3R4IHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CiAJc3RydWN0IHRpbWVyX2xpc3QgYWRkYmFfcmVzcF90aW1lcjsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHBlbmRpbmc7Ci0JdTE2IHNzbjsKKwl1bnNpZ25lZCBsb25nIHN0YXRlOwogCXU4IGRpYWxvZ190b2tlbjsKKwl1OCBzdG9wX2luaXRpYXRvcjsKIH07CiAKIC8qKgpAQCAtMTA2LDggKzEwOSwxOCBAQAogICogQGJ1Zl9zaXplOiBidWZmZXIgc2l6ZSBmb3IgaW5jb21pbmcgQS1NUERVcwogICogQHRpbWVvdXQ6IHJlc2V0IHRpbWVyIHZhbHVlIChpbiBUVXMpLgogICogQGRpYWxvZ190b2tlbjogZGlhbG9nIHRva2VuIGZvciBhZ2dyZWdhdGlvbiBzZXNzaW9uCisgKiBAcmN1X2hlYWQ6IFJDVSBoZWFkIHVzZWQgZm9yIGZyZWVpbmcgdGhpcyBzdHJ1Y3QKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgUkNVIGFuZCB0aGUgcGVyLXN0YXRpb24KKyAqIHNwaW5sb2NrLiBBc3NpZ25tZW50cyB0byB0aGUgYXJyYXkgaG9sZGluZyBpdCBtdXN0IGhvbGQKKyAqIHRoZSBzcGlubG9jaywgb25seSB0aGUgUlggcGF0aCBjYW4gYWNjZXNzIGl0IHVuZGVyIFJDVQorICogbG9jay1mcmVlLiBUaGUgUlggcGF0aCwgc2luY2UgaXQgaXMgc2luZ2xlLXRocmVhZGVkLAorICogY2FuIGV2ZW4gbW9kaWZ5IHRoZSBzdHJ1Y3R1cmUgd2l0aG91dCBsb2NraW5nIHNpbmNlIHRoZQorICogb25seSBvdGhlciBtb2RpZmljYXRpb25zIHRvIGl0IGFyZSBkb25lIHdoZW4gdGhlIHN0cnVjdAorICogY2FuIG5vdCB5ZXQgb3Igbm8gbG9uZ2VyIGJlIGZvdW5kIGJ5IHRoZSBSWCBwYXRoLgogICovCiBzdHJ1Y3QgdGlkX2FtcGR1X3J4IHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CiAJc3RydWN0IHNrX2J1ZmYgKipyZW9yZGVyX2J1ZjsKIAl1bnNpZ25lZCBsb25nICpyZW9yZGVyX3RpbWU7CiAJc3RydWN0IHRpbWVyX2xpc3Qgc2Vzc2lvbl90aW1lcjsKQEAgLTEyMCw2ICsxMzMsMzIgQEAKIH07CiAKIC8qKgorICogc3RydWN0IHN0YV9hbXBkdV9tbG1lIC0gU1RBIGFnZ3JlZ2F0aW9uIGluZm9ybWF0aW9uLgorICoKKyAqIEB0aWRfcng6IGFnZ3JlZ2F0aW9uIGluZm8gZm9yIFJ4IHBlciBUSUQgLS0gUkNVIHByb3RlY3RlZAorICogQHRpZF90eDogYWdncmVnYXRpb24gaW5mbyBmb3IgVHggcGVyIFRJRAorICogQGFkZGJhX3JlcV9udW06IG51bWJlciBvZiB0aW1lcyBhZGRCQSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQuCisgKiBAZGlhbG9nX3Rva2VuX2FsbG9jYXRvcjogZGlhbG9nIHRva2VuIGVudW1lcmF0b3IgZm9yIGVhY2ggbmV3IHNlc3Npb247CisgKiBAd29yazogd29yayBzdHJ1Y3QgZm9yIHN0YXJ0aW5nL3N0b3BwaW5nIGFnZ3JlZ2F0aW9uCisgKiBAdGlkX3J4X3RpbWVyX2V4cGlyZWQ6IGJpdG1hcCBpbmRpY2F0aW5nIG9uIHdoaWNoIFRJRHMgdGhlCisgKglSWCB0aW1lciBleHBpcmVkIHVudGlsIHRoZSB3b3JrIGZvciBpdCBydW5zCisgKiBAbXR4OiBtdXRleCB0byBwcm90ZWN0IGFsbCBUWCBkYXRhIChleGNlcHQgbm9uLU5VTEwgYXNzaWdubWVudHMKKyAqCXRvIHRpZF90eFtpZHhdLCB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBzdGEgc3BpbmxvY2spCisgKi8KK3N0cnVjdCBzdGFfYW1wZHVfbWxtZSB7CisJc3RydWN0IG11dGV4IG10eDsKKwkvKiByeCAqLworCXN0cnVjdCB0aWRfYW1wZHVfcnggKnRpZF9yeFtTVEFfVElEX05VTV07CisJdW5zaWduZWQgbG9uZyB0aWRfcnhfdGltZXJfZXhwaXJlZFtCSVRTX1RPX0xPTkdTKFNUQV9USURfTlVNKV07CisJLyogdHggKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHhbU1RBX1RJRF9OVU1dOworCXU4IGFkZGJhX3JlcV9udW1bU1RBX1RJRF9OVU1dOworCXU4IGRpYWxvZ190b2tlbl9hbGxvY2F0b3I7Cit9OworCisKKy8qKgogICogZW51bSBwbGlua19zdGF0ZSAtIHN0YXRlIG9mIGEgbWVzaCBwZWVyIGxpbmsgZmluaXRlIHN0YXRlIG1hY2hpbmUKICAqCiAgKiBAUExJTktfTElTVEVOOiBpbml0aWFsIHN0YXRlLCBjb25zaWRlcmVkIHRoZSBpbXBsaWNpdCBzdGF0ZSBvZiBub24gZXhpc3RhbnQKQEAgLTE0MywyOCArMTgyLDYgQEAKIH07CiAKIC8qKgotICogc3RydWN0IHN0YV9hbXBkdV9tbG1lIC0gU1RBIGFnZ3JlZ2F0aW9uIGluZm9ybWF0aW9uLgotICoKLSAqIEB0aWRfYWN0aXZlX3J4OiBUSUQncyBzdGF0ZSBpbiBSeCBzZXNzaW9uIHN0YXRlIG1hY2hpbmUuCi0gKiBAdGlkX3J4OiBhZ2dyZWdhdGlvbiBpbmZvIGZvciBSeCBwZXIgVElECi0gKiBAdGlkX3N0YXRlX3R4OiBUSUQncyBzdGF0ZSBpbiBUeCBzZXNzaW9uIHN0YXRlIG1hY2hpbmUuCi0gKiBAdGlkX3R4OiBhZ2dyZWdhdGlvbiBpbmZvIGZvciBUeCBwZXIgVElECi0gKiBAYWRkYmFfcmVxX251bTogbnVtYmVyIG9mIHRpbWVzIGFkZEJBIHJlcXVlc3QgaGFzIGJlZW4gc2VudC4KLSAqIEBkaWFsb2dfdG9rZW5fYWxsb2NhdG9yOiBkaWFsb2cgdG9rZW4gZW51bWVyYXRvciBmb3IgZWFjaCBuZXcgc2Vzc2lvbjsKLSAqLwotc3RydWN0IHN0YV9hbXBkdV9tbG1lIHsKLQkvKiByeCAqLwotCWJvb2wgdGlkX2FjdGl2ZV9yeFtTVEFfVElEX05VTV07Ci0Jc3RydWN0IHRpZF9hbXBkdV9yeCAqdGlkX3J4W1NUQV9USURfTlVNXTsKLQkvKiB0eCAqLwotCXU4IHRpZF9zdGF0ZV90eFtTVEFfVElEX05VTV07Ci0Jc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4W1NUQV9USURfTlVNXTsKLQl1OCBhZGRiYV9yZXFfbnVtW1NUQV9USURfTlVNXTsKLQl1OCBkaWFsb2dfdG9rZW5fYWxsb2NhdG9yOwotfTsKLQotCi0vKioKICAqIHN0cnVjdCBzdGFfaW5mbyAtIFNUQSBpbmZvcm1hdGlvbgogICoKICAqIFRoaXMgc3RydWN0dXJlIGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IGEgc3RhdGlvbiB0aGF0CkBAIC00MTAsMjAgKzQyNywyMCBAQAogewogfQogCi0jZGVmaW5lIGZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBfYWRkciwgc3RhLCBueHQpIAkJCVwKKyNkZWZpbmUgZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIF9hZGRyLCBfc3RhLCBueHQpIAkJCVwKIAlmb3IgKAkvKiBpbml0aWFsaXNlIGxvb3AgKi8JCQkJCVwKLQkJc3RhID0gcmN1X2RlcmVmZXJlbmNlKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChfYWRkcildKSxcCi0JCW54dCA9IHN0YSA/IHJjdV9kZXJlZmVyZW5jZShzdGEtPmhuZXh0KSA6IE5VTEw7CQlcCisJCV9zdGEgPSByY3VfZGVyZWZlcmVuY2UobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKF9hZGRyKV0pLFwKKwkJbnh0ID0gX3N0YSA/IHJjdV9kZXJlZmVyZW5jZShfc3RhLT5obmV4dCkgOiBOVUxMOwlcCiAJCS8qIHR5cGVjaGVjayAqLwkJCQkJCVwKLQkJZm9yX2VhY2hfc3RhX2luZm9fdHlwZV9jaGVjayhsb2NhbCwgKF9hZGRyKSwgc3RhLCBueHQpLAlcCisJCWZvcl9lYWNoX3N0YV9pbmZvX3R5cGVfY2hlY2sobG9jYWwsIChfYWRkciksIF9zdGEsIG54dCksXAogCQkvKiBjb250aW51ZSBjb25kaXRpb24gKi8JCQkJXAotCQlzdGE7CQkJCQkJCVwKKwkJX3N0YTsJCQkJCQkJXAogCQkvKiBhZHZhbmNlIGxvb3AgKi8JCQkJCVwKLQkJc3RhID0gbnh0LAkJCQkJCVwKLQkJbnh0ID0gc3RhID8gcmN1X2RlcmVmZXJlbmNlKHN0YS0+aG5leHQpIDogTlVMTAkJXAorCQlfc3RhID0gbnh0LAkJCQkJCVwKKwkJbnh0ID0gX3N0YSA/IHJjdV9kZXJlZmVyZW5jZShfc3RhLT5obmV4dCkgOiBOVUxMCVwKIAkgICAgICkJCQkJCQkJCVwKIAkvKiBjb21wYXJlIGFkZHJlc3MgYW5kIHJ1biBjb2RlIG9ubHkgaWYgaXQgbWF0Y2hlcyAqLwkJXAotCWlmIChtZW1jbXAoc3RhLT5zdGEuYWRkciwgKF9hZGRyKSwgRVRIX0FMRU4pID09IDApCisJaWYgKG1lbWNtcChfc3RhLT5zdGEuYWRkciwgKF9hZGRyKSwgRVRIX0FMRU4pID09IDApCiAKIC8qCiAgKiBHZXQgU1RBIGluZm8gYnkgaW5kZXgsIEJST0tFTiEKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwppbmRleCA5NDYxM2FmMC4uMTBjYWVjNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YXR1cy5jCisrKyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwpAQCAtNDcsNyArNDcsNyBAQAogCS8qCiAJICogVGhpcyBza2IgJ3N1cnZpdmVkJyBhIHJvdW5kLXRyaXAgdGhyb3VnaCB0aGUgZHJpdmVyLCBhbmQKIAkgKiBob3BlZnVsbHkgdGhlIGRyaXZlciBkaWRuJ3QgbWFuZ2xlIGl0IHRvbyBiYWRseS4gSG93ZXZlciwKLQkgKiB3ZSBjYW4gZGVmaW5pdGVseSBub3QgcmVseSBvbiB0aGUgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24KKwkgKiB3ZSBjYW4gZGVmaW5pdGVseSBub3QgcmVseSBvbiB0aGUgY29udHJvbCBpbmZvcm1hdGlvbgogCSAqIGJlaW5nIGNvcnJlY3QuIENsZWFyIGl0IHNvIHdlIGRvbid0IGdldCBqdW5rIHRoZXJlLCBhbmQKIAkgKiBpbmRpY2F0ZSB0aGF0IGl0IG5lZWRzIG5ldyBwcm9jZXNzaW5nLCBidXQgbXVzdCBub3QgYmUKIAkgKiBtb2RpZmllZC9lbmNyeXB0ZWQgYWdhaW4uCkBAIC0zNzcsNyArMzc3LDcgQEAKIAkJCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAJCQkJaWYgKHNrYjIpIHsKIAkJCQkJc2tiMi0+ZGV2ID0gcHJldl9kZXY7Ci0JCQkJCW5ldGlmX3J4KHNrYjIpOworCQkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IyKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTM4Niw3ICszODYsNyBAQAogCX0KIAlpZiAocHJldl9kZXYpIHsKIAkJc2tiLT5kZXYgPSBwcmV2X2RldjsKLQkJbmV0aWZfcngoc2tiKTsKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJc2tiID0gTlVMTDsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdGtpcC5jIGIvbmV0L21hYzgwMjExL3RraXAuYwppbmRleCA3ZWY0OTFlLi5lODQwYzljIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdGtpcC5jCisrKyBiL25ldC9tYWM4MDIxMS90a2lwLmMKQEAgLTIwMiw5ICsyMDIsOSBAQAogICogQHBheWxvYWRfbGVuIGlzIHRoZSBsZW5ndGggb2YgcGF5bG9hZCAoX25vdF8gaW5jbHVkaW5nIElWL0lDViBsZW5ndGgpLgogICogQHRhIGlzIHRoZSB0cmFuc21pdHRlciBhZGRyZXNzZXMuCiAgKi8KLXZvaWQgaWVlZTgwMjExX3RraXBfZW5jcnlwdF9kYXRhKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXksCi0JCQkJIHU4ICpwb3MsIHNpemVfdCBwYXlsb2FkX2xlbiwgdTggKnRhKQoraW50IGllZWU4MDIxMV90a2lwX2VuY3J5cHRfZGF0YShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXksCisJCQkJdTggKnBvcywgc2l6ZV90IHBheWxvYWRfbGVuLCB1OCAqdGEpCiB7CiAJdTggcmM0a2V5WzE2XTsKIAlzdHJ1Y3QgdGtpcF9jdHggKmN0eCA9ICZrZXktPnUudGtpcC50eDsKQEAgLTIxNiw3ICsyMTYsNyBAQAogCiAJdGtpcF9taXhpbmdfcGhhc2UyKHRrLCBjdHgsIGN0eC0+aXYxNiwgcmM0a2V5KTsKIAotCWllZWU4MDIxMV93ZXBfZW5jcnlwdF9kYXRhKHRmbSwgcmM0a2V5LCAxNiwgcG9zLCBwYXlsb2FkX2xlbik7CisJcmV0dXJuIGllZWU4MDIxMV93ZXBfZW5jcnlwdF9kYXRhKHRmbSwgcmM0a2V5LCAxNiwgcG9zLCBwYXlsb2FkX2xlbik7CiB9CiAKIC8qIERlY3J5cHQgcGFja2V0IHBheWxvYWQgd2l0aCBUS0lQIHVzaW5nIEBrZXkuIEBwb3MgaXMgYSBwb2ludGVyIHRvIHRoZQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RraXAuaCBiL25ldC9tYWM4MDIxMS90a2lwLmgKaW5kZXggZDQ3MTQzOC4uN2U4M2RlZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3RraXAuaAorKysgYi9uZXQvbWFjODAyMTEvdGtpcC5oCkBAIC0xNSw3ICsxNSw3IEBACiAKIHU4ICppZWVlODAyMTFfdGtpcF9hZGRfaXYodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSwgdTE2IGl2MTYpOwogCi12b2lkIGllZWU4MDIxMV90a2lwX2VuY3J5cHRfZGF0YShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoraW50IGllZWU4MDIxMV90a2lwX2VuY3J5cHRfZGF0YShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAogCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LAogCQkJCSB1OCAqcG9zLCBzaXplX3QgcGF5bG9hZF9sZW4sIHU4ICp0YSk7CiBlbnVtIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMKaW5kZXggNjgwYmNiNy4uYzU0ZGI5NiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3R4LmMKKysrIGIvbmV0L21hYzgwMjExL3R4LmMKQEAgLTU3NiwxNyArNTc2LDYgQEAKIH0KIAogc3RhdGljIGllZWU4MDIxMV90eF9yZXN1bHQgZGVidWdfbm9pbmxpbmUKLWllZWU4MDIxMV90eF9oX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQotewotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHgtPnNrYik7Ci0KLQlpZiAodHgtPnN0YSAmJiB0eC0+c3RhLT51cGxvYWRlZCkKLQkJaW5mby0+Y29udHJvbC5zdGEgPSAmdHgtPnN0YS0+c3RhOwotCi0JcmV0dXJuIFRYX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgaWVlZTgwMjExX3R4X3Jlc3VsdCBkZWJ1Z19ub2lubGluZQogaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eC0+c2tiKTsKQEAgLTEwOTIsNiArMTA4MSw1OSBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBpZWVlODAyMTFfdHhfcHJlcF9hZ2coc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHgsCisJCQkJICBpbnQgdGlkKQoreworCWJvb2wgcXVldWVkID0gZmFsc2U7CisKKwlpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMLCAmdGlkX3R4LT5zdGF0ZSkpIHsKKwkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KEhUX0FHR19TVEFURV9XQU5UX1NUQVJULCAmdGlkX3R4LT5zdGF0ZSkpIHsKKwkJLyoKKwkJICogbm90aGluZyAtLSB0aGlzIGFnZ3JlZ2F0aW9uIHNlc3Npb24gaXMgYmVpbmcgc3RhcnRlZAorCQkgKiBidXQgdGhhdCBtaWdodCBzdGlsbCBmYWlsIHdpdGggdGhlIGRyaXZlcgorCQkgKi8KKwl9IGVsc2UgeworCQlzcGluX2xvY2soJnR4LT5zdGEtPmxvY2spOworCQkvKgorCQkgKiBOZWVkIHRvIHJlLWNoZWNrIG5vdywgYmVjYXVzZSB3ZSBtYXkgZ2V0IGhlcmUKKwkJICoKKwkJICogIDEpIGluIHRoZSB3aW5kb3cgZHVyaW5nIHdoaWNoIHRoZSBzZXR1cCBpcyBhY3R1YWxseQorCQkgKiAgICAgYWxyZWFkeSBkb25lLCBidXQgbm90IG1hcmtlZCB5ZXQgYmVjYXVzZSBub3QgYWxsCisJCSAqICAgICBwYWNrZXRzIGFyZSBzcGxpY2VkIG92ZXIgdG8gdGhlIGRyaXZlciBwZW5kaW5nCisJCSAqICAgICBxdWV1ZSB5ZXQgLS0gaWYgdGhpcyBoYXBwZW5lZCB3ZSBhY3F1aXJlIHRoZSBsb2NrCisJCSAqICAgICBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBzcGxpY2UgaGFwcGVucywgYnV0CisJCSAqICAgICBuZWVkIHRvIHJlY2hlY2sgd2hpY2ggb2YgdGhlc2UgY2FzZXMgaGFwcGVuZWQuCisJCSAqCisJCSAqICAyKSBkdXJpbmcgc2Vzc2lvbiB0ZWFyZG93biwgaWYgdGhlIE9QRVJBVElPTkFMIGJpdAorCQkgKiAgICAgd2FzIGNsZWFyZWQgZHVlIHRvIHRoZSB0ZWFyZG93biBidXQgdGhlIHBvaW50ZXIKKwkJICogICAgIGhhc24ndCBiZWVuIGFzc2lnbmVkIE5VTEwgeWV0IChvciB3ZSBsb2FkZWQgaXQKKwkJICogICAgIGJlZm9yZSBpdCB3YXMgYXNzaWduZWQpIC0tIGluIHRoaXMgY2FzZSBpdCBtYXkKKwkJICogICAgIG5vdyBiZSBOVUxMIHdoaWNoIG1lYW5zIHdlIHNob3VsZCBqdXN0IGxldCB0aGUKKwkJICogICAgIHBhY2tldCBwYXNzIHRocm91Z2ggYmVjYXVzZSBzcGxpY2luZyB0aGUgZnJhbWVzCisJCSAqICAgICBiYWNrIGlzIGFscmVhZHkgZG9uZS4KKwkJICovCisJCXRpZF90eCA9IHR4LT5zdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF07CisKKwkJaWYgKCF0aWRfdHgpIHsKKwkJCS8qIGRvIG5vdGhpbmcsIGxldCBwYWNrZXQgcGFzcyB0aHJvdWdoICovCisJCX0gZWxzZSBpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMLCAmdGlkX3R4LT5zdGF0ZSkpIHsKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfQU1QRFU7CisJCX0gZWxzZSB7CisJCQlxdWV1ZWQgPSB0cnVlOworCQkJaW5mby0+Y29udHJvbC52aWYgPSAmdHgtPnNkYXRhLT52aWY7CisJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfSU5URkxfTkVFRF9UWFBST0NFU1NJTkc7CisJCQlfX3NrYl9xdWV1ZV90YWlsKCZ0aWRfdHgtPnBlbmRpbmcsIHNrYik7CisJCX0KKwkJc3Bpbl91bmxvY2soJnR4LT5zdGEtPmxvY2spOworCX0KKworCXJldHVybiBxdWV1ZWQ7Cit9CisKIC8qCiAgKiBpbml0aWFsaXNlcyBAdHgKICAqLwpAQCAtMTEwNCw4ICsxMTQ2LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlpbnQgaGRybGVuLCB0aWQ7Ci0JdTggKnFjLCAqc3RhdGU7Ci0JYm9vbCBxdWV1ZWQgPSBmYWxzZTsKKwl1OCAqcWM7CiAKIAltZW1zZXQodHgsIDAsIHNpemVvZigqdHgpKTsKIAl0eC0+c2tiID0gc2tiOwpAQCAtMTE1NywzNSArMTE5OCwxNiBAQAogCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwogCQl0aWQgPSAqcWMgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKIAotCQlzcGluX2xvY2soJnR4LT5zdGEtPmxvY2spOwotCQkvKgotCQkgKiBYWFg6IFRoaXMgc3BpbmxvY2sgY291bGQgYmUgZmFpcmx5IGV4cGVuc2l2ZSwgYnV0IHNlZSB0aGUKLQkJICoJY29tbWVudCBpbiBhZ2ctdHguYzppZWVlODAyMTFfYWdnX3R4X29wZXJhdGlvbmFsKCkuCi0JCSAqCU9uZSB3YXkgdG8gc29sdmUgdGhpcyB3b3VsZCBiZSB0byBkbyBzb21ldGhpbmcgUkNVLWxpa2UKLQkJICoJZm9yIG1hbmFnaW5nIHRoZSB0aWRfdHggc3RydWN0IGFuZCB1c2luZyBhdG9taWMgYml0b3BzCi0JCSAqCWZvciB0aGUgYWN0dWFsIHN0YXRlIC0tIGJ5IGludHJvZHVjaW5nIGFuIGFjdHVhbAotCQkgKgknb3BlcmF0aW9uYWwnIGJpdCB0aGF0IHdvdWxkIGJlIHBvc3NpYmxlLiBJdCB3b3VsZAotCQkgKglyZXF1aXJlIGNoYW5naW5nIGllZWU4MDIxMV9hZ2dfdHhfb3BlcmF0aW9uYWwoKSB0bwotCQkgKglzZXQgdGhhdCBiaXQsIGFuZCBjaGFuZ2luZyB0aGUgd2F5IHRpZF90eCBpcyBtYW5hZ2VkCi0JCSAqCWV2ZXJ5d2hlcmUsIGluY2x1ZGluZyByYWNlcyBiZXR3ZWVuIHRoYXQgYml0IGFuZAotCQkgKgl0aWRfdHggZ29pbmcgYXdheSAodGlkX3R4IGJlaW5nIGFkZGVkIGNhbiBiZSBlYXNpbHkKLQkJICoJY29tbWl0dGVkIHRvIG1lbW9yeSBiZWZvcmUgdGhlICdvcGVyYXRpb25hbCcgYml0KS4KLQkJICovCi0JCXRpZF90eCA9IHR4LT5zdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF07Ci0JCXN0YXRlID0gJnR4LT5zdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZF07Ci0JCWlmICgqc3RhdGUgPT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKSB7Ci0JCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FNUERVOwotCQl9IGVsc2UgaWYgKCpzdGF0ZSAhPSBIVF9BR0dfU1RBVEVfSURMRSkgewotCQkJLyogaW4gcHJvZ3Jlc3MgKi8KLQkJCXF1ZXVlZCA9IHRydWU7Ci0JCQlpbmZvLT5jb250cm9sLnZpZiA9ICZzZGF0YS0+dmlmOwotCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX05FRURfVFhQUk9DRVNTSU5HOwotCQkJX19za2JfcXVldWVfdGFpbCgmdGlkX3R4LT5wZW5kaW5nLCBza2IpOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZ0eC0+c3RhLT5sb2NrKTsKKwkJdGlkX3R4ID0gcmN1X2RlcmVmZXJlbmNlKHR4LT5zdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0pOworCQlpZiAodGlkX3R4KSB7CisJCQlib29sIHF1ZXVlZDsKIAotCQlpZiAodW5saWtlbHkocXVldWVkKSkKLQkJCXJldHVybiBUWF9RVUVVRUQ7CisJCQlxdWV1ZWQgPSBpZWVlODAyMTFfdHhfcHJlcF9hZ2codHgsIHNrYiwgaW5mbywKKwkJCQkJCSAgICAgICB0aWRfdHgsIHRpZCk7CisKKwkJCWlmICh1bmxpa2VseShxdWV1ZWQpKQorCQkJCXJldHVybiBUWF9RVUVVRUQ7CisJCX0KIAl9CiAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKQEAgLTEyNzQsNiArMTI5NiwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQlpZiAoc3RhICYmIHN0YS0+dXBsb2FkZWQpCisJCQlpbmZvLT5jb250cm9sLnN0YSA9ICZzdGEtPnN0YTsKKwkJZWxzZQorCQkJaW5mby0+Y29udHJvbC5zdGEgPSBOVUxMOworCiAJCXJldCA9IGRydl90eChsb2NhbCwgc2tiKTsKIAkJaWYgKFdBUk5fT04ocmV0ICE9IE5FVERFVl9UWF9PSyAmJiBza2ItPmxlbiAhPSBsZW4pKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMzEzLDcgKzEzNDAsNiBAQAogCUNBTExfVFhIKGllZWU4MDIxMV90eF9oX2NoZWNrX2Fzc29jKTsKIAlDQUxMX1RYSChpZWVlODAyMTFfdHhfaF9wc19idWYpOwogCUNBTExfVFhIKGllZWU4MDIxMV90eF9oX3NlbGVjdF9rZXkpOwotCUNBTExfVFhIKGllZWU4MDIxMV90eF9oX3N0YSk7CiAJaWYgKCEodHgtPmxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19IQVNfUkFURV9DT05UUk9MKSkKIAkJQ0FMTF9UWEgoaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKTsKIApAQCAtMTkwOSwxMSArMTkzNSwxMyBAQAogCQloX3BvcyArPSBlbmNhcHNfbGVuOwogCX0KIAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICiAJaWYgKG1lc2hoZHJsZW4gPiAwKSB7CiAJCW1lbWNweShza2JfcHVzaChza2IsIG1lc2hoZHJsZW4pLCAmbWVzaF9oZHIsIG1lc2hoZHJsZW4pOwogCQluaF9wb3MgKz0gbWVzaGhkcmxlbjsKIAkJaF9wb3MgKz0gbWVzaGhkcmxlbjsKIAl9CisjZW5kaWYKIAogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CiAJCV9fbGUxNiAqcW9zX2NvbnRyb2w7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5jIGIvbmV0L21hYzgwMjExL3V0aWwuYwppbmRleCA1Yjc5ZDU1Li43NDgzODdkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdXRpbC5jCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMKQEAgLTgwMyw4ICs4MDMsMTIgQEAKIAogCS8qIGFmdGVyIHJlaW5pdGlhbGl6ZSBRb1MgVFggcXVldWVzIHNldHRpbmcgdG8gZGVmYXVsdCwKIAkgKiBkaXNhYmxlIFFvUyBhdCBhbGwgKi8KLQlsb2NhbC0+aHcuY29uZi5mbGFncyAmPQl+SUVFRTgwMjExX0NPTkZfUU9TOwotCWRydl9jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9RT1MpOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB7CisJCXNkYXRhLT52aWYuYnNzX2NvbmYucW9zID0KKwkJCXNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfUU9TKTsKKwl9CiB9CiAKIHZvaWQgaWVlZTgwMjExX3N0YV9kZWZfd21tX3BhcmFtcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTExMzgsMTggKzExNDIsNiBAQAogCX0KIAltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAotCS8qIENsZWFyIFN1c3BlbmQgc3RhdGUgc28gdGhhdCBBRERCQSByZXF1ZXN0cyBjYW4gYmUgcHJvY2Vzc2VkICovCi0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlpZiAoaHctPmZsYWdzICYgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewotCQkJY2xlYXJfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfQkxPQ0tfQkEpOwotCQl9Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAkvKiBzZXR1cCBSVFMgdGhyZXNob2xkICovCiAJZHJ2X3NldF9ydHNfdGhyZXNob2xkKGxvY2FsLCBody0+d2lwaHktPnJ0c190aHJlc2hvbGQpOwogCkBAIC0xMTczLDcgKzExNjUsOCBAQAogCQkJICBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUyB8CiAJCQkgIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQgfAogCQkJICBCU1NfQ0hBTkdFRF9CU1NJRCB8Ci0JCQkgIEJTU19DSEFOR0VEX0NRTTsKKwkJCSAgQlNTX0NIQU5HRURfQ1FNIHwKKwkJCSAgQlNTX0NIQU5HRURfUU9TOwogCiAJCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKQEAgLTEyMDIsMTMgKzExOTUsMjYgQEAKIAkJfQogCX0KIAotCXJjdV9yZWFkX2xvY2soKTsKKwkvKgorCSAqIENsZWFyIHRoZSBXTEFOX1NUQV9CTE9DS19CQSBmbGFnIHNvIG5ldyBhZ2dyZWdhdGlvbgorCSAqIHNlc3Npb25zIGNhbiBiZSBlc3RhYmxpc2hlZCBhZnRlciBhIHJlc3VtZS4KKwkgKgorCSAqIEFsc28gdGVhciBkb3duIGFnZ3JlZ2F0aW9uIHNlc3Npb25zIHNpbmNlIHJlY29uZmlndXJpbmcKKwkgKiB0aGVtIGluIGEgaGFyZHdhcmUgcmVzdGFydCBzY2VuYXJpbyBpcyBub3QgZWFzaWx5IGRvbmUKKwkgKiByaWdodCBub3csIGFuZCB0aGUgaGFyZHdhcmUgd2lsbCBoYXZlIGxvc3QgaW5mb3JtYXRpb24KKwkgKiBhYm91dCB0aGUgc2Vzc2lvbnMsIGJ1dCB3ZSBhbmQgdGhlIEFQIHN0aWxsIHRoaW5rIHRoZXkKKwkgKiBhcmUgYWN0aXZlLiBUaGlzIGlzIHJlYWxseSBhIHdvcmthcm91bmQgdGhvdWdoLgorCSAqLwogCWlmIChody0+ZmxhZ3MgJiBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04pIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc3RhLCAmbG9jYWwtPnN0YV9saXN0LCBsaXN0KSB7CisJCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewogCQkJaWVlZTgwMjExX3N0YV90ZWFyX2Rvd25fQkFfc2Vzc2lvbnMoc3RhKTsKKwkJCWNsZWFyX3N0YV9mbGFncyhzdGEsIFdMQU5fU1RBX0JMT0NLX0JBKTsKIAkJfQorCisJCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIAogCS8qIGFkZCBiYWNrIGtleXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd2VwLmMgYi9uZXQvbWFjODAyMTEvd2VwLmMKaW5kZXggNWYzYTQxMS4uOWViYzhkOGEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93ZXAuYworKysgYi9uZXQvbWFjODAyMTEvd2VwLmMKQEAgLTMyLDEzICszMiwxNiBAQAogCiAJbG9jYWwtPndlcF90eF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAogCQkJCQkJQ1JZUFRPX0FMR19BU1lOQyk7Ci0JaWYgKElTX0VSUihsb2NhbC0+d2VwX3R4X3RmbSkpCisJaWYgKElTX0VSUihsb2NhbC0+d2VwX3R4X3RmbSkpIHsKKwkJbG9jYWwtPndlcF9yeF90Zm0gPSBFUlJfUFRSKC1FSU5WQUwpOwogCQlyZXR1cm4gUFRSX0VSUihsb2NhbC0+d2VwX3R4X3RmbSk7CisJfQogCiAJbG9jYWwtPndlcF9yeF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAogCQkJCQkJQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihsb2NhbC0+d2VwX3J4X3RmbSkpIHsKIAkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGxvY2FsLT53ZXBfdHhfdGZtKTsKKwkJbG9jYWwtPndlcF90eF90Zm0gPSBFUlJfUFRSKC1FSU5WQUwpOwogCQlyZXR1cm4gUFRSX0VSUihsb2NhbC0+d2VwX3J4X3RmbSk7CiAJfQogCkBAIC00Nyw4ICs1MCwxMCBAQAogCiB2b2lkIGllZWU4MDIxMV93ZXBfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKLQljcnlwdG9fZnJlZV9ibGtjaXBoZXIobG9jYWwtPndlcF90eF90Zm0pOwotCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihsb2NhbC0+d2VwX3J4X3RmbSk7CisJaWYgKCFJU19FUlIobG9jYWwtPndlcF90eF90Zm0pKQorCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIobG9jYWwtPndlcF90eF90Zm0pOworCWlmICghSVNfRVJSKGxvY2FsLT53ZXBfcnhfdGZtKSkKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGxvY2FsLT53ZXBfcnhfdGZtKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGllZWU4MDIxMV93ZXBfd2Vha19pdih1MzIgaXYsIGludCBrZXlsZW4pCkBAIC0xMjIsMTkgKzEyNywyNCBAQAogLyogUGVyZm9ybSBXRVAgZW5jcnlwdGlvbiB1c2luZyBnaXZlbiBrZXkuIGRhdGEgYnVmZmVyIG11c3QgaGF2ZSB0YWlscm9vbQogICogZm9yIDQtYnl0ZSBJQ1YuIGRhdGFfbGVuIG11c3Qgbm90IGluY2x1ZGUgdGhpcyBJQ1YuIE5vdGU6IHRoaXMgZnVuY3Rpb24KICAqIGRvZXMgX25vdF8gYWRkIElWLiBkYXRhID0gUkM0KGRhdGEgfCBDUkMzMihkYXRhKSkgKi8KLXZvaWQgaWVlZTgwMjExX3dlcF9lbmNyeXB0X2RhdGEoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSwgdTggKnJjNGtleSwKLQkJCQlzaXplX3Qga2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbikKK2ludCBpZWVlODAyMTFfd2VwX2VuY3J5cHRfZGF0YShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLCB1OCAqcmM0a2V5LAorCQkJICAgICAgIHNpemVfdCBrbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQogewogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0geyAudGZtID0gdGZtIH07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwogCV9fbGUzMiBpY3Y7CiAKKwlpZiAoSVNfRVJSKHRmbSkpCisJCXJldHVybiAtMTsKKwogCWljdiA9IGNwdV90b19sZTMyKH5jcmMzMl9sZSh+MCwgZGF0YSwgZGF0YV9sZW4pKTsKIAlwdXRfdW5hbGlnbmVkKGljdiwgKF9fbGUzMiAqKShkYXRhICsgZGF0YV9sZW4pKTsKIAogCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRmbSwgcmM0a2V5LCBrbGVuKTsKIAlzZ19pbml0X29uZSgmc2csIGRhdGEsIGRhdGFfbGVuICsgV0VQX0lDVl9MRU4pOwogCWNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIHNnLmxlbmd0aCk7CisKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xNjgsMTAgKzE3OCw4IEBACiAJLyogQWRkIHJvb20gZm9yIElDViAqLwogCXNrYl9wdXQoc2tiLCBXRVBfSUNWX0xFTik7CiAKLQlpZWVlODAyMTFfd2VwX2VuY3J5cHRfZGF0YShsb2NhbC0+d2VwX3R4X3RmbSwgcmM0a2V5LCBrZXlsZW4gKyAzLAotCQkJCSAgIGl2ICsgV0VQX0lWX0xFTiwgbGVuKTsKLQotCXJldHVybiAwOworCXJldHVybiBpZWVlODAyMTFfd2VwX2VuY3J5cHRfZGF0YShsb2NhbC0+d2VwX3R4X3RmbSwgcmM0a2V5LCBrZXlsZW4gKyAzLAorCQkJCQkgIGl2ICsgV0VQX0lWX0xFTiwgbGVuKTsKIH0KIAogCkBAIC0xODUsNiArMTkzLDkgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJX19sZTMyIGNyYzsKIAorCWlmIChJU19FUlIodGZtKSkKKwkJcmV0dXJuIC0xOworCiAJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGZtLCByYzRrZXksIGtsZW4pOwogCXNnX2luaXRfb25lKCZzZywgZGF0YSwgZGF0YV9sZW4gKyBXRVBfSUNWX0xFTik7CiAJY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCAmc2csICZzZywgc2cubGVuZ3RoKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93ZXAuaCBiL25ldC9tYWM4MDIxMS93ZXAuaAppbmRleCBmZTI5ZDdlLi41ODY1NGVlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd2VwLmgKKysrIGIvbmV0L21hYzgwMjExL3dlcC5oCkBAIC0xOCw3ICsxOCw3IEBACiAKIGludCBpZWVlODAyMTFfd2VwX2luaXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogdm9pZCBpZWVlODAyMTFfd2VwX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwotdm9pZCBpZWVlODAyMTFfd2VwX2VuY3J5cHRfZGF0YShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLCB1OCAqcmM0a2V5LAoraW50IGllZWU4MDIxMV93ZXBfZW5jcnlwdF9kYXRhKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sIHU4ICpyYzRrZXksCiAJCQkJc2l6ZV90IGtsZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pOwogaW50IGllZWU4MDIxMV93ZXBfZW5jcnlwdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93b3JrLmMgYi9uZXQvbWFjODAyMTEvd29yay5jCmluZGV4IGIwMjVkYzcuLjgxZDRhZDYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93b3JrLmMKKysrIGIvbmV0L21hYzgwMjExL3dvcmsuYwpAQCAtNTYwLDYgKzU2MCwyMiBAQAogCXJldHVybiBXT1JLX0FDVF9USU1FT1VUOwogfQogCitzdGF0aWMgZW51bSB3b3JrX2FjdGlvbiBfX211c3RfY2hlY2sKK2llZWU4MDIxMV9hc3NvY19iZWFjb25fd2FpdChzdHJ1Y3QgaWVlZTgwMjExX3dvcmsgKndrKQoreworCWlmICh3ay0+c3RhcnRlZCkKKwkJcmV0dXJuIFdPUktfQUNUX1RJTUVPVVQ7CisKKwkvKgorCSAqIFdhaXQgdXAgdG8gb25lIGJlYWNvbiBpbnRlcnZhbCAuLi4KKwkgKiBzaG91bGQgdGhpcyBiZSBtb3JlIGlmIHdlIG1pc3Mgb25lPworCSAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogd2FpdGluZyBmb3IgYmVhY29uIGZyb20gJXBNXG4iLAorCSAgICAgICB3ay0+c2RhdGEtPm5hbWUsIHdrLT5maWx0ZXJfdGEpOworCXdrLT50aW1lb3V0ID0gVFVfVE9fRVhQX1RJTUUod2stPmFzc29jLmJzcy0+YmVhY29uX2ludGVydmFsKTsKKwlyZXR1cm4gV09SS19BQ1RfTk9ORTsKK30KKwogc3RhdGljIHZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfd29yayAqd2ssCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkJICAgICBzaXplX3QgbGVuKQpAQCAtNzA5LDYgKzcyNSwyNSBAQAogCXJldHVybiBXT1JLX0FDVF9ET05FOwogfQogCitzdGF0aWMgZW51bSB3b3JrX2FjdGlvbiBfX211c3RfY2hlY2sKK2llZWU4MDIxMV9yeF9tZ210X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX3dvcmsgKndrLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHdrLT5zZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKworCUFTU0VSVF9XT1JLX01UWChsb2NhbCk7CisKKwlpZiAod2stPnR5cGUgIT0gSUVFRTgwMjExX1dPUktfQVNTT0NfQkVBQ09OX1dBSVQpCisJCXJldHVybiBXT1JLX0FDVF9NSVNNQVRDSDsKKworCWlmIChsZW4gPCAyNCArIDEyKQorCQlyZXR1cm4gV09SS19BQ1RfTk9ORTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogYmVhY29uIHJlY2VpdmVkXG4iLCBzZGF0YS0+bmFtZSk7CisJcmV0dXJuIFdPUktfQUNUX0RPTkU7Cit9CisKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV93b3JrX3J4X3F1ZXVlZF9tZ210KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC03MzEsNiArNzY2LDcgQEAKIAkJY2FzZSBJRUVFODAyMTFfV09SS19ESVJFQ1RfUFJPQkU6CiAJCWNhc2UgSUVFRTgwMjExX1dPUktfQVVUSDoKIAkJY2FzZSBJRUVFODAyMTFfV09SS19BU1NPQzoKKwkJY2FzZSBJRUVFODAyMTFfV09SS19BU1NPQ19CRUFDT05fV0FJVDoKIAkJCWJzc2lkID0gd2stPmZpbHRlcl90YTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNzQ1LDYgKzc4MSw5IEBACiAJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQkJcm1hID0gaWVlZTgwMjExX3J4X21nbXRfYmVhY29uKHdrLCBtZ210LCBza2ItPmxlbik7CisJCQlicmVhazsKIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUDoKIAkJCXJtYSA9IGllZWU4MDIxMV9yeF9tZ210X3Byb2JlX3Jlc3Aod2ssIG1nbXQsIHNrYi0+bGVuLAogCQkJCQkJCSAgIHJ4X3N0YXR1cyk7CkBAIC04NDAsNyArODc5LDcgQEAKIAogCS8qCiAJICogaWVlZTgwMjExX3F1ZXVlX3dvcmsoKSBzaG91bGQgaGF2ZSBwaWNrZWQgdXAgbW9zdCBjYXNlcywKLQkgKiBoZXJlIHdlJ2xsIHBpY2sgdGhlIHRoZSByZXN0LgorCSAqIGhlcmUgd2UnbGwgcGljayB0aGUgcmVzdC4KIAkgKi8KIAlpZiAoV0FSTihsb2NhbC0+c3VzcGVuZGVkLCAid29yayBzY2hlZHVsZWQgd2hpbGUgZ29pbmcgdG8gc3VzcGVuZFxuIikpCiAJCXJldHVybjsKQEAgLTkxNiw2ICs5NTUsOSBAQAogCQljYXNlIElFRUU4MDIxMV9XT1JLX1JFTUFJTl9PTl9DSEFOTkVMOgogCQkJcm1hID0gaWVlZTgwMjExX3JlbWFpbl9vbl9jaGFubmVsX3RpbWVvdXQod2spOwogCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1dPUktfQVNTT0NfQkVBQ09OX1dBSVQ6CisJCQlybWEgPSBpZWVlODAyMTFfYXNzb2NfYmVhY29uX3dhaXQod2spOworCQkJYnJlYWs7CiAJCX0KIAogCQl3ay0+c3RhcnRlZCA9IHN0YXJ0ZWQ7CkBAIC0xMDY1LDYgKzExMDcsNyBAQAogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKIAkJCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+d29ya19za2JfcXVldWUsIHNrYik7CiAJCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmbG9jYWwtPndvcmtfd29yayk7CiAJCQlyZXR1cm4gUlhfUVVFVUVEOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dwYS5jIGIvbmV0L21hYzgwMjExL3dwYS5jCmluZGV4IDBhZGJjYzkuLjhkNTlkMjcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93cGEuYworKysgYi9uZXQvbWFjODAyMTEvd3BhLmMKQEAgLTE4Myw5ICsxODMsOCBAQAogCXNrYl9wdXQoc2tiLCBUS0lQX0lDVl9MRU4pOwogCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlpZWVlODAyMTFfdGtpcF9lbmNyeXB0X2RhdGEodHgtPmxvY2FsLT53ZXBfdHhfdGZtLAotCQkJCSAgICBrZXksIHBvcywgbGVuLCBoZHItPmFkZHIyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gaWVlZTgwMjExX3RraXBfZW5jcnlwdF9kYXRhKHR4LT5sb2NhbC0+d2VwX3R4X3RmbSwKKwkJCQkJICAga2V5LCBwb3MsIGxlbiwgaGRyLT5hZGRyMik7CiB9CiAKIApAQCAtNDM2LDYgKzQzNSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwogCXU4IHBuW0NDTVBfUE5fTEVOXTsKIAlpbnQgZGF0YV9sZW47CisJaW50IHF1ZXVlOwogCiAJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwogCkBAIC00NTMsNyArNDUzLDEwIEBACiAKIAljY21wX2hkcjJwbihwbiwgc2tiLT5kYXRhICsgaGRybGVuKTsKIAotCWlmIChtZW1jbXAocG4sIGtleS0+dS5jY21wLnJ4X3BuW3J4LT5xdWV1ZV0sIENDTVBfUE5fTEVOKSA8PSAwKSB7CisJcXVldWUgPSBpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpID8KKwkJTlVNX1JYX0RBVEFfUVVFVUVTIDogcngtPnF1ZXVlOworCisJaWYgKG1lbWNtcChwbiwga2V5LT51LmNjbXAucnhfcG5bcXVldWVdLCBDQ01QX1BOX0xFTikgPD0gMCkgewogCQlrZXktPnUuY2NtcC5yZXBsYXlzKys7CiAJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCX0KQEAgLTQ3MCw3ICs0NzMsNyBAQAogCQkJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7CiAJfQogCi0JbWVtY3B5KGtleS0+dS5jY21wLnJ4X3BuW3J4LT5xdWV1ZV0sIHBuLCBDQ01QX1BOX0xFTik7CisJbWVtY3B5KGtleS0+dS5jY21wLnJ4X3BuW3F1ZXVlXSwgcG4sIENDTVBfUE5fTEVOKTsKIAogCS8qIFJlbW92ZSBDQ01QIGhlYWRlciBhbmQgTUlDICovCiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIENDTVBfTUlDX0xFTik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggODU5M2E3Ny4uNDMyODgyNTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTQwLDI3ICs0MCw2IEBACiAKIGlmIE5GX0NPTk5UUkFDSwogCi1jb25maWcgTkZfQ1RfQUNDVAotCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZmxvdyBhY2NvdW50aW5nIgotCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECi0JaGVscAotCSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgY29kZSB3aWxsCi0JICBrZWVwIHBlci1mbG93IHBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4KLQotCSAgVGhvc2UgY291bnRlcnMgY2FuIGJlIHVzZWQgZm9yIGZsb3ctYmFzZWQgYWNjb3VudGluZyBvciB0aGUKLQkgIGBjb25uYnl0ZXMnIG1hdGNoLgotCi0JICBQbGVhc2Ugbm90ZSB0aGF0IGN1cnJlbnRseSB0aGlzIG9wdGlvbiBvbmx5IHNldHMgYSBkZWZhdWx0IHN0YXRlLgotCSAgWW91IG1heSBjaGFuZ2UgaXQgYXQgYm9vdCB0aW1lIHdpdGggbmZfY29ubnRyYWNrLmFjY3Q9MC8xIGtlcm5lbAotCSAgcGFyYW1ldGVyIG9yIGJ5IGxvYWRpbmcgdGhlIG5mX2Nvbm50cmFjayBtb2R1bGUgd2l0aCBhY2N0PTAvMS4KLQotCSAgWW91IG1heSBhbHNvIGRpc2FibGUvZW5hYmxlIGl0IG9uIGEgcnVubmluZyBzeXN0ZW0gd2l0aDoKLQkgICBzeXNjdGwgbmV0Lm5ldGZpbHRlci5uZl9jb25udHJhY2tfYWNjdD0wLzEKLQotCSAgVGhpcyBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIDIuNi4yOS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCiBjb25maWcgTkZfQ09OTlRSQUNLX01BUksKIAlib29sICAnQ29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKQEAgLTM0Nyw2ICszMjYsMjIgQEAKIAogY29tbWVudCAiWHRhYmxlcyB0YXJnZXRzIgogCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTQorCXRyaXN0YXRlICJDSEVDS1NVTSB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX01BTkdMRSB8fCBJUDZfTkZfTUFOR0xFCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYENIRUNLU1VNJyB0YXJnZXQsIHdoaWNoIGNhbiBiZSB1c2VkIGluIHRoZSBpcHRhYmxlcyBtYW5nbGUKKwkgIHRhYmxlLgorCisJICBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byBjb21wdXRlIGFuZCBmaWxsIGluIHRoZSBjaGVja3N1bSBpbgorCSAgYSBwYWNrZXQgdGhhdCBsYWNrcyBhIGNoZWNrc3VtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsLAorCSAgaWYgeW91IG5lZWQgdG8gd29yayBhcm91bmQgb2xkIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGRoY3AgY2xpZW50cywKKwkgIHRoYXQgZG8gbm90IHdvcmsgd2VsbCB3aXRoIGNoZWNrc3VtIG9mZmxvYWRzLCBidXQgZG9uJ3Qgd2FudCB0byBkaXNhYmxlCisJICBjaGVja3N1bSBvZmZsb2FkIGluIHlvdXIgZGV2aWNlLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkKIAl0cmlzdGF0ZSAnIkNMQVNTSUZZIiB0YXJnZXQgc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRApAQCAtNDI0LDYgKzQxOSwxOCBAQAogCXNpbmNlIHlvdSBjYW4gZWFzaWx5IGNyZWF0ZSBpbW1vcnRhbCBwYWNrZXRzIHRoYXQgbG9vcAogCWZvcmV2ZXIgb24gdGhlIG5ldHdvcmsuCiAKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX0lETEVUSU1FUgorCXRyaXN0YXRlICAiSURMRVRJTUVSIHRhcmdldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJaGVscAorCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBgSURMRVRJTUVSJyB0YXJnZXQuICBFYWNoIG1hdGNoaW5nIHBhY2tldAorCSAgcmVzZXRzIHRoZSB0aW1lciBhc3NvY2lhdGVkIHdpdGggbGFiZWwgc3BlY2lmaWVkIHdoZW4gdGhlIHJ1bGUgaXMKKwkgIGFkZGVkLiAgV2hlbiB0aGUgdGltZXIgZXhwaXJlcywgaXQgdHJpZ2dlcnMgYSBzeXNmcyBub3RpZmljYXRpb24uCisJICBUaGUgcmVtYWluaW5nIHRpbWUgZm9yIGV4cGlyYXRpb24gY2FuIGJlIHJlYWQgdmlhIHN5c2ZzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfTEVECiAJdHJpc3RhdGUgJyJMRUQiIHRhcmdldCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBMRURTX1RSSUdHRVJTCkBAIC01MDMsNyArNTEwLDcgQEAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9URUUKLQl0cmlzdGF0ZSAnIlRFRSIgLSBwYWNrZXQgY2xvbmluZyB0byBhbHRlcm5hdGUgZGVzdGlhbnRpb24nCisJdHJpc3RhdGUgJyJURUUiIC0gcGFja2V0IGNsb25pbmcgdG8gYWx0ZXJuYXRlIGRlc3RpbmF0aW9uJwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJZGVwZW5kcyBvbiAoSVBWNiB8fCBJUFY2PW4pCiAJZGVwZW5kcyBvbiAhTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSwpAQCAtNjE4LDcgKzYyNSw2IEBACiAJdHJpc3RhdGUgICciY29ubmJ5dGVzIiBwZXItY29ubmVjdGlvbiBjb3VudGVyIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAotCXNlbGVjdCBORl9DVF9BQ0NUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25uYnl0ZXMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQogCSAgbnVtYmVyIG9mIGJ5dGVzIGFuZC9vciBwYWNrZXRzIGZvciBlYWNoIGRpcmVjdGlvbiB3aXRoaW4gYSBjb25uZWN0aW9uLgpAQCAtNjU3LDYgKzY2MywxNSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DUFUKKwl0cmlzdGF0ZSAnImNwdSIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCWhlbHAKKwkgIENQVSBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIENQVQorCSAgY3VycmVudGx5IGhhbmRsaW5nIHRoZSBwYWNrZXQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0RDQ1AKIAl0cmlzdGF0ZSAnImRjY3AiIHByb3RvY29sIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKQEAgLTczNiw2ICs3NTEsMTYgQEAKIAogCUlmIHVuc3VyZSwgc2F5IE0uCiAKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfSVBWUworCXRyaXN0YXRlICciaXB2cyIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIElQX1ZTCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggYWdhaW5zdCBJUFZTIHByb3BlcnRpZXMgb2YgYSBwYWNrZXQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RICiAJdHJpc3RhdGUgJyJsZW5ndGgiIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDE0ZTNhOGYuLjQ0MTA1MGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNDUsNiArNDUsNyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9DT05OTUFSSykgKz0geHRfY29ubm1hcmsubwogCiAjIHRhcmdldHMKK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNKSArPSB4dF9DSEVDS1NVTS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWSkgKz0geHRfQ0xBU1NJRlkubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTlNFQ01BUkspICs9IHh0X0NPTk5TRUNNQVJLLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NUKSArPSB4dF9DVC5vCkBAIC02MSw2ICs2Miw3IEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BPUFRTVFJJUCkgKz0geHRfVENQT1BUU1RSSVAubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVEVFKSArPSB4dF9URUUubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UpICs9IHh0X1RSQUNFLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0lETEVUSU1FUikgKz0geHRfSURMRVRJTUVSLm8KIAogIyBtYXRjaGVzCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NMVVNURVIpICs9IHh0X2NsdXN0ZXIubwpAQCAtNjgsNiArNzAsNyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVMpICs9IHh0X2Nvbm5ieXRlcy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVCkgKz0geHRfY29ubmxpbWl0Lm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLKSArPSB4dF9jb25udHJhY2subworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DUFUpICs9IHh0X2NwdS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1ApICs9IHh0X2RjY3Aubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQKSArPSB4dF9kc2NwLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQKSArPSB4dF9lc3AubwpAQCAtNzUsNiArNzgsNyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVIpICs9IHh0X2hlbHBlci5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hMKSArPSB4dF9obC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0UpICs9IHh0X2lwcmFuZ2Uubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFZTKSArPSB4dF9pcHZzLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIKSArPSB4dF9sZW5ndGgubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVCkgKz0geHRfbGltaXQubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUMpICs9IHh0X21hYy5vCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvS2NvbmZpZyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9LY29uZmlnCmluZGV4IDcxMmNjYWQuLjQ2YTc3ZDUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIwogbWVudWNvbmZpZyBJUF9WUwogCXRyaXN0YXRlICJJUCB2aXJ0dWFsIHNlcnZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUICYmIElORVQgJiYgTkVURklMVEVSCisJZGVwZW5kcyBvbiBORVQgJiYgSU5FVCAmJiBORVRGSUxURVIgJiYgTkZfQ09OTlRSQUNLCiAJLS0taGVscC0tLQogCSAgSVAgVmlydHVhbCBTZXJ2ZXIgc3VwcG9ydCB3aWxsIGxldCB5b3UgYnVpbGQgYSBoaWdoLXBlcmZvcm1hbmNlCiAJICB2aXJ0dWFsIHNlcnZlciBiYXNlZCBvbiBjbHVzdGVyIG9mIHR3byBvciBtb3JlIHJlYWwgc2VydmVycy4gVGhpcwpAQCAtMjYsNyArMjYsNyBAQAogCiBjb25maWcJSVBfVlNfSVBWNgogCWJvb2wgIklQdjYgc3VwcG9ydCBmb3IgSVBWUyIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAoSVBWNiA9IHkgfHwgSVBfVlMgPSBJUFY2KQorCWRlcGVuZHMgb24gSVBWNiA9IHkgfHwgSVBfVlMgPSBJUFY2CiAJLS0taGVscC0tLQogCSAgQWRkIElQdjYgc3VwcG9ydCB0byBJUFZTLiBUaGlzIGlzIGluY29tcGxldGUgYW5kIG1pZ2h0IGJlIGRhbmdlcm91cy4KIApAQCAtODcsMTkgKzg3LDE2IEBACiAJICBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgogCiBjb25maWcJSVBfVlNfUFJPVE9fQUhfRVNQCi0JYm9vbAotCWRlcGVuZHMgb24gVU5ERUZJTkVECisJZGVmX2Jvb2wgSVBfVlNfUFJPVE9fRVNQIHx8IElQX1ZTX1BST1RPX0FICiAKIGNvbmZpZwlJUF9WU19QUk9UT19FU1AKIAlib29sICJFU1AgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCIKLQlzZWxlY3QgSVBfVlNfUFJPVE9fQUhfRVNQCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBsb2FkIGJhbGFuY2luZyBFU1AgKEVuY2Fwc3VsYXRpb24KIAkgIFNlY3VyaXR5IFBheWxvYWQpIHRyYW5zcG9ydCBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgogCiBjb25maWcJSVBfVlNfUFJPVE9fQUgKIAlib29sICJBSCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgotCXNlbGVjdCBJUF9WU19QUk9UT19BSF9FU1AKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGxvYWQgYmFsYW5jaW5nIEFIIChBdXRoZW50aWNhdGlvbgogCSAgSGVhZGVyKSB0cmFuc3BvcnQgcHJvdG9jb2wuIFNheSBZIGlmIHVuc3VyZS4KQEAgLTIzOCw3ICsyMzUsNyBAQAogCiBjb25maWcJSVBfVlNfRlRQCiAgIAl0cmlzdGF0ZSAiRlRQIHByb3RvY29sIGhlbHBlciIKLSAgICAgICAgZGVwZW5kcyBvbiBJUF9WU19QUk9UT19UQ1AKKyAgICAgICAgZGVwZW5kcyBvbiBJUF9WU19QUk9UT19UQ1AgJiYgTkZfTkFUCiAJLS0taGVscC0tLQogCSAgRlRQIGlzIGEgcHJvdG9jb2wgdGhhdCB0cmFuc2ZlcnMgSVAgYWRkcmVzcyBhbmQvb3IgcG9ydCBudW1iZXIgaW4KIAkgIHRoZSBwYXlsb2FkLiBJbiB0aGUgdmlydHVhbCBzZXJ2ZXIgdmlhIE5ldHdvcmsgQWRkcmVzcyBUcmFuc2xhdGlvbiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19hcHAuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19hcHAuYwppbmRleCAxY2IwZTgzLi5lNzZmODdmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfYXBwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2FwcC5jCkBAIC01NjksNDkgKzU2OSw2IEBACiB9OwogI2VuZGlmCiAKLQotLyoKLSAqCVJlcGxhY2UgYSBzZWdtZW50IG9mIGRhdGEgd2l0aCBhIG5ldyBzZWdtZW50Ci0gKi8KLWludCBpcF92c19za2JfcmVwbGFjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBwcmksCi0JCSAgICAgIGNoYXIgKm9fYnVmLCBpbnQgb19sZW4sIGNoYXIgKm5fYnVmLCBpbnQgbl9sZW4pCi17Ci0JaW50IGRpZmY7Ci0JaW50IG9fb2Zmc2V0OwotCWludCBvX2xlZnQ7Ci0KLQlFbnRlckZ1bmN0aW9uKDkpOwotCi0JZGlmZiA9IG5fbGVuIC0gb19sZW47Ci0Jb19vZmZzZXQgPSBvX2J1ZiAtIChjaGFyICopc2tiLT5kYXRhOwotCS8qIFRoZSBsZW5ndGggb2YgbGVmdCBkYXRhIGFmdGVyIG9fYnVmK29fbGVuIGluIHRoZSBza2IgZGF0YSAqLwotCW9fbGVmdCA9IHNrYi0+bGVuIC0gKG9fb2Zmc2V0ICsgb19sZW4pOwotCi0JaWYgKGRpZmYgPD0gMCkgewotCQltZW1tb3ZlKG9fYnVmICsgbl9sZW4sIG9fYnVmICsgb19sZW4sIG9fbGVmdCk7Ci0JCW1lbWNweShvX2J1Ziwgbl9idWYsIG5fbGVuKTsKLQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiArIGRpZmYpOwotCX0gZWxzZSBpZiAoZGlmZiA8PSBza2JfdGFpbHJvb20oc2tiKSkgewotCQlza2JfcHV0KHNrYiwgZGlmZik7Ci0JCW1lbW1vdmUob19idWYgKyBuX2xlbiwgb19idWYgKyBvX2xlbiwgb19sZWZ0KTsKLQkJbWVtY3B5KG9fYnVmLCBuX2J1Ziwgbl9sZW4pOwotCX0gZWxzZSB7Ci0JCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIGRpZmYsIHByaSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJc2tiX3B1dChza2IsIGRpZmYpOwotCQltZW1tb3ZlKHNrYi0+ZGF0YSArIG9fb2Zmc2V0ICsgbl9sZW4sCi0JCQlza2ItPmRhdGEgKyBvX29mZnNldCArIG9fbGVuLCBvX2xlZnQpOwotCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvX29mZnNldCwgbl9idWYsIG5fbGVuKTsKLQl9Ci0KLQkvKiBtdXN0IHVwZGF0ZSB0aGUgaXBoIHRvdGFsIGxlbmd0aCBoZXJlICovCi0JaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0KLQlMZWF2ZUZ1bmN0aW9uKDkpOwotCXJldHVybiAwOwotfQotCi0KIGludCBfX2luaXQgaXBfdnNfYXBwX2luaXQodm9pZCkKIHsKIAkvKiB3ZSB3aWxsIHJlcGxhY2UgaXQgd2l0aCBwcm9jX25ldF9pcHZzX2NyZWF0ZSgpIHNvb24gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCmluZGV4IGZmMDRlOWUuLmI3MWM2OWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYwpAQCAtMTU4LDYgKzE1OCw5IEBACiAJdW5zaWduZWQgaGFzaDsKIAlpbnQgcmV0OwogCisJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9PTkVfUEFDS0VUKQorCQlyZXR1cm4gMDsKKwogCS8qIEhhc2ggYnkgcHJvdG9jb2wsIGNsaWVudCBhZGRyZXNzIGFuZCBwb3J0ICovCiAJaGFzaCA9IGlwX3ZzX2Nvbm5faGFzaGtleShjcC0+YWYsIGNwLT5wcm90b2NvbCwgJmNwLT5jYWRkciwgY3AtPmNwb3J0KTsKIApAQCAtMjY4LDYgKzI3MSwyOSBAQAogCXJldHVybiBjcDsKIH0KIAorc3RydWN0IGlwX3ZzX2Nvbm4gKgoraXBfdnNfY29ubl9pbl9nZXRfcHJvdG8oaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJCWNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLAorCQkJdW5zaWduZWQgaW50IHByb3RvX29mZiwgaW50IGludmVyc2UpCit7CisJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CisKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlpZiAocHB0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKQorCQlyZXR1cm4gaXBfdnNfY29ubl9pbl9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCisJCQkJCSAmaXBoLT5zYWRkciwgcHB0clswXSwKKwkJCQkJICZpcGgtPmRhZGRyLCBwcHRyWzFdKTsKKwllbHNlCisJCXJldHVybiBpcF92c19jb25uX2luX2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJICZpcGgtPmRhZGRyLCBwcHRyWzFdLAorCQkJCQkgJmlwaC0+c2FkZHIsIHBwdHJbMF0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXBfdnNfY29ubl9pbl9nZXRfcHJvdG8pOworCiAvKiBHZXQgcmVmZXJlbmNlIHRvIGNvbm5lY3Rpb24gdGVtcGxhdGUgKi8KIHN0cnVjdCBpcF92c19jb25uICppcF92c19jdF9pbl9nZXQKIChpbnQgYWYsIGludCBwcm90b2NvbCwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpzX2FkZHIsIF9fYmUxNiBzX3BvcnQsCkBAIC0zNTMsMTQgKzM3OSwzNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0cnVjdCBpcF92c19jb25uICoKK2lwX3ZzX2Nvbm5fb3V0X2dldF9wcm90byhpbnQgYWYsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJCSBjb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwKKwkJCSB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKK3sKKwlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKKworCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b19vZmYsIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCWlmIChwcHRyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGxpa2VseSghaW52ZXJzZSkpCisJCXJldHVybiBpcF92c19jb25uX291dF9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCisJCQkJCSAgJmlwaC0+c2FkZHIsIHBwdHJbMF0sCisJCQkJCSAgJmlwaC0+ZGFkZHIsIHBwdHJbMV0pOworCWVsc2UKKwkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJICAmaXBoLT5kYWRkciwgcHB0clsxXSwKKwkJCQkJICAmaXBoLT5zYWRkciwgcHB0clswXSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcF92c19jb25uX291dF9nZXRfcHJvdG8pOwogCiAvKgogICogICAgICBQdXQgYmFjayB0aGUgY29ubiBhbmQgcmVzdGFydCBpdHMgdGltZXIgd2l0aCBpdHMgdGltZW91dAogICovCiB2b2lkIGlwX3ZzX2Nvbm5fcHV0KHN0cnVjdCBpcF92c19jb25uICpjcCkKIHsKLQkvKiByZXNldCBpdCBleHBpcmUgaW4gaXRzIHRpbWVvdXQgKi8KLQltb2RfdGltZXIoJmNwLT50aW1lciwgamlmZmllcytjcC0+dGltZW91dCk7CisJdW5zaWduZWQgbG9uZyB0ID0gKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9PTkVfUEFDS0VUKSA/CisJCTAgOiBjcC0+dGltZW91dDsKKwltb2RfdGltZXIoJmNwLT50aW1lciwgamlmZmllcyt0KTsKIAogCV9faXBfdnNfY29ubl9wdXQoY3ApOwogfQpAQCAtNjUzLDcgKzcwMiw3IEBACiAJLyoKIAkgKgl1bmhhc2ggaXQgaWYgaXQgaXMgaGFzaGVkIGluIHRoZSBjb25uIHRhYmxlCiAJICovCi0JaWYgKCFpcF92c19jb25uX3VuaGFzaChjcCkpCisJaWYgKCFpcF92c19jb25uX3VuaGFzaChjcCkgJiYgIShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfT05FX1BBQ0tFVCkpCiAJCWdvdG8gZXhwaXJlX2xhdGVyOwogCiAJLyoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCmluZGV4IDFjZDZlM2YuLjRmOGRkYmE0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKQEAgLTU0LDcgKzU0LDYgQEAKIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIpOwogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcik7Ci1FWFBPUlRfU1lNQk9MKGlwX3ZzX3NrYl9yZXBsYWNlKTsKIEVYUE9SVF9TWU1CT0woaXBfdnNfcHJvdG9fbmFtZSk7CiBFWFBPUlRfU1lNQk9MKGlwX3ZzX2Nvbm5fbmV3KTsKIEVYUE9SVF9TWU1CT0woaXBfdnNfY29ubl9pbl9nZXQpOwpAQCAtMTk0LDYgKzE5Myw3IEBACiAJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmN0OwogCV9fYmUxNiAgZHBvcnQ7CQkJLyogZGVzdGluYXRpb24gcG9ydCB0byBmb3J3YXJkICovCisJX19iZTE2ICBmbGFnczsKIAl1bmlvbiBuZl9pbmV0X2FkZHIgc25ldDsJLyogc291cmNlIG5ldHdvcmsgb2YgdGhlIGNsaWVudCwKIAkJCQkJICAgYWZ0ZXIgbWFza2luZyAqLwogCkBAIC0zNDAsNiArMzQwLDEwIEBACiAJCWRwb3J0ID0gcG9ydHNbMV07CiAJfQogCisJZmxhZ3MgPSAoc3ZjLT5mbGFncyAmIElQX1ZTX1NWQ19GX09ORVBBQ0tFVAorCQkgJiYgaXBoLnByb3RvY29sID09IElQUFJPVE9fVURQKT8KKwkJSVBfVlNfQ09OTl9GX09ORV9QQUNLRVQgOiAwOworCiAJLyoKIAkgKiAgICBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlCiAJICovCkBAIC0zNDcsNyArMzUxLDcgQEAKIAkJCSAgICAmaXBoLnNhZGRyLCBwb3J0c1swXSwKIAkJCSAgICAmaXBoLmRhZGRyLCBwb3J0c1sxXSwKIAkJCSAgICAmZGVzdC0+YWRkciwgZHBvcnQsCi0JCQkgICAgMCwKKwkJCSAgICBmbGFncywKIAkJCSAgICBkZXN0KTsKIAlpZiAoY3AgPT0gTlVMTCkgewogCQlpcF92c19jb25uX3B1dChjdCk7CkBAIC0zNzcsNyArMzgxLDcgQEAKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSBOVUxMOwogCXN0cnVjdCBpcF92c19pcGhkciBpcGg7CiAJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CisJX19iZTE2IF9wb3J0c1syXSwgKnBwdHIsIGZsYWdzOwogCiAJaXBfdnNfZmlsbF9pcGhkcihzdmMtPmFmLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgJmlwaCk7CiAJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC5sZW4sIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwpAQCAtNDA3LDYgKzQxMSwxMCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlmbGFncyA9IChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfT05FUEFDS0VUCisJCSAmJiBpcGgucHJvdG9jb2wgPT0gSVBQUk9UT19VRFApPworCQlJUF9WU19DT05OX0ZfT05FX1BBQ0tFVCA6IDA7CisKIAkvKgogCSAqICAgIENyZWF0ZSBhIGNvbm5lY3Rpb24gZW50cnkuCiAJICovCkBAIC00MTQsNyArNDIyLDcgQEAKIAkJCSAgICAmaXBoLnNhZGRyLCBwcHRyWzBdLAogCQkJICAgICZpcGguZGFkZHIsIHBwdHJbMV0sCiAJCQkgICAgJmRlc3QtPmFkZHIsIGRlc3QtPnBvcnQgPyBkZXN0LT5wb3J0IDogcHB0clsxXSwKLQkJCSAgICAwLAorCQkJICAgIGZsYWdzLAogCQkJICAgIGRlc3QpOwogCWlmIChjcCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTQ2NCw2ICs0NzIsOSBAQAogCWlmIChzeXNjdGxfaXBfdnNfY2FjaGVfYnlwYXNzICYmIHN2Yy0+ZndtYXJrICYmIHVuaWNhc3QpIHsKIAkJaW50IHJldCwgY3M7CiAJCXN0cnVjdCBpcF92c19jb25uICpjcDsKKwkJX191MTYgZmxhZ3MgPSAoc3ZjLT5mbGFncyAmIElQX1ZTX1NWQ19GX09ORVBBQ0tFVCAmJgorCQkJCWlwaC5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCk/CisJCQkJSVBfVlNfQ09OTl9GX09ORV9QQUNLRVQgOiAwOwogCQl1bmlvbiBuZl9pbmV0X2FkZHIgZGFkZHIgPSAgeyAuYWxsID0geyAwLCAwLCAwLCAwIH0gfTsKIAogCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwpAQCAtNDc0LDcgKzQ4NSw3IEBACiAJCQkJICAgICZpcGguc2FkZHIsIHBwdHJbMF0sCiAJCQkJICAgICZpcGguZGFkZHIsIHBwdHJbMV0sCiAJCQkJICAgICZkYWRkciwgMCwKLQkJCQkgICAgSVBfVlNfQ09OTl9GX0JZUEFTUywKKwkJCQkgICAgSVBfVlNfQ09OTl9GX0JZUEFTUyB8IGZsYWdzLAogCQkJCSAgICBOVUxMKTsKIAkJaWYgKGNwID09IE5VTEwpCiAJCQlyZXR1cm4gTkZfRFJPUDsKQEAgLTUyNCwyNiArNTM1LDYgQEAKIAlyZXR1cm4gTkZfRFJPUDsKIH0KIAotCi0vKgotICogICAgICBJdCBpcyBob29rZWQgYmVmb3JlIE5GX0lQX1BSSV9OQVRfU1JDIGF0IHRoZSBORl9JTkVUX1BPU1RfUk9VVElORwotICogICAgICBjaGFpbiwgYW5kIGlzIHVzZWQgZm9yIFZTL05BVC4KLSAqICAgICAgSXQgZGV0ZWN0cyBwYWNrZXRzIGZvciBWUy9OQVQgY29ubmVjdGlvbnMgYW5kIHNlbmRzIHRoZSBwYWNrZXRzCi0gKiAgICAgIGltbWVkaWF0ZWx5LiBUaGlzIGNhbiBhdm9pZCB0aGF0IGlwdGFibGVfbmF0IG1hbmdsZXMgdGhlIHBhY2tldHMKLSAqICAgICAgZm9yIFZTL05BVC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpcF92c19wb3N0X3JvdXRpbmcodW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0JaWYgKCFza2ItPmlwdnNfcHJvcGVydHkpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JLyogVGhlIHBhY2tldCB3YXMgc2VudCBmcm9tIElQVlMsIGV4aXQgdGhpcyBjaGFpbiAqLwotCXJldHVybiBORl9TVE9QOwotfQotCiBfX3N1bTE2IGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQpCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCBvZmZzZXQsIHNrYi0+bGVuIC0gb2Zmc2V0LCAwKSk7CkBAIC0xNDg3LDE0ICsxNDc4LDYgQEAKIAkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9GT1JXQVJELAogCQkucHJpb3JpdHkgICAgICAgPSA5OSwKIAl9LAotCS8qIEJlZm9yZSB0aGUgbmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcsIGV4aXQgZnJvbSBQT1NUX1JPVVRJTkcgKi8KLQl7Ci0JCS5ob29rCQk9IGlwX3ZzX3Bvc3Rfcm91dGluZywKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9QT1NUX1JPVVRJTkcsCi0JCS5wcmlvcml0eSAgICAgICA9IE5GX0lQX1BSSV9OQVRfU1JDLTEsCi0JfSwKICNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgogCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcsIGZvcndhcmQgcGFja2V0IHRocm91Z2ggVlMvRFIsIFZTL1RVTiwKIAkgKiBvciBWUy9OQVQoY2hhbmdlIGRlc3RpbmF0aW9uKSwgc28gdGhhdCBmaWx0ZXJpbmcgcnVsZXMgY2FuIGJlCkBAIC0xNTIzLDE0ICsxNTA2LDYgQEAKIAkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9GT1JXQVJELAogCQkucHJpb3JpdHkgICAgICAgPSA5OSwKIAl9LAotCS8qIEJlZm9yZSB0aGUgbmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcsIGV4aXQgZnJvbSBQT1NUX1JPVVRJTkcgKi8KLQl7Ci0JCS5ob29rCQk9IGlwX3ZzX3Bvc3Rfcm91dGluZywKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVDYsCi0JCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfUE9TVF9ST1VUSU5HLAotCQkucHJpb3JpdHkgICAgICAgPSBORl9JUDZfUFJJX05BVF9TUkMtMSwKLQl9LAogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKaW5kZXggMzZkYzFkOC4uMGYwYzA3OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYwpAQCAtMTg2NCwxNCArMTg2NCwxNiBAQAogCQkJCQkgICBzdmMtPnNjaGVkdWxlci0+bmFtZSk7CiAJCQllbHNlCiAjZW5kaWYKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICAlMDhYOiUwNFggJXMgIiwKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICAlMDhYOiUwNFggJXMgJXMgIiwKIAkJCQkJICAgaXBfdnNfcHJvdG9fbmFtZShzdmMtPnByb3RvY29sKSwKIAkJCQkJICAgbnRvaGwoc3ZjLT5hZGRyLmlwKSwKIAkJCQkJICAgbnRvaHMoc3ZjLT5wb3J0KSwKLQkJCQkJICAgc3ZjLT5zY2hlZHVsZXItPm5hbWUpOworCQkJCQkgICBzdmMtPnNjaGVkdWxlci0+bmFtZSwKKwkJCQkJICAgKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9PTkVQQUNLRVQpPyJvcHMgIjoiIik7CiAJCX0gZWxzZSB7Ci0JCQlzZXFfcHJpbnRmKHNlcSwgIkZXTSAgJTA4WCAlcyAiLAotCQkJCSAgIHN2Yy0+ZndtYXJrLCBzdmMtPnNjaGVkdWxlci0+bmFtZSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIkZXTSAgJTA4WCAlcyAlcyIsCisJCQkJICAgc3ZjLT5md21hcmssIHN2Yy0+c2NoZWR1bGVyLT5uYW1lLAorCQkJCSAgIChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfT05FUEFDS0VUKT8ib3BzICI6IiIpOwogCQl9CiAKIAkJaWYgKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9QRVJTSVNURU5UKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jCmluZGV4IDJhZTc0N2EuLmYyMjhhMTcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMKQEAgLTIwLDYgKzIwLDE3IEBACiAgKgogICogQXV0aG9yOglXb3V0ZXIgR2FkZXluZQogICoKKyAqCisgKiBDb2RlIGZvciBpcF92c19leHBlY3RfcmVsYXRlZCBhbmQgaXBfdnNfZXhwZWN0X2NhbGxiYWNrIGlzIHRha2VuIGZyb20KKyAqIGh0dHA6Ly93d3cuc3NpLmJnL35qYS9uZmN0LzoKKyAqCisgKiBpcF92c19uZmN0LmM6CU5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgZm9yIElQVlMKKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMgorICogQW50ZWZhY3RvIEx0ZCwgMTgxIFBhcm5lbGwgU3QsIER1YmxpbiAxLCBJcmVsYW5kLgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMy0yMDA4CisgKiBKdWxpYW4gQW5hc3Rhc292CiAgKi8KIAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiSVBWUyIKQEAgLTMyLDYgKzQzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CkBAIC00Myw2ICs1NywxNiBAQAogI2RlZmluZSBTRVJWRVJfU1RSSU5HICIyMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICgiCiAjZGVmaW5lIENMSUVOVF9TVFJJTkcgIlBPUlQgIgogCisjZGVmaW5lIEZNVF9UVVBMRQkiJXBJNDoldS0+JXBJNDoldS8ldSIKKyNkZWZpbmUgQVJHX1RVUExFKFQpCSYoVCktPnNyYy51My5pcCwgbnRvaHMoKFQpLT5zcmMudS5hbGwpLCBcCisJCQkmKFQpLT5kc3QudTMuaXAsIG50b2hzKChUKS0+ZHN0LnUuYWxsKSwgXAorCQkJKFQpLT5kc3QucHJvdG9udW0KKworI2RlZmluZSBGTVRfQ09OTgkiJXBJNDoldS0+JXBJNDoldS0+JXBJNDoldS8ldToldSIKKyNkZWZpbmUgQVJHX0NPTk4oQykJJigoQyktPmNhZGRyLmlwKSwgbnRvaHMoKEMpLT5jcG9ydCksIFwKKwkJCSYoKEMpLT52YWRkci5pcCksIG50b2hzKChDKS0+dnBvcnQpLCBcCisJCQkmKChDKS0+ZGFkZHIuaXApLCBudG9ocygoQyktPmRwb3J0KSwgXAorCQkJKEMpLT5wcm90b2NvbCwgKEMpLT5zdGF0ZQogCiAvKgogICogTGlzdCBvZiBwb3J0cyAodXAgdG8gSVBfVlNfQVBQX01BWF9QT1JUUykgdG8gYmUgaGFuZGxlZCBieSBoZWxwZXIKQEAgLTEyMyw2ICsxNDcsMTE5IEBACiAJcmV0dXJuIDE7CiB9CiAKKy8qCisgKiBDYWxsZWQgZnJvbSBpbml0X2Nvbm50cmFjaygpIGFzIGV4cGVjdGZuIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkCitpcF92c19leHBlY3RfY2FsbGJhY2soc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcsIG5ld19yZXBseTsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisKKwlpZiAoZXhwLT50dXBsZS5zcmMubDNudW0gIT0gUEZfSU5FVCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCBubyBORiBsb2NrcyBhcmUgaGVsZCBiZWZvcmUgdGhpcyBjYWxsYmFjay4KKwkgKiBpcF92c19jb25uX291dF9nZXQgYW5kIGlwX3ZzX2Nvbm5faW5fZ2V0IHNob3VsZCBtYXRjaCB0aGVpcgorCSAqIGV4cGVjdGF0aW9ucyBldmVuIGlmIHRoZXkgdXNlIHdpbGRjYXJkIHZhbHVlcywgbm93IHdlIHByb3ZpZGUgdGhlCisJICogYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBuZXdseSBjcmVhdGVkIG9yaWdpbmFsIGNvbm50cmFjayBkaXJlY3Rpb24uCisJICogVGhlIGNvbm50cmFjayBpcyBjb25maXJtZWQgd2hlbiBwYWNrZXQgcmVhY2hlcyBJUFZTIGhvb2tzLgorCSAqLworCisJLyogUlMtPkNMSUVOVCAqLworCW9yaWcgPSAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlOworCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGV4cC0+dHVwbGUuc3JjLmwzbnVtLCBvcmlnLT5kc3QucHJvdG9udW0sCisJCQkJJm9yaWctPnNyYy51Mywgb3JpZy0+c3JjLnUudGNwLnBvcnQsCisJCQkJJm9yaWctPmRzdC51Mywgb3JpZy0+ZHN0LnUudGNwLnBvcnQpOworCWlmIChjcCkgeworCQkvKiBDaGFuZ2UgcmVwbHkgQ0xJRU5ULT5SUyB0byBDTElFTlQtPlZTICovCisJCW5ld19yZXBseSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKKwkJSVBfVlNfREJHKDcsICIlcygpOiBjdD0lcCwgc3RhdHVzPTB4JWxYLCB0dXBsZXM9IiBGTVRfVFVQTEUgIiwgIgorCQkJICBGTVRfVFVQTEUgIiwgZm91bmQgaW5vdXQgY3A9IiBGTVRfQ09OTiAiXG4iLAorCQkJICBfX2Z1bmNfXywgY3QsIGN0LT5zdGF0dXMsCisJCQkgIEFSR19UVVBMRShvcmlnKSwgQVJHX1RVUExFKCZuZXdfcmVwbHkpLAorCQkJICBBUkdfQ09OTihjcCkpOworCQluZXdfcmVwbHkuZHN0LnUzID0gY3AtPnZhZGRyOworCQluZXdfcmVwbHkuZHN0LnUudGNwLnBvcnQgPSBjcC0+dnBvcnQ7CisJCUlQX1ZTX0RCRyg3LCAiJXMoKTogY3Q9JXAsIG5ldyB0dXBsZXM9IiBGTVRfVFVQTEUgIiwgIiBGTVRfVFVQTEUKKwkJCSAgIiwgaW5vdXQgY3A9IiBGTVRfQ09OTiAiXG4iLAorCQkJICBfX2Z1bmNfXywgY3QsCisJCQkgIEFSR19UVVBMRShvcmlnKSwgQVJHX1RVUExFKCZuZXdfcmVwbHkpLAorCQkJICBBUkdfQ09OTihjcCkpOworCQlnb3RvIGFsdGVyOworCX0KKworCS8qIENMSUVOVC0+VlMgKi8KKwljcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KGV4cC0+dHVwbGUuc3JjLmwzbnVtLCBvcmlnLT5kc3QucHJvdG9udW0sCisJCQkgICAgICAgJm9yaWctPnNyYy51Mywgb3JpZy0+c3JjLnUudGNwLnBvcnQsCisJCQkgICAgICAgJm9yaWctPmRzdC51Mywgb3JpZy0+ZHN0LnUudGNwLnBvcnQpOworCWlmIChjcCkgeworCQkvKiBDaGFuZ2UgcmVwbHkgVlMtPkNMSUVOVCB0byBSUy0+Q0xJRU5UICovCisJCW5ld19yZXBseSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKKwkJSVBfVlNfREJHKDcsICIlcygpOiBjdD0lcCwgc3RhdHVzPTB4JWxYLCB0dXBsZXM9IiBGTVRfVFVQTEUgIiwgIgorCQkJICBGTVRfVFVQTEUgIiwgZm91bmQgb3V0aW4gY3A9IiBGTVRfQ09OTiAiXG4iLAorCQkJICBfX2Z1bmNfXywgY3QsIGN0LT5zdGF0dXMsCisJCQkgIEFSR19UVVBMRShvcmlnKSwgQVJHX1RVUExFKCZuZXdfcmVwbHkpLAorCQkJICBBUkdfQ09OTihjcCkpOworCQluZXdfcmVwbHkuc3JjLnUzID0gY3AtPmRhZGRyOworCQluZXdfcmVwbHkuc3JjLnUudGNwLnBvcnQgPSBjcC0+ZHBvcnQ7CisJCUlQX1ZTX0RCRyg3LCAiJXMoKTogY3Q9JXAsIG5ldyB0dXBsZXM9IiBGTVRfVFVQTEUgIiwgIgorCQkJICBGTVRfVFVQTEUgIiwgb3V0aW4gY3A9IiBGTVRfQ09OTiAiXG4iLAorCQkJICBfX2Z1bmNfXywgY3QsCisJCQkgIEFSR19UVVBMRShvcmlnKSwgQVJHX1RVUExFKCZuZXdfcmVwbHkpLAorCQkJICBBUkdfQ09OTihjcCkpOworCQlnb3RvIGFsdGVyOworCX0KKworCUlQX1ZTX0RCRyg3LCAiJXMoKTogY3Q9JXAsIHN0YXR1cz0weCVsWCwgdHVwbGU9IiBGTVRfVFVQTEUKKwkJICAiIC0gdW5rbm93biBleHBlY3RcbiIsCisJCSAgX19mdW5jX18sIGN0LCBjdC0+c3RhdHVzLCBBUkdfVFVQTEUob3JpZykpOworCXJldHVybjsKKworYWx0ZXI6CisJLyogTmV2ZXIgYWx0ZXIgY29ubnRyYWNrIGZvciBub24tTkFUIGNvbm5zICovCisJaWYgKElQX1ZTX0ZXRF9NRVRIT0QoY3ApID09IElQX1ZTX0NPTk5fRl9NQVNRKQorCQluZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkoY3QsICZuZXdfcmVwbHkpOworCWlwX3ZzX2Nvbm5fcHV0KGNwKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDcmVhdGUgTkYgY29ubnRyYWNrIGV4cGVjdGF0aW9uIHdpdGggd2lsZGNhcmQgKG9wdGlvbmFsKSBzb3VyY2UgcG9ydC4KKyAqIFRoZW4gdGhlIGRlZmF1bHQgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBhbHRlciB0aGUgcmVwbHkgYW5kIHdpbGwgY29uZmlybQorICogdGhlIGNvbm50cmFjayBlbnRyeSB3aGVuIHRoZSBmaXJzdCBwYWNrZXQgY29tZXMuCisgKi8KK3N0YXRpYyB2b2lkCitpcF92c19leHBlY3RfcmVsYXRlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCB1X2ludDhfdCBwcm90bywKKwkJICAgICBjb25zdCBfX2JlMTYgKnBvcnQsIGludCBmcm9tX3JzKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisKKwlCVUdfT04oIWN0IHx8IGN0ID09ICZuZl9jb25udHJhY2tfdW50cmFja2VkKTsKKworCWV4cCA9IG5mX2N0X2V4cGVjdF9hbGxvYyhjdCk7CisJaWYgKCFleHApCisJCXJldHVybjsKKworCWlmIChmcm9tX3JzKQorCQluZl9jdF9leHBlY3RfaW5pdChleHAsIE5GX0NUX0VYUEVDVF9DTEFTU19ERUZBVUxULAorCQkJCSAgbmZfY3RfbDNudW0oY3QpLCAmY3AtPmRhZGRyLCAmY3AtPmNhZGRyLAorCQkJCSAgcHJvdG8sIHBvcnQsICZjcC0+Y3BvcnQpOworCWVsc2UKKwkJbmZfY3RfZXhwZWN0X2luaXQoZXhwLCBORl9DVF9FWFBFQ1RfQ0xBU1NfREVGQVVMVCwKKwkJCQkgIG5mX2N0X2wzbnVtKGN0KSwgJmNwLT5jYWRkciwgJmNwLT52YWRkciwKKwkJCQkgIHByb3RvLCBwb3J0LCAmY3AtPnZwb3J0KTsKKworCWV4cC0+ZXhwZWN0Zm4gPSBpcF92c19leHBlY3RfY2FsbGJhY2s7CisKKwlJUF9WU19EQkcoNywgIiVzKCk6IGN0PSVwLCBleHBlY3QgdHVwbGU9IiBGTVRfVFVQTEUgIlxuIiwKKwkJICBfX2Z1bmNfXywgY3QsIEFSR19UVVBMRSgmZXhwLT50dXBsZSkpOworCW5mX2N0X2V4cGVjdF9yZWxhdGVkKGV4cCk7CisJbmZfY3RfZXhwZWN0X3B1dChleHApOworfQogCiAvKgogICogTG9vayBhdCBvdXRnb2luZyBmdHAgcGFja2V0cyB0byBjYXRjaCB0aGUgcmVzcG9uc2UgdG8gYSBQQVNWIGNvbW1hbmQKQEAgLTE0OSw3ICsyODYsOSBAQAogCXN0cnVjdCBpcF92c19jb25uICpuX2NwOwogCWNoYXIgYnVmWzI0XTsJCS8qIHh4eC54eHgueHh4Lnh4eCxwcHAscHBwXDAwMCAqLwogCXVuc2lnbmVkIGJ1Zl9sZW47Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAKICNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgogCS8qIFRoaXMgYXBwbGljYXRpb24gaGVscGVyIGRvZXNuJ3Qgd29yayB3aXRoIElQdjYgeWV0LApAQCAtMjE5LDIwICszNTgsMjcgQEAKIAogCQlidWZfbGVuID0gc3RybGVuKGJ1Zik7CiAKLQkJLyoKLQkJICogQ2FsY3VsYXRlIHJlcXVpcmVkIGRlbHRhLW9mZnNldCB0byBrZWVwIFRDUCBoYXBweQotCQkgKi8KLQkJKmRpZmYgPSBidWZfbGVuIC0gKGVuZC1zdGFydCk7Ci0KLQkJaWYgKCpkaWZmID09IDApIHsKLQkJCS8qIHNpbXBseSByZXBsYWNlIGl0IHdpdGggbmV3IHBhc3NpdmUgYWRkcmVzcyAqLwotCQkJbWVtY3B5KHN0YXJ0LCBidWYsIGJ1Zl9sZW4pOwotCQkJcmV0ID0gMTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9ICFpcF92c19za2JfcmVwbGFjZShza2IsIEdGUF9BVE9NSUMsIHN0YXJ0LAotCQkJCQkgIGVuZC1zdGFydCwgYnVmLCBidWZfbGVuKTsKKwkJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKKwkJaWYgKGN0ICYmICFuZl9jdF9pc191bnRyYWNrZWQoY3QpKSB7CisJCQkvKiBJZiBtYW5nbGluZyBmYWlscyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAKKwkJCSAqIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHBhY2tldCB0byBiZSBkcm9wcGVkLgorCQkJICogTWFuZ2xpbmcgY2FuIG9ubHkgZmFpbCB1bmRlciBtZW1vcnkgcHJlc3N1cmUsCisJCQkgKiBob3BlZnVsbHkgaXQgd2lsbCBzdWNjZWVkIG9uIHRoZSByZXRyYW5zbWl0dGVkCisJCQkgKiBwYWNrZXQuCisJCQkgKi8KKwkJCXJldCA9IG5mX25hdF9tYW5nbGVfdGNwX3BhY2tldChza2IsIGN0LCBjdGluZm8sCisJCQkJCQkgICAgICAgc3RhcnQtZGF0YSwgZW5kLXN0YXJ0LAorCQkJCQkJICAgICAgIGJ1ZiwgYnVmX2xlbik7CisJCQlpZiAocmV0KQorCQkJCWlwX3ZzX2V4cGVjdF9yZWxhdGVkKHNrYiwgY3QsIG5fY3AsCisJCQkJCQkgICAgIElQUFJPVE9fVENQLCBOVUxMLCAwKTsKIAkJfQogCisJCS8qCisJCSAqIE5vdCBzZXR0aW5nICdkaWZmJyBpcyBpbnRlbnRpb25hbCwgb3RoZXJ3aXNlIHRoZSBzZXF1ZW5jZQorCQkgKiB3b3VsZCBiZSBhZGp1c3RlZCB0d2ljZS4KKwkJICovCisKIAkJY3AtPmFwcF9kYXRhID0gTlVMTDsKIAkJaXBfdnNfdGNwX2Nvbm5fbGlzdGVuKG5fY3ApOwogCQlpcF92c19jb25uX3B1dChuX2NwKTsKQEAgLTI2Myw2ICs0MDksNyBAQAogCXVuaW9uIG5mX2luZXRfYWRkciB0bzsKIAlfX2JlMTYgcG9ydDsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqbl9jcDsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAKICNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgogCS8qIFRoaXMgYXBwbGljYXRpb24gaGVscGVyIGRvZXNuJ3Qgd29yayB3aXRoIElQdjYgeWV0LApAQCAtMzQ5LDYgKzQ5NiwxMSBAQAogCQlpcF92c19jb250cm9sX2FkZChuX2NwLCBjcCk7CiAJfQogCisJY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilza2ItPm5mY3Q7CisJaWYgKGN0ICYmIGN0ICE9ICZuZl9jb25udHJhY2tfdW50cmFja2VkKQorCQlpcF92c19leHBlY3RfcmVsYXRlZChza2IsIGN0LCBuX2NwLAorCQkJCSAgICAgSVBQUk9UT19UQ1AsICZuX2NwLT5kcG9ydCwgMSk7CisKIAkvKgogCSAqCU1vdmUgdHVubmVsIHRvIGxpc3RlbiBzdGF0ZQogCSAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjLmMKaW5kZXggOTRhNDUyMS4uOTMyM2Y4OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsYy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBDaGFuZ2VzOgogICogICAgIE1hcnRpbiBIYW1pbHRvbiAgICAgICAgIDogICAgZml4ZWQgdGhlIHRlcnJpYmxlIGxvY2tpbmcgYnVncwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2NrKHRibC0+bG9jaykgPT0+ICpsb2NrKCZ0YmwtPmxvY2spCi0gKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgOiAgICBmaXhlZCB0aGUgdW5pbml0aWxpemVkIHRibC0+bG9jayBidWcKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICA6ICAgIGZpeGVkIHRoZSB1bmluaXRpYWxpemVkIHRibC0+bG9jayBidWcKICAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICA6ICAgIGFkZGVkIGRvaW5nIGZ1bGwgZXhwaXJhdGlvbiBjaGVjayB0bwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Qgc3RhbGUgZW50cmllcyBvZiAyNCsgaG91cnMgd2hlbgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHBhcnRpYWwgZXhwaXJlIGNoZWNrIGluIGEgaGFsZiBob3VyCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCmluZGV4IDUzNWRjMmIuLmRiZWVkOGUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCkBAIC0zODYsNyArMzg2LDcgQEAKIAkJaXBfdnNfYWRkcl9jb3B5KGRlc3QtPmFmLCAmZW4tPmFkZHIsIGRhZGRyKTsKIAkJZW4tPmxhc3R1c2UgPSBqaWZmaWVzOwogCi0JCS8qIGluaXRpbGl6ZSBpdHMgZGVzdCBzZXQgKi8KKwkJLyogaW5pdGlhbGl6ZSBpdHMgZGVzdCBzZXQgKi8KIAkJYXRvbWljX3NldCgmKGVuLT5zZXQuc2l6ZSksIDApOwogCQlJTklUX0xJU1RfSEVBRCgmZW4tPnNldC5saXN0KTsKIAkJcndsb2NrX2luaXQoJmVuLT5zZXQubG9jayk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCmluZGV4IDJkM2Q1ZTQuLjAyN2Y2NTQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCkBAIC05OCw2ICs5OCw3IEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woaXBfdnNfcHJvdG9fZ2V0KTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3NjdHAuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b19zY3RwLmMKaW5kZXggYzlhM2Y3YS4uNGMwODU1YyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fc2N0cC5jCkBAIC04LDU1ICs4LDYgQEAKICNpbmNsdWRlIDxuZXQvc2N0cC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcF92cy5oPgogCi0KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCi1zY3RwX2Nvbm5faW5fZ2V0KGludCBhZiwKLQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgY29uc3Qgc3RydWN0IGlwX3ZzX2lwaGRyICppcGgsCi0JCSB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAotCQkgaW50IGludmVyc2UpCi17Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSAKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5faW5fZ2V0KGFmLCBpcGgtPnByb3RvY29sLAotCQkJCQkgJmlwaC0+c2FkZHIsIHBwdHJbMF0sCi0JCQkJCSAmaXBoLT5kYWRkciwgcHB0clsxXSk7Ci0JZWxzZSAKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5faW5fZ2V0KGFmLCBpcGgtPnByb3RvY29sLAotCQkJCQkgJmlwaC0+ZGFkZHIsIHBwdHJbMV0sCi0JCQkJCSAmaXBoLT5zYWRkciwgcHB0clswXSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCi1zY3RwX2Nvbm5fb3V0X2dldChpbnQgYWYsCi0JCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgIGNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLAotCQkgIHVuc2lnbmVkIGludCBwcm90b19vZmYsCi0JCSAgaW50IGludmVyc2UpCi17Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSAKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKLQkJCQkJICAmaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCQkJICAmaXBoLT5kYWRkciwgcHB0clsxXSk7Ci0JZWxzZSAKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKLQkJCQkJICAmaXBoLT5kYWRkciwgcHB0clsxXSwKLQkJCQkJICAmaXBoLT5zYWRkciwgcHB0clswXSk7Ci19Ci0KIHN0YXRpYyBpbnQKIHNjdHBfY29ubl9zY2hlZHVsZShpbnQgYWYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCiAJCSAgIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCkBAIC0xNzMsNyArMTI0LDcgQEAKIAkJCXJldHVybiAwOwogCiAJCS8qIENhbGwgYXBwbGljYXRpb24gaGVscGVyIGlmIG5lZWRlZCAqLwotCQlpZiAoIWlwX3ZzX2FwcF9wa3Rfb3V0KGNwLCBza2IpKQorCQlpZiAoIWlwX3ZzX2FwcF9wa3RfaW4oY3AsIHNrYikpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTExNjksOCArMTEyMCw4IEBACiAJLnJlZ2lzdGVyX2FwcCA9IHNjdHBfcmVnaXN0ZXJfYXBwLAogCS51bnJlZ2lzdGVyX2FwcCA9IHNjdHBfdW5yZWdpc3Rlcl9hcHAsCiAJLmNvbm5fc2NoZWR1bGUgPSBzY3RwX2Nvbm5fc2NoZWR1bGUsCi0JLmNvbm5faW5fZ2V0ID0gc2N0cF9jb25uX2luX2dldCwKLQkuY29ubl9vdXRfZ2V0ID0gc2N0cF9jb25uX291dF9nZXQsCisJLmNvbm5faW5fZ2V0ID0gaXBfdnNfY29ubl9pbl9nZXRfcHJvdG8sCisJLmNvbm5fb3V0X2dldCA9IGlwX3ZzX2Nvbm5fb3V0X2dldF9wcm90bywKIAkuc25hdF9oYW5kbGVyID0gc2N0cF9zbmF0X2hhbmRsZXIsCiAJLmRuYXRfaGFuZGxlciA9IHNjdHBfZG5hdF9oYW5kbGVyLAogCS5jc3VtX2NoZWNrID0gc2N0cF9jc3VtX2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCmluZGV4IDkxZDI4ZTAuLjI4MmQyNGQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKQEAgLTI3LDUyICsyNyw2IEBACiAKICNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KIAotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgotdGNwX2Nvbm5faW5fZ2V0KGludCBhZiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKLQkJY29uc3Qgc3RydWN0IGlwX3ZzX2lwaGRyICppcGgsIHVuc2lnbmVkIGludCBwcm90b19vZmYsCi0JCWludCBpbnZlcnNlKQotewotCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOwotCi0JcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvX29mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7Ci0JaWYgKHBwdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAobGlrZWx5KCFpbnZlcnNlKSkgewotCQlyZXR1cm4gaXBfdnNfY29ubl9pbl9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCi0JCQkJCSAmaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCQkJICZpcGgtPmRhZGRyLCBwcHRyWzFdKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gaXBfdnNfY29ubl9pbl9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCi0JCQkJCSAmaXBoLT5kYWRkciwgcHB0clsxXSwKLQkJCQkJICZpcGgtPnNhZGRyLCBwcHRyWzBdKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCi10Y3BfY29ubl9vdXRfZ2V0KGludCBhZiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKLQkJIGNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAotCQkgaW50IGludmVyc2UpCi17Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSB7Ci0JCXJldHVybiBpcF92c19jb25uX291dF9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCi0JCQkJCSAgJmlwaC0+c2FkZHIsIHBwdHJbMF0sCi0JCQkJCSAgJmlwaC0+ZGFkZHIsIHBwdHJbMV0pOwotCX0gZWxzZSB7Ci0JCXJldHVybiBpcF92c19jb25uX291dF9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCi0JCQkJCSAgJmlwaC0+ZGFkZHIsIHBwdHJbMV0sCi0JCQkJCSAgJmlwaC0+c2FkZHIsIHBwdHJbMF0pOwotCX0KLX0KLQotCiBzdGF0aWMgaW50CiB0Y3BfY29ubl9zY2hlZHVsZShpbnQgYWYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCiAJCSAgaW50ICp2ZXJkaWN0LCBzdHJ1Y3QgaXBfdnNfY29ubiAqKmNwcCkKQEAgLTcyMSw4ICs2NzUsOCBAQAogCS5yZWdpc3Rlcl9hcHAgPQkJdGNwX3JlZ2lzdGVyX2FwcCwKIAkudW5yZWdpc3Rlcl9hcHAgPQl0Y3BfdW5yZWdpc3Rlcl9hcHAsCiAJLmNvbm5fc2NoZWR1bGUgPQl0Y3BfY29ubl9zY2hlZHVsZSwKLQkuY29ubl9pbl9nZXQgPQkJdGNwX2Nvbm5faW5fZ2V0LAotCS5jb25uX291dF9nZXQgPQkJdGNwX2Nvbm5fb3V0X2dldCwKKwkuY29ubl9pbl9nZXQgPQkJaXBfdnNfY29ubl9pbl9nZXRfcHJvdG8sCisJLmNvbm5fb3V0X2dldCA9CQlpcF92c19jb25uX291dF9nZXRfcHJvdG8sCiAJLnNuYXRfaGFuZGxlciA9CQl0Y3Bfc25hdF9oYW5kbGVyLAogCS5kbmF0X2hhbmRsZXIgPQkJdGNwX2RuYXRfaGFuZGxlciwKIAkuY3N1bV9jaGVjayA9CQl0Y3BfY3N1bV9jaGVjaywKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b191ZHAuYwppbmRleCBlN2E2ODg1Li44NTUzMjMxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCkBAIC0yNyw1OCArMjcsNiBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KIAotc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKLXVkcF9jb25uX2luX2dldChpbnQgYWYsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCWNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAotCQlpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSB7Ci0JCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCi0JCQkJICAgICAgICZpcGgtPnNhZGRyLCBwcHRyWzBdLAotCQkJCSAgICAgICAmaXBoLT5kYWRkciwgcHB0clsxXSk7Ci0JfSBlbHNlIHsKLQkJY3AgPSBpcF92c19jb25uX2luX2dldChhZiwgaXBoLT5wcm90b2NvbCwKLQkJCQkgICAgICAgJmlwaC0+ZGFkZHIsIHBwdHJbMV0sCi0JCQkJICAgICAgICZpcGgtPnNhZGRyLCBwcHRyWzBdKTsKLQl9Ci0KLQlyZXR1cm4gY3A7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKLXVkcF9jb25uX291dF9nZXQoaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgY29uc3Qgc3RydWN0IGlwX3ZzX2lwaGRyICppcGgsIHVuc2lnbmVkIGludCBwcm90b19vZmYsCi0JCSBpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSB7Ci0JCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGFmLCBpcGgtPnByb3RvY29sLAotCQkJCQkmaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCQkJJmlwaC0+ZGFkZHIsIHBwdHJbMV0pOwotCX0gZWxzZSB7Ci0JCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGFmLCBpcGgtPnByb3RvY29sLAotCQkJCQkmaXBoLT5kYWRkciwgcHB0clsxXSwKLQkJCQkJJmlwaC0+c2FkZHIsIHBwdHJbMF0pOwotCX0KLQotCXJldHVybiBjcDsKLX0KLQotCiBzdGF0aWMgaW50CiB1ZHBfY29ubl9zY2hlZHVsZShpbnQgYWYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCiAJCSAgaW50ICp2ZXJkaWN0LCBzdHJ1Y3QgaXBfdnNfY29ubiAqKmNwcCkKQEAgLTUyMCw4ICs0NjgsOCBAQAogCS5pbml0ID0JCQl1ZHBfaW5pdCwKIAkuZXhpdCA9CQkJdWRwX2V4aXQsCiAJLmNvbm5fc2NoZWR1bGUgPQl1ZHBfY29ubl9zY2hlZHVsZSwKLQkuY29ubl9pbl9nZXQgPQkJdWRwX2Nvbm5faW5fZ2V0LAotCS5jb25uX291dF9nZXQgPQkJdWRwX2Nvbm5fb3V0X2dldCwKKwkuY29ubl9pbl9nZXQgPQkJaXBfdnNfY29ubl9pbl9nZXRfcHJvdG8sCisJLmNvbm5fb3V0X2dldCA9CQlpcF92c19jb25uX291dF9nZXRfcHJvdG8sCiAJLnNuYXRfaGFuZGxlciA9CQl1ZHBfc25hdF9oYW5kbGVyLAogCS5kbmF0X2hhbmRsZXIgPQkJdWRwX2RuYXRfaGFuZGxlciwKIAkuY3N1bV9jaGVjayA9CQl1ZHBfY3N1bV9jaGVjaywKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCmluZGV4IDkzYzE1YTEuLjIxZTFhNWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAKICNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KQEAgLTkwLDEwICs5MSwxMCBAQAogCQkJCQkgICAgICZkZXN0LT5hZGRyLmlwKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KLQkJCV9faXBfdnNfZHN0X3NldChkZXN0LCBydG9zLCBkc3RfY2xvbmUoJnJ0LT51LmRzdCkpOworCQkJX19pcF92c19kc3Rfc2V0KGRlc3QsIHJ0b3MsIGRzdF9jbG9uZSgmcnQtPmRzdCkpOwogCQkJSVBfVlNfREJHKDEwLCAibmV3IGRzdCAlcEk0LCByZWZjbnQ9JWQsIHJ0b3M9JVhcbiIsCiAJCQkJICAmZGVzdC0+YWRkci5pcCwKLQkJCQkgIGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpLCBydG9zKTsKKwkJCQkgIGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSwgcnRvcyk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmRlc3QtPmRzdF9sb2NrKTsKIAl9IGVsc2UgewpAQCAtMTQ4LDEwICsxNDksMTAgQEAKIAkJCQkJICAgICAmZGVzdC0+YWRkci5pbjYpOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQotCQkJX19pcF92c19kc3Rfc2V0KGRlc3QsIDAsIGRzdF9jbG9uZSgmcnQtPnUuZHN0KSk7CisJCQlfX2lwX3ZzX2RzdF9zZXQoZGVzdCwgMCwgZHN0X2Nsb25lKCZydC0+ZHN0KSk7CiAJCQlJUF9WU19EQkcoMTAsICJuZXcgZHN0ICVwSTYsIHJlZmNudD0lZFxuIiwKIAkJCQkgICZkZXN0LT5hZGRyLmluNiwKLQkJCQkgIGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpKTsKKwkJCQkgIGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmRlc3QtPmRzdF9sb2NrKTsKIAl9IGVsc2UgewpAQCAtMTk4LDcgKzE5OSw3IEBACiAJKHNrYiktPmlwdnNfcHJvcGVydHkgPSAxOwkJCVwKIAlza2JfZm9yd2FyZF9jc3VtKHNrYik7CQkJCVwKIAlORl9IT09LKHBmLCBORl9JTkVUX0xPQ0FMX09VVCwgKHNrYiksIE5VTEwsCVwKLQkJKHJ0KS0+dS5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsJCVwKKwkJKHJ0KS0+ZHN0LmRldiwgZHN0X291dHB1dCk7CQlcCiB9IHdoaWxlICgwKQogCiAKQEAgLTI0NSw3ICsyNDYsNyBAQAogCX0KIAogCS8qIE1UVSBjaGVja2luZyAqLwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJbXR1ID0gZHN0X210dSgmcnQtPmRzdCk7CiAJaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKSB7CiAJCWlwX3J0X3B1dChydCk7CiAJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwpAQCAtMjY1LDcgKzI2Niw3IEBACiAKIAkvKiBkcm9wIG9sZCByb3V0ZSAqLwogCXNrYl9kc3RfZHJvcChza2IpOwotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwogCXNrYi0+bG9jYWxfZGYgPSAxOwpAQCAtMzA5LDkgKzMxMCw5IEBACiAJfQogCiAJLyogTVRVIGNoZWNraW5nICovCi0JbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKKwltdHUgPSBkc3RfbXR1KCZydC0+ZHN0KTsKIAlpZiAoc2tiLT5sZW4gPiBtdHUpIHsKLQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgbXR1KTsKIAkJSVBfVlNfREJHX1JMKCIlcygpOiBmcmFnIG5lZWRlZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIHR4X2Vycm9yOwpAQCAtMzIzLDEzICszMjQsMTMgQEAKIAkgKi8KIAlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKSB7Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCXJldHVybiBORl9TVE9MRU47CiAJfQogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KIAlza2ItPmxvY2FsX2RmID0gMTsKQEAgLTM0OCw2ICszNDksMzAgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZAoraXBfdnNfdXBkYXRlX2Nvbm50cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopc2tiLT5uZmN0OworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgbmV3X3R1cGxlOworCisJaWYgKGN0ID09IE5VTEwgfHwgbmZfY3RfaXNfdW50cmFja2VkKGN0KSB8fCBuZl9jdF9pc19jb25maXJtZWQoY3QpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSBjb25uZWN0aW9uIGlzIG5vdCB5ZXQgaW4gdGhlIGhhc2h0YWJsZSwgc28gd2UgdXBkYXRlIGl0LgorCSAqIENJUC0+VklQIHdpbGwgcmVtYWluIHRoZSBzYW1lLCBzbyBsZWF2ZSB0aGUgdHVwbGUgaW4KKwkgKiBJUF9DVF9ESVJfT1JJR0lOQUwgdW50b3VjaGVkLiAgV2hlbiB0aGUgcmVwbHkgY29tZXMgYmFjayBmcm9tIHRoZQorCSAqIHJlYWwtc2VydmVyIHdlIHdpbGwgc2VlIFJJUC0+RElQLgorCSAqLworCW5ld190dXBsZSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKKwluZXdfdHVwbGUuc3JjLnUzID0gY3AtPmRhZGRyOworCS8qCisJICogVGhpcyB3aWxsIGFsc28gdGFrZSBjYXJlIG9mIFVEUCBhbmQgb3RoZXIgcHJvdG9jb2xzLgorCSAqLworCW5ld190dXBsZS5zcmMudS50Y3AucG9ydCA9IGNwLT5kcG9ydDsKKwluZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkoY3QsICZuZXdfdHVwbGUpOworfQorCiAvKgogICogICAgICBOQVQgdHJhbnNtaXR0ZXIgKG9ubHkgZm9yIG91dHNpZGUtdG8taW5zaWRlIG5hdCBmb3J3YXJkaW5nKQogICogICAgICBOb3QgdXNlZCBmb3IgcmVsYXRlZCBJQ01QCkBAIC0zNzYsNyArNDAxLDcgQEAKIAkJZ290byB0eF9lcnJvcl9pY21wOwogCiAJLyogTVRVIGNoZWNraW5nICovCi0JbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKKwltdHUgPSBkc3RfbXR1KCZydC0+ZHN0KTsKIAlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CkBAIC0zODgsMTIgKzQxMywxMiBAQAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCWdvdG8gdHhfZXJyb3JfcHV0OwogCi0JaWYgKHNrYl9jb3coc2tiLCBydC0+dS5kc3QuZGV2LT5oYXJkX2hlYWRlcl9sZW4pKQorCWlmIChza2JfY293KHNrYiwgcnQtPmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCiAJCWdvdG8gdHhfZXJyb3JfcHV0OwogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyogbWFuZ2xlIHRoZSBwYWNrZXQgKi8KIAlpZiAocHAtPmRuYXRfaGFuZGxlciAmJiAhcHAtPmRuYXRfaGFuZGxlcihza2IsIHBwLCBjcCkpCkBAIC00MDMsNiArNDI4LDggQEAKIAogCUlQX1ZTX0RCR19QS1QoMTAsIHBwLCBza2IsIDAsICJBZnRlciBETkFUIik7CiAKKwlpcF92c191cGRhdGVfY29ubnRyYWNrKHNrYiwgY3ApOworCiAJLyogRklYTUU6IHdoZW4gYXBwbGljYXRpb24gaGVscGVyIGVubGFyZ2VzIHRoZSBwYWNrZXQgYW5kIHRoZSBsZW5ndGgKIAkgICBpcyBsYXJnZXIgdGhhbiB0aGUgTVRVIG9mIG91dGdvaW5nIGRldmljZSwgdGhlcmUgd2lsbCBiZSBzdGlsbAogCSAgIE1UVSBwcm9ibGVtLiAqLwpAQCAtNDUyLDkgKzQ3OSw5IEBACiAJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAogCS8qIE1UVSBjaGVja2luZyAqLwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJbXR1ID0gZHN0X210dSgmcnQtPmRzdCk7CiAJaWYgKHNrYi0+bGVuID4gbXR1KSB7Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSk7CiAJCUlQX1ZTX0RCR19STF9QS1QoMCwgcHAsIHNrYiwgMCwKIAkJCQkgImlwX3ZzX25hdF94bWl0X3Y2KCk6IGZyYWcgbmVlZGVkIGZvciIpOwpAQCAtNDY1LDEyICs0OTIsMTIgQEAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCiAJCWdvdG8gdHhfZXJyb3JfcHV0OwogCi0JaWYgKHNrYl9jb3coc2tiLCBydC0+dS5kc3QuZGV2LT5oYXJkX2hlYWRlcl9sZW4pKQorCWlmIChza2JfY293KHNrYiwgcnQtPmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCiAJCWdvdG8gdHhfZXJyb3JfcHV0OwogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyogbWFuZ2xlIHRoZSBwYWNrZXQgKi8KIAlpZiAocHAtPmRuYXRfaGFuZGxlciAmJiAhcHAtPmRuYXRfaGFuZGxlcihza2IsIHBwLCBjcCkpCkBAIC00NzksNiArNTA2LDggQEAKIAogCUlQX1ZTX0RCR19QS1QoMTAsIHBwLCBza2IsIDAsICJBZnRlciBETkFUIik7CiAKKwlpcF92c191cGRhdGVfY29ubnRyYWNrKHNrYiwgY3ApOworCiAJLyogRklYTUU6IHdoZW4gYXBwbGljYXRpb24gaGVscGVyIGVubGFyZ2VzIHRoZSBwYWNrZXQgYW5kIHRoZSBsZW5ndGgKIAkgICBpcyBsYXJnZXIgdGhhbiB0aGUgTVRVIG9mIG91dGdvaW5nIGRldmljZSwgdGhlcmUgd2lsbCBiZSBzdGlsbAogCSAgIE1UVSBwcm9ibGVtLiAqLwpAQCAtNDk4LDcgKzUyNyw3IEBACiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIE5GX1NUT0xFTjsKIHR4X2Vycm9yX3B1dDoKLQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJZ290byB0eF9lcnJvcjsKIH0KICNlbmRpZgpAQCAtNTQ5LDkgKzU3OCw5IEBACiAJaWYgKCEocnQgPSBfX2lwX3ZzX2dldF9vdXRfcnQoY3AsIFJUX1RPUyh0b3MpKSkpCiAJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAotCXRkZXYgPSBydC0+dS5kc3QuZGV2OworCXRkZXYgPSBydC0+ZHN0LmRldjsKIAotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCkgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwltdHUgPSBkc3RfbXR1KCZydC0+ZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOwogCWlmIChtdHUgPCA2OCkgewogCQlpcF9ydF9wdXQocnQpOwogCQlJUF9WU19EQkdfUkwoIiVzKCk6IG10dSBsZXNzIHRoYW4gNjhcbiIsIF9fZnVuY19fKTsKQEAgLTYwMSw3ICs2MzAsNyBAQAogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyoKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgpAQCAtNjE1LDcgKzY0NCw3IEBACiAJaXBoLT5kYWRkcgkJPQlydC0+cnRfZHN0OwogCWlwaC0+c2FkZHIJCT0JcnQtPnJ0X3NyYzsKIAlpcGgtPnR0bAkJPQlvbGRfaXBoLT50dGw7Ci0JaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgTlVMTCk7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT5kc3QsIE5VTEwpOwogCiAJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KIAlza2ItPmxvY2FsX2RmID0gMTsKQEAgLTY2MCwxMiArNjg5LDEyIEBACiAJaWYgKCFydCkKIAkJZ290byB0eF9lcnJvcl9pY21wOwogCi0JdGRldiA9IHJ0LT51LmRzdC5kZXY7CisJdGRldiA9IHJ0LT5kc3QuZGV2OwogCi0JbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJbXR1ID0gZHN0X210dSgmcnQtPmRzdCkgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCS8qIFRPRE8gSVB2NjogZG8gd2UgbmVlZCB0aGlzIGNoZWNrIGluIElQdjY/ICovCiAJaWYgKG10dSA8IDEyODApIHsKLQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJSVBfVlNfREJHX1JMKCIlcygpOiBtdHUgbGVzcyB0aGFuIDEyODBcbiIsIF9fZnVuY19fKTsKIAkJZ290byB0eF9lcnJvcjsKIAl9CkBAIC02NzQsNyArNzAzLDcgQEAKIAogCWlmIChtdHUgPCBudG9ocyhvbGRfaXBoLT5wYXlsb2FkX2xlbikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSB7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSk7Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCUlQX1ZTX0RCR19STCgiJXMoKTogZnJhZyBuZWVkZWRcbiIsIF9fZnVuY19fKTsKIAkJZ290byB0eF9lcnJvcjsKIAl9CkBAIC02ODksNyArNzE4LDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPQogCQkJc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBtYXhfaGVhZHJvb20pOwogCQlpZiAoIW5ld19za2IpIHsKLQkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlJUF9WU19FUlJfUkwoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIE5GX1NUT0xFTjsKQEAgLTcwNyw3ICs3MzYsNyBAQAogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyoKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgpAQCAtNzYwLDcgKzc4OSw3IEBACiAJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAogCS8qIE1UVSBjaGVja2luZyAqLwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJbXR1ID0gZHN0X210dSgmcnQtPmRzdCk7CiAJaWYgKChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSAmJiBza2ItPmxlbiA+IG10dSkgewogCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKIAkJaXBfcnRfcHV0KHJ0KTsKQEAgLTc4MCw3ICs4MDksNyBAQAogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsICZydC0+dS5kc3QpOworCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KIAlza2ItPmxvY2FsX2RmID0gMTsKQEAgLTgxMywxMCArODQyLDEwIEBACiAJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAogCS8qIE1UVSBjaGVja2luZyAqLwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJbXR1ID0gZHN0X210dSgmcnQtPmRzdCk7CiAJaWYgKHNrYi0+bGVuID4gbXR1KSB7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSk7Ci0JCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCUlQX1ZTX0RCR19STCgiJXMoKTogZnJhZyBuZWVkZWRcbiIsIF9fZnVuY19fKTsKIAkJZ290byB0eF9lcnJvcjsKIAl9CkBAIC04MjcsMTMgKzg1NiwxMyBAQAogCSAqLwogCXNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpOwogCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKLQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJcmV0dXJuIE5GX1NUT0xFTjsKIAl9CiAKIAkvKiBkcm9wIG9sZCByb3V0ZSAqLwogCXNrYl9kc3RfZHJvcChza2IpOwotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwogCXNrYi0+bG9jYWxfZGYgPSAxOwpAQCAtODg4LDcgKzkxNyw3IEBACiAJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAogCS8qIE1UVSBjaGVja2luZyAqLwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJbXR1ID0gZHN0X210dSgmcnQtPmRzdCk7CiAJaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwpAQCAtOTAwLDEyICs5MjksMTIgQEAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgb2Zmc2V0KSkKIAkJZ290byB0eF9lcnJvcl9wdXQ7CiAKLQlpZiAoc2tiX2Nvdyhza2IsIHJ0LT51LmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJaWYgKHNrYl9jb3coc2tiLCBydC0+ZHN0LmRldi0+aGFyZF9oZWFkZXJfbGVuKSkKIAkJZ290byB0eF9lcnJvcl9wdXQ7CiAKIAkvKiBkcm9wIHRoZSBvbGQgcm91dGUgd2hlbiBza2IgaXMgbm90IHNoYXJlZCAqLwogCXNrYl9kc3RfZHJvcChza2IpOwotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAlpcF92c19uYXRfaWNtcChza2IsIHBwLCBjcCwgMCk7CiAKQEAgLTk2Myw5ICs5OTIsOSBAQAogCQlnb3RvIHR4X2Vycm9yX2ljbXA7CiAKIAkvKiBNVFUgY2hlY2tpbmcgKi8KLQltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOworCW10dSA9IGRzdF9tdHUoJnJ0LT5kc3QpOwogCWlmIChza2ItPmxlbiA+IG10dSkgewotCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUpOwogCQlJUF9WU19EQkdfUkwoIiVzKCk6IGZyYWcgbmVlZGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdHhfZXJyb3I7CkBAIC05NzUsMTIgKzEwMDQsMTIgQEAKIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgb2Zmc2V0KSkKIAkJZ290byB0eF9lcnJvcl9wdXQ7CiAKLQlpZiAoc2tiX2Nvdyhza2IsIHJ0LT51LmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJaWYgKHNrYl9jb3coc2tiLCBydC0+ZHN0LmRldi0+aGFyZF9oZWFkZXJfbGVuKSkKIAkJZ290byB0eF9lcnJvcl9wdXQ7CiAKIAkvKiBkcm9wIHRoZSBvbGQgcm91dGUgd2hlbiBza2IgaXMgbm90IHNoYXJlZCAqLwogCXNrYl9kc3RfZHJvcChza2IpOwotCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT51LmRzdCk7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAlpcF92c19uYXRfaWNtcF92Nihza2IsIHBwLCBjcCwgMCk7CiAKQEAgLTEwMDEsNyArMTAzMCw3IEBACiAJTGVhdmVGdW5jdGlvbigxMCk7CiAJcmV0dXJuIHJjOwogdHhfZXJyb3JfcHV0OgotCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAlnb3RvIHR4X2Vycm9yOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMKaW5kZXggYWI4MWIzOC4uNTE3OGM2OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYwpAQCAtMTcsMTMgKzE3LDcgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0Lmg+CiAKLSNpZmRlZiBDT05GSUdfTkZfQ1RfQUNDVAotI2RlZmluZSBORl9DVF9BQ0NUX0RFRkFVTFQgMQotI2Vsc2UKLSNkZWZpbmUgTkZfQ1RfQUNDVF9ERUZBVUxUIDAKLSNlbmRpZgotCi1zdGF0aWMgaW50IG5mX2N0X2FjY3QgX19yZWFkX21vc3RseSA9IE5GX0NUX0FDQ1RfREVGQVVMVDsKK3N0YXRpYyBpbnQgbmZfY3RfYWNjdCBfX3JlYWRfbW9zdGx5OwogCiBtb2R1bGVfcGFyYW1fbmFtZWQoYWNjdCwgbmZfY3RfYWNjdCwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFjY3QsICJFbmFibGUgY29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmcuIik7CkBAIC0xMTQsMTIgKzEwOCw2IEBACiAJbmV0LT5jdC5zeXNjdGxfYWNjdCA9IG5mX2N0X2FjY3Q7CiAKIAlpZiAobmV0X2VxKG5ldCwgJmluaXRfbmV0KSkgewotI2lmZGVmIENPTkZJR19ORl9DVF9BQ0NUCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiQ09ORklHX05GX0NUX0FDQ1QgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uIFBsZWFzZSB1c2VcbiIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZl9jb25udHJhY2suYWNjdD0xIGtlcm5lbCBwYXJhbWV0ZXIsIGFjY3Q9MSBuZl9jb25udHJhY2sgbW9kdWxlIG9wdGlvbiBvclxuIik7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInN5c2N0bCBuZXQubmV0ZmlsdGVyLm5mX2Nvbm50cmFja19hY2N0PTEgdG8gZW5hYmxlIGl0LlxuIik7Ci0jZW5kaWYKLQogCQlyZXQgPSBuZl9jdF9leHRlbmRfcmVnaXN0ZXIoJmFjY3RfZXh0ZW5kKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAibmZfY29ubnRyYWNrX2FjY3Q6IFVuYWJsZSB0byByZWdpc3RlciBleHRlbnNpb25cbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmluZGV4IGVlZWI4YmMuLmRmM2VlZGIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTYyLDggKzYyLDggQEAKIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfbWF4IF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbWF4KTsKIAotc3RydWN0IG5mX2Nvbm4gbmZfY29ubnRyYWNrX3VudHJhY2tlZCBfX3JlYWRfbW9zdGx5OwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3VudHJhY2tlZCk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbmZfY29ubiwgbmZfY29ubnRyYWNrX3VudHJhY2tlZCk7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0wobmZfY29ubnRyYWNrX3VudHJhY2tlZCk7CiAKIHN0YXRpYyBpbnQgbmZfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19oYXNoX3JuZDsKQEAgLTYxOSw5ICs2MTksNyBAQAogCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS5obm5vZGUucHByZXYgPSBOVUxMOwogCS8qIERvbid0IHNldCB0aW1lciB5ZXQ6IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiAqLwogCXNldHVwX3RpbWVyKCZjdC0+dGltZW91dCwgZGVhdGhfYnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpY3QpOwotI2lmZGVmIENPTkZJR19ORVRfTlMKLQljdC0+Y3RfbmV0ID0gbmV0OwotI2VuZGlmCisJd3JpdGVfcG5ldCgmY3QtPmN0X25ldCwgbmV0KTsKICNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1pPTkVTCiAJaWYgKHpvbmUpIHsKIAkJc3RydWN0IG5mX2Nvbm50cmFja196b25lICpuZl9jdF96b25lOwpAQCAtOTY4LDggKzk2Niw3IEBACiAJCWlmIChhY2N0KSB7CiAJCQlzcGluX2xvY2tfYmgoJmN0LT5sb2NrKTsKIAkJCWFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKys7Ci0JCQlhY2N0W0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMgKz0KLQkJCQlza2ItPmxlbiAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCQkJYWNjdFtDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICs9IHNrYi0+bGVuOwogCQkJc3Bpbl91bmxvY2tfYmgoJmN0LT5sb2NrKTsKIAkJfQogCX0KQEAgLTExODMsMTAgKzExODAsMjEgQEAKIAlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogfQogCitzdGF0aWMgaW50IHVudHJhY2tfcmVmcyh2b2lkKQoreworCWludCBjbnQgPSAwLCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBuZl9jb25uICpjdCA9ICZwZXJfY3B1KG5mX2Nvbm50cmFja191bnRyYWNrZWQsIGNwdSk7CisKKwkJY250ICs9IGF0b21pY19yZWFkKCZjdC0+Y3RfZ2VuZXJhbC51c2UpIC0gMTsKKwl9CisJcmV0dXJuIGNudDsKK30KKwogc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX2NsZWFudXBfaW5pdF9uZXQodm9pZCkKIHsKLQkvKiB3YWl0IHVudGlsIGFsbCByZWZlcmVuY2VzIHRvIG5mX2Nvbm50cmFja191bnRyYWNrZWQgYXJlIGRyb3BwZWQgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJm5mX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbC51c2UpID4gMSkKKwl3aGlsZSAodW50cmFja19yZWZzKCkgPiAwKQogCQlzY2hlZHVsZSgpOwogCiAJbmZfY29ubnRyYWNrX2hlbHBlcl9maW5pKCk7CkBAIC0xMzIxLDEwICsxMzI5LDE5IEBACiBtb2R1bGVfcGFyYW1fY2FsbChoYXNoc2l6ZSwgbmZfY29ubnRyYWNrX3NldF9oYXNoc2l6ZSwgcGFyYW1fZ2V0X3VpbnQsCiAJCSAgJm5mX2Nvbm50cmFja19odGFibGVfc2l6ZSwgMDYwMCk7CiAKK3ZvaWQgbmZfY3RfdW50cmFja2VkX3N0YXR1c19vcih1bnNpZ25lZCBsb25nIGJpdHMpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXBlcl9jcHUobmZfY29ubnRyYWNrX3VudHJhY2tlZCwgY3B1KS5zdGF0dXMgfD0gYml0czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X3VudHJhY2tlZF9zdGF0dXNfb3IpOworCiBzdGF0aWMgaW50IG5mX2Nvbm50cmFja19pbml0X2luaXRfbmV0KHZvaWQpCiB7CiAJaW50IG1heF9mYWN0b3IgPSA4OwotCWludCByZXQ7CisJaW50IHJldCwgY3B1OwogCiAJLyogSWRlYSBmcm9tIHRjcC5jOiB1c2UgMS8xNjM4NCBvZiBtZW1vcnkuICBPbiBpMzg2OiAzMk1CCiAJICogbWFjaGluZSBoYXMgNTEyIGJ1Y2tldHMuID49IDFHQiBtYWNoaW5lcyBoYXZlIDE2Mzg0IGJ1Y2tldHMuICovCkBAIC0xMzYzLDEzICsxMzgwLDEzIEBACiAJCWdvdG8gZXJyX2V4dGVuZDsKICNlbmRpZgogCS8qIFNldCB1cCBmYWtlIGNvbm50cmFjazogdG8gbmV2ZXIgYmUgZGVsZXRlZCwgbm90IGluIGFueSBoYXNoZXMgKi8KLSNpZmRlZiBDT05GSUdfTkVUX05TCi0JbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9uZXQgPSAmaW5pdF9uZXQ7Ci0jZW5kaWYKLQlhdG9taWNfc2V0KCZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWwudXNlLCAxKTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBuZl9jb25uICpjdCA9ICZwZXJfY3B1KG5mX2Nvbm50cmFja191bnRyYWNrZWQsIGNwdSk7CisJCXdyaXRlX3BuZXQoJmN0LT5jdF9uZXQsICZpbml0X25ldCk7CisJCWF0b21pY19zZXQoJmN0LT5jdF9nZW5lcmFsLnVzZSwgMSk7CisJfQogCS8qICAtIGFuZCBsb29rIGl0IGxpa2UgYXMgYSBjb25maXJtZWQgY29ubmVjdGlvbiAqLwotCXNldF9iaXQoSVBTX0NPTkZJUk1FRF9CSVQsICZuZl9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyk7Ci0KKwluZl9jdF91bnRyYWNrZWRfc3RhdHVzX29yKElQU19DT05GSVJNRUQgfCBJUFNfVU5UUkFDS0VEKTsKIAlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfWk9ORVMKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMKaW5kZXggZmRjOGZiNC4uN2RjZjdhNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMKQEAgLTIzLDkgKzIzLDEwIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IG5mX2N0X2V4dF90eXBlICp0OworCXN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LT5leHQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTkZfQ1RfRVhUX05VTTsgaSsrKSB7Ci0JCWlmICghbmZfY3RfZXh0X2V4aXN0KGN0LCBpKSkKKwkJaWYgKCFfX25mX2N0X2V4dF9leGlzdChleHQsIGkpKQogCQkJY29udGludWU7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwpAQCAtNzMsNDQgKzc0LDQ1IEBACiAKIHZvaWQgKl9fbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApCiB7Ci0Jc3RydWN0IG5mX2N0X2V4dCAqbmV3OworCXN0cnVjdCBuZl9jdF9leHQgKm9sZCwgKm5ldzsKIAlpbnQgaSwgbmV3bGVuLCBuZXdvZmY7CiAJc3RydWN0IG5mX2N0X2V4dF90eXBlICp0OwogCiAJLyogQ29ubnRyYWNrIG11c3Qgbm90IGJlIGNvbmZpcm1lZCB0byBhdm9pZCByYWNlcyBvbiByZWFsbG9jYXRpb24uICovCiAJTkZfQ1RfQVNTRVJUKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKTsKIAotCWlmICghY3QtPmV4dCkKKwlvbGQgPSBjdC0+ZXh0OworCWlmICghb2xkKQogCQlyZXR1cm4gbmZfY3RfZXh0X2NyZWF0ZSgmY3QtPmV4dCwgaWQsIGdmcCk7CiAKLQlpZiAobmZfY3RfZXh0X2V4aXN0KGN0LCBpZCkpCisJaWYgKF9fbmZfY3RfZXh0X2V4aXN0KG9sZCwgaWQpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAl0ID0gcmN1X2RlcmVmZXJlbmNlKG5mX2N0X2V4dF90eXBlc1tpZF0pOwogCUJVR19PTih0ID09IE5VTEwpOwogCi0JbmV3b2ZmID0gQUxJR04oY3QtPmV4dC0+bGVuLCB0LT5hbGlnbik7CisJbmV3b2ZmID0gQUxJR04ob2xkLT5sZW4sIHQtPmFsaWduKTsKIAluZXdsZW4gPSBuZXdvZmYgKyB0LT5sZW47CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQluZXcgPSBfX2tyZWFsbG9jKGN0LT5leHQsIG5ld2xlbiwgZ2ZwKTsKKwluZXcgPSBfX2tyZWFsbG9jKG9sZCwgbmV3bGVuLCBnZnApOwogCWlmICghbmV3KQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChuZXcgIT0gY3QtPmV4dCkgeworCWlmIChuZXcgIT0gb2xkKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBORl9DVF9FWFRfTlVNOyBpKyspIHsKLQkJCWlmICghbmZfY3RfZXh0X2V4aXN0KGN0LCBpKSkKKwkJCWlmICghX19uZl9jdF9leHRfZXhpc3Qob2xkLCBpKSkKIAkJCQljb250aW51ZTsKIAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJdCA9IHJjdV9kZXJlZmVyZW5jZShuZl9jdF9leHRfdHlwZXNbaV0pOwogCQkJaWYgKHQgJiYgdC0+bW92ZSkKIAkJCQl0LT5tb3ZlKCh2b2lkICopbmV3ICsgbmV3LT5vZmZzZXRbaV0sCi0JCQkJCSh2b2lkICopY3QtPmV4dCArIGN0LT5leHQtPm9mZnNldFtpXSk7CisJCQkJCSh2b2lkICopb2xkICsgb2xkLT5vZmZzZXRbaV0pOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCX0KLQkJY2FsbF9yY3UoJmN0LT5leHQtPnJjdSwgX19uZl9jdF9leHRfZnJlZV9yY3UpOworCQljYWxsX3JjdSgmb2xkLT5yY3UsIF9fbmZfY3RfZXh0X2ZyZWVfcmN1KTsKIAkJY3QtPmV4dCA9IG5ldzsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKaW5kZXggNmVhZWU3Yy4uYjk2OTAyNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTczNCwxMSArNzM0LDExIEBACiAJCWlmICghYWZpbmZvLT5yb3V0ZSgoc3RydWN0IGRzdF9lbnRyeSAqKikmcnQxLCAmZmwxKSkgewogCQkJaWYgKCFhZmluZm8tPnJvdXRlKChzdHJ1Y3QgZHN0X2VudHJ5ICoqKSZydDIsICZmbDIpKSB7CiAJCQkJaWYgKHJ0MS0+cnRfZ2F0ZXdheSA9PSBydDItPnJ0X2dhdGV3YXkgJiYKLQkJCQkgICAgcnQxLT51LmRzdC5kZXYgID09IHJ0Mi0+dS5kc3QuZGV2KQorCQkJCSAgICBydDEtPmRzdC5kZXYgID09IHJ0Mi0+ZHN0LmRldikKIAkJCQkJcmV0ID0gMTsKLQkJCQlkc3RfcmVsZWFzZSgmcnQyLT51LmRzdCk7CisJCQkJZHN0X3JlbGVhc2UoJnJ0Mi0+ZHN0KTsKIAkJCX0KLQkJCWRzdF9yZWxlYXNlKCZydDEtPnUuZHN0KTsKKwkJCWRzdF9yZWxlYXNlKCZydDEtPmRzdCk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtNzUzLDExICs3NTMsMTEgQEAKIAkJCWlmICghYWZpbmZvLT5yb3V0ZSgoc3RydWN0IGRzdF9lbnRyeSAqKikmcnQyLCAmZmwyKSkgewogCQkJCWlmICghbWVtY21wKCZydDEtPnJ0NmlfZ2F0ZXdheSwgJnJ0Mi0+cnQ2aV9nYXRld2F5LAogCQkJCQkgICAgc2l6ZW9mKHJ0MS0+cnQ2aV9nYXRld2F5KSkgJiYKLQkJCQkgICAgcnQxLT51LmRzdC5kZXYgPT0gcnQyLT51LmRzdC5kZXYpCisJCQkJICAgIHJ0MS0+ZHN0LmRldiA9PSBydDItPmRzdC5kZXYpCiAJCQkJCXJldCA9IDE7Ci0JCQkJZHN0X3JlbGVhc2UoJnJ0Mi0+dS5kc3QpOworCQkJCWRzdF9yZWxlYXNlKCZydDItPmRzdCk7CiAJCQl9Ci0JCQlkc3RfcmVsZWFzZSgmcnQxLT51LmRzdCk7CisJCQlkc3RfcmVsZWFzZSgmcnQxLT5kc3QpOwogCQl9CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGJpb3NfbnMuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGJpb3NfbnMuYwppbmRleCA0OTdiMjIyLi5hYWRkZTAxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRiaW9zX25zLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0Ymlvc19ucy5jCkBAIC02MSw3ICs2MSw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWluX2RldiA9IF9faW5fZGV2X2dldF9yY3UocnQtPnUuZHN0LmRldik7CisJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShydC0+ZHN0LmRldik7CiAJaWYgKGluX2RldiAhPSBOVUxMKSB7CiAJCWZvcl9wcmltYXJ5X2lmYShpbl9kZXYpIHsKIAkJCWlmIChpZmEtPmlmYV9icm9hZGNhc3QgPT0gaXBoLT5kYWRkcikgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCmluZGV4IGM0MmZmNmEuLjViYWUxY2QgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCWludCBlcnI7CiAKIAkvKiBpZ25vcmUgb3VyIGZha2UgY29ubnRyYWNrIGVudHJ5ICovCi0JaWYgKGN0ID09ICZuZl9jb25udHJhY2tfdW50cmFja2VkKQorCWlmIChuZl9jdF9pc191bnRyYWNrZWQoY3QpKQogCQlyZXR1cm4gMDsKIAogCWlmIChldmVudHMgJiAoMSA8PCBJUENUX0RFU1RST1kpKSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDlkZDhjZDQuLmM0Yzg4NWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC01ODUsOCArNTg1LDE2IEBACiAJCQkgKiBMZXQncyB0cnkgdG8gdXNlIHRoZSBkYXRhIGZyb20gdGhlIHBhY2tldC4KIAkJCSAqLwogCQkJc2VuZGVyLT50ZF9lbmQgPSBlbmQ7CisJCQl3aW4gPDw9IHNlbmRlci0+dGRfc2NhbGU7CiAJCQlzZW5kZXItPnRkX21heHdpbiA9ICh3aW4gPT0gMCA/IDEgOiB3aW4pOwogCQkJc2VuZGVyLT50ZF9tYXhlbmQgPSBlbmQgKyBzZW5kZXItPnRkX21heHdpbjsKKwkJCS8qCisJCQkgKiBXZSBoYXZlbid0IHNlZW4gdHJhZmZpYyBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHlldAorCQkJICogYnV0IHdlIGhhdmUgdG8gdHdlYWsgd2luZG93IHRyYWNraW5nIHRvIHBhc3MgSUlJCisJCQkgKiBhbmQgSVYgdW50aWwgdGhhdCBoYXBwZW5zLgorCQkJICovCisJCQlpZiAocmVjZWl2ZXItPnRkX21heHdpbiA9PSAwKQorCQkJCXJlY2VpdmVyLT50ZF9lbmQgPSByZWNlaXZlci0+dGRfbWF4ZW5kID0gc2FjazsKIAkJfQogCX0gZWxzZSBpZiAoKChzdGF0ZS0+c3RhdGUgPT0gVENQX0NPTk5UUkFDS19TWU5fU0VOVAogCQkgICAgICYmIGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCkBAIC02ODAsNyArNjg4LDcgQEAKIAkJLyoKIAkJICogVXBkYXRlIHJlY2VpdmVyIGRhdGEuCiAJCSAqLwotCQlpZiAoYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX21heGVuZCkpCisJCWlmIChyZWNlaXZlci0+dGRfbWF4d2luICE9IDAgJiYgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX21heGVuZCkpCiAJCQlyZWNlaXZlci0+dGRfbWF4d2luICs9IGVuZCAtIHNlbmRlci0+dGRfbWF4ZW5kOwogCQlpZiAoYWZ0ZXIoc2FjayArIHdpbiwgcmVjZWl2ZXItPnRkX21heGVuZCAtIDEpKSB7CiAJCQlyZWNlaXZlci0+dGRfbWF4ZW5kID0gc2FjayArIHdpbjsKQEAgLTczNiwyNyArNzQ0LDE5IEBACiAJcmV0dXJuIHJlczsKIH0KIAotI2RlZmluZQlUSF9GSU4JMHgwMQotI2RlZmluZQlUSF9TWU4JMHgwMgotI2RlZmluZQlUSF9SU1QJMHgwNAotI2RlZmluZQlUSF9QVVNICTB4MDgKLSNkZWZpbmUJVEhfQUNLCTB4MTAKLSNkZWZpbmUJVEhfVVJHCTB4MjAKLSNkZWZpbmUJVEhfRUNFCTB4NDAKLSNkZWZpbmUJVEhfQ1dSCTB4ODAKLQogLyogdGFibGUgb2YgdmFsaWQgZmxhZyBjb21iaW5hdGlvbnMgLSBQVVNILCBFQ0UgYW5kIENXUiBhcmUgYWx3YXlzIHZhbGlkICovCi1zdGF0aWMgY29uc3QgdTggdGNwX3ZhbGlkX2ZsYWdzWyhUSF9GSU58VEhfU1lOfFRIX1JTVHxUSF9BQ0t8VEhfVVJHKSArIDFdID0KK3N0YXRpYyBjb25zdCB1OCB0Y3BfdmFsaWRfZmxhZ3NbKFRDUEhEUl9GSU58VENQSERSX1NZTnxUQ1BIRFJfUlNUfFRDUEhEUl9BQ0t8CisJCQkJIFRDUEhEUl9VUkcpICsgMV0gPQogewotCVtUSF9TWU5dCQkJPSAxLAotCVtUSF9TWU58VEhfVVJHXQkJCT0gMSwKLQlbVEhfU1lOfFRIX0FDS10JCQk9IDEsCi0JW1RIX1JTVF0JCQk9IDEsCi0JW1RIX1JTVHxUSF9BQ0tdCQkJPSAxLAotCVtUSF9GSU58VEhfQUNLXQkJCT0gMSwKLQlbVEhfRklOfFRIX0FDS3xUSF9VUkddCQk9IDEsCi0JW1RIX0FDS10JCQk9IDEsCi0JW1RIX0FDS3xUSF9VUkddCQkJPSAxLAorCVtUQ1BIRFJfU1lOXQkJCQk9IDEsCisJW1RDUEhEUl9TWU58VENQSERSX1VSR10JCQk9IDEsCisJW1RDUEhEUl9TWU58VENQSERSX0FDS10JCQk9IDEsCisJW1RDUEhEUl9SU1RdCQkJCT0gMSwKKwlbVENQSERSX1JTVHxUQ1BIRFJfQUNLXQkJCT0gMSwKKwlbVENQSERSX0ZJTnxUQ1BIRFJfQUNLXQkJCT0gMSwKKwlbVENQSERSX0ZJTnxUQ1BIRFJfQUNLfFRDUEhEUl9VUkddCT0gMSwKKwlbVENQSERSX0FDS10JCQkJPSAxLAorCVtUQ1BIRFJfQUNLfFRDUEhEUl9VUkddCQkJPSAxLAogfTsKIAogLyogUHJvdGVjdCBjb25udHJhY2sgYWdhaXN0IGJyb2tlbiBwYWNrZXRzLiBDb2RlIHRha2VuIGZyb20gaXB0X3VuY2xlYW4uYy4gICovCkBAIC04MDMsNyArODAzLDcgQEAKIAl9CiAKIAkvKiBDaGVjayBUQ1AgZmxhZ3MuICovCi0JdGNwZmxhZ3MgPSAoKCh1X2ludDhfdCAqKXRoKVsxM10gJiB+KFRIX0VDRXxUSF9DV1J8VEhfUFVTSCkpOworCXRjcGZsYWdzID0gKHRjcF9mbGFnX2J5dGUodGgpICYgfihUQ1BIRFJfRUNFfFRDUEhEUl9DV1J8VENQSERSX1BTSCkpOwogCWlmICghdGNwX3ZhbGlkX2ZsYWdzW3RjcGZsYWdzXSkgewogCQlpZiAoTE9HX0lOVkFMSUQobmV0LCBJUFBST1RPX1RDUCkpCiAJCQluZl9sb2dfcGFja2V0KHBmLCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCmluZGV4IGZjOWEyMTEuLjZhMTU3MmIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCkBAIC02Niw5ICs2NiwxMCBAQAogCXVfaW50MTZfdCBncm91cF9udW07CQkvKiBudW1iZXIgb2YgdGhpcyBxdWV1ZSAqLwogCXVfaW50MTZfdCBmbGFnczsKIAl1X2ludDhfdCBjb3B5X21vZGU7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiAKLXN0YXRpYyBERUZJTkVfUldMT0NLKGluc3RhbmNlc19sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5zdGFuY2VzX2xvY2spOwogc3RhdGljIGF0b21pY190IGdsb2JhbF9zZXE7CiAKICNkZWZpbmUgSU5TVEFOQ0VfQlVDS0VUUwkxNgpAQCAtODgsNyArODksNyBAQAogCXN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKmluc3Q7CiAKIAloZWFkID0gJmluc3RhbmNlX3RhYmxlW2luc3RhbmNlX2hhc2hmbihncm91cF9udW0pXTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShpbnN0LCBwb3MsIGhlYWQsIGhsaXN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGluc3QsIHBvcywgaGVhZCwgaGxpc3QpIHsKIAkJaWYgKGluc3QtPmdyb3VwX251bSA9PSBncm91cF9udW0pCiAJCQlyZXR1cm4gaW5zdDsKIAl9CkBAIC0xMDYsMjIgKzEwNywyNiBAQAogewogCXN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKmluc3Q7CiAKLQlyZWFkX2xvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKKwlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJaW5zdCA9IF9faW5zdGFuY2VfbG9va3VwKGdyb3VwX251bSk7Ci0JaWYgKGluc3QpCi0JCWluc3RhbmNlX2dldChpbnN0KTsKLQlyZWFkX3VubG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOworCWlmIChpbnN0ICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZpbnN0LT51c2UpKQorCQlpbnN0ID0gTlVMTDsKKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIAogCXJldHVybiBpbnN0OwogfQogCitzdGF0aWMgdm9pZCBuZnVsbmxfaW5zdGFuY2VfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlLCByY3UpKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKwogc3RhdGljIHZvaWQKIGluc3RhbmNlX3B1dChzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0KQogewotCWlmIChpbnN0ICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJmluc3QtPnVzZSkpIHsKLQkJa2ZyZWUoaW5zdCk7Ci0JCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCX0KKwlpZiAoaW5zdCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZpbnN0LT51c2UpKQorCQljYWxsX3JjdV9iaCgmaW5zdC0+cmN1LCBuZnVsbmxfaW5zdGFuY2VfZnJlZV9yY3UpOwogfQogCiBzdGF0aWMgdm9pZCBuZnVsbmxfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKQEAgLTEzMiw3ICsxMzcsNyBAQAogCXN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKmluc3Q7CiAJaW50IGVycjsKIAotCXdyaXRlX2xvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKIAlpZiAoX19pbnN0YW5jZV9sb29rdXAoZ3JvdXBfbnVtKSkgewogCQllcnIgPSAtRUVYSVNUOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xNjYsMzIgKzE3MSwzNyBAQAogCWluc3QtPmNvcHlfbW9kZSAJPSBORlVMTkxfQ09QWV9QQUNLRVQ7CiAJaW5zdC0+Y29weV9yYW5nZSAJPSBORlVMTkxfQ09QWV9SQU5HRV9NQVg7CiAKLQlobGlzdF9hZGRfaGVhZCgmaW5zdC0+aGxpc3QsCisJaGxpc3RfYWRkX2hlYWRfcmN1KCZpbnN0LT5obGlzdCwKIAkJICAgICAgICZpbnN0YW5jZV90YWJsZVtpbnN0YW5jZV9oYXNoZm4oZ3JvdXBfbnVtKV0pOwogCi0Jd3JpdGVfdW5sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKIAogCXJldHVybiBpbnN0OwogCiBvdXRfdW5sb2NrOgotCXdyaXRlX3VubG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZnVsbmxfZmx1c2goc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCk7CiAKKy8qIGNhbGxlZCB3aXRoIEJIIGRpc2FibGVkICovCiBzdGF0aWMgdm9pZAogX19pbnN0YW5jZV9kZXN0cm95KHN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKmluc3QpCiB7CiAJLyogZmlyc3QgcHVsbCBpdCBvdXQgb2YgdGhlIGdsb2JhbCBsaXN0ICovCi0JaGxpc3RfZGVsKCZpbnN0LT5obGlzdCk7CisJaGxpc3RfZGVsX3JjdSgmaW5zdC0+aGxpc3QpOwogCiAJLyogdGhlbiBmbHVzaCBhbGwgcGVuZGluZyBwYWNrZXRzIGZyb20gc2tiICovCiAKLQlzcGluX2xvY2tfYmgoJmluc3QtPmxvY2spOworCXNwaW5fbG9jaygmaW5zdC0+bG9jayk7CisKKwkvKiBsb2NrbGVzcyByZWFkZXJzIHdvbnQgYmUgYWJsZSB0byB1c2UgdXMgKi8KKwlpbnN0LT5jb3B5X21vZGUgPSBORlVMTkxfQ09QWV9ESVNBQkxFRDsKKwogCWlmIChpbnN0LT5za2IpCiAJCV9fbmZ1bG5sX2ZsdXNoKGluc3QpOwotCXNwaW5fdW5sb2NrX2JoKCZpbnN0LT5sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdC0+bG9jayk7CiAKIAkvKiBhbmQgZmluYWxseSBwdXQgdGhlIHJlZmNvdW50ICovCiAJaW5zdGFuY2VfcHV0KGluc3QpOwpAQCAtMjAwLDkgKzIxMCw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGluc3RhbmNlX2Rlc3Ryb3koc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCkKIHsKLQl3cml0ZV9sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CiAJX19pbnN0YW5jZV9kZXN0cm95KGluc3QpOwotCXdyaXRlX3VubG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQwMyw4ICs0MTMsOSBAQAogCQkJTkxBX1BVVF9CRTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9QSFlTSU5ERVYsCiAJCQkJICAgICBodG9ubChpbmRldi0+aWZpbmRleCkpOwogCQkJLyogdGhpcyBpcyB0aGUgYnJpZGdlIGdyb3VwICJiclgiICovCisJCQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgb3IgbmZfbG9nX3BhY2tldCAqLwogCQkJTkxBX1BVVF9CRTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9JTkRFViwKLQkJCQkgICAgIGh0b25sKGluZGV2LT5icl9wb3J0LT5ici0+ZGV2LT5pZmluZGV4KSk7CisJCQkJICAgICBodG9ubChicl9wb3J0X2dldF9yY3UoaW5kZXYpLT5ici0+ZGV2LT5pZmluZGV4KSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBDYXNlIDI6IGluZGV2IGlzIGJyaWRnZSBncm91cCwgd2UgbmVlZCB0byBsb29rIGZvcgogCQkJICogcGh5c2ljYWwgZGV2aWNlICh3aGVuIGNhbGxlZCBmcm9tIGlwdjQpICovCkBAIC00MzAsOCArNDQxLDkgQEAKIAkJCU5MQV9QVVRfQkUzMihpbnN0LT5za2IsIE5GVUxBX0lGSU5ERVhfUEhZU09VVERFViwKIAkJCQkgICAgIGh0b25sKG91dGRldi0+aWZpbmRleCkpOwogCQkJLyogdGhpcyBpcyB0aGUgYnJpZGdlIGdyb3VwICJiclgiICovCisJCQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgb3IgbmZfbG9nX3BhY2tldCAqLwogCQkJTkxBX1BVVF9CRTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9PVVRERVYsCi0JCQkJICAgICBodG9ubChvdXRkZXYtPmJyX3BvcnQtPmJyLT5kZXYtPmlmaW5kZXgpKTsKKwkJCQkgICAgIGh0b25sKGJyX3BvcnRfZ2V0X3JjdShvdXRkZXYpLT5ici0+ZGV2LT5pZmluZGV4KSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBDYXNlIDI6IGluZGV2IGlzIGEgYnJpZGdlIGdyb3VwLCB3ZSBuZWVkIHRvIGxvb2sKIAkJCSAqIGZvciBwaHlzaWNhbCBkZXZpY2UgKHdoZW4gY2FsbGVkIGZyb20gaXB2NCkgKi8KQEAgLTYxOSw2ICs2MzEsNyBAQAogCQlzaXplICs9IG5sYV90b3RhbF9zaXplKGRhdGFfbGVuKTsKIAkJYnJlYWs7CiAKKwljYXNlIE5GVUxOTF9DT1BZX0RJU0FCTEVEOgogCWRlZmF1bHQ6CiAJCWdvdG8gdW5sb2NrX2FuZF9yZWxlYXNlOwogCX0KQEAgLTY3Miw3ICs2ODUsNyBAQAogCQlpbnQgaTsKIAogCQkvKiBkZXN0cm95IGFsbCBpbnN0YW5jZXMgZm9yIHRoaXMgcGlkICovCi0JCXdyaXRlX2xvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CiAJCWZvciAgKGkgPSAwOyBpIDwgSU5TVEFOQ0VfQlVDS0VUUzsgaSsrKSB7CiAJCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wLCAqdDI7CiAJCQlzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0OwpAQCAtNjg0LDcgKzY5Nyw3IEBACiAJCQkJCV9faW5zdGFuY2VfZGVzdHJveShpbnN0KTsKIAkJCX0KIAkJfQotCQl3cml0ZV91bmxvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKIAl9CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQpAQCAtODYxLDE5ICs4NzQsMTkgQEAKIAogCWZvciAoc3QtPmJ1Y2tldCA9IDA7IHN0LT5idWNrZXQgPCBJTlNUQU5DRV9CVUNLRVRTOyBzdC0+YnVja2V0KyspIHsKIAkJaWYgKCFobGlzdF9lbXB0eSgmaW5zdGFuY2VfdGFibGVbc3QtPmJ1Y2tldF0pKQotCQkJcmV0dXJuIGluc3RhbmNlX3RhYmxlW3N0LT5idWNrZXRdLmZpcnN0OworCQkJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9iaChpbnN0YW5jZV90YWJsZVtzdC0+YnVja2V0XS5maXJzdCk7CiAJfQogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmdldF9uZXh0KHN0cnVjdCBpdGVyX3N0YXRlICpzdCwgc3RydWN0IGhsaXN0X25vZGUgKmgpCiB7Ci0JaCA9IGgtPm5leHQ7CisJaCA9IHJjdV9kZXJlZmVyZW5jZV9iaChoLT5uZXh0KTsKIAl3aGlsZSAoIWgpIHsKIAkJaWYgKCsrc3QtPmJ1Y2tldCA+PSBJTlNUQU5DRV9CVUNLRVRTKQogCQkJcmV0dXJuIE5VTEw7CiAKLQkJaCA9IGluc3RhbmNlX3RhYmxlW3N0LT5idWNrZXRdLmZpcnN0OworCQloID0gcmN1X2RlcmVmZXJlbmNlX2JoKGluc3RhbmNlX3RhYmxlW3N0LT5idWNrZXRdLmZpcnN0KTsKIAl9CiAJcmV0dXJuIGg7CiB9CkBAIC04OTAsOSArOTAzLDkgQEAKIH0KIAogc3RhdGljIHZvaWQgKnNlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi0JX19hY3F1aXJlcyhpbnN0YW5jZXNfbG9jaykKKwlfX2FjcXVpcmVzKHJjdV9iaCkKIHsKLQlyZWFkX2xvY2tfYmgoJmluc3RhbmNlc19sb2NrKTsKKwlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJcmV0dXJuIGdldF9pZHgoc2VxLT5wcml2YXRlLCAqcG9zKTsKIH0KIApAQCAtOTAzLDkgKzkxNiw5IEBACiB9CiAKIHN0YXRpYyB2b2lkIHNlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLQlfX3JlbGVhc2VzKGluc3RhbmNlc19sb2NrKQorCV9fcmVsZWFzZXMocmN1X2JoKQogewotCXJlYWRfdW5sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggMTJlMWFiMy4uNjhlNjdkMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC00NiwxNyArNDYsMTkgQEAKIAlpbnQgcGVlcl9waWQ7CiAJdW5zaWduZWQgaW50IHF1ZXVlX21heGxlbjsKIAl1bnNpZ25lZCBpbnQgY29weV9yYW5nZTsKLQl1bnNpZ25lZCBpbnQgcXVldWVfdG90YWw7CiAJdW5zaWduZWQgaW50IHF1ZXVlX2Ryb3BwZWQ7CiAJdW5zaWduZWQgaW50IHF1ZXVlX3VzZXJfZHJvcHBlZDsKIAotCXVuc2lnbmVkIGludCBpZF9zZXF1ZW5jZTsJCS8qICdzZXF1ZW5jZScgb2YgcGt0IGlkcyAqLwogCiAJdV9pbnQxNl90IHF1ZXVlX251bTsJCQkvKiBudW1iZXIgb2YgdGhpcyBxdWV1ZSAqLwogCXVfaW50OF90IGNvcHlfbW9kZTsKLQotCXNwaW5sb2NrX3QgbG9jazsKLQorLyoKKyAqIEZvbGxvd2luZyBmaWVsZHMgYXJlIGRpcnRpZWQgZm9yIGVhY2ggcXVldWVkIHBhY2tldCwKKyAqIGtlZXAgdGhlbSBpbiBzYW1lIGNhY2hlIGxpbmUgaWYgcG9zc2libGUuCisgKi8KKwlzcGlubG9ja190CWxvY2s7CisJdW5zaWduZWQgaW50CXF1ZXVlX3RvdGFsOworCWF0b21pY190CWlkX3NlcXVlbmNlOwkJLyogJ3NlcXVlbmNlJyBvZiBwa3QgaWRzICovCiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZV9saXN0OwkJLyogcGFja2V0cyBpbiBxdWV1ZSAqLwogfTsKIApAQCAtMjM4LDMyICsyNDAsMjQgQEAKIAogCW91dGRldiA9IGVudHJ5LT5vdXRkZXY7CiAKLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCXN3aXRjaCAoKGVudW0gbmZxbmxfY29uZmlnX21vZGUpcXVldWUtPmNvcHlfbW9kZSkgeworCXN3aXRjaCAoKGVudW0gbmZxbmxfY29uZmlnX21vZGUpQUNDRVNTX09OQ0UocXVldWUtPmNvcHlfbW9kZSkpIHsKIAljYXNlIE5GUU5MX0NPUFlfTUVUQToKIAljYXNlIE5GUU5MX0NPUFlfTk9ORToKIAkJYnJlYWs7CiAKIAljYXNlIE5GUU5MX0NPUFlfUEFDS0VUOgogCQlpZiAoZW50c2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgICAgc2tiX2NoZWNrc3VtX2hlbHAoZW50c2tiKSkgewotCQkJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwkJICAgIHNrYl9jaGVja3N1bV9oZWxwKGVudHNrYikpCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAocXVldWUtPmNvcHlfcmFuZ2UgPT0gMAotCQkgICAgfHwgcXVldWUtPmNvcHlfcmFuZ2UgPiBlbnRza2ItPmxlbikKKworCQlkYXRhX2xlbiA9IEFDQ0VTU19PTkNFKHF1ZXVlLT5jb3B5X3JhbmdlKTsKKwkJaWYgKGRhdGFfbGVuID09IDAgfHwgZGF0YV9sZW4gPiBlbnRza2ItPmxlbikKIAkJCWRhdGFfbGVuID0gZW50c2tiLT5sZW47Ci0JCWVsc2UKLQkJCWRhdGFfbGVuID0gcXVldWUtPmNvcHlfcmFuZ2U7CiAKIAkJc2l6ZSArPSBubGFfdG90YWxfc2l6ZShkYXRhX2xlbik7CiAJCWJyZWFrOwogCX0KIAotCWVudHJ5LT5pZCA9IHF1ZXVlLT5pZF9zZXF1ZW5jZSsrOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAogCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikKQEAgLTI3OCw2ICsyNzIsNyBAQAogCW5mbXNnLT52ZXJzaW9uID0gTkZORVRMSU5LX1YwOwogCW5mbXNnLT5yZXNfaWQgPSBodG9ucyhxdWV1ZS0+cXVldWVfbnVtKTsKIAorCWVudHJ5LT5pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZxdWV1ZS0+aWRfc2VxdWVuY2UpOwogCXBtc2cucGFja2V0X2lkIAkJPSBodG9ubChlbnRyeS0+aWQpOwogCXBtc2cuaHdfcHJvdG9jb2wJPSBlbnRza2ItPnByb3RvY29sOwogCXBtc2cuaG9vawkJPSBlbnRyeS0+aG9vazsKQEAgLTI5Niw4ICsyOTEsOSBAQAogCQkJTkxBX1BVVF9CRTMyKHNrYiwgTkZRQV9JRklOREVYX1BIWVNJTkRFViwKIAkJCQkgICAgIGh0b25sKGluZGV2LT5pZmluZGV4KSk7CiAJCQkvKiB0aGlzIGlzIHRoZSBicmlkZ2UgZ3JvdXAgImJyWCIgKi8KKwkJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IF9fbmZfcXVldWUgKi8KIAkJCU5MQV9QVVRfQkUzMihza2IsIE5GUUFfSUZJTkRFWF9JTkRFViwKLQkJCQkgICAgIGh0b25sKGluZGV2LT5icl9wb3J0LT5ici0+ZGV2LT5pZmluZGV4KSk7CisJCQkJICAgICBodG9ubChicl9wb3J0X2dldF9yY3UoaW5kZXYpLT5ici0+ZGV2LT5pZmluZGV4KSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBDYXNlIDI6IGluZGV2IGlzIGJyaWRnZSBncm91cCwgd2UgbmVlZCB0byBsb29rIGZvcgogCQkJICogcGh5c2ljYWwgZGV2aWNlICh3aGVuIGNhbGxlZCBmcm9tIGlwdjQpICovCkBAIC0zMjEsOCArMzE3LDkgQEAKIAkJCU5MQV9QVVRfQkUzMihza2IsIE5GUUFfSUZJTkRFWF9QSFlTT1VUREVWLAogCQkJCSAgICAgaHRvbmwob3V0ZGV2LT5pZmluZGV4KSk7CiAJCQkvKiB0aGlzIGlzIHRoZSBicmlkZ2UgZ3JvdXAgImJyWCIgKi8KKwkJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IF9fbmZfcXVldWUgKi8KIAkJCU5MQV9QVVRfQkUzMihza2IsIE5GUUFfSUZJTkRFWF9PVVRERVYsCi0JCQkJICAgICBodG9ubChvdXRkZXYtPmJyX3BvcnQtPmJyLT5kZXYtPmlmaW5kZXgpKTsKKwkJCQkgICAgIGh0b25sKGJyX3BvcnRfZ2V0X3JjdShvdXRkZXYpLT5ici0+ZGV2LT5pZmluZGV4KSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBDYXNlIDI6IG91dGRldiBpcyBicmlkZ2UgZ3JvdXAsIHdlIG5lZWQgdG8gbG9vayBmb3IKIAkJCSAqIHBoeXNpY2FsIG91dHB1dCBkZXZpY2UgKHdoZW4gY2FsbGVkIGZyb20gaXB2NCkgKi8KQEAgLTg2Niw3ICs4NjMsNyBAQAogCQkJICBpbnN0LT5wZWVyX3BpZCwgaW5zdC0+cXVldWVfdG90YWwsCiAJCQkgIGluc3QtPmNvcHlfbW9kZSwgaW5zdC0+Y29weV9yYW5nZSwKIAkJCSAgaW5zdC0+cXVldWVfZHJvcHBlZCwgaW5zdC0+cXVldWVfdXNlcl9kcm9wcGVkLAotCQkJICBpbnN0LT5pZF9zZXF1ZW5jZSwgMSk7CisJCQkgIGF0b21pY19yZWFkKCZpbnN0LT5pZF9zZXF1ZW5jZSksIDEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5mcW5sX3NlcV9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NIRUNLU1VNLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NIRUNLU1VNLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2NDJlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ0hFQ0tTVU0uYwpAQCAtMCwwICsxLDcwIEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHRoZSBwYWNrZXQgY2hlY2tzdW0gbWFuZ2xpbmcKKyAqCisgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDEwIFJlZCBIYXQsIEluYy4KKyAqCisgKiBBdXRob3I6IE1pY2hhZWwgUy4gVHNpcmtpbiA8bXN0QHJlZGhhdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ0hFQ0tTVU0uaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBTLiBUc2lya2luIDxtc3RAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWHRhYmxlczogY2hlY2tzdW0gbW9kaWZpY2F0aW9uIik7CitNT0RVTEVfQUxJQVMoImlwdF9DSEVDS1NVTSIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X0NIRUNLU1VNIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NoZWNrc3VtX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJc2tiX2NoZWNrc3VtX2hlbHAoc2tiKTsKKworCXJldHVybiBYVF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBjaGVja3N1bV90Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfQ0hFQ0tTVU1faW5mbyAqZWluZm8gPSBwYXItPnRhcmdpbmZvOworCisJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiB+WFRfQ0hFQ0tTVU1fT1BfRklMTCkgeworCQlwcl9pbmZvKCJ1bnN1cHBvcnRlZCBDSEVDS1NVTSBvcGVyYXRpb24gJXhcbiIsIGVpbmZvLT5vcGVyYXRpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFlaW5mby0+b3BlcmF0aW9uKSB7CisJCXByX2luZm8oIm5vIENIRUNLU1VNIG9wZXJhdGlvbiBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBjaGVja3N1bV90Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiQ0hFQ0tTVU0iLAorCS5mYW1pbHkJCT0gTkZQUk9UT19VTlNQRUMsCisJLnRhcmdldAkJPSBjaGVja3N1bV90ZywKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfQ0hFQ0tTVU1faW5mbyksCisJLnRhYmxlCQk9ICJtYW5nbGUiLAorCS5jaGVja2VudHJ5CT0gY2hlY2tzdW1fdGdfY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2hlY2tzdW1fdGdfaW5pdCh2b2lkKQoreworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJmNoZWNrc3VtX3RnX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjaGVja3N1bV90Z19leGl0KHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmNoZWNrc3VtX3RnX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGNoZWNrc3VtX3RnX2luaXQpOworbW9kdWxlX2V4aXQoY2hlY2tzdW1fdGdfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NULmMKaW5kZXggNTYyYmYzMi4uMGNiNjA1MyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DVC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ1QuYwpAQCAtNjcsNyArNjcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpbmZvLT5mbGFncyAmIFhUX0NUX05PVFJBQ0spIHsKLQkJY3QgPSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZDsKKwkJY3QgPSBuZl9jdF91bnRyYWNrZWRfZ2V0KCk7CiAJCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzMiw3ICsxMzIsNyBAQAogCXN0cnVjdCBuZl9jb25uICpjdCA9IGluZm8tPmN0OwogCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CiAKLQlpZiAoY3QgIT0gJm5mX2Nvbm50cmFja191bnRyYWNrZWQpIHsKKwlpZiAoIW5mX2N0X2lzX3VudHJhY2tlZChjdCkpIHsKIAkJaGVscCA9IG5mY3RfaGVscChjdCk7CiAJCWlmIChoZWxwKQogCQkJbW9kdWxlX3B1dChoZWxwLT5oZWxwZXItPm1lKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWYyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogbGludXgvbmV0L25ldGZpbHRlci94dF9JRExFVElNRVIuYworICoKKyAqIE5ldGZpbHRlciBtb2R1bGUgdG8gdHJpZ2dlciBhIHRpbWVyIHdoZW4gcGFja2V0IG1hdGNoZXMuCisgKiBBZnRlciB0aW1lciBleHBpcmVzIGEga2V2ZW50IHdpbGwgYmUgc2VudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVGltbyBUZXJhcyA8ZXh0LXRpbW8udGVyYXNAbm9raWEuY29tPgorICoKKyAqIENvbnZlcnRlZCB0byB4X3RhYmxlcyBhbmQgcmV3b3JrZWQgZm9yIHVwc3RyZWFtIGluY2x1c2lvbgorICogYnkgTHVjaWFubyBDb2VsaG8gPGx1Y2lhbm8uY29lbGhvQG5va2lhLmNvbT4KKyAqCisgKiBDb250YWN0OiBMdWNpYW5vIENvZWxobyA8bHVjaWFuby5jb2VsaG9Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9JRExFVElNRVIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworc3RydWN0IGlkbGV0aW1lcl90Z19hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdAkoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKK307CisKK3N0cnVjdCBpZGxldGltZXJfdGcgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsKKwlzdHJ1Y3QgaWRsZXRpbWVyX3RnX2F0dHIgYXR0cjsKKworCXVuc2lnbmVkIGludCByZWZjbnQ7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKGlkbGV0aW1lcl90Z19saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgobGlzdF9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqaWRsZXRpbWVyX3RnX2tvYmo7CisKK3N0YXRpYworc3RydWN0IGlkbGV0aW1lcl90ZyAqX19pZGxldGltZXJfdGdfZmluZF9ieV9sYWJlbChjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlzdHJ1Y3QgaWRsZXRpbWVyX3RnICplbnRyeTsKKworCUJVR19PTighbGFiZWwpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmlkbGV0aW1lcl90Z19saXN0LCBlbnRyeSkgeworCQlpZiAoIXN0cmNtcChsYWJlbCwgZW50cnktPmF0dHIuYXR0ci5uYW1lKSkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNzaXplX3QgaWRsZXRpbWVyX3RnX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWRsZXRpbWVyX3RnICp0aW1lcjsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSAwOworCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisKKwl0aW1lciA9CV9faWRsZXRpbWVyX3RnX2ZpbmRfYnlfbGFiZWwoYXR0ci0+bmFtZSk7CisJaWYgKHRpbWVyKQorCQlleHBpcmVzID0gdGltZXItPnRpbWVyLmV4cGlyZXM7CisKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCisJaWYgKHRpbWVfYWZ0ZXIoZXhwaXJlcywgamlmZmllcykpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLAorCQkJICAgICAgIGppZmZpZXNfdG9fbXNlY3MoZXhwaXJlcyAtIGppZmZpZXMpIC8gMTAwMCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKK30KKworc3RhdGljIHZvaWQgaWRsZXRpbWVyX3RnX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZGxldGltZXJfdGcgKnRpbWVyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZGxldGltZXJfdGcsCisJCQkJCQkgIHdvcmspOworCisJc3lzZnNfbm90aWZ5KGlkbGV0aW1lcl90Z19rb2JqLCBOVUxMLCB0aW1lci0+YXR0ci5hdHRyLm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBpZGxldGltZXJfdGdfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlkbGV0aW1lcl90ZyAqdGltZXIgPSAoc3RydWN0IGlkbGV0aW1lcl90ZyAqKSBkYXRhOworCisJcHJfZGVidWcoInRpbWVyICVzIGV4cGlyZWRcbiIsIHRpbWVyLT5hdHRyLmF0dHIubmFtZSk7CisKKwlzY2hlZHVsZV93b3JrKCZ0aW1lci0+d29yayk7Cit9CisKK3N0YXRpYyBpbnQgaWRsZXRpbWVyX3RnX2NyZWF0ZShzdHJ1Y3QgaWRsZXRpbWVyX3RnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKworCWluZm8tPnRpbWVyID0ga21hbGxvYyhzaXplb2YoKmluZm8tPnRpbWVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvLT50aW1lcikgeworCQlwcl9kZWJ1ZygiY291bGRuJ3QgYWxsb2MgdGltZXJcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlpbmZvLT50aW1lci0+YXR0ci5hdHRyLm5hbWUgPSBrc3RyZHVwKGluZm8tPmxhYmVsLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8tPnRpbWVyLT5hdHRyLmF0dHIubmFtZSkgeworCQlwcl9kZWJ1ZygiY291bGRuJ3QgYWxsb2MgYXR0cmlidXRlIG5hbWVcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3RpbWVyOworCX0KKwlpbmZvLT50aW1lci0+YXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWluZm8tPnRpbWVyLT5hdHRyLnNob3cgPSBpZGxldGltZXJfdGdfc2hvdzsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKGlkbGV0aW1lcl90Z19rb2JqLCAmaW5mby0+dGltZXItPmF0dHIuYXR0cik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZGVidWcoImNvdWxkbid0IGFkZCBmaWxlIHRvIHN5c2ZzIik7CisJCWdvdG8gb3V0X2ZyZWVfYXR0cjsKKwl9CisKKwlsaXN0X2FkZCgmaW5mby0+dGltZXItPmVudHJ5LCAmaWRsZXRpbWVyX3RnX2xpc3QpOworCisJc2V0dXBfdGltZXIoJmluZm8tPnRpbWVyLT50aW1lciwgaWRsZXRpbWVyX3RnX2V4cGlyZWQsCisJCSAgICAodW5zaWduZWQgbG9uZykgaW5mby0+dGltZXIpOworCWluZm8tPnRpbWVyLT5yZWZjbnQgPSAxOworCisJbW9kX3RpbWVyKCZpbmZvLT50aW1lci0+dGltZXIsCisJCSAgbXNlY3NfdG9famlmZmllcyhpbmZvLT50aW1lb3V0ICogMTAwMCkgKyBqaWZmaWVzKTsKKworCUlOSVRfV09SSygmaW5mby0+dGltZXItPndvcmssIGlkbGV0aW1lcl90Z193b3JrKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV9hdHRyOgorCWtmcmVlKGluZm8tPnRpbWVyLT5hdHRyLmF0dHIubmFtZSk7CitvdXRfZnJlZV90aW1lcjoKKwlrZnJlZShpbmZvLT50aW1lcik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBhY3R1YWwgeHRfdGFibGVzIHBsdWdpbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpZGxldGltZXJfdGdfdGFyZ2V0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IGlkbGV0aW1lcl90Z19pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKKworCXByX2RlYnVnKCJyZXNldHRpbmcgdGltZXIgJXMsIHRpbWVvdXQgcGVyaW9kICV1XG4iLAorCQkgaW5mby0+bGFiZWwsIGluZm8tPnRpbWVvdXQpOworCisJQlVHX09OKCFpbmZvLT50aW1lcik7CisKKwltb2RfdGltZXIoJmluZm8tPnRpbWVyLT50aW1lciwKKwkJICBtc2Vjc190b19qaWZmaWVzKGluZm8tPnRpbWVvdXQgKiAxMDAwKSArIGppZmZpZXMpOworCisJcmV0dXJuIFhUX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50IGlkbGV0aW1lcl90Z19jaGVja2VudHJ5KGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQoreworCXN0cnVjdCBpZGxldGltZXJfdGdfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJaW50IHJldDsKKworCXByX2RlYnVnKCJjaGVja2VudHJ5IHRhcmdpbmZvJXNcbiIsIGluZm8tPmxhYmVsKTsKKworCWlmIChpbmZvLT50aW1lb3V0ID09IDApIHsKKwkJcHJfZGVidWcoInRpbWVvdXQgdmFsdWUgaXMgemVyb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbmZvLT5sYWJlbFswXSA9PSAnXDAnIHx8CisJICAgIHN0cm5sZW4oaW5mby0+bGFiZWwsCisJCSAgICBNQVhfSURMRVRJTUVSX0xBQkVMX1NJWkUpID09IE1BWF9JRExFVElNRVJfTEFCRUxfU0laRSkgeworCQlwcl9kZWJ1ZygibGFiZWwgaXMgZW1wdHkgb3Igbm90IG51bC10ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisKKwlpbmZvLT50aW1lciA9IF9faWRsZXRpbWVyX3RnX2ZpbmRfYnlfbGFiZWwoaW5mby0+bGFiZWwpOworCWlmIChpbmZvLT50aW1lcikgeworCQlpbmZvLT50aW1lci0+cmVmY250Kys7CisJCW1vZF90aW1lcigmaW5mby0+dGltZXItPnRpbWVyLAorCQkJICBtc2Vjc190b19qaWZmaWVzKGluZm8tPnRpbWVvdXQgKiAxMDAwKSArIGppZmZpZXMpOworCisJCXByX2RlYnVnKCJpbmNyZWFzZWQgcmVmY250IG9mIHRpbWVyICVzIHRvICV1XG4iLAorCQkJIGluZm8tPmxhYmVsLCBpbmZvLT50aW1lci0+cmVmY250KTsKKwl9IGVsc2UgeworCQlyZXQgPSBpZGxldGltZXJfdGdfY3JlYXRlKGluZm8pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZGVidWcoImZhaWxlZCB0byBjcmVhdGUgdGltZXJcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpZGxldGltZXJfdGdfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfdGdkdG9yX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IGlkbGV0aW1lcl90Z19pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKKworCXByX2RlYnVnKCJkZXN0cm95IHRhcmdpbmZvICVzXG4iLCBpbmZvLT5sYWJlbCk7CisKKwltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKKworCWlmICgtLWluZm8tPnRpbWVyLT5yZWZjbnQgPT0gMCkgeworCQlwcl9kZWJ1ZygiZGVsZXRpbmcgdGltZXIgJXNcbiIsIGluZm8tPmxhYmVsKTsKKworCQlsaXN0X2RlbCgmaW5mby0+dGltZXItPmVudHJ5KTsKKwkJZGVsX3RpbWVyX3N5bmMoJmluZm8tPnRpbWVyLT50aW1lcik7CisJCXN5c2ZzX3JlbW92ZV9maWxlKGlkbGV0aW1lcl90Z19rb2JqLCAmaW5mby0+dGltZXItPmF0dHIuYXR0cik7CisJCWtmcmVlKGluZm8tPnRpbWVyLT5hdHRyLmF0dHIubmFtZSk7CisJCWtmcmVlKGluZm8tPnRpbWVyKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiZGVjcmVhc2VkIHJlZmNudCBvZiB0aW1lciAlcyB0byAldVxuIiwKKwkJCSBpbmZvLT5sYWJlbCwgaW5mby0+dGltZXItPnJlZmNudCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKK30KKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaWRsZXRpbWVyX3RnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gIklETEVUSU1FUiIsCisJLmZhbWlseQkJPSBORlBST1RPX1VOU1BFQywKKwkudGFyZ2V0CQk9IGlkbGV0aW1lcl90Z190YXJnZXQsCisJLnRhcmdldHNpemUgICAgID0gc2l6ZW9mKHN0cnVjdCBpZGxldGltZXJfdGdfaW5mbyksCisJLmNoZWNrZW50cnkJPSBpZGxldGltZXJfdGdfY2hlY2tlbnRyeSwKKwkuZGVzdHJveSAgICAgICAgPSBpZGxldGltZXJfdGdfZGVzdHJveSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzICppZGxldGltZXJfdGdfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICppZGxldGltZXJfdGdfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBpZGxldGltZXJfdGdfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZGxldGltZXJfdGdfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJ4dF9pZGxldGltZXIiKTsKKwllcnIgPSBQVFJfRVJSKGlkbGV0aW1lcl90Z19jbGFzcyk7CisJaWYgKElTX0VSUihpZGxldGltZXJfdGdfY2xhc3MpKSB7CisJCXByX2RlYnVnKCJjb3VsZG4ndCByZWdpc3RlciBkZXZpY2UgY2xhc3NcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZGxldGltZXJfdGdfZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShpZGxldGltZXJfdGdfY2xhc3MsIE5VTEwsCisJCQkJCSAgICBNS0RFVigwLCAwKSwgTlVMTCwgInRpbWVycyIpOworCWVyciA9IFBUUl9FUlIoaWRsZXRpbWVyX3RnX2RldmljZSk7CisJaWYgKElTX0VSUihpZGxldGltZXJfdGdfZGV2aWNlKSkgeworCQlwcl9kZWJ1ZygiY291bGRuJ3QgcmVnaXN0ZXIgc3lzdGVtIGRldmljZVxuIik7CisJCWdvdG8gb3V0X2NsYXNzOworCX0KKworCWlkbGV0aW1lcl90Z19rb2JqID0gJmlkbGV0aW1lcl90Z19kZXZpY2UtPmtvYmo7CisKKwllcnIgPSAgeHRfcmVnaXN0ZXJfdGFyZ2V0KCZpZGxldGltZXJfdGcpOworCWlmIChlcnIgPCAwKSB7CisJCXByX2RlYnVnKCJjb3VsZG4ndCByZWdpc3RlciB4dCB0YXJnZXRcbiIpOworCQlnb3RvIG91dF9kZXY7CisJfQorCisJcmV0dXJuIDA7CitvdXRfZGV2OgorCWRldmljZV9kZXN0cm95KGlkbGV0aW1lcl90Z19jbGFzcywgTUtERVYoMCwgMCkpOworb3V0X2NsYXNzOgorCWNsYXNzX2Rlc3Ryb3koaWRsZXRpbWVyX3RnX2NsYXNzKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWRsZXRpbWVyX3RnX2V4aXQodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaWRsZXRpbWVyX3RnKTsKKworCWRldmljZV9kZXN0cm95KGlkbGV0aW1lcl90Z19jbGFzcywgTUtERVYoMCwgMCkpOworCWNsYXNzX2Rlc3Ryb3koaWRsZXRpbWVyX3RnX2NsYXNzKTsKK30KKworbW9kdWxlX2luaXQoaWRsZXRpbWVyX3RnX2luaXQpOworbW9kdWxlX2V4aXQoaWRsZXRpbWVyX3RnX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJUaW1vIFRlcmFzIDxleHQtdGltby50ZXJhc0Bub2tpYS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJMdWNpYW5vIENvZWxobyA8bHVjaWFuby5jb2VsaG9Abm9raWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBpZGxlIHRpbWUgbW9uaXRvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYwppbmRleCA1MTJiOTEyLi45ZDc4MjE4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYwpAQCAtMjMsNyArMjMsNyBAQAogCSAgIElmIHRoZXJlIGlzIGEgcmVhbCBjdCBlbnRyeSBjb3JyZXNwb25kaWcgdG8gdGhpcyBwYWNrZXQsCiAJICAgaXQnbGwgaGFuZyBhcm91biB0aWxsIHRpbWluZyBvdXQuIFdlIGRvbid0IGRlYWwgd2l0aCBpdAogCSAgIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBKSyAqLwotCXNrYi0+bmZjdCA9ICZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWw7CisJc2tiLT5uZmN0ID0gJm5mX2N0X3VudHJhY2tlZF9nZXQoKS0+Y3RfZ2VuZXJhbDsKIAlza2ItPm5mY3RpbmZvID0gSVBfQ1RfTkVXOwogCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwppbmRleCA2OWMwMWUxLi5kZTA3OWFiZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMKQEAgLTYwLDEzICs2MCwyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoeHRfcmF0ZWVzdF9sb29rdXApOwogCitzdGF0aWMgdm9pZCB4dF9yYXRlZXN0X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlrZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHh0X3JhdGVlc3QsIHJjdSkpOworfQorCiB2b2lkIHh0X3JhdGVlc3RfcHV0KHN0cnVjdCB4dF9yYXRlZXN0ICplc3QpCiB7CiAJbXV0ZXhfbG9jaygmeHRfcmF0ZWVzdF9tdXRleCk7CiAJaWYgKC0tZXN0LT5yZWZjbnQgPT0gMCkgewogCQlobGlzdF9kZWwoJmVzdC0+bGlzdCk7CiAJCWdlbl9raWxsX2VzdGltYXRvcigmZXN0LT5ic3RhdHMsICZlc3QtPnJzdGF0cyk7Ci0JCWtmcmVlKGVzdCk7CisJCS8qCisJCSAqIGdlbl9lc3RpbWF0b3IgZXN0X3RpbWVyKCkgbWlnaHQgYWNjZXNzIGVzdC0+bG9jayBvciBic3RhdHMsCisJCSAqIHdhaXQgYSBSQ1UgZ3JhY2UgcGVyaW9kIGJlZm9yZSBmcmVlaW5nICdlc3QnCisJCSAqLworCQljYWxsX3JjdSgmZXN0LT5yY3UsIHh0X3JhdGVlc3RfZnJlZV9yY3UpOwogCX0KIAltdXRleF91bmxvY2soJnh0X3JhdGVlc3RfbXV0ZXgpOwogfQpAQCAtMTc5LDYgKzE4OCw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgeHRfcmF0ZWVzdF90Z19maW5pKHZvaWQpCiB7CiAJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJnh0X3JhdGVlc3RfdGdfcmVnKTsKKwlyY3VfYmFycmllcigpOyAvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1KCkncyAoeHRfcmF0ZWVzdF9mcmVlX3JjdSkgKi8KIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jIGIvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYwppbmRleCA2MmVjMDIxLi5lYjgxYzM4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKQEAgLTE2NSw4ICsxNjUsOCBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKHJ0ICE9IE5VTEwpIHsKLQkJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKLQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCW10dSA9IGRzdF9tdHUoJnJ0LT5kc3QpOworCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJfQogCXJldHVybiBtdHU7CiB9CkBAIC0yMjAsMTUgKzIyMCwxMyBAQAogfQogI2VuZGlmCiAKLSNkZWZpbmUgVEhfU1lOIDB4MDIKLQogLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAtLXN5biAqLwogc3RhdGljIGlubGluZSBib29sIGZpbmRfc3luX21hdGNoKGNvbnN0IHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqbSkKIHsKIAljb25zdCBzdHJ1Y3QgeHRfdGNwICp0Y3BpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF90Y3AgKiltLT5kYXRhOwogCiAJaWYgKHN0cmNtcChtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSwgInRjcCIpID09IDAgJiYKLQkgICAgdGNwaW5mby0+ZmxnX2NtcCAmIFRIX1NZTiAmJgorCSAgICB0Y3BpbmZvLT5mbGdfY21wICYgVENQSERSX1NZTiAmJgogCSAgICAhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9GTEFHUykpCiAJCXJldHVybiB0cnVlOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jIGIvbmV0L25ldGZpbHRlci94dF9URUUuYwppbmRleCA4NTlkOWZkLi4yMmEyZDQyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMKQEAgLTc3LDggKzc3LDggQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJc2tiX2RzdF9kcm9wKHNrYik7Ci0Jc2tiX2RzdF9zZXQoc2tiLCAmcnQtPnUuZHN0KTsKLQlza2ItPmRldiAgICAgID0gcnQtPnUuZHN0LmRldjsKKwlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKKwlza2ItPmRldiAgICAgID0gcnQtPmRzdC5kZXY7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwNCw3ICsxMDQsNyBAQAogI2lmZGVmIFdJVEhfQ09OTlRSQUNLCiAJLyogQXZvaWQgY291bnRpbmcgY2xvbmVkIHBhY2tldHMgdG93YXJkcyB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbi4gKi8KIAluZl9jb25udHJhY2tfcHV0KHNrYi0+bmZjdCk7Ci0Jc2tiLT5uZmN0ICAgICA9ICZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWw7CisJc2tiLT5uZmN0ICAgICA9ICZuZl9jdF91bnRyYWNrZWRfZ2V0KCktPmN0X2dlbmVyYWw7CiAJc2tiLT5uZmN0aW5mbyA9IElQX0NUX05FVzsKIAluZl9jb25udHJhY2tfZ2V0KHNrYi0+bmZjdCk7CiAjZW5kaWYKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAjaWZkZWYgV0lUSF9DT05OVFJBQ0sKIAluZl9jb25udHJhY2tfcHV0KHNrYi0+bmZjdCk7Ci0Jc2tiLT5uZmN0ICAgICA9ICZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWw7CisJc2tiLT5uZmN0ICAgICA9ICZuZl9jdF91bnRyYWNrZWRfZ2V0KCktPmN0X2dlbmVyYWw7CiAJc2tiLT5uZmN0aW5mbyA9IElQX0NUX05FVzsKIAluZl9jb25udHJhY2tfZ2V0KHNrYi0+bmZjdCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCmluZGV4IGUxYTBkZWQuLmM2MTI5NGQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYwpAQCAtMzcsOCArMzcsMTAgQEAKIAkJcmV0dXJuIE5GX0RST1A7CiAKIAlzayA9IG5mX3Rwcm94eV9nZXRfc29ja192NChkZXZfbmV0KHNrYi0+ZGV2KSwgaXBoLT5wcm90b2NvbCwKLQkJCQkgICBpcGgtPnNhZGRyLCB0Z2ktPmxhZGRyID8gdGdpLT5sYWRkciA6IGlwaC0+ZGFkZHIsCi0JCQkJICAgaHAtPnNvdXJjZSwgdGdpLT5scG9ydCA/IHRnaS0+bHBvcnQgOiBocC0+ZGVzdCwKKwkJCQkgICBpcGgtPnNhZGRyLAorCQkJCSAgIHRnaS0+bGFkZHIgPyB0Z2ktPmxhZGRyIDogaXBoLT5kYWRkciwKKwkJCQkgICBocC0+c291cmNlLAorCQkJCSAgIHRnaS0+bHBvcnQgPyB0Z2ktPmxwb3J0IDogaHAtPmRlc3QsCiAJCQkJICAgcGFyLT5pbiwgdHJ1ZSk7CiAKIAkvKiBOT1RFOiBhc3NpZ25fc29jayBjb25zdW1lcyBvdXIgc2sgcmVmZXJlbmNlICovCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2NsdXN0ZXIuYyBiL25ldC9uZXRmaWx0ZXIveHRfY2x1c3Rlci5jCmluZGV4IDMwYjk1YTEuLmY0YWYxYmYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfY2x1c3Rlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY2x1c3Rlci5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAlpZiAoY3QgPT0gTlVMTCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGN0ID09ICZuZl9jb25udHJhY2tfdW50cmFja2VkKQorCWlmIChuZl9jdF9pc191bnRyYWNrZWQoY3QpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoY3QtPm1hc3RlcikKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCmluZGV4IDczNTE3ODMuLjViMTM4NTAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwpAQCAtMTEyLDYgKzExMiwxNiBAQAogCWlmIChyZXQgPCAwKQogCQlwcl9pbmZvKCJjYW5ub3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgcHJvdG89JXVcbiIsCiAJCQlwYXItPmZhbWlseSk7CisKKwkvKgorCSAqIFRoaXMgZmlsdGVyIGNhbm5vdCBmdW5jdGlvbiBjb3JyZWN0bHkgdW5sZXNzIGNvbm5lY3Rpb24gdHJhY2tpbmcKKwkgKiBhY2NvdW50aW5nIGlzIGVuYWJsZWQsIHNvIGNvbXBsYWluIGluIHRoZSBob3BlIHRoYXQgc29tZW9uZSBub3RpY2VzLgorCSAqLworCWlmICghbmZfY3RfYWNjdF9lbmFibGVkKHBhci0+bmV0KSkgeworCQlwcl93YXJuaW5nKCJGb3JjaW5nIENUIGFjY291bnRpbmcgdG8gYmUgZW5hYmxlZFxuIik7CisJCW5mX2N0X3NldF9hY2N0KHBhci0+bmV0LCB0cnVlKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwppbmRleCAzOTY4MWYxLi5lNTM2NzEwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKQEAgLTEyMywxMSArMTIzLDEyIEBACiAKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCi0JaWYgKGN0ID09ICZuZl9jb25udHJhY2tfdW50cmFja2VkKQotCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7Ci0JZWxzZSBpZiAoY3QgIT0gTlVMTCkKLQkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7Ci0JZWxzZQorCWlmIChjdCkgeworCQlpZiAobmZfY3RfaXNfdW50cmFja2VkKGN0KSkKKwkJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKKwkJZWxzZQorCQkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7CisJfSBlbHNlCiAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQ7CiAKIAlpZiAoaW5mby0+bWF0Y2hfZmxhZ3MgJiBYVF9DT05OVFJBQ0tfU1RBVEUpIHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY3B1LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWRiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2NwdS5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggcnVubmluZyBDUFUgKi8KKworLyoKKyAqIE1pZ2h0IGJlIHVzZWQgdG8gZGlzdHJpYnV0ZSBjb25uZWN0aW9ucyBvbiBzZXZlcmFsIGRhZW1vbnMsIGlmCisgKiBSUFMgKFJlbW90ZSBQYWNrZXQgU3RlZXJpbmcpIGlzIGVuYWJsZWQgb3IgTklDIGlzIG11bHRpcXVldWUgY2FwYWJsZSwKKyAqIGVhY2ggUlggcXVldWUgSVJRIGFmZmluZWQgdG8gb25lIENQVSAoMToxIG1hcHBpbmcpCisgKgorICovCisKKy8qIChDKSAyMDEwIEVyaWMgRHVtYXpldAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBEdW1hemV0IDxlcmljLmR1bWF6ZXRAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBDUFUgbWF0Y2giKTsKKworc3RhdGljIGludCBjcHVfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IHh0X2NwdV9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CisKKwlpZiAoaW5mby0+aW52ZXJ0ICYgfjEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBjcHVfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9jcHVfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCisJcmV0dXJuIChpbmZvLT5jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjcHVfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAiY3B1IiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkuY2hlY2tlbnRyeSA9IGNwdV9tdF9jaGVjaywKKwkubWF0Y2ggICAgICA9IGNwdV9tdCwKKwkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfY3B1X2luZm8pLAorCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcHVfbXRfaW5pdCh2b2lkKQoreworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmY3B1X210X3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVfbXRfZXhpdCh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmNwdV9tdF9yZWcpOworfQorCittb2R1bGVfaW5pdChjcHVfbXRfaW5pdCk7Cittb2R1bGVfZXhpdChjcHVfbXRfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2lwdnMuYyBiL25ldC9uZXRmaWx0ZXIveHRfaXB2cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNGQ2NmRiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9pcHZzLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKgl4dF9pcHZzIC0ga2VybmVsIG1vZHVsZSB0byBtYXRjaCBJUFZTIGNvbm5lY3Rpb24gcHJvcGVydGllcworICoKKyAqCUF1dGhvcjogSGFubmVzIEVkZXIgPGhlZGVyQGdvb2dsZS5jb20+CisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2lwX3ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaXB2cy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworTU9EVUxFX0FVVEhPUigiSGFubmVzIEVkZXIgPGhlZGVyQGdvb2dsZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IG1hdGNoIElQVlMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9pcHZzIik7CitNT0RVTEVfQUxJQVMoImlwNnRfaXB2cyIpOworCisvKiBib3Jyb3dlZCBmcm9tIHh0X2Nvbm50cmFjayAqLworc3RhdGljIGJvb2wgaXB2c19tdF9hZGRyY21wKGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqa2FkZHIsCisJCQkgICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICp1YWRkciwKKwkJCSAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnVtYXNrLAorCQkJICAgIHVuc2lnbmVkIGludCBsM3Byb3RvKQoreworCWlmIChsM3Byb3RvID09IE5GUFJPVE9fSVBWNCkKKwkJcmV0dXJuICgoa2FkZHItPmlwIF4gdWFkZHItPmlwKSAmIHVtYXNrLT5pcCkgPT0gMDsKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWVsc2UgaWYgKGwzcHJvdG8gPT0gTkZQUk9UT19JUFY2KQorCQlyZXR1cm4gaXB2Nl9tYXNrZWRfYWRkcl9jbXAoJmthZGRyLT5pbjYsICZ1bWFzay0+aW42LAorCQkgICAgICAgJnVhZGRyLT5pbjYpID09IDA7CisjZW5kaWYKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wKK2lwdnNfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9pcHZzX210aW5mbyAqZGF0YSA9IHBhci0+bWF0Y2hpbmZvOworCS8qIGlwdnNfbXRfY2hlY2sgZW5zdXJlcyB0aGF0IGZhbWlseSBpcyBvbmx5IE5GUFJPVE9fSVBWWzQ2XS4gKi8KKwljb25zdCB1X2ludDhfdCBmYW1pbHkgPSBwYXItPmZhbWlseTsKKwlzdHJ1Y3QgaXBfdnNfaXBoZHIgaXBoOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCWJvb2wgbWF0Y2ggPSB0cnVlOworCisJaWYgKGRhdGEtPmJpdG1hc2sgPT0gWFRfSVBWU19JUFZTX1BST1BFUlRZKSB7CisJCW1hdGNoID0gc2tiLT5pcHZzX3Byb3BlcnR5IF4KKwkJCSEhKGRhdGEtPmludmVydCAmIFhUX0lQVlNfSVBWU19QUk9QRVJUWSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIG90aGVyIGZsYWdzIHRoYW4gWFRfSVBWU19JUFZTX1BST1BFUlRZIGFyZSBzZXQgKi8KKwlpZiAoIXNrYi0+aXB2c19wcm9wZXJ0eSkgeworCQltYXRjaCA9IGZhbHNlOworCQlnb3RvIG91dDsKKwl9CisKKwlpcF92c19maWxsX2lwaGRyKGZhbWlseSwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksICZpcGgpOworCisJaWYgKGRhdGEtPmJpdG1hc2sgJiBYVF9JUFZTX1BST1RPKQorCQlpZiAoKGlwaC5wcm90b2NvbCA9PSBkYXRhLT5sNHByb3RvKSBeCisJCSAgICAhKGRhdGEtPmludmVydCAmIFhUX0lQVlNfUFJPVE8pKSB7CisJCQltYXRjaCA9IGZhbHNlOworCQkJZ290byBvdXQ7CisJCX0KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGlwaC5wcm90b2NvbCk7CisJaWYgKHVubGlrZWx5KCFwcCkpIHsKKwkJbWF0Y2ggPSBmYWxzZTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcGFja2V0IGJlbG9uZ3MgdG8gYW4gZXhpc3RpbmcgZW50cnkKKwkgKi8KKwljcCA9IHBwLT5jb25uX291dF9nZXQoZmFtaWx5LCBza2IsIHBwLCAmaXBoLCBpcGgubGVuLCAxIC8qIGludmVyc2UgKi8pOworCWlmICh1bmxpa2VseShjcCA9PSBOVUxMKSkgeworCQltYXRjaCA9IGZhbHNlOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFdlIGZvdW5kIGEgY29ubmVjdGlvbiwgaS5lLiBjdCAhPSAwLCBtYWtlIHN1cmUgdG8gY2FsbAorCSAqIF9faXBfdnNfY29ubl9wdXQgYmVmb3JlIHJldHVybmluZy4gIEluIG91ciBjYXNlIGp1bXAgdG8gb3V0X3B1dF9jb24uCisJICovCisKKwlpZiAoZGF0YS0+Yml0bWFzayAmIFhUX0lQVlNfVlBPUlQpCisJCWlmICgoY3AtPnZwb3J0ID09IGRhdGEtPnZwb3J0KSBeCisJCSAgICAhKGRhdGEtPmludmVydCAmIFhUX0lQVlNfVlBPUlQpKSB7CisJCQltYXRjaCA9IGZhbHNlOworCQkJZ290byBvdXRfcHV0X2NwOworCQl9CisKKwlpZiAoZGF0YS0+Yml0bWFzayAmIFhUX0lQVlNfVlBPUlRDVEwpCisJCWlmICgoY3AtPmNvbnRyb2wgIT0gTlVMTCAmJgorCQkgICAgIGNwLT5jb250cm9sLT52cG9ydCA9PSBkYXRhLT52cG9ydGN0bCkgXgorCQkgICAgIShkYXRhLT5pbnZlcnQgJiBYVF9JUFZTX1ZQT1JUQ1RMKSkgeworCQkJbWF0Y2ggPSBmYWxzZTsKKwkJCWdvdG8gb3V0X3B1dF9jcDsKKwkJfQorCisJaWYgKGRhdGEtPmJpdG1hc2sgJiBYVF9JUFZTX0RJUikgeworCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwkJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisKKwkJaWYgKGN0ID09IE5VTEwgfHwgbmZfY3RfaXNfdW50cmFja2VkKGN0KSkgeworCQkJbWF0Y2ggPSBmYWxzZTsKKwkJCWdvdG8gb3V0X3B1dF9jcDsKKwkJfQorCisJCWlmICgoY3RpbmZvID49IElQX0NUX0lTX1JFUExZKSBeCisJCSAgICAhIShkYXRhLT5pbnZlcnQgJiBYVF9JUFZTX0RJUikpIHsKKwkJCW1hdGNoID0gZmFsc2U7CisJCQlnb3RvIG91dF9wdXRfY3A7CisJCX0KKwl9CisKKwlpZiAoZGF0YS0+Yml0bWFzayAmIFhUX0lQVlNfTUVUSE9EKQorCQlpZiAoKChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfRldEX01BU0spID09IGRhdGEtPmZ3ZF9tZXRob2QpIF4KKwkJICAgICEoZGF0YS0+aW52ZXJ0ICYgWFRfSVBWU19NRVRIT0QpKSB7CisJCQltYXRjaCA9IGZhbHNlOworCQkJZ290byBvdXRfcHV0X2NwOworCQl9CisKKwlpZiAoZGF0YS0+Yml0bWFzayAmIFhUX0lQVlNfVkFERFIpIHsKKwkJaWYgKGlwdnNfbXRfYWRkcmNtcCgmY3AtPnZhZGRyLCAmZGF0YS0+dmFkZHIsCisJCQkJICAgICZkYXRhLT52bWFzaywgZmFtaWx5KSBeCisJCSAgICAhKGRhdGEtPmludmVydCAmIFhUX0lQVlNfVkFERFIpKSB7CisJCQltYXRjaCA9IGZhbHNlOworCQkJZ290byBvdXRfcHV0X2NwOworCQl9CisJfQorCitvdXRfcHV0X2NwOgorCV9faXBfdnNfY29ubl9wdXQoY3ApOworb3V0OgorCXByX2RlYnVnKCJtYXRjaD0lZFxuIiwgbWF0Y2gpOworCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIGludCBpcHZzX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCWlmIChwYXItPmZhbWlseSAhPSBORlBST1RPX0lQVjQKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCSAgICAmJiBwYXItPmZhbWlseSAhPSBORlBST1RPX0lQVjYKKyNlbmRpZgorCQkpIHsKKwkJcHJfaW5mbygicHJvdG9jb2wgZmFtaWx5ICV1IG5vdCBzdXBwb3J0ZWRcbiIsIHBhci0+ZmFtaWx5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggeHRfaXB2c19tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJpcHZzIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkubWF0Y2ggICAgICA9IGlwdnNfbXQsCisJLmNoZWNrZW50cnkgPSBpcHZzX210X2NoZWNrLAorCS5tYXRjaHNpemUgID0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9pcHZzX210aW5mbykpLAorCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcHZzX210X2luaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnh0X2lwdnNfbXRfcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwdnNfbXRfZXhpdCh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnh0X2lwdnNfbXRfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaXB2c19tdF9pbml0KTsKK21vZHVsZV9leGl0KGlwdnNfbXRfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMKaW5kZXggYjRmN2RmZS4uNzBlYjJiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9xdW90YS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEuYwpAQCAtMTEsNyArMTEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9xdW90YS5oPgogCiBzdHJ1Y3QgeHRfcXVvdGFfcHJpdiB7Ci0JdWludDY0X3QgcXVvdGE7CisJc3BpbmxvY2tfdAlsb2NrOworCXVpbnQ2NF90CXF1b3RhOwogfTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMjAsOCArMjEsNiBAQAogTU9EVUxFX0FMSUFTKCJpcHRfcXVvdGEiKTsKIE1PRFVMRV9BTElBUygiaXA2dF9xdW90YSIpOwogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHF1b3RhX2xvY2spOwotCiBzdGF0aWMgYm9vbAogcXVvdGFfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewpAQCAtMjksNyArMjgsNyBAQAogCXN0cnVjdCB4dF9xdW90YV9wcml2ICpwcml2ID0gcS0+bWFzdGVyOwogCWJvb2wgcmV0ID0gcS0+ZmxhZ3MgJiBYVF9RVU9UQV9JTlZFUlQ7CiAKLQlzcGluX2xvY2tfYmgoJnF1b3RhX2xvY2spOworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CiAJaWYgKHByaXYtPnF1b3RhID49IHNrYi0+bGVuKSB7CiAJCXByaXYtPnF1b3RhIC09IHNrYi0+bGVuOwogCQlyZXQgPSAhcmV0OwpAQCAtMzcsOSArMzYsNyBAQAogCQkvKiB3ZSBkbyBub3QgYWxsb3cgZXZlbiBzbWFsbCBwYWNrZXRzIGZyb20gbm93IG9uICovCiAJCXByaXYtPnF1b3RhID0gMDsKIAl9Ci0JLyogQ29weSBxdW90YSBiYWNrIHRvIG1hdGNoaW5mbyBzbyB0aGF0IGlwdGFibGVzIGNhbiBkaXNwbGF5IGl0ICovCi0JcS0+cXVvdGEgPSBwcml2LT5xdW90YTsKLQlzcGluX3VubG9ja19iaCgmcXVvdGFfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU1LDYgKzUyLDcgQEAKIAlpZiAocS0+bWFzdGVyID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJc3Bpbl9sb2NrX2luaXQoJnEtPm1hc3Rlci0+bG9jayk7CiAJcS0+bWFzdGVyLT5xdW90YSA9IHEtPnF1b3RhOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zY3RwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYwppbmRleCBjMDRmY2YzLi5lZjM2YTU2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYwpAQCAtMyw2ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KICNpbmNsdWRlIDxsaW51eC9zY3RwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KQEAgLTY3LDcgKzY4LDcgQEAKIAkJCSArK2ksIG9mZnNldCwgc2NoLT50eXBlLCBodG9ucyhzY2gtPmxlbmd0aCksCiAJCQkgc2NoLT5mbGFncyk7CiAjZW5kaWYKLQkJb2Zmc2V0ICs9IChudG9ocyhzY2gtPmxlbmd0aCkgKyAzKSAmIH4zOworCQlvZmZzZXQgKz0gV09SRF9ST1VORChudG9ocyhzY2gtPmxlbmd0aCkpOwogCiAJCXByX2RlYnVnKCJza2ItPmxlbjogJWRcdG9mZnNldDogJWRcbiIsIHNrYi0+bGVuLCBvZmZzZXQpOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jIGIvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYwppbmRleCAzZDU0YzIzLi4xY2E4OTkwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCSAqIHJlcGx5IHBhY2tldCBvZiBhbiBlc3RhYmxpc2hlZCBTTkFULXRlZCBjb25uZWN0aW9uLiAqLwogCiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoY3QgJiYgKGN0ICE9ICZuZl9jb25udHJhY2tfdW50cmFja2VkKSAmJgorCWlmIChjdCAmJiAhbmZfY3RfaXNfdW50cmFja2VkKGN0KSAmJgogCSAgICAoKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JQ01QICYmCiAJICAgICAgY3RpbmZvID09IElQX0NUX0lTX1JFUExZICsgSVBfQ1RfRVNUQUJMSVNIRUQpIHx8CiAJICAgICAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVAgJiYKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYwppbmRleCBlMTJlMDUzLi5hNTA3OTIyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCkBAIC0yNiwxNCArMjYsMTYgQEAKIAljb25zdCBzdHJ1Y3QgeHRfc3RhdGVfaW5mbyAqc2luZm8gPSBwYXItPm1hdGNoaW5mbzsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CisJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CiAKLQlpZiAobmZfY3RfaXNfdW50cmFja2VkKHNrYikpCi0JCXN0YXRlYml0ID0gWFRfU1RBVEVfVU5UUkFDS0VEOwotCWVsc2UgaWYgKCFuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKSkKKwlpZiAoIWN0KQogCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX0lOVkFMSUQ7Ci0JZWxzZQotCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX0JJVChjdGluZm8pOwotCisJZWxzZSB7CisJCWlmIChuZl9jdF9pc191bnRyYWNrZWQoY3QpKQorCQkJc3RhdGViaXQgPSBYVF9TVEFURV9VTlRSQUNLRUQ7CisJCWVsc2UKKwkJCXN0YXRlYml0ID0gWFRfU1RBVEVfQklUKGN0aW5mbyk7CisJfQogCXJldHVybiAoc2luZm8tPnN0YXRlbWFzayAmIHN0YXRlYml0KTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmMKaW5kZXggOTZlNjJiOC4uNDJlY2I3MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIHN0cnVjdCB4dF9zdGF0aXN0aWNfcHJpdiB7Ci0JdWludDMyX3QgY291bnQ7Ci19OworCWF0b21pY190IGNvdW50OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKQEAgLTI3LDEzICsyNywxMiBAQAogTU9EVUxFX0FMSUFTKCJpcHRfc3RhdGlzdGljIik7CiBNT0RVTEVfQUxJQVMoImlwNnRfc3RhdGlzdGljIik7CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnRoX2xvY2spOwotCiBzdGF0aWMgYm9vbAogc3RhdGlzdGljX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKIHsKIAljb25zdCBzdHJ1Y3QgeHRfc3RhdGlzdGljX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAlib29sIHJldCA9IGluZm8tPmZsYWdzICYgWFRfU1RBVElTVElDX0lOVkVSVDsKKwlpbnQgbnZhbCwgb3ZhbDsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewogCWNhc2UgWFRfU1RBVElTVElDX01PREVfUkFORE9NOgpAQCAtNDEsMTIgKzQwLDEyIEBACiAJCQlyZXQgPSAhcmV0OwogCQlicmVhazsKIAljYXNlIFhUX1NUQVRJU1RJQ19NT0RFX05USDoKLQkJc3Bpbl9sb2NrX2JoKCZudGhfbG9jayk7Ci0JCWlmIChpbmZvLT5tYXN0ZXItPmNvdW50KysgPT0gaW5mby0+dS5udGguZXZlcnkpIHsKLQkJCWluZm8tPm1hc3Rlci0+Y291bnQgPSAwOworCQlkbyB7CisJCQlvdmFsID0gYXRvbWljX3JlYWQoJmluZm8tPm1hc3Rlci0+Y291bnQpOworCQkJbnZhbCA9IChvdmFsID09IGluZm8tPnUubnRoLmV2ZXJ5KSA/IDAgOiBvdmFsICsgMTsKKwkJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJmluZm8tPm1hc3Rlci0+Y291bnQsIG92YWwsIG52YWwpICE9IG92YWwpOworCQlpZiAobnZhbCA9PSAwKQogCQkJcmV0ID0gIXJldDsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmbnRoX2xvY2spOwogCQlicmVhazsKIAl9CiAKQEAgLTY0LDcgKzYzLDcgQEAKIAlpbmZvLT5tYXN0ZXIgPSBremFsbG9jKHNpemVvZigqaW5mby0+bWFzdGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGluZm8tPm1hc3RlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpbmZvLT5tYXN0ZXItPmNvdW50ID0gaW5mby0+dS5udGguY291bnQ7CisJYXRvbWljX3NldCgmaW5mby0+bWFzdGVyLT5jb3VudCwgaW5mby0+dS5udGguY291bnQpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggYTJlYjk2NS4uMmNiZjM4MCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtMTA3NiwxNCArMTA3NiwxNSBAQAogCXNrX2Zvcl9lYWNoX2JvdW5kKHNrLCBub2RlLCAmbmxfdGFibGVbc3NrLT5za19wcm90b2NvbF0ubWNfbGlzdCkKIAkJZG9fb25lX2Jyb2FkY2FzdChzaywgJmluZm8pOwogCi0Ja2ZyZWVfc2tiKHNrYik7CisJY29uc3VtZV9za2Ioc2tiKTsKIAogCW5ldGxpbmtfdW5sb2NrX3RhYmxlKCk7CiAKLQlrZnJlZV9za2IoaW5mby5za2IyKTsKLQotCWlmIChpbmZvLmRlbGl2ZXJ5X2ZhaWx1cmUpCisJaWYgKGluZm8uZGVsaXZlcnlfZmFpbHVyZSkgeworCQlrZnJlZV9za2IoaW5mby5za2IyKTsKIAkJcmV0dXJuIC1FTk9CVUZTOworCX0gZWxzZQorCQljb25zdW1lX3NrYihpbmZvLnNrYjIpOwogCiAJaWYgKGluZm8uZGVsaXZlcmVkKSB7CiAJCWlmIChpbmZvLmNvbmdlc3RlZCAmJiAoYWxsb2NhdGlvbiAmIF9fR0ZQX1dBSVQpKQpAQCAtMTMyMywxOSArMTMyNCwyMyBAQAogCWlmIChtc2ctPm1zZ19mbGFncyZNU0dfT09CKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoTlVMTCA9PSBzaW9jYi0+c2NtKQorCWlmIChOVUxMID09IHNpb2NiLT5zY20pIHsKIAkJc2lvY2ItPnNjbSA9ICZzY207CisJCW1lbXNldCgmc2NtLCAwLCBzaXplb2Yoc2NtKSk7CisJfQogCWVyciA9IHNjbV9zZW5kKHNvY2ssIG1zZywgc2lvY2ItPnNjbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlpZiAobXNnLT5tc2dfbmFtZWxlbikgeworCQllcnIgPSAtRUlOVkFMOwogCQlpZiAoYWRkci0+bmxfZmFtaWx5ICE9IEFGX05FVExJTkspCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OwogCQlkc3RfcGlkID0gYWRkci0+bmxfcGlkOwogCQlkc3RfZ3JvdXAgPSBmZnMoYWRkci0+bmxfZ3JvdXBzKTsKKwkJZXJyID0gIC1FUEVSTTsKIAkJaWYgKGRzdF9ncm91cCAmJiAhbmV0bGlua19jYXBhYmxlKHNvY2ssIE5MX05PTlJPT1RfU0VORCkpCi0JCQlyZXR1cm4gLUVQRVJNOworCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKIAkJZHN0X3BpZCA9IG5say0+ZHN0X3BpZDsKIAkJZHN0X2dyb3VwID0gbmxrLT5kc3RfZ3JvdXA7CkBAIC0xMzg3LDYgKzEzOTIsNyBAQAogCWVyciA9IG5ldGxpbmtfdW5pY2FzdChzaywgc2tiLCBkc3RfcGlkLCBtc2ctPm1zZ19mbGFncyZNU0dfRE9OVFdBSVQpOwogCiBvdXQ6CisJc2NtX2Rlc3Ryb3koc2lvY2ItPnNjbSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTQwMCw3ICsxNDA2LDcgQEAKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCWludCBub2Jsb2NrID0gZmxhZ3MmTVNHX0RPTlRXQUlUOwogCXNpemVfdCBjb3BpZWQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKmZyYWcgX19tYXliZV91bnVzZWQgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVycjsKIAogCWlmIChmbGFncyZNU0dfT09CKQpAQCAtMTQzNSw3ICsxNDQxLDIxIEBACiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXNrYiA9IGNvbXBza2I7CiAJCX0gZWxzZSB7Ci0JCQlmcmFnID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisJCQkvKgorCQkJICogQmVmb3JlIHNldHRpbmcgZnJhZ19saXN0IHRvIE5VTEwsIHdlIG11c3QgZ2V0IGEKKwkJCSAqIHByaXZhdGUgY29weSBvZiBza2IgaWYgc2hhcmVkIChiZWNhdXNlIG9mIE1TR19QRUVLKQorCQkJICovCisJCQlpZiAoc2tiX3NoYXJlZChza2IpKSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisKKwkJCQluc2tiID0gcHNrYl9jb3B5KHNrYiwgR0ZQX0tFUk5FTCk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJc2tiID0gbnNrYjsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWlmICghc2tiKQorCQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWtmcmVlX3NrYihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCk7CiAJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CiAJCX0KIAl9CkBAIC0xNDcyLDEwICsxNDkyLDYgQEAKIAlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCiAJCWNvcGllZCA9IHNrYi0+bGVuOwogCi0jaWZkZWYgQ09ORklHX0NPTVBBVF9ORVRMSU5LX01FU1NBR0VTCi0Jc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPSBmcmFnOwotI2VuZGlmCi0KIAlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKIAogCWlmIChubGstPmNiICYmIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gc2stPnNrX3JjdmJ1ZiAvIDIpCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCmluZGV4IGFhNDMwOGEuLjI2ZWQzZTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCkBAIC0zMDMsNiArMzAzLDcgQEAKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChnZW5sX3JlZ2lzdGVyX29wcyk7CiAKIC8qKgogICogZ2VubF91bnJlZ2lzdGVyX29wcyAtIHVucmVnaXN0ZXIgZ2VuZXJpYyBuZXRsaW5rIG9wZXJhdGlvbnMKQEAgLTMzNyw2ICszMzgsNyBAQAogCiAJcmV0dXJuIC1FTk9FTlQ7CiB9CitFWFBPUlRfU1lNQk9MKGdlbmxfdW5yZWdpc3Rlcl9vcHMpOwogCiAvKioKICAqIGdlbmxfcmVnaXN0ZXJfZmFtaWx5IC0gcmVnaXN0ZXIgYSBnZW5lcmljIG5ldGxpbmsgZmFtaWx5CkBAIC00MDUsNiArNDA3LDcgQEAKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChnZW5sX3JlZ2lzdGVyX2ZhbWlseSk7CiAKIC8qKgogICogZ2VubF9yZWdpc3Rlcl9mYW1pbHlfd2l0aF9vcHMgLSByZWdpc3RlciBhIGdlbmVyaWMgbmV0bGluayBmYW1pbHkKQEAgLTQ4NSw2ICs0ODgsNyBAQAogCiAJcmV0dXJuIC1FTk9FTlQ7CiB9CitFWFBPUlRfU1lNQk9MKGdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkpOwogCiBzdGF0aWMgaW50IGdlbmxfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKIHsKQEAgLTg3MywxMSArODc3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgR0VOTF9GQU1fVEFCX1NJWkU7IGkrKykKIAkJSU5JVF9MSVNUX0hFQUQoJmZhbWlseV9odFtpXSk7CiAKLQllcnIgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseSgmZ2VubF9jdHJsKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBwcm9ibGVtOwotCi0JZXJyID0gZ2VubF9yZWdpc3Rlcl9vcHMoJmdlbmxfY3RybCwgJmdlbmxfY3RybF9vcHMpOworCWVyciA9IGdlbmxfcmVnaXN0ZXJfZmFtaWx5X3dpdGhfb3BzKCZnZW5sX2N0cmwsICZnZW5sX2N0cmxfb3BzLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBwcm9ibGVtOwogCkBAIC04OTksMTEgKzg5OSw2IEBACiAKIHN1YnN5c19pbml0Y2FsbChnZW5sX2luaXQpOwogCi1FWFBPUlRfU1lNQk9MKGdlbmxfcmVnaXN0ZXJfb3BzKTsKLUVYUE9SVF9TWU1CT0woZ2VubF91bnJlZ2lzdGVyX29wcyk7Ci1FWFBPUlRfU1lNQk9MKGdlbmxfcmVnaXN0ZXJfZmFtaWx5KTsKLUVYUE9SVF9TWU1CT0woZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSk7Ci0KIHN0YXRpYyBpbnQgZ2VubG1zZ19tY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1bnNpZ25lZCBsb25nIGdyb3VwLAogCQkJIGdmcF90IGZsYWdzKQogewpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggMjA3OGEyNy4uOWExN2YyOCAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC04Myw2ICs4Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldF90c3RhbXAuaD4KIAogI2lmZGVmIENPTkZJR19JTkVUCiAjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CkBAIC0yMDIsNiArMjAzLDcgQEAKIAl1bnNpZ25lZCBpbnQJCXRwX2hkcmxlbjsKIAl1bnNpZ25lZCBpbnQJCXRwX3Jlc2VydmU7CiAJdW5zaWduZWQgaW50CQl0cF9sb3NzOjE7CisJdW5zaWduZWQgaW50CQl0cF90c3RhbXA7CiAJc3RydWN0IHBhY2tldF90eXBlCXByb3RfaG9vayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogfTsKIApAQCAtNjU2LDYgKzY1OCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gTlVMTDsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHNrYl9zaGFyZWRfaHd0c3RhbXBzICpzaGh3dHN0YW1wcyA9IHNrYl9od3RzdGFtcHMoc2tiKTsKIAogCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSykKIAkJZ290byBkcm9wOwpAQCAtNzM3LDcgKzc0MCwxMyBAQAogCQloLmgxLT50cF9zbmFwbGVuID0gc25hcGxlbjsKIAkJaC5oMS0+dHBfbWFjID0gbWFjb2ZmOwogCQloLmgxLT50cF9uZXQgPSBuZXRvZmY7Ci0JCWlmIChza2ItPnRzdGFtcC50djY0KQorCQlpZiAoKHBvLT50cF90c3RhbXAgJiBTT0ZfVElNRVNUQU1QSU5HX1NZU19IQVJEV0FSRSkKKwkJCQkmJiBzaGh3dHN0YW1wcy0+c3lzdHN0YW1wLnR2NjQpCisJCQl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2hod3RzdGFtcHMtPnN5c3RzdGFtcCk7CisJCWVsc2UgaWYgKChwby0+dHBfdHN0YW1wICYgU09GX1RJTUVTVEFNUElOR19SQVdfSEFSRFdBUkUpCisJCQkJJiYgc2hod3RzdGFtcHMtPmh3dHN0YW1wLnR2NjQpCisJCQl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2hod3RzdGFtcHMtPmh3dHN0YW1wKTsKKwkJZWxzZSBpZiAoc2tiLT50c3RhbXAudHY2NCkKIAkJCXR2ID0ga3RpbWVfdG9fdGltZXZhbChza2ItPnRzdGFtcCk7CiAJCWVsc2UKIAkJCWRvX2dldHRpbWVvZmRheSgmdHYpOwpAQCAtNzUwLDcgKzc1OSwxMyBAQAogCQloLmgyLT50cF9zbmFwbGVuID0gc25hcGxlbjsKIAkJaC5oMi0+dHBfbWFjID0gbWFjb2ZmOwogCQloLmgyLT50cF9uZXQgPSBuZXRvZmY7Ci0JCWlmIChza2ItPnRzdGFtcC50djY0KQorCQlpZiAoKHBvLT50cF90c3RhbXAgJiBTT0ZfVElNRVNUQU1QSU5HX1NZU19IQVJEV0FSRSkKKwkJCQkmJiBzaGh3dHN0YW1wcy0+c3lzdHN0YW1wLnR2NjQpCisJCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHNoaHd0c3RhbXBzLT5zeXN0c3RhbXApOworCQllbHNlIGlmICgocG8tPnRwX3RzdGFtcCAmIFNPRl9USU1FU1RBTVBJTkdfUkFXX0hBUkRXQVJFKQorCQkJCSYmIHNoaHd0c3RhbXBzLT5od3RzdGFtcC50djY0KQorCQkJdHMgPSBrdGltZV90b190aW1lc3BlYyhzaGh3dHN0YW1wcy0+aHd0c3RhbXApOworCQllbHNlIGlmIChza2ItPnRzdGFtcC50djY0KQogCQkJdHMgPSBrdGltZV90b190aW1lc3BlYyhza2ItPnRzdGFtcCk7CiAJCWVsc2UKIAkJCWdldG5zdGltZW9mZGF5KCZ0cyk7CkBAIC0yMDI3LDYgKzIwNDIsMTggQEAKIAkJcG8tPmhhc192bmV0X2hkciA9ICEhdmFsOwogCQlyZXR1cm4gMDsKIAl9CisJY2FzZSBQQUNLRVRfVElNRVNUQU1QOgorCXsKKwkJaW50IHZhbDsKKworCQlpZiAob3B0bGVuICE9IHNpemVvZih2YWwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBvcHR2YWwsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXBvLT50cF90c3RhbXAgPSB2YWw7CisJCXJldHVybiAwOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KQEAgLTIxMTksNiArMjE0NiwxMiBAQAogCQl2YWwgPSBwby0+dHBfbG9zczsKIAkJZGF0YSA9ICZ2YWw7CiAJCWJyZWFrOworCWNhc2UgUEFDS0VUX1RJTUVTVEFNUDoKKwkJaWYgKGxlbiA+IHNpemVvZihpbnQpKQorCQkJbGVuID0gc2l6ZW9mKGludCk7CisJCXZhbCA9IHBvLT50cF90c3RhbXA7CisJCWRhdGEgPSAmdmFsOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvcG5fZGV2LmMgYi9uZXQvcGhvbmV0L3BuX2Rldi5jCmluZGV4IGMzM2RhNjUuLmIxOGU0OGYgMTAwNjQ0Ci0tLSBhL25ldC9waG9uZXQvcG5fZGV2LmMKKysrIGIvbmV0L3Bob25ldC9wbl9kZXYuYwpAQCAtMTYyLDYgKzE2MiwxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIHBob25ldF9kZXZpY2VfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBwaG9uZXRfZGV2aWNlICpwbmQ7CisKKwlwbmQgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBob25ldF9kZXZpY2UsIHJjdSk7CisJa2ZyZWUocG5kKTsKK30KKwogaW50IHBob25ldF9hZGRyZXNzX2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyKQogewogCXN0cnVjdCBwaG9uZXRfZGV2aWNlX2xpc3QgKnBuZGV2cyA9IHBob25ldF9kZXZpY2VfbGlzdChkZXZfbmV0KGRldikpOwpAQCAtMTc5LDEwICsxODcsOSBAQAogCQlwbmQgPSBOVUxMOwogCW11dGV4X3VubG9jaygmcG5kZXZzLT5sb2NrKTsKIAotCWlmIChwbmQpIHsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtmcmVlKHBuZCk7Ci0JfQorCWlmIChwbmQpCisJCWNhbGxfcmN1KCZwbmQtPnJjdSwgcGhvbmV0X2RldmljZV9yY3VfZnJlZSk7CisKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKaW5kZXggY2JjMjQ0YTEuLmI0ZmRhYWMgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYworKysgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKQEAgLTEwOSw3ICsxMDksOSBAQAogCQlpbml0X3RpbWVyKCZyb3NlX25laWdoLT50MHRpbWVyKTsKIAogCQlpZiAocm9zZV9yb3V0ZS0+bmRpZ2lzICE9IDApIHsKLQkJCWlmICgocm9zZV9uZWlnaC0+ZGlnaXBlYXQgPSBrbWFsbG9jKHNpemVvZihheDI1X2RpZ2kpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJcm9zZV9uZWlnaC0+ZGlnaXBlYXQgPQorCQkJCWttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpOworCQkJaWYgKHJvc2VfbmVpZ2gtPmRpZ2lwZWF0ID09IE5VTEwpIHsKIAkJCQlrZnJlZShyb3NlX25laWdoKTsKIAkJCQlyZXMgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXBlZXIuYyBiL25ldC9yeHJwYy9hci1wZWVyLmMKaW5kZXggZjBmODViMC4uOWYxNzI5YiAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FyLXBlZXIuYworKysgYi9uZXQvcnhycGMvYXItcGVlci5jCkBAIC02NCw4ICs2NCw4IEBACiAJCXJldHVybjsKIAl9CiAKLQlwZWVyLT5pZl9tdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCXBlZXItPmlmX210dSA9IGRzdF9tdHUoJnJ0LT5kc3QpOworCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAogCV9sZWF2ZSgiIFtpZl9tdHUgJXVdIiwgcGVlci0+aWZfbXR1KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IDk3MjM3OGYuLjIzYjI1ZjggMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtMjYsNiArMjYsMTEgQEAKICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKK3N0YXRpYyB2b2lkIHRjZl9jb21tb25fZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGNmX2NvbW1vbiwgdGNmY19yY3UpKTsKK30KKwogdm9pZCB0Y2ZfaGFzaF9kZXN0cm95KHN0cnVjdCB0Y2ZfY29tbW9uICpwLCBzdHJ1Y3QgdGNmX2hhc2hpbmZvICpoaW5mbykKIHsKIAl1bnNpZ25lZCBpbnQgaCA9IHRjZl9oYXNoKHAtPnRjZmNfaW5kZXgsIGhpbmZvLT5obWFzayk7CkBAIC0zOCw3ICs0MywxMSBAQAogCQkJd3JpdGVfdW5sb2NrX2JoKGhpbmZvLT5sb2NrKTsKIAkJCWdlbl9raWxsX2VzdGltYXRvcigmcC0+dGNmY19ic3RhdHMsCiAJCQkJCSAgICZwLT50Y2ZjX3JhdGVfZXN0KTsKLQkJCWtmcmVlKHApOworCQkJLyoKKwkJCSAqIGdlbl9lc3RpbWF0b3IgZXN0X3RpbWVyKCkgbWlnaHQgYWNjZXNzIHAtPnRjZmNfbG9jaworCQkJICogb3IgYnN0YXRzLCB3YWl0IGEgUkNVIGdyYWNlIHBlcmlvZCBiZWZvcmUgZnJlZWluZyBwCisJCQkgKi8KKwkJCWNhbGxfcmN1KCZwLT50Y2ZjX3JjdSwgdGNmX2NvbW1vbl9mcmVlX3JjdSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwppbmRleCBjMGI2ODYzLi4xMWYxOTVhIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCisrKyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKQEAgLTMzLDYgKzMzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdGNmX2NvbW1vbiAqdGNmX21pcnJlZF9odFtNSVJSRURfVEFCX01BU0sgKyAxXTsKIHN0YXRpYyB1MzIgbWlycmVkX2lkeF9nZW47CiBzdGF0aWMgREVGSU5FX1JXTE9DSyhtaXJyZWRfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKG1pcnJlZF9saXN0KTsKIAogc3RhdGljIHN0cnVjdCB0Y2ZfaGFzaGluZm8gbWlycmVkX2hhc2hfaW5mbyA9IHsKIAkuaHRhYgk9CXRjZl9taXJyZWRfaHQsCkBAIC00Nyw3ICs0OCw5IEBACiAJCQltLT50Y2ZfYmluZGNudC0tOwogCQltLT50Y2ZfcmVmY250LS07CiAJCWlmKCFtLT50Y2ZfYmluZGNudCAmJiBtLT50Y2ZfcmVmY250IDw9IDApIHsKLQkJCWRldl9wdXQobS0+dGNmbV9kZXYpOworCQkJbGlzdF9kZWwoJm0tPnRjZm1fbGlzdCk7CisJCQlpZiAobS0+dGNmbV9kZXYpCisJCQkJZGV2X3B1dChtLT50Y2ZtX2Rldik7CiAJCQl0Y2ZfaGFzaF9kZXN0cm95KCZtLT5jb21tb24sICZtaXJyZWRfaGFzaF9pbmZvKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMzQsOCArMTM3LDEwIEBACiAJCW0tPnRjZm1fb2tfcHVzaCA9IG9rX3B1c2g7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZtLT50Y2ZfbG9jayk7Ci0JaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQorCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkgeworCQlsaXN0X2FkZCgmbS0+dGNmbV9saXN0LCAmbWlycmVkX2xpc3QpOwogCQl0Y2ZfaGFzaF9pbnNlcnQocGMsICZtaXJyZWRfaGFzaF9pbmZvKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYwLDIyICsxNjUsMjcgQEAKIAogCXNwaW5fbG9jaygmbS0+dGNmX2xvY2spOwogCW0tPnRjZl90bS5sYXN0dXNlID0gamlmZmllczsKKwltLT50Y2ZfYnN0YXRzLmJ5dGVzICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKKwltLT50Y2ZfYnN0YXRzLnBhY2tldHMrKzsKIAogCWRldiA9IG0tPnRjZm1fZGV2OworCWlmICghZGV2KSB7CisJCXByaW50a19vbmNlKEtFUk5fTk9USUNFICJ0YyBtaXJyZWQ6IHRhcmdldCBkZXZpY2UgaXMgZ29uZVxuIik7CisJCWdvdG8gb3V0OworCX0KKwogCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcl9ub3RpY2UoInRjIG1pcnJlZCB0byBIb3VzdG9uOiBkZXZpY2UgJXMgaXMgZ29uZSFcbiIsCisJCQlwcl9ub3RpY2UoInRjIG1pcnJlZCB0byBIb3VzdG9uOiBkZXZpY2UgJXMgaXMgZG93blxuIiwKIAkJCQkgIGRldi0+bmFtZSk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXNrYjIgPSBza2JfYWN0X2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJYXQgPSBHX1RDX0FUKHNrYi0+dGNfdmVyZCk7CisJc2tiMiA9IHNrYl9hY3RfY2xvbmUoc2tiLCBHRlBfQVRPTUlDLCBtLT50Y2ZfYWN0aW9uKTsKIAlpZiAoc2tiMiA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCW0tPnRjZl9ic3RhdHMuYnl0ZXMgKz0gcWRpc2NfcGt0X2xlbihza2IyKTsKLQltLT50Y2ZfYnN0YXRzLnBhY2tldHMrKzsKLQlhdCA9IEdfVENfQVQoc2tiLT50Y192ZXJkKTsKIAlpZiAoIShhdCAmIEFUX0VHUkVTUykpIHsKIAkJaWYgKG0tPnRjZm1fb2tfcHVzaCkKIAkJCXNrYl9wdXNoKHNrYjIsIHNrYjItPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKQEAgLTE4NSwxNiArMTk1LDE0IEBACiAJaWYgKG0tPnRjZm1fZWFjdGlvbiAhPSBUQ0FfRUdSRVNTX01JUlJPUikKIAkJc2tiMi0+dGNfdmVyZCA9IFNFVF9UQ19GUk9NKHNrYjItPnRjX3ZlcmQsIGF0KTsKIAotCXNrYjItPmRldiA9IGRldjsKIAlza2IyLT5za2JfaWlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CisJc2tiMi0+ZGV2ID0gZGV2OwogCWRldl9xdWV1ZV94bWl0KHNrYjIpOwogCWVyciA9IDA7CiAKIG91dDoKIAlpZiAoZXJyKSB7CiAJCW0tPnRjZl9xc3RhdHMub3ZlcmxpbWl0cysrOwotCQltLT50Y2ZfYnN0YXRzLmJ5dGVzICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKLQkJbS0+dGNmX2JzdGF0cy5wYWNrZXRzKys7CiAJCS8qIHNob3VsZCB3ZSBiZSBhc2tpbmcgZm9yIHBhY2tldCB0byBiZSBkcm9wcGVkPwogCQkgKiBtYXkgbWFrZSBzZW5zZSBmb3IgcmVkaXJlY3QgY2FzZSBvbmx5CiAJCSAqLwpAQCAtMjMyLDYgKzI0MCwyOCBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGludCBtaXJyZWRfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCXN0cnVjdCB0Y2ZfbWlycmVkICptOworCisJaWYgKGV2ZW50ID09IE5FVERFVl9VTlJFR0lTVEVSKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZtaXJyZWRfbGlzdCwgdGNmbV9saXN0KSB7CisJCQlpZiAobS0+dGNmbV9kZXYgPT0gZGV2KSB7CisJCQkJZGV2X3B1dChkZXYpOworCQkJCW0tPnRjZm1fZGV2ID0gTlVMTDsKKwkJCX0KKwkJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1pcnJlZF9kZXZpY2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBtaXJyZWRfZGV2aWNlX2V2ZW50LAorfTsKKworCiBzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X21pcnJlZF9vcHMgPSB7CiAJLmtpbmQJCT0JIm1pcnJlZCIsCiAJLmhpbmZvCQk9CSZtaXJyZWRfaGFzaF9pbmZvLApAQCAtMjUyLDEyICsyODIsMTcgQEAKIAogc3RhdGljIGludCBfX2luaXQgbWlycmVkX2luaXRfbW9kdWxlKHZvaWQpCiB7CisJaW50IGVyciA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWlycmVkX2RldmljZV9ub3RpZmllcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCXByX2luZm8oIk1pcnJvci9yZWRpcmVjdCBhY3Rpb24gb25cbiIpOwogCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtaXJyZWRfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWlycmVkX2RldmljZV9ub3RpZmllcik7CiAJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfbmF0LmMgYi9uZXQvc2NoZWQvYWN0X25hdC5jCmluZGV4IDcyNDU1M2UuLmQwMzg2YTQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfbmF0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9uYXQuYwpAQCAtMjE4LDYgKzIxOCw3IEBACiAJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlobCArIHNpemVvZigqaWNtcGgpICsgc2l6ZW9mKCppcGgpKSkKIAkJCWdvdG8gZHJvcDsKIAorCQlpY21waCA9ICh2b2lkICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaWhsKTsKIAkJaXBoID0gKHZvaWQgKikoaWNtcGggKyAxKTsKIAkJaWYgKGVncmVzcykKIAkJCWFkZHIgPSBpcGgtPmRhZGRyOwpAQCAtMjQ2LDcgKzI0Nyw3IEBACiAJCQlpcGgtPnNhZGRyID0gbmV3X2FkZHI7CiAKIAkJaW5ldF9wcm90b19jc3VtX3JlcGxhY2U0KCZpY21waC0+Y2hlY2tzdW0sIHNrYiwgYWRkciwgbmV3X2FkZHIsCi0JCQkJCSAxKTsKKwkJCQkJIDApOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKQEAgLTI2OCw0MCArMjY5LDI5IEBACiB7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX25hdCAqcCA9IGEtPnByaXY7Ci0Jc3RydWN0IHRjX25hdCAqb3B0OworCXN0cnVjdCB0Y19uYXQgb3B0OwogCXN0cnVjdCB0Y2ZfdCB0OwotCWludCBzOwogCi0JcyA9IHNpemVvZigqb3B0KTsKKwlvcHQub2xkX2FkZHIgPSBwLT5vbGRfYWRkcjsKKwlvcHQubmV3X2FkZHIgPSBwLT5uZXdfYWRkcjsKKwlvcHQubWFzayA9IHAtPm1hc2s7CisJb3B0LmZsYWdzID0gcC0+ZmxhZ3M7CiAKLQkvKiBuZXRsaW5rIHNwaW5sb2NrcyBoZWxkIGFib3ZlIHVzIC0gbXVzdCB1c2UgQVRPTUlDICovCi0Jb3B0ID0ga3phbGxvYyhzLCBHRlBfQVRPTUlDKTsKLQlpZiAodW5saWtlbHkoIW9wdCkpCi0JCXJldHVybiAtRU5PQlVGUzsKKwlvcHQuaW5kZXggPSBwLT50Y2ZfaW5kZXg7CisJb3B0LmFjdGlvbiA9IHAtPnRjZl9hY3Rpb247CisJb3B0LnJlZmNudCA9IHAtPnRjZl9yZWZjbnQgLSByZWY7CisJb3B0LmJpbmRjbnQgPSBwLT50Y2ZfYmluZGNudCAtIGJpbmQ7CiAKLQlvcHQtPm9sZF9hZGRyID0gcC0+b2xkX2FkZHI7Ci0Jb3B0LT5uZXdfYWRkciA9IHAtPm5ld19hZGRyOwotCW9wdC0+bWFzayA9IHAtPm1hc2s7Ci0Jb3B0LT5mbGFncyA9IHAtPmZsYWdzOwotCi0Jb3B0LT5pbmRleCA9IHAtPnRjZl9pbmRleDsKLQlvcHQtPmFjdGlvbiA9IHAtPnRjZl9hY3Rpb247Ci0Jb3B0LT5yZWZjbnQgPSBwLT50Y2ZfcmVmY250IC0gcmVmOwotCW9wdC0+YmluZGNudCA9IHAtPnRjZl9iaW5kY250IC0gYmluZDsKLQotCU5MQV9QVVQoc2tiLCBUQ0FfTkFUX1BBUk1TLCBzLCBvcHQpOworCU5MQV9QVVQoc2tiLCBUQ0FfTkFUX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCk7CiAJdC5pbnN0YWxsID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50Y2ZfdG0uaW5zdGFsbCk7CiAJdC5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50Y2ZfdG0ubGFzdHVzZSk7CiAJdC5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRjZl90bS5leHBpcmVzKTsKIAlOTEFfUFVUKHNrYiwgVENBX05BVF9UTSwgc2l6ZW9mKHQpLCAmdCk7CiAKLQlrZnJlZShvcHQpOwotCiAJcmV0dXJuIHNrYi0+bGVuOwogCiBubGFfcHV0X2ZhaWx1cmU6CiAJbmxtc2dfdHJpbShza2IsIGIpOwotCWtmcmVlKG9wdCk7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BlZGl0LmMgYi9uZXQvc2NoZWQvYWN0X3BlZGl0LmMKaW5kZXggNTBlM2Q5NC4uYTA1OTNjOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9wZWRpdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfcGVkaXQuYwpAQCAtMTI3LDggKzEyNyw3IEBACiAJaW50IGksIG11bmdlZCA9IDA7CiAJdW5zaWduZWQgaW50IG9mZjsKIAotCWlmICghKHNrYi0+dGNfdmVyZCAmIFRDX09LMk1VTkdFKSkgewotCQkvKiBzaG91bGQgd2Ugc2V0IHNrYi0+Y2xvbmVkPyAqLworCWlmIChza2JfY2xvbmVkKHNrYikpIHsKIAkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkgewogCQkJcmV0dXJuIHAtPnRjZl9hY3Rpb247CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfcG9saWNlLmMgYi9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCmluZGV4IDY1NGY3M2QuLjUzN2E0ODcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwpAQCAtOTcsNiArOTcsMTEgQEAKIAlnb3RvIGRvbmU7CiB9CiAKK3N0YXRpYyB2b2lkIHRjZl9wb2xpY2VfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCWtmcmVlKGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGNmX3BvbGljZSwgdGNmX3JjdSkpOworfQorCiBzdGF0aWMgdm9pZCB0Y2ZfcG9saWNlX2Rlc3Ryb3koc3RydWN0IHRjZl9wb2xpY2UgKnApCiB7CiAJdW5zaWduZWQgaW50IGggPSB0Y2ZfaGFzaChwLT50Y2ZfaW5kZXgsIFBPTF9UQUJfTUFTSyk7CkBAIC0xMTMsNyArMTE4LDExIEBACiAJCQkJcWRpc2NfcHV0X3J0YWIocC0+dGNmcF9SX3RhYik7CiAJCQlpZiAocC0+dGNmcF9QX3RhYikKIAkJCQlxZGlzY19wdXRfcnRhYihwLT50Y2ZwX1BfdGFiKTsKLQkJCWtmcmVlKHApOworCQkJLyoKKwkJCSAqIGdlbl9lc3RpbWF0b3IgZXN0X3RpbWVyKCkgbWlnaHQgYWNjZXNzIHAtPnRjZl9sb2NrCisJCQkgKiBvciBic3RhdHMsIHdhaXQgYSBSQ1UgZ3JhY2UgcGVyaW9kIGJlZm9yZSBmcmVlaW5nIHAKKwkJCSAqLworCQkJY2FsbF9yY3UoJnAtPnRjZl9yY3UsIHRjZl9wb2xpY2VfZnJlZV9yY3UpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMzk3LDYgKzQwNiw3IEBACiBwb2xpY2VfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wb2xpY2Vfb3BzKTsKKwlyY3VfYmFycmllcigpOyAvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1KCkncyAodGNmX3BvbGljZV9mcmVlX3JjdSkgKi8KIH0KIAogbW9kdWxlX2luaXQocG9saWNlX2luaXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMgYi9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCmluZGV4IDFiNGJjNjkuLjRhMWQ2NDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYwpAQCAtNzMsMTAgKzczLDEwIEBACiAKIHN0YXRpYyBpbnQgYWxsb2NfZGVmZGF0YShzdHJ1Y3QgdGNmX2RlZmFjdCAqZCwgY2hhciAqZGVmZGF0YSkKIHsKLQlkLT50Y2ZkX2RlZmRhdGEgPSBrc3RybmR1cChkZWZkYXRhLCBTSU1QX01BWF9EQVRBLCBHRlBfS0VSTkVMKTsKKwlkLT50Y2ZkX2RlZmRhdGEgPSBremFsbG9jKFNJTVBfTUFYX0RBVEEsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghZC0+dGNmZF9kZWZkYXRhKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0KKwlzdHJsY3B5KGQtPnRjZmRfZGVmZGF0YSwgZGVmZGF0YSwgU0lNUF9NQVhfREFUQSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCmluZGV4IDRmNTIyMTQuLjc0MTZhNWMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfdTMyLmMKKysrIGIvbmV0L3NjaGVkL2Nsc191MzIuYwpAQCAtMTM0LDEwICsxMzQsMTIgQEAKICNlbmRpZgogCiAJCWZvciAoaSA9IG4tPnNlbC5ua2V5czsgaT4wOyBpLS0sIGtleSsrKSB7Ci0JCQl1bnNpZ25lZCBpbnQgdG9mZjsKKwkJCWludCB0b2ZmID0gb2ZmICsga2V5LT5vZmYgKyAob2ZmMiAmIGtleS0+b2ZmbWFzayk7CiAJCQlfX2JlMzIgKmRhdGEsIF9kYXRhOwogCi0JCQl0b2ZmID0gb2ZmICsga2V5LT5vZmYgKyAob2ZmMiAmIGtleS0+b2ZmbWFzayk7CisJCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgKyB0b2ZmIDwgMCkKKwkJCQlnb3RvIG91dDsKKwogCQkJZGF0YSA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHRvZmYsIDQsICZfZGF0YSk7CiAJCQlpZiAoIWRhdGEpCiAJCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2F0bS5jIGIvbmV0L3NjaGVkL3NjaF9hdG0uYwppbmRleCBmY2JiODZhLi5lMTE0ZjIzIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2F0bS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXRtLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAlpbnQJCQlyZWY7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KIAlzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpY19wYWNrZWQJYnN0YXRzOwogCXN0cnVjdCBnbmV0X3N0YXRzX3F1ZXVlCXFzdGF0czsKLQlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YQkqbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IGF0bV9mbG93X2RhdGEJKmV4Y2VzczsJLyogZmxvdyBmb3IgZXhjZXNzIHRyYWZmaWM7CiAJCQkJCQkgICBOVUxMIHRvIHNldCBDTFAgaW5zdGVhZCAqLwogCWludAkJCWhkcl9sZW47CkBAIC02MSwzNCArNjEsMjMgQEAKIAogc3RydWN0IGF0bV9xZGlzY19kYXRhIHsKIAlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YQlsaW5rOwkJLyogdW5jbGFzc2lmaWVkIHNrYnMgZ28gaGVyZSAqLwotCXN0cnVjdCBhdG1fZmxvd19kYXRhCSpmbG93czsJCS8qIE5COiAibGluayIgaXMgYWxzbyBvbiB0aGlzCisJc3RydWN0IGxpc3RfaGVhZAlmbG93czsJCS8qIE5COiAibGluayIgaXMgYWxzbyBvbiB0aGlzCiAJCQkJCQkgICBsaXN0ICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRhc2s7CQkvKiBkZXF1ZXVlIHRhc2tsZXQgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MvZmxvdyBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBmaW5kX2Zsb3coc3RydWN0IGF0bV9xZGlzY19kYXRhICpxZGlzYywgc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cpCi17Ci0Jc3RydWN0IGF0bV9mbG93X2RhdGEgKndhbGs7Ci0KLQlwcl9kZWJ1ZygiZmluZF9mbG93KHFkaXNjICVwLGZsb3cgJXApXG4iLCBxZGlzYywgZmxvdyk7Ci0JZm9yICh3YWxrID0gcWRpc2MtPmZsb3dzOyB3YWxrOyB3YWxrID0gd2Fsay0+bmV4dCkKLQkJaWYgKHdhbGsgPT0gZmxvdykKLQkJCXJldHVybiAxOwotCXByX2RlYnVnKCJmaW5kX2Zsb3c6IG5vdCBmb3VuZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGF0bV9mbG93X2RhdGEgKmxvb2t1cF9mbG93KHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgY2xhc3NpZCkKIHsKIAlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBxZGlzY19wcml2KHNjaCk7CiAJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3c7CiAKLQlmb3IgKGZsb3cgPSBwLT5mbG93czsgZmxvdzsgZmxvdyA9IGZsb3ctPm5leHQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmbG93LCAmcC0+Zmxvd3MsIGxpc3QpIHsKIAkJaWYgKGZsb3ctPmNsYXNzaWQgPT0gY2xhc3NpZCkKLQkJCWJyZWFrOwotCXJldHVybiBmbG93OworCQkJcmV0dXJuIGZsb3c7CisJfQorCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IGF0bV90Y19ncmFmdChzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcsCkBAIC05OSw3ICs4OCw3IEBACiAKIAlwcl9kZWJ1ZygiYXRtX3RjX2dyYWZ0KHNjaCAlcCxbcWRpc2MgJXBdLGZsb3cgJXAsbmV3ICVwLG9sZCAlcClcbiIsCiAJCXNjaCwgcCwgZmxvdywgbmV3LCBvbGQpOwotCWlmICghZmluZF9mbG93KHAsIGZsb3cpKQorCWlmIChsaXN0X2VtcHR5KCZmbG93LT5saXN0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFuZXcpCiAJCW5ldyA9ICZub29wX3FkaXNjOwpAQCAtMTQ2LDIwICsxMzUsMTIgQEAKIHsKIAlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBxZGlzY19wcml2KHNjaCk7CiAJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKiljbDsKLQlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKnByZXY7CiAKIAlwcl9kZWJ1ZygiYXRtX3RjX3B1dChzY2ggJXAsW3FkaXNjICVwXSxmbG93ICVwKVxuIiwgc2NoLCBwLCBmbG93KTsKIAlpZiAoLS1mbG93LT5yZWYpCiAJCXJldHVybjsKIAlwcl9kZWJ1ZygiYXRtX3RjX3B1dDogZGVzdHJveWluZ1xuIik7Ci0JZm9yIChwcmV2ID0gJnAtPmZsb3dzOyAqcHJldjsgcHJldiA9ICYoKnByZXYpLT5uZXh0KQotCQlpZiAoKnByZXYgPT0gZmxvdykKLQkJCWJyZWFrOwotCWlmICghKnByZXYpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYXRtX3RjX3B1dDogY2xhc3MgJXAgbm90IGZvdW5kXG4iLCBmbG93KTsKLQkJcmV0dXJuOwotCX0KLQkqcHJldiA9IGZsb3ctPm5leHQ7CisJbGlzdF9kZWxfaW5pdCgmZmxvdy0+bGlzdCk7CiAJcHJfZGVidWcoImF0bV90Y19wdXQ6IHFkaXNjICVwXG4iLCBmbG93LT5xKTsKIAlxZGlzY19kZXN0cm95KGZsb3ctPnEpOwogCXRjZl9kZXN0cm95X2NoYWluKCZmbG93LT5maWx0ZXJfbGlzdCk7CkBAIC0yNzQsNyArMjU1LDcgQEAKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQotCQlpZiAoZmluZF9mbG93KHAsIGZsb3cpKSB7CisJCWlmICghbGlzdF9lbXB0eSgmZmxvdy0+bGlzdCkpIHsKIAkJCWVycm9yID0gLUVFWElTVDsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQpAQCAtMzEzLDggKzI5NCw3IEBACiAJZmxvdy0+Y2xhc3NpZCA9IGNsYXNzaWQ7CiAJZmxvdy0+cmVmID0gMTsKIAlmbG93LT5leGNlc3MgPSBleGNlc3M7Ci0JZmxvdy0+bmV4dCA9IHAtPmxpbmsubmV4dDsKLQlwLT5saW5rLm5leHQgPSBmbG93OworCWxpc3RfYWRkKCZmbG93LT5saXN0LCAmcC0+bGluay5saXN0KTsKIAlmbG93LT5oZHJfbGVuID0gaGRyX2xlbjsKIAlpZiAoaGRyKQogCQltZW1jcHkoZmxvdy0+aGRyLCBoZHIsIGhkcl9sZW4pOwpAQCAtMzM1LDcgKzMxNSw3IEBACiAJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKilhcmc7CiAKIAlwcl9kZWJ1ZygiYXRtX3RjX2RlbGV0ZShzY2ggJXAsW3FkaXNjICVwXSxmbG93ICVwKVxuIiwgc2NoLCBwLCBmbG93KTsKLQlpZiAoIWZpbmRfZmxvdyhxZGlzY19wcml2KHNjaCksIGZsb3cpKQorCWlmIChsaXN0X2VtcHR5KCZmbG93LT5saXN0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGZsb3ctPmZpbHRlcl9saXN0IHx8IGZsb3cgPT0gJnAtPmxpbmspCiAJCXJldHVybiAtRUJVU1k7CkBAIC0zNjEsMTIgKzM0MSwxMiBAQAogCXByX2RlYnVnKCJhdG1fdGNfd2FsayhzY2ggJXAsW3FkaXNjICVwXSx3YWxrZXIgJXApXG4iLCBzY2gsIHAsIHdhbGtlcik7CiAJaWYgKHdhbGtlci0+c3RvcCkKIAkJcmV0dXJuOwotCWZvciAoZmxvdyA9IHAtPmZsb3dzOyBmbG93OyBmbG93ID0gZmxvdy0+bmV4dCkgewotCQlpZiAod2Fsa2VyLT5jb3VudCA+PSB3YWxrZXItPnNraXApCi0JCQlpZiAod2Fsa2VyLT5mbihzY2gsICh1bnNpZ25lZCBsb25nKWZsb3csIHdhbGtlcikgPCAwKSB7Ci0JCQkJd2Fsa2VyLT5zdG9wID0gMTsKLQkJCQlicmVhazsKLQkJCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsb3csICZwLT5mbG93cywgbGlzdCkgeworCQlpZiAod2Fsa2VyLT5jb3VudCA+PSB3YWxrZXItPnNraXAgJiYKKwkJICAgIHdhbGtlci0+Zm4oc2NoLCAodW5zaWduZWQgbG9uZylmbG93LCB3YWxrZXIpIDwgMCkgeworCQkJd2Fsa2VyLT5zdG9wID0gMTsKKwkJCWJyZWFrOworCQl9CiAJCXdhbGtlci0+Y291bnQrKzsKIAl9CiB9CkBAIC0zODUsMTYgKzM2NSwxNyBAQAogc3RhdGljIGludCBhdG1fdGNfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBxZGlzY19wcml2KHNjaCk7Ci0Jc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSBOVUxMOwkvKiBAQEAgKi8KKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdzsKIAlzdHJ1Y3QgdGNmX3Jlc3VsdCByZXM7CiAJaW50IHJlc3VsdDsKIAlpbnQgcmV0ID0gTkVUX1hNSVRfUE9MSUNFRDsKIAogCXByX2RlYnVnKCJhdG1fdGNfZW5xdWV1ZShza2IgJXAsc2NoICVwLFtxZGlzYyAlcF0pXG4iLCBza2IsIHNjaCwgcCk7CiAJcmVzdWx0ID0gVENfUE9MSUNFX09LOwkvKiBiZSBuaWNlIHRvIGdjYyAqLworCWZsb3cgPSBOVUxMOwogCWlmIChUQ19IX01BSihza2ItPnByaW9yaXR5KSAhPSBzY2gtPmhhbmRsZSB8fAotCSAgICAhKGZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKilhdG1fdGNfZ2V0KHNjaCwgc2tiLT5wcmlvcml0eSkpKQotCQlmb3IgKGZsb3cgPSBwLT5mbG93czsgZmxvdzsgZmxvdyA9IGZsb3ctPm5leHQpCisJICAgICEoZmxvdyA9IChzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKWF0bV90Y19nZXQoc2NoLCBza2ItPnByaW9yaXR5KSkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmbG93LCAmcC0+Zmxvd3MsIGxpc3QpIHsKIAkJCWlmIChmbG93LT5maWx0ZXJfbGlzdCkgewogCQkJCXJlc3VsdCA9IHRjX2NsYXNzaWZ5X2NvbXBhdChza2IsCiAJCQkJCQkJICAgIGZsb3ctPmZpbHRlcl9saXN0LApAQCAtNDA0LDggKzM4NSwxMyBAQAogCQkJCWZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKilyZXMuY2xhc3M7CiAJCQkJaWYgKCFmbG93KQogCQkJCQlmbG93ID0gbG9va3VwX2Zsb3coc2NoLCByZXMuY2xhc3NpZCk7Ci0JCQkJYnJlYWs7CisJCQkJZ290byBkb25lOwogCQkJfQorCQl9CisJCWZsb3cgPSBOVUxMOworCWRvbmU6CisJCTsJCQorCX0KIAlpZiAoIWZsb3cpCiAJCWZsb3cgPSAmcC0+bGluazsKIAllbHNlIHsKQEAgLTQ3Nyw3ICs0NjMsOSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlwcl9kZWJ1Zygic2NoX2F0bV9kZXF1ZXVlKHNjaCAlcCxbcWRpc2MgJXBdKVxuIiwgc2NoLCBwKTsKLQlmb3IgKGZsb3cgPSBwLT5saW5rLm5leHQ7IGZsb3c7IGZsb3cgPSBmbG93LT5uZXh0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZmxvdywgJnAtPmZsb3dzLCBsaXN0KSB7CisJCWlmIChmbG93ID09ICZwLT5saW5rKQorCQkJY29udGludWU7CiAJCS8qCiAJCSAqIElmIHRyYWZmaWMgaXMgcHJvcGVybHkgc2hhcGVkLCB0aGlzIHdvbid0IGdlbmVyYXRlIG5hc3R5CiAJCSAqIGxpdHRsZSBidXJzdHMuIE90aGVyd2lzZSwgaXQgbWF5IC4uLiAoYnV0IHRoYXQncyBva2F5KQpAQCAtNTEyLDYgKzUwMCw3IEBACiAJCQkvKiBhdG0uYXRtX29wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGJ5IGF0bV90Y19lbnF1ZXVlICovCiAJCQlmbG93LT52Y2MtPnNlbmQoZmxvdy0+dmNjLCBza2IpOwogCQl9CisJfQogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmF0bV90Y19kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqc2NoKQpAQCAtNTQzLDkgKzUzMiwxMCBAQAogCXVuc2lnbmVkIGludCBsZW47CiAKIAlwcl9kZWJ1ZygiYXRtX3RjX2Ryb3Aoc2NoICVwLFtxZGlzYyAlcF0pXG4iLCBzY2gsIHApOwotCWZvciAoZmxvdyA9IHAtPmZsb3dzOyBmbG93OyBmbG93ID0gZmxvdy0+bmV4dCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsb3csICZwLT5mbG93cywgbGlzdCkgewogCQlpZiAoZmxvdy0+cS0+b3BzLT5kcm9wICYmIChsZW4gPSBmbG93LT5xLT5vcHMtPmRyb3AoZmxvdy0+cSkpKQogCQkJcmV0dXJuIGxlbjsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU1NCw3ICs1NDQsOSBAQAogCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IHFkaXNjX3ByaXYoc2NoKTsKIAogCXByX2RlYnVnKCJhdG1fdGNfaW5pdChzY2ggJXAsW3FkaXNjICVwXSxvcHQgJXApXG4iLCBzY2gsIHAsIG9wdCk7Ci0JcC0+Zmxvd3MgPSAmcC0+bGluazsKKwlJTklUX0xJU1RfSEVBRCgmcC0+Zmxvd3MpOworCUlOSVRfTElTVF9IRUFEKCZwLT5saW5rLmxpc3QpOworCWxpc3RfYWRkKCZwLT5saW5rLmxpc3QsICZwLT5mbG93cyk7CiAJcC0+bGluay5xID0gcWRpc2NfY3JlYXRlX2RmbHQocWRpc2NfZGV2KHNjaCksIHNjaC0+ZGV2X3F1ZXVlLAogCQkJCSAgICAgICZwZmlmb19xZGlzY19vcHMsIHNjaC0+aGFuZGxlKTsKIAlpZiAoIXAtPmxpbmsucSkKQEAgLTU2NSw3ICs1NTcsNiBAQAogCXAtPmxpbmsuc29jayA9IE5VTEw7CiAJcC0+bGluay5jbGFzc2lkID0gc2NoLT5oYW5kbGU7CiAJcC0+bGluay5yZWYgPSAxOwotCXAtPmxpbmsubmV4dCA9IE5VTEw7CiAJdGFza2xldF9pbml0KCZwLT50YXNrLCBzY2hfYXRtX2RlcXVldWUsICh1bnNpZ25lZCBsb25nKXNjaCk7CiAJcmV0dXJuIDA7CiB9CkBAIC01NzYsNyArNTY3LDcgQEAKIAlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdzsKIAogCXByX2RlYnVnKCJhdG1fdGNfcmVzZXQoc2NoICVwLFtxZGlzYyAlcF0pXG4iLCBzY2gsIHApOwotCWZvciAoZmxvdyA9IHAtPmZsb3dzOyBmbG93OyBmbG93ID0gZmxvdy0+bmV4dCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsb3csICZwLT5mbG93cywgbGlzdCkKIAkJcWRpc2NfcmVzZXQoZmxvdy0+cSk7CiAJc2NoLT5xLnFsZW4gPSAwOwogfQpAQCAtNTg0LDI0ICs1NzUsMTcgQEAKIHN0YXRpYyB2b2lkIGF0bV90Y19kZXN0cm95KHN0cnVjdCBRZGlzYyAqc2NoKQogewogCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IHFkaXNjX3ByaXYoc2NoKTsKLQlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdzsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdywgKnRtcDsKIAogCXByX2RlYnVnKCJhdG1fdGNfZGVzdHJveShzY2ggJXAsW3FkaXNjICVwXSlcbiIsIHNjaCwgcCk7Ci0JZm9yIChmbG93ID0gcC0+Zmxvd3M7IGZsb3c7IGZsb3cgPSBmbG93LT5uZXh0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZmxvdywgJnAtPmZsb3dzLCBsaXN0KQogCQl0Y2ZfZGVzdHJveV9jaGFpbigmZmxvdy0+ZmlsdGVyX2xpc3QpOwogCi0JLyogcmFjZXMgPyAqLwotCXdoaWxlICgoZmxvdyA9IHAtPmZsb3dzKSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmbG93LCB0bXAsICZwLT5mbG93cywgbGlzdCkgewogCQlpZiAoZmxvdy0+cmVmID4gMSkKIAkJCXByaW50ayhLRVJOX0VSUiAiYXRtX2Rlc3Ryb3k6ICVwLT5yZWYgPSAlZFxuIiwgZmxvdywKIAkJCSAgICAgICBmbG93LT5yZWYpOwogCQlhdG1fdGNfcHV0KHNjaCwgKHVuc2lnbmVkIGxvbmcpZmxvdyk7Ci0JCWlmIChwLT5mbG93cyA9PSBmbG93KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImF0bV9kZXN0cm95OiBwdXR0aW5nIGZsb3cgJXAgZGlkbid0ICIKLQkJCSAgICAgICAia2lsbCBpdFxuIiwgZmxvdyk7Ci0JCQlwLT5mbG93cyA9IGZsb3ctPm5leHQ7CS8qIGJydXRlIGZvcmNlICovCi0JCQlicmVhazsKLQkJfQogCX0KIAl0YXNrbGV0X2tpbGwoJnAtPnRhc2spOwogfQpAQCAtNjE1LDcgKzU5OSw3IEBACiAKIAlwcl9kZWJ1ZygiYXRtX3RjX2R1bXBfY2xhc3Moc2NoICVwLFtxZGlzYyAlcF0sZmxvdyAlcCxza2IgJXAsdGNtICVwKVxuIiwKIAkJc2NoLCBwLCBmbG93LCBza2IsIHRjbSk7Ci0JaWYgKCFmaW5kX2Zsb3cocCwgZmxvdykpCisJaWYgKGxpc3RfZW1wdHkoJmZsb3ctPmxpc3QpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl0Y20tPnRjbV9oYW5kbGUgPSBmbG93LT5jbGFzc2lkOwogCXRjbS0+dGNtX2luZm8gPSBmbG93LT5xLT5oYW5kbGU7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IGE2MzAyOWUuLjJhZWIzYTQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC05Niw3ICs5Niw3IEBACiAJCSAqIEFub3RoZXIgY3B1IGlzIGhvbGRpbmcgbG9jaywgcmVxdWV1ZSAmIGRlbGF5IHhtaXRzIGZvcgogCQkgKiBzb21lIHRpbWUuCiAJCSAqLwotCQlfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSkuY3B1X2NvbGxpc2lvbisrOworCQlfX3RoaXNfY3B1X2luYyhzb2Z0bmV0X2RhdGEuY3B1X2NvbGxpc2lvbik7CiAJCXJldCA9IGRldl9yZXF1ZXVlX3NrYihza2IsIHEpOwogCX0KIApAQCAtMjA1LDcgKzIwNSw3IEBACiAJCX0KIAl9CiAKLQljbGVhcl9iaXQoX19RRElTQ19TVEFURV9SVU5OSU5HLCAmcS0+c3RhdGUpOworCXFkaXNjX3J1bl9lbmQocSk7CiB9CiAKIHVuc2lnbmVkIGxvbmcgZGV2X3RyYW5zX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0zMjcsNiArMzI3LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5ldGlmX2NhcnJpZXJfb2ZmKTsKIAorLyoqCisgKiAJbmV0aWZfbm90aWZ5X3BlZXJzIC0gbm90aWZ5IG5ldHdvcmsgcGVlcnMgYWJvdXQgZXhpc3RlbmNlIG9mIEBkZXYKKyAqIAlAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqIEdlbmVyYXRlIHRyYWZmaWMgc3VjaCB0aGF0IGludGVyZXN0ZWQgbmV0d29yayBwZWVycyBhcmUgYXdhcmUgb2YKKyAqIEBkZXYsIHN1Y2ggYXMgYnkgZ2VuZXJhdGluZyBhIGdyYXR1aXRvdXMgQVJQLiBUaGlzIG1heSBiZSB1c2VkIHdoZW4KKyAqIGEgZGV2aWNlIHdhbnRzIHRvIGluZm9ybSB0aGUgcmVzdCBvZiB0aGUgbmV0d29yayBhYm91dCBzb21lIHNvcnQgb2YKKyAqIHJlY29uZmlndXJhdGlvbiBzdWNoIGFzIGEgZmFpbG92ZXIgZXZlbnQgb3IgdmlydHVhbCBtYWNoaW5lCisgKiBtaWdyYXRpb24uCisgKi8KK3ZvaWQgbmV0aWZfbm90aWZ5X3BlZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcnRubF9sb2NrKCk7CisJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9OT1RJRllfUEVFUlMsIGRldik7CisJcnRubF91bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0wobmV0aWZfbm90aWZ5X3BlZXJzKTsKKwogLyogIk5PT1AiIHNjaGVkdWxlcjogdGhlIGJlc3Qgc2NoZWR1bGVyLCByZWNvbW1lbmRlZCBmb3IgYWxsIGludGVyZmFjZXMKICAgIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzLiBJdCBpcyBkaWZmaWN1bHQgdG8gaW52ZW50IGFueXRoaW5nIGZhc3RlciBvcgogICAgY2hlYXBlci4KQEAgLTU0Myw2ICs1NjEsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnNjaC0+bGlzdCk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NoLT5xKTsKKwlzcGluX2xvY2tfaW5pdCgmc2NoLT5idXN5bG9jayk7CiAJc2NoLT5vcHMgPSBvcHM7CiAJc2NoLT5lbnF1ZXVlID0gb3BzLT5lbnF1ZXVlOwogCXNjaC0+ZGVxdWV1ZSA9IG9wcy0+ZGVxdWV1ZTsKQEAgLTc3OSw3ICs3OTgsNyBAQAogCiAJCXNwaW5fbG9ja19iaChyb290X2xvY2spOwogCi0JCXZhbCA9ICh0ZXN0X2JpdChfX1FESVNDX1NUQVRFX1JVTk5JTkcsICZxLT5zdGF0ZSkgfHwKKwkJdmFsID0gKHFkaXNjX2lzX3J1bm5pbmcocSkgfHwKIAkJICAgICAgIHRlc3RfYml0KF9fUURJU0NfU1RBVEVfU0NIRUQsICZxLT5zdGF0ZSkpOwogCiAJCXNwaW5fdW5sb2NrX2JoKHJvb3RfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2h0Yi5jIGIvbmV0L3NjaGVkL3NjaF9odGIuYwppbmRleCAwYjUyYjhkLi40YmU4ZDA0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2h0Yi5jCisrKyBiL25ldC9zY2hlZC9zY2hfaHRiLmMKQEAgLTE1NTAsNyArMTU1MCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBodGJfcWRpc2Nfb3BzIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5leHQJCT0JTlVMTCwKIAkuY2xfb3BzCQk9CSZodGJfY2xhc3Nfb3BzLAogCS5pZAkJPQkiaHRiIiwKIAkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBodGJfc2NoZWQpLApAQCAtMTU2MSw3ICsxNTYwLDYgQEAKIAkuaW5pdAkJPQlodGJfaW5pdCwKIAkucmVzZXQJCT0JaHRiX3Jlc2V0LAogCS5kZXN0cm95CT0JaHRiX2Rlc3Ryb3ksCi0JLmNoYW5nZQkJPQlOVUxMIC8qIGh0Yl9jaGFuZ2UgKi8sCiAJLmR1bXAJCT0JaHRiX2R1bXAsCiAJLm93bmVyCQk9CVRISVNfTU9EVUxFLAogfTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggZTQxZmVmZi4uMGI4NWU1MiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0VdID0KIAkJKHVuc2lnbmVkIGxvbmcpc3AtPmF1dG9jbG9zZSAqIEhaOwogCi0JLyogSW5pdGlsaXplcyB0aGUgdGltZXJzICovCisJLyogSW5pdGlhbGl6ZXMgdGhlIHRpbWVycyAqLwogCWZvciAoaSA9IFNDVFBfRVZFTlRfVElNRU9VVF9OT05FOyBpIDwgU0NUUF9OVU1fVElNRU9VVF9UWVBFUzsgKytpKQogCQlzZXR1cF90aW1lcigmYXNvYy0+dGltZXJzW2ldLCBzY3RwX3RpbWVyX2V2ZW50c1tpXSwKIAkJCQkodW5zaWduZWQgbG9uZylhc29jKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb3RvY29sLmMgYi9uZXQvc2N0cC9wcm90b2NvbC5jCmluZGV4IDE4Mjc0OTguLjUwMjdiODMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb3RvY29sLmMKKysrIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCQkgIF9fZnVuY19fLCAmZmwuZmw0X2RzdCwgJmZsLmZsNF9zcmMpOwogCiAJaWYgKCFpcF9yb3V0ZV9vdXRwdXRfa2V5KCZpbml0X25ldCwgJnJ0LCAmZmwpKSB7Ci0JCWRzdCA9ICZydC0+dS5kc3Q7CisJCWRzdCA9ICZydC0+ZHN0OwogCX0KIAogCS8qIElmIHRoZXJlIGlzIG5vIGFzc29jaWF0aW9uIG9yIGlmIGEgc291cmNlIGFkZHJlc3MgaXMgcGFzc2VkLCBubwpAQCAtNTM0LDcgKzUzNCw3IEBACiAJCQlmbC5mbDRfc3JjID0gbGFkZHItPmEudjQuc2luX2FkZHIuc19hZGRyOwogCQkJZmwuZmxfaXBfc3BvcnQgPSBsYWRkci0+YS52NC5zaW5fcG9ydDsKIAkJCWlmICghaXBfcm91dGVfb3V0cHV0X2tleSgmaW5pdF9uZXQsICZydCwgJmZsKSkgewotCQkJCWRzdCA9ICZydC0+dS5kc3Q7CisJCQkJZHN0ID0gJnJ0LT5kc3Q7CiAJCQkJZ290byBvdXRfdW5sb2NrOwogCQkJfQogCQl9CkBAIC0xMDAyLDcgKzEwMDIsOCBAQAogc3RhdGljIGlubGluZSBpbnQgaW5pdF9zY3RwX21pYnModm9pZCkKIHsKIAlyZXR1cm4gc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKilzY3RwX3N0YXRpc3RpY3MsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9taWIpKTsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX21pYiksCisJCQkgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBzY3RwX21pYikpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF9zY3RwX21pYnModm9pZCkKQEAgLTExNjIsNyArMTE2Myw3IEBACiAJLyogU2V0IHRoZSBwcmVzc3VyZSB0aHJlc2hvbGQgdG8gYmUgYSBmcmFjdGlvbiBvZiBnbG9iYWwgbWVtb3J5IHRoYXQKIAkgKiBpcyB1cCB0byAxLzIgYXQgMjU2IE1CLCBkZWNyZWFzaW5nIHRvd2FyZCB6ZXJvIHdpdGggdGhlIGFtb3VudCBvZgogCSAqIG1lbW9yeSwgd2l0aCBhIGZsb29yIG9mIDEyOCBwYWdlcy4KLQkgKiBOb3RlIHRoaXMgaW5pdGFsaXplcyB0aGUgZGF0YSBpbiBzY3RwdjZfcHJvdCB0b28KKwkgKiBOb3RlIHRoaXMgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgaW4gc2N0cHY2X3Byb3QgdG9vCiAJICogVW5hYmFzaGVkbHkgc3RvbGVuIGZyb20gdGNwX2luaXQKIAkgKi8KIAlucl9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzIC0gdG90YWxoaWdoX3BhZ2VzOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IGJkMmE1MGIuLjI0NmY5MjkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTE4MTcsNyArMTgxNyw3IEBACiBzdHJ1Y3QgX19zY3RwX21pc3NpbmcgewogCV9fYmUzMiBudW1fbWlzc2luZzsKIAlfX2JlMTYgdHlwZTsKLX0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSAgX19wYWNrZWQ7CiAKIC8qCiAgKiBSZXBvcnQgYSBtaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIuCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggMzY3ZDU0Ny4uMjI3MGI5NCAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiBzdGF0aWMgc3NpemVfdCBzb2NrX3NlbmRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgICAgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsIGxvZmZfdCAqcHBvcywgaW50IG1vcmUpOwogc3RhdGljIHNzaXplX3Qgc29ja19zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpwcG9zLAotCQkJICAgICAgICBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzaXplX3QgbGVuLAorCQkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBsZW4sCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKIAogLyoKQEAgLTE2Miw3ICsxNjIsNyBAQAogICoJU3RhdGlzdGljcyBjb3VudGVycyBvZiB0aGUgc29ja2V0IGxpc3RzCiAgKi8KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgc29ja2V0c19pbl91c2UpID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHNvY2tldHNfaW5fdXNlKTsKIAogLyoKICAqIFN1cHBvcnQgcm91dGluZXMuCkBAIC0xNzAsMTUgKzE3MCw2IEBACiAgKiBkaXZpZGUgYW5kIGxvb2sgYWZ0ZXIgdGhlIG1lc3N5IGJpdHMuCiAgKi8KIAotI2RlZmluZSBNQVhfU09DS19BRERSCTEyOAkJLyogMTA4IGZvciBVbml4IGRvbWFpbiAtCi0JCQkJCSAgIDE2IGZvciBJUCwgMTYgZm9yIElQWCwKLQkJCQkJICAgMjQgZm9yIElQdjYsCi0JCQkJCSAgIGFib3V0IDgwIGZvciBBWC4yNQotCQkJCQkgICBtdXN0IGJlIGF0IGxlYXN0IG9uZSBiaWdnZXIgdGhhbgotCQkJCQkgICB0aGUgQUZfVU5JWCBzaXplIChzZWUgbmV0L3VuaXgvYWZfdW5peC5jCi0JCQkJCSAgIDp1bml4X21rbmFtZSgpKS4KLQkJCQkJICovCi0KIC8qKgogICoJbW92ZV9hZGRyX3RvX2tlcm5lbAktCWNvcHkgYSBzb2NrZXQgYWRkcmVzcyBpbnRvIGtlcm5lbCBzcGFjZQogICoJQHVhZGRyOiBBZGRyZXNzIGluIHVzZXIgc3BhY2UKQEAgLTMwOSw5ICszMDAsOSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc29ja2ZzX29wcyA9IHsKLQkuYWxsb2NfaW5vZGUgPQlzb2NrX2FsbG9jX2lub2RlLAotCS5kZXN0cm95X2lub2RlID1zb2NrX2Rlc3Ryb3lfaW5vZGUsCi0JLnN0YXRmcyA9CXNpbXBsZV9zdGF0ZnMsCisJLmFsbG9jX2lub2RlCT0gc29ja19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHNvY2tfZGVzdHJveV9pbm9kZSwKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiB9OwogCiBzdGF0aWMgaW50IHNvY2tmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCkBAIC00MTEsNiArNDAyLDcgQEAKIAogCXJldHVybiBmZDsKIH0KK0VYUE9SVF9TWU1CT0woc29ja19tYXBfZmQpOwogCiBzdGF0aWMgc3RydWN0IHNvY2tldCAqc29ja19mcm9tX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCAqZXJyKQogewpAQCAtNDIyLDcgKzQxNCw3IEBACiB9CiAKIC8qKgotICoJc29ja2ZkX2xvb2t1cAktIAlHbyBmcm9tIGEgZmlsZSBudW1iZXIgdG8gaXRzIHNvY2tldCBzbG90CisgKglzb2NrZmRfbG9va3VwIC0gR28gZnJvbSBhIGZpbGUgbnVtYmVyIHRvIGl0cyBzb2NrZXQgc2xvdAogICoJQGZkOiBmaWxlIGhhbmRsZQogICoJQGVycjogcG9pbnRlciB0byBhbiBlcnJvciBjb2RlIHJldHVybgogICoKQEAgLTQ1MCw2ICs0NDIsNyBAQAogCQlmcHV0KGZpbGUpOwogCXJldHVybiBzb2NrOwogfQorRVhQT1JUX1NZTUJPTChzb2NrZmRfbG9va3VwKTsKIAogc3RhdGljIHN0cnVjdCBzb2NrZXQgKnNvY2tmZF9sb29rdXBfbGlnaHQoaW50IGZkLCBpbnQgKmVyciwgaW50ICpmcHV0X25lZWRlZCkKIHsKQEAgLTU0MCw2ICs1MzMsNyBAQAogCX0KIAlzb2NrLT5maWxlID0gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woc29ja19yZWxlYXNlKTsKIAogaW50IHNvY2tfdHhfdGltZXN0YW1wKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAogCQkgICAgICB1bmlvbiBza2Jfc2hhcmVkX3R4ICpzaHR4KQpAQCAtNTg2LDYgKzU4MCw3IEBACiAJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woc29ja19zZW5kbXNnKTsKIAogaW50IGtlcm5lbF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKIAkJICAgc3RydWN0IGt2ZWMgKnZlYywgc2l6ZV90IG51bSwgc2l6ZV90IHNpemUpCkBAIC02MDQsNiArNTk5LDcgQEAKIAlzZXRfZnMob2xkZnMpOwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9zZW5kbXNnKTsKIAogc3RhdGljIGludCBrdGltZTJ0cyhrdGltZV90IGt0LCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewpAQCAtNjY0LDcgKzY2MCw2IEBACiAJCXB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwKIAkJCSBTQ01fVElNRVNUQU1QSU5HLCBzaXplb2YodHMpLCAmdHMpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChfX3NvY2tfcmVjdl90aW1lc3RhbXApOwogCiBpbmxpbmUgdm9pZCBzb2NrX3JlY3ZfZHJvcHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCkBAIC03MjAsNiArNzE1LDcgQEAKIAkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZpb2NiKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChzb2NrX3JlY3Ztc2cpOwogCiBzdGF0aWMgaW50IHNvY2tfcmVjdm1zZ19ub3NlYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQpAQCAtNzUyLDYgKzc0OCw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfcmVjdm1zZyk7CiAKIHN0YXRpYyB2b2lkIHNvY2tfYWlvX2R0b3Ioc3RydWN0IGtpb2NiICppb2NiKQogewpAQCAtNzc0LDcgKzc3MSw3IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNvY2tfc3BsaWNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCAqcHBvcywKLQkJCSAgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKKwkJCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzaXplX3QgbGVuLAogCQkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtODg3LDcgKzg4NCw3IEBACiAgKi8KIAogc3RhdGljIERFRklORV9NVVRFWChicl9pb2N0bF9tdXRleCk7Ci1zdGF0aWMgaW50ICgqYnJfaW9jdGxfaG9vaykgKHN0cnVjdCBuZXQgKiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykgPSBOVUxMOworc3RhdGljIGludCAoKmJyX2lvY3RsX2hvb2spIChzdHJ1Y3QgbmV0ICosIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwogCiB2b2lkIGJyaW9jdGxfc2V0KGludCAoKmhvb2spIChzdHJ1Y3QgbmV0ICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKikpCiB7CkBAIC04OTUsNyArODkyLDYgQEAKIAlicl9pb2N0bF9ob29rID0gaG9vazsKIAltdXRleF91bmxvY2soJmJyX2lvY3RsX211dGV4KTsKIH0KLQogRVhQT1JUX1NZTUJPTChicmlvY3RsX3NldCk7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgodmxhbl9pb2N0bF9tdXRleCk7CkBAIC05MDcsNyArOTAzLDYgQEAKIAl2bGFuX2lvY3RsX2hvb2sgPSBob29rOwogCW11dGV4X3VubG9jaygmdmxhbl9pb2N0bF9tdXRleCk7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodmxhbl9pb2N0bF9zZXQpOwogCiBzdGF0aWMgREVGSU5FX01VVEVYKGRsY2lfaW9jdGxfbXV0ZXgpOwpAQCAtOTE5LDcgKzkxNCw2IEBACiAJZGxjaV9pb2N0bF9ob29rID0gaG9vazsKIAltdXRleF91bmxvY2soJmRsY2lfaW9jdGxfbXV0ZXgpOwogfQotCiBFWFBPUlRfU1lNQk9MKGRsY2lfaW9jdGxfc2V0KTsKIAogc3RhdGljIGxvbmcgc29ja19kb19pb2N0bChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCkBAIC0xMDQ3LDYgKzEwNDEsNyBAQAogCXNvY2sgPSBOVUxMOwogCWdvdG8gb3V0OwogfQorRVhQT1JUX1NZTUJPTChzb2NrX2NyZWF0ZV9saXRlKTsKIAogLyogTm8ga2VybmVsIGxvY2sgaGVsZCAtIHBlcmZlY3QgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc29ja19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQpAQCAtMTE0Nyw2ICsxMTQyLDcgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc29ja193YWtlX2FzeW5jKTsKIAogc3RhdGljIGludCBfX3NvY2tfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwKIAkJCSBzdHJ1Y3Qgc29ja2V0ICoqcmVzLCBpbnQga2VybikKQEAgLTEyNjUsMTEgKzEyNjEsMTMgQEAKIHsKIAlyZXR1cm4gX19zb2NrX2NyZWF0ZShjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnMsIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIHJlcywgMCk7CiB9CitFWFBPUlRfU1lNQk9MKHNvY2tfY3JlYXRlKTsKIAogaW50IHNvY2tfY3JlYXRlX2tlcm4oaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgc3RydWN0IHNvY2tldCAqKnJlcykKIHsKIAlyZXR1cm4gX19zb2NrX2NyZWF0ZSgmaW5pdF9uZXQsIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIHJlcywgMSk7CiB9CitFWFBPUlRfU1lNQk9MKHNvY2tfY3JlYXRlX2tlcm4pOwogCiBTWVNDQUxMX0RFRklORTMoc29ja2V0LCBpbnQsIGZhbWlseSwgaW50LCB0eXBlLCBpbnQsIHByb3RvY29sKQogewpAQCAtMTQ3NCw3ICsxNDcyLDggQEAKIAkJZ290byBvdXQ7CiAKIAllcnIgPSAtRU5GSUxFOwotCWlmICghKG5ld3NvY2sgPSBzb2NrX2FsbG9jKCkpKQorCW5ld3NvY2sgPSBzb2NrX2FsbG9jKCk7CisJaWYgKCFuZXdzb2NrKQogCQlnb3RvIG91dF9wdXQ7CiAKIAluZXdzb2NrLT50eXBlID0gc29jay0+dHlwZTsKQEAgLTE4NjEsOCArMTg2MCw3IEBACiAJaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKSB7CiAJCWlmIChnZXRfY29tcGF0X21zZ2hkcigmbXNnX3N5cywgbXNnX2NvbXBhdCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JZWxzZSBpZiAoY29weV9mcm9tX3VzZXIoJm1zZ19zeXMsIG1zZywgc2l6ZW9mKHN0cnVjdCBtc2doZHIpKSkKKwl9IGVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKCZtc2dfc3lzLCBtc2csIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CkBAIC0xOTY0LDggKzE5NjIsNyBAQAogCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgewogCQlpZiAoZ2V0X2NvbXBhdF9tc2doZHIobXNnX3N5cywgbXNnX2NvbXBhdCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JZWxzZSBpZiAoY29weV9mcm9tX3VzZXIobXNnX3N5cywgbXNnLCBzaXplb2Yoc3RydWN0IG1zZ2hkcikpKQorCX0gZWxzZSBpZiAoY29weV9mcm9tX3VzZXIobXNnX3N5cywgbXNnLCBzaXplb2Yoc3RydWN0IG1zZ2hkcikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWVyciA9IC1FTVNHU0laRTsKQEAgLTIxOTEsMTAgKzIxODgsMTAgQEAKIC8qIEFyZ3VtZW50IGxpc3Qgc2l6ZXMgZm9yIHN5c19zb2NrZXRjYWxsICovCiAjZGVmaW5lIEFMKHgpICgoeCkgKiBzaXplb2YodW5zaWduZWQgbG9uZykpCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuYXJnc1syMF0gPSB7Ci0JQUwoMCksQUwoMyksQUwoMyksQUwoMyksQUwoMiksQUwoMyksCi0JQUwoMyksQUwoMyksQUwoNCksQUwoNCksQUwoNCksQUwoNiksCi0JQUwoNiksQUwoMiksQUwoNSksQUwoNSksQUwoMyksQUwoMyksCi0JQUwoNCksQUwoNSkKKwlBTCgwKSwgQUwoMyksIEFMKDMpLCBBTCgzKSwgQUwoMiksIEFMKDMpLAorCUFMKDMpLCBBTCgzKSwgQUwoNCksIEFMKDQpLCBBTCg0KSwgQUwoNiksCisJQUwoNiksIEFMKDIpLCBBTCg1KSwgQUwoNSksIEFMKDMpLCBBTCgzKSwKKwlBTCg0KSwgQUwoNSkKIH07CiAKICN1bmRlZiBBTApAQCAtMjM0MCw2ICsyMzM3LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5ICVkXG4iLCBvcHMtPmZhbWlseSk7CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0woc29ja19yZWdpc3Rlcik7CiAKIC8qKgogICoJc29ja191bnJlZ2lzdGVyIC0gcmVtb3ZlIGEgcHJvdG9jb2wgaGFuZGxlcgpAQCAtMjM2Niw2ICsyMzY0LDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIk5FVDogVW5yZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAlZFxuIiwgZmFtaWx5KTsKIH0KK0VYUE9SVF9TWU1CT0woc29ja191bnJlZ2lzdGVyKTsKIAogc3RhdGljIGludCBfX2luaXQgc29ja19pbml0KHZvaWQpCiB7CkBAIC0yMzk1LDYgKzIzOTQsMTAgQEAKIAluZXRmaWx0ZXJfaW5pdCgpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTkVUV09SS19QSFlfVElNRVNUQU1QSU5HCisJc2tiX3RpbWVzdGFtcGluZ19pbml0KCk7CisjZW5kaWYKKwogCXJldHVybiAwOwogfQogCkBAIC0yNDkwLDEzICsyNDkzLDEzIEBACiAJCWlmYy5pZmNfcmVxID0gTlVMTDsKIAkJdWlmYyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgaWZjb25mKSk7CiAJfSBlbHNlIHsKLQkJc2l6ZV90IGxlbiA9KChpZmMzMi5pZmNfbGVuIC8gc2l6ZW9mIChzdHJ1Y3QgY29tcGF0X2lmcmVxKSkgKyAxKSAqCi0JCQlzaXplb2YgKHN0cnVjdCBpZnJlcSk7CisJCXNpemVfdCBsZW4gPSAoKGlmYzMyLmlmY19sZW4gLyBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkpICsgMSkgKgorCQkJc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CiAJCXVpZmMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmY29uZikgKyBsZW4pOwogCQlpZmMuaWZjX2xlbiA9IGxlbjsKIAkJaWZyID0gaWZjLmlmY19yZXEgPSAodm9pZCBfX3VzZXIgKikodWlmYyArIDEpOwogCQlpZnIzMiA9IGNvbXBhdF9wdHIoaWZjMzIuaWZjYnVmKTsKLQkJZm9yIChpID0gMDsgaSA8IGlmYzMyLmlmY19sZW47IGkgKz0gc2l6ZW9mIChzdHJ1Y3QgY29tcGF0X2lmcmVxKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaWZjMzIuaWZjX2xlbjsgaSArPSBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkpIHsKIAkJCWlmIChjb3B5X2luX3VzZXIoaWZyLCBpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCWlmcisrOwpAQCAtMjUxNiw5ICsyNTE5LDkgQEAKIAlpZnIgPSBpZmMuaWZjX3JlcTsKIAlpZnIzMiA9IGNvbXBhdF9wdHIoaWZjMzIuaWZjYnVmKTsKIAlmb3IgKGkgPSAwLCBqID0gMDsKLSAgICAgICAgICAgICBpICsgc2l6ZW9mIChzdHJ1Y3QgY29tcGF0X2lmcmVxKSA8PSBpZmMzMi5pZmNfbGVuICYmIGogPCBpZmMuaWZjX2xlbjsKLQkgICAgIGkgKz0gc2l6ZW9mIChzdHJ1Y3QgY29tcGF0X2lmcmVxKSwgaiArPSBzaXplb2YgKHN0cnVjdCBpZnJlcSkpIHsKLQkJaWYgKGNvcHlfaW5fdXNlcihpZnIzMiwgaWZyLCBzaXplb2YgKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKKwkgICAgIGkgKyBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkgPD0gaWZjMzIuaWZjX2xlbiAmJiBqIDwgaWZjLmlmY19sZW47CisJICAgICBpICs9IHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmcmVxKSwgaiArPSBzaXplb2Yoc3RydWN0IGlmcmVxKSkgeworCQlpZiAoY29weV9pbl91c2VyKGlmcjMyLCBpZnIsIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmcmVxKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWZyMzIrKzsKIAkJaWZyKys7CkBAIC0yNTY3LDcgKzI1NzAsNyBAQAogCWNvbXBhdF91cHRyX3QgdXB0cjMyOwogCXN0cnVjdCBpZnJlcSBfX3VzZXIgKnVpZnI7CiAKLQl1aWZyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mICgqdWlmcikpOworCXVpZnIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnVpZnIpKTsKIAlpZiAoY29weV9pbl91c2VyKHVpZnIsIHVpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTI2MDEsOSArMjYwNCw5IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlvbGRfZnMgPSBnZXRfZnMoKTsKLQkJc2V0X2ZzIChLRVJORUxfRFMpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKIAkJZXJyID0gZGV2X2lvY3RsKG5ldCwgY21kLCAma2lmcik7Ci0JCXNldF9mcyAob2xkX2ZzKTsKKwkJc2V0X2ZzKG9sZF9mcyk7CiAKIAkJcmV0dXJuIGVycjsKIAljYXNlIFNJT0NCT05EU0xBVkVJTkZPUVVFUlk6CkBAIC0yNzEwLDkgKzI3MTMsOSBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW9sZF9mcyA9IGdldF9mcygpOwotCXNldF9mcyAoS0VSTkVMX0RTKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKIAllcnIgPSBkZXZfaW9jdGwobmV0LCBjbWQsICh2b2lkIF9fdXNlciAqKSZpZnIpOwotCXNldF9mcyAob2xkX2ZzKTsKKwlzZXRfZnMob2xkX2ZzKTsKIAogCWlmIChjbWQgPT0gU0lPQ0dJRk1BUCAmJiAhZXJyKSB7CiAJCWVyciA9IGNvcHlfdG9fdXNlcih1aWZyMzIsICZpZnIsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKQEAgLTI3MzQsNyArMjczNyw3IEBACiAJY29tcGF0X3VwdHJfdCB1cHRyMzI7CiAJc3RydWN0IGlmcmVxIF9fdXNlciAqdWlmcjsKIAotCXVpZnIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YgKCp1aWZyKSk7CisJdWlmciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdWlmcikpOwogCWlmIChjb3B5X2luX3VzZXIodWlmciwgdWlmcjMyLCBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMjc1MCwyMCArMjc1MywyMCBAQAogfQogCiBzdHJ1Y3QgcnRlbnRyeTMyIHsKLQl1MzIgICAJCXJ0X3BhZDE7CisJdTMyCQlydF9wYWQxOwogCXN0cnVjdCBzb2NrYWRkciBydF9kc3Q7ICAgICAgICAgLyogdGFyZ2V0IGFkZHJlc3MgICAgICAgICAgICAgICAqLwogCXN0cnVjdCBzb2NrYWRkciBydF9nYXRld2F5OyAgICAgLyogZ2F0ZXdheSBhZGRyIChSVEZfR0FURVdBWSkgICAqLwogCXN0cnVjdCBzb2NrYWRkciBydF9nZW5tYXNrOyAgICAgLyogdGFyZ2V0IG5ldHdvcmsgbWFzayAoSVApICAgICAqLwotCXVuc2lnbmVkIHNob3J0ICBydF9mbGFnczsKLQlzaG9ydCAgICAgICAgICAgcnRfcGFkMjsKLQl1MzIgICAJCXJ0X3BhZDM7Ci0JdW5zaWduZWQgY2hhciAgIHJ0X3RvczsKLQl1bnNpZ25lZCBjaGFyICAgcnRfY2xhc3M7Ci0Jc2hvcnQgICAgICAgICAgIHJ0X3BhZDQ7Ci0Jc2hvcnQgICAgICAgICAgIHJ0X21ldHJpYzsgICAgICAvKiArMSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkhICovCisJdW5zaWduZWQgc2hvcnQJcnRfZmxhZ3M7CisJc2hvcnQJCXJ0X3BhZDI7CisJdTMyCQlydF9wYWQzOworCXVuc2lnbmVkIGNoYXIJcnRfdG9zOworCXVuc2lnbmVkIGNoYXIJcnRfY2xhc3M7CisJc2hvcnQJCXJ0X3BhZDQ7CisJc2hvcnQJCXJ0X21ldHJpYzsgICAgICAvKiArMSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkhICovCiAJLyogY2hhciAqICovIHUzMiBydF9kZXY7ICAgICAgICAvKiBmb3JjaW5nIHRoZSBkZXZpY2UgYXQgYWRkICAgICovCi0JdTMyICAgCQlydF9tdHU7ICAgICAgICAgLyogcGVyIHJvdXRlIE1UVS9XaW5kb3cgICAgICAgICAqLwotCXUzMiAgIAkJcnRfd2luZG93OyAgICAgIC8qIFdpbmRvdyBjbGFtcGluZyAgICAgICAgICAgICAgKi8KKwl1MzIJCXJ0X210dTsgICAgICAgICAvKiBwZXIgcm91dGUgTVRVL1dpbmRvdyAgICAgICAgICovCisJdTMyCQlydF93aW5kb3c7ICAgICAgLyogV2luZG93IGNsYW1waW5nICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIHNob3J0ICBydF9pcnR0OyAgICAgICAgLyogSW5pdGlhbCBSVFQgICAgICAgICAgICAgICAgICAqLwogfTsKIApAQCAtMjc5MywyOSArMjc5NiwyOSBAQAogCiAJaWYgKHNvY2sgJiYgc29jay0+c2sgJiYgc29jay0+c2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgeyAvKiBpcHY2ICovCiAJCXN0cnVjdCBpbjZfcnRtc2czMiBfX3VzZXIgKnVyNiA9IGFyZ3A7Ci0JCXJldCA9IGNvcHlfZnJvbV91c2VyICgmcjYucnRtc2dfZHN0LCAmKHVyNi0+cnRtc2dfZHN0KSwKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnI2LnJ0bXNnX2RzdCwgJih1cjYtPnJ0bXNnX2RzdCksCiAJCQkzICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwotCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfdHlwZSwgJih1cjYtPnJ0bXNnX3R5cGUpKTsKLQkJcmV0IHw9IF9fZ2V0X3VzZXIgKHI2LnJ0bXNnX2RzdF9sZW4sICYodXI2LT5ydG1zZ19kc3RfbGVuKSk7Ci0JCXJldCB8PSBfX2dldF91c2VyIChyNi5ydG1zZ19zcmNfbGVuLCAmKHVyNi0+cnRtc2dfc3JjX2xlbikpOwotCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfbWV0cmljLCAmKHVyNi0+cnRtc2dfbWV0cmljKSk7Ci0JCXJldCB8PSBfX2dldF91c2VyIChyNi5ydG1zZ19pbmZvLCAmKHVyNi0+cnRtc2dfaW5mbykpOwotCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfZmxhZ3MsICYodXI2LT5ydG1zZ19mbGFncykpOwotCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfaWZpbmRleCwgJih1cjYtPnJ0bXNnX2lmaW5kZXgpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfdHlwZSwgJih1cjYtPnJ0bXNnX3R5cGUpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfZHN0X2xlbiwgJih1cjYtPnJ0bXNnX2RzdF9sZW4pKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfc3JjX2xlbiwgJih1cjYtPnJ0bXNnX3NyY19sZW4pKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfbWV0cmljLCAmKHVyNi0+cnRtc2dfbWV0cmljKSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI2LnJ0bXNnX2luZm8sICYodXI2LT5ydG1zZ19pbmZvKSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI2LnJ0bXNnX2ZsYWdzLCAmKHVyNi0+cnRtc2dfZmxhZ3MpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfaWZpbmRleCwgJih1cjYtPnJ0bXNnX2lmaW5kZXgpKTsKIAogCQlyID0gKHZvaWQgKikgJnI2OwogCX0gZWxzZSB7IC8qIGlwdjQgKi8KIAkJc3RydWN0IHJ0ZW50cnkzMiBfX3VzZXIgKnVyNCA9IGFyZ3A7Ci0JCXJldCA9IGNvcHlfZnJvbV91c2VyICgmcjQucnRfZHN0LCAmKHVyNC0+cnRfZHN0KSwKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnI0LnJ0X2RzdCwgJih1cjQtPnJ0X2RzdCksCiAJCQkJCTMgKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0JCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9mbGFncywgJih1cjQtPnJ0X2ZsYWdzKSk7Ci0JCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9tZXRyaWMsICYodXI0LT5ydF9tZXRyaWMpKTsKLQkJcmV0IHw9IF9fZ2V0X3VzZXIgKHI0LnJ0X210dSwgJih1cjQtPnJ0X210dSkpOwotCQlyZXQgfD0gX19nZXRfdXNlciAocjQucnRfd2luZG93LCAmKHVyNC0+cnRfd2luZG93KSk7Ci0JCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9pcnR0LCAmKHVyNC0+cnRfaXJ0dCkpOwotCQlyZXQgfD0gX19nZXRfdXNlciAocnRkZXYsICYodXI0LT5ydF9kZXYpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjQucnRfZmxhZ3MsICYodXI0LT5ydF9mbGFncykpOworCQlyZXQgfD0gX19nZXRfdXNlcihyNC5ydF9tZXRyaWMsICYodXI0LT5ydF9tZXRyaWMpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjQucnRfbXR1LCAmKHVyNC0+cnRfbXR1KSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI0LnJ0X3dpbmRvdywgJih1cjQtPnJ0X3dpbmRvdykpOworCQlyZXQgfD0gX19nZXRfdXNlcihyNC5ydF9pcnR0LCAmKHVyNC0+cnRfaXJ0dCkpOworCQlyZXQgfD0gX19nZXRfdXNlcihydGRldiwgJih1cjQtPnJ0X2RldikpOwogCQlpZiAocnRkZXYpIHsKLQkJCXJldCB8PSBjb3B5X2Zyb21fdXNlciAoZGV2bmFtZSwgY29tcGF0X3B0cihydGRldiksIDE1KTsKKwkJCXJldCB8PSBjb3B5X2Zyb21fdXNlcihkZXZuYW1lLCBjb21wYXRfcHRyKHJ0ZGV2KSwgMTUpOwogCQkJcjQucnRfZGV2ID0gZGV2bmFtZTsgZGV2bmFtZVsxNV0gPSAwOwogCQl9IGVsc2UKIAkJCXI0LnJ0X2RldiA9IE5VTEw7CkBAIC0yODI4LDkgKzI4MzEsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzZXRfZnMgKEtFUk5FTF9EUyk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJcmV0ID0gc29ja19kb19pb2N0bChuZXQsIHNvY2ssIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHIpOwotCXNldF9mcyAob2xkX2ZzKTsKKwlzZXRfZnMob2xkX2ZzKTsKIAogb3V0OgogCXJldHVybiByZXQ7CkBAIC0yOTkzLDExICsyOTk2LDEzIEBACiB7CiAJcmV0dXJuIHNvY2stPm9wcy0+YmluZChzb2NrLCBhZGRyLCBhZGRybGVuKTsKIH0KK0VYUE9SVF9TWU1CT0woa2VybmVsX2JpbmQpOwogCiBpbnQga2VybmVsX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKIHsKIAlyZXR1cm4gc29jay0+b3BzLT5saXN0ZW4oc29jaywgYmFja2xvZyk7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9saXN0ZW4pOwogCiBpbnQga2VybmVsX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICoqbmV3c29jaywgaW50IGZsYWdzKQogewpAQCAtMzAyMiwyNCArMzAyNywyOCBAQAogZG9uZToKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfYWNjZXB0KTsKIAogaW50IGtlcm5lbF9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4sCiAJCSAgIGludCBmbGFncykKIHsKIAlyZXR1cm4gc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIGFkZHIsIGFkZHJsZW4sIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woa2VybmVsX2Nvbm5lY3QpOwogCiBpbnQga2VybmVsX2dldHNvY2tuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKIAkJCSBpbnQgKmFkZHJsZW4pCiB7CiAJcmV0dXJuIHNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCBhZGRyLCBhZGRybGVuLCAwKTsKIH0KK0VYUE9SVF9TWU1CT0woa2VybmVsX2dldHNvY2tuYW1lKTsKIAogaW50IGtlcm5lbF9nZXRwZWVybmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCiAJCQkgaW50ICphZGRybGVuKQogewogCXJldHVybiBzb2NrLT5vcHMtPmdldG5hbWUoc29jaywgYWRkciwgYWRkcmxlbiwgMSk7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9nZXRwZWVybmFtZSk7CiAKIGludCBrZXJuZWxfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJY2hhciAqb3B0dmFsLCBpbnQgKm9wdGxlbikKQEAgLTMwNTYsNiArMzA2NSw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfZ2V0c29ja29wdCk7CiAKIGludCBrZXJuZWxfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJY2hhciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQpAQCAtMzA3Miw2ICszMDgyLDcgQEAKIAlzZXRfZnMob2xkZnMpOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9zZXRzb2Nrb3B0KTsKIAogaW50IGtlcm5lbF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKIAkJICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCkBAIC0zMDgzLDYgKzMwOTQsNyBAQAogCiAJcmV0dXJuIHNvY2tfbm9fc2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9zZW5kcGFnZSk7CiAKIGludCBrZXJuZWxfc29ja19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTMwOTUsMzMgKzMxMDcsMTAgQEAKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9zb2NrX2lvY3RsKTsKIAogaW50IGtlcm5lbF9zb2NrX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGVudW0gc29ja19zaHV0ZG93bl9jbWQgaG93KQogewogCXJldHVybiBzb2NrLT5vcHMtPnNodXRkb3duKHNvY2ssIGhvdyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0woc29ja19jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChzb2NrX2NyZWF0ZV9rZXJuKTsKLUVYUE9SVF9TWU1CT0woc29ja19jcmVhdGVfbGl0ZSk7Ci1FWFBPUlRfU1lNQk9MKHNvY2tfbWFwX2ZkKTsKLUVYUE9SVF9TWU1CT0woc29ja19yZWN2bXNnKTsKLUVYUE9SVF9TWU1CT0woc29ja19yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKHNvY2tfcmVsZWFzZSk7Ci1FWFBPUlRfU1lNQk9MKHNvY2tfc2VuZG1zZyk7Ci1FWFBPUlRfU1lNQk9MKHNvY2tfdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKHNvY2tfd2FrZV9hc3luYyk7Ci1FWFBPUlRfU1lNQk9MKHNvY2tmZF9sb29rdXApOwotRVhQT1JUX1NZTUJPTChrZXJuZWxfc2VuZG1zZyk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF9yZWN2bXNnKTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX2JpbmQpOwotRVhQT1JUX1NZTUJPTChrZXJuZWxfbGlzdGVuKTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX2FjY2VwdCk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF9jb25uZWN0KTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX2dldHNvY2tuYW1lKTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX2dldHBlZXJuYW1lKTsKLUVYUE9SVF9TWU1CT0woa2VybmVsX2dldHNvY2tvcHQpOwotRVhQT1JUX1NZTUJPTChrZXJuZWxfc2V0c29ja29wdCk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF9zZW5kcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF9zb2NrX2lvY3RsKTsKIEVYUE9SVF9TWU1CT0woa2VybmVsX3NvY2tfc2h1dGRvd24pOwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGZlZjJjYzUuLjQ0MTRhMTggMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCXJldHVybiBzOwogfQogCi1zdGF0aWMgc3RydWN0IHNvY2sgKnVuaXhfZmluZF9zb2NrZXRfYnlpbm9kZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBpbm9kZSAqaSkKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqdW5peF9maW5kX3NvY2tldF9ieWlub2RlKHN0cnVjdCBpbm9kZSAqaSkKIHsKIAlzdHJ1Y3Qgc29jayAqczsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKQEAgLTI5Miw5ICsyOTIsNiBAQAogCQkgICAgJnVuaXhfc29ja2V0X3RhYmxlW2ktPmlfaW5vICYgKFVOSVhfSEFTSF9TSVpFIC0gMSldKSB7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHVuaXhfc2socyktPmRlbnRyeTsKIAotCQlpZiAoIW5ldF9lcShzb2NrX25ldChzKSwgbmV0KSkKLQkJCWNvbnRpbnVlOwotCiAJCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX2lub2RlID09IGkpIHsKIAkJCXNvY2tfaG9sZChzKTsKIAkJCWdvdG8gZm91bmQ7CkBAIC00NTAsMTEgKzQ0NywzMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpbml0X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlwdXRfcGlkKHNrLT5za19wZWVyX3BpZCk7CisJaWYgKHNrLT5za19wZWVyX2NyZWQpCisJCXB1dF9jcmVkKHNrLT5za19wZWVyX2NyZWQpOworCXNrLT5za19wZWVyX3BpZCAgPSBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSk7CisJc2stPnNrX3BlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTsKK30KKworc3RhdGljIHZvaWQgY29weV9wZWVyY3JlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwZWVyc2spCit7CisJcHV0X3BpZChzay0+c2tfcGVlcl9waWQpOworCWlmIChzay0+c2tfcGVlcl9jcmVkKQorCQlwdXRfY3JlZChzay0+c2tfcGVlcl9jcmVkKTsKKwlzay0+c2tfcGVlcl9waWQgID0gZ2V0X3BpZChwZWVyc2stPnNrX3BlZXJfcGlkKTsKKwlzay0+c2tfcGVlcl9jcmVkID0gZ2V0X2NyZWQocGVlcnNrLT5za19wZWVyX2NyZWQpOworfQorCiBzdGF0aWMgaW50IHVuaXhfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQogewogCWludCBlcnI7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOworCXN0cnVjdCBwaWQgKm9sZF9waWQgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZCA9IE5VTEw7CiAKIAllcnIgPSAtRU9QTk9UU1VQUDsKIAlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSAmJiBzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKQpAQCAtNDcwLDEyICs0ODcsMTQgQEAKIAlzay0+c2tfbWF4X2Fja19iYWNrbG9nCT0gYmFja2xvZzsKIAlzay0+c2tfc3RhdGUJCT0gVENQX0xJU1RFTjsKIAkvKiBzZXQgY3JlZGVudGlhbHMgc28gY29ubmVjdCBjYW4gY29weSB0aGVtICovCi0Jc2stPnNrX3BlZXJjcmVkLnBpZAk9IHRhc2tfdGdpZF92bnIoY3VycmVudCk7Ci0JY3VycmVudF9ldWlkX2VnaWQoJnNrLT5za19wZWVyY3JlZC51aWQsICZzay0+c2tfcGVlcmNyZWQuZ2lkKTsKKwlpbml0X3BlZXJjcmVkKHNrKTsKIAllcnIgPSAwOwogCiBvdXRfdW5sb2NrOgogCXVuaXhfc3RhdGVfdW5sb2NrKHNrKTsKKwlwdXRfcGlkKG9sZF9waWQpOworCWlmIChvbGRfY3JlZCkKKwkJcHV0X2NyZWQob2xkX2NyZWQpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC03MzYsNyArNzU1LDcgQEAKIAkJZXJyID0gLUVDT05OUkVGVVNFRDsKIAkJaWYgKCFTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkKIAkJCWdvdG8gcHV0X2ZhaWw7Ci0JCXUgPSB1bml4X2ZpbmRfc29ja2V0X2J5aW5vZGUobmV0LCBpbm9kZSk7CisJCXUgPSB1bml4X2ZpbmRfc29ja2V0X2J5aW5vZGUoaW5vZGUpOwogCQlpZiAoIXUpCiAJCQlnb3RvIHB1dF9mYWlsOwogCkBAIC0xMTQwLDggKzExNTksNyBAQAogCXVuaXhfcGVlcihuZXdzaykJPSBzazsKIAluZXdzay0+c2tfc3RhdGUJCT0gVENQX0VTVEFCTElTSEVEOwogCW5ld3NrLT5za190eXBlCQk9IHNrLT5za190eXBlOwotCW5ld3NrLT5za19wZWVyY3JlZC5waWQJPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpOwotCWN1cnJlbnRfZXVpZF9lZ2lkKCZuZXdzay0+c2tfcGVlcmNyZWQudWlkLCAmbmV3c2stPnNrX3BlZXJjcmVkLmdpZCk7CisJaW5pdF9wZWVyY3JlZChuZXdzayk7CiAJbmV3dSA9IHVuaXhfc2sobmV3c2spOwogCW5ld3NrLT5za193cQkJPSAmbmV3dS0+cGVlcl93cTsKIAlvdGhlcnUgPSB1bml4X3NrKG90aGVyKTsKQEAgLTExNTcsNyArMTE3NSw3IEBACiAJfQogCiAJLyogU2V0IGNyZWRlbnRpYWxzICovCi0Jc2stPnNrX3BlZXJjcmVkID0gb3RoZXItPnNrX3BlZXJjcmVkOworCWNvcHlfcGVlcmNyZWQoc2ssIG90aGVyKTsKIAogCXNvY2stPnN0YXRlCT0gU1NfQ09OTkVDVEVEOwogCXNrLT5za19zdGF0ZQk9IFRDUF9FU1RBQkxJU0hFRDsKQEAgLTExOTksMTAgKzEyMTcsOCBAQAogCXNvY2tfaG9sZChza2IpOwogCXVuaXhfcGVlcihza2EpID0gc2tiOwogCXVuaXhfcGVlcihza2IpID0gc2thOwotCXNrYS0+c2tfcGVlcmNyZWQucGlkID0gc2tiLT5za19wZWVyY3JlZC5waWQgPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpOwotCWN1cnJlbnRfZXVpZF9lZ2lkKCZza2ItPnNrX3BlZXJjcmVkLnVpZCwgJnNrYi0+c2tfcGVlcmNyZWQuZ2lkKTsKLQlza2EtPnNrX3BlZXJjcmVkLnVpZCA9IHNrYi0+c2tfcGVlcmNyZWQudWlkOwotCXNrYS0+c2tfcGVlcmNyZWQuZ2lkID0gc2tiLT5za19wZWVyY3JlZC5naWQ7CisJaW5pdF9wZWVyY3JlZChza2EpOworCWluaXRfcGVlcmNyZWQoc2tiKTsKIAogCWlmIChza2EtPnNrX3R5cGUgIT0gU09DS19ER1JBTSkgewogCQlza2EtPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOwpAQCAtMTI5NywxOCArMTMxMywyMCBAQAogCWludCBpOwogCiAJc2NtLT5mcCA9IFVOSVhDQihza2IpLmZwOwotCXNrYi0+ZGVzdHJ1Y3RvciA9IHNvY2tfd2ZyZWU7CiAJVU5JWENCKHNrYikuZnAgPSBOVUxMOwogCiAJZm9yIChpID0gc2NtLT5mcC0+Y291bnQtMTsgaSA+PSAwOyBpLS0pCiAJCXVuaXhfbm90aW5mbGlnaHQoc2NtLT5mcC0+ZnBbaV0pOwogfQogCi1zdGF0aWMgdm9pZCB1bml4X2Rlc3RydWN0X2ZkcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgdW5peF9kZXN0cnVjdF9zY20oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207CiAJbWVtc2V0KCZzY20sIDAsIHNpemVvZihzY20pKTsKLQl1bml4X2RldGFjaF9mZHMoJnNjbSwgc2tiKTsKKwlzY20ucGlkICA9IFVOSVhDQihza2IpLnBpZDsKKwlzY20uY3JlZCA9IFVOSVhDQihza2IpLmNyZWQ7CisJaWYgKFVOSVhDQihza2IpLmZwKQorCQl1bml4X2RldGFjaF9mZHMoJnNjbSwgc2tiKTsKIAogCS8qIEFsYXMsIGl0IGNhbGxzIFZGUyAqLwogCS8qIFNvIGZzY2tpbmcgd2hhdD8gZnB1dCgpIGhhZCBiZWVuIFNNUC1zYWZlIHNpbmNlIHRoZSBsYXN0IFN1bW1lciAqLwpAQCAtMTMzMSwxMCArMTM0OSwyMiBAQAogCiAJZm9yIChpID0gc2NtLT5mcC0+Y291bnQtMTsgaSA+PSAwOyBpLS0pCiAJCXVuaXhfaW5mbGlnaHQoc2NtLT5mcC0+ZnBbaV0pOwotCXNrYi0+ZGVzdHJ1Y3RvciA9IHVuaXhfZGVzdHJ1Y3RfZmRzOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHVuaXhfc2NtX3RvX3NrYihzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNlbmRfZmRzKQoreworCWludCBlcnIgPSAwOworCVVOSVhDQihza2IpLnBpZCAgPSBnZXRfcGlkKHNjbS0+cGlkKTsKKwlVTklYQ0Ioc2tiKS5jcmVkID0gZ2V0X2NyZWQoc2NtLT5jcmVkKTsKKwlVTklYQ0Ioc2tiKS5mcCA9IE5VTEw7CisJaWYgKHNjbS0+ZnAgJiYgc2VuZF9mZHMpCisJCWVyciA9IHVuaXhfYXR0YWNoX2ZkcyhzY20sIHNrYik7CisKKwlza2ItPmRlc3RydWN0b3IgPSB1bml4X2Rlc3RydWN0X3NjbTsKKwlyZXR1cm4gZXJyOworfQorCiAvKgogICoJU2VuZCBBRl9VTklYIGRhdGEuCiAgKi8KQEAgLTEzOTEsMTIgKzE0MjEsOSBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQltZW1jcHkoVU5JWENSRURTKHNrYiksICZzaW9jYi0+c2NtLT5jcmVkcywgc2l6ZW9mKHN0cnVjdCB1Y3JlZCkpOwotCWlmIChzaW9jYi0+c2NtLT5mcCkgewotCQllcnIgPSB1bml4X2F0dGFjaF9mZHMoc2lvY2ItPnNjbSwgc2tiKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JfQorCWVyciA9IHVuaXhfc2NtX3RvX3NrYihzaW9jYi0+c2NtLCBza2IsIHRydWUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CiAJdW5peF9nZXRfc2VjZGF0YShzaW9jYi0+c2NtLCBza2IpOwogCiAJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKQEAgLTE1NjYsMTYgKzE1OTMsMTQgQEAKIAkJICovCiAJCXNpemUgPSBtaW5fdChpbnQsIHNpemUsIHNrYl90YWlscm9vbShza2IpKTsKIAotCQltZW1jcHkoVU5JWENSRURTKHNrYiksICZzaW9jYi0+c2NtLT5jcmVkcywgc2l6ZW9mKHN0cnVjdCB1Y3JlZCkpOworCiAJCS8qIE9ubHkgc2VuZCB0aGUgZmRzIGluIHRoZSBmaXJzdCBidWZmZXIgKi8KLQkJaWYgKHNpb2NiLT5zY20tPmZwICYmICFmZHNfc2VudCkgewotCQkJZXJyID0gdW5peF9hdHRhY2hfZmRzKHNpb2NiLT5zY20sIHNrYik7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQkJZ290byBvdXRfZXJyOwotCQkJfQotCQkJZmRzX3NlbnQgPSB0cnVlOworCQllcnIgPSB1bml4X3NjbV90b19za2Ioc2lvY2ItPnNjbSwgc2tiLCAhZmRzX3NlbnQpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQorCQlmZHNfc2VudCA9IHRydWU7CiAKIAkJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgc2l6ZSksIG1zZy0+bXNnX2lvdiwgc2l6ZSk7CiAJCWlmIChlcnIpIHsKQEAgLTE2OTIsNyArMTcxNyw3IEBACiAJCXNpb2NiLT5zY20gPSAmdG1wX3NjbTsKIAkJbWVtc2V0KCZ0bXBfc2NtLCAwLCBzaXplb2YodG1wX3NjbSkpOwogCX0KLQlzaW9jYi0+c2NtLT5jcmVkcyA9ICpVTklYQ1JFRFMoc2tiKTsKKwlzY21fc2V0X2NyZWQoc2lvY2ItPnNjbSwgVU5JWENCKHNrYikucGlkLCBVTklYQ0Ioc2tiKS5jcmVkKTsKIAl1bml4X3NldF9zZWNkYXRhKHNpb2NiLT5zY20sIHNrYik7CiAKIAlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgewpAQCAtMTg0MSwxNCArMTg2NiwxNCBAQAogCiAJCWlmIChjaGVja19jcmVkcykgewogCQkJLyogTmV2ZXIgZ2x1ZSBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCB3cml0ZXJzICovCi0JCQlpZiAobWVtY21wKFVOSVhDUkVEUyhza2IpLCAmc2lvY2ItPnNjbS0+Y3JlZHMsCi0JCQkJICAgc2l6ZW9mKHNpb2NiLT5zY20tPmNyZWRzKSkgIT0gMCkgeworCQkJaWYgKChVTklYQ0Ioc2tiKS5waWQgICE9IHNpb2NiLT5zY20tPnBpZCkgfHwKKwkJCSAgICAoVU5JWENCKHNrYikuY3JlZCAhPSBzaW9jYi0+c2NtLT5jcmVkKSkgewogCQkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIENvcHkgY3JlZGVudGlhbHMgKi8KLQkJCXNpb2NiLT5zY20tPmNyZWRzID0gKlVOSVhDUkVEUyhza2IpOworCQkJc2NtX3NldF9jcmVkKHNpb2NiLT5zY20sIFVOSVhDQihza2IpLnBpZCwgVU5JWENCKHNrYikuY3JlZCk7CiAJCQljaGVja19jcmVkcyA9IDE7CiAJCX0KIApAQCAtMTg4MSw3ICsxOTA2LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJa2ZyZWVfc2tiKHNrYik7CisJCQljb25zdW1lX3NrYihza2IpOwogCiAJCQlpZiAoc2lvY2ItPnNjbS0+ZnApCiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCmluZGV4IDI1OGRhYTguLjJiZjIzNDAgMTAwNjQ0Ci0tLSBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCisrKyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCkBAIC00OCw3ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbSosIHN0ciogZnVuY3Rpb25zICovCiAKQEAgLTcxLDYgKzcxLDcgQEAKICAqCVdBTiBkZXZpY2UgSU9DVEwgaGFuZGxlcnMKICAqLwogCitzdGF0aWMgREVGSU5FX01VVEVYKHdhbnJvdXRlcl9tdXRleCk7CiBzdGF0aWMgaW50IHdhbnJvdXRlcl9kZXZpY2Vfc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKIAkJCQkgIHdhbmRldl9jb25mX3QgX191c2VyICp1X2NvbmYpOwogc3RhdGljIGludCB3YW5yb3V0ZXJfZGV2aWNlX3N0YXQoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKQEAgLTM3Niw3ICszNzcsNyBAQAogCWlmICh3YW5kZXYtPm1hZ2ljICE9IFJPVVRFUl9NQUdJQykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJndhbnJvdXRlcl9tdXRleCk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJPVVRFUl9TRVRVUDoKIAkJZXJyID0gd2Fucm91dGVyX2RldmljZV9zZXR1cCh3YW5kZXYsIGRhdGEpOwpAQCAtNDA4LDcgKzQwOSw3IEBACiAJCQllcnIgPSB3YW5kZXYtPmlvY3RsKHdhbmRldiwgY21kLCBhcmcpOwogCQllbHNlIGVyciA9IC1FSU5WQUw7CiAJfQotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJndhbnJvdXRlcl9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMgYi9uZXQvd2Fucm91dGVyL3dhbnByb2MuYwppbmRleCBjNDRkOTZiLi4xMWYyNWM3IDEwMDY0NAotLS0gYS9uZXQvd2Fucm91dGVyL3dhbnByb2MuYworKysgYi9uZXQvd2Fucm91dGVyL3dhbnByb2MuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIEFQSSBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTY2LDYgKzY2LDcgQEAKICAqCS9wcm9jL25ldC9yb3V0ZXIKICAqLwogCitzdGF0aWMgREVGSU5FX01VVEVYKGNvbmZpZ19tdXRleCk7CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3JvdXRlcjsKIAogLyogU3RyaW5ncyAqLwpAQCAtODUsNyArODYsNyBAQAogCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXY7CiAJbG9mZl90IGwgPSAqcG9zOwogCi0JbG9ja19rZXJuZWwoKTsKKwltdXRleF9sb2NrKCZjb25maWdfbXV0ZXgpOwogCWlmICghbC0tKQogCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwogCWZvciAod2FuZGV2ID0gd2Fucm91dGVyX3JvdXRlcl9kZXZsaXN0OyBsLS0gJiYgd2FuZGV2OwpAQCAtMTA0LDcgKzEwNSw3IEBACiBzdGF0aWMgdm9pZCByX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogCV9fcmVsZWFzZXMoa2VybmVsX2xvY2spCiB7Ci0JdW5sb2NrX2tlcm5lbCgpOworCW11dGV4X3VubG9jaygmY29uZmlnX211dGV4KTsKIH0KIAogc3RhdGljIGludCBjb25maWdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY2hhbi5jIGIvbmV0L3dpcmVsZXNzL2NoYW4uYwppbmRleCBiMDFhNmY2Li5kMGM5MmRkIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY2hhbi5jCisrKyBiL25ldC93aXJlbGVzcy9jaGFuLmMKQEAgLTM1LDggKzM1LDkgQEAKIAkJaWYgKCFodF9jYXAtPmh0X3N1cHBvcnRlZCkKIAkJCXJldHVybiBOVUxMOwogCi0JCWlmICghKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApIHx8Ci0JCSAgICBodF9jYXAtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCkKKwkJaWYgKGNoYW5uZWxfdHlwZSAhPSBOTDgwMjExX0NIQU5fSFQyMCAmJgorCQkgICAgKCEoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgfHwKKwkJICAgIGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5UKSkKIAkJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuYyBiL25ldC93aXJlbGVzcy9jb3JlLmMKaW5kZXggMzdkMGUwYS4uNTQxZTJmZiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuYworKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC00NzIsMjQgKzQ3MiwyMiBAQAogCS8qIGNoZWNrIGFuZCBzZXQgdXAgYml0cmF0ZXMgKi8KIAlpZWVlODAyMTFfc2V0X2JpdHJhdGVfZmxhZ3Mod2lwaHkpOwogCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfbXV0ZXgpOworCiAJcmVzID0gZGV2aWNlX2FkZCgmcmRldi0+d2lwaHkuZGV2KTsKIAlpZiAocmVzKQotCQlyZXR1cm4gcmVzOworCQlnb3RvIG91dF91bmxvY2s7CiAKIAlyZXMgPSByZmtpbGxfcmVnaXN0ZXIocmRldi0+cmZraWxsKTsKIAlpZiAocmVzKQogCQlnb3RvIG91dF9ybV9kZXY7CiAKLQltdXRleF9sb2NrKCZjZmc4MDIxMV9tdXRleCk7Ci0KIAkvKiBzZXQgdXAgcmVndWxhdG9yeSBpbmZvICovCiAJd2lwaHlfdXBkYXRlX3JlZ3VsYXRvcnkod2lwaHksIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFKTsKIAogCWxpc3RfYWRkX3JjdSgmcmRldi0+bGlzdCwgJmNmZzgwMjExX3JkZXZfbGlzdCk7CiAJY2ZnODAyMTFfcmRldl9saXN0X2dlbmVyYXRpb24rKzsKIAotCW11dGV4X3VubG9jaygmY2ZnODAyMTFfbXV0ZXgpOwotCiAJLyogYWRkIHRvIGRlYnVnZnMgKi8KIAlyZGV2LT53aXBoeS5kZWJ1Z2ZzZGlyID0KIAkJZGVidWdmc19jcmVhdGVfZGlyKHdpcGh5X25hbWUoJnJkZXYtPndpcGh5KSwKQEAgLTUwOSwxMSArNTA3LDE1IEBACiAJfQogCiAJY2ZnODAyMTFfZGVidWdmc19yZGV2X2FkZChyZGV2KTsKKwltdXRleF91bmxvY2soJmNmZzgwMjExX211dGV4KTsKIAogCXJldHVybiAwOwogCi0gb3V0X3JtX2RldjoKK291dF9ybV9kZXY6CiAJZGV2aWNlX2RlbCgmcmRldi0+d2lwaHkuZGV2KTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNmZzgwMjExX211dGV4KTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTCh3aXBoeV9yZWdpc3Rlcik7CkBAIC04OTQsNyArODk2LDcgQEAKIH0KIHN1YnN5c19pbml0Y2FsbChjZmc4MDIxMV9pbml0KTsKIAotc3RhdGljIHZvaWQgY2ZnODAyMTFfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGNmZzgwMjExX2V4aXQodm9pZCkKIHsKIAlkZWJ1Z2ZzX3JlbW92ZShpZWVlODAyMTFfZGVidWdmc19kaXIpOwogCW5sODAyMTFfZXhpdCgpOwpAQCAtOTA1LDMgKzkwNyw1MiBAQAogCWRlc3Ryb3lfd29ya3F1ZXVlKGNmZzgwMjExX3dxKTsKIH0KIG1vZHVsZV9leGl0KGNmZzgwMjExX2V4aXQpOworCitzdGF0aWMgaW50IF9fX3dpcGh5X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgIHN0cnVjdCB2YV9mb3JtYXQgKnZhZikKK3sKKwlpZiAoIXdpcGh5KQorCQlyZXR1cm4gcHJpbnRrKCIlcyhOVUxMIHdpcGh5ICopOiAlcFYiLCBsZXZlbCwgdmFmKTsKKworCXJldHVybiBwcmludGsoIiVzJXM6ICVwViIsIGxldmVsLCB3aXBoeV9uYW1lKHdpcGh5KSwgdmFmKTsKK30KKworaW50IF9fd2lwaHlfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXIgPSBfX193aXBoeV9wcmludGsobGV2ZWwsIHdpcGh5LCAmdmFmKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0woX193aXBoeV9wcmludGspOworCisjZGVmaW5lIGRlZmluZV93aXBoeV9wcmludGtfbGV2ZWwoZnVuYywga2Vybl9sZXZlbCkJCVwKK2ludCBmdW5jKGNvbnN0IHN0cnVjdCB3aXBoeSAqd2lwaHksIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQlcCit7CQkJCQkJCQlcCisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CQkJCQlcCisJdmFfbGlzdCBhcmdzOwkJCQkJCVwKKwlpbnQgcjsJCQkJCQkJXAorCQkJCQkJCQlcCisJdmFfc3RhcnQoYXJncywgZm10KTsJCQkJCVwKKwkJCQkJCQkJXAorCXZhZi5mbXQgPSBmbXQ7CQkJCQkJXAorCXZhZi52YSA9ICZhcmdzOwkJCQkJCVwKKwkJCQkJCQkJXAorCXIgPSBfX193aXBoeV9wcmludGsoa2Vybl9sZXZlbCwgd2lwaHksICZ2YWYpOwkJXAorCXZhX2VuZChhcmdzKTsJCQkJCQlcCisJCQkJCQkJCVwKKwlyZXR1cm4gcjsJCQkJCQlcCit9CQkJCQkJCQlcCitFWFBPUlRfU1lNQk9MKGZ1bmMpOworCitkZWZpbmVfd2lwaHlfcHJpbnRrX2xldmVsKHdpcGh5X2RlYnVnLCBLRVJOX0RFQlVHKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IGFlOTMwYWMuLjYzZDU3YWUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtMzM5LDYgKzMzOSw3IEBACiAJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCQkgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsCiAJCQkgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgdTY0ICpjb29raWUpOwogCiAvKiBTTUUgKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9nZW5yZWdkYi5hd2sgYi9uZXQvd2lyZWxlc3MvZ2VucmVnZGIuYXdrCmluZGV4IDNjYzllNjkuLjUzYzE0M2YgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9nZW5yZWdkYi5hd2sKKysrIGIvbmV0L3dpcmVsZXNzL2dlbnJlZ2RiLmF3awpAQCAtMjEsNiArMjEsNyBAQAogCXByaW50ICIiCiAJcHJpbnQgIiNpbmNsdWRlIDxsaW51eC9ubDgwMjExLmg+IgogCXByaW50ICIjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+IgorCXByaW50ICIjaW5jbHVkZSBcInJlZ2RiLmhcIiIKIAlwcmludCAiIgogCXJlZ2RiID0gImNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdfcmVnZGJbXSA9IHtcbiIKIH0KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9pYnNzLmMgYi9uZXQvd2lyZWxlc3MvaWJzcy5jCmluZGV4IGFkY2FiYmEuLjI3YThjZTkgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9pYnNzLmMKKysrIGIvbmV0L3dpcmVsZXNzL2lic3MuYwpAQCAtMjQ3LDggKzI0NywxMCBAQAogCWlmICghbmV0aWZfcnVubmluZyh3ZGV2LT5uZXRkZXYpKQogCQlyZXR1cm4gMDsKIAotCWlmICh3ZGV2LT53ZXh0LmtleXMpCisJaWYgKHdkZXYtPndleHQua2V5cykgewogCQl3ZGV2LT53ZXh0LmtleXMtPmRlZiA9IHdkZXYtPndleHQuZGVmYXVsdF9rZXk7CisJCXdkZXYtPndleHQua2V5cy0+ZGVmbWdtdCA9IHdkZXYtPndleHQuZGVmYXVsdF9tZ210X2tleTsKKwl9CiAKIAl3ZGV2LT53ZXh0Lmlic3MucHJpdmFjeSA9IHdkZXYtPndleHQuZGVmYXVsdF9rZXkgIT0gLTE7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9saWI4MDIxMV9jcnlwdF9jY21wLmMgYi9uZXQvd2lyZWxlc3MvbGliODAyMTFfY3J5cHRfY2NtcC5jCmluZGV4IGI3ZmEzMWQuLmRhY2IzYjQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9saWI4MDIxMV9jcnlwdF9jY21wLmMKKysrIGIvbmV0L3dpcmVsZXNzL2xpYjgwMjExX2NyeXB0X2NjbXAuYwpAQCAtNDY3LDcgKzQ2Nyw2IEBACiAJLm5hbWUgPSAiQ0NNUCIsCiAJLmluaXQgPSBsaWI4MDIxMV9jY21wX2luaXQsCiAJLmRlaW5pdCA9IGxpYjgwMjExX2NjbXBfZGVpbml0LAotCS5idWlsZF9pdiA9IGxpYjgwMjExX2NjbXBfaGRyLAogCS5lbmNyeXB0X21wZHUgPSBsaWI4MDIxMV9jY21wX2VuY3J5cHQsCiAJLmRlY3J5cHRfbXBkdSA9IGxpYjgwMjExX2NjbXBfZGVjcnlwdCwKIAkuZW5jcnlwdF9tc2R1ID0gTlVMTCwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9saWI4MDIxMV9jcnlwdF90a2lwLmMgYi9uZXQvd2lyZWxlc3MvbGliODAyMTFfY3J5cHRfdGtpcC5jCmluZGV4IDhjYmRiMzIuLjBmZTQwNTEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9saWI4MDIxMV9jcnlwdF90a2lwLmMKKysrIGIvbmV0L3dpcmVsZXNzL2xpYjgwMjExX2NyeXB0X3RraXAuYwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJfQogCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHIxMS0+ZnJhbWVfY29udHJvbCkpIHsKLQkJaGRyWzEyXSA9IGxlMTZfdG9fY3B1KCppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyMTEpKQorCQloZHJbMTJdID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcjExKSkpCiAJCQkmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCX0gZWxzZQogCQloZHJbMTJdID0gMDsJCS8qIHByaW9yaXR5ICovCkBAIC03NTcsNyArNzU3LDYgQEAKIAkubmFtZSA9ICJUS0lQIiwKIAkuaW5pdCA9IGxpYjgwMjExX3RraXBfaW5pdCwKIAkuZGVpbml0ID0gbGliODAyMTFfdGtpcF9kZWluaXQsCi0JLmJ1aWxkX2l2ID0gbGliODAyMTFfdGtpcF9oZHIsCiAJLmVuY3J5cHRfbXBkdSA9IGxpYjgwMjExX3RraXBfZW5jcnlwdCwKIAkuZGVjcnlwdF9tcGR1ID0gbGliODAyMTFfdGtpcF9kZWNyeXB0LAogCS5lbmNyeXB0X21zZHUgPSBsaWI4MDIxMV9taWNoYWVsX21pY19hZGQsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvbGliODAyMTFfY3J5cHRfd2VwLmMgYi9uZXQvd2lyZWxlc3MvbGliODAyMTFfY3J5cHRfd2VwLmMKaW5kZXggNmQ0MWUwNS4uZTJlODg4NyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2xpYjgwMjExX2NyeXB0X3dlcC5jCisrKyBiL25ldC93aXJlbGVzcy9saWI4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMjY5LDcgKzI2OSw2IEBACiAJLm5hbWUgPSAiV0VQIiwKIAkuaW5pdCA9IGxpYjgwMjExX3dlcF9pbml0LAogCS5kZWluaXQgPSBsaWI4MDIxMV93ZXBfZGVpbml0LAotCS5idWlsZF9pdiA9IGxpYjgwMjExX3dlcF9idWlsZF9pdiwKIAkuZW5jcnlwdF9tcGR1ID0gbGliODAyMTFfd2VwX2VuY3J5cHQsCiAJLmRlY3J5cHRfbXBkdSA9IGxpYjgwMjExX3dlcF9kZWNyeXB0LAogCS5lbmNyeXB0X21zZHUgPSBOVUxMLApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21sbWUuYyBiL25ldC93aXJlbGVzcy9tbG1lLmMKaW5kZXggNDhlYWQ2Zi4uZTc0YTFhMiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21sbWUuYworKysgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCkBAIC00NCwxMCArNDQsMTAgQEAKIAkJfQogCX0KIAotCVdBUk5fT04oIWRvbmUpOwotCi0Jbmw4MDIxMV9zZW5kX3J4X2F1dGgocmRldiwgZGV2LCBidWYsIGxlbiwgR0ZQX0tFUk5FTCk7Ci0JY2ZnODAyMTFfc21lX3J4X2F1dGgoZGV2LCBidWYsIGxlbik7CisJaWYgKGRvbmUpIHsKKwkJbmw4MDIxMV9zZW5kX3J4X2F1dGgocmRldiwgZGV2LCBidWYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJCWNmZzgwMjExX3NtZV9yeF9hdXRoKGRldiwgYnVmLCBsZW4pOworCX0KIAogCXdkZXZfdW5sb2NrKHdkZXYpOwogfQpAQCAtODI3LDYgKzgyNyw3IEBACiAJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCQkgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsCiAJCQkgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgdTY0ICpjb29raWUpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKQEAgLTg0NSw4ICs4NDYsOSBAQAogCQlpZiAoIXdkZXYtPmN1cnJlbnRfYnNzIHx8CiAJCSAgICBtZW1jbXAod2Rldi0+Y3VycmVudF9ic3MtPnB1Yi5ic3NpZCwgbWdtdC0+YnNzaWQsCiAJCQkgICBFVEhfQUxFTikgIT0gMCB8fAotCQkgICAgbWVtY21wKHdkZXYtPmN1cnJlbnRfYnNzLT5wdWIuYnNzaWQsIG1nbXQtPmRhLAotCQkJICAgRVRIX0FMRU4pICE9IDApCisJCSAgICAod2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkJICAgICBtZW1jbXAod2Rldi0+Y3VycmVudF9ic3MtPnB1Yi5ic3NpZCwgbWdtdC0+ZGEsCisJCQkgICAgRVRIX0FMRU4pICE9IDApKQogCQkJcmV0dXJuIC1FTk9UQ09OTjsKIAl9CiAKQEAgLTg1NSw3ICs4NTcsNyBAQAogCiAJLyogVHJhbnNtaXQgdGhlIEFjdGlvbiBmcmFtZSBhcyByZXF1ZXN0ZWQgYnkgdXNlciBzcGFjZSAqLwogCXJldHVybiByZGV2LT5vcHMtPmFjdGlvbigmcmRldi0+d2lwaHksIGRldiwgY2hhbiwgY2hhbm5lbF90eXBlLAotCQkJCSBidWYsIGxlbiwgY29va2llKTsKKwkJCQkgY2hhbm5lbF90eXBlX3ZhbGlkLCBidWYsIGxlbiwgY29va2llKTsKIH0KIAogYm9vbCBjZmc4MDIxMV9yeF9hY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZyZXEsIGNvbnN0IHU4ICpidWYsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCBkYjcxMTUwLi4zNzkwMmE1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTE1Myw2ICsxNTMsOSBAQAogCVtOTDgwMjExX0FUVFJfQ1FNXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVELCB9LAogCVtOTDgwMjExX0FUVFJfTE9DQUxfU1RBVEVfQ0hBTkdFXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX0FUVFJfQVBfSVNPTEFURV0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisKKwlbTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkddID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX0xFVkVMXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiAvKiBwb2xpY3kgZm9yIHRoZSBhdHRyaWJ1dGVzICovCkBAIC04NjksNiArODcyLDM0IEBACiAJCQlnb3RvIGJhZF9yZXM7CiAJfQogCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9TRVRUSU5HXSkgeworCQllbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlOworCQlpbnQgaWR4LCBtYm0gPSAwOworCisJCWlmICghcmRldi0+b3BzLT5zZXRfdHhfcG93ZXIpIHsKKwkJCXJlc3VsdCA9IC1FT1BOT1RTVVBQOworCQkJZ290byBiYWRfcmVzOworCQl9CisKKwkJaWR4ID0gTkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkc7CisJCXR5cGUgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tpZHhdKTsKKworCQlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9MRVZFTF0gJiYKKwkJICAgICh0eXBlICE9IE5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDKSkgeworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gYmFkX3JlczsKKwkJfQorCisJCWlmICh0eXBlICE9IE5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDKSB7CisJCQlpZHggPSBOTDgwMjExX0FUVFJfV0lQSFlfVFhfUE9XRVJfTEVWRUw7CisJCQltYm0gPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tpZHhdKTsKKwkJfQorCisJCXJlc3VsdCA9IHJkZXYtPm9wcy0+c2V0X3R4X3Bvd2VyKCZyZGV2LT53aXBoeSwgdHlwZSwgbWJtKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gYmFkX3JlczsKKwl9CisKIAljaGFuZ2VkID0gMDsKIAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlRdKSB7CkBAIC0xMTA3LDcgKzExMzgsNyBAQAogCQkJICAgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlKQogewogCWlmICghdXNlXzRhZGRyKSB7Ci0JCWlmIChuZXRkZXYgJiYgbmV0ZGV2LT5icl9wb3J0KQorCQlpZiAobmV0ZGV2ICYmIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpKQogCQkJcmV0dXJuIC1FQlVTWTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjczOCw2ICsyNzY5LDcgQEAKIAogIG5sYV9wdXRfZmFpbHVyZToKIAlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJbmxtc2dfZnJlZShtc2cpOwogCWVyciA9IC1FTVNHU0laRTsKICBvdXQ6CiAJLyogQ2xlYW51cCAqLwpAQCAtMjkyOSw2ICsyOTYxLDcgQEAKIAogbmxhX3B1dF9mYWlsdXJlOgogCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlubG1zZ19mcmVlKG1zZyk7CiAJZXJyID0gLUVNU0dTSVpFOwogb3V0OgogCW11dGV4X3VubG9jaygmY2ZnODAyMTFfbXV0ZXgpOwpAQCAtMzk1NSw2ICszOTg4LDU1IEBACiAJCX0KIAl9CiAKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFU10pIHsKKwkJdTggKnJhdGVzID0KKwkJCW5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVNdKTsKKwkJaW50IG5fcmF0ZXMgPQorCQkJbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQlNTX0JBU0lDX1JBVEVTXSk7CisJCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0KKwkJCXdpcGh5LT5iYW5kc1tpYnNzLmNoYW5uZWwtPmJhbmRdOworCQlpbnQgaSwgajsKKworCQlpZiAobl9yYXRlcyA9PSAwKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbl9yYXRlczsgaSsrKSB7CisJCQlpbnQgcmF0ZSA9IChyYXRlc1tpXSAmIDB4N2YpICogNTsKKwkJCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCQkJZm9yIChqID0gMDsgaiA8IHNiYW5kLT5uX2JpdHJhdGVzOyBqKyspIHsKKwkJCQlpZiAoc2JhbmQtPmJpdHJhdGVzW2pdLmJpdHJhdGUgPT0gcmF0ZSkgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWlic3MuYmFzaWNfcmF0ZXMgfD0gQklUKGopOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWZvdW5kKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSogSWYgbm8gcmF0ZXMgd2VyZSBleHBsaWNpdGx5IGNvbmZpZ3VyZWQsCisJCSogdXNlIHRoZSBtYW5kYXRvcnkgcmF0ZSBzZXQgZm9yIDExYiBvcgorCQkqIDExYSBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5LgorCQkqLworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCA9CisJCQl3aXBoeS0+YmFuZHNbaWJzcy5jaGFubmVsLT5iYW5kXTsKKwkJaW50IGo7CisJCXUzMiBmbGFnID0gaWJzcy5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFogPworCQkJSUVFRTgwMjExX1JBVEVfTUFOREFUT1JZX0EgOgorCQkJSUVFRTgwMjExX1JBVEVfTUFOREFUT1JZX0I7CisKKwkJZm9yIChqID0gMDsgaiA8IHNiYW5kLT5uX2JpdHJhdGVzOyBqKyspIHsKKwkJCWlmIChzYmFuZC0+Yml0cmF0ZXNbal0uZmxhZ3MgJiBmbGFnKQorCQkJCWlic3MuYmFzaWNfcmF0ZXMgfD0gQklUKGopOworCQl9CisJfQorCiAJZXJyID0gY2ZnODAyMTFfam9pbl9pYnNzKHJkZXYsIGRldiwgJmlic3MsIGNvbm5rZXlzKTsKIAogb3V0OgpAQCAtNDY1Myw3ICs0NzM1LDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIHVubG9ja19ydG5sOwogCi0JaWYgKGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwlpZiAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDY4MSw2ICs0NzY0LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKIAllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9OT19IVDsKKwlib29sIGNoYW5uZWxfdHlwZV92YWxpZCA9IGZhbHNlOwogCXUzMiBmcmVxOwogCWludCBlcnI7CiAJdm9pZCAqaGRyOwpAQCAtNDcwMiw3ICs0Nzg2LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwlpZiAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDcyMiw2ICs0ODA3LDcgQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQorCQljaGFubmVsX3R5cGVfdmFsaWQgPSB0cnVlOwogCX0KIAogCWZyZXEgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfRlJFUV0pOwpAQCAtNDc0NSw2ICs0ODMxLDcgQEAKIAkJZ290byBmcmVlX21zZzsKIAl9CiAJZXJyID0gY2ZnODAyMTFfbWxtZV9hY3Rpb24ocmRldiwgZGV2LCBjaGFuLCBjaGFubmVsX3R5cGUsCisJCQkJICAgY2hhbm5lbF90eXBlX3ZhbGlkLAogCQkJCSAgIG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9GUkFNRV0pLAogCQkJCSAgIG5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSksCiAJCQkJICAgJmNvb2tpZSk7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmVnLmMgYi9uZXQvd2lyZWxlc3MvcmVnLmMKaW5kZXggOGYwZDk3ZC4uZjE4MGRiMCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5jCisrKyBiL25ldC93aXJlbGVzcy9yZWcuYwpAQCAtNjcsMjAgKzY3LDEyIEBACiBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqY2ZnODAyMTFfcmVnZG9tYWluOwogCiAvKgotICogV2UgdXNlIHRoaXMgYXMgYSBwbGFjZSBmb3IgdGhlIHJkIHN0cnVjdHVyZSBidWlsdCBmcm9tIHRoZQotICogbGFzdCBwYXJzZWQgY291bnRyeSBJRSB0byByZXN0IHVudGlsIENSREEgZ2V0cyBiYWNrIHRvIHVzIHdpdGgKLSAqIHdoYXQgaXQgdGhpbmtzIHNob3VsZCBhcHBseSBmb3IgdGhlIHNhbWUgY291bnRyeQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKmNvdW50cnlfaWVfcmVnZG9tYWluOwotCi0vKgogICogUHJvdGVjdHMgc3RhdGljIHJlZy5jIGNvbXBvbmVudHM6CiAgKiAgICAgLSBjZmc4MDIxMV93b3JsZF9yZWdkb20KICAqICAgICAtIGNmZzgwMjExX3JlZ2RvbQotICogICAgIC0gY291bnRyeV9pZV9yZWdkb21haW4KICAqICAgICAtIGxhc3RfcmVxdWVzdAogICovCi1ERUZJTkVfTVVURVgocmVnX211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgocmVnX211dGV4KTsKICNkZWZpbmUgYXNzZXJ0X3JlZ19sb2NrKCkgV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZyZWdfbXV0ZXgpKQogCiAvKiBVc2VkIHRvIHF1ZXVlIHVwIHJlZ3VsYXRvcnkgaGludHMgKi8KQEAgLTI3NSwyNSArMjY3LDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyoqCi0gKiBjb3VudHJ5X2llX2ludGVncml0eV9jaGFuZ2VzIC0gdGVsbHMgdXMgaWYgdGhlIGNvdW50cnkgSUUgaGFzIGNoYW5nZWQKLSAqIEBjaGVja3N1bTogY2hlY2tzdW0gb2YgY291bnRyeSBJRSBvZiBmaWVsZHMgd2UgYXJlIGludGVyZXN0ZWQgaW4KLSAqCi0gKiBJZiB0aGUgY291bnRyeSBJRSBoYXMgbm90IGNoYW5nZWQgeW91IGNhbiBpZ25vcmUgaXQgc2FmZWx5LiBUaGlzIGlzCi0gKiB1c2VmdWwgdG8gZGV0ZXJtaW5lIGlmIHR3byBkZXZpY2VzIGFyZSBzZWVpbmcgdHdvIGRpZmZlcmVudCBjb3VudHJ5IElFcwotICogZXZlbiBvbiB0aGUgc2FtZSBhbHBoYTIuIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlIGlmIG5vIElFIGhhcwotICogYmVlbiBzZXQgb24gdGhlIHdpcmVsZXNzIGNvcmUgeWV0LgotICovCi1zdGF0aWMgYm9vbCBjb3VudHJ5X2llX2ludGVncml0eV9jaGFuZ2VzKHUzMiBjaGVja3N1bSkKLXsKLQkvKiBJZiBubyBJRSBoYXMgYmVlbiBzZXQgdGhlbiB0aGUgY2hlY2tzdW0gZG9lc24ndCBjaGFuZ2UgKi8KLQlpZiAodW5saWtlbHkoIWxhc3RfcmVxdWVzdC0+Y291bnRyeV9pZV9jaGVja3N1bSkpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAodW5saWtlbHkobGFzdF9yZXF1ZXN0LT5jb3VudHJ5X2llX2NoZWNrc3VtICE9IGNoZWNrc3VtKSkKLQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0aWMgaW50IHJlZ19jb3B5X3JlZ2QoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKipkc3RfcmVnZCwKIAkJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqc3JjX3JlZ2QpCiB7CkBAIC01MDYsNDcxICs0NzksNiBAQAogfQogCiAvKgotICogVGhpcyBpcyBhIHdvcmsgYXJvdW5kIGZvciBzYW5pdHkgY2hlY2tpbmcgaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KCkncwotICogd29yay4gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KCkgY2FuIGZvciBleGFtcGxlIGN1cnJlbnRseSBwcm92aWRlIGEKLSAqIDIgR0h6IGNoYW5uZWwgd2hlbiBpbiBmYWN0IGEgNSBHSHogY2hhbm5lbCB3YXMgZGVzaXJlZC4gQW4gZXhhbXBsZSB3b3VsZCBiZQotICogYW4gQVAgcHJvdmlkaW5nIGNoYW5uZWwgOCBvbiBhIGNvdW50cnkgSUUgdHJpcGxldCB3aGVuIGl0IHNlbnQgdGhpcyBvbiB0aGUKLSAqIDUgR0h6IGJhbmQsIHRoYXQgY2hhbm5lbCBpcyBkZXNpZ25lZCB0byBiZSBjaGFubmVsIDggb24gNSBHSHosIG5vdCBhIDIgR0h6Ci0gKiBjaGFubmVsLgotICoKLSAqIFRoaXMgY2FuIGJlIHJlbW92ZWQgb25jZSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koKSB0YWtlcyBpbiBhIGJhbmQuCi0gKi8KLXN0YXRpYyBib29sIGNoYW5faW5fYmFuZChpbnQgY2hhbiwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQotewotCWludCBjZW50ZXJfZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFuKTsKLQotCXN3aXRjaCAoYmFuZCkgewotCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJaWYgKGNlbnRlcl9mcmVxIDw9IDI0ODQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKLQkJaWYgKGNlbnRlcl9mcmVxID49IDUwMDUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLS8qCi0gKiBTb21lIEFQcyBtYXkgc2VuZCBhIGNvdW50cnkgSUUgdHJpcGxldCBmb3IgZWFjaCBjaGFubmVsIHRoZXkKLSAqIHN1cHBvcnQgYW5kIHdoaWxlIHRoaXMgaXMgY29tcGxldGVseSBvdmVya2lsbCBhbmQgc2lsbHkgd2Ugc3RpbGwKLSAqIG5lZWQgdG8gc3VwcG9ydCBpdC4gV2UgYXZvaWQgbWFraW5nIGEgc2luZ2xlIHJ1bGUgZm9yIGVhY2ggY2hhbm5lbAotICogdGhvdWdoIGFuZCB0byBoZWxwIHVzIHdpdGggdGhpcyB3ZSB1c2UgdGhpcyBoZWxwZXIgdG8gZmluZCB0aGUKLSAqIGFjdHVhbCBzdWJiYW5kIGVuZCBjaGFubmVsLiBUaGVzZSB0eXBlIG9mIGNvdW50cnkgSUUgdHJpcGxldAotICogc2NlbmVyaW9zIGFyZSBoYW5kbGVkIHRoZW4sIGFsbCB5aWVsZGluZyB0d28gcmVndWxhb3RyeSBydWxlcyBmcm9tCi0gKiBwYXJzaW5nIGEgY291bnRyeSBJRToKLSAqCi0gKiBbMV0KLSAqIFsyXQotICogWzM2XQotICogWzQwXQotICoKLSAqIFsxXQotICogWzItNF0KLSAqIFs1LTEyXQotICogWzM2XQotICogWzQwLTQ0XQotICoKLSAqIFsxLTRdCi0gKiBbNS03XQotICogWzM2LTQ0XQotICogWzQ4LTY0XQotICoKLSAqIFszNi0zNl0KLSAqIFs0MC00MF0KLSAqIFs0NC00NF0KLSAqIFs0OC00OF0KLSAqIFs1Mi01Ml0KLSAqIFs1Ni01Nl0KLSAqIFs2MC02MF0KLSAqIFs2NC02NF0KLSAqIFsxMDAtMTAwXQotICogWzEwNC0xMDRdCi0gKiBbMTA4LTEwOF0KLSAqIFsxMTItMTEyXQotICogWzExNi0xMTZdCi0gKiBbMTIwLTEyMF0KLSAqIFsxMjQtMTI0XQotICogWzEyOC0xMjhdCi0gKiBbMTMyLTEzMl0KLSAqIFsxMzYtMTM2XQotICogWzE0MC0xNDBdCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSBJRSBoYXMgYmVlbiBmb3VuZCB0byBiZSBpbnZhbGlkIGluIHRoZSBtaWRkbGUKLSAqIHNvbWV3aGVyZS4KLSAqLwotc3RhdGljIGludCBtYXhfc3ViYmFuZF9jaGFuKGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICBpbnQgb3JpZ19jdXJfY2hhbiwKLQkJCSAgICBpbnQgb3JpZ19lbmRfY2hhbm5lbCwKLQkJCSAgICBzOCBvcmlnX21heF9wb3dlciwKLQkJCSAgICB1OCAqKmNvdW50cnlfaWUsCi0JCQkgICAgdTggKmNvdW50cnlfaWVfbGVuKQotewotCXU4ICp0cmlwbGV0c19zdGFydCA9ICpjb3VudHJ5X2llOwotCXU4IGxlbl9hdF90cmlwbGV0ID0gKmNvdW50cnlfaWVfbGVuOwotCWludCBlbmRfc3ViYmFuZF9jaGFuID0gb3JpZ19lbmRfY2hhbm5lbDsKLQotCS8qCi0JICogV2UnbGwgZGVhbCB3aXRoIHBhZGRpbmcgZm9yIHRoZSBjYWxsZXIgdW5sZXNzCi0JICogaXRzIG5vdCBpbW1lZGlhdGUgYW5kIHdlIGRvbid0IHByb2Nlc3MgYW55IGNoYW5uZWxzCi0JICovCi0JaWYgKCpjb3VudHJ5X2llX2xlbiA9PSAxKSB7Ci0JCSpjb3VudHJ5X2llICs9IDE7Ci0JCSpjb3VudHJ5X2llX2xlbiAtPSAxOwotCQlyZXR1cm4gb3JpZ19lbmRfY2hhbm5lbDsKLQl9Ci0KLQkvKiBNb3ZlIHRvIHRoZSBuZXh0IHRyaXBsZXQgYW5kIHRoZW4gc3RhcnQgc2VhcmNoICovCi0JKmNvdW50cnlfaWUgKz0gMzsKLQkqY291bnRyeV9pZV9sZW4gLT0gMzsKLQotCWlmICghY2hhbl9pbl9iYW5kKG9yaWdfY3VyX2NoYW4sIGJhbmQpKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlICgqY291bnRyeV9pZV9sZW4gPj0gMykgewotCQlpbnQgZW5kX2NoYW5uZWwgPSAwOwotCQlzdHJ1Y3QgaWVlZTgwMjExX2NvdW50cnlfaWVfdHJpcGxldCAqdHJpcGxldCA9Ci0JCQkoc3RydWN0IGllZWU4MDIxMV9jb3VudHJ5X2llX3RyaXBsZXQgKikgKmNvdW50cnlfaWU7Ci0JCWludCBjdXJfY2hhbm5lbCA9IDAsIG5leHRfZXhwZWN0ZWRfY2hhbjsKLQotCQkvKiBtZWFucyBsYXN0IHRyaXBsZXQgaXMgY29tcGxldGVseSB1bnJlbGF0ZWQgdG8gdGhpcyBvbmUgKi8KLQkJaWYgKHRyaXBsZXQtPmV4dC5yZWdfZXh0ZW5zaW9uX2lkID49Ci0JCQkJSUVFRTgwMjExX0NPVU5UUllfRVhURU5TSU9OX0lEKSB7Ci0JCQkqY291bnRyeV9pZSAtPSAzOwotCQkJKmNvdW50cnlfaWVfbGVuICs9IDM7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh0cmlwbGV0LT5jaGFucy5maXJzdF9jaGFubmVsID09IDApIHsKLQkJCSpjb3VudHJ5X2llICs9IDE7Ci0JCQkqY291bnRyeV9pZV9sZW4gLT0gMTsKLQkJCWlmICgqY291bnRyeV9pZV9sZW4gIT0gMCkKLQkJCQlyZXR1cm4gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHRyaXBsZXQtPmNoYW5zLm51bV9jaGFubmVscyA9PSAwKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogTW9uaXRvbmljYWxseSBpbmNyZWFzaW5nIGNoYW5uZWwgb3JkZXIgKi8KLQkJaWYgKHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWwgPD0gZW5kX3N1YmJhbmRfY2hhbikKLQkJCXJldHVybiAwOwotCi0JCWlmICghY2hhbl9pbl9iYW5kKHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWwsIGJhbmQpKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogMiBHSHogKi8KLQkJaWYgKHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWwgPD0gMTQpIHsKLQkJCWVuZF9jaGFubmVsID0gdHJpcGxldC0+Y2hhbnMuZmlyc3RfY2hhbm5lbCArCi0JCQkJdHJpcGxldC0+Y2hhbnMubnVtX2NoYW5uZWxzIC0gMTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZF9jaGFubmVsID0gIHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWwgKwotCQkJCSg0ICogKHRyaXBsZXQtPmNoYW5zLm51bV9jaGFubmVscyAtIDEpKTsKLQkJfQotCi0JCWlmICghY2hhbl9pbl9iYW5kKGVuZF9jaGFubmVsLCBiYW5kKSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChvcmlnX21heF9wb3dlciAhPSB0cmlwbGV0LT5jaGFucy5tYXhfcG93ZXIpIHsKLQkJCSpjb3VudHJ5X2llIC09IDM7Ci0JCQkqY291bnRyeV9pZV9sZW4gKz0gMzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY3VyX2NoYW5uZWwgPSB0cmlwbGV0LT5jaGFucy5maXJzdF9jaGFubmVsOwotCi0JCS8qIFRoZSBrZXkgaXMgZmluZGluZyB0aGUgcmlnaHQgbmV4dCBleHBlY3RlZCBjaGFubmVsICovCi0JCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopCi0JCQluZXh0X2V4cGVjdGVkX2NoYW4gPSBlbmRfc3ViYmFuZF9jaGFuICsgMTsKLQkJIGVsc2UKLQkJCW5leHRfZXhwZWN0ZWRfY2hhbiA9IGVuZF9zdWJiYW5kX2NoYW4gKyA0OwotCi0JCWlmIChjdXJfY2hhbm5lbCAhPSBuZXh0X2V4cGVjdGVkX2NoYW4pIHsKLQkJCSpjb3VudHJ5X2llIC09IDM7Ci0JCQkqY291bnRyeV9pZV9sZW4gKz0gMzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZW5kX3N1YmJhbmRfY2hhbiA9IGVuZF9jaGFubmVsOwotCi0JCS8qIE1vdmUgdG8gdGhlIG5leHQgb25lICovCi0JCSpjb3VudHJ5X2llICs9IDM7Ci0JCSpjb3VudHJ5X2llX2xlbiAtPSAzOwotCi0JCS8qCi0JCSAqIFBhZGRpbmcgbmVlZHMgdG8gYmUgZGVhbHQgd2l0aCBpZiB3ZSBwcm9jZXNzZWQKLQkJICogc29tZSBjaGFubmVscy4KLQkJICovCi0JCWlmICgqY291bnRyeV9pZV9sZW4gPT0gMSkgewotCQkJKmNvdW50cnlfaWUgKz0gMTsKLQkJCSpjb3VudHJ5X2llX2xlbiAtPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJZiBzZWVuLCB0aGUgSUUgaXMgaW52YWxpZCAqLwotCQlpZiAoKmNvdW50cnlfaWVfbGVuID09IDIpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZW5kX3N1YmJhbmRfY2hhbiA9PSBvcmlnX2VuZF9jaGFubmVsKSB7Ci0JCSpjb3VudHJ5X2llID0gdHJpcGxldHNfc3RhcnQ7Ci0JCSpjb3VudHJ5X2llX2xlbiA9IGxlbl9hdF90cmlwbGV0OwotCQlyZXR1cm4gb3JpZ19lbmRfY2hhbm5lbDsKLQl9Ci0KLQlyZXR1cm4gZW5kX3N1YmJhbmRfY2hhbjsKLX0KLQotLyoKLSAqIENvbnZlcnRzIGEgY291bnRyeSBJRSB0byBhIHJlZ3VsYXRvcnkgZG9tYWluLiBBIHJlZ3VsYXRvcnkgZG9tYWluCi0gKiBzdHJ1Y3R1cmUgaGFzIGEgbG90IG9mIGluZm9ybWF0aW9uIHdoaWNoIHRoZSBJRSBkb2Vzbid0IHlldCBoYXZlLAotICogc28gZm9yIHRoZSBvdGhlciB2YWx1ZXMgd2UgdXNlIHVwcGVyIG1heCB2YWx1ZXMgYXMgd2Ugd2lsbCBpbnRlcnNlY3QKLSAqIHdpdGggb3VyIHVzZXJzcGFjZSByZWd1bGF0b3J5IGFnZW50IHRvIGdldCBsb3dlciBib3VuZHMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqY291bnRyeV9pZV8yX3JkKAotCQkJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQl1OCAqY291bnRyeV9pZSwKLQkJCQl1OCBjb3VudHJ5X2llX2xlbiwKLQkJCQl1MzIgKmNoZWNrc3VtKQotewotCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGkgPSAwOwotCWNoYXIgYWxwaGEyWzJdOwotCXUzMiBmbGFncyA9IDA7Ci0JdTMyIG51bV9ydWxlcyA9IDAsIHNpemVfb2ZfcmVnZCA9IDA7Ci0JdTggKnRyaXBsZXRzX3N0YXJ0ID0gTlVMTDsKLQl1OCBsZW5fYXRfdHJpcGxldCA9IDA7Ci0JLyogdGhlIGxhc3QgY2hhbm5lbCB3ZSBoYXZlIHJlZ2lzdGVyZWQgaW4gYSBzdWJiYW5kICh0cmlwbGV0KSAqLwotCWludCBsYXN0X3N1Yl9tYXhfY2hhbm5lbCA9IDA7Ci0KLQkqY2hlY2tzdW0gPSAweERFQURCRUVGOwotCi0JLyogQ291bnRyeSBJRSByZXF1aXJlbWVudHMgKi8KLQlCVUdfT04oY291bnRyeV9pZV9sZW4gPCBJRUVFODAyMTFfQ09VTlRSWV9JRV9NSU5fTEVOIHx8Ci0JCWNvdW50cnlfaWVfbGVuICYgMHgwMSk7Ci0KLQlhbHBoYTJbMF0gPSBjb3VudHJ5X2llWzBdOwotCWFscGhhMlsxXSA9IGNvdW50cnlfaWVbMV07Ci0KLQkvKgotCSAqIFRoaXJkIG9jdGV0IGNhbiBiZToKLQkgKiAgICAnSScgLSBJbmRvb3IKLQkgKiAgICAnTycgLSBPdXRkb29yCi0JICoKLQkgKiAgYW55dGhpbmcgZWxzZSB3ZSBhc3N1bWUgaXMgbm8gcmVzdHJpY3Rpb25zCi0JICovCi0JaWYgKGNvdW50cnlfaWVbMl0gPT0gJ0knKQotCQlmbGFncyA9IE5MODAyMTFfUlJGX05PX09VVERPT1I7Ci0JZWxzZSBpZiAoY291bnRyeV9pZVsyXSA9PSAnTycpCi0JCWZsYWdzID0gTkw4MDIxMV9SUkZfTk9fSU5ET09SOwotCi0JY291bnRyeV9pZSArPSAzOwotCWNvdW50cnlfaWVfbGVuIC09IDM7Ci0KLQl0cmlwbGV0c19zdGFydCA9IGNvdW50cnlfaWU7Ci0JbGVuX2F0X3RyaXBsZXQgPSBjb3VudHJ5X2llX2xlbjsKLQotCSpjaGVja3N1bSBePSAoKGZsYWdzIF4gYWxwaGEyWzBdIF4gYWxwaGEyWzFdKSA8PCA4KTsKLQotCS8qCi0JICogV2UgbmVlZCB0byBidWlsZCBhIHJlZyBydWxlIGZvciBlYWNoIHRyaXBsZXQsIGJ1dCBmaXJzdCB3ZSBtdXN0Ci0JICogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcmVnIHJ1bGVzIHdlIHdpbGwgbmVlZC4gV2Ugd2lsbCBuZWVkIG9uZQotCSAqIGZvciBlYWNoIGNoYW5uZWwgc3ViYmFuZAotCSAqLwotCXdoaWxlIChjb3VudHJ5X2llX2xlbiA+PSAzKSB7Ci0JCWludCBlbmRfY2hhbm5lbCA9IDA7Ci0JCXN0cnVjdCBpZWVlODAyMTFfY291bnRyeV9pZV90cmlwbGV0ICp0cmlwbGV0ID0KLQkJCShzdHJ1Y3QgaWVlZTgwMjExX2NvdW50cnlfaWVfdHJpcGxldCAqKSBjb3VudHJ5X2llOwotCQlpbnQgY3VyX3N1Yl9tYXhfY2hhbm5lbCA9IDAsIGN1cl9jaGFubmVsID0gMDsKLQotCQlpZiAodHJpcGxldC0+ZXh0LnJlZ19leHRlbnNpb25faWQgPj0KLQkJCQlJRUVFODAyMTFfQ09VTlRSWV9FWFRFTlNJT05fSUQpIHsKLQkJCWNvdW50cnlfaWUgKz0gMzsKLQkJCWNvdW50cnlfaWVfbGVuIC09IDM7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIEFQcyBjYW4gYWRkIHBhZGRpbmcgdG8gbWFrZSBsZW5ndGggZGl2aXNpYmxlCi0JCSAqIGJ5IHR3bywgcmVxdWlyZWQgYnkgdGhlIHNwZWMuCi0JCSAqLwotCQlpZiAodHJpcGxldC0+Y2hhbnMuZmlyc3RfY2hhbm5lbCA9PSAwKSB7Ci0JCQljb3VudHJ5X2llKys7Ci0JCQljb3VudHJ5X2llX2xlbi0tOwotCQkJLyogVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhdCB0aGUgdmVyeSBlbmQgb25seSAqLwotCQkJaWYgKGNvdW50cnlfaWVfbGVuICE9IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh0cmlwbGV0LT5jaGFucy5udW1fY2hhbm5lbHMgPT0gMCkKLQkJCXJldHVybiBOVUxMOwotCi0JCWlmICghY2hhbl9pbl9iYW5kKHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWwsIGJhbmQpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJLyogMiBHSHogKi8KLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJCWVuZF9jaGFubmVsID0gdHJpcGxldC0+Y2hhbnMuZmlyc3RfY2hhbm5lbCArCi0JCQkJdHJpcGxldC0+Y2hhbnMubnVtX2NoYW5uZWxzIC0gMTsKLQkJZWxzZQotCQkJLyoKLQkJCSAqIDUgR0h6IC0tIEZvciBleGFtcGxlIGluIGNvdW50cnkgSUVzIGlmIHRoZSBmaXJzdAotCQkJICogY2hhbm5lbCBnaXZlbiBpcyAzNiBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBpcyA0Ci0JCQkgKiB0aGVuIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWwgbnVtYmVycyBkZWZpbmVkIGZvciB0aGUKLQkJCSAqIDUgR0h6IFBIWSBieSB0aGVzZSBwYXJhbWV0ZXJzIGFyZTogMzYsIDQwLCA0NCwgYW5kIDQ4Ci0JCQkgKiBhbmQgbm90IDM2LCAzNywgMzgsIDM5LgotCQkJICoKLQkJCSAqIFNlZTogaHR0cDovL3Rpbnl1cmwuY29tLzExZC1jbGFyaWZpY2F0aW9uCi0JCQkgKi8KLQkJCWVuZF9jaGFubmVsID0gIHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWwgKwotCQkJCSg0ICogKHRyaXBsZXQtPmNoYW5zLm51bV9jaGFubmVscyAtIDEpKTsKLQotCQljdXJfY2hhbm5lbCA9IHRyaXBsZXQtPmNoYW5zLmZpcnN0X2NoYW5uZWw7Ci0KLQkJLyoKLQkJICogRW5oYW5jZW1lbnQgZm9yIEFQcyB0aGF0IHNlbmQgYSB0cmlwbGV0IGZvciBldmVyeSBjaGFubmVsCi0JCSAqIG9yIGZvciB3aGF0ZXZlciByZWFzb24gc2VuZHMgdHJpcGxldHMgd2l0aCBtdWx0aXBsZSBjaGFubmVscwotCQkgKiBzZXBhcmF0ZWQgd2hlbiBpbiBmYWN0IHRoZXkgc2hvdWxkIGJlIHRvZ2V0aGVyLgotCQkgKi8KLQkJZW5kX2NoYW5uZWwgPSBtYXhfc3ViYmFuZF9jaGFuKGJhbmQsCi0JCQkJCSAgICAgICBjdXJfY2hhbm5lbCwKLQkJCQkJICAgICAgIGVuZF9jaGFubmVsLAotCQkJCQkgICAgICAgdHJpcGxldC0+Y2hhbnMubWF4X3Bvd2VyLAotCQkJCQkgICAgICAgJmNvdW50cnlfaWUsCi0JCQkJCSAgICAgICAmY291bnRyeV9pZV9sZW4pOwotCQlpZiAoIWVuZF9jaGFubmVsKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaWYgKCFjaGFuX2luX2JhbmQoZW5kX2NoYW5uZWwsIGJhbmQpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJY3VyX3N1Yl9tYXhfY2hhbm5lbCA9IGVuZF9jaGFubmVsOwotCi0JCS8qIEJhc2ljIHNhbml0eSBjaGVjayAqLwotCQlpZiAoY3VyX3N1Yl9tYXhfY2hhbm5lbCA8IGN1cl9jaGFubmVsKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJLyoKLQkJICogRG8gbm90IGFsbG93IG92ZXJsYXBwaW5nIGNoYW5uZWxzLiBBbHNvIGNoYW5uZWxzCi0JCSAqIHBhc3NlZCBpbiBlYWNoIHN1YmJhbmQgbXVzdCBiZSBtb25vdG9uaWNhbGx5Ci0JCSAqIGluY3JlYXNpbmcKLQkJICovCi0JCWlmIChsYXN0X3N1Yl9tYXhfY2hhbm5lbCkgewotCQkJaWYgKGN1cl9jaGFubmVsIDw9IGxhc3Rfc3ViX21heF9jaGFubmVsKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKGN1cl9zdWJfbWF4X2NoYW5uZWwgPD0gbGFzdF9zdWJfbWF4X2NoYW5uZWwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvKgotCQkgKiBXaGVuIGRvdDExUmVndWxhdG9yeUNsYXNzZXNSZXF1aXJlZCBpcyBzdXBwb3J0ZWQKLQkJICogd2UgY2FuIHRocm93IGV4dCB0cmlwbGV0cyBhcyBwYXJ0IG9mIHRoaXMgc291cCwKLQkJICogZm9yIG5vdyB3ZSBkb24ndCBjYXJlIHdoZW4gdGhvc2UgY2hhbmdlIGFzIHdlCi0JCSAqIGRvbid0IHN1cHBvcnQgdGhlbQotCQkgKi8KLQkJKmNoZWNrc3VtIF49ICgoY3VyX2NoYW5uZWwgXiBjdXJfc3ViX21heF9jaGFubmVsKSA8PCA4KSB8Ci0JCSAgKChjdXJfc3ViX21heF9jaGFubmVsIF4gY3VyX3N1Yl9tYXhfY2hhbm5lbCkgPDwgMTYpIHwKLQkJICAoKHRyaXBsZXQtPmNoYW5zLm1heF9wb3dlciBeIGN1cl9zdWJfbWF4X2NoYW5uZWwpIDw8IDI0KTsKLQotCQlsYXN0X3N1Yl9tYXhfY2hhbm5lbCA9IGN1cl9zdWJfbWF4X2NoYW5uZWw7Ci0KLQkJbnVtX3J1bGVzKys7Ci0KLQkJaWYgKGNvdW50cnlfaWVfbGVuID49IDMpIHsKLQkJCWNvdW50cnlfaWUgKz0gMzsKLQkJCWNvdW50cnlfaWVfbGVuIC09IDM7Ci0JCX0KLQotCQkvKgotCQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBhIElFRUUgcmVxdWlyZW1lbnQgYnV0Ci0JCSAqIHNpbXBseSBhIG1lbW9yeSByZXF1aXJlbWVudAotCQkgKi8KLQkJaWYgKG51bV9ydWxlcyA+IE5MODAyMTFfTUFYX1NVUFBfUkVHX1JVTEVTKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JY291bnRyeV9pZSA9IHRyaXBsZXRzX3N0YXJ0OwotCWNvdW50cnlfaWVfbGVuID0gbGVuX2F0X3RyaXBsZXQ7Ci0KLQlzaXplX29mX3JlZ2QgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4pICsKLQkJKG51bV9ydWxlcyAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlKSk7Ci0KLQlyZCA9IGt6YWxsb2Moc2l6ZV9vZl9yZWdkLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkKQotCQlyZXR1cm4gTlVMTDsKLQotCXJkLT5uX3JlZ19ydWxlcyA9IG51bV9ydWxlczsKLQlyZC0+YWxwaGEyWzBdID0gYWxwaGEyWzBdOwotCXJkLT5hbHBoYTJbMV0gPSBhbHBoYTJbMV07Ci0KLQkvKiBUaGlzIHRpbWUgYXJvdW5kIHdlIGZpbGwgaW4gdGhlIHJkICovCi0Jd2hpbGUgKGNvdW50cnlfaWVfbGVuID49IDMpIHsKLQkJaW50IGVuZF9jaGFubmVsID0gMDsKLQkJc3RydWN0IGllZWU4MDIxMV9jb3VudHJ5X2llX3RyaXBsZXQgKnRyaXBsZXQgPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfY291bnRyeV9pZV90cmlwbGV0ICopIGNvdW50cnlfaWU7Ci0JCXN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJlZ19ydWxlID0gTlVMTDsKLQkJc3RydWN0IGllZWU4MDIxMV9mcmVxX3JhbmdlICpmcmVxX3JhbmdlID0gTlVMTDsKLQkJc3RydWN0IGllZWU4MDIxMV9wb3dlcl9ydWxlICpwb3dlcl9ydWxlID0gTlVMTDsKLQotCQkvKgotCQkgKiBNdXN0IHBhcnNlIGlmIGRvdDExUmVndWxhdG9yeUNsYXNzZXNSZXF1aXJlZCBpcyB0cnVlLAotCQkgKiB3ZSBkb24ndCBzdXBwb3J0IHRoaXMgeWV0Ci0JCSAqLwotCQlpZiAodHJpcGxldC0+ZXh0LnJlZ19leHRlbnNpb25faWQgPj0KLQkJCQlJRUVFODAyMTFfQ09VTlRSWV9FWFRFTlNJT05fSUQpIHsKLQkJCWNvdW50cnlfaWUgKz0gMzsKLQkJCWNvdW50cnlfaWVfbGVuIC09IDM7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICh0cmlwbGV0LT5jaGFucy5maXJzdF9jaGFubmVsID09IDApIHsKLQkJCWNvdW50cnlfaWUrKzsKLQkJCWNvdW50cnlfaWVfbGVuLS07Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlZ19ydWxlID0gJnJkLT5yZWdfcnVsZXNbaV07Ci0JCWZyZXFfcmFuZ2UgPSAmcmVnX3J1bGUtPmZyZXFfcmFuZ2U7Ci0JCXBvd2VyX3J1bGUgPSAmcmVnX3J1bGUtPnBvd2VyX3J1bGU7Ci0KLQkJcmVnX3J1bGUtPmZsYWdzID0gZmxhZ3M7Ci0KLQkJLyogMiBHSHogKi8KLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJCWVuZF9jaGFubmVsID0gdHJpcGxldC0+Y2hhbnMuZmlyc3RfY2hhbm5lbCArCi0JCQkJdHJpcGxldC0+Y2hhbnMubnVtX2NoYW5uZWxzIC0xOwotCQllbHNlCi0JCQllbmRfY2hhbm5lbCA9ICB0cmlwbGV0LT5jaGFucy5maXJzdF9jaGFubmVsICsKLQkJCQkoNCAqICh0cmlwbGV0LT5jaGFucy5udW1fY2hhbm5lbHMgLSAxKSk7Ci0KLQkJZW5kX2NoYW5uZWwgPSBtYXhfc3ViYmFuZF9jaGFuKGJhbmQsCi0JCQkJCSAgICAgICB0cmlwbGV0LT5jaGFucy5maXJzdF9jaGFubmVsLAotCQkJCQkgICAgICAgZW5kX2NoYW5uZWwsCi0JCQkJCSAgICAgICB0cmlwbGV0LT5jaGFucy5tYXhfcG93ZXIsCi0JCQkJCSAgICAgICAmY291bnRyeV9pZSwKLQkJCQkJICAgICAgICZjb3VudHJ5X2llX2xlbik7Ci0KLQkJLyoKLQkJICogVGhlICsxMCBpcyBzaW5jZSB0aGUgcmVndWxhdG9yeSBkb21haW4gZXhwZWN0cwotCQkgKiB0aGUgYWN0dWFsIGJhbmQgZWRnZSwgbm90IHRoZSBjZW50ZXIgb2YgZnJlcSBmb3IKLQkJICogaXRzIHN0YXJ0IGFuZCBlbmQgZnJlcXMsIGFzc3VtaW5nIDIwIE1IeiBiYW5kd2lkdGggb24KLQkJICogdGhlIGNoYW5uZWxzIHBhc3NlZAotCQkgKi8KLQkJZnJlcV9yYW5nZS0+c3RhcnRfZnJlcV9raHogPQotCQkJTUhaX1RPX0tIWihpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koCi0JCQkJdHJpcGxldC0+Y2hhbnMuZmlyc3RfY2hhbm5lbCkgLSAxMCk7Ci0JCWZyZXFfcmFuZ2UtPmVuZF9mcmVxX2toeiA9Ci0JCQlNSFpfVE9fS0haKGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeSgKLQkJCQllbmRfY2hhbm5lbCkgKyAxMCk7Ci0KLQkJLyoKLQkJICogVGhlc2UgYXJlIGxhcmdlIGFyYml0cmFyeSB2YWx1ZXMgd2UgdXNlIHRvIGludGVyc2VjdCBsYXRlci4KLQkJICogSW5jcmVtZW50IHRoaXMgaWYgd2UgZXZlciBzdXBwb3J0ID49IDQwIE1IeiBjaGFubmVscwotCQkgKiBpbiBJRUVFIDgwMi4xMQotCQkgKi8KLQkJZnJlcV9yYW5nZS0+bWF4X2JhbmR3aWR0aF9raHogPSBNSFpfVE9fS0haKDQwKTsKLQkJcG93ZXJfcnVsZS0+bWF4X2FudGVubmFfZ2FpbiA9IERCSV9UT19NQkkoMTAwKTsKLQkJcG93ZXJfcnVsZS0+bWF4X2VpcnAgPSBEQk1fVE9fTUJNKHRyaXBsZXQtPmNoYW5zLm1heF9wb3dlcik7Ci0KLQkJaSsrOwotCi0JCWlmIChjb3VudHJ5X2llX2xlbiA+PSAzKSB7Ci0JCQljb3VudHJ5X2llICs9IDM7Ci0JCQljb3VudHJ5X2llX2xlbiAtPSAzOwotCQl9Ci0KLQkJQlVHX09OKGkgPiBOTDgwMjExX01BWF9TVVBQX1JFR19SVUxFUyk7Ci0JfQotCi0JcmV0dXJuIHJkOwotfQotCi0KLS8qCiAgKiBIZWxwZXIgZm9yIHJlZ2RvbV9pbnRlcnNlY3QoKSwgdGhpcyBkb2VzIHRoZSByZWFsCiAgKiBtYXRoZW1hdGljYWwgaW50ZXJzZWN0aW9uIGZ1bgogICovCkBAIC0xMTkxLDcgKzY5OSw2IEBACiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KLUVYUE9SVF9TWU1CT0woZnJlcV9yZWdfaW5mbyk7CiAKIGludCBmcmVxX3JlZ19pbmZvKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCSAgdTMyIGNlbnRlcl9mcmVxLApAQCAtMTIwNSw2ICs3MTIsNyBAQAogCQkJCSAgcmVnX3J1bGUsCiAJCQkJICBOVUxMKTsKIH0KK0VYUE9SVF9TWU1CT0woZnJlcV9yZWdfaW5mbyk7CiAKIC8qCiAgKiBOb3RlIHRoYXQgcmlnaHQgbm93IHdlIGFzc3VtZSB0aGUgZGVzaXJlZCBjaGFubmVsIGJhbmR3aWR0aApAQCAtMTI0Myw0MSArNzUxLDggQEAKIAkJCSAgZGVzaXJlZF9id19raHosCiAJCQkgICZyZWdfcnVsZSk7CiAKLQlpZiAocikgewotCQkvKgotCQkgKiBUaGlzIG1lYW5zIG5vIHJlZ3VsYXRvcnkgcnVsZSB3YXMgZm91bmQgaW4gdGhlIGNvdW50cnkgSUUKLQkJICogd2l0aCBhIGZyZXF1ZW5jeSByYW5nZSBvbiB0aGUgY2VudGVyX2ZyZXEncyBiYW5kLCBzaW5jZQotCQkgKiBJRUVFLTgwMi4xMSBhbGxvd3MgZm9yIGEgY291bnRyeSBJRSB0byBoYXZlIGEgc3Vic2V0IG9mIHRoZQotCQkgKiByZWd1bGF0b3J5IGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIGEgY291bnRyeSB3ZSBpZ25vcmUKLQkJICogZGlzYWJsaW5nIHRoZSBjaGFubmVsIHVubGVzcyBhdCBsZWFzdCBvbmUgcmVnIHJ1bGUgd2FzCi0JCSAqIGZvdW5kIG9uIHRoZSBjZW50ZXJfZnJlcSdzIGJhbmQuIEZvciBkZXRhaWxzIHNlZSB0aGlzCi0JCSAqIGNsYXJpZmljYXRpb246Ci0JCSAqCi0JCSAqIGh0dHA6Ly90aW55dXJsLmNvbS8xMWQtY2xhcmlmaWNhdGlvbgotCQkgKi8KLQkJaWYgKHIgPT0gLUVSQU5HRSAmJgotCQkgICAgbGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgPT0KLQkJICAgIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFKSB7Ci0JCQlSRUdfREJHX1BSSU5UKCJjZmc4MDIxMTogTGVhdmluZyBjaGFubmVsICVkIE1IeiAiCi0JCQkJImludGFjdCBvbiAlcyAtIG5vIHJ1bGUgZm91bmQgaW4gYmFuZCBvbiAiCi0JCQkJIkNvdW50cnkgSUVcbiIsCi0JCQljaGFuLT5jZW50ZXJfZnJlcSwgd2lwaHlfbmFtZSh3aXBoeSkpOwotCQl9IGVsc2UgewotCQkvKgotCQkgKiBJbiB0aGlzIGNhc2Ugd2Uga25vdyB0aGUgY291bnRyeSBJRSBoYXMgYXQgbGVhc3Qgb25lIHJlZyBydWxlCi0JCSAqIGZvciB0aGUgYmFuZCBzbyB3ZSByZXNwZWN0IGl0cyBiYW5kIGRlZmluaXRpb25zCi0JCSAqLwotCQkJaWYgKGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09Ci0JCQkgICAgTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUpCi0JCQkJUkVHX0RCR19QUklOVCgiY2ZnODAyMTE6IERpc2FibGluZyAiCi0JCQkJCSJjaGFubmVsICVkIE1IeiBvbiAlcyBkdWUgdG8gIgotCQkJCQkiQ291bnRyeSBJRVxuIiwKLQkJCQkJY2hhbi0+Y2VudGVyX2ZyZXEsIHdpcGh5X25hbWUod2lwaHkpKTsKLQkJCWZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEOwotCQkJY2hhbi0+ZmxhZ3MgPSBmbGFnczsKLQkJfQorCWlmIChyKQogCQlyZXR1cm47Ci0JfQogCiAJcG93ZXJfcnVsZSA9ICZyZWdfcnVsZS0+cG93ZXJfcnVsZTsKIAlmcmVxX3JhbmdlID0gJnJlZ19ydWxlLT5mcmVxX3JhbmdlOwpAQCAtMTgzMSw2ICsxMzA2LDcgQEAKIHsKIAlpbnQgciA9IDA7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IE5VTEw7CisJZW51bSBubDgwMjExX3JlZ19pbml0aWF0b3IgaW5pdGlhdG9yID0gcmVnX3JlcXVlc3QtPmluaXRpYXRvcjsKIAogCUJVR19PTighcmVnX3JlcXVlc3QtPmFscGhhMik7CiAKQEAgLTE4NTAsNyArMTMyNiw3IEBACiAJLyogVGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IHRoZSBvcmlnXyogcGFyYW1ldGVycyBhcmUgc2F2ZWQgKi8KIAlpZiAociA9PSAtRUFMUkVBRFkgJiYgd2lwaHkgJiYKIAkgICAgd2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19TVFJJQ1RfUkVHVUxBVE9SWSkKLQkJd2lwaHlfdXBkYXRlX3JlZ3VsYXRvcnkod2lwaHksIHJlZ19yZXF1ZXN0LT5pbml0aWF0b3IpOworCQl3aXBoeV91cGRhdGVfcmVndWxhdG9yeSh3aXBoeSwgaW5pdGlhdG9yKTsKIG91dDoKIAltdXRleF91bmxvY2soJnJlZ19tdXRleCk7CiAJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9tdXRleCk7CkBAIC0yMDA4LDM1ICsxNDg0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmVndWxhdG9yeV9oaW50KTsKIAotLyogQ2FsbGVyIG11c3QgaG9sZCByZWdfbXV0ZXggKi8KLXN0YXRpYyBib29sIHJlZ19zYW1lX2NvdW50cnlfaWVfaGludChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJdTMyIGNvdW50cnlfaWVfY2hlY2tzdW0pCi17Ci0Jc3RydWN0IHdpcGh5ICpyZXF1ZXN0X3dpcGh5OwotCi0JYXNzZXJ0X3JlZ19sb2NrKCk7Ci0KLQlpZiAodW5saWtlbHkobGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgIT0KLQkgICAgTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXF1ZXN0X3dpcGh5ID0gd2lwaHlfaWR4X3RvX3dpcGh5KGxhc3RfcmVxdWVzdC0+d2lwaHlfaWR4KTsKLQotCWlmICghcmVxdWVzdF93aXBoeSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGxpa2VseShyZXF1ZXN0X3dpcGh5ICE9IHdpcGh5KSkKLQkJcmV0dXJuICFjb3VudHJ5X2llX2ludGVncml0eV9jaGFuZ2VzKGNvdW50cnlfaWVfY2hlY2tzdW0pOwotCS8qCi0JICogV2Ugc2hvdWxkIG5vdCBoYXZlIGxldCB0aGVzZSB0aHJvdWdoIGF0IHRoaXMgcG9pbnQsIHRoZXkKLQkgKiBzaG91bGQgaGF2ZSBiZWVuIHBpY2tlZCB1cCBlYXJsaWVyIGJ5IHRoZSBmaXJzdCBhbHBoYTIgY2hlY2sKLQkgKiBvbiB0aGUgZGV2aWNlCi0JICovCi0JaWYgKFdBUk5fT04oIWNvdW50cnlfaWVfaW50ZWdyaXR5X2NoYW5nZXMoY291bnRyeV9pZV9jaGVja3N1bSkpKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIC8qCiAgKiBXZSBob2xkIHdkZXZfbG9jaygpIGhlcmUgc28gd2UgY2Fubm90IGhvbGQgY2ZnODAyMTFfbXV0ZXgoKSBhbmQKICAqIHRoZXJlZm9yZSBjYW5ub3QgaXRlcmF0ZSBvdmVyIHRoZSByZGV2IGxpc3QgaGVyZS4KQEAgLTIwNDYsOSArMTQ5Myw3IEBACiAJCQkgdTggKmNvdW50cnlfaWUsCiAJCQkgdTggY291bnRyeV9pZV9sZW4pCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkID0gTlVMTDsKIAljaGFyIGFscGhhMlsyXTsKLQl1MzIgY2hlY2tzdW0gPSAwOwogCWVudW0gZW52aXJvbm1lbnRfY2FwIGVudiA9IEVOVklST05fQU5ZOwogCXN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcXVlc3Q7CiAKQEAgLTIwNjQsMTQgKzE1MDksNiBAQAogCWlmIChjb3VudHJ5X2llX2xlbiA8IElFRUU4MDIxMV9DT1VOVFJZX0lFX01JTl9MRU4pCiAJCWdvdG8gb3V0OwogCi0JLyoKLQkgKiBQZW5kaW5nIGNvdW50cnkgSUUgcHJvY2Vzc2luZywgdGhpcyBjYW4gaGFwcGVuIGFmdGVyIHdlCi0JICogY2FsbCBDUkRBIGFuZCB3YWl0IGZvciBhIHJlc3BvbnNlIGlmIGEgYmVhY29uIHdhcyByZWNlaXZlZCBiZWZvcmUKLQkgKiB3ZSB3ZXJlIGFibGUgdG8gcHJvY2VzcyB0aGUgbGFzdCByZWd1bGF0b3J5X2hpbnRfMTFkKCkgY2FsbAotCSAqLwotCWlmIChjb3VudHJ5X2llX3JlZ2RvbWFpbikKLQkJZ290byBvdXQ7Ci0KIAlhbHBoYTJbMF0gPSBjb3VudHJ5X2llWzBdOwogCWFscGhhMlsxXSA9IGNvdW50cnlfaWVbMV07CiAKQEAgLTIwOTAsMzkgKzE1MjcsMTQgQEAKIAkgICAgd2lwaHlfaWR4X3ZhbGlkKGxhc3RfcmVxdWVzdC0+d2lwaHlfaWR4KSkpCiAJCWdvdG8gb3V0OwogCi0JcmQgPSBjb3VudHJ5X2llXzJfcmQoYmFuZCwgY291bnRyeV9pZSwgY291bnRyeV9pZV9sZW4sICZjaGVja3N1bSk7Ci0JaWYgKCFyZCkgewotCQlSRUdfREJHX1BSSU5UKCJjZmc4MDIxMTogSWdub3JpbmcgYm9ndXMgY291bnRyeSBJRVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogVGhpcyB3aWxsIG5vdCBoYXBwZW4gcmlnaHQgbm93IGJ1dCB3ZSBsZWF2ZSBpdCBoZXJlIGZvciB0aGUKLQkgKiB0aGUgZnV0dXJlIHdoZW4gd2Ugd2FudCB0byBhZGQgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydCBhbmQgaGF2aW5nCi0JICogdGhlIHVzZXIgbW92ZSB0byBhbm90aGVyIGNvdW50cnkgYWZ0ZXIgZG9pbmcgc28sIG9yIGhhdmluZyB0aGUgdXNlcgotCSAqIG1vdmUgdG8gYW5vdGhlciBBUC4gUmlnaHQgbm93IHdlIGp1c3QgdHJ1c3QgdGhlIGZpcnN0IEFQLgotCSAqCi0JICogSWYgd2UgaGl0IHRoaXMgYmVmb3JlIHdlIGFkZCB0aGlzIHN1cHBvcnQgd2Ugd2FudCB0byBiZSBpbmZvcm1lZCBvZgotCSAqIGl0IGFzIGl0IHdvdWxkIGluZGljYXRlIGEgbWlzdGFrZSBpbiB0aGUgY3VycmVudCBkZXNpZ24KLQkgKi8KLQlpZiAoV0FSTl9PTihyZWdfc2FtZV9jb3VudHJ5X2llX2hpbnQod2lwaHksIGNoZWNrc3VtKSkpCi0JCWdvdG8gZnJlZV9yZF9vdXQ7Ci0KIAlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCksIEdGUF9LRVJORUwpOwogCWlmICghcmVxdWVzdCkKLQkJZ290byBmcmVlX3JkX291dDsKLQotCS8qCi0JICogV2Uga2VlcCB0aGlzIGFyb3VuZCBmb3Igd2hlbiBDUkRBIGNvbWVzIGJhY2sgd2l0aCBhIHJlc3BvbnNlIHNvCi0JICogd2UgY2FuIGludGVyc2VjdCB3aXRoIHRoYXQKLQkgKi8KLQljb3VudHJ5X2llX3JlZ2RvbWFpbiA9IHJkOworCQlnb3RvIG91dDsKIAogCXJlcXVlc3QtPndpcGh5X2lkeCA9IGdldF93aXBoeV9pZHgod2lwaHkpOwotCXJlcXVlc3QtPmFscGhhMlswXSA9IHJkLT5hbHBoYTJbMF07Ci0JcmVxdWVzdC0+YWxwaGEyWzFdID0gcmQtPmFscGhhMlsxXTsKKwlyZXF1ZXN0LT5hbHBoYTJbMF0gPSBhbHBoYTJbMF07CisJcmVxdWVzdC0+YWxwaGEyWzFdID0gYWxwaGEyWzFdOwogCXJlcXVlc3QtPmluaXRpYXRvciA9IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFOwotCXJlcXVlc3QtPmNvdW50cnlfaWVfY2hlY2tzdW0gPSBjaGVja3N1bTsKIAlyZXF1ZXN0LT5jb3VudHJ5X2llX2VudiA9IGVudjsKIAogCW11dGV4X3VubG9jaygmcmVnX211dGV4KTsKQEAgLTIxMzEsOCArMTU0Myw2IEBACiAKIAlyZXR1cm47CiAKLWZyZWVfcmRfb3V0OgotCWtmcmVlKHJkKTsKIG91dDoKIAltdXRleF91bmxvY2soJnJlZ19tdXRleCk7CiB9CkBAIC0yMzgzLDMzICsxNzkzLDYgQEAKIAlwcmludF9yZF9ydWxlcyhyZCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfUkVHX0RFQlVHCi1zdGF0aWMgdm9pZCByZWdfY291bnRyeV9pZV9wcm9jZXNzX2RlYnVnKAotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCwKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqY291bnRyeV9pZV9yZWdkb21haW4sCi0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKmludGVyc2VjdGVkX3JkKQotewotCXByaW50ayhLRVJOX0RFQlVHICJjZmc4MDIxMTogUmVjZWl2ZWQgY291bnRyeSBJRTpcbiIpOwotCXByaW50X3JlZ2RvbWFpbl9pbmZvKGNvdW50cnlfaWVfcmVnZG9tYWluKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiY2ZnODAyMTE6IENSREEgdGhpbmtzIHRoaXMgc2hvdWxkIGFwcGxpZWQ6XG4iKTsKLQlwcmludF9yZWdkb21haW5faW5mbyhyZCk7Ci0JaWYgKGludGVyc2VjdGVkX3JkKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJjZmc4MDIxMTogV2UgaW50ZXJzZWN0IGJvdGggb2YgdGhlc2UgIgotCQkJImFuZCBnZXQ6XG4iKTsKLQkJcHJpbnRfcmVnZG9tYWluX2luZm8oaW50ZXJzZWN0ZWRfcmQpOwotCQlyZXR1cm47Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJjZmc4MDIxMTogSW50ZXJzZWN0aW9uIGJldHdlZW4gYm90aCBmYWlsZWRcbiIpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCByZWdfY291bnRyeV9pZV9wcm9jZXNzX2RlYnVnKAotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCwKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqY291bnRyeV9pZV9yZWdkb21haW4sCi0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKmludGVyc2VjdGVkX3JkKQotewotfQotI2VuZGlmCi0KIC8qIFRha2VzIG93bmVyc2hpcCBvZiByZCBvbmx5IGlmIGl0IGRvZXNuJ3QgZmFpbCAqLwogc3RhdGljIGludCBfX3NldF9yZWdkb20oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQogewpAQCAtMjUyMSwzNCArMTkwNCw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qCi0JICogQ291bnRyeSBJRSByZXF1ZXN0cyBhcmUgaGFuZGxlZCBhIGJpdCBkaWZmZXJlbnRseSwgd2UgaW50ZXJzZWN0Ci0JICogdGhlIGNvdW50cnkgSUUgcmQgd2l0aCB3aGF0IENSREEgYmVsaWV2ZXMgdGhhdCBjb3VudHJ5IHNob3VsZCBoYXZlCi0JICovCi0KLQkvKgotCSAqIFVzZXJzcGFjZSBjb3VsZCBoYXZlIHNlbnQgdHdvIHJlcGxpZXMgd2l0aCBvbmx5Ci0JICogb25lIGtlcm5lbCByZXF1ZXN0LiBCeSB0aGUgc2Vjb25kIHJlcGx5IHdlIHdvdWxkIGhhdmUKLQkgKiBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY29uc3VtZWQgdGhlIGNvdW50cnlfaWVfcmVnZG9tYWluLgotCSAqLwotCWlmICghY291bnRyeV9pZV9yZWdkb21haW4pCi0JCXJldHVybiAtRUFMUkVBRFk7Ci0JQlVHX09OKHJkID09IGNvdW50cnlfaWVfcmVnZG9tYWluKTsKLQotCS8qCi0JICogSW50ZXJzZWN0IHdoYXQgQ1JEQSByZXR1cm5lZCBhbmQgb3VyIHdoYXQgd2UKLQkgKiBoYWQgYnVpbHQgZnJvbSB0aGUgQ291bnRyeSBJRSByZWNlaXZlZAotCSAqLwotCi0JaW50ZXJzZWN0ZWRfcmQgPSByZWdkb21faW50ZXJzZWN0KHJkLCBjb3VudHJ5X2llX3JlZ2RvbWFpbik7Ci0KLQlyZWdfY291bnRyeV9pZV9wcm9jZXNzX2RlYnVnKHJkLAotCQkJCSAgICAgY291bnRyeV9pZV9yZWdkb21haW4sCi0JCQkJICAgICBpbnRlcnNlY3RlZF9yZCk7Ci0KLQlrZnJlZShjb3VudHJ5X2llX3JlZ2RvbWFpbik7Ci0JY291bnRyeV9pZV9yZWdkb21haW4gPSBOVUxMOwotCiAJaWYgKCFpbnRlcnNlY3RlZF9yZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTI2MzAsNyArMTk4NSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZyZWdfbXV0ZXgpOwogfQogCi1pbnQgcmVndWxhdG9yeV9pbml0KHZvaWQpCitpbnQgX19pbml0IHJlZ3VsYXRvcnlfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSAwOwogCkBAIC0yNjc2LDcgKzIwMzEsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJlZ3VsYXRvcnlfZXhpdCh2b2lkKQordm9pZCAvKiBfX2luaXRfb3JfZXhpdCAqLyByZWd1bGF0b3J5X2V4aXQodm9pZCkKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZWdfcmVxdWVzdCwgKnRtcDsKIAlzdHJ1Y3QgcmVnX2JlYWNvbiAqcmVnX2JlYWNvbiwgKmJ0bXA7CkBAIC0yNjg4LDkgKzIwNDMsNiBAQAogCiAJcmVzZXRfcmVnZG9tYWlucygpOwogCi0Ja2ZyZWUoY291bnRyeV9pZV9yZWdkb21haW4pOwotCWNvdW50cnlfaWVfcmVnZG9tYWluID0gTlVMTDsKLQogCWtmcmVlKGxhc3RfcmVxdWVzdCk7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihyZWdfcGRldik7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmVnLmggYi9uZXQvd2lyZWxlc3MvcmVnLmgKaW5kZXggYjI2MjI0YS4uYzQ2OTVkMCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5oCisrKyBiL25ldC93aXJlbGVzcy9yZWcuaApAQCAtMTAsNyArMTAsNyBAQAogCiB2b2lkIHJlZ19kZXZpY2VfcmVtb3ZlKHN0cnVjdCB3aXBoeSAqd2lwaHkpOwogCi1pbnQgcmVndWxhdG9yeV9pbml0KHZvaWQpOworaW50IF9faW5pdCByZWd1bGF0b3J5X2luaXQodm9pZCk7CiB2b2lkIHJlZ3VsYXRvcnlfZXhpdCh2b2lkKTsKIAogaW50IHNldF9yZWdkb20oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zY2FuLmMgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCmluZGV4IDU4NDAxZDIuLjVjYThjNzEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zY2FuLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwpAQCAtMjc1LDYgKzI3NSw3IEBACiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOwogCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmJzcywgKnJlcyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCiAJc3Bpbl9sb2NrX2JoKCZkZXYtPmJzc19sb2NrKTsKIApAQCAtMjgzLDYgKzI4NCwxMCBAQAogCQkJY29udGludWU7CiAJCWlmIChjaGFubmVsICYmIGJzcy0+cHViLmNoYW5uZWwgIT0gY2hhbm5lbCkKIAkJCWNvbnRpbnVlOworCQkvKiBEb24ndCBnZXQgZXhwaXJlZCBCU1Mgc3RydWN0cyAqLworCQlpZiAodGltZV9hZnRlcihub3csIGJzcy0+dHMgKyBJRUVFODAyMTFfU0NBTl9SRVNVTFRfRVhQSVJFKSAmJgorCQkgICAgIWF0b21pY19yZWFkKCZic3MtPmhvbGQpKQorCQkJY29udGludWU7CiAJCWlmIChpc19ic3MoJmJzcy0+cHViLCBic3NpZCwgc3NpZCwgc3NpZF9sZW4pKSB7CiAJCQlyZXMgPSBic3M7CiAJCQlrcmVmX2dldCgmcmVzLT5yZWYpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NtZS5jIGIvbmV0L3dpcmVsZXNzL3NtZS5jCmluZGV4IDcyMjIyZjAuLmE4YzJkNmIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvc21lLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlib29sIGF1dG9fYXV0aCwgcHJldl9ic3NpZF92YWxpZDsKIH07CiAKLWJvb2wgY2ZnODAyMTFfaXNfYWxsX2lkbGUodm9pZCkKK3N0YXRpYyBib29sIGNmZzgwMjExX2lzX2FsbF9pZGxlKHZvaWQpCiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2OwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCAzNDE2MzczLi4wYzhhMWU4IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTc3MCw4ICs3NzAsOCBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBpZiBpdCdzIHBhcnQgb2YgYSBicmlkZ2UsIHJlamVjdCBjaGFuZ2luZyB0eXBlIHRvIHN0YXRpb24vaWJzcyAqLwotCWlmIChkZXYtPmJyX3BvcnQgJiYgKG50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DIHx8Ci0JCQkgICAgIG50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pKQorCWlmICgoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSAmJgorCSAgICAobnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwgbnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAobnR5cGUgIT0gb3R5cGUpIHsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKaW5kZXggOTYzNDI5OS4uYmI1ZTBhNSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKQEAgLTgyOSw3ICs4MjksNyBAQAogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKLQllbnVtIHR4X3Bvd2VyX3NldHRpbmcgdHlwZTsKKwllbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlOwogCWludCBkYm0gPSAwOwogCiAJaWYgKChkYXRhLT50eHBvd2VyLmZsYWdzICYgSVdfVFhQT1dfVFlQRSkgIT0gSVdfVFhQT1dfREJNKQpAQCAtODUyLDcgKzg1Miw3IEBACiAJCQlpZiAoZGF0YS0+dHhwb3dlci52YWx1ZSA8IDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlkYm0gPSBkYXRhLT50eHBvd2VyLnZhbHVlOwotCQkJdHlwZSA9IFRYX1BPV0VSX0ZJWEVEOworCQkJdHlwZSA9IE5MODAyMTFfVFhfUE9XRVJfRklYRUQ7CiAJCQkvKiBUT0RPOiBkbyByZWd1bGF0b3J5IGNoZWNrISAqLwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTg2MCwxMCArODYwLDEwIEBACiAJCQkgKiBwYXNzZWQgaW4gZnJvbSB1c2VybGFuZC4KIAkJCSAqLwogCQkJaWYgKGRhdGEtPnR4cG93ZXIudmFsdWUgPCAwKSB7Ci0JCQkJdHlwZSA9IFRYX1BPV0VSX0FVVE9NQVRJQzsKKwkJCQl0eXBlID0gTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM7CiAJCQl9IGVsc2UgewogCQkJCWRibSA9IGRhdGEtPnR4cG93ZXIudmFsdWU7Ci0JCQkJdHlwZSA9IFRYX1BPV0VSX0xJTUlURUQ7CisJCQkJdHlwZSA9IE5MODAyMTFfVFhfUE9XRVJfTElNSVRFRDsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CkBAIC04NzIsNyArODcyLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIHJkZXYtPm9wcy0+c2V0X3R4X3Bvd2VyKHdkZXYtPndpcGh5LCB0eXBlLCBkYm0pOworCXJldHVybiByZGV2LT5vcHMtPnNldF90eF9wb3dlcih3ZGV2LT53aXBoeSwgdHlwZSwgREJNX1RPX01CTShkYm0pKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNmZzgwMjExX3dleHRfc2l3dHhwb3dlcik7CiAKQEAgLTE0NzEsNiArMTQ3MSw3IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjZmc4MDIxMV93ZXh0X3Npd3Bta3NhKTsKIAogc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgY2ZnODAyMTFfaGFuZGxlcnNbXSA9IHsKIAlbSVdfSU9DVExfSURYKFNJT0NHSVdOQU1FKV0JPSAoaXdfaGFuZGxlcikgY2ZnODAyMTFfd2V4dF9naXduYW1lLApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggYTdlYzVhOC4uMmIzZWQ3YSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC0yNDkyLDcgKzI0OTIsOCBAQAogCWludCBydjsKIAogCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnhmcm1fc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBsaW51eF94ZnJtX21pYikpIDwgMCkKKwkJCSAgc2l6ZW9mKHN0cnVjdCBsaW51eF94ZnJtX21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBsaW51eF94ZnJtX21pYikpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcnYgPSB4ZnJtX3Byb2NfaW5pdChuZXQpOwogCWlmIChydiA8IDApCmRpZmYgLS1naXQgYS9zYW1wbGVzL2twcm9iZXMva3Byb2JlX2V4YW1wbGUuYyBiL3NhbXBsZXMva3Byb2Jlcy9rcHJvYmVfZXhhbXBsZS5jCmluZGV4IGE2ODE5OTguLmViZjVlMGMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMva3Byb2Jlcy9rcHJvYmVfZXhhbXBsZS5jCisrKyBiL3NhbXBsZXMva3Byb2Jlcy9rcHJvYmVfZXhhbXBsZS5jCkBAIC0zMiw2ICszMiwxMSBAQAogCQkJIiBtc3IgPSAweCVseFxuIiwKIAkJcC0+YWRkciwgcmVncy0+bmlwLCByZWdzLT5tc3IpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX01JUFMKKwlwcmludGsoS0VSTl9JTkZPICJwcmVfaGFuZGxlcjogcC0+YWRkciA9IDB4JXAsIGVwYyA9IDB4JWx4LCIKKwkJCSIgc3RhdHVzID0gMHglbHhcbiIsCisJCXAtPmFkZHIsIHJlZ3MtPmNwMF9lcGMsIHJlZ3MtPmNwMF9zdGF0dXMpOworI2VuZGlmCiAKIAkvKiBBIGR1bXBfc3RhY2soKSBoZXJlIHdpbGwgZ2l2ZSBhIHN0YWNrIGJhY2t0cmFjZSAqLwogCXJldHVybiAwOwpAQCAtNDksNiArNTQsMTAgQEAKIAlwcmludGsoS0VSTl9JTkZPICJwb3N0X2hhbmRsZXI6IHAtPmFkZHIgPSAweCVwLCBtc3IgPSAweCVseFxuIiwKIAkJcC0+YWRkciwgcmVncy0+bXNyKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTCisJcHJpbnRrKEtFUk5fSU5GTyAicG9zdF9oYW5kbGVyOiBwLT5hZGRyID0gMHglcCwgc3RhdHVzID0gMHglbHhcbiIsCisJCXAtPmFkZHIsIHJlZ3MtPmNwMF9zdGF0dXMpOworI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAppbmRleCBlNGRlYjczLi5hMWE1Y2Y5IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTExNSw3ICsxMTUsMTAgQEAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICMgRGVmYXVsdCBpcyBidWlsdC1pbiwgdW5sZXNzIHdlIGtub3cgb3RoZXJ3aXNlCi1tb2RrZXJuX2NmbGFncyA9ICQoaWYgJChwYXJ0LW9mLW1vZHVsZSksICQoQ0ZMQUdTX01PRFVMRSksICQoQ0ZMQUdTX0tFUk5FTCkpCittb2RrZXJuX2NmbGFncyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSQoaWYgJChwYXJ0LW9mLW1vZHVsZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkkKEtCVUlMRF9DRkxBR1NfTU9EVUxFKSAkKENGTEFHU19NT0RVTEUpLCBcCisJCSQoS0JVSUxEX0NGTEFHU19LRVJORUwpICQoQ0ZMQUdTX0tFUk5FTCkpCiBxdWlldF9tb2R0YWcgOj0gJChlbXB0eSkgICAkKGVtcHR5KQogCiAkKHJlYWwtb2Jqcy1tKSAgICAgICAgOiBwYXJ0LW9mLW1vZHVsZSA6PSB5CkBAIC0xNTYsMTQgKzE1OSwxNCBAQAogCiBjbWRfZ2Vuc3ltdHlwZXMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICQoQ1BQKSAtRF9fR0VOS1NZTVNfXyAkKGNfZmxhZ3MpICQ8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKEdFTktTWU1TKSAtVCAkQCAtYSAkKEFSQ0gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJChHRU5LU1lNUykgJChpZiAkKDEpLCAtVCAkKDIpKSAtYSAkKEFSQ0gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAkKGlmICQoS0JVSUxEX1BSRVNFUlZFKSwtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgJChpZiAkKDEpLC1yICQoZmlyc3R3b3JkICQod2lsZGNhcmQgJChAOi5zeW10eXBlcz0uc3ltcmVmKSAvZGV2L251bGwpKSkKKyAgICAgLXIgJChmaXJzdHdvcmQgJCh3aWxkY2FyZCAkKDI6LnN5bXR5cGVzPS5zeW1yZWYpIC9kZXYvbnVsbCkpCiAKIHF1aWV0X2NtZF9jY19zeW10eXBlc19jID0gU1lNICQocXVpZXRfbW9kdGFnKSAkQAogY21kX2NjX3N5bXR5cGVzX2MgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzZXQgLWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgJChjYWxsIGNtZF9nZW5zeW10eXBlcywgdHJ1ZSkgPi9kZXYvbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICQoY2FsbCBjbWRfZ2Vuc3ltdHlwZXMsdHJ1ZSwkQCkgPi9kZXYvbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB0ZXN0IC1zICRAIHx8IHJtIC1mICRACiAKICQob2JqKS8lLnN5bXR5cGVzIDogJChzcmMpLyUuYyBGT1JDRQpAQCAtMTkyLDE2ICsxOTUsMTYgQEAKICMgICB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBjaGVja3N1bSBnZW5lcmF0ZWQgYnkgZ2Vua3N5bXMKIAogY21kX2NjX29fYyA9ICQoQ0MpICQoY19mbGFncykgLWMgLW8gJChARCkvLnRtcF8kKEBGKSAkPAotY21kX21vZHZlcnNpb25zID0JCQkJCQkJXAotCWlmICQoT0JKRFVNUCkgLWggJChARCkvLnRtcF8kKEBGKSB8IGdyZXAgLXEgX19rc3ltdGFiOyB0aGVuCVwKLQkJJChjYWxsIGNtZF9nZW5zeW10eXBlcywgJChLQlVJTERfU1lNVFlQRVMpKQkJXAotCQkgICAgPiAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CQkJCVwKLQkJCQkJCQkJCVwKLQkJJChMRCkgJChMREZMQUdTKSAtciAtbyAkQCAkKEBEKS8udG1wXyQoQEYpIAkJXAotCQkJLVQgJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwkJCVwKLQkJcm0gLWYgJChARCkvLnRtcF8kKEBGKSAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CVwKLQllbHNlCQkJCQkJCQlcCi0JCW12IC1mICQoQEQpLy50bXBfJChARikgJEA7CQkJCVwKK2NtZF9tb2R2ZXJzaW9ucyA9CQkJCQkJCQlcCisJaWYgJChPQkpEVU1QKSAtaCAkKEBEKS8udG1wXyQoQEYpIHwgZ3JlcCAtcSBfX2tzeW10YWI7IHRoZW4JCVwKKwkJJChjYWxsIGNtZF9nZW5zeW10eXBlcywkKEtCVUlMRF9TWU1UWVBFUyksJChAOi5vPS5zeW10eXBlcykpCVwKKwkJICAgID4gJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwkJCQkJXAorCQkJCQkJCQkJCVwKKwkJJChMRCkgJChMREZMQUdTKSAtciAtbyAkQCAkKEBEKS8udG1wXyQoQEYpIAkJCVwKKwkJCS1UICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCQkJXAorCQlybSAtZiAkKEBEKS8udG1wXyQoQEYpICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCVwKKwllbHNlCQkJCQkJCQkJXAorCQltdiAtZiAkKEBEKS8udG1wXyQoQEYpICRAOwkJCQkJXAogCWZpOwogZW5kaWYKIApAQCAtMjQ4LDEwICsyNTEsMTAgQEAKICMgQ29tcGlsZSBhc3NlbWJsZXIgc291cmNlcyAoLlMpCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1tb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19LRVJORUwpCittb2RrZXJuX2FmbGFncyA6PSAkKEtCVUlMRF9BRkxBR1NfS0VSTkVMKSAkKEFGTEFHU19LRVJORUwpCiAKLSQocmVhbC1vYmpzLW0pICAgICAgOiBtb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19NT0RVTEUpCi0kKHJlYWwtb2Jqcy1tOi5vPS5zKTogbW9ka2Vybl9hZmxhZ3MgOj0gJChBRkxBR1NfTU9EVUxFKQorJChyZWFsLW9ianMtbSkgICAgICA6IG1vZGtlcm5fYWZsYWdzIDo9ICQoS0JVSUxEX0FGTEFHU19NT0RVTEUpICQoQUZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LnMpOiBtb2RrZXJuX2FmbGFncyA6PSAkKEtCVUlMRF9BRkxBR1NfTU9EVUxFKSAkKEFGTEFHU19NT0RVTEUpCiAKIHF1aWV0X2NtZF9hc19zX1MgPSBDUFAgJChxdWlldF9tb2R0YWcpICRACiBjbWRfYXNfc19TICAgICAgID0gJChDUFApICQoYV9mbGFncykgICAtbyAkQCAkPCAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuaGVscCBiL3NjcmlwdHMvTWFrZWZpbGUuaGVscApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM2MDhmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5oZWxwCkBAIC0wLDAgKzEsMyBAQAorCitjaGVja2VyLWhlbHA6CisJQGVjaG8gICcgIGNvY2NpY2hlY2sgICAgICAtIENoZWNrIHdpdGggQ29jY2luZWxsZS4nCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKaW5kZXggOGYxNGM4MS4uN2QyMjA1NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdApAQCAtMzAsNyArMzAsNyBAQAogIyAgICAgLSBTZWUgaW5jbHVkZS9saW51eC9tb2R1bGUuaCBmb3IgbW9yZSBkZXRhaWxzCiAKICMgU3RlcCA0IGlzIHNvbGVseSB1c2VkIHRvIGFsbG93IG1vZHVsZSB2ZXJzaW9uaW5nIGluIGV4dGVybmFsIG1vZHVsZXMsCi0jIHdoZXJlIHRoZSBDUkMgb2YgZWFjaCBtb2R1bGUgaXMgcmV0cmlldmVkIGZyb20gdGhlIE1vZHVsZS5zeW1lcnMgZmlsZS4KKyMgd2hlcmUgdGhlIENSQyBvZiBlYWNoIG1vZHVsZSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgTW9kdWxlLnN5bXZlcnMgZmlsZS4KIAogIyBLQlVJTERfTU9EUE9TVF9XQVJOIGNhbiBiZSBzZXQgdG8gYXZvaWQgZXJyb3Igb3V0IGluIGNhc2Ugb2YgdW5kZWZpbmVkCiAjIHN5bWJvbHMgaW4gdGhlIGZpbmFsIG1vZHVsZSBsaW5raW5nIHN0YWdlCkBAIC0xMDcsNyArMTA3LDcgQEAKIG1vZG5hbWUgPSAkKG5vdGRpciAkKEA6Lm1vZC5vPSkpCiAKIHF1aWV0X2NtZF9jY19vX2MgPSBDQyAgICAgICRACi0gICAgICBjbWRfY2Nfb19jID0gJChDQykgJChjX2ZsYWdzKSAkKENGTEFHU19NT0RVTEUpCVwKKyAgICAgIGNtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpICQoS0JVSUxEX0NGTEFHU19NT0RVTEUpICQoQ0ZMQUdTX01PRFVMRSkgXAogCQkgICAtYyAtbyAkQCAkPAogCiAkKG1vZHVsZXM6LmtvPS5tb2Qubyk6ICUubW9kLm86ICUubW9kLmMgRk9SQ0UKQEAgLTExNyw4ICsxMTcsOSBAQAogCiAjIFN0ZXAgNiksIGZpbmFsIGxpbmsgb2YgdGhlIG1vZHVsZXMKIHF1aWV0X2NtZF9sZF9rb19vID0gTEQgW01dICAkQAotICAgICAgY21kX2xkX2tvX28gPSAkKExEKSAtciAkKExERkxBR1MpICQoTERGTEFHU19NT0RVTEUpIC1vICRACQlcCi0JCQkgICQoZmlsdGVyLW91dCBGT1JDRSwkXikKKyAgICAgIGNtZF9sZF9rb19vID0gJChMRCkgLXIgJChMREZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLQlVJTERfTERGTEFHU19NT0RVTEUpICQoTERGTEFHU19NT0RVTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLW8gJEAgJChmaWx0ZXItb3V0IEZPUkNFLCReKQogCiAkKG1vZHVsZXMpOiAlLmtvIDolLm8gJS5tb2QubyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkX2tvX28pCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMuc2ggYi9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMuc2gKaW5kZXggNDZiZTNjNS4uMmNhNDliYiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnNoCisrKyBiL3NjcmlwdHMvY2hlY2trY29uZmlnc3ltYm9scy5zaApAQCAtMTQsNyArMTQsNyBAQAogZG8KIAkjIE91dHB1dCB0aGUgYmFyZSBLY29uZmlnIHZhcmlhYmxlIGFuZCB0aGUgZmlsZW5hbWU7IHRoZSBfTU9EVUxFIHBhcnQgYXQKIAkjIHRoZSBlbmQgaXMgbm90IHJlbW92ZWQgaGVyZSAod291bGQgbmVlZCBwZXJsIGFuIG5vdC1odW5ncnkgcmVnZXhwIGZvciB0aGF0KS4KLQlzZWQgLW5lICdzIV4uKlw8XChVTUxfXClcP0NPTkZJR19cKFswLTlBLVpfXVwrXCkuKiFcMiAnJGknIXAnIDwgJGkKKwlzZWQgLW5lICdzIV4uKlw8XChVTUxfXClcP0NPTkZJR19cKFswLTlBLVphLXpfXVwrXCkuKiFcMiAnJGknIXAnIDwgJGkKIGRvbmUgfCBcCiAjIFNtYXJ0ICJzb3J0fHVuaXEiIGltcGxlbWVudGVkIGluIGF3ayBhbmQgdHVuZWQgdG8gY29sbGVjdCB0aGUgbmFtZXMgb2YgYWxsCiAjIGZpbGVzIHdoaWNoIHVzZSBhIGdpdmVuIHN5bWJvbApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb2NjaWNoZWNrIGIvc2NyaXB0cy9jb2NjaWNoZWNrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4YmNmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvY2NpY2hlY2sKQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisKK1NQQVRDSD0iYHdoaWNoICR7U1BBVENIOj1zcGF0Y2h9YCIKKworaWYgWyAiJEMiID0gIjEiIC1vICIkQyIgPSAiMiIgXTsgdGhlbgorICAgIE9OTElORT0xCisKKyMgVGhpcyByZXF1aXJlcyBDb2NjaW5lbGxlID49IDAuMi4zCisjICAgIEZMQUdTPSItaWdub3JlX3Vua25vd25fb3B0aW9ucyAtdmVyeV9xdWlldCIKKyMgICAgT1BUSU9OUz0kKgorCisjIFdvcmthcm91bmQgZm9yIENvY2NpbmVsbGUgPCAwLjIuMworICAgIEZMQUdTPSItSSAkc3JjdHJlZS9pbmNsdWRlIC12ZXJ5X3F1aWV0IgorICAgIHNoaWZ0ICQoKCAkIyAtIDEgKSkKKyAgICBPUFRJT05TPSQxCitlbHNlCisgICAgT05MSU5FPTAKKyAgICBGTEFHUz0iLXZlcnlfcXVpZXQiCitmaQorCitpZiBbICEgLXggIiRTUEFUQ0giIF07IHRoZW4KKyAgICBlY2hvICdzcGF0Y2ggaXMgcGFydCBvZiB0aGUgQ29jY2luZWxsZSBwcm9qZWN0IGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8nCisgICAgZXhpdCAxCitmaQorCitpZiBbICIkTU9ERSIgPSAiIiBdIDsgdGhlbgorICAgIGlmIFsgIiRPTkxJTkUiID0gIjAiIF0gOyB0aGVuCisJZWNobyAnWW91IGhhdmUgbm90IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbW9kZSB0byB1c2UuIEZhbGxiYWNrIHRvICJyZXBvcnQiLicKKwllY2hvICdZb3UgY2FuIHNwZWNpZnkgdGhlIG1vZGUgd2l0aCAibWFrZSBjb2NjaWNoZWNrIE1PREU9PG1vZGU+IicKKwllY2hvICdBdmFpbGFibGUgbW9kZXMgYXJlOiByZXBvcnQsIHBhdGNoLCBjb250ZXh0LCBvcmcnCisgICAgZmkKKyAgICBNT0RFPSJyZXBvcnQiCitmaQorCitpZiBbICIkT05MSU5FIiA9ICIwIiBdIDsgdGhlbgorICAgIGVjaG8gJycKKyAgICBlY2hvICdQbGVhc2UgY2hlY2sgZm9yIGZhbHNlIHBvc2l0aXZlcyBpbiB0aGUgb3V0cHV0IGJlZm9yZSBzdWJtaXR0aW5nIGEgcGF0Y2guJworICAgIGVjaG8gJ1doZW4gdXNpbmcgInBhdGNoIiBtb2RlLCBjYXJlZnVsbHkgcmV2aWV3IHRoZSBwYXRjaCBiZWZvcmUgc3VibWl0dGluZyBpdC4nCisgICAgZWNobyAnJworZmkKKworY29jY2luZWxsZSAoKSB7CisgICAgQ09DQ0k9IiQxIgorCisgICAgT1BUPWBncmVwICJPcHRpb24iICRDT0NDSSB8IGN1dCAtZCc6JyAtZjJgCisKKyMgICBUaGUgb3B0aW9uICctcGFyc2VfY29jY2knIGNhbiBiZSB1c2VkIHRvIHN5bnRheGljYWxseSBjaGVjayB0aGUgU21QTCBmaWxlcy4KKyMKKyMgICAgJFNQQVRDSCAtRCAkTU9ERSAkRkxBR1MgLXBhcnNlX2NvY2NpICRDT0NDSSAkT1BUID4gL2Rldi9udWxsCisKKyAgICBpZiBbICIkT05MSU5FIiA9ICIwIiBdIDsgdGhlbgorCisJRklMRT1gZWNobyAkQ09DQ0kgfCBzZWQgInN8JHNyY3RyZWUvfHwiYAorCisJZWNobyAiUHJvY2Vzc2luZyBgYmFzZW5hbWUgJENPQ0NJYCB3aXRoIG9wdGlvbihzKSBcIiRPUFRcIiIKKwllY2hvICdNZXNzYWdlIGV4YW1wbGUgdG8gc3VibWl0IGEgcGF0Y2g6JworCisJc2VkIC1lICcvXC9cL1wvLyFkJyAtZSAnc3xeLy8vfHwnICRDT0NDSQorCisJZWNobyAnIFRoZSBzZW1hbnRpYyBwYXRjaCB0aGF0IG1ha2VzIHRoaXMgY2hhbmdlIGlzIGF2YWlsYWJsZScKKwllY2hvICIgaW4gJEZJTEUuIgorCWVjaG8gJycKKwllY2hvICcgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzZW1hbnRpYyBwYXRjaGluZyBpcyBhdmFpbGFibGUgYXQnCisJZWNobyAnIGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvJworCWVjaG8gJycKKworCSRTUEFUQ0ggLUQgJE1PREUgJEZMQUdTIC1zcF9maWxlICRDT0NDSSAkT1BUIC1kaXIgJHNyY3RyZWUgfHwgZXhpdCAxCisgICAgZWxzZQorCSRTUEFUQ0ggLUQgJE1PREUgJEZMQUdTIC1zcF9maWxlICRDT0NDSSAkT1BUICRPUFRJT05TIHx8IGV4aXQgMQorICAgIGZpCisKK30KKworaWYgWyAiJENPQ0NJIiA9ICIiIF0gOyB0aGVuCisgICAgZm9yIGYgaW4gYGZpbmQgJHNyY3RyZWUvc2NyaXB0cy9jb2NjaW5lbGxlLyAtbmFtZSAnKi5jb2NjaScgLXR5cGUgZiB8IHNvcnRgOyBkbworCWNvY2NpbmVsbGUgJGYKKyAgICBkb25lCitlbHNlCisgICAgY29jY2luZWxsZSAkQ09DQ0kKK2ZpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvY2NpbmVsbGUvYWxsb2MvZHJvcF9rbWFsbG9jX2Nhc3QuY29jY2kgYi9zY3JpcHRzL2NvY2NpbmVsbGUvYWxsb2MvZHJvcF9rbWFsbG9jX2Nhc3QuY29jY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0NzcxZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9hbGxvYy9kcm9wX2ttYWxsb2NfY2FzdC5jb2NjaQpAQCAtMCwwICsxLDY3IEBACisvLy8KKy8vLyBDYXN0aW5nICh2b2lkICopIHZhbHVlIHJldHVybmVkIGJ5IGttYWxsb2MgaXMgdXNlbGVzcworLy8vIGFzIG1lbnRpb25lZCBpbiBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlLCBDaGFwIDE0LgorLy8vCisvLyBDb25maWRlbmNlOiBIaWdoCisvLyBDb3B5cmlnaHQ6IDIwMDksMjAxMCBOaWNvbGFzIFBhbGl4LCBESUtVLiAgR1BMdjIuCisvLyBVUkw6IGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvCisvLyBPcHRpb25zOiAtbm9faW5jbHVkZXMgLWluY2x1ZGVfaGVhZGVycworLy8KKy8vIEtleXdvcmRzOiBrbWFsbG9jLCBremFsbG9jLCBrY2FsbG9jCisvLyBWZXJzaW9uIG1pbjogPCAyLjYuMTIga21hbGxvYworLy8gVmVyc2lvbiBtaW46IDwgMi42LjEyIGtjYWxsb2MKKy8vIFZlcnNpb24gbWluOiAgIDIuNi4xNCBremFsbG9jCisvLworCit2aXJ0dWFsIGNvbnRleHQKK3ZpcnR1YWwgcGF0Y2gKK3ZpcnR1YWwgb3JnCit2aXJ0dWFsIHJlcG9ydAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgY29udGV4dCBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQGRlcGVuZHMgb24gY29udGV4dEAKK3R5cGUgVDsKK0BACisKKyogKFQgKikKKyAgXChrbWFsbG9jXHxremFsbG9jXHxrY2FsbG9jXCkoLi4uKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgcGF0Y2ggbW9kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0BkZXBlbmRzIG9uIHBhdGNoQAordHlwZSBUOworQEAKKworLSAoVCAqKQorICBcKGttYWxsb2NcfGt6YWxsb2NcfGtjYWxsb2NcKSguLi4pCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEZvciBvcmcgYW5kIHJlcG9ydCBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQHIgZGVwZW5kcyBvbiBvcmcgfHwgcmVwb3J0QAordHlwZSBUOworcG9zaXRpb24gcDsKK0BACisKKyAoVEBwICopXChrbWFsbG9jXHxremFsbG9jXHxrY2FsbG9jXCkoLi4uKQorCitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uIG9yZ0AKK3AgPDwgci5wOwordCA8PCByLlQ7CitAQAorCitjb2NjaWxpYi5vcmcucHJpbnRfc2FmZV90b2RvKHBbMF0sIHQpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorcCA8PCByLnA7Cit0IDw8IHIuVDsKK0BACisKK21zZz0iV0FSTklORzogY2FzdGluZyB2YWx1ZSByZXR1cm5lZCBieSBrW2Ntel1hbGxvYyB0byAoJXMgKikgaXMgdXNlbGVzcy4iICUgKHQpCitjb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9hbGxvYy9remFsbG9jLXNpbXBsZS5jb2NjaSBiL3NjcmlwdHMvY29jY2luZWxsZS9hbGxvYy9remFsbG9jLXNpbXBsZS5jb2NjaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFlODI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb2NjaW5lbGxlL2FsbG9jL2t6YWxsb2Mtc2ltcGxlLmNvY2NpCkBAIC0wLDAgKzEsODIgQEAKKy8vLworLy8vIGt6YWxsb2Mgc2hvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4ga21hbGxvYyBmb2xsb3dlZCBieSBtZW1zZXQgMAorLy8vCisvLyBDb25maWRlbmNlOiBIaWdoCisvLyBDb3B5cmlnaHQ6IChDKSAyMDA5LTIwMTAgSnVsaWEgTGF3YWxsLCBOaWNvbGFzIFBhbGl4LCBESUtVLiAgR1BMdjIuCisvLyBDb3B5cmlnaHQ6IChDKSAyMDA5LTIwMTAgR2lsbGVzIE11bGxlciwgSU5SSUEvTGlQNi4gIEdQTHYyLgorLy8gVVJMOiBodHRwOi8vY29jY2luZWxsZS5saXA2LmZyL3J1bGVzL2t6YWxsb2MuaHRtbAorLy8gT3B0aW9uczogLW5vX2luY2x1ZGVzIC1pbmNsdWRlX2hlYWRlcnMKKy8vCisvLyBLZXl3b3Jkczoga21hbGxvYywga3phbGxvYworLy8gVmVyc2lvbiBtaW46IDwgMi42LjEyIGttYWxsb2MKKy8vIFZlcnNpb24gbWluOiAgIDIuNi4xNCBremFsbG9jCisvLworCit2aXJ0dWFsIGNvbnRleHQKK3ZpcnR1YWwgcGF0Y2gKK3ZpcnR1YWwgb3JnCit2aXJ0dWFsIHJlcG9ydAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgY29udGV4dCBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQGRlcGVuZHMgb24gY29udGV4dEAKK3R5cGUgVCwgVDI7CitleHByZXNzaW9uIHg7CitleHByZXNzaW9uIEUxLEUyOworc3RhdGVtZW50IFM7CitAQAorCisqIHggPSAoVClrbWFsbG9jKEUxLEUyKTsKKyAgaWYgKCh4PT1OVUxMKSB8fCAuLi4pIFMKKyogbWVtc2V0KChUMil4LDAsRTEpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgcGF0Y2ggbW9kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0BkZXBlbmRzIG9uIHBhdGNoQAordHlwZSBULCBUMjsKK2V4cHJlc3Npb24geDsKK2V4cHJlc3Npb24gRTEsRTI7CitzdGF0ZW1lbnQgUzsKK0BACisKKy0geCA9IChUKWttYWxsb2MoRTEsRTIpOworKyB4ID0ga3phbGxvYyhFMSxFMik7CisgIGlmICgoeD09TlVMTCkgfHwgLi4uKSBTCistIG1lbXNldCgoVDIpeCwwLEUxKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRm9yIG9yZyBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQHIgZGVwZW5kcyBvbiBvcmcgfHwgcmVwb3J0QAordHlwZSBULCBUMjsKK2V4cHJlc3Npb24geDsKK2V4cHJlc3Npb24gRTEsRTI7CitzdGF0ZW1lbnQgUzsKK3Bvc2l0aW9uIHA7CitAQAorCisgeCA9IChUKWttYWxsb2NAcChFMSxFMik7CisgaWYgKCh4PT1OVUxMKSB8fCAuLi4pIFMKKyBtZW1zZXQoKFQyKXgsMCxFMSk7CisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gb3JnQAorcCA8PCByLnA7Cit4IDw8IHIueDsKK0BACisKK21zZz0iJXMiICUgKHgpCittc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQorY29jY2lsaWIub3JnLnByaW50X3RvZG8ocFswXSwgbXNnX3NhZmUpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorcCA8PCByLnA7Cit4IDw8IHIueDsKK0BACisKK21zZz0iV0FSTklORzoga3phbGxvYyBzaG91bGQgYmUgdXNlZCBmb3IgJXMsIGluc3RlYWQgb2Yga21hbGxvYy9tZW1zZXQiICUgKHgpCitjb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9kZXJlZl9udWxsLmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL2RlcmVmX251bGwuY29jY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2OWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9kZXJlZl9udWxsLmNvY2NpCkBAIC0wLDAgKzEsMjkzIEBACisvLy8KKy8vLyBBIHZhcmlhYmxlIGlzIGRlcmVmZXJlbmNlIHVuZGVyIGEgTlVMTCB0ZXN0LgorLy8vIEV2ZW4gdGhvdWdoIGl0IGlzIGtub3cgdG8gYmUgTlVMTC4KKy8vLworLy8gQ29uZmlkZW5jZTogTW9kZXJhdGUKKy8vIENvcHlyaWdodDogKEMpIDIwMTAgTmljb2xhcyBQYWxpeCwgRElLVS4gIEdQTHYyLgorLy8gQ29weXJpZ2h0OiAoQykgMjAxMCBKdWxpYSBMYXdhbGwsIERJS1UuICBHUEx2Mi4KKy8vIENvcHlyaWdodDogKEMpIDIwMTAgR2lsbGVzIE11bGxlciwgSU5SSUEvTGlQNi4gIEdQTHYyLgorLy8gVVJMOiBodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLworLy8gQ29tbWVudHM6IC1JIC4uLiAtYWxsX2luY2x1ZGVzIGNhbiBnaXZlIG1vcmUgY29tcGxldGUgcmVzdWx0cworLy8gT3B0aW9uczoKKwordmlydHVhbCBjb250ZXh0Cit2aXJ0dWFsIHBhdGNoCit2aXJ0dWFsIG9yZwordmlydHVhbCByZXBvcnQKKworQGluaXRpYWxpemU6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0QAorCitpbXBvcnQgc3lzCitwcmludCA+PiBzeXMuc3RkZXJyLCAiVGhpcyBzZW1hbnRpYyBwYXRjaCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAncGF0Y2gnIG1vZGUuIgorCitAZGVwZW5kcyBvbiBwYXRjaEAKK0BACisKK3RoaXNfcnVsZV9zaG91bGRfbmV2ZXJfbWF0Y2hlcygpOworCitAaWZtIGRlcGVuZHMgb24gIXBhdGNoQAorZXhwcmVzc2lvbiAqRTsKK3N0YXRlbWVudCBTMSxTMjsKK3Bvc2l0aW9uIHAxOworQEAKKworaWZAcDEgKChFID09IE5VTEwgJiYgLi4uKSB8fCAuLi4pIFMxIGVsc2UgUzIKKworLy8gVGhlIGZvbGxvd2luZyB0d28gcnVsZXMgYXJlIHNlcGFyYXRlLCBiZWNhdXNlIGJvdGggY2FuIG1hdGNoIGEgc2luZ2xlCisvLyBleHByZXNzaW9uIGluIGRpZmZlcmVudCB3YXlzCitAcHIxIGRlcGVuZHMgb24gIXBhdGNoIGV4cHJlc3Npb25ACitleHByZXNzaW9uICppZm0uRTsKK2lkZW50aWZpZXIgZjsKK3Bvc2l0aW9uIHAxOworQEAKKworIChFICE9IE5VTEwgJiYgLi4uKSA/IDwrLi4uRS0+ZkBwMS4uLis+IDogLi4uCisKK0BwcjIgZGVwZW5kcyBvbiAhcGF0Y2ggZXhwcmVzc2lvbkAKK2V4cHJlc3Npb24gKmlmbS5FOworaWRlbnRpZmllciBmOworcG9zaXRpb24gcDI7CitAQAorCisoCisgIChFICE9IE5VTEwpICYmIC4uLiAmJiA8Ky4uLkUtPmZAcDIuLi4rPgorfAorICAoRSA9PSBOVUxMKSB8fCAuLi4gfHwgPCsuLi5FLT5mQHAyLi4uKz4KK3wKKyBzaXplb2YoPCsuLi5FLT5mQHAyLi4uKz4pCispCisKKy8vIEZvciBvcmcgYW5kIHJlcG9ydCBtb2RlcworCitAciBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAob3JnIHx8IHJlcG9ydCkgZXhpc3RzQAorZXhwcmVzc2lvbiBzdWJFIDw9IGlmbS5FOworZXhwcmVzc2lvbiAqaWZtLkU7CitleHByZXNzaW9uIEUxLEUyOworaWRlbnRpZmllciBmOworc3RhdGVtZW50IFMxLFMyLFMzLFM0OworaXRlcmF0b3IgaXRlcjsKK3Bvc2l0aW9uIHAhPXtwcjEucDEscHIyLnAyfTsKK3Bvc2l0aW9uIGlmbS5wMTsKK0BACisKK2lmQHAxICgoRSA9PSBOVUxMICYmIC4uLikgfHwgLi4uKQoreworICAuLi4gd2hlbiAhPSBpZiAoLi4uKSBTMSBlbHNlIFMyCisoCisgaXRlcihzdWJFLC4uLikgUzQgLy8gbm8gdXNlCit8CisgbGlzdF9yZW1vdmVfaGVhZChFMixzdWJFLC4uLikKK3wKKyBzdWJFID0gRTEKK3wKKyBmb3Ioc3ViRSA9IEUxOy4uLjsuLi4pIFM0Cit8Cisgc3ViRSsrCit8CisgKytzdWJFCit8CisgLS1zdWJFCit8Cisgc3ViRS0tCit8CisgJnN1YkUKK3wKKyBFLT5mQHAgLy8gYmFkIHVzZQorKQorICAuLi4gd2hlbiBhbnkKKyAgcmV0dXJuIC4uLjsKK30KK2Vsc2UgUzMKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgIW9yZyAmJiByZXBvcnRACitwIDw8IHIucDsKK3AxIDw8IGlmbS5wMTsKK3ggPDwgaWZtLkU7CitAQAorCittc2c9IkVSUk9SOiAlcyBpcyBOVUxMIGJ1dCBkZXJlZmVyZW5jZWQuIiAlICh4KQorY29jY2lsaWIucmVwb3J0LnByaW50X3JlcG9ydChwWzBdLCBtc2cpCitjb2NjaS5pbmNsdWRlX21hdGNoKEZhbHNlKQorCitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiBvcmcgJiYgIXJlcG9ydEAKK3AgPDwgci5wOworcDEgPDwgaWZtLnAxOworeCA8PCBpZm0uRTsKK0BACisKK21zZz0iRVJST1I6ICVzIGlzIE5VTEwgYnV0IGRlcmVmZXJlbmNlZC4iICUgKHgpCittc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQorY29jY2kucHJpbnRfbWFpbihtc2dfc2FmZSxwKQorY29jY2kuaW5jbHVkZV9tYXRjaChGYWxzZSkKKworQHMgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKK2V4cHJlc3Npb24gc3ViRSA8PSBpZm0uRTsKK2V4cHJlc3Npb24gKmlmbS5FOworZXhwcmVzc2lvbiBFMSxFMjsKK2lkZW50aWZpZXIgZjsKK3N0YXRlbWVudCBTMSxTMixTMyxTNDsKK2l0ZXJhdG9yIGl0ZXI7Citwb3NpdGlvbiBwIT17cHIxLnAxLHByMi5wMn07Citwb3NpdGlvbiBpZm0ucDE7CitAQAorCitpZkBwMSAoKEUgPT0gTlVMTCAmJiAuLi4pIHx8IC4uLikKK3sKKyAgLi4uIHdoZW4gIT0gaWYgKC4uLikgUzEgZWxzZSBTMgorKAorIGl0ZXIoc3ViRSwuLi4pIFM0IC8vIG5vIHVzZQorfAorIGxpc3RfcmVtb3ZlX2hlYWQoRTIsc3ViRSwuLi4pCit8Cisgc3ViRSA9IEUxCit8CisgZm9yKHN1YkUgPSBFMTsuLi47Li4uKSBTNAorfAorIHN1YkUrKworfAorICsrc3ViRQorfAorIC0tc3ViRQorfAorIHN1YkUtLQorfAorICZzdWJFCit8CisgRS0+ZkBwIC8vIGJhZCB1c2UKKykKKyAgLi4uIHdoZW4gYW55Cit9CitlbHNlIFMzCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgcmVwb3J0QAorcCA8PCBzLnA7CitwMSA8PCBpZm0ucDE7Cit4IDw8IGlmbS5FOworQEAKKworbXNnPSJFUlJPUjogJXMgaXMgTlVMTCBidXQgZGVyZWZlcmVuY2VkLiIgJSAoeCkKK2NvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQorCitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiBvcmcgJiYgIXJlcG9ydEAKK3AgPDwgcy5wOworcDEgPDwgaWZtLnAxOworeCA8PCBpZm0uRTsKK0BACisKK21zZz0iRVJST1I6ICVzIGlzIE5VTEwgYnV0IGRlcmVmZXJlbmNlZC4iICUgKHgpCittc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQorY29jY2kucHJpbnRfbWFpbihtc2dfc2FmZSxwKQorCisvLyBGb3IgY29udGV4dCBtb2RlCisKK0BkZXBlbmRzIG9uIGNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgIXJlcG9ydCBleGlzdHNACitleHByZXNzaW9uIHN1YkUgPD0gaWZtLkU7CitleHByZXNzaW9uICppZm0uRTsKK2V4cHJlc3Npb24gRTEsRTI7CitpZGVudGlmaWVyIGY7CitzdGF0ZW1lbnQgUzEsUzIsUzMsUzQ7CitpdGVyYXRvciBpdGVyOworcG9zaXRpb24gcCE9e3ByMS5wMSxwcjIucDJ9OworcG9zaXRpb24gaWZtLnAxOworQEAKKworaWZAcDEgKChFID09IE5VTEwgJiYgLi4uKSB8fCAuLi4pCit7CisgIC4uLiB3aGVuICE9IGlmICguLi4pIFMxIGVsc2UgUzIKKygKKyBpdGVyKHN1YkUsLi4uKSBTNCAvLyBubyB1c2UKK3wKKyBsaXN0X3JlbW92ZV9oZWFkKEUyLHN1YkUsLi4uKQorfAorIHN1YkUgPSBFMQorfAorIGZvcihzdWJFID0gRTE7Li4uOy4uLikgUzQKK3wKKyBzdWJFKysKK3wKKyArK3N1YkUKK3wKKyAtLXN1YkUKK3wKKyBzdWJFLS0KK3wKKyAmc3ViRQorfAorKiBFLT5mQHAgLy8gYmFkIHVzZQorKQorICAuLi4gd2hlbiBhbnkKKyAgcmV0dXJuIC4uLjsKK30KK2Vsc2UgUzMKKworLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBydWxlcyBhcmUgZHVwbGljYXRlcyBvZiBpZm0sIHByMSBhbmQgcHIyIHJlc3BlY3RpdmVseS4KKy8vIEl0IGlzIG5lZWQgYmVjYXVzZSB0aGUgcHJldmlvdXMgcnVsZSBhcyBhbHJlYWR5IG1hZGUgYSAiY2hhbmdlIi4KKworQGlmbTEgZGVwZW5kcyBvbiAhcGF0Y2hACitleHByZXNzaW9uICpFOworc3RhdGVtZW50IFMxLFMyOworcG9zaXRpb24gcDE7CitAQAorCitpZkBwMSAoKEUgPT0gTlVMTCAmJiAuLi4pIHx8IC4uLikgUzEgZWxzZSBTMgorCitAcHIxMSBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorZXhwcmVzc2lvbiAqaWZtMS5FOworaWRlbnRpZmllciBmOworcG9zaXRpb24gcDE7CitAQAorCisgKEUgIT0gTlVMTCAmJiAuLi4pID8gPCsuLi5FLT5mQHAxLi4uKz4gOiAuLi4KKworQHByMTIgZGVwZW5kcyBvbiAhcGF0Y2ggZXhwcmVzc2lvbkAKK2V4cHJlc3Npb24gKmlmbTEuRTsKK2lkZW50aWZpZXIgZjsKK3Bvc2l0aW9uIHAyOworQEAKKworKAorICAoRSAhPSBOVUxMKSAmJiAuLi4gJiYgPCsuLi5FLT5mQHAyLi4uKz4KK3wKKyAgKEUgPT0gTlVMTCkgfHwgLi4uIHx8IDwrLi4uRS0+ZkBwMi4uLis+Cit8Cisgc2l6ZW9mKDwrLi4uRS0+ZkBwMi4uLis+KQorKQorCitAZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAorZXhwcmVzc2lvbiBzdWJFIDw9IGlmbTEuRTsKK2V4cHJlc3Npb24gKmlmbTEuRTsKK2V4cHJlc3Npb24gRTEsRTI7CitpZGVudGlmaWVyIGY7CitzdGF0ZW1lbnQgUzEsUzIsUzMsUzQ7CitpdGVyYXRvciBpdGVyOworcG9zaXRpb24gcCE9e3ByMTEucDEscHIxMi5wMn07Citwb3NpdGlvbiBpZm0xLnAxOworQEAKKworaWZAcDEgKChFID09IE5VTEwgJiYgLi4uKSB8fCAuLi4pCit7CisgIC4uLiB3aGVuICE9IGlmICguLi4pIFMxIGVsc2UgUzIKKygKKyBpdGVyKHN1YkUsLi4uKSBTNCAvLyBubyB1c2UKK3wKKyBsaXN0X3JlbW92ZV9oZWFkKEUyLHN1YkUsLi4uKQorfAorIHN1YkUgPSBFMQorfAorIGZvcihzdWJFID0gRTE7Li4uOy4uLikgUzQKK3wKKyBzdWJFKysKK3wKKyArK3N1YkUKK3wKKyAtLXN1YkUKK3wKKyBzdWJFLS0KK3wKKyAmc3ViRQorfAorKiBFLT5mQHAgLy8gYmFkIHVzZQorKQorICAuLi4gd2hlbiBhbnkKK30KK2Vsc2UgUzMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9lcnJfY2FzdC5jb2NjaSBiL3NjcmlwdHMvY29jY2luZWxsZS9lcnJfY2FzdC5jb2NjaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2UxMTUwMAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9lcnJfY2FzdC5jb2NjaQpAQCAtMCwwICsxLDU2IEBACisvLy8KKy8vLyBVc2UgRVJSX0NBU1QgaW5saW5lZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIEVSUl9QVFIoUFRSX0VSUiguLi4pKQorLy8vCisvLyBDb25maWRlbmNlOiBIaWdoCisvLyBDb3B5cmlnaHQ6IChDKSAyMDA5LCAyMDEwIE5pY29sYXMgUGFsaXgsIERJS1UuICBHUEx2Mi4KKy8vIENvcHlyaWdodDogKEMpIDIwMDksIDIwMTAgSnVsaWEgTGF3YWxsLCBESUtVLiAgR1BMdjIuCisvLyBDb3B5cmlnaHQ6IChDKSAyMDA5LCAyMDEwIEdpbGxlcyBNdWxsZXIsIElOUklBL0xpUDYuICBHUEx2Mi4KKy8vIFVSTDogaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KKy8vIE9wdGlvbnM6CisvLworLy8gS2V5d29yZHM6IEVSUl9QVFIsIFBUUl9FUlIsIEVSUl9DQVNUCisvLyBWZXJzaW9uIG1pbjogMi42LjI1CisvLworCit2aXJ0dWFsIGNvbnRleHQKK3ZpcnR1YWwgcGF0Y2gKK3ZpcnR1YWwgb3JnCit2aXJ0dWFsIHJlcG9ydAorCisKK0AgZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnRACitleHByZXNzaW9uIHg7CitAQAorCisqIEVSUl9QVFIoUFRSX0VSUih4KSkKKworQCBkZXBlbmRzIG9uICFjb250ZXh0ICYmIHBhdGNoICYmICFvcmcgJiYgIXJlcG9ydCBACitleHByZXNzaW9uIHg7CitAQAorCistIEVSUl9QVFIoUFRSX0VSUih4KSkKKysgRVJSX0NBU1QoeCkKKworQHIgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpQAorZXhwcmVzc2lvbiB4OworcG9zaXRpb24gcDsKK0BACisKKyBFUlJfUFRSQHAoUFRSX0VSUih4KSkKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiBvcmdACitwIDw8IHIucDsKK3ggPDwgci54OworQEAKKworbXNnPSJXQVJOSU5HIEVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggJXMiICUgKHgpCittc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQorY29jY2lsaWIub3JnLnByaW50X3RvZG8ocFswXSwgbXNnX3NhZmUpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorcCA8PCByLnA7Cit4IDw8IHIueDsKK0BACisKK21zZz0iV0FSTklORzogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCAlcyIgJSAoeCkKK2NvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb2NjaW5lbGxlL3Jlc291cmNlX3NpemUuY29jY2kgYi9zY3JpcHRzL2NvY2NpbmVsbGUvcmVzb3VyY2Vfc2l6ZS5jb2NjaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM1YTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb2NjaW5lbGxlL3Jlc291cmNlX3NpemUuY29jY2kKQEAgLTAsMCArMSw5MyBAQAorLy8vCisvLy8gVXNlIHJlc291cmNlX3NpemUgZnVuY3Rpb24gb24gcmVzb3VyY2Ugb2JqZWN0CisvLy8gaW5zdGVhZCBvZiBleHBsaWNpdCBjb21wdXRhdGlvbi4KKy8vLworLy8gIENvbmZpZGVuY2U6IEhpZ2gKKy8vICBDb3B5cmlnaHQ6IChDKSAyMDA5LCAyMDEwIE5pY29sYXMgUGFsaXgsIERJS1UuICBHUEx2Mi4KKy8vICBDb3B5cmlnaHQ6IChDKSAyMDA5LCAyMDEwIEp1bGlhIExhd2FsbCwgRElLVS4gIEdQTHYyLgorLy8gIENvcHlyaWdodDogKEMpIDIwMDksIDIwMTAgR2lsbGVzIE11bGxlciwgSU5SSUEvTGlQNi4gIEdQTHYyLgorLy8gIFVSTDogaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KKy8vICBPcHRpb25zOgorLy8KKy8vICBLZXl3b3JkczogcmVzb3VyY2Vfc2l6ZQorLy8gIFZlcnNpb24gbWluOiAyLjYuMjcgcmVzb3VyY2Vfc2l6ZQorLy8KKwordmlydHVhbCBjb250ZXh0Cit2aXJ0dWFsIHBhdGNoCit2aXJ0dWFsIG9yZwordmlydHVhbCByZXBvcnQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRm9yIGNvbnRleHQgbW9kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ByX2NvbnRleHQgZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnQAorc3RydWN0IHJlc291cmNlICpyZXM7CitAQAorCisqIChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpICsgMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGb3IgcGF0Y2ggbW9kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ByX3BhdGNoIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgcGF0Y2ggJiYgIW9yZ0AKK3N0cnVjdCByZXNvdXJjZSAqcmVzOworQEAKKworLSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSArIDEKKysgcmVzb3VyY2Vfc2l6ZShyZXMpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEZvciBvcmcgbW9kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworQHJfb3JnIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KUAKK3N0cnVjdCByZXNvdXJjZSAqcmVzOworcG9zaXRpb24gcDsKK0BACisKKyAocmVzLT5lbmRAcCAtIHJlcy0+c3RhcnQpICsgMQorCitAcmJhZF9vcmcgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpQAorc3RydWN0IHJlc291cmNlICpyZXM7Citwb3NpdGlvbiBwICE9IHJfb3JnLnA7CitAQAorCisgcmVzLT5lbmRAcCAtIHJlcy0+c3RhcnQKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiBvcmdACitwIDw8IHJfb3JnLnA7Cit4IDw8IHJfb3JnLnJlczsKK0BACisKK21zZz0iRVJST1Igd2l0aCAlcyIgJSAoeCkKK21zZ19zYWZlPW1zZy5yZXBsYWNlKCJbIiwiQCgiKS5yZXBsYWNlKCJdIiwiKSIpCitjb2NjaWxpYi5vcmcucHJpbnRfdG9kbyhwWzBdLCBtc2dfc2FmZSkKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiByZXBvcnRACitwIDw8IHJfb3JnLnA7Cit4IDw8IHJfb3JnLnJlczsKK0BACisKK21zZz0iRVJST1I6IE1pc3NpbmcgcmVzb3VyY2Vfc2l6ZSB3aXRoICVzIiAlICh4KQorY29jY2lsaWIucmVwb3J0LnByaW50X3JlcG9ydChwWzBdLCBtc2cpCisKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gb3JnQAorcCA8PCByYmFkX29yZy5wOworeCA8PCByYmFkX29yZy5yZXM7CitAQAorCittc2c9IldBUk5JTkcgd2l0aCAlcyIgJSAoeCkKK21zZ19zYWZlPW1zZy5yZXBsYWNlKCJbIiwiQCgiKS5yZXBsYWNlKCJdIiwiKSIpCitjb2NjaWxpYi5vcmcucHJpbnRfdG9kbyhwWzBdLCBtc2dfc2FmZSkKKworQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiByZXBvcnRACitwIDw8IHJiYWRfb3JnLnA7Cit4IDw8IHJiYWRfb3JnLnJlczsKK0BACisKK21zZz0iV0FSTklORzogU3VzcGljaW91cyBjb2RlLiByZXNvdXJjZV9zaXplIGlzIG1heWJlIG1pc3Npbmcgd2l0aCAlcyIgJSAoeCkKK2NvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kZWNvZGVjb2RlIGIvc2NyaXB0cy9kZWNvZGVjb2RlCmluZGV4IDhiMzBjYzMuLjE4YmE4ODEgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvZGVjb2RlY29kZQorKysgYi9zY3JpcHRzL2RlY29kZWNvZGUKQEAgLTQwLDcgKzQwLDcgQEAKIGNvZGU9YGVjaG8gJGNvZGUgfCBzZWQgLWUgJ3MvLipDb2RlOiAvLydgCiAKIHdpZHRoPWBleHByIGluZGV4ICIkY29kZSIgJyAnYAotd2lkdGg9JFsoJHdpZHRoLTEpLzJdCit3aWR0aD0kKCgoJHdpZHRoLTEpLzIpKQogY2FzZSAkd2lkdGggaW4KIDEpIHR5cGU9Ynl0ZSA7OwogMikgdHlwZT0yYnl0ZSA7OwpAQCAtNDgsMTAgKzQ4LDEwIEBACiBlc2FjCiAKIGRpc2FzKCkgewotCSR7Q1JPU1NfQ09NUElMRX1hcyAkQUZMQUdTIC1vICQxLm8gJDEucyAmPiAvZGV2L251bGwKKwkke0NST1NTX0NPTVBJTEV9YXMgJEFGTEFHUyAtbyAkMS5vICQxLnMgPiAvZGV2L251bGwgMj4mMQogCi0JaWYgWyAiJEFSQ0giID09ICJhcm0iIF07IHRoZW4KLQkJaWYgWyAkd2lkdGggPT0gMiBdOyB0aGVuCisJaWYgWyAiJEFSQ0giID0gImFybSIgXTsgdGhlbgorCQlpZiBbICR3aWR0aCAtZXEgMiBdOyB0aGVuCiAJCQlPQkpEVU1QRkxBR1M9Ii1NIGZvcmNlLXRodW1iIgogCQlmaQogCkBAIC01OSw3ICs1OSw3IEBACiAJZmkKIAogCSR7Q1JPU1NfQ09NUElMRX1vYmpkdW1wICRPQkpEVU1QRkxBR1MgLVMgJDEubyB8IFwKLQkJZ3JlcCAtdiAiL3RtcFx8RGlzYXNzZW1ibHlcfFwudGV4dFx8XiQiICY+ICQxLmRpcworCQlncmVwIC12ICIvdG1wXHxEaXNhc3NlbWJseVx8XC50ZXh0XHxeJCIgPiAkMS5kaXMgMj4mMQogfQogCiBtYXJrZXI9YGV4cHIgaW5kZXggIiRjb2RlIiAiXDwiYApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZnN0cmVlLmMgYi9zY3JpcHRzL2R0Yy9mc3RyZWUuYwppbmRleCA3NjZiMjY5Li44ZmUxYmRmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9mc3RyZWUuYworKysgYi9zY3JpcHRzL2R0Yy9mc3RyZWUuYwpAQCAtNzcsNiArNzcsNyBAQAogCQlmcmVlKHRtcG5hbSk7CiAJfQogCisJY2xvc2VkaXIoZCk7CiAJcmV0dXJuIHRyZWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy8uZ2l0aWdub3JlIGIvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUKaW5kZXggNmEzNmE3Ni4uNjI0ZjY1MCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUKKysrIGIvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUKQEAgLTE3LDYgKzE3LDcgQEAKICMKIGNvbmYKIG1jb25mCituY29uZgogcWNvbmYKIGdjb25mCiBreGdldHRleHQKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQppbmRleCA3ZWE2NDlkLi5kZTkzNGRlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC0yMSwxNyArMjEsMTcgQEAKIAkkPCAkKEtjb25maWcpCiAKIGNvbmZpZzogJChvYmopL2NvbmYKLQkkPCAkKEtjb25maWcpCisJJDwgLS1vbGRhc2tjb25maWcgJChLY29uZmlnKQogCiBuY29uZmlnOiAkKG9iaikvbmNvbmYKIAkkPCAkKEtjb25maWcpCiAKIG9sZGNvbmZpZzogJChvYmopL2NvbmYKLQkkPCAtbyAkKEtjb25maWcpCisJJDwgLS0kQCAkKEtjb25maWcpCiAKIHNpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYKIAkkKFEpbWtkaXIgLXAgaW5jbHVkZS9nZW5lcmF0ZWQKLQkkPCAtcyAkKEtjb25maWcpCisJJDwgLS0kQCAkKEtjb25maWcpCiAKICMgaWYgbm8gcGF0aCBpcyBnaXZlbiwgdGhlbiB1c2Ugc3JjIGRpcmVjdG9yeSB0byBmaW5kIGZpbGUKIGlmZGVmIExTTU9ECkBAIC00NCwxNSArNDQsMTUgQEAKIGxvY2FsbW9kY29uZmlnOiAkKG9iaikvc3RyZWFtbGluZV9jb25maWcucGwgJChvYmopL2NvbmYKIAkkKFEpbWtkaXIgLXAgaW5jbHVkZS9nZW5lcmF0ZWQKIAkkKFEpcGVybCAkPCAkKHNyY3RyZWUpICQoS2NvbmZpZykgJChMU01PRF9GKSA+IC50bXAuY29uZmlnCi0JJChRKWlmIFsgLWYgLmNvbmZpZyBdOyB0aGVuIAkJCQlcCi0JCQljbXAgLXMgLnRtcC5jb25maWcgLmNvbmZpZyB8fAkJXAotCQkJKG12IC1mIC5jb25maWcgLmNvbmZpZy5vbGQuMTsJCVwKLQkJCSBtdiAtZiAudG1wLmNvbmZpZyAuY29uZmlnOwkJXAotCQkJICQob2JqKS9jb25mIC1zICQoS2NvbmZpZyk7CQlcCi0JCQkgbXYgLWYgLmNvbmZpZy5vbGQuMSAuY29uZmlnLm9sZCkJXAotCWVsc2UJCQkJCQkJXAotCQkJbXYgLWYgLnRtcC5jb25maWcgLmNvbmZpZzsJCVwKLQkJCSQob2JqKS9jb25mIC1zICQoS2NvbmZpZyk7CQlcCisJJChRKWlmIFsgLWYgLmNvbmZpZyBdOyB0aGVuIAkJCQkJXAorCQkJY21wIC1zIC50bXAuY29uZmlnIC5jb25maWcgfHwJCQlcCisJCQkobXYgLWYgLmNvbmZpZyAuY29uZmlnLm9sZC4xOwkJCVwKKwkJCSBtdiAtZiAudG1wLmNvbmZpZyAuY29uZmlnOwkJCVwKKwkJCSAkKG9iaikvY29uZiAtLXNpbGVudG9sZGNvbmZpZyAkKEtjb25maWcpOwlcCisJCQkgbXYgLWYgLmNvbmZpZy5vbGQuMSAuY29uZmlnLm9sZCkJCVwKKwllbHNlCQkJCQkJCQlcCisJCQltdiAtZiAudG1wLmNvbmZpZyAuY29uZmlnOwkJCVwKKwkJCSQob2JqKS9jb25mIC0tc2lsZW50b2xkY29uZmlnICQoS2NvbmZpZyk7CVwKIAlmaQogCSQoUSlybSAtZiAudG1wLmNvbmZpZwogCkBAIC02MCwxNSArNjAsMTUgQEAKIAkkKFEpbWtkaXIgLXAgaW5jbHVkZS9nZW5lcmF0ZWQKIAkkKFEpcGVybCAkPCAkKHNyY3RyZWUpICQoS2NvbmZpZykgJChMU01PRF9GKSA+IC50bXAuY29uZmlnCiAJJChRKXNlZCAtaSBzLz1tLz15LyAudG1wLmNvbmZpZwotCSQoUSlpZiBbIC1mIC5jb25maWcgXTsgdGhlbiAJCQkJXAotCQkJY21wIC1zIC50bXAuY29uZmlnIC5jb25maWcgfHwJCVwKLQkJCShtdiAtZiAuY29uZmlnIC5jb25maWcub2xkLjE7CQlcCi0JCQkgbXYgLWYgLnRtcC5jb25maWcgLmNvbmZpZzsJCVwKLQkJCSAkKG9iaikvY29uZiAtcyAkKEtjb25maWcpOwkJXAotCQkJIG12IC1mIC5jb25maWcub2xkLjEgLmNvbmZpZy5vbGQpCVwKLQllbHNlCQkJCQkJCVwKLQkJCW12IC1mIC50bXAuY29uZmlnIC5jb25maWc7CQlcCi0JCQkkKG9iaikvY29uZiAtcyAkKEtjb25maWcpOwkJXAorCSQoUSlpZiBbIC1mIC5jb25maWcgXTsgdGhlbgkJCQkJXAorCQkJY21wIC1zIC50bXAuY29uZmlnIC5jb25maWcgfHwJCQlcCisJCQkobXYgLWYgLmNvbmZpZyAuY29uZmlnLm9sZC4xOwkJCVwKKwkJCSBtdiAtZiAudG1wLmNvbmZpZyAuY29uZmlnOwkJCVwKKwkJCSAkKG9iaikvY29uZiAtLXNpbGVudG9sZGNvbmZpZyAkKEtjb25maWcpOwlcCisJCQkgbXYgLWYgLmNvbmZpZy5vbGQuMSAuY29uZmlnLm9sZCkJCVwKKwllbHNlCQkJCQkJCQlcCisJCQltdiAtZiAudG1wLmNvbmZpZyAuY29uZmlnOwkJCVwKKwkJCSQob2JqKS9jb25mIC0tc2lsZW50b2xkY29uZmlnICQoS2NvbmZpZyk7CVwKIAlmaQogCSQoUSlybSAtZiAudG1wLmNvbmZpZwogCkBAIC05NSwzMCArOTUsMjkgQEAKIAkkKFEpcm0gLWYgYXJjaC91bS9LY29uZmlnLmFyY2gKIAkkKFEpcm0gLWYgJChvYmopL2NvbmZpZy5wb3QKIAotUEhPTlkgKz0gcmFuZGNvbmZpZyBhbGx5ZXNjb25maWcgYWxsbm9jb25maWcgYWxsbW9kY29uZmlnIGRlZmNvbmZpZworUEhPTlkgKz0gYWxsbm9jb25maWcgYWxseWVzY29uZmlnIGFsbG1vZGNvbmZpZyBhbGxkZWZjb25maWcgcmFuZGNvbmZpZwogCi1yYW5kY29uZmlnOiAkKG9iaikvY29uZgotCSQ8IC1yICQoS2NvbmZpZykKK2FsbG5vY29uZmlnIGFsbHllc2NvbmZpZyBhbGxtb2Rjb25maWcgYWxsZGVmY29uZmlnIHJhbmRjb25maWc6ICQob2JqKS9jb25mCisJJDwgLS0kQCAkKEtjb25maWcpCiAKLWFsbHllc2NvbmZpZzogJChvYmopL2NvbmYKLQkkPCAteSAkKEtjb25maWcpCitQSE9OWSArPSBsaXN0bmV3Y29uZmlnIG9sZG5vY29uZmlnIHNhdmVkZWZjb25maWcgZGVmY29uZmlnCiAKLWFsbG5vY29uZmlnOiAkKG9iaikvY29uZgotCSQ8IC1uICQoS2NvbmZpZykKK2xpc3RuZXdjb25maWcgb2xkbm9jb25maWc6ICQob2JqKS9jb25mCisJJDwgLS0kQCAkKEtjb25maWcpCiAKLWFsbG1vZGNvbmZpZzogJChvYmopL2NvbmYKLQkkPCAtbSAkKEtjb25maWcpCitzYXZlZGVmY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC0tJEA9ZGVmY29uZmlnICQoS2NvbmZpZykKIAogZGVmY29uZmlnOiAkKG9iaikvY29uZgogaWZlcSAoJChLQlVJTERfREVGQ09ORklHKSwpCi0JJDwgLWQgJChLY29uZmlnKQorCSQ8IC0tZGVmY29uZmlnICQoS2NvbmZpZykKIGVsc2UKIAlAZWNobyAiKioqIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbiAnJChLQlVJTERfREVGQ09ORklHKSciCi0JJChRKSQ8IC1EIGFyY2gvJChTUkNBUkNIKS9jb25maWdzLyQoS0JVSUxEX0RFRkNPTkZJRykgJChLY29uZmlnKQorCSQoUSkkPCAtLWRlZmNvbmZpZz1hcmNoLyQoU1JDQVJDSCkvY29uZmlncy8kKEtCVUlMRF9ERUZDT05GSUcpICQoS2NvbmZpZykKIGVuZGlmCiAKICVfZGVmY29uZmlnOiAkKG9iaikvY29uZgotCSQoUSkkPCAtRCBhcmNoLyQoU1JDQVJDSCkvY29uZmlncy8kQCAkKEtjb25maWcpCisJJChRKSQ8IC0tZGVmY29uZmlnPWFyY2gvJChTUkNBUkNIKS9jb25maWdzLyRAICQoS2NvbmZpZykKIAogIyBIZWxwIHRleHQgdXNlZCBieSBtYWtlIGhlbHAKIGhlbHA6CkBAIC0xMzEsMTEgKzEzMCwxNSBAQAogCUBlY2hvICAnICBsb2NhbG1vZGNvbmZpZyAgLSBVcGRhdGUgY3VycmVudCBjb25maWcgZGlzYWJsaW5nIG1vZHVsZXMgbm90IGxvYWRlZCcKIAlAZWNobyAgJyAgbG9jYWx5ZXNjb25maWcgIC0gVXBkYXRlIGN1cnJlbnQgY29uZmlnIGNvbnZlcnRpbmcgbG9jYWwgbW9kcyB0byBjb3JlJwogCUBlY2hvICAnICBzaWxlbnRvbGRjb25maWcgLSBTYW1lIGFzIG9sZGNvbmZpZywgYnV0IHF1aWV0bHksIGFkZGl0aW9uYWxseSB1cGRhdGUgZGVwcycKLQlAZWNobyAgJyAgcmFuZGNvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aXRoIHJhbmRvbSBhbnN3ZXIgdG8gYWxsIG9wdGlvbnMnCi0JQGVjaG8gICcgIGRlZmNvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aXRoIGRlZmF1bHQgYW5zd2VyIHRvIGFsbCBvcHRpb25zJwotCUBlY2hvICAnICBhbGxtb2Rjb25maWcJICAtIE5ldyBjb25maWcgc2VsZWN0aW5nIG1vZHVsZXMgd2hlbiBwb3NzaWJsZScKLQlAZWNobyAgJyAgYWxseWVzY29uZmlnCSAgLSBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhY2NlcHRlZCB3aXRoIHllcycKKwlAZWNobyAgJyAgZGVmY29uZmlnCSAgLSBOZXcgY29uZmlnIHdpdGggZGVmYXVsdCBmcm9tIEFSQ0ggc3VwcGxpZWQgZGVmY29uZmlnJworCUBlY2hvICAnICBzYXZlZGVmY29uZmlnICAgLSBTYXZlIGN1cnJlbnQgY29uZmlnIGFzIC4vZGVmY29uZmlnIChtaW5pbWFsIGNvbmZpZyknCiAJQGVjaG8gICcgIGFsbG5vY29uZmlnCSAgLSBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG5vJworCUBlY2hvICAnICBhbGx5ZXNjb25maWcJICAtIE5ldyBjb25maWcgd2hlcmUgYWxsIG9wdGlvbnMgYXJlIGFjY2VwdGVkIHdpdGggeWVzJworCUBlY2hvICAnICBhbGxtb2Rjb25maWcJICAtIE5ldyBjb25maWcgc2VsZWN0aW5nIG1vZHVsZXMgd2hlbiBwb3NzaWJsZScKKwlAZWNobyAgJyAgYWxsZGVmY29uZmlnICAgIC0gTmV3IGNvbmZpZyB3aXRoIGFsbCBzeW1ib2xzIHNldCB0byBkZWZhdWx0JworCUBlY2hvICAnICByYW5kY29uZmlnCSAgLSBOZXcgY29uZmlnIHdpdGggcmFuZG9tIGFuc3dlciB0byBhbGwgb3B0aW9ucycKKwlAZWNobyAgJyAgbGlzdG5ld2NvbmZpZyAgIC0gTGlzdCBuZXcgb3B0aW9ucycKKwlAZWNobyAgJyAgb2xkbm9jb25maWcgICAgIC0gU2FtZSBhcyBzaWxlbnRvbGRjb25maWcgYnV0IHNldCBuZXcgc3ltYm9scyB0byBuICh1bnNldCknCiAKICMgbHhkaWFsb2cgc3R1ZmYKIGNoZWNrLWx4ZGlhbG9nICA6PSAkKHNyY3RyZWUpLyQoc3JjKS9seGRpYWxvZy9jaGVjay1seGRpYWxvZy5zaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggOTk2MGQxYzMuLjI3NGYyNzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKQEAgLTE5LDE2ICsyMCwyMSBAQAogc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CiBzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KTsKIAotZW51bSB7Ci0JYXNrX2FsbCwKLQlhc2tfbmV3LAotCWFza19zaWxlbnQsCi0Jc2V0X2RlZmF1bHQsCi0Jc2V0X3llcywKLQlzZXRfbW9kLAotCXNldF9ubywKLQlzZXRfcmFuZG9tCi19IGlucHV0X21vZGUgPSBhc2tfYWxsOworZW51bSBpbnB1dF9tb2RlIHsKKwlvbGRhc2tjb25maWcsCisJc2lsZW50b2xkY29uZmlnLAorCW9sZGNvbmZpZywKKwlhbGxub2NvbmZpZywKKwlhbGx5ZXNjb25maWcsCisJYWxsbW9kY29uZmlnLAorCWFsbGRlZmNvbmZpZywKKwlyYW5kY29uZmlnLAorCWRlZmNvbmZpZywKKwlzYXZlZGVmY29uZmlnLAorCWxpc3RuZXdjb25maWcsCisJb2xkbm9jb25maWcsCit9IGlucHV0X21vZGUgPSBvbGRhc2tjb25maWc7CisKIGNoYXIgKmRlZmNvbmZpZ19maWxlOwogCiBzdGF0aWMgaW50IGluZGVudCA9IDE7CkBAIC05MywxNCArOTksMTQgQEAKIAl9CiAKIAlzd2l0Y2ggKGlucHV0X21vZGUpIHsKLQljYXNlIGFza19uZXc6Ci0JY2FzZSBhc2tfc2lsZW50OgorCWNhc2Ugb2xkY29uZmlnOgorCWNhc2Ugc2lsZW50b2xkY29uZmlnOgogCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKSB7CiAJCQlwcmludGYoIiVzXG4iLCBkZWYpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2hlY2tfc3RkaW4oKTsKLQljYXNlIGFza19hbGw6CisJY2FzZSBvbGRhc2tjb25maWc6CiAJCWZmbHVzaChzdGRvdXQpOwogCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKIAkJcmV0dXJuIDE7CkBAIC0xNTYsMTQgKzE2MiwxMiBAQAogc3RhdGljIGludCBjb25mX3N5bShzdHJ1Y3QgbWVudSAqbWVudSkKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07Ci0JaW50IHR5cGU7CiAJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CiAKIAl3aGlsZSAoMSkgewogCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBfKG1lbnUtPnByb21wdC0+dGV4dCkpOwogCQlpZiAoc3ltLT5uYW1lKQogCQkJcHJpbnRmKCIoJXMpICIsIHN5bS0+bmFtZSk7Ci0JCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKIAkJcHV0Y2hhcignWycpOwogCQlvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CiAJCXN3aXRjaCAob2xkdmFsKSB7CkBAIC0yMjgsMTEgKzIzMiw5IEBACiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltLCAqZGVmX3N5bTsKIAlzdHJ1Y3QgbWVudSAqY2hpbGQ7Ci0JaW50IHR5cGU7CiAJYm9vbCBpc19uZXc7CiAKIAlzeW0gPSBtZW51LT5zeW07Ci0JdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOwogCWlzX25ldyA9ICFzeW1faGFzX3ZhbHVlKHN5bSk7CiAJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkgewogCQljb25mX3N5bShtZW51KTsKQEAgLTI5NCwxNSArMjk2LDE1IEBACiAJCQlwcmludGYoIj8iKTsKIAkJcHJpbnRmKCJdOiAiKTsKIAkJc3dpdGNoIChpbnB1dF9tb2RlKSB7Ci0JCWNhc2UgYXNrX25ldzoKLQkJY2FzZSBhc2tfc2lsZW50OgorCQljYXNlIG9sZGNvbmZpZzoKKwkJY2FzZSBzaWxlbnRvbGRjb25maWc6CiAJCQlpZiAoIWlzX25ldykgewogCQkJCWNudCA9IGRlZjsKIAkJCQlwcmludGYoIiVkXG4iLCBjbnQpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2hlY2tfc3RkaW4oKTsKLQkJY2FzZSBhc2tfYWxsOgorCQljYXNlIG9sZGFza2NvbmZpZzoKIAkJCWZmbHVzaChzdGRvdXQpOwogCQkJZmdldHMobGluZSwgMTI4LCBzdGRpbik7CiAJCQlzdHJpcChsaW5lKTsKQEAgLTM2MCw3ICszNjIsMTAgQEAKIAogCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKIAkJY2FzZSBQX01FTlU6Ci0JCQlpZiAoaW5wdXRfbW9kZSA9PSBhc2tfc2lsZW50ICYmIHJvb3RFbnRyeSAhPSBtZW51KSB7CisJCQlpZiAoKGlucHV0X21vZGUgPT0gc2lsZW50b2xkY29uZmlnIHx8CisJCQkgICAgIGlucHV0X21vZGUgPT0gbGlzdG5ld2NvbmZpZyB8fAorCQkJICAgICBpbnB1dF9tb2RlID09IG9sZG5vY29uZmlnKSAmJgorCQkJICAgIHJvb3RFbnRyeSAhPSBtZW51KSB7CiAJCQkJY2hlY2tfY29uZihtZW51KTsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC00MTgsMTAgKzQyMywxNiBAQAogCWlmIChzeW0gJiYgIXN5bV9oYXNfdmFsdWUoc3ltKSkgewogCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pIHx8CiAJCSAgICAoc3ltX2lzX2Nob2ljZShzeW0pICYmIHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PSB5ZXMpKSB7Ci0JCQlpZiAoIWNvbmZfY250KyspCi0JCQkJcHJpbnRmKF8oIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpKTsKLQkJCXJvb3RFbnRyeSA9IG1lbnVfZ2V0X3BhcmVudF9tZW51KG1lbnUpOwotCQkJY29uZihyb290RW50cnkpOworCQkJaWYgKGlucHV0X21vZGUgPT0gbGlzdG5ld2NvbmZpZykgeworCQkJCWlmIChzeW0tPm5hbWUgJiYgIXN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJCQlwcmludGYoIkNPTkZJR18lc1xuIiwgc3ltLT5uYW1lKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghY29uZl9jbnQrKykKKwkJCQkJcHJpbnRmKF8oIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpKTsKKwkJCQlyb290RW50cnkgPSBtZW51X2dldF9wYXJlbnRfbWVudShtZW51KTsKKwkJCQljb25mKHJvb3RFbnRyeSk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTQyOSw2ICs0NDAsMjIgQEAKIAkJY2hlY2tfY29uZihjaGlsZCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworCXsib2xkYXNrY29uZmlnIiwgICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsIG9sZGFza2NvbmZpZ30sCisJeyJvbGRjb25maWciLCAgICAgICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgb2xkY29uZmlnfSwKKwl7InNpbGVudG9sZGNvbmZpZyIsIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCBzaWxlbnRvbGRjb25maWd9LAorCXsiZGVmY29uZmlnIiwgICAgICAgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIGRlZmNvbmZpZ30sCisJeyJzYXZlZGVmY29uZmlnIiwgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgc2F2ZWRlZmNvbmZpZ30sCisJeyJhbGxub2NvbmZpZyIsICAgICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgYWxsbm9jb25maWd9LAorCXsiYWxseWVzY29uZmlnIiwgICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsIGFsbHllc2NvbmZpZ30sCisJeyJhbGxtb2Rjb25maWciLCAgICBub19hcmd1bWVudCwgICAgICAgTlVMTCwgYWxsbW9kY29uZmlnfSwKKwl7ImFsbGRlZmNvbmZpZyIsICAgIG5vX2FyZ3VtZW50LCAgICAgICBOVUxMLCBhbGxkZWZjb25maWd9LAorCXsicmFuZGNvbmZpZyIsICAgICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsIHJhbmRjb25maWd9LAorCXsibGlzdG5ld2NvbmZpZyIsICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsIGxpc3RuZXdjb25maWd9LAorCXsib2xkbm9jb25maWciLCAgICAgbm9fYXJndW1lbnQsICAgICAgIE5VTEwsIG9sZG5vY29uZmlnfSwKKwl7TlVMTCwgMCwgTlVMTCwgMH0KK307CisKIGludCBtYWluKGludCBhYywgY2hhciAqKmF2KQogewogCWludCBvcHQ7CkBAIC00MzksMzIgKzQ2NiwxNyBAQAogCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CiAJdGV4dGRvbWFpbihQQUNLQUdFKTsKIAotCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFjLCBhdiwgIm9zZEQ6bm15cmgiKSkgIT0gLTEpIHsKKwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nX29ubHkoYWMsIGF2LCAiIiwgbG9uZ19vcHRzLCBOVUxMKSkgIT0gLTEpIHsKKwkJaW5wdXRfbW9kZSA9IChlbnVtIGlucHV0X21vZGUpb3B0OwogCQlzd2l0Y2ggKG9wdCkgewotCQljYXNlICdvJzoKLQkJCWlucHV0X21vZGUgPSBhc2tfc2lsZW50OwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCWNhc2Ugc2lsZW50b2xkY29uZmlnOgogCQkJc3luY19rY29uZmlnID0gMTsKIAkJCWJyZWFrOwotCQljYXNlICdkJzoKLQkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKLQkJCWJyZWFrOwotCQljYXNlICdEJzoKLQkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJY2FzZSBkZWZjb25maWc6CisJCWNhc2Ugc2F2ZWRlZmNvbmZpZzoKIAkJCWRlZmNvbmZpZ19maWxlID0gb3B0YXJnOwogCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJaW5wdXRfbW9kZSA9IHNldF9ubzsKLQkJCWJyZWFrOwotCQljYXNlICdtJzoKLQkJCWlucHV0X21vZGUgPSBzZXRfbW9kOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3knOgotCQkJaW5wdXRfbW9kZSA9IHNldF95ZXM7Ci0JCQlicmVhazsKLQkJY2FzZSAncic6CisJCWNhc2UgcmFuZGNvbmZpZzoKIAkJewogCQkJc3RydWN0IHRpbWV2YWwgbm93OwogCQkJdW5zaWduZWQgaW50IHNlZWQ7CkBAIC00NzcsMTcgKzQ4OSwxMiBAQAogCiAJCQlzZWVkID0gKHVuc2lnbmVkIGludCkoKG5vdy50dl9zZWMgKyAxKSAqIChub3cudHZfdXNlYyArIDEpKTsKIAkJCXNyYW5kKHNlZWQpOwotCi0JCQlpbnB1dF9tb2RlID0gc2V0X3JhbmRvbTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgJ2gnOgotCQkJcHJpbnRmKF8oIlNlZSBSRUFETUUgZm9yIHVzYWdlIGluZm9cbiIpKTsKLQkJCWV4aXQoMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwkJY2FzZSAnPyc6CiAJCQlmcHJpbnRmKHN0ZGVyciwgXygiU2VlIFJFQURNRSBmb3IgdXNhZ2UgaW5mb1xuIikpOwogCQkJZXhpdCgxKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChhYyA9PSBvcHRpbmQpIHsKQEAgLTUxMiw3ICs1MTksNyBAQAogCX0KIAogCXN3aXRjaCAoaW5wdXRfbW9kZSkgewotCWNhc2Ugc2V0X2RlZmF1bHQ6CisJY2FzZSBkZWZjb25maWc6CiAJCWlmICghZGVmY29uZmlnX2ZpbGUpCiAJCQlkZWZjb25maWdfZmlsZSA9IGNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUoKTsKIAkJaWYgKGNvbmZfcmVhZChkZWZjb25maWdfZmlsZSkpIHsKQEAgLTUyMiwyNSArNTI5LDMyIEBACiAJCQlleGl0KDEpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgYXNrX3NpbGVudDoKLQljYXNlIGFza19hbGw6Ci0JY2FzZSBhc2tfbmV3OgorCWNhc2Ugc2F2ZWRlZmNvbmZpZzoKIAkJY29uZl9yZWFkKE5VTEwpOwogCQlicmVhazsKLQljYXNlIHNldF9ubzoKLQljYXNlIHNldF9tb2Q6Ci0JY2FzZSBzZXRfeWVzOgotCWNhc2Ugc2V0X3JhbmRvbToKKwljYXNlIHNpbGVudG9sZGNvbmZpZzoKKwljYXNlIG9sZGFza2NvbmZpZzoKKwljYXNlIG9sZGNvbmZpZzoKKwljYXNlIGxpc3RuZXdjb25maWc6CisJY2FzZSBvbGRub2NvbmZpZzoKKwkJY29uZl9yZWFkKE5VTEwpOworCQlicmVhazsKKwljYXNlIGFsbG5vY29uZmlnOgorCWNhc2UgYWxseWVzY29uZmlnOgorCWNhc2UgYWxsbW9kY29uZmlnOgorCWNhc2UgYWxsZGVmY29uZmlnOgorCWNhc2UgcmFuZGNvbmZpZzoKIAkJbmFtZSA9IGdldGVudigiS0NPTkZJR19BTExDT05GSUciKTsKIAkJaWYgKG5hbWUgJiYgIXN0YXQobmFtZSwgJnRtcHN0YXQpKSB7CiAJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUsIFNfREVGX1VTRVIpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3dpdGNoIChpbnB1dF9tb2RlKSB7Ci0JCWNhc2Ugc2V0X25vOgkgbmFtZSA9ICJhbGxuby5jb25maWciOyBicmVhazsKLQkJY2FzZSBzZXRfbW9kOgkgbmFtZSA9ICJhbGxtb2QuY29uZmlnIjsgYnJlYWs7Ci0JCWNhc2Ugc2V0X3llczoJIG5hbWUgPSAiYWxseWVzLmNvbmZpZyI7IGJyZWFrOwotCQljYXNlIHNldF9yYW5kb206IG5hbWUgPSAiYWxscmFuZG9tLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIGFsbG5vY29uZmlnOgluYW1lID0gImFsbG5vLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIGFsbHllc2NvbmZpZzoJbmFtZSA9ICJhbGx5ZXMuY29uZmlnIjsgYnJlYWs7CisJCWNhc2UgYWxsbW9kY29uZmlnOgluYW1lID0gImFsbG1vZC5jb25maWciOyBicmVhazsKKwkJY2FzZSBhbGxkZWZjb25maWc6CW5hbWUgPSAiYWxsZGVmLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIHJhbmRjb25maWc6CW5hbWUgPSAiYWxscmFuZG9tLmNvbmZpZyI7IGJyZWFrOwogCQlkZWZhdWx0OiBicmVhazsKIAkJfQogCQlpZiAoIXN0YXQobmFtZSwgJnRtcHN0YXQpKQpAQCAtNTY1LDMzICs1NzksNDIgQEAKIAl9CiAKIAlzd2l0Y2ggKGlucHV0X21vZGUpIHsKLQljYXNlIHNldF9ubzoKKwljYXNlIGFsbG5vY29uZmlnOgogCQljb25mX3NldF9hbGxfbmV3X3N5bWJvbHMoZGVmX25vKTsKIAkJYnJlYWs7Ci0JY2FzZSBzZXRfeWVzOgorCWNhc2UgYWxseWVzY29uZmlnOgogCQljb25mX3NldF9hbGxfbmV3X3N5bWJvbHMoZGVmX3llcyk7CiAJCWJyZWFrOwotCWNhc2Ugc2V0X21vZDoKKwljYXNlIGFsbG1vZGNvbmZpZzoKIAkJY29uZl9zZXRfYWxsX25ld19zeW1ib2xzKGRlZl9tb2QpOwogCQlicmVhazsKLQljYXNlIHNldF9yYW5kb206Ci0JCWNvbmZfc2V0X2FsbF9uZXdfc3ltYm9scyhkZWZfcmFuZG9tKTsKLQkJYnJlYWs7Ci0JY2FzZSBzZXRfZGVmYXVsdDoKKwljYXNlIGFsbGRlZmNvbmZpZzoKIAkJY29uZl9zZXRfYWxsX25ld19zeW1ib2xzKGRlZl9kZWZhdWx0KTsKIAkJYnJlYWs7Ci0JY2FzZSBhc2tfbmV3OgotCWNhc2UgYXNrX2FsbDoKKwljYXNlIHJhbmRjb25maWc6CisJCWNvbmZfc2V0X2FsbF9uZXdfc3ltYm9scyhkZWZfcmFuZG9tKTsKKwkJYnJlYWs7CisJY2FzZSBkZWZjb25maWc6CisJCWNvbmZfc2V0X2FsbF9uZXdfc3ltYm9scyhkZWZfZGVmYXVsdCk7CisJCWJyZWFrOworCWNhc2Ugc2F2ZWRlZmNvbmZpZzoKKwkJYnJlYWs7CisJY2FzZSBvbGRhc2tjb25maWc6CiAJCXJvb3RFbnRyeSA9ICZyb290bWVudTsKIAkJY29uZigmcm9vdG1lbnUpOwotCQlpbnB1dF9tb2RlID0gYXNrX3NpbGVudDsKKwkJaW5wdXRfbW9kZSA9IHNpbGVudG9sZGNvbmZpZzsKIAkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBhc2tfc2lsZW50OgorCWNhc2Ugb2xkY29uZmlnOgorCWNhc2UgbGlzdG5ld2NvbmZpZzoKKwljYXNlIG9sZG5vY29uZmlnOgorCWNhc2Ugc2lsZW50b2xkY29uZmlnOgogCQkvKiBVcGRhdGUgdW50aWwgYSBsb29wIGNhdXNlZCBubyBtb3JlIGNoYW5nZXMgKi8KIAkJZG8gewogCQkJY29uZl9jbnQgPSAwOwogCQkJY2hlY2tfY29uZigmcm9vdG1lbnUpOwotCQl9IHdoaWxlIChjb25mX2NudCk7CisJCX0gd2hpbGUgKGNvbmZfY250ICYmCisJCQkgKGlucHV0X21vZGUgIT0gbGlzdG5ld2NvbmZpZyAmJgorCQkJICBpbnB1dF9tb2RlICE9IG9sZG5vY29uZmlnKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjA3LDcgKzYzMCwxMyBAQAogCQkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB1cGRhdGUgb2YgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLlxuXG4iKSk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChpbnB1dF9tb2RlID09IHNhdmVkZWZjb25maWcpIHsKKwkJaWYgKGNvbmZfd3JpdGVfZGVmY29uZmlnKGRlZmNvbmZpZ19maWxlKSkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIm4qKiogRXJyb3Igd2hpbGUgc2F2aW5nIGRlZmNvbmZpZyB0bzogJXNcblxuIiksCisJCQkgICAgICAgIGRlZmNvbmZpZ19maWxlKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIGlmIChpbnB1dF9tb2RlICE9IGxpc3RuZXdjb25maWcpIHsKIAkJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKIAkJCWZwcmludGYoc3RkZXJyLCBfKCJcbioqKiBFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uXG5cbiIpKTsKIAkJCWV4aXQoMSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCmluZGV4IGM0ZGVjODAuLmY4MWYyNjMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0xNzAsOCArMTcwLDExIEBACiAJCWlmIChpbikKIAkJCWdvdG8gbG9hZDsKIAkJc3ltX2FkZF9jaGFuZ2VfY291bnQoMSk7Ci0JCWlmICghc3ltX2RlZmNvbmZpZ19saXN0KQorCQlpZiAoIXN5bV9kZWZjb25maWdfbGlzdCkgeworCQkJaWYgKG1vZHVsZXNfc3ltKQorCQkJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKIAkJCXJldHVybiAxOworCQl9CiAKIAkJZm9yX2FsbF9kZWZhdWx0cyhzeW1fZGVmY29uZmlnX2xpc3QsIHByb3ApIHsKIAkJCWlmIChleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKSA9PSBubyB8fApAQCAtMzk2LDE1ICszOTksMTQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFdyaXRlIGEgU19TVFJJTkcgKi8KK3N0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3RyaW5nKGJvb2wgaGVhZGVyZmlsZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgRklMRSAqb3V0KQoreworCWludCBsOworCWlmIChoZWFkZXJmaWxlKQorCQlmcHJpbnRmKG91dCwgIiNkZWZpbmUgQ09ORklHXyVzIFwiIiwgbmFtZSk7CisJZWxzZQorCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1cIiIsIG5hbWUpOworCisJd2hpbGUgKDEpIHsKKwkJbCA9IHN0cmNzcG4oc3RyLCAiXCJcXCIpOworCQlpZiAobCkgeworCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKKwkJCXN0ciArPSBsOworCQl9CisJCWlmICghKnN0cikKKwkJCWJyZWFrOworCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKyspOworCX0KKwlmcHV0cygiXCJcbiIsIG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSwgZW51bSBzeW1ib2xfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqb3V0LCBib29sIHdyaXRlX25vKQoreworCWNvbnN0IGNoYXIgKnN0cjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCWlmICh3cml0ZV9ubykKKwkJCQlmcHJpbnRmKG91dCwgIiMgQ09ORklHXyVzIGlzIG5vdCBzZXRcbiIsIHN5bS0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBtb2Q6CisJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1tXG4iLCBzeW0tPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9eVxuIiwgc3ltLT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJCWNvbmZfd3JpdGVfc3RyaW5nKGZhbHNlLCBzeW0tPm5hbWUsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19IRVg6CisJY2FzZSBTX0lOVDoKKwkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJYnJlYWs7CisJY2FzZSBTX09USEVSOgorCWNhc2UgU19VTktOT1dOOgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYSBtaW5pbWFsIGNvbmZpZy4KKyAqIEFsbCB2YWx1ZXMgdGhhdCBoYXMgZGVmYXVsdCB2YWx1ZXMgYXJlIHNraXBwZWQgYXMgdGhpcyBpcyByZWR1bmRhbnQuCisgKi8KK2ludCBjb25mX3dyaXRlX2RlZmNvbmZpZyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisJRklMRSAqb3V0OworCisJb3V0ID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisJaWYgKCFvdXQpCisJCXJldHVybiAxOworCisJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCisJLyogVHJhdmVyc2UgYWxsIG1lbnVzIHRvIGZpbmQgYWxsIHJlbGV2YW50IHN5bWJvbHMgKi8KKwltZW51ID0gcm9vdG1lbnUubGlzdDsKKworCXdoaWxlIChtZW51ICE9IE5VTEwpCisJeworCQlzeW0gPSBtZW51LT5zeW07CisJCWlmIChzeW0gPT0gTlVMTCkgeworCQkJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCQkJZ290byBuZXh0X21lbnU7CisJCX0gZWxzZSBpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKQorCQkJCWdvdG8gbmV4dF9tZW51OworCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1dSSVRFOworCQkJLyogSWYgd2UgY2Fubm90IGNoYW5nZSB0aGUgc3ltYm9sIC0gc2tpcCAqLworCQkJaWYgKCFzeW1faXNfY2hhbmdhYmxlKHN5bSkpCisJCQkJZ290byBuZXh0X21lbnU7CisJCQkvKiBJZiBzeW1ib2wgZXF1YWxzIHRvIGRlZmF1bHQgdmFsdWUgLSBza2lwICovCisJCQlpZiAoc3RyY21wKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksIHN5bV9nZXRfc3RyaW5nX2RlZmF1bHQoc3ltKSkgPT0gMCkKKwkJCQlnb3RvIG5leHRfbWVudTsKKworCQkJLyoKKwkJCSAqIElmIHN5bWJvbCBpcyBhIGNob2ljZSB2YWx1ZSBhbmQgZXF1YWxzIHRvIHRoZQorCQkJICogZGVmYXVsdCBmb3IgYSBjaG9pY2UgLSBza2lwLgorCQkJICogQnV0IG9ubHkgaWYgdmFsdWUgZXF1YWwgdG8gInkiLgorCQkJICovCisJCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKSB7CisJCQkJc3RydWN0IHN5bWJvbCAqY3M7CisJCQkJc3RydWN0IHN5bWJvbCAqZHM7CisKKwkJCQljcyA9IHByb3BfZ2V0X3N5bWJvbChzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSkpOworCQkJCWRzID0gc3ltX2Nob2ljZV9kZWZhdWx0KGNzKTsKKwkJCQlpZiAoc3ltID09IGRzKSB7CisJCQkJCWlmICgoc3ltLT50eXBlID09IFNfQk9PTEVBTiB8fAorCQkJCQlzeW0tPnR5cGUgPT0gU19UUklTVEFURSkgJiYKKwkJCQkJc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pID09IHllcykKKwkJCQkJCWdvdG8gbmV4dF9tZW51OworCQkJCX0KKwkJCX0KKwkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgc3ltLT50eXBlLCBvdXQsIHRydWUpOworCQl9CituZXh0X21lbnU6CisJCWlmIChtZW51LT5saXN0ICE9IE5VTEwpIHsKKwkJCW1lbnUgPSBtZW51LT5saXN0OworCQl9CisJCWVsc2UgaWYgKG1lbnUtPm5leHQgIT0gTlVMTCkgeworCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoKG1lbnUgPSBtZW51LT5wYXJlbnQpKSB7CisJCQkJaWYgKG1lbnUtPm5leHQgIT0gTlVMTCkgeworCQkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWZjbG9zZShvdXQpOworCXJldHVybiAwOworfQorCiBpbnQgY29uZl93cml0ZShjb25zdCBjaGFyICpuYW1lKQogewogCUZJTEUgKm91dDsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07CiAJc3RydWN0IG1lbnUgKm1lbnU7CiAJY29uc3QgY2hhciAqYmFzZW5hbWU7Ci0JY2hhciBkaXJuYW1lWzEyOF0sIHRtcG5hbWVbMTI4XSwgbmV3bmFtZVsxMjhdOwotCWludCB0eXBlLCBsOwogCWNvbnN0IGNoYXIgKnN0cjsKKwljaGFyIGRpcm5hbWVbMTI4XSwgdG1wbmFtZVsxMjhdLCBuZXduYW1lWzEyOF07CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlOwogCXRpbWVfdCBub3c7CiAJaW50IHVzZV90aW1lc3RhbXAgPSAxOwogCWNoYXIgKmVudjsKQEAgLTQ4NCw1MCArNjIxLDExIEBACiAJCQkJaWYgKG1vZHVsZXNfc3ltLT5jdXJyLnRyaSA9PSBubykKIAkJCQkJdHlwZSA9IFNfQk9PTEVBTjsKIAkJCX0KLQkJCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBTX0JPT0xFQU46Ci0JCQljYXNlIFNfVFJJU1RBVEU6Ci0JCQkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKLQkJCQljYXNlIG5vOgotCQkJCQlmcHJpbnRmKG91dCwgIiMgQ09ORklHXyVzIGlzIG5vdCBzZXRcbiIsIHN5bS0+bmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgbW9kOgotCQkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1tXG4iLCBzeW0tPm5hbWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIHllczoKLQkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9eVxuIiwgc3ltLT5uYW1lKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTX1NUUklORzoKLQkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOwotCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPVwiIiwgc3ltLT5uYW1lKTsKLQkJCQl3aGlsZSAoMSkgewotCQkJCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7Ci0JCQkJCWlmIChsKSB7Ci0JCQkJCQlmd3JpdGUoc3RyLCBsLCAxLCBvdXQpOwotCQkJCQkJc3RyICs9IGw7Ci0JCQkJCX0KLQkJCQkJaWYgKCEqc3RyKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWZwcmludGYob3V0LCAiXFwlYyIsICpzdHIrKyk7Ci0JCQkJfQotCQkJCWZwdXRzKCJcIlxuIiwgb3V0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU19IRVg6Ci0JCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKLQkJCQlpZiAoc3RyWzBdICE9ICcwJyB8fCAoc3RyWzFdICE9ICd4JyAmJiBzdHJbMV0gIT0gJ1gnKSkgewotCQkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQljYXNlIFNfSU5UOgotCQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKLQkJCQlicmVhazsKLQkJCX0KKwkJCS8qIFdyaXRlIGNvbmZpZyBzeW1ib2wgdG8gZmlsZSAqLworCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCB0eXBlLCBvdXQsIHRydWUpOwogCQl9CiAKLQluZXh0OgorbmV4dDoKIAkJaWYgKG1lbnUtPmxpc3QpIHsKIAkJCW1lbnUgPSBtZW51LT5saXN0OwogCQkJY29udGludWU7CkBAIC02NzksNyArNzc3LDcgQEAKIAljb25zdCBjaGFyICpuYW1lOwogCUZJTEUgKm91dCwgKnRyaXN0YXRlLCAqb3V0X2g7CiAJdGltZV90IG5vdzsKLQlpbnQgaSwgbDsKKwlpbnQgaTsKIAogCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKIApAQCAtNzI5LDYgKzgyNywxMSBAQAogCQlzeW1fY2FsY192YWx1ZShzeW0pOwogCQlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSB8fCAhc3ltLT5uYW1lKQogCQkJY29udGludWU7CisKKwkJLyogd3JpdGUgc3ltYm9sIHRvIGNvbmZpZyBmaWxlICovCisJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgc3ltLT50eXBlLCBvdXQsIGZhbHNlKTsKKworCQkvKiB1cGRhdGUgYXV0b2NvbmYgYW5kIHRyaXN0YXRlIGZpbGVzICovCiAJCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJCWNhc2UgU19CT09MRUFOOgogCQljYXNlIFNfVFJJU1RBVEU6CkBAIC03MzYsMTIgKzgzOSwxMCBAQAogCQkJY2FzZSBubzoKIAkJCQlicmVhazsKIAkJCWNhc2UgbW9kOgotCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPW1cbiIsIHN5bS0+bmFtZSk7CiAJCQkJZnByaW50Zih0cmlzdGF0ZSwgIkNPTkZJR18lcz1NXG4iLCBzeW0tPm5hbWUpOwogCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lc19NT0RVTEUgMVxuIiwgc3ltLT5uYW1lKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgeWVzOgotCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPXlcbiIsIHN5bS0+bmFtZSk7CiAJCQkJaWYgKHN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFKQogCQkJCQlmcHJpbnRmKHRyaXN0YXRlLCAiQ09ORklHXyVzPVlcbiIsCiAJCQkJCQkJc3ltLT5uYW1lKTsKQEAgLTc1MCwzNSArODUxLDE2IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBTX1NUUklORzoKLQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1cIiIsIHN5bS0+bmFtZSk7Ci0JCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgXCIiLCBzeW0tPm5hbWUpOwotCQkJd2hpbGUgKDEpIHsKLQkJCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7Ci0JCQkJaWYgKGwpIHsKLQkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKLQkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0X2gpOwotCQkJCQlzdHIgKz0gbDsKLQkJCQl9Ci0JCQkJaWYgKCEqc3RyKQotCQkJCQlicmVhazsKLQkJCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKTsKLQkJCQlmcHJpbnRmKG91dF9oLCAiXFwlYyIsICpzdHIpOwotCQkJCXN0cisrOwotCQkJfQotCQkJZnB1dHMoIlwiXG4iLCBvdXQpOwotCQkJZnB1dHMoIlwiXG4iLCBvdXRfaCk7CisJCQljb25mX3dyaXRlX3N0cmluZyh0cnVlLCBzeW0tPm5hbWUsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksIG91dF9oKTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSEVYOgogCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKIAkJCWlmIChzdHJbMF0gIT0gJzAnIHx8IChzdHJbMV0gIT0gJ3gnICYmIHN0clsxXSAhPSAnWCcpKSB7Ci0JCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKIAkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgMHglc1xuIiwgc3ltLT5uYW1lLCBzdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQljYXNlIFNfSU5UOgogCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKLQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CiAJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgJXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtODYyLDcgKzk0NCw4IEBACiAJCQkJc3ltLT5kZWZbU19ERUZfVVNFUl0udHJpID0gbm87CiAJCQkJYnJlYWs7CiAJCQljYXNlIGRlZl9yYW5kb206Ci0JCQkJc3ltLT5kZWZbU19ERUZfVVNFUl0udHJpID0gKHRyaXN0YXRlKShyYW5kKCkgJSAzKTsKKwkJCQljbnQgPSBzeW1fZ2V0X3R5cGUoc3ltKSA9PSBTX1RSSVNUQVRFID8gMyA6IDI7CisJCQkJc3ltLT5kZWZbU19ERUZfVVNFUl0udHJpID0gKHRyaXN0YXRlKShyYW5kKCkgJSBjbnQpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCmluZGV4IGQ4M2YyMzIuLjhmMThlMzcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpAQCAtMTEyMSw3ICsxMTIxLDcgQEAKIAl9CiAKIAlzdHJfYXBwZW5kKGdzLCBzdHIpOwotCWlmIChzeW0pCisJaWYgKHN5bSAmJiBzeW0tPnR5cGUgIT0gU19VTktOT1dOKQogCQlzdHJfcHJpbnRmKGdzLCAiIFs9JXNdIiwgc3ltX3N0cik7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmggYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCmluZGV4IDg5MWNkOWMuLjZlZTJlNGYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtODMsNiArODMsNyBAQAogCXRyaXN0YXRlIHZpc2libGU7CiAJaW50IGZsYWdzOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwcl92YWx1ZSBkaXJfZGVwOwogCXN0cnVjdCBleHByX3ZhbHVlIHJldl9kZXA7CiB9OwogCkBAIC0xMzEsNiArMTMyLDcgQEAKIAlQX1NFTEVDVCwgICAvKiBzZWxlY3QgQkFSICovCiAJUF9SQU5HRSwgICAgLyogcmFuZ2UgNy4uMTAwIChmb3IgYSBzeW1ib2wpICovCiAJUF9FTlYsICAgICAgLyogdmFsdWUgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCVBfU1lNQk9MLCAgIC8qIHdoZXJlIGEgc3ltYm9sIGlzIGRlZmluZWQgKi8KIH07CiAKIHN0cnVjdCBwcm9wZXJ0eSB7CkBAIC0xNjMsNiArMTY1LDcgQEAKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07CiAJc3RydWN0IHByb3BlcnR5ICpwcm9tcHQ7CiAJc3RydWN0IGV4cHIgKmRlcDsKKwlzdHJ1Y3QgZXhwciAqZGlyX2RlcDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJY2hhciAqaGVscDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKaW5kZXggYmVmMTA0MS4uZDY2OTg4MiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTExMTQsNyArMTExNCw3IEBACiAKIAlyb3dbQ09MX09QVElPTl0gPQogCSAgICBnX3N0cmR1cF9wcmludGYoIiVzICVzIiwgXyhtZW51X2dldF9wcm9tcHQobWVudSkpLAotCQkJICAgIHN5bSAmJiBzeW1faGFzX3ZhbHVlKHN5bSkgPyAiKE5FVykiIDogIiIpOworCQkJICAgIHN5bSAmJiAhc3ltX2hhc192YWx1ZShzeW0pID8gIihORVcpIiA6ICIiKTsKIAogCWlmIChvcHRfbW9kZSA9PSBPUFRfQUxMICYmICFtZW51X2lzX3Zpc2libGUobWVudSkpCiAJCXJvd1tDT0xfQ09MT1JdID0gZ19zdHJkdXAoIkRhcmtHcmF5Iik7CkBAIC0xMzQzLDcgKzEzNDMsOCBAQAogI2VuZGlmCiAKIAkJaWYgKChvcHRfbW9kZSA9PSBPUFRfTk9STUFMICYmICFtZW51X2lzX3Zpc2libGUoY2hpbGQxKSkgfHwKLQkJICAgIChvcHRfbW9kZSA9PSBPUFRfUFJPTVBUICYmICFtZW51X2hhc19wcm9tcHQoY2hpbGQxKSkpIHsKKwkJICAgIChvcHRfbW9kZSA9PSBPUFRfUFJPTVBUICYmICFtZW51X2hhc19wcm9tcHQoY2hpbGQxKSkgfHwKKwkJICAgIChvcHRfbW9kZSA9PSBPUFRfQUxMICAgICYmICFtZW51X2dldF9wcm9tcHQoY2hpbGQxKSkpIHsKIAogCQkJLyogcmVtb3ZlIG5vZGUgKi8KIAkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpICE9IE5VTEwpIHsKQEAgLTE0MjUsNyArMTQyNiw3IEBACiAKIAkJaWYgKChvcHRfbW9kZSA9PSBPUFRfTk9STUFMICYmIG1lbnVfaXNfdmlzaWJsZShjaGlsZCkpIHx8CiAJCSAgICAob3B0X21vZGUgPT0gT1BUX1BST01QVCAmJiBtZW51X2hhc19wcm9tcHQoY2hpbGQpKSB8fAotCQkgICAgKG9wdF9tb2RlID09IE9QVF9BTEwpKQorCQkgICAgKG9wdF9tb2RlID09IE9QVF9BTEwgICAgJiYgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSkpCiAJCQlwbGFjZV9ub2RlKGNoaWxkLCBmaWxsX3JvdyhjaGlsZCkpOwogI2lmZGVmIERFQlVHCiAJCXByaW50ZigiJSpjJXM6ICIsIGluZGVudCwgJyAnLCBtZW51X2dldF9wcm9tcHQoY2hpbGQpKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaCBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaAppbmRleCBjZTY1NDljLi43NmRiMDY1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCkBAIC0xMjYsNiArMTI2LDggQEAKIHZvaWQgc3ltX2NsZWFyX2FsbF92YWxpZCh2b2lkKTsKIHZvaWQgc3ltX3NldF9hbGxfY2hhbmdlZCh2b2lkKTsKIHZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hvaWNlX2RlZmF1bHQoc3RydWN0IHN5bWJvbCAqc3ltKTsKK2NvbnN0IGNoYXIgKnN5bV9nZXRfc3RyaW5nX2RlZmF1bHQoc3RydWN0IHN5bWJvbCAqc3ltKTsKIHN0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiBzdHJ1Y3QgcHJvcGVydHkgKnByb3BfYWxsb2MoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKTsKIHN0cnVjdCBzeW1ib2wgKnByb3BfZ2V0X3N5bWJvbChzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCmluZGV4IDdjYWRjYWQuLjlhOTQ4YzkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKQEAgLTMsNiArMyw3IEBACiBQKGNvbmZfcGFyc2Usdm9pZCwoY29uc3QgY2hhciAqbmFtZSkpOwogUChjb25mX3JlYWQsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CiBQKGNvbmZfcmVhZF9zaW1wbGUsaW50LChjb25zdCBjaGFyICpuYW1lLCBpbnQpKTsKK1AoY29uZl93cml0ZV9kZWZjb25maWcsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CiBQKGNvbmZfd3JpdGUsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CiBQKGNvbmZfd3JpdGVfYXV0b2NvbmYsaW50LCh2b2lkKSk7CiBQKGNvbmZfZ2V0X2NoYW5nZWQsYm9vbCwodm9pZCkpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCmluZGV4IGJjYzZmMTkuLmEyZWI4MGYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYworKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2tsaXN0LmMKQEAgLTMxLDYgKzMxLDEwIEBACiBzdGF0aWMgdm9pZCBwcmludF9pdGVtKFdJTkRPVyAqIHdpbiwgaW50IGNob2ljZSwgaW50IHNlbGVjdGVkKQogewogCWludCBpOworCWNoYXIgKmxpc3RfaXRlbSA9IG1hbGxvYyhsaXN0X3dpZHRoICsgMSk7CisKKwlzdHJuY3B5KGxpc3RfaXRlbSwgaXRlbV9zdHIoKSwgbGlzdF93aWR0aCAtIGl0ZW1feCk7CisJbGlzdF9pdGVtW2xpc3Rfd2lkdGggLSBpdGVtX3hdID0gJ1wwJzsKIAogCS8qIENsZWFyICdyZXNpZHVlJyBvZiBsYXN0IGl0ZW0gKi8KIAl3YXR0cnNldCh3aW4sIGRsZy5tZW51Ym94LmF0cik7CkBAIC00NSwxMyArNDksMTQgQEAKIAkJd3ByaW50dyh3aW4sICIoJWMpIiwgaXRlbV9pc190YWcoJ1gnKSA/ICdYJyA6ICcgJyk7CiAKIAl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLnRhZ19zZWxlY3RlZC5hdHIgOiBkbGcudGFnLmF0cik7Ci0JbXZ3YWRkY2god2luLCBjaG9pY2UsIGl0ZW1feCwgaXRlbV9zdHIoKVswXSk7CisJbXZ3YWRkY2god2luLCBjaG9pY2UsIGl0ZW1feCwgbGlzdF9pdGVtWzBdKTsKIAl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gZGxnLml0ZW1fc2VsZWN0ZWQuYXRyIDogZGxnLml0ZW0uYXRyKTsKLQl3YWRkc3RyKHdpbiwgKGNoYXIgKilpdGVtX3N0cigpICsgMSk7CisJd2FkZHN0cih3aW4sIGxpc3RfaXRlbSArIDEpOwogCWlmIChzZWxlY3RlZCkgewogCQl3bW92ZSh3aW4sIGNob2ljZSwgY2hlY2tfeCArIDEpOwogCQl3cmVmcmVzaCh3aW4pOwogCX0KKwlmcmVlKGxpc3RfaXRlbSk7CiB9CiAKIC8qCkBAIC0xNzUsNiArMTgwLDcgQEAKIAljaGVja194ID0gMDsKIAlpdGVtX2ZvcmVhY2goKQogCQljaGVja194ID0gTUFYKGNoZWNrX3gsIHN0cmxlbihpdGVtX3N0cigpKSArIDQpOworCWNoZWNrX3ggPSBNSU4oY2hlY2tfeCwgbGlzdF93aWR0aCk7CiAKIAljaGVja194ID0gKGxpc3Rfd2lkdGggLSBjaGVja194KSAvIDI7CiAJaXRlbV94ID0gY2hlY2tfeCArIDQ7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCmluZGV4IDJjODNkMzIuLmQyZjZlMDUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCkBAIC03NCw3ICs3NCw3IEBACiAiXG4iCiAiICAgU2hvcnRjdXQ6IFByZXNzIDxIPiBvciA8Pz4uXG4iCiAiXG4iCi0ibyAgVG8gc2hvdyBoaWRkZW4gb3B0aW9ucywgcHJlc3MgPFo+LlxuIgorIm8gIFRvIHRvZ2dsZSB0aGUgZGlzcGxheSBvZiBoaWRkZW4gb3B0aW9ucywgcHJlc3MgPFo+LlxuIgogIlxuIgogIlxuIgogIlJhZGlvbGlzdHMgIChDaG9pY2UgbGlzdHMpXG4iCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwppbmRleCAyMDM2MzJjLi40ZmI1OTAyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWVudS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKQEAgLTU4LDYgKzU4LDggQEAKIAkqbGFzdF9lbnRyeV9wdHIgPSBtZW51OwogCWxhc3RfZW50cnlfcHRyID0gJm1lbnUtPm5leHQ7CiAJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJaWYgKHN5bSkKKwkJbWVudV9hZGRfc3ltYm9sKFBfU1lNQk9MLCBzeW0sIE5VTEwpOwogfQogCiB2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpCkBAIC0xMDUsNiArMTA3LDcgQEAKIHZvaWQgbWVudV9hZGRfZGVwKHN0cnVjdCBleHByICpkZXApCiB7CiAJY3VycmVudF9lbnRyeS0+ZGVwID0gZXhwcl9hbGxvY19hbmQoY3VycmVudF9lbnRyeS0+ZGVwLCBtZW51X2NoZWNrX2RlcChkZXApKTsKKwljdXJyZW50X2VudHJ5LT5kaXJfZGVwID0gY3VycmVudF9lbnRyeS0+ZGVwOwogfQogCiB2b2lkIG1lbnVfc2V0X3R5cGUoaW50IHR5cGUpCkBAIC0yODgsNiArMjkxLDEwIEBACiAJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpCiAJCQltZW51X2ZpbmFsaXplKG1lbnUpOwogCX0gZWxzZSBpZiAoc3ltKSB7CisJCS8qIGlnbm9yZSBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIGZvciBkaXJfZGVwICovCisJCXN5bS0+ZGlyX2RlcC5leHByID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9jb3B5KHBhcmVudC0+ZGlyX2RlcCkpOworCQlzeW0tPmRpcl9kZXAuZXhwciA9IGV4cHJfZWxpbWluYXRlX2R1cHMoc3ltLT5kaXJfZGVwLmV4cHIpOworCiAJCWJhc2VkZXAgPSBwYXJlbnQtPnByb21wdCA/IHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHIgOiBOVUxMOwogCQliYXNlZGVwID0gZXhwcl90cmFuc19jb21wYXJlKGJhc2VkZXAsIEVfVU5FUVVBTCwgJnN5bWJvbF9ubyk7CiAJCWJhc2VkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGV4cHJfdHJhbnNmb3JtKGJhc2VkZXApKTsKQEAgLTQxOSw5ICs0MjYsMTMgQEAKIAlpZiAoIXN5bSB8fCBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKG1lbnUtPnN5bSkgPT0gbm8pCiAJCXJldHVybiBmYWxzZTsKIAotCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKLQkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpKSB7CisJCQlpZiAoc3ltKQorCQkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0RFRl9VU0VSOwogCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC01MDEsOSArNTEyLDE5IEBACiAJYm9vbCBoaXQ7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCi0JaWYgKHN5bSAmJiBzeW0tPm5hbWUpCisJaWYgKHN5bSAmJiBzeW0tPm5hbWUpIHsKIAkJc3RyX3ByaW50ZihyLCAiU3ltYm9sOiAlcyBbPSVzXVxuIiwgc3ltLT5uYW1lLAogCQkJICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJCXN0cl9wcmludGYociwgIlR5cGUgIDogJXNcbiIsIHN5bV90eXBlX25hbWUoc3ltLT50eXBlKSk7CisJCWlmIChzeW0tPnR5cGUgPT0gU19JTlQgfHwgc3ltLT50eXBlID09IFNfSEVYKSB7CisJCQlwcm9wID0gc3ltX2dldF9yYW5nZV9wcm9wKHN5bSk7CisJCQlpZiAocHJvcCkgeworCQkJCXN0cl9wcmludGYociwgIlJhbmdlIDogIik7CisJCQkJZXhwcl9nc3RyX3ByaW50KHByb3AtPmV4cHIsIHIpOworCQkJCXN0cl9hcHBlbmQociwgIlxuIik7CisJCQl9CisJCX0KKwl9CiAJZm9yX2FsbF9wcm9tcHRzKHN5bSwgcHJvcCkKIAkJZ2V0X3Byb21wdF9zdHIociwgcHJvcCk7CiAJaGl0ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKaW5kZXggMDBjNTE1MC4uODIwZGYyZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpAQCAtNTgsMTEgKzU4LDEwIEBACiB7CiAJUVZhbHVlTGlzdDxpbnQ+IHJlc3VsdDsKIAlRU3RyaW5nTGlzdCBlbnRyeUxpc3QgPSByZWFkTGlzdEVudHJ5KGtleSwgb2spOwotCWlmIChvaykgewotCQlRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQ7Ci0JCWZvciAoaXQgPSBlbnRyeUxpc3QuYmVnaW4oKTsgaXQgIT0gZW50cnlMaXN0LmVuZCgpOyArK2l0KQotCQkJcmVzdWx0LnB1c2hfYmFjaygoKml0KS50b0ludCgpKTsKLQl9CisJUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0OworCisJZm9yIChpdCA9IGVudHJ5TGlzdC5iZWdpbigpOyBpdCAhPSBlbnRyeUxpc3QuZW5kKCk7ICsraXQpCisJCXJlc3VsdC5wdXNoX2JhY2soKCppdCkudG9JbnQoKSk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTQ5LDcgKzE0OCw3IEBACiAJY2FzZSBTX1RSSVNUQVRFOgogCQljaGFyIGNoOwogCi0JCWlmICghc3ltX2lzX2NoYW5nYWJsZShzeW0pICYmICFsaXN0LT5zaG93QWxsKSB7CisJCWlmICghc3ltX2lzX2NoYW5nYWJsZShzeW0pICYmIGxpc3QtPm9wdE1vZGUgPT0gbm9ybWFsT3B0KSB7CiAJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCAwKTsKIAkJCXNldFRleHQobm9Db2xJZHgsIFFTdHJpbmc6Om51bGwpOwogCQkJc2V0VGV4dChtb2RDb2xJZHgsIFFTdHJpbmc6Om51bGwpOwpAQCAtMzIwLDcgKzMxOSw3IEBACiAJICBzeW1ib2xZZXNQaXgoeHBtX3N5bWJvbF95ZXMpLCBzeW1ib2xNb2RQaXgoeHBtX3N5bWJvbF9tb2QpLCBzeW1ib2xOb1BpeCh4cG1fc3ltYm9sX25vKSwKIAkgIGNob2ljZVllc1BpeCh4cG1fY2hvaWNlX3llcyksIGNob2ljZU5vUGl4KHhwbV9jaG9pY2Vfbm8pLAogCSAgbWVudVBpeCh4cG1fbWVudSksIG1lbnVJbnZQaXgoeHBtX21lbnVfaW52KSwgbWVudUJhY2tQaXgoeHBtX21lbnViYWNrKSwgdm9pZFBpeCh4cG1fdm9pZCksCi0JICBzaG93QWxsKGZhbHNlKSwgc2hvd05hbWUoZmFsc2UpLCBzaG93UmFuZ2UoZmFsc2UpLCBzaG93RGF0YShmYWxzZSksCisJICBzaG93TmFtZShmYWxzZSksIHNob3dSYW5nZShmYWxzZSksIHNob3dEYXRhKGZhbHNlKSwgb3B0TW9kZShub3JtYWxPcHQpLAogCSAgcm9vdEVudHJ5KDApLCBoZWFkZXJQb3B1cCgwKQogewogCWludCBpOwpAQCAtMzM3LDEwICszMzYsMTAgQEAKIAogCWlmIChuYW1lKSB7CiAJCWNvbmZpZ1NldHRpbmdzLT5iZWdpbkdyb3VwKG5hbWUpOwotCQlzaG93QWxsID0gY29uZmlnU2V0dGluZ3MtPnJlYWRCb29sRW50cnkoIi9zaG93QWxsIiwgZmFsc2UpOwogCQlzaG93TmFtZSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIvc2hvd05hbWUiLCBmYWxzZSk7CiAJCXNob3dSYW5nZSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIvc2hvd1JhbmdlIiwgZmFsc2UpOwogCQlzaG93RGF0YSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIvc2hvd0RhdGEiLCBmYWxzZSk7CisJCW9wdE1vZGUgPSAoZW51bSBvcHRpb25Nb2RlKWNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9vcHRpb25Nb2RlIiwgZmFsc2UpOwogCQljb25maWdTZXR0aW5ncy0+ZW5kR3JvdXAoKTsKIAkJY29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOwogCX0KQEAgLTM1Miw2ICszNTEsMTcgQEAKIAlyZWluaXQoKTsKIH0KIAorYm9vbCBDb25maWdMaXN0OjptZW51U2tpcChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlpZiAob3B0TW9kZSA9PSBub3JtYWxPcHQgJiYgbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKG9wdE1vZGUgPT0gcHJvbXB0T3B0ICYmIG1lbnVfaGFzX3Byb21wdChtZW51KSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChvcHRNb2RlID09IGFsbE9wdCkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCiB2b2lkIENvbmZpZ0xpc3Q6OnJlaW5pdCh2b2lkKQogewogCXJlbW92ZUNvbHVtbihkYXRhQ29sSWR4KTsKQEAgLTM4MCw3ICszOTAsNyBAQAogCQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL3Nob3dOYW1lIiwgc2hvd05hbWUpOwogCQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL3Nob3dSYW5nZSIsIHNob3dSYW5nZSk7CiAJCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvc2hvd0RhdGEiLCBzaG93RGF0YSk7Ci0JCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIvc2hvd0FsbCIsIHNob3dBbGwpOworCQljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL29wdGlvbk1vZGUiLCAoaW50KW9wdE1vZGUpOwogCQljb25maWdTZXR0aW5ncy0+ZW5kR3JvdXAoKTsKIAl9CiB9CkBAIC02MDYsNyArNjE2LDcgQEAKIAkJfQogCiAJCXZpc2libGUgPSBtZW51X2lzX3Zpc2libGUoY2hpbGQpOwotCQlpZiAoc2hvd0FsbCB8fCB2aXNpYmxlKSB7CisJCWlmICghbWVudVNraXAoY2hpbGQpKSB7CiAJCQlpZiAoIWNoaWxkLT5zeW0gJiYgIWNoaWxkLT5saXN0ICYmICFjaGlsZC0+cHJvbXB0KQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFpdGVtIHx8IGl0ZW0tPm1lbnUgIT0gY2hpbGQpCkBAIC04MzUsNyArODQ1LDEwIEBACiAJCWUtPmlnbm9yZSgpOwogfQogCi1Db25maWdWaWV3KiBDb25maWdWaWV3Ojp2aWV3TGlzdDsKK0NvbmZpZ1ZpZXcqQ29uZmlnVmlldzo6dmlld0xpc3Q7CitRQWN0aW9uICpDb25maWdWaWV3OjpzaG93Tm9ybWFsQWN0aW9uOworUUFjdGlvbiAqQ29uZmlnVmlldzo6c2hvd0FsbEFjdGlvbjsKK1FBY3Rpb24gKkNvbmZpZ1ZpZXc6OnNob3dQcm9tcHRBY3Rpb247CiAKIENvbmZpZ1ZpZXc6OkNvbmZpZ1ZpZXcoUVdpZGdldCogcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQogCTogUGFyZW50KHBhcmVudCwgbmFtZSkKQEAgLTg2MCwxMyArODczLDE2IEBACiAJfQogfQogCi12b2lkIENvbmZpZ1ZpZXc6OnNldFNob3dBbGwoYm9vbCBiKQordm9pZCBDb25maWdWaWV3OjpzZXRPcHRpb25Nb2RlKFFBY3Rpb24gKmFjdCkKIHsKLQlpZiAobGlzdC0+c2hvd0FsbCAhPSBiKSB7Ci0JCWxpc3QtPnNob3dBbGwgPSBiOwotCQlsaXN0LT51cGRhdGVMaXN0QWxsKCk7Ci0JCWVtaXQgc2hvd0FsbENoYW5nZWQoYik7Ci0JfQorCWlmIChhY3QgPT0gc2hvd05vcm1hbEFjdGlvbikKKwkJbGlzdC0+b3B0TW9kZSA9IG5vcm1hbE9wdDsKKwllbHNlIGlmIChhY3QgPT0gc2hvd0FsbEFjdGlvbikKKwkJbGlzdC0+b3B0TW9kZSA9IGFsbE9wdDsKKwllbHNlCisJCWxpc3QtPm9wdE1vZGUgPSBwcm9tcHRPcHQ7CisKKwlsaXN0LT51cGRhdGVMaXN0QWxsKCk7CiB9CiAKIHZvaWQgQ29uZmlnVmlldzo6c2V0U2hvd05hbWUoYm9vbCBiKQpAQCAtOTY0LDM0ICs5ODAsNiBAQAogCQltZW51SW5mbygpOwogfQogCi12b2lkIENvbmZpZ0luZm9WaWV3OjpzZXRTb3VyY2UoY29uc3QgUVN0cmluZyYgbmFtZSkKLXsKLQljb25zdCBjaGFyICpwID0gbmFtZS5sYXRpbjEoKTsKLQotCW1lbnUgPSBOVUxMOwotCXN5bSA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHBbMF0pIHsKLQljYXNlICdtJzoKLQkJc3RydWN0IG1lbnUgKm07Ci0KLQkJaWYgKHNzY2FuZihwLCAibSVwIiwgJm0pID09IDEgJiYgbWVudSAhPSBtKSB7Ci0JCQltZW51ID0gbTsKLQkJCW1lbnVJbmZvKCk7Ci0JCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKLQkJfQotCQlicmVhazsKLQljYXNlICdzJzoKLQkJc3RydWN0IHN5bWJvbCAqczsKLQotCQlpZiAoc3NjYW5mKHAsICJzJXAiLCAmcykgPT0gMSAmJiBzeW0gIT0gcykgewotCQkJc3ltID0gczsKLQkJCXN5bWJvbEluZm8oKTsKLQkJfQotCQlicmVhazsKLQl9Ci19Ci0KIHZvaWQgQ29uZmlnSW5mb1ZpZXc6OnN5bWJvbEluZm8odm9pZCkKIHsKIAlRU3RyaW5nIHN0cjsKQEAgLTEzNDksMTEgKzEzMzcsMjQgQEAKIAkgIGNvbm5lY3Qoc2hvd0RhdGFBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgY29uZmlnVmlldywgU0xPVChzZXRTaG93RGF0YShib29sKSkpOwogCSAgY29ubmVjdChjb25maWdWaWV3LCBTSUdOQUwoc2hvd0RhdGFDaGFuZ2VkKGJvb2wpKSwgc2hvd0RhdGFBY3Rpb24sIFNMT1Qoc2V0T24oYm9vbCkpKTsKIAkgIHNob3dEYXRhQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93RGF0YSk7Ci0JUUFjdGlvbiAqc2hvd0FsbEFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsIF8oIlNob3cgQWxsIE9wdGlvbnMiKSwgMCwgdGhpcyk7Ci0JICBzaG93QWxsQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7Ci0JICBjb25uZWN0KHNob3dBbGxBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgY29uZmlnVmlldywgU0xPVChzZXRTaG93QWxsKGJvb2wpKSk7Ci0JICBjb25uZWN0KHNob3dBbGxBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgbWVudVZpZXcsIFNMT1Qoc2V0U2hvd0FsbChib29sKSkpOwotCSAgc2hvd0FsbEFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd0FsbCk7CisKKwlRQWN0aW9uR3JvdXAgKm9wdEdyb3VwID0gbmV3IFFBY3Rpb25Hcm91cCh0aGlzKTsKKwlvcHRHcm91cC0+c2V0RXhjbHVzaXZlKFRSVUUpOworCWNvbm5lY3Qob3B0R3JvdXAsIFNJR05BTChzZWxlY3RlZChRQWN0aW9uICopKSwgY29uZmlnVmlldywKKwkJU0xPVChzZXRPcHRpb25Nb2RlKFFBY3Rpb24gKikpKTsKKwljb25uZWN0KG9wdEdyb3VwLCBTSUdOQUwoc2VsZWN0ZWQoUUFjdGlvbiAqKSksIG1lbnVWaWV3LAorCQlTTE9UKHNldE9wdGlvbk1vZGUoUUFjdGlvbiAqKSkpOworCisJY29uZmlnVmlldy0+c2hvd05vcm1hbEFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsIF8oIlNob3cgTm9ybWFsIE9wdGlvbnMiKSwgMCwgb3B0R3JvdXApOworCWNvbmZpZ1ZpZXctPnNob3dBbGxBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCBfKCJTaG93IEFsbCBPcHRpb25zIiksIDAsIG9wdEdyb3VwKTsKKwljb25maWdWaWV3LT5zaG93UHJvbXB0QWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgXygiU2hvdyBQcm9tcHQgT3B0aW9ucyIpLCAwLCBvcHRHcm91cCk7CisJY29uZmlnVmlldy0+c2hvd05vcm1hbEFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCWNvbmZpZ1ZpZXctPnNob3dOb3JtYWxBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPm9wdE1vZGUgPT0gbm9ybWFsT3B0KTsKKwljb25maWdWaWV3LT5zaG93QWxsQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJY29uZmlnVmlldy0+c2hvd0FsbEFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+b3B0TW9kZSA9PSBhbGxPcHQpOworCWNvbmZpZ1ZpZXctPnNob3dQcm9tcHRBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwljb25maWdWaWV3LT5zaG93UHJvbXB0QWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5vcHRNb2RlID09IHByb21wdE9wdCk7CisKIAlRQWN0aW9uICpzaG93RGVidWdBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCBfKCJTaG93IERlYnVnIEluZm8iKSwgMCwgdGhpcyk7CiAJICBzaG93RGVidWdBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKIAkgIGNvbm5lY3Qoc2hvd0RlYnVnQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIGhlbHBUZXh0LCBTTE9UKHNldFNob3dEZWJ1Zyhib29sKSkpOwpAQCAtMTM5Niw3ICsxMzk3LDggQEAKIAlzaG93UmFuZ2VBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOwogCXNob3dEYXRhQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKIAlvcHRpb25NZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKLQlzaG93QWxsQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlvcHRHcm91cC0+YWRkVG8ob3B0aW9uTWVudSk7CisJb3B0aW9uTWVudS0+aW5zZXJ0U2VwYXJhdG9yKCk7CiAJc2hvd0RlYnVnQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKIAogCS8vIGNyZWF0ZSBoZWxwIG1lbnUKQEAgLTE0OTEsNyArMTQ5Myw3IEBACiAJQ29uZmlnTGlzdCogbGlzdCA9IE5VTEw7CiAJQ29uZmlnSXRlbSogaXRlbTsKIAotCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpICYmICFjb25maWdWaWV3LT5zaG93QWxsKCkpCisJaWYgKGNvbmZpZ0xpc3QtPm1lbnVTa2lwKG1lbnUpKQogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKGNvbmZpZ0xpc3QtPm1vZGUpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKaW5kZXggYjNiNTY1Ny4uNjM2YTc0YiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKQEAgLTQ0LDYgKzQ0LDkgQEAKIGVudW0gbGlzdE1vZGUgewogCXNpbmdsZU1vZGUsIG1lbnVNb2RlLCBzeW1ib2xNb2RlLCBmdWxsTW9kZSwgbGlzdE1vZGUKIH07CitlbnVtIG9wdGlvbk1vZGUgeworCW5vcm1hbE9wdCA9IDAsIGFsbE9wdCwgcHJvbXB0T3B0Cit9OwogCiBjbGFzcyBDb25maWdMaXN0IDogcHVibGljIFFMaXN0VmlldyB7CiAJUV9PQkpFQ1QKQEAgLTExNSw2ICsxMTgsOCBAQAogCXZvaWQgc2V0QWxsT3Blbihib29sIG9wZW4pOwogCXZvaWQgc2V0UGFyZW50TWVudSh2b2lkKTsKIAorCWJvb2wgbWVudVNraXAoc3RydWN0IG1lbnUgKik7CisKIAl0ZW1wbGF0ZSA8Y2xhc3MgUD4KIAl2b2lkIHVwZGF0ZU1lbnVMaXN0KFAqLCBzdHJ1Y3QgbWVudSopOwogCkBAIC0xMjQsOCArMTI5LDkgQEAKIAlRUGl4bWFwIGNob2ljZVllc1BpeCwgY2hvaWNlTm9QaXg7CiAJUVBpeG1hcCBtZW51UGl4LCBtZW51SW52UGl4LCBtZW51QmFja1BpeCwgdm9pZFBpeDsKIAotCWJvb2wgc2hvd0FsbCwgc2hvd05hbWUsIHNob3dSYW5nZSwgc2hvd0RhdGE7CisJYm9vbCBzaG93TmFtZSwgc2hvd1JhbmdlLCBzaG93RGF0YTsKIAllbnVtIGxpc3RNb2RlIG1vZGU7CisJZW51bSBvcHRpb25Nb2RlIG9wdE1vZGU7CiAJc3RydWN0IG1lbnUgKnJvb3RFbnRyeTsKIAlRQ29sb3JHcm91cCBkaXNhYmxlZENvbG9yR3JvdXA7CiAJUUNvbG9yR3JvdXAgaW5hY3RpdmVkQ29sb3JHcm91cDsKQEAgLTIyMiwxNyArMjI4LDE1IEBACiAJc3RhdGljIHZvaWQgdXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKTsKIAlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0QWxsKHZvaWQpOwogCi0JYm9vbCBzaG93QWxsKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGxpc3QtPnNob3dBbGw7IH0KIAlib29sIHNob3dOYW1lKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGxpc3QtPnNob3dOYW1lOyB9CiAJYm9vbCBzaG93UmFuZ2Uodm9pZCkgY29uc3QgeyByZXR1cm4gbGlzdC0+c2hvd1JhbmdlOyB9CiAJYm9vbCBzaG93RGF0YSh2b2lkKSBjb25zdCB7IHJldHVybiBsaXN0LT5zaG93RGF0YTsgfQogcHVibGljIHNsb3RzOgotCXZvaWQgc2V0U2hvd0FsbChib29sKTsKIAl2b2lkIHNldFNob3dOYW1lKGJvb2wpOwogCXZvaWQgc2V0U2hvd1JhbmdlKGJvb2wpOwogCXZvaWQgc2V0U2hvd0RhdGEoYm9vbCk7CisJdm9pZCBzZXRPcHRpb25Nb2RlKFFBY3Rpb24gKik7CiBzaWduYWxzOgotCXZvaWQgc2hvd0FsbENoYW5nZWQoYm9vbCk7CiAJdm9pZCBzaG93TmFtZUNoYW5nZWQoYm9vbCk7CiAJdm9pZCBzaG93UmFuZ2VDaGFuZ2VkKGJvb2wpOwogCXZvaWQgc2hvd0RhdGFDaGFuZ2VkKGJvb2wpOwpAQCAtMjQyLDYgKzI0NiwxMCBAQAogCiAJc3RhdGljIENvbmZpZ1ZpZXcqIHZpZXdMaXN0OwogCUNvbmZpZ1ZpZXcqIG5leHRWaWV3OworCisJc3RhdGljIFFBY3Rpb24gKnNob3dOb3JtYWxBY3Rpb247CisJc3RhdGljIFFBY3Rpb24gKnNob3dBbGxBY3Rpb247CisJc3RhdGljIFFBY3Rpb24gKnNob3dQcm9tcHRBY3Rpb247CiB9OwogCiBjbGFzcyBDb25maWdJbmZvVmlldyA6IHB1YmxpYyBRVGV4dEJyb3dzZXIgewpAQCAtMjU0LDcgKzI2Miw2IEBACiBwdWJsaWMgc2xvdHM6CiAJdm9pZCBzZXRJbmZvKHN0cnVjdCBtZW51ICptZW51KTsKIAl2b2lkIHNhdmVTZXR0aW5ncyh2b2lkKTsKLQl2b2lkIHNldFNvdXJjZShjb25zdCBRU3RyaW5nJiBuYW1lKTsKIAl2b2lkIHNldFNob3dEZWJ1Zyhib29sKTsKIAogc2lnbmFsczoKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwppbmRleCAyZTdhMDQ4Li5lOTU3MThmZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMjA1LDYgKzIwNSwxNiBAQAogCX0KIAlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKQogCQlyZXR1cm47CisJLyogZGVmYXVsdGluZyB0byAieWVzIiBpZiBubyBleHBsaWNpdCAiZGVwZW5kcyBvbiIgYXJlIGdpdmVuICovCisJdHJpID0geWVzOworCWlmIChzeW0tPmRpcl9kZXAuZXhwcikKKwkJdHJpID0gZXhwcl9jYWxjX3ZhbHVlKHN5bS0+ZGlyX2RlcC5leHByKTsKKwlpZiAodHJpID09IG1vZCkKKwkJdHJpID0geWVzOworCWlmIChzeW0tPmRpcl9kZXAudHJpICE9IHRyaSkgeworCQlzeW0tPmRpcl9kZXAudHJpID0gdHJpOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CiAJdHJpID0gbm87CiAJaWYgKHN5bS0+cmV2X2RlcC5leHByKQogCQl0cmkgPSBleHByX2NhbGNfdmFsdWUoc3ltLT5yZXZfZGVwLmV4cHIpOwpAQCAtMjE2LDQ0ICsyMjYsNjMgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1fY2FsY19jaG9pY2Uoc3RydWN0IHN5bWJvbCAqc3ltKQorLyoKKyAqIEZpbmQgdGhlIGRlZmF1bHQgc3ltYm9sIGZvciBhIGNob2ljZS4KKyAqIEZpcnN0IHRyeSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBjaG9pY2Ugc3ltYm9sCisgKiBOZXh0IGxvY2F0ZSB0aGUgZmlyc3QgdmlzaWJsZSBjaG9pY2UgdmFsdWUKKyAqIFJldHVybiBOVUxMIGlmIG5vbmUgd2FzIGZvdW5kCisgKi8KK3N0cnVjdCBzeW1ib2wgKnN5bV9jaG9pY2VfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJc3RydWN0IHN5bWJvbCAqZGVmX3N5bTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IGV4cHIgKmU7CiAKLQkvKiBpcyB0aGUgdXNlciBjaG9pY2UgdmlzaWJsZT8gKi8KLQlkZWZfc3ltID0gc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsOwotCWlmIChkZWZfc3ltKSB7Ci0JCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7Ci0JCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQotCQkJcmV0dXJuIGRlZl9zeW07Ci0JfQotCiAJLyogYW55IG9mIHRoZSBkZWZhdWx0cyB2aXNpYmxlPyAqLwogCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CiAJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CiAJCWlmIChwcm9wLT52aXNpYmxlLnRyaSA9PSBubykKIAkJCWNvbnRpbnVlOwogCQlkZWZfc3ltID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOwotCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOwogCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKIAkJCXJldHVybiBkZWZfc3ltOwogCX0KIAogCS8qIGp1c3QgZ2V0IHRoZSBmaXJzdCB2aXNpYmxlIHZhbHVlICovCiAJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKLQlleHByX2xpc3RfZm9yX2VhY2hfc3ltKHByb3AtPmV4cHIsIGUsIGRlZl9zeW0pIHsKLQkJc3ltX2NhbGNfdmlzaWJpbGl0eShkZWZfc3ltKTsKKwlleHByX2xpc3RfZm9yX2VhY2hfc3ltKHByb3AtPmV4cHIsIGUsIGRlZl9zeW0pCiAJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQogCQkJcmV0dXJuIGRlZl9zeW07Ci0JfQogCi0JLyogbm8gY2hvaWNlPyByZXNldCB0cmlzdGF0ZSB2YWx1ZSAqLwotCXN5bS0+Y3Vyci50cmkgPSBubzsKKwkvKiBmYWlsZWQgdG8gbG9jYXRlIGFueSBkZWZhdWx0cyAqLwogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltX2NhbGNfY2hvaWNlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpkZWZfc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZTsKKworCS8qIGZpcnN0IGNhbGN1bGF0ZSBhbGwgY2hvaWNlIHZhbHVlcycgdmlzaWJpbGl0aWVzICovCisJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwlleHByX2xpc3RfZm9yX2VhY2hfc3ltKHByb3AtPmV4cHIsIGUsIGRlZl9zeW0pCisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisKKwkvKiBpcyB0aGUgdXNlciBjaG9pY2UgdmlzaWJsZT8gKi8KKwlkZWZfc3ltID0gc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsOworCWlmIChkZWZfc3ltICYmIGRlZl9zeW0tPnZpc2libGUgIT0gbm8pCisJCXJldHVybiBkZWZfc3ltOworCisJZGVmX3N5bSA9IHN5bV9jaG9pY2VfZGVmYXVsdChzeW0pOworCisJaWYgKGRlZl9zeW0gPT0gTlVMTCkKKwkJLyogbm8gY2hvaWNlPyByZXNldCB0cmlzdGF0ZSB2YWx1ZSAqLworCQlzeW0tPmN1cnIudHJpID0gbm87CisKKwlyZXR1cm4gZGVmX3N5bTsKK30KKwogdm9pZCBzeW1fY2FsY192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJc3RydWN0IHN5bWJvbF92YWx1ZSBuZXd2YWwsIG9sZHZhbDsKQEAgLTMyMSw2ICszNTAsMTQgQEAKIAkJCQl9CiAJCQl9CiAJCWNhbGNfbmV3dmFsOgorCQkJaWYgKHN5bS0+ZGlyX2RlcC50cmkgPT0gbm8gJiYgc3ltLT5yZXZfZGVwLnRyaSAhPSBubykgeworCQkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogKCIpOworCQkJCWV4cHJfZnByaW50KHN5bS0+cmV2X2RlcC5leHByLCBzdGRlcnIpOworCQkJCWZwcmludGYoc3RkZXJyLCAiKSBzZWxlY3RzICVzIHdoaWNoIGhhcyB1bm1ldCBkaXJlY3QgZGVwZW5kZW5jaWVzICgiLAorCQkJCQlzeW0tPm5hbWUpOworCQkJCWV4cHJfZnByaW50KHN5bS0+ZGlyX2RlcC5leHByLCBzdGRlcnIpOworCQkJCWZwcmludGYoc3RkZXJyLCAiKVxuIik7CisJCQl9CiAJCQluZXd2YWwudHJpID0gRVhQUl9PUihuZXd2YWwudHJpLCBzeW0tPnJldl9kZXAudHJpKTsKIAkJfQogCQlpZiAobmV3dmFsLnRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQpAQCAtMzY1LDEyICs0MDIsMTMgQEAKIAogCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKIAkJc3RydWN0IHN5bWJvbCAqY2hvaWNlX3N5bTsKLQkJaW50IGZsYWdzID0gc3ltLT5mbGFncyAmIChTWU1CT0xfQ0hBTkdFRCB8IFNZTUJPTF9XUklURSk7CiAKIAkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKIAkJZXhwcl9saXN0X2Zvcl9lYWNoX3N5bShwcm9wLT5leHByLCBlLCBjaG9pY2Vfc3ltKSB7Ci0JCQljaG9pY2Vfc3ltLT5mbGFncyB8PSBmbGFnczsKLQkJCWlmIChmbGFncyAmIFNZTUJPTF9DSEFOR0VEKQorCQkJaWYgKChzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSAmJgorCQkJICAgIGNob2ljZV9zeW0tPnZpc2libGUgIT0gbm8pCisJCQkJY2hvaWNlX3N5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dSSVRFOworCQkJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkKIAkJCQlzeW1fc2V0X2NoYW5nZWQoY2hvaWNlX3N5bSk7CiAJCX0KIAl9CkBAIC02MjMsNiArNjYxLDgwIEBACiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qCisgKiBGaW5kIHRoZSBkZWZhdWx0IHZhbHVlIGFzc29jaWF0ZWQgdG8gYSBzeW1ib2wuCisgKiBGb3IgdHJpc3RhdGUgc3ltYm9sIGhhbmRsZSB0aGUgbW9kdWxlcz1uIGNhc2UKKyAqIGluIHdoaWNoIGNhc2UgIm0iIGJlY29tZXMgInkiLgorICogSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCBoYXZlIGFueSBkZWZhdWx0IHRoZW4gZmFsbGJhY2sKKyAqIHRvIHRoZSBmaXhlZCBkZWZhdWx0IHZhbHVlcy4KKyAqLworY29uc3QgY2hhciAqc3ltX2dldF9zdHJpbmdfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKmRzOworCWNvbnN0IGNoYXIgKnN0cjsKKwl0cmlzdGF0ZSB2YWw7CisKKwlzeW1fY2FsY192aXNpYmlsaXR5KHN5bSk7CisJc3ltX2NhbGNfdmFsdWUobW9kdWxlc19zeW0pOworCXZhbCA9IHN5bWJvbF9uby5jdXJyLnRyaTsKKwlzdHIgPSBzeW1ib2xfZW1wdHkuY3Vyci52YWw7CisKKwkvKiBJZiBzeW1ib2wgaGFzIGEgZGVmYXVsdCB2YWx1ZSBsb29rIGl0IHVwICovCisJcHJvcCA9IHN5bV9nZXRfZGVmYXVsdF9wcm9wKHN5bSk7CisJaWYgKHByb3AgIT0gTlVMTCkgeworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfQk9PTEVBTjoKKwkJY2FzZSBTX1RSSVNUQVRFOgorCQkJLyogVGhlIHZpc2liaWxpdHkgaW1heSBsaW1pdCB0aGUgdmFsdWUgZnJvbSB5ZXMgPT4gbW9kICovCisJCQl2YWwgPSBFWFBSX0FORChleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwciksIHByb3AtPnZpc2libGUudHJpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIFRoZSBmb2xsb3dpbmcgZmFpbHMgdG8gaGFuZGxlIHRoZSBzaXR1YXRpb24KKwkJCSAqIHdoZXJlIGEgZGVmYXVsdCB2YWx1ZSBpcyBmdXJ0aGVyIGxpbWl0ZWQgYnkKKwkJCSAqIHRoZSB2YWxpZCByYW5nZS4KKwkJCSAqLworCQkJZHMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoZHMgIT0gTlVMTCkgeworCQkJCXN5bV9jYWxjX3ZhbHVlKGRzKTsKKwkJCQlzdHIgPSAoY29uc3QgY2hhciAqKWRzLT5jdXJyLnZhbDsKKwkJCX0KKwkJfQorCX0KKworCS8qIEhhbmRsZSBzZWxlY3Qgc3RhdGVtZW50cyAqLworCXZhbCA9IEVYUFJfT1IodmFsLCBzeW0tPnJldl9kZXAudHJpKTsKKworCS8qIHRyYW5zcG9zZSBtb2QgdG8geWVzIGlmIG1vZHVsZXMgYXJlIG5vdCBlbmFibGVkICovCisJaWYgKHZhbCA9PSBtb2QpCisJCWlmICghc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIG1vZHVsZXNfc3ltLT5jdXJyLnRyaSA9PSBubykKKwkJCXZhbCA9IHllczsKKworCS8qIHRyYW5zcG9zZSBtb2QgdG8geWVzIGlmIHR5cGUgaXMgYm9vbCAqLworCWlmIChzeW0tPnR5cGUgPT0gU19CT09MRUFOICYmIHZhbCA9PSBtb2QpCisJCXZhbCA9IHllczsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIG5vOiByZXR1cm4gIm4iOworCQljYXNlIG1vZDogcmV0dXJuICJtIjsKKwkJY2FzZSB5ZXM6IHJldHVybiAieSI7CisJCX0KKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJCXJldHVybiBzdHI7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuIHN0cjsKKwljYXNlIFNfT1RIRVI6CisJY2FzZSBTX1VOS05PV046CisJCWJyZWFrOworCX0KKwlyZXR1cm4gIiI7Cit9CisKIGNvbnN0IGNoYXIgKnN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKIAl0cmlzdGF0ZSB2YWw7CkBAIC03NjUsNiArODc3LDExMCBAQAogCXJldHVybiBzeW1fYXJyOwogfQogCisvKgorICogV2hlbiB3ZSBjaGVjayBmb3IgcmVjdXJzaXZlIGRlcGVuZGVuY2llcyB3ZSB1c2UgYSBzdGFjayB0byBzYXZlCisgKiBjdXJyZW50IHN0YXRlIHNvIHdlIGNhbiBwcmludCBvdXQgcmVsZXZhbnQgaW5mbyB0byB1c2VyLgorICogVGhlIGVudHJpZXMgYXJlIGxvY2F0ZWQgb24gdGhlIGNhbGwgc3RhY2sgc28gbm8gbmVlZCB0byBmcmVlIG1lbW9yeS4KKyAqIE5vdGUgaW5zZXIoKSByZW1vdmUoKSBtdXN0IGFsd2F5cyBtYXRjaCB0byBwcm9wZXJseSBjbGVhciB0aGUgc3RhY2suCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVwX3N0YWNrIHsKKwlzdHJ1Y3QgZGVwX3N0YWNrICpwcmV2LCAqbmV4dDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICpleHByOworfSAqY2hlY2tfdG9wOworCitzdGF0aWMgdm9pZCBkZXBfc3RhY2tfaW5zZXJ0KHN0cnVjdCBkZXBfc3RhY2sgKnN0YWNrLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJbWVtc2V0KHN0YWNrLCAwLCBzaXplb2YoKnN0YWNrKSk7CisJaWYgKGNoZWNrX3RvcCkKKwkJY2hlY2tfdG9wLT5uZXh0ID0gc3RhY2s7CisJc3RhY2stPnByZXYgPSBjaGVja190b3A7CisJc3RhY2stPnN5bSA9IHN5bTsKKwljaGVja190b3AgPSBzdGFjazsKK30KKworc3RhdGljIHZvaWQgZGVwX3N0YWNrX3JlbW92ZSh2b2lkKQoreworCWNoZWNrX3RvcCA9IGNoZWNrX3RvcC0+cHJldjsKKwlpZiAoY2hlY2tfdG9wKQorCQljaGVja190b3AtPm5leHQgPSBOVUxMOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBkZXRlY3RlZCBhIHJlY3Vyc2l2ZSBkZXBlbmRlbmN5LgorICogY2hlY2tfdG9wIHBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWN0IHNvIHdlIHVzZQorICogdGhlIC0+cHJldiBwb2ludGVyIHRvIGxvY2F0ZSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjay4KKyAqLworc3RhdGljIHZvaWQgc3ltX2NoZWNrX3ByaW50X3JlY3Vyc2l2ZShzdHJ1Y3Qgc3ltYm9sICpsYXN0X3N5bSkKK3sKKwlzdHJ1Y3QgZGVwX3N0YWNrICpzdGFjazsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0sICpuZXh0X3N5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudSA9IE5VTEw7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBkZXBfc3RhY2sgY3Zfc3RhY2s7CisKKwlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShsYXN0X3N5bSkpIHsKKwkJZGVwX3N0YWNrX2luc2VydCgmY3Zfc3RhY2ssIGxhc3Rfc3ltKTsKKwkJbGFzdF9zeW0gPSBwcm9wX2dldF9zeW1ib2woc3ltX2dldF9jaG9pY2VfcHJvcChsYXN0X3N5bSkpOworCX0KKworCWZvciAoc3RhY2sgPSBjaGVja190b3A7IHN0YWNrICE9IE5VTEw7IHN0YWNrID0gc3RhY2stPnByZXYpCisJCWlmIChzdGFjay0+c3ltID09IGxhc3Rfc3ltKQorCQkJYnJlYWs7CisJaWYgKCFzdGFjaykgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuZXhwZWN0ZWQgcmVjdXJzaXZlIGRlcGVuZGVuY3kgZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yICg7IHN0YWNrOyBzdGFjayA9IHN0YWNrLT5uZXh0KSB7CisJCXN5bSA9IHN0YWNrLT5zeW07CisJCW5leHRfc3ltID0gc3RhY2stPm5leHQgPyBzdGFjay0+bmV4dC0+c3ltIDogbGFzdF9zeW07CisJCXByb3AgPSBzdGFjay0+cHJvcDsKKworCQkvKiBmb3IgY2hvaWNlIHZhbHVlcyBmaW5kIHRoZSBtZW51IGVudHJ5ICh1c2VkIGJlbG93KSAqLworCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pIHx8IHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCW1lbnUgPSBwcm9wLT5tZW51OworCQkJCWlmIChwcm9wLT5tZW51KQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoc3RhY2stPnN5bSA9PSBsYXN0X3N5bSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ZXJyb3I6IHJlY3Vyc2l2ZSBkZXBlbmRlbmN5IGRldGVjdGVkIVxuIiwKKwkJCQlwcm9wLT5maWxlLT5uYW1lLCBwcm9wLT5saW5lbm8pOworCQlpZiAoc3RhY2stPmV4cHIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6XHRzeW1ib2wgJXMgJXMgdmFsdWUgY29udGFpbnMgJXNcbiIsCisJCQkJcHJvcC0+ZmlsZS0+bmFtZSwgcHJvcC0+bGluZW5vLAorCQkJCXN5bS0+bmFtZSA/IHN5bS0+bmFtZSA6ICI8Y2hvaWNlPiIsCisJCQkJcHJvcF9nZXRfdHlwZV9uYW1lKHByb3AtPnR5cGUpLAorCQkJCW5leHRfc3ltLT5uYW1lID8gbmV4dF9zeW0tPm5hbWUgOiAiPGNob2ljZT4iKTsKKwkJfSBlbHNlIGlmIChzdGFjay0+cHJvcCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczolZDpcdHN5bWJvbCAlcyBkZXBlbmRzIG9uICVzXG4iLAorCQkJCXByb3AtPmZpbGUtPm5hbWUsIHByb3AtPmxpbmVubywKKwkJCQlzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCQkJCW5leHRfc3ltLT5uYW1lID8gbmV4dF9zeW0tPm5hbWUgOiAiPGNob2ljZT4iKTsKKwkJfSBlbHNlIGlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6XHRjaG9pY2UgJXMgY29udGFpbnMgc3ltYm9sICVzXG4iLAorCQkJCW1lbnUtPmZpbGUtPm5hbWUsIG1lbnUtPmxpbmVubywKKwkJCQlzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCQkJCW5leHRfc3ltLT5uYW1lID8gbmV4dF9zeW0tPm5hbWUgOiAiPGNob2ljZT4iKTsKKwkJfSBlbHNlIGlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6XHRzeW1ib2wgJXMgaXMgcGFydCBvZiBjaG9pY2UgJXNcbiIsCisJCQkJbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vLAorCQkJCXN5bS0+bmFtZSA/IHN5bS0+bmFtZSA6ICI8Y2hvaWNlPiIsCisJCQkJbmV4dF9zeW0tPm5hbWUgPyBuZXh0X3N5bS0+bmFtZSA6ICI8Y2hvaWNlPiIpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICIlczolZDpcdHN5bWJvbCAlcyBpcyBzZWxlY3RlZCBieSAlc1xuIiwKKwkJCQlwcm9wLT5maWxlLT5uYW1lLCBwcm9wLT5saW5lbm8sCisJCQkJc3ltLT5uYW1lID8gc3ltLT5uYW1lIDogIjxjaG9pY2U+IiwKKwkJCQluZXh0X3N5bS0+bmFtZSA/IG5leHRfc3ltLT5uYW1lIDogIjxjaG9pY2U+Iik7CisJCX0KKwl9CisKKwlpZiAoY2hlY2tfdG9wID09ICZjdl9zdGFjaykKKwkJZGVwX3N0YWNrX3JlbW92ZSgpOworfQogCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2V4cHJfZGVwcyhzdHJ1Y3QgZXhwciAqZSkKIHsKQEAgLTgwMSwyNCArMTAxNywzMyBAQAogewogCXN0cnVjdCBzeW1ib2wgKnN5bTI7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBkZXBfc3RhY2sgc3RhY2s7CisKKwlkZXBfc3RhY2tfaW5zZXJ0KCZzdGFjaywgc3ltKTsKIAogCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHN5bS0+cmV2X2RlcC5leHByKTsKIAlpZiAoc3ltMikKLQkJcmV0dXJuIHN5bTI7CisJCWdvdG8gb3V0OwogCiAJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgewogCQlpZiAocHJvcC0+dHlwZSA9PSBQX0NIT0lDRSB8fCBwcm9wLT50eXBlID09IFBfU0VMRUNUKQogCQkJY29udGludWU7CisJCXN0YWNrLnByb3AgPSBwcm9wOwogCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT52aXNpYmxlLmV4cHIpOwogCQlpZiAoc3ltMikKIAkJCWJyZWFrOwogCQlpZiAocHJvcC0+dHlwZSAhPSBQX0RFRkFVTFQgfHwgc3ltX2lzX2Nob2ljZShzeW0pKQogCQkJY29udGludWU7CisJCXN0YWNrLmV4cHIgPSBwcm9wLT5leHByOwogCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT5leHByKTsKIAkJaWYgKHN5bTIpCiAJCQlicmVhazsKKwkJc3RhY2suZXhwciA9IE5VTEw7CiAJfQogCitvdXQ6CisJZGVwX3N0YWNrX3JlbW92ZSgpOworCiAJcmV0dXJuIHN5bTI7CiB9CiAKQEAgLTgyNyw2ICsxMDUyLDkgQEAKIAlzdHJ1Y3Qgc3ltYm9sICpzeW0sICpzeW0yOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlzdHJ1Y3QgZXhwciAqZTsKKwlzdHJ1Y3QgZGVwX3N0YWNrIHN0YWNrOworCisJZGVwX3N0YWNrX2luc2VydCgmc3RhY2ssIGNob2ljZSk7CiAKIAlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChjaG9pY2UpOwogCWV4cHJfbGlzdF9mb3JfZWFjaF9zeW0ocHJvcC0+ZXhwciwgZSwgc3ltKQpAQCAtODQwLDEwICsxMDY4LDggQEAKIAogCWV4cHJfbGlzdF9mb3JfZWFjaF9zeW0ocHJvcC0+ZXhwciwgZSwgc3ltKSB7CiAJCXN5bTIgPSBzeW1fY2hlY2tfc3ltX2RlcHMoc3ltKTsKLQkJaWYgKHN5bTIpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiIC0+ICVzIiwgc3ltLT5uYW1lKTsKKwkJaWYgKHN5bTIpCiAJCQlicmVhazsKLQkJfQogCX0KIG91dDoKIAlleHByX2xpc3RfZm9yX2VhY2hfc3ltKHByb3AtPmV4cHIsIGUsIHN5bSkKQEAgLTg1Myw2ICsxMDc5LDggQEAKIAkgICAgcHJvcF9nZXRfc3ltYm9sKHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltMikpID09IGNob2ljZSkKIAkJc3ltMiA9IGNob2ljZTsKIAorCWRlcF9zdGFja19yZW1vdmUoKTsKKwogCXJldHVybiBzeW0yOwogfQogCkBAIC04NjIsMTggKzEwOTAsMjAgQEAKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAKIAlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DSEVDSykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOmVycm9yOiBmb3VuZCByZWN1cnNpdmUgZGVwZW5kZW5jeTogJXMiLAotCQkgICAgICAgIHN5bS0+cHJvcC0+ZmlsZS0+bmFtZSwgc3ltLT5wcm9wLT5saW5lbm8sCi0JCQlzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iKTsKKwkJc3ltX2NoZWNrX3ByaW50X3JlY3Vyc2l2ZShzeW0pOwogCQlyZXR1cm4gc3ltOwogCX0KIAlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DSEVDS0VEKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKKwkJc3RydWN0IGRlcF9zdGFjayBzdGFjazsKKwogCQkvKiBmb3IgY2hvaWNlIGdyb3VwcyBzdGFydCB0aGUgY2hlY2sgd2l0aCBtYWluIGNob2ljZSBzeW1ib2wgKi8KKwkJZGVwX3N0YWNrX2luc2VydCgmc3RhY2ssIHN5bSk7CiAJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CiAJCXN5bTIgPSBzeW1fY2hlY2tfZGVwcyhwcm9wX2dldF9zeW1ib2wocHJvcCkpOworCQlkZXBfc3RhY2tfcmVtb3ZlKCk7CiAJfSBlbHNlIGlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKIAkJc3ltMiA9IHN5bV9jaGVja19jaG9pY2VfZGVwcyhzeW0pOwogCX0gZWxzZSB7CkBAIC04ODIsMTQgKzExMTIsOCBAQAogCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfQ0hFQ0s7CiAJfQogCi0JaWYgKHN5bTIpIHsKLQkJZnByaW50ZihzdGRlcnIsICIgLT4gJXMiLCBzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iKTsKLQkJaWYgKHN5bTIgPT0gc3ltKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JCQl6Y29uZm5lcnJzKys7Ci0JCQlzeW0yID0gTlVMTDsKLQkJfQotCX0KKwlpZiAoc3ltMiAmJiBzeW0yID09IHN5bSkKKwkJc3ltMiA9IE5VTEw7CiAKIAlyZXR1cm4gc3ltMjsKIH0KQEAgLTk0Myw2ICsxMTY3LDggQEAKIAkJcmV0dXJuICJzZWxlY3QiOwogCWNhc2UgUF9SQU5HRToKIAkJcmV0dXJuICJyYW5nZSI7CisJY2FzZSBQX1NZTUJPTDoKKwkJcmV0dXJuICJzeW1ib2wiOwogCWNhc2UgUF9VTktOT1dOOgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKaW5kZXggNTc1OGFhYi4uODhmM2YwNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCisrKyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwpAQCAtODg0LDE2ICs4ODQsMTYgQEAKIAljaGFyICp6ZXJvcyA9IE5VTEw7CiAKIAkvKiBXZSdyZSBsb29raW5nIGZvciBhIHNlY3Rpb24gcmVsYXRpdmUgc3ltYm9sICovCi0JaWYgKCFzeW0tPnN0X3NobmR4IHx8IHN5bS0+c3Rfc2huZHggPj0gaW5mby0+aGRyLT5lX3NobnVtKQorCWlmICghc3ltLT5zdF9zaG5keCB8fCBnZXRfc2VjaW5kZXgoaW5mbywgc3ltKSA+PSBpbmZvLT5udW1fc2VjdGlvbnMpCiAJCXJldHVybjsKIAogCS8qIEhhbmRsZSBhbGwtTlVMTCBzeW1ib2xzIGFsbG9jYXRlZCBpbnRvIC5ic3MgKi8KLQlpZiAoaW5mby0+c2VjaGRyc1tzeW0tPnN0X3NobmR4XS5zaF90eXBlICYgU0hUX05PQklUUykgeworCWlmIChpbmZvLT5zZWNoZHJzW2dldF9zZWNpbmRleChpbmZvLCBzeW0pXS5zaF90eXBlICYgU0hUX05PQklUUykgewogCQl6ZXJvcyA9IGNhbGxvYygxLCBzeW0tPnN0X3NpemUpOwogCQlzeW12YWwgPSB6ZXJvczsKIAl9IGVsc2UgewogCQlzeW12YWwgPSAodm9pZCAqKWluZm8tPmhkcgotCQkJKyBpbmZvLT5zZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX29mZnNldAorCQkJKyBpbmZvLT5zZWNoZHJzW2dldF9zZWNpbmRleChpbmZvLCBzeW0pXS5zaF9vZmZzZXQKIAkJCSsgc3ltLT5zdF92YWx1ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCBmNjEyN2I5Li5jODI3MzA5IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIAlyZXR1cm4gZXhwb3J0X3Vua25vd247CiB9CiAKLXN0YXRpYyBlbnVtIGV4cG9ydCBleHBvcnRfZnJvbV9zZWMoc3RydWN0IGVsZl9pbmZvICplbGYsIEVsZl9TZWN0aW9uIHNlYykKK3N0YXRpYyBlbnVtIGV4cG9ydCBleHBvcnRfZnJvbV9zZWMoc3RydWN0IGVsZl9pbmZvICplbGYsIHVuc2lnbmVkIGludCBzZWMpCiB7CiAJaWYgKHNlYyA9PSBlbGYtPmV4cG9ydF9zZWMpCiAJCXJldHVybiBleHBvcnRfcGxhaW47CkBAIC0zNzMsNiArMzczLDggQEAKIAlFbGZfRWhkciAqaGRyOwogCUVsZl9TaGRyICpzZWNoZHJzOwogCUVsZl9TeW0gICpzeW07CisJY29uc3QgY2hhciAqc2Vjc3RyaW5nczsKKwl1bnNpZ25lZCBpbnQgc3ltdGFiX2lkeCA9IH4wVSwgc3ltdGFiX3NobmR4X2lkeCA9IH4wVTsKIAogCWhkciA9IGdyYWJfZmlsZShmaWxlbmFtZSwgJmluZm8tPnNpemUpOwogCWlmICghaGRyKSB7CkBAIC00MTcsOCArNDE5LDI3IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChoZHItPmVfc2hudW0gPT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgbW9yZSB0aGFuIDY0ayBzZWN0aW9ucywKKwkJICogcmVhZCBjb3VudCBmcm9tIC5zaF9zaXplLgorCQkgKiBub3RlOiBpdCBkb2Vzbid0IG5lZWQgc2huZHgyc2VjaW5kZXgoKQorCQkgKi8KKwkJaW5mby0+bnVtX3NlY3Rpb25zID0gVE9fTkFUSVZFKHNlY2hkcnNbMF0uc2hfc2l6ZSk7CisJfQorCWVsc2UgeworCQlpbmZvLT5udW1fc2VjdGlvbnMgPSBoZHItPmVfc2hudW07CisJfQorCWlmIChoZHItPmVfc2hzdHJuZHggPT0gU0hOX1hJTkRFWCkgeworCQlpbmZvLT5zZWNpbmRleF9zdHJpbmdzID0KKwkJICAgIHNobmR4MnNlY2luZGV4KFRPX05BVElWRShzZWNoZHJzWzBdLnNoX2xpbmspKTsKKwl9CisJZWxzZSB7CisJCWluZm8tPnNlY2luZGV4X3N0cmluZ3MgPSBoZHItPmVfc2hzdHJuZHg7CisJfQorCiAJLyogRml4IGVuZGlhbm5lc3MgaW4gc2VjdGlvbiBoZWFkZXJzICovCi0JZm9yIChpID0gMDsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGluZm8tPm51bV9zZWN0aW9uczsgaSsrKSB7CiAJCXNlY2hkcnNbaV0uc2hfbmFtZSAgICAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfbmFtZSk7CiAJCXNlY2hkcnNbaV0uc2hfdHlwZSAgICAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfdHlwZSk7CiAJCXNlY2hkcnNbaV0uc2hfZmxhZ3MgICAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfZmxhZ3MpOwpAQCAtNDMxLDkgKzQ1Miw4IEBACiAJCXNlY2hkcnNbaV0uc2hfZW50c2l6ZSAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfZW50c2l6ZSk7CiAJfQogCS8qIEZpbmQgc3ltYm9sIHRhYmxlLiAqLwotCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQljb25zdCBjaGFyICpzZWNzdHJpbmdzCi0JCQk9ICh2b2lkICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKKwlzZWNzdHJpbmdzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2luZm8tPnNlY2luZGV4X3N0cmluZ3NdLnNoX29mZnNldDsKKwlmb3IgKGkgPSAxOyBpIDwgaW5mby0+bnVtX3NlY3Rpb25zOyBpKyspIHsKIAkJY29uc3QgY2hhciAqc2VjbmFtZTsKIAkJaW50IG5vYml0cyA9IHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfTk9CSVRTOwogCkBAIC00NjEsMTQgKzQ4MSwyNiBAQAogCQllbHNlIGlmIChzdHJjbXAoc2VjbmFtZSwgIl9fa3N5bXRhYl9ncGxfZnV0dXJlIikgPT0gMCkKIAkJCWluZm8tPmV4cG9ydF9ncGxfZnV0dXJlX3NlYyA9IGk7CiAKLQkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSAhPSBTSFRfU1lNVEFCKQotCQkJY29udGludWU7CisJCWlmIChzZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQikgeworCQkJdW5zaWduZWQgaW50IHNoX2xpbmtfaWR4OworCQkJc3ltdGFiX2lkeCA9IGk7CisJCQlpbmZvLT5zeW10YWJfc3RhcnQgPSAodm9pZCAqKWhkciArCisJCQkgICAgc2VjaGRyc1tpXS5zaF9vZmZzZXQ7CisJCQlpbmZvLT5zeW10YWJfc3RvcCAgPSAodm9pZCAqKWhkciArCisJCQkgICAgc2VjaGRyc1tpXS5zaF9vZmZzZXQgKyBzZWNoZHJzW2ldLnNoX3NpemU7CisJCQlzaF9saW5rX2lkeCA9IHNobmR4MnNlY2luZGV4KHNlY2hkcnNbaV0uc2hfbGluayk7CisJCQlpbmZvLT5zdHJ0YWIgICAgICAgPSAodm9pZCAqKWhkciArCisJCQkgICAgc2VjaGRyc1tzaF9saW5rX2lkeF0uc2hfb2Zmc2V0OworCQl9CiAKLQkJaW5mby0+c3ltdGFiX3N0YXJ0ID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldDsKLQkJaW5mby0+c3ltdGFiX3N0b3AgID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjaGRyc1tpXS5zaF9zaXplOwotCQlpbmZvLT5zdHJ0YWIgICAgICAgPSAodm9pZCAqKWhkciArCi0JCQkgICAgICAgICAgICAgc2VjaGRyc1tzZWNoZHJzW2ldLnNoX2xpbmtdLnNoX29mZnNldDsKKwkJLyogMzJiaXQgc2VjdGlvbiBuby4gdGFibGU/ICgibW9yZSB0aGFuIDY0ayBzZWN0aW9ucyIpICovCisJCWlmIChzZWNoZHJzW2ldLnNoX3R5cGUgPT0gU0hUX1NZTVRBQl9TSE5EWCkgeworCQkJc3ltdGFiX3NobmR4X2lkeCA9IGk7CisJCQlpbmZvLT5zeW10YWJfc2huZHhfc3RhcnQgPSAodm9pZCAqKWhkciArCisJCQkgICAgc2VjaGRyc1tpXS5zaF9vZmZzZXQ7CisJCQlpbmZvLT5zeW10YWJfc2huZHhfc3RvcCAgPSAodm9pZCAqKWhkciArCisJCQkgICAgc2VjaGRyc1tpXS5zaF9vZmZzZXQgKyBzZWNoZHJzW2ldLnNoX3NpemU7CisJCX0KIAl9CiAJaWYgKCFpbmZvLT5zeW10YWJfc3RhcnQpCiAJCWZhdGFsKCIlcyBoYXMgbm8gc3ltdGFiP1xuIiwgZmlsZW5hbWUpOwpAQCAtNDgwLDYgKzUxMiwyMSBAQAogCQlzeW0tPnN0X3ZhbHVlID0gVE9fTkFUSVZFKHN5bS0+c3RfdmFsdWUpOwogCQlzeW0tPnN0X3NpemUgID0gVE9fTkFUSVZFKHN5bS0+c3Rfc2l6ZSk7CiAJfQorCisJaWYgKHN5bXRhYl9zaG5keF9pZHggIT0gfjBVKSB7CisJCUVsZjMyX1dvcmQgKnA7CisJCWlmIChzeW10YWJfaWR4ICE9CisJCSAgICBzaG5keDJzZWNpbmRleChzZWNoZHJzW3N5bXRhYl9zaG5keF9pZHhdLnNoX2xpbmspKQorCQkJZmF0YWwoIiVzOiBTWU1UQUJfU0hORFggaGFzIGJhZCBzaF9saW5rOiAldSE9JXVcbiIsCisJCQkgICAgICBmaWxlbmFtZSwKKwkJCSAgICAgIHNobmR4MnNlY2luZGV4KHNlY2hkcnNbc3ltdGFiX3NobmR4X2lkeF0uc2hfbGluayksCisJCQkgICAgICBzeW10YWJfaWR4KTsKKwkJLyogRml4IGVuZGlhbm5lc3MgKi8KKwkJZm9yIChwID0gaW5mby0+c3ltdGFiX3NobmR4X3N0YXJ0OyBwIDwgaW5mby0+c3ltdGFiX3NobmR4X3N0b3A7CisJCSAgICAgcCsrKQorCQkJKnAgPSBUT19OQVRJVkUoKnApOworCX0KKwogCXJldHVybiAxOwogfQogCkBAIC01MTksNyArNTY2LDcgQEAKIAkJCSAgICAgICBFbGZfU3ltICpzeW0sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCiB7CiAJdW5zaWduZWQgaW50IGNyYzsKLQllbnVtIGV4cG9ydCBleHBvcnQgPSBleHBvcnRfZnJvbV9zZWMoaW5mbywgc3ltLT5zdF9zaG5keCk7CisJZW51bSBleHBvcnQgZXhwb3J0ID0gZXhwb3J0X2Zyb21fc2VjKGluZm8sIGdldF9zZWNpbmRleChpbmZvLCBzeW0pKTsKIAogCXN3aXRjaCAoc3ltLT5zdF9zaG5keCkgewogCWNhc2UgU0hOX0NPTU1PTjoKQEAgLTY2MSwxOSArNzA4LDE5IEBACiAJCXJldHVybiAiKHVua25vd24pIjsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKnNlY19uYW1lKHN0cnVjdCBlbGZfaW5mbyAqZWxmLCBpbnQgc2huZHgpCitzdGF0aWMgY29uc3QgY2hhciAqc2VjX25hbWUoc3RydWN0IGVsZl9pbmZvICplbGYsIGludCBzZWNpbmRleCkKIHsKIAlFbGZfU2hkciAqc2VjaGRycyA9IGVsZi0+c2VjaGRyczsKIAlyZXR1cm4gKHZvaWQgKillbGYtPmhkciArCi0JICAgICAgICBlbGYtPnNlY2hkcnNbZWxmLT5oZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldCArCi0JICAgICAgICBzZWNoZHJzW3NobmR4XS5zaF9uYW1lOworCQllbGYtPnNlY2hkcnNbZWxmLT5zZWNpbmRleF9zdHJpbmdzXS5zaF9vZmZzZXQgKworCQlzZWNoZHJzW3NlY2luZGV4XS5zaF9uYW1lOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqc2VjaF9uYW1lKHN0cnVjdCBlbGZfaW5mbyAqZWxmLCBFbGZfU2hkciAqc2VjaGRyKQogewogCXJldHVybiAodm9pZCAqKWVsZi0+aGRyICsKLQkgICAgICAgIGVsZi0+c2VjaGRyc1tlbGYtPmhkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0ICsKLQkgICAgICAgIHNlY2hkci0+c2hfbmFtZTsKKwkJZWxmLT5zZWNoZHJzW2VsZi0+c2VjaW5kZXhfc3RyaW5nc10uc2hfb2Zmc2V0ICsKKwkJc2VjaGRyLT5zaF9uYW1lOwogfQogCiAvKiBpZiBzeW0gaXMgZW1wdHkgb3IgcG9pbnQgdG8gYSBzdHJpbmcKQEAgLTEwNTIsMTEgKzEwOTksMTQgQEAKIAlFbGZfU3ltICpuZWFyID0gTlVMTDsKIAlFbGY2NF9Td29yZCBkaXN0YW5jZSA9IDIwOwogCUVsZjY0X1N3b3JkIGQ7CisJdW5zaWduZWQgaW50IHJlbHN5bV9zZWNpbmRleDsKIAogCWlmIChyZWxzeW0tPnN0X25hbWUgIT0gMCkKIAkJcmV0dXJuIHJlbHN5bTsKKworCXJlbHN5bV9zZWNpbmRleCA9IGdldF9zZWNpbmRleChlbGYsIHJlbHN5bSk7CiAJZm9yIChzeW0gPSBlbGYtPnN5bXRhYl9zdGFydDsgc3ltIDwgZWxmLT5zeW10YWJfc3RvcDsgc3ltKyspIHsKLQkJaWYgKHN5bS0+c3Rfc2huZHggIT0gcmVsc3ltLT5zdF9zaG5keCkKKwkJaWYgKGdldF9zZWNpbmRleChlbGYsIHN5bSkgIT0gcmVsc3ltX3NlY2luZGV4KQogCQkJY29udGludWU7CiAJCWlmIChFTEZfU1RfVFlQRShzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQogCQkJY29udGludWU7CkBAIC0xMTE4LDkgKzExNjgsOSBAQAogCWZvciAoc3ltID0gZWxmLT5zeW10YWJfc3RhcnQ7IHN5bSA8IGVsZi0+c3ltdGFiX3N0b3A7IHN5bSsrKSB7CiAJCWNvbnN0IGNoYXIgKnN5bXNlYzsKIAotCQlpZiAoc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQorCQlpZiAoaXNfc2huZHhfc3BlY2lhbChzeW0tPnN0X3NobmR4KSkKIAkJCWNvbnRpbnVlOwotCQlzeW1zZWMgPSBzZWNfbmFtZShlbGYsIHN5bS0+c3Rfc2huZHgpOworCQlzeW1zZWMgPSBzZWNfbmFtZShlbGYsIGdldF9zZWNpbmRleChlbGYsIHN5bSkpOwogCQlpZiAoc3RyY21wKHN5bXNlYywgc2VjKSAhPSAwKQogCQkJY29udGludWU7CiAJCWlmICghaXNfdmFsaWRfbmFtZShlbGYsIHN5bSkpCkBAIC0xMzE2LDcgKzEzNjYsNyBAQAogCWNvbnN0IGNoYXIgKnRvc2VjOwogCWNvbnN0IHN0cnVjdCBzZWN0aW9uY2hlY2sgKm1pc21hdGNoOwogCi0JdG9zZWMgPSBzZWNfbmFtZShlbGYsIHN5bS0+c3Rfc2huZHgpOworCXRvc2VjID0gc2VjX25hbWUoZWxmLCBnZXRfc2VjaW5kZXgoZWxmLCBzeW0pKTsKIAltaXNtYXRjaCA9IHNlY3Rpb25fbWlzbWF0Y2goZnJvbXNlYywgdG9zZWMpOwogCWlmIChtaXNtYXRjaCkgewogCQlFbGZfU3ltICp0bzsKQEAgLTEzNDQsNyArMTM5NCw3IEBACiAJCQkJICAgIEVsZl9TaGRyICpzZWNoZHIsIEVsZl9SZWxhICpyKQogewogCUVsZl9TaGRyICpzZWNoZHJzID0gZWxmLT5zZWNoZHJzOwotCWludCBzZWN0aW9uID0gc2VjaGRyLT5zaF9pbmZvOworCWludCBzZWN0aW9uID0gc2huZHgyc2VjaW5kZXgoc2VjaGRyLT5zaF9pbmZvKTsKIAogCXJldHVybiAodm9pZCAqKWVsZi0+aGRyICsgc2VjaGRyc1tzZWN0aW9uXS5zaF9vZmZzZXQgKwogCQlyLT5yX29mZnNldCAtIHNlY2hkcnNbc2VjdGlvbl0uc2hfYWRkcjsKQEAgLTE0NTIsNyArMTUwMiw3IEBACiAJCXIucl9hZGRlbmQgPSBUT19OQVRJVkUocmVsYS0+cl9hZGRlbmQpOwogCQlzeW0gPSBlbGYtPnN5bXRhYl9zdGFydCArIHJfc3ltOwogCQkvKiBTa2lwIHNwZWNpYWwgc2VjdGlvbnMgKi8KLQkJaWYgKHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKKwkJaWYgKGlzX3NobmR4X3NwZWNpYWwoc3ltLT5zdF9zaG5keCkpCiAJCQljb250aW51ZTsKIAkJY2hlY2tfc2VjdGlvbl9taXNtYXRjaChtb2RuYW1lLCBlbGYsICZyLCBzeW0sIGZyb21zZWMpOwogCX0KQEAgLTE1MTAsNyArMTU2MCw3IEBACiAJCX0KIAkJc3ltID0gZWxmLT5zeW10YWJfc3RhcnQgKyByX3N5bTsKIAkJLyogU2tpcCBzcGVjaWFsIHNlY3Rpb25zICovCi0JCWlmIChzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisJCWlmIChpc19zaG5keF9zcGVjaWFsKHN5bS0+c3Rfc2huZHgpKQogCQkJY29udGludWU7CiAJCWNoZWNrX3NlY3Rpb25fbWlzbWF0Y2gobW9kbmFtZSwgZWxmLCAmciwgc3ltLCBmcm9tc2VjKTsKIAl9CkBAIC0xNTM1LDcgKzE1ODUsNyBAQAogCUVsZl9TaGRyICpzZWNoZHJzID0gZWxmLT5zZWNoZHJzOwogCiAJLyogV2FsayB0aHJvdWdoIGFsbCBzZWN0aW9ucyAqLwotCWZvciAoaSA9IDA7IGkgPCBlbGYtPmhkci0+ZV9zaG51bTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGVsZi0+bnVtX3NlY3Rpb25zOyBpKyspIHsKIAkJY2hlY2tfc2VjdGlvbihtb2RuYW1lLCBlbGYsICZlbGYtPnNlY2hkcnNbaV0pOwogCQkvKiBXZSB3YW50IHRvIHByb2Nlc3Mgb25seSByZWxvY2F0aW9uIHNlY3Rpb25zIGFuZCBub3QgLmluaXQgKi8KIAkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfUkVMQSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuaCBiL3NjcmlwdHMvbW9kL21vZHBvc3QuaAppbmRleCBiZTk4N2E0Li4wMzg4Y2ZjYyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5oCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuaApAQCAtMTI5LDggKzEyOSw1MSBAQAogCWNvbnN0IGNoYXIgICAqc3RydGFiOwogCWNoYXIJICAgICAqbW9kaW5mbzsKIAl1bnNpZ25lZCBpbnQgbW9kaW5mb19sZW47CisKKwkvKiBzdXBwb3J0IGZvciAzMmJpdCBzZWN0aW9uIG51bWJlcnMgKi8KKworCXVuc2lnbmVkIGludCBudW1fc2VjdGlvbnM7IC8qIG1heF9zZWNpbmRleCArIDEgKi8KKwl1bnNpZ25lZCBpbnQgc2VjaW5kZXhfc3RyaW5nczsKKwkvKiBpZiBOdGggc3ltYm9sIHRhYmxlIGVudHJ5IGhhcyAuc3Rfc2huZHggPSBTSE5fWElOREVYLAorCSAqIHRha2Ugc2huZHggZnJvbSBzeW10YWJfc2huZHhfc3RhcnRbTl0gaW5zdGVhZCAqLworCUVsZjMyX1dvcmQgICAqc3ltdGFiX3NobmR4X3N0YXJ0OworCUVsZjMyX1dvcmQgICAqc3ltdGFiX3NobmR4X3N0b3A7CiB9OwogCitzdGF0aWMgaW5saW5lIGludCBpc19zaG5keF9zcGVjaWFsKHVuc2lnbmVkIGludCBpKQoreworCXJldHVybiBpICE9IFNITl9YSU5ERVggJiYgaSA+PSBTSE5fTE9SRVNFUlZFICYmIGkgPD0gU0hOX0hJUkVTRVJWRTsKK30KKworLyogc2huZHggaXMgaW4gWzAuLlNITl9MT1JFU0VSVkUpIFUgKFNITl9ISVJFU0VSVkUsIDB4ZmZmZmZmZl0sIHRodXM6CisgKiBzaG5keCA9PSAwICAgICAgICAgICAgICAgPD0+IHNlY2hkcnNbMF0KKyAqIC4uLi4uLgorICogc2huZHggPT0gU0hOX0xPUkVTRVJWRS0xIDw9PiBzZWNoZHJzW1NITl9MT1JFU0VSVkUtMV0KKyAqIHNobmR4ID09IFNITl9ISVJFU0VSVkUrMSA8PT4gc2VjaGRyc1tTSE5fTE9SRVNFUlZFXQorICogc2huZHggPT0gU0hOX0hJUkVTRVJWRSsyIDw9PiBzZWNoZHJzW1NITl9MT1JFU0VSVkUrMV0KKyAqIC4uLi4uLgorICogZnlpOiBzeW0tPnN0X3NobmR4IGlzIHVpbnQxNiwgU0hOX0xPUkVTRVJWRSA9IGZmMDAsIFNITl9ISVJFU0VSVkUgPSBmZmZmLAorICogc28gYmFzaWNhbGx5IHdlIG1hcCAgMDAwMC4uZmVmZiAtPiAwMDAwLi5mZWZmCisgKiAgICAgICAgICAgICAgICAgICAgICBmZjAwLi5mZmZmIC0+ICh5b3UgYXJlIGEgYmFkIGJveSwgZG9udCBkbyBpdCkKKyAqICAgICAgICAgICAgICAgICAgICAgMTAwMDAuLnh4eHggLT4gZmYwMC4uKHh4eHgtMHgxMDApCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNobmR4MnNlY2luZGV4KHVuc2lnbmVkIGludCBpKQoreworCWlmIChpIDw9IFNITl9ISVJFU0VSVkUpCisJCXJldHVybiBpOworCXJldHVybiBpIC0gKFNITl9ISVJFU0VSVkUgKyAxIC0gU0hOX0xPUkVTRVJWRSk7Cit9CisKKy8qIEFjY2Vzc29yIGZvciBzeW0tPnN0X3NobmR4LCBoaWRlcyB1Z2xpbmVzcyBvZiAiNjRrIHNlY3Rpb25zIiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3NlY2luZGV4KGNvbnN0IHN0cnVjdCBlbGZfaW5mbyAqaW5mbywKKwkJCQkJY29uc3QgRWxmX1N5bSAqc3ltKQoreworCWlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCisJCXJldHVybiBzeW0tPnN0X3NobmR4OworCXJldHVybiBzaG5keDJzZWNpbmRleChpbmZvLT5zeW10YWJfc2huZHhfc3RhcnRbc3ltIC0KKwkJCQkJCSAgICAgICBpbmZvLT5zeW10YWJfc3RhcnRdKTsKK30KKwogLyogZmlsZTJhbGlhcy5jICovCiBleHRlcm4gdW5zaWduZWQgaW50IGNyb3NzX2J1aWxkOwogdm9pZCBoYW5kbGVfbW9kZGV2dGFibGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgZWxmX2luZm8gKmluZm8sCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUgYi9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKaW5kZXggZDJjMjliNi4uZDBiOTMxYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZQpAQCAtMTExLDEzICsxMTEsMzggQEAKIGNsZWFuLWRpcnMgKz0gJChvYmp0cmVlKS90YXItaW5zdGFsbC8KIAogCisjIHBlcmYtcGtnIC0gZ2VuZXJhdGUgYSBzb3VyY2UgdGFyYmFsbCB3aXRoIHBlcmYgc291cmNlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwZXJmLXRhcj1wZXJmLSQoS0VSTkVMVkVSU0lPTikKKworcXVpZXRfY21kX3BlcmZfdGFyID0gVEFSCisgICAgICBjbWRfcGVyZl90YXIgPSBcCitnaXQgYXJjaGl2ZSAtLXByZWZpeD0kKHBlcmYtdGFyKS8gSEVBRF57dHJlZX0gICAgICAgICAgICAgICAgICAgICAgIFwKKwkkJChjYXQgJChzcmN0cmVlKS90b29scy9wZXJmL01BTklGRVNUKSAtbyAkKHBlcmYtdGFyKS50YXI7ICBcCitta2RpciAtcCAkKHBlcmYtdGFyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2dpdCByZXYtcGFyc2UgSEVBRCA+ICQocGVyZi10YXIpL0hFQUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGFyIHJmICQocGVyZi10YXIpLnRhciAkKHBlcmYtdGFyKS9IRUFEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitybSAtciAkKHBlcmYtdGFyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyQoaWYgJChmaW5kc3RyaW5nIHRhci1zcmMsJEApLCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorJChpZiAkKGZpbmRzdHJpbmcgYnoyLCRAKSxiemlwMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiskKGlmICQoZmluZHN0cmluZyBneiwkQCksZ3ppcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyQoZXJyb3IgdW5rbm93biB0YXJnZXQgJEApKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLWYgLTkgJChwZXJmLXRhcikudGFyKQorCitwZXJmLSVwa2c6IEZPUkNFCisJJChjYWxsIGNtZCxwZXJmX3RhcikKKwogIyBIZWxwIHRleHQgZGlzcGxheWVkIHdoZW4gZXhlY3V0aW5nICdtYWtlIGhlbHAnCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaGVscDogRk9SQ0UKLQlAZWNobyAnICBycG0tcGtnICAgICAgICAgLSBCdWlsZCBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IFJQTSBrZXJuZWwgcGFja2FnZXMnCi0JQGVjaG8gJyAgYmlucnBtLXBrZyAgICAgIC0gQnVpbGQgb25seSB0aGUgYmluYXJ5IGtlcm5lbCBwYWNrYWdlJwotCUBlY2hvICcgIGRlYi1wa2cgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gZGViIHBhY2thZ2UnCi0JQGVjaG8gJyAgdGFyLXBrZyAgICAgICAgIC0gQnVpbGQgdGhlIGtlcm5lbCBhcyBhbiB1bmNvbXByZXNzZWQgdGFyYmFsbCcKLQlAZWNobyAnICB0YXJnei1wa2cgICAgICAgLSBCdWlsZCB0aGUga2VybmVsIGFzIGEgZ3ppcCBjb21wcmVzc2VkIHRhcmJhbGwnCi0JQGVjaG8gJyAgdGFyYnoyLXBrZyAgICAgIC0gQnVpbGQgdGhlIGtlcm5lbCBhcyBhIGJ6aXAyIGNvbXByZXNzZWQgdGFyYmFsbCcKKwlAZWNobyAnICBycG0tcGtnICAgICAgICAgICAgIC0gQnVpbGQgYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBSUE0ga2VybmVsIHBhY2thZ2VzJworCUBlY2hvICcgIGJpbnJwbS1wa2cgICAgICAgICAgLSBCdWlsZCBvbmx5IHRoZSBiaW5hcnkga2VybmVsIHBhY2thZ2UnCisJQGVjaG8gJyAgZGViLXBrZyAgICAgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gZGViIHBhY2thZ2UnCisJQGVjaG8gJyAgdGFyLXBrZyAgICAgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gdW5jb21wcmVzc2VkIHRhcmJhbGwnCisJQGVjaG8gJyAgdGFyZ3otcGtnICAgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYSBnemlwIGNvbXByZXNzZWQgdGFyYmFsbCcKKwlAZWNobyAnICB0YXJiejItcGtnICAgICAgICAgIC0gQnVpbGQgdGhlIGtlcm5lbCBhcyBhIGJ6aXAyIGNvbXByZXNzZWQgdGFyYmFsbCcKKwlAZWNobyAnICBwZXJmLXRhci1zcmMtcGtnICAgIC0gQnVpbGQgJChwZXJmLXRhcikudGFyIHNvdXJjZSB0YXJiYWxsJworCUBlY2hvICcgIHBlcmYtdGFyZ3otc3JjLXBrZyAgLSBCdWlsZCAkKHBlcmYtdGFyKS50YXIuZ3ogc291cmNlIHRhcmJhbGwnCisJQGVjaG8gJyAgcGVyZi10YXJiejItc3JjLXBrZyAtIEJ1aWxkICQocGVyZi10YXIpLnRhci5iejIgc291cmNlIHRhcmJhbGwnCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYiBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgppbmRleCAwN2YyZmJkLi41ZjFlMmZjIDEwMDY0NAotLS0gYS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKKysrIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCkBAIC0xNDgsMTAgKzE0OCwxMSBAQAogIyBHZW5lcmF0ZSBhIGNvbnRyb2wgZmlsZQogY2F0IDw8RU9GID4gZGViaWFuL2NvbnRyb2wKIFNvdXJjZTogbGludXgtdXBzdHJlYW0KLVNlY3Rpb246IGFkbWluCitTZWN0aW9uOiBrZXJuZWwKIFByaW9yaXR5OiBvcHRpb25hbAogTWFpbnRhaW5lcjogJG1haW50YWluZXIKLVN0YW5kYXJkcy1WZXJzaW9uOiAzLjguMQorU3RhbmRhcmRzLVZlcnNpb246IDMuOC40CitIb21lcGFnZTogaHR0cDovL3d3dy5rZXJuZWwub3JnLwogRU9GCiAKIGlmIFsgIiRBUkNIIiA9ICJ1bSIgXTsgdGhlbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWNvcmRtY291bnQucGwgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAppbmRleCBmM2M5YzBhLi4wMTcxMDYwIDEwMDc1NQotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAorKysgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbApAQCAtMzI2LDcgKzMyNiw3IEBACiAgICAgIyAgICAgICAgICAgICAgICAgICAgMTQ6IFJfTUlQU19OT05FICpBQlMqCiAgICAgIwkgMTg6ICAgMDAwMjAwMjEgICAgICAgIG5vcAogICAgIGlmICgkaXNfbW9kdWxlIGVxICIwIikgewotCSAgICAkbWNvdW50X3JlZ2V4ID0gIl5cXHMqKFswLTlhLWZBLUZdKyk6LipcXHNfbWNvdW50XCQiOworCSAgICAkbWNvdW50X3JlZ2V4ID0gIl5cXHMqKFswLTlhLWZBLUZdKyk6IFJfTUlQU18yNlxccytfbWNvdW50XCQiOwogICAgIH0gZWxzZSB7CiAJICAgICRtY291bnRfcmVnZXggPSAiXlxccyooWzAtOWEtZkEtRl0rKTogUl9NSVBTX0hJMTZcXHMrX21jb3VudFwkIjsKICAgICB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9LY29uZmlnIGIvc2VjdXJpdHkvS2NvbmZpZwppbmRleCAyMjZiOTU1Li5iZDcyYWU2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9LY29uZmlnCisrKyBiL3NlY3VyaXR5L0tjb25maWcKQEAgLTE0MCw2ICsxNDAsNyBAQAogc291cmNlIHNlY3VyaXR5L3NlbGludXgvS2NvbmZpZwogc291cmNlIHNlY3VyaXR5L3NtYWNrL0tjb25maWcKIHNvdXJjZSBzZWN1cml0eS90b21veW8vS2NvbmZpZworc291cmNlIHNlY3VyaXR5L2FwcGFybW9yL0tjb25maWcKIAogc291cmNlIHNlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZwogCkBAIC0xNDgsNiArMTQ5LDcgQEAKIAlkZWZhdWx0IERFRkFVTFRfU0VDVVJJVFlfU0VMSU5VWCBpZiBTRUNVUklUWV9TRUxJTlVYCiAJZGVmYXVsdCBERUZBVUxUX1NFQ1VSSVRZX1NNQUNLIGlmIFNFQ1VSSVRZX1NNQUNLCiAJZGVmYXVsdCBERUZBVUxUX1NFQ1VSSVRZX1RPTU9ZTyBpZiBTRUNVUklUWV9UT01PWU8KKwlkZWZhdWx0IERFRkFVTFRfU0VDVVJJVFlfQVBQQVJNT1IgaWYgU0VDVVJJVFlfQVBQQVJNT1IKIAlkZWZhdWx0IERFRkFVTFRfU0VDVVJJVFlfREFDCiAKIAloZWxwCkBAIC0xNjMsNiArMTY1LDkgQEAKIAljb25maWcgREVGQVVMVF9TRUNVUklUWV9UT01PWU8KIAkJYm9vbCAiVE9NT1lPIiBpZiBTRUNVUklUWV9UT01PWU89eQogCisJY29uZmlnIERFRkFVTFRfU0VDVVJJVFlfQVBQQVJNT1IKKwkJYm9vbCAiQXBwQXJtb3IiIGlmIFNFQ1VSSVRZX0FQUEFSTU9SPXkKKwogCWNvbmZpZyBERUZBVUxUX1NFQ1VSSVRZX0RBQwogCQlib29sICJVbml4IERpc2NyZXRpb25hcnkgQWNjZXNzIENvbnRyb2xzIgogCkBAIC0xNzMsNiArMTc4LDcgQEAKIAlkZWZhdWx0ICJzZWxpbnV4IiBpZiBERUZBVUxUX1NFQ1VSSVRZX1NFTElOVVgKIAlkZWZhdWx0ICJzbWFjayIgaWYgREVGQVVMVF9TRUNVUklUWV9TTUFDSwogCWRlZmF1bHQgInRvbW95byIgaWYgREVGQVVMVF9TRUNVUklUWV9UT01PWU8KKwlkZWZhdWx0ICJhcHBhcm1vciIgaWYgREVGQVVMVF9TRUNVUklUWV9BUFBBUk1PUgogCWRlZmF1bHQgIiIgaWYgREVGQVVMVF9TRUNVUklUWV9EQUMKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvTWFrZWZpbGUgYi9zZWN1cml0eS9NYWtlZmlsZQppbmRleCBkYTIwYTE5Li44YmIwZmU5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9NYWtlZmlsZQorKysgYi9zZWN1cml0eS9NYWtlZmlsZQpAQCAtNiw2ICs2LDcgQEAKIHN1YmRpci0kKENPTkZJR19TRUNVUklUWV9TRUxJTlVYKQkrPSBzZWxpbnV4CiBzdWJkaXItJChDT05GSUdfU0VDVVJJVFlfU01BQ0spCQkrPSBzbWFjawogc3ViZGlyLSQoQ09ORklHX1NFQ1VSSVRZX1RPTU9ZTykgICAgICAgICs9IHRvbW95bworc3ViZGlyLSQoQ09ORklHX1NFQ1VSSVRZX0FQUEFSTU9SKQkrPSBhcHBhcm1vcgogCiAjIGFsd2F5cyBlbmFibGUgZGVmYXVsdCBjYXBhYmlsaXRpZXMKIG9iai15CQkJCQkrPSBjb21tb25jYXAubwpAQCAtMTksNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1NFQ1VSSVRZX1NNQUNLKQkJKz0gc21hY2svYnVpbHQtaW4ubwogb2JqLSQoQ09ORklHX0FVRElUKQkJCSs9IGxzbV9hdWRpdC5vCiBvYmotJChDT05GSUdfU0VDVVJJVFlfVE9NT1lPKQkJKz0gdG9tb3lvL2J1aWx0LWluLm8KK29iai0kKENPTkZJR19TRUNVUklUWV9BUFBBUk1PUikJCSs9IGFwcGFybW9yL2J1aWx0LWluLm8KIG9iai0kKENPTkZJR19DR1JPVVBfREVWSUNFKQkJKz0gZGV2aWNlX2Nncm91cC5vCiAKICMgT2JqZWN0IGludGVncml0eSBmaWxlIGxpc3RzCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci8uZ2l0aWdub3JlIGIvc2VjdXJpdHkvYXBwYXJtb3IvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBhOTlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgR2VuZXJhdGVkIGluY2x1ZGUgZmlsZXMKKyMKK2FmX25hbWVzLmgKK2NhcGFiaWxpdHlfbmFtZXMuaApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvS2NvbmZpZyBiL3NlY3VyaXR5L2FwcGFybW9yL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5MDEzYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL0tjb25maWcKQEAgLTAsMCArMSwzMSBAQAorY29uZmlnIFNFQ1VSSVRZX0FQUEFSTU9SCisJYm9vbCAiQXBwQXJtb3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFQ1VSSVRZICYmIE5FVAorCXNlbGVjdCBBVURJVAorCXNlbGVjdCBTRUNVUklUWV9QQVRICisJc2VsZWN0IFNFQ1VSSVRZRlMKKwlzZWxlY3QgU0VDVVJJVFlfTkVUV09SSworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlLgorCSAgUmVxdWlyZWQgdXNlcnNwYWNlIHRvb2xzIChpZiB0aGV5IGFyZSBub3QgaW5jbHVkZWQgaW4geW91cgorCSAgZGlzdHJpYnV0aW9uKSBhbmQgZnVydGhlciBpbmZvcm1hdGlvbiBtYXkgYmUgZm91bmQgYXQKKwkgIGh0dHA6Ly9hcHBhcm1vci53aWtpLmtlcm5lbC5vcmcKKworCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KKworY29uZmlnIFNFQ1VSSVRZX0FQUEFSTU9SX0JPT1RQQVJBTV9WQUxVRQorCWludCAiQXBwQXJtb3IgYm9vdCBwYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZSIKKwlkZXBlbmRzIG9uIFNFQ1VSSVRZX0FQUEFSTU9SCisJcmFuZ2UgMCAxCisJZGVmYXVsdCAxCisJaGVscAorCSAgVGhpcyBvcHRpb24gc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGtlcm5lbCBwYXJhbWV0ZXIKKwkgICdhcHBhcm1vcicsIHdoaWNoIGFsbG93cyBBcHBBcm1vciB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgICAgICAgICAgYXQgYm9vdC4gIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byAwICh6ZXJvKSwgdGhlIEFwcEFybW9yCisJICBrZXJuZWwgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0byAwLCBkaXNhYmxpbmcgQXBwQXJtb3IgYXQKKwkgIGJvb3QuICBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gMSAob25lKSwgdGhlIEFwcEFybW9yCisJICBrZXJuZWwgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0byAxLCBlbmFibGluZyBBcHBBcm1vciBhdAorCSAgYm9vdC4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgMS4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL01ha2VmaWxlIGIvc2VjdXJpdHkvYXBwYXJtb3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNDg2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMgTWFrZWZpbGUgZm9yIEFwcEFybW9yIExpbnV4IFNlY3VyaXR5IE1vZHVsZQorIworb2JqLSQoQ09ORklHX1NFQ1VSSVRZX0FQUEFSTU9SKSArPSBhcHBhcm1vci5vCisKK2FwcGFybW9yLXkgOj0gYXBwYXJtb3Jmcy5vIGF1ZGl0Lm8gY2FwYWJpbGl0eS5vIGNvbnRleHQubyBpcGMubyBsaWIubyBtYXRjaC5vIFwKKyAgICAgICAgICAgICAgcGF0aC5vIGRvbWFpbi5vIHBvbGljeS5vIHBvbGljeV91bnBhY2subyBwcm9jYXR0ci5vIGxzbS5vIFwKKyAgICAgICAgICAgICAgcmVzb3VyY2UubyBzaWQubyBmaWxlLm8KKworY2xlYW4tZmlsZXM6IGNhcGFiaWxpdHlfbmFtZXMuaCBhZl9uYW1lcy5oCisKK3F1aWV0X2NtZF9tYWtlLWNhcHMgPSBHRU4gICAgICRACitjbWRfbWFrZS1jYXBzID0gZWNobyAic3RhdGljIGNvbnN0IGNoYXIgKmNhcGFiaWxpdHlfbmFtZXNbXSA9IHsiID4gJEAgOyBzZWQgLW4gLWUgIi9DQVBfRlNfTUFTSy9kIiAtZSAicy9eXCNkZWZpbmVbIFxcdF1cXCtDQVBfXFwoW0EtWjAtOV9dXFwrXFwpWyBcXHRdXFwrXFwoWzAtOV1cXCtcXClcJCQvW1xcMl0gID0gXCJcXDFcIiwvcCIgJDwgfCB0ciBBLVogYS16ID4+ICRAIDsgZWNobyAifTsiID4+ICRACisKK3F1aWV0X2NtZF9tYWtlLXJsaW0gPSBHRU4gICAgICRACitjbWRfbWFrZS1ybGltID0gZWNobyAic3RhdGljIGNvbnN0IGNoYXIgKnJsaW1fbmFtZXNbXSA9IHsiID4gJEAgOyBzZWQgLW4gLS1lICIvQUZfTUFYL2QiIC1lICJzL15cIyBcXD9kZWZpbmVbIFxcdF1cXCtSTElNSVRfXFwoW0EtWjAtOV9dXFwrXFwpWyBcXHRdXFwrXFwoWzAtOV1cXCtcXClcXCguKlxcKVwkJC9bXFwyXSAgPSBcIlxcMVwiLC9wIiAkPCB8IHRyIEEtWiBhLXogPj4gJEAgOyBlY2hvICJ9OyIgPj4gJEAgOyBlY2hvICJzdGF0aWMgY29uc3QgaW50IHJsaW1fbWFwW10gPSB7IiA+PiAkQCA7IHNlZCAtbiAtZSAiL0FGX01BWC9kIiAtZSAicy9eXCMgXFw/ZGVmaW5lWyBcXHRdXFwrXFwoUkxJTUlUX1tBLVowLTlfXVxcK1xcKVsgXFx0XVxcK1xcKFswLTldXFwrXFwpXFwoLipcXClcJCQvXFwxLC9wIiAkPCA+PiAkQCA7IGVjaG8gIn07IiA+PiAkQAorCiskKG9iaikvY2FwYWJpbGl0eS5vIDogJChvYmopL2NhcGFiaWxpdHlfbmFtZXMuaAorJChvYmopL3Jlc291cmNlLm8gOiAkKG9iaikvcmxpbV9uYW1lcy5oCiskKG9iaikvY2FwYWJpbGl0eV9uYW1lcy5oIDogJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorCSQoY2FsbCBjbWQsbWFrZS1jYXBzKQorJChvYmopL2FmX25hbWVzLmggOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKwkkKGNhbGwgY21kLG1ha2UtYWYpCiskKG9iaikvcmxpbV9uYW1lcy5oIDogJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1nZW5lcmljL3Jlc291cmNlLmgKKwkkKGNhbGwgY21kLG1ha2UtcmxpbSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2FwcGFybW9yZnMuYyBiL3NlY3VyaXR5L2FwcGFybW9yL2FwcGFybW9yZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIwMzMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvYXBwYXJtb3Jmcy5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIC9zeXMva2VybmVsL3NlY3VyaXR5L2FwcGFybW9yIGludGVyZmFjZSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvYXBwYXJtb3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2FwcGFybW9yZnMuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2F1ZGl0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9wb2xpY3kuaCIKKworLyoqCisgKiBhYV9zaW1wbGVfd3JpdGVfdG9fYnVmZmVyIC0gY29tbW9uIHJvdXRpbmUgZm9yIGdldHRpbmcgcG9saWN5IGZyb20gdXNlcgorICogQG9wOiBvcGVyYXRpb24gZG9pbmcgdGhlIHVzZXIgYnVmZmVyIGNvcHkKKyAqIEB1c2VyYnVmOiB1c2VyIGJ1ZmZlciB0byBjb3B5IGRhdGEgZnJvbSAgKE5PVCBOVUxMKQorICogQGFsbG9jX3NpemU6IHNpemUgb2YgdXNlciBidWZmZXIKKyAqIEBjb3B5X3NpemU6IHNpemUgb2YgZGF0YSB0byBjb3B5IGZyb20gdXNlciBidWZmZXIKKyAqIEBwb3M6IHBvc2l0aW9uIHdyaXRlIGlzIGF0IGluIHRoZSBmaWxlIChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiBrZXJuZWwgYnVmZmVyIGNvbnRhaW5pbmcgY29weSBvZiB1c2VyIGJ1ZmZlciBkYXRhIG9yIGFuCisgKiAgICAgICAgICBFUlJfUFRSIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBjaGFyICphYV9zaW1wbGVfd3JpdGVfdG9fYnVmZmVyKGludCBvcCwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgICAgIHNpemVfdCBhbGxvY19zaXplLCBzaXplX3QgY29weV9zaXplLAorCQkJCSAgICAgICBsb2ZmX3QgKnBvcykKK3sKKwljaGFyICpkYXRhOworCisJaWYgKCpwb3MgIT0gMCkKKwkJLyogb25seSB3cml0ZXMgZnJvbSBwb3MgMCwgdGhhdCBpcyBjb21wbGV0ZSB3cml0ZXMgKi8KKwkJcmV0dXJuIEVSUl9QVFIoLUVTUElQRSk7CisKKwkvKgorCSAqIERvbid0IGFsbG93IHByb2ZpbGUgbG9hZC9yZXBsYWNlL3JlbW92ZSBmcm9tIHByb2ZpbGVzIHRoYXQgZG9uJ3QKKwkgKiBoYXZlIENBUF9NQUNfQURNSU4KKwkgKi8KKwlpZiAoIWFhX21heV9tYW5hZ2VfcG9saWN5KG9wKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwkvKiBmcmVlZCBieSBjYWxsZXIgdG8gc2ltcGxlX3dyaXRlX3RvX2J1ZmZlciAqLworCWRhdGEgPSBrdm1hbGxvYyhhbGxvY19zaXplKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCB1c2VyYnVmLCBjb3B5X3NpemUpKSB7CisJCWt2ZnJlZShkYXRhKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKworLyogLmxvYWQgZmlsZSBob29rIGZuIHRvIGxvYWQgcG9saWN5ICovCitzdGF0aWMgc3NpemVfdCBwcm9maWxlX2xvYWQoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLAorCQkJICAgIGxvZmZfdCAqcG9zKQoreworCWNoYXIgKmRhdGE7CisJc3NpemVfdCBlcnJvcjsKKworCWRhdGEgPSBhYV9zaW1wbGVfd3JpdGVfdG9fYnVmZmVyKE9QX1BST0ZfTE9BRCwgYnVmLCBzaXplLCBzaXplLCBwb3MpOworCisJZXJyb3IgPSBQVFJfRVJSKGRhdGEpOworCWlmICghSVNfRVJSKGRhdGEpKSB7CisJCWVycm9yID0gYWFfcmVwbGFjZV9wcm9maWxlcyhkYXRhLCBzaXplLCBQUk9GX0FERCk7CisJCWt2ZnJlZShkYXRhKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFhX2ZzX3Byb2ZpbGVfbG9hZCA9IHsKKwkud3JpdGUgPSBwcm9maWxlX2xvYWQKK307CisKKy8qIC5yZXBsYWNlIGZpbGUgaG9vayBmbiB0byBsb2FkIGFuZC9vciByZXBsYWNlIHBvbGljeSAqLworc3RhdGljIHNzaXplX3QgcHJvZmlsZV9yZXBsYWNlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwljaGFyICpkYXRhOworCXNzaXplX3QgZXJyb3I7CisKKwlkYXRhID0gYWFfc2ltcGxlX3dyaXRlX3RvX2J1ZmZlcihPUF9QUk9GX1JFUEwsIGJ1Ziwgc2l6ZSwgc2l6ZSwgcG9zKTsKKwllcnJvciA9IFBUUl9FUlIoZGF0YSk7CisJaWYgKCFJU19FUlIoZGF0YSkpIHsKKwkJZXJyb3IgPSBhYV9yZXBsYWNlX3Byb2ZpbGVzKGRhdGEsIHNpemUsIFBST0ZfUkVQTEFDRSk7CisJCWt2ZnJlZShkYXRhKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFhX2ZzX3Byb2ZpbGVfcmVwbGFjZSA9IHsKKwkud3JpdGUgPSBwcm9maWxlX3JlcGxhY2UKK307CisKKy8qIC5yZW1vdmUgZmlsZSBob29rIGZuIHRvIHJlbW92ZSBsb2FkZWQgcG9saWN5ICovCitzdGF0aWMgc3NpemVfdCBwcm9maWxlX3JlbW92ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwljaGFyICpkYXRhOworCXNzaXplX3QgZXJyb3I7CisKKwkvKgorCSAqIGFhX3JlbW92ZV9wcm9maWxlIG5lZWRzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzbyAxIGV4dHJhCisJICogYnl0ZSBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBjb3BpZWQgZGF0YSBpcyBudWxsIHRlcm1pbmF0ZWQuCisJICovCisJZGF0YSA9IGFhX3NpbXBsZV93cml0ZV90b19idWZmZXIoT1BfUFJPRl9STSwgYnVmLCBzaXplICsgMSwgc2l6ZSwgcG9zKTsKKworCWVycm9yID0gUFRSX0VSUihkYXRhKTsKKwlpZiAoIUlTX0VSUihkYXRhKSkgeworCQlkYXRhW3NpemVdID0gMDsKKwkJZXJyb3IgPSBhYV9yZW1vdmVfcHJvZmlsZXMoZGF0YSwgc2l6ZSk7CisJCWt2ZnJlZShkYXRhKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFhX2ZzX3Byb2ZpbGVfcmVtb3ZlID0geworCS53cml0ZSA9IHByb2ZpbGVfcmVtb3ZlCit9OworCisvKiogQmFzZSBmaWxlIHN5c3RlbSBzZXR1cCAqKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFhX2ZzX2RlbnRyeSBfX2luaXRkYXRhOworCitzdGF0aWMgdm9pZCBfX2luaXQgYWFmc19yZW1vdmUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBhYV9mc19kZW50cnksIHN0cmxlbihuYW1lKSk7CisJaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCQlzZWN1cml0eWZzX3JlbW92ZShkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJfQorfQorCisvKioKKyAqIGFhZnNfY3JlYXRlIC0gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBhcHBhcm1vciBmaWxlc3lzdGVtCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgZW50cnkgKE5PVCBOVUxMKQorICogQG1hc2s6IGZpbGUgcGVybWlzc2lvbiBtYXNrIG9mIHRoZSBmaWxlCisgKiBAZm9wczogZmlsZSBvcGVyYXRpb25zIGZvciB0aGUgZmlsZSAoTk9UIE5VTEwpCisgKgorICogVXNlZCBhYWZzX3JlbW92ZSB0byByZW1vdmUgZW50cmllcyBjcmVhdGVkIHdpdGggdGhpcyBmbi4KKyAqLworc3RhdGljIGludCBfX2luaXQgYWFmc19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG1hc2ssCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCWRlbnRyeSA9IHNlY3VyaXR5ZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IG1hc2ssIGFhX2ZzX2RlbnRyeSwKKwkJCQkJTlVMTCwgZm9wcyk7CisKKwlyZXR1cm4gSVNfRVJSKGRlbnRyeSkgPyBQVFJfRVJSKGRlbnRyeSkgOiAwOworfQorCisvKioKKyAqIGFhX2Rlc3Ryb3lfYWFmcyAtIGNsZWFudXAgYW5kIGZyZWUgYWFmcworICoKKyAqIHJlbGVhc2VzIGRlbnRyaWVzIGFsbG9jYXRlZCBieSBhYV9jcmVhdGVfYWFmcworICovCit2b2lkIF9faW5pdCBhYV9kZXN0cm95X2FhZnModm9pZCkKK3sKKwlpZiAoYWFfZnNfZGVudHJ5KSB7CisJCWFhZnNfcmVtb3ZlKCIucmVtb3ZlIik7CisJCWFhZnNfcmVtb3ZlKCIucmVwbGFjZSIpOworCQlhYWZzX3JlbW92ZSgiLmxvYWQiKTsKKworCQlzZWN1cml0eWZzX3JlbW92ZShhYV9mc19kZW50cnkpOworCQlhYV9mc19kZW50cnkgPSBOVUxMOworCX0KK30KKworLyoqCisgKiBhYV9jcmVhdGVfYWFmcyAtIGNyZWF0ZSB0aGUgYXBwYXJtb3Igc2VjdXJpdHkgZmlsZXN5c3RlbQorICoKKyAqIGRlbnRyaWVzIGNyZWF0ZWQgaGVyZSBhcmUgcmVsZWFzZWQgYnkgYWFfZGVzdHJveV9hYWZzCisgKgorICogUmV0dXJuczogZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgX19pbml0IGFhX2NyZWF0ZV9hYWZzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJaWYgKCFhcHBhcm1vcl9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWFfZnNfZGVudHJ5KSB7CisJCUFBX0VSUk9SKCIlczogQXBwQXJtb3Igc2VjdXJpdHlmcyBhbHJlYWR5IGV4aXN0c1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlhYV9mc19kZW50cnkgPSBzZWN1cml0eWZzX2NyZWF0ZV9kaXIoImFwcGFybW9yIiwgTlVMTCk7CisJaWYgKElTX0VSUihhYV9mc19kZW50cnkpKSB7CisJCWVycm9yID0gUFRSX0VSUihhYV9mc19kZW50cnkpOworCQlhYV9mc19kZW50cnkgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworCWVycm9yID0gYWFmc19jcmVhdGUoIi5sb2FkIiwgMDY0MCwgJmFhX2ZzX3Byb2ZpbGVfbG9hZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yOworCWVycm9yID0gYWFmc19jcmVhdGUoIi5yZXBsYWNlIiwgMDY0MCwgJmFhX2ZzX3Byb2ZpbGVfcmVwbGFjZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yOworCWVycm9yID0gYWFmc19jcmVhdGUoIi5yZW1vdmUiLCAwNjQwLCAmYWFfZnNfcHJvZmlsZV9yZW1vdmUpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjsKKworCS8qIFRPRE86IGFkZCBzdXBwb3J0IGZvciBhcHBhcm1vcmZzX251bGwgYW5kIGFwcGFybW9yZnNfbW50ICovCisKKwkvKiBSZXBvcnQgdGhhdCBBcHBBcm1vciBmcyBpcyBlbmFibGVkICovCisJYWFfaW5mb19tZXNzYWdlKCJBcHBBcm1vciBGaWxlc3lzdGVtIEVuYWJsZWQiKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJYWFfZGVzdHJveV9hYWZzKCk7CisJQUFfRVJST1IoIkVycm9yIGNyZWF0aW5nIEFwcEFybW9yIHNlY3VyaXR5ZnNcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworZnNfaW5pdGNhbGwoYWFfY3JlYXRlX2FhZnMpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvYXVkaXQuYyBiL3NlY3VyaXR5L2FwcGFybW9yL2F1ZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1MDJiMgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2F1ZGl0LmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgYXVkaXRpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL2FwcGFybW9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9hdWRpdC5oIgorI2luY2x1ZGUgImluY2x1ZGUvcG9saWN5LmgiCisKK2NvbnN0IGNoYXIgKm9wX3RhYmxlW10gPSB7CisJIm51bGwiLAorCisJInN5c2N0bCIsCisJImNhcGFibGUiLAorCisJInVubGluayIsCisJIm1rZGlyIiwKKwkicm1kaXIiLAorCSJta25vZCIsCisJInRydW5jYXRlIiwKKwkibGluayIsCisJInN5bWxpbmsiLAorCSJyZW5hbWVfc3JjIiwKKwkicmVuYW1lX2Rlc3QiLAorCSJjaG1vZCIsCisJImNob3duIiwKKwkiZ2V0YXR0ciIsCisJIm9wZW4iLAorCisJImZpbGVfcGVybSIsCisJImZpbGVfbG9jayIsCisJImZpbGVfbW1hcCIsCisJImZpbGVfbXByb3RlY3QiLAorCisJImNyZWF0ZSIsCisJInBvc3RfY3JlYXRlIiwKKwkiYmluZCIsCisJImNvbm5lY3QiLAorCSJsaXN0ZW4iLAorCSJhY2NlcHQiLAorCSJzZW5kbXNnIiwKKwkicmVjdm1zZyIsCisJImdldHNvY2tuYW1lIiwKKwkiZ2V0cGVlcm5hbWUiLAorCSJnZXRzb2Nrb3B0IiwKKwkic2V0c29ja29wdCIsCisJInNvY2tldF9zaHV0ZG93biIsCisKKwkicHRyYWNlIiwKKworCSJleGVjIiwKKwkiY2hhbmdlX2hhdCIsCisJImNoYW5nZV9wcm9maWxlIiwKKwkiY2hhbmdlX29uZXhlYyIsCisKKwkic2V0cHJvY2F0dHIiLAorCSJzZXRybGltaXQiLAorCisJInByb2ZpbGVfcmVwbGFjZSIsCisJInByb2ZpbGVfbG9hZCIsCisJInByb2ZpbGVfcmVtb3ZlIgorfTsKKworY29uc3QgY2hhciAqYXVkaXRfbW9kZV9uYW1lc1tdID0geworCSJub3JtYWwiLAorCSJxdWlldF9kZW5pZWQiLAorCSJxdWlldCIsCisJIm5vcXVpZXQiLAorCSJhbGwiCit9OworCitzdGF0aWMgY2hhciAqYWFfYXVkaXRfdHlwZVtdID0geworCSJBVURJVCIsCisJIkFMTE9XRUQiLAorCSJERU5JRUQiLAorCSJISU5UIiwKKwkiU1RBVFVTIiwKKwkiRVJST1IiLAorCSJLSUxMRUQiCit9OworCisvKgorICogQ3VycmVudGx5IEFwcEFybW9yIGF1ZGl0aW5nIGlzIGZlZCBzdHJhaWdodCBpbnRvIHRoZSBhdWRpdCBmcmFtZXdvcmsuCisgKgorICogVE9ETzoKKyAqIG5ldGxpbmsgaW50ZXJmYWNlIGZvciBjb21wbGFpbiBtb2RlCisgKiB1c2VyIGF1ZGl0aW5nLCAtIHNlbmQgdXNlciBhdWRpdGluZyB0byBuZXRsaW5rIGludGVyZmFjZQorICogc3lzdGVtIGNvbnRyb2wgb2Ygd2hldGhlciB1c2VyIGF1ZGl0IG1lc3NhZ2VzIGdvIHRvIHN5c3RlbSBsb2cKKyAqLworCisvKioKKyAqIGF1ZGl0X2Jhc2UgLSBjb3JlIEFwcEFybW9yIGZ1bmN0aW9uLgorICogQGFiOiBhdWRpdCBidWZmZXIgdG8gZmlsbCAoTk9UIE5VTEwpCisgKiBAY2E6IGF1ZGl0IHN0cnVjdHVyZSBjb250YWluaW5nIGRhdGEgdG8gYXVkaXQgKE5PVCBOVUxMKQorICoKKyAqIFJlY29yZCBjb21tb24gQXBwQXJtb3IgYXVkaXQgZGF0YSBmcm9tIEBzYQorICovCitzdGF0aWMgdm9pZCBhdWRpdF9wcmUoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHZvaWQgKmNhKQoreworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSAqc2EgPSBjYTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IHNhLT50c2sgPyBzYS0+dHNrIDogY3VycmVudDsKKworCWlmIChhYV9nX2F1ZGl0X2hlYWRlcikgeworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiYXBwYXJtb3I9Iik7CisJCWF1ZGl0X2xvZ19zdHJpbmcoYWIsIGFhX2F1ZGl0X3R5cGVbc2EtPmFhZC50eXBlXSk7CisJfQorCisJaWYgKHNhLT5hYWQub3ApIHsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBvcGVyYXRpb249Iik7CisJCWF1ZGl0X2xvZ19zdHJpbmcoYWIsIG9wX3RhYmxlW3NhLT5hYWQub3BdKTsKKwl9CisKKwlpZiAoc2EtPmFhZC5pbmZvKSB7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgaW5mbz0iKTsKKwkJYXVkaXRfbG9nX3N0cmluZyhhYiwgc2EtPmFhZC5pbmZvKTsKKwkJaWYgKHNhLT5hYWQuZXJyb3IpCisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGVycm9yPSVkIiwgc2EtPmFhZC5lcnJvcik7CisJfQorCisJaWYgKHNhLT5hYWQucHJvZmlsZSkgeworCQlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IHNhLT5hYWQucHJvZmlsZTsKKwkJcGlkX3QgcGlkOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXBpZCA9IHRzay0+cmVhbF9wYXJlbnQtPnBpZDsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgcGFyZW50PSVkIiwgcGlkKTsKKwkJaWYgKHByb2ZpbGUtPm5zICE9IHJvb3RfbnMpIHsKKwkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbmFtZXNwYWNlPSIpOworCQkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgcHJvZmlsZS0+bnMtPmJhc2UuaG5hbWUpOworCQl9CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgcHJvZmlsZT0iKTsKKwkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgcHJvZmlsZS0+YmFzZS5obmFtZSk7CisJfQorCisJaWYgKHNhLT5hYWQubmFtZSkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG5hbWU9Iik7CisJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIHNhLT5hYWQubmFtZSk7CisJfQorfQorCisvKioKKyAqIGFhX2F1ZGl0X21zZyAtIExvZyBhIG1lc3NhZ2UgdG8gdGhlIGF1ZGl0IHN1YnN5c3RlbQorICogQHNhOiBhdWRpdCBldmVudCBzdHJ1Y3R1cmUgKE5PVCBOVUxMKQorICogQGNiOiBvcHRpb25hbCBjYWxsYmFjayBmbiBmb3IgdHlwZSBzcGVjaWZpYyBmaWVsZHMgKE1BWUJFIE5VTEwpCisgKi8KK3ZvaWQgYWFfYXVkaXRfbXNnKGludCB0eXBlLCBzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKnNhLAorCQkgIHZvaWQgKCpjYikgKHN0cnVjdCBhdWRpdF9idWZmZXIgKiwgdm9pZCAqKSkKK3sKKwlzYS0+YWFkLnR5cGUgPSB0eXBlOworCXNhLT5sc21fcHJlX2F1ZGl0ID0gYXVkaXRfcHJlOworCXNhLT5sc21fcG9zdF9hdWRpdCA9IGNiOworCWNvbW1vbl9sc21fYXVkaXQoc2EpOworfQorCisvKioKKyAqIGFhX2F1ZGl0IC0gTG9nIGEgcHJvZmlsZSBiYXNlZCBhdWRpdCBldmVudCB0byB0aGUgYXVkaXQgc3Vic3lzdGVtCisgKiBAdHlwZTogYXVkaXQgdHlwZSBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBwcm9maWxlOiBwcm9maWxlIHRvIGNoZWNrIGFnYWluc3QgKE5PVCBOVUxMKQorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncyB0byB1c2UKKyAqIEBzYTogYXVkaXQgZXZlbnQgKE5PVCBOVUxMKQorICogQGNiOiBvcHRpb25hbCBjYWxsYmFjayBmbiBmb3IgdHlwZSBzcGVjaWZpYyBmaWVsZHMgKE1BWUJFIE5VTEwpCisgKgorICogSGFuZGxlIGRlZmF1bHQgbWVzc2FnZSBzd2l0Y2hpbmcgYmFzZWQgb2ZmIG9mIGF1ZGl0IG1vZGUgZmxhZ3MKKyAqCisgKiBSZXR1cm5zOiBlcnJvciBvbiBmYWlsdXJlCisgKi8KK2ludCBhYV9hdWRpdChpbnQgdHlwZSwgc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIGdmcF90IGdmcCwKKwkgICAgIHN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSAqc2EsCisJICAgICB2b2lkICgqY2IpIChzdHJ1Y3QgYXVkaXRfYnVmZmVyICosIHZvaWQgKikpCit7CisJQlVHX09OKCFwcm9maWxlKTsKKworCWlmICh0eXBlID09IEFVRElUX0FQUEFSTU9SX0FVVE8pIHsKKwkJaWYgKGxpa2VseSghc2EtPmFhZC5lcnJvcikpIHsKKwkJCWlmIChBVURJVF9NT0RFKHByb2ZpbGUpICE9IEFVRElUX0FMTCkKKwkJCQlyZXR1cm4gMDsKKwkJCXR5cGUgPSBBVURJVF9BUFBBUk1PUl9BVURJVDsKKwkJfSBlbHNlIGlmIChDT01QTEFJTl9NT0RFKHByb2ZpbGUpKQorCQkJdHlwZSA9IEFVRElUX0FQUEFSTU9SX0FMTE9XRUQ7CisJCWVsc2UKKwkJCXR5cGUgPSBBVURJVF9BUFBBUk1PUl9ERU5JRUQ7CisJfQorCWlmIChBVURJVF9NT0RFKHByb2ZpbGUpID09IEFVRElUX1FVSUVUIHx8CisJICAgICh0eXBlID09IEFVRElUX0FQUEFSTU9SX0RFTklFRCAmJgorCSAgICAgQVVESVRfTU9ERShwcm9maWxlKSA9PSBBVURJVF9RVUlFVCkpCisJCXJldHVybiBzYS0+YWFkLmVycm9yOworCisJaWYgKEtJTExfTU9ERShwcm9maWxlKSAmJiB0eXBlID09IEFVRElUX0FQUEFSTU9SX0RFTklFRCkKKwkJdHlwZSA9IEFVRElUX0FQUEFSTU9SX0tJTEw7CisKKwlpZiAoIXVuY29uZmluZWQocHJvZmlsZSkpCisJCXNhLT5hYWQucHJvZmlsZSA9IHByb2ZpbGU7CisKKwlhYV9hdWRpdF9tc2codHlwZSwgc2EsIGNiKTsKKworCWlmIChzYS0+YWFkLnR5cGUgPT0gQVVESVRfQVBQQVJNT1JfS0lMTCkKKwkJKHZvaWQpc2VuZF9zaWdfaW5mbyhTSUdLSUxMLCBOVUxMLCBzYS0+dHNrID8gc2EtPnRzayA6IGN1cnJlbnQpOworCisJaWYgKHNhLT5hYWQudHlwZSA9PSBBVURJVF9BUFBBUk1PUl9BTExPV0VEKQorCQlyZXR1cm4gY29tcGxhaW5fZXJyb3Ioc2EtPmFhZC5lcnJvcik7CisKKwlyZXR1cm4gc2EtPmFhZC5lcnJvcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2NhcGFiaWxpdHkuYyBiL3NlY3VyaXR5L2FwcGFybW9yL2NhcGFiaWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgyYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvY2FwYWJpbGl0eS5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGNhcGFiaWxpdHkgbWVkaWF0aW9uIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvYXBwYXJtb3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2NhcGFiaWxpdHkuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorI2luY2x1ZGUgImluY2x1ZGUvYXVkaXQuaCIKKworLyoKKyAqIFRhYmxlIG9mIGNhcGFiaWxpdHkgbmFtZXM6IHdlIGdlbmVyYXRlIGl0IGZyb20gY2FwYWJpbGl0aWVzLmguCisgKi8KKyNpbmNsdWRlICJjYXBhYmlsaXR5X25hbWVzLmgiCisKK3N0cnVjdCBhdWRpdF9jYWNoZSB7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJa2VybmVsX2NhcF90IGNhcHM7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGF1ZGl0X2NhY2hlLCBhdWRpdF9jYWNoZSk7CisKKy8qKgorICogYXVkaXRfY2IgLSBjYWxsIGJhY2sgZm9yIGNhcGFiaWxpdHkgY29tcG9uZW50cyBvZiBhdWRpdCBzdHJ1Y3QKKyAqIEBhYiAtIGF1ZGl0IGJ1ZmZlciAgIChOT1QgTlVMTCkKKyAqIEB2YSAtIGF1ZGl0IHN0cnVjdCB0byBhdWRpdCBkYXRhIGZyb20gIChOT1QgTlVMTCkKKyAqLworc3RhdGljIHZvaWQgYXVkaXRfY2Ioc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHZvaWQgKnZhKQoreworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSAqc2EgPSB2YTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGNhcG5hbWU9Iik7CisJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgY2FwYWJpbGl0eV9uYW1lc1tzYS0+dS5jYXBdKTsKK30KKworLyoqCisgKiBhdWRpdF9jYXBzIC0gYXVkaXQgYSBjYXBhYmlsaXR5CisgKiBAcHJvZmlsZTogcHJvZmlsZSBjb25maW5pbmcgdGFzayAoTk9UIE5VTEwpCisgKiBAdGFzazogdGFzayBjYXBhYmlsaXR5IHRlc3Qgd2FzIHBlcmZvcm1lZCBhZ2FpbnN0IChOT1QgTlVMTCkKKyAqIEBjYXA6IGNhcGFiaWxpdHkgdGVzdGVkCisgKiBAZXJyb3I6IGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgdGVzdAorICoKKyAqIERvIGF1ZGl0aW5nIG9mIGNhcGFiaWxpdHkgYW5kIGhhbmRsZSwgYXVkaXQvY29tcGxhaW4va2lsbCBtb2RlcyBzd2l0Y2hpbmcKKyAqIGFuZCBkdXBsaWNhdGUgbWVzc2FnZSBlbGltaW5hdGlvbi4KKyAqCisgKiBSZXR1cm5zOiAwIG9yIHNhLT5lcnJvciBvbiBzdWNjZXNzLCAgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYXVkaXRfY2FwcyhzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICAgICBpbnQgY2FwLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGF1ZGl0X2NhY2hlICplbnQ7CisJaW50IHR5cGUgPSBBVURJVF9BUFBBUk1PUl9BVVRPOworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBzYTsKKwlDT01NT05fQVVESVRfREFUQV9JTklUKCZzYSwgQ0FQKTsKKwlzYS50c2sgPSB0YXNrOworCXNhLnUuY2FwID0gY2FwOworCXNhLmFhZC5vcCA9IE9QX0NBUEFCTEU7CisJc2EuYWFkLmVycm9yID0gZXJyb3I7CisKKwlpZiAobGlrZWx5KCFlcnJvcikpIHsKKwkJLyogdGVzdCBpZiBhdWRpdGluZyBpcyBiZWluZyBmb3JjZWQgKi8KKwkJaWYgKGxpa2VseSgoQVVESVRfTU9ERShwcm9maWxlKSAhPSBBVURJVF9BTEwpICYmCisJCQkgICAhY2FwX3JhaXNlZChwcm9maWxlLT5jYXBzLmF1ZGl0LCBjYXApKSkKKwkJCXJldHVybiAwOworCQl0eXBlID0gQVVESVRfQVBQQVJNT1JfQVVESVQ7CisJfSBlbHNlIGlmIChLSUxMX01PREUocHJvZmlsZSkgfHwKKwkJICAgY2FwX3JhaXNlZChwcm9maWxlLT5jYXBzLmtpbGwsIGNhcCkpIHsKKwkJdHlwZSA9IEFVRElUX0FQUEFSTU9SX0tJTEw7CisJfSBlbHNlIGlmIChjYXBfcmFpc2VkKHByb2ZpbGUtPmNhcHMucXVpZXQsIGNhcCkgJiYKKwkJICAgQVVESVRfTU9ERShwcm9maWxlKSAhPSBBVURJVF9OT1FVSUVUICYmCisJCSAgIEFVRElUX01PREUocHJvZmlsZSkgIT0gQVVESVRfQUxMKSB7CisJCS8qIHF1aWV0IGF1ZGl0aW5nICovCisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKiBEbyBzaW1wbGUgZHVwbGljYXRlIG1lc3NhZ2UgZWxpbWluYXRpb24gKi8KKwllbnQgPSAmZ2V0X2NwdV92YXIoYXVkaXRfY2FjaGUpOworCWlmIChwcm9maWxlID09IGVudC0+cHJvZmlsZSAmJiBjYXBfcmFpc2VkKGVudC0+Y2FwcywgY2FwKSkgeworCQlwdXRfY3B1X3ZhcihhdWRpdF9jYWNoZSk7CisJCWlmIChDT01QTEFJTl9NT0RFKHByb2ZpbGUpKQorCQkJcmV0dXJuIGNvbXBsYWluX2Vycm9yKGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0gZWxzZSB7CisJCWFhX3B1dF9wcm9maWxlKGVudC0+cHJvZmlsZSk7CisJCWVudC0+cHJvZmlsZSA9IGFhX2dldF9wcm9maWxlKHByb2ZpbGUpOworCQljYXBfcmFpc2UoZW50LT5jYXBzLCBjYXApOworCX0KKwlwdXRfY3B1X3ZhcihhdWRpdF9jYWNoZSk7CisKKwlyZXR1cm4gYWFfYXVkaXQodHlwZSwgcHJvZmlsZSwgR0ZQX0FUT01JQywgJnNhLCBhdWRpdF9jYik7Cit9CisKKy8qKgorICogcHJvZmlsZV9jYXBhYmxlIC0gdGVzdCBpZiBwcm9maWxlIGFsbG93cyB1c2Ugb2YgY2FwYWJpbGl0eSBAY2FwCisgKiBAcHJvZmlsZTogcHJvZmlsZSBiZWluZyBlbmZvcmNlZCAgICAoTk9UIE5VTEwsIE5PVCB1bmNvbmZpbmVkKQorICogQGNhcDogY2FwYWJpbGl0eSB0byB0ZXN0IGlmIGFsbG93ZWQKKyAqCisgKiBSZXR1cm5zOiAwIGlmIGFsbG93ZWQgZWxzZSAtRVBFUk0KKyAqLworc3RhdGljIGludCBwcm9maWxlX2NhcGFibGUoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIGludCBjYXApCit7CisJcmV0dXJuIGNhcF9yYWlzZWQocHJvZmlsZS0+Y2Fwcy5hbGxvdywgY2FwKSA/IDAgOiAtRVBFUk07Cit9CisKKy8qKgorICogYWFfY2FwYWJsZSAtIHRlc3QgcGVybWlzc2lvbiB0byB1c2UgY2FwYWJpbGl0eQorICogQHRhc2s6IHRhc2sgZG9pbmcgY2FwYWJpbGl0eSB0ZXN0IGFnYWluc3QgKE5PVCBOVUxMKQorICogQHByb2ZpbGU6IHByb2ZpbGUgY29uZmluaW5nIEB0YXNrIChOT1QgTlVMTCkKKyAqIEBjYXA6IGNhcGFiaWxpdHkgdG8gYmUgdGVzdGVkCisgKiBAYXVkaXQ6IHdoZXRoZXIgYW4gYXVkaXQgcmVjb3JkIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyAqCisgKiBMb29rIHVwIGNhcGFiaWxpdHkgaW4gcHJvZmlsZSBjYXBhYmlsaXR5IHNldC4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG9yIGVsc2UgYW4gZXJyb3IgY29kZS4KKyAqLworaW50IGFhX2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgaW50IGNhcCwKKwkgICAgICAgaW50IGF1ZGl0KQoreworCWludCBlcnJvciA9IHByb2ZpbGVfY2FwYWJsZShwcm9maWxlLCBjYXApOworCisJaWYgKCFhdWRpdCkgeworCQlpZiAoQ09NUExBSU5fTU9ERShwcm9maWxlKSkKKwkJCXJldHVybiBjb21wbGFpbl9lcnJvcihlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gYXVkaXRfY2Fwcyhwcm9maWxlLCB0YXNrLCBjYXAsIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2NvbnRleHQuYyBiL3NlY3VyaXR5L2FwcGFybW9yL2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTliNTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvY29udGV4dC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGZ1bmN0aW9ucyB1c2VkIHRvIG1hbmlwdWxhdGUgb2JqZWN0IHNlY3VyaXR5CisgKiBjb250ZXh0cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqCisgKgorICogQXBwQXJtb3Igc2V0cyBjb25maW5lbWVudCBvbiBldmVyeSB0YXNrLCB2aWEgdGhlIHRoZSBhYV90YXNrX2N4dCBhbmQKKyAqIHRoZSBhYV90YXNrX2N4dC5wcm9maWxlLCBib3RoIG9mIHdoaWNoIGFyZSByZXF1aXJlZCBhbmQgYXJlIG5vdCBhbGxvd2VkCisgKiB0byBiZSBOVUxMLiAgVGhlIGFhX3Rhc2tfY3h0IGlzIG5vdCByZWZlcmVuY2UgY291bnRlZCBhbmQgaXMgdW5pcXVlCisgKiB0byBlYWNoIGNyZWQgKHdoaWNoIGlzIHJlZmVyZW5jZSBjb3VudCkuICBUaGUgcHJvZmlsZSBwb2ludGVkIHRvIGJ5CisgKiB0aGUgdGFza19jeHQgaXMgcmVmZXJlbmNlIGNvdW50ZWQuCisgKgorICogVE9ETworICogSWYgYSB0YXNrIHVzZXMgY2hhbmdlX2hhdCBpdCBjdXJyZW50bHkgZG9lcyBub3QgcmV0dXJuIHRvIHRoZSBvbGQKKyAqIGNyZWQgb3IgdGFzayBjb250ZXh0IGJ1dCBpbnN0ZWFkIGNyZWF0ZXMgYSBuZXcgb25lLiAgSWRlYWxseSB0aGUgdGFzaworICogc2hvdWxkIHJldHVybiB0byB0aGUgcHJldmlvdXMgY3JlZCBpZiBpdCBoYXMgbm90IGJlZW4gbW9kaWZpZWQuCisgKgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorCisvKioKKyAqIGFhX2FsbG9jX3Rhc2tfY29udGV4dCAtIGFsbG9jYXRlIGEgbmV3IHRhc2tfY3h0CisgKiBAZmxhZ3M6IGdmcCBmbGFncyBmb3IgYWxsb2NhdGlvbgorICoKKyAqIFJldHVybnM6IGFsbG9jYXRlZCBidWZmZXIgb3IgTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBhYV90YXNrX2N4dCAqYWFfYWxsb2NfdGFza19jb250ZXh0KGdmcF90IGZsYWdzKQoreworCXJldHVybiBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWFfdGFza19jeHQpLCBmbGFncyk7Cit9CisKKy8qKgorICogYWFfZnJlZV90YXNrX2NvbnRleHQgLSBmcmVlIGEgdGFza19jeHQKKyAqIEBjeHQ6IHRhc2tfY3h0IHRvIGZyZWUgKE1BWUJFIE5VTEwpCisgKi8KK3ZvaWQgYWFfZnJlZV90YXNrX2NvbnRleHQoc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQpCit7CisJaWYgKGN4dCkgeworCQlhYV9wdXRfcHJvZmlsZShjeHQtPnByb2ZpbGUpOworCQlhYV9wdXRfcHJvZmlsZShjeHQtPnByZXZpb3VzKTsKKwkJYWFfcHV0X3Byb2ZpbGUoY3h0LT5vbmV4ZWMpOworCisJCWt6ZnJlZShjeHQpOworCX0KK30KKworLyoqCisgKiBhYV9kdXBfdGFza19jb250ZXh0IC0gZHVwbGljYXRlIGEgdGFzayBjb250ZXh0LCBpbmNyZW1lbnRpbmcgcmVmZXJlbmNlIGNvdW50cworICogQG5ldzogYSBibGFuayB0YXNrIGNvbnRleHQgICAgICAoTk9UIE5VTEwpCisgKiBAb2xkOiB0aGUgdGFzayBjb250ZXh0IHRvIGNvcHkgIChOT1QgTlVMTCkKKyAqLwordm9pZCBhYV9kdXBfdGFza19jb250ZXh0KHN0cnVjdCBhYV90YXNrX2N4dCAqbmV3LCBjb25zdCBzdHJ1Y3QgYWFfdGFza19jeHQgKm9sZCkKK3sKKwkqbmV3ID0gKm9sZDsKKwlhYV9nZXRfcHJvZmlsZShuZXctPnByb2ZpbGUpOworCWFhX2dldF9wcm9maWxlKG5ldy0+cHJldmlvdXMpOworCWFhX2dldF9wcm9maWxlKG5ldy0+b25leGVjKTsKK30KKworLyoqCisgKiBhYV9yZXBsYWNlX2N1cnJlbnRfcHJvZmlsZSAtIHJlcGxhY2UgdGhlIGN1cnJlbnQgdGFza3MgcHJvZmlsZXMKKyAqIEBwcm9maWxlOiBuZXcgcHJvZmlsZSAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IDAgb3IgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgYWFfcmVwbGFjZV9jdXJyZW50X3Byb2ZpbGUoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQgPSBjdXJyZW50X2NyZWQoKS0+c2VjdXJpdHk7CisJc3RydWN0IGNyZWQgKm5ldzsKKwlCVUdfT04oIXByb2ZpbGUpOworCisJaWYgKGN4dC0+cHJvZmlsZSA9PSBwcm9maWxlKQorCQlyZXR1cm4gMDsKKworCW5ldyAgPSBwcmVwYXJlX2NyZWRzKCk7CisJaWYgKCFuZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJY3h0ID0gbmV3LT5zZWN1cml0eTsKKwlpZiAodW5jb25maW5lZChwcm9maWxlKSB8fCAoY3h0LT5wcm9maWxlLT5ucyAhPSBwcm9maWxlLT5ucykpIHsKKwkJLyogaWYgc3dpdGNoaW5nIHRvIHVuY29uZmluZWQgb3IgYSBkaWZmZXJlbnQgcHJvZmlsZSBuYW1lc3BhY2UKKwkJICogY2xlYXIgb3V0IGNvbnRleHQgc3RhdGUKKwkJICovCisJCWFhX3B1dF9wcm9maWxlKGN4dC0+cHJldmlvdXMpOworCQlhYV9wdXRfcHJvZmlsZShjeHQtPm9uZXhlYyk7CisJCWN4dC0+cHJldmlvdXMgPSBOVUxMOworCQljeHQtPm9uZXhlYyA9IE5VTEw7CisJCWN4dC0+dG9rZW4gPSAwOworCX0KKwkvKiBiZSBjYXJlZnVsIHN3aXRjaGluZyBjeHQtPnByb2ZpbGUsIHdoZW4gcmFjaW5nIHJlcGxhY2VtZW50IGl0CisJICogaXMgcG9zc2libGUgdGhhdCBjeHQtPnByb2ZpbGUtPnJlcGxhY2VkYnkgaXMgdGhlIHJlZmVyZW5jZSBrZWVwaW5nCisJICogQHByb2ZpbGUgdmFsaWQsIHNvIG1ha2Ugc3VyZSB0byBnZXQgaXRzIHJlZmVyZW5jZSBiZWZvcmUgZHJvcHBpbmcKKwkgKiB0aGUgcmVmZXJlbmNlIG9uIGN4dC0+cHJvZmlsZSAqLworCWFhX2dldF9wcm9maWxlKHByb2ZpbGUpOworCWFhX3B1dF9wcm9maWxlKGN4dC0+cHJvZmlsZSk7CisJY3h0LT5wcm9maWxlID0gcHJvZmlsZTsKKworCWNvbW1pdF9jcmVkcyhuZXcpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFhX3NldF9jdXJyZW50X29uZXhlYyAtIHNldCB0aGUgdGFza3MgY2hhbmdlX3Byb2ZpbGUgdG8gaGFwcGVuIG9uZXhlYworICogQHByb2ZpbGU6IHN5c3RlbSBwcm9maWxlIHRvIHNldCBhdCBleGVjICAoTUFZQkUgTlVMTCB0byBjbGVhciB2YWx1ZSkKKyAqCisgKiBSZXR1cm5zOiAwIG9yIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGFhX3NldF9jdXJyZW50X29uZXhlYyhzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dDsKKwlzdHJ1Y3QgY3JlZCAqbmV3ID0gcHJlcGFyZV9jcmVkcygpOworCWlmICghbmV3KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN4dCA9IG5ldy0+c2VjdXJpdHk7CisJYWFfZ2V0X3Byb2ZpbGUocHJvZmlsZSk7CisJYWFfcHV0X3Byb2ZpbGUoY3h0LT5vbmV4ZWMpOworCWN4dC0+b25leGVjID0gcHJvZmlsZTsKKworCWNvbW1pdF9jcmVkcyhuZXcpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFhX3NldF9jdXJyZW50X2hhdCAtIHNldCB0aGUgY3VycmVudCB0YXNrcyBoYXQKKyAqIEBwcm9maWxlOiBwcm9maWxlIHRvIHNldCBhcyB0aGUgY3VycmVudCBoYXQgIChOT1QgTlVMTCkKKyAqIEB0b2tlbjogdG9rZW4gdmFsdWUgdGhhdCBtdXN0IGJlIHNwZWNpZmllZCB0byBjaGFuZ2UgZnJvbSB0aGUgaGF0CisgKgorICogRG8gc3dpdGNoIG9mIHRhc2tzIGhhdC4gIElmIHRoZSB0YXNrIGlzIGN1cnJlbnRseSBpbiBhIGhhdAorICogdmFsaWRhdGUgdGhlIHRva2VuIHRvIG1hdGNoLgorICoKKyAqIFJldHVybnM6IDAgb3IgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgYWFfc2V0X2N1cnJlbnRfaGF0KHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlLCB1NjQgdG9rZW4pCit7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQ7CisJc3RydWN0IGNyZWQgKm5ldyA9IHByZXBhcmVfY3JlZHMoKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIC1FTk9NRU07CisJQlVHX09OKCFwcm9maWxlKTsKKworCWN4dCA9IG5ldy0+c2VjdXJpdHk7CisJaWYgKCFjeHQtPnByZXZpb3VzKSB7CisJCS8qIHRyYW5zZmVyIHJlZmNvdW50ICovCisJCWN4dC0+cHJldmlvdXMgPSBjeHQtPnByb2ZpbGU7CisJCWN4dC0+dG9rZW4gPSB0b2tlbjsKKwl9IGVsc2UgaWYgKGN4dC0+dG9rZW4gPT0gdG9rZW4pIHsKKwkJYWFfcHV0X3Byb2ZpbGUoY3h0LT5wcm9maWxlKTsKKwl9IGVsc2UgeworCQkvKiBwcmV2aW91c19wcm9maWxlICYmIGN4dC0+dG9rZW4gIT0gdG9rZW4gKi8KKwkJYWJvcnRfY3JlZHMobmV3KTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCWN4dC0+cHJvZmlsZSA9IGFhX2dldF9wcm9maWxlKGFhX25ld2VzdF92ZXJzaW9uKHByb2ZpbGUpKTsKKwkvKiBjbGVhciBleGVjIG9uIHN3aXRjaGluZyBjb250ZXh0ICovCisJYWFfcHV0X3Byb2ZpbGUoY3h0LT5vbmV4ZWMpOworCWN4dC0+b25leGVjID0gTlVMTDsKKworCWNvbW1pdF9jcmVkcyhuZXcpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFhX3Jlc3RvcmVfcHJldmlvdXNfcHJvZmlsZSAtIGV4aXQgZnJvbSBoYXQgY29udGV4dCByZXN0b3JpbmcgdGhlIHByb2ZpbGUKKyAqIEB0b2tlbjogdGhlIHRva2VuIHRoYXQgbXVzdCBiZSBtYXRjaGVkIHRvIGV4aXQgaGF0IGNvbnRleHQKKyAqCisgKiBBdHRlbXB0IHRvIHJldHVybiBvdXQgb2YgYSBoYXQgdG8gdGhlIHByZXZpb3VzIHByb2ZpbGUuICBUaGUgdG9rZW4KKyAqIG11c3QgbWF0Y2ggdGhlIHN0b3JlZCB0b2tlbiB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zOiAwIG9yIGVycm9yIG9mIGZhaWx1cmUKKyAqLworaW50IGFhX3Jlc3RvcmVfcHJldmlvdXNfcHJvZmlsZSh1NjQgdG9rZW4pCit7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQ7CisJc3RydWN0IGNyZWQgKm5ldyA9IHByZXBhcmVfY3JlZHMoKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljeHQgPSBuZXctPnNlY3VyaXR5OworCWlmIChjeHQtPnRva2VuICE9IHRva2VuKSB7CisJCWFib3J0X2NyZWRzKG5ldyk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwkvKiBpZ25vcmUgcmVzdG9yZXMgd2hlbiB0aGVyZSBpcyBubyBzYXZlZCBwcm9maWxlICovCisJaWYgKCFjeHQtPnByZXZpb3VzKSB7CisJCWFib3J0X2NyZWRzKG5ldyk7CisJCXJldHVybiAwOworCX0KKworCWFhX3B1dF9wcm9maWxlKGN4dC0+cHJvZmlsZSk7CisJY3h0LT5wcm9maWxlID0gYWFfbmV3ZXN0X3ZlcnNpb24oY3h0LT5wcmV2aW91cyk7CisJQlVHX09OKCFjeHQtPnByb2ZpbGUpOworCWlmICh1bmxpa2VseShjeHQtPnByb2ZpbGUgIT0gY3h0LT5wcmV2aW91cykpIHsKKwkJYWFfZ2V0X3Byb2ZpbGUoY3h0LT5wcm9maWxlKTsKKwkJYWFfcHV0X3Byb2ZpbGUoY3h0LT5wcmV2aW91cyk7CisJfQorCS8qIGNsZWFyIGV4ZWMgJiYgcHJldiBpbmZvcm1hdGlvbiB3aGVuIHJlc3RvcmluZyB0byBwcmV2aW91cyBjb250ZXh0ICovCisJY3h0LT5wcmV2aW91cyA9IE5VTEw7CisJY3h0LT50b2tlbiA9IDA7CisJYWFfcHV0X3Byb2ZpbGUoY3h0LT5vbmV4ZWMpOworCWN4dC0+b25leGVjID0gTlVMTDsKKworCWNvbW1pdF9jcmVkcyhuZXcpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvZG9tYWluLmMgYi9zZWN1cml0eS9hcHBhcm1vci9kb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI1YzZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvZG9tYWluLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgcG9saWN5IGF0dGFjaG1lbnQgYW5kIGRvbWFpbiB0cmFuc2l0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL2F1ZGl0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9hcHBhcm1vcmZzLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9kb21haW4uaCIKKyNpbmNsdWRlICJpbmNsdWRlL2ZpbGUuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2lwYy5oIgorI2luY2x1ZGUgImluY2x1ZGUvbWF0Y2guaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BhdGguaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorCisvKioKKyAqIGFhX2ZyZWVfZG9tYWluX2VudHJpZXMgLSBmcmVlIGVudHJpZXMgaW4gYSBkb21haW4gdGFibGUKKyAqIEBkb21haW46IHRoZSBkb21haW4gdGFibGUgdG8gZnJlZSAgKE1BWUJFIE5VTEwpCisgKi8KK3ZvaWQgYWFfZnJlZV9kb21haW5fZW50cmllcyhzdHJ1Y3QgYWFfZG9tYWluICpkb21haW4pCit7CisJaW50IGk7CisJaWYgKGRvbWFpbikgeworCQlpZiAoIWRvbWFpbi0+dGFibGUpCisJCQlyZXR1cm47CisKKwkJZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+c2l6ZTsgaSsrKQorCQkJa3pmcmVlKGRvbWFpbi0+dGFibGVbaV0pOworCQlremZyZWUoZG9tYWluLT50YWJsZSk7CisJCWRvbWFpbi0+dGFibGUgPSBOVUxMOworCX0KK30KKworLyoqCisgKiBtYXlfY2hhbmdlX3B0cmFjZWRfZG9tYWluIC0gY2hlY2sgaWYgY2FuIGNoYW5nZSBwcm9maWxlIG9uIHB0cmFjZWQgdGFzaworICogQHRhc2s6IHRhc2sgd2Ugd2FudCB0byBjaGFuZ2UgcHJvZmlsZSBvZiAgIChOT1QgTlVMTCkKKyAqIEB0b19wcm9maWxlOiBwcm9maWxlIHRvIGNoYW5nZSB0byAgKE5PVCBOVUxMKQorICoKKyAqIENoZWNrIGlmIHRoZSB0YXNrIGlzIHB0cmFjZWQgYW5kIGlmIHNvIGlmIHRoZSB0cmFjaW5nIHRhc2sgaXMgYWxsb3dlZAorICogdG8gdHJhY2UgdGhlIG5ldyBkb21haW4KKyAqCisgKiBSZXR1cm5zOiAlMCBvciBlcnJvciBpZiBjaGFuZ2Ugbm90IGFsbG93ZWQKKyAqLworc3RhdGljIGludCBtYXlfY2hhbmdlX3B0cmFjZWRfZG9tYWluKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgIHN0cnVjdCBhYV9wcm9maWxlICp0b19wcm9maWxlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHJhY2VyOworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gTlVMTDsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqdHJhY2VycCA9IE5VTEw7CisJaW50IGVycm9yID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwl0cmFjZXIgPSB0cmFjZWhvb2tfdHJhY2VyX3Rhc2sodGFzayk7CisJaWYgKHRyYWNlcikgeworCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQljcmVkID0gZ2V0X3Rhc2tfY3JlZCh0cmFjZXIpOworCQl0cmFjZXJwID0gYWFfY3JlZF9wcm9maWxlKGNyZWQpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCS8qIG5vdCBwdHJhY2VkICovCisJaWYgKCF0cmFjZXIgfHwgdW5jb25maW5lZCh0cmFjZXJwKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGFhX21heV9wdHJhY2UodHJhY2VyLCB0cmFjZXJwLCB0b19wcm9maWxlLCBQVFJBQ0VfTU9ERV9BVFRBQ0gpOworCitvdXQ6CisJaWYgKGNyZWQpCisJCXB1dF9jcmVkKGNyZWQpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGNoYW5nZV9wcm9maWxlX3Blcm1zIC0gZmluZCBwZXJtaXNzaW9ucyBmb3IgY2hhbmdlX3Byb2ZpbGUKKyAqIEBwcm9maWxlOiB0aGUgY3VycmVudCBwcm9maWxlICAoTk9UIE5VTEwpCisgKiBAbnM6IHRoZSBuYW1lc3BhY2UgYmVpbmcgc3dpdGNoZWQgdG8gIChOT1QgTlVMTCkKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvZmlsZSB0byBjaGFuZ2UgdG8gIChOT1QgTlVMTCkKKyAqIEByZXF1ZXN0OiByZXF1ZXN0ZWQgcGVybXMKKyAqIEBzdGFydDogc3RhdGUgdG8gc3RhcnQgbWF0Y2hpbmcgaW4KKyAqCisgKiBSZXR1cm5zOiBwZXJtaXNzaW9uIHNldAorICovCitzdGF0aWMgc3RydWN0IGZpbGVfcGVybXMgY2hhbmdlX3Byb2ZpbGVfcGVybXMoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsCisJCQkJCSAgICAgIHN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCB1MzIgcmVxdWVzdCwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHN0YXJ0KQoreworCXN0cnVjdCBmaWxlX3Blcm1zIHBlcm1zOworCXN0cnVjdCBwYXRoX2NvbmQgY29uZCA9IHsgfTsKKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisKKwlpZiAodW5jb25maW5lZChwcm9maWxlKSkgeworCQlwZXJtcy5hbGxvdyA9IEFBX01BWV9DSEFOR0VfUFJPRklMRSB8IEFBX01BWV9PTkVYRUM7CisJCXBlcm1zLmF1ZGl0ID0gcGVybXMucXVpZXQgPSBwZXJtcy5raWxsID0gMDsKKwkJcmV0dXJuIHBlcm1zOworCX0gZWxzZSBpZiAoIXByb2ZpbGUtPmZpbGUuZGZhKSB7CisJCXJldHVybiBudWxscGVybXM7CisJfSBlbHNlIGlmICgobnMgPT0gcHJvZmlsZS0+bnMpKSB7CisJCS8qIHRyeSBtYXRjaGluZyBhZ2FpbnN0IHJ1bGVzIHdpdGggb3V0IG5hbWVzcGFjZSBwcmVwZW5kZWQgKi8KKwkJYWFfc3RyX3Blcm1zKHByb2ZpbGUtPmZpbGUuZGZhLCBzdGFydCwgbmFtZSwgJmNvbmQsICZwZXJtcyk7CisJCWlmIChDT01CSU5FRF9QRVJNX01BU0socGVybXMpICYgcmVxdWVzdCkKKwkJCXJldHVybiBwZXJtczsKKwl9CisKKwkvKiB0cnkgbWF0Y2hpbmcgd2l0aCBuYW1lc3BhY2UgbmFtZSBhbmQgdGhlbiBwcm9maWxlICovCisJc3RhdGUgPSBhYV9kZmFfbWF0Y2gocHJvZmlsZS0+ZmlsZS5kZmEsIHN0YXJ0LCBucy0+YmFzZS5uYW1lKTsKKwlzdGF0ZSA9IGFhX2RmYV9tYXRjaF9sZW4ocHJvZmlsZS0+ZmlsZS5kZmEsIHN0YXRlLCAiOiIsIDEpOworCWFhX3N0cl9wZXJtcyhwcm9maWxlLT5maWxlLmRmYSwgc3RhdGUsIG5hbWUsICZjb25kLCAmcGVybXMpOworCisJcmV0dXJuIHBlcm1zOworfQorCisvKioKKyAqIF9fYXR0YWNoX21hdGNoXyAtIGZpbmQgYW4gYXR0YWNobWVudCBtYXRjaAorICogQG5hbWUgLSB0byBtYXRjaCBhZ2FpbnN0ICAoTk9UIE5VTEwpCisgKiBAaGVhZCAtIHByb2ZpbGUgbGlzdCB0byB3YWxrICAoTk9UIE5VTEwpCisgKgorICogRG8gYSBsaW5lYXIgc2VhcmNoIG9uIHRoZSBwcm9maWxlcyBpbiB0aGUgbGlzdC4gIFRoZXJlIGlzIGEgbWF0Y2hpbmcKKyAqIHByZWZlcmVuY2Ugd2hlcmUgYW4gZXhhY3QgbWF0Y2ggaXMgcHJlZmVycmVkIG92ZXIgYSBuYW1lIHdoaWNoIHVzZXMKKyAqIGV4cHJlc3Npb25zIHRvIG1hdGNoLCBhbmQgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgd2l0aCB0aGUgZ3JlYXRlc3QKKyAqIHhtYXRjaF9sZW4gYXJlIHByZWZlcnJlZC4KKyAqCisgKiBSZXF1aXJlczogQGhlYWQgbm90IGJlIHNoYXJlZCBvciBoYXZlIGFwcHJvcHJpYXRlIGxvY2tzIGhlbGQKKyAqCisgKiBSZXR1cm5zOiBwcm9maWxlIG9yIE5VTEwgaWYgbm8gbWF0Y2ggZm91bmQKKyAqLworc3RhdGljIHN0cnVjdCBhYV9wcm9maWxlICpfX2F0dGFjaF9tYXRjaChjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpbnQgbGVuID0gMDsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgKmNhbmRpZGF0ZSA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2ZpbGUsIGhlYWQsIGJhc2UubGlzdCkgeworCQlpZiAocHJvZmlsZS0+ZmxhZ3MgJiBQRkxBR19OVUxMKQorCQkJY29udGludWU7CisJCWlmIChwcm9maWxlLT54bWF0Y2ggJiYgcHJvZmlsZS0+eG1hdGNoX2xlbiA+IGxlbikgeworCQkJdW5zaWduZWQgaW50IHN0YXRlID0gYWFfZGZhX21hdGNoKHByb2ZpbGUtPnhtYXRjaCwKKwkJCQkJCQkgIERGQV9TVEFSVCwgbmFtZSk7CisJCQl1MzIgcGVybSA9IGRmYV91c2VyX2FsbG93KHByb2ZpbGUtPnhtYXRjaCwgc3RhdGUpOworCQkJLyogYW55IGFjY2VwdGluZyBzdGF0ZSBtZWFucyBhIHZhbGlkIG1hdGNoLiAqLworCQkJaWYgKHBlcm0gJiBNQVlfRVhFQykgeworCQkJCWNhbmRpZGF0ZSA9IHByb2ZpbGU7CisJCQkJbGVuID0gcHJvZmlsZS0+eG1hdGNoX2xlbjsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKHByb2ZpbGUtPmJhc2UubmFtZSwgbmFtZSkpCisJCQkvKiBleGFjdCBub24tcmUgbWF0Y2gsIG5vIG1vcmUgc2VhcmNoaW5nIHJlcXVpcmVkICovCisJCQlyZXR1cm4gcHJvZmlsZTsKKwl9CisKKwlyZXR1cm4gY2FuZGlkYXRlOworfQorCisvKioKKyAqIGZpbmRfYXR0YWNoIC0gZG8gYXR0YWNobWVudCBzZWFyY2ggZm9yIHVuY29uZmluZWQgcHJvY2Vzc2VzCisgKiBAbnM6IHRoZSBjdXJyZW50IG5hbWVzcGFjZSAgKE5PVCBOVUxMKQorICogQGxpc3Q6IGxpc3QgdG8gc2VhcmNoICAoTk9UIE5VTEwpCisgKiBAbmFtZTogdGhlIGV4ZWN1dGFibGUgbmFtZSB0byBtYXRjaCBhZ2FpbnN0ICAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogcHJvZmlsZSBvciBOVUxMIGlmIG5vIG1hdGNoIGZvdW5kCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWFfcHJvZmlsZSAqZmluZF9hdHRhY2goc3RydWN0IGFhX25hbWVzcGFjZSAqbnMsCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZTsKKworCXJlYWRfbG9jaygmbnMtPmxvY2spOworCXByb2ZpbGUgPSBhYV9nZXRfcHJvZmlsZShfX2F0dGFjaF9tYXRjaChuYW1lLCBsaXN0KSk7CisJcmVhZF91bmxvY2soJm5zLT5sb2NrKTsKKworCXJldHVybiBwcm9maWxlOworfQorCisvKioKKyAqIHNlcGFyYXRlX2ZxbmFtZSAtIHNlcGFyYXRlIHRoZSBuYW1lc3BhY2UgYW5kIHByb2ZpbGUgbmFtZXMKKyAqIEBmcW5hbWU6IHRoZSBmcW5hbWUgbmFtZSB0byBzcGxpdCAgKE5PVCBOVUxMKQorICogQG5zX25hbWU6IHRoZSBuYW1lc3BhY2UgbmFtZSBpZiBpdCBleGlzdHMgIChOT1QgTlVMTCkKKyAqCisgKiBUaGlzIGlzIHRoZSB4dGFibGUgZXF1aXZhbGVudCByb3V0aW5lIG9mIGFhX3NwbGl0X2ZxbmFtZS4gIEl0IGZpbmRzIHRoZQorICogc3BsaXQgaW4gYW4geHRhYmxlIGZxbmFtZSB3aGljaCBjb250YWlucyBhbiBlbWJlZGRlZCBcMCBpbnN0ZWFkIG9mIGEgOgorICogaWYgYSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLiAgVGhpcyBpcyBkb25lIHNvIHRoZSB4dGFibGUgaXMgY29uc3RhbnQgYW5kCisgKiBpc24ndCByZS1zcGxpdCBvbiBldmVyeSBsb29rdXAuCisgKgorICogRWl0aGVyIHRoZSBwcm9maWxlIG9yIG5hbWVzcGFjZSBuYW1lIG1heSBiZSBvcHRpb25hbCBidXQgaWYgdGhlIG5hbWVzcGFjZQorICogaXMgc3BlY2lmaWVkIHRoZSBwcm9maWxlIG5hbWUgdGVybWluYXRpb24gbXVzdCBiZSBwcmVzZW50LiAgVGhpcyByZXN1bHRzCisgKiBpbiB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVuY29kaW5nczoKKyAqIHByb2ZpbGVfbmFtZVwwCisgKiA6bnNfbmFtZVwwcHJvZmlsZV9uYW1lXDAKKyAqIDpuc19uYW1lXDBcMAorICoKKyAqIE5PVEU6IHRoZSB4dGFibGUgZnFuYW1lIGlzIHByZS12YWxpZGF0ZWQgYXQgbG9hZCB0aW1lIGluIHVucGFja190cmFuc190YWJsZQorICoKKyAqIFJldHVybnM6IHByb2ZpbGUgbmFtZSBpZiBpdCBpcyBzcGVjaWZpZWQgZWxzZSBOVUxMCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzZXBhcmF0ZV9mcW5hbWUoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICoqbnNfbmFtZSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCisJaWYgKGZxbmFtZVswXSA9PSAnOicpIHsKKwkJLyogSW4gdGhpcyBjYXNlIHRoZXJlIGlzIGd1YXJhbnRlZWQgdG8gYmUgdHdvIFwwIHRlcm1pbmF0b3JzCisJCSAqIGluIHRoZSBzdHJpbmcuICBUaGV5IGFyZSB2ZXJpZmllZCBhdCBsb2FkIHRpbWUgYnkKKwkJICogYnkgdW5wYWNrX3RyYW5zX3RhYmxlCisJCSAqLworCQkqbnNfbmFtZSA9IGZxbmFtZSArIDE7CQkvKiBza2lwIDogKi8KKwkJbmFtZSA9ICpuc19uYW1lICsgc3RybGVuKCpuc19uYW1lKSArIDE7CisJCWlmICghKm5hbWUpCisJCQluYW1lID0gTlVMTDsKKwl9IGVsc2UgeworCQkqbnNfbmFtZSA9IE5VTEw7CisJCW5hbWUgPSBmcW5hbWU7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuZXh0X25hbWUoaW50IHh0eXBlLCBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHhfdGFibGVfbG9va3VwIC0gbG9va3VwIGFuIHggdHJhbnNpdGlvbiBuYW1lIHZpYSB0cmFuc2l0aW9uIHRhYmxlCisgKiBAcHJvZmlsZTogY3VycmVudCBwcm9maWxlIChOT1QgTlVMTCkKKyAqIEB4aW5kZXg6IGluZGV4IGludG8geCB0cmFuc2l0aW9uIHRhYmxlCisgKgorICogUmV0dXJuczogcmVmY291bnRlZCBwcm9maWxlLCBvciBOVUxMIG9uIGZhaWx1cmUgKE1BWUJFIE5VTEwpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWFfcHJvZmlsZSAqeF90YWJsZV9sb29rdXAoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHUzMiB4aW5kZXgpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKm5ld19wcm9maWxlID0gTlVMTDsKKwlzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucyA9IHByb2ZpbGUtPm5zOworCXUzMiB4dHlwZSA9IHhpbmRleCAmIEFBX1hfVFlQRV9NQVNLOworCWludCBpbmRleCA9IHhpbmRleCAmIEFBX1hfSU5ERVhfTUFTSzsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5kZXggaXMgZ3VhcmFudGVlZCB0byBiZSBpbiByYW5nZSwgdmFsaWRhdGVkIGF0IGxvYWQgdGltZSAqLworCWZvciAobmFtZSA9IHByb2ZpbGUtPmZpbGUudHJhbnMudGFibGVbaW5kZXhdOyAhbmV3X3Byb2ZpbGUgJiYgbmFtZTsKKwkgICAgIG5hbWUgPSBuZXh0X25hbWUoeHR5cGUsIG5hbWUpKSB7CisJCXN0cnVjdCBhYV9uYW1lc3BhY2UgKm5ld19uczsKKwkJY29uc3QgY2hhciAqeG5hbWUgPSBOVUxMOworCisJCW5ld19ucyA9IE5VTEw7CisJCWlmICh4aW5kZXggJiBBQV9YX0NISUxEKSB7CisJCQkvKiByZWxlYXNlIGJ5IGNhbGxlciAqLworCQkJbmV3X3Byb2ZpbGUgPSBhYV9maW5kX2NoaWxkKHByb2ZpbGUsIG5hbWUpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoKm5hbWUgPT0gJzonKSB7CisJCQkvKiBzd2l0Y2hpbmcgbmFtZXNwYWNlICovCisJCQljb25zdCBjaGFyICpuc19uYW1lOworCQkJeG5hbWUgPSBuYW1lID0gc2VwYXJhdGVfZnFuYW1lKG5hbWUsICZuc19uYW1lKTsKKwkJCWlmICgheG5hbWUpCisJCQkJLyogbm8gbmFtZSBzbyB1c2UgcHJvZmlsZSBuYW1lICovCisJCQkJeG5hbWUgPSBwcm9maWxlLT5iYXNlLmhuYW1lOworCQkJaWYgKCpuc19uYW1lID09ICdAJykgeworCQkJCS8qIFRPRE86IHZhcmlhYmxlIHN1cHBvcnQgKi8KKwkJCQk7CisJCQl9CisJCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQkJbmV3X25zID0gYWFfZmluZF9uYW1lc3BhY2UobnMsIG5zX25hbWUpOworCQkJaWYgKCFuZXdfbnMpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoKm5hbWUgPT0gJ0AnKSB7CisJCQkvKiBUT0RPOiB2YXJpYWJsZSBzdXBwb3J0ICovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIGJhc2ljIG5hbWVzcGFjZSBsb29rdXAgKi8KKwkJCXhuYW1lID0gbmFtZTsKKwkJfQorCisJCS8qIHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCQluZXdfcHJvZmlsZSA9IGFhX2xvb2t1cF9wcm9maWxlKG5ld19ucyA/IG5ld19ucyA6IG5zLCB4bmFtZSk7CisJCWFhX3B1dF9uYW1lc3BhY2UobmV3X25zKTsKKwl9CisKKwkvKiByZWxlYXNlZCBieSBjYWxsZXIgKi8KKwlyZXR1cm4gbmV3X3Byb2ZpbGU7Cit9CisKKy8qKgorICogeF90b19wcm9maWxlIC0gZ2V0IHRhcmdldCBwcm9maWxlIGZvciBhIGdpdmVuIHhpbmRleAorICogQHByb2ZpbGU6IGN1cnJlbnQgcHJvZmlsZSAgKE5PVCBOVUxMKQorICogQG5hbWU6IG5hbWUgdG8gbG9va3VwIChOT1QgTlVMTCkKKyAqIEB4aW5kZXg6IGluZGV4IGludG8geCB0cmFuc2l0aW9uIHRhYmxlCisgKgorICogZmluZCBwcm9maWxlIGZvciBhIHRyYW5zaXRpb24gaW5kZXgKKyAqCisgKiBSZXR1cm5zOiByZWZjb3VudGVkIHByb2ZpbGUgb3IgTlVMTCBpZiBub3QgZm91bmQgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWFfcHJvZmlsZSAqeF90b19wcm9maWxlKHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1MzIgeGluZGV4KQoreworCXN0cnVjdCBhYV9wcm9maWxlICpuZXdfcHJvZmlsZSA9IE5VTEw7CisJc3RydWN0IGFhX25hbWVzcGFjZSAqbnMgPSBwcm9maWxlLT5uczsKKwl1MzIgeHR5cGUgPSB4aW5kZXggJiBBQV9YX1RZUEVfTUFTSzsKKworCXN3aXRjaCAoeHR5cGUpIHsKKwljYXNlIEFBX1hfTk9ORToKKwkJLyogZmFpbCBleGVjIHVubGVzcyBpeCB8fCB1eCBmYWxsYmFjayAtIGhhbmRsZWQgYnkgY2FsbGVyICovCisJCXJldHVybiBOVUxMOworCWNhc2UgQUFfWF9OQU1FOgorCQlpZiAoeGluZGV4ICYgQUFfWF9DSElMRCkKKwkJCS8qIHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCQkJbmV3X3Byb2ZpbGUgPSBmaW5kX2F0dGFjaChucywgJnByb2ZpbGUtPmJhc2UucHJvZmlsZXMsCisJCQkJCQkgIG5hbWUpOworCQllbHNlCisJCQkvKiByZWxlYXNlZCBieSBjYWxsZXIgKi8KKwkJCW5ld19wcm9maWxlID0gZmluZF9hdHRhY2gobnMsICZucy0+YmFzZS5wcm9maWxlcywKKwkJCQkJCSAgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgQUFfWF9UQUJMRToKKwkJLyogcmVsZWFzZWQgYnkgY2FsbGVyICovCisJCW5ld19wcm9maWxlID0geF90YWJsZV9sb29rdXAocHJvZmlsZSwgeGluZGV4KTsKKwkJYnJlYWs7CisJfQorCisJLyogcmVsZWFzZWQgYnkgY2FsbGVyICovCisJcmV0dXJuIG5ld19wcm9maWxlOworfQorCisvKioKKyAqIGFwcGFybW9yX2Jwcm1fc2V0X2NyZWRzIC0gc2V0IHRoZSBuZXcgY3JlZHMgb24gdGhlIGJwcm0gc3RydWN0CisgKiBAYnBybTogYmlucHJtIGZvciB0aGUgZXhlYyAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6ICUwIG9yIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGFwcGFybW9yX2Jwcm1fc2V0X2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQ7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsICpuZXdfcHJvZmlsZSA9IE5VTEw7CisJc3RydWN0IGFhX25hbWVzcGFjZSAqbnM7CisJY2hhciAqYnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisJc3RydWN0IGZpbGVfcGVybXMgcGVybXMgPSB7fTsKKwlzdHJ1Y3QgcGF0aF9jb25kIGNvbmQgPSB7CisJCWJwcm0tPmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfdWlkLAorCQlicHJtLT5maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUKKwl9OworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMLCAqdGFyZ2V0ID0gTlVMTCwgKmluZm8gPSBOVUxMOworCWludCBlcnJvciA9IGNhcF9icHJtX3NldF9jcmVkcyhicHJtKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChicHJtLT5jcmVkX3ByZXBhcmVkKQorCQlyZXR1cm4gMDsKKworCWN4dCA9IGJwcm0tPmNyZWQtPnNlY3VyaXR5OworCUJVR19PTighY3h0KTsKKworCXByb2ZpbGUgPSBhYV9nZXRfcHJvZmlsZShhYV9uZXdlc3RfdmVyc2lvbihjeHQtPnByb2ZpbGUpKTsKKwkvKgorCSAqIGdldCB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIHJlcGxhY2VtZW50IHByb2ZpbGUgYXMgcmVwbGFjZW1lbnQKKwkgKiBjYW4gY2hhbmdlIHRoZSBuYW1lc3BhY2UKKwkgKi8KKwlucyA9IHByb2ZpbGUtPm5zOworCXN0YXRlID0gcHJvZmlsZS0+ZmlsZS5zdGFydDsKKworCS8qIGJ1ZmZlciBmcmVlZCBiZWxvdywgbmFtZSBpcyBwb2ludGVyIGludG8gYnVmZmVyICovCisJZXJyb3IgPSBhYV9nZXRfbmFtZSgmYnBybS0+ZmlsZS0+Zl9wYXRoLCBwcm9maWxlLT5wYXRoX2ZsYWdzLCAmYnVmZmVyLAorCQkJICAgICZuYW1lKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKHByb2ZpbGUtPmZsYWdzICYKKwkJICAgIChQRkxBR19JWF9PTl9OQU1FX0VSUk9SIHwgUEZMQUdfVU5DT05GSU5FRCkpCisJCQllcnJvciA9IDA7CisJCWluZm8gPSAiRXhlYyBmYWlsZWQgbmFtZSByZXNvbHV0aW9uIjsKKwkJbmFtZSA9IGJwcm0tPmZpbGVuYW1lOworCQlnb3RvIGF1ZGl0OworCX0KKworCS8qIFRlc3QgZm9yIG9uZXhlYyBmaXJzdCBhcyBvbmV4ZWMgZGlyZWN0aXZlcyBvdmVycmlkZSBvdGhlcgorCSAqIHggdHJhbnNpdGlvbnMuCisJICovCisJaWYgKHVuY29uZmluZWQocHJvZmlsZSkpIHsKKwkJLyogdW5jb25maW5lZCB0YXNrICovCisJCWlmIChjeHQtPm9uZXhlYykKKwkJCS8qIGNoYW5nZV9wcm9maWxlIG9uIGV4ZWMgYWxyZWFkeSBiZWVuIGdyYW50ZWQgKi8KKwkJCW5ld19wcm9maWxlID0gYWFfZ2V0X3Byb2ZpbGUoY3h0LT5vbmV4ZWMpOworCQllbHNlCisJCQluZXdfcHJvZmlsZSA9IGZpbmRfYXR0YWNoKG5zLCAmbnMtPmJhc2UucHJvZmlsZXMsIG5hbWUpOworCQlpZiAoIW5ld19wcm9maWxlKQorCQkJZ290byBjbGVhbnVwOworCQlnb3RvIGFwcGx5OworCX0KKworCS8qIGZpbmQgZXhlYyBwZXJtaXNzaW9ucyBmb3IgbmFtZSAqLworCXN0YXRlID0gYWFfc3RyX3Blcm1zKHByb2ZpbGUtPmZpbGUuZGZhLCBzdGF0ZSwgbmFtZSwgJmNvbmQsICZwZXJtcyk7CisJaWYgKGN4dC0+b25leGVjKSB7CisJCXN0cnVjdCBmaWxlX3Blcm1zIGNwOworCQlpbmZvID0gImNoYW5nZV9wcm9maWxlIG9uZXhlYyI7CisJCWlmICghKHBlcm1zLmFsbG93ICYgQUFfTUFZX09ORVhFQykpCisJCQlnb3RvIGF1ZGl0OworCisJCS8qIHRlc3QgaWYgdGhpcyBleGVjIGNhbiBiZSBwYWlyZWQgd2l0aCBjaGFuZ2VfcHJvZmlsZSBvbmV4ZWMuCisJCSAqIG9uZXhlYyBwZXJtaXNzaW9uIGlzIGxpbmtlZCB0byBleGVjIHdpdGggYSBzdGFuZGFyZCBwYWlyaW5nCisJCSAqIGV4ZWNcMGNoYW5nZV9wcm9maWxlCisJCSAqLworCQlzdGF0ZSA9IGFhX2RmYV9udWxsX3RyYW5zaXRpb24ocHJvZmlsZS0+ZmlsZS5kZmEsIHN0YXRlKTsKKwkJY3AgPSBjaGFuZ2VfcHJvZmlsZV9wZXJtcyhwcm9maWxlLCBjeHQtPm9uZXhlYy0+bnMsIG5hbWUsCisJCQkJCSAgQUFfTUFZX09ORVhFQywgc3RhdGUpOworCisJCWlmICghKGNwLmFsbG93ICYgQUFfTUFZX09ORVhFQykpCisJCQlnb3RvIGF1ZGl0OworCQluZXdfcHJvZmlsZSA9IGFhX2dldF9wcm9maWxlKGFhX25ld2VzdF92ZXJzaW9uKGN4dC0+b25leGVjKSk7CisJCWdvdG8gYXBwbHk7CisJfQorCisJaWYgKHBlcm1zLmFsbG93ICYgTUFZX0VYRUMpIHsKKwkJLyogZXhlYyBwZXJtaXNzaW9uIGRldGVybWluZSBob3cgdG8gdHJhbnNpdGlvbiAqLworCQluZXdfcHJvZmlsZSA9IHhfdG9fcHJvZmlsZShwcm9maWxlLCBuYW1lLCBwZXJtcy54aW5kZXgpOworCQlpZiAoIW5ld19wcm9maWxlKSB7CisJCQlpZiAocGVybXMueGluZGV4ICYgQUFfWF9JTkhFUklUKSB7CisJCQkJLyogKHB8Y3xuKWl4IC0gZG9uJ3QgY2hhbmdlIHByb2ZpbGUgYnV0IGRvCisJCQkJICogdXNlIHRoZSBuZXdlc3QgdmVyc2lvbiwgd2hpY2ggd2FzIHBpY2tlZAorCQkJCSAqIHVwIGFib3ZlIHdoZW4gZ2V0dGluZyBwcm9maWxlCisJCQkJICovCisJCQkJaW5mbyA9ICJpeCBmYWxsYmFjayI7CisJCQkJbmV3X3Byb2ZpbGUgPSBhYV9nZXRfcHJvZmlsZShwcm9maWxlKTsKKwkJCQlnb3RvIHhfY2xlYXI7CisJCQl9IGVsc2UgaWYgKHBlcm1zLnhpbmRleCAmIEFBX1hfVU5DT05GSU5FRCkgeworCQkJCW5ld19wcm9maWxlID0gYWFfZ2V0X3Byb2ZpbGUobnMtPnVuY29uZmluZWQpOworCQkJCWluZm8gPSAidXggZmFsbGJhY2siOworCQkJfSBlbHNlIHsKKwkJCQllcnJvciA9IC1FTk9FTlQ7CisJCQkJaW5mbyA9ICJwcm9maWxlIG5vdCBmb3VuZCI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKENPTVBMQUlOX01PREUocHJvZmlsZSkpIHsKKwkJLyogbm8gZXhlYyBwZXJtaXNzaW9uIC0gYXJlIHdlIGluIGxlYXJuaW5nIG1vZGUgKi8KKwkJbmV3X3Byb2ZpbGUgPSBhYV9uZXdfbnVsbF9wcm9maWxlKHByb2ZpbGUsIDApOworCQlpZiAoIW5ld19wcm9maWxlKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlpbmZvID0gImNvdWxkIG5vdCBjcmVhdGUgbnVsbCBwcm9maWxlIjsKKwkJfSBlbHNlIHsKKwkJCWVycm9yID0gLUVBQ0NFUzsKKwkJCXRhcmdldCA9IG5ld19wcm9maWxlLT5iYXNlLmhuYW1lOworCQl9CisJCXBlcm1zLnhpbmRleCB8PSBBQV9YX1VOU0FGRTsKKwl9IGVsc2UKKwkJLyogZmFpbCBleGVjICovCisJCWVycm9yID0gLUVBQ0NFUzsKKworCWlmICghbmV3X3Byb2ZpbGUpCisJCWdvdG8gYXVkaXQ7CisKKwlpZiAoYnBybS0+dW5zYWZlICYgTFNNX1VOU0FGRV9TSEFSRSkgeworCQkvKiBGSVhNRTogY3VycmVudGx5IGRvbid0IG1lZGlhdGUgc2hhcmVkIHN0YXRlICovCisJCTsKKwl9CisKKwlpZiAoYnBybS0+dW5zYWZlICYgKExTTV9VTlNBRkVfUFRSQUNFIHwgTFNNX1VOU0FGRV9QVFJBQ0VfQ0FQKSkgeworCQllcnJvciA9IG1heV9jaGFuZ2VfcHRyYWNlZF9kb21haW4oY3VycmVudCwgbmV3X3Byb2ZpbGUpOworCQlpZiAoZXJyb3IpIHsKKwkJCWFhX3B1dF9wcm9maWxlKG5ld19wcm9maWxlKTsKKwkJCWdvdG8gYXVkaXQ7CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgaWYgc2VjdXJlIGV4ZWMgaXMgbmVlZGVkLgorCSAqIENhbiBiZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CisJICogMS4gdW5jb25maW5lZCBzd2l0Y2hpbmcgdG8gY29uZmluZWQKKwkgKiAyLiBjb25maW5lZCBzd2l0Y2hpbmcgdG8gZGlmZmVyZW50IGNvbmZpbmVtZW50CisJICogMy4gY29uZmluZWQgc3dpdGNoaW5nIHRvIHVuY29uZmluZWQKKwkgKgorCSAqIENhc2VzIDIgYW5kIDMgYXJlIG1hcmtlZCBhcyByZXF1aXJpbmcgc2VjdXJlIGV4ZWMKKwkgKiAodW5sZXNzIHBvbGljeSBzcGVjaWZpZWQgInVuc2FmZSBleGVjIikKKwkgKgorCSAqIGJwcm0tPnVuc2FmZSBpcyB1c2VkIHRvIGNhY2hlIHRoZSBBQV9YX1VOU0FGRSBwZXJtaXNzaW9uCisJICogdG8gYXZvaWQgaGF2aW5nIHRvIHJlY29tcHV0ZSBpbiBzZWN1cmVleGVjCisJICovCisJaWYgKCEocGVybXMueGluZGV4ICYgQUFfWF9VTlNBRkUpKSB7CisJCUFBX0RFQlVHKCJzY3J1YmJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciAlcyBwcm9maWxlPSVzXG4iLAorCQkJIG5hbWUsIG5ld19wcm9maWxlLT5iYXNlLmhuYW1lKTsKKwkJYnBybS0+dW5zYWZlIHw9IEFBX1NFQ1VSRV9YX05FRURFRDsKKwl9CithcHBseToKKwl0YXJnZXQgPSBuZXdfcHJvZmlsZS0+YmFzZS5obmFtZTsKKwkvKiB3aGVuIHRyYW5zaXRpb25pbmcgcHJvZmlsZXMgY2xlYXIgdW5zYWZlIHBlcnNvbmFsaXR5IGJpdHMgKi8KKwlicHJtLT5wZXJfY2xlYXIgfD0gUEVSX0NMRUFSX09OX1NFVElEOworCit4X2NsZWFyOgorCWFhX3B1dF9wcm9maWxlKGN4dC0+cHJvZmlsZSk7CisJLyogdHJhbnNmZXIgbmV3IHByb2ZpbGUgcmVmZXJlbmNlIHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBjeHQgaXMgZnJlZWQgKi8KKwljeHQtPnByb2ZpbGUgPSBuZXdfcHJvZmlsZTsKKworCS8qIGNsZWFyIG91dCBhbGwgdGVtcG9yYXJ5L3RyYW5zaXRpb25hbCBzdGF0ZSBmcm9tIHRoZSBjb250ZXh0ICovCisJYWFfcHV0X3Byb2ZpbGUoY3h0LT5wcmV2aW91cyk7CisJYWFfcHV0X3Byb2ZpbGUoY3h0LT5vbmV4ZWMpOworCWN4dC0+cHJldmlvdXMgPSBOVUxMOworCWN4dC0+b25leGVjID0gTlVMTDsKKwljeHQtPnRva2VuID0gMDsKKworYXVkaXQ6CisJZXJyb3IgPSBhYV9hdWRpdF9maWxlKHByb2ZpbGUsICZwZXJtcywgR0ZQX0tFUk5FTCwgT1BfRVhFQywgTUFZX0VYRUMsCisJCQkgICAgICBuYW1lLCB0YXJnZXQsIGNvbmQudWlkLCBpbmZvLCBlcnJvcik7CisKK2NsZWFudXA6CisJYWFfcHV0X3Byb2ZpbGUocHJvZmlsZSk7CisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhcHBhcm1vcl9icHJtX3NlY3VyZWV4ZWMgLSBkZXRlcm1pbmUgaWYgc2VjdXJlZXhlYyBpcyBuZWVkZWQKKyAqIEBicHJtOiBiaW5wcm0gZm9yIGV4ZWMgIChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiAlMSBpZiBzZWN1cmVleGVjIGlzIG5lZWRlZCBlbHNlICUwCisgKi8KK2ludCBhcHBhcm1vcl9icHJtX3NlY3VyZWV4ZWMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlpbnQgcmV0ID0gY2FwX2Jwcm1fc2VjdXJlZXhlYyhicHJtKTsKKworCS8qIHRoZSBkZWNpc2lvbiB0byB1c2Ugc2VjdXJlIGV4ZWMgaXMgY29tcHV0ZWQgaW4gc2V0X2NyZWRzCisJICogYW5kIHN0b3JlZCBpbiBicHJtLT51bnNhZmUuCisJICovCisJaWYgKCFyZXQgJiYgKGJwcm0tPnVuc2FmZSAmIEFBX1NFQ1VSRV9YX05FRURFRCkpCisJCXJldCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFwcGFybW9yX2Jwcm1fY29tbWl0dGluZ19jcmVkcyAtIGRvIHRhc2sgY2xlYW51cCBvbiBjb21taXR0aW5nIG5ldyBjcmVkcworICogQGJwcm06IGJpbnBybSBmb3IgdGhlIGV4ZWMgIChOT1QgTlVMTCkKKyAqLwordm9pZCBhcHBhcm1vcl9icHJtX2NvbW1pdHRpbmdfY3JlZHMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IF9fYWFfY3VycmVudF9wcm9maWxlKCk7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpuZXdfY3h0ID0gYnBybS0+Y3JlZC0+c2VjdXJpdHk7CisKKwkvKiBiYWlsIG91dCBpZiB1bmNvbmZpbmVkIG9yIG5vdCBjaGFuZ2luZyBwcm9maWxlICovCisJaWYgKChuZXdfY3h0LT5wcm9maWxlID09IHByb2ZpbGUpIHx8CisJICAgICh1bmNvbmZpbmVkKG5ld19jeHQtPnByb2ZpbGUpKSkKKwkJcmV0dXJuOworCisJY3VycmVudC0+cGRlYXRoX3NpZ25hbCA9IDA7CisKKwkvKiByZXNldCBzb2Z0IGxpbWl0cyBhbmQgc2V0IGhhcmQgbGltaXRzIGZvciB0aGUgbmV3IHByb2ZpbGUgKi8KKwlfX2FhX3RyYW5zaXRpb25fcmxpbWl0cyhwcm9maWxlLCBuZXdfY3h0LT5wcm9maWxlKTsKK30KKworLyoqCisgKiBhcHBhcm1vcl9icHJtX2NvbW1pdGVkX2NyZWQgLSBkbyBjbGVhbnVwIGFmdGVyIG5ldyBjcmVkcyBjb21taXR0ZWQKKyAqIEBicHJtOiBiaW5wcm0gZm9yIHRoZSBleGVjICAoTk9UIE5VTEwpCisgKi8KK3ZvaWQgYXBwYXJtb3JfYnBybV9jb21taXR0ZWRfY3JlZHMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwkvKiBUT0RPOiBjbGVhbnVwIHNpZ25hbHMgLSBpcGMgbWVkaWF0aW9uICovCisJcmV0dXJuOworfQorCisvKgorICogRnVuY3Rpb25zIGZvciBzZWxmIGRpcmVjdGVkIHByb2ZpbGUgY2hhbmdlCisgKi8KKworLyoqCisgKiBuZXdfY29tcG91bmRfbmFtZSAtIGNyZWF0ZSBhbiBobmFtZSB3aXRoIEBuMiBhcHBlbmRlZCB0byBAbjEKKyAqIEBuMTogYmFzZSBvZiBobmFtZSAgKE5PVCBOVUxMKQorICogQG4yOiBuYW1lIHRvIGFwcGVuZCAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogbmV3IG5hbWUgb3IgTlVMTCBvbiBlcnJvcgorICovCitzdGF0aWMgY2hhciAqbmV3X2NvbXBvdW5kX25hbWUoY29uc3QgY2hhciAqbjEsIGNvbnN0IGNoYXIgKm4yKQoreworCWNoYXIgKm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuMSkgKyBzdHJsZW4objIpICsgMywgR0ZQX0tFUk5FTCk7CisJaWYgKG5hbWUpCisJCXNwcmludGYobmFtZSwgIiVzLy8lcyIsIG4xLCBuMik7CisJcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogYWFfY2hhbmdlX2hhdCAtIGNoYW5nZSBoYXQgdG8vZnJvbSBzdWJwcm9maWxlCisgKiBAaGF0czogdmVjdG9yIG9mIGhhdCBuYW1lcyB0byB0cnkgY2hhbmdpbmcgaW50byAoTUFZQkUgTlVMTCBpZiBAY291bnQgPT0gMCkKKyAqIEBjb3VudDogbnVtYmVyIG9mIGhhdCBuYW1lcyBpbiBAaGF0cworICogQHRva2VuOiBtYWdpYyB2YWx1ZSB0byB2YWxpZGF0ZSB0aGUgaGF0IGNoYW5nZQorICogQHBlcm10ZXN0OiB0cnVlIGlmIHRoaXMgaXMganVzdCBhIHBlcm1pc3Npb24gdGVzdAorICoKKyAqIENoYW5nZSB0byB0aGUgZmlyc3QgcHJvZmlsZSBzcGVjaWZpZWQgaW4gQGhhdHMgdGhhdCBleGlzdHMsIGFuZCBzdG9yZQorICogdGhlIEBoYXRfbWFnaWMgaW4gdGhlIGN1cnJlbnQgdGFzayBjb250ZXh0LiAgSWYgdGhlIGNvdW50ID09IDAgYW5kIHRoZQorICogQHRva2VuIG1hdGNoZXMgdGhhdCBzdG9yZWQgaW4gdGhlIGN1cnJlbnQgdGFzayBjb250ZXh0LCByZXR1cm4gdG8gdGhlCisgKiB0b3AgbGV2ZWwgcHJvZmlsZS4KKyAqCisgKiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MsIGVycm9yIG90aGVyd2lzZS4KKyAqLworaW50IGFhX2NoYW5nZV9oYXQoY29uc3QgY2hhciAqaGF0c1tdLCBpbnQgY291bnQsIHU2NCB0b2tlbiwgYm9vbCBwZXJtdGVzdCkKK3sKKwljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZDsKKwlzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dDsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgKnByZXZpb3VzX3Byb2ZpbGUsICpoYXQgPSBOVUxMOworCWNoYXIgKm5hbWUgPSBOVUxMOworCWludCBpOworCXN0cnVjdCBmaWxlX3Blcm1zIHBlcm1zID0ge307CisJY29uc3QgY2hhciAqdGFyZ2V0ID0gTlVMTCwgKmluZm8gPSBOVUxMOworCWludCBlcnJvciA9IDA7CisKKwkvKiByZWxlYXNlZCBiZWxvdyAqLworCWNyZWQgPSBnZXRfY3VycmVudF9jcmVkKCk7CisJY3h0ID0gY3JlZC0+c2VjdXJpdHk7CisJcHJvZmlsZSA9IGFhX2NyZWRfcHJvZmlsZShjcmVkKTsKKwlwcmV2aW91c19wcm9maWxlID0gY3h0LT5wcmV2aW91czsKKworCWlmICh1bmNvbmZpbmVkKHByb2ZpbGUpKSB7CisJCWluZm8gPSAidW5jb25maW5lZCI7CisJCWVycm9yID0gLUVQRVJNOworCQlnb3RvIGF1ZGl0OworCX0KKworCWlmIChjb3VudCkgeworCQkvKiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBpbnRvIGEgbmV3IGhhdCBvciBzd2l0Y2ggdG8gYSBzaWJsaW5nICovCisJCXN0cnVjdCBhYV9wcm9maWxlICpyb290OworCQlyb290ID0gUFJPRklMRV9JU19IQVQocHJvZmlsZSkgPyBwcm9maWxlLT5wYXJlbnQgOiBwcm9maWxlOworCisJCS8qIGZpbmQgZmlyc3QgbWF0Y2hpbmcgaGF0ICovCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiAhaGF0OyBpKyspCisJCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQkJaGF0ID0gYWFfZmluZF9jaGlsZChyb290LCBoYXRzW2ldKTsKKwkJaWYgKCFoYXQpIHsKKwkJCWlmICghQ09NUExBSU5fTU9ERShyb290KSB8fCBwZXJtdGVzdCkgeworCQkJCWlmIChsaXN0X2VtcHR5KCZyb290LT5iYXNlLnByb2ZpbGVzKSkKKwkJCQkJZXJyb3IgPSAtRUNISUxEOworCQkJCWVsc2UKKwkJCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogSW4gY29tcGxhaW4gbW9kZSBhbmQgZmFpbGVkIHRvIG1hdGNoIGFueSBoYXRzLgorCQkJICogQXVkaXQgdGhlIGZhaWx1cmUgaXMgYmFzZWQgb2ZmIG9mIHRoZSBmaXJzdCBoYXQKKwkJCSAqIHN1cHBsaWVkLiAgVGhpcyBpcyBkb25lIGR1ZSBob3cgdXNlcnNwYWNlCisJCQkgKiBpbnRlcmFjdHMgd2l0aCBjaGFuZ2VfaGF0LgorCQkJICoKKwkJCSAqIFRPRE86IEFkZCBsb2dnaW5nIG9mIGFsbCBmYWlsZWQgaGF0cworCQkJICovCisKKwkJCS8qIGZyZWVkIGJlbG93ICovCisJCQluYW1lID0gbmV3X2NvbXBvdW5kX25hbWUocm9vdC0+YmFzZS5obmFtZSwgaGF0c1swXSk7CisJCQl0YXJnZXQgPSBuYW1lOworCQkJLyogcmVsZWFzZWQgYmVsb3cgKi8KKwkJCWhhdCA9IGFhX25ld19udWxsX3Byb2ZpbGUocHJvZmlsZSwgMSk7CisJCQlpZiAoIWhhdCkgeworCQkJCWluZm8gPSAiZmFpbGVkIG51bGwgcHJvZmlsZSBjcmVhdGUiOworCQkJCWVycm9yID0gLUVOT01FTTsKKwkJCQlnb3RvIGF1ZGl0OworCQkJfQorCQl9IGVsc2UgeworCQkJdGFyZ2V0ID0gaGF0LT5iYXNlLmhuYW1lOworCQkJaWYgKCFQUk9GSUxFX0lTX0hBVChoYXQpKSB7CisJCQkJaW5mbyA9ICJ0YXJnZXQgbm90IGhhdCI7CisJCQkJZXJyb3IgPSAtRVBFUk07CisJCQkJZ290byBhdWRpdDsKKwkJCX0KKwkJfQorCisJCWVycm9yID0gbWF5X2NoYW5nZV9wdHJhY2VkX2RvbWFpbihjdXJyZW50LCBoYXQpOworCQlpZiAoZXJyb3IpIHsKKwkJCWluZm8gPSAicHRyYWNlZCI7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gYXVkaXQ7CisJCX0KKworCQlpZiAoIXBlcm10ZXN0KSB7CisJCQllcnJvciA9IGFhX3NldF9jdXJyZW50X2hhdChoYXQsIHRva2VuKTsKKwkJCWlmIChlcnJvciA9PSAtRUFDQ0VTKQorCQkJCS8qIGtpbGwgdGFzayBpbiBjYXNlIG9mIGJydXRlIGZvcmNlIGF0dGFja3MgKi8KKwkJCQlwZXJtcy5raWxsID0gQUFfTUFZX0NIQU5HRUhBVDsKKwkJCWVsc2UgaWYgKG5hbWUgJiYgIWVycm9yKQorCQkJCS8qIHJlc2V0IGVycm9yIGZvciBsZWFybmluZyBvZiBuZXcgaGF0cyAqLworCQkJCWVycm9yID0gLUVOT0VOVDsKKwkJfQorCX0gZWxzZSBpZiAocHJldmlvdXNfcHJvZmlsZSkgeworCQkvKiBSZXR1cm4gdG8gc2F2ZWQgcHJvZmlsZS4gIEtpbGwgdGFzayBpZiByZXN0b3JlIGZhaWxzCisJCSAqIHRvIGF2b2lkIGJydXRlIGZvcmNlIGF0dGFja3MKKwkJICovCisJCXRhcmdldCA9IHByZXZpb3VzX3Byb2ZpbGUtPmJhc2UuaG5hbWU7CisJCWVycm9yID0gYWFfcmVzdG9yZV9wcmV2aW91c19wcm9maWxlKHRva2VuKTsKKwkJcGVybXMua2lsbCA9IEFBX01BWV9DSEFOR0VIQVQ7CisJfSBlbHNlCisJCS8qIGlnbm9yZSByZXN0b3JlcyB3aGVuIHRoZXJlIGlzIG5vIHNhdmVkIHByb2ZpbGUgKi8KKwkJZ290byBvdXQ7CisKK2F1ZGl0OgorCWlmICghcGVybXRlc3QpCisJCWVycm9yID0gYWFfYXVkaXRfZmlsZShwcm9maWxlLCAmcGVybXMsIEdGUF9LRVJORUwsCisJCQkJICAgICAgT1BfQ0hBTkdFX0hBVCwgQUFfTUFZX0NIQU5HRUhBVCwgTlVMTCwKKwkJCQkgICAgICB0YXJnZXQsIDAsIGluZm8sIGVycm9yKTsKKworb3V0OgorCWFhX3B1dF9wcm9maWxlKGhhdCk7CisJa2ZyZWUobmFtZSk7CisJcHV0X2NyZWQoY3JlZCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYWFfY2hhbmdlX3Byb2ZpbGUgLSBwZXJmb3JtIGEgb25lLXdheSBwcm9maWxlIHRyYW5zaXRpb24KKyAqIEBuc19uYW1lOiBuYW1lIG9mIHRoZSBwcm9maWxlIG5hbWVzcGFjZSB0byBjaGFuZ2UgdG8gKE1BWUJFIE5VTEwpCisgKiBAaG5hbWU6IG5hbWUgb2YgcHJvZmlsZSB0byBjaGFuZ2UgdG8gKE1BWUJFIE5VTEwpCisgKiBAb25leGVjOiB3aGV0aGVyIHRoaXMgdHJhbnNpdGlvbiBpcyB0byB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5IG9yIGF0IGV4ZWMKKyAqIEBwZXJtdGVzdDogdHJ1ZSBpZiB0aGlzIGlzIGp1c3QgYSBwZXJtaXNzaW9uIHRlc3QKKyAqCisgKiBDaGFuZ2UgdG8gbmV3IHByb2ZpbGUgQG5hbWUuICBVbmxpa2Ugd2l0aCBoYXRzLCB0aGVyZSBpcyBubyB3YXkKKyAqIHRvIGNoYW5nZSBiYWNrLiAgSWYgQG5hbWUgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBjdXJyZW50IHByb2ZpbGUgbmFtZSBpcworICogdXNlZC4KKyAqIElmIEBvbmV4ZWMgdGhlbiB0aGUgdHJhbnNpdGlvbiBpcyBkZWxheWVkIHVudGlsCisgKiB0aGUgbmV4dCBleGVjLgorICoKKyAqIFJldHVybnMgJTAgb24gc3VjY2VzcywgZXJyb3Igb3RoZXJ3aXNlLgorICovCitpbnQgYWFfY2hhbmdlX3Byb2ZpbGUoY29uc3QgY2hhciAqbnNfbmFtZSwgY29uc3QgY2hhciAqaG5hbWUsIGJvb2wgb25leGVjLAorCQkgICAgICBib29sIHBlcm10ZXN0KQoreworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOworCXN0cnVjdCBhYV90YXNrX2N4dCAqY3h0OworCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlLCAqdGFyZ2V0ID0gTlVMTDsKKwlzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucyA9IE5VTEw7CisJc3RydWN0IGZpbGVfcGVybXMgcGVybXMgPSB7fTsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTCwgKmluZm8gPSBOVUxMOworCWludCBvcCwgZXJyb3IgPSAwOworCXUzMiByZXF1ZXN0OworCisJaWYgKCFobmFtZSAmJiAhbnNfbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob25leGVjKSB7CisJCXJlcXVlc3QgPSBBQV9NQVlfT05FWEVDOworCQlvcCA9IE9QX0NIQU5HRV9PTkVYRUM7CisJfSBlbHNlIHsKKwkJcmVxdWVzdCA9IEFBX01BWV9DSEFOR0VfUFJPRklMRTsKKwkJb3AgPSBPUF9DSEFOR0VfUFJPRklMRTsKKwl9CisKKwljcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpOworCWN4dCA9IGNyZWQtPnNlY3VyaXR5OworCXByb2ZpbGUgPSBhYV9jcmVkX3Byb2ZpbGUoY3JlZCk7CisKKwlpZiAobnNfbmFtZSkgeworCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQlucyA9IGFhX2ZpbmRfbmFtZXNwYWNlKHByb2ZpbGUtPm5zLCBuc19uYW1lKTsKKwkJaWYgKCFucykgeworCQkJLyogd2UgZG9uJ3QgY3JlYXRlIG5ldyBuYW1lc3BhY2UgaW4gY29tcGxhaW4gbW9kZSAqLworCQkJbmFtZSA9IG5zX25hbWU7CisJCQlpbmZvID0gIm5hbWVzcGFjZSBub3QgZm91bmQiOworCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJZ290byBhdWRpdDsKKwkJfQorCX0gZWxzZQorCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQlucyA9IGFhX2dldF9uYW1lc3BhY2UocHJvZmlsZS0+bnMpOworCisJLyogaWYgdGhlIG5hbWUgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9maWxlICovCisJaWYgKCFobmFtZSkgeworCQlpZiAodW5jb25maW5lZChwcm9maWxlKSkKKwkJCWhuYW1lID0gbnMtPnVuY29uZmluZWQtPmJhc2UuaG5hbWU7CisJCWVsc2UKKwkJCWhuYW1lID0gcHJvZmlsZS0+YmFzZS5obmFtZTsKKwl9CisKKwlwZXJtcyA9IGNoYW5nZV9wcm9maWxlX3Blcm1zKHByb2ZpbGUsIG5zLCBobmFtZSwgcmVxdWVzdCwKKwkJCQkgICAgIHByb2ZpbGUtPmZpbGUuc3RhcnQpOworCWlmICghKHBlcm1zLmFsbG93ICYgcmVxdWVzdCkpIHsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlnb3RvIGF1ZGl0OworCX0KKworCS8qIHJlbGVhc2VkIGJlbG93ICovCisJdGFyZ2V0ID0gYWFfbG9va3VwX3Byb2ZpbGUobnMsIGhuYW1lKTsKKwlpZiAoIXRhcmdldCkgeworCQlpbmZvID0gInByb2ZpbGUgbm90IGZvdW5kIjsKKwkJZXJyb3IgPSAtRU5PRU5UOworCQlpZiAocGVybXRlc3QgfHwgIUNPTVBMQUlOX01PREUocHJvZmlsZSkpCisJCQlnb3RvIGF1ZGl0OworCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQl0YXJnZXQgPSBhYV9uZXdfbnVsbF9wcm9maWxlKHByb2ZpbGUsIDApOworCQlpZiAoIXRhcmdldCkgeworCQkJaW5mbyA9ICJmYWlsZWQgbnVsbCBwcm9maWxlIGNyZWF0ZSI7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIGF1ZGl0OworCQl9CisJfQorCisJLyogY2hlY2sgaWYgdHJhY2luZyB0YXNrIGlzIGFsbG93ZWQgdG8gdHJhY2UgdGFyZ2V0IGRvbWFpbiAqLworCWVycm9yID0gbWF5X2NoYW5nZV9wdHJhY2VkX2RvbWFpbihjdXJyZW50LCB0YXJnZXQpOworCWlmIChlcnJvcikgeworCQlpbmZvID0gInB0cmFjZSBwcmV2ZW50cyB0cmFuc2l0aW9uIjsKKwkJZ290byBhdWRpdDsKKwl9CisKKwlpZiAocGVybXRlc3QpCisJCWdvdG8gYXVkaXQ7CisKKwlpZiAob25leGVjKQorCQllcnJvciA9IGFhX3NldF9jdXJyZW50X29uZXhlYyh0YXJnZXQpOworCWVsc2UKKwkJZXJyb3IgPSBhYV9yZXBsYWNlX2N1cnJlbnRfcHJvZmlsZSh0YXJnZXQpOworCithdWRpdDoKKwlpZiAoIXBlcm10ZXN0KQorCQllcnJvciA9IGFhX2F1ZGl0X2ZpbGUocHJvZmlsZSwgJnBlcm1zLCBHRlBfS0VSTkVMLCBvcCwgcmVxdWVzdCwKKwkJCQkgICAgICBuYW1lLCBobmFtZSwgMCwgaW5mbywgZXJyb3IpOworCisJYWFfcHV0X25hbWVzcGFjZShucyk7CisJYWFfcHV0X3Byb2ZpbGUodGFyZ2V0KTsKKwlwdXRfY3JlZChjcmVkKTsKKworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2ZpbGUuYyBiL3NlY3VyaXR5L2FwcGFybW9yL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEyZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvZmlsZS5jCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIG1lZGlhdGlvbiBvZiBmaWxlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL2FwcGFybW9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9hdWRpdC5oIgorI2luY2x1ZGUgImluY2x1ZGUvZmlsZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvbWF0Y2guaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BhdGguaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorCitzdHJ1Y3QgZmlsZV9wZXJtcyBudWxscGVybXM7CisKKworLyoqCisgKiBhdWRpdF9maWxlX21hc2sgLSBjb252ZXJ0IG1hc2sgdG8gcGVybWlzc2lvbiBzdHJpbmcKKyAqIEBidWZmZXI6IGJ1ZmZlciB0byB3cml0ZSBzdHJpbmcgdG8gKE5PVCBOVUxMKQorICogQG1hc2s6IHBlcm1pc3Npb24gbWFzayB0byBjb252ZXJ0CisgKi8KK3N0YXRpYyB2b2lkIGF1ZGl0X2ZpbGVfbWFzayhzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgdTMyIG1hc2spCit7CisJY2hhciBzdHJbMTBdOworCisJY2hhciAqbSA9IHN0cjsKKworCWlmIChtYXNrICYgQUFfRVhFQ19NTUFQKQorCQkqbSsrID0gJ20nOworCWlmIChtYXNrICYgKE1BWV9SRUFEIHwgQUFfTUFZX01FVEFfUkVBRCkpCisJCSptKysgPSAncic7CisJaWYgKG1hc2sgJiAoTUFZX1dSSVRFIHwgQUFfTUFZX01FVEFfV1JJVEUgfCBBQV9NQVlfQ0hNT0QgfAorCQkgICAgQUFfTUFZX0NIT1dOKSkKKwkJKm0rKyA9ICd3JzsKKwllbHNlIGlmIChtYXNrICYgTUFZX0FQUEVORCkKKwkJKm0rKyA9ICdhJzsKKwlpZiAobWFzayAmIEFBX01BWV9DUkVBVEUpCisJCSptKysgPSAnYyc7CisJaWYgKG1hc2sgJiBBQV9NQVlfREVMRVRFKQorCQkqbSsrID0gJ2QnOworCWlmIChtYXNrICYgQUFfTUFZX0xJTkspCisJCSptKysgPSAnbCc7CisJaWYgKG1hc2sgJiBBQV9NQVlfTE9DSykKKwkJKm0rKyA9ICdrJzsKKwlpZiAobWFzayAmIE1BWV9FWEVDKQorCQkqbSsrID0gJ3gnOworCSptID0gJ1wwJzsKKworCWF1ZGl0X2xvZ19zdHJpbmcoYWIsIHN0cik7Cit9CisKKy8qKgorICogZmlsZV9hdWRpdF9jYiAtIGNhbGwgYmFjayBmb3IgZmlsZSBzcGVjaWZpYyBhdWRpdCBmaWVsZHMKKyAqIEBhYjogYXVkaXRfYnVmZmVyICAoTk9UIE5VTEwpCisgKiBAdmE6IGF1ZGl0IHN0cnVjdCB0byBhdWRpdCB2YWx1ZXMgb2YgIChOT1QgTlVMTCkKKyAqLworc3RhdGljIHZvaWQgZmlsZV9hdWRpdF9jYihzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgdm9pZCAqdmEpCit7CisJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICpzYSA9IHZhOworCXVpZF90IGZzdWlkID0gY3VycmVudF9mc3VpZCgpOworCisJaWYgKHNhLT5hYWQuZnMucmVxdWVzdCAmIEFBX0FVRElUX0ZJTEVfTUFTSykgeworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHJlcXVlc3RlZF9tYXNrPSIpOworCQlhdWRpdF9maWxlX21hc2soYWIsIHNhLT5hYWQuZnMucmVxdWVzdCk7CisJfQorCWlmIChzYS0+YWFkLmZzLmRlbmllZCAmIEFBX0FVRElUX0ZJTEVfTUFTSykgeworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGRlbmllZF9tYXNrPSIpOworCQlhdWRpdF9maWxlX21hc2soYWIsIHNhLT5hYWQuZnMuZGVuaWVkKTsKKwl9CisJaWYgKHNhLT5hYWQuZnMucmVxdWVzdCAmIEFBX0FVRElUX0ZJTEVfTUFTSykgeworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGZzdWlkPSVkIiwgZnN1aWQpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG91aWQ9JWQiLCBzYS0+YWFkLmZzLm91aWQpOworCX0KKworCWlmIChzYS0+YWFkLmZzLnRhcmdldCkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHRhcmdldD0iKTsKKwkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgc2EtPmFhZC5mcy50YXJnZXQpOworCX0KK30KKworLyoqCisgKiBhYV9hdWRpdF9maWxlIC0gaGFuZGxlIHRoZSBhdWRpdGluZyBvZiBmaWxlIG9wZXJhdGlvbnMKKyAqIEBwcm9maWxlOiB0aGUgcHJvZmlsZSBiZWluZyBlbmZvcmNlZCAgKE5PVCBOVUxMKQorICogQHBlcm1zOiB0aGUgcGVybWlzc2lvbnMgY29tcHV0ZWQgZm9yIHRoZSByZXF1ZXN0IChOT1QgTlVMTCkKKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqIEBvcDogb3BlcmF0aW9uIGJlaW5nIG1lZGlhdGVkCisgKiBAcmVxdWVzdDogcGVybWlzc2lvbnMgcmVxdWVzdGVkCisgKiBAbmFtZTogbmFtZSBvZiBvYmplY3QgYmVpbmcgbWVkaWF0ZWQgKE1BWUJFIE5VTEwpCisgKiBAdGFyZ2V0OiBuYW1lIG9mIHRhcmdldCAoTUFZQkUgTlVMTCkKKyAqIEBvdWlkOiBvYmplY3QgdWlkCisgKiBAaW5mbzogZXh0cmEgaW5mb3JtYXRpb24gbWVzc2FnZSAoTUFZQkUgTlVMTCkKKyAqIEBlcnJvcjogMCBpZiBvcGVyYXRpb24gYWxsb3dlZCBlbHNlIGZhaWx1cmUgZXJyb3IgY29kZQorICoKKyAqIFJldHVybnM6ICUwIG9yIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGFhX2F1ZGl0X2ZpbGUoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHN0cnVjdCBmaWxlX3Blcm1zICpwZXJtcywKKwkJICBnZnBfdCBnZnAsIGludCBvcCwgdTMyIHJlcXVlc3QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgY29uc3QgY2hhciAqdGFyZ2V0LCB1aWRfdCBvdWlkLCBjb25zdCBjaGFyICppbmZvLCBpbnQgZXJyb3IpCit7CisJaW50IHR5cGUgPSBBVURJVF9BUFBBUk1PUl9BVVRPOworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBzYTsKKwlDT01NT05fQVVESVRfREFUQV9JTklUKCZzYSwgTk9ORSk7CisJc2EuYWFkLm9wID0gb3AsCisJc2EuYWFkLmZzLnJlcXVlc3QgPSByZXF1ZXN0OworCXNhLmFhZC5uYW1lID0gbmFtZTsKKwlzYS5hYWQuZnMudGFyZ2V0ID0gdGFyZ2V0OworCXNhLmFhZC5mcy5vdWlkID0gb3VpZDsKKwlzYS5hYWQuaW5mbyA9IGluZm87CisJc2EuYWFkLmVycm9yID0gZXJyb3I7CisKKwlpZiAobGlrZWx5KCFzYS5hYWQuZXJyb3IpKSB7CisJCXUzMiBtYXNrID0gcGVybXMtPmF1ZGl0OworCisJCWlmICh1bmxpa2VseShBVURJVF9NT0RFKHByb2ZpbGUpID09IEFVRElUX0FMTCkpCisJCQltYXNrID0gMHhmZmZmOworCisJCS8qIG1hc2sgb2ZmIHBlcm1zIHRoYXQgYXJlIG5vdCBiZWluZyBmb3JjZSBhdWRpdGVkICovCisJCXNhLmFhZC5mcy5yZXF1ZXN0ICY9IG1hc2s7CisKKwkJaWYgKGxpa2VseSghc2EuYWFkLmZzLnJlcXVlc3QpKQorCQkJcmV0dXJuIDA7CisJCXR5cGUgPSBBVURJVF9BUFBBUk1PUl9BVURJVDsKKwl9IGVsc2UgeworCQkvKiBvbmx5IHJlcG9ydCBwZXJtaXNzaW9ucyB0aGF0IHdlcmUgZGVuaWVkICovCisJCXNhLmFhZC5mcy5yZXF1ZXN0ID0gc2EuYWFkLmZzLnJlcXVlc3QgJiB+cGVybXMtPmFsbG93OworCisJCWlmIChzYS5hYWQuZnMucmVxdWVzdCAmIHBlcm1zLT5raWxsKQorCQkJdHlwZSA9IEFVRElUX0FQUEFSTU9SX0tJTEw7CisKKwkJLyogcXVpZXQga25vd24gcmVqZWN0cywgYXNzdW1lcyBxdWlldCBhbmQga2lsbCBkbyBub3Qgb3ZlcmxhcCAqLworCQlpZiAoKHNhLmFhZC5mcy5yZXF1ZXN0ICYgcGVybXMtPnF1aWV0KSAmJgorCQkgICAgQVVESVRfTU9ERShwcm9maWxlKSAhPSBBVURJVF9OT1FVSUVUICYmCisJCSAgICBBVURJVF9NT0RFKHByb2ZpbGUpICE9IEFVRElUX0FMTCkKKwkJCXNhLmFhZC5mcy5yZXF1ZXN0ICY9IH5wZXJtcy0+cXVpZXQ7CisKKwkJaWYgKCFzYS5hYWQuZnMucmVxdWVzdCkKKwkJCXJldHVybiBDT01QTEFJTl9NT0RFKHByb2ZpbGUpID8gMCA6IHNhLmFhZC5lcnJvcjsKKwl9CisKKwlzYS5hYWQuZnMuZGVuaWVkID0gc2EuYWFkLmZzLnJlcXVlc3QgJiB+cGVybXMtPmFsbG93OworCXJldHVybiBhYV9hdWRpdCh0eXBlLCBwcm9maWxlLCBnZnAsICZzYSwgZmlsZV9hdWRpdF9jYik7Cit9CisKKy8qKgorICogbWFwX29sZF9wZXJtcyAtIG1hcCBvbGQgZmlsZSBwZXJtcyBsYXlvdXQgdG8gdGhlIG5ldyBsYXlvdXQKKyAqIEBvbGQ6IHBlcm1pc3Npb24gc2V0IGluIG9sZCBtYXBwaW5nCisgKgorICogUmV0dXJuczogbmV3IHBlcm1pc3Npb24gbWFwcGluZworICovCitzdGF0aWMgdTMyIG1hcF9vbGRfcGVybXModTMyIG9sZCkKK3sKKwl1MzIgbmV3ID0gb2xkICYgMHhmOworCWlmIChvbGQgJiBNQVlfUkVBRCkKKwkJbmV3IHw9IEFBX01BWV9NRVRBX1JFQUQ7CisJaWYgKG9sZCAmIE1BWV9XUklURSkKKwkJbmV3IHw9IEFBX01BWV9NRVRBX1dSSVRFIHwgQUFfTUFZX0NSRUFURSB8IEFBX01BWV9ERUxFVEUgfAorCQkJQUFfTUFZX0NITU9EIHwgQUFfTUFZX0NIT1dOOworCWlmIChvbGQgJiAweDEwKQorCQluZXcgfD0gQUFfTUFZX0xJTks7CisJLyogdGhlIG9sZCBtYXBwaW5nIGxvY2sgYW5kIGxpbmtfc3Vic2V0IGZsYWdzIHdoZXJlIG92ZXJsYWlkCisJICogYW5kIHVzZSB3YXMgZGV0ZXJtaW5lZCBieSBwYXJ0IG9mIGEgcGFpciB0aGF0IHRoZXkgd2VyZSBpbgorCSAqLworCWlmIChvbGQgJiAweDIwKQorCQluZXcgfD0gQUFfTUFZX0xPQ0sgfCBBQV9MSU5LX1NVQlNFVDsKKwlpZiAob2xkICYgMHg0MCkJLyogQUFfRVhFQ19NTUFQICovCisJCW5ldyB8PSBBQV9FWEVDX01NQVA7CisKKwluZXcgfD0gQUFfTUFZX01FVEFfUkVBRDsKKworCXJldHVybiBuZXc7Cit9CisKKy8qKgorICogY29tcHV0ZV9wZXJtcyAtIGNvbnZlcnQgZGZhIGNvbXByZXNzZWQgcGVybXMgdG8gaW50ZXJuYWwgcGVybXMKKyAqIEBkZmE6IGRmYSB0byBjb21wdXRlIHBlcm1zIGZvciAgIChOT1QgTlVMTCkKKyAqIEBzdGF0ZTogc3RhdGUgaW4gZGZhCisgKiBAY29uZDogIGNvbmRpdGlvbnMgdG8gY29uc2lkZXIgIChOT1QgTlVMTCkKKyAqCisgKiBUT0RPOiBjb252ZXJ0IGZyb20gZGZhICsgc3RhdGUgdG8gcGVybWlzc2lvbiBlbnRyeSwgZG8gY29tcHV0YXRpb24gY29udmVyc2lvbgorICogICAgICAgYXQgbG9hZCB0aW1lLgorICoKKyAqIFJldHVybnM6IGNvbXB1dGVkIHBlcm1pc3Npb24gc2V0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9wZXJtcyBjb21wdXRlX3Blcm1zKHN0cnVjdCBhYV9kZmEgKmRmYSwgdW5zaWduZWQgaW50IHN0YXRlLAorCQkJCSAgICAgICBzdHJ1Y3QgcGF0aF9jb25kICpjb25kKQoreworCXN0cnVjdCBmaWxlX3Blcm1zIHBlcm1zOworCisJLyogRklYTUU6IGNoYW5nZSBvdmVyIHRvIG5ldyBkZmEgZm9ybWF0CisJICogY3VycmVudGx5IGZpbGUgcGVybXMgYXJlIGVuY29kZWQgaW4gdGhlIGRmYSwgbmV3IGZvcm1hdAorCSAqIHNwbGl0cyB0aGUgcGVybWlzc2lvbnMgZnJvbSB0aGUgZGZhLiAgVGhpcyBtYXBwaW5nIGNhbiBiZQorCSAqIGRvbmUgYXQgcHJvZmlsZSBsb2FkCisJICovCisJcGVybXMua2lsbCA9IDA7CisKKwlpZiAoY3VycmVudF9mc3VpZCgpID09IGNvbmQtPnVpZCkgeworCQlwZXJtcy5hbGxvdyA9IG1hcF9vbGRfcGVybXMoZGZhX3VzZXJfYWxsb3coZGZhLCBzdGF0ZSkpOworCQlwZXJtcy5hdWRpdCA9IG1hcF9vbGRfcGVybXMoZGZhX3VzZXJfYXVkaXQoZGZhLCBzdGF0ZSkpOworCQlwZXJtcy5xdWlldCA9IG1hcF9vbGRfcGVybXMoZGZhX3VzZXJfcXVpZXQoZGZhLCBzdGF0ZSkpOworCQlwZXJtcy54aW5kZXggPSBkZmFfdXNlcl94aW5kZXgoZGZhLCBzdGF0ZSk7CisJfSBlbHNlIHsKKwkJcGVybXMuYWxsb3cgPSBtYXBfb2xkX3Blcm1zKGRmYV9vdGhlcl9hbGxvdyhkZmEsIHN0YXRlKSk7CisJCXBlcm1zLmF1ZGl0ID0gbWFwX29sZF9wZXJtcyhkZmFfb3RoZXJfYXVkaXQoZGZhLCBzdGF0ZSkpOworCQlwZXJtcy5xdWlldCA9IG1hcF9vbGRfcGVybXMoZGZhX290aGVyX3F1aWV0KGRmYSwgc3RhdGUpKTsKKwkJcGVybXMueGluZGV4ID0gZGZhX290aGVyX3hpbmRleChkZmEsIHN0YXRlKTsKKwl9CisKKwkvKiBjaGFuZ2VfcHJvZmlsZSB3YXNuJ3QgZGV0ZXJtaW5lZCBieSBvd25lcnNoaXAgaW4gb2xkIG1hcHBpbmcgKi8KKwlpZiAoQUNDRVBUX1RBQkxFKGRmYSlbc3RhdGVdICYgMHg4MDAwMDAwMCkKKwkJcGVybXMuYWxsb3cgfD0gQUFfTUFZX0NIQU5HRV9QUk9GSUxFOworCisJcmV0dXJuIHBlcm1zOworfQorCisvKioKKyAqIGFhX3N0cl9wZXJtcyAtIGZpbmQgcGVybWlzc2lvbiB0aGF0IG1hdGNoIEBuYW1lCisgKiBAZGZhOiB0byBtYXRjaCBhZ2FpbnN0ICAoTUFZQkUgTlVMTCkKKyAqIEBzdGF0ZTogc3RhdGUgdG8gc3RhcnQgbWF0Y2hpbmcgaW4KKyAqIEBuYW1lOiBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdCBkZmEgIChOT1QgTlVMTCkKKyAqIEBjb25kOiBjb25kaXRpb25zIHRvIGNvbnNpZGVyIGZvciBwZXJtaXNzaW9uIHNldCBjb21wdXRhdGlvbiAgKE5PVCBOVUxMKQorICogQHBlcm1zOiBSZXR1cm5zIC0gdGhlIHBlcm1pc3Npb25zIGZvdW5kIHdoZW4gbWF0Y2hpbmcgQG5hbWUKKyAqCisgKiBSZXR1cm5zOiB0aGUgZmluYWwgc3RhdGUgaW4gQGRmYSB3aGVuIGJlZ2lubmluZyBAc3RhcnQgYW5kIHdhbGtpbmcgQG5hbWUKKyAqLwordW5zaWduZWQgaW50IGFhX3N0cl9wZXJtcyhzdHJ1Y3QgYWFfZGZhICpkZmEsIHVuc2lnbmVkIGludCBzdGFydCwKKwkJCSAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHBhdGhfY29uZCAqY29uZCwKKwkJCSAgc3RydWN0IGZpbGVfcGVybXMgKnBlcm1zKQoreworCXVuc2lnbmVkIGludCBzdGF0ZTsKKwlpZiAoIWRmYSkgeworCQkqcGVybXMgPSBudWxscGVybXM7CisJCXJldHVybiBERkFfTk9NQVRDSDsKKwl9CisKKwlzdGF0ZSA9IGFhX2RmYV9tYXRjaChkZmEsIHN0YXJ0LCBuYW1lKTsKKwkqcGVybXMgPSBjb21wdXRlX3Blcm1zKGRmYSwgc3RhdGUsIGNvbmQpOworCisJcmV0dXJuIHN0YXRlOworfQorCisvKioKKyAqIGlzX2RlbGV0ZWQgLSB0ZXN0IGlmIGEgZmlsZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHVubGlua2VkCisgKiBAZGVudHJ5OiBkZW50cnkgb2YgZmlsZSB0byB0ZXN0IGZvciBkZWxldGlvbiAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6ICUxIGlmIGRlbGV0ZWQgZWxzZSAlMAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZGVsZXRlZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaWYgKGRfdW5saW5rZWQoZGVudHJ5KSAmJiBkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWFfcGF0aF9wZXJtIC0gZG8gcGVybWlzc2lvbnMgY2hlY2sgJiBhdWRpdCBmb3IgQHBhdGgKKyAqIEBvcDogb3BlcmF0aW9uIGJlaW5nIGNoZWNrZWQKKyAqIEBwcm9maWxlOiBwcm9maWxlIGJlaW5nIGVuZm9yY2VkICAoTk9UIE5VTEwpCisgKiBAcGF0aDogcGF0aCB0byBjaGVjayBwZXJtaXNzaW9ucyBvZiAgKE5PVCBOVUxMKQorICogQGZsYWdzOiBhbnkgYWRkaXRpb25hbCBwYXRoIGZsYWdzIGJleW9uZCB3aGF0IHRoZSBwcm9maWxlIHNwZWNpZmllcworICogQHJlcXVlc3Q6IHJlcXVlc3RlZCBwZXJtaXNzaW9ucworICogQGNvbmQ6IGNvbmRpdGlvbmFsIGluZm8gZm9yIHRoaXMgcmVxdWVzdCAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6ICUwIGVsc2UgZXJyb3IgaWYgYWNjZXNzIGRlbmllZCBvciBvdGhlciBlcnJvcgorICovCitpbnQgYWFfcGF0aF9wZXJtKGludCBvcCwgc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHN0cnVjdCBwYXRoICpwYXRoLAorCQkgaW50IGZsYWdzLCB1MzIgcmVxdWVzdCwgc3RydWN0IHBhdGhfY29uZCAqY29uZCkKK3sKKwljaGFyICpidWZmZXIgPSBOVUxMOworCXN0cnVjdCBmaWxlX3Blcm1zIHBlcm1zID0ge307CisJY29uc3QgY2hhciAqbmFtZSwgKmluZm8gPSBOVUxMOworCWludCBlcnJvcjsKKworCWZsYWdzIHw9IHByb2ZpbGUtPnBhdGhfZmxhZ3MgfCAoU19JU0RJUihjb25kLT5tb2RlKSA/IFBBVEhfSVNfRElSIDogMCk7CisJZXJyb3IgPSBhYV9nZXRfbmFtZShwYXRoLCBmbGFncywgJmJ1ZmZlciwgJm5hbWUpOworCWlmIChlcnJvcikgeworCQlpZiAoZXJyb3IgPT0gLUVOT0VOVCAmJiBpc19kZWxldGVkKHBhdGgtPmRlbnRyeSkpIHsKKwkJCS8qIEFjY2VzcyB0byBvcGVuIGZpbGVzIHRoYXQgYXJlIGRlbGV0ZWQgYXJlCisJCQkgKiBnaXZlIGEgcGFzcyAoaW1wbGljaXQgZGVsZWdhdGlvbikKKwkJCSAqLworCQkJZXJyb3IgPSAwOworCQkJcGVybXMuYWxsb3cgPSByZXF1ZXN0OworCQl9IGVsc2UgaWYgKGVycm9yID09IC1FTk9FTlQpCisJCQlpbmZvID0gIkZhaWxlZCBuYW1lIGxvb2t1cCAtIGRlbGV0ZWQgZW50cnkiOworCQllbHNlIGlmIChlcnJvciA9PSAtRVNUQUxFKQorCQkJaW5mbyA9ICJGYWlsZWQgbmFtZSBsb29rdXAgLSBkaXNjb25uZWN0ZWQgcGF0aCI7CisJCWVsc2UgaWYgKGVycm9yID09IC1FTkFNRVRPT0xPTkcpCisJCQlpbmZvID0gIkZhaWxlZCBuYW1lIGxvb2t1cCAtIG5hbWUgdG9vIGxvbmciOworCQllbHNlCisJCQlpbmZvID0gIkZhaWxlZCBuYW1lIGxvb2t1cCI7CisJfSBlbHNlIHsKKwkJYWFfc3RyX3Blcm1zKHByb2ZpbGUtPmZpbGUuZGZhLCBwcm9maWxlLT5maWxlLnN0YXJ0LCBuYW1lLCBjb25kLAorCQkJICAgICAmcGVybXMpOworCQlpZiAocmVxdWVzdCAmIH5wZXJtcy5hbGxvdykKKwkJCWVycm9yID0gLUVBQ0NFUzsKKwl9CisJZXJyb3IgPSBhYV9hdWRpdF9maWxlKHByb2ZpbGUsICZwZXJtcywgR0ZQX0tFUk5FTCwgb3AsIHJlcXVlc3QsIG5hbWUsCisJCQkgICAgICBOVUxMLCBjb25kLT51aWQsIGluZm8sIGVycm9yKTsKKwlrZnJlZShidWZmZXIpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIHhpbmRleF9pc19zdWJzZXQgLSBoZWxwZXIgZm9yIGFhX3BhdGhfbGluaworICogQGxpbms6IGxpbmsgcGVybWlzc2lvbiBzZXQKKyAqIEB0YXJnZXQ6IHRhcmdldCBwZXJtaXNzaW9uIHNldAorICoKKyAqIHRlc3QgdGFyZ2V0IHggcGVybWlzc2lvbnMgYXJlIGVxdWFsIE9SIGEgc3Vic2V0IG9mIGxpbmsgeCBwZXJtaXNzaW9ucworICogdGhpcyBpcyBkb25lIGFzIHBhcnQgb2YgdGhlIHN1YnNldCB0ZXN0LCB3aGVyZSBhIGhhcmRsaW5rIG11c3QgaGF2ZQorICogYSBzdWJzZXQgb2YgcGVybWlzc2lvbnMgdGhhdCB0aGUgdGFyZ2V0IGhhcy4KKyAqCisgKiBSZXR1cm5zOiAlMSBpZiBzdWJzZXQgZWxzZSAlMAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgeGluZGV4X2lzX3N1YnNldCh1MzIgbGluaywgdTMyIHRhcmdldCkKK3sKKwlpZiAoKChsaW5rICYgfkFBX1hfVU5TQUZFKSAhPSAodGFyZ2V0ICYgfkFBX1hfVU5TQUZFKSkgfHwKKwkgICAgKChsaW5rICYgQUFfWF9VTlNBRkUpICYmICEodGFyZ2V0ICYgQUFfWF9VTlNBRkUpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBhYV9wYXRoX2xpbmsgLSBIYW5kbGUgaGFyZCBsaW5rIHBlcm1pc3Npb24gY2hlY2sKKyAqIEBwcm9maWxlOiB0aGUgcHJvZmlsZSBiZWluZyBlbmZvcmNlZCAgKE5PVCBOVUxMKQorICogQG9sZF9kZW50cnk6IHRoZSB0YXJnZXQgZGVudHJ5ICAoTk9UIE5VTEwpCisgKiBAbmV3X2RpcjogZGlyZWN0b3J5IHRoZSBuZXcgbGluayB3aWxsIGJlIGNyZWF0ZWQgaW4gIChOT1QgTlVMTCkKKyAqIEBuZXdfZGVudHJ5OiB0aGUgbGluayBiZWluZyBjcmVhdGVkICAoTk9UIE5VTEwpCisgKgorICogSGFuZGxlIHRoZSBwZXJtaXNzaW9uIHRlc3QgZm9yIGEgbGluayAmIHRhcmdldCBwYWlyLiAgUGVybWlzc2lvbgorICogaXMgZW5jb2RlZCBhcyBhIHBhaXIgd2hlcmUgdGhlIGxpbmsgcGVybWlzc2lvbiBpcyBkZXRlcm1pbmVkCisgKiBmaXJzdCwgYW5kIGlmIGFsbG93ZWQsIHRoZSB0YXJnZXQgaXMgdGVzdGVkLiAgVGhlIHRhcmdldCB0ZXN0CisgKiBpcyBkb25lIGZyb20gdGhlIHBvaW50IG9mIHRoZSBsaW5rIG1hdGNoIChub3Qgc3RhcnQgb2YgREZBKQorICogbWFraW5nIHRoZSB0YXJnZXQgcGVybWlzc2lvbiBkZXBlbmRlbnQgb24gdGhlIGxpbmsgcGVybWlzc2lvbiBtYXRjaC4KKyAqCisgKiBUaGUgc3Vic2V0IHRlc3QgaWYgcmVxdWlyZWQgZm9yY2VzIHRoYXQgcGVybWlzc2lvbnMgZ3JhbnRlZAorICogb24gbGluayBhcmUgYSBzdWJzZXQgb2YgdGhlIHBlcm1pc3Npb24gZ3JhbnRlZCB0byB0YXJnZXQuCisgKgorICogUmV0dXJuczogJTAgaWYgYWxsb3dlZCBlbHNlIGVycm9yCisgKi8KK2ludCBhYV9wYXRoX2xpbmsoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSBzdHJ1Y3QgcGF0aCAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgcGF0aCBsaW5rID0geyBuZXdfZGlyLT5tbnQsIG5ld19kZW50cnkgfTsKKwlzdHJ1Y3QgcGF0aCB0YXJnZXQgPSB7IG5ld19kaXItPm1udCwgb2xkX2RlbnRyeSB9OworCXN0cnVjdCBwYXRoX2NvbmQgY29uZCA9IHsKKwkJb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV91aWQsCisJCW9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZQorCX07CisJY2hhciAqYnVmZmVyID0gTlVMTCwgKmJ1ZmZlcjIgPSBOVUxMOworCWNvbnN0IGNoYXIgKmxuYW1lLCAqdG5hbWUgPSBOVUxMLCAqaW5mbyA9IE5VTEw7CisJc3RydWN0IGZpbGVfcGVybXMgbHBlcm1zLCBwZXJtczsKKwl1MzIgcmVxdWVzdCA9IEFBX01BWV9MSU5LOworCXVuc2lnbmVkIGludCBzdGF0ZTsKKwlpbnQgZXJyb3I7CisKKwlscGVybXMgPSBudWxscGVybXM7CisKKwkvKiBidWZmZXIgZnJlZWQgYmVsb3csIGxuYW1lIGlzIHBvaW50ZXIgaW4gYnVmZmVyICovCisJZXJyb3IgPSBhYV9nZXRfbmFtZSgmbGluaywgcHJvZmlsZS0+cGF0aF9mbGFncywgJmJ1ZmZlciwgJmxuYW1lKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gYXVkaXQ7CisKKwkvKiBidWZmZXIyIGZyZWVkIGJlbG93LCB0bmFtZSBpcyBwb2ludGVyIGluIGJ1ZmZlcjIgKi8KKwllcnJvciA9IGFhX2dldF9uYW1lKCZ0YXJnZXQsIHByb2ZpbGUtPnBhdGhfZmxhZ3MsICZidWZmZXIyLCAmdG5hbWUpOworCWlmIChlcnJvcikKKwkJZ290byBhdWRpdDsKKworCWVycm9yID0gLUVBQ0NFUzsKKwkvKiBhYV9zdHJfcGVybXMgLSBoYW5kbGVzIHRoZSBjYXNlIG9mIHRoZSBkZmEgYmVpbmcgTlVMTCAqLworCXN0YXRlID0gYWFfc3RyX3Blcm1zKHByb2ZpbGUtPmZpbGUuZGZhLCBwcm9maWxlLT5maWxlLnN0YXJ0LCBsbmFtZSwKKwkJCSAgICAgJmNvbmQsICZscGVybXMpOworCisJaWYgKCEobHBlcm1zLmFsbG93ICYgQUFfTUFZX0xJTkspKQorCQlnb3RvIGF1ZGl0OworCisJLyogdGVzdCB0byBzZWUgaWYgdGFyZ2V0IGNhbiBiZSBwYWlyZWQgd2l0aCBsaW5rICovCisJc3RhdGUgPSBhYV9kZmFfbnVsbF90cmFuc2l0aW9uKHByb2ZpbGUtPmZpbGUuZGZhLCBzdGF0ZSk7CisJYWFfc3RyX3Blcm1zKHByb2ZpbGUtPmZpbGUuZGZhLCBzdGF0ZSwgdG5hbWUsICZjb25kLCAmcGVybXMpOworCisJLyogZm9yY2UgYXVkaXQvcXVpZXQgbWFza3MgZm9yIGxpbmsgYXJlIHN0b3JlZCBpbiB0aGUgc2Vjb25kIGVudHJ5CisJICogaW4gdGhlIGxpbmsgcGFpci4KKwkgKi8KKwlscGVybXMuYXVkaXQgPSBwZXJtcy5hdWRpdDsKKwlscGVybXMucXVpZXQgPSBwZXJtcy5xdWlldDsKKwlscGVybXMua2lsbCA9IHBlcm1zLmtpbGw7CisKKwlpZiAoIShwZXJtcy5hbGxvdyAmIEFBX01BWV9MSU5LKSkgeworCQlpbmZvID0gInRhcmdldCByZXN0cmljdGVkIjsKKwkJZ290byBhdWRpdDsKKwl9CisKKwkvKiBkb25lIGlmIGxpbmsgc3Vic2V0IHRlc3QgaXMgbm90IHJlcXVpcmVkICovCisJaWYgKCEocGVybXMuYWxsb3cgJiBBQV9MSU5LX1NVQlNFVCkpCisJCWdvdG8gZG9uZV90ZXN0czsKKworCS8qIERvIGxpbmsgcGVybSBzdWJzZXQgdGVzdCByZXF1aXJpbmcgYWxsb3dlZCBwZXJtaXNzaW9uIG9uIGxpbmsgYXJlIGEKKwkgKiBzdWJzZXQgb2YgdGhlIGFsbG93ZWQgcGVybWlzc2lvbnMgb24gdGFyZ2V0LgorCSAqLworCWFhX3N0cl9wZXJtcyhwcm9maWxlLT5maWxlLmRmYSwgcHJvZmlsZS0+ZmlsZS5zdGFydCwgdG5hbWUsICZjb25kLAorCQkgICAgICZwZXJtcyk7CisKKwkvKiBBQV9NQVlfTElOSyBpcyBub3QgY29uc2lkZXJlZCBpbiB0aGUgc3Vic2V0IHRlc3QgKi8KKwlyZXF1ZXN0ID0gbHBlcm1zLmFsbG93ICYgfkFBX01BWV9MSU5LOworCWxwZXJtcy5hbGxvdyAmPSBwZXJtcy5hbGxvdyB8IEFBX01BWV9MSU5LOworCisJcmVxdWVzdCB8PSBBQV9BVURJVF9GSUxFX01BU0sgJiAobHBlcm1zLmFsbG93ICYgfnBlcm1zLmFsbG93KTsKKwlpZiAocmVxdWVzdCAmIH5scGVybXMuYWxsb3cpIHsKKwkJZ290byBhdWRpdDsKKwl9IGVsc2UgaWYgKChscGVybXMuYWxsb3cgJiBNQVlfRVhFQykgJiYKKwkJICAgIXhpbmRleF9pc19zdWJzZXQobHBlcm1zLnhpbmRleCwgcGVybXMueGluZGV4KSkgeworCQlscGVybXMuYWxsb3cgJj0gfk1BWV9FWEVDOworCQlyZXF1ZXN0IHw9IE1BWV9FWEVDOworCQlpbmZvID0gImxpbmsgbm90IHN1YnNldCBvZiB0YXJnZXQiOworCQlnb3RvIGF1ZGl0OworCX0KKworZG9uZV90ZXN0czoKKwllcnJvciA9IDA7CisKK2F1ZGl0OgorCWVycm9yID0gYWFfYXVkaXRfZmlsZShwcm9maWxlLCAmbHBlcm1zLCBHRlBfS0VSTkVMLCBPUF9MSU5LLCByZXF1ZXN0LAorCQkJICAgICAgbG5hbWUsIHRuYW1lLCBjb25kLnVpZCwgaW5mbywgZXJyb3IpOworCWtmcmVlKGJ1ZmZlcik7CisJa2ZyZWUoYnVmZmVyMik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYWFfZmlsZV9wZXJtIC0gZG8gcGVybWlzc2lvbiByZXZhbGlkYXRpb24gY2hlY2sgJiBhdWRpdCBmb3IgQGZpbGUKKyAqIEBvcDogb3BlcmF0aW9uIGJlaW5nIGNoZWNrZWQKKyAqIEBwcm9maWxlOiBwcm9maWxlIGJlaW5nIGVuZm9yY2VkICAgKE5PVCBOVUxMKQorICogQGZpbGU6IGZpbGUgdG8gcmV2YWxpZGF0ZSBhY2Nlc3MgcGVybWlzc2lvbnMgb24gIChOT1QgTlVMTCkKKyAqIEByZXF1ZXN0OiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMKKyAqCisgKiBSZXR1cm5zOiAlMCBpZiBhY2Nlc3MgYWxsb3dlZCBlbHNlIGVycm9yCisgKi8KK2ludCBhYV9maWxlX3Blcm0oaW50IG9wLCBzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSB1MzIgcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgcGF0aF9jb25kIGNvbmQgPSB7CisJCS51aWQgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3VpZCwKKwkJLm1vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUKKwl9OworCisJcmV0dXJuIGFhX3BhdGhfcGVybShvcCwgcHJvZmlsZSwgJmZpbGUtPmZfcGF0aCwgUEFUSF9ERUxFR0FURV9ERUxFVEVELAorCQkJICAgIHJlcXVlc3QsICZjb25kKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvYXBwYXJtb3IuaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvYXBwYXJtb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGNjYWVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9hcHBhcm1vci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgYmFzaWMgZ2xvYmFsIGFuZCBsaWIgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQVBQQVJNT1JfSAorI2RlZmluZSBfX0FQUEFSTU9SX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJtYXRjaC5oIgorCisvKiBDb250cm9sIHBhcmFtZXRlcnMgc2V0dGFibGUgdGhyb3VnaCBtb2R1bGUvYm9vdCBmbGFncyAqLworZXh0ZXJuIGVudW0gYXVkaXRfbW9kZSBhYV9nX2F1ZGl0OworZXh0ZXJuIGludCBhYV9nX2F1ZGl0X2hlYWRlcjsKK2V4dGVybiBpbnQgYWFfZ19kZWJ1ZzsKK2V4dGVybiBpbnQgYWFfZ19sb2NrX3BvbGljeTsKK2V4dGVybiBpbnQgYWFfZ19sb2dzeXNjYWxsOworZXh0ZXJuIGludCBhYV9nX3BhcmFub2lkX2xvYWQ7CitleHRlcm4gdW5zaWduZWQgaW50IGFhX2dfcGF0aF9tYXg7CisKKy8qCisgKiBERUJVRyByZW1haW5zIGdsb2JhbCAobm8gcGVyIHByb2ZpbGUgZmxhZykgc2luY2UgaXQgaXMgbW9zdGx5IHVzZWQgaW4gc3lzY3RsCisgKiB3aGljaCBpcyBub3QgcmVsYXRlZCB0byBwcm9maWxlIGFjY2Vzc2VzLgorICovCisKKyNkZWZpbmUgQUFfREVCVUcoZm10LCBhcmdzLi4uKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChhYV9nX2RlYnVnICYmIHByaW50a19yYXRlbGltaXQoKSkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiQXBwQXJtb3I6ICIgZm10LCAjI2FyZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBBQV9FUlJPUihmbXQsIGFyZ3MuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiQXBwQXJtb3I6ICIgZm10LCAjI2FyZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkICovCitleHRlcm4gaW50IGFwcGFybW9yX2luaXRpYWxpemVkIF9faW5pdGRhdGE7CisKKy8qIGZuJ3MgaW4gbGliICovCitjaGFyICphYV9zcGxpdF9mcW5hbWUoY2hhciAqYXJncywgY2hhciAqKm5zX25hbWUpOwordm9pZCBhYV9pbmZvX21lc3NhZ2UoY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgKmt2bWFsbG9jKHNpemVfdCBzaXplKTsKK3ZvaWQga3ZmcmVlKHZvaWQgKmJ1ZmZlcik7CisKKworLyoqCisgKiBhYV9zdHJuZXEgLSBjb21wYXJlIG51bGwgdGVybWluYXRlZCBAc3RyIHRvIGEgbm9uIG51bGwgdGVybWluYXRlZCBzdWJzdHJpbmcKKyAqIEBzdHI6IGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZworICogQHN1YjogYSBzdWJzdHJpbmcsIG5vdCBuZWNlc3NhcmlseSBudWxsIHRlcm1pbmF0ZWQKKyAqIEBsZW46IGxlbmd0aCBvZiBAc3ViIHRvIGNvbXBhcmUKKyAqCisgKiBUaGUgQHN0ciBzdHJpbmcgbXVzdCBiZSBmdWxsIGNvbnN1bWVkIGZvciB0aGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBtYXRjaAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgYWFfc3RybmVxKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc3ViLCBpbnQgbGVuKQoreworCXJldHVybiAhc3RybmNtcChzdHIsIHN1YiwgbGVuKSAmJiAhc3RyW2xlbl07Cit9CisKKy8qKgorICogYWFfZGZhX251bGxfdHJhbnNpdGlvbiAtIHN0ZXAgdG8gbmV4dCBzdGF0ZSBhZnRlciBudWxsIGNoYXJhY3RlcgorICogQGRmYTogdGhlIGRmYSB0byBtYXRjaCBhZ2FpbnN0CisgKiBAc3RhcnQ6IHRoZSBzdGF0ZSBvZiB0aGUgZGZhIHRvIHN0YXJ0IG1hdGNoaW5nIGluCisgKgorICogYWFfZGZhX251bGxfdHJhbnNpdGlvbiB0cmFuc2l0aW9ucyB0byB0aGUgbmV4dCBzdGF0ZSBhZnRlciBhIG51bGwKKyAqIGNoYXJhY3RlciB3aGljaCBpcyBub3QgdXNlZCBpbiBzdGFuZGFyZCBtYXRjaGluZyBhbmQgaXMgb25seQorICogdXNlZCB0byBzZXBhcmF0ZSBwYWlycy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYWFfZGZhX251bGxfdHJhbnNpdGlvbihzdHJ1Y3QgYWFfZGZhICpkZmEsCisJCQkJCQkgIHVuc2lnbmVkIGludCBzdGFydCkKK3sKKwkvKiB0aGUgbnVsbCB0cmFuc2l0aW9uIG9ubHkgbmVlZHMgdGhlIHN0cmluZydzIG51bGwgdGVybWluYXRvciBieXRlICovCisJcmV0dXJuIGFhX2RmYV9tYXRjaF9sZW4oZGZhLCBzdGFydCwgIiIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbWVkaWF0ZWRfZmlsZXN5c3RlbShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAhKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfTk9VU0VSKTsKK30KKworI2VuZGlmIC8qIF9fQVBQQVJNT1JfSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9hcHBhcm1vcmZzLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2FwcGFybW9yZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFlOTNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9hcHBhcm1vcmZzLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIEFwcEFybW9yIHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBBcHBBcm1vciBmaWxlc3lzdGVtIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BQV9BUFBBUk1PUkZTX0gKKyNkZWZpbmUgX19BQV9BUFBBUk1PUkZTX0gKKworZXh0ZXJuIHZvaWQgX19pbml0IGFhX2Rlc3Ryb3lfYWFmcyh2b2lkKTsKKworI2VuZGlmIC8qIF9fQUFfQVBQQVJNT1JGU19IICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2F1ZGl0LmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2F1ZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1MTc4NgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvYXVkaXQuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIEFwcEFybW9yIHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBBcHBBcm1vciBhdWRpdGluZyBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQUFfQVVESVRfSAorI2RlZmluZSBfX0FBX0FVRElUX0gKKworI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9sc21fYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImZpbGUuaCIKKworc3RydWN0IGFhX3Byb2ZpbGU7CisKK2V4dGVybiBjb25zdCBjaGFyICphdWRpdF9tb2RlX25hbWVzW107CisjZGVmaW5lIEFVRElUX01BWF9JTkRFWCA1CisKKyNkZWZpbmUgQVVESVRfQVBQQVJNT1JfQVVUTyAwCS8qIGF1dG8gY2hvb3NlIGF1ZGl0IG1lc3NhZ2UgdHlwZSAqLworCitlbnVtIGF1ZGl0X21vZGUgeworCUFVRElUX05PUk1BTCwJCS8qIGZvbGxvdyBub3JtYWwgYXVkaXRpbmcgb2YgYWNjZXNzZXMgKi8KKwlBVURJVF9RVUlFVF9ERU5JRUQsCS8qIHF1aWV0IGFsbCBkZW5pZWQgYWNjZXNzIG1lc3NhZ2VzICovCisJQVVESVRfUVVJRVQsCQkvKiBxdWlldCBhbGwgbWVzc2FnZXMgKi8KKwlBVURJVF9OT1FVSUVULAkJLyogZG8gbm90IHF1aWV0IGF1ZGl0IG1lc3NhZ2VzICovCisJQVVESVRfQUxMCQkvKiBhdWRpdCBhbGwgYWNjZXNzZXMgKi8KK307CisKK2VudW0gYXVkaXRfdHlwZSB7CisJQVVESVRfQVBQQVJNT1JfQVVESVQsCisJQVVESVRfQVBQQVJNT1JfQUxMT1dFRCwKKwlBVURJVF9BUFBBUk1PUl9ERU5JRUQsCisJQVVESVRfQVBQQVJNT1JfSElOVCwKKwlBVURJVF9BUFBBUk1PUl9TVEFUVVMsCisJQVVESVRfQVBQQVJNT1JfRVJST1IsCisJQVVESVRfQVBQQVJNT1JfS0lMTAorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wX3RhYmxlW107CitlbnVtIGFhX29wcyB7CisJT1BfTlVMTCwKKworCU9QX1NZU0NUTCwKKwlPUF9DQVBBQkxFLAorCisJT1BfVU5MSU5LLAorCU9QX01LRElSLAorCU9QX1JNRElSLAorCU9QX01LTk9ELAorCU9QX1RSVU5DLAorCU9QX0xJTkssCisJT1BfU1lNTElOSywKKwlPUF9SRU5BTUVfU1JDLAorCU9QX1JFTkFNRV9ERVNULAorCU9QX0NITU9ELAorCU9QX0NIT1dOLAorCU9QX0dFVEFUVFIsCisJT1BfT1BFTiwKKworCU9QX0ZQRVJNLAorCU9QX0ZMT0NLLAorCU9QX0ZNTUFQLAorCU9QX0ZNUFJPVCwKKworCU9QX0NSRUFURSwKKwlPUF9QT1NUX0NSRUFURSwKKwlPUF9CSU5ELAorCU9QX0NPTk5FQ1QsCisJT1BfTElTVEVOLAorCU9QX0FDQ0VQVCwKKwlPUF9TRU5ETVNHLAorCU9QX1JFQ1ZNU0csCisJT1BfR0VUU09DS05BTUUsCisJT1BfR0VUUEVFUk5BTUUsCisJT1BfR0VUU09DS09QVCwKKwlPUF9TRVRTT0NLT1BULAorCU9QX1NPQ0tfU0hVVERPV04sCisKKwlPUF9QVFJBQ0UsCisKKwlPUF9FWEVDLAorCU9QX0NIQU5HRV9IQVQsCisJT1BfQ0hBTkdFX1BST0ZJTEUsCisJT1BfQ0hBTkdFX09ORVhFQywKKworCU9QX1NFVFBST0NBVFRSLAorCU9QX1NFVFJMSU1JVCwKKworCU9QX1BST0ZfUkVQTCwKKwlPUF9QUk9GX0xPQUQsCisJT1BfUFJPRl9STSwKK307CisKKworLyogZGVmaW5lIGEgc2hvcnQgaGFuZCBmb3IgYXBwYXJtb3JfYXVkaXRfZGF0YSBwb3J0aW9uIG9mIGNvbW1vbl9hdWRpdF9kYXRhICovCisjZGVmaW5lIGFhZCBhcHBhcm1vcl9hdWRpdF9kYXRhCisKK3ZvaWQgYWFfYXVkaXRfbXNnKGludCB0eXBlLCBzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKnNhLAorCQkgIHZvaWQgKCpjYikgKHN0cnVjdCBhdWRpdF9idWZmZXIgKiwgdm9pZCAqKSk7CitpbnQgYWFfYXVkaXQoaW50IHR5cGUsIHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlLCBnZnBfdCBnZnAsCisJICAgICBzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKnNhLAorCSAgICAgdm9pZCAoKmNiKSAoc3RydWN0IGF1ZGl0X2J1ZmZlciAqLCB2b2lkICopKTsKKworc3RhdGljIGlubGluZSBpbnQgY29tcGxhaW5fZXJyb3IoaW50IGVycm9yKQoreworCWlmIChlcnJvciA9PSAtRVBFUk0gfHwgZXJyb3IgPT0gLUVBQ0NFUykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOworfQorCisjZW5kaWYgLyogX19BQV9BVURJVF9IICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2NhcGFiaWxpdHkuaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvY2FwYWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGQyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2NhcGFiaWxpdHkuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGNhcGFiaWxpdHkgbWVkaWF0aW9uIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BQV9DQVBBQklMSVRZX0gKKyNkZWZpbmUgX19BQV9DQVBBQklMSVRZX0gKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3N0cnVjdCBhYV9wcm9maWxlOworCisvKiBhYV9jYXBzIC0gY29uZmluZW1lbnQgZGF0YSBmb3IgY2FwYWJpbGl0aWVzCisgKiBAYWxsb3dlZDogY2FwYWJpbGl0aWVzIG1hc2sKKyAqIEBhdWRpdDogY2FwcyB0aGF0IGFyZSB0byBiZSBhdWRpdGVkCisgKiBAcXVpZXQ6IGNhcHMgdGhhdCBzaG91bGQgbm90IGJlIGF1ZGl0ZWQKKyAqIEBraWxsOiBjYXBzIHRoYXQgd2hlbiByZXF1ZXN0ZWQgd2lsbCByZXN1bHQgaW4gdGhlIHRhc2sgYmVpbmcga2lsbGVkCisgKiBAZXh0ZW5kZWQ6IGNhcHMgdGhhdCBhcmUgc3ViamVjdCBmaW5lciBncmFpbmVkIG1lZGlhdGlvbgorICovCitzdHJ1Y3QgYWFfY2FwcyB7CisJa2VybmVsX2NhcF90IGFsbG93OworCWtlcm5lbF9jYXBfdCBhdWRpdDsKKwlrZXJuZWxfY2FwX3QgcXVpZXQ7CisJa2VybmVsX2NhcF90IGtpbGw7CisJa2VybmVsX2NhcF90IGV4dGVuZGVkOworfTsKKworaW50IGFhX2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgaW50IGNhcCwKKwkgICAgICAgaW50IGF1ZGl0KTsKKworc3RhdGljIGlubGluZSB2b2lkIGFhX2ZyZWVfY2FwX3J1bGVzKHN0cnVjdCBhYV9jYXBzICpjYXBzKQoreworCS8qIE5PUCAqLworfQorCisjZW5kaWYgLyogX19BQV9DQVBCSUxJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9jb250ZXh0LmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWNiZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9jb250ZXh0LmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgY29udGV4dHMgdXNlZCB0byBhc3NvY2lhdGUgImxhYmVscyIgdG8gb2JqZWN0cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQUFfQ09OVEVYVF9ICisjZGVmaW5lIF9fQUFfQ09OVEVYVF9ICisKKyNpbmNsdWRlIDxsaW51eC9jcmVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworLyogc3RydWN0IGFhX2ZpbGVfY3h0IC0gdGhlIEFwcEFybW9yIGNvbnRleHQgdGhlIGZpbGUgd2FzIG9wZW5lZCBpbgorICogQHBlcm1zOiB0aGUgcGVybWlzc2lvbiB0aGUgZmlsZSB3YXMgb3BlbmVkIHdpdGgKKyAqCisgKiBUaGUgZmlsZV9jeHQgY291bGQgY3VycmVudGx5IGJlIGRpcmVjdGx5IHN0b3JlZCBpbiBmaWxlLT5mX3NlY3VyaXR5CisgKiBhcyB0aGUgcHJvZmlsZSByZWZlcmVuY2UgaXMgbm93IHN0b3JlZCBpbiB0aGUgZl9jcmVkLiAgSG93ZXZlciB0aGUKKyAqIGN4dCBzdHJ1Y3Qgd2lsbCBleHBhbmQgaW4gdGhlIGZ1dHVyZSBzbyB3ZSBrZWVwIHRoZSBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBhYV9maWxlX2N4dCB7CisJdTE2IGFsbG93OworfTsKKworLyoqCisgKiBhYV9hbGxvY19maWxlX2NvbnRleHQgLSBhbGxvY2F0ZSBmaWxlX2N4dAorICogQGdmcDogZ2ZwIGZsYWdzIGZvciBhbGxvY2F0aW9uCisgKgorICogUmV0dXJuczogZmlsZV9jeHQgb3IgTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFhX2ZpbGVfY3h0ICphYV9hbGxvY19maWxlX2NvbnRleHQoZ2ZwX3QgZ2ZwKQoreworCXJldHVybiBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWFfZmlsZV9jeHQpLCBnZnApOworfQorCisvKioKKyAqIGFhX2ZyZWVfZmlsZV9jb250ZXh0IC0gZnJlZSBhIGZpbGVfY3h0CisgKiBAY3h0OiBmaWxlX2N4dCB0byBmcmVlICAoTUFZQkVfTlVMTCkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFhX2ZyZWVfZmlsZV9jb250ZXh0KHN0cnVjdCBhYV9maWxlX2N4dCAqY3h0KQoreworCWlmIChjeHQpCisJCWt6ZnJlZShjeHQpOworfQorCisvKioKKyAqIHN0cnVjdCBhYV90YXNrX2N4dCAtIHByaW1hcnkgbGFiZWwgZm9yIGNvbmZpbmVkIHRhc2tzCisgKiBAcHJvZmlsZTogdGhlIGN1cnJlbnQgcHJvZmlsZSAgIChOT1QgTlVMTCkKKyAqIEBleGVjOiBwcm9maWxlIHRvIHRyYW5zaXRpb24gdG8gb24gbmV4dCBleGVjICAoTUFZQkUgTlVMTCkKKyAqIEBwcmV2aW91czogcHJvZmlsZSB0aGUgdGFzayBtYXkgcmV0dXJuIHRvICAgICAoTUFZQkUgTlVMTCkKKyAqIEB0b2tlbjogbWFnaWMgdmFsdWUgdGhlIHRhc2sgbXVzdCBrbm93IGZvciByZXR1cm5pbmcgdG8gQHByZXZpb3VzX3Byb2ZpbGUKKyAqCisgKiBDb250YWlucyB0aGUgdGFzaydzIGN1cnJlbnQgcHJvZmlsZSAod2hpY2ggY291bGQgY2hhbmdlIGR1ZSB0bworICogY2hhbmdlX2hhdCkuICBQbHVzIHRoZSBoYXRfbWFnaWMgbmVlZGVkIGR1cmluZyBjaGFuZ2VfaGF0LgorICoKKyAqIFRPRE86IG1ha2Ugc28gYSB0YXNrIGNhbiBiZSBjb25maW5lZCBieSBhIHN0YWNrIG9mIGNvbnRleHRzCisgKi8KK3N0cnVjdCBhYV90YXNrX2N4dCB7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJc3RydWN0IGFhX3Byb2ZpbGUgKm9uZXhlYzsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJldmlvdXM7CisJdTY0IHRva2VuOworfTsKKworc3RydWN0IGFhX3Rhc2tfY3h0ICphYV9hbGxvY190YXNrX2NvbnRleHQoZ2ZwX3QgZmxhZ3MpOwordm9pZCBhYV9mcmVlX3Rhc2tfY29udGV4dChzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dCk7Cit2b2lkIGFhX2R1cF90YXNrX2NvbnRleHQoc3RydWN0IGFhX3Rhc2tfY3h0ICpuZXcsCisJCQkgY29uc3Qgc3RydWN0IGFhX3Rhc2tfY3h0ICpvbGQpOworaW50IGFhX3JlcGxhY2VfY3VycmVudF9wcm9maWxlKHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlKTsKK2ludCBhYV9zZXRfY3VycmVudF9vbmV4ZWMoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUpOworaW50IGFhX3NldF9jdXJyZW50X2hhdChzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgdTY0IHRva2VuKTsKK2ludCBhYV9yZXN0b3JlX3ByZXZpb3VzX3Byb2ZpbGUodTY0IGNvb2tpZSk7CisKKy8qKgorICogX19hYV90YXNrX2lzX2NvbmZpbmVkIC0gZGV0ZXJtaW5lIGlmIEB0YXNrIGhhcyBhbnkgY29uZmluZW1lbnQKKyAqIEB0YXNrOiB0YXNrIHRvIGNoZWNrIGNvbmZpbmVtZW50IG9mICAoTk9UIE5VTEwpCisgKgorICogSWYgQHRhc2sgIT0gY3VycmVudCBuZWVkcyB0byBiZSBjYWxsZWQgaW4gUkNVIHNhZmUgY3JpdGljYWwgc2VjdGlvbgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgX19hYV90YXNrX2lzX2NvbmZpbmVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dCA9IF9fdGFza19jcmVkKHRhc2spLT5zZWN1cml0eTsKKworCUJVR19PTighY3h0IHx8ICFjeHQtPnByb2ZpbGUpOworCWlmICh1bmNvbmZpbmVkKGFhX25ld2VzdF92ZXJzaW9uKGN4dC0+cHJvZmlsZSkpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIGFhX2NyZWRfcHJvZmlsZSAtIG9idGFpbiBjcmVkJ3MgcHJvZmlsZXMKKyAqIEBjcmVkOiBjcmVkIHRvIG9idGFpbiBwcm9maWxlcyBmcm9tICAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogY29uZmluaW5nIHByb2ZpbGUKKyAqCisgKiBkb2VzIE5PVCBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50CisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFhX3Byb2ZpbGUgKmFhX2NyZWRfcHJvZmlsZShjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwlzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dCA9IGNyZWQtPnNlY3VyaXR5OworCUJVR19PTighY3h0IHx8ICFjeHQtPnByb2ZpbGUpOworCXJldHVybiBhYV9uZXdlc3RfdmVyc2lvbihjeHQtPnByb2ZpbGUpOworfQorCisvKioKKyAqIF9fYWFfY3VycmVudF9wcm9maWxlIC0gZmluZCB0aGUgY3VycmVudCB0YXNrcyBjb25maW5pbmcgcHJvZmlsZQorICoKKyAqIFJldHVybnM6IHVwIHRvIGRhdGUgY29uZmluaW5nIHByb2ZpbGUgb3IgdGhlIG5zIHVuY29uZmluZWQgcHJvZmlsZSAoTk9UIE5VTEwpCisgKgorICogVGhpcyBmbiB3aWxsIG5vdCB1cGRhdGUgdGhlIHRhc2tzIGNyZWQgdG8gdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uCisgKiBvZiB0aGUgcHJvZmlsZSBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgd2hlbiBpbnNpZGUgb2YgbG9ja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFhX3Byb2ZpbGUgKl9fYWFfY3VycmVudF9wcm9maWxlKHZvaWQpCit7CisJcmV0dXJuIGFhX2NyZWRfcHJvZmlsZShjdXJyZW50X2NyZWQoKSk7Cit9CisKKy8qKgorICogYWFfY3VycmVudF9wcm9maWxlIC0gZmluZCB0aGUgY3VycmVudCB0YXNrcyBjb25maW5pbmcgcHJvZmlsZSBhbmQgZG8gdXBkYXRlcworICoKKyAqIFJldHVybnM6IHVwIHRvIGRhdGUgY29uZmluaW5nIHByb2ZpbGUgb3IgdGhlIG5zIHVuY29uZmluZWQgcHJvZmlsZSAoTk9UIE5VTEwpCisgKgorICogVGhpcyBmbiB3aWxsIHVwZGF0ZSB0aGUgdGFza3MgY3JlZCBzdHJ1Y3R1cmUgaWYgdGhlIHByb2ZpbGUgaGFzIGJlZW4KKyAqIHJlcGxhY2VkLiAgTm90IHNhZmUgdG8gY2FsbCBpbnNpZGUgbG9ja3MKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWFfcHJvZmlsZSAqYWFfY3VycmVudF9wcm9maWxlKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQgPSBjdXJyZW50X2NyZWQoKS0+c2VjdXJpdHk7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJQlVHX09OKCFjeHQgfHwgIWN4dC0+cHJvZmlsZSk7CisKKwlwcm9maWxlID0gYWFfbmV3ZXN0X3ZlcnNpb24oY3h0LT5wcm9maWxlKTsKKwkvKgorCSAqIFdoZXRoZXIgb3Igbm90IHJlcGxhY2VtZW50IHN1Y2NlZWRzLCB1c2UgbmV3ZXN0IHByb2ZpbGUgc28KKwkgKiB0aGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSBpdCBhZnRlciByZXBsYWNlbWVudC4KKwkgKi8KKwlpZiAodW5saWtlbHkoKGN4dC0+cHJvZmlsZSAhPSBwcm9maWxlKSkpCisJCWFhX3JlcGxhY2VfY3VycmVudF9wcm9maWxlKHByb2ZpbGUpOworCisJcmV0dXJuIHByb2ZpbGU7Cit9CisKKyNlbmRpZiAvKiBfX0FBX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9kb21haW4uaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwNDQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvZG9tYWluLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIEFwcEFybW9yIHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBBcHBBcm1vciBzZWN1cml0eSBkb21haW4gdHJhbnNpdGlvbiBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZm5kZWYgX19BQV9ET01BSU5fSAorI2RlZmluZSBfX0FBX0RPTUFJTl9ICisKK3N0cnVjdCBhYV9kb21haW4geworCWludCBzaXplOworCWNoYXIgKip0YWJsZTsKK307CisKK2ludCBhcHBhcm1vcl9icHJtX3NldF9jcmVkcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKTsKK2ludCBhcHBhcm1vcl9icHJtX3NlY3VyZWV4ZWMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7Cit2b2lkIGFwcGFybW9yX2Jwcm1fY29tbWl0dGluZ19jcmVkcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKTsKK3ZvaWQgYXBwYXJtb3JfYnBybV9jb21taXR0ZWRfY3JlZHMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7CisKK3ZvaWQgYWFfZnJlZV9kb21haW5fZW50cmllcyhzdHJ1Y3QgYWFfZG9tYWluICpkb21haW4pOworaW50IGFhX2NoYW5nZV9oYXQoY29uc3QgY2hhciAqaGF0c1tdLCBpbnQgY291bnQsIHU2NCB0b2tlbiwgYm9vbCBwZXJtdGVzdCk7CitpbnQgYWFfY2hhbmdlX3Byb2ZpbGUoY29uc3QgY2hhciAqbnNfbmFtZSwgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBvbmV4ZWMsCisJCSAgICAgIGJvb2wgcGVybXRlc3QpOworCisjZW5kaWYgLyogX19BQV9ET01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9maWxlLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTM2ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9maWxlLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgZmlsZSBtZWRpYXRpb24gZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FBX0ZJTEVfSAorI2RlZmluZSBfX0FBX0ZJTEVfSAorCisjaW5jbHVkZSA8bGludXgvcGF0aC5oPgorCisjaW5jbHVkZSAiZG9tYWluLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKworc3RydWN0IGFhX3Byb2ZpbGU7CisKKy8qCisgKiBXZSB1c2UgTUFZX0VYRUMsIE1BWV9XUklURSwgTUFZX1JFQUQsIE1BWV9BUFBFTkQgYW5kIHRoZSBmb2xsb3dpbmcgZmxhZ3MKKyAqIGZvciBwcm9maWxlIHBlcm1pc3Npb25zCisgKi8KKyNkZWZpbmUgQUFfTUFZX0NSRUFURSAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBQV9NQVlfREVMRVRFICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEFBX01BWV9NRVRBX1dSSVRFICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgQUFfTUFZX01FVEFfUkVBRCAgICAgICAgICAgICAgIDB4MDA4MAorCisjZGVmaW5lIEFBX01BWV9DSE1PRCAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgQUFfTUFZX0NIT1dOICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBBQV9NQVlfTE9DSyAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEFBX0VYRUNfTU1BUCAgICAgICAgICAgICAgICAgICAweDA4MDAKKworI2RlZmluZSBBQV9NQVlfTElOSwkJCTB4MTAwMAorI2RlZmluZSBBQV9MSU5LX1NVQlNFVAkJCUFBX01BWV9MT0NLCS8qIG92ZXJsYWlkICovCisjZGVmaW5lIEFBX01BWV9PTkVYRUMJCQkweDQwMDAwMDAwCS8qIGV4ZWMgYWxsb3dzIG9uZXhlYyAqLworI2RlZmluZSBBQV9NQVlfQ0hBTkdFX1BST0ZJTEUJCTB4ODAwMDAwMDAKKyNkZWZpbmUgQUFfTUFZX0NIQU5HRUhBVAkJMHg4MDAwMDAwMAkvKiBjdHJsIGF1ZGl0aW5nIG9ubHkgKi8KKworI2RlZmluZSBBQV9BVURJVF9GSUxFX01BU0sJKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMgfCBNQVlfQVBQRU5EIHxcCisJCQkJIEFBX01BWV9DUkVBVEUgfCBBQV9NQVlfREVMRVRFIHwJXAorCQkJCSBBQV9NQVlfTUVUQV9SRUFEIHwgQUFfTUFZX01FVEFfV1JJVEUgfCBcCisJCQkJIEFBX01BWV9DSE1PRCB8IEFBX01BWV9DSE9XTiB8IEFBX01BWV9MT0NLIHwgXAorCQkJCSBBQV9FWEVDX01NQVAgfCBBQV9NQVlfTElOSykKKworLyoKKyAqIFRoZSB4aW5kZXggaXMgYnJva2VuIGludG8gMyBwYXJ0cworICogLSBpbmRleCAtIGFuIGluZGV4IGludG8gZWl0aGVyIHRoZSBleGVjIG5hbWUgdGFibGUgb3IgdGhlIHZhcmlhYmxlIHRhYmxlCisgKiAtIGV4ZWMgdHlwZSAtIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBleGVjdXRhYmxlIG5hbWUgYW5kIGluZGV4IGFyZSB1c2VkCisgKiAtIGZsYWdzIC0gd2hpY2ggbW9kaWZ5IGhvdyB0aGUgZGVzdGluYXRpb24gbmFtZSBpcyBhcHBsaWVkCisgKi8KKyNkZWZpbmUgQUFfWF9JTkRFWF9NQVNLCQkweDAzZmYKKworI2RlZmluZSBBQV9YX1RZUEVfTUFTSwkJMHgwYzAwCisjZGVmaW5lIEFBX1hfVFlQRV9TSElGVAkJMTAKKyNkZWZpbmUgQUFfWF9OT05FCQkweDAwMDAKKyNkZWZpbmUgQUFfWF9OQU1FCQkweDA0MDAJLyogdXNlIGV4ZWN1dGFibGUgbmFtZSBweCAqLworI2RlZmluZSBBQV9YX1RBQkxFCQkweDA4MDAJLyogdXNlIGEgc3BlY2lmaWVkIG5hbWUgLT5uIyAqLworCisjZGVmaW5lIEFBX1hfVU5TQUZFCQkweDEwMDAKKyNkZWZpbmUgQUFfWF9DSElMRAkJMHgyMDAwCS8qIG1ha2UgPkFBX1hfTk9ORSBhcHBseSB0byBjaGlsZHJlbiAqLworI2RlZmluZSBBQV9YX0lOSEVSSVQJCTB4NDAwMAorI2RlZmluZSBBQV9YX1VOQ09ORklORUQJCTB4ODAwMAorCisvKiBBQV9TRUNVUkVfWF9ORUVERUQgLSBpcyBwYXNzZWQgaW4gdGhlIGJwcm0tPnVuc2FmZSBmaWVsZCAqLworI2RlZmluZSBBQV9TRUNVUkVfWF9ORUVERUQJMHg4MDAwCisKKy8qIG5lZWQgdG8gbWFrZSBjb25kaXRpb25hbCB3aGljaCBvbmVzIGFyZSBiZWluZyBzZXQgKi8KK3N0cnVjdCBwYXRoX2NvbmQgeworCXVpZF90IHVpZDsKKwl1bW9kZV90IG1vZGU7Cit9OworCisvKiBzdHJ1Y3QgZmlsZV9wZXJtcyAtIGZpbGUgcGVybWlzc2lvbgorICogQGFsbG93OiBtYXNrIG9mIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFsbG93ZWQKKyAqIEBhdWRpdDogbWFzayBvZiBwZXJtaXNzaW9ucyB0byBmb3JjZSBhbiBhdWRpdCBtZXNzYWdlIGZvcgorICogQHF1aWV0OiBtYXNrIG9mIHBlcm1pc3Npb25zIHRvIHF1aWV0IGF1ZGl0IG1lc3NhZ2VzIGZvcgorICogQGtpbGw6IG1hc2sgb2YgcGVybWlzc2lvbnMgdGhhdCB3aGVuIG1hdGNoZWQgd2lsbCBraWxsIHRoZSB0YXNrCisgKiBAeGluZGV4OiBleGVjIHRyYW5zaXRpb24gaW5kZXggaWYgQGFsbG93IGNvbnRhaW5zIE1BWV9FWEVDCisgKgorICogVGhlIEBhdWRpdCBhbmQgQHF1ZWl0IG1hc2sgc2hvdWxkIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKyAqLworc3RydWN0IGZpbGVfcGVybXMgeworCXUzMiBhbGxvdzsKKwl1MzIgYXVkaXQ7CisJdTMyIHF1aWV0OworCXUzMiBraWxsOworCXUxNiB4aW5kZXg7Cit9OworCitleHRlcm4gc3RydWN0IGZpbGVfcGVybXMgbnVsbHBlcm1zOworCisjZGVmaW5lIENPTUJJTkVEX1BFUk1fTUFTSyhYKSAoKFgpLmFsbG93IHwgKFgpLmF1ZGl0IHwgKFgpLnF1aWV0IHwgKFgpLmtpbGwpCisKKy8qIEZJWE1FOiBzcGxpdCBwZXJtcyBmcm9tIGRmYSBhbmQgbWF0Y2ggdGhpcyB0byBkZXNjcmlwdGlvbgorICogICAgICAgIGFsc28gYWRkIGRlbGVnYXRpb24gaW5mby4KKyAqLworc3RhdGljIGlubGluZSB1MTYgZGZhX21hcF94aW5kZXgodTE2IG1hc2spCit7CisJdTE2IG9sZF9pbmRleCA9IChtYXNrID4+IDEwKSAmIDB4ZjsKKwl1MTYgaW5kZXggPSAwOworCisJaWYgKG1hc2sgJiAweDEwMCkKKwkJaW5kZXggfD0gQUFfWF9VTlNBRkU7CisJaWYgKG1hc2sgJiAweDIwMCkKKwkJaW5kZXggfD0gQUFfWF9JTkhFUklUOworCWlmIChtYXNrICYgMHg4MCkKKwkJaW5kZXggfD0gQUFfWF9VTkNPTkZJTkVEOworCisJaWYgKG9sZF9pbmRleCA9PSAxKSB7CisJCWluZGV4IHw9IEFBX1hfVU5DT05GSU5FRDsKKwl9IGVsc2UgaWYgKG9sZF9pbmRleCA9PSAyKSB7CisJCWluZGV4IHw9IEFBX1hfTkFNRTsKKwl9IGVsc2UgaWYgKG9sZF9pbmRleCA9PSAzKSB7CisJCWluZGV4IHw9IEFBX1hfTkFNRSB8IEFBX1hfQ0hJTEQ7CisJfSBlbHNlIHsKKwkJaW5kZXggfD0gQUFfWF9UQUJMRTsKKwkJaW5kZXggfD0gb2xkX2luZGV4IC0gNDsKKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qCisgKiBtYXAgb2xkIGRmYSBpbmxpbmUgcGVybWlzc2lvbnMgdG8gbmV3IGZvcm1hdAorICovCisjZGVmaW5lIGRmYV91c2VyX2FsbG93KGRmYSwgc3RhdGUpICgoKEFDQ0VQVF9UQUJMRShkZmEpW3N0YXRlXSkgJiAweDdmKSB8IFwKKwkJCQkgICAgKChBQ0NFUFRfVEFCTEUoZGZhKVtzdGF0ZV0pICYgMHg4MDAwMDAwMCkpCisjZGVmaW5lIGRmYV91c2VyX2F1ZGl0KGRmYSwgc3RhdGUpICgoQUNDRVBUX1RBQkxFMihkZmEpW3N0YXRlXSkgJiAweDdmKQorI2RlZmluZSBkZmFfdXNlcl9xdWlldChkZmEsIHN0YXRlKSAoKChBQ0NFUFRfVEFCTEUyKGRmYSlbc3RhdGVdKSA+PiA3KSAmIDB4N2YpCisjZGVmaW5lIGRmYV91c2VyX3hpbmRleChkZmEsIHN0YXRlKSBcCisJKGRmYV9tYXBfeGluZGV4KEFDQ0VQVF9UQUJMRShkZmEpW3N0YXRlXSAmIDB4M2ZmZikpCisKKyNkZWZpbmUgZGZhX290aGVyX2FsbG93KGRmYSwgc3RhdGUpICgoKChBQ0NFUFRfVEFCTEUoZGZhKVtzdGF0ZV0pID4+IDE0KSAmIFwKKwkJCQkgICAgICAweDdmKSB8CQkJCVwKKwkJCQkgICAgICgoQUNDRVBUX1RBQkxFKGRmYSlbc3RhdGVdKSAmIDB4ODAwMDAwMDApKQorI2RlZmluZSBkZmFfb3RoZXJfYXVkaXQoZGZhLCBzdGF0ZSkgKCgoQUNDRVBUX1RBQkxFMihkZmEpW3N0YXRlXSkgPj4gMTQpICYgMHg3ZikKKyNkZWZpbmUgZGZhX290aGVyX3F1aWV0KGRmYSwgc3RhdGUpIFwKKwkoKCgoQUNDRVBUX1RBQkxFMihkZmEpW3N0YXRlXSkgPj4gNykgPj4gMTQpICYgMHg3ZikKKyNkZWZpbmUgZGZhX290aGVyX3hpbmRleChkZmEsIHN0YXRlKSBcCisJZGZhX21hcF94aW5kZXgoKEFDQ0VQVF9UQUJMRShkZmEpW3N0YXRlXSA+PiAxNCkgJiAweDNmZmYpCisKK2ludCBhYV9hdWRpdF9maWxlKHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlLCBzdHJ1Y3QgZmlsZV9wZXJtcyAqcGVybXMsCisJCSAgZ2ZwX3QgZ2ZwLCBpbnQgb3AsIHUzMiByZXF1ZXN0LCBjb25zdCBjaGFyICpuYW1lLAorCQkgIGNvbnN0IGNoYXIgKnRhcmdldCwgdWlkX3Qgb3VpZCwgY29uc3QgY2hhciAqaW5mbywgaW50IGVycm9yKTsKKworLyoqCisgKiBzdHJ1Y3QgYWFfZmlsZV9ydWxlcyAtIGNvbXBvbmVudHMgdXNlZCBmb3IgZmlsZSBydWxlIHBlcm1pc3Npb25zCisgKiBAZGZhOiBkZmEgdG8gbWF0Y2ggcGF0aCBuYW1lcyBhbmQgY29uZGl0aW9uYWxzIGFnYWluc3QKKyAqIEBwZXJtczogcGVybWlzc2lvbiB0YWJsZSBpbmRleGVkIGJ5IHRoZSBtYXRjaGVkIHN0YXRlIGFjY2VwdCBlbnRyeSBvZiBAZGZhCisgKiBAdHJhbnM6IHRyYW5zaXRpb24gdGFibGUgZm9yIGluZGV4ZWQgYnkgbmFtZWQgeCB0cmFuc2l0aW9ucworICoKKyAqIEZpbGUgcGVybWlzc2lvbiBhcmUgZGV0ZXJtaW5lZCBieSBtYXRjaGluZyBhIHBhdGggYWdhaW5zdCBAZGZhIGFuZCB0aGVuCisgKiB0aGVuIHVzaW5nIHRoZSB2YWx1ZSBvZiB0aGUgYWNjZXB0IGVudHJ5IGZvciB0aGUgbWF0Y2hpbmcgc3RhdGUgYXMKKyAqIGFuIGluZGV4IGludG8gQHBlcm1zLiAgSWYgYSBuYW1lZCBleGVjIHRyYW5zaXRpb24gaXMgcmVxdWlyZWQgaXQgaXMKKyAqIGxvb2tlZCB1cCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZS4KKyAqLworc3RydWN0IGFhX2ZpbGVfcnVsZXMgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwlzdHJ1Y3QgYWFfZGZhICpkZmE7CisJLyogc3RydWN0IHBlcm1zIHBlcm1zOyAqLworCXN0cnVjdCBhYV9kb21haW4gdHJhbnM7CisJLyogVE9ETzogYWRkIGRlbGVnYXRlIHRhYmxlICovCit9OworCit1bnNpZ25lZCBpbnQgYWFfc3RyX3Blcm1zKHN0cnVjdCBhYV9kZmEgKmRmYSwgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcGF0aF9jb25kICpjb25kLAorCQkJICBzdHJ1Y3QgZmlsZV9wZXJtcyAqcGVybXMpOworCitpbnQgYWFfcGF0aF9wZXJtKGludCBvcCwgc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHN0cnVjdCBwYXRoICpwYXRoLAorCQkgaW50IGZsYWdzLCB1MzIgcmVxdWVzdCwgc3RydWN0IHBhdGhfY29uZCAqY29uZCk7CisKK2ludCBhYV9wYXRoX2xpbmsoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSBzdHJ1Y3QgcGF0aCAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CisKK2ludCBhYV9maWxlX3Blcm0oaW50IG9wLCBzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSB1MzIgcmVxdWVzdCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhYV9mcmVlX2ZpbGVfcnVsZXMoc3RydWN0IGFhX2ZpbGVfcnVsZXMgKnJ1bGVzKQoreworCWFhX3B1dF9kZmEocnVsZXMtPmRmYSk7CisJYWFfZnJlZV9kb21haW5fZW50cmllcygmcnVsZXMtPnRyYW5zKTsKK30KKworI2RlZmluZSBBQ0NfRk1PREUoeCkgKCgiXDAwMFwwMDRcMDAyXDAwNiJbKHgpJk9fQUNDTU9ERV0pIHwgKCgoeCkgPDwgMSkgJiAweDQwKSkKKworLyogZnJvbSBuYW1laS5jICovCisjZGVmaW5lIE1BUF9PUEVOX0ZMQUdTKHgpICgoKCh4KSArIDEpICYgT19BQ0NNT0RFKSA/ICh4KSArIDEgOiAoeCkpCisKKy8qKgorICogYWFfbWFwX2ZpbGVfcGVybXMgLSBtYXAgZmlsZSBmbGFncyB0byBBcHBBcm1vciBwZXJtaXNzaW9ucworICogQGZpbGU6IG9wZW4gZmlsZSB0byBtYXAgZmxhZ3MgdG8gQXBwQXJtb3IgcGVybWlzc2lvbnMKKyAqCisgKiBSZXR1cm5zOiBhcHBhcm1vciBwZXJtaXNzaW9uIHNldCBmb3IgdGhlIGZpbGUKKyAqLworc3RhdGljIGlubGluZSB1MzIgYWFfbWFwX2ZpbGVfdG9fcGVybXMoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGZsYWdzID0gTUFQX09QRU5fRkxBR1MoZmlsZS0+Zl9mbGFncyk7CisJdTMyIHBlcm1zID0gQUNDX0ZNT0RFKGZpbGUtPmZfbW9kZSk7CisKKwlpZiAoKGZsYWdzICYgT19BUFBFTkQpICYmIChwZXJtcyAmIE1BWV9XUklURSkpCisJCXBlcm1zID0gKHBlcm1zICYgfk1BWV9XUklURSkgfCBNQVlfQVBQRU5EOworCS8qIHRydW5jIGltcGxpZXMgd3JpdGUgcGVybWlzc2lvbiAqLworCWlmIChmbGFncyAmIE9fVFJVTkMpCisJCXBlcm1zIHw9IE1BWV9XUklURTsKKwlpZiAoZmxhZ3MgJiBPX0NSRUFUKQorCQlwZXJtcyB8PSBBQV9NQVlfQ1JFQVRFOworCisJcmV0dXJuIHBlcm1zOworfQorCisjZW5kaWYgLyogX19BQV9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvaXBjLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2lwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGEwZmJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9pcGMuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGlwYyBtZWRpYXRpb24gZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FBX0lQQ19ICisjZGVmaW5lIF9fQUFfSVBDX0gKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3N0cnVjdCBhYV9wcm9maWxlOworCitpbnQgYWFfbWF5X3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRyYWNlcl90YXNrLCBzdHJ1Y3QgYWFfcHJvZmlsZSAqdHJhY2VyLAorCQkgIHN0cnVjdCBhYV9wcm9maWxlICp0cmFjZWUsIHVuc2lnbmVkIGludCBtb2RlKTsKKworaW50IGFhX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRyYWNlciwgc3RydWN0IHRhc2tfc3RydWN0ICp0cmFjZWUsCisJICAgICAgdW5zaWduZWQgaW50IG1vZGUpOworCisjZW5kaWYgLyogX19BQV9JUENfSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9tYXRjaC5oIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9tYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNGE2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL21hdGNoLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgcG9saWN5IGRmYSBtYXRjaGluZyBlbmdpbmUgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FBX01BVENIX0gKKyNkZWZpbmUgX19BQV9NQVRDSF9ICisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBERkFfTk9NQVRDSAkJCTAKKyNkZWZpbmUgREZBX1NUQVJUCQkJMQorCisjZGVmaW5lIERGQV9WQUxJRF9QRVJNX01BU0sJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgREZBX1ZBTElEX1BFUk0yX01BU0sJCTB4ZmZmZmZmZmYKKworLyoqCisgKiBUaGUgZm9ybWF0IHVzZWQgZm9yIHRyYW5zaXRpb24gdGFibGVzIGlzIGJhc2VkIG9uIHRoZSBHTlUgZmxleCB0YWJsZQorICogZmlsZSBmb3JtYXQgKC0tdGFibGVzLWZpbGUgb3B0aW9uOyBzZWUgVGFibGUgRmlsZSBGb3JtYXQgaW4gdGhlIGZsZXgKKyAqIGluZm8gcGFnZXMgYW5kIHRoZSBmbGV4IHNvdXJjZXMgZm9yIGRvY3VtZW50YXRpb24pLiBUaGUgbWFnaWMgbnVtYmVyCisgKiB1c2VkIGluIHRoZSBoZWFkZXIgaXMgMHgxQjVFNzgzRCBpbnN0ZWQgb2YgMHhGMTNDNTdCMSB0aG91Z2gsIGJlY2F1c2UKKyAqIHRoZSBZWV9JRF9DSEsgKGNoZWNrKSBhbmQgWVlfSURfREVGIChkZWZhdWx0KSB0YWJsZXMgYXJlIHVzZWQKKyAqIHNsaWdodGx5IGRpZmZlcmVudGx5IChzZWUgdGhlIGFwcGFybW9yLXBhcnNlciBwYWNrYWdlKS4KKyAqLworCisjZGVmaW5lIFlZVEhfTUFHSUMJMHgxQjVFNzgzRAorI2RlZmluZSBZWVRIX0RFRl9SRUNVUlNFIDB4MQkJCS8qIERFRiBUYWJsZSBpcyByZWN1cnNpdmUgKi8KKworc3RydWN0IHRhYmxlX3NldF9oZWFkZXIgeworCXUzMiB0aF9tYWdpYzsJCS8qIFlZVEhfTUFHSUMgKi8KKwl1MzIgdGhfaHNpemU7CisJdTMyIHRoX3NzaXplOworCXUxNiB0aF9mbGFnczsKKwljaGFyIHRoX3ZlcnNpb25bXTsKK307CisKKy8qIFRoZSBZWVREX0lEIGFyZSBvbmUgbGVzcyB0aGFuIGZsZXggdGFibGUgbWFwcGluZ3MuICBUaGUgZmxleCBpZAorICogaGFzIDEgc3VidHJhY3RlZCBhdCB0YWJsZSBsb2FkIHRpbWUsIHRoaXMgYWxsb3dzIHVzIHRvIGRpcmVjdGx5IHVzZSB0aGUKKyAqIElEJ3MgYXMgaW5kZXhlcy4KKyAqLworI2RlZmluZQlZWVREX0lEX0FDQ0VQVAkwCisjZGVmaW5lIFlZVERfSURfQkFTRQkxCisjZGVmaW5lIFlZVERfSURfQ0hLCTIKKyNkZWZpbmUgWVlURF9JRF9ERUYJMworI2RlZmluZSBZWVREX0lEX0VDCTQKKyNkZWZpbmUgWVlURF9JRF9NRVRBCTUKKyNkZWZpbmUgWVlURF9JRF9BQ0NFUFQyIDYKKyNkZWZpbmUgWVlURF9JRF9OWFQJNworI2RlZmluZSBZWVREX0lEX1RTSVpFCTgKKworI2RlZmluZSBZWVREX0RBVEE4CTEKKyNkZWZpbmUgWVlURF9EQVRBMTYJMgorI2RlZmluZSBZWVREX0RBVEEzMgk0CisjZGVmaW5lIFlZVERfREFUQTY0CTgKKworLyogRWFjaCBBQ0NFUFQyIHRhYmxlIGdldHMgNiBkZWRpY2F0ZWQgZmxhZ3MsIFlZVERfREFUQVggZGVmaW5lIHRoZQorICogZmlyc3QgZmxhZ3MKKyAqLworI2RlZmluZSBBQ0NFUFQxX0ZMQUdTKFgpICgoWCkgJiAweDNmKQorI2RlZmluZSBBQ0NFUFQyX0ZMQUdTKFgpIEFDQ0VQVDFfRkxBR1MoKFgpID4+IFlZVERfSURfQUNDRVBUMikKKyNkZWZpbmUgVE9fQUNDRVBUMV9GTEFHKFgpIEFDQ0VQVDFfRkxBR1MoWCkKKyNkZWZpbmUgVE9fQUNDRVBUMl9GTEFHKFgpIChBQ0NFUFQxX0ZMQUdTKFgpIDw8IFlZVERfSURfQUNDRVBUMikKKyNkZWZpbmUgREZBX0ZMQUdfVkVSSUZZX1NUQVRFUyAweDEwMDAKKworc3RydWN0IHRhYmxlX2hlYWRlciB7CisJdTE2IHRkX2lkOworCXUxNiB0ZF9mbGFnczsKKwl1MzIgdGRfaGlsZW47CisJdTMyIHRkX2xvbGVuOworCWNoYXIgdGRfZGF0YVtdOworfTsKKworI2RlZmluZSBERUZBVUxUX1RBQkxFKERGQSkgKCh1MTYgKikoKERGQSktPnRhYmxlc1tZWVREX0lEX0RFRl0tPnRkX2RhdGEpKQorI2RlZmluZSBCQVNFX1RBQkxFKERGQSkgKCh1MzIgKikoKERGQSktPnRhYmxlc1tZWVREX0lEX0JBU0VdLT50ZF9kYXRhKSkKKyNkZWZpbmUgTkVYVF9UQUJMRShERkEpICgodTE2ICopKChERkEpLT50YWJsZXNbWVlURF9JRF9OWFRdLT50ZF9kYXRhKSkKKyNkZWZpbmUgQ0hFQ0tfVEFCTEUoREZBKSAoKHUxNiAqKSgoREZBKS0+dGFibGVzW1lZVERfSURfQ0hLXS0+dGRfZGF0YSkpCisjZGVmaW5lIEVRVUlWX1RBQkxFKERGQSkgKCh1OCAqKSgoREZBKS0+dGFibGVzW1lZVERfSURfRUNdLT50ZF9kYXRhKSkKKyNkZWZpbmUgQUNDRVBUX1RBQkxFKERGQSkgKCh1MzIgKikoKERGQSktPnRhYmxlc1tZWVREX0lEX0FDQ0VQVF0tPnRkX2RhdGEpKQorI2RlZmluZSBBQ0NFUFRfVEFCTEUyKERGQSkgKCh1MzIgKikoKERGQSktPnRhYmxlc1tZWVREX0lEX0FDQ0VQVDJdLT50ZF9kYXRhKSkKKworc3RydWN0IGFhX2RmYSB7CisJc3RydWN0IGtyZWYgY291bnQ7CisJdTE2IGZsYWdzOworCXN0cnVjdCB0YWJsZV9oZWFkZXIgKnRhYmxlc1tZWVREX0lEX1RTSVpFXTsKK307CisKKyNkZWZpbmUgYnl0ZV90b19ieXRlKFgpIChYKQorCisjZGVmaW5lIFVOUEFDS19BUlJBWShUQUJMRSwgQkxPQiwgTEVOLCBUWVBFLCBOVE9IWCkgXAorCWRvIHsgXAorCQl0eXBlb2YoTEVOKSBfX2k7IFwKKwkJVFlQRSAqX190ID0gKFRZUEUgKikgVEFCTEU7IFwKKwkJVFlQRSAqX19iID0gKFRZUEUgKikgQkxPQjsgXAorCQlmb3IgKF9faSA9IDA7IF9faSA8IExFTjsgX19pKyspIHsgXAorCQkJX190W19faV0gPSBOVE9IWChfX2JbX19pXSk7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBzaXplX3QgdGFibGVfc2l6ZShzaXplX3QgbGVuLCBzaXplX3QgZWxfc2l6ZSkKK3sKKwlyZXR1cm4gQUxJR04oc2l6ZW9mKHN0cnVjdCB0YWJsZV9oZWFkZXIpICsgbGVuICogZWxfc2l6ZSwgOCk7Cit9CisKK3N0cnVjdCBhYV9kZmEgKmFhX2RmYV91bnBhY2sodm9pZCAqYmxvYiwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Cit1bnNpZ25lZCBpbnQgYWFfZGZhX21hdGNoX2xlbihzdHJ1Y3QgYWFfZGZhICpkZmEsIHVuc2lnbmVkIGludCBzdGFydCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7Cit1bnNpZ25lZCBpbnQgYWFfZGZhX21hdGNoKHN0cnVjdCBhYV9kZmEgKmRmYSwgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJICBjb25zdCBjaGFyICpzdHIpOwordm9pZCBhYV9kZmFfZnJlZV9rcmVmKHN0cnVjdCBrcmVmICprcmVmKTsKKworLyoqCisgKiBhYV9wdXRfZGZhIC0gcHV0IGEgZGZhIHJlZmNvdW50CisgKiBAZGZhOiBkZmEgdG8gcHV0IHJlZmNvdW50ICAgKE1BWUJFIE5VTEwpCisgKgorICogUmVxdWlyZXM6IGlmIEBkZmEgIT0gTlVMTCB0aGF0IGEgdmFsaWQgcmVmY291bnQgYmUgaGVsZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWFfcHV0X2RmYShzdHJ1Y3QgYWFfZGZhICpkZmEpCit7CisJaWYgKGRmYSkKKwkJa3JlZl9wdXQoJmRmYS0+Y291bnQsIGFhX2RmYV9mcmVlX2tyZWYpOworfQorCisjZW5kaWYgLyogX19BQV9NQVRDSF9IICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3BhdGguaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvcGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YjMyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3BhdGguaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGJhc2ljIHBhdGggbWFuaXB1bGF0aW9uIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BQV9QQVRIX0gKKyNkZWZpbmUgX19BQV9QQVRIX0gKKworCitlbnVtIHBhdGhfZmxhZ3MgeworCVBBVEhfSVNfRElSID0gMHgxLAkJLyogcGF0aCBpcyBhIGRpcmVjdG9yeSAqLworCVBBVEhfQ09OTkVDVF9QQVRIID0gMHg0LAkvKiBjb25uZWN0IGRpc2Nvbm5lY3RlZCBwYXRocyB0byAvICovCisJUEFUSF9DSFJPT1RfUkVMID0gMHg4LAkJLyogZG8gcGF0aCBsb29rdXAgcmVsYXRpdmUgdG8gY2hyb290ICovCisJUEFUSF9DSFJPT1RfTlNDT05ORUNUID0gMHgxMCwJLyogY29ubmVjdCBwYXRocyB0aGF0IGFyZSBhdCBucyByb290ICovCisKKwlQQVRIX0RFTEVHQVRFX0RFTEVURUQgPSAweDA4MDAwLCAvKiBkZWxlZ2F0ZSBkZWxldGVkIGZpbGVzICovCisJUEFUSF9NRURJQVRFX0RFTEVURUQgPSAweDEwMDAwLAkvKiBtZWRpYXRlIGRlbGV0ZWQgcGF0aHMgKi8KK307CisKK2ludCBhYV9nZXRfbmFtZShzdHJ1Y3QgcGF0aCAqcGF0aCwgaW50IGZsYWdzLCBjaGFyICoqYnVmZmVyLCBjb25zdCBjaGFyICoqbmFtZSk7CisKKyNlbmRpZiAvKiBfX0FBX1BBVEhfSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9wb2xpY3kuaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkYTVjZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvcG9saWN5LmgKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgcG9saWN5IGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BQV9QT0xJQ1lfSAorI2RlZmluZSBfX0FBX1BPTElDWV9ICisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvY3JlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworI2luY2x1ZGUgImFwcGFybW9yLmgiCisjaW5jbHVkZSAiYXVkaXQuaCIKKyNpbmNsdWRlICJjYXBhYmlsaXR5LmgiCisjaW5jbHVkZSAiZG9tYWluLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisKK2V4dGVybiBjb25zdCBjaGFyICpwcm9maWxlX21vZGVfbmFtZXNbXTsKKyNkZWZpbmUgQVBQQVJNT1JfTkFNRVNfTUFYX0lOREVYIDMKKworI2RlZmluZSBDT01QTEFJTl9NT0RFKF9wcm9maWxlKQlcCisJKChhYV9nX3Byb2ZpbGVfbW9kZSA9PSBBUFBBUk1PUl9DT01QTEFJTikgfHwgXAorCSAoKF9wcm9maWxlKS0+bW9kZSA9PSBBUFBBUk1PUl9DT01QTEFJTikpCisKKyNkZWZpbmUgS0lMTF9NT0RFKF9wcm9maWxlKSBcCisJKChhYV9nX3Byb2ZpbGVfbW9kZSA9PSBBUFBBUk1PUl9LSUxMKSB8fCBcCisJICgoX3Byb2ZpbGUpLT5tb2RlID09IEFQUEFSTU9SX0tJTEwpKQorCisjZGVmaW5lIFBST0ZJTEVfSVNfSEFUKF9wcm9maWxlKSAoKF9wcm9maWxlKS0+ZmxhZ3MgJiBQRkxBR19IQVQpCisKKy8qCisgKiBGSVhNRTogY3VycmVudGx5IG5lZWQgYSBjbGVhbiB3YXkgdG8gcmVwbGFjZSBhbmQgcmVtb3ZlIHByb2ZpbGVzIGFzIGEKKyAqIHNldC4gIEl0IHNob3VsZCBiZSBkb25lIGF0IHRoZSBuYW1lc3BhY2UgbGV2ZWwuCisgKiBFaXRoZXIsIHdpdGggYSBzZXQgb2YgcHJvZmlsZXMgbG9hZGVkIGF0IHRoZSBuYW1lc3BhY2UgbGV2ZWwgb3IgdmlhCisgKiBhIG1hcmsgYW5kIHJlbW92ZSBtYXJrZWQgaW50ZXJmYWNlLgorICovCitlbnVtIHByb2ZpbGVfbW9kZSB7CisJQVBQQVJNT1JfRU5GT1JDRSwJLyogZW5mb3JjZSBhY2Nlc3MgcnVsZXMgKi8KKwlBUFBBUk1PUl9DT01QTEFJTiwJLyogYWxsb3cgYW5kIGxvZyBhY2Nlc3MgdmlvbGF0aW9ucyAqLworCUFQUEFSTU9SX0tJTEwsCQkvKiBraWxsIHRhc2sgb24gYWNjZXNzIHZpb2xhdGlvbiAqLworfTsKKworZW51bSBwcm9maWxlX2ZsYWdzIHsKKwlQRkxBR19IQVQgPSAxLAkJCS8qIHByb2ZpbGUgaXMgYSBoYXQgKi8KKwlQRkxBR19VTkNPTkZJTkVEID0gMiwJCS8qIHByb2ZpbGUgaXMgYW4gdW5jb25maW5lZCBwcm9maWxlICovCisJUEZMQUdfTlVMTCA9IDQsCQkJLyogcHJvZmlsZSBpcyBudWxsIGxlYXJuaW5nIHByb2ZpbGUgKi8KKwlQRkxBR19JWF9PTl9OQU1FX0VSUk9SID0gOCwJLyogZmFsbGJhY2sgdG8gaXggb24gbmFtZSBsb29rdXAgZmFpbCAqLworCVBGTEFHX0lNTVVUQUJMRSA9IDB4MTAsCQkvKiBkb24ndCBhbGxvdyBjaGFuZ2VzL3JlcGxhY2VtZW50ICovCisJUEZMQUdfVVNFUl9ERUZJTkVEID0gMHgyMCwJLyogdXNlciBiYXNlZCBwcm9maWxlIC0gbG93ZXIgcHJpdnMgKi8KKwlQRkxBR19OT19MSVNUX1JFRiA9IDB4NDAsCS8qIGxpc3QgZG9lc24ndCBrZWVwIHByb2ZpbGUgcmVmICovCisJUEZMQUdfT0xEX05VTExfVFJBTlMgPSAweDEwMCwJLyogdXNlIC8vIGFzIHRoZSBudWxsIHRyYW5zaXRpb24gKi8KKworCS8qIFRoZXNlIGZsYWdzIG11c3QgY29ycmVzcG9uZCB3aXRoIFBBVEhfZmxhZ3MgKi8KKwlQRkxBR19NRURJQVRFX0RFTEVURUQgPSAweDEwMDAwLCAvKiBtZWRpYXRlIGluc3RlYWQgZGVsZWdhdGUgZGVsZXRlZCAqLworfTsKKworc3RydWN0IGFhX3Byb2ZpbGU7CisKKy8qIHN0cnVjdCBhYV9wb2xpY3kgLSBjb21tb24gcGFydCBvZiBib3RoIG5hbWVzcGFjZXMgYW5kIHByb2ZpbGVzCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgb2JqZWN0CisgKiBAaG5hbWUgLSBUaGUgaGllcmFyY2hpY2FsIG5hbWUKKyAqIEBjb3VudDogcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvYmoKKyAqIEBsaXN0OiBsaXN0IHBvbGljeSBvYmplY3QgaXMgb24KKyAqIEBwcm9maWxlczogaGVhZCBvZiB0aGUgcHJvZmlsZXMgbGlzdCBjb250YWluZWQgaW4gdGhlIG9iamVjdAorICovCitzdHJ1Y3QgYWFfcG9saWN5IHsKKwljaGFyICpuYW1lOworCWNoYXIgKmhuYW1lOworCXN0cnVjdCBrcmVmIGNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByb2ZpbGVzOworfTsKKworLyogc3RydWN0IGFhX25zX2FjY3QgLSBhY2NvdW50aW5nIG9mIHByb2ZpbGVzIGluIG5hbWVzcGFjZQorICogQG1heF9zaXplOiBtYXhpbXVtIHNwYWNlIGFsbG93ZWQgZm9yIGFsbCBwcm9maWxlcyBpbiBuYW1lc3BhY2UKKyAqIEBtYXhfY291bnQ6IG1heGltdW0gbnVtYmVyIG9mIHByb2ZpbGVzIHRoYXQgY2FuIGJlIGluIHRoaXMgbmFtZXNwYWNlCisgKiBAc2l6ZTogY3VycmVudCBzaXplIG9mIHByb2ZpbGVzCisgKiBAY291bnQ6IGN1cnJlbnQgY291bnQgb2YgcHJvZmlsZXMgKGluY2x1ZGVzIG51bGwgcHJvZmlsZXMpCisgKi8KK3N0cnVjdCBhYV9uc19hY2N0IHsKKwlpbnQgbWF4X3NpemU7CisJaW50IG1heF9jb3VudDsKKwlpbnQgc2l6ZTsKKwlpbnQgY291bnQ7Cit9OworCisvKiBzdHJ1Y3QgYWFfbmFtZXNwYWNlIC0gbmFtZXNwYWNlIGZvciBhIHNldCBvZiBwcm9maWxlcworICogQGJhc2U6IGNvbW1vbiBwb2xpY3kKKyAqIEBwYXJlbnQ6IHBhcmVudCBvZiBuYW1lc3BhY2UKKyAqIEBsb2NrOiBsb2NrIGZvciBtb2RpZnlpbmcgdGhlIG9iamVjdAorICogQGFjY3Q6IGFjY291bnRpbmcgZm9yIHRoZSBuYW1lc3BhY2UKKyAqIEB1bmNvbmZpbmVkOiBzcGVjaWFsIHVuY29uZmluZWQgcHJvZmlsZSBmb3IgdGhlIG5hbWVzcGFjZQorICogQHN1Yl9uczogbGlzdCBvZiBuYW1lc3BhY2VzIHVuZGVyIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4KKyAqCisgKiBBbiBhYV9uYW1lc3BhY2UgZGVmaW5lcyB0aGUgc2V0IHByb2ZpbGVzIHRoYXQgYXJlIHNlYXJjaGVkIHRvIGRldGVybWluZQorICogd2hpY2ggcHJvZmlsZSB0byBhdHRhY2ggdG8gYSB0YXNrLiAgUHJvZmlsZXMgY2FuIG5vdCBiZSBzaGFyZWQgYmV0d2VlbgorICogYWFfbmFtZXNwYWNlcyBhbmQgcHJvZmlsZSBuYW1lcyB3aXRoaW4gYSBuYW1lc3BhY2UgYXJlIGd1YXJhbnRlZWQgdG8gYmUKKyAqIHVuaXF1ZS4gIFdoZW4gcHJvZmlsZXMgaW4gc2VwYXJhdGUgbmFtZXNwYWNlcyBoYXZlIHRoZSBzYW1lIG5hbWUgdGhleQorICogYXJlIE5PVCBjb25zaWRlcmVkIHRvIGJlIGVxdWl2YWxlbnQuCisgKgorICogTmFtZXNwYWNlcyBhcmUgaGllcmFyY2hpY2FsIGFuZCBvbmx5IG5hbWVzcGFjZXMgYW5kIHByb2ZpbGVzIGJlbG93IHRoZQorICogY3VycmVudCBuYW1lc3BhY2UgYXJlIHZpc2libGUuCisgKgorICogTmFtZXNwYWNlIG5hbWVzIG11c3QgYmUgdW5pcXVlIGFuZCBjYW4gbm90IGNvbnRhaW4gdGhlIGNoYXJhY3RlcnMgOi9cMAorICoKKyAqIEZJWE1FIFRPRE86IGFkZCB2c2VydmVyIHN1cHBvcnQgb2YgbmFtZXNwYWNlcyAoY2FuIGl0IGFsbCBiZSBkb25lIGluCisgKiAgICAgICAgICAgICB1c2Vyc3BhY2U/KQorICovCitzdHJ1Y3QgYWFfbmFtZXNwYWNlIHsKKwlzdHJ1Y3QgYWFfcG9saWN5IGJhc2U7CisJc3RydWN0IGFhX25hbWVzcGFjZSAqcGFyZW50OworCXJ3bG9ja190IGxvY2s7CisJc3RydWN0IGFhX25zX2FjY3QgYWNjdDsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqdW5jb25maW5lZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1Yl9uczsKK307CisKKy8qIHN0cnVjdCBhYV9wcm9maWxlIC0gYmFzaWMgY29uZmluZW1lbnQgZGF0YQorICogQGJhc2UgLSBiYXNlIGNvbXBvbmVudHMgb2YgdGhlIHByb2ZpbGUgKG5hbWUsIHJlZmNvdW50LCBsaXN0cywgbG9jayAuLi4pCisgKiBAcGFyZW50OiBwYXJlbnQgb2YgcHJvZmlsZQorICogQG5zOiBuYW1lc3BhY2UgdGhlIHByb2ZpbGUgaXMgaW4KKyAqIEByZXBsYWNlZGJ5OiBpcyBzZXQgdG8gdGhlIHByb2ZpbGUgdGhhdCByZXBsYWNlZCB0aGlzIHByb2ZpbGUKKyAqIEByZW5hbWU6IG9wdGlvbmFsIHByb2ZpbGUgbmFtZSB0aGF0IHRoaXMgcHJvZmlsZSByZW5hbWVkCisgKiBAeG1hdGNoOiBvcHRpb25hbCBleHRlbmRlZCBtYXRjaGluZyBmb3IgdW5jb25maW5lZCBleGVjdXRhYmxlcyBuYW1lcworICogQHhtYXRjaF9sZW46IHhtYXRjaCBwcmVmaXggbGVuLCB1c2VkIHRvIGRldGVybWluZSB4bWF0Y2ggcHJpb3JpdHkKKyAqIEBzaWQ6IHRoZSB1bmlxdWUgc2VjdXJpdHkgaWQgbnVtYmVyIG9mIHRoaXMgcHJvZmlsZQorICogQGF1ZGl0OiB0aGUgYXVkaXRpbmcgbW9kZSBvZiB0aGUgcHJvZmlsZQorICogQG1vZGU6IHRoZSBlbmZvcmNlbWVudCBtb2RlIG9mIHRoZSBwcm9maWxlCisgKiBAZmxhZ3M6IGZsYWdzIGNvbnRyb2xsaW5nIHByb2ZpbGUgYmVoYXZpb3IKKyAqIEBwYXRoX2ZsYWdzOiBmbGFncyBjb250cm9sbGluZyBwYXRoIGdlbmVyYXRpb24gYmVoYXZpb3IKKyAqIEBzaXplOiB0aGUgbWVtb3J5IGNvbnN1bWVkIGJ5IHRoaXMgcHJvZmlsZXMgcnVsZXMKKyAqIEBmaWxlOiBUaGUgc2V0IG9mIHJ1bGVzIGdvdmVybmluZyBiYXNpYyBmaWxlIGFjY2VzcyBhbmQgZG9tYWluIHRyYW5zaXRpb25zCisgKiBAY2FwczogY2FwYWJpbGl0aWVzIGZvciB0aGUgcHJvZmlsZQorICogQHJsaW1pdHM6IHJsaW1pdHMgZm9yIHRoZSBwcm9maWxlCisgKgorICogVGhlIEFwcEFybW9yIHByb2ZpbGUgY29udGFpbnMgdGhlIGJhc2ljIGNvbmZpbmVtZW50IGRhdGEuICBFYWNoIHByb2ZpbGUKKyAqIGhhcyBhIG5hbWUsIGFuZCBleGlzdHMgaW4gYSBuYW1lc3BhY2UuICBUaGUgQG5hbWUgYW5kIEBleGVjX21hdGNoIGFyZQorICogdXNlZCB0byBkZXRlcm1pbmUgcHJvZmlsZSBhdHRhY2htZW50IGFnYWluc3QgdW5jb25maW5lZCB0YXNrcy4gIEFsbCBvdGhlcgorICogYXR0YWNobWVudHMgYXJlIGRldGVybWluZWQgYnkgcHJvZmlsZSBYIHRyYW5zaXRpb24gcnVsZXMuCisgKgorICogVGhlIEByZXBsYWNlZGJ5IGZpZWxkIGlzIHdyaXRlIHByb3RlY3RlZCBieSB0aGUgcHJvZmlsZSBsb2NrLiAgUmVhZHMKKyAqIGFyZSBhc3N1bWVkIHRvIGJlIGF0b21pYywgYW5kIGFyZSBkb25lIHdpdGhvdXQgbG9ja2luZy4KKyAqCisgKiBQcm9maWxlcyBoYXZlIGEgaGllcmFyY2h5IHdoZXJlIGhhdHMgYW5kIGNoaWxkcmVuIHByb2ZpbGVzIGtlZXAKKyAqIGEgcmVmZXJlbmNlIHRvIHRoZWlyIHBhcmVudC4KKyAqCisgKiBQcm9maWxlIG5hbWVzIGNhbiBub3QgYmVnaW4gd2l0aCBhIDogYW5kIGNhbiBub3QgY29udGFpbiB0aGUgXDAKKyAqIGNoYXJhY3Rlci4gIElmIGEgcHJvZmlsZSBuYW1lIGJlZ2lucyB3aXRoIC8gaXQgd2lsbCBiZSBjb25zaWRlcmVkIHdoZW4KKyAqIGRldGVybWluaW5nIHByb2ZpbGUgYXR0YWNobWVudCBvbiAidW5jb25maW5lZCIgdGFza3MuCisgKi8KK3N0cnVjdCBhYV9wcm9maWxlIHsKKwlzdHJ1Y3QgYWFfcG9saWN5IGJhc2U7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnBhcmVudDsKKworCXN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zOworCXN0cnVjdCBhYV9wcm9maWxlICpyZXBsYWNlZGJ5OworCWNvbnN0IGNoYXIgKnJlbmFtZTsKKworCXN0cnVjdCBhYV9kZmEgKnhtYXRjaDsKKwlpbnQgeG1hdGNoX2xlbjsKKwl1MzIgc2lkOworCWVudW0gYXVkaXRfbW9kZSBhdWRpdDsKKwllbnVtIHByb2ZpbGVfbW9kZSBtb2RlOworCXUzMiBmbGFnczsKKwl1MzIgcGF0aF9mbGFnczsKKwlpbnQgc2l6ZTsKKworCXN0cnVjdCBhYV9maWxlX3J1bGVzIGZpbGU7CisJc3RydWN0IGFhX2NhcHMgY2FwczsKKwlzdHJ1Y3QgYWFfcmxpbWl0IHJsaW1pdHM7Cit9OworCitleHRlcm4gc3RydWN0IGFhX25hbWVzcGFjZSAqcm9vdF9uczsKK2V4dGVybiBlbnVtIHByb2ZpbGVfbW9kZSBhYV9nX3Byb2ZpbGVfbW9kZTsKKwordm9pZCBhYV9hZGRfcHJvZmlsZShzdHJ1Y3QgYWFfcG9saWN5ICpjb21tb24sIHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlKTsKKworYm9vbCBhYV9uc192aXNpYmxlKHN0cnVjdCBhYV9uYW1lc3BhY2UgKmN1cnIsIHN0cnVjdCBhYV9uYW1lc3BhY2UgKnZpZXcpOworY29uc3QgY2hhciAqYWFfbnNfbmFtZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpwYXJlbnQsIHN0cnVjdCBhYV9uYW1lc3BhY2UgKmNoaWxkKTsKK2ludCBhYV9hbGxvY19yb290X25zKHZvaWQpOwordm9pZCBhYV9mcmVlX3Jvb3RfbnModm9pZCk7Cit2b2lkIGFhX2ZyZWVfbmFtZXNwYWNlX2tyZWYoc3RydWN0IGtyZWYgKmtyZWYpOworCitzdHJ1Y3QgYWFfbmFtZXNwYWNlICphYV9maW5kX25hbWVzcGFjZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpyb290LAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWFfcG9saWN5ICphYV9nZXRfY29tbW9uKHN0cnVjdCBhYV9wb2xpY3kgKmMpCit7CisJaWYgKGMpCisJCWtyZWZfZ2V0KCZjLT5jb3VudCk7CisKKwlyZXR1cm4gYzsKK30KKworLyoqCisgKiBhYV9nZXRfbmFtZXNwYWNlIC0gaW5jcmVtZW50IHJlZmVyZW5jZXMgY291bnQgb24gQG5zCisgKiBAbnM6IG5hbWVzcGFjZSB0byBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIChNQVlCRSBOVUxMKQorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgdG8gQG5zLCBpZiBAbnMgaXMgTlVMTCByZXR1cm5zIE5VTEwKKyAqIFJlcXVpcmVzOiBAbnMgbXVzdCBiZSBoZWxkIHdpdGggdmFsaWQgcmVmY291bnQgd2hlbiBjYWxsZWQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWFfbmFtZXNwYWNlICphYV9nZXRfbmFtZXNwYWNlKHN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zKQoreworCWlmIChucykKKwkJa3JlZl9nZXQoJihucy0+YmFzZS5jb3VudCkpOworCisJcmV0dXJuIG5zOworfQorCisvKioKKyAqIGFhX3B1dF9uYW1lc3BhY2UgLSBkZWNyZW1lbnQgcmVmY291bnQgb24gQG5zCisgKiBAbnM6IG5hbWVzcGFjZSB0byBwdXQgcmVmZXJlbmNlIG9mCisgKgorICogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvZiBAbnMgYW5kIGlmIG5vIGxvbmdlciBpbiB1c2UgZnJlZSBpdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWFfcHV0X25hbWVzcGFjZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucykKK3sKKwlpZiAobnMpCisJCWtyZWZfcHV0KCZucy0+YmFzZS5jb3VudCwgYWFfZnJlZV9uYW1lc3BhY2Vfa3JlZik7Cit9CisKK3N0cnVjdCBhYV9wcm9maWxlICphYV9hbGxvY19wcm9maWxlKGNvbnN0IGNoYXIgKm5hbWUpOworc3RydWN0IGFhX3Byb2ZpbGUgKmFhX25ld19udWxsX3Byb2ZpbGUoc3RydWN0IGFhX3Byb2ZpbGUgKnBhcmVudCwgaW50IGhhdCk7Cit2b2lkIGFhX2ZyZWVfcHJvZmlsZV9rcmVmKHN0cnVjdCBrcmVmICprcmVmKTsKK3N0cnVjdCBhYV9wcm9maWxlICphYV9maW5kX2NoaWxkKHN0cnVjdCBhYV9wcm9maWxlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RydWN0IGFhX3Byb2ZpbGUgKmFhX2xvb2t1cF9wcm9maWxlKHN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zLCBjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBhYV9wcm9maWxlICphYV9tYXRjaF9wcm9maWxlKHN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zLCBjb25zdCBjaGFyICpuYW1lKTsKKworc3NpemVfdCBhYV9yZXBsYWNlX3Byb2ZpbGVzKHZvaWQgKnVkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub3JlcGxhY2UpOworc3NpemVfdCBhYV9yZW1vdmVfcHJvZmlsZXMoY2hhciAqbmFtZSwgc2l6ZV90IHNpemUpOworCisjZGVmaW5lIFBST0ZfQUREIDEKKyNkZWZpbmUgUFJPRl9SRVBMQUNFIDAKKworI2RlZmluZSB1bmNvbmZpbmVkKFgpICgoWCktPmZsYWdzICYgUEZMQUdfVU5DT05GSU5FRCkKKworLyoqCisgKiBhYV9uZXdlc3RfdmVyc2lvbiAtIGZpbmQgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIEBwcm9maWxlCisgKiBAcHJvZmlsZTogdGhlIHByb2ZpbGUgdG8gY2hlY2sgZm9yIG5ld2VyIHZlcnNpb25zIG9mIChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiBuZXdlc3QgdmVyc2lvbiBvZiBAcHJvZmlsZSwgaWYgQHByb2ZpbGUgaXMgdGhlIG5ld2VzdCB2ZXJzaW9uCisgKiAgICAgICAgICByZXR1cm4gQHByb2ZpbGUuCisgKgorICogTk9URTogdGhlIHByb2ZpbGUgcmV0dXJuZWQgaXMgbm90IHJlZmNvdW50ZWQsIFRoZSByZWZjb3VudCBvbiBAcHJvZmlsZQorICogbXVzdCBiZSBoZWxkIHVudGlsIHRoZSBjYWxsZXIgZGVjaWRlcyB3aGF0IHRvIGRvIHdpdGggdGhlIHJldHVybmVkIG5ld2VzdAorICogdmVyc2lvbi4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWFfcHJvZmlsZSAqYWFfbmV3ZXN0X3ZlcnNpb24oc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJd2hpbGUgKHByb2ZpbGUtPnJlcGxhY2VkYnkpCisJCXByb2ZpbGUgPSBwcm9maWxlLT5yZXBsYWNlZGJ5OworCisJcmV0dXJuIHByb2ZpbGU7Cit9CisKKy8qKgorICogYWFfZ2V0X3Byb2ZpbGUgLSBpbmNyZW1lbnQgcmVmY291bnQgb24gcHJvZmlsZSBAcAorICogQHA6IHByb2ZpbGUgIChNQVlCRSBOVUxMKQorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgdG8gQHAgaWYgQHAgaXMgTlVMTCB3aWxsIHJldHVybiBOVUxMCisgKiBSZXF1aXJlczogQHAgbXVzdCBiZSBoZWxkIHdpdGggdmFsaWQgcmVmY291bnQgd2hlbiBjYWxsZWQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWFfcHJvZmlsZSAqYWFfZ2V0X3Byb2ZpbGUoc3RydWN0IGFhX3Byb2ZpbGUgKnApCit7CisJaWYgKHApCisJCWtyZWZfZ2V0KCYocC0+YmFzZS5jb3VudCkpOworCisJcmV0dXJuIHA7Cit9CisKKy8qKgorICogYWFfcHV0X3Byb2ZpbGUgLSBkZWNyZW1lbnQgcmVmY291bnQgb24gcHJvZmlsZSBAcAorICogQHA6IHByb2ZpbGUgIChNQVlCRSBOVUxMKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWFfcHV0X3Byb2ZpbGUoc3RydWN0IGFhX3Byb2ZpbGUgKnApCit7CisJaWYgKHApCisJCWtyZWZfcHV0KCZwLT5iYXNlLmNvdW50LCBhYV9mcmVlX3Byb2ZpbGVfa3JlZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IEFVRElUX01PREUoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJaWYgKGFhX2dfYXVkaXQgIT0gQVVESVRfTk9STUFMKQorCQlyZXR1cm4gYWFfZ19hdWRpdDsKKworCXJldHVybiBwcm9maWxlLT5hdWRpdDsKK30KKworYm9vbCBhYV9tYXlfbWFuYWdlX3BvbGljeShpbnQgb3ApOworCisjZW5kaWYgLyogX19BQV9QT0xJQ1lfSCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9wb2xpY3lfdW5wYWNrLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3BvbGljeV91bnBhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmRjY2NhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9wb2xpY3lfdW5wYWNrLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIEFwcEFybW9yIHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBBcHBBcm1vciBwb2xpY3kgbG9hZGluZyBpbnRlcmZhY2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1BPTElDWV9JTlRFUkZBQ0VfSAorI2RlZmluZSBfX1BPTElDWV9JTlRFUkZBQ0VfSAorCitzdHJ1Y3QgYWFfcHJvZmlsZSAqYWFfdW5wYWNrKHZvaWQgKnVkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqKm5zKTsKKworI2VuZGlmIC8qIF9fUE9MSUNZX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3Byb2NhdHRyLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3Byb2NhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0YWE2YgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvcHJvY2F0dHIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIC9wcm9jLzxwaWQ+L2F0dHIvIGludGVyZmFjZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQUFfUFJPQ0FUVFJfSAorI2RlZmluZSBfX0FBX1BST0NBVFRSX0gKKworI2RlZmluZSBBQV9ET19URVNUIDEKKyNkZWZpbmUgQUFfT05FWEVDICAxCisKK2ludCBhYV9nZXRwcm9jYXR0cihzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgY2hhciAqKnN0cmluZyk7CitpbnQgYWFfc2V0cHJvY2F0dHJfY2hhbmdlaGF0KGNoYXIgKmFyZ3MsIHNpemVfdCBzaXplLCBpbnQgdGVzdCk7CitpbnQgYWFfc2V0cHJvY2F0dHJfY2hhbmdlcHJvZmlsZShjaGFyICpmcW5hbWUsIGJvb2wgb25leGVjLCBpbnQgdGVzdCk7CitpbnQgYWFfc2V0cHJvY2F0dHJfcGVybWlwYyhjaGFyICpmcW5hbWUpOworCisjZW5kaWYgLyogX19BQV9QUk9DQVRUUl9IICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3Jlc291cmNlLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4OGJlOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvcmVzb3VyY2UuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIHJlc291cmNlIGxpbWl0cyBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQUFfUkVTT1VSQ0VfSAorI2RlZmluZSBfX0FBX1JFU09VUkNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworc3RydWN0IGFhX3Byb2ZpbGU7CisKKy8qIHN0cnVjdCBhYV9ybGltaXQgLSBybGltaXQgc2V0dGluZ3MgZm9yIHRoZSBwcm9maWxlCisgKiBAbWFzazogd2hpY2ggaGFyZCBsaW1pdHMgdG8gc2V0CisgKiBAbGltaXRzOiBybGltaXQgdmFsdWVzIHRoYXQgb3ZlcnJpZGUgdGFzayBsaW1pdHMKKyAqCisgKiBBcHBBcm1vciBybGltaXRzIGFyZSB1c2VkIHRvIHNldCBjb25maW5lZCB0YXNrIHJsaW1pdHMuICBPbmx5IHRoZQorICogbGltaXRzIHNwZWNpZmllZCBpbiBAbWFzayB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgYXBwYXJtb3IuCisgKi8KK3N0cnVjdCBhYV9ybGltaXQgeworCXVuc2lnbmVkIGludCBtYXNrOworCXN0cnVjdCBybGltaXQgbGltaXRzW1JMSU1fTkxJTUlUU107Cit9OworCitpbnQgYWFfbWFwX3Jlc291cmNlKGludCByZXNvdXJjZSk7CitpbnQgYWFfdGFza19zZXRybGltaXQoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHVuc2lnbmVkIGludCByZXNvdXJjZSwKKwkJICAgICAgc3RydWN0IHJsaW1pdCAqbmV3X3JsaW0pOworCit2b2lkIF9fYWFfdHJhbnNpdGlvbl9ybGltaXRzKHN0cnVjdCBhYV9wcm9maWxlICpvbGQsIHN0cnVjdCBhYV9wcm9maWxlICpuZXcpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYWFfZnJlZV9ybGltaXRfcnVsZXMoc3RydWN0IGFhX3JsaW1pdCAqcmxpbXMpCit7CisJLyogTk9QICovCit9CisKKyNlbmRpZiAvKiBfX0FBX1JFU09VUkNFX0ggKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvc2lkLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3NpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMGRiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL3NpZC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3Igc2VjdXJpdHkgaWRlbnRpZmllciAoc2lkKSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FBX1NJRF9ICisjZGVmaW5lIF9fQUFfU0lEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBhYV9wcm9maWxlOworCit1MzIgYWFfYWxsb2Nfc2lkKHZvaWQpOwordm9pZCBhYV9mcmVlX3NpZCh1MzIgc2lkKTsKKworI2VuZGlmIC8qIF9fQUFfU0lEX0ggKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2lwYy5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5ZmFkOAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2lwYy5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGlwYyBtZWRpYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL2F1ZGl0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jYXBhYmlsaXR5LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9wb2xpY3kuaCIKKworLyogY2FsbCBiYWNrIHRvIGF1ZGl0IHB0cmFjZSBmaWVsZHMgKi8KK3N0YXRpYyB2b2lkIGF1ZGl0X2NiKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCB2b2lkICp2YSkKK3sKKwlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKnNhID0gdmE7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiB0YXJnZXQ9Iik7CisJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgc2EtPmFhZC50YXJnZXQpOworfQorCisvKioKKyAqIGFhX2F1ZGl0X3B0cmFjZSAtIGRvIGF1ZGl0aW5nIGZvciBwdHJhY2UKKyAqIEBwcm9maWxlOiBwcm9maWxlIGJlaW5nIGVuZm9yY2VkICAoTk9UIE5VTEwpCisgKiBAdGFyZ2V0OiBwcm9maWxlIGJlaW5nIHRyYWNlZCAoTk9UIE5VTEwpCisgKiBAZXJyb3I6IGVycm9yIGNvbmRpdGlvbgorICoKKyAqIFJldHVybnM6ICUwIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBhYV9hdWRpdF9wdHJhY2Uoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsCisJCQkgICBzdHJ1Y3QgYWFfcHJvZmlsZSAqdGFyZ2V0LCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIHNhOworCUNPTU1PTl9BVURJVF9EQVRBX0lOSVQoJnNhLCBOT05FKTsKKwlzYS5hYWQub3AgPSBPUF9QVFJBQ0U7CisJc2EuYWFkLnRhcmdldCA9IHRhcmdldDsKKwlzYS5hYWQuZXJyb3IgPSBlcnJvcjsKKworCXJldHVybiBhYV9hdWRpdChBVURJVF9BUFBBUk1PUl9BVVRPLCBwcm9maWxlLCBHRlBfQVRPTUlDLCAmc2EsCisJCQlhdWRpdF9jYik7Cit9CisKKy8qKgorICogYWFfbWF5X3B0cmFjZSAtIHRlc3QgaWYgdHJhY2VyIHRhc2sgY2FuIHRyYWNlIHRoZSB0cmFjZWUKKyAqIEB0cmFjZXJfdGFzazogdGFzayB3aG8gd2lsbCBkbyB0aGUgdHJhY2luZyAgKE5PVCBOVUxMKQorICogQHRyYWNlcjogcHJvZmlsZSBvZiB0aGUgdGFzayBkb2luZyB0aGUgdHJhY2luZyAgKE5PVCBOVUxMKQorICogQHRyYWNlZTogdGFzayB0byBiZSB0cmFjZWQKKyAqIEBtb2RlOiB3aGV0aGVyIFBUUkFDRV9NT0RFX1JFQUQgfHwgUFRSQUNFX01PREVfQVRUQUNICisgKgorICogUmV0dXJuczogJTAgZWxzZSBlcnJvciBjb2RlIGlmIHBlcm1pc3Npb24gZGVuaWVkIG9yIGVycm9yCisgKi8KK2ludCBhYV9tYXlfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHJhY2VyX3Rhc2ssIHN0cnVjdCBhYV9wcm9maWxlICp0cmFjZXIsCisJCSAgc3RydWN0IGFhX3Byb2ZpbGUgKnRyYWNlZSwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJLyogVE9ETzogY3VycmVudGx5IG9ubHkgYmFzZWQgb24gY2FwYWJpbGl0eSwgbm90IGV4dGVuZGVkIHB0cmFjZQorCSAqICAgICAgIHJ1bGVzLAorCSAqICAgICAgIFRlc3QgbW9kZSBmb3IgUFRSQUNFX01PREVfUkVBRCB8fCBQVFJBQ0VfTU9ERV9BVFRBQ0gKKwkgKi8KKworCWlmICh1bmNvbmZpbmVkKHRyYWNlcikgfHwgdHJhY2VyID09IHRyYWNlZSkKKwkJcmV0dXJuIDA7CisJLyogbG9nIHRoaXMgY2FwYWJpbGl0eSByZXF1ZXN0ICovCisJcmV0dXJuIGFhX2NhcGFibGUodHJhY2VyX3Rhc2ssIHRyYWNlciwgQ0FQX1NZU19QVFJBQ0UsIDEpOworfQorCisvKioKKyAqIGFhX3B0cmFjZSAtIGRvIHB0cmFjZSBwZXJtaXNzaW9uIGNoZWNrIGFuZCBhdWRpdGluZworICogQHRyYWNlcjogdGFzayBkb2luZyB0aGUgdHJhY2luZyAoTk9UIE5VTEwpCisgKiBAdHJhY2VlOiB0YXNrIGJlaW5nIHRyYWNlZCAoTk9UIE5VTEwpCisgKiBAbW9kZTogcHRyYWNlIG1vZGUgZWl0aGVyIFBUUkFDRV9NT0RFX1JFQUQgfHwgUFRSQUNFX01PREVfQVRUQUNICisgKgorICogUmV0dXJuczogJTAgZWxzZSBlcnJvciBjb2RlIGlmIHBlcm1pc3Npb24gZGVuaWVkIG9yIGVycm9yCisgKi8KK2ludCBhYV9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0cmFjZXIsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHJhY2VlLAorCSAgICAgIHVuc2lnbmVkIGludCBtb2RlKQoreworCS8qCisJICogdHJhY2VyIGNhbiBwdHJhY2UgdHJhY2VlIHdoZW4KKwkgKiAtIHRyYWNlciBpcyB1bmNvbmZpbmVkIHx8CisJICogICAtIHRyYWNlciBpcyBpbiBjb21wbGFpbiBtb2RlCisJICogICAtIHRyYWNlciBoYXMgcnVsZXMgYWxsb3dpbmcgaXQgdG8gdHJhY2UgdHJhY2VlIGN1cnJlbnRseSB0aGlzIGlzOgorCSAqICAgICAgIC0gY29uZmluZWQgYnkgdGhlIHNhbWUgcHJvZmlsZSB8fAorCSAqICAgICAgIC0gdHJhY2VyIHByb2ZpbGUgaGFzIENBUF9TWVNfUFRSQUNFCisJICovCisKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqdHJhY2VyX3A7CisJLyogY3JlZCByZWxlYXNlZCBiZWxvdyAqLworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gZ2V0X3Rhc2tfY3JlZCh0cmFjZXIpOworCWludCBlcnJvciA9IDA7CisJdHJhY2VyX3AgPSBhYV9jcmVkX3Byb2ZpbGUoY3JlZCk7CisKKwlpZiAoIXVuY29uZmluZWQodHJhY2VyX3ApKSB7CisJCS8qIGxjcmVkIHJlbGVhc2VkIGJlbG93ICovCisJCWNvbnN0IHN0cnVjdCBjcmVkICpsY3JlZCA9IGdldF90YXNrX2NyZWQodHJhY2VlKTsKKwkJc3RydWN0IGFhX3Byb2ZpbGUgKnRyYWNlZV9wID0gYWFfY3JlZF9wcm9maWxlKGxjcmVkKTsKKworCQllcnJvciA9IGFhX21heV9wdHJhY2UodHJhY2VyLCB0cmFjZXJfcCwgdHJhY2VlX3AsIG1vZGUpOworCQllcnJvciA9IGFhX2F1ZGl0X3B0cmFjZSh0cmFjZXJfcCwgdHJhY2VlX3AsIGVycm9yKTsKKworCQlwdXRfY3JlZChsY3JlZCk7CisJfQorCXB1dF9jcmVkKGNyZWQpOworCisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvbGliLmMgYi9zZWN1cml0eS9hcHBhcm1vci9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg1Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvbGliLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYmFzaWMgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGluIEFwcEFybW9yCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL2F1ZGl0LmgiCisKKworLyoqCisgKiBhYV9zcGxpdF9mcW5hbWUgLSBzcGxpdCBhIGZxbmFtZSBpbnRvIGEgcHJvZmlsZSBhbmQgbmFtZXNwYWNlIG5hbWUKKyAqIEBmcW5hbWU6IGEgZnVsbCBxdWFsaWZpZWQgbmFtZSBpbiBuYW1lc3BhY2UgcHJvZmlsZSBmb3JtYXQgKE5PVCBOVUxMKQorICogQG5zX25hbWU6IHBvaW50ZXIgdG8gcG9ydGlvbiBvZiB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5zIG5hbWUgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IHByb2ZpbGUgbmFtZSBvciBOVUxMIGlmIG9uZSBpcyBub3Qgc3BlY2lmaWVkCisgKgorICogU3BsaXQgYSBuYW1lc3BhY2UgbmFtZSBmcm9tIGEgcHJvZmlsZSBuYW1lIChzZWUgcG9saWN5LmMgZm9yIG5hbWluZworICogZGVzY3JpcHRpb24pLiAgSWYgYSBwb3J0aW9uIG9mIHRoZSBuYW1lIGlzIG1pc3NpbmcgaXQgcmV0dXJucyBOVUxMIGZvcgorICogdGhhdCBwb3J0aW9uLgorICoKKyAqIE5PVEU6IG1heSBtb2RpZnkgdGhlIEBmcW5hbWUgc3RyaW5nLiAgVGhlIHBvaW50ZXJzIHJldHVybmVkIHBvaW50CisgKiAgICAgICBpbnRvIHRoZSBAZnFuYW1lIHN0cmluZy4KKyAqLworY2hhciAqYWFfc3BsaXRfZnFuYW1lKGNoYXIgKmZxbmFtZSwgY2hhciAqKm5zX25hbWUpCit7CisJY2hhciAqbmFtZSA9IHN0cmltKGZxbmFtZSk7CisKKwkqbnNfbmFtZSA9IE5VTEw7CisJaWYgKG5hbWVbMF0gPT0gJzonKSB7CisJCWNoYXIgKnNwbGl0ID0gc3RyY2hyKCZuYW1lWzFdLCAnOicpOworCQlpZiAoc3BsaXQpIHsKKwkJCS8qIG92ZXJ3cml0ZSAnOicgd2l0aCBcMCAqLworCQkJKnNwbGl0ID0gMDsKKwkJCW5hbWUgPSBza2lwX3NwYWNlcyhzcGxpdCArIDEpOworCQl9IGVsc2UKKwkJCS8qIGEgbnMgbmFtZSB3aXRob3V0IGEgZm9sbG93aW5nIHByb2ZpbGUgaXMgYWxsb3dlZCAqLworCQkJbmFtZSA9IE5VTEw7CisJCSpuc19uYW1lID0gJm5hbWVbMV07CisJfQorCWlmIChuYW1lICYmICpuYW1lID09IDApCisJCW5hbWUgPSBOVUxMOworCisJcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogYWFfaW5mb19tZXNzYWdlIC0gbG9nIGEgbm9uZSBwcm9maWxlIHJlbGF0ZWQgc3RhdHVzIG1lc3NhZ2UKKyAqIEBzdHI6IG1lc3NhZ2UgdG8gbG9nCisgKi8KK3ZvaWQgYWFfaW5mb19tZXNzYWdlKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoYXVkaXRfZW5hYmxlZCkgeworCQlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgc2E7CisJCUNPTU1PTl9BVURJVF9EQVRBX0lOSVQoJnNhLCBOT05FKTsKKwkJc2EuYWFkLmluZm8gPSBzdHI7CisJCWFhX2F1ZGl0X21zZyhBVURJVF9BUFBBUk1PUl9TVEFUVVMsICZzYSwgTlVMTCk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkFwcEFybW9yOiAlc1xuIiwgc3RyKTsKK30KKworLyoqCisgKiBrdm1hbGxvYyAtIGRvIGFsbG9jYXRpb24gcHJlZmVycmluZyBrbWFsbG9jIGJ1dCBmYWxsaW5nIGJhY2sgdG8gdm1hbGxvYworICogQHNpemU6IHNpemUgb2YgYWxsb2NhdGlvbgorICoKKyAqIFJldHVybjogYWxsb2NhdGVkIGJ1ZmZlciBvciBOVUxMIGlmIGZhaWxlZAorICoKKyAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgcG9saWN5IGJlaW5nIGxvYWRlZCBmcm9tIHRoZSB1c2VyIGlzIGxhcmdlciB0aGFuCisgKiB3aGF0IGNhbiBiZSBhbGxvY2F0ZWQgYnkga21hbGxvYywgaW4gdGhvc2UgY2FzZXMgZmFsbCBiYWNrIHRvIHZtYWxsb2MuCisgKi8KK3ZvaWQgKmt2bWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKmJ1ZmZlciA9IE5VTEw7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGRvIG5vdCBhdHRlbXB0IGttYWxsb2MgaWYgd2UgbmVlZCBtb3JlIHRoYW4gMTYgcGFnZXMgYXQgb25jZSAqLworCWlmIChzaXplIDw9ICgxNipQQUdFX1NJWkUpKQorCQlidWZmZXIgPSBrbWFsbG9jKHNpemUsIEdGUF9OT0lPIHwgX19HRlBfTk9XQVJOKTsKKwlpZiAoIWJ1ZmZlcikgeworCQkvKiBzZWUga3ZmcmVlIGZvciB3aHkgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IHdvcmtfc3RydWN0IHNpemUKKwkJICogd2hlbiBhbGxvY2F0ZWQgdmlhIHZtYWxsb2MKKwkJICovCisJCWlmIChzaXplIDwgc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCkpCisJCQlzaXplID0gc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCk7CisJCWJ1ZmZlciA9IHZtYWxsb2Moc2l6ZSk7CisJfQorCXJldHVybiBidWZmZXI7Cit9CisKKy8qKgorICogZG9fdmZyZWUgLSB3b3JrcXVldWUgcm91dGluZSBmb3IgZnJlZWluZyB2bWFsbG9jZWQgbWVtb3J5CisgKiBAd29yazogZGF0YSB0byBiZSBmcmVlZAorICoKKyAqIFRoZSB3b3JrX3N0cnVjdCBpcyBvdmVybGFpZCB0byB0aGUgZGF0YSBiZWluZyBmcmVlZCwgYXMgYXQgdGhlIHBvaW50CisgKiB0aGUgd29yayBpcyBzY2hlZHVsZWQgdGhlIGRhdGEgaXMgbm8gbG9uZ2VyIHZhbGlkLCBiZSBpdHMgZnJlZWluZworICogbmVlZHMgdG8gYmUgZGVsYXllZCB1bnRpbCBzYWZlLgorICovCitzdGF0aWMgdm9pZCBkb192ZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdmZyZWUod29yayk7Cit9CisKKy8qKgorICoga3ZmcmVlIC0gZnJlZSBhbiBhbGxvY2F0aW9uIGRvIGJ5IGt2bWFsbG9jCisgKiBAYnVmZmVyOiBidWZmZXIgdG8gZnJlZSAoTUFZQkVfTlVMTCkKKyAqCisgKiBGcmVlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSBrdm1hbGxvYworICovCit2b2lkIGt2ZnJlZSh2b2lkICpidWZmZXIpCit7CisJaWYgKGlzX3ZtYWxsb2NfYWRkcihidWZmZXIpKSB7CisJCS8qIERhdGEgaXMgbm8gbG9uZ2VyIHZhbGlkIHNvIGp1c3QgdXNlIHRoZSBhbGxvY2F0ZWQgc3BhY2UKKwkJICogYXMgdGhlIHdvcmtfc3RydWN0CisJCSAqLworCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSAoc3RydWN0IHdvcmtfc3RydWN0ICopIGJ1ZmZlcjsKKwkJSU5JVF9XT1JLKHdvcmssIGRvX3ZmcmVlKTsKKwkJc2NoZWR1bGVfd29yayh3b3JrKTsKKwl9IGVsc2UKKwkJa2ZyZWUoYnVmZmVyKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiMzNhOAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCkBAIC0wLDAgKzEsOTM4IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIExTTSBob29rcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgImluY2x1ZGUvYXBwYXJtb3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2FwcGFybW9yZnMuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2F1ZGl0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jYXBhYmlsaXR5LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9maWxlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9pcGMuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BhdGguaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorI2luY2x1ZGUgImluY2x1ZGUvcHJvY2F0dHIuaCIKKworLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkICovCitpbnQgYXBwYXJtb3JfaW5pdGlhbGl6ZWQgX19pbml0ZGF0YTsKKworLyoKKyAqIExTTSBob29rIGZ1bmN0aW9ucworICovCisKKy8qCisgKiBmcmVlIHRoZSBhc3NvY2lhdGVkIGFhX3Rhc2tfY3h0IGFuZCBwdXQgaXRzIHByb2ZpbGVzCisgKi8KK3N0YXRpYyB2b2lkIGFwcGFybW9yX2NyZWRfZnJlZShzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwlhYV9mcmVlX3Rhc2tfY29udGV4dChjcmVkLT5zZWN1cml0eSk7CisJY3JlZC0+c2VjdXJpdHkgPSBOVUxMOworfQorCisvKgorICogYWxsb2NhdGUgdGhlIGFwcGFybW9yIHBhcnQgb2YgYmxhbmsgY3JlZGVudGlhbHMKKyAqLworc3RhdGljIGludCBhcHBhcm1vcl9jcmVkX2FsbG9jX2JsYW5rKHN0cnVjdCBjcmVkICpjcmVkLCBnZnBfdCBnZnApCit7CisJLyogZnJlZWQgYnkgYXBwYXJtb3JfY3JlZF9mcmVlICovCisJc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQgPSBhYV9hbGxvY190YXNrX2NvbnRleHQoZ2ZwKTsKKwlpZiAoIWN4dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljcmVkLT5zZWN1cml0eSA9IGN4dDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByZXBhcmUgbmV3IGFhX3Rhc2tfY3h0IGZvciBtb2RpZmljYXRpb24gYnkgcHJlcGFyZV9jcmVkIGJsb2NrCisgKi8KK3N0YXRpYyBpbnQgYXBwYXJtb3JfY3JlZF9wcmVwYXJlKHN0cnVjdCBjcmVkICpuZXcsIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJIGdmcF90IGdmcCkKK3sKKwkvKiBmcmVlZCBieSBhcHBhcm1vcl9jcmVkX2ZyZWUgKi8KKwlzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dCA9IGFhX2FsbG9jX3Rhc2tfY29udGV4dChnZnApOworCWlmICghY3h0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFhX2R1cF90YXNrX2NvbnRleHQoY3h0LCBvbGQtPnNlY3VyaXR5KTsKKwluZXctPnNlY3VyaXR5ID0gY3h0OworCXJldHVybiAwOworfQorCisvKgorICogdHJhbnNmZXIgdGhlIGFwcGFybW9yIGRhdGEgdG8gYSBibGFuayBzZXQgb2YgY3JlZHMKKyAqLworc3RhdGljIHZvaWQgYXBwYXJtb3JfY3JlZF90cmFuc2ZlcihzdHJ1Y3QgY3JlZCAqbmV3LCBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkKQoreworCWNvbnN0IHN0cnVjdCBhYV90YXNrX2N4dCAqb2xkX2N4dCA9IG9sZC0+c2VjdXJpdHk7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpuZXdfY3h0ID0gbmV3LT5zZWN1cml0eTsKKworCWFhX2R1cF90YXNrX2NvbnRleHQobmV3X2N4dCwgb2xkX2N4dCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfcHRyYWNlX2FjY2Vzc19jaGVjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCQkJCQl1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyb3IgPSBjYXBfcHRyYWNlX2FjY2Vzc19jaGVjayhjaGlsZCwgbW9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gYWFfcHRyYWNlKGN1cnJlbnQsIGNoaWxkLCBtb2RlKTsKK30KKworc3RhdGljIGludCBhcHBhcm1vcl9wdHJhY2VfdHJhY2VtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCkKK3sKKwlpbnQgZXJyb3IgPSBjYXBfcHRyYWNlX3RyYWNlbWUocGFyZW50KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBhYV9wdHJhY2UocGFyZW50LCBjdXJyZW50LCBQVFJBQ0VfTU9ERV9BVFRBQ0gpOworfQorCisvKiBEZXJpdmVkIGZyb20gc2VjdXJpdHkvY29tbW9uY2FwLmM6Y2FwX2NhcGdldCAqLworc3RhdGljIGludCBhcHBhcm1vcl9jYXBnZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGtlcm5lbF9jYXBfdCAqZWZmZWN0aXZlLAorCQkJICAga2VybmVsX2NhcF90ICppbmhlcml0YWJsZSwga2VybmVsX2NhcF90ICpwZXJtaXR0ZWQpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJY3JlZCA9IF9fdGFza19jcmVkKHRhcmdldCk7CisJcHJvZmlsZSA9IGFhX2NyZWRfcHJvZmlsZShjcmVkKTsKKworCSplZmZlY3RpdmUgPSBjcmVkLT5jYXBfZWZmZWN0aXZlOworCSppbmhlcml0YWJsZSA9IGNyZWQtPmNhcF9pbmhlcml0YWJsZTsKKwkqcGVybWl0dGVkID0gY3JlZC0+Y2FwX3Blcm1pdHRlZDsKKworCWlmICghdW5jb25maW5lZChwcm9maWxlKSkgeworCQkqZWZmZWN0aXZlID0gY2FwX2ludGVyc2VjdCgqZWZmZWN0aXZlLCBwcm9maWxlLT5jYXBzLmFsbG93KTsKKwkJKnBlcm1pdHRlZCA9IGNhcF9pbnRlcnNlY3QoKnBlcm1pdHRlZCwgcHJvZmlsZS0+Y2Fwcy5hbGxvdyk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJICAgIGludCBjYXAsIGludCBhdWRpdCkKK3sKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZTsKKwkvKiBjYXBfY2FwYWJsZSByZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSAtRVBFUk0gKi8KKwlpbnQgZXJyb3IgPSBjYXBfY2FwYWJsZSh0YXNrLCBjcmVkLCBjYXAsIGF1ZGl0KTsKKwlpZiAoIWVycm9yKSB7CisJCXByb2ZpbGUgPSBhYV9jcmVkX3Byb2ZpbGUoY3JlZCk7CisJCWlmICghdW5jb25maW5lZChwcm9maWxlKSkKKwkJCWVycm9yID0gYWFfY2FwYWJsZSh0YXNrLCBwcm9maWxlLCBjYXAsIGF1ZGl0KTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGNvbW1vbl9wZXJtIC0gYmFzaWMgY29tbW9uIHBlcm1pc3Npb24gY2hlY2sgd3JhcHBlciBmbiBmb3IgcGF0aHMKKyAqIEBvcDogb3BlcmF0aW9uIGJlaW5nIGNoZWNrZWQKKyAqIEBwYXRoOiBwYXRoIHRvIGNoZWNrIHBlcm1pc3Npb24gb2YgIChOT1QgTlVMTCkKKyAqIEBtYXNrOiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgbWFzaworICogQGNvbmQ6IGNvbmRpdGlvbmFsIGluZm8gZm9yIHRoZSBwZXJtaXNzaW9uIHJlcXVlc3QgIChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiAlMCBlbHNlIGVycm9yIGNvZGUgaWYgZXJyb3Igb3IgcGVybWlzc2lvbiBkZW5pZWQKKyAqLworc3RhdGljIGludCBjb21tb25fcGVybShpbnQgb3AsIHN0cnVjdCBwYXRoICpwYXRoLCB1MzIgbWFzaywKKwkJICAgICAgIHN0cnVjdCBwYXRoX2NvbmQgKmNvbmQpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJaW50IGVycm9yID0gMDsKKworCXByb2ZpbGUgPSBfX2FhX2N1cnJlbnRfcHJvZmlsZSgpOworCWlmICghdW5jb25maW5lZChwcm9maWxlKSkKKwkJZXJyb3IgPSBhYV9wYXRoX3Blcm0ob3AsIHByb2ZpbGUsIHBhdGgsIDAsIG1hc2ssIGNvbmQpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGNvbW1vbl9wZXJtX2Rpcl9kZW50cnkgLSBjb21tb24gcGVybWlzc2lvbiB3cmFwcGVyIHdoZW4gcGF0aCBpcyBkaXIsIGRlbnRyeQorICogQG9wOiBvcGVyYXRpb24gYmVpbmcgY2hlY2tlZAorICogQGRpcjogZGlyZWN0b3J5IG9mIHRoZSBkZW50cnkgIChOT1QgTlVMTCkKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBjaGVjayAgKE5PVCBOVUxMKQorICogQG1hc2s6IHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBtYXNrCisgKiBAY29uZDogY29uZGl0aW9uYWwgaW5mbyBmb3IgdGhlIHBlcm1pc3Npb24gcmVxdWVzdCAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6ICUwIGVsc2UgZXJyb3IgY29kZSBpZiBlcnJvciBvciBwZXJtaXNzaW9uIGRlbmllZAorICovCitzdGF0aWMgaW50IGNvbW1vbl9wZXJtX2Rpcl9kZW50cnkoaW50IG9wLCBzdHJ1Y3QgcGF0aCAqZGlyLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgbWFzaywKKwkJCQkgIHN0cnVjdCBwYXRoX2NvbmQgKmNvbmQpCit7CisJc3RydWN0IHBhdGggcGF0aCA9IHsgZGlyLT5tbnQsIGRlbnRyeSB9OworCisJcmV0dXJuIGNvbW1vbl9wZXJtKG9wLCAmcGF0aCwgbWFzaywgY29uZCk7Cit9CisKKy8qKgorICogY29tbW9uX3Blcm1fbW50X2RlbnRyeSAtIGNvbW1vbiBwZXJtaXNzaW9uIHdyYXBwZXIgd2hlbiBtbnQsIGRlbnRyeQorICogQG9wOiBvcGVyYXRpb24gYmVpbmcgY2hlY2tlZAorICogQG1udDogbW91bnQgcG9pbnQgb2YgZGVudHJ5IChOT1QgTlVMTCkKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBjaGVjayAgKE5PVCBOVUxMKQorICogQG1hc2s6IHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBtYXNrCisgKgorICogUmV0dXJuczogJTAgZWxzZSBlcnJvciBjb2RlIGlmIGVycm9yIG9yIHBlcm1pc3Npb24gZGVuaWVkCisgKi8KK3N0YXRpYyBpbnQgY29tbW9uX3Blcm1fbW50X2RlbnRyeShpbnQgb3AsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgcGF0aCBwYXRoID0geyBtbnQsIGRlbnRyeSB9OworCXN0cnVjdCBwYXRoX2NvbmQgY29uZCA9IHsgZGVudHJ5LT5kX2lub2RlLT5pX3VpZCwKKwkJCQkgIGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlCisJfTsKKworCXJldHVybiBjb21tb25fcGVybShvcCwgJnBhdGgsIG1hc2ssICZjb25kKTsKK30KKworLyoqCisgKiBjb21tb25fcGVybV9ybSAtIGNvbW1vbiBwZXJtaXNzaW9uIHdyYXBwZXIgZm9yIG9wZXJhdGlvbnMgZG9pbmcgcm0KKyAqIEBvcDogb3BlcmF0aW9uIGJlaW5nIGNoZWNrZWQKKyAqIEBkaXI6IGRpcmVjdG9yeSB0aGF0IHRoZSBkZW50cnkgaXMgaW4gIChOT1QgTlVMTCkKKyAqIEBkZW50cnk6IGRlbnRyeSBiZWluZyBybSdkICAoTk9UIE5VTEwpCisgKiBAbWFzazogcmVxdWVzdGVkIHBlcm1pc3Npb24gbWFzaworICoKKyAqIFJldHVybnM6ICUwIGVsc2UgZXJyb3IgY29kZSBpZiBlcnJvciBvciBwZXJtaXNzaW9uIGRlbmllZAorICovCitzdGF0aWMgaW50IGNvbW1vbl9wZXJtX3JtKGludCBvcCwgc3RydWN0IHBhdGggKmRpciwKKwkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYXRoX2NvbmQgY29uZCA9IHsgfTsKKworCWlmICghaW5vZGUgfHwgIWRpci0+bW50IHx8ICFtZWRpYXRlZF9maWxlc3lzdGVtKGlub2RlKSkKKwkJcmV0dXJuIDA7CisKKwljb25kLnVpZCA9IGlub2RlLT5pX3VpZDsKKwljb25kLm1vZGUgPSBpbm9kZS0+aV9tb2RlOworCisJcmV0dXJuIGNvbW1vbl9wZXJtX2Rpcl9kZW50cnkob3AsIGRpciwgZGVudHJ5LCBtYXNrLCAmY29uZCk7Cit9CisKKy8qKgorICogY29tbW9uX3Blcm1fY3JlYXRlIC0gY29tbW9uIHBlcm1pc3Npb24gd3JhcHBlciBmb3Igb3BlcmF0aW9ucyBkb2luZyBjcmVhdGUKKyAqIEBvcDogb3BlcmF0aW9uIGJlaW5nIGNoZWNrZWQKKyAqIEBkaXI6IGRpcmVjdG9yeSB0aGF0IGRlbnRyeSB3aWxsIGJlIGNyZWF0ZWQgaW4gIChOT1QgTlVMTCkKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBjcmVhdGUgICAoTk9UIE5VTEwpCisgKiBAbWFzazogcmVxdWVzdCBwZXJtaXNzaW9uIG1hc2sKKyAqIEBtb2RlOiBjcmVhdGVkIGZpbGUgbW9kZQorICoKKyAqIFJldHVybnM6ICUwIGVsc2UgZXJyb3IgY29kZSBpZiBlcnJvciBvciBwZXJtaXNzaW9uIGRlbmllZAorICovCitzdGF0aWMgaW50IGNvbW1vbl9wZXJtX2NyZWF0ZShpbnQgb3AsIHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgIHUzMiBtYXNrLCB1bW9kZV90IG1vZGUpCit7CisJc3RydWN0IHBhdGhfY29uZCBjb25kID0geyBjdXJyZW50X2ZzdWlkKCksIG1vZGUgfTsKKworCWlmICghZGlyLT5tbnQgfHwgIW1lZGlhdGVkX2ZpbGVzeXN0ZW0oZGlyLT5kZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjb21tb25fcGVybV9kaXJfZGVudHJ5KG9wLCBkaXIsIGRlbnRyeSwgbWFzaywgJmNvbmQpOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX3BhdGhfdW5saW5rKHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gY29tbW9uX3Blcm1fcm0oT1BfVU5MSU5LLCBkaXIsIGRlbnRyeSwgQUFfTUFZX0RFTEVURSk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfcGF0aF9ta2RpcihzdHJ1Y3QgcGF0aCAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgICAgaW50IG1vZGUpCit7CisJcmV0dXJuIGNvbW1vbl9wZXJtX2NyZWF0ZShPUF9NS0RJUiwgZGlyLCBkZW50cnksIEFBX01BWV9DUkVBVEUsCisJCQkJICBTX0lGRElSKTsKK30KKworc3RhdGljIGludCBhcHBhcm1vcl9wYXRoX3JtZGlyKHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gY29tbW9uX3Blcm1fcm0oT1BfUk1ESVIsIGRpciwgZGVudHJ5LCBBQV9NQVlfREVMRVRFKTsKK30KKworc3RhdGljIGludCBhcHBhcm1vcl9wYXRoX21rbm9kKHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgICBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGRldikKK3sKKwlyZXR1cm4gY29tbW9uX3Blcm1fY3JlYXRlKE9QX01LTk9ELCBkaXIsIGRlbnRyeSwgQUFfTUFZX0NSRUFURSwgbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfcGF0aF90cnVuY2F0ZShzdHJ1Y3QgcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3QgcGF0aF9jb25kIGNvbmQgPSB7IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZS0+aV91aWQsCisJCQkJICBwYXRoLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZQorCX07CisKKwlpZiAoIXBhdGgtPm1udCB8fCAhbWVkaWF0ZWRfZmlsZXN5c3RlbShwYXRoLT5kZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjb21tb25fcGVybShPUF9UUlVOQywgcGF0aCwgTUFZX1dSSVRFIHwgQUFfTUFZX01FVEFfV1JJVEUsCisJCQkgICAmY29uZCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfcGF0aF9zeW1saW5rKHN0cnVjdCBwYXRoICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgY29uc3QgY2hhciAqb2xkX25hbWUpCit7CisJcmV0dXJuIGNvbW1vbl9wZXJtX2NyZWF0ZShPUF9TWU1MSU5LLCBkaXIsIGRlbnRyeSwgQUFfTUFZX0NSRUFURSwKKwkJCQkgIFNfSUZMTkspOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX3BhdGhfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqbmV3X2RpciwKKwkJCSAgICAgIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJaW50IGVycm9yID0gMDsKKworCWlmICghbWVkaWF0ZWRfZmlsZXN5c3RlbShvbGRfZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlwcm9maWxlID0gYWFfY3VycmVudF9wcm9maWxlKCk7CisJaWYgKCF1bmNvbmZpbmVkKHByb2ZpbGUpKQorCQllcnJvciA9IGFhX3BhdGhfbGluayhwcm9maWxlLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfcGF0aF9yZW5hbWUoc3RydWN0IHBhdGggKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkJc3RydWN0IHBhdGggKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisJaW50IGVycm9yID0gMDsKKworCWlmICghbWVkaWF0ZWRfZmlsZXN5c3RlbShvbGRfZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlwcm9maWxlID0gYWFfY3VycmVudF9wcm9maWxlKCk7CisJaWYgKCF1bmNvbmZpbmVkKHByb2ZpbGUpKSB7CisJCXN0cnVjdCBwYXRoIG9sZF9wYXRoID0geyBvbGRfZGlyLT5tbnQsIG9sZF9kZW50cnkgfTsKKwkJc3RydWN0IHBhdGggbmV3X3BhdGggPSB7IG5ld19kaXItPm1udCwgbmV3X2RlbnRyeSB9OworCQlzdHJ1Y3QgcGF0aF9jb25kIGNvbmQgPSB7IG9sZF9kZW50cnktPmRfaW5vZGUtPmlfdWlkLAorCQkJCQkgIG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZQorCQl9OworCisJCWVycm9yID0gYWFfcGF0aF9wZXJtKE9QX1JFTkFNRV9TUkMsIHByb2ZpbGUsICZvbGRfcGF0aCwgMCwKKwkJCQkgICAgIE1BWV9SRUFEIHwgQUFfTUFZX01FVEFfUkVBRCB8IE1BWV9XUklURSB8CisJCQkJICAgICBBQV9NQVlfTUVUQV9XUklURSB8IEFBX01BWV9ERUxFVEUsCisJCQkJICAgICAmY29uZCk7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IGFhX3BhdGhfcGVybShPUF9SRU5BTUVfREVTVCwgcHJvZmlsZSwgJm5ld19wYXRoLAorCQkJCQkgICAgIDAsIE1BWV9XUklURSB8IEFBX01BWV9NRVRBX1dSSVRFIHwKKwkJCQkJICAgICBBQV9NQVlfQ1JFQVRFLCAmY29uZCk7CisKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX3BhdGhfY2htb2Qoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCSAgICAgICBtb2RlX3QgbW9kZSkKK3sKKwlpZiAoIW1lZGlhdGVkX2ZpbGVzeXN0ZW0oZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY29tbW9uX3Blcm1fbW50X2RlbnRyeShPUF9DSE1PRCwgbW50LCBkZW50cnksIEFBX01BWV9DSE1PRCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfcGF0aF9jaG93bihzdHJ1Y3QgcGF0aCAqcGF0aCwgdWlkX3QgdWlkLCBnaWRfdCBnaWQpCit7CisJc3RydWN0IHBhdGhfY29uZCBjb25kID0gIHsgcGF0aC0+ZGVudHJ5LT5kX2lub2RlLT5pX3VpZCwKKwkJCQkgICBwYXRoLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZQorCX07CisKKwlpZiAoIW1lZGlhdGVkX2ZpbGVzeXN0ZW0ocGF0aC0+ZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY29tbW9uX3Blcm0oT1BfQ0hPV04sIHBhdGgsIEFBX01BWV9DSE9XTiwgJmNvbmQpOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoIW1lZGlhdGVkX2ZpbGVzeXN0ZW0oZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY29tbW9uX3Blcm1fbW50X2RlbnRyeShPUF9HRVRBVFRSLCBtbnQsIGRlbnRyeSwKKwkJCQkgICAgICBBQV9NQVlfTUVUQV9SRUFEKTsKK30KKworc3RhdGljIGludCBhcHBhcm1vcl9kZW50cnlfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQpCit7CisJc3RydWN0IGFhX2ZpbGVfY3h0ICpmY3h0ID0gZmlsZS0+Zl9zZWN1cml0eTsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZTsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCFtZWRpYXRlZF9maWxlc3lzdGVtKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCS8qIElmIGluIGV4ZWMsIHBlcm1pc3Npb24gaXMgaGFuZGxlZCBieSBicHJtIGhvb2tzLgorCSAqIENhY2hlIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhlIHByZXZpb3VzIGV4ZWMgY2hlY2ssIHdpdGgKKwkgKiBpbXBsaWNpdCByZWFkIGFuZCBleGVjdXRhYmxlIG1tYXAgd2hpY2ggYXJlIHJlcXVpcmVkIHRvCisJICogYWN0dWFsbHkgZXhlY3V0ZSB0aGUgaW1hZ2UuCisJICovCisJaWYgKGN1cnJlbnQtPmluX2V4ZWN2ZSkgeworCQlmY3h0LT5hbGxvdyA9IE1BWV9FWEVDIHwgTUFZX1JFQUQgfCBBQV9FWEVDX01NQVA7CisJCXJldHVybiAwOworCX0KKworCXByb2ZpbGUgPSBhYV9jcmVkX3Byb2ZpbGUoY3JlZCk7CisJaWYgKCF1bmNvbmZpbmVkKHByb2ZpbGUpKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgcGF0aF9jb25kIGNvbmQgPSB7IGlub2RlLT5pX3VpZCwgaW5vZGUtPmlfbW9kZSB9OworCisJCWVycm9yID0gYWFfcGF0aF9wZXJtKE9QX09QRU4sIHByb2ZpbGUsICZmaWxlLT5mX3BhdGgsIDAsCisJCQkJICAgICBhYV9tYXBfZmlsZV90b19wZXJtcyhmaWxlKSwgJmNvbmQpOworCQkvKiB0b2RvIGNhY2hlIGZ1bGwgYWxsb3dlZCBwZXJtaXNzaW9ucyBzZXQgYW5kIHN0YXRlICovCisJCWZjeHQtPmFsbG93ID0gYWFfbWFwX2ZpbGVfdG9fcGVybXMoZmlsZSk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX2ZpbGVfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogZnJlZWQgYnkgYXBwYXJtb3JfZmlsZV9mcmVlX3NlY3VyaXR5ICovCisJZmlsZS0+Zl9zZWN1cml0eSA9IGFhX2FsbG9jX2ZpbGVfY29udGV4dChHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUtPmZfc2VjdXJpdHkpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGFwcGFybW9yX2ZpbGVfZnJlZV9zZWN1cml0eShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWFfZmlsZV9jeHQgKmN4dCA9IGZpbGUtPmZfc2VjdXJpdHk7CisKKwlhYV9mcmVlX2ZpbGVfY29udGV4dChjeHQpOworfQorCitzdGF0aWMgaW50IGNvbW1vbl9maWxlX3Blcm0oaW50IG9wLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIG1hc2spCit7CisJc3RydWN0IGFhX2ZpbGVfY3h0ICpmY3h0ID0gZmlsZS0+Zl9zZWN1cml0eTsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSwgKmZwcm9maWxlID0gYWFfY3JlZF9wcm9maWxlKGZpbGUtPmZfY3JlZCk7CisJaW50IGVycm9yID0gMDsKKworCUJVR19PTighZnByb2ZpbGUpOworCisJaWYgKCFmaWxlLT5mX3BhdGgubW50IHx8CisJICAgICFtZWRpYXRlZF9maWxlc3lzdGVtKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCXByb2ZpbGUgPSBfX2FhX2N1cnJlbnRfcHJvZmlsZSgpOworCisJLyogcmV2YWxpZGF0ZSBhY2Nlc3MsIGlmIHRhc2sgaXMgdW5jb25maW5lZCwgb3IgdGhlIGNhY2hlZCBjcmVkCisJICogZG9lc24ndCBtYXRjaCBvciBpZiB0aGUgcmVxdWVzdCBpcyBmb3IgbW9yZSBwZXJtaXNzaW9ucyB0aGFuCisJICogd2FzIGdyYW50ZWQuCisJICoKKwkgKiBOb3RlOiB0aGUgdGVzdCBmb3IgIXVuY29uZmluZWQoZnByb2ZpbGUpIGlzIHRvIGhhbmRsZSBmaWxlCisJICogICAgICAgZGVsZWdhdGlvbiBmcm9tIHVuY29uZmluZWQgdGFza3MKKwkgKi8KKwlpZiAoIXVuY29uZmluZWQocHJvZmlsZSkgJiYgIXVuY29uZmluZWQoZnByb2ZpbGUpICYmCisJICAgICgoZnByb2ZpbGUgIT0gcHJvZmlsZSkgfHwgKG1hc2sgJiB+ZmN4dC0+YWxsb3cpKSkKKwkJZXJyb3IgPSBhYV9maWxlX3Blcm0ob3AsIHByb2ZpbGUsIGZpbGUsIG1hc2spOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX2ZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spCit7CisJcmV0dXJuIGNvbW1vbl9maWxlX3Blcm0oT1BfRlBFUk0sIGZpbGUsIG1hc2spOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX2ZpbGVfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwl1MzIgbWFzayA9IEFBX01BWV9MT0NLOworCisJaWYgKGNtZCA9PSBGX1dSTENLKQorCQltYXNrIHw9IE1BWV9XUklURTsKKworCXJldHVybiBjb21tb25fZmlsZV9wZXJtKE9QX0ZMT0NLLCBmaWxlLCBtYXNrKTsKK30KKworc3RhdGljIGludCBjb21tb25fbW1hcChpbnQgb3AsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIHByb3QsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgbWFzayA9IDA7CisKKwlpZiAoIWZpbGUgfHwgIWZpbGUtPmZfc2VjdXJpdHkpCisJCXJldHVybiAwOworCisJaWYgKHByb3QgJiBQUk9UX1JFQUQpCisJCW1hc2sgfD0gTUFZX1JFQUQ7CisJLyoKKwkgKiBQcml2YXRlIG1hcHBpbmdzIGRvbid0IHJlcXVpcmUgd3JpdGUgcGVybXMgc2luY2UgdGhleSBkb24ndAorCSAqIHdyaXRlIGJhY2sgdG8gdGhlIGZpbGVzCisJICovCisJaWYgKChwcm90ICYgUFJPVF9XUklURSkgJiYgIShmbGFncyAmIE1BUF9QUklWQVRFKSkKKwkJbWFzayB8PSBNQVlfV1JJVEU7CisJaWYgKHByb3QgJiBQUk9UX0VYRUMpCisJCW1hc2sgfD0gQUFfRVhFQ19NTUFQOworCisJZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKKwlyZXR1cm4gY29tbW9uX2ZpbGVfcGVybShvcCwgZmlsZSwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIHJlcXByb3QsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgYWRkcl9vbmx5KQoreworCWludCByYyA9IDA7CisKKwkvKiBkbyBEQUMgY2hlY2sgKi8KKwlyYyA9IGNhcF9maWxlX21tYXAoZmlsZSwgcmVxcHJvdCwgcHJvdCwgZmxhZ3MsIGFkZHIsIGFkZHJfb25seSk7CisJaWYgKHJjIHx8IGFkZHJfb25seSkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGNvbW1vbl9tbWFwKE9QX0ZNTUFQLCBmaWxlLCBwcm90LCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYXBwYXJtb3JfZmlsZV9tcHJvdGVjdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcmVxcHJvdCwgdW5zaWduZWQgbG9uZyBwcm90KQoreworCXJldHVybiBjb21tb25fbW1hcChPUF9GTVBST1QsIHZtYS0+dm1fZmlsZSwgcHJvdCwKKwkJCSAgICEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgPyBNQVBfUFJJVkFURSA6IDApOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX2dldHByb2NhdHRyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqbmFtZSwKKwkJCQljaGFyICoqdmFsdWUpCit7CisJaW50IGVycm9yID0gLUVOT0VOVDsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZTsKKwkvKiByZWxlYXNlZCBiZWxvdyAqLworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gZ2V0X3Rhc2tfY3JlZCh0YXNrKTsKKwlzdHJ1Y3QgYWFfdGFza19jeHQgKmN4dCA9IGNyZWQtPnNlY3VyaXR5OworCXByb2ZpbGUgPSBhYV9jcmVkX3Byb2ZpbGUoY3JlZCk7CisKKwlpZiAoc3RyY21wKG5hbWUsICJjdXJyZW50IikgPT0gMCkKKwkJZXJyb3IgPSBhYV9nZXRwcm9jYXR0cihhYV9uZXdlc3RfdmVyc2lvbihjeHQtPnByb2ZpbGUpLAorCQkJCSAgICAgICB2YWx1ZSk7CisJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJwcmV2IikgPT0gMCAgJiYgY3h0LT5wcmV2aW91cykKKwkJZXJyb3IgPSBhYV9nZXRwcm9jYXR0cihhYV9uZXdlc3RfdmVyc2lvbihjeHQtPnByZXZpb3VzKSwKKwkJCQkgICAgICAgdmFsdWUpOworCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiZXhlYyIpID09IDAgJiYgY3h0LT5vbmV4ZWMpCisJCWVycm9yID0gYWFfZ2V0cHJvY2F0dHIoYWFfbmV3ZXN0X3ZlcnNpb24oY3h0LT5vbmV4ZWMpLAorCQkJCSAgICAgICB2YWx1ZSk7CisJZWxzZQorCQllcnJvciA9IC1FSU5WQUw7CisKKwlwdXRfY3JlZChjcmVkKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBhcHBhcm1vcl9zZXRwcm9jYXR0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKm5hbWUsCisJCQkJdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCWNoYXIgKmNvbW1hbmQsICphcmdzID0gdmFsdWU7CisJc2l6ZV90IGFyZ19zaXplOworCWludCBlcnJvcjsKKworCWlmIChzaXplID09IDApCisJCXJldHVybiAtRUlOVkFMOworCS8qIGFyZ3MgcG9pbnRzIHRvIGEgUEFHRV9TSVpFIGJ1ZmZlciwgQXBwQXJtb3IgcmVxdWlyZXMgdGhhdAorCSAqIHRoZSBidWZmZXIgbXVzdCBiZSBudWxsIHRlcm1pbmF0ZWQgb3IgaGF2ZSBzaXplIDw9IFBBR0VfU0laRSAtMQorCSAqIHNvIHRoYXQgQXBwQXJtb3IgY2FuIG51bGwgdGVybWluYXRlIHRoZW0KKwkgKi8KKwlpZiAoYXJnc1tzaXplIC0gMV0gIT0gJ1wwJykgeworCQlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYXJnc1tzaXplXSA9ICdcMCc7CisJfQorCisJLyogdGFzayBjYW4gb25seSB3cml0ZSBpdHMgb3duIGF0dHJpYnV0ZXMgKi8KKwlpZiAoY3VycmVudCAhPSB0YXNrKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWFyZ3MgPSB2YWx1ZTsKKwlhcmdzID0gc3RyaW0oYXJncyk7CisJY29tbWFuZCA9IHN0cnNlcCgmYXJncywgIiAiKTsKKwlpZiAoIWFyZ3MpCisJCXJldHVybiAtRUlOVkFMOworCWFyZ3MgPSBza2lwX3NwYWNlcyhhcmdzKTsKKwlpZiAoISphcmdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFyZ19zaXplID0gc2l6ZSAtIChhcmdzIC0gKGNoYXIgKikgdmFsdWUpOworCWlmIChzdHJjbXAobmFtZSwgImN1cnJlbnQiKSA9PSAwKSB7CisJCWlmIChzdHJjbXAoY29tbWFuZCwgImNoYW5nZWhhdCIpID09IDApIHsKKwkJCWVycm9yID0gYWFfc2V0cHJvY2F0dHJfY2hhbmdlaGF0KGFyZ3MsIGFyZ19zaXplLAorCQkJCQkJCSAhQUFfRE9fVEVTVCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKGNvbW1hbmQsICJwZXJtaGF0IikgPT0gMCkgeworCQkJZXJyb3IgPSBhYV9zZXRwcm9jYXR0cl9jaGFuZ2VoYXQoYXJncywgYXJnX3NpemUsCisJCQkJCQkJIEFBX0RPX1RFU1QpOworCQl9IGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAiY2hhbmdlcHJvZmlsZSIpID09IDApIHsKKwkJCWVycm9yID0gYWFfc2V0cHJvY2F0dHJfY2hhbmdlcHJvZmlsZShhcmdzLCAhQUFfT05FWEVDLAorCQkJCQkJCSAgICAgIUFBX0RPX1RFU1QpOworCQl9IGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAicGVybXByb2ZpbGUiKSA9PSAwKSB7CisJCQllcnJvciA9IGFhX3NldHByb2NhdHRyX2NoYW5nZXByb2ZpbGUoYXJncywgIUFBX09ORVhFQywKKwkJCQkJCQkgICAgIEFBX0RPX1RFU1QpOworCQl9IGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAicGVybWlwYyIpID09IDApIHsKKwkJCWVycm9yID0gYWFfc2V0cHJvY2F0dHJfcGVybWlwYyhhcmdzKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBzYTsKKwkJCUNPTU1PTl9BVURJVF9EQVRBX0lOSVQoJnNhLCBOT05FKTsKKwkJCXNhLmFhZC5vcCA9IE9QX1NFVFBST0NBVFRSOworCQkJc2EuYWFkLmluZm8gPSBuYW1lOworCQkJc2EuYWFkLmVycm9yID0gLUVJTlZBTDsKKwkJCXJldHVybiBhYV9hdWRpdChBVURJVF9BUFBBUk1PUl9ERU5JRUQsIE5VTEwsIEdGUF9LRVJORUwsCisJCQkJCSZzYSwgTlVMTCk7CisJCX0KKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiZXhlYyIpID09IDApIHsKKwkJZXJyb3IgPSBhYV9zZXRwcm9jYXR0cl9jaGFuZ2Vwcm9maWxlKGFyZ3MsIEFBX09ORVhFQywKKwkJCQkJCSAgICAgIUFBX0RPX1RFU1QpOworCX0gZWxzZSB7CisJCS8qIG9ubHkgc3VwcG9ydCB0aGUgImN1cnJlbnQiIGFuZCAiZXhlYyIgcHJvY2VzcyBhdHRyaWJ1dGVzICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHNpemU7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGFwcGFybW9yX3Rhc2tfc2V0cmxpbWl0KHVuc2lnbmVkIGludCByZXNvdXJjZSwKKwkJCQkgICBzdHJ1Y3QgcmxpbWl0ICpuZXdfcmxpbSkKK3sKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IGFhX2N1cnJlbnRfcHJvZmlsZSgpOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIXVuY29uZmluZWQocHJvZmlsZSkpCisJCWVycm9yID0gYWFfdGFza19zZXRybGltaXQocHJvZmlsZSwgcmVzb3VyY2UsIG5ld19ybGltKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBzZWN1cml0eV9vcGVyYXRpb25zIGFwcGFybW9yX29wcyA9IHsKKwkubmFtZSA9CQkJCSJhcHBhcm1vciIsCisKKwkucHRyYWNlX2FjY2Vzc19jaGVjayA9CQlhcHBhcm1vcl9wdHJhY2VfYWNjZXNzX2NoZWNrLAorCS5wdHJhY2VfdHJhY2VtZSA9CQlhcHBhcm1vcl9wdHJhY2VfdHJhY2VtZSwKKwkuY2FwZ2V0ID0JCQlhcHBhcm1vcl9jYXBnZXQsCisJLmNhcGFibGUgPQkJCWFwcGFybW9yX2NhcGFibGUsCisKKwkucGF0aF9saW5rID0JCQlhcHBhcm1vcl9wYXRoX2xpbmssCisJLnBhdGhfdW5saW5rID0JCQlhcHBhcm1vcl9wYXRoX3VubGluaywKKwkucGF0aF9zeW1saW5rID0JCQlhcHBhcm1vcl9wYXRoX3N5bWxpbmssCisJLnBhdGhfbWtkaXIgPQkJCWFwcGFybW9yX3BhdGhfbWtkaXIsCisJLnBhdGhfcm1kaXIgPQkJCWFwcGFybW9yX3BhdGhfcm1kaXIsCisJLnBhdGhfbWtub2QgPQkJCWFwcGFybW9yX3BhdGhfbWtub2QsCisJLnBhdGhfcmVuYW1lID0JCQlhcHBhcm1vcl9wYXRoX3JlbmFtZSwKKwkucGF0aF9jaG1vZCA9CQkJYXBwYXJtb3JfcGF0aF9jaG1vZCwKKwkucGF0aF9jaG93biA9CQkJYXBwYXJtb3JfcGF0aF9jaG93biwKKwkucGF0aF90cnVuY2F0ZSA9CQlhcHBhcm1vcl9wYXRoX3RydW5jYXRlLAorCS5kZW50cnlfb3BlbiA9CQkJYXBwYXJtb3JfZGVudHJ5X29wZW4sCisJLmlub2RlX2dldGF0dHIgPSAgICAgICAgICAgICAgICBhcHBhcm1vcl9pbm9kZV9nZXRhdHRyLAorCisJLmZpbGVfcGVybWlzc2lvbiA9CQlhcHBhcm1vcl9maWxlX3Blcm1pc3Npb24sCisJLmZpbGVfYWxsb2Nfc2VjdXJpdHkgPQkJYXBwYXJtb3JfZmlsZV9hbGxvY19zZWN1cml0eSwKKwkuZmlsZV9mcmVlX3NlY3VyaXR5ID0JCWFwcGFybW9yX2ZpbGVfZnJlZV9zZWN1cml0eSwKKwkuZmlsZV9tbWFwID0JCQlhcHBhcm1vcl9maWxlX21tYXAsCisJLmZpbGVfbXByb3RlY3QgPQkJYXBwYXJtb3JfZmlsZV9tcHJvdGVjdCwKKwkuZmlsZV9sb2NrID0JCQlhcHBhcm1vcl9maWxlX2xvY2ssCisKKwkuZ2V0cHJvY2F0dHIgPQkJCWFwcGFybW9yX2dldHByb2NhdHRyLAorCS5zZXRwcm9jYXR0ciA9CQkJYXBwYXJtb3Jfc2V0cHJvY2F0dHIsCisKKwkuY3JlZF9hbGxvY19ibGFuayA9CQlhcHBhcm1vcl9jcmVkX2FsbG9jX2JsYW5rLAorCS5jcmVkX2ZyZWUgPQkJCWFwcGFybW9yX2NyZWRfZnJlZSwKKwkuY3JlZF9wcmVwYXJlID0JCQlhcHBhcm1vcl9jcmVkX3ByZXBhcmUsCisJLmNyZWRfdHJhbnNmZXIgPQkJYXBwYXJtb3JfY3JlZF90cmFuc2ZlciwKKworCS5icHJtX3NldF9jcmVkcyA9CQlhcHBhcm1vcl9icHJtX3NldF9jcmVkcywKKwkuYnBybV9jb21taXR0aW5nX2NyZWRzID0JYXBwYXJtb3JfYnBybV9jb21taXR0aW5nX2NyZWRzLAorCS5icHJtX2NvbW1pdHRlZF9jcmVkcyA9CQlhcHBhcm1vcl9icHJtX2NvbW1pdHRlZF9jcmVkcywKKwkuYnBybV9zZWN1cmVleGVjID0JCWFwcGFybW9yX2Jwcm1fc2VjdXJlZXhlYywKKworCS50YXNrX3NldHJsaW1pdCA9CQlhcHBhcm1vcl90YXNrX3NldHJsaW1pdCwKK307CisKKy8qCisgKiBBcHBBcm1vciBzeXNmcyBtb2R1bGUgcGFyYW1ldGVycworICovCisKK3N0YXRpYyBpbnQgcGFyYW1fc2V0X2FhYm9vbChjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKK3N0YXRpYyBpbnQgcGFyYW1fZ2V0X2FhYm9vbChjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKKyNkZWZpbmUgcGFyYW1fY2hlY2tfYWFib29sKG5hbWUsIHApIF9fcGFyYW1fY2hlY2sobmFtZSwgcCwgaW50KQorCitzdGF0aWMgaW50IHBhcmFtX3NldF9hYXVpbnQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CitzdGF0aWMgaW50IHBhcmFtX2dldF9hYXVpbnQoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CisjZGVmaW5lIHBhcmFtX2NoZWNrX2FhdWludChuYW1lLCBwKSBfX3BhcmFtX2NoZWNrKG5hbWUsIHAsIGludCkKKworc3RhdGljIGludCBwYXJhbV9zZXRfYWFsb2NrcG9saWN5KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOworc3RhdGljIGludCBwYXJhbV9nZXRfYWFsb2NrcG9saWN5KGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOworI2RlZmluZSBwYXJhbV9jaGVja19hYWxvY2twb2xpY3kobmFtZSwgcCkgX19wYXJhbV9jaGVjayhuYW1lLCBwLCBpbnQpCisKK3N0YXRpYyBpbnQgcGFyYW1fc2V0X2F1ZGl0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOworc3RhdGljIGludCBwYXJhbV9nZXRfYXVkaXQoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CisjZGVmaW5lIHBhcmFtX2NoZWNrX2F1ZGl0KG5hbWUsIHApIF9fcGFyYW1fY2hlY2sobmFtZSwgcCwgaW50KQorCitzdGF0aWMgaW50IHBhcmFtX3NldF9tb2RlKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOworc3RhdGljIGludCBwYXJhbV9nZXRfbW9kZShjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKKyNkZWZpbmUgcGFyYW1fY2hlY2tfbW9kZShuYW1lLCBwKSBfX3BhcmFtX2NoZWNrKG5hbWUsIHAsIGludCkKKworLyogRmxhZyB2YWx1ZXMsIGFsc28gY29udHJvbGxhYmxlIHZpYSAvc3lzL21vZHVsZS9hcHBhcm1vci9wYXJhbWV0ZXJzCisgKiBXZSBkZWZpbmUgc3BlY2lhbCB0eXBlcyBhcyB3ZSB3YW50IHRvIGRvIGFkZGl0aW9uYWwgbWVkaWF0aW9uLgorICovCisKKy8qIEFwcEFybW9yIGdsb2JhbCBlbmZvcmNlbWVudCBzd2l0Y2ggLSBjb21wbGFpbiwgZW5mb3JjZSwga2lsbCAqLworZW51bSBwcm9maWxlX21vZGUgYWFfZ19wcm9maWxlX21vZGUgPSBBUFBBUk1PUl9FTkZPUkNFOworbW9kdWxlX3BhcmFtX2NhbGwobW9kZSwgcGFyYW1fc2V0X21vZGUsIHBhcmFtX2dldF9tb2RlLAorCQkgICZhYV9nX3Byb2ZpbGVfbW9kZSwgU19JUlVTUiB8IFNfSVdVU1IpOworCisvKiBEZWJ1ZyBtb2RlICovCitpbnQgYWFfZ19kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYWFfZ19kZWJ1ZywgYWFib29sLCBTX0lSVVNSIHwgU19JV1VTUik7CisKKy8qIEF1ZGl0IG1vZGUgKi8KK2VudW0gYXVkaXRfbW9kZSBhYV9nX2F1ZGl0OworbW9kdWxlX3BhcmFtX2NhbGwoYXVkaXQsIHBhcmFtX3NldF9hdWRpdCwgcGFyYW1fZ2V0X2F1ZGl0LAorCQkgICZhYV9nX2F1ZGl0LCBTX0lSVVNSIHwgU19JV1VTUik7CisKKy8qIERldGVybWluZXMgaWYgYXVkaXQgaGVhZGVyIGlzIGluY2x1ZGVkIGluIGF1ZGl0ZWQgbWVzc2FnZXMuICBUaGlzCisgKiBwcm92aWRlcyBtb3JlIGNvbnRleHQgaWYgdGhlIGF1ZGl0IGRhZW1vbiBpcyBub3QgcnVubmluZworICovCitpbnQgYWFfZ19hdWRpdF9oZWFkZXIgPSAxOworbW9kdWxlX3BhcmFtX25hbWVkKGF1ZGl0X2hlYWRlciwgYWFfZ19hdWRpdF9oZWFkZXIsIGFhYm9vbCwKKwkJICAgU19JUlVTUiB8IFNfSVdVU1IpOworCisvKiBsb2NrIG91dCBsb2FkaW5nL3JlbW92YWwgb2YgcG9saWN5CisgKiBUT0RPOiBhZGQgaW4gYXQgYm9vdCBsb2FkaW5nIG9mIHBvbGljeSwgd2hpY2ggaXMgdGhlIG9ubHkgd2F5IHRvCisgKiAgICAgICBsb2FkIHBvbGljeSwgaWYgbG9ja19wb2xpY3kgaXMgc2V0CisgKi8KK2ludCBhYV9nX2xvY2tfcG9saWN5OworbW9kdWxlX3BhcmFtX25hbWVkKGxvY2tfcG9saWN5LCBhYV9nX2xvY2tfcG9saWN5LCBhYWxvY2twb2xpY3ksCisJCSAgIFNfSVJVU1IgfCBTX0lXVVNSKTsKKworLyogU3lzY2FsbCBsb2dnaW5nIG1vZGUgKi8KK2ludCBhYV9nX2xvZ3N5c2NhbGw7Cittb2R1bGVfcGFyYW1fbmFtZWQobG9nc3lzY2FsbCwgYWFfZ19sb2dzeXNjYWxsLCBhYWJvb2wsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKworLyogTWF4aW11bSBwYXRobmFtZSBsZW5ndGggYmVmb3JlIGFjY2Vzc2VzIHdpbGwgc3RhcnQgZ2V0dGluZyByZWplY3RlZCAqLwordW5zaWduZWQgaW50IGFhX2dfcGF0aF9tYXggPSAyICogUEFUSF9NQVg7Cittb2R1bGVfcGFyYW1fbmFtZWQocGF0aF9tYXgsIGFhX2dfcGF0aF9tYXgsIGFhdWludCwgU19JUlVTUiB8IFNfSVdVU1IpOworCisvKiBEZXRlcm1pbmVzIGhvdyBwYXJhbm9pZCBsb2FkaW5nIG9mIHBvbGljeSBpcyBhbmQgaG93IG11Y2ggdmVyaWZpY2F0aW9uCisgKiBvbiB0aGUgbG9hZGVkIHBvbGljeSBpcyBkb25lLgorICovCitpbnQgYWFfZ19wYXJhbm9pZF9sb2FkID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChwYXJhbm9pZF9sb2FkLCBhYV9nX3BhcmFub2lkX2xvYWQsIGFhYm9vbCwKKwkJICAgU19JUlVTUiB8IFNfSVdVU1IpOworCisvKiBCb290IHRpbWUgZGlzYWJsZSBmbGFnICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFwcGFybW9yX2VuYWJsZWQgPSBDT05GSUdfU0VDVVJJVFlfQVBQQVJNT1JfQk9PVFBBUkFNX1ZBTFVFOworbW9kdWxlX3BhcmFtX25hbWVkKGVuYWJsZWQsIGFwcGFybW9yX2VuYWJsZWQsIGFhYm9vbCwgU19JUlVTUik7CisKK3N0YXRpYyBpbnQgX19pbml0IGFwcGFybW9yX2VuYWJsZWRfc2V0dXAoY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcgZW5hYmxlZDsKKwlpbnQgZXJyb3IgPSBzdHJpY3Rfc3RydG91bChzdHIsIDAsICZlbmFibGVkKTsKKwlpZiAoIWVycm9yKQorCQlhcHBhcm1vcl9lbmFibGVkID0gZW5hYmxlZCA/IDEgOiAwOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJhcHBhcm1vcj0iLCBhcHBhcm1vcl9lbmFibGVkX3NldHVwKTsKKworLyogc2V0IGdsb2JhbCBmbGFnIHR1cm5pbmcgb2ZmIHRoZSBhYmlsaXR5IHRvIGxvYWQgcG9saWN5ICovCitzdGF0aWMgaW50IHBhcmFtX3NldF9hYWxvY2twb2xpY3koY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGFhX2dfbG9ja19wb2xpY3kpCisJCXJldHVybiAtRUFDQ0VTOworCXJldHVybiBwYXJhbV9zZXRfYm9vbCh2YWwsIGtwKTsKK30KKworc3RhdGljIGludCBwYXJhbV9nZXRfYWFsb2NrcG9saWN5KGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBwYXJhbV9nZXRfYm9vbChidWZmZXIsIGtwKTsKK30KKworc3RhdGljIGludCBwYXJhbV9zZXRfYWFib29sKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBwYXJhbV9zZXRfYm9vbCh2YWwsIGtwKTsKK30KKworc3RhdGljIGludCBwYXJhbV9nZXRfYWFib29sKGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBwYXJhbV9nZXRfYm9vbChidWZmZXIsIGtwKTsKK30KKworc3RhdGljIGludCBwYXJhbV9zZXRfYWF1aW50KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBwYXJhbV9zZXRfdWludCh2YWwsIGtwKTsKK30KKworc3RhdGljIGludCBwYXJhbV9nZXRfYWF1aW50KGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBwYXJhbV9nZXRfdWludChidWZmZXIsIGtwKTsKK30KKworc3RhdGljIGludCBwYXJhbV9nZXRfYXVkaXQoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWFwcGFybW9yX2VuYWJsZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMiLCBhdWRpdF9tb2RlX25hbWVzW2FhX2dfYXVkaXRdKTsKK30KKworc3RhdGljIGludCBwYXJhbV9zZXRfYXVkaXQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgaTsKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWFwcGFybW9yX2VuYWJsZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF2YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IEFVRElUX01BWF9JTkRFWDsgaSsrKSB7CisJCWlmIChzdHJjbXAodmFsLCBhdWRpdF9tb2RlX25hbWVzW2ldKSA9PSAwKSB7CisJCQlhYV9nX2F1ZGl0ID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcGFyYW1fZ2V0X21vZGUoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWFwcGFybW9yX2VuYWJsZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMiLCBwcm9maWxlX21vZGVfbmFtZXNbYWFfZ19wcm9maWxlX21vZGVdKTsKK30KKworc3RhdGljIGludCBwYXJhbV9zZXRfbW9kZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWludCBpOworCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICghYXBwYXJtb3JfZW5hYmxlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVBQQVJNT1JfTkFNRVNfTUFYX0lOREVYOyBpKyspIHsKKwkJaWYgKHN0cmNtcCh2YWwsIHByb2ZpbGVfbW9kZV9uYW1lc1tpXSkgPT0gMCkgeworCQkJYWFfZ19wcm9maWxlX21vZGUgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIEFwcEFybW9yIGluaXQgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBzZXRfaW5pdF9jeHQgLSBzZXQgYSB0YXNrIGNvbnRleHQgYW5kIHByb2ZpbGUgb24gdGhlIGZpcnN0IHRhc2suCisgKgorICogVE9ETzogYWxsb3cgc2V0dGluZyBhbiBhbHRlcm5hdGUgcHJvZmlsZSB0aGFuIHVuY29uZmluZWQKKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X2luaXRfY3h0KHZvaWQpCit7CisJc3RydWN0IGNyZWQgKmNyZWQgPSAoc3RydWN0IGNyZWQgKiljdXJyZW50LT5yZWFsX2NyZWQ7CisJc3RydWN0IGFhX3Rhc2tfY3h0ICpjeHQ7CisKKwljeHQgPSBhYV9hbGxvY190YXNrX2NvbnRleHQoR0ZQX0tFUk5FTCk7CisJaWYgKCFjeHQpCisJCXJldHVybiAtRU5PTUVNOworCisJY3h0LT5wcm9maWxlID0gYWFfZ2V0X3Byb2ZpbGUocm9vdF9ucy0+dW5jb25maW5lZCk7CisJY3JlZC0+c2VjdXJpdHkgPSBjeHQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYXBwYXJtb3JfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCWlmICghYXBwYXJtb3JfZW5hYmxlZCB8fCAhc2VjdXJpdHlfbW9kdWxlX2VuYWJsZSgmYXBwYXJtb3Jfb3BzKSkgeworCQlhYV9pbmZvX21lc3NhZ2UoIkFwcEFybW9yIGRpc2FibGVkIGJ5IGJvb3QgdGltZSBwYXJhbWV0ZXIiKTsKKwkJYXBwYXJtb3JfZW5hYmxlZCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWVycm9yID0gYWFfYWxsb2Nfcm9vdF9ucygpOworCWlmIChlcnJvcikgeworCQlBQV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGRlZmF1bHQgcHJvZmlsZSBuYW1lc3BhY2VcbiIpOworCQlnb3RvIGFsbG9jX291dDsKKwl9CisKKwllcnJvciA9IHNldF9pbml0X2N4dCgpOworCWlmIChlcnJvcikgeworCQlBQV9FUlJPUigiRmFpbGVkIHRvIHNldCBjb250ZXh0IG9uIGluaXQgdGFza1xuIik7CisJCWdvdG8gcmVnaXN0ZXJfc2VjdXJpdHlfb3V0OworCX0KKworCWVycm9yID0gcmVnaXN0ZXJfc2VjdXJpdHkoJmFwcGFybW9yX29wcyk7CisJaWYgKGVycm9yKSB7CisJCUFBX0VSUk9SKCJVbmFibGUgdG8gcmVnaXN0ZXIgQXBwQXJtb3JcbiIpOworCQlnb3RvIHJlZ2lzdGVyX3NlY3VyaXR5X291dDsKKwl9CisKKwkvKiBSZXBvcnQgdGhhdCBBcHBBcm1vciBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKwlhcHBhcm1vcl9pbml0aWFsaXplZCA9IDE7CisJaWYgKGFhX2dfcHJvZmlsZV9tb2RlID09IEFQUEFSTU9SX0NPTVBMQUlOKQorCQlhYV9pbmZvX21lc3NhZ2UoIkFwcEFybW9yIGluaXRpYWxpemVkOiBjb21wbGFpbiBtb2RlIGVuYWJsZWQiKTsKKwllbHNlIGlmIChhYV9nX3Byb2ZpbGVfbW9kZSA9PSBBUFBBUk1PUl9LSUxMKQorCQlhYV9pbmZvX21lc3NhZ2UoIkFwcEFybW9yIGluaXRpYWxpemVkOiBraWxsIG1vZGUgZW5hYmxlZCIpOworCWVsc2UKKwkJYWFfaW5mb19tZXNzYWdlKCJBcHBBcm1vciBpbml0aWFsaXplZCIpOworCisJcmV0dXJuIGVycm9yOworCityZWdpc3Rlcl9zZWN1cml0eV9vdXQ6CisJYWFfZnJlZV9yb290X25zKCk7CisKK2FsbG9jX291dDoKKwlhYV9kZXN0cm95X2FhZnMoKTsKKworCWFwcGFybW9yX2VuYWJsZWQgPSAwOworCXJldHVybiBlcnJvcjsKKworfQorCitzZWN1cml0eV9pbml0Y2FsbChhcHBhcm1vcl9pbml0KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL21hdGNoLmMgYi9zZWN1cml0eS9hcHBhcm1vci9tYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjRkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9tYXRjaC5jCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIGRmYSBiYXNlZCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgZW5naW5lCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDggTm92ZWxsL1NVU0UKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvYXBwYXJtb3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL21hdGNoLmgiCisKKy8qKgorICogdW5wYWNrX3RhYmxlIC0gdW5wYWNrIGEgZGZhIHRhYmxlIChvbmUgb2YgYWNjZXB0LCBkZWZhdWx0LCBiYXNlLCBuZXh0IGNoZWNrKQorICogQGJsb2I6IGRhdGEgdG8gdW5wYWNrIChOT1QgTlVMTCkKKyAqIEBic2l6ZTogc2l6ZSBvZiBibG9iCisgKgorICogUmV0dXJuczogcG9pbnRlciB0byB0YWJsZSBlbHNlIE5VTEwgb24gZmFpbHVyZQorICoKKyAqIE5PVEU6IG11c3QgYmUgZnJlZWQgYnkga3ZmcmVlIChub3Qga21hbGxvYykKKyAqLworc3RhdGljIHN0cnVjdCB0YWJsZV9oZWFkZXIgKnVucGFja190YWJsZShjaGFyICpibG9iLCBzaXplX3QgYnNpemUpCit7CisJc3RydWN0IHRhYmxlX2hlYWRlciAqdGFibGUgPSBOVUxMOworCXN0cnVjdCB0YWJsZV9oZWFkZXIgdGg7CisJc2l6ZV90IHRzaXplOworCisJaWYgKGJzaXplIDwgc2l6ZW9mKHN0cnVjdCB0YWJsZV9oZWFkZXIpKQorCQlnb3RvIG91dDsKKworCS8qIGxvYWRlZCB0ZF9pZCdzIHN0YXJ0IGF0IDEsIHN1YnRyYWN0IDEgbm93IHRvIGF2b2lkIGRvaW5nCisJICogaXQgZXZlcnkgdGltZSB3ZSB1c2UgdGRfaWQgYXMgYW4gaW5kZXgKKwkgKi8KKwl0aC50ZF9pZCA9IGJlMTZfdG9fY3B1KCoodTE2ICopIChibG9iKSkgLSAxOworCXRoLnRkX2ZsYWdzID0gYmUxNl90b19jcHUoKih1MTYgKikgKGJsb2IgKyAyKSk7CisJdGgudGRfbG9sZW4gPSBiZTMyX3RvX2NwdSgqKHUzMiAqKSAoYmxvYiArIDgpKTsKKwlibG9iICs9IHNpemVvZihzdHJ1Y3QgdGFibGVfaGVhZGVyKTsKKworCWlmICghKHRoLnRkX2ZsYWdzID09IFlZVERfREFUQTE2IHx8IHRoLnRkX2ZsYWdzID09IFlZVERfREFUQTMyIHx8CisJICAgICAgdGgudGRfZmxhZ3MgPT0gWVlURF9EQVRBOCkpCisJCWdvdG8gb3V0OworCisJdHNpemUgPSB0YWJsZV9zaXplKHRoLnRkX2xvbGVuLCB0aC50ZF9mbGFncyk7CisJaWYgKGJzaXplIDwgdHNpemUpCisJCWdvdG8gb3V0OworCisJdGFibGUgPSBrdm1hbGxvYyh0c2l6ZSk7CisJaWYgKHRhYmxlKSB7CisJCSp0YWJsZSA9IHRoOworCQlpZiAodGgudGRfZmxhZ3MgPT0gWVlURF9EQVRBOCkKKwkJCVVOUEFDS19BUlJBWSh0YWJsZS0+dGRfZGF0YSwgYmxvYiwgdGgudGRfbG9sZW4sCisJCQkJICAgICB1OCwgYnl0ZV90b19ieXRlKTsKKwkJZWxzZSBpZiAodGgudGRfZmxhZ3MgPT0gWVlURF9EQVRBMTYpCisJCQlVTlBBQ0tfQVJSQVkodGFibGUtPnRkX2RhdGEsIGJsb2IsIHRoLnRkX2xvbGVuLAorCQkJCSAgICAgdTE2LCBiZTE2X3RvX2NwdSk7CisJCWVsc2UgaWYgKHRoLnRkX2ZsYWdzID09IFlZVERfREFUQTMyKQorCQkJVU5QQUNLX0FSUkFZKHRhYmxlLT50ZF9kYXRhLCBibG9iLCB0aC50ZF9sb2xlbiwKKwkJCQkgICAgIHUzMiwgYmUzMl90b19jcHUpOworCQllbHNlCisJCQlnb3RvIGZhaWw7CisJfQorCitvdXQ6CisJLyogaWYgdGFibGUgd2FzIHZtYWxsb2NlZCBtYWtlIHN1cmUgdGhlIHBhZ2UgdGFibGVzIGFyZSBzeW5jZWQKKwkgKiBiZWZvcmUgaXQgaXMgdXNlZCwgYXMgaXQgZ29lcyBsaXZlIHRvIGFsbCBjcHVzLgorCSAqLworCWlmIChpc192bWFsbG9jX2FkZHIodGFibGUpKQorCQl2bV91bm1hcF9hbGlhc2VzKCk7CisJcmV0dXJuIHRhYmxlOworZmFpbDoKKwlrdmZyZWUodGFibGUpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHZlcmlmeV9kZmEgLSB2ZXJpZnkgdGhhdCB0cmFuc2l0aW9ucyBhbmQgc3RhdGVzIGluIHRoZSB0YWJsZXMgYXJlIGluIGJvdW5kcy4KKyAqIEBkZmE6IGRmYSB0byB0ZXN0ICAoTk9UIE5VTEwpCisgKiBAZmxhZ3M6IGZsYWdzIGNvbnRyb2xsaW5nIHdoYXQgdHlwZSBvZiBhY2NlcHQgdGFibGUgYXJlIGFjY2VwdGFibGUKKyAqCisgKiBBc3N1bWVzIGRmYSBoYXMgZ29uZSB0aHJvdWdoIHRoZSBmaXJzdCBwYXNzIHZlcmlmaWNhdGlvbiBkb25lIGJ5IHVucGFja2luZworICogTk9URTogdGhpcyBkb2VzIG5vdCB2YWxpZCBhY2NlcHQgdGFibGUgdmFsdWVzCisgKgorICogUmV0dXJuczogJTAgZWxzZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgdG8gdmVyaWZ5CisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X2RmYShzdHJ1Y3QgYWFfZGZhICpkZmEsIGludCBmbGFncykKK3sKKwlzaXplX3QgaSwgc3RhdGVfY291bnQsIHRyYW5zX2NvdW50OworCWludCBlcnJvciA9IC1FUFJPVE87CisKKwkvKiBjaGVjayB0aGF0IHJlcXVpcmVkIHRhYmxlcyBleGlzdCAqLworCWlmICghKGRmYS0+dGFibGVzW1lZVERfSURfREVGXSAmJgorCSAgICAgIGRmYS0+dGFibGVzW1lZVERfSURfQkFTRV0gJiYKKwkgICAgICBkZmEtPnRhYmxlc1tZWVREX0lEX05YVF0gJiYgZGZhLT50YWJsZXNbWVlURF9JRF9DSEtdKSkKKwkJZ290byBvdXQ7CisKKwkvKiBhY2NlcHQuc2l6ZSA9PSBkZWZhdWx0LnNpemUgPT0gYmFzZS5zaXplICovCisJc3RhdGVfY291bnQgPSBkZmEtPnRhYmxlc1tZWVREX0lEX0JBU0VdLT50ZF9sb2xlbjsKKwlpZiAoQUNDRVBUMV9GTEFHUyhmbGFncykpIHsKKwkJaWYgKCFkZmEtPnRhYmxlc1tZWVREX0lEX0FDQ0VQVF0pCisJCQlnb3RvIG91dDsKKwkJaWYgKHN0YXRlX2NvdW50ICE9IGRmYS0+dGFibGVzW1lZVERfSURfQUNDRVBUXS0+dGRfbG9sZW4pCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKEFDQ0VQVDJfRkxBR1MoZmxhZ3MpKSB7CisJCWlmICghZGZhLT50YWJsZXNbWVlURF9JRF9BQ0NFUFQyXSkKKwkJCWdvdG8gb3V0OworCQlpZiAoc3RhdGVfY291bnQgIT0gZGZhLT50YWJsZXNbWVlURF9JRF9BQ0NFUFQyXS0+dGRfbG9sZW4pCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKHN0YXRlX2NvdW50ICE9IGRmYS0+dGFibGVzW1lZVERfSURfREVGXS0+dGRfbG9sZW4pCisJCWdvdG8gb3V0OworCisJLyogbmV4dC5zaXplID09IGNoay5zaXplICovCisJdHJhbnNfY291bnQgPSBkZmEtPnRhYmxlc1tZWVREX0lEX05YVF0tPnRkX2xvbGVuOworCWlmICh0cmFuc19jb3VudCAhPSBkZmEtPnRhYmxlc1tZWVREX0lEX0NIS10tPnRkX2xvbGVuKQorCQlnb3RvIG91dDsKKworCS8qIGlmIGVxdWl2YWxlbmNlIGNsYXNzZXMgdGhlbiBpdHMgdGFibGUgc2l6ZSBtdXN0IGJlIDI1NiAqLworCWlmIChkZmEtPnRhYmxlc1tZWVREX0lEX0VDXSAmJgorCSAgICBkZmEtPnRhYmxlc1tZWVREX0lEX0VDXS0+dGRfbG9sZW4gIT0gMjU2KQorCQlnb3RvIG91dDsKKworCWlmIChmbGFncyAmIERGQV9GTEFHX1ZFUklGWV9TVEFURVMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHN0YXRlX2NvdW50OyBpKyspIHsKKwkJCWlmIChERUZBVUxUX1RBQkxFKGRmYSlbaV0gPj0gc3RhdGVfY291bnQpCisJCQkJZ290byBvdXQ7CisJCQkvKiBUT0RPOiBkbyBjaGVjayB0aGF0IERFRiBzdGF0ZSByZWN1cnNpb24gdGVybWluYXRlcyAqLworCQkJaWYgKEJBU0VfVEFCTEUoZGZhKVtpXSArIDI1NSA+PSB0cmFuc19jb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiQXBwQXJtb3IgREZBIG5leHQvY2hlY2sgdXBwZXIgIgorCQkJCSAgICAgICAiYm91bmRzIGVycm9yXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB0cmFuc19jb3VudDsgaSsrKSB7CisJCQlpZiAoTkVYVF9UQUJMRShkZmEpW2ldID49IHN0YXRlX2NvdW50KQorCQkJCWdvdG8gb3V0OworCQkJaWYgKENIRUNLX1RBQkxFKGRmYSlbaV0gPj0gc3RhdGVfY291bnQpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGRmYV9mcmVlIC0gZnJlZSBhIGRmYSBhbGxvY2F0ZWQgYnkgYWFfZGZhX3VucGFjaworICogQGRmYTogdGhlIGRmYSB0byBmcmVlICAoTUFZQkUgTlVMTCkKKyAqCisgKiBSZXF1aXJlczogcmVmZXJlbmNlIGNvdW50IHRvIGRmYSA9PSAwCisgKi8KK3N0YXRpYyB2b2lkIGRmYV9mcmVlKHN0cnVjdCBhYV9kZmEgKmRmYSkKK3sKKwlpZiAoZGZhKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRmYS0+dGFibGVzKTsgaSsrKSB7CisJCQlrdmZyZWUoZGZhLT50YWJsZXNbaV0pOworCQkJZGZhLT50YWJsZXNbaV0gPSBOVUxMOworCQl9CisJCWtmcmVlKGRmYSk7CisJfQorfQorCisvKioKKyAqIGFhX2RmYV9mcmVlX2tyZWYgLSBmcmVlIGFhX2RmYSBieSBrcmVmIChjYWxsZWQgYnkgYWFfcHV0X2RmYSkKKyAqIEBrcjoga3JlZiBjYWxsYmFjayBmb3IgZnJlZWluZyBvZiBhIGRmYSAgKE5PVCBOVUxMKQorICovCit2b2lkIGFhX2RmYV9mcmVlX2tyZWYoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGFhX2RmYSAqZGZhID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBhYV9kZmEsIGNvdW50KTsKKwlkZmFfZnJlZShkZmEpOworfQorCisvKioKKyAqIGFhX2RmYV91bnBhY2sgLSB1bnBhY2sgdGhlIGJpbmFyeSB0YWJsZXMgb2YgYSBzZXJpYWxpemVkIGRmYQorICogQGJsb2I6IGFsaWduZWQgc2VyaWFsaXplZCBzdHJlYW0gb2YgZGF0YSB0byB1bnBhY2sgIChOT1QgTlVMTCkKKyAqIEBzaXplOiBzaXplIG9mIGRhdGEgdG8gdW5wYWNrCisgKiBAZmxhZ3M6IGZsYWdzIGNvbnRyb2xsaW5nIHdoYXQgdHlwZSBvZiBhY2NlcHQgdGFibGVzIGFyZSBhY2NlcHRhYmxlCisgKgorICogVW5wYWNrIGEgZGZhIHRoYXQgaGFzIGJlZW4gc2VyaWFsaXplZC4gIFRvIGZpbmQgaW5mb3JtYXRpb24gb24gdGhlIGRmYQorICogZm9ybWF0IGxvb2sgaW4gRG9jdW1lbnRhdGlvbi9hcHBhcm1vci50eHQKKyAqIEFzc3VtZXMgdGhlIGRmYSBAYmxvYiBzdHJlYW0gaGFzIGJlZW4gYWxpZ25lZCBvbiBhIDggYnl0ZSBib3VuZHJ5CisgKgorICogUmV0dXJuczogYW4gdW5wYWNrZWQgZGZhIHJlYWR5IGZvciBtYXRjaGluZyBvciBFUlJfUFRSIG9uIGZhaWx1cmUKKyAqLworc3RydWN0IGFhX2RmYSAqYWFfZGZhX3VucGFjayh2b2lkICpibG9iLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCBoc2l6ZTsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCWNoYXIgKmRhdGEgPSBibG9iOworCXN0cnVjdCB0YWJsZV9oZWFkZXIgKnRhYmxlID0gTlVMTDsKKwlzdHJ1Y3QgYWFfZGZhICpkZmEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWFfZGZhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZmEpCisJCWdvdG8gZmFpbDsKKworCWtyZWZfaW5pdCgmZGZhLT5jb3VudCk7CisKKwllcnJvciA9IC1FUFJPVE87CisKKwkvKiBnZXQgZGZhIHRhYmxlIHNldCBoZWFkZXIgKi8KKwlpZiAoc2l6ZSA8IHNpemVvZihzdHJ1Y3QgdGFibGVfc2V0X2hlYWRlcikpCisJCWdvdG8gZmFpbDsKKworCWlmIChudG9obCgqKHUzMiAqKSBkYXRhKSAhPSBZWVRIX01BR0lDKQorCQlnb3RvIGZhaWw7CisKKwloc2l6ZSA9IG50b2hsKCoodTMyICopIChkYXRhICsgNCkpOworCWlmIChzaXplIDwgaHNpemUpCisJCWdvdG8gZmFpbDsKKworCWRmYS0+ZmxhZ3MgPSBudG9ocygqKHUxNiAqKSAoZGF0YSArIDEyKSk7CisJZGF0YSArPSBoc2l6ZTsKKwlzaXplIC09IGhzaXplOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCXRhYmxlID0gdW5wYWNrX3RhYmxlKGRhdGEsIHNpemUpOworCQlpZiAoIXRhYmxlKQorCQkJZ290byBmYWlsOworCisJCXN3aXRjaCAodGFibGUtPnRkX2lkKSB7CisJCWNhc2UgWVlURF9JRF9BQ0NFUFQ6CisJCQlpZiAoISh0YWJsZS0+dGRfZmxhZ3MgJiBBQ0NFUFQxX0ZMQUdTKGZsYWdzKSkpCisJCQkJZ290byBmYWlsOworCQkJYnJlYWs7CisJCWNhc2UgWVlURF9JRF9BQ0NFUFQyOgorCQkJaWYgKCEodGFibGUtPnRkX2ZsYWdzICYgQUNDRVBUMl9GTEFHUyhmbGFncykpKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIFlZVERfSURfQkFTRToKKwkJCWlmICh0YWJsZS0+dGRfZmxhZ3MgIT0gWVlURF9EQVRBMzIpCisJCQkJZ290byBmYWlsOworCQkJYnJlYWs7CisJCWNhc2UgWVlURF9JRF9ERUY6CisJCWNhc2UgWVlURF9JRF9OWFQ6CisJCWNhc2UgWVlURF9JRF9DSEs6CisJCQlpZiAodGFibGUtPnRkX2ZsYWdzICE9IFlZVERfREFUQTE2KQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIFlZVERfSURfRUM6CisJCQlpZiAodGFibGUtPnRkX2ZsYWdzICE9IFlZVERfREFUQTgpCisJCQkJZ290byBmYWlsOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogY2hlY2sgZm9yIGR1cGxpY2F0ZSB0YWJsZSBlbnRyeSAqLworCQlpZiAoZGZhLT50YWJsZXNbdGFibGUtPnRkX2lkXSkKKwkJCWdvdG8gZmFpbDsKKwkJZGZhLT50YWJsZXNbdGFibGUtPnRkX2lkXSA9IHRhYmxlOworCQlkYXRhICs9IHRhYmxlX3NpemUodGFibGUtPnRkX2xvbGVuLCB0YWJsZS0+dGRfZmxhZ3MpOworCQlzaXplIC09IHRhYmxlX3NpemUodGFibGUtPnRkX2xvbGVuLCB0YWJsZS0+dGRfZmxhZ3MpOworCQl0YWJsZSA9IE5VTEw7CisJfQorCisJZXJyb3IgPSB2ZXJpZnlfZGZhKGRmYSwgZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJcmV0dXJuIGRmYTsKKworZmFpbDoKKwlrdmZyZWUodGFibGUpOworCWRmYV9mcmVlKGRmYSk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCisvKioKKyAqIGFhX2RmYV9tYXRjaF9sZW4gLSB0cmF2ZXJzZSBAZGZhIHRvIGZpbmQgc3RhdGUgQHN0ciBzdG9wcyBhdAorICogQGRmYTogdGhlIGRmYSB0byBtYXRjaCBAc3RyIGFnYWluc3QgIChOT1QgTlVMTCkKKyAqIEBzdGFydDogdGhlIHN0YXRlIG9mIHRoZSBkZmEgdG8gc3RhcnQgbWF0Y2hpbmcgaW4KKyAqIEBzdHI6IHRoZSBzdHJpbmcgb2YgYnl0ZXMgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgZGZhICAoTk9UIE5VTEwpCisgKiBAbGVuOiBsZW5ndGggb2YgdGhlIHN0cmluZyBvZiBieXRlcyB0byBtYXRjaAorICoKKyAqIGFhX2RmYV9tYXRjaF9sZW4gd2lsbCBtYXRjaCBAc3RyIGFnYWluc3QgdGhlIGRmYSBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBpdAorICogZmluaXNoZWQgbWF0Y2hpbmcgaW4uIFRoZSBmaW5hbCBzdGF0ZSBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBhY2NlcHRpbmcKKyAqIGxhYmVsLCBvciBhcyB0aGUgc3RhcnQgc3RhdGUgb2YgYSBjb250aW51aW5nIG1hdGNoLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYXBwaWx5IG1hdGNoIGFnYWluIHRoZSAwIGJ5dGUgYW5kIG9ubHkgZmluaXNoZXMKKyAqIHdoZW4gQGxlbiBpbnB1dCBpcyBjb25zdW1lZC4KKyAqCisgKiBSZXR1cm5zOiBmaW5hbCBzdGF0ZSByZWFjaGVkIGFmdGVyIGlucHV0IGlzIGNvbnN1bWVkCisgKi8KK3Vuc2lnbmVkIGludCBhYV9kZmFfbWF0Y2hfbGVuKHN0cnVjdCBhYV9kZmEgKmRmYSwgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJICAgICAgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCXUxNiAqZGVmID0gREVGQVVMVF9UQUJMRShkZmEpOworCXUzMiAqYmFzZSA9IEJBU0VfVEFCTEUoZGZhKTsKKwl1MTYgKm5leHQgPSBORVhUX1RBQkxFKGRmYSk7CisJdTE2ICpjaGVjayA9IENIRUNLX1RBQkxFKGRmYSk7CisJdW5zaWduZWQgaW50IHN0YXRlID0gc3RhcnQsIHBvczsKKworCWlmIChzdGF0ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGN1cnJlbnQgc3RhdGUgaXMgPHN0YXRlPiwgbWF0Y2hpbmcgY2hhcmFjdGVyICpzdHIgKi8KKwlpZiAoZGZhLT50YWJsZXNbWVlURF9JRF9FQ10pIHsKKwkJLyogRXF1aXZhbGVuY2UgY2xhc3MgdGFibGUgZGVmaW5lZCAqLworCQl1OCAqZXF1aXYgPSBFUVVJVl9UQUJMRShkZmEpOworCQkvKiBkZWZhdWx0IGlzIGRpcmVjdCB0byBuZXh0IHN0YXRlICovCisJCWZvciAoOyBsZW47IGxlbi0tKSB7CisJCQlwb3MgPSBiYXNlW3N0YXRlXSArIGVxdWl2Wyh1OCkgKnN0cisrXTsKKwkJCWlmIChjaGVja1twb3NdID09IHN0YXRlKQorCQkJCXN0YXRlID0gbmV4dFtwb3NdOworCQkJZWxzZQorCQkJCXN0YXRlID0gZGVmW3N0YXRlXTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGRlZmF1bHQgaXMgZGlyZWN0IHRvIG5leHQgc3RhdGUgKi8KKwkJZm9yICg7IGxlbjsgbGVuLS0pIHsKKwkJCXBvcyA9IGJhc2Vbc3RhdGVdICsgKHU4KSAqc3RyKys7CisJCQlpZiAoY2hlY2tbcG9zXSA9PSBzdGF0ZSkKKwkJCQlzdGF0ZSA9IG5leHRbcG9zXTsKKwkJCWVsc2UKKwkJCQlzdGF0ZSA9IGRlZltzdGF0ZV07CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdGU7Cit9CisKKy8qKgorICogYWFfZGZhX25leHRfc3RhdGUgLSB0cmF2ZXJzZSBAZGZhIHRvIGZpbmQgc3RhdGUgQHN0ciBzdG9wcyBhdAorICogQGRmYTogdGhlIGRmYSB0byBtYXRjaCBAc3RyIGFnYWluc3QgIChOT1QgTlVMTCkKKyAqIEBzdGFydDogdGhlIHN0YXRlIG9mIHRoZSBkZmEgdG8gc3RhcnQgbWF0Y2hpbmcgaW4KKyAqIEBzdHI6IHRoZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIG9mIGJ5dGVzIHRvIG1hdGNoIGFnYWluc3QgdGhlIGRmYSAoTk9UIE5VTEwpCisgKgorICogYWFfZGZhX25leHRfc3RhdGUgd2lsbCBtYXRjaCBAc3RyIGFnYWluc3QgdGhlIGRmYSBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBpdAorICogZmluaXNoZWQgbWF0Y2hpbmcgaW4uIFRoZSBmaW5hbCBzdGF0ZSBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBhY2NlcHRpbmcKKyAqIGxhYmVsLCBvciBhcyB0aGUgc3RhcnQgc3RhdGUgb2YgYSBjb250aW51aW5nIG1hdGNoLgorICoKKyAqIFJldHVybnM6IGZpbmFsIHN0YXRlIHJlYWNoZWQgYWZ0ZXIgaW5wdXQgaXMgY29uc3VtZWQKKyAqLwordW5zaWduZWQgaW50IGFhX2RmYV9tYXRjaChzdHJ1Y3QgYWFfZGZhICpkZmEsIHVuc2lnbmVkIGludCBzdGFydCwKKwkJCSAgY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiBhYV9kZmFfbWF0Y2hfbGVuKGRmYSwgc3RhcnQsIHN0ciwgc3RybGVuKHN0cikpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvcGF0aC5jIGIvc2VjdXJpdHkvYXBwYXJtb3IvcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YmFiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9wYXRoLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgZnVuY3Rpb24gZm9yIHBhdGhuYW1lcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvYXBwYXJtb3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BhdGguaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorCisKKy8qIG1vZGlmaWVkIGZyb20gZGNhY2hlLmMgKi8KK3N0YXRpYyBpbnQgcHJlcGVuZChjaGFyICoqYnVmZmVyLCBpbnQgYnVmbGVuLCBjb25zdCBjaGFyICpzdHIsIGludCBuYW1lbGVuKQoreworCWJ1ZmxlbiAtPSBuYW1lbGVuOworCWlmIChidWZsZW4gPCAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkqYnVmZmVyIC09IG5hbWVsZW47CisJbWVtY3B5KCpidWZmZXIsIHN0ciwgbmFtZWxlbik7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hST09UX05TQ09OTkVDVCAoUEFUSF9DSFJPT1RfUkVMIHwgUEFUSF9DSFJPT1RfTlNDT05ORUNUKQorCisvKioKKyAqIGRfbmFtZXNwYWNlX3BhdGggLSBsb29rdXAgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHBhdGgKKyAqIEBwYXRoOiBwYXRoIHRvIGxvb2t1cCAgKE5PVCBOVUxMKQorICogQGJ1ZjogIGJ1ZmZlciB0byBzdG9yZSBwYXRoIHRvICAoTk9UIE5VTEwpCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgQGJ1ZgorICogQG5hbWU6IFJldHVybnMgLSBwb2ludGVyIGZvciBzdGFydCBvZiBwYXRoIG5hbWUgd2l0aCBpbiBAYnVmIChOT1QgTlVMTCkKKyAqIEBmbGFnczogZmxhZ3MgY29udHJvbGxpbmcgcGF0aCBsb29rdXAKKyAqCisgKiBIYW5kbGUgcGF0aCBuYW1lIGxvb2t1cC4KKyAqCisgKiBSZXR1cm5zOiAlMCBlbHNlIGVycm9yIGNvZGUgaWYgcGF0aCBsb29rdXAgZmFpbHMKKyAqICAgICAgICAgIFdoZW4gbm8gZXJyb3IgdGhlIHBhdGggbmFtZSBpcyByZXR1cm5lZCBpbiBAbmFtZSB3aGljaCBwb2ludHMgdG8KKyAqICAgICAgICAgIHRvIGEgcG9zaXRpb24gaW4gQGJ1ZgorICovCitzdGF0aWMgaW50IGRfbmFtZXNwYWNlX3BhdGgoc3RydWN0IHBhdGggKnBhdGgsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwKKwkJCSAgICBjaGFyICoqbmFtZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBwYXRoIHJvb3QsIHRtcDsKKwljaGFyICpyZXM7CisJaW50IGRlbGV0ZWQsIGNvbm5lY3RlZDsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogR2V0IHRoZSByb290IHdlIHdhbnQgdG8gcmVzb2x2ZSB0b28gKi8KKwlpZiAoZmxhZ3MgJiBQQVRIX0NIUk9PVF9SRUwpIHsKKwkJLyogcmVzb2x2ZSBwYXRocyByZWxhdGl2ZSB0byBjaHJvb3QgKi8KKwkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCXJvb3QgPSBjdXJyZW50LT5mcy0+cm9vdDsKKwkJLyogcmVsZWFzZWQgYmVsb3cgKi8KKwkJcGF0aF9nZXQoJnJvb3QpOworCQlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCX0gZWxzZSB7CisJCS8qIHJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gbmFtZXNwYWNlICovCisJCXJvb3QubW50ID0gY3VycmVudC0+bnNwcm94eS0+bW50X25zLT5yb290OworCQlyb290LmRlbnRyeSA9IHJvb3QubW50LT5tbnRfcm9vdDsKKwkJLyogcmVsZWFzZWQgYmVsb3cgKi8KKwkJcGF0aF9nZXQoJnJvb3QpOworCX0KKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCS8qIFRoZXJlIGlzIGEgcmFjZSB3aW5kb3cgYmV0d2VlbiBwYXRoIGxvb2t1cCBoZXJlIGFuZCB0aGUKKwkgKiBuZWVkIHRvIHN0cmlwIHRoZSAiIChkZWxldGVkKSBzdHJpbmcgdGhhdCBfX2RfcGF0aCBhcHBsaWVzCisJICogRGV0ZWN0IHRoZSByYWNlIGFuZCByZWxvb2t1cCB0aGUgcGF0aAorCSAqCisJICogVGhlIHN0cmlwcGluZyBvZiAoZGVsZXRlZCkgaXMgYSBoYWNrIHRoYXQgY291bGQgYmUgcmVtb3ZlZAorCSAqIHdpdGggYW4gdXBkYXRlZCBfX2RfcGF0aAorCSAqLworCWRvIHsKKwkJdG1wID0gcm9vdDsKKwkJZGVsZXRlZCA9IGRfdW5saW5rZWQocGF0aC0+ZGVudHJ5KTsKKwkJcmVzID0gX19kX3BhdGgocGF0aCwgJnRtcCwgYnVmLCBidWZsZW4pOworCisJfSB3aGlsZSAoZGVsZXRlZCAhPSBkX3VubGlua2VkKHBhdGgtPmRlbnRyeSkpOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkqbmFtZSA9IHJlczsKKwkvKiBoYW5kbGUgZXJyb3IgY29uZGl0aW9ucyAtIGFuZCBzdGlsbCBhbGxvdyBhIHBhcnRpYWwgcGF0aCB0bworCSAqIGJlIHJldHVybmVkLgorCSAqLworCWlmIChJU19FUlIocmVzKSkgeworCQllcnJvciA9IFBUUl9FUlIocmVzKTsKKwkJKm5hbWUgPSBidWY7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZGVsZXRlZCkgeworCQkvKiBPbiBzb21lIGZpbGVzeXN0ZW1zLCBuZXdseSBhbGxvY2F0ZWQgZGVudHJpZXMgYXBwZWFyIHRvIHRoZQorCQkgKiBzZWN1cml0eV9wYXRoIGhvb2tzIGFzIGEgZGVsZXRlZCBkZW50cnkgZXhjZXB0IHdpdGhvdXQgYW4KKwkJICogaW5vZGUgYWxsb2NhdGVkLgorCQkgKgorCQkgKiBSZW1vdmUgdGhlIGFwcGVuZGVkIGRlbGV0ZWQgdGV4dCBhbmQgcmV0dXJuIGFzIHN0cmluZyBmb3IKKwkJICogbm9ybWFsIG1lZGlhdGlvbiwgb3IgYXVkaXRpbmcuICBUaGUgKGRlbGV0ZWQpIHN0cmluZyBpcworCQkgKiBndWFyYW50ZWVkIHRvIGJlIGFkZGVkIGluIHRoaXMgY2FzZSwgc28ganVzdCBzdHJpcCBpdC4KKwkJICovCisJCWJ1ZltidWZsZW4gLSAxMV0gPSAwOwkvKiAtIChsZW4oIiAoZGVsZXRlZCkiKSArXDApICovCisKKwkJaWYgKHBhdGgtPmRlbnRyeS0+ZF9pbm9kZSAmJiAhKGZsYWdzICYgUEFUSF9NRURJQVRFX0RFTEVURUQpKSB7CisJCQllcnJvciA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIERldGVybWluZSBpZiB0aGUgcGF0aCBpcyBjb25uZWN0ZWQgdG8gdGhlIGV4cGVjdGVkIHJvb3QgKi8KKwljb25uZWN0ZWQgPSB0bXAuZGVudHJ5ID09IHJvb3QuZGVudHJ5ICYmIHRtcC5tbnQgPT0gcm9vdC5tbnQ7CisKKwkvKiBJZiB0aGUgcGF0aCBpcyBub3QgY29ubmVjdGVkLAorCSAqIGNoZWNrIGlmIGl0IGlzIGEgc3lzY3RsIGFuZCBoYW5kbGUgc3BlY2lhbGx5IGVsc2UgcmVtb3ZlIGFueQorCSAqIGxlYWRpbmcgLyB0aGF0IF9fZF9wYXRoIG1heSBoYXZlIHJldHVybmVkLgorCSAqIFVubGVzcworCSAqICAgICBzcGVjaWZpY2FsbHkgZGlyZWN0ZWQgdG8gY29ubmVjdCB0aGUgcGF0aCwKKwkgKiBPUgorCSAqICAgICBpZiBpbiBhIGNocm9vdCBhbmQgZG9pbmcgY2hyb290IHJlbGF0aXZlIHBhdGhzIGFuZCB0aGUgcGF0aAorCSAqICAgICByZXNvbHZlcyB0byB0aGUgbmFtZXNwYWNlIHJvb3QgKHdvdWxkIGJlIGNvbm5lY3RlZCBvdXRzaWRlCisJICogICAgIG9mIGNocm9vdCkgYW5kIHNwZWNpZmljYWxseSBkaXJlY3RlZCB0byBjb25uZWN0IHBhdGhzIHRvCisJICogICAgIG5hbWVzcGFjZSByb290LgorCSAqLworCWlmICghY29ubmVjdGVkKSB7CisJCS8qIGlzIHRoZSBkaXNjb25uZWN0IHBhdGggYSBzeXNjdGw/ICovCisJCWlmICh0bXAuZGVudHJ5LT5kX3NiLT5zX21hZ2ljID09IFBST0NfU1VQRVJfTUFHSUMgJiYKKwkJICAgIHN0cm5jbXAoKm5hbWUsICIvc3lzLyIsIDUpID09IDApIHsKKwkJCS8qIFRPRE86IGNvbnZlcnQgb3ZlciB0byB1c2luZyBhIHBlciBuYW1lc3BhY2UKKwkJCSAqIGNvbnRyb2wgaW5zdGVhZCBvZiBoYXJkIGNvZGVkIC9wcm9jCisJCQkgKi8KKwkJCWVycm9yID0gcHJlcGVuZChuYW1lLCAqbmFtZSAtIGJ1ZiwgIi9wcm9jIiwgNSk7CisJCX0gZWxzZSBpZiAoIShmbGFncyAmIFBBVEhfQ09OTkVDVF9QQVRIKSAmJgorCQkJICAgISgoKGZsYWdzICYgQ0hST09UX05TQ09OTkVDVCkgPT0gQ0hST09UX05TQ09OTkVDVCkgJiYKKwkJCSAgICAgKHRtcC5tbnQgPT0gY3VycmVudC0+bnNwcm94eS0+bW50X25zLT5yb290ICYmCisJCQkgICAgICB0bXAuZGVudHJ5ID09IHRtcC5tbnQtPm1udF9yb290KSkpIHsKKwkJCS8qIGRpc2Nvbm5lY3RlZCBwYXRoLCBkb24ndCByZXR1cm4gcGF0aG5hbWUgc3RhcnRpbmcKKwkJCSAqIHdpdGggJy8nCisJCQkgKi8KKwkJCWVycm9yID0gLUVTVEFMRTsKKwkJCWlmICgqcmVzID09ICcvJykKKwkJCQkqbmFtZSA9IHJlcyArIDE7CisJCX0KKwl9CisKK291dDoKKwlwYXRoX3B1dCgmcm9vdCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZ2V0X25hbWVfdG9fYnVmZmVyIC0gZ2V0IHRoZSBwYXRobmFtZSB0byBhIGJ1ZmZlciBlbnN1cmUgZGlyIC8gaXMgYXBwZW5kZWQKKyAqIEBwYXRoOiBwYXRoIHRvIGdldCBuYW1lIGZvciAgKE5PVCBOVUxMKQorICogQGZsYWdzOiBmbGFncyBjb250cm9sbGluZyBwYXRoIGxvb2t1cAorICogQGJ1ZmZlcjogYnVmZmVyIHRvIHB1dCBuYW1lIGluICAoTk9UIE5VTEwpCisgKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIKKyAqIEBuYW1lOiBSZXR1cm5zIC0gY29udGFpbnMgcG9zaXRpb24gb2YgcGF0aCBuYW1lIGluIEBidWZmZXIgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6ICUwIGVsc2UgZXJyb3Igb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGdldF9uYW1lX3RvX2J1ZmZlcihzdHJ1Y3QgcGF0aCAqcGF0aCwgaW50IGZsYWdzLCBjaGFyICpidWZmZXIsCisJCQkgICAgICBpbnQgc2l6ZSwgY2hhciAqKm5hbWUpCit7CisJaW50IGFkanVzdCA9IChmbGFncyAmIFBBVEhfSVNfRElSKSA/IDEgOiAwOworCWludCBlcnJvciA9IGRfbmFtZXNwYWNlX3BhdGgocGF0aCwgYnVmZmVyLCBzaXplIC0gYWRqdXN0LCBuYW1lLCBmbGFncyk7CisKKwlpZiAoIWVycm9yICYmIChmbGFncyAmIFBBVEhfSVNfRElSKSAmJiAoKm5hbWUpWzFdICE9ICdcMCcpCisJCS8qCisJCSAqIEFwcGVuZCAiLyIgdG8gdGhlIHBhdGhuYW1lLiAgVGhlIHJvb3QgZGlyZWN0b3J5IGlzIGEgc3BlY2lhbAorCQkgKiBjYXNlOyBpdCBhbHJlYWR5IGVuZHMgaW4gc2xhc2guCisJCSAqLworCQlzdHJjcHkoJmJ1ZmZlcltzaXplIC0gMl0sICIvIik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYWFfZ2V0X25hbWUgLSBjb21wdXRlIHRoZSBwYXRobmFtZSBvZiBhIGZpbGUKKyAqIEBwYXRoOiBwYXRoIHRoZSBmaWxlICAoTk9UIE5VTEwpCisgKiBAZmxhZ3M6IGZsYWdzIGNvbnRyb2xsaW5nIHBhdGggbmFtZSBnZW5lcmF0aW9uCisgKiBAYnVmZmVyOiBidWZmZXIgdGhhdCBhYV9nZXRfbmFtZSgpIGFsbG9jYXRlZCAgKE5PVCBOVUxMKQorICogQG5hbWU6IFJldHVybnMgLSB0aGUgZ2VuZXJhdGVkIHBhdGggbmFtZSBpZiAhZXJyb3IgKE5PVCBOVUxMKQorICoKKyAqIEBuYW1lIGlzIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZSAod2hpY2ggdXN1YWxseSBkaWZmZXJzCisgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciksIG9yIE5VTEwuICBJZiB0aGVyZSBpcyBhbiBlcnJvciBAbmFtZQorICogbWF5IGNvbnRhaW4gYSBwYXJ0aWFsIG9yIGludmFsaWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBhdWRpdCBwdXJwb3NlcywKKyAqIGJ1dCBpdCBjYW4gbm90IGJlIHVzZWQgZm9yIG1lZGlhdGlvbi4KKyAqCisgKiBXZSBuZWVkIFBBVEhfSVNfRElSIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBkaXJlY3Rvcnkgb3Igbm90CisgKiBiZWNhdXNlIHRoZSBmaWxlIG1heSBub3QgeWV0IGV4aXN0LCBhbmQgc28gd2UgY2Fubm90IGNoZWNrIHRoZSBpbm9kZSdzCisgKiBmaWxlIHR5cGUuCisgKgorICogUmV0dXJuczogJTAgZWxzZSBlcnJvciBjb2RlIGlmIGNvdWxkIHJldHJpZXZlIG5hbWUKKyAqLworaW50IGFhX2dldF9uYW1lKHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgZmxhZ3MsIGNoYXIgKipidWZmZXIsIGNvbnN0IGNoYXIgKipuYW1lKQoreworCWNoYXIgKmJ1ZiwgKnN0ciA9IE5VTEw7CisJaW50IHNpemUgPSAyNTY7CisJaW50IGVycm9yOworCisJKm5hbWUgPSBOVUxMOworCSpidWZmZXIgPSBOVUxMOworCWZvciAoOzspIHsKKwkJLyogZnJlZWQgYnkgY2FsbGVyICovCisJCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZXJyb3IgPSBnZXRfbmFtZV90b19idWZmZXIocGF0aCwgZmxhZ3MsIGJ1Ziwgc2l6ZSwgJnN0cik7CisJCWlmIChlcnJvciAhPSAtRU5BTUVUT09MT05HKQorCQkJYnJlYWs7CisKKwkJa2ZyZWUoYnVmKTsKKwkJc2l6ZSA8PD0gMTsKKwkJaWYgKHNpemUgPiBhYV9nX3BhdGhfbWF4KQorCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJfQorCSpidWZmZXIgPSBidWY7CisJKm5hbWUgPSBzdHI7CisKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9wb2xpY3kuYyBiL3NlY3VyaXR5L2FwcGFybW9yL3BvbGljeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZGMxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9wb2xpY3kuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qCisgKiBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgQXBwQXJtb3IgcG9saWN5IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqCisgKgorICogQXBwQXJtb3IgcG9saWN5IGlzIGJhc2VkIGFyb3VuZCBwcm9maWxlcywgd2hpY2ggY29udGFpbiB0aGUgcnVsZXMgYQorICogdGFzayBpcyBjb25maW5lZCBieS4gIEV2ZXJ5IHRhc2sgaW4gdGhlIHN5c3RlbSBoYXMgYSBwcm9maWxlIGF0dGFjaGVkCisgKiB0byBpdCBkZXRlcm1pbmVkIGVpdGhlciBieSBtYXRjaGluZyAidW5jb25maW5lZCIgdGFza3MgYWdhaW5zdCB0aGUKKyAqIHZpc2libGUgc2V0IG9mIHByb2ZpbGVzIG9yIGJ5IGZvbGxvd2luZyBhIHByb2ZpbGVzIGF0dGFjaG1lbnQgcnVsZXMuCisgKgorICogRWFjaCBwcm9maWxlIGV4aXN0cyBpbiBhIHByb2ZpbGUgbmFtZXNwYWNlIHdoaWNoIGlzIGEgY29udGFpbmVyIG9mCisgKiB2aXNpYmxlIHByb2ZpbGVzLiAgRWFjaCBuYW1lc3BhY2UgY29udGFpbnMgYSBzcGVjaWFsICJ1bmNvbmZpbmVkIiBwcm9maWxlLAorICogd2hpY2ggZG9lc24ndCBlbmZvcmNlIGFueSBjb25maW5lbWVudCBvbiBhIHRhc2sgYmV5b25kIERBQy4KKyAqCisgKiBOYW1lc3BhY2UgYW5kIHByb2ZpbGUgbmFtZXMgY2FuIGJlIHdyaXR0ZW4gdG9nZXRoZXIgaW4gZWl0aGVyCisgKiBvZiB0d28gc3ludGF4ZXMuCisgKgk6bmFtZXNwYWNlOnByb2ZpbGUgLSB1c2VkIGJ5IGtlcm5lbCBpbnRlcmZhY2VzIGZvciBlYXN5IGRldGVjdGlvbgorICoJbmFtZXNwYWNlOi8vcHJvZmlsZSAtIHVzZWQgYnkgcG9saWN5CisgKgorICogUHJvZmlsZSBuYW1lcyBjYW4gbm90IHN0YXJ0IHdpdGggOiBvciBAIG9yIF4gYW5kIG1heSBub3QgY29udGFpbiBcMAorICoKKyAqIFJlc2VydmVkIHByb2ZpbGUgbmFtZXMKKyAqCXVuY29uZmluZWQgLSBzcGVjaWFsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHVuY29uZmluZWQgcHJvZmlsZQorICoJaW5oZXJpdCAtIHNwZWNpYWwgbmFtZSB0byBpbmRpY2F0ZSBwcm9maWxlIGluaGVyaXRhbmNlCisgKgludWxsLVhYWFgtWVlZWSAtIHNwZWNpYWwgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbGVhcm5pbmcgcHJvZmlsZXMKKyAqCisgKiBOYW1lc3BhY2UgbmFtZXMgbWF5IG5vdCBzdGFydCB3aXRoIC8gb3IgQCBhbmQgbWF5IG5vdCBjb250YWluIFwwIG9yIDoKKyAqIFJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcworICoJdXNlci1YWFhYIC0gdXNlciBkZWZpbmVkIHByb2ZpbGVzCisgKgorICogYSAvLyBpbiBhIHByb2ZpbGUgb3IgbmFtZXNwYWNlIG5hbWUgaW5kaWNhdGVzIGEgaGllcmFyY2hpY2FsIG5hbWUgd2l0aCB0aGUKKyAqIG5hbWUgYmVmb3JlIHRoZSAvLyBiZWluZyB0aGUgcGFyZW50IGFuZCB0aGUgbmFtZSBhZnRlciB0aGUgY2hpbGQuCisgKgorICogUHJvZmlsZSBhbmQgbmFtZXNwYWNlIGhpZXJhcmNoaWVzIHNlcnZlIHR3byBkaWZmZXJlbnQgYnV0IHNpbWlsYXIgcHVycG9zZXMuCisgKiBUaGUgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzZXQgb2YgdmlzaWJsZSBwcm9maWxlcyB0aGF0IGFyZSBjb25zaWRlcmVkCisgKiBmb3IgYXR0YWNobWVudC4gIFRoZSBoaWVyYXJjaHkgb2YgbmFtZXNwYWNlcyBhbGxvd3MgZm9yIHZpcnR1YWxpemluZworICogdGhlIG5hbWVzcGFjZSBzbyB0aGF0IGZvciBleGFtcGxlIGEgY2hyb290IGNhbiBoYXZlIGl0cyBvd24gc2V0IG9mIHByb2ZpbGVzCisgKiB3aGljaCBtYXkgZGVmaW5lIHNvbWUgbG9jYWwgdXNlciBuYW1lc3BhY2VzLgorICogVGhlIHByb2ZpbGUgaGllcmFyY2h5IHNldmVycyB0d28gZGlzdGluY3QgcHVycG9zZXMsCisgKiAtICBpdCBhbGxvd3MgZm9yIHN1YiBwcm9maWxlcyBvciBoYXRzLCB3aGljaCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcnVuCisgKiAgICBzdWJwcm9ncmFtcyB1bmRlciBpdHMgb3duIHByb2ZpbGUgd2l0aCBkaWZmZXJlbnQgcmVzdHJpY3Rpb24gdGhhbiBpdAorICogICAgc2VsZiwgYW5kIG5vdCBoYXZlIGl0IHVzZSB0aGUgc3lzdGVtIHByb2ZpbGUuCisgKiAgICBlZy4gaWYgYSBtYWlsIHByb2dyYW0gc3RhcnRzIGFuIGVkaXRvciwgdGhlIHBvbGljeSBtaWdodCBtYWtlIHRoZQorICogICAgICAgIHJlc3RyaWN0aW9ucyB0aWdodGVyIG9uIHRoZSBlZGl0b3IgdGlnaHRlciB0aGFuIHRoZSBtYWlsIHByb2dyYW0sCisgKiAgICAgICAgYW5kIGRlZmluaXRlbHkgZGlmZmVyZW50IHRoYW4gZ2VuZXJhbCBlZGl0b3IgcmVzdHJpY3Rpb25zCisgKiAtIGl0IGFsbG93cyBmb3IgYmluYXJ5IGhpZXJhcmNoeSBvZiBwcm9maWxlcywgc28gdGhhdCBleGVjdXRpb24gaGlzdG9yeQorICogICBpcyBwcmVzZXJ2ZWQuICBUaGlzIGZlYXR1cmUgaXNuJ3QgZXhwbG9pdGVkIGJ5IEFwcEFybW9yIHJlZmVyZW5jZSBwb2xpY3kKKyAqICAgYnV0IGlzIGFsbG93ZWQuICBOT1RFOiB0aGlzIGlzIGN1cnJlbnRseSBzdWJvcHRpbWFsIGJlY2F1c2UgcHJvZmlsZQorICogICBhbGlhc2luZyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkIHNvIHRoYXQgYSBwcm9maWxlIGZvciBlYWNoCisgKiAgIGxldmVsIG11c3QgYmUgZGVmaW5lZC4KKyAqICAgZWcuIC9iaW4vYmFzaC8vL2Jpbi9scyBhcyBhIG5hbWUgd291bGQgaW5kaWNhdGUgL2Jpbi9scyB3YXMgc3RhcnRlZAorICogICAgICAgZnJvbSAvYmluL2Jhc2gKKyAqCisgKiAgIEEgcHJvZmlsZSBvciBuYW1lc3BhY2UgbmFtZSB0aGF0IGNhbiBjb250YWluIG9uZSBvciBtb3JlIC8vIHNlcGFyYXRvcnMKKyAqICAgaXMgcmVmZXJyZWQgdG8gYXMgYW4gaG5hbWUgKGhpZXJhcmNoaWNhbCkuCisgKiAgIGVnLiAgL2Jpbi9iYXNoLy9iaW4vbHMKKyAqCisgKiAgIEFuIGZxbmFtZSBpcyBhIG5hbWUgdGhhdCBtYXkgY29udGFpbiBib3RoIG5hbWVzcGFjZSBhbmQgcHJvZmlsZSBobmFtZXMuCisgKiAgIGVnLiA6bnM6L2Jpbi9iYXNoLy9iaW4vbHMKKyAqCisgKiBOT1RFUzoKKyAqICAgLSBsb2NraW5nIG9mIHByb2ZpbGUgbGlzdHMgaXMgY3VycmVudGx5IGZhaXJseSBjb2Fyc2UuICBBbGwgcHJvZmlsZQorICogICAgIGxpc3RzIHdpdGhpbiBhIG5hbWVzcGFjZSB1c2UgdGhlIG5hbWVzcGFjZSBsb2NrLgorICogRklYTUU6IG1vdmUgcHJvZmlsZSBsaXN0cyB0byB1c2luZyByY3VfbGlzdHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL2FwcGFybW9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jYXBhYmlsaXR5LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9jb250ZXh0LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9maWxlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9pcGMuaCIKKyNpbmNsdWRlICJpbmNsdWRlL21hdGNoLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9wYXRoLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9wb2xpY3kuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeV91bnBhY2suaCIKKyNpbmNsdWRlICJpbmNsdWRlL3Jlc291cmNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9zaWQuaCIKKworCisvKiByb290IHByb2ZpbGUgbmFtZXNwYWNlICovCitzdHJ1Y3QgYWFfbmFtZXNwYWNlICpyb290X25zOworCitjb25zdCBjaGFyICpwcm9maWxlX21vZGVfbmFtZXNbXSA9IHsKKwkiZW5mb3JjZSIsCisJImNvbXBsYWluIiwKKwkia2lsbCIsCit9OworCisvKioKKyAqIGhuYW1lX3RhaWwgLSBmaW5kIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBhbiBobmFtZQorICogQG5hbWU6IGhuYW1lIHRvIGZpbmQgdGhlIGJhc2UgcHJvZmlsZSBuYW1lIGNvbXBvbmVudCBvZiAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IHRoZSB0YWlsIChiYXNlIHByb2ZpbGUgbmFtZSkgbmFtZSBjb21wb25lbnQgb2YgYW4gaG5hbWUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmhuYW1lX3RhaWwoY29uc3QgY2hhciAqaG5hbWUpCit7CisJY2hhciAqc3BsaXQ7CisJaG5hbWUgPSBzdHJpbSgoY2hhciAqKWhuYW1lKTsKKwlmb3IgKHNwbGl0ID0gc3Ryc3RyKGhuYW1lLCAiLy8iKTsgc3BsaXQ7IHNwbGl0ID0gc3Ryc3RyKGhuYW1lLCAiLy8iKSkKKwkJaG5hbWUgPSBzcGxpdCArIDI7CisKKwlyZXR1cm4gaG5hbWU7Cit9CisKKy8qKgorICogcG9saWN5X2luaXQgLSBpbml0aWFsaXplIGEgcG9saWN5IHN0cnVjdHVyZQorICogQHBvbGljeTogcG9saWN5IHRvIGluaXRpYWxpemUgIChOT1QgTlVMTCkKKyAqIEBwcmVmaXg6IHByZWZpeCBuYW1lIGlmIGFueSBpcyByZXF1aXJlZC4gIChNQVlCRSBOVUxMKQorICogQG5hbWU6IG5hbWUgb2YgdGhlIHBvbGljeSwgaW5pdCB3aWxsIG1ha2UgYSBjb3B5IG9mIGl0ICAoTk9UIE5VTEwpCisgKgorICogTm90ZTogdGhpcyBmbiBjcmVhdGVzIGEgY29weSBvZiBzdHJpbmdzIHBhc3NlZCBpbgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgcG9saWN5IGluaXQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgYm9vbCBwb2xpY3lfaW5pdChzdHJ1Y3QgYWFfcG9saWN5ICpwb2xpY3ksIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogZnJlZWQgYnkgcG9saWN5X2ZyZWUgKi8KKwlpZiAocHJlZml4KSB7CisJCXBvbGljeS0+aG5hbWUgPSBrbWFsbG9jKHN0cmxlbihwcmVmaXgpICsgc3RybGVuKG5hbWUpICsgMywKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChwb2xpY3ktPmhuYW1lKQorCQkJc3ByaW50Zihwb2xpY3ktPmhuYW1lLCAiJXMvLyVzIiwgcHJlZml4LCBuYW1lKTsKKwl9IGVsc2UKKwkJcG9saWN5LT5obmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb2xpY3ktPmhuYW1lKQorCQlyZXR1cm4gMDsKKwkvKiBiYXNlLm5hbWUgaXMgYSBzdWJzdHJpbmcgb2YgZnFuYW1lICovCisJcG9saWN5LT5uYW1lID0gKGNoYXIgKilobmFtZV90YWlsKHBvbGljeS0+aG5hbWUpOworCUlOSVRfTElTVF9IRUFEKCZwb2xpY3ktPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwb2xpY3ktPnByb2ZpbGVzKTsKKwlrcmVmX2luaXQoJnBvbGljeS0+Y291bnQpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogcG9saWN5X2Rlc3Ryb3kgLSBmcmVlIHRoZSBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IEBwb2xpY3kKKyAqIEBwb2xpY3k6IHBvbGljeSB0aGF0IGlzIHRvIGhhdmUgaXRzIGVsZW1lbnRzIGZyZWVkICAoTk9UIE5VTEwpCisgKi8KK3N0YXRpYyB2b2lkIHBvbGljeV9kZXN0cm95KHN0cnVjdCBhYV9wb2xpY3kgKnBvbGljeSkKK3sKKwkvKiBzdGlsbCBjb250YWlucyBwcm9maWxlcyAtLSBpbnZhbGlkICovCisJaWYgKCFsaXN0X2VtcHR5KCZwb2xpY3ktPnByb2ZpbGVzKSkgeworCQlBQV9FUlJPUigiJXM6IGludGVybmFsIGVycm9yLCAiCisJCQkgInBvbGljeSAnJXMnIHN0aWxsIGNvbnRhaW5zIHByb2ZpbGVzXG4iLAorCQkJIF9fZnVuY19fLCBwb2xpY3ktPm5hbWUpOworCQlCVUcoKTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZwb2xpY3ktPmxpc3QpKSB7CisJCUFBX0VSUk9SKCIlczogaW50ZXJuYWwgZXJyb3IsIHBvbGljeSAnJXMnIHN0aWxsIG9uIGxpc3RcbiIsCisJCQkgX19mdW5jX18sIHBvbGljeS0+bmFtZSk7CisJCUJVRygpOworCX0KKworCS8qIGRvbid0IGZyZWUgbmFtZSBhcyBpdHMgYSBzdWJzZXQgb2YgaG5hbWUgKi8KKwlremZyZWUocG9saWN5LT5obmFtZSk7Cit9CisKKy8qKgorICogX19wb2xpY3lfZmluZCAtIGZpbmQgYSBwb2xpY3kgYnkgQG5hbWUgb24gYSBwb2xpY3kgbGlzdAorICogQGhlYWQ6IGxpc3QgdG8gc2VhcmNoICAoTk9UIE5VTEwpCisgKiBAbmFtZTogbmFtZSB0byBzZWFyY2ggZm9yICAoTk9UIE5VTEwpCisgKgorICogUmVxdWlyZXM6IGNvcnJlY3QgbG9ja3MgZm9yIHRoZSBAaGVhZCBsaXN0IGJlIGhlbGQKKyAqCisgKiBSZXR1cm5zOiB1bnJlZmNvdW50ZWQgcG9saWN5IHRoYXQgbWF0Y2ggQG5hbWUgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIHN0cnVjdCBhYV9wb2xpY3kgKl9fcG9saWN5X2ZpbmQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYWFfcG9saWN5ICpwb2xpY3k7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbGljeSwgaGVhZCwgbGlzdCkgeworCQlpZiAoIXN0cmNtcChwb2xpY3ktPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIHBvbGljeTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogX19wb2xpY3lfc3Rybl9maW5kIC0gZmluZCBhIHBvbGljeSB0aGF0J3MgbmFtZSBtYXRjaGVzIEBsZW4gY2hhcnMgb2YgQHN0cgorICogQGhlYWQ6IGxpc3QgdG8gc2VhcmNoICAoTk9UIE5VTEwpCisgKiBAc3RyOiBzdHJpbmcgdG8gc2VhcmNoIGZvciAgKE5PVCBOVUxMKQorICogQGxlbjogbGVuZ3RoIG9mIG1hdGNoIHJlcXVpcmVkCisgKgorICogUmVxdWlyZXM6IGNvcnJlY3QgbG9ja3MgZm9yIHRoZSBAaGVhZCBsaXN0IGJlIGhlbGQKKyAqCisgKiBSZXR1cm5zOiB1bnJlZmNvdW50ZWQgcG9saWN5IHRoYXQgbWF0Y2ggQHN0ciBvciBOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIGlmIEBsZW4gPT0gc3RybGVuKEBzdHJsZW4pIHRoZW4gdGhpcyBpcyBlcXVpdiB0byBfX3BvbGljeV9maW5kCisgKiBvdGhlciB3aXNlIGl0IGFsbG93cyBzZWFyY2hpbmcgZm9yIHBvbGljeSBieSBhIHBhcnRpYWwgbWF0Y2ggb2YgbmFtZQorICovCitzdGF0aWMgc3RydWN0IGFhX3BvbGljeSAqX19wb2xpY3lfc3Rybl9maW5kKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCSAgICBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJc3RydWN0IGFhX3BvbGljeSAqcG9saWN5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb2xpY3ksIGhlYWQsIGxpc3QpIHsKKwkJaWYgKGFhX3N0cm5lcShwb2xpY3ktPm5hbWUsIHN0ciwgbGVuKSkKKwkJCXJldHVybiBwb2xpY3k7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSb3V0aW5lcyBmb3IgQXBwQXJtb3IgbmFtZXNwYWNlcworICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpoaWRkZW5fbnNfbmFtZSA9ICItLS0iOworLyoqCisgKiBhYV9uc192aXNpYmxlIC0gdGVzdCBpZiBAdmlldyBpcyB2aXNpYmxlIGZyb20gQGN1cnIKKyAqIEBjdXJyOiBuYW1lc3BhY2UgdG8gdHJlYXQgYXMgdGhlIHBhcmVudCAoTk9UIE5VTEwpCisgKiBAdmlldzogIG5hbWVzcGFjZSB0byB0ZXN0IGlmIHZpc2libGUgZnJvbSBAY3VyciAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiBAdmlldyBpcyB2aXNpYmxlIGZyb20gQGN1cnIgZWxzZSBmYWxzZQorICovCitib29sIGFhX25zX3Zpc2libGUoc3RydWN0IGFhX25hbWVzcGFjZSAqY3Vyciwgc3RydWN0IGFhX25hbWVzcGFjZSAqdmlldykKK3sKKwlpZiAoY3VyciA9PSB2aWV3KQorCQlyZXR1cm4gdHJ1ZTsKKworCWZvciAoIDsgdmlldzsgdmlldyA9IHZpZXctPnBhcmVudCkgeworCQlpZiAodmlldy0+cGFyZW50ID09IGN1cnIpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGFhX25hX25hbWUgLSBGaW5kIHRoZSBucyBuYW1lIHRvIGRpc3BsYXkgZm9yIEB2aWV3IGZyb20gQGN1cnIKKyAqIEBjdXJyIC0gY3VycmVudCBuYW1lc3BhY2UgKE5PVCBOVUxMKQorICogQHZpZXcgLSBuYW1lc3BhY2UgYXR0ZW1wdGluZyB0byB2aWV3IChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiBuYW1lIG9mIEB2aWV3IHZpc2libGUgZnJvbSBAY3VycgorICovCitjb25zdCBjaGFyICphYV9uc19uYW1lKHN0cnVjdCBhYV9uYW1lc3BhY2UgKmN1cnIsIHN0cnVjdCBhYV9uYW1lc3BhY2UgKnZpZXcpCit7CisJLyogaWYgdmlldyA9PSBjdXJyIHRoZW4gdGhlIG5hbWVzcGFjZSBuYW1lIGlzbid0IGRpc3BsYXllZCAqLworCWlmIChjdXJyID09IHZpZXcpCisJCXJldHVybiAiIjsKKworCWlmIChhYV9uc192aXNpYmxlKGN1cnIsIHZpZXcpKSB7CisJCS8qIGF0IHRoaXMgcG9pbnQgaWYgYSBucyBpcyB2aXNpYmxlIGl0IGlzIGluIGEgdmlldyBucworCQkgKiB0aHVzIHRoZSBjdXJyIG5zLmhuYW1lIGlzIGEgcHJlZml4IG9mIGl0cyBuYW1lLgorCQkgKiBPbmx5IG91dHB1dCB0aGUgdmlydHVhbGl6ZWQgcG9ydGlvbiBvZiB0aGUgbmFtZQorCQkgKiBBZGQgKyAyIHRvIHNraXAgb3ZlciAvLyBzZXBhcmF0aW5nIGN1cnIgaG5hbWUgcHJlZml4CisJCSAqIGZyb20gdGhlIHZpc2libGUgdGFpbCBvZiB0aGUgdmlld3MgaG5hbWUKKwkJICovCisJCXJldHVybiB2aWV3LT5iYXNlLmhuYW1lICsgc3RybGVuKGN1cnItPmJhc2UuaG5hbWUpICsgMjsKKwl9IGVsc2UKKwkJcmV0dXJuIGhpZGRlbl9uc19uYW1lOworfQorCisvKioKKyAqIGFsbG9jX25hbWVzcGFjZSAtIGFsbG9jYXRlLCBpbml0aWFsaXplIGFuZCByZXR1cm4gYSBuZXcgbmFtZXNwYWNlCisgKiBAcHJlZml4OiBwYXJlbnQgbmFtZXNwYWNlIG5hbWUgKE1BWUJFIE5VTEwpCisgKiBAbmFtZTogYSBwcmVhbGxvY2F0ZWQgbmFtZSAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IHJlZmNvdW50ZWQgbmFtZXNwYWNlIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBhYV9uYW1lc3BhY2UgKmFsbG9jX25hbWVzcGFjZShjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zOworCisJbnMgPSBremFsbG9jKHNpemVvZigqbnMpLCBHRlBfS0VSTkVMKTsKKwlBQV9ERUJVRygiJXMoJXApXG4iLCBfX2Z1bmNfXywgbnMpOworCWlmICghbnMpCisJCXJldHVybiBOVUxMOworCWlmICghcG9saWN5X2luaXQoJm5zLT5iYXNlLCBwcmVmaXgsIG5hbWUpKQorCQlnb3RvIGZhaWxfbnM7CisKKwlJTklUX0xJU1RfSEVBRCgmbnMtPnN1Yl9ucyk7CisJcndsb2NrX2luaXQoJm5zLT5sb2NrKTsKKworCS8qIHJlbGVhc2VkIGJ5IGZyZWVfbmFtZXNwYWNlICovCisJbnMtPnVuY29uZmluZWQgPSBhYV9hbGxvY19wcm9maWxlKCJ1bmNvbmZpbmVkIik7CisJaWYgKCFucy0+dW5jb25maW5lZCkKKwkJZ290byBmYWlsX3VuY29uZmluZWQ7CisKKwlucy0+dW5jb25maW5lZC0+c2lkID0gYWFfYWxsb2Nfc2lkKCk7CisJbnMtPnVuY29uZmluZWQtPmZsYWdzID0gUEZMQUdfVU5DT05GSU5FRCB8IFBGTEFHX0lYX09OX05BTUVfRVJST1IgfAorCSAgICBQRkxBR19JTU1VVEFCTEU7CisKKwkvKgorCSAqIHJlbGVhc2VkIGJ5IGZyZWVfbmFtZXNwYWNlLCBob3dldmVyIF9fcmVtb3ZlX25hbWVzcGFjZSBicmVha3MKKwkgKiB0aGUgY3ljbGljIHJlZmVyZW5jZXMgKG5zLT51bmNvbmZpbmVkLCBhbmQgdW5jb25maW5lZC0+bnMpIGFuZAorCSAqIHJlcGxhY2VzIHdpdGggcmVmcyB0byBwYXJlbnQgbmFtZXNwYWNlIHVuY29uZmluZWQKKwkgKi8KKwlucy0+dW5jb25maW5lZC0+bnMgPSBhYV9nZXRfbmFtZXNwYWNlKG5zKTsKKworCXJldHVybiBuczsKKworZmFpbF91bmNvbmZpbmVkOgorCWt6ZnJlZShucy0+YmFzZS5uYW1lKTsKK2ZhaWxfbnM6CisJa3pmcmVlKG5zKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBmcmVlX25hbWVzcGFjZSAtIGZyZWUgYSBwcm9maWxlIG5hbWVzcGFjZQorICogQG5zOiB0aGUgbmFtZXNwYWNlIHRvIGZyZWUgIChNQVlCRSBOVUxMKQorICoKKyAqIFJlcXVpcmVzOiBBbGwgcmVmZXJlbmNlcyB0byB0aGUgbmFtZXNwYWNlIG11c3QgaGF2ZSBiZWVuIHB1dCwgaWYgdGhlCisgKiAgICAgICAgICAgbmFtZXNwYWNlIHdhcyByZWZlcmVuY2VkIGJ5IGEgcHJvZmlsZSBjb25maW5pbmcgYSB0YXNrLAorICovCitzdGF0aWMgdm9pZCBmcmVlX25hbWVzcGFjZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucykKK3sKKwlpZiAoIW5zKQorCQlyZXR1cm47CisKKwlwb2xpY3lfZGVzdHJveSgmbnMtPmJhc2UpOworCWFhX3B1dF9uYW1lc3BhY2UobnMtPnBhcmVudCk7CisKKwlpZiAobnMtPnVuY29uZmluZWQgJiYgbnMtPnVuY29uZmluZWQtPm5zID09IG5zKQorCQlucy0+dW5jb25maW5lZC0+bnMgPSBOVUxMOworCisJYWFfcHV0X3Byb2ZpbGUobnMtPnVuY29uZmluZWQpOworCWt6ZnJlZShucyk7Cit9CisKKy8qKgorICogYWFfZnJlZV9uYW1lc3BhY2Vfa3JlZiAtIGZyZWUgYWFfbmFtZXNwYWNlIGJ5IGtyZWYgKHNlZSBhYV9wdXRfbmFtZXNwYWNlKQorICogQGtyOiBrcmVmIGNhbGxiYWNrIGZvciBmcmVlaW5nIG9mIGEgbmFtZXNwYWNlICAoTk9UIE5VTEwpCisgKi8KK3ZvaWQgYWFfZnJlZV9uYW1lc3BhY2Vfa3JlZihzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlmcmVlX25hbWVzcGFjZShjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGFhX25hbWVzcGFjZSwgYmFzZS5jb3VudCkpOworfQorCisvKioKKyAqIF9fYWFfZmluZF9uYW1lc3BhY2UgLSBmaW5kIGEgbmFtZXNwYWNlIG9uIGEgbGlzdCBieSBAbmFtZQorICogQGhlYWQ6IGxpc3QgdG8gc2VhcmNoIGZvciBuYW1lc3BhY2Ugb24gIChOT1QgTlVMTCkKKyAqIEBuYW1lOiBuYW1lIG9mIG5hbWVzcGFjZSB0byBsb29rIGZvciAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IHVucmVmY291bnRlZCBuYW1lc3BhY2UKKyAqCisgKiBSZXF1aXJlczogbnMgbG9jayBiZSBoZWxkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWFfbmFtZXNwYWNlICpfX2FhX2ZpbmRfbmFtZXNwYWNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCQljb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoc3RydWN0IGFhX25hbWVzcGFjZSAqKV9fcG9saWN5X2ZpbmQoaGVhZCwgbmFtZSk7Cit9CisKKy8qKgorICogYWFfZmluZF9uYW1lc3BhY2UgIC0gIGxvb2sgdXAgYSBwcm9maWxlIG5hbWVzcGFjZSBvbiB0aGUgbmFtZXNwYWNlIGxpc3QKKyAqIEByb290OiBuYW1lc3BhY2UgdG8gc2VhcmNoIGluICAoTk9UIE5VTEwpCisgKiBAbmFtZTogbmFtZSBvZiBuYW1lc3BhY2UgdG8gZmluZCAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IGEgcmVmY291bnRlZCBuYW1lc3BhY2Ugb24gdGhlIGxpc3QsIG9yIE5VTEwgaWYgbm8gbmFtZXNwYWNlCisgKiAgICAgICAgICBjYWxsZWQgQG5hbWUgZXhpc3RzLgorICoKKyAqIHJlZmNvdW50IHJlbGVhc2VkIGJ5IGNhbGxlcgorICovCitzdHJ1Y3QgYWFfbmFtZXNwYWNlICphYV9maW5kX25hbWVzcGFjZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpyb290LAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zID0gTlVMTDsKKworCXJlYWRfbG9jaygmcm9vdC0+bG9jayk7CisJbnMgPSBhYV9nZXRfbmFtZXNwYWNlKF9fYWFfZmluZF9uYW1lc3BhY2UoJnJvb3QtPnN1Yl9ucywgbmFtZSkpOworCXJlYWRfdW5sb2NrKCZyb290LT5sb2NrKTsKKworCXJldHVybiBuczsKK30KKworLyoqCisgKiBhYV9wcmVwYXJlX25hbWVzcGFjZSAtIGZpbmQgYW4gZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IG5hbWVzcGFjZSBvZiBAbmFtZQorICogQG5hbWU6IHRoZSBuYW1lc3BhY2UgdG8gZmluZCBvciBhZGQgIChNQVlCRSBOVUxMKQorICoKKyAqIFJldHVybnM6IHJlZmNvdW50ZWQgbmFtZXNwYWNlIG9yIE5VTEwgaWYgZmFpbGVkIHRvIGNyZWF0ZSBvbmUKKyAqLworc3RhdGljIHN0cnVjdCBhYV9uYW1lc3BhY2UgKmFhX3ByZXBhcmVfbmFtZXNwYWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFhX25hbWVzcGFjZSAqbnMsICpyb290OworCisJcm9vdCA9IGFhX2N1cnJlbnRfcHJvZmlsZSgpLT5uczsKKworCXdyaXRlX2xvY2soJnJvb3QtPmxvY2spOworCisJLyogaWYgbmFtZSBpc24ndCBzcGVjaWZpZWQgdGhlIHByb2ZpbGUgaXMgbG9hZGVkIHRvIHRoZSBjdXJyZW50IG5zICovCisJaWYgKCFuYW1lKSB7CisJCS8qIHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCQlucyA9IGFhX2dldF9uYW1lc3BhY2Uocm9vdCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHRyeSBhbmQgZmluZCB0aGUgc3BlY2lmaWVkIG5zIGFuZCBpZiBpdCBkb2Vzbid0IGV4aXN0IGNyZWF0ZSBpdCAqLworCS8qIHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCW5zID0gYWFfZ2V0X25hbWVzcGFjZShfX2FhX2ZpbmRfbmFtZXNwYWNlKCZyb290LT5zdWJfbnMsIG5hbWUpKTsKKwlpZiAoIW5zKSB7CisJCS8qIG5hbWVzcGFjZSBub3QgZm91bmQgKi8KKwkJc3RydWN0IGFhX25hbWVzcGFjZSAqbmV3X25zOworCQl3cml0ZV91bmxvY2soJnJvb3QtPmxvY2spOworCQluZXdfbnMgPSBhbGxvY19uYW1lc3BhY2Uocm9vdC0+YmFzZS5obmFtZSwgbmFtZSk7CisJCWlmICghbmV3X25zKQorCQkJcmV0dXJuIE5VTEw7CisJCXdyaXRlX2xvY2soJnJvb3QtPmxvY2spOworCQkvKiB0ZXN0IGZvciByYWNlIHdoZW4gbmV3X25zIHdhcyBhbGxvY2F0ZWQgKi8KKwkJbnMgPSBfX2FhX2ZpbmRfbmFtZXNwYWNlKCZyb290LT5zdWJfbnMsIG5hbWUpOworCQlpZiAoIW5zKSB7CisJCQkvKiBhZGQgcGFyZW50IHJlZiAqLworCQkJbmV3X25zLT5wYXJlbnQgPSBhYV9nZXRfbmFtZXNwYWNlKHJvb3QpOworCisJCQlsaXN0X2FkZCgmbmV3X25zLT5iYXNlLmxpc3QsICZyb290LT5zdWJfbnMpOworCQkJLyogYWRkIGxpc3QgcmVmICovCisJCQlucyA9IGFhX2dldF9uYW1lc3BhY2UobmV3X25zKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJhY2VkIHNvIGZyZWUgdGhlIG5ldyBvbmUgKi8KKwkJCWZyZWVfbmFtZXNwYWNlKG5ld19ucyk7CisJCQkvKiBnZXQgcmVmZXJlbmNlIG9uIG5hbWVzcGFjZSAqLworCQkJYWFfZ2V0X25hbWVzcGFjZShucyk7CisJCX0KKwl9CitvdXQ6CisJd3JpdGVfdW5sb2NrKCZyb290LT5sb2NrKTsKKworCS8qIHJldHVybiByZWYgKi8KKwlyZXR1cm4gbnM7Cit9CisKKy8qKgorICogX19saXN0X2FkZF9wcm9maWxlIC0gYWRkIGEgcHJvZmlsZSB0byBhIGxpc3QKKyAqIEBsaXN0OiBsaXN0IHRvIGFkZCBpdCB0byAgKE5PVCBOVUxMKQorICogQHByb2ZpbGU6IHRoZSBwcm9maWxlIHRvIGFkZCAgKE5PVCBOVUxMKQorICoKKyAqIHJlZmNvdW50IEBwcm9maWxlLCBzaG91bGQgYmUgcHV0IGJ5IF9fbGlzdF9yZW1vdmVfcHJvZmlsZQorICoKKyAqIFJlcXVpcmVzOiBuYW1lc3BhY2UgbG9jayBiZSBoZWxkLCBvciBsaXN0IG5vdCBiZSBzaGFyZWQKKyAqLworc3RhdGljIHZvaWQgX19saXN0X2FkZF9wcm9maWxlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkgICAgICAgc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJbGlzdF9hZGQoJnByb2ZpbGUtPmJhc2UubGlzdCwgbGlzdCk7CisJLyogZ2V0IGxpc3QgcmVmZXJlbmNlICovCisJYWFfZ2V0X3Byb2ZpbGUocHJvZmlsZSk7Cit9CisKKy8qKgorICogX19saXN0X3JlbW92ZV9wcm9maWxlIC0gcmVtb3ZlIGEgcHJvZmlsZSBmcm9tIHRoZSBsaXN0IGl0IGlzIG9uCisgKiBAcHJvZmlsZTogdGhlIHByb2ZpbGUgdG8gcmVtb3ZlICAoTk9UIE5VTEwpCisgKgorICogcmVtb3ZlIGEgcHJvZmlsZSBmcm9tIHRoZSBsaXN0LCB3YXJuaW5nIGdlbmVyYWxseSByZW1vdmFsIHNob3VsZAorICogYmUgZG9uZSB3aXRoIF9fcmVwbGFjZV9wcm9maWxlIGFzIG1vc3QgcHJvZmlsZSByZW1vdmFscyBhcmUKKyAqIHJlcGxhY2VtZW50cyB0byB0aGUgdW5jb25maW5lZCBwcm9maWxlLgorICoKKyAqIHB1dCBAcHJvZmlsZSBsaXN0IHJlZmNvdW50CisgKgorICogUmVxdWlyZXM6IG5hbWVzcGFjZSBsb2NrIGJlIGhlbGQsIG9yIGxpc3Qgbm90IGhhdmUgYmVlbiBsaXZlCisgKi8KK3N0YXRpYyB2b2lkIF9fbGlzdF9yZW1vdmVfcHJvZmlsZShzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlsaXN0X2RlbF9pbml0KCZwcm9maWxlLT5iYXNlLmxpc3QpOworCWlmICghKHByb2ZpbGUtPmZsYWdzICYgUEZMQUdfTk9fTElTVF9SRUYpKQorCQkvKiByZWxlYXNlIGxpc3QgcmVmZXJlbmNlICovCisJCWFhX3B1dF9wcm9maWxlKHByb2ZpbGUpOworfQorCisvKioKKyAqIF9fcmVwbGFjZV9wcm9maWxlIC0gcmVwbGFjZSBAb2xkIHdpdGggQG5ldyBvbiBhIGxpc3QKKyAqIEBvbGQ6IHByb2ZpbGUgdG8gYmUgcmVwbGFjZWQgIChOT1QgTlVMTCkKKyAqIEBuZXc6IHByb2ZpbGUgdG8gcmVwbGFjZSBAb2xkIHdpdGggIChOT1QgTlVMTCkKKyAqCisgKiBXaWxsIGR1cGxpY2F0ZSBhbmQgcmVmY291bnQgZWxlbWVudHMgdGhhdCBAbmV3IGluaGVyaXRzIGZyb20gQG9sZAorICogYW5kIHdpbGwgaW5oZXJpdCBAb2xkIGNoaWxkcmVuLgorICoKKyAqIHJlZmNvdW50IEBuZXcgZm9yIGxpc3QsIHB1dCBAb2xkIGxpc3QgcmVmY291bnQKKyAqCisgKiBSZXF1aXJlczogbmFtZXNwYWNlIGxpc3QgbG9jayBiZSBoZWxkLCBvciBsaXN0IG5vdCBiZSBzaGFyZWQKKyAqLworc3RhdGljIHZvaWQgX19yZXBsYWNlX3Byb2ZpbGUoc3RydWN0IGFhX3Byb2ZpbGUgKm9sZCwgc3RydWN0IGFhX3Byb2ZpbGUgKm5ldykKK3sKKwlzdHJ1Y3QgYWFfcG9saWN5ICpwb2xpY3k7CisJc3RydWN0IGFhX3Byb2ZpbGUgKmNoaWxkLCAqdG1wOworCisJaWYgKG9sZC0+cGFyZW50KQorCQlwb2xpY3kgPSAmb2xkLT5wYXJlbnQtPmJhc2U7CisJZWxzZQorCQlwb2xpY3kgPSAmb2xkLT5ucy0+YmFzZTsKKworCS8qIHJlbGVhc2VkIHdoZW4gQG5ldyBpcyBmcmVlZCAqLworCW5ldy0+cGFyZW50ID0gYWFfZ2V0X3Byb2ZpbGUob2xkLT5wYXJlbnQpOworCW5ldy0+bnMgPSBhYV9nZXRfbmFtZXNwYWNlKG9sZC0+bnMpOworCW5ldy0+c2lkID0gb2xkLT5zaWQ7CisJX19saXN0X2FkZF9wcm9maWxlKCZwb2xpY3ktPnByb2ZpbGVzLCBuZXcpOworCS8qIGluaGVyaXQgY2hpbGRyZW4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hpbGQsIHRtcCwgJm9sZC0+YmFzZS5wcm9maWxlcywgYmFzZS5saXN0KSB7CisJCWFhX3B1dF9wcm9maWxlKGNoaWxkLT5wYXJlbnQpOworCQljaGlsZC0+cGFyZW50ID0gYWFfZ2V0X3Byb2ZpbGUobmV3KTsKKwkJLyogbGlzdCByZWZjb3VudCB0cmFuc2ZlcnJlZCB0byBAbmV3Ki8KKwkJbGlzdF9tb3ZlKCZjaGlsZC0+YmFzZS5saXN0LCAmbmV3LT5iYXNlLnByb2ZpbGVzKTsKKwl9CisKKwkvKiByZWxlYXNlZCBieSBmcmVlX3Byb2ZpbGUgKi8KKwlvbGQtPnJlcGxhY2VkYnkgPSBhYV9nZXRfcHJvZmlsZShuZXcpOworCV9fbGlzdF9yZW1vdmVfcHJvZmlsZShvbGQpOworfQorCitzdGF0aWMgdm9pZCBfX3Byb2ZpbGVfbGlzdF9yZWxlYXNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOworCisvKioKKyAqIF9fcmVtb3ZlX3Byb2ZpbGUgLSByZW1vdmUgb2xkIHByb2ZpbGUsIGFuZCBjaGlsZHJlbgorICogQHByb2ZpbGU6IHByb2ZpbGUgdG8gYmUgcmVwbGFjZWQgIChOT1QgTlVMTCkKKyAqCisgKiBSZXF1aXJlczogbmFtZXNwYWNlIGxpc3QgbG9jayBiZSBoZWxkLCBvciBsaXN0IG5vdCBiZSBzaGFyZWQKKyAqLworc3RhdGljIHZvaWQgX19yZW1vdmVfcHJvZmlsZShzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwkvKiByZWxlYXNlIGFueSBjaGlsZHJlbiBsaXN0cyBmaXJzdCAqLworCV9fcHJvZmlsZV9saXN0X3JlbGVhc2UoJnByb2ZpbGUtPmJhc2UucHJvZmlsZXMpOworCS8qIHJlbGVhc2VkIGJ5IGZyZWVfcHJvZmlsZSAqLworCXByb2ZpbGUtPnJlcGxhY2VkYnkgPSBhYV9nZXRfcHJvZmlsZShwcm9maWxlLT5ucy0+dW5jb25maW5lZCk7CisJX19saXN0X3JlbW92ZV9wcm9maWxlKHByb2ZpbGUpOworfQorCisvKioKKyAqIF9fcHJvZmlsZV9saXN0X3JlbGVhc2UgLSByZW1vdmUgYWxsIHByb2ZpbGVzIG9uIHRoZSBsaXN0IGFuZCBwdXQgcmVmcworICogQGhlYWQ6IGxpc3Qgb2YgcHJvZmlsZXMgIChOT1QgTlVMTCkKKyAqCisgKiBSZXF1aXJlczogbmFtZXNwYWNlIGxvY2sgYmUgaGVsZAorICovCitzdGF0aWMgdm9pZCBfX3Byb2ZpbGVfbGlzdF9yZWxlYXNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsICp0bXA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHByb2ZpbGUsIHRtcCwgaGVhZCwgYmFzZS5saXN0KQorCQlfX3JlbW92ZV9wcm9maWxlKHByb2ZpbGUpOworfQorCitzdGF0aWMgdm9pZCBfX25zX2xpc3RfcmVsZWFzZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKKworLyoqCisgKiBkZXN0cm95X25hbWVzcGFjZSAtIHJlbW92ZSBldmVyeXRoaW5nIGNvbnRhaW5lZCBieSBAbnMKKyAqIEBuczogbmFtZXNwYWNlIHRvIGhhdmUgaXQgY29udGVudHMgcmVtb3ZlZCAgKE5PVCBOVUxMKQorICovCitzdGF0aWMgdm9pZCBkZXN0cm95X25hbWVzcGFjZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucykKK3sKKwlpZiAoIW5zKQorCQlyZXR1cm47CisKKwl3cml0ZV9sb2NrKCZucy0+bG9jayk7CisJLyogcmVsZWFzZSBhbGwgcHJvZmlsZXMgaW4gdGhpcyBuYW1lc3BhY2UgKi8KKwlfX3Byb2ZpbGVfbGlzdF9yZWxlYXNlKCZucy0+YmFzZS5wcm9maWxlcyk7CisKKwkvKiByZWxlYXNlIGFsbCBzdWIgbmFtZXNwYWNlcyAqLworCV9fbnNfbGlzdF9yZWxlYXNlKCZucy0+c3ViX25zKTsKKworCXdyaXRlX3VubG9jaygmbnMtPmxvY2spOworfQorCisvKioKKyAqIF9fcmVtb3ZlX25hbWVzcGFjZSAtIHJlbW92ZSBhIG5hbWVzcGFjZSBhbmQgYWxsIGl0cyBjaGlsZHJlbgorICogQG5zOiBuYW1lc3BhY2UgdG8gYmUgcmVtb3ZlZCAgKE5PVCBOVUxMKQorICoKKyAqIFJlcXVpcmVzOiBucy0+cGFyZW50LT5sb2NrIGJlIGhlbGQgYW5kIG5zIHJlbW92ZWQgZnJvbSBwYXJlbnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fcmVtb3ZlX25hbWVzcGFjZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucykKK3sKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqdW5jb25maW5lZCA9IG5zLT51bmNvbmZpbmVkOworCisJLyogcmVtb3ZlIG5zIGZyb20gbmFtZXNwYWNlIGxpc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZucy0+YmFzZS5saXN0KTsKKworCS8qCisJICogYnJlYWsgdGhlIG5zLCB1bmNvbmZpbmVkIHByb2ZpbGUgY3ljbGljIHJlZmVyZW5jZSBhbmQgZm9yd2FyZAorCSAqIGFsbCBuZXcgdW5jb25maW5lZCBwcm9maWxlcyByZXF1ZXN0cyB0byB0aGUgcGFyZW50IG5hbWVzcGFjZQorCSAqIFRoaXMgd2lsbCByZXN1bHQgaW4gYWxsIGNvbmZpbmVkIHRhc2tzIHRoYXQgaGF2ZSBhIHByb2ZpbGUKKwkgKiBiZWluZyByZW1vdmVkLCBpbmhlcml0aW5nIHRoZSBwYXJlbnQtPnVuY29uZmluZWQgcHJvZmlsZS4KKwkgKi8KKwlpZiAobnMtPnBhcmVudCkKKwkJbnMtPnVuY29uZmluZWQgPSBhYV9nZXRfcHJvZmlsZShucy0+cGFyZW50LT51bmNvbmZpbmVkKTsKKworCWRlc3Ryb3lfbmFtZXNwYWNlKG5zKTsKKworCS8qIHJlbGVhc2Ugb3JpZ2luYWwgbnMtPnVuY29uZmluZWQgcmVmICovCisJYWFfcHV0X3Byb2ZpbGUodW5jb25maW5lZCk7CisJLyogcmVsZWFzZSBucy0+YmFzZS5saXN0IHJlZiwgZnJvbSByZW1vdmFsIGFib3ZlICovCisJYWFfcHV0X25hbWVzcGFjZShucyk7Cit9CisKKy8qKgorICogX19uc19saXN0X3JlbGVhc2UgLSByZW1vdmUgYWxsIHByb2ZpbGUgbmFtZXNwYWNlcyBvbiB0aGUgbGlzdCBwdXQgcmVmcworICogQGhlYWQ6IGxpc3Qgb2YgcHJvZmlsZSBuYW1lc3BhY2VzICAoTk9UIE5VTEwpCisgKgorICogUmVxdWlyZXM6IG5hbWVzcGFjZSBsb2NrIGJlIGhlbGQKKyAqLworc3RhdGljIHZvaWQgX19uc19saXN0X3JlbGVhc2Uoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucywgKnRtcDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobnMsIHRtcCwgaGVhZCwgYmFzZS5saXN0KQorCQlfX3JlbW92ZV9uYW1lc3BhY2UobnMpOworCit9CisKKy8qKgorICogYWFfYWxsb2Nfcm9vdF9ucyAtIGFsbG9jYXRlIHRoZSByb290IHByb2ZpbGUgbmFtZXNwYWNlCisgKgorICogUmV0dXJuczogJTAgb24gc3VjY2VzcyBlbHNlIGVycm9yCisgKgorICovCitpbnQgX19pbml0IGFhX2FsbG9jX3Jvb3RfbnModm9pZCkKK3sKKwkvKiByZWxlYXNlZCBieSBhYV9mcmVlX3Jvb3RfbnMgLSB1c2VkIGFzIGxpc3QgcmVmKi8KKwlyb290X25zID0gYWxsb2NfbmFtZXNwYWNlKE5VTEwsICJyb290Iik7CisJaWYgKCFyb290X25zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisgLyoqCisgICogYWFfZnJlZV9yb290X25zIC0gZnJlZSB0aGUgcm9vdCBwcm9maWxlIG5hbWVzcGFjZQorICAqLwordm9pZCBfX2luaXQgYWFfZnJlZV9yb290X25zKHZvaWQpCisgeworCSBzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucyA9IHJvb3RfbnM7CisJIHJvb3RfbnMgPSBOVUxMOworCisJIGRlc3Ryb3lfbmFtZXNwYWNlKG5zKTsKKwkgYWFfcHV0X25hbWVzcGFjZShucyk7Cit9CisKKy8qKgorICogYWFfYWxsb2NfcHJvZmlsZSAtIGFsbG9jYXRlLCBpbml0aWFsaXplIGFuZCByZXR1cm4gYSBuZXcgcHJvZmlsZQorICogQGhuYW1lOiBuYW1lIG9mIHRoZSBwcm9maWxlICAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogcmVmY291bnQgcHJvZmlsZSBvciBOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RydWN0IGFhX3Byb2ZpbGUgKmFhX2FsbG9jX3Byb2ZpbGUoY29uc3QgY2hhciAqaG5hbWUpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisKKwkvKiBmcmVlZCBieSBmcmVlX3Byb2ZpbGUgLSB1c3VhbGx5IHRocm91Z2ggYWFfcHV0X3Byb2ZpbGUgKi8KKwlwcm9maWxlID0ga3phbGxvYyhzaXplb2YoKnByb2ZpbGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByb2ZpbGUpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFwb2xpY3lfaW5pdCgmcHJvZmlsZS0+YmFzZSwgTlVMTCwgaG5hbWUpKSB7CisJCWt6ZnJlZShwcm9maWxlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogcmVmY291bnQgcmVsZWFzZWQgYnkgY2FsbGVyICovCisJcmV0dXJuIHByb2ZpbGU7Cit9CisKKy8qKgorICogYWFfbmV3X251bGxfcHJvZmlsZSAtIGNyZWF0ZSBhIG5ldyBudWxsLVggbGVhcm5pbmcgcHJvZmlsZQorICogQHBhcmVudDogcHJvZmlsZSB0aGF0IGNhdXNlZCB0aGlzIHByb2ZpbGUgdG8gYmUgY3JlYXRlZCAoTk9UIE5VTEwpCisgKiBAaGF0OiB0cnVlIGlmIHRoZSBudWxsLSBsZWFybmluZyBwcm9maWxlIGlzIGEgaGF0CisgKgorICogQ3JlYXRlIGEgbnVsbC0gY29tcGxhaW4gbW9kZSBwcm9maWxlIHVzZWQgaW4gbGVhcm5pbmcgbW9kZS4gIFRoZSBuYW1lIG9mCisgKiB0aGUgcHJvZmlsZSBpcyB1bmlxdWUgYW5kIGZvbGxvd3MgdGhlIGZvcm1hdCBvZiBwYXJlbnQvL251bGwtc2lkLgorICoKKyAqIG51bGwgcHJvZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBwcm9maWxlIGxpc3QgYnV0IHRoZSBsaXN0IGRvZXMgbm90CisgKiBob2xkIGEgY291bnQgb24gdGhlbSBzbyB0aGF0IHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgd2hlbgorICogbm90IGluIHVzZS4KKyAqCisgKiBSZXR1cm5zOiBuZXcgcmVmY291bnRlZCBwcm9maWxlIGVsc2UgTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBhYV9wcm9maWxlICphYV9uZXdfbnVsbF9wcm9maWxlKHN0cnVjdCBhYV9wcm9maWxlICpwYXJlbnQsIGludCBoYXQpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUgPSBOVUxMOworCWNoYXIgKm5hbWU7CisJdTMyIHNpZCA9IGFhX2FsbG9jX3NpZCgpOworCisJLyogZnJlZWQgYmVsb3cgKi8KKwluYW1lID0ga21hbGxvYyhzdHJsZW4ocGFyZW50LT5iYXNlLmhuYW1lKSArIDIgKyA3ICsgOCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlnb3RvIGZhaWw7CisJc3ByaW50ZihuYW1lLCAiJXMvL251bGwtJXgiLCBwYXJlbnQtPmJhc2UuaG5hbWUsIHNpZCk7CisKKwlwcm9maWxlID0gYWFfYWxsb2NfcHJvZmlsZShuYW1lKTsKKwlrZnJlZShuYW1lKTsKKwlpZiAoIXByb2ZpbGUpCisJCWdvdG8gZmFpbDsKKworCXByb2ZpbGUtPnNpZCA9IHNpZDsKKwlwcm9maWxlLT5tb2RlID0gQVBQQVJNT1JfQ09NUExBSU47CisJcHJvZmlsZS0+ZmxhZ3MgPSBQRkxBR19OVUxMOworCWlmIChoYXQpCisJCXByb2ZpbGUtPmZsYWdzIHw9IFBGTEFHX0hBVDsKKworCS8qIHJlbGVhc2VkIG9uIGZyZWVfcHJvZmlsZSAqLworCXByb2ZpbGUtPnBhcmVudCA9IGFhX2dldF9wcm9maWxlKHBhcmVudCk7CisJcHJvZmlsZS0+bnMgPSBhYV9nZXRfbmFtZXNwYWNlKHBhcmVudC0+bnMpOworCisJd3JpdGVfbG9jaygmcHJvZmlsZS0+bnMtPmxvY2spOworCV9fbGlzdF9hZGRfcHJvZmlsZSgmcGFyZW50LT5iYXNlLnByb2ZpbGVzLCBwcm9maWxlKTsKKwl3cml0ZV91bmxvY2soJnByb2ZpbGUtPm5zLT5sb2NrKTsKKworCS8qIHJlZmNvdW50IHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCXJldHVybiBwcm9maWxlOworCitmYWlsOgorCWFhX2ZyZWVfc2lkKHNpZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZnJlZV9wcm9maWxlIC0gZnJlZSBhIHByb2ZpbGUKKyAqIEBwcm9maWxlOiB0aGUgcHJvZmlsZSB0byBmcmVlICAoTUFZQkUgTlVMTCkKKyAqCisgKiBGcmVlIGEgcHJvZmlsZSwgaXRzIGhhdHMgYW5kIG51bGxfcHJvZmlsZS4gQWxsIHJlZmVyZW5jZXMgdG8gdGhlIHByb2ZpbGUsCisgKiBpdHMgaGF0cyBhbmQgbnVsbF9wcm9maWxlIG11c3QgaGF2ZSBiZWVuIHB1dC4KKyAqCisgKiBJZiB0aGUgcHJvZmlsZSB3YXMgcmVmZXJlbmNlZCBmcm9tIGEgdGFzayBjb250ZXh0LCBmcmVlX3Byb2ZpbGUoKSB3aWxsCisgKiBiZSBjYWxsZWQgZnJvbSBhbiByY3UgY2FsbGJhY2sgcm91dGluZSwgc28gd2UgbXVzdCBub3Qgc2xlZXAgaGVyZS4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9wcm9maWxlKHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlKQoreworCUFBX0RFQlVHKCIlcyglcClcbiIsIF9fZnVuY19fLCBwcm9maWxlKTsKKworCWlmICghcHJvZmlsZSkKKwkJcmV0dXJuOworCisJaWYgKCFsaXN0X2VtcHR5KCZwcm9maWxlLT5iYXNlLmxpc3QpKSB7CisJCUFBX0VSUk9SKCIlczogaW50ZXJuYWwgZXJyb3IsICIKKwkJCSAicHJvZmlsZSAnJXMnIHN0aWxsIG9uIG5zIGxpc3RcbiIsCisJCQkgX19mdW5jX18sIHByb2ZpbGUtPmJhc2UubmFtZSk7CisJCUJVRygpOworCX0KKworCS8qIGZyZWUgY2hpbGRyZW4gcHJvZmlsZXMgKi8KKwlwb2xpY3lfZGVzdHJveSgmcHJvZmlsZS0+YmFzZSk7CisJYWFfcHV0X3Byb2ZpbGUocHJvZmlsZS0+cGFyZW50KTsKKworCWFhX3B1dF9uYW1lc3BhY2UocHJvZmlsZS0+bnMpOworCWt6ZnJlZShwcm9maWxlLT5yZW5hbWUpOworCisJYWFfZnJlZV9maWxlX3J1bGVzKCZwcm9maWxlLT5maWxlKTsKKwlhYV9mcmVlX2NhcF9ydWxlcygmcHJvZmlsZS0+Y2Fwcyk7CisJYWFfZnJlZV9ybGltaXRfcnVsZXMoJnByb2ZpbGUtPnJsaW1pdHMpOworCisJYWFfZnJlZV9zaWQocHJvZmlsZS0+c2lkKTsKKwlhYV9wdXRfZGZhKHByb2ZpbGUtPnhtYXRjaCk7CisKKwlhYV9wdXRfcHJvZmlsZShwcm9maWxlLT5yZXBsYWNlZGJ5KTsKKworCWt6ZnJlZShwcm9maWxlKTsKK30KKworLyoqCisgKiBhYV9mcmVlX3Byb2ZpbGVfa3JlZiAtIGZyZWUgYWFfcHJvZmlsZSBieSBrcmVmIChjYWxsZWQgYnkgYWFfcHV0X3Byb2ZpbGUpCisgKiBAa3I6IGtyZWYgY2FsbGJhY2sgZm9yIGZyZWVpbmcgb2YgYSBwcm9maWxlICAoTk9UIE5VTEwpCisgKi8KK3ZvaWQgYWFfZnJlZV9wcm9maWxlX2tyZWYoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnAgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGFhX3Byb2ZpbGUsCisJCQkJCSAgICBiYXNlLmNvdW50KTsKKworCWZyZWVfcHJvZmlsZShwKTsKK30KKworLyogVE9ETzogcHJvZmlsZSBhY2NvdW50aW5nIC0gc2V0dXAgaW4gcmVtb3ZlICovCisKKy8qKgorICogX19maW5kX2NoaWxkIC0gZmluZCBhIHByb2ZpbGUgb24gQGhlYWQgbGlzdCB3aXRoIGEgbmFtZSBtYXRjaGluZyBAbmFtZQorICogQGhlYWQ6IGxpc3QgdG8gc2VhcmNoICAoTk9UIE5VTEwpCisgKiBAbmFtZTogbmFtZSBvZiBwcm9maWxlIChOT1QgTlVMTCkKKyAqCisgKiBSZXF1aXJlczogbnMgbG9jayBwcm90ZWN0aW5nIGxpc3QgYmUgaGVsZAorICoKKyAqIFJldHVybnM6IHVucmVmY291bnRlZCBwcm9maWxlIHB0ciwgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIHN0cnVjdCBhYV9wcm9maWxlICpfX2ZpbmRfY2hpbGQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBhYV9wcm9maWxlICopX19wb2xpY3lfZmluZChoZWFkLCBuYW1lKTsKK30KKworLyoqCisgKiBfX3N0cm5fZmluZF9jaGlsZCAtIGZpbmQgYSBwcm9maWxlIG9uIEBoZWFkIGxpc3QgdXNpbmcgc3Vic3RyaW5nIG9mIEBuYW1lCisgKiBAaGVhZDogbGlzdCB0byBzZWFyY2ggIChOT1QgTlVMTCkKKyAqIEBuYW1lOiBuYW1lIG9mIHByb2ZpbGUgKE5PVCBOVUxMKQorICogQGxlbjogbGVuZ3RoIG9mIEBuYW1lIHN1YnN0cmluZyB0byBtYXRjaAorICoKKyAqIFJlcXVpcmVzOiBucyBsb2NrIHByb3RlY3RpbmcgbGlzdCBiZSBoZWxkCisgKgorICogUmV0dXJuczogdW5yZWZjb3VudGVkIHByb2ZpbGUgcHRyLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgc3RydWN0IGFhX3Byb2ZpbGUgKl9fc3Rybl9maW5kX2NoaWxkKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCXJldHVybiAoc3RydWN0IGFhX3Byb2ZpbGUgKilfX3BvbGljeV9zdHJuX2ZpbmQoaGVhZCwgbmFtZSwgbGVuKTsKK30KKworLyoqCisgKiBhYV9maW5kX2NoaWxkIC0gZmluZCBhIHByb2ZpbGUgYnkgQG5hbWUgaW4gQHBhcmVudAorICogQHBhcmVudDogcHJvZmlsZSB0byBzZWFyY2ggIChOT1QgTlVMTCkKKyAqIEBuYW1lOiBwcm9maWxlIG5hbWUgdG8gc2VhcmNoIGZvciAgKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IGEgcmVmY291bnRlZCBwcm9maWxlIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK3N0cnVjdCBhYV9wcm9maWxlICphYV9maW5kX2NoaWxkKHN0cnVjdCBhYV9wcm9maWxlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisKKwlyZWFkX2xvY2soJnBhcmVudC0+bnMtPmxvY2spOworCXByb2ZpbGUgPSBhYV9nZXRfcHJvZmlsZShfX2ZpbmRfY2hpbGQoJnBhcmVudC0+YmFzZS5wcm9maWxlcywgbmFtZSkpOworCXJlYWRfdW5sb2NrKCZwYXJlbnQtPm5zLT5sb2NrKTsKKworCS8qIHJlZmNvdW50IHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCXJldHVybiBwcm9maWxlOworfQorCisvKioKKyAqIF9fbG9va3VwX3BhcmVudCAtIGxvb2t1cCB0aGUgcGFyZW50IG9mIGEgcHJvZmlsZSBvZiBuYW1lIEBobmFtZQorICogQG5zOiBuYW1lc3BhY2UgdG8gbG9va3VwIHByb2ZpbGUgaW4gIChOT1QgTlVMTCkKKyAqIEBobmFtZTogaGllcmFyY2hpY2FsIHByb2ZpbGUgbmFtZSB0byBmaW5kIHBhcmVudCBvZiAgKE5PVCBOVUxMKQorICoKKyAqIExvb2t1cHMgdXAgdGhlIHBhcmVudCBvZiBhIGZ1bGx5IHF1YWxpZmllZCBwcm9maWxlIG5hbWUsIHRoZSBwcm9maWxlCisgKiB0aGF0IG1hdGNoZXMgaG5hbWUgZG9lcyBub3QgbmVlZCB0byBleGlzdCwgaW4gZ2VuZXJhbCB0aGlzCisgKiBpcyB1c2VkIHRvIGxvYWQgYSBuZXcgcHJvZmlsZS4KKyAqCisgKiBSZXF1aXJlczogbnMtPmxvY2sgYmUgaGVsZAorICoKKyAqIFJldHVybnM6IHVucmVmY291bnRlZCBwb2xpY3kgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIHN0cnVjdCBhYV9wb2xpY3kgKl9fbG9va3VwX3BhcmVudChzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucywKKwkJCQkJIGNvbnN0IGNoYXIgKmhuYW1lKQoreworCXN0cnVjdCBhYV9wb2xpY3kgKnBvbGljeTsKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IE5VTEw7CisJY2hhciAqc3BsaXQ7CisKKwlwb2xpY3kgPSAmbnMtPmJhc2U7CisKKwlmb3IgKHNwbGl0ID0gc3Ryc3RyKGhuYW1lLCAiLy8iKTsgc3BsaXQ7KSB7CisJCXByb2ZpbGUgPSBfX3N0cm5fZmluZF9jaGlsZCgmcG9saWN5LT5wcm9maWxlcywgaG5hbWUsCisJCQkJCSAgICBzcGxpdCAtIGhuYW1lKTsKKwkJaWYgKCFwcm9maWxlKQorCQkJcmV0dXJuIE5VTEw7CisJCXBvbGljeSA9ICZwcm9maWxlLT5iYXNlOworCQlobmFtZSA9IHNwbGl0ICsgMjsKKwkJc3BsaXQgPSBzdHJzdHIoaG5hbWUsICIvLyIpOworCX0KKwlpZiAoIXByb2ZpbGUpCisJCXJldHVybiAmbnMtPmJhc2U7CisJcmV0dXJuICZwcm9maWxlLT5iYXNlOworfQorCisvKioKKyAqIF9fbG9va3VwX3Byb2ZpbGUgLSBsb29rdXAgdGhlIHByb2ZpbGUgbWF0Y2hpbmcgQGhuYW1lCisgKiBAYmFzZTogYmFzZSBsaXN0IHRvIHN0YXJ0IGxvb2tpbmcgdXAgcHJvZmlsZSBuYW1lIGZyb20gIChOT1QgTlVMTCkKKyAqIEBobmFtZTogaGllcmFyY2hpY2FsIHByb2ZpbGUgbmFtZSAgKE5PVCBOVUxMKQorICoKKyAqIFJlcXVpcmVzOiBucy0+bG9jayBiZSBoZWxkCisgKgorICogUmV0dXJuczogdW5yZWZjb3VudGVkIHByb2ZpbGUgcG9pbnRlciBvciBOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIERvIGEgcmVsYXRpdmUgbmFtZSBsb29rdXAsIHJlY3Vyc2luZyB0aHJvdWdoIHByb2ZpbGUgdHJlZS4KKyAqLworc3RhdGljIHN0cnVjdCBhYV9wcm9maWxlICpfX2xvb2t1cF9wcm9maWxlKHN0cnVjdCBhYV9wb2xpY3kgKmJhc2UsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmhuYW1lKQoreworCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlID0gTlVMTDsKKwljaGFyICpzcGxpdDsKKworCWZvciAoc3BsaXQgPSBzdHJzdHIoaG5hbWUsICIvLyIpOyBzcGxpdDspIHsKKwkJcHJvZmlsZSA9IF9fc3Rybl9maW5kX2NoaWxkKCZiYXNlLT5wcm9maWxlcywgaG5hbWUsCisJCQkJCSAgICBzcGxpdCAtIGhuYW1lKTsKKwkJaWYgKCFwcm9maWxlKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJYmFzZSA9ICZwcm9maWxlLT5iYXNlOworCQlobmFtZSA9IHNwbGl0ICsgMjsKKwkJc3BsaXQgPSBzdHJzdHIoaG5hbWUsICIvLyIpOworCX0KKworCXByb2ZpbGUgPSBfX2ZpbmRfY2hpbGQoJmJhc2UtPnByb2ZpbGVzLCBobmFtZSk7CisKKwlyZXR1cm4gcHJvZmlsZTsKK30KKworLyoqCisgKiBhYV9sb29rdXBfcHJvZmlsZSAtIGZpbmQgYSBwcm9maWxlIGJ5IGl0cyBmdWxsIG9yIHBhcnRpYWwgbmFtZQorICogQG5zOiB0aGUgbmFtZXNwYWNlIHRvIHN0YXJ0IGZyb20gKE5PVCBOVUxMKQorICogQGhuYW1lOiBuYW1lIHRvIGRvIGxvb2t1cCBvbi4gIERvZXMgbm90IGNvbnRhaW4gbmFtZXNwYWNlIHByZWZpeCAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogcmVmY291bnRlZCBwcm9maWxlIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK3N0cnVjdCBhYV9wcm9maWxlICphYV9sb29rdXBfcHJvZmlsZShzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucywgY29uc3QgY2hhciAqaG5hbWUpCit7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGU7CisKKwlyZWFkX2xvY2soJm5zLT5sb2NrKTsKKwlwcm9maWxlID0gYWFfZ2V0X3Byb2ZpbGUoX19sb29rdXBfcHJvZmlsZSgmbnMtPmJhc2UsIGhuYW1lKSk7CisJcmVhZF91bmxvY2soJm5zLT5sb2NrKTsKKworCS8qIHJlZmNvdW50IHJlbGVhc2VkIGJ5IGNhbGxlciAqLworCXJldHVybiBwcm9maWxlOworfQorCisvKioKKyAqIHJlcGxhY2VtZW50X2FsbG93ZWQgLSB0ZXN0IHRvIHNlZSBpZiByZXBsYWNlbWVudCBpcyBhbGxvd2VkCisgKiBAcHJvZmlsZTogcHJvZmlsZSB0byB0ZXN0IGlmIGl0IGNhbiBiZSByZXBsYWNlZCAgKE1BWUJFIE5VTEwpCisgKiBAbm9yZXBsYWNlOiB0cnVlIGlmIHJlcGxhY2VtZW50IHNob3VsZG4ndCBiZSBhbGxvd2VkIGJ1dCBhZGRpdGlvbiBpcyBva2F5CisgKiBAaW5mbzogUmV0dXJucyAtIGluZm8gYWJvdXQgd2h5IHJlcGxhY2VtZW50IGZhaWxlZCAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogJTAgaWYgcmVwbGFjZW1lbnQgYWxsb3dlZCBlbHNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCByZXBsYWNlbWVudF9hbGxvd2VkKHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlLCBpbnQgbm9yZXBsYWNlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKippbmZvKQoreworCWlmIChwcm9maWxlKSB7CisJCWlmIChwcm9maWxlLT5mbGFncyAmIFBGTEFHX0lNTVVUQUJMRSkgeworCQkJKmluZm8gPSAiY2Fubm90IHJlcGxhY2UgaW1tdXRpYmxlIHByb2ZpbGUiOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfSBlbHNlIGlmIChub3JlcGxhY2UpIHsKKwkJCSppbmZvID0gInByb2ZpbGUgYWxyZWFkeSBleGlzdHMiOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogX19hZGRfbmV3X3Byb2ZpbGUgLSBzaW1wbGUgd3JhcHBlciBhcm91bmQgX19saXN0X2FkZF9wcm9maWxlCisgKiBAbnM6IG5hbWVzcGFjZSB0aGF0IHByb2ZpbGUgaXMgYmVpbmcgYWRkZWQgdG8gIChOT1QgTlVMTCkKKyAqIEBwb2xpY3k6IHRoZSBwb2xpY3kgY29udGFpbmVyIHRvIGFkZCB0aGUgcHJvZmlsZSB0byAgKE5PVCBOVUxMKQorICogQHByb2ZpbGU6IHByb2ZpbGUgdG8gYWRkICAoTk9UIE5VTEwpCisgKgorICogYWRkIGEgcHJvZmlsZSB0byBhIGxpc3QgYW5kIGRvIG90aGVyIHJlcXVpcmVkIGJhc2ljIGFsbG9jYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIF9fYWRkX25ld19wcm9maWxlKHN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgYWFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgICBzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlpZiAocG9saWN5ICE9ICZucy0+YmFzZSkKKwkJLyogcmVsZWFzZWQgb24gcHJvZmlsZSByZXBsYWNlbWVudCBvciBmcmVlX3Byb2ZpbGUgKi8KKwkJcHJvZmlsZS0+cGFyZW50ID0gYWFfZ2V0X3Byb2ZpbGUoKHN0cnVjdCBhYV9wcm9maWxlICopIHBvbGljeSk7CisJX19saXN0X2FkZF9wcm9maWxlKCZwb2xpY3ktPnByb2ZpbGVzLCBwcm9maWxlKTsKKwkvKiByZWxlYXNlZCBvbiBmcmVlX3Byb2ZpbGUgKi8KKwlwcm9maWxlLT5zaWQgPSBhYV9hbGxvY19zaWQoKTsKKwlwcm9maWxlLT5ucyA9IGFhX2dldF9uYW1lc3BhY2UobnMpOworfQorCisvKioKKyAqIGFhX2F1ZGl0X3BvbGljeSAtIERvIGF1ZGl0aW5nIG9mIHBvbGljeSBjaGFuZ2VzCisgKiBAb3A6IHBvbGljeSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkCisgKiBAZ2ZwOiBtZW1vcnkgYWxsb2NhdGlvbiBmbGFncworICogQG5hbWU6IG5hbWUgb2YgcHJvZmlsZSBiZWluZyBtYW5pcHVsYXRlZCAoTk9UIE5VTEwpCisgKiBAaW5mbzogYW55IGV4dHJhIGluZm9ybWF0aW9uIHRvIGJlIGF1ZGl0ZWQgKE1BWUJFIE5VTEwpCisgKiBAZXJyb3I6IGVycm9yIGNvZGUKKyAqCisgKiBSZXR1cm5zOiB0aGUgZXJyb3IgdG8gYmUgcmV0dXJuZWQgYWZ0ZXIgYXVkaXQgaXMgZG9uZQorICovCitzdGF0aWMgaW50IGF1ZGl0X3BvbGljeShpbnQgb3AsIGdmcF90IGdmcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaW5mbywKKwkJCWludCBlcnJvcikKK3sKKwlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgc2E7CisJQ09NTU9OX0FVRElUX0RBVEFfSU5JVCgmc2EsIE5PTkUpOworCXNhLmFhZC5vcCA9IG9wOworCXNhLmFhZC5uYW1lID0gbmFtZTsKKwlzYS5hYWQuaW5mbyA9IGluZm87CisJc2EuYWFkLmVycm9yID0gZXJyb3I7CisKKwlyZXR1cm4gYWFfYXVkaXQoQVVESVRfQVBQQVJNT1JfU1RBVFVTLCBfX2FhX2N1cnJlbnRfcHJvZmlsZSgpLCBnZnAsCisJCQkmc2EsIE5VTEwpOworfQorCisvKioKKyAqIGFhX21heV9tYW5hZ2VfcG9saWN5IC0gY2FuIHRoZSBjdXJyZW50IHRhc2sgbWFuYWdlIHBvbGljeQorICogQG9wOiB0aGUgcG9saWN5IG1hbmlwdWxhdGlvbiBvcGVyYXRpb24gYmVpbmcgZG9uZQorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHRhc2sgaXMgYWxsb3dlZCB0byBtYW5pcHVsYXRlIHBvbGljeQorICovCitib29sIGFhX21heV9tYW5hZ2VfcG9saWN5KGludCBvcCkKK3sKKwkvKiBjaGVjayBpZiBsb2FkaW5nIHBvbGljeSBpcyBsb2NrZWQgb3V0ICovCisJaWYgKGFhX2dfbG9ja19wb2xpY3kpIHsKKwkJYXVkaXRfcG9saWN5KG9wLCBHRlBfS0VSTkVMLCBOVUxMLCAicG9saWN5X2xvY2tlZCIsIC1FQUNDRVMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpIHsKKwkJYXVkaXRfcG9saWN5KG9wLCBHRlBfS0VSTkVMLCBOVUxMLCAibm90IHBvbGljeSBhZG1pbiIsIC1FQUNDRVMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBhYV9yZXBsYWNlX3Byb2ZpbGVzIC0gcmVwbGFjZSBwcm9maWxlKHMpIG9uIHRoZSBwcm9maWxlIGxpc3QKKyAqIEB1ZGF0YTogc2VyaWFsaXplZCBkYXRhIHN0cmVhbSAgKE5PVCBOVUxMKQorICogQHNpemU6IHNpemUgb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSBzdHJlYW0KKyAqIEBub3JlcGxhY2U6IHRydWUgaWYgb25seSBkb2luZyBhZGRpdGlvbiwgbm8gcmVwbGFjZW1lbnQgYWxsb3dlZAorICoKKyAqIHVucGFjayBhbmQgcmVwbGFjZSBhIHByb2ZpbGUgb24gdGhlIHByb2ZpbGUgbGlzdCBhbmQgdXNlcyBvZiB0aGF0IHByb2ZpbGUKKyAqIGJ5IGFueSBhYV90YXNrX2N4dC4gIElmIHRoZSBwcm9maWxlIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9maWxlIGxpc3QKKyAqIGl0IGlzIGFkZGVkLgorICoKKyAqIFJldHVybnM6IHNpemUgb2YgZGF0YSBjb25zdW1lZCBlbHNlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3NpemVfdCBhYV9yZXBsYWNlX3Byb2ZpbGVzKHZvaWQgKnVkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub3JlcGxhY2UpCit7CisJc3RydWN0IGFhX3BvbGljeSAqcG9saWN5OworCXN0cnVjdCBhYV9wcm9maWxlICpvbGRfcHJvZmlsZSA9IE5VTEwsICpuZXdfcHJvZmlsZSA9IE5VTEw7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnJlbmFtZV9wcm9maWxlID0gTlVMTDsKKwlzdHJ1Y3QgYWFfbmFtZXNwYWNlICpucyA9IE5VTEw7CisJY29uc3QgY2hhciAqbnNfbmFtZSwgKm5hbWUgPSBOVUxMLCAqaW5mbyA9IE5VTEw7CisJaW50IG9wID0gT1BfUFJPRl9SRVBMOworCXNzaXplX3QgZXJyb3I7CisKKwkvKiByZWxlYXNlZCBiZWxvdyAqLworCW5ld19wcm9maWxlID0gYWFfdW5wYWNrKHVkYXRhLCBzaXplLCAmbnNfbmFtZSk7CisJaWYgKElTX0VSUihuZXdfcHJvZmlsZSkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKG5ld19wcm9maWxlKTsKKwkJbmV3X3Byb2ZpbGUgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogcmVsZWFzZWQgYmVsb3cgKi8KKwlucyA9IGFhX3ByZXBhcmVfbmFtZXNwYWNlKG5zX25hbWUpOworCWlmICghbnMpIHsKKwkJaW5mbyA9ICJmYWlsZWQgdG8gcHJlcGFyZSBuYW1lc3BhY2UiOworCQllcnJvciA9IC1FTk9NRU07CisJCW5hbWUgPSBuc19uYW1lOworCQlnb3RvIGZhaWw7CisJfQorCisJbmFtZSA9IG5ld19wcm9maWxlLT5iYXNlLmhuYW1lOworCisJd3JpdGVfbG9jaygmbnMtPmxvY2spOworCS8qIG5vIHJlZiBvbiBwb2xpY3kgb25seSB1c2UgaW5zaWRlIGxvY2sgKi8KKwlwb2xpY3kgPSBfX2xvb2t1cF9wYXJlbnQobnMsIG5ld19wcm9maWxlLT5iYXNlLmhuYW1lKTsKKworCWlmICghcG9saWN5KSB7CisJCWluZm8gPSAicGFyZW50IGRvZXMgbm90IGV4aXN0IjsKKwkJZXJyb3IgPSAtRU5PRU5UOworCQlnb3RvIGF1ZGl0OworCX0KKworCW9sZF9wcm9maWxlID0gX19maW5kX2NoaWxkKCZwb2xpY3ktPnByb2ZpbGVzLCBuZXdfcHJvZmlsZS0+YmFzZS5uYW1lKTsKKwkvKiByZWxlYXNlZCBiZWxvdyAqLworCWFhX2dldF9wcm9maWxlKG9sZF9wcm9maWxlKTsKKworCWlmIChuZXdfcHJvZmlsZS0+cmVuYW1lKSB7CisJCXJlbmFtZV9wcm9maWxlID0gX19sb29rdXBfcHJvZmlsZSgmbnMtPmJhc2UsCisJCQkJCQkgIG5ld19wcm9maWxlLT5yZW5hbWUpOworCQkvKiByZWxlYXNlZCBiZWxvdyAqLworCQlhYV9nZXRfcHJvZmlsZShyZW5hbWVfcHJvZmlsZSk7CisKKwkJaWYgKCFyZW5hbWVfcHJvZmlsZSkgeworCQkJaW5mbyA9ICJwcm9maWxlIHRvIHJlbmFtZSBkb2VzIG5vdCBleGlzdCI7CisJCQluYW1lID0gbmV3X3Byb2ZpbGUtPnJlbmFtZTsKKwkJCWVycm9yID0gLUVOT0VOVDsKKwkJCWdvdG8gYXVkaXQ7CisJCX0KKwl9CisKKwllcnJvciA9IHJlcGxhY2VtZW50X2FsbG93ZWQob2xkX3Byb2ZpbGUsIG5vcmVwbGFjZSwgJmluZm8pOworCWlmIChlcnJvcikKKwkJZ290byBhdWRpdDsKKworCWVycm9yID0gcmVwbGFjZW1lbnRfYWxsb3dlZChyZW5hbWVfcHJvZmlsZSwgbm9yZXBsYWNlLCAmaW5mbyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGF1ZGl0OworCithdWRpdDoKKwlpZiAoIW9sZF9wcm9maWxlICYmICFyZW5hbWVfcHJvZmlsZSkKKwkJb3AgPSBPUF9QUk9GX0xPQUQ7CisKKwllcnJvciA9IGF1ZGl0X3BvbGljeShvcCwgR0ZQX0FUT01JQywgbmFtZSwgaW5mbywgZXJyb3IpOworCisJaWYgKCFlcnJvcikgeworCQlpZiAocmVuYW1lX3Byb2ZpbGUpCisJCQlfX3JlcGxhY2VfcHJvZmlsZShyZW5hbWVfcHJvZmlsZSwgbmV3X3Byb2ZpbGUpOworCQlpZiAob2xkX3Byb2ZpbGUpIHsKKwkJCS8qIHdoZW4gdGhlcmUgYXJlIGJvdGggcmVuYW1lIGFuZCBvbGQgcHJvZmlsZXMKKwkJCSAqIGluaGVyaXQgb2xkIHByb2ZpbGVzIHNpZAorCQkJICovCisJCQlpZiAocmVuYW1lX3Byb2ZpbGUpCisJCQkJYWFfZnJlZV9zaWQobmV3X3Byb2ZpbGUtPnNpZCk7CisJCQlfX3JlcGxhY2VfcHJvZmlsZShvbGRfcHJvZmlsZSwgbmV3X3Byb2ZpbGUpOworCQl9CisJCWlmICghKG9sZF9wcm9maWxlIHx8IHJlbmFtZV9wcm9maWxlKSkKKwkJCV9fYWRkX25ld19wcm9maWxlKG5zLCBwb2xpY3ksIG5ld19wcm9maWxlKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZucy0+bG9jayk7CisKK291dDoKKwlhYV9wdXRfbmFtZXNwYWNlKG5zKTsKKwlhYV9wdXRfcHJvZmlsZShyZW5hbWVfcHJvZmlsZSk7CisJYWFfcHV0X3Byb2ZpbGUob2xkX3Byb2ZpbGUpOworCWFhX3B1dF9wcm9maWxlKG5ld19wcm9maWxlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gc2l6ZTsKKworZmFpbDoKKwllcnJvciA9IGF1ZGl0X3BvbGljeShvcCwgR0ZQX0tFUk5FTCwgbmFtZSwgaW5mbywgZXJyb3IpOworCWdvdG8gb3V0OworfQorCisvKioKKyAqIGFhX3JlbW92ZV9wcm9maWxlcyAtIHJlbW92ZSBwcm9maWxlKHMpIGZyb20gdGhlIHN5c3RlbQorICogQGZxbmFtZTogbmFtZSBvZiB0aGUgcHJvZmlsZSBvciBuYW1lc3BhY2UgdG8gcmVtb3ZlICAoTk9UIE5VTEwpCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbmFtZQorICoKKyAqIFJlbW92ZSBhIHByb2ZpbGUgb3Igc3ViIG5hbWVzcGFjZSBmcm9tIHRoZSBjdXJyZW50IG5hbWVzcGFjZSwgc28gdGhhdAorICogdGhleSBjYW4gbm90IGJlIGZvdW5kIGFueW1vcmUgYW5kIG1hcmsgdGhlbSBhcyByZXBsYWNlZCBieSB1bmNvbmZpbmVkCisgKgorICogTk9URTogcmVtb3ZpbmcgY29uZmluZW1lbnQgZG9lcyBub3QgcmVzdG9yZSBybGltaXRzIHRvIHByZWNvbmZpbmVtbmV0IHZhbHVlcworICoKKyAqIFJldHVybnM6IHNpemUgb2YgZGF0YSBjb25zdW1lIGVsc2UgZXJyb3IgY29kZSBpZiBmYWlscworICovCitzc2l6ZV90IGFhX3JlbW92ZV9wcm9maWxlcyhjaGFyICpmcW5hbWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBhYV9uYW1lc3BhY2UgKnJvb3QsICpucyA9IE5VTEw7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKm5hbWUgPSBmcW5hbWUsICppbmZvID0gTlVMTDsKKwlzc2l6ZV90IGVycm9yID0gMDsKKworCWlmICgqZnFuYW1lID09IDApIHsKKwkJaW5mbyA9ICJubyBwcm9maWxlIHNwZWNpZmllZCI7CisJCWVycm9yID0gLUVOT0VOVDsKKwkJZ290byBmYWlsOworCX0KKworCXJvb3QgPSBhYV9jdXJyZW50X3Byb2ZpbGUoKS0+bnM7CisKKwlpZiAoZnFuYW1lWzBdID09ICc6JykgeworCQljaGFyICpuc19uYW1lOworCQluYW1lID0gYWFfc3BsaXRfZnFuYW1lKGZxbmFtZSwgJm5zX25hbWUpOworCQlpZiAobnNfbmFtZSkgeworCQkJLyogcmVsZWFzZWQgYmVsb3cgKi8KKwkJCW5zID0gYWFfZmluZF9uYW1lc3BhY2Uocm9vdCwgbnNfbmFtZSk7CisJCQlpZiAoIW5zKSB7CisJCQkJaW5mbyA9ICJuYW1lc3BhY2UgZG9lcyBub3QgZXhpc3QiOworCQkJCWVycm9yID0gLUVOT0VOVDsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJLyogcmVsZWFzZWQgYmVsb3cgKi8KKwkJbnMgPSBhYV9nZXRfbmFtZXNwYWNlKHJvb3QpOworCisJd3JpdGVfbG9jaygmbnMtPmxvY2spOworCWlmICghbmFtZSkgeworCQkvKiByZW1vdmUgbmFtZXNwYWNlIC0gY2FuIG9ubHkgaGFwcGVuIGlmIGZxbmFtZVswXSA9PSAnOicgKi8KKwkJX19yZW1vdmVfbmFtZXNwYWNlKG5zKTsKKwl9IGVsc2UgeworCQkvKiByZW1vdmUgcHJvZmlsZSAqLworCQlwcm9maWxlID0gYWFfZ2V0X3Byb2ZpbGUoX19sb29rdXBfcHJvZmlsZSgmbnMtPmJhc2UsIG5hbWUpKTsKKwkJaWYgKCFwcm9maWxlKSB7CisJCQllcnJvciA9IC1FTk9FTlQ7CisJCQlpbmZvID0gInByb2ZpbGUgZG9lcyBub3QgZXhpc3QiOworCQkJZ290byBmYWlsX25zX2xvY2s7CisJCX0KKwkJbmFtZSA9IHByb2ZpbGUtPmJhc2UuaG5hbWU7CisJCV9fcmVtb3ZlX3Byb2ZpbGUocHJvZmlsZSk7CisJfQorCXdyaXRlX3VubG9jaygmbnMtPmxvY2spOworCisJLyogZG9uJ3QgZmFpbCByZW1vdmFsIGlmIGF1ZGl0IGZhaWxzICovCisJKHZvaWQpIGF1ZGl0X3BvbGljeShPUF9QUk9GX1JNLCBHRlBfS0VSTkVMLCBuYW1lLCBpbmZvLCBlcnJvcik7CisJYWFfcHV0X25hbWVzcGFjZShucyk7CisJYWFfcHV0X3Byb2ZpbGUocHJvZmlsZSk7CisJcmV0dXJuIHNpemU7CisKK2ZhaWxfbnNfbG9jazoKKwl3cml0ZV91bmxvY2soJm5zLT5sb2NrKTsKKwlhYV9wdXRfbmFtZXNwYWNlKG5zKTsKKworZmFpbDoKKwkodm9pZCkgYXVkaXRfcG9saWN5KE9QX1BST0ZfUk0sIEdGUF9LRVJORUwsIG5hbWUsIGluZm8sIGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9wb2xpY3lfdW5wYWNrLmMgYi9zZWN1cml0eS9hcHBhcm1vci9wb2xpY3lfdW5wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNzAwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL3BvbGljeV91bnBhY2suYwpAQCAtMCwwICsxLDcwMyBAQAorLyoKKyAqIEFwcEFybW9yIHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBBcHBBcm1vciBmdW5jdGlvbnMgZm9yIHVucGFja2luZyBwb2xpY3kgbG9hZGVkIGZyb20KKyAqIHVzZXJzcGFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqCisgKiBBcHBBcm1vciB1c2VzIGEgc2VyaWFsaXplZCBiaW5hcnkgZm9ybWF0IGZvciBsb2FkaW5nIHBvbGljeS4KKyAqIFRvIGZpbmQgcG9saWN5IGZvcm1hdCBkb2N1bWVudGF0aW9uIGxvb2sgaW4gRG9jdW1lbnRhdGlvbi9hcHBhcm1vci50eHQKKyAqIEFsbCBwb2xpY3kgaXMgdmFsaWRhdGVkIGJlZm9yZSBpdCBpcyB1c2VkLgorICovCisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9hcHBhcm1vci5oIgorI2luY2x1ZGUgImluY2x1ZGUvYXVkaXQuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbmNsdWRlL21hdGNoLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9wb2xpY3kuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeV91bnBhY2suaCIKKyNpbmNsdWRlICJpbmNsdWRlL3NpZC5oIgorCisvKgorICogVGhlIEFwcEFybW9yIGludGVyZmFjZSB0cmVhdHMgZGF0YSBhcyBhIHR5cGUgYnl0ZSBmb2xsb3dlZCBieSB0aGUKKyAqIGFjdHVhbCBkYXRhLiAgVGhlIGludGVyZmFjZSBoYXMgdGhlIG5vdGlvbiBvZiBhIGEgbmFtZWQgZW50cnkKKyAqIHdoaWNoIGhhcyBhIG5hbWUgKEFBX05BTUUgdHlwZWNvZGUgZm9sbG93ZWQgYnkgbmFtZSBzdHJpbmcpIGZvbGxvd2VkIGJ5CisgKiB0aGUgZW50cmllcyB0eXBlY29kZSBhbmQgZGF0YS4gIE5hbWVkIHR5cGVzIGFsbG93IGZvciBvcHRpb25hbAorICogZWxlbWVudHMgYW5kIGV4dGVuc2lvbnMgdG8gYmUgYWRkZWQgYW5kIHRlc3RlZCBmb3Igd2l0aG91dCBicmVha2luZworICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KKworZW51bSBhYV9jb2RlIHsKKwlBQV9VOCwKKwlBQV9VMTYsCisJQUFfVTMyLAorCUFBX1U2NCwKKwlBQV9OQU1FLAkJLyogc2FtZSBhcyBzdHJpbmcgZXhjZXB0IGl0IGlzIGl0ZW1zIG5hbWUgKi8KKwlBQV9TVFJJTkcsCisJQUFfQkxPQiwKKwlBQV9TVFJVQ1QsCisJQUFfU1RSVUNURU5ELAorCUFBX0xJU1QsCisJQUFfTElTVEVORCwKKwlBQV9BUlJBWSwKKwlBQV9BUlJBWUVORCwKK307CisKKy8qCisgKiBhYV9leHQgaXMgdGhlIHJlYWQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIHByb2ZpbGUuICBUaGUKKyAqIGRhdGEgaXMgY29waWVkIGludG8gYSBrZXJuZWwgYnVmZmVyIGluIGFwcGFybW9yZnMgYW5kIHRoZW4gaGFuZGVkIG9mZiB0bworICogdGhlIHVucGFjayByb3V0aW5lcy4KKyAqLworc3RydWN0IGFhX2V4dCB7CisJdm9pZCAqc3RhcnQ7CisJdm9pZCAqZW5kOworCXZvaWQgKnBvczsJCS8qIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCisJdTMyIHZlcnNpb247Cit9OworCisvKiBhdWRpdCBjYWxsYmFjayBmb3IgdW5wYWNrIGZpZWxkcyAqLworc3RhdGljIHZvaWQgYXVkaXRfY2Ioc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHZvaWQgKnZhKQoreworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSAqc2EgPSB2YTsKKwlpZiAoc2EtPmFhZC5pZmFjZS50YXJnZXQpIHsKKwkJc3RydWN0IGFhX3Byb2ZpbGUgKm5hbWUgPSBzYS0+YWFkLmlmYWNlLnRhcmdldDsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBuYW1lPSIpOworCQlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCBuYW1lLT5iYXNlLmhuYW1lKTsKKwl9CisJaWYgKHNhLT5hYWQuaWZhY2UucG9zKQorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG9mZnNldD0lbGQiLCBzYS0+YWFkLmlmYWNlLnBvcyk7Cit9CisKKy8qKgorICogYXVkaXRfaWZhY2UgLSBkbyBhdWRpdCBtZXNzYWdlIGZvciBwb2xpY3kgdW5wYWNraW5nL2xvYWQvcmVwbGFjZS9yZW1vdmUKKyAqIEBuZXc6IHByb2ZpbGUgaWYgaXQgaGFzIGJlZW4gYWxsb2NhdGVkIChNQVlCRSBOVUxMKQorICogQG5hbWU6IG5hbWUgb2YgdGhlIHByb2ZpbGUgYmVpbmcgbWFuaXB1bGF0ZWQgKE1BWUJFIE5VTEwpCisgKiBAaW5mbzogYW55IGV4dHJhIGluZm8gYWJvdXQgdGhlIGZhaWx1cmUgKE1BWUJFIE5VTEwpCisgKiBAZTogYnVmZmVyIHBvc2l0aW9uIGluZm8gKE5PVCBOVUxMKQorICogQGVycm9yOiBlcnJvciBjb2RlCisgKgorICogUmV0dXJuczogJTAgb3IgZXJyb3IKKyAqLworc3RhdGljIGludCBhdWRpdF9pZmFjZShzdHJ1Y3QgYWFfcHJvZmlsZSAqbmV3LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY29uc3QgY2hhciAqaW5mbywgc3RydWN0IGFhX2V4dCAqZSwgaW50IGVycm9yKQoreworCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlID0gX19hYV9jdXJyZW50X3Byb2ZpbGUoKTsKKwlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgc2E7CisJQ09NTU9OX0FVRElUX0RBVEFfSU5JVCgmc2EsIE5PTkUpOworCXNhLmFhZC5pZmFjZS5wb3MgPSBlLT5wb3MgLSBlLT5zdGFydDsKKwlzYS5hYWQuaWZhY2UudGFyZ2V0ID0gbmV3OworCXNhLmFhZC5uYW1lID0gbmFtZTsKKwlzYS5hYWQuaW5mbyA9IGluZm87CisJc2EuYWFkLmVycm9yID0gZXJyb3I7CisKKwlyZXR1cm4gYWFfYXVkaXQoQVVESVRfQVBQQVJNT1JfU1RBVFVTLCBwcm9maWxlLCBHRlBfS0VSTkVMLCAmc2EsCisJCQlhdWRpdF9jYik7Cit9CisKKy8qIHRlc3QgaWYgcmVhZCB3aWxsIGJlIGluIHBhY2tlZCBkYXRhIGJvdW5kcyAqLworc3RhdGljIGJvb2wgaW5ib3VuZHMoc3RydWN0IGFhX2V4dCAqZSwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIChzaXplIDw9IGUtPmVuZCAtIGUtPnBvcyk7Cit9CisKKy8qKgorICogYWFfdTE2X2NodW5jayAtIHRlc3QgYW5kIGRvIGJvdW5kcyBjaGVja2luZyBmb3IgYSB1MTYgc2l6ZSBiYXNlZCBjaHVuaworICogQGU6IHNlcmlhbGl6ZWQgZGF0YSByZWFkIGhlYWQgKE5PVCBOVUxMKQorICogQGNodW5rOiBzdGFydCBhZGRyZXNzIGZvciBjaHVuayBvZiBkYXRhIChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiB0aGUgc2l6ZSBvZiBjaHVuayBmb3VuZCB3aXRoIHRoZSByZWFkIGhlYWQgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuCisgKi8KK3N0YXRpYyBzaXplX3QgdW5wYWNrX3UxNl9jaHVuayhzdHJ1Y3QgYWFfZXh0ICplLCBjaGFyICoqY2h1bmspCit7CisJc2l6ZV90IHNpemUgPSAwOworCisJaWYgKCFpbmJvdW5kcyhlLCBzaXplb2YodTE2KSkpCisJCXJldHVybiAwOworCXNpemUgPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MTYgKikgZS0+cG9zKSk7CisJZS0+cG9zICs9IHNpemVvZih1MTYpOworCWlmICghaW5ib3VuZHMoZSwgc2l6ZSkpCisJCXJldHVybiAwOworCSpjaHVuayA9IGUtPnBvczsKKwllLT5wb3MgKz0gc2l6ZTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyogdW5wYWNrIGNvbnRyb2wgYnl0ZSAqLworc3RhdGljIGJvb2wgdW5wYWNrX1goc3RydWN0IGFhX2V4dCAqZSwgZW51bSBhYV9jb2RlIGNvZGUpCit7CisJaWYgKCFpbmJvdW5kcyhlLCAxKSkKKwkJcmV0dXJuIDA7CisJaWYgKCoodTggKikgZS0+cG9zICE9IGNvZGUpCisJCXJldHVybiAwOworCWUtPnBvcysrOworCXJldHVybiAxOworfQorCisvKioKKyAqIHVucGFja19uYW1lWCAtIGNoZWNrIGlzIHRoZSBuZXh0IGVsZW1lbnQgaXMgb2YgdHlwZSBYIHdpdGggYSBuYW1lIG9mIEBuYW1lCisgKiBAZTogc2VyaWFsaXplZCBkYXRhIGV4dGVudCBpbmZvcm1hdGlvbiAgKE5PVCBOVUxMKQorICogQGNvZGU6IHR5cGUgY29kZQorICogQG5hbWU6IG5hbWUgdG8gbWF0Y2ggdG8gdGhlIHNlcmlhbGl6ZWQgZWxlbWVudC4gIChNQVlCRSBOVUxMKQorICoKKyAqIGNoZWNrIHRoYXQgdGhlIG5leHQgc2VyaWFsaXplZCBkYXRhIGVsZW1lbnQgaXMgb2YgdHlwZSBYIGFuZCBoYXMgYSB0YWcKKyAqIG5hbWUgQG5hbWUuICBJZiBAbmFtZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcKKyAqIG5hbWUgZWxlbWVudCBpbiB0aGUgc3RyZWFtLiAgSWYgQG5hbWUgaXMgTlVMTCBhbnkgbmFtZSBlbGVtZW50IHdpbGwgYmUKKyAqIHNraXBwZWQgYW5kIG9ubHkgdGhlIHR5cGVjb2RlIHdpbGwgYmUgdGVzdGVkLgorICoKKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzIChib3RoIHR5cGUgY29kZSBhbmQgbmFtZSB0ZXN0cyBtYXRjaCkgYW5kIHRoZSByZWFkCisgKiBoZWFkIGlzIGFkdmFuY2VkIHBhc3QgdGhlIGhlYWRlcnMKKyAqCisgKiBSZXR1cm5zOiAwIGlmIGVpdGhlciBtYXRjaCBmYWlscywgdGhlIHJlYWQgaGVhZCBkb2VzIG5vdCBtb3ZlCisgKi8KK3N0YXRpYyBib29sIHVucGFja19uYW1lWChzdHJ1Y3QgYWFfZXh0ICplLCBlbnVtIGFhX2NvZGUgY29kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKgorCSAqIE1heSBuZWVkIHRvIHJlc2V0IHBvcyBpZiBuYW1lIG9yIHR5cGUgZG9lc24ndCBtYXRjaAorCSAqLworCXZvaWQgKnBvcyA9IGUtPnBvczsKKwkvKgorCSAqIENoZWNrIGZvciBwcmVzZW5jZSBvZiBhIHRhZ25hbWUsIGFuZCBpZiBwcmVzZW50IG5hbWUgc2l6ZQorCSAqIEFBX05BTUUgdGFnIHZhbHVlIGlzIGEgdTE2LgorCSAqLworCWlmICh1bnBhY2tfWChlLCBBQV9OQU1FKSkgeworCQljaGFyICp0YWcgPSBOVUxMOworCQlzaXplX3Qgc2l6ZSA9IHVucGFja191MTZfY2h1bmsoZSwgJnRhZyk7CisJCS8qIGlmIGEgbmFtZSBpcyBzcGVjaWZpZWQgaXQgbXVzdCBtYXRjaC4gb3RoZXJ3aXNlIHNraXAgdGFnICovCisJCWlmIChuYW1lICYmICghc2l6ZSB8fCBzdHJjbXAobmFtZSwgdGFnKSkpCisJCQlnb3RvIGZhaWw7CisJfSBlbHNlIGlmIChuYW1lKSB7CisJCS8qIGlmIGEgbmFtZSBpcyBzcGVjaWZpZWQgYW5kIHRoZXJlIGlzIG5vIG5hbWUgdGFnIGZhaWwgKi8KKwkJZ290byBmYWlsOworCX0KKworCS8qIG5vdyBjaGVjayBpZiB0eXBlIGNvZGUgbWF0Y2hlcyAqLworCWlmICh1bnBhY2tfWChlLCBjb2RlKSkKKwkJcmV0dXJuIDE7CisKK2ZhaWw6CisJZS0+cG9zID0gcG9zOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCB1bnBhY2tfdTMyKHN0cnVjdCBhYV9leHQgKmUsIHUzMiAqZGF0YSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAodW5wYWNrX25hbWVYKGUsIEFBX1UzMiwgbmFtZSkpIHsKKwkJaWYgKCFpbmJvdW5kcyhlLCBzaXplb2YodTMyKSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGRhdGEpCisJCQkqZGF0YSA9IGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKHUzMiAqKSBlLT5wb3MpKTsKKwkJZS0+cG9zICs9IHNpemVvZih1MzIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIHVucGFja191NjQoc3RydWN0IGFhX2V4dCAqZSwgdTY0ICpkYXRhLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmICh1bnBhY2tfbmFtZVgoZSwgQUFfVTY0LCBuYW1lKSkgeworCQlpZiAoIWluYm91bmRzKGUsIHNpemVvZih1NjQpKSkKKwkJCXJldHVybiAwOworCQlpZiAoZGF0YSkKKwkJCSpkYXRhID0gbGU2NF90b19jcHUoZ2V0X3VuYWxpZ25lZCgodTY0ICopIGUtPnBvcykpOworCQllLT5wb3MgKz0gc2l6ZW9mKHU2NCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCB1bnBhY2tfYXJyYXkoc3RydWN0IGFhX2V4dCAqZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAodW5wYWNrX25hbWVYKGUsIEFBX0FSUkFZLCBuYW1lKSkgeworCQlpbnQgc2l6ZTsKKwkJaWYgKCFpbmJvdW5kcyhlLCBzaXplb2YodTE2KSkpCisJCQlyZXR1cm4gMDsKKwkJc2l6ZSA9IChpbnQpbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgodTE2ICopIGUtPnBvcykpOworCQllLT5wb3MgKz0gc2l6ZW9mKHUxNik7CisJCXJldHVybiBzaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCB1bnBhY2tfYmxvYihzdHJ1Y3QgYWFfZXh0ICplLCBjaGFyICoqYmxvYiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAodW5wYWNrX25hbWVYKGUsIEFBX0JMT0IsIG5hbWUpKSB7CisJCXUzMiBzaXplOworCQlpZiAoIWluYm91bmRzKGUsIHNpemVvZih1MzIpKSkKKwkJCXJldHVybiAwOworCQlzaXplID0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgodTMyICopIGUtPnBvcykpOworCQllLT5wb3MgKz0gc2l6ZW9mKHUzMik7CisJCWlmIChpbmJvdW5kcyhlLCAoc2l6ZV90KSBzaXplKSkgeworCQkJKmJsb2IgPSBlLT5wb3M7CisJCQllLT5wb3MgKz0gc2l6ZTsKKwkJCXJldHVybiBzaXplOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucGFja19zdHIoc3RydWN0IGFhX2V4dCAqZSwgY29uc3QgY2hhciAqKnN0cmluZywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpzcmNfc3RyOworCXNpemVfdCBzaXplID0gMDsKKwl2b2lkICpwb3MgPSBlLT5wb3M7CisJKnN0cmluZyA9IE5VTEw7CisJaWYgKHVucGFja19uYW1lWChlLCBBQV9TVFJJTkcsIG5hbWUpKSB7CisJCXNpemUgPSB1bnBhY2tfdTE2X2NodW5rKGUsICZzcmNfc3RyKTsKKwkJaWYgKHNpemUpIHsKKwkJCS8qIHN0cmluZ3MgYXJlIG51bGwgdGVybWluYXRlZCwgbGVuZ3RoIGlzIHNpemUgLSAxICovCisJCQlpZiAoc3JjX3N0cltzaXplIC0gMV0gIT0gMCkKKwkJCQlnb3RvIGZhaWw7CisJCQkqc3RyaW5nID0gc3JjX3N0cjsKKwkJfQorCX0KKwlyZXR1cm4gc2l6ZTsKKworZmFpbDoKKwllLT5wb3MgPSBwb3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX3N0cmR1cChzdHJ1Y3QgYWFfZXh0ICplLCBjaGFyICoqc3RyaW5nLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKnRtcDsKKwl2b2lkICpwb3MgPSBlLT5wb3M7CisJaW50IHJlcyA9IHVucGFja19zdHIoZSwgJnRtcCwgbmFtZSk7CisJKnN0cmluZyA9IE5VTEw7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuIDA7CisKKwkqc3RyaW5nID0ga21lbWR1cCh0bXAsIHJlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCEqc3RyaW5nKSB7CisJCWUtPnBvcyA9IHBvczsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB2ZXJpZnlfYWNjZXB0IC0gdmVyaWZ5IHRoZSBhY2NlcHQgdGFibGVzIG9mIGEgZGZhCisgKiBAZGZhOiBkZmEgdG8gdmVyaWZ5IGFjY2VwdCB0YWJsZXMgb2YgKE5PVCBOVUxMKQorICogQGZsYWdzOiBmbGFncyBnb3Zlcm5pbmcgZGZhCisgKgorICogUmV0dXJuczogMSBpZiB2YWxpZCBhY2NlcHQgdGFibGVzIGVsc2UgMCBpZiBlcnJvcgorICovCitzdGF0aWMgYm9vbCB2ZXJpZnlfYWNjZXB0KHN0cnVjdCBhYV9kZmEgKmRmYSwgaW50IGZsYWdzKQoreworCWludCBpOworCisJLyogdmVyaWZ5IGFjY2VwdCBwZXJtaXNzaW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBkZmEtPnRhYmxlc1tZWVREX0lEX0FDQ0VQVF0tPnRkX2xvbGVuOyBpKyspIHsKKwkJaW50IG1vZGUgPSBBQ0NFUFRfVEFCTEUoZGZhKVtpXTsKKworCQlpZiAobW9kZSAmIH5ERkFfVkFMSURfUEVSTV9NQVNLKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKEFDQ0VQVF9UQUJMRTIoZGZhKVtpXSAmIH5ERkFfVkFMSURfUEVSTTJfTUFTSykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiB1bnBhY2tfZGZhIC0gdW5wYWNrIGEgZmlsZSBydWxlIGRmYQorICogQGU6IHNlcmlhbGl6ZWQgZGF0YSBleHRlbnQgaW5mb3JtYXRpb24gKE5PVCBOVUxMKQorICoKKyAqIHJldHVybnMgZGZhIG9yIEVSUl9QVFIgb3IgTlVMTCBpZiBubyBkZmEKKyAqLworc3RhdGljIHN0cnVjdCBhYV9kZmEgKnVucGFja19kZmEoc3RydWN0IGFhX2V4dCAqZSkKK3sKKwljaGFyICpibG9iID0gTlVMTDsKKwlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3QgYWFfZGZhICpkZmEgPSBOVUxMOworCisJc2l6ZSA9IHVucGFja19ibG9iKGUsICZibG9iLCAiYWFkZmEiKTsKKwlpZiAoc2l6ZSkgeworCQkvKgorCQkgKiBUaGUgZGZhIGlzIGFsaWduZWQgd2l0aCBpbiB0aGUgYmxvYiB0byA4IGJ5dGVzCisJCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLgorCQkgKi8KKwkJc2l6ZV90IHN6ID0gYmxvYiAtIChjaGFyICopZS0+c3RhcnQ7CisJCXNpemVfdCBwYWQgPSBBTElHTihzeiwgOCkgLSBzejsKKwkJaW50IGZsYWdzID0gVE9fQUNDRVBUMV9GTEFHKFlZVERfREFUQTMyKSB8CisJCQlUT19BQ0NFUFQyX0ZMQUcoWVlURF9EQVRBMzIpOworCisKKwkJaWYgKGFhX2dfcGFyYW5vaWRfbG9hZCkKKwkJCWZsYWdzIHw9IERGQV9GTEFHX1ZFUklGWV9TVEFURVM7CisKKwkJZGZhID0gYWFfZGZhX3VucGFjayhibG9iICsgcGFkLCBzaXplIC0gcGFkLCBmbGFncyk7CisKKwkJaWYgKElTX0VSUihkZmEpKQorCQkJcmV0dXJuIGRmYTsKKworCQlpZiAoIXZlcmlmeV9hY2NlcHQoZGZhLCBmbGFncykpCisJCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIGRmYTsKKworZmFpbDoKKwlhYV9wdXRfZGZhKGRmYSk7CisJcmV0dXJuIEVSUl9QVFIoLUVQUk9UTyk7Cit9CisKKy8qKgorICogdW5wYWNrX3RyYW5zX3RhYmxlIC0gdW5wYWNrIGEgcHJvZmlsZSB0cmFuc2l0aW9uIHRhYmxlCisgKiBAZTogc2VyaWFsaXplZCBkYXRhIGV4dGVudCBpbmZvcm1hdGlvbiAgKE5PVCBOVUxMKQorICogQHByb2ZpbGU6IHByb2ZpbGUgdG8gYWRkIHRoZSBhY2NlcHQgdGFibGUgdG8gKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IDEgaWYgdGFibGUgc3VjY2VzZnVsbHkgdW5wYWNrZWQKKyAqLworc3RhdGljIGJvb2wgdW5wYWNrX3RyYW5zX3RhYmxlKHN0cnVjdCBhYV9leHQgKmUsIHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlKQoreworCXZvaWQgKnBvcyA9IGUtPnBvczsKKworCS8qIGV4ZWMgdGFibGUgaXMgb3B0aW9uYWwgKi8KKwlpZiAodW5wYWNrX25hbWVYKGUsIEFBX1NUUlVDVCwgInh0YWJsZSIpKSB7CisJCWludCBpLCBzaXplOworCisJCXNpemUgPSB1bnBhY2tfYXJyYXkoZSwgTlVMTCk7CisJCS8qIGN1cnJlbnRseSA0IGV4ZWMgYml0cyBhbmQgZW50cmllcyAwLTMgYXJlIHJlc2VydmVkIGl1cGN4ICovCisJCWlmIChzaXplID4gMTYgLSA0KQorCQkJZ290byBmYWlsOworCQlwcm9maWxlLT5maWxlLnRyYW5zLnRhYmxlID0ga3phbGxvYyhzaXplb2YoY2hhciAqKSAqIHNpemUsCisJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcHJvZmlsZS0+ZmlsZS50cmFucy50YWJsZSkKKwkJCWdvdG8gZmFpbDsKKworCQlwcm9maWxlLT5maWxlLnRyYW5zLnNpemUgPSBzaXplOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQljaGFyICpzdHI7CisJCQlpbnQgYywgaiwgc2l6ZSA9IHVucGFja19zdHJkdXAoZSwgJnN0ciwgTlVMTCk7CisJCQkvKiB1bnBhY2tfc3RyZHVwIHZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgY2hhcmFjdGVyIGlzCisJCQkgKiBudWxsIHRlcm1pbmF0aW9uIGJ5dGUuCisJCQkgKi8KKwkJCWlmICghc2l6ZSkKKwkJCQlnb3RvIGZhaWw7CisJCQlwcm9maWxlLT5maWxlLnRyYW5zLnRhYmxlW2ldID0gc3RyOworCQkJLyogdmVyaWZ5IHRoYXQgbmFtZSBkb2Vzbid0IHN0YXJ0IHdpdGggc3BhY2UgKi8KKwkJCWlmIChpc3NwYWNlKCpzdHIpKQorCQkJCWdvdG8gZmFpbDsKKworCQkJLyogY291bnQgaW50ZXJuYWwgIyAgb2YgaW50ZXJuYWwgXDAgKi8KKwkJCWZvciAoYyA9IGogPSAwOyBqIDwgc2l6ZSAtIDI7IGorKykgeworCQkJCWlmICghc3RyW2pdKQorCQkJCQljKys7CisJCQl9CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQkvKiBiZWdpbm5pbmcgd2l0aCA6IHJlcXVpcmVzIGFuIGVtYmVkZGVkIFwwLAorCQkJCSAqIHZlcmlmeSB0aGF0IGV4YWN0bHkgMSBpbnRlcm5hbCBcMCBleGlzdHMKKwkJCQkgKiB0cmFpbGluZyBcMCBhbHJlYWR5IHZlcmlmaWVkIGJ5IHVucGFja19zdHJkdXAKKwkJCQkgKi8KKwkJCQlpZiAoYyAhPSAxKQorCQkJCQlnb3RvIGZhaWw7CisJCQkJLyogZmlyc3QgY2hhcmFjdGVyIGFmdGVyIDogbXVzdCBiZSB2YWxpZCAqLworCQkJCWlmICghc3RyWzFdKQorCQkJCQlnb3RvIGZhaWw7CisJCQl9IGVsc2UgaWYgKGMpCisJCQkJLyogZmFpbCAtIGFsbCBvdGhlciBjYXNlcyB3aXRoIGVtYmVkZGVkIFwwICovCisJCQkJZ290byBmYWlsOworCQl9CisJCWlmICghdW5wYWNrX25hbWVYKGUsIEFBX0FSUkFZRU5ELCBOVUxMKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCF1bnBhY2tfbmFtZVgoZSwgQUFfU1RSVUNURU5ELCBOVUxMKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIDE7CisKK2ZhaWw6CisJYWFfZnJlZV9kb21haW5fZW50cmllcygmcHJvZmlsZS0+ZmlsZS50cmFucyk7CisJZS0+cG9zID0gcG9zOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCB1bnBhY2tfcmxpbWl0cyhzdHJ1Y3QgYWFfZXh0ICplLCBzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwl2b2lkICpwb3MgPSBlLT5wb3M7CisKKwkvKiBybGltaXRzIGFyZSBvcHRpb25hbCAqLworCWlmICh1bnBhY2tfbmFtZVgoZSwgQUFfU1RSVUNULCAicmxpbWl0cyIpKSB7CisJCWludCBpLCBzaXplOworCQl1MzIgdG1wID0gMDsKKwkJaWYgKCF1bnBhY2tfdTMyKGUsICZ0bXAsIE5VTEwpKQorCQkJZ290byBmYWlsOworCQlwcm9maWxlLT5ybGltaXRzLm1hc2sgPSB0bXA7CisKKwkJc2l6ZSA9IHVucGFja19hcnJheShlLCBOVUxMKTsKKwkJaWYgKHNpemUgPiBSTElNX05MSU1JVFMpCisJCQlnb3RvIGZhaWw7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXU2NCB0bXAgPSAwOworCQkJaW50IGEgPSBhYV9tYXBfcmVzb3VyY2UoaSk7CisJCQlpZiAoIXVucGFja191NjQoZSwgJnRtcCwgTlVMTCkpCisJCQkJZ290byBmYWlsOworCQkJcHJvZmlsZS0+cmxpbWl0cy5saW1pdHNbYV0ucmxpbV9tYXggPSB0bXA7CisJCX0KKwkJaWYgKCF1bnBhY2tfbmFtZVgoZSwgQUFfQVJSQVlFTkQsIE5VTEwpKQorCQkJZ290byBmYWlsOworCQlpZiAoIXVucGFja19uYW1lWChlLCBBQV9TVFJVQ1RFTkQsIE5VTEwpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMTsKKworZmFpbDoKKwllLT5wb3MgPSBwb3M7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdW5wYWNrX3Byb2ZpbGUgLSB1bnBhY2sgYSBzZXJpYWxpemVkIHByb2ZpbGUKKyAqIEBlOiBzZXJpYWxpemVkIGRhdGEgZXh0ZW50IGluZm9ybWF0aW9uIChOT1QgTlVMTCkKKyAqCisgKiBOT1RFOiB1bnBhY2sgcHJvZmlsZSBzZXRzIGF1ZGl0IHN0cnVjdCBpZiB0aGVyZSBpcyBhIGZhaWx1cmUKKyAqLworc3RhdGljIHN0cnVjdCBhYV9wcm9maWxlICp1bnBhY2tfcHJvZmlsZShzdHJ1Y3QgYWFfZXh0ICplKQoreworCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlID0gTlVMTDsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAtRVBST1RPOworCWtlcm5lbF9jYXBfdCB0bXBjYXA7CisJdTMyIHRtcDsKKworCS8qIGNoZWNrIHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgc3RydWN0IGJlaW5nIHBhc3NlZCAqLworCWlmICghdW5wYWNrX25hbWVYKGUsIEFBX1NUUlVDVCwgInByb2ZpbGUiKSkKKwkJZ290byBmYWlsOworCWlmICghdW5wYWNrX3N0cihlLCAmbmFtZSwgTlVMTCkpCisJCWdvdG8gZmFpbDsKKworCXByb2ZpbGUgPSBhYV9hbGxvY19wcm9maWxlKG5hbWUpOworCWlmICghcHJvZmlsZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKiBwcm9maWxlIHJlbmFtaW5nIGlzIG9wdGlvbmFsICovCisJKHZvaWQpIHVucGFja19zdHIoZSwgJnByb2ZpbGUtPnJlbmFtZSwgInJlbmFtZSIpOworCisJLyogeG1hdGNoIGlzIG9wdGlvbmFsIGFuZCBtYXkgYmUgTlVMTCAqLworCXByb2ZpbGUtPnhtYXRjaCA9IHVucGFja19kZmEoZSk7CisJaWYgKElTX0VSUihwcm9maWxlLT54bWF0Y2gpKSB7CisJCWVycm9yID0gUFRSX0VSUihwcm9maWxlLT54bWF0Y2gpOworCQlwcm9maWxlLT54bWF0Y2ggPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCS8qIHhtYXRjaF9sZW4gaXMgbm90IG9wdGlvbmFsIGlmIHhtYXRjaCBpcyBzZXQgKi8KKwlpZiAocHJvZmlsZS0+eG1hdGNoKSB7CisJCWlmICghdW5wYWNrX3UzMihlLCAmdG1wLCBOVUxMKSkKKwkJCWdvdG8gZmFpbDsKKwkJcHJvZmlsZS0+eG1hdGNoX2xlbiA9IHRtcDsKKwl9CisKKwkvKiBwZXIgcHJvZmlsZSBkZWJ1ZyBmbGFncyAoY29tcGxhaW4sIGF1ZGl0KSAqLworCWlmICghdW5wYWNrX25hbWVYKGUsIEFBX1NUUlVDVCwgImZsYWdzIikpCisJCWdvdG8gZmFpbDsKKwlpZiAoIXVucGFja191MzIoZSwgJnRtcCwgTlVMTCkpCisJCWdvdG8gZmFpbDsKKwlpZiAodG1wKQorCQlwcm9maWxlLT5mbGFncyB8PSBQRkxBR19IQVQ7CisJaWYgKCF1bnBhY2tfdTMyKGUsICZ0bXAsIE5VTEwpKQorCQlnb3RvIGZhaWw7CisJaWYgKHRtcCkKKwkJcHJvZmlsZS0+bW9kZSA9IEFQUEFSTU9SX0NPTVBMQUlOOworCWlmICghdW5wYWNrX3UzMihlLCAmdG1wLCBOVUxMKSkKKwkJZ290byBmYWlsOworCWlmICh0bXApCisJCXByb2ZpbGUtPmF1ZGl0ID0gQVVESVRfQUxMOworCisJaWYgKCF1bnBhY2tfbmFtZVgoZSwgQUFfU1RSVUNURU5ELCBOVUxMKSkKKwkJZ290byBmYWlsOworCisJLyogcGF0aF9mbGFncyBpcyBvcHRpb25hbCAqLworCWlmICh1bnBhY2tfdTMyKGUsICZwcm9maWxlLT5wYXRoX2ZsYWdzLCAicGF0aF9mbGFncyIpKQorCQlwcm9maWxlLT5wYXRoX2ZsYWdzIHw9IHByb2ZpbGUtPmZsYWdzICYgUEZMQUdfTUVESUFURV9ERUxFVEVEOworCWVsc2UKKwkJLyogc2V0IGEgZGVmYXVsdCB2YWx1ZSBpZiBwYXRoX2ZsYWdzIGZpZWxkIGlzIG5vdCBwcmVzZW50ICovCisJCXByb2ZpbGUtPnBhdGhfZmxhZ3MgPSBQRkxBR19NRURJQVRFX0RFTEVURUQ7CisKKwlpZiAoIXVucGFja191MzIoZSwgJihwcm9maWxlLT5jYXBzLmFsbG93LmNhcFswXSksIE5VTEwpKQorCQlnb3RvIGZhaWw7CisJaWYgKCF1bnBhY2tfdTMyKGUsICYocHJvZmlsZS0+Y2Fwcy5hdWRpdC5jYXBbMF0pLCBOVUxMKSkKKwkJZ290byBmYWlsOworCWlmICghdW5wYWNrX3UzMihlLCAmKHByb2ZpbGUtPmNhcHMucXVpZXQuY2FwWzBdKSwgTlVMTCkpCisJCWdvdG8gZmFpbDsKKwlpZiAoIXVucGFja191MzIoZSwgJnRtcGNhcC5jYXBbMF0sIE5VTEwpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAodW5wYWNrX25hbWVYKGUsIEFBX1NUUlVDVCwgImNhcHM2NCIpKSB7CisJCS8qIG9wdGlvbmFsIHVwcGVyIGhhbGYgb2YgNjQgYml0IGNhcHMgKi8KKwkJaWYgKCF1bnBhY2tfdTMyKGUsICYocHJvZmlsZS0+Y2Fwcy5hbGxvdy5jYXBbMV0pLCBOVUxMKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCF1bnBhY2tfdTMyKGUsICYocHJvZmlsZS0+Y2Fwcy5hdWRpdC5jYXBbMV0pLCBOVUxMKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCF1bnBhY2tfdTMyKGUsICYocHJvZmlsZS0+Y2Fwcy5xdWlldC5jYXBbMV0pLCBOVUxMKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCF1bnBhY2tfdTMyKGUsICYodG1wY2FwLmNhcFsxXSksIE5VTEwpKQorCQkJZ290byBmYWlsOworCQlpZiAoIXVucGFja19uYW1lWChlLCBBQV9TVFJVQ1RFTkQsIE5VTEwpKQorCQkJZ290byBmYWlsOworCX0KKworCWlmICh1bnBhY2tfbmFtZVgoZSwgQUFfU1RSVUNULCAiY2Fwc3giKSkgeworCQkvKiBvcHRpb25hbCBleHRlbmRlZCBjYXBzIG1lZGlhdGlvbiBtYXNrICovCisJCWlmICghdW5wYWNrX3UzMihlLCAmKHByb2ZpbGUtPmNhcHMuZXh0ZW5kZWQuY2FwWzBdKSwgTlVMTCkpCisJCQlnb3RvIGZhaWw7CisJCWlmICghdW5wYWNrX3UzMihlLCAmKHByb2ZpbGUtPmNhcHMuZXh0ZW5kZWQuY2FwWzFdKSwgTlVMTCkpCisJCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCF1bnBhY2tfcmxpbWl0cyhlLCBwcm9maWxlKSkKKwkJZ290byBmYWlsOworCisJLyogZ2V0IGZpbGUgcnVsZXMgKi8KKwlwcm9maWxlLT5maWxlLmRmYSA9IHVucGFja19kZmEoZSk7CisJaWYgKElTX0VSUihwcm9maWxlLT5maWxlLmRmYSkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHByb2ZpbGUtPmZpbGUuZGZhKTsKKwkJcHJvZmlsZS0+ZmlsZS5kZmEgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCF1bnBhY2tfdTMyKGUsICZwcm9maWxlLT5maWxlLnN0YXJ0LCAiZGZhX3N0YXJ0IikpCisJCS8qIGRlZmF1bHQgc3RhcnQgc3RhdGUgKi8KKwkJcHJvZmlsZS0+ZmlsZS5zdGFydCA9IERGQV9TVEFSVDsKKworCWlmICghdW5wYWNrX3RyYW5zX3RhYmxlKGUsIHByb2ZpbGUpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIXVucGFja19uYW1lWChlLCBBQV9TVFJVQ1RFTkQsIE5VTEwpKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gcHJvZmlsZTsKKworZmFpbDoKKwlpZiAocHJvZmlsZSkKKwkJbmFtZSA9IE5VTEw7CisJZWxzZSBpZiAoIW5hbWUpCisJCW5hbWUgPSAidW5rbm93biI7CisJYXVkaXRfaWZhY2UocHJvZmlsZSwgbmFtZSwgImZhaWxlZCB0byB1bnBhY2sgcHJvZmlsZSIsIGUsIGVycm9yKTsKKwlhYV9wdXRfcHJvZmlsZShwcm9maWxlKTsKKworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworLyoqCisgKiB2ZXJpZnlfaGVhZCAtIHVucGFjayBzZXJpYWxpemVkIHN0cmVhbSBoZWFkZXIKKyAqIEBlOiBzZXJpYWxpemVkIGRhdGEgcmVhZCBoZWFkIChOT1QgTlVMTCkKKyAqIEBuczogUmV0dXJucyAtIG5hbWVzcGFjZSBpZiBvbmUgaXMgc3BlY2lmaWVkIGVsc2UgTlVMTCAoTk9UIE5VTEwpCisgKgorICogUmV0dXJuczogZXJyb3Igb3IgMCBpZiBoZWFkZXIgaXMgZ29vZAorICovCitzdGF0aWMgaW50IHZlcmlmeV9oZWFkZXIoc3RydWN0IGFhX2V4dCAqZSwgY29uc3QgY2hhciAqKm5zKQoreworCWludCBlcnJvciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJLyogZ2V0IHRoZSBpbnRlcmZhY2UgdmVyc2lvbiAqLworCWlmICghdW5wYWNrX3UzMihlLCAmZS0+dmVyc2lvbiwgInZlcnNpb24iKSkgeworCQlhdWRpdF9pZmFjZShOVUxMLCBOVUxMLCAiaW52YWxpZCBwcm9maWxlIGZvcm1hdCIsIGUsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIGNoZWNrIHRoYXQgdGhlIGludGVyZmFjZSB2ZXJzaW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKwlpZiAoZS0+dmVyc2lvbiAhPSA1KSB7CisJCWF1ZGl0X2lmYWNlKE5VTEwsIE5VTEwsICJ1bnN1cHBvcnRlZCBpbnRlcmZhY2UgdmVyc2lvbiIsIGUsCisJCQkgICAgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogcmVhZCB0aGUgbmFtZXNwYWNlIGlmIHByZXNlbnQgKi8KKwlpZiAoIXVucGFja19zdHIoZSwgbnMsICJuYW1lc3BhY2UiKSkKKwkJKm5zID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCB2ZXJpZnlfeGluZGV4KGludCB4aW5kZXgsIGludCB0YWJsZV9zaXplKQoreworCWludCBpbmRleCwgeHR5cGU7CisJeHR5cGUgPSB4aW5kZXggJiBBQV9YX1RZUEVfTUFTSzsKKwlpbmRleCA9IHhpbmRleCAmIEFBX1hfSU5ERVhfTUFTSzsKKwlpZiAoeHR5cGUgPT0gQUFfWF9UQUJMRSAmJiBpbmRleCA+IHRhYmxlX3NpemUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiB2ZXJpZnkgZGZhIHhpbmRleGVzIGFyZSBpbiByYW5nZSBvZiB0cmFuc2l0aW9uIHRhYmxlcyAqLworc3RhdGljIGJvb2wgdmVyaWZ5X2RmYV94aW5kZXgoc3RydWN0IGFhX2RmYSAqZGZhLCBpbnQgdGFibGVfc2l6ZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGZhLT50YWJsZXNbWVlURF9JRF9BQ0NFUFRdLT50ZF9sb2xlbjsgaSsrKSB7CisJCWlmICghdmVyaWZ5X3hpbmRleChkZmFfdXNlcl94aW5kZXgoZGZhLCBpKSwgdGFibGVfc2l6ZSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCF2ZXJpZnlfeGluZGV4KGRmYV9vdGhlcl94aW5kZXgoZGZhLCBpKSwgdGFibGVfc2l6ZSkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogdmVyaWZ5X3Byb2ZpbGUgLSBEbyBwb3N0IHVucGFjayBhbmFseXNpcyB0byB2ZXJpZnkgcHJvZmlsZSBjb25zaXN0ZW5jeQorICogQHByb2ZpbGU6IHByb2ZpbGUgdG8gdmVyaWZ5IChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiAwIGlmIHBhc3NlcyB2ZXJpZmljYXRpb24gZWxzZSBlcnJvcgorICovCitzdGF0aWMgaW50IHZlcmlmeV9wcm9maWxlKHN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlKQoreworCWlmIChhYV9nX3BhcmFub2lkX2xvYWQpIHsKKwkJaWYgKHByb2ZpbGUtPmZpbGUuZGZhICYmCisJCSAgICAhdmVyaWZ5X2RmYV94aW5kZXgocHJvZmlsZS0+ZmlsZS5kZmEsCisJCQkJICAgICAgIHByb2ZpbGUtPmZpbGUudHJhbnMuc2l6ZSkpIHsKKwkJCWF1ZGl0X2lmYWNlKHByb2ZpbGUsIE5VTEwsICJJbnZhbGlkIG5hbWVkIHRyYW5zaXRpb24iLAorCQkJCSAgICBOVUxMLCAtRVBST1RPKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWFfdW5wYWNrIC0gdW5wYWNrIHBhY2tlZCBiaW5hcnkgcHJvZmlsZSBkYXRhIGxvYWRlZCBmcm9tIHVzZXIgc3BhY2UKKyAqIEB1ZGF0YTogdXNlciBkYXRhIGNvcGllZCB0byBrbWVtICAoTk9UIE5VTEwpCisgKiBAc2l6ZTogdGhlIHNpemUgb2YgdGhlIHVzZXIgZGF0YQorICogQG5zOiBSZXR1cm5zIG5hbWVzcGFjZSBwcm9maWxlIGlzIGluIGlmIHNwZWNpZmllZCBlbHNlIE5VTEwgKE5PVCBOVUxMKQorICoKKyAqIFVucGFjayB1c2VyIGRhdGEgYW5kIHJldHVybiByZWZjb3VudGVkIGFsbG9jYXRlZCBwcm9maWxlIG9yIEVSUl9QVFIKKyAqCisgKiBSZXR1cm5zOiBwcm9maWxlIGVsc2UgZXJyb3IgcG9pbnRlciBpZiBmYWlscyB0byB1bnBhY2sKKyAqLworc3RydWN0IGFhX3Byb2ZpbGUgKmFhX3VucGFjayh2b2lkICp1ZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKipucykKK3sKKwlzdHJ1Y3QgYWFfcHJvZmlsZSAqcHJvZmlsZSA9IE5VTEw7CisJaW50IGVycm9yOworCXN0cnVjdCBhYV9leHQgZSA9IHsKKwkJLnN0YXJ0ID0gdWRhdGEsCisJCS5lbmQgPSB1ZGF0YSArIHNpemUsCisJCS5wb3MgPSB1ZGF0YSwKKwl9OworCisJZXJyb3IgPSB2ZXJpZnlfaGVhZGVyKCZlLCBucyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisKKwlwcm9maWxlID0gdW5wYWNrX3Byb2ZpbGUoJmUpOworCWlmIChJU19FUlIocHJvZmlsZSkpCisJCXJldHVybiBwcm9maWxlOworCisJZXJyb3IgPSB2ZXJpZnlfcHJvZmlsZShwcm9maWxlKTsKKwlpZiAoZXJyb3IpIHsKKwkJYWFfcHV0X3Byb2ZpbGUocHJvZmlsZSk7CisJCXByb2ZpbGUgPSBFUlJfUFRSKGVycm9yKTsKKwl9CisKKwkvKiByZXR1cm4gcmVmY291bnQgKi8KKwlyZXR1cm4gcHJvZmlsZTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL3Byb2NhdHRyLmMgYi9zZWN1cml0eS9hcHBhcm1vci9wcm9jYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTJjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9wcm9jYXR0ci5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIC9wcm9jLzxwaWQ+L2F0dHIvIGludGVyZmFjZSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOCBOb3ZlbGwvU1VTRQorICogQ29weXJpZ2h0IDIwMDktMjAxMCBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZS9hcHBhcm1vci5oIgorI2luY2x1ZGUgImluY2x1ZGUvY29udGV4dC5oIgorI2luY2x1ZGUgImluY2x1ZGUvcG9saWN5LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9kb21haW4uaCIKKworCisvKioKKyAqIGFhX2dldHByb2NhdHRyIC0gUmV0dXJuIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIGZvciBAcHJvZmlsZQorICogQHByb2ZpbGU6IHRoZSBwcm9maWxlIHRvIHByaW50IHByb2ZpbGUgaW5mbyBhYm91dCAgKE5PVCBOVUxMKQorICogQHN0cmluZzogUmV0dXJucyAtIHN0cmluZyBjb250YWluaW5nIHRoZSBwcm9maWxlIGluZm8gKE5PVCBOVUxMKQorICoKKyAqIFJldHVybnM6IGxlbmd0aCBvZiBAc3RyaW5nIG9uIHN1Y2Nlc3MgZWxzZSBlcnJvciBvbiBmYWlsdXJlCisgKgorICogUmVxdWlyZXM6IHByb2ZpbGUgIT0gTlVMTAorICoKKyAqIENyZWF0ZXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZXNwYWNlX25hbWU6Ly9wcm9maWxlX25hbWUgZm9yCisgKiBAcHJvZmlsZS4KKyAqCisgKiBSZXR1cm5zOiBzaXplIG9mIHN0cmluZyBwbGFjZWQgaW4gQHN0cmluZyBlbHNlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYWFfZ2V0cHJvY2F0dHIoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIGNoYXIgKipzdHJpbmcpCit7CisJY2hhciAqc3RyOworCWludCBsZW4gPSAwLCBtb2RlX2xlbiA9IDAsIG5zX2xlbiA9IDAsIG5hbWVfbGVuOworCWNvbnN0IGNoYXIgKm1vZGVfc3RyID0gcHJvZmlsZV9tb2RlX25hbWVzW3Byb2ZpbGUtPm1vZGVdOworCWNvbnN0IGNoYXIgKm5zX25hbWUgPSBOVUxMOworCXN0cnVjdCBhYV9uYW1lc3BhY2UgKm5zID0gcHJvZmlsZS0+bnM7CisJc3RydWN0IGFhX25hbWVzcGFjZSAqY3VycmVudF9ucyA9IF9fYWFfY3VycmVudF9wcm9maWxlKCktPm5zOworCWNoYXIgKnM7CisKKwlpZiAoIWFhX25zX3Zpc2libGUoY3VycmVudF9ucywgbnMpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCW5zX25hbWUgPSBhYV9uc19uYW1lKGN1cnJlbnRfbnMsIG5zKTsKKwluc19sZW4gPSBzdHJsZW4obnNfbmFtZSk7CisKKwkvKiBpZiB0aGUgdmlzaWJsZSBuc19uYW1lIGlzID4gMCBpbmNyZWFzZSBzaXplIGZvciA6IDovLyBzZXBlcmF0b3IgKi8KKwlpZiAobnNfbGVuKQorCQluc19sZW4gKz0gNDsKKworCS8qIHVuY29uZmluZWQgcHJvZmlsZXMgZG9uJ3QgaGF2ZSBhIG1vZGUgc3RyaW5nIGFwcGVuZGVkICovCisJaWYgKCF1bmNvbmZpbmVkKHByb2ZpbGUpKQorCQltb2RlX2xlbiA9IHN0cmxlbihtb2RlX3N0cikgKyAzOwkvKiArIDMgZm9yIF8oKSAqLworCisJbmFtZV9sZW4gPSBzdHJsZW4ocHJvZmlsZS0+YmFzZS5obmFtZSk7CisJbGVuID0gbW9kZV9sZW4gKyBuc19sZW4gKyBuYW1lX2xlbiArIDE7CSAgICAvKiArIDEgZm9yIFxuICovCisJcyA9IHN0ciA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CSAgICAvKiArIDEgXDAgKi8KKwlpZiAoIXN0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobnNfbGVuKSB7CisJCS8qIHNraXAgb3ZlciBwcmVmaXggY3VycmVudF9ucy0+YmFzZS5obmFtZSBhbmQgc2VwYXJhdGluZyAvLyAqLworCQlzcHJpbnRmKHMsICI6JXM6Ly8iLCBuc19uYW1lKTsKKwkJcyArPSBuc19sZW47CisJfQorCWlmICh1bmNvbmZpbmVkKHByb2ZpbGUpKQorCQkvKiBtb2RlIHN0cmluZyBub3QgYmVpbmcgYXBwZW5kZWQgKi8KKwkJc3ByaW50ZihzLCAiJXNcbiIsIHByb2ZpbGUtPmJhc2UuaG5hbWUpOworCWVsc2UKKwkJc3ByaW50ZihzLCAiJXMgKCVzKVxuIiwgcHJvZmlsZS0+YmFzZS5obmFtZSwgbW9kZV9zdHIpOworCSpzdHJpbmcgPSBzdHI7CisKKwkvKiBOT1RFOiBsZW4gZG9lcyBub3QgaW5jbHVkZSBcMCBvZiBzdHJpbmcsIG5vdCBzYXZlZCBhcyBwYXJ0IG9mIGZpbGUgKi8KKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIHNwbGl0X3Rva2VuX2Zyb21fbmFtZSAtIHNlcGFyYXRlIGEgc3RyaW5nIG9mIGZvcm0gIDx0b2tlbj5ePG5hbWU+CisgKiBAb3A6IG9wZXJhdGlvbiBiZWluZyBjaGVja2VkCisgKiBAYXJnczogc3RyaW5nIHRvIHBhcnNlICAoTk9UIE5VTEwpCisgKiBAdG9rZW46IHN0b3JlcyByZXR1cm5lZCBwYXJzZWQgdG9rZW4gdmFsdWUgIChOT1QgTlVMTCkKKyAqCisgKiBSZXR1cm5zOiBzdGFydCBwb3NpdGlvbiBvZiBuYW1lIGFmdGVyIHRva2VuIGVsc2UgTlVMTCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBjaGFyICpzcGxpdF90b2tlbl9mcm9tX25hbWUoaW50IG9wLCBjaGFyICphcmdzLCB1NjQgKiB0b2tlbikKK3sKKwljaGFyICpuYW1lOworCisJKnRva2VuID0gc2ltcGxlX3N0cnRvdWxsKGFyZ3MsICZuYW1lLCAxNik7CisJaWYgKChuYW1lID09IGFyZ3MpIHx8ICpuYW1lICE9ICdeJykgeworCQlBQV9FUlJPUigiJXM6IEludmFsaWQgaW5wdXQgJyVzJyIsIG9wX3RhYmxlW29wXSwgYXJncyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCW5hbWUrKzsJCQkvKiBza2lwIF4gKi8KKwlpZiAoISpuYW1lKQorCQluYW1lID0gTlVMTDsKKwlyZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBhYV9zZXRwcm9jYXR0cl9jaGFnbmVoYXQgLSBoYW5kbGUgcHJvY2F0dHIgaW50ZXJmYWNlIHRvIGNoYW5nZV9oYXQKKyAqIEBhcmdzOiBhcmdzIHJlY2VpdmVkIGZyb20gd3JpdGluZyB0byAvcHJvYy88cGlkPi9hdHRyL2N1cnJlbnQgKE5PVCBOVUxMKQorICogQHNpemU6IHNpemUgb2YgdGhlIGFyZ3MKKyAqIEB0ZXN0OiB0cnVlIGlmIHRoaXMgaXMgYSB0ZXN0IG9mIGNoYW5nZV9oYXQgcGVybWlzc2lvbnMKKyAqCisgKiBSZXR1cm5zOiAlMCBvciBlcnJvciBjb2RlIGlmIGNoYW5nZV9oYXQgZmFpbHMKKyAqLworaW50IGFhX3NldHByb2NhdHRyX2NoYW5nZWhhdChjaGFyICphcmdzLCBzaXplX3Qgc2l6ZSwgaW50IHRlc3QpCit7CisJY2hhciAqaGF0OworCXU2NCB0b2tlbjsKKwljb25zdCBjaGFyICpoYXRzWzE2XTsJCS8qIGN1cnJlbnQgaGFyZCBsaW1pdCBvbiAjIG9mIG5hbWVzICovCisJaW50IGNvdW50ID0gMDsKKworCWhhdCA9IHNwbGl0X3Rva2VuX2Zyb21fbmFtZShPUF9DSEFOR0VfSEFULCBhcmdzLCAmdG9rZW4pOworCWlmIChJU19FUlIoaGF0KSkKKwkJcmV0dXJuIFBUUl9FUlIoaGF0KTsKKworCWlmICghaGF0ICYmICF0b2tlbikgeworCQlBQV9FUlJPUigiY2hhbmdlX2hhdDogSW52YWxpZCBpbnB1dCwgTlVMTCBoYXQgYW5kIE5VTEwgbWFnaWMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGhhdCkgeworCQkvKiBzZXQgdXAgaGF0IG5hbWUgdmVjdG9yLCBhcmdzIGd1YXJhbnRlZWQgbnVsbCB0ZXJtaW5hdGVkCisJCSAqIGF0IGFyZ3Nbc2l6ZV0gYnkgc2V0cHJvY2F0dHIuCisJCSAqCisJCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBoYXQgbmFtZXMgaW4gdGhlIGJ1ZmZlciBlYWNoIGlzCisJCSAqIHNlcGFyYXRlZCBieSBhIFwwLiAgSWUuIHVzZXJzcGFjZSB3cml0ZXMgdGhlbSBwcmUgdG9rZW5pemVkCisJCSAqLworCQljaGFyICplbmQgPSBhcmdzICsgc2l6ZTsKKwkJZm9yIChjb3VudCA9IDA7IChoYXQgPCBlbmQpICYmIGNvdW50IDwgMTY7ICsrY291bnQpIHsKKwkJCWNoYXIgKm5leHQgPSBoYXQgKyBzdHJsZW4oaGF0KSArIDE7CisJCQloYXRzW2NvdW50XSA9IGhhdDsKKwkJCWhhdCA9IG5leHQ7CisJCX0KKwl9CisKKwlBQV9ERUJVRygiJXM6IE1hZ2ljIDB4JWxseCBIYXQgJyVzJ1xuIiwKKwkJIF9fZnVuY19fLCB0b2tlbiwgaGF0ID8gaGF0IDogTlVMTCk7CisKKwlyZXR1cm4gYWFfY2hhbmdlX2hhdChoYXRzLCBjb3VudCwgdG9rZW4sIHRlc3QpOworfQorCisvKioKKyAqIGFhX3NldHByb2NhdHRyX2NoYW5nZXByb2ZpbGUgLSBoYW5kbGUgcHJvY2F0dHIgaW50ZXJmYWNlIHRvIGNoYW5nZXByb2ZpbGUKKyAqIEBmcW5hbWU6IGFyZ3MgcmVjZWl2ZWQgZnJvbSB3cml0dGluZyB0byAvcHJvYy88cGlkPi9hdHRyL2N1cnJlbnQgKE5PVCBOVUxMKQorICogQG9uZXhlYzogdHJ1ZSBpZiBjaGFuZ2VfcHJvZmlsZSBzaG91bGQgYmUgZGVsYXllZCB1bnRpbCBleGVjCisgKiBAdGVzdDogdHJ1ZSBpZiB0aGlzIGlzIGEgdGVzdCBvZiBjaGFuZ2VfcHJvZmlsZSBwZXJtaXNzaW9ucworICoKKyAqIFJldHVybnM6ICUwIG9yIGVycm9yIGNvZGUgaWYgY2hhbmdlX3Byb2ZpbGUgZmFpbHMKKyAqLworaW50IGFhX3NldHByb2NhdHRyX2NoYW5nZXByb2ZpbGUoY2hhciAqZnFuYW1lLCBib29sIG9uZXhlYywgaW50IHRlc3QpCit7CisJY2hhciAqbmFtZSwgKm5zX25hbWU7CisKKwluYW1lID0gYWFfc3BsaXRfZnFuYW1lKGZxbmFtZSwgJm5zX25hbWUpOworCXJldHVybiBhYV9jaGFuZ2VfcHJvZmlsZShuc19uYW1lLCBuYW1lLCBvbmV4ZWMsIHRlc3QpOworfQorCitpbnQgYWFfc2V0cHJvY2F0dHJfcGVybWlwYyhjaGFyICpmcW5hbWUpCit7CisJLyogVE9ETzogYWRkIGlwYyBwZXJtaXNzaW9uIHF1ZXJ5aW5nICovCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL3Jlc291cmNlLmMgYi9zZWN1cml0eS9hcHBhcm1vci9yZXNvdXJjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzY4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9yZXNvdXJjZS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEFwcEFybW9yIHJlc291cmNlIG1lZGlhdGlvbiBhbmQgYXR0YWNobWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA4IE5vdmVsbC9TVVNFCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9hdWRpdC5oIgorI2luY2x1ZGUgImluY2x1ZGUvcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3BvbGljeS5oIgorCisvKgorICogVGFibGUgb2YgcmxpbWl0IG5hbWVzOiB3ZSBnZW5lcmF0ZSBpdCBmcm9tIHJlc291cmNlLmguCisgKi8KKyNpbmNsdWRlICJybGltX25hbWVzLmgiCisKKy8qIGF1ZGl0IGNhbGxiYWNrIGZvciByZXNvdXJjZSBzcGVjaWZpYyBmaWVsZHMgKi8KK3N0YXRpYyB2b2lkIGF1ZGl0X2NiKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCB2b2lkICp2YSkKK3sKKwlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKnNhID0gdmE7CisKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHJsaW1pdD0lcyB2YWx1ZT0lbHUiLAorCQkJIHJsaW1fbmFtZXNbc2EtPmFhZC5ybGltLnJsaW1dLCBzYS0+YWFkLnJsaW0ubWF4KTsKK30KKworLyoqCisgKiBhdWRpdF9yZXNvdXJjZSAtIGF1ZGl0IHNldHRpbmcgcmVzb3VyY2UgbGltaXQKKyAqIEBwcm9maWxlOiBwcm9maWxlIGJlaW5nIGVuZm9yY2VkICAoTk9UIE5VTEwpCisgKiBAcmVzb3VyZTogcmxpbWl0IGJlaW5nIGF1ZGl0aW5nCisgKiBAdmFsdWU6IHZhbHVlIGJlaW5nIHNldAorICogQGVycm9yOiBlcnJvciB2YWx1ZQorICoKKyAqIFJldHVybnM6IDAgb3Igc2EtPmVycm9yIGVsc2Ugb3RoZXIgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYXVkaXRfcmVzb3VyY2Uoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHVuc2lnbmVkIGludCByZXNvdXJjZSwKKwkJCSAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IGVycm9yKQoreworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBzYTsKKworCUNPTU1PTl9BVURJVF9EQVRBX0lOSVQoJnNhLCBOT05FKTsKKwlzYS5hYWQub3AgPSBPUF9TRVRSTElNSVQsCisJc2EuYWFkLnJsaW0ucmxpbSA9IHJlc291cmNlOworCXNhLmFhZC5ybGltLm1heCA9IHZhbHVlOworCXNhLmFhZC5lcnJvciA9IGVycm9yOworCXJldHVybiBhYV9hdWRpdChBVURJVF9BUFBBUk1PUl9BVVRPLCBwcm9maWxlLCBHRlBfS0VSTkVMLCAmc2EsCisJCQlhdWRpdF9jYik7Cit9CisKKy8qKgorICogYWFfbWFwX3Jlc291Y2UgLSBtYXAgY29tcGlsZWQgcG9saWN5IHJlc291cmNlIHRvIGludGVybmFsICMKKyAqIEByZXNvdXJjZTogZmxhdHRlbmVkIHBvbGljeSByZXNvdXJjZSBudW1iZXIKKyAqCisgKiBSZXR1cm5zOiByZXNvdXJjZSAjIGZvciB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuCisgKgorICogcmxpbWl0IHJlc291cmNlIGNhbiB2YXJ5IGJhc2VkIG9uIGFyY2hpdGVjdHVyZSwgbWFwIHRoZSBjb21waWxlZCBwb2xpY3kKKyAqIHJlc291cmNlICMgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgYXJjaGl0ZWN0dXJlLgorICovCitpbnQgYWFfbWFwX3Jlc291cmNlKGludCByZXNvdXJjZSkKK3sKKwlyZXR1cm4gcmxpbV9tYXBbcmVzb3VyY2VdOworfQorCisvKioKKyAqIGFhX3Rhc2tfc2V0cmxpbWl0IC0gdGVzdCBwZXJtaXNzaW9uIHRvIHNldCBhbiBybGltaXQKKyAqIEBwcm9maWxlIC0gcHJvZmlsZSBjb25maW5pbmcgdGhlIHRhc2sgIChOT1QgTlVMTCkKKyAqIEByZXNvdXJjZSAtIHRoZSByZXNvdXJjZSBiZWluZyBzZXQKKyAqIEBuZXdfcmxpbSAtIHRoZSBuZXcgcmVzb3VyY2UgbGltaXQgIChOT1QgTlVMTCkKKyAqCisgKiBDb250cm9sIHJhaXNpbmcgdGhlIHByb2Nlc3NlcyBoYXJkIGxpbWl0LgorICoKKyAqIFJldHVybnM6IDAgb3IgZXJyb3IgY29kZSBpZiBzZXR0aW5nIHJlc291cmNlIGZhaWxlZAorICovCitpbnQgYWFfdGFza19zZXRybGltaXQoc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUsIHVuc2lnbmVkIGludCByZXNvdXJjZSwKKwkJICAgICAgc3RydWN0IHJsaW1pdCAqbmV3X3JsaW0pCit7CisJaW50IGVycm9yID0gMDsKKworCWlmIChwcm9maWxlLT5ybGltaXRzLm1hc2sgJiAoMSA8PCByZXNvdXJjZSkgJiYKKwkgICAgbmV3X3JsaW0tPnJsaW1fbWF4ID4gcHJvZmlsZS0+cmxpbWl0cy5saW1pdHNbcmVzb3VyY2VdLnJsaW1fbWF4KQorCisJCWVycm9yID0gYXVkaXRfcmVzb3VyY2UocHJvZmlsZSwgcmVzb3VyY2UsIG5ld19ybGltLT5ybGltX21heCwKKwkJCS1FQUNDRVMpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIF9fYWFfdHJhbnNpdGlvbl9ybGltaXRzIC0gYXBwbHkgbmV3IHByb2ZpbGUgcmxpbWl0cworICogQG9sZDogb2xkIHByb2ZpbGUgb24gdGFzayAgKE5PVCBOVUxMKQorICogQG5ldzogbmV3IHByb2ZpbGUgd2l0aCBybGltaXRzIHRvIGFwcGx5ICAoTk9UIE5VTEwpCisgKi8KK3ZvaWQgX19hYV90cmFuc2l0aW9uX3JsaW1pdHMoc3RydWN0IGFhX3Byb2ZpbGUgKm9sZCwgc3RydWN0IGFhX3Byb2ZpbGUgKm5ldykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJc3RydWN0IHJsaW1pdCAqcmxpbSwgKmluaXRybGltOworCWludCBpOworCisJLyogZm9yIGFueSBybGltaXRzIHRoZSBwcm9maWxlIGNvbnRyb2xsZWQgcmVzZXQgdGhlIHNvZnQgbGltaXQKKwkgKiB0byB0aGUgbGVzcyBvZiB0aGUgdGFza3MgaGFyZCBsaW1pdCBhbmQgdGhlIGluaXQgdGFza3Mgc29mdCBsaW1pdAorCSAqLworCWlmIChvbGQtPnJsaW1pdHMubWFzaykgeworCQlmb3IgKGkgPSAwLCBtYXNrID0gMTsgaSA8IFJMSU1fTkxJTUlUUzsgaSsrLCBtYXNrIDw8PSAxKSB7CisJCQlpZiAob2xkLT5ybGltaXRzLm1hc2sgJiBtYXNrKSB7CisJCQkJcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbSArIGk7CisJCQkJaW5pdHJsaW0gPSBpbml0X3Rhc2suc2lnbmFsLT5ybGltICsgaTsKKwkJCQlybGltLT5ybGltX2N1ciA9IG1pbihybGltLT5ybGltX21heCwKKwkJCQkJCSAgICAgaW5pdHJsaW0tPnJsaW1fY3VyKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIHNldCBhbnkgbmV3IGhhcmQgbGltaXRzIGFzIGRpY3RhdGVkIGJ5IHRoZSBuZXcgcHJvZmlsZSAqLworCWlmICghbmV3LT5ybGltaXRzLm1hc2spCisJCXJldHVybjsKKwlmb3IgKGkgPSAwLCBtYXNrID0gMTsgaSA8IFJMSU1fTkxJTUlUUzsgaSsrLCBtYXNrIDw8PSAxKSB7CisJCWlmICghKG5ldy0+cmxpbWl0cy5tYXNrICYgbWFzaykpCisJCQljb250aW51ZTsKKworCQlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltICsgaTsKKwkJcmxpbS0+cmxpbV9tYXggPSBtaW4ocmxpbS0+cmxpbV9tYXgsCisJCQkJICAgICBuZXctPnJsaW1pdHMubGltaXRzW2ldLnJsaW1fbWF4KTsKKwkJLyogc29mdCBsaW1pdCBzaG91bGQgbm90IGV4Y2VlZCBoYXJkIGxpbWl0ICovCisJCXJsaW0tPnJsaW1fY3VyID0gbWluKHJsaW0tPnJsaW1fY3VyLCBybGltLT5ybGltX21heCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3Ivc2lkLmMgYi9zZWN1cml0eS9hcHBhcm1vci9zaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGIzNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3Ivc2lkLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIEFwcEFybW9yIHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBBcHBBcm1vciBzZWN1cml0eSBpZGVudGlmaWVyIChzaWQpIG1hbmlwdWxhdGlvbiBmbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIENhbm9uaWNhbCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqCisgKiBBcHBBcm1vciBhbGxvY2F0ZXMgYSB1bmlxdWUgc2lkIGZvciBldmVyeSBwcm9maWxlIGxvYWRlZC4gIElmIGEgcHJvZmlsZQorICogaXMgcmVwbGFjZWQgaXQgcmVjZWl2ZXMgdGhlIHNpZCBvZiB0aGUgcHJvZmlsZSBpdCBpcyByZXBsYWNpbmcuCisgKgorICogVGhlIHNpZCB2YWx1ZSBvZiAwIGlzIGludmFsaWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvc2lkLmgiCisKKy8qIGdsb2JhbCBjb3VudGVyIGZyb20gd2hpY2ggc2lkcyBhcmUgYWxsb2NhdGVkICovCitzdGF0aWMgdTMyIGdsb2JhbF9zaWQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpZF9sb2NrKTsKKworLyogVE9ETyBGSVhNRTogYWRkIHNpZCB0byBwcm9maWxlIG1hcHBpbmcsIGFuZCBzaWQgcmVjeWNsaW5nICovCisKKy8qKgorICogYWFfYWxsb2Nfc2lkIC0gYWxsb2NhdGUgYSBuZXcgc2lkIGZvciBhIHByb2ZpbGUKKyAqLwordTMyIGFhX2FsbG9jX3NpZCh2b2lkKQoreworCXUzMiBzaWQ7CisKKwkvKgorCSAqIFRPRE8gRklYTUU6IHNpZCByZWN5Y2xpbmcgLSBwYXJ0IG9mIHByb2ZpbGUgbWFwcGluZyB0YWJsZQorCSAqLworCXNwaW5fbG9jaygmc2lkX2xvY2spOworCXNpZCA9ICgrK2dsb2JhbF9zaWQpOworCXNwaW5fdW5sb2NrKCZzaWRfbG9jayk7CisJcmV0dXJuIHNpZDsKK30KKworLyoqCisgKiBhYV9mcmVlX3NpZCAtIGZyZWUgYSBzaWQKKyAqIEBzaWQ6IHNpZCB0byBmcmVlCisgKi8KK3ZvaWQgYWFfZnJlZV9zaWQodTMyIHNpZCkKK3sKKwk7CQkJLyogTk9QIEFUTSAqLworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvY2FwYWJpbGl0eS5jIGIvc2VjdXJpdHkvY2FwYWJpbGl0eS5jCmluZGV4IDgxNjhlM2UuLmEwYmJmMzAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2NhcGFiaWxpdHkuYworKysgYi9zZWN1cml0eS9jYXBhYmlsaXR5LmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjYXBfYnBybV9jaGVja19zZWN1cml0eSAoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3N0YXRpYyBpbnQgY2FwX2Jwcm1fY2hlY2tfc2VjdXJpdHkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2OCw4ICsyNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNhcF9wYXRoX3RydW5jYXRlKHN0cnVjdCBwYXRoICpwYXRoLCBsb2ZmX3QgbGVuZ3RoLAotCQkJICAgICB1bnNpZ25lZCBpbnQgdGltZV9hdHRycykKK3N0YXRpYyBpbnQgY2FwX3BhdGhfdHJ1bmNhdGUoc3RydWN0IHBhdGggKnBhdGgpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbm9kZS5jIGIvc2VjdXJpdHkvaW5vZGUuYwppbmRleCAxYzgxMmU4Li44Yzc3N2YwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbm9kZS5jCisrKyBiL3NlY3VyaXR5L2lub2RlLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAkJCSBpbnQgbW9kZSwgZGV2X3QgZGV2KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JaW50IGVycm9yID0gLUVQRVJNOworCWludCBlcnJvciA9IC1FTk9NRU07CiAKIAlpZiAoZGVudHJ5LT5kX2lub2RlKQogCQlyZXR1cm4gLUVFWElTVDsKQEAgLTE2Niw2ICsxNjYsOCBAQAogCQkJZXJyb3IgPSBta2RpcihwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOwogCQllbHNlCiAJCQllcnJvciA9IGNyZWF0ZShwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOworCQlpZiAoZXJyb3IpCisJCQlkcHV0KCpkZW50cnkpOwogCX0gZWxzZQogCQllcnJvciA9IFBUUl9FUlIoKmRlbnRyeSk7CiAJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfZnMuYyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2ZzLmMKaW5kZXggOGZlNzM2YS4uZWYyMWI5NiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfZnMuYworKysgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9mcy5jCkBAIC00NSw3ICs0NSw4IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGltYV9odGFibGVfdmlvbGF0aW9uc19vcHMgPSB7Ci0JLnJlYWQgPSBpbWFfc2hvd19odGFibGVfdmlvbGF0aW9ucworCS5yZWFkID0gaW1hX3Nob3dfaHRhYmxlX3Zpb2xhdGlvbnMsCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgc3NpemVfdCBpbWFfc2hvd19tZWFzdXJlbWVudHNfY291bnQoc3RydWN0IGZpbGUgKmZpbHAsCkBAIC01Nyw3ICs1OCw4IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGltYV9tZWFzdXJlbWVudHNfY291bnRfb3BzID0gewotCS5yZWFkID0gaW1hX3Nob3dfbWVhc3VyZW1lbnRzX2NvdW50CisJLnJlYWQgPSBpbWFfc2hvd19tZWFzdXJlbWVudHNfY291bnQsCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiAvKiByZXR1cm5zIHBvaW50ZXIgdG8gaGxpc3Rfbm9kZSAqLwpAQCAtMzE5LDcgKzMyMSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbWFfbWVhc3VyZV9wb2xpY3lfb3BzID0gewogCS5vcGVuID0gaW1hX29wZW5fcG9saWN5LAogCS53cml0ZSA9IGltYV93cml0ZV9wb2xpY3ksCi0JLnJlbGVhc2UgPSBpbWFfcmVsZWFzZV9wb2xpY3kKKwkucmVsZWFzZSA9IGltYV9yZWxlYXNlX3BvbGljeSwKKwkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIGludCBfX2luaXQgaW1hX2ZzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaCBiL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaAppbmRleCAzODc4M2RjLi5hZGRiNjdiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2ludGVybmFsLmgKKysrIGIvc2VjdXJpdHkva2V5cy9pbnRlcm5hbC5oCkBAIC0xMTQsNiArMTE0LDEwIEBACiAJCQkJICAgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAogCQkJCSAgICBrZXlfbWF0Y2hfZnVuY190IG1hdGNoKTsKIAorZXh0ZXJuIGtleV9yZWZfdCBzZWFyY2hfbXlfcHJvY2Vzc19rZXlyaW5ncyhzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCisJCQkJCSAgICBjb25zdCB2b2lkICpkZXNjcmlwdGlvbiwKKwkJCQkJICAgIGtleV9tYXRjaF9mdW5jX3QgbWF0Y2gsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCk7CiBleHRlcm4ga2V5X3JlZl90IHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKIAkJCQkJIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAogCQkJCQkga2V5X21hdGNoX2Z1bmNfdCBtYXRjaCwKQEAgLTEzNCw2ICsxMzgsNyBAQAogCQkJCQlzdHJ1Y3Qga2V5ICpkZXN0X2tleXJpbmcsCiAJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCitleHRlcm4gaW50IGxvb2t1cF91c2VyX2tleV9wb3NzZXNzZWQoY29uc3Qgc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICp0YXJnZXQpOwogZXh0ZXJuIGtleV9yZWZfdCBsb29rdXBfdXNlcl9rZXkoa2V5X3NlcmlhbF90IGlkLCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCSBrZXlfcGVybV90IHBlcm0pOwogI2RlZmluZSBLRVlfTE9PS1VQX0NSRUFURQkweDAxCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwppbmRleCA2MjYxNzQ1Li5iMmIwOTk4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKQEAgLTUwNSwxMyArNTA1LDExIEBACiAKIAlyZXQgPSBzbnByaW50Zih0bXBidWYsIFBBR0VfU0laRSAtIDEsCiAJCSAgICAgICAiJXM7JWQ7JWQ7JTA4eDslcyIsCi0JCSAgICAgICBrZXlfcmVmX3RvX3B0cihrZXlfcmVmKS0+dHlwZS0+bmFtZSwKLQkJICAgICAgIGtleV9yZWZfdG9fcHRyKGtleV9yZWYpLT51aWQsCi0JCSAgICAgICBrZXlfcmVmX3RvX3B0cihrZXlfcmVmKS0+Z2lkLAotCQkgICAgICAga2V5X3JlZl90b19wdHIoa2V5X3JlZiktPnBlcm0sCi0JCSAgICAgICBrZXlfcmVmX3RvX3B0cihrZXlfcmVmKS0+ZGVzY3JpcHRpb24gPwotCQkgICAgICAga2V5X3JlZl90b19wdHIoa2V5X3JlZiktPmRlc2NyaXB0aW9uIDogIiIKLQkJICAgICAgICk7CisJCSAgICAgICBrZXktPnR5cGUtPm5hbWUsCisJCSAgICAgICBrZXktPnVpZCwKKwkJICAgICAgIGtleS0+Z2lkLAorCQkgICAgICAga2V5LT5wZXJtLAorCQkgICAgICAga2V5LT5kZXNjcmlwdGlvbiA/OiAiIik7CiAKIAkvKiBpbmNsdWRlIGEgTlVMIGNoYXIgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSAqLwogCWlmIChyZXQgPiBQQUdFX1NJWkUgLSAxKQpAQCAtMTA5MSw3ICsxMDg5LDcgQEAKIGxvbmcga2V5Y3RsX3NldF90aW1lb3V0KGtleV9zZXJpYWxfdCBpZCwgdW5zaWduZWQgdGltZW91dCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwotCXN0cnVjdCBrZXkgKmtleTsKKwlzdHJ1Y3Qga2V5ICprZXksICppbnN0a2V5OwogCWtleV9yZWZfdCBrZXlfcmVmOwogCXRpbWVfdCBleHBpcnk7CiAJbG9uZyByZXQ7CkBAIC0xMDk5LDEwICsxMDk3LDI1IEBACiAJa2V5X3JlZiA9IGxvb2t1cF91c2VyX2tleShpZCwgS0VZX0xPT0tVUF9DUkVBVEUgfCBLRVlfTE9PS1VQX1BBUlRJQUwsCiAJCQkJICBLRVlfU0VUQVRUUik7CiAJaWYgKElTX0VSUihrZXlfcmVmKSkgeworCQkvKiBzZXR0aW5nIHRoZSB0aW1lb3V0IG9uIGEga2V5IHVuZGVyIGNvbnN0cnVjdGlvbiBpcyBwZXJtaXR0ZWQKKwkJICogaWYgd2UgaGF2ZSB0aGUgYXV0aG9yaXNhdGlvbiB0b2tlbiBoYW5keSAqLworCQlpZiAoUFRSX0VSUihrZXlfcmVmKSA9PSAtRUFDQ0VTKSB7CisJCQlpbnN0a2V5ID0ga2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoaWQpOworCQkJaWYgKCFJU19FUlIoaW5zdGtleSkpIHsKKwkJCQlrZXlfcHV0KGluc3RrZXkpOworCQkJCWtleV9yZWYgPSBsb29rdXBfdXNlcl9rZXkoaWQsCisJCQkJCQkJICBLRVlfTE9PS1VQX1BBUlRJQUwsCisJCQkJCQkJICAwKTsKKwkJCQlpZiAoIUlTX0VSUihrZXlfcmVmKSkKKwkJCQkJZ290byBva2F5OworCQkJfQorCQl9CisKIAkJcmV0ID0gUFRSX0VSUihrZXlfcmVmKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKK29rYXk6CiAJa2V5ID0ga2V5X3JlZl90b19wdHIoa2V5X3JlZik7CiAKIAkvKiBtYWtlIHRoZSBjaGFuZ2VzIHdpdGggdGhlIGxvY2tzIGhlbGQgdG8gcHJldmVudCByYWNlcyAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9wcm9jLmMgYi9zZWN1cml0eS9rZXlzL3Byb2MuYwppbmRleCAwNjhiNjZlLi43MDM3Mzk2NiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9wcm9jLmMKKysrIGIvc2VjdXJpdHkva2V5cy9wcm9jLmMKQEAgLTE4NCwyMCArMTg0LDM2IEBACiAKIHN0YXRpYyBpbnQgcHJvY19rZXlzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogeworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CiAJc3RydWN0IHJiX25vZGUgKl9wID0gdjsKIAlzdHJ1Y3Qga2V5ICprZXkgPSByYl9lbnRyeShfcCwgc3RydWN0IGtleSwgc2VyaWFsX25vZGUpOwogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAJdW5zaWduZWQgbG9uZyB0aW1vOworCWtleV9yZWZfdCBrZXlfcmVmLCBza2V5X3JlZjsKIAljaGFyIHhidWZbMTJdOwogCWludCByYzsKIAorCWtleV9yZWYgPSBtYWtlX2tleV9yZWYoa2V5LCAwKTsKKworCS8qIGRldGVybWluZSBpZiB0aGUga2V5IGlzIHBvc3Nlc3NlZCBieSB0aGlzIHByb2Nlc3MgKGEgdGVzdCB3ZSBjYW4KKwkgKiBza2lwIGlmIHRoZSBrZXkgZG9lcyBub3QgaW5kaWNhdGUgdGhlIHBvc3Nlc3NvciBjYW4gdmlldyBpdAorCSAqLworCWlmIChrZXktPnBlcm0gJiBLRVlfUE9TX1ZJRVcpIHsKKwkJc2tleV9yZWYgPSBzZWFyY2hfbXlfcHJvY2Vzc19rZXlyaW5ncyhrZXktPnR5cGUsIGtleSwKKwkJCQkJCSAgICAgIGxvb2t1cF91c2VyX2tleV9wb3NzZXNzZWQsCisJCQkJCQkgICAgICBjcmVkKTsKKwkJaWYgKCFJU19FUlIoc2tleV9yZWYpKSB7CisJCQlrZXlfcmVmX3B1dChza2V5X3JlZik7CisJCQlrZXlfcmVmID0gbWFrZV9rZXlfcmVmKGtleSwgMSk7CisJCX0KKwl9CisKIAkvKiBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHRhc2sgaXMgYWxsb3dlZCB0byB2aWV3IHRoZSBrZXkgKGFzc3VtaW5nCiAJICogbm9uLXBvc3Nlc3Npb24pCiAJICogLSB0aGUgY2FsbGVyIGhvbGRzIGEgc3BpbmxvY2ssIGFuZCB0aHVzIHRoZSBSQ1UgcmVhZCBsb2NrLCBtYWtpbmcgb3VyCiAJICogICBhY2Nlc3MgdG8gX19jdXJyZW50X2NyZWQoKSBzYWZlCiAJICovCi0JcmMgPSBrZXlfdGFza19wZXJtaXNzaW9uKG1ha2Vfa2V5X3JlZihrZXksIDApLCBjdXJyZW50X2NyZWQoKSwKLQkJCQkgS0VZX1ZJRVcpOworCXJjID0ga2V5X3Rhc2tfcGVybWlzc2lvbihrZXlfcmVmLCBjcmVkLCBLRVlfVklFVyk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMgYi9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCmluZGV4IDZiOGU0ZmYuLmY4ZTcyNTEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKKysrIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwpAQCAtMzA5LDIyICszMDksMTkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHNlYXJjaCB0aGUgcHJvY2VzcyBrZXlyaW5ncyBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGtleQorICogc2VhcmNoIG9ubHkgbXkgcHJvY2VzcyBrZXlyaW5ncyBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGtleQogICogLSB3ZSB1c2UgdGhlIHN1cHBsaWVkIG1hdGNoIGZ1bmN0aW9uIHRvIHNlZSBpZiB0aGUgZGVzY3JpcHRpb24gKG9yIG90aGVyCiAgKiAgIGZlYXR1cmUgb2YgaW50ZXJlc3QpIG1hdGNoZXMKICAqIC0gd2UgcmV0dXJuIC1FQUdBSU4gaWYgd2UgZGlkbid0IGZpbmQgYW55IG1hdGNoaW5nIGtleQogICogLSB3ZSByZXR1cm4gLUVOT0tFWSBpZiB3ZSBmb3VuZCBvbmx5IG5lZ2F0aXZlIG1hdGNoaW5nIGtleXMKICAqLwota2V5X3JlZl90IHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKLQkJCQkgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAotCQkJCSAga2V5X21hdGNoX2Z1bmNfdCBtYXRjaCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkKQora2V5X3JlZl90IHNlYXJjaF9teV9wcm9jZXNzX2tleXJpbmdzKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAorCQkJCSAgICAga2V5X21hdGNoX2Z1bmNfdCBtYXRjaCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkKQogewotCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2E7CiAJa2V5X3JlZl90IGtleV9yZWYsIHJldCwgZXJyOwogCi0JbWlnaHRfc2xlZXAoKTsKLQogCS8qIHdlIHdhbnQgdG8gcmV0dXJuIC1FQUdBSU4gb3IgLUVOT0tFWSBpZiBhbnkgb2YgdGhlIGtleXJpbmdzIHdlcmUKIAkgKiBzZWFyY2hhYmxlLCBidXQgd2UgZmFpbGVkIHRvIGZpbmQgYSBrZXkgb3Igd2UgZm91bmQgYSBuZWdhdGl2ZSBrZXk7CiAJICogb3RoZXJ3aXNlIHdlIHdhbnQgdG8gcmV0dXJuIGEgc2FtcGxlIGVycm9yIChwcm9iYWJseSAtRUFDQ0VTKSBpZgpAQCAtNDI0LDYgKzQyMSwzNiBAQAogCQl9CiAJfQogCisJLyogbm8ga2V5IC0gZGVjaWRlIG9uIHRoZSBlcnJvciB3ZSdyZSBnb2luZyB0byBnbyBmb3IgKi8KKwlrZXlfcmVmID0gcmV0ID8gcmV0IDogZXJyOworCitmb3VuZDoKKwlyZXR1cm4ga2V5X3JlZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNlYXJjaCB0aGUgcHJvY2VzcyBrZXlyaW5ncyBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGtleQorICogLSB3ZSB1c2UgdGhlIHN1cHBsaWVkIG1hdGNoIGZ1bmN0aW9uIHRvIHNlZSBpZiB0aGUgZGVzY3JpcHRpb24gKG9yIG90aGVyCisgKiAgIGZlYXR1cmUgb2YgaW50ZXJlc3QpIG1hdGNoZXMKKyAqIC0gd2UgcmV0dXJuIC1FQUdBSU4gaWYgd2UgZGlkbid0IGZpbmQgYW55IG1hdGNoaW5nIGtleQorICogLSB3ZSByZXR1cm4gLUVOT0tFWSBpZiB3ZSBmb3VuZCBvbmx5IG5lZ2F0aXZlIG1hdGNoaW5nIGtleXMKKyAqLwora2V5X3JlZl90IHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKKwkJCQkgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAorCQkJCSAga2V5X21hdGNoX2Z1bmNfdCBtYXRjaCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkKQoreworCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2E7CisJa2V5X3JlZl90IGtleV9yZWYsIHJldCA9IEVSUl9QVFIoLUVBQ0NFUyksIGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlrZXlfcmVmID0gc2VhcmNoX215X3Byb2Nlc3Nfa2V5cmluZ3ModHlwZSwgZGVzY3JpcHRpb24sIG1hdGNoLCBjcmVkKTsKKwlpZiAoIUlTX0VSUihrZXlfcmVmKSkKKwkJZ290byBmb3VuZDsKKwllcnIgPSBrZXlfcmVmOworCiAJLyogaWYgdGhpcyBwcm9jZXNzIGhhcyBhbiBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24ga2V5LCB0aGVuIHdlIGFsc28KIAkgKiBzZWFyY2ggdGhlIGtleXJpbmdzIG9mIHRoZSBwcm9jZXNzIG1lbnRpb25lZCB0aGVyZQogCSAqIC0gd2UgZG9uJ3QgcGVybWl0IGFjY2VzcyB0byByZXF1ZXN0X2tleSBhdXRoIGtleXMgdmlhIHRoaXMgbWV0aG9kCkBAIC00NDYsMjQgKzQ3MywxOSBAQAogCQkJaWYgKCFJU19FUlIoa2V5X3JlZikpCiAJCQkJZ290byBmb3VuZDsKIAotCQkJc3dpdGNoIChQVFJfRVJSKGtleV9yZWYpKSB7Ci0JCQljYXNlIC1FQUdBSU46IC8qIG5vIGtleSAqLwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCQkJY2FzZSAtRU5PS0VZOiAvKiBuZWdhdGl2ZSBrZXkgKi8KLQkJCQlyZXQgPSBrZXlfcmVmOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQllcnIgPSBrZXlfcmVmOwotCQkJCWJyZWFrOwotCQkJfQorCQkJcmV0ID0ga2V5X3JlZjsKIAkJfSBlbHNlIHsKIAkJCXVwX3JlYWQoJmNyZWQtPnJlcXVlc3Rfa2V5X2F1dGgtPnNlbSk7CiAJCX0KIAl9CiAKIAkvKiBubyBrZXkgLSBkZWNpZGUgb24gdGhlIGVycm9yIHdlJ3JlIGdvaW5nIHRvIGdvIGZvciAqLwotCWtleV9yZWYgPSByZXQgPyByZXQgOiBlcnI7CisJaWYgKGVyciA9PSBFUlJfUFRSKC1FTk9LRVkpIHx8IHJldCA9PSBFUlJfUFRSKC1FTk9LRVkpKQorCQlrZXlfcmVmID0gRVJSX1BUUigtRU5PS0VZKTsKKwllbHNlIGlmIChlcnIgPT0gRVJSX1BUUigtRUFDQ0VTKSkKKwkJa2V5X3JlZiA9IHJldDsKKwllbHNlCisJCWtleV9yZWYgPSBlcnI7CiAKIGZvdW5kOgogCXJldHVybiBrZXlfcmVmOwpAQCAtNDc0LDcgKzQ5Niw3IEBACiAvKgogICogc2VlIGlmIHRoZSBrZXkgd2UncmUgbG9va2luZyBhdCBpcyB0aGUgdGFyZ2V0IGtleQogICovCi1zdGF0aWMgaW50IGxvb2t1cF91c2VyX2tleV9wb3NzZXNzZWQoY29uc3Qgc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICp0YXJnZXQpCitpbnQgbG9va3VwX3VzZXJfa2V5X3Bvc3Nlc3NlZChjb25zdCBzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKnRhcmdldCkKIHsKIAlyZXR1cm4ga2V5ID09IHRhcmdldDsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCmluZGV4IGY1ZWM5YWMuLjAwODhkZDggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYworKysgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKQEAgLTE0NCw2ICsxNDQsNyBAQAogCXBya2V5ID0gMDsKIAlpZiAoY3JlZC0+dGdjcmVkLT5wcm9jZXNzX2tleXJpbmcpCiAJCXBya2V5ID0gY3JlZC0+dGdjcmVkLT5wcm9jZXNzX2tleXJpbmctPnNlcmlhbDsKKwlzcHJpbnRmKGtleXJpbmdfc3RyWzFdLCAiJWQiLCBwcmtleSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJc2Vzc2lvbiA9IHJjdV9kZXJlZmVyZW5jZShjcmVkLT50Z2NyZWQtPnNlc3Npb25fa2V5cmluZyk7CkBAIC01MzYsNiArNTM3LDggQEAKIAkJCSAgaW50ciA/IFRBU0tfSU5URVJSVVBUSUJMRSA6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKKwlpZiAodGVzdF9iaXQoS0VZX0ZMQUdfTkVHQVRJVkUsICZrZXktPmZsYWdzKSkKKwkJcmV0dXJuIC1FTk9LRVk7CiAJcmV0dXJuIGtleV92YWxpZGF0ZShrZXkpOwogfQogRVhQT1JUX1NZTUJPTCh3YWl0X2Zvcl9rZXlfY29uc3RydWN0aW9uKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDM1MTk0MmEuLmU4Yzg3YjggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtNDE3LDEyICs0MTcsMTEgQEAKIAkJCQkJIG5ld19kZW50cnkpOwogfQogCi1pbnQgc2VjdXJpdHlfcGF0aF90cnVuY2F0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9mZl90IGxlbmd0aCwKLQkJCSAgIHVuc2lnbmVkIGludCB0aW1lX2F0dHJzKQoraW50IHNlY3VyaXR5X3BhdGhfdHJ1bmNhdGUoc3RydWN0IHBhdGggKnBhdGgpCiB7CiAJaWYgKHVubGlrZWx5KElTX1BSSVZBVEUocGF0aC0+ZGVudHJ5LT5kX2lub2RlKSkpCiAJCXJldHVybiAwOwotCXJldHVybiBzZWN1cml0eV9vcHMtPnBhdGhfdHJ1bmNhdGUocGF0aCwgbGVuZ3RoLCB0aW1lX2F0dHJzKTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT5wYXRoX3RydW5jYXRlKHBhdGgpOwogfQogCiBpbnQgc2VjdXJpdHlfcGF0aF9jaG1vZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqbW50LApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggN2YxYTMwNC4uOWRhNjQyMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC0yODgsNyArMjg4LDYgQEAKIAlpZiAoIW5vZGUpCiAJCWdvdG8gb3V0OwogCi0JSU5JVF9SQ1VfSEVBRCgmbm9kZS0+cmhlYWQpOwogCUlOSVRfSExJU1RfTk9ERSgmbm9kZS0+bGlzdCk7CiAJYXZjX2NhY2hlX3N0YXRzX2luY3IoYWxsb2NhdGlvbnMpOwogCkBAIC00ODksOSArNDg4LDI5IEBACiAJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIHN0YWNrX2RhdGE7CiAJdTMyIGRlbmllZCwgYXVkaXRlZDsKIAlkZW5pZWQgPSByZXF1ZXN0ZWQgJiB+YXZkLT5hbGxvd2VkOwotCWlmIChkZW5pZWQpCisJaWYgKGRlbmllZCkgewogCQlhdWRpdGVkID0gZGVuaWVkICYgYXZkLT5hdWRpdGRlbnk7Ci0JZWxzZSBpZiAocmVzdWx0KQorCQkvKgorCQkgKiBhLT5zZWxpbnV4X2F1ZGl0X2RhdGEuYXVkaXRkZW55IGlzIFRSSUNLWSEgIFNldHRpbmcgYSBiaXQgaW4KKwkJICogdGhpcyBmaWVsZCBtZWFucyB0aGF0IEFOWSBkZW5pYWxzIHNob3VsZCBOT1QgYmUgYXVkaXRlZCBpZgorCQkgKiB0aGUgcG9saWN5IGNvbnRhaW5zIGFuIGV4cGxpY2l0IGRvbnRhdWRpdCBydWxlIGZvciB0aGF0CisJCSAqIHBlcm1pc3Npb24uICBUYWtlIG5vdGljZSB0aGF0IHRoaXMgaXMgdW5yZWxhdGVkIHRvIHRoZQorCQkgKiBhY3R1YWwgcGVybWlzc2lvbnMgdGhhdCB3ZXJlIGRlbmllZC4gIEFzIGFuIGV4YW1wbGUgbGV0cworCQkgKiBhc3N1bWU6CisJCSAqCisJCSAqIGRlbmllZCA9PSBSRUFECisJCSAqIGF2ZC5hdWRpdGRlbnkgJiBBQ0NFU1MgPT0gMCAobm90IHNldCBtZWFucyBleHBsaWNpdCBydWxlKQorCQkgKiBzZWxpbnV4X2F1ZGl0X2RhdGEuYXVkaXRkZW55ICYgQUNDRVNTID09IDEKKwkJICoKKwkJICogV2Ugd2lsbCBOT1QgYXVkaXQgdGhlIGRlbmlhbCBldmVuIHRob3VnaCB0aGUgZGVuaWVkCisJCSAqIHBlcm1pc3Npb24gd2FzIFJFQUQgYW5kIHRoZSBhdWRpdGRlbnkgY2hlY2tzIHdlcmUgZm9yCisJCSAqIEFDQ0VTUworCQkgKi8KKwkJaWYgKGEgJiYKKwkJICAgIGEtPnNlbGludXhfYXVkaXRfZGF0YS5hdWRpdGRlbnkgJiYKKwkJICAgICEoYS0+c2VsaW51eF9hdWRpdF9kYXRhLmF1ZGl0ZGVueSAmIGF2ZC0+YXVkaXRkZW55KSkKKwkJCWF1ZGl0ZWQgPSAwOworCX0gZWxzZSBpZiAocmVzdWx0KQogCQlhdWRpdGVkID0gZGVuaWVkID0gcmVxdWVzdGVkOwogCWVsc2UKIAkJYXVkaXRlZCA9IHJlcXVlc3RlZCAmIGF2ZC0+YXVkaXRhbGxvdzsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCA1YzlmMjViLi45YjQwZjRjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC04Nyw5ICs4Nyw2IEBACiAjaW5jbHVkZSAibmV0bGFiZWwuaCIKICNpbmNsdWRlICJhdWRpdC5oIgogCi0jZGVmaW5lIFhBVFRSX1NFTElOVVhfU1VGRklYICJzZWxpbnV4IgotI2RlZmluZSBYQVRUUl9OQU1FX1NFTElOVVggWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NFTElOVVhfU1VGRklYCi0KICNkZWZpbmUgTlVNX1NFTF9NTlRfT1BUUyA1CiAKIGV4dGVybiBpbnQgc2VsaW51eF9ubG1zZ19sb29rdXAodTE2IHNjbGFzcywgdTE2IG5sbXNnX3R5cGUsIHUzMiAqcGVybSk7CkBAIC0xODgsNyArMTg1LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB1MzIgY3VycmVudF9zaWQodm9pZCkKIHsKLQljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X2NyZWQoKS0+c2VjdXJpdHk7CisJY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gY3VycmVudF9zZWN1cml0eSgpOwogCiAJcmV0dXJuIHRzZWMtPnNpZDsKIH0KQEAgLTI3OSwzMiArMjc2LDYgQEAKIAlrZnJlZShzYnNlYyk7CiB9CiAKLXN0YXRpYyBpbnQgc2tfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmFtaWx5LCBnZnBfdCBwcmlvcml0eSkKLXsKLQlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYzsKLQotCXNrc2VjID0ga3phbGxvYyhzaXplb2YoKnNrc2VjKSwgcHJpb3JpdHkpOwotCWlmICghc2tzZWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2tzZWMtPnBlZXJfc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7Ci0Jc2tzZWMtPnNpZCA9IFNFQ0lOSVRTSURfVU5MQUJFTEVEOwotCXNrLT5za19zZWN1cml0eSA9IHNrc2VjOwotCi0Jc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc2tzZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNrX2ZyZWVfc2VjdXJpdHkoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OwotCi0Jc2stPnNrX3NlY3VyaXR5ID0gTlVMTDsKLQlzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9mcmVlKHNrc2VjKTsKLQlrZnJlZShza3NlYyk7Ci19Ci0KIC8qIFRoZSBzZWN1cml0eSBzZXJ2ZXIgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKICAgIGFueSBsYWJlbGluZyBvciBhY2Nlc3MgZGVjaXNpb25zIGNhbiBiZSBwcm92aWRlZC4gKi8KIGV4dGVybiBpbnQgc3NfaW5pdGlhbGl6ZWQ7CkBAIC0xNTg0LDggKzE1NTUsNyBAQAogCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCSAgICAgIHUxNiB0Y2xhc3MpCiB7Ci0JY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKLQljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjcmVkLT5zZWN1cml0eTsKKwljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X3NlY3VyaXR5KCk7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqZHNlYzsKIAlzdHJ1Y3Qgc3VwZXJibG9ja19zZWN1cml0eV9zdHJ1Y3QgKnNic2VjOwogCXUzMiBzaWQsIG5ld3NpZDsKQEAgLTE4MDYsMjcgKzE3NzYsOSBAQAogewogCXUzMiBhdiA9IGZpbGVfdG9fYXYoZmlsZSk7CiAKLQlpZiAoc2VsaW51eF9wb2xpY3ljYXBfb3BlbnBlcm0pIHsKLQkJbW9kZV90IG1vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGU7Ci0JCS8qCi0JCSAqIGxuayBmaWxlcyBhbmQgc29ja3MgZG8gbm90IHJlYWxseSBoYXZlIGFuICdvcGVuJwotCQkgKi8KLQkJaWYgKFNfSVNSRUcobW9kZSkpCi0JCQlhdiB8PSBGSUxFX19PUEVOOwotCQllbHNlIGlmIChTX0lTQ0hSKG1vZGUpKQotCQkJYXYgfD0gQ0hSX0ZJTEVfX09QRU47Ci0JCWVsc2UgaWYgKFNfSVNCTEsobW9kZSkpCi0JCQlhdiB8PSBCTEtfRklMRV9fT1BFTjsKLQkJZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpCi0JCQlhdiB8PSBGSUZPX0ZJTEVfX09QRU47Ci0JCWVsc2UgaWYgKFNfSVNESVIobW9kZSkpCi0JCQlhdiB8PSBESVJfX09QRU47Ci0JCWVsc2UgaWYgKFNfSVNTT0NLKG1vZGUpKQotCQkJYXYgfD0gU09DS19GSUxFX19PUEVOOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IFdBUk5JTkc6IGluc2lkZSAlcyB3aXRoICIKLQkJCQkidW5rbm93biBtb2RlOiVvXG4iLCBfX2Z1bmNfXywgbW9kZSk7Ci0JfQorCWlmIChzZWxpbnV4X3BvbGljeWNhcF9vcGVucGVybSkKKwkJYXYgfD0gRklMRV9fT1BFTjsKKwogCXJldHVybiBhdjsKIH0KIApAQCAtMjE4Myw4ICsyMTM1LDcgQEAKIAogc3RhdGljIGludCBzZWxpbnV4X2Jwcm1fc2VjdXJlZXhlYyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7Ci0JY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gY3JlZC0+c2VjdXJpdHk7CisJY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gY3VycmVudF9zZWN1cml0eSgpOwogCXUzMiBzaWQsIG9zaWQ7CiAJaW50IGF0c2VjdXJlID0gMDsKIApAQCAtMjU1OSw4ICsyNTEwLDcgQEAKIAkJCQkgICAgICAgY2hhciAqKm5hbWUsIHZvaWQgKip2YWx1ZSwKIAkJCQkgICAgICAgc2l6ZV90ICpsZW4pCiB7Ci0JY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKLQljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjcmVkLT5zZWN1cml0eTsKKwljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X3NlY3VyaXR5KCk7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqZHNlYzsKIAlzdHJ1Y3Qgc3VwZXJibG9ja19zZWN1cml0eV9zdHJ1Y3QgKnNic2VjOwogCXUzMiBzaWQsIG5ld3NpZCwgY2xlbjsKQEAgLTI2NzYsMTQgKzI2MjYsMjYgQEAKIHN0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CisJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIGFkOworCXUzMiBwZXJtczsKKwlib29sIGZyb21fYWNjZXNzOwogCi0JaWYgKCFtYXNrKSB7Ci0JCS8qIE5vIHBlcm1pc3Npb24gdG8gY2hlY2suICBFeGlzdGVuY2UgdGVzdC4gKi8KKwlmcm9tX2FjY2VzcyA9IG1hc2sgJiBNQVlfQUNDRVNTOworCW1hc2sgJj0gKE1BWV9SRUFEfE1BWV9XUklURXxNQVlfRVhFQ3xNQVlfQVBQRU5EKTsKKworCS8qIE5vIHBlcm1pc3Npb24gdG8gY2hlY2suICBFeGlzdGVuY2UgdGVzdC4gKi8KKwlpZiAoIW1hc2spCiAJCXJldHVybiAwOwotCX0KIAotCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBpbm9kZSwKLQkJCSAgICAgIGZpbGVfbWFza190b19hdihpbm9kZS0+aV9tb2RlLCBtYXNrKSwgTlVMTCk7CisJQ09NTU9OX0FVRElUX0RBVEFfSU5JVCgmYWQsIEZTKTsKKwlhZC51LmZzLmlub2RlID0gaW5vZGU7CisKKwlpZiAoZnJvbV9hY2Nlc3MpCisJCWFkLnNlbGludXhfYXVkaXRfZGF0YS5hdWRpdGRlbnkgfD0gRklMRV9fQVVESVRfQUNDRVNTOworCisJcGVybXMgPSBmaWxlX21hc2tfdG9fYXYoaW5vZGUtPmlfbW9kZSwgbWFzayk7CisKKwlyZXR1cm4gaW5vZGVfaGFzX3Blcm0oY3JlZCwgaW5vZGUsIHBlcm1zLCAmYWQpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpCkBAIC0zNjcxLDcxICszNjMzLDU0IEBACiB9CiAKIC8qIHNvY2tldCBzZWN1cml0eSBvcGVyYXRpb25zICovCi1zdGF0aWMgaW50IHNvY2tldF9oYXNfcGVybShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICB1MzIgcGVybXMpCisKK3N0YXRpYyB1MzIgc29ja2V0X3NvY2tjcmVhdGVfc2lkKGNvbnN0IHN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYykKIHsKLQlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjOworCXJldHVybiB0c2VjLT5zb2NrY3JlYXRlX3NpZCA/IDogdHNlYy0+c2lkOworfQorCitzdGF0aWMgaW50IHNvY2tfaGFzX3Blcm0oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwZXJtcykKK3sKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNrLT5za19zZWN1cml0eTsKIAlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgYWQ7Ci0JdTMyIHNpZDsKLQlpbnQgZXJyID0gMDsKKwl1MzIgdHNpZCA9IHRhc2tfc2lkKHRhc2spOwogCi0JaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7Ci0KLQlpZiAoaXNlYy0+c2lkID09IFNFQ0lOSVRTSURfS0VSTkVMKQotCQlnb3RvIG91dDsKLQlzaWQgPSB0YXNrX3NpZCh0YXNrKTsKKwlpZiAoc2tzZWMtPnNpZCA9PSBTRUNJTklUU0lEX0tFUk5FTCkKKwkJcmV0dXJuIDA7CiAKIAlDT01NT05fQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKLQlhZC51Lm5ldC5zayA9IHNvY2stPnNrOwotCWVyciA9IGF2Y19oYXNfcGVybShzaWQsIGlzZWMtPnNpZCwgaXNlYy0+c2NsYXNzLCBwZXJtcywgJmFkKTsKKwlhZC51Lm5ldC5zayA9IHNrOwogCi1vdXQ6Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gYXZjX2hhc19wZXJtKHRzaWQsIHNrc2VjLT5zaWQsIHNrc2VjLT5zY2xhc3MsIHBlcm1zLCAmYWQpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfc29ja2V0X2NyZWF0ZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwKIAkJCQkgaW50IHByb3RvY29sLCBpbnQga2VybikKIHsKLQljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpOwotCWNvbnN0IHN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYyA9IGNyZWQtPnNlY3VyaXR5OwotCXUzMiBzaWQsIG5ld3NpZDsKKwljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJdTMyIG5ld3NpZDsKIAl1MTYgc2VjY2xhc3M7Ci0JaW50IGVyciA9IDA7CiAKIAlpZiAoa2VybikKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCi0Jc2lkID0gdHNlYy0+c2lkOwotCW5ld3NpZCA9IHRzZWMtPnNvY2tjcmVhdGVfc2lkID86IHNpZDsKLQorCW5ld3NpZCA9IHNvY2tldF9zb2NrY3JlYXRlX3NpZCh0c2VjKTsKIAlzZWNjbGFzcyA9IHNvY2tldF90eXBlX3RvX3NlY3VyaXR5X2NsYXNzKGZhbWlseSwgdHlwZSwgcHJvdG9jb2wpOwotCWVyciA9IGF2Y19oYXNfcGVybShzaWQsIG5ld3NpZCwgc2VjY2xhc3MsIFNPQ0tFVF9fQ1JFQVRFLCBOVUxMKTsKLQotb3V0OgotCXJldHVybiBlcnI7CisJcmV0dXJuIGF2Y19oYXNfcGVybSh0c2VjLT5zaWQsIG5ld3NpZCwgc2VjY2xhc3MsIFNPQ0tFVF9fQ1JFQVRFLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZmFtaWx5LAogCQkJCSAgICAgIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIGludCBrZXJuKQogewotCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7Ci0JY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gY3JlZC0+c2VjdXJpdHk7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKKwljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7CiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWM7Ci0JdTMyIHNpZCwgbmV3c2lkOwogCWludCBlcnIgPSAwOwogCi0Jc2lkID0gdHNlYy0+c2lkOwotCW5ld3NpZCA9IHRzZWMtPnNvY2tjcmVhdGVfc2lkOwotCi0JaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7Ci0KIAlpZiAoa2VybikKIAkJaXNlYy0+c2lkID0gU0VDSU5JVFNJRF9LRVJORUw7Ci0JZWxzZSBpZiAobmV3c2lkKQotCQlpc2VjLT5zaWQgPSBuZXdzaWQ7CiAJZWxzZQotCQlpc2VjLT5zaWQgPSBzaWQ7CisJCWlzZWMtPnNpZCA9IHNvY2tldF9zb2NrY3JlYXRlX3NpZCh0c2VjKTsKIAogCWlzZWMtPnNjbGFzcyA9IHNvY2tldF90eXBlX3RvX3NlY3VyaXR5X2NsYXNzKGZhbWlseSwgdHlwZSwgcHJvdG9jb2wpOwogCWlzZWMtPmluaXRpYWxpemVkID0gMTsKQEAgLTM3NTYsMTAgKzM3MDEsMTEgQEAKIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcywgaW50IGFkZHJsZW4pCiB7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJdTE2IGZhbWlseTsKIAlpbnQgZXJyOwogCi0JZXJyID0gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fQklORCk7CisJZXJyID0gc29ja19oYXNfcGVybShjdXJyZW50LCBzaywgU09DS0VUX19CSU5EKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMzc2OCwxOSArMzcxNCwxNiBAQAogCSAqIE11bHRpcGxlIGFkZHJlc3MgYmluZGluZyBmb3IgU0NUUCBpcyBub3Qgc3VwcG9ydGVkIHlldDogd2UganVzdAogCSAqIGNoZWNrIHRoZSBmaXJzdCBhZGRyZXNzIG5vdy4KIAkgKi8KLQlmYW1pbHkgPSBzb2NrLT5zay0+c2tfZmFtaWx5OworCWZhbWlseSA9IHNrLT5za19mYW1pbHk7CiAJaWYgKGZhbWlseSA9PSBQRl9JTkVUIHx8IGZhbWlseSA9PSBQRl9JTkVUNikgewogCQljaGFyICphZGRycDsKLQkJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKKwkJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CiAJCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhZDsKIAkJc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IE5VTEw7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gTlVMTDsKIAkJdW5zaWduZWQgc2hvcnQgc251bTsKLQkJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJCXUzMiBzaWQsIG5vZGVfcGVybTsKIAotCQlpc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKLQogCQlpZiAoZmFtaWx5ID09IFBGX0lORVQpIHsKIAkJCWFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJlc3M7CiAJCQlzbnVtID0gbnRvaHMoYWRkcjQtPnNpbl9wb3J0KTsKQEAgLTM4MDQsMTUgKzM3NDcsMTUgQEAKIAkJCQlDT01NT05fQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKIAkJCQlhZC51Lm5ldC5zcG9ydCA9IGh0b25zKHNudW0pOwogCQkJCWFkLnUubmV0LmZhbWlseSA9IGZhbWlseTsKLQkJCQllcnIgPSBhdmNfaGFzX3Blcm0oaXNlYy0+c2lkLCBzaWQsCi0JCQkJCQkgICBpc2VjLT5zY2xhc3MsCisJCQkJZXJyID0gYXZjX2hhc19wZXJtKHNrc2VjLT5zaWQsIHNpZCwKKwkJCQkJCSAgIHNrc2VjLT5zY2xhc3MsCiAJCQkJCQkgICBTT0NLRVRfX05BTUVfQklORCwgJmFkKTsKIAkJCQlpZiAoZXJyKQogCQkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQogCi0JCXN3aXRjaCAoaXNlYy0+c2NsYXNzKSB7CisJCXN3aXRjaCAoc2tzZWMtPnNjbGFzcykgewogCQljYXNlIFNFQ0NMQVNTX1RDUF9TT0NLRVQ6CiAJCQlub2RlX3Blcm0gPSBUQ1BfU09DS0VUX19OT0RFX0JJTkQ7CiAJCQlicmVhazsKQEAgLTM4NDMsOCArMzc4Niw4IEBACiAJCWVsc2UKIAkJCWlwdjZfYWRkcl9jb3B5KCZhZC51Lm5ldC52NmluZm8uc2FkZHIsICZhZGRyNi0+c2luNl9hZGRyKTsKIAotCQllcnIgPSBhdmNfaGFzX3Blcm0oaXNlYy0+c2lkLCBzaWQsCi0JCQkJICAgaXNlYy0+c2NsYXNzLCBub2RlX3Blcm0sICZhZCk7CisJCWVyciA9IGF2Y19oYXNfcGVybShza3NlYy0+c2lkLCBzaWQsCisJCQkJICAgc2tzZWMtPnNjbGFzcywgbm9kZV9wZXJtLCAmYWQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMzg1NSwxOSArMzc5OCwxOCBAQAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcywgaW50IGFkZHJsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNrLT5za19zZWN1cml0eTsKIAlpbnQgZXJyOwogCi0JZXJyID0gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fQ09OTkVDVCk7CisJZXJyID0gc29ja19oYXNfcGVybShjdXJyZW50LCBzaywgU09DS0VUX19DT05ORUNUKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJLyoKIAkgKiBJZiBhIFRDUCBvciBEQ0NQIHNvY2tldCwgY2hlY2sgbmFtZV9jb25uZWN0IHBlcm1pc3Npb24gZm9yIHRoZSBwb3J0LgogCSAqLwotCWlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OwotCWlmIChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCB8fAotCSAgICBpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfRENDUF9TT0NLRVQpIHsKKwlpZiAoc2tzZWMtPnNjbGFzcyA9PSBTRUNDTEFTU19UQ1BfU09DS0VUIHx8CisJICAgIHNrc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfRENDUF9TT0NLRVQpIHsKIAkJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIGFkOwogCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0ID0gTlVMTDsKIAkJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSBOVUxMOwpAQCAtMzg5MCwxMyArMzgzMiwxMyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKLQkJcGVybSA9IChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCkgPworCQlwZXJtID0gKHNrc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCkgPwogCQkgICAgICAgVENQX1NPQ0tFVF9fTkFNRV9DT05ORUNUIDogRENDUF9TT0NLRVRfX05BTUVfQ09OTkVDVDsKIAogCQlDT01NT05fQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKIAkJYWQudS5uZXQuZHBvcnQgPSBodG9ucyhzbnVtKTsKIAkJYWQudS5uZXQuZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKLQkJZXJyID0gYXZjX2hhc19wZXJtKGlzZWMtPnNpZCwgc2lkLCBpc2VjLT5zY2xhc3MsIHBlcm0sICZhZCk7CisJCWVyciA9IGF2Y19oYXNfcGVybShza3NlYy0+c2lkLCBzaWQsIHNrc2VjLT5zY2xhc3MsIHBlcm0sICZhZCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0zOTA5LDcgKzM4NTEsNyBAQAogCiBzdGF0aWMgaW50IHNlbGludXhfc29ja2V0X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKIHsKLQlyZXR1cm4gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fTElTVEVOKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19MSVNURU4pOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfc29ja2V0X2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrKQpAQCAtMzkxOCw3ICszODYwLDcgQEAKIAlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjOwogCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKm5ld2lzZWM7CiAKLQllcnIgPSBzb2NrZXRfaGFzX3Blcm0oY3VycmVudCwgc29jaywgU09DS0VUX19BQ0NFUFQpOworCWVyciA9IHNvY2tfaGFzX3Blcm0oY3VycmVudCwgc29jay0+c2ssIFNPQ0tFVF9fQUNDRVBUKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zOTM1LDMwICszODc3LDMwIEBACiBzdGF0aWMgaW50IHNlbGludXhfc29ja2V0X3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJCSAgaW50IHNpemUpCiB7Ci0JcmV0dXJuIHNvY2tldF9oYXNfcGVybShjdXJyZW50LCBzb2NrLCBTT0NLRVRfX1dSSVRFKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19XUklURSk7CiB9CiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrZXRfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCQkJICBpbnQgc2l6ZSwgaW50IGZsYWdzKQogewotCXJldHVybiBzb2NrZXRfaGFzX3Blcm0oY3VycmVudCwgc29jaywgU09DS0VUX19SRUFEKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19SRUFEKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9nZXRzb2NrbmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewotCXJldHVybiBzb2NrZXRfaGFzX3Blcm0oY3VycmVudCwgc29jaywgU09DS0VUX19HRVRBVFRSKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19HRVRBVFRSKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9nZXRwZWVybmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewotCXJldHVybiBzb2NrZXRfaGFzX3Blcm0oY3VycmVudCwgc29jaywgU09DS0VUX19HRVRBVFRSKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19HRVRBVFRSKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IHNvY2tldF9oYXNfcGVybShjdXJyZW50LCBzb2NrLCBTT0NLRVRfX1NFVE9QVCk7CisJZXJyID0gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19TRVRPUFQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTM5NjgsNjggKzM5MTAsNTggQEAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrZXRfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsCiAJCQkJICAgICBpbnQgb3B0bmFtZSkKIHsKLQlyZXR1cm4gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fR0VUT1BUKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19HRVRPUFQpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfc29ja2V0X3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCiB7Ci0JcmV0dXJuIHNvY2tldF9oYXNfcGVybShjdXJyZW50LCBzb2NrLCBTT0NLRVRfX1NIVVRET1dOKTsKKwlyZXR1cm4gc29ja19oYXNfcGVybShjdXJyZW50LCBzb2NrLT5zaywgU09DS0VUX19TSFVURE9XTik7CiB9CiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrZXRfdW5peF9zdHJlYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJCQkgICAgICBzdHJ1Y3Qgc29ja2V0ICpvdGhlciwKIAkJCQkJICAgICAgc3RydWN0IHNvY2sgKm5ld3NrKQogewotCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjOwotCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWM7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqb3RoZXJfaXNlYzsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlY19zb2NrID0gc29jay0+c2stPnNrX3NlY3VyaXR5OworCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjX290aGVyID0gb3RoZXItPnNrLT5za19zZWN1cml0eTsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlY19uZXcgPSBuZXdzay0+c2tfc2VjdXJpdHk7CiAJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIGFkOwogCWludCBlcnI7CiAKLQlpc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKLQlvdGhlcl9pc2VjID0gU09DS19JTk9ERShvdGhlciktPmlfc2VjdXJpdHk7Ci0KIAlDT01NT05fQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKIAlhZC51Lm5ldC5zayA9IG90aGVyLT5zazsKIAotCWVyciA9IGF2Y19oYXNfcGVybShpc2VjLT5zaWQsIG90aGVyX2lzZWMtPnNpZCwKLQkJCSAgIGlzZWMtPnNjbGFzcywKKwllcnIgPSBhdmNfaGFzX3Blcm0oc2tzZWNfc29jay0+c2lkLCBza3NlY19vdGhlci0+c2lkLAorCQkJICAgc2tzZWNfb3RoZXItPnNjbGFzcywKIAkJCSAgIFVOSVhfU1RSRUFNX1NPQ0tFVF9fQ09OTkVDVFRPLCAmYWQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQkvKiBjb25uZWN0aW5nIHNvY2tldCAqLwotCXNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OwotCXNrc2VjLT5wZWVyX3NpZCA9IG90aGVyX2lzZWMtPnNpZDsKLQogCS8qIHNlcnZlciBjaGlsZCBzb2NrZXQgKi8KLQlza3NlYyA9IG5ld3NrLT5za19zZWN1cml0eTsKLQlza3NlYy0+cGVlcl9zaWQgPSBpc2VjLT5zaWQ7Ci0JZXJyID0gc2VjdXJpdHlfc2lkX21sc19jb3B5KG90aGVyX2lzZWMtPnNpZCwgc2tzZWMtPnBlZXJfc2lkLCAmc2tzZWMtPnNpZCk7CisJc2tzZWNfbmV3LT5wZWVyX3NpZCA9IHNrc2VjX3NvY2stPnNpZDsKKwllcnIgPSBzZWN1cml0eV9zaWRfbWxzX2NvcHkoc2tzZWNfb3RoZXItPnNpZCwgc2tzZWNfc29jay0+c2lkLAorCQkJCSAgICAmc2tzZWNfbmV3LT5zaWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gZXJyOworCS8qIGNvbm5lY3Rpbmcgc29ja2V0ICovCisJc2tzZWNfc29jay0+cGVlcl9zaWQgPSBza3NlY19uZXctPnNpZDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfc29ja2V0X3VuaXhfbWF5X3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywKIAkJCQkJc3RydWN0IHNvY2tldCAqb3RoZXIpCiB7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKLQlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICpvdGhlcl9pc2VjOworCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqb3NlYyA9IG90aGVyLT5zay0+c2tfc2VjdXJpdHk7CiAJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIGFkOwotCWludCBlcnI7Ci0KLQlpc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKLQlvdGhlcl9pc2VjID0gU09DS19JTk9ERShvdGhlciktPmlfc2VjdXJpdHk7CiAKIAlDT01NT05fQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKIAlhZC51Lm5ldC5zayA9IG90aGVyLT5zazsKIAotCWVyciA9IGF2Y19oYXNfcGVybShpc2VjLT5zaWQsIG90aGVyX2lzZWMtPnNpZCwKLQkJCSAgIGlzZWMtPnNjbGFzcywgU09DS0VUX19TRU5EVE8sICZhZCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAwOworCXJldHVybiBhdmNfaGFzX3Blcm0oc3NlYy0+c2lkLCBvc2VjLT5zaWQsIG9zZWMtPnNjbGFzcywgU09DS0VUX19TRU5EVE8sCisJCQkgICAgJmFkKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X2luZXRfc3lzX3Jjdl9za2IoaW50IGlmaW5kZXgsIGNoYXIgKmFkZHJwLCB1MTYgZmFtaWx5LApAQCAtNDE2OCwyNiArNDEwMCwxOCBAQAogCWludCBlcnIgPSAwOwogCWNoYXIgKnNjb250ZXh0OwogCXUzMiBzY29udGV4dF9sZW47Ci0Jc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWM7Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKIAl1MzIgcGVlcl9zaWQgPSBTRUNTSURfTlVMTDsKIAotCWlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OwotCi0JaWYgKGlzZWMtPnNjbGFzcyA9PSBTRUNDTEFTU19VTklYX1NUUkVBTV9TT0NLRVQgfHwKLQkgICAgaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1RDUF9TT0NLRVQpIHsKLQkJc2tzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJaWYgKHNrc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVU5JWF9TVFJFQU1fU09DS0VUIHx8CisJICAgIHNrc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCkKIAkJcGVlcl9zaWQgPSBza3NlYy0+cGVlcl9zaWQ7Ci0JfQotCWlmIChwZWVyX3NpZCA9PSBTRUNTSURfTlVMTCkgewotCQllcnIgPSAtRU5PUFJPVE9PUFQ7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocGVlcl9zaWQgPT0gU0VDU0lEX05VTEwpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAKIAllcnIgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChwZWVyX3NpZCwgJnNjb250ZXh0LCAmc2NvbnRleHRfbGVuKTsKLQogCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyOwogCiAJaWYgKHNjb250ZXh0X2xlbiA+IGxlbikgewogCQllcnIgPSAtRVJBTkdFOwpAQCAtNDIwMCw5ICs0MTI0LDcgQEAKIG91dF9sZW46CiAJaWYgKHB1dF91c2VyKHNjb250ZXh0X2xlbiwgb3B0bGVuKSkKIAkJZXJyID0gLUVGQVVMVDsKLQogCWtmcmVlKHNjb250ZXh0KTsKLW91dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00MjM0LDEyICs0MTU2LDI3IEBACiAKIHN0YXRpYyBpbnQgc2VsaW51eF9za19hbGxvY19zZWN1cml0eShzdHJ1Y3Qgc29jayAqc2ssIGludCBmYW1pbHksIGdmcF90IHByaW9yaXR5KQogewotCXJldHVybiBza19hbGxvY19zZWN1cml0eShzaywgZmFtaWx5LCBwcmlvcml0eSk7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWM7CisKKwlza3NlYyA9IGt6YWxsb2Moc2l6ZW9mKCpza3NlYyksIHByaW9yaXR5KTsKKwlpZiAoIXNrc2VjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrc2VjLT5wZWVyX3NpZCA9IFNFQ0lOSVRTSURfVU5MQUJFTEVEOworCXNrc2VjLT5zaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKKwlzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9yZXNldChza3NlYyk7CisJc2stPnNrX3NlY3VyaXR5ID0gc2tzZWM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2VsaW51eF9za19mcmVlX3NlY3VyaXR5KHN0cnVjdCBzb2NrICpzaykKIHsKLQlza19mcmVlX3NlY3VyaXR5KHNrKTsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNrLT5za19zZWN1cml0eTsKKworCXNrLT5za19zZWN1cml0eSA9IE5VTEw7CisJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfZnJlZShza3NlYyk7CisJa2ZyZWUoc2tzZWMpOwogfQogCiBzdGF0aWMgdm9pZCBzZWxpbnV4X3NrX2Nsb25lX3NlY3VyaXR5KGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKm5ld3NrKQpAQCAtNDM5OSw4ICs0MzM2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAl1MzIgcGVybTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc2stPnNrX3NvY2tldDsKLQlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNrLT5za19zZWN1cml0eTsKIAogCWlmIChza2ItPmxlbiA8IE5MTVNHX1NQQUNFKDApKSB7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC00NDA4LDEzICs0MzQ0LDEzIEBACiAJfQogCW5saCA9IG5sbXNnX2hkcihza2IpOwogCi0JZXJyID0gc2VsaW51eF9ubG1zZ19sb29rdXAoaXNlYy0+c2NsYXNzLCBubGgtPm5sbXNnX3R5cGUsICZwZXJtKTsKKwllcnIgPSBzZWxpbnV4X25sbXNnX2xvb2t1cChza3NlYy0+c2NsYXNzLCBubGgtPm5sbXNnX3R5cGUsICZwZXJtKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVJTlZBTCkgewogCQkJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9LRVJORUwsIEFVRElUX1NFTElOVVhfRVJSLAogCQkJCSAgIlNFTGludXg6ICB1bnJlY29nbml6ZWQgbmV0bGluayBtZXNzYWdlIgogCQkJCSAgIiB0eXBlPSVodSBmb3Igc2NsYXNzPSVodVxuIiwKLQkJCQkgIG5saC0+bmxtc2dfdHlwZSwgaXNlYy0+c2NsYXNzKTsKKwkJCQkgIG5saC0+bmxtc2dfdHlwZSwgc2tzZWMtPnNjbGFzcyk7CiAJCQlpZiAoIXNlbGludXhfZW5mb3JjaW5nIHx8IHNlY3VyaXR5X2dldF9hbGxvd191bmtub3duKCkpCiAJCQkJZXJyID0gMDsKIAkJfQpAQCAtNDQyNSw3ICs0MzYxLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyID0gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIHBlcm0pOworCWVyciA9IHNvY2tfaGFzX3Blcm0oY3VycmVudCwgc2ssIHBlcm0pOwogb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NtYXAuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oCmluZGV4IDhiMzJlOTUuLmI0YzllYjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oCkBAIC0yLDcgKzIsOCBAQAogICAgICJnZXRhdHRyIiwgInNldGF0dHIiLCAibG9jayIsICJyZWxhYmVsZnJvbSIsICJyZWxhYmVsdG8iLCAiYXBwZW5kIgogCiAjZGVmaW5lIENPTU1PTl9GSUxFX1BFUk1TIENPTU1PTl9GSUxFX1NPQ0tfUEVSTVMsICJ1bmxpbmsiLCAibGluayIsIFwKLSAgICAicmVuYW1lIiwgImV4ZWN1dGUiLCAic3dhcG9uIiwgInF1b3Rhb24iLCAibW91bnRvbiIKKyAgICAicmVuYW1lIiwgImV4ZWN1dGUiLCAic3dhcG9uIiwgInF1b3Rhb24iLCAibW91bnRvbiIsICJhdWRpdF9hY2Nlc3MiLCBcCisgICAgIm9wZW4iLCAiZXhlY21vZCIKIAogI2RlZmluZSBDT01NT05fU09DS19QRVJNUyBDT01NT05fRklMRV9TT0NLX1BFUk1TLCAiYmluZCIsICJjb25uZWN0IiwgXAogICAgICJsaXN0ZW4iLCAiYWNjZXB0IiwgImdldG9wdCIsICJzZXRvcHQiLCAic2h1dGRvd24iLCAicmVjdmZyb20iLCAgXApAQCAtNDMsMjIgKzQ0LDIxIEBACiAJICAgICJxdW90YWdldCIsIE5VTEwgfSB9LAogCXsgImZpbGUiLAogCSAgeyBDT01NT05fRklMRV9QRVJNUywKLQkgICAgImV4ZWN1dGVfbm9fdHJhbnMiLCAiZW50cnlwb2ludCIsICJleGVjbW9kIiwgIm9wZW4iLCBOVUxMIH0gfSwKKwkgICAgImV4ZWN1dGVfbm9fdHJhbnMiLCAiZW50cnlwb2ludCIsIE5VTEwgfSB9LAogCXsgImRpciIsCiAJICB7IENPTU1PTl9GSUxFX1BFUk1TLCAiYWRkX25hbWUiLCAicmVtb3ZlX25hbWUiLAotCSAgICAicmVwYXJlbnQiLCAic2VhcmNoIiwgInJtZGlyIiwgIm9wZW4iLCBOVUxMIH0gfSwKKwkgICAgInJlcGFyZW50IiwgInNlYXJjaCIsICJybWRpciIsIE5VTEwgfSB9LAogCXsgImZkIiwgeyAidXNlIiwgTlVMTCB9IH0sCiAJeyAibG5rX2ZpbGUiLAogCSAgeyBDT01NT05fRklMRV9QRVJNUywgTlVMTCB9IH0sCiAJeyAiY2hyX2ZpbGUiLAotCSAgeyBDT01NT05fRklMRV9QRVJNUywKLQkgICAgImV4ZWN1dGVfbm9fdHJhbnMiLCAiZW50cnlwb2ludCIsICJleGVjbW9kIiwgIm9wZW4iLCBOVUxMIH0gfSwKKwkgIHsgQ09NTU9OX0ZJTEVfUEVSTVMsIE5VTEwgfSB9LAogCXsgImJsa19maWxlIiwKLQkgIHsgQ09NTU9OX0ZJTEVfUEVSTVMsICJvcGVuIiwgTlVMTCB9IH0sCisJICB7IENPTU1PTl9GSUxFX1BFUk1TLCBOVUxMIH0gfSwKIAl7ICJzb2NrX2ZpbGUiLAotCSAgeyBDT01NT05fRklMRV9QRVJNUywgIm9wZW4iLCBOVUxMIH0gfSwKKwkgIHsgQ09NTU9OX0ZJTEVfUEVSTVMsIE5VTEwgfSB9LAogCXsgImZpZm9fZmlsZSIsCi0JICB7IENPTU1PTl9GSUxFX1BFUk1TLCAib3BlbiIsIE5VTEwgfSB9LAorCSAgeyBDT01NT05fRklMRV9QRVJNUywgTlVMTCB9IH0sCiAJeyAic29ja2V0IiwKIAkgIHsgQ09NTU9OX1NPQ0tfUEVSTVMsIE5VTEwgfSB9LAogCXsgInRjcF9zb2NrZXQiLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9uZXRub2RlLmMgYi9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYwppbmRleCBkYzkyNzkyLi42NWViZmU5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYwpAQCAtMTgzLDggKzE4Myw2IEBACiAJCUJVRygpOwogCX0KIAotCUlOSVRfUkNVX0hFQUQoJm5vZGUtPnJjdSk7Ci0KIAkvKiB3ZSBuZWVkIHRvIGltcG9zZSBhIGxpbWl0IG9uIHRoZSBncm93dGggb2YgdGhlIGhhc2ggdGFibGUgc28gY2hlY2sKIAkgKiB0aGlzIGJ1Y2tldCB0byBtYWtlIHN1cmUgaXQgaXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgYm91bmRzICovCiAJbGlzdF9hZGRfcmN1KCZub2RlLT5saXN0LCAmc2VsX25ldG5vZGVfaGFzaFtpZHhdLmxpc3QpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggMDI5Mzg0My4uNzlhMWJiNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC0xODQsNiArMTg0LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9lbmZvcmNlX29wcyA9IHsKIAkucmVhZAkJPSBzZWxfcmVhZF9lbmZvcmNlLAogCS53cml0ZQkJPSBzZWxfd3JpdGVfZW5mb3JjZSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgc3NpemVfdCBzZWxfcmVhZF9oYW5kbGVfdW5rbm93bihzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKQEAgLTIwMSw2ICsyMDIsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfaGFuZGxlX3Vua25vd25fb3BzID0gewogCS5yZWFkCQk9IHNlbF9yZWFkX2hhbmRsZV91bmtub3duLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9ESVNBQkxFCkBAIC0yNTEsNiArMjUzLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2VsX2Rpc2FibGVfb3BzID0gewogCS53cml0ZQkJPSBzZWxfd3JpdGVfZGlzYWJsZSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgc3NpemVfdCBzZWxfcmVhZF9wb2xpY3l2ZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLApAQCAtMjY1LDYgKzI2OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9wb2xpY3l2ZXJzX29wcyA9IHsKIAkucmVhZAkJPSBzZWxfcmVhZF9wb2xpY3l2ZXJzLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIC8qIGRlY2xhcmF0aW9uIGZvciBzZWxfd3JpdGVfbG9hZCAqLwpAQCAtMjg5LDYgKzI5Myw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9tbHNfb3BzID0gewogCS5yZWFkCQk9IHNlbF9yZWFkX21scywKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfbG9hZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKQEAgLTM1Niw2ICszNjEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfbG9hZF9vcHMgPSB7CiAJLndyaXRlCQk9IHNlbF93cml0ZV9sb2FkLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jb250ZXh0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQpAQCAtNDM3LDYgKzQ0Myw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfY2hlY2tyZXFwcm90X29wcyA9IHsKIAkucmVhZAkJPSBzZWxfcmVhZF9jaGVja3JlcXByb3QsCiAJLndyaXRlCQk9IHNlbF93cml0ZV9jaGVja3JlcXByb3QsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogLyoKQEAgLTQ4Miw2ICs0ODksNyBAQAogCS53cml0ZQkJPSBzZWxpbnV4X3RyYW5zYWN0aW9uX3dyaXRlLAogCS5yZWFkCQk9IHNpbXBsZV90cmFuc2FjdGlvbl9yZWFkLAogCS5yZWxlYXNlCT0gc2ltcGxlX3RyYW5zYWN0aW9uX3JlbGVhc2UsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogLyoKQEAgLTg4Myw2ICs4OTEsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2VsX2Jvb2xfb3BzID0gewogCS5yZWFkCQk9IHNlbF9yZWFkX2Jvb2wsCiAJLndyaXRlCQk9IHNlbF93cml0ZV9ib29sLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF9jb21taXRfYm9vbHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGVwLApAQCAtOTM1LDYgKzk0NCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9jb21taXRfYm9vbHNfb3BzID0gewogCS53cml0ZQkJPSBzZWxfY29tbWl0X2Jvb2xzX3dyaXRlLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyB2b2lkIHNlbF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgZGVudHJ5ICpkZSkKQEAgLTExMjcsMTAgKzExMzcsMTIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9hdmNfY2FjaGVfdGhyZXNob2xkX29wcyA9IHsKIAkucmVhZAkJPSBzZWxfcmVhZF9hdmNfY2FjaGVfdGhyZXNob2xkLAogCS53cml0ZQkJPSBzZWxfd3JpdGVfYXZjX2NhY2hlX3RocmVzaG9sZCwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfYXZjX2hhc2hfc3RhdHNfb3BzID0gewogCS5yZWFkCQk9IHNlbF9yZWFkX2F2Y19oYXNoX3N0YXRzLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9BVkNfU1RBVFMKQEAgLTEyNTUsNiArMTI2Nyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9pbml0Y29uX29wcyA9IHsKIAkucmVhZAkJPSBzZWxfcmVhZF9pbml0Y29uLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBpbnQgc2VsX21ha2VfaW5pdGNvbl9maWxlcyhzdHJ1Y3QgZGVudHJ5ICpkaXIpCkBAIC0xMzMwLDYgKzEzNDMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfY2xhc3Nfb3BzID0gewogCS5yZWFkCQk9IHNlbF9yZWFkX2NsYXNzLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF9yZWFkX3Blcm0oc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCkBAIC0xMzU0LDYgKzEzNjgsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfcGVybV9vcHMgPSB7CiAJLnJlYWQJCT0gc2VsX3JlYWRfcGVybSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiBzdGF0aWMgc3NpemVfdCBzZWxfcmVhZF9wb2xpY3ljYXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCkBAIC0xMzcyLDYgKzEzODcsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfcG9saWN5Y2FwX29wcyA9IHsKIAkucmVhZAkJPSBzZWxfcmVhZF9wb2xpY3ljYXAsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogc3RhdGljIGludCBzZWxfbWFrZV9wZXJtX2ZpbGVzKGNoYXIgKm9iamNsYXNzLCBpbnQgY2xhc3N2YWx1ZSwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYwppbmRleCAxMjE1YjhlLi45Mjk0ODBjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jCkBAIC0zNDIsMjAgKzM0MiwyMCBAQAogCiAJaWYgKHZlcnMgPCBQT0xJQ1lEQl9WRVJTSU9OX0FWVEFCKSB7CiAJCXJjID0gbmV4dF9lbnRyeShidWYzMiwgZnAsIHNpemVvZih1MzIpKTsKLQkJaWYgKHJjIDwgMCkgeworCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IHRydW5jYXRlZCBlbnRyeVxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gcmM7CiAJCX0KIAkJaXRlbXMyID0gbGUzMl90b19jcHUoYnVmMzJbMF0pOwogCQlpZiAoaXRlbXMyID4gQVJSQVlfU0laRShidWYzMikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IGVudHJ5IG92ZXJmbG93XG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJCX0KIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZjMyLCBmcCwgc2l6ZW9mKHUzMikqaXRlbXMyKTsKLQkJaWYgKHJjIDwgMCkgeworCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IHRydW5jYXRlZCBlbnRyeVxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gcmM7CiAJCX0KIAkJaXRlbXMgPSAwOwogCkBAIC0zNjMsMTkgKzM2MywxOSBAQAogCQlrZXkuc291cmNlX3R5cGUgPSAodTE2KXZhbDsKIAkJaWYgKGtleS5zb3VyY2VfdHlwZSAhPSB2YWwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IHRydW5jYXRlZCBzb3VyY2UgdHlwZVxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl2YWwgPSBsZTMyX3RvX2NwdShidWYzMltpdGVtcysrXSk7CiAJCWtleS50YXJnZXRfdHlwZSA9ICh1MTYpdmFsOwogCQlpZiAoa2V5LnRhcmdldF90eXBlICE9IHZhbCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBhdnRhYjogdHJ1bmNhdGVkIHRhcmdldCB0eXBlXG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXZhbCA9IGxlMzJfdG9fY3B1KGJ1ZjMyW2l0ZW1zKytdKTsKIAkJa2V5LnRhcmdldF9jbGFzcyA9ICh1MTYpdmFsOwogCQlpZiAoa2V5LnRhcmdldF9jbGFzcyAhPSB2YWwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IHRydW5jYXRlZCB0YXJnZXQgY2xhc3NcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQl2YWwgPSBsZTMyX3RvX2NwdShidWYzMltpdGVtcysrXSk7CkBAIC0zODMsMTIgKzM4MywxMiBAQAogCiAJCWlmICghKHZhbCAmIChBVlRBQl9BViB8IEFWVEFCX1RZUEUpKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBhdnRhYjogbnVsbCBlbnRyeVxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoKHZhbCAmIEFWVEFCX0FWKSAmJgogCQkgICAgKHZhbCAmIEFWVEFCX1RZUEUpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGF2dGFiOiBlbnRyeSBoYXMgYm90aCBhY2Nlc3MgdmVjdG9ycyBhbmQgdHlwZXNcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcGVjX29yZGVyKTsgaSsrKSB7CkBAIC00MDMsMTUgKzQwMywxNSBAQAogCiAJCWlmIChpdGVtcyAhPSBpdGVtczIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IGVudHJ5IG9ubHkgaGFkICVkIGl0ZW1zLCBleHBlY3RlZCAlZFxuIiwgaXRlbXMyLCBpdGVtcyk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlyZXR1cm4gMDsKIAl9CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmMTYsIGZwLCBzaXplb2YodTE2KSo0KTsKLQlpZiAocmMgPCAwKSB7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IHRydW5jYXRlZCBlbnRyeVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIHJjOwogCX0KIAogCWl0ZW1zID0gMDsKQEAgLTQyNCw3ICs0MjQsNyBAQAogCSAgICAhcG9saWN5ZGJfdHlwZV9pc3ZhbGlkKHBvbCwga2V5LnRhcmdldF90eXBlKSB8fAogCSAgICAhcG9saWN5ZGJfY2xhc3NfaXN2YWxpZChwb2wsIGtleS50YXJnZXRfY2xhc3MpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IGludmFsaWQgdHlwZSBvciBjbGFzc1xuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc2V0ID0gMDsKQEAgLTQzNCwxOSArNDM0LDE5IEBACiAJfQogCWlmICghc2V0IHx8IHNldCA+IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgYXZ0YWI6ICBtb3JlIHRoYW4gb25lIHNwZWNpZmllclxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZjMyLCBmcCwgc2l6ZW9mKHUzMikpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBhdnRhYjogdHJ1bmNhdGVkIGVudHJ5XG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gcmM7CiAJfQogCWRhdHVtLmRhdGEgPSBsZTMyX3RvX2NwdSgqYnVmMzIpOwogCWlmICgoa2V5LnNwZWNpZmllZCAmIEFWVEFCX1RZUEUpICYmCiAJICAgICFwb2xpY3lkYl90eXBlX2lzdmFsaWQocG9sLCBkYXR1bS5kYXRhKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGF2dGFiOiBpbnZhbGlkIHR5cGVcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gaW5zZXJ0ZihhLCAma2V5LCAmZGF0dW0sIHApOwogfQpAQCAtNDg3LDggKzQ4Nyw3IEBACiAJCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBhdnRhYjogb3V0IG9mIG1lbW9yeVxuIik7CiAJCQllbHNlIGlmIChyYyA9PSAtRUVYSVNUKQogCQkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogYXZ0YWI6IGR1cGxpY2F0ZSBlbnRyeVxuIik7Ci0JCQllbHNlCi0JCQkJcmMgPSAtRUlOVkFMOworCiAJCQlnb3RvIGJhZDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwppbmRleCA0YTRlMzVjLi5jOTFlMTUwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCkBAIC0xMTcsMTAgKzExNywxNCBAQAogCiBpbnQgY29uZF9wb2xpY3lkYl9pbml0KHN0cnVjdCBwb2xpY3lkYiAqcCkKIHsKKwlpbnQgcmM7CisKIAlwLT5ib29sX3ZhbF90b19zdHJ1Y3QgPSBOVUxMOwogCXAtPmNvbmRfbGlzdCA9IE5VTEw7Ci0JaWYgKGF2dGFiX2luaXQoJnAtPnRlX2NvbmRfYXZ0YWIpKQotCQlyZXR1cm4gLTE7CisKKwlyYyA9IGF2dGFiX2luaXQoJnAtPnRlX2NvbmRfYXZ0YWIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTksMzQgKzIyMywzNyBAQAogCiAJYm9vbGRhdHVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbmRfYm9vbF9kYXR1bSksIEdGUF9LRVJORUwpOwogCWlmICghYm9vbGRhdHVtKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGVycjsKIAogCWJvb2xkYXR1bS0+dmFsdWUgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWJvb2xkYXR1bS0+c3RhdGUgPSBsZTMyX3RvX2NwdShidWZbMV0pOwogCisJcmMgPSAtRUlOVkFMOwogCWlmICghYm9vbF9pc3ZhbGlkKGJvb2xkYXR1bSkpCiAJCWdvdG8gZXJyOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmICgha2V5KQogCQlnb3RvIGVycjsKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBlcnI7CiAJa2V5W2xlbl0gPSAnXDAnOwotCWlmIChoYXNodGFiX2luc2VydChoLCBrZXksIGJvb2xkYXR1bSkpCisJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGJvb2xkYXR1bSk7CisJaWYgKHJjKQogCQlnb3RvIGVycjsKIAogCXJldHVybiAwOwogZXJyOgogCWNvbmRfZGVzdHJveV9ib29sKGtleSwgYm9vbGRhdHVtLCBOVUxMKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIHJjOwogfQogCiBzdHJ1Y3QgY29uZF9pbnNlcnRmX2RhdGEgewpAQCAtMjYzLDcgKzI3MCw3IEBACiAJc3RydWN0IGNvbmRfYXZfbGlzdCAqb3RoZXIgPSBkYXRhLT5vdGhlciwgKmxpc3QsICpjdXI7CiAJc3RydWN0IGF2dGFiX25vZGUgKm5vZGVfcHRyOwogCXU4IGZvdW5kOwotCisJaW50IHJjID0gLUVJTlZBTDsKIAogCS8qCiAJICogRm9yIHR5cGUgcnVsZXMgd2UgaGF2ZSB0byBtYWtlIGNlcnRhaW4gdGhlcmUgYXJlbid0IGFueQpAQCAtMzEzLDEyICszMjAsMTUgQEAKIAlub2RlX3B0ciA9IGF2dGFiX2luc2VydF9ub251bmlxdWUoJnAtPnRlX2NvbmRfYXZ0YWIsIGssIGQpOwogCWlmICghbm9kZV9wdHIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBjb3VsZCBub3QgaW5zZXJ0IHJ1bGUuXG4iKTsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CiAKIAlsaXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbmRfYXZfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghbGlzdCkKKwlpZiAoIWxpc3QpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKKwl9CiAKIAlsaXN0LT5ub2RlID0gbm9kZV9wdHI7CiAJaWYgKCFkYXRhLT5oZWFkKQpAQCAtMzMxLDcgKzM0MSw3IEBACiBlcnI6CiAJY29uZF9hdl9saXN0X2Rlc3Ryb3koZGF0YS0+aGVhZCk7CiAJZGF0YS0+aGVhZCA9IE5VTEw7Ci0JcmV0dXJuIC0xOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjb25kX3JlYWRfYXZfbGlzdChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHZvaWQgKmZwLCBzdHJ1Y3QgY29uZF9hdl9saXN0ICoqcmV0X2xpc3QsIHN0cnVjdCBjb25kX2F2X2xpc3QgKm90aGVyKQpAQCAtMzQ1LDggKzM1NSw4IEBACiAKIAlsZW4gPSAwOwogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIC0xOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAobGVuID09IDApCkBAIC0zNjEsNyArMzcxLDYgQEAKIAkJCQkgICAgICZkYXRhKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwotCiAJfQogCiAJKnJldF9saXN0ID0gZGF0YS5oZWFkOwpAQCAtMzkwLDI0ICszOTksMjUgQEAKIAlzdHJ1Y3QgY29uZF9leHByICpleHByID0gTlVMTCwgKmxhc3QgPSBOVUxMOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gLTE7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlub2RlLT5jdXJfc3RhdGUgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCiAJbGVuID0gMDsKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiAtMTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCS8qIGV4cHIgKi8KIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSAqIDIpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGVycjsKIAorCQlyYyA9IC1FTk9NRU07CiAJCWV4cHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZF9leHByKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZXhwcikKIAkJCWdvdG8gZXJyOwpAQCAtNDE2LDYgKzQyNiw3IEBACiAJCWV4cHItPmJvb2wgPSBsZTMyX3RvX2NwdShidWZbMV0pOwogCiAJCWlmICghZXhwcl9pc3ZhbGlkKHAsIGV4cHIpKSB7CisJCQlyYyA9IC1FSU5WQUw7CiAJCQlrZnJlZShleHByKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC00MjcsMTQgKzQzOCwxNiBAQAogCQlsYXN0ID0gZXhwcjsKIAl9CiAKLQlpZiAoY29uZF9yZWFkX2F2X2xpc3QocCwgZnAsICZub2RlLT50cnVlX2xpc3QsIE5VTEwpICE9IDApCisJcmMgPSBjb25kX3JlYWRfYXZfbGlzdChwLCBmcCwgJm5vZGUtPnRydWVfbGlzdCwgTlVMTCk7CisJaWYgKHJjKQogCQlnb3RvIGVycjsKLQlpZiAoY29uZF9yZWFkX2F2X2xpc3QocCwgZnAsICZub2RlLT5mYWxzZV9saXN0LCBub2RlLT50cnVlX2xpc3QpICE9IDApCisJcmMgPSBjb25kX3JlYWRfYXZfbGlzdChwLCBmcCwgJm5vZGUtPmZhbHNlX2xpc3QsIG5vZGUtPnRydWVfbGlzdCk7CisJaWYgKHJjKQogCQlnb3RvIGVycjsKIAlyZXR1cm4gMDsKIGVycjoKIAljb25kX25vZGVfZGVzdHJveShub2RlKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIHJjOwogfQogCiBpbnQgY29uZF9yZWFkX2xpc3Qoc3RydWN0IHBvbGljeWRiICpwLCB2b2lkICpmcCkKQEAgLTQ0NSw4ICs0NTgsOCBAQAogCWludCByYzsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gLTE7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCkBAIC00NTUsMTEgKzQ2OCwxMyBAQAogCQlnb3RvIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlyYyA9IC1FTk9NRU07CiAJCW5vZGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZF9ub2RlKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbm9kZSkKIAkJCWdvdG8gZXJyOwogCi0JCWlmIChjb25kX3JlYWRfbm9kZShwLCBub2RlLCBmcCkgIT0gMCkKKwkJcmMgPSBjb25kX3JlYWRfbm9kZShwLCBub2RlLCBmcCk7CisJCWlmIChyYykKIAkJCWdvdG8gZXJyOwogCiAJCWlmIChpID09IDApCkBAIC00NzIsNyArNDg3LDcgQEAKIGVycjoKIAljb25kX2xpc3RfZGVzdHJveShwLT5jb25kX2xpc3QpOwogCXAtPmNvbmRfbGlzdCA9IE5VTEw7Ci0JcmV0dXJuIC0xOworCXJldHVybiByYzsKIH0KIAogLyogRGV0ZXJtaW5lIHdoZXRoZXIgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUgZ3JhbnRlZCBieSB0aGUgY29uZGl0aW9uYWwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwppbmRleCBjNTc4MDJhLi4zYTI5NzA0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZsZXhfYXJyYXkuaD4KICNpbmNsdWRlICJzZWN1cml0eS5oIgogCiAjaW5jbHVkZSAicG9saWN5ZGIuaCIKQEAgLTY1NSw2ICs2NTYsOSBAQAogCiBzdGF0aWMgdm9pZCBvY29udGV4dF9kZXN0cm95KHN0cnVjdCBvY29udGV4dCAqYywgaW50IGkpCiB7CisJaWYgKCFjKQorCQlyZXR1cm47CisKIAljb250ZXh0X2Rlc3Ryb3koJmMtPmNvbnRleHRbMF0pOwogCWNvbnRleHRfZGVzdHJveSgmYy0+Y29udGV4dFsxXSk7CiAJaWYgKGkgPT0gT0NPTl9JU0lEIHx8IGkgPT0gT0NPTl9GUyB8fApAQCAtNzM2LDExICs3NDAsMTcgQEAKIAloYXNodGFiX21hcChwLT5yYW5nZV90ciwgcmFuZ2VfdHJfZGVzdHJveSwgTlVMTCk7CiAJaGFzaHRhYl9kZXN0cm95KHAtPnJhbmdlX3RyKTsKIAotCWlmIChwLT50eXBlX2F0dHJfbWFwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBwLT5wX3R5cGVzLm5wcmltOyBpKyspCi0JCQllYml0bWFwX2Rlc3Ryb3koJnAtPnR5cGVfYXR0cl9tYXBbaV0pOworCWlmIChwLT50eXBlX2F0dHJfbWFwX2FycmF5KSB7CisJCWZvciAoaSA9IDA7IGkgPCBwLT5wX3R5cGVzLm5wcmltOyBpKyspIHsKKwkJCXN0cnVjdCBlYml0bWFwICplOworCisJCQllID0gZmxleF9hcnJheV9nZXQocC0+dHlwZV9hdHRyX21hcF9hcnJheSwgaSk7CisJCQlpZiAoIWUpCisJCQkJY29udGludWU7CisJCQllYml0bWFwX2Rlc3Ryb3koZSk7CisJCX0KKwkJZmxleF9hcnJheV9mcmVlKHAtPnR5cGVfYXR0cl9tYXBfYXJyYXkpOwogCX0KLQlrZnJlZShwLT50eXBlX2F0dHJfbWFwKTsKIAllYml0bWFwX2Rlc3Ryb3koJnAtPnBvbGljeWNhcHMpOwogCWViaXRtYXBfZGVzdHJveSgmcC0+cGVybWlzc2l2ZV9tYXApOwogCkBAIC0xNzAxLDYgKzE3MTEsMzMzIEBACiAJcmV0dXJuIDFVIDw8IChwZXJkYXR1bS0+dmFsdWUtMSk7CiB9CiAKK3N0YXRpYyBpbnQgcmFuZ2VfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHZvaWQgKmZwKQoreworCXN0cnVjdCByYW5nZV90cmFucyAqcnQgPSBOVUxMOworCXN0cnVjdCBtbHNfcmFuZ2UgKnIgPSBOVUxMOworCWludCBpLCByYzsKKwlfX2xlMzIgYnVmWzJdOworCXUzMiBuZWw7CisKKwlpZiAocC0+cG9saWN5dmVycyA8IFBPTElDWURCX1ZFUlNJT05fTUxTKQorCQlyZXR1cm4gMDsKKworCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCW5lbCA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CisJZm9yIChpID0gMDsgaSA8IG5lbDsgaSsrKSB7CisJCXJjID0gLUVOT01FTTsKKwkJcnQgPSBremFsbG9jKHNpemVvZigqcnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFydCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCAoc2l6ZW9mKHUzMikgKiAyKSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCisJCXJ0LT5zb3VyY2VfdHlwZSA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CisJCXJ0LT50YXJnZXRfdHlwZSA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CisJCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUkFOR0VUUkFOUykgeworCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIG91dDsKKwkJCXJ0LT50YXJnZXRfY2xhc3MgPSBsZTMyX3RvX2NwdShidWZbMF0pOworCQl9IGVsc2UKKwkJCXJ0LT50YXJnZXRfY2xhc3MgPSBwLT5wcm9jZXNzX2NsYXNzOworCisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKCFwb2xpY3lkYl90eXBlX2lzdmFsaWQocCwgcnQtPnNvdXJjZV90eXBlKSB8fAorCQkgICAgIXBvbGljeWRiX3R5cGVfaXN2YWxpZChwLCBydC0+dGFyZ2V0X3R5cGUpIHx8CisJCSAgICAhcG9saWN5ZGJfY2xhc3NfaXN2YWxpZChwLCBydC0+dGFyZ2V0X2NsYXNzKSkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gLUVOT01FTTsKKwkJciA9IGt6YWxsb2Moc2l6ZW9mKCpyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcikKKwkJCWdvdG8gb3V0OworCisJCXJjID0gbWxzX3JlYWRfcmFuZ2VfaGVscGVyKHIsIGZwKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoIW1sc19yYW5nZV9pc3ZhbGlkKHAsIHIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTRUxpbnV4OiAgcmFuZ2V0cmFuczogIGludmFsaWQgcmFuZ2VcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyYyA9IGhhc2h0YWJfaW5zZXJ0KHAtPnJhbmdlX3RyLCBydCwgcik7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCisJCXJ0ID0gTlVMTDsKKwkJciA9IE5VTEw7CisJfQorCXJhbmdldHJfaGFzaF9ldmFsKHAtPnJhbmdlX3RyKTsKKwlyYyA9IDA7CitvdXQ6CisJa2ZyZWUocnQpOworCWtmcmVlKHIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnZW5mc19yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgdm9pZCAqZnApCit7CisJaW50IGksIGosIHJjOworCXUzMiBuZWwsIG5lbDIsIGxlbiwgbGVuMjsKKwlfX2xlMzIgYnVmWzFdOworCXN0cnVjdCBvY29udGV4dCAqbCwgKmM7CisJc3RydWN0IG9jb250ZXh0ICpuZXdjID0gTlVMTDsKKwlzdHJ1Y3QgZ2VuZnMgKmdlbmZzX3AsICpnZW5mczsKKwlzdHJ1Y3QgZ2VuZnMgKm5ld2dlbmZzID0gTlVMTDsKKworCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwluZWwgPSBsZTMyX3RvX2NwdShidWZbMF0pOworCisJZm9yIChpID0gMDsgaSA8IG5lbDsgaSsrKSB7CisJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCQlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOworCisJCXJjID0gLUVOT01FTTsKKwkJbmV3Z2VuZnMgPSBremFsbG9jKHNpemVvZigqbmV3Z2VuZnMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdnZW5mcykKKwkJCWdvdG8gb3V0OworCisJCXJjID0gLUVOT01FTTsKKwkJbmV3Z2VuZnMtPmZzdHlwZSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3Z2VuZnMtPmZzdHlwZSkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gbmV4dF9lbnRyeShuZXdnZW5mcy0+ZnN0eXBlLCBmcCwgbGVuKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisKKwkJbmV3Z2VuZnMtPmZzdHlwZVtsZW5dID0gMDsKKworCQlmb3IgKGdlbmZzX3AgPSBOVUxMLCBnZW5mcyA9IHAtPmdlbmZzOyBnZW5mczsKKwkJICAgICBnZW5mc19wID0gZ2VuZnMsIGdlbmZzID0gZ2VuZnMtPm5leHQpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWlmIChzdHJjbXAobmV3Z2VuZnMtPmZzdHlwZSwgZ2VuZnMtPmZzdHlwZSkgPT0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIGR1cCBnZW5mcyBmc3R5cGUgJXNcbiIsCisJCQkJICAgICAgIG5ld2dlbmZzLT5mc3R5cGUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKHN0cmNtcChuZXdnZW5mcy0+ZnN0eXBlLCBnZW5mcy0+ZnN0eXBlKSA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJbmV3Z2VuZnMtPm5leHQgPSBnZW5mczsKKwkJaWYgKGdlbmZzX3ApCisJCQlnZW5mc19wLT5uZXh0ID0gbmV3Z2VuZnM7CisJCWVsc2UKKwkJCXAtPmdlbmZzID0gbmV3Z2VuZnM7CisJCWdlbmZzID0gbmV3Z2VuZnM7CisJCW5ld2dlbmZzID0gTlVMTDsKKworCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKworCQluZWwyID0gbGUzMl90b19jcHUoYnVmWzBdKTsKKwkJZm9yIChqID0gMDsgaiA8IG5lbDI7IGorKykgeworCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIG91dDsKKwkJCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CisKKwkJCXJjID0gLUVOT01FTTsKKwkJCW5ld2MgPSBremFsbG9jKHNpemVvZigqbmV3YyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFuZXdjKQorCQkJCWdvdG8gb3V0OworCisJCQlyYyA9IC1FTk9NRU07CisJCQluZXdjLT51Lm5hbWUgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCFuZXdjLT51Lm5hbWUpCisJCQkJZ290byBvdXQ7CisKKwkJCXJjID0gbmV4dF9lbnRyeShuZXdjLT51Lm5hbWUsIGZwLCBsZW4pOworCQkJaWYgKHJjKQorCQkJCWdvdG8gb3V0OworCQkJbmV3Yy0+dS5uYW1lW2xlbl0gPSAwOworCisJCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gb3V0OworCisJCQluZXdjLT52LnNjbGFzcyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CisJCQlyYyA9IGNvbnRleHRfcmVhZF9hbmRfdmFsaWRhdGUoJm5ld2MtPmNvbnRleHRbMF0sIHAsIGZwKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIG91dDsKKworCQkJZm9yIChsID0gTlVMTCwgYyA9IGdlbmZzLT5oZWFkOyBjOworCQkJICAgICBsID0gYywgYyA9IGMtPm5leHQpIHsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJaWYgKCFzdHJjbXAobmV3Yy0+dS5uYW1lLCBjLT51Lm5hbWUpICYmCisJCQkJICAgICghYy0+di5zY2xhc3MgfHwgIW5ld2MtPnYuc2NsYXNzIHx8CisJCQkJICAgICBuZXdjLT52LnNjbGFzcyA9PSBjLT52LnNjbGFzcykpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgZHVwIGdlbmZzIGVudHJ5ICglcywlcylcbiIsCisJCQkJCSAgICAgICBnZW5mcy0+ZnN0eXBlLCBjLT51Lm5hbWUpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbGVuID0gc3RybGVuKG5ld2MtPnUubmFtZSk7CisJCQkJbGVuMiA9IHN0cmxlbihjLT51Lm5hbWUpOworCQkJCWlmIChsZW4gPiBsZW4yKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJbmV3Yy0+bmV4dCA9IGM7CisJCQlpZiAobCkKKwkJCQlsLT5uZXh0ID0gbmV3YzsKKwkJCWVsc2UKKwkJCQlnZW5mcy0+aGVhZCA9IG5ld2M7CisJCQluZXdjID0gTlVMTDsKKwkJfQorCX0KKwlyYyA9IDA7CitvdXQ6CisJaWYgKG5ld2dlbmZzKQorCQlrZnJlZShuZXdnZW5mcy0+ZnN0eXBlKTsKKwlrZnJlZShuZXdnZW5mcyk7CisJb2NvbnRleHRfZGVzdHJveShuZXdjLCBPQ09OX0ZTVVNFKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvY29udGV4dF9yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IHBvbGljeWRiX2NvbXBhdF9pbmZvICppbmZvLAorCQkJIHZvaWQgKmZwKQoreworCWludCBpLCBqLCByYzsKKwl1MzIgbmVsLCBsZW47CisJX19sZTMyIGJ1ZlszXTsKKwlzdHJ1Y3Qgb2NvbnRleHQgKmwsICpjOworCXUzMiBub2RlYnVmWzhdOworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPm9jb25fbnVtOyBpKyspIHsKKwkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJCW5lbCA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CisKKwkJbCA9IE5VTEw7CisJCWZvciAoaiA9IDA7IGogPCBuZWw7IGorKykgeworCQkJcmMgPSAtRU5PTUVNOworCQkJYyA9IGt6YWxsb2Moc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWMpCisJCQkJZ290byBvdXQ7CisJCQlpZiAobCkKKwkJCQlsLT5uZXh0ID0gYzsKKwkJCWVsc2UKKwkJCQlwLT5vY29udGV4dHNbaV0gPSBjOworCQkJbCA9IGM7CisKKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSBPQ09OX0lTSUQ6CisJCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCisJCQkJYy0+c2lkWzBdID0gbGUzMl90b19jcHUoYnVmWzBdKTsKKwkJCQlyYyA9IGNvbnRleHRfcmVhZF9hbmRfdmFsaWRhdGUoJmMtPmNvbnRleHRbMF0sIHAsIGZwKTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCQkJCWJyZWFrOworCQkJY2FzZSBPQ09OX0ZTOgorCQkJY2FzZSBPQ09OX05FVElGOgorCQkJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7CisJCQkJaWYgKHJjKQorCQkJCQlnb3RvIG91dDsKKwkJCQlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOworCisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWMtPnUubmFtZSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFjLT51Lm5hbWUpCisJCQkJCWdvdG8gb3V0OworCisJCQkJcmMgPSBuZXh0X2VudHJ5KGMtPnUubmFtZSwgZnAsIGxlbik7CisJCQkJaWYgKHJjKQorCQkJCQlnb3RvIG91dDsKKworCQkJCWMtPnUubmFtZVtsZW5dID0gMDsKKwkJCQlyYyA9IGNvbnRleHRfcmVhZF9hbmRfdmFsaWRhdGUoJmMtPmNvbnRleHRbMF0sIHAsIGZwKTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFsxXSwgcCwgZnApOworCQkJCWlmIChyYykKKwkJCQkJZ290byBvdXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE9DT05fUE9SVDoKKwkJCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikqMyk7CisJCQkJaWYgKHJjKQorCQkJCQlnb3RvIG91dDsKKwkJCQljLT51LnBvcnQucHJvdG9jb2wgPSBsZTMyX3RvX2NwdShidWZbMF0pOworCQkJCWMtPnUucG9ydC5sb3dfcG9ydCA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CisJCQkJYy0+dS5wb3J0LmhpZ2hfcG9ydCA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CisJCQkJcmMgPSBjb250ZXh0X3JlYWRfYW5kX3ZhbGlkYXRlKCZjLT5jb250ZXh0WzBdLCBwLCBmcCk7CisJCQkJaWYgKHJjKQorCQkJCQlnb3RvIG91dDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT0NPTl9OT0RFOgorCQkJCXJjID0gbmV4dF9lbnRyeShub2RlYnVmLCBmcCwgc2l6ZW9mKHUzMikgKiAyKTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCQkJCWMtPnUubm9kZS5hZGRyID0gbm9kZWJ1ZlswXTsgLyogbmV0d29yayBvcmRlciAqLworCQkJCWMtPnUubm9kZS5tYXNrID0gbm9kZWJ1ZlsxXTsgLyogbmV0d29yayBvcmRlciAqLworCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApOworCQkJCWlmIChyYykKKwkJCQkJZ290byBvdXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE9DT05fRlNVU0U6CisJCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjIpOworCQkJCWlmIChyYykKKwkJCQkJZ290byBvdXQ7CisKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJYy0+di5iZWhhdmlvciA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CisJCQkJaWYgKGMtPnYuYmVoYXZpb3IgPiBTRUNVUklUWV9GU19VU0VfTk9ORSkKKwkJCQkJZ290byBvdXQ7CisKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJbGVuID0gbGUzMl90b19jcHUoYnVmWzFdKTsKKwkJCQljLT51Lm5hbWUgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQkJCWlmICghYy0+dS5uYW1lKQorCQkJCQlnb3RvIG91dDsKKworCQkJCXJjID0gbmV4dF9lbnRyeShjLT51Lm5hbWUsIGZwLCBsZW4pOworCQkJCWlmIChyYykKKwkJCQkJZ290byBvdXQ7CisJCQkJYy0+dS5uYW1lW2xlbl0gPSAwOworCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApOworCQkJCWlmIChyYykKKwkJCQkJZ290byBvdXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE9DT05fTk9ERTY6IHsKKwkJCQlpbnQgazsKKworCQkJCXJjID0gbmV4dF9lbnRyeShub2RlYnVmLCBmcCwgc2l6ZW9mKHUzMikgKiA4KTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCQkJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJCQkJCWMtPnUubm9kZTYuYWRkcltrXSA9IG5vZGVidWZba107CisJCQkJZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwkJCQkJYy0+dS5ub2RlNi5tYXNrW2tdID0gbm9kZWJ1ZltrKzRdOworCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApOworCQkJCWlmIChyYykKKwkJCQkJZ290byBvdXQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl9CisJCX0KKwl9CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKwogLyoKICAqIFJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgcG9saWN5IGRhdGFiYXNlIGJpbmFyeQogICogcmVwcmVzZW50YXRpb24gZmlsZSBpbnRvIGEgcG9saWN5IGRhdGFiYXNlIHN0cnVjdHVyZS4KQEAgLTE3MDksMTYgKzIwNDYsMTIgQEAKIHsKIAlzdHJ1Y3Qgcm9sZV9hbGxvdyAqcmEsICpscmE7CiAJc3RydWN0IHJvbGVfdHJhbnMgKnRyLCAqbHRyOwotCXN0cnVjdCBvY29udGV4dCAqbCwgKmMsICpuZXdjOwotCXN0cnVjdCBnZW5mcyAqZ2VuZnNfcCwgKmdlbmZzLCAqbmV3Z2VuZnM7CiAJaW50IGksIGosIHJjOwogCV9fbGUzMiBidWZbNF07Ci0JdTMyIG5vZGVidWZbOF07Ci0JdTMyIGxlbiwgbGVuMiwgbnByaW0sIG5lbCwgbmVsMjsKKwl1MzIgbGVuLCBucHJpbSwgbmVsOworCiAJY2hhciAqcG9saWN5ZGJfc3RyOwogCXN0cnVjdCBwb2xpY3lkYl9jb21wYXRfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgcmFuZ2VfdHJhbnMgKnJ0OwotCXN0cnVjdCBtbHNfcmFuZ2UgKnI7CiAKIAlyYyA9IHBvbGljeWRiX2luaXQocCk7CiAJaWYgKHJjKQpAQCAtMTkxOSwyOTQgKzIyNTIsNDUgQEAKIAlpZiAoIXAtPnByb2Nlc3NfdHJhbnNfcGVybXMpCiAJCWdvdG8gYmFkOwogCi0JZm9yIChpID0gMDsgaSA8IGluZm8tPm9jb25fbnVtOyBpKyspIHsKLQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gYmFkOwotCQluZWwgPSBsZTMyX3RvX2NwdShidWZbMF0pOwotCQlsID0gTlVMTDsKLQkJZm9yIChqID0gMDsgaiA8IG5lbDsgaisrKSB7Ci0JCQljID0ga3phbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghYykgewotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlnb3RvIGJhZDsKLQkJCX0KLQkJCWlmIChsKQotCQkJCWwtPm5leHQgPSBjOwotCQkJZWxzZQotCQkJCXAtPm9jb250ZXh0c1tpXSA9IGM7Ci0JCQlsID0gYzsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXN3aXRjaCAoaSkgewotCQkJY2FzZSBPQ09OX0lTSUQ6Ci0JCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlnb3RvIGJhZDsKLQkJCQljLT5zaWRbMF0gPSBsZTMyX3RvX2NwdShidWZbMF0pOwotCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApOwotCQkJCWlmIChyYykKLQkJCQkJZ290byBiYWQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9DT05fRlM6Ci0JCQljYXNlIE9DT05fTkVUSUY6Ci0JCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlnb3RvIGJhZDsKLQkJCQlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwotCQkJCWMtPnUubmFtZSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKCFjLT51Lm5hbWUpIHsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlnb3RvIGJhZDsKLQkJCQl9Ci0JCQkJcmMgPSBuZXh0X2VudHJ5KGMtPnUubmFtZSwgZnAsIGxlbik7Ci0JCQkJaWYgKHJjIDwgMCkKLQkJCQkJZ290byBiYWQ7Ci0JCQkJYy0+dS5uYW1lW2xlbl0gPSAwOwotCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApOwotCQkJCWlmIChyYykKLQkJCQkJZ290byBiYWQ7Ci0JCQkJcmMgPSBjb250ZXh0X3JlYWRfYW5kX3ZhbGlkYXRlKCZjLT5jb250ZXh0WzFdLCBwLCBmcCk7Ci0JCQkJaWYgKHJjKQotCQkJCQlnb3RvIGJhZDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT0NPTl9QT1JUOgotCQkJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSozKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlnb3RvIGJhZDsKLQkJCQljLT51LnBvcnQucHJvdG9jb2wgPSBsZTMyX3RvX2NwdShidWZbMF0pOwotCQkJCWMtPnUucG9ydC5sb3dfcG9ydCA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7Ci0JCQkJYy0+dS5wb3J0LmhpZ2hfcG9ydCA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7Ci0JCQkJcmMgPSBjb250ZXh0X3JlYWRfYW5kX3ZhbGlkYXRlKCZjLT5jb250ZXh0WzBdLCBwLCBmcCk7Ci0JCQkJaWYgKHJjKQotCQkJCQlnb3RvIGJhZDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT0NPTl9OT0RFOgotCQkJCXJjID0gbmV4dF9lbnRyeShub2RlYnVmLCBmcCwgc2l6ZW9mKHUzMikgKiAyKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlnb3RvIGJhZDsKLQkJCQljLT51Lm5vZGUuYWRkciA9IG5vZGVidWZbMF07IC8qIG5ldHdvcmsgb3JkZXIgKi8KLQkJCQljLT51Lm5vZGUubWFzayA9IG5vZGVidWZbMV07IC8qIG5ldHdvcmsgb3JkZXIgKi8KLQkJCQlyYyA9IGNvbnRleHRfcmVhZF9hbmRfdmFsaWRhdGUoJmMtPmNvbnRleHRbMF0sIHAsIGZwKTsKLQkJCQlpZiAocmMpCi0JCQkJCWdvdG8gYmFkOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPQ09OX0ZTVVNFOgotCQkJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSoyKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlnb3RvIGJhZDsKLQkJCQljLT52LmJlaGF2aW9yID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQkJCQlpZiAoYy0+di5iZWhhdmlvciA+IFNFQ1VSSVRZX0ZTX1VTRV9OT05FKQotCQkJCQlnb3RvIGJhZDsKLQkJCQlsZW4gPSBsZTMyX3RvX2NwdShidWZbMV0pOwotCQkJCWMtPnUubmFtZSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKCFjLT51Lm5hbWUpIHsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlnb3RvIGJhZDsKLQkJCQl9Ci0JCQkJcmMgPSBuZXh0X2VudHJ5KGMtPnUubmFtZSwgZnAsIGxlbik7Ci0JCQkJaWYgKHJjIDwgMCkKLQkJCQkJZ290byBiYWQ7Ci0JCQkJYy0+dS5uYW1lW2xlbl0gPSAwOwotCQkJCXJjID0gY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApOwotCQkJCWlmIChyYykKLQkJCQkJZ290byBiYWQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9DT05fTk9ERTY6IHsKLQkJCQlpbnQgazsKLQotCQkJCXJjID0gbmV4dF9lbnRyeShub2RlYnVmLCBmcCwgc2l6ZW9mKHUzMikgKiA4KTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlnb3RvIGJhZDsKLQkJCQlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCQljLT51Lm5vZGU2LmFkZHJba10gPSBub2RlYnVmW2tdOwotCQkJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJCWMtPnUubm9kZTYubWFza1trXSA9IG5vZGVidWZbays0XTsKLQkJCQlpZiAoY29udGV4dF9yZWFkX2FuZF92YWxpZGF0ZSgmYy0+Y29udGV4dFswXSwgcCwgZnApKQotCQkJCQlnb3RvIGJhZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlyYyA9IG9jb250ZXh0X3JlYWQocCwgaW5mbywgZnApOworCWlmIChyYykKIAkJZ290byBiYWQ7Ci0JbmVsID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQlnZW5mc19wID0gTlVMTDsKLQlyYyA9IC1FSU5WQUw7Ci0JZm9yIChpID0gMDsgaSA8IG5lbDsgaSsrKSB7Ci0JCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGJhZDsKLQkJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQkJbmV3Z2VuZnMgPSBremFsbG9jKHNpemVvZigqbmV3Z2VuZnMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdnZW5mcykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBiYWQ7Ci0JCX0KIAotCQluZXdnZW5mcy0+ZnN0eXBlID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdnZW5mcy0+ZnN0eXBlKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlrZnJlZShuZXdnZW5mcyk7Ci0JCQlnb3RvIGJhZDsKLQkJfQotCQlyYyA9IG5leHRfZW50cnkobmV3Z2VuZnMtPmZzdHlwZSwgZnAsIGxlbik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWtmcmVlKG5ld2dlbmZzLT5mc3R5cGUpOwotCQkJa2ZyZWUobmV3Z2VuZnMpOwotCQkJZ290byBiYWQ7Ci0JCX0KLQkJbmV3Z2VuZnMtPmZzdHlwZVtsZW5dID0gMDsKLQkJZm9yIChnZW5mc19wID0gTlVMTCwgZ2VuZnMgPSBwLT5nZW5mczsgZ2VuZnM7Ci0JCSAgICAgZ2VuZnNfcCA9IGdlbmZzLCBnZW5mcyA9IGdlbmZzLT5uZXh0KSB7Ci0JCQlpZiAoc3RyY21wKG5ld2dlbmZzLT5mc3R5cGUsIGdlbmZzLT5mc3R5cGUpID09IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBkdXAgZ2VuZnMgIgotCQkJCSAgICAgICAiZnN0eXBlICVzXG4iLCBuZXdnZW5mcy0+ZnN0eXBlKTsKLQkJCQlrZnJlZShuZXdnZW5mcy0+ZnN0eXBlKTsKLQkJCQlrZnJlZShuZXdnZW5mcyk7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlpZiAoc3RyY21wKG5ld2dlbmZzLT5mc3R5cGUsIGdlbmZzLT5mc3R5cGUpIDwgMCkKLQkJCQlicmVhazsKLQkJfQotCQluZXdnZW5mcy0+bmV4dCA9IGdlbmZzOwotCQlpZiAoZ2VuZnNfcCkKLQkJCWdlbmZzX3AtPm5leHQgPSBuZXdnZW5mczsKLQkJZWxzZQotCQkJcC0+Z2VuZnMgPSBuZXdnZW5mczsKLQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gYmFkOwotCQluZWwyID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQkJZm9yIChqID0gMDsgaiA8IG5lbDI7IGorKykgewotCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJZ290byBiYWQ7Ci0JCQlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOworCXJjID0gZ2VuZnNfcmVhZChwLCBmcCk7CisJaWYgKHJjKQorCQlnb3RvIGJhZDsKIAotCQkJbmV3YyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdjKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIW5ld2MpIHsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZ290byBiYWQ7Ci0JCQl9CisJcmMgPSByYW5nZV9yZWFkKHAsIGZwKTsKKwlpZiAocmMpCisJCWdvdG8gYmFkOwogCi0JCQluZXdjLT51Lm5hbWUgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFuZXdjLT51Lm5hbWUpIHsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZ290byBiYWRfbmV3YzsKLQkJCX0KLQkJCXJjID0gbmV4dF9lbnRyeShuZXdjLT51Lm5hbWUsIGZwLCBsZW4pOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlnb3RvIGJhZF9uZXdjOwotCQkJbmV3Yy0+dS5uYW1lW2xlbl0gPSAwOwotCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJZ290byBiYWRfbmV3YzsKLQkJCW5ld2MtPnYuc2NsYXNzID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQkJCWlmIChjb250ZXh0X3JlYWRfYW5kX3ZhbGlkYXRlKCZuZXdjLT5jb250ZXh0WzBdLCBwLCBmcCkpCi0JCQkJZ290byBiYWRfbmV3YzsKLQkJCWZvciAobCA9IE5VTEwsIGMgPSBuZXdnZW5mcy0+aGVhZDsgYzsKLQkJCSAgICAgbCA9IGMsIGMgPSBjLT5uZXh0KSB7Ci0JCQkJaWYgKCFzdHJjbXAobmV3Yy0+dS5uYW1lLCBjLT51Lm5hbWUpICYmCi0JCQkJICAgICghYy0+di5zY2xhc3MgfHwgIW5ld2MtPnYuc2NsYXNzIHx8Ci0JCQkJICAgICBuZXdjLT52LnNjbGFzcyA9PSBjLT52LnNjbGFzcykpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgZHVwIGdlbmZzICIKLQkJCQkJICAgICAgICJlbnRyeSAoJXMsJXMpXG4iLAotCQkJCQkgICAgICAgbmV3Z2VuZnMtPmZzdHlwZSwgYy0+dS5uYW1lKTsKLQkJCQkJZ290byBiYWRfbmV3YzsKLQkJCQl9Ci0JCQkJbGVuID0gc3RybGVuKG5ld2MtPnUubmFtZSk7Ci0JCQkJbGVuMiA9IHN0cmxlbihjLT51Lm5hbWUpOwotCQkJCWlmIChsZW4gPiBsZW4yKQotCQkJCQlicmVhazsKLQkJCX0KKwlyYyA9IC1FTk9NRU07CisJcC0+dHlwZV9hdHRyX21hcF9hcnJheSA9IGZsZXhfYXJyYXlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBlYml0bWFwKSwKKwkJCQkJCSAgcC0+cF90eXBlcy5ucHJpbSwKKwkJCQkJCSAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICghcC0+dHlwZV9hdHRyX21hcF9hcnJheSkKKwkJZ290byBiYWQ7CiAKLQkJCW5ld2MtPm5leHQgPSBjOwotCQkJaWYgKGwpCi0JCQkJbC0+bmV4dCA9IG5ld2M7Ci0JCQllbHNlCi0JCQkJbmV3Z2VuZnMtPmhlYWQgPSBuZXdjOwotCQl9Ci0JfQotCi0JaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9NTFMpIHsKLQkJaW50IG5ld19yYW5nZXRyID0gcC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX1JBTkdFVFJBTlM7Ci0JCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGJhZDsKLQkJbmVsID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQkJZm9yIChpID0gMDsgaSA8IG5lbDsgaSsrKSB7Ci0JCQlydCA9IGt6YWxsb2Moc2l6ZW9mKCpydCksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFydCkgewotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlnb3RvIGJhZDsKLQkJCX0KLQkJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCAoc2l6ZW9mKHUzMikgKiAyKSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJa2ZyZWUocnQpOwotCQkJCWdvdG8gYmFkOwotCQkJfQotCQkJcnQtPnNvdXJjZV90eXBlID0gbGUzMl90b19jcHUoYnVmWzBdKTsKLQkJCXJ0LT50YXJnZXRfdHlwZSA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7Ci0JCQlpZiAobmV3X3JhbmdldHIpIHsKLQkJCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOwotCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJa2ZyZWUocnQpOwotCQkJCQlnb3RvIGJhZDsKLQkJCQl9Ci0JCQkJcnQtPnRhcmdldF9jbGFzcyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7Ci0JCQl9IGVsc2UKLQkJCQlydC0+dGFyZ2V0X2NsYXNzID0gcC0+cHJvY2Vzc19jbGFzczsKLQkJCWlmICghcG9saWN5ZGJfdHlwZV9pc3ZhbGlkKHAsIHJ0LT5zb3VyY2VfdHlwZSkgfHwKLQkJCSAgICAhcG9saWN5ZGJfdHlwZV9pc3ZhbGlkKHAsIHJ0LT50YXJnZXRfdHlwZSkgfHwKLQkJCSAgICAhcG9saWN5ZGJfY2xhc3NfaXN2YWxpZChwLCBydC0+dGFyZ2V0X2NsYXNzKSkgewotCQkJCWtmcmVlKHJ0KTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlyID0ga3phbGxvYyhzaXplb2YoKnIpLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghcikgewotCQkJCWtmcmVlKHJ0KTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlyYyA9IG1sc19yZWFkX3JhbmdlX2hlbHBlcihyLCBmcCk7Ci0JCQlpZiAocmMpIHsKLQkJCQlrZnJlZShydCk7Ci0JCQkJa2ZyZWUocik7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlpZiAoIW1sc19yYW5nZV9pc3ZhbGlkKHAsIHIpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0VMaW51eDogIHJhbmdldHJhbnM6ICBpbnZhbGlkIHJhbmdlXG4iKTsKLQkJCQlrZnJlZShydCk7Ci0JCQkJa2ZyZWUocik7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlyYyA9IGhhc2h0YWJfaW5zZXJ0KHAtPnJhbmdlX3RyLCBydCwgcik7Ci0JCQlpZiAocmMpIHsKLQkJCQlrZnJlZShydCk7Ci0JCQkJa2ZyZWUocik7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCX0KLQkJcmFuZ2V0cl9oYXNoX2V2YWwocC0+cmFuZ2VfdHIpOwotCX0KLQotCXAtPnR5cGVfYXR0cl9tYXAgPSBrbWFsbG9jKHAtPnBfdHlwZXMubnByaW0gKiBzaXplb2Yoc3RydWN0IGViaXRtYXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXAtPnR5cGVfYXR0cl9tYXApCisJLyogcHJlYWxsb2NhdGUgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgcHV0IGV2ZXIgZmFpbGluZyAqLworCXJjID0gZmxleF9hcnJheV9wcmVhbGxvYyhwLT50eXBlX2F0dHJfbWFwX2FycmF5LCAwLCBwLT5wX3R5cGVzLm5wcmltIC0gMSwKKwkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcC0+cF90eXBlcy5ucHJpbTsgaSsrKSB7Ci0JCWViaXRtYXBfaW5pdCgmcC0+dHlwZV9hdHRyX21hcFtpXSk7CisJCXN0cnVjdCBlYml0bWFwICplID0gZmxleF9hcnJheV9nZXQocC0+dHlwZV9hdHRyX21hcF9hcnJheSwgaSk7CisKKwkJQlVHX09OKCFlKTsKKwkJZWJpdG1hcF9pbml0KGUpOwogCQlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX0FWVEFCKSB7Ci0JCQlpZiAoZWJpdG1hcF9yZWFkKCZwLT50eXBlX2F0dHJfbWFwW2ldLCBmcCkpCisJCQlyYyA9IGViaXRtYXBfcmVhZChlLCBmcCk7CisJCQlpZiAocmMpCiAJCQkJZ290byBiYWQ7CiAJCX0KIAkJLyogYWRkIHRoZSB0eXBlIGl0c2VsZiBhcyB0aGUgZGVnZW5lcmF0ZSBjYXNlICovCi0JCWlmIChlYml0bWFwX3NldF9iaXQoJnAtPnR5cGVfYXR0cl9tYXBbaV0sIGksIDEpKQotCQkJCWdvdG8gYmFkOworCQlyYyA9IGViaXRtYXBfc2V0X2JpdChlLCBpLCAxKTsKKwkJaWYgKHJjKQorCQkJZ290byBiYWQ7CiAJfQogCiAJcmMgPSBwb2xpY3lkYl9ib3VuZHNfc2FuaXR5X2NoZWNrKHApOwpAQCAtMjIxNiw4ICsyMzAwLDYgQEAKIAlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwotYmFkX25ld2M6Ci0Jb2NvbnRleHRfZGVzdHJveShuZXdjLCBPQ09OX0ZTVVNFKTsKIGJhZDoKIAlpZiAoIXJjKQogCQlyYyA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmgKaW5kZXggMjZkOWFkZi4uMzEwZTk0NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaApAQCAtMjQsNiArMjQsOCBAQAogI2lmbmRlZiBfU1NfUE9MSUNZREJfSF8KICNkZWZpbmUgX1NTX1BPTElDWURCX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9mbGV4X2FycmF5Lmg+CisKICNpbmNsdWRlICJzeW10YWIuaCIKICNpbmNsdWRlICJhdnRhYi5oIgogI2luY2x1ZGUgInNpZHRhYi5oIgpAQCAtMjQ2LDcgKzI0OCw3IEBACiAJc3RydWN0IGhhc2h0YWIgKnJhbmdlX3RyOwogCiAJLyogdHlwZSAtPiBhdHRyaWJ1dGUgcmV2ZXJzZSBtYXBwaW5nICovCi0Jc3RydWN0IGViaXRtYXAgKnR5cGVfYXR0cl9tYXA7CisJc3RydWN0IGZsZXhfYXJyYXkgKnR5cGVfYXR0cl9tYXBfYXJyYXk7CiAKIAlzdHJ1Y3QgZWJpdG1hcCBwb2xpY3ljYXBzOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggMWRlNjBjZTkuLjllYTJmZWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZsZXhfYXJyYXkuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KIAogI2luY2x1ZGUgImZsYXNrLmgiCkBAIC02MjYsOCArNjI3LDEwIEBACiAJICovCiAJYXZrZXkudGFyZ2V0X2NsYXNzID0gdGNsYXNzOwogCWF2a2V5LnNwZWNpZmllZCA9IEFWVEFCX0FWOwotCXNhdHRyID0gJnBvbGljeWRiLnR5cGVfYXR0cl9tYXBbc2NvbnRleHQtPnR5cGUgLSAxXTsKLQl0YXR0ciA9ICZwb2xpY3lkYi50eXBlX2F0dHJfbWFwW3Rjb250ZXh0LT50eXBlIC0gMV07CisJc2F0dHIgPSBmbGV4X2FycmF5X2dldChwb2xpY3lkYi50eXBlX2F0dHJfbWFwX2FycmF5LCBzY29udGV4dC0+dHlwZSAtIDEpOworCUJVR19PTighc2F0dHIpOworCXRhdHRyID0gZmxleF9hcnJheV9nZXQocG9saWN5ZGIudHlwZV9hdHRyX21hcF9hcnJheSwgdGNvbnRleHQtPnR5cGUgLSAxKTsKKwlCVUdfT04oIXRhdHRyKTsKIAllYml0bWFwX2Zvcl9lYWNoX3Bvc2l0aXZlX2JpdChzYXR0ciwgc25vZGUsIGkpIHsKIAkJZWJpdG1hcF9mb3JfZWFjaF9wb3NpdGl2ZV9iaXQodGF0dHIsIHRub2RlLCBqKSB7CiAJCQlhdmtleS5zb3VyY2VfdHlwZSA9IGkgKyAxOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zeW10YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc3ltdGFiLmMKaW5kZXggYmNmOWY2Mi4uMTYwMzI2ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zeW10YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3N5bXRhYi5jCkBAIC0zNiw3ICszNiw3IEBACiB7CiAJcy0+dGFibGUgPSBoYXNodGFiX2NyZWF0ZShzeW1oYXNoLCBzeW1jbXAsIHNpemUpOwogCWlmICghcy0+dGFibGUpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJcy0+bnByaW0gPSAwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggYzZlOWFjYS4uNDNhZTc0NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC0xMjMsMTYgKzEyMyw2IEBACiAjZGVmaW5lIFNNS19GU0hBVAkic21hY2tmc2hhdD0iCiAjZGVmaW5lIFNNS19GU1JPT1QJInNtYWNrZnNyb290PSIKIAotLyoKLSAqIHhhdHRyIG5hbWVzCi0gKi8KLSNkZWZpbmUgWEFUVFJfU01BQ0tfU1VGRklYCSJTTUFDSzY0IgotI2RlZmluZSBYQVRUUl9TTUFDS19JUElOCSJTTUFDSzY0SVBJTiIKLSNkZWZpbmUgWEFUVFJfU01BQ0tfSVBPVVQJIlNNQUNLNjRJUE9VVCIKLSNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDSwlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfU1VGRklYCi0jZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUElOCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUElOCi0jZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUE9VVAlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfSVBPVVQKLQogI2RlZmluZSBTTUFDS19DSVBTT19PUFRJT04gCSItQ0lQU08iCiAKIC8qCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCmluZGV4IDBmMmZjNDguLmM0NDhkNTcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCkBAIC01OTgsNiArNTk4LDggQEAKIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisKKwltYXNrICY9IChNQVlfUkVBRHxNQVlfV1JJVEV8TUFZX0VYRUN8TUFZX0FQUEVORCk7CiAJLyoKIAkgKiBObyBwZXJtaXNzaW9uIHRvIGNoZWNrLiBFeGlzdGVuY2UgdGVzdC4gWXVwLCBpdCdzIHRoZXJlLgogCSAqLwpAQCAtMjE5MSw3ICsyMTkzLDcgQEAKIAogLyoqCiAgKiBzbWFja19kX2luc3RhbnRpYXRlIC0gTWFrZSBzdXJlIHRoZSBibG9iIGlzIGNvcnJlY3Qgb24gYW4gaW5vZGUKLSAqIEBvcHRfZGVudHJ5OiB1bnVzZWQKKyAqIEBvcHRfZGVudHJ5OiBkZW50cnkgd2hlcmUgaW5vZGUgd2lsbCBiZSBhdHRhY2hlZAogICogQGlub2RlOiB0aGUgb2JqZWN0CiAgKgogICogU2V0IHRoZSBpbm9kZSdzIHNlY3VyaXR5IGJsb2IgaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LgpAQCAtMjMxMCwyMCArMjMxMiwxMCBAQAogCQkvKgogCQkgKiBHZXQgdGhlIGRlbnRyeSBmb3IgeGF0dHIuCiAJCSAqLwotCQlpZiAob3B0X2RlbnRyeSA9PSBOVUxMKSB7Ci0JCQlkcCA9IGRfZmluZF9hbGlhcyhpbm9kZSk7Ci0JCQlpZiAoZHAgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWRwID0gZGdldChvcHRfZGVudHJ5KTsKLQkJCWlmIChkcCA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQl9Ci0KKwkJZHAgPSBkZ2V0KG9wdF9kZW50cnkpOwogCQlmZXRjaGVkID0gc21rX2ZldGNoKGlub2RlLCBkcCk7CiAJCWlmIChmZXRjaGVkICE9IE5VTEwpCiAJCQlmaW5hbCA9IGZldGNoZWQ7Ci0KIAkJZHB1dChkcCk7CiAJCWJyZWFrOwogCX0KQEAgLTMyMjcsNyArMzIxOSw3IEBACiAJY3JlZCA9IChzdHJ1Y3QgY3JlZCAqKSBjdXJyZW50LT5jcmVkOwogCWNyZWQtPnNlY3VyaXR5ID0gJnNtYWNrX2tub3duX2Zsb29yLnNta19rbm93bjsKIAotCS8qIGluaXRpbGl6ZSB0aGUgc21hY2tfa25vd19saXN0ICovCisJLyogaW5pdGlhbGl6ZSB0aGUgc21hY2tfa25vd19saXN0ICovCiAJaW5pdF9zbWFja19rbm93X2xpc3QoKTsKIAkvKgogCSAqIEluaXRpYWxpemUgbG9ja3MKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9NYWtlZmlsZSBiL3NlY3VyaXR5L3RvbW95by9NYWtlZmlsZQppbmRleCA0ZmIzOTAzLi45MTY0MGU5IDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vTWFrZWZpbGUKKysrIGIvc2VjdXJpdHkvdG9tb3lvL01ha2VmaWxlCkBAIC0xICsxIEBACi1vYmoteSA9IGNvbW1vbi5vIHJlYWxwYXRoLm8gdG9tb3lvLm8gZG9tYWluLm8gZmlsZS5vIGdjLm8gcGF0aF9ncm91cC5vCitvYmoteSA9IGNvbW1vbi5vIGRvbWFpbi5vIGZpbGUubyBnYy5vIGdyb3VwLm8gbG9hZF9wb2xpY3kubyBtZW1vcnkubyBtb3VudC5vIHJlYWxwYXRoLm8gc2VjdXJpdHlmc19pZi5vIHRvbW95by5vIHV0aWwubwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jIGIvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jCmluZGV4IGI1ZGJkYzkuLmVmNDM5OTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uYworKysgYi9zZWN1cml0eS90b21veW8vY29tbW9uLmMKQEAgLTMsOTkgKzMsMTg0IEBACiAgKgogICogQ29tbW9uIGZ1bmN0aW9ucyBmb3IgVE9NT1lPLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5ICBOVFQgREFUQSBDT1JQT1JBVElPTgotICoKLSAqIFZlcnNpb246IDIuMi4wICAgMjAwOS8wNC8wMQotICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwICBOVFQgREFUQSBDT1JQT1JBVElPTgogICovCiAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCi0vKiBMb2NrIGZvciBwcm90ZWN0aW5nIHBvbGljeS4gKi8KLURFRklORV9NVVRFWCh0b21veW9fcG9saWN5X2xvY2spOworc3RhdGljIHN0cnVjdCB0b21veW9fcHJvZmlsZSB0b21veW9fZGVmYXVsdF9wcm9maWxlID0geworCS5sZWFybmluZyA9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlLnByZWZlcmVuY2UsCisJLnBlcm1pc3NpdmUgPSAmdG9tb3lvX2RlZmF1bHRfcHJvZmlsZS5wcmVmZXJlbmNlLAorCS5lbmZvcmNpbmcgPSAmdG9tb3lvX2RlZmF1bHRfcHJvZmlsZS5wcmVmZXJlbmNlLAorCS5wcmVmZXJlbmNlLmVuZm9yY2luZ192ZXJib3NlID0gdHJ1ZSwKKwkucHJlZmVyZW5jZS5sZWFybmluZ19tYXhfZW50cnkgPSAyMDQ4LAorCS5wcmVmZXJlbmNlLmxlYXJuaW5nX3ZlcmJvc2UgPSBmYWxzZSwKKwkucHJlZmVyZW5jZS5wZXJtaXNzaXZlX3ZlcmJvc2UgPSB0cnVlCit9OwogCi0vKiBIYXMgbG9hZGluZyBwb2xpY3kgZG9uZT8gKi8KLWJvb2wgdG9tb3lvX3BvbGljeV9sb2FkZWQ7CisvKiBQcm9maWxlIHZlcnNpb24uIEN1cnJlbnRseSBvbmx5IDIwMDkwOTAzIGlzIGRlZmluZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHRvbW95b19wcm9maWxlX3ZlcnNpb247CisKKy8qIFByb2ZpbGUgdGFibGUuIE1lbW9yeSBpcyBhbGxvY2F0ZWQgYXMgbmVlZGVkLiAqLworc3RhdGljIHN0cnVjdCB0b21veW9fcHJvZmlsZSAqdG9tb3lvX3Byb2ZpbGVfcHRyW1RPTU9ZT19NQVhfUFJPRklMRVNdOwogCiAvKiBTdHJpbmcgdGFibGUgZm9yIGZ1bmN0aW9uYWxpdHkgdGhhdCB0YWtlcyA0IG1vZGVzLiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnRvbW95b19tb2RlXzRbNF0gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX21vZGVbNF0gPSB7CiAJImRpc2FibGVkIiwgImxlYXJuaW5nIiwgInBlcm1pc3NpdmUiLCAiZW5mb3JjaW5nIgogfTsKLS8qIFN0cmluZyB0YWJsZSBmb3IgZnVuY3Rpb25hbGl0eSB0aGF0IHRha2VzIDIgbW9kZXMuICovCi1zdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX21vZGVfMls0XSA9IHsKLQkiZGlzYWJsZWQiLCAiZW5hYmxlZCIsICJlbmFibGVkIiwgImVuYWJsZWQiCi19OwogCi0vKgotICogdG9tb3lvX2NvbnRyb2xfYXJyYXkgaXMgYSBzdGF0aWMgZGF0YSB3aGljaCBjb250YWlucwotICoKLSAqICAoMSkgZnVuY3Rpb25hbGl0eSBuYW1lIHVzZWQgYnkgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3Byb2ZpbGUgLgotICogICgyKSBpbml0aWFsIHZhbHVlcyBmb3IgInN0cnVjdCB0b21veW9fcHJvZmlsZSIuCi0gKiAgKDMpIG1heCB2YWx1ZXMgZm9yICJzdHJ1Y3QgdG9tb3lvX3Byb2ZpbGUiLgotICovCi1zdGF0aWMgc3RydWN0IHsKLQljb25zdCBjaGFyICprZXl3b3JkOwotCXVuc2lnbmVkIGludCBjdXJyZW50X3ZhbHVlOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfdmFsdWU7Ci19IHRvbW95b19jb250cm9sX2FycmF5W1RPTU9ZT19NQVhfQ09OVFJPTF9JTkRFWF0gPSB7Ci0JW1RPTU9ZT19NQUNfRk9SX0ZJTEVdICAgICA9IHsgIk1BQ19GT1JfRklMRSIsICAgICAgICAwLCAgICAgICAzIH0sCi0JW1RPTU9ZT19NQVhfQUNDRVBUX0VOVFJZXSA9IHsgIk1BWF9BQ0NFUFRfRU5UUlkiLCAyMDQ4LCBJTlRfTUFYIH0sCi0JW1RPTU9ZT19WRVJCT1NFXSAgICAgICAgICA9IHsgIlRPTU9ZT19WRVJCT1NFIiwgICAgICAxLCAgICAgICAxIH0sCisvKiBTdHJpbmcgdGFibGUgZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9wcm9maWxlICovCitzdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX21hY19rZXl3b3Jkc1tUT01PWU9fTUFYX01BQ19JTkRFWAorCQkJCSAgICAgICArIFRPTU9ZT19NQVhfTUFDX0NBVEVHT1JZX0lOREVYXSA9IHsKKwlbVE9NT1lPX01BQ19GSUxFX0VYRUNVVEVdICAgID0gImZpbGU6OmV4ZWN1dGUiLAorCVtUT01PWU9fTUFDX0ZJTEVfT1BFTl0gICAgICAgPSAiZmlsZTo6b3BlbiIsCisJW1RPTU9ZT19NQUNfRklMRV9DUkVBVEVdICAgICA9ICJmaWxlOjpjcmVhdGUiLAorCVtUT01PWU9fTUFDX0ZJTEVfVU5MSU5LXSAgICAgPSAiZmlsZTo6dW5saW5rIiwKKwlbVE9NT1lPX01BQ19GSUxFX01LRElSXSAgICAgID0gImZpbGU6Om1rZGlyIiwKKwlbVE9NT1lPX01BQ19GSUxFX1JNRElSXSAgICAgID0gImZpbGU6OnJtZGlyIiwKKwlbVE9NT1lPX01BQ19GSUxFX01LRklGT10gICAgID0gImZpbGU6Om1rZmlmbyIsCisJW1RPTU9ZT19NQUNfRklMRV9NS1NPQ0tdICAgICA9ICJmaWxlOjpta3NvY2siLAorCVtUT01PWU9fTUFDX0ZJTEVfVFJVTkNBVEVdICAgPSAiZmlsZTo6dHJ1bmNhdGUiLAorCVtUT01PWU9fTUFDX0ZJTEVfU1lNTElOS10gICAgPSAiZmlsZTo6c3ltbGluayIsCisJW1RPTU9ZT19NQUNfRklMRV9SRVdSSVRFXSAgICA9ICJmaWxlOjpyZXdyaXRlIiwKKwlbVE9NT1lPX01BQ19GSUxFX01LQkxPQ0tdICAgID0gImZpbGU6Om1rYmxvY2siLAorCVtUT01PWU9fTUFDX0ZJTEVfTUtDSEFSXSAgICAgPSAiZmlsZTo6bWtjaGFyIiwKKwlbVE9NT1lPX01BQ19GSUxFX0xJTktdICAgICAgID0gImZpbGU6OmxpbmsiLAorCVtUT01PWU9fTUFDX0ZJTEVfUkVOQU1FXSAgICAgPSAiZmlsZTo6cmVuYW1lIiwKKwlbVE9NT1lPX01BQ19GSUxFX0NITU9EXSAgICAgID0gImZpbGU6OmNobW9kIiwKKwlbVE9NT1lPX01BQ19GSUxFX0NIT1dOXSAgICAgID0gImZpbGU6OmNob3duIiwKKwlbVE9NT1lPX01BQ19GSUxFX0NIR1JQXSAgICAgID0gImZpbGU6OmNoZ3JwIiwKKwlbVE9NT1lPX01BQ19GSUxFX0lPQ1RMXSAgICAgID0gImZpbGU6OmlvY3RsIiwKKwlbVE9NT1lPX01BQ19GSUxFX0NIUk9PVF0gICAgID0gImZpbGU6OmNocm9vdCIsCisJW1RPTU9ZT19NQUNfRklMRV9NT1VOVF0gICAgICA9ICJmaWxlOjptb3VudCIsCisJW1RPTU9ZT19NQUNfRklMRV9VTU9VTlRdICAgICA9ICJmaWxlOjp1bW91bnQiLAorCVtUT01PWU9fTUFDX0ZJTEVfUElWT1RfUk9PVF0gPSAiZmlsZTo6cGl2b3Rfcm9vdCIsCisJW1RPTU9ZT19NQVhfTUFDX0lOREVYICsgVE9NT1lPX01BQ19DQVRFR09SWV9GSUxFXSA9ICJmaWxlIiwKIH07CiAKLS8qCi0gKiB0b21veW9fcHJvZmlsZSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIHRoZSBtb2RlIG9mIGFjY2VzcwotICogY29udHJvbHMuIFRPTU9ZTyBoYXMgNCBtb2RlczogZGlzYWJsZWQsIGxlYXJuaW5nLCBwZXJtaXNzaXZlLCBlbmZvcmNpbmcuCi0gKiBBbiBhZG1pbmlzdHJhdG9yIGNhbiBkZWZpbmUgdXAgdG8gMjU2IHByb2ZpbGVzLgotICogVGhlIC0+cHJvZmlsZSBvZiAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIgaXMgdXNlZCBmb3IgcmVtZW1iZXJpbmcKLSAqIHRoZSBwcm9maWxlJ3MgbnVtYmVyICgwIC0gMjU1KSBhc3NpZ25lZCB0byB0aGF0IGRvbWFpbi4KLSAqLwotc3RhdGljIHN0cnVjdCB0b21veW9fcHJvZmlsZSB7Ci0JdW5zaWduZWQgaW50IHZhbHVlW1RPTU9ZT19NQVhfQ09OVFJPTF9JTkRFWF07Ci0JY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmNvbW1lbnQ7Ci19ICp0b21veW9fcHJvZmlsZV9wdHJbVE9NT1lPX01BWF9QUk9GSUxFU107Ci0KIC8qIFBlcm1pdCBwb2xpY3kgbWFuYWdlbWVudCBieSBub24tcm9vdCB1c2VyPyAqLwogc3RhdGljIGJvb2wgdG9tb3lvX21hbmFnZV9ieV9ub25fcm9vdDsKIAogLyogVXRpbGl0eSBmdW5jdGlvbnMuICovCiAKLS8qIE9wZW4gb3BlcmF0aW9uIGZvciAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX29wZW5fY29udHJvbChjb25zdCB1OCB0eXBlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci0vKiBDbG9zZSAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX2Nsb3NlX2NvbnRyb2woc3RydWN0IGZpbGUgKmZpbGUpOwotLyogUmVhZCBvcGVyYXRpb24gZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLiAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF9jb250cm9sKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJICAgICAgIGNvbnN0IGludCBidWZmZXJfbGVuKTsKLS8qIFdyaXRlIG9wZXJhdGlvbiBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovCi1zdGF0aWMgaW50IHRvbW95b193cml0ZV9jb250cm9sKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCWNvbnN0IGludCBidWZmZXJfbGVuKTsKKy8qKgorICogdG9tb3lvX3llc25vIC0gUmV0dXJuICJ5ZXMiIG9yICJubyIuCisgKgorICogQHZhbHVlOiBCb29sIHZhbHVlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX3llc25vKGNvbnN0IHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gdmFsdWUgPyAieWVzIiA6ICJubyI7Cit9CisKK3N0YXRpYyB2b2lkIHRvbW95b19hZGRwcmludGYoY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY29uc3QgaW50IHBvcyA9IHN0cmxlbihidWZmZXIpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1ZmZlciArIHBvcywgbGVuIC0gcG9zIC0gMSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CiAKIC8qKgotICogdG9tb3lvX3BhcnNlX25hbWVfdW5pb24gLSBQYXJzZSBhIHRvbW95b19uYW1lX3VuaW9uLgorICogdG9tb3lvX2ZsdXNoIC0gRmx1c2ggcXVldWVkIHN0cmluZyB0byB1c2Vyc3BhY2UncyBidWZmZXIuCiAgKgotICogQGZpbGVuYW1lOiBOYW1lIG9yIG5hbWUgZ3JvdXAuCi0gKiBAcHRyOiAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fbmFtZV91bmlvbiIuCisgKiBAaGVhZDogICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCiAgKgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGF0YSB3YXMgZmx1c2hlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICovCi1ib29sIHRvbW95b19wYXJzZV9uYW1lX3VuaW9uKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICAgICBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gKnB0cikKK3N0YXRpYyBib29sIHRvbW95b19mbHVzaChzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKIHsKLQlpZiAoIXRvbW95b19pc19jb3JyZWN0X3BhdGgoZmlsZW5hbWUsIDAsIDAsIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGZpbGVuYW1lWzBdID09ICdAJykgewotCQlwdHItPmdyb3VwID0gdG9tb3lvX2dldF9wYXRoX2dyb3VwKGZpbGVuYW1lICsgMSk7Ci0JCXB0ci0+aXNfZ3JvdXAgPSB0cnVlOwotCQlyZXR1cm4gcHRyLT5ncm91cCAhPSBOVUxMOworCXdoaWxlIChoZWFkLT5yLndfcG9zKSB7CisJCWNvbnN0IGNoYXIgKncgPSBoZWFkLT5yLndbMF07CisJCWludCBsZW4gPSBzdHJsZW4odyk7CisJCWlmIChsZW4pIHsKKwkJCWlmIChsZW4gPiBoZWFkLT5yZWFkX3VzZXJfYnVmX2F2YWlsKQorCQkJCWxlbiA9IGhlYWQtPnJlYWRfdXNlcl9idWZfYXZhaWw7CisJCQlpZiAoIWxlbikKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAoY29weV90b191c2VyKGhlYWQtPnJlYWRfdXNlcl9idWYsIHcsIGxlbikpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaGVhZC0+cmVhZF91c2VyX2J1Zl9hdmFpbCAtPSBsZW47CisJCQloZWFkLT5yZWFkX3VzZXJfYnVmICs9IGxlbjsKKwkJCXcgKz0gbGVuOworCQl9CisJCWlmICgqdykgeworCQkJaGVhZC0+ci53WzBdID0gdzsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvKiBBZGQgJ1wwJyBmb3IgcXVlcnkuICovCisJCWlmIChoZWFkLT5wb2xsKSB7CisJCQlpZiAoIWhlYWQtPnJlYWRfdXNlcl9idWZfYXZhaWwgfHwKKwkJCSAgICBjb3B5X3RvX3VzZXIoaGVhZC0+cmVhZF91c2VyX2J1ZiwgIiIsIDEpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWhlYWQtPnJlYWRfdXNlcl9idWZfYXZhaWwtLTsKKwkJCWhlYWQtPnJlYWRfdXNlcl9idWYrKzsKKwkJfQorCQloZWFkLT5yLndfcG9zLS07CisJCWZvciAobGVuID0gMDsgbGVuIDwgaGVhZC0+ci53X3BvczsgbGVuKyspCisJCQloZWFkLT5yLndbbGVuXSA9IGhlYWQtPnIud1tsZW4gKyAxXTsKIAl9Ci0JcHRyLT5maWxlbmFtZSA9IHRvbW95b19nZXRfbmFtZShmaWxlbmFtZSk7Ci0JcHRyLT5pc19ncm91cCA9IGZhbHNlOwotCXJldHVybiBwdHItPmZpbGVuYW1lICE9IE5VTEw7CisJaGVhZC0+ci5hdmFpbCA9IDA7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogdG9tb3lvX3NldF9zdHJpbmcgLSBRdWV1ZSBzdHJpbmcgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIiBzdHJ1Y3R1cmUuCisgKgorICogQGhlYWQ6ICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgorICogQHN0cmluZzogU3RyaW5nIHRvIHByaW50LgorICoKKyAqIE5vdGUgdGhhdCBAc3RyaW5nIGhhcyB0byBiZSBrZXB0IHZhbGlkIHVudGlsIEBoZWFkIGlzIGtmcmVlKClkLgorICogVGhpcyBtZWFucyB0aGF0IGNoYXJbXSBhbGxvY2F0ZWQgb24gc3RhY2sgbWVtb3J5IGNhbm5vdCBiZSBwYXNzZWQgdG8KKyAqIHRoaXMgZnVuY3Rpb24uIFVzZSB0b21veW9faW9fcHJpbnRmKCkgZm9yIGNoYXJbXSBhbGxvY2F0ZWQgb24gc3RhY2sgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB0b21veW9fc2V0X3N0cmluZyhzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCwgY29uc3QgY2hhciAqc3RyaW5nKQoreworCWlmIChoZWFkLT5yLndfcG9zIDwgVE9NT1lPX01BWF9JT19SRUFEX1FVRVVFKSB7CisJCWhlYWQtPnIud1toZWFkLT5yLndfcG9zKytdID0gc3RyaW5nOworCQl0b21veW9fZmx1c2goaGVhZCk7CisJfSBlbHNlCisJCVdBUk5fT04oMSk7Cit9CisKKy8qKgorICogdG9tb3lvX2lvX3ByaW50ZiAtIHByaW50ZigpIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIgc3RydWN0dXJlLgorICoKKyAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKiBAZm10OiAgVGhlIHByaW50ZigpJ3MgZm9ybWF0IHN0cmluZywgZm9sbG93ZWQgYnkgcGFyYW1ldGVycy4KKyAqLwordm9pZCB0b21veW9faW9fcHJpbnRmKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGxlbjsKKwlpbnQgcG9zID0gaGVhZC0+ci5hdmFpbDsKKwlpbnQgc2l6ZSA9IGhlYWQtPnJlYWRidWZfc2l6ZSAtIHBvczsKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm47CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c25wcmludGYoaGVhZC0+cmVhZF9idWYgKyBwb3MsIHNpemUsIGZtdCwgYXJncykgKyAxOworCXZhX2VuZChhcmdzKTsKKwlpZiAocG9zICsgbGVuID49IGhlYWQtPnJlYWRidWZfc2l6ZSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCWhlYWQtPnIuYXZhaWwgKz0gbGVuOworCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsIGhlYWQtPnJlYWRfYnVmICsgcG9zKTsKK30KKworc3RhdGljIHZvaWQgdG9tb3lvX3NldF9zcGFjZShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3sKKwl0b21veW9fc2V0X3N0cmluZyhoZWFkLCAiICIpOworfQorCitzdGF0aWMgYm9vbCB0b21veW9fc2V0X2xmKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQoreworCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsICJcbiIpOworCXJldHVybiAhaGVhZC0+ci53X3BvczsKIH0KIAogLyoqCkBAIC0xMDMsODc0ICsxODgsMjM5IEBACiAgKgogICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KICAqIEBwdHI6ICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24iLgotICoKLSAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBib29sIHRvbW95b19wcmludF9uYW1lX3VuaW9uKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAotCQkJCSBjb25zdCBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gKnB0cikKK3N0YXRpYyB2b2lkIHRvbW95b19wcmludF9uYW1lX3VuaW9uKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gKnB0cikKIHsKLQlpbnQgcG9zID0gaGVhZC0+cmVhZF9hdmFpbDsKLQlpZiAocG9zICYmIGhlYWQtPnJlYWRfYnVmW3BvcyAtIDFdID09ICcgJykKLQkJaGVhZC0+cmVhZF9hdmFpbC0tOwotCWlmIChwdHItPmlzX2dyb3VwKQotCQlyZXR1cm4gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiIEAlcyIsCi0JCQkJCXB0ci0+Z3JvdXAtPmdyb3VwX25hbWUtPm5hbWUpOwotCXJldHVybiB0b21veW9faW9fcHJpbnRmKGhlYWQsICIgJXMiLCBwdHItPmZpbGVuYW1lLT5uYW1lKTsKLX0KLQotLyoqCi0gKiB0b21veW9faXNfYnl0ZV9yYW5nZSAtIENoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyBpc2EgXG9vbyBzdHlsZSBvY3RhbCB2YWx1ZS4KLSAqCi0gKiBAc3RyOiBQb2ludGVyIHRvIHRoZSBzdHJpbmcuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIEBzdHIgaXMgYSBcb29vIHN0eWxlIG9jdGFsIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICogVE9NT1lPIHVzZXMgXG9vbyBzdHlsZSByZXByZXNlbnRhdGlvbiBmb3IgMHgwMSAtIDB4MjAgYW5kIDB4N0YgLSAweEZGLgotICogVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IFxvb28gaXMgaW4gdmFsaWQgcmFuZ2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfYnl0ZV9yYW5nZShjb25zdCBjaGFyICpzdHIpCi17Ci0JcmV0dXJuICpzdHIgPj0gJzAnICYmICpzdHIrKyA8PSAnMycgJiYKLQkJKnN0ciA+PSAnMCcgJiYgKnN0cisrIDw9ICc3JyAmJgotCQkqc3RyID49ICcwJyAmJiAqc3RyIDw9ICc3JzsKLX0KLQotLyoqCi0gKiB0b21veW9faXNfYWxwaGFiZXRfY2hhciAtIENoZWNrIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhbiBhbHBoYWJldC4KLSAqCi0gKiBAYzogVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgQGMgaXMgYW4gYWxwaGFiZXQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfYWxwaGFiZXRfY2hhcihjb25zdCBjaGFyIGMpCi17Ci0JcmV0dXJuIChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKTsKLX0KLQotLyoqCi0gKiB0b21veW9fbWFrZV9ieXRlIC0gTWFrZSBieXRlIHZhbHVlIGZyb20gdGhyZWUgb2N0YWwgY2hhcmFjdGVycy4KLSAqCi0gKiBAYzE6IFRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gKiBAYzI6IFRoZSBzZWNvbmQgY2hhcmFjdGVyLgotICogQGMzOiBUaGUgdGhpcmQgY2hhcmFjdGVyLgotICoKLSAqIFJldHVybnMgYnl0ZSB2YWx1ZS4KLSAqLwotc3RhdGljIGlubGluZSB1OCB0b21veW9fbWFrZV9ieXRlKGNvbnN0IHU4IGMxLCBjb25zdCB1OCBjMiwgY29uc3QgdTggYzMpCi17Ci0JcmV0dXJuICgoYzEgLSAnMCcpIDw8IDYpICsgKChjMiAtICcwJykgPDwgMykgKyAoYzMgLSAnMCcpOwotfQotCi0vKioKLSAqIHRvbW95b19zdHJfc3RhcnRzIC0gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBrZXl3b3JkLgotICoKLSAqIEBzcmM6ICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHN0cmluZy4KLSAqIEBmaW5kOiBQb2ludGVyIHRvIHRoZSBrZXl3b3JkLgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiBAc3JjIHN0YXJ0cyB3aXRoIEBmaW5kLCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICogVGhlIEBzcmMgaXMgdXBkYXRlZCB0byBwb2ludCB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBAZmluZAotICogaWYgQHNyYyBzdGFydHMgd2l0aCBAZmluZC4KLSAqLwotc3RhdGljIGJvb2wgdG9tb3lvX3N0cl9zdGFydHMoY2hhciAqKnNyYywgY29uc3QgY2hhciAqZmluZCkKLXsKLQljb25zdCBpbnQgbGVuID0gc3RybGVuKGZpbmQpOwotCWNoYXIgKnRtcCA9ICpzcmM7Ci0KLQlpZiAoc3RybmNtcCh0bXAsIGZpbmQsIGxlbikpCi0JCXJldHVybiBmYWxzZTsKLQl0bXAgKz0gbGVuOwotCSpzcmMgPSB0bXA7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogdG9tb3lvX25vcm1hbGl6ZV9saW5lIC0gRm9ybWF0IHN0cmluZy4KLSAqCi0gKiBAYnVmZmVyOiBUaGUgbGluZSB0byBub3JtYWxpemUuCi0gKgotICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYXJlIHJlbW92ZWQuCi0gKiBNdWx0aXBsZSB3aGl0ZXNwYWNlcyBhcmUgcGFja2VkIGludG8gc2luZ2xlIHNwYWNlLgotICoKLSAqIFJldHVybnMgbm90aGluZy4KLSAqLwotc3RhdGljIHZvaWQgdG9tb3lvX25vcm1hbGl6ZV9saW5lKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKLXsKLQl1bnNpZ25lZCBjaGFyICpzcCA9IGJ1ZmZlcjsKLQl1bnNpZ25lZCBjaGFyICpkcCA9IGJ1ZmZlcjsKLQlib29sIGZpcnN0ID0gdHJ1ZTsKLQotCXdoaWxlICh0b21veW9faXNfaW52YWxpZCgqc3ApKQotCQlzcCsrOwotCXdoaWxlICgqc3ApIHsKLQkJaWYgKCFmaXJzdCkKLQkJCSpkcCsrID0gJyAnOwotCQlmaXJzdCA9IGZhbHNlOwotCQl3aGlsZSAodG9tb3lvX2lzX3ZhbGlkKCpzcCkpCi0JCQkqZHArKyA9ICpzcCsrOwotCQl3aGlsZSAodG9tb3lvX2lzX2ludmFsaWQoKnNwKSkKLQkJCXNwKys7CisJdG9tb3lvX3NldF9zcGFjZShoZWFkKTsKKwlpZiAocHRyLT5pc19ncm91cCkgeworCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCAiQCIpOworCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCBwdHItPmdyb3VwLT5ncm91cF9uYW1lLT5uYW1lKTsKKwl9IGVsc2UgeworCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCBwdHItPmZpbGVuYW1lLT5uYW1lKTsKIAl9Ci0JKmRwID0gJ1wwJzsKIH0KIAogLyoqCi0gKiB0b21veW9fdG9rZW5pemUgLSBUb2tlbml6ZSBzdHJpbmcuCisgKiB0b21veW9fcHJpbnRfbnVtYmVyX3VuaW9uIC0gUHJpbnQgYSB0b21veW9fbnVtYmVyX3VuaW9uLgogICoKLSAqIEBidWZmZXI6IFRoZSBsaW5lIHRvIHRva2VuaXplLgotICogQHc6ICAgICAgUG9pbnRlciB0byAiY2hhciAqIi4KLSAqIEBzaXplOiAgIFNpemVvZiBAdyAuCi0gKgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAqIEBoZWFkOiAgICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKiBAcHRyOiAgICAgICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19udW1iZXJfdW5pb24iLgogICovCi1ib29sIHRvbW95b190b2tlbml6ZShjaGFyICpidWZmZXIsIGNoYXIgKndbXSwgc2l6ZV90IHNpemUpCitzdGF0aWMgdm9pZCB0b21veW9fcHJpbnRfbnVtYmVyX3VuaW9uKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uICpwdHIpCiB7Ci0JaW50IGNvdW50ID0gc2l6ZSAvIHNpemVvZihjaGFyICopOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQl3W2ldID0gIiI7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJY2hhciAqY3AgPSBzdHJjaHIoYnVmZmVyLCAnICcpOwotCQlpZiAoY3ApCi0JCQkqY3AgPSAnXDAnOwotCQl3W2ldID0gYnVmZmVyOwotCQlpZiAoIWNwKQotCQkJYnJlYWs7Ci0JCWJ1ZmZlciA9IGNwICsgMTsKLQl9Ci0JcmV0dXJuIGkgPCBjb3VudCB8fCAhKmJ1ZmZlcjsKLX0KLQotLyoqCi0gKiB0b21veW9faXNfY29ycmVjdF9wYXRoIC0gVmFsaWRhdGUgYSBwYXRobmFtZS4KLSAqIEBmaWxlbmFtZTogICAgIFRoZSBwYXRobmFtZSB0byBjaGVjay4KLSAqIEBzdGFydF90eXBlOiAgIFNob3VsZCB0aGUgcGF0aG5hbWUgc3RhcnQgd2l0aCAnLyc/Ci0gKiAgICAgICAgICAgICAgICAxID0gbXVzdCAvIC0xID0gbXVzdCBub3QgLyAwID0gZG9uJ3QgY2FyZQotICogQHBhdHRlcm5fdHlwZTogQ2FuIHRoZSBwYXRobmFtZSBjb250YWluIGEgd2lsZGNhcmQ/Ci0gKiAgICAgICAgICAgICAgICAxID0gbXVzdCAvIC0xID0gbXVzdCBub3QgLyAwID0gZG9uJ3QgY2FyZQotICogQGVuZF90eXBlOiAgICAgU2hvdWxkIHRoZSBwYXRobmFtZSBlbmQgd2l0aCAnLyc/Ci0gKiAgICAgICAgICAgICAgICAxID0gbXVzdCAvIC0xID0gbXVzdCBub3QgLyAwID0gZG9uJ3QgY2FyZQotICoKLSAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGVuYW1lIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcy4KLSAqIFJldHVybnMgdHJ1ZSBpZiBAZmlsZW5hbWUgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLWJvb2wgdG9tb3lvX2lzX2NvcnJlY3RfcGF0aChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3Qgczggc3RhcnRfdHlwZSwKLQkJCSAgICBjb25zdCBzOCBwYXR0ZXJuX3R5cGUsIGNvbnN0IHM4IGVuZF90eXBlKQotewotCWNvbnN0IGNoYXIgKmNvbnN0IHN0YXJ0ID0gZmlsZW5hbWU7Ci0JYm9vbCBpbl9yZXBldGl0aW9uID0gZmFsc2U7Ci0JYm9vbCBjb250YWluc19wYXR0ZXJuID0gZmFsc2U7Ci0JdW5zaWduZWQgY2hhciBjOwotCXVuc2lnbmVkIGNoYXIgZDsKLQl1bnNpZ25lZCBjaGFyIGU7Ci0KLQlpZiAoIWZpbGVuYW1lKQotCQlnb3RvIG91dDsKLQljID0gKmZpbGVuYW1lOwotCWlmIChzdGFydF90eXBlID09IDEpIHsgLyogTXVzdCBzdGFydCB3aXRoICcvJyAqLwotCQlpZiAoYyAhPSAnLycpCi0JCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKHN0YXJ0X3R5cGUgPT0gLTEpIHsgLyogTXVzdCBub3Qgc3RhcnQgd2l0aCAnLycgKi8KLQkJaWYgKGMgPT0gJy8nKQotCQkJZ290byBvdXQ7Ci0JfQotCWlmIChjKQotCQljID0gKihmaWxlbmFtZSArIHN0cmxlbihmaWxlbmFtZSkgLSAxKTsKLQlpZiAoZW5kX3R5cGUgPT0gMSkgeyAvKiBNdXN0IGVuZCB3aXRoICcvJyAqLwotCQlpZiAoYyAhPSAnLycpCi0JCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKGVuZF90eXBlID09IC0xKSB7IC8qIE11c3Qgbm90IGVuZCB3aXRoICcvJyAqLwotCQlpZiAoYyA9PSAnLycpCi0JCQlnb3RvIG91dDsKLQl9Ci0Jd2hpbGUgKDEpIHsKLQkJYyA9ICpmaWxlbmFtZSsrOwotCQlpZiAoIWMpCi0JCQlicmVhazsKLQkJaWYgKGMgPT0gJ1xcJykgewotCQkJYyA9ICpmaWxlbmFtZSsrOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICdcXCc6ICAvKiAiXFwiICovCi0JCQkJY29udGludWU7Ci0JCQljYXNlICckJzogICAvKiAiXCQiICovCi0JCQljYXNlICcrJzogICAvKiAiXCsiICovCi0JCQljYXNlICc/JzogICAvKiAiXD8iICovCi0JCQljYXNlICcqJzogICAvKiAiXCoiICovCi0JCQljYXNlICdAJzogICAvKiAiXEAiICovCi0JCQljYXNlICd4JzogICAvKiAiXHgiICovCi0JCQljYXNlICdYJzogICAvKiAiXFgiICovCi0JCQljYXNlICdhJzogICAvKiAiXGEiICovCi0JCQljYXNlICdBJzogICAvKiAiXEEiICovCi0JCQljYXNlICctJzogICAvKiAiXC0iICovCi0JCQkJaWYgKHBhdHRlcm5fdHlwZSA9PSAtMSkKLQkJCQkJYnJlYWs7IC8qIE11c3Qgbm90IGNvbnRhaW4gcGF0dGVybiAqLwotCQkJCWNvbnRhaW5zX3BhdHRlcm4gPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSAneyc6ICAgLyogIi9ceyIgKi8KLQkJCQlpZiAoZmlsZW5hbWUgLSAzIDwgc3RhcnQgfHwKLQkJCQkgICAgKihmaWxlbmFtZSAtIDMpICE9ICcvJykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHBhdHRlcm5fdHlwZSA9PSAtMSkKLQkJCQkJYnJlYWs7IC8qIE11c3Qgbm90IGNvbnRhaW4gcGF0dGVybiAqLwotCQkJCWNvbnRhaW5zX3BhdHRlcm4gPSB0cnVlOwotCQkJCWluX3JlcGV0aXRpb24gPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSAnfSc6ICAgLyogIlx9LyIgKi8KLQkJCQlpZiAoKmZpbGVuYW1lICE9ICcvJykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKCFpbl9yZXBldGl0aW9uKQotCQkJCQlicmVhazsKLQkJCQlpbl9yZXBldGl0aW9uID0gZmFsc2U7Ci0JCQkJY29udGludWU7Ci0JCQljYXNlICcwJzogICAvKiAiXG9vbyIgKi8KLQkJCWNhc2UgJzEnOgotCQkJY2FzZSAnMic6Ci0JCQljYXNlICczJzoKLQkJCQlkID0gKmZpbGVuYW1lKys7Ci0JCQkJaWYgKGQgPCAnMCcgfHwgZCA+ICc3JykKLQkJCQkJYnJlYWs7Ci0JCQkJZSA9ICpmaWxlbmFtZSsrOwotCQkJCWlmIChlIDwgJzAnIHx8IGUgPiAnNycpCi0JCQkJCWJyZWFrOwotCQkJCWMgPSB0b21veW9fbWFrZV9ieXRlKGMsIGQsIGUpOwotCQkJCWlmICh0b21veW9faXNfaW52YWxpZChjKSkKLQkJCQkJY29udGludWU7IC8qIHBhdHRlcm4gaXMgbm90IFwwMDAgKi8KLQkJCX0KLQkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYgKGluX3JlcGV0aXRpb24gJiYgYyA9PSAnLycpIHsKLQkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYgKHRvbW95b19pc19pbnZhbGlkKGMpKSB7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlpZiAocGF0dGVybl90eXBlID09IDEpIHsgLyogTXVzdCBjb250YWluIHBhdHRlcm4gKi8KLQkJaWYgKCFjb250YWluc19wYXR0ZXJuKQotCQkJZ290byBvdXQ7Ci0JfQotCWlmIChpbl9yZXBldGl0aW9uKQotCQlnb3RvIG91dDsKLQlyZXR1cm4gdHJ1ZTsKLSBvdXQ6Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIHRvbW95b19pc19jb3JyZWN0X2RvbWFpbiAtIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGRvbWFpbm5hbWUgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVzLgotICogQGRvbWFpbm5hbWU6ICAgVGhlIGRvbWFpbm5hbWUgdG8gY2hlY2suCi0gKgotICogUmV0dXJucyB0cnVlIGlmIEBkb21haW5uYW1lIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1ib29sIHRvbW95b19pc19jb3JyZWN0X2RvbWFpbihjb25zdCB1bnNpZ25lZCBjaGFyICpkb21haW5uYW1lKQotewotCXVuc2lnbmVkIGNoYXIgYzsKLQl1bnNpZ25lZCBjaGFyIGQ7Ci0JdW5zaWduZWQgY2hhciBlOwotCi0JaWYgKCFkb21haW5uYW1lIHx8IHN0cm5jbXAoZG9tYWlubmFtZSwgVE9NT1lPX1JPT1RfTkFNRSwKLQkJCQkgICBUT01PWU9fUk9PVF9OQU1FX0xFTikpCi0JCWdvdG8gb3V0OwotCWRvbWFpbm5hbWUgKz0gVE9NT1lPX1JPT1RfTkFNRV9MRU47Ci0JaWYgKCEqZG9tYWlubmFtZSkKLQkJcmV0dXJuIHRydWU7Ci0JZG8gewotCQlpZiAoKmRvbWFpbm5hbWUrKyAhPSAnICcpCi0JCQlnb3RvIG91dDsKLQkJaWYgKCpkb21haW5uYW1lKysgIT0gJy8nKQotCQkJZ290byBvdXQ7Ci0JCXdoaWxlICgoYyA9ICpkb21haW5uYW1lKSAhPSAnXDAnICYmIGMgIT0gJyAnKSB7Ci0JCQlkb21haW5uYW1lKys7Ci0JCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJYyA9ICpkb21haW5uYW1lKys7Ci0JCQkJc3dpdGNoICgoYykpIHsKLQkJCQljYXNlICdcXCc6ICAvKiAiXFwiICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCWNhc2UgJzAnOiAgIC8qICJcb29vIiAqLwotCQkJCWNhc2UgJzEnOgotCQkJCWNhc2UgJzInOgotCQkJCWNhc2UgJzMnOgotCQkJCQlkID0gKmRvbWFpbm5hbWUrKzsKLQkJCQkJaWYgKGQgPCAnMCcgfHwgZCA+ICc3JykKLQkJCQkJCWJyZWFrOwotCQkJCQllID0gKmRvbWFpbm5hbWUrKzsKLQkJCQkJaWYgKGUgPCAnMCcgfHwgZSA+ICc3JykKLQkJCQkJCWJyZWFrOwotCQkJCQljID0gdG9tb3lvX21ha2VfYnl0ZShjLCBkLCBlKTsKLQkJCQkJaWYgKHRvbW95b19pc19pbnZhbGlkKGMpKQotCQkJCQkJLyogcGF0dGVybiBpcyBub3QgXDAwMCAqLwotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWdvdG8gb3V0OwotCQkJfSBlbHNlIGlmICh0b21veW9faXNfaW52YWxpZChjKSkgewotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JfSB3aGlsZSAoKmRvbWFpbm5hbWUpOwotCXJldHVybiB0cnVlOwotIG91dDoKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogdG9tb3lvX2lzX2RvbWFpbl9kZWYgLSBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB0b2tlbiBjYW4gYmUgYSBkb21haW5uYW1lLgotICoKLSAqIEBidWZmZXI6IFRoZSB0b2tlbiB0byBjaGVjay4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgQGJ1ZmZlciBwb3NzaWJseSBiZSBhIGRvbWFpbm5hbWUsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotYm9vbCB0b21veW9faXNfZG9tYWluX2RlZihjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0JcmV0dXJuICFzdHJuY21wKGJ1ZmZlciwgVE9NT1lPX1JPT1RfTkFNRSwgVE9NT1lPX1JPT1RfTkFNRV9MRU4pOwotfQotCi0vKioKLSAqIHRvbW95b19maW5kX2RvbWFpbiAtIEZpbmQgYSBkb21haW4gYnkgdGhlIGdpdmVuIG5hbWUuCi0gKgotICogQGRvbWFpbm5hbWU6IFRoZSBkb21haW5uYW1lIHRvIGZpbmQuCi0gKgotICogUmV0dXJucyBwb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIiBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCi0gKgotICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KLSAqLwotc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqdG9tb3lvX2ZpbmRfZG9tYWluKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi17Ci0Jc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluOwotCXN0cnVjdCB0b21veW9fcGF0aF9pbmZvIG5hbWU7Ci0KLQluYW1lLm5hbWUgPSBkb21haW5uYW1lOwotCXRvbW95b19maWxsX3BhdGhfaW5mbygmbmFtZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZG9tYWluLCAmdG9tb3lvX2RvbWFpbl9saXN0LCBsaXN0KSB7Ci0JCWlmICghZG9tYWluLT5pc19kZWxldGVkICYmCi0JCSAgICAhdG9tb3lvX3BhdGhjbXAoJm5hbWUsIGRvbWFpbi0+ZG9tYWlubmFtZSkpCi0JCQlyZXR1cm4gZG9tYWluOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiB0b21veW9fY29uc3RfcGFydF9sZW5ndGggLSBFdmFsdWF0ZSB0aGUgaW5pdGlhbCBsZW5ndGggd2l0aG91dCBhIHBhdHRlcm4gaW4gYSB0b2tlbi4KLSAqCi0gKiBAZmlsZW5hbWU6IFRoZSBzdHJpbmcgdG8gZXZhbHVhdGUuCi0gKgotICogUmV0dXJucyB0aGUgaW5pdGlhbCBsZW5ndGggd2l0aG91dCBhIHBhdHRlcm4gaW4gQGZpbGVuYW1lLgotICovCi1zdGF0aWMgaW50IHRvbW95b19jb25zdF9wYXJ0X2xlbmd0aChjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLQljaGFyIGM7Ci0JaW50IGxlbiA9IDA7Ci0KLQlpZiAoIWZpbGVuYW1lKQotCQlyZXR1cm4gMDsKLQl3aGlsZSAoKGMgPSAqZmlsZW5hbWUrKykgIT0gJ1wwJykgewotCQlpZiAoYyAhPSAnXFwnKSB7Ci0JCQlsZW4rKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWMgPSAqZmlsZW5hbWUrKzsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ1xcJzogIC8qICJcXCIgKi8KLQkJCWxlbiArPSAyOwotCQkJY29udGludWU7Ci0JCWNhc2UgJzAnOiAgIC8qICJcb29vIiAqLwotCQljYXNlICcxJzoKLQkJY2FzZSAnMic6Ci0JCWNhc2UgJzMnOgotCQkJYyA9ICpmaWxlbmFtZSsrOwotCQkJaWYgKGMgPCAnMCcgfHwgYyA+ICc3JykKKwl0b21veW9fc2V0X3NwYWNlKGhlYWQpOworCWlmIChwdHItPmlzX2dyb3VwKSB7CisJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsICJAIik7CisJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsIHB0ci0+Z3JvdXAtPmdyb3VwX25hbWUtPm5hbWUpOworCX0gZWxzZSB7CisJCWludCBpOworCQl1bnNpZ25lZCBsb25nIG1pbiA9IHB0ci0+dmFsdWVzWzBdOworCQljb25zdCB1bnNpZ25lZCBsb25nIG1heCA9IHB0ci0+dmFsdWVzWzFdOworCQl1OCBtaW5fdHlwZSA9IHB0ci0+bWluX3R5cGU7CisJCWNvbnN0IHU4IG1heF90eXBlID0gcHRyLT5tYXhfdHlwZTsKKwkJY2hhciBidWZmZXJbMTI4XTsKKwkJYnVmZmVyWzBdID0gJ1wwJzsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJc3dpdGNoIChtaW5fdHlwZSkgeworCQkJY2FzZSBUT01PWU9fVkFMVUVfVFlQRV9IRVhBREVDSU1BTDoKKwkJCQl0b21veW9fYWRkcHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCQkgIjB4JWxYIiwgbWluKTsKIAkJCQlicmVhazsKLQkJCWMgPSAqZmlsZW5hbWUrKzsKLQkJCWlmIChjIDwgJzAnIHx8IGMgPiAnNycpCisJCQljYXNlIFRPTU9ZT19WQUxVRV9UWVBFX09DVEFMOgorCQkJCXRvbW95b19hZGRwcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJCSAiMCVsbyIsIG1pbik7CiAJCQkJYnJlYWs7Ci0JCQlsZW4gKz0gNDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbGVuOwotfQotCi0vKioKLSAqIHRvbW95b19maWxsX3BhdGhfaW5mbyAtIEZpbGwgaW4gInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBtZW1iZXJzLgotICoKLSAqIEBwdHI6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiB0byBmaWxsIGluLgotICoKLSAqIFRoZSBjYWxsZXIgc2V0cyAic3RydWN0IHRvbW95b19wYXRoX2luZm8iLT5uYW1lLgotICovCi12b2lkIHRvbW95b19maWxsX3BhdGhfaW5mbyhzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcHRyKQotewotCWNvbnN0IGNoYXIgKm5hbWUgPSBwdHItPm5hbWU7Ci0JY29uc3QgaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKLQotCXB0ci0+Y29uc3RfbGVuID0gdG9tb3lvX2NvbnN0X3BhcnRfbGVuZ3RoKG5hbWUpOwotCXB0ci0+aXNfZGlyID0gbGVuICYmIChuYW1lW2xlbiAtIDFdID09ICcvJyk7Ci0JcHRyLT5pc19wYXR0ZXJuZWQgPSAocHRyLT5jb25zdF9sZW4gPCBsZW4pOwotCXB0ci0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG5hbWUsIGxlbik7Ci19Ci0KLS8qKgotICogdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuMiAtIFBhdHRlcm4gbWF0Y2hpbmcgd2l0aG91dCAnLycgY2hhcmFjdGVyCi0gKiBhbmQgIlwtIiBwYXR0ZXJuLgotICoKLSAqIEBmaWxlbmFtZTogICAgIFRoZSBzdGFydCBvZiBzdHJpbmcgdG8gY2hlY2suCi0gKiBAZmlsZW5hbWVfZW5kOiBUaGUgZW5kIG9mIHN0cmluZyB0byBjaGVjay4KLSAqIEBwYXR0ZXJuOiAgICAgIFRoZSBzdGFydCBvZiBwYXR0ZXJuIHRvIGNvbXBhcmUuCi0gKiBAcGF0dGVybl9lbmQ6ICBUaGUgZW5kIG9mIHBhdHRlcm4gdG8gY29tcGFyZS4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgQGZpbGVuYW1lIG1hdGNoZXMgQHBhdHRlcm4sIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGJvb2wgdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuMihjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2VuZCwKLQkJCQkJIGNvbnN0IGNoYXIgKnBhdHRlcm4sCi0JCQkJCSBjb25zdCBjaGFyICpwYXR0ZXJuX2VuZCkKLXsKLQl3aGlsZSAoZmlsZW5hbWUgPCBmaWxlbmFtZV9lbmQgJiYgcGF0dGVybiA8IHBhdHRlcm5fZW5kKSB7Ci0JCWNoYXIgYzsKLQkJaWYgKCpwYXR0ZXJuICE9ICdcXCcpIHsKLQkJCWlmICgqZmlsZW5hbWUrKyAhPSAqcGF0dGVybisrKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWMgPSAqZmlsZW5hbWU7Ci0JCXBhdHRlcm4rKzsKLQkJc3dpdGNoICgqcGF0dGVybikgewotCQkJaW50IGk7Ci0JCQlpbnQgajsKLQkJY2FzZSAnPyc6Ci0JCQlpZiAoYyA9PSAnLycpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ1xcJykgewotCQkJCWlmIChmaWxlbmFtZVsxXSA9PSAnXFwnKQotCQkJCQlmaWxlbmFtZSsrOwotCQkJCWVsc2UgaWYgKHRvbW95b19pc19ieXRlX3JhbmdlKGZpbGVuYW1lICsgMSkpCi0JCQkJCWZpbGVuYW1lICs9IDM7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnXFwnOgotCQkJaWYgKGMgIT0gJ1xcJykKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoKisrZmlsZW5hbWUgIT0gJ1xcJykKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSAnKyc6Ci0JCQlpZiAoIWlzZGlnaXQoYykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkJaWYgKCFpc3hkaWdpdChjKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSAnYSc6Ci0JCQlpZiAoIXRvbW95b19pc19hbHBoYWJldF9jaGFyKGMpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWJyZWFrOwotCQljYXNlICcwJzoKLQkJY2FzZSAnMSc6Ci0JCWNhc2UgJzInOgotCQljYXNlICczJzoKLQkJCWlmIChjID09ICdcXCcgJiYgdG9tb3lvX2lzX2J5dGVfcmFuZ2UoZmlsZW5hbWUgKyAxKQotCQkJICAgICYmIHN0cm5jbXAoZmlsZW5hbWUgKyAxLCBwYXR0ZXJuLCAzKSA9PSAwKSB7Ci0JCQkJZmlsZW5hbWUgKz0gMzsKLQkJCQlwYXR0ZXJuICs9IDI7CisJCQlkZWZhdWx0OgorCQkJCXRvbW95b19hZGRwcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJCSAiJWx1IiwgbWluKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXJldHVybiBmYWxzZTsgLyogTm90IG1hdGNoZWQuICovCi0JCWNhc2UgJyonOgotCQljYXNlICdAJzoKLQkJCWZvciAoaSA9IDA7IGkgPD0gZmlsZW5hbWVfZW5kIC0gZmlsZW5hbWU7IGkrKykgewotCQkJCWlmICh0b21veW9fZmlsZV9tYXRjaGVzX3BhdHRlcm4yKAotCQkJCQkJICAgIGZpbGVuYW1lICsgaSwgZmlsZW5hbWVfZW5kLAotCQkJCQkJICAgIHBhdHRlcm4gKyAxLCBwYXR0ZXJuX2VuZCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWMgPSBmaWxlbmFtZVtpXTsKLQkJCQlpZiAoYyA9PSAnLicgJiYgKnBhdHRlcm4gPT0gJ0AnKQotCQkJCQlicmVhazsKLQkJCQlpZiAoYyAhPSAnXFwnKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZmlsZW5hbWVbaSArIDFdID09ICdcXCcpCi0JCQkJCWkrKzsKLQkJCQllbHNlIGlmICh0b21veW9faXNfYnl0ZV9yYW5nZShmaWxlbmFtZSArIGkgKyAxKSkKLQkJCQkJaSArPSAzOwotCQkJCWVsc2UKLQkJCQkJYnJlYWs7IC8qIEJhZCBwYXR0ZXJuLiAqLwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOyAvKiBOb3QgbWF0Y2hlZC4gKi8KLQkJZGVmYXVsdDoKLQkJCWogPSAwOwotCQkJYyA9ICpwYXR0ZXJuOwotCQkJaWYgKGMgPT0gJyQnKSB7Ci0JCQkJd2hpbGUgKGlzZGlnaXQoZmlsZW5hbWVbal0pKQotCQkJCQlqKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gJ1gnKSB7Ci0JCQkJd2hpbGUgKGlzeGRpZ2l0KGZpbGVuYW1lW2pdKSkKLQkJCQkJaisrOwotCQkJfSBlbHNlIGlmIChjID09ICdBJykgewotCQkJCXdoaWxlICh0b21veW9faXNfYWxwaGFiZXRfY2hhcihmaWxlbmFtZVtqXSkpCi0JCQkJCWorKzsKLQkJCX0KLQkJCWZvciAoaSA9IDE7IGkgPD0gajsgaSsrKSB7Ci0JCQkJaWYgKHRvbW95b19maWxlX21hdGNoZXNfcGF0dGVybjIoCi0JCQkJCQkgICAgZmlsZW5hbWUgKyBpLCBmaWxlbmFtZV9lbmQsCi0JCQkJCQkgICAgcGF0dGVybiArIDEsIHBhdHRlcm5fZW5kKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7IC8qIE5vdCBtYXRjaGVkIG9yIGJhZCBwYXR0ZXJuLiAqLworCQkJaWYgKG1pbiA9PSBtYXggJiYgbWluX3R5cGUgPT0gbWF4X3R5cGUpCisJCQkJYnJlYWs7CisJCQl0b21veW9fYWRkcHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICItIik7CisJCQltaW5fdHlwZSA9IG1heF90eXBlOworCQkJbWluID0gbWF4OwogCQl9Ci0JCWZpbGVuYW1lKys7Ci0JCXBhdHRlcm4rKzsKKwkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXMiLCBidWZmZXIpOwogCX0KLQl3aGlsZSAoKnBhdHRlcm4gPT0gJ1xcJyAmJgotCSAgICAgICAoKihwYXR0ZXJuICsgMSkgPT0gJyonIHx8ICoocGF0dGVybiArIDEpID09ICdAJykpCi0JCXBhdHRlcm4gKz0gMjsKLQlyZXR1cm4gZmlsZW5hbWUgPT0gZmlsZW5hbWVfZW5kICYmIHBhdHRlcm4gPT0gcGF0dGVybl9lbmQ7CiB9CiAKIC8qKgotICogdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuIC0gUGF0dGVybiBtYXRjaGluZyB3aXRob3V0IHdpdGhvdXQgJy8nIGNoYXJhY3Rlci4KLSAqCi0gKiBAZmlsZW5hbWU6ICAgICBUaGUgc3RhcnQgb2Ygc3RyaW5nIHRvIGNoZWNrLgotICogQGZpbGVuYW1lX2VuZDogVGhlIGVuZCBvZiBzdHJpbmcgdG8gY2hlY2suCi0gKiBAcGF0dGVybjogICAgICBUaGUgc3RhcnQgb2YgcGF0dGVybiB0byBjb21wYXJlLgotICogQHBhdHRlcm5fZW5kOiAgVGhlIGVuZCBvZiBwYXR0ZXJuIHRvIGNvbXBhcmUuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIEBmaWxlbmFtZSBtYXRjaGVzIEBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBib29sIHRvbW95b19maWxlX21hdGNoZXNfcGF0dGVybihjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWVfZW5kLAotCQkJCQkgICBjb25zdCBjaGFyICpwYXR0ZXJuLAotCQkJCQkgICBjb25zdCBjaGFyICpwYXR0ZXJuX2VuZCkKLXsKLQljb25zdCBjaGFyICpwYXR0ZXJuX3N0YXJ0ID0gcGF0dGVybjsKLQlib29sIGZpcnN0ID0gdHJ1ZTsKLQlib29sIHJlc3VsdDsKLQotCXdoaWxlIChwYXR0ZXJuIDwgcGF0dGVybl9lbmQgLSAxKSB7Ci0JCS8qIFNwbGl0IGF0ICJcLSIgcGF0dGVybi4gKi8KLQkJaWYgKCpwYXR0ZXJuKysgIT0gJ1xcJyB8fCAqcGF0dGVybisrICE9ICctJykKLQkJCWNvbnRpbnVlOwotCQlyZXN1bHQgPSB0b21veW9fZmlsZV9tYXRjaGVzX3BhdHRlcm4yKGZpbGVuYW1lLAotCQkJCQkJICAgICAgZmlsZW5hbWVfZW5kLAotCQkJCQkJICAgICAgcGF0dGVybl9zdGFydCwKLQkJCQkJCSAgICAgIHBhdHRlcm4gLSAyKTsKLQkJaWYgKGZpcnN0KQotCQkJcmVzdWx0ID0gIXJlc3VsdDsKLQkJaWYgKHJlc3VsdCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmlyc3QgPSBmYWxzZTsKLQkJcGF0dGVybl9zdGFydCA9IHBhdHRlcm47Ci0JfQotCXJlc3VsdCA9IHRvbW95b19maWxlX21hdGNoZXNfcGF0dGVybjIoZmlsZW5hbWUsIGZpbGVuYW1lX2VuZCwKLQkJCQkJICAgICAgcGF0dGVybl9zdGFydCwgcGF0dGVybl9lbmQpOwotCXJldHVybiBmaXJzdCA/IHJlc3VsdCA6ICFyZXN1bHQ7Ci19Ci0KLS8qKgotICogdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuMiAtIERvIHBhdGhuYW1lIHBhdHRlcm4gbWF0Y2hpbmcuCi0gKgotICogQGY6IFRoZSBzdGFydCBvZiBzdHJpbmcgdG8gY2hlY2suCi0gKiBAcDogVGhlIHN0YXJ0IG9mIHBhdHRlcm4gdG8gY29tcGFyZS4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgQGYgbWF0Y2hlcyBAcCwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgYm9vbCB0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4yKGNvbnN0IGNoYXIgKmYsIGNvbnN0IGNoYXIgKnApCi17Ci0JY29uc3QgY2hhciAqZl9kZWxpbWl0ZXI7Ci0JY29uc3QgY2hhciAqcF9kZWxpbWl0ZXI7Ci0KLQl3aGlsZSAoKmYgJiYgKnApIHsKLQkJZl9kZWxpbWl0ZXIgPSBzdHJjaHIoZiwgJy8nKTsKLQkJaWYgKCFmX2RlbGltaXRlcikKLQkJCWZfZGVsaW1pdGVyID0gZiArIHN0cmxlbihmKTsKLQkJcF9kZWxpbWl0ZXIgPSBzdHJjaHIocCwgJy8nKTsKLQkJaWYgKCFwX2RlbGltaXRlcikKLQkJCXBfZGVsaW1pdGVyID0gcCArIHN0cmxlbihwKTsKLQkJaWYgKCpwID09ICdcXCcgJiYgKihwICsgMSkgPT0gJ3snKQotCQkJZ290byByZWN1cnNpdmU7Ci0JCWlmICghdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuKGYsIGZfZGVsaW1pdGVyLCBwLAotCQkJCQkJIHBfZGVsaW1pdGVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZiA9IGZfZGVsaW1pdGVyOwotCQlpZiAoKmYpCi0JCQlmKys7Ci0JCXAgPSBwX2RlbGltaXRlcjsKLQkJaWYgKCpwKQotCQkJcCsrOwotCX0KLQkvKiBJZ25vcmUgdHJhaWxpbmcgIlwqIiBhbmQgIlxAIiBpbiBAcGF0dGVybi4gKi8KLQl3aGlsZSAoKnAgPT0gJ1xcJyAmJgotCSAgICAgICAoKihwICsgMSkgPT0gJyonIHx8ICoocCArIDEpID09ICdAJykpCi0JCXAgKz0gMjsKLQlyZXR1cm4gISpmICYmICEqcDsKLSByZWN1cnNpdmU6Ci0JLyoKLQkgKiBUaGUgIlx7IiBwYXR0ZXJuIGlzIHBlcm1pdHRlZCBvbmx5IGFmdGVyICcvJyBjaGFyYWN0ZXIuCi0JICogVGhpcyBndWFyYW50ZWVzIHRoYXQgYmVsb3cgIioocCAtIDEpIiBpcyBzYWZlLgotCSAqIEFsc28sIHRoZSAiXH0iIHBhdHRlcm4gaXMgcGVybWl0dGVkIG9ubHkgYmVmb3JlICcvJyBjaGFyYWN0ZXIKLQkgKiBzbyB0aGF0ICJceyIgKyAiXH0iIHBhaXIgd2lsbCBub3QgYnJlYWsgdGhlICJcLSIgb3BlcmF0b3IuCi0JICovCi0JaWYgKCoocCAtIDEpICE9ICcvJyB8fCBwX2RlbGltaXRlciA8PSBwICsgMyB8fCAqcF9kZWxpbWl0ZXIgIT0gJy8nIHx8Ci0JICAgICoocF9kZWxpbWl0ZXIgLSAxKSAhPSAnfScgfHwgKihwX2RlbGltaXRlciAtIDIpICE9ICdcXCcpCi0JCXJldHVybiBmYWxzZTsgLyogQmFkIHBhdHRlcm4uICovCi0JZG8gewotCQkvKiBDb21wYXJlIGN1cnJlbnQgY29tcG9uZW50IHdpdGggcGF0dGVybi4gKi8KLQkJaWYgKCF0b21veW9fZmlsZV9tYXRjaGVzX3BhdHRlcm4oZiwgZl9kZWxpbWl0ZXIsIHAgKyAyLAotCQkJCQkJIHBfZGVsaW1pdGVyIC0gMikpCi0JCQlicmVhazsKLQkJLyogUHJvY2VlZCB0byBuZXh0IGNvbXBvbmVudC4gKi8KLQkJZiA9IGZfZGVsaW1pdGVyOwotCQlpZiAoISpmKQotCQkJYnJlYWs7Ci0JCWYrKzsKLQkJLyogQ29udGludWUgY29tcGFyaXNvbi4gKi8KLQkJaWYgKHRvbW95b19wYXRoX21hdGNoZXNfcGF0dGVybjIoZiwgcF9kZWxpbWl0ZXIgKyAxKSkKLQkJCXJldHVybiB0cnVlOwotCQlmX2RlbGltaXRlciA9IHN0cmNocihmLCAnLycpOwotCX0gd2hpbGUgKGZfZGVsaW1pdGVyKTsKLQlyZXR1cm4gZmFsc2U7IC8qIE5vdCBtYXRjaGVkLiAqLwotfQotCi0vKioKLSAqIHRvbW95b19wYXRoX21hdGNoZXNfcGF0dGVybiAtIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGVuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4uCi0gKgotICogQGZpbGVuYW1lOiBUaGUgZmlsZW5hbWUgdG8gY2hlY2suCi0gKiBAcGF0dGVybjogIFRoZSBwYXR0ZXJuIHRvIGNvbXBhcmUuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSBhdmFpbGFibGUuCi0gKiAgIFxcICAgICBcIGl0c2VsZi4KLSAqICAgXG9vbyAgIE9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGEgYnl0ZS4KLSAqICAgXCogICAgIFplcm8gb3IgbW9yZSByZXBldGl0aW9ucyBvZiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gJy8nLgotICogICBcQCAgICAgWmVybyBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiAnLycgb3IgJy4nLgotICogICBcPyAgICAgMSBieXRlIGNoYXJhY3RlciBvdGhlciB0aGFuICcvJy4KLSAqICAgXCQgICAgIE9uZSBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGRlY2ltYWwgZGlnaXRzLgotICogICBcKyAgICAgMSBkZWNpbWFsIGRpZ2l0LgotICogICBcWCAgICAgT25lIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLgotICogICBceCAgICAgMSBoZXhhZGVjaW1hbCBkaWdpdC4KLSAqICAgXEEgICAgIE9uZSBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGFscGhhYmV0IGNoYXJhY3RlcnMuCi0gKiAgIFxhICAgICAxIGFscGhhYmV0IGNoYXJhY3Rlci4KLSAqCi0gKiAgIFwtICAgICBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KLSAqCi0gKiAgIC9ce2Rpclx9LyAgICcvJyArICdPbmUgb3IgbW9yZSByZXBldGl0aW9ucyBvZiBkaXIvJyAoZS5nLiAvZGlyLyAvZGlyL2Rpci8KLSAqICAgICAgICAgICAgICAgL2Rpci9kaXIvZGlyLyApLgotICovCi1ib29sIHRvbW95b19wYXRoX21hdGNoZXNfcGF0dGVybihjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWUsCi0JCQkJIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpwYXR0ZXJuKQotewotCWNvbnN0IGNoYXIgKmYgPSBmaWxlbmFtZS0+bmFtZTsKLQljb25zdCBjaGFyICpwID0gcGF0dGVybi0+bmFtZTsKLQljb25zdCBpbnQgbGVuID0gcGF0dGVybi0+Y29uc3RfbGVuOwotCi0JLyogSWYgQHBhdHRlcm4gZG9lc24ndCBjb250YWluIHBhdHRlcm4sIEkgY2FuIHVzZSBzdHJjbXAoKS4gKi8KLQlpZiAoIXBhdHRlcm4tPmlzX3BhdHRlcm5lZCkKLQkJcmV0dXJuICF0b21veW9fcGF0aGNtcChmaWxlbmFtZSwgcGF0dGVybik7Ci0JLyogRG9uJ3QgY29tcGFyZSBkaXJlY3RvcnkgYW5kIG5vbi1kaXJlY3RvcnkuICovCi0JaWYgKGZpbGVuYW1lLT5pc19kaXIgIT0gcGF0dGVybi0+aXNfZGlyKQotCQlyZXR1cm4gZmFsc2U7Ci0JLyogQ29tcGFyZSB0aGUgaW5pdGlhbCBsZW5ndGggd2l0aG91dCBwYXR0ZXJucy4gKi8KLQlpZiAoc3RybmNtcChmLCBwLCBsZW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JZiArPSBsZW47Ci0JcCArPSBsZW47Ci0JcmV0dXJuIHRvbW95b19wYXRoX21hdGNoZXNfcGF0dGVybjIoZiwgcCk7Ci19Ci0KLS8qKgotICogdG9tb3lvX2lvX3ByaW50ZiAtIFRyYW5zYWN0aW9uYWwgcHJpbnRmKCkgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIiBzdHJ1Y3R1cmUuCi0gKgotICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KLSAqIEBmbXQ6ICBUaGUgcHJpbnRmKCkncyBmb3JtYXQgc3RyaW5nLCBmb2xsb3dlZCBieSBwYXJhbWV0ZXJzLgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiBvdXRwdXQgd2FzIHdyaXR0ZW4sIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBUaGUgc25wcmludGYoKSB3aWxsIHRydW5jYXRlLCBidXQgdG9tb3lvX2lvX3ByaW50ZigpIHdvbid0LgotICovCi1ib29sIHRvbW95b19pb19wcmludGYoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQlpbnQgbGVuOwotCWludCBwb3MgPSBoZWFkLT5yZWFkX2F2YWlsOwotCWludCBzaXplID0gaGVhZC0+cmVhZGJ1Zl9zaXplIC0gcG9zOwotCi0JaWYgKHNpemUgPD0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JbGVuID0gdnNucHJpbnRmKGhlYWQtPnJlYWRfYnVmICsgcG9zLCBzaXplLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQlpZiAocG9zICsgbGVuID49IGhlYWQtPnJlYWRidWZfc2l6ZSkKLQkJcmV0dXJuIGZhbHNlOwotCWhlYWQtPnJlYWRfYXZhaWwgKz0gbGVuOwotCXJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIHRvbW95b19nZXRfZXhlIC0gR2V0IHRvbW95b19yZWFscGF0aCgpIG9mIGN1cnJlbnQgcHJvY2Vzcy4KLSAqCi0gKiBSZXR1cm5zIHRoZSB0b21veW9fcmVhbHBhdGgoKSBvZiBjdXJyZW50IHByb2Nlc3Mgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UuCi0gKgotICogVGhpcyBmdW5jdGlvbiB1c2VzIGt6YWxsb2MoKSwgc28gdGhlIGNhbGxlciBtdXN0IGNhbGwga2ZyZWUoKQotICogaWYgdGhpcyBmdW5jdGlvbiBkaWRuJ3QgcmV0dXJuIE5VTEwuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICp0b21veW9fZ2V0X2V4ZSh2b2lkKQotewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Ci0JY29uc3QgY2hhciAqY3AgPSBOVUxMOwotCi0JaWYgKCFtbSkKLQkJcmV0dXJuIE5VTEw7Ci0JZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWZvciAodm1hID0gbW0tPm1tYXA7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KSB7Ci0JCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpICYmIHZtYS0+dm1fZmlsZSkgewotCQkJY3AgPSB0b21veW9fcmVhbHBhdGhfZnJvbV9wYXRoKCZ2bWEtPnZtX2ZpbGUtPmZfcGF0aCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCXJldHVybiBjcDsKLX0KLQotLyoqCi0gKiB0b21veW9fZ2V0X21zZyAtIEdldCB3YXJuaW5nIG1lc3NhZ2UuCi0gKgotICogQGlzX2VuZm9yY2U6IElzIGl0IGVuZm9yY2luZyBtb2RlPwotICoKLSAqIFJldHVybnMgIkVSUk9SIiBvciAiV0FSTklORyIuCi0gKi8KLWNvbnN0IGNoYXIgKnRvbW95b19nZXRfbXNnKGNvbnN0IGJvb2wgaXNfZW5mb3JjZSkKLXsKLQlpZiAoaXNfZW5mb3JjZSkKLQkJcmV0dXJuICJFUlJPUiI7Ci0JZWxzZQotCQlyZXR1cm4gIldBUk5JTkciOwotfQotCi0vKioKLSAqIHRvbW95b19jaGVja19mbGFncyAtIENoZWNrIG1vZGUgZm9yIHNwZWNpZmllZCBmdW5jdGlvbmFsaXR5LgotICoKLSAqIEBkb21haW46IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLgotICogQGluZGV4OiAgVGhlIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgbW9kZS4KLSAqCi0gKiBUT01PWU8gY2hlY2tzIG9ubHkgcHJvY2VzcyBjb250ZXh0LgotICogVGhpcyBjb2RlIGRpc2FibGVzIFRPTU9ZTydzIGVuZm9yY2VtZW50IGluIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tCi0gKiBpbnRlcnJ1cHQgY29udGV4dC4KLSAqLwotdW5zaWduZWQgaW50IHRvbW95b19jaGVja19mbGFncyhjb25zdCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCi0JCQkJY29uc3QgdTggaW5kZXgpCi17Ci0JY29uc3QgdTggcHJvZmlsZSA9IGRvbWFpbi0+cHJvZmlsZTsKLQotCWlmIChXQVJOX09OKGluX2ludGVycnVwdCgpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRvbW95b19wb2xpY3lfbG9hZGVkICYmIGluZGV4IDwgVE9NT1lPX01BWF9DT05UUk9MX0lOREVYCi0jaWYgVE9NT1lPX01BWF9QUk9GSUxFUyAhPSAyNTYKLQkJJiYgcHJvZmlsZSA8IFRPTU9ZT19NQVhfUFJPRklMRVMKLSNlbmRpZgotCQkmJiB0b21veW9fcHJvZmlsZV9wdHJbcHJvZmlsZV0gPwotCQl0b21veW9fcHJvZmlsZV9wdHJbcHJvZmlsZV0tPnZhbHVlW2luZGV4XSA6IDA7Ci19Ci0KLS8qKgotICogdG9tb3lvX3ZlcmJvc2VfbW9kZSAtIENoZWNrIHdoZXRoZXIgVE9NT1lPIGlzIHZlcmJvc2UgbW9kZS4KLSAqCi0gKiBAZG9tYWluOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgZG9tYWluIHBvbGljeSB2aW9sYXRpb24gd2FybmluZyBzaG91bGQgYmUgcHJpbnRlZCB0bwotICogY29uc29sZS4KLSAqLwotYm9vbCB0b21veW9fdmVyYm9zZV9tb2RlKGNvbnN0IHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbikKLXsKLQlyZXR1cm4gdG9tb3lvX2NoZWNrX2ZsYWdzKGRvbWFpbiwgVE9NT1lPX1ZFUkJPU0UpICE9IDA7Ci19Ci0KLS8qKgotICogdG9tb3lvX2RvbWFpbl9xdW90YV9pc19vayAtIENoZWNrIGZvciBkb21haW4ncyBxdW90YS4KLSAqCi0gKiBAZG9tYWluOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRvbWFpbiBpcyBub3QgZXhjZWVkZWQgcXVvdGEsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgotICovCi1ib29sIHRvbW95b19kb21haW5fcXVvdGFfaXNfb2soc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqIGNvbnN0IGRvbWFpbikKLXsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCXN0cnVjdCB0b21veW9fYWNsX2luZm8gKnB0cjsKLQotCWlmICghZG9tYWluKQotCQlyZXR1cm4gdHJ1ZTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZkb21haW4tPmFjbF9pbmZvX2xpc3QsIGxpc3QpIHsKLQkJc3dpdGNoIChwdHItPnR5cGUpIHsKLQkJCXN0cnVjdCB0b21veW9fcGF0aF9hY2wgKmFjbDsKLQkJCXUzMiBwZXJtOwotCQkJdTggaTsKLQkJY2FzZSBUT01PWU9fVFlQRV9QQVRIX0FDTDoKLQkJCWFjbCA9IGNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCB0b21veW9fcGF0aF9hY2wsIGhlYWQpOwotCQkJcGVybSA9IGFjbC0+cGVybSB8ICgoKHUzMikgYWNsLT5wZXJtX2hpZ2gpIDw8IDE2KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBUT01PWU9fTUFYX1BBVEhfT1BFUkFUSU9OOyBpKyspCi0JCQkJaWYgKHBlcm0gJiAoMSA8PCBpKSkKLQkJCQkJY291bnQrKzsKLQkJCWlmIChwZXJtICYgKDEgPDwgVE9NT1lPX1RZUEVfUkVBRF9XUklURSkpCi0JCQkJY291bnQgLT0gMjsKLQkJCWJyZWFrOwotCQljYXNlIFRPTU9ZT19UWVBFX1BBVEgyX0FDTDoKLQkJCXBlcm0gPSBjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCwgaGVhZCkKLQkJCQktPnBlcm07Ci0JCQlmb3IgKGkgPSAwOyBpIDwgVE9NT1lPX01BWF9QQVRIMl9PUEVSQVRJT047IGkrKykKLQkJCQlpZiAocGVybSAmICgxIDw8IGkpKQotCQkJCQljb3VudCsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGNvdW50IDwgdG9tb3lvX2NoZWNrX2ZsYWdzKGRvbWFpbiwgVE9NT1lPX01BWF9BQ0NFUFRfRU5UUlkpKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoIWRvbWFpbi0+cXVvdGFfd2FybmVkKSB7Ci0JCWRvbWFpbi0+cXVvdGFfd2FybmVkID0gdHJ1ZTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVE9NT1lPLVdBUk5JTkc6ICIKLQkJICAgICAgICJEb21haW4gJyVzJyBoYXMgc28gbWFueSBBQ0xzIHRvIGhvbGQuICIKLQkJICAgICAgICJTdG9wcGVkIGxlYXJuaW5nIG1vZGUuXG4iLCBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUpOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogdG9tb3lvX2ZpbmRfb3JfYXNzaWduX25ld19wcm9maWxlIC0gQ3JlYXRlIGEgbmV3IHByb2ZpbGUuCisgKiB0b21veW9fYXNzaWduX3Byb2ZpbGUgLSBDcmVhdGUgYSBuZXcgcHJvZmlsZS4KICAqCiAgKiBAcHJvZmlsZTogUHJvZmlsZSBudW1iZXIgdG8gY3JlYXRlLgogICoKICAqIFJldHVybnMgcG9pbnRlciB0byAic3RydWN0IHRvbW95b19wcm9maWxlIiBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KICAqLwotc3RhdGljIHN0cnVjdCB0b21veW9fcHJvZmlsZSAqdG9tb3lvX2ZpbmRfb3JfYXNzaWduX25ld19wcm9maWxlKGNvbnN0IHVuc2lnbmVkCi0JCQkJCQkJCWludCBwcm9maWxlKQorc3RhdGljIHN0cnVjdCB0b21veW9fcHJvZmlsZSAqdG9tb3lvX2Fzc2lnbl9wcm9maWxlKGNvbnN0IHVuc2lnbmVkIGludCBwcm9maWxlKQogewotCXN0cnVjdCB0b21veW9fcHJvZmlsZSAqcHRyID0gTlVMTDsKLQlpbnQgaTsKLQorCXN0cnVjdCB0b21veW9fcHJvZmlsZSAqcHRyOworCXN0cnVjdCB0b21veW9fcHJvZmlsZSAqZW50cnk7CiAJaWYgKHByb2ZpbGUgPj0gVE9NT1lPX01BWF9QUk9GSUxFUykKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJcmV0dXJuIE5VTEw7CiAJcHRyID0gdG9tb3lvX3Byb2ZpbGVfcHRyW3Byb2ZpbGVdOwogCWlmIChwdHIpCi0JCWdvdG8gb2s7Ci0JcHRyID0ga21hbGxvYyhzaXplb2YoKnB0ciksIEdGUF9OT0ZTKTsKLQlpZiAoIXRvbW95b19tZW1vcnlfb2socHRyKSkgewotCQlrZnJlZShwdHIpOwotCQlwdHIgPSBOVUxMOwotCQlnb3RvIG9rOworCQlyZXR1cm4gcHRyOworCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX05PRlMpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnRvbW95b19wb2xpY3lfbG9jaykpCisJCWdvdG8gb3V0OworCXB0ciA9IHRvbW95b19wcm9maWxlX3B0cltwcm9maWxlXTsKKwlpZiAoIXB0ciAmJiB0b21veW9fbWVtb3J5X29rKGVudHJ5KSkgeworCQlwdHIgPSBlbnRyeTsKKwkJcHRyLT5sZWFybmluZyA9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlLnByZWZlcmVuY2U7CisJCXB0ci0+cGVybWlzc2l2ZSA9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlLnByZWZlcmVuY2U7CisJCXB0ci0+ZW5mb3JjaW5nID0gJnRvbW95b19kZWZhdWx0X3Byb2ZpbGUucHJlZmVyZW5jZTsKKwkJcHRyLT5kZWZhdWx0X2NvbmZpZyA9IFRPTU9ZT19DT05GSUdfRElTQUJMRUQ7CisJCW1lbXNldChwdHItPmNvbmZpZywgVE9NT1lPX0NPTkZJR19VU0VfREVGQVVMVCwKKwkJICAgICAgIHNpemVvZihwdHItPmNvbmZpZykpOworCQltYigpOyAvKiBBdm9pZCBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uLiAqLworCQl0b21veW9fcHJvZmlsZV9wdHJbcHJvZmlsZV0gPSBwdHI7CisJCWVudHJ5ID0gTlVMTDsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfQ09OVFJPTF9JTkRFWDsgaSsrKQotCQlwdHItPnZhbHVlW2ldID0gdG9tb3lvX2NvbnRyb2xfYXJyYXlbaV0uY3VycmVudF92YWx1ZTsKLQltYigpOyAvKiBBdm9pZCBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uLiAqLwotCXRvbW95b19wcm9maWxlX3B0cltwcm9maWxlXSA9IHB0cjsKLSBvazoKIAltdXRleF91bmxvY2soJnRvbW95b19wb2xpY3lfbG9jayk7Cisgb3V0OgorCWtmcmVlKGVudHJ5KTsKIAlyZXR1cm4gcHRyOwogfQogCiAvKioKLSAqIHRvbW95b193cml0ZV9wcm9maWxlIC0gV3JpdGUgdG8gcHJvZmlsZSB0YWJsZS4KKyAqIHRvbW95b19wcm9maWxlIC0gRmluZCBhIHByb2ZpbGUuCisgKgorICogQHByb2ZpbGU6IFByb2ZpbGUgbnVtYmVyIHRvIGZpbmQuCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3Byb2ZpbGUiLgorICovCitzdHJ1Y3QgdG9tb3lvX3Byb2ZpbGUgKnRvbW95b19wcm9maWxlKGNvbnN0IHU4IHByb2ZpbGUpCit7CisJc3RydWN0IHRvbW95b19wcm9maWxlICpwdHIgPSB0b21veW9fcHJvZmlsZV9wdHJbcHJvZmlsZV07CisJaWYgKCF0b21veW9fcG9saWN5X2xvYWRlZCkKKwkJcmV0dXJuICZ0b21veW9fZGVmYXVsdF9wcm9maWxlOworCUJVR19PTighcHRyKTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgczggdG9tb3lvX2ZpbmRfeWVzbm8oY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpmaW5kKQoreworCWNvbnN0IGNoYXIgKmNwID0gc3Ryc3RyKHN0cmluZywgZmluZCk7CisJaWYgKGNwKSB7CisJCWNwICs9IHN0cmxlbihmaW5kKTsKKwkJaWYgKCFzdHJuY21wKGNwLCAiPXllcyIsIDQpKQorCQkJcmV0dXJuIDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKGNwLCAiPW5vIiwgMykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB0b21veW9fc2V0X2Jvb2woYm9vbCAqYiwgY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpmaW5kKQoreworCXN3aXRjaCAodG9tb3lvX2ZpbmRfeWVzbm8oc3RyaW5nLCBmaW5kKSkgeworCWNhc2UgMToKKwkJKmIgPSB0cnVlOworCQlicmVhazsKKwljYXNlIDA6CisJCSpiID0gZmFsc2U7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdG9tb3lvX3NldF91aW50KHVuc2lnbmVkIGludCAqaSwgY29uc3QgY2hhciAqc3RyaW5nLAorCQkJICAgIGNvbnN0IGNoYXIgKmZpbmQpCit7CisJY29uc3QgY2hhciAqY3AgPSBzdHJzdHIoc3RyaW5nLCBmaW5kKTsKKwlpZiAoY3ApCisJCXNzY2FuZihjcCArIHN0cmxlbihmaW5kKSwgIj0ldSIsIGkpOworfQorCitzdGF0aWMgdm9pZCB0b21veW9fc2V0X3ByZWYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsCisJCQkgICAgY29uc3QgYm9vbCB1c2VfZGVmYXVsdCwKKwkJCSAgICBzdHJ1Y3QgdG9tb3lvX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJc3RydWN0IHRvbW95b19wcmVmZXJlbmNlICoqcHJlZjsKKwlib29sICp2ZXJib3NlOworCWlmICghc3RyY21wKG5hbWUsICJlbmZvcmNpbmciKSkgeworCQlpZiAodXNlX2RlZmF1bHQpIHsKKwkJCXByZWYgPSAmcHJvZmlsZS0+ZW5mb3JjaW5nOworCQkJZ290byBzZXRfZGVmYXVsdDsKKwkJfQorCQlwcm9maWxlLT5lbmZvcmNpbmcgPSAmcHJvZmlsZS0+cHJlZmVyZW5jZTsKKwkJdmVyYm9zZSA9ICZwcm9maWxlLT5wcmVmZXJlbmNlLmVuZm9yY2luZ192ZXJib3NlOworCQlnb3RvIHNldF92ZXJib3NlOworCX0KKwlpZiAoIXN0cmNtcChuYW1lLCAicGVybWlzc2l2ZSIpKSB7CisJCWlmICh1c2VfZGVmYXVsdCkgeworCQkJcHJlZiA9ICZwcm9maWxlLT5wZXJtaXNzaXZlOworCQkJZ290byBzZXRfZGVmYXVsdDsKKwkJfQorCQlwcm9maWxlLT5wZXJtaXNzaXZlID0gJnByb2ZpbGUtPnByZWZlcmVuY2U7CisJCXZlcmJvc2UgPSAmcHJvZmlsZS0+cHJlZmVyZW5jZS5wZXJtaXNzaXZlX3ZlcmJvc2U7CisJCWdvdG8gc2V0X3ZlcmJvc2U7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJsZWFybmluZyIpKSB7CisJCWlmICh1c2VfZGVmYXVsdCkgeworCQkJcHJlZiA9ICZwcm9maWxlLT5sZWFybmluZzsKKwkJCWdvdG8gc2V0X2RlZmF1bHQ7CisJCX0KKwkJcHJvZmlsZS0+bGVhcm5pbmcgPSAmcHJvZmlsZS0+cHJlZmVyZW5jZTsKKwkJdG9tb3lvX3NldF91aW50KCZwcm9maWxlLT5wcmVmZXJlbmNlLmxlYXJuaW5nX21heF9lbnRyeSwgdmFsdWUsCisJCQkgICAgICJtYXhfZW50cnkiKTsKKwkJdmVyYm9zZSA9ICZwcm9maWxlLT5wcmVmZXJlbmNlLmxlYXJuaW5nX3ZlcmJvc2U7CisJCWdvdG8gc2V0X3ZlcmJvc2U7CisJfQorCXJldHVybjsKKyBzZXRfZGVmYXVsdDoKKwkqcHJlZiA9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlLnByZWZlcmVuY2U7CisJcmV0dXJuOworIHNldF92ZXJib3NlOgorCXRvbW95b19zZXRfYm9vbCh2ZXJib3NlLCB2YWx1ZSwgInZlcmJvc2UiKTsKK30KKworc3RhdGljIGludCB0b21veW9fc2V0X21vZGUoY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsCisJCQkgICBjb25zdCBib29sIHVzZV9kZWZhdWx0LAorCQkJICAgc3RydWN0IHRvbW95b19wcm9maWxlICpwcm9maWxlKQoreworCXU4IGk7CisJdTggY29uZmlnOworCWlmICghc3RyY21wKG5hbWUsICJDT05GSUciKSkgeworCQlpID0gVE9NT1lPX01BWF9NQUNfSU5ERVggKyBUT01PWU9fTUFYX01BQ19DQVRFR09SWV9JTkRFWDsKKwkJY29uZmlnID0gcHJvZmlsZS0+ZGVmYXVsdF9jb25maWc7CisJfSBlbHNlIGlmICh0b21veW9fc3RyX3N0YXJ0cygmbmFtZSwgIkNPTkZJRzo6IikpIHsKKwkJY29uZmlnID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfTUFDX0lOREVYCisJCQkgICAgICsgVE9NT1lPX01BWF9NQUNfQ0FURUdPUllfSU5ERVg7IGkrKykgeworCQkJaWYgKHN0cmNtcChuYW1lLCB0b21veW9fbWFjX2tleXdvcmRzW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCWNvbmZpZyA9IHByb2ZpbGUtPmNvbmZpZ1tpXTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpID09IFRPTU9ZT19NQVhfTUFDX0lOREVYICsgVE9NT1lPX01BWF9NQUNfQ0FURUdPUllfSU5ERVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHVzZV9kZWZhdWx0KSB7CisJCWNvbmZpZyA9IFRPTU9ZT19DT05GSUdfVVNFX0RFRkFVTFQ7CisJfSBlbHNlIHsKKwkJdTggbW9kZTsKKwkJZm9yIChtb2RlID0gMDsgbW9kZSA8IDQ7IG1vZGUrKykKKwkJCWlmIChzdHJzdHIodmFsdWUsIHRvbW95b19tb2RlW21vZGVdKSkKKwkJCQkvKgorCQkJCSAqIFVwZGF0ZSBsb3dlciAzIGJpdHMgaW4gb3JkZXIgdG8gZGlzdGluZ3Vpc2gKKwkJCQkgKiAnY29uZmlnJyBmcm9tICdUT01PWU9fQ09ORklHX1VTRV9ERUFGVUxUJy4KKwkJCQkgKi8KKwkJCQljb25maWcgPSAoY29uZmlnICYgfjcpIHwgbW9kZTsKKwl9CisJaWYgKGkgPCBUT01PWU9fTUFYX01BQ19JTkRFWCArIFRPTU9ZT19NQVhfTUFDX0NBVEVHT1JZX0lOREVYKQorCQlwcm9maWxlLT5jb25maWdbaV0gPSBjb25maWc7CisJZWxzZSBpZiAoY29uZmlnICE9IFRPTU9ZT19DT05GSUdfVVNFX0RFRkFVTFQpCisJCXByb2ZpbGUtPmRlZmF1bHRfY29uZmlnID0gY29uZmlnOworCXJldHVybiAwOworfQorCisvKioKKyAqIHRvbW95b193cml0ZV9wcm9maWxlIC0gV3JpdGUgcHJvZmlsZSB0YWJsZS4KICAqCiAgKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgogICoKQEAgLTk4MCwxNTMgKzQzMCwxNjUgQEAKIHsKIAljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVfYnVmOwogCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKKwlib29sIHVzZV9kZWZhdWx0ID0gZmFsc2U7CiAJY2hhciAqY3A7CiAJc3RydWN0IHRvbW95b19wcm9maWxlICpwcm9maWxlOwotCXVuc2lnbmVkIGxvbmcgbnVtOwotCi0JY3AgPSBzdHJjaHIoZGF0YSwgJy0nKTsKLQlpZiAoY3ApCi0JCSpjcCA9ICdcMCc7Ci0JaWYgKHN0cmljdF9zdHJ0b3VsKGRhdGEsIDEwLCAmbnVtKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNwKQorCWlmIChzc2NhbmYoZGF0YSwgIlBST0ZJTEVfVkVSU0lPTj0ldSIsICZ0b21veW9fcHJvZmlsZV92ZXJzaW9uKSA9PSAxKQorCQlyZXR1cm4gMDsKKwlpID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmNwLCAxMCk7CisJaWYgKGRhdGEgPT0gY3ApIHsKKwkJcHJvZmlsZSA9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlOworCX0gZWxzZSB7CisJCWlmICgqY3AgIT0gJy0nKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWRhdGEgPSBjcCArIDE7Ci0JcHJvZmlsZSA9IHRvbW95b19maW5kX29yX2Fzc2lnbl9uZXdfcHJvZmlsZShudW0pOwotCWlmICghcHJvZmlsZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXByb2ZpbGUgPSB0b21veW9fYXNzaWduX3Byb2ZpbGUoaSk7CisJCWlmICghcHJvZmlsZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAljcCA9IHN0cmNocihkYXRhLCAnPScpOwogCWlmICghY3ApCiAJCXJldHVybiAtRUlOVkFMOwotCSpjcCA9ICdcMCc7CisJKmNwKysgPSAnXDAnOworCWlmIChwcm9maWxlICE9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlKQorCQl1c2VfZGVmYXVsdCA9IHN0cnN0cihjcCwgInVzZV9kZWZhdWx0IikgIT0gTlVMTDsKKwlpZiAodG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsICJQUkVGRVJFTkNFOjoiKSkgeworCQl0b21veW9fc2V0X3ByZWYoZGF0YSwgY3AsIHVzZV9kZWZhdWx0LCBwcm9maWxlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9maWxlID09ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXN0cmNtcChkYXRhLCAiQ09NTUVOVCIpKSB7CiAJCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpvbGRfY29tbWVudCA9IHByb2ZpbGUtPmNvbW1lbnQ7Ci0JCXByb2ZpbGUtPmNvbW1lbnQgPSB0b21veW9fZ2V0X25hbWUoY3AgKyAxKTsKKwkJcHJvZmlsZS0+Y29tbWVudCA9IHRvbW95b19nZXRfbmFtZShjcCk7CiAJCXRvbW95b19wdXRfbmFtZShvbGRfY29tbWVudCk7CiAJCXJldHVybiAwOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgVE9NT1lPX01BWF9DT05UUk9MX0lOREVYOyBpKyspIHsKLQkJaWYgKHN0cmNtcChkYXRhLCB0b21veW9fY29udHJvbF9hcnJheVtpXS5rZXl3b3JkKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3NjYW5mKGNwICsgMSwgIiV1IiwgJnZhbHVlKSAhPSAxKSB7Ci0JCQlpbnQgajsKLQkJCWNvbnN0IGNoYXIgKiptb2RlczsKLQkJCXN3aXRjaCAoaSkgewotCQkJY2FzZSBUT01PWU9fVkVSQk9TRToKLQkJCQltb2RlcyA9IHRvbW95b19tb2RlXzI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCW1vZGVzID0gdG9tb3lvX21vZGVfNDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQlpZiAoc3RyY21wKGNwICsgMSwgbW9kZXNbal0pKQotCQkJCQljb250aW51ZTsKLQkJCQl2YWx1ZSA9IGo7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaiA9PSA0KQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9IGVsc2UgaWYgKHZhbHVlID4gdG9tb3lvX2NvbnRyb2xfYXJyYXlbaV0ubWF4X3ZhbHVlKSB7Ci0JCQl2YWx1ZSA9IHRvbW95b19jb250cm9sX2FycmF5W2ldLm1heF92YWx1ZTsKLQkJfQotCQlwcm9maWxlLT52YWx1ZVtpXSA9IHZhbHVlOwotCQlyZXR1cm4gMDsKKwlyZXR1cm4gdG9tb3lvX3NldF9tb2RlKGRhdGEsIGNwLCB1c2VfZGVmYXVsdCwgcHJvZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRvbW95b19wcmludF9wcmVmZXJlbmNlKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAorCQkJCSAgICBjb25zdCBpbnQgaWR4KQoreworCXN0cnVjdCB0b21veW9fcHJlZmVyZW5jZSAqcHJlZiA9ICZ0b21veW9fZGVmYXVsdF9wcm9maWxlLnByZWZlcmVuY2U7CisJY29uc3Qgc3RydWN0IHRvbW95b19wcm9maWxlICpwcm9maWxlID0gaWR4ID49IDAgPworCQl0b21veW9fcHJvZmlsZV9wdHJbaWR4XSA6IE5VTEw7CisJY2hhciBidWZmZXJbMTZdID0gIiI7CisJaWYgKHByb2ZpbGUpIHsKKwkJYnVmZmVyW3NpemVvZihidWZmZXIpIC0gMV0gPSAnXDAnOworCQlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSwgIiV1LSIsIGlkeCk7CiAJfQotCXJldHVybiAtRUlOVkFMOworCWlmIChwcm9maWxlKSB7CisJCXByZWYgPSBwcm9maWxlLT5sZWFybmluZzsKKwkJaWYgKHByZWYgPT0gJnRvbW95b19kZWZhdWx0X3Byb2ZpbGUucHJlZmVyZW5jZSkKKwkJCWdvdG8gc2tpcDE7CisJfQorCXRvbW95b19pb19wcmludGYoaGVhZCwgIiVzUFJFRkVSRU5DRTo6JXM9eyAiCisJCQkgInZlcmJvc2U9JXMgbWF4X2VudHJ5PSV1IH1cbiIsCisJCQkgYnVmZmVyLCAibGVhcm5pbmciLAorCQkJIHRvbW95b195ZXNubyhwcmVmLT5sZWFybmluZ192ZXJib3NlKSwKKwkJCSBwcmVmLT5sZWFybmluZ19tYXhfZW50cnkpOworIHNraXAxOgorCWlmIChwcm9maWxlKSB7CisJCXByZWYgPSBwcm9maWxlLT5wZXJtaXNzaXZlOworCQlpZiAocHJlZiA9PSAmdG9tb3lvX2RlZmF1bHRfcHJvZmlsZS5wcmVmZXJlbmNlKQorCQkJZ290byBza2lwMjsKKwl9CisJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXNQUkVGRVJFTkNFOjolcz17IHZlcmJvc2U9JXMgfVxuIiwKKwkJCSBidWZmZXIsICJwZXJtaXNzaXZlIiwKKwkJCSB0b21veW9feWVzbm8ocHJlZi0+cGVybWlzc2l2ZV92ZXJib3NlKSk7Cisgc2tpcDI6CisJaWYgKHByb2ZpbGUpIHsKKwkJcHJlZiA9IHByb2ZpbGUtPmVuZm9yY2luZzsKKwkJaWYgKHByZWYgPT0gJnRvbW95b19kZWZhdWx0X3Byb2ZpbGUucHJlZmVyZW5jZSkKKwkJCXJldHVybjsKKwl9CisJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXNQUkVGRVJFTkNFOjolcz17IHZlcmJvc2U9JXMgfVxuIiwKKwkJCSBidWZmZXIsICJlbmZvcmNpbmciLAorCQkJIHRvbW95b195ZXNubyhwcmVmLT5lbmZvcmNpbmdfdmVyYm9zZSkpOworfQorCitzdGF0aWMgdm9pZCB0b21veW9fcHJpbnRfY29uZmlnKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLCBjb25zdCB1OCBjb25maWcpCit7CisJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiPXsgbW9kZT0lcyB9XG4iLCB0b21veW9fbW9kZVtjb25maWcgJiAzXSk7CiB9CiAKIC8qKgotICogdG9tb3lvX3JlYWRfcHJvZmlsZSAtIFJlYWQgZnJvbSBwcm9maWxlIHRhYmxlLgorICogdG9tb3lvX3JlYWRfcHJvZmlsZSAtIFJlYWQgcHJvZmlsZSB0YWJsZS4KICAqCiAgKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgotICoKLSAqIFJldHVybnMgMC4KICAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF9wcm9maWxlKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQorc3RhdGljIHZvaWQgdG9tb3lvX3JlYWRfcHJvZmlsZShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKIHsKLQlzdGF0aWMgY29uc3QgaW50IHRvdGFsID0gVE9NT1lPX01BWF9DT05UUk9MX0lOREVYICsgMTsKLQlpbnQgc3RlcDsKLQotCWlmIChoZWFkLT5yZWFkX2VvZikKLQkJcmV0dXJuIDA7Ci0JZm9yIChzdGVwID0gaGVhZC0+cmVhZF9zdGVwOyBzdGVwIDwgVE9NT1lPX01BWF9QUk9GSUxFUyAqIHRvdGFsOwotCSAgICAgc3RlcCsrKSB7Ci0JCWNvbnN0IHU4IGluZGV4ID0gc3RlcCAvIHRvdGFsOwotCQl1OCB0eXBlID0gc3RlcCAlIHRvdGFsOwotCQljb25zdCBzdHJ1Y3QgdG9tb3lvX3Byb2ZpbGUgKnByb2ZpbGUKLQkJCT0gdG9tb3lvX3Byb2ZpbGVfcHRyW2luZGV4XTsKLQkJaGVhZC0+cmVhZF9zdGVwID0gc3RlcDsKLQkJaWYgKCFwcm9maWxlKQotCQkJY29udGludWU7Ci0JCWlmICghdHlwZSkgeyAvKiBQcmludCBwcm9maWxlJyBjb21tZW50IHRhZy4gKi8KLQkJCWlmICghdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXUtQ09NTUVOVD0lc1xuIiwKLQkJCQkJICAgICAgaW5kZXgsIHByb2ZpbGUtPmNvbW1lbnQgPwotCQkJCQkgICAgICBwcm9maWxlLT5jb21tZW50LT5uYW1lIDogIiIpKQorCXU4IGluZGV4OworCWNvbnN0IHN0cnVjdCB0b21veW9fcHJvZmlsZSAqcHJvZmlsZTsKKyBuZXh0OgorCWluZGV4ID0gaGVhZC0+ci5pbmRleDsKKwlwcm9maWxlID0gdG9tb3lvX3Byb2ZpbGVfcHRyW2luZGV4XTsKKwlzd2l0Y2ggKGhlYWQtPnIuc3RlcCkgeworCWNhc2UgMDoKKwkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiUFJPRklMRV9WRVJTSU9OPSVzXG4iLCAiMjAwOTA5MDMiKTsKKwkJdG9tb3lvX3ByaW50X3ByZWZlcmVuY2UoaGVhZCwgLTEpOworCQloZWFkLT5yLnN0ZXArKzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmb3IgKCA7IGhlYWQtPnIuaW5kZXggPCBUT01PWU9fTUFYX1BST0ZJTEVTOworCQkgICAgICBoZWFkLT5yLmluZGV4KyspCisJCQlpZiAodG9tb3lvX3Byb2ZpbGVfcHRyW2hlYWQtPnIuaW5kZXhdKQogCQkJCWJyZWFrOwotCQkJY29udGludWU7CisJCWlmIChoZWFkLT5yLmluZGV4ID09IFRPTU9ZT19NQVhfUFJPRklMRVMpCisJCQlyZXR1cm47CisJCWhlYWQtPnIuc3RlcCsrOworCQlicmVhazsKKwljYXNlIDI6CisJCXsKKwkJCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpjb21tZW50ID0KKwkJCQlwcm9maWxlLT5jb21tZW50OworCQkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXUtQ09NTUVOVD0iLCBpbmRleCk7CisJCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCBjb21tZW50ID8gY29tbWVudC0+bmFtZSA6ICIiKTsKKwkJCXRvbW95b19zZXRfbGYoaGVhZCk7CisJCQloZWFkLT5yLnN0ZXArKzsKIAkJfQotCQl0eXBlLS07Ci0JCWlmICh0eXBlIDwgVE9NT1lPX01BWF9DT05UUk9MX0lOREVYKSB7Ci0JCQljb25zdCB1bnNpZ25lZCBpbnQgdmFsdWUgPSBwcm9maWxlLT52YWx1ZVt0eXBlXTsKLQkJCWNvbnN0IGNoYXIgKiptb2RlcyA9IE5VTEw7Ci0JCQljb25zdCBjaGFyICprZXl3b3JkCi0JCQkJPSB0b21veW9fY29udHJvbF9hcnJheVt0eXBlXS5rZXl3b3JkOwotCQkJc3dpdGNoICh0b21veW9fY29udHJvbF9hcnJheVt0eXBlXS5tYXhfdmFsdWUpIHsKLQkJCWNhc2UgMzoKLQkJCQltb2RlcyA9IHRvbW95b19tb2RlXzQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJbW9kZXMgPSB0b21veW9fbW9kZV8yOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG1vZGVzKSB7Ci0JCQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsICIldS0lcz0lc1xuIiwgaW5kZXgsCi0JCQkJCQkgICAgICBrZXl3b3JkLCBtb2Rlc1t2YWx1ZV0pKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsICIldS0lcz0ldVxuIiwgaW5kZXgsCi0JCQkJCQkgICAgICBrZXl3b3JkLCB2YWx1ZSkpCi0JCQkJCWJyZWFrOwotCQkJfQorCQlicmVhazsKKwljYXNlIDM6CisJCXsKKwkJCXRvbW95b19pb19wcmludGYoaGVhZCwgIiV1LSVzIiwgaW5kZXgsICJDT05GSUciKTsKKwkJCXRvbW95b19wcmludF9jb25maWcoaGVhZCwgcHJvZmlsZS0+ZGVmYXVsdF9jb25maWcpOworCQkJaGVhZC0+ci5iaXQgPSAwOworCQkJaGVhZC0+ci5zdGVwKys7CiAJCX0KKwkJYnJlYWs7CisJY2FzZSA0OgorCQlmb3IgKCA7IGhlYWQtPnIuYml0IDwgVE9NT1lPX01BWF9NQUNfSU5ERVgKKwkJCSAgICAgICsgVE9NT1lPX01BWF9NQUNfQ0FURUdPUllfSU5ERVg7IGhlYWQtPnIuYml0KyspIHsKKwkJCWNvbnN0IHU4IGkgPSBoZWFkLT5yLmJpdDsKKwkJCWNvbnN0IHU4IGNvbmZpZyA9IHByb2ZpbGUtPmNvbmZpZ1tpXTsKKwkJCWlmIChjb25maWcgPT0gVE9NT1lPX0NPTkZJR19VU0VfREVGQVVMVCkKKwkJCQljb250aW51ZTsKKwkJCXRvbW95b19pb19wcmludGYoaGVhZCwgIiV1LSVzJXMiLCBpbmRleCwgIkNPTkZJRzo6IiwKKwkJCQkJIHRvbW95b19tYWNfa2V5d29yZHNbaV0pOworCQkJdG9tb3lvX3ByaW50X2NvbmZpZyhoZWFkLCBjb25maWcpOworCQkJaGVhZC0+ci5iaXQrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChoZWFkLT5yLmJpdCA9PSBUT01PWU9fTUFYX01BQ19JTkRFWAorCQkgICAgKyBUT01PWU9fTUFYX01BQ19DQVRFR09SWV9JTkRFWCkgeworCQkJdG9tb3lvX3ByaW50X3ByZWZlcmVuY2UoaGVhZCwgaW5kZXgpOworCQkJaGVhZC0+ci5pbmRleCsrOworCQkJaGVhZC0+ci5zdGVwID0gMTsKKwkJfQorCQlicmVhazsKIAl9Ci0JaWYgKHN0ZXAgPT0gVE9NT1lPX01BWF9QUk9GSUxFUyAqIHRvdGFsKQotCQloZWFkLT5yZWFkX2VvZiA9IHRydWU7Ci0JcmV0dXJuIDA7CisJaWYgKHRvbW95b19mbHVzaChoZWFkKSkKKwkJZ290byBuZXh0OwogfQogCi0vKgotICogdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBsaXN0IG9mIGRvbWFpbm5hbWVzIG9yCi0gKiBwcm9ncmFtcyB3aGljaCBhcmUgcGVybWl0dGVkIHRvIG1vZGlmeSBjb25maWd1cmF0aW9uIHZpYQotICogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCi0gKgotICogQW4gZW50cnkgaXMgYWRkZWQgYnkKLSAqCi0gKiAjIGVjaG8gJzxrZXJuZWw+IC9zYmluL21pbmdldHR5IC9iaW4vbG9naW4gL2Jpbi9iYXNoJyA+IFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyCi0gKiAgKGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgYnkgYSBkb21haW5uYW1lKQotICoKLSAqICBvcgotICoKLSAqICMgZWNobyAnL3Vzci9saWIvY2NzL2VkaXRwb2xpY3knID4gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL21hbmFnZXIKLSAqICAoaWYgeW91IHdhbnQgdG8gc3BlY2lmeSBieSBhIHByb2dyYW0ncyBsb2NhdGlvbikKLSAqCi0gKiBhbmQgaXMgZGVsZXRlZCBieQotICoKLSAqICMgZWNobyAnZGVsZXRlIDxrZXJuZWw+IC9zYmluL21pbmdldHR5IC9iaW4vbG9naW4gL2Jpbi9iYXNoJyA+IFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyCi0gKgotICogIG9yCi0gKgotICogIyBlY2hvICdkZWxldGUgL3Vzci9saWIvY2NzL2VkaXRwb2xpY3knID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL21hbmFnZXIKLSAqCi0gKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQotICoKLSAqICMgY2F0IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyCi0gKi8KLUxJU1RfSEVBRCh0b21veW9fcG9saWN5X21hbmFnZXJfbGlzdCk7CitzdGF0aWMgYm9vbCB0b21veW9fc2FtZV9tYW5hZ2VyKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmEsCisJCQkJY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGEsIHN0cnVjdCB0b21veW9fbWFuYWdlciwgaGVhZCktPm1hbmFnZXIgPT0KKwkJY29udGFpbmVyX29mKGIsIHN0cnVjdCB0b21veW9fbWFuYWdlciwgaGVhZCktPm1hbmFnZXI7Cit9CiAKIC8qKgogICogdG9tb3lvX3VwZGF0ZV9tYW5hZ2VyX2VudHJ5IC0gQWRkIGEgbWFuYWdlciBlbnRyeS4KQEAgLTExNDEsNDcgKzYwMywyOSBAQAogc3RhdGljIGludCB0b21veW9fdXBkYXRlX21hbmFnZXJfZW50cnkoY29uc3QgY2hhciAqbWFuYWdlciwKIAkJCQkgICAgICAgY29uc3QgYm9vbCBpc19kZWxldGUpCiB7Ci0Jc3RydWN0IHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSAqcHRyOwotCXN0cnVjdCB0b21veW9fcG9saWN5X21hbmFnZXJfZW50cnkgZSA9IHsgfTsKLQlpbnQgZXJyb3IgPSBpc19kZWxldGUgPyAtRU5PRU5UIDogLUVOT01FTTsKKwlzdHJ1Y3QgdG9tb3lvX21hbmFnZXIgZSA9IHsgfTsKKwlpbnQgZXJyb3I7CiAKLQlpZiAodG9tb3lvX2lzX2RvbWFpbl9kZWYobWFuYWdlcikpIHsKLQkJaWYgKCF0b21veW9faXNfY29ycmVjdF9kb21haW4obWFuYWdlcikpCisJaWYgKHRvbW95b19kb21haW5fZGVmKG1hbmFnZXIpKSB7CisJCWlmICghdG9tb3lvX2NvcnJlY3RfZG9tYWluKG1hbmFnZXIpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWUuaXNfZG9tYWluID0gdHJ1ZTsKIAl9IGVsc2UgewotCQlpZiAoIXRvbW95b19pc19jb3JyZWN0X3BhdGgobWFuYWdlciwgMSwgLTEsIC0xKSkKKwkJaWYgKCF0b21veW9fY29ycmVjdF9wYXRoKG1hbmFnZXIpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWUubWFuYWdlciA9IHRvbW95b19nZXRfbmFtZShtYW5hZ2VyKTsKIAlpZiAoIWUubWFuYWdlcikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHB0ci0+bWFuYWdlciAhPSBlLm1hbmFnZXIpCi0JCQljb250aW51ZTsKLQkJcHRyLT5pc19kZWxldGVkID0gaXNfZGVsZXRlOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIWlzX2RlbGV0ZSAmJiBlcnJvcikgewotCQlzdHJ1Y3QgdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2VudHJ5ICplbnRyeSA9Ci0JCQl0b21veW9fY29tbWl0X29rKCZlLCBzaXplb2YoZSkpOwotCQlpZiAoZW50cnkpIHsKLQkJCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+bGlzdCwKLQkJCQkJICAmdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QpOwotCQkJZXJyb3IgPSAwOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmdG9tb3lvX3BvbGljeV9sb2NrKTsKLSBvdXQ6CisJZXJyb3IgPSB0b21veW9fdXBkYXRlX3BvbGljeSgmZS5oZWFkLCBzaXplb2YoZSksIGlzX2RlbGV0ZSwKKwkJCQkgICAgICZ0b21veW9fcG9saWN5X2xpc3RbVE9NT1lPX0lEX01BTkFHRVJdLAorCQkJCSAgICAgdG9tb3lvX3NhbWVfbWFuYWdlcik7CiAJdG9tb3lvX3B1dF9uYW1lKGUubWFuYWdlcik7CiAJcmV0dXJuIGVycm9yOwogfQogCiAvKioKLSAqIHRvbW95b193cml0ZV9tYW5hZ2VyX3BvbGljeSAtIFdyaXRlIG1hbmFnZXIgcG9saWN5LgorICogdG9tb3lvX3dyaXRlX21hbmFnZXIgLSBXcml0ZSBtYW5hZ2VyIHBvbGljeS4KICAqCiAgKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgogICoKQEAgLTExODksNyArNjMzLDcgQEAKICAqCiAgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCi1zdGF0aWMgaW50IHRvbW95b193cml0ZV9tYW5hZ2VyX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3N0YXRpYyBpbnQgdG9tb3lvX3dyaXRlX21hbmFnZXIoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCiB7CiAJY2hhciAqZGF0YSA9IGhlYWQtPndyaXRlX2J1ZjsKIAlib29sIGlzX2RlbGV0ZSA9IHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9ERUxFVEUpOwpAQCAtMTIwMiw0NyArNjQ2LDQxIEBACiB9CiAKIC8qKgotICogdG9tb3lvX3JlYWRfbWFuYWdlcl9wb2xpY3kgLSBSZWFkIG1hbmFnZXIgcG9saWN5LgorICogdG9tb3lvX3JlYWRfbWFuYWdlciAtIFJlYWQgbWFuYWdlciBwb2xpY3kuCiAgKgogICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KICAqCi0gKiBSZXR1cm5zIDAuCi0gKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF9tYW5hZ2VyX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3N0YXRpYyB2b2lkIHRvbW95b19yZWFkX21hbmFnZXIoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCWJvb2wgZG9uZSA9IHRydWU7Ci0KLQlpZiAoaGVhZC0+cmVhZF9lb2YpCi0JCXJldHVybiAwOwotCWxpc3RfZm9yX2VhY2hfY29va2llKHBvcywgaGVhZC0+cmVhZF92YXIyLAotCQkJICAgICAmdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QpIHsKLQkJc3RydWN0IHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSAqcHRyOwotCQlwdHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSwKLQkJCQkgbGlzdCk7Ci0JCWlmIChwdHItPmlzX2RlbGV0ZWQpCisJaWYgKGhlYWQtPnIuZW9mKQorCQlyZXR1cm47CisJbGlzdF9mb3JfZWFjaF9jb29raWUoaGVhZC0+ci5hY2wsCisJCQkgICAgICZ0b21veW9fcG9saWN5X2xpc3RbVE9NT1lPX0lEX01BTkFHRVJdKSB7CisJCXN0cnVjdCB0b21veW9fbWFuYWdlciAqcHRyID0KKwkJCWxpc3RfZW50cnkoaGVhZC0+ci5hY2wsIHR5cGVvZigqcHRyKSwgaGVhZC5saXN0KTsKKwkJaWYgKHB0ci0+aGVhZC5pc19kZWxldGVkKQogCQkJY29udGludWU7Ci0JCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsICIlc1xuIiwgcHRyLT5tYW5hZ2VyLT5uYW1lKTsKLQkJaWYgKCFkb25lKQotCQkJYnJlYWs7CisJCWlmICghdG9tb3lvX2ZsdXNoKGhlYWQpKQorCQkJcmV0dXJuOworCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCBwdHItPm1hbmFnZXItPm5hbWUpOworCQl0b21veW9fc2V0X2xmKGhlYWQpOwogCX0KLQloZWFkLT5yZWFkX2VvZiA9IGRvbmU7Ci0JcmV0dXJuIDA7CisJaGVhZC0+ci5lb2YgPSB0cnVlOwogfQogCiAvKioKLSAqIHRvbW95b19pc19wb2xpY3lfbWFuYWdlciAtIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBhIHBvbGljeSBtYW5hZ2VyLgorICogdG9tb3lvX21hbmFnZXIgLSBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYSBwb2xpY3kgbWFuYWdlci4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBwZXJtaXR0ZWQgdG8gbW9kaWZ5IHBvbGljeQogICogdmlhIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgogICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLXN0YXRpYyBib29sIHRvbW95b19pc19wb2xpY3lfbWFuYWdlcih2b2lkKQorc3RhdGljIGJvb2wgdG9tb3lvX21hbmFnZXIodm9pZCkKIHsKLQlzdHJ1Y3QgdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2VudHJ5ICpwdHI7CisJc3RydWN0IHRvbW95b19tYW5hZ2VyICpwdHI7CiAJY29uc3QgY2hhciAqZXhlOwogCWNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGN1cnJlbnQ7CiAJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmRvbWFpbm5hbWUgPSB0b21veW9fZG9tYWluKCktPmRvbWFpbm5hbWU7CkBAIC0xMjUyLDggKzY5MCw5IEBACiAJCXJldHVybiB0cnVlOwogCWlmICghdG9tb3lvX21hbmFnZV9ieV9ub25fcm9vdCAmJiAodGFzay0+Y3JlZC0+dWlkIHx8IHRhc2stPmNyZWQtPmV1aWQpKQogCQlyZXR1cm4gZmFsc2U7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFwdHItPmlzX2RlbGV0ZWQgJiYgcHRyLT5pc19kb21haW4KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fcG9saWN5X2xpc3RbVE9NT1lPX0lEX01BTkFHRVJdLAorCQkJCWhlYWQubGlzdCkgeworCQlpZiAoIXB0ci0+aGVhZC5pc19kZWxldGVkICYmIHB0ci0+aXNfZG9tYWluCiAJCSAgICAmJiAhdG9tb3lvX3BhdGhjbXAoZG9tYWlubmFtZSwgcHRyLT5tYW5hZ2VyKSkgewogCQkJZm91bmQgPSB0cnVlOwogCQkJYnJlYWs7CkBAIC0xMjY0LDggKzcwMyw5IEBACiAJZXhlID0gdG9tb3lvX2dldF9leGUoKTsKIAlpZiAoIWV4ZSkKIAkJcmV0dXJuIGZhbHNlOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19wb2xpY3lfbWFuYWdlcl9saXN0LCBsaXN0KSB7Ci0JCWlmICghcHRyLT5pc19kZWxldGVkICYmICFwdHItPmlzX2RvbWFpbgorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19wb2xpY3lfbGlzdFtUT01PWU9fSURfTUFOQUdFUl0sCisJCQkJaGVhZC5saXN0KSB7CisJCWlmICghcHRyLT5oZWFkLmlzX2RlbGV0ZWQgJiYgIXB0ci0+aXNfZG9tYWluCiAJCSAgICAmJiAhc3RyY21wKGV4ZSwgcHRyLT5tYW5hZ2VyLT5uYW1lKSkgewogCQkJZm91bmQgPSB0cnVlOwogCQkJYnJlYWs7CkBAIC0xMjg1LDcgKzcyNSw3IEBACiB9CiAKIC8qKgotICogdG9tb3lvX2lzX3NlbGVjdF9vbmUgLSBQYXJzZSBzZWxlY3QgY29tbWFuZC4KKyAqIHRvbW95b19zZWxlY3Rfb25lIC0gUGFyc2Ugc2VsZWN0IGNvbW1hbmQuCiAgKgogICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KICAqIEBkYXRhOiBTdHJpbmcgdG8gcGFyc2UuCkBAIC0xMjk0LDIzICs3MzQsMzEgQEAKICAqCiAgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCi1zdGF0aWMgYm9vbCB0b21veW9faXNfc2VsZWN0X29uZShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCwKLQkJCQkgY29uc3QgY2hhciAqZGF0YSkKK3N0YXRpYyBib29sIHRvbW95b19zZWxlY3Rfb25lKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLCBjb25zdCBjaGFyICpkYXRhKQogewogCXVuc2lnbmVkIGludCBwaWQ7CiAJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluID0gTlVMTDsKKwlib29sIGdsb2JhbF9waWQgPSBmYWxzZTsKIAotCWlmIChzc2NhbmYoZGF0YSwgInBpZD0ldSIsICZwaWQpID09IDEpIHsKKwlpZiAoIXN0cmNtcChkYXRhLCAiYWxsb3dfZXhlY3V0ZSIpKSB7CisJCWhlYWQtPnIucHJpbnRfZXhlY3V0ZV9vbmx5ID0gdHJ1ZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWlmIChzc2NhbmYoZGF0YSwgInBpZD0ldSIsICZwaWQpID09IDEgfHwKKwkgICAgKGdsb2JhbF9waWQgPSB0cnVlLCBzc2NhbmYoZGF0YSwgImdsb2JhbC1waWQ9JXUiLCAmcGlkKSA9PSAxKSkgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CisJCWlmIChnbG9iYWxfcGlkKQorCQkJcCA9IGZpbmRfdGFza19ieV9waWRfbnMocGlkLCAmaW5pdF9waWRfbnMpOworCQllbHNlCisJCQlwID0gZmluZF90YXNrX2J5X3ZwaWQocGlkKTsKIAkJaWYgKHApCiAJCQlkb21haW4gPSB0b21veW9fcmVhbF9kb21haW4ocCk7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfSBlbHNlIGlmICghc3RybmNtcChkYXRhLCAiZG9tYWluPSIsIDcpKSB7Ci0JCWlmICh0b21veW9faXNfZG9tYWluX2RlZihkYXRhICsgNykpCisJCWlmICh0b21veW9fZG9tYWluX2RlZihkYXRhICsgNykpCiAJCQlkb21haW4gPSB0b21veW9fZmluZF9kb21haW4oZGF0YSArIDcpOwogCX0gZWxzZQogCQlyZXR1cm4gZmFsc2U7CkBAIC0xMzE4LDI0ICs3NjYsMTMgQEAKIAkvKiBBY2Nlc3NpbmcgcmVhZF9idWYgaXMgc2FmZSBiZWNhdXNlIGhlYWQtPmlvX3NlbSBpcyBoZWxkLiAqLwogCWlmICghaGVhZC0+cmVhZF9idWYpCiAJCXJldHVybiB0cnVlOyAvKiBEbyBub3RoaW5nIGlmIG9wZW4oT19XUk9OTFkpLiAqLwotCWhlYWQtPnJlYWRfYXZhaWwgPSAwOworCW1lbXNldCgmaGVhZC0+ciwgMCwgc2l6ZW9mKGhlYWQtPnIpKTsKKwloZWFkLT5yLnByaW50X3RoaXNfZG9tYWluX29ubHkgPSB0cnVlOworCWhlYWQtPnIuZW9mID0gIWRvbWFpbjsKKwloZWFkLT5yLmRvbWFpbiA9ICZkb21haW4tPmxpc3Q7CiAJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiIyBzZWxlY3QgJXNcbiIsIGRhdGEpOwotCWhlYWQtPnJlYWRfc2luZ2xlX2RvbWFpbiA9IHRydWU7Ci0JaGVhZC0+cmVhZF9lb2YgPSAhZG9tYWluOwotCWlmIChkb21haW4pIHsKLQkJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZDsKLQkJaGVhZC0+cmVhZF92YXIxID0gTlVMTDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZCwgJnRvbW95b19kb21haW5fbGlzdCwgbGlzdCkgewotCQkJaWYgKGQgPT0gZG9tYWluKQotCQkJCWJyZWFrOwotCQkJaGVhZC0+cmVhZF92YXIxID0gJmQtPmxpc3Q7Ci0JCX0KLQkJaGVhZC0+cmVhZF92YXIyID0gTlVMTDsKLQkJaGVhZC0+cmVhZF9iaXQgPSAwOwotCQloZWFkLT5yZWFkX3N0ZXAgPSAwOwotCQlpZiAoZG9tYWluLT5pc19kZWxldGVkKQotCQkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiIyBUaGlzIGlzIGEgZGVsZXRlZCBkb21haW4uXG4iKTsKLQl9CisJaWYgKGRvbWFpbiAmJiBkb21haW4tPmlzX2RlbGV0ZWQpCisJCXRvbW95b19pb19wcmludGYoaGVhZCwgIiMgVGhpcyBpcyBhIGRlbGV0ZWQgZG9tYWluLlxuIik7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEzNzMsNyArODEwLDcgQEAKIH0KIAogLyoqCi0gKiB0b21veW9fd3JpdGVfZG9tYWluX3BvbGljeSAtIFdyaXRlIGRvbWFpbiBwb2xpY3kuCisgKiB0b21veW9fd3JpdGVfZG9tYWluMiAtIFdyaXRlIGRvbWFpbiBwb2xpY3kuCiAgKgogICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KICAqCkBAIC0xMzgxLDcgKzgxOCwyNCBAQAogICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3dyaXRlX2RvbWFpbl9wb2xpY3koc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCitzdGF0aWMgaW50IHRvbW95b193cml0ZV9kb21haW4yKGNoYXIgKmRhdGEsIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwKKwkJCQljb25zdCBib29sIGlzX2RlbGV0ZSkKK3sKKwlpZiAodG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsIFRPTU9ZT19LRVlXT1JEX0FMTE9XX01PVU5UKSkKKwkJcmV0dXJuIHRvbW95b193cml0ZV9tb3VudChkYXRhLCBkb21haW4sIGlzX2RlbGV0ZSk7CisJcmV0dXJuIHRvbW95b193cml0ZV9maWxlKGRhdGEsIGRvbWFpbiwgaXNfZGVsZXRlKTsKK30KKworLyoqCisgKiB0b21veW9fd3JpdGVfZG9tYWluIC0gV3JpdGUgZG9tYWluIHBvbGljeS4KKyAqCisgKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKgorICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KKyAqLworc3RhdGljIGludCB0b21veW9fd3JpdGVfZG9tYWluKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQogewogCWNoYXIgKmRhdGEgPSBoZWFkLT53cml0ZV9idWY7CiAJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluID0gaGVhZC0+d3JpdGVfdmFyMTsKQEAgLTEzOTMsMTkgKzg0NywxOSBAQAogCQlpc19kZWxldGUgPSB0cnVlOwogCWVsc2UgaWYgKHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9TRUxFQ1QpKQogCQlpc19zZWxlY3QgPSB0cnVlOwotCWlmIChpc19zZWxlY3QgJiYgdG9tb3lvX2lzX3NlbGVjdF9vbmUoaGVhZCwgZGF0YSkpCisJaWYgKGlzX3NlbGVjdCAmJiB0b21veW9fc2VsZWN0X29uZShoZWFkLCBkYXRhKSkKIAkJcmV0dXJuIDA7CiAJLyogRG9uJ3QgYWxsb3cgdXBkYXRpbmcgcG9saWNpZXMgYnkgbm9uIG1hbmFnZXIgcHJvZ3JhbXMuICovCi0JaWYgKCF0b21veW9faXNfcG9saWN5X21hbmFnZXIoKSkKKwlpZiAoIXRvbW95b19tYW5hZ2VyKCkpCiAJCXJldHVybiAtRVBFUk07Ci0JaWYgKHRvbW95b19pc19kb21haW5fZGVmKGRhdGEpKSB7CisJaWYgKHRvbW95b19kb21haW5fZGVmKGRhdGEpKSB7CiAJCWRvbWFpbiA9IE5VTEw7CiAJCWlmIChpc19kZWxldGUpCiAJCQl0b21veW9fZGVsZXRlX2RvbWFpbihkYXRhKTsKIAkJZWxzZSBpZiAoaXNfc2VsZWN0KQogCQkJZG9tYWluID0gdG9tb3lvX2ZpbmRfZG9tYWluKGRhdGEpOwogCQllbHNlCi0JCQlkb21haW4gPSB0b21veW9fZmluZF9vcl9hc3NpZ25fbmV3X2RvbWFpbihkYXRhLCAwKTsKKwkJCWRvbWFpbiA9IHRvbW95b19hc3NpZ25fZG9tYWluKGRhdGEsIDApOwogCQloZWFkLT53cml0ZV92YXIxID0gZG9tYWluOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNDIyLDE3OSArODc2LDE5OCBAQAogCQlkb21haW4tPmlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZCA9ICFpc19kZWxldGU7CiAJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gdG9tb3lvX3dyaXRlX2ZpbGVfcG9saWN5KGRhdGEsIGRvbWFpbiwgaXNfZGVsZXRlKTsKKwlpZiAoIXN0cmNtcChkYXRhLCBUT01PWU9fS0VZV09SRF9RVU9UQV9FWENFRURFRCkpIHsKKwkJZG9tYWluLT5xdW90YV93YXJuZWQgPSAhaXNfZGVsZXRlOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoZGF0YSwgVE9NT1lPX0tFWVdPUkRfVFJBTlNJVElPTl9GQUlMRUQpKSB7CisJCWRvbWFpbi0+dHJhbnNpdGlvbl9mYWlsZWQgPSAhaXNfZGVsZXRlOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRvbW95b193cml0ZV9kb21haW4yKGRhdGEsIGRvbWFpbiwgaXNfZGVsZXRlKTsKIH0KIAogLyoqCi0gKiB0b21veW9fcHJpbnRfcGF0aF9hY2wgLSBQcmludCBhIHNpbmdsZSBwYXRoIEFDTCBlbnRyeS4KKyAqIHRvbW95b19mbnMgLSBGaW5kIG5leHQgc2V0IGJpdC4KICAqCi0gKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgotICogQHB0cjogIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcGF0aF9hY2wiLgorICogQHBlcm06IDggYml0cyB2YWx1ZS4KKyAqIEBiaXQ6ICBGaXJzdCBiaXQgdG8gZmluZC4KICAqCi0gKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICogUmV0dXJucyBuZXh0IG9uLWJpdCBvbiBzdWNjZXNzLCA4IG90aGVyd2lzZS4KICAqLwotc3RhdGljIGJvb2wgdG9tb3lvX3ByaW50X3BhdGhfYWNsKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAotCQkJCSAgc3RydWN0IHRvbW95b19wYXRoX2FjbCAqcHRyKQorc3RhdGljIHU4IHRvbW95b19mbnMoY29uc3QgdTggcGVybSwgdTggYml0KQogewotCWludCBwb3M7Ci0JdTggYml0OwotCWNvbnN0IHUzMiBwZXJtID0gcHRyLT5wZXJtIHwgKCgodTMyKSBwdHItPnBlcm1faGlnaCkgPDwgMTYpOwotCi0JZm9yIChiaXQgPSBoZWFkLT5yZWFkX2JpdDsgYml0IDwgVE9NT1lPX01BWF9QQVRIX09QRVJBVElPTjsgYml0KyspIHsKLQkJaWYgKCEocGVybSAmICgxIDw8IGJpdCkpKQotCQkJY29udGludWU7Ci0JCS8qIFByaW50ICJyZWFkL3dyaXRlIiBpbnN0ZWFkIG9mICJyZWFkIiBhbmQgIndyaXRlIi4gKi8KLQkJaWYgKChiaXQgPT0gVE9NT1lPX1RZUEVfUkVBRCB8fCBiaXQgPT0gVE9NT1lPX1RZUEVfV1JJVEUpCi0JCSAgICAmJiAocGVybSAmICgxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEUpKSkKLQkJCWNvbnRpbnVlOwotCQlwb3MgPSBoZWFkLT5yZWFkX2F2YWlsOwotCQlpZiAoIXRvbW95b19pb19wcmludGYoaGVhZCwgImFsbG93XyVzICIsCi0JCQkJICAgICAgdG9tb3lvX3BhdGgya2V5d29yZChiaXQpKSB8fAotCQkgICAgIXRvbW95b19wcmludF9uYW1lX3VuaW9uKGhlYWQsICZwdHItPm5hbWUpIHx8Ci0JCSAgICAhdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiXG4iKSkKLQkJCWdvdG8gb3V0OwotCX0KLQloZWFkLT5yZWFkX2JpdCA9IDA7Ci0JcmV0dXJuIHRydWU7Ci0gb3V0OgotCWhlYWQtPnJlYWRfYml0ID0gYml0OwotCWhlYWQtPnJlYWRfYXZhaWwgPSBwb3M7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIHRvbW95b19wcmludF9wYXRoMl9hY2wgLSBQcmludCBhIGRvdWJsZSBwYXRoIEFDTCBlbnRyeS4KLSAqCi0gKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgotICogQHB0cjogIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcGF0aDJfYWNsIi4KLSAqCi0gKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgYm9vbCB0b21veW9fcHJpbnRfcGF0aDJfYWNsKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAotCQkJCSAgIHN0cnVjdCB0b21veW9fcGF0aDJfYWNsICpwdHIpCi17Ci0JaW50IHBvczsKLQljb25zdCB1OCBwZXJtID0gcHRyLT5wZXJtOwotCXU4IGJpdDsKLQotCWZvciAoYml0ID0gaGVhZC0+cmVhZF9iaXQ7IGJpdCA8IFRPTU9ZT19NQVhfUEFUSDJfT1BFUkFUSU9OOyBiaXQrKykgewotCQlpZiAoIShwZXJtICYgKDEgPDwgYml0KSkpCi0JCQljb250aW51ZTsKLQkJcG9zID0gaGVhZC0+cmVhZF9hdmFpbDsKLQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsICJhbGxvd18lcyAiLAotCQkJCSAgICAgIHRvbW95b19wYXRoMjJrZXl3b3JkKGJpdCkpIHx8Ci0JCSAgICAhdG9tb3lvX3ByaW50X25hbWVfdW5pb24oaGVhZCwgJnB0ci0+bmFtZTEpIHx8Ci0JCSAgICAhdG9tb3lvX3ByaW50X25hbWVfdW5pb24oaGVhZCwgJnB0ci0+bmFtZTIpIHx8Ci0JCSAgICAhdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiXG4iKSkKLQkJCWdvdG8gb3V0OwotCX0KLQloZWFkLT5yZWFkX2JpdCA9IDA7Ci0JcmV0dXJuIHRydWU7Ci0gb3V0OgotCWhlYWQtPnJlYWRfYml0ID0gYml0OwotCWhlYWQtPnJlYWRfYXZhaWwgPSBwb3M7Ci0JcmV0dXJuIGZhbHNlOworCWZvciAoIDsgYml0IDwgODsgYml0KyspCisJCWlmIChwZXJtICYgKDEgPDwgYml0KSkKKwkJCWJyZWFrOworCXJldHVybiBiaXQ7CiB9CiAKIC8qKgogICogdG9tb3lvX3ByaW50X2VudHJ5IC0gUHJpbnQgYW4gQUNMIGVudHJ5LgogICoKICAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCi0gKiBAcHRyOiAgUG9pbnRlciB0byBhbiBBQ0wgZW50cnkuCisgKiBAYWNsOiAgUG9pbnRlciB0byBhbiBBQ0wgZW50cnkuCiAgKgogICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGJvb2wgdG9tb3lvX3ByaW50X2VudHJ5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLAotCQkJICAgICAgIHN0cnVjdCB0b21veW9fYWNsX2luZm8gKnB0cikKKwkJCSAgICAgICBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICphY2wpCiB7Ci0JY29uc3QgdTggYWNsX3R5cGUgPSBwdHItPnR5cGU7CisJY29uc3QgdTggYWNsX3R5cGUgPSBhY2wtPnR5cGU7CisJdTggYml0OwogCi0JaWYgKGFjbF90eXBlID09IFRPTU9ZT19UWVBFX1BBVEhfQUNMKSB7Ci0JCXN0cnVjdCB0b21veW9fcGF0aF9hY2wgKmFjbAotCQkJPSBjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgdG9tb3lvX3BhdGhfYWNsLCBoZWFkKTsKLQkJcmV0dXJuIHRvbW95b19wcmludF9wYXRoX2FjbChoZWFkLCBhY2wpOworCWlmIChhY2wtPmlzX2RlbGV0ZWQpCisJCXJldHVybiB0cnVlOworIG5leHQ6CisJYml0ID0gaGVhZC0+ci5iaXQ7CisJaWYgKCF0b21veW9fZmx1c2goaGVhZCkpCisJCXJldHVybiBmYWxzZTsKKwllbHNlIGlmIChhY2xfdHlwZSA9PSBUT01PWU9fVFlQRV9QQVRIX0FDTCkgeworCQlzdHJ1Y3QgdG9tb3lvX3BhdGhfYWNsICpwdHIgPQorCQkJY29udGFpbmVyX29mKGFjbCwgdHlwZW9mKCpwdHIpLCBoZWFkKTsKKwkJY29uc3QgdTE2IHBlcm0gPSBwdHItPnBlcm07CisJCWZvciAoIDsgYml0IDwgVE9NT1lPX01BWF9QQVRIX09QRVJBVElPTjsgYml0KyspIHsKKwkJCWlmICghKHBlcm0gJiAoMSA8PCBiaXQpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChoZWFkLT5yLnByaW50X2V4ZWN1dGVfb25seSAmJgorCQkJICAgIGJpdCAhPSBUT01PWU9fVFlQRV9FWEVDVVRFKQorCQkJCWNvbnRpbnVlOworCQkJLyogUHJpbnQgInJlYWQvd3JpdGUiIGluc3RlYWQgb2YgInJlYWQiIGFuZCAid3JpdGUiLiAqLworCQkJaWYgKChiaXQgPT0gVE9NT1lPX1RZUEVfUkVBRCB8fAorCQkJICAgICBiaXQgPT0gVE9NT1lPX1RZUEVfV1JJVEUpCisJCQkgICAgJiYgKHBlcm0gJiAoMSA8PCBUT01PWU9fVFlQRV9SRUFEX1dSSVRFKSkpCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYml0ID49IFRPTU9ZT19NQVhfUEFUSF9PUEVSQVRJT04pCisJCQlnb3RvIGRvbmU7CisJCXRvbW95b19pb19wcmludGYoaGVhZCwgImFsbG93XyVzIiwgdG9tb3lvX3BhdGhfa2V5d29yZFtiaXRdKTsKKwkJdG9tb3lvX3ByaW50X25hbWVfdW5pb24oaGVhZCwgJnB0ci0+bmFtZSk7CisJfSBlbHNlIGlmIChoZWFkLT5yLnByaW50X2V4ZWN1dGVfb25seSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKGFjbF90eXBlID09IFRPTU9ZT19UWVBFX1BBVEgyX0FDTCkgeworCQlzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqcHRyKSwgaGVhZCk7CisJCWJpdCA9IHRvbW95b19mbnMocHRyLT5wZXJtLCBiaXQpOworCQlpZiAoYml0ID49IFRPTU9ZT19NQVhfUEFUSDJfT1BFUkFUSU9OKQorCQkJZ290byBkb25lOworCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICJhbGxvd18lcyIsIHRvbW95b19wYXRoMl9rZXl3b3JkW2JpdF0pOworCQl0b21veW9fcHJpbnRfbmFtZV91bmlvbihoZWFkLCAmcHRyLT5uYW1lMSk7CisJCXRvbW95b19wcmludF9uYW1lX3VuaW9uKGhlYWQsICZwdHItPm5hbWUyKTsKKwl9IGVsc2UgaWYgKGFjbF90eXBlID09IFRPTU9ZT19UWVBFX1BBVEhfTlVNQkVSX0FDTCkgeworCQlzdHJ1Y3QgdG9tb3lvX3BhdGhfbnVtYmVyX2FjbCAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqcHRyKSwgaGVhZCk7CisJCWJpdCA9IHRvbW95b19mbnMocHRyLT5wZXJtLCBiaXQpOworCQlpZiAoYml0ID49IFRPTU9ZT19NQVhfUEFUSF9OVU1CRVJfT1BFUkFUSU9OKQorCQkJZ290byBkb25lOworCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICJhbGxvd18lcyIsCisJCQkJIHRvbW95b19wYXRoX251bWJlcl9rZXl3b3JkW2JpdF0pOworCQl0b21veW9fcHJpbnRfbmFtZV91bmlvbihoZWFkLCAmcHRyLT5uYW1lKTsKKwkJdG9tb3lvX3ByaW50X251bWJlcl91bmlvbihoZWFkLCAmcHRyLT5udW1iZXIpOworCX0gZWxzZSBpZiAoYWNsX3R5cGUgPT0gVE9NT1lPX1RZUEVfTUtERVZfQUNMKSB7CisJCXN0cnVjdCB0b21veW9fbWtkZXZfYWNsICpwdHIgPQorCQkJY29udGFpbmVyX29mKGFjbCwgdHlwZW9mKCpwdHIpLCBoZWFkKTsKKwkJYml0ID0gdG9tb3lvX2ZucyhwdHItPnBlcm0sIGJpdCk7CisJCWlmIChiaXQgPj0gVE9NT1lPX01BWF9NS0RFVl9PUEVSQVRJT04pCisJCQlnb3RvIGRvbmU7CisJCXRvbW95b19pb19wcmludGYoaGVhZCwgImFsbG93XyVzIiwgdG9tb3lvX21rZGV2X2tleXdvcmRbYml0XSk7CisJCXRvbW95b19wcmludF9uYW1lX3VuaW9uKGhlYWQsICZwdHItPm5hbWUpOworCQl0b21veW9fcHJpbnRfbnVtYmVyX3VuaW9uKGhlYWQsICZwdHItPm1vZGUpOworCQl0b21veW9fcHJpbnRfbnVtYmVyX3VuaW9uKGhlYWQsICZwdHItPm1ham9yKTsKKwkJdG9tb3lvX3ByaW50X251bWJlcl91bmlvbihoZWFkLCAmcHRyLT5taW5vcik7CisJfSBlbHNlIGlmIChhY2xfdHlwZSA9PSBUT01PWU9fVFlQRV9NT1VOVF9BQ0wpIHsKKwkJc3RydWN0IHRvbW95b19tb3VudF9hY2wgKnB0ciA9CisJCQljb250YWluZXJfb2YoYWNsLCB0eXBlb2YoKnB0ciksIGhlYWQpOworCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICJhbGxvd19tb3VudCIpOworCQl0b21veW9fcHJpbnRfbmFtZV91bmlvbihoZWFkLCAmcHRyLT5kZXZfbmFtZSk7CisJCXRvbW95b19wcmludF9uYW1lX3VuaW9uKGhlYWQsICZwdHItPmRpcl9uYW1lKTsKKwkJdG9tb3lvX3ByaW50X25hbWVfdW5pb24oaGVhZCwgJnB0ci0+ZnNfdHlwZSk7CisJCXRvbW95b19wcmludF9udW1iZXJfdW5pb24oaGVhZCwgJnB0ci0+ZmxhZ3MpOwogCX0KLQlpZiAoYWNsX3R5cGUgPT0gVE9NT1lPX1RZUEVfUEFUSDJfQUNMKSB7Ci0JCXN0cnVjdCB0b21veW9fcGF0aDJfYWNsICphY2wKLQkJCT0gY29udGFpbmVyX29mKHB0ciwgc3RydWN0IHRvbW95b19wYXRoMl9hY2wsIGhlYWQpOwotCQlyZXR1cm4gdG9tb3lvX3ByaW50X3BhdGgyX2FjbChoZWFkLCBhY2wpOwotCX0KLQlCVUcoKTsgLyogVGhpcyBtdXN0IG5vdCBoYXBwZW4uICovCi0JcmV0dXJuIGZhbHNlOworCWhlYWQtPnIuYml0ID0gYml0ICsgMTsKKwl0b21veW9faW9fcHJpbnRmKGhlYWQsICJcbiIpOworCWlmIChhY2xfdHlwZSAhPSBUT01PWU9fVFlQRV9NT1VOVF9BQ0wpCisJCWdvdG8gbmV4dDsKKyBkb25lOgorCWhlYWQtPnIuYml0ID0gMDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoqCi0gKiB0b21veW9fcmVhZF9kb21haW5fcG9saWN5IC0gUmVhZCBkb21haW4gcG9saWN5LgorICogdG9tb3lvX3JlYWRfZG9tYWluMiAtIFJlYWQgZG9tYWluIHBvbGljeS4KKyAqCisgKiBAaGVhZDogICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKiBAZG9tYWluOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KKyAqCisgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgorICoKKyAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHRvbW95b19yZWFkX2RvbWFpbjIoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQsCisJCQkJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluKQoreworCWxpc3RfZm9yX2VhY2hfY29va2llKGhlYWQtPnIuYWNsLCAmZG9tYWluLT5hY2xfaW5mb19saXN0KSB7CisJCXN0cnVjdCB0b21veW9fYWNsX2luZm8gKnB0ciA9CisJCQlsaXN0X2VudHJ5KGhlYWQtPnIuYWNsLCB0eXBlb2YoKnB0ciksIGxpc3QpOworCQlpZiAoIXRvbW95b19wcmludF9lbnRyeShoZWFkLCBwdHIpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwloZWFkLT5yLmFjbCA9IE5VTEw7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogdG9tb3lvX3JlYWRfZG9tYWluIC0gUmVhZCBkb21haW4gcG9saWN5LgogICoKICAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCiAgKgotICogUmV0dXJucyAwLgotICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3JlYWRfZG9tYWluX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3N0YXRpYyB2b2lkIHRvbW95b19yZWFkX2RvbWFpbihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpkcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgKmFwb3M7Ci0JYm9vbCBkb25lID0gdHJ1ZTsKLQotCWlmIChoZWFkLT5yZWFkX2VvZikKLQkJcmV0dXJuIDA7Ci0JaWYgKGhlYWQtPnJlYWRfc3RlcCA9PSAwKQotCQloZWFkLT5yZWFkX3N0ZXAgPSAxOwotCWxpc3RfZm9yX2VhY2hfY29va2llKGRwb3MsIGhlYWQtPnJlYWRfdmFyMSwgJnRvbW95b19kb21haW5fbGlzdCkgewotCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW47Ci0JCWNvbnN0IGNoYXIgKnF1b3RhX2V4Y2VlZGVkID0gIiI7Ci0JCWNvbnN0IGNoYXIgKnRyYW5zaXRpb25fZmFpbGVkID0gIiI7Ci0JCWNvbnN0IGNoYXIgKmlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZCA9ICIiOwotCQlkb21haW4gPSBsaXN0X2VudHJ5KGRwb3MsIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8sIGxpc3QpOwotCQlpZiAoaGVhZC0+cmVhZF9zdGVwICE9IDEpCi0JCQlnb3RvIGFjbF9sb29wOwotCQlpZiAoZG9tYWluLT5pc19kZWxldGVkICYmICFoZWFkLT5yZWFkX3NpbmdsZV9kb21haW4pCi0JCQljb250aW51ZTsKLQkJLyogUHJpbnQgZG9tYWlubmFtZSBhbmQgZmxhZ3MuICovCi0JCWlmIChkb21haW4tPnF1b3RhX3dhcm5lZCkKLQkJCXF1b3RhX2V4Y2VlZGVkID0gInF1b3RhX2V4Y2VlZGVkXG4iOwotCQlpZiAoZG9tYWluLT50cmFuc2l0aW9uX2ZhaWxlZCkKLQkJCXRyYW5zaXRpb25fZmFpbGVkID0gInRyYW5zaXRpb25fZmFpbGVkXG4iOwotCQlpZiAoZG9tYWluLT5pZ25vcmVfZ2xvYmFsX2FsbG93X3JlYWQpCi0JCQlpZ25vcmVfZ2xvYmFsX2FsbG93X3JlYWQKLQkJCQk9IFRPTU9ZT19LRVlXT1JEX0lHTk9SRV9HTE9CQUxfQUxMT1dfUkVBRCAiXG4iOwotCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXNcbiIgVE9NT1lPX0tFWVdPUkRfVVNFX1BST0ZJTEUKLQkJCQkJIiV1XG4lcyVzJXNcbiIsCi0JCQkJCWRvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZSwKLQkJCQkJZG9tYWluLT5wcm9maWxlLCBxdW90YV9leGNlZWRlZCwKLQkJCQkJdHJhbnNpdGlvbl9mYWlsZWQsCi0JCQkJCWlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZCk7Ci0JCWlmICghZG9uZSkKLQkJCWJyZWFrOwotCQloZWFkLT5yZWFkX3N0ZXAgPSAyOwotYWNsX2xvb3A6Ci0JCWlmIChoZWFkLT5yZWFkX3N0ZXAgPT0gMykKLQkJCWdvdG8gdGFpbF9tYXJrOwotCQkvKiBQcmludCBBQ0wgZW50cmllcyBpbiB0aGUgZG9tYWluLiAqLwotCQlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShhcG9zLCBoZWFkLT5yZWFkX3ZhcjIsCi0JCQkJICAgICAmZG9tYWluLT5hY2xfaW5mb19saXN0KSB7Ci0JCQlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwdHIKLQkJCQk9IGxpc3RfZW50cnkoYXBvcywgc3RydWN0IHRvbW95b19hY2xfaW5mbywKLQkJCQkJICAgICBsaXN0KTsKLQkJCWRvbmUgPSB0b21veW9fcHJpbnRfZW50cnkoaGVhZCwgcHRyKTsKLQkJCWlmICghZG9uZSkKLQkJCQlicmVhazsKKwlpZiAoaGVhZC0+ci5lb2YpCisJCXJldHVybjsKKwlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShoZWFkLT5yLmRvbWFpbiwgJnRvbW95b19kb21haW5fbGlzdCkgeworCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPQorCQkJbGlzdF9lbnRyeShoZWFkLT5yLmRvbWFpbiwgdHlwZW9mKCpkb21haW4pLCBsaXN0KTsKKwkJc3dpdGNoIChoZWFkLT5yLnN0ZXApIHsKKwkJY2FzZSAwOgorCQkJaWYgKGRvbWFpbi0+aXNfZGVsZXRlZCAmJgorCQkJICAgICFoZWFkLT5yLnByaW50X3RoaXNfZG9tYWluX29ubHkpCisJCQkJY29udGludWU7CisJCQkvKiBQcmludCBkb21haW5uYW1lIGFuZCBmbGFncy4gKi8KKwkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsIGRvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZSk7CisJCQl0b21veW9fc2V0X2xmKGhlYWQpOworCQkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLAorCQkJCQkgVE9NT1lPX0tFWVdPUkRfVVNFX1BST0ZJTEUgIiV1XG4iLAorCQkJCQkgZG9tYWluLT5wcm9maWxlKTsKKwkJCWlmIChkb21haW4tPnF1b3RhX3dhcm5lZCkKKwkJCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCAicXVvdGFfZXhjZWVkZWRcbiIpOworCQkJaWYgKGRvbWFpbi0+dHJhbnNpdGlvbl9mYWlsZWQpCisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwgInRyYW5zaXRpb25fZmFpbGVkXG4iKTsKKwkJCWlmIChkb21haW4tPmlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZCkKKwkJCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLAorCQkJCSAgICAgICBUT01PWU9fS0VZV09SRF9JR05PUkVfR0xPQkFMX0FMTE9XX1JFQUQKKwkJCQkJCSAgIlxuIik7CisJCQloZWFkLT5yLnN0ZXArKzsKKwkJCXRvbW95b19zZXRfbGYoaGVhZCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAxOgorCQkJaWYgKCF0b21veW9fcmVhZF9kb21haW4yKGhlYWQsIGRvbWFpbikpCisJCQkJcmV0dXJuOworCQkJaGVhZC0+ci5zdGVwKys7CisJCQlpZiAoIXRvbW95b19zZXRfbGYoaGVhZCkpCisJCQkJcmV0dXJuOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMjoKKwkJCWhlYWQtPnIuc3RlcCA9IDA7CisJCQlpZiAoaGVhZC0+ci5wcmludF90aGlzX2RvbWFpbl9vbmx5KQorCQkJCWdvdG8gZG9uZTsKIAkJfQotCQlpZiAoIWRvbmUpCi0JCQlicmVhazsKLQkJaGVhZC0+cmVhZF9zdGVwID0gMzsKLXRhaWxfbWFyazoKLQkJZG9uZSA9IHRvbW95b19pb19wcmludGYoaGVhZCwgIlxuIik7Ci0JCWlmICghZG9uZSkKLQkJCWJyZWFrOwotCQloZWFkLT5yZWFkX3N0ZXAgPSAxOwotCQlpZiAoaGVhZC0+cmVhZF9zaW5nbGVfZG9tYWluKQotCQkJYnJlYWs7CiAJfQotCWhlYWQtPnJlYWRfZW9mID0gZG9uZTsKLQlyZXR1cm4gMDsKKyBkb25lOgorCWhlYWQtPnIuZW9mID0gdHJ1ZTsKIH0KIAogLyoqCkBAIC0xNjA3LDcgKzEwODAsNyBAQAogICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGRvaW5nCiAgKgogICogICAgICggZWNobyAic2VsZWN0ICIgJGRvbWFpbm5hbWU7IGVjaG8gInVzZV9wcm9maWxlICIgJHByb2ZpbGUgKSB8Ci0gKiAgICAgL3Vzci9saWIvY2NzL2xvYWRwb2xpY3kgLWQKKyAqICAgICAvdXNyL3NiaW4vdG9tb3lvLWxvYWRwb2xpY3kgLWQKICAqCiAgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCkBAIC0xNjQ2LDI1ICsxMTE5LDIyIEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF9kb21haW5fcHJvZmlsZShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3N0YXRpYyB2b2lkIHRvbW95b19yZWFkX2RvbWFpbl9wcm9maWxlKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlib29sIGRvbmUgPSB0cnVlOwotCi0JaWYgKGhlYWQtPnJlYWRfZW9mKQotCQlyZXR1cm4gMDsKLQlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShwb3MsIGhlYWQtPnJlYWRfdmFyMSwgJnRvbW95b19kb21haW5fbGlzdCkgewotCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW47Ci0JCWRvbWFpbiA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvLCBsaXN0KTsKKwlpZiAoaGVhZC0+ci5lb2YpCisJCXJldHVybjsKKwlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShoZWFkLT5yLmRvbWFpbiwgJnRvbW95b19kb21haW5fbGlzdCkgeworCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPQorCQkJbGlzdF9lbnRyeShoZWFkLT5yLmRvbWFpbiwgdHlwZW9mKCpkb21haW4pLCBsaXN0KTsKIAkJaWYgKGRvbWFpbi0+aXNfZGVsZXRlZCkKIAkJCWNvbnRpbnVlOwotCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXUgJXNcbiIsIGRvbWFpbi0+cHJvZmlsZSwKLQkJCQkJZG9tYWluLT5kb21haW5uYW1lLT5uYW1lKTsKLQkJaWYgKCFkb25lKQotCQkJYnJlYWs7CisJCWlmICghdG9tb3lvX2ZsdXNoKGhlYWQpKQorCQkJcmV0dXJuOworCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICIldSAiLCBkb21haW4tPnByb2ZpbGUpOworCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUpOworCQl0b21veW9fc2V0X2xmKGhlYWQpOwogCX0KLQloZWFkLT5yZWFkX2VvZiA9IGRvbmU7Ci0JcmV0dXJuIDA7CisJaGVhZC0+ci5lb2YgPSB0cnVlOwogfQogCiAvKioKQEAgLTE2NzYsMTEgKzExNDYsNyBAQAogICovCiBzdGF0aWMgaW50IHRvbW95b193cml0ZV9waWQoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBwaWQ7Ci0JLyogTm8gZXJyb3IgY2hlY2suICovCi0Jc3RyaWN0X3N0cnRvdWwoaGVhZC0+d3JpdGVfYnVmLCAxMCwgJnBpZCk7Ci0JaGVhZC0+cmVhZF9zdGVwID0gKGludCkgcGlkOwotCWhlYWQtPnJlYWRfZW9mID0gZmFsc2U7CisJaGVhZC0+ci5lb2YgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY5NCwyOSArMTE2MCw1NyBAQAogICogVGhlIFBJRCBpcyBzcGVjaWZpZWQgYnkgdG9tb3lvX3dyaXRlX3BpZCgpIHNvIHRoYXQgdGhlIHVzZXIgY2FuIG9idGFpbgogICogdXNpbmcgcmVhZCgpL3dyaXRlKCkgaW50ZXJmYWNlIHJhdGhlciB0aGFuIHN5c2N0bCgpIGludGVyZmFjZS4KICAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF9waWQoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCitzdGF0aWMgdm9pZCB0b21veW9fcmVhZF9waWQoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCiB7Ci0JaWYgKGhlYWQtPnJlYWRfYXZhaWwgPT0gMCAmJiAhaGVhZC0+cmVhZF9lb2YpIHsKLQkJY29uc3QgaW50IHBpZCA9IGhlYWQtPnJlYWRfc3RlcDsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPSBOVUxMOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCXAgPSBmaW5kX3Rhc2tfYnlfdnBpZChwaWQpOwotCQlpZiAocCkKLQkJCWRvbWFpbiA9IHRvbW95b19yZWFsX2RvbWFpbihwKTsKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKGRvbWFpbikKLQkJCXRvbW95b19pb19wcmludGYoaGVhZCwgIiVkICV1ICVzIiwgcGlkLCBkb21haW4tPnByb2ZpbGUsCi0JCQkJCSBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUpOwotCQloZWFkLT5yZWFkX2VvZiA9IHRydWU7CisJY2hhciAqYnVmID0gaGVhZC0+d3JpdGVfYnVmOworCWJvb2wgZ2xvYmFsX3BpZCA9IGZhbHNlOworCXVuc2lnbmVkIGludCBwaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiA9IE5VTEw7CisKKwkvKiBBY2Nlc3Npbmcgd3JpdGVfYnVmIGlzIHNhZmUgYmVjYXVzZSBoZWFkLT5pb19zZW0gaXMgaGVsZC4gKi8KKwlpZiAoIWJ1ZikgeworCQloZWFkLT5yLmVvZiA9IHRydWU7CisJCXJldHVybjsgLyogRG8gbm90aGluZyBpZiBvcGVuKE9fUkRPTkxZKS4gKi8KIAl9Ci0JcmV0dXJuIDA7CisJaWYgKGhlYWQtPnIud19wb3MgfHwgaGVhZC0+ci5lb2YpCisJCXJldHVybjsKKwloZWFkLT5yLmVvZiA9IHRydWU7CisJaWYgKHRvbW95b19zdHJfc3RhcnRzKCZidWYsICJnbG9iYWwtcGlkICIpKQorCQlnbG9iYWxfcGlkID0gdHJ1ZTsKKwlwaWQgPSAodW5zaWduZWQgaW50KSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoZ2xvYmFsX3BpZCkKKwkJcCA9IGZpbmRfdGFza19ieV9waWRfbnMocGlkLCAmaW5pdF9waWRfbnMpOworCWVsc2UKKwkJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CisJaWYgKHApCisJCWRvbWFpbiA9IHRvbW95b19yZWFsX2RvbWFpbihwKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKCFkb21haW4pCisJCXJldHVybjsKKwl0b21veW9faW9fcHJpbnRmKGhlYWQsICIldSAldSAiLCBwaWQsIGRvbWFpbi0+cHJvZmlsZSk7CisJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwgZG9tYWluLT5kb21haW5uYW1lLT5uYW1lKTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKnRvbW95b190cmFuc2l0aW9uX3R5cGVbVE9NT1lPX01BWF9UUkFOU0lUSU9OX1RZUEVdID0geworCVtUT01PWU9fVFJBTlNJVElPTl9DT05UUk9MX05PX0lOSVRJQUxJWkVdCisJPSBUT01PWU9fS0VZV09SRF9OT19JTklUSUFMSVpFX0RPTUFJTiwKKwlbVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9JTklUSUFMSVpFXQorCT0gVE9NT1lPX0tFWVdPUkRfSU5JVElBTElaRV9ET01BSU4sCisJW1RPTU9ZT19UUkFOU0lUSU9OX0NPTlRST0xfTk9fS0VFUF0gPSBUT01PWU9fS0VZV09SRF9OT19LRUVQX0RPTUFJTiwKKwlbVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9LRUVQXSA9IFRPTU9ZT19LRVlXT1JEX0tFRVBfRE9NQUlOCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX2dyb3VwX25hbWVbVE9NT1lPX01BWF9HUk9VUF0gPSB7CisJW1RPTU9ZT19QQVRIX0dST1VQXSA9IFRPTU9ZT19LRVlXT1JEX1BBVEhfR1JPVVAsCisJW1RPTU9ZT19OVU1CRVJfR1JPVVBdID0gVE9NT1lPX0tFWVdPUkRfTlVNQkVSX0dST1VQCit9OworCiAvKioKLSAqIHRvbW95b193cml0ZV9leGNlcHRpb25fcG9saWN5IC0gV3JpdGUgZXhjZXB0aW9uIHBvbGljeS4KKyAqIHRvbW95b193cml0ZV9leGNlcHRpb24gLSBXcml0ZSBleGNlcHRpb24gcG9saWN5LgogICoKICAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCiAgKgpAQCAtMTcyNCwxODYgKzEyMTgsNTIzIEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fd3JpdGVfZXhjZXB0aW9uX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3N0YXRpYyBpbnQgdG9tb3lvX3dyaXRlX2V4Y2VwdGlvbihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKIHsKIAljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVfYnVmOwogCWJvb2wgaXNfZGVsZXRlID0gdG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsIFRPTU9ZT19LRVlXT1JEX0RFTEVURSk7CisJdTggaTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJY29uc3QgY2hhciAqa2V5d29yZDsKKwkJaW50ICgqd3JpdGUpIChjaGFyICosIGNvbnN0IGJvb2wpOworCX0gdG9tb3lvX2NhbGxiYWNrWzRdID0geworCQl7IFRPTU9ZT19LRVlXT1JEX0FHR1JFR0FUT1IsIHRvbW95b193cml0ZV9hZ2dyZWdhdG9yIH0sCisJCXsgVE9NT1lPX0tFWVdPUkRfRklMRV9QQVRURVJOLCB0b21veW9fd3JpdGVfcGF0dGVybiB9LAorCQl7IFRPTU9ZT19LRVlXT1JEX0RFTllfUkVXUklURSwgdG9tb3lvX3dyaXRlX25vX3Jld3JpdGUgfSwKKwkJeyBUT01PWU9fS0VZV09SRF9BTExPV19SRUFELCB0b21veW9fd3JpdGVfZ2xvYmFsbHlfcmVhZGFibGUgfSwKKwl9OwogCi0JaWYgKHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9LRUVQX0RPTUFJTikpCi0JCXJldHVybiB0b21veW9fd3JpdGVfZG9tYWluX2tlZXBlcl9wb2xpY3koZGF0YSwgZmFsc2UsCi0JCQkJCQkJIGlzX2RlbGV0ZSk7Ci0JaWYgKHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9OT19LRUVQX0RPTUFJTikpCi0JCXJldHVybiB0b21veW9fd3JpdGVfZG9tYWluX2tlZXBlcl9wb2xpY3koZGF0YSwgdHJ1ZSwgaXNfZGVsZXRlKTsKLQlpZiAodG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsIFRPTU9ZT19LRVlXT1JEX0lOSVRJQUxJWkVfRE9NQUlOKSkKLQkJcmV0dXJuIHRvbW95b193cml0ZV9kb21haW5faW5pdGlhbGl6ZXJfcG9saWN5KGRhdGEsIGZhbHNlLAotCQkJCQkJCSAgICAgIGlzX2RlbGV0ZSk7Ci0JaWYgKHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9OT19JTklUSUFMSVpFX0RPTUFJTikpCi0JCXJldHVybiB0b21veW9fd3JpdGVfZG9tYWluX2luaXRpYWxpemVyX3BvbGljeShkYXRhLCB0cnVlLAotCQkJCQkJCSAgICAgIGlzX2RlbGV0ZSk7Ci0JaWYgKHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9BTElBUykpCi0JCXJldHVybiB0b21veW9fd3JpdGVfYWxpYXNfcG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7Ci0JaWYgKHRvbW95b19zdHJfc3RhcnRzKCZkYXRhLCBUT01PWU9fS0VZV09SRF9BTExPV19SRUFEKSkKLQkJcmV0dXJuIHRvbW95b193cml0ZV9nbG9iYWxseV9yZWFkYWJsZV9wb2xpY3koZGF0YSwgaXNfZGVsZXRlKTsKLQlpZiAodG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsIFRPTU9ZT19LRVlXT1JEX0ZJTEVfUEFUVEVSTikpCi0JCXJldHVybiB0b21veW9fd3JpdGVfcGF0dGVybl9wb2xpY3koZGF0YSwgaXNfZGVsZXRlKTsKLQlpZiAodG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsIFRPTU9ZT19LRVlXT1JEX0RFTllfUkVXUklURSkpCi0JCXJldHVybiB0b21veW9fd3JpdGVfbm9fcmV3cml0ZV9wb2xpY3koZGF0YSwgaXNfZGVsZXRlKTsKLQlpZiAodG9tb3lvX3N0cl9zdGFydHMoJmRhdGEsIFRPTU9ZT19LRVlXT1JEX1BBVEhfR1JPVVApKQotCQlyZXR1cm4gdG9tb3lvX3dyaXRlX3BhdGhfZ3JvdXBfcG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7CisJZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfVFJBTlNJVElPTl9UWVBFOyBpKyspCisJCWlmICh0b21veW9fc3RyX3N0YXJ0cygmZGF0YSwgdG9tb3lvX3RyYW5zaXRpb25fdHlwZVtpXSkpCisJCQlyZXR1cm4gdG9tb3lvX3dyaXRlX3RyYW5zaXRpb25fY29udHJvbChkYXRhLCBpc19kZWxldGUsCisJCQkJCQkJICAgICAgIGkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWlmICh0b21veW9fc3RyX3N0YXJ0cygmZGF0YSwgdG9tb3lvX2NhbGxiYWNrW2ldLmtleXdvcmQpKQorCQkJcmV0dXJuIHRvbW95b19jYWxsYmFja1tpXS53cml0ZShkYXRhLCBpc19kZWxldGUpOworCWZvciAoaSA9IDA7IGkgPCBUT01PWU9fTUFYX0dST1VQOyBpKyspCisJCWlmICh0b21veW9fc3RyX3N0YXJ0cygmZGF0YSwgdG9tb3lvX2dyb3VwX25hbWVbaV0pKQorCQkJcmV0dXJuIHRvbW95b193cml0ZV9ncm91cChkYXRhLCBpc19kZWxldGUsIGkpOwogCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKLSAqIHRvbW95b19yZWFkX2V4Y2VwdGlvbl9wb2xpY3kgLSBSZWFkIGV4Y2VwdGlvbiBwb2xpY3kuCisgKiB0b21veW9fcmVhZF9ncm91cCAtIFJlYWQgInN0cnVjdCB0b21veW9fcGF0aF9ncm91cCIvInN0cnVjdCB0b21veW9fbnVtYmVyX2dyb3VwIiBsaXN0LgogICoKICAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKiBAaWR4OiAgSW5kZXggbnVtYmVyLgogICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG90aGVyd2lzZS4KKyAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF9leGNlcHRpb25fcG9saWN5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQorc3RhdGljIGJvb2wgdG9tb3lvX3JlYWRfZ3JvdXAoc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQsIGNvbnN0IGludCBpZHgpCiB7Ci0JaWYgKCFoZWFkLT5yZWFkX2VvZikgewotCQlzd2l0Y2ggKGhlYWQtPnJlYWRfc3RlcCkgewotCQljYXNlIDA6Ci0JCQloZWFkLT5yZWFkX3ZhcjIgPSBOVUxMOwotCQkJaGVhZC0+cmVhZF9zdGVwID0gMTsKLQkJY2FzZSAxOgotCQkJaWYgKCF0b21veW9fcmVhZF9kb21haW5fa2VlcGVyX3BvbGljeShoZWFkKSkKLQkJCQlicmVhazsKLQkJCWhlYWQtPnJlYWRfdmFyMiA9IE5VTEw7Ci0JCQloZWFkLT5yZWFkX3N0ZXAgPSAyOwotCQljYXNlIDI6Ci0JCQlpZiAoIXRvbW95b19yZWFkX2dsb2JhbGx5X3JlYWRhYmxlX3BvbGljeShoZWFkKSkKLQkJCQlicmVhazsKLQkJCWhlYWQtPnJlYWRfdmFyMiA9IE5VTEw7Ci0JCQloZWFkLT5yZWFkX3N0ZXAgPSAzOwotCQljYXNlIDM6Ci0JCQloZWFkLT5yZWFkX3ZhcjIgPSBOVUxMOwotCQkJaGVhZC0+cmVhZF9zdGVwID0gNDsKLQkJY2FzZSA0OgotCQkJaWYgKCF0b21veW9fcmVhZF9kb21haW5faW5pdGlhbGl6ZXJfcG9saWN5KGhlYWQpKQotCQkJCWJyZWFrOwotCQkJaGVhZC0+cmVhZF92YXIyID0gTlVMTDsKLQkJCWhlYWQtPnJlYWRfc3RlcCA9IDU7Ci0JCWNhc2UgNToKLQkJCWlmICghdG9tb3lvX3JlYWRfYWxpYXNfcG9saWN5KGhlYWQpKQotCQkJCWJyZWFrOwotCQkJaGVhZC0+cmVhZF92YXIyID0gTlVMTDsKLQkJCWhlYWQtPnJlYWRfc3RlcCA9IDY7Ci0JCWNhc2UgNjoKLQkJCWhlYWQtPnJlYWRfdmFyMiA9IE5VTEw7Ci0JCQloZWFkLT5yZWFkX3N0ZXAgPSA3OwotCQljYXNlIDc6Ci0JCQlpZiAoIXRvbW95b19yZWFkX2ZpbGVfcGF0dGVybihoZWFkKSkKLQkJCQlicmVhazsKLQkJCWhlYWQtPnJlYWRfdmFyMiA9IE5VTEw7Ci0JCQloZWFkLT5yZWFkX3N0ZXAgPSA4OwotCQljYXNlIDg6Ci0JCQlpZiAoIXRvbW95b19yZWFkX25vX3Jld3JpdGVfcG9saWN5KGhlYWQpKQotCQkJCWJyZWFrOwotCQkJaGVhZC0+cmVhZF92YXIyID0gTlVMTDsKLQkJCWhlYWQtPnJlYWRfc3RlcCA9IDk7Ci0JCWNhc2UgOToKLQkJCWlmICghdG9tb3lvX3JlYWRfcGF0aF9ncm91cF9wb2xpY3koaGVhZCkpCi0JCQkJYnJlYWs7Ci0JCQloZWFkLT5yZWFkX3ZhcjEgPSBOVUxMOwotCQkJaGVhZC0+cmVhZF92YXIyID0gTlVMTDsKLQkJCWhlYWQtPnJlYWRfc3RlcCA9IDEwOwotCQljYXNlIDEwOgotCQkJaGVhZC0+cmVhZF9lb2YgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShoZWFkLT5yLmdyb3VwLCAmdG9tb3lvX2dyb3VwX2xpc3RbaWR4XSkgeworCQlzdHJ1Y3QgdG9tb3lvX2dyb3VwICpncm91cCA9CisJCQlsaXN0X2VudHJ5KGhlYWQtPnIuZ3JvdXAsIHR5cGVvZigqZ3JvdXApLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9jb29raWUoaGVhZC0+ci5hY2wsICZncm91cC0+bWVtYmVyX2xpc3QpIHsKKwkJCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgKnB0ciA9CisJCQkJbGlzdF9lbnRyeShoZWFkLT5yLmFjbCwgdHlwZW9mKCpwdHIpLCBsaXN0KTsKKwkJCWlmIChwdHItPmlzX2RlbGV0ZWQpCisJCQkJY29udGludWU7CisJCQlpZiAoIXRvbW95b19mbHVzaChoZWFkKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCB0b21veW9fZ3JvdXBfbmFtZVtpZHhdKTsKKwkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsIGdyb3VwLT5ncm91cF9uYW1lLT5uYW1lKTsKKwkJCWlmIChpZHggPT0gVE9NT1lPX1BBVEhfR1JPVVApIHsKKwkJCQl0b21veW9fc2V0X3NwYWNlKGhlYWQpOworCQkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsIGNvbnRhaW5lcl9vZgorCQkJCQkgICAgICAgKHB0ciwgc3RydWN0IHRvbW95b19wYXRoX2dyb3VwLAorCQkJCQkJaGVhZCktPm1lbWJlcl9uYW1lLT5uYW1lKTsKKwkJCX0gZWxzZSBpZiAoaWR4ID09IFRPTU9ZT19OVU1CRVJfR1JPVVApIHsKKwkJCQl0b21veW9fcHJpbnRfbnVtYmVyX3VuaW9uKGhlYWQsICZjb250YWluZXJfb2YKKwkJCQkJCQkgIChwdHIsCisJCQkJCQkgICBzdHJ1Y3QgdG9tb3lvX251bWJlcl9ncm91cCwKKwkJCQkJCQkgICBoZWFkKS0+bnVtYmVyKTsKKwkJCX0KKwkJCXRvbW95b19zZXRfbGYoaGVhZCk7CiAJCX0KKwkJaGVhZC0+ci5hY2wgPSBOVUxMOwogCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogcGF0aCB0byBwb2xpY3kgbG9hZGVyICovCi1zdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX2xvYWRlciA9ICIvc2Jpbi90b21veW8taW5pdCI7Ci0KLS8qKgotICogdG9tb3lvX3BvbGljeV9sb2FkZXJfZXhpc3RzIC0gQ2hlY2sgd2hldGhlciAvc2Jpbi90b21veW8taW5pdCBleGlzdHMuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIC9zYmluL3RvbW95by1pbml0IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgYm9vbCB0b21veW9fcG9saWN5X2xvYWRlcl9leGlzdHModm9pZCkKLXsKLQkvKgotCSAqIERvbid0IGFjdGl2YXRlIE1BQyBpZiB0aGUgcG9saWN5IGxvYWRlciBkb2Vzbid0IGV4aXN0LgotCSAqIElmIHRoZSBpbml0cmQgaW5jbHVkZXMgL3NiaW4vaW5pdCBidXQgcmVhbC1yb290LWRldiBoYXMgbm90Ci0JICogbW91bnRlZCBvbiAvIHlldCwgYWN0aXZhdGluZyBNQUMgd2lsbCBibG9jayB0aGUgc3lzdGVtIHNpbmNlCi0JICogcG9saWNpZXMgYXJlIG5vdCBsb2FkZWQgeWV0LgotCSAqIFRodXMsIGxldCBkb19leGVjdmUoKSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlcnl0aW1lLgotCSAqLwotCXN0cnVjdCBwYXRoIHBhdGg7Ci0KLQlpZiAoa2Vybl9wYXRoKHRvbW95b19sb2FkZXIsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJOb3QgYWN0aXZhdGluZyBNYW5kYXRvcnkgQWNjZXNzIENvbnRyb2wgbm93ICIKLQkJICAgICAgICJzaW5jZSAlcyBkb2Vzbid0IGV4aXN0LlxuIiwgdG9tb3lvX2xvYWRlcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcGF0aF9wdXQoJnBhdGgpOworCWhlYWQtPnIuZ3JvdXAgPSBOVUxMOwogCXJldHVybiB0cnVlOwogfQogCiAvKioKLSAqIHRvbW95b19sb2FkX3BvbGljeSAtIFJ1biBleHRlcm5hbCBwb2xpY3kgbG9hZGVyIHRvIGxvYWQgcG9saWN5LgorICogdG9tb3lvX3JlYWRfcG9saWN5IC0gUmVhZCAic3RydWN0IHRvbW95b18uLi5fZW50cnkiIGxpc3QuCiAgKgotICogQGZpbGVuYW1lOiBUaGUgcHJvZ3JhbSBhYm91dCB0byBzdGFydC4KKyAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKiBAaWR4OiAgSW5kZXggbnVtYmVyLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgQGZpbGVuYW1lIGlzIC9zYmluL2luaXQgLCBhbmQgaWYgc28KLSAqIGludm9rZSAvc2Jpbi90b21veW8taW5pdCBhbmQgd2FpdCBmb3IgdGhlIHRlcm1pbmF0aW9uIG9mIC9zYmluL3RvbW95by1pbml0Ci0gKiBhbmQgdGhlbiBjb250aW51ZXMgaW52b2NhdGlvbiBvZiAvc2Jpbi9pbml0LgotICogL3NiaW4vdG9tb3lvLWluaXQgcmVhZHMgcG9saWN5IGZpbGVzIGluIC9ldGMvdG9tb3lvLyBkaXJlY3RvcnkgYW5kCi0gKiB3cml0ZXMgdG8gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2VzLgorICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAqCi0gKiBSZXR1cm5zIG5vdGhpbmcuCisgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCi12b2lkIHRvbW95b19sb2FkX3BvbGljeShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3N0YXRpYyBib29sIHRvbW95b19yZWFkX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCwgY29uc3QgaW50IGlkeCkKIHsKLQljaGFyICphcmd2WzJdOwotCWNoYXIgKmVudnBbM107Ci0KLQlpZiAodG9tb3lvX3BvbGljeV9sb2FkZWQpCi0JCXJldHVybjsKLQkvKgotCSAqIENoZWNrIGZpbGVuYW1lIGlzIC9zYmluL2luaXQgb3IgL3NiaW4vdG9tb3lvLXN0YXJ0LgotCSAqIC9zYmluL3RvbW95by1zdGFydCBpcyBhIGR1bW15IGZpbGVuYW1lIGluIGNhc2Ugd2hlcmUgL3NiaW4vaW5pdCBjYW4ndAotCSAqIGJlIHBhc3NlZC4KLQkgKiBZb3UgY2FuIGNyZWF0ZSAvc2Jpbi90b21veW8tc3RhcnQgYnkKLQkgKiAibG4gLXMgL2Jpbi90cnVlIC9zYmluL3RvbW95by1zdGFydCIuCi0JICovCi0JaWYgKHN0cmNtcChmaWxlbmFtZSwgIi9zYmluL2luaXQiKSAmJgotCSAgICBzdHJjbXAoZmlsZW5hbWUsICIvc2Jpbi90b21veW8tc3RhcnQiKSkKLQkJcmV0dXJuOwotCWlmICghdG9tb3lvX3BvbGljeV9sb2FkZXJfZXhpc3RzKCkpCi0JCXJldHVybjsKLQotCXByaW50ayhLRVJOX0lORk8gIkNhbGxpbmcgJXMgdG8gbG9hZCBwb2xpY3kuIFBsZWFzZSB3YWl0LlxuIiwKLQkgICAgICAgdG9tb3lvX2xvYWRlcik7Ci0JYXJndlswXSA9IChjaGFyICopIHRvbW95b19sb2FkZXI7Ci0JYXJndlsxXSA9IE5VTEw7Ci0JZW52cFswXSA9ICJIT01FPS8iOwotCWVudnBbMV0gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7Ci0JZW52cFsyXSA9IE5VTEw7Ci0JY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCAxKTsKLQotCXByaW50ayhLRVJOX0lORk8gIlRPTU9ZTzogMi4yLjAgICAyMDA5LzA0LzAxXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJNYW5kYXRvcnkgQWNjZXNzIENvbnRyb2wgYWN0aXZhdGVkLlxuIik7Ci0JdG9tb3lvX3BvbGljeV9sb2FkZWQgPSB0cnVlOwotCXsgLyogQ2hlY2sgYWxsIHByb2ZpbGVzIGN1cnJlbnRseSBhc3NpZ25lZCB0byBkb21haW5zIGFyZSBkZWZpbmVkLiAqLwotCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW47Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRvbWFpbiwgJnRvbW95b19kb21haW5fbGlzdCwgbGlzdCkgewotCQkJY29uc3QgdTggcHJvZmlsZSA9IGRvbWFpbi0+cHJvZmlsZTsKLQkJCWlmICh0b21veW9fcHJvZmlsZV9wdHJbcHJvZmlsZV0pCi0JCQkJY29udGludWU7Ci0JCQlwYW5pYygiUHJvZmlsZSAldSAodXNlZCBieSAnJXMnKSBub3QgZGVmaW5lZC5cbiIsCi0JCQkgICAgICBwcm9maWxlLCBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUpOworCWxpc3RfZm9yX2VhY2hfY29va2llKGhlYWQtPnIuYWNsLCAmdG9tb3lvX3BvbGljeV9saXN0W2lkeF0pIHsKKwkJc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYWNsID0KKwkJCWNvbnRhaW5lcl9vZihoZWFkLT5yLmFjbCwgdHlwZW9mKCphY2wpLCBsaXN0KTsKKwkJaWYgKGFjbC0+aXNfZGVsZXRlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXRvbW95b19mbHVzaChoZWFkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJc3dpdGNoIChpZHgpIHsKKwkJY2FzZSBUT01PWU9fSURfVFJBTlNJVElPTl9DT05UUk9MOgorCQkJeworCQkJCXN0cnVjdCB0b21veW9fdHJhbnNpdGlvbl9jb250cm9sICpwdHIgPQorCQkJCQljb250YWluZXJfb2YoYWNsLCB0eXBlb2YoKnB0ciksIGhlYWQpOworCQkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsCisJCQkJCQkgIHRvbW95b190cmFuc2l0aW9uX3R5cGUKKwkJCQkJCSAgW3B0ci0+dHlwZV0pOworCQkJCWlmIChwdHItPnByb2dyYW0pCisJCQkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsCisJCQkJCQkJICBwdHItPnByb2dyYW0tPm5hbWUpOworCQkJCWlmIChwdHItPnByb2dyYW0gJiYgcHRyLT5kb21haW5uYW1lKQorCQkJCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCAiIGZyb20gIik7CisJCQkJaWYgKHB0ci0+ZG9tYWlubmFtZSkKKwkJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwKKwkJCQkJCQkgIHB0ci0+ZG9tYWlubmFtZS0+CisJCQkJCQkJICBuYW1lKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRPTU9ZT19JRF9HTE9CQUxMWV9SRUFEQUJMRToKKwkJCXsKKwkJCQlzdHJ1Y3QgdG9tb3lvX3JlYWRhYmxlX2ZpbGUgKnB0ciA9CisJCQkJCWNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqcHRyKSwgaGVhZCk7CisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwKKwkJCQkJCSAgVE9NT1lPX0tFWVdPUkRfQUxMT1dfUkVBRCk7CisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwgcHRyLT5maWxlbmFtZS0+bmFtZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUT01PWU9fSURfQUdHUkVHQVRPUjoKKwkJCXsKKwkJCQlzdHJ1Y3QgdG9tb3lvX2FnZ3JlZ2F0b3IgKnB0ciA9CisJCQkJCWNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqcHRyKSwgaGVhZCk7CisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwKKwkJCQkJCSAgVE9NT1lPX0tFWVdPUkRfQUdHUkVHQVRPUik7CisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwKKwkJCQkJCSAgcHRyLT5vcmlnaW5hbF9uYW1lLT5uYW1lKTsKKwkJCQl0b21veW9fc2V0X3NwYWNlKGhlYWQpOworCQkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsCisJCQkJCSAgICAgICBwdHItPmFnZ3JlZ2F0ZWRfbmFtZS0+bmFtZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUT01PWU9fSURfUEFUVEVSTjoKKwkJCXsKKwkJCQlzdHJ1Y3QgdG9tb3lvX25vX3BhdHRlcm4gKnB0ciA9CisJCQkJCWNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqcHRyKSwgaGVhZCk7CisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwKKwkJCQkJCSAgVE9NT1lPX0tFWVdPUkRfRklMRV9QQVRURVJOKTsKKwkJCQl0b21veW9fc2V0X3N0cmluZyhoZWFkLCBwdHItPnBhdHRlcm4tPm5hbWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVE9NT1lPX0lEX05PX1JFV1JJVEU6CisJCQl7CisJCQkJc3RydWN0IHRvbW95b19ub19yZXdyaXRlICpwdHIgPQorCQkJCQljb250YWluZXJfb2YoYWNsLCB0eXBlb2YoKnB0ciksIGhlYWQpOworCQkJCXRvbW95b19zZXRfc3RyaW5nKGhlYWQsCisJCQkJCQkgIFRPTU9ZT19LRVlXT1JEX0RFTllfUkVXUklURSk7CisJCQkJdG9tb3lvX3NldF9zdHJpbmcoaGVhZCwgcHRyLT5wYXR0ZXJuLT5uYW1lKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29udGludWU7CiAJCX0KKwkJdG9tb3lvX3NldF9sZihoZWFkKTsKIAl9CisJaGVhZC0+ci5hY2wgPSBOVUxMOworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHRvbW95b19yZWFkX2V4Y2VwdGlvbiAtIFJlYWQgZXhjZXB0aW9uIHBvbGljeS4KKyAqCisgKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgorICoKKyAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCisgKi8KK3N0YXRpYyB2b2lkIHRvbW95b19yZWFkX2V4Y2VwdGlvbihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3sKKwlpZiAoaGVhZC0+ci5lb2YpCisJCXJldHVybjsKKwl3aGlsZSAoaGVhZC0+ci5zdGVwIDwgVE9NT1lPX01BWF9QT0xJQ1kgJiYKKwkgICAgICAgdG9tb3lvX3JlYWRfcG9saWN5KGhlYWQsIGhlYWQtPnIuc3RlcCkpCisJCWhlYWQtPnIuc3RlcCsrOworCWlmIChoZWFkLT5yLnN0ZXAgPCBUT01PWU9fTUFYX1BPTElDWSkKKwkJcmV0dXJuOworCXdoaWxlIChoZWFkLT5yLnN0ZXAgPCBUT01PWU9fTUFYX1BPTElDWSArIFRPTU9ZT19NQVhfR1JPVVAgJiYKKwkgICAgICAgdG9tb3lvX3JlYWRfZ3JvdXAoaGVhZCwgaGVhZC0+ci5zdGVwIC0gVE9NT1lPX01BWF9QT0xJQ1kpKQorCQloZWFkLT5yLnN0ZXArKzsKKwlpZiAoaGVhZC0+ci5zdGVwIDwgVE9NT1lPX01BWF9QT0xJQ1kgKyBUT01PWU9fTUFYX0dST1VQKQorCQlyZXR1cm47CisJaGVhZC0+ci5lb2YgPSB0cnVlOworfQorCisvKioKKyAqIHRvbW95b19wcmludF9oZWFkZXIgLSBHZXQgaGVhZGVyIGxpbmUgb2YgYXVkaXQgbG9nLgorICoKKyAqIEByOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIuCisgKgorICogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIGttYWxsb2MoKSwgc28gY2FsbGVyIG11c3Qga2ZyZWUoKSBpZiB0aGlzIGZ1bmN0aW9uCisgKiBkaWRuJ3QgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBjaGFyICp0b21veW9fcHJpbnRfaGVhZGVyKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWNvbnN0IHBpZF90IGdwaWQgPSB0YXNrX3BpZF9ucihjdXJyZW50KTsKKwlzdGF0aWMgY29uc3QgaW50IHRvbW95b19idWZmZXJfbGVuID0gNDA5NjsKKwljaGFyICpidWZmZXIgPSBrbWFsbG9jKHRvbW95b19idWZmZXJfbGVuLCBHRlBfTk9GUyk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiBOVUxMOworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCXNucHJpbnRmKGJ1ZmZlciwgdG9tb3lvX2J1ZmZlcl9sZW4gLSAxLAorCQkgIiN0aW1lc3RhbXA9JWx1IHByb2ZpbGU9JXUgbW9kZT0lcyAoZ2xvYmFsLXBpZD0ldSkiCisJCSAiIHRhc2s9eyBwaWQ9JXUgcHBpZD0ldSB1aWQ9JXUgZ2lkPSV1IGV1aWQ9JXUiCisJCSAiIGVnaWQ9JXUgc3VpZD0ldSBzZ2lkPSV1IGZzdWlkPSV1IGZzZ2lkPSV1IH0iLAorCQkgdHYudHZfc2VjLCByLT5wcm9maWxlLCB0b21veW9fbW9kZVtyLT5tb2RlXSwgZ3BpZCwKKwkJIChwaWRfdCkgc3lzX2dldHBpZCgpLCAocGlkX3QpIHN5c19nZXRwcGlkKCksCisJCSBjdXJyZW50X3VpZCgpLCBjdXJyZW50X2dpZCgpLCBjdXJyZW50X2V1aWQoKSwKKwkJIGN1cnJlbnRfZWdpZCgpLCBjdXJyZW50X3N1aWQoKSwgY3VycmVudF9zZ2lkKCksCisJCSBjdXJyZW50X2ZzdWlkKCksIGN1cnJlbnRfZnNnaWQoKSk7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworLyoqCisgKiB0b21veW9faW5pdF9hdWRpdF9sb2cgLSBBbGxvY2F0ZSBidWZmZXIgZm9yIGF1ZGl0IGxvZ3MuCisgKgorICogQGxlbjogUmVxdWlyZWQgc2l6ZS4KKyAqIEByOiAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIi4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBUaGUgQGxlbiBpcyB1cGRhdGVkIHRvIGFkZCB0aGUgaGVhZGVyIGxpbmVzJyBzaXplIG9uIHN1Y2Nlc3MuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIGt6YWxsb2MoKSwgc28gY2FsbGVyIG11c3Qga2ZyZWUoKSBpZiB0aGlzIGZ1bmN0aW9uCisgKiBkaWRuJ3QgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBjaGFyICp0b21veW9faW5pdF9hdWRpdF9sb2coaW50ICpsZW4sIHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyKQoreworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJY29uc3QgY2hhciAqaGVhZGVyOworCWNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CisJaWYgKCFyLT5kb21haW4pCisJCXItPmRvbWFpbiA9IHRvbW95b19kb21haW4oKTsKKwlkb21haW5uYW1lID0gci0+ZG9tYWluLT5kb21haW5uYW1lLT5uYW1lOworCWhlYWRlciA9IHRvbW95b19wcmludF9oZWFkZXIocik7CisJaWYgKCFoZWFkZXIpCisJCXJldHVybiBOVUxMOworCSpsZW4gKz0gc3RybGVuKGRvbWFpbm5hbWUpICsgc3RybGVuKGhlYWRlcikgKyAxMDsKKwlidWYgPSBremFsbG9jKCpsZW4sIEdGUF9OT0ZTKTsKKwlpZiAoYnVmKQorCQlzbnByaW50ZihidWYsICgqbGVuKSAtIDEsICIlc1xuJXNcbiIsIGhlYWRlciwgZG9tYWlubmFtZSk7CisJa2ZyZWUoaGVhZGVyKTsKKwlyZXR1cm4gYnVmOworfQorCisvKiBXYWl0IHF1ZXVlIGZvciB0b21veW9fcXVlcnlfbGlzdC4gKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0b21veW9fcXVlcnlfd2FpdCk7CisKKy8qIExvY2sgZm9yIG1hbmlwdWxhdGluZyB0b21veW9fcXVlcnlfbGlzdC4gKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisKKy8qIFN0cnVjdHVyZSBmb3IgcXVlcnkuICovCitzdHJ1Y3QgdG9tb3lvX3F1ZXJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY2hhciAqcXVlcnk7CisJaW50IHF1ZXJ5X2xlbjsKKwl1bnNpZ25lZCBpbnQgc2VyaWFsOworCWludCB0aW1lcjsKKwlpbnQgYW5zd2VyOworfTsKKworLyogVGhlIGxpc3QgZm9yICJzdHJ1Y3QgdG9tb3lvX3F1ZXJ5Ii4gKi8KK3N0YXRpYyBMSVNUX0hFQUQodG9tb3lvX3F1ZXJ5X2xpc3QpOworCisvKgorICogTnVtYmVyIG9mICJzdHJ1Y3QgZmlsZSIgcmVmZXJyaW5nIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9xdWVyeQorICogaW50ZXJmYWNlLgorICovCitzdGF0aWMgYXRvbWljX3QgdG9tb3lvX3F1ZXJ5X29ic2VydmVycyA9IEFUT01JQ19JTklUKDApOworCisvKioKKyAqIHRvbW95b19zdXBlcnZpc29yIC0gQXNrIGZvciB0aGUgc3VwZXJ2aXNvcidzIGRlY2lzaW9uLgorICoKKyAqIEByOiAgICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIuCisgKiBAZm10OiAgICAgVGhlIHByaW50ZigpJ3MgZm9ybWF0IHN0cmluZywgZm9sbG93ZWQgYnkgcGFyYW1ldGVycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHN1cGVydmlzb3IgZGVjaWRlZCB0byBwZXJtaXQgdGhlIGFjY2VzcyByZXF1ZXN0IHdoaWNoCisgKiB2aW9sYXRlZCB0aGUgcG9saWN5IGluIGVuZm9yY2luZyBtb2RlLCBUT01PWU9fUkVUUllfUkVRVUVTVCBpZiB0aGUKKyAqIHN1cGVydmlzb3IgZGVjaWRlZCB0byByZXRyeSB0aGUgYWNjZXNzIHJlcXVlc3Qgd2hpY2ggdmlvbGF0ZWQgdGhlIHBvbGljeSBpbgorICogZW5mb3JjaW5nIG1vZGUsIDAgaWYgaXQgaXMgbm90IGluIGVuZm9yY2luZyBtb2RlLCAtRVBFUk0gb3RoZXJ3aXNlLgorICovCitpbnQgdG9tb3lvX3N1cGVydmlzb3Ioc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgZXJyb3IgPSAtRVBFUk07CisJaW50IHBvczsKKwlpbnQgbGVuOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdG9tb3lvX3NlcmlhbDsKKwlzdHJ1Y3QgdG9tb3lvX3F1ZXJ5ICplbnRyeSA9IE5VTEw7CisJYm9vbCBxdW90YV9leGNlZWRlZCA9IGZhbHNlOworCWNoYXIgKmhlYWRlcjsKKwlzd2l0Y2ggKHItPm1vZGUpIHsKKwkJY2hhciAqYnVmZmVyOworCWNhc2UgVE9NT1lPX0NPTkZJR19MRUFSTklORzoKKwkJaWYgKCF0b21veW9fZG9tYWluX3F1b3RhX2lzX29rKHIpKQorCQkJcmV0dXJuIDA7CisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWxlbiA9IHZzbnByaW50ZigoY2hhciAqKSAmcG9zLCBzaXplb2YocG9zKSAtIDEsIGZtdCwgYXJncykgKyA0OworCQl2YV9lbmQoYXJncyk7CisJCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfTk9GUyk7CisJCWlmICghYnVmZmVyKQorCQkJcmV0dXJuIDA7CisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzbnByaW50ZihidWZmZXIsIGxlbiAtIDEsIGZtdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKwkJdG9tb3lvX25vcm1hbGl6ZV9saW5lKGJ1ZmZlcik7CisJCXRvbW95b193cml0ZV9kb21haW4yKGJ1ZmZlciwgci0+ZG9tYWluLCBmYWxzZSk7CisJCWtmcmVlKGJ1ZmZlcik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVE9NT1lPX0NPTkZJR19QRVJNSVNTSVZFOgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFyLT5kb21haW4pCisJCXItPmRvbWFpbiA9IHRvbW95b19kb21haW4oKTsKKwlpZiAoIWF0b21pY19yZWFkKCZ0b21veW9fcXVlcnlfb2JzZXJ2ZXJzKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZigoY2hhciAqKSAmcG9zLCBzaXplb2YocG9zKSAtIDEsIGZtdCwgYXJncykgKyAzMjsKKwl2YV9lbmQoYXJncyk7CisJaGVhZGVyID0gdG9tb3lvX2luaXRfYXVkaXRfbG9nKCZsZW4sIHIpOworCWlmICghaGVhZGVyKQorCQlnb3RvIG91dDsKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9OT0ZTKTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIG91dDsKKwllbnRyeS0+cXVlcnkgPSBremFsbG9jKGxlbiwgR0ZQX05PRlMpOworCWlmICghZW50cnktPnF1ZXJ5KQorCQlnb3RvIG91dDsKKwlsZW4gPSBrc2l6ZShlbnRyeS0+cXVlcnkpOworCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJaWYgKHRvbW95b19xdW90YV9mb3JfcXVlcnkgJiYgdG9tb3lvX3F1ZXJ5X21lbW9yeV9zaXplICsgbGVuICsKKwkgICAgc2l6ZW9mKCplbnRyeSkgPj0gdG9tb3lvX3F1b3RhX2Zvcl9xdWVyeSkgeworCQlxdW90YV9leGNlZWRlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJdG9tb3lvX3F1ZXJ5X21lbW9yeV9zaXplICs9IGxlbiArIHNpemVvZigqZW50cnkpOworCQllbnRyeS0+c2VyaWFsID0gdG9tb3lvX3NlcmlhbCsrOworCX0KKwlzcGluX3VubG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJaWYgKHF1b3RhX2V4Y2VlZGVkKQorCQlnb3RvIG91dDsKKwlwb3MgPSBzbnByaW50ZihlbnRyeS0+cXVlcnksIGxlbiAtIDEsICJRJXUtJWh1XG4lcyIsCisJCSAgICAgICBlbnRyeS0+c2VyaWFsLCByLT5yZXRyeSwgaGVhZGVyKTsKKwlrZnJlZShoZWFkZXIpOworCWhlYWRlciA9IE5VTEw7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoZW50cnktPnF1ZXJ5ICsgcG9zLCBsZW4gLSAxIC0gcG9zLCBmbXQsIGFyZ3MpOworCWVudHJ5LT5xdWVyeV9sZW4gPSBzdHJsZW4oZW50cnktPnF1ZXJ5KSArIDE7CisJdmFfZW5kKGFyZ3MpOworCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZ0b21veW9fcXVlcnlfbGlzdCk7CisJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCS8qIEdpdmUgMTAgc2Vjb25kcyBmb3Igc3VwZXJ2aXNvcidzIG9waW5pb24uICovCisJZm9yIChlbnRyeS0+dGltZXIgPSAwOworCSAgICAgYXRvbWljX3JlYWQoJnRvbW95b19xdWVyeV9vYnNlcnZlcnMpICYmIGVudHJ5LT50aW1lciA8IDEwMDsKKwkgICAgIGVudHJ5LT50aW1lcisrKSB7CisJCXdha2VfdXAoJnRvbW95b19xdWVyeV93YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwkJaWYgKGVudHJ5LT5hbnN3ZXIpCisJCQlicmVhazsKKwl9CisJc3Bpbl9sb2NrKCZ0b21veW9fcXVlcnlfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCXRvbW95b19xdWVyeV9tZW1vcnlfc2l6ZSAtPSBsZW4gKyBzaXplb2YoKmVudHJ5KTsKKwlzcGluX3VubG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJc3dpdGNoIChlbnRyeS0+YW5zd2VyKSB7CisJY2FzZSAzOiAvKiBBc2tlZCB0byByZXRyeSBieSBhZG1pbmlzdHJhdG9yLiAqLworCQllcnJvciA9IFRPTU9ZT19SRVRSWV9SRVFVRVNUOworCQlyLT5yZXRyeSsrOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIEdyYW50ZWQgYnkgYWRtaW5pc3RyYXRvci4gKi8KKwkJZXJyb3IgPSAwOworCQlicmVhazsKKwljYXNlIDA6CisJCS8qIFRpbWVkIG91dC4gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogUmVqZWN0ZWQgYnkgYWRtaW5pc3RyYXRvci4gKi8KKwkJYnJlYWs7CisJfQorIG91dDoKKwlpZiAoZW50cnkpCisJCWtmcmVlKGVudHJ5LT5xdWVyeSk7CisJa2ZyZWUoZW50cnkpOworCWtmcmVlKGhlYWRlcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIHRvbW95b19wb2xsX3F1ZXJ5IC0gcG9sbCgpIGZvciAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vcXVlcnkuCisgKgorICogQGZpbGU6IFBvaW50ZXIgdG8gInN0cnVjdCBmaWxlIi4KKyAqIEB3YWl0OiBQb2ludGVyIHRvICJwb2xsX3RhYmxlIi4KKyAqCisgKiBSZXR1cm5zIFBPTExJTiB8IFBPTExSRE5PUk0gd2hlbiByZWFkeSB0byByZWFkLCAwIG90aGVyd2lzZS4KKyAqCisgKiBXYWl0cyBmb3IgYWNjZXNzIHJlcXVlc3RzIHdoaWNoIHZpb2xhdGVkIHBvbGljeSBpbiBlbmZvcmNpbmcgbW9kZS4KKyAqLworc3RhdGljIGludCB0b21veW9fcG9sbF9xdWVyeShzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXU4IGk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlzcGluX2xvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnRvbW95b19xdWVyeV9saXN0KSB7CisJCQlzdHJ1Y3QgdG9tb3lvX3F1ZXJ5ICpwdHIgPQorCQkJCWxpc3RfZW50cnkodG1wLCB0eXBlb2YoKnB0ciksIGxpc3QpOworCQkJaWYgKHB0ci0+YW5zd2VyKQorCQkJCWNvbnRpbnVlOworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCQlpZiAoZm91bmQpCisJCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJaWYgKGkpCisJCQlicmVhazsKKwkJcG9sbF93YWl0KGZpbGUsICZ0b21veW9fcXVlcnlfd2FpdCwgd2FpdCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHRvbW95b19yZWFkX3F1ZXJ5IC0gUmVhZCBhY2Nlc3MgcmVxdWVzdHMgd2hpY2ggdmlvbGF0ZWQgcG9saWN5IGluIGVuZm9yY2luZyBtb2RlLgorICoKKyAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKi8KK3N0YXRpYyB2b2lkIHRvbW95b19yZWFkX3F1ZXJ5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlpbnQgcG9zID0gMDsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpidWY7CisJaWYgKGhlYWQtPnIud19wb3MpCisJCXJldHVybjsKKwlpZiAoaGVhZC0+cmVhZF9idWYpIHsKKwkJa2ZyZWUoaGVhZC0+cmVhZF9idWYpOworCQloZWFkLT5yZWFkX2J1ZiA9IE5VTEw7CisJfQorCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZ0b21veW9fcXVlcnlfbGlzdCkgeworCQlzdHJ1Y3QgdG9tb3lvX3F1ZXJ5ICpwdHIgPSBsaXN0X2VudHJ5KHRtcCwgdHlwZW9mKCpwdHIpLCBsaXN0KTsKKwkJaWYgKHB0ci0+YW5zd2VyKQorCQkJY29udGludWU7CisJCWlmIChwb3MrKyAhPSBoZWFkLT5yLnF1ZXJ5X2luZGV4KQorCQkJY29udGludWU7CisJCWxlbiA9IHB0ci0+cXVlcnlfbGVuOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCWlmICghbGVuKSB7CisJCWhlYWQtPnIucXVlcnlfaW5kZXggPSAwOworCQlyZXR1cm47CisJfQorCWJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfTk9GUyk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKwlwb3MgPSAwOworCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZ0b21veW9fcXVlcnlfbGlzdCkgeworCQlzdHJ1Y3QgdG9tb3lvX3F1ZXJ5ICpwdHIgPSBsaXN0X2VudHJ5KHRtcCwgdHlwZW9mKCpwdHIpLCBsaXN0KTsKKwkJaWYgKHB0ci0+YW5zd2VyKQorCQkJY29udGludWU7CisJCWlmIChwb3MrKyAhPSBoZWFkLT5yLnF1ZXJ5X2luZGV4KQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFNvbWUgcXVlcnkgY2FuIGJlIHNraXBwZWQgYmVjYXVzZSB0b21veW9fcXVlcnlfbGlzdAorCQkgKiBjYW4gY2hhbmdlLCBidXQgSSBkb24ndCBjYXJlLgorCQkgKi8KKwkJaWYgKGxlbiA9PSBwdHItPnF1ZXJ5X2xlbikKKwkJCW1lbW1vdmUoYnVmLCBwdHItPnF1ZXJ5LCBsZW4pOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCWlmIChidWZbMF0pIHsKKwkJaGVhZC0+cmVhZF9idWYgPSBidWY7CisJCWhlYWQtPnIud1toZWFkLT5yLndfcG9zKytdID0gYnVmOworCQloZWFkLT5yLnF1ZXJ5X2luZGV4Kys7CisJfSBlbHNlIHsKKwkJa2ZyZWUoYnVmKTsKKwl9Cit9CisKKy8qKgorICogdG9tb3lvX3dyaXRlX2Fuc3dlciAtIFdyaXRlIHRoZSBzdXBlcnZpc29yJ3MgZGVjaXNpb24uCisgKgorICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgdG9tb3lvX3dyaXRlX2Fuc3dlcihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3sKKwljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVfYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwl1bnNpZ25lZCBpbnQgc2VyaWFsOworCXVuc2lnbmVkIGludCBhbnN3ZXI7CisJc3Bpbl9sb2NrKCZ0b21veW9fcXVlcnlfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnRvbW95b19xdWVyeV9saXN0KSB7CisJCXN0cnVjdCB0b21veW9fcXVlcnkgKnB0ciA9IGxpc3RfZW50cnkodG1wLCB0eXBlb2YoKnB0ciksIGxpc3QpOworCQlwdHItPnRpbWVyID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCWlmIChzc2NhbmYoZGF0YSwgIkEldT0ldSIsICZzZXJpYWwsICZhbnN3ZXIpICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZ0b21veW9fcXVlcnlfbGlzdCkgeworCQlzdHJ1Y3QgdG9tb3lvX3F1ZXJ5ICpwdHIgPSBsaXN0X2VudHJ5KHRtcCwgdHlwZW9mKCpwdHIpLCBsaXN0KTsKKwkJaWYgKHB0ci0+c2VyaWFsICE9IHNlcmlhbCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXB0ci0+YW5zd2VyKQorCQkJcHRyLT5hbnN3ZXIgPSBhbnN3ZXI7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTkxMywxMyArMTc0NCwxMiBAQAogICoKICAqIFJldHVybnMgdmVyc2lvbiBpbmZvcm1hdGlvbi4KICAqLwotc3RhdGljIGludCB0b21veW9fcmVhZF92ZXJzaW9uKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQorc3RhdGljIHZvaWQgdG9tb3lvX3JlYWRfdmVyc2lvbihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKIHsKLQlpZiAoIWhlYWQtPnJlYWRfZW9mKSB7Ci0JCXRvbW95b19pb19wcmludGYoaGVhZCwgIjIuMi4wIik7Ci0JCWhlYWQtPnJlYWRfZW9mID0gdHJ1ZTsKKwlpZiAoIWhlYWQtPnIuZW9mKSB7CisJCXRvbW95b19pb19wcmludGYoaGVhZCwgIjIuMy4wIik7CisJCWhlYWQtPnIuZW9mID0gdHJ1ZTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTkyOSwxOCArMTc1OSwxNyBAQAogICoKICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvY2VzcydzIGRvbWFpbm5hbWUuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3JlYWRfc2VsZl9kb21haW4oc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCitzdGF0aWMgdm9pZCB0b21veW9fcmVhZF9zZWxmX2RvbWFpbihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKIHsKLQlpZiAoIWhlYWQtPnJlYWRfZW9mKSB7CisJaWYgKCFoZWFkLT5yLmVvZikgewogCQkvKgogCQkgKiB0b21veW9fZG9tYWluKCktPmRvbWFpbm5hbWUgIT0gTlVMTAogCQkgKiBiZWNhdXNlIGV2ZXJ5IHByb2Nlc3MgYmVsb25ncyB0byBhIGRvbWFpbiBhbmQKIAkJICogdGhlIGRvbWFpbidzIG5hbWUgY2Fubm90IGJlIE5VTEwuCiAJCSAqLwogCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICIlcyIsIHRvbW95b19kb21haW4oKS0+ZG9tYWlubmFtZS0+bmFtZSk7Ci0JCWhlYWQtPnJlYWRfZW9mID0gdHJ1ZTsKKwkJaGVhZC0+ci5lb2YgPSB0cnVlOwogCX0KLQlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xOTUzLDIzICsxNzgyLDI0IEBACiAgKgogICogQ2FsbGVyIGFjcXVpcmVzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fb3Blbl9jb250cm9sKGNvbnN0IHU4IHR5cGUsIHN0cnVjdCBmaWxlICpmaWxlKQoraW50IHRvbW95b19vcGVuX2NvbnRyb2woY29uc3QgdTggdHlwZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQgPSBremFsbG9jKHNpemVvZigqaGVhZCksIEdGUF9OT0ZTKTsKIAogCWlmICghaGVhZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJbXV0ZXhfaW5pdCgmaGVhZC0+aW9fc2VtKTsKKwloZWFkLT50eXBlID0gdHlwZTsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFRPTU9ZT19ET01BSU5QT0xJQ1k6CiAJCS8qIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5ICovCi0JCWhlYWQtPndyaXRlID0gdG9tb3lvX3dyaXRlX2RvbWFpbl9wb2xpY3k7Ci0JCWhlYWQtPnJlYWQgPSB0b21veW9fcmVhZF9kb21haW5fcG9saWN5OworCQloZWFkLT53cml0ZSA9IHRvbW95b193cml0ZV9kb21haW47CisJCWhlYWQtPnJlYWQgPSB0b21veW9fcmVhZF9kb21haW47CiAJCWJyZWFrOwogCWNhc2UgVE9NT1lPX0VYQ0VQVElPTlBPTElDWToKIAkJLyogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kgKi8KLQkJaGVhZC0+d3JpdGUgPSB0b21veW9fd3JpdGVfZXhjZXB0aW9uX3BvbGljeTsKLQkJaGVhZC0+cmVhZCA9IHRvbW95b19yZWFkX2V4Y2VwdGlvbl9wb2xpY3k7CisJCWhlYWQtPndyaXRlID0gdG9tb3lvX3dyaXRlX2V4Y2VwdGlvbjsKKwkJaGVhZC0+cmVhZCA9IHRvbW95b19yZWFkX2V4Y2VwdGlvbjsKIAkJYnJlYWs7CiAJY2FzZSBUT01PWU9fU0VMRkRPTUFJTjoKIAkJLyogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3NlbGZfZG9tYWluICovCkBAIC0yMDAxLDEwICsxODMxLDE1IEBACiAJCWhlYWQtPndyaXRlID0gdG9tb3lvX3dyaXRlX3Byb2ZpbGU7CiAJCWhlYWQtPnJlYWQgPSB0b21veW9fcmVhZF9wcm9maWxlOwogCQlicmVhazsKKwljYXNlIFRPTU9ZT19RVUVSWTogLyogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3F1ZXJ5ICovCisJCWhlYWQtPnBvbGwgPSB0b21veW9fcG9sbF9xdWVyeTsKKwkJaGVhZC0+d3JpdGUgPSB0b21veW9fd3JpdGVfYW5zd2VyOworCQloZWFkLT5yZWFkID0gdG9tb3lvX3JlYWRfcXVlcnk7CisJCWJyZWFrOwogCWNhc2UgVE9NT1lPX01BTkFHRVI6CiAJCS8qIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyICovCi0JCWhlYWQtPndyaXRlID0gdG9tb3lvX3dyaXRlX21hbmFnZXJfcG9saWN5OwotCQloZWFkLT5yZWFkID0gdG9tb3lvX3JlYWRfbWFuYWdlcl9wb2xpY3k7CisJCWhlYWQtPndyaXRlID0gdG9tb3lvX3dyaXRlX21hbmFnZXI7CisJCWhlYWQtPnJlYWQgPSB0b21veW9fcmVhZF9tYW5hZ2VyOwogCQlicmVhazsKIAl9CiAJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKQEAgLTIwMTMsNyArMTg0OCw5IEBACiAJCSAqIGZvciByZWFkaW5nLgogCQkgKi8KIAkJaGVhZC0+cmVhZCA9IE5VTEw7Ci0JfSBlbHNlIHsKKwkJaGVhZC0+cG9sbCA9IE5VTEw7CisJfSBlbHNlIGlmICghaGVhZC0+cG9sbCkgeworCQkvKiBEb24ndCBhbGxvY2F0ZSByZWFkX2J1ZiBmb3IgcG9sbCgpIGFjY2Vzcy4gKi8KIAkJaWYgKCFoZWFkLT5yZWFkYnVmX3NpemUpCiAJCQloZWFkLT5yZWFkYnVmX3NpemUgPSA0MDk2ICogMjsKIAkJaGVhZC0+cmVhZF9idWYgPSBremFsbG9jKGhlYWQtPnJlYWRidWZfc2l6ZSwgR0ZQX05PRlMpOwpAQCAtMjAzNyw3ICsxODc0LDggQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQotCWhlYWQtPnJlYWRlcl9pZHggPSB0b21veW9fcmVhZF9sb2NrKCk7CisJaWYgKHR5cGUgIT0gVE9NT1lPX1FVRVJZKQorCQloZWFkLT5yZWFkZXJfaWR4ID0gdG9tb3lvX3JlYWRfbG9jaygpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGhlYWQ7CiAJLyoKIAkgKiBDYWxsIHRoZSBoYW5kbGVyIG5vdyBpZiB0aGUgZmlsZSBpcwpAQCAtMjA0OCwxMCArMTg4NiwzNSBAQAogCSAqLwogCWlmICh0eXBlID09IFRPTU9ZT19TRUxGRE9NQUlOKQogCQl0b21veW9fcmVhZF9jb250cm9sKGZpbGUsIE5VTEwsIDApOworCS8qCisJICogSWYgdGhlIGZpbGUgaXMgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3F1ZXJ5ICwgaW5jcmVtZW50IHRoZQorCSAqIG9ic2VydmVyIGNvdW50ZXIuCisJICogVGhlIG9ic2VyYmVyIGNvdW50ZXIgaXMgdXNlZCBieSB0b21veW9fc3VwZXJ2aXNvcigpIHRvIHNlZSBpZgorCSAqIHRoZXJlIGlzIHNvbWUgcHJvY2VzcyBtb25pdG9yaW5nIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9xdWVyeS4KKwkgKi8KKwllbHNlIGlmICh0eXBlID09IFRPTU9ZT19RVUVSWSkKKwkJYXRvbWljX2luYygmdG9tb3lvX3F1ZXJ5X29ic2VydmVycyk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgorICogdG9tb3lvX3BvbGxfY29udHJvbCAtIHBvbGwoKSBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCisgKgorICogQGZpbGU6IFBvaW50ZXIgdG8gInN0cnVjdCBmaWxlIi4KKyAqIEB3YWl0OiBQb2ludGVyIHRvICJwb2xsX3RhYmxlIi4KKyAqCisgKiBXYWl0cyBmb3IgcmVhZCByZWFkaW5lc3MuCisgKiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vcXVlcnkgaXMgaGFuZGxlZCBieSAvdXNyL3NiaW4vdG9tb3lvLXF1ZXJ5ZCAuCisgKi8KK2ludCB0b21veW9fcG9sbF9jb250cm9sKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghaGVhZC0+cG9sbCkKKwkJcmV0dXJuIC1FTk9TWVM7CisJcmV0dXJuIGhlYWQtPnBvbGwoZmlsZSwgd2FpdCk7Cit9CisKKy8qKgogICogdG9tb3lvX3JlYWRfY29udHJvbCAtIHJlYWQoKSBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCiAgKgogICogQGZpbGU6ICAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCBmaWxlIi4KQEAgLTIwNjIsMzYgKzE5MjUsMjMgQEAKICAqCiAgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCi1zdGF0aWMgaW50IHRvbW95b19yZWFkX2NvbnRyb2woc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkgICAgICAgY29uc3QgaW50IGJ1ZmZlcl9sZW4pCitpbnQgdG9tb3lvX3JlYWRfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCWNvbnN0IGludCBidWZmZXJfbGVuKQogewotCWludCBsZW4gPSAwOworCWludCBsZW47CiAJc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqY3A7CiAKIAlpZiAoIWhlYWQtPnJlYWQpCiAJCXJldHVybiAtRU5PU1lTOwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhlYWQtPmlvX3NlbSkpCiAJCXJldHVybiAtRUlOVFI7Ci0JLyogQ2FsbCB0aGUgcG9saWN5IGhhbmRsZXIuICovCi0JbGVuID0gaGVhZC0+cmVhZChoZWFkKTsKLQlpZiAobGVuIDwgMCkKLQkJZ290byBvdXQ7Ci0JLyogV3JpdGUgdG8gYnVmZmVyLiAqLwotCWxlbiA9IGhlYWQtPnJlYWRfYXZhaWw7Ci0JaWYgKGxlbiA+IGJ1ZmZlcl9sZW4pCi0JCWxlbiA9IGJ1ZmZlcl9sZW47Ci0JaWYgKCFsZW4pCi0JCWdvdG8gb3V0OwotCS8qIGhlYWQtPnJlYWRfYnVmIGNoYW5nZXMgYnkgc29tZSBmdW5jdGlvbnMuICovCi0JY3AgPSBoZWFkLT5yZWFkX2J1ZjsKLQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgY3AsIGxlbikpIHsKLQkJbGVuID0gLUVGQVVMVDsKLQkJZ290byBvdXQ7Ci0JfQotCWhlYWQtPnJlYWRfYXZhaWwgLT0gbGVuOwotCW1lbW1vdmUoY3AsIGNwICsgbGVuLCBoZWFkLT5yZWFkX2F2YWlsKTsKLSBvdXQ6CisJaGVhZC0+cmVhZF91c2VyX2J1ZiA9IGJ1ZmZlcjsKKwloZWFkLT5yZWFkX3VzZXJfYnVmX2F2YWlsID0gYnVmZmVyX2xlbjsKKwlpZiAodG9tb3lvX2ZsdXNoKGhlYWQpKQorCQkvKiBDYWxsIHRoZSBwb2xpY3kgaGFuZGxlci4gKi8KKwkJaGVhZC0+cmVhZChoZWFkKTsKKwl0b21veW9fZmx1c2goaGVhZCk7CisJbGVuID0gaGVhZC0+cmVhZF91c2VyX2J1ZiAtIGJ1ZmZlcjsKIAltdXRleF91bmxvY2soJmhlYWQtPmlvX3NlbSk7CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTIxMDcsOCArMTk1Nyw4IEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fd3JpdGVfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQljb25zdCBpbnQgYnVmZmVyX2xlbikKK2ludCB0b21veW9fd3JpdGVfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSBjb25zdCBpbnQgYnVmZmVyX2xlbikKIHsKIAlzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyb3IgPSBidWZmZXJfbGVuOwpAQCAtMjEyMSw4ICsxOTcxLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJLyogRG9uJ3QgYWxsb3cgdXBkYXRpbmcgcG9saWNpZXMgYnkgbm9uIG1hbmFnZXIgcHJvZ3JhbXMuICovCiAJaWYgKGhlYWQtPndyaXRlICE9IHRvbW95b193cml0ZV9waWQgJiYKLQkgICAgaGVhZC0+d3JpdGUgIT0gdG9tb3lvX3dyaXRlX2RvbWFpbl9wb2xpY3kgJiYKLQkgICAgIXRvbW95b19pc19wb2xpY3lfbWFuYWdlcigpKQorCSAgICBoZWFkLT53cml0ZSAhPSB0b21veW9fd3JpdGVfZG9tYWluICYmICF0b21veW9fbWFuYWdlcigpKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhlYWQtPmlvX3NlbSkpCiAJCXJldHVybiAtRUlOVFI7CkBAIC0yMTU5LDEyICsyMDA4LDE5IEBACiAgKgogICogQ2FsbGVyIGxvb3NlcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX2Nsb3NlX2NvbnRyb2woc3RydWN0IGZpbGUgKmZpbGUpCitpbnQgdG9tb3lvX2Nsb3NlX2NvbnRyb2woc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY29uc3QgYm9vbCBpc193cml0ZSA9ICEhaGVhZC0+d3JpdGVfYnVmOwogCi0JdG9tb3lvX3JlYWRfdW5sb2NrKGhlYWQtPnJlYWRlcl9pZHgpOworCS8qCisJICogSWYgdGhlIGZpbGUgaXMgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3F1ZXJ5ICwgZGVjcmVtZW50IHRoZQorCSAqIG9ic2VydmVyIGNvdW50ZXIuCisJICovCisJaWYgKGhlYWQtPnR5cGUgPT0gVE9NT1lPX1FVRVJZKQorCQlhdG9taWNfZGVjKCZ0b21veW9fcXVlcnlfb2JzZXJ2ZXJzKTsKKwllbHNlCisJCXRvbW95b19yZWFkX3VubG9jayhoZWFkLT5yZWFkZXJfaWR4KTsKIAkvKiBSZWxlYXNlIG1lbW9yeSB1c2VkIGZvciBwb2xpY3kgSS9PLiAqLwogCWtmcmVlKGhlYWQtPnJlYWRfYnVmKTsKIAloZWFkLT5yZWFkX2J1ZiA9IE5VTEw7CkBAIC0yMTc5LDEyOSArMjAzNSwyNSBAQAogfQogCiAvKioKLSAqIHRvbW95b19vcGVuIC0gb3BlbigpIGZvciAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4KLSAqCi0gKiBAaW5vZGU6IFBvaW50ZXIgdG8gInN0cnVjdCBpbm9kZSIuCi0gKiBAZmlsZTogIFBvaW50ZXIgdG8gInN0cnVjdCBmaWxlIi4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICogdG9tb3lvX2NoZWNrX3Byb2ZpbGUgLSBDaGVjayBhbGwgcHJvZmlsZXMgY3VycmVudGx5IGFzc2lnbmVkIHRvIGRvbWFpbnMgYXJlIGRlZmluZWQuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit2b2lkIHRvbW95b19jaGVja19wcm9maWxlKHZvaWQpCiB7Ci0JY29uc3QgaW50IGtleSA9ICgodTggKikgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlKQotCQktICgodTggKikgTlVMTCk7Ci0JcmV0dXJuIHRvbW95b19vcGVuX2NvbnRyb2woa2V5LCBmaWxlKTsKKwlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW47CisJY29uc3QgaW50IGlkeCA9IHRvbW95b19yZWFkX2xvY2soKTsKKwl0b21veW9fcG9saWN5X2xvYWRlZCA9IHRydWU7CisJLyogQ2hlY2sgYWxsIHByb2ZpbGVzIGN1cnJlbnRseSBhc3NpZ25lZCB0byBkb21haW5zIGFyZSBkZWZpbmVkLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRvbWFpbiwgJnRvbW95b19kb21haW5fbGlzdCwgbGlzdCkgeworCQljb25zdCB1OCBwcm9maWxlID0gZG9tYWluLT5wcm9maWxlOworCQlpZiAodG9tb3lvX3Byb2ZpbGVfcHRyW3Byb2ZpbGVdKQorCQkJY29udGludWU7CisJCXBhbmljKCJQcm9maWxlICV1ICh1c2VkIGJ5ICclcycpIG5vdCBkZWZpbmVkLlxuIiwKKwkJICAgICAgcHJvZmlsZSwgZG9tYWluLT5kb21haW5uYW1lLT5uYW1lKTsKKwl9CisJdG9tb3lvX3JlYWRfdW5sb2NrKGlkeCk7CisJaWYgKHRvbW95b19wcm9maWxlX3ZlcnNpb24gIT0gMjAwOTA5MDMpCisJCXBhbmljKCJQcm9maWxlIHZlcnNpb24gJXUgaXMgbm90IHN1cHBvcnRlZC5cbiIsCisJCSAgICAgIHRvbW95b19wcm9maWxlX3ZlcnNpb24pOworCXByaW50ayhLRVJOX0lORk8gIlRPTU9ZTzogMi4zLjBcbiIpOworCXByaW50ayhLRVJOX0lORk8gIk1hbmRhdG9yeSBBY2Nlc3MgQ29udHJvbCBhY3RpdmF0ZWQuXG4iKTsKIH0KLQotLyoqCi0gKiB0b21veW9fcmVsZWFzZSAtIGNsb3NlKCkgZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgotICoKLSAqIEBpbm9kZTogUG9pbnRlciB0byAic3RydWN0IGlub2RlIi4KLSAqIEBmaWxlOiAgUG9pbnRlciB0byAic3RydWN0IGZpbGUiLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHRvbW95b19jbG9zZV9jb250cm9sKGZpbGUpOwotfQotCi0vKioKLSAqIHRvbW95b19yZWFkIC0gcmVhZCgpIGZvciAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4KLSAqCi0gKiBAZmlsZTogIFBvaW50ZXIgdG8gInN0cnVjdCBmaWxlIi4KLSAqIEBidWY6ICAgUG9pbnRlciB0byBidWZmZXIuCi0gKiBAY291bnQ6IFNpemUgb2YgQGJ1Zi4KLSAqIEBwcG9zOiAgVW51c2VkLgotICoKLSAqIFJldHVybnMgYnl0ZXMgcmVhZCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHRvbW95b19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgICBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIHRvbW95b19yZWFkX2NvbnRyb2woZmlsZSwgYnVmLCBjb3VudCk7Ci19Ci0KLS8qKgotICogdG9tb3lvX3dyaXRlIC0gd3JpdGUoKSBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCi0gKgotICogQGZpbGU6ICBQb2ludGVyIHRvICJzdHJ1Y3QgZmlsZSIuCi0gKiBAYnVmOiAgIFBvaW50ZXIgdG8gYnVmZmVyLgotICogQGNvdW50OiBTaXplIG9mIEBidWYuCi0gKiBAcHBvczogIFVudXNlZC4KLSAqCi0gKiBSZXR1cm5zIEBjb3VudCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHRvbW95b193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gdG9tb3lvX3dyaXRlX2NvbnRyb2woZmlsZSwgYnVmLCBjb3VudCk7Ci19Ci0KLS8qCi0gKiB0b21veW9fb3BlcmF0aW9ucyBpcyBhICJzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIiB3aGljaCBpcyB1c2VkIGZvciBoYW5kbGluZwotICogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCi0gKgotICogU29tZSBmaWxlcyB1bmRlciAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGRpcmVjdG9yeSBhY2NlcHQgb3BlbihPX1JEV1IpLgotICogU2VlIHRvbW95b19pb19idWZmZXIgZm9yIGludGVybmFscy4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdG9tb3lvX29wZXJhdGlvbnMgPSB7Ci0JLm9wZW4gICAgPSB0b21veW9fb3BlbiwKLQkucmVsZWFzZSA9IHRvbW95b19yZWxlYXNlLAotCS5yZWFkICAgID0gdG9tb3lvX3JlYWQsCi0JLndyaXRlICAgPSB0b21veW9fd3JpdGUsCi19OwotCi0vKioKLSAqIHRvbW95b19jcmVhdGVfZW50cnkgLSBDcmVhdGUgaW50ZXJmYWNlIGZpbGVzIHVuZGVyIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gZGlyZWN0b3J5LgotICoKLSAqIEBuYW1lOiAgIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KLSAqIEBtb2RlOiAgIFRoZSBwZXJtaXNzaW9uIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KLSAqIEBwYXJlbnQ6IFRoZSBwYXJlbnQgZGlyZWN0b3J5LgotICogQGtleTogICAgVHlwZSBvZiBpbnRlcmZhY2UuCi0gKgotICogUmV0dXJucyBub3RoaW5nLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdG9tb3lvX2NyZWF0ZV9lbnRyeShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBtb2RlX3QgbW9kZSwKLQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjb25zdCB1OCBrZXkpCi17Ci0Jc2VjdXJpdHlmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsICgodTggKikgTlVMTCkgKyBrZXksCi0JCQkgICAgICAgJnRvbW95b19vcGVyYXRpb25zKTsKLX0KLQotLyoqCi0gKiB0b21veW9faW5pdGVyZmFjZV9pbml0IC0gSW5pdGlhbGl6ZSAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4KLSAqCi0gKiBSZXR1cm5zIDAuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHRvbW95b19pbml0ZXJmYWNlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICp0b21veW9fZGlyOwotCi0JLyogRG9uJ3QgY3JlYXRlIHNlY3VyaXR5ZnMgZW50cmllcyB1bmxlc3MgcmVnaXN0ZXJlZC4gKi8KLQlpZiAoY3VycmVudF9jcmVkKCktPnNlY3VyaXR5ICE9ICZ0b21veW9fa2VybmVsX2RvbWFpbikKLQkJcmV0dXJuIDA7Ci0KLQl0b21veW9fZGlyID0gc2VjdXJpdHlmc19jcmVhdGVfZGlyKCJ0b21veW8iLCBOVUxMKTsKLQl0b21veW9fY3JlYXRlX2VudHJ5KCJkb21haW5fcG9saWN5IiwgICAgMDYwMCwgdG9tb3lvX2RpciwKLQkJCSAgICBUT01PWU9fRE9NQUlOUE9MSUNZKTsKLQl0b21veW9fY3JlYXRlX2VudHJ5KCJleGNlcHRpb25fcG9saWN5IiwgMDYwMCwgdG9tb3lvX2RpciwKLQkJCSAgICBUT01PWU9fRVhDRVBUSU9OUE9MSUNZKTsKLQl0b21veW9fY3JlYXRlX2VudHJ5KCJzZWxmX2RvbWFpbiIsICAgICAgMDQwMCwgdG9tb3lvX2RpciwKLQkJCSAgICBUT01PWU9fU0VMRkRPTUFJTik7Ci0JdG9tb3lvX2NyZWF0ZV9lbnRyeSgiLmRvbWFpbl9zdGF0dXMiLCAgIDA2MDAsIHRvbW95b19kaXIsCi0JCQkgICAgVE9NT1lPX0RPTUFJTl9TVEFUVVMpOwotCXRvbW95b19jcmVhdGVfZW50cnkoIi5wcm9jZXNzX3N0YXR1cyIsICAwNjAwLCB0b21veW9fZGlyLAotCQkJICAgIFRPTU9ZT19QUk9DRVNTX1NUQVRVUyk7Ci0JdG9tb3lvX2NyZWF0ZV9lbnRyeSgibWVtaW5mbyIsICAgICAgICAgIDA2MDAsIHRvbW95b19kaXIsCi0JCQkgICAgVE9NT1lPX01FTUlORk8pOwotCXRvbW95b19jcmVhdGVfZW50cnkoInByb2ZpbGUiLCAgICAgICAgICAwNjAwLCB0b21veW9fZGlyLAotCQkJICAgIFRPTU9ZT19QUk9GSUxFKTsKLQl0b21veW9fY3JlYXRlX2VudHJ5KCJtYW5hZ2VyIiwgICAgICAgICAgMDYwMCwgdG9tb3lvX2RpciwKLQkJCSAgICBUT01PWU9fTUFOQUdFUik7Ci0JdG9tb3lvX2NyZWF0ZV9lbnRyeSgidmVyc2lvbiIsICAgICAgICAgIDA0MDAsIHRvbW95b19kaXIsCi0JCQkgICAgVE9NT1lPX1ZFUlNJT04pOwotCXJldHVybiAwOwotfQotCi1mc19pbml0Y2FsbCh0b21veW9faW5pdGVyZmFjZV9pbml0KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uaCBiL3NlY3VyaXR5L3RvbW95by9jb21tb24uaAppbmRleCA5ZjFhZTVlLi4wNDQ1NGNiN2IgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uaAorKysgYi9zZWN1cml0eS90b21veW8vY29tbW9uLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jcmVkLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogc3RydWN0IGxpbnV4X2JpbnBybTsKIAogLyoqKioqKioqKiogQ29uc3RhbnRzIGRlZmluaXRpb25zLiAqKioqKioqKioqLwpAQCAtMzIsMjAgKzMzLDQ0IEBACiAjZGVmaW5lIFRPTU9ZT19IQVNIX0JJVFMgIDgKICNkZWZpbmUgVE9NT1lPX01BWF9IQVNIICgxdTw8VE9NT1lPX0hBU0hfQklUUykKIAotLyoKLSAqIFRoaXMgaXMgdGhlIG1heCBsZW5ndGggb2YgYSB0b2tlbi4KLSAqCi0gKiBBIHRva2VuIGNvbnNpc3RzIG9mIG9ubHkgQVNDSUkgcHJpbnRhYmxlIGNoYXJhY3RlcnMuCi0gKiBOb24gcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gYSB0b2tlbiBpcyByZXByZXNlbnRlZCBpbiBcb29vIHN0eWxlCi0gKiBvY3RhbCBzdHJpbmcuIFRodXMsIFwgaXRzZWxmIGlzIHJlcHJlc2VudGVkIGFzIFxcLgotICovCi0jZGVmaW5lIFRPTU9ZT19NQVhfUEFUSE5BTUVfTEVOIDQwMDAKKyNkZWZpbmUgVE9NT1lPX0VYRUNfVE1QU0laRSAgICAgNDA5NgogCiAvKiBQcm9maWxlIG51bWJlciBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiAqLwogI2RlZmluZSBUT01PWU9fTUFYX1BST0ZJTEVTIDI1NgogCitlbnVtIHRvbW95b19tb2RlX2luZGV4IHsKKwlUT01PWU9fQ09ORklHX0RJU0FCTEVELAorCVRPTU9ZT19DT05GSUdfTEVBUk5JTkcsCisJVE9NT1lPX0NPTkZJR19QRVJNSVNTSVZFLAorCVRPTU9ZT19DT05GSUdfRU5GT1JDSU5HLAorCVRPTU9ZT19DT05GSUdfVVNFX0RFRkFVTFQgPSAyNTUKK307CisKK2VudW0gdG9tb3lvX3BvbGljeV9pZCB7CisJVE9NT1lPX0lEX0dST1VQLAorCVRPTU9ZT19JRF9QQVRIX0dST1VQLAorCVRPTU9ZT19JRF9OVU1CRVJfR1JPVVAsCisJVE9NT1lPX0lEX1RSQU5TSVRJT05fQ09OVFJPTCwKKwlUT01PWU9fSURfQUdHUkVHQVRPUiwKKwlUT01PWU9fSURfR0xPQkFMTFlfUkVBREFCTEUsCisJVE9NT1lPX0lEX1BBVFRFUk4sCisJVE9NT1lPX0lEX05PX1JFV1JJVEUsCisJVE9NT1lPX0lEX01BTkFHRVIsCisJVE9NT1lPX0lEX05BTUUsCisJVE9NT1lPX0lEX0FDTCwKKwlUT01PWU9fSURfRE9NQUlOLAorCVRPTU9ZT19NQVhfUE9MSUNZCit9OworCitlbnVtIHRvbW95b19ncm91cF9pZCB7CisJVE9NT1lPX1BBVEhfR1JPVVAsCisJVE9NT1lPX05VTUJFUl9HUk9VUCwKKwlUT01PWU9fTUFYX0dST1VQCit9OworCiAvKiBLZXl3b3JkcyBmb3IgQUNMcy4gKi8KLSNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfQUxJQVMgICAgICAgICAgICAgICAgICAgICAiYWxpYXMgIgorI2RlZmluZSBUT01PWU9fS0VZV09SRF9BR0dSRUdBVE9SICAgICAgICAgICAgICAgICJhZ2dyZWdhdG9yICIKKyNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfQUxMT1dfTU9VTlQgICAgICAgICAgICAgICAiYWxsb3dfbW91bnQgIgogI2RlZmluZSBUT01PWU9fS0VZV09SRF9BTExPV19SRUFEICAgICAgICAgICAgICAgICJhbGxvd19yZWFkICIKICNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfREVMRVRFICAgICAgICAgICAgICAgICAgICAiZGVsZXRlICIKICNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfREVOWV9SRVdSSVRFICAgICAgICAgICAgICAiZGVueV9yZXdyaXRlICIKQEAgLTU1LDM2ICs4MCw1MSBAQAogI2RlZmluZSBUT01PWU9fS0VZV09SRF9OT19JTklUSUFMSVpFX0RPTUFJTiAgICAgICJub19pbml0aWFsaXplX2RvbWFpbiAiCiAjZGVmaW5lIFRPTU9ZT19LRVlXT1JEX05PX0tFRVBfRE9NQUlOICAgICAgICAgICAgIm5vX2tlZXBfZG9tYWluICIKICNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfUEFUSF9HUk9VUCAgICAgICAgICAgICAgICAicGF0aF9ncm91cCAiCisjZGVmaW5lIFRPTU9ZT19LRVlXT1JEX05VTUJFUl9HUk9VUCAgICAgICAgICAgICAgIm51bWJlcl9ncm91cCAiCiAjZGVmaW5lIFRPTU9ZT19LRVlXT1JEX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAiCiAjZGVmaW5lIFRPTU9ZT19LRVlXT1JEX1VTRV9QUk9GSUxFICAgICAgICAgICAgICAgInVzZV9wcm9maWxlICIKICNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfSUdOT1JFX0dMT0JBTF9BTExPV19SRUFEICAiaWdub3JlX2dsb2JhbF9hbGxvd19yZWFkIgorI2RlZmluZSBUT01PWU9fS0VZV09SRF9RVU9UQV9FWENFRURFRCAgICAgICAgICAgICJxdW90YV9leGNlZWRlZCIKKyNkZWZpbmUgVE9NT1lPX0tFWVdPUkRfVFJBTlNJVElPTl9GQUlMRUQgICAgICAgICAidHJhbnNpdGlvbl9mYWlsZWQiCiAvKiBBIGRvbWFpbiBkZWZpbml0aW9uIHN0YXJ0cyB3aXRoIDxrZXJuZWw+LiAqLwogI2RlZmluZSBUT01PWU9fUk9PVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICI8a2VybmVsPiIKICNkZWZpbmUgVE9NT1lPX1JPT1RfTkFNRV9MRU4gICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFRPTU9ZT19ST09UX05BTUUpIC0gMSkKIAotLyogSW5kZXggbnVtYmVycyBmb3IgQWNjZXNzIENvbnRyb2xzLiAqLwotZW51bSB0b21veW9fbWFjX2luZGV4IHsKLQlUT01PWU9fTUFDX0ZPUl9GSUxFLCAgLyogZG9tYWluX3BvbGljeS5jb25mICovCi0JVE9NT1lPX01BWF9BQ0NFUFRfRU5UUlksCi0JVE9NT1lPX1ZFUkJPU0UsCi0JVE9NT1lPX01BWF9DT05UUk9MX0lOREVYCisvKiBWYWx1ZSB0eXBlIGRlZmluaXRpb24uICovCisjZGVmaW5lIFRPTU9ZT19WQUxVRV9UWVBFX0lOVkFMSUQgICAgIDAKKyNkZWZpbmUgVE9NT1lPX1ZBTFVFX1RZUEVfREVDSU1BTCAgICAgMQorI2RlZmluZSBUT01PWU9fVkFMVUVfVFlQRV9PQ1RBTCAgICAgICAyCisjZGVmaW5lIFRPTU9ZT19WQUxVRV9UWVBFX0hFWEFERUNJTUFMIDMKKworZW51bSB0b21veW9fdHJhbnNpdGlvbl90eXBlIHsKKwkvKiBEbyBub3QgY2hhbmdlIHRoaXMgb3JkZXIsICovCisJVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9OT19JTklUSUFMSVpFLAorCVRPTU9ZT19UUkFOU0lUSU9OX0NPTlRST0xfSU5JVElBTElaRSwKKwlUT01PWU9fVFJBTlNJVElPTl9DT05UUk9MX05PX0tFRVAsCisJVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9LRUVQLAorCVRPTU9ZT19NQVhfVFJBTlNJVElPTl9UWVBFCiB9OwogCiAvKiBJbmRleCBudW1iZXJzIGZvciBBY2Nlc3MgQ29udHJvbHMuICovCiBlbnVtIHRvbW95b19hY2xfZW50cnlfdHlwZV9pbmRleCB7CiAJVE9NT1lPX1RZUEVfUEFUSF9BQ0wsCiAJVE9NT1lPX1RZUEVfUEFUSDJfQUNMLAorCVRPTU9ZT19UWVBFX1BBVEhfTlVNQkVSX0FDTCwKKwlUT01PWU9fVFlQRV9NS0RFVl9BQ0wsCisJVE9NT1lPX1RZUEVfTU9VTlRfQUNMLAogfTsKIAogLyogSW5kZXggbnVtYmVycyBmb3IgRmlsZSBDb250cm9scy4gKi8KIAogLyoKLSAqIFRZUEVfUkVBRF9XUklURV9BQ0wgaXMgc3BlY2lhbC4gVFlQRV9SRUFEX1dSSVRFX0FDTCBpcyBhdXRvbWF0aWNhbGx5IHNldAotICogaWYgYm90aCBUWVBFX1JFQURfQUNMIGFuZCBUWVBFX1dSSVRFX0FDTCBhcmUgc2V0LiBCb3RoIFRZUEVfUkVBRF9BQ0wgYW5kCi0gKiBUWVBFX1dSSVRFX0FDTCBhcmUgYXV0b21hdGljYWxseSBzZXQgaWYgVFlQRV9SRUFEX1dSSVRFX0FDTCBpcyBzZXQuCi0gKiBUWVBFX1JFQURfV1JJVEVfQUNMIGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBpZiBlaXRoZXIgVFlQRV9SRUFEX0FDTCBvcgotICogVFlQRV9XUklURV9BQ0wgaXMgY2xlYXJlZC4gQm90aCBUWVBFX1JFQURfQUNMIGFuZCBUWVBFX1dSSVRFX0FDTCBhcmUKLSAqIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBpZiBUWVBFX1JFQURfV1JJVEVfQUNMIGlzIGNsZWFyZWQuCisgKiBUT01PWU9fVFlQRV9SRUFEX1dSSVRFIGlzIHNwZWNpYWwuIFRPTU9ZT19UWVBFX1JFQURfV1JJVEUgaXMgYXV0b21hdGljYWxseQorICogc2V0IGlmIGJvdGggVE9NT1lPX1RZUEVfUkVBRCBhbmQgVE9NT1lPX1RZUEVfV1JJVEUgYXJlIHNldC4KKyAqIEJvdGggVE9NT1lPX1RZUEVfUkVBRCBhbmQgVE9NT1lPX1RZUEVfV1JJVEUgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGlmCisgKiBUT01PWU9fVFlQRV9SRUFEX1dSSVRFIGlzIHNldC4KKyAqIFRPTU9ZT19UWVBFX1JFQURfV1JJVEUgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGlmIGVpdGhlciBUT01PWU9fVFlQRV9SRUFECisgKiBvciBUT01PWU9fVFlQRV9XUklURSBpcyBjbGVhcmVkLgorICogQm90aCBUT01PWU9fVFlQRV9SRUFEIGFuZCBUT01PWU9fVFlQRV9XUklURSBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIGlmCisgKiBUT01PWU9fVFlQRV9SRUFEX1dSSVRFIGlzIGNsZWFyZWQuCiAgKi8KIAogZW51bSB0b21veW9fcGF0aF9hY2xfaW5kZXggewpAQCAtOTIsMjcgKzEzMiwyNCBAQAogCVRPTU9ZT19UWVBFX0VYRUNVVEUsCiAJVE9NT1lPX1RZUEVfUkVBRCwKIAlUT01PWU9fVFlQRV9XUklURSwKLQlUT01PWU9fVFlQRV9DUkVBVEUsCiAJVE9NT1lPX1RZUEVfVU5MSU5LLAotCVRPTU9ZT19UWVBFX01LRElSLAogCVRPTU9ZT19UWVBFX1JNRElSLAotCVRPTU9ZT19UWVBFX01LRklGTywKLQlUT01PWU9fVFlQRV9NS1NPQ0ssCi0JVE9NT1lPX1RZUEVfTUtCTE9DSywKLQlUT01PWU9fVFlQRV9NS0NIQVIsCiAJVE9NT1lPX1RZUEVfVFJVTkNBVEUsCiAJVE9NT1lPX1RZUEVfU1lNTElOSywKIAlUT01PWU9fVFlQRV9SRVdSSVRFLAotCVRPTU9ZT19UWVBFX0lPQ1RMLAotCVRPTU9ZT19UWVBFX0NITU9ELAotCVRPTU9ZT19UWVBFX0NIT1dOLAotCVRPTU9ZT19UWVBFX0NIR1JQLAogCVRPTU9ZT19UWVBFX0NIUk9PVCwKLQlUT01PWU9fVFlQRV9NT1VOVCwKIAlUT01PWU9fVFlQRV9VTU9VTlQsCiAJVE9NT1lPX01BWF9QQVRIX09QRVJBVElPTgogfTsKIAorI2RlZmluZSBUT01PWU9fUldfTUFTSyAoKDEgPDwgVE9NT1lPX1RZUEVfUkVBRCkgfCAoMSA8PCBUT01PWU9fVFlQRV9XUklURSkpCisKK2VudW0gdG9tb3lvX21rZGV2X2FjbF9pbmRleCB7CisJVE9NT1lPX1RZUEVfTUtCTE9DSywKKwlUT01PWU9fVFlQRV9NS0NIQVIsCisJVE9NT1lPX01BWF9NS0RFVl9PUEVSQVRJT04KK307CisKIGVudW0gdG9tb3lvX3BhdGgyX2FjbF9pbmRleCB7CiAJVE9NT1lPX1RZUEVfTElOSywKIAlUT01PWU9fVFlQRV9SRU5BTUUsCkBAIC0xMjAsNiArMTU3LDE4IEBACiAJVE9NT1lPX01BWF9QQVRIMl9PUEVSQVRJT04KIH07CiAKK2VudW0gdG9tb3lvX3BhdGhfbnVtYmVyX2FjbF9pbmRleCB7CisJVE9NT1lPX1RZUEVfQ1JFQVRFLAorCVRPTU9ZT19UWVBFX01LRElSLAorCVRPTU9ZT19UWVBFX01LRklGTywKKwlUT01PWU9fVFlQRV9NS1NPQ0ssCisJVE9NT1lPX1RZUEVfSU9DVEwsCisJVE9NT1lPX1RZUEVfQ0hNT0QsCisJVE9NT1lPX1RZUEVfQ0hPV04sCisJVE9NT1lPX1RZUEVfQ0hHUlAsCisJVE9NT1lPX01BWF9QQVRIX05VTUJFUl9PUEVSQVRJT04KK307CisKIGVudW0gdG9tb3lvX3NlY3VyaXR5ZnNfaW50ZXJmYWNlX2luZGV4IHsKIAlUT01PWU9fRE9NQUlOUE9MSUNZLAogCVRPTU9ZT19FWENFUFRJT05QT0xJQ1ksCkBAIC0xMjksMjAgKzE3OCwxMDkgQEAKIAlUT01PWU9fU0VMRkRPTUFJTiwKIAlUT01PWU9fVkVSU0lPTiwKIAlUT01PWU9fUFJPRklMRSwKKwlUT01PWU9fUVVFUlksCiAJVE9NT1lPX01BTkFHRVIKIH07CiAKK2VudW0gdG9tb3lvX21hY19pbmRleCB7CisJVE9NT1lPX01BQ19GSUxFX0VYRUNVVEUsCisJVE9NT1lPX01BQ19GSUxFX09QRU4sCisJVE9NT1lPX01BQ19GSUxFX0NSRUFURSwKKwlUT01PWU9fTUFDX0ZJTEVfVU5MSU5LLAorCVRPTU9ZT19NQUNfRklMRV9NS0RJUiwKKwlUT01PWU9fTUFDX0ZJTEVfUk1ESVIsCisJVE9NT1lPX01BQ19GSUxFX01LRklGTywKKwlUT01PWU9fTUFDX0ZJTEVfTUtTT0NLLAorCVRPTU9ZT19NQUNfRklMRV9UUlVOQ0FURSwKKwlUT01PWU9fTUFDX0ZJTEVfU1lNTElOSywKKwlUT01PWU9fTUFDX0ZJTEVfUkVXUklURSwKKwlUT01PWU9fTUFDX0ZJTEVfTUtCTE9DSywKKwlUT01PWU9fTUFDX0ZJTEVfTUtDSEFSLAorCVRPTU9ZT19NQUNfRklMRV9MSU5LLAorCVRPTU9ZT19NQUNfRklMRV9SRU5BTUUsCisJVE9NT1lPX01BQ19GSUxFX0NITU9ELAorCVRPTU9ZT19NQUNfRklMRV9DSE9XTiwKKwlUT01PWU9fTUFDX0ZJTEVfQ0hHUlAsCisJVE9NT1lPX01BQ19GSUxFX0lPQ1RMLAorCVRPTU9ZT19NQUNfRklMRV9DSFJPT1QsCisJVE9NT1lPX01BQ19GSUxFX01PVU5ULAorCVRPTU9ZT19NQUNfRklMRV9VTU9VTlQsCisJVE9NT1lPX01BQ19GSUxFX1BJVk9UX1JPT1QsCisJVE9NT1lPX01BWF9NQUNfSU5ERVgKK307CisKK2VudW0gdG9tb3lvX21hY19jYXRlZ29yeV9pbmRleCB7CisJVE9NT1lPX01BQ19DQVRFR09SWV9GSUxFLAorCVRPTU9ZT19NQVhfTUFDX0NBVEVHT1JZX0lOREVYCit9OworCisjZGVmaW5lIFRPTU9ZT19SRVRSWV9SRVFVRVNUIDEgLyogUmV0cnkgdGhpcyByZXF1ZXN0LiAqLworCiAvKioqKioqKioqKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICoqKioqKioqKiovCiAKIC8qCi0gKiB0b21veW9fcGFnZV9idWZmZXIgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZyBhIHBhdGhuYW1lCi0gKiBvYnRhaW5lZCBmcm9tICJzdHJ1Y3QgZGVudHJ5IiBhbmQgInN0cnVjdCB2ZnNtb3VudCIgcGFpci4KLSAqIEFzIG9mIG5vdywgaXQgaXMgNDA5NiBieXRlcy4gSWYgdXNlcnMgY29tcGxhaW4gdGhhdCA0MDk2IGJ5dGVzIGlzIHRvbyBzbWFsbAotICogKGJlY2F1c2UgVE9NT1lPIGVzY2FwZXMgbm9uIEFTQ0lJIHByaW50YWJsZSBjaGFyYWN0ZXJzIHVzaW5nIFxvb28gZm9ybWF0KSwKLSAqIHdlIHdpbGwgbWFrZSB0aGUgYnVmZmVyIGxhcmdlci4KKyAqIHRvbW95b19hY2xfaGVhZCBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIGVsZW1lbnRzIG5vdCBpbgorICogZG9tYWluIHBvbGljeS4KKyAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgorICoKKyAqICAoMSkgImxpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byB0b21veW9fcG9saWN5X2xpc3RbXSAuCisgKiAgKDIpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKKyAqICAgICAgb3RoZXJ3aXNlLgogICovCi1zdHJ1Y3QgdG9tb3lvX3BhZ2VfYnVmZmVyIHsKLQljaGFyIGJ1ZmZlcls0MDk2XTsKK3N0cnVjdCB0b21veW9fYWNsX2hlYWQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlib29sIGlzX2RlbGV0ZWQ7Cit9IF9fcGFja2VkOworCisvKgorICogdG9tb3lvX3JlcXVlc3RfaW5mbyBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCisgKgorICogKDEpIERvbWFpbiBpbmZvcm1hdGlvbiBvZiBjdXJyZW50IHByb2Nlc3MuCisgKiAoMikgSG93IG1hbnkgcmV0cmllcyBhcmUgbWFkZSBmb3IgdGhpcyByZXF1ZXN0LgorICogKDMpIFByb2ZpbGUgbnVtYmVyIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC4KKyAqICg0KSBBY2Nlc3MgY29udHJvbCBtb2RlIG9mIHRoZSBwcm9maWxlLgorICovCitzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyB7CisJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluOworCS8qIEZvciBob2xkaW5nIHBhcmFtZXRlcnMuICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lOworCQkJLyogRm9yIHVzaW5nIHdpbGRjYXJkcyBhdCB0b21veW9fZmluZF9uZXh0X2RvbWFpbigpLiAqLworCQkJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKm1hdGNoZWRfcGF0aDsKKwkJCXU4IG9wZXJhdGlvbjsKKwkJfSBwYXRoOworCQlzdHJ1Y3QgeworCQkJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lMTsKKwkJCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZTI7CisJCQl1OCBvcGVyYXRpb247CisJCX0gcGF0aDI7CisJCXN0cnVjdCB7CisJCQljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWU7CisJCQl1bnNpZ25lZCBpbnQgbW9kZTsKKwkJCXVuc2lnbmVkIGludCBtYWpvcjsKKwkJCXVuc2lnbmVkIGludCBtaW5vcjsKKwkJCXU4IG9wZXJhdGlvbjsKKwkJfSBta2RldjsKKwkJc3RydWN0IHsKKwkJCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZTsKKwkJCXVuc2lnbmVkIGxvbmcgbnVtYmVyOworCQkJdTggb3BlcmF0aW9uOworCQl9IHBhdGhfbnVtYmVyOworCQlzdHJ1Y3QgeworCQkJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnR5cGU7CisJCQljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZGlyOworCQkJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmRldjsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlpbnQgbmVlZF9kZXY7CisJCX0gbW91bnQ7CisJfSBwYXJhbTsKKwl1OCBwYXJhbV90eXBlOworCWJvb2wgZ3JhbnRlZDsKKwl1OCByZXRyeTsKKwl1OCBwcm9maWxlOworCXU4IG1vZGU7IC8qIE9uZSBvZiB0b21veW9fbW9kZV9pbmRleCAuICovCisJdTggdHlwZTsKIH07CiAKIC8qCkBAIC0xNzQsNDUgKzMxMiwzMSBAQAogfTsKIAogLyoKLSAqIHRvbW95b19uYW1lX2VudHJ5IGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGxpbmtpbmcKKyAqIHRvbW95b19uYW1lIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGxpbmtpbmcKICAqICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyIgaW50byB0b21veW9fbmFtZV9saXN0IC4KICAqLwotc3RydWN0IHRvbW95b19uYW1lX2VudHJ5IHsKK3N0cnVjdCB0b21veW9fbmFtZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWF0b21pY190IHVzZXJzOwogCXN0cnVjdCB0b21veW9fcGF0aF9pbmZvIGVudHJ5OwogfTsKIAotLyoKLSAqIHRvbW95b19wYXRoX2luZm9fd2l0aF9kYXRhIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcgYQotICogcGF0aG5hbWUgb2J0YWluZWQgZnJvbSAic3RydWN0IGRlbnRyeSIgYW5kICJzdHJ1Y3QgdmZzbW91bnQiIHBhaXIuCi0gKgotICogInN0cnVjdCB0b21veW9fcGF0aF9pbmZvX3dpdGhfZGF0YSIgY29uc2lzdHMgb2YgInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIgotICogYW5kIGJ1ZmZlciBmb3IgdGhlIHBhdGhuYW1lLCB3aGlsZSAic3RydWN0IHRvbW95b19wYWdlX2J1ZmZlciIgY29uc2lzdHMgb2YKLSAqIGJ1ZmZlciBmb3IgdGhlIHBhdGhuYW1lIG9ubHkuCi0gKgotICogInN0cnVjdCB0b21veW9fcGF0aF9pbmZvX3dpdGhfZGF0YSIgaXMgaW50ZW5kZWQgdG8gYWxsb3cgVE9NT1lPIHRvIHJlbGVhc2UKLSAqIGJvdGggInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBhbmQgYnVmZmVyIGZvciB0aGUgcGF0aG5hbWUgYnkgc2luZ2xlIGtmcmVlKCkKLSAqIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZXR1cm4gdHdvIHBvaW50ZXJzIHRvIHRoZSBjYWxsZXIuIElmIHRoZSBjYWxsZXIKLSAqIHB1dHMgInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBvbiBzdGFjayBtZW1vcnksIHdlIHdpbGwgYmUgYWJsZSB0byByZW1vdmUKLSAqICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mb193aXRoX2RhdGEiLgotICovCi1zdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mb193aXRoX2RhdGEgewotCS8qIEtlZXAgImhlYWQiIGZpcnN0LCBmb3IgdGhpcyBwb2ludGVyIGlzIHBhc3NlZCB0byBrZnJlZSgpLiAqLwotCXN0cnVjdCB0b21veW9fcGF0aF9pbmZvIGhlYWQ7Ci0JY2hhciBiYXJyaWVyMVsxNl07IC8qIFNhZmVndWFyZCBmb3Igb3ZlcnJ1bi4gKi8KLQljaGFyIGJvZHlbVE9NT1lPX01BWF9QQVRITkFNRV9MRU5dOwotCWNoYXIgYmFycmllcjJbMTZdOyAvKiBTYWZlZ3VhcmQgZm9yIG92ZXJydW4uICovCi19OwotCiBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gewogCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZTsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAgKmdyb3VwOworCXN0cnVjdCB0b21veW9fZ3JvdXAgKmdyb3VwOwogCXU4IGlzX2dyb3VwOwogfTsKIAotLyogU3RydWN0dXJlIGZvciAicGF0aF9ncm91cCIgZGlyZWN0aXZlLiAqLwotc3RydWN0IHRvbW95b19wYXRoX2dyb3VwIHsKK3N0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlc1syXTsKKwlzdHJ1Y3QgdG9tb3lvX2dyb3VwICpncm91cDsKKwl1OCBtaW5fdHlwZTsKKwl1OCBtYXhfdHlwZTsKKwl1OCBpc19ncm91cDsKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgInBhdGhfZ3JvdXAiLyJudW1iZXJfZ3JvdXAiIGRpcmVjdGl2ZS4gKi8KK3N0cnVjdCB0b21veW9fZ3JvdXAgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZ3JvdXBfbmFtZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1lbWJlcl9saXN0OwpAQCAtMjIwLDI4ICszNDQsMzUgQEAKIH07CiAKIC8qIFN0cnVjdHVyZSBmb3IgInBhdGhfZ3JvdXAiIGRpcmVjdGl2ZS4gKi8KLXN0cnVjdCB0b21veW9fcGF0aF9ncm91cF9tZW1iZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlib29sIGlzX2RlbGV0ZWQ7CitzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAgeworCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgaGVhZDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqbWVtYmVyX25hbWU7CiB9OwogCisvKiBTdHJ1Y3R1cmUgZm9yICJudW1iZXJfZ3JvdXAiIGRpcmVjdGl2ZS4gKi8KK3N0cnVjdCB0b21veW9fbnVtYmVyX2dyb3VwIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkIGhlYWQ7CisJc3RydWN0IHRvbW95b19udW1iZXJfdW5pb24gbnVtYmVyOworfTsKKwogLyoKICAqIHRvbW95b19hY2xfaW5mbyBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCiAgKgogICogICgxKSAibGlzdCIgd2hpY2ggaXMgbGlua2VkIHRvIHRoZSAtPmFjbF9pbmZvX2xpc3Qgb2YKICAqICAgICAgInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iCi0gKiAgKDIpICJ0eXBlIiB3aGljaCB0ZWxscyB0eXBlIG9mIHRoZSBlbnRyeSAoZWl0aGVyCi0gKiAgICAgICJzdHJ1Y3QgdG9tb3lvX3BhdGhfYWNsIiBvciAic3RydWN0IHRvbW95b19wYXRoMl9hY2wiKS4KKyAqICAoMikgImlzX2RlbGV0ZWQiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmIHRoaXMgZG9tYWluIGlzIG1hcmtlZCBhcworICogICAgICAiZGVsZXRlZCIsIGZhbHNlIG90aGVyd2lzZS4KKyAqICAoMykgInR5cGUiIHdoaWNoIHRlbGxzIHR5cGUgb2YgdGhlIGVudHJ5LgogICoKICAqIFBhY2tpbmcgInN0cnVjdCB0b21veW9fYWNsX2luZm8iIGFsbG93cwotICogInN0cnVjdCB0b21veW9fcGF0aF9hY2wiIHRvIGVtYmVkICJ1OCIgKyAidTE2IiBhbmQKLSAqICJzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCIgdG8gZW1iZWQgInU4IgotICogd2l0aG91dCBlbmxhcmdpbmcgdGhlaXIgc3RydWN0dXJlIHNpemUuCisgKiAic3RydWN0IHRvbW95b19wYXRoX2FjbCIgdG8gZW1iZWQgInUxNiIgYW5kICJzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCIKKyAqICJzdHJ1Y3QgdG9tb3lvX3BhdGhfbnVtYmVyX2FjbCIgInN0cnVjdCB0b21veW9fbWtkZXZfYWNsIiB0byBlbWJlZAorICogInU4IiB3aXRob3V0IGVubGFyZ2luZyB0aGVpciBzdHJ1Y3R1cmUgc2l6ZS4KICAqLwogc3RydWN0IHRvbW95b19hY2xfaW5mbyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXU4IHR5cGU7CisJYm9vbCBpc19kZWxldGVkOworCXU4IHR5cGU7IC8qID0gb25lIG9mIHZhbHVlcyBpbiAiZW51bSB0b21veW9fYWNsX2VudHJ5X3R5cGVfaW5kZXgiLiAqLwogfSBfX3BhY2tlZDsKIAogLyoKQEAgLTI5OSwyMCArNDMwLDYyIEBACiAgKiAgKDMpICJuYW1lIiBpcyB0aGUgcGF0aG5hbWUuCiAgKgogICogRGlyZWN0aXZlcyBoZWxkIGJ5IHRoaXMgc3RydWN0dXJlIGFyZSAiYWxsb3dfcmVhZC93cml0ZSIsICJhbGxvd19leGVjdXRlIiwKLSAqICJhbGxvd19yZWFkIiwgImFsbG93X3dyaXRlIiwgImFsbG93X2NyZWF0ZSIsICJhbGxvd191bmxpbmsiLCAiYWxsb3dfbWtkaXIiLAotICogImFsbG93X3JtZGlyIiwgImFsbG93X21rZmlmbyIsICJhbGxvd19ta3NvY2siLCAiYWxsb3dfbWtibG9jayIsCi0gKiAiYWxsb3dfbWtjaGFyIiwgImFsbG93X3RydW5jYXRlIiwgImFsbG93X3N5bWxpbmsiLCAiYWxsb3dfcmV3cml0ZSIsCi0gKiAiYWxsb3dfY2htb2QiLCAiYWxsb3dfY2hvd24iLCAiYWxsb3dfY2hncnAiLCAiYWxsb3dfY2hyb290IiwgImFsbG93X21vdW50IgotICogYW5kICJhbGxvd191bm1vdW50Ii4KKyAqICJhbGxvd19yZWFkIiwgImFsbG93X3dyaXRlIiwgImFsbG93X3VubGluayIsICJhbGxvd19ybWRpciIsCisgKiAiYWxsb3dfdHJ1bmNhdGUiLCAiYWxsb3dfc3ltbGluayIsICJhbGxvd19yZXdyaXRlIiwgImFsbG93X2Nocm9vdCIgYW5kCisgKiAiYWxsb3dfdW5tb3VudCIuCiAgKi8KIHN0cnVjdCB0b21veW9fcGF0aF9hY2wgewogCXN0cnVjdCB0b21veW9fYWNsX2luZm8gaGVhZDsgLyogdHlwZSA9IFRPTU9ZT19UWVBFX1BBVEhfQUNMICovCi0JdTggcGVybV9oaWdoOwogCXUxNiBwZXJtOwogCXN0cnVjdCB0b21veW9fbmFtZV91bmlvbiBuYW1lOwogfTsKIAogLyoKKyAqIHRvbW95b19wYXRoX251bWJlcl9hY2wgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZyBhbgorICogZW50cnkgd2l0aCBvbmUgcGF0aG5hbWUgYW5kIG9uZSBudW1iZXIgb3BlcmF0aW9uLgorICogSXQgaGFzIGZvbGxvd2luZyBmaWVsZHMuCisgKgorICogICgxKSAiaGVhZCIgd2hpY2ggaXMgYSAic3RydWN0IHRvbW95b19hY2xfaW5mbyIuCisgKiAgKDIpICJwZXJtIiB3aGljaCBpcyBhIGJpdG1hc2sgb2YgcGVybWl0dGVkIG9wZXJhdGlvbnMuCisgKiAgKDMpICJuYW1lIiBpcyB0aGUgcGF0aG5hbWUuCisgKiAgKDQpICJudW1iZXIiIGlzIHRoZSBudW1lcmljIHZhbHVlLgorICoKKyAqIERpcmVjdGl2ZXMgaGVsZCBieSB0aGlzIHN0cnVjdHVyZSBhcmUgImFsbG93X2NyZWF0ZSIsICJhbGxvd19ta2RpciIsCisgKiAiYWxsb3dfaW9jdGwiLCAiYWxsb3dfbWtmaWZvIiwgImFsbG93X21rc29jayIsICJhbGxvd19jaG1vZCIsICJhbGxvd19jaG93biIKKyAqIGFuZCAiYWxsb3dfY2hncnAiLgorICoKKyAqLworc3RydWN0IHRvbW95b19wYXRoX251bWJlcl9hY2wgeworCXN0cnVjdCB0b21veW9fYWNsX2luZm8gaGVhZDsgLyogdHlwZSA9IFRPTU9ZT19UWVBFX1BBVEhfTlVNQkVSX0FDTCAqLworCXU4IHBlcm07CisJc3RydWN0IHRvbW95b19uYW1lX3VuaW9uIG5hbWU7CisJc3RydWN0IHRvbW95b19udW1iZXJfdW5pb24gbnVtYmVyOworfTsKKworLyoKKyAqIHRvbW95b19ta2Rldl9hY2wgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZyBhbgorICogZW50cnkgd2l0aCBvbmUgcGF0aG5hbWUgYW5kIHRocmVlIG51bWJlcnMgb3BlcmF0aW9uLgorICogSXQgaGFzIGZvbGxvd2luZyBmaWVsZHMuCisgKgorICogICgxKSAiaGVhZCIgd2hpY2ggaXMgYSAic3RydWN0IHRvbW95b19hY2xfaW5mbyIuCisgKiAgKDIpICJwZXJtIiB3aGljaCBpcyBhIGJpdG1hc2sgb2YgcGVybWl0dGVkIG9wZXJhdGlvbnMuCisgKiAgKDMpICJtb2RlIiBpcyB0aGUgY3JlYXRlIG1vZGUuCisgKiAgKDQpICJtYWpvciIgaXMgdGhlIG1ham9yIG51bWJlciBvZiBkZXZpY2Ugbm9kZS4KKyAqICAoNSkgIm1pbm9yIiBpcyB0aGUgbWlub3IgbnVtYmVyIG9mIGRldmljZSBub2RlLgorICoKKyAqIERpcmVjdGl2ZXMgaGVsZCBieSB0aGlzIHN0cnVjdHVyZSBhcmUgImFsbG93X21rY2hhciIsICJhbGxvd19ta2Jsb2NrIi4KKyAqCisgKi8KK3N0cnVjdCB0b21veW9fbWtkZXZfYWNsIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIGhlYWQ7IC8qIHR5cGUgPSBUT01PWU9fVFlQRV9NS0RFVl9BQ0wgKi8KKwl1OCBwZXJtOworCXN0cnVjdCB0b21veW9fbmFtZV91bmlvbiBuYW1lOworCXN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uIG1vZGU7CisJc3RydWN0IHRvbW95b19udW1iZXJfdW5pb24gbWFqb3I7CisJc3RydWN0IHRvbW95b19udW1iZXJfdW5pb24gbWlub3I7Cit9OworCisvKgogICogdG9tb3lvX3BhdGgyX2FjbCBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIGFuCiAgKiBlbnRyeSB3aXRoIHR3byBwYXRobmFtZXMgb3BlcmF0aW9uIChpLmUuIGxpbmsoKSwgcmVuYW1lKCkgYW5kIHBpdm90X3Jvb3QoKSkuCiAgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KQEAgLTMzMyw1MyArNTA2LDYxIEBACiB9OwogCiAvKgotICogdG9tb3lvX2lvX2J1ZmZlciBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciByZWFkaW5nIGFuZCBtb2RpZnlpbmcKLSAqIGNvbmZpZ3VyYXRpb24gdmlhIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgotICogSXQgaGFzIG1hbnkgZmllbGRzLiAtPnJlYWRfdmFyMSAsIC0+cmVhZF92YXIyICwgLT53cml0ZV92YXIxIGFyZSB1c2VkIGFzCi0gKiBjdXJzb3JzLgorICogdG9tb3lvX21vdW50X2FjbCBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIGFuCisgKiBlbnRyeSBmb3IgbW91bnQgb3BlcmF0aW9uLgorICogSXQgaGFzIGZvbGxvd2luZyBmaWVsZHMuCiAgKgotICogU2luY2UgdGhlIGNvbnRlbnQgb2YgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbl9wb2xpY3kgaXMgYSBsaXN0IG9mCi0gKiAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIgZW50cmllcyBhbmQgZWFjaCAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIKLSAqIGVudHJ5IGhhcyBhIGxpc3Qgb2YgInN0cnVjdCB0b21veW9fYWNsX2luZm8iLCB3ZSBuZWVkIHR3byBjdXJzb3JzIHdoZW4KLSAqIHJlYWRpbmcgKG9uZSBpcyBmb3IgdHJhdmVyc2luZyB0b21veW9fZG9tYWluX2xpc3QgYW5kIHRoZSBvdGhlciBpcyBmb3IKLSAqIHRyYXZlcnNpbmcgInN0cnVjdCB0b21veW9fYWNsX2luZm8iLT5hY2xfaW5mb19saXN0ICkuCisgKiAgKDEpICJoZWFkIiB3aGljaCBpcyBhICJzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIi4KKyAqICAoMikgImRldl9uYW1lIiBpcyB0aGUgZGV2aWNlIG5hbWUuCisgKiAgKDMpICJkaXJfbmFtZSIgaXMgdGhlIG1vdW50IHBvaW50LgorICogICg0KSAiZnNfdHlwZSIgaXMgdGhlIGZpbGVzeXN0ZW0gdHlwZS4KKyAqICAoNSkgImZsYWdzIiBpcyB0aGUgbW91bnQgZmxhZ3MuCiAgKgotICogSWYgYSBsaW5lIHdyaXR0ZW4gdG8gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbl9wb2xpY3kgc3RhcnRzIHdpdGgKLSAqICJzZWxlY3QgIiwgVE9NT1lPIHNlZWtzIHRoZSBjdXJzb3IgLT5yZWFkX3ZhcjEgYW5kIC0+d3JpdGVfdmFyMSB0byB0aGUKLSAqIGRvbWFpbiB3aXRoIHRoZSBkb21haW5uYW1lIHNwZWNpZmllZCBieSB0aGUgcmVzdCBvZiB0aGF0IGxpbmUgKE5VTEwgaXMgc2V0Ci0gKiBpZiBzZWVrIGZhaWxlZCkuCi0gKiBJZiBhIGxpbmUgd3JpdHRlbiB0byAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWluX3BvbGljeSBzdGFydHMgd2l0aAotICogImRlbGV0ZSAiLCBUT01PWU8gZGVsZXRlcyBhbiBlbnRyeSBvciBhIGRvbWFpbiBzcGVjaWZpZWQgYnkgdGhlIHJlc3Qgb2YgdGhhdAotICogbGluZSAoLT53cml0ZV92YXIxIGlzIHNldCB0byBOVUxMIGlmIGEgZG9tYWluIHdhcyBkZWxldGVkKS4KLSAqIElmIGEgbGluZSB3cml0dGVuIHRvIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5IHN0YXJ0cyB3aXRoCi0gKiBuZWl0aGVyICJzZWxlY3QgIiBub3IgImRlbGV0ZSAiLCBhbiBlbnRyeSBvciBhIGRvbWFpbiBzcGVjaWZpZWQgYnkgdGhhdCBsaW5lCi0gKiBpcyBhcHBlbmRlZC4KKyAqIERpcmVjdGl2ZSBoZWxkIGJ5IHRoaXMgc3RydWN0dXJlIGlzICJhbGxvd19tb3VudCIuCisgKi8KK3N0cnVjdCB0b21veW9fbW91bnRfYWNsIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIGhlYWQ7IC8qIHR5cGUgPSBUT01PWU9fVFlQRV9NT1VOVF9BQ0wgKi8KKwlzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gZGV2X25hbWU7CisJc3RydWN0IHRvbW95b19uYW1lX3VuaW9uIGRpcl9uYW1lOworCXN0cnVjdCB0b21veW9fbmFtZV91bmlvbiBmc190eXBlOworCXN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uIGZsYWdzOworfTsKKworI2RlZmluZSBUT01PWU9fTUFYX0lPX1JFQURfUVVFVUUgMzIKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgcmVhZGluZy93cml0aW5nIHBvbGljeSB2aWEgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvCisgKiBpbnRlcmZhY2VzLgogICovCiBzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciB7Ci0JaW50ICgqcmVhZCkgKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICopOworCXZvaWQgKCpyZWFkKSAoc3RydWN0IHRvbW95b19pb19idWZmZXIgKik7CiAJaW50ICgqd3JpdGUpIChzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqKTsKKwlpbnQgKCpwb2xsKSAoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogCS8qIEV4Y2x1c2l2ZSBsb2NrIGZvciB0aGlzIHN0cnVjdHVyZS4gICAqLwogCXN0cnVjdCBtdXRleCBpb19zZW07CiAJLyogSW5kZXggcmV0dXJuZWQgYnkgdG9tb3lvX3JlYWRfbG9jaygpLiAqLwogCWludCByZWFkZXJfaWR4OwotCS8qIFRoZSBwb3NpdGlvbiBjdXJyZW50bHkgcmVhZGluZyBmcm9tLiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgKnJlYWRfdmFyMTsKLQkvKiBFeHRyYSB2YXJpYWJsZXMgZm9yIHJlYWRpbmcuICAgICAgICAgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkICpyZWFkX3ZhcjI7CisJY2hhciBfX3VzZXIgKnJlYWRfdXNlcl9idWY7CisJaW50IHJlYWRfdXNlcl9idWZfYXZhaWw7CisJc3RydWN0IHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZG9tYWluOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpncm91cDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqYWNsOworCQlpbnQgYXZhaWw7CisJCWludCBzdGVwOworCQlpbnQgcXVlcnlfaW5kZXg7CisJCXUxNiBpbmRleDsKKwkJdTggYml0OworCQl1OCB3X3BvczsKKwkJYm9vbCBlb2Y7CisJCWJvb2wgcHJpbnRfdGhpc19kb21haW5fb25seTsKKwkJYm9vbCBwcmludF9leGVjdXRlX29ubHk7CisJCWNvbnN0IGNoYXIgKndbVE9NT1lPX01BWF9JT19SRUFEX1FVRVVFXTsKKwl9IHI7CiAJLyogVGhlIHBvc2l0aW9uIGN1cnJlbnRseSB3cml0aW5nIHRvLiAgICovCiAJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqd3JpdGVfdmFyMTsKLQkvKiBUaGUgc3RlcCBmb3IgcmVhZGluZy4gICAgICAgICAgICAgICAgKi8KLQlpbnQgcmVhZF9zdGVwOwogCS8qIEJ1ZmZlciBmb3IgcmVhZGluZy4gICAgICAgICAgICAgICAgICAqLwogCWNoYXIgKnJlYWRfYnVmOwotCS8qIEVPRiBmbGFnIGZvciByZWFkaW5nLiAgICAgICAgICAgICAgICAqLwotCWJvb2wgcmVhZF9lb2Y7Ci0JLyogUmVhZCBkb21haW4gQUNMIG9mIHNwZWNpZmllZCBQSUQ/ICAgICovCi0JYm9vbCByZWFkX3NpbmdsZV9kb21haW47Ci0JLyogRXh0cmEgdmFyaWFibGUgZm9yIHJlYWRpbmcuICAgICAgICAgICovCi0JdTggcmVhZF9iaXQ7Ci0JLyogQnl0ZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nLiAgICAgICAgICovCi0JaW50IHJlYWRfYXZhaWw7CiAJLyogU2l6ZSBvZiByZWFkIGJ1ZmZlci4gICAgICAgICAgICAgICAgICovCiAJaW50IHJlYWRidWZfc2l6ZTsKIAkvKiBCdWZmZXIgZm9yIHdyaXRpbmcuICAgICAgICAgICAgICAgICAgKi8KQEAgLTM4OCwyMTUgKzU2OSwyMDMgQEAKIAlpbnQgd3JpdGVfYXZhaWw7CiAJLyogU2l6ZSBvZiB3cml0ZSBidWZmZXIuICAgICAgICAgICAgICAgICovCiAJaW50IHdyaXRlYnVmX3NpemU7CisJLyogVHlwZSBvZiB0aGlzIGludGVyZmFjZS4gICAgICAgICAgICAgICovCisJdTggdHlwZTsKIH07CiAKIC8qCi0gKiB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfZmlsZV9lbnRyeSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCisgKiB0b21veW9fcmVhZGFibGVfZmlsZSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCiAgKiAiYWxsb3dfcmVhZCIgZW50cmllcy4KICAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgogICoKLSAqICAoMSkgImxpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfbGlzdCAuCisgKiAgKDEpICJoZWFkIiBpcyAic3RydWN0IHRvbW95b19hY2xfaGVhZCIuCiAgKiAgKDIpICJmaWxlbmFtZSIgaXMgYSBwYXRobmFtZSB3aGljaCBpcyBhbGxvd2VkIHRvIG9wZW4oT19SRE9OTFkpLgotICogICgzKSAiaXNfZGVsZXRlZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgbWFya2VkIGFzIGRlbGV0ZWQsIGZhbHNlCi0gKiAgICAgIG90aGVyd2lzZS4KICAqLwotc3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CitzdHJ1Y3QgdG9tb3lvX3JlYWRhYmxlX2ZpbGUgeworCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgaGVhZDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWU7Ci0JYm9vbCBpc19kZWxldGVkOwogfTsKIAogLyoKLSAqIHRvbW95b19wYXR0ZXJuX2VudHJ5IGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcKLSAqICJ0b21veW9fcGF0dGVybl9saXN0IiBlbnRyaWVzLgorICogdG9tb3lvX25vX3BhdHRlcm4gaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZworICogImZpbGVfcGF0dGVybiIgZW50cmllcy4KICAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgogICoKLSAqICAoMSkgImxpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byB0b21veW9fcGF0dGVybl9saXN0IC4KKyAqICAoMSkgImhlYWQiIGlzICJzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkIi4KICAqICAoMikgInBhdHRlcm4iIGlzIGEgcGF0aG5hbWUgcGF0dGVybiB3aGljaCBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIHBhdGhuYW1lcwogICogICAgICB0byBwYXRobmFtZSBwYXR0ZXJucyBkdXJpbmcgbGVhcm5pbmcgbW9kZS4KLSAqICAoMykgImlzX2RlbGV0ZWQiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmIG1hcmtlZCBhcyBkZWxldGVkLCBmYWxzZQotICogICAgICBvdGhlcndpc2UuCiAgKi8KLXN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0Oworc3RydWN0IHRvbW95b19ub19wYXR0ZXJuIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkIGhlYWQ7CiAJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnBhdHRlcm47Ci0JYm9vbCBpc19kZWxldGVkOwogfTsKIAogLyoKLSAqIHRvbW95b19ub19yZXdyaXRlX2VudHJ5IGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcKKyAqIHRvbW95b19ub19yZXdyaXRlIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcKICAqICJkZW55X3Jld3JpdGUiIGVudHJpZXMuCiAgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KICAqCi0gKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX25vX3Jld3JpdGVfbGlzdCAuCisgKiAgKDEpICJoZWFkIiBpcyAic3RydWN0IHRvbW95b19hY2xfaGVhZCIuCiAgKiAgKDIpICJwYXR0ZXJuIiBpcyBhIHBhdGhuYW1lIHdoaWNoIGlzIGJ5IGRlZmF1bHQgbm90IHBlcm1pdHRlZCB0byBtb2RpZnkKICAqICAgICAgYWxyZWFkeSBleGlzdGluZyBjb250ZW50LgotICogICgzKSAiaXNfZGVsZXRlZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgbWFya2VkIGFzIGRlbGV0ZWQsIGZhbHNlCi0gKiAgICAgIG90aGVyd2lzZS4KICAqLwotc3RydWN0IHRvbW95b19ub19yZXdyaXRlX2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CitzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGUgeworCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgaGVhZDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0dGVybjsKLQlib29sIGlzX2RlbGV0ZWQ7CiB9OwogCiAvKgotICogdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCi0gKiAiaW5pdGlhbGl6ZV9kb21haW4iIGFuZCAibm9faW5pdGlhbGl6ZV9kb21haW4iIGVudHJpZXMuCisgKiB0b21veW9fdHJhbnNpdGlvbl9jb250cm9sIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcKKyAqICJpbml0aWFsaXplX2RvbWFpbiIvIm5vX2luaXRpYWxpemVfZG9tYWluIi8ia2VlcF9kb21haW4iLyJub19rZWVwX2RvbWFpbiIKKyAqIGVudHJpZXMuCiAgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KICAqCi0gKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0IC4KLSAqICAoMikgImRvbWFpbm5hbWUiIHdoaWNoIGlzICJhIGRvbWFpbm5hbWUiIG9yICJ0aGUgbGFzdCBjb21wb25lbnQgb2YgYQotICogICAgICBkb21haW5uYW1lIi4gVGhpcyBmaWVsZCBpcyBOVUxMIGlmICJmcm9tIiBjbGF1c2UgaXMgbm90IHNwZWNpZmllZC4KLSAqICAoMykgInByb2dyYW0iIHdoaWNoIGlzIGEgcHJvZ3JhbSdzIHBhdGhuYW1lLgotICogICg0KSAiaXNfZGVsZXRlZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgbWFya2VkIGFzIGRlbGV0ZWQsIGZhbHNlCi0gKiAgICAgIG90aGVyd2lzZS4KLSAqICAoNSkgImlzX25vdCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgIm5vX2luaXRpYWxpemVfZG9tYWluIiwgZmFsc2UKLSAqICAgICAgb3RoZXJ3aXNlLgotICogICg2KSAiaXNfbGFzdF9uYW1lIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiAiZG9tYWlubmFtZSIgaXMgInRoZSBsYXN0CisgKiAgKDEpICJoZWFkIiBpcyAic3RydWN0IHRvbW95b19hY2xfaGVhZCIuCisgKiAgKDIpICJ0eXBlIiBpcyB0eXBlIG9mIHRoaXMgZW50cnkuCisgKiAgKDMpICJpc19sYXN0X25hbWUiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmICJkb21haW5uYW1lIiBpcyAidGhlIGxhc3QKICAqICAgICAgY29tcG9uZW50IG9mIGEgZG9tYWlubmFtZSIsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotc3RydWN0IHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZG9tYWlubmFtZTsgICAgLyogVGhpcyBtYXkgYmUgTlVMTCAqLwotCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpwcm9ncmFtOwotCWJvb2wgaXNfZGVsZXRlZDsKLQlib29sIGlzX25vdDsgICAgICAgLyogVHJ1ZSBpZiB0aGlzIGVudHJ5IGlzICJub19pbml0aWFsaXplX2RvbWFpbiIuICAqLwotCS8qIFRydWUgaWYgdGhlIGRvbWFpbm5hbWUgaXMgdG9tb3lvX2dldF9sYXN0X25hbWUoKS4gKi8KLQlib29sIGlzX2xhc3RfbmFtZTsKLX07Ci0KLS8qCi0gKiB0b21veW9fZG9tYWluX2tlZXBlcl9lbnRyeSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCi0gKiAia2VlcF9kb21haW4iIGFuZCAibm9fa2VlcF9kb21haW4iIGVudHJpZXMuCi0gKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KLSAqCi0gKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdCAuCi0gKiAgKDIpICJkb21haW5uYW1lIiB3aGljaCBpcyAiYSBkb21haW5uYW1lIiBvciAidGhlIGxhc3QgY29tcG9uZW50IG9mIGEKKyAqICAoNCkgImRvbWFpbm5hbWUiIHdoaWNoIGlzICJhIGRvbWFpbm5hbWUiIG9yICJ0aGUgbGFzdCBjb21wb25lbnQgb2YgYQogICogICAgICBkb21haW5uYW1lIi4KLSAqICAoMykgInByb2dyYW0iIHdoaWNoIGlzIGEgcHJvZ3JhbSdzIHBhdGhuYW1lLgotICogICAgICBUaGlzIGZpZWxkIGlzIE5VTEwgaWYgImZyb20iIGNsYXVzZSBpcyBub3Qgc3BlY2lmaWVkLgotICogICg0KSAiaXNfZGVsZXRlZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgbWFya2VkIGFzIGRlbGV0ZWQsIGZhbHNlCi0gKiAgICAgIG90aGVyd2lzZS4KLSAqICAoNSkgImlzX25vdCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgIm5vX2luaXRpYWxpemVfZG9tYWluIiwgZmFsc2UKLSAqICAgICAgb3RoZXJ3aXNlLgotICogICg2KSAiaXNfbGFzdF9uYW1lIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiAiZG9tYWlubmFtZSIgaXMgInRoZSBsYXN0Ci0gKiAgICAgIGNvbXBvbmVudCBvZiBhIGRvbWFpbm5hbWUiLCBmYWxzZSBvdGhlcndpc2UuCisgKiAgKDUpICJwcm9ncmFtIiB3aGljaCBpcyBhIHByb2dyYW0ncyBwYXRobmFtZS4KICAqLwotc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmRvbWFpbm5hbWU7Ci0JY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnByb2dyYW07ICAgICAgIC8qIFRoaXMgbWF5IGJlIE5VTEwgKi8KLQlib29sIGlzX2RlbGV0ZWQ7Ci0JYm9vbCBpc19ub3Q7ICAgICAgIC8qIFRydWUgaWYgdGhpcyBlbnRyeSBpcyAibm9fa2VlcF9kb21haW4iLiAgICAgICAgKi8KK3N0cnVjdCB0b21veW9fdHJhbnNpdGlvbl9jb250cm9sIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkIGhlYWQ7CisJdTggdHlwZTsgLyogT25lIG9mIHZhbHVlcyBpbiAiZW51bSB0b21veW9fdHJhbnNpdGlvbl90eXBlIi4gICovCiAJLyogVHJ1ZSBpZiB0aGUgZG9tYWlubmFtZSBpcyB0b21veW9fZ2V0X2xhc3RfbmFtZSgpLiAqLwogCWJvb2wgaXNfbGFzdF9uYW1lOworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpkb21haW5uYW1lOyAvKiBNYXliZSBOVUxMICovCisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnByb2dyYW07ICAgIC8qIE1heWJlIE5VTEwgKi8KIH07CiAKIC8qCi0gKiB0b21veW9fYWxpYXNfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZyAiYWxpYXMiIGVudHJpZXMuCisgKiB0b21veW9fYWdncmVnYXRvciBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nCisgKiAiYWdncmVnYXRvciIgZW50cmllcy4KICAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgogICoKLSAqICAoMSkgImxpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byB0b21veW9fYWxpYXNfbGlzdCAuCi0gKiAgKDIpICJvcmlnaW5hbF9uYW1lIiB3aGljaCBpcyBhIGRlcmVmZXJlbmNlZCBwYXRobmFtZS4KLSAqICAoMykgImFsaWFzZWRfbmFtZSIgd2hpY2ggaXMgYSBzeW1saW5rJ3MgcGF0aG5hbWUuCi0gKiAgKDQpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKLSAqICAgICAgb3RoZXJ3aXNlLgorICogICgxKSAiaGVhZCIgaXMgInN0cnVjdCB0b21veW9fYWNsX2hlYWQiLgorICogICgyKSAib3JpZ2luYWxfbmFtZSIgd2hpY2ggaXMgb3JpZ2luYWxseSByZXF1ZXN0ZWQgbmFtZS4KKyAqICAoMykgImFnZ3JlZ2F0ZWRfbmFtZSIgd2hpY2ggaXMgbmFtZSB0byByZXdyaXRlLgogICovCi1zdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CitzdHJ1Y3QgdG9tb3lvX2FnZ3JlZ2F0b3IgeworCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgaGVhZDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqb3JpZ2luYWxfbmFtZTsKLQljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqYWxpYXNlZF9uYW1lOwotCWJvb2wgaXNfZGVsZXRlZDsKKwljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqYWdncmVnYXRlZF9uYW1lOwogfTsKIAogLyoKLSAqIHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YKKyAqIHRvbW95b19tYW5hZ2VyIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcgbGlzdCBvZgogICogZG9tYWlubmFtZXMgb3IgcHJvZ3JhbXMgd2hpY2ggYXJlIHBlcm1pdHRlZCB0byBtb2RpZnkgY29uZmlndXJhdGlvbiB2aWEKICAqIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgogICogSXQgaGFzIGZvbGxvd2luZyBmaWVsZHMuCiAgKgotICogICgxKSAibGlzdCIgd2hpY2ggaXMgbGlua2VkIHRvIHRvbW95b19wb2xpY3lfbWFuYWdlcl9saXN0IC4KLSAqICAoMikgIm1hbmFnZXIiIGlzIGEgZG9tYWlubmFtZSBvciBhIHByb2dyYW0ncyBwYXRobmFtZS4KLSAqICAoMykgImlzX2RvbWFpbiIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgIm1hbmFnZXIiIGlzIGEgZG9tYWlubmFtZSwgZmFsc2UKKyAqICAoMSkgImhlYWQiIGlzICJzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkIi4KKyAqICAoMikgImlzX2RvbWFpbiIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgIm1hbmFnZXIiIGlzIGEgZG9tYWlubmFtZSwgZmFsc2UKICAqICAgICAgb3RoZXJ3aXNlLgotICogICg0KSAiaXNfZGVsZXRlZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgbWFya2VkIGFzIGRlbGV0ZWQsIGZhbHNlCi0gKiAgICAgIG90aGVyd2lzZS4KKyAqICAoMykgIm1hbmFnZXIiIGlzIGEgZG9tYWlubmFtZSBvciBhIHByb2dyYW0ncyBwYXRobmFtZS4KICAqLwotc3RydWN0IHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0Oworc3RydWN0IHRvbW95b19tYW5hZ2VyIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkIGhlYWQ7CisJYm9vbCBpc19kb21haW47ICAvKiBUcnVlIGlmIG1hbmFnZXIgaXMgYSBkb21haW5uYW1lLiAqLwogCS8qIEEgcGF0aCB0byBwcm9ncmFtIG9yIGEgZG9tYWlubmFtZS4gKi8KIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqbWFuYWdlcjsKLQlib29sIGlzX2RvbWFpbjsgIC8qIFRydWUgaWYgbWFuYWdlciBpcyBhIGRvbWFpbm5hbWUuICovCi0JYm9vbCBpc19kZWxldGVkOyAvKiBUcnVlIGlmIHRoaXMgZW50cnkgaXMgZGVsZXRlZC4gKi8KK307CisKK3N0cnVjdCB0b21veW9fcHJlZmVyZW5jZSB7CisJdW5zaWduZWQgaW50IGxlYXJuaW5nX21heF9lbnRyeTsKKwlib29sIGVuZm9yY2luZ192ZXJib3NlOworCWJvb2wgbGVhcm5pbmdfdmVyYm9zZTsKKwlib29sIHBlcm1pc3NpdmVfdmVyYm9zZTsKK307CisKK3N0cnVjdCB0b21veW9fcHJvZmlsZSB7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmNvbW1lbnQ7CisJc3RydWN0IHRvbW95b19wcmVmZXJlbmNlICpsZWFybmluZzsKKwlzdHJ1Y3QgdG9tb3lvX3ByZWZlcmVuY2UgKnBlcm1pc3NpdmU7CisJc3RydWN0IHRvbW95b19wcmVmZXJlbmNlICplbmZvcmNpbmc7CisJc3RydWN0IHRvbW95b19wcmVmZXJlbmNlIHByZWZlcmVuY2U7CisJdTggZGVmYXVsdF9jb25maWc7CisJdTggY29uZmlnW1RPTU9ZT19NQVhfTUFDX0lOREVYICsgVE9NT1lPX01BWF9NQUNfQ0FURUdPUllfSU5ERVhdOwogfTsKIAogLyoqKioqKioqKiogRnVuY3Rpb24gcHJvdG90eXBlcy4gKioqKioqKioqKi8KIAotLyogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lX3VuaW9uLiAqLwotYm9vbCB0b21veW9fY29tcGFyZV9uYW1lX3VuaW9uKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpuYW1lLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCB0b21veW9fbmFtZV91bmlvbiAqcHRyKTsKK2V4dGVybiBhc21saW5rYWdlIGxvbmcgc3lzX2dldHBpZCh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIGxvbmcgc3lzX2dldHBwaWQodm9pZCk7CisKKy8qIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4ga2V5d29yZC4gKi8KK2Jvb2wgdG9tb3lvX3N0cl9zdGFydHMoY2hhciAqKnNyYywgY29uc3QgY2hhciAqZmluZCk7CisvKiBHZXQgdG9tb3lvX3JlYWxwYXRoKCkgb2YgY3VycmVudCBwcm9jZXNzLiAqLworY29uc3QgY2hhciAqdG9tb3lvX2dldF9leGUodm9pZCk7CisvKiBGb3JtYXQgc3RyaW5nLiAqLwordm9pZCB0b21veW9fbm9ybWFsaXplX2xpbmUodW5zaWduZWQgY2hhciAqYnVmZmVyKTsKKy8qIFByaW50IHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSBvbiBjb25zb2xlLiAqLwordm9pZCB0b21veW9fd2Fybl9sb2coc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKKy8qIENoZWNrIGFsbCBwcm9maWxlcyBjdXJyZW50bHkgYXNzaWduZWQgdG8gZG9tYWlucyBhcmUgZGVmaW5lZC4gKi8KK3ZvaWQgdG9tb3lvX2NoZWNrX3Byb2ZpbGUodm9pZCk7CisvKiBPcGVuIG9wZXJhdGlvbiBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovCitpbnQgdG9tb3lvX29wZW5fY29udHJvbChjb25zdCB1OCB0eXBlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisvKiBDbG9zZSAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4gKi8KK2ludCB0b21veW9fY2xvc2VfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSk7CisvKiBQb2xsIG9wZXJhdGlvbiBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovCitpbnQgdG9tb3lvX3BvbGxfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CisvKiBSZWFkIG9wZXJhdGlvbiBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovCitpbnQgdG9tb3lvX3JlYWRfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCWNvbnN0IGludCBidWZmZXJfbGVuKTsKKy8qIFdyaXRlIG9wZXJhdGlvbiBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovCitpbnQgdG9tb3lvX3dyaXRlX2NvbnRyb2woc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgY29uc3QgaW50IGJ1ZmZlcl9sZW4pOwogLyogQ2hlY2sgd2hldGhlciB0aGUgZG9tYWluIGhhcyB0b28gbWFueSBBQ0wgZW50cmllcyB0byBob2xkLiAqLwotYm9vbCB0b21veW9fZG9tYWluX3F1b3RhX2lzX29rKHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKiBjb25zdCBkb21haW4pOwotLyogVHJhbnNhY3Rpb25hbCBzcHJpbnRmKCkgZm9yIHBvbGljeSBkdW1wLiAqLwotYm9vbCB0b21veW9faW9fcHJpbnRmKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK2Jvb2wgdG9tb3lvX2RvbWFpbl9xdW90YV9pc19vayhzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqcik7CisvKiBQcmludCBvdXQgb2YgbWVtb3J5IHdhcm5pbmcgbWVzc2FnZS4gKi8KK3ZvaWQgdG9tb3lvX3dhcm5fb29tKGNvbnN0IGNoYXIgKmZ1bmN0aW9uKTsKKy8qIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZV91bmlvbi4gKi8KK2NvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICoKK3RvbW95b19jb21wYXJlX25hbWVfdW5pb24oY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKm5hbWUsCisJCQkgIGNvbnN0IHN0cnVjdCB0b21veW9fbmFtZV91bmlvbiAqcHRyKTsKKy8qIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG51bWJlciBtYXRjaGVzIHRoZSBnaXZlbiBudW1iZXJfdW5pb24uICovCitib29sIHRvbW95b19jb21wYXJlX251bWJlcl91bmlvbihjb25zdCB1bnNpZ25lZCBsb25nIHZhbHVlLAorCQkJCSBjb25zdCBzdHJ1Y3QgdG9tb3lvX251bWJlcl91bmlvbiAqcHRyKTsKK2ludCB0b21veW9fZ2V0X21vZGUoY29uc3QgdTggcHJvZmlsZSwgY29uc3QgdTggaW5kZXgpOwordm9pZCB0b21veW9faW9fcHJpbnRmKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKIC8qIENoZWNrIHdoZXRoZXIgdGhlIGRvbWFpbm5hbWUgaXMgY29ycmVjdC4gKi8KLWJvb2wgdG9tb3lvX2lzX2NvcnJlY3RfZG9tYWluKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRvbWFpbm5hbWUpOworYm9vbCB0b21veW9fY29ycmVjdF9kb21haW4oY29uc3QgdW5zaWduZWQgY2hhciAqZG9tYWlubmFtZSk7CiAvKiBDaGVjayB3aGV0aGVyIHRoZSB0b2tlbiBpcyBjb3JyZWN0LiAqLwotYm9vbCB0b21veW9faXNfY29ycmVjdF9wYXRoKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBzOCBzdGFydF90eXBlLAotCQkJICAgIGNvbnN0IHM4IHBhdHRlcm5fdHlwZSwgY29uc3QgczggZW5kX3R5cGUpOworYm9vbCB0b21veW9fY29ycmVjdF9wYXRoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK2Jvb2wgdG9tb3lvX2NvcnJlY3Rfd29yZChjb25zdCBjaGFyICpzdHJpbmcpOwogLyogQ2hlY2sgd2hldGhlciB0aGUgdG9rZW4gY2FuIGJlIGEgZG9tYWlubmFtZS4gKi8KLWJvb2wgdG9tb3lvX2lzX2RvbWFpbl9kZWYoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKK2Jvb2wgdG9tb3lvX2RvbWFpbl9kZWYoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKIGJvb2wgdG9tb3lvX3BhcnNlX25hbWVfdW5pb24oY29uc3QgY2hhciAqZmlsZW5hbWUsCiAJCQkgICAgIHN0cnVjdCB0b21veW9fbmFtZV91bmlvbiAqcHRyKTsKIC8qIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGVuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIHBhdGhfZ3JvdXAuICovCi1ib29sIHRvbW95b19wYXRoX21hdGNoZXNfZ3JvdXAoY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnBhdGhuYW1lLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9ncm91cCAqZ3JvdXAsCi0JCQkgICAgICAgY29uc3QgYm9vbCBtYXlfdXNlX3BhdHRlcm4pOworY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKgordG9tb3lvX3BhdGhfbWF0Y2hlc19ncm91cChjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0aG5hbWUsCisJCQkgIGNvbnN0IHN0cnVjdCB0b21veW9fZ3JvdXAgKmdyb3VwKTsKKy8qIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIG1hdGNoZXMgdGhlIGdpdmVuIG51bWJlcl9ncm91cC4gKi8KK2Jvb2wgdG9tb3lvX251bWJlcl9tYXRjaGVzX2dyb3VwKGNvbnN0IHVuc2lnbmVkIGxvbmcgbWluLAorCQkJCSBjb25zdCB1bnNpZ25lZCBsb25nIG1heCwKKwkJCQkgY29uc3Qgc3RydWN0IHRvbW95b19ncm91cCAqZ3JvdXApOwogLyogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZW5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gcGF0dGVybi4gKi8KIGJvb2wgdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSwKIAkJCQkgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnBhdHRlcm4pOwotLyogUmVhZCAiYWxpYXMiIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1ib29sIHRvbW95b19yZWFkX2FsaWFzX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCk7Ci0vKgotICogUmVhZCAiaW5pdGlhbGl6ZV9kb21haW4iIGFuZCAibm9faW5pdGlhbGl6ZV9kb21haW4iIGVudHJ5Ci0gKiBpbiBleGNlcHRpb24gcG9saWN5LgotICovCi1ib29sIHRvbW95b19yZWFkX2RvbWFpbl9pbml0aWFsaXplcl9wb2xpY3koc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpOwotLyogUmVhZCAia2VlcF9kb21haW4iIGFuZCAibm9fa2VlcF9kb21haW4iIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1ib29sIHRvbW95b19yZWFkX2RvbWFpbl9rZWVwZXJfcG9saWN5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKTsKLS8qIFJlYWQgImZpbGVfcGF0dGVybiIgZW50cnkgaW4gZXhjZXB0aW9uIHBvbGljeS4gKi8KLWJvb2wgdG9tb3lvX3JlYWRfZmlsZV9wYXR0ZXJuKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKTsKLS8qIFJlYWQgInBhdGhfZ3JvdXAiIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1ib29sIHRvbW95b19yZWFkX3BhdGhfZ3JvdXBfcG9saWN5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKTsKLS8qIFJlYWQgImFsbG93X3JlYWQiIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1ib29sIHRvbW95b19yZWFkX2dsb2JhbGx5X3JlYWRhYmxlX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCk7Ci0vKiBSZWFkICJkZW55X3Jld3JpdGUiIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1ib29sIHRvbW95b19yZWFkX25vX3Jld3JpdGVfcG9saWN5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKTsKKworYm9vbCB0b21veW9fcGFyc2VfbnVtYmVyX3VuaW9uKGNoYXIgKmRhdGEsIHN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uICpudW0pOwogLyogVG9rZW5pemUgYSBsaW5lLiAqLwogYm9vbCB0b21veW9fdG9rZW5pemUoY2hhciAqYnVmZmVyLCBjaGFyICp3W10sIHNpemVfdCBzaXplKTsKIC8qIFdyaXRlIGRvbWFpbiBwb2xpY3kgdmlvbGF0aW9uIHdhcm5pbmcgbWVzc2FnZSB0byBjb25zb2xlPyAqLwogYm9vbCB0b21veW9fdmVyYm9zZV9tb2RlKGNvbnN0IHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbik7Ci0vKiBDb252ZXJ0IGRvdWJsZSBwYXRoIG9wZXJhdGlvbiB0byBvcGVyYXRpb24gbmFtZS4gKi8KLWNvbnN0IGNoYXIgKnRvbW95b19wYXRoMjJrZXl3b3JkKGNvbnN0IHU4IG9wZXJhdGlvbik7Ci0vKiBHZXQgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBkb21haW5uYW1lLiAqLwotY29uc3QgY2hhciAqdG9tb3lvX2dldF9sYXN0X25hbWUoY29uc3Qgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluKTsKLS8qIEdldCB3YXJuaW5nIG1lc3NhZ2UuICovCi1jb25zdCBjaGFyICp0b21veW9fZ2V0X21zZyhjb25zdCBib29sIGlzX2VuZm9yY2UpOwotLyogQ29udmVydCBzaW5nbGUgcGF0aCBvcGVyYXRpb24gdG8gb3BlcmF0aW9uIG5hbWUuICovCi1jb25zdCBjaGFyICp0b21veW9fcGF0aDJrZXl3b3JkKGNvbnN0IHU4IG9wZXJhdGlvbik7Ci0vKiBDcmVhdGUgImFsaWFzIiBlbnRyeSBpbiBleGNlcHRpb24gcG9saWN5LiAqLwotaW50IHRvbW95b193cml0ZV9hbGlhc19wb2xpY3koY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpOwotLyoKLSAqIENyZWF0ZSAiaW5pdGlhbGl6ZV9kb21haW4iIGFuZCAibm9faW5pdGlhbGl6ZV9kb21haW4iIGVudHJ5Ci0gKiBpbiBleGNlcHRpb24gcG9saWN5LgotICovCi1pbnQgdG9tb3lvX3dyaXRlX2RvbWFpbl9pbml0aWFsaXplcl9wb2xpY3koY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19ub3QsCi0JCQkJCSAgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKLS8qIENyZWF0ZSAia2VlcF9kb21haW4iIGFuZCAibm9fa2VlcF9kb21haW4iIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1pbnQgdG9tb3lvX3dyaXRlX2RvbWFpbl9rZWVwZXJfcG9saWN5KGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfbm90LAotCQkJCSAgICAgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKKy8qIEZpbGwgInN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIi4gKi8KK2ludCB0b21veW9faW5pdF9yZXF1ZXN0X2luZm8oc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKnIsCisJCQkgICAgIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwKKwkJCSAgICAgY29uc3QgdTggaW5kZXgpOworLyogQ2hlY2sgcGVybWlzc2lvbiBmb3IgbW91bnQgb3BlcmF0aW9uLiAqLworaW50IHRvbW95b19tb3VudF9wZXJtaXNzaW9uKGNoYXIgKmRldl9uYW1lLCBzdHJ1Y3QgcGF0aCAqcGF0aCwgY2hhciAqdHlwZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpkYXRhX3BhZ2UpOworLyogQ3JlYXRlICJhZ2dyZWdhdG9yIiBlbnRyeSBpbiBleGNlcHRpb24gcG9saWN5LiAqLworaW50IHRvbW95b193cml0ZV9hZ2dyZWdhdG9yKGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKK2ludCB0b21veW9fd3JpdGVfdHJhbnNpdGlvbl9jb250cm9sKGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfZGVsZXRlLAorCQkJCSAgICBjb25zdCB1OCB0eXBlKTsKIC8qCiAgKiBDcmVhdGUgImFsbG93X3JlYWQvd3JpdGUiLCAiYWxsb3dfZXhlY3V0ZSIsICJhbGxvd19yZWFkIiwgImFsbG93X3dyaXRlIiwKICAqICJhbGxvd19jcmVhdGUiLCAiYWxsb3dfdW5saW5rIiwgImFsbG93X21rZGlyIiwgImFsbG93X3JtZGlyIiwKQEAgLTYwNCwyNSArNzczLDMxIEBACiAgKiAiYWxsb3dfdHJ1bmNhdGUiLCAiYWxsb3dfc3ltbGluayIsICJhbGxvd19yZXdyaXRlIiwgImFsbG93X3JlbmFtZSIgYW5kCiAgKiAiYWxsb3dfbGluayIgZW50cnkgaW4gZG9tYWluIHBvbGljeS4KICAqLwotaW50IHRvbW95b193cml0ZV9maWxlX3BvbGljeShjaGFyICpkYXRhLCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCi0JCQkgICAgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKK2ludCB0b21veW9fd3JpdGVfZmlsZShjaGFyICpkYXRhLCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCisJCSAgICAgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKIC8qIENyZWF0ZSAiYWxsb3dfcmVhZCIgZW50cnkgaW4gZXhjZXB0aW9uIHBvbGljeS4gKi8KLWludCB0b21veW9fd3JpdGVfZ2xvYmFsbHlfcmVhZGFibGVfcG9saWN5KGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKK2ludCB0b21veW9fd3JpdGVfZ2xvYmFsbHlfcmVhZGFibGUoY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpOworLyogQ3JlYXRlICJhbGxvd19tb3VudCIgZW50cnkgaW4gZG9tYWluIHBvbGljeS4gKi8KK2ludCB0b21veW9fd3JpdGVfbW91bnQoY2hhciAqZGF0YSwgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAorCQkgICAgICAgY29uc3QgYm9vbCBpc19kZWxldGUpOwogLyogQ3JlYXRlICJkZW55X3Jld3JpdGUiIGVudHJ5IGluIGV4Y2VwdGlvbiBwb2xpY3kuICovCi1pbnQgdG9tb3lvX3dyaXRlX25vX3Jld3JpdGVfcG9saWN5KGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfZGVsZXRlKTsKK2ludCB0b21veW9fd3JpdGVfbm9fcmV3cml0ZShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSk7CiAvKiBDcmVhdGUgImZpbGVfcGF0dGVybiIgZW50cnkgaW4gZXhjZXB0aW9uIHBvbGljeS4gKi8KLWludCB0b21veW9fd3JpdGVfcGF0dGVybl9wb2xpY3koY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpOwotLyogQ3JlYXRlICJwYXRoX2dyb3VwIiBlbnRyeSBpbiBleGNlcHRpb24gcG9saWN5LiAqLwotaW50IHRvbW95b193cml0ZV9wYXRoX2dyb3VwX3BvbGljeShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSk7CitpbnQgdG9tb3lvX3dyaXRlX3BhdHRlcm4oY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpOworLyogQ3JlYXRlICJwYXRoX2dyb3VwIi8ibnVtYmVyX2dyb3VwIiBlbnRyeSBpbiBleGNlcHRpb24gcG9saWN5LiAqLworaW50IHRvbW95b193cml0ZV9ncm91cChjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSwgY29uc3QgdTggdHlwZSk7CitpbnQgdG9tb3lvX3N1cGVydmlzb3Ioc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKIC8qIEZpbmQgYSBkb21haW4gYnkgdGhlIGdpdmVuIG5hbWUuICovCiBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICp0b21veW9fZmluZF9kb21haW4oY29uc3QgY2hhciAqZG9tYWlubmFtZSk7CiAvKiBGaW5kIG9yIGNyZWF0ZSBhIGRvbWFpbiBieSB0aGUgZ2l2ZW4gbmFtZS4gKi8KLXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKnRvbW95b19maW5kX29yX2Fzc2lnbl9uZXdfZG9tYWluKGNvbnN0IGNoYXIgKgotCQkJCQkJCSAgICBkb21haW5uYW1lLAotCQkJCQkJCSAgICBjb25zdCB1OCBwcm9maWxlKTsKLQotLyogQWxsb2NhdGUgbWVtb3J5IGZvciAic3RydWN0IHRvbW95b19wYXRoX2dyb3VwIi4gKi8KLXN0cnVjdCB0b21veW9fcGF0aF9ncm91cCAqdG9tb3lvX2dldF9wYXRoX2dyb3VwKGNvbnN0IGNoYXIgKmdyb3VwX25hbWUpOworc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqdG9tb3lvX2Fzc2lnbl9kb21haW4oY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkJCQkJCWNvbnN0IHU4IHByb2ZpbGUpOworc3RydWN0IHRvbW95b19wcm9maWxlICp0b21veW9fcHJvZmlsZShjb25zdCB1OCBwcm9maWxlKTsKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yICJzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAiLyJzdHJ1Y3QgdG9tb3lvX251bWJlcl9ncm91cCIuCisgKi8KK3N0cnVjdCB0b21veW9fZ3JvdXAgKnRvbW95b19nZXRfZ3JvdXAoY29uc3QgY2hhciAqZ3JvdXBfbmFtZSwgY29uc3QgdTggdHlwZSk7CiAKIC8qIENoZWNrIG1vZGUgZm9yIHNwZWNpZmllZCBmdW5jdGlvbmFsaXR5LiAqLwogdW5zaWduZWQgaW50IHRvbW95b19jaGVja19mbGFncyhjb25zdCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCkBAIC02MzIsMjUgKzgwNywyMyBAQAogLyogUnVuIHBvbGljeSBsb2FkZXIgd2hlbiAvc2Jpbi9pbml0IHN0YXJ0cy4gKi8KIHZvaWQgdG9tb3lvX2xvYWRfcG9saWN5KGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIAordm9pZCB0b21veW9fcHV0X251bWJlcl91bmlvbihzdHJ1Y3QgdG9tb3lvX251bWJlcl91bmlvbiAqcHRyKTsKKwogLyogQ29udmVydCBiaW5hcnkgc3RyaW5nIHRvIGFzY2lpIHN0cmluZy4gKi8KLWludCB0b21veW9fZW5jb2RlKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciAqc3RyKTsKLQotLyogUmV0dXJucyByZWFscGF0aCgzKSBvZiB0aGUgZ2l2ZW4gcGF0aG5hbWUgYnV0IGlnbm9yZXMgY2hyb290J2VkIHJvb3QuICovCi1pbnQgdG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aDIoc3RydWN0IHBhdGggKnBhdGgsIGNoYXIgKm5ld25hbWUsCi0JCQkgICAgICAgaW50IG5ld25hbWVfbGVuKTsKK2NoYXIgKnRvbW95b19lbmNvZGUoY29uc3QgY2hhciAqc3RyKTsKIAogLyoKLSAqIFJldHVybnMgcmVhbHBhdGgoMykgb2YgdGhlIGdpdmVuIHBhdGhuYW1lIGJ1dCBpZ25vcmVzIGNocm9vdCdlZCByb290LgotICogVGhlc2UgZnVuY3Rpb25zIHVzZSBremFsbG9jKCksIHNvIHRoZSBjYWxsZXIgbXVzdCBjYWxsIGtmcmVlKCkKLSAqIGlmIHRoZXNlIGZ1bmN0aW9ucyBkaWRuJ3QgcmV0dXJuIE5VTEwuCi0gKi8KLWNoYXIgKnRvbW95b19yZWFscGF0aChjb25zdCBjaGFyICpwYXRobmFtZSk7Ci0vKgotICogU2FtZSB3aXRoIHRvbW95b19yZWFscGF0aCgpIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgZm9sbG93IHRoZSBmaW5hbCBzeW1saW5rLgorICogUmV0dXJucyByZWFscGF0aCgzKSBvZiB0aGUgZ2l2ZW4gcGF0aG5hbWUgZXhjZXB0IHRoYXQKKyAqIGlnbm9yZXMgY2hyb290J2VkIHJvb3QgYW5kIGRvZXMgbm90IGZvbGxvdyB0aGUgZmluYWwgc3ltbGluay4KICAqLwogY2hhciAqdG9tb3lvX3JlYWxwYXRoX25vZm9sbG93KGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKLS8qIFNhbWUgd2l0aCB0b21veW9fcmVhbHBhdGgoKSBleGNlcHQgdGhhdCB0aGUgcGF0aG5hbWUgaXMgYWxyZWFkeSBzb2x2ZWQuICovCisvKgorICogUmV0dXJucyByZWFscGF0aCgzKSBvZiB0aGUgZ2l2ZW4gcGF0aG5hbWUgZXhjZXB0IHRoYXQKKyAqIGlnbm9yZXMgY2hyb290J2VkIHJvb3QgYW5kIHRoZSBwYXRobmFtZSBpcyBhbHJlYWR5IHNvbHZlZC4KKyAqLwogY2hhciAqdG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCk7CisvKiBHZXQgcGF0dGVybmVkIHBhdGhuYW1lLiAqLworY29uc3QgY2hhciAqdG9tb3lvX3BhdHRlcm4oY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lKTsKIAogLyogQ2hlY2sgbWVtb3J5IHF1b3RhLiAqLwogYm9vbCB0b21veW9fbWVtb3J5X29rKHZvaWQgKnB0cik7CkBAIC02NjMsMjMgKzgzNiwyOSBAQAogY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnRvbW95b19nZXRfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKIAogLyogQ2hlY2sgZm9yIG1lbW9yeSB1c2FnZS4gKi8KLWludCB0b21veW9fcmVhZF9tZW1vcnlfY291bnRlcihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCk7Cit2b2lkIHRvbW95b19yZWFkX21lbW9yeV9jb3VudGVyKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKTsKIAogLyogU2V0IG1lbW9yeSBxdW90YS4gKi8KIGludCB0b21veW9fd3JpdGVfbWVtb3J5X3F1b3RhKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKTsKIAotLyogSW5pdGlhbGl6ZSByZWFscGF0aCByZWxhdGVkIGNvZGUuICovCi12b2lkIF9faW5pdCB0b21veW9fcmVhbHBhdGhfaW5pdCh2b2lkKTsKLWludCB0b21veW9fY2hlY2tfZXhlY19wZXJtKHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwKKy8qIEluaXRpYWxpemUgbW0gcmVsYXRlZCBjb2RlLiAqLwordm9pZCBfX2luaXQgdG9tb3lvX21tX2luaXQodm9pZCk7CitpbnQgdG9tb3lvX3BhdGhfcGVybWlzc2lvbihzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqciwgdTggb3BlcmF0aW9uLAogCQkJICAgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lKTsKIGludCB0b21veW9fY2hlY2tfb3Blbl9wZXJtaXNzaW9uKHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwKIAkJCQkgc3RydWN0IHBhdGggKnBhdGgsIGNvbnN0IGludCBmbGFnKTsKK2ludCB0b21veW9fcGF0aF9udW1iZXJfcGVybShjb25zdCB1OCBvcGVyYXRpb24sIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyKTsKK2ludCB0b21veW9fbWtkZXZfcGVybShjb25zdCB1OCBvcGVyYXRpb24sIHN0cnVjdCBwYXRoICpwYXRoLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGRldik7CiBpbnQgdG9tb3lvX3BhdGhfcGVybShjb25zdCB1OCBvcGVyYXRpb24sIHN0cnVjdCBwYXRoICpwYXRoKTsKIGludCB0b21veW9fcGF0aDJfcGVybShjb25zdCB1OCBvcGVyYXRpb24sIHN0cnVjdCBwYXRoICpwYXRoMSwKIAkJICAgICAgc3RydWN0IHBhdGggKnBhdGgyKTsKLWludCB0b21veW9fY2hlY2tfcmV3cml0ZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxwKTsKIGludCB0b21veW9fZmluZF9uZXh0X2RvbWFpbihzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKTsKIAordm9pZCB0b21veW9fcHJpbnRfdWxvbmcoY2hhciAqYnVmZmVyLCBjb25zdCBpbnQgYnVmZmVyX2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgdmFsdWUsIGNvbnN0IHU4IHR5cGUpOworCiAvKiBEcm9wIHJlZmNvdW50IG9uIHRvbW95b19uYW1lX3VuaW9uLiAqLwogdm9pZCB0b21veW9fcHV0X25hbWVfdW5pb24oc3RydWN0IHRvbW95b19uYW1lX3VuaW9uICpwdHIpOwogCkBAIC02ODgsNiArODY3LDI1IEBACiAKIHZvaWQgdG9tb3lvX21lbW9yeV9mcmVlKHZvaWQgKnB0cik7CiAKK2ludCB0b21veW9fdXBkYXRlX2RvbWFpbihzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpuZXdfZW50cnksIGNvbnN0IGludCBzaXplLAorCQkJIGJvb2wgaXNfZGVsZXRlLCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCisJCQkgYm9vbCAoKmNoZWNrX2R1cGxpY2F0ZSkgKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8KKwkJCQkJCSAgKiwKKwkJCQkJCSAgY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaW5mbworCQkJCQkJICAqKSwKKwkJCSBib29sICgqbWVyZ2VfZHVwbGljYXRlKSAoc3RydWN0IHRvbW95b19hY2xfaW5mbyAqLAorCQkJCQkJICBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICosCisJCQkJCQkgIGNvbnN0IGJvb2wpKTsKK2ludCB0b21veW9fdXBkYXRlX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkICpuZXdfZW50cnksIGNvbnN0IGludCBzaXplLAorCQkJIGJvb2wgaXNfZGVsZXRlLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJIGJvb2wgKCpjaGVja19kdXBsaWNhdGUpIChjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkCisJCQkJCQkgICosCisJCQkJCQkgIGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQKKwkJCQkJCSAgKikpOwordm9pZCB0b21veW9fY2hlY2tfYWNsKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyLAorCQkgICAgICBib29sICgqY2hlY2tfZW50cnkpIChzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICopKTsKKwogLyoqKioqKioqKiogRXh0ZXJuYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMuICoqKioqKioqKiovCiAKIC8qIExvY2sgZm9yIEdDLiAqLwpAQCAtNjk2LDE0ICs4OTQsOCBAQAogLyogVGhlIGxpc3QgZm9yICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4gKi8KIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19kb21haW5fbGlzdDsKIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdG9tb3lvX3BhdGhfZ3JvdXBfbGlzdDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19kb21haW5fa2VlcGVyX2xpc3Q7Ci1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCB0b21veW9fYWxpYXNfbGlzdDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9saXN0OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdG9tb3lvX3BhdHRlcm5fbGlzdDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19ub19yZXdyaXRlX2xpc3Q7Ci1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCB0b21veW9fcG9saWN5X21hbmFnZXJfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19wb2xpY3lfbGlzdFtUT01PWU9fTUFYX1BPTElDWV07CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB0b21veW9fZ3JvdXBfbGlzdFtUT01PWU9fTUFYX0dST1VQXTsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19uYW1lX2xpc3RbVE9NT1lPX01BWF9IQVNIXTsKIAogLyogTG9jayBmb3IgcHJvdGVjdGluZyBwb2xpY3kuICovCkBAIC03MTUsNiArOTA3LDE0IEBACiAvKiBUaGUga2VybmVsJ3MgZG9tYWluLiAqLwogZXh0ZXJuIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gdG9tb3lvX2tlcm5lbF9kb21haW47CiAKK2V4dGVybiBjb25zdCBjaGFyICp0b21veW9fcGF0aF9rZXl3b3JkW1RPTU9ZT19NQVhfUEFUSF9PUEVSQVRJT05dOworZXh0ZXJuIGNvbnN0IGNoYXIgKnRvbW95b19ta2Rldl9rZXl3b3JkW1RPTU9ZT19NQVhfTUtERVZfT1BFUkFUSU9OXTsKK2V4dGVybiBjb25zdCBjaGFyICp0b21veW9fcGF0aDJfa2V5d29yZFtUT01PWU9fTUFYX1BBVEgyX09QRVJBVElPTl07CitleHRlcm4gY29uc3QgY2hhciAqdG9tb3lvX3BhdGhfbnVtYmVyX2tleXdvcmRbVE9NT1lPX01BWF9QQVRIX05VTUJFUl9PUEVSQVRJT05dOworCitleHRlcm4gdW5zaWduZWQgaW50IHRvbW95b19xdW90YV9mb3JfcXVlcnk7CitleHRlcm4gdW5zaWduZWQgaW50IHRvbW95b19xdWVyeV9tZW1vcnlfc2l6ZTsKKwogLyoqKioqKioqKiogSW5saW5lZCBmdW5jdGlvbnMuICoqKioqKioqKiovCiAKIHN0YXRpYyBpbmxpbmUgaW50IHRvbW95b19yZWFkX2xvY2sodm9pZCkKQEAgLTczNSwyNSArOTM1LDI1IEBACiB9CiAKIC8qKgotICogdG9tb3lvX2lzX3ZhbGlkIC0gQ2hlY2sgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgdmFsaWQgY2hhci4KKyAqIHRvbW95b192YWxpZCAtIENoZWNrIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIHZhbGlkIGNoYXIuCiAgKgogICogQGM6IFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCiAgKgogICogUmV0dXJucyB0cnVlIGlmIEBjIGlzIGEgdmFsaWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfdmFsaWQoY29uc3QgdW5zaWduZWQgY2hhciBjKQorc3RhdGljIGlubGluZSBib29sIHRvbW95b192YWxpZChjb25zdCB1bnNpZ25lZCBjaGFyIGMpCiB7CiAJcmV0dXJuIGMgPiAnICcgJiYgYyA8IDEyNzsKIH0KIAogLyoqCi0gKiB0b21veW9faXNfaW52YWxpZCAtIENoZWNrIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhbiBpbnZhbGlkIGNoYXIuCisgKiB0b21veW9faW52YWxpZCAtIENoZWNrIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhbiBpbnZhbGlkIGNoYXIuCiAgKgogICogQGM6IFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCiAgKgogICogUmV0dXJucyB0cnVlIGlmIEBjIGlzIGFuIGludmFsaWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfaW52YWxpZChjb25zdCB1bnNpZ25lZCBjaGFyIGMpCitzdGF0aWMgaW5saW5lIGJvb2wgdG9tb3lvX2ludmFsaWQoY29uc3QgdW5zaWduZWQgY2hhciBjKQogewogCXJldHVybiBjICYmIChjIDw9ICcgJyB8fCBjID49IDEyNyk7CiB9CkBAIC03NjEsMTMgKzk2MSwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHRvbW95b19wdXRfbmFtZShjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqbmFtZSkKIHsKIAlpZiAobmFtZSkgewotCQlzdHJ1Y3QgdG9tb3lvX25hbWVfZW50cnkgKnB0ciA9Ci0JCQljb250YWluZXJfb2YobmFtZSwgc3RydWN0IHRvbW95b19uYW1lX2VudHJ5LCBlbnRyeSk7CisJCXN0cnVjdCB0b21veW9fbmFtZSAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihuYW1lLCB0eXBlb2YoKnB0ciksIGVudHJ5KTsKIAkJYXRvbWljX2RlYygmcHRyLT51c2Vycyk7CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdG9tb3lvX3B1dF9wYXRoX2dyb3VwKHN0cnVjdCB0b21veW9fcGF0aF9ncm91cCAqZ3JvdXApCitzdGF0aWMgaW5saW5lIHZvaWQgdG9tb3lvX3B1dF9ncm91cChzdHJ1Y3QgdG9tb3lvX2dyb3VwICpncm91cCkKIHsKIAlpZiAoZ3JvdXApCiAJCWF0b21pY19kZWMoJmdyb3VwLT51c2Vycyk7CkBAIC03ODQsNzUgKzk4NCwzNSBAQAogCXJldHVybiB0YXNrX2NyZWRfeHh4KHRhc2ssIHNlY3VyaXR5KTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIHRvbW95b19pc19zYW1lX2FjbF9oZWFkKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKnAxLAorc3RhdGljIGlubGluZSBib29sIHRvbW95b19zYW1lX2FjbF9oZWFkKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKnAxLAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwMikKIHsKIAlyZXR1cm4gcDEtPnR5cGUgPT0gcDItPnR5cGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfc2FtZV9uYW1lX3VuaW9uCitzdGF0aWMgaW5saW5lIGJvb2wgdG9tb3lvX3NhbWVfbmFtZV91bmlvbgogKGNvbnN0IHN0cnVjdCB0b21veW9fbmFtZV91bmlvbiAqcDEsIGNvbnN0IHN0cnVjdCB0b21veW9fbmFtZV91bmlvbiAqcDIpCiB7CiAJcmV0dXJuIHAxLT5maWxlbmFtZSA9PSBwMi0+ZmlsZW5hbWUgJiYgcDEtPmdyb3VwID09IHAyLT5ncm91cCAmJgogCQlwMS0+aXNfZ3JvdXAgPT0gcDItPmlzX2dyb3VwOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgdG9tb3lvX2lzX3NhbWVfcGF0aF9hY2woY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2FjbCAqcDEsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9hY2wgKnAyKQorc3RhdGljIGlubGluZSBib29sIHRvbW95b19zYW1lX251bWJlcl91bmlvbgorKGNvbnN0IHN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uICpwMSwgY29uc3Qgc3RydWN0IHRvbW95b19udW1iZXJfdW5pb24gKnAyKQogewotCXJldHVybiB0b21veW9faXNfc2FtZV9hY2xfaGVhZCgmcDEtPmhlYWQsICZwMi0+aGVhZCkgJiYKLQkJdG9tb3lvX2lzX3NhbWVfbmFtZV91bmlvbigmcDEtPm5hbWUsICZwMi0+bmFtZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfc2FtZV9wYXRoMl9hY2woY29uc3Qgc3RydWN0IHRvbW95b19wYXRoMl9hY2wgKnAxLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoMl9hY2wgKnAyKQotewotCXJldHVybiB0b21veW9faXNfc2FtZV9hY2xfaGVhZCgmcDEtPmhlYWQsICZwMi0+aGVhZCkgJiYKLQkJdG9tb3lvX2lzX3NhbWVfbmFtZV91bmlvbigmcDEtPm5hbWUxLCAmcDItPm5hbWUxKSAmJgotCQl0b21veW9faXNfc2FtZV9uYW1lX3VuaW9uKCZwMS0+bmFtZTIsICZwMi0+bmFtZTIpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgdG9tb3lvX2lzX3NhbWVfZG9tYWluX2luaXRpYWxpemVyX2VudHJ5Ci0oY29uc3Qgc3RydWN0IHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkgKnAxLAotIGNvbnN0IHN0cnVjdCB0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2VudHJ5ICpwMikKLXsKLQlyZXR1cm4gcDEtPmlzX25vdCA9PSBwMi0+aXNfbm90ICYmIHAxLT5pc19sYXN0X25hbWUgPT0gcDItPmlzX2xhc3RfbmFtZQotCQkmJiBwMS0+ZG9tYWlubmFtZSA9PSBwMi0+ZG9tYWlubmFtZQotCQkmJiBwMS0+cHJvZ3JhbSA9PSBwMi0+cHJvZ3JhbTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIHRvbW95b19pc19zYW1lX2RvbWFpbl9rZWVwZXJfZW50cnkKLShjb25zdCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9rZWVwZXJfZW50cnkgKnAxLAotIGNvbnN0IHN0cnVjdCB0b21veW9fZG9tYWluX2tlZXBlcl9lbnRyeSAqcDIpCi17Ci0JcmV0dXJuIHAxLT5pc19ub3QgPT0gcDItPmlzX25vdCAmJiBwMS0+aXNfbGFzdF9uYW1lID09IHAyLT5pc19sYXN0X25hbWUKLQkJJiYgcDEtPmRvbWFpbm5hbWUgPT0gcDItPmRvbWFpbm5hbWUKLQkJJiYgcDEtPnByb2dyYW0gPT0gcDItPnByb2dyYW07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCB0b21veW9faXNfc2FtZV9hbGlhc19lbnRyeQotKGNvbnN0IHN0cnVjdCB0b21veW9fYWxpYXNfZW50cnkgKnAxLCBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5ICpwMikKLXsKLQlyZXR1cm4gcDEtPm9yaWdpbmFsX25hbWUgPT0gcDItPm9yaWdpbmFsX25hbWUgJiYKLQkJcDEtPmFsaWFzZWRfbmFtZSA9PSBwMi0+YWxpYXNlZF9uYW1lOworCXJldHVybiBwMS0+dmFsdWVzWzBdID09IHAyLT52YWx1ZXNbMF0gJiYgcDEtPnZhbHVlc1sxXSA9PSBwMi0+dmFsdWVzWzFdCisJCSYmIHAxLT5ncm91cCA9PSBwMi0+Z3JvdXAgJiYgcDEtPm1pbl90eXBlID09IHAyLT5taW5fdHlwZSAmJgorCQlwMS0+bWF4X3R5cGUgPT0gcDItPm1heF90eXBlICYmIHAxLT5pc19ncm91cCA9PSBwMi0+aXNfZ3JvdXA7CiB9CiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9jb29raWUgLSBpdGVyYXRlIG92ZXIgYSBsaXN0IHdpdGggY29va2llLgogICogQHBvczogICAgICAgIHRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KLSAqIEBjb29raWU6ICAgICB0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgY29va2llLgogICogQGhlYWQ6ICAgICAgIHRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCi0gKgotICogU2FtZSB3aXRoIGxpc3RfZm9yX2VhY2hfcmN1KCkgZXhjZXB0IHRoYXQgdGhpcyBwcmltaXRpdmUgdXNlcyBAY29va2llCi0gKiBzbyB0aGF0IHdlIGNhbiBjb250aW51ZSBpdGVyYXRpb24uCi0gKiBAY29va2llIG11c3QgYmUgTlVMTCB3aGVuIGl0ZXJhdGlvbiBzdGFydHMsIGFuZCBAY29va2llIHdpbGwgYmVjb21lCi0gKiBOVUxMIHdoZW4gaXRlcmF0aW9uIGZpbmlzaGVzLgogICovCi0jZGVmaW5lIGxpc3RfZm9yX2VhY2hfY29va2llKHBvcywgY29va2llLCBoZWFkKQkJCQlcCi0JZm9yICgoeyBpZiAoIWNvb2tpZSkJCQkJCQlcCi0JCQkJICAgICBjb29raWUgPSBoZWFkOyB9KSwJCQlcCi0JCSAgICAgcG9zID0gcmN1X2RlcmVmZXJlbmNlKChjb29raWUpLT5uZXh0KTsJCVwKLQkgICAgIHByZWZldGNoKHBvcy0+bmV4dCksIHBvcyAhPSAoaGVhZCkgfHwgKChjb29raWUpID0gTlVMTCk7CVwKLQkgICAgIChjb29raWUpID0gcG9zLCBwb3MgPSByY3VfZGVyZWZlcmVuY2UocG9zLT5uZXh0KSkKKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9jb29raWUocG9zLCBoZWFkKQkJCQkJXAorCWlmICghcG9zKQkJCQkJCQlcCisJCXBvcyA9ICBzcmN1X2RlcmVmZXJlbmNlKChoZWFkKS0+bmV4dCwgJnRvbW95b19zcyk7CVwKKwlmb3IgKCA7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHNyY3VfZGVyZWZlcmVuY2UocG9zLT5uZXh0LCAmdG9tb3lvX3NzKSkKIAogI2VuZGlmIC8qICFkZWZpbmVkKF9TRUNVUklUWV9UT01PWU9fQ09NTU9OX0gpICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vZG9tYWluLmMgYi9zZWN1cml0eS90b21veW8vZG9tYWluLmMKaW5kZXggY2Q4YmE0NC4uMzUzODg0MCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbi5jCisrKyBiL3NlY3VyaXR5L3RvbW95by9kb21haW4uYwpAQCAtMSwxMiArMSw5IEBACiAvKgogICogc2VjdXJpdHkvdG9tb3lvL2RvbWFpbi5jCiAgKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIERvbWFpbi1CYXNlZCBNYW5kYXRvcnkgQWNjZXNzIENvbnRyb2wuCisgKiBEb21haW4gdHJhbnNpdGlvbiBmdW5jdGlvbnMgZm9yIFRPTU9ZTy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSAgTlRUIERBVEEgQ09SUE9SQVRJT04KLSAqCi0gKiBWZXJzaW9uOiAyLjIuMCAgIDIwMDkvMDQvMDEKLSAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCAgTlRUIERBVEEgQ09SUE9SQVRJT04KICAqLwogCiAjaW5jbHVkZSAiY29tbW9uLmgiCkBAIC0xOCwzNjYgKzE1LDE5MSBAQAogLyogVGhlIGluaXRpYWwgZG9tYWluLiAqLwogc3RydWN0IHRvbW95b19kb21haW5faW5mbyB0b21veW9fa2VybmVsX2RvbWFpbjsKIAotLyoKLSAqIHRvbW95b19kb21haW5fbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgZG9tYWlucy4KLSAqIFRoZSAtPmFjbF9pbmZvX2xpc3Qgb2YgInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iIGlzIHVzZWQgZm9yIGhvbGRpbmcKLSAqIHBlcm1pc3Npb25zIChlLmcuICJhbGxvd19yZWFkIC9saWIvbGliYy0yLjUuc28iKSBnaXZlbiB0byBlYWNoIGRvbWFpbi4KLSAqCi0gKiBBbiBlbnRyeSBpcyBhZGRlZCBieQotICoKLSAqICMgKCBlY2hvICI8a2VybmVsPiI7IGVjaG8gImFsbG93X2V4ZWN1dGUgL3NiaW4vaW5pdCIgKSA+IFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5Ci0gKgotICogYW5kIGlzIGRlbGV0ZWQgYnkKLSAqCi0gKiAjICggZWNobyAiPGtlcm5lbD4iOyBlY2hvICJkZWxldGUgYWxsb3dfZXhlY3V0ZSAvc2Jpbi9pbml0IiApID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbl9wb2xpY3kKLSAqCi0gKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQotICoKLSAqICMgY2F0IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5Ci0gKgotICogQSBkb21haW4gaXMgYWRkZWQgYnkKLSAqCi0gKiAjIGVjaG8gIjxrZXJuZWw+IiA+IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5Ci0gKgotICogYW5kIGlzIGRlbGV0ZWQgYnkKLSAqCi0gKiAjIGVjaG8gImRlbGV0ZSA8a2VybmVsPiIgPiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWluX3BvbGljeQotICoKLSAqIGFuZCBhbGwgZG9tYWlucyBhcmUgcmV0cmlldmVkIGJ5Ci0gKgotICogIyBncmVwICdePGtlcm5lbD4nIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5Ci0gKgotICogTm9ybWFsbHksIGEgZG9tYWlubmFtZSBpcyBtb25vdG9uaWNhbGx5IGdldHRpbmcgbG9uZ2VyIGJlY2F1c2UgYSBkb21haW5uYW1lCi0gKiB3aGljaCB0aGUgcHJvY2VzcyB3aWxsIGJlbG9uZyB0byBpZiBhbiBleGVjdmUoKSBvcGVyYXRpb24gc3VjY2VlZHMgaXMKLSAqIGRlZmluZWQgYXMgYSBjb25jYXRlbmF0aW9uIG9mICJjdXJyZW50IGRvbWFpbm5hbWUiICsgInBhdGhuYW1lIHBhc3NlZCB0bwotICogZXhlY3ZlKCkiLgotICogU2VlIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCBhbmQgdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdCBmb3IKLSAqIGV4Y2VwdGlvbnMuCi0gKi8KLUxJU1RfSEVBRCh0b21veW9fZG9tYWluX2xpc3QpOwotCiAvKioKLSAqIHRvbW95b19nZXRfbGFzdF9uYW1lIC0gR2V0IGxhc3QgY29tcG9uZW50IG9mIGEgZG9tYWlubmFtZS4KKyAqIHRvbW95b191cGRhdGVfcG9saWN5IC0gVXBkYXRlIGFuIGVudHJ5IGZvciBleGNlcHRpb24gcG9saWN5LgogICoKLSAqIEBkb21haW46IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLgotICoKLSAqIFJldHVybnMgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBkb21haW5uYW1lLgotICovCi1jb25zdCBjaGFyICp0b21veW9fZ2V0X2xhc3RfbmFtZShjb25zdCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4pCi17Ci0JY29uc3QgY2hhciAqY3AwID0gZG9tYWluLT5kb21haW5uYW1lLT5uYW1lOwotCWNvbnN0IGNoYXIgKmNwMSA9IHN0cnJjaHIoY3AwLCAnICcpOwotCi0JaWYgKGNwMSkKLQkJcmV0dXJuIGNwMSArIDE7Ci0JcmV0dXJuIGNwMDsKLX0KLQotLyoKLSAqIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgcHJvZ3JhbXMgd2hpY2gKLSAqIHRyaWdnZXJzIHJlaW5pdGlhbGl6YXRpb24gb2YgZG9tYWlubmFtZS4gTm9ybWFsbHksIGEgZG9tYWlubmFtZSBpcwotICogbW9ub3RvbmljYWxseSBnZXR0aW5nIGxvbmdlci4gQnV0IHNvbWV0aW1lcywgd2UgcmVzdGFydCBkYWVtb24gcHJvZ3JhbXMuCi0gKiBJdCB3b3VsZCBiZSBjb252ZW5pZW50IGZvciB1cyB0aGF0ICJhIGRhZW1vbiBzdGFydGVkIHVwb24gc3lzdGVtIGJvb3QiIGFuZAotICogInRoZSBkYWVtb24gcmVzdGFydGVkIGZyb20gY29uc29sZSIgYmVsb25nIHRvIHRoZSBzYW1lIGRvbWFpbi4gVGh1cywgVE9NT1lPCi0gKiBwcm92aWRlcyBhIHdheSB0byBzaG9ydGVuIGRvbWFpbm5hbWVzLgotICoKLSAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5Ci0gKgotICogIyBlY2hvICdpbml0aWFsaXplX2RvbWFpbiAvdXNyL3NiaW4vaHR0cGQnID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKLSAqCi0gKiBhbmQgaXMgZGVsZXRlZCBieQotICoKLSAqICMgZWNobyAnZGVsZXRlIGluaXRpYWxpemVfZG9tYWluIC91c3Ivc2Jpbi9odHRwZCcgPiBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5Ci0gKgotICogIyBncmVwIF5pbml0aWFsaXplX2RvbWFpbiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCAvdXNyL3NiaW4vaHR0cGQgd2lsbCBiZWxvbmcgdG8KLSAqICI8a2VybmVsPiAvdXNyL3NiaW4vaHR0cGQiIGRvbWFpbi4KLSAqCi0gKiBZb3UgbWF5IHNwZWNpZnkgYSBkb21haW5uYW1lIHVzaW5nICJmcm9tIiBrZXl3b3JkLgotICogImluaXRpYWxpemVfZG9tYWluIC91c3Ivc2Jpbi9odHRwZCBmcm9tIDxrZXJuZWw+IC9ldGMvcmMuZC9pbml0LmQvaHR0cGQiCi0gKiB3aWxsIGNhdXNlICIvdXNyL3NiaW4vaHR0cGQiIGV4ZWN1dGVkIGZyb20gIjxrZXJuZWw+IC9ldGMvcmMuZC9pbml0LmQvaHR0cGQiCi0gKiBkb21haW4gdG8gYmVsb25nIHRvICI8a2VybmVsPiAvdXNyL3NiaW4vaHR0cGQiIGRvbWFpbi4KLSAqCi0gKiBZb3UgbWF5IGFkZCAibm9fIiBwcmVmaXggdG8gImluaXRpYWxpemVfZG9tYWluIi4KLSAqICJpbml0aWFsaXplX2RvbWFpbiAvdXNyL3NiaW4vaHR0cGQiIGFuZAotICogIm5vX2luaXRpYWxpemVfZG9tYWluIC91c3Ivc2Jpbi9odHRwZCBmcm9tIDxrZXJuZWw+IC9ldGMvcmMuZC9pbml0LmQvaHR0cGQiCi0gKiB3aWxsIGNhdXNlICIvdXNyL3NiaW4vaHR0cGQiIHRvIGJlbG9uZyB0byAiPGtlcm5lbD4gL3Vzci9zYmluL2h0dHBkIiBkb21haW4KLSAqIHVubGVzcyBleGVjdXRlZCBmcm9tICI8a2VybmVsPiAvZXRjL3JjLmQvaW5pdC5kL2h0dHBkIiBkb21haW4uCi0gKi8KLUxJU1RfSEVBRCh0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2xpc3QpOwotCi0vKioKLSAqIHRvbW95b191cGRhdGVfZG9tYWluX2luaXRpYWxpemVyX2VudHJ5IC0gVXBkYXRlICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeSIgbGlzdC4KLSAqCi0gKiBAZG9tYWlubmFtZTogVGhlIG5hbWUgb2YgZG9tYWluLiBNYXkgYmUgTlVMTC4KLSAqIEBwcm9ncmFtOiAgICBUaGUgbmFtZSBvZiBwcm9ncmFtLgotICogQGlzX25vdDogICAgIFRydWUgaWYgaXQgaXMgIm5vX2luaXRpYWxpemVfZG9tYWluIiBlbnRyeS4KLSAqIEBpc19kZWxldGU6ICBUcnVlIGlmIGl0IGlzIGEgZGVsZXRlIHJlcXVlc3QuCisgKiBAbmV3X2VudHJ5OiAgICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIi4KKyAqIEBzaXplOiAgICAgICAgICAgIFNpemUgb2YgQG5ld19lbnRyeSBpbiBieXRlcy4KKyAqIEBpc19kZWxldGU6ICAgICAgIFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqIEBsaXN0OiAgICAgICAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCBsaXN0X2hlYWQiLgorICogQGNoZWNrX2R1cGxpY2F0ZTogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZmluZCBkdXBsaWNhdGVkIGVudHJ5LgogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fdXBkYXRlX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeShjb25zdCBjaGFyICpkb21haW5uYW1lLAotCQkJCQkJICBjb25zdCBjaGFyICpwcm9ncmFtLAotCQkJCQkJICBjb25zdCBib29sIGlzX25vdCwKLQkJCQkJCSAgY29uc3QgYm9vbCBpc19kZWxldGUpCitpbnQgdG9tb3lvX3VwZGF0ZV9wb2xpY3koc3RydWN0IHRvbW95b19hY2xfaGVhZCAqbmV3X2VudHJ5LCBjb25zdCBpbnQgc2l6ZSwKKwkJCSBib29sIGlzX2RlbGV0ZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCSBib29sICgqY2hlY2tfZHVwbGljYXRlKSAoY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZAorCQkJCQkJICAqLAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkCisJCQkJCQkgICopKQogewotCXN0cnVjdCB0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2VudHJ5ICpwdHI7Ci0Jc3RydWN0IHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkgZSA9IHsgLmlzX25vdCA9IGlzX25vdCB9OwogCWludCBlcnJvciA9IGlzX2RlbGV0ZSA/IC1FTk9FTlQgOiAtRU5PTUVNOworCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmVudHJ5OwogCi0JaWYgKCF0b21veW9faXNfY29ycmVjdF9wYXRoKHByb2dyYW0sIDEsIC0xLCAtMSkpCi0JCXJldHVybiAtRUlOVkFMOyAvKiBObyBwYXR0ZXJucyBhbGxvd2VkLiAqLwotCWlmIChkb21haW5uYW1lKSB7Ci0JCWlmICghdG9tb3lvX2lzX2RvbWFpbl9kZWYoZG9tYWlubmFtZSkgJiYKLQkJICAgIHRvbW95b19pc19jb3JyZWN0X3BhdGgoZG9tYWlubmFtZSwgMSwgLTEsIC0xKSkKLQkJCWUuaXNfbGFzdF9uYW1lID0gdHJ1ZTsKLQkJZWxzZSBpZiAoIXRvbW95b19pc19jb3JyZWN0X2RvbWFpbihkb21haW5uYW1lKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllLmRvbWFpbm5hbWUgPSB0b21veW9fZ2V0X25hbWUoZG9tYWlubmFtZSk7Ci0JCWlmICghZS5kb21haW5uYW1lKQotCQkJZ290byBvdXQ7Ci0JfQotCWUucHJvZ3JhbSA9IHRvbW95b19nZXRfbmFtZShwcm9ncmFtKTsKLQlpZiAoIWUucHJvZ3JhbSkKLQkJZ290byBvdXQ7CiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0LCBsaXN0KSB7Ci0JCWlmICghdG9tb3lvX2lzX3NhbWVfZG9tYWluX2luaXRpYWxpemVyX2VudHJ5KHB0ciwgJmUpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlbnRyeSwgbGlzdCwgbGlzdCkgeworCQlpZiAoIWNoZWNrX2R1cGxpY2F0ZShlbnRyeSwgbmV3X2VudHJ5KSkKIAkJCWNvbnRpbnVlOwotCQlwdHItPmlzX2RlbGV0ZWQgPSBpc19kZWxldGU7CisJCWVudHJ5LT5pc19kZWxldGVkID0gaXNfZGVsZXRlOwogCQllcnJvciA9IDA7CiAJCWJyZWFrOwogCX0KLQlpZiAoIWlzX2RlbGV0ZSAmJiBlcnJvcikgewotCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeSAqZW50cnkgPQotCQkJdG9tb3lvX2NvbW1pdF9vaygmZSwgc2l6ZW9mKGUpKTsKKwlpZiAoZXJyb3IgJiYgIWlzX2RlbGV0ZSkgeworCQllbnRyeSA9IHRvbW95b19jb21taXRfb2sobmV3X2VudHJ5LCBzaXplKTsKIAkJaWYgKGVudHJ5KSB7Ci0JCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsCi0JCQkJCSAgJnRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCk7CisJCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsIGxpc3QpOwogCQkJZXJyb3IgPSAwOwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmdG9tb3lvX3BvbGljeV9sb2NrKTsKLSBvdXQ6Ci0JdG9tb3lvX3B1dF9uYW1lKGUuZG9tYWlubmFtZSk7Ci0JdG9tb3lvX3B1dF9uYW1lKGUucHJvZ3JhbSk7CiAJcmV0dXJuIGVycm9yOwogfQogCiAvKioKLSAqIHRvbW95b19yZWFkX2RvbWFpbl9pbml0aWFsaXplcl9wb2xpY3kgLSBSZWFkICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeSIgbGlzdC4KKyAqIHRvbW95b191cGRhdGVfZG9tYWluIC0gVXBkYXRlIGFuIGVudHJ5IGZvciBkb21haW4gcG9saWN5LgogICoKLSAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCi0gKgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgotICovCi1ib29sIHRvbW95b19yZWFkX2RvbWFpbl9pbml0aWFsaXplcl9wb2xpY3koc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCWJvb2wgZG9uZSA9IHRydWU7Ci0KLQlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShwb3MsIGhlYWQtPnJlYWRfdmFyMiwKLQkJCSAgICAgJnRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCkgewotCQljb25zdCBjaGFyICpubzsKLQkJY29uc3QgY2hhciAqZnJvbSA9ICIiOwotCQljb25zdCBjaGFyICpkb21haW4gPSAiIjsKLQkJc3RydWN0IHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkgKnB0cjsKLQkJcHRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2VudHJ5LAotCQkJCSAgbGlzdCk7Ci0JCWlmIChwdHItPmlzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJbm8gPSBwdHItPmlzX25vdCA/ICJub18iIDogIiI7Ci0JCWlmIChwdHItPmRvbWFpbm5hbWUpIHsKLQkJCWZyb20gPSAiIGZyb20gIjsKLQkJCWRvbWFpbiA9IHB0ci0+ZG9tYWlubmFtZS0+bmFtZTsKLQkJfQotCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLAotCQkJCQkiJXMiIFRPTU9ZT19LRVlXT1JEX0lOSVRJQUxJWkVfRE9NQUlOCi0JCQkJCSIlcyVzJXNcbiIsIG5vLCBwdHItPnByb2dyYW0tPm5hbWUsCi0JCQkJCWZyb20sIGRvbWFpbik7Ci0JCWlmICghZG9uZSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gZG9uZTsKLX0KLQotLyoqCi0gKiB0b21veW9fd3JpdGVfZG9tYWluX2luaXRpYWxpemVyX3BvbGljeSAtIFdyaXRlICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeSIgbGlzdC4KLSAqCi0gKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCi0gKiBAaXNfbm90OiAgICBUcnVlIGlmIGl0IGlzICJub19pbml0aWFsaXplX2RvbWFpbiIgZW50cnkuCi0gKiBAaXNfZGVsZXRlOiBUcnVlIGlmIGl0IGlzIGEgZGVsZXRlIHJlcXVlc3QuCisgKiBAbmV3X2VudHJ5OiAgICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIi4KKyAqIEBzaXplOiAgICAgICAgICAgIFNpemUgb2YgQG5ld19lbnRyeSBpbiBieXRlcy4KKyAqIEBpc19kZWxldGU6ICAgICAgIFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqIEBkb21haW46ICAgICAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLgorICogQGNoZWNrX2R1cGxpY2F0ZTogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZmluZCBkdXBsaWNhdGVkIGVudHJ5LgorICogQG1lcmdlX2R1cGxpY2F0ZTogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gbWVyZ2UgZHVwbGljYXRlZCBlbnRyeS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgogICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLWludCB0b21veW9fd3JpdGVfZG9tYWluX2luaXRpYWxpemVyX3BvbGljeShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX25vdCwKLQkJCQkJICAgY29uc3QgYm9vbCBpc19kZWxldGUpCitpbnQgdG9tb3lvX3VwZGF0ZV9kb21haW4oc3RydWN0IHRvbW95b19hY2xfaW5mbyAqbmV3X2VudHJ5LCBjb25zdCBpbnQgc2l6ZSwKKwkJCSBib29sIGlzX2RlbGV0ZSwgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAorCQkJIGJvb2wgKCpjaGVja19kdXBsaWNhdGUpIChjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvCisJCQkJCQkgICosCisJCQkJCQkgIGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8KKwkJCQkJCSAgKiksCisJCQkgYm9vbCAoKm1lcmdlX2R1cGxpY2F0ZSkgKHN0cnVjdCB0b21veW9fYWNsX2luZm8gKiwKKwkJCQkJCSAgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqLAorCQkJCQkJICBjb25zdCBib29sKSkKIHsKLQljaGFyICpjcCA9IHN0cnN0cihkYXRhLCAiIGZyb20gIik7CisJaW50IGVycm9yID0gaXNfZGVsZXRlID8gLUVOT0VOVCA6IC1FTk9NRU07CisJc3RydWN0IHRvbW95b19hY2xfaW5mbyAqZW50cnk7CiAKLQlpZiAoY3ApIHsKLQkJKmNwID0gJ1wwJzsKLQkJcmV0dXJuIHRvbW95b191cGRhdGVfZG9tYWluX2luaXRpYWxpemVyX2VudHJ5KGNwICsgNiwgZGF0YSwKLQkJCQkJCQkgICAgICBpc19ub3QsCi0JCQkJCQkJICAgICAgaXNfZGVsZXRlKTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b21veW9fcG9saWN5X2xvY2spKQorCQlyZXR1cm4gZXJyb3I7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZW50cnksICZkb21haW4tPmFjbF9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFjaGVja19kdXBsaWNhdGUoZW50cnksIG5ld19lbnRyeSkpCisJCQljb250aW51ZTsKKwkJaWYgKG1lcmdlX2R1cGxpY2F0ZSkKKwkJCWVudHJ5LT5pc19kZWxldGVkID0gbWVyZ2VfZHVwbGljYXRlKGVudHJ5LCBuZXdfZW50cnksCisJCQkJCQkJICAgIGlzX2RlbGV0ZSk7CisJCWVsc2UKKwkJCWVudHJ5LT5pc19kZWxldGVkID0gaXNfZGVsZXRlOworCQllcnJvciA9IDA7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gdG9tb3lvX3VwZGF0ZV9kb21haW5faW5pdGlhbGl6ZXJfZW50cnkoTlVMTCwgZGF0YSwgaXNfbm90LAotCQkJCQkJICAgICAgaXNfZGVsZXRlKTsKKwlpZiAoZXJyb3IgJiYgIWlzX2RlbGV0ZSkgeworCQllbnRyeSA9IHRvbW95b19jb21taXRfb2sobmV3X2VudHJ5LCBzaXplKTsKKwkJaWYgKGVudHJ5KSB7CisJCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsICZkb21haW4tPmFjbF9pbmZvX2xpc3QpOworCQkJZXJyb3IgPSAwOworCQl9CisJfQorCW11dGV4X3VubG9jaygmdG9tb3lvX3BvbGljeV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQgdG9tb3lvX2NoZWNrX2FjbChzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqciwKKwkJICAgICAgYm9vbCAoKmNoZWNrX2VudHJ5KSAoc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKiwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqKSkKK3sKKwljb25zdCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPSByLT5kb21haW47CisJc3RydWN0IHRvbW95b19hY2xfaW5mbyAqcHRyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmZG9tYWluLT5hY2xfaW5mb19saXN0LCBsaXN0KSB7CisJCWlmIChwdHItPmlzX2RlbGV0ZWQgfHwgcHRyLT50eXBlICE9IHItPnBhcmFtX3R5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrX2VudHJ5KHIsIHB0cikpIHsKKwkJCXItPmdyYW50ZWQgPSB0cnVlOworCQkJcmV0dXJuOworCQl9CisJfQorCXItPmdyYW50ZWQgPSBmYWxzZTsKK30KKworLyogVGhlIGxpc3QgZm9yICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4gKi8KK0xJU1RfSEVBRCh0b21veW9fZG9tYWluX2xpc3QpOworCitzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19wb2xpY3lfbGlzdFtUT01PWU9fTUFYX1BPTElDWV07CitzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19ncm91cF9saXN0W1RPTU9ZT19NQVhfR1JPVVBdOworCisvKioKKyAqIHRvbW95b19sYXN0X3dvcmQgLSBHZXQgbGFzdCBjb21wb25lbnQgb2YgYSBkb21haW5uYW1lLgorICoKKyAqIEBkb21haW5uYW1lOiBEb21haW5uYW1lIHRvIGNoZWNrLgorICoKKyAqIFJldHVybnMgdGhlIGxhc3Qgd29yZCBvZiBAZG9tYWlubmFtZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnRvbW95b19sYXN0X3dvcmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAgICAgY29uc3QgY2hhciAqY3AgPSBzdHJyY2hyKG5hbWUsICcgJyk7CisgICAgICAgIGlmIChjcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3AgKyAxOworICAgICAgICByZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX3NhbWVfdHJhbnNpdGlvbl9jb250cm9sKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmEsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmIpCit7CisJY29uc3Qgc3RydWN0IHRvbW95b190cmFuc2l0aW9uX2NvbnRyb2wgKnAxID0gY29udGFpbmVyX29mKGEsCisJCQkJCQkJCSAgdHlwZW9mKCpwMSksCisJCQkJCQkJCSAgaGVhZCk7CisJY29uc3Qgc3RydWN0IHRvbW95b190cmFuc2l0aW9uX2NvbnRyb2wgKnAyID0gY29udGFpbmVyX29mKGIsCisJCQkJCQkJCSAgdHlwZW9mKCpwMiksCisJCQkJCQkJCSAgaGVhZCk7CisJcmV0dXJuIHAxLT50eXBlID09IHAyLT50eXBlICYmIHAxLT5pc19sYXN0X25hbWUgPT0gcDItPmlzX2xhc3RfbmFtZQorCQkmJiBwMS0+ZG9tYWlubmFtZSA9PSBwMi0+ZG9tYWlubmFtZQorCQkmJiBwMS0+cHJvZ3JhbSA9PSBwMi0+cHJvZ3JhbTsKIH0KIAogLyoqCi0gKiB0b21veW9faXNfZG9tYWluX2luaXRpYWxpemVyIC0gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcHJvZ3JhbSBjYXVzZXMgZG9tYWlubmFtZSByZWluaXRpYWxpemF0aW9uLgorICogdG9tb3lvX3VwZGF0ZV90cmFuc2l0aW9uX2NvbnRyb2xfZW50cnkgLSBVcGRhdGUgInN0cnVjdCB0b21veW9fdHJhbnNpdGlvbl9jb250cm9sIiBsaXN0LgogICoKLSAqIEBkb21haW5uYW1lOiBUaGUgbmFtZSBvZiBkb21haW4uCi0gKiBAcHJvZ3JhbTogICAgVGhlIG5hbWUgb2YgcHJvZ3JhbS4KLSAqIEBsYXN0X25hbWU6ICBUaGUgbGFzdCBjb21wb25lbnQgb2YgQGRvbWFpbm5hbWUuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIGV4ZWN1dGluZyBAcHJvZ3JhbSByZWluaXRpYWxpemVzIGRvbWFpbiB0cmFuc2l0aW9uLAotICogZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLXN0YXRpYyBib29sIHRvbW95b19pc19kb21haW5faW5pdGlhbGl6ZXIoY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKgotCQkJCQkgZG9tYWlubmFtZSwKLQkJCQkJIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpwcm9ncmFtLAotCQkJCQkgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKgotCQkJCQkgbGFzdF9uYW1lKQotewotCXN0cnVjdCB0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2VudHJ5ICpwdHI7Ci0JYm9vbCBmbGFnID0gZmFsc2U7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHB0ci0+aXNfZGVsZXRlZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocHRyLT5kb21haW5uYW1lKSB7Ci0JCQlpZiAoIXB0ci0+aXNfbGFzdF9uYW1lKSB7Ci0JCQkJaWYgKHB0ci0+ZG9tYWlubmFtZSAhPSBkb21haW5uYW1lKQotCQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRvbW95b19wYXRoY21wKHB0ci0+ZG9tYWlubmFtZSwgbGFzdF9uYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRvbW95b19wYXRoY21wKHB0ci0+cHJvZ3JhbSwgcHJvZ3JhbSkpCi0JCQljb250aW51ZTsKLQkJaWYgKHB0ci0+aXNfbm90KSB7Ci0JCQlmbGFnID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCQlmbGFnID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZsYWc7Ci19Ci0KLS8qCi0gKiB0b21veW9fZG9tYWluX2tlZXBlcl9saXN0IGlzIHVzZWQgZm9yIGhvbGRpbmcgbGlzdCBvZiBkb21haW5uYW1lcyB3aGljaAotICogc3VwcHJlc3NlcyBkb21haW4gdHJhbnNpdGlvbi4gTm9ybWFsbHksIGEgZG9tYWlubmFtZSBpcyBtb25vdG9uaWNhbGx5Ci0gKiBnZXR0aW5nIGxvbmdlci4gQnV0IHNvbWV0aW1lcywgd2Ugd2FudCB0byBzdXBwcmVzcyBkb21haW4gdHJhbnNpdGlvbi4KLSAqIEl0IHdvdWxkIGJlIGNvbnZlbmllbnQgZm9yIHVzIHRoYXQgcHJvZ3JhbXMgZXhlY3V0ZWQgZnJvbSBhIGxvZ2luIHNlc3Npb24KLSAqIGJlbG9uZyB0byB0aGUgc2FtZSBkb21haW4uIFRodXMsIFRPTU9ZTyBwcm92aWRlcyBhIHdheSB0byBzdXBwcmVzcyBkb21haW4KLSAqIHRyYW5zaXRpb24uCi0gKgotICogQW4gZW50cnkgaXMgYWRkZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2tlZXBfZG9tYWluIDxrZXJuZWw+IC91c3Ivc2Jpbi9zc2hkIC9iaW4vYmFzaCcgPiBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5Ci0gKgotICogYW5kIGlzIGRlbGV0ZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2RlbGV0ZSBrZWVwX2RvbWFpbiA8a2VybmVsPiAvdXNyL3NiaW4vc3NoZCAvYmluL2Jhc2gnID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5Ci0gKgotICogIyBncmVwIF5rZWVwX2RvbWFpbiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCBhbnkgcHJvY2VzcyB3aGljaCBiZWxvbmdzIHRvCi0gKiAiPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoIiBkb21haW4gd2lsbCByZW1haW4gaW4gdGhhdCBkb21haW4sCi0gKiB1bmxlc3MgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgImluaXRpYWxpemVfZG9tYWluIiBvciAibm9fa2VlcF9kb21haW4iLgotICoKLSAqIFlvdSBtYXkgc3BlY2lmeSBhIHByb2dyYW0gdXNpbmcgImZyb20iIGtleXdvcmQuCi0gKiAia2VlcF9kb21haW4gL2Jpbi9wd2QgZnJvbSA8a2VybmVsPiAvdXNyL3NiaW4vc3NoZCAvYmluL2Jhc2giCi0gKiB3aWxsIGNhdXNlICIvYmluL3B3ZCIgZXhlY3V0ZWQgZnJvbSAiPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoIgotICogZG9tYWluIHRvIHJlbWFpbiBpbiAiPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoIiBkb21haW4uCi0gKgotICogWW91IG1heSBhZGQgIm5vXyIgcHJlZml4IHRvICJrZWVwX2RvbWFpbiIuCi0gKiAia2VlcF9kb21haW4gPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoIiBhbmQKLSAqICJub19rZWVwX2RvbWFpbiAvdXNyL2Jpbi9wYXNzd2QgZnJvbSA8a2VybmVsPiAvdXNyL3NiaW4vc3NoZCAvYmluL2Jhc2giIHdpbGwKLSAqIGNhdXNlICIvdXNyL2Jpbi9wYXNzd2QiIHRvIGJlbG9uZyB0bwotICogIjxrZXJuZWw+IC91c3Ivc2Jpbi9zc2hkIC9iaW4vYmFzaCAvdXNyL2Jpbi9wYXNzd2QiIGRvbWFpbiwgdW5sZXNzCi0gKiBleHBsaWNpdGx5IHNwZWNpZmllZCBieSAiaW5pdGlhbGl6ZV9kb21haW4iLgotICovCi1MSVNUX0hFQUQodG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdCk7Ci0KLS8qKgotICogdG9tb3lvX3VwZGF0ZV9kb21haW5fa2VlcGVyX2VudHJ5IC0gVXBkYXRlICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9rZWVwZXJfZW50cnkiIGxpc3QuCi0gKgotICogQGRvbWFpbm5hbWU6IFRoZSBuYW1lIG9mIGRvbWFpbi4KLSAqIEBwcm9ncmFtOiAgICBUaGUgbmFtZSBvZiBwcm9ncmFtLiBNYXkgYmUgTlVMTC4KLSAqIEBpc19ub3Q6ICAgICBUcnVlIGlmIGl0IGlzICJub19rZWVwX2RvbWFpbiIgZW50cnkuCisgKiBAZG9tYWlubmFtZTogVGhlIG5hbWUgb2YgZG9tYWluLiBNYXliZSBOVUxMLgorICogQHByb2dyYW06ICAgIFRoZSBuYW1lIG9mIHByb2dyYW0uIE1heWJlIE5VTEwuCisgKiBAdHlwZTogICAgICAgVHlwZSBvZiB0cmFuc2l0aW9uLgogICogQGlzX2RlbGV0ZTogIFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV9kb21haW5fa2VlcGVyX2VudHJ5KGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0JCQkJCSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbSwKLQkJCQkJICAgICBjb25zdCBib29sIGlzX25vdCwKLQkJCQkJICAgICBjb25zdCBib29sIGlzX2RlbGV0ZSkKK3N0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV90cmFuc2l0aW9uX2NvbnRyb2xfZW50cnkoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkJCQkJCSAgY29uc3QgY2hhciAqcHJvZ3JhbSwKKwkJCQkJCSAgY29uc3QgdTggdHlwZSwKKwkJCQkJCSAgY29uc3QgYm9vbCBpc19kZWxldGUpCiB7Ci0Jc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5ICpwdHI7Ci0Jc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5IGUgPSB7IC5pc19ub3QgPSBpc19ub3QgfTsKKwlzdHJ1Y3QgdG9tb3lvX3RyYW5zaXRpb25fY29udHJvbCBlID0geyAudHlwZSA9IHR5cGUgfTsKIAlpbnQgZXJyb3IgPSBpc19kZWxldGUgPyAtRU5PRU5UIDogLUVOT01FTTsKLQotCWlmICghdG9tb3lvX2lzX2RvbWFpbl9kZWYoZG9tYWlubmFtZSkgJiYKLQkgICAgdG9tb3lvX2lzX2NvcnJlY3RfcGF0aChkb21haW5uYW1lLCAxLCAtMSwgLTEpKQotCQllLmlzX2xhc3RfbmFtZSA9IHRydWU7Ci0JZWxzZSBpZiAoIXRvbW95b19pc19jb3JyZWN0X2RvbWFpbihkb21haW5uYW1lKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHByb2dyYW0pIHsKLQkJaWYgKCF0b21veW9faXNfY29ycmVjdF9wYXRoKHByb2dyYW0sIDEsIC0xLCAtMSkpCisJCWlmICghdG9tb3lvX2NvcnJlY3RfcGF0aChwcm9ncmFtKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQllLnByb2dyYW0gPSB0b21veW9fZ2V0X25hbWUocHJvZ3JhbSk7CiAJCWlmICghZS5wcm9ncmFtKQogCQkJZ290byBvdXQ7CiAJfQotCWUuZG9tYWlubmFtZSA9IHRvbW95b19nZXRfbmFtZShkb21haW5uYW1lKTsKLQlpZiAoIWUuZG9tYWlubmFtZSkKLQkJZ290byBvdXQ7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdCwgbGlzdCkgewotCQlpZiAoIXRvbW95b19pc19zYW1lX2RvbWFpbl9rZWVwZXJfZW50cnkocHRyLCAmZSkpCi0JCQljb250aW51ZTsKLQkJcHRyLT5pc19kZWxldGVkID0gaXNfZGVsZXRlOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIWlzX2RlbGV0ZSAmJiBlcnJvcikgewotCQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9rZWVwZXJfZW50cnkgKmVudHJ5ID0KLQkJCXRvbW95b19jb21taXRfb2soJmUsIHNpemVvZihlKSk7Ci0JCWlmIChlbnRyeSkgewotCQkJbGlzdF9hZGRfdGFpbF9yY3UoJmVudHJ5LT5saXN0LAotCQkJCQkgICZ0b21veW9fZG9tYWluX2tlZXBlcl9saXN0KTsKLQkJCWVycm9yID0gMDsKKwlpZiAoZG9tYWlubmFtZSkgeworCQlpZiAoIXRvbW95b19jb3JyZWN0X2RvbWFpbihkb21haW5uYW1lKSkgeworCQkJaWYgKCF0b21veW9fY29ycmVjdF9wYXRoKGRvbWFpbm5hbWUpKQorCQkJCWdvdG8gb3V0OworCQkJZS5pc19sYXN0X25hbWUgPSB0cnVlOwogCQl9CisJCWUuZG9tYWlubmFtZSA9IHRvbW95b19nZXRfbmFtZShkb21haW5uYW1lKTsKKwkJaWYgKCFlLmRvbWFpbm5hbWUpCisJCQlnb3RvIG91dDsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ0b21veW9fcG9saWN5X2xvY2spOworCWVycm9yID0gdG9tb3lvX3VwZGF0ZV9wb2xpY3koJmUuaGVhZCwgc2l6ZW9mKGUpLCBpc19kZWxldGUsCisJCQkJICAgICAmdG9tb3lvX3BvbGljeV9saXN0CisJCQkJICAgICBbVE9NT1lPX0lEX1RSQU5TSVRJT05fQ09OVFJPTF0sCisJCQkJICAgICB0b21veW9fc2FtZV90cmFuc2l0aW9uX2NvbnRyb2wpOwogIG91dDoKIAl0b21veW9fcHV0X25hbWUoZS5kb21haW5uYW1lKTsKIAl0b21veW9fcHV0X25hbWUoZS5wcm9ncmFtKTsKQEAgLTM4NSwyMTkgKzIwNywxMzMgQEAKIH0KIAogLyoqCi0gKiB0b21veW9fd3JpdGVfZG9tYWluX2tlZXBlcl9wb2xpY3kgLSBXcml0ZSAic3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5IiBsaXN0LgorICogdG9tb3lvX3dyaXRlX3RyYW5zaXRpb25fY29udHJvbCAtIFdyaXRlICJzdHJ1Y3QgdG9tb3lvX3RyYW5zaXRpb25fY29udHJvbCIgbGlzdC4KICAqCiAgKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCi0gKiBAaXNfbm90OiAgICBUcnVlIGlmIGl0IGlzICJub19rZWVwX2RvbWFpbiIgZW50cnkuCiAgKiBAaXNfZGVsZXRlOiBUcnVlIGlmIGl0IGlzIGEgZGVsZXRlIHJlcXVlc3QuCisgKiBAdHlwZTogICAgICBUeXBlIG9mIHRoaXMgZW50cnkuCiAgKgotICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCiAgKi8KLWludCB0b21veW9fd3JpdGVfZG9tYWluX2tlZXBlcl9wb2xpY3koY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19ub3QsCi0JCQkJICAgICAgY29uc3QgYm9vbCBpc19kZWxldGUpCitpbnQgdG9tb3lvX3dyaXRlX3RyYW5zaXRpb25fY29udHJvbChjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSwKKwkJCQkgICAgY29uc3QgdTggdHlwZSkKIHsKLQljaGFyICpjcCA9IHN0cnN0cihkYXRhLCAiIGZyb20gIik7Ci0KLQlpZiAoY3ApIHsKLQkJKmNwID0gJ1wwJzsKLQkJcmV0dXJuIHRvbW95b191cGRhdGVfZG9tYWluX2tlZXBlcl9lbnRyeShjcCArIDYsIGRhdGEsIGlzX25vdCwKLQkJCQkJCQkgaXNfZGVsZXRlKTsKKwljaGFyICpkb21haW5uYW1lID0gc3Ryc3RyKGRhdGEsICIgZnJvbSAiKTsKKwlpZiAoZG9tYWlubmFtZSkgeworCQkqZG9tYWlubmFtZSA9ICdcMCc7CisJCWRvbWFpbm5hbWUgKz0gNjsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9OT19LRUVQIHx8CisJCSAgIHR5cGUgPT0gVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9LRUVQKSB7CisJCWRvbWFpbm5hbWUgPSBkYXRhOworCQlkYXRhID0gTlVMTDsKIAl9Ci0JcmV0dXJuIHRvbW95b191cGRhdGVfZG9tYWluX2tlZXBlcl9lbnRyeShkYXRhLCBOVUxMLCBpc19ub3QsIGlzX2RlbGV0ZSk7CisJcmV0dXJuIHRvbW95b191cGRhdGVfdHJhbnNpdGlvbl9jb250cm9sX2VudHJ5KGRvbWFpbm5hbWUsIGRhdGEsIHR5cGUsCisJCQkJCQkgICAgICBpc19kZWxldGUpOwogfQogCiAvKioKLSAqIHRvbW95b19yZWFkX2RvbWFpbl9rZWVwZXJfcG9saWN5IC0gUmVhZCAic3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5IiBsaXN0LgotICoKLSAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCi0gKgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgotICovCi1ib29sIHRvbW95b19yZWFkX2RvbWFpbl9rZWVwZXJfcG9saWN5KHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlib29sIGRvbmUgPSB0cnVlOwotCi0JbGlzdF9mb3JfZWFjaF9jb29raWUocG9zLCBoZWFkLT5yZWFkX3ZhcjIsCi0JCQkgICAgICZ0b21veW9fZG9tYWluX2tlZXBlcl9saXN0KSB7Ci0JCXN0cnVjdCB0b21veW9fZG9tYWluX2tlZXBlcl9lbnRyeSAqcHRyOwotCQljb25zdCBjaGFyICpubzsKLQkJY29uc3QgY2hhciAqZnJvbSA9ICIiOwotCQljb25zdCBjaGFyICpwcm9ncmFtID0gIiI7Ci0KLQkJcHRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB0b21veW9fZG9tYWluX2tlZXBlcl9lbnRyeSwgbGlzdCk7Ci0JCWlmIChwdHItPmlzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJbm8gPSBwdHItPmlzX25vdCA/ICJub18iIDogIiI7Ci0JCWlmIChwdHItPnByb2dyYW0pIHsKLQkJCWZyb20gPSAiIGZyb20gIjsKLQkJCXByb2dyYW0gPSBwdHItPnByb2dyYW0tPm5hbWU7Ci0JCX0KLQkJZG9uZSA9IHRvbW95b19pb19wcmludGYoaGVhZCwKLQkJCQkJIiVzIiBUT01PWU9fS0VZV09SRF9LRUVQX0RPTUFJTgotCQkJCQkiJXMlcyVzXG4iLCBubywgcHJvZ3JhbSwgZnJvbSwKLQkJCQkJcHRyLT5kb21haW5uYW1lLT5uYW1lKTsKLQkJaWYgKCFkb25lKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBkb25lOwotfQotCi0vKioKLSAqIHRvbW95b19pc19kb21haW5fa2VlcGVyIC0gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcHJvZ3JhbSBjYXVzZXMgZG9tYWluIHRyYW5zaXRpb24gc3VwcHJlc3Npb24uCisgKiB0b21veW9fdHJhbnNpdGlvbl90eXBlIC0gR2V0IGRvbWFpbiB0cmFuc2l0aW9uIHR5cGUuCiAgKgogICogQGRvbWFpbm5hbWU6IFRoZSBuYW1lIG9mIGRvbWFpbi4KICAqIEBwcm9ncmFtOiAgICBUaGUgbmFtZSBvZiBwcm9ncmFtLgotICogQGxhc3RfbmFtZTogIFRoZSBsYXN0IGNvbXBvbmVudCBvZiBAZG9tYWlubmFtZS4KICAqCi0gKiBSZXR1cm5zIHRydWUgaWYgZXhlY3V0aW5nIEBwcm9ncmFtIHN1cHJlc3NlcyBkb21haW4gdHJhbnNpdGlvbiwKLSAqIGZhbHNlIG90aGVyd2lzZS4KKyAqIFJldHVybnMgVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9JTklUSUFMSVpFIGlmIGV4ZWN1dGluZyBAcHJvZ3JhbQorICogcmVpbml0aWFsaXplcyBkb21haW4gdHJhbnNpdGlvbiwgVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9LRUVQIGlmIGV4ZWN1dGluZworICogQHByb2dyYW0gc3VwcHJlc3NlcyBkb21haW4gdHJhbnNpdGlvbiwgb3RoZXJzIG90aGVyd2lzZS4KICAqCiAgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCi1zdGF0aWMgYm9vbCB0b21veW9faXNfZG9tYWluX2tlZXBlcihjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZG9tYWlubmFtZSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnByb2dyYW0sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpsYXN0X25hbWUpCitzdGF0aWMgdTggdG9tb3lvX3RyYW5zaXRpb25fdHlwZShjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZG9tYWlubmFtZSwKKwkJCQkgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKnByb2dyYW0pCiB7Ci0Jc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5ICpwdHI7Ci0JYm9vbCBmbGFnID0gZmFsc2U7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fZG9tYWluX2tlZXBlcl9saXN0LCBsaXN0KSB7Ci0JCWlmIChwdHItPmlzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJaWYgKCFwdHItPmlzX2xhc3RfbmFtZSkgewotCQkJaWYgKHB0ci0+ZG9tYWlubmFtZSAhPSBkb21haW5uYW1lKQorCWNvbnN0IHN0cnVjdCB0b21veW9fdHJhbnNpdGlvbl9jb250cm9sICpwdHI7CisJY29uc3QgY2hhciAqbGFzdF9uYW1lID0gdG9tb3lvX2xhc3Rfd29yZChkb21haW5uYW1lLT5uYW1lKTsKKwl1OCB0eXBlOworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBUT01PWU9fTUFYX1RSQU5TSVRJT05fVFlQRTsgdHlwZSsrKSB7CisgbmV4dDoKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BvbGljeV9saXN0CisJCQkJCVtUT01PWU9fSURfVFJBTlNJVElPTl9DT05UUk9MXSwKKwkJCQkJaGVhZC5saXN0KSB7CisJCQlpZiAocHRyLT5oZWFkLmlzX2RlbGV0ZWQgfHwgcHRyLT50eXBlICE9IHR5cGUpCiAJCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodG9tb3lvX3BhdGhjbXAocHRyLT5kb21haW5uYW1lLCBsYXN0X25hbWUpKQorCQkJaWYgKHB0ci0+ZG9tYWlubmFtZSkgeworCQkJCWlmICghcHRyLT5pc19sYXN0X25hbWUpIHsKKwkJCQkJaWYgKHB0ci0+ZG9tYWlubmFtZSAhPSBkb21haW5uYW1lKQorCQkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogVXNlIGRpcmVjdCBzdHJjbXAoKSBzaW5jZSB0aGlzIGlzCisJCQkJCSAqIHVubGlrZWx5IHVzZWQuCisJCQkJCSAqLworCQkJCQlpZiAoc3RyY21wKHB0ci0+ZG9tYWlubmFtZS0+bmFtZSwKKwkJCQkJCSAgIGxhc3RfbmFtZSkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlpZiAocHRyLT5wcm9ncmFtICYmCisJCQkgICAgdG9tb3lvX3BhdGhjbXAocHRyLT5wcm9ncmFtLCBwcm9ncmFtKSkKIAkJCQljb250aW51ZTsKKwkJCWlmICh0eXBlID09IFRPTU9ZT19UUkFOU0lUSU9OX0NPTlRST0xfTk9fSU5JVElBTElaRSkgeworCQkJCS8qCisJCQkJICogRG8gbm90IGNoZWNrIGZvciBpbml0aWFsaXplX2RvbWFpbiBpZgorCQkJCSAqIG5vX2luaXRpYWxpemVfZG9tYWluIG1hdGNoZWQuCisJCQkJICovCisJCQkJdHlwZSA9IFRPTU9ZT19UUkFOU0lUSU9OX0NPTlRST0xfTk9fS0VFUDsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlnb3RvIGRvbmU7CiAJCX0KLQkJaWYgKHB0ci0+cHJvZ3JhbSAmJiB0b21veW9fcGF0aGNtcChwdHItPnByb2dyYW0sIHByb2dyYW0pKQotCQkJY29udGludWU7Ci0JCWlmIChwdHItPmlzX25vdCkgewotCQkJZmxhZyA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCX0KLQkJZmxhZyA9IHRydWU7CiAJfQotCXJldHVybiBmbGFnOworIGRvbmU6CisJcmV0dXJuIHR5cGU7CiB9CiAKLS8qCi0gKiB0b21veW9fYWxpYXNfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2Ygc3ltbGluaydzIHBhdGhuYW1lcyB3aGljaCBhcmUKLSAqIGFsbG93ZWQgdG8gYmUgcGFzc2VkIHRvIGFuIGV4ZWN2ZSgpIHJlcXVlc3QuIE5vcm1hbGx5LCB0aGUgZG9tYWlubmFtZSB3aGljaAotICogdGhlIGN1cnJlbnQgcHJvY2VzcyB3aWxsIGJlbG9uZyB0byBhZnRlciBleGVjdmUoKSBzdWNjZWVkcyBpcyBjYWxjdWxhdGVkCi0gKiB1c2luZyBkZXJlZmVyZW5jZWQgcGF0aG5hbWVzLiBCdXQgc29tZSBwcm9ncmFtcyBiZWhhdmUgZGlmZmVyZW50bHkgZGVwZW5kaW5nCi0gKiBvbiB0aGUgbmFtZSBwYXNzZWQgdG8gYXJndlswXS4gRm9yIGJ1c3lib3gsIGNhbGN1bGF0aW5nIGRvbWFpbm5hbWUgdXNpbmcKLSAqIGRlcmVmZXJlbmNlZCBwYXRobmFtZXMgd2lsbCBjYXVzZSBhbGwgcHJvZ3JhbXMgaW4gdGhlIGJ1c3lib3ggdG8gYmVsb25nIHRvCi0gKiB0aGUgc2FtZSBkb21haW4uIFRodXMsIFRPTU9ZTyBwcm92aWRlcyBhIHdheSB0byBhbGxvdyB1c2Ugb2Ygc3ltbGluaydzCi0gKiBwYXRobmFtZSBmb3IgY2hlY2tpbmcgZXhlY3ZlKCkncyBwZXJtaXNzaW9uIGFuZCBjYWxjdWxhdGluZyBkb21haW5uYW1lIHdoaWNoCi0gKiB0aGUgY3VycmVudCBwcm9jZXNzIHdpbGwgYmVsb25nIHRvIGFmdGVyIGV4ZWN2ZSgpIHN1Y2NlZWRzLgotICoKLSAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5Ci0gKgotICogIyBlY2hvICdhbGlhcyAvYmluL2J1c3lib3ggL2Jpbi9jYXQnID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKLSAqCi0gKiBhbmQgaXMgZGVsZXRlZCBieQotICoKLSAqICMgZWNobyAnZGVsZXRlIGFsaWFzIC9iaW4vYnVzeWJveCAvYmluL2NhdCcgPiBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5Ci0gKgotICogIyBncmVwIF5hbGlhcyAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpZiAvYmluL2NhdCBpcyBhIHN5bWxpbmsgdG8gL2Jpbi9idXN5Ym94IGFuZCBleGVjdXRpb24KLSAqIG9mIC9iaW4vY2F0IGlzIHJlcXVlc3RlZCwgcGVybWlzc2lvbiBpcyBjaGVja2VkIGZvciAvYmluL2NhdCByYXRoZXIgdGhhbgotICogL2Jpbi9idXN5Ym94IGFuZCBkb21haW5uYW1lIHdoaWNoIHRoZSBjdXJyZW50IHByb2Nlc3Mgd2lsbCBiZWxvbmcgdG8gYWZ0ZXIKLSAqIGV4ZWN2ZSgpIHN1Y2NlZWRzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgL2Jpbi9jYXQgcmF0aGVyIHRoYW4gL2Jpbi9idXN5Ym94IC4KLSAqLwotTElTVF9IRUFEKHRvbW95b19hbGlhc19saXN0KTsKK3N0YXRpYyBib29sIHRvbW95b19zYW1lX2FnZ3JlZ2F0b3IoY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkICpiKQoreworCWNvbnN0IHN0cnVjdCB0b21veW9fYWdncmVnYXRvciAqcDEgPSBjb250YWluZXJfb2YoYSwgdHlwZW9mKCpwMSksIGhlYWQpOworCWNvbnN0IHN0cnVjdCB0b21veW9fYWdncmVnYXRvciAqcDIgPSBjb250YWluZXJfb2YoYiwgdHlwZW9mKCpwMiksIGhlYWQpOworCXJldHVybiBwMS0+b3JpZ2luYWxfbmFtZSA9PSBwMi0+b3JpZ2luYWxfbmFtZSAmJgorCQlwMS0+YWdncmVnYXRlZF9uYW1lID09IHAyLT5hZ2dyZWdhdGVkX25hbWU7Cit9CiAKIC8qKgotICogdG9tb3lvX3VwZGF0ZV9hbGlhc19lbnRyeSAtIFVwZGF0ZSAic3RydWN0IHRvbW95b19hbGlhc19lbnRyeSIgbGlzdC4KKyAqIHRvbW95b191cGRhdGVfYWdncmVnYXRvcl9lbnRyeSAtIFVwZGF0ZSAic3RydWN0IHRvbW95b19hZ2dyZWdhdG9yIiBsaXN0LgogICoKLSAqIEBvcmlnaW5hbF9uYW1lOiBUaGUgb3JpZ2luYWwgcHJvZ3JhbSdzIHJlYWwgbmFtZS4KLSAqIEBhbGlhc2VkX25hbWU6ICBUaGUgc3ltYm9saWMgcHJvZ3JhbSdzIHN5bWJvbGljIGxpbmsncyBuYW1lLgotICogQGlzX2RlbGV0ZTogICAgIFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqIEBvcmlnaW5hbF9uYW1lOiAgIFRoZSBvcmlnaW5hbCBwcm9ncmFtJ3MgbmFtZS4KKyAqIEBhZ2dyZWdhdGVkX25hbWU6IFRoZSBwcm9ncmFtIG5hbWUgdG8gdXNlLgorICogQGlzX2RlbGV0ZTogICAgICAgVHJ1ZSBpZiBpdCBpcyBhIGRlbGV0ZSByZXF1ZXN0LgogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGludCB0b21veW9fdXBkYXRlX2FsaWFzX2VudHJ5KGNvbnN0IGNoYXIgKm9yaWdpbmFsX25hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICphbGlhc2VkX25hbWUsCi0JCQkJICAgICBjb25zdCBib29sIGlzX2RlbGV0ZSkKK3N0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV9hZ2dyZWdhdG9yX2VudHJ5KGNvbnN0IGNoYXIgKm9yaWdpbmFsX25hbWUsCisJCQkJCSAgY29uc3QgY2hhciAqYWdncmVnYXRlZF9uYW1lLAorCQkJCQkgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQogewotCXN0cnVjdCB0b21veW9fYWxpYXNfZW50cnkgKnB0cjsKLQlzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5IGUgPSB7IH07CisJc3RydWN0IHRvbW95b19hZ2dyZWdhdG9yIGUgPSB7IH07CiAJaW50IGVycm9yID0gaXNfZGVsZXRlID8gLUVOT0VOVCA6IC1FTk9NRU07CiAKLQlpZiAoIXRvbW95b19pc19jb3JyZWN0X3BhdGgob3JpZ2luYWxfbmFtZSwgMSwgLTEsIC0xKSB8fAotCSAgICAhdG9tb3lvX2lzX2NvcnJlY3RfcGF0aChhbGlhc2VkX25hbWUsIDEsIC0xLCAtMSkpCi0JCXJldHVybiAtRUlOVkFMOyAvKiBObyBwYXR0ZXJucyBhbGxvd2VkLiAqLworCWlmICghdG9tb3lvX2NvcnJlY3RfcGF0aChvcmlnaW5hbF9uYW1lKSB8fAorCSAgICAhdG9tb3lvX2NvcnJlY3RfcGF0aChhZ2dyZWdhdGVkX25hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAllLm9yaWdpbmFsX25hbWUgPSB0b21veW9fZ2V0X25hbWUob3JpZ2luYWxfbmFtZSk7Ci0JZS5hbGlhc2VkX25hbWUgPSB0b21veW9fZ2V0X25hbWUoYWxpYXNlZF9uYW1lKTsKLQlpZiAoIWUub3JpZ2luYWxfbmFtZSB8fCAhZS5hbGlhc2VkX25hbWUpCisJZS5hZ2dyZWdhdGVkX25hbWUgPSB0b21veW9fZ2V0X25hbWUoYWdncmVnYXRlZF9uYW1lKTsKKwlpZiAoIWUub3JpZ2luYWxfbmFtZSB8fCAhZS5hZ2dyZWdhdGVkX25hbWUgfHwKKwkgICAgZS5hZ2dyZWdhdGVkX25hbWUtPmlzX3BhdHRlcm5lZCkgLyogTm8gcGF0dGVybnMgYWxsb3dlZC4gKi8KIAkJZ290byBvdXQ7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX2FsaWFzX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCF0b21veW9faXNfc2FtZV9hbGlhc19lbnRyeShwdHIsICZlKSkKLQkJCWNvbnRpbnVlOwotCQlwdHItPmlzX2RlbGV0ZWQgPSBpc19kZWxldGU7Ci0JCWVycm9yID0gMDsKLQkJYnJlYWs7Ci0JfQotCWlmICghaXNfZGVsZXRlICYmIGVycm9yKSB7Ci0JCXN0cnVjdCB0b21veW9fYWxpYXNfZW50cnkgKmVudHJ5ID0KLQkJCXRvbW95b19jb21taXRfb2soJmUsIHNpemVvZihlKSk7Ci0JCWlmIChlbnRyeSkgewotCQkJbGlzdF9hZGRfdGFpbF9yY3UoJmVudHJ5LT5saXN0LCAmdG9tb3lvX2FsaWFzX2xpc3QpOwotCQkJZXJyb3IgPSAwOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmdG9tb3lvX3BvbGljeV9sb2NrKTsKKwllcnJvciA9IHRvbW95b191cGRhdGVfcG9saWN5KCZlLmhlYWQsIHNpemVvZihlKSwgaXNfZGVsZXRlLAorCQkJCSAgICAgJnRvbW95b19wb2xpY3lfbGlzdFtUT01PWU9fSURfQUdHUkVHQVRPUl0sCisJCQkJICAgICB0b21veW9fc2FtZV9hZ2dyZWdhdG9yKTsKICBvdXQ6CiAJdG9tb3lvX3B1dF9uYW1lKGUub3JpZ2luYWxfbmFtZSk7Ci0JdG9tb3lvX3B1dF9uYW1lKGUuYWxpYXNlZF9uYW1lKTsKKwl0b21veW9fcHV0X25hbWUoZS5hZ2dyZWdhdGVkX25hbWUpOwogCXJldHVybiBlcnJvcjsKIH0KIAogLyoqCi0gKiB0b21veW9fcmVhZF9hbGlhc19wb2xpY3kgLSBSZWFkICJzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5IiBsaXN0LgotICoKLSAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCi0gKgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgotICovCi1ib29sIHRvbW95b19yZWFkX2FsaWFzX3BvbGljeShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0JYm9vbCBkb25lID0gdHJ1ZTsKLQotCWxpc3RfZm9yX2VhY2hfY29va2llKHBvcywgaGVhZC0+cmVhZF92YXIyLCAmdG9tb3lvX2FsaWFzX2xpc3QpIHsKLQkJc3RydWN0IHRvbW95b19hbGlhc19lbnRyeSAqcHRyOwotCi0JCXB0ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5LCBsaXN0KTsKLQkJaWYgKHB0ci0+aXNfZGVsZXRlZCkKLQkJCWNvbnRpbnVlOwotCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCBUT01PWU9fS0VZV09SRF9BTElBUyAiJXMgJXNcbiIsCi0JCQkJCXB0ci0+b3JpZ2luYWxfbmFtZS0+bmFtZSwKLQkJCQkJcHRyLT5hbGlhc2VkX25hbWUtPm5hbWUpOwotCQlpZiAoIWRvbmUpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIGRvbmU7Ci19Ci0KLS8qKgotICogdG9tb3lvX3dyaXRlX2FsaWFzX3BvbGljeSAtIFdyaXRlICJzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5IiBsaXN0LgorICogdG9tb3lvX3dyaXRlX2FnZ3JlZ2F0b3IgLSBXcml0ZSAic3RydWN0IHRvbW95b19hZ2dyZWdhdG9yIiBsaXN0LgogICoKICAqIEBkYXRhOiAgICAgIFN0cmluZyB0byBwYXJzZS4KICAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KQEAgLTYwNiwxOCArMzQyLDE4IEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotaW50IHRvbW95b193cml0ZV9hbGlhc19wb2xpY3koY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpCitpbnQgdG9tb3lvX3dyaXRlX2FnZ3JlZ2F0b3IoY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpCiB7CiAJY2hhciAqY3AgPSBzdHJjaHIoZGF0YSwgJyAnKTsKIAogCWlmICghY3ApCiAJCXJldHVybiAtRUlOVkFMOwogCSpjcCsrID0gJ1wwJzsKLQlyZXR1cm4gdG9tb3lvX3VwZGF0ZV9hbGlhc19lbnRyeShkYXRhLCBjcCwgaXNfZGVsZXRlKTsKKwlyZXR1cm4gdG9tb3lvX3VwZGF0ZV9hZ2dyZWdhdG9yX2VudHJ5KGRhdGEsIGNwLCBpc19kZWxldGUpOwogfQogCiAvKioKLSAqIHRvbW95b19maW5kX29yX2Fzc2lnbl9uZXdfZG9tYWluIC0gQ3JlYXRlIGEgZG9tYWluLgorICogdG9tb3lvX2Fzc2lnbl9kb21haW4gLSBDcmVhdGUgYSBkb21haW4uCiAgKgogICogQGRvbWFpbm5hbWU6IFRoZSBuYW1lIG9mIGRvbWFpbi4KICAqIEBwcm9maWxlOiAgICBQcm9maWxlIG51bWJlciB0byBhc3NpZ24gaWYgdGhlIGRvbWFpbiB3YXMgbmV3bHkgY3JlYXRlZC4KQEAgLTYyNiwxNiArMzYyLDE1IEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqdG9tb3lvX2ZpbmRfb3JfYXNzaWduX25ld19kb21haW4oY29uc3QgY2hhciAqCi0JCQkJCQkJICAgIGRvbWFpbm5hbWUsCi0JCQkJCQkJICAgIGNvbnN0IHU4IHByb2ZpbGUpCitzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICp0b21veW9fYXNzaWduX2RvbWFpbihjb25zdCBjaGFyICpkb21haW5uYW1lLAorCQkJCQkJY29uc3QgdTggcHJvZmlsZSkKIHsKIAlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICplbnRyeTsKIAlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPSBOVUxMOwogCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpzYXZlZF9kb21haW5uYW1lOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAotCWlmICghdG9tb3lvX2lzX2NvcnJlY3RfZG9tYWluKGRvbWFpbm5hbWUpKQorCWlmICghdG9tb3lvX2NvcnJlY3RfZG9tYWluKGRvbWFpbm5hbWUpKQogCQlyZXR1cm4gTlVMTDsKIAlzYXZlZF9kb21haW5uYW1lID0gdG9tb3lvX2dldF9uYW1lKGRvbWFpbm5hbWUpOwogCWlmICghc2F2ZWRfZG9tYWlubmFtZSkKQEAgLTY3OCwxMTYgKzQxMywxMTggQEAKICAqLwogaW50IHRvbW95b19maW5kX25leHRfZG9tYWluKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiB7Ci0JLyoKLQkgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgc2l6ZSBvZiBidWZmZXIgcmV0dXJuZWQgYnkKLQkgKiB0b21veW9fcmVhbHBhdGgoKSA9IFRPTU9ZT19NQVhfUEFUSE5BTUVfTEVOLgotCSAqLwotCXN0cnVjdCB0b21veW9fcGFnZV9idWZmZXIgKnRtcCA9IGt6YWxsb2Moc2l6ZW9mKCp0bXApLCBHRlBfTk9GUyk7CisJc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gcjsKKwljaGFyICp0bXAgPSBremFsbG9jKFRPTU9ZT19FWEVDX1RNUFNJWkUsIEdGUF9OT0ZTKTsKIAlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpvbGRfZG9tYWluID0gdG9tb3lvX2RvbWFpbigpOwogCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiA9IE5VTEw7Ci0JY29uc3QgY2hhciAqb2xkX2RvbWFpbl9uYW1lID0gb2xkX2RvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZTsKIAljb25zdCBjaGFyICpvcmlnaW5hbF9uYW1lID0gYnBybS0+ZmlsZW5hbWU7Ci0JY2hhciAqbmV3X2RvbWFpbl9uYW1lID0gTlVMTDsKLQljaGFyICpyZWFsX3Byb2dyYW1fbmFtZSA9IE5VTEw7Ci0JY2hhciAqc3ltbGlua19wcm9ncmFtX25hbWUgPSBOVUxMOwotCWNvbnN0IHU4IG1vZGUgPSB0b21veW9fY2hlY2tfZmxhZ3Mob2xkX2RvbWFpbiwgVE9NT1lPX01BQ19GT1JfRklMRSk7Ci0JY29uc3QgYm9vbCBpc19lbmZvcmNlID0gKG1vZGUgPT0gMyk7CisJdTggbW9kZTsKKwlib29sIGlzX2VuZm9yY2U7CiAJaW50IHJldHZhbCA9IC1FTk9NRU07Ci0Jc3RydWN0IHRvbW95b19wYXRoX2luZm8gcjsgLyogcmVhbCBuYW1lICovCi0Jc3RydWN0IHRvbW95b19wYXRoX2luZm8gczsgLyogc3ltbGluayBuYW1lICovCi0Jc3RydWN0IHRvbW95b19wYXRoX2luZm8gbDsgLyogbGFzdCBuYW1lICovCi0Jc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7CisJYm9vbCBuZWVkX2tmcmVlID0gZmFsc2U7CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gcm4gPSB7IH07IC8qIHJlYWwgbmFtZSAqLwogCisJbW9kZSA9IHRvbW95b19pbml0X3JlcXVlc3RfaW5mbygmciwgTlVMTCwgVE9NT1lPX01BQ19GSUxFX0VYRUNVVEUpOworCWlzX2VuZm9yY2UgPSAobW9kZSA9PSBUT01PWU9fQ09ORklHX0VORk9SQ0lORyk7CiAJaWYgKCF0bXApCiAJCWdvdG8gb3V0OwogCi0JaWYgKCFpbml0aWFsaXplZCkgewotCQkvKgotCQkgKiBCdWlsdC1pbiBpbml0aWFsaXplcnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcG9saWNpZXMgYXJlCi0JCSAqIG5vdCBsb2FkZWQgdW50aWwgc3RhcnRpbmcgL3NiaW4vaW5pdC4KLQkJICovCi0JCXRvbW95b191cGRhdGVfZG9tYWluX2luaXRpYWxpemVyX2VudHJ5KE5VTEwsICIvc2Jpbi9ob3RwbHVnIiwKLQkJCQkJCSAgICAgICBmYWxzZSwgZmFsc2UpOwotCQl0b21veW9fdXBkYXRlX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeShOVUxMLCAiL3NiaW4vbW9kcHJvYmUiLAotCQkJCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0JCWluaXRpYWxpemVkID0gdHJ1ZTsKKyByZXRyeToKKwlpZiAobmVlZF9rZnJlZSkgeworCQlrZnJlZShybi5uYW1lKTsKKwkJbmVlZF9rZnJlZSA9IGZhbHNlOwogCX0KLQotCS8qIEdldCB0b21veW9fcmVhbHBhdGggb2YgcHJvZ3JhbS4gKi8KKwkvKiBHZXQgc3ltbGluaydzIHBhdGhuYW1lIG9mIHByb2dyYW0uICovCiAJcmV0dmFsID0gLUVOT0VOVDsKLQkvKiBJIGhvcGUgdG9tb3lvX3JlYWxwYXRoKCkgd29uJ3QgZmFpbCB3aXRoIC1FTk9NRU0uICovCi0JcmVhbF9wcm9ncmFtX25hbWUgPSB0b21veW9fcmVhbHBhdGgob3JpZ2luYWxfbmFtZSk7Ci0JaWYgKCFyZWFsX3Byb2dyYW1fbmFtZSkKKwlybi5uYW1lID0gdG9tb3lvX3JlYWxwYXRoX25vZm9sbG93KG9yaWdpbmFsX25hbWUpOworCWlmICghcm4ubmFtZSkKIAkJZ290byBvdXQ7Ci0JLyogR2V0IHRvbW95b19yZWFscGF0aCBvZiBzeW1ib2xpYyBsaW5rLiAqLwotCXN5bWxpbmtfcHJvZ3JhbV9uYW1lID0gdG9tb3lvX3JlYWxwYXRoX25vZm9sbG93KG9yaWdpbmFsX25hbWUpOwotCWlmICghc3ltbGlua19wcm9ncmFtX25hbWUpCi0JCWdvdG8gb3V0OworCXRvbW95b19maWxsX3BhdGhfaW5mbygmcm4pOworCW5lZWRfa2ZyZWUgPSB0cnVlOwogCi0Jci5uYW1lID0gcmVhbF9wcm9ncmFtX25hbWU7Ci0JdG9tb3lvX2ZpbGxfcGF0aF9pbmZvKCZyKTsKLQlzLm5hbWUgPSBzeW1saW5rX3Byb2dyYW1fbmFtZTsKLQl0b21veW9fZmlsbF9wYXRoX2luZm8oJnMpOwotCWwubmFtZSA9IHRvbW95b19nZXRfbGFzdF9uYW1lKG9sZF9kb21haW4pOwotCXRvbW95b19maWxsX3BhdGhfaW5mbygmbCk7Ci0KLQkvKiBDaGVjayAnYWxpYXMnIGRpcmVjdGl2ZS4gKi8KLQlpZiAodG9tb3lvX3BhdGhjbXAoJnIsICZzKSkgewotCQlzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5ICpwdHI7Ci0JCS8qIElzIHRoaXMgcHJvZ3JhbSBhbGxvd2VkIHRvIGJlIGNhbGxlZCB2aWEgc3ltYm9saWMgbGlua3M/ICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19hbGlhc19saXN0LCBsaXN0KSB7Ci0JCQlpZiAocHRyLT5pc19kZWxldGVkIHx8Ci0JCQkgICAgdG9tb3lvX3BhdGhjbXAoJnIsIHB0ci0+b3JpZ2luYWxfbmFtZSkgfHwKLQkJCSAgICB0b21veW9fcGF0aGNtcCgmcywgcHRyLT5hbGlhc2VkX25hbWUpKQorCS8qIENoZWNrICdhZ2dyZWdhdG9yJyBkaXJlY3RpdmUuICovCisJeworCQlzdHJ1Y3QgdG9tb3lvX2FnZ3JlZ2F0b3IgKnB0cjsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BvbGljeV9saXN0CisJCQkJCVtUT01PWU9fSURfQUdHUkVHQVRPUl0sIGhlYWQubGlzdCkgeworCQkJaWYgKHB0ci0+aGVhZC5pc19kZWxldGVkIHx8CisJCQkgICAgIXRvbW95b19wYXRoX21hdGNoZXNfcGF0dGVybigmcm4sCisJCQkJCQkJIHB0ci0+b3JpZ2luYWxfbmFtZSkpCiAJCQkJY29udGludWU7Ci0JCQltZW1zZXQocmVhbF9wcm9ncmFtX25hbWUsIDAsIFRPTU9ZT19NQVhfUEFUSE5BTUVfTEVOKTsKLQkJCXN0cm5jcHkocmVhbF9wcm9ncmFtX25hbWUsIHB0ci0+YWxpYXNlZF9uYW1lLT5uYW1lLAotCQkJCVRPTU9ZT19NQVhfUEFUSE5BTUVfTEVOIC0gMSk7Ci0JCQl0b21veW9fZmlsbF9wYXRoX2luZm8oJnIpOworCQkJa2ZyZWUocm4ubmFtZSk7CisJCQluZWVkX2tmcmVlID0gZmFsc2U7CisJCQkvKiBUaGlzIGlzIE9LIGJlY2F1c2UgaXQgaXMgcmVhZCBvbmx5LiAqLworCQkJcm4gPSAqcHRyLT5hZ2dyZWdhdGVkX25hbWU7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCS8qIENoZWNrIGV4ZWN1dGUgcGVybWlzc2lvbi4gKi8KLQlyZXR2YWwgPSB0b21veW9fY2hlY2tfZXhlY19wZXJtKG9sZF9kb21haW4sICZyKTsKKwlyZXR2YWwgPSB0b21veW9fcGF0aF9wZXJtaXNzaW9uKCZyLCBUT01PWU9fVFlQRV9FWEVDVVRFLCAmcm4pOworCWlmIChyZXR2YWwgPT0gVE9NT1lPX1JFVFJZX1JFUVVFU1QpCisJCWdvdG8gcmV0cnk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gb3V0OworCS8qCisJICogVG8gYmUgYWJsZSB0byBzcGVjaWZ5IGRvbWFpbm5hbWVzIHdpdGggd2lsZGNhcmRzLCB1c2UgdGhlCisJICogcGF0aG5hbWUgc3BlY2lmaWVkIGluIHRoZSBwb2xpY3kgKHdoaWNoIG1heSBjb250YWluCisJICogd2lsZGNhcmQpIHJhdGhlciB0aGFuIHRoZSBwYXRobmFtZSBwYXNzZWQgdG8gZXhlY3ZlKCkKKwkgKiAod2hpY2ggbmV2ZXIgY29udGFpbnMgd2lsZGNhcmQpLgorCSAqLworCWlmIChyLnBhcmFtLnBhdGgubWF0Y2hlZF9wYXRoKSB7CisJCWlmIChuZWVkX2tmcmVlKQorCQkJa2ZyZWUocm4ubmFtZSk7CisJCW5lZWRfa2ZyZWUgPSBmYWxzZTsKKwkJLyogVGhpcyBpcyBPSyBiZWNhdXNlIGl0IGlzIHJlYWQgb25seS4gKi8KKwkJcm4gPSAqci5wYXJhbS5wYXRoLm1hdGNoZWRfcGF0aDsKKwl9CiAKLQluZXdfZG9tYWluX25hbWUgPSB0bXAtPmJ1ZmZlcjsKLQlpZiAodG9tb3lvX2lzX2RvbWFpbl9pbml0aWFsaXplcihvbGRfZG9tYWluLT5kb21haW5uYW1lLCAmciwgJmwpKSB7CisJLyogQ2FsY3VsYXRlIGRvbWFpbiB0byB0cmFuc2l0IHRvLiAqLworCXN3aXRjaCAodG9tb3lvX3RyYW5zaXRpb25fdHlwZShvbGRfZG9tYWluLT5kb21haW5uYW1lLCAmcm4pKSB7CisJY2FzZSBUT01PWU9fVFJBTlNJVElPTl9DT05UUk9MX0lOSVRJQUxJWkU6CiAJCS8qIFRyYW5zaXQgdG8gdGhlIGNoaWxkIG9mIHRvbW95b19rZXJuZWxfZG9tYWluIGRvbWFpbi4gKi8KLQkJc25wcmludGYobmV3X2RvbWFpbl9uYW1lLCBUT01PWU9fTUFYX1BBVEhOQU1FX0xFTiArIDEsCi0JCQkgVE9NT1lPX1JPT1RfTkFNRSAiICIgIiVzIiwgcmVhbF9wcm9ncmFtX25hbWUpOwotCX0gZWxzZSBpZiAob2xkX2RvbWFpbiA9PSAmdG9tb3lvX2tlcm5lbF9kb21haW4gJiYKLQkJICAgIXRvbW95b19wb2xpY3lfbG9hZGVkKSB7Ci0JCS8qCi0JCSAqIE5lZWRuJ3QgdG8gdHJhbnNpdCBmcm9tIGtlcm5lbCBkb21haW4gYmVmb3JlIHN0YXJ0aW5nCi0JCSAqIC9zYmluL2luaXQuIEJ1dCB0cmFuc2l0IGZyb20ga2VybmVsIGRvbWFpbiBpZiBleGVjdXRpbmcKLQkJICogaW5pdGlhbGl6ZXJzIGJlY2F1c2UgdGhleSBtaWdodCBzdGFydCBiZWZvcmUgL3NiaW4vaW5pdC4KLQkJICovCi0JCWRvbWFpbiA9IG9sZF9kb21haW47Ci0JfSBlbHNlIGlmICh0b21veW9faXNfZG9tYWluX2tlZXBlcihvbGRfZG9tYWluLT5kb21haW5uYW1lLCAmciwgJmwpKSB7CisJCXNucHJpbnRmKHRtcCwgVE9NT1lPX0VYRUNfVE1QU0laRSAtIDEsIFRPTU9ZT19ST09UX05BTUUgIiAiCisJCQkgIiVzIiwgcm4ubmFtZSk7CisJCWJyZWFrOworCWNhc2UgVE9NT1lPX1RSQU5TSVRJT05fQ09OVFJPTF9LRUVQOgogCQkvKiBLZWVwIGN1cnJlbnQgZG9tYWluLiAqLwogCQlkb21haW4gPSBvbGRfZG9tYWluOwotCX0gZWxzZSB7Ci0JCS8qIE5vcm1hbCBkb21haW4gdHJhbnNpdGlvbi4gKi8KLQkJc25wcmludGYobmV3X2RvbWFpbl9uYW1lLCBUT01PWU9fTUFYX1BBVEhOQU1FX0xFTiArIDEsCi0JCQkgIiVzICVzIiwgb2xkX2RvbWFpbl9uYW1lLCByZWFsX3Byb2dyYW1fbmFtZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChvbGRfZG9tYWluID09ICZ0b21veW9fa2VybmVsX2RvbWFpbiAmJgorCQkgICAgIXRvbW95b19wb2xpY3lfbG9hZGVkKSB7CisJCQkvKgorCQkJICogTmVlZG4ndCB0byB0cmFuc2l0IGZyb20ga2VybmVsIGRvbWFpbiBiZWZvcmUKKwkJCSAqIHN0YXJ0aW5nIC9zYmluL2luaXQuIEJ1dCB0cmFuc2l0IGZyb20ga2VybmVsIGRvbWFpbgorCQkJICogaWYgZXhlY3V0aW5nIGluaXRpYWxpemVycyBiZWNhdXNlIHRoZXkgbWlnaHQgc3RhcnQKKwkJCSAqIGJlZm9yZSAvc2Jpbi9pbml0LgorCQkJICovCisJCQlkb21haW4gPSBvbGRfZG9tYWluOworCQl9IGVsc2UgeworCQkJLyogTm9ybWFsIGRvbWFpbiB0cmFuc2l0aW9uLiAqLworCQkJc25wcmludGYodG1wLCBUT01PWU9fRVhFQ19UTVBTSVpFIC0gMSwgIiVzICVzIiwKKwkJCQkgb2xkX2RvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZSwgcm4ubmFtZSk7CisJCX0KKwkJYnJlYWs7CiAJfQotCWlmIChkb21haW4gfHwgc3RybGVuKG5ld19kb21haW5fbmFtZSkgPj0gVE9NT1lPX01BWF9QQVRITkFNRV9MRU4pCisJaWYgKGRvbWFpbiB8fCBzdHJsZW4odG1wKSA+PSBUT01PWU9fRVhFQ19UTVBTSVpFIC0gMTApCiAJCWdvdG8gZG9uZTsKLQlkb21haW4gPSB0b21veW9fZmluZF9kb21haW4obmV3X2RvbWFpbl9uYW1lKTsKKwlkb21haW4gPSB0b21veW9fZmluZF9kb21haW4odG1wKTsKIAlpZiAoZG9tYWluKQogCQlnb3RvIGRvbmU7Ci0JaWYgKGlzX2VuZm9yY2UpCi0JCWdvdG8gZG9uZTsKLQlkb21haW4gPSB0b21veW9fZmluZF9vcl9hc3NpZ25fbmV3X2RvbWFpbihuZXdfZG9tYWluX25hbWUsCi0JCQkJCQkgIG9sZF9kb21haW4tPnByb2ZpbGUpOworCWlmIChpc19lbmZvcmNlKSB7CisJCWludCBlcnJvciA9IHRvbW95b19zdXBlcnZpc29yKCZyLCAiIyB3YW50cyB0byBjcmVhdGUgZG9tYWluXG4iCisJCQkJCSAgICAgICIlc1xuIiwgdG1wKTsKKwkJaWYgKGVycm9yID09IFRPTU9ZT19SRVRSWV9SRVFVRVNUKQorCQkJZ290byByZXRyeTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisJZG9tYWluID0gdG9tb3lvX2Fzc2lnbl9kb21haW4odG1wLCBvbGRfZG9tYWluLT5wcm9maWxlKTsKICBkb25lOgogCWlmIChkb21haW4pCiAJCWdvdG8gb3V0OwotCXByaW50ayhLRVJOX1dBUk5JTkcgIlRPTU9ZTy1FUlJPUjogRG9tYWluICclcycgbm90IGRlZmluZWQuXG4iLAotCSAgICAgICBuZXdfZG9tYWluX25hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIlRPTU9ZTy1FUlJPUjogRG9tYWluICclcycgbm90IGRlZmluZWQuXG4iLCB0bXApOwogCWlmIChpc19lbmZvcmNlKQogCQlyZXR2YWwgPSAtRVBFUk07CiAJZWxzZQpAQCAtNzk4LDggKzUzNSw4IEBACiAJLyogVXBkYXRlIHJlZmVyZW5jZSBjb3VudCBvbiAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIuICovCiAJYXRvbWljX2luYygmZG9tYWluLT51c2Vycyk7CiAJYnBybS0+Y3JlZC0+c2VjdXJpdHkgPSBkb21haW47Ci0Ja2ZyZWUocmVhbF9wcm9ncmFtX25hbWUpOwotCWtmcmVlKHN5bWxpbmtfcHJvZ3JhbV9uYW1lKTsKKwlpZiAobmVlZF9rZnJlZSkKKwkJa2ZyZWUocm4ubmFtZSk7CiAJa2ZyZWUodG1wKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL2ZpbGUuYyBiL3NlY3VyaXR5L3RvbW95by9maWxlLmMKaW5kZXggMWM2ZjgyMy4uOWQzMmYxOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL2ZpbGUuYworKysgYi9zZWN1cml0eS90b21veW8vZmlsZS5jCkBAIC0xLDQ4ICsxLDg4IEBACiAvKgogICogc2VjdXJpdHkvdG9tb3lvL2ZpbGUuYwogICoKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBEb21haW4tQmFzZWQgTWFuZGF0b3J5IEFjY2VzcyBDb250cm9sLgorICogUGF0aG5hbWUgcmVzdHJpY3Rpb24gZnVuY3Rpb25zLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5ICBOVFQgREFUQSBDT1JQT1JBVElPTgotICoKLSAqIFZlcnNpb246IDIuMi4wICAgMjAwOS8wNC8wMQotICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwICBOVFQgREFUQSBDT1JQT1JBVElPTgogICovCiAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLS8qIEtleXdvcmQgYXJyYXkgZm9yIHNpbmdsZSBwYXRoIG9wZXJhdGlvbnMuICovCi1zdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX3BhdGhfa2V5d29yZFtUT01PWU9fTUFYX1BBVEhfT1BFUkFUSU9OXSA9IHsKKy8qIEtleXdvcmQgYXJyYXkgZm9yIG9wZXJhdGlvbnMgd2l0aCBvbmUgcGF0aG5hbWUuICovCitjb25zdCBjaGFyICp0b21veW9fcGF0aF9rZXl3b3JkW1RPTU9ZT19NQVhfUEFUSF9PUEVSQVRJT05dID0gewogCVtUT01PWU9fVFlQRV9SRUFEX1dSSVRFXSA9ICJyZWFkL3dyaXRlIiwKIAlbVE9NT1lPX1RZUEVfRVhFQ1VURV0gICAgPSAiZXhlY3V0ZSIsCiAJW1RPTU9ZT19UWVBFX1JFQURdICAgICAgID0gInJlYWQiLAogCVtUT01PWU9fVFlQRV9XUklURV0gICAgICA9ICJ3cml0ZSIsCi0JW1RPTU9ZT19UWVBFX0NSRUFURV0gICAgID0gImNyZWF0ZSIsCiAJW1RPTU9ZT19UWVBFX1VOTElOS10gICAgID0gInVubGluayIsCi0JW1RPTU9ZT19UWVBFX01LRElSXSAgICAgID0gIm1rZGlyIiwKIAlbVE9NT1lPX1RZUEVfUk1ESVJdICAgICAgPSAicm1kaXIiLAotCVtUT01PWU9fVFlQRV9NS0ZJRk9dICAgICA9ICJta2ZpZm8iLAotCVtUT01PWU9fVFlQRV9NS1NPQ0tdICAgICA9ICJta3NvY2siLAotCVtUT01PWU9fVFlQRV9NS0JMT0NLXSAgICA9ICJta2Jsb2NrIiwKLQlbVE9NT1lPX1RZUEVfTUtDSEFSXSAgICAgPSAibWtjaGFyIiwKIAlbVE9NT1lPX1RZUEVfVFJVTkNBVEVdICAgPSAidHJ1bmNhdGUiLAogCVtUT01PWU9fVFlQRV9TWU1MSU5LXSAgICA9ICJzeW1saW5rIiwKIAlbVE9NT1lPX1RZUEVfUkVXUklURV0gICAgPSAicmV3cml0ZSIsCisJW1RPTU9ZT19UWVBFX0NIUk9PVF0gICAgID0gImNocm9vdCIsCisJW1RPTU9ZT19UWVBFX1VNT1VOVF0gICAgID0gInVubW91bnQiLAorfTsKKworLyogS2V5d29yZCBhcnJheSBmb3Igb3BlcmF0aW9ucyB3aXRoIG9uZSBwYXRobmFtZSBhbmQgdGhyZWUgbnVtYmVycy4gKi8KK2NvbnN0IGNoYXIgKnRvbW95b19ta2Rldl9rZXl3b3JkW1RPTU9ZT19NQVhfTUtERVZfT1BFUkFUSU9OXSA9IHsKKwlbVE9NT1lPX1RZUEVfTUtCTE9DS10gICAgPSAibWtibG9jayIsCisJW1RPTU9ZT19UWVBFX01LQ0hBUl0gICAgID0gIm1rY2hhciIsCit9OworCisvKiBLZXl3b3JkIGFycmF5IGZvciBvcGVyYXRpb25zIHdpdGggdHdvIHBhdGhuYW1lcy4gKi8KK2NvbnN0IGNoYXIgKnRvbW95b19wYXRoMl9rZXl3b3JkW1RPTU9ZT19NQVhfUEFUSDJfT1BFUkFUSU9OXSA9IHsKKwlbVE9NT1lPX1RZUEVfTElOS10gICAgICAgPSAibGluayIsCisJW1RPTU9ZT19UWVBFX1JFTkFNRV0gICAgID0gInJlbmFtZSIsCisJW1RPTU9ZT19UWVBFX1BJVk9UX1JPT1RdID0gInBpdm90X3Jvb3QiLAorfTsKKworLyogS2V5d29yZCBhcnJheSBmb3Igb3BlcmF0aW9ucyB3aXRoIG9uZSBwYXRobmFtZSBhbmQgb25lIG51bWJlci4gKi8KK2NvbnN0IGNoYXIgKnRvbW95b19wYXRoX251bWJlcl9rZXl3b3JkW1RPTU9ZT19NQVhfUEFUSF9OVU1CRVJfT1BFUkFUSU9OXSA9IHsKKwlbVE9NT1lPX1RZUEVfQ1JFQVRFXSAgICAgPSAiY3JlYXRlIiwKKwlbVE9NT1lPX1RZUEVfTUtESVJdICAgICAgPSAibWtkaXIiLAorCVtUT01PWU9fVFlQRV9NS0ZJRk9dICAgICA9ICJta2ZpZm8iLAorCVtUT01PWU9fVFlQRV9NS1NPQ0tdICAgICA9ICJta3NvY2siLAogCVtUT01PWU9fVFlQRV9JT0NUTF0gICAgICA9ICJpb2N0bCIsCiAJW1RPTU9ZT19UWVBFX0NITU9EXSAgICAgID0gImNobW9kIiwKIAlbVE9NT1lPX1RZUEVfQ0hPV05dICAgICAgPSAiY2hvd24iLAogCVtUT01PWU9fVFlQRV9DSEdSUF0gICAgICA9ICJjaGdycCIsCi0JW1RPTU9ZT19UWVBFX0NIUk9PVF0gICAgID0gImNocm9vdCIsCi0JW1RPTU9ZT19UWVBFX01PVU5UXSAgICAgID0gIm1vdW50IiwKLQlbVE9NT1lPX1RZUEVfVU1PVU5UXSAgICAgPSAidW5tb3VudCIsCiB9OwogCi0vKiBLZXl3b3JkIGFycmF5IGZvciBkb3VibGUgcGF0aCBvcGVyYXRpb25zLiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnRvbW95b19wYXRoMl9rZXl3b3JkW1RPTU9ZT19NQVhfUEFUSDJfT1BFUkFUSU9OXSA9IHsKLQlbVE9NT1lPX1RZUEVfTElOS10gICAgPSAibGluayIsCi0JW1RPTU9ZT19UWVBFX1JFTkFNRV0gID0gInJlbmFtZSIsCi0JW1RPTU9ZT19UWVBFX1BJVk9UX1JPT1RdID0gInBpdm90X3Jvb3QiLAorc3RhdGljIGNvbnN0IHU4IHRvbW95b19wMm1hY1tUT01PWU9fTUFYX1BBVEhfT1BFUkFUSU9OXSA9IHsKKwlbVE9NT1lPX1RZUEVfUkVBRF9XUklURV0gPSBUT01PWU9fTUFDX0ZJTEVfT1BFTiwKKwlbVE9NT1lPX1RZUEVfRVhFQ1VURV0gICAgPSBUT01PWU9fTUFDX0ZJTEVfRVhFQ1VURSwKKwlbVE9NT1lPX1RZUEVfUkVBRF0gICAgICAgPSBUT01PWU9fTUFDX0ZJTEVfT1BFTiwKKwlbVE9NT1lPX1RZUEVfV1JJVEVdICAgICAgPSBUT01PWU9fTUFDX0ZJTEVfT1BFTiwKKwlbVE9NT1lPX1RZUEVfVU5MSU5LXSAgICAgPSBUT01PWU9fTUFDX0ZJTEVfVU5MSU5LLAorCVtUT01PWU9fVFlQRV9STURJUl0gICAgICA9IFRPTU9ZT19NQUNfRklMRV9STURJUiwKKwlbVE9NT1lPX1RZUEVfVFJVTkNBVEVdICAgPSBUT01PWU9fTUFDX0ZJTEVfVFJVTkNBVEUsCisJW1RPTU9ZT19UWVBFX1NZTUxJTktdICAgID0gVE9NT1lPX01BQ19GSUxFX1NZTUxJTkssCisJW1RPTU9ZT19UWVBFX1JFV1JJVEVdICAgID0gVE9NT1lPX01BQ19GSUxFX1JFV1JJVEUsCisJW1RPTU9ZT19UWVBFX0NIUk9PVF0gICAgID0gVE9NT1lPX01BQ19GSUxFX0NIUk9PVCwKKwlbVE9NT1lPX1RZUEVfVU1PVU5UXSAgICAgPSBUT01PWU9fTUFDX0ZJTEVfVU1PVU5ULAorfTsKKworc3RhdGljIGNvbnN0IHU4IHRvbW95b19wbm5uMm1hY1tUT01PWU9fTUFYX01LREVWX09QRVJBVElPTl0gPSB7CisJW1RPTU9ZT19UWVBFX01LQkxPQ0tdID0gVE9NT1lPX01BQ19GSUxFX01LQkxPQ0ssCisJW1RPTU9ZT19UWVBFX01LQ0hBUl0gID0gVE9NT1lPX01BQ19GSUxFX01LQ0hBUiwKK307CisKK3N0YXRpYyBjb25zdCB1OCB0b21veW9fcHAybWFjW1RPTU9ZT19NQVhfUEFUSDJfT1BFUkFUSU9OXSA9IHsKKwlbVE9NT1lPX1RZUEVfTElOS10gICAgICAgPSBUT01PWU9fTUFDX0ZJTEVfTElOSywKKwlbVE9NT1lPX1RZUEVfUkVOQU1FXSAgICAgPSBUT01PWU9fTUFDX0ZJTEVfUkVOQU1FLAorCVtUT01PWU9fVFlQRV9QSVZPVF9ST09UXSA9IFRPTU9ZT19NQUNfRklMRV9QSVZPVF9ST09ULAorfTsKKworc3RhdGljIGNvbnN0IHU4IHRvbW95b19wbjJtYWNbVE9NT1lPX01BWF9QQVRIX05VTUJFUl9PUEVSQVRJT05dID0geworCVtUT01PWU9fVFlQRV9DUkVBVEVdID0gVE9NT1lPX01BQ19GSUxFX0NSRUFURSwKKwlbVE9NT1lPX1RZUEVfTUtESVJdICA9IFRPTU9ZT19NQUNfRklMRV9NS0RJUiwKKwlbVE9NT1lPX1RZUEVfTUtGSUZPXSA9IFRPTU9ZT19NQUNfRklMRV9NS0ZJRk8sCisJW1RPTU9ZT19UWVBFX01LU09DS10gPSBUT01PWU9fTUFDX0ZJTEVfTUtTT0NLLAorCVtUT01PWU9fVFlQRV9JT0NUTF0gID0gVE9NT1lPX01BQ19GSUxFX0lPQ1RMLAorCVtUT01PWU9fVFlQRV9DSE1PRF0gID0gVE9NT1lPX01BQ19GSUxFX0NITU9ELAorCVtUT01PWU9fVFlQRV9DSE9XTl0gID0gVE9NT1lPX01BQ19GSUxFX0NIT1dOLAorCVtUT01PWU9fVFlQRV9DSEdSUF0gID0gVE9NT1lPX01BQ19GSUxFX0NIR1JQLAogfTsKIAogdm9pZCB0b21veW9fcHV0X25hbWVfdW5pb24oc3RydWN0IHRvbW95b19uYW1lX3VuaW9uICpwdHIpCkBAIC01MCw1NiArOTAsNDUgQEAKIAlpZiAoIXB0cikKIAkJcmV0dXJuOwogCWlmIChwdHItPmlzX2dyb3VwKQotCQl0b21veW9fcHV0X3BhdGhfZ3JvdXAocHRyLT5ncm91cCk7CisJCXRvbW95b19wdXRfZ3JvdXAocHRyLT5ncm91cCk7CiAJZWxzZQogCQl0b21veW9fcHV0X25hbWUocHRyLT5maWxlbmFtZSk7CiB9CiAKLWJvb2wgdG9tb3lvX2NvbXBhcmVfbmFtZV91bmlvbihjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqbmFtZSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gKnB0cikKK2NvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICoKK3RvbW95b19jb21wYXJlX25hbWVfdW5pb24oY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKm5hbWUsCisJCQkgIGNvbnN0IHN0cnVjdCB0b21veW9fbmFtZV91bmlvbiAqcHRyKQogewogCWlmIChwdHItPmlzX2dyb3VwKQotCQlyZXR1cm4gdG9tb3lvX3BhdGhfbWF0Y2hlc19ncm91cChuYW1lLCBwdHItPmdyb3VwLCAxKTsKLQlyZXR1cm4gdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKG5hbWUsIHB0ci0+ZmlsZW5hbWUpOworCQlyZXR1cm4gdG9tb3lvX3BhdGhfbWF0Y2hlc19ncm91cChuYW1lLCBwdHItPmdyb3VwKTsKKwlpZiAodG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKG5hbWUsIHB0ci0+ZmlsZW5hbWUpKQorCQlyZXR1cm4gcHRyLT5maWxlbmFtZTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgdG9tb3lvX2NvbXBhcmVfbmFtZV91bmlvbl9wYXR0ZXJuKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvCi0JCQkJCSAgICAgICpuYW1lLAotCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24KLQkJCQkJICAgICAgKnB0ciwgY29uc3QgYm9vbCBtYXlfdXNlX3BhdHRlcm4pCit2b2lkIHRvbW95b19wdXRfbnVtYmVyX3VuaW9uKHN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uICpwdHIpCit7CisJaWYgKHB0ciAmJiBwdHItPmlzX2dyb3VwKQorCQl0b21veW9fcHV0X2dyb3VwKHB0ci0+Z3JvdXApOworfQorCitib29sIHRvbW95b19jb21wYXJlX251bWJlcl91bmlvbihjb25zdCB1bnNpZ25lZCBsb25nIHZhbHVlLAorCQkJCSBjb25zdCBzdHJ1Y3QgdG9tb3lvX251bWJlcl91bmlvbiAqcHRyKQogewogCWlmIChwdHItPmlzX2dyb3VwKQotCQlyZXR1cm4gdG9tb3lvX3BhdGhfbWF0Y2hlc19ncm91cChuYW1lLCBwdHItPmdyb3VwLAotCQkJCQkJIG1heV91c2VfcGF0dGVybik7Ci0JaWYgKG1heV91c2VfcGF0dGVybiB8fCAhcHRyLT5maWxlbmFtZS0+aXNfcGF0dGVybmVkKQotCQlyZXR1cm4gdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKG5hbWUsIHB0ci0+ZmlsZW5hbWUpOwotCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRvbW95b19udW1iZXJfbWF0Y2hlc19ncm91cCh2YWx1ZSwgdmFsdWUsIHB0ci0+Z3JvdXApOworCXJldHVybiB2YWx1ZSA+PSBwdHItPnZhbHVlc1swXSAmJiB2YWx1ZSA8PSBwdHItPnZhbHVlc1sxXTsKIH0KIAotLyoqCi0gKiB0b21veW9fcGF0aDJrZXl3b3JkIC0gR2V0IHRoZSBuYW1lIG9mIHNpbmdsZSBwYXRoIG9wZXJhdGlvbi4KLSAqCi0gKiBAb3BlcmF0aW9uOiBUeXBlIG9mIG9wZXJhdGlvbi4KLSAqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHNpbmdsZSBwYXRoIG9wZXJhdGlvbi4KLSAqLwotY29uc3QgY2hhciAqdG9tb3lvX3BhdGgya2V5d29yZChjb25zdCB1OCBvcGVyYXRpb24pCitzdGF0aWMgdm9pZCB0b21veW9fYWRkX3NsYXNoKHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpidWYpCiB7Ci0JcmV0dXJuIChvcGVyYXRpb24gPCBUT01PWU9fTUFYX1BBVEhfT1BFUkFUSU9OKQotCQk/IHRvbW95b19wYXRoX2tleXdvcmRbb3BlcmF0aW9uXSA6IE5VTEw7Ci19Ci0KLS8qKgotICogdG9tb3lvX3BhdGgyMmtleXdvcmQgLSBHZXQgdGhlIG5hbWUgb2YgZG91YmxlIHBhdGggb3BlcmF0aW9uLgotICoKLSAqIEBvcGVyYXRpb246IFR5cGUgb2Ygb3BlcmF0aW9uLgotICoKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgZG91YmxlIHBhdGggb3BlcmF0aW9uLgotICovCi1jb25zdCBjaGFyICp0b21veW9fcGF0aDIya2V5d29yZChjb25zdCB1OCBvcGVyYXRpb24pCi17Ci0JcmV0dXJuIChvcGVyYXRpb24gPCBUT01PWU9fTUFYX1BBVEgyX09QRVJBVElPTikKLQkJPyB0b21veW9fcGF0aDJfa2V5d29yZFtvcGVyYXRpb25dIDogTlVMTDsKKwlpZiAoYnVmLT5pc19kaXIpCisJCXJldHVybjsKKwkvKgorCSAqIFRoaXMgaXMgT0sgYmVjYXVzZSB0b21veW9fZW5jb2RlKCkgcmVzZXJ2ZXMgc3BhY2UgZm9yIGFwcGVuZGluZyAiLyIuCisJICovCisJc3RyY2F0KChjaGFyICopIGJ1Zi0+bmFtZSwgIi8iKTsKKwl0b21veW9fZmlsbF9wYXRoX2luZm8oYnVmKTsKIH0KIAogLyoqCkBAIC0xMjEsNjkgKzE1MCwxMzQgQEAKIH0KIAogLyoqCi0gKiB0b21veW9fZ2V0X3BhdGggLSBHZXQgcmVhbHBhdGguCisgKiB0b21veW9fZ2V0X3JlYWxwYXRoIC0gR2V0IHJlYWxwYXRoLgogICoKKyAqIEBidWY6ICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyIuCiAgKiBAcGF0aDogUG9pbnRlciB0byAic3RydWN0IHBhdGgiLgogICoKLSAqIFJldHVybnMgcG9pbnRlciB0byAic3RydWN0IHRvbW95b19wYXRoX2luZm8iIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgorICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAqLwotc3RhdGljIHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICp0b21veW9fZ2V0X3BhdGgoc3RydWN0IHBhdGggKnBhdGgpCitzdGF0aWMgYm9vbCB0b21veW9fZ2V0X3JlYWxwYXRoKHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpidWYsIHN0cnVjdCBwYXRoICpwYXRoKQogewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mb193aXRoX2RhdGEgKmJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKCpidWYpLAotCQkJCQkJCSBHRlBfTk9GUyk7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIE5VTEw7Ci0JLyogUmVzZXJ2ZSBvbmUgYnl0ZSBmb3IgYXBwZW5kaW5nICIvIi4gKi8KLQllcnJvciA9IHRvbW95b19yZWFscGF0aF9mcm9tX3BhdGgyKHBhdGgsIGJ1Zi0+Ym9keSwKLQkJCQkJICAgc2l6ZW9mKGJ1Zi0+Ym9keSkgLSAyKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWJ1Zi0+aGVhZC5uYW1lID0gYnVmLT5ib2R5OwotCQl0b21veW9fZmlsbF9wYXRoX2luZm8oJmJ1Zi0+aGVhZCk7Ci0JCXJldHVybiAmYnVmLT5oZWFkOworCWJ1Zi0+bmFtZSA9IHRvbW95b19yZWFscGF0aF9mcm9tX3BhdGgocGF0aCk7CisJaWYgKGJ1Zi0+bmFtZSkgeworCQl0b21veW9fZmlsbF9wYXRoX2luZm8oYnVmKTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGludCB0b21veW9fdXBkYXRlX3BhdGgyX2FjbChjb25zdCB1OCB0eXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZTEsCi0JCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUyLAotCQkJCSAgIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmNvbnN0IGRvbWFpbiwKLQkJCQkgICBjb25zdCBib29sIGlzX2RlbGV0ZSk7Ci1zdGF0aWMgaW50IHRvbW95b191cGRhdGVfcGF0aF9hY2woY29uc3QgdTggdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkJICBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpjb25zdCBkb21haW4sCi0JCQkJICBjb25zdCBib29sIGlzX2RlbGV0ZSk7Ci0KLS8qCi0gKiB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgcGF0aG5hbWVzIHdoaWNoCi0gKiBhcmUgYnkgZGVmYXVsdCBhbGxvd2VkIHRvIGJlIG9wZW4oKWVkIGZvciByZWFkaW5nIGJ5IGFueSBwcm9jZXNzLgorLyoqCisgKiB0b21veW9fYXVkaXRfcGF0aF9sb2cgLSBBdWRpdCBwYXRoIHJlcXVlc3QgbG9nLgogICoKLSAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5CisgKiBAcjogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8iLgogICoKLSAqICMgZWNobyAnYWxsb3dfcmVhZCAvbGliL2xpYmMtMi41LnNvJyA+IFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5Ci0gKgotICogYW5kIGlzIGRlbGV0ZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2RlbGV0ZSBhbGxvd19yZWFkIC9saWIvbGliYy0yLjUuc28nID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKLSAqCi0gKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQotICoKLSAqICMgZ3JlcCBeYWxsb3dfcmVhZCAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCBhbnkgcHJvY2VzcyBpcyBhbGxvd2VkIHRvCi0gKiBvcGVuKCIvbGliL2xpYmMtMi41LnNvIiwgT19SRE9OTFkpLgotICogT25lIGV4Y2VwdGlvbiBpcywgaWYgdGhlIGRvbWFpbiB3aGljaCBjdXJyZW50IHByb2Nlc3MgYmVsb25ncyB0byBpcyBtYXJrZWQKLSAqIGFzICJpZ25vcmVfZ2xvYmFsX2FsbG93X3JlYWQiLCBjdXJyZW50IHByb2Nlc3MgY2FuJ3QgZG8gc28gdW5sZXNzIGV4cGxpY2l0bHkKLSAqIGdpdmVuICJhbGxvd19yZWFkIC9saWIvbGliYy0yLjUuc28iIHRvIHRoZSBkb21haW4gd2hpY2ggY3VycmVudCBwcm9jZXNzCi0gKiBiZWxvbmdzIHRvLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KICAqLwotTElTVF9IRUFEKHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9saXN0KTsKK3N0YXRpYyBpbnQgdG9tb3lvX2F1ZGl0X3BhdGhfbG9nKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyKQoreworCWNvbnN0IGNoYXIgKm9wZXJhdGlvbiA9IHRvbW95b19wYXRoX2tleXdvcmRbci0+cGFyYW0ucGF0aC5vcGVyYXRpb25dOworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSA9IHItPnBhcmFtLnBhdGguZmlsZW5hbWU7CisJaWYgKHItPmdyYW50ZWQpCisJCXJldHVybiAwOworCXRvbW95b193YXJuX2xvZyhyLCAiJXMgJXMiLCBvcGVyYXRpb24sIGZpbGVuYW1lLT5uYW1lKTsKKwlyZXR1cm4gdG9tb3lvX3N1cGVydmlzb3IociwgImFsbG93XyVzICVzXG4iLCBvcGVyYXRpb24sCisJCQkJIHRvbW95b19wYXR0ZXJuKGZpbGVuYW1lKSk7Cit9CiAKIC8qKgotICogdG9tb3lvX3VwZGF0ZV9nbG9iYWxseV9yZWFkYWJsZV9lbnRyeSAtIFVwZGF0ZSAic3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5IiBsaXN0LgorICogdG9tb3lvX2F1ZGl0X3BhdGgyX2xvZyAtIEF1ZGl0IHBhdGgvcGF0aCByZXF1ZXN0IGxvZy4KKyAqCisgKiBAcjogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8iLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgdG9tb3lvX2F1ZGl0X3BhdGgyX2xvZyhzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqcikKK3sKKwljb25zdCBjaGFyICpvcGVyYXRpb24gPSB0b21veW9fcGF0aDJfa2V5d29yZFtyLT5wYXJhbS5wYXRoMi5vcGVyYXRpb25dOworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZTEgPSByLT5wYXJhbS5wYXRoMi5maWxlbmFtZTE7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lMiA9IHItPnBhcmFtLnBhdGgyLmZpbGVuYW1lMjsKKwlpZiAoci0+Z3JhbnRlZCkKKwkJcmV0dXJuIDA7CisJdG9tb3lvX3dhcm5fbG9nKHIsICIlcyAlcyAlcyIsIG9wZXJhdGlvbiwgZmlsZW5hbWUxLT5uYW1lLAorCQkJZmlsZW5hbWUyLT5uYW1lKTsKKwlyZXR1cm4gdG9tb3lvX3N1cGVydmlzb3IociwgImFsbG93XyVzICVzICVzXG4iLCBvcGVyYXRpb24sCisJCQkJIHRvbW95b19wYXR0ZXJuKGZpbGVuYW1lMSksCisJCQkJIHRvbW95b19wYXR0ZXJuKGZpbGVuYW1lMikpOworfQorCisvKioKKyAqIHRvbW95b19hdWRpdF9ta2Rldl9sb2cgLSBBdWRpdCBwYXRoL251bWJlci9udW1iZXIvbnVtYmVyIHJlcXVlc3QgbG9nLgorICoKKyAqIEByOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0b21veW9fYXVkaXRfbWtkZXZfbG9nKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyKQoreworCWNvbnN0IGNoYXIgKm9wZXJhdGlvbiA9IHRvbW95b19ta2Rldl9rZXl3b3JkW3ItPnBhcmFtLm1rZGV2Lm9wZXJhdGlvbl07CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lID0gci0+cGFyYW0ubWtkZXYuZmlsZW5hbWU7CisJY29uc3QgdW5zaWduZWQgaW50IG1ham9yID0gci0+cGFyYW0ubWtkZXYubWFqb3I7CisJY29uc3QgdW5zaWduZWQgaW50IG1pbm9yID0gci0+cGFyYW0ubWtkZXYubWlub3I7CisJY29uc3QgdW5zaWduZWQgaW50IG1vZGUgPSByLT5wYXJhbS5ta2Rldi5tb2RlOworCWlmIChyLT5ncmFudGVkKQorCQlyZXR1cm4gMDsKKwl0b21veW9fd2Fybl9sb2cociwgIiVzICVzIDAlbyAldSAldSIsIG9wZXJhdGlvbiwgZmlsZW5hbWUtPm5hbWUsIG1vZGUsCisJCQltYWpvciwgbWlub3IpOworCXJldHVybiB0b21veW9fc3VwZXJ2aXNvcihyLCAiYWxsb3dfJXMgJXMgMCVvICV1ICV1XG4iLCBvcGVyYXRpb24sCisJCQkJIHRvbW95b19wYXR0ZXJuKGZpbGVuYW1lKSwgbW9kZSwgbWFqb3IsIG1pbm9yKTsKK30KKworLyoqCisgKiB0b21veW9fYXVkaXRfcGF0aF9udW1iZXJfbG9nIC0gQXVkaXQgcGF0aC9udW1iZXIgcmVxdWVzdCBsb2cuCisgKgorICogQHI6ICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIuCisgKiBAZXJyb3I6IEVycm9yIGNvZGUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0b21veW9fYXVkaXRfcGF0aF9udW1iZXJfbG9nKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyKQoreworCWNvbnN0IHU4IHR5cGUgPSByLT5wYXJhbS5wYXRoX251bWJlci5vcGVyYXRpb247CisJdTggcmFkaXg7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lID0gci0+cGFyYW0ucGF0aF9udW1iZXIuZmlsZW5hbWU7CisJY29uc3QgY2hhciAqb3BlcmF0aW9uID0gdG9tb3lvX3BhdGhfbnVtYmVyX2tleXdvcmRbdHlwZV07CisJY2hhciBidWZmZXJbNjRdOworCWlmIChyLT5ncmFudGVkKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRPTU9ZT19UWVBFX0NSRUFURToKKwljYXNlIFRPTU9ZT19UWVBFX01LRElSOgorCWNhc2UgVE9NT1lPX1RZUEVfTUtGSUZPOgorCWNhc2UgVE9NT1lPX1RZUEVfTUtTT0NLOgorCWNhc2UgVE9NT1lPX1RZUEVfQ0hNT0Q6CisJCXJhZGl4ID0gVE9NT1lPX1ZBTFVFX1RZUEVfT0NUQUw7CisJCWJyZWFrOworCWNhc2UgVE9NT1lPX1RZUEVfSU9DVEw6CisJCXJhZGl4ID0gVE9NT1lPX1ZBTFVFX1RZUEVfSEVYQURFQ0lNQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJhZGl4ID0gVE9NT1lPX1ZBTFVFX1RZUEVfREVDSU1BTDsKKwkJYnJlYWs7CisJfQorCXRvbW95b19wcmludF91bG9uZyhidWZmZXIsIHNpemVvZihidWZmZXIpLCByLT5wYXJhbS5wYXRoX251bWJlci5udW1iZXIsCisJCQkgICByYWRpeCk7CisJdG9tb3lvX3dhcm5fbG9nKHIsICIlcyAlcyAlcyIsIG9wZXJhdGlvbiwgZmlsZW5hbWUtPm5hbWUsIGJ1ZmZlcik7CisJcmV0dXJuIHRvbW95b19zdXBlcnZpc29yKHIsICJhbGxvd18lcyAlcyAlc1xuIiwgb3BlcmF0aW9uLAorCQkJCSB0b21veW9fcGF0dGVybihmaWxlbmFtZSksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBib29sIHRvbW95b19zYW1lX2dsb2JhbGx5X3JlYWRhYmxlKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmEsCisJCQkJCSAgY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGEsIHN0cnVjdCB0b21veW9fcmVhZGFibGVfZmlsZSwKKwkJCSAgICBoZWFkKS0+ZmlsZW5hbWUgPT0KKwkJY29udGFpbmVyX29mKGIsIHN0cnVjdCB0b21veW9fcmVhZGFibGVfZmlsZSwKKwkJCSAgICAgaGVhZCktPmZpbGVuYW1lOworfQorCisvKioKKyAqIHRvbW95b191cGRhdGVfZ2xvYmFsbHlfcmVhZGFibGVfZW50cnkgLSBVcGRhdGUgInN0cnVjdCB0b21veW9fcmVhZGFibGVfZmlsZSIgbGlzdC4KICAqCiAgKiBAZmlsZW5hbWU6ICBGaWxlbmFtZSB1bmNvbmRpdGlvbmFsbHkgcGVybWl0dGVkIHRvIG9wZW4oKSBmb3IgcmVhZGluZy4KICAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KQEAgLTE5NSw0MSArMjg5LDI0IEBACiBzdGF0aWMgaW50IHRvbW95b191cGRhdGVfZ2xvYmFsbHlfcmVhZGFibGVfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAJCQkJCQkgY29uc3QgYm9vbCBpc19kZWxldGUpCiB7Ci0Jc3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5ICpwdHI7Ci0Jc3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5IGUgPSB7IH07Ci0JaW50IGVycm9yID0gaXNfZGVsZXRlID8gLUVOT0VOVCA6IC1FTk9NRU07CisJc3RydWN0IHRvbW95b19yZWFkYWJsZV9maWxlIGUgPSB7IH07CisJaW50IGVycm9yOwogCi0JaWYgKCF0b21veW9faXNfY29ycmVjdF9wYXRoKGZpbGVuYW1lLCAxLCAwLCAtMSkpCisJaWYgKCF0b21veW9fY29ycmVjdF93b3JkKGZpbGVuYW1lKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZS5maWxlbmFtZSA9IHRvbW95b19nZXRfbmFtZShmaWxlbmFtZSk7CiAJaWYgKCFlLmZpbGVuYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b21veW9fcG9saWN5X2xvY2spKQotCQlnb3RvIG91dDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfbGlzdCwgbGlzdCkgewotCQlpZiAocHRyLT5maWxlbmFtZSAhPSBlLmZpbGVuYW1lKQotCQkJY29udGludWU7Ci0JCXB0ci0+aXNfZGVsZXRlZCA9IGlzX2RlbGV0ZTsKLQkJZXJyb3IgPSAwOwotCQlicmVhazsKLQl9Ci0JaWYgKCFpc19kZWxldGUgJiYgZXJyb3IpIHsKLQkJc3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5ICplbnRyeSA9Ci0JCQl0b21veW9fY29tbWl0X29rKCZlLCBzaXplb2YoZSkpOwotCQlpZiAoZW50cnkpIHsKLQkJCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+bGlzdCwKLQkJCQkJICAmdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3QpOwotCQkJZXJyb3IgPSAwOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmdG9tb3lvX3BvbGljeV9sb2NrKTsKLSBvdXQ6CisJZXJyb3IgPSB0b21veW9fdXBkYXRlX3BvbGljeSgmZS5oZWFkLCBzaXplb2YoZSksIGlzX2RlbGV0ZSwKKwkJCQkgICAgICZ0b21veW9fcG9saWN5X2xpc3QKKwkJCQkgICAgIFtUT01PWU9fSURfR0xPQkFMTFlfUkVBREFCTEVdLAorCQkJCSAgICAgdG9tb3lvX3NhbWVfZ2xvYmFsbHlfcmVhZGFibGUpOwogCXRvbW95b19wdXRfbmFtZShlLmZpbGVuYW1lKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgotICogdG9tb3lvX2lzX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGUgLSBDaGVjayBpZiB0aGUgZmlsZSBpcyB1bmNvbmRpdGlvbm5hbHkgcGVybWl0dGVkIHRvIGJlIG9wZW4oKWVkIGZvciByZWFkaW5nLgorICogdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGUgLSBDaGVjayBpZiB0aGUgZmlsZSBpcyB1bmNvbmRpdGlvbm5hbHkgcGVybWl0dGVkIHRvIGJlIG9wZW4oKWVkIGZvciByZWFkaW5nLgogICoKICAqIEBmaWxlbmFtZTogVGhlIGZpbGVuYW1lIHRvIGNoZWNrLgogICoKQEAgLTIzNywxNCArMzE0LDE1IEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGJvb2wgdG9tb3lvX2lzX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGUoY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKgorc3RhdGljIGJvb2wgdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGUoY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKgogCQkJCQkgICAgIGZpbGVuYW1lKQogewotCXN0cnVjdCB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfZmlsZV9lbnRyeSAqcHRyOworCXN0cnVjdCB0b21veW9fcmVhZGFibGVfZmlsZSAqcHRyOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9saXN0LCBsaXN0KSB7Ci0JCWlmICghcHRyLT5pc19kZWxldGVkICYmCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BvbGljeV9saXN0CisJCQkJW1RPTU9ZT19JRF9HTE9CQUxMWV9SRUFEQUJMRV0sIGhlYWQubGlzdCkgeworCQlpZiAoIXB0ci0+aGVhZC5pc19kZWxldGVkICYmCiAJCSAgICB0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4oZmlsZW5hbWUsIHB0ci0+ZmlsZW5hbWUpKSB7CiAJCQlmb3VuZCA9IHRydWU7CiAJCQlicmVhazsKQEAgLTI1NCw3ICszMzIsNyBAQAogfQogCiAvKioKLSAqIHRvbW95b193cml0ZV9nbG9iYWxseV9yZWFkYWJsZV9wb2xpY3kgLSBXcml0ZSAic3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5IiBsaXN0LgorICogdG9tb3lvX3dyaXRlX2dsb2JhbGx5X3JlYWRhYmxlIC0gV3JpdGUgInN0cnVjdCB0b21veW9fcmVhZGFibGVfZmlsZSIgbGlzdC4KICAqCiAgKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCiAgKiBAaXNfZGVsZXRlOiBUcnVlIGlmIGl0IGlzIGEgZGVsZXRlIHJlcXVlc3QuCkBAIC0yNjMsNzQgKzM0MSwyMCBAQAogICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLWludCB0b21veW9fd3JpdGVfZ2xvYmFsbHlfcmVhZGFibGVfcG9saWN5KGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQoraW50IHRvbW95b193cml0ZV9nbG9iYWxseV9yZWFkYWJsZShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSkKIHsKIAlyZXR1cm4gdG9tb3lvX3VwZGF0ZV9nbG9iYWxseV9yZWFkYWJsZV9lbnRyeShkYXRhLCBpc19kZWxldGUpOwogfQogCi0vKioKLSAqIHRvbW95b19yZWFkX2dsb2JhbGx5X3JlYWRhYmxlX3BvbGljeSAtIFJlYWQgInN0cnVjdCB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfZmlsZV9lbnRyeSIgbGlzdC4KLSAqCi0gKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgotICoKLSAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KLSAqLwotYm9vbCB0b21veW9fcmVhZF9nbG9iYWxseV9yZWFkYWJsZV9wb2xpY3koc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCitzdGF0aWMgYm9vbCB0b21veW9fc2FtZV9wYXR0ZXJuKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmEsCisJCQkJY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0JYm9vbCBkb25lID0gdHJ1ZTsKLQotCWxpc3RfZm9yX2VhY2hfY29va2llKHBvcywgaGVhZC0+cmVhZF92YXIyLAotCQkJICAgICAmdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3QpIHsKLQkJc3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5ICpwdHI7Ci0JCXB0ciA9IGxpc3RfZW50cnkocG9zLAotCQkJCSBzdHJ1Y3QgdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGVfZW50cnksCi0JCQkJIGxpc3QpOwotCQlpZiAocHRyLT5pc19kZWxldGVkKQotCQkJY29udGludWU7Ci0JCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0FMTE9XX1JFQUQgIiVzXG4iLAotCQkJCQlwdHItPmZpbGVuYW1lLT5uYW1lKTsKLQkJaWYgKCFkb25lKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBkb25lOworCXJldHVybiBjb250YWluZXJfb2YoYSwgc3RydWN0IHRvbW95b19ub19wYXR0ZXJuLCBoZWFkKS0+cGF0dGVybiA9PQorCQljb250YWluZXJfb2YoYiwgc3RydWN0IHRvbW95b19ub19wYXR0ZXJuLCBoZWFkKS0+cGF0dGVybjsKIH0KIAotLyogdG9tb3lvX3BhdHRlcm5fbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgcGF0aG5hbWVzIHdoaWNoIGFyZSB1c2VkIGZvcgotICogY29udmVydGluZyBwYXRobmFtZXMgdG8gcGF0aG5hbWUgcGF0dGVybnMgZHVyaW5nIGxlYXJuaW5nIG1vZGUuCi0gKgotICogQW4gZW50cnkgaXMgYWRkZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2ZpbGVfcGF0dGVybiAvcHJvYy9cJC9tb3VudHMnID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5Ci0gKgotICogYW5kIGlzIGRlbGV0ZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2RlbGV0ZSBmaWxlX3BhdHRlcm4gL3Byb2MvXCQvbW91bnRzJyA+IFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5Ci0gKgotICogIyBncmVwIF5maWxlX3BhdHRlcm4gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKLSAqCi0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaWYgYSBwcm9jZXNzIHdoaWNoIGJlbG9uZ3MgdG8gYSBkb21haW4gd2hpY2ggaXMgaW4KLSAqIGxlYXJuaW5nIG1vZGUgcmVxdWVzdGVkIG9wZW4oIi9wcm9jLzEvbW91bnRzIiwgT19SRE9OTFkpLAotICogImFsbG93X3JlYWQgL3Byb2MvXCQvbW91bnRzIiBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBkb21haW4gd2hpY2ggdGhhdAotICogcHJvY2VzcyBiZWxvbmdzIHRvLgotICoKLSAqIEl0IGlzIG5vdCBhIGRlc2lyYWJsZSBiZWhhdmlvciB0aGF0IHdlIGhhdmUgdG8gdXNlIC9wcm9jL1wkLyBpbnN0ZWFkIG9mCi0gKiAvcHJvYy9zZWxmLyB3aGVuIGN1cnJlbnQgcHJvY2VzcyBuZWVkcyB0byBhY2Nlc3Mgb25seSBjdXJyZW50IHByb2Nlc3MncwotICogaW5mb3JtYXRpb24uIEFzIG9mIG5vdywgTFNNIHZlcnNpb24gb2YgVE9NT1lPIGlzIHVzaW5nIF9fZF9wYXRoKCkgZm9yCi0gKiBjYWxjdWxhdGluZyBwYXRobmFtZS4gTm9uIExTTSB2ZXJzaW9uIG9mIFRPTU9ZTyBpcyB1c2luZyBpdHMgb3duIGZ1bmN0aW9uCi0gKiB3aGljaCBwcmV0ZW5kcyBhcyBpZiAvcHJvYy9zZWxmLyBpcyBub3QgYSBzeW1saW5rOyBzbyB0aGF0IHdlIGNhbiBmb3JiaWQKLSAqIGN1cnJlbnQgcHJvY2VzcyBmcm9tIGFjY2Vzc2luZyBvdGhlciBwcm9jZXNzJ3MgaW5mb3JtYXRpb24uCi0gKi8KLUxJU1RfSEVBRCh0b21veW9fcGF0dGVybl9saXN0KTsKLQogLyoqCi0gKiB0b21veW9fdXBkYXRlX2ZpbGVfcGF0dGVybl9lbnRyeSAtIFVwZGF0ZSAic3RydWN0IHRvbW95b19wYXR0ZXJuX2VudHJ5IiBsaXN0LgorICogdG9tb3lvX3VwZGF0ZV9maWxlX3BhdHRlcm5fZW50cnkgLSBVcGRhdGUgInN0cnVjdCB0b21veW9fbm9fcGF0dGVybiIgbGlzdC4KICAqCiAgKiBAcGF0dGVybjogICBQYXRobmFtZSBwYXR0ZXJuLgogICogQGlzX2RlbGV0ZTogVHJ1ZSBpZiBpdCBpcyBhIGRlbGV0ZSByZXF1ZXN0LgpAQCAtMzQyLDM5ICszNjYsMjMgQEAKIHN0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV9maWxlX3BhdHRlcm5fZW50cnkoY29uc3QgY2hhciAqcGF0dGVybiwKIAkJCQkJICAgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQogewotCXN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSAqcHRyOwotCXN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSBlID0geyAucGF0dGVybiA9IHRvbW95b19nZXRfbmFtZShwYXR0ZXJuKSB9OwotCWludCBlcnJvciA9IGlzX2RlbGV0ZSA/IC1FTk9FTlQgOiAtRU5PTUVNOworCXN0cnVjdCB0b21veW9fbm9fcGF0dGVybiBlID0geyB9OworCWludCBlcnJvcjsKIAorCWlmICghdG9tb3lvX2NvcnJlY3Rfd29yZChwYXR0ZXJuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZS5wYXR0ZXJuID0gdG9tb3lvX2dldF9uYW1lKHBhdHRlcm4pOwogCWlmICghZS5wYXR0ZXJuKQotCQlyZXR1cm4gZXJyb3I7Ci0JaWYgKCFlLnBhdHRlcm4tPmlzX3BhdHRlcm5lZCkKLQkJZ290byBvdXQ7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BhdHRlcm5fbGlzdCwgbGlzdCkgewotCQlpZiAoZS5wYXR0ZXJuICE9IHB0ci0+cGF0dGVybikKLQkJCWNvbnRpbnVlOwotCQlwdHItPmlzX2RlbGV0ZWQgPSBpc19kZWxldGU7Ci0JCWVycm9yID0gMDsKLQkJYnJlYWs7Ci0JfQotCWlmICghaXNfZGVsZXRlICYmIGVycm9yKSB7Ci0JCXN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSAqZW50cnkgPQotCQkJdG9tb3lvX2NvbW1pdF9vaygmZSwgc2l6ZW9mKGUpKTsKLQkJaWYgKGVudHJ5KSB7Ci0JCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsICZ0b21veW9fcGF0dGVybl9saXN0KTsKLQkJCWVycm9yID0gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRvbW95b19wb2xpY3lfbG9jayk7Ci0gb3V0OgorCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHRvbW95b191cGRhdGVfcG9saWN5KCZlLmhlYWQsIHNpemVvZihlKSwgaXNfZGVsZXRlLAorCQkJCSAgICAgJnRvbW95b19wb2xpY3lfbGlzdFtUT01PWU9fSURfUEFUVEVSTl0sCisJCQkJICAgICB0b21veW9fc2FtZV9wYXR0ZXJuKTsKIAl0b21veW9fcHV0X25hbWUoZS5wYXR0ZXJuKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgotICogdG9tb3lvX2dldF9maWxlX3BhdHRlcm4gLSBHZXQgcGF0dGVybmVkIHBhdGhuYW1lLgorICogdG9tb3lvX3BhdHRlcm4gLSBHZXQgcGF0dGVybmVkIHBhdGhuYW1lLgogICoKICAqIEBmaWxlbmFtZTogVGhlIGZpbGVuYW1lIHRvIGZpbmQgcGF0dGVybmVkIHBhdGhuYW1lLgogICoKQEAgLTM4MiwxNCArMzkwLDE0IEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICoKLXRvbW95b19nZXRfZmlsZV9wYXR0ZXJuKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSkKK2NvbnN0IGNoYXIgKnRvbW95b19wYXR0ZXJuKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3QgdG9tb3lvX3BhdHRlcm5fZW50cnkgKnB0cjsKKwlzdHJ1Y3QgdG9tb3lvX25vX3BhdHRlcm4gKnB0cjsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0dGVybiA9IE5VTEw7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fcGF0dGVybl9saXN0LCBsaXN0KSB7Ci0JCWlmIChwdHItPmlzX2RlbGV0ZWQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX3BvbGljeV9saXN0W1RPTU9ZT19JRF9QQVRURVJOXSwKKwkJCQloZWFkLmxpc3QpIHsKKwkJaWYgKHB0ci0+aGVhZC5pc19kZWxldGVkKQogCQkJY29udGludWU7CiAJCWlmICghdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKGZpbGVuYW1lLCBwdHItPnBhdHRlcm4pKQogCQkJY29udGludWU7CkBAIC00MDMsMTEgKzQxMSwxMSBAQAogCX0KIAlpZiAocGF0dGVybikKIAkJZmlsZW5hbWUgPSBwYXR0ZXJuOwotCXJldHVybiBmaWxlbmFtZTsKKwlyZXR1cm4gZmlsZW5hbWUtPm5hbWU7CiB9CiAKIC8qKgotICogdG9tb3lvX3dyaXRlX3BhdHRlcm5fcG9saWN5IC0gV3JpdGUgInN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSIgbGlzdC4KKyAqIHRvbW95b193cml0ZV9wYXR0ZXJuIC0gV3JpdGUgInN0cnVjdCB0b21veW9fbm9fcGF0dGVybiIgbGlzdC4KICAqCiAgKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCiAgKiBAaXNfZGVsZXRlOiBUcnVlIGlmIGl0IGlzIGEgZGVsZXRlIHJlcXVlc3QuCkBAIC00MTYsNzEgKzQyNCwyMSBAQAogICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLWludCB0b21veW9fd3JpdGVfcGF0dGVybl9wb2xpY3koY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpCitpbnQgdG9tb3lvX3dyaXRlX3BhdHRlcm4oY2hhciAqZGF0YSwgY29uc3QgYm9vbCBpc19kZWxldGUpCiB7CiAJcmV0dXJuIHRvbW95b191cGRhdGVfZmlsZV9wYXR0ZXJuX2VudHJ5KGRhdGEsIGlzX2RlbGV0ZSk7CiB9CiAKLS8qKgotICogdG9tb3lvX3JlYWRfZmlsZV9wYXR0ZXJuIC0gUmVhZCAic3RydWN0IHRvbW95b19wYXR0ZXJuX2VudHJ5IiBsaXN0LgotICoKLSAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCi0gKgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgotICovCi1ib29sIHRvbW95b19yZWFkX2ZpbGVfcGF0dGVybihzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3N0YXRpYyBib29sIHRvbW95b19zYW1lX25vX3Jld3JpdGUoY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkICpiKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlib29sIGRvbmUgPSB0cnVlOwotCi0JbGlzdF9mb3JfZWFjaF9jb29raWUocG9zLCBoZWFkLT5yZWFkX3ZhcjIsICZ0b21veW9fcGF0dGVybl9saXN0KSB7Ci0JCXN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSAqcHRyOwotCQlwdHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHRvbW95b19wYXR0ZXJuX2VudHJ5LCBsaXN0KTsKLQkJaWYgKHB0ci0+aXNfZGVsZXRlZCkKLQkJCWNvbnRpbnVlOwotCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCBUT01PWU9fS0VZV09SRF9GSUxFX1BBVFRFUk4KLQkJCQkJIiVzXG4iLCBwdHItPnBhdHRlcm4tPm5hbWUpOwotCQlpZiAoIWRvbmUpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIGRvbmU7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGUsIGhlYWQpLT5wYXR0ZXJuCisJCT09IGNvbnRhaW5lcl9vZihiLCBzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGUsIGhlYWQpCisJCS0+cGF0dGVybjsKIH0KIAotLyoKLSAqIHRvbW95b19ub19yZXdyaXRlX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBsaXN0IG9mIHBhdGhuYW1lcyB3aGljaCBhcmUgYnkKLSAqIGRlZmF1bHQgZm9yYmlkZGVuIHRvIG1vZGlmeSBhbHJlYWR5IHdyaXR0ZW4gY29udGVudCBvZiBhIGZpbGUuCi0gKgotICogQW4gZW50cnkgaXMgYWRkZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2RlbnlfcmV3cml0ZSAvdmFyL2xvZy9tZXNzYWdlcycgPiBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5Ci0gKgotICogYW5kIGlzIGRlbGV0ZWQgYnkKLSAqCi0gKiAjIGVjaG8gJ2RlbGV0ZSBkZW55X3Jld3JpdGUgL3Zhci9sb2cvbWVzc2FnZXMnID4gXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQotICoKLSAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5Ci0gKgotICogIyBncmVwIF5kZW55X3Jld3JpdGUgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKLSAqCi0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaWYgYSBwcm9jZXNzIHJlcXVlc3RlZCB0byByZXdyaXRlIC92YXIvbG9nL21lc3NhZ2VzICwKLSAqIHRoZSBwcm9jZXNzIGNhbid0IHJld3JpdGUgdW5sZXNzIHRoZSBkb21haW4gd2hpY2ggdGhhdCBwcm9jZXNzIGJlbG9uZ3MgdG8KLSAqIGhhcyAiYWxsb3dfcmV3cml0ZSAvdmFyL2xvZy9tZXNzYWdlcyIgZW50cnkuCi0gKgotICogSXQgaXMgbm90IGEgZGVzaXJhYmxlIGJlaGF2aW9yIHRoYXQgd2UgaGF2ZSB0byBhZGQgIlwwNDAoZGVsZXRlZCkiIHN1ZmZpeAotICogd2hlbiB3ZSB3YW50IHRvIGFsbG93IHJld3JpdGluZyBhbHJlYWR5IHVubGluaygpZWQgZmlsZS4gQXMgb2Ygbm93LAotICogTFNNIHZlcnNpb24gb2YgVE9NT1lPIGlzIHVzaW5nIF9fZF9wYXRoKCkgZm9yIGNhbGN1bGF0aW5nIHBhdGhuYW1lLgotICogTm9uIExTTSB2ZXJzaW9uIG9mIFRPTU9ZTyBpcyB1c2luZyBpdHMgb3duIGZ1bmN0aW9uIHdoaWNoIGRvZXNuJ3QgYXBwZW5kCi0gKiAiIChkZWxldGVkKSIgc3VmZml4IGlmIHRoZSBmaWxlIGlzIGFscmVhZHkgdW5saW5rKCllZDsgc28gdGhhdCB3ZSBkb24ndAotICogbmVlZCB0byB3b3JyeSB3aGV0aGVyIHRoZSBmaWxlIGlzIGFscmVhZHkgdW5saW5rKCllZCBvciBub3QuCi0gKi8KLUxJU1RfSEVBRCh0b21veW9fbm9fcmV3cml0ZV9saXN0KTsKLQogLyoqCi0gKiB0b21veW9fdXBkYXRlX25vX3Jld3JpdGVfZW50cnkgLSBVcGRhdGUgInN0cnVjdCB0b21veW9fbm9fcmV3cml0ZV9lbnRyeSIgbGlzdC4KKyAqIHRvbW95b191cGRhdGVfbm9fcmV3cml0ZV9lbnRyeSAtIFVwZGF0ZSAic3RydWN0IHRvbW95b19ub19yZXdyaXRlIiBsaXN0LgogICoKICAqIEBwYXR0ZXJuOiAgIFBhdGhuYW1lIHBhdHRlcm4gdGhhdCBhcmUgbm90IHJld3JpdGFibGUgYnkgZGVmYXVsdC4KICAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KQEAgLTQ5Miw0MSArNDUwLDIzIEBACiBzdGF0aWMgaW50IHRvbW95b191cGRhdGVfbm9fcmV3cml0ZV9lbnRyeShjb25zdCBjaGFyICpwYXR0ZXJuLAogCQkJCQkgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQogewotCXN0cnVjdCB0b21veW9fbm9fcmV3cml0ZV9lbnRyeSAqcHRyOwotCXN0cnVjdCB0b21veW9fbm9fcmV3cml0ZV9lbnRyeSBlID0geyB9OwotCWludCBlcnJvciA9IGlzX2RlbGV0ZSA/IC1FTk9FTlQgOiAtRU5PTUVNOworCXN0cnVjdCB0b21veW9fbm9fcmV3cml0ZSBlID0geyB9OworCWludCBlcnJvcjsKIAotCWlmICghdG9tb3lvX2lzX2NvcnJlY3RfcGF0aChwYXR0ZXJuLCAwLCAwLCAwKSkKKwlpZiAoIXRvbW95b19jb3JyZWN0X3dvcmQocGF0dGVybikpCiAJCXJldHVybiAtRUlOVkFMOwogCWUucGF0dGVybiA9IHRvbW95b19nZXRfbmFtZShwYXR0ZXJuKTsKIAlpZiAoIWUucGF0dGVybikKLQkJcmV0dXJuIGVycm9yOwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnRvbW95b19wb2xpY3lfbG9jaykpCi0JCWdvdG8gb3V0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19ub19yZXdyaXRlX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHB0ci0+cGF0dGVybiAhPSBlLnBhdHRlcm4pCi0JCQljb250aW51ZTsKLQkJcHRyLT5pc19kZWxldGVkID0gaXNfZGVsZXRlOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIWlzX2RlbGV0ZSAmJiBlcnJvcikgewotCQlzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGVfZW50cnkgKmVudHJ5ID0KLQkJCXRvbW95b19jb21taXRfb2soJmUsIHNpemVvZihlKSk7Ci0JCWlmIChlbnRyeSkgewotCQkJbGlzdF9hZGRfdGFpbF9yY3UoJmVudHJ5LT5saXN0LAotCQkJCQkgICZ0b21veW9fbm9fcmV3cml0ZV9saXN0KTsKLQkJCWVycm9yID0gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRvbW95b19wb2xpY3lfbG9jayk7Ci0gb3V0OgorCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHRvbW95b191cGRhdGVfcG9saWN5KCZlLmhlYWQsIHNpemVvZihlKSwgaXNfZGVsZXRlLAorCQkJCSAgICAgJnRvbW95b19wb2xpY3lfbGlzdFtUT01PWU9fSURfTk9fUkVXUklURV0sCisJCQkJICAgICB0b21veW9fc2FtZV9ub19yZXdyaXRlKTsKIAl0b21veW9fcHV0X25hbWUoZS5wYXR0ZXJuKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgotICogdG9tb3lvX2lzX25vX3Jld3JpdGVfZmlsZSAtIENoZWNrIGlmIHRoZSBnaXZlbiBwYXRobmFtZSBpcyBub3QgcGVybWl0dGVkIHRvIGJlIHJld3JpdGVkLgorICogdG9tb3lvX25vX3Jld3JpdGVfZmlsZSAtIENoZWNrIGlmIHRoZSBnaXZlbiBwYXRobmFtZSBpcyBub3QgcGVybWl0dGVkIHRvIGJlIHJld3JpdGVkLgogICoKICAqIEBmaWxlbmFtZTogRmlsZW5hbWUgdG8gY2hlY2suCiAgKgpAQCAtNTM1LDEzICs0NzUsMTQgQEAKICAqCiAgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgogICovCi1zdGF0aWMgYm9vbCB0b21veW9faXNfbm9fcmV3cml0ZV9maWxlKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSkKK3N0YXRpYyBib29sIHRvbW95b19ub19yZXdyaXRlX2ZpbGUoY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lKQogewotCXN0cnVjdCB0b21veW9fbm9fcmV3cml0ZV9lbnRyeSAqcHRyOworCXN0cnVjdCB0b21veW9fbm9fcmV3cml0ZSAqcHRyOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19ub19yZXdyaXRlX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHB0ci0+aXNfZGVsZXRlZCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fcG9saWN5X2xpc3RbVE9NT1lPX0lEX05PX1JFV1JJVEVdLAorCQkJCWhlYWQubGlzdCkgeworCQlpZiAocHRyLT5oZWFkLmlzX2RlbGV0ZWQpCiAJCQljb250aW51ZTsKIAkJaWYgKCF0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4oZmlsZW5hbWUsIHB0ci0+cGF0dGVybikpCiAJCQljb250aW51ZTsKQEAgLTU1Miw3ICs0OTMsNyBAQAogfQogCiAvKioKLSAqIHRvbW95b193cml0ZV9ub19yZXdyaXRlX3BvbGljeSAtIFdyaXRlICJzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGVfZW50cnkiIGxpc3QuCisgKiB0b21veW9fd3JpdGVfbm9fcmV3cml0ZSAtIFdyaXRlICJzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGUiIGxpc3QuCiAgKgogICogQGRhdGE6ICAgICAgU3RyaW5nIHRvIHBhcnNlLgogICogQGlzX2RlbGV0ZTogVHJ1ZSBpZiBpdCBpcyBhIGRlbGV0ZSByZXF1ZXN0LgpAQCAtNTYxLDI1NiArNTAyLDk2IEBACiAgKgogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwotaW50IHRvbW95b193cml0ZV9ub19yZXdyaXRlX3BvbGljeShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSkKK2ludCB0b21veW9fd3JpdGVfbm9fcmV3cml0ZShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSkKIHsKIAlyZXR1cm4gdG9tb3lvX3VwZGF0ZV9ub19yZXdyaXRlX2VudHJ5KGRhdGEsIGlzX2RlbGV0ZSk7CiB9CiAKLS8qKgotICogdG9tb3lvX3JlYWRfbm9fcmV3cml0ZV9wb2xpY3kgLSBSZWFkICJzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGVfZW50cnkiIGxpc3QuCi0gKgotICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KLSAqCi0gKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLWJvb2wgdG9tb3lvX3JlYWRfbm9fcmV3cml0ZV9wb2xpY3koc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCitzdGF0aWMgYm9vbCB0b21veW9fY2hlY2tfcGF0aF9hY2woc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKnIsCisJCQkJICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwdHIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCWJvb2wgZG9uZSA9IHRydWU7Ci0KLQlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShwb3MsIGhlYWQtPnJlYWRfdmFyMiwgJnRvbW95b19ub19yZXdyaXRlX2xpc3QpIHsKLQkJc3RydWN0IHRvbW95b19ub19yZXdyaXRlX2VudHJ5ICpwdHI7Ci0JCXB0ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGVfZW50cnksIGxpc3QpOwotCQlpZiAocHRyLT5pc19kZWxldGVkKQotCQkJY29udGludWU7Ci0JCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0RFTllfUkVXUklURQotCQkJCQkiJXNcbiIsIHB0ci0+cGF0dGVybi0+bmFtZSk7Ci0JCWlmICghZG9uZSkKLQkJCWJyZWFrOworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9hY2wgKmFjbCA9IGNvbnRhaW5lcl9vZihwdHIsIHR5cGVvZigqYWNsKSwKKwkJCQkJCQkgaGVhZCk7CisJaWYgKGFjbC0+cGVybSAmICgxIDw8IHItPnBhcmFtLnBhdGgub3BlcmF0aW9uKSkgeworCQlyLT5wYXJhbS5wYXRoLm1hdGNoZWRfcGF0aCA9CisJCQl0b21veW9fY29tcGFyZV9uYW1lX3VuaW9uKHItPnBhcmFtLnBhdGguZmlsZW5hbWUsCisJCQkJCQkgICZhY2wtPm5hbWUpOworCQlyZXR1cm4gci0+cGFyYW0ucGF0aC5tYXRjaGVkX3BhdGggIT0gTlVMTDsKIAl9Ci0JcmV0dXJuIGRvbmU7CisJcmV0dXJuIGZhbHNlOwogfQogCi0vKioKLSAqIHRvbW95b191cGRhdGVfZmlsZV9hY2wgLSBVcGRhdGUgZmlsZSdzIHJlYWQvd3JpdGUvZXhlY3V0ZSBBQ0wuCi0gKgotICogQGZpbGVuYW1lOiAgRmlsZW5hbWUuCi0gKiBAcGVybTogICAgICBQZXJtaXNzaW9uIChiZXR3ZWVuIDEgdG8gNykuCi0gKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KLSAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgotICoKLSAqIFRoaXMgaXMgbGVnYWN5IHN1cHBvcnQgaW50ZXJmYWNlIGZvciBvbGRlciBwb2xpY3kgc3ludGF4LgotICogQ3VycmVudCBwb2xpY3kgc3ludGF4IHVzZXMgImFsbG93X3JlYWQvd3JpdGUiIGluc3RlYWQgb2YgIjYiLAotICogImFsbG93X3JlYWQiIGluc3RlYWQgb2YgIjQiLCAiYWxsb3dfd3JpdGUiIGluc3RlYWQgb2YgIjIiLAotICogImFsbG93X2V4ZWN1dGUiIGluc3RlYWQgb2YgIjEiLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV9maWxlX2FjbChjb25zdCBjaGFyICpmaWxlbmFtZSwgdTggcGVybSwKLQkJCQkgIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKiBjb25zdCBkb21haW4sCitzdGF0aWMgYm9vbCB0b21veW9fY2hlY2tfcGF0aF9udW1iZXJfYWNsKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyLAorCQkJCQkgY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqcHRyKQoreworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9udW1iZXJfYWNsICphY2wgPQorCQljb250YWluZXJfb2YocHRyLCB0eXBlb2YoKmFjbCksIGhlYWQpOworCXJldHVybiAoYWNsLT5wZXJtICYgKDEgPDwgci0+cGFyYW0ucGF0aF9udW1iZXIub3BlcmF0aW9uKSkgJiYKKwkJdG9tb3lvX2NvbXBhcmVfbnVtYmVyX3VuaW9uKHItPnBhcmFtLnBhdGhfbnVtYmVyLm51bWJlciwKKwkJCQkJICAgICZhY2wtPm51bWJlcikgJiYKKwkJdG9tb3lvX2NvbXBhcmVfbmFtZV91bmlvbihyLT5wYXJhbS5wYXRoX251bWJlci5maWxlbmFtZSwKKwkJCQkJICAmYWNsLT5uYW1lKTsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX2NoZWNrX3BhdGgyX2FjbChzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwdHIpCit7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoMl9hY2wgKmFjbCA9CisJCWNvbnRhaW5lcl9vZihwdHIsIHR5cGVvZigqYWNsKSwgaGVhZCk7CisJcmV0dXJuIChhY2wtPnBlcm0gJiAoMSA8PCByLT5wYXJhbS5wYXRoMi5vcGVyYXRpb24pKSAmJgorCQl0b21veW9fY29tcGFyZV9uYW1lX3VuaW9uKHItPnBhcmFtLnBhdGgyLmZpbGVuYW1lMSwgJmFjbC0+bmFtZTEpCisJCSYmIHRvbW95b19jb21wYXJlX25hbWVfdW5pb24oci0+cGFyYW0ucGF0aDIuZmlsZW5hbWUyLAorCQkJCQkgICAgICZhY2wtPm5hbWUyKTsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX2NoZWNrX21rZGV2X2FjbChzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqciwKKwkJCQljb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwdHIpCit7CisJY29uc3Qgc3RydWN0IHRvbW95b19ta2Rldl9hY2wgKmFjbCA9CisJCWNvbnRhaW5lcl9vZihwdHIsIHR5cGVvZigqYWNsKSwgaGVhZCk7CisJcmV0dXJuIChhY2wtPnBlcm0gJiAoMSA8PCByLT5wYXJhbS5ta2Rldi5vcGVyYXRpb24pKSAmJgorCQl0b21veW9fY29tcGFyZV9udW1iZXJfdW5pb24oci0+cGFyYW0ubWtkZXYubW9kZSwKKwkJCQkJICAgICZhY2wtPm1vZGUpICYmCisJCXRvbW95b19jb21wYXJlX251bWJlcl91bmlvbihyLT5wYXJhbS5ta2Rldi5tYWpvciwKKwkJCQkJICAgICZhY2wtPm1ham9yKSAmJgorCQl0b21veW9fY29tcGFyZV9udW1iZXJfdW5pb24oci0+cGFyYW0ubWtkZXYubWlub3IsCisJCQkJCSAgICAmYWNsLT5taW5vcikgJiYKKwkJdG9tb3lvX2NvbXBhcmVfbmFtZV91bmlvbihyLT5wYXJhbS5ta2Rldi5maWxlbmFtZSwKKwkJCQkJICAmYWNsLT5uYW1lKTsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX3NhbWVfcGF0aF9hY2woY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYSwKKwkJCQkgY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYikKK3sKKwljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfYWNsICpwMSA9IGNvbnRhaW5lcl9vZihhLCB0eXBlb2YoKnAxKSwgaGVhZCk7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2FjbCAqcDIgPSBjb250YWluZXJfb2YoYiwgdHlwZW9mKCpwMiksIGhlYWQpOworCXJldHVybiB0b21veW9fc2FtZV9hY2xfaGVhZCgmcDEtPmhlYWQsICZwMi0+aGVhZCkgJiYKKwkJdG9tb3lvX3NhbWVfbmFtZV91bmlvbigmcDEtPm5hbWUsICZwMi0+bmFtZSk7Cit9CisKK3N0YXRpYyBib29sIHRvbW95b19tZXJnZV9wYXRoX2FjbChzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICphLAorCQkJCSAgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYiwKIAkJCQkgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQogewotCWlmIChwZXJtID4gNyB8fCAhcGVybSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludmFsaWQgcGVybWlzc2lvbiAnJWQgJXMnXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBlcm0sIGZpbGVuYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJdTE2ICogY29uc3QgYV9wZXJtID0gJmNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgdG9tb3lvX3BhdGhfYWNsLCBoZWFkKQorCQktPnBlcm07CisJdTE2IHBlcm0gPSAqYV9wZXJtOworCWNvbnN0IHUxNiBiX3Blcm0gPSBjb250YWluZXJfb2YoYiwgc3RydWN0IHRvbW95b19wYXRoX2FjbCwgaGVhZCktPnBlcm07CisJaWYgKGlzX2RlbGV0ZSkgeworCQlwZXJtICY9IH5iX3Blcm07CisJCWlmICgocGVybSAmIFRPTU9ZT19SV19NQVNLKSAhPSBUT01PWU9fUldfTUFTSykKKwkJCXBlcm0gJj0gfigxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEUpOworCQllbHNlIGlmICghKHBlcm0gJiAoMSA8PCBUT01PWU9fVFlQRV9SRUFEX1dSSVRFKSkpCisJCQlwZXJtICY9IH5UT01PWU9fUldfTUFTSzsKKwl9IGVsc2UgeworCQlwZXJtIHw9IGJfcGVybTsKKwkJaWYgKChwZXJtICYgVE9NT1lPX1JXX01BU0spID09IFRPTU9ZT19SV19NQVNLKQorCQkJcGVybSB8PSAoMSA8PCBUT01PWU9fVFlQRV9SRUFEX1dSSVRFKTsKKwkJZWxzZSBpZiAocGVybSAmICgxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEUpKQorCQkJcGVybSB8PSBUT01PWU9fUldfTUFTSzsKIAl9Ci0JaWYgKGZpbGVuYW1lWzBdICE9ICdAJyAmJiB0b21veW9fc3RyZW5kc3dpdGgoZmlsZW5hbWUsICIvIikpCi0JCS8qCi0JCSAqIE9ubHkgJ2FsbG93X21rZGlyJyBhbmQgJ2FsbG93X3JtZGlyJyBhcmUgdmFsaWQgZm9yCi0JCSAqIGRpcmVjdG9yeSBwZXJtaXNzaW9ucy4KLQkJICovCi0JCXJldHVybiAwOwotCWlmIChwZXJtICYgNCkKLQkJdG9tb3lvX3VwZGF0ZV9wYXRoX2FjbChUT01PWU9fVFlQRV9SRUFELCBmaWxlbmFtZSwgZG9tYWluLAotCQkJCSAgICAgICBpc19kZWxldGUpOwotCWlmIChwZXJtICYgMikKLQkJdG9tb3lvX3VwZGF0ZV9wYXRoX2FjbChUT01PWU9fVFlQRV9XUklURSwgZmlsZW5hbWUsIGRvbWFpbiwKLQkJCQkgICAgICAgaXNfZGVsZXRlKTsKLQlpZiAocGVybSAmIDEpCi0JCXRvbW95b191cGRhdGVfcGF0aF9hY2woVE9NT1lPX1RZUEVfRVhFQ1VURSwgZmlsZW5hbWUsIGRvbWFpbiwKLQkJCQkgICAgICAgaXNfZGVsZXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0b21veW9fcGF0aF9hY2wyIC0gQ2hlY2sgcGVybWlzc2lvbiBmb3Igc2luZ2xlIHBhdGggb3BlcmF0aW9uLgotICoKLSAqIEBkb21haW46ICAgICAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLgotICogQGZpbGVuYW1lOiAgICAgICAgRmlsZW5hbWUgdG8gY2hlY2suCi0gKiBAcGVybTogICAgICAgICAgICBQZXJtaXNzaW9uLgotICogQG1heV91c2VfcGF0dGVybjogVHJ1ZSBpZiBwYXR0ZXJuZWQgQUNMIGlzIHBlcm1pdHRlZC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVQRVJNIG90aGVyd2lzZS4KLSAqCi0gKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgotICovCi1zdGF0aWMgaW50IHRvbW95b19wYXRoX2FjbDIoY29uc3Qgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAotCQkJICAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSwKLQkJCSAgICBjb25zdCB1MzIgcGVybSwgY29uc3QgYm9vbCBtYXlfdXNlX3BhdHRlcm4pCi17Ci0Jc3RydWN0IHRvbW95b19hY2xfaW5mbyAqcHRyOwotCWludCBlcnJvciA9IC1FUEVSTTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCwgbGlzdCkgewotCQlzdHJ1Y3QgdG9tb3lvX3BhdGhfYWNsICphY2w7Ci0JCWlmIChwdHItPnR5cGUgIT0gVE9NT1lPX1RZUEVfUEFUSF9BQ0wpCi0JCQljb250aW51ZTsKLQkJYWNsID0gY29udGFpbmVyX29mKHB0ciwgc3RydWN0IHRvbW95b19wYXRoX2FjbCwgaGVhZCk7Ci0JCWlmIChwZXJtIDw9IDB4RkZGRikgewotCQkJaWYgKCEoYWNsLT5wZXJtICYgcGVybSkpCi0JCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIShhY2wtPnBlcm1faGlnaCAmIChwZXJtID4+IDE2KSkpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCF0b21veW9fY29tcGFyZV9uYW1lX3VuaW9uX3BhdHRlcm4oZmlsZW5hbWUsICZhY2wtPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5X3VzZV9wYXR0ZXJuKSkKLQkJCWNvbnRpbnVlOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogdG9tb3lvX2NoZWNrX2ZpbGVfYWNsIC0gQ2hlY2sgcGVybWlzc2lvbiBmb3Igb3BlbmluZyBmaWxlcy4KLSAqCi0gKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KLSAqIEBmaWxlbmFtZTogIEZpbGVuYW1lIHRvIGNoZWNrLgotICogQG9wZXJhdGlvbjogTW9kZSAoInJlYWQiIG9yICJ3cml0ZSIgb3IgInJlYWQvd3JpdGUiIG9yICJleGVjdXRlIikuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FUEVSTSBvdGhlcndpc2UuCi0gKgotICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KLSAqLwotc3RhdGljIGludCB0b21veW9fY2hlY2tfZmlsZV9hY2woY29uc3Qgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAotCQkJCSBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWUsCi0JCQkJIGNvbnN0IHU4IG9wZXJhdGlvbikKLXsKLQl1MzIgcGVybSA9IDA7Ci0KLQlpZiAoIXRvbW95b19jaGVja19mbGFncyhkb21haW4sIFRPTU9ZT19NQUNfRk9SX0ZJTEUpKQotCQlyZXR1cm4gMDsKLQlpZiAob3BlcmF0aW9uID09IDYpCi0JCXBlcm0gPSAxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEU7Ci0JZWxzZSBpZiAob3BlcmF0aW9uID09IDQpCi0JCXBlcm0gPSAxIDw8IFRPTU9ZT19UWVBFX1JFQUQ7Ci0JZWxzZSBpZiAob3BlcmF0aW9uID09IDIpCi0JCXBlcm0gPSAxIDw8IFRPTU9ZT19UWVBFX1dSSVRFOwotCWVsc2UgaWYgKG9wZXJhdGlvbiA9PSAxKQotCQlwZXJtID0gMSA8PCBUT01PWU9fVFlQRV9FWEVDVVRFOwotCWVsc2UKLQkJQlVHKCk7Ci0JcmV0dXJuIHRvbW95b19wYXRoX2FjbDIoZG9tYWluLCBmaWxlbmFtZSwgcGVybSwgb3BlcmF0aW9uICE9IDEpOwotfQotCi0vKioKLSAqIHRvbW95b19jaGVja19maWxlX3Blcm0yIC0gQ2hlY2sgcGVybWlzc2lvbiBmb3Igb3BlbmluZyBmaWxlcy4KLSAqCi0gKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KLSAqIEBmaWxlbmFtZTogIEZpbGVuYW1lIHRvIGNoZWNrLgotICogQHBlcm06ICAgICAgTW9kZSAoInJlYWQiIG9yICJ3cml0ZSIgb3IgInJlYWQvd3JpdGUiIG9yICJleGVjdXRlIikuCi0gKiBAb3BlcmF0aW9uOiBPcGVyYXRpb24gbmFtZSBwYXNzZWQgdXNlZCBmb3IgdmVyYm9zZSBtb2RlLgotICogQG1vZGU6ICAgICAgQWNjZXNzIGNvbnRyb2wgbW9kZS4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX2NoZWNrX2ZpbGVfcGVybTIoc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqIGNvbnN0IGRvbWFpbiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWUsCi0JCQkJICAgY29uc3QgdTggcGVybSwgY29uc3QgY2hhciAqb3BlcmF0aW9uLAotCQkJCSAgIGNvbnN0IHU4IG1vZGUpCi17Ci0JY29uc3QgYm9vbCBpc19lbmZvcmNlID0gKG1vZGUgPT0gMyk7Ci0JY29uc3QgY2hhciAqbXNnID0gIjx1bmtub3duPiI7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmICghZmlsZW5hbWUpCi0JCXJldHVybiAwOwotCWVycm9yID0gdG9tb3lvX2NoZWNrX2ZpbGVfYWNsKGRvbWFpbiwgZmlsZW5hbWUsIHBlcm0pOwotCWlmIChlcnJvciAmJiBwZXJtID09IDQgJiYgIWRvbWFpbi0+aWdub3JlX2dsb2JhbF9hbGxvd19yZWFkCi0JICAgICYmIHRvbW95b19pc19nbG9iYWxseV9yZWFkYWJsZV9maWxlKGZpbGVuYW1lKSkKLQkJZXJyb3IgPSAwOwotCWlmIChwZXJtID09IDYpCi0JCW1zZyA9IHRvbW95b19wYXRoMmtleXdvcmQoVE9NT1lPX1RZUEVfUkVBRF9XUklURSk7Ci0JZWxzZSBpZiAocGVybSA9PSA0KQotCQltc2cgPSB0b21veW9fcGF0aDJrZXl3b3JkKFRPTU9ZT19UWVBFX1JFQUQpOwotCWVsc2UgaWYgKHBlcm0gPT0gMikKLQkJbXNnID0gdG9tb3lvX3BhdGgya2V5d29yZChUT01PWU9fVFlQRV9XUklURSk7Ci0JZWxzZSBpZiAocGVybSA9PSAxKQotCQltc2cgPSB0b21veW9fcGF0aDJrZXl3b3JkKFRPTU9ZT19UWVBFX0VYRUNVVEUpOwotCWVsc2UKLQkJQlVHKCk7Ci0JaWYgKCFlcnJvcikKLQkJcmV0dXJuIDA7Ci0JaWYgKHRvbW95b192ZXJib3NlX21vZGUoZG9tYWluKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVE9NT1lPLSVzOiBBY2Nlc3MgJyVzKCVzKSAlcycgZGVuaWVkICIKLQkJICAgICAgICJmb3IgJXNcbiIsIHRvbW95b19nZXRfbXNnKGlzX2VuZm9yY2UpLCBtc2csIG9wZXJhdGlvbiwKLQkJICAgICAgIGZpbGVuYW1lLT5uYW1lLCB0b21veW9fZ2V0X2xhc3RfbmFtZShkb21haW4pKTsKLQlpZiAoaXNfZW5mb3JjZSkKLQkJcmV0dXJuIGVycm9yOwotCWlmIChtb2RlID09IDEgJiYgdG9tb3lvX2RvbWFpbl9xdW90YV9pc19vayhkb21haW4pKSB7Ci0JCS8qIERvbid0IHVzZSBwYXR0ZXJucyBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLiAqLwotCQljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0dGVybmVkX2ZpbGUgPSAocGVybSAhPSAxKSA/Ci0JCQl0b21veW9fZ2V0X2ZpbGVfcGF0dGVybihmaWxlbmFtZSkgOiBmaWxlbmFtZTsKLQkJdG9tb3lvX3VwZGF0ZV9maWxlX2FjbChwYXR0ZXJuZWRfZmlsZS0+bmFtZSwgcGVybSwKLQkJCQkgICAgICAgZG9tYWluLCBmYWxzZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHRvbW95b193cml0ZV9maWxlX3BvbGljeSAtIFVwZGF0ZSBmaWxlIHJlbGF0ZWQgbGlzdC4KLSAqCi0gKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCi0gKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KLSAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLWludCB0b21veW9fd3JpdGVfZmlsZV9wb2xpY3koY2hhciAqZGF0YSwgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAotCQkJICAgICBjb25zdCBib29sIGlzX2RlbGV0ZSkKLXsKLQljaGFyICpmaWxlbmFtZSA9IHN0cmNocihkYXRhLCAnICcpOwotCWNoYXIgKmZpbGVuYW1lMjsKLQl1bnNpZ25lZCBpbnQgcGVybTsKLQl1OCB0eXBlOwotCi0JaWYgKCFmaWxlbmFtZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JKmZpbGVuYW1lKysgPSAnXDAnOwotCWlmIChzc2NhbmYoZGF0YSwgIiV1IiwgJnBlcm0pID09IDEpCi0JCXJldHVybiB0b21veW9fdXBkYXRlX2ZpbGVfYWNsKGZpbGVuYW1lLCAodTgpIHBlcm0sIGRvbWFpbiwKLQkJCQkJICAgICAgaXNfZGVsZXRlKTsKLQlpZiAoc3RybmNtcChkYXRhLCAiYWxsb3dfIiwgNikpCi0JCWdvdG8gb3V0OwotCWRhdGEgKz0gNjsKLQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgVE9NT1lPX01BWF9QQVRIX09QRVJBVElPTjsgdHlwZSsrKSB7Ci0JCWlmIChzdHJjbXAoZGF0YSwgdG9tb3lvX3BhdGhfa2V5d29yZFt0eXBlXSkpCi0JCQljb250aW51ZTsKLQkJcmV0dXJuIHRvbW95b191cGRhdGVfcGF0aF9hY2wodHlwZSwgZmlsZW5hbWUsIGRvbWFpbiwKLQkJCQkJICAgICAgaXNfZGVsZXRlKTsKLQl9Ci0JZmlsZW5hbWUyID0gc3RyY2hyKGZpbGVuYW1lLCAnICcpOwotCWlmICghZmlsZW5hbWUyKQotCQlnb3RvIG91dDsKLQkqZmlsZW5hbWUyKysgPSAnXDAnOwotCWZvciAodHlwZSA9IDA7IHR5cGUgPCBUT01PWU9fTUFYX1BBVEgyX09QRVJBVElPTjsgdHlwZSsrKSB7Ci0JCWlmIChzdHJjbXAoZGF0YSwgdG9tb3lvX3BhdGgyX2tleXdvcmRbdHlwZV0pKQotCQkJY29udGludWU7Ci0JCXJldHVybiB0b21veW9fdXBkYXRlX3BhdGgyX2FjbCh0eXBlLCBmaWxlbmFtZSwgZmlsZW5hbWUyLAotCQkJCQkgICAgICAgZG9tYWluLCBpc19kZWxldGUpOwotCX0KLSBvdXQ6Ci0JcmV0dXJuIC1FSU5WQUw7CisJKmFfcGVybSA9IHBlcm07CisJcmV0dXJuICFwZXJtOwogfQogCiAvKioKQEAgLTgyNiw3MCArNjA3LDEyMyBAQAogICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KICAqLwogc3RhdGljIGludCB0b21veW9fdXBkYXRlX3BhdGhfYWNsKGNvbnN0IHU4IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJCSAgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqY29uc3QgZG9tYWluLAorCQkJCSAgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqIGNvbnN0IGRvbWFpbiwKIAkJCQkgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQogewotCXN0YXRpYyBjb25zdCB1MzIgdG9tb3lvX3J3X21hc2sgPQotCQkoMSA8PCBUT01PWU9fVFlQRV9SRUFEKSB8ICgxIDw8IFRPTU9ZT19UWVBFX1dSSVRFKTsKLQljb25zdCB1MzIgcGVybSA9IDEgPDwgdHlwZTsKLQlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwdHI7CiAJc3RydWN0IHRvbW95b19wYXRoX2FjbCBlID0gewogCQkuaGVhZC50eXBlID0gVE9NT1lPX1RZUEVfUEFUSF9BQ0wsCi0JCS5wZXJtX2hpZ2ggPSBwZXJtID4+IDE2LAotCQkucGVybSA9IHBlcm0KKwkJLnBlcm0gPSAxIDw8IHR5cGUKIAl9OwotCWludCBlcnJvciA9IGlzX2RlbGV0ZSA/IC1FTk9FTlQgOiAtRU5PTUVNOwotCi0JaWYgKHR5cGUgPT0gVE9NT1lPX1RZUEVfUkVBRF9XUklURSkKLQkJZS5wZXJtIHw9IHRvbW95b19yd19tYXNrOwotCWlmICghZG9tYWluKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpbnQgZXJyb3I7CisJaWYgKGUucGVybSA9PSAoMSA8PCBUT01PWU9fVFlQRV9SRUFEX1dSSVRFKSkKKwkJZS5wZXJtIHw9IFRPTU9ZT19SV19NQVNLOwogCWlmICghdG9tb3lvX3BhcnNlX25hbWVfdW5pb24oZmlsZW5hbWUsICZlLm5hbWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b21veW9fcG9saWN5X2xvY2spKQotCQlnb3RvIG91dDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZkb21haW4tPmFjbF9pbmZvX2xpc3QsIGxpc3QpIHsKLQkJc3RydWN0IHRvbW95b19wYXRoX2FjbCAqYWNsID0KLQkJCWNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCB0b21veW9fcGF0aF9hY2wsIGhlYWQpOwotCQlpZiAoIXRvbW95b19pc19zYW1lX3BhdGhfYWNsKGFjbCwgJmUpKQotCQkJY29udGludWU7Ci0JCWlmIChpc19kZWxldGUpIHsKLQkJCWlmIChwZXJtIDw9IDB4RkZGRikKLQkJCQlhY2wtPnBlcm0gJj0gfnBlcm07Ci0JCQllbHNlCi0JCQkJYWNsLT5wZXJtX2hpZ2ggJj0gfihwZXJtID4+IDE2KTsKLQkJCWlmICgoYWNsLT5wZXJtICYgdG9tb3lvX3J3X21hc2spICE9IHRvbW95b19yd19tYXNrKQotCQkJCWFjbC0+cGVybSAmPSB+KDEgPDwgVE9NT1lPX1RZUEVfUkVBRF9XUklURSk7Ci0JCQllbHNlIGlmICghKGFjbC0+cGVybSAmICgxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEUpKSkKLQkJCQlhY2wtPnBlcm0gJj0gfnRvbW95b19yd19tYXNrOwotCQl9IGVsc2UgewotCQkJaWYgKHBlcm0gPD0gMHhGRkZGKQotCQkJCWFjbC0+cGVybSB8PSBwZXJtOwotCQkJZWxzZQotCQkJCWFjbC0+cGVybV9oaWdoIHw9IChwZXJtID4+IDE2KTsKLQkJCWlmICgoYWNsLT5wZXJtICYgdG9tb3lvX3J3X21hc2spID09IHRvbW95b19yd19tYXNrKQotCQkJCWFjbC0+cGVybSB8PSAxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEU7Ci0JCQllbHNlIGlmIChhY2wtPnBlcm0gJiAoMSA8PCBUT01PWU9fVFlQRV9SRUFEX1dSSVRFKSkKLQkJCQlhY2wtPnBlcm0gfD0gdG9tb3lvX3J3X21hc2s7Ci0JCX0KLQkJZXJyb3IgPSAwOwotCQlicmVhazsKLQl9Ci0JaWYgKCFpc19kZWxldGUgJiYgZXJyb3IpIHsKLQkJc3RydWN0IHRvbW95b19wYXRoX2FjbCAqZW50cnkgPQotCQkJdG9tb3lvX2NvbW1pdF9vaygmZSwgc2l6ZW9mKGUpKTsKLQkJaWYgKGVudHJ5KSB7Ci0JCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmhlYWQubGlzdCwKLQkJCQkJICAmZG9tYWluLT5hY2xfaW5mb19saXN0KTsKLQkJCWVycm9yID0gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRvbW95b19wb2xpY3lfbG9jayk7Ci0gb3V0OgorCWVycm9yID0gdG9tb3lvX3VwZGF0ZV9kb21haW4oJmUuaGVhZCwgc2l6ZW9mKGUpLCBpc19kZWxldGUsIGRvbWFpbiwKKwkJCQkgICAgIHRvbW95b19zYW1lX3BhdGhfYWNsLAorCQkJCSAgICAgdG9tb3lvX21lcmdlX3BhdGhfYWNsKTsKIAl0b21veW9fcHV0X25hbWVfdW5pb24oJmUubmFtZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgYm9vbCB0b21veW9fc2FtZV9ta2Rldl9hY2woY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYSwKKwkJCQkJIGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmIpCit7CisJY29uc3Qgc3RydWN0IHRvbW95b19ta2Rldl9hY2wgKnAxID0gY29udGFpbmVyX29mKGEsIHR5cGVvZigqcDEpLAorCQkJCQkJCQloZWFkKTsKKwljb25zdCBzdHJ1Y3QgdG9tb3lvX21rZGV2X2FjbCAqcDIgPSBjb250YWluZXJfb2YoYiwgdHlwZW9mKCpwMiksCisJCQkJCQkJCWhlYWQpOworCXJldHVybiB0b21veW9fc2FtZV9hY2xfaGVhZCgmcDEtPmhlYWQsICZwMi0+aGVhZCkKKwkJJiYgdG9tb3lvX3NhbWVfbmFtZV91bmlvbigmcDEtPm5hbWUsICZwMi0+bmFtZSkKKwkJJiYgdG9tb3lvX3NhbWVfbnVtYmVyX3VuaW9uKCZwMS0+bW9kZSwgJnAyLT5tb2RlKQorCQkmJiB0b21veW9fc2FtZV9udW1iZXJfdW5pb24oJnAxLT5tYWpvciwgJnAyLT5tYWpvcikKKwkJJiYgdG9tb3lvX3NhbWVfbnVtYmVyX3VuaW9uKCZwMS0+bWlub3IsICZwMi0+bWlub3IpOworfQorCitzdGF0aWMgYm9vbCB0b21veW9fbWVyZ2VfbWtkZXZfYWNsKHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmEsCisJCQkJCSAgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYiwKKwkJCQkJICBjb25zdCBib29sIGlzX2RlbGV0ZSkKK3sKKwl1OCAqY29uc3QgYV9wZXJtID0gJmNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgdG9tb3lvX21rZGV2X2FjbCwKKwkJCQkJIGhlYWQpLT5wZXJtOworCXU4IHBlcm0gPSAqYV9wZXJtOworCWNvbnN0IHU4IGJfcGVybSA9IGNvbnRhaW5lcl9vZihiLCBzdHJ1Y3QgdG9tb3lvX21rZGV2X2FjbCwgaGVhZCkKKwkJLT5wZXJtOworCWlmIChpc19kZWxldGUpCisJCXBlcm0gJj0gfmJfcGVybTsKKwllbHNlCisJCXBlcm0gfD0gYl9wZXJtOworCSphX3Blcm0gPSBwZXJtOworCXJldHVybiAhcGVybTsKK30KKworLyoqCisgKiB0b21veW9fdXBkYXRlX21rZGV2X2FjbCAtIFVwZGF0ZSAic3RydWN0IHRvbW95b19ta2Rldl9hY2wiIGxpc3QuCisgKgorICogQHR5cGU6ICAgICAgVHlwZSBvZiBvcGVyYXRpb24uCisgKiBAZmlsZW5hbWU6ICBGaWxlbmFtZS4KKyAqIEBtb2RlOiAgICAgIENyZWF0ZSBtb2RlLgorICogQG1ham9yOiAgICAgRGV2aWNlIG1ham9yIG51bWJlci4KKyAqIEBtaW5vcjogICAgIERldmljZSBtaW5vciBudW1iZXIuCisgKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KKyAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICoKKyAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCisgKi8KK3N0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV9ta2Rldl9hY2woY29uc3QgdTggdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJCSAgY2hhciAqbW9kZSwgY2hhciAqbWFqb3IsIGNoYXIgKm1pbm9yLAorCQkJCQkgIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKiBjb25zdAorCQkJCQkgIGRvbWFpbiwgY29uc3QgYm9vbCBpc19kZWxldGUpCit7CisJc3RydWN0IHRvbW95b19ta2Rldl9hY2wgZSA9IHsKKwkJLmhlYWQudHlwZSA9IFRPTU9ZT19UWVBFX01LREVWX0FDTCwKKwkJLnBlcm0gPSAxIDw8IHR5cGUKKwl9OworCWludCBlcnJvciA9IGlzX2RlbGV0ZSA/IC1FTk9FTlQgOiAtRU5PTUVNOworCWlmICghdG9tb3lvX3BhcnNlX25hbWVfdW5pb24oZmlsZW5hbWUsICZlLm5hbWUpIHx8CisJICAgICF0b21veW9fcGFyc2VfbnVtYmVyX3VuaW9uKG1vZGUsICZlLm1vZGUpIHx8CisJICAgICF0b21veW9fcGFyc2VfbnVtYmVyX3VuaW9uKG1ham9yLCAmZS5tYWpvcikgfHwKKwkgICAgIXRvbW95b19wYXJzZV9udW1iZXJfdW5pb24obWlub3IsICZlLm1pbm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSB0b21veW9fdXBkYXRlX2RvbWFpbigmZS5oZWFkLCBzaXplb2YoZSksIGlzX2RlbGV0ZSwgZG9tYWluLAorCQkJCSAgICAgdG9tb3lvX3NhbWVfbWtkZXZfYWNsLAorCQkJCSAgICAgdG9tb3lvX21lcmdlX21rZGV2X2FjbCk7Cisgb3V0OgorCXRvbW95b19wdXRfbmFtZV91bmlvbigmZS5uYW1lKTsKKwl0b21veW9fcHV0X251bWJlcl91bmlvbigmZS5tb2RlKTsKKwl0b21veW9fcHV0X251bWJlcl91bmlvbigmZS5tYWpvcik7CisJdG9tb3lvX3B1dF9udW1iZXJfdW5pb24oJmUubWlub3IpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX3NhbWVfcGF0aDJfYWNsKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmEsCisJCQkJICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpiKQoreworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aDJfYWNsICpwMSA9IGNvbnRhaW5lcl9vZihhLCB0eXBlb2YoKnAxKSwgaGVhZCk7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoMl9hY2wgKnAyID0gY29udGFpbmVyX29mKGIsIHR5cGVvZigqcDIpLCBoZWFkKTsKKwlyZXR1cm4gdG9tb3lvX3NhbWVfYWNsX2hlYWQoJnAxLT5oZWFkLCAmcDItPmhlYWQpCisJCSYmIHRvbW95b19zYW1lX25hbWVfdW5pb24oJnAxLT5uYW1lMSwgJnAyLT5uYW1lMSkKKwkJJiYgdG9tb3lvX3NhbWVfbmFtZV91bmlvbigmcDEtPm5hbWUyLCAmcDItPm5hbWUyKTsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX21lcmdlX3BhdGgyX2FjbChzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICphLAorCQkJCSAgIHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmIsCisJCQkJICAgY29uc3QgYm9vbCBpc19kZWxldGUpCit7CisJdTggKiBjb25zdCBhX3Blcm0gPSAmY29udGFpbmVyX29mKGEsIHN0cnVjdCB0b21veW9fcGF0aDJfYWNsLCBoZWFkKQorCQktPnBlcm07CisJdTggcGVybSA9ICphX3Blcm07CisJY29uc3QgdTggYl9wZXJtID0gY29udGFpbmVyX29mKGIsIHN0cnVjdCB0b21veW9fcGF0aDJfYWNsLCBoZWFkKS0+cGVybTsKKwlpZiAoaXNfZGVsZXRlKQorCQlwZXJtICY9IH5iX3Blcm07CisJZWxzZQorCQlwZXJtIHw9IGJfcGVybTsKKwkqYV9wZXJtID0gcGVybTsKKwlyZXR1cm4gIXBlcm07Cit9CisKIC8qKgogICogdG9tb3lvX3VwZGF0ZV9wYXRoMl9hY2wgLSBVcGRhdGUgInN0cnVjdCB0b21veW9fcGF0aDJfYWNsIiBsaXN0LgogICoKQEAgLTkwNSw0NiArNzM5LDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgdG9tb3lvX3VwZGF0ZV9wYXRoMl9hY2woY29uc3QgdTggdHlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUxLAogCQkJCSAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lMiwKLQkJCQkgICBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpjb25zdCBkb21haW4sCisJCQkJICAgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqIGNvbnN0IGRvbWFpbiwKIAkJCQkgICBjb25zdCBib29sIGlzX2RlbGV0ZSkKIHsKLQljb25zdCB1OCBwZXJtID0gMSA8PCB0eXBlOwogCXN0cnVjdCB0b21veW9fcGF0aDJfYWNsIGUgPSB7CiAJCS5oZWFkLnR5cGUgPSBUT01PWU9fVFlQRV9QQVRIMl9BQ0wsCi0JCS5wZXJtID0gcGVybQorCQkucGVybSA9IDEgPDwgdHlwZQogCX07Ci0Jc3RydWN0IHRvbW95b19hY2xfaW5mbyAqcHRyOwogCWludCBlcnJvciA9IGlzX2RlbGV0ZSA/IC1FTk9FTlQgOiAtRU5PTUVNOwotCi0JaWYgKCFkb21haW4pCi0JCXJldHVybiAtRUlOVkFMOwogCWlmICghdG9tb3lvX3BhcnNlX25hbWVfdW5pb24oZmlsZW5hbWUxLCAmZS5uYW1lMSkgfHwKIAkgICAgIXRvbW95b19wYXJzZV9uYW1lX3VuaW9uKGZpbGVuYW1lMiwgJmUubmFtZTIpKQogCQlnb3RvIG91dDsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b21veW9fcG9saWN5X2xvY2spKQotCQlnb3RvIG91dDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZkb21haW4tPmFjbF9pbmZvX2xpc3QsIGxpc3QpIHsKLQkJc3RydWN0IHRvbW95b19wYXRoMl9hY2wgKmFjbCA9Ci0JCQljb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCwgaGVhZCk7Ci0JCWlmICghdG9tb3lvX2lzX3NhbWVfcGF0aDJfYWNsKGFjbCwgJmUpKQotCQkJY29udGludWU7Ci0JCWlmIChpc19kZWxldGUpCi0JCQlhY2wtPnBlcm0gJj0gfnBlcm07Ci0JCWVsc2UKLQkJCWFjbC0+cGVybSB8PSBwZXJtOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIWlzX2RlbGV0ZSAmJiBlcnJvcikgewotCQlzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCAqZW50cnkgPQotCQkJdG9tb3lvX2NvbW1pdF9vaygmZSwgc2l6ZW9mKGUpKTsKLQkJaWYgKGVudHJ5KSB7Ci0JCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmhlYWQubGlzdCwKLQkJCQkJICAmZG9tYWluLT5hY2xfaW5mb19saXN0KTsKLQkJCWVycm9yID0gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRvbW95b19wb2xpY3lfbG9jayk7CisJZXJyb3IgPSB0b21veW9fdXBkYXRlX2RvbWFpbigmZS5oZWFkLCBzaXplb2YoZSksIGlzX2RlbGV0ZSwgZG9tYWluLAorCQkJCSAgICAgdG9tb3lvX3NhbWVfcGF0aDJfYWNsLAorCQkJCSAgICAgdG9tb3lvX21lcmdlX3BhdGgyX2FjbCk7CiAgb3V0OgogCXRvbW95b19wdXRfbmFtZV91bmlvbigmZS5uYW1lMSk7CiAJdG9tb3lvX3B1dF9uYW1lX3VuaW9uKCZlLm5hbWUyKTsKQEAgLTk1MiwxMzQgKzc2MCwxNTggQEAKIH0KIAogLyoqCi0gKiB0b21veW9fcGF0aF9hY2wgLSBDaGVjayBwZXJtaXNzaW9uIGZvciBzaW5nbGUgcGF0aCBvcGVyYXRpb24uCisgKiB0b21veW9fcGF0aF9wZXJtaXNzaW9uIC0gQ2hlY2sgcGVybWlzc2lvbiBmb3Igc2luZ2xlIHBhdGggb3BlcmF0aW9uLgogICoKLSAqIEBkb21haW46ICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIuCi0gKiBAdHlwZTogICAgIFR5cGUgb2Ygb3BlcmF0aW9uLgotICogQGZpbGVuYW1lOiBGaWxlbmFtZSB0byBjaGVjay4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3BhdGhfYWNsKHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwgY29uc3QgdTggdHlwZSwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSkKLXsKLQlpZiAoIXRvbW95b19jaGVja19mbGFncyhkb21haW4sIFRPTU9ZT19NQUNfRk9SX0ZJTEUpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdG9tb3lvX3BhdGhfYWNsMihkb21haW4sIGZpbGVuYW1lLCAxIDw8IHR5cGUsIDEpOwotfQotCi0vKioKLSAqIHRvbW95b19wYXRoMl9hY2wgLSBDaGVjayBwZXJtaXNzaW9uIGZvciBkb3VibGUgcGF0aCBvcGVyYXRpb24uCi0gKgotICogQGRvbWFpbjogICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIuCi0gKiBAdHlwZTogICAgICBUeXBlIG9mIG9wZXJhdGlvbi4KLSAqIEBmaWxlbmFtZTE6IEZpcnN0IGZpbGVuYW1lIHRvIGNoZWNrLgotICogQGZpbGVuYW1lMjogU2Vjb25kIGZpbGVuYW1lIHRvIGNoZWNrLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRVBFUk0gb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3BhdGgyX2FjbChjb25zdCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCi0JCQkgICAgY29uc3QgdTggdHlwZSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWUxLAotCQkJICAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZTIpCi17Ci0Jc3RydWN0IHRvbW95b19hY2xfaW5mbyAqcHRyOwotCWNvbnN0IHU4IHBlcm0gPSAxIDw8IHR5cGU7Ci0JaW50IGVycm9yID0gLUVQRVJNOwotCi0JaWYgKCF0b21veW9fY2hlY2tfZmxhZ3MoZG9tYWluLCBUT01PWU9fTUFDX0ZPUl9GSUxFKSkKLQkJcmV0dXJuIDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmZG9tYWluLT5hY2xfaW5mb19saXN0LCBsaXN0KSB7Ci0JCXN0cnVjdCB0b21veW9fcGF0aDJfYWNsICphY2w7Ci0JCWlmIChwdHItPnR5cGUgIT0gVE9NT1lPX1RZUEVfUEFUSDJfQUNMKQotCQkJY29udGludWU7Ci0JCWFjbCA9IGNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCB0b21veW9fcGF0aDJfYWNsLCBoZWFkKTsKLQkJaWYgKCEoYWNsLT5wZXJtICYgcGVybSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCF0b21veW9fY29tcGFyZV9uYW1lX3VuaW9uKGZpbGVuYW1lMSwgJmFjbC0+bmFtZTEpKQotCQkJY29udGludWU7Ci0JCWlmICghdG9tb3lvX2NvbXBhcmVfbmFtZV91bmlvbihmaWxlbmFtZTIsICZhY2wtPm5hbWUyKSkKLQkJCWNvbnRpbnVlOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogdG9tb3lvX3BhdGhfcGVybWlzc2lvbjIgLSBDaGVjayBwZXJtaXNzaW9uIGZvciBzaW5nbGUgcGF0aCBvcGVyYXRpb24uCi0gKgotICogQGRvbWFpbjogICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIuCisgKiBAcjogICAgICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIuCiAgKiBAb3BlcmF0aW9uOiBUeXBlIG9mIG9wZXJhdGlvbi4KICAqIEBmaWxlbmFtZTogIEZpbGVuYW1lIHRvIGNoZWNrLgotICogQG1vZGU6ICAgICAgQWNjZXNzIGNvbnRyb2wgbW9kZS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgogICoKICAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX3BhdGhfcGVybWlzc2lvbjIoc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqY29uc3QgZG9tYWluLAotCQkJCSAgIHU4IG9wZXJhdGlvbiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWUsCi0JCQkJICAgY29uc3QgdTggbW9kZSkKK2ludCB0b21veW9fcGF0aF9wZXJtaXNzaW9uKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyLCB1OCBvcGVyYXRpb24sCisJCQkgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWUpCiB7Ci0JY29uc3QgY2hhciAqbXNnOwogCWludCBlcnJvcjsKLQljb25zdCBib29sIGlzX2VuZm9yY2UgPSAobW9kZSA9PSAzKTsKIAotCWlmICghbW9kZSkKLQkJcmV0dXJuIDA7CiAgbmV4dDoKLQllcnJvciA9IHRvbW95b19wYXRoX2FjbChkb21haW4sIG9wZXJhdGlvbiwgZmlsZW5hbWUpOwotCW1zZyA9IHRvbW95b19wYXRoMmtleXdvcmQob3BlcmF0aW9uKTsKLQlpZiAoIWVycm9yKQotCQlnb3RvIG9rOwotCWlmICh0b21veW9fdmVyYm9zZV9tb2RlKGRvbWFpbikpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRPTU9ZTy0lczogQWNjZXNzICclcyAlcycgZGVuaWVkIGZvciAlc1xuIiwKLQkJICAgICAgIHRvbW95b19nZXRfbXNnKGlzX2VuZm9yY2UpLCBtc2csIGZpbGVuYW1lLT5uYW1lLAotCQkgICAgICAgdG9tb3lvX2dldF9sYXN0X25hbWUoZG9tYWluKSk7Ci0JaWYgKG1vZGUgPT0gMSAmJiB0b21veW9fZG9tYWluX3F1b3RhX2lzX29rKGRvbWFpbikpIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IHRvbW95b19nZXRfZmlsZV9wYXR0ZXJuKGZpbGVuYW1lKS0+bmFtZTsKLQkJdG9tb3lvX3VwZGF0ZV9wYXRoX2FjbChvcGVyYXRpb24sIG5hbWUsIGRvbWFpbiwgZmFsc2UpOwotCX0KLQlpZiAoIWlzX2VuZm9yY2UpCi0JCWVycm9yID0gMDsKLSBvazoKKwlyLT50eXBlID0gdG9tb3lvX3AybWFjW29wZXJhdGlvbl07CisJci0+bW9kZSA9IHRvbW95b19nZXRfbW9kZShyLT5wcm9maWxlLCByLT50eXBlKTsKKwlpZiAoci0+bW9kZSA9PSBUT01PWU9fQ09ORklHX0RJU0FCTEVEKQorCQlyZXR1cm4gMDsKKwlyLT5wYXJhbV90eXBlID0gVE9NT1lPX1RZUEVfUEFUSF9BQ0w7CisJci0+cGFyYW0ucGF0aC5maWxlbmFtZSA9IGZpbGVuYW1lOworCXItPnBhcmFtLnBhdGgub3BlcmF0aW9uID0gb3BlcmF0aW9uOworCWRvIHsKKwkJdG9tb3lvX2NoZWNrX2FjbChyLCB0b21veW9fY2hlY2tfcGF0aF9hY2wpOworCQlpZiAoIXItPmdyYW50ZWQgJiYgb3BlcmF0aW9uID09IFRPTU9ZT19UWVBFX1JFQUQgJiYKKwkJICAgICFyLT5kb21haW4tPmlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZCAmJgorCQkgICAgdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGUoZmlsZW5hbWUpKQorCQkJci0+Z3JhbnRlZCA9IHRydWU7CisJCWVycm9yID0gdG9tb3lvX2F1ZGl0X3BhdGhfbG9nKHIpOworCQkvKgorCQkgKiBEbyBub3QgcmV0cnkgZm9yIGV4ZWN1dGUgcmVxdWVzdCwgZm9yIGFsaWFzIG1heSBoYXZlCisJCSAqIGNoYW5nZWQuCisJCSAqLworCX0gd2hpbGUgKGVycm9yID09IFRPTU9ZT19SRVRSWV9SRVFVRVNUICYmCisJCSBvcGVyYXRpb24gIT0gVE9NT1lPX1RZUEVfRVhFQ1VURSk7CiAJLyoKIAkgKiBTaW5jZSAiYWxsb3dfdHJ1bmNhdGUiIGRvZXNuJ3QgaW1wbHkgImFsbG93X3Jld3JpdGUiIHBlcm1pc3Npb24sCiAJICogd2UgbmVlZCB0byBjaGVjayAiYWxsb3dfcmV3cml0ZSIgcGVybWlzc2lvbiBpZiB0aGUgZmlsZW5hbWUgaXMKIAkgKiBzcGVjaWZpZWQgYnkgImRlbnlfcmV3cml0ZSIga2V5d29yZC4KIAkgKi8KIAlpZiAoIWVycm9yICYmIG9wZXJhdGlvbiA9PSBUT01PWU9fVFlQRV9UUlVOQ0FURSAmJgotCSAgICB0b21veW9faXNfbm9fcmV3cml0ZV9maWxlKGZpbGVuYW1lKSkgeworCSAgICB0b21veW9fbm9fcmV3cml0ZV9maWxlKGZpbGVuYW1lKSkgewogCQlvcGVyYXRpb24gPSBUT01PWU9fVFlQRV9SRVdSSVRFOwogCQlnb3RvIG5leHQ7CiAJfQogCXJldHVybiBlcnJvcjsKIH0KIAotLyoqCi0gKiB0b21veW9fY2hlY2tfZXhlY19wZXJtIC0gQ2hlY2sgcGVybWlzc2lvbiBmb3IgImV4ZWN1dGUiLgotICoKLSAqIEBkb21haW46ICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIuCi0gKiBAZmlsZW5hbWU6IENoZWNrIHBlcm1pc3Npb24gZm9yICJleGVjdXRlIi4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmV2YWx1ZSBvdGhlcndpc2UuCi0gKgotICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KLSAqLwotaW50IHRvbW95b19jaGVja19leGVjX3Blcm0oc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAotCQkJICAgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lKQorc3RhdGljIGJvb2wgdG9tb3lvX3NhbWVfcGF0aF9udW1iZXJfYWNsKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmEsCisJCQkJCWNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmIpCiB7Ci0JY29uc3QgdTggbW9kZSA9IHRvbW95b19jaGVja19mbGFncyhkb21haW4sIFRPTU9ZT19NQUNfRk9SX0ZJTEUpOworCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9udW1iZXJfYWNsICpwMSA9IGNvbnRhaW5lcl9vZihhLCB0eXBlb2YoKnAxKSwKKwkJCQkJCQkgICAgICAgaGVhZCk7CisJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX251bWJlcl9hY2wgKnAyID0gY29udGFpbmVyX29mKGIsIHR5cGVvZigqcDIpLAorCQkJCQkJCSAgICAgICBoZWFkKTsKKwlyZXR1cm4gdG9tb3lvX3NhbWVfYWNsX2hlYWQoJnAxLT5oZWFkLCAmcDItPmhlYWQpCisJCSYmIHRvbW95b19zYW1lX25hbWVfdW5pb24oJnAxLT5uYW1lLCAmcDItPm5hbWUpCisJCSYmIHRvbW95b19zYW1lX251bWJlcl91bmlvbigmcDEtPm51bWJlciwgJnAyLT5udW1iZXIpOworfQogCi0JaWYgKCFtb2RlKQorc3RhdGljIGJvb2wgdG9tb3lvX21lcmdlX3BhdGhfbnVtYmVyX2FjbChzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICphLAorCQkJCQkgc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYiwKKwkJCQkJIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQoreworCXU4ICogY29uc3QgYV9wZXJtID0gJmNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgdG9tb3lvX3BhdGhfbnVtYmVyX2FjbCwKKwkJCQkJICBoZWFkKS0+cGVybTsKKwl1OCBwZXJtID0gKmFfcGVybTsKKwljb25zdCB1OCBiX3Blcm0gPSBjb250YWluZXJfb2YoYiwgc3RydWN0IHRvbW95b19wYXRoX251bWJlcl9hY2wsIGhlYWQpCisJCS0+cGVybTsKKwlpZiAoaXNfZGVsZXRlKQorCQlwZXJtICY9IH5iX3Blcm07CisJZWxzZQorCQlwZXJtIHw9IGJfcGVybTsKKwkqYV9wZXJtID0gcGVybTsKKwlyZXR1cm4gIXBlcm07Cit9CisKKy8qKgorICogdG9tb3lvX3VwZGF0ZV9wYXRoX251bWJlcl9hY2wgLSBVcGRhdGUgaW9jdGwvY2htb2QvY2hvd24vY2hncnAgQUNMLgorICoKKyAqIEB0eXBlOiAgICAgIFR5cGUgb2Ygb3BlcmF0aW9uLgorICogQGZpbGVuYW1lOiAgRmlsZW5hbWUuCisgKiBAbnVtYmVyOiAgICBOdW1iZXIuCisgKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KKyAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHRvbW95b191cGRhdGVfcGF0aF9udW1iZXJfYWNsKGNvbnN0IHU4IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJCQkgY2hhciAqbnVtYmVyLAorCQkJCQkgc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqIGNvbnN0CisJCQkJCSBkb21haW4sCisJCQkJCSBjb25zdCBib29sIGlzX2RlbGV0ZSkKK3sKKwlzdHJ1Y3QgdG9tb3lvX3BhdGhfbnVtYmVyX2FjbCBlID0geworCQkuaGVhZC50eXBlID0gVE9NT1lPX1RZUEVfUEFUSF9OVU1CRVJfQUNMLAorCQkucGVybSA9IDEgPDwgdHlwZQorCX07CisJaW50IGVycm9yID0gaXNfZGVsZXRlID8gLUVOT0VOVCA6IC1FTk9NRU07CisJaWYgKCF0b21veW9fcGFyc2VfbmFtZV91bmlvbihmaWxlbmFtZSwgJmUubmFtZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdG9tb3lvX3BhcnNlX251bWJlcl91bmlvbihudW1iZXIsICZlLm51bWJlcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gdG9tb3lvX3VwZGF0ZV9kb21haW4oJmUuaGVhZCwgc2l6ZW9mKGUpLCBpc19kZWxldGUsIGRvbWFpbiwKKwkJCQkgICAgIHRvbW95b19zYW1lX3BhdGhfbnVtYmVyX2FjbCwKKwkJCQkgICAgIHRvbW95b19tZXJnZV9wYXRoX251bWJlcl9hY2wpOworIG91dDoKKwl0b21veW9fcHV0X25hbWVfdW5pb24oJmUubmFtZSk7CisJdG9tb3lvX3B1dF9udW1iZXJfdW5pb24oJmUubnVtYmVyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogdG9tb3lvX3BhdGhfbnVtYmVyX3Blcm0gLSBDaGVjayBwZXJtaXNzaW9uIGZvciAiY3JlYXRlIiwgIm1rZGlyIiwgIm1rZmlmbyIsICJta3NvY2siLCAiaW9jdGwiLCAiY2htb2QiLCAiY2hvd24iLCAiY2hncnAiLgorICoKKyAqIEB0eXBlOiAgIFR5cGUgb2Ygb3BlcmF0aW9uLgorICogQHBhdGg6ICAgUG9pbnRlciB0byAic3RydWN0IHBhdGgiLgorICogQG51bWJlcjogTnVtYmVyLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCB0b21veW9fcGF0aF9udW1iZXJfcGVybShjb25zdCB1OCB0eXBlLCBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG51bWJlcikKK3sKKwlzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyByOworCWludCBlcnJvciA9IC1FTk9NRU07CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gYnVmOworCWludCBpZHg7CisKKwlpZiAodG9tb3lvX2luaXRfcmVxdWVzdF9pbmZvKCZyLCBOVUxMLCB0b21veW9fcG4ybWFjW3R5cGVdKQorCSAgICA9PSBUT01PWU9fQ09ORklHX0RJU0FCTEVEIHx8ICFwYXRoLT5tbnQgfHwgIXBhdGgtPmRlbnRyeSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRvbW95b19jaGVja19maWxlX3Blcm0yKGRvbWFpbiwgZmlsZW5hbWUsIDEsICJkb19leGVjdmUiLCBtb2RlKTsKKwlpZHggPSB0b21veW9fcmVhZF9sb2NrKCk7CisJaWYgKCF0b21veW9fZ2V0X3JlYWxwYXRoKCZidWYsIHBhdGgpKQorCQlnb3RvIG91dDsKKwlpZiAodHlwZSA9PSBUT01PWU9fVFlQRV9NS0RJUikKKwkJdG9tb3lvX2FkZF9zbGFzaCgmYnVmKTsKKwlyLnBhcmFtX3R5cGUgPSBUT01PWU9fVFlQRV9QQVRIX05VTUJFUl9BQ0w7CisJci5wYXJhbS5wYXRoX251bWJlci5vcGVyYXRpb24gPSB0eXBlOworCXIucGFyYW0ucGF0aF9udW1iZXIuZmlsZW5hbWUgPSAmYnVmOworCXIucGFyYW0ucGF0aF9udW1iZXIubnVtYmVyID0gbnVtYmVyOworCWRvIHsKKwkJdG9tb3lvX2NoZWNrX2FjbCgmciwgdG9tb3lvX2NoZWNrX3BhdGhfbnVtYmVyX2FjbCk7CisJCWVycm9yID0gdG9tb3lvX2F1ZGl0X3BhdGhfbnVtYmVyX2xvZygmcik7CisJfSB3aGlsZSAoZXJyb3IgPT0gVE9NT1lPX1JFVFJZX1JFUVVFU1QpOworCWtmcmVlKGJ1Zi5uYW1lKTsKKyBvdXQ6CisJdG9tb3lvX3JlYWRfdW5sb2NrKGlkeCk7CisJaWYgKHIubW9kZSAhPSBUT01PWU9fQ09ORklHX0VORk9SQ0lORykKKwkJZXJyb3IgPSAwOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoqCkBAIC0xMDk2LDI0ICs5MjgsMTcgQEAKIHsKIAljb25zdCB1OCBhY2NfbW9kZSA9IEFDQ19NT0RFKGZsYWcpOwogCWludCBlcnJvciA9IC1FTk9NRU07Ci0Jc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmJ1ZjsKLQljb25zdCB1OCBtb2RlID0gdG9tb3lvX2NoZWNrX2ZsYWdzKGRvbWFpbiwgVE9NT1lPX01BQ19GT1JfRklMRSk7Ci0JY29uc3QgYm9vbCBpc19lbmZvcmNlID0gKG1vZGUgPT0gMyk7CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gYnVmOworCXN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIHI7CiAJaW50IGlkeDsKIAotCWlmICghbW9kZSB8fCAhcGF0aC0+bW50KQorCWlmICghcGF0aC0+bW50IHx8CisJICAgIChwYXRoLT5kZW50cnktPmRfaW5vZGUgJiYgU19JU0RJUihwYXRoLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpKQogCQlyZXR1cm4gMDsKLQlpZiAoYWNjX21vZGUgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHBhdGgtPmRlbnRyeS0+ZF9pbm9kZSAmJiBTX0lTRElSKHBhdGgtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKLQkJLyoKLQkJICogSSBkb24ndCBjaGVjayBkaXJlY3RvcmllcyBoZXJlIGJlY2F1c2UgbWtkaXIoKSBhbmQgcm1kaXIoKQotCQkgKiBkb24ndCBjYWxsIG1lLgotCQkgKi8KLQkJcmV0dXJuIDA7CisJYnVmLm5hbWUgPSBOVUxMOworCXIubW9kZSA9IFRPTU9ZT19DT05GSUdfRElTQUJMRUQ7CiAJaWR4ID0gdG9tb3lvX3JlYWRfbG9jaygpOwotCWJ1ZiA9IHRvbW95b19nZXRfcGF0aChwYXRoKTsKLQlpZiAoIWJ1ZikKKwlpZiAoIXRvbW95b19nZXRfcmVhbHBhdGgoJmJ1ZiwgcGF0aCkpCiAJCWdvdG8gb3V0OwogCWVycm9yID0gMDsKIAkvKgpAQCAtMTEyMSwyOCArOTQ2LDQzIEBACiAJICogd2UgbmVlZCB0byBjaGVjayAiYWxsb3dfcmV3cml0ZSIgcGVybWlzc2lvbiB3aGVuIHRoZSBmaWxlbmFtZSBpcyBub3QKIAkgKiBvcGVuZWQgZm9yIGFwcGVuZCBtb2RlIG9yIHRoZSBmaWxlbmFtZSBpcyB0cnVuY2F0ZWQgYXQgb3BlbiB0aW1lLgogCSAqLwotCWlmICgoYWNjX21vZGUgJiBNQVlfV1JJVEUpICYmCi0JICAgICgoZmxhZyAmIE9fVFJVTkMpIHx8ICEoZmxhZyAmIE9fQVBQRU5EKSkgJiYKLQkgICAgKHRvbW95b19pc19ub19yZXdyaXRlX2ZpbGUoYnVmKSkpIHsKLQkJZXJyb3IgPSB0b21veW9fcGF0aF9wZXJtaXNzaW9uMihkb21haW4sIFRPTU9ZT19UWVBFX1JFV1JJVEUsCi0JCQkJCQlidWYsIG1vZGUpOworCWlmICgoYWNjX21vZGUgJiBNQVlfV1JJVEUpICYmICEoZmxhZyAmIE9fQVBQRU5EKQorCSAgICAmJiB0b21veW9faW5pdF9yZXF1ZXN0X2luZm8oJnIsIGRvbWFpbiwgVE9NT1lPX01BQ19GSUxFX1JFV1JJVEUpCisJICAgICE9IFRPTU9ZT19DT05GSUdfRElTQUJMRUQpIHsKKwkJaWYgKCF0b21veW9fZ2V0X3JlYWxwYXRoKCZidWYsIHBhdGgpKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAodG9tb3lvX25vX3Jld3JpdGVfZmlsZSgmYnVmKSkKKwkJCWVycm9yID0gdG9tb3lvX3BhdGhfcGVybWlzc2lvbigmciwgVE9NT1lPX1RZUEVfUkVXUklURSwKKwkJCQkJCSAgICAgICAmYnVmKTsKIAl9Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSB0b21veW9fY2hlY2tfZmlsZV9wZXJtMihkb21haW4sIGJ1ZiwgYWNjX21vZGUsICJvcGVuIiwKLQkJCQkJCW1vZGUpOwotCWlmICghZXJyb3IgJiYgKGZsYWcgJiBPX1RSVU5DKSkKLQkJZXJyb3IgPSB0b21veW9fcGF0aF9wZXJtaXNzaW9uMihkb21haW4sIFRPTU9ZT19UWVBFX1RSVU5DQVRFLAotCQkJCQkJYnVmLCBtb2RlKTsKKwlpZiAoIWVycm9yICYmIGFjY19tb2RlICYmCisJICAgIHRvbW95b19pbml0X3JlcXVlc3RfaW5mbygmciwgZG9tYWluLCBUT01PWU9fTUFDX0ZJTEVfT1BFTikKKwkgICAgIT0gVE9NT1lPX0NPTkZJR19ESVNBQkxFRCkgeworCQl1OCBvcGVyYXRpb247CisJCWlmICghYnVmLm5hbWUgJiYgIXRvbW95b19nZXRfcmVhbHBhdGgoJmJ1ZiwgcGF0aCkpIHsKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChhY2NfbW9kZSA9PSAoTUFZX1JFQUQgfCBNQVlfV1JJVEUpKQorCQkJb3BlcmF0aW9uID0gVE9NT1lPX1RZUEVfUkVBRF9XUklURTsKKwkJZWxzZSBpZiAoYWNjX21vZGUgPT0gTUFZX1JFQUQpCisJCQlvcGVyYXRpb24gPSBUT01PWU9fVFlQRV9SRUFEOworCQllbHNlCisJCQlvcGVyYXRpb24gPSBUT01PWU9fVFlQRV9XUklURTsKKwkJZXJyb3IgPSB0b21veW9fcGF0aF9wZXJtaXNzaW9uKCZyLCBvcGVyYXRpb24sICZidWYpOworCX0KICBvdXQ6Ci0Ja2ZyZWUoYnVmKTsKKwlrZnJlZShidWYubmFtZSk7CiAJdG9tb3lvX3JlYWRfdW5sb2NrKGlkeCk7Ci0JaWYgKCFpc19lbmZvcmNlKQorCWlmIChyLm1vZGUgIT0gVE9NT1lPX0NPTkZJR19FTkZPUkNJTkcpCiAJCWVycm9yID0gMDsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgotICogdG9tb3lvX3BhdGhfcGVybSAtIENoZWNrIHBlcm1pc3Npb24gZm9yICJjcmVhdGUiLCAidW5saW5rIiwgIm1rZGlyIiwgInJtZGlyIiwgIm1rZmlmbyIsICJta3NvY2siLCAibWtibG9jayIsICJta2NoYXIiLCAidHJ1bmNhdGUiLCAic3ltbGluayIsICJpb2N0bCIsICJjaG1vZCIsICJjaG93biIsICJjaGdycCIsICJjaHJvb3QiLCAibW91bnQiIGFuZCAidW5tb3VudCIuCisgKiB0b21veW9fcGF0aF9wZXJtIC0gQ2hlY2sgcGVybWlzc2lvbiBmb3IgInVubGluayIsICJybWRpciIsICJ0cnVuY2F0ZSIsICJzeW1saW5rIiwgInJld3JpdGUiLCAiY2hyb290IiBhbmQgInVubW91bnQiLgogICoKICAqIEBvcGVyYXRpb246IFR5cGUgb2Ygb3BlcmF0aW9uLgogICogQHBhdGg6ICAgICAgUG9pbnRlciB0byAic3RydWN0IHBhdGgiLgpAQCAtMTE1Miw3MSArOTkyLDc5IEBACiBpbnQgdG9tb3lvX3BhdGhfcGVybShjb25zdCB1OCBvcGVyYXRpb24sIHN0cnVjdCBwYXRoICpwYXRoKQogewogCWludCBlcnJvciA9IC1FTk9NRU07Ci0Jc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmJ1ZjsKLQlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPSB0b21veW9fZG9tYWluKCk7Ci0JY29uc3QgdTggbW9kZSA9IHRvbW95b19jaGVja19mbGFncyhkb21haW4sIFRPTU9ZT19NQUNfRk9SX0ZJTEUpOwotCWNvbnN0IGJvb2wgaXNfZW5mb3JjZSA9IChtb2RlID09IDMpOworCXN0cnVjdCB0b21veW9fcGF0aF9pbmZvIGJ1ZjsKKwlzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyByOwogCWludCBpZHg7CiAKLQlpZiAoIW1vZGUgfHwgIXBhdGgtPm1udCkKKwlpZiAoIXBhdGgtPm1udCkKIAkJcmV0dXJuIDA7CisJaWYgKHRvbW95b19pbml0X3JlcXVlc3RfaW5mbygmciwgTlVMTCwgdG9tb3lvX3AybWFjW29wZXJhdGlvbl0pCisJICAgID09IFRPTU9ZT19DT05GSUdfRElTQUJMRUQpCisJCXJldHVybiAwOworCWJ1Zi5uYW1lID0gTlVMTDsKIAlpZHggPSB0b21veW9fcmVhZF9sb2NrKCk7Ci0JYnVmID0gdG9tb3lvX2dldF9wYXRoKHBhdGgpOwotCWlmICghYnVmKQorCWlmICghdG9tb3lvX2dldF9yZWFscGF0aCgmYnVmLCBwYXRoKSkKIAkJZ290byBvdXQ7CiAJc3dpdGNoIChvcGVyYXRpb24pIHsKLQljYXNlIFRPTU9ZT19UWVBFX01LRElSOgorCWNhc2UgVE9NT1lPX1RZUEVfUkVXUklURToKKwkJaWYgKCF0b21veW9fbm9fcmV3cml0ZV9maWxlKCZidWYpKSB7CisJCQllcnJvciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKIAljYXNlIFRPTU9ZT19UWVBFX1JNRElSOgogCWNhc2UgVE9NT1lPX1RZUEVfQ0hST09UOgotCQlpZiAoIWJ1Zi0+aXNfZGlyKSB7Ci0JCQkvKgotCQkJICogdG9tb3lvX2dldF9wYXRoKCkgcmVzZXJ2ZXMgc3BhY2UgZm9yIGFwcGVuZGluZyAiLy4iCi0JCQkgKi8KLQkJCXN0cmNhdCgoY2hhciAqKSBidWYtPm5hbWUsICIvIik7Ci0JCQl0b21veW9fZmlsbF9wYXRoX2luZm8oYnVmKTsKLQkJfQorCWNhc2UgVE9NT1lPX1RZUEVfVU1PVU5UOgorCQl0b21veW9fYWRkX3NsYXNoKCZidWYpOworCQlicmVhazsKIAl9Ci0JZXJyb3IgPSB0b21veW9fcGF0aF9wZXJtaXNzaW9uMihkb21haW4sIG9wZXJhdGlvbiwgYnVmLCBtb2RlKTsKKwllcnJvciA9IHRvbW95b19wYXRoX3Blcm1pc3Npb24oJnIsIG9wZXJhdGlvbiwgJmJ1Zik7CiAgb3V0OgotCWtmcmVlKGJ1Zik7CisJa2ZyZWUoYnVmLm5hbWUpOwogCXRvbW95b19yZWFkX3VubG9jayhpZHgpOwotCWlmICghaXNfZW5mb3JjZSkKKwlpZiAoci5tb2RlICE9IFRPTU9ZT19DT05GSUdfRU5GT1JDSU5HKQogCQllcnJvciA9IDA7CiAJcmV0dXJuIGVycm9yOwogfQogCiAvKioKLSAqIHRvbW95b19jaGVja19yZXdyaXRlX3Blcm1pc3Npb24gLSBDaGVjayBwZXJtaXNzaW9uIGZvciAicmV3cml0ZSIuCisgKiB0b21veW9fbWtkZXZfcGVybSAtIENoZWNrIHBlcm1pc3Npb24gZm9yICJta2Jsb2NrIiBhbmQgIm1rY2hhciIuCiAgKgotICogQGZpbHA6IFBvaW50ZXIgdG8gInN0cnVjdCBmaWxlIi4KKyAqIEBvcGVyYXRpb246IFR5cGUgb2Ygb3BlcmF0aW9uLiAoVE9NT1lPX1RZUEVfTUtDSEFSIG9yIFRPTU9ZT19UWVBFX01LQkxPQ0spCisgKiBAcGF0aDogICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgcGF0aCIuCisgKiBAbW9kZTogICAgICBDcmVhdGUgbW9kZS4KKyAqIEBkZXY6ICAgICAgIERldmljZSBudW1iZXIuCiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KICAqLwotaW50IHRvbW95b19jaGVja19yZXdyaXRlX3Blcm1pc3Npb24oc3RydWN0IGZpbGUgKmZpbHApCitpbnQgdG9tb3lvX21rZGV2X3Blcm0oY29uc3QgdTggb3BlcmF0aW9uLCBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSAgICAgY29uc3QgdW5zaWduZWQgaW50IG1vZGUsIHVuc2lnbmVkIGludCBkZXYpCiB7CisJc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gcjsKIAlpbnQgZXJyb3IgPSAtRU5PTUVNOwotCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiA9IHRvbW95b19kb21haW4oKTsKLQljb25zdCB1OCBtb2RlID0gdG9tb3lvX2NoZWNrX2ZsYWdzKGRvbWFpbiwgVE9NT1lPX01BQ19GT1JfRklMRSk7Ci0JY29uc3QgYm9vbCBpc19lbmZvcmNlID0gKG1vZGUgPT0gMyk7Ci0Jc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmJ1ZjsKKwlzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyBidWY7CiAJaW50IGlkeDsKIAotCWlmICghbW9kZSB8fCAhZmlscC0+Zl9wYXRoLm1udCkKKwlpZiAoIXBhdGgtPm1udCB8fAorCSAgICB0b21veW9faW5pdF9yZXF1ZXN0X2luZm8oJnIsIE5VTEwsIHRvbW95b19wbm5uMm1hY1tvcGVyYXRpb25dKQorCSAgICA9PSBUT01PWU9fQ09ORklHX0RJU0FCTEVEKQogCQlyZXR1cm4gMDsKLQogCWlkeCA9IHRvbW95b19yZWFkX2xvY2soKTsKLQlidWYgPSB0b21veW9fZ2V0X3BhdGgoJmZpbHAtPmZfcGF0aCk7Ci0JaWYgKCFidWYpCi0JCWdvdG8gb3V0OwotCWlmICghdG9tb3lvX2lzX25vX3Jld3JpdGVfZmlsZShidWYpKSB7Ci0JCWVycm9yID0gMDsKLQkJZ290byBvdXQ7CisJZXJyb3IgPSAtRU5PTUVNOworCWlmICh0b21veW9fZ2V0X3JlYWxwYXRoKCZidWYsIHBhdGgpKSB7CisJCWRldiA9IG5ld19kZWNvZGVfZGV2KGRldik7CisJCXIucGFyYW1fdHlwZSA9IFRPTU9ZT19UWVBFX01LREVWX0FDTDsKKwkJci5wYXJhbS5ta2Rldi5maWxlbmFtZSA9ICZidWY7CisJCXIucGFyYW0ubWtkZXYub3BlcmF0aW9uID0gb3BlcmF0aW9uOworCQlyLnBhcmFtLm1rZGV2Lm1vZGUgPSBtb2RlOworCQlyLnBhcmFtLm1rZGV2Lm1ham9yID0gTUFKT1IoZGV2KTsKKwkJci5wYXJhbS5ta2Rldi5taW5vciA9IE1JTk9SKGRldik7CisJCXRvbW95b19jaGVja19hY2woJnIsIHRvbW95b19jaGVja19ta2Rldl9hY2wpOworCQllcnJvciA9IHRvbW95b19hdWRpdF9ta2Rldl9sb2coJnIpOworCQlrZnJlZShidWYubmFtZSk7CiAJfQotCWVycm9yID0gdG9tb3lvX3BhdGhfcGVybWlzc2lvbjIoZG9tYWluLCBUT01PWU9fVFlQRV9SRVdSSVRFLCBidWYsIG1vZGUpOwotIG91dDoKLQlrZnJlZShidWYpOwogCXRvbW95b19yZWFkX3VubG9jayhpZHgpOwotCWlmICghaXNfZW5mb3JjZSkKKwlpZiAoci5tb2RlICE9IFRPTU9ZT19DT05GSUdfRU5GT1JDSU5HKQogCQllcnJvciA9IDA7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTIzNCw1NiArMTA4Miw5OSBAQAogCQkgICAgICBzdHJ1Y3QgcGF0aCAqcGF0aDIpCiB7CiAJaW50IGVycm9yID0gLUVOT01FTTsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqYnVmMSwgKmJ1ZjI7Ci0Jc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluID0gdG9tb3lvX2RvbWFpbigpOwotCWNvbnN0IHU4IG1vZGUgPSB0b21veW9fY2hlY2tfZmxhZ3MoZG9tYWluLCBUT01PWU9fTUFDX0ZPUl9GSUxFKTsKLQljb25zdCBib29sIGlzX2VuZm9yY2UgPSAobW9kZSA9PSAzKTsKLQljb25zdCBjaGFyICptc2c7CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gYnVmMTsKKwlzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyBidWYyOworCXN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIHI7CiAJaW50IGlkeDsKIAotCWlmICghbW9kZSB8fCAhcGF0aDEtPm1udCB8fCAhcGF0aDItPm1udCkKKwlpZiAoIXBhdGgxLT5tbnQgfHwgIXBhdGgyLT5tbnQgfHwKKwkgICAgdG9tb3lvX2luaXRfcmVxdWVzdF9pbmZvKCZyLCBOVUxMLCB0b21veW9fcHAybWFjW29wZXJhdGlvbl0pCisJICAgID09IFRPTU9ZT19DT05GSUdfRElTQUJMRUQpCiAJCXJldHVybiAwOworCWJ1ZjEubmFtZSA9IE5VTEw7CisJYnVmMi5uYW1lID0gTlVMTDsKIAlpZHggPSB0b21veW9fcmVhZF9sb2NrKCk7Ci0JYnVmMSA9IHRvbW95b19nZXRfcGF0aChwYXRoMSk7Ci0JYnVmMiA9IHRvbW95b19nZXRfcGF0aChwYXRoMik7Ci0JaWYgKCFidWYxIHx8ICFidWYyKQorCWlmICghdG9tb3lvX2dldF9yZWFscGF0aCgmYnVmMSwgcGF0aDEpIHx8CisJICAgICF0b21veW9fZ2V0X3JlYWxwYXRoKCZidWYyLCBwYXRoMikpCiAJCWdvdG8gb3V0OwotCXsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gcGF0aDEtPmRlbnRyeTsKLQkJaWYgKGRlbnRyeS0+ZF9pbm9kZSAmJiBTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgewotCQkJLyoKLQkJCSAqIHRvbW95b19nZXRfcGF0aCgpIHJlc2VydmVzIHNwYWNlIGZvciBhcHBlbmRpbmcgIi8uIgotCQkJICovCi0JCQlpZiAoIWJ1ZjEtPmlzX2RpcikgewotCQkJCXN0cmNhdCgoY2hhciAqKSBidWYxLT5uYW1lLCAiLyIpOwotCQkJCXRvbW95b19maWxsX3BhdGhfaW5mbyhidWYxKTsKLQkJCX0KLQkJCWlmICghYnVmMi0+aXNfZGlyKSB7Ci0JCQkJc3RyY2F0KChjaGFyICopIGJ1ZjItPm5hbWUsICIvIik7Ci0JCQkJdG9tb3lvX2ZpbGxfcGF0aF9pbmZvKGJ1ZjIpOwotCQkJfQotCQl9Ci0JfQotCWVycm9yID0gdG9tb3lvX3BhdGgyX2FjbChkb21haW4sIG9wZXJhdGlvbiwgYnVmMSwgYnVmMik7Ci0JbXNnID0gdG9tb3lvX3BhdGgyMmtleXdvcmQob3BlcmF0aW9uKTsKLQlpZiAoIWVycm9yKQotCQlnb3RvIG91dDsKLQlpZiAodG9tb3lvX3ZlcmJvc2VfbW9kZShkb21haW4pKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJUT01PWU8tJXM6IEFjY2VzcyAnJXMgJXMgJXMnICIKLQkJICAgICAgICJkZW5pZWQgZm9yICVzXG4iLCB0b21veW9fZ2V0X21zZyhpc19lbmZvcmNlKSwKLQkJICAgICAgIG1zZywgYnVmMS0+bmFtZSwgYnVmMi0+bmFtZSwKLQkJICAgICAgIHRvbW95b19nZXRfbGFzdF9uYW1lKGRvbWFpbikpOwotCWlmIChtb2RlID09IDEgJiYgdG9tb3lvX2RvbWFpbl9xdW90YV9pc19vayhkb21haW4pKSB7Ci0JCWNvbnN0IGNoYXIgKm5hbWUxID0gdG9tb3lvX2dldF9maWxlX3BhdHRlcm4oYnVmMSktPm5hbWU7Ci0JCWNvbnN0IGNoYXIgKm5hbWUyID0gdG9tb3lvX2dldF9maWxlX3BhdHRlcm4oYnVmMiktPm5hbWU7Ci0JCXRvbW95b191cGRhdGVfcGF0aDJfYWNsKG9wZXJhdGlvbiwgbmFtZTEsIG5hbWUyLCBkb21haW4sCi0JCQkJCWZhbHNlKTsKLQl9CisJc3dpdGNoIChvcGVyYXRpb24pIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWNhc2UgVE9NT1lPX1RZUEVfUkVOQU1FOgorICAgICAgICBjYXNlIFRPTU9ZT19UWVBFX0xJTks6CisJCWRlbnRyeSA9IHBhdGgxLT5kZW50cnk7CisJICAgICAgICBpZiAoIWRlbnRyeS0+ZF9pbm9kZSB8fCAhU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBUT01PWU9fVFlQRV9QSVZPVF9ST09UOgorICAgICAgICAgICAgICAgIHRvbW95b19hZGRfc2xhc2goJmJ1ZjEpOworICAgICAgICAgICAgICAgIHRvbW95b19hZGRfc2xhc2goJmJ1ZjIpOworCQlicmVhazsKKyAgICAgICAgfQorCXIucGFyYW1fdHlwZSA9IFRPTU9ZT19UWVBFX1BBVEgyX0FDTDsKKwlyLnBhcmFtLnBhdGgyLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwlyLnBhcmFtLnBhdGgyLmZpbGVuYW1lMSA9ICZidWYxOworCXIucGFyYW0ucGF0aDIuZmlsZW5hbWUyID0gJmJ1ZjI7CisJZG8geworCQl0b21veW9fY2hlY2tfYWNsKCZyLCB0b21veW9fY2hlY2tfcGF0aDJfYWNsKTsKKwkJZXJyb3IgPSB0b21veW9fYXVkaXRfcGF0aDJfbG9nKCZyKTsKKwl9IHdoaWxlIChlcnJvciA9PSBUT01PWU9fUkVUUllfUkVRVUVTVCk7CiAgb3V0OgotCWtmcmVlKGJ1ZjEpOwotCWtmcmVlKGJ1ZjIpOworCWtmcmVlKGJ1ZjEubmFtZSk7CisJa2ZyZWUoYnVmMi5uYW1lKTsKIAl0b21veW9fcmVhZF91bmxvY2soaWR4KTsKLQlpZiAoIWlzX2VuZm9yY2UpCisJaWYgKHIubW9kZSAhPSBUT01PWU9fQ09ORklHX0VORk9SQ0lORykKIAkJZXJyb3IgPSAwOwogCXJldHVybiBlcnJvcjsKIH0KKworLyoqCisgKiB0b21veW9fd3JpdGVfZmlsZSAtIFVwZGF0ZSBmaWxlIHJlbGF0ZWQgbGlzdC4KKyAqCisgKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCisgKiBAZG9tYWluOiAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIi4KKyAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICoKKyAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCisgKi8KK2ludCB0b21veW9fd3JpdGVfZmlsZShjaGFyICpkYXRhLCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCisJCSAgICAgIGNvbnN0IGJvb2wgaXNfZGVsZXRlKQoreworCWNoYXIgKndbNV07CisJdTggdHlwZTsKKwlpZiAoIXRvbW95b190b2tlbml6ZShkYXRhLCB3LCBzaXplb2YodykpIHx8ICF3WzFdWzBdKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybmNtcCh3WzBdLCAiYWxsb3dfIiwgNikpCisJCWdvdG8gb3V0OworCXdbMF0gKz0gNjsKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgVE9NT1lPX01BWF9QQVRIX09QRVJBVElPTjsgdHlwZSsrKSB7CisJCWlmIChzdHJjbXAod1swXSwgdG9tb3lvX3BhdGhfa2V5d29yZFt0eXBlXSkpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIHRvbW95b191cGRhdGVfcGF0aF9hY2wodHlwZSwgd1sxXSwgZG9tYWluLCBpc19kZWxldGUpOworCX0KKwlpZiAoIXdbMl1bMF0pCisJCWdvdG8gb3V0OworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBUT01PWU9fTUFYX1BBVEgyX09QRVJBVElPTjsgdHlwZSsrKSB7CisJCWlmIChzdHJjbXAod1swXSwgdG9tb3lvX3BhdGgyX2tleXdvcmRbdHlwZV0pKQorCQkJY29udGludWU7CisJCXJldHVybiB0b21veW9fdXBkYXRlX3BhdGgyX2FjbCh0eXBlLCB3WzFdLCB3WzJdLCBkb21haW4sCisJCQkJCSAgICAgICBpc19kZWxldGUpOworCX0KKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgVE9NT1lPX01BWF9QQVRIX05VTUJFUl9PUEVSQVRJT047IHR5cGUrKykgeworCQlpZiAoc3RyY21wKHdbMF0sIHRvbW95b19wYXRoX251bWJlcl9rZXl3b3JkW3R5cGVdKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gdG9tb3lvX3VwZGF0ZV9wYXRoX251bWJlcl9hY2wodHlwZSwgd1sxXSwgd1syXSwgZG9tYWluLAorCQkJCQkJICAgICBpc19kZWxldGUpOworCX0KKwlpZiAoIXdbM11bMF0gfHwgIXdbNF1bMF0pCisJCWdvdG8gb3V0OworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBUT01PWU9fTUFYX01LREVWX09QRVJBVElPTjsgdHlwZSsrKSB7CisJCWlmIChzdHJjbXAod1swXSwgdG9tb3lvX21rZGV2X2tleXdvcmRbdHlwZV0pKQorCQkJY29udGludWU7CisJCXJldHVybiB0b21veW9fdXBkYXRlX21rZGV2X2FjbCh0eXBlLCB3WzFdLCB3WzJdLCB3WzNdLAorCQkJCQkgICAgICAgd1s0XSwgZG9tYWluLCBpc19kZWxldGUpOworCX0KKyBvdXQ6CisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vZ2MuYyBiL3NlY3VyaXR5L3RvbW95by9nYy5jCmluZGV4IGI5Y2M3MWIuLmE4NzdlNGMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3RvbW95by9nYy5jCisrKyBiL3NlY3VyaXR5L3RvbW95by9nYy5jCkBAIC0xMSw4MyArMTEsNzUgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi1lbnVtIHRvbW95b19nY19pZCB7Ci0JVE9NT1lPX0lEX1BBVEhfR1JPVVAsCi0JVE9NT1lPX0lEX1BBVEhfR1JPVVBfTUVNQkVSLAotCVRPTU9ZT19JRF9ET01BSU5fSU5JVElBTElaRVIsCi0JVE9NT1lPX0lEX0RPTUFJTl9LRUVQRVIsCi0JVE9NT1lPX0lEX0FMSUFTLAotCVRPTU9ZT19JRF9HTE9CQUxMWV9SRUFEQUJMRSwKLQlUT01PWU9fSURfUEFUVEVSTiwKLQlUT01PWU9fSURfTk9fUkVXUklURSwKLQlUT01PWU9fSURfTUFOQUdFUiwKLQlUT01PWU9fSURfTkFNRSwKLQlUT01PWU9fSURfQUNMLAotCVRPTU9ZT19JRF9ET01BSU4KLX07Ci0KLXN0cnVjdCB0b21veW9fZ2NfZW50cnkgeworc3RydWN0IHRvbW95b19nYyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCB0eXBlOwotCXZvaWQgKmVsZW1lbnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKIH07CiBzdGF0aWMgTElTVF9IRUFEKHRvbW95b19nY19xdWV1ZSk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHRvbW95b19nY19tdXRleCk7CiAKIC8qIENhbGxlciBob2xkcyB0b21veW9fcG9saWN5X2xvY2sgbXV0ZXguICovCi1zdGF0aWMgYm9vbCB0b21veW9fYWRkX3RvX2djKGNvbnN0IGludCB0eXBlLCB2b2lkICplbGVtZW50KQorc3RhdGljIGJvb2wgdG9tb3lvX2FkZF90b19nYyhjb25zdCBpbnQgdHlwZSwgc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudCkKIHsKLQlzdHJ1Y3QgdG9tb3lvX2djX2VudHJ5ICplbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOworCXN0cnVjdCB0b21veW9fZ2MgKmVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIGZhbHNlOwogCWVudHJ5LT50eXBlID0gdHlwZTsKIAllbnRyeS0+ZWxlbWVudCA9IGVsZW1lbnQ7CiAJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmdG9tb3lvX2djX3F1ZXVlKTsKKwlsaXN0X2RlbF9yY3UoZWxlbWVudCk7CiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIHRvbW95b19kZWxfYWxsb3dfcmVhZAotKHN0cnVjdCB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfZmlsZV9lbnRyeSAqcHRyKQorc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9hbGxvd19yZWFkKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCiB7CisJc3RydWN0IHRvbW95b19yZWFkYWJsZV9maWxlICpwdHIgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCpwdHIpLCBoZWFkLmxpc3QpOwogCXRvbW95b19wdXRfbmFtZShwdHItPmZpbGVuYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9maWxlX3BhdHRlcm4oc3RydWN0IHRvbW95b19wYXR0ZXJuX2VudHJ5ICpwdHIpCitzdGF0aWMgdm9pZCB0b21veW9fZGVsX2ZpbGVfcGF0dGVybihzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50KQogeworCXN0cnVjdCB0b21veW9fbm9fcGF0dGVybiAqcHRyID0KKwkJY29udGFpbmVyX29mKGVsZW1lbnQsIHR5cGVvZigqcHRyKSwgaGVhZC5saXN0KTsKIAl0b21veW9fcHV0X25hbWUocHRyLT5wYXR0ZXJuKTsKIH0KIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9ub19yZXdyaXRlKHN0cnVjdCB0b21veW9fbm9fcmV3cml0ZV9lbnRyeSAqcHRyKQorc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9ub19yZXdyaXRlKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCiB7CisJc3RydWN0IHRvbW95b19ub19yZXdyaXRlICpwdHIgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCpwdHIpLCBoZWFkLmxpc3QpOwogCXRvbW95b19wdXRfbmFtZShwdHItPnBhdHRlcm4pOwogfQogCi1zdGF0aWMgdm9pZCB0b21veW9fZGVsX2RvbWFpbl9pbml0aWFsaXplcgotKHN0cnVjdCB0b21veW9fZG9tYWluX2luaXRpYWxpemVyX2VudHJ5ICpwdHIpCitzdGF0aWMgdm9pZCB0b21veW9fZGVsX3RyYW5zaXRpb25fY29udHJvbChzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50KQogeworCXN0cnVjdCB0b21veW9fdHJhbnNpdGlvbl9jb250cm9sICpwdHIgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCpwdHIpLCBoZWFkLmxpc3QpOwogCXRvbW95b19wdXRfbmFtZShwdHItPmRvbWFpbm5hbWUpOwogCXRvbW95b19wdXRfbmFtZShwdHItPnByb2dyYW0pOwogfQogCi1zdGF0aWMgdm9pZCB0b21veW9fZGVsX2RvbWFpbl9rZWVwZXIoc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5ICpwdHIpCitzdGF0aWMgdm9pZCB0b21veW9fZGVsX2FnZ3JlZ2F0b3Ioc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudCkKIHsKLQl0b21veW9fcHV0X25hbWUocHRyLT5kb21haW5uYW1lKTsKLQl0b21veW9fcHV0X25hbWUocHRyLT5wcm9ncmFtKTsKLX0KLQotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9hbGlhcyhzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5ICpwdHIpCi17CisJc3RydWN0IHRvbW95b19hZ2dyZWdhdG9yICpwdHIgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCpwdHIpLCBoZWFkLmxpc3QpOwogCXRvbW95b19wdXRfbmFtZShwdHItPm9yaWdpbmFsX25hbWUpOwotCXRvbW95b19wdXRfbmFtZShwdHItPmFsaWFzZWRfbmFtZSk7CisJdG9tb3lvX3B1dF9uYW1lKHB0ci0+YWdncmVnYXRlZF9uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9tYW5hZ2VyKHN0cnVjdCB0b21veW9fcG9saWN5X21hbmFnZXJfZW50cnkgKnB0cikKK3N0YXRpYyB2b2lkIHRvbW95b19kZWxfbWFuYWdlcihzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50KQogeworCXN0cnVjdCB0b21veW9fbWFuYWdlciAqcHRyID0KKwkJY29udGFpbmVyX29mKGVsZW1lbnQsIHR5cGVvZigqcHRyKSwgaGVhZC5saXN0KTsKIAl0b21veW9fcHV0X25hbWUocHRyLT5tYW5hZ2VyKTsKIH0KIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9hY2woc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYWNsKQorc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9hY2woc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudCkKIHsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICphY2wgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCphY2wpLCBsaXN0KTsKIAlzd2l0Y2ggKGFjbC0+dHlwZSkgewogCWNhc2UgVE9NT1lPX1RZUEVfUEFUSF9BQ0w6CiAJCXsKQEAgLTEwNCwxNCArOTYsNDEgQEAKIAkJCXRvbW95b19wdXRfbmFtZV91bmlvbigmZW50cnktPm5hbWUyKTsKIAkJfQogCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIHR5cGVcbiIpOworCWNhc2UgVE9NT1lPX1RZUEVfUEFUSF9OVU1CRVJfQUNMOgorCQl7CisJCQlzdHJ1Y3QgdG9tb3lvX3BhdGhfbnVtYmVyX2FjbCAqZW50cnkKKwkJCQk9IGNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqZW50cnkpLCBoZWFkKTsKKwkJCXRvbW95b19wdXRfbmFtZV91bmlvbigmZW50cnktPm5hbWUpOworCQkJdG9tb3lvX3B1dF9udW1iZXJfdW5pb24oJmVudHJ5LT5udW1iZXIpOworCQl9CisJCWJyZWFrOworCWNhc2UgVE9NT1lPX1RZUEVfTUtERVZfQUNMOgorCQl7CisJCQlzdHJ1Y3QgdG9tb3lvX21rZGV2X2FjbCAqZW50cnkKKwkJCQk9IGNvbnRhaW5lcl9vZihhY2wsIHR5cGVvZigqZW50cnkpLCBoZWFkKTsKKwkJCXRvbW95b19wdXRfbmFtZV91bmlvbigmZW50cnktPm5hbWUpOworCQkJdG9tb3lvX3B1dF9udW1iZXJfdW5pb24oJmVudHJ5LT5tb2RlKTsKKwkJCXRvbW95b19wdXRfbnVtYmVyX3VuaW9uKCZlbnRyeS0+bWFqb3IpOworCQkJdG9tb3lvX3B1dF9udW1iZXJfdW5pb24oJmVudHJ5LT5taW5vcik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUT01PWU9fVFlQRV9NT1VOVF9BQ0w6CisJCXsKKwkJCXN0cnVjdCB0b21veW9fbW91bnRfYWNsICplbnRyeQorCQkJCT0gY29udGFpbmVyX29mKGFjbCwgdHlwZW9mKCplbnRyeSksIGhlYWQpOworCQkJdG9tb3lvX3B1dF9uYW1lX3VuaW9uKCZlbnRyeS0+ZGV2X25hbWUpOworCQkJdG9tb3lvX3B1dF9uYW1lX3VuaW9uKCZlbnRyeS0+ZGlyX25hbWUpOworCQkJdG9tb3lvX3B1dF9uYW1lX3VuaW9uKCZlbnRyeS0+ZnNfdHlwZSk7CisJCQl0b21veW9fcHV0X251bWJlcl91bmlvbigmZW50cnktPmZsYWdzKTsKKwkJfQogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyBib29sIHRvbW95b19kZWxfZG9tYWluKHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbikKK3N0YXRpYyBib29sIHRvbW95b19kZWxfZG9tYWluKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCiB7CisJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluID0KKwkJY29udGFpbmVyX29mKGVsZW1lbnQsIHR5cGVvZigqZG9tYWluKSwgbGlzdCk7CiAJc3RydWN0IHRvbW95b19hY2xfaW5mbyAqYWNsOwogCXN0cnVjdCB0b21veW9fYWNsX2luZm8gKnRtcDsKIAkvKgpAQCAtMTM5LDcgKzE1OCw3IEBACiAJaWYgKGF0b21pY19yZWFkKCZkb21haW4tPnVzZXJzKSkKIAkJcmV0dXJuIGZhbHNlOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY2wsIHRtcCwgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCwgbGlzdCkgewotCQl0b21veW9fZGVsX2FjbChhY2wpOworCQl0b21veW9fZGVsX2FjbCgmYWNsLT5saXN0KTsKIAkJdG9tb3lvX21lbW9yeV9mcmVlKGFjbCk7CiAJfQogCXRvbW95b19wdXRfbmFtZShkb21haW4tPmRvbWFpbm5hbWUpOwpAQCAtMTQ3LDEzNSArMTY2LDcwIEBACiB9CiAKIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9uYW1lKGNvbnN0IHN0cnVjdCB0b21veW9fbmFtZV9lbnRyeSAqcHRyKQorc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9uYW1lKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCiB7CisJY29uc3Qgc3RydWN0IHRvbW95b19uYW1lICpwdHIgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCpwdHIpLCBsaXN0KTsKIH0KIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9wYXRoX2dyb3VwX21lbWJlcihzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXBfbWVtYmVyCi0JCQkJCSAqbWVtYmVyKQorc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9wYXRoX2dyb3VwKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCiB7CisJc3RydWN0IHRvbW95b19wYXRoX2dyb3VwICptZW1iZXIgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCptZW1iZXIpLCBoZWFkLmxpc3QpOwogCXRvbW95b19wdXRfbmFtZShtZW1iZXItPm1lbWJlcl9uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgdG9tb3lvX2RlbF9wYXRoX2dyb3VwKHN0cnVjdCB0b21veW9fcGF0aF9ncm91cCAqZ3JvdXApCitzdGF0aWMgdm9pZCB0b21veW9fZGVsX2dyb3VwKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCiB7CisJc3RydWN0IHRvbW95b19ncm91cCAqZ3JvdXAgPQorCQljb250YWluZXJfb2YoZWxlbWVudCwgdHlwZW9mKCpncm91cCksIGxpc3QpOwogCXRvbW95b19wdXRfbmFtZShncm91cC0+Z3JvdXBfbmFtZSk7CiB9CiAKK3N0YXRpYyB2b2lkIHRvbW95b19kZWxfbnVtYmVyX2dyb3VwKHN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQpCit7CisJc3RydWN0IHRvbW95b19udW1iZXJfZ3JvdXAgKm1lbWJlciA9CisJCWNvbnRhaW5lcl9vZihlbGVtZW50LCB0eXBlb2YoKm1lbWJlciksIGhlYWQubGlzdCk7Cit9CisKK3N0YXRpYyBib29sIHRvbW95b19jb2xsZWN0X21lbWJlcihzdHJ1Y3QgbGlzdF9oZWFkICptZW1iZXJfbGlzdCwgaW50IGlkKQoreworCXN0cnVjdCB0b21veW9fYWNsX2hlYWQgKm1lbWJlcjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbWJlciwgbWVtYmVyX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFtZW1iZXItPmlzX2RlbGV0ZWQpCisJCQljb250aW51ZTsKKwkJaWYgKCF0b21veW9fYWRkX3RvX2djKGlkLCAmbWVtYmVyLT5saXN0KSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisgICAgICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCB0b21veW9fY29sbGVjdF9hY2woc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluKQoreworCXN0cnVjdCB0b21veW9fYWNsX2luZm8gKmFjbDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjbCwgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCwgbGlzdCkgeworCQlpZiAoIWFjbC0+aXNfZGVsZXRlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXRvbW95b19hZGRfdG9fZ2MoVE9NT1lPX0lEX0FDTCwgJmFjbC0+bGlzdCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdm9pZCB0b21veW9fY29sbGVjdF9lbnRyeSh2b2lkKQogeworCWludCBpOwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnRvbW95b19wb2xpY3lfbG9jaykpCiAJCXJldHVybjsKLQl7Ci0JCXN0cnVjdCB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfZmlsZV9lbnRyeSAqcHRyOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfbGlzdCwKLQkJCQkJbGlzdCkgewotCQkJaWYgKCFwdHItPmlzX2RlbGV0ZWQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodG9tb3lvX2FkZF90b19nYyhUT01PWU9fSURfR0xPQkFMTFlfUkVBREFCTEUsIHB0cikpCi0JCQkJbGlzdF9kZWxfcmN1KCZwdHItPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXsKLQkJc3RydWN0IHRvbW95b19wYXR0ZXJuX2VudHJ5ICpwdHI7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19wYXR0ZXJuX2xpc3QsIGxpc3QpIHsKLQkJCWlmICghcHRyLT5pc19kZWxldGVkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRvbW95b19hZGRfdG9fZ2MoVE9NT1lPX0lEX1BBVFRFUk4sIHB0cikpCi0JCQkJbGlzdF9kZWxfcmN1KCZwdHItPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXsKLQkJc3RydWN0IHRvbW95b19ub19yZXdyaXRlX2VudHJ5ICpwdHI7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19ub19yZXdyaXRlX2xpc3QsIGxpc3QpIHsKLQkJCWlmICghcHRyLT5pc19kZWxldGVkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRvbW95b19hZGRfdG9fZ2MoVE9NT1lPX0lEX05PX1JFV1JJVEUsIHB0cikpCi0JCQkJbGlzdF9kZWxfcmN1KCZwdHItPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXsKLQkJc3RydWN0IHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkgKnB0cjsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRyLCAmdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0LAotCQkJCQlsaXN0KSB7Ci0JCQlpZiAoIXB0ci0+aXNfZGVsZXRlZCkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9ET01BSU5fSU5JVElBTElaRVIsIHB0cikpCi0JCQkJbGlzdF9kZWxfcmN1KCZwdHItPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXsKLQkJc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5ICpwdHI7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19kb21haW5fa2VlcGVyX2xpc3QsIGxpc3QpIHsKLQkJCWlmICghcHRyLT5pc19kZWxldGVkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRvbW95b19hZGRfdG9fZ2MoVE9NT1lPX0lEX0RPTUFJTl9LRUVQRVIsIHB0cikpCi0JCQkJbGlzdF9kZWxfcmN1KCZwdHItPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXsKLQkJc3RydWN0IHRvbW95b19hbGlhc19lbnRyeSAqcHRyOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fYWxpYXNfbGlzdCwgbGlzdCkgewotCQkJaWYgKCFwdHItPmlzX2RlbGV0ZWQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodG9tb3lvX2FkZF90b19nYyhUT01PWU9fSURfQUxJQVMsIHB0cikpCi0JCQkJbGlzdF9kZWxfcmN1KCZwdHItPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXsKLQkJc3RydWN0IHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSAqcHRyOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fcG9saWN5X21hbmFnZXJfbGlzdCwKLQkJCQkJbGlzdCkgewotCQkJaWYgKCFwdHItPmlzX2RlbGV0ZWQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodG9tb3lvX2FkZF90b19nYyhUT01PWU9fSURfTUFOQUdFUiwgcHRyKSkKLQkJCQlsaXN0X2RlbF9yY3UoJnB0ci0+bGlzdCk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgVE9NT1lPX01BWF9QT0xJQ1k7IGkrKykgeworCQlpZiAoIXRvbW95b19jb2xsZWN0X21lbWJlcigmdG9tb3lvX3BvbGljeV9saXN0W2ldLCBpKSkKKwkJCWdvdG8gdW5sb2NrOwogCX0KIAl7CiAJCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbjsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZG9tYWluLCAmdG9tb3lvX2RvbWFpbl9saXN0LCBsaXN0KSB7Ci0JCQlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICphY2w7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShhY2wsICZkb21haW4tPmFjbF9pbmZvX2xpc3QsCi0JCQkJCQlsaXN0KSB7Ci0JCQkJc3dpdGNoIChhY2wtPnR5cGUpIHsKLQkJCQljYXNlIFRPTU9ZT19UWVBFX1BBVEhfQUNMOgotCQkJCQlpZiAoY29udGFpbmVyX29mKGFjbCwKLQkJCQkJIHN0cnVjdCB0b21veW9fcGF0aF9hY2wsCi0JCQkJCQkJIGhlYWQpLT5wZXJtIHx8Ci0JCQkJCSAgICBjb250YWluZXJfb2YoYWNsLAotCQkJCQkgc3RydWN0IHRvbW95b19wYXRoX2FjbCwKLQkJCQkJCQkgaGVhZCktPnBlcm1faGlnaCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRPTU9ZT19UWVBFX1BBVEgyX0FDTDoKLQkJCQkJaWYgKGNvbnRhaW5lcl9vZihhY2wsCi0JCQkJCSBzdHJ1Y3QgdG9tb3lvX3BhdGgyX2FjbCwKLQkJCQkJCQkgaGVhZCktPnBlcm0pCi0JCQkJCQljb250aW51ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmICh0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9BQ0wsIGFjbCkpCi0JCQkJCWxpc3RfZGVsX3JjdSgmYWNsLT5saXN0KTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQorCQkJaWYgKCF0b21veW9fY29sbGVjdF9hY2woZG9tYWluKSkKKwkJCQlnb3RvIHVubG9jazsKIAkJCWlmICghZG9tYWluLT5pc19kZWxldGVkIHx8IGF0b21pY19yZWFkKCZkb21haW4tPnVzZXJzKSkKIAkJCQljb250aW51ZTsKIAkJCS8qCkBAIC0yODMsMTA0ICsyMzcsOTIgQEAKIAkJCSAqIHJlZmVyIHRoaXMgZG9tYWluIGFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3ZlKCkuCiAJCQkgKiBXZSByZWNoZWNrIGRvbWFpbi0+dXNlcnMgYWZ0ZXIgU1JDVSBzeW5jaHJvbml6YXRpb24uCiAJCQkgKi8KLQkJCWlmICh0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9ET01BSU4sIGRvbWFpbikpCi0JCQkJbGlzdF9kZWxfcmN1KCZkb21haW4tPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOworCQkJaWYgKCF0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9ET01BSU4sICZkb21haW4tPmxpc3QpKQorCQkJCWdvdG8gdW5sb2NrOwogCQl9CiAJfQotCXsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBUT01PWU9fTUFYX0hBU0g7IGkrKykgewotCQkJc3RydWN0IHRvbW95b19uYW1lX2VudHJ5ICpwdHI7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHIsICZ0b21veW9fbmFtZV9saXN0W2ldLAotCQkJCQkJbGlzdCkgewotCQkJCWlmIChhdG9taWNfcmVhZCgmcHRyLT51c2VycykpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICh0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9OQU1FLCBwdHIpKQotCQkJCQlsaXN0X2RlbF9yY3UoJnB0ci0+bGlzdCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWkgPSBUT01PWU9fTUFYX0hBU0g7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKwlmb3IgKGkgPSAwOyBpIDwgVE9NT1lPX01BWF9IQVNIOyBpKyspIHsKKwkJc3RydWN0IHRvbW95b19uYW1lICpwdHI7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJnRvbW95b19uYW1lX2xpc3RbaV0sIGxpc3QpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmcHRyLT51c2VycykpCisJCQkJY29udGludWU7CisJCQlpZiAoIXRvbW95b19hZGRfdG9fZ2MoVE9NT1lPX0lEX05BTUUsICZwdHItPmxpc3QpKQorCQkJCWdvdG8gdW5sb2NrOwogCQl9CiAJfQotCXsKLQkJc3RydWN0IHRvbW95b19wYXRoX2dyb3VwICpncm91cDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3JvdXAsICZ0b21veW9fcGF0aF9ncm91cF9saXN0LCBsaXN0KSB7Ci0JCQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXBfbWVtYmVyICptZW1iZXI7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShtZW1iZXIsICZncm91cC0+bWVtYmVyX2xpc3QsCi0JCQkJCQlsaXN0KSB7Ci0JCQkJaWYgKCFtZW1iZXItPmlzX2RlbGV0ZWQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICh0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9QQVRIX0dST1VQX01FTUJFUiwKLQkJCQkJCSAgICAgbWVtYmVyKSkKLQkJCQkJbGlzdF9kZWxfcmN1KCZtZW1iZXItPmxpc3QpOwotCQkJCWVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9CisJZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfR1JPVVA7IGkrKykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJnRvbW95b19ncm91cF9saXN0W2ldOworCQlpbnQgaWQ7CisJCXN0cnVjdCB0b21veW9fZ3JvdXAgKmdyb3VwOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaWQgPSBUT01PWU9fSURfUEFUSF9HUk9VUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWQgPSBUT01PWU9fSURfTlVNQkVSX0dST1VQOworCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShncm91cCwgbGlzdCwgbGlzdCkgeworCQkJaWYgKCF0b21veW9fY29sbGVjdF9tZW1iZXIoJmdyb3VwLT5tZW1iZXJfbGlzdCwgaWQpKQorCQkJCWdvdG8gdW5sb2NrOwogCQkJaWYgKCFsaXN0X2VtcHR5KCZncm91cC0+bWVtYmVyX2xpc3QpIHx8CiAJCQkgICAgYXRvbWljX3JlYWQoJmdyb3VwLT51c2VycykpCiAJCQkJY29udGludWU7Ci0JCQlpZiAodG9tb3lvX2FkZF90b19nYyhUT01PWU9fSURfUEFUSF9HUk9VUCwgZ3JvdXApKQotCQkJCWxpc3RfZGVsX3JjdSgmZ3JvdXAtPmxpc3QpOwotCQkJZWxzZQotCQkJCWJyZWFrOworCQkJaWYgKCF0b21veW9fYWRkX3RvX2djKFRPTU9ZT19JRF9HUk9VUCwgJmdyb3VwLT5saXN0KSkKKwkJCQlnb3RvIHVubG9jazsKIAkJfQogCX0KKyB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZ0b21veW9fcG9saWN5X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCB0b21veW9fa2ZyZWVfZW50cnkodm9pZCkKIHsKLQlzdHJ1Y3QgdG9tb3lvX2djX2VudHJ5ICpwOwotCXN0cnVjdCB0b21veW9fZ2NfZW50cnkgKnRtcDsKKwlzdHJ1Y3QgdG9tb3lvX2djICpwOworCXN0cnVjdCB0b21veW9fZ2MgKnRtcDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCB0bXAsICZ0b21veW9fZ2NfcXVldWUsIGxpc3QpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudCA9IHAtPmVsZW1lbnQ7CiAJCXN3aXRjaCAocC0+dHlwZSkgewotCQljYXNlIFRPTU9ZT19JRF9ET01BSU5fSU5JVElBTElaRVI6Ci0JCQl0b21veW9fZGVsX2RvbWFpbl9pbml0aWFsaXplcihwLT5lbGVtZW50KTsKKwkJY2FzZSBUT01PWU9fSURfVFJBTlNJVElPTl9DT05UUk9MOgorCQkJdG9tb3lvX2RlbF90cmFuc2l0aW9uX2NvbnRyb2woZWxlbWVudCk7CiAJCQlicmVhazsKLQkJY2FzZSBUT01PWU9fSURfRE9NQUlOX0tFRVBFUjoKLQkJCXRvbW95b19kZWxfZG9tYWluX2tlZXBlcihwLT5lbGVtZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIFRPTU9ZT19JRF9BTElBUzoKLQkJCXRvbW95b19kZWxfYWxpYXMocC0+ZWxlbWVudCk7CisJCWNhc2UgVE9NT1lPX0lEX0FHR1JFR0FUT1I6CisJCQl0b21veW9fZGVsX2FnZ3JlZ2F0b3IoZWxlbWVudCk7CiAJCQlicmVhazsKIAkJY2FzZSBUT01PWU9fSURfR0xPQkFMTFlfUkVBREFCTEU6Ci0JCQl0b21veW9fZGVsX2FsbG93X3JlYWQocC0+ZWxlbWVudCk7CisJCQl0b21veW9fZGVsX2FsbG93X3JlYWQoZWxlbWVudCk7CiAJCQlicmVhazsKIAkJY2FzZSBUT01PWU9fSURfUEFUVEVSTjoKLQkJCXRvbW95b19kZWxfZmlsZV9wYXR0ZXJuKHAtPmVsZW1lbnQpOworCQkJdG9tb3lvX2RlbF9maWxlX3BhdHRlcm4oZWxlbWVudCk7CiAJCQlicmVhazsKIAkJY2FzZSBUT01PWU9fSURfTk9fUkVXUklURToKLQkJCXRvbW95b19kZWxfbm9fcmV3cml0ZShwLT5lbGVtZW50KTsKKwkJCXRvbW95b19kZWxfbm9fcmV3cml0ZShlbGVtZW50KTsKIAkJCWJyZWFrOwogCQljYXNlIFRPTU9ZT19JRF9NQU5BR0VSOgotCQkJdG9tb3lvX2RlbF9tYW5hZ2VyKHAtPmVsZW1lbnQpOworCQkJdG9tb3lvX2RlbF9tYW5hZ2VyKGVsZW1lbnQpOwogCQkJYnJlYWs7CiAJCWNhc2UgVE9NT1lPX0lEX05BTUU6Ci0JCQl0b21veW9fZGVsX25hbWUocC0+ZWxlbWVudCk7CisJCQl0b21veW9fZGVsX25hbWUoZWxlbWVudCk7CiAJCQlicmVhazsKIAkJY2FzZSBUT01PWU9fSURfQUNMOgotCQkJdG9tb3lvX2RlbF9hY2wocC0+ZWxlbWVudCk7CisJCQl0b21veW9fZGVsX2FjbChlbGVtZW50KTsKIAkJCWJyZWFrOwogCQljYXNlIFRPTU9ZT19JRF9ET01BSU46Ci0JCQlpZiAoIXRvbW95b19kZWxfZG9tYWluKHAtPmVsZW1lbnQpKQorCQkJaWYgKCF0b21veW9fZGVsX2RvbWFpbihlbGVtZW50KSkKIAkJCQljb250aW51ZTsKIAkJCWJyZWFrOwotCQljYXNlIFRPTU9ZT19JRF9QQVRIX0dST1VQX01FTUJFUjoKLQkJCXRvbW95b19kZWxfcGF0aF9ncm91cF9tZW1iZXIocC0+ZWxlbWVudCk7Ci0JCQlicmVhazsKIAkJY2FzZSBUT01PWU9fSURfUEFUSF9HUk9VUDoKLQkJCXRvbW95b19kZWxfcGF0aF9ncm91cChwLT5lbGVtZW50KTsKKwkJCXRvbW95b19kZWxfcGF0aF9ncm91cChlbGVtZW50KTsKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rbm93biB0eXBlXG4iKTsKKwkJY2FzZSBUT01PWU9fSURfR1JPVVA6CisJCQl0b21veW9fZGVsX2dyb3VwKGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWNhc2UgVE9NT1lPX0lEX05VTUJFUl9HUk9VUDoKKwkJCXRvbW95b19kZWxfbnVtYmVyX2dyb3VwKGVsZW1lbnQpOwogCQkJYnJlYWs7CiAJCX0KLQkJdG9tb3lvX21lbW9yeV9mcmVlKHAtPmVsZW1lbnQpOworCQl0b21veW9fbWVtb3J5X2ZyZWUoZWxlbWVudCk7CiAJCWxpc3RfZGVsKCZwLT5saXN0KTsKIAkJa2ZyZWUocCk7CiAJfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL2dyb3VwLmMgYi9zZWN1cml0eS90b21veW8vZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQzNTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvdG9tb3lvL2dyb3VwLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBzZWN1cml0eS90b21veW8vZ3JvdXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwICBOVFQgREFUQSBDT1JQT1JBVElPTgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0YXRpYyBib29sIHRvbW95b19zYW1lX3BhdGhfZ3JvdXAoY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYSwKKwkJCQljb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9oZWFkICpiKQoreworCXJldHVybiBjb250YWluZXJfb2YoYSwgc3RydWN0IHRvbW95b19wYXRoX2dyb3VwLCBoZWFkKS0+bWVtYmVyX25hbWUgPT0KKwkJY29udGFpbmVyX29mKGIsIHN0cnVjdCB0b21veW9fcGF0aF9ncm91cCwgaGVhZCktPm1lbWJlcl9uYW1lOworfQorCitzdGF0aWMgYm9vbCB0b21veW9fc2FtZV9udW1iZXJfZ3JvdXAoY29uc3Qgc3RydWN0IHRvbW95b19hY2xfaGVhZCAqYSwKKwkJCQkgIGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2hlYWQgKmIpCit7CisJcmV0dXJuICFtZW1jbXAoJmNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgdG9tb3lvX251bWJlcl9ncm91cCwgaGVhZCkKKwkJICAgICAgIC0+bnVtYmVyLAorCQkgICAgICAgJmNvbnRhaW5lcl9vZihiLCBzdHJ1Y3QgdG9tb3lvX251bWJlcl9ncm91cCwgaGVhZCkKKwkJICAgICAgIC0+bnVtYmVyLAorCQkgICAgICAgc2l6ZW9mKGNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgdG9tb3lvX251bWJlcl9ncm91cCwgaGVhZCkKKwkJCSAgICAgIC0+bnVtYmVyKSk7Cit9CisKKy8qKgorICogdG9tb3lvX3dyaXRlX2dyb3VwIC0gV3JpdGUgInN0cnVjdCB0b21veW9fcGF0aF9ncm91cCIvInN0cnVjdCB0b21veW9fbnVtYmVyX2dyb3VwIiBsaXN0LgorICoKKyAqIEBkYXRhOiAgICAgIFN0cmluZyB0byBwYXJzZS4KKyAqIEBpc19kZWxldGU6IFRydWUgaWYgaXQgaXMgYSBkZWxldGUgcmVxdWVzdC4KKyAqIEB0eXBlOiAgICAgIFR5cGUgb2YgdGhpcyBncm91cC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgdG9tb3lvX3dyaXRlX2dyb3VwKGNoYXIgKmRhdGEsIGNvbnN0IGJvb2wgaXNfZGVsZXRlLCBjb25zdCB1OCB0eXBlKQoreworCXN0cnVjdCB0b21veW9fZ3JvdXAgKmdyb3VwOworCXN0cnVjdCBsaXN0X2hlYWQgKm1lbWJlcjsKKwljaGFyICp3WzJdOworCWludCBlcnJvciA9IC1FSU5WQUw7CisJaWYgKCF0b21veW9fdG9rZW5pemUoZGF0YSwgdywgc2l6ZW9mKHcpKSB8fCAhd1sxXVswXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZ3JvdXAgPSB0b21veW9fZ2V0X2dyb3VwKHdbMF0sIHR5cGUpOworCWlmICghZ3JvdXApCisJCXJldHVybiAtRU5PTUVNOworCW1lbWJlciA9ICZncm91cC0+bWVtYmVyX2xpc3Q7CisJaWYgKHR5cGUgPT0gVE9NT1lPX1BBVEhfR1JPVVApIHsKKwkJc3RydWN0IHRvbW95b19wYXRoX2dyb3VwIGUgPSB7IH07CisJCWUubWVtYmVyX25hbWUgPSB0b21veW9fZ2V0X25hbWUod1sxXSk7CisJCWlmICghZS5tZW1iZXJfbmFtZSkgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyb3IgPSB0b21veW9fdXBkYXRlX3BvbGljeSgmZS5oZWFkLCBzaXplb2YoZSksIGlzX2RlbGV0ZSwKKwkJCQkJICAgICBtZW1iZXIsIHRvbW95b19zYW1lX3BhdGhfZ3JvdXApOworCQl0b21veW9fcHV0X25hbWUoZS5tZW1iZXJfbmFtZSk7CisJfSBlbHNlIGlmICh0eXBlID09IFRPTU9ZT19OVU1CRVJfR1JPVVApIHsKKwkJc3RydWN0IHRvbW95b19udW1iZXJfZ3JvdXAgZSA9IHsgfTsKKwkJaWYgKHdbMV1bMF0gPT0gJ0AnCisJCSAgICB8fCAhdG9tb3lvX3BhcnNlX251bWJlcl91bmlvbih3WzFdLCAmZS5udW1iZXIpCisJCSAgICB8fCBlLm51bWJlci52YWx1ZXNbMF0gPiBlLm51bWJlci52YWx1ZXNbMV0pCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSB0b21veW9fdXBkYXRlX3BvbGljeSgmZS5oZWFkLCBzaXplb2YoZSksIGlzX2RlbGV0ZSwKKwkJCQkJICAgICBtZW1iZXIsIHRvbW95b19zYW1lX251bWJlcl9ncm91cCk7CisJCS8qCisJCSAqIHRvbW95b19wdXRfbnVtYmVyX3VuaW9uKCkgaXMgbm90IG5lZWRlZCBiZWNhdXNlCisJCSAqIHdbMV1bMF0gIT0gJ0AnLgorCQkgKi8KKwl9Cisgb3V0OgorCXRvbW95b19wdXRfZ3JvdXAoZ3JvdXApOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiB0b21veW9fcGF0aF9tYXRjaGVzX2dyb3VwIC0gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aG5hbWUgbWF0Y2hlcyBtZW1iZXJzIG9mIHRoZSBnaXZlbiBwYXRobmFtZSBncm91cC4KKyAqCisgKiBAcGF0aG5hbWU6ICAgICAgICBUaGUgbmFtZSBvZiBwYXRobmFtZS4KKyAqIEBncm91cDogICAgICAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcGF0aF9ncm91cCIuCisgKgorICogUmV0dXJucyBtYXRjaGVkIG1lbWJlcidzIHBhdGhuYW1lIGlmIEBwYXRobmFtZSBtYXRjaGVzIHBhdGhuYW1lcyBpbiBAZ3JvdXAsCisgKiBOVUxMIG90aGVyd2lzZS4KKyAqCisgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgorICovCitjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqCit0b21veW9fcGF0aF9tYXRjaGVzX2dyb3VwKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpwYXRobmFtZSwKKwkJCSAgY29uc3Qgc3RydWN0IHRvbW95b19ncm91cCAqZ3JvdXApCit7CisJc3RydWN0IHRvbW95b19wYXRoX2dyb3VwICptZW1iZXI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobWVtYmVyLCAmZ3JvdXAtPm1lbWJlcl9saXN0LCBoZWFkLmxpc3QpIHsKKwkJaWYgKG1lbWJlci0+aGVhZC5pc19kZWxldGVkKQorCQkJY29udGludWU7CisJCWlmICghdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKHBhdGhuYW1lLCBtZW1iZXItPm1lbWJlcl9uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbWVtYmVyLT5tZW1iZXJfbmFtZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdG9tb3lvX251bWJlcl9tYXRjaGVzX2dyb3VwIC0gQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbnVtYmVyIG1hdGNoZXMgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gbnVtYmVyIGdyb3VwLgorICoKKyAqIEBtaW46ICAgTWluIG51bWJlci4KKyAqIEBtYXg6ICAgTWF4IG51bWJlci4KKyAqIEBncm91cDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19udW1iZXJfZ3JvdXAiLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAbWluIGFuZCBAbWF4IHBhcnRpYWxseSBvdmVybGFwcyBAZ3JvdXAsIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgorICovCitib29sIHRvbW95b19udW1iZXJfbWF0Y2hlc19ncm91cChjb25zdCB1bnNpZ25lZCBsb25nIG1pbiwKKwkJCQkgY29uc3QgdW5zaWduZWQgbG9uZyBtYXgsCisJCQkJIGNvbnN0IHN0cnVjdCB0b21veW9fZ3JvdXAgKmdyb3VwKQoreworCXN0cnVjdCB0b21veW9fbnVtYmVyX2dyb3VwICptZW1iZXI7CisJYm9vbCBtYXRjaGVkID0gZmFsc2U7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobWVtYmVyLCAmZ3JvdXAtPm1lbWJlcl9saXN0LCBoZWFkLmxpc3QpIHsKKwkJaWYgKG1lbWJlci0+aGVhZC5pc19kZWxldGVkKQorCQkJY29udGludWU7CisJCWlmIChtaW4gPiBtZW1iZXItPm51bWJlci52YWx1ZXNbMV0gfHwKKwkJICAgIG1heCA8IG1lbWJlci0+bnVtYmVyLnZhbHVlc1swXSkKKwkJCWNvbnRpbnVlOworCQltYXRjaGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBtYXRjaGVkOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL2xvYWRfcG9saWN5LmMgYi9zZWN1cml0eS90b21veW8vbG9hZF9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFkYTdjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvdG9tb3lvL2xvYWRfcG9saWN5LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIHNlY3VyaXR5L3RvbW95by9sb2FkX3BvbGljeS5jCisgKgorICogUG9saWN5IGxvYWRlciBsYXVuY2hlciBmb3IgVE9NT1lPLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwICBOVFQgREFUQSBDT1JQT1JBVElPTgorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLyogcGF0aCB0byBwb2xpY3kgbG9hZGVyICovCitzdGF0aWMgY29uc3QgY2hhciAqdG9tb3lvX2xvYWRlciA9ICIvc2Jpbi90b21veW8taW5pdCI7CisKKy8qKgorICogdG9tb3lvX3BvbGljeV9sb2FkZXJfZXhpc3RzIC0gQ2hlY2sgd2hldGhlciAvc2Jpbi90b21veW8taW5pdCBleGlzdHMuCisgKgorICogUmV0dXJucyB0cnVlIGlmIC9zYmluL3RvbW95by1pbml0IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCB0b21veW9fcG9saWN5X2xvYWRlcl9leGlzdHModm9pZCkKK3sKKwkvKgorCSAqIERvbid0IGFjdGl2YXRlIE1BQyBpZiB0aGUgcG9saWN5IGxvYWRlciBkb2Vzbid0IGV4aXN0LgorCSAqIElmIHRoZSBpbml0cmQgaW5jbHVkZXMgL3NiaW4vaW5pdCBidXQgcmVhbC1yb290LWRldiBoYXMgbm90CisJICogbW91bnRlZCBvbiAvIHlldCwgYWN0aXZhdGluZyBNQUMgd2lsbCBibG9jayB0aGUgc3lzdGVtIHNpbmNlCisJICogcG9saWNpZXMgYXJlIG5vdCBsb2FkZWQgeWV0LgorCSAqIFRodXMsIGxldCBkb19leGVjdmUoKSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlcnl0aW1lLgorCSAqLworCXN0cnVjdCBwYXRoIHBhdGg7CisKKwlpZiAoa2Vybl9wYXRoKHRvbW95b19sb2FkZXIsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJOb3QgYWN0aXZhdGluZyBNYW5kYXRvcnkgQWNjZXNzIENvbnRyb2wgbm93ICIKKwkJICAgICAgICJzaW5jZSAlcyBkb2Vzbid0IGV4aXN0LlxuIiwgdG9tb3lvX2xvYWRlcik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcGF0aF9wdXQoJnBhdGgpOworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHRvbW95b19sb2FkX3BvbGljeSAtIFJ1biBleHRlcm5hbCBwb2xpY3kgbG9hZGVyIHRvIGxvYWQgcG9saWN5LgorICoKKyAqIEBmaWxlbmFtZTogVGhlIHByb2dyYW0gYWJvdXQgdG8gc3RhcnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciBAZmlsZW5hbWUgaXMgL3NiaW4vaW5pdCAsIGFuZCBpZiBzbworICogaW52b2tlIC9zYmluL3RvbW95by1pbml0IGFuZCB3YWl0IGZvciB0aGUgdGVybWluYXRpb24gb2YgL3NiaW4vdG9tb3lvLWluaXQKKyAqIGFuZCB0aGVuIGNvbnRpbnVlcyBpbnZvY2F0aW9uIG9mIC9zYmluL2luaXQuCisgKiAvc2Jpbi90b21veW8taW5pdCByZWFkcyBwb2xpY3kgZmlsZXMgaW4gL2V0Yy90b21veW8vIGRpcmVjdG9yeSBhbmQKKyAqIHdyaXRlcyB0byAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZXMuCisgKgorICogUmV0dXJucyBub3RoaW5nLgorICovCit2b2lkIHRvbW95b19sb2FkX3BvbGljeShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICphcmd2WzJdOworCWNoYXIgKmVudnBbM107CisKKwlpZiAodG9tb3lvX3BvbGljeV9sb2FkZWQpCisJCXJldHVybjsKKwkvKgorCSAqIENoZWNrIGZpbGVuYW1lIGlzIC9zYmluL2luaXQgb3IgL3NiaW4vdG9tb3lvLXN0YXJ0LgorCSAqIC9zYmluL3RvbW95by1zdGFydCBpcyBhIGR1bW15IGZpbGVuYW1lIGluIGNhc2Ugd2hlcmUgL3NiaW4vaW5pdCBjYW4ndAorCSAqIGJlIHBhc3NlZC4KKwkgKiBZb3UgY2FuIGNyZWF0ZSAvc2Jpbi90b21veW8tc3RhcnQgYnkKKwkgKiAibG4gLXMgL2Jpbi90cnVlIC9zYmluL3RvbW95by1zdGFydCIuCisJICovCisJaWYgKHN0cmNtcChmaWxlbmFtZSwgIi9zYmluL2luaXQiKSAmJgorCSAgICBzdHJjbXAoZmlsZW5hbWUsICIvc2Jpbi90b21veW8tc3RhcnQiKSkKKwkJcmV0dXJuOworCWlmICghdG9tb3lvX3BvbGljeV9sb2FkZXJfZXhpc3RzKCkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gIkNhbGxpbmcgJXMgdG8gbG9hZCBwb2xpY3kuIFBsZWFzZSB3YWl0LlxuIiwKKwkgICAgICAgdG9tb3lvX2xvYWRlcik7CisJYXJndlswXSA9IChjaGFyICopIHRvbW95b19sb2FkZXI7CisJYXJndlsxXSA9IE5VTEw7CisJZW52cFswXSA9ICJIT01FPS8iOworCWVudnBbMV0gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7CisJZW52cFsyXSA9IE5VTEw7CisJY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCAxKTsKKwl0b21veW9fY2hlY2tfcHJvZmlsZSgpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL21lbW9yeS5jIGIvc2VjdXJpdHkvdG9tb3lvL21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NzYxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS90b21veW8vbWVtb3J5LmMKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBzZWN1cml0eS90b21veW8vbWVtb3J5LmMKKyAqCisgKiBNZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIFRPTU9ZTy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCAgTlRUIERBVEEgQ09SUE9SQVRJT04KKyAqLworCisjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworLyoqCisgKiB0b21veW9fd2Fybl9vb20gLSBQcmludCBvdXQgb2YgbWVtb3J5IHdhcm5pbmcgbWVzc2FnZS4KKyAqCisgKiBAZnVuY3Rpb246IEZ1bmN0aW9uJ3MgbmFtZS4KKyAqLwordm9pZCB0b21veW9fd2Fybl9vb20oY29uc3QgY2hhciAqZnVuY3Rpb24pCit7CisJLyogUmVkdWNlIGVycm9yIG1lc3NhZ2VzLiAqLworCXN0YXRpYyBwaWRfdCB0b21veW9fbGFzdF9waWQ7CisJY29uc3QgcGlkX3QgcGlkID0gY3VycmVudC0+cGlkOworCWlmICh0b21veW9fbGFzdF9waWQgIT0gcGlkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVSUk9SOiBPdXQgb2YgbWVtb3J5IGF0ICVzLlxuIiwKKwkJICAgICAgIGZ1bmN0aW9uKTsKKwkJdG9tb3lvX2xhc3RfcGlkID0gcGlkOworCX0KKwlpZiAoIXRvbW95b19wb2xpY3lfbG9hZGVkKQorCQlwYW5pYygiTUFDIEluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworfQorCisvKiBNZW1vcnkgYWxsb2NhdGVkIGZvciBwb2xpY3kuICovCitzdGF0aWMgYXRvbWljX3QgdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZTsKKy8qIFF1b3RhIGZvciBob2xkaW5nIHBvbGljeS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3k7CisKKy8qKgorICogdG9tb3lvX21lbW9yeV9vayAtIENoZWNrIG1lbW9yeSBxdW90YS4KKyAqCisgKiBAcHRyOiBQb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgQHB0ciBpcyBub3QgTlVMTCBhbmQgcXVvdGEgbm90IGV4Y2VlZGVkLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgdG9tb3lvX21lbW9yeV9vayh2b2lkICpwdHIpCit7CisJc2l6ZV90IHMgPSBwdHIgPyBrc2l6ZShwdHIpIDogMDsKKwlhdG9taWNfYWRkKHMsICZ0b21veW9fcG9saWN5X21lbW9yeV9zaXplKTsKKwlpZiAocHRyICYmICghdG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kgfHwKKwkJICAgIGF0b21pY19yZWFkKCZ0b21veW9fcG9saWN5X21lbW9yeV9zaXplKQorCQkgICAgPD0gdG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kpKSB7CisJCW1lbXNldChwdHIsIDAsIHMpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJYXRvbWljX3N1YihzLCAmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSk7CisJdG9tb3lvX3dhcm5fb29tKF9fZnVuY19fKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogdG9tb3lvX2NvbW1pdF9vayAtIENoZWNrIG1lbW9yeSBxdW90YS4KKyAqCisgKiBAZGF0YTogICBEYXRhIHRvIGNvcHkgZnJvbS4KKyAqIEBzaXplOiAgIFNpemUgaW4gYnl0ZS4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KKyAqIEBkYXRhIGlzIHplcm8tY2xlYXJlZCBvbiBzdWNjZXNzLgorICovCit2b2lkICp0b21veW9fY29tbWl0X29rKHZvaWQgKmRhdGEsIGNvbnN0IHVuc2lnbmVkIGludCBzaXplKQoreworCXZvaWQgKnB0ciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX05PRlMpOworCWlmICh0b21veW9fbWVtb3J5X29rKHB0cikpIHsKKwkJbWVtbW92ZShwdHIsIGRhdGEsIHNpemUpOworCQltZW1zZXQoZGF0YSwgMCwgc2l6ZSk7CisJCXJldHVybiBwdHI7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHRvbW95b19tZW1vcnlfZnJlZSAtIEZyZWUgbWVtb3J5IGZvciBlbGVtZW50cy4KKyAqCisgKiBAcHRyOiAgUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LgorICovCit2b2lkIHRvbW95b19tZW1vcnlfZnJlZSh2b2lkICpwdHIpCit7CisJYXRvbWljX3N1Yihrc2l6ZShwdHIpLCAmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSk7CisJa2ZyZWUocHRyKTsKK30KKworLyoqCisgKiB0b21veW9fZ2V0X2dyb3VwIC0gQWxsb2NhdGUgbWVtb3J5IGZvciAic3RydWN0IHRvbW95b19wYXRoX2dyb3VwIi8ic3RydWN0IHRvbW95b19udW1iZXJfZ3JvdXAiLgorICoKKyAqIEBncm91cF9uYW1lOiBUaGUgbmFtZSBvZiBhZGRyZXNzIGdyb3VwLgorICogQGlkeDogICAgICAgIEluZGV4IG51bWJlci4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZ3JvdXAiIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgdG9tb3lvX2dyb3VwICp0b21veW9fZ2V0X2dyb3VwKGNvbnN0IGNoYXIgKmdyb3VwX25hbWUsIGNvbnN0IHU4IGlkeCkKK3sKKwlzdHJ1Y3QgdG9tb3lvX2dyb3VwIGUgPSB7IH07CisJc3RydWN0IHRvbW95b19ncm91cCAqZ3JvdXAgPSBOVUxMOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlpZiAoIXRvbW95b19jb3JyZWN0X3dvcmQoZ3JvdXBfbmFtZSkgfHwgaWR4ID49IFRPTU9ZT19NQVhfR1JPVVApCisJCXJldHVybiBOVUxMOworCWUuZ3JvdXBfbmFtZSA9IHRvbW95b19nZXRfbmFtZShncm91cF9uYW1lKTsKKwlpZiAoIWUuZ3JvdXBfbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKKwkJZ290byBvdXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShncm91cCwgJnRvbW95b19ncm91cF9saXN0W2lkeF0sIGxpc3QpIHsKKwkJaWYgKGUuZ3JvdXBfbmFtZSAhPSBncm91cC0+Z3JvdXBfbmFtZSkKKwkJCWNvbnRpbnVlOworCQlhdG9taWNfaW5jKCZncm91cC0+dXNlcnMpOworCQlmb3VuZCA9IHRydWU7CisJCWJyZWFrOworCX0KKwlpZiAoIWZvdW5kKSB7CisJCXN0cnVjdCB0b21veW9fZ3JvdXAgKmVudHJ5ID0gdG9tb3lvX2NvbW1pdF9vaygmZSwgc2l6ZW9mKGUpKTsKKwkJaWYgKGVudHJ5KSB7CisJCQlJTklUX0xJU1RfSEVBRCgmZW50cnktPm1lbWJlcl9saXN0KTsKKwkJCWF0b21pY19zZXQoJmVudHJ5LT51c2VycywgMSk7CisJCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsCisJCQkJCSAgJnRvbW95b19ncm91cF9saXN0W2lkeF0pOworCQkJZ3JvdXAgPSBlbnRyeTsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnRvbW95b19wb2xpY3lfbG9jayk7Cisgb3V0OgorCXRvbW95b19wdXRfbmFtZShlLmdyb3VwX25hbWUpOworCXJldHVybiBmb3VuZCA/IGdyb3VwIDogTlVMTDsKK30KKworLyoKKyAqIHRvbW95b19uYW1lX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBzdHJpbmcgZGF0YSB1c2VkIGJ5IFRPTU9ZTy4KKyAqIFNpbmNlIHNhbWUgc3RyaW5nIGRhdGEgaXMgbGlrZWx5IHVzZWQgZm9yIG11bHRpcGxlIHRpbWVzIChlLmcuCisgKiAiL2xpYi9saWJjLTIuNS5zbyIpLCBUT01PWU8gc2hhcmVzIHN0cmluZyBkYXRhIGluIHRoZSBmb3JtIG9mCisgKiAiY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKiIuCisgKi8KK3N0cnVjdCBsaXN0X2hlYWQgdG9tb3lvX25hbWVfbGlzdFtUT01PWU9fTUFYX0hBU0hdOworCisvKioKKyAqIHRvbW95b19nZXRfbmFtZSAtIEFsbG9jYXRlIHBlcm1hbmVudCBtZW1vcnkgZm9yIHN0cmluZyBkYXRhLgorICoKKyAqIEBuYW1lOiBUaGUgc3RyaW5nIHRvIHN0b3JlIGludG8gdGhlIHBlcm1lcm5lbnQgbWVtb3J5LgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byAic3RydWN0IHRvbW95b19wYXRoX2luZm8iIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgorICovCitjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqdG9tb3lvX2dldF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRvbW95b19uYW1lICpwdHI7CisJdW5zaWduZWQgaW50IGhhc2g7CisJaW50IGxlbjsKKwlpbnQgYWxsb2NhdGVkX2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKwlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCWhhc2ggPSBmdWxsX25hbWVfaGFzaCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuYW1lLCBsZW4gLSAxKTsKKwloZWFkID0gJnRvbW95b19uYW1lX2xpc3RbaGFzaF9sb25nKGhhc2gsIFRPTU9ZT19IQVNIX0JJVFMpXTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b21veW9fcG9saWN5X2xvY2spKQorCQlyZXR1cm4gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwgaGVhZCwgbGlzdCkgeworCQlpZiAoaGFzaCAhPSBwdHItPmVudHJ5Lmhhc2ggfHwgc3RyY21wKG5hbWUsIHB0ci0+ZW50cnkubmFtZSkpCisJCQljb250aW51ZTsKKwkJYXRvbWljX2luYygmcHRyLT51c2Vycyk7CisJCWdvdG8gb3V0OworCX0KKwlwdHIgPSBremFsbG9jKHNpemVvZigqcHRyKSArIGxlbiwgR0ZQX05PRlMpOworCWFsbG9jYXRlZF9sZW4gPSBwdHIgPyBrc2l6ZShwdHIpIDogMDsKKwlpZiAoIXB0ciB8fCAodG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kgJiYKKwkJICAgICBhdG9taWNfcmVhZCgmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSkgKyBhbGxvY2F0ZWRfbGVuCisJCSAgICAgPiB0b21veW9fcXVvdGFfZm9yX3BvbGljeSkpIHsKKwkJa2ZyZWUocHRyKTsKKwkJcHRyID0gTlVMTDsKKwkJdG9tb3lvX3dhcm5fb29tKF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCWF0b21pY19hZGQoYWxsb2NhdGVkX2xlbiwgJnRvbW95b19wb2xpY3lfbWVtb3J5X3NpemUpOworCXB0ci0+ZW50cnkubmFtZSA9ICgoY2hhciAqKSBwdHIpICsgc2l6ZW9mKCpwdHIpOworCW1lbW1vdmUoKGNoYXIgKikgcHRyLT5lbnRyeS5uYW1lLCBuYW1lLCBsZW4pOworCWF0b21pY19zZXQoJnB0ci0+dXNlcnMsIDEpOworCXRvbW95b19maWxsX3BhdGhfaW5mbygmcHRyLT5lbnRyeSk7CisJbGlzdF9hZGRfdGFpbCgmcHRyLT5saXN0LCBoZWFkKTsKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0b21veW9fcG9saWN5X2xvY2spOworCXJldHVybiBwdHIgPyAmcHRyLT5lbnRyeSA6IE5VTEw7Cit9CisKKy8qKgorICogdG9tb3lvX21tX2luaXQgLSBJbml0aWFsaXplIG1tIHJlbGF0ZWQgY29kZS4KKyAqLwordm9pZCBfX2luaXQgdG9tb3lvX21tX2luaXQodm9pZCkKK3sKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBUT01PWU9fTUFYX1BPTElDWTsgaWR4KyspCisJCUlOSVRfTElTVF9IRUFEKCZ0b21veW9fcG9saWN5X2xpc3RbaWR4XSk7CisJZm9yIChpZHggPSAwOyBpZHggPCBUT01PWU9fTUFYX0dST1VQOyBpZHgrKykKKwkJSU5JVF9MSVNUX0hFQUQoJnRvbW95b19ncm91cF9saXN0W2lkeF0pOworCWZvciAoaWR4ID0gMDsgaWR4IDwgVE9NT1lPX01BWF9IQVNIOyBpZHgrKykKKwkJSU5JVF9MSVNUX0hFQUQoJnRvbW95b19uYW1lX2xpc3RbaWR4XSk7CisJSU5JVF9MSVNUX0hFQUQoJnRvbW95b19rZXJuZWxfZG9tYWluLmFjbF9pbmZvX2xpc3QpOworCXRvbW95b19rZXJuZWxfZG9tYWluLmRvbWFpbm5hbWUgPSB0b21veW9fZ2V0X25hbWUoVE9NT1lPX1JPT1RfTkFNRSk7CisJbGlzdF9hZGRfdGFpbF9yY3UoJnRvbW95b19rZXJuZWxfZG9tYWluLmxpc3QsICZ0b21veW9fZG9tYWluX2xpc3QpOworCWlkeCA9IHRvbW95b19yZWFkX2xvY2soKTsKKwlpZiAodG9tb3lvX2ZpbmRfZG9tYWluKFRPTU9ZT19ST09UX05BTUUpICE9ICZ0b21veW9fa2VybmVsX2RvbWFpbikKKwkJcGFuaWMoIkNhbid0IHJlZ2lzdGVyIHRvbW95b19rZXJuZWxfZG9tYWluIik7CisJeworCQkvKiBMb2FkIGJ1aWx0LWluIHBvbGljeS4gKi8KKwkJdG9tb3lvX3dyaXRlX3RyYW5zaXRpb25fY29udHJvbCgiL3NiaW4vaG90cGx1ZyIsIGZhbHNlLAorCQkJCQlUT01PWU9fVFJBTlNJVElPTl9DT05UUk9MX0lOSVRJQUxJWkUpOworCQl0b21veW9fd3JpdGVfdHJhbnNpdGlvbl9jb250cm9sKCIvc2Jpbi9tb2Rwcm9iZSIsIGZhbHNlLAorCQkJCQlUT01PWU9fVFJBTlNJVElPTl9DT05UUk9MX0lOSVRJQUxJWkUpOworCX0KKwl0b21veW9fcmVhZF91bmxvY2soaWR4KTsKK30KKworCisvKiBNZW1vcnkgYWxsb2NhdGVkIGZvciBxdWVyeSBsaXN0cy4gKi8KK3Vuc2lnbmVkIGludCB0b21veW9fcXVlcnlfbWVtb3J5X3NpemU7CisvKiBRdW90YSBmb3IgaG9sZGluZyBxdWVyeSBsaXN0cy4gKi8KK3Vuc2lnbmVkIGludCB0b21veW9fcXVvdGFfZm9yX3F1ZXJ5OworCisvKioKKyAqIHRvbW95b19yZWFkX21lbW9yeV9jb3VudGVyIC0gQ2hlY2sgZm9yIG1lbW9yeSB1c2FnZSBpbiBieXRlcy4KKyAqCisgKiBAaGVhZDogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19pb19idWZmZXIiLgorICoKKyAqIFJldHVybnMgbWVtb3J5IHVzYWdlLgorICovCit2b2lkIHRvbW95b19yZWFkX21lbW9yeV9jb3VudGVyKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQoreworCWlmICghaGVhZC0+ci5lb2YpIHsKKwkJY29uc3QgdW5zaWduZWQgaW50IHBvbGljeQorCQkJPSBhdG9taWNfcmVhZCgmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSk7CisJCWNvbnN0IHVuc2lnbmVkIGludCBxdWVyeSA9IHRvbW95b19xdWVyeV9tZW1vcnlfc2l6ZTsKKwkJY2hhciBidWZmZXJbNjRdOworCisJCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwkJaWYgKHRvbW95b19xdW90YV9mb3JfcG9saWN5KQorCQkJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEsCisJCQkJICIgICAoUXVvdGE6ICUxMHUpIiwKKwkJCQkgdG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kpOworCQllbHNlCisJCQlidWZmZXJbMF0gPSAnXDAnOworCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICJQb2xpY3k6ICAgICAgICUxMHUlc1xuIiwgcG9saWN5LAorCQkJCSBidWZmZXIpOworCQlpZiAodG9tb3lvX3F1b3RhX2Zvcl9xdWVyeSkKKwkJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxLAorCQkJCSAiICAgKFF1b3RhOiAlMTB1KSIsCisJCQkJIHRvbW95b19xdW90YV9mb3JfcXVlcnkpOworCQllbHNlCisJCQlidWZmZXJbMF0gPSAnXDAnOworCQl0b21veW9faW9fcHJpbnRmKGhlYWQsICJRdWVyeSBsaXN0czogICUxMHUlc1xuIiwgcXVlcnksCisJCQkJIGJ1ZmZlcik7CisJCXRvbW95b19pb19wcmludGYoaGVhZCwgIlRvdGFsOiAgICAgICAgJTEwdVxuIiwgcG9saWN5ICsgcXVlcnkpOworCQloZWFkLT5yLmVvZiA9IHRydWU7CisJfQorfQorCisvKioKKyAqIHRvbW95b193cml0ZV9tZW1vcnlfcXVvdGEgLSBTZXQgbWVtb3J5IHF1b3RhLgorICoKKyAqIEBoZWFkOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciIuCisgKgorICogUmV0dXJucyAwLgorICovCitpbnQgdG9tb3lvX3dyaXRlX21lbW9yeV9xdW90YShzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciAqaGVhZCkKK3sKKwljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVfYnVmOworCXVuc2lnbmVkIGludCBzaXplOworCisJaWYgKHNzY2FuZihkYXRhLCAiUG9saWN5OiAldSIsICZzaXplKSA9PSAxKQorCQl0b21veW9fcXVvdGFfZm9yX3BvbGljeSA9IHNpemU7CisJZWxzZSBpZiAoc3NjYW5mKGRhdGEsICJRdWVyeSBsaXN0czogJXUiLCAmc2l6ZSkgPT0gMSkKKwkJdG9tb3lvX3F1b3RhX2Zvcl9xdWVyeSA9IHNpemU7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vbW91bnQuYyBiL3NlY3VyaXR5L3RvbW95by9tb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmY4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS90b21veW8vbW91bnQuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIHNlY3VyaXR5L3RvbW95by9tb3VudC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgIE5UVCBEQVRBIENPUlBPUkFUSU9OCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworLyogS2V5d29yZHMgZm9yIG1vdW50IHJlc3RyaWN0aW9ucy4gKi8KKworLyogQWxsb3cgdG8gY2FsbCAnbW91bnQgLS1iaW5kIC9zb3VyY2VfZGlyIC9kZXN0X2RpcicgKi8KKyNkZWZpbmUgVE9NT1lPX01PVU5UX0JJTkRfS0VZV09SRCAgICAgICAgICAgICAgICAgICAgICAgICItLWJpbmQiCisvKiBBbGxvdyB0byBjYWxsICdtb3VudCAtLW1vdmUgL29sZF9kaXIgICAgL25ld19kaXIgJyAqLworI2RlZmluZSBUT01PWU9fTU9VTlRfTU9WRV9LRVlXT1JEICAgICAgICAgICAgICAgICAgICAgICAgIi0tbW92ZSIKKy8qIEFsbG93IHRvIGNhbGwgJ21vdW50IC1vIHJlbW91bnQgL2RpciAgICAgICAgICAgICAnICovCisjZGVmaW5lIFRPTU9ZT19NT1VOVF9SRU1PVU5UX0tFWVdPUkQgICAgICAgICAgICAgICAgICAgICAiLS1yZW1vdW50IgorLyogQWxsb3cgdG8gY2FsbCAnbW91bnQgLS1tYWtlLXVuYmluZGFibGUgL2RpcicgICAgICAgKi8KKyNkZWZpbmUgVE9NT1lPX01PVU5UX01BS0VfVU5CSU5EQUJMRV9LRVlXT1JEICAgICAgICAgICAgICItLW1ha2UtdW5iaW5kYWJsZSIKKy8qIEFsbG93IHRvIGNhbGwgJ21vdW50IC0tbWFrZS1wcml2YXRlIC9kaXInICAgICAgICAgICovCisjZGVmaW5lIFRPTU9ZT19NT1VOVF9NQUtFX1BSSVZBVEVfS0VZV09SRCAgICAgICAgICAgICAgICAiLS1tYWtlLXByaXZhdGUiCisvKiBBbGxvdyB0byBjYWxsICdtb3VudCAtLW1ha2Utc2xhdmUgL2RpcicgICAgICAgICAgICAqLworI2RlZmluZSBUT01PWU9fTU9VTlRfTUFLRV9TTEFWRV9LRVlXT1JEICAgICAgICAgICAgICAgICAgIi0tbWFrZS1zbGF2ZSIKKy8qIEFsbG93IHRvIGNhbGwgJ21vdW50IC0tbWFrZS1zaGFyZWQgL2RpcicgICAgICAgICAgICovCisjZGVmaW5lIFRPTU9ZT19NT1VOVF9NQUtFX1NIQVJFRF9LRVlXT1JEICAgICAgICAgICAgICAgICAiLS1tYWtlLXNoYXJlZCIKKworLyoqCisgKiB0b21veW9fYXVkaXRfbW91bnRfbG9nIC0gQXVkaXQgbW91bnQgbG9nLgorICoKKyAqIEByOiBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0b21veW9fYXVkaXRfbW91bnRfbG9nKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyKQoreworCWNvbnN0IGNoYXIgKmRldiA9IHItPnBhcmFtLm1vdW50LmRldi0+bmFtZTsKKwljb25zdCBjaGFyICpkaXIgPSByLT5wYXJhbS5tb3VudC5kaXItPm5hbWU7CisJY29uc3QgY2hhciAqdHlwZSA9IHItPnBhcmFtLm1vdW50LnR5cGUtPm5hbWU7CisJY29uc3QgdW5zaWduZWQgbG9uZyBmbGFncyA9IHItPnBhcmFtLm1vdW50LmZsYWdzOworCWlmIChyLT5ncmFudGVkKQorCQlyZXR1cm4gMDsKKwlpZiAoIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfUkVNT1VOVF9LRVlXT1JEKSkKKwkJdG9tb3lvX3dhcm5fbG9nKHIsICJtb3VudCAtbyByZW1vdW50ICVzIDB4JWxYIiwgZGlyLCBmbGFncyk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfQklORF9LRVlXT1JEKQorCQkgfHwgIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfTU9WRV9LRVlXT1JEKSkKKwkJdG9tb3lvX3dhcm5fbG9nKHIsICJtb3VudCAlcyAlcyAlcyAweCVsWCIsIHR5cGUsIGRldiwgZGlyLAorCQkJCWZsYWdzKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsIFRPTU9ZT19NT1VOVF9NQUtFX1VOQklOREFCTEVfS0VZV09SRCkgfHwKKwkJICFzdHJjbXAodHlwZSwgVE9NT1lPX01PVU5UX01BS0VfUFJJVkFURV9LRVlXT1JEKSB8fAorCQkgIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfTUFLRV9TTEFWRV9LRVlXT1JEKSB8fAorCQkgIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfTUFLRV9TSEFSRURfS0VZV09SRCkpCisJCXRvbW95b193YXJuX2xvZyhyLCAibW91bnQgJXMgJXMgMHglbFgiLCB0eXBlLCBkaXIsIGZsYWdzKTsKKwllbHNlCisJCXRvbW95b193YXJuX2xvZyhyLCAibW91bnQgLXQgJXMgJXMgJXMgMHglbFgiLCB0eXBlLCBkZXYsIGRpciwKKwkJCQlmbGFncyk7CisJcmV0dXJuIHRvbW95b19zdXBlcnZpc29yKHIsCisJCQkJIFRPTU9ZT19LRVlXT1JEX0FMTE9XX01PVU5UICIlcyAlcyAlcyAweCVsWFxuIiwKKwkJCQkgdG9tb3lvX3BhdHRlcm4oci0+cGFyYW0ubW91bnQuZGV2KSwKKwkJCQkgdG9tb3lvX3BhdHRlcm4oci0+cGFyYW0ubW91bnQuZGlyKSwgdHlwZSwKKwkJCQkgZmxhZ3MpOworfQorCitzdGF0aWMgYm9vbCB0b21veW9fY2hlY2tfbW91bnRfYWNsKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKnB0cikKK3sKKwljb25zdCBzdHJ1Y3QgdG9tb3lvX21vdW50X2FjbCAqYWNsID0KKwkJY29udGFpbmVyX29mKHB0ciwgdHlwZW9mKCphY2wpLCBoZWFkKTsKKwlyZXR1cm4gdG9tb3lvX2NvbXBhcmVfbnVtYmVyX3VuaW9uKHItPnBhcmFtLm1vdW50LmZsYWdzLCAmYWNsLT5mbGFncykgJiYKKwkJdG9tb3lvX2NvbXBhcmVfbmFtZV91bmlvbihyLT5wYXJhbS5tb3VudC50eXBlLCAmYWNsLT5mc190eXBlKSAmJgorCQl0b21veW9fY29tcGFyZV9uYW1lX3VuaW9uKHItPnBhcmFtLm1vdW50LmRpciwgJmFjbC0+ZGlyX25hbWUpICYmCisJCSghci0+cGFyYW0ubW91bnQubmVlZF9kZXYgfHwKKwkJIHRvbW95b19jb21wYXJlX25hbWVfdW5pb24oci0+cGFyYW0ubW91bnQuZGV2LCAmYWNsLT5kZXZfbmFtZSkpOworfQorCisvKioKKyAqIHRvbW95b19tb3VudF9hY2wgLSBDaGVjayBwZXJtaXNzaW9uIGZvciBtb3VudCgpIG9wZXJhdGlvbi4KKyAqCisgKiBAcjogICAgICAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIi4KKyAqIEBkZXZfbmFtZTogTmFtZSBvZiBkZXZpY2UgZmlsZS4KKyAqIEBkaXI6ICAgICAgUG9pbnRlciB0byAic3RydWN0IHBhdGgiLgorICogQHR5cGU6ICAgICBOYW1lIG9mIGZpbGVzeXN0ZW0gdHlwZS4KKyAqIEBmbGFnczogICAgTW91bnQgb3B0aW9ucy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICoKKyAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCisgKi8KK3N0YXRpYyBpbnQgdG9tb3lvX21vdW50X2FjbChzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqciwgY2hhciAqZGV2X25hbWUsCisJCQkgICAgc3RydWN0IHBhdGggKmRpciwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcGF0aCBwYXRoOworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc3R5cGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnJlcXVlc3RlZF90eXBlID0gTlVMTDsKKwljb25zdCBjaGFyICpyZXF1ZXN0ZWRfZGlyX25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnJlcXVlc3RlZF9kZXZfbmFtZSA9IE5VTEw7CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gcnR5cGU7CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gcmRldjsKKwlzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyByZGlyOworCWludCBuZWVkX2RldiA9IDA7CisJaW50IGVycm9yID0gLUVOT01FTTsKKworCS8qIEdldCBmc3R5cGUuICovCisJcmVxdWVzdGVkX3R5cGUgPSB0b21veW9fZW5jb2RlKHR5cGUpOworCWlmICghcmVxdWVzdGVkX3R5cGUpCisJCWdvdG8gb3V0OworCXJ0eXBlLm5hbWUgPSByZXF1ZXN0ZWRfdHlwZTsKKwl0b21veW9fZmlsbF9wYXRoX2luZm8oJnJ0eXBlKTsKKworCS8qIEdldCBtb3VudCBwb2ludC4gKi8KKwlyZXF1ZXN0ZWRfZGlyX25hbWUgPSB0b21veW9fcmVhbHBhdGhfZnJvbV9wYXRoKGRpcik7CisJaWYgKCFyZXF1ZXN0ZWRfZGlyX25hbWUpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcmRpci5uYW1lID0gcmVxdWVzdGVkX2Rpcl9uYW1lOworCXRvbW95b19maWxsX3BhdGhfaW5mbygmcmRpcik7CisKKwkvKiBDb21wYXJlIGZzIG5hbWUuICovCisJaWYgKCFzdHJjbXAodHlwZSwgVE9NT1lPX01PVU5UX1JFTU9VTlRfS0VZV09SRCkpIHsKKwkJLyogZGV2X25hbWUgaXMgaWdub3JlZC4gKi8KKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgVE9NT1lPX01PVU5UX01BS0VfVU5CSU5EQUJMRV9LRVlXT1JEKSB8fAorCQkgICAhc3RyY21wKHR5cGUsIFRPTU9ZT19NT1VOVF9NQUtFX1BSSVZBVEVfS0VZV09SRCkgfHwKKwkJICAgIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfTUFLRV9TTEFWRV9LRVlXT1JEKSB8fAorCQkgICAhc3RyY21wKHR5cGUsIFRPTU9ZT19NT1VOVF9NQUtFX1NIQVJFRF9LRVlXT1JEKSkgeworCQkvKiBkZXZfbmFtZSBpcyBpZ25vcmVkLiAqLworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCBUT01PWU9fTU9VTlRfQklORF9LRVlXT1JEKSB8fAorCQkgICAhc3RyY21wKHR5cGUsIFRPTU9ZT19NT1VOVF9NT1ZFX0tFWVdPUkQpKSB7CisJCW5lZWRfZGV2ID0gLTE7IC8qIGRldl9uYW1lIGlzIGEgZGlyZWN0b3J5ICovCisJfSBlbHNlIHsKKwkJZnN0eXBlID0gZ2V0X2ZzX3R5cGUodHlwZSk7CisJCWlmICghZnN0eXBlKSB7CisJCQllcnJvciA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoZnN0eXBlLT5mc19mbGFncyAmIEZTX1JFUVVJUkVTX0RFVikKKwkJCS8qIGRldl9uYW1lIGlzIGEgYmxvY2sgZGV2aWNlIGZpbGUuICovCisJCQluZWVkX2RldiA9IDE7CisJfQorCWlmIChuZWVkX2RldikgeworCQkvKiBHZXQgbW91bnQgcG9pbnQgb3IgZGV2aWNlIGZpbGUuICovCisJCWlmIChrZXJuX3BhdGgoZGV2X25hbWUsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgeworCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVxdWVzdGVkX2Rldl9uYW1lID0gdG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aCgmcGF0aCk7CisJCWlmICghcmVxdWVzdGVkX2Rldl9uYW1lKSB7CisJCQllcnJvciA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE1hcCBkZXZfbmFtZSB0byAiPE5VTEw+IiBpZiBubyBkZXZfbmFtZSBnaXZlbi4gKi8KKwkJaWYgKCFkZXZfbmFtZSkKKwkJCWRldl9uYW1lID0gIjxOVUxMPiI7CisJCXJlcXVlc3RlZF9kZXZfbmFtZSA9IHRvbW95b19lbmNvZGUoZGV2X25hbWUpOworCQlpZiAoIXJlcXVlc3RlZF9kZXZfbmFtZSkgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmRldi5uYW1lID0gcmVxdWVzdGVkX2Rldl9uYW1lOworCXRvbW95b19maWxsX3BhdGhfaW5mbygmcmRldik7CisJci0+cGFyYW1fdHlwZSA9IFRPTU9ZT19UWVBFX01PVU5UX0FDTDsKKwlyLT5wYXJhbS5tb3VudC5uZWVkX2RldiA9IG5lZWRfZGV2OworCXItPnBhcmFtLm1vdW50LmRldiA9ICZyZGV2OworCXItPnBhcmFtLm1vdW50LmRpciA9ICZyZGlyOworCXItPnBhcmFtLm1vdW50LnR5cGUgPSAmcnR5cGU7CisJci0+cGFyYW0ubW91bnQuZmxhZ3MgPSBmbGFnczsKKwlkbyB7CisJCXRvbW95b19jaGVja19hY2wociwgdG9tb3lvX2NoZWNrX21vdW50X2FjbCk7CisJCWVycm9yID0gdG9tb3lvX2F1ZGl0X21vdW50X2xvZyhyKTsKKwl9IHdoaWxlIChlcnJvciA9PSBUT01PWU9fUkVUUllfUkVRVUVTVCk7Cisgb3V0OgorCWtmcmVlKHJlcXVlc3RlZF9kZXZfbmFtZSk7CisJa2ZyZWUocmVxdWVzdGVkX2Rpcl9uYW1lKTsKKwlpZiAoZnN0eXBlKQorCQlwdXRfZmlsZXN5c3RlbShmc3R5cGUpOworCWtmcmVlKHJlcXVlc3RlZF90eXBlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogdG9tb3lvX21vdW50X3Blcm1pc3Npb24gLSBDaGVjayBwZXJtaXNzaW9uIGZvciBtb3VudCgpIG9wZXJhdGlvbi4KKyAqCisgKiBAZGV2X25hbWU6ICBOYW1lIG9mIGRldmljZSBmaWxlLgorICogQHBhdGg6ICAgICAgUG9pbnRlciB0byAic3RydWN0IHBhdGgiLgorICogQHR5cGU6ICAgICAgTmFtZSBvZiBmaWxlc3lzdGVtIHR5cGUuIE1heSBiZSBOVUxMLgorICogQGZsYWdzOiAgICAgTW91bnQgb3B0aW9ucy4KKyAqIEBkYXRhX3BhZ2U6IE9wdGlvbmFsIGRhdGEuIE1heSBiZSBOVUxMLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCB0b21veW9fbW91bnRfcGVybWlzc2lvbihjaGFyICpkZXZfbmFtZSwgc3RydWN0IHBhdGggKnBhdGgsIGNoYXIgKnR5cGUsCisJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCAqZGF0YV9wYWdlKQoreworCXN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIHI7CisJaW50IGVycm9yOworCWludCBpZHg7CisKKwlpZiAodG9tb3lvX2luaXRfcmVxdWVzdF9pbmZvKCZyLCBOVUxMLCBUT01PWU9fTUFDX0ZJTEVfTU9VTlQpCisJICAgID09IFRPTU9ZT19DT05GSUdfRElTQUJMRUQpCisJCXJldHVybiAwOworCWlmICgoZmxhZ3MgJiBNU19NR0NfTVNLKSA9PSBNU19NR0NfVkFMKQorCQlmbGFncyAmPSB+TVNfTUdDX01TSzsKKwlpZiAoZmxhZ3MgJiBNU19SRU1PVU5UKSB7CisJCXR5cGUgPSBUT01PWU9fTU9VTlRfUkVNT1VOVF9LRVlXT1JEOworCQlmbGFncyAmPSB+TVNfUkVNT1VOVDsKKwl9CisJaWYgKGZsYWdzICYgTVNfTU9WRSkgeworCQl0eXBlID0gVE9NT1lPX01PVU5UX01PVkVfS0VZV09SRDsKKwkJZmxhZ3MgJj0gfk1TX01PVkU7CisJfQorCWlmIChmbGFncyAmIE1TX0JJTkQpIHsKKwkJdHlwZSA9IFRPTU9ZT19NT1VOVF9CSU5EX0tFWVdPUkQ7CisJCWZsYWdzICY9IH5NU19CSU5EOworCX0KKwlpZiAoZmxhZ3MgJiBNU19VTkJJTkRBQkxFKSB7CisJCXR5cGUgPSBUT01PWU9fTU9VTlRfTUFLRV9VTkJJTkRBQkxFX0tFWVdPUkQ7CisJCWZsYWdzICY9IH5NU19VTkJJTkRBQkxFOworCX0KKwlpZiAoZmxhZ3MgJiBNU19QUklWQVRFKSB7CisJCXR5cGUgPSBUT01PWU9fTU9VTlRfTUFLRV9QUklWQVRFX0tFWVdPUkQ7CisJCWZsYWdzICY9IH5NU19QUklWQVRFOworCX0KKwlpZiAoZmxhZ3MgJiBNU19TTEFWRSkgeworCQl0eXBlID0gVE9NT1lPX01PVU5UX01BS0VfU0xBVkVfS0VZV09SRDsKKwkJZmxhZ3MgJj0gfk1TX1NMQVZFOworCX0KKwlpZiAoZmxhZ3MgJiBNU19TSEFSRUQpIHsKKwkJdHlwZSA9IFRPTU9ZT19NT1VOVF9NQUtFX1NIQVJFRF9LRVlXT1JEOworCQlmbGFncyAmPSB+TVNfU0hBUkVEOworCX0KKwlpZiAoIXR5cGUpCisJCXR5cGUgPSAiPE5VTEw+IjsKKwlpZHggPSB0b21veW9fcmVhZF9sb2NrKCk7CisJZXJyb3IgPSB0b21veW9fbW91bnRfYWNsKCZyLCBkZXZfbmFtZSwgcGF0aCwgdHlwZSwgZmxhZ3MpOworCXRvbW95b19yZWFkX3VubG9jayhpZHgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGJvb2wgdG9tb3lvX3NhbWVfbW91bnRfYWNsKGNvbnN0IHN0cnVjdCB0b21veW9fYWNsX2luZm8gKmEsCisJCQkJICBjb25zdCBzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpiKQoreworCWNvbnN0IHN0cnVjdCB0b21veW9fbW91bnRfYWNsICpwMSA9IGNvbnRhaW5lcl9vZihhLCB0eXBlb2YoKnAxKSwgaGVhZCk7CisJY29uc3Qgc3RydWN0IHRvbW95b19tb3VudF9hY2wgKnAyID0gY29udGFpbmVyX29mKGIsIHR5cGVvZigqcDIpLCBoZWFkKTsKKwlyZXR1cm4gdG9tb3lvX3NhbWVfYWNsX2hlYWQoJnAxLT5oZWFkLCAmcDItPmhlYWQpICYmCisJCXRvbW95b19zYW1lX25hbWVfdW5pb24oJnAxLT5kZXZfbmFtZSwgJnAyLT5kZXZfbmFtZSkgJiYKKwkJdG9tb3lvX3NhbWVfbmFtZV91bmlvbigmcDEtPmRpcl9uYW1lLCAmcDItPmRpcl9uYW1lKSAmJgorCQl0b21veW9fc2FtZV9uYW1lX3VuaW9uKCZwMS0+ZnNfdHlwZSwgJnAyLT5mc190eXBlKSAmJgorCQl0b21veW9fc2FtZV9udW1iZXJfdW5pb24oJnAxLT5mbGFncywgJnAyLT5mbGFncyk7Cit9CisKKy8qKgorICogdG9tb3lvX3dyaXRlX21vdW50IC0gV3JpdGUgInN0cnVjdCB0b21veW9fbW91bnRfYWNsIiBsaXN0LgorICoKKyAqIEBkYXRhOiAgICAgIFN0cmluZyB0byBwYXJzZS4KKyAqIEBkb21haW46ICAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLgorICogQGlzX2RlbGV0ZTogVHJ1ZSBpZiBpdCBpcyBhIGRlbGV0ZSByZXF1ZXN0LgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKgorICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KKyAqLworaW50IHRvbW95b193cml0ZV9tb3VudChjaGFyICpkYXRhLCBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCisJCSAgICAgICBjb25zdCBib29sIGlzX2RlbGV0ZSkKK3sKKwlzdHJ1Y3QgdG9tb3lvX21vdW50X2FjbCBlID0geyAuaGVhZC50eXBlID0gVE9NT1lPX1RZUEVfTU9VTlRfQUNMIH07CisJaW50IGVycm9yID0gaXNfZGVsZXRlID8gLUVOT0VOVCA6IC1FTk9NRU07CisJY2hhciAqd1s0XTsKKwlpZiAoIXRvbW95b190b2tlbml6ZShkYXRhLCB3LCBzaXplb2YodykpIHx8ICF3WzNdWzBdKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRvbW95b19wYXJzZV9uYW1lX3VuaW9uKHdbMF0sICZlLmRldl9uYW1lKSB8fAorCSAgICAhdG9tb3lvX3BhcnNlX25hbWVfdW5pb24od1sxXSwgJmUuZGlyX25hbWUpIHx8CisJICAgICF0b21veW9fcGFyc2VfbmFtZV91bmlvbih3WzJdLCAmZS5mc190eXBlKSB8fAorCSAgICAhdG9tb3lvX3BhcnNlX251bWJlcl91bmlvbih3WzNdLCAmZS5mbGFncykpCisJCWdvdG8gb3V0OworCWVycm9yID0gdG9tb3lvX3VwZGF0ZV9kb21haW4oJmUuaGVhZCwgc2l6ZW9mKGUpLCBpc19kZWxldGUsIGRvbWFpbiwKKwkJCQkgICAgIHRvbW95b19zYW1lX21vdW50X2FjbCwgTlVMTCk7Cisgb3V0OgorCXRvbW95b19wdXRfbmFtZV91bmlvbigmZS5kZXZfbmFtZSk7CisJdG9tb3lvX3B1dF9uYW1lX3VuaW9uKCZlLmRpcl9uYW1lKTsKKwl0b21veW9fcHV0X25hbWVfdW5pb24oJmUuZnNfdHlwZSk7CisJdG9tb3lvX3B1dF9udW1iZXJfdW5pb24oJmUuZmxhZ3MpOworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9wYXRoX2dyb3VwLmMgYi9zZWN1cml0eS90b21veW8vcGF0aF9ncm91cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg4MDQxLi4wMDAwMDAwCi0tLSBhL3NlY3VyaXR5L3RvbW95by9wYXRoX2dyb3VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIHNlY3VyaXR5L3RvbW95by9wYXRoX2dyb3VwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSAgTlRUIERBVEEgQ09SUE9SQVRJT04KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgImNvbW1vbi5oIgotLyogVGhlIGxpc3QgZm9yICJzdHJ1Y3QgY2NzX3BhdGhfZ3JvdXAiLiAqLwotTElTVF9IRUFEKHRvbW95b19wYXRoX2dyb3VwX2xpc3QpOwotCi0vKioKLSAqIHRvbW95b19nZXRfcGF0aF9ncm91cCAtIEFsbG9jYXRlIG1lbW9yeSBmb3IgInN0cnVjdCB0b21veW9fcGF0aF9ncm91cCIuCi0gKgotICogQGdyb3VwX25hbWU6IFRoZSBuYW1lIG9mIHBhdGhuYW1lIGdyb3VwLgotICoKLSAqIFJldHVybnMgcG9pbnRlciB0byAic3RydWN0IHRvbW95b19wYXRoX2dyb3VwIiBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZS4KLSAqLwotc3RydWN0IHRvbW95b19wYXRoX2dyb3VwICp0b21veW9fZ2V0X3BhdGhfZ3JvdXAoY29uc3QgY2hhciAqZ3JvdXBfbmFtZSkKLXsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAgKmVudHJ5ID0gTlVMTDsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAgKmdyb3VwID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqc2F2ZWRfZ3JvdXBfbmFtZTsKLQlpbnQgZXJyb3IgPSAtRU5PTUVNOwotCWlmICghdG9tb3lvX2lzX2NvcnJlY3RfcGF0aChncm91cF9uYW1lLCAwLCAwLCAwKSB8fAotCSAgICAhZ3JvdXBfbmFtZVswXSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2F2ZWRfZ3JvdXBfbmFtZSA9IHRvbW95b19nZXRfbmFtZShncm91cF9uYW1lKTsKLQlpZiAoIXNhdmVkX2dyb3VwX25hbWUpCi0JCXJldHVybiBOVUxMOwotCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX05PRlMpOwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnRvbW95b19wb2xpY3lfbG9jaykpCi0JCWdvdG8gb3V0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGdyb3VwLCAmdG9tb3lvX3BhdGhfZ3JvdXBfbGlzdCwgbGlzdCkgewotCQlpZiAoc2F2ZWRfZ3JvdXBfbmFtZSAhPSBncm91cC0+Z3JvdXBfbmFtZSkKLQkJCWNvbnRpbnVlOwotCQlhdG9taWNfaW5jKCZncm91cC0+dXNlcnMpOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoZXJyb3IgJiYgdG9tb3lvX21lbW9yeV9vayhlbnRyeSkpIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmVudHJ5LT5tZW1iZXJfbGlzdCk7Ci0JCWVudHJ5LT5ncm91cF9uYW1lID0gc2F2ZWRfZ3JvdXBfbmFtZTsKLQkJc2F2ZWRfZ3JvdXBfbmFtZSA9IE5VTEw7Ci0JCWF0b21pY19zZXQoJmVudHJ5LT51c2VycywgMSk7Ci0JCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+bGlzdCwgJnRvbW95b19wYXRoX2dyb3VwX2xpc3QpOwotCQlncm91cCA9IGVudHJ5OwotCQllbnRyeSA9IE5VTEw7Ci0JCWVycm9yID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ0b21veW9fcG9saWN5X2xvY2spOwotIG91dDoKLQl0b21veW9fcHV0X25hbWUoc2F2ZWRfZ3JvdXBfbmFtZSk7Ci0Ja2ZyZWUoZW50cnkpOwotCXJldHVybiAhZXJyb3IgPyBncm91cCA6IE5VTEw7Ci19Ci0KLS8qKgotICogdG9tb3lvX3dyaXRlX3BhdGhfZ3JvdXBfcG9saWN5IC0gV3JpdGUgInN0cnVjdCB0b21veW9fcGF0aF9ncm91cCIgbGlzdC4KLSAqCi0gKiBAZGF0YTogICAgICBTdHJpbmcgdG8gcGFyc2UuCi0gKiBAaXNfZGVsZXRlOiBUcnVlIGlmIGl0IGlzIGEgZGVsZXRlIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5hZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KLSAqLwotaW50IHRvbW95b193cml0ZV9wYXRoX2dyb3VwX3BvbGljeShjaGFyICpkYXRhLCBjb25zdCBib29sIGlzX2RlbGV0ZSkKLXsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAgKmdyb3VwOwotCXN0cnVjdCB0b21veW9fcGF0aF9ncm91cF9tZW1iZXIgKm1lbWJlcjsKLQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXBfbWVtYmVyIGUgPSB7IH07Ci0JaW50IGVycm9yID0gaXNfZGVsZXRlID8gLUVOT0VOVCA6IC1FTk9NRU07Ci0JY2hhciAqd1syXTsKLQlpZiAoIXRvbW95b190b2tlbml6ZShkYXRhLCB3LCBzaXplb2YodykpIHx8ICF3WzFdWzBdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlncm91cCA9IHRvbW95b19nZXRfcGF0aF9ncm91cCh3WzBdKTsKLQlpZiAoIWdyb3VwKQotCQlyZXR1cm4gLUVOT01FTTsKLQllLm1lbWJlcl9uYW1lID0gdG9tb3lvX2dldF9uYW1lKHdbMV0pOwotCWlmICghZS5tZW1iZXJfbmFtZSkKLQkJZ290byBvdXQ7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdG9tb3lvX3BvbGljeV9sb2NrKSkKLQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobWVtYmVyLCAmZ3JvdXAtPm1lbWJlcl9saXN0LCBsaXN0KSB7Ci0JCWlmIChtZW1iZXItPm1lbWJlcl9uYW1lICE9IGUubWVtYmVyX25hbWUpCi0JCQljb250aW51ZTsKLQkJbWVtYmVyLT5pc19kZWxldGVkID0gaXNfZGVsZXRlOwotCQllcnJvciA9IDA7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIWlzX2RlbGV0ZSAmJiBlcnJvcikgewotCQlzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXBfbWVtYmVyICplbnRyeSA9Ci0JCQl0b21veW9fY29tbWl0X29rKCZlLCBzaXplb2YoZSkpOwotCQlpZiAoZW50cnkpIHsKLQkJCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+bGlzdCwgJmdyb3VwLT5tZW1iZXJfbGlzdCk7Ci0JCQllcnJvciA9IDA7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ0b21veW9fcG9saWN5X2xvY2spOwotIG91dDoKLQl0b21veW9fcHV0X25hbWUoZS5tZW1iZXJfbmFtZSk7Ci0JdG9tb3lvX3B1dF9wYXRoX2dyb3VwKGdyb3VwKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogdG9tb3lvX3JlYWRfcGF0aF9ncm91cF9wb2xpY3kgLSBSZWFkICJzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAiIGxpc3QuCi0gKgotICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KLSAqCi0gKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCi0gKi8KLWJvb2wgdG9tb3lvX3JlYWRfcGF0aF9ncm91cF9wb2xpY3koc3RydWN0IHRvbW95b19pb19idWZmZXIgKmhlYWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZ3BvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICptcG9zOwotCWxpc3RfZm9yX2VhY2hfY29va2llKGdwb3MsIGhlYWQtPnJlYWRfdmFyMSwgJnRvbW95b19wYXRoX2dyb3VwX2xpc3QpIHsKLQkJc3RydWN0IHRvbW95b19wYXRoX2dyb3VwICpncm91cDsKLQkJZ3JvdXAgPSBsaXN0X2VudHJ5KGdwb3MsIHN0cnVjdCB0b21veW9fcGF0aF9ncm91cCwgbGlzdCk7Ci0JCWxpc3RfZm9yX2VhY2hfY29va2llKG1wb3MsIGhlYWQtPnJlYWRfdmFyMiwKLQkJCQkgICAgICZncm91cC0+bWVtYmVyX2xpc3QpIHsKLQkJCXN0cnVjdCB0b21veW9fcGF0aF9ncm91cF9tZW1iZXIgKm1lbWJlcjsKLQkJCW1lbWJlciA9IGxpc3RfZW50cnkobXBvcywKLQkJCQkJICAgIHN0cnVjdCB0b21veW9fcGF0aF9ncm91cF9tZW1iZXIsCi0JCQkJCSAgICBsaXN0KTsKLQkJCWlmIChtZW1iZXItPmlzX2RlbGV0ZWQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIXRvbW95b19pb19wcmludGYoaGVhZCwgVE9NT1lPX0tFWVdPUkRfUEFUSF9HUk9VUAotCQkJCQkgICAgICAiJXMgJXNcbiIsCi0JCQkJCSAgICAgIGdyb3VwLT5ncm91cF9uYW1lLT5uYW1lLAotCQkJCQkgICAgICBtZW1iZXItPm1lbWJlcl9uYW1lLT5uYW1lKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogdG9tb3lvX3BhdGhfbWF0Y2hlc19ncm91cCAtIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGhuYW1lIG1hdGNoZXMgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gcGF0aG5hbWUgZ3JvdXAuCi0gKgotICogQHBhdGhuYW1lOiAgICAgICAgVGhlIG5hbWUgb2YgcGF0aG5hbWUuCi0gKiBAZ3JvdXA6ICAgICAgICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAiLgotICogQG1heV91c2VfcGF0dGVybjogVHJ1ZSBpZiB3aWxkIGNhcmQgaXMgcGVybWl0dGVkLgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiBAcGF0aG5hbWUgbWF0Y2hlcyBwYXRobmFtZXMgaW4gQGdyb3VwLCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICogQ2FsbGVyIGhvbGRzIHRvbW95b19yZWFkX2xvY2soKS4KLSAqLwotYm9vbCB0b21veW9fcGF0aF9tYXRjaGVzX2dyb3VwKGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpwYXRobmFtZSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfZ3JvdXAgKmdyb3VwLAotCQkJICAgICAgIGNvbnN0IGJvb2wgbWF5X3VzZV9wYXR0ZXJuKQotewotCXN0cnVjdCB0b21veW9fcGF0aF9ncm91cF9tZW1iZXIgKm1lbWJlcjsKLQlib29sIG1hdGNoZWQgPSBmYWxzZTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShtZW1iZXIsICZncm91cC0+bWVtYmVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKG1lbWJlci0+aXNfZGVsZXRlZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIW1lbWJlci0+bWVtYmVyX25hbWUtPmlzX3BhdHRlcm5lZCkgewotCQkJaWYgKHRvbW95b19wYXRoY21wKHBhdGhuYW1lLCBtZW1iZXItPm1lbWJlcl9uYW1lKSkKLQkJCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChtYXlfdXNlX3BhdHRlcm4pIHsKLQkJCWlmICghdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuKHBhdGhuYW1lLAotCQkJCQkJCSBtZW1iZXItPm1lbWJlcl9uYW1lKSkKLQkJCQljb250aW51ZTsKLQkJfSBlbHNlCi0JCQljb250aW51ZTsKLQkJbWF0Y2hlZCA9IHRydWU7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbWF0Y2hlZDsKLX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9yZWFscGF0aC5jIGIvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKaW5kZXggZDFiOTZmMC4uZWQ4Y2NkNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKQEAgLTEsMTMwICsxLDcxIEBACiAvKgogICogc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKICAqCi0gKiBHZXQgdGhlIGNhbm9uaWNhbGl6ZWQgYWJzb2x1dGUgcGF0aG5hbWVzLiBUaGUgYmFzaXMgZm9yIFRPTU9ZTy4KKyAqIFBhdGhuYW1lIGNhbGN1bGF0aW9uIGZ1bmN0aW9ucyBmb3IgVE9NT1lPLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA5ICBOVFQgREFUQSBDT1JQT1JBVElPTgotICoKLSAqIFZlcnNpb246IDIuMi4wICAgMjAwOS8wNC8wMQotICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwICBOVFQgREFUQSBDT1JQT1JBVElPTgogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCiAvKioKICAqIHRvbW95b19lbmNvZGU6IENvbnZlcnQgYmluYXJ5IHN0cmluZyB0byBhc2NpaSBzdHJpbmcuCiAgKgotICogQGJ1ZmZlcjogIEJ1ZmZlciBmb3IgQVNDSUkgc3RyaW5nLgotICogQGJ1ZmxlbjogIFNpemUgb2YgQGJ1ZmZlci4KLSAqIEBzdHI6ICAgICBCaW5hcnkgc3RyaW5nLgorICogQHN0cjogU3RyaW5nIGluIGJpbmFyeSBmb3JtYXQuCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gb3RoZXJ3aXNlLgorICogUmV0dXJucyBwb2ludGVyIHRvIEBzdHIgaW4gYXNjaWkgZm9ybWF0IG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyBremFsbG9jKCksIHNvIGNhbGxlciBtdXN0IGtmcmVlKCkgaWYgdGhpcyBmdW5jdGlvbgorICogZGlkbid0IHJldHVybiBOVUxMLgogICovCi1pbnQgdG9tb3lvX2VuY29kZShjaGFyICpidWZmZXIsIGludCBidWZsZW4sIGNvbnN0IGNoYXIgKnN0cikKK2NoYXIgKnRvbW95b19lbmNvZGUoY29uc3QgY2hhciAqc3RyKQogewotCXdoaWxlICgxKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgYyA9ICoodW5zaWduZWQgY2hhciAqKSBzdHIrKzsKKwlpbnQgbGVuID0gMDsKKwljb25zdCBjaGFyICpwID0gc3RyOworCWNoYXIgKmNwOworCWNoYXIgKmNwMDsKIAotCQlpZiAodG9tb3lvX2lzX3ZhbGlkKGMpKSB7Ci0JCQlpZiAoLS1idWZsZW4gPD0gMCkKLQkJCQlicmVhazsKLQkJCSpidWZmZXIrKyA9IChjaGFyKSBjOwotCQkJaWYgKGMgIT0gJ1xcJykKLQkJCQljb250aW51ZTsKLQkJCWlmICgtLWJ1ZmxlbiA8PSAwKQotCQkJCWJyZWFrOwotCQkJKmJ1ZmZlcisrID0gKGNoYXIpIGM7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIWMpIHsKLQkJCWlmICgtLWJ1ZmxlbiA8PSAwKQotCQkJCWJyZWFrOwotCQkJKmJ1ZmZlciA9ICdcMCc7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlidWZsZW4gLT0gNDsKLQkJaWYgKGJ1ZmxlbiA8PSAwKQotCQkJYnJlYWs7Ci0JCSpidWZmZXIrKyA9ICdcXCc7Ci0JCSpidWZmZXIrKyA9IChjID4+IDYpICsgJzAnOwotCQkqYnVmZmVyKysgPSAoKGMgPj4gMykgJiA3KSArICcwJzsKLQkJKmJ1ZmZlcisrID0gKGMgJiA3KSArICcwJzsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCXdoaWxlICgqcCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyIGMgPSAqcCsrOworCQlpZiAoYyA9PSAnXFwnKQorCQkJbGVuICs9IDI7CisJCWVsc2UgaWYgKGMgPiAnICcgJiYgYyA8IDEyNykKKwkJCWxlbisrOworCQllbHNlCisJCQlsZW4gKz0gNDsKIAl9Ci0JcmV0dXJuIC1FTk9NRU07Ci19CisJbGVuKys7CisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgYXBwZW5kaW5nICIvIi4gKi8KKwljcCA9IGt6YWxsb2MobGVuICsgMTAsIEdGUF9OT0ZTKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwljcDAgPSBjcDsKKwlwID0gc3RyOworCXdoaWxlICgqcCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyIGMgPSAqcCsrOwogCi0vKioKLSAqIHRvbW95b19yZWFscGF0aF9mcm9tX3BhdGgyIC0gUmV0dXJucyByZWFscGF0aCgzKSBvZiB0aGUgZ2l2ZW4gZGVudHJ5IGJ1dCBpZ25vcmVzIGNocm9vdCdlZCByb290LgotICoKLSAqIEBwYXRoOiAgICAgICAgUG9pbnRlciB0byAic3RydWN0IHBhdGgiLgotICogQG5ld25hbWU6ICAgICBQb2ludGVyIHRvIGJ1ZmZlciB0byByZXR1cm4gdmFsdWUgaW4uCi0gKiBAbmV3bmFtZV9sZW46IFNpemUgb2YgQG5ld25hbWUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KLSAqCi0gKiBJZiBkZW50cnkgaXMgYSBkaXJlY3RvcnksIHRyYWlsaW5nICcvJyBpcyBhcHBlbmRlZC4KLSAqIENoYXJhY3RlcnMgb3V0IG9mIDB4MjAgPCBjIDwgMHg3RiByYW5nZSBhcmUgY29udmVydGVkIHRvCi0gKiBcb29vIHN0eWxlIG9jdGFsIHN0cmluZy4KLSAqIENoYXJhY3RlciBcIGlzIGNvbnZlcnRlZCB0byBcXCBzdHJpbmcuCi0gKi8KLWludCB0b21veW9fcmVhbHBhdGhfZnJvbV9wYXRoMihzdHJ1Y3QgcGF0aCAqcGF0aCwgY2hhciAqbmV3bmFtZSwKLQkJCSAgICAgICBpbnQgbmV3bmFtZV9sZW4pCi17Ci0JaW50IGVycm9yID0gLUVOT01FTTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBwYXRoLT5kZW50cnk7Ci0JY2hhciAqc3A7Ci0KLQlpZiAoIWRlbnRyeSB8fCAhcGF0aC0+bW50IHx8ICFuZXduYW1lIHx8IG5ld25hbWVfbGVuIDw9IDIwNDgpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX2RuYW1lKSB7Ci0JCS8qIEZvciAic29ja2V0OltcJF0iIGFuZCAicGlwZTpbXCRdIi4gKi8KLQkJc3RhdGljIGNvbnN0IGludCBvZmZzZXQgPSAxNTM2OwotCQlzcCA9IGRlbnRyeS0+ZF9vcC0+ZF9kbmFtZShkZW50cnksIG5ld25hbWUgKyBvZmZzZXQsCi0JCQkJCSAgIG5ld25hbWVfbGVuIC0gb2Zmc2V0KTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgcGF0aCBuc19yb290ID0gey5tbnQgPSBOVUxMLCAuZGVudHJ5ID0gTlVMTH07Ci0KLQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCS8qIGdvIHRvIHdoYXRldmVyIG5hbWVzcGFjZSByb290IHdlIGFyZSB1bmRlciAqLwotCQlzcCA9IF9fZF9wYXRoKHBhdGgsICZuc19yb290LCBuZXduYW1lLCBuZXduYW1lX2xlbik7Ci0JCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCS8qIFByZXBlbmQgIi9wcm9jIiBwcmVmaXggaWYgdXNpbmcgaW50ZXJuYWwgcHJvYyB2ZnMgbW91bnQuICovCi0JCWlmICghSVNfRVJSKHNwKSAmJiAocGF0aC0+bW50LT5tbnRfZmxhZ3MgJiBNTlRfSU5URVJOQUwpICYmCi0JCSAgICAocGF0aC0+bW50LT5tbnRfc2ItPnNfbWFnaWMgPT0gUFJPQ19TVVBFUl9NQUdJQykpIHsKLQkJCXNwIC09IDU7Ci0JCQlpZiAoc3AgPj0gbmV3bmFtZSkKLQkJCQltZW1jcHkoc3AsICIvcHJvYyIsIDUpOwotCQkJZWxzZQotCQkJCXNwID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJKmNwKysgPSAnXFwnOworCQkJKmNwKysgPSAnXFwnOworCQl9IGVsc2UgaWYgKGMgPiAnICcgJiYgYyA8IDEyNykgeworCQkJKmNwKysgPSBjOworCQl9IGVsc2UgeworCQkJKmNwKysgPSAnXFwnOworCQkJKmNwKysgPSAoYyA+PiA2KSArICcwJzsKKwkJCSpjcCsrID0gKChjID4+IDMpICYgNykgKyAnMCc7CisJCQkqY3ArKyA9IChjICYgNykgKyAnMCc7CiAJCX0KIAl9Ci0JaWYgKElTX0VSUihzcCkpCi0JCWVycm9yID0gUFRSX0VSUihzcCk7Ci0JZWxzZQotCQllcnJvciA9IHRvbW95b19lbmNvZGUobmV3bmFtZSwgc3AgLSBuZXduYW1lLCBzcCk7Ci0JLyogQXBwZW5kIHRyYWlsaW5nICcvJyBpZiBkZW50cnkgaXMgYSBkaXJlY3RvcnkuICovCi0JaWYgKCFlcnJvciAmJiBkZW50cnktPmRfaW5vZGUgJiYgU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkKLQkgICAgJiYgKm5ld25hbWUpIHsKLQkJc3AgPSBuZXduYW1lICsgc3RybGVuKG5ld25hbWUpOwotCQlpZiAoKihzcCAtIDEpICE9ICcvJykgewotCQkJaWYgKHNwIDwgbmV3bmFtZSArIG5ld25hbWVfbGVuIC0gNCkgewotCQkJCSpzcCsrID0gJy8nOwotCQkJCSpzcCA9ICdcMCc7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yID0gLUVOT01FTTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoZXJyb3IpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInRvbW95b19yZWFscGF0aDogUGF0aG5hbWUgdG9vIGxvbmcuXG4iKTsKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIGNwMDsKIH0KIAogLyoqCkBAIC0xMzQsNDEgKzc1LDkwIEBACiAgKgogICogUmV0dXJucyB0aGUgcmVhbHBhdGggb2YgdGhlIGdpdmVuIEBwYXRoIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgogICoKKyAqIElmIGRlbnRyeSBpcyBhIGRpcmVjdG9yeSwgdHJhaWxpbmcgJy8nIGlzIGFwcGVuZGVkLgorICogQ2hhcmFjdGVycyBvdXQgb2YgMHgyMCA8IGMgPCAweDdGIHJhbmdlIGFyZSBjb252ZXJ0ZWQgdG8KKyAqIFxvb28gc3R5bGUgb2N0YWwgc3RyaW5nLgorICogQ2hhcmFjdGVyIFwgaXMgY29udmVydGVkIHRvIFxcIHN0cmluZy4KKyAqCiAgKiBUaGVzZSBmdW5jdGlvbnMgdXNlIGt6YWxsb2MoKSwgc28gdGhlIGNhbGxlciBtdXN0IGNhbGwga2ZyZWUoKQogICogaWYgdGhlc2UgZnVuY3Rpb25zIGRpZG4ndCByZXR1cm4gTlVMTC4KICAqLwogY2hhciAqdG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKLQljaGFyICpidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdG9tb3lvX3BhZ2VfYnVmZmVyKSwgR0ZQX05PRlMpOwotCi0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdG9tb3lvX3BhZ2VfYnVmZmVyKQotCQkgICAgIDw9IFRPTU9ZT19NQVhfUEFUSE5BTUVfTEVOIC0gMSk7Ci0JaWYgKCFidWYpCisJY2hhciAqYnVmID0gTlVMTDsKKwljaGFyICpuYW1lID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYnVmX2xlbiA9IFBBR0VfU0laRSAvIDI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gcGF0aC0+ZGVudHJ5OworCWJvb2wgaXNfZGlyOworCWlmICghZGVudHJ5KQogCQlyZXR1cm4gTlVMTDsKLQlpZiAodG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aDIocGF0aCwgYnVmLAotCQkJCSAgICAgICBUT01PWU9fTUFYX1BBVEhOQU1FX0xFTiAtIDEpID09IDApCi0JCXJldHVybiBidWY7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiB0b21veW9fcmVhbHBhdGggLSBHZXQgcmVhbHBhdGggb2YgYSBwYXRobmFtZS4KLSAqCi0gKiBAcGF0aG5hbWU6IFRoZSBwYXRobmFtZSB0byBzb2x2ZS4KLSAqCi0gKiBSZXR1cm5zIHRoZSByZWFscGF0aCBvZiBAcGF0aG5hbWUgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UuCi0gKi8KLWNoYXIgKnRvbW95b19yZWFscGF0aChjb25zdCBjaGFyICpwYXRobmFtZSkKLXsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwotCi0JaWYgKHBhdGhuYW1lICYmIGtlcm5fcGF0aChwYXRobmFtZSwgTE9PS1VQX0ZPTExPVywgJnBhdGgpID09IDApIHsKLQkJY2hhciAqYnVmID0gdG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aCgmcGF0aCk7Ci0JCXBhdGhfcHV0KCZwYXRoKTsKLQkJcmV0dXJuIGJ1ZjsKKwlpc19kaXIgPSBkZW50cnktPmRfaW5vZGUgJiYgU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHBhdGggbnNfcm9vdCA9IHsgLm1udCA9IE5VTEwsIC5kZW50cnkgPSBOVUxMIH07CisJCWNoYXIgKnBvczsKKwkJYnVmX2xlbiA8PD0gMTsKKwkJa2ZyZWUoYnVmKTsKKwkJYnVmID0ga21hbGxvYyhidWZfbGVuLCBHRlBfTk9GUyk7CisJCWlmICghYnVmKQorCQkJYnJlYWs7CisJCS8qIEdldCBiZXR0ZXIgbmFtZSBmb3Igc29ja2V0LiAqLworCQlpZiAoZGVudHJ5LT5kX3NiICYmIGRlbnRyeS0+ZF9zYi0+c19tYWdpYyA9PSBTT0NLRlNfTUFHSUMpIHsKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJCQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gaW5vZGUgPyBTT0NLRVRfSShpbm9kZSkgOiBOVUxMOworCQkJc3RydWN0IHNvY2sgKnNrID0gc29jayA/IHNvY2stPnNrIDogTlVMTDsKKwkJCWlmIChzaykgeworCQkJCXNucHJpbnRmKGJ1ZiwgYnVmX2xlbiAtIDEsICJzb2NrZXQ6W2ZhbWlseT0ldToiCisJCQkJCSAidHlwZT0ldTpwcm90b2NvbD0ldV0iLCBzay0+c2tfZmFtaWx5LAorCQkJCQkgc2stPnNrX3R5cGUsIHNrLT5za19wcm90b2NvbCk7CisJCQl9IGVsc2UgeworCQkJCXNucHJpbnRmKGJ1ZiwgYnVmX2xlbiAtIDEsICJzb2NrZXQ6W3Vua25vd25dIik7CisJCQl9CisJCQluYW1lID0gdG9tb3lvX2VuY29kZShidWYpOworCQkJYnJlYWs7CisJCX0KKwkJLyogRm9yICJzb2NrZXQ6W1wkXSIgYW5kICJwaXBlOltcJF0iLiAqLworCQlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9kbmFtZSkgeworCQkJcG9zID0gZGVudHJ5LT5kX29wLT5kX2RuYW1lKGRlbnRyeSwgYnVmLCBidWZfbGVuIC0gMSk7CisJCQlpZiAoSVNfRVJSKHBvcykpCisJCQkJY29udGludWU7CisJCQluYW1lID0gdG9tb3lvX2VuY29kZShwb3MpOworCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZmc21vdW50LCB3ZSBjYW4ndCBjYWxjdWxhdGUuICovCisJCWlmICghcGF0aC0+bW50KQorCQkJYnJlYWs7CisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkvKiBnbyB0byB3aGF0ZXZlciBuYW1lc3BhY2Ugcm9vdCB3ZSBhcmUgdW5kZXIgKi8KKwkJcG9zID0gX19kX3BhdGgocGF0aCwgJm5zX3Jvb3QsIGJ1ZiwgYnVmX2xlbik7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCS8qIFByZXBlbmQgIi9wcm9jIiBwcmVmaXggaWYgdXNpbmcgaW50ZXJuYWwgcHJvYyB2ZnMgbW91bnQuICovCisJCWlmICghSVNfRVJSKHBvcykgJiYgKHBhdGgtPm1udC0+bW50X2ZsYWdzICYgTU5UX0lOVEVSTkFMKSAmJgorCQkgICAgKHBhdGgtPm1udC0+bW50X3NiLT5zX21hZ2ljID09IFBST0NfU1VQRVJfTUFHSUMpKSB7CisJCQlwb3MgLT0gNTsKKwkJCWlmIChwb3MgPj0gYnVmKQorCQkJCW1lbWNweShwb3MsICIvcHJvYyIsIDUpOworCQkJZWxzZQorCQkJCXBvcyA9IEVSUl9QVFIoLUVOT01FTSk7CisJCX0KKwkJaWYgKElTX0VSUihwb3MpKQorCQkJY29udGludWU7CisJCW5hbWUgPSB0b21veW9fZW5jb2RlKHBvcyk7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gTlVMTDsKKwlrZnJlZShidWYpOworCWlmICghbmFtZSkKKwkJdG9tb3lvX3dhcm5fb29tKF9fZnVuY19fKTsKKwllbHNlIGlmIChpc19kaXIgJiYgKm5hbWUpIHsKKwkJLyogQXBwZW5kIHRyYWlsaW5nICcvJyBpZiBkZW50cnkgaXMgYSBkaXJlY3RvcnkuICovCisJCWNoYXIgKnBvcyA9IG5hbWUgKyBzdHJsZW4obmFtZSkgLSAxOworCQlpZiAoKnBvcyAhPSAnLycpCisJCQkvKgorCQkJICogVGhpcyBpcyBPSyBiZWNhdXNlIHRvbW95b19lbmNvZGUoKSByZXNlcnZlcyBzcGFjZQorCQkJICogZm9yIGFwcGVuZGluZyAiLyIuCisJCQkgKi8KKwkJCSorK3BvcyA9ICcvJzsKKwl9CisJcmV0dXJuIG5hbWU7CiB9CiAKIC8qKgpAQCAtMTg5LDE5MSArMTc5LDMgQEAKIAl9CiAJcmV0dXJuIE5VTEw7CiB9Ci0KLS8qIE1lbW9yeSBhbGxvY2F0ZWQgZm9yIG5vbi1zdHJpbmcgZGF0YS4gKi8KLXN0YXRpYyBhdG9taWNfdCB0b21veW9fcG9saWN5X21lbW9yeV9zaXplOwotLyogUXVvdGEgZm9yIGhvbGRpbmcgcG9saWN5LiAqLwotc3RhdGljIHVuc2lnbmVkIGludCB0b21veW9fcXVvdGFfZm9yX3BvbGljeTsKLQotLyoqCi0gKiB0b21veW9fbWVtb3J5X29rIC0gQ2hlY2sgbWVtb3J5IHF1b3RhLgotICoKLSAqIEBwdHI6IFBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeS4KLSAqCi0gKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBob2xkcyB0b21veW9fcG9saWN5X2xvY2suCi0gKiBNZW1vcnkgcG9pbnRlZCBieSBAcHRyIHdpbGwgYmUgemVyb2VkIG9uIHN1Y2Nlc3MuCi0gKi8KLWJvb2wgdG9tb3lvX21lbW9yeV9vayh2b2lkICpwdHIpCi17Ci0JaW50IGFsbG9jYXRlZF9sZW4gPSBwdHIgPyBrc2l6ZShwdHIpIDogMDsKLQlhdG9taWNfYWRkKGFsbG9jYXRlZF9sZW4sICZ0b21veW9fcG9saWN5X21lbW9yeV9zaXplKTsKLQlpZiAocHRyICYmICghdG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kgfHwKLQkJICAgIGF0b21pY19yZWFkKCZ0b21veW9fcG9saWN5X21lbW9yeV9zaXplKQotCQkgICAgPD0gdG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kpKSB7Ci0JCW1lbXNldChwdHIsIDAsIGFsbG9jYXRlZF9sZW4pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiRVJST1I6IE91dCBvZiBtZW1vcnkgIgotCSAgICAgICAiZm9yIHRvbW95b19hbGxvY19lbGVtZW50KCkuXG4iKTsKLQlpZiAoIXRvbW95b19wb2xpY3lfbG9hZGVkKQotCQlwYW5pYygiTUFDIEluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiB0b21veW9fY29tbWl0X29rIC0gQ2hlY2sgbWVtb3J5IHF1b3RhLgotICoKLSAqIEBkYXRhOiAgIERhdGEgdG8gY29weSBmcm9tLgotICogQHNpemU6ICAgU2l6ZSBpbiBieXRlLgotICoKLSAqIFJldHVybnMgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgotICovCi12b2lkICp0b21veW9fY29tbWl0X29rKHZvaWQgKmRhdGEsIGNvbnN0IHVuc2lnbmVkIGludCBzaXplKQotewotCXZvaWQgKnB0ciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX05PRlMpOwotCWlmICh0b21veW9fbWVtb3J5X29rKHB0cikpIHsKLQkJbWVtbW92ZShwdHIsIGRhdGEsIHNpemUpOwotCQltZW1zZXQoZGF0YSwgMCwgc2l6ZSk7Ci0JCXJldHVybiBwdHI7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHRvbW95b19tZW1vcnlfZnJlZSAtIEZyZWUgbWVtb3J5IGZvciBlbGVtZW50cy4KLSAqCi0gKiBAcHRyOiAgUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LgotICovCi12b2lkIHRvbW95b19tZW1vcnlfZnJlZSh2b2lkICpwdHIpCi17Ci0JYXRvbWljX3N1Yihrc2l6ZShwdHIpLCAmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSk7Ci0Ja2ZyZWUocHRyKTsKLX0KLQotLyoKLSAqIHRvbW95b19uYW1lX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBzdHJpbmcgZGF0YSB1c2VkIGJ5IFRPTU9ZTy4KLSAqIFNpbmNlIHNhbWUgc3RyaW5nIGRhdGEgaXMgbGlrZWx5IHVzZWQgZm9yIG11bHRpcGxlIHRpbWVzIChlLmcuCi0gKiAiL2xpYi9saWJjLTIuNS5zbyIpLCBUT01PWU8gc2hhcmVzIHN0cmluZyBkYXRhIGluIHRoZSBmb3JtIG9mCi0gKiAiY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKiIuCi0gKi8KLXN0cnVjdCBsaXN0X2hlYWQgdG9tb3lvX25hbWVfbGlzdFtUT01PWU9fTUFYX0hBU0hdOwotCi0vKioKLSAqIHRvbW95b19nZXRfbmFtZSAtIEFsbG9jYXRlIHBlcm1hbmVudCBtZW1vcnkgZm9yIHN0cmluZyBkYXRhLgotICoKLSAqIEBuYW1lOiBUaGUgc3RyaW5nIHRvIHN0b3JlIGludG8gdGhlIHBlcm1lcm5lbnQgbWVtb3J5LgotICoKLSAqIFJldHVybnMgcG9pbnRlciB0byAic3RydWN0IHRvbW95b19wYXRoX2luZm8iIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgotICovCi1jb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqdG9tb3lvX2dldF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHRvbW95b19uYW1lX2VudHJ5ICpwdHI7Ci0JdW5zaWduZWQgaW50IGhhc2g7Ci0JaW50IGxlbjsKLQlpbnQgYWxsb2NhdGVkX2xlbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwotCi0JaWYgKCFuYW1lKQotCQlyZXR1cm4gTlVMTDsKLQlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOwotCWhhc2ggPSBmdWxsX25hbWVfaGFzaCgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuYW1lLCBsZW4gLSAxKTsKLQloZWFkID0gJnRvbW95b19uYW1lX2xpc3RbaGFzaF9sb25nKGhhc2gsIFRPTU9ZT19IQVNIX0JJVFMpXTsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b21veW9fcG9saWN5X2xvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwgaGVhZCwgbGlzdCkgewotCQlpZiAoaGFzaCAhPSBwdHItPmVudHJ5Lmhhc2ggfHwgc3RyY21wKG5hbWUsIHB0ci0+ZW50cnkubmFtZSkpCi0JCQljb250aW51ZTsKLQkJYXRvbWljX2luYygmcHRyLT51c2Vycyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlwdHIgPSBremFsbG9jKHNpemVvZigqcHRyKSArIGxlbiwgR0ZQX05PRlMpOwotCWFsbG9jYXRlZF9sZW4gPSBwdHIgPyBrc2l6ZShwdHIpIDogMDsKLQlpZiAoIXB0ciB8fCAodG9tb3lvX3F1b3RhX2Zvcl9wb2xpY3kgJiYKLQkJICAgICBhdG9taWNfcmVhZCgmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSkgKyBhbGxvY2F0ZWRfbGVuCi0JCSAgICAgPiB0b21veW9fcXVvdGFfZm9yX3BvbGljeSkpIHsKLQkJa2ZyZWUocHRyKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVJST1I6IE91dCBvZiBtZW1vcnkgIgotCQkgICAgICAgImZvciB0b21veW9fZ2V0X25hbWUoKS5cbiIpOwotCQlpZiAoIXRvbW95b19wb2xpY3lfbG9hZGVkKQotCQkJcGFuaWMoIk1BQyBJbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKLQkJcHRyID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQotCWF0b21pY19hZGQoYWxsb2NhdGVkX2xlbiwgJnRvbW95b19wb2xpY3lfbWVtb3J5X3NpemUpOwotCXB0ci0+ZW50cnkubmFtZSA9ICgoY2hhciAqKSBwdHIpICsgc2l6ZW9mKCpwdHIpOwotCW1lbW1vdmUoKGNoYXIgKikgcHRyLT5lbnRyeS5uYW1lLCBuYW1lLCBsZW4pOwotCWF0b21pY19zZXQoJnB0ci0+dXNlcnMsIDEpOwotCXRvbW95b19maWxsX3BhdGhfaW5mbygmcHRyLT5lbnRyeSk7Ci0JbGlzdF9hZGRfdGFpbCgmcHRyLT5saXN0LCBoZWFkKTsKLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ0b21veW9fcG9saWN5X2xvY2spOwotCXJldHVybiBwdHIgPyAmcHRyLT5lbnRyeSA6IE5VTEw7Ci19Ci0KLS8qKgotICogdG9tb3lvX3JlYWxwYXRoX2luaXQgLSBJbml0aWFsaXplIHJlYWxwYXRoIHJlbGF0ZWQgY29kZS4KLSAqLwotdm9pZCBfX2luaXQgdG9tb3lvX3JlYWxwYXRoX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCUJVSUxEX0JVR19PTihUT01PWU9fTUFYX1BBVEhOQU1FX0xFTiA+IFBBVEhfTUFYKTsKLQlmb3IgKGkgPSAwOyBpIDwgVE9NT1lPX01BWF9IQVNIOyBpKyspCi0JCUlOSVRfTElTVF9IRUFEKCZ0b21veW9fbmFtZV9saXN0W2ldKTsKLQlJTklUX0xJU1RfSEVBRCgmdG9tb3lvX2tlcm5lbF9kb21haW4uYWNsX2luZm9fbGlzdCk7Ci0JdG9tb3lvX2tlcm5lbF9kb21haW4uZG9tYWlubmFtZSA9IHRvbW95b19nZXRfbmFtZShUT01PWU9fUk9PVF9OQU1FKTsKLQkvKgotCSAqIHRvbW95b19yZWFkX2xvY2soKSBpcyBub3QgbmVlZGVkIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcwotCSAqIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0ICJkZWxldGUiIHJlcXVlc3QuCi0JICovCi0JbGlzdF9hZGRfdGFpbF9yY3UoJnRvbW95b19rZXJuZWxfZG9tYWluLmxpc3QsICZ0b21veW9fZG9tYWluX2xpc3QpOwotCWlmICh0b21veW9fZmluZF9kb21haW4oVE9NT1lPX1JPT1RfTkFNRSkgIT0gJnRvbW95b19rZXJuZWxfZG9tYWluKQotCQlwYW5pYygiQ2FuJ3QgcmVnaXN0ZXIgdG9tb3lvX2tlcm5lbF9kb21haW4iKTsKLX0KLQotLyoqCi0gKiB0b21veW9fcmVhZF9tZW1vcnlfY291bnRlciAtIENoZWNrIGZvciBtZW1vcnkgdXNhZ2UgaW4gYnl0ZXMuCi0gKgotICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KLSAqCi0gKiBSZXR1cm5zIG1lbW9yeSB1c2FnZS4KLSAqLwotaW50IHRvbW95b19yZWFkX21lbW9yeV9jb3VudGVyKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQotewotCWlmICghaGVhZC0+cmVhZF9lb2YpIHsKLQkJY29uc3QgdW5zaWduZWQgaW50IHBvbGljeQotCQkJPSBhdG9taWNfcmVhZCgmdG9tb3lvX3BvbGljeV9tZW1vcnlfc2l6ZSk7Ci0JCWNoYXIgYnVmZmVyWzY0XTsKLQotCQltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7Ci0JCWlmICh0b21veW9fcXVvdGFfZm9yX3BvbGljeSkKLQkJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxLAotCQkJCSAiICAgKFF1b3RhOiAlMTB1KSIsCi0JCQkJIHRvbW95b19xdW90YV9mb3JfcG9saWN5KTsKLQkJZWxzZQotCQkJYnVmZmVyWzBdID0gJ1wwJzsKLQkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiUG9saWN5OiAgJTEwdSVzXG4iLCBwb2xpY3ksIGJ1ZmZlcik7Ci0JCXRvbW95b19pb19wcmludGYoaGVhZCwgIlRvdGFsOiAgICUxMHVcbiIsIHBvbGljeSk7Ci0JCWhlYWQtPnJlYWRfZW9mID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdG9tb3lvX3dyaXRlX21lbW9yeV9xdW90YSAtIFNldCBtZW1vcnkgcXVvdGEuCi0gKgotICogQGhlYWQ6IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9faW9fYnVmZmVyIi4KLSAqCi0gKiBSZXR1cm5zIDAuCi0gKi8KLWludCB0b21veW9fd3JpdGVfbWVtb3J5X3F1b3RhKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICpoZWFkKQotewotCWNoYXIgKmRhdGEgPSBoZWFkLT53cml0ZV9idWY7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0KLQlpZiAoc3NjYW5mKGRhdGEsICJQb2xpY3k6ICV1IiwgJnNpemUpID09IDEpCi0JCXRvbW95b19xdW90YV9mb3JfcG9saWN5ID0gc2l6ZTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9zZWN1cml0eWZzX2lmLmMgYi9zZWN1cml0eS90b21veW8vc2VjdXJpdHlmc19pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2Q1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS90b21veW8vc2VjdXJpdHlmc19pZi5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jCisgKgorICogU2VjdXJpdHlmcyBpbnRlcmZhY2UgZm9yIFRPTU9ZTy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCAgTlRUIERBVEEgQ09SUE9SQVRJT04KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworLyoqCisgKiB0b21veW9fb3BlbiAtIG9wZW4oKSBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCisgKgorICogQGlub2RlOiBQb2ludGVyIHRvICJzdHJ1Y3QgaW5vZGUiLgorICogQGZpbGU6ICBQb2ludGVyIHRvICJzdHJ1Y3QgZmlsZSIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0b21veW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljb25zdCBpbnQga2V5ID0gKCh1OCAqKSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUpCisJCS0gKCh1OCAqKSBOVUxMKTsKKwlyZXR1cm4gdG9tb3lvX29wZW5fY29udHJvbChrZXksIGZpbGUpOworfQorCisvKioKKyAqIHRvbW95b19yZWxlYXNlIC0gY2xvc2UoKSBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCisgKgorICogQGlub2RlOiBQb2ludGVyIHRvICJzdHJ1Y3QgaW5vZGUiLgorICogQGZpbGU6ICBQb2ludGVyIHRvICJzdHJ1Y3QgZmlsZSIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0b21veW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gdG9tb3lvX2Nsb3NlX2NvbnRyb2woZmlsZSk7Cit9CisKKy8qKgorICogdG9tb3lvX3BvbGwgLSBwb2xsKCkgZm9yIC9wcm9jL2Njcy8gaW50ZXJmYWNlLgorICoKKyAqIEBmaWxlOiBQb2ludGVyIHRvICJzdHJ1Y3QgZmlsZSIuCisgKiBAd2FpdDogUG9pbnRlciB0byAicG9sbF90YWJsZSIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB0b21veW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlyZXR1cm4gdG9tb3lvX3BvbGxfY29udHJvbChmaWxlLCB3YWl0KTsKK30KKworLyoqCisgKiB0b21veW9fcmVhZCAtIHJlYWQoKSBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCisgKgorICogQGZpbGU6ICBQb2ludGVyIHRvICJzdHJ1Y3QgZmlsZSIuCisgKiBAYnVmOiAgIFBvaW50ZXIgdG8gYnVmZmVyLgorICogQGNvdW50OiBTaXplIG9mIEBidWYuCisgKiBAcHBvczogIFVudXNlZC4KKyAqCisgKiBSZXR1cm5zIGJ5dGVzIHJlYWQgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3NpemVfdCB0b21veW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXJldHVybiB0b21veW9fcmVhZF9jb250cm9sKGZpbGUsIGJ1ZiwgY291bnQpOworfQorCisvKioKKyAqIHRvbW95b193cml0ZSAtIHdyaXRlKCkgZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgorICoKKyAqIEBmaWxlOiAgUG9pbnRlciB0byAic3RydWN0IGZpbGUiLgorICogQGJ1ZjogICBQb2ludGVyIHRvIGJ1ZmZlci4KKyAqIEBjb3VudDogU2l6ZSBvZiBAYnVmLgorICogQHBwb3M6ICBVbnVzZWQuCisgKgorICogUmV0dXJucyBAY291bnQgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3NpemVfdCB0b21veW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHRvbW95b193cml0ZV9jb250cm9sKGZpbGUsIGJ1ZiwgY291bnQpOworfQorCisvKgorICogdG9tb3lvX29wZXJhdGlvbnMgaXMgYSAic3RydWN0IGZpbGVfb3BlcmF0aW9ucyIgd2hpY2ggaXMgdXNlZCBmb3IgaGFuZGxpbmcKKyAqIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgorICoKKyAqIFNvbWUgZmlsZXMgdW5kZXIgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBkaXJlY3RvcnkgYWNjZXB0IG9wZW4oT19SRFdSKS4KKyAqIFNlZSB0b21veW9faW9fYnVmZmVyIGZvciBpbnRlcm5hbHMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRvbW95b19vcGVyYXRpb25zID0geworCS5vcGVuICAgID0gdG9tb3lvX29wZW4sCisJLnJlbGVhc2UgPSB0b21veW9fcmVsZWFzZSwKKwkucG9sbCAgICA9IHRvbW95b19wb2xsLAorCS5yZWFkICAgID0gdG9tb3lvX3JlYWQsCisJLndyaXRlICAgPSB0b21veW9fd3JpdGUsCisJLmxsc2VlayAgPSBub29wX2xsc2VlaywKK307CisKKy8qKgorICogdG9tb3lvX2NyZWF0ZV9lbnRyeSAtIENyZWF0ZSBpbnRlcmZhY2UgZmlsZXMgdW5kZXIgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBkaXJlY3RvcnkuCisgKgorICogQG5hbWU6ICAgVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBmaWxlLgorICogQG1vZGU6ICAgVGhlIHBlcm1pc3Npb24gb2YgdGhlIGludGVyZmFjZSBmaWxlLgorICogQHBhcmVudDogVGhlIHBhcmVudCBkaXJlY3RvcnkuCisgKiBAa2V5OiAgICBUeXBlIG9mIGludGVyZmFjZS4KKyAqCisgKiBSZXR1cm5zIG5vdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB0b21veW9fY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IG1vZGVfdCBtb2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNvbnN0IHU4IGtleSkKK3sKKwlzZWN1cml0eWZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgKCh1OCAqKSBOVUxMKSArIGtleSwKKwkJCSAgICAgICAmdG9tb3lvX29wZXJhdGlvbnMpOworfQorCisvKioKKyAqIHRvbW95b19pbml0ZXJmYWNlX2luaXQgLSBJbml0aWFsaXplIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLgorICoKKyAqIFJldHVybnMgMC4KKyAqLworc3RhdGljIGludCBfX2luaXQgdG9tb3lvX2luaXRlcmZhY2VfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKnRvbW95b19kaXI7CisKKwkvKiBEb24ndCBjcmVhdGUgc2VjdXJpdHlmcyBlbnRyaWVzIHVubGVzcyByZWdpc3RlcmVkLiAqLworCWlmIChjdXJyZW50X2NyZWQoKS0+c2VjdXJpdHkgIT0gJnRvbW95b19rZXJuZWxfZG9tYWluKQorCQlyZXR1cm4gMDsKKworCXRvbW95b19kaXIgPSBzZWN1cml0eWZzX2NyZWF0ZV9kaXIoInRvbW95byIsIE5VTEwpOworCXRvbW95b19jcmVhdGVfZW50cnkoInF1ZXJ5IiwgICAgICAgICAgICAwNjAwLCB0b21veW9fZGlyLAorCQkJICAgIFRPTU9ZT19RVUVSWSk7CisJdG9tb3lvX2NyZWF0ZV9lbnRyeSgiZG9tYWluX3BvbGljeSIsICAgIDA2MDAsIHRvbW95b19kaXIsCisJCQkgICAgVE9NT1lPX0RPTUFJTlBPTElDWSk7CisJdG9tb3lvX2NyZWF0ZV9lbnRyeSgiZXhjZXB0aW9uX3BvbGljeSIsIDA2MDAsIHRvbW95b19kaXIsCisJCQkgICAgVE9NT1lPX0VYQ0VQVElPTlBPTElDWSk7CisJdG9tb3lvX2NyZWF0ZV9lbnRyeSgic2VsZl9kb21haW4iLCAgICAgIDA0MDAsIHRvbW95b19kaXIsCisJCQkgICAgVE9NT1lPX1NFTEZET01BSU4pOworCXRvbW95b19jcmVhdGVfZW50cnkoIi5kb21haW5fc3RhdHVzIiwgICAwNjAwLCB0b21veW9fZGlyLAorCQkJICAgIFRPTU9ZT19ET01BSU5fU1RBVFVTKTsKKwl0b21veW9fY3JlYXRlX2VudHJ5KCIucHJvY2Vzc19zdGF0dXMiLCAgMDYwMCwgdG9tb3lvX2RpciwKKwkJCSAgICBUT01PWU9fUFJPQ0VTU19TVEFUVVMpOworCXRvbW95b19jcmVhdGVfZW50cnkoIm1lbWluZm8iLCAgICAgICAgICAwNjAwLCB0b21veW9fZGlyLAorCQkJICAgIFRPTU9ZT19NRU1JTkZPKTsKKwl0b21veW9fY3JlYXRlX2VudHJ5KCJwcm9maWxlIiwgICAgICAgICAgMDYwMCwgdG9tb3lvX2RpciwKKwkJCSAgICBUT01PWU9fUFJPRklMRSk7CisJdG9tb3lvX2NyZWF0ZV9lbnRyeSgibWFuYWdlciIsICAgICAgICAgIDA2MDAsIHRvbW95b19kaXIsCisJCQkgICAgVE9NT1lPX01BTkFHRVIpOworCXRvbW95b19jcmVhdGVfZW50cnkoInZlcnNpb24iLCAgICAgICAgICAwNDAwLCB0b21veW9fZGlyLAorCQkJICAgIFRPTU9ZT19WRVJTSU9OKTsKKwlyZXR1cm4gMDsKK30KKworZnNfaW5pdGNhbGwodG9tb3lvX2luaXRlcmZhY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vdG9tb3lvLmMgYi9zZWN1cml0eS90b21veW8vdG9tb3lvLmMKaW5kZXggZGVkZDk3ZC4uOTVkM2Y5NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5jCisrKyBiL3NlY3VyaXR5L3RvbW95by90b21veW8uYwpAQCAtMywxMCArMyw3IEBACiAgKgogICogTFNNIGhvb2tzIGZvciBUT01PWU8gTGludXguCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkgIE5UVCBEQVRBIENPUlBPUkFUSU9OCi0gKgotICogVmVyc2lvbjogMi4yLjAgICAyMDA5LzA0LzAxCi0gKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgIE5UVCBEQVRBIENPUlBPUkFUSU9OCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CkBAIC05Niw4ICs5Myw3IEBACiAJcmV0dXJuIHRvbW95b19jaGVja19vcGVuX3Blcm1pc3Npb24oZG9tYWluLCAmYnBybS0+ZmlsZS0+Zl9wYXRoLCBPX1JET05MWSk7CiB9CiAKLXN0YXRpYyBpbnQgdG9tb3lvX3BhdGhfdHJ1bmNhdGUoc3RydWN0IHBhdGggKnBhdGgsIGxvZmZfdCBsZW5ndGgsCi0JCQkJdW5zaWduZWQgaW50IHRpbWVfYXR0cnMpCitzdGF0aWMgaW50IHRvbW95b19wYXRoX3RydW5jYXRlKHN0cnVjdCBwYXRoICpwYXRoKQogewogCXJldHVybiB0b21veW9fcGF0aF9wZXJtKFRPTU9ZT19UWVBFX1RSVU5DQVRFLCBwYXRoKTsKIH0KQEAgLTExMiw3ICsxMDgsOCBAQAogCQkJICAgICBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgcGF0aCBwYXRoID0geyBwYXJlbnQtPm1udCwgZGVudHJ5IH07Ci0JcmV0dXJuIHRvbW95b19wYXRoX3Blcm0oVE9NT1lPX1RZUEVfTUtESVIsICZwYXRoKTsKKwlyZXR1cm4gdG9tb3lvX3BhdGhfbnVtYmVyX3Blcm0oVE9NT1lPX1RZUEVfTUtESVIsICZwYXRoLAorCQkJCSAgICAgICBtb2RlICYgU19JQUxMVUdPKTsKIH0KIAogc3RhdGljIGludCB0b21veW9fcGF0aF9ybWRpcihzdHJ1Y3QgcGF0aCAqcGFyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCkBAIC0xMzMsNiArMTMwLDcgQEAKIHsKIAlzdHJ1Y3QgcGF0aCBwYXRoID0geyBwYXJlbnQtPm1udCwgZGVudHJ5IH07CiAJaW50IHR5cGUgPSBUT01PWU9fVFlQRV9DUkVBVEU7CisJY29uc3QgdW5zaWduZWQgaW50IHBlcm0gPSBtb2RlICYgU19JQUxMVUdPOwogCiAJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CiAJY2FzZSBTX0lGQ0hSOgpAQCAtMTQxLDYgKzEzOSwxMiBAQAogCWNhc2UgU19JRkJMSzoKIAkJdHlwZSA9IFRPTU9ZT19UWVBFX01LQkxPQ0s7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gbm9fZGV2OworCX0KKwlyZXR1cm4gdG9tb3lvX21rZGV2X3Blcm0odHlwZSwgJnBhdGgsIHBlcm0sIGRldik7Cisgbm9fZGV2OgorCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCWNhc2UgU19JRklGTzoKIAkJdHlwZSA9IFRPTU9ZT19UWVBFX01LRklGTzsKIAkJYnJlYWs7CkBAIC0xNDgsNyArMTUyLDcgQEAKIAkJdHlwZSA9IFRPTU9ZT19UWVBFX01LU09DSzsKIAkJYnJlYWs7CiAJfQotCXJldHVybiB0b21veW9fcGF0aF9wZXJtKHR5cGUsICZwYXRoKTsKKwlyZXR1cm4gdG9tb3lvX3BhdGhfbnVtYmVyX3Blcm0odHlwZSwgJnBhdGgsIHBlcm0pOwogfQogCiBzdGF0aWMgaW50IHRvbW95b19wYXRoX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IHBhdGggKm5ld19kaXIsCkBAIC0xNzMsNyArMTc3LDcgQEAKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaWYgKGNtZCA9PSBGX1NFVEZMICYmICgoYXJnIF4gZmlsZS0+Zl9mbGFncykgJiBPX0FQUEVORCkpCi0JCXJldHVybiB0b21veW9fY2hlY2tfcmV3cml0ZV9wZXJtaXNzaW9uKGZpbGUpOworCQlyZXR1cm4gdG9tb3lvX3BhdGhfcGVybShUT01PWU9fVFlQRV9SRVdSSVRFLCAmZmlsZS0+Zl9wYXRoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg5LDIzICsxOTMsMjQgQEAKIHN0YXRpYyBpbnQgdG9tb3lvX2ZpbGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXJldHVybiB0b21veW9fcGF0aF9wZXJtKFRPTU9ZT19UWVBFX0lPQ1RMLCAmZmlsZS0+Zl9wYXRoKTsKKwlyZXR1cm4gdG9tb3lvX3BhdGhfbnVtYmVyX3Blcm0oVE9NT1lPX1RZUEVfSU9DVEwsICZmaWxlLT5mX3BhdGgsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgdG9tb3lvX3BhdGhfY2htb2Qoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKIAkJCSAgICAgbW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IHBhdGggcGF0aCA9IHsgbW50LCBkZW50cnkgfTsKLQlyZXR1cm4gdG9tb3lvX3BhdGhfcGVybShUT01PWU9fVFlQRV9DSE1PRCwgJnBhdGgpOworCXJldHVybiB0b21veW9fcGF0aF9udW1iZXJfcGVybShUT01PWU9fVFlQRV9DSE1PRCwgJnBhdGgsCisJCQkJICAgICAgIG1vZGUgJiBTX0lBTExVR08pOwogfQogCiBzdGF0aWMgaW50IHRvbW95b19wYXRoX2Nob3duKHN0cnVjdCBwYXRoICpwYXRoLCB1aWRfdCB1aWQsIGdpZF90IGdpZCkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCWlmICh1aWQgIT0gKHVpZF90KSAtMSkKLQkJZXJyb3IgPSB0b21veW9fcGF0aF9wZXJtKFRPTU9ZT19UWVBFX0NIT1dOLCBwYXRoKTsKKwkJZXJyb3IgPSB0b21veW9fcGF0aF9udW1iZXJfcGVybShUT01PWU9fVFlQRV9DSE9XTiwgcGF0aCwgdWlkKTsKIAlpZiAoIWVycm9yICYmIGdpZCAhPSAoZ2lkX3QpIC0xKQotCQllcnJvciA9IHRvbW95b19wYXRoX3Blcm0oVE9NT1lPX1RZUEVfQ0hHUlAsIHBhdGgpOworCQllcnJvciA9IHRvbW95b19wYXRoX251bWJlcl9wZXJtKFRPTU9ZT19UWVBFX0NIR1JQLCBwYXRoLCBnaWQpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjE3LDcgKzIyMiw3IEBACiBzdGF0aWMgaW50IHRvbW95b19zYl9tb3VudChjaGFyICpkZXZfbmFtZSwgc3RydWN0IHBhdGggKnBhdGgsCiAJCQkgICBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpkYXRhKQogewotCXJldHVybiB0b21veW9fcGF0aF9wZXJtKFRPTU9ZT19UWVBFX01PVU5ULCBwYXRoKTsKKwlyZXR1cm4gdG9tb3lvX21vdW50X3Blcm1pc3Npb24oZGV2X25hbWUsIHBhdGgsIHR5cGUsIGZsYWdzLCBkYXRhKTsKIH0KIAogc3RhdGljIGludCB0b21veW9fc2JfdW1vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBpbnQgZmxhZ3MpCkBAIC0yNzcsNyArMjgyLDcgQEAKIAkJcGFuaWMoIkZhaWx1cmUgcmVnaXN0ZXJpbmcgVE9NT1lPIExpbnV4Iik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiVE9NT1lPIExpbnV4IGluaXRpYWxpemVkXG4iKTsKIAljcmVkLT5zZWN1cml0eSA9ICZ0b21veW9fa2VybmVsX2RvbWFpbjsKLQl0b21veW9fcmVhbHBhdGhfaW5pdCgpOworCXRvbW95b19tbV9pbml0KCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by91dGlsLmMgYi9zZWN1cml0eS90b21veW8vdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmMxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS90b21veW8vdXRpbC5jCkBAIC0wLDAgKzEsOTYzIEBACisvKgorICogc2VjdXJpdHkvdG9tb3lvL3V0aWwuYworICoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBUT01PWU8uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgIE5UVCBEQVRBIENPUlBPUkFUSU9OCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworLyogTG9jayBmb3IgcHJvdGVjdGluZyBwb2xpY3kuICovCitERUZJTkVfTVVURVgodG9tb3lvX3BvbGljeV9sb2NrKTsKKworLyogSGFzIC9zYmluL2luaXQgc3RhcnRlZD8gKi8KK2Jvb2wgdG9tb3lvX3BvbGljeV9sb2FkZWQ7CisKKy8qKgorICogdG9tb3lvX3BhcnNlX3Vsb25nIC0gUGFyc2UgYW4gInVuc2lnbmVkIGxvbmciIHZhbHVlLgorICoKKyAqIEByZXN1bHQ6IFBvaW50ZXIgdG8gInVuc2lnbmVkIGxvbmciLgorICogQHN0cjogICAgUG9pbnRlciB0byBzdHJpbmcgdG8gcGFyc2UuCisgKgorICogUmV0dXJucyB2YWx1ZSB0eXBlIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgorICoKKyAqIFRoZSBAc3JjIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgdmFsdWUKKyAqIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyB1OCB0b21veW9fcGFyc2VfdWxvbmcodW5zaWduZWQgbG9uZyAqcmVzdWx0LCBjaGFyICoqc3RyKQoreworCWNvbnN0IGNoYXIgKmNwID0gKnN0cjsKKwljaGFyICplcDsKKwlpbnQgYmFzZSA9IDEwOworCWlmICgqY3AgPT0gJzAnKSB7CisJCWNoYXIgYyA9ICooY3AgKyAxKTsKKwkJaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSB7CisJCQliYXNlID0gMTY7CisJCQljcCArPSAyOworCQl9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzcnKSB7CisJCQliYXNlID0gODsKKwkJCWNwKys7CisJCX0KKwl9CisJKnJlc3VsdCA9IHNpbXBsZV9zdHJ0b3VsKGNwLCAmZXAsIGJhc2UpOworCWlmIChjcCA9PSBlcCkKKwkJcmV0dXJuIDA7CisJKnN0ciA9IGVwOworCXN3aXRjaCAoYmFzZSkgeworCWNhc2UgMTY6CisJCXJldHVybiBUT01PWU9fVkFMVUVfVFlQRV9IRVhBREVDSU1BTDsKKwljYXNlIDg6CisJCXJldHVybiBUT01PWU9fVkFMVUVfVFlQRV9PQ1RBTDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gVE9NT1lPX1ZBTFVFX1RZUEVfREVDSU1BTDsKKwl9Cit9CisKKy8qKgorICogdG9tb3lvX3ByaW50X3Vsb25nIC0gUHJpbnQgYW4gInVuc2lnbmVkIGxvbmciIHZhbHVlLgorICoKKyAqIEBidWZmZXI6ICAgICBQb2ludGVyIHRvIGJ1ZmZlci4KKyAqIEBidWZmZXJfbGVuOiBTaXplIG9mIEBidWZmZXIuCisgKiBAdmFsdWU6ICAgICAgQW4gInVuc2lnbmVkIGxvbmciIHZhbHVlLgorICogQHR5cGU6ICAgICAgIFR5cGUgb2YgQHZhbHVlLgorICoKKyAqIFJldHVybnMgbm90aGluZy4KKyAqLwordm9pZCB0b21veW9fcHJpbnRfdWxvbmcoY2hhciAqYnVmZmVyLCBjb25zdCBpbnQgYnVmZmVyX2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgdmFsdWUsIGNvbnN0IHU4IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gVE9NT1lPX1ZBTFVFX1RZUEVfREVDSU1BTCkKKwkJc25wcmludGYoYnVmZmVyLCBidWZmZXJfbGVuLCAiJWx1IiwgdmFsdWUpOworCWVsc2UgaWYgKHR5cGUgPT0gVE9NT1lPX1ZBTFVFX1RZUEVfT0NUQUwpCisJCXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX2xlbiwgIjAlbG8iLCB2YWx1ZSk7CisJZWxzZSBpZiAodHlwZSA9PSBUT01PWU9fVkFMVUVfVFlQRV9IRVhBREVDSU1BTCkKKwkJc25wcmludGYoYnVmZmVyLCBidWZmZXJfbGVuLCAiMHglbFgiLCB2YWx1ZSk7CisJZWxzZQorCQlzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9sZW4sICJ0eXBlKCV1KSIsIHR5cGUpOworfQorCisvKioKKyAqIHRvbW95b19wYXJzZV9uYW1lX3VuaW9uIC0gUGFyc2UgYSB0b21veW9fbmFtZV91bmlvbi4KKyAqCisgKiBAZmlsZW5hbWU6IE5hbWUgb3IgbmFtZSBncm91cC4KKyAqIEBwdHI6ICAgICAgUG9pbnRlciB0byAic3RydWN0IHRvbW95b19uYW1lX3VuaW9uIi4KKyAqCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIHRvbW95b19wYXJzZV9uYW1lX3VuaW9uKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJICAgICBzdHJ1Y3QgdG9tb3lvX25hbWVfdW5pb24gKnB0cikKK3sKKwlpZiAoIXRvbW95b19jb3JyZWN0X3dvcmQoZmlsZW5hbWUpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGZpbGVuYW1lWzBdID09ICdAJykgeworCQlwdHItPmdyb3VwID0gdG9tb3lvX2dldF9ncm91cChmaWxlbmFtZSArIDEsIFRPTU9ZT19QQVRIX0dST1VQKTsKKwkJcHRyLT5pc19ncm91cCA9IHRydWU7CisJCXJldHVybiBwdHItPmdyb3VwICE9IE5VTEw7CisJfQorCXB0ci0+ZmlsZW5hbWUgPSB0b21veW9fZ2V0X25hbWUoZmlsZW5hbWUpOworCXB0ci0+aXNfZ3JvdXAgPSBmYWxzZTsKKwlyZXR1cm4gcHRyLT5maWxlbmFtZSAhPSBOVUxMOworfQorCisvKioKKyAqIHRvbW95b19wYXJzZV9udW1iZXJfdW5pb24gLSBQYXJzZSBhIHRvbW95b19udW1iZXJfdW5pb24uCisgKgorICogQGRhdGE6IE51bWJlciBvciBudW1iZXIgcmFuZ2Ugb3IgbnVtYmVyIGdyb3VwLgorICogQHB0cjogIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fbnVtYmVyX3VuaW9uIi4KKyAqCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIHRvbW95b19wYXJzZV9udW1iZXJfdW5pb24oY2hhciAqZGF0YSwgc3RydWN0IHRvbW95b19udW1iZXJfdW5pb24gKm51bSkKK3sKKwl1OCB0eXBlOworCXVuc2lnbmVkIGxvbmcgdjsKKwltZW1zZXQobnVtLCAwLCBzaXplb2YoKm51bSkpOworCWlmIChkYXRhWzBdID09ICdAJykgeworCQlpZiAoIXRvbW95b19jb3JyZWN0X3dvcmQoZGF0YSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCW51bS0+Z3JvdXAgPSB0b21veW9fZ2V0X2dyb3VwKGRhdGEgKyAxLCBUT01PWU9fTlVNQkVSX0dST1VQKTsKKwkJbnVtLT5pc19ncm91cCA9IHRydWU7CisJCXJldHVybiBudW0tPmdyb3VwICE9IE5VTEw7CisJfQorCXR5cGUgPSB0b21veW9fcGFyc2VfdWxvbmcoJnYsICZkYXRhKTsKKwlpZiAoIXR5cGUpCisJCXJldHVybiBmYWxzZTsKKwludW0tPnZhbHVlc1swXSA9IHY7CisJbnVtLT5taW5fdHlwZSA9IHR5cGU7CisJaWYgKCEqZGF0YSkgeworCQludW0tPnZhbHVlc1sxXSA9IHY7CisJCW51bS0+bWF4X3R5cGUgPSB0eXBlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKCpkYXRhKysgIT0gJy0nKQorCQlyZXR1cm4gZmFsc2U7CisJdHlwZSA9IHRvbW95b19wYXJzZV91bG9uZygmdiwgJmRhdGEpOworCWlmICghdHlwZSB8fCAqZGF0YSkKKwkJcmV0dXJuIGZhbHNlOworCW51bS0+dmFsdWVzWzFdID0gdjsKKwludW0tPm1heF90eXBlID0gdHlwZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiB0b21veW9fYnl0ZV9yYW5nZSAtIENoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBhIFxvb28gc3R5bGUgb2N0YWwgdmFsdWUuCisgKgorICogQHN0cjogUG9pbnRlciB0byB0aGUgc3RyaW5nLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAc3RyIGlzIGEgXG9vbyBzdHlsZSBvY3RhbCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICoKKyAqIFRPTU9ZTyB1c2VzIFxvb28gc3R5bGUgcmVwcmVzZW50YXRpb24gZm9yIDB4MDEgLSAweDIwIGFuZCAweDdGIC0gMHhGRi4KKyAqIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhhdCBcb29vIGlzIGluIHZhbGlkIHJhbmdlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdG9tb3lvX2J5dGVfcmFuZ2UoY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiAqc3RyID49ICcwJyAmJiAqc3RyKysgPD0gJzMnICYmCisJCSpzdHIgPj0gJzAnICYmICpzdHIrKyA8PSAnNycgJiYKKwkJKnN0ciA+PSAnMCcgJiYgKnN0ciA8PSAnNyc7Cit9CisKKy8qKgorICogdG9tb3lvX2FscGhhYmV0X2NoYXIgLSBDaGVjayB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYW4gYWxwaGFiZXQuCisgKgorICogQGM6IFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogUmV0dXJucyB0cnVlIGlmIEBjIGlzIGFuIGFscGhhYmV0IGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdG9tb3lvX2FscGhhYmV0X2NoYXIoY29uc3QgY2hhciBjKQoreworCXJldHVybiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IChjID49ICdhJyAmJiBjIDw9ICd6Jyk7Cit9CisKKy8qKgorICogdG9tb3lvX21ha2VfYnl0ZSAtIE1ha2UgYnl0ZSB2YWx1ZSBmcm9tIHRocmVlIG9jdGFsIGNoYXJhY3RlcnMuCisgKgorICogQGMxOiBUaGUgZmlyc3QgY2hhcmFjdGVyLgorICogQGMyOiBUaGUgc2Vjb25kIGNoYXJhY3Rlci4KKyAqIEBjMzogVGhlIHRoaXJkIGNoYXJhY3Rlci4KKyAqCisgKiBSZXR1cm5zIGJ5dGUgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggdG9tb3lvX21ha2VfYnl0ZShjb25zdCB1OCBjMSwgY29uc3QgdTggYzIsIGNvbnN0IHU4IGMzKQoreworCXJldHVybiAoKGMxIC0gJzAnKSA8PCA2KSArICgoYzIgLSAnMCcpIDw8IDMpICsgKGMzIC0gJzAnKTsKK30KKworLyoqCisgKiB0b21veW9fc3RyX3N0YXJ0cyAtIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4ga2V5d29yZC4KKyAqCisgKiBAc3JjOiAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBzdHJpbmcuCisgKiBAZmluZDogUG9pbnRlciB0byB0aGUga2V5d29yZC4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgQHNyYyBzdGFydHMgd2l0aCBAZmluZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICoKKyAqIFRoZSBAc3JjIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgQGZpbmQKKyAqIGlmIEBzcmMgc3RhcnRzIHdpdGggQGZpbmQuCisgKi8KK2Jvb2wgdG9tb3lvX3N0cl9zdGFydHMoY2hhciAqKnNyYywgY29uc3QgY2hhciAqZmluZCkKK3sKKwljb25zdCBpbnQgbGVuID0gc3RybGVuKGZpbmQpOworCWNoYXIgKnRtcCA9ICpzcmM7CisKKwlpZiAoc3RybmNtcCh0bXAsIGZpbmQsIGxlbikpCisJCXJldHVybiBmYWxzZTsKKwl0bXAgKz0gbGVuOworCSpzcmMgPSB0bXA7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogdG9tb3lvX25vcm1hbGl6ZV9saW5lIC0gRm9ybWF0IHN0cmluZy4KKyAqCisgKiBAYnVmZmVyOiBUaGUgbGluZSB0byBub3JtYWxpemUuCisgKgorICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYXJlIHJlbW92ZWQuCisgKiBNdWx0aXBsZSB3aGl0ZXNwYWNlcyBhcmUgcGFja2VkIGludG8gc2luZ2xlIHNwYWNlLgorICoKKyAqIFJldHVybnMgbm90aGluZy4KKyAqLwordm9pZCB0b21veW9fbm9ybWFsaXplX2xpbmUodW5zaWduZWQgY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGNoYXIgKnNwID0gYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgKmRwID0gYnVmZmVyOworCWJvb2wgZmlyc3QgPSB0cnVlOworCisJd2hpbGUgKHRvbW95b19pbnZhbGlkKCpzcCkpCisJCXNwKys7CisJd2hpbGUgKCpzcCkgeworCQlpZiAoIWZpcnN0KQorCQkJKmRwKysgPSAnICc7CisJCWZpcnN0ID0gZmFsc2U7CisJCXdoaWxlICh0b21veW9fdmFsaWQoKnNwKSkKKwkJCSpkcCsrID0gKnNwKys7CisJCXdoaWxlICh0b21veW9faW52YWxpZCgqc3ApKQorCQkJc3ArKzsKKwl9CisJKmRwID0gJ1wwJzsKK30KKworLyoqCisgKiB0b21veW9fdG9rZW5pemUgLSBUb2tlbml6ZSBzdHJpbmcuCisgKgorICogQGJ1ZmZlcjogVGhlIGxpbmUgdG8gdG9rZW5pemUuCisgKiBAdzogICAgICBQb2ludGVyIHRvICJjaGFyICoiLgorICogQHNpemU6ICAgU2l6ZW9mIEB3IC4KKyAqCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIHRvbW95b190b2tlbml6ZShjaGFyICpidWZmZXIsIGNoYXIgKndbXSwgc2l6ZV90IHNpemUpCit7CisJaW50IGNvdW50ID0gc2l6ZSAvIHNpemVvZihjaGFyICopOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl3W2ldID0gIiI7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJY2hhciAqY3AgPSBzdHJjaHIoYnVmZmVyLCAnICcpOworCQlpZiAoY3ApCisJCQkqY3AgPSAnXDAnOworCQl3W2ldID0gYnVmZmVyOworCQlpZiAoIWNwKQorCQkJYnJlYWs7CisJCWJ1ZmZlciA9IGNwICsgMTsKKwl9CisJcmV0dXJuIGkgPCBjb3VudCB8fCAhKmJ1ZmZlcjsKK30KKworLyoqCisgKiB0b21veW9fY29ycmVjdF93b3JkMiAtIFZhbGlkYXRlIGEgc3RyaW5nLgorICoKKyAqIEBzdHJpbmc6IFRoZSBzdHJpbmcgdG8gY2hlY2suIE1heSBiZSBub24tJ1wwJy10ZXJtaW5hdGVkLgorICogQGxlbjogICAgTGVuZ3RoIG9mIEBzdHJpbmcuCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcy4KKyAqIFJldHVybnMgdHJ1ZSBpZiBAc3RyaW5nIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCB0b21veW9fY29ycmVjdF93b3JkMihjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW4pCit7CisJY29uc3QgY2hhciAqY29uc3Qgc3RhcnQgPSBzdHJpbmc7CisJYm9vbCBpbl9yZXBldGl0aW9uID0gZmFsc2U7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGNoYXIgZDsKKwl1bnNpZ25lZCBjaGFyIGU7CisJaWYgKCFsZW4pCisJCWdvdG8gb3V0OworCXdoaWxlIChsZW4tLSkgeworCQljID0gKnN0cmluZysrOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQlpZiAoIWxlbi0tKQorCQkJCWdvdG8gb3V0OworCQkJYyA9ICpzdHJpbmcrKzsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXFwnOiAgLyogIlxcIiAqLworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAnJCc6ICAgLyogIlwkIiAqLworCQkJY2FzZSAnKyc6ICAgLyogIlwrIiAqLworCQkJY2FzZSAnPyc6ICAgLyogIlw/IiAqLworCQkJY2FzZSAnKic6ICAgLyogIlwqIiAqLworCQkJY2FzZSAnQCc6ICAgLyogIlxAIiAqLworCQkJY2FzZSAneCc6ICAgLyogIlx4IiAqLworCQkJY2FzZSAnWCc6ICAgLyogIlxYIiAqLworCQkJY2FzZSAnYSc6ICAgLyogIlxhIiAqLworCQkJY2FzZSAnQSc6ICAgLyogIlxBIiAqLworCQkJY2FzZSAnLSc6ICAgLyogIlwtIiAqLworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAneyc6ICAgLyogIi9ceyIgKi8KKwkJCQlpZiAoc3RyaW5nIC0gMyA8IHN0YXJ0IHx8ICooc3RyaW5nIC0gMykgIT0gJy8nKQorCQkJCQlicmVhazsKKwkJCQlpbl9yZXBldGl0aW9uID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJ30nOiAgIC8qICJcfS8iICovCisJCQkJaWYgKCpzdHJpbmcgIT0gJy8nKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIWluX3JlcGV0aXRpb24pCisJCQkJCWJyZWFrOworCQkJCWluX3JlcGV0aXRpb24gPSBmYWxzZTsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJzAnOiAgIC8qICJcb29vIiAqLworCQkJY2FzZSAnMSc6CisJCQljYXNlICcyJzoKKwkJCWNhc2UgJzMnOgorCQkJCWlmICghbGVuLS0gfHwgIWxlbi0tKQorCQkJCQlicmVhazsKKwkJCQlkID0gKnN0cmluZysrOworCQkJCWUgPSAqc3RyaW5nKys7CisJCQkJaWYgKGQgPCAnMCcgfHwgZCA+ICc3JyB8fCBlIDwgJzAnIHx8IGUgPiAnNycpCisJCQkJCWJyZWFrOworCQkJCWMgPSB0b21veW9fbWFrZV9ieXRlKGMsIGQsIGUpOworCQkJCWlmICh0b21veW9faW52YWxpZChjKSkKKwkJCQkJY29udGludWU7IC8qIHBhdHRlcm4gaXMgbm90IFwwMDAgKi8KKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKGluX3JlcGV0aXRpb24gJiYgYyA9PSAnLycpIHsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKHRvbW95b19pbnZhbGlkKGMpKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoaW5fcmVwZXRpdGlvbikKKwkJZ290byBvdXQ7CisJcmV0dXJuIHRydWU7Cisgb3V0OgorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB0b21veW9fY29ycmVjdF93b3JkIC0gVmFsaWRhdGUgYSBzdHJpbmcuCisgKgorICogQHN0cmluZzogVGhlIHN0cmluZyB0byBjaGVjay4KKyAqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVzLgorICogUmV0dXJucyB0cnVlIGlmIEBzdHJpbmcgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgdG9tb3lvX2NvcnJlY3Rfd29yZChjb25zdCBjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIHRvbW95b19jb3JyZWN0X3dvcmQyKHN0cmluZywgc3RybGVuKHN0cmluZykpOworfQorCisvKioKKyAqIHRvbW95b19jb3JyZWN0X3BhdGggLSBWYWxpZGF0ZSBhIHBhdGhuYW1lLgorICoKKyAqIEBmaWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIGNoZWNrLgorICoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGhuYW1lIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcy4KKyAqIFJldHVybnMgdHJ1ZSBpZiBAZmlsZW5hbWUgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgdG9tb3lvX2NvcnJlY3RfcGF0aChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlyZXR1cm4gKmZpbGVuYW1lID09ICcvJyAmJiB0b21veW9fY29ycmVjdF93b3JkKGZpbGVuYW1lKTsKK30KKworLyoqCisgKiB0b21veW9fY29ycmVjdF9kb21haW4gLSBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBkb21haW5uYW1lIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcy4KKyAqCisgKiBAZG9tYWlubmFtZTogVGhlIGRvbWFpbm5hbWUgdG8gY2hlY2suCisgKgorICogUmV0dXJucyB0cnVlIGlmIEBkb21haW5uYW1lIGZvbGxvd3MgdGhlIG5hbWluZyBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIHRvbW95b19jb3JyZWN0X2RvbWFpbihjb25zdCB1bnNpZ25lZCBjaGFyICpkb21haW5uYW1lKQoreworCWlmICghZG9tYWlubmFtZSB8fCBzdHJuY21wKGRvbWFpbm5hbWUsIFRPTU9ZT19ST09UX05BTUUsCisJCQkJICAgVE9NT1lPX1JPT1RfTkFNRV9MRU4pKQorCQlnb3RvIG91dDsKKwlkb21haW5uYW1lICs9IFRPTU9ZT19ST09UX05BTUVfTEVOOworCWlmICghKmRvbWFpbm5hbWUpCisJCXJldHVybiB0cnVlOworCWlmICgqZG9tYWlubmFtZSsrICE9ICcgJykKKwkJZ290byBvdXQ7CisJd2hpbGUgKDEpIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqY3AgPSBzdHJjaHIoZG9tYWlubmFtZSwgJyAnKTsKKwkJaWYgKCFjcCkKKwkJCWJyZWFrOworCQlpZiAoKmRvbWFpbm5hbWUgIT0gJy8nIHx8CisJCSAgICAhdG9tb3lvX2NvcnJlY3Rfd29yZDIoZG9tYWlubmFtZSwgY3AgLSBkb21haW5uYW1lIC0gMSkpCisJCQlnb3RvIG91dDsKKwkJZG9tYWlubmFtZSA9IGNwICsgMTsKKwl9CisJcmV0dXJuIHRvbW95b19jb3JyZWN0X3BhdGgoZG9tYWlubmFtZSk7Cisgb3V0OgorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB0b21veW9fZG9tYWluX2RlZiAtIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHRva2VuIGNhbiBiZSBhIGRvbWFpbm5hbWUuCisgKgorICogQGJ1ZmZlcjogVGhlIHRva2VuIHRvIGNoZWNrLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAYnVmZmVyIHBvc3NpYmx5IGJlIGEgZG9tYWlubmFtZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIHRvbW95b19kb21haW5fZGVmKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gIXN0cm5jbXAoYnVmZmVyLCBUT01PWU9fUk9PVF9OQU1FLCBUT01PWU9fUk9PVF9OQU1FX0xFTik7Cit9CisKKy8qKgorICogdG9tb3lvX2ZpbmRfZG9tYWluIC0gRmluZCBhIGRvbWFpbiBieSB0aGUgZ2l2ZW4gbmFtZS4KKyAqCisgKiBAZG9tYWlubmFtZTogVGhlIGRvbWFpbm5hbWUgdG8gZmluZC4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqCisgKiBDYWxsZXIgaG9sZHMgdG9tb3lvX3JlYWRfbG9jaygpLgorICovCitzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICp0b21veW9fZmluZF9kb21haW4oY29uc3QgY2hhciAqZG9tYWlubmFtZSkKK3sKKwlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW47CisJc3RydWN0IHRvbW95b19wYXRoX2luZm8gbmFtZTsKKworCW5hbWUubmFtZSA9IGRvbWFpbm5hbWU7CisJdG9tb3lvX2ZpbGxfcGF0aF9pbmZvKCZuYW1lKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkb21haW4sICZ0b21veW9fZG9tYWluX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFkb21haW4tPmlzX2RlbGV0ZWQgJiYKKwkJICAgICF0b21veW9fcGF0aGNtcCgmbmFtZSwgZG9tYWluLT5kb21haW5uYW1lKSkKKwkJCXJldHVybiBkb21haW47CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHRvbW95b19jb25zdF9wYXJ0X2xlbmd0aCAtIEV2YWx1YXRlIHRoZSBpbml0aWFsIGxlbmd0aCB3aXRob3V0IGEgcGF0dGVybiBpbiBhIHRva2VuLgorICoKKyAqIEBmaWxlbmFtZTogVGhlIHN0cmluZyB0byBldmFsdWF0ZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBpbml0aWFsIGxlbmd0aCB3aXRob3V0IGEgcGF0dGVybiBpbiBAZmlsZW5hbWUuCisgKi8KK3N0YXRpYyBpbnQgdG9tb3lvX2NvbnN0X3BhcnRfbGVuZ3RoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgYzsKKwlpbnQgbGVuID0gMDsKKworCWlmICghZmlsZW5hbWUpCisJCXJldHVybiAwOworCXdoaWxlICgoYyA9ICpmaWxlbmFtZSsrKSAhPSAnXDAnKSB7CisJCWlmIChjICE9ICdcXCcpIHsKKwkJCWxlbisrOworCQkJY29udGludWU7CisJCX0KKwkJYyA9ICpmaWxlbmFtZSsrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXFwnOiAgLyogIlxcIiAqLworCQkJbGVuICs9IDI7CisJCQljb250aW51ZTsKKwkJY2FzZSAnMCc6ICAgLyogIlxvb28iICovCisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCQljID0gKmZpbGVuYW1lKys7CisJCQlpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorCQkJCWJyZWFrOworCQkJYyA9ICpmaWxlbmFtZSsrOworCQkJaWYgKGMgPCAnMCcgfHwgYyA+ICc3JykKKwkJCQlicmVhazsKKwkJCWxlbiArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qKgorICogdG9tb3lvX2ZpbGxfcGF0aF9pbmZvIC0gRmlsbCBpbiAic3RydWN0IHRvbW95b19wYXRoX2luZm8iIG1lbWJlcnMuCisgKgorICogQHB0cjogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19wYXRoX2luZm8iIHRvIGZpbGwgaW4uCisgKgorICogVGhlIGNhbGxlciBzZXRzICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyItPm5hbWUuCisgKi8KK3ZvaWQgdG9tb3lvX2ZpbGxfcGF0aF9pbmZvKHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpwdHIpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IHB0ci0+bmFtZTsKKwljb25zdCBpbnQgbGVuID0gc3RybGVuKG5hbWUpOworCisJcHRyLT5jb25zdF9sZW4gPSB0b21veW9fY29uc3RfcGFydF9sZW5ndGgobmFtZSk7CisJcHRyLT5pc19kaXIgPSBsZW4gJiYgKG5hbWVbbGVuIC0gMV0gPT0gJy8nKTsKKwlwdHItPmlzX3BhdHRlcm5lZCA9IChwdHItPmNvbnN0X2xlbiA8IGxlbik7CisJcHRyLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbGVuKTsKK30KKworLyoqCisgKiB0b21veW9fZmlsZV9tYXRjaGVzX3BhdHRlcm4yIC0gUGF0dGVybiBtYXRjaGluZyB3aXRob3V0ICcvJyBjaGFyYWN0ZXIgYW5kICJcLSIgcGF0dGVybi4KKyAqCisgKiBAZmlsZW5hbWU6ICAgICBUaGUgc3RhcnQgb2Ygc3RyaW5nIHRvIGNoZWNrLgorICogQGZpbGVuYW1lX2VuZDogVGhlIGVuZCBvZiBzdHJpbmcgdG8gY2hlY2suCisgKiBAcGF0dGVybjogICAgICBUaGUgc3RhcnQgb2YgcGF0dGVybiB0byBjb21wYXJlLgorICogQHBhdHRlcm5fZW5kOiAgVGhlIGVuZCBvZiBwYXR0ZXJuIHRvIGNvbXBhcmUuCisgKgorICogUmV0dXJucyB0cnVlIGlmIEBmaWxlbmFtZSBtYXRjaGVzIEBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHRvbW95b19maWxlX21hdGNoZXNfcGF0dGVybjIoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJCSBjb25zdCBjaGFyICpmaWxlbmFtZV9lbmQsCisJCQkJCSBjb25zdCBjaGFyICpwYXR0ZXJuLAorCQkJCQkgY29uc3QgY2hhciAqcGF0dGVybl9lbmQpCit7CisJd2hpbGUgKGZpbGVuYW1lIDwgZmlsZW5hbWVfZW5kICYmIHBhdHRlcm4gPCBwYXR0ZXJuX2VuZCkgeworCQljaGFyIGM7CisJCWlmICgqcGF0dGVybiAhPSAnXFwnKSB7CisJCQlpZiAoKmZpbGVuYW1lKysgIT0gKnBhdHRlcm4rKykKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQljb250aW51ZTsKKwkJfQorCQljID0gKmZpbGVuYW1lOworCQlwYXR0ZXJuKys7CisJCXN3aXRjaCAoKnBhdHRlcm4pIHsKKwkJCWludCBpOworCQkJaW50IGo7CisJCWNhc2UgJz8nOgorCQkJaWYgKGMgPT0gJy8nKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKwkJCQlpZiAoZmlsZW5hbWVbMV0gPT0gJ1xcJykKKwkJCQkJZmlsZW5hbWUrKzsKKwkJCQllbHNlIGlmICh0b21veW9fYnl0ZV9yYW5nZShmaWxlbmFtZSArIDEpKQorCQkJCQlmaWxlbmFtZSArPSAzOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChjICE9ICdcXCcpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKCorK2ZpbGVuYW1lICE9ICdcXCcpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgJysnOgorCQkJaWYgKCFpc2RpZ2l0KGMpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCWlmICghaXN4ZGlnaXQoYykpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJaWYgKCF0b21veW9fYWxwaGFiZXRfY2hhcihjKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSAnMCc6CisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCQlpZiAoYyA9PSAnXFwnICYmIHRvbW95b19ieXRlX3JhbmdlKGZpbGVuYW1lICsgMSkKKwkJCSAgICAmJiBzdHJuY21wKGZpbGVuYW1lICsgMSwgcGF0dGVybiwgMykgPT0gMCkgeworCQkJCWZpbGVuYW1lICs9IDM7CisJCQkJcGF0dGVybiArPSAyOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOyAvKiBOb3QgbWF0Y2hlZC4gKi8KKwkJY2FzZSAnKic6CisJCWNhc2UgJ0AnOgorCQkJZm9yIChpID0gMDsgaSA8PSBmaWxlbmFtZV9lbmQgLSBmaWxlbmFtZTsgaSsrKSB7CisJCQkJaWYgKHRvbW95b19maWxlX21hdGNoZXNfcGF0dGVybjIoCisJCQkJCQkgICAgZmlsZW5hbWUgKyBpLCBmaWxlbmFtZV9lbmQsCisJCQkJCQkgICAgcGF0dGVybiArIDEsIHBhdHRlcm5fZW5kKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJYyA9IGZpbGVuYW1lW2ldOworCQkJCWlmIChjID09ICcuJyAmJiAqcGF0dGVybiA9PSAnQCcpCisJCQkJCWJyZWFrOworCQkJCWlmIChjICE9ICdcXCcpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChmaWxlbmFtZVtpICsgMV0gPT0gJ1xcJykKKwkJCQkJaSsrOworCQkJCWVsc2UgaWYgKHRvbW95b19ieXRlX3JhbmdlKGZpbGVuYW1lICsgaSArIDEpKQorCQkJCQlpICs9IDM7CisJCQkJZWxzZQorCQkJCQlicmVhazsgLyogQmFkIHBhdHRlcm4uICovCisJCQl9CisJCQlyZXR1cm4gZmFsc2U7IC8qIE5vdCBtYXRjaGVkLiAqLworCQlkZWZhdWx0OgorCQkJaiA9IDA7CisJCQljID0gKnBhdHRlcm47CisJCQlpZiAoYyA9PSAnJCcpIHsKKwkJCQl3aGlsZSAoaXNkaWdpdChmaWxlbmFtZVtqXSkpCisJCQkJCWorKzsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnWCcpIHsKKwkJCQl3aGlsZSAoaXN4ZGlnaXQoZmlsZW5hbWVbal0pKQorCQkJCQlqKys7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ0EnKSB7CisJCQkJd2hpbGUgKHRvbW95b19hbHBoYWJldF9jaGFyKGZpbGVuYW1lW2pdKSkKKwkJCQkJaisrOworCQkJfQorCQkJZm9yIChpID0gMTsgaSA8PSBqOyBpKyspIHsKKwkJCQlpZiAodG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuMigKKwkJCQkJCSAgICBmaWxlbmFtZSArIGksIGZpbGVuYW1lX2VuZCwKKwkJCQkJCSAgICBwYXR0ZXJuICsgMSwgcGF0dGVybl9lbmQpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsgLyogTm90IG1hdGNoZWQgb3IgYmFkIHBhdHRlcm4uICovCisJCX0KKwkJZmlsZW5hbWUrKzsKKwkJcGF0dGVybisrOworCX0KKwl3aGlsZSAoKnBhdHRlcm4gPT0gJ1xcJyAmJgorCSAgICAgICAoKihwYXR0ZXJuICsgMSkgPT0gJyonIHx8ICoocGF0dGVybiArIDEpID09ICdAJykpCisJCXBhdHRlcm4gKz0gMjsKKwlyZXR1cm4gZmlsZW5hbWUgPT0gZmlsZW5hbWVfZW5kICYmIHBhdHRlcm4gPT0gcGF0dGVybl9lbmQ7Cit9CisKKy8qKgorICogdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuIC0gUGF0dGVybiBtYXRjaGluZyB3aXRob3V0ICcvJyBjaGFyYWN0ZXIuCisgKgorICogQGZpbGVuYW1lOiAgICAgVGhlIHN0YXJ0IG9mIHN0cmluZyB0byBjaGVjay4KKyAqIEBmaWxlbmFtZV9lbmQ6IFRoZSBlbmQgb2Ygc3RyaW5nIHRvIGNoZWNrLgorICogQHBhdHRlcm46ICAgICAgVGhlIHN0YXJ0IG9mIHBhdHRlcm4gdG8gY29tcGFyZS4KKyAqIEBwYXR0ZXJuX2VuZDogIFRoZSBlbmQgb2YgcGF0dGVybiB0byBjb21wYXJlLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAZmlsZW5hbWUgbWF0Y2hlcyBAcGF0dGVybiwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCB0b21veW9fZmlsZV9tYXRjaGVzX3BhdHRlcm4oY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lX2VuZCwKKwkJCQkJY29uc3QgY2hhciAqcGF0dGVybiwKKwkJCQkJY29uc3QgY2hhciAqcGF0dGVybl9lbmQpCit7CisJY29uc3QgY2hhciAqcGF0dGVybl9zdGFydCA9IHBhdHRlcm47CisJYm9vbCBmaXJzdCA9IHRydWU7CisJYm9vbCByZXN1bHQ7CisKKwl3aGlsZSAocGF0dGVybiA8IHBhdHRlcm5fZW5kIC0gMSkgeworCQkvKiBTcGxpdCBhdCAiXC0iIHBhdHRlcm4uICovCisJCWlmICgqcGF0dGVybisrICE9ICdcXCcgfHwgKnBhdHRlcm4rKyAhPSAnLScpCisJCQljb250aW51ZTsKKwkJcmVzdWx0ID0gdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuMihmaWxlbmFtZSwKKwkJCQkJCSAgICAgIGZpbGVuYW1lX2VuZCwKKwkJCQkJCSAgICAgIHBhdHRlcm5fc3RhcnQsCisJCQkJCQkgICAgICBwYXR0ZXJuIC0gMik7CisJCWlmIChmaXJzdCkKKwkJCXJlc3VsdCA9ICFyZXN1bHQ7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gZmFsc2U7CisJCWZpcnN0ID0gZmFsc2U7CisJCXBhdHRlcm5fc3RhcnQgPSBwYXR0ZXJuOworCX0KKwlyZXN1bHQgPSB0b21veW9fZmlsZV9tYXRjaGVzX3BhdHRlcm4yKGZpbGVuYW1lLCBmaWxlbmFtZV9lbmQsCisJCQkJCSAgICAgIHBhdHRlcm5fc3RhcnQsIHBhdHRlcm5fZW5kKTsKKwlyZXR1cm4gZmlyc3QgPyByZXN1bHQgOiAhcmVzdWx0OworfQorCisvKioKKyAqIHRvbW95b19wYXRoX21hdGNoZXNfcGF0dGVybjIgLSBEbyBwYXRobmFtZSBwYXR0ZXJuIG1hdGNoaW5nLgorICoKKyAqIEBmOiBUaGUgc3RhcnQgb2Ygc3RyaW5nIHRvIGNoZWNrLgorICogQHA6IFRoZSBzdGFydCBvZiBwYXR0ZXJuIHRvIGNvbXBhcmUuCisgKgorICogUmV0dXJucyB0cnVlIGlmIEBmIG1hdGNoZXMgQHAsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgdG9tb3lvX3BhdGhfbWF0Y2hlc19wYXR0ZXJuMihjb25zdCBjaGFyICpmLCBjb25zdCBjaGFyICpwKQoreworCWNvbnN0IGNoYXIgKmZfZGVsaW1pdGVyOworCWNvbnN0IGNoYXIgKnBfZGVsaW1pdGVyOworCisJd2hpbGUgKCpmICYmICpwKSB7CisJCWZfZGVsaW1pdGVyID0gc3RyY2hyKGYsICcvJyk7CisJCWlmICghZl9kZWxpbWl0ZXIpCisJCQlmX2RlbGltaXRlciA9IGYgKyBzdHJsZW4oZik7CisJCXBfZGVsaW1pdGVyID0gc3RyY2hyKHAsICcvJyk7CisJCWlmICghcF9kZWxpbWl0ZXIpCisJCQlwX2RlbGltaXRlciA9IHAgKyBzdHJsZW4ocCk7CisJCWlmICgqcCA9PSAnXFwnICYmICoocCArIDEpID09ICd7JykKKwkJCWdvdG8gcmVjdXJzaXZlOworCQlpZiAoIXRvbW95b19maWxlX21hdGNoZXNfcGF0dGVybihmLCBmX2RlbGltaXRlciwgcCwKKwkJCQkJCSBwX2RlbGltaXRlcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWYgPSBmX2RlbGltaXRlcjsKKwkJaWYgKCpmKQorCQkJZisrOworCQlwID0gcF9kZWxpbWl0ZXI7CisJCWlmICgqcCkKKwkJCXArKzsKKwl9CisJLyogSWdub3JlIHRyYWlsaW5nICJcKiIgYW5kICJcQCIgaW4gQHBhdHRlcm4uICovCisJd2hpbGUgKCpwID09ICdcXCcgJiYKKwkgICAgICAgKCoocCArIDEpID09ICcqJyB8fCAqKHAgKyAxKSA9PSAnQCcpKQorCQlwICs9IDI7CisJcmV0dXJuICEqZiAmJiAhKnA7CisgcmVjdXJzaXZlOgorCS8qCisJICogVGhlICJceyIgcGF0dGVybiBpcyBwZXJtaXR0ZWQgb25seSBhZnRlciAnLycgY2hhcmFjdGVyLgorCSAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGJlbG93ICIqKHAgLSAxKSIgaXMgc2FmZS4KKwkgKiBBbHNvLCB0aGUgIlx9IiBwYXR0ZXJuIGlzIHBlcm1pdHRlZCBvbmx5IGJlZm9yZSAnLycgY2hhcmFjdGVyCisJICogc28gdGhhdCAiXHsiICsgIlx9IiBwYWlyIHdpbGwgbm90IGJyZWFrIHRoZSAiXC0iIG9wZXJhdG9yLgorCSAqLworCWlmICgqKHAgLSAxKSAhPSAnLycgfHwgcF9kZWxpbWl0ZXIgPD0gcCArIDMgfHwgKnBfZGVsaW1pdGVyICE9ICcvJyB8fAorCSAgICAqKHBfZGVsaW1pdGVyIC0gMSkgIT0gJ30nIHx8ICoocF9kZWxpbWl0ZXIgLSAyKSAhPSAnXFwnKQorCQlyZXR1cm4gZmFsc2U7IC8qIEJhZCBwYXR0ZXJuLiAqLworCWRvIHsKKwkJLyogQ29tcGFyZSBjdXJyZW50IGNvbXBvbmVudCB3aXRoIHBhdHRlcm4uICovCisJCWlmICghdG9tb3lvX2ZpbGVfbWF0Y2hlc19wYXR0ZXJuKGYsIGZfZGVsaW1pdGVyLCBwICsgMiwKKwkJCQkJCSBwX2RlbGltaXRlciAtIDIpKQorCQkJYnJlYWs7CisJCS8qIFByb2NlZWQgdG8gbmV4dCBjb21wb25lbnQuICovCisJCWYgPSBmX2RlbGltaXRlcjsKKwkJaWYgKCEqZikKKwkJCWJyZWFrOworCQlmKys7CisJCS8qIENvbnRpbnVlIGNvbXBhcmlzb24uICovCisJCWlmICh0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4yKGYsIHBfZGVsaW1pdGVyICsgMSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZl9kZWxpbWl0ZXIgPSBzdHJjaHIoZiwgJy8nKTsKKwl9IHdoaWxlIChmX2RlbGltaXRlcik7CisJcmV0dXJuIGZhbHNlOyAvKiBOb3QgbWF0Y2hlZC4gKi8KK30KKworLyoqCisgKiB0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4gLSBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLgorICoKKyAqIEBmaWxlbmFtZTogVGhlIGZpbGVuYW1lIHRvIGNoZWNrLgorICogQHBhdHRlcm46ICBUaGUgcGF0dGVybiB0byBjb21wYXJlLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBtYXRjaGVzLCBmYWxzZSBvdGhlcndpc2UuCisgKgorICogVGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgYXZhaWxhYmxlLgorICogICBcXCAgICAgXCBpdHNlbGYuCisgKiAgIFxvb28gICBPY3RhbCByZXByZXNlbnRhdGlvbiBvZiBhIGJ5dGUuCisgKiAgIFwqICAgICBaZXJvIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgY2hhcmFjdGVycyBvdGhlciB0aGFuICcvJy4KKyAqICAgXEAgICAgIFplcm8gb3IgbW9yZSByZXBldGl0aW9ucyBvZiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gJy8nIG9yICcuJy4KKyAqICAgXD8gICAgIDEgYnl0ZSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAnLycuCisgKiAgIFwkICAgICBPbmUgb3IgbW9yZSByZXBldGl0aW9ucyBvZiBkZWNpbWFsIGRpZ2l0cy4KKyAqICAgXCsgICAgIDEgZGVjaW1hbCBkaWdpdC4KKyAqICAgXFggICAgIE9uZSBvciBtb3JlIHJlcGV0aXRpb25zIG9mIGhleGFkZWNpbWFsIGRpZ2l0cy4KKyAqICAgXHggICAgIDEgaGV4YWRlY2ltYWwgZGlnaXQuCisgKiAgIFxBICAgICBPbmUgb3IgbW9yZSByZXBldGl0aW9ucyBvZiBhbHBoYWJldCBjaGFyYWN0ZXJzLgorICogICBcYSAgICAgMSBhbHBoYWJldCBjaGFyYWN0ZXIuCisgKgorICogICBcLSAgICAgU3VidHJhY3Rpb24gb3BlcmF0b3IuCisgKgorICogICAvXHtkaXJcfS8gICAnLycgKyAnT25lIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgZGlyLycgKGUuZy4gL2Rpci8gL2Rpci9kaXIvCisgKiAgICAgICAgICAgICAgIC9kaXIvZGlyL2Rpci8gKS4KKyAqLworYm9vbCB0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4oY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lLAorCQkJCSBjb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0dGVybikKK3sKKwljb25zdCBjaGFyICpmID0gZmlsZW5hbWUtPm5hbWU7CisJY29uc3QgY2hhciAqcCA9IHBhdHRlcm4tPm5hbWU7CisJY29uc3QgaW50IGxlbiA9IHBhdHRlcm4tPmNvbnN0X2xlbjsKKworCS8qIElmIEBwYXR0ZXJuIGRvZXNuJ3QgY29udGFpbiBwYXR0ZXJuLCBJIGNhbiB1c2Ugc3RyY21wKCkuICovCisJaWYgKCFwYXR0ZXJuLT5pc19wYXR0ZXJuZWQpCisJCXJldHVybiAhdG9tb3lvX3BhdGhjbXAoZmlsZW5hbWUsIHBhdHRlcm4pOworCS8qIERvbid0IGNvbXBhcmUgZGlyZWN0b3J5IGFuZCBub24tZGlyZWN0b3J5LiAqLworCWlmIChmaWxlbmFtZS0+aXNfZGlyICE9IHBhdHRlcm4tPmlzX2RpcikKKwkJcmV0dXJuIGZhbHNlOworCS8qIENvbXBhcmUgdGhlIGluaXRpYWwgbGVuZ3RoIHdpdGhvdXQgcGF0dGVybnMuICovCisJaWYgKHN0cm5jbXAoZiwgcCwgbGVuKSkKKwkJcmV0dXJuIGZhbHNlOworCWYgKz0gbGVuOworCXAgKz0gbGVuOworCXJldHVybiB0b21veW9fcGF0aF9tYXRjaGVzX3BhdHRlcm4yKGYsIHApOworfQorCisvKioKKyAqIHRvbW95b19nZXRfZXhlIC0gR2V0IHRvbW95b19yZWFscGF0aCgpIG9mIGN1cnJlbnQgcHJvY2Vzcy4KKyAqCisgKiBSZXR1cm5zIHRoZSB0b21veW9fcmVhbHBhdGgoKSBvZiBjdXJyZW50IHByb2Nlc3Mgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIGt6YWxsb2MoKSwgc28gdGhlIGNhbGxlciBtdXN0IGNhbGwga2ZyZWUoKQorICogaWYgdGhpcyBmdW5jdGlvbiBkaWRuJ3QgcmV0dXJuIE5VTEwuCisgKi8KK2NvbnN0IGNoYXIgKnRvbW95b19nZXRfZXhlKHZvaWQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwljb25zdCBjaGFyICpjcCA9IE5VTEw7CisKKwlpZiAoIW1tKQorCQlyZXR1cm4gTlVMTDsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQ1VUQUJMRSkgJiYgdm1hLT52bV9maWxlKSB7CisJCQljcCA9IHRvbW95b19yZWFscGF0aF9mcm9tX3BhdGgoJnZtYS0+dm1fZmlsZS0+Zl9wYXRoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIGNwOworfQorCisvKioKKyAqIHRvbW95b19nZXRfbW9kZSAtIEdldCBNQUMgbW9kZS4KKyAqCisgKiBAcHJvZmlsZTogUHJvZmlsZSBudW1iZXIuCisgKiBAaW5kZXg6ICAgSW5kZXggbnVtYmVyIG9mIGZ1bmN0aW9uYWxpdHkuCisgKgorICogUmV0dXJucyBtb2RlLgorICovCitpbnQgdG9tb3lvX2dldF9tb2RlKGNvbnN0IHU4IHByb2ZpbGUsIGNvbnN0IHU4IGluZGV4KQoreworCXU4IG1vZGU7CisJY29uc3QgdTggY2F0ZWdvcnkgPSBUT01PWU9fTUFDX0NBVEVHT1JZX0ZJTEU7CisJaWYgKCF0b21veW9fcG9saWN5X2xvYWRlZCkKKwkJcmV0dXJuIFRPTU9ZT19DT05GSUdfRElTQUJMRUQ7CisJbW9kZSA9IHRvbW95b19wcm9maWxlKHByb2ZpbGUpLT5jb25maWdbaW5kZXhdOworCWlmIChtb2RlID09IFRPTU9ZT19DT05GSUdfVVNFX0RFRkFVTFQpCisJCW1vZGUgPSB0b21veW9fcHJvZmlsZShwcm9maWxlKS0+Y29uZmlnW2NhdGVnb3J5XTsKKwlpZiAobW9kZSA9PSBUT01PWU9fQ09ORklHX1VTRV9ERUZBVUxUKQorCQltb2RlID0gdG9tb3lvX3Byb2ZpbGUocHJvZmlsZSktPmRlZmF1bHRfY29uZmlnOworCXJldHVybiBtb2RlICYgMzsKK30KKworLyoqCisgKiB0b21veW9faW5pdF9yZXF1ZXN0X2luZm8gLSBJbml0aWFsaXplICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIgbWVtYmVycy4KKyAqCisgKiBAcjogICAgICBQb2ludGVyIHRvICJzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyIgdG8gaW5pdGlhbGl6ZS4KKyAqIEBkb21haW46IFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLiBOVUxMIGZvciB0b21veW9fZG9tYWluKCkuCisgKiBAaW5kZXg6ICBJbmRleCBudW1iZXIgb2YgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBSZXR1cm5zIG1vZGUuCisgKi8KK2ludCB0b21veW9faW5pdF9yZXF1ZXN0X2luZm8oc3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8gKnIsCisJCQkgICAgIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwgY29uc3QgdTggaW5kZXgpCit7CisJdTggcHJvZmlsZTsKKwltZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisJaWYgKCFkb21haW4pCisJCWRvbWFpbiA9IHRvbW95b19kb21haW4oKTsKKwlyLT5kb21haW4gPSBkb21haW47CisJcHJvZmlsZSA9IGRvbWFpbi0+cHJvZmlsZTsKKwlyLT5wcm9maWxlID0gcHJvZmlsZTsKKwlyLT50eXBlID0gaW5kZXg7CisJci0+bW9kZSA9IHRvbW95b19nZXRfbW9kZShwcm9maWxlLCBpbmRleCk7CisJcmV0dXJuIHItPm1vZGU7Cit9CisKKy8qKgorICogdG9tb3lvX2xhc3Rfd29yZCAtIEdldCBsYXN0IGNvbXBvbmVudCBvZiBhIGxpbmUuCisgKgorICogQGxpbmU6IEEgbGluZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBsYXN0IHdvcmQgb2YgYSBsaW5lLgorICovCitjb25zdCBjaGFyICp0b21veW9fbGFzdF93b3JkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqY3AgPSBzdHJyY2hyKG5hbWUsICcgJyk7CisJaWYgKGNwKQorCQlyZXR1cm4gY3AgKyAxOworCXJldHVybiBuYW1lOworfQorCisvKioKKyAqIHRvbW95b193YXJuX2xvZyAtIFByaW50IHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSBvbiBjb25zb2xlLgorICoKKyAqIEByOiAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvIi4KKyAqIEBmbXQ6IFRoZSBwcmludGYoKSdzIGZvcm1hdCBzdHJpbmcsIGZvbGxvd2VkIGJ5IHBhcmFtZXRlcnMuCisgKi8KK3ZvaWQgdG9tb3lvX3dhcm5fbG9nKHN0cnVjdCB0b21veW9fcmVxdWVzdF9pbmZvICpyLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqYnVmZmVyOworCWNvbnN0IHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKiBjb25zdCBkb21haW4gPSByLT5kb21haW47CisJY29uc3Qgc3RydWN0IHRvbW95b19wcm9maWxlICpwcm9maWxlID0gdG9tb3lvX3Byb2ZpbGUoZG9tYWluLT5wcm9maWxlKTsKKwlzd2l0Y2ggKHItPm1vZGUpIHsKKwljYXNlIFRPTU9ZT19DT05GSUdfRU5GT1JDSU5HOgorCQlpZiAoIXByb2ZpbGUtPmVuZm9yY2luZy0+ZW5mb3JjaW5nX3ZlcmJvc2UpCisJCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgVE9NT1lPX0NPTkZJR19QRVJNSVNTSVZFOgorCQlpZiAoIXByb2ZpbGUtPnBlcm1pc3NpdmUtPnBlcm1pc3NpdmVfdmVyYm9zZSkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBUT01PWU9fQ09ORklHX0xFQVJOSU5HOgorCQlpZiAoIXByb2ZpbGUtPmxlYXJuaW5nLT5sZWFybmluZ192ZXJib3NlKQorCQkJcmV0dXJuOworCQlicmVhazsKKwl9CisJYnVmZmVyID0ga21hbGxvYyg0MDk2LCBHRlBfTk9GUyk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybjsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWZmZXIsIDQwOTUsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWJ1ZmZlcls0MDk1XSA9ICdcMCc7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFjY2VzcyAlcyBkZW5pZWQgZm9yICVzXG4iLAorCSAgICAgICByLT5tb2RlID09IFRPTU9ZT19DT05GSUdfRU5GT1JDSU5HID8gIkVSUk9SIiA6ICJXQVJOSU5HIiwgYnVmZmVyLAorCSAgICAgICB0b21veW9fbGFzdF93b3JkKGRvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZSkpOworCWtmcmVlKGJ1ZmZlcik7Cit9CisKKy8qKgorICogdG9tb3lvX2RvbWFpbl9xdW90YV9pc19vayAtIENoZWNrIGZvciBkb21haW4ncyBxdW90YS4KKyAqCisgKiBAcjogUG9pbnRlciB0byAic3RydWN0IHRvbW95b19yZXF1ZXN0X2luZm8iLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZG9tYWluIGlzIG5vdCBleGNlZWRlZCBxdW90YSwgZmFsc2Ugb3RoZXJ3aXNlLgorICoKKyAqIENhbGxlciBob2xkcyB0b21veW9fcmVhZF9sb2NrKCkuCisgKi8KK2Jvb2wgdG9tb3lvX2RvbWFpbl9xdW90YV9pc19vayhzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqcikKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiA9IHItPmRvbWFpbjsKKwlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvICpwdHI7CisKKwlpZiAoci0+bW9kZSAhPSBUT01PWU9fQ09ORklHX0xFQVJOSU5HKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFkb21haW4pCisJCXJldHVybiB0cnVlOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ciwgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCwgbGlzdCkgeworCQlpZiAocHRyLT5pc19kZWxldGVkKQorCQkJY29udGludWU7CisJCXN3aXRjaCAocHRyLT50eXBlKSB7CisJCQl1MTYgcGVybTsKKwkJCXU4IGk7CisJCWNhc2UgVE9NT1lPX1RZUEVfUEFUSF9BQ0w6CisJCQlwZXJtID0gY29udGFpbmVyX29mKHB0ciwgc3RydWN0IHRvbW95b19wYXRoX2FjbCwgaGVhZCkKKwkJCQktPnBlcm07CisJCQlmb3IgKGkgPSAwOyBpIDwgVE9NT1lPX01BWF9QQVRIX09QRVJBVElPTjsgaSsrKQorCQkJCWlmIChwZXJtICYgKDEgPDwgaSkpCisJCQkJCWNvdW50Kys7CisJCQlpZiAocGVybSAmICgxIDw8IFRPTU9ZT19UWVBFX1JFQURfV1JJVEUpKQorCQkJCWNvdW50IC09IDI7CisJCQlicmVhazsKKwkJY2FzZSBUT01PWU9fVFlQRV9QQVRIMl9BQ0w6CisJCQlwZXJtID0gY29udGFpbmVyX29mKHB0ciwgc3RydWN0IHRvbW95b19wYXRoMl9hY2wsIGhlYWQpCisJCQkJLT5wZXJtOworCQkJZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfUEFUSDJfT1BFUkFUSU9OOyBpKyspCisJCQkJaWYgKHBlcm0gJiAoMSA8PCBpKSkKKwkJCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIFRPTU9ZT19UWVBFX1BBVEhfTlVNQkVSX0FDTDoKKwkJCXBlcm0gPSBjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgdG9tb3lvX3BhdGhfbnVtYmVyX2FjbCwKKwkJCQkJICAgIGhlYWQpLT5wZXJtOworCQkJZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfUEFUSF9OVU1CRVJfT1BFUkFUSU9OOyBpKyspCisJCQkJaWYgKHBlcm0gJiAoMSA8PCBpKSkKKwkJCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIFRPTU9ZT19UWVBFX01LREVWX0FDTDoKKwkJCXBlcm0gPSBjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgdG9tb3lvX21rZGV2X2FjbCwKKwkJCQkJICAgIGhlYWQpLT5wZXJtOworCQkJZm9yIChpID0gMDsgaSA8IFRPTU9ZT19NQVhfTUtERVZfT1BFUkFUSU9OOyBpKyspCisJCQkJaWYgKHBlcm0gJiAoMSA8PCBpKSkKKwkJCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY291bnQrKzsKKwkJfQorCX0KKwlpZiAoY291bnQgPCB0b21veW9fcHJvZmlsZShkb21haW4tPnByb2ZpbGUpLT5sZWFybmluZy0+CisJICAgIGxlYXJuaW5nX21heF9lbnRyeSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFkb21haW4tPnF1b3RhX3dhcm5lZCkgeworCQlkb21haW4tPnF1b3RhX3dhcm5lZCA9IHRydWU7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRPTU9ZTy1XQVJOSU5HOiAiCisJCSAgICAgICAiRG9tYWluICclcycgaGFzIHNvIG1hbnkgQUNMcyB0byBob2xkLiAiCisJCSAgICAgICAiU3RvcHBlZCBsZWFybmluZyBtb2RlLlxuIiwgZG9tYWluLT5kb21haW5uYW1lLT5uYW1lKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCAzMDNhYzA0Li5hM2IyYTY0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtNDUxLDEzICs0NTEsMTEgQEAKIAlzbmRfcGNtX3RpbWVyX3Jlc29sdXRpb25fY2hhbmdlKHN1YnN0cmVhbSk7CiAJcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9IFNORFJWX1BDTV9TVEFURV9TRVRVUDsKIAotCWlmIChzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSkgewotCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3Qoc3Vic3RyZWFtLT5sYXRlbmN5X3BtX3Fvc19yZXEpOwotCQlzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSA9IE5VTEw7Ci0JfQorCWlmIChwbV9xb3NfcmVxdWVzdF9hY3RpdmUoJnN1YnN0cmVhbS0+bGF0ZW5jeV9wbV9xb3NfcmVxKSkKKwkJcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSk7CiAJaWYgKCh1c2VjcyA9IHBlcmlvZF90b191c2VjcyhydW50aW1lKSkgPj0gMCkKLQkJc3Vic3RyZWFtLT5sYXRlbmN5X3BtX3Fvc19yZXEgPSBwbV9xb3NfYWRkX3JlcXVlc3QoCi0JCQkJCVBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksIHVzZWNzKTsKKwkJcG1fcW9zX2FkZF9yZXF1ZXN0KCZzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSwKKwkJCQkgICBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLCB1c2Vjcyk7CiAJcmV0dXJuIDA7CiAgX2Vycm9yOgogCS8qIGhhcmR3YXJlIG1pZ2h0IGJlIHVudXNlYWJsZSBmcm9tIHRoaXMgdGltZSwKQEAgLTUxMiw4ICs1MTAsNyBAQAogCWlmIChzdWJzdHJlYW0tPm9wcy0+aHdfZnJlZSkKIAkJcmVzdWx0ID0gc3Vic3RyZWFtLT5vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtKTsKIAlydW50aW1lLT5zdGF0dXMtPnN0YXRlID0gU05EUlZfUENNX1NUQVRFX09QRU47Ci0JcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KHN1YnN0cmVhbS0+bGF0ZW5jeV9wbV9xb3NfcmVxKTsKLQlzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSA9IE5VTEw7CisJcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9LY29uZmlnIGIvc291bmQvZHJpdmVycy9LY29uZmlnCmluZGV4IDg0NzE0YTYuLmMyOTBjZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvS2NvbmZpZworKysgYi9zb3VuZC9kcml2ZXJzL0tjb25maWcKQEAgLTE1NSw3ICsxNTUsNyBAQAogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUKLQkgIG9wYl9hYzk3X2NvbnRyb2xsZXJfcmVmX3YxXzAwX2EgaXAgY29yZSBmb3VuZCBpbiBYaWxpbngnIE1MNDAzCisJICBvcGJfYWM5N19jb250cm9sbGVyX3JlZl92MV8wMF9hIGlwIGNvcmUgZm91bmQgaW4gWGlsaW54J3MgTUw0MDMKIAkgIHJlZmVyZW5jZSBkZXNpZ24uCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggODYwNjdlZTcuLjJmYzUzOTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCkBAIC01Miw2ICs1MiwxMCBAQAogCSAqLwogCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OwogCXVuc2lnbmVkIGludCBjb2RlY190eXBlOworCisJLyogbWlzYyBmbGFncyAqLworCS8qIFBEIGJpdCBpbmRpY2F0ZXMgb25seSB0aGUgdXBkYXRlLCBub3QgdGhlIGN1cnJlbnQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgb2xkX3Bpbl9kZXRlY3Q6MTsKIH07CiAKIApAQCAtNjE2LDYgKzYyMCw5IEBACiAgKiBVbnNvbGljaXRlZCBldmVudHMKICAqLwogCitzdGF0aWMgdm9pZCBoZG1pX3ByZXNlbnRfc2Vuc2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW5fbmlkLAorCQkJICAgICAgIHN0cnVjdCBoZG1pX2VsZCAqZWxkKTsKKwogc3RhdGljIHZvaWQgaGRtaV9pbnRyaW5zaWNfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCiB7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtNjMyLDYgKzYzOSwxMiBAQAogCWlmIChpbmRleCA8IDApCiAJCXJldHVybjsKIAorCWlmIChzcGVjLT5vbGRfcGluX2RldGVjdCkgeworCQlpZiAocGluZCkKKwkJCWhkbWlfcHJlc2VudF9zZW5zZShjb2RlYywgdGFnLCAmc3BlYy0+c2lua19lbGRbaW5kZXhdKTsKKwkJcGluZCA9IHNwZWMtPnNpbmtfZWxkW2luZGV4XS5tb25pdG9yX3ByZXNlbnQ7CisJfQorCiAJc3BlYy0+c2lua19lbGRbaW5kZXhdLm1vbml0b3JfcHJlc2VudCA9IHBpbmQ7CiAJc3BlYy0+c2lua19lbGRbaW5kZXhdLmVsZF92YWxpZCA9IGVsZHY7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfbnZoZG1pLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX252aGRtaS5jCmluZGV4IDNjMTBjMGIuLmIwNjUyYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfbnZoZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYwpAQCAtNDc4LDYgKzQ3OCw3IEBACiAKIAljb2RlYy0+c3BlYyA9IHNwZWM7CiAJc3BlYy0+Y29kZWNfdHlwZSA9IEhEQV9DT0RFQ19OVklESUFfTUNQODk7CisJc3BlYy0+b2xkX3Bpbl9kZXRlY3QgPSAxOwogCiAJaWYgKGhkbWlfcGFyc2VfY29kZWMoY29kZWMpIDwgMCkgewogCQljb2RlYy0+c3BlYyA9IE5VTEw7CkBAIC01MDgsNiArNTA5LDcgQEAKIAlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSA4OwogCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gbnZoZG1pX21hc3Rlcl9jb25fbmlkXzd4OwogCXNwZWMtPmNvZGVjX3R5cGUgPSBIREFfQ09ERUNfTlZJRElBX01DUDdYOworCXNwZWMtPm9sZF9waW5fZGV0ZWN0ID0gMTsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBudmhkbWlfcGF0Y2hfb3BzXzhjaF83eDsKIApAQCAtNTI4LDYgKzUzMCw3IEBACiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKIAlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IG52aGRtaV9tYXN0ZXJfY29uX25pZF83eDsKIAlzcGVjLT5jb2RlY190eXBlID0gSERBX0NPREVDX05WSURJQV9NQ1A3WDsKKwlzcGVjLT5vbGRfcGluX2RldGVjdCA9IDE7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gbnZoZG1pX3BhdGNoX29wc18yY2g7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggZmY2MTRkZC4uNTk2ZWEyZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTEyNjcsMTEgKzEyNjcsMTEgQEAKIAl1bnNpZ25lZCBuaWQgPSAwOwogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCisJc3BlYy0+Y2RlZmluZS5lbmFibGVfcGNiZWVwID0gMTsgLyogYXNzdW1lIGFsd2F5cyBlbmFibGVkICovCisKIAlhc3MgPSBjb2RlYy0+c3Vic3lzdGVtX2lkICYgMHhmZmZmOwotCWlmIChhc3MgIT0gY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlICYmIChhc3MgJiAxKSkgewotCQlzcGVjLT5jZGVmaW5lLmVuYWJsZV9wY2JlZXAgPSAxOyAvKiBhc3N1bWUgYWx3YXlzIGVuYWJsZWQgKi8KKwlpZiAoYXNzICE9IGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSAmJiAoYXNzICYgMSkpCiAJCWdvdG8gZG9fc2t1OwotCX0KIAogCW5pZCA9IDB4MWQ7CiAJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDI2MCkKQEAgLTUxODAsOCArNTE4MCwyNCBAQAogI2lmZGVmIENPTkZJR19TTkRfSERBX0lOUFVUX0JFRVAKICNkZWZpbmUgc2V0X2JlZXBfYW1wKHNwZWMsIG5pZCwgaWR4LCBkaXIpIFwKIAkoKHNwZWMpLT5iZWVwX2FtcCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCBpZHgsIGRpcikpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBiZWVwX3doaXRlX2xpc3RbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjlmLCAiQVNVUyIsIDEpLAorCXt9Cit9OworCitzdGF0aWMgaW5saW5lIGludCBoYXNfY2RlZmluZV9iZWVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpxOworCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChjb2RlYy0+YnVzLT5wY2ksIGJlZXBfd2hpdGVfbGlzdCk7CisJaWYgKHEpCisJCXJldHVybiBxLT52YWx1ZTsKKwlyZXR1cm4gc3BlYy0+Y2RlZmluZS5lbmFibGVfcGNiZWVwOworfQogI2Vsc2UKICNkZWZpbmUgc2V0X2JlZXBfYW1wKHNwZWMsIG5pZCwgaWR4LCBkaXIpIC8qIE5PUCAqLworI2RlZmluZSBoYXNfY2RlZmluZV9iZWVwKGNvZGVjKQkJMAogI2VuZGlmCiAKIC8qCkBAIC0xMDU2NiwxMCArMTA1ODIsMTIgQEAKIAkJfQogCX0KIAotCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWFsY19mcmVlKGNvZGVjKTsKLQkJcmV0dXJuIGVycjsKKwlpZiAoaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKKwkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJfQogCiAJaWYgKGJvYXJkX2NvbmZpZyAhPSBBTEM4ODJfQVVUTykKQEAgLTEwNjE5LDcgKzEwNjM3LDcgQEAKIAogCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKIAotCWlmIChzcGVjLT5jZGVmaW5lLmVuYWJsZV9wY2JlZXApCisJaWYgKGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKQogCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNSwgSERBX0lOUFVUKTsKIAogCWlmIChib2FyZF9jb25maWcgPT0gQUxDODgyX0FVVE8pCkBAIC0xMjQzNSw3ICsxMjQ1Myw3IEBACiAJCX0KIAl9CiAKLQlpZiAoIXNwZWMtPm5vX2FuYWxvZykgeworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CiAJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJYWxjX2ZyZWUoY29kZWMpOwpAQCAtMTI0ODYsNyArMTI1MDQsNyBAQAogCX0KIAlpZiAoIXNwZWMtPmNhcF9taXhlciAmJiAhc3BlYy0+bm9fYW5hbG9nKQogCQlzZXRfY2FwdHVyZV9taXhlcihjb2RlYyk7Ci0JaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgc3BlYy0+Y2RlZmluZS5lbmFibGVfcGNiZWVwKQorCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKQogCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNSwgSERBX0lOUFVUKTsKIAogCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwYzsKQEAgLTE0NDU4LDEwICsxNDQ3NiwxMiBAQAogCQl9CiAJfQogCi0JZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJYWxjX2ZyZWUoY29kZWMpOwotCQlyZXR1cm4gZXJyOworCWlmIChoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkgeworCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAl9CiAKIAlpZiAoYm9hcmRfY29uZmlnICE9IEFMQzI2OV9BVVRPKQpAQCAtMTQ0OTQsNyArMTQ1MTQsNyBAQAogCiAJaWYgKCFzcGVjLT5jYXBfbWl4ZXIpCiAJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKLQlpZiAoc3BlYy0+Y2RlZmluZS5lbmFibGVfcGNiZWVwKQorCWlmIChoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkKIAkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCk7CiAKIAlpZiAoYm9hcmRfY29uZmlnID09IEFMQzI2OV9BVVRPKQpAQCAtMTg2OTEsMTAgKzE4NzExLDEyIEBACiAJCX0KIAl9CiAKLQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQlpZiAoZXJyIDwgMCkgewotCQlhbGNfZnJlZShjb2RlYyk7Ci0JCXJldHVybiBlcnI7CisJaWYgKGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CisJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQogCX0KIAogCWlmIChib2FyZF9jb25maWcgIT0gQUxDNjYyX0FVVE8pCkBAIC0xODcxNiw3ICsxODczOCw3IEBACiAJaWYgKCFzcGVjLT5jYXBfbWl4ZXIpCiAJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKIAotCWlmIChzcGVjLT5jZGVmaW5lLmVuYWJsZV9wY2JlZXApIHsKKwlpZiAoaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKIAkJc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CiAJCWNhc2UgMHgxMGVjMDY2MjoKIAkJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwppbmRleCA2ZDk0M2Y2Li4yODcwYTRmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwpAQCAtMTA1NSw3ICsxMDU1LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnRyaWRlbnQtPnJlZ19sb2NrKTsKIAotCS8vIEluaXRpbGl6ZSB0aGUgY2hhbm5lbCBhbmQgc2V0IGNoYW5uZWwgTW9kZQorCS8vIEluaXRpYWxpemUgdGhlIGNoYW5uZWwgYW5kIHNldCBjaGFubmVsIE1vZGUKIAlvdXRiKDAsIFRSSURfUkVHKHRyaWRlbnQsIExFR0FDWV9ETUFSMTUpKTsKIAogCS8vIFNldCBETUEgY2hhbm5lbCBvcGVyYXRpb24gbW9kZSByZWdpc3RlcgpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggZGYxMTBkZi4uN2FiOTE3NCAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0xMzksOCArMTM5LDggQEAKIAlwZGFjZi0+cF9kZXYgPSBsaW5rOwogCWxpbmstPnByaXYgPSBwZGFjZjsKIAotCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAxNjsKIAogCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUSB8IENPTkZfRU5BQkxFX1BVTFNFX0lSUTsKIAlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKQEAgLTIxOSw3ICsyMTksNyBAQAogCXNuZF9wcmludGRkKEtFUk5fREVCVUcgInBkYWNmX2NvbmZpZyBjYWxsZWRcbiIpOwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDU7CiAKLQlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOworCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCkBAIC0yMzEsNyArMjMxLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIAotCWlmIChzbmRfcGRhY2ZfYXNzaWduX3Jlc291cmNlcyhwZGFjZiwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEpIDwgMCkKKwlpZiAoc25kX3BkYWNmX2Fzc2lnbl9yZXNvdXJjZXMocGRhY2YsIGxpbmstPnJlc291cmNlWzBdLT5zdGFydCwKKwkJCQkJbGluay0+aXJxKSA8IDApCiAJCWdvdG8gZmFpbGVkOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5oIGIvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuaAppbmRleCBhMGE3ZWM2Li41Y2MzZTQ1IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5oCisrKyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmgKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IDYyNGI0N2EuLmE2ZWRmYzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0xNTksOCArMTU5LDggQEAKIAl2eHAtPnBfZGV2ID0gbGluazsKIAlsaW5rLT5wcml2ID0gY2hpcDsKIAotCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisJbGluay0+cmVzb3VyY2VbMF0tPmZsYWdzIHw9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWxpbmstPnJlc291cmNlWzBdLT5lbmQgPSAxNjsKIAogCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKIAlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKQEAgLTIyNiw3ICsyMjYsNyBAQAogCQlzdHJjcHkoY2hpcC0+Y2FyZC0+ZHJpdmVyLCB2eHA0NDBfaHcubmFtZSk7CiAJfQogCi0JcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIApAQCAtMjQxLDcgKzI0MSw4IEBACiAJY2hpcC0+ZGV2ID0gJmxpbmstPmRldjsKIAlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsIGNoaXAtPmRldik7CiAKLQlpZiAoc25kX3Z4cG9ja2V0X2Fzc2lnbl9yZXNvdXJjZXMoY2hpcCwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEpIDwgMCkKKwlpZiAoc25kX3Z4cG9ja2V0X2Fzc2lnbl9yZXNvdXJjZXMoY2hpcCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LAorCQkJCQkJbGluay0+aXJxKSA8IDApCiAJCWdvdG8gZmFpbGVkOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuaCBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5oCmluZGV4IGVhNGRmMTYuLmQ5MTEwNjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5oCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5oCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxzb3VuZC92eF9jb3JlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jIGIvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYwppbmRleCA2YTI3NjRlLi4zYTUwMTA2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jCisrKyBiL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIH07CiAKIC8qKgotICogbXBjODYxMF9ocGNkX21hY2hpbmVfcHJvYmU6IGluaXRhbGl6ZSB0aGUgYm9hcmQKKyAqIG1wYzg2MTBfaHBjZF9tYWNoaW5lX3Byb2JlOiBpbml0aWFsaXplIHRoZSBib2FyZAogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcGxhdGZvcm1fZGV2aWNlX2FkZCgpIGlzIGNhbGxlZC4gIEl0IGlzIHVzZWQKICAqIHRvIGluaXRpYWxpemUgdGhlIGJvYXJkLXNwZWNpZmljIGhhcmR3YXJlLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9pbXgtc3NpLmMgYi9zb3VuZC9zb2MvaW14L2lteC1zc2kuYwppbmRleCA4MGI0ZmVlLi40ZmQxM2QwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuYworKysgYi9zb3VuZC9zb2MvaW14L2lteC1zc2kuYwpAQCAtMjMsNyArMjMsNyBAQAogICogYmV0d2VlbiBwY20gZGF0YSBhbmQgR1BJTyBzdGF0dXMgZGF0YSBjaGFuZ2VzLiBPdXIgRklRIGhhbmRsZXIgaXMgbm90CiAgKiBhYmxlIHRvIGhhbmRsZSB0aGlzLCBoZW5jZSB0aGlzIGRyaXZlciBvbmx5IHdvcmtzIHdpdGggNDgwMDBIeiBzYW1wbGluZwogICogcmF0ZS4KLSAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgQUM5NyByZWdpc3RlcnMgaXMgYW5vdGhlciBjaGFsbGFuZ2UuIFRoZSBjb3JlCisgKiBSZWFkaW5nIGFuZCB3cml0aW5nIEFDOTcgcmVnaXN0ZXJzIGlzIGFub3RoZXIgY2hhbGxlbmdlLiBUaGUgY29yZQogICogcHJvdmlkZXMgdXMgc3RhdHVzIGJpdHMgd2hlbiB0aGUgcmVhZCByZWdpc3RlciBpcyB1cGRhdGVkIHdpdGggKmFub3RoZXIqCiAgKiB2YWx1ZS4gV2hlbiB3ZSByZWFkIHRoZSBzYW1lIHJlZ2lzdGVyIHR3byB0aW1lcyAoYW5kIHRoZSByZWdpc3RlciBzdGlsbAogICogY29udGFpbnMgdGhlIHNhbWUgdmFsdWUpIHRoZXNlIHN0YXR1cyBiaXRzIGFyZSBub3Qgc2V0LiBXZSB3b3JrCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IDk5ODU2OWQuLmUwNDhlMDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogfQogCiAvKgotICogQXR0ZW1wdCB0byBpbml0aWFsaXNlIGFueSB1bmluaXRhbGlzZWQgY2FyZHMuICBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBBdHRlbXB0IHRvIGluaXRpYWxpc2UgYW55IHVuaW5pdGlhbGlzZWQgY2FyZHMuICBNdXN0IGJlIGNhbGxlZCB3aXRoCiAgKiBjbGllbnRfbXV0ZXguCiAgKi8KIHN0YXRpYyB2b2lkIHNuZF9zb2NfaW5zdGFudGlhdGVfY2FyZHModm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYyBiL3NvdW5kL3NwYXJjL2FtZDc5MzAuYwppbmRleCA3MTIyMWZkLi45ZWIxYTRlIDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKKysrIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCXN0cnVjdCBzbmRfYW1kNzkzMCAqYW1kOwogCWludCBlcnIsIGlycTsKIAotCWlycSA9IG9wLT5pcnFzWzBdOworCWlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCiAJaWYgKGRldl9udW0gPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTA3NSw3ICsxMDc1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYW1kNzkzMF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYW1kNzkzMF9zYnVzX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZhbWQ3OTMwX3NidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFtZDc5MzBfZXhpdCh2b2lkKQpAQCAtMTA5Miw3ICsxMDkyLDcgQEAKIAogCWFtZDc5MzBfbGlzdCA9IE5VTEw7CiAKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmYW1kNzkzMF9zYnVzX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmFtZDc5MzBfc2J1c19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbWQ3OTMwX2luaXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvY3M0MjMxLmMgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwppbmRleCBmYjRjNmYyLi42ODU3MGVlIDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9jczQyMzEuYworKysgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwpAQCAtMTgzMiwxNCArMTgzMiwxNCBAQAogCWNoaXAtPmNfZG1hLnJlcXVlc3QgPSBzYnVzX2RtYV9yZXF1ZXN0OwogCWNoaXAtPmNfZG1hLmFkZHJlc3MgPSBzYnVzX2RtYV9hZGRyOwogCi0JaWYgKHJlcXVlc3RfaXJxKG9wLT5pcnFzWzBdLCBzbmRfY3M0MjMxX3NidXNfaW50ZXJydXB0LAorCWlmIChyZXF1ZXN0X2lycShvcC0+YXJjaGRhdGEuaXJxc1swXSwgc25kX2NzNDIzMV9zYnVzX2ludGVycnVwdCwKIAkJCUlSUUZfU0hBUkVELCAiY3M0MjMxIiwgY2hpcCkpIHsKIAkJc25kX3ByaW50ZGQoImNzNDIzMS0lZDogVW5hYmxlIHRvIGdyYWIgU0JVUyBJUlEgJWRcbiIsCi0JCQkgICAgZGV2LCBvcC0+aXJxc1swXSk7CisJCQkgICAgZGV2LCBvcC0+YXJjaGRhdGEuaXJxc1swXSk7CiAJCXNuZF9jczQyMzFfc2J1c19mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KLQljaGlwLT5pcnFbMF0gPSBvcC0+aXJxc1swXTsKKwljaGlwLT5pcnFbMF0gPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAogCWlmIChzbmRfY3M0MjMxX3Byb2JlKGNoaXApIDwgMCkgewogCQlzbmRfY3M0MjMxX3NidXNfZnJlZShjaGlwKTsKQEAgLTE4NzAsNyArMTg3MCw3IEBACiAJCWNhcmQtPnNob3J0bmFtZSwKIAkJcnAtPmZsYWdzICYgMHhmZkwsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpcnAtPnN0YXJ0LAotCQlvcC0+aXJxc1swXSk7CisJCW9wLT5hcmNoZGF0YS5pcnFzWzBdKTsKIAogCWVyciA9IHNuZF9jczQyMzFfc2J1c19jcmVhdGUoY2FyZCwgb3AsIGRldik7CiAJaWYgKGVyciA8IDApIHsKQEAgLTE5NzksMTIgKzE5NzksMTIgQEAKIAljaGlwLT5jX2RtYS5lYnVzX2luZm8uZmxhZ3MgPSBFQlVTX0RNQV9GTEFHX1VTRV9FQkRNQV9IQU5ETEVSOwogCWNoaXAtPmNfZG1hLmVidXNfaW5mby5jYWxsYmFjayA9IHNuZF9jczQyMzFfZWJ1c19jYXB0dXJlX2NhbGxiYWNrOwogCWNoaXAtPmNfZG1hLmVidXNfaW5mby5jbGllbnRfY29va2llID0gY2hpcDsKLQljaGlwLT5jX2RtYS5lYnVzX2luZm8uaXJxID0gb3AtPmlycXNbMF07CisJY2hpcC0+Y19kbWEuZWJ1c19pbmZvLmlycSA9IG9wLT5hcmNoZGF0YS5pcnFzWzBdOwogCXN0cmNweShjaGlwLT5wX2RtYS5lYnVzX2luZm8ubmFtZSwgImNzNDIzMShwbGF5KSIpOwogCWNoaXAtPnBfZG1hLmVidXNfaW5mby5mbGFncyA9IEVCVVNfRE1BX0ZMQUdfVVNFX0VCRE1BX0hBTkRMRVI7CiAJY2hpcC0+cF9kbWEuZWJ1c19pbmZvLmNhbGxiYWNrID0gc25kX2NzNDIzMV9lYnVzX3BsYXlfY2FsbGJhY2s7CiAJY2hpcC0+cF9kbWEuZWJ1c19pbmZvLmNsaWVudF9jb29raWUgPSBjaGlwOwotCWNoaXAtPnBfZG1hLmVidXNfaW5mby5pcnEgPSBvcC0+aXJxc1sxXTsKKwljaGlwLT5wX2RtYS5lYnVzX2luZm8uaXJxID0gb3AtPmFyY2hkYXRhLmlycXNbMV07CiAKIAljaGlwLT5wX2RtYS5wcmVwYXJlID0gX2VidXNfZG1hX3ByZXBhcmU7CiAJY2hpcC0+cF9kbWEuZW5hYmxlID0gX2VidXNfZG1hX2VuYWJsZTsKQEAgLTIwNjAsNyArMjA2MCw3IEBACiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWxseCwgaXJxICVkIiwKIAkJY2FyZC0+c2hvcnRuYW1lLAogCQlvcC0+cmVzb3VyY2VbMF0uc3RhcnQsCi0JCW9wLT5pcnFzWzBdKTsKKwkJb3AtPmFyY2hkYXRhLmlycXNbMF0pOwogCiAJZXJyID0gc25kX2NzNDIzMV9lYnVzX2NyZWF0ZShjYXJkLCBvcCwgZGV2KTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtMjEyMCwxMiArMjEyMCwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjczQyMzFfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzMV9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY3M0MjMxX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjczQyMzFfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZjczQyMzFfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmY3M0MjMxX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGNzNDIzMV9pbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2RicmkuYyBiL3NvdW5kL3NwYXJjL2RicmkuYwppbmRleCAxNTU3YmYxLi5jNDIxOTAxIDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9kYnJpLmMKKysrIGIvc291bmQvc3BhcmMvZGJyaS5jCkBAIC0yNjA4LDcgKzI2MDgsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpcnEgPSBvcC0+aXJxc1swXTsKKwlpcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKIAlpZiAoaXJxIDw9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJEQlJJLSVkOiBObyBJUlEuXG4iLCBkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI2OTksMTIgKzI2OTksMTIgQEAKIC8qIFByb2JlIGZvciB0aGUgZGJyaSBjaGlwIGFuZCB0aGVuIGF0dGFjaCB0aGUgZHJpdmVyLiAqLwogc3RhdGljIGludCBfX2luaXQgZGJyaV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZGJyaV9zYnVzX2RyaXZlciwgJm9mX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZkYnJpX3NidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGRicmlfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZkYnJpX3NidXNfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZGJyaV9zYnVzX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGRicmlfaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvcGNtLmMgYi9zb3VuZC91c2IvcGNtLmMKaW5kZXggNDU2ODI5OC4uMzYzNGNlZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3BjbS5jCisrKyBiL3NvdW5kL3VzYi9wY20uYwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJCW1pbl9kYXRhaW50ZXJ2YWwgPSBtaW4obWluX2RhdGFpbnRlcnZhbCwgZnAtPmRhdGFpbnRlcnZhbCk7CiAJfQogCWlmIChtaW5fZGF0YWludGVydmFsID09IDB4ZmYpIHsKLQkJaHdjX2RlYnVnKCIgIC0tPiBnZXQgZW10cHlcbiIpOworCQlod2NfZGVidWcoIiAgLS0+IGdldCBlbXB0eVxuIik7CiAJCWl0LT5lbXB0eSA9IDE7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZSBiL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZQppbmRleCBlMWQ2MGQ3Li5jYjQzMjg5IDEwMDY0NAotLS0gYS90b29scy9wZXJmLy5naXRpZ25vcmUKKysrIGIvdG9vbHMvcGVyZi8uZ2l0aWdub3JlCkBAIC0xOCwzICsxOCw1IEBACiB0YWdzCiBUQUdTCiBjc2NvcGUqCitjb25maWcubWFrCitjb25maWcubWFrLmF1dG9nZW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWJ1aWxkaWQtY2FjaGUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1jYWNoZS50eHQKaW5kZXggNWQxYTk1MC4uYzEwNTc3MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1jYWNoZS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1jYWNoZS50eHQKQEAgLTEyLDkgKzEyLDkgQEAKIAogREVTQ1JJUFRJT04KIC0tLS0tLS0tLS0tCi1UaGlzIGNvbW1hbmQgbWFuYWdlcyB0aGUgYnVpbGQtaWQgY2FjaGUuIEl0IGNhbiBhZGQgYW5kIHJlbW92ZSBmaWxlcyB0byB0aGUKLWNhY2hlLiBJbiB0aGUgZnV0dXJlIGl0IHNob3VsZCBhcyB3ZWxsIHB1cmdlIG9sZGVyIGVudHJpZXMsIHNldCB1cHBlciBsaW1pdHMKLWZvciB0aGUgc3BhY2UgdXNlZCBieSB0aGUgY2FjaGUsIGV0Yy4KK1RoaXMgY29tbWFuZCBtYW5hZ2VzIHRoZSBidWlsZC1pZCBjYWNoZS4gSXQgY2FuIGFkZCBhbmQgcmVtb3ZlIGZpbGVzIHRvL2Zyb20KK3RoZSBjYWNoZS4gSW4gdGhlIGZ1dHVyZSBpdCBzaG91bGQgYXMgd2VsbCBwdXJnZSBvbGRlciBlbnRyaWVzLCBzZXQgdXBwZXIKK2xpbWl0cyBmb3IgdGhlIHNwYWNlIHVzZWQgYnkgdGhlIGNhY2hlLCBldGMuCiAKIE9QVElPTlMKIC0tLS0tLS0KQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgQWRkIHNwZWNpZmllZCBmaWxlIHRvIHRoZSBjYWNoZS4KIC1yOjoKIC0tcmVtb3ZlPTo6Ci0gICAgICAgIFJlbW92ZSBzcGVjaWZpZWQgZmlsZSB0byB0aGUgY2FjaGUuCisgICAgICAgIFJlbW92ZSBzcGVjaWZpZWQgZmlsZSBmcm9tIHRoZSBjYWNoZS4KIC12OjoKIC0tdmVyYm9zZTo6CiAJQmUgbW9yZSB2ZXJib3NlLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CmluZGV4IDk0YTI1OGMuLjI3ZDUyZGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKQEAgLTMxLDYgKzMxLDEwIEBACiAtLXZtbGludXg9UEFUSDo6CiAJU3BlY2lmeSB2bWxpbnV4IHBhdGggd2hpY2ggaGFzIGRlYnVnaW5mbyAoRHdhcmYgYmluYXJ5KS4KIAorLXM6OgorLS1zb3VyY2U9UEFUSDo6CisJU3BlY2lmeSBwYXRoIHRvIGtlcm5lbCBzb3VyY2UuCisKIC12OjoKIC0tdmVyYm9zZTo6CiAgICAgICAgIEJlIG1vcmUgdmVyYm9zZSAoc2hvdyBwYXJzZWQgYXJndW1lbnRzLCBldGMpLgpAQCAtOTAsOCArOTQsOCBAQAogCiAgW05BTUU9XUxPQ0FMVkFSfCRyZXR2YWx8JVJFR3xAU1lNQk9MWzpUWVBFXQogCi0nTkFNRScgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoaXMgYXJndW1lbnQgKG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIG5hbWUgb2YgbG9jYWwgdmFyaWFibGUsIGxvY2FsIGRhdGEgc3RydWN0dXJlIG1lbWJlciAoZS5nLiB2YXItPmZpZWxkLCB2YXIuZmllbGQyKSwgb3Iga3Byb2JlLXRyYWNlciBhcmd1bWVudCBmb3JtYXQgKGUuZy4gJHJldHZhbCwgJWF4LCBldGMpLiBOb3RlIHRoYXQgdGhlIG5hbWUgb2YgdGhpcyBhcmd1bWVudCB3aWxsIGJlIHNldCBhcyB0aGUgbGFzdCBtZW1iZXIgbmFtZSBpZiB5b3Ugc3BlY2lmeSBhIGxvY2FsIGRhdGEgc3RydWN0dXJlIG1lbWJlciAoZS5nLiBmaWVsZDIgZm9yICd2YXItPmZpZWxkMS5maWVsZDInLikKLSdUWVBFJyBjYXN0cyB0aGUgdHlwZSBvZiB0aGlzIGFyZ3VtZW50IChvcHRpb25hbCkuIElmIG9taXR0ZWQsIHBlcmYgcHJvYmUgYXV0b21hdGljYWxseSBzZXQgdGhlIHR5cGUgYmFzZWQgb24gZGVidWdpbmZvLgorJ05BTUUnIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGlzIGFyZ3VtZW50IChvcHRpb25hbCkuIFlvdSBjYW4gdXNlIHRoZSBuYW1lIG9mIGxvY2FsIHZhcmlhYmxlLCBsb2NhbCBkYXRhIHN0cnVjdHVyZSBtZW1iZXIgKGUuZy4gdmFyLT5maWVsZCwgdmFyLmZpZWxkMiksIGxvY2FsIGFycmF5IHdpdGggZml4ZWQgaW5kZXggKGUuZy4gYXJyYXlbMV0sIHZhci0+YXJyYXlbMF0sIHZhci0+cG9pbnRlclsyXSksIG9yIGtwcm9iZS10cmFjZXIgYXJndW1lbnQgZm9ybWF0IChlLmcuICRyZXR2YWwsICVheCwgZXRjKS4gTm90ZSB0aGF0IHRoZSBuYW1lIG9mIHRoaXMgYXJndW1lbnQgd2lsbCBiZSBzZXQgYXMgdGhlIGxhc3QgbWVtYmVyIG5hbWUgaWYgeW91IHNwZWNpZnkgYSBsb2NhbCBkYXRhIHN0cnVjdHVyZSBtZW1iZXIgKGUuZy4gZmllbGQyIGZvciAndmFyLT5maWVsZDEuZmllbGQyJy4pCisnVFlQRScgY2FzdHMgdGhlIHR5cGUgb2YgdGhpcyBhcmd1bWVudCAob3B0aW9uYWwpLiBJZiBvbWl0dGVkLCBwZXJmIHByb2JlIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIGJhc2VkIG9uIGRlYnVnaW5mby4gWW91IGNhbiBzcGVjaWZ5ICdzdHJpbmcnIHR5cGUgb25seSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggaXMgYW4gYXJyYXkgb2Ygb3IgYSBwb2ludGVyIHRvICdjaGFyJyBvciAndW5zaWduZWQgY2hhcicgdHlwZS4KIAogTElORSBTWU5UQVgKIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dAppbmRleCAzNGUyNTVmLi4zZWUyN2RjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQKQEAgLTEwMyw2ICsxMDMsMTkgQEAKIC0tcmF3LXNhbXBsZXM6OgogQ29sbGVjdCByYXcgc2FtcGxlIHJlY29yZHMgZnJvbSBhbGwgb3BlbmVkIGNvdW50ZXJzIChkZWZhdWx0IGZvciB0cmFjZXBvaW50IGNvdW50ZXJzKS4KIAorLUM6OgorLS1jcHU6OgorQ29sbGVjdCBzYW1wbGVzIG9ubHkgb24gdGhlIGxpc3Qgb2YgY3B1cyBwcm92aWRlZC4gTXVsdGlwbGUgQ1BVcyBjYW4gYmUgcHJvdmlkZWQgYXMgYQorY29tbWEtc3BlcmF0ZWQgbGlzdCB3aXRoIG5vIHNwYWNlOiAwLDEuIFJhbmdlcyBvZiBDUFVzIGFyZSBzcGVjaWZpZWQgd2l0aCAtOiAwLTIuCitJbiBwZXItdGhyZWFkIG1vZGUgd2l0aCBpbmhlcml0YW5jZSBtb2RlIG9uIChkZWZhdWx0KSwgc2FtcGxlcyBhcmUgY2FwdHVyZWQgb25seSB3aGVuCit0aGUgdGhyZWFkIGV4ZWN1dGVzIG9uIHRoZSBkZXNpZ25hdGVkIENQVXMuIERlZmF1bHQgaXMgdG8gbW9uaXRvciBhbGwgQ1BVcy4KKworLU46OgorLS1uby1idWlsZGlkLWNhY2hlOjoKK0RvIG5vdCB1cGRhdGUgdGhlIGJ1aWxpZCBjYWNoZS4gVGhpcyBzYXZlcyBzb21lIG92ZXJoZWFkIGluIHNpdHVhdGlvbnMKK3doZXJlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgcGVyZi5kYXRhIGZpbGUgKHdoaWNoIGluY2x1ZGVzIGJ1aWxkaWRzKQoraXMgc3VmZmljaWVudC4KKwogU0VFIEFMU08KIC0tLS0tLS0tCiBsaW5rcGVyZjpwZXJmLXN0YXRbMV0sIGxpbmtwZXJmOnBlcmYtbGlzdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc3RhdC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zdGF0LnR4dAppbmRleCA5MDlmYTc2Li40YjNhMmQ0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zdGF0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zdGF0LnR4dApAQCAtNDYsNiArNDYsMTMgQEAKIC1COjoKICAgICAgICAgcHJpbnQgbGFyZ2UgbnVtYmVycyB3aXRoIHRob3VzYW5kcycgc2VwYXJhdG9ycyBhY2NvcmRpbmcgdG8gbG9jYWxlCiAKKy1DOjoKKy0tY3B1PTo6CitDb3VudCBvbmx5IG9uIHRoZSBsaXN0IG9mIGNwdXMgcHJvdmlkZWQuIE11bHRpcGxlIENQVXMgY2FuIGJlIHByb3ZpZGVkIGFzIGEKK2NvbW1hLXNwZXJhdGVkIGxpc3Qgd2l0aCBubyBzcGFjZTogMCwxLiBSYW5nZXMgb2YgQ1BVcyBhcmUgc3BlY2lmaWVkIHdpdGggLTogMC0yLgorSW4gcGVyLXRocmVhZCBtb2RlLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLiBUaGUgLWEgb3B0aW9uIGlzIHN0aWxsIG5lY2Vzc2FyeQordG8gYWN0aXZhdGUgc3lzdGVtLXdpZGUgbW9uaXRvcmluZy4gRGVmYXVsdCBpcyB0byBjb3VudCBvbiBhbGwgQ1BVcy4KKwogRVhBTVBMRVMKIC0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRvcC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10b3AudHh0CmluZGV4IDc4NWI5ZmMuLjFmOTY4NzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRvcC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdG9wLnR4dApAQCAtMjUsOSArMjUsMTEgQEAKIC0tY291bnQ9PGNvdW50Pjo6CiAJRXZlbnQgcGVyaW9kIHRvIHNhbXBsZS4KIAotLUMgPGNwdT46OgotLS1DUFU9PGNwdT46OgotCUNQVSB0byBwcm9maWxlLgorLUMgPGNwdS1saXN0Pjo6CistLWNwdT08Y3B1Pjo6CitNb25pdG9yIG9ubHkgb24gdGhlIGxpc3Qgb2YgY3B1cyBwcm92aWRlZC4gTXVsdGlwbGUgQ1BVcyBjYW4gYmUgcHJvdmlkZWQgYXMgYQorY29tbWEtc3BlcmF0ZWQgbGlzdCB3aXRoIG5vIHNwYWNlOiAwLDEuIFJhbmdlcyBvZiBDUFVzIGFyZSBzcGVjaWZpZWQgd2l0aCAtOiAwLTIuCitEZWZhdWx0IGlzIHRvIG1vbml0b3IgYWxsIENQVVMuCiAKIC1kIDxzZWNvbmRzPjo6CiAtLWRlbGF5PTxzZWNvbmRzPjo6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL01BTklGRVNUIGIvdG9vbHMvcGVyZi9NQU5JRkVTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdmYzBjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9NQU5JRkVTVApAQCAtMCwwICsxLDEyIEBACit0b29scy9wZXJmCitpbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAoraW5jbHVkZS9saW51eC9yYnRyZWUuaAoraW5jbHVkZS9saW51eC9saXN0LmgKK2luY2x1ZGUvbGludXgvaGFzaC5oCitpbmNsdWRlL2xpbnV4L3N0cmluZ2lmeS5oCitsaWIvcmJ0cmVlLmMKK2luY2x1ZGUvbGludXgvc3dhYi5oCithcmNoLyovaW5jbHVkZS9hc20vdW5pc3RkKi5oCitpbmNsdWRlL2xpbnV4L3BvaXNvbi5oCitpbmNsdWRlL2xpbnV4L21hZ2ljLmgKK2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQppbmRleCBkNzVjMjhhLi4yNmY2MjZkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTI4NSwxNCArMjg1LDEwIEBACiAJUVVJRVRfU1RERVJSID0gIj4vZGV2L251bGwgMj4mMSIKIGVuZGlmCiAKLUJJVEJVQ0tFVCA9ICIvZGV2L251bGwiCistaW5jbHVkZSBmZWF0dXJlLXRlc3RzLm1hawogCi1pZm5lcSAoJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8c3RkaW8uaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IHJldHVybiBwdXRzKFwiaGlcIik7IH0nKSB8ICQoQ0MpIC14IGMgLSAkKEFMTF9DRkxBR1MpIC1vICQoQklUQlVDS0VUKSAiJChRVUlFVF9TVERFUlIpIiAmJiBlY2hvIHkiKSwgeSkKLQlCSVRCVUNLRVQgPSAucGVyZi5kZXYubnVsbAotZW5kaWYKLQotaWZlcSAoJChzaGVsbCBzaCAtYyAiZWNobyAnaW50IGZvbyh2b2lkKSB7Y2hhciBYWzJdOyByZXR1cm4gMzt9JyB8ICQoQ0MpIC14IGMgLWMgLVdlcnJvciAtZnN0YWNrLXByb3RlY3Rvci1hbGwgLSAtbyAkKEJJVEJVQ0tFVCkgIiQoUVVJRVRfU1RERVJSKSIgJiYgZWNobyB5IiksIHkpCi0gIENGTEFHUyA6PSAkKENGTEFHUykgLWZzdGFjay1wcm90ZWN0b3ItYWxsCitpZmVxICgkKGNhbGwgdHJ5LWNjLCQoU09VUkNFX0hFTExPKSwtV2Vycm9yIC1mc3RhY2stcHJvdGVjdG9yLWFsbCkseSkKKwlDRkxBR1MgOj0gJChDRkxBR1MpIC1mc3RhY2stcHJvdGVjdG9yLWFsbAogZW5kaWYKIAogCkBAIC01MDgsNyArNTA0LDggQEAKIC1pbmNsdWRlIGNvbmZpZy5tYWsKIAogaWZuZGVmIE5PX0RXQVJGCi1pZm5lcSAoJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8ZHdhcmYuaD4nOyBlY2hvICdcI2luY2x1ZGUgPGxpYmR3Lmg+JzsgZWNobyAnXCNpbmNsdWRlIDx2ZXJzaW9uLmg+JzsgZWNobyAnXCNpZm5kZWYgX0VMRlVUSUxTX1BSRVJFUSc7IGVjaG8gJ1wjZXJyb3InOyBlY2hvICdcI2VuZGlmJzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBEd2FyZiAqZGJnOyBkYmcgPSBkd2FyZl9iZWdpbigwLCBEV0FSRl9DX1JFQUQpOyByZXR1cm4gKGxvbmcpZGJnOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtSS91c3IvaW5jbHVkZS9lbGZ1dGlscyAtbGR3IC1sZWxmIC1vICQoQklUQlVDS0VUKSAkKEFMTF9MREZMQUdTKSAkKEVYVExJQlMpICIkKFFVSUVUX1NUREVSUikiICYmIGVjaG8geSIpLCB5KQorRkxBR1NfRFdBUkY9JChBTExfQ0ZMQUdTKSAtSS91c3IvaW5jbHVkZS9lbGZ1dGlscyAtbGR3IC1sZWxmICQoQUxMX0xERkxBR1MpICQoRVhUTElCUykKK2lmbmVxICgkKGNhbGwgdHJ5LWNjLCQoU09VUkNFX0RXQVJGKSwkKEZMQUdTX0RXQVJGKSkseSkKIAltc2cgOj0gJCh3YXJuaW5nIE5vIGxpYmR3LmggZm91bmQgb3Igb2xkIGxpYmR3LmggZm91bmQgb3IgZWxmdXRpbHMgaXMgb2xkZXIgdGhhbiAwLjEzOCwgZGlzYWJsZXMgZHdhcmYgc3VwcG9ydC4gUGxlYXNlIGluc3RhbGwgbmV3IGVsZnV0aWxzLWRldmVsL2xpYmR3LWRldik7CiAJTk9fRFdBUkYgOj0gMQogZW5kaWYgIyBEd2FyZiBzdXBwb3J0CkBAIC01MzYsMTYgKzUzMywxOCBAQAogCUJBU0lDX0NGTEFHUyArPSAtSSQoT1VUUFVUKQogZW5kaWYKIAotaWZlcSAoJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8bGliZWxmLmg+JzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBFbGYgKiBlbGYgPSBlbGZfYmVnaW4oMCwgRUxGX0NfUkVBRCwgMCk7IHJldHVybiAobG9uZyllbGY7IH0nKSB8ICQoQ0MpIC14IGMgLSAkKEFMTF9DRkxBR1MpIC1vICQoQklUQlVDS0VUKSAkKEFMTF9MREZMQUdTKSAkKEVYVExJQlMpICIkKFFVSUVUX1NUREVSUikiICYmIGVjaG8geSIpLCB5KQotaWZuZXEgKCQoc2hlbGwgc2ggLWMgIihlY2hvICdcI2luY2x1ZGUgPGdudS9saWJjLXZlcnNpb24uaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IGNvbnN0IGNoYXIgKiB2ZXJzaW9uID0gZ251X2dldF9saWJjX3ZlcnNpb24oKTsgcmV0dXJuIChsb25nKXZlcnNpb247IH0nKSB8ICQoQ0MpIC14IGMgLSAkKEFMTF9DRkxBR1MpIC1vICQoQklUQlVDS0VUKSAkKEFMTF9MREZMQUdTKSAkKEVYVExJQlMpICIkKFFVSUVUX1NUREVSUikiICYmIGVjaG8geSIpLCB5KQotCW1zZyA6PSAkKGVycm9yIE5vIGdudS9saWJjLXZlcnNpb24uaCBmb3VuZCwgcGxlYXNlIGluc3RhbGwgZ2xpYmMtZGV2W2VsXS9nbGliYy1zdGF0aWMpOworRkxBR1NfTElCRUxGPSQoQUxMX0NGTEFHUykgJChBTExfTERGTEFHUykgJChFWFRMSUJTKQoraWZuZXEgKCQoY2FsbCB0cnktY2MsJChTT1VSQ0VfTElCRUxGKSwkKEZMQUdTX0xJQkVMRikpLHkpCisJRkxBR1NfR0xJQkM9JChBTExfQ0ZMQUdTKSAkKEFMTF9MREZMQUdTKQorCWlmbmVxICgkKGNhbGwgdHJ5LWNjLCQoU09VUkNFX0dMSUJDKSwkKEZMQUdTX0dMSUJDKSkseSkKKwkJbXNnIDo9ICQoZXJyb3IgTm8gZ251L2xpYmMtdmVyc2lvbi5oIGZvdW5kLCBwbGVhc2UgaW5zdGFsbCBnbGliYy1kZXZbZWxdL2dsaWJjLXN0YXRpYyk7CisJZWxzZQorCQltc2cgOj0gJChlcnJvciBObyBsaWJlbGYuaC9saWJlbGYgZm91bmQsIHBsZWFzZSBpbnN0YWxsIGxpYmVsZi1kZXYvZWxmdXRpbHMtbGliZWxmLWRldmVsKTsKKwllbmRpZgogZW5kaWYKIAotCWlmbmVxICgkKHNoZWxsIHNoIC1jICIoZWNobyAnXCNpbmNsdWRlIDxsaWJlbGYuaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IEVsZiAqIGVsZiA9IGVsZl9iZWdpbigwLCBFTEZfQ19SRUFEX01NQVAsIDApOyByZXR1cm4gKGxvbmcpZWxmOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtbyAkKEJJVEJVQ0tFVCkgJChBTExfTERGTEFHUykgJChFWFRMSUJTKSAiJChRVUlFVF9TVERFUlIpIiAmJiBlY2hvIHkiKSwgeSkKLQkJQkFTSUNfQ0ZMQUdTICs9IC1ETElCRUxGX05PX01NQVAKLQllbmRpZgotZWxzZQotCW1zZyA6PSAkKGVycm9yIE5vIGxpYmVsZi5oL2xpYmVsZiBmb3VuZCwgcGxlYXNlIGluc3RhbGwgbGliZWxmLWRldi9lbGZ1dGlscy1saWJlbGYtZGV2ZWwgYW5kIGdsaWJjLWRldltlbF0pOworaWZuZXEgKCQoY2FsbCB0cnktY2MsJChTT1VSQ0VfRUxGX01NQVApLCQoRkxBR1NfQ09NTU9OKSkseSkKKwlCQVNJQ19DRkxBR1MgKz0gLURMSUJFTEZfTk9fTU1BUAogZW5kaWYKIAogaWZuZGVmIE5PX0RXQVJGCkBAIC01NjEsNjQgKzU2MCw3MyBAQAogaWZkZWYgTk9fTkVXVAogCUJBU0lDX0NGTEFHUyArPSAtRE5PX05FV1RfU1VQUE9SVAogZWxzZQotaWZuZXEgKCQoc2hlbGwgc2ggLWMgIihlY2hvICdcI2luY2x1ZGUgPG5ld3QuaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IG5ld3RJbml0KCk7IG5ld3RDbHMoKTsgcmV0dXJuIG5ld3RGaW5pc2hlZCgpOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCAtbG5ld3QgLW8gJChCSVRCVUNLRVQpICQoQUxMX0xERkxBR1MpICQoRVhUTElCUykgIiQoUVVJRVRfU1RERVJSKSIgJiYgZWNobyB5IiksIHkpCi0JbXNnIDo9ICQod2FybmluZyBuZXd0IG5vdCBmb3VuZCwgZGlzYWJsZXMgVFVJIHN1cHBvcnQuIFBsZWFzZSBpbnN0YWxsIG5ld3QtZGV2ZWwgb3IgbGlibmV3dC1kZXYpOwotCUJBU0lDX0NGTEFHUyArPSAtRE5PX05FV1RfU1VQUE9SVAotZWxzZQotCSMgRmVkb3JhIGhhcyAvdXNyL2luY2x1ZGUvc2xhbmcvc2xhbmcuaCwgYnV0IHVidW50dSAvdXNyL2luY2x1ZGUvc2xhbmcuaAotCUJBU0lDX0NGTEFHUyArPSAtSS91c3IvaW5jbHVkZS9zbGFuZwotCUVYVExJQlMgKz0gLWxuZXd0IC1sc2xhbmcKLQlMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL25ld3QubwotZW5kaWYKLWVuZGlmICMgTk9fTkVXVAotCi1pZm5kZWYgTk9fTElCUEVSTAotUEVSTF9FTUJFRF9MRE9QVFMgPSBgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBsZG9wdHMgMj4vZGV2L251bGxgCi1QRVJMX0VNQkVEX0NDT1BUUyA9IGBwZXJsIC1NRXh0VXRpbHM6OkVtYmVkIC1lIGNjb3B0cyAyPi9kZXYvbnVsbGAKKwlGTEFHU19ORVdUPSQoQUxMX0NGTEFHUykgJChBTExfTERGTEFHUykgJChFWFRMSUJTKSAtbG5ld3QKKwlpZm5lcSAoJChjYWxsIHRyeS1jYywkKFNPVVJDRV9ORVdUKSwkKEZMQUdTX05FV1QpKSx5KQorCQltc2cgOj0gJCh3YXJuaW5nIG5ld3Qgbm90IGZvdW5kLCBkaXNhYmxlcyBUVUkgc3VwcG9ydC4gUGxlYXNlIGluc3RhbGwgbmV3dC1kZXZlbCBvciBsaWJuZXd0LWRldik7CisJCUJBU0lDX0NGTEFHUyArPSAtRE5PX05FV1RfU1VQUE9SVAorCWVsc2UKKwkJIyBGZWRvcmEgaGFzIC91c3IvaW5jbHVkZS9zbGFuZy9zbGFuZy5oLCBidXQgdWJ1bnR1IC91c3IvaW5jbHVkZS9zbGFuZy5oCisJCUJBU0lDX0NGTEFHUyArPSAtSS91c3IvaW5jbHVkZS9zbGFuZworCQlFWFRMSUJTICs9IC1sbmV3dCAtbHNsYW5nCisJCUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvbmV3dC5vCisJZW5kaWYKIGVuZGlmCiAKLWlmbmVxICgkKHNoZWxsIHNoIC1jICIoZWNobyAnXCNpbmNsdWRlIDxFWFRFUk4uaD4nOyBlY2hvICdcI2luY2x1ZGUgPHBlcmwuaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IHBlcmxfYWxsb2MoKTsgcmV0dXJuIDA7IH0nKSB8ICQoQ0MpIC14IGMgLSAkKFBFUkxfRU1CRURfQ0NPUFRTKSAtbyAkKEJJVEJVQ0tFVCkgJChQRVJMX0VNQkVEX0xET1BUUykgPiAvZGV2L251bGwgMj4mMSAmJiBlY2hvIHkiKSwgeSkKK2lmZGVmIE5PX0xJQlBFUkwKIAlCQVNJQ19DRkxBR1MgKz0gLUROT19MSUJQRVJMCiBlbHNlCi0JQUxMX0xERkxBR1MgKz0gJChQRVJMX0VNQkVEX0xET1BUUykKLQlMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwubwotCUxJQl9PQkpTICs9ICQoT1VUUFVUKXNjcmlwdHMvcGVybC9QZXJmLVRyYWNlLVV0aWwvQ29udGV4dC5vCisJUEVSTF9FTUJFRF9MRE9QVFMgPSBgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBsZG9wdHMgMj4vZGV2L251bGxgCisJUEVSTF9FTUJFRF9DQ09QVFMgPSBgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBjY29wdHMgMj4vZGV2L251bGxgCisJRkxBR1NfUEVSTF9FTUJFRD0kKFBFUkxfRU1CRURfQ0NPUFRTKSAkKFBFUkxfRU1CRURfTERPUFRTKQorCisJaWZuZXEgKCQoY2FsbCB0cnktY2MsJChTT1VSQ0VfUEVSTF9FTUJFRCksJChGTEFHU19QRVJMX0VNQkVEKSkseSkKKwkJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fTElCUEVSTAorCWVsc2UKKwkJQUxMX0xERkxBR1MgKz0gJChQRVJMX0VNQkVEX0xET1BUUykKKwkJTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLm8KKwkJTElCX09CSlMgKz0gJChPVVRQVVQpc2NyaXB0cy9wZXJsL1BlcmYtVHJhY2UtVXRpbC9Db250ZXh0Lm8KKwllbmRpZgogZW5kaWYKIAotaWZuZGVmIE5PX0xJQlBZVEhPTgotUFlUSE9OX0VNQkVEX0xET1BUUyA9IGBweXRob24tY29uZmlnIC0tbGRmbGFncyAyPi9kZXYvbnVsbGAKLVBZVEhPTl9FTUJFRF9DQ09QVFMgPSBgcHl0aG9uLWNvbmZpZyAtLWNmbGFncyAyPi9kZXYvbnVsbGAKLWVuZGlmCi0KLWlmbmVxICgkKHNoZWxsIHNoIC1jICIoZWNobyAnXCNpbmNsdWRlIDxQeXRob24uaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IFB5X0luaXRpYWxpemUoKTsgcmV0dXJuIDA7IH0nKSB8ICQoQ0MpIC14IGMgLSAkKFBZVEhPTl9FTUJFRF9DQ09QVFMpIC1vICQoQklUQlVDS0VUKSAkKFBZVEhPTl9FTUJFRF9MRE9QVFMpID4gL2Rldi9udWxsIDI+JjEgJiYgZWNobyB5IiksIHkpCitpZmRlZiBOT19MSUJQWVRIT04KIAlCQVNJQ19DRkxBR1MgKz0gLUROT19MSUJQWVRIT04KIGVsc2UKLQlBTExfTERGTEFHUyArPSAkKFBZVEhPTl9FTUJFRF9MRE9QVFMpCi0JTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24ubwotCUxJQl9PQkpTICs9ICQoT1VUUFVUKXNjcmlwdHMvcHl0aG9uL1BlcmYtVHJhY2UtVXRpbC9Db250ZXh0Lm8KKwlQWVRIT05fRU1CRURfTERPUFRTID0gYHB5dGhvbi1jb25maWcgLS1sZGZsYWdzIDI+L2Rldi9udWxsYAorCVBZVEhPTl9FTUJFRF9DQ09QVFMgPSBgcHl0aG9uLWNvbmZpZyAtLWNmbGFncyAyPi9kZXYvbnVsbGAKKwlGTEFHU19QWVRIT05fRU1CRUQ9JChQWVRIT05fRU1CRURfQ0NPUFRTKSAkKFBZVEhPTl9FTUJFRF9MRE9QVFMpCisJaWZuZXEgKCQoY2FsbCB0cnktY2MsJChTT1VSQ0VfUFlUSE9OX0VNQkVEKSwkKEZMQUdTX1BZVEhPTl9FTUJFRCkpLHkpCisJCUJBU0lDX0NGTEFHUyArPSAtRE5PX0xJQlBZVEhPTgorCWVsc2UKKwkJQUxMX0xERkxBR1MgKz0gJChQWVRIT05fRU1CRURfTERPUFRTKQorCQlMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5vCisJCUxJQl9PQkpTICs9ICQoT1VUUFVUKXNjcmlwdHMvcHl0aG9uL1BlcmYtVHJhY2UtVXRpbC9Db250ZXh0Lm8KKwllbmRpZgogZW5kaWYKIAogaWZkZWYgTk9fREVNQU5HTEUKIAlCQVNJQ19DRkxBR1MgKz0gLUROT19ERU1BTkdMRQogZWxzZQotCWlmZGVmIEhBVkVfQ1BMVVNfREVNQU5HTEUKKyAgICAgICAgaWZkZWYgSEFWRV9DUExVU19ERU1BTkdMRQogCQlFWFRMSUJTICs9IC1saWJlcnR5CiAJCUJBU0lDX0NGTEFHUyArPSAtREhBVkVfQ1BMVVNfREVNQU5HTEUKLQllbHNlCi0JCWhhc19iZmQgOj0gJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8YmZkLmg+JzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBiZmRfZGVtYW5nbGUoMCwgMCwgMCk7IHJldHVybiAwOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtbyAkKEJJVEJVQ0tFVCkgJChBTExfTERGTEFHUykgJChFWFRMSUJTKSAtbGJmZCAiJChRVUlFVF9TVERFUlIpIiAmJiBlY2hvIHkiKQotCisgICAgICAgIGVsc2UKKwkJRkxBR1NfQkZEPSQoQUxMX0NGTEFHUykgJChBTExfTERGTEFHUykgJChFWFRMSUJTKSAtbGJmZAorCQloYXNfYmZkIDo9ICQoY2FsbCB0cnktY2MsJChTT1VSQ0VfQkZEKSwkKEZMQUdTX0JGRCkpCiAJCWlmZXEgKCQoaGFzX2JmZCkseSkKIAkJCUVYVExJQlMgKz0gLWxiZmQKIAkJZWxzZQotCQkJaGFzX2JmZF9pYmVydHkgOj0gJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8YmZkLmg+JzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBiZmRfZGVtYW5nbGUoMCwgMCwgMCk7IHJldHVybiAwOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtbyAkKEJJVEJVQ0tFVCkgJChBTExfTERGTEFHUykgJChFWFRMSUJTKSAtbGJmZCAtbGliZXJ0eSAiJChRVUlFVF9TVERFUlIpIiAmJiBlY2hvIHkiKQorCQkJRkxBR1NfQkZEX0lCRVJUWT0kKEZMQUdTX0JGRCkgLWxpYmVydHkKKwkJCWhhc19iZmRfaWJlcnR5IDo9ICQoY2FsbCB0cnktY2MsJChTT1VSQ0VfQkZEKSwkKEZMQUdTX0JGRF9JQkVSVFkpKQogCQkJaWZlcSAoJChoYXNfYmZkX2liZXJ0eSkseSkKIAkJCQlFWFRMSUJTICs9IC1sYmZkIC1saWJlcnR5CiAJCQllbHNlCi0JCQkJaGFzX2JmZF9pYmVydHlfeiA6PSAkKHNoZWxsIHNoIC1jICIoZWNobyAnXCNpbmNsdWRlIDxiZmQuaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IGJmZF9kZW1hbmdsZSgwLCAwLCAwKTsgcmV0dXJuIDA7IH0nKSB8ICQoQ0MpIC14IGMgLSAkKEFMTF9DRkxBR1MpIC1vICQoQklUQlVDS0VUKSAkKEFMTF9MREZMQUdTKSAkKEVYVExJQlMpIC1sYmZkIC1saWJlcnR5IC1seiAiJChRVUlFVF9TVERFUlIpIiAmJiBlY2hvIHkiKQorCQkJCUZMQUdTX0JGRF9JQkVSVFlfWj0kKEZMQUdTX0JGRF9JQkVSVFkpIC1segorCQkJCWhhc19iZmRfaWJlcnR5X3ogOj0gJChjYWxsIHRyeS1jYywkKFNPVVJDRV9CRkQpLCQoRkxBR1NfQkZEX0lCRVJUWV9aKSkKIAkJCQlpZmVxICgkKGhhc19iZmRfaWJlcnR5X3opLHkpCiAJCQkJCUVYVExJQlMgKz0gLWxiZmQgLWxpYmVydHkgLWx6CiAJCQkJZWxzZQotCQkJCQloYXNfY3BsdXNfZGVtYW5nbGUgOj0gJChzaGVsbCBzaCAtYyAiKGVjaG8gJ2V4dGVybiBjaGFyICpjcGx1c19kZW1hbmdsZShjb25zdCBjaGFyICosIGludCk7JzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBjcGx1c19kZW1hbmdsZSgwLCAwKTsgcmV0dXJuIDA7IH0nKSB8ICQoQ0MpIC14IGMgLSAkKEFMTF9DRkxBR1MpIC1vICQoQklUQlVDS0VUKSAkKEFMTF9MREZMQUdTKSAkKEVYVExJQlMpIC1saWJlcnR5ICIkKFFVSUVUX1NUREVSUikiICYmIGVjaG8geSIpCisJCQkJCUZMQUdTX0NQTFVTX0RFTUFOR0xFPSQoQUxMX0NGTEFHUykgJChBTExfTERGTEFHUykgJChFWFRMSUJTKSAtbGliZXJ0eQorCQkJCQloYXNfY3BsdXNfZGVtYW5nbGUgOj0gJChjYWxsIHRyeS1jYywkKFNPVVJDRV9DUExVU19ERU1BTkdMRSksJChGTEFHU19DUExVU19ERU1BTkdMRSkpCiAJCQkJCWlmZXEgKCQoaGFzX2NwbHVzX2RlbWFuZ2xlKSx5KQogCQkJCQkJRVhUTElCUyArPSAtbGliZXJ0eQogCQkJCQkJQkFTSUNfQ0ZMQUdTICs9IC1ESEFWRV9DUExVU19ERU1BTkdMRQpAQCAtODY3LDcgKzg3NSw3IEBACiAKIFNIRUxMID0gJChTSEVMTF9QQVRIKQogCi1hbGw6OiAucGVyZi5kZXYubnVsbCBzaGVsbF9jb21wYXRpYmlsaXR5X3Rlc3QgJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSAkKE9USEVSX1BST0dSQU1TKSAkKE9VVFBVVClQRVJGLUJVSUxELU9QVElPTlMKK2FsbDo6IHNoZWxsX2NvbXBhdGliaWxpdHlfdGVzdCAkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpICQoT1RIRVJfUFJPR1JBTVMpICQoT1VUUFVUKVBFUkYtQlVJTEQtT1BUSU9OUwogaWZuZXEgKCwkWCkKIAkkKGZvcmVhY2ggcCwkKHBhdHN1YnN0ICUkWCwlLCQoZmlsdGVyICUkWCwkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpIHBlcmYkWCkpLCB0ZXN0ICckcCcgLWVmICckcCRYJyB8fCAkKFJNKSAnJHAnOykKIGVuZGlmCkBAIC0xMTk3LDExICsxMjA1LDYgQEAKIC5QSE9OWTogLkZPUkNFLVBFUkYtVkVSU0lPTi1GSUxFIFRBR1MgdGFncyBjc2NvcGUgLkZPUkNFLVBFUkYtQ0ZMQUdTCiAuUEhPTlk6IC5GT1JDRS1QRVJGLUJVSUxELU9QVElPTlMKIAotLnBlcmYuZGV2Lm51bGw6Ci0JCXRvdWNoIC5wZXJmLmRldi5udWxsCi0KLS5JTlRFUk1FRElBVEU6CS5wZXJmLmRldi5udWxsCi0KICMjIyBNYWtlIHN1cmUgYnVpbHQtaW5zIGRvIG5vdCBoYXZlIGR1cHMgYW5kIGxpc3RlZCBpbiBwZXJmLmMKICMKIGNoZWNrLWJ1aWx0aW5zOjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vTWFrZWZpbGUgYi90b29scy9wZXJmL2FyY2gvYXJtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTMwYjUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK2lmbmRlZiBOT19EV0FSRgorUEVSRl9IQVZFX0RXQVJGX1JFR1MgOj0gMQorTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvZHdhcmYtcmVncy5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2R3YXJmLXJlZ3MuYyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9kd2FyZi1yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmNjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9kd2FyZi1yZWdzLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIE1hcHBpbmcgb2YgRFdBUkYgZGVidWcgcmVnaXN0ZXIgbnVtYmVycyBpbnRvIHJlZ2lzdGVyIG5hbWVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBXaWxsIERlYWNvbiwgQVJNIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaWJpby5oPgorI2luY2x1ZGUgPGR3YXJmLXJlZ3MuaD4KKworc3RydWN0IHB0X3JlZ3NfZHdhcmZudW0geworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGR3YXJmbnVtOworfTsKKworI2RlZmluZSBTVFIocykgI3MKKyNkZWZpbmUgUkVHX0RXQVJGTlVNX05BTUUociwgbnVtKSB7Lm5hbWUgPSByLCAuZHdhcmZudW0gPSBudW19CisjZGVmaW5lIEdQUl9EV0FSRk5VTV9OQU1FKG51bSkgXAorCXsubmFtZSA9IFNUUiglciMjbnVtKSwgLmR3YXJmbnVtID0gbnVtfQorI2RlZmluZSBSRUdfRFdBUkZOVU1fRU5EIHsubmFtZSA9IE5VTEwsIC5kd2FyZm51bSA9IDB9CisKKy8qCisgKiBSZWZlcmVuY2U6CisgKiBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuaWhpMDA0MGEvSUhJMDA0MEFfYWFkd2FyZi5wZGYKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwdF9yZWdzX2R3YXJmbnVtIHJlZ2R3YXJmbnVtX3RhYmxlW10gPSB7CisJR1BSX0RXQVJGTlVNX05BTUUoMCksCisJR1BSX0RXQVJGTlVNX05BTUUoMSksCisJR1BSX0RXQVJGTlVNX05BTUUoMiksCisJR1BSX0RXQVJGTlVNX05BTUUoMyksCisJR1BSX0RXQVJGTlVNX05BTUUoNCksCisJR1BSX0RXQVJGTlVNX05BTUUoNSksCisJR1BSX0RXQVJGTlVNX05BTUUoNiksCisJR1BSX0RXQVJGTlVNX05BTUUoNyksCisJR1BSX0RXQVJGTlVNX05BTUUoOCksCisJR1BSX0RXQVJGTlVNX05BTUUoOSksCisJR1BSX0RXQVJGTlVNX05BTUUoMTApLAorCVJFR19EV0FSRk5VTV9OQU1FKCIlZnAiLCAxMSksCisJUkVHX0RXQVJGTlVNX05BTUUoIiVpcCIsIDEyKSwKKwlSRUdfRFdBUkZOVU1fTkFNRSgiJXNwIiwgMTMpLAorCVJFR19EV0FSRk5VTV9OQU1FKCIlbHIiLCAxNCksCisJUkVHX0RXQVJGTlVNX05BTUUoIiVwYyIsIDE1KSwKKwlSRUdfRFdBUkZOVU1fRU5ELAorfTsKKworLyoqCisgKiBnZXRfYXJjaF9yZWdzdHIoKSAtIGxvb2t1cCByZWdpc3RlciBuYW1lIGZyb20gaXQncyBEV0FSRiByZWdpc3RlciBudW1iZXIKKyAqIEBuOgl0aGUgRFdBUkYgcmVnaXN0ZXIgbnVtYmVyCisgKgorICogZ2V0X2FyY2hfcmVnc3RyKCkgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXIgaW4gc3RydWN0CisgKiByZWdkd2FyZm51bV90YWJsZSBmcm9tIGl0J3MgRFdBUkYgcmVnaXN0ZXIgbnVtYmVyLiBJZiB0aGUgcmVnaXN0ZXIgaXMgbm90CisgKiBmb3VuZCBpbiB0aGUgdGFibGUsIHRoaXMgcmV0dXJucyBOVUxMOworICovCitjb25zdCBjaGFyICpnZXRfYXJjaF9yZWdzdHIodW5zaWduZWQgaW50IG4pCit7CisJY29uc3Qgc3RydWN0IHB0X3JlZ3NfZHdhcmZudW0gKnJvZmY7CisJZm9yIChyb2ZmID0gcmVnZHdhcmZudW1fdGFibGU7IHJvZmYtPm5hbWUgIT0gTlVMTDsgcm9mZisrKQorCQlpZiAocm9mZi0+ZHdhcmZudW0gPT0gbikKKwkJCXJldHVybiByb2ZmLT5uYW1lOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3NoL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9hcmNoL3NoL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTMwYjUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3NoL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAoraWZuZGVmIE5PX0RXQVJGCitQRVJGX0hBVkVfRFdBUkZfUkVHUyA6PSAxCitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9kd2FyZi1yZWdzLm8KK2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvc2gvdXRpbC9kd2FyZi1yZWdzLmMgYi90b29scy9wZXJmL2FyY2gvc2gvdXRpbC9kd2FyZi1yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZWRiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zaC91dGlsL2R3YXJmLXJlZ3MuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTWFwcGluZyBvZiBEV0FSRiBkZWJ1ZyByZWdpc3RlciBudW1iZXJzIGludG8gcmVnaXN0ZXIgbmFtZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hdHQgRmxlbWluZyA8bWF0dEBjb25zb2xlLXBpbXBzLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGliaW8uaD4KKyNpbmNsdWRlIDxkd2FyZi1yZWdzLmg+CisKKy8qCisgKiBHZW5lcmljIGR3YXJmIGFuYWx5c2lzIGhlbHBlcnMKKyAqLworCisjZGVmaW5lIFNIX01BWF9SRUdTIDE4Citjb25zdCBjaGFyICpzaF9yZWdzX3RhYmxlW1NIX01BWF9SRUdTXSA9IHsKKwkicjAiLAorCSJyMSIsCisJInIyIiwKKwkicjMiLAorCSJyNCIsCisJInI1IiwKKwkicjYiLAorCSJyNyIsCisJInI4IiwKKwkicjkiLAorCSJyMTAiLAorCSJyMTEiLAorCSJyMTIiLAorCSJyMTMiLAorCSJyMTQiLAorCSJyMTUiLAorCSJwYyIsCisJInByIiwKK307CisKKy8qIFJldHVybiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IHJlZ2lzdGVyIHN0cmluZyAoZm9yIGtwcm9iZS10cmFjZXIpICovCitjb25zdCBjaGFyICpnZXRfYXJjaF9yZWdzdHIodW5zaWduZWQgaW50IG4pCit7CisJcmV0dXJuIChuIDw9IFNIX01BWF9SRUdTKSA/IHNoX3JlZ3NfdGFibGVbbl0gOiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwppbmRleCA5NmRiNTI0Li5mZDIwNjcwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpAQCAtNjEsMTEgKzYxLDkgQEAKIHN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7CisJc3RydWN0IHNhbXBsZV9kYXRhIGRhdGE7CiAKLQlkdW1wX3ByaW50ZigiKElQLCAlZCk6ICVkOiAlI0x4XG4iLCBldmVudC0+aGVhZGVyLm1pc2MsCi0JCSAgICBldmVudC0+aXAucGlkLCBldmVudC0+aXAuaXApOwotCi0JaWYgKGV2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgc2Vzc2lvbiwgJmFsLCBOVUxMKSA8IDApIHsKKwlpZiAoZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKGV2ZW50LCBzZXNzaW9uLCAmYWwsICZkYXRhLCBOVUxMKSA8IDApIHsKIAkJcHJfd2FybmluZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQkgICBldmVudC0+aGVhZGVyLnR5cGUpOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1jYWNoZS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtY2FjaGUuYwppbmRleCBmOGUzZDE4Li4yOWFkMjBlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1jYWNoZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWNhY2hlLmMKQEAgLTc4LDggKzc4LDcgQEAKIAlzdHJ1Y3Qgc3RyX25vZGUgKnBvczsKIAljaGFyIGRlYnVnZGlyW1BBVEhfTUFYXTsKIAotCXNucHJpbnRmKGRlYnVnZGlyLCBzaXplb2YoZGVidWdkaXIpLCAiJXMvJXMiLCBnZXRlbnYoIkhPTUUiKSwKLQkJIERFQlVHX0NBQ0hFX0RJUik7CisJc25wcmludGYoZGVidWdkaXIsIHNpemVvZihkZWJ1Z2RpciksICIlcyIsIGJ1aWxkaWRfZGlyKTsKIAogCWlmIChhZGRfbmFtZV9saXN0X3N0cikgewogCQlsaXN0ID0gc3RybGlzdF9fbmV3KHRydWUsIGFkZF9uYW1lX2xpc3Rfc3RyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYwppbmRleCA5OTg5MDcyLi40NGE0N2UxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1saXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jCkBAIC00MywxMCArNDMsOCBAQAogCWlmIChzZXNzaW9uID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCWlmICh3aXRoX2hpdHMpIHsKLQkJc3ltYm9sX2NvbmYuZnVsbF9wYXRocyA9IHRydWU7CisJaWYgKHdpdGhfaGl0cykKIAkJcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmYnVpbGRfaWRfX21hcmtfZHNvX2hpdF9vcHMpOwotCX0KIAogCXBlcmZfc2Vzc2lvbl9fZnByaW50Zl9kc29zX2J1aWxkaWQoc2Vzc2lvbiwgc3Rkb3V0LCB3aXRoX2hpdHMpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYwppbmRleCBhNmUyZmRjLi5mY2ExZDQ0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKQEAgLTM1LDEwICszNSw3IEBACiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7CiAJc3RydWN0IHNhbXBsZV9kYXRhIGRhdGEgPSB7IC5wZXJpb2QgPSAxLCB9OwogCi0JZHVtcF9wcmludGYoIihJUCwgJWQpOiAlZDogJSNMeFxuIiwgZXZlbnQtPmhlYWRlci5taXNjLAotCQkgICAgZXZlbnQtPmlwLnBpZCwgZXZlbnQtPmlwLmlwKTsKLQotCWlmIChldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoZXZlbnQsIHNlc3Npb24sICZhbCwgTlVMTCkgPCAwKSB7CisJaWYgKGV2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgc2Vzc2lvbiwgJmFsLCAmZGF0YSwgTlVMTCkgPCAwKSB7CiAJCXByX3dhcm5pbmcoInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAogCQkJICAgZXZlbnQtPmhlYWRlci50eXBlKTsKIAkJcmV0dXJuIC0xOwpAQCAtNDcsOCArNDQsNiBAQAogCWlmIChhbC5maWx0ZXJlZCB8fCBhbC5zeW0gPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50LCBzZXNzaW9uLT5zYW1wbGVfdHlwZSwgJmRhdGEpOwotCiAJaWYgKGhpc3RzX19hZGRfZW50cnkoJnNlc3Npb24tPmhpc3RzLCAmYWwsIGRhdGEucGVyaW9kKSkgewogCQlwcl93YXJuaW5nKCJwcm9ibGVtIGluY3JlbWVudGluZyBzeW1ib2wgcGVyaW9kLCBza2lwcGluZyBldmVudFxuIik7CiAJCXJldHVybiAtMTsKQEAgLTE4NSw4ICsxODAsNiBAQAogCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCiAJT1BUX0JPT0xFQU4oJ20nLCAibW9kdWxlcyIsICZzeW1ib2xfY29uZi51c2VfbW9kdWxlcywKIAkJICAgICJsb2FkIG1vZHVsZSBzeW1ib2xzIC0gV0FSTklORzogdXNlIG9ubHkgd2l0aCAtayBhbmQgTElWRSBrZXJuZWwiKSwKLQlPUFRfQk9PTEVBTignUCcsICJmdWxsLXBhdGhzIiwgJnN5bWJvbF9jb25mLmZ1bGxfcGF0aHMsCi0JCSAgICAiRG9uJ3Qgc2hvcnRlbiB0aGUgcGF0aG5hbWVzIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGN3ZCIpLAogCU9QVF9TVFJJTkcoJ2QnLCAiZHNvcyIsICZzeW1ib2xfY29uZi5kc29fbGlzdF9zdHIsICJkc29bLGRzby4uLl0iLAogCQkgICAib25seSBjb25zaWRlciBzeW1ib2xzIGluIHRoZXNlIGRzb3MiKSwKIAlPUFRfU1RSSU5HKCdDJywgImNvbW1zIiwgJnN5bWJvbF9jb25mLmNvbW1fbGlzdF9zdHIsICJjb21tWyxjb21tLi4uXSIsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCmluZGV4IGU0YTRkYTMuLjE5OWQ1ZTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCkBAIC0xODIsNiArMTgyLDggQEAKIAkJICAgICAiU2hvdyBzb3VyY2UgY29kZSBsaW5lcy4iLCBvcHRfc2hvd19saW5lcyksCiAJT1BUX1NUUklORygnaycsICJ2bWxpbnV4IiwgJnN5bWJvbF9jb25mLnZtbGludXhfbmFtZSwKIAkJICAgImZpbGUiLCAidm1saW51eCBwYXRobmFtZSIpLAorCU9QVF9TVFJJTkcoJ3MnLCAic291cmNlIiwgJnN5bWJvbF9jb25mLnNvdXJjZV9wcmVmaXgsCisJCSAgICJkaXJlY3RvcnkiLCAicGF0aCB0byBrZXJuZWwgc291cmNlIiksCiAjZW5kaWYKIAlPUFRfX0RSWV9SVU4oJnByb2JlX2V2ZW50X2RyeV9ydW4pLAogCU9QVF9JTlRFR0VSKCdcMCcsICJtYXgtcHJvYmVzIiwgJnBhcmFtcy5tYXhfcHJvYmVfcG9pbnRzLApAQCAtMjY1LDQgKzI2NywzIEBACiAJfQogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKaW5kZXggNzExNzQ1Zi4uZmY3N2I4MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwpAQCAtNDksNyArNDksNiBAQAogc3RhdGljIGludAkJCXJlYWx0aW1lX3ByaW8JCQk9ICAgICAgMDsKIHN0YXRpYyBib29sCQkJcmF3X3NhbXBsZXMJCQk9ICBmYWxzZTsKIHN0YXRpYyBib29sCQkJc3lzdGVtX3dpZGUJCQk9ICBmYWxzZTsKLXN0YXRpYyBpbnQJCQlwcm9maWxlX2NwdQkJCT0gICAgIC0xOwogc3RhdGljIHBpZF90CQkJdGFyZ2V0X3BpZAkJCT0gICAgIC0xOwogc3RhdGljIHBpZF90CQkJdGFyZ2V0X3RpZAkJCT0gICAgIC0xOwogc3RhdGljIHBpZF90CQkJKmFsbF90aWRzCQkJPSAgICAgIE5VTEw7CkBAIC02MSw2ICs2MCw3IEBACiBzdGF0aWMgYm9vbAkJCWluaGVyaXRfc3RhdAkJCT0gIGZhbHNlOwogc3RhdGljIGJvb2wJCQlub19zYW1wbGVzCQkJPSAgZmFsc2U7CiBzdGF0aWMgYm9vbAkJCXNhbXBsZV9hZGRyZXNzCQkJPSAgZmFsc2U7CitzdGF0aWMgYm9vbAkJCW5vX2J1aWxkaWQJCQk9ICBmYWxzZTsKIAogc3RhdGljIGxvbmcJCQlzYW1wbGVzCQkJCT0gICAgICAwOwogc3RhdGljIHU2NAkJCWJ5dGVzX3dyaXR0ZW4JCQk9ICAgICAgMDsKQEAgLTc0LDYgKzc0LDcgQEAKIHN0YXRpYyBvZmZfdAkJCXBvc3RfcHJvY2Vzc2luZ19vZmZzZXQ7CiAKIHN0YXRpYyBzdHJ1Y3QgcGVyZl9zZXNzaW9uCSpzZXNzaW9uOworc3RhdGljIGNvbnN0IGNoYXIJCSpjcHVfbGlzdDsKIAogc3RydWN0IG1tYXBfZGF0YSB7CiAJaW50CQkJY291bnRlcjsKQEAgLTI2OCwxMiArMjY5LDE3IEBACiAJaWYgKGluaGVyaXRfc3RhdCkKIAkJYXR0ci0+aW5oZXJpdF9zdGF0ID0gMTsKIAotCWlmIChzYW1wbGVfYWRkcmVzcykKKwlpZiAoc2FtcGxlX2FkZHJlc3MpIHsKIAkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfQUREUjsKKwkJYXR0ci0+bW1hcF9kYXRhID0gdHJhY2s7CisJfQogCiAJaWYgKGNhbGxfZ3JhcGgpCiAJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX0NBTExDSEFJTjsKIAorCWlmIChzeXN0ZW1fd2lkZSkKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfQ1BVOworCiAJaWYgKHJhd19zYW1wbGVzKSB7CiAJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX1RJTUU7CiAJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX1JBVzsKQEAgLTMwMCw3ICszMDYsNyBAQAogCQkJCWRpZSgiUGVybWlzc2lvbiBlcnJvciAtIGFyZSB5b3Ugcm9vdD9cbiIKIAkJCQkJIlx0IENvbnNpZGVyIHR3ZWFraW5nIgogCQkJCQkiIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZC5cbiIpOwotCQkJZWxzZSBpZiAoZXJyID09ICBFTk9ERVYgJiYgcHJvZmlsZV9jcHUgIT0gLTEpIHsKKwkJCWVsc2UgaWYgKGVyciA9PSAgRU5PREVWICYmIGNwdV9saXN0KSB7CiAJCQkJZGllKCJObyBzdWNoIGRldmljZSAtIGRpZCB5b3Ugc3BlY2lmeSIKIAkJCQkJIiBhbiBvdXQtb2YtcmFuZ2UgcHJvZmlsZSBDUFU/XG4iKTsKIAkJCX0KQEAgLTQzMywxNCArNDM5LDE0IEBACiAKIAkJcHJvY2Vzc19idWlsZGlkcygpOwogCQlwZXJmX2hlYWRlcl9fd3JpdGUoJnNlc3Npb24tPmhlYWRlciwgb3V0cHV0LCB0cnVlKTsKKwkJcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbik7CisJCXN5bWJvbF9fZXhpdCgpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZXZlbnRfX3N5bnRoZXNpemVfZ3Vlc3Rfb3Moc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHZvaWQgKmRhdGEpCiB7CiAJaW50IGVycjsKLQljaGFyICpndWVzdF9rYWxsc3ltczsKLQljaGFyIHBhdGhbUEFUSF9NQVhdOwogCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnBzZXNzaW9uID0gZGF0YTsKIAogCWlmIChtYWNoaW5lX19pc19ob3N0KG1hY2hpbmUpKQpAQCAtNDYwLDEzICs0NjYsNiBAQAogCQlwcl9lcnIoIkNvdWxkbid0IHJlY29yZCBndWVzdCBrZXJuZWwgWyVkXSdzIHJlZmVyZW5jZSIKIAkJICAgICAgICIgcmVsb2NhdGlvbiBzeW1ib2wuXG4iLCBtYWNoaW5lLT5waWQpOwogCi0JaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCi0JCWd1ZXN0X2thbGxzeW1zID0gKGNoYXIgKikgc3ltYm9sX2NvbmYuZGVmYXVsdF9ndWVzdF9rYWxsc3ltczsKLQllbHNlIHsKLQkJc3ByaW50ZihwYXRoLCAiJXMvcHJvYy9rYWxsc3ltcyIsIG1hY2hpbmUtPnJvb3RfZGlyKTsKLQkJZ3Vlc3Rfa2FsbHN5bXMgPSBwYXRoOwotCX0KLQogCS8qCiAJICogV2UgdXNlIF9zdGV4dCBmb3IgZ3Vlc3Qga2VybmVsIGJlY2F1c2UgZ3Vlc3Qga2VybmVsJ3MgL3Byb2Mva2FsbHN5bXMKIAkgKiBoYXZlIG5vIF90ZXh0IHNvbWV0aW1lcy4KQEAgLTU2MSwxMiArNTYwLDE1IEBACiAJaWYgKCFmaWxlX25ldykgewogCQllcnIgPSBwZXJmX2hlYWRlcl9fcmVhZChzZXNzaW9uLCBvdXRwdXQpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIG91dF9kZWxldGVfc2Vzc2lvbjsKIAl9CiAKIAlpZiAoaGF2ZV90cmFjZXBvaW50cyhhdHRycywgbnJfY291bnRlcnMpKQogCQlwZXJmX2hlYWRlcl9fc2V0X2ZlYXQoJnNlc3Npb24tPmhlYWRlciwgSEVBREVSX1RSQUNFX0lORk8pOwogCisJLyoKKyAJICogcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbikgd2lsbCBiZSBjYWxsZWQgYXQgYXRleGl0X2hlYWRlcigpCisJICovCiAJYXRleGl0KGF0ZXhpdF9oZWFkZXIpOwogCiAJaWYgKGZvcmtzKSB7CkBAIC02MjIsMTAgKzYyNCwxNSBAQAogCQljbG9zZShjaGlsZF9yZWFkeV9waXBlWzBdKTsKIAl9CiAKLQlpZiAoKCFzeXN0ZW1fd2lkZSAmJiBub19pbmhlcml0KSB8fCBwcm9maWxlX2NwdSAhPSAtMSkgewotCQlvcGVuX2NvdW50ZXJzKHByb2ZpbGVfY3B1KTsKKwlucl9jcHVzID0gcmVhZF9jcHVfbWFwKGNwdV9saXN0KTsKKwlpZiAobnJfY3B1cyA8IDEpIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gY29sbGVjdCBudW1iZXIgb2YgQ1BVc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXN5c3RlbV93aWRlICYmIG5vX2luaGVyaXQgJiYgIWNwdV9saXN0KSB7CisJCW9wZW5fY291bnRlcnMoLTEpOwogCX0gZWxzZSB7Ci0JCW5yX2NwdXMgPSByZWFkX2NwdV9tYXAoKTsKIAkJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykKIAkJCW9wZW5fY291bnRlcnMoY3B1bWFwW2ldKTsKIAl9CkBAIC03MDQsNyArNzExLDcgQEAKIAlpZiAocGVyZl9ndWVzdCkKIAkJcGVyZl9zZXNzaW9uX19wcm9jZXNzX21hY2hpbmVzKHNlc3Npb24sIGV2ZW50X19zeW50aGVzaXplX2d1ZXN0X29zKTsKIAotCWlmICghc3lzdGVtX3dpZGUgJiYgcHJvZmlsZV9jcHUgPT0gLTEpCisJaWYgKCFzeXN0ZW1fd2lkZSkKIAkJZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKHRhcmdldF90aWQsIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCiAJCQkJCSBzZXNzaW9uKTsKIAllbHNlCkBAIC03NjYsNiArNzczLDEwIEBACiAJCWJ5dGVzX3dyaXR0ZW4gLyAyNCk7CiAKIAlyZXR1cm4gMDsKKworb3V0X2RlbGV0ZV9zZXNzaW9uOgorCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVjb3JkX3VzYWdlW10gPSB7CkBAIC03OTQsOCArODA1LDggQEAKIAkJCSAgICAic3lzdGVtLXdpZGUgY29sbGVjdGlvbiBmcm9tIGFsbCBDUFVzIiksCiAJT1BUX0JPT0xFQU4oJ0EnLCAiYXBwZW5kIiwgJmFwcGVuZF9maWxlLAogCQkJICAgICJhcHBlbmQgdG8gdGhlIG91dHB1dCBmaWxlIHRvIGRvIGluY3JlbWVudGFsIHByb2ZpbGluZyIpLAotCU9QVF9JTlRFR0VSKCdDJywgInByb2ZpbGVfY3B1IiwgJnByb2ZpbGVfY3B1LAotCQkJICAgICJDUFUgdG8gcHJvZmlsZSBvbiIpLAorCU9QVF9TVFJJTkcoJ0MnLCAiY3B1IiwgJmNwdV9saXN0LCAiY3B1IiwKKwkJICAgICJsaXN0IG9mIGNwdXMgdG8gbW9uaXRvciIpLAogCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLAogCQkJIm92ZXJ3cml0ZSBleGlzdGluZyBkYXRhIGZpbGUgKGRlcHJlY2F0ZWQpIiksCiAJT1BUX1U2NCgnYycsICJjb3VudCIsICZ1c2VyX2ludGVydmFsLCAiZXZlbnQgcGVyaW9kIHRvIHNhbXBsZSIpLApAQCAtODE1LDE3ICs4MjYsMTkgQEAKIAkJICAgICJTYW1wbGUgYWRkcmVzc2VzIiksCiAJT1BUX0JPT0xFQU4oJ24nLCAibm8tc2FtcGxlcyIsICZub19zYW1wbGVzLAogCQkgICAgImRvbid0IHNhbXBsZSIpLAorCU9QVF9CT09MRUFOKCdOJywgIm5vLWJ1aWxkaWQtY2FjaGUiLCAmbm9fYnVpbGRpZCwKKwkJICAgICJkbyBub3QgdXBkYXRlIHRoZSBidWlsZGlkIGNhY2hlIiksCiAJT1BUX0VORCgpCiB9OwogCiBpbnQgY21kX3JlY29yZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX3VzZWQpCiB7Ci0JaW50IGksajsKKwlpbnQgaSwgaiwgZXJyID0gLUVOT01FTTsKIAogCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIHJlY29yZF91c2FnZSwKIAkJCSAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKIAlpZiAoIWFyZ2MgJiYgdGFyZ2V0X3BpZCA9PSAtMSAmJiB0YXJnZXRfdGlkID09IC0xICYmCi0JCSFzeXN0ZW1fd2lkZSAmJiBwcm9maWxlX2NwdSA9PSAtMSkKKwkJIXN5c3RlbV93aWRlICYmICFjcHVfbGlzdCkKIAkJdXNhZ2Vfd2l0aF9vcHRpb25zKHJlY29yZF91c2FnZSwgb3B0aW9ucyk7CiAKIAlpZiAoZm9yY2UgJiYgYXBwZW5kX2ZpbGUpIHsKQEAgLTgzOSw2ICs4NTIsOCBAQAogCX0KIAogCXN5bWJvbF9faW5pdCgpOworCWlmIChub19idWlsZGlkKQorCQlkaXNhYmxlX2J1aWxkaWRfY2FjaGUoKTsKIAogCWlmICghbnJfY291bnRlcnMpIHsKIAkJbnJfY291bnRlcnMJPSAxOwpAQCAtODU3LDcgKzg3Miw3IEBACiAJfSBlbHNlIHsKIAkJYWxsX3RpZHM9bWFsbG9jKHNpemVvZihwaWRfdCkpOwogCQlpZiAoIWFsbF90aWRzKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlnb3RvIG91dF9zeW1ib2xfZXhpdDsKIAogCQlhbGxfdGlkc1swXSA9IHRhcmdldF90aWQ7CiAJCXRocmVhZF9udW0gPSAxOwpAQCAtODY3LDEzICs4ODIsMTMgQEAKIAkJZm9yIChqID0gMDsgaiA8IE1BWF9DT1VOVEVSUzsgaisrKSB7CiAJCQlmZFtpXVtqXSA9IG1hbGxvYyhzaXplb2YoaW50KSp0aHJlYWRfbnVtKTsKIAkJCWlmICghZmRbaV1bal0pCi0JCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJZ290byBvdXRfZnJlZV9mZDsKIAkJfQogCX0KIAlldmVudF9hcnJheSA9IG1hbGxvYygKIAkJc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKk1BWF9OUl9DUFVTKk1BWF9DT1VOVEVSUyp0aHJlYWRfbnVtKTsKIAlpZiAoIWV2ZW50X2FycmF5KQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9mZDsKIAogCWlmICh1c2VyX2ludGVydmFsICE9IFVMTE9OR19NQVgpCiAJCWRlZmF1bHRfaW50ZXJ2YWwgPSB1c2VyX2ludGVydmFsOwpAQCAtODg5LDggKzkwNCwyMiBAQAogCQlkZWZhdWx0X2ludGVydmFsID0gZnJlcTsKIAl9IGVsc2UgewogCQlmcHJpbnRmKHN0ZGVyciwgImZyZXF1ZW5jeSBhbmQgY291bnQgYXJlIHplcm8sIGFib3J0aW5nXG4iKTsKLQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlX2V2ZW50X2FycmF5OwogCX0KIAotCXJldHVybiBfX2NtZF9yZWNvcmQoYXJnYywgYXJndik7CisJZXJyID0gX19jbWRfcmVjb3JkKGFyZ2MsIGFyZ3YpOworCitvdXRfZnJlZV9ldmVudF9hcnJheToKKwlmcmVlKGV2ZW50X2FycmF5KTsKK291dF9mcmVlX2ZkOgorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ1BVUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09VTlRFUlM7IGorKykKKwkJCWZyZWUoZmRbaV1bal0pOworCX0KKwlmcmVlKGFsbF90aWRzKTsKKwlhbGxfdGlkcyA9IE5VTEw7CitvdXRfc3ltYm9sX2V4aXQ6CisJc3ltYm9sX19leGl0KCk7CisJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwppbmRleCBmZDc0MDdjLi4yZjRiOTI5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCkBAIC0xNTUsMzAgKzE1NSw3IEBACiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cjsKIAotCWV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnQsIHNlc3Npb24tPnNhbXBsZV90eXBlLCAmZGF0YSk7Ci0KLQlkdW1wX3ByaW50ZigiKElQLCAlZCk6ICVkLyVkOiAlI0x4IHBlcmlvZDogJUxkXG4iLCBldmVudC0+aGVhZGVyLm1pc2MsCi0JCSAgICBkYXRhLnBpZCwgZGF0YS50aWQsIGRhdGEuaXAsIGRhdGEucGVyaW9kKTsKLQotCWlmIChzZXNzaW9uLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NBTExDSEFJTikgewotCQl1bnNpZ25lZCBpbnQgaTsKLQotCQlkdW1wX3ByaW50ZigiLi4uIGNoYWluOiBucjolTHVcbiIsIGRhdGEuY2FsbGNoYWluLT5ucik7Ci0KLQkJaWYgKCFpcF9jYWxsY2hhaW5fX3ZhbGlkKGRhdGEuY2FsbGNoYWluLCBldmVudCkpIHsKLQkJCXByX2RlYnVnKCJjYWxsLWNoYWluIHByb2JsZW0gd2l0aCBldmVudCwgIgotCQkJCSAic2tpcHBpbmcgaXQuXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKGR1bXBfdHJhY2UpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBkYXRhLmNhbGxjaGFpbi0+bnI7IGkrKykKLQkJCQlkdW1wX3ByaW50ZigiLi4uLi4gJTJkOiAlMDE2THhcbiIsCi0JCQkJCSAgICBpLCBkYXRhLmNhbGxjaGFpbi0+aXBzW2ldKTsKLQkJfQotCX0KLQotCWlmIChldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoZXZlbnQsIHNlc3Npb24sICZhbCwgTlVMTCkgPCAwKSB7CisJaWYgKGV2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgc2Vzc2lvbiwgJmFsLCAmZGF0YSwgTlVMTCkgPCAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCAicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQlldmVudC0+aGVhZGVyLnR5cGUpOwogCQlyZXR1cm4gLTE7CkBAIC00NjQsOCArNDQxLDYgQEAKIAkJICAgInByZXR0eSBwcmludGluZyBzdHlsZSBrZXk6IG5vcm1hbCByYXciKSwKIAlPUFRfU1RSSU5HKCdzJywgInNvcnQiLCAmc29ydF9vcmRlciwgImtleVssa2V5Mi4uLl0iLAogCQkgICAic29ydCBieSBrZXkocyk6IHBpZCwgY29tbSwgZHNvLCBzeW1ib2wsIHBhcmVudCIpLAotCU9QVF9CT09MRUFOKCdQJywgImZ1bGwtcGF0aHMiLCAmc3ltYm9sX2NvbmYuZnVsbF9wYXRocywKLQkJICAgICJEb24ndCBzaG9ydGVuIHRoZSBwYXRobmFtZXMgdGFraW5nIGludG8gYWNjb3VudCB0aGUgY3dkIiksCiAJT1BUX0JPT0xFQU4oMCwgInNob3djcHV1dGlsaXphdGlvbiIsICZzeW1ib2xfY29uZi5zaG93X2NwdV91dGlsaXphdGlvbiwKIAkJICAgICJTaG93IHNhbXBsZSBwZXJjZW50YWdlIGZvciBkaWZmZXJlbnQgY3B1IG1vZGVzIiksCiAJT1BUX1NUUklORygncCcsICJwYXJlbnQiLCAmcGFyZW50X3BhdHRlcm4sICJyZWdleCIsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwppbmRleCA5YTM5Y2EzLi5hNmI0ZDQ0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKQEAgLTY5LDcgKzY5LDcgQEAKIH07CiAKIHN0YXRpYyBib29sCQkJc3lzdGVtX3dpZGUJCQk9ICBmYWxzZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJCW5yX2NwdXMJCQkJPSAgMDsKK3N0YXRpYyBpbnQJCQlucl9jcHVzCQkJCT0gIDA7CiBzdGF0aWMgaW50CQkJcnVuX2lkeAkJCQk9ICAwOwogCiBzdGF0aWMgaW50CQkJcnVuX2NvdW50CQkJPSAgMTsKQEAgLTgyLDYgKzgyLDcgQEAKIHN0YXRpYyBwaWRfdAkJCWNoaWxkX3BpZAkJCT0gLTE7CiBzdGF0aWMgYm9vbAkJCW51bGxfcnVuCQkJPSAgZmFsc2U7CiBzdGF0aWMgYm9vbAkJCWJpZ19udW0JCQkJPSAgZmFsc2U7CitzdGF0aWMgY29uc3QgY2hhcgkJKmNwdV9saXN0OwogCiAKIHN0YXRpYyBpbnQJCQkqZmRbTUFYX05SX0NQVVNdW01BWF9DT1VOVEVSU107CkBAIC0xNTgsNyArMTU5LDcgQEAKIAkJCQkgICAgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HOwogCiAJaWYgKHN5c3RlbV93aWRlKSB7Ci0JCXVuc2lnbmVkIGludCBjcHU7CisJCWludCBjcHU7CiAKIAkJZm9yIChjcHUgPSAwOyBjcHUgPCBucl9jcHVzOyBjcHUrKykgewogCQkJZmRbY3B1XVtjb3VudGVyXVswXSA9IHN5c19wZXJmX2V2ZW50X29wZW4oYXR0ciwKQEAgLTIwOCw3ICsyMDksNyBAQAogc3RhdGljIHZvaWQgcmVhZF9jb3VudGVyKGludCBjb3VudGVyKQogewogCXU2NCBjb3VudFszXSwgc2luZ2xlX2NvdW50WzNdOwotCXVuc2lnbmVkIGludCBjcHU7CisJaW50IGNwdTsKIAlzaXplX3QgcmVzLCBudjsKIAlpbnQgc2NhbGVkOwogCWludCBpLCB0aHJlYWQ7CkBAIC01NDIsNiArNTQzLDggQEAKIAkJICAgICJudWxsIHJ1biAtIGRvbnQgc3RhcnQgYW55IGNvdW50ZXJzIiksCiAJT1BUX0JPT0xFQU4oJ0InLCAiYmlnLW51bSIsICZiaWdfbnVtLAogCQkgICAgInByaW50IGxhcmdlIG51bWJlcnMgd2l0aCB0aG91c2FuZHNcJyBzZXBhcmF0b3JzIiksCisJT1BUX1NUUklORygnQycsICJjcHUiLCAmY3B1X2xpc3QsICJjcHUiLAorCQkgICAgImxpc3Qgb2YgY3B1cyB0byBtb25pdG9yIGluIHN5c3RlbS13aWRlIiksCiAJT1BUX0VORCgpCiB9OwogCkBAIC01NjYsMTAgKzU2OSwxMyBAQAogCX0KIAogCWlmIChzeXN0ZW1fd2lkZSkKLQkJbnJfY3B1cyA9IHJlYWRfY3B1X21hcCgpOworCQlucl9jcHVzID0gcmVhZF9jcHVfbWFwKGNwdV9saXN0KTsKIAllbHNlCiAJCW5yX2NwdXMgPSAxOwogCisJaWYgKG5yX2NwdXMgPCAxKQorCQl1c2FnZV93aXRoX29wdGlvbnMoc3RhdF91c2FnZSwgb3B0aW9ucyk7CisKIAlpZiAodGFyZ2V0X3BpZCAhPSAtMSkgewogCQl0YXJnZXRfdGlkID0gdGFyZ2V0X3BpZDsKIAkJdGhyZWFkX251bSA9IGZpbmRfYWxsX3RpZCh0YXJnZXRfcGlkLCAmYWxsX3RpZHMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCmluZGV4IDVhNTJlZDkuLjUxNjE2MTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKQEAgLTMwMCw4ICszMDAsOSBAQAogCiBzdHJ1Y3QgcG93ZXJfZW50cnkgewogCXN0cnVjdCB0cmFjZV9lbnRyeSB0ZTsKLQlzNjQJdHlwZTsKLQlzNjQJdmFsdWU7CisJdTY0CXR5cGU7CisJdTY0CXZhbHVlOworCXU2NAljcHVfaWQ7CiB9OwogCiAjZGVmaW5lIFRBU0tfQ09NTV9MRU4gMTYKQEAgLTQ5OCwxMyArNDk5LDEzIEBACiAJCQlyZXR1cm4gMDsKIAogCQlpZiAoc3RyY21wKGV2ZW50X3N0ciwgInBvd2VyOnBvd2VyX3N0YXJ0IikgPT0gMCkKLQkJCWNfc3RhdGVfc3RhcnQoZGF0YS5jcHUsIGRhdGEudGltZSwgcGUtPnZhbHVlKTsKKwkJCWNfc3RhdGVfc3RhcnQocGUtPmNwdV9pZCwgZGF0YS50aW1lLCBwZS0+dmFsdWUpOwogCiAJCWlmIChzdHJjbXAoZXZlbnRfc3RyLCAicG93ZXI6cG93ZXJfZW5kIikgPT0gMCkKLQkJCWNfc3RhdGVfZW5kKGRhdGEuY3B1LCBkYXRhLnRpbWUpOworCQkJY19zdGF0ZV9lbmQocGUtPmNwdV9pZCwgZGF0YS50aW1lKTsKIAogCQlpZiAoc3RyY21wKGV2ZW50X3N0ciwgInBvd2VyOnBvd2VyX2ZyZXF1ZW5jeSIpID09IDApCi0JCQlwX3N0YXRlX2NoYW5nZShkYXRhLmNwdSwgZGF0YS50aW1lLCBwZS0+dmFsdWUpOworCQkJcF9zdGF0ZV9jaGFuZ2UocGUtPmNwdV9pZCwgZGF0YS50aW1lLCBwZS0+dmFsdWUpOwogCiAJCWlmIChzdHJjbXAoZXZlbnRfc3RyLCAic2NoZWQ6c2NoZWRfd2FrZXVwIikgPT0gMCkKIAkJCXNjaGVkX3dha2V1cChkYXRhLmNwdSwgZGF0YS50aW1lLCBkYXRhLnBpZCwgdGUpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IGE2NmY0MjcuLmI1MTNlNDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTEwMiw2ICsxMDIsNyBAQAogc3RhdGljIGludAkJCXN5bV9wY250X2ZpbHRlcgkJCT0gICAgICA1Owogc3RhdGljIGludAkJCXN5bV9jb3VudGVyCQkJPSAgICAgIDA7CiBzdGF0aWMgaW50CQkJZGlzcGxheV93ZWlnaHRlZAkJPSAgICAgLTE7CitzdGF0aWMgY29uc3QgY2hhcgkJKmNwdV9saXN0OwogCiAvKgogICogU3ltYm9scwpAQCAtOTgyLDYgKzk4Myw3IEBACiAJdTY0IGlwID0gc2VsZi0+aXAuaXA7CiAJc3RydWN0IHN5bV9lbnRyeSAqc3ltZTsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKwlzdHJ1Y3Qgc2FtcGxlX2RhdGEgZGF0YTsKIAlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZTsKIAl1OCBvcmlnaW4gPSBzZWxmLT5oZWFkZXIubWlzYyAmIFBFUkZfUkVDT1JEX01JU0NfQ1BVTU9ERV9NQVNLOwogCkBAIC0xMDI0LDcgKzEwMjYsOCBAQAogCWlmIChzZWxmLT5oZWFkZXIubWlzYyAmIFBFUkZfUkVDT1JEX01JU0NfRVhBQ1RfSVApCiAJCWV4YWN0X3NhbXBsZXMrKzsKIAotCWlmIChldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoc2VsZiwgc2Vzc2lvbiwgJmFsLCBzeW1ib2xfZmlsdGVyKSA8IDAgfHwKKwlpZiAoZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKHNlbGYsIHNlc3Npb24sICZhbCwgJmRhdGEsCisJCQkJICAgICBzeW1ib2xfZmlsdGVyKSA8IDAgfHwKIAkgICAgYWwuZmlsdGVyZWQpCiAJCXJldHVybjsKIApAQCAtMTA3OSwyNiArMTA4Miw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGV2ZW50X19wcm9jZXNzKGV2ZW50X3QgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQotewotCXN3aXRjaCAoZXZlbnQtPmhlYWRlci50eXBlKSB7Ci0JY2FzZSBQRVJGX1JFQ09SRF9DT01NOgotCQlldmVudF9fcHJvY2Vzc19jb21tKGV2ZW50LCBzZXNzaW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBQRVJGX1JFQ09SRF9NTUFQOgotCQlldmVudF9fcHJvY2Vzc19tbWFwKGV2ZW50LCBzZXNzaW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBQRVJGX1JFQ09SRF9GT1JLOgotCWNhc2UgUEVSRl9SRUNPUkRfRVhJVDoKLQkJZXZlbnRfX3Byb2Nlc3NfdGFzayhldmVudCwgc2Vzc2lvbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdHJ1Y3QgbW1hcF9kYXRhIHsKIAlpbnQJCQljb3VudGVyOwogCXZvaWQJCQkqYmFzZTsKQEAgLTEzNTEsOCArMTMzNCw4IEBACiAJCSAgICAicHJvZmlsZSBldmVudHMgb24gZXhpc3RpbmcgdGhyZWFkIGlkIiksCiAJT1BUX0JPT0xFQU4oJ2EnLCAiYWxsLWNwdXMiLCAmc3lzdGVtX3dpZGUsCiAJCQkgICAgInN5c3RlbS13aWRlIGNvbGxlY3Rpb24gZnJvbSBhbGwgQ1BVcyIpLAotCU9QVF9JTlRFR0VSKCdDJywgIkNQVSIsICZwcm9maWxlX2NwdSwKLQkJICAgICJDUFUgdG8gcHJvZmlsZSBvbiIpLAorCU9QVF9TVFJJTkcoJ0MnLCAiY3B1IiwgJmNwdV9saXN0LCAiY3B1IiwKKwkJICAgICJsaXN0IG9mIGNwdXMgdG8gbW9uaXRvciIpLAogCU9QVF9TVFJJTkcoJ2snLCAidm1saW51eCIsICZzeW1ib2xfY29uZi52bWxpbnV4X25hbWUsCiAJCSAgICJmaWxlIiwgInZtbGludXggcGF0aG5hbWUiKSwKIAlPUFRfQk9PTEVBTignSycsICJoaWRlX2tlcm5lbF9zeW1ib2xzIiwgJmhpZGVfa2VybmVsX3N5bWJvbHMsCkBAIC0xNDI4LDEwICsxNDExLDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogQ1BVIGFuZCBQSUQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLwotCWlmICh0YXJnZXRfdGlkID4gMCAmJiBwcm9maWxlX2NwdSAhPSAtMSkgeworCWlmICh0YXJnZXRfdGlkID4gMCAmJiBjcHVfbGlzdCkgewogCQlwcmludGYoIldBUk5JTkc6IFBJRCBzd2l0Y2ggb3ZlcnJpZGluZyBDUFVcbiIpOwogCQlzbGVlcCgxKTsKLQkJcHJvZmlsZV9jcHUgPSAtMTsKKwkJY3B1X2xpc3QgPSBOVUxMOwogCX0KIAogCWlmICghbnJfY291bnRlcnMpCkBAIC0xNDY5LDEwICsxNDUyLDEzIEBACiAJCWF0dHJzW2NvdW50ZXJdLnNhbXBsZV9wZXJpb2QgPSBkZWZhdWx0X2ludGVydmFsOwogCX0KIAotCWlmICh0YXJnZXRfdGlkICE9IC0xIHx8IHByb2ZpbGVfY3B1ICE9IC0xKQorCWlmICh0YXJnZXRfdGlkICE9IC0xKQogCQlucl9jcHVzID0gMTsKIAllbHNlCi0JCW5yX2NwdXMgPSByZWFkX2NwdV9tYXAoKTsKKwkJbnJfY3B1cyA9IHJlYWRfY3B1X21hcChjcHVfbGlzdCk7CisKKwlpZiAobnJfY3B1cyA8IDEpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyh0b3BfdXNhZ2UsIG9wdGlvbnMpOwogCiAJZ2V0X3Rlcm1fZGltZW5zaW9ucygmd2luc2l6ZSk7CiAJaWYgKHByaW50X2VudHJpZXMgPT0gMCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRyYWNlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwppbmRleCBkZGRmM2YwLi4yOTRkYTcyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwpAQCAtMTEsOCArMTEsOSBAQAogCiBzdGF0aWMgY2hhciBjb25zdAkJKnNjcmlwdF9uYW1lOwogc3RhdGljIGNoYXIgY29uc3QJCSpnZW5lcmF0ZV9zY3JpcHRfbGFuZzsKLXN0YXRpYyBib29sCQkJZGVidWdfb3JkZXJpbmc7CitzdGF0aWMgYm9vbAkJCWRlYnVnX21vZGU7CiBzdGF0aWMgdTY0CQkJbGFzdF90aW1lc3RhbXA7CitzdGF0aWMgdTY0CQkJbnJfdW5vcmRlcmVkOwogCiBzdGF0aWMgaW50IGRlZmF1bHRfc3RhcnRfc2NyaXB0KGNvbnN0IGNoYXIgKnNjcmlwdCBfX3VudXNlZCwKIAkJCQlpbnQgYXJnYyBfX3VudXNlZCwKQEAgLTkxLDEzICs5MiwxNSBAQAogCX0KIAogCWlmIChzZXNzaW9uLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JBVykgewotCQlpZiAoZGVidWdfb3JkZXJpbmcpIHsKKwkJaWYgKGRlYnVnX21vZGUpIHsKIAkJCWlmIChkYXRhLnRpbWUgPCBsYXN0X3RpbWVzdGFtcCkgewogCQkJCXByX2VycigiU2FtcGxlcyBtaXNvcmRlcmVkLCBwcmV2aW91czogJWxsdSAiCiAJCQkJCSJ0aGlzOiAlbGx1XG4iLCBsYXN0X3RpbWVzdGFtcCwKIAkJCQkJZGF0YS50aW1lKTsKKwkJCQlucl91bm9yZGVyZWQrKzsKIAkJCX0KIAkJCWxhc3RfdGltZXN0YW1wID0gZGF0YS50aW1lOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJLyoKIAkJICogRklYTUU6IGJldHRlciByZXNvbHZlIGZyb20gcGlkIGZyb20gdGhlIHN0cnVjdCB0cmFjZV9lbnRyeQpAQCAtMTEzLDYgKzExNiwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdTY0IG5yX2xvc3Q7CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19sb3N0X2V2ZW50KGV2ZW50X3QgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uIF9fdXNlZCkKK3sKKwlucl9sb3N0ICs9IGV2ZW50LT5sb3N0Lmxvc3Q7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X29wcyBldmVudF9vcHMgPSB7CiAJLnNhbXBsZQk9IHByb2Nlc3Nfc2FtcGxlX2V2ZW50LAogCS5jb21tCT0gZXZlbnRfX3Byb2Nlc3NfY29tbSwKQEAgLTEyMCw2ICsxMzIsNyBAQAogCS5ldmVudF90eXBlID0gZXZlbnRfX3Byb2Nlc3NfZXZlbnRfdHlwZSwKIAkudHJhY2luZ19kYXRhID0gZXZlbnRfX3Byb2Nlc3NfdHJhY2luZ19kYXRhLAogCS5idWlsZF9pZCA9IGV2ZW50X19wcm9jZXNzX2J1aWxkX2lkLAorCS5sb3N0ID0gcHJvY2Vzc19sb3N0X2V2ZW50LAogCS5vcmRlcmVkX3NhbXBsZXMgPSB0cnVlLAogfTsKIApAQCAtMTMyLDkgKzE0NSwxOCBAQAogCiBzdGF0aWMgaW50IF9fY21kX3RyYWNlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CisJaW50IHJldDsKKwogCXNpZ25hbChTSUdJTlQsIHNpZ19oYW5kbGVyKTsKIAotCXJldHVybiBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZldmVudF9vcHMpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJmV2ZW50X29wcyk7CisKKwlpZiAoZGVidWdfbW9kZSkgeworCQlwcl9lcnIoIk1pc29yZGVyZWQgdGltZXN0YW1wczogJWxsdVxuIiwgbnJfdW5vcmRlcmVkKTsKKwkJcHJfZXJyKCJMb3N0IGV2ZW50czogJWxsdVxuIiwgbnJfbG9zdCk7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RydWN0IHNjcmlwdF9zcGVjIHsKQEAgLTU0NCw4ICs1NjYsOCBAQAogCQkgICAiZ2VuZXJhdGUgcGVyZi10cmFjZS54eCBzY3JpcHQgaW4gc3BlY2lmaWVkIGxhbmd1YWdlIiksCiAJT1BUX1NUUklORygnaScsICJpbnB1dCIsICZpbnB1dF9uYW1lLCAiZmlsZSIsCiAJCSAgICAiaW5wdXQgZmlsZSBuYW1lIiksCi0JT1BUX0JPT0xFQU4oJ2QnLCAiZGVidWctb3JkZXJpbmciLCAmZGVidWdfb3JkZXJpbmcsCi0JCSAgICJjaGVjayB0aGF0IHNhbXBsZXMgdGltZSBvcmRlcmluZyBpcyBtb25vdG9uaWMiKSwKKwlPUFRfQk9PTEVBTignZCcsICJkZWJ1Zy1tb2RlIiwgJmRlYnVnX21vZGUsCisJCSAgICJkbyB2YXJpb3VzIGNoZWNrcyBsaWtlIHNhbXBsZXMgb3JkZXJpbmcgYW5kIGxvc3QgZXZlbnRzIiksCiAKIAlPUFRfRU5EKCkKIH07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2ZlYXR1cmUtdGVzdHMubWFrIGIvdG9vbHMvcGVyZi9mZWF0dXJlLXRlc3RzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGI2OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9mZWF0dXJlLXRlc3RzLm1hawpAQCAtMCwwICsxLDExOSBAQAorZGVmaW5lIFNPVVJDRV9IRUxMTworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiBwdXRzKFwiaGlcIik7Cit9CitlbmRlZgorCitpZm5kZWYgTk9fRFdBUkYKK2RlZmluZSBTT1VSQ0VfRFdBUkYKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPGxpYmR3Lmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorI2lmbmRlZiBfRUxGVVRJTFNfUFJFUkVRCisjZXJyb3IKKyNlbmRpZgorCitpbnQgbWFpbih2b2lkKQoreworCUR3YXJmICpkYmcgPSBkd2FyZl9iZWdpbigwLCBEV0FSRl9DX1JFQUQpOworCXJldHVybiAobG9uZylkYmc7Cit9CitlbmRlZgorZW5kaWYKKworZGVmaW5lIFNPVVJDRV9MSUJFTEYKKyNpbmNsdWRlIDxsaWJlbGYuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwlFbGYgKmVsZiA9IGVsZl9iZWdpbigwLCBFTEZfQ19SRUFELCAwKTsKKwlyZXR1cm4gKGxvbmcpZWxmOworfQorZW5kZWYKKworZGVmaW5lIFNPVVJDRV9HTElCQworI2luY2x1ZGUgPGdudS9saWJjLXZlcnNpb24uaD4KKworaW50IG1haW4odm9pZCkKK3sKKwljb25zdCBjaGFyICp2ZXJzaW9uID0gZ251X2dldF9saWJjX3ZlcnNpb24oKTsKKwlyZXR1cm4gKGxvbmcpdmVyc2lvbjsKK30KK2VuZGVmCisKK2RlZmluZSBTT1VSQ0VfRUxGX01NQVAKKyNpbmNsdWRlIDxsaWJlbGYuaD4KK2ludCBtYWluKHZvaWQpCit7CisJRWxmICplbGYgPSBlbGZfYmVnaW4oMCwgRUxGX0NfUkVBRF9NTUFQLCAwKTsKKwlyZXR1cm4gKGxvbmcpZWxmOworfQorZW5kZWYKKworaWZuZGVmIE5PX05FV1QKK2RlZmluZSBTT1VSQ0VfTkVXVAorI2luY2x1ZGUgPG5ld3QuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwluZXd0SW5pdCgpOworCW5ld3RDbHMoKTsKKwlyZXR1cm4gbmV3dEZpbmlzaGVkKCk7Cit9CitlbmRlZgorZW5kaWYKKworaWZuZGVmIE5PX0xJQlBFUkwKK2RlZmluZSBTT1VSQ0VfUEVSTF9FTUJFRAorI2luY2x1ZGUgPEVYVEVSTi5oPgorI2luY2x1ZGUgPHBlcmwuaD4KKworaW50IG1haW4odm9pZCkKK3sKK3BlcmxfYWxsb2MoKTsKK3JldHVybiAwOworfQorZW5kZWYKK2VuZGlmCisKK2lmbmRlZiBOT19MSUJQWVRIT04KK2RlZmluZSBTT1VSQ0VfUFlUSE9OX0VNQkVECisjaW5jbHVkZSA8UHl0aG9uLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJUHlfSW5pdGlhbGl6ZSgpOworCXJldHVybiAwOworfQorZW5kZWYKK2VuZGlmCisKK2RlZmluZSBTT1VSQ0VfQkZECisjaW5jbHVkZSA8YmZkLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJYmZkX2RlbWFuZ2xlKDAsIDAsIDApOworCXJldHVybiAwOworfQorZW5kZWYKKworZGVmaW5lIFNPVVJDRV9DUExVU19ERU1BTkdMRQorZXh0ZXJuIGNoYXIgKmNwbHVzX2RlbWFuZ2xlKGNvbnN0IGNoYXIgKiwgaW50KTsKKworaW50IG1haW4odm9pZCkKK3sKKwljcGx1c19kZW1hbmdsZSgwLCAwKTsKKwlyZXR1cm4gMDsKK30KK2VuZGVmCisKKyMgdHJ5LWNjCisjIFVzYWdlOiBvcHRpb24gPSAkKGNhbGwgdHJ5LWNjLCBzb3VyY2UtdG8tYnVpbGQsIGNjLW9wdGlvbnMpCit0cnktY2MgPSAkKHNoZWxsIHNoIC1jCQkJCQkJICBcCisJJ1RNUD0iJChUTVBPVVQpLiQkJCQiOwkJCSAJCSAgXAorCSBlY2hvICIkKDEpIiB8CQkJCQkJICBcCisJICQoQ0MpIC14IGMgLSAkKDIpIC1vICIkJFRNUCIgPiAvZGV2L251bGwgMj4mMSAmJiBlY2hvIHk7IFwKKwkgcm0gLWYgIiQkVE1QIicpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYtYXJjaGl2ZS5zaCBiL3Rvb2xzL3BlcmYvcGVyZi1hcmNoaXZlLnNoCmluZGV4IDJlN2E0ZjQuLjY3N2U1OWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi1hcmNoaXZlLnNoCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi1hcmNoaXZlLnNoCkBAIC03LDcgKzcsMTcgQEAKIAlQRVJGX0RBVEE9JDEKIGZpCiAKLURFQlVHRElSPX4vLmRlYnVnLworIworIyBQRVJGX0JVSUxESURfRElSIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBieSBwZXJmCisjIHBhdGggdG8gYnVpbGRpZCBkaXJlY3RvcnksIGRlZmF1bHQgdG8gJEhPTUUvLmRlYnVnCisjCitpZiBbIC16ICRQRVJGX0JVSUxESURfRElSIF07IHRoZW4KKwlQRVJGX0JVSUxESURfRElSPX4vLmRlYnVnLworZWxzZQorICAgICAgICAjIGFwcGVuZCAvIHRvIG1ha2Ugc3Vic3RpdHV0aW9ucyB3b3JrCisgICAgICAgIFBFUkZfQlVJTERJRF9ESVI9JFBFUkZfQlVJTERJRF9ESVIvCitmaQorCiBCVUlMRElEUz0kKG1rdGVtcCAvdG1wL3BlcmYtYXJjaGl2ZS1idWlsZGlkcy5YWFhYWFgpCiBOT0JVSUxESUQ9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogCkBAIC0yMiwxMyArMzIsMTMgQEAKIAogY3V0IC1kICcgJyAtZiAxICRCVUlMRElEUyB8IFwKIHdoaWxlIHJlYWQgYnVpbGRfaWQgOyBkbwotCWxpbmtuYW1lPSRERUJVR0RJUi5idWlsZC1pZC8ke2J1aWxkX2lkOjA6Mn0vJHtidWlsZF9pZDoyfQorCWxpbmtuYW1lPSRQRVJGX0JVSUxESURfRElSLmJ1aWxkLWlkLyR7YnVpbGRfaWQ6MDoyfS8ke2J1aWxkX2lkOjJ9CiAJZmlsZW5hbWU9JChyZWFkbGluayAtZiAkbGlua25hbWUpCi0JZWNobyAke2xpbmtuYW1lIyRERUJVR0RJUn0gPj4gJE1BTklGRVNUCi0JZWNobyAke2ZpbGVuYW1lIyRERUJVR0RJUn0gPj4gJE1BTklGRVNUCisJZWNobyAke2xpbmtuYW1lIyRQRVJGX0JVSUxESURfRElSfSA+PiAkTUFOSUZFU1QKKwllY2hvICR7ZmlsZW5hbWUjJFBFUkZfQlVJTERJRF9ESVJ9ID4+ICRNQU5JRkVTVAogZG9uZQogCi10YXIgY2ZqICRQRVJGX0RBVEEudGFyLmJ6MiAtQyAkREVCVUdESVIgLVQgJE1BTklGRVNUCit0YXIgY2ZqICRQRVJGX0RBVEEudGFyLmJ6MiAtQyAkUEVSRl9CVUlMRElEX0RJUiAtVCAkTUFOSUZFU1QKIHJtIC1mICRNQU5JRkVTVCAkQlVJTERJRFMKIGVjaG8gLWUgIk5vdyBwbGVhc2UgcnVuOlxuIgogZWNobyAtZSAiJCB0YXIgeHZmICRQRVJGX0RBVEEudGFyLmJ6MiAtQyB+Ly5kZWJ1Z1xuIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLmMgYi90b29scy9wZXJmL3BlcmYuYwppbmRleCA2ZTQ4NzExLi5jZGQ2YzAzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3BlcmYuYworKysgYi90b29scy9wZXJmL3BlcmYuYwpAQCAtNDU4LDYgKzQ1OCw4IEBACiAJaGFuZGxlX29wdGlvbnMoJmFyZ3YsICZhcmdjLCBOVUxMKTsKIAljb21taXRfcGFnZXJfY2hvaWNlKCk7CiAJc2V0X2RlYnVnZnNfcGF0aCgpOworCXNldF9idWlsZGlkX2RpcigpOworCiAJaWYgKGFyZ2MgPiAwKSB7CiAJCWlmICghcHJlZml4Y21wKGFyZ3ZbMF0sICItLSIpKQogCQkJYXJndlswXSArPSAyOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvbGliL1BlcmYvVHJhY2UvQ29yZS5weSBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9weXRob24vUGVyZi1UcmFjZS1VdGlsL2xpYi9QZXJmL1RyYWNlL0NvcmUucHkKaW5kZXggMWRjNDY0ZS4uYWFkNzUyNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvbGliL1BlcmYvVHJhY2UvQ29yZS5weQorKysgYi90b29scy9wZXJmL3NjcmlwdHMvcHl0aG9uL1BlcmYtVHJhY2UtVXRpbC9saWIvUGVyZi9UcmFjZS9Db3JlLnB5CkBAIC04OSwzICs4OSwzMyBAQAogCSAgICB2YWx1ZSAmPSB+aWR4CiAKICAgICByZXR1cm4gc3RyaW5nCisKKworZGVmIHRhc2tTdGF0ZShzdGF0ZSk6CisJc3RhdGVzID0geworCQkwIDogIlIiLAorCQkxIDogIlMiLAorCQkyIDogIkQiLAorCQk2NDogIkRFQUQiCisJfQorCisJaWYgc3RhdGUgbm90IGluIHN0YXRlczoKKwkJcmV0dXJuICJVbmtub3duIgorCisJcmV0dXJuIHN0YXRlc1tzdGF0ZV0KKworCitjbGFzcyBFdmVudEhlYWRlcnM6CisJZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1vbl9jcHUsIGNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsCisJCSAgICAgY29tbW9uX3BpZCwgY29tbW9uX2NvbW0pOgorCQlzZWxmLmNwdSA9IGNvbW1vbl9jcHUKKwkJc2VsZi5zZWNzID0gY29tbW9uX3NlY3MKKwkJc2VsZi5uc2VjcyA9IGNvbW1vbl9uc2VjcworCQlzZWxmLnBpZCA9IGNvbW1vbl9waWQKKwkJc2VsZi5jb21tID0gY29tbW9uX2NvbW0KKworCWRlZiB0cyhzZWxmKToKKwkJcmV0dXJuIChzZWxmLnNlY3MgKiAoMTAgKiogOSkpICsgc2VsZi5uc2VjcworCisJZGVmIHRzX2Zvcm1hdChzZWxmKToKKwkJcmV0dXJuICIlZC4lZCIgJSAoc2VsZi5zZWNzLCBpbnQoc2VsZi5uc2VjcyAvIDEwMDApKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvbGliL1BlcmYvVHJhY2UvU2NoZWRHdWkucHkgYi90b29scy9wZXJmL3NjcmlwdHMvcHl0aG9uL1BlcmYtVHJhY2UtVXRpbC9saWIvUGVyZi9UcmFjZS9TY2hlZEd1aS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlhNTZlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvbGliL1BlcmYvVHJhY2UvU2NoZWRHdWkucHkKQEAgLTAsMCArMSwxODQgQEAKKyMgU2NoZWRHdWkucHkgLSBQeXRob24gZXh0ZW5zaW9uIGZvciBwZXJmIHRyYWNlLCBiYXNpYyBHVUkgY29kZSBmb3IKKyMJCXRyYWNlcyBkcmF3aW5nIGFuZCBvdmVydmlldy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIGJ5IEZyZWRlcmljIFdlaXNiZWNrZXIgPGZ3ZWlzYmVjQGdtYWlsLmNvbT4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisjIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLgorCisKK3RyeToKKwlpbXBvcnQgd3gKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKwlyYWlzZSBJbXBvcnRFcnJvciwgIllvdSBuZWVkIHRvIGluc3RhbGwgdGhlIHd4cHl0aG9uIGxpYiBmb3IgdGhpcyBzY3JpcHQiCisKKworY2xhc3MgUm9vdEZyYW1lKHd4LkZyYW1lKToKKwlZX09GRlNFVCA9IDEwMAorCVJFQ1RfSEVJR0hUID0gMTAwCisJUkVDVF9TUEFDRSA9IDUwCisJRVZFTlRfTUFSS0lOR19XSURUSCA9IDUKKworCWRlZiBfX2luaXRfXyhzZWxmLCBzY2hlZF90cmFjZXIsIHRpdGxlLCBwYXJlbnQgPSBOb25lLCBpZCA9IC0xKToKKwkJd3guRnJhbWUuX19pbml0X18oc2VsZiwgcGFyZW50LCBpZCwgdGl0bGUpCisKKwkJKHNlbGYuc2NyZWVuX3dpZHRoLCBzZWxmLnNjcmVlbl9oZWlnaHQpID0gd3guR2V0RGlzcGxheVNpemUoKQorCQlzZWxmLnNjcmVlbl93aWR0aCAtPSAxMAorCQlzZWxmLnNjcmVlbl9oZWlnaHQgLT0gMTAKKwkJc2VsZi56b29tID0gMC41CisJCXNlbGYuc2Nyb2xsX3NjYWxlID0gMjAKKwkJc2VsZi5zY2hlZF90cmFjZXIgPSBzY2hlZF90cmFjZXIKKwkJc2VsZi5zY2hlZF90cmFjZXIuc2V0X3Jvb3Rfd2luKHNlbGYpCisJCShzZWxmLnRzX3N0YXJ0LCBzZWxmLnRzX2VuZCkgPSBzY2hlZF90cmFjZXIuaW50ZXJ2YWwoKQorCQlzZWxmLnVwZGF0ZV93aWR0aF92aXJ0dWFsKCkKKwkJc2VsZi5ucl9yZWN0cyA9IHNjaGVkX3RyYWNlci5ucl9yZWN0YW5nbGVzKCkgKyAxCisJCXNlbGYuaGVpZ2h0X3ZpcnR1YWwgPSBSb290RnJhbWUuWV9PRkZTRVQgKyAoc2VsZi5ucl9yZWN0cyAqIChSb290RnJhbWUuUkVDVF9IRUlHSFQgKyBSb290RnJhbWUuUkVDVF9TUEFDRSkpCisKKwkJIyB3aG9sZSB3aW5kb3cgcGFuZWwKKwkJc2VsZi5wYW5lbCA9IHd4LlBhbmVsKHNlbGYsIHNpemU9KHNlbGYuc2NyZWVuX3dpZHRoLCBzZWxmLnNjcmVlbl9oZWlnaHQpKQorCisJCSMgc2Nyb2xsYWJsZSBjb250YWluZXIKKwkJc2VsZi5zY3JvbGwgPSB3eC5TY3JvbGxlZFdpbmRvdyhzZWxmLnBhbmVsKQorCQlzZWxmLnNjcm9sbC5TZXRTY3JvbGxiYXJzKHNlbGYuc2Nyb2xsX3NjYWxlLCBzZWxmLnNjcm9sbF9zY2FsZSwgc2VsZi53aWR0aF92aXJ0dWFsIC8gc2VsZi5zY3JvbGxfc2NhbGUsIHNlbGYuaGVpZ2h0X3ZpcnR1YWwgLyBzZWxmLnNjcm9sbF9zY2FsZSkKKwkJc2VsZi5zY3JvbGwuRW5hYmxlU2Nyb2xsaW5nKFRydWUsIFRydWUpCisJCXNlbGYuc2Nyb2xsLlNldEZvY3VzKCkKKworCQkjIHNjcm9sbGFibGUgZHJhd2luZyBhcmVhCisJCXNlbGYuc2Nyb2xsX3BhbmVsID0gd3guUGFuZWwoc2VsZi5zY3JvbGwsIHNpemU9KHNlbGYuc2NyZWVuX3dpZHRoIC0gMTUsIHNlbGYuc2NyZWVuX2hlaWdodCAvIDIpKQorCQlzZWxmLnNjcm9sbF9wYW5lbC5CaW5kKHd4LkVWVF9QQUlOVCwgc2VsZi5vbl9wYWludCkKKwkJc2VsZi5zY3JvbGxfcGFuZWwuQmluZCh3eC5FVlRfS0VZX0RPV04sIHNlbGYub25fa2V5X3ByZXNzKQorCQlzZWxmLnNjcm9sbF9wYW5lbC5CaW5kKHd4LkVWVF9MRUZUX0RPV04sIHNlbGYub25fbW91c2VfZG93bikKKwkJc2VsZi5zY3JvbGwuQmluZCh3eC5FVlRfUEFJTlQsIHNlbGYub25fcGFpbnQpCisJCXNlbGYuc2Nyb2xsLkJpbmQod3guRVZUX0tFWV9ET1dOLCBzZWxmLm9uX2tleV9wcmVzcykKKwkJc2VsZi5zY3JvbGwuQmluZCh3eC5FVlRfTEVGVF9ET1dOLCBzZWxmLm9uX21vdXNlX2Rvd24pCisKKwkJc2VsZi5zY3JvbGwuRml0KCkKKwkJc2VsZi5GaXQoKQorCisJCXNlbGYuc2Nyb2xsX3BhbmVsLlNldERpbWVuc2lvbnMoLTEsIC0xLCBzZWxmLndpZHRoX3ZpcnR1YWwsIHNlbGYuaGVpZ2h0X3ZpcnR1YWwsIHd4LlNJWkVfVVNFX0VYSVNUSU5HKQorCisJCXNlbGYudHh0ID0gTm9uZQorCisJCXNlbGYuU2hvdyhUcnVlKQorCisJZGVmIHVzX3RvX3B4KHNlbGYsIHZhbCk6CisJCXJldHVybiB2YWwgLyAoMTAgKiogMykgKiBzZWxmLnpvb20KKworCWRlZiBweF90b191cyhzZWxmLCB2YWwpOgorCQlyZXR1cm4gKHZhbCAvIHNlbGYuem9vbSkgKiAoMTAgKiogMykKKworCWRlZiBzY3JvbGxfc3RhcnQoc2VsZik6CisJCSh4LCB5KSA9IHNlbGYuc2Nyb2xsLkdldFZpZXdTdGFydCgpCisJCXJldHVybiAoeCAqIHNlbGYuc2Nyb2xsX3NjYWxlLCB5ICogc2VsZi5zY3JvbGxfc2NhbGUpCisKKwlkZWYgc2Nyb2xsX3N0YXJ0X3VzKHNlbGYpOgorCQkoeCwgeSkgPSBzZWxmLnNjcm9sbF9zdGFydCgpCisJCXJldHVybiBzZWxmLnB4X3RvX3VzKHgpCisKKwlkZWYgcGFpbnRfcmVjdGFuZ2xlX3pvbmUoc2VsZiwgbnIsIGNvbG9yLCB0b3BfY29sb3IsIHN0YXJ0LCBlbmQpOgorCQlvZmZzZXRfcHggPSBzZWxmLnVzX3RvX3B4KHN0YXJ0IC0gc2VsZi50c19zdGFydCkKKwkJd2lkdGhfcHggPSBzZWxmLnVzX3RvX3B4KGVuZCAtIHNlbGYudHNfc3RhcnQpCisKKwkJb2Zmc2V0X3B5ID0gUm9vdEZyYW1lLllfT0ZGU0VUICsgKG5yICogKFJvb3RGcmFtZS5SRUNUX0hFSUdIVCArIFJvb3RGcmFtZS5SRUNUX1NQQUNFKSkKKwkJd2lkdGhfcHkgPSBSb290RnJhbWUuUkVDVF9IRUlHSFQKKworCQlkYyA9IHNlbGYuZGMKKworCQlpZiB0b3BfY29sb3IgaXMgbm90IE5vbmU6CisJCQkociwgZywgYikgPSB0b3BfY29sb3IKKwkJCXRvcF9jb2xvciA9IHd4LkNvbG91cihyLCBnLCBiKQorCQkJYnJ1c2ggPSB3eC5CcnVzaCh0b3BfY29sb3IsIHd4LlNPTElEKQorCQkJZGMuU2V0QnJ1c2goYnJ1c2gpCisJCQlkYy5EcmF3UmVjdGFuZ2xlKG9mZnNldF9weCwgb2Zmc2V0X3B5LCB3aWR0aF9weCwgUm9vdEZyYW1lLkVWRU5UX01BUktJTkdfV0lEVEgpCisJCQl3aWR0aF9weSAtPSBSb290RnJhbWUuRVZFTlRfTUFSS0lOR19XSURUSAorCQkJb2Zmc2V0X3B5ICs9IFJvb3RGcmFtZS5FVkVOVF9NQVJLSU5HX1dJRFRICisKKwkJKHIgLGcsIGIpID0gY29sb3IKKwkJY29sb3IgPSB3eC5Db2xvdXIociwgZywgYikKKwkJYnJ1c2ggPSB3eC5CcnVzaChjb2xvciwgd3guU09MSUQpCisJCWRjLlNldEJydXNoKGJydXNoKQorCQlkYy5EcmF3UmVjdGFuZ2xlKG9mZnNldF9weCwgb2Zmc2V0X3B5LCB3aWR0aF9weCwgd2lkdGhfcHkpCisKKwlkZWYgdXBkYXRlX3JlY3RhbmdsZXMoc2VsZiwgZGMsIHN0YXJ0LCBlbmQpOgorCQlzdGFydCArPSBzZWxmLnRzX3N0YXJ0CisJCWVuZCArPSBzZWxmLnRzX3N0YXJ0CisJCXNlbGYuc2NoZWRfdHJhY2VyLmZpbGxfem9uZShzdGFydCwgZW5kKQorCisJZGVmIG9uX3BhaW50KHNlbGYsIGV2ZW50KToKKwkJZGMgPSB3eC5QYWludERDKHNlbGYuc2Nyb2xsX3BhbmVsKQorCQlzZWxmLmRjID0gZGMKKworCQl3aWR0aCA9IG1pbihzZWxmLndpZHRoX3ZpcnR1YWwsIHNlbGYuc2NyZWVuX3dpZHRoKQorCQkoeCwgeSkgPSBzZWxmLnNjcm9sbF9zdGFydCgpCisJCXN0YXJ0ID0gc2VsZi5weF90b191cyh4KQorCQllbmQgPSBzZWxmLnB4X3RvX3VzKHggKyB3aWR0aCkKKwkJc2VsZi51cGRhdGVfcmVjdGFuZ2xlcyhkYywgc3RhcnQsIGVuZCkKKworCWRlZiByZWN0X2Zyb21feXBpeGVsKHNlbGYsIHkpOgorCQl5IC09IFJvb3RGcmFtZS5ZX09GRlNFVAorCQlyZWN0ID0geSAvIChSb290RnJhbWUuUkVDVF9IRUlHSFQgKyBSb290RnJhbWUuUkVDVF9TUEFDRSkKKwkJaGVpZ2h0ID0geSAlIChSb290RnJhbWUuUkVDVF9IRUlHSFQgKyBSb290RnJhbWUuUkVDVF9TUEFDRSkKKworCQlpZiByZWN0IDwgMCBvciByZWN0ID4gc2VsZi5ucl9yZWN0cyAtIDEgb3IgaGVpZ2h0ID4gUm9vdEZyYW1lLlJFQ1RfSEVJR0hUOgorCQkJcmV0dXJuIC0xCisKKwkJcmV0dXJuIHJlY3QKKworCWRlZiB1cGRhdGVfc3VtbWFyeShzZWxmLCB0eHQpOgorCQlpZiBzZWxmLnR4dDoKKwkJCXNlbGYudHh0LkRlc3Ryb3koKQorCQlzZWxmLnR4dCA9IHd4LlN0YXRpY1RleHQoc2VsZi5wYW5lbCwgLTEsIHR4dCwgKDAsIChzZWxmLnNjcmVlbl9oZWlnaHQgLyAyKSArIDUwKSkKKworCisJZGVmIG9uX21vdXNlX2Rvd24oc2VsZiwgZXZlbnQpOgorCQkoeCwgeSkgPSBldmVudC5HZXRQb3NpdGlvblR1cGxlKCkKKwkJcmVjdCA9IHNlbGYucmVjdF9mcm9tX3lwaXhlbCh5KQorCQlpZiByZWN0ID09IC0xOgorCQkJcmV0dXJuCisKKwkJdCA9IHNlbGYucHhfdG9fdXMoeCkgKyBzZWxmLnRzX3N0YXJ0CisKKwkJc2VsZi5zY2hlZF90cmFjZXIubW91c2VfZG93bihyZWN0LCB0KQorCisKKwlkZWYgdXBkYXRlX3dpZHRoX3ZpcnR1YWwoc2VsZik6CisJCXNlbGYud2lkdGhfdmlydHVhbCA9IHNlbGYudXNfdG9fcHgoc2VsZi50c19lbmQgLSBzZWxmLnRzX3N0YXJ0KQorCisJZGVmIF9fem9vbShzZWxmLCB4KToKKwkJc2VsZi51cGRhdGVfd2lkdGhfdmlydHVhbCgpCisJCSh4cG9zLCB5cG9zKSA9IHNlbGYuc2Nyb2xsLkdldFZpZXdTdGFydCgpCisJCXhwb3MgPSBzZWxmLnVzX3RvX3B4KHgpIC8gc2VsZi5zY3JvbGxfc2NhbGUKKwkJc2VsZi5zY3JvbGwuU2V0U2Nyb2xsYmFycyhzZWxmLnNjcm9sbF9zY2FsZSwgc2VsZi5zY3JvbGxfc2NhbGUsIHNlbGYud2lkdGhfdmlydHVhbCAvIHNlbGYuc2Nyb2xsX3NjYWxlLCBzZWxmLmhlaWdodF92aXJ0dWFsIC8gc2VsZi5zY3JvbGxfc2NhbGUsIHhwb3MsIHlwb3MpCisJCXNlbGYuUmVmcmVzaCgpCisKKwlkZWYgem9vbV9pbihzZWxmKToKKwkJeCA9IHNlbGYuc2Nyb2xsX3N0YXJ0X3VzKCkKKwkJc2VsZi56b29tICo9IDIKKwkJc2VsZi5fX3pvb20oeCkKKworCWRlZiB6b29tX291dChzZWxmKToKKwkJeCA9IHNlbGYuc2Nyb2xsX3N0YXJ0X3VzKCkKKwkJc2VsZi56b29tIC89IDIKKwkJc2VsZi5fX3pvb20oeCkKKworCisJZGVmIG9uX2tleV9wcmVzcyhzZWxmLCBldmVudCk6CisJCWtleSA9IGV2ZW50LkdldFJhd0tleUNvZGUoKQorCQlpZiBrZXkgPT0gb3JkKCIrIik6CisJCQlzZWxmLnpvb21faW4oKQorCQkJcmV0dXJuCisJCWlmIGtleSA9PSBvcmQoIi0iKToKKwkJCXNlbGYuem9vbV9vdXQoKQorCQkJcmV0dXJuCisKKwkJa2V5ID0gZXZlbnQuR2V0S2V5Q29kZSgpCisJCSh4LCB5KSA9IHNlbGYuc2Nyb2xsLkdldFZpZXdTdGFydCgpCisJCWlmIGtleSA9PSB3eC5XWEtfUklHSFQ6CisJCQlzZWxmLnNjcm9sbC5TY3JvbGwoeCArIDEsIHkpCisJCWVsaWYga2V5ID09IHd4LldYS19MRUZUOgorCQkJc2VsZi5zY3JvbGwuU2Nyb2xsKHggLSAxLCB5KQorCQllbGlmIGtleSA9PSB3eC5XWEtfRE9XTjoKKwkJCXNlbGYuc2Nyb2xsLlNjcm9sbCh4LCB5ICsgMSkKKwkJZWxpZiBrZXkgPT0gd3guV1hLX1VQOgorCQkJc2VsZi5zY3JvbGwuU2Nyb2xsKHgsIHkgLSAxKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9iaW4vc2NoZWQtbWlncmF0aW9uLXJlY29yZCBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9weXRob24vYmluL3NjaGVkLW1pZ3JhdGlvbi1yZWNvcmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhM2U5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9weXRob24vYmluL3NjaGVkLW1pZ3JhdGlvbi1yZWNvcmQKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vYmFzaAorcGVyZiByZWNvcmQgLW0gMTYzODQgLWEgLWUgc2NoZWQ6c2NoZWRfd2FrZXVwIC1lIHNjaGVkOnNjaGVkX3dha2V1cF9uZXcgLWUgc2NoZWQ6c2NoZWRfc3dpdGNoIC1lIHNjaGVkOnNjaGVkX21pZ3JhdGVfdGFzayAkQApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9iaW4vc2NoZWQtbWlncmF0aW9uLXJlcG9ydCBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9weXRob24vYmluL3NjaGVkLW1pZ3JhdGlvbi1yZXBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMDVmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9weXRob24vYmluL3NjaGVkLW1pZ3JhdGlvbi1yZXBvcnQKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vYmFzaAorIyBkZXNjcmlwdGlvbjogc2NoZWQgbWlncmF0aW9uIG92ZXJ2aWV3CitwZXJmIHRyYWNlICRAIC1zIH4vbGliZXhlYy9wZXJmLWNvcmUvc2NyaXB0cy9weXRob24vc2NoZWQtbWlncmF0aW9uLnB5CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3NjcmlwdHMvcHl0aG9uL3NjaGVkLW1pZ3JhdGlvbi5weSBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9weXRob24vc2NoZWQtbWlncmF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzQzODMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3NjcmlwdHMvcHl0aG9uL3NjaGVkLW1pZ3JhdGlvbi5weQpAQCAtMCwwICsxLDQ2MSBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMKKyMgQ3B1IHRhc2sgbWlncmF0aW9uIG92ZXJ2aWV3IHRveQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgorIworIyBwZXJmIHRyYWNlIGV2ZW50IGhhbmRsZXJzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgcGVyZiB0cmFjZSAtZyBweXRob24KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisjIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLgorCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKKworc3lzLnBhdGguYXBwZW5kKG9zLmVudmlyb25bJ1BFUkZfRVhFQ19QQVRIJ10gKyBcCisJJy9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvbGliL1BlcmYvVHJhY2UnKQorc3lzLnBhdGguYXBwZW5kKCdzY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvbGliL1BlcmYvVHJhY2UnKQorCitmcm9tIHBlcmZfdHJhY2VfY29udGV4dCBpbXBvcnQgKgorZnJvbSBDb3JlIGltcG9ydCAqCitmcm9tIFNjaGVkR3VpIGltcG9ydCAqCisKKwordGhyZWFkcyA9IHsgMCA6ICJpZGxlIn0KKworZGVmIHRocmVhZF9uYW1lKHBpZCk6CisJcmV0dXJuICIlczolZCIgJSAodGhyZWFkc1twaWRdLCBwaWQpCisKK2NsYXNzIFJ1bnF1ZXVlRXZlbnRVbmtub3duOgorCUBzdGF0aWNtZXRob2QKKwlkZWYgY29sb3IoKToKKwkJcmV0dXJuIE5vbmUKKworCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJcmV0dXJuICJ1bmtub3duIgorCitjbGFzcyBSdW5xdWV1ZUV2ZW50U2xlZXA6CisJQHN0YXRpY21ldGhvZAorCWRlZiBjb2xvcigpOgorCQlyZXR1cm4gKDAsIDAsIDB4ZmYpCisKKwlkZWYgX19pbml0X18oc2VsZiwgc2xlZXBlcik6CisJCXNlbGYuc2xlZXBlciA9IHNsZWVwZXIKKworCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJcmV0dXJuICIlcyBnb25lIHRvIHNsZWVwIiAlIHRocmVhZF9uYW1lKHNlbGYuc2xlZXBlcikKKworY2xhc3MgUnVucXVldWVFdmVudFdha2V1cDoKKwlAc3RhdGljbWV0aG9kCisJZGVmIGNvbG9yKCk6CisJCXJldHVybiAoMHhmZiwgMHhmZiwgMCkKKworCWRlZiBfX2luaXRfXyhzZWxmLCB3YWtlZSk6CisJCXNlbGYud2FrZWUgPSB3YWtlZQorCisJZGVmIF9fcmVwcl9fKHNlbGYpOgorCQlyZXR1cm4gIiVzIHdva2UgdXAiICUgdGhyZWFkX25hbWUoc2VsZi53YWtlZSkKKworY2xhc3MgUnVucXVldWVFdmVudEZvcms6CisJQHN0YXRpY21ldGhvZAorCWRlZiBjb2xvcigpOgorCQlyZXR1cm4gKDAsIDB4ZmYsIDApCisKKwlkZWYgX19pbml0X18oc2VsZiwgY2hpbGQpOgorCQlzZWxmLmNoaWxkID0gY2hpbGQKKworCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJcmV0dXJuICJuZXcgZm9ya2VkIHRhc2sgJXMiICUgdGhyZWFkX25hbWUoc2VsZi5jaGlsZCkKKworY2xhc3MgUnVucXVldWVNaWdyYXRlSW46CisJQHN0YXRpY21ldGhvZAorCWRlZiBjb2xvcigpOgorCQlyZXR1cm4gKDAsIDB4ZjAsIDB4ZmYpCisKKwlkZWYgX19pbml0X18oc2VsZiwgbmV3KToKKwkJc2VsZi5uZXcgPSBuZXcKKworCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJcmV0dXJuICJ0YXNrIG1pZ3JhdGVkIGluICVzIiAlIHRocmVhZF9uYW1lKHNlbGYubmV3KQorCitjbGFzcyBSdW5xdWV1ZU1pZ3JhdGVPdXQ6CisJQHN0YXRpY21ldGhvZAorCWRlZiBjb2xvcigpOgorCQlyZXR1cm4gKDB4ZmYsIDAsIDB4ZmYpCisKKwlkZWYgX19pbml0X18oc2VsZiwgb2xkKToKKwkJc2VsZi5vbGQgPSBvbGQKKworCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJcmV0dXJuICJ0YXNrIG1pZ3JhdGVkIG91dCAlcyIgJSB0aHJlYWRfbmFtZShzZWxmLm9sZCkKKworY2xhc3MgUnVucXVldWVTbmFwc2hvdDoKKwlkZWYgX19pbml0X18oc2VsZiwgdGFza3MgPSBbMF0sIGV2ZW50ID0gUnVucXVldWVFdmVudFVua25vd24oKSk6CisJCXNlbGYudGFza3MgPSB0dXBsZSh0YXNrcykKKwkJc2VsZi5ldmVudCA9IGV2ZW50CisKKwlkZWYgc2NoZWRfc3dpdGNoKHNlbGYsIHByZXYsIHByZXZfc3RhdGUsIG5leHQpOgorCQlldmVudCA9IFJ1bnF1ZXVlRXZlbnRVbmtub3duKCkKKworCQlpZiB0YXNrU3RhdGUocHJldl9zdGF0ZSkgPT0gIlIiIGFuZCBuZXh0IGluIHNlbGYudGFza3MgXAorCQkJYW5kIHByZXYgaW4gc2VsZi50YXNrczoKKwkJCXJldHVybiBzZWxmCisKKwkJaWYgdGFza1N0YXRlKHByZXZfc3RhdGUpICE9ICJSIjoKKwkJCWV2ZW50ID0gUnVucXVldWVFdmVudFNsZWVwKHByZXYpCisKKwkJbmV4dF90YXNrcyA9IGxpc3Qoc2VsZi50YXNrc1s6XSkKKwkJaWYgcHJldiBpbiBzZWxmLnRhc2tzOgorCQkJaWYgdGFza1N0YXRlKHByZXZfc3RhdGUpICE9ICJSIjoKKwkJCQluZXh0X3Rhc2tzLnJlbW92ZShwcmV2KQorCQllbGlmIHRhc2tTdGF0ZShwcmV2X3N0YXRlKSA9PSAiUiI6CisJCQluZXh0X3Rhc2tzLmFwcGVuZChwcmV2KQorCisJCWlmIG5leHQgbm90IGluIG5leHRfdGFza3M6CisJCQluZXh0X3Rhc2tzLmFwcGVuZChuZXh0KQorCisJCXJldHVybiBSdW5xdWV1ZVNuYXBzaG90KG5leHRfdGFza3MsIGV2ZW50KQorCisJZGVmIG1pZ3JhdGVfb3V0KHNlbGYsIG9sZCk6CisJCWlmIG9sZCBub3QgaW4gc2VsZi50YXNrczoKKwkJCXJldHVybiBzZWxmCisJCW5leHRfdGFza3MgPSBbdGFzayBmb3IgdGFzayBpbiBzZWxmLnRhc2tzIGlmIHRhc2sgIT0gb2xkXQorCisJCXJldHVybiBSdW5xdWV1ZVNuYXBzaG90KG5leHRfdGFza3MsIFJ1bnF1ZXVlTWlncmF0ZU91dChvbGQpKQorCisJZGVmIF9fbWlncmF0ZV9pbihzZWxmLCBuZXcsIGV2ZW50KToKKwkJaWYgbmV3IGluIHNlbGYudGFza3M6CisJCQlzZWxmLmV2ZW50ID0gZXZlbnQKKwkJCXJldHVybiBzZWxmCisJCW5leHRfdGFza3MgPSBzZWxmLnRhc2tzWzpdICsgdHVwbGUoW25ld10pCisKKwkJcmV0dXJuIFJ1bnF1ZXVlU25hcHNob3QobmV4dF90YXNrcywgZXZlbnQpCisKKwlkZWYgbWlncmF0ZV9pbihzZWxmLCBuZXcpOgorCQlyZXR1cm4gc2VsZi5fX21pZ3JhdGVfaW4obmV3LCBSdW5xdWV1ZU1pZ3JhdGVJbihuZXcpKQorCisJZGVmIHdha2VfdXAoc2VsZiwgbmV3KToKKwkJcmV0dXJuIHNlbGYuX19taWdyYXRlX2luKG5ldywgUnVucXVldWVFdmVudFdha2V1cChuZXcpKQorCisJZGVmIHdha2VfdXBfbmV3KHNlbGYsIG5ldyk6CisJCXJldHVybiBzZWxmLl9fbWlncmF0ZV9pbihuZXcsIFJ1bnF1ZXVlRXZlbnRGb3JrKG5ldykpCisKKwlkZWYgbG9hZChzZWxmKToKKwkJIiIiIFByb3ZpZGUgdGhlIG51bWJlciBvZiB0YXNrcyBvbiB0aGUgcnVucXVldWUuCisJCSAgICBEb24ndCBjb3VudCBpZGxlIiIiCisJCXJldHVybiBsZW4oc2VsZi50YXNrcykgLSAxCisKKwlkZWYgX19yZXByX18oc2VsZik6CisJCXJldCA9IHNlbGYudGFza3MuX19yZXByX18oKQorCQlyZXQgKz0gc2VsZi5vcmlnaW5fdG9zdHJpbmcoKQorCisJCXJldHVybiByZXQKKworY2xhc3MgVGltZVNsaWNlOgorCWRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgcHJldik6CisJCXNlbGYuc3RhcnQgPSBzdGFydAorCQlzZWxmLnByZXYgPSBwcmV2CisJCXNlbGYuZW5kID0gc3RhcnQKKwkJIyBjcHVzIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudAorCQlzZWxmLmV2ZW50X2NwdXMgPSBbXQorCQlpZiBwcmV2IGlzIG5vdCBOb25lOgorCQkJc2VsZi50b3RhbF9sb2FkID0gcHJldi50b3RhbF9sb2FkCisJCQlzZWxmLnJxcyA9IHByZXYucnFzLmNvcHkoKQorCQllbHNlOgorCQkJc2VsZi5ycXMgPSBkZWZhdWx0ZGljdChSdW5xdWV1ZVNuYXBzaG90KQorCQkJc2VsZi50b3RhbF9sb2FkID0gMAorCisJZGVmIF9fdXBkYXRlX3RvdGFsX2xvYWQoc2VsZiwgb2xkX3JxLCBuZXdfcnEpOgorCQlkaWZmID0gbmV3X3JxLmxvYWQoKSAtIG9sZF9ycS5sb2FkKCkKKwkJc2VsZi50b3RhbF9sb2FkICs9IGRpZmYKKworCWRlZiBzY2hlZF9zd2l0Y2goc2VsZiwgdHNfbGlzdCwgcHJldiwgcHJldl9zdGF0ZSwgbmV4dCwgY3B1KToKKwkJb2xkX3JxID0gc2VsZi5wcmV2LnJxc1tjcHVdCisJCW5ld19ycSA9IG9sZF9ycS5zY2hlZF9zd2l0Y2gocHJldiwgcHJldl9zdGF0ZSwgbmV4dCkKKworCQlpZiBvbGRfcnEgaXMgbmV3X3JxOgorCQkJcmV0dXJuCisKKwkJc2VsZi5ycXNbY3B1XSA9IG5ld19ycQorCQlzZWxmLl9fdXBkYXRlX3RvdGFsX2xvYWQob2xkX3JxLCBuZXdfcnEpCisJCXRzX2xpc3QuYXBwZW5kKHNlbGYpCisJCXNlbGYuZXZlbnRfY3B1cyA9IFtjcHVdCisKKwlkZWYgbWlncmF0ZShzZWxmLCB0c19saXN0LCBuZXcsIG9sZF9jcHUsIG5ld19jcHUpOgorCQlpZiBvbGRfY3B1ID09IG5ld19jcHU6CisJCQlyZXR1cm4KKwkJb2xkX3JxID0gc2VsZi5wcmV2LnJxc1tvbGRfY3B1XQorCQlvdXRfcnEgPSBvbGRfcnEubWlncmF0ZV9vdXQobmV3KQorCQlzZWxmLnJxc1tvbGRfY3B1XSA9IG91dF9ycQorCQlzZWxmLl9fdXBkYXRlX3RvdGFsX2xvYWQob2xkX3JxLCBvdXRfcnEpCisKKwkJbmV3X3JxID0gc2VsZi5wcmV2LnJxc1tuZXdfY3B1XQorCQlpbl9ycSA9IG5ld19ycS5taWdyYXRlX2luKG5ldykKKwkJc2VsZi5ycXNbbmV3X2NwdV0gPSBpbl9ycQorCQlzZWxmLl9fdXBkYXRlX3RvdGFsX2xvYWQobmV3X3JxLCBpbl9ycSkKKworCQl0c19saXN0LmFwcGVuZChzZWxmKQorCisJCWlmIG9sZF9ycSBpcyBub3Qgb3V0X3JxOgorCQkJc2VsZi5ldmVudF9jcHVzLmFwcGVuZChvbGRfY3B1KQorCQlzZWxmLmV2ZW50X2NwdXMuYXBwZW5kKG5ld19jcHUpCisKKwlkZWYgd2FrZV91cChzZWxmLCB0c19saXN0LCBwaWQsIGNwdSwgZm9yayk6CisJCW9sZF9ycSA9IHNlbGYucHJldi5ycXNbY3B1XQorCQlpZiBmb3JrOgorCQkJbmV3X3JxID0gb2xkX3JxLndha2VfdXBfbmV3KHBpZCkKKwkJZWxzZToKKwkJCW5ld19ycSA9IG9sZF9ycS53YWtlX3VwKHBpZCkKKworCQlpZiBuZXdfcnEgaXMgb2xkX3JxOgorCQkJcmV0dXJuCisJCXNlbGYucnFzW2NwdV0gPSBuZXdfcnEKKwkJc2VsZi5fX3VwZGF0ZV90b3RhbF9sb2FkKG9sZF9ycSwgbmV3X3JxKQorCQl0c19saXN0LmFwcGVuZChzZWxmKQorCQlzZWxmLmV2ZW50X2NwdXMgPSBbY3B1XQorCisJZGVmIG5leHQoc2VsZiwgdCk6CisJCXNlbGYuZW5kID0gdAorCQlyZXR1cm4gVGltZVNsaWNlKHQsIHNlbGYpCisKK2NsYXNzIFRpbWVTbGljZUxpc3QoVXNlckxpc3QpOgorCWRlZiBfX2luaXRfXyhzZWxmLCBhcmcgPSBbXSk6CisJCXNlbGYuZGF0YSA9IGFyZworCisJZGVmIGdldF90aW1lX3NsaWNlKHNlbGYsIHRzKToKKwkJaWYgbGVuKHNlbGYuZGF0YSkgPT0gMDoKKwkJCXNsaWNlID0gVGltZVNsaWNlKHRzLCBUaW1lU2xpY2UoLTEsIE5vbmUpKQorCQllbHNlOgorCQkJc2xpY2UgPSBzZWxmLmRhdGFbLTFdLm5leHQodHMpCisJCXJldHVybiBzbGljZQorCisJZGVmIGZpbmRfdGltZV9zbGljZShzZWxmLCB0cyk6CisJCXN0YXJ0ID0gMAorCQllbmQgPSBsZW4oc2VsZi5kYXRhKQorCQlmb3VuZCA9IC0xCisJCXNlYXJjaGluZyA9IFRydWUKKwkJd2hpbGUgc2VhcmNoaW5nOgorCQkJaWYgc3RhcnQgPT0gZW5kIG9yIHN0YXJ0ID09IGVuZCAtIDE6CisJCQkJc2VhcmNoaW5nID0gRmFsc2UKKworCQkJaSA9IChlbmQgKyBzdGFydCkgLyAyCisJCQlpZiBzZWxmLmRhdGFbaV0uc3RhcnQgPD0gdHMgYW5kIHNlbGYuZGF0YVtpXS5lbmQgPj0gdHM6CisJCQkJZm91bmQgPSBpCisJCQkJZW5kID0gaQorCQkJCWNvbnRpbnVlCisKKwkJCWlmIHNlbGYuZGF0YVtpXS5lbmQgPCB0czoKKwkJCQlzdGFydCA9IGkKKworCQkJZWxpZiBzZWxmLmRhdGFbaV0uc3RhcnQgPiB0czoKKwkJCQllbmQgPSBpCisKKwkJcmV0dXJuIGZvdW5kCisKKwlkZWYgc2V0X3Jvb3Rfd2luKHNlbGYsIHdpbik6CisJCXNlbGYucm9vdF93aW4gPSB3aW4KKworCWRlZiBtb3VzZV9kb3duKHNlbGYsIGNwdSwgdCk6CisJCWlkeCA9IHNlbGYuZmluZF90aW1lX3NsaWNlKHQpCisJCWlmIGlkeCA9PSAtMToKKwkJCXJldHVybgorCisJCXRzID0gc2VsZltpZHhdCisJCXJxID0gdHMucnFzW2NwdV0KKwkJcmF3ID0gIkNQVTogJWRcbiIgJSBjcHUKKwkJcmF3ICs9ICJMYXN0IGV2ZW50IDogJXNcbiIgJSBycS5ldmVudC5fX3JlcHJfXygpCisJCXJhdyArPSAiVGltZXN0YW1wIDogJWQuJTA2ZFxuIiAlICh0cy5zdGFydCAvICgxMCAqKiA5KSwgKHRzLnN0YXJ0ICUgKDEwICoqIDkpKSAvIDEwMDApCisJCXJhdyArPSAiRHVyYXRpb24gOiAlNmQgdXNcbiIgJSAoKHRzLmVuZCAtIHRzLnN0YXJ0KSAvICgxMCAqKiA2KSkKKwkJcmF3ICs9ICJMb2FkID0gJWRcbiIgJSBycS5sb2FkKCkKKwkJZm9yIHQgaW4gcnEudGFza3M6CisJCQlyYXcgKz0gIiVzIFxuIiAlIHRocmVhZF9uYW1lKHQpCisKKwkJc2VsZi5yb290X3dpbi51cGRhdGVfc3VtbWFyeShyYXcpCisKKwlkZWYgdXBkYXRlX3JlY3RhbmdsZV9jcHUoc2VsZiwgc2xpY2UsIGNwdSk6CisJCXJxID0gc2xpY2UucnFzW2NwdV0KKworCQlpZiBzbGljZS50b3RhbF9sb2FkICE9IDA6CisJCQlsb2FkX3JhdGUgPSBycS5sb2FkKCkgLyBmbG9hdChzbGljZS50b3RhbF9sb2FkKQorCQllbHNlOgorCQkJbG9hZF9yYXRlID0gMAorCisJCXJlZF9wb3dlciA9IGludCgweGZmIC0gKDB4ZmYgKiBsb2FkX3JhdGUpKQorCQljb2xvciA9ICgweGZmLCByZWRfcG93ZXIsIHJlZF9wb3dlcikKKworCQl0b3BfY29sb3IgPSBOb25lCisKKwkJaWYgY3B1IGluIHNsaWNlLmV2ZW50X2NwdXM6CisJCQl0b3BfY29sb3IgPSBycS5ldmVudC5jb2xvcigpCisKKwkJc2VsZi5yb290X3dpbi5wYWludF9yZWN0YW5nbGVfem9uZShjcHUsIGNvbG9yLCB0b3BfY29sb3IsIHNsaWNlLnN0YXJ0LCBzbGljZS5lbmQpCisKKwlkZWYgZmlsbF96b25lKHNlbGYsIHN0YXJ0LCBlbmQpOgorCQlpID0gc2VsZi5maW5kX3RpbWVfc2xpY2Uoc3RhcnQpCisJCWlmIGkgPT0gLTE6CisJCQlyZXR1cm4KKworCQlmb3IgaSBpbiB4cmFuZ2UoaSwgbGVuKHNlbGYuZGF0YSkpOgorCQkJdGltZXNsaWNlID0gc2VsZi5kYXRhW2ldCisJCQlpZiB0aW1lc2xpY2Uuc3RhcnQgPiBlbmQ6CisJCQkJcmV0dXJuCisKKwkJCWZvciBjcHUgaW4gdGltZXNsaWNlLnJxczoKKwkJCQlzZWxmLnVwZGF0ZV9yZWN0YW5nbGVfY3B1KHRpbWVzbGljZSwgY3B1KQorCisJZGVmIGludGVydmFsKHNlbGYpOgorCQlpZiBsZW4oc2VsZi5kYXRhKSA9PSAwOgorCQkJcmV0dXJuICgwLCAwKQorCisJCXJldHVybiAoc2VsZi5kYXRhWzBdLnN0YXJ0LCBzZWxmLmRhdGFbLTFdLmVuZCkKKworCWRlZiBucl9yZWN0YW5nbGVzKHNlbGYpOgorCQlsYXN0X3RzID0gc2VsZi5kYXRhWy0xXQorCQltYXhfY3B1ID0gMAorCQlmb3IgY3B1IGluIGxhc3RfdHMucnFzOgorCQkJaWYgY3B1ID4gbWF4X2NwdToKKwkJCQltYXhfY3B1ID0gY3B1CisJCXJldHVybiBtYXhfY3B1CisKKworY2xhc3MgU2NoZWRFdmVudFByb3h5OgorCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi5jdXJyZW50X3RzayA9IGRlZmF1bHRkaWN0KGxhbWJkYSA6IC0xKQorCQlzZWxmLnRpbWVzbGljZXMgPSBUaW1lU2xpY2VMaXN0KCkKKworCWRlZiBzY2hlZF9zd2l0Y2goc2VsZiwgaGVhZGVycywgcHJldl9jb21tLCBwcmV2X3BpZCwgcHJldl9wcmlvLCBwcmV2X3N0YXRlLAorCQkJIG5leHRfY29tbSwgbmV4dF9waWQsIG5leHRfcHJpbyk6CisJCSIiIiBFbnN1cmUgdGhlIHRhc2sgd2Ugc2NoZWQgb3V0IHRoaXMgY3B1IGlzIHJlYWxseSB0aGUgb25lCisJCSAgICB3ZSBsb2dnZWQuIE90aGVyd2lzZSB3ZSBtYXkgaGF2ZSBtaXNzZWQgdHJhY2VzICIiIgorCisJCW9uX2NwdV90YXNrID0gc2VsZi5jdXJyZW50X3Rza1toZWFkZXJzLmNwdV0KKworCQlpZiBvbl9jcHVfdGFzayAhPSAtMSBhbmQgb25fY3B1X3Rhc2sgIT0gcHJldl9waWQ6CisJCQlwcmludCAiU2NoZWQgc3dpdGNoIGV2ZW50IHJlamVjdGVkIHRzOiAlcyBjcHU6ICVkIHByZXY6ICVzKCVkKSBuZXh0OiAlcyglZCkiICUgXAorCQkJCShoZWFkZXJzLnRzX2Zvcm1hdCgpLCBoZWFkZXJzLmNwdSwgcHJldl9jb21tLCBwcmV2X3BpZCwgbmV4dF9jb21tLCBuZXh0X3BpZCkKKworCQl0aHJlYWRzW3ByZXZfcGlkXSA9IHByZXZfY29tbQorCQl0aHJlYWRzW25leHRfcGlkXSA9IG5leHRfY29tbQorCQlzZWxmLmN1cnJlbnRfdHNrW2hlYWRlcnMuY3B1XSA9IG5leHRfcGlkCisKKwkJdHMgPSBzZWxmLnRpbWVzbGljZXMuZ2V0X3RpbWVfc2xpY2UoaGVhZGVycy50cygpKQorCQl0cy5zY2hlZF9zd2l0Y2goc2VsZi50aW1lc2xpY2VzLCBwcmV2X3BpZCwgcHJldl9zdGF0ZSwgbmV4dF9waWQsIGhlYWRlcnMuY3B1KQorCisJZGVmIG1pZ3JhdGUoc2VsZiwgaGVhZGVycywgcGlkLCBwcmlvLCBvcmlnX2NwdSwgZGVzdF9jcHUpOgorCQl0cyA9IHNlbGYudGltZXNsaWNlcy5nZXRfdGltZV9zbGljZShoZWFkZXJzLnRzKCkpCisJCXRzLm1pZ3JhdGUoc2VsZi50aW1lc2xpY2VzLCBwaWQsIG9yaWdfY3B1LCBkZXN0X2NwdSkKKworCWRlZiB3YWtlX3VwKHNlbGYsIGhlYWRlcnMsIGNvbW0sIHBpZCwgc3VjY2VzcywgdGFyZ2V0X2NwdSwgZm9yayk6CisJCWlmIHN1Y2Nlc3MgPT0gMDoKKwkJCXJldHVybgorCQl0cyA9IHNlbGYudGltZXNsaWNlcy5nZXRfdGltZV9zbGljZShoZWFkZXJzLnRzKCkpCisJCXRzLndha2VfdXAoc2VsZi50aW1lc2xpY2VzLCBwaWQsIHRhcmdldF9jcHUsIGZvcmspCisKKworZGVmIHRyYWNlX2JlZ2luKCk6CisJZ2xvYmFsIHBhcnNlcgorCXBhcnNlciA9IFNjaGVkRXZlbnRQcm94eSgpCisKK2RlZiB0cmFjZV9lbmQoKToKKwlhcHAgPSB3eC5BcHAoRmFsc2UpCisJdGltZXNsaWNlcyA9IHBhcnNlci50aW1lc2xpY2VzCisJZnJhbWUgPSBSb290RnJhbWUodGltZXNsaWNlcywgIk1pZ3JhdGlvbiIpCisJYXBwLk1haW5Mb29wKCkKKworZGVmIHNjaGVkX19zY2hlZF9zdGF0X3J1bnRpbWUoZXZlbnRfbmFtZSwgY29udGV4dCwgY29tbW9uX2NwdSwKKwljb21tb25fc2VjcywgY29tbW9uX25zZWNzLCBjb21tb25fcGlkLCBjb21tb25fY29tbSwKKwljb21tLCBwaWQsIHJ1bnRpbWUsIHZydW50aW1lKToKKwlwYXNzCisKK2RlZiBzY2hlZF9fc2NoZWRfc3RhdF9pb3dhaXQoZXZlbnRfbmFtZSwgY29udGV4dCwgY29tbW9uX2NwdSwKKwljb21tb25fc2VjcywgY29tbW9uX25zZWNzLCBjb21tb25fcGlkLCBjb21tb25fY29tbSwKKwljb21tLCBwaWQsIGRlbGF5KToKKwlwYXNzCisKK2RlZiBzY2hlZF9fc2NoZWRfc3RhdF9zbGVlcChldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgZGVsYXkpOgorCXBhc3MKKworZGVmIHNjaGVkX19zY2hlZF9zdGF0X3dhaXQoZXZlbnRfbmFtZSwgY29udGV4dCwgY29tbW9uX2NwdSwKKwljb21tb25fc2VjcywgY29tbW9uX25zZWNzLCBjb21tb25fcGlkLCBjb21tb25fY29tbSwKKwljb21tLCBwaWQsIGRlbGF5KToKKwlwYXNzCisKK2RlZiBzY2hlZF9fc2NoZWRfcHJvY2Vzc19mb3JrKGV2ZW50X25hbWUsIGNvbnRleHQsIGNvbW1vbl9jcHUsCisJY29tbW9uX3NlY3MsIGNvbW1vbl9uc2VjcywgY29tbW9uX3BpZCwgY29tbW9uX2NvbW0sCisJcGFyZW50X2NvbW0sIHBhcmVudF9waWQsIGNoaWxkX2NvbW0sIGNoaWxkX3BpZCk6CisJcGFzcworCitkZWYgc2NoZWRfX3NjaGVkX3Byb2Nlc3Nfd2FpdChldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbyk6CisJcGFzcworCitkZWYgc2NoZWRfX3NjaGVkX3Byb2Nlc3NfZXhpdChldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbyk6CisJcGFzcworCitkZWYgc2NoZWRfX3NjaGVkX3Byb2Nlc3NfZnJlZShldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbyk6CisJcGFzcworCitkZWYgc2NoZWRfX3NjaGVkX21pZ3JhdGVfdGFzayhldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbywgb3JpZ19jcHUsCisJZGVzdF9jcHUpOgorCWhlYWRlcnMgPSBFdmVudEhlYWRlcnMoY29tbW9uX2NwdSwgY29tbW9uX3NlY3MsIGNvbW1vbl9uc2VjcywKKwkJCQljb21tb25fcGlkLCBjb21tb25fY29tbSkKKwlwYXJzZXIubWlncmF0ZShoZWFkZXJzLCBwaWQsIHByaW8sIG9yaWdfY3B1LCBkZXN0X2NwdSkKKworZGVmIHNjaGVkX19zY2hlZF9zd2l0Y2goZXZlbnRfbmFtZSwgY29udGV4dCwgY29tbW9uX2NwdSwKKwljb21tb25fc2VjcywgY29tbW9uX25zZWNzLCBjb21tb25fcGlkLCBjb21tb25fY29tbSwKKwlwcmV2X2NvbW0sIHByZXZfcGlkLCBwcmV2X3ByaW8sIHByZXZfc3RhdGUsCisJbmV4dF9jb21tLCBuZXh0X3BpZCwgbmV4dF9wcmlvKToKKworCWhlYWRlcnMgPSBFdmVudEhlYWRlcnMoY29tbW9uX2NwdSwgY29tbW9uX3NlY3MsIGNvbW1vbl9uc2VjcywKKwkJCQljb21tb25fcGlkLCBjb21tb25fY29tbSkKKwlwYXJzZXIuc2NoZWRfc3dpdGNoKGhlYWRlcnMsIHByZXZfY29tbSwgcHJldl9waWQsIHByZXZfcHJpbywgcHJldl9zdGF0ZSwKKwkJCSBuZXh0X2NvbW0sIG5leHRfcGlkLCBuZXh0X3ByaW8pCisKK2RlZiBzY2hlZF9fc2NoZWRfd2FrZXVwX25ldyhldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbywgc3VjY2VzcywKKwl0YXJnZXRfY3B1KToKKwloZWFkZXJzID0gRXZlbnRIZWFkZXJzKGNvbW1vbl9jcHUsIGNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsCisJCQkJY29tbW9uX3BpZCwgY29tbW9uX2NvbW0pCisJcGFyc2VyLndha2VfdXAoaGVhZGVycywgY29tbSwgcGlkLCBzdWNjZXNzLCB0YXJnZXRfY3B1LCAxKQorCitkZWYgc2NoZWRfX3NjaGVkX3dha2V1cChldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbywgc3VjY2VzcywKKwl0YXJnZXRfY3B1KToKKwloZWFkZXJzID0gRXZlbnRIZWFkZXJzKGNvbW1vbl9jcHUsIGNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsCisJCQkJY29tbW9uX3BpZCwgY29tbW9uX2NvbW0pCisJcGFyc2VyLndha2VfdXAoaGVhZGVycywgY29tbSwgcGlkLCBzdWNjZXNzLCB0YXJnZXRfY3B1LCAwKQorCitkZWYgc2NoZWRfX3NjaGVkX3dhaXRfdGFzayhldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LAorCWNvbW1vbl9zZWNzLCBjb21tb25fbnNlY3MsIGNvbW1vbl9waWQsIGNvbW1vbl9jb21tLAorCWNvbW0sIHBpZCwgcHJpbyk6CisJcGFzcworCitkZWYgc2NoZWRfX3NjaGVkX2t0aHJlYWRfc3RvcF9yZXQoZXZlbnRfbmFtZSwgY29udGV4dCwgY29tbW9uX2NwdSwKKwljb21tb25fc2VjcywgY29tbW9uX25zZWNzLCBjb21tb25fcGlkLCBjb21tb25fY29tbSwKKwlyZXQpOgorCXBhc3MKKworZGVmIHNjaGVkX19zY2hlZF9rdGhyZWFkX3N0b3AoZXZlbnRfbmFtZSwgY29udGV4dCwgY29tbW9uX2NwdSwKKwljb21tb25fc2VjcywgY29tbW9uX25zZWNzLCBjb21tb25fcGlkLCBjb21tb25fY29tbSwKKwljb21tLCBwaWQpOgorCXBhc3MKKworZGVmIHRyYWNlX3VuaGFuZGxlZChldmVudF9uYW1lLCBjb250ZXh0LCBjb21tb25fY3B1LCBjb21tb25fc2VjcywgY29tbW9uX25zZWNzLAorCQljb21tb25fcGlkLCBjb21tb25fY29tbSk6CisJcGFzcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2J1aWxkLWlkLmMgYi90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYwppbmRleCA3MGM1Y2Y4Li5lNDM3ZWRiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYworKysgYi90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImV2ZW50LmgiCiAjaW5jbHVkZSAic3ltYm9sLmgiCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIGludCBidWlsZF9pZF9fbWFya19kc29faGl0KGV2ZW50X3QgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQogewpAQCAtMzQsMjggKzM1LDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZXZlbnRfX2V4aXRfZGVsX3RocmVhZChldmVudF90ICpzZWxmLCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBzZWxmLT5mb3JrLnRpZCk7CisKKwlkdW1wX3ByaW50ZigiKCVkOiVkKTooJWQ6JWQpXG4iLCBzZWxmLT5mb3JrLnBpZCwgc2VsZi0+Zm9yay50aWQsCisJCSAgICBzZWxmLT5mb3JrLnBwaWQsIHNlbGYtPmZvcmsucHRpZCk7CisKKwlpZiAodGhyZWFkKSB7CisJCXJiX2VyYXNlKCZ0aHJlYWQtPnJiX25vZGUsICZzZXNzaW9uLT50aHJlYWRzKTsKKwkJc2Vzc2lvbi0+bGFzdF9tYXRjaCA9IE5VTEw7CisJCXRocmVhZF9fZGVsZXRlKHRocmVhZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBwZXJmX2V2ZW50X29wcyBidWlsZF9pZF9fbWFya19kc29faGl0X29wcyA9IHsKIAkuc2FtcGxlCT0gYnVpbGRfaWRfX21hcmtfZHNvX2hpdCwKIAkubW1hcAk9IGV2ZW50X19wcm9jZXNzX21tYXAsCiAJLmZvcmsJPSBldmVudF9fcHJvY2Vzc190YXNrLAorCS5leGl0CT0gZXZlbnRfX2V4aXRfZGVsX3RocmVhZCwKIH07CiAKIGNoYXIgKmRzb19fYnVpbGRfaWRfZmlsZW5hbWUoc3RydWN0IGRzbyAqc2VsZiwgY2hhciAqYmYsIHNpemVfdCBzaXplKQogewogCWNoYXIgYnVpbGRfaWRfaGV4W0JVSUxEX0lEX1NJWkUgKiAyICsgMV07Ci0JY29uc3QgY2hhciAqaG9tZTsKIAogCWlmICghc2VsZi0+aGFzX2J1aWxkX2lkKQogCQlyZXR1cm4gTlVMTDsKIAogCWJ1aWxkX2lkX19zcHJpbnRmKHNlbGYtPmJ1aWxkX2lkLCBzaXplb2Yoc2VsZi0+YnVpbGRfaWQpLCBidWlsZF9pZF9oZXgpOwotCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKIAlpZiAoYmYgPT0gTlVMTCkgewotCQlpZiAoYXNwcmludGYoJmJmLCAiJXMvJXMvLmJ1aWxkLWlkLyUuMnMvJXMiLCBob21lLAotCQkJICAgICBERUJVR19DQUNIRV9ESVIsIGJ1aWxkX2lkX2hleCwgYnVpbGRfaWRfaGV4ICsgMikgPCAwKQorCQlpZiAoYXNwcmludGYoJmJmLCAiJXMvLmJ1aWxkLWlkLyUuMnMvJXMiLCBidWlsZGlkX2RpciwKKwkJCSAgICAgYnVpbGRfaWRfaGV4LCBidWlsZF9pZF9oZXggKyAyKSA8IDApCiAJCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UKLQkJc25wcmludGYoYmYsIHNpemUsICIlcy8lcy8uYnVpbGQtaWQvJS4ycy8lcyIsIGhvbWUsCi0JCQkgREVCVUdfQ0FDSEVfRElSLCBidWlsZF9pZF9oZXgsIGJ1aWxkX2lkX2hleCArIDIpOworCQlzbnByaW50ZihiZiwgc2l6ZSwgIiVzLy5idWlsZC1pZC8lLjJzLyVzIiwgYnVpbGRpZF9kaXIsCisJCQkgYnVpbGRfaWRfaGV4LCBidWlsZF9pZF9oZXggKyAyKTsKIAlyZXR1cm4gYmY7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY2FjaGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9jYWNoZS5oCmluZGV4IDY1ZmU2NjQuLjI3ZTllYmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9jYWNoZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jYWNoZS5oCkBAIC0yMyw2ICsyMyw3IEBACiBleHRlcm4gaW50IHBlcmZfY29uZmlnX2ludChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IHBlcmZfY29uZmlnX2Jvb2woY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogZXh0ZXJuIGludCBjb25maWdfZXJyb3Jfbm9uYm9vbChjb25zdCBjaGFyICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKnBlcmZfY29uZmlnX2Rpcm5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogCiAvKiBwYWdlci5jICovCiBleHRlcm4gdm9pZCBzZXR1cF9wYWdlcih2b2lkKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uYyBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uYwppbmRleCA1MmM3NzdlLi5mMjMxZjQzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImNhbGxjaGFpbi5oIgogCi1ib29sIGlwX2NhbGxjaGFpbl9fdmFsaWQoc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sIGV2ZW50X3QgKmV2ZW50KQorYm9vbCBpcF9jYWxsY2hhaW5fX3ZhbGlkKHN0cnVjdCBpcF9jYWxsY2hhaW4gKmNoYWluLCBjb25zdCBldmVudF90ICpldmVudCkKIHsKIAl1bnNpZ25lZCBpbnQgY2hhaW5fc2l6ZSA9IGV2ZW50LT5oZWFkZXIuc2l6ZTsKIAljaGFpbl9zaXplIC09ICh1bnNpZ25lZCBsb25nKSZldmVudC0+aXAuX19tb3JlX2RhdGEgLSAodW5zaWduZWQgbG9uZylldmVudDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaCBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaAppbmRleCBmMmU5ZWUxLi42MjRhOTZjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5oCkBAIC02Myw1ICs2Myw1IEBACiBpbnQgYXBwZW5kX2NoYWluKHN0cnVjdCBjYWxsY2hhaW5fbm9kZSAqcm9vdCwgc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sCiAJCSBzdHJ1Y3QgbWFwX3N5bWJvbCAqc3ltcywgdTY0IHBlcmlvZCk7CiAKLWJvb2wgaXBfY2FsbGNoYWluX192YWxpZChzdHJ1Y3QgaXBfY2FsbGNoYWluICpjaGFpbiwgZXZlbnRfdCAqZXZlbnQpOworYm9vbCBpcF9jYWxsY2hhaW5fX3ZhbGlkKHN0cnVjdCBpcF9jYWxsY2hhaW4gKmNoYWluLCBjb25zdCBldmVudF90ICpldmVudCk7CiAjZW5kaWYJLyogX19QRVJGX0NBTExDSEFJTl9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY29uZmlnLmMgYi90b29scy9wZXJmL3V0aWwvY29uZmlnLmMKaW5kZXggZGFiZTg5Mi4uZTAyZDc4YyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NvbmZpZy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYwpAQCAtMTEsNiArMTEsMTEgQEAKIAogI2RlZmluZSBNQVhOQU1FICgyNTYpCiAKKyNkZWZpbmUgREVCVUdfQ0FDSEVfRElSICIuZGVidWciCisKKworY2hhciBidWlsZGlkX2RpcltNQVhQQVRITEVOXTsgLyogcm9vdCBkaXIgZm9yIGJ1aWxkaWQsIGJpbmFyeSBjYWNoZSAqLworCiBzdGF0aWMgRklMRSAqY29uZmlnX2ZpbGU7CiBzdGF0aWMgY29uc3QgY2hhciAqY29uZmlnX2ZpbGVfbmFtZTsKIHN0YXRpYyBpbnQgY29uZmlnX2xpbmVucjsKQEAgLTEyNyw3ICsxMzIsNyBAQAogCQkJYnJlYWs7CiAJCWlmICghaXNrZXljaGFyKGMpKQogCQkJYnJlYWs7Ci0JCW5hbWVbbGVuKytdID0gdG9sb3dlcihjKTsKKwkJbmFtZVtsZW4rK10gPSBjOwogCQlpZiAobGVuID49IE1BWE5BTUUpCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzI3LDYgKzMzMiwxMyBAQAogCXJldHVybiAhIXBlcmZfY29uZmlnX2Jvb2xfb3JfaW50KG5hbWUsIHZhbHVlLCAmZGlzY2FyZCk7CiB9CiAKK2NvbnN0IGNoYXIgKnBlcmZfY29uZmlnX2Rpcm5hbWUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdmFsdWU7Cit9CisKIHN0YXRpYyBpbnQgcGVyZl9kZWZhdWx0X2NvcmVfY29uZmlnKGNvbnN0IGNoYXIgKnZhciBfX3VzZWQsIGNvbnN0IGNoYXIgKnZhbHVlIF9fdXNlZCkKIHsKIAkvKiBBZGQgb3RoZXIgY29uZmlnIHZhcmlhYmxlcyBoZXJlIGFuZCB0byBEb2N1bWVudGF0aW9uL2NvbmZpZy50eHQuICovCkBAIC00MjgsMyArNDQwLDUzIEBACiB7CiAJcmV0dXJuIGVycm9yKCJNaXNzaW5nIHZhbHVlIGZvciAnJXMnIiwgdmFyKTsKIH0KKworc3RydWN0IGJ1aWxkaWRfZGlyX2NvbmZpZyB7CisJY2hhciAqZGlyOworfTsKKworc3RhdGljIGludCBidWlsZGlkX2Rpcl9jb21tYW5kX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlLAorCQkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJ1aWxkaWRfZGlyX2NvbmZpZyAqYyA9IGRhdGE7CisJY29uc3QgY2hhciAqdjsKKworCS8qIHNhbWUgZGlyIGZvciBhbGwgY29tbWFuZHMgKi8KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJidWlsZGlkLiIpICYmICFzdHJjbXAodmFyICsgOCwgImRpciIpKSB7CisJCXYgPSBwZXJmX2NvbmZpZ19kaXJuYW1lKHZhciwgdmFsdWUpOworCQlpZiAoIXYpCisJCQlyZXR1cm4gLTE7CisJCXN0cm5jcHkoYy0+ZGlyLCB2LCBNQVhQQVRITEVOLTEpOworCQljLT5kaXJbTUFYUEFUSExFTi0xXSA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19idWlsZGlkX2Rpcl9jb25maWcodm9pZCkKK3sKKwlzdHJ1Y3QgYnVpbGRpZF9kaXJfY29uZmlnIGM7CisJYy5kaXIgPSBidWlsZGlkX2RpcjsKKwlwZXJmX2NvbmZpZyhidWlsZGlkX2Rpcl9jb21tYW5kX2NvbmZpZywgJmMpOworfQorCit2b2lkIHNldF9idWlsZGlkX2Rpcih2b2lkKQoreworCWJ1aWxkaWRfZGlyWzBdID0gJ1wwJzsKKworCS8qIHRyeSBjb25maWcgZmlsZSAqLworCWNoZWNrX2J1aWxkaWRfZGlyX2NvbmZpZygpOworCisJLyogZGVmYXVsdCB0byAkSE9NRS8uZGVidWcgKi8KKwlpZiAoYnVpbGRpZF9kaXJbMF0gPT0gJ1wwJykgeworCQljaGFyICp2ID0gZ2V0ZW52KCJIT01FIik7CisJCWlmICh2KSB7CisJCQlzbnByaW50ZihidWlsZGlkX2RpciwgTUFYUEFUSExFTi0xLCAiJXMvJXMiLAorCQkJCSB2LCBERUJVR19DQUNIRV9ESVIpOworCQl9IGVsc2UgeworCQkJc3RybmNweShidWlsZGlkX2RpciwgREVCVUdfQ0FDSEVfRElSLCBNQVhQQVRITEVOLTEpOworCQl9CisJCWJ1aWxkaWRfZGlyW01BWFBBVEhMRU4tMV0gPSAnXDAnOworCX0KKwkvKiBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGV4dGVybmFsIGNvbW1hbmRzICovCisJc2V0ZW52KCJQRVJGX0JVSUxESURfRElSIiwgYnVpbGRpZF9kaXIsIDEpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2NwdW1hcC5jIGIvdG9vbHMvcGVyZi91dGlsL2NwdW1hcC5jCmluZGV4IDRlMDE0OTAuLjBmOWI4ZDcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9jcHVtYXAuYworKysgYi90b29scy9wZXJmL3V0aWwvY3B1bWFwLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAlyZXR1cm4gbnJfY3B1czsKIH0KIAotaW50IHJlYWRfY3B1X21hcCh2b2lkKQorc3RhdGljIGludCByZWFkX2FsbF9jcHVfbWFwKHZvaWQpCiB7CiAJRklMRSAqb25sbmY7CiAJaW50IG5yX2NwdXMgPSAwOwpAQCAtNTcsMyArNTcsNTggQEAKIAogCXJldHVybiBkZWZhdWx0X2NwdV9tYXAoKTsKIH0KKworaW50IHJlYWRfY3B1X21hcChjb25zdCBjaGFyICpjcHVfbGlzdCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2NwdSwgZW5kX2NwdSA9IDA7CisJY2hhciAqcCA9IE5VTEw7CisJaW50IGksIG5yX2NwdXMgPSAwOworCisJaWYgKCFjcHVfbGlzdCkKKwkJcmV0dXJuIHJlYWRfYWxsX2NwdV9tYXAoKTsKKworCWlmICghaXNkaWdpdCgqY3B1X2xpc3QpKQorCQlnb3RvIGludmFsaWQ7CisKKwl3aGlsZSAoaXNkaWdpdCgqY3B1X2xpc3QpKSB7CisJCXAgPSBOVUxMOworCQlzdGFydF9jcHUgPSBzdHJ0b3VsKGNwdV9saXN0LCAmcCwgMCk7CisJCWlmIChzdGFydF9jcHUgPj0gSU5UX01BWAorCQkgICAgfHwgKCpwICE9ICdcMCcgJiYgKnAgIT0gJywnICYmICpwICE9ICctJykpCisJCQlnb3RvIGludmFsaWQ7CisKKwkJaWYgKCpwID09ICctJykgeworCQkJY3B1X2xpc3QgPSArK3A7CisJCQlwID0gTlVMTDsKKwkJCWVuZF9jcHUgPSBzdHJ0b3VsKGNwdV9saXN0LCAmcCwgMCk7CisKKwkJCWlmIChlbmRfY3B1ID49IElOVF9NQVggfHwgKCpwICE9ICdcMCcgJiYgKnAgIT0gJywnKSkKKwkJCQlnb3RvIGludmFsaWQ7CisKKwkJCWlmIChlbmRfY3B1IDwgc3RhcnRfY3B1KQorCQkJCWdvdG8gaW52YWxpZDsKKwkJfSBlbHNlIHsKKwkJCWVuZF9jcHUgPSBzdGFydF9jcHU7CisJCX0KKworCQlmb3IgKDsgc3RhcnRfY3B1IDw9IGVuZF9jcHU7IHN0YXJ0X2NwdSsrKSB7CisJCQkvKiBjaGVjayBmb3IgZHVwbGljYXRlcyAqLworCQkJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykKKwkJCQlpZiAoY3B1bWFwW2ldID09IChpbnQpc3RhcnRfY3B1KQorCQkJCQlnb3RvIGludmFsaWQ7CisKKwkJCWFzc2VydChucl9jcHVzIDwgTUFYX05SX0NQVVMpOworCQkJY3B1bWFwW25yX2NwdXMrK10gPSAoaW50KXN0YXJ0X2NwdTsKKwkJfQorCQlpZiAoKnApCisJCQkrK3A7CisKKwkJY3B1X2xpc3QgPSBwOworCX0KKwlpZiAobnJfY3B1cyA+IDApCisJCXJldHVybiBucl9jcHVzOworCisJcmV0dXJuIGRlZmF1bHRfY3B1X21hcCgpOworaW52YWxpZDoKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3B1bWFwLmggYi90b29scy9wZXJmL3V0aWwvY3B1bWFwLmgKaW5kZXggODZjNzhiYi4uM2U2MGY1NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NwdW1hcC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jcHVtYXAuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19QRVJGX0NQVU1BUF9ICiAjZGVmaW5lIF9fUEVSRl9DUFVNQVBfSAogCi1leHRlcm4gaW50IHJlYWRfY3B1X21hcCh2b2lkKTsKK2V4dGVybiBpbnQgcmVhZF9jcHVfbWFwKGNvbnN0IGNoYXIgKmNwdV9saXN0KTsKIGV4dGVybiBpbnQgY3B1bWFwW107CiAKICNlbmRpZiAvKiBfX1BFUkZfQ1BVTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMKaW5kZXggNmNkZGZmMi4uMzE4ZGFiMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMKQEAgLTg2LDEyICs4NiwxMCBAQAogCQkJZHVtcF9wcmludGZfY29sb3IoIiAgIiwgY29sb3IpOwogCQkJZm9yIChqID0gMDsgaiA8IDE1LShpICYgMTUpOyBqKyspCiAJCQkJZHVtcF9wcmludGZfY29sb3IoIiAgICIsIGNvbG9yKTsKLQkJCWZvciAoaiA9IDA7IGogPCAoaSAmIDE1KTsgaisrKSB7Ci0JCQkJaWYgKGlzcHJpbnQocmF3X2V2ZW50W2ktMTUral0pKQotCQkJCQlkdW1wX3ByaW50Zl9jb2xvcigiJWMiLCBjb2xvciwKLQkJCQkJCQkgIHJhd19ldmVudFtpLTE1K2pdKTsKLQkJCQllbHNlCi0JCQkJCWR1bXBfcHJpbnRmX2NvbG9yKCIuIiwgY29sb3IpOworCQkJZm9yIChqID0gaSAmIH4xNTsgaiA8PSBpOyBqKyspIHsKKwkJCQlkdW1wX3ByaW50Zl9jb2xvcigiJWMiLCBjb2xvciwKKwkJCQkJCWlzcHJpbnQocmF3X2V2ZW50W2pdKSA/CisJCQkJCQlyYXdfZXZlbnRbal0gOiAnLicpOwogCQkJfQogCQkJZHVtcF9wcmludGZfY29sb3IoIlxuIiwgY29sb3IpOwogCQl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCmluZGV4IDJmYmY2YTQuLmRhYjllNzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCkBAIC0xNTEsNyArMTUxLDYgQEAKIAkJCWNvbnRpbnVlOwogCQlwYmYgKz0gbiArIDM7CiAJCWlmICgqcGJmID09ICd4JykgeyAvKiB2bV9leGVjICovCi0JCQl1NjQgdm1fcGdvZmY7CiAJCQljaGFyICpleGVjbmFtZSA9IHN0cmNocihiZiwgJy8nKTsKIAogCQkJLyogQ2F0Y2ggVkRTTyAqLwpAQCAtMTYyLDEyICsxNjEsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQlwYmYgKz0gMzsKLQkJCW4gPSBoZXgydTY0KHBiZiwgJnZtX3Bnb2ZmKTsKLQkJCS8qIHBnb2ZmIGlzIGluIGJ5dGVzLCBub3QgcGFnZXMgKi8KLQkJCWlmIChuID49IDApCi0JCQkJZXYubW1hcC5wZ29mZiA9IHZtX3Bnb2ZmIDw8IGdldHBhZ2VzaXplKCk7Ci0JCQllbHNlCi0JCQkJZXYubW1hcC5wZ29mZiA9IDA7CisJCQluID0gaGV4MnU2NChwYmYsICZldi5tbWFwLnBnb2ZmKTsKIAogCQkJc2l6ZSA9IHN0cmxlbihleGVjbmFtZSk7CiAJCQlleGVjbmFtZVtzaXplIC0gMV0gPSAnXDAnOyAvKiBSZW1vdmUgXG4gKi8KQEAgLTM0MCwzMCArMzM0LDI5IEBACiAJcmV0dXJuIHByb2Nlc3MoJmV2LCBzZXNzaW9uKTsKIH0KIAotc3RhdGljIHZvaWQgdGhyZWFkX19jb21tX2FkanVzdChzdHJ1Y3QgdGhyZWFkICpzZWxmKQorc3RhdGljIHZvaWQgdGhyZWFkX19jb21tX2FkanVzdChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBzdHJ1Y3QgaGlzdHMgKmhpc3RzKQogewogCWNoYXIgKmNvbW0gPSBzZWxmLT5jb21tOwogCiAJaWYgKCFzeW1ib2xfY29uZi5jb2xfd2lkdGhfbGlzdF9zdHIgJiYgIXN5bWJvbF9jb25mLmZpZWxkX3NlcCAmJgogCSAgICAoIXN5bWJvbF9jb25mLmNvbW1fbGlzdCB8fAogCSAgICAgc3RybGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLmNvbW1fbGlzdCwgY29tbSkpKSB7Ci0JCXVuc2lnbmVkIGludCBzbGVuID0gc3RybGVuKGNvbW0pOworCQl1MTYgc2xlbiA9IHN0cmxlbihjb21tKTsKIAotCQlpZiAoc2xlbiA+IGNvbW1zX19jb2xfd2lkdGgpIHsKLQkJCWNvbW1zX19jb2xfd2lkdGggPSBzbGVuOwotCQkJdGhyZWFkc19fY29sX3dpZHRoID0gc2xlbiArIDY7Ci0JCX0KKwkJaWYgKGhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfQ09NTSwgc2xlbikpCisJCQloaXN0c19fc2V0X2NvbF9sZW4oaGlzdHMsIEhJU1RDX1RIUkVBRCwgc2xlbiArIDYpOwogCX0KIH0KIAotc3RhdGljIGludCB0aHJlYWRfX3NldF9jb21tX2FkanVzdChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBjb25zdCBjaGFyICpjb21tKQorc3RhdGljIGludCB0aHJlYWRfX3NldF9jb21tX2FkanVzdChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBjb25zdCBjaGFyICpjb21tLAorCQkJCSAgIHN0cnVjdCBoaXN0cyAqaGlzdHMpCiB7CiAJaW50IHJldCA9IHRocmVhZF9fc2V0X2NvbW0oc2VsZiwgY29tbSk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JdGhyZWFkX19jb21tX2FkanVzdChzZWxmKTsKKwl0aHJlYWRfX2NvbW1fYWRqdXN0KHNlbGYsIGhpc3RzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzc0LDcgKzM2Nyw4IEBACiAKIAlkdW1wX3ByaW50ZigiOiAlczolZFxuIiwgc2VsZi0+Y29tbS5jb21tLCBzZWxmLT5jb21tLnRpZCk7CiAKLQlpZiAodGhyZWFkID09IE5VTEwgfHwgdGhyZWFkX19zZXRfY29tbV9hZGp1c3QodGhyZWFkLCBzZWxmLT5jb21tLmNvbW0pKSB7CisJaWYgKHRocmVhZCA9PSBOVUxMIHx8IHRocmVhZF9fc2V0X2NvbW1fYWRqdXN0KHRocmVhZCwgc2VsZi0+Y29tbS5jb21tLAorCQkJCQkJICAgICAgJnNlc3Npb24tPmhpc3RzKSkgewogCQlkdW1wX3ByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfUkVDT1JEX0NPTU0sIHNraXBwaW5nIGV2ZW50LlxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC00NTYsNiArNDUwLDcgQEAKIAkJCWdvdG8gb3V0X3Byb2JsZW07CiAKIAkJbWFwLT5kc28tPnNob3J0X25hbWUgPSBuYW1lOworCQltYXAtPmRzby0+c25hbWVfYWxsb2MgPSAxOwogCQltYXAtPmVuZCA9IG1hcC0+c3RhcnQgKyBzZWxmLT5tbWFwLmxlbjsKIAl9IGVsc2UgaWYgKGlzX2tlcm5lbF9tbWFwKSB7CiAJCWNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lID0gKHNlbGYtPm1tYXAuZmlsZW5hbWUgKwpAQCAtNTE0LDEyICs1MDksMTMgQEAKIAlpZiAobWFjaGluZSA9PSBOVUxMKQogCQlnb3RvIG91dF9wcm9ibGVtOwogCXRocmVhZCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBzZWxmLT5tbWFwLnBpZCk7CisJaWYgKHRocmVhZCA9PSBOVUxMKQorCQlnb3RvIG91dF9wcm9ibGVtOwogCW1hcCA9IG1hcF9fbmV3KCZtYWNoaW5lLT51c2VyX2Rzb3MsIHNlbGYtPm1tYXAuc3RhcnQsCiAJCQlzZWxmLT5tbWFwLmxlbiwgc2VsZi0+bW1hcC5wZ29mZiwKIAkJCXNlbGYtPm1tYXAucGlkLCBzZWxmLT5tbWFwLmZpbGVuYW1lLAotCQkJTUFQX19GVU5DVElPTiwgc2Vzc2lvbi0+Y3dkLCBzZXNzaW9uLT5jd2RsZW4pOwotCi0JaWYgKHRocmVhZCA9PSBOVUxMIHx8IG1hcCA9PSBOVUxMKQorCQkJTUFQX19GVU5DVElPTik7CisJaWYgKG1hcCA9PSBOVUxMKQogCQlnb3RvIG91dF9wcm9ibGVtOwogCiAJdGhyZWFkX19pbnNlcnRfbWFwKHRocmVhZCwgbWFwKTsKQEAgLTU1Miw2ICs1NDgsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGV2ZW50X19wcm9jZXNzKGV2ZW50X3QgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQoreworCXN3aXRjaCAoZXZlbnQtPmhlYWRlci50eXBlKSB7CisJY2FzZSBQRVJGX1JFQ09SRF9DT01NOgorCQlldmVudF9fcHJvY2Vzc19jb21tKGV2ZW50LCBzZXNzaW9uKTsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX1JFQ09SRF9NTUFQOgorCQlldmVudF9fcHJvY2Vzc19tbWFwKGV2ZW50LCBzZXNzaW9uKTsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX1JFQ09SRF9GT1JLOgorCWNhc2UgUEVSRl9SRUNPUkRfRVhJVDoKKwkJZXZlbnRfX3Byb2Nlc3NfdGFzayhldmVudCwgc2Vzc2lvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiB2b2lkIHRocmVhZF9fZmluZF9hZGRyX21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLAogCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdTggY3B1bW9kZSwKIAkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgcGlkX3QgcGlkLCB1NjQgYWRkciwKQEAgLTY0MSwyNyArNjU3LDQ5IEBACiAJCWFsLT5zeW0gPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBkc29fX2NhbGNfY29sX3dpZHRoKHN0cnVjdCBkc28gKnNlbGYpCitzdGF0aWMgdm9pZCBkc29fX2NhbGNfY29sX3dpZHRoKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBoaXN0cyAqaGlzdHMpCiB7CiAJaWYgKCFzeW1ib2xfY29uZi5jb2xfd2lkdGhfbGlzdF9zdHIgJiYgIXN5bWJvbF9jb25mLmZpZWxkX3NlcCAmJgogCSAgICAoIXN5bWJvbF9jb25mLmRzb19saXN0IHx8CiAJICAgICBzdHJsaXN0X19oYXNfZW50cnkoc3ltYm9sX2NvbmYuZHNvX2xpc3QsIHNlbGYtPm5hbWUpKSkgewotCQl1MTYgc2xlbiA9IHNlbGYtPnNob3J0X25hbWVfbGVuOwotCQlpZiAodmVyYm9zZSkKLQkJCXNsZW4gPSBzZWxmLT5sb25nX25hbWVfbGVuOwotCQlpZiAoZHNvc19fY29sX3dpZHRoIDwgc2xlbikKLQkJCWRzb3NfX2NvbF93aWR0aCA9IHNsZW47CisJCXUxNiBzbGVuID0gZHNvX19uYW1lX2xlbihzZWxmKTsKKwkJaGlzdHNfX25ld19jb2xfbGVuKGhpc3RzLCBISVNUQ19EU08sIHNsZW4pOwogCX0KIAogCXNlbGYtPnNsZW5fY2FsY3VsYXRlZCA9IDE7CiB9CiAKIGludCBldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoY29uc3QgZXZlbnRfdCAqc2VsZiwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCSAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIHN0cnVjdCBzYW1wbGVfZGF0YSAqZGF0YSwKKwkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAl1OCBjcHVtb2RlID0gc2VsZi0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBwZXJmX3Nlc3Npb25fX2ZpbmRuZXcoc2Vzc2lvbiwgc2VsZi0+aXAucGlkKTsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CiAKKwlldmVudF9fcGFyc2Vfc2FtcGxlKHNlbGYsIHNlc3Npb24tPnNhbXBsZV90eXBlLCBkYXRhKTsKKworCWR1bXBfcHJpbnRmKCIoSVAsICVkKTogJWQvJWQ6ICUjTHggcGVyaW9kOiAlTGQgY3B1OiVkXG4iLAorCQkgICAgc2VsZi0+aGVhZGVyLm1pc2MsIGRhdGEtPnBpZCwgZGF0YS0+dGlkLCBkYXRhLT5pcCwKKwkJICAgIGRhdGEtPnBlcmlvZCwgZGF0YS0+Y3B1KTsKKworCWlmIChzZXNzaW9uLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NBTExDSEFJTikgeworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlkdW1wX3ByaW50ZigiLi4uIGNoYWluOiBucjolTHVcbiIsIGRhdGEtPmNhbGxjaGFpbi0+bnIpOworCisJCWlmICghaXBfY2FsbGNoYWluX192YWxpZChkYXRhLT5jYWxsY2hhaW4sIHNlbGYpKSB7CisJCQlwcl9kZWJ1ZygiY2FsbC1jaGFpbiBwcm9ibGVtIHdpdGggZXZlbnQsICIKKwkJCQkgInNraXBwaW5nIGl0LlxuIik7CisJCQlnb3RvIG91dF9maWx0ZXJlZDsKKwkJfQorCisJCWlmIChkdW1wX3RyYWNlKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+Y2FsbGNoYWluLT5ucjsgaSsrKQorCQkJCWR1bXBfcHJpbnRmKCIuLi4uLiAlMmQ6ICUwMTZMeFxuIiwKKwkJCQkJICAgIGksIGRhdGEtPmNhbGxjaGFpbi0+aXBzW2ldKTsKKwkJfQorCX0KKwl0aHJlYWQgPSBwZXJmX3Nlc3Npb25fX2ZpbmRuZXcoc2Vzc2lvbiwgc2VsZi0+aXAucGlkKTsKIAlpZiAodGhyZWFkID09IE5VTEwpCiAJCXJldHVybiAtMTsKIApAQCAtNjg3LDYgKzcyNSw3IEBACiAJCSAgICBhbC0+bWFwID8gYWwtPm1hcC0+ZHNvLT5sb25nX25hbWUgOgogCQkJYWwtPmxldmVsID09ICdIJyA/ICJbaHlwZXJ2aXNvcl0iIDogIjxub3QgZm91bmQ+Iik7CiAJYWwtPnN5bSA9IE5VTEw7CisJYWwtPmNwdSA9IGRhdGEtPmNwdTsKIAogCWlmIChhbC0+bWFwKSB7CiAJCWlmIChzeW1ib2xfY29uZi5kc29fbGlzdCAmJgpAQCAtNzAzLDE2ICs3NDIsMTcgQEAKIAkJICogc2FtcGxlZC4KIAkJICovCiAJCWlmICghc29ydF9kc28uZWxpZGUgJiYgIWFsLT5tYXAtPmRzby0+c2xlbl9jYWxjdWxhdGVkKQotCQkJZHNvX19jYWxjX2NvbF93aWR0aChhbC0+bWFwLT5kc28pOworCQkJZHNvX19jYWxjX2NvbF93aWR0aChhbC0+bWFwLT5kc28sICZzZXNzaW9uLT5oaXN0cyk7CiAKIAkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIsIGZpbHRlcik7CiAJfSBlbHNlIHsKIAkJY29uc3QgdW5zaWduZWQgaW50IHVucmVzb2x2ZWRfY29sX3dpZHRoID0gQklUU19QRVJfTE9ORyAvIDQ7CiAKLQkJaWYgKGRzb3NfX2NvbF93aWR0aCA8IHVucmVzb2x2ZWRfY29sX3dpZHRoICYmCisJCWlmIChoaXN0c19fY29sX2xlbigmc2Vzc2lvbi0+aGlzdHMsIEhJU1RDX0RTTykgPCB1bnJlc29sdmVkX2NvbF93aWR0aCAmJgogCQkgICAgIXN5bWJvbF9jb25mLmNvbF93aWR0aF9saXN0X3N0ciAmJiAhc3ltYm9sX2NvbmYuZmllbGRfc2VwICYmCiAJCSAgICAhc3ltYm9sX2NvbmYuZHNvX2xpc3QpCi0JCQlkc29zX19jb2xfd2lkdGggPSB1bnJlc29sdmVkX2NvbF93aWR0aDsKKwkJCWhpc3RzX19zZXRfY29sX2xlbigmc2Vzc2lvbi0+aGlzdHMsIEhJU1RDX0RTTywKKwkJCQkJICAgdW5yZXNvbHZlZF9jb2xfd2lkdGgpOwogCX0KIAogCWlmIChzeW1ib2xfY29uZi5zeW1fbGlzdCAmJiBhbC0+c3ltICYmCkBAIC03MjYsOSArNzY2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnRfdCAqZXZlbnQsIHU2NCB0eXBlLCBzdHJ1Y3Qgc2FtcGxlX2RhdGEgKmRhdGEpCitpbnQgZXZlbnRfX3BhcnNlX3NhbXBsZShjb25zdCBldmVudF90ICpldmVudCwgdTY0IHR5cGUsIHN0cnVjdCBzYW1wbGVfZGF0YSAqZGF0YSkKIHsKLQl1NjQgKmFycmF5ID0gZXZlbnQtPnNhbXBsZS5hcnJheTsKKwljb25zdCB1NjQgKmFycmF5ID0gZXZlbnQtPnNhbXBsZS5hcnJheTsKIAogCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfSVApIHsKIAkJZGF0YS0+aXAgPSBldmVudC0+aXAuaXA7CkBAIC03NjcsNyArODA3LDggQEAKIAkJdTMyICpwID0gKHUzMiAqKWFycmF5OwogCQlkYXRhLT5jcHUgPSAqcDsKIAkJYXJyYXkrKzsKLQl9CisJfSBlbHNlCisJCWRhdGEtPmNwdSA9IC0xOwogCiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpIHsKIAkJZGF0YS0+cGVyaW9kID0gKmFycmF5OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmggYi90b29scy9wZXJmL3V0aWwvZXZlbnQuaAppbmRleCA4NTc3MDg1Li44ZTc5MGRhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZlbnQuaApAQCAtMTU0LDExICsxNTQsMTMgQEAKIGludCBldmVudF9fcHJvY2Vzc19sb3N0KGV2ZW50X3QgKnNlbGYsIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOwogaW50IGV2ZW50X19wcm9jZXNzX21tYXAoZXZlbnRfdCAqc2VsZiwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CiBpbnQgZXZlbnRfX3Byb2Nlc3NfdGFzayhldmVudF90ICpzZWxmLCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKK2ludCBldmVudF9fcHJvY2VzcyhldmVudF90ICpldmVudCwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CiAKIHN0cnVjdCBhZGRyX2xvY2F0aW9uOwogaW50IGV2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShjb25zdCBldmVudF90ICpzZWxmLCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotaW50IGV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnRfdCAqZXZlbnQsIHU2NCB0eXBlLCBzdHJ1Y3Qgc2FtcGxlX2RhdGEgKmRhdGEpOworCQkJICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIHN0cnVjdCBzYW1wbGVfZGF0YSAqZGF0YSwKKwkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgZXZlbnRfX3BhcnNlX3NhbXBsZShjb25zdCBldmVudF90ICpldmVudCwgdTY0IHR5cGUsIHN0cnVjdCBzYW1wbGVfZGF0YSAqZGF0YSk7CiAKIGV4dGVybiBjb25zdCBjaGFyICpldmVudF9fbmFtZVtdOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKaW5kZXggMWY2MjQzNS4uZDdlNjdiMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgInN5bWJvbC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKK3N0YXRpYyBib29sIG5vX2J1aWxkaWRfY2FjaGUgPSBmYWxzZTsKKwogLyoKICAqIENyZWF0ZSBuZXcgcGVyZi5kYXRhIGhlYWRlciBhdHRyaWJ1dGU6CiAgKi8KQEAgLTM4NSw4ICszODcsNyBAQAogCWludCByZXQ7CiAJY2hhciBkZWJ1Z2RpcltQQVRIX01BWF07CiAKLQlzbnByaW50ZihkZWJ1Z2Rpciwgc2l6ZW9mKGRlYnVnZGlyKSwgIiVzLyVzIiwgZ2V0ZW52KCJIT01FIiksCi0JCSBERUJVR19DQUNIRV9ESVIpOworCXNucHJpbnRmKGRlYnVnZGlyLCBzaXplb2YoZGVidWdkaXIpLCAiJXMiLCBidWlsZGlkX2Rpcik7CiAKIAlpZiAobWtkaXIoZGVidWdkaXIsIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKQogCQlyZXR1cm4gLTE7CkBAIC00NzEsNyArNDcyLDggQEAKIAkJfQogCQlidWlsZGlkX3NlYy0+c2l6ZSA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikgLQogCQkJCQkgIGJ1aWxkaWRfc2VjLT5vZmZzZXQ7Ci0JCXBlcmZfc2Vzc2lvbl9fY2FjaGVfYnVpbGRfaWRzKHNlc3Npb24pOworCQlpZiAoIW5vX2J1aWxkaWRfY2FjaGUpCisJCQlwZXJmX3Nlc3Npb25fX2NhY2hlX2J1aWxkX2lkcyhzZXNzaW9uKTsKIAl9CiAKIAlsc2VlayhmZCwgc2VjX3N0YXJ0LCBTRUVLX1NFVCk7CkBAIC0xMTkwLDMgKzExOTIsOCBAQAogCQkJCSBzZXNzaW9uKTsKIAlyZXR1cm4gMDsKIH0KKwordm9pZCBkaXNhYmxlX2J1aWxkaWRfY2FjaGUodm9pZCkKK3sKKwlub19idWlsZGlkX2NhY2hlID0gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCmluZGV4IDc4NGVlMGIuLmU3MjYzZDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwpAQCAtNSwxMSArNSw2MSBAQAogI2luY2x1ZGUgInNvcnQuaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAKK2VudW0gaGlzdF9maWx0ZXIgeworCUhJU1RfRklMVEVSX19EU08sCisJSElTVF9GSUxURVJfX1RIUkVBRCwKKwlISVNUX0ZJTFRFUl9fUEFSRU5ULAorfTsKKwogc3RydWN0IGNhbGxjaGFpbl9wYXJhbQljYWxsY2hhaW5fcGFyYW0gPSB7CiAJLm1vZGUJPSBDSEFJTl9HUkFQSF9SRUwsCiAJLm1pbl9wZXJjZW50ID0gMC41CiB9OwogCit1MTYgaGlzdHNfX2NvbF9sZW4oc3RydWN0IGhpc3RzICpzZWxmLCBlbnVtIGhpc3RfY29sdW1uIGNvbCkKK3sKKwlyZXR1cm4gc2VsZi0+Y29sX2xlbltjb2xdOworfQorCit2b2lkIGhpc3RzX19zZXRfY29sX2xlbihzdHJ1Y3QgaGlzdHMgKnNlbGYsIGVudW0gaGlzdF9jb2x1bW4gY29sLCB1MTYgbGVuKQoreworCXNlbGYtPmNvbF9sZW5bY29sXSA9IGxlbjsKK30KKworYm9vbCBoaXN0c19fbmV3X2NvbF9sZW4oc3RydWN0IGhpc3RzICpzZWxmLCBlbnVtIGhpc3RfY29sdW1uIGNvbCwgdTE2IGxlbikKK3sKKwlpZiAobGVuID4gaGlzdHNfX2NvbF9sZW4oc2VsZiwgY29sKSkgeworCQloaXN0c19fc2V0X2NvbF9sZW4oc2VsZiwgY29sLCBsZW4pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBoaXN0c19fcmVzZXRfY29sX2xlbihzdHJ1Y3QgaGlzdHMgKnNlbGYpCit7CisJZW51bSBoaXN0X2NvbHVtbiBjb2w7CisKKwlmb3IgKGNvbCA9IDA7IGNvbCA8IEhJU1RDX05SX0NPTFM7ICsrY29sKQorCQloaXN0c19fc2V0X2NvbF9sZW4oc2VsZiwgY29sLCAwKTsKK30KKworc3RhdGljIHZvaWQgaGlzdHNfX2NhbGNfY29sX2xlbihzdHJ1Y3QgaGlzdHMgKnNlbGYsIHN0cnVjdCBoaXN0X2VudHJ5ICpoKQoreworCXUxNiBsZW47CisKKwlpZiAoaC0+bXMuc3ltKQorCQloaXN0c19fbmV3X2NvbF9sZW4oc2VsZiwgSElTVENfU1lNQk9MLCBoLT5tcy5zeW0tPm5hbWVsZW4pOworCisJbGVuID0gdGhyZWFkX19jb21tX2xlbihoLT50aHJlYWQpOworCWlmIChoaXN0c19fbmV3X2NvbF9sZW4oc2VsZiwgSElTVENfQ09NTSwgbGVuKSkKKwkJaGlzdHNfX3NldF9jb2xfbGVuKHNlbGYsIEhJU1RDX1RIUkVBRCwgbGVuICsgNik7CisKKwlpZiAoaC0+bXMubWFwKSB7CisJCWxlbiA9IGRzb19fbmFtZV9sZW4oaC0+bXMubWFwLT5kc28pOworCQloaXN0c19fbmV3X2NvbF9sZW4oc2VsZiwgSElTVENfRFNPLCBsZW4pOworCX0KK30KKwogc3RhdGljIHZvaWQgaGlzdF9lbnRyeV9fYWRkX2NwdW1vZGVfcGVyaW9kKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY3B1bW9kZSwgdTY0IHBlcmlvZCkKIHsKQEAgLTQzLDYgKzkzLDggQEAKIAlpZiAoc2VsZiAhPSBOVUxMKSB7CiAJCSpzZWxmID0gKnRlbXBsYXRlOwogCQlzZWxmLT5ucl9ldmVudHMgPSAxOworCQlpZiAoc2VsZi0+bXMubWFwKQorCQkJc2VsZi0+bXMubWFwLT5yZWZlcmVuY2VkID0gdHJ1ZTsKIAkJaWYgKHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pCiAJCQljYWxsY2hhaW5faW5pdChzZWxmLT5jYWxsY2hhaW4pOwogCX0KQEAgLTUwLDExICsxMDIsMTkgQEAKIAlyZXR1cm4gc2VsZjsKIH0KIAotc3RhdGljIHZvaWQgaGlzdHNfX2luY19ucl9lbnRyaWVzKHN0cnVjdCBoaXN0cyAqc2VsZiwgc3RydWN0IGhpc3RfZW50cnkgKmVudHJ5KQorc3RhdGljIHZvaWQgaGlzdHNfX2luY19ucl9lbnRyaWVzKHN0cnVjdCBoaXN0cyAqc2VsZiwgc3RydWN0IGhpc3RfZW50cnkgKmgpCiB7Ci0JaWYgKGVudHJ5LT5tcy5zeW0gJiYgc2VsZi0+bWF4X3N5bV9uYW1lbGVuIDwgZW50cnktPm1zLnN5bS0+bmFtZWxlbikKLQkJc2VsZi0+bWF4X3N5bV9uYW1lbGVuID0gZW50cnktPm1zLnN5bS0+bmFtZWxlbjsKLQkrK3NlbGYtPm5yX2VudHJpZXM7CisJaWYgKCFoLT5maWx0ZXJlZCkgeworCQloaXN0c19fY2FsY19jb2xfbGVuKHNlbGYsIGgpOworCQkrK3NlbGYtPm5yX2VudHJpZXM7CisJfQorfQorCitzdGF0aWMgdTggc3ltYm9sX19wYXJlbnRfZmlsdGVyKGNvbnN0IHN0cnVjdCBzeW1ib2wgKnBhcmVudCkKK3sKKwlpZiAoc3ltYm9sX2NvbmYuZXhjbHVkZV9vdGhlciAmJiBwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIDEgPDwgSElTVF9GSUxURVJfX1BBUkVOVDsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGhpc3RfZW50cnkgKl9faGlzdHNfX2FkZF9lbnRyeShzdHJ1Y3QgaGlzdHMgKnNlbGYsCkBAIC03MCwxMCArMTMwLDEyIEBACiAJCQkubWFwCT0gYWwtPm1hcCwKIAkJCS5zeW0JPSBhbC0+c3ltLAogCQl9LAorCQkuY3B1CT0gYWwtPmNwdSwKIAkJLmlwCT0gYWwtPmFkZHIsCiAJCS5sZXZlbAk9IGFsLT5sZXZlbCwKIAkJLnBlcmlvZAk9IHBlcmlvZCwKIAkJLnBhcmVudCA9IHN5bV9wYXJlbnQsCisJCS5maWx0ZXJlZCA9IHN5bWJvbF9fcGFyZW50X2ZpbHRlcihzeW1fcGFyZW50KSwKIAl9OwogCWludCBjbXA7CiAKQEAgLTE5MSw3ICsyNTMsNyBAQAogCXRtcCA9IFJCX1JPT1Q7CiAJbmV4dCA9IHJiX2ZpcnN0KCZzZWxmLT5lbnRyaWVzKTsKIAlzZWxmLT5ucl9lbnRyaWVzID0gMDsKLQlzZWxmLT5tYXhfc3ltX25hbWVsZW4gPSAwOworCWhpc3RzX19yZXNldF9jb2xfbGVuKHNlbGYpOwogCiAJd2hpbGUgKG5leHQpIHsKIAkJbiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKQEAgLTI0OCw3ICszMTAsNyBAQAogCW5leHQgPSByYl9maXJzdCgmc2VsZi0+ZW50cmllcyk7CiAKIAlzZWxmLT5ucl9lbnRyaWVzID0gMDsKLQlzZWxmLT5tYXhfc3ltX25hbWVsZW4gPSAwOworCWhpc3RzX19yZXNldF9jb2xfbGVuKHNlbGYpOwogCiAJd2hpbGUgKG5leHQpIHsKIAkJbiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKQEAgLTUxNSw4ICs1NzcsOSBAQAogfQogCiBpbnQgaGlzdF9lbnRyeV9fc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIGNoYXIgKnMsIHNpemVfdCBzaXplLAotCQkJIHN0cnVjdCBoaXN0cyAqcGFpcl9oaXN0cywgYm9vbCBzaG93X2Rpc3BsYWNlbWVudCwKLQkJCSBsb25nIGRpc3BsYWNlbWVudCwgYm9vbCBjb2xvciwgdTY0IHNlc3Npb25fdG90YWwpCisJCQkgc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IGhpc3RzICpwYWlyX2hpc3RzLAorCQkJIGJvb2wgc2hvd19kaXNwbGFjZW1lbnQsIGxvbmcgZGlzcGxhY2VtZW50LAorCQkJIGJvb2wgY29sb3IsIHU2NCBzZXNzaW9uX3RvdGFsKQogewogCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKIAl1NjQgcGVyaW9kLCB0b3RhbCwgcGVyaW9kX3N5cywgcGVyaW9kX3VzLCBwZXJpb2RfZ3Vlc3Rfc3lzLCBwZXJpb2RfZ3Vlc3RfdXM7CkBAIC02MjAsMjkgKzY4MywyNSBAQAogCiAJCXJldCArPSBzbnByaW50ZihzICsgcmV0LCBzaXplIC0gcmV0LCAiJXMiLCBzZXAgPzogIiAgIik7CiAJCXJldCArPSBzZS0+c2Vfc25wcmludGYoc2VsZiwgcyArIHJldCwgc2l6ZSAtIHJldCwKLQkJCQkgICAgICAgc2UtPnNlX3dpZHRoID8gKnNlLT5zZV93aWR0aCA6IDApOworCQkJCSAgICAgICBoaXN0c19fY29sX2xlbihoaXN0cywgc2UtPnNlX3dpZHRoX2lkeCkpOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBoaXN0X2VudHJ5X19mcHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBzdHJ1Y3QgaGlzdHMgKnBhaXJfaGlzdHMsCi0JCQlib29sIHNob3dfZGlzcGxhY2VtZW50LCBsb25nIGRpc3BsYWNlbWVudCwgRklMRSAqZnAsCi0JCQl1NjQgc2Vzc2lvbl90b3RhbCkKK2ludCBoaXN0X2VudHJ5X19mcHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBzdHJ1Y3QgaGlzdHMgKmhpc3RzLAorCQkJc3RydWN0IGhpc3RzICpwYWlyX2hpc3RzLCBib29sIHNob3dfZGlzcGxhY2VtZW50LAorCQkJbG9uZyBkaXNwbGFjZW1lbnQsIEZJTEUgKmZwLCB1NjQgc2Vzc2lvbl90b3RhbCkKIHsKIAljaGFyIGJmWzUxMl07Ci0JaW50IHJldDsKLQotCXJldCA9IGhpc3RfZW50cnlfX3NucHJpbnRmKHNlbGYsIGJmLCBzaXplb2YoYmYpLCBwYWlyX2hpc3RzLAotCQkJCSAgIHNob3dfZGlzcGxhY2VtZW50LCBkaXNwbGFjZW1lbnQsCi0JCQkJICAgdHJ1ZSwgc2Vzc2lvbl90b3RhbCk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiAwOwotCisJaGlzdF9lbnRyeV9fc25wcmludGYoc2VsZiwgYmYsIHNpemVvZihiZiksIGhpc3RzLCBwYWlyX2hpc3RzLAorCQkJICAgICBzaG93X2Rpc3BsYWNlbWVudCwgZGlzcGxhY2VtZW50LAorCQkJICAgICB0cnVlLCBzZXNzaW9uX3RvdGFsKTsKIAlyZXR1cm4gZnByaW50ZihmcCwgIiVzXG4iLCBiZik7CiB9CiAKLXN0YXRpYyBzaXplX3QgaGlzdF9lbnRyeV9fZnByaW50Zl9jYWxsY2hhaW4oc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIEZJTEUgKmZwLAorc3RhdGljIHNpemVfdCBoaXN0X2VudHJ5X19mcHJpbnRmX2NhbGxjaGFpbihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwKKwkJCQkJICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMsIEZJTEUgKmZwLAogCQkJCQkgICAgdTY0IHNlc3Npb25fdG90YWwpCiB7CiAJaW50IGxlZnRfbWFyZ2luID0gMDsKQEAgLTY1MCw3ICs3MDksNyBAQAogCWlmIChzb3J0X19maXJzdF9kaW1lbnNpb24gPT0gU09SVF9DT01NKSB7CiAJCXN0cnVjdCBzb3J0X2VudHJ5ICpzZSA9IGxpc3RfZmlyc3RfZW50cnkoJmhpc3RfZW50cnlfX3NvcnRfbGlzdCwKIAkJCQkJCQkgdHlwZW9mKCpzZSksIGxpc3QpOwotCQlsZWZ0X21hcmdpbiA9IHNlLT5zZV93aWR0aCA/ICpzZS0+c2Vfd2lkdGggOiAwOworCQlsZWZ0X21hcmdpbiA9IGhpc3RzX19jb2xfbGVuKGhpc3RzLCBzZS0+c2Vfd2lkdGhfaWR4KTsKIAkJbGVmdF9tYXJnaW4gLT0gdGhyZWFkX19jb21tX2xlbihzZWxmLT50aHJlYWQpOwogCX0KIApAQCAtNzIxLDE3ICs3ODAsMTcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXdpZHRoID0gc3RybGVuKHNlLT5zZV9oZWFkZXIpOwotCQlpZiAoc2UtPnNlX3dpZHRoKSB7Ci0JCQlpZiAoc3ltYm9sX2NvbmYuY29sX3dpZHRoX2xpc3Rfc3RyKSB7Ci0JCQkJaWYgKGNvbF93aWR0aCkgewotCQkJCQkqc2UtPnNlX3dpZHRoID0gYXRvaShjb2xfd2lkdGgpOwotCQkJCQljb2xfd2lkdGggPSBzdHJjaHIoY29sX3dpZHRoLCAnLCcpOwotCQkJCQlpZiAoY29sX3dpZHRoKQotCQkJCQkJKytjb2xfd2lkdGg7Ci0JCQkJfQorCQlpZiAoc3ltYm9sX2NvbmYuY29sX3dpZHRoX2xpc3Rfc3RyKSB7CisJCQlpZiAoY29sX3dpZHRoKSB7CisJCQkJaGlzdHNfX3NldF9jb2xfbGVuKHNlbGYsIHNlLT5zZV93aWR0aF9pZHgsCisJCQkJCQkgICBhdG9pKGNvbF93aWR0aCkpOworCQkJCWNvbF93aWR0aCA9IHN0cmNocihjb2xfd2lkdGgsICcsJyk7CisJCQkJaWYgKGNvbF93aWR0aCkKKwkJCQkJKytjb2xfd2lkdGg7CiAJCQl9Ci0JCQl3aWR0aCA9ICpzZS0+c2Vfd2lkdGggPSBtYXgoKnNlLT5zZV93aWR0aCwgd2lkdGgpOwogCQl9CisJCWlmICghaGlzdHNfX25ld19jb2xfbGVuKHNlbGYsIHNlLT5zZV93aWR0aF9pZHgsIHdpZHRoKSkKKwkJCXdpZHRoID0gaGlzdHNfX2NvbF9sZW4oc2VsZiwgc2UtPnNlX3dpZHRoX2lkeCk7CiAJCWZwcmludGYoZnAsICIgICUqcyIsIHdpZHRoLCBzZS0+c2VfaGVhZGVyKTsKIAl9CiAJZnByaW50ZihmcCwgIlxuIik7CkBAIC03NTQsOSArODEzLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWZwcmludGYoZnAsICIgICIpOwotCQlpZiAoc2UtPnNlX3dpZHRoKQotCQkJd2lkdGggPSAqc2UtPnNlX3dpZHRoOwotCQllbHNlCisJCXdpZHRoID0gaGlzdHNfX2NvbF9sZW4oc2VsZiwgc2UtPnNlX3dpZHRoX2lkeCk7CisJCWlmICh3aWR0aCA9PSAwKQogCQkJd2lkdGggPSBzdHJsZW4oc2UtPnNlX2hlYWRlcik7CiAJCWZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQogCQkJZnByaW50ZihmcCwgIi4iKTsKQEAgLTc2Nyw3ICs4MjUsNiBAQAogcHJpbnRfZW50cmllczoKIAlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPmVudHJpZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7Ci0JCWludCBjbnQ7CiAKIAkJaWYgKHNob3dfZGlzcGxhY2VtZW50KSB7CiAJCQlpZiAoaC0+cGFpciAhPSBOVUxMKQpAQCAtNzc3LDE3ICs4MzQsMTIgQEAKIAkJCQlkaXNwbGFjZW1lbnQgPSAwOwogCQkJKytwb3NpdGlvbjsKIAkJfQotCQljbnQgPSBoaXN0X2VudHJ5X19mcHJpbnRmKGgsIHBhaXIsIHNob3dfZGlzcGxhY2VtZW50LAotCQkJCQkgIGRpc3BsYWNlbWVudCwgZnAsIHNlbGYtPnN0YXRzLnRvdGFsX3BlcmlvZCk7Ci0JCS8qIElnbm9yZSB0aG9zZSB0aGF0IGRpZG4ndCBtYXRjaCB0aGUgcGFyZW50IGZpbHRlciAqLwotCQlpZiAoIWNudCkKLQkJCWNvbnRpbnVlOwotCi0JCXJldCArPSBjbnQ7CisJCXJldCArPSBoaXN0X2VudHJ5X19mcHJpbnRmKGgsIHNlbGYsIHBhaXIsIHNob3dfZGlzcGxhY2VtZW50LAorCQkJCQkgICBkaXNwbGFjZW1lbnQsIGZwLCBzZWxmLT5zdGF0cy50b3RhbF9wZXJpb2QpOwogCiAJCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKQotCQkJcmV0ICs9IGhpc3RfZW50cnlfX2ZwcmludGZfY2FsbGNoYWluKGgsIGZwLCBzZWxmLT5zdGF0cy50b3RhbF9wZXJpb2QpOwotCisJCQlyZXQgKz0gaGlzdF9lbnRyeV9fZnByaW50Zl9jYWxsY2hhaW4oaCwgc2VsZiwgZnAsCisJCQkJCQkJICAgICBzZWxmLT5zdGF0cy50b3RhbF9wZXJpb2QpOwogCQlpZiAoaC0+bXMubWFwID09IE5VTEwgJiYgdmVyYm9zZSA+IDEpIHsKIAkJCV9fbWFwX2dyb3Vwc19fZnByaW50Zl9tYXBzKCZoLT50aHJlYWQtPm1nLAogCQkJCQkJICAgTUFQX19GVU5DVElPTiwgdmVyYm9zZSwgZnApOwpAQCAtODAwLDEwICs4NTIsNDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1lbnVtIGhpc3RfZmlsdGVyIHsKLQlISVNUX0ZJTFRFUl9fRFNPLAotCUhJU1RfRklMVEVSX19USFJFQUQsCi19OworLyoKKyAqIFNlZSBoaXN0c19fZnByaW50ZiB0byBtYXRjaCB0aGUgY29sdW1uIHdpZHRocworICovCit1bnNpZ25lZCBpbnQgaGlzdHNfX3NvcnRfbGlzdF93aWR0aChzdHJ1Y3QgaGlzdHMgKnNlbGYpCit7CisJc3RydWN0IHNvcnRfZW50cnkgKnNlOworCWludCByZXQgPSA5OyAvKiB0b3RhbCAlICovCisKKwlpZiAoc3ltYm9sX2NvbmYuc2hvd19jcHVfdXRpbGl6YXRpb24pIHsKKwkJcmV0ICs9IDc7IC8qIGNvdW50X3N5cyAlICovCisJCXJldCArPSA2OyAvKiBjb3VudF91cyAlICovCisJCWlmIChwZXJmX2d1ZXN0KSB7CisJCQlyZXQgKz0gMTM7IC8qIGNvdW50X2d1ZXN0X3N5cyAlICovCisJCQlyZXQgKz0gMTI7IC8qIGNvdW50X2d1ZXN0X3VzICUgKi8KKwkJfQorCX0KKworCWlmIChzeW1ib2xfY29uZi5zaG93X25yX3NhbXBsZXMpCisJCXJldCArPSAxMTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2UsICZoaXN0X2VudHJ5X19zb3J0X2xpc3QsIGxpc3QpCisJCWlmICghc2UtPmVsaWRlKQorCQkJcmV0ICs9IDIgKyBoaXN0c19fY29sX2xlbihzZWxmLCBzZS0+c2Vfd2lkdGhfaWR4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhpc3RzX19yZW1vdmVfZW50cnlfZmlsdGVyKHN0cnVjdCBoaXN0cyAqc2VsZiwgc3RydWN0IGhpc3RfZW50cnkgKmgsCisJCQkJICAgICAgIGVudW0gaGlzdF9maWx0ZXIgZmlsdGVyKQoreworCWgtPmZpbHRlcmVkICY9IH4oMSA8PCBmaWx0ZXIpOworCWlmIChoLT5maWx0ZXJlZCkKKwkJcmV0dXJuOworCisJKytzZWxmLT5ucl9lbnRyaWVzOworCWlmIChoLT5tcy51bmZvbGRlZCkKKwkJc2VsZi0+bnJfZW50cmllcyArPSBoLT5ucl9yb3dzOworCWgtPnJvd19vZmZzZXQgPSAwOworCXNlbGYtPnN0YXRzLnRvdGFsX3BlcmlvZCArPSBoLT5wZXJpb2Q7CisJc2VsZi0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX1NBTVBMRV0gKz0gaC0+bnJfZXZlbnRzOworCisJaGlzdHNfX2NhbGNfY29sX2xlbihzZWxmLCBoKTsKK30KIAogdm9pZCBoaXN0c19fZmlsdGVyX2J5X2RzbyhzdHJ1Y3QgaGlzdHMgKnNlbGYsIGNvbnN0IHN0cnVjdCBkc28gKmRzbykKIHsKQEAgLTgxMSw3ICs5MDIsNyBAQAogCiAJc2VsZi0+bnJfZW50cmllcyA9IHNlbGYtPnN0YXRzLnRvdGFsX3BlcmlvZCA9IDA7CiAJc2VsZi0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX1NBTVBMRV0gPSAwOwotCXNlbGYtPm1heF9zeW1fbmFtZWxlbiA9IDA7CisJaGlzdHNfX3Jlc2V0X2NvbF9sZW4oc2VsZik7CiAKIAlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPmVudHJpZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CkBAIC04MjQsMTUgKzkxNSw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWgtPmZpbHRlcmVkICY9IH4oMSA8PCBISVNUX0ZJTFRFUl9fRFNPKTsKLQkJaWYgKCFoLT5maWx0ZXJlZCkgewotCQkJKytzZWxmLT5ucl9lbnRyaWVzOwotCQkJc2VsZi0+c3RhdHMudG90YWxfcGVyaW9kICs9IGgtPnBlcmlvZDsKLQkJCXNlbGYtPnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9TQU1QTEVdICs9IGgtPm5yX2V2ZW50czsKLQkJCWlmIChoLT5tcy5zeW0gJiYKLQkJCSAgICBzZWxmLT5tYXhfc3ltX25hbWVsZW4gPCBoLT5tcy5zeW0tPm5hbWVsZW4pCi0JCQkJc2VsZi0+bWF4X3N5bV9uYW1lbGVuID0gaC0+bXMuc3ltLT5uYW1lbGVuOwotCQl9CisJCWhpc3RzX19yZW1vdmVfZW50cnlfZmlsdGVyKHNlbGYsIGgsIEhJU1RfRklMVEVSX19EU08pOwogCX0KIH0KIApAQCAtODQyLDcgKzkyNSw3IEBACiAKIAlzZWxmLT5ucl9lbnRyaWVzID0gc2VsZi0+c3RhdHMudG90YWxfcGVyaW9kID0gMDsKIAlzZWxmLT5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfU0FNUExFXSA9IDA7Ci0Jc2VsZi0+bWF4X3N5bV9uYW1lbGVuID0gMDsKKwloaXN0c19fcmVzZXRfY29sX2xlbihzZWxmKTsKIAogCWZvciAobmQgPSByYl9maXJzdCgmc2VsZi0+ZW50cmllcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKQEAgLTg1MSwxNSArOTM0LDggQEAKIAkJCWgtPmZpbHRlcmVkIHw9ICgxIDw8IEhJU1RfRklMVEVSX19USFJFQUQpOwogCQkJY29udGludWU7CiAJCX0KLQkJaC0+ZmlsdGVyZWQgJj0gfigxIDw8IEhJU1RfRklMVEVSX19USFJFQUQpOwotCQlpZiAoIWgtPmZpbHRlcmVkKSB7Ci0JCQkrK3NlbGYtPm5yX2VudHJpZXM7Ci0JCQlzZWxmLT5zdGF0cy50b3RhbF9wZXJpb2QgKz0gaC0+cGVyaW9kOwotCQkJc2VsZi0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX1NBTVBMRV0gKz0gaC0+bnJfZXZlbnRzOwotCQkJaWYgKGgtPm1zLnN5bSAmJgotCQkJICAgIHNlbGYtPm1heF9zeW1fbmFtZWxlbiA8IGgtPm1zLnN5bS0+bmFtZWxlbikKLQkJCQlzZWxmLT5tYXhfc3ltX25hbWVsZW4gPSBoLT5tcy5zeW0tPm5hbWVsZW47Ci0JCX0KKworCQloaXN0c19fcmVtb3ZlX2VudHJ5X2ZpbHRlcihzZWxmLCBoLCBISVNUX0ZJTFRFUl9fVEhSRUFEKTsKIAl9CiB9CiAKQEAgLTEwNTIsNyArMTEyOCw3IEBACiAJCSBkc28sIGRzby0+bG9uZ19uYW1lLCBzeW0sIHN5bS0+bmFtZSk7CiAKIAlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksCi0JCSAib2JqZHVtcCAtLXN0YXJ0LWFkZHJlc3M9MHglMDE2THggLS1zdG9wLWFkZHJlc3M9MHglMDE2THggLWRTICVzfGdyZXAgLXYgJXN8ZXhwYW5kIiwKKwkJICJvYmpkdW1wIC0tc3RhcnQtYWRkcmVzcz0weCUwMTZMeCAtLXN0b3AtYWRkcmVzcz0weCUwMTZMeCAtZFMgLUMgJXN8Z3JlcCAtdiAlc3xleHBhbmQiLAogCQkgbWFwX19yaXBfMm9iamR1bXAobWFwLCBzeW0tPnN0YXJ0KSwKIAkJIG1hcF9fcmlwXzJvYmpkdW1wKG1hcCwgc3ltLT5lbmQpLAogCQkgZmlsZW5hbWUsIGZpbGVuYW1lKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmggYi90b29scy9wZXJmL3V0aWwvaGlzdC5oCmluZGV4IDgzZmEzM2EuLjY1YTQ4ZGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaApAQCAtNTYsNiArNTYsMTYgQEAKIAl1MzIgbnJfdW5rbm93bl9ldmVudHM7CiB9OwogCitlbnVtIGhpc3RfY29sdW1uIHsKKwlISVNUQ19TWU1CT0wsCisJSElTVENfRFNPLAorCUhJU1RDX1RIUkVBRCwKKwlISVNUQ19DT01NLAorCUhJU1RDX1BBUkVOVCwKKwlISVNUQ19DUFUsCisJSElTVENfTlJfQ09MUywgLyogTGFzdCBlbnRyeSAqLworfTsKKwogc3RydWN0IGhpc3RzIHsKIAlzdHJ1Y3QgcmJfbm9kZQkJcmJfbm9kZTsKIAlzdHJ1Y3QgcmJfcm9vdAkJZW50cmllczsKQEAgLTY0LDcgKzc0LDcgQEAKIAl1NjQJCQljb25maWc7CiAJdTY0CQkJZXZlbnRfc3RyZWFtOwogCXUzMgkJCXR5cGU7Ci0JdTMyCQkJbWF4X3N5bV9uYW1lbGVuOworCXUxNgkJCWNvbF9sZW5bSElTVENfTlJfQ09MU107CiB9OwogCiBzdHJ1Y3QgaGlzdF9lbnRyeSAqX19oaXN0c19fYWRkX2VudHJ5KHN0cnVjdCBoaXN0cyAqc2VsZiwKQEAgLTcyLDEyICs4MiwxMyBAQAogCQkJCSAgICAgIHN0cnVjdCBzeW1ib2wgKnBhcmVudCwgdTY0IHBlcmlvZCk7CiBleHRlcm4gaW50NjRfdCBoaXN0X2VudHJ5X19jbXAoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7CiBleHRlcm4gaW50NjRfdCBoaXN0X2VudHJ5X19jb2xsYXBzZShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKLWludCBoaXN0X2VudHJ5X19mcHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBzdHJ1Y3QgaGlzdHMgKnBhaXJfaGlzdHMsCi0JCQlib29sIHNob3dfZGlzcGxhY2VtZW50LCBsb25nIGRpc3BsYWNlbWVudCwgRklMRSAqZnAsCi0JCQl1NjQgdG90YWwpOworaW50IGhpc3RfZW50cnlfX2ZwcmludGYoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIHN0cnVjdCBoaXN0cyAqaGlzdHMsCisJCQlzdHJ1Y3QgaGlzdHMgKnBhaXJfaGlzdHMsIGJvb2wgc2hvd19kaXNwbGFjZW1lbnQsCisJCQlsb25nIGRpc3BsYWNlbWVudCwgRklMRSAqZnAsIHU2NCB0b3RhbCk7CiBpbnQgaGlzdF9lbnRyeV9fc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKLQkJCSBzdHJ1Y3QgaGlzdHMgKnBhaXJfaGlzdHMsIGJvb2wgc2hvd19kaXNwbGFjZW1lbnQsCi0JCQkgbG9uZyBkaXNwbGFjZW1lbnQsIGJvb2wgY29sb3IsIHU2NCB0b3RhbCk7CisJCQkgc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IGhpc3RzICpwYWlyX2hpc3RzLAorCQkJIGJvb2wgc2hvd19kaXNwbGFjZW1lbnQsIGxvbmcgZGlzcGxhY2VtZW50LAorCQkJIGJvb2wgY29sb3IsIHU2NCB0b3RhbCk7CiB2b2lkIGhpc3RfZW50cnlfX2ZyZWUoc3RydWN0IGhpc3RfZW50cnkgKik7CiAKIHZvaWQgaGlzdHNfX291dHB1dF9yZXNvcnQoc3RydWN0IGhpc3RzICpzZWxmKTsKQEAgLTk1LDYgKzEwNiwxMCBAQAogdm9pZCBoaXN0c19fZmlsdGVyX2J5X2RzbyhzdHJ1Y3QgaGlzdHMgKnNlbGYsIGNvbnN0IHN0cnVjdCBkc28gKmRzbyk7CiB2b2lkIGhpc3RzX19maWx0ZXJfYnlfdGhyZWFkKHN0cnVjdCBoaXN0cyAqc2VsZiwgY29uc3Qgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKIAordTE2IGhpc3RzX19jb2xfbGVuKHN0cnVjdCBoaXN0cyAqc2VsZiwgZW51bSBoaXN0X2NvbHVtbiBjb2wpOwordm9pZCBoaXN0c19fc2V0X2NvbF9sZW4oc3RydWN0IGhpc3RzICpzZWxmLCBlbnVtIGhpc3RfY29sdW1uIGNvbCwgdTE2IGxlbik7Citib29sIGhpc3RzX19uZXdfY29sX2xlbihzdHJ1Y3QgaGlzdHMgKnNlbGYsIGVudW0gaGlzdF9jb2x1bW4gY29sLCB1MTYgbGVuKTsKKwogI2lmZGVmIE5PX05FV1RfU1VQUE9SVAogc3RhdGljIGlubGluZSBpbnQgaGlzdHNfX2Jyb3dzZShzdHJ1Y3QgaGlzdHMgKnNlbGYgX191c2VkLAogCQkJCWNvbnN0IGNoYXIgKmhlbHBsaW5lIF9fdXNlZCwKQEAgLTEyNiw0ICsxNDEsNyBAQAogCiBpbnQgaGlzdHNfX3R1aV9icm93c2VfdHJlZShzdHJ1Y3QgcmJfcm9vdCAqc2VsZiwgY29uc3QgY2hhciAqaGVscCk7CiAjZW5kaWYKKwordW5zaWduZWQgaW50IGhpc3RzX19zb3J0X2xpc3Rfd2lkdGgoc3RydWN0IGhpc3RzICpzZWxmKTsKKwogI2VuZGlmCS8qIF9fUEVSRl9ISVNUX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwppbmRleCBlNjcyZjJmLi4zYTdlYjZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFwLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hcC5jCkBAIC0xNywxNiArMTcsNiBAQAogCXJldHVybiBzdHJjbXAoZmlsZW5hbWUsICIvL2Fub24iKSA9PSAwOwogfQogCi1zdGF0aWMgaW50IHN0cmNvbW1vbihjb25zdCBjaGFyICpwYXRobmFtZSwgY2hhciAqY3dkLCBpbnQgY3dkbGVuKQotewotCWludCBuID0gMDsKLQotCXdoaWxlIChuIDwgY3dkbGVuICYmIHBhdGhuYW1lW25dID09IGN3ZFtuXSkKLQkJKytuOwotCi0JcmV0dXJuIG47Ci19Ci0KIHZvaWQgbWFwX19pbml0KHN0cnVjdCBtYXAgKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSwKIAkgICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCB1NjQgcGdvZmYsIHN0cnVjdCBkc28gKmRzbykKIHsKQEAgLTM5LDExICsyOSwxMiBAQAogCXNlbGYtPnVubWFwX2lwID0gbWFwX191bm1hcF9pcDsKIAlSQl9DTEVBUl9OT0RFKCZzZWxmLT5yYl9ub2RlKTsKIAlzZWxmLT5ncm91cHMgICA9IE5VTEw7CisJc2VsZi0+cmVmZXJlbmNlZCA9IGZhbHNlOwogfQogCiBzdHJ1Y3QgbWFwICptYXBfX25ldyhzdHJ1Y3QgbGlzdF9oZWFkICpkc29zX19saXN0LCB1NjQgc3RhcnQsIHU2NCBsZW4sCiAJCSAgICAgdTY0IHBnb2ZmLCB1MzIgcGlkLCBjaGFyICpmaWxlbmFtZSwKLQkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIGNoYXIgKmN3ZCwgaW50IGN3ZGxlbikKKwkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IG1hcCAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKIApAQCAtNTIsMTYgKzQzLDYgQEAKIAkJc3RydWN0IGRzbyAqZHNvOwogCQlpbnQgYW5vbjsKIAotCQlpZiAoY3dkKSB7Ci0JCQlpbnQgbiA9IHN0cmNvbW1vbihmaWxlbmFtZSwgY3dkLCBjd2RsZW4pOwotCi0JCQlpZiAobiA9PSBjd2RsZW4pIHsKLQkJCQlzbnByaW50ZihuZXdmaWxlbmFtZSwgc2l6ZW9mKG5ld2ZpbGVuYW1lKSwKLQkJCQkJICIuJXMiLCBmaWxlbmFtZSArIG4pOwotCQkJCWZpbGVuYW1lID0gbmV3ZmlsZW5hbWU7Ci0JCQl9Ci0JCX0KLQogCQlhbm9uID0gaXNfYW5vbl9tZW1vcnkoZmlsZW5hbWUpOwogCiAJCWlmIChhbm9uKSB7CkBAIC0yNDgsNiArMjI5LDM5IEBACiAJc2VsZi0+bWFjaGluZSA9IE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIG1hcHNfX2RlbGV0ZShzdHJ1Y3QgcmJfcm9vdCAqc2VsZikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IHJiX2ZpcnN0KHNlbGYpOworCisJd2hpbGUgKG5leHQpIHsKKwkJc3RydWN0IG1hcCAqcG9zID0gcmJfZW50cnkobmV4dCwgc3RydWN0IG1hcCwgcmJfbm9kZSk7CisKKwkJbmV4dCA9IHJiX25leHQoJnBvcy0+cmJfbm9kZSk7CisJCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHNlbGYpOworCQltYXBfX2RlbGV0ZShwb3MpOworCX0KK30KKworc3RhdGljIHZvaWQgbWFwc19fZGVsZXRlX3JlbW92ZWQoc3RydWN0IGxpc3RfaGVhZCAqc2VsZikKK3sKKwlzdHJ1Y3QgbWFwICpwb3MsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgc2VsZiwgbm9kZSkgeworCQlsaXN0X2RlbCgmcG9zLT5ub2RlKTsKKwkJbWFwX19kZWxldGUocG9zKTsKKwl9Cit9CisKK3ZvaWQgbWFwX2dyb3Vwc19fZXhpdChzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpIHsKKwkJbWFwc19fZGVsZXRlKCZzZWxmLT5tYXBzW2ldKTsKKwkJbWFwc19fZGVsZXRlX3JlbW92ZWQoJnNlbGYtPnJlbW92ZWRfbWFwc1tpXSk7CisJfQorfQorCiB2b2lkIG1hcF9ncm91cHNfX2ZsdXNoKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmKQogewogCWludCB0eXBlOwpAQCAtMzc0LDYgKzM4OCw3IEBACiB7CiAJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmc2VsZi0+bWFwc1ttYXAtPnR5cGVdOwogCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gcmJfZmlyc3Qocm9vdCk7CisJaW50IGVyciA9IDA7CiAKIAl3aGlsZSAobmV4dCkgewogCQlzdHJ1Y3QgbWFwICpwb3MgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgbWFwLCByYl9ub2RlKTsKQEAgLTM5MCwyMCArNDA1LDE2IEBACiAKIAkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgcm9vdCk7CiAJCS8qCi0JCSAqIFdlIG1heSBoYXZlIHJlZmVyZW5jZXMgdG8gdGhpcyBtYXAsIGZvciBpbnN0YW5jZSBpbiBzb21lCi0JCSAqIGhpc3RfZW50cnkgaW5zdGFuY2VzLCBzbyBqdXN0IG1vdmUgdGhlbSB0byBhIHNlcGFyYXRlCi0JCSAqIGxpc3QuCi0JCSAqLwotCQlsaXN0X2FkZF90YWlsKCZwb3MtPm5vZGUsICZzZWxmLT5yZW1vdmVkX21hcHNbbWFwLT50eXBlXSk7Ci0JCS8qCiAJCSAqIE5vdyBjaGVjayBpZiB3ZSBuZWVkIHRvIGNyZWF0ZSBuZXcgbWFwcyBmb3IgYXJlYXMgbm90CiAJCSAqIG92ZXJsYXBwZWQgYnkgdGhlIG5ldyBtYXA6CiAJCSAqLwogCQlpZiAobWFwLT5zdGFydCA+IHBvcy0+c3RhcnQpIHsKIAkJCXN0cnVjdCBtYXAgKmJlZm9yZSA9IG1hcF9fY2xvbmUocG9zKTsKIAotCQkJaWYgKGJlZm9yZSA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKGJlZm9yZSA9PSBOVUxMKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIG1vdmVfbWFwOworCQkJfQogCiAJCQliZWZvcmUtPmVuZCA9IG1hcC0+c3RhcnQgLSAxOwogCQkJbWFwX2dyb3Vwc19faW5zZXJ0KHNlbGYsIGJlZm9yZSk7CkBAIC00MTQsMTQgKzQyNSwyNyBAQAogCQlpZiAobWFwLT5lbmQgPCBwb3MtPmVuZCkgewogCQkJc3RydWN0IG1hcCAqYWZ0ZXIgPSBtYXBfX2Nsb25lKHBvcyk7CiAKLQkJCWlmIChhZnRlciA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKGFmdGVyID09IE5VTEwpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gbW92ZV9tYXA7CisJCQl9CiAKIAkJCWFmdGVyLT5zdGFydCA9IG1hcC0+ZW5kICsgMTsKIAkJCW1hcF9ncm91cHNfX2luc2VydChzZWxmLCBhZnRlcik7CiAJCQlpZiAodmVyYm9zZSA+PSAyKQogCQkJCW1hcF9fZnByaW50ZihhZnRlciwgZnApOwogCQl9Cittb3ZlX21hcDoKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSByZWZlcmVuY2VzLCBqdXN0IG1vdmUgdGhlbSB0byBhIHNlcGFyYXRlIGxpc3QuCisJCSAqLworCQlpZiAocG9zLT5yZWZlcmVuY2VkKQorCQkJbGlzdF9hZGRfdGFpbCgmcG9zLT5ub2RlLCAmc2VsZi0+cmVtb3ZlZF9tYXBzW21hcC0+dHlwZV0pOworCQllbHNlCisJCQltYXBfX2RlbGV0ZShwb3MpOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDkzLDYgKzUxNywxMSBAQAogCXJiX2luc2VydF9jb2xvcigmbWFwLT5yYl9ub2RlLCBtYXBzKTsKIH0KIAordm9pZCBtYXBzX19yZW1vdmUoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCkKK3sKKwlyYl9lcmFzZSgmbWFwLT5yYl9ub2RlLCBzZWxmKTsKK30KKwogc3RydWN0IG1hcCAqbWFwc19fZmluZChzdHJ1Y3QgcmJfcm9vdCAqbWFwcywgdTY0IGlwKQogewogCXN0cnVjdCByYl9ub2RlICoqcCA9ICZtYXBzLT5yYl9ub2RlOwpAQCAtNTI2LDYgKzU1NSwzMSBAQAogCXJldHVybiBzZWxmLT5yb290X2RpciA9PSBOVUxMID8gLUVOT01FTSA6IDA7CiB9CiAKK3N0YXRpYyB2b2lkIGRzb3NfX2RlbGV0ZShzdHJ1Y3QgbGlzdF9oZWFkICpzZWxmKQoreworCXN0cnVjdCBkc28gKnBvcywgKm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCBzZWxmLCBub2RlKSB7CisJCWxpc3RfZGVsKCZwb3MtPm5vZGUpOworCQlkc29fX2RlbGV0ZShwb3MpOworCX0KK30KKwordm9pZCBtYWNoaW5lX19leGl0KHN0cnVjdCBtYWNoaW5lICpzZWxmKQoreworCW1hcF9ncm91cHNfX2V4aXQoJnNlbGYtPmttYXBzKTsKKwlkc29zX19kZWxldGUoJnNlbGYtPnVzZXJfZHNvcyk7CisJZHNvc19fZGVsZXRlKCZzZWxmLT5rZXJuZWxfZHNvcyk7CisJZnJlZShzZWxmLT5yb290X2Rpcik7CisJc2VsZi0+cm9vdF9kaXIgPSBOVUxMOworfQorCit2b2lkIG1hY2hpbmVfX2RlbGV0ZShzdHJ1Y3QgbWFjaGluZSAqc2VsZikKK3sKKwltYWNoaW5lX19leGl0KHNlbGYpOworCWZyZWUoc2VsZik7Cit9CisKIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lc19fYWRkKHN0cnVjdCByYl9yb290ICpzZWxmLCBwaWRfdCBwaWQsCiAJCQkgICAgICBjb25zdCBjaGFyICpyb290X2RpcikKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaCBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaAppbmRleCBmMzkxMzQ1Li43ODU3NTc5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFwLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hcC5oCkBAIC0yOSw3ICsyOSw4IEBACiAJfTsKIAl1NjQJCQlzdGFydDsKIAl1NjQJCQllbmQ7Ci0JZW51bSBtYXBfdHlwZQkJdHlwZTsKKwl1OCAvKiBlbnVtIG1hcF90eXBlICovCXR5cGU7CisJYm9vbAkJCXJlZmVyZW5jZWQ7CiAJdTMyCQkJcHJpdjsKIAl1NjQJCQlwZ29mZjsKIApAQCAtMTA2LDcgKzEwNyw3IEBACiAJICAgICAgIHU2NCBzdGFydCwgdTY0IGVuZCwgdTY0IHBnb2ZmLCBzdHJ1Y3QgZHNvICpkc28pOwogc3RydWN0IG1hcCAqbWFwX19uZXcoc3RydWN0IGxpc3RfaGVhZCAqZHNvc19fbGlzdCwgdTY0IHN0YXJ0LCB1NjQgbGVuLAogCQkgICAgIHU2NCBwZ29mZiwgdTMyIHBpZCwgY2hhciAqZmlsZW5hbWUsCi0JCSAgICAgZW51bSBtYXBfdHlwZSB0eXBlLCBjaGFyICpjd2QsIGludCBjd2RsZW4pOworCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSk7CiB2b2lkIG1hcF9fZGVsZXRlKHN0cnVjdCBtYXAgKnNlbGYpOwogc3RydWN0IG1hcCAqbWFwX19jbG9uZShzdHJ1Y3QgbWFwICpzZWxmKTsKIGludCBtYXBfX292ZXJsYXAoc3RydWN0IG1hcCAqbCwgc3RydWN0IG1hcCAqcik7CkBAIC0xMjUsOCArMTI2LDEwIEBACiBzaXplX3QgX19tYXBfZ3JvdXBzX19mcHJpbnRmX21hcHMoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsCiAJCQkJICBlbnVtIG1hcF90eXBlIHR5cGUsIGludCB2ZXJib3NlLCBGSUxFICpmcCk7CiB2b2lkIG1hcHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqbWFwcywgc3RydWN0IG1hcCAqbWFwKTsKK3ZvaWQgbWFwc19fcmVtb3ZlKHN0cnVjdCByYl9yb290ICpzZWxmLCBzdHJ1Y3QgbWFwICptYXApOwogc3RydWN0IG1hcCAqbWFwc19fZmluZChzdHJ1Y3QgcmJfcm9vdCAqbWFwcywgdTY0IGFkZHIpOwogdm9pZCBtYXBfZ3JvdXBzX19pbml0KHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmKTsKK3ZvaWQgbWFwX2dyb3Vwc19fZXhpdChzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZik7CiBpbnQgbWFwX2dyb3Vwc19fY2xvbmUoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsCiAJCSAgICAgIHN0cnVjdCBtYXBfZ3JvdXBzICpwYXJlbnQsIGVudW0gbWFwX3R5cGUgdHlwZSk7CiBzaXplX3QgbWFwX2dyb3Vwc19fZnByaW50ZihzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwgaW50IHZlcmJvc2UsIEZJTEUgKmZwKTsKQEAgLTE0Miw2ICsxNDUsOCBAQAogc3RydWN0IG1hY2hpbmUgKm1hY2hpbmVzX19maW5kbmV3KHN0cnVjdCByYl9yb290ICpzZWxmLCBwaWRfdCBwaWQpOwogY2hhciAqbWFjaGluZV9fbW1hcF9uYW1lKHN0cnVjdCBtYWNoaW5lICpzZWxmLCBjaGFyICpiZiwgc2l6ZV90IHNpemUpOwogaW50IG1hY2hpbmVfX2luaXQoc3RydWN0IG1hY2hpbmUgKnNlbGYsIGNvbnN0IGNoYXIgKnJvb3RfZGlyLCBwaWRfdCBwaWQpOwordm9pZCBtYWNoaW5lX19leGl0KHN0cnVjdCBtYWNoaW5lICpzZWxmKTsKK3ZvaWQgbWFjaGluZV9fZGVsZXRlKHN0cnVjdCBtYWNoaW5lICpzZWxmKTsKIAogLyoKICAqIERlZmF1bHQgZ3Vlc3Qga2VybmVsIGlzIGRlZmluZWQgYnkgcGFyYW1ldGVyIC0tZ3Vlc3RrYWxsc3ltcwpAQCAtMTYzLDYgKzE2OCwxMSBAQAogCW1hcC0+Z3JvdXBzID0gc2VsZjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG1hcF9ncm91cHNfX3JlbW92ZShzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwKQoreworCW1hcHNfX3JlbW92ZSgmc2VsZi0+bWFwc1ttYXAtPnR5cGVdLCBtYXApOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXAgKm1hcF9ncm91cHNfX2ZpbmQoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsCiAJCQkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpCiB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbmV3dC5jIGIvdG9vbHMvcGVyZi91dGlsL25ld3QuYwppbmRleCA3NTM3Y2ExLi45MWRlOTliIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbmV3dC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9uZXd0LmMKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgSEFWRV9MT05HX0xPTkcgX19HTElCQ19IQVZFX0xPTkdfTE9ORwogI2VuZGlmCiAjaW5jbHVkZSA8c2xhbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxuZXd0Lmg+CiAjaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+CkBAIC0yNzgsOSArMjc5LDQ4IEBACiAJdm9pZAkJKmZpcnN0X3Zpc2libGVfZW50cnksICplbnRyaWVzOwogCXUxNgkJdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0OwogCXZvaWQJCSpwcml2OworCXVuc2lnbmVkIGludAkoKnJlZnJlc2hfZW50cmllcykoc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYpOworCXZvaWQJCSgqc2Vlaykoc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYsCisJCQkJb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKIAl1MzIJCW5yX2VudHJpZXM7CiB9OwogCitzdGF0aWMgdm9pZCB1aV9icm93c2VyX19saXN0X2hlYWRfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZiwKKwkJCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSBzZWxmLT5lbnRyaWVzOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCXN3aXRjaCAod2hlbmNlKSB7CisJY2FzZSBTRUVLX1NFVDoKKwkJcG9zID0gaGVhZC0+bmV4dDsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJcG9zID0gc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeTsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0VORDoKKwkJcG9zID0gaGVhZC0+cHJldjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWlmIChvZmZzZXQgPiAwKSB7CisJCXdoaWxlIChvZmZzZXQtLSAhPSAwKQorCQkJcG9zID0gcG9zLT5uZXh0OworCX0gZWxzZSB7CisJCXdoaWxlIChvZmZzZXQrKyAhPSAwKQorCQkJcG9zID0gcG9zLT5wcmV2OworCX0KKworCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBwb3M7Cit9CisKK3N0YXRpYyBib29sIHVpX2Jyb3dzZXJfX2lzX2N1cnJlbnRfZW50cnkoc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYsIHVuc2lnbmVkIHJvdykKK3sKKwlyZXR1cm4gKHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnlfaWR4ICsgcm93KSA9PSBzZWxmLT5pbmRleDsKK30KKwogc3RhdGljIHZvaWQgdWlfYnJvd3Nlcl9fcmVmcmVzaF9kaW1lbnNpb25zKHN0cnVjdCB1aV9icm93c2VyICpzZWxmKQogewogCWludCBjb2xzLCByb3dzOwpAQCAtMjk3LDggKzMzNywzNiBAQAogCiBzdGF0aWMgdm9pZCB1aV9icm93c2VyX19yZXNldF9pbmRleChzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZikKIHsKLSAgICAgICAgc2VsZi0+aW5kZXggPSBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5X2lkeCA9IDA7Ci0gICAgICAgIHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBOVUxMOworCXNlbGYtPmluZGV4ID0gc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeV9pZHggPSAwOworCXNlbGYtPnNlZWsoc2VsZiwgMCwgU0VFS19TRVQpOworfQorCitzdGF0aWMgaW50IHVpX2Jyb3dzZXJfX3Nob3coc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYsIGNvbnN0IGNoYXIgKnRpdGxlKQoreworCWlmIChzZWxmLT5mb3JtICE9IE5VTEwpIHsKKwkJbmV3dEZvcm1EZXN0cm95KHNlbGYtPmZvcm0pOworCQluZXd0UG9wV2luZG93KCk7CisJfQorCXVpX2Jyb3dzZXJfX3JlZnJlc2hfZGltZW5zaW9ucyhzZWxmKTsKKwluZXd0Q2VudGVyZWRXaW5kb3coc2VsZi0+d2lkdGgsIHNlbGYtPmhlaWdodCwgdGl0bGUpOworCXNlbGYtPmZvcm0gPSBuZXd0X2Zvcm1fX25ldygpOworCWlmIChzZWxmLT5mb3JtID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNlbGYtPnNiID0gbmV3dFZlcnRpY2FsU2Nyb2xsYmFyKHNlbGYtPndpZHRoLCAwLCBzZWxmLT5oZWlnaHQsCisJCQkJCSBIRV9DT0xPUlNFVF9OT1JNQUwsCisJCQkJCSBIRV9DT0xPUlNFVF9TRUxFQ1RFRCk7CisJaWYgKHNlbGYtPnNiID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sIE5FV1RfS0VZX1VQKTsKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9ET1dOKTsKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9QR1VQKTsKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9QR0ROKTsKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9IT01FKTsKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9FTkQpOworCW5ld3RGb3JtQWRkQ29tcG9uZW50KHNlbGYtPmZvcm0sIHNlbGYtPnNiKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvYmpkdW1wX2xpbmVfX3Nob3coc3RydWN0IG9iamR1bXBfbGluZSAqc2VsZiwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKQEAgLTM1MiwyNiArNDIwLDEwIEBACiAKIHN0YXRpYyBpbnQgdWlfYnJvd3Nlcl9fcmVmcmVzaF9lbnRyaWVzKHN0cnVjdCB1aV9icm93c2VyICpzZWxmKQogewotCXN0cnVjdCBvYmpkdW1wX2xpbmUgKnBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gc2VsZi0+ZW50cmllczsKLQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUgPSBzZWxmLT5wcml2OwotCWludCByb3cgPSAwOwotCWludCBsZW4gPSBoZS0+bXMuc3ltLT5lbmQgLSBoZS0+bXMuc3ltLT5zdGFydDsKKwlpbnQgcm93OwogCi0JaWYgKHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPT0gTlVMTCB8fCBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5ID09IHNlbGYtPmVudHJpZXMpCi0gICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IGhlYWQtPm5leHQ7Ci0KLQlwb3MgPSBsaXN0X2VudHJ5KHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnksIHN0cnVjdCBvYmpkdW1wX2xpbmUsIG5vZGUpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHBvcywgaGVhZCwgbm9kZSkgewotCQlib29sIGN1cnJlbnRfZW50cnkgPSAoc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeV9pZHggKyByb3cpID09IHNlbGYtPmluZGV4OwotCQlTTHNtZ19nb3RvcmMoc2VsZi0+dG9wICsgcm93LCBzZWxmLT5sZWZ0KTsKLQkJb2JqZHVtcF9saW5lX19zaG93KHBvcywgaGVhZCwgc2VsZi0+d2lkdGgsCi0JCQkJICAgaGUsIGxlbiwgY3VycmVudF9lbnRyeSk7Ci0JCWlmICgrK3JvdyA9PSBzZWxmLT5oZWlnaHQpCi0JCQlicmVhazsKLQl9Ci0KKwluZXd0U2Nyb2xsYmFyU2V0KHNlbGYtPnNiLCBzZWxmLT5pbmRleCwgc2VsZi0+bnJfZW50cmllcyAtIDEpOworCXJvdyA9IHNlbGYtPnJlZnJlc2hfZW50cmllcyhzZWxmKTsKIAlTTHNtZ19zZXRfY29sb3IoSEVfQ09MT1JTRVRfTk9STUFMKTsKIAlTTHNtZ19maWxsX3JlZ2lvbihzZWxmLT50b3AgKyByb3csIHNlbGYtPmxlZnQsCiAJCQkgIHNlbGYtPmhlaWdodCAtIHJvdywgc2VsZi0+d2lkdGgsICcgJyk7CkBAIC0zNzksNDIgKzQzMSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVpX2Jyb3dzZXJfX3J1bihzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZiwgY29uc3QgY2hhciAqdGl0bGUsCi0JCQkgICBzdHJ1Y3QgbmV3dEV4aXRTdHJ1Y3QgKmVzKQorc3RhdGljIGludCB1aV9icm93c2VyX19ydW4oc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYsIHN0cnVjdCBuZXd0RXhpdFN0cnVjdCAqZXMpCiB7Ci0JaWYgKHNlbGYtPmZvcm0pIHsKLQkJbmV3dEZvcm1EZXN0cm95KHNlbGYtPmZvcm0pOwotCQluZXd0UG9wV2luZG93KCk7Ci0JfQotCi0JdWlfYnJvd3Nlcl9fcmVmcmVzaF9kaW1lbnNpb25zKHNlbGYpOwotCW5ld3RDZW50ZXJlZFdpbmRvdyhzZWxmLT53aWR0aCArIDIsIHNlbGYtPmhlaWdodCwgdGl0bGUpOwotCXNlbGYtPmZvcm0gPSBuZXd0X2Zvcm1fX25ldygpOwotCWlmIChzZWxmLT5mb3JtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCXNlbGYtPnNiID0gbmV3dFZlcnRpY2FsU2Nyb2xsYmFyKHNlbGYtPndpZHRoICsgMSwgMCwgc2VsZi0+aGVpZ2h0LAotCQkJCQkgSEVfQ09MT1JTRVRfTk9STUFMLAotCQkJCQkgSEVfQ09MT1JTRVRfU0VMRUNURUQpOwotCWlmIChzZWxmLT5zYiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9VUCk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgTkVXVF9LRVlfRE9XTik7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgTkVXVF9LRVlfUEdVUCk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgTkVXVF9LRVlfUEdETik7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgJyAnKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9IT01FKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9FTkQpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sIE5FV1RfS0VZX1RBQik7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgTkVXVF9LRVlfUklHSFQpOwotCiAJaWYgKHVpX2Jyb3dzZXJfX3JlZnJlc2hfZW50cmllcyhzZWxmKSA8IDApCiAJCXJldHVybiAtMTsKLQluZXd0Rm9ybUFkZENvbXBvbmVudChzZWxmLT5mb3JtLCBzZWxmLT5zYik7CiAKIAl3aGlsZSAoMSkgewotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCQlvZmZfdCBvZmZzZXQ7CiAKIAkJbmV3dEZvcm1SdW4oc2VsZi0+Zm9ybSwgZXMpOwogCkBAIC00MjgsOSArNDUxLDggQEAKIAkJCQlicmVhazsKIAkJCSsrc2VsZi0+aW5kZXg7CiAJCQlpZiAoc2VsZi0+aW5kZXggPT0gc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeV9pZHggKyBzZWxmLT5oZWlnaHQpIHsKLQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5OwogCQkJCSsrc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeV9pZHg7Ci0JCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IHBvcy0+bmV4dDsKKwkJCQlzZWxmLT5zZWVrKHNlbGYsICsxLCBTRUVLX0NVUik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBORVdUX0tFWV9VUDoKQEAgLTQzOCw5ICs0NjAsOCBAQAogCQkJCWJyZWFrOwogCQkJLS1zZWxmLT5pbmRleDsKIAkJCWlmIChzZWxmLT5pbmRleCA8IHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnlfaWR4KSB7Ci0JCQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeTsKIAkJCQktLXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnlfaWR4OwotCQkJCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBwb3MtPnByZXY7CisJCQkJc2VsZi0+c2VlayhzZWxmLCAtMSwgU0VFS19DVVIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTkVXVF9LRVlfUEdETjoKQEAgLTQ1MywxMiArNDc0LDcgQEAKIAkJCQlvZmZzZXQgPSBzZWxmLT5ucl9lbnRyaWVzIC0gMSAtIHNlbGYtPmluZGV4OwogCQkJc2VsZi0+aW5kZXggKz0gb2Zmc2V0OwogCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeV9pZHggKz0gb2Zmc2V0OwotCi0JCQl3aGlsZSAob2Zmc2V0LS0pIHsKLQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5OwotCQkJCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBwb3MtPm5leHQ7Ci0JCQl9Ci0KKwkJCXNlbGYtPnNlZWsoc2VsZiwgK29mZnNldCwgU0VFS19DVVIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTkVXVF9LRVlfUEdVUDoKIAkJCWlmIChzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5X2lkeCA9PSAwKQpAQCAtNDcxLDM2ICs0ODcsMjIgQEAKIAogCQkJc2VsZi0+aW5kZXggLT0gb2Zmc2V0OwogCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeV9pZHggLT0gb2Zmc2V0OwotCi0JCQl3aGlsZSAob2Zmc2V0LS0pIHsKLQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5OwotCQkJCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBwb3MtPnByZXY7Ci0JCQl9CisJCQlzZWxmLT5zZWVrKHNlbGYsIC1vZmZzZXQsIFNFRUtfQ1VSKTsKIAkJCWJyZWFrOwogCQljYXNlIE5FV1RfS0VZX0hPTUU6CiAJCQl1aV9icm93c2VyX19yZXNldF9pbmRleChzZWxmKTsKIAkJCWJyZWFrOwotCQljYXNlIE5FV1RfS0VZX0VORDogewotCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IHNlbGYtPmVudHJpZXM7CisJCWNhc2UgTkVXVF9LRVlfRU5EOgogCQkJb2Zmc2V0ID0gc2VsZi0+aGVpZ2h0IC0gMTsKKwkJCWlmIChvZmZzZXQgPj0gc2VsZi0+bnJfZW50cmllcykKKwkJCQlvZmZzZXQgPSBzZWxmLT5ucl9lbnRyaWVzIC0gMTsKIAotCQkJaWYgKG9mZnNldCA+IHNlbGYtPm5yX2VudHJpZXMpCi0JCQkJb2Zmc2V0ID0gc2VsZi0+bnJfZW50cmllczsKLQotCQkJc2VsZi0+aW5kZXggPSBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5X2lkeCA9IHNlbGYtPm5yX2VudHJpZXMgLSAxIC0gb2Zmc2V0OwotCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IGhlYWQtPnByZXY7Ci0JCQl3aGlsZSAob2Zmc2V0LS0gIT0gMCkgewotCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnk7Ci0JCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IHBvcy0+cHJldjsKLQkJCX0KLQkJfQorCQkJc2VsZi0+aW5kZXggPSBzZWxmLT5ucl9lbnRyaWVzIC0gMTsKKwkJCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnlfaWR4ID0gc2VsZi0+aW5kZXggLSBvZmZzZXQ7CisJCQlzZWxmLT5zZWVrKHNlbGYsIC1vZmZzZXQsIFNFRUtfRU5EKTsKIAkJCWJyZWFrOwotCQljYXNlIE5FV1RfS0VZX1JJR0hUOgotCQljYXNlIE5FV1RfS0VZX0xFRlQ6Ci0JCWNhc2UgTkVXVF9LRVlfVEFCOgotCQkJcmV0dXJuIGVzLT51LmtleTsKIAkJZGVmYXVsdDoKLQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIGVzLT51LmtleTsKIAkJfQogCQlpZiAodWlfYnJvd3Nlcl9fcmVmcmVzaF9lbnRyaWVzKHNlbGYpIDwgMCkKIAkJCXJldHVybiAtMTsKQEAgLTUwOCwzOCArNTEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFdoZW4gZGVidWdnaW5nIG5ld3QgcHJvYmxlbXMgaXQgd2FzIHVzZWZ1bCB0byBiZSBhYmxlIHRvICJ1bnJvbGwiCi0gKiB0aGUgY2FsbHMgdG8gbmV3dENoZWNrQm94VHJlZUFkZHtBcnJheSxJdGVtfSwgc28gdGhhdCB3ZSBjYW4gZ2VuZXJhdGUKLSAqIGEgc291cmNlIGZpbGUgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcywgdG8gdGhlbgotICogdHdlYWsgdGhlIGFycmF5cyB0byBnZXQgdGhlIGludGVuZGVkIHJlc3VsdHMsIHNvIEknbSBrZWVwaW5nIHRoaXMgY29kZQotICogaGVyZSwgbWF5IGJlIHVzZWZ1bCBhZ2FpbiBpbiB0aGUgZnV0dXJlLgotICovCi0jdW5kZWYgTkVXVF9ERUJVRwotCi1zdGF0aWMgdm9pZCBuZXd0X2NoZWNrYm94X3RyZWVfX2FkZChuZXd0Q29tcG9uZW50IHRyZWUsIGNvbnN0IGNoYXIgKnN0ciwKLQkJCQkgICAgdm9pZCAqcHJpdiwgaW50ICppbmRleGVzKQotewotI2lmZGVmIE5FV1RfREVCVUcKLQkvKiBQcmludCB0aGUgbmV3dENoZWNrYm94VHJlZUFkZEFycmF5IHRvIHRpbmtlciB3aXRoIGl0cyBpbmRleCBhcnJheXMgKi8KLQlpbnQgaSA9IDAsIGxlbiA9IDQwIC0gc3RybGVuKHN0cik7Ci0KLQlmcHJpbnRmKHN0ZGVyciwKLQkJIlx0bmV3dENoZWNrYm94VHJlZUFkZEl0ZW0odHJlZSwgJSouKnNcIiVzXCIsICh2b2lkICopJXAsIDAsICIsCi0JCWxlbiwgbGVuLCAiICIsIHN0ciwgcHJpdik7Ci0Jd2hpbGUgKGluZGV4ZXNbaV0gIT0gTkVXVF9BUkdfTEFTVCkgewotCQlpZiAoaW5kZXhlc1tpXSAhPSBORVdUX0FSR19BUFBFTkQpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiAlZCwiLCBpbmRleGVzW2ldKTsKLQkJZWxzZQotCQkJZnByaW50ZihzdGRlcnIsICIgJXMsIiwgIk5FV1RfQVJHX0FQUEVORCIpOwotCQkrK2k7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiICVzIiwgIiBORVdUX0FSR19MQVNUKTtcbiIpOwotCWZmbHVzaChzdGRlcnIpOwotI2VuZGlmCi0JbmV3dENoZWNrYm94VHJlZUFkZEFycmF5KHRyZWUsIHN0ciwgcHJpdiwgMCwgaW5kZXhlcyk7Ci19Ci0KIHN0YXRpYyBjaGFyICpjYWxsY2hhaW5fbGlzdF9fc3ltX25hbWUoc3RydWN0IGNhbGxjaGFpbl9saXN0ICpzZWxmLAogCQkJCSAgICAgIGNoYXIgKmJmLCBzaXplX3QgYmZzaXplKQogewpAQCAtNTUwLDE0NCArNTIwLDI5IEBACiAJcmV0dXJuIGJmOwogfQogCi1zdGF0aWMgdm9pZCBfX2NhbGxjaGFpbl9fYXBwZW5kX2dyYXBoX2Jyb3dzZXIoc3RydWN0IGNhbGxjaGFpbl9ub2RlICpzZWxmLAotCQkJCQkgICAgICBuZXd0Q29tcG9uZW50IHRyZWUsIHU2NCB0b3RhbCwKLQkJCQkJICAgICAgaW50ICppbmRleGVzLCBpbnQgZGVwdGgpCitzdGF0aWMgdW5zaWduZWQgaW50IGhpc3RfZW50cnlfX2Fubm90YXRlX2Jyb3dzZXJfcmVmcmVzaChzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZikKIHsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQl1NjQgbmV3X3RvdGFsLCByZW1haW5pbmc7Ci0JaW50IGlkeCA9IDA7CisJc3RydWN0IG9iamR1bXBfbGluZSAqcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSBzZWxmLT5lbnRyaWVzOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSA9IHNlbGYtPnByaXY7CisJaW50IHJvdyA9IDA7CisJaW50IGxlbiA9IGhlLT5tcy5zeW0tPmVuZCAtIGhlLT5tcy5zeW0tPnN0YXJ0OwogCi0JaWYgKGNhbGxjaGFpbl9wYXJhbS5tb2RlID09IENIQUlOX0dSQVBIX1JFTCkKLQkJbmV3X3RvdGFsID0gc2VsZi0+Y2hpbGRyZW5faGl0OwotCWVsc2UKLQkJbmV3X3RvdGFsID0gdG90YWw7CisJaWYgKHNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPT0gTlVMTCB8fCBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5ID09IHNlbGYtPmVudHJpZXMpCisgICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IGhlYWQtPm5leHQ7CiAKLQlyZW1haW5pbmcgPSBuZXdfdG90YWw7Ci0Jbm9kZSA9IHJiX2ZpcnN0KCZzZWxmLT5yYl9yb290KTsKLQl3aGlsZSAobm9kZSkgewotCQlzdHJ1Y3QgY2FsbGNoYWluX25vZGUgKmNoaWxkID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGNhbGxjaGFpbl9ub2RlLCByYl9ub2RlKTsKLQkJc3RydWN0IHJiX25vZGUgKm5leHQgPSByYl9uZXh0KG5vZGUpOwotCQl1NjQgY3VtdWwgPSBjdW11bF9oaXRzKGNoaWxkKTsKLQkJc3RydWN0IGNhbGxjaGFpbl9saXN0ICpjaGFpbjsKLQkJaW50IGZpcnN0ID0gdHJ1ZSwgcHJpbnRlZCA9IDA7Ci0JCWludCBjaGFpbl9pZHggPSAtMTsKLQkJcmVtYWluaW5nIC09IGN1bXVsOworCXBvcyA9IGxpc3RfZW50cnkoc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSwgc3RydWN0IG9iamR1bXBfbGluZSwgbm9kZSk7CiAKLQkJaW5kZXhlc1tkZXB0aF0gPSBORVdUX0FSR19BUFBFTkQ7Ci0JCWluZGV4ZXNbZGVwdGggKyAxXSA9IE5FV1RfQVJHX0xBU1Q7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFpbiwgJmNoaWxkLT52YWwsIGxpc3QpIHsKLQkJCWNoYXIgaXBzdHJbQklUU19QRVJfTE9ORyAvIDQgKyAxXSwKLQkJCSAgICAgKmFsbG9jX3N0ciA9IE5VTEw7Ci0JCQljb25zdCBjaGFyICpzdHIgPSBjYWxsY2hhaW5fbGlzdF9fc3ltX25hbWUoY2hhaW4sIGlwc3RyLCBzaXplb2YoaXBzdHIpKTsKLQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZG91YmxlIHBlcmNlbnQgPSBjdW11bCAqIDEwMC4wIC8gbmV3X3RvdGFsOwotCi0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlpZiAoYXNwcmludGYoJmFsbG9jX3N0ciwgIiUyLjJmJSUgJXMiLCBwZXJjZW50LCBzdHIpIDwgMCkKLQkJCQkJc3RyID0gIk5vdCBlbm91Z2ggbWVtb3J5ISI7Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBhbGxvY19zdHI7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ZXNbZGVwdGhdID0gaWR4OwotCQkJCWluZGV4ZXNbZGVwdGggKyAxXSA9IE5FV1RfQVJHX0FQUEVORDsKLQkJCQlpbmRleGVzW2RlcHRoICsgMl0gPSBORVdUX0FSR19MQVNUOwotCQkJCSsrY2hhaW5faWR4OwotCQkJfQotCQkJbmV3dF9jaGVja2JveF90cmVlX19hZGQodHJlZSwgc3RyLCAmY2hhaW4tPm1zLCBpbmRleGVzKTsKLQkJCWZyZWUoYWxsb2Nfc3RyKTsKLQkJCSsrcHJpbnRlZDsKLQkJfQotCi0JCWluZGV4ZXNbZGVwdGhdID0gaWR4OwotCQlpZiAoY2hhaW5faWR4ICE9IC0xKQotCQkJaW5kZXhlc1tkZXB0aCArIDFdID0gY2hhaW5faWR4OwotCQlpZiAocHJpbnRlZCAhPSAwKQotCQkJKytpZHg7Ci0JCV9fY2FsbGNoYWluX19hcHBlbmRfZ3JhcGhfYnJvd3NlcihjaGlsZCwgdHJlZSwgbmV3X3RvdGFsLCBpbmRleGVzLAotCQkJCQkJICBkZXB0aCArIChjaGFpbl9pZHggIT0gLTEgPyAyIDogMSkpOwotCQlub2RlID0gbmV4dDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGxjaGFpbl9fYXBwZW5kX2dyYXBoX2Jyb3dzZXIoc3RydWN0IGNhbGxjaGFpbl9ub2RlICpzZWxmLAotCQkJCQkgICAgbmV3dENvbXBvbmVudCB0cmVlLCB1NjQgdG90YWwsCi0JCQkJCSAgICBpbnQgKmluZGV4ZXMsIGludCBwYXJlbnRfaWR4KQotewotCXN0cnVjdCBjYWxsY2hhaW5fbGlzdCAqY2hhaW47Ci0JaW50IGkgPSAwOwotCi0JaW5kZXhlc1sxXSA9IE5FV1RfQVJHX0FQUEVORDsKLQlpbmRleGVzWzJdID0gTkVXVF9BUkdfTEFTVDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhaW4sICZzZWxmLT52YWwsIGxpc3QpIHsKLQkJY2hhciBpcHN0cltCSVRTX1BFUl9MT05HIC8gNCArIDFdLCAqc3RyOwotCi0JCWlmIChjaGFpbi0+aXAgPj0gUEVSRl9DT05URVhUX01BWCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghaSsrICYmIHNvcnRfX2ZpcnN0X2RpbWVuc2lvbiA9PSBTT1JUX1NZTSkKLQkJCWNvbnRpbnVlOwotCi0JCXN0ciA9IGNhbGxjaGFpbl9saXN0X19zeW1fbmFtZShjaGFpbiwgaXBzdHIsIHNpemVvZihpcHN0cikpOwotCQluZXd0X2NoZWNrYm94X3RyZWVfX2FkZCh0cmVlLCBzdHIsICZjaGFpbi0+bXMsIGluZGV4ZXMpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbShwb3MsIGhlYWQsIG5vZGUpIHsKKwkJYm9vbCBjdXJyZW50X2VudHJ5ID0gdWlfYnJvd3Nlcl9faXNfY3VycmVudF9lbnRyeShzZWxmLCByb3cpOworCQlTTHNtZ19nb3RvcmMoc2VsZi0+dG9wICsgcm93LCBzZWxmLT5sZWZ0KTsKKwkJb2JqZHVtcF9saW5lX19zaG93KHBvcywgaGVhZCwgc2VsZi0+d2lkdGgsCisJCQkJICAgaGUsIGxlbiwgY3VycmVudF9lbnRyeSk7CisJCWlmICgrK3JvdyA9PSBzZWxmLT5oZWlnaHQpCisJCQlicmVhazsKIAl9CiAKLQlpbmRleGVzWzFdID0gcGFyZW50X2lkeDsKLQlpbmRleGVzWzJdID0gTkVXVF9BUkdfQVBQRU5EOwotCWluZGV4ZXNbM10gPSBORVdUX0FSR19MQVNUOwotCV9fY2FsbGNoYWluX19hcHBlbmRfZ3JhcGhfYnJvd3NlcihzZWxmLCB0cmVlLCB0b3RhbCwgaW5kZXhlcywgMik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpc3RfZW50cnlfX2FwcGVuZF9jYWxsY2hhaW5fYnJvd3NlcihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwKLQkJCQkJCSBuZXd0Q29tcG9uZW50IHRyZWUsIHU2NCB0b3RhbCwgaW50IHBhcmVudF9pZHgpCi17Ci0Jc3RydWN0IHJiX25vZGUgKnJiX25vZGU7Ci0JaW50IGluZGV4ZXNbMTAyNF0gPSB7IFswXSA9IHBhcmVudF9pZHgsIH07Ci0JaW50IGlkeCA9IDA7Ci0Jc3RydWN0IGNhbGxjaGFpbl9ub2RlICpjaGFpbjsKLQotCXJiX25vZGUgPSByYl9maXJzdCgmc2VsZi0+c29ydGVkX2NoYWluKTsKLQl3aGlsZSAocmJfbm9kZSkgewotCQljaGFpbiA9IHJiX2VudHJ5KHJiX25vZGUsIHN0cnVjdCBjYWxsY2hhaW5fbm9kZSwgcmJfbm9kZSk7Ci0JCXN3aXRjaCAoY2FsbGNoYWluX3BhcmFtLm1vZGUpIHsKLQkJY2FzZSBDSEFJTl9GTEFUOgotCQkJYnJlYWs7Ci0JCWNhc2UgQ0hBSU5fR1JBUEhfQUJTOiAvKiBmYWxsZG93biAqLwotCQljYXNlIENIQUlOX0dSQVBIX1JFTDoKLQkJCWNhbGxjaGFpbl9fYXBwZW5kX2dyYXBoX2Jyb3dzZXIoY2hhaW4sIHRyZWUsIHRvdGFsLCBpbmRleGVzLCBpZHgrKyk7Ci0JCQlicmVhazsKLQkJY2FzZSBDSEFJTl9OT05FOgotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJcmJfbm9kZSA9IHJiX25leHQocmJfbm9kZSk7Ci0JfQotfQotCi1zdGF0aWMgc2l6ZV90IGhpc3RfZW50cnlfX2FwcGVuZF9icm93c2VyKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLAotCQkJCQkgbmV3dENvbXBvbmVudCB0cmVlLCB1NjQgdG90YWwpCi17Ci0JY2hhciBzWzI1Nl07Ci0Jc2l6ZV90IHJldDsKLQotCWlmIChzeW1ib2xfY29uZi5leGNsdWRlX290aGVyICYmICFzZWxmLT5wYXJlbnQpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gaGlzdF9lbnRyeV9fc25wcmludGYoc2VsZiwgcywgc2l6ZW9mKHMpLCBOVUxMLAotCQkJCSAgIGZhbHNlLCAwLCBmYWxzZSwgdG90YWwpOwotCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKSB7Ci0JCWludCBpbmRleGVzWzJdOwotCi0JCWluZGV4ZXNbMF0gPSBORVdUX0FSR19BUFBFTkQ7Ci0JCWluZGV4ZXNbMV0gPSBORVdUX0FSR19MQVNUOwotCQluZXd0X2NoZWNrYm94X3RyZWVfX2FkZCh0cmVlLCBzLCAmc2VsZi0+bXMsIGluZGV4ZXMpOwotCX0gZWxzZQotCQluZXd0TGlzdGJveEFwcGVuZEVudHJ5KHRyZWUsIHMsICZzZWxmLT5tcyk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByb3c7CiB9CiAKIGludCBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCkBAIC03MTIsNyArNTY3LDkgQEAKIAl1aV9oZWxwbGluZV9fcHVzaCgiUHJlc3MgPC0gb3IgRVNDIHRvIGV4aXQiKTsKIAogCW1lbXNldCgmYnJvd3NlciwgMCwgc2l6ZW9mKGJyb3dzZXIpKTsKLQlicm93c2VyLmVudHJpZXMgPSAmaGVhZDsKKwlicm93c2VyLmVudHJpZXMJCT0gJmhlYWQ7CisJYnJvd3Nlci5yZWZyZXNoX2VudHJpZXMgPSBoaXN0X2VudHJ5X19hbm5vdGF0ZV9icm93c2VyX3JlZnJlc2g7CisJYnJvd3Nlci5zZWVrCQk9IHVpX2Jyb3dzZXJfX2xpc3RfaGVhZF9zZWVrOwogCWJyb3dzZXIucHJpdiA9IHNlbGY7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZoZWFkLCBub2RlKSB7CiAJCXNpemVfdCBsaW5lX2xlbiA9IHN0cmxlbihwb3MtPmxpbmUpOwpAQCAtNzIyLDcgKzU3OSw5IEBACiAJfQogCiAJYnJvd3Nlci53aWR0aCArPSAxODsgLyogUGVyY2VudGFnZSAqLwotCXJldCA9IHVpX2Jyb3dzZXJfX3J1bigmYnJvd3Nlciwgc2VsZi0+bXMuc3ltLT5uYW1lLCAmZXMpOworCXVpX2Jyb3dzZXJfX3Nob3coJmJyb3dzZXIsIHNlbGYtPm1zLnN5bS0+bmFtZSk7CisJbmV3dEZvcm1BZGRIb3RLZXkoYnJvd3Nlci5mb3JtLCAnICcpOworCXJldCA9IHVpX2Jyb3dzZXJfX3J1bigmYnJvd3NlciwgJmVzKTsKIAluZXd0Rm9ybURlc3Ryb3koYnJvd3Nlci5mb3JtKTsKIAluZXd0UG9wV2luZG93KCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJmhlYWQsIG5vZGUpIHsKQEAgLTczMywxNTcgKzU5Miw0OCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCB2b2lkICpuZXd0X19zeW1ib2xfdHJlZV9nZXRfY3VycmVudChuZXd0Q29tcG9uZW50IHNlbGYpCi17Ci0JaWYgKHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pCi0JCXJldHVybiBuZXd0Q2hlY2tib3hUcmVlR2V0Q3VycmVudChzZWxmKTsKLQlyZXR1cm4gbmV3dExpc3Rib3hHZXRDdXJyZW50KHNlbGYpOwotfQotCi1zdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3NlbGVjdGlvbihuZXd0Q29tcG9uZW50IHNlbGYsIHZvaWQgKmRhdGEpCi17Ci0JY29uc3Qgc3RydWN0IG1hcF9zeW1ib2wgKipzeW1ib2xfcHRyID0gZGF0YTsKLQkqc3ltYm9sX3B0ciA9IG5ld3RfX3N5bWJvbF90cmVlX2dldF9jdXJyZW50KHNlbGYpOwotfQotCiBzdHJ1Y3QgaGlzdF9icm93c2VyIHsKLQluZXd0Q29tcG9uZW50CQlmb3JtLCB0cmVlOwotCWNvbnN0IHN0cnVjdCBtYXBfc3ltYm9sICpzZWxlY3Rpb247CisJc3RydWN0IHVpX2Jyb3dzZXIgICBiOworCXN0cnVjdCBoaXN0cwkgICAgKmhpc3RzOworCXN0cnVjdCBoaXN0X2VudHJ5ICAgKmhlX3NlbGVjdGlvbjsKKwlzdHJ1Y3QgbWFwX3N5bWJvbCAgICpzZWxlY3Rpb247CiB9OwogCi1zdGF0aWMgc3RydWN0IGhpc3RfYnJvd3NlciAqaGlzdF9icm93c2VyX19uZXcodm9pZCkKLXsKLQlzdHJ1Y3QgaGlzdF9icm93c2VyICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworc3RhdGljIHZvaWQgaGlzdF9icm93c2VyX19yZXNldChzdHJ1Y3QgaGlzdF9icm93c2VyICpzZWxmKTsKK3N0YXRpYyBpbnQgaGlzdF9icm93c2VyX19ydW4oc3RydWN0IGhpc3RfYnJvd3NlciAqc2VsZiwgY29uc3QgY2hhciAqdGl0bGUsCisJCQkgICAgIHN0cnVjdCBuZXd0RXhpdFN0cnVjdCAqZXMpOworc3RhdGljIHVuc2lnbmVkIGludCBoaXN0X2Jyb3dzZXJfX3JlZnJlc2hfZW50cmllcyhzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZik7CitzdGF0aWMgdm9pZCB1aV9icm93c2VyX19oaXN0c19zZWVrKHN0cnVjdCB1aV9icm93c2VyICpzZWxmLAorCQkJCSAgIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7CiAKLQlpZiAoc2VsZiAhPSBOVUxMKQotCQlzZWxmLT5mb3JtID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgaGlzdF9icm93c2VyICpoaXN0X2Jyb3dzZXJfX25ldyhzdHJ1Y3QgaGlzdHMgKmhpc3RzKQoreworCXN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYgPSB6YWxsb2Moc2l6ZW9mKCpzZWxmKSk7CisKKwlpZiAoc2VsZikgeworCQlzZWxmLT5oaXN0cyA9IGhpc3RzOworCQlzZWxmLT5iLnJlZnJlc2hfZW50cmllcyA9IGhpc3RfYnJvd3Nlcl9fcmVmcmVzaF9lbnRyaWVzOworCQlzZWxmLT5iLnNlZWsgPSB1aV9icm93c2VyX19oaXN0c19zZWVrOworCX0KIAogCXJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX2RlbGV0ZShzdHJ1Y3QgaGlzdF9icm93c2VyICpzZWxmKQogewotCW5ld3RGb3JtRGVzdHJveShzZWxmLT5mb3JtKTsKKwluZXd0Rm9ybURlc3Ryb3koc2VsZi0+Yi5mb3JtKTsKIAluZXd0UG9wV2luZG93KCk7CiAJZnJlZShzZWxmKTsKIH0KIAotc3RhdGljIGludCBoaXN0X2Jyb3dzZXJfX3BvcHVsYXRlKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYsIHN0cnVjdCBoaXN0cyAqaGlzdHMsCi0JCQkJICBjb25zdCBjaGFyICp0aXRsZSkKLXsKLQlpbnQgbWF4X2xlbiA9IDAsIGlkeCwgY29scywgcm93czsKLQlzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnByb2dyZXNzOwotCXN0cnVjdCByYl9ub2RlICpuZDsKLQl1NjQgY3Vycl9oaXN0ID0gMDsKLQljaGFyIHNlcVtdID0gIi4iLCB1bml0OwotCWNoYXIgc3RyWzI1Nl07Ci0JdW5zaWduZWQgbG9uZyBucl9ldmVudHMgPSBoaXN0cy0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX1NBTVBMRV07Ci0KLQlpZiAoc2VsZi0+Zm9ybSkgewotCQluZXd0Rm9ybURlc3Ryb3koc2VsZi0+Zm9ybSk7Ci0JCW5ld3RQb3BXaW5kb3coKTsKLQl9Ci0KLQlucl9ldmVudHMgPSBjb252ZXJ0X3VuaXQobnJfZXZlbnRzLCAmdW5pdCk7Ci0Jc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIkV2ZW50czogJWx1JWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKLQkJIG5yX2V2ZW50cywgdW5pdCk7Ci0JbmV3dERyYXdSb290VGV4dCgwLCAwLCBzdHIpOwotCi0JbmV3dEdldFNjcmVlblNpemUoTlVMTCwgJnJvd3MpOwotCi0JaWYgKHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pCi0JCXNlbGYtPnRyZWUgPSBuZXd0Q2hlY2tib3hUcmVlTXVsdGkoMCwgMCwgcm93cyAtIDUsIHNlcSwKLQkJCQkJCSAgIE5FV1RfRkxBR19TQ1JPTEwpOwotCWVsc2UKLQkJc2VsZi0+dHJlZSA9IG5ld3RMaXN0Ym94KDAsIDAsIHJvd3MgLSA1LAotCQkJCQkoTkVXVF9GTEFHX1NDUk9MTCB8Ci0JCQkJCSBORVdUX0ZMQUdfUkVUVVJORVhJVCkpOwotCi0JbmV3dENvbXBvbmVudEFkZENhbGxiYWNrKHNlbGYtPnRyZWUsIGhpc3RfYnJvd3Nlcl9fc2VsZWN0aW9uLAotCQkJCSAmc2VsZi0+c2VsZWN0aW9uKTsKLQotCXByb2dyZXNzID0gdWlfcHJvZ3Jlc3NfX25ldygiQWRkaW5nIGVudHJpZXMgdG8gdGhlIGJyb3dzZXIuLi4iLAotCQkJCSAgICBoaXN0cy0+bnJfZW50cmllcyk7Ci0JaWYgKHByb2dyZXNzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCWlkeCA9IDA7Ci0JZm9yIChuZCA9IHJiX2ZpcnN0KCZoaXN0cy0+ZW50cmllcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7Ci0JCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKLQkJaW50IGxlbjsKLQotCQlpZiAoaC0+ZmlsdGVyZWQpCi0JCQljb250aW51ZTsKLQotCQlsZW4gPSBoaXN0X2VudHJ5X19hcHBlbmRfYnJvd3NlcihoLCBzZWxmLT50cmVlLCBoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kKTsKLQkJaWYgKGxlbiA+IG1heF9sZW4pCi0JCQltYXhfbGVuID0gbGVuOwotCQlpZiAoc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKLQkJCWhpc3RfZW50cnlfX2FwcGVuZF9jYWxsY2hhaW5fYnJvd3NlcihoLCBzZWxmLT50cmVlLAotCQkJCQkJCSAgICAgaGlzdHMtPnN0YXRzLnRvdGFsX3BlcmlvZCwgaWR4KyspOwotCQkrK2N1cnJfaGlzdDsKLQkJaWYgKGN1cnJfaGlzdCAlIDUpCi0JCQl1aV9wcm9ncmVzc19fdXBkYXRlKHByb2dyZXNzLCBjdXJyX2hpc3QpOwotCX0KLQotCXVpX3Byb2dyZXNzX19kZWxldGUocHJvZ3Jlc3MpOwotCi0JbmV3dEdldFNjcmVlblNpemUoJmNvbHMsICZyb3dzKTsKLQotCWlmIChtYXhfbGVuID4gY29scykKLQkJbWF4X2xlbiA9IGNvbHMgLSAzOwotCi0JaWYgKCFzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKQotCQluZXd0TGlzdGJveFNldFdpZHRoKHNlbGYtPnRyZWUsIG1heF9sZW4pOwotCi0JbmV3dENlbnRlcmVkV2luZG93KG1heF9sZW4gKyAoc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbiA/IDUgOiAwKSwKLQkJCSAgIHJvd3MgLSA1LCB0aXRsZSk7Ci0Jc2VsZi0+Zm9ybSA9IG5ld3RfZm9ybV9fbmV3KCk7Ci0JaWYgKHNlbGYtPmZvcm0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgJ0EnKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCAnYScpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sICdEJyk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgJ2QnKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCAnVCcpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sICd0Jyk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgJz8nKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCAnSCcpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sICdoJyk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Zm9ybSwgTkVXVF9LRVlfRjEpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sIE5FV1RfS0VZX1JJR0hUKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5mb3JtLCBORVdUX0tFWV9UQUIpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmZvcm0sIE5FV1RfS0VZX1VOVEFCKTsKLQluZXd0Rm9ybUFkZENvbXBvbmVudHMoc2VsZi0+Zm9ybSwgc2VsZi0+dHJlZSwgTlVMTCk7Ci0Jc2VsZi0+c2VsZWN0aW9uID0gbmV3dF9fc3ltYm9sX3RyZWVfZ2V0X2N1cnJlbnQoc2VsZi0+dHJlZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBoaXN0X2VudHJ5ICpoaXN0X2Jyb3dzZXJfX3NlbGVjdGVkX2VudHJ5KHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYpCiB7Ci0JaW50ICppbmRleGVzOwotCi0JaWYgKCFzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKQotCQlnb3RvIG91dDsKLQotCWluZGV4ZXMgPSBuZXd0Q2hlY2tib3hUcmVlRmluZEl0ZW0oc2VsZi0+dHJlZSwgKHZvaWQgKilzZWxmLT5zZWxlY3Rpb24pOwotCWlmIChpbmRleGVzKSB7Ci0JCWJvb2wgaXNfaGlzdF9lbnRyeSA9IGluZGV4ZXNbMV0gPT0gTkVXVF9BUkdfTEFTVDsKLQkJZnJlZShpbmRleGVzKTsKLQkJaWYgKGlzX2hpc3RfZW50cnkpCi0JCQlnb3RvIG91dDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci1vdXQ6Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihzZWxmLT5zZWxlY3Rpb24sIHN0cnVjdCBoaXN0X2VudHJ5LCBtcyk7CisJcmV0dXJuIHNlbGYtPmhlX3NlbGVjdGlvbjsKIH0KIAogc3RhdGljIHN0cnVjdCB0aHJlYWQgKmhpc3RfYnJvd3Nlcl9fc2VsZWN0ZWRfdGhyZWFkKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYpCiB7Ci0Jc3RydWN0IGhpc3RfZW50cnkgKmhlID0gaGlzdF9icm93c2VyX19zZWxlY3RlZF9lbnRyeShzZWxmKTsKLQlyZXR1cm4gaGUgPyBoZS0+dGhyZWFkIDogTlVMTDsKKwlyZXR1cm4gc2VsZi0+aGVfc2VsZWN0aW9uLT50aHJlYWQ7CiB9CiAKIHN0YXRpYyBpbnQgaGlzdF9icm93c2VyX190aXRsZShjaGFyICpiZiwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmV2X25hbWUsCkBAIC05MDUsNyArNjU1LDcgQEAKIAogaW50IGhpc3RzX19icm93c2Uoc3RydWN0IGhpc3RzICpzZWxmLCBjb25zdCBjaGFyICpoZWxwbGluZSwgY29uc3QgY2hhciAqZXZfbmFtZSkKIHsKLQlzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyID0gaGlzdF9icm93c2VyX19uZXcoKTsKKwlzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyID0gaGlzdF9icm93c2VyX19uZXcoc2VsZik7CiAJc3RydWN0IHBzdGFjayAqZnN0YWNrOwogCWNvbnN0IHN0cnVjdCB0aHJlYWQgKnRocmVhZF9maWx0ZXIgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBkc28gKmRzb19maWx0ZXIgPSBOVUxMOwpAQCAtOTI0LDggKzY3NCw2IEBACiAKIAloaXN0X2Jyb3dzZXJfX3RpdGxlKG1zZywgc2l6ZW9mKG1zZyksIGV2X25hbWUsCiAJCQkgICAgZHNvX2ZpbHRlciwgdGhyZWFkX2ZpbHRlcik7Ci0JaWYgKGhpc3RfYnJvd3Nlcl9fcG9wdWxhdGUoYnJvd3Nlciwgc2VsZiwgbXNnKSA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfc3RhY2s7CiAKIAl3aGlsZSAoMSkgewogCQljb25zdCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CkBAIC05MzQsNyArNjgyLDggQEAKIAkJaW50IG5yX29wdGlvbnMgPSAwLCBjaG9pY2UgPSAwLCBpLAogCQkgICAgYW5ub3RhdGUgPSAtMiwgem9vbV9kc28gPSAtMiwgem9vbV90aHJlYWQgPSAtMjsKIAotCQluZXd0Rm9ybVJ1bihicm93c2VyLT5mb3JtLCAmZXMpOworCQlpZiAoaGlzdF9icm93c2VyX19ydW4oYnJvd3NlciwgbXNnLCAmZXMpKQorCQkJYnJlYWs7CiAKIAkJdGhyZWFkID0gaGlzdF9icm93c2VyX19zZWxlY3RlZF90aHJlYWQoYnJvd3Nlcik7CiAJCWRzbyA9IGJyb3dzZXItPnNlbGVjdGlvbi0+bWFwID8gYnJvd3Nlci0+c2VsZWN0aW9uLT5tYXAtPmRzbyA6IE5VTEw7CkBAIC0xMDY5LDggKzgxOCw3IEBACiAJCQloaXN0c19fZmlsdGVyX2J5X2RzbyhzZWxmLCBkc29fZmlsdGVyKTsKIAkJCWhpc3RfYnJvd3Nlcl9fdGl0bGUobXNnLCBzaXplb2YobXNnKSwgZXZfbmFtZSwKIAkJCQkJICAgIGRzb19maWx0ZXIsIHRocmVhZF9maWx0ZXIpOwotCQkJaWYgKGhpc3RfYnJvd3Nlcl9fcG9wdWxhdGUoYnJvd3Nlciwgc2VsZiwgbXNnKSA8IDApCi0JCQkJZ290byBvdXQ7CisJCQloaXN0X2Jyb3dzZXJfX3Jlc2V0KGJyb3dzZXIpOwogCQl9IGVsc2UgaWYgKGNob2ljZSA9PSB6b29tX3RocmVhZCkgewogem9vbV90aHJlYWQ6CiAJCQlpZiAodGhyZWFkX2ZpbHRlcikgewpAQCAtMTA4OCw4ICs4MzYsNyBAQAogCQkJaGlzdHNfX2ZpbHRlcl9ieV90aHJlYWQoc2VsZiwgdGhyZWFkX2ZpbHRlcik7CiAJCQloaXN0X2Jyb3dzZXJfX3RpdGxlKG1zZywgc2l6ZW9mKG1zZyksIGV2X25hbWUsCiAJCQkJCSAgICBkc29fZmlsdGVyLCB0aHJlYWRfZmlsdGVyKTsKLQkJCWlmIChoaXN0X2Jyb3dzZXJfX3BvcHVsYXRlKGJyb3dzZXIsIHNlbGYsIG1zZykgPCAwKQotCQkJCWdvdG8gb3V0OworCQkJaGlzdF9icm93c2VyX19yZXNldChicm93c2VyKTsKIAkJfQogCX0KIG91dF9mcmVlX3N0YWNrOgpAQCAtMTE0NSw2ICs4OTIsMTMgQEAKIAkiYmx1ZSIsCSAgICAgImxpZ2h0Z3JheSIsCiB9OwogCitzdGF0aWMgdm9pZCBuZXd0X3N1c3BlbmQodm9pZCAqZCBfX3VzZWQpCit7CisJbmV3dFN1c3BlbmQoKTsKKwlyYWlzZShTSUdUU1RQKTsKKwluZXd0UmVzdW1lKCk7Cit9CisKIHZvaWQgc2V0dXBfYnJvd3Nlcih2b2lkKQogewogCXN0cnVjdCBuZXd0UGVyY2VudFRyZWVDb2xvcnMgKmMgPSAmZGVmYXVsdFBlcmNlbnRUcmVlQ29sb3JzOwpAQCAtMTE1OCw2ICs5MTIsNyBAQAogCXVzZV9icm93c2VyID0gMTsKIAluZXd0SW5pdCgpOwogCW5ld3RDbHMoKTsKKwluZXd0U2V0U3VzcGVuZENhbGxiYWNrKG5ld3Rfc3VzcGVuZCwgTlVMTCk7CiAJdWlfaGVscGxpbmVfX3B1dHMoIiAiKTsKIAlzbHR0X3NldF9jb2xvcihIRV9DT0xPUlNFVF9UT1AsIE5VTEwsIGMtPnRvcENvbG9yRmcsIGMtPnRvcENvbG9yQmcpOwogCXNsdHRfc2V0X2NvbG9yKEhFX0NPTE9SU0VUX01FRElVTSwgTlVMTCwgYy0+bWVkaXVtQ29sb3JGZywgYy0+bWVkaXVtQ29sb3JCZyk7CkBAIC0xMTc2LDMgKzkzMSw2MzggQEAKIAkJbmV3dEZpbmlzaGVkKCk7CiAJfQogfQorCitzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3JlZnJlc2hfZGltZW5zaW9ucyhzdHJ1Y3QgaGlzdF9icm93c2VyICpzZWxmKQoreworCS8qIDMgPT0gKy8tIHRvZ2dsZSBzeW1ib2wgYmVmb3JlIGFjdHVhbCBoaXN0X2VudHJ5IHJlbmRlcmluZyAqLworCXNlbGYtPmIud2lkdGggPSAzICsgKGhpc3RzX19zb3J0X2xpc3Rfd2lkdGgoc2VsZi0+aGlzdHMpICsKKwkJCSAgICAgc2l6ZW9mKCJba10iKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhpc3RfYnJvd3Nlcl9fcmVzZXQoc3RydWN0IGhpc3RfYnJvd3NlciAqc2VsZikKK3sKKwlzZWxmLT5iLm5yX2VudHJpZXMgPSBzZWxmLT5oaXN0cy0+bnJfZW50cmllczsKKwloaXN0X2Jyb3dzZXJfX3JlZnJlc2hfZGltZW5zaW9ucyhzZWxmKTsKKwl1aV9icm93c2VyX19yZXNldF9pbmRleCgmc2VsZi0+Yik7Cit9CisKK3N0YXRpYyBjaGFyIHRyZWVfX2ZvbGRlZF9zaWduKGJvb2wgdW5mb2xkZWQpCit7CisJcmV0dXJuIHVuZm9sZGVkID8gJy0nIDogJysnOworfQorCitzdGF0aWMgY2hhciBtYXBfc3ltYm9sX19mb2xkZWQoY29uc3Qgc3RydWN0IG1hcF9zeW1ib2wgKnNlbGYpCit7CisJcmV0dXJuIHNlbGYtPmhhc19jaGlsZHJlbiA/IHRyZWVfX2ZvbGRlZF9zaWduKHNlbGYtPnVuZm9sZGVkKSA6ICcgJzsKK30KKworc3RhdGljIGNoYXIgaGlzdF9lbnRyeV9fZm9sZGVkKGNvbnN0IHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmKQoreworCXJldHVybiBtYXBfc3ltYm9sX19mb2xkZWQoJnNlbGYtPm1zKTsKK30KKworc3RhdGljIGNoYXIgY2FsbGNoYWluX2xpc3RfX2ZvbGRlZChjb25zdCBzdHJ1Y3QgY2FsbGNoYWluX2xpc3QgKnNlbGYpCit7CisJcmV0dXJuIG1hcF9zeW1ib2xfX2ZvbGRlZCgmc2VsZi0+bXMpOworfQorCitzdGF0aWMgYm9vbCBtYXBfc3ltYm9sX190b2dnbGVfZm9sZChzdHJ1Y3QgbWFwX3N5bWJvbCAqc2VsZikKK3sKKwlpZiAoIXNlbGYtPmhhc19jaGlsZHJlbikKKwkJcmV0dXJuIGZhbHNlOworCisJc2VsZi0+dW5mb2xkZWQgPSAhc2VsZi0+dW5mb2xkZWQ7CisJcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgTEVWRUxfT0ZGU0VUX1NURVAgMworCitzdGF0aWMgaW50IGhpc3RfYnJvd3Nlcl9fc2hvd19jYWxsY2hhaW5fbm9kZV9yYl90cmVlKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYsCisJCQkJCQkgICAgIHN0cnVjdCBjYWxsY2hhaW5fbm9kZSAqY2hhaW5fbm9kZSwKKwkJCQkJCSAgICAgdTY0IHRvdGFsLCBpbnQgbGV2ZWwsCisJCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHJvdywKKwkJCQkJCSAgICAgb2ZmX3QgKnJvd19vZmZzZXQsCisJCQkJCQkgICAgIGJvb2wgKmlzX2N1cnJlbnRfZW50cnkpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJaW50IGZpcnN0X3JvdyA9IHJvdywgd2lkdGgsIG9mZnNldCA9IGxldmVsICogTEVWRUxfT0ZGU0VUX1NURVA7CisJdTY0IG5ld190b3RhbCwgcmVtYWluaW5nOworCisJaWYgKGNhbGxjaGFpbl9wYXJhbS5tb2RlID09IENIQUlOX0dSQVBIX1JFTCkKKwkJbmV3X3RvdGFsID0gY2hhaW5fbm9kZS0+Y2hpbGRyZW5faGl0OworCWVsc2UKKwkJbmV3X3RvdGFsID0gdG90YWw7CisKKwlyZW1haW5pbmcgPSBuZXdfdG90YWw7CisJbm9kZSA9IHJiX2ZpcnN0KCZjaGFpbl9ub2RlLT5yYl9yb290KTsKKwl3aGlsZSAobm9kZSkgeworCQlzdHJ1Y3QgY2FsbGNoYWluX25vZGUgKmNoaWxkID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGNhbGxjaGFpbl9ub2RlLCByYl9ub2RlKTsKKwkJc3RydWN0IHJiX25vZGUgKm5leHQgPSByYl9uZXh0KG5vZGUpOworCQl1NjQgY3VtdWwgPSBjdW11bF9oaXRzKGNoaWxkKTsKKwkJc3RydWN0IGNhbGxjaGFpbl9saXN0ICpjaGFpbjsKKwkJY2hhciBmb2xkZWRfc2lnbiA9ICcgJzsKKwkJaW50IGZpcnN0ID0gdHJ1ZTsKKwkJaW50IGV4dHJhX29mZnNldCA9IDA7CisKKwkJcmVtYWluaW5nIC09IGN1bXVsOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhaW4sICZjaGlsZC0+dmFsLCBsaXN0KSB7CisJCQljaGFyIGlwc3RyW0JJVFNfUEVSX0xPTkcgLyA0ICsgMV0sICphbGxvY19zdHI7CisJCQljb25zdCBjaGFyICpzdHI7CisJCQlpbnQgY29sb3I7CisJCQlib29sIHdhc19maXJzdCA9IGZpcnN0OworCisJCQlpZiAoZmlyc3QpIHsKKwkJCQlmaXJzdCA9IGZhbHNlOworCQkJCWNoYWluLT5tcy5oYXNfY2hpbGRyZW4gPSBjaGFpbi0+bGlzdC5uZXh0ICE9ICZjaGlsZC0+dmFsIHx8CisJCQkJCQkJIHJiX2ZpcnN0KCZjaGlsZC0+cmJfcm9vdCkgIT0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJZXh0cmFfb2Zmc2V0ID0gTEVWRUxfT0ZGU0VUX1NURVA7CisJCQkJY2hhaW4tPm1zLmhhc19jaGlsZHJlbiA9IGNoYWluLT5saXN0Lm5leHQgPT0gJmNoaWxkLT52YWwgJiYKKwkJCQkJCQkgcmJfZmlyc3QoJmNoaWxkLT5yYl9yb290KSAhPSBOVUxMOworCQkJfQorCisJCQlmb2xkZWRfc2lnbiA9IGNhbGxjaGFpbl9saXN0X19mb2xkZWQoY2hhaW4pOworCQkJaWYgKCpyb3dfb2Zmc2V0ICE9IDApIHsKKwkJCQktLSpyb3dfb2Zmc2V0OworCQkJCWdvdG8gZG9fbmV4dDsKKwkJCX0KKworCQkJYWxsb2Nfc3RyID0gTlVMTDsKKwkJCXN0ciA9IGNhbGxjaGFpbl9saXN0X19zeW1fbmFtZShjaGFpbiwgaXBzdHIsIHNpemVvZihpcHN0cikpOworCQkJaWYgKHdhc19maXJzdCkgeworCQkJCWRvdWJsZSBwZXJjZW50ID0gY3VtdWwgKiAxMDAuMCAvIG5ld190b3RhbDsKKworCQkJCWlmIChhc3ByaW50ZigmYWxsb2Nfc3RyLCAiJTIuMmYlJSAlcyIsIHBlcmNlbnQsIHN0cikgPCAwKQorCQkJCQlzdHIgPSAiTm90IGVub3VnaCBtZW1vcnkhIjsKKwkJCQllbHNlCisJCQkJCXN0ciA9IGFsbG9jX3N0cjsKKwkJCX0KKworCQkJY29sb3IgPSBIRV9DT0xPUlNFVF9OT1JNQUw7CisJCQl3aWR0aCA9IHNlbGYtPmIud2lkdGggLSAob2Zmc2V0ICsgZXh0cmFfb2Zmc2V0ICsgMik7CisJCQlpZiAodWlfYnJvd3Nlcl9faXNfY3VycmVudF9lbnRyeSgmc2VsZi0+Yiwgcm93KSkgeworCQkJCXNlbGYtPnNlbGVjdGlvbiA9ICZjaGFpbi0+bXM7CisJCQkJY29sb3IgPSBIRV9DT0xPUlNFVF9TRUxFQ1RFRDsKKwkJCQkqaXNfY3VycmVudF9lbnRyeSA9IHRydWU7CisJCQl9CisKKwkJCVNMc21nX3NldF9jb2xvcihjb2xvcik7CisJCQlTTHNtZ19nb3RvcmMoc2VsZi0+Yi50b3AgKyByb3csIHNlbGYtPmIubGVmdCk7CisJCQlzbHNtZ193cml0ZV9uc3RyaW5nKCIgIiwgb2Zmc2V0ICsgZXh0cmFfb2Zmc2V0KTsKKwkJCXNsc21nX3ByaW50ZigiJWMgIiwgZm9sZGVkX3NpZ24pOworCQkJc2xzbWdfd3JpdGVfbnN0cmluZyhzdHIsIHdpZHRoKTsKKwkJCWZyZWUoYWxsb2Nfc3RyKTsKKworCQkJaWYgKCsrcm93ID09IHNlbGYtPmIuaGVpZ2h0KQorCQkJCWdvdG8gb3V0OworZG9fbmV4dDoKKwkJCWlmIChmb2xkZWRfc2lnbiA9PSAnKycpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZm9sZGVkX3NpZ24gPT0gJy0nKSB7CisJCQljb25zdCBpbnQgbmV3X2xldmVsID0gbGV2ZWwgKyAoZXh0cmFfb2Zmc2V0ID8gMiA6IDEpOworCQkJcm93ICs9IGhpc3RfYnJvd3Nlcl9fc2hvd19jYWxsY2hhaW5fbm9kZV9yYl90cmVlKHNlbGYsIGNoaWxkLCBuZXdfdG90YWwsCisJCQkJCQkJCQkgbmV3X2xldmVsLCByb3csIHJvd19vZmZzZXQsCisJCQkJCQkJCQkgaXNfY3VycmVudF9lbnRyeSk7CisJCX0KKwkJaWYgKHJvdyA9PSBzZWxmLT5iLmhlaWdodCkKKwkJCWdvdG8gb3V0OworCQlub2RlID0gbmV4dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJvdyAtIGZpcnN0X3JvdzsKK30KKworc3RhdGljIGludCBoaXN0X2Jyb3dzZXJfX3Nob3dfY2FsbGNoYWluX25vZGUoc3RydWN0IGhpc3RfYnJvd3NlciAqc2VsZiwKKwkJCQkJICAgICBzdHJ1Y3QgY2FsbGNoYWluX25vZGUgKm5vZGUsCisJCQkJCSAgICAgaW50IGxldmVsLCB1bnNpZ25lZCBzaG9ydCByb3csCisJCQkJCSAgICAgb2ZmX3QgKnJvd19vZmZzZXQsCisJCQkJCSAgICAgYm9vbCAqaXNfY3VycmVudF9lbnRyeSkKK3sKKwlzdHJ1Y3QgY2FsbGNoYWluX2xpc3QgKmNoYWluOworCWludCBmaXJzdF9yb3cgPSByb3csCisJICAgICBvZmZzZXQgPSBsZXZlbCAqIExFVkVMX09GRlNFVF9TVEVQLAorCSAgICAgd2lkdGggPSBzZWxmLT5iLndpZHRoIC0gb2Zmc2V0OworCWNoYXIgZm9sZGVkX3NpZ24gPSAnICc7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYWluLCAmbm9kZS0+dmFsLCBsaXN0KSB7CisJCWNoYXIgaXBzdHJbQklUU19QRVJfTE9ORyAvIDQgKyAxXSwgKnM7CisJCWludCBjb2xvcjsKKwkJLyoKKwkJICogRklYTUU6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHNvbWV3aGVyZSBlbHNlLAorCQkgKiBwcm9iYWJseSB3aGVuIHRoZSBjYWxsY2hhaW4gaXMgY3JlYXRlZCwgc28gYXMgbm90IHRvCisJCSAqIHRyYXZlcnNlIGl0IGFsbCBvdmVyIGFnYWluCisJCSAqLworCQljaGFpbi0+bXMuaGFzX2NoaWxkcmVuID0gcmJfZmlyc3QoJm5vZGUtPnJiX3Jvb3QpICE9IE5VTEw7CisJCWZvbGRlZF9zaWduID0gY2FsbGNoYWluX2xpc3RfX2ZvbGRlZChjaGFpbik7CisKKwkJaWYgKCpyb3dfb2Zmc2V0ICE9IDApIHsKKwkJCS0tKnJvd19vZmZzZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNvbG9yID0gSEVfQ09MT1JTRVRfTk9STUFMOworCQlpZiAodWlfYnJvd3Nlcl9faXNfY3VycmVudF9lbnRyeSgmc2VsZi0+Yiwgcm93KSkgeworCQkJc2VsZi0+c2VsZWN0aW9uID0gJmNoYWluLT5tczsKKwkJCWNvbG9yID0gSEVfQ09MT1JTRVRfU0VMRUNURUQ7CisJCQkqaXNfY3VycmVudF9lbnRyeSA9IHRydWU7CisJCX0KKworCQlzID0gY2FsbGNoYWluX2xpc3RfX3N5bV9uYW1lKGNoYWluLCBpcHN0ciwgc2l6ZW9mKGlwc3RyKSk7CisJCVNMc21nX2dvdG9yYyhzZWxmLT5iLnRvcCArIHJvdywgc2VsZi0+Yi5sZWZ0KTsKKwkJU0xzbWdfc2V0X2NvbG9yKGNvbG9yKTsKKwkJc2xzbWdfd3JpdGVfbnN0cmluZygiICIsIG9mZnNldCk7CisJCXNsc21nX3ByaW50ZigiJWMgIiwgZm9sZGVkX3NpZ24pOworCQlzbHNtZ193cml0ZV9uc3RyaW5nKHMsIHdpZHRoIC0gMik7CisKKwkJaWYgKCsrcm93ID09IHNlbGYtPmIuaGVpZ2h0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGZvbGRlZF9zaWduID09ICctJykKKwkJcm93ICs9IGhpc3RfYnJvd3Nlcl9fc2hvd19jYWxsY2hhaW5fbm9kZV9yYl90cmVlKHNlbGYsIG5vZGUsCisJCQkJCQkJCSBzZWxmLT5oaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kLAorCQkJCQkJCQkgbGV2ZWwgKyAxLCByb3csCisJCQkJCQkJCSByb3dfb2Zmc2V0LAorCQkJCQkJCQkgaXNfY3VycmVudF9lbnRyeSk7CitvdXQ6CisJcmV0dXJuIHJvdyAtIGZpcnN0X3JvdzsKK30KKworc3RhdGljIGludCBoaXN0X2Jyb3dzZXJfX3Nob3dfY2FsbGNoYWluKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYsCisJCQkJCXN0cnVjdCByYl9yb290ICpjaGFpbiwKKwkJCQkJaW50IGxldmVsLCB1bnNpZ25lZCBzaG9ydCByb3csCisJCQkJCW9mZl90ICpyb3dfb2Zmc2V0LAorCQkJCQlib29sICppc19jdXJyZW50X2VudHJ5KQoreworCXN0cnVjdCByYl9ub2RlICpuZDsKKwlpbnQgZmlyc3Rfcm93ID0gcm93OworCisJZm9yIChuZCA9IHJiX2ZpcnN0KGNoYWluKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IGNhbGxjaGFpbl9ub2RlICpub2RlID0gcmJfZW50cnkobmQsIHN0cnVjdCBjYWxsY2hhaW5fbm9kZSwgcmJfbm9kZSk7CisKKwkJcm93ICs9IGhpc3RfYnJvd3Nlcl9fc2hvd19jYWxsY2hhaW5fbm9kZShzZWxmLCBub2RlLCBsZXZlbCwKKwkJCQkJCQkgcm93LCByb3dfb2Zmc2V0LAorCQkJCQkJCSBpc19jdXJyZW50X2VudHJ5KTsKKwkJaWYgKHJvdyA9PSBzZWxmLT5iLmhlaWdodCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByb3cgLSBmaXJzdF9yb3c7Cit9CisKK3N0YXRpYyBpbnQgaGlzdF9icm93c2VyX19zaG93X2VudHJ5KHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYsCisJCQkJICAgIHN0cnVjdCBoaXN0X2VudHJ5ICplbnRyeSwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgcm93KQoreworCWNoYXIgc1syNTZdOworCWRvdWJsZSBwZXJjZW50OworCWludCBwcmludGVkID0gMDsKKwlpbnQgY29sb3IsIHdpZHRoID0gc2VsZi0+Yi53aWR0aDsKKwljaGFyIGZvbGRlZF9zaWduID0gJyAnOworCWJvb2wgY3VycmVudF9lbnRyeSA9IHVpX2Jyb3dzZXJfX2lzX2N1cnJlbnRfZW50cnkoJnNlbGYtPmIsIHJvdyk7CisJb2ZmX3Qgcm93X29mZnNldCA9IGVudHJ5LT5yb3dfb2Zmc2V0OworCisJaWYgKGN1cnJlbnRfZW50cnkpIHsKKwkJc2VsZi0+aGVfc2VsZWN0aW9uID0gZW50cnk7CisJCXNlbGYtPnNlbGVjdGlvbiA9ICZlbnRyeS0+bXM7CisJfQorCisJaWYgKHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pIHsKKwkJZW50cnktPm1zLmhhc19jaGlsZHJlbiA9ICFSQl9FTVBUWV9ST09UKCZlbnRyeS0+c29ydGVkX2NoYWluKTsKKwkJZm9sZGVkX3NpZ24gPSBoaXN0X2VudHJ5X19mb2xkZWQoZW50cnkpOworCX0KKworCWlmIChyb3dfb2Zmc2V0ID09IDApIHsKKwkJaGlzdF9lbnRyeV9fc25wcmludGYoZW50cnksIHMsIHNpemVvZihzKSwgc2VsZi0+aGlzdHMsIE5VTEwsIGZhbHNlLAorCQkJCSAgICAgMCwgZmFsc2UsIHNlbGYtPmhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2QpOworCQlwZXJjZW50ID0gKGVudHJ5LT5wZXJpb2QgKiAxMDAuMCkgLyBzZWxmLT5oaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOworCisJCWNvbG9yID0gSEVfQ09MT1JTRVRfU0VMRUNURUQ7CisJCWlmICghY3VycmVudF9lbnRyeSkgeworCQkJaWYgKHBlcmNlbnQgPj0gTUlOX1JFRCkKKwkJCQljb2xvciA9IEhFX0NPTE9SU0VUX1RPUDsKKwkJCWVsc2UgaWYgKHBlcmNlbnQgPj0gTUlOX0dSRUVOKQorCQkJCWNvbG9yID0gSEVfQ09MT1JTRVRfTUVESVVNOworCQkJZWxzZQorCQkJCWNvbG9yID0gSEVfQ09MT1JTRVRfTk9STUFMOworCQl9CisKKwkJU0xzbWdfc2V0X2NvbG9yKGNvbG9yKTsKKwkJU0xzbWdfZ290b3JjKHNlbGYtPmIudG9wICsgcm93LCBzZWxmLT5iLmxlZnQpOworCQlpZiAoc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgeworCQkJc2xzbWdfcHJpbnRmKCIlYyAiLCBmb2xkZWRfc2lnbik7CisJCQl3aWR0aCAtPSAyOworCQl9CisJCXNsc21nX3dyaXRlX25zdHJpbmcocywgd2lkdGgpOworCQkrK3JvdzsKKwkJKytwcmludGVkOworCX0gZWxzZQorCQktLXJvd19vZmZzZXQ7CisKKwlpZiAoZm9sZGVkX3NpZ24gPT0gJy0nICYmIHJvdyAhPSBzZWxmLT5iLmhlaWdodCkgeworCQlwcmludGVkICs9IGhpc3RfYnJvd3Nlcl9fc2hvd19jYWxsY2hhaW4oc2VsZiwgJmVudHJ5LT5zb3J0ZWRfY2hhaW4sCisJCQkJCQkJMSwgcm93LCAmcm93X29mZnNldCwKKwkJCQkJCQkmY3VycmVudF9lbnRyeSk7CisJCWlmIChjdXJyZW50X2VudHJ5KQorCQkJc2VsZi0+aGVfc2VsZWN0aW9uID0gZW50cnk7CisJfQorCisJcmV0dXJuIHByaW50ZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGlzdF9icm93c2VyX19yZWZyZXNoX2VudHJpZXMoc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYpCit7CisJdW5zaWduZWQgcm93ID0gMDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJc3RydWN0IGhpc3RfYnJvd3NlciAqaGIgPSBjb250YWluZXJfb2Yoc2VsZiwgc3RydWN0IGhpc3RfYnJvd3NlciwgYik7CisKKwlpZiAoc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9PSBOVUxMKQorCQlzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5ID0gcmJfZmlyc3QoJmhiLT5oaXN0cy0+ZW50cmllcyk7CisKKwlmb3IgKG5kID0gc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IGhpc3RfZW50cnkgKmggPSByYl9lbnRyeShuZCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCisJCWlmIChoLT5maWx0ZXJlZCkKKwkJCWNvbnRpbnVlOworCisJCXJvdyArPSBoaXN0X2Jyb3dzZXJfX3Nob3dfZW50cnkoaGIsIGgsIHJvdyk7CisJCWlmIChyb3cgPT0gc2VsZi0+aGVpZ2h0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJvdzsKK30KKworc3RhdGljIHZvaWQgY2FsbGNoYWluX25vZGVfX2luaXRfaGF2ZV9jaGlsZHJlbl9yYl90cmVlKHN0cnVjdCBjYWxsY2hhaW5fbm9kZSAqc2VsZikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQgPSByYl9maXJzdCgmc2VsZi0+cmJfcm9vdCk7CisKKwlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPnJiX3Jvb3QpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3QgY2FsbGNoYWluX25vZGUgKmNoaWxkID0gcmJfZW50cnkobmQsIHN0cnVjdCBjYWxsY2hhaW5fbm9kZSwgcmJfbm9kZSk7CisJCXN0cnVjdCBjYWxsY2hhaW5fbGlzdCAqY2hhaW47CisJCWludCBmaXJzdCA9IHRydWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFpbiwgJmNoaWxkLT52YWwsIGxpc3QpIHsKKwkJCWlmIChmaXJzdCkgeworCQkJCWZpcnN0ID0gZmFsc2U7CisJCQkJY2hhaW4tPm1zLmhhc19jaGlsZHJlbiA9IGNoYWluLT5saXN0Lm5leHQgIT0gJmNoaWxkLT52YWwgfHwKKwkJCQkJCQkgcmJfZmlyc3QoJmNoaWxkLT5yYl9yb290KSAhPSBOVUxMOworCQkJfSBlbHNlCisJCQkJY2hhaW4tPm1zLmhhc19jaGlsZHJlbiA9IGNoYWluLT5saXN0Lm5leHQgPT0gJmNoaWxkLT52YWwgJiYKKwkJCQkJCQkgcmJfZmlyc3QoJmNoaWxkLT5yYl9yb290KSAhPSBOVUxMOworCQl9CisKKwkJY2FsbGNoYWluX25vZGVfX2luaXRfaGF2ZV9jaGlsZHJlbl9yYl90cmVlKGNoaWxkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxjaGFpbl9ub2RlX19pbml0X2hhdmVfY2hpbGRyZW4oc3RydWN0IGNhbGxjaGFpbl9ub2RlICpzZWxmKQoreworCXN0cnVjdCBjYWxsY2hhaW5fbGlzdCAqY2hhaW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYWluLCAmc2VsZi0+dmFsLCBsaXN0KQorCQljaGFpbi0+bXMuaGFzX2NoaWxkcmVuID0gcmJfZmlyc3QoJnNlbGYtPnJiX3Jvb3QpICE9IE5VTEw7CisKKwljYWxsY2hhaW5fbm9kZV9faW5pdF9oYXZlX2NoaWxkcmVuX3JiX3RyZWUoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxjaGFpbl9faW5pdF9oYXZlX2NoaWxkcmVuKHN0cnVjdCByYl9yb290ICpzZWxmKQoreworCXN0cnVjdCByYl9ub2RlICpuZDsKKworCWZvciAobmQgPSByYl9maXJzdChzZWxmKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IGNhbGxjaGFpbl9ub2RlICpub2RlID0gcmJfZW50cnkobmQsIHN0cnVjdCBjYWxsY2hhaW5fbm9kZSwgcmJfbm9kZSk7CisJCWNhbGxjaGFpbl9ub2RlX19pbml0X2hhdmVfY2hpbGRyZW4obm9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoaXN0X2VudHJ5X19pbml0X2hhdmVfY2hpbGRyZW4oc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJaWYgKCFzZWxmLT5pbml0X2hhdmVfY2hpbGRyZW4pIHsKKwkJY2FsbGNoYWluX19pbml0X2hhdmVfY2hpbGRyZW4oJnNlbGYtPnNvcnRlZF9jaGFpbik7CisJCXNlbGYtPmluaXRfaGF2ZV9jaGlsZHJlbiA9IHRydWU7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHJiX25vZGUgKmhpc3RzX19maWx0ZXJfZW50cmllcyhzdHJ1Y3QgcmJfbm9kZSAqbmQpCit7CisJd2hpbGUgKG5kICE9IE5VTEwpIHsKKwkJc3RydWN0IGhpc3RfZW50cnkgKmggPSByYl9lbnRyeShuZCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCQlpZiAoIWgtPmZpbHRlcmVkKQorCQkJcmV0dXJuIG5kOworCisJCW5kID0gcmJfbmV4dChuZCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqaGlzdHNfX2ZpbHRlcl9wcmV2X2VudHJpZXMoc3RydWN0IHJiX25vZGUgKm5kKQoreworCXdoaWxlIChuZCAhPSBOVUxMKSB7CisJCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJaWYgKCFoLT5maWx0ZXJlZCkKKwkJCXJldHVybiBuZDsKKworCQluZCA9IHJiX3ByZXYobmQpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB1aV9icm93c2VyX19oaXN0c19zZWVrKHN0cnVjdCB1aV9icm93c2VyICpzZWxmLAorCQkJCSAgIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJYm9vbCBmaXJzdCA9IHRydWU7CisKKwlzd2l0Y2ggKHdoZW5jZSkgeworCWNhc2UgU0VFS19TRVQ6CisJCW5kID0gaGlzdHNfX2ZpbHRlcl9lbnRyaWVzKHJiX2ZpcnN0KHNlbGYtPmVudHJpZXMpKTsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJbmQgPSBzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5OworCQlnb3RvIGRvX29mZnNldDsKKwljYXNlIFNFRUtfRU5EOgorCQluZCA9IGhpc3RzX19maWx0ZXJfcHJldl9lbnRyaWVzKHJiX2xhc3Qoc2VsZi0+ZW50cmllcykpOworCQlmaXJzdCA9IGZhbHNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBNb3ZlcyBub3QgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IHZpc2libGUgZW50cnkgaW52YWxpZGF0ZXMgaXRzCisJICogcm93X29mZnNldDoKKwkgKi8KKwloID0gcmJfZW50cnkoc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCWgtPnJvd19vZmZzZXQgPSAwOworCisJLyoKKwkgKiBIZXJlIHdlIGhhdmUgdG8gY2hlY2sgaWYgbmQgaXMgZXhwYW5kZWQgKCspLCBpZiBpdCBpcyB3ZSBjYW4ndCBnbworCSAqIHRoZSBuZXh0IHRvcCBsZXZlbCBoaXN0X2VudHJ5LCBpbnN0ZWFkIHdlIG11c3QgY29tcHV0ZSBhbiBvZmZzZXQgb2YKKwkgKiB3aGF0IF9ub3RfIHRvIHNob3cgYW5kIG5vdCBjaGFuZ2UgdGhlIGZpcnN0IHZpc2libGUgZW50cnkuCisJICoKKwkgKiBUaGlzIG9mZnNldCBpbmNyZW1lbnRzIHdoZW4gd2UgYXJlIGdvaW5nIGZyb20gdG9wIHRvIGJvdHRvbSBhbmQKKwkgKiBkZWNyZWFzZXMgd2hlbiB3ZSdyZSBnb2luZyBmcm9tIGJvdHRvbSB0byB0b3AuCisJICoKKwkgKiBBcyB3ZSBkb24ndCBoYXZlIGJhY2twb2ludGVycyB0byB0aGUgdG9wIGxldmVsIGluIHRoZSBjYWxsY2hhaW5zCisJICogc3RydWN0dXJlLCB3ZSBuZWVkIHRvIGFsd2F5cyBwcmludCB0aGUgd2hvbGUgaGlzdF9lbnRyeSBjYWxsY2hhaW4sCisJICogc2tpcHBpbmcgdGhlIGZpcnN0IG9uZXMgdGhhdCBhcmUgYmVmb3JlIHRoZSBmaXJzdCB2aXNpYmxlIGVudHJ5CisJICogYW5kIHN0b3Agd2hlbiB3ZSBwcmludGVkIGVub3VnaCBsaW5lcyB0byBmaWxsIHRoZSBzY3JlZW4uCisJICovCitkb19vZmZzZXQ6CisJaWYgKG9mZnNldCA+IDApIHsKKwkJZG8geworCQkJaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisJCQlpZiAoaC0+bXMudW5mb2xkZWQpIHsKKwkJCQl1MTYgcmVtYWluaW5nID0gaC0+bnJfcm93cyAtIGgtPnJvd19vZmZzZXQ7CisJCQkJaWYgKG9mZnNldCA+IHJlbWFpbmluZykgeworCQkJCQlvZmZzZXQgLT0gcmVtYWluaW5nOworCQkJCQloLT5yb3dfb2Zmc2V0ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQloLT5yb3dfb2Zmc2V0ICs9IG9mZnNldDsKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IG5kOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQluZCA9IGhpc3RzX19maWx0ZXJfZW50cmllcyhyYl9uZXh0KG5kKSk7CisJCQlpZiAobmQgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCS0tb2Zmc2V0OworCQkJc2VsZi0+Zmlyc3RfdmlzaWJsZV9lbnRyeSA9IG5kOworCQl9IHdoaWxlIChvZmZzZXQgIT0gMCk7CisJfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7CisJCXdoaWxlICgxKSB7CisJCQloID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJCWlmIChoLT5tcy51bmZvbGRlZCkgeworCQkJCWlmIChmaXJzdCkgeworCQkJCQlpZiAoLW9mZnNldCA+IGgtPnJvd19vZmZzZXQpIHsKKwkJCQkJCW9mZnNldCArPSBoLT5yb3dfb2Zmc2V0OworCQkJCQkJaC0+cm93X29mZnNldCA9IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQloLT5yb3dfb2Zmc2V0ICs9IG9mZnNldDsKKwkJCQkJCW9mZnNldCA9IDA7CisJCQkJCQlzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5ID0gbmQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgtb2Zmc2V0ID4gaC0+bnJfcm93cykgeworCQkJCQkJb2Zmc2V0ICs9IGgtPm5yX3Jvd3M7CisJCQkJCQloLT5yb3dfb2Zmc2V0ID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWgtPnJvd19vZmZzZXQgPSBoLT5ucl9yb3dzICsgb2Zmc2V0OworCQkJCQkJb2Zmc2V0ID0gMDsKKwkJCQkJCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBuZDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQluZCA9IGhpc3RzX19maWx0ZXJfcHJldl9lbnRyaWVzKHJiX3ByZXYobmQpKTsKKwkJCWlmIChuZCA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJKytvZmZzZXQ7CisJCQlzZWxmLT5maXJzdF92aXNpYmxlX2VudHJ5ID0gbmQ7CisJCQlpZiAob2Zmc2V0ID09IDApIHsKKwkJCQkvKgorCQkJCSAqIExhc3QgdW5maWx0ZXJlZCBoaXN0X2VudHJ5LCBjaGVjayBpZiBpdCBpcworCQkJCSAqIHVuZm9sZGVkLCBpZiBpdCBpcyB0aGVuIHdlIHNob3VsZCBoYXZlCisJCQkJICogcm93X29mZnNldCBhdCBpdHMgbGFzdCBlbnRyeS4KKwkJCQkgKi8KKwkJCQloID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJCQlpZiAoaC0+bXMudW5mb2xkZWQpCisJCQkJCWgtPnJvd19vZmZzZXQgPSBoLT5ucl9yb3dzOworCQkJCWJyZWFrOworCQkJfQorCQkJZmlyc3QgPSBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCXNlbGYtPmZpcnN0X3Zpc2libGVfZW50cnkgPSBuZDsKKwkJaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisJCWgtPnJvd19vZmZzZXQgPSAwOworCX0KK30KKworc3RhdGljIGludCBjYWxsY2hhaW5fbm9kZV9fY291bnRfcm93c19yYl90cmVlKHN0cnVjdCBjYWxsY2hhaW5fbm9kZSAqc2VsZikKK3sKKwlpbnQgbiA9IDA7CisJc3RydWN0IHJiX25vZGUgKm5kOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KCZzZWxmLT5yYl9yb290KTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IGNhbGxjaGFpbl9ub2RlICpjaGlsZCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgY2FsbGNoYWluX25vZGUsIHJiX25vZGUpOworCQlzdHJ1Y3QgY2FsbGNoYWluX2xpc3QgKmNoYWluOworCQljaGFyIGZvbGRlZF9zaWduID0gJyAnOyAvKiBObyBjaGlsZHJlbiAqLworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhaW4sICZjaGlsZC0+dmFsLCBsaXN0KSB7CisJCQkrK247CisJCQkvKiBXZSBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBtYXkgbm90IGhhdmUgY2hpbGRyZW4gKi8KKwkJCWZvbGRlZF9zaWduID0gY2FsbGNoYWluX2xpc3RfX2ZvbGRlZChjaGFpbik7CisJCQlpZiAoZm9sZGVkX3NpZ24gPT0gJysnKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZvbGRlZF9zaWduID09ICctJykgLyogSGF2ZSBjaGlsZHJlbiBhbmQgdGhleSdyZSB1bmZvbGRlZCAqLworCQkJbiArPSBjYWxsY2hhaW5fbm9kZV9fY291bnRfcm93c19yYl90cmVlKGNoaWxkKTsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBjYWxsY2hhaW5fbm9kZV9fY291bnRfcm93cyhzdHJ1Y3QgY2FsbGNoYWluX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGNhbGxjaGFpbl9saXN0ICpjaGFpbjsKKwlib29sIHVuZm9sZGVkID0gZmFsc2U7CisJaW50IG4gPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFpbiwgJm5vZGUtPnZhbCwgbGlzdCkgeworCQkrK247CisJCXVuZm9sZGVkID0gY2hhaW4tPm1zLnVuZm9sZGVkOworCX0KKworCWlmICh1bmZvbGRlZCkKKwkJbiArPSBjYWxsY2hhaW5fbm9kZV9fY291bnRfcm93c19yYl90cmVlKG5vZGUpOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgY2FsbGNoYWluX19jb3VudF9yb3dzKHN0cnVjdCByYl9yb290ICpjaGFpbikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJaW50IG4gPSAwOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KGNoYWluKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IGNhbGxjaGFpbl9ub2RlICpub2RlID0gcmJfZW50cnkobmQsIHN0cnVjdCBjYWxsY2hhaW5fbm9kZSwgcmJfbm9kZSk7CisJCW4gKz0gY2FsbGNoYWluX25vZGVfX2NvdW50X3Jvd3Mobm9kZSk7CisJfQorCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBib29sIGhpc3RfYnJvd3Nlcl9fdG9nZ2xlX2ZvbGQoc3RydWN0IGhpc3RfYnJvd3NlciAqc2VsZikKK3sKKwlpZiAobWFwX3N5bWJvbF9fdG9nZ2xlX2ZvbGQoc2VsZi0+c2VsZWN0aW9uKSkgeworCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUgPSBzZWxmLT5oZV9zZWxlY3Rpb247CisKKwkJaGlzdF9lbnRyeV9faW5pdF9oYXZlX2NoaWxkcmVuKGhlKTsKKwkJc2VsZi0+aGlzdHMtPm5yX2VudHJpZXMgLT0gaGUtPm5yX3Jvd3M7CisKKwkJaWYgKGhlLT5tcy51bmZvbGRlZCkKKwkJCWhlLT5ucl9yb3dzID0gY2FsbGNoYWluX19jb3VudF9yb3dzKCZoZS0+c29ydGVkX2NoYWluKTsKKwkJZWxzZQorCQkJaGUtPm5yX3Jvd3MgPSAwOworCQlzZWxmLT5oaXN0cy0+bnJfZW50cmllcyArPSBoZS0+bnJfcm93czsKKwkJc2VsZi0+Yi5ucl9lbnRyaWVzID0gc2VsZi0+aGlzdHMtPm5yX2VudHJpZXM7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogSWYgaXQgZG9lc24ndCBoYXZlIGNoaWxkcmVuLCBubyB0b2dnbGluZyBwZXJmb3JtZWQgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgaGlzdF9icm93c2VyX19ydW4oc3RydWN0IGhpc3RfYnJvd3NlciAqc2VsZiwgY29uc3QgY2hhciAqdGl0bGUsCisJCQkgICAgIHN0cnVjdCBuZXd0RXhpdFN0cnVjdCAqZXMpCit7CisJY2hhciBzdHJbMjU2XSwgdW5pdDsKKwl1bnNpZ25lZCBsb25nIG5yX2V2ZW50cyA9IHNlbGYtPmhpc3RzLT5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfU0FNUExFXTsKKworCXNlbGYtPmIuZW50cmllcyA9ICZzZWxmLT5oaXN0cy0+ZW50cmllczsKKwlzZWxmLT5iLm5yX2VudHJpZXMgPSBzZWxmLT5oaXN0cy0+bnJfZW50cmllczsKKworCWhpc3RfYnJvd3Nlcl9fcmVmcmVzaF9kaW1lbnNpb25zKHNlbGYpOworCisJbnJfZXZlbnRzID0gY29udmVydF91bml0KG5yX2V2ZW50cywgJnVuaXQpOworCXNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICJFdmVudHM6ICVsdSVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisJCSBucl9ldmVudHMsIHVuaXQpOworCW5ld3REcmF3Um9vdFRleHQoMCwgMCwgc3RyKTsKKworCWlmICh1aV9icm93c2VyX19zaG93KCZzZWxmLT5iLCB0aXRsZSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5iLmZvcm0sICdBJyk7CisJbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Yi5mb3JtLCAnYScpOworCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmIuZm9ybSwgJz8nKTsKKwluZXd0Rm9ybUFkZEhvdEtleShzZWxmLT5iLmZvcm0sICdoJyk7CisJbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Yi5mb3JtLCAnSCcpOworCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmIuZm9ybSwgJ2QnKTsKKworCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYtPmIuZm9ybSwgTkVXVF9LRVlfTEVGVCk7CisJbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Yi5mb3JtLCBORVdUX0tFWV9SSUdIVCk7CisJbmV3dEZvcm1BZGRIb3RLZXkoc2VsZi0+Yi5mb3JtLCBORVdUX0tFWV9FTlRFUik7CisKKwl3aGlsZSAoMSkgeworCQl1aV9icm93c2VyX19ydW4oJnNlbGYtPmIsIGVzKTsKKworCQlpZiAoZXMtPnJlYXNvbiAhPSBORVdUX0VYSVRfSE9US0VZKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoZXMtPnUua2V5KSB7CisJCWNhc2UgJ2QnOiB7IC8qIERlYnVnICovCisJCQlzdGF0aWMgaW50IHNlcTsKKwkJCXN0cnVjdCBoaXN0X2VudHJ5ICpoID0gcmJfZW50cnkoc2VsZi0+Yi5maXJzdF92aXNpYmxlX2VudHJ5LAorCQkJCQkJCXN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJCXVpX2hlbHBsaW5lX19wb3AoKTsKKwkJCXVpX2hlbHBsaW5lX19mcHVzaCgiJWQ6IG5yX2VudD0oJWQsJWQpLCBoZWlnaHQ9JWQsIGlkeD0lZCwgZnZlOiBpZHg9JWQsIHJvd19vZmY9JWQsIG5yb3dzPSVkIiwKKwkJCQkJICAgc2VxKyssIHNlbGYtPmIubnJfZW50cmllcywKKwkJCQkJICAgc2VsZi0+aGlzdHMtPm5yX2VudHJpZXMsCisJCQkJCSAgIHNlbGYtPmIuaGVpZ2h0LAorCQkJCQkgICBzZWxmLT5iLmluZGV4LAorCQkJCQkgICBzZWxmLT5iLmZpcnN0X3Zpc2libGVfZW50cnlfaWR4LAorCQkJCQkgICBoLT5yb3dfb2Zmc2V0LCBoLT5ucl9yb3dzKTsKKwkJfQorCQkJY29udGludWU7CisJCWNhc2UgTkVXVF9LRVlfRU5URVI6CisJCQlpZiAoaGlzdF9icm93c2VyX190b2dnbGVfZm9sZChzZWxmKSkKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhydSAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKaW5kZXggOWJmMGY0MC4uNGFmNWJkNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwpAQCAtNjAyLDggKzYwMiwxNSBAQAogCQkJcmV0dXJuIEVWVF9GQUlMRUQ7CiAJfQogCi0JLyogV2Ugc2hvdWxkIGZpbmQgYSBuaWNlIHdheSB0byBvdmVycmlkZSB0aGUgYWNjZXNzIHR5cGUgKi8KLQlhdHRyLT5icF9sZW4gPSBIV19CUkVBS1BPSU5UX0xFTl80OworCS8qCisJICogV2Ugc2hvdWxkIGZpbmQgYSBuaWNlIHdheSB0byBvdmVycmlkZSB0aGUgYWNjZXNzIGxlbmd0aAorCSAqIFByb3ZpZGUgc29tZSBkZWZhdWx0cyBmb3Igbm93CisJICovCisJaWYgKGF0dHItPmJwX3R5cGUgPT0gSFdfQlJFQUtQT0lOVF9YKQorCQlhdHRyLT5icF9sZW4gPSBzaXplb2YobG9uZyk7CisJZWxzZQorCQlhdHRyLT5icF9sZW4gPSBIV19CUkVBS1BPSU5UX0xFTl80OworCiAJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9CUkVBS1BPSU5UOwogCiAJcmV0dXJuIEVWVF9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwppbmRleCA5MTRjNjcwLi4yZTY2NWNiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBwcm9iZS1ldmVudC5jIDogcGVyZi1wcm9iZSBkZWZpbml0aW9uIHRvIGtwcm9iZV9ldmVudHMgZm9ybWF0IGNvbnZlcnRlcgorICogcHJvYmUtZXZlbnQuYyA6IHBlcmYtcHJvYmUgZGVmaW5pdGlvbiB0byBwcm9iZV9ldmVudHMgZm9ybWF0IGNvbnZlcnRlcgogICoKICAqIFdyaXR0ZW4gYnkgTWFzYW1pIEhpcmFtYXRzdSA8bWhpcmFtYXRAcmVkaGF0LmNvbT4KICAqCkBAIC0xMjAsOCArMTIwLDExIEBACiAJcmV0dXJuIG9wZW4obWFjaGluZS52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl0tPmRzby0+bG9uZ19uYW1lLCBPX1JET05MWSk7CiB9CiAKLS8qIENvbnZlcnQgdHJhY2UgcG9pbnQgdG8gcHJvYmUgcG9pbnQgd2l0aCBkZWJ1Z2luZm8gKi8KLXN0YXRpYyBpbnQgY29udmVydF90b19wZXJmX3Byb2JlX3BvaW50KHN0cnVjdCBrcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAorLyoKKyAqIENvbnZlcnQgdHJhY2UgcG9pbnQgdG8gcHJvYmUgcG9pbnQgd2l0aCBkZWJ1Z2luZm8KKyAqIEN1cnJlbnRseSBvbmx5IGhhbmRsZXMga3Byb2Jlcy4KKyAqLworc3RhdGljIGludCBrcHJvYmVfY29udmVydF90b19wZXJmX3Byb2JlKHN0cnVjdCBwcm9iZV90cmFjZV9wb2ludCAqdHAsCiAJCQkJICAgICAgIHN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCkKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07CkBAIC0xNTEsOCArMTU0LDggQEAKIH0KIAogLyogVHJ5IHRvIGZpbmQgcGVyZl9wcm9iZV9ldmVudCB3aXRoIGRlYnVnaW5mbyAqLwotc3RhdGljIGludCB0cnlfdG9fZmluZF9rcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCi0JCQkJCSAgIHN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgKip0ZXZzLAorc3RhdGljIGludCB0cnlfdG9fZmluZF9wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQkJICAgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKIAkJCQkJICAgaW50IG1heF90ZXZzKQogewogCWJvb2wgbmVlZF9kd2FyZiA9IHBlcmZfcHJvYmVfZXZlbnRfbmVlZF9kd2FyZihwZXYpOwpAQCAtMTY5LDExICsxNzIsMTEgQEAKIAl9CiAKIAkvKiBTZWFyY2hpbmcgdHJhY2UgZXZlbnRzIGNvcnJlc3BvbmRpbmcgdG8gcHJvYmUgZXZlbnQgKi8KLQludGV2cyA9IGZpbmRfa3Byb2JlX3RyYWNlX2V2ZW50cyhmZCwgcGV2LCB0ZXZzLCBtYXhfdGV2cyk7CisJbnRldnMgPSBmaW5kX3Byb2JlX3RyYWNlX2V2ZW50cyhmZCwgcGV2LCB0ZXZzLCBtYXhfdGV2cyk7CiAJY2xvc2UoZmQpOwogCiAJaWYgKG50ZXZzID4gMCkgewkvKiBTdWNjZWVkZWQgdG8gZmluZCB0cmFjZSBldmVudHMgKi8KLQkJcHJfZGVidWcoImZpbmQgJWQga3Byb2JlX3RyYWNlX2V2ZW50cy5cbiIsIG50ZXZzKTsKKwkJcHJfZGVidWcoImZpbmQgJWQgcHJvYmVfdHJhY2VfZXZlbnRzLlxuIiwgbnRldnMpOwogCQlyZXR1cm4gbnRldnM7CiAJfQogCkBAIC0xOTUsNiArMTk4LDY1IEBACiAJcmV0dXJuIG50ZXZzOwogfQogCisvKgorICogRmluZCBhIHNyYyBmaWxlIGZyb20gYSBEV0FSRiB0YWcgcGF0aC4gUHJlcGVuZCBvcHRpb25hbCBzb3VyY2UgcGF0aCBwcmVmaXgKKyAqIGFuZCBjaG9wIG9mZiBsZWFkaW5nIGRpcmVjdG9yaWVzIHRoYXQgZG8gbm90IGV4aXN0LiBSZXN1bHQgaXMgcGFzc2VkIGJhY2sgYXMKKyAqIGEgbmV3bHkgYWxsb2NhdGVkIHBhdGggb24gc3VjY2Vzcy4KKyAqIFJldHVybiAwIGlmIGZpbGUgd2FzIGZvdW5kIGFuZCByZWFkYWJsZSwgLWVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBnZXRfcmVhbF9wYXRoKGNvbnN0IGNoYXIgKnJhd19wYXRoLCBjb25zdCBjaGFyICpjb21wX2RpciwKKwkJCSBjaGFyICoqbmV3X3BhdGgpCit7CisJY29uc3QgY2hhciAqcHJlZml4ID0gc3ltYm9sX2NvbmYuc291cmNlX3ByZWZpeDsKKworCWlmICghcHJlZml4KSB7CisJCWlmIChyYXdfcGF0aFswXSAhPSAnLycgJiYgY29tcF9kaXIpCisJCQkvKiBJZiBub3QgYW4gYWJzb2x1dGUgcGF0aCwgdHJ5IHRvIHVzZSBjb21wX2RpciAqLworCQkJcHJlZml4ID0gY29tcF9kaXI7CisJCWVsc2UgeworCQkJaWYgKGFjY2VzcyhyYXdfcGF0aCwgUl9PSykgPT0gMCkgeworCQkJCSpuZXdfcGF0aCA9IHN0cmR1cChyYXdfcGF0aCk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLWVycm5vOworCQl9CisJfQorCisJKm5ld19wYXRoID0gbWFsbG9jKChzdHJsZW4ocHJlZml4KSArIHN0cmxlbihyYXdfcGF0aCkgKyAyKSk7CisJaWYgKCEqbmV3X3BhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yICg7OykgeworCQlzcHJpbnRmKCpuZXdfcGF0aCwgIiVzLyVzIiwgcHJlZml4LCByYXdfcGF0aCk7CisKKwkJaWYgKGFjY2VzcygqbmV3X3BhdGgsIFJfT0spID09IDApCisJCQlyZXR1cm4gMDsKKworCQlpZiAoIXN5bWJvbF9jb25mLnNvdXJjZV9wcmVmaXgpCisJCQkvKiBJbiBjYXNlIG9mIHNlYXJjaGluZyBjb21wX2RpciwgZG9uJ3QgcmV0cnkgKi8KKwkJCXJldHVybiAtZXJybm87CisKKwkJc3dpdGNoIChlcnJubykgeworCQljYXNlIEVOQU1FVE9PTE9ORzoKKwkJY2FzZSBFTk9FTlQ6CisJCWNhc2UgRVJPRlM6CisJCWNhc2UgRUZBVUxUOgorCQkJcmF3X3BhdGggPSBzdHJjaHIoKytyYXdfcGF0aCwgJy8nKTsKKwkJCWlmICghcmF3X3BhdGgpIHsKKwkJCQlmcmVlKCpuZXdfcGF0aCk7CisJCQkJKm5ld19wYXRoID0gTlVMTDsKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQlmcmVlKCpuZXdfcGF0aCk7CisJCQkqbmV3X3BhdGggPSBOVUxMOworCQkJcmV0dXJuIC1lcnJubzsKKwkJfQorCX0KK30KKwogI2RlZmluZSBMSU5FQlVGX1NJWkUgMjU2CiAjZGVmaW5lIE5SX0FERElUSU9OQUxfTElORVMgMgogCkBAIC0yNDQsNiArMzA2LDcgQEAKIAlzdHJ1Y3QgbGluZV9ub2RlICpsbjsKIAlGSUxFICpmcDsKIAlpbnQgZmQsIHJldDsKKwljaGFyICp0bXA7CiAKIAkvKiBTZWFyY2ggYSBsaW5lIHJhbmdlICovCiAJcmV0ID0gaW5pdF92bWxpbnV4KCk7CkBAIC0yNjYsNiArMzI5LDE1IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJLyogQ29udmVydCBzb3VyY2UgZmlsZSBwYXRoICovCisJdG1wID0gbHItPnBhdGg7CisJcmV0ID0gZ2V0X3JlYWxfcGF0aCh0bXAsIGxyLT5jb21wX2RpciwgJmxyLT5wYXRoKTsKKwlmcmVlKHRtcCk7CS8qIEZyZWUgb2xkIHBhdGggKi8KKwlpZiAocmV0IDwgMCkgeworCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gZmluZCBzb3VyY2UgZmlsZS4gKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlzZXR1cF9wYWdlcigpOwogCiAJaWYgKGxyLT5mdW5jdGlvbikKQEAgLTMwOCw4ICszODAsOCBAQAogCiAjZWxzZQkvKiAhRFdBUkZfU1VQUE9SVCAqLwogCi1zdGF0aWMgaW50IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludChzdHJ1Y3Qga3Byb2JlX3RyYWNlX3BvaW50ICp0cCwKLQkJCQkJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwKQorc3RhdGljIGludCBrcHJvYmVfY29udmVydF90b19wZXJmX3Byb2JlKHN0cnVjdCBwcm9iZV90cmFjZV9wb2ludCAqdHAsCisJCQkJICAgICAgIHN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCkKIHsKIAlwcC0+ZnVuY3Rpb24gPSBzdHJkdXAodHAtPnN5bWJvbCk7CiAJaWYgKHBwLT5mdW5jdGlvbiA9PSBOVUxMKQpAQCAtMzIwLDggKzM5Miw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHJ5X3RvX2ZpbmRfa3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJCXN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgKip0ZXZzIF9fdW51c2VkLAorc3RhdGljIGludCB0cnlfdG9fZmluZF9wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKip0ZXZzIF9fdW51c2VkLAogCQkJCWludCBtYXhfdGV2cyBfX3VudXNlZCkKIHsKIAlpZiAocGVyZl9wcm9iZV9ldmVudF9uZWVkX2R3YXJmKHBldikpIHsKQEAgLTU1Nyw3ICs2MjksNyBAQAogLyogUGFyc2UgcGVyZi1wcm9iZSBldmVudCBhcmd1bWVudCAqLwogc3RhdGljIGludCBwYXJzZV9wZXJmX3Byb2JlX2FyZyhjaGFyICpzdHIsIHN0cnVjdCBwZXJmX3Byb2JlX2FyZyAqYXJnKQogewotCWNoYXIgKnRtcDsKKwljaGFyICp0bXAsICpnb29kbmFtZTsKIAlzdHJ1Y3QgcGVyZl9wcm9iZV9hcmdfZmllbGQgKipmaWVsZHA7CiAKIAlwcl9kZWJ1ZygicGFyc2luZyBhcmc6ICVzIGludG8gIiwgc3RyKTsKQEAgLTU4MCw3ICs2NTIsNyBAQAogCQlwcl9kZWJ1ZygidHlwZTolcyAiLCBhcmctPnR5cGUpOwogCX0KIAotCXRtcCA9IHN0cnBicmsoc3RyLCAiLS4iKTsKKwl0bXAgPSBzdHJwYnJrKHN0ciwgIi0uWyIpOwogCWlmICghaXNfY192YXJuYW1lKHN0cikgfHwgIXRtcCkgewogCQkvKiBBIHZhcmlhYmxlLCByZWdpc3Rlciwgc3ltYm9sIG9yIHNwZWNpYWwgdmFsdWUgKi8KIAkJYXJnLT52YXIgPSBzdHJkdXAoc3RyKTsKQEAgLTU5MCwxMCArNjYyLDExIEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIFN0cnVjdHVyZSBmaWVsZHMgKi8KKwkvKiBTdHJ1Y3R1cmUgZmllbGRzIG9yIGFycmF5IGVsZW1lbnQgKi8KIAlhcmctPnZhciA9IHN0cm5kdXAoc3RyLCB0bXAgLSBzdHIpOwogCWlmIChhcmctPnZhciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKKwlnb29kbmFtZSA9IGFyZy0+dmFyOwogCXByX2RlYnVnKCIlcywgIiwgYXJnLT52YXIpOwogCWZpZWxkcCA9ICZhcmctPmZpZWxkOwogCkBAIC02MDEsMjIgKzY3NCwzOCBAQAogCQkqZmllbGRwID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9wcm9iZV9hcmdfZmllbGQpKTsKIAkJaWYgKCpmaWVsZHAgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlpZiAoKnRtcCA9PSAnLicpIHsKLQkJCXN0ciA9IHRtcCArIDE7Ci0JCQkoKmZpZWxkcCktPnJlZiA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKHRtcFsxXSA9PSAnPicpIHsKLQkJCXN0ciA9IHRtcCArIDI7CisJCWlmICgqdG1wID09ICdbJykgewkvKiBBcnJheSAqLworCQkJc3RyID0gdG1wOworCQkJKCpmaWVsZHApLT5pbmRleCA9IHN0cnRvbChzdHIgKyAxLCAmdG1wLCAwKTsKIAkJCSgqZmllbGRwKS0+cmVmID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXNlbWFudGljX2Vycm9yKCJBcmd1bWVudCBwYXJzZSBlcnJvcjogJXNcbiIsIHN0cik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICgqdG1wICE9ICddJyB8fCB0bXAgPT0gc3RyICsgMSkgeworCQkJCXNlbWFudGljX2Vycm9yKCJBcnJheSBpbmRleCBtdXN0IGJlIGEiCisJCQkJCQkiIG51bWJlci5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJdG1wKys7CisJCQlpZiAoKnRtcCA9PSAnXDAnKQorCQkJCXRtcCA9IE5VTEw7CisJCX0gZWxzZSB7CQkvKiBTdHJ1Y3R1cmUgKi8KKwkJCWlmICgqdG1wID09ICcuJykgeworCQkJCXN0ciA9IHRtcCArIDE7CisJCQkJKCpmaWVsZHApLT5yZWYgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZiAodG1wWzFdID09ICc+JykgeworCQkJCXN0ciA9IHRtcCArIDI7CisJCQkJKCpmaWVsZHApLT5yZWYgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlzZW1hbnRpY19lcnJvcigiQXJndW1lbnQgcGFyc2UgZXJyb3I6ICVzXG4iLAorCQkJCQkgICAgICAgc3RyKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXRtcCA9IHN0cnBicmsoc3RyLCAiLS5bIik7CiAJCX0KLQotCQl0bXAgPSBzdHJwYnJrKHN0ciwgIi0uIik7CiAJCWlmICh0bXApIHsKIAkJCSgqZmllbGRwKS0+bmFtZSA9IHN0cm5kdXAoc3RyLCB0bXAgLSBzdHIpOwogCQkJaWYgKCgqZmllbGRwKS0+bmFtZSA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKCpzdHIgIT0gJ1snKQorCQkJCWdvb2RuYW1lID0gKCpmaWVsZHApLT5uYW1lOwogCQkJcHJfZGVidWcoIiVzKCVkKSwgIiwgKCpmaWVsZHApLT5uYW1lLCAoKmZpZWxkcCktPnJlZik7CiAJCQlmaWVsZHAgPSAmKCpmaWVsZHApLT5uZXh0OwogCQl9CkBAIC02MjQsMTEgKzcxMywxMyBAQAogCSgqZmllbGRwKS0+bmFtZSA9IHN0cmR1cChzdHIpOwogCWlmICgoKmZpZWxkcCktPm5hbWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCpzdHIgIT0gJ1snKQorCQlnb29kbmFtZSA9ICgqZmllbGRwKS0+bmFtZTsKIAlwcl9kZWJ1ZygiJXMoJWQpXG4iLCAoKmZpZWxkcCktPm5hbWUsICgqZmllbGRwKS0+cmVmKTsKIAotCS8qIElmIG5vIG5hbWUgaXMgc3BlY2lmaWVkLCBzZXQgdGhlIGxhc3QgZmllbGQgbmFtZSAqLworCS8qIElmIG5vIG5hbWUgaXMgc3BlY2lmaWVkLCBzZXQgdGhlIGxhc3QgZmllbGQgbmFtZSAobm90IGFycmF5IGluZGV4KSovCiAJaWYgKCFhcmctPm5hbWUpIHsKLQkJYXJnLT5uYW1lID0gc3RyZHVwKCgqZmllbGRwKS0+bmFtZSk7CisJCWFyZy0+bmFtZSA9IHN0cmR1cChnb29kbmFtZSk7CiAJCWlmIChhcmctPm5hbWUgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTY5MywxNiArNzg0LDE3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBQYXJzZSBrcHJvYmVfZXZlbnRzIGV2ZW50IGludG8gc3RydWN0IHByb2JlX3BvaW50ICovCi1pbnQgcGFyc2Vfa3Byb2JlX3RyYWNlX2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCisvKiBQYXJzZSBwcm9iZV9ldmVudHMgZXZlbnQgaW50byBzdHJ1Y3QgcHJvYmVfcG9pbnQgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcHJvYmVfdHJhY2VfY29tbWFuZChjb25zdCBjaGFyICpjbWQsCisJCQkJCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2KQogewotCXN0cnVjdCBrcHJvYmVfdHJhY2VfcG9pbnQgKnRwID0gJnRldi0+cG9pbnQ7CisJc3RydWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCA9ICZ0ZXYtPnBvaW50OwogCWNoYXIgcHI7CiAJY2hhciAqcDsKIAlpbnQgcmV0LCBpLCBhcmdjOwogCWNoYXIgKiphcmd2OwogCi0JcHJfZGVidWcoIlBhcnNpbmcga3Byb2JlX2V2ZW50czogJXNcbiIsIGNtZCk7CisJcHJfZGVidWcoIlBhcnNpbmcgcHJvYmVfZXZlbnRzOiAlc1xuIiwgY21kKTsKIAlhcmd2ID0gYXJndl9zcGxpdChjbWQsICZhcmdjKTsKIAlpZiAoIWFyZ3YpIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBzcGxpdCBhcmd1bWVudHMuXG4iKTsKQEAgLTczNCw3ICs4MjYsNyBAQAogCQl0cC0+b2Zmc2V0ID0gMDsKIAogCXRldi0+bmFyZ3MgPSBhcmdjIC0gMjsKLQl0ZXYtPmFyZ3MgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnKSAqIHRldi0+bmFyZ3MpOworCXRldi0+YXJncyA9IHphbGxvYyhzaXplb2Yoc3RydWN0IHByb2JlX3RyYWNlX2FyZykgKiB0ZXYtPm5hcmdzKTsKIAlpZiAodGV2LT5hcmdzID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC03NzYsOCArODY4LDExIEBACiAJbGVuIC09IHJldDsKIAogCXdoaWxlIChmaWVsZCkgewotCQlyZXQgPSBlX3NucHJpbnRmKHRtcCwgbGVuLCAiJXMlcyIsIGZpZWxkLT5yZWYgPyAiLT4iIDogIi4iLAotCQkJCSBmaWVsZC0+bmFtZSk7CisJCWlmIChmaWVsZC0+bmFtZVswXSA9PSAnWycpCisJCQlyZXQgPSBlX3NucHJpbnRmKHRtcCwgbGVuLCAiJXMiLCBmaWVsZC0+bmFtZSk7CisJCWVsc2UKKwkJCXJldCA9IGVfc25wcmludGYodG1wLCBsZW4sICIlcyVzIiwKKwkJCQkJIGZpZWxkLT5yZWYgPyAiLT4iIDogIi4iLCBmaWVsZC0+bmFtZSk7CiAJCWlmIChyZXQgPD0gMCkKIAkJCWdvdG8gZXJyb3I7CiAJCXRtcCArPSByZXQ7CkBAIC04NzcsMTMgKzk3MiwxMyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19zeW50aGVzaXplX2twcm9iZV90cmFjZV9hcmdfcmVmKHN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnX3JlZiAqcmVmLAorc3RhdGljIGludCBfX3N5bnRoZXNpemVfcHJvYmVfdHJhY2VfYXJnX3JlZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnX3JlZiAqcmVmLAogCQkJCQkgICAgIGNoYXIgKipidWYsIHNpemVfdCAqYnVmbGVuLAogCQkJCQkgICAgIGludCBkZXB0aCkKIHsKIAlpbnQgcmV0OwogCWlmIChyZWYtPm5leHQpIHsKLQkJZGVwdGggPSBfX3N5bnRoZXNpemVfa3Byb2JlX3RyYWNlX2FyZ19yZWYocmVmLT5uZXh0LCBidWYsCisJCWRlcHRoID0gX19zeW50aGVzaXplX3Byb2JlX3RyYWNlX2FyZ19yZWYocmVmLT5uZXh0LCBidWYsCiAJCQkJCQkJIGJ1ZmxlbiwgZGVwdGggKyAxKTsKIAkJaWYgKGRlcHRoIDwgMCkKIAkJCWdvdG8gb3V0OwpAQCAtOTAxLDkgKzk5NiwxMCBAQAogCiB9CiAKLXN0YXRpYyBpbnQgc3ludGhlc2l6ZV9rcHJvYmVfdHJhY2VfYXJnKHN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnICphcmcsCitzdGF0aWMgaW50IHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfYXJnKHN0cnVjdCBwcm9iZV90cmFjZV9hcmcgKmFyZywKIAkJCQkgICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQogeworCXN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmICpyZWYgPSBhcmctPnJlZjsKIAlpbnQgcmV0LCBkZXB0aCA9IDA7CiAJY2hhciAqdG1wID0gYnVmOwogCkBAIC05MTcsMTYgKzEwMTMsMjQgQEAKIAlidWYgKz0gcmV0OwogCWJ1ZmxlbiAtPSByZXQ7CiAKKwkvKiBTcGVjaWFsIGNhc2U6IEBYWFggKi8KKwlpZiAoYXJnLT52YWx1ZVswXSA9PSAnQCcgJiYgYXJnLT5yZWYpCisJCQlyZWYgPSByZWYtPm5leHQ7CisKIAkvKiBEZXJlZmVyZW5jaW5nIGFyZ3VtZW50cyAqLwotCWlmIChhcmctPnJlZikgewotCQlkZXB0aCA9IF9fc3ludGhlc2l6ZV9rcHJvYmVfdHJhY2VfYXJnX3JlZihhcmctPnJlZiwgJmJ1ZiwKKwlpZiAocmVmKSB7CisJCWRlcHRoID0gX19zeW50aGVzaXplX3Byb2JlX3RyYWNlX2FyZ19yZWYocmVmLCAmYnVmLAogCQkJCQkJCSAgJmJ1ZmxlbiwgMSk7CiAJCWlmIChkZXB0aCA8IDApCiAJCQlyZXR1cm4gZGVwdGg7CiAJfQogCiAJLyogUHJpbnQgYXJndW1lbnQgdmFsdWUgKi8KLQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCBhcmctPnZhbHVlKTsKKwlpZiAoYXJnLT52YWx1ZVswXSA9PSAnQCcgJiYgYXJnLT5yZWYpCisJCXJldCA9IGVfc25wcmludGYoYnVmLCBidWZsZW4sICIlcyUrbGQiLCBhcmctPnZhbHVlLAorCQkJCSBhcmctPnJlZi0+b2Zmc2V0KTsKKwllbHNlCisJCXJldCA9IGVfc25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsIGFyZy0+dmFsdWUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCWJ1ZiArPSByZXQ7CkBAIC05NTEsOSArMTA1NSw5IEBACiAJcmV0dXJuIGJ1ZiAtIHRtcDsKIH0KIAotY2hhciAqc3ludGhlc2l6ZV9rcHJvYmVfdHJhY2VfY29tbWFuZChzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCitjaGFyICpzeW50aGVzaXplX3Byb2JlX3RyYWNlX2NvbW1hbmQoc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCiB7Ci0Jc3RydWN0IGtwcm9iZV90cmFjZV9wb2ludCAqdHAgPSAmdGV2LT5wb2ludDsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwID0gJnRldi0+cG9pbnQ7CiAJY2hhciAqYnVmOwogCWludCBpLCBsZW4sIHJldDsKIApAQCAtOTY5LDcgKzEwNzMsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJZm9yIChpID0gMDsgaSA8IHRldi0+bmFyZ3M7IGkrKykgewotCQlyZXQgPSBzeW50aGVzaXplX2twcm9iZV90cmFjZV9hcmcoJnRldi0+YXJnc1tpXSwgYnVmICsgbGVuLAorCQlyZXQgPSBzeW50aGVzaXplX3Byb2JlX3RyYWNlX2FyZygmdGV2LT5hcmdzW2ldLCBidWYgKyBsZW4sCiAJCQkJCQkgIE1BWF9DTURMRU4gLSBsZW4pOwogCQlpZiAocmV0IDw9IDApCiAJCQlnb3RvIGVycm9yOwpAQCAtOTgyLDcgKzEwODYsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgY29udmVydF90b19wZXJmX3Byb2JlX2V2ZW50KHN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgKnRldiwKK3N0YXRpYyBpbnQgY29udmVydF90b19wZXJmX3Byb2JlX2V2ZW50KHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2LAogCQkJCXN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYpCiB7CiAJY2hhciBidWZbNjRdID0gIiI7CkBAIC05OTUsNyArMTA5OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogQ29udmVydCB0cmFjZV9wb2ludCB0byBwcm9iZV9wb2ludCAqLwotCXJldCA9IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludCgmdGV2LT5wb2ludCwgJnBldi0+cG9pbnQpOworCXJldCA9IGtwcm9iZV9jb252ZXJ0X3RvX3BlcmZfcHJvYmUoJnRldi0+cG9pbnQsICZwZXYtPnBvaW50KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTAwOCw3ICsxMTEyLDcgQEAKIAkJaWYgKHRldi0+YXJnc1tpXS5uYW1lKQogCQkJcGV2LT5hcmdzW2ldLm5hbWUgPSBzdHJkdXAodGV2LT5hcmdzW2ldLm5hbWUpOwogCQllbHNlIHsKLQkJCXJldCA9IHN5bnRoZXNpemVfa3Byb2JlX3RyYWNlX2FyZygmdGV2LT5hcmdzW2ldLAorCQkJcmV0ID0gc3ludGhlc2l6ZV9wcm9iZV90cmFjZV9hcmcoJnRldi0+YXJnc1tpXSwKIAkJCQkJCQkgIGJ1ZiwgNjQpOwogCQkJcGV2LT5hcmdzW2ldLm5hbWUgPSBzdHJkdXAoYnVmKTsKIAkJfQpAQCAtMTA1OSw5ICsxMTYzLDkgQEAKIAltZW1zZXQocGV2LCAwLCBzaXplb2YoKnBldikpOwogfQogCi12b2lkIGNsZWFyX2twcm9iZV90cmFjZV9ldmVudChzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCitzdGF0aWMgdm9pZCBjbGVhcl9wcm9iZV90cmFjZV9ldmVudChzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikKIHsKLQlzdHJ1Y3Qga3Byb2JlX3RyYWNlX2FyZ19yZWYgKnJlZiwgKm5leHQ7CisJc3RydWN0IHByb2JlX3RyYWNlX2FyZ19yZWYgKnJlZiwgKm5leHQ7CiAJaW50IGk7CiAKIAlpZiAodGV2LT5ldmVudCkKQEAgLTExMjIsNyArMTIyNiw3IEBACiB9CiAKIC8qIEdldCByYXcgc3RyaW5nIGxpc3Qgb2YgY3VycmVudCBrcHJvYmVfZXZlbnRzICovCi1zdGF0aWMgc3RydWN0IHN0cmxpc3QgKmdldF9rcHJvYmVfdHJhY2VfY29tbWFuZF9yYXdsaXN0KGludCBmZCkKK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqZ2V0X3Byb2JlX3RyYWNlX2NvbW1hbmRfcmF3bGlzdChpbnQgZmQpCiB7CiAJaW50IHJldCwgaWR4OwogCUZJTEUgKmZwOwpAQCAtMTE5MCw3ICsxMjk0LDcgQEAKIGludCBzaG93X3BlcmZfcHJvYmVfZXZlbnRzKHZvaWQpCiB7CiAJaW50IGZkLCByZXQ7Ci0Jc3RydWN0IGtwcm9iZV90cmFjZV9ldmVudCB0ZXY7CisJc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50IHRldjsKIAlzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCBwZXY7CiAJc3RydWN0IHN0cmxpc3QgKnJhd2xpc3Q7CiAJc3RydWN0IHN0cl9ub2RlICplbnQ7CkBAIC0xMjA3LDIwICsxMzExLDIwIEBACiAJaWYgKGZkIDwgMCkKIAkJcmV0dXJuIGZkOwogCi0JcmF3bGlzdCA9IGdldF9rcHJvYmVfdHJhY2VfY29tbWFuZF9yYXdsaXN0KGZkKTsKKwlyYXdsaXN0ID0gZ2V0X3Byb2JlX3RyYWNlX2NvbW1hbmRfcmF3bGlzdChmZCk7CiAJY2xvc2UoZmQpOwogCWlmICghcmF3bGlzdCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlzdHJsaXN0X19mb3JfZWFjaChlbnQsIHJhd2xpc3QpIHsKLQkJcmV0ID0gcGFyc2Vfa3Byb2JlX3RyYWNlX2NvbW1hbmQoZW50LT5zLCAmdGV2KTsKKwkJcmV0ID0gcGFyc2VfcHJvYmVfdHJhY2VfY29tbWFuZChlbnQtPnMsICZ0ZXYpOwogCQlpZiAocmV0ID49IDApIHsKIAkJCXJldCA9IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9ldmVudCgmdGV2LCAmcGV2KTsKIAkJCWlmIChyZXQgPj0gMCkKIAkJCQlyZXQgPSBzaG93X3BlcmZfcHJvYmVfZXZlbnQoJnBldik7CiAJCX0KIAkJY2xlYXJfcGVyZl9wcm9iZV9ldmVudCgmcGV2KTsKLQkJY2xlYXJfa3Byb2JlX3RyYWNlX2V2ZW50KCZ0ZXYpOworCQljbGVhcl9wcm9iZV90cmFjZV9ldmVudCgmdGV2KTsKIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKIAl9CkBAIC0xMjMwLDIwICsxMzM0LDE5IEBACiB9CiAKIC8qIEdldCBjdXJyZW50IHBlcmYtcHJvYmUgZXZlbnQgbmFtZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqZ2V0X2twcm9iZV90cmFjZV9ldmVudF9uYW1lcyhpbnQgZmQsIGJvb2wgaW5jbHVkZV9ncm91cCkKK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqZ2V0X3Byb2JlX3RyYWNlX2V2ZW50X25hbWVzKGludCBmZCwgYm9vbCBpbmNsdWRlX2dyb3VwKQogewogCWNoYXIgYnVmWzEyOF07CiAJc3RydWN0IHN0cmxpc3QgKnNsLCAqcmF3bGlzdDsKIAlzdHJ1Y3Qgc3RyX25vZGUgKmVudDsKLQlzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50IHRldjsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgdGV2OwogCWludCByZXQgPSAwOwogCiAJbWVtc2V0KCZ0ZXYsIDAsIHNpemVvZih0ZXYpKTsKLQotCXJhd2xpc3QgPSBnZXRfa3Byb2JlX3RyYWNlX2NvbW1hbmRfcmF3bGlzdChmZCk7CisJcmF3bGlzdCA9IGdldF9wcm9iZV90cmFjZV9jb21tYW5kX3Jhd2xpc3QoZmQpOwogCXNsID0gc3RybGlzdF9fbmV3KHRydWUsIE5VTEwpOwogCXN0cmxpc3RfX2Zvcl9lYWNoKGVudCwgcmF3bGlzdCkgewotCQlyZXQgPSBwYXJzZV9rcHJvYmVfdHJhY2VfY29tbWFuZChlbnQtPnMsICZ0ZXYpOworCQlyZXQgPSBwYXJzZV9wcm9iZV90cmFjZV9jb21tYW5kKGVudC0+cywgJnRldik7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CiAJCWlmIChpbmNsdWRlX2dyb3VwKSB7CkBAIC0xMjUzLDcgKzEzNTYsNyBAQAogCQkJCXJldCA9IHN0cmxpc3RfX2FkZChzbCwgYnVmKTsKIAkJfSBlbHNlCiAJCQlyZXQgPSBzdHJsaXN0X19hZGQoc2wsIHRldi5ldmVudCk7Ci0JCWNsZWFyX2twcm9iZV90cmFjZV9ldmVudCgmdGV2KTsKKwkJY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQoJnRldik7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CiAJfQpAQCAtMTI2NiwxMyArMTM2OSwxMyBAQAogCXJldHVybiBzbDsKIH0KIAotc3RhdGljIGludCB3cml0ZV9rcHJvYmVfdHJhY2VfZXZlbnQoaW50IGZkLCBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCitzdGF0aWMgaW50IHdyaXRlX3Byb2JlX3RyYWNlX2V2ZW50KGludCBmZCwgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCiB7CiAJaW50IHJldCA9IDA7Ci0JY2hhciAqYnVmID0gc3ludGhlc2l6ZV9rcHJvYmVfdHJhY2VfY29tbWFuZCh0ZXYpOworCWNoYXIgKmJ1ZiA9IHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfY29tbWFuZCh0ZXYpOwogCiAJaWYgKCFidWYpIHsKLQkJcHJfZGVidWcoIkZhaWxlZCB0byBzeW50aGVzaXplIGtwcm9iZSB0cmFjZSBldmVudC5cbiIpOworCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIHN5bnRoZXNpemUgcHJvYmUgdHJhY2UgZXZlbnQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMzI1LDEyICsxNDI4LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2FkZF9rcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCi0JCQkJICAgICBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXZzLAorc3RhdGljIGludCBfX2FkZF9wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQkgICAgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2cywKIAkJCQkgICAgIGludCBudGV2cywgYm9vbCBhbGxvd19zdWZmaXgpCiB7CiAJaW50IGksIGZkLCByZXQ7Ci0Jc3RydWN0IGtwcm9iZV90cmFjZV9ldmVudCAqdGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldiA9IE5VTEw7CiAJY2hhciBidWZbNjRdOwogCWNvbnN0IGNoYXIgKmV2ZW50LCAqZ3JvdXA7CiAJc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0OwpAQCAtMTMzOSw3ICsxNDQyLDcgQEAKIAlpZiAoZmQgPCAwKQogCQlyZXR1cm4gZmQ7CiAJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8KLQluYW1lbGlzdCA9IGdldF9rcHJvYmVfdHJhY2VfZXZlbnRfbmFtZXMoZmQsIGZhbHNlKTsKKwluYW1lbGlzdCA9IGdldF9wcm9iZV90cmFjZV9ldmVudF9uYW1lcyhmZCwgZmFsc2UpOwogCWlmICghbmFtZWxpc3QpIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBnZXQgY3VycmVudCBldmVudCBsaXN0LlxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTM3NCw3ICsxNDc3LDcgQEAKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlicmVhazsKIAkJfQotCQlyZXQgPSB3cml0ZV9rcHJvYmVfdHJhY2VfZXZlbnQoZmQsIHRldik7CisJCXJldCA9IHdyaXRlX3Byb2JlX3RyYWNlX2V2ZW50KGZkLCB0ZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWJyZWFrOwogCQkvKiBBZGQgYWRkZWQgZXZlbnQgbmFtZSB0byBuYW1lbGlzdCAqLwpAQCAtMTQxMSwyMSArMTUxNCwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY29udmVydF90b19rcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCi0JCQkJCSAgc3RydWN0IGtwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsCitzdGF0aWMgaW50IGNvbnZlcnRfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCisJCQkJCSAgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKIAkJCQkJICBpbnQgbWF4X3RldnMpCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCWludCByZXQgPSAwLCBpOwotCXN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKIAogCS8qIENvbnZlcnQgcGVyZl9wcm9iZV9ldmVudCB3aXRoIGRlYnVnaW5mbyAqLwotCXJldCA9IHRyeV90b19maW5kX2twcm9iZV90cmFjZV9ldmVudHMocGV2LCB0ZXZzLCBtYXhfdGV2cyk7CisJcmV0ID0gdHJ5X3RvX2ZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzKHBldiwgdGV2cywgbWF4X3RldnMpOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIEFsbG9jYXRlIHRyYWNlIGV2ZW50IGJ1ZmZlciAqLwotCXRldiA9ICp0ZXZzID0gemFsbG9jKHNpemVvZihzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50KSk7CisJdGV2ID0gKnRldnMgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCkpOwogCWlmICh0ZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE0MzgsNyArMTU0MSw3IEBACiAJdGV2LT5wb2ludC5vZmZzZXQgPSBwZXYtPnBvaW50Lm9mZnNldDsKIAl0ZXYtPm5hcmdzID0gcGV2LT5uYXJnczsKIAlpZiAodGV2LT5uYXJncykgewotCQl0ZXYtPmFyZ3MgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnKQorCQl0ZXYtPmFyZ3MgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9hcmcpCiAJCQkJICAgKiB0ZXYtPm5hcmdzKTsKIAkJaWYgKHRldi0+YXJncyA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTQ3OSw3ICsxNTgyLDcgQEAKIAogCXJldHVybiAxOwogZXJyb3I6Ci0JY2xlYXJfa3Byb2JlX3RyYWNlX2V2ZW50KHRldik7CisJY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQodGV2KTsKIAlmcmVlKHRldik7CiAJKnRldnMgPSBOVUxMOwogCXJldHVybiByZXQ7CkBAIC0xNDg3LDcgKzE1OTAsNyBAQAogCiBzdHJ1Y3QgX19ldmVudF9wYWNrYWdlIHsKIAlzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudAkJKnBldjsKLQlzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50CSp0ZXZzOworCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudAkqdGV2czsKIAlpbnQJCQkJbnRldnM7CiB9OwogCkBAIC0xNTEwLDcgKzE2MTMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBucGV2czsgaSsrKSB7CiAJCXBrZ3NbaV0ucGV2ID0gJnBldnNbaV07CiAJCS8qIENvbnZlcnQgd2l0aCBvciB3aXRob3V0IGRlYnVnaW5mbyAqLwotCQlyZXQgID0gY29udmVydF90b19rcHJvYmVfdHJhY2VfZXZlbnRzKHBrZ3NbaV0ucGV2LAorCQlyZXQgID0gY29udmVydF90b19wcm9iZV90cmFjZV9ldmVudHMocGtnc1tpXS5wZXYsCiAJCQkJCQkgICAgICAmcGtnc1tpXS50ZXZzLCBtYXhfdGV2cyk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlbmQ7CkBAIC0xNTE5LDI0ICsxNjIyLDI0IEBACiAKIAkvKiBMb29wIDI6IGFkZCBhbGwgZXZlbnRzICovCiAJZm9yIChpID0gMDsgaSA8IG5wZXZzICYmIHJldCA+PSAwOyBpKyspCi0JCXJldCA9IF9fYWRkX2twcm9iZV90cmFjZV9ldmVudHMocGtnc1tpXS5wZXYsIHBrZ3NbaV0udGV2cywKKwkJcmV0ID0gX19hZGRfcHJvYmVfdHJhY2VfZXZlbnRzKHBrZ3NbaV0ucGV2LCBwa2dzW2ldLnRldnMsCiAJCQkJCQlwa2dzW2ldLm50ZXZzLCBmb3JjZV9hZGQpOwogZW5kOgogCS8qIExvb3AgMzogY2xlYW51cCB0cmFjZSBldmVudHMgICovCiAJZm9yIChpID0gMDsgaSA8IG5wZXZzOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCBwa2dzW2ldLm50ZXZzOyBqKyspCi0JCQljbGVhcl9rcHJvYmVfdHJhY2VfZXZlbnQoJnBrZ3NbaV0udGV2c1tqXSk7CisJCQljbGVhcl9wcm9iZV90cmFjZV9ldmVudCgmcGtnc1tpXS50ZXZzW2pdKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZWxfdHJhY2Vfa3Byb2JlX2V2ZW50KGludCBmZCwgc3RydWN0IHN0cl9ub2RlICplbnQpCitzdGF0aWMgaW50IF9fZGVsX3RyYWNlX3Byb2JlX2V2ZW50KGludCBmZCwgc3RydWN0IHN0cl9ub2RlICplbnQpCiB7CiAJY2hhciAqcDsKIAljaGFyIGJ1ZlsxMjhdOwogCWludCByZXQ7CiAKLQkvKiBDb252ZXJ0IGZyb20gcGVyZi1wcm9iZSBldmVudCB0byB0cmFjZS1rcHJvYmUgZXZlbnQgKi8KKwkvKiBDb252ZXJ0IGZyb20gcGVyZi1wcm9iZSBldmVudCB0byB0cmFjZS1wcm9iZSBldmVudCAqLwogCXJldCA9IGVfc25wcmludGYoYnVmLCAxMjgsICItOiVzIiwgZW50LT5zKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKQEAgLTE1NjIsNyArMTY2NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBkZWxfdHJhY2Vfa3Byb2JlX2V2ZW50KGludCBmZCwgY29uc3QgY2hhciAqZ3JvdXAsCitzdGF0aWMgaW50IGRlbF90cmFjZV9wcm9iZV9ldmVudChpbnQgZmQsIGNvbnN0IGNoYXIgKmdyb3VwLAogCQkJCSAgY29uc3QgY2hhciAqZXZlbnQsIHN0cnVjdCBzdHJsaXN0ICpuYW1lbGlzdCkKIHsKIAljaGFyIGJ1ZlsxMjhdOwpAQCAtMTU3OSw3ICsxNjgyLDcgQEAKIAkJc3RybGlzdF9fZm9yX2VhY2hfc2FmZShlbnQsIG4sIG5hbWVsaXN0KQogCQkJaWYgKHN0cmdsb2JtYXRjaChlbnQtPnMsIGJ1ZikpIHsKIAkJCQlmb3VuZCsrOwotCQkJCXJldCA9IF9fZGVsX3RyYWNlX2twcm9iZV9ldmVudChmZCwgZW50KTsKKwkJCQlyZXQgPSBfX2RlbF90cmFjZV9wcm9iZV9ldmVudChmZCwgZW50KTsKIAkJCQlpZiAocmV0IDwgMCkKIAkJCQkJYnJlYWs7CiAJCQkJc3RybGlzdF9fcmVtb3ZlKG5hbWVsaXN0LCBlbnQpOwpAQCAtMTU4OCw3ICsxNjkxLDcgQEAKIAkJZW50ID0gc3RybGlzdF9fZmluZChuYW1lbGlzdCwgYnVmKTsKIAkJaWYgKGVudCkgewogCQkJZm91bmQrKzsKLQkJCXJldCA9IF9fZGVsX3RyYWNlX2twcm9iZV9ldmVudChmZCwgZW50KTsKKwkJCXJldCA9IF9fZGVsX3RyYWNlX3Byb2JlX2V2ZW50KGZkLCBlbnQpOwogCQkJaWYgKHJldCA+PSAwKQogCQkJCXN0cmxpc3RfX3JlbW92ZShuYW1lbGlzdCwgZW50KTsKIAkJfQpAQCAtMTYxMiw3ICsxNzE1LDcgQEAKIAkJcmV0dXJuIGZkOwogCiAJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8KLQluYW1lbGlzdCA9IGdldF9rcHJvYmVfdHJhY2VfZXZlbnRfbmFtZXMoZmQsIHRydWUpOworCW5hbWVsaXN0ID0gZ2V0X3Byb2JlX3RyYWNlX2V2ZW50X25hbWVzKGZkLCB0cnVlKTsKIAlpZiAobmFtZWxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE2MzMsNyArMTczNiw3IEBACiAJCQlldmVudCA9IHN0cjsKIAkJfQogCQlwcl9kZWJ1ZygiR3JvdXA6ICVzLCBFdmVudDogJXNcbiIsIGdyb3VwLCBldmVudCk7Ci0JCXJldCA9IGRlbF90cmFjZV9rcHJvYmVfZXZlbnQoZmQsIGdyb3VwLCBldmVudCwgbmFtZWxpc3QpOworCQlyZXQgPSBkZWxfdHJhY2VfcHJvYmVfZXZlbnQoZmQsIGdyb3VwLCBldmVudCwgbmFtZWxpc3QpOwogCQlmcmVlKHN0cik7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCmluZGV4IGU5ZGIxYTIuLjVhZjM5MjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCkBAIC03LDMzICs3LDMzIEBACiBleHRlcm4gYm9vbCBwcm9iZV9ldmVudF9kcnlfcnVuOwogCiAvKiBrcHJvYmUtdHJhY2VyIHRyYWNpbmcgcG9pbnQgKi8KLXN0cnVjdCBrcHJvYmVfdHJhY2VfcG9pbnQgeworc3RydWN0IHByb2JlX3RyYWNlX3BvaW50IHsKIAljaGFyCQkqc3ltYm9sOwkvKiBCYXNlIHN5bWJvbCAqLwogCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwkJLyogT2Zmc2V0IGZyb20gc3ltYm9sICovCiAJYm9vbAkJcmV0cHJvYmU7CS8qIFJldHVybiBwcm9iZSBmbGFnICovCiB9OwogCi0vKiBrcHJvYmUtdHJhY2VyIHRyYWNpbmcgYXJndW1lbnQgcmVmZXJlbmNpbmcgb2Zmc2V0ICovCi1zdHJ1Y3Qga3Byb2JlX3RyYWNlX2FyZ19yZWYgewotCXN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnX3JlZgkqbmV4dDsJLyogTmV4dCByZWZlcmVuY2UgKi8KKy8qIHByb2JlLXRyYWNlciB0cmFjaW5nIGFyZ3VtZW50IHJlZmVyZW5jaW5nIG9mZnNldCAqLworc3RydWN0IHByb2JlX3RyYWNlX2FyZ19yZWYgeworCXN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmCSpuZXh0OwkvKiBOZXh0IHJlZmVyZW5jZSAqLwogCWxvbmcJCQkJb2Zmc2V0OwkvKiBPZmZzZXQgdmFsdWUgKi8KIH07CiAKIC8qIGtwcm9iZS10cmFjZXIgdHJhY2luZyBhcmd1bWVudCAqLwotc3RydWN0IGtwcm9iZV90cmFjZV9hcmcgeworc3RydWN0IHByb2JlX3RyYWNlX2FyZyB7CiAJY2hhcgkJCQkqbmFtZTsJLyogQXJndW1lbnQgbmFtZSAqLwogCWNoYXIJCQkJKnZhbHVlOwkvKiBCYXNlIHZhbHVlICovCiAJY2hhcgkJCQkqdHlwZTsJLyogVHlwZSBuYW1lICovCi0Jc3RydWN0IGtwcm9iZV90cmFjZV9hcmdfcmVmCSpyZWY7CS8qIFJlZmVyZW5jaW5nIG9mZnNldCAqLworCXN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmCSpyZWY7CS8qIFJlZmVyZW5jaW5nIG9mZnNldCAqLwogfTsKIAogLyoga3Byb2JlLXRyYWNlciB0cmFjaW5nIGV2ZW50IChwb2ludCArIGFyZykgKi8KLXN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgeworc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50IHsKIAljaGFyCQkJCSpldmVudDsJLyogRXZlbnQgbmFtZSAqLwogCWNoYXIJCQkJKmdyb3VwOwkvKiBHcm91cCBuYW1lICovCi0Jc3RydWN0IGtwcm9iZV90cmFjZV9wb2ludAlwb2ludDsJLyogVHJhY2UgcG9pbnQgKi8KKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQJcG9pbnQ7CS8qIFRyYWNlIHBvaW50ICovCiAJaW50CQkJCW5hcmdzOwkvKiBOdW1iZXIgb2YgYXJncyAqLwotCXN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnCQkqYXJnczsJLyogQXJndW1lbnRzICovCisJc3RydWN0IHByb2JlX3RyYWNlX2FyZwkJKmFyZ3M7CS8qIEFyZ3VtZW50cyAqLwogfTsKIAogLyogUGVyZiBwcm9iZSBwcm9iaW5nIHBvaW50ICovCkBAIC01MCw2ICs1MCw3IEBACiBzdHJ1Y3QgcGVyZl9wcm9iZV9hcmdfZmllbGQgewogCXN0cnVjdCBwZXJmX3Byb2JlX2FyZ19maWVsZAkqbmV4dDsJLyogTmV4dCBmaWVsZCAqLwogCWNoYXIJCQkJKm5hbWU7CS8qIE5hbWUgb2YgdGhlIGZpZWxkICovCisJbG9uZwkJCQlpbmRleDsJLyogQXJyYXkgaW5kZXggbnVtYmVyICovCiAJYm9vbAkJCQlyZWY7CS8qIFJlZmVyZW5jaW5nIGZsYWcgKi8KIH07CiAKQEAgLTg1LDMxICs4NiwyNSBAQAogCWludAkJCWVuZDsJCS8qIEVuZCBsaW5lIG51bWJlciAqLwogCWludAkJCW9mZnNldDsJCS8qIFN0YXJ0IGxpbmUgb2Zmc2V0ICovCiAJY2hhcgkJCSpwYXRoOwkJLyogUmVhbCBwYXRoIG5hbWUgKi8KKwljaGFyCQkJKmNvbXBfZGlyOwkvKiBDb21waWxlIGRpcmVjdG9yeSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGluZV9saXN0OwkvKiBWaXNpYmxlIGxpbmVzICovCiB9OwogCiAvKiBDb21tYW5kIHN0cmluZyB0byBldmVudHMgKi8KIGV4dGVybiBpbnQgcGFyc2VfcGVyZl9wcm9iZV9jb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwKIAkJCQkgICAgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldik7Ci1leHRlcm4gaW50IHBhcnNlX2twcm9iZV90cmFjZV9jb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwKLQkJCQkgICAgICBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXYpOwogCiAvKiBFdmVudHMgdG8gY29tbWFuZCBzdHJpbmcgKi8KIGV4dGVybiBjaGFyICpzeW50aGVzaXplX3BlcmZfcHJvYmVfY29tbWFuZChzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2KTsKLWV4dGVybiBjaGFyICpzeW50aGVzaXplX2twcm9iZV90cmFjZV9jb21tYW5kKHN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgKnRldik7CitleHRlcm4gY2hhciAqc3ludGhlc2l6ZV9wcm9iZV90cmFjZV9jb21tYW5kKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2KTsKIGV4dGVybiBpbnQgc3ludGhlc2l6ZV9wZXJmX3Byb2JlX2FyZyhzdHJ1Y3QgcGVyZl9wcm9iZV9hcmcgKnBhLCBjaGFyICpidWYsCiAJCQkJICAgICBzaXplX3QgbGVuKTsKIAogLyogQ2hlY2sgdGhlIHBlcmZfcHJvYmVfZXZlbnQgbmVlZHMgZGVidWdpbmZvICovCiBleHRlcm4gYm9vbCBwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldik7CiAKLS8qIENvbnZlcnQgZnJvbSBrcHJvYmVfdHJhY2VfZXZlbnQgdG8gcGVyZl9wcm9iZV9ldmVudCAqLwotZXh0ZXJuIGludCBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfZXZlbnQoc3RydWN0IGtwcm9iZV90cmFjZV9ldmVudCAqdGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2KTsKLQogLyogUmVsZWFzZSBldmVudCBjb250ZW50cyAqLwogZXh0ZXJuIHZvaWQgY2xlYXJfcGVyZl9wcm9iZV9ldmVudChzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2KTsKLWV4dGVybiB2b2lkIGNsZWFyX2twcm9iZV90cmFjZV9ldmVudChzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICp0ZXYpOwogCiAvKiBDb21tYW5kIHN0cmluZyB0byBsaW5lLXJhbmdlICovCiBleHRlcm4gaW50IHBhcnNlX2xpbmVfcmFuZ2VfZGVzYyhjb25zdCBjaGFyICpjbWQsIHN0cnVjdCBsaW5lX3JhbmdlICpscik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKaW5kZXggZDk2NGNiMS4uODQwZjFhYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImV2ZW50LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAic3ltYm9sLmgiCiAjaW5jbHVkZSAicHJvYmUtZmluZGVyLmgiCiAKIC8qIEtwcm9iZSB0cmFjZXIgYmFzaWMgdHlwZSBpcyB1cCB0byB1NjQgKi8KQEAgLTE0MywxMiArMTQ0LDIxIEBACiAJcmV0dXJuIHNyYzsKIH0KIAorLyogR2V0IERXX0FUX2NvbXBfZGlyIChzaG91bGQgYmUgTlVMTCB3aXRoIG9sZGVyIGdjYykgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjdV9nZXRfY29tcF9kaXIoRHdhcmZfRGllICpjdV9kaWUpCit7CisJRHdhcmZfQXR0cmlidXRlIGF0dHI7CisJaWYgKGR3YXJmX2F0dHIoY3VfZGllLCBEV19BVF9jb21wX2RpciwgJmF0dHIpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkd2FyZl9mb3Jtc3RyaW5nKCZhdHRyKTsKK30KKwogLyogQ29tcGFyZSBkaWVuYW1lIGFuZCB0bmFtZSAqLwogc3RhdGljIGJvb2wgZGllX2NvbXBhcmVfbmFtZShEd2FyZl9EaWUgKmR3X2RpZSwgY29uc3QgY2hhciAqdG5hbWUpCiB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAluYW1lID0gZHdhcmZfZGllbmFtZShkd19kaWUpOwotCXJldHVybiBuYW1lID8gc3RyY21wKHRuYW1lLCBuYW1lKSA6IC0xOworCXJldHVybiBuYW1lID8gKHN0cmNtcCh0bmFtZSwgbmFtZSkgPT0gMCkgOiBmYWxzZTsKIH0KIAogLyogR2V0IHR5cGUgZGllLCBidXQgc2tpcCBxdWFsaWZpZXJzIGFuZCB0eXBlZGVmICovCkBAIC0zMTksNyArMzI5LDcgQEAKIAl0YWcgPSBkd2FyZl90YWcoZGllX21lbSk7CiAJaWYgKCh0YWcgPT0gRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgfHwKIAkgICAgIHRhZyA9PSBEV19UQUdfdmFyaWFibGUpICYmCi0JICAgIChkaWVfY29tcGFyZV9uYW1lKGRpZV9tZW0sIG5hbWUpID09IDApKQorCSAgICBkaWVfY29tcGFyZV9uYW1lKGRpZV9tZW0sIG5hbWUpKQogCQlyZXR1cm4gRElFX0ZJTkRfQ0JfRk9VTkQ7CiAKIAlyZXR1cm4gRElFX0ZJTkRfQ0JfQ09OVElOVUU7CkBAIC0zMzgsNyArMzQ4LDcgQEAKIAljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKIAogCWlmICgoZHdhcmZfdGFnKGRpZV9tZW0pID09IERXX1RBR19tZW1iZXIpICYmCi0JICAgIChkaWVfY29tcGFyZV9uYW1lKGRpZV9tZW0sIG5hbWUpID09IDApKQorCSAgICBkaWVfY29tcGFyZV9uYW1lKGRpZV9tZW0sIG5hbWUpKQogCQlyZXR1cm4gRElFX0ZJTkRfQ0JfRk9VTkQ7CiAKIAlyZXR1cm4gRElFX0ZJTkRfQ0JfU0lCTElORzsKQEAgLTM1NiwxNCArMzY2LDUwIEBACiAgKiBQcm9iZSBmaW5kZXIgcmVsYXRlZCBmdW5jdGlvbnMKICAqLwogCi0vKiBTaG93IGEgbG9jYXRpb24gKi8KLXN0YXRpYyBpbnQgY29udmVydF9sb2NhdGlvbihEd2FyZl9PcCAqb3AsIHN0cnVjdCBwcm9iZV9maW5kZXIgKnBmKQorc3RhdGljIHN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmICphbGxvY190cmFjZV9hcmdfcmVmKGxvbmcgb2ZmcykKIHsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnX3JlZiAqcmVmOworCXJlZiA9IHphbGxvYyhzaXplb2Yoc3RydWN0IHByb2JlX3RyYWNlX2FyZ19yZWYpKTsKKwlpZiAocmVmICE9IE5VTEwpCisJCXJlZi0+b2Zmc2V0ID0gb2ZmczsKKwlyZXR1cm4gcmVmOworfQorCisvKiBTaG93IGEgbG9jYXRpb24gKi8KK3N0YXRpYyBpbnQgY29udmVydF92YXJpYWJsZV9sb2NhdGlvbihEd2FyZl9EaWUgKnZyX2RpZSwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCit7CisJRHdhcmZfQXR0cmlidXRlIGF0dHI7CisJRHdhcmZfT3AgKm9wOworCXNpemVfdCBub3BzOwogCXVuc2lnbmVkIGludCByZWduOwogCUR3YXJmX1dvcmQgb2ZmcyA9IDA7CiAJYm9vbCByZWYgPSBmYWxzZTsKIAljb25zdCBjaGFyICpyZWdzOwotCXN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnICp0dmFyID0gcGYtPnR2YXI7CisJc3RydWN0IHByb2JlX3RyYWNlX2FyZyAqdHZhciA9IHBmLT50dmFyOworCWludCByZXQ7CisKKwkvKiBUT0RPOiBoYW5kbGUgbW9yZSB0aGFuIDEgZXhwcnMgKi8KKwlpZiAoZHdhcmZfYXR0cih2cl9kaWUsIERXX0FUX2xvY2F0aW9uLCAmYXR0cikgPT0gTlVMTCB8fAorCSAgICBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyKCZhdHRyLCBwZi0+YWRkciwgJm9wLCAmbm9wcywgMSkgPD0gMCB8fAorCSAgICBub3BzID09IDApIHsKKwkJLyogVE9ETzogU3VwcG9ydCBjb25zdF92YWx1ZSAqLworCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiAlcyBhdCB0aGlzIGFkZHJlc3MuXG4iCisJCSAgICAgICAiIFBlcmhhcHMsIGl0IGhhcyBiZWVuIG9wdGltaXplZCBvdXQuXG4iLCBwZi0+cHZhci0+dmFyKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKG9wLT5hdG9tID09IERXX09QX2FkZHIpIHsKKwkJLyogU3RhdGljIHZhcmlhYmxlcyBvbiBtZW1vcnkgKG5vdCBzdGFjayksIG1ha2UgQHZhcm5hbWUgKi8KKwkJcmV0ID0gc3RybGVuKGR3YXJmX2RpZW5hbWUodnJfZGllKSk7CisJCXR2YXItPnZhbHVlID0gemFsbG9jKHJldCArIDIpOworCQlpZiAodHZhci0+dmFsdWUgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlzbnByaW50Zih0dmFyLT52YWx1ZSwgcmV0ICsgMiwgIkAlcyIsIGR3YXJmX2RpZW5hbWUodnJfZGllKSk7CisJCXR2YXItPnJlZiA9IGFsbG9jX3RyYWNlX2FyZ19yZWYoKGxvbmcpb2Zmcyk7CisJCWlmICh0dmFyLT5yZWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gMDsKKwl9CiAKIAkvKiBJZiB0aGlzIGlzIGJhc2VkIG9uIGZyYW1lIGJ1ZmZlciwgc2V0IHRoZSBvZmZzZXQgKi8KIAlpZiAob3AtPmF0b20gPT0gRFdfT1BfZmJyZWcpIHsKQEAgLTQwNSwyNyArNDUxLDcyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKHJlZikgewotCQl0dmFyLT5yZWYgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnX3JlZikpOworCQl0dmFyLT5yZWYgPSBhbGxvY190cmFjZV9hcmdfcmVmKChsb25nKW9mZnMpOwogCQlpZiAodHZhci0+cmVmID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJdHZhci0+cmVmLT5vZmZzZXQgPSAobG9uZylvZmZzOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjb252ZXJ0X3ZhcmlhYmxlX3R5cGUoRHdhcmZfRGllICp2cl9kaWUsCi0JCQkJIHN0cnVjdCBrcHJvYmVfdHJhY2VfYXJnICp0YXJnKQorCQkJCSBzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnICp0dmFyLAorCQkJCSBjb25zdCBjaGFyICpjYXN0KQogeworCXN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmICoqcmVmX3B0ciA9ICZ0dmFyLT5yZWY7CiAJRHdhcmZfRGllIHR5cGU7CiAJY2hhciBidWZbMTZdOwogCWludCByZXQ7CiAKKwkvKiBUT0RPOiBjaGVjayBhbGwgdHlwZXMgKi8KKwlpZiAoY2FzdCAmJiBzdHJjbXAoY2FzdCwgInN0cmluZyIpICE9IDApIHsKKwkJLyogTm9uIHN0cmluZyB0eXBlIGlzIE9LICovCisJCXR2YXItPnR5cGUgPSBzdHJkdXAoY2FzdCk7CisJCXJldHVybiAodHZhci0+dHlwZSA9PSBOVUxMKSA/IC1FTk9NRU0gOiAwOworCX0KKwogCWlmIChkaWVfZ2V0X3JlYWxfdHlwZSh2cl9kaWUsICZ0eXBlKSA9PSBOVUxMKSB7CiAJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBnZXQgYSB0eXBlIGluZm9ybWF0aW9uIG9mICVzLlxuIiwKIAkJCSAgIGR3YXJmX2RpZW5hbWUodnJfZGllKSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAorCXByX2RlYnVnKCIlcyB0eXBlIGlzICVzLlxuIiwKKwkJIGR3YXJmX2RpZW5hbWUodnJfZGllKSwgZHdhcmZfZGllbmFtZSgmdHlwZSkpOworCisJaWYgKGNhc3QgJiYgc3RyY21wKGNhc3QsICJzdHJpbmciKSA9PSAwKSB7CS8qIFN0cmluZyB0eXBlICovCisJCXJldCA9IGR3YXJmX3RhZygmdHlwZSk7CisJCWlmIChyZXQgIT0gRFdfVEFHX3BvaW50ZXJfdHlwZSAmJgorCQkgICAgcmV0ICE9IERXX1RBR19hcnJheV90eXBlKSB7CisJCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gY2FzdCBpbnRvIHN0cmluZzogIgorCQkJCSAgICIlcyglcykgaXMgbm90IGEgcG9pbnRlciBub3IgYXJyYXkuIiwKKwkJCQkgICBkd2FyZl9kaWVuYW1lKHZyX2RpZSksIGR3YXJmX2RpZW5hbWUoJnR5cGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChyZXQgPT0gRFdfVEFHX3BvaW50ZXJfdHlwZSkgeworCQkJaWYgKGRpZV9nZXRfcmVhbF90eXBlKCZ0eXBlLCAmdHlwZSkgPT0gTlVMTCkgeworCQkJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBnZXQgYSB0eXBlIGluZm9ybWF0aW9uLiIpOworCQkJCXJldHVybiAtRU5PRU5UOworCQkJfQorCQkJd2hpbGUgKCpyZWZfcHRyKQorCQkJCXJlZl9wdHIgPSAmKCpyZWZfcHRyKS0+bmV4dDsKKwkJCS8qIEFkZCBuZXcgcmVmZXJlbmNlIHdpdGggb2Zmc2V0ICswICovCisJCQkqcmVmX3B0ciA9IHphbGxvYyhzaXplb2Yoc3RydWN0IHByb2JlX3RyYWNlX2FyZ19yZWYpKTsKKwkJCWlmICgqcmVmX3B0ciA9PSBOVUxMKSB7CisJCQkJcHJfd2FybmluZygiT3V0IG9mIG1lbW9yeSBlcnJvclxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwkJaWYgKCFkaWVfY29tcGFyZV9uYW1lKCZ0eXBlLCAiY2hhciIpICYmCisJCSAgICAhZGllX2NvbXBhcmVfbmFtZSgmdHlwZSwgInVuc2lnbmVkIGNoYXIiKSkgeworCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIGNhc3QgaW50byBzdHJpbmc6ICIKKwkJCQkgICAiJXMgaXMgbm90ICh1bnNpZ25lZCkgY2hhciAqLiIsCisJCQkJICAgZHdhcmZfZGllbmFtZSh2cl9kaWUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXR2YXItPnR5cGUgPSBzdHJkdXAoY2FzdCk7CisJCXJldHVybiAodHZhci0+dHlwZSA9PSBOVUxMKSA/IC1FTk9NRU0gOiAwOworCX0KKwogCXJldCA9IGRpZV9nZXRfYnl0ZV9zaXplKCZ0eXBlKSAqIDg7CiAJaWYgKHJldCkgewogCQkvKiBDaGVjayB0aGUgYml0d2lkdGggKi8KQEAgLTQ0NSw4ICs1MzYsOCBAQAogCQkJCSAgIHN0cmVycm9yKC1yZXQpKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJdGFyZy0+dHlwZSA9IHN0cmR1cChidWYpOwotCQlpZiAodGFyZy0+dHlwZSA9PSBOVUxMKQorCQl0dmFyLT50eXBlID0gc3RyZHVwKGJ1Zik7CisJCWlmICh0dmFyLT50eXBlID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcmV0dXJuIDA7CkBAIC00NTQsMjIgKzU0NSw1MCBAQAogCiBzdGF0aWMgaW50IGNvbnZlcnRfdmFyaWFibGVfZmllbGRzKER3YXJmX0RpZSAqdnJfZGllLCBjb25zdCBjaGFyICp2YXJuYW1lLAogCQkJCSAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9hcmdfZmllbGQgKmZpZWxkLAotCQkJCSAgICBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2FyZ19yZWYgKipyZWZfcHRyLAorCQkJCSAgICBzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnX3JlZiAqKnJlZl9wdHIsCiAJCQkJICAgIER3YXJmX0RpZSAqZGllX21lbSkKIHsKLQlzdHJ1Y3Qga3Byb2JlX3RyYWNlX2FyZ19yZWYgKnJlZiA9ICpyZWZfcHRyOworCXN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmICpyZWYgPSAqcmVmX3B0cjsKIAlEd2FyZl9EaWUgdHlwZTsKIAlEd2FyZl9Xb3JkIG9mZnM7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCB0YWc7CiAKIAlwcl9kZWJ1ZygiY29udmVydGluZyAlcyBpbiAlc1xuIiwgZmllbGQtPm5hbWUsIHZhcm5hbWUpOwogCWlmIChkaWVfZ2V0X3JlYWxfdHlwZSh2cl9kaWUsICZ0eXBlKSA9PSBOVUxMKSB7CiAJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBnZXQgdGhlIHR5cGUgb2YgJXMuXG4iLCB2YXJuYW1lKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQorCXByX2RlYnVnMigiVmFyIHJlYWwgdHlwZTogKCV4KVxuIiwgKHVuc2lnbmVkKWR3YXJmX2RpZW9mZnNldCgmdHlwZSkpOworCXRhZyA9IGR3YXJmX3RhZygmdHlwZSk7CiAKLQkvKiBDaGVjayB0aGUgcG9pbnRlciBhbmQgZGVyZWZlcmVuY2UgKi8KLQlpZiAoZHdhcmZfdGFnKCZ0eXBlKSA9PSBEV19UQUdfcG9pbnRlcl90eXBlKSB7CisJaWYgKGZpZWxkLT5uYW1lWzBdID09ICdbJyAmJgorCSAgICAodGFnID09IERXX1RBR19hcnJheV90eXBlIHx8IHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlKSkgeworCQlpZiAoZmllbGQtPm5leHQpCisJCQkvKiBTYXZlIG9yaWdpbmFsIHR5cGUgZm9yIG5leHQgZmllbGQgKi8KKwkJCW1lbWNweShkaWVfbWVtLCAmdHlwZSwgc2l6ZW9mKCpkaWVfbWVtKSk7CisJCS8qIEdldCB0aGUgdHlwZSBvZiB0aGlzIGFycmF5ICovCisJCWlmIChkaWVfZ2V0X3JlYWxfdHlwZSgmdHlwZSwgJnR5cGUpID09IE5VTEwpIHsKKwkJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBnZXQgdGhlIHR5cGUgb2YgJXMuXG4iLCB2YXJuYW1lKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCXByX2RlYnVnMigiQXJyYXkgcmVhbCB0eXBlOiAoJXgpXG4iLAorCQkJICh1bnNpZ25lZClkd2FyZl9kaWVvZmZzZXQoJnR5cGUpKTsKKwkJaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlKSB7CisJCQlyZWYgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmKSk7CisJCQlpZiAocmVmID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpZiAoKnJlZl9wdHIpCisJCQkJKCpyZWZfcHRyKS0+bmV4dCA9IHJlZjsKKwkJCWVsc2UKKwkJCQkqcmVmX3B0ciA9IHJlZjsKKwkJfQorCQlyZWYtPm9mZnNldCArPSBkaWVfZ2V0X2J5dGVfc2l6ZSgmdHlwZSkgKiBmaWVsZC0+aW5kZXg7CisJCWlmICghZmllbGQtPm5leHQpCisJCQkvKiBTYXZlIHZyX2RpZSBmb3IgY29udmVydGluZyB0eXBlcyAqLworCQkJbWVtY3B5KGRpZV9tZW0sIHZyX2RpZSwgc2l6ZW9mKCpkaWVfbWVtKSk7CisJCWdvdG8gbmV4dDsKKwl9IGVsc2UgaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlKSB7CisJCS8qIENoZWNrIHRoZSBwb2ludGVyIGFuZCBkZXJlZmVyZW5jZSAqLwogCQlpZiAoIWZpZWxkLT5yZWYpIHsKIAkJCXByX2VycigiU2VtYW50aWMgZXJyb3I6ICVzIG11c3QgYmUgcmVmZXJyZWQgYnkgJy0+J1xuIiwKIAkJCSAgICAgICBmaWVsZC0+bmFtZSk7CkBAIC00ODYsNyArNjA1LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJcmVmID0gemFsbG9jKHNpemVvZihzdHJ1Y3Qga3Byb2JlX3RyYWNlX2FyZ19yZWYpKTsKKwkJcmVmID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnX3JlZikpOwogCQlpZiAocmVmID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaWYgKCpyZWZfcHRyKQpAQCAtNDk1LDEwICs2MTQsMTUgQEAKIAkJCSpyZWZfcHRyID0gcmVmOwogCX0gZWxzZSB7CiAJCS8qIFZlcmlmeSBpdCBpcyBhIGRhdGEgc3RydWN0dXJlICAqLwotCQlpZiAoZHdhcmZfdGFnKCZ0eXBlKSAhPSBEV19UQUdfc3RydWN0dXJlX3R5cGUpIHsKKwkJaWYgKHRhZyAhPSBEV19UQUdfc3RydWN0dXJlX3R5cGUpIHsKIAkJCXByX3dhcm5pbmcoIiVzIGlzIG5vdCBhIGRhdGEgc3RydWN0dXJlLlxuIiwgdmFybmFtZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQlpZiAoZmllbGQtPm5hbWVbMF0gPT0gJ1snKSB7CisJCQlwcl9lcnIoIlNlbWFudGljIGVycm9yOiAlcyBpcyBub3QgYSBwb2ludG9yIG5vciBhcnJheS4iLAorCQkJICAgICAgIHZhcm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJaWYgKGZpZWxkLT5yZWYpIHsKIAkJCXByX2VycigiU2VtYW50aWMgZXJyb3I6ICVzIG11c3QgYmUgcmVmZXJyZWQgYnkgJy4nXG4iLAogCQkJICAgICAgIGZpZWxkLT5uYW1lKTsKQEAgLTUyNSw2ICs2NDksNyBAQAogCX0KIAlyZWYtPm9mZnNldCArPSAobG9uZylvZmZzOwogCituZXh0OgogCS8qIENvbnZlcnRpbmcgbmV4dCBmaWVsZCAqLwogCWlmIChmaWVsZC0+bmV4dCkKIAkJcmV0dXJuIGNvbnZlcnRfdmFyaWFibGVfZmllbGRzKGRpZV9tZW0sIGZpZWxkLT5uYW1lLApAQCAtNTM2LDUxICs2NjEsMzIgQEAKIC8qIFNob3cgYSB2YXJpYWJsZXMgaW4ga3Byb2JlIGV2ZW50IGZvcm1hdCAqLwogc3RhdGljIGludCBjb252ZXJ0X3ZhcmlhYmxlKER3YXJmX0RpZSAqdnJfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikKIHsKLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKIAlEd2FyZl9EaWUgZGllX21lbTsKLQlEd2FyZl9PcCAqZXhwcjsKLQlzaXplX3QgbmV4cHI7CiAJaW50IHJldDsKIAotCWlmIChkd2FyZl9hdHRyKHZyX2RpZSwgRFdfQVRfbG9jYXRpb24sICZhdHRyKSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCS8qIFRPRE86IGhhbmRsZSBtb3JlIHRoYW4gMSBleHBycyAqLwotCXJldCA9IGR3YXJmX2dldGxvY2F0aW9uX2FkZHIoJmF0dHIsIHBmLT5hZGRyLCAmZXhwciwgJm5leHByLCAxKTsKLQlpZiAocmV0IDw9IDAgfHwgbmV4cHIgPT0gMCkKLQkJZ290byBlcnJvcjsKKwlwcl9kZWJ1ZygiQ29udmVydGluZyB2YXJpYWJsZSAlcyBpbnRvIHRyYWNlIGV2ZW50LlxuIiwKKwkJIGR3YXJmX2RpZW5hbWUodnJfZGllKSk7CiAKLQlyZXQgPSBjb252ZXJ0X2xvY2F0aW9uKGV4cHIsIHBmKTsKKwlyZXQgPSBjb252ZXJ0X3ZhcmlhYmxlX2xvY2F0aW9uKHZyX2RpZSwgcGYpOwogCWlmIChyZXQgPT0gMCAmJiBwZi0+cHZhci0+ZmllbGQpIHsKIAkJcmV0ID0gY29udmVydF92YXJpYWJsZV9maWVsZHModnJfZGllLCBwZi0+cHZhci0+dmFyLAogCQkJCQkgICAgICBwZi0+cHZhci0+ZmllbGQsICZwZi0+dHZhci0+cmVmLAogCQkJCQkgICAgICAmZGllX21lbSk7CiAJCXZyX2RpZSA9ICZkaWVfbWVtOwogCX0KLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKHBmLT5wdmFyLT50eXBlKSB7Ci0JCQlwZi0+dHZhci0+dHlwZSA9IHN0cmR1cChwZi0+cHZhci0+dHlwZSk7Ci0JCQlpZiAocGYtPnR2YXItPnR5cGUgPT0gTlVMTCkKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQl9IGVsc2UKLQkJCXJldCA9IGNvbnZlcnRfdmFyaWFibGVfdHlwZSh2cl9kaWUsIHBmLT50dmFyKTsKLQl9CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjb252ZXJ0X3ZhcmlhYmxlX3R5cGUodnJfZGllLCBwZi0+dHZhciwgcGYtPnB2YXItPnR5cGUpOwogCS8qICpleHByIHdpbGwgYmUgY2FjaGVkIGluIGxpYmR3LiBEb24ndCBmcmVlIGl0LiAqLwogCXJldHVybiByZXQ7Ci1lcnJvcjoKLQkvKiBUT0RPOiBTdXBwb3J0IGNvbnN0X3ZhbHVlICovCi0JcHJfZXJyKCJGYWlsZWQgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgJXMgYXQgdGhpcyBhZGRyZXNzLlxuIgotCSAgICAgICAiIFBlcmhhcHMsIGl0IGhhcyBiZWVuIG9wdGltaXplZCBvdXQuXG4iLCBwZi0+cHZhci0+dmFyKTsKLQlyZXR1cm4gLUVOT0VOVDsKIH0KIAogLyogRmluZCBhIHZhcmlhYmxlIGluIGEgc3VicHJvZ3JhbSBkaWUgKi8KIHN0YXRpYyBpbnQgZmluZF92YXJpYWJsZShEd2FyZl9EaWUgKnNwX2RpZSwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCiB7Ci0JRHdhcmZfRGllIHZyX2RpZTsKKwlEd2FyZl9EaWUgdnJfZGllLCAqc2NvcGVzOwogCWNoYXIgYnVmWzMyXSwgKnB0cjsKLQlpbnQgcmV0OworCWludCByZXQsIG5zY29wZXM7CiAKLQkvKiBUT0RPOiBTdXBwb3J0IGFycmF5cyAqLwogCWlmIChwZi0+cHZhci0+bmFtZSkKIAkJcGYtPnR2YXItPm5hbWUgPSBzdHJkdXAocGYtPnB2YXItPm5hbWUpOwogCWVsc2UgewpAQCAtNjA3LDE4ICs3MTMsMzIgQEAKIAlwcl9kZWJ1ZygiU2VhcmNoaW5nICclcycgdmFyaWFibGUgaW4gY29udGV4dC5cbiIsCiAJCSBwZi0+cHZhci0+dmFyKTsKIAkvKiBTZWFyY2ggY2hpbGQgZGllIGZvciBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMuICovCi0JaWYgKCFkaWVfZmluZF92YXJpYWJsZShzcF9kaWUsIHBmLT5wdmFyLT52YXIsICZ2cl9kaWUpKSB7CisJaWYgKGRpZV9maW5kX3ZhcmlhYmxlKHNwX2RpZSwgcGYtPnB2YXItPnZhciwgJnZyX2RpZSkpCisJCXJldCA9IGNvbnZlcnRfdmFyaWFibGUoJnZyX2RpZSwgcGYpOworCWVsc2UgeworCQkvKiBTZWFyY2ggdXBwZXIgY2xhc3MgKi8KKwkJbnNjb3BlcyA9IGR3YXJmX2dldHNjb3Blc19kaWUoc3BfZGllLCAmc2NvcGVzKTsKKwkJaWYgKG5zY29wZXMgPiAwKSB7CisJCQlyZXQgPSBkd2FyZl9nZXRzY29wZXZhcihzY29wZXMsIG5zY29wZXMsIHBmLT5wdmFyLT52YXIsCisJCQkJCQkwLCBOVUxMLCAwLCAwLCAmdnJfZGllKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXQgPSBjb252ZXJ0X3ZhcmlhYmxlKCZ2cl9kaWUsIHBmKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRU5PRU5UOworCQkJZnJlZShzY29wZXMpOworCQl9IGVsc2UKKwkJCXJldCA9IC1FTk9FTlQ7CisJfQorCWlmIChyZXQgPCAwKQogCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gZmluZCAnJXMnIGluIHRoaXMgZnVuY3Rpb24uXG4iLAogCQkJICAgcGYtPnB2YXItPnZhcik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQlyZXR1cm4gY29udmVydF92YXJpYWJsZSgmdnJfZGllLCBwZik7CisJcmV0dXJuIHJldDsKIH0KIAogLyogU2hvdyBhIHByb2JlIHBvaW50IHRvIG91dHB1dCBidWZmZXIgKi8KIHN0YXRpYyBpbnQgY29udmVydF9wcm9iZV9wb2ludChEd2FyZl9EaWUgKnNwX2RpZSwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCiB7Ci0Jc3RydWN0IGtwcm9iZV90cmFjZV9ldmVudCAqdGV2OworCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2OwogCUR3YXJmX0FkZHIgZWFkZHI7CiAJRHdhcmZfRGllIGRpZV9tZW07CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTY4Myw3ICs4MDMsNyBAQAogCiAJLyogRmluZCBlYWNoIGFyZ3VtZW50ICovCiAJdGV2LT5uYXJncyA9IHBmLT5wZXYtPm5hcmdzOwotCXRldi0+YXJncyA9IHphbGxvYyhzaXplb2Yoc3RydWN0IGtwcm9iZV90cmFjZV9hcmcpICogdGV2LT5uYXJncyk7CisJdGV2LT5hcmdzID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnKSAqIHRldi0+bmFyZ3MpOwogCWlmICh0ZXYtPmFyZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZm9yIChpID0gMDsgaSA8IHBmLT5wZXYtPm5hcmdzOyBpKyspIHsKQEAgLTg5Nyw3ICsxMDE3LDcgQEAKIAogCS8qIENoZWNrIHRhZyBhbmQgZGllbmFtZSAqLwogCWlmIChkd2FyZl90YWcoc3BfZGllKSAhPSBEV19UQUdfc3VicHJvZ3JhbSB8fAotCSAgICBkaWVfY29tcGFyZV9uYW1lKHNwX2RpZSwgcHAtPmZ1bmN0aW9uKSAhPSAwKQorCSAgICAhZGllX2NvbXBhcmVfbmFtZShzcF9kaWUsIHBwLT5mdW5jdGlvbikpCiAJCXJldHVybiBEV0FSRl9DQl9PSzsKIAogCXBmLT5mbmFtZSA9IGR3YXJmX2RlY2xfZmlsZShzcF9kaWUpOwpAQCAtOTQwLDkgKzEwNjAsOSBAQAogCXJldHVybiBfcGFyYW0ucmV0dmFsOwogfQogCi0vKiBGaW5kIGtwcm9iZV90cmFjZV9ldmVudHMgc3BlY2lmaWVkIGJ5IHBlcmZfcHJvYmVfZXZlbnQgZnJvbSBkZWJ1Z2luZm8gKi8KLWludCBmaW5kX2twcm9iZV90cmFjZV9ldmVudHMoaW50IGZkLCBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJICAgICBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywgaW50IG1heF90ZXZzKQorLyogRmluZCBwcm9iZV90cmFjZV9ldmVudHMgc3BlY2lmaWVkIGJ5IHBlcmZfcHJvYmVfZXZlbnQgZnJvbSBkZWJ1Z2luZm8gKi8KK2ludCBmaW5kX3Byb2JlX3RyYWNlX2V2ZW50cyhpbnQgZmQsIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCisJCQkgICAgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsIGludCBtYXhfdGV2cykKIHsKIAlzdHJ1Y3QgcHJvYmVfZmluZGVyIHBmID0gey5wZXYgPSBwZXYsIC5tYXhfdGV2cyA9IG1heF90ZXZzfTsKIAlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgPSAmcGV2LT5wb2ludDsKQEAgLTk1Miw3ICsxMDcyLDcgQEAKIAlEd2FyZiAqZGJnOwogCWludCByZXQgPSAwOwogCi0JcGYudGV2cyA9IHphbGxvYyhzaXplb2Yoc3RydWN0IGtwcm9iZV90cmFjZV9ldmVudCkgKiBtYXhfdGV2cyk7CisJcGYudGV2cyA9IHphbGxvYyhzaXplb2Yoc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50KSAqIG1heF90ZXZzKTsKIAlpZiAocGYudGV2cyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAkqdGV2cyA9IHBmLnRldnM7CkBAIC0xMDk2LDcgKzEyMTYsNyBAQAogc3RhdGljIGludCBsaW5lX3JhbmdlX2FkZF9saW5lKGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgaW50IGxpbmVubywKIAkJCSAgICAgICBzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpCiB7Ci0JLyogQ29weSByZWFsIHBhdGggKi8KKwkvKiBDb3B5IHNvdXJjZSBwYXRoICovCiAJaWYgKCFsci0+cGF0aCkgewogCQlsci0+cGF0aCA9IHN0cmR1cChzcmMpOwogCQlpZiAobHItPnBhdGggPT0gTlVMTCkKQEAgLTEyMjAsNyArMTM0MCw3IEBACiAJc3RydWN0IGxpbmVfcmFuZ2UgKmxyID0gbGYtPmxyOwogCiAJaWYgKGR3YXJmX3RhZyhzcF9kaWUpID09IERXX1RBR19zdWJwcm9ncmFtICYmCi0JICAgIGRpZV9jb21wYXJlX25hbWUoc3BfZGllLCBsci0+ZnVuY3Rpb24pID09IDApIHsKKwkgICAgZGllX2NvbXBhcmVfbmFtZShzcF9kaWUsIGxyLT5mdW5jdGlvbikpIHsKIAkJbGYtPmZuYW1lID0gZHdhcmZfZGVjbF9maWxlKHNwX2RpZSk7CiAJCWR3YXJmX2RlY2xfbGluZShzcF9kaWUsICZsci0+b2Zmc2V0KTsKIAkJcHJfZGVidWcoImZuYW1lOiAlcywgbGluZW5vOiVkXG4iLCBsZi0+Zm5hbWUsIGxyLT5vZmZzZXQpOwpAQCAtMTI2Myw2ICsxMzgzLDcgQEAKIAlzaXplX3QgY3VobDsKIAlEd2FyZl9EaWUgKmRpZXA7CiAJRHdhcmYgKmRiZzsKKwljb25zdCBjaGFyICpjb21wX2RpcjsKIAogCWRiZyA9IGR3YXJmX2JlZ2luKGZkLCBEV0FSRl9DX1JFQUQpOwogCWlmICghZGJnKSB7CkBAIC0xMjk4LDcgKzE0MTksMTggQEAKIAkJfQogCQlvZmYgPSBub2ZmOwogCX0KLQlwcl9kZWJ1ZygicGF0aDogJWx4XG4iLCAodW5zaWduZWQgbG9uZylsci0+cGF0aCk7CisKKwkvKiBTdG9yZSBjb21wX2RpciAqLworCWlmIChsZi5mb3VuZCkgeworCQljb21wX2RpciA9IGN1X2dldF9jb21wX2RpcigmbGYuY3VfZGllKTsKKwkJaWYgKGNvbXBfZGlyKSB7CisJCQlsci0+Y29tcF9kaXIgPSBzdHJkdXAoY29tcF9kaXIpOworCQkJaWYgKCFsci0+Y29tcF9kaXIpCisJCQkJcmV0ID0gLUVOT01FTTsKKwkJfQorCX0KKworCXByX2RlYnVnKCJwYXRoOiAlc1xuIiwgbHItPnBhdGgpOwogCWR3YXJmX2VuZChkYmcpOwogCiAJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IGxmLmZvdW5kOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCmluZGV4IGUxZjYxZGMuLjQ1MDdkNTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKQEAgLTE2LDkgKzE2LDkgQEAKIH0KIAogI2lmZGVmIERXQVJGX1NVUFBPUlQKLS8qIEZpbmQga3Byb2JlX3RyYWNlX2V2ZW50cyBzcGVjaWZpZWQgYnkgcGVyZl9wcm9iZV9ldmVudCBmcm9tIGRlYnVnaW5mbyAqLwotZXh0ZXJuIGludCBmaW5kX2twcm9iZV90cmFjZV9ldmVudHMoaW50IGZkLCBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJCSAgICBzdHJ1Y3Qga3Byb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKKy8qIEZpbmQgcHJvYmVfdHJhY2VfZXZlbnRzIHNwZWNpZmllZCBieSBwZXJmX3Byb2JlX2V2ZW50IGZyb20gZGVidWdpbmZvICovCitleHRlcm4gaW50IGZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzKGludCBmZCwgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQkgICAgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKIAkJCQkgICAgaW50IG1heF90ZXZzKTsKIAogLyogRmluZCBhIHBlcmZfcHJvYmVfcG9pbnQgZnJvbSBkZWJ1Z2luZm8gKi8KQEAgLTMzLDcgKzMzLDcgQEAKIAogc3RydWN0IHByb2JlX2ZpbmRlciB7CiAJc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQJKnBldjsJCS8qIFRhcmdldCBwcm9iZSBldmVudCAqLwotCXN0cnVjdCBrcHJvYmVfdHJhY2VfZXZlbnQgKnRldnM7CS8qIFJlc3VsdCB0cmFjZSBldmVudHMgKi8KKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnM7CQkvKiBSZXN1bHQgdHJhY2UgZXZlbnRzICovCiAJaW50CQkJbnRldnM7CQkvKiBOdW1iZXIgb2YgdHJhY2UgZXZlbnRzICovCiAJaW50CQkJbWF4X3RldnM7CS8qIE1heCBudW1iZXIgb2YgdHJhY2UgZXZlbnRzICovCiAKQEAgLTUwLDcgKzUwLDcgQEAKICNlbmRpZgogCUR3YXJmX09wCQkqZmJfb3BzOwkvKiBGcmFtZSBiYXNlIGF0dHJpYnV0ZSAqLwogCXN0cnVjdCBwZXJmX3Byb2JlX2FyZwkqcHZhcjsJCS8qIEN1cnJlbnQgdGFyZ2V0IHZhcmlhYmxlICovCi0Jc3RydWN0IGtwcm9iZV90cmFjZV9hcmcJKnR2YXI7CQkvKiBDdXJyZW50IHJlc3VsdCB2YXJpYWJsZSAqLworCXN0cnVjdCBwcm9iZV90cmFjZV9hcmcJKnR2YXI7CQkvKiBDdXJyZW50IHJlc3VsdCB2YXJpYWJsZSAqLwogfTsKIAogc3RydWN0IGxpbmVfZmluZGVyIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCmluZGV4IGM0MjJjZDYuLmZhOWQ2NTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwpAQCAtMjcsOCArMjcsMTAgQEAKIAogCXNlbGYtPmZkID0gb3BlbihzZWxmLT5maWxlbmFtZSwgT19SRE9OTFkpOwogCWlmIChzZWxmLT5mZCA8IDApIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gb3BlbiBmaWxlOiAlcyIsIHNlbGYtPmZpbGVuYW1lKTsKLQkJaWYgKCFzdHJjbXAoc2VsZi0+ZmlsZW5hbWUsICJwZXJmLmRhdGEiKSkKKwkJaW50IGVyciA9IGVycm5vOworCisJCXByX2VycigiZmFpbGVkIHRvIG9wZW4gJXM6ICVzIiwgc2VsZi0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycikpOworCQlpZiAoZXJyID09IEVOT0VOVCAmJiAhc3RyY21wKHNlbGYtPmZpbGVuYW1lLCAicGVyZi5kYXRhIikpCiAJCQlwcl9lcnIoIiAgKHRyeSAncGVyZiByZWNvcmQnIGZpcnN0KSIpOwogCQlwcl9lcnIoIlxuIik7CiAJCXJldHVybiAtZXJybm87CkBAIC03Nyw2ICs3OSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHBlcmZfc2Vzc2lvbl9fZGVzdHJveV9rZXJuZWxfbWFwcyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQoreworCW1hY2hpbmVfX2Rlc3Ryb3lfa2VybmVsX21hcHMoJnNlbGYtPmhvc3RfbWFjaGluZSk7CisJbWFjaGluZXNfX2Rlc3Ryb3lfZ3Vlc3Rfa2VybmVsX21hcHMoJnNlbGYtPm1hY2hpbmVzKTsKK30KKwogc3RydWN0IHBlcmZfc2Vzc2lvbiAqcGVyZl9zZXNzaW9uX19uZXcoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBtb2RlLCBib29sIGZvcmNlLCBib29sIHJlcGlwZSkKIHsKIAlzaXplX3QgbGVuID0gZmlsZW5hbWUgPyBzdHJsZW4oZmlsZW5hbWUpICsgMSA6IDA7CkBAIC05NCw4ICsxMDIsNiBAQAogCXNlbGYtPmhpc3RzX3RyZWUgPSBSQl9ST09UOwogCXNlbGYtPmxhc3RfbWF0Y2ggPSBOVUxMOwogCXNlbGYtPm1tYXBfd2luZG93ID0gMzI7Ci0Jc2VsZi0+Y3dkID0gTlVMTDsKLQlzZWxmLT5jd2RsZW4gPSAwOwogCXNlbGYtPm1hY2hpbmVzID0gUkJfUk9PVDsKIAlzZWxmLT5yZXBpcGUgPSByZXBpcGU7CiAJSU5JVF9MSVNUX0hFQUQoJnNlbGYtPm9yZGVyZWRfc2FtcGxlcy5zYW1wbGVzX2hlYWQpOwpAQCAtMTI0LDE2ICsxMzAsNDMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19kZWxldGVfZGVhZF90aHJlYWRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpCit7CisJc3RydWN0IHRocmVhZCAqbiwgKnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodCwgbiwgJnNlbGYtPmRlYWRfdGhyZWFkcywgbm9kZSkgeworCQlsaXN0X2RlbCgmdC0+bm9kZSk7CisJCXRocmVhZF9fZGVsZXRlKHQpOworCX0KK30KKworc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19kZWxldGVfdGhyZWFkcyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQoreworCXN0cnVjdCByYl9ub2RlICpuZCA9IHJiX2ZpcnN0KCZzZWxmLT50aHJlYWRzKTsKKworCXdoaWxlIChuZCkgeworCQlzdHJ1Y3QgdGhyZWFkICp0ID0gcmJfZW50cnkobmQsIHN0cnVjdCB0aHJlYWQsIHJiX25vZGUpOworCisJCXJiX2VyYXNlKCZ0LT5yYl9ub2RlLCAmc2VsZi0+dGhyZWFkcyk7CisJCW5kID0gcmJfbmV4dChuZCk7CisJCXRocmVhZF9fZGVsZXRlKHQpOworCX0KK30KKwogdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQogewogCXBlcmZfaGVhZGVyX19leGl0KCZzZWxmLT5oZWFkZXIpOworCXBlcmZfc2Vzc2lvbl9fZGVzdHJveV9rZXJuZWxfbWFwcyhzZWxmKTsKKwlwZXJmX3Nlc3Npb25fX2RlbGV0ZV9kZWFkX3RocmVhZHMoc2VsZik7CisJcGVyZl9zZXNzaW9uX19kZWxldGVfdGhyZWFkcyhzZWxmKTsKKwltYWNoaW5lX19leGl0KCZzZWxmLT5ob3N0X21hY2hpbmUpOwogCWNsb3NlKHNlbGYtPmZkKTsKLQlmcmVlKHNlbGYtPmN3ZCk7CiAJZnJlZShzZWxmKTsKIH0KIAogdm9pZCBwZXJmX3Nlc3Npb25fX3JlbW92ZV90aHJlYWQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwgc3RydWN0IHRocmVhZCAqdGgpCiB7CisJc2VsZi0+bGFzdF9tYXRjaCA9IE5VTEw7CiAJcmJfZXJhc2UoJnRoLT5yYl9ub2RlLCAmc2VsZi0+dGhyZWFkcyk7CiAJLyoKIAkgKiBXZSBtYXkgaGF2ZSByZWZlcmVuY2VzIHRvIHRoaXMgdGhyZWFkLCBmb3IgaW5zdGFuY2UgaW4gc29tZSBoaXN0X2VudHJ5CkBAIC04MzAsMjMgKzg2Myw2IEBACiAJaWYgKHBlcmZfc2Vzc2lvbl9fcmVnaXN0ZXJfaWRsZV90aHJlYWQoc2VsZikgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIXN5bWJvbF9jb25mLmZ1bGxfcGF0aHMpIHsKLQkJY2hhciBiZltQQVRIX01BWF07Ci0KLQkJaWYgKGdldGN3ZChiZiwgc2l6ZW9mKGJmKSkgPT0gTlVMTCkgewotCQkJZXJyID0gLWVycm5vOwotb3V0X2dldGN3ZF9lcnI6Ci0JCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4iKTsKLQkJCWdvdG8gb3V0X2VycjsKLQkJfQotCQlzZWxmLT5jd2QgPSBzdHJkdXAoYmYpOwotCQlpZiAoc2VsZi0+Y3dkID09IE5VTEwpIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9nZXRjd2RfZXJyOwotCQl9Ci0JCXNlbGYtPmN3ZGxlbiA9IHN0cmxlbihzZWxmLT5jd2QpOwotCX0KLQogCWlmICghc2VsZi0+ZmRfcGlwZSkKIAkJZXJyID0gX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlbGYsCiAJCQkJCQkgICAgIHNlbGYtPmhlYWRlci5kYXRhX29mZnNldCwKQEAgLTg1NCw3ICs4NzAsNyBAQAogCQkJCQkJICAgICBzZWxmLT5zaXplLCBvcHMpOwogCWVsc2UKIAkJZXJyID0gX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfcGlwZV9ldmVudHMoc2VsZiwgb3BzKTsKLW91dF9lcnI6CisKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc29ydC5jIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuYwppbmRleCAyMzE2Y2I1Li4xYzYxYTRmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc29ydC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSAic29ydC5oIgorI2luY2x1ZGUgImhpc3QuaCIKIAogcmVnZXhfdAkJcGFyZW50X3JlZ2V4OwogY29uc3QgY2hhcglkZWZhdWx0X3BhcmVudF9wYXR0ZXJuW10gPSAiXnN5c198XmRvX3BhZ2VfZmF1bHQiOwpAQCAtMTAsMTAgKzExLDYgQEAKIAogZW51bSBzb3J0X3R5cGUJc29ydF9fZmlyc3RfZGltZW5zaW9uOwogCi11bnNpZ25lZCBpbnQgZHNvc19fY29sX3dpZHRoOwotdW5zaWduZWQgaW50IGNvbW1zX19jb2xfd2lkdGg7Ci11bnNpZ25lZCBpbnQgdGhyZWFkc19fY29sX3dpZHRoOwotc3RhdGljIHVuc2lnbmVkIGludCBwYXJlbnRfc3ltYm9sX19jb2xfd2lkdGg7CiBjaGFyICogZmllbGRfc2VwOwogCiBMSVNUX0hFQUQoaGlzdF9lbnRyeV9fc29ydF9saXN0KTsKQEAgLTI4LDEyICsyNSwxNCBAQAogCQkJCSAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHdpZHRoKTsKIHN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fcGFyZW50X3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBjaGFyICpiZiwKIAkJCQkgICAgICAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB3aWR0aCk7CitzdGF0aWMgaW50IGhpc3RfZW50cnlfX2NwdV9zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwgY2hhciAqYmYsCisJCQkJICAgIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgd2lkdGgpOwogCiBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3RocmVhZCA9IHsKIAkuc2VfaGVhZGVyCT0gIkNvbW1hbmQ6ICBQaWQiLAogCS5zZV9jbXAJCT0gc29ydF9fdGhyZWFkX2NtcCwKIAkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X190aHJlYWRfc25wcmludGYsCi0JLnNlX3dpZHRoCT0gJnRocmVhZHNfX2NvbF93aWR0aCwKKwkuc2Vfd2lkdGhfaWR4CT0gSElTVENfVEhSRUFELAogfTsKIAogc3RydWN0IHNvcnRfZW50cnkgc29ydF9jb21tID0gewpAQCAtNDEsMjcgKzQwLDM1IEBACiAJLnNlX2NtcAkJPSBzb3J0X19jb21tX2NtcCwKIAkuc2VfY29sbGFwc2UJPSBzb3J0X19jb21tX2NvbGxhcHNlLAogCS5zZV9zbnByaW50Zgk9IGhpc3RfZW50cnlfX2NvbW1fc25wcmludGYsCi0JLnNlX3dpZHRoCT0gJmNvbW1zX19jb2xfd2lkdGgsCisJLnNlX3dpZHRoX2lkeAk9IEhJU1RDX0NPTU0sCiB9OwogCiBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2RzbyA9IHsKIAkuc2VfaGVhZGVyCT0gIlNoYXJlZCBPYmplY3QiLAogCS5zZV9jbXAJCT0gc29ydF9fZHNvX2NtcCwKIAkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X19kc29fc25wcmludGYsCi0JLnNlX3dpZHRoCT0gJmRzb3NfX2NvbF93aWR0aCwKKwkuc2Vfd2lkdGhfaWR4CT0gSElTVENfRFNPLAogfTsKIAogc3RydWN0IHNvcnRfZW50cnkgc29ydF9zeW0gPSB7CiAJLnNlX2hlYWRlcgk9ICJTeW1ib2wiLAogCS5zZV9jbXAJCT0gc29ydF9fc3ltX2NtcCwKIAkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X19zeW1fc25wcmludGYsCisJLnNlX3dpZHRoX2lkeAk9IEhJU1RDX1NZTUJPTCwKIH07CiAKIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfcGFyZW50ID0gewogCS5zZV9oZWFkZXIJPSAiUGFyZW50IHN5bWJvbCIsCiAJLnNlX2NtcAkJPSBzb3J0X19wYXJlbnRfY21wLAogCS5zZV9zbnByaW50Zgk9IGhpc3RfZW50cnlfX3BhcmVudF9zbnByaW50ZiwKLQkuc2Vfd2lkdGgJPSAmcGFyZW50X3N5bWJvbF9fY29sX3dpZHRoLAorCS5zZV93aWR0aF9pZHgJPSBISVNUQ19QQVJFTlQsCit9OworIAorc3RydWN0IHNvcnRfZW50cnkgc29ydF9jcHUgPSB7CisJLnNlX2hlYWRlciAgICAgID0gIkNQVSIsCisJLnNlX2NtcAkgICAgICAgID0gc29ydF9fY3B1X2NtcCwKKwkuc2Vfc25wcmludGYgICAgPSBoaXN0X2VudHJ5X19jcHVfc25wcmludGYsCisJLnNlX3dpZHRoX2lkeAk9IEhJU1RDX0NQVSwKIH07CiAKIHN0cnVjdCBzb3J0X2RpbWVuc2lvbiB7CkBAIC03Niw2ICs4Myw3IEBACiAJeyAubmFtZSA9ICJkc28iLAkuZW50cnkgPSAmc29ydF9kc28sCX0sCiAJeyAubmFtZSA9ICJzeW1ib2wiLAkuZW50cnkgPSAmc29ydF9zeW0sCX0sCiAJeyAubmFtZSA9ICJwYXJlbnQiLAkuZW50cnkgPSAmc29ydF9wYXJlbnQsCX0sCisJeyAubmFtZSA9ICJjcHUiLAkuZW50cnkgPSAmc29ydF9jcHUsCX0sCiB9OwogCiBpbnQ2NF90IGNtcF9udWxsKHZvaWQgKmwsIHZvaWQgKnIpCkBAIC0yNDIsNiArMjUwLDIwIEBACiAJCQkgICAgICBzZWxmLT5wYXJlbnQgPyBzZWxmLT5wYXJlbnQtPm5hbWUgOiAiW290aGVyXSIpOwogfQogCisvKiAtLXNvcnQgY3B1ICovCisKK2ludDY0X3QKK3NvcnRfX2NwdV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlyZXR1cm4gcmlnaHQtPmNwdSAtIGxlZnQtPmNwdTsKK30KKworc3RhdGljIGludCBoaXN0X2VudHJ5X19jcHVfc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIGNoYXIgKmJmLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHdpZHRoKQoreworCXJldHVybiByZXBzZXBfc25wcmludGYoYmYsIHNpemUsICIlLSpkIiwgd2lkdGgsIHNlbGYtPmNwdSk7Cit9CisKIGludCBzb3J0X2RpbWVuc2lvbl9fYWRkKGNvbnN0IGNoYXIgKnRvaykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTI4MSw2ICszMDMsOCBAQAogCQkJCXNvcnRfX2ZpcnN0X2RpbWVuc2lvbiA9IFNPUlRfU1lNOwogCQkJZWxzZSBpZiAoIXN0cmNtcChzZC0+bmFtZSwgInBhcmVudCIpKQogCQkJCXNvcnRfX2ZpcnN0X2RpbWVuc2lvbiA9IFNPUlRfUEFSRU5UOworCQkJZWxzZSBpZiAoIXN0cmNtcChzZC0+bmFtZSwgImNwdSIpKQorCQkJCXNvcnRfX2ZpcnN0X2RpbWVuc2lvbiA9IFNPUlRfQ1BVOwogCQl9CiAKIAkJbGlzdF9hZGRfdGFpbCgmc2QtPmVudHJ5LT5saXN0LCAmaGlzdF9lbnRyeV9fc29ydF9saXN0KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmggYi90b29scy9wZXJmL3V0aWwvc29ydC5oCmluZGV4IDBkNjFjNDAuLjQ2ZTUzMWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuaApAQCAtMzYsMTEgKzM2LDE0IEBACiBleHRlcm4gc3RydWN0IHNvcnRfZW50cnkgc29ydF9kc287CiBleHRlcm4gc3RydWN0IHNvcnRfZW50cnkgc29ydF9zeW07CiBleHRlcm4gc3RydWN0IHNvcnRfZW50cnkgc29ydF9wYXJlbnQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGRzb3NfX2NvbF93aWR0aDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgY29tbXNfX2NvbF93aWR0aDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdGhyZWFkc19fY29sX3dpZHRoOwogZXh0ZXJuIGVudW0gc29ydF90eXBlIHNvcnRfX2ZpcnN0X2RpbWVuc2lvbjsKIAorLyoqCisgKiBzdHJ1Y3QgaGlzdF9lbnRyeSAtIGhpc3RvZ3JhbSBlbnRyeQorICoKKyAqIEByb3dfb2Zmc2V0IC0gb2Zmc2V0IGZyb20gdGhlIGZpcnN0IGNhbGxjaGFpbiBleHBhbmRlZCB0byBhcHBlYXIgb24gc2NyZWVuCisgKiBAbnJfcm93cyAtIHJvd3MgZXhwYW5kZWQgaW4gY2FsbGNoYWluLCByZWNhbGN1bGF0ZWQgb24gZm9sZGluZy91bmZvbGRpbmcKKyAqLwogc3RydWN0IGhpc3RfZW50cnkgewogCXN0cnVjdCByYl9ub2RlCQlyYl9ub2RlOwogCXU2NAkJCXBlcmlvZDsKQEAgLTUxLDcgKzU0LDE0IEBACiAJc3RydWN0IG1hcF9zeW1ib2wJbXM7CiAJc3RydWN0IHRocmVhZAkJKnRocmVhZDsKIAl1NjQJCQlpcDsKKwlzMzIJCQljcHU7CiAJdTMyCQkJbnJfZXZlbnRzOworCisJLyogWFhYIFRoZXNlIHR3byBzaG91bGQgbW92ZSB0byBzb21lIHRyZWUgd2lkZ2V0IGxpYiAqLworCXUxNgkJCXJvd19vZmZzZXQ7CisJdTE2CQkJbnJfcm93czsKKworCWJvb2wJCQlpbml0X2hhdmVfY2hpbGRyZW47CiAJY2hhcgkJCWxldmVsOwogCXU4CQkJZmlsdGVyZWQ7CiAJc3RydWN0IHN5bWJvbAkJKnBhcmVudDsKQEAgLTY4LDcgKzc4LDggQEAKIAlTT1JUX0NPTU0sCiAJU09SVF9EU08sCiAJU09SVF9TWU0sCi0JU09SVF9QQVJFTlQKKwlTT1JUX1BBUkVOVCwKKwlTT1JUX0NQVSwKIH07CiAKIC8qCkBAIC04NCw3ICs5NSw3IEBACiAJaW50NjRfdCAoKnNlX2NvbGxhcHNlKShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKIAlpbnQJKCpzZV9zbnByaW50Zikoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgpOwotCXVuc2lnbmVkIGludCAqc2Vfd2lkdGg7CisJdTgJc2Vfd2lkdGhfaWR4OwogCWJvb2wJZWxpZGU7CiB9OwogCkBAIC0xMDQsNiArMTE1LDcgQEAKIGV4dGVybiBpbnQ2NF90IHNvcnRfX2Rzb19jbXAoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7CiBleHRlcm4gaW50NjRfdCBzb3J0X19zeW1fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOwogZXh0ZXJuIGludDY0X3Qgc29ydF9fcGFyZW50X2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKK2ludDY0X3Qgc29ydF9fY3B1X2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KTsKIGV4dGVybiBzaXplX3Qgc29ydF9fcGFyZW50X3ByaW50KEZJTEUgKiwgc3RydWN0IGhpc3RfZW50cnkgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjb25zdCBjaGFyICopOwogdm9pZCBzb3J0X2VudHJ5X19zZXR1cF9lbGlkZShzdHJ1Y3Qgc29ydF9lbnRyeSAqc2VsZiwgc3RydWN0IHN0cmxpc3QgKmxpc3QsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKaW5kZXggNWIyNzY4My4uNmYwZGQ5MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAiYnVpbGQtaWQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInN5bWJvbC5oIgogI2luY2x1ZGUgInN0cmxpc3QuaCIKIApAQCAtMjUsNiArMjYsOCBAQAogI2RlZmluZSBOVF9HTlVfQlVJTERfSUQgMwogI2VuZGlmCiAKK3N0YXRpYyBib29sIGRzb19fYnVpbGRfaWRfZXF1YWwoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgdTggKmJ1aWxkX2lkKTsKK3N0YXRpYyBpbnQgZWxmX3JlYWRfYnVpbGRfaWQoRWxmICplbGYsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgdm9pZCBkc29zX19hZGQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGRzbyAqZHNvKTsKIHN0YXRpYyBzdHJ1Y3QgbWFwICptYXBfX25ldzIodTY0IHN0YXJ0LCBzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSk7CiBzdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKQEAgLTQwLDYgKzQzLDE0IEBACiAJLnRyeV92bWxpbnV4X3BhdGggPSB0cnVlLAogfTsKIAoraW50IGRzb19fbmFtZV9sZW4oY29uc3Qgc3RydWN0IGRzbyAqc2VsZikKK3sKKwlpZiAodmVyYm9zZSkKKwkJcmV0dXJuIHNlbGYtPmxvbmdfbmFtZV9sZW47CisKKwlyZXR1cm4gc2VsZi0+c2hvcnRfbmFtZV9sZW47Cit9CisKIGJvb2wgZHNvX19sb2FkZWQoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQogewogCXJldHVybiBzZWxmLT5sb2FkZWQgJiAoMSA8PCB0eXBlKTsKQEAgLTIxNSw3ICsyMjYsOSBAQAogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpCiAJCXN5bWJvbHNfX2RlbGV0ZSgmc2VsZi0+c3ltYm9sc1tpXSk7Ci0JaWYgKHNlbGYtPmxvbmdfbmFtZSAhPSBzZWxmLT5uYW1lKQorCWlmIChzZWxmLT5zbmFtZV9hbGxvYykKKwkJZnJlZSgoY2hhciAqKXNlbGYtPnNob3J0X25hbWUpOworCWlmIChzZWxmLT5sbmFtZV9hbGxvYykKIAkJZnJlZShzZWxmLT5sb25nX25hbWUpOwogCWZyZWUoc2VsZik7CiB9CkBAIC05MzMsOCArOTQ2LDI4IEBACiAJfQogfQogCitzdGF0aWMgc2l6ZV90IGVsZl9hZGRyX3RvX2luZGV4KEVsZiAqZWxmLCBHRWxmX0FkZHIgYWRkcikKK3sKKwlFbGZfU2NuICpzZWMgPSBOVUxMOworCUdFbGZfU2hkciBzaGRyOworCXNpemVfdCBjbnQgPSAxOworCisJd2hpbGUgKChzZWMgPSBlbGZfbmV4dHNjbihlbGYsIHNlYykpICE9IE5VTEwpIHsKKwkJZ2VsZl9nZXRzaGRyKHNlYywgJnNoZHIpOworCisJCWlmICgoYWRkciA+PSBzaGRyLnNoX2FkZHIpICYmCisJCSAgICAoYWRkciA8IChzaGRyLnNoX2FkZHIgKyBzaGRyLnNoX3NpemUpKSkKKwkJCXJldHVybiBjbnQ7CisKKwkJKytjbnQ7CisJfQorCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLCBjb25zdCBjaGFyICpuYW1lLAotCQkJIGludCBmZCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IGttb2R1bGUpCisJCQkgaW50IGZkLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQga21vZHVsZSwKKwkJCSBpbnQgd2FudF9zeW10YWIpCiB7CiAJc3RydWN0IGttYXAgKmttYXAgPSBzZWxmLT5rZXJuZWwgPyBtYXBfX2ttYXAobWFwKSA6IE5VTEw7CiAJc3RydWN0IG1hcCAqY3Vycl9tYXAgPSBtYXA7CkBAIC05NDQsMzEgKzk3Nyw1MSBAQAogCWludCBlcnIgPSAtMTsKIAl1aW50MzJfdCBpZHg7CiAJR0VsZl9FaGRyIGVoZHI7Ci0JR0VsZl9TaGRyIHNoZHI7Ci0JRWxmX0RhdGEgKnN5bXM7CisJR0VsZl9TaGRyIHNoZHIsIG9wZHNoZHI7CisJRWxmX0RhdGEgKnN5bXMsICpvcGRkYXRhID0gTlVMTDsKIAlHRWxmX1N5bSBzeW07Ci0JRWxmX1NjbiAqc2VjLCAqc2VjX3N0cm5keDsKKwlFbGZfU2NuICpzZWMsICpzZWNfc3RybmR4LCAqb3Bkc2VjOwogCUVsZiAqZWxmOwogCWludCBuciA9IDA7CisJc2l6ZV90IG9wZGlkeCA9IDA7CiAKIAllbGYgPSBlbGZfYmVnaW4oZmQsIFBFUkZfRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKIAlpZiAoZWxmID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHJlYWQgJXMgRUxGIGZpbGUuXG4iLCBfX2Z1bmNfXywgbmFtZSk7CisJCXByX2RlYnVnKCIlczogY2Fubm90IHJlYWQgJXMgRUxGIGZpbGUuXG4iLCBfX2Z1bmNfXywgbmFtZSk7CiAJCWdvdG8gb3V0X2Nsb3NlOwogCX0KIAogCWlmIChnZWxmX2dldGVoZHIoZWxmLCAmZWhkcikgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYW5ub3QgZ2V0IGVsZiBoZWFkZXIuXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogY2Fubm90IGdldCBlbGYgaGVhZGVyLlxuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dF9lbGZfZW5kOwogCX0KIAorCS8qIEFsd2F5cyByZWplY3QgaW1hZ2VzIHdpdGggYSBtaXNtYXRjaGVkIGJ1aWxkLWlkOiAqLworCWlmIChzZWxmLT5oYXNfYnVpbGRfaWQpIHsKKwkJdTggYnVpbGRfaWRbQlVJTERfSURfU0laRV07CisKKwkJaWYgKGVsZl9yZWFkX2J1aWxkX2lkKGVsZiwgYnVpbGRfaWQsCisJCQkJICAgICAgQlVJTERfSURfU0laRSkgIT0gQlVJTERfSURfU0laRSkKKwkJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwkJaWYgKCFkc29fX2J1aWxkX2lkX2VxdWFsKHNlbGYsIGJ1aWxkX2lkKSkKKwkJCWdvdG8gb3V0X2VsZl9lbmQ7CisJfQorCiAJc2VjID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgIi5zeW10YWIiLCBOVUxMKTsKIAlpZiAoc2VjID09IE5VTEwpIHsKKwkJaWYgKHdhbnRfc3ltdGFiKQorCQkJZ290byBvdXRfZWxmX2VuZDsKKwogCQlzZWMgPSBlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZzaGRyLCAiLmR5bnN5bSIsIE5VTEwpOwogCQlpZiAoc2VjID09IE5VTEwpCiAJCQlnb3RvIG91dF9lbGZfZW5kOwogCX0KIAorCW9wZHNlYyA9IGVsZl9zZWN0aW9uX2J5X25hbWUoZWxmLCAmZWhkciwgJm9wZHNoZHIsICIub3BkIiwgJm9wZGlkeCk7CisJaWYgKG9wZHNlYykKKwkJb3BkZGF0YSA9IGVsZl9yYXdkYXRhKG9wZHNlYywgTlVMTCk7CisKIAlzeW1zID0gZWxmX2dldGRhdGEoc2VjLCBOVUxMKTsKIAlpZiAoc3ltcyA9PSBOVUxMKQogCQlnb3RvIG91dF9lbGZfZW5kOwpAQCAtMTAxMyw2ICsxMDY2LDEzIEBACiAJCWlmICghaXNfbGFiZWwgJiYgIWVsZl9zeW1fX2lzX2EoJnN5bSwgbWFwLT50eXBlKSkKIAkJCWNvbnRpbnVlOwogCisJCWlmIChvcGRzZWMgJiYgc3ltLnN0X3NobmR4ID09IG9wZGlkeCkgeworCQkJdTMyIG9mZnNldCA9IHN5bS5zdF92YWx1ZSAtIG9wZHNoZHIuc2hfYWRkcjsKKwkJCXU2NCAqb3BkID0gb3BkZGF0YS0+ZF9idWYgKyBvZmZzZXQ7CisJCQlzeW0uc3RfdmFsdWUgPSAqb3BkOworCQkJc3ltLnN0X3NobmR4ID0gZWxmX2FkZHJfdG9faW5kZXgoZWxmLCBzeW0uc3RfdmFsdWUpOworCQl9CisKIAkJc2VjID0gZWxmX2dldHNjbihlbGYsIHN5bS5zdF9zaG5keCk7CiAJCWlmICghc2VjKQogCQkJZ290byBvdXRfZWxmX2VuZDsKQEAgLTExNTEsMzcgKzEyMTEsMjYgQEAKICAqLwogI2RlZmluZSBOT1RFX0FMSUdOKG4pICgoKG4pICsgMykgJiAtNFUpCiAKLWludCBmaWxlbmFtZV9fcmVhZF9idWlsZF9pZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYmYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBlbGZfcmVhZF9idWlsZF9pZChFbGYgKmVsZiwgdm9pZCAqYmYsIHNpemVfdCBzaXplKQogewotCWludCBmZCwgZXJyID0gLTE7CisJaW50IGVyciA9IC0xOwogCUdFbGZfRWhkciBlaGRyOwogCUdFbGZfU2hkciBzaGRyOwogCUVsZl9EYXRhICpkYXRhOwogCUVsZl9TY24gKnNlYzsKIAlFbGZfS2luZCBlazsKIAl2b2lkICpwdHI7Ci0JRWxmICplbGY7CiAKIAlpZiAoc2l6ZSA8IEJVSUxEX0lEX1NJWkUpCiAJCWdvdG8gb3V0OwogCi0JZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Ci0JaWYgKGZkIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllbGYgPSBlbGZfYmVnaW4oZmQsIFBFUkZfRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKLQlpZiAoZWxmID09IE5VTEwpIHsKLQkJcHJfZGVidWcyKCIlczogY2Fubm90IHJlYWQgJXMgRUxGIGZpbGUuXG4iLCBfX2Z1bmNfXywgZmlsZW5hbWUpOwotCQlnb3RvIG91dF9jbG9zZTsKLQl9Ci0KIAllayA9IGVsZl9raW5kKGVsZik7CiAJaWYgKGVrICE9IEVMRl9LX0VMRikKLQkJZ290byBvdXRfZWxmX2VuZDsKKwkJZ290byBvdXQ7CiAKIAlpZiAoZ2VsZl9nZXRlaGRyKGVsZiwgJmVoZHIpID09IE5VTEwpIHsKIAkJcHJfZXJyKCIlczogY2Fubm90IGdldCBlbGYgaGVhZGVyLlxuIiwgX19mdW5jX18pOwotCQlnb3RvIG91dF9lbGZfZW5kOworCQlnb3RvIG91dDsKIAl9CiAKIAlzZWMgPSBlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZzaGRyLApAQCAtMTE5MCwxMiArMTIzOSwxMiBAQAogCQlzZWMgPSBlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZzaGRyLAogCQkJCQkgICIubm90ZXMiLCBOVUxMKTsKIAkJaWYgKHNlYyA9PSBOVUxMKQotCQkJZ290byBvdXRfZWxmX2VuZDsKKwkJCWdvdG8gb3V0OwogCX0KIAogCWRhdGEgPSBlbGZfZ2V0ZGF0YShzZWMsIE5VTEwpOwogCWlmIChkYXRhID09IE5VTEwpCi0JCWdvdG8gb3V0X2VsZl9lbmQ7CisJCWdvdG8gb3V0OwogCiAJcHRyID0gZGF0YS0+ZF9idWY7CiAJd2hpbGUgKHB0ciA8IChkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZSkpIHsKQEAgLTEyMTcsNyArMTI2NiwzMSBAQAogCQl9CiAJCXB0ciArPSBkZXNjc3o7CiAJfQotb3V0X2VsZl9lbmQ6CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZmQsIGVyciA9IC0xOworCUVsZiAqZWxmOworCisJaWYgKHNpemUgPCBCVUlMRF9JRF9TSVpFKQorCQlnb3RvIG91dDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCWdvdG8gb3V0OworCisJZWxmID0gZWxmX2JlZ2luKGZkLCBQRVJGX0VMRl9DX1JFQURfTU1BUCwgTlVMTCk7CisJaWYgKGVsZiA9PSBOVUxMKSB7CisJCXByX2RlYnVnMigiJXM6IGNhbm5vdCByZWFkICVzIEVMRiBmaWxlLlxuIiwgX19mdW5jX18sIGZpbGVuYW1lKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJZXJyID0gZWxmX3JlYWRfYnVpbGRfaWQoZWxmLCBiZiwgc2l6ZSk7CisKIAllbGZfZW5kKGVsZik7CiBvdXRfY2xvc2U6CiAJY2xvc2UoZmQpOwpAQCAtMTI5MywxMSArMTM2NiwxMSBAQAogewogCWludCBzaXplID0gUEFUSF9NQVg7CiAJY2hhciAqbmFtZTsKLQl1OCBidWlsZF9pZFtCVUlMRF9JRF9TSVpFXTsKIAlpbnQgcmV0ID0gLTE7CiAJaW50IGZkOwogCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOwogCWNvbnN0IGNoYXIgKnJvb3RfZGlyOworCWludCB3YW50X3N5bXRhYjsKIAogCWRzb19fc2V0X2xvYWRlZChzZWxmLCBtYXAtPnR5cGUpOwogCkBAIC0xMzI0LDEzICsxMzk3LDE4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0Jc2VsZi0+b3JpZ2luID0gRFNPX19PUklHX0JVSUxEX0lEX0NBQ0hFOwotCWlmIChkc29fX2J1aWxkX2lkX2ZpbGVuYW1lKHNlbGYsIG5hbWUsIHNpemUpICE9IE5VTEwpCi0JCWdvdG8gb3Blbl9maWxlOwotbW9yZToKLQlkbyB7Ci0JCXNlbGYtPm9yaWdpbisrOworCS8qIEl0ZXJhdGUgb3ZlciBjYW5kaWRhdGUgZGVidWcgaW1hZ2VzLgorCSAqIE9uIHRoZSBmaXJzdCBwYXNzLCBvbmx5IGxvYWQgaW1hZ2VzIGlmIHRoZXkgaGF2ZSBhIGZ1bGwgc3ltdGFiLgorCSAqIEZhaWxpbmcgdGhhdCwgZG8gYSBzZWNvbmQgcGFzcyB3aGVyZSB3ZSBhY2NlcHQgLmR5bnN5bSBhbHNvCisJICovCisJZm9yIChzZWxmLT5vcmlnaW4gPSBEU09fX09SSUdfQlVJTERfSURfQ0FDSEUsIHdhbnRfc3ltdGFiID0gMTsKKwkgICAgIHNlbGYtPm9yaWdpbiAhPSBEU09fX09SSUdfTk9UX0ZPVU5EOworCSAgICAgc2VsZi0+b3JpZ2luKyspIHsKIAkJc3dpdGNoIChzZWxmLT5vcmlnaW4pIHsKKwkJY2FzZSBEU09fX09SSUdfQlVJTERfSURfQ0FDSEU6CisJCQlpZiAoZHNvX19idWlsZF9pZF9maWxlbmFtZShzZWxmLCBuYW1lLCBzaXplKSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CiAJCWNhc2UgRFNPX19PUklHX0ZFRE9SQToKIAkJCXNucHJpbnRmKG5hbWUsIHNpemUsICIvdXNyL2xpYi9kZWJ1ZyVzLmRlYnVnIiwKIAkJCQkgc2VsZi0+bG9uZ19uYW1lKTsKQEAgLTEzMzksMjEgKzE0MTcsMjAgQEAKIAkJCXNucHJpbnRmKG5hbWUsIHNpemUsICIvdXNyL2xpYi9kZWJ1ZyVzIiwKIAkJCQkgc2VsZi0+bG9uZ19uYW1lKTsKIAkJCWJyZWFrOwotCQljYXNlIERTT19fT1JJR19CVUlMRElEOgotCQkJaWYgKGZpbGVuYW1lX19yZWFkX2J1aWxkX2lkKHNlbGYtPmxvbmdfbmFtZSwgYnVpbGRfaWQsCi0JCQkJCQkgICAgc2l6ZW9mKGJ1aWxkX2lkKSkpIHsKLQkJCQljaGFyIGJ1aWxkX2lkX2hleFtCVUlMRF9JRF9TSVpFICogMiArIDFdOwotCQkJCWJ1aWxkX2lkX19zcHJpbnRmKGJ1aWxkX2lkLCBzaXplb2YoYnVpbGRfaWQpLAotCQkJCQkJICBidWlsZF9pZF9oZXgpOwotCQkJCXNucHJpbnRmKG5hbWUsIHNpemUsCi0JCQkJCSAiL3Vzci9saWIvZGVidWcvLmJ1aWxkLWlkLyUuMnMvJXMuZGVidWciLAotCQkJCQlidWlsZF9pZF9oZXgsIGJ1aWxkX2lkX2hleCArIDIpOwotCQkJCWlmIChzZWxmLT5oYXNfYnVpbGRfaWQpCi0JCQkJCWdvdG8gY29tcGFyZV9idWlsZF9pZDsKLQkJCQlicmVhazsKKwkJY2FzZSBEU09fX09SSUdfQlVJTERJRDogeworCQkJY2hhciBidWlsZF9pZF9oZXhbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKKworCQkJaWYgKCFzZWxmLT5oYXNfYnVpbGRfaWQpCisJCQkJY29udGludWU7CisKKwkJCWJ1aWxkX2lkX19zcHJpbnRmKHNlbGYtPmJ1aWxkX2lkLAorCQkJCQkgIHNpemVvZihzZWxmLT5idWlsZF9pZCksCisJCQkJCSAgYnVpbGRfaWRfaGV4KTsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemUsCisJCQkJICIvdXNyL2xpYi9kZWJ1Zy8uYnVpbGQtaWQvJS4ycy8lcy5kZWJ1ZyIsCisJCQkJIGJ1aWxkX2lkX2hleCwgYnVpbGRfaWRfaGV4ICsgMik7CiAJCQl9Ci0JCQlzZWxmLT5vcmlnaW4rKzsKLQkJCS8qIEZhbGwgdGhydSAqLworCQkJYnJlYWs7CiAJCWNhc2UgRFNPX19PUklHX0RTTzoKIAkJCXNucHJpbnRmKG5hbWUsIHNpemUsICIlcyIsIHNlbGYtPmxvbmdfbmFtZSk7CiAJCQlicmVhazsKQEAgLTEzNjYsMzYgKzE0NDMsNDEgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlnb3RvIG91dDsKKwkJCS8qCisJCQkgKiBJZiB3ZSB3YW50ZWQgYSBmdWxsIHN5bXRhYiBidXQgbm8gaW1hZ2UgaGFkIG9uZSwKKwkJCSAqIHJlbGF4IG91ciByZXF1aXJlbWVudHMgYW5kIHJlcGVhdCB0aGUgc2VhcmNoLgorCQkJICovCisJCQlpZiAod2FudF9zeW10YWIpIHsKKwkJCQl3YW50X3N5bXRhYiA9IDA7CisJCQkJc2VsZi0+b3JpZ2luID0gRFNPX19PUklHX0JVSUxEX0lEX0NBQ0hFOworCQkJfSBlbHNlCisJCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoc2VsZi0+aGFzX2J1aWxkX2lkKSB7Ci0JCQlpZiAoZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQobmFtZSwgYnVpbGRfaWQsCi0JCQkJCQkgICAgc2l6ZW9mKGJ1aWxkX2lkKSkgPCAwKQotCQkJCWdvdG8gbW9yZTsKLWNvbXBhcmVfYnVpbGRfaWQ6Ci0JCQlpZiAoIWRzb19fYnVpbGRfaWRfZXF1YWwoc2VsZiwgYnVpbGRfaWQpKQotCQkJCWdvdG8gbW9yZTsKLQkJfQotb3Blbl9maWxlOgorCQkvKiBOYW1lIGlzIG5vdyB0aGUgbmFtZSBvZiB0aGUgbmV4dCBpbWFnZSB0byB0cnkgKi8KIAkJZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKTsKLQl9IHdoaWxlIChmZCA8IDApOworCQlpZiAoZmQgPCAwKQorCQkJY29udGludWU7CiAKLQlyZXQgPSBkc29fX2xvYWRfc3ltKHNlbGYsIG1hcCwgbmFtZSwgZmQsIGZpbHRlciwgMCk7Ci0JY2xvc2UoZmQpOworCQlyZXQgPSBkc29fX2xvYWRfc3ltKHNlbGYsIG1hcCwgbmFtZSwgZmQsIGZpbHRlciwgMCwKKwkJCQkgICAgd2FudF9zeW10YWIpOworCQljbG9zZShmZCk7CiAKLQkvKgotCSAqIFNvbWUgcGVvcGxlIHNlZW0gdG8gaGF2ZSBkZWJ1Z2luZm8gZmlsZXMgX1dJVEhPVVRfIGRlYnVnIGluZm8hPyE/Ci0JICovCi0JaWYgKCFyZXQpCi0JCWdvdG8gbW9yZTsKKwkJLyoKKwkJICogU29tZSBwZW9wbGUgc2VlbSB0byBoYXZlIGRlYnVnaW5mbyBmaWxlcyBfV0lUSE9VVF8gZGVidWcKKwkJICogaW5mbyE/IT8KKwkJICovCisJCWlmICghcmV0KQorCQkJY29udGludWU7CiAKLQlpZiAocmV0ID4gMCkgewotCQlpbnQgbnJfcGx0ID0gZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHNlbGYsIG1hcCwgZmlsdGVyKTsKLQkJaWYgKG5yX3BsdCA+IDApCi0JCQlyZXQgKz0gbnJfcGx0OworCQlpZiAocmV0ID4gMCkgeworCQkJaW50IG5yX3BsdCA9IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzZWxmLCBtYXAsIGZpbHRlcik7CisJCQlpZiAobnJfcGx0ID4gMCkKKwkJCQlyZXQgKz0gbnJfcGx0OworCQkJYnJlYWs7CisJCX0KIAl9Ci1vdXQ6CisKIAlmcmVlKG5hbWUpOwogCWlmIChyZXQgPCAwICYmIHN0cnN0cihzZWxmLT5uYW1lLCAiIChkZWxldGVkKSIpICE9IE5VTEwpCiAJCXJldHVybiAwOwpAQCAtMTQ5NCw2ICsxNTc2LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWRzb19fc2V0X2xvbmdfbmFtZShtYXAtPmRzbywgbG9uZ19uYW1lKTsKKwkJCW1hcC0+ZHNvLT5sbmFtZV9hbGxvYyA9IDE7CiAJCQlkc29fX2tlcm5lbF9tb2R1bGVfZ2V0X2J1aWxkX2lkKG1hcC0+ZHNvLCAiIik7CiAJCX0KIAl9CkBAIC0xNjU2LDM2ICsxNzM5LDEyIEBACiB7CiAJaW50IGVyciA9IC0xLCBmZDsKIAotCWlmIChzZWxmLT5oYXNfYnVpbGRfaWQpIHsKLQkJdTggYnVpbGRfaWRbQlVJTERfSURfU0laRV07Ci0KLQkJaWYgKGZpbGVuYW1lX19yZWFkX2J1aWxkX2lkKHZtbGludXgsIGJ1aWxkX2lkLAotCQkJCQkgICAgc2l6ZW9mKGJ1aWxkX2lkKSkgPCAwKSB7Ci0JCQlwcl9kZWJ1ZygiTm8gYnVpbGRfaWQgaW4gJXMsIGlnbm9yaW5nIGl0XG4iLCB2bWxpbnV4KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoIWRzb19fYnVpbGRfaWRfZXF1YWwoc2VsZiwgYnVpbGRfaWQpKSB7Ci0JCQljaGFyIGV4cGVjdGVkX2J1aWxkX2lkW0JVSUxEX0lEX1NJWkUgKiAyICsgMV0sCi0JCQkgICAgIHZtbGludXhfYnVpbGRfaWRbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKLQotCQkJYnVpbGRfaWRfX3NwcmludGYoc2VsZi0+YnVpbGRfaWQsCi0JCQkJCSAgc2l6ZW9mKHNlbGYtPmJ1aWxkX2lkKSwKLQkJCQkJICBleHBlY3RlZF9idWlsZF9pZCk7Ci0JCQlidWlsZF9pZF9fc3ByaW50ZihidWlsZF9pZCwgc2l6ZW9mKGJ1aWxkX2lkKSwKLQkJCQkJICB2bWxpbnV4X2J1aWxkX2lkKTsKLQkJCXByX2RlYnVnKCJidWlsZF9pZCBpbiAlcyBpcyAlcyB3aGlsZSBleHBlY3RlZCBpcyAlcywgIgotCQkJCSAiaWdub3JpbmcgaXRcbiIsIHZtbGludXgsIHZtbGludXhfYnVpbGRfaWQsCi0JCQkJIGV4cGVjdGVkX2J1aWxkX2lkKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQogCWZkID0gb3Blbih2bWxpbnV4LCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkKIAkJcmV0dXJuIC0xOwogCiAJZHNvX19zZXRfbG9hZGVkKHNlbGYsIG1hcC0+dHlwZSk7Ci0JZXJyID0gZHNvX19sb2FkX3N5bShzZWxmLCBtYXAsIHZtbGludXgsIGZkLCBmaWx0ZXIsIDApOworCWVyciA9IGRzb19fbG9hZF9zeW0oc2VsZiwgbWFwLCB2bWxpbnV4LCBmZCwgZmlsdGVyLCAwLCAwKTsKIAljbG9zZShmZCk7CiAKIAlpZiAoZXJyID4gMCkKQEAgLTIwNDgsNiArMjEwNywzNiBAQAogCXJldHVybiAwOwogfQogCit2b2lkIG1hY2hpbmVfX2Rlc3Ryb3lfa2VybmVsX21hcHMoc3RydWN0IG1hY2hpbmUgKnNlbGYpCit7CisJZW51bSBtYXBfdHlwZSB0eXBlOworCisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BUF9fTlJfVFlQRVM7ICsrdHlwZSkgeworCQlzdHJ1Y3Qga21hcCAqa21hcDsKKworCQlpZiAoc2VsZi0+dm1saW51eF9tYXBzW3R5cGVdID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlrbWFwID0gbWFwX19rbWFwKHNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSk7CisJCW1hcF9ncm91cHNfX3JlbW92ZSgmc2VsZi0+a21hcHMsIHNlbGYtPnZtbGludXhfbWFwc1t0eXBlXSk7CisJCWlmIChrbWFwLT5yZWZfcmVsb2Nfc3ltKSB7CisJCQkvKgorCQkJICogcmVmX3JlbG9jX3N5bSBpcyBzaGFyZWQgYW1vbmcgYWxsIG1hcHMsIHNvIGZyZWUganVzdAorCQkJICogb24gb25lIG9mIHRoZW0uCisJCQkgKi8KKwkJCWlmICh0eXBlID09IE1BUF9fRlVOQ1RJT04pIHsKKwkJCQlmcmVlKChjaGFyICopa21hcC0+cmVmX3JlbG9jX3N5bS0+bmFtZSk7CisJCQkJa21hcC0+cmVmX3JlbG9jX3N5bS0+bmFtZSA9IE5VTEw7CisJCQkJZnJlZShrbWFwLT5yZWZfcmVsb2Nfc3ltKTsKKwkJCX0KKwkJCWttYXAtPnJlZl9yZWxvY19zeW0gPSBOVUxMOworCQl9CisKKwkJbWFwX19kZWxldGUoc2VsZi0+dm1saW51eF9tYXBzW3R5cGVdKTsKKwkJc2VsZi0+dm1saW51eF9tYXBzW3R5cGVdID0gTlVMTDsKKwl9Cit9CisKIGludCBtYWNoaW5lX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IG1hY2hpbmUgKnNlbGYpCiB7CiAJc3RydWN0IGRzbyAqa2VybmVsID0gbWFjaGluZV9fY3JlYXRlX2tlcm5lbChzZWxmKTsKQEAgLTIxODksNiArMjI3OCwxNSBAQAogCXJldHVybiAtMTsKIH0KIAordm9pZCBzeW1ib2xfX2V4aXQodm9pZCkKK3sKKwlzdHJsaXN0X19kZWxldGUoc3ltYm9sX2NvbmYuc3ltX2xpc3QpOworCXN0cmxpc3RfX2RlbGV0ZShzeW1ib2xfY29uZi5kc29fbGlzdCk7CisJc3RybGlzdF9fZGVsZXRlKHN5bWJvbF9jb25mLmNvbW1fbGlzdCk7CisJdm1saW51eF9wYXRoX19leGl0KCk7CisJc3ltYm9sX2NvbmYuc3ltX2xpc3QgPSBzeW1ib2xfY29uZi5kc29fbGlzdCA9IHN5bWJvbF9jb25mLmNvbW1fbGlzdCA9IE5VTEw7Cit9CisKIGludCBtYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICpzZWxmLCBwaWRfdCBwaWQpCiB7CiAJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgPSBtYWNoaW5lc19fZmluZG5ldyhzZWxmLCBwaWQpOwpAQCAtMjI4Myw2ICsyMzgxLDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBtYWNoaW5lc19fZGVzdHJveV9ndWVzdF9rZXJuZWxfbWFwcyhzdHJ1Y3QgcmJfcm9vdCAqc2VsZikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IHJiX2ZpcnN0KHNlbGYpOworCisJd2hpbGUgKG5leHQpIHsKKwkJc3RydWN0IG1hY2hpbmUgKnBvcyA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKKworCQluZXh0ID0gcmJfbmV4dCgmcG9zLT5yYl9ub2RlKTsKKwkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgc2VsZik7CisJCW1hY2hpbmVfX2RlbGV0ZShwb3MpOworCX0KK30KKwogaW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKnNlbGYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IDVlMDJkMmMuLjkwNmJlMjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTksOCArOSw2IEBACiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2RlZmluZSBERUJVR19DQUNIRV9ESVIgIi5kZWJ1ZyIKLQogI2lmZGVmIEhBVkVfQ1BMVVNfREVNQU5HTEUKIGV4dGVybiBjaGFyICpjcGx1c19kZW1hbmdsZShjb25zdCBjaGFyICosIGludCk7CiAKQEAgLTcwLDkgKzY4LDkgQEAKIAkJCXNob3dfbnJfc2FtcGxlcywKIAkJCXVzZV9jYWxsY2hhaW4sCiAJCQlleGNsdWRlX290aGVyLAotCQkJZnVsbF9wYXRocywKIAkJCXNob3dfY3B1X3V0aWxpemF0aW9uOwogCWNvbnN0IGNoYXIJKnZtbGludXhfbmFtZSwKKwkJCSpzb3VyY2VfcHJlZml4LAogCQkJKmZpZWxkX3NlcDsKIAljb25zdCBjaGFyCSpkZWZhdWx0X2d1ZXN0X3ZtbGludXhfbmFtZSwKIAkJCSpkZWZhdWx0X2d1ZXN0X2thbGxzeW1zLApAQCAtMTAzLDYgKzEwMSw4IEBACiBzdHJ1Y3QgbWFwX3N5bWJvbCB7CiAJc3RydWN0IG1hcCAgICAqbWFwOwogCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlib29sCSAgICAgIHVuZm9sZGVkOworCWJvb2wJICAgICAgaGFzX2NoaWxkcmVuOwogfTsKIAogc3RydWN0IGFkZHJfbG9jYXRpb24gewpAQCAtMTEyLDcgKzExMiw4IEBACiAJdTY0CSAgICAgIGFkZHI7CiAJY2hhcgkgICAgICBsZXZlbDsKIAlib29sCSAgICAgIGZpbHRlcmVkOwotCXVuc2lnbmVkIGludCAgY3B1bW9kZTsKKwl1OAkgICAgICBjcHVtb2RlOworCXMzMgkgICAgICBjcHU7CiB9OwogCiBlbnVtIGRzb19rZXJuZWxfdHlwZSB7CkBAIC0xMjUsMTIgKzEyNiwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlzdHJ1Y3QgcmJfcm9vdAkgc3ltYm9sc1tNQVBfX05SX1RZUEVTXTsKIAlzdHJ1Y3QgcmJfcm9vdAkgc3ltYm9sX25hbWVzW01BUF9fTlJfVFlQRVNdOworCWVudW0gZHNvX2tlcm5lbF90eXBlCWtlcm5lbDsKIAl1OAkJIGFkanVzdF9zeW1ib2xzOjE7CiAJdTgJCSBzbGVuX2NhbGN1bGF0ZWQ6MTsKIAl1OAkJIGhhc19idWlsZF9pZDoxOwotCWVudW0gZHNvX2tlcm5lbF90eXBlCWtlcm5lbDsKIAl1OAkJIGhpdDoxOwogCXU4CQkgYW5ub3RhdGVfd2FybmVkOjE7CisJdTgJCSBzbmFtZV9hbGxvYzoxOworCXU4CQkgbG5hbWVfYWxsb2M6MTsKIAl1bnNpZ25lZCBjaGFyCSBvcmlnaW47CiAJdTgJCSBzb3J0ZWRfYnlfbmFtZTsKIAl1OAkJIGxvYWRlZDsKQEAgLTE0Niw2ICsxNDksOCBAQAogc3RydWN0IGRzbyAqZHNvX19uZXdfa2VybmVsKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCBkc29fX2RlbGV0ZShzdHJ1Y3QgZHNvICpzZWxmKTsKIAoraW50IGRzb19fbmFtZV9sZW4oY29uc3Qgc3RydWN0IGRzbyAqc2VsZik7CisKIGJvb2wgZHNvX19sb2FkZWQoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKTsKIGJvb2wgZHNvX19zb3J0ZWRfYnlfbmFtZShjb25zdCBzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpOwogCkBAIC0yMDcsMTMgKzIxMiwxNiBAQAogCQkgICAgaW50ICgqcHJvY2Vzc19zeW1ib2wpKHZvaWQgKmFyZywgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJICBjaGFyIHR5cGUsIHU2NCBzdGFydCkpOwogCit2b2lkIG1hY2hpbmVfX2Rlc3Ryb3lfa2VybmVsX21hcHMoc3RydWN0IG1hY2hpbmUgKnNlbGYpOwogaW50IF9fbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCBtYWNoaW5lICpzZWxmLCBzdHJ1Y3QgZHNvICprZXJuZWwpOwogaW50IG1hY2hpbmVfX2NyZWF0ZV9rZXJuZWxfbWFwcyhzdHJ1Y3QgbWFjaGluZSAqc2VsZik7CiAKIGludCBtYWNoaW5lc19fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCByYl9yb290ICpzZWxmLCBwaWRfdCBwaWQpOwogaW50IG1hY2hpbmVzX19jcmVhdGVfZ3Vlc3Rfa2VybmVsX21hcHMoc3RydWN0IHJiX3Jvb3QgKnNlbGYpOwordm9pZCBtYWNoaW5lc19fZGVzdHJveV9ndWVzdF9rZXJuZWxfbWFwcyhzdHJ1Y3QgcmJfcm9vdCAqc2VsZik7CiAKIGludCBzeW1ib2xfX2luaXQodm9pZCk7Cit2b2lkIHN5bWJvbF9fZXhpdCh2b2lkKTsKIGJvb2wgc3ltYm9sX3R5cGVfX2lzX2EoY2hhciBzeW1ib2xfdHlwZSwgZW51bSBtYXBfdHlwZSBtYXBfdHlwZSk7CiAKIHNpemVfdCBtYWNoaW5lX19mcHJpbnRmX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgRklMRSAqZnApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jIGIvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jCmluZGV4IDlhNDQ4YjQuLjhjNzJkODggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYworKysgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMKQEAgLTYyLDYgKzYyLDEzIEBACiAJcmV0dXJuIHNlbGY7CiB9CiAKK3ZvaWQgdGhyZWFkX19kZWxldGUoc3RydWN0IHRocmVhZCAqc2VsZikKK3sKKwltYXBfZ3JvdXBzX19leGl0KCZzZWxmLT5tZyk7CisJZnJlZShzZWxmLT5jb21tKTsKKwlmcmVlKHNlbGYpOworfQorCiBpbnQgdGhyZWFkX19zZXRfY29tbShzdHJ1Y3QgdGhyZWFkICpzZWxmLCBjb25zdCBjaGFyICpjb21tKQogewogCWludCBlcnI7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmggYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmgKaW5kZXggZWU2YmJjZi4uNjg4NTAwZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaApAQCAtMjAsNiArMjAsOCBAQAogCiBzdHJ1Y3QgcGVyZl9zZXNzaW9uOwogCit2b2lkIHRocmVhZF9fZGVsZXRlKHN0cnVjdCB0aHJlYWQgKnNlbGYpOworCiBpbnQgZmluZF9hbGxfdGlkKGludCBwaWQsIHBpZF90ICoqIGFsbF90aWQpOwogaW50IHRocmVhZF9fc2V0X2NvbW0oc3RydWN0IHRocmVhZCAqc2VsZiwgY29uc3QgY2hhciAqY29tbSk7CiBpbnQgdGhyZWFkX19jb21tX2xlbihzdHJ1Y3QgdGhyZWFkICpzZWxmKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmggYi90b29scy9wZXJmL3V0aWwvdXRpbC5oCmluZGV4IDRlOGI2YjAuLmYzODBmZWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuaApAQCAtODksNiArODksNyBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqZ3JhcGhfbGluZTsKIGV4dGVybiBjb25zdCBjaGFyICpncmFwaF9kb3R0ZWRfbGluZTsKK2V4dGVybiBjaGFyIGJ1aWxkaWRfZGlyW107CiAKIC8qIE9uIG1vc3Qgc3lzdGVtcyA8bGltaXRzLmg+IHdvdWxkIGhhdmUgZ2l2ZW4gdXMgdGhpcywgYnV0CiAgKiBub3Qgb24gc29tZSBzeXN0ZW1zIChlLmcuIEdOVS9IdXJkKS4KQEAgLTE1Miw2ICsxNTMsOCBAQAogZXh0ZXJuIHZvaWQgc2V0X2RpZV9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSBOT1JFVFVSTik7CiAKIGV4dGVybiBpbnQgcHJlZml4Y21wKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiB2b2lkIHNldF9idWlsZGlkX2Rpcih2b2lkKTsKK2V4dGVybiB2b2lkIGRpc2FibGVfYnVpbGRpZF9jYWNoZSh2b2lkKTsKIAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpza2lwX3ByZWZpeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKIHsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jIGIvdmlydC9rdm0vYXNzaWduZWQtZGV2LmMKaW5kZXggNGQxMGIxZS4uN2M5ODkyOCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXNzaWduZWQtZGV2LmMKKysrIGIvdmlydC9rdm0vYXNzaWduZWQtZGV2LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSAtIGRldmljZSBhc3NpZ25tZW50IHN1cHBvcnQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtOSBSZWQgSGF0LCBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4KICAqCiAgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKICAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCkBAIC01OCwxMiArNTgsMTAgQEAKIHN0YXRpYyB2b2lkIGt2bV9hc3NpZ25lZF9kZXZfaW50ZXJydXB0X3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXY7Ci0Jc3RydWN0IGt2bSAqa3ZtOwogCWludCBpOwogCiAJYXNzaWduZWRfZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCwKIAkJCQkgICAgaW50ZXJydXB0X3dvcmspOwotCWt2bSA9IGFzc2lnbmVkX2Rldi0+a3ZtOwogCiAJc3Bpbl9sb2NrX2lycSgmYXNzaWduZWRfZGV2LT5hc3NpZ25lZF9kZXZfbG9jayk7CiAJaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYKSB7CkBAIC00NDgsOSArNDQ2LDYgQEAKIAlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKm1hdGNoOwogCXVuc2lnbmVkIGxvbmcgaG9zdF9pcnFfdHlwZSwgZ3Vlc3RfaXJxX3R5cGU7CiAKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCi0JCXJldHVybiAtRVBFUk07Ci0KIAlpZiAoIWlycWNoaXBfaW5fa2VybmVsKGt2bSkpCiAJCXJldHVybiByOwogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5jIGIvdmlydC9rdm0vY29hbGVzY2VkX21taW8uYwppbmRleCA1Mzg1MDE3Li5mYzg0ODc1IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5jCisrKyBiL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmMKQEAgLTIsNiArMiw3IEBACiAgKiBLVk0gY29hbGVzY2VkIE1NSU8KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDggQnVsbCBTLkEuUy4KKyAqIENvcHlyaWdodCAyMDA5IFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLgogICoKICAqICBBdXRob3I6IExhdXJlbnQgVml2aWVyIDxMYXVyZW50LlZpdmllckBidWxsLm5ldD4KICAqCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ldmVudGZkLmMgYi92aXJ0L2t2bS9ldmVudGZkLmMKaW5kZXggYjgxZjBlYi4uNjZjZjY1YiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZXZlbnRmZC5jCisrKyBiL3ZpcnQva3ZtL2V2ZW50ZmQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIGt2bSBldmVudGZkIHN1cHBvcnQgLSB1c2UgZXZlbnRmZCBvYmplY3RzIHRvIHNpZ25hbCB2YXJpb3VzIEtWTSBldmVudHMKICAqCiAgKiBDb3B5cmlnaHQgMjAwOSBOb3ZlbGwuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuCiAgKgogICogQXV0aG9yOgogICoJR3JlZ29yeSBIYXNraW5zIDxnaGFza2luc0Bub3ZlbGwuY29tPgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaW9hcGljLmMgYi92aXJ0L2t2bS9pb2FwaWMuYwppbmRleCAzNTAwZGVlLi4wYjlkZjgzIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pb2FwaWMuYworKysgYi92aXJ0L2t2bS9pb2FwaWMuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxICBNYW5kcmFrZVNvZnQgUy5BLgorICogIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLgogICoKICAqICAgIE1hbmRyYWtlU29mdCBTLkEuCiAgKiAgICA0MywgcnVlIGQnQWJvdWtpcgpAQCAtMTUxLDcgKzE1Miw3IEBACiAJCXVwZGF0ZV9oYW5kbGVkX3ZlY3RvcnMoaW9hcGljKTsKIAkJbWFza19hZnRlciA9IGUtPmZpZWxkcy5tYXNrOwogCQlpZiAobWFza19iZWZvcmUgIT0gbWFza19hZnRlcikKLQkJCWt2bV9maXJlX21hc2tfbm90aWZpZXJzKGlvYXBpYy0+a3ZtLCBpbmRleCwgbWFza19hZnRlcik7CisJCQlrdm1fZmlyZV9tYXNrX25vdGlmaWVycyhpb2FwaWMtPmt2bSwgS1ZNX0lSUUNISVBfSU9BUElDLCBpbmRleCwgbWFza19hZnRlcik7CiAJCWlmIChlLT5maWVsZHMudHJpZ19tb2RlID09IElPQVBJQ19MRVZFTF9UUklHCiAJCSAgICAmJiBpb2FwaWMtPmlyciAmICgxIDw8IGluZGV4KSkKIAkJCWlvYXBpY19zZXJ2aWNlKGlvYXBpYywgaW5kZXgpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaW9tbXUuYyBiL3ZpcnQva3ZtL2lvbW11LmMKaW5kZXggOTYwNDhlZS4uNjJhOWNhZiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vaW9tbXUuYworKysgYi92aXJ0L2t2bS9pb21tdS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLgorICoKICAqIEF1dGhvcjogQWxsZW4gTS4gS2F5IDxhbGxlbi5tLmtheUBpbnRlbC5jb20+CiAgKiBBdXRob3I6IFdlaWRvbmcgSGFuIDx3ZWlkb25nLmhhbkBpbnRlbC5jb20+CiAgKiBBdXRob3I6IEJlbi1BbWkgWWFzc291ciA8YmVuYW1pQGlsLmlibS5jb20+CkBAIC0xMDYsNyArMTA4LDcgQEAKIAkJCSAgICAgIGdldF9vcmRlcihwYWdlX3NpemUpLCBmbGFncyk7CiAJCWlmIChyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImt2bV9pb21tdV9tYXBfYWRkcmVzczoiCi0JCQkgICAgICAgImlvbW11IGZhaWxlZCB0byBtYXAgcGZuPSVseFxuIiwgcGZuKTsKKwkJCSAgICAgICAiaW9tbXUgZmFpbGVkIHRvIG1hcCBwZm49JWxseFxuIiwgcGZuKTsKIAkJCWdvdG8gdW5tYXBfcGFnZXM7CiAJCX0KIApAQCAtMTI0LDkgKzEyNiwxMCBAQAogCiBzdGF0aWMgaW50IGt2bV9pb21tdV9tYXBfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtKQogewotCWludCBpLCByID0gMDsKKwlpbnQgaSwgaWR4LCByID0gMDsKIAlzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90czsKIAorCWlkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwogCXNsb3RzID0ga3ZtX21lbXNsb3RzKGt2bSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2xvdHMtPm5tZW1zbG90czsgaSsrKSB7CkBAIC0xMzQsNiArMTM3LDcgQEAKIAkJaWYgKHIpCiAJCQlicmVhazsKIAl9CisJc3JjdV9yZWFkX3VubG9jaygma3ZtLT5zcmN1LCBpZHgpOwogCiAJcmV0dXJuIHI7CiB9CkBAIC0yODMsMTUgKzI4NywxNyBAQAogCiBzdGF0aWMgaW50IGt2bV9pb21tdV91bm1hcF9tZW1zbG90cyhzdHJ1Y3Qga3ZtICprdm0pCiB7Ci0JaW50IGk7CisJaW50IGksIGlkeDsKIAlzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90czsKIAorCWlkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwogCXNsb3RzID0ga3ZtX21lbXNsb3RzKGt2bSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2xvdHMtPm5tZW1zbG90czsgaSsrKSB7CiAJCWt2bV9pb21tdV9wdXRfcGFnZXMoa3ZtLCBzbG90cy0+bWVtc2xvdHNbaV0uYmFzZV9nZm4sCiAJCQkJICAgIHNsb3RzLT5tZW1zbG90c1tpXS5ucGFnZXMpOwogCX0KKwlzcmN1X3JlYWRfdW5sb2NrKCZrdm0tPnNyY3UsIGlkeCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2lycV9jb21tLmMgYi92aXJ0L2t2bS9pcnFfY29tbS5jCmluZGV4IGEwZTg4ODAuLjM2OWUzODAgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2lycV9jb21tLmMKKysrIGIvdmlydC9rdm0vaXJxX2NvbW0uYwpAQCAtMTcsNiArMTcsNyBAQAogICogQXV0aG9yczoKICAqICAgWWFvenUgKEVkZGllKSBEb25nIDxFZGRpZS5kb25nQGludGVsLmNvbT4KICAqCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxhdGVzLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgpAQCAtOTksNyArMTAwLDcgQEAKIAkJCWlmIChyIDwgMCkKIAkJCQlyID0gMDsKIAkJCXIgKz0ga3ZtX2FwaWNfc2V0X2lycSh2Y3B1LCBpcnEpOwotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKGt2bV9sYXBpY19lbmFibGVkKHZjcHUpKSB7CiAJCQlpZiAoIWxvd2VzdCkKIAkJCQlsb3dlc3QgPSB2Y3B1OwogCQkJZWxzZSBpZiAoa3ZtX2FwaWNfY29tcGFyZV9wcmlvKHZjcHUsIGxvd2VzdCkgPCAwKQpAQCAtMjc4LDE1ICsyNzksMTkgQEAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAotdm9pZCBrdm1fZmlyZV9tYXNrX25vdGlmaWVycyhzdHJ1Y3Qga3ZtICprdm0sIGludCBpcnEsIGJvb2wgbWFzaykKK3ZvaWQga3ZtX2ZpcmVfbWFza19ub3RpZmllcnMoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpcnFjaGlwLCB1bnNpZ25lZCBwaW4sCisJCQkgICAgIGJvb2wgbWFzaykKIHsKIAlzdHJ1Y3Qga3ZtX2lycV9tYXNrX25vdGlmaWVyICpraW1uOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOworCWludCBnc2k7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtpbW4sIG4sICZrdm0tPm1hc2tfbm90aWZpZXJfbGlzdCwgbGluaykKLQkJaWYgKGtpbW4tPmlycSA9PSBpcnEpCi0JCQlraW1uLT5mdW5jKGtpbW4sIG1hc2spOworCWdzaSA9IHJjdV9kZXJlZmVyZW5jZShrdm0tPmlycV9yb3V0aW5nKS0+Y2hpcFtpcnFjaGlwXVtwaW5dOworCWlmIChnc2kgIT0gLTEpCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShraW1uLCBuLCAma3ZtLT5tYXNrX25vdGlmaWVyX2xpc3QsIGxpbmspCisJCQlpZiAoa2ltbi0+aXJxID09IGdzaSkKKwkJCQlraW1uLT5mdW5jKGtpbW4sIG1hc2spOwogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCBmMDMyODA2Li5iNzhiNzk0IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTUsNiArNSw3IEBACiAgKiBtYWNoaW5lcyB3aXRob3V0IGVtdWxhdGlvbiBvciBiaW5hcnkgdHJhbnNsYXRpb24uCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0LCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxhdGVzLgogICoKICAqIEF1dGhvcnM6CiAgKiAgIEF2aSBLaXZpdHkgICA8YXZpQHF1bXJhbmV0LmNvbT4KQEAgLTkyLDYgKzkzLDEyIEBACiAKIHN0YXRpYyBib29sIGxhcmdlcGFnZXNfZW5hYmxlZCA9IHRydWU7CiAKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqaHdwb2lzb25fcGFnZTsKK3N0YXRpYyBwZm5fdCBod3BvaXNvbl9wZm47CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZmF1bHRfcGFnZTsKK3N0YXRpYyBwZm5fdCBmYXVsdF9wZm47CisKIGlubGluZSBpbnQga3ZtX2lzX21taW9fcGZuKHBmbl90IHBmbikKIHsKIAlpZiAocGZuX3ZhbGlkKHBmbikpIHsKQEAgLTE0MSw3ICsxNDgsNyBAQAogCXJhd19zcGluX2xvY2soJmt2bS0+cmVxdWVzdHNfbG9jayk7CiAJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJa3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdmNwdSwga3ZtKSB7Ci0JCWlmICh0ZXN0X2FuZF9zZXRfYml0KHJlcSwgJnZjcHUtPnJlcXVlc3RzKSkKKwkJaWYgKGt2bV9tYWtlX2NoZWNrX3JlcXVlc3QocmVxLCB2Y3B1KSkKIAkJCWNvbnRpbnVlOwogCQljcHUgPSB2Y3B1LT5jcHU7CiAJCWlmIChjcHVzICE9IE5VTEwgJiYgY3B1ICE9IC0xICYmIGNwdSAhPSBtZSkKQEAgLTU2Niw2ICs1NzMsNyBAQAogCiAJbmV3ID0gb2xkID0gKm1lbXNsb3Q7CiAKKwluZXcuaWQgPSBtZW0tPnNsb3Q7CiAJbmV3LmJhc2VfZ2ZuID0gYmFzZV9nZm47CiAJbmV3Lm5wYWdlcyA9IG5wYWdlczsKIAluZXcuZmxhZ3MgPSBtZW0tPmZsYWdzOwpAQCAtNTk2LDcgKzYwNCw3IEBACiAJLyogQWxsb2NhdGUgaWYgYSBzbG90IGlzIGJlaW5nIGNyZWF0ZWQgKi8KICNpZm5kZWYgQ09ORklHX1MzOTAKIAlpZiAobnBhZ2VzICYmICFuZXcucm1hcCkgewotCQluZXcucm1hcCA9IHZtYWxsb2MobnBhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKKwkJbmV3LnJtYXAgPSB2bWFsbG9jKG5wYWdlcyAqIHNpemVvZigqbmV3LnJtYXApKTsKIAogCQlpZiAoIW5ldy5ybWFwKQogCQkJZ290byBvdXRfZnJlZTsKQEAgLTYyMSw5ICs2MjksOSBAQAogCQlpZiAobmV3LmxwYWdlX2luZm9baV0pCiAJCQljb250aW51ZTsKIAotCQlscGFnZXMgPSAxICsgKGJhc2VfZ2ZuICsgbnBhZ2VzIC0gMSkgLwotCQkJICAgICBLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKTsKLQkJbHBhZ2VzIC09IGJhc2VfZ2ZuIC8gS1ZNX1BBR0VTX1BFUl9IUEFHRShsZXZlbCk7CisJCWxwYWdlcyA9IDEgKyAoKGJhc2VfZ2ZuICsgbnBhZ2VzIC0gMSkKKwkJCSAgICAgPj4gS1ZNX0hQQUdFX0dGTl9TSElGVChsZXZlbCkpOworCQlscGFnZXMgLT0gYmFzZV9nZm4gPj4gS1ZNX0hQQUdFX0dGTl9TSElGVChsZXZlbCk7CiAKIAkJbmV3LmxwYWdlX2luZm9baV0gPSB2bWFsbG9jKGxwYWdlcyAqIHNpemVvZigqbmV3LmxwYWdlX2luZm9baV0pKTsKIApAQCAtNjMzLDkgKzY0MSw5IEBACiAJCW1lbXNldChuZXcubHBhZ2VfaW5mb1tpXSwgMCwKIAkJICAgICAgIGxwYWdlcyAqIHNpemVvZigqbmV3LmxwYWdlX2luZm9baV0pKTsKIAotCQlpZiAoYmFzZV9nZm4gJSBLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKSkKKwkJaWYgKGJhc2VfZ2ZuICYgKEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpIC0gMSkpCiAJCQluZXcubHBhZ2VfaW5mb1tpXVswXS53cml0ZV9jb3VudCA9IDE7Ci0JCWlmICgoYmFzZV9nZm4rbnBhZ2VzKSAlIEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpKQorCQlpZiAoKGJhc2VfZ2ZuK25wYWdlcykgJiAoS1ZNX1BBR0VTX1BFUl9IUEFHRShsZXZlbCkgLSAxKSkKIAkJCW5ldy5scGFnZV9pbmZvW2ldW2xwYWdlcyAtIDFdLndyaXRlX2NvdW50ID0gMTsKIAkJdWdmbiA9IG5ldy51c2Vyc3BhY2VfYWRkciA+PiBQQUdFX1NISUZUOwogCQkvKgpAQCAtODEwLDE2ICs4MTgsMjggQEAKIAogaW50IGlzX2Vycm9yX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcmV0dXJuIHBhZ2UgPT0gYmFkX3BhZ2U7CisJcmV0dXJuIHBhZ2UgPT0gYmFkX3BhZ2UgfHwgcGFnZSA9PSBod3BvaXNvbl9wYWdlIHx8IHBhZ2UgPT0gZmF1bHRfcGFnZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzX2Vycm9yX3BhZ2UpOwogCiBpbnQgaXNfZXJyb3JfcGZuKHBmbl90IHBmbikKIHsKLQlyZXR1cm4gcGZuID09IGJhZF9wZm47CisJcmV0dXJuIHBmbiA9PSBiYWRfcGZuIHx8IHBmbiA9PSBod3BvaXNvbl9wZm4gfHwgcGZuID09IGZhdWx0X3BmbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzX2Vycm9yX3Bmbik7CiAKK2ludCBpc19od3BvaXNvbl9wZm4ocGZuX3QgcGZuKQoreworCXJldHVybiBwZm4gPT0gaHdwb2lzb25fcGZuOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNfaHdwb2lzb25fcGZuKTsKKworaW50IGlzX2ZhdWx0X3BmbihwZm5fdCBwZm4pCit7CisJcmV0dXJuIHBmbiA9PSBmYXVsdF9wZm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc19mYXVsdF9wZm4pOworCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYmFkX2h2YSh2b2lkKQogewogCXJldHVybiBQQUdFX09GRlNFVDsKQEAgLTgzMSw3ICs4NTEsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2lzX2Vycm9yX2h2YSk7CiAKLXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmdmbl90b19tZW1zbG90X3VuYWxpYXNlZChzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKK3N0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmdmbl90b19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQogewogCWludCBpOwogCXN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzID0ga3ZtX21lbXNsb3RzKGt2bSk7CkBAIC04NDUsMjAgKzg2NSwxMyBAQAogCX0KIAlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGdmbl90b19tZW1zbG90X3VuYWxpYXNlZCk7Ci0KLXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmdmbl90b19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQotewotCWdmbiA9IHVuYWxpYXNfZ2ZuKGt2bSwgZ2ZuKTsKLQlyZXR1cm4gZ2ZuX3RvX21lbXNsb3RfdW5hbGlhc2VkKGt2bSwgZ2ZuKTsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKGdmbl90b19tZW1zbG90KTsKIAogaW50IGt2bV9pc192aXNpYmxlX2dmbihzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cyA9IGt2bV9tZW1zbG90cyhrdm0pOwogCi0JZ2ZuID0gdW5hbGlhc19nZm5faW5zdGFudGlhdGlvbihrdm0sIGdmbik7CiAJZm9yIChpID0gMDsgaSA8IEtWTV9NRU1PUllfU0xPVFM7ICsraSkgewogCQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90ID0gJnNsb3RzLT5tZW1zbG90c1tpXTsKIApAQCAtOTAzLDcgKzkxNiw2IEBACiAJc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMgPSBrdm1fbWVtc2xvdHMoa3ZtKTsKIAlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90ID0gTlVMTDsKIAotCWdmbiA9IHVuYWxpYXNfZ2ZuKGt2bSwgZ2ZuKTsKIAlmb3IgKGkgPSAwOyBpIDwgc2xvdHMtPm5tZW1zbG90czsgKytpKSB7CiAJCW1lbXNsb3QgPSAmc2xvdHMtPm1lbXNsb3RzW2ldOwogCkBAIC05MjQsOCArOTM2LDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90OwogCi0JZ2ZuID0gdW5hbGlhc19nZm5faW5zdGFudGlhdGlvbihrdm0sIGdmbik7Ci0Jc2xvdCA9IGdmbl90b19tZW1zbG90X3VuYWxpYXNlZChrdm0sIGdmbik7CisJc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKTsKIAlpZiAoIXNsb3QgfHwgc2xvdC0+ZmxhZ3MgJiBLVk1fTUVNU0xPVF9JTlZBTElEKQogCQlyZXR1cm4gYmFkX2h2YSgpOwogCXJldHVybiBnZm5fdG9faHZhX21lbXNsb3Qoc2xvdCwgZ2ZuKTsKQEAgLTk0NiwxMyArOTU3LDE5IEBACiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCiAJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJaWYgKGlzX2h3cG9pc29uX2FkZHJlc3MoYWRkcikpIHsKKwkJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCQlnZXRfcGFnZShod3BvaXNvbl9wYWdlKTsKKwkJCXJldHVybiBwYWdlX3RvX3Bmbihod3BvaXNvbl9wYWdlKTsKKwkJfQorCiAJCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBhZGRyKTsKIAogCQlpZiAodm1hID09IE5VTEwgfHwgYWRkciA8IHZtYS0+dm1fc3RhcnQgfHwKIAkJICAgICEodm1hLT52bV9mbGFncyAmIFZNX1BGTk1BUCkpIHsKIAkJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JCQlnZXRfcGFnZShiYWRfcGFnZSk7Ci0JCQlyZXR1cm4gcGFnZV90b19wZm4oYmFkX3BhZ2UpOworCQkJZ2V0X3BhZ2UoZmF1bHRfcGFnZSk7CisJCQlyZXR1cm4gcGFnZV90b19wZm4oZmF1bHRfcGFnZSk7CiAJCX0KIAogCQlwZm4gPSAoKGFkZHIgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSArIHZtYS0+dm1fcGdvZmY7CkBAIC0xMTg3LDggKzEyMDQsNyBAQAogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7CiAKLQlnZm4gPSB1bmFsaWFzX2dmbihrdm0sIGdmbik7Ci0JbWVtc2xvdCA9IGdmbl90b19tZW1zbG90X3VuYWxpYXNlZChrdm0sIGdmbik7CisJbWVtc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKTsKIAlpZiAobWVtc2xvdCAmJiBtZW1zbG90LT5kaXJ0eV9iaXRtYXApIHsKIAkJdW5zaWduZWQgbG9uZyByZWxfZ2ZuID0gZ2ZuIC0gbWVtc2xvdC0+YmFzZV9nZm47CiAKQEAgLTEyMDcsNyArMTIyMyw3IEBACiAJCXByZXBhcmVfdG9fd2FpdCgmdmNwdS0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJCWlmIChrdm1fYXJjaF92Y3B1X3J1bm5hYmxlKHZjcHUpKSB7Ci0JCQlzZXRfYml0KEtWTV9SRVFfVU5IQUxULCAmdmNwdS0+cmVxdWVzdHMpOworCQkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1VOSEFMVCwgdmNwdSk7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoa3ZtX2NwdV9oYXNfcGVuZGluZ190aW1lcih2Y3B1KSkKQEAgLTEzNzgsNiArMTM5NCwxOCBAQAogCiAJaWYgKHZjcHUtPmt2bS0+bW0gIT0gY3VycmVudC0+bW0pCiAJCXJldHVybiAtRUlPOworCisjaWYgZGVmaW5lZChDT05GSUdfUzM5MCkgfHwgZGVmaW5lZChDT05GSUdfUFBDKQorCS8qCisJICogU3BlY2lhbCBjYXNlczogdmNwdSBpb2N0bHMgdGhhdCBhcmUgYXN5bmNocm9ub3VzIHRvIHZjcHUgZXhlY3V0aW9uLAorCSAqIHNvIHZjcHVfbG9hZCgpIHdvdWxkIGJyZWFrIGl0LgorCSAqLworCWlmIChpb2N0bCA9PSBLVk1fUzM5MF9JTlRFUlJVUFQgfHwgaW9jdGwgPT0gS1ZNX0lOVEVSUlVQVCkKKwkJcmV0dXJuIGt2bV9hcmNoX3ZjcHVfaW9jdGwoZmlscCwgaW9jdGwsIGFyZyk7CisjZW5kaWYKKworCisJdmNwdV9sb2FkKHZjcHUpOwogCXN3aXRjaCAoaW9jdGwpIHsKIAljYXNlIEtWTV9SVU46CiAJCXIgPSAtRUlOVkFMOwpAQCAtMTUyMCw3ICsxNTQ4LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCXAgPSAmc2lnc2V0OwogCQl9Ci0JCXIgPSBrdm1fdmNwdV9pb2N0bF9zZXRfc2lnbWFzayh2Y3B1LCAmc2lnc2V0KTsKKwkJciA9IGt2bV92Y3B1X2lvY3RsX3NldF9zaWdtYXNrKHZjcHUsIHApOwogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fR0VUX0ZQVTogewpAQCAtMTU1NSw2ICsxNTgzLDcgQEAKIAkJciA9IGt2bV9hcmNoX3ZjcHVfaW9jdGwoZmlscCwgaW9jdGwsIGFyZyk7CiAJfQogb3V0OgorCXZjcHVfcHV0KHZjcHUpOwogCWtmcmVlKGZwdSk7CiAJa2ZyZWUoa3ZtX3NyZWdzKTsKIAlyZXR1cm4gcjsKQEAgLTIxOTcsNiArMjIyNiwyNCBAQAogCiAJYmFkX3BmbiA9IHBhZ2VfdG9fcGZuKGJhZF9wYWdlKTsKIAorCWh3cG9pc29uX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKworCWlmIChod3BvaXNvbl9wYWdlID09IE5VTEwpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfMDsKKwl9CisKKwlod3BvaXNvbl9wZm4gPSBwYWdlX3RvX3Bmbihod3BvaXNvbl9wYWdlKTsKKworCWZhdWx0X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKworCWlmIChmYXVsdF9wYWdlID09IE5VTEwpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfMDsKKwl9CisKKwlmYXVsdF9wZm4gPSBwYWdlX3RvX3BmbihmYXVsdF9wYWdlKTsKKwogCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZjcHVzX2hhcmR3YXJlX2VuYWJsZWQsIEdGUF9LRVJORUwpKSB7CiAJCXIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9mcmVlXzA7CkBAIC0yMjY5LDYgKzIzMTYsMTAgQEAKIG91dF9mcmVlXzBhOgogCWZyZWVfY3B1bWFza192YXIoY3B1c19oYXJkd2FyZV9lbmFibGVkKTsKIG91dF9mcmVlXzA6CisJaWYgKGZhdWx0X3BhZ2UpCisJCV9fZnJlZV9wYWdlKGZhdWx0X3BhZ2UpOworCWlmIChod3BvaXNvbl9wYWdlKQorCQlfX2ZyZWVfcGFnZShod3BvaXNvbl9wYWdlKTsKIAlfX2ZyZWVfcGFnZShiYWRfcGFnZSk7CiBvdXQ6CiAJa3ZtX2FyY2hfZXhpdCgpOwpAQCAtMjI5MCw2ICsyMzQxLDcgQEAKIAlrdm1fYXJjaF9oYXJkd2FyZV91bnNldHVwKCk7CiAJa3ZtX2FyY2hfZXhpdCgpOwogCWZyZWVfY3B1bWFza192YXIoY3B1c19oYXJkd2FyZV9lbmFibGVkKTsKKwlfX2ZyZWVfcGFnZShod3BvaXNvbl9wYWdlKTsKIAlfX2ZyZWVfcGFnZShiYWRfcGFnZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fZXhpdCk7Cg==